summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--Makefile.inc16
-rw-r--r--ObsoleteFiles.inc31
-rw-r--r--UPDATING18
-rw-r--r--bin/expr/expr.182
-rw-r--r--bin/expr/expr.y538
-rw-r--r--bin/ps/ps.116
-rw-r--r--bin/rcp/rcp.c1
-rw-r--r--bin/realpath/realpath.110
-rw-r--r--bin/realpath/realpath.c16
-rw-r--r--bin/sh/arith_yacc.c2
-rw-r--r--bin/sh/eval.c19
-rw-r--r--bin/sh/mkinit.c1
-rw-r--r--bin/sh/mktokens1
-rw-r--r--bin/sh/nodetypes4
-rw-r--r--bin/sh/options.h4
-rw-r--r--bin/sh/parser.c19
-rw-r--r--bin/sh/sh.191
-rw-r--r--bin/sh/var.c13
-rw-r--r--cddl/contrib/opensolaris/cmd/zfs/zfs.816
-rw-r--r--cddl/contrib/opensolaris/cmd/zfs/zfs_main.c4
-rw-r--r--cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c16
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c2
-rw-r--r--contrib/bind9/CHANGES1297
-rw-r--r--contrib/bind9/COPYRIGHT2
-rw-r--r--contrib/bind9/FAQ.xml2
-rw-r--r--contrib/bind9/HISTORY313
-rw-r--r--contrib/bind9/KNOWN-DEFECTS15
-rw-r--r--contrib/bind9/Makefile.in11
-rw-r--r--contrib/bind9/NSEC3-NOTES128
-rw-r--r--contrib/bind9/README448
-rw-r--r--contrib/bind9/README.idnkit112
-rw-r--r--contrib/bind9/README.pkcs1161
-rw-r--r--contrib/bind9/acconfig.h4
-rw-r--r--contrib/bind9/bin/Makefile.in7
-rw-r--r--contrib/bind9/bin/check/Makefile.in20
-rw-r--r--contrib/bind9/bin/check/check-tool.c5
-rw-r--r--contrib/bind9/bin/check/check-tool.h2
-rw-r--r--contrib/bind9/bin/check/named-checkconf.835
-rw-r--r--contrib/bind9/bin/check/named-checkconf.c43
-rw-r--r--contrib/bind9/bin/check/named-checkconf.docbook36
-rw-r--r--contrib/bind9/bin/check/named-checkconf.html41
-rw-r--r--contrib/bind9/bin/check/named-checkzone.819
-rw-r--r--contrib/bind9/bin/check/named-checkzone.c47
-rw-r--r--contrib/bind9/bin/check/named-checkzone.docbook22
-rw-r--r--contrib/bind9/bin/check/named-checkzone.html26
-rw-r--r--contrib/bind9/bin/confgen/Makefile.in101
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.8143
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.c257
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.docbook218
-rw-r--r--contrib/bind9/bin/confgen/ddns-confgen.html141
-rw-r--r--contrib/bind9/bin/confgen/include/confgen/os.h39
-rw-r--r--contrib/bind9/bin/confgen/keygen.c218
-rw-r--r--contrib/bind9/bin/confgen/keygen.h41
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.8 (renamed from contrib/bind9/bin/rndc/rndc-confgen.8)6
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.c (renamed from contrib/bind9/bin/rndc/rndc-confgen.c)126
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.docbook (renamed from contrib/bind9/bin/rndc/rndc-confgen.docbook)5
-rw-r--r--contrib/bind9/bin/confgen/rndc-confgen.html (renamed from contrib/bind9/bin/rndc/rndc-confgen.html)14
-rw-r--r--contrib/bind9/bin/confgen/unix/Makefile.in (renamed from contrib/bind9/bin/rndc/unix/Makefile.in)5
-rw-r--r--contrib/bind9/bin/confgen/unix/os.c (renamed from contrib/bind9/bin/rndc/unix/os.c)33
-rw-r--r--contrib/bind9/bin/confgen/util.c56
-rw-r--r--contrib/bind9/bin/confgen/util.h52
-rw-r--r--contrib/bind9/bin/dig/Makefile.in26
-rw-r--r--contrib/bind9/bin/dig/dig.111
-rw-r--r--contrib/bind9/bin/dig/dig.c176
-rw-r--r--contrib/bind9/bin/dig/dig.docbook16
-rw-r--r--contrib/bind9/bin/dig/dig.html28
-rw-r--r--contrib/bind9/bin/dig/dighost.c223
-rw-r--r--contrib/bind9/bin/dig/host.12
-rw-r--r--contrib/bind9/bin/dig/host.c5
-rw-r--r--contrib/bind9/bin/dig/host.docbook2
-rw-r--r--contrib/bind9/bin/dig/host.html2
-rw-r--r--contrib/bind9/bin/dig/include/dig/dig.h14
-rw-r--r--contrib/bind9/bin/dig/nslookup.12
-rw-r--r--contrib/bind9/bin/dig/nslookup.c20
-rw-r--r--contrib/bind9/bin/dig/nslookup.docbook2
-rw-r--r--contrib/bind9/bin/dig/nslookup.html2
-rw-r--r--contrib/bind9/bin/dnssec/Makefile.in41
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.855
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.c314
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook78
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-dsfromkey.html67
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.886
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c336
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook195
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html136
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.8114
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.c768
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.docbook264
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-keygen.html196
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.883
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.c269
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.docbook149
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-revoke.html87
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.8166
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.c576
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.docbook319
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-settime.html208
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.8154
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.c1157
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.docbook246
-rw-r--r--contrib/bind9/bin/dnssec/dnssec-signzone.html200
-rw-r--r--contrib/bind9/bin/dnssec/dnssectool.c223
-rw-r--r--contrib/bind9/bin/dnssec/dnssectool.h33
-rw-r--r--contrib/bind9/bin/named/Makefile.in33
-rw-r--r--contrib/bind9/bin/named/bind.keys.h99
-rw-r--r--contrib/bind9/bin/named/bind9.xsl2
-rw-r--r--contrib/bind9/bin/named/bind9.xsl.h6
-rw-r--r--contrib/bind9/bin/named/builtin.c205
-rw-r--r--contrib/bind9/bin/named/client.c130
-rw-r--r--contrib/bind9/bin/named/config.c74
-rw-r--r--contrib/bind9/bin/named/control.c11
-rw-r--r--contrib/bind9/bin/named/include/named/client.h17
-rw-r--r--contrib/bind9/bin/named/include/named/config.h7
-rw-r--r--contrib/bind9/bin/named/include/named/control.h9
-rw-r--r--contrib/bind9/bin/named/include/named/globals.h21
-rw-r--r--contrib/bind9/bin/named/include/named/log.h2
-rw-r--r--contrib/bind9/bin/named/include/named/lwdclient.h2
-rw-r--r--contrib/bind9/bin/named/include/named/main.h9
-rw-r--r--contrib/bind9/bin/named/include/named/notify.h2
-rw-r--r--contrib/bind9/bin/named/include/named/query.h17
-rw-r--r--contrib/bind9/bin/named/include/named/server.h53
-rw-r--r--contrib/bind9/bin/named/include/named/tsigconf.h7
-rw-r--r--contrib/bind9/bin/named/include/named/types.h6
-rw-r--r--contrib/bind9/bin/named/include/named/zoneconf.h19
-rw-r--r--contrib/bind9/bin/named/interfacemgr.c2
-rw-r--r--contrib/bind9/bin/named/log.c2
-rw-r--r--contrib/bind9/bin/named/lwdgabn.c6
-rw-r--r--contrib/bind9/bin/named/lwdgrbn.c6
-rw-r--r--contrib/bind9/bin/named/lwresd.82
-rw-r--r--contrib/bind9/bin/named/lwresd.c7
-rw-r--r--contrib/bind9/bin/named/lwresd.docbook2
-rw-r--r--contrib/bind9/bin/named/lwresd.html2
-rw-r--r--contrib/bind9/bin/named/main.c132
-rw-r--r--contrib/bind9/bin/named/named.811
-rw-r--r--contrib/bind9/bin/named/named.conf.567
-rw-r--r--contrib/bind9/bin/named/named.conf.docbook68
-rw-r--r--contrib/bind9/bin/named/named.conf.html92
-rw-r--r--contrib/bind9/bin/named/named.docbook17
-rw-r--r--contrib/bind9/bin/named/named.html26
-rw-r--r--contrib/bind9/bin/named/query.c2245
-rw-r--r--contrib/bind9/bin/named/server.c2454
-rw-r--r--contrib/bind9/bin/named/statschannel.c19
-rw-r--r--contrib/bind9/bin/named/tkeyconf.c28
-rw-r--r--contrib/bind9/bin/named/tsigconf.c10
-rw-r--r--contrib/bind9/bin/named/unix/Makefile.in4
-rw-r--r--contrib/bind9/bin/named/unix/include/named/os.h8
-rw-r--r--contrib/bind9/bin/named/unix/os.c186
-rw-r--r--contrib/bind9/bin/named/update.c1060
-rw-r--r--contrib/bind9/bin/named/xfrout.c204
-rw-r--r--contrib/bind9/bin/named/zoneconf.c531
-rw-r--r--contrib/bind9/bin/nsupdate/Makefile.in19
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.198
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.c279
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.docbook125
-rw-r--r--contrib/bind9/bin/nsupdate/nsupdate.html113
-rw-r--r--contrib/bind9/bin/rndc/Makefile.in40
-rw-r--r--contrib/bind9/bin/rndc/include/rndc/os.h8
-rw-r--r--contrib/bind9/bin/rndc/rndc.82
-rw-r--r--contrib/bind9/bin/rndc/rndc.c25
-rw-r--r--contrib/bind9/bin/rndc/rndc.conf.52
-rw-r--r--contrib/bind9/bin/rndc/rndc.conf.html2
-rw-r--r--contrib/bind9/bin/rndc/rndc.html2
-rw-r--r--contrib/bind9/bin/rndc/util.h10
-rw-r--r--contrib/bind9/bin/tools/Makefile.in103
-rw-r--r--contrib/bind9/bin/tools/arpaname.148
-rw-r--r--contrib/bind9/bin/tools/arpaname.c53
-rw-r--r--contrib/bind9/bin/tools/arpaname.docbook76
-rw-r--r--contrib/bind9/bin/tools/arpaname.html52
-rw-r--r--contrib/bind9/bin/tools/genrandom.869
-rw-r--r--contrib/bind9/bin/tools/genrandom.c136
-rw-r--r--contrib/bind9/bin/tools/genrandom.docbook119
-rw-r--r--contrib/bind9/bin/tools/genrandom.html73
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.861
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.c136
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.docbook109
-rw-r--r--contrib/bind9/bin/tools/isc-hmac-fixup.html83
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.860
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.c86
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.docbook101
-rw-r--r--contrib/bind9/bin/tools/named-journalprint.html73
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.870
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.c121
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.docbook125
-rw-r--r--contrib/bind9/bin/tools/nsec3hash.html78
-rw-r--r--contrib/bind9/config.guess2
-rw-r--r--contrib/bind9/config.h.in66
-rw-r--r--contrib/bind9/configure.in501
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM-book.xml2041
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch01.html54
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch02.html30
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch03.html174
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch04.html969
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch05.html8
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch06.html1669
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch07.html29
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch08.html20
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch09.html657
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.ch10.html28
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.html217
-rw-r--r--contrib/bind9/doc/arm/Bv9ARM.pdf19903
-rw-r--r--contrib/bind9/doc/arm/Makefile.in2
-rw-r--r--contrib/bind9/doc/arm/dnssec.xml268
-rw-r--r--contrib/bind9/doc/arm/libdns.xml530
-rw-r--r--contrib/bind9/doc/arm/man.arpaname.html91
-rw-r--r--contrib/bind9/doc/arm/man.ddns-confgen.html180
-rw-r--r--contrib/bind9/doc/arm/man.dig.html28
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-dsfromkey.html67
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html136
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-keygen.html206
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-revoke.html126
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-settime.html247
-rw-r--r--contrib/bind9/doc/arm/man.dnssec-signzone.html210
-rw-r--r--contrib/bind9/doc/arm/man.genrandom.html112
-rw-r--r--contrib/bind9/doc/arm/man.host.html12
-rw-r--r--contrib/bind9/doc/arm/man.isc-hmac-fixup.html122
-rw-r--r--contrib/bind9/doc/arm/man.named-checkconf.html41
-rw-r--r--contrib/bind9/doc/arm/man.named-checkzone.html26
-rw-r--r--contrib/bind9/doc/arm/man.named-journalprint.html112
-rw-r--r--contrib/bind9/doc/arm/man.named.html36
-rw-r--r--contrib/bind9/doc/arm/man.nsec3hash.html113
-rw-r--r--contrib/bind9/doc/arm/man.nsupdate.html123
-rw-r--r--contrib/bind9/doc/arm/man.rndc-confgen.html24
-rw-r--r--contrib/bind9/doc/arm/man.rndc.conf.html14
-rw-r--r--contrib/bind9/doc/arm/man.rndc.html14
-rw-r--r--contrib/bind9/doc/arm/managed-keys.xml100
-rw-r--r--contrib/bind9/doc/arm/pkcs11.xml390
-rw-r--r--contrib/bind9/doc/misc/Makefile.in2
-rw-r--r--contrib/bind9/doc/misc/options104
-rw-r--r--contrib/bind9/lib/bind9/Makefile.in4
-rw-r--r--contrib/bind9/lib/bind9/api4
-rw-r--r--contrib/bind9/lib/bind9/check.c549
-rw-r--r--contrib/bind9/lib/bind9/include/bind9/getaddresses.h2
-rw-r--r--contrib/bind9/lib/dns/Makefile.in44
-rw-r--r--contrib/bind9/lib/dns/acl.c2
-rw-r--r--contrib/bind9/lib/dns/adb.c581
-rw-r--r--contrib/bind9/lib/dns/api4
-rw-r--r--contrib/bind9/lib/dns/byaddr.c47
-rw-r--r--contrib/bind9/lib/dns/cache.c78
-rw-r--r--contrib/bind9/lib/dns/client.c3019
-rw-r--r--contrib/bind9/lib/dns/db.c46
-rw-r--r--contrib/bind9/lib/dns/diff.c19
-rw-r--r--contrib/bind9/lib/dns/dispatch.c93
-rw-r--r--contrib/bind9/lib/dns/dlz.c154
-rw-r--r--contrib/bind9/lib/dns/dns64.c299
-rw-r--r--contrib/bind9/lib/dns/dnssec.c804
-rw-r--r--contrib/bind9/lib/dns/ds.c72
-rw-r--r--contrib/bind9/lib/dns/dst_api.c489
-rw-r--r--contrib/bind9/lib/dns/dst_internal.h40
-rw-r--r--contrib/bind9/lib/dns/dst_openssl.h9
-rw-r--r--contrib/bind9/lib/dns/dst_parse.c193
-rw-r--r--contrib/bind9/lib/dns/dst_parse.h21
-rw-r--r--contrib/bind9/lib/dns/ecdb.c810
-rw-r--r--contrib/bind9/lib/dns/forward.c22
-rw-r--r--contrib/bind9/lib/dns/gen-unix.h2
-rw-r--r--contrib/bind9/lib/dns/gen.c6
-rw-r--r--contrib/bind9/lib/dns/gssapi_link.c91
-rw-r--r--contrib/bind9/lib/dns/gssapictx.c96
-rw-r--r--contrib/bind9/lib/dns/hmac_link.c211
-rw-r--r--contrib/bind9/lib/dns/include/dns/Makefile.in20
-rw-r--r--contrib/bind9/lib/dns/include/dns/acl.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/cache.h39
-rw-r--r--contrib/bind9/lib/dns/include/dns/client.h621
-rw-r--r--contrib/bind9/lib/dns/include/dns/compress.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/db.h49
-rw-r--r--contrib/bind9/lib/dns/include/dns/diff.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/dispatch.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/dlz.h62
-rw-r--r--contrib/bind9/lib/dns/include/dns/dns64.h175
-rw-r--r--contrib/bind9/lib/dns/include/dns/dnssec.h137
-rw-r--r--contrib/bind9/lib/dns/include/dns/ds.h9
-rw-r--r--contrib/bind9/lib/dns/include/dns/ecdb.h52
-rw-r--r--contrib/bind9/lib/dns/include/dns/events.h7
-rw-r--r--contrib/bind9/lib/dns/include/dns/forward.h19
-rw-r--r--contrib/bind9/lib/dns/include/dns/journal.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/keydata.h55
-rw-r--r--contrib/bind9/lib/dns/include/dns/keytable.h212
-rw-r--r--contrib/bind9/lib/dns/include/dns/keyvalues.h8
-rw-r--r--contrib/bind9/lib/dns/include/dns/lib.h18
-rw-r--r--contrib/bind9/lib/dns/include/dns/log.h3
-rw-r--r--contrib/bind9/lib/dns/include/dns/lookup.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/master.h5
-rw-r--r--contrib/bind9/lib/dns/include/dns/masterdump.h4
-rw-r--r--contrib/bind9/lib/dns/include/dns/message.h20
-rw-r--r--contrib/bind9/lib/dns/include/dns/name.h84
-rw-r--r--contrib/bind9/lib/dns/include/dns/ncache.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/nsec3.h61
-rw-r--r--contrib/bind9/lib/dns/include/dns/peer.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/private.h55
-rw-r--r--contrib/bind9/lib/dns/include/dns/rbt.h19
-rw-r--r--contrib/bind9/lib/dns/include/dns/rdata.h55
-rw-r--r--contrib/bind9/lib/dns/include/dns/rdataset.h5
-rw-r--r--contrib/bind9/lib/dns/include/dns/request.h11
-rw-r--r--contrib/bind9/lib/dns/include/dns/resolver.h28
-rw-r--r--contrib/bind9/lib/dns/include/dns/result.h9
-rw-r--r--contrib/bind9/lib/dns/include/dns/rpz.h189
-rw-r--r--contrib/bind9/lib/dns/include/dns/rriterator.h103
-rw-r--r--contrib/bind9/lib/dns/include/dns/sdb.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/sdlz.h130
-rw-r--r--contrib/bind9/lib/dns/include/dns/secalg.h11
-rw-r--r--contrib/bind9/lib/dns/include/dns/soa.h26
-rw-r--r--contrib/bind9/lib/dns/include/dns/ssu.h31
-rw-r--r--contrib/bind9/lib/dns/include/dns/stats.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/tkey.h14
-rw-r--r--contrib/bind9/lib/dns/include/dns/tsec.h135
-rw-r--r--contrib/bind9/lib/dns/include/dns/tsig.h32
-rw-r--r--contrib/bind9/lib/dns/include/dns/types.h18
-rw-r--r--contrib/bind9/lib/dns/include/dns/validator.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/view.h211
-rw-r--r--contrib/bind9/lib/dns/include/dns/xfrin.h2
-rw-r--r--contrib/bind9/lib/dns/include/dns/zone.h109
-rw-r--r--contrib/bind9/lib/dns/include/dst/dst.h241
-rw-r--r--contrib/bind9/lib/dns/include/dst/gssapi.h13
-rw-r--r--contrib/bind9/lib/dns/iptable.c2
-rw-r--r--contrib/bind9/lib/dns/journal.c8
-rw-r--r--contrib/bind9/lib/dns/keydata.c89
-rw-r--r--contrib/bind9/lib/dns/keytable.c389
-rw-r--r--contrib/bind9/lib/dns/lib.c109
-rw-r--r--contrib/bind9/lib/dns/log.c5
-rw-r--r--contrib/bind9/lib/dns/master.c113
-rw-r--r--contrib/bind9/lib/dns/masterdump.c95
-rw-r--r--contrib/bind9/lib/dns/message.c71
-rw-r--r--contrib/bind9/lib/dns/name.c77
-rw-r--r--contrib/bind9/lib/dns/ncache.c64
-rw-r--r--contrib/bind9/lib/dns/nsec.c2
-rw-r--r--contrib/bind9/lib/dns/nsec3.c490
-rw-r--r--contrib/bind9/lib/dns/openssl_link.c231
-rw-r--r--contrib/bind9/lib/dns/openssldh_link.c45
-rw-r--r--contrib/bind9/lib/dns/openssldsa_link.c47
-rw-r--r--contrib/bind9/lib/dns/opensslgost_link.c418
-rw-r--r--contrib/bind9/lib/dns/opensslrsa_link.c166
-rw-r--r--contrib/bind9/lib/dns/peer.c6
-rw-r--r--contrib/bind9/lib/dns/private.c295
-rw-r--r--contrib/bind9/lib/dns/rbt.c9
-rw-r--r--contrib/bind9/lib/dns/rbtdb.c864
-rw-r--r--contrib/bind9/lib/dns/rcode.c27
-rw-r--r--contrib/bind9/lib/dns/rdata.c143
-rw-r--r--contrib/bind9/lib/dns/rdata/any_255/tsig_250.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/ch_3/a_1.c12
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/afsdb_18.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/cert_37.c10
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/cname_5.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/dlv_32769.c36
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/dname_39.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/dnskey_48.c41
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ds_43.c32
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/gpos_27.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/hinfo_13.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/hip_55.c506
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/hip_55.h47
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c41
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/isdn_20.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/key_25.c37
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/keydata_65533.c377
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/keydata_65533.h35
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/loc_29.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mb_7.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/md_3.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mf_4.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mg_8.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/minfo_14.c21
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mr_9.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/mx_15.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ns_2.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nsec3_50.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nsec_47.c36
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/null_10.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/nxt_30.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/opt_41.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/proforma.c21
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/ptr_12.c14
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/rp_17.c20
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/rrsig_46.c47
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/rt_21.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/sig_24.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/soa_6.c7
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/spf_99.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/sshfp_44.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/tkey_249.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/txt_16.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/unspec_103.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/generic/x25_19.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/hs_4/a_1.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/a6_38.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/a_1.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c8
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/apl_42.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c11
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/kx_36.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/naptr_35.c136
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c15
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/nsap_22.c9
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/px_26.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/srv_33.c13
-rw-r--r--contrib/bind9/lib/dns/rdata/in_1/wks_11.c7
-rw-r--r--contrib/bind9/lib/dns/rdatalist.c2
-rw-r--r--contrib/bind9/lib/dns/rdataset.c6
-rw-r--r--contrib/bind9/lib/dns/rdataslab.c28
-rw-r--r--contrib/bind9/lib/dns/request.c10
-rw-r--r--contrib/bind9/lib/dns/resolver.c643
-rw-r--r--contrib/bind9/lib/dns/result.c7
-rw-r--r--contrib/bind9/lib/dns/rootns.c2
-rw-r--r--contrib/bind9/lib/dns/rpz.c1168
-rw-r--r--contrib/bind9/lib/dns/rriterator.c202
-rw-r--r--contrib/bind9/lib/dns/sdb.c8
-rw-r--r--contrib/bind9/lib/dns/sdlz.c413
-rw-r--r--contrib/bind9/lib/dns/soa.c40
-rw-r--r--contrib/bind9/lib/dns/spnego.c9
-rw-r--r--contrib/bind9/lib/dns/ssu.c68
-rw-r--r--contrib/bind9/lib/dns/ssu_external.c265
-rw-r--r--contrib/bind9/lib/dns/stats.c2
-rw-r--r--contrib/bind9/lib/dns/time.c2
-rw-r--r--contrib/bind9/lib/dns/tkey.c53
-rw-r--r--contrib/bind9/lib/dns/tsec.c160
-rw-r--r--contrib/bind9/lib/dns/tsig.c367
-rw-r--r--contrib/bind9/lib/dns/validator.c436
-rw-r--r--contrib/bind9/lib/dns/view.c421
-rw-r--r--contrib/bind9/lib/dns/xfrin.c43
-rw-r--r--contrib/bind9/lib/dns/zone.c3909
-rw-r--r--contrib/bind9/lib/export/Makefile.in27
-rw-r--r--contrib/bind9/lib/export/dns/Makefile.in179
-rw-r--r--contrib/bind9/lib/export/dns/include/Makefile.in23
-rw-r--r--contrib/bind9/lib/export/dns/include/dns/Makefile.in56
-rw-r--r--contrib/bind9/lib/export/dns/include/dst/Makefile.in36
-rw-r--r--contrib/bind9/lib/export/irs/Makefile.in86
-rw-r--r--contrib/bind9/lib/export/irs/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/irs/include/irs/Makefile.in46
-rw-r--r--contrib/bind9/lib/export/isc/Makefile.in139
-rw-r--r--contrib/bind9/lib/export/isc/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/include/isc/Makefile.in66
-rw-r--r--contrib/bind9/lib/export/isc/include/isc/bind9.h30
-rw-r--r--contrib/bind9/lib/export/isc/nls/Makefile.in35
-rw-r--r--contrib/bind9/lib/export/isc/nothreads/Makefile.in40
-rw-r--r--contrib/bind9/lib/export/isc/nothreads/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in36
-rw-r--r--contrib/bind9/lib/export/isc/pthreads/Makefile.in38
-rw-r--r--contrib/bind9/lib/export/isc/pthreads/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in36
-rw-r--r--contrib/bind9/lib/export/isc/unix/Makefile.in57
-rw-r--r--contrib/bind9/lib/export/isc/unix/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in37
-rw-r--r--contrib/bind9/lib/export/isccfg/Makefile.in83
-rw-r--r--contrib/bind9/lib/export/isccfg/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in42
-rw-r--r--contrib/bind9/lib/export/samples/Makefile-postinstall.in78
-rw-r--r--contrib/bind9/lib/export/samples/Makefile.in98
-rw-r--r--contrib/bind9/lib/export/samples/nsprobe.c1220
-rw-r--r--contrib/bind9/lib/export/samples/sample-async.c402
-rw-r--r--contrib/bind9/lib/export/samples/sample-gai.c77
-rw-r--r--contrib/bind9/lib/export/samples/sample-request.c263
-rw-r--r--contrib/bind9/lib/export/samples/sample-update.c755
-rw-r--r--contrib/bind9/lib/export/samples/sample.c378
-rw-r--r--contrib/bind9/lib/irs/Makefile.in80
-rw-r--r--contrib/bind9/lib/irs/api3
-rw-r--r--contrib/bind9/lib/irs/context.c396
-rw-r--r--contrib/bind9/lib/irs/dnsconf.c269
-rw-r--r--contrib/bind9/lib/irs/gai_strerror.c93
-rw-r--r--contrib/bind9/lib/irs/getaddrinfo.c1295
-rw-r--r--contrib/bind9/lib/irs/getnameinfo.c410
-rw-r--r--contrib/bind9/lib/irs/include/Makefile.in24
-rw-r--r--contrib/bind9/lib/irs/include/irs/Makefile.in44
-rw-r--r--contrib/bind9/lib/irs/include/irs/context.h159
-rw-r--r--contrib/bind9/lib/irs/include/irs/dnsconf.h94
-rw-r--r--contrib/bind9/lib/irs/include/irs/netdb.h.in167
-rw-r--r--contrib/bind9/lib/irs/include/irs/platform.h.in45
-rw-r--r--contrib/bind9/lib/irs/include/irs/resconf.h113
-rw-r--r--contrib/bind9/lib/irs/include/irs/types.h31
-rw-r--r--contrib/bind9/lib/irs/include/irs/version.h27
-rw-r--r--contrib/bind9/lib/irs/resconf.c636
-rw-r--r--contrib/bind9/lib/irs/version.c27
-rw-r--r--contrib/bind9/lib/isc/Makefile.in38
-rw-r--r--contrib/bind9/lib/isc/alpha/include/isc/atomic.h2
-rw-r--r--contrib/bind9/lib/isc/api6
-rw-r--r--contrib/bind9/lib/isc/app_api.c136
-rw-r--r--contrib/bind9/lib/isc/assertions.c64
-rw-r--r--contrib/bind9/lib/isc/backtrace-emptytbl.c34
-rw-r--r--contrib/bind9/lib/isc/backtrace.c285
-rw-r--r--contrib/bind9/lib/isc/base32.c2
-rw-r--r--contrib/bind9/lib/isc/base64.c2
-rw-r--r--contrib/bind9/lib/isc/entropy.c2
-rw-r--r--contrib/bind9/lib/isc/hash.c20
-rw-r--r--contrib/bind9/lib/isc/heap.c2
-rw-r--r--contrib/bind9/lib/isc/hmacmd5.c35
-rw-r--r--contrib/bind9/lib/isc/hmacsha.c269
-rw-r--r--contrib/bind9/lib/isc/httpd.c2
-rw-r--r--contrib/bind9/lib/isc/ia64/include/isc/atomic.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/Makefile.in10
-rw-r--r--contrib/bind9/lib/isc/include/isc/app.h173
-rw-r--r--contrib/bind9/lib/isc/include/isc/assertions.h8
-rw-r--r--contrib/bind9/lib/isc/include/isc/backtrace.h131
-rw-r--r--contrib/bind9/lib/isc/include/isc/bind9.h30
-rw-r--r--contrib/bind9/lib/isc/include/isc/buffer.h4
-rw-r--r--contrib/bind9/lib/isc/include/isc/entropy.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/error.h9
-rw-r--r--contrib/bind9/lib/isc/include/isc/file.h31
-rw-r--r--contrib/bind9/lib/isc/include/isc/fsaccess.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/hash.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/heap.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/hmacmd5.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/hmacsha.h17
-rw-r--r--contrib/bind9/lib/isc/include/isc/lib.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/log.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/md5.h14
-rw-r--r--contrib/bind9/lib/isc/include/isc/mem.h161
-rw-r--r--contrib/bind9/lib/isc/include/isc/msgs.h6
-rw-r--r--contrib/bind9/lib/isc/include/isc/namespace.h164
-rw-r--r--contrib/bind9/lib/isc/include/isc/netaddr.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/netscope.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/platform.h.in24
-rw-r--r--contrib/bind9/lib/isc/include/isc/portset.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/radix.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/random.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/ratelimiter.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/refcount.h12
-rw-r--r--contrib/bind9/lib/isc/include/isc/result.h5
-rw-r--r--contrib/bind9/lib/isc/include/isc/resultclass.h5
-rw-r--r--contrib/bind9/lib/isc/include/isc/serial.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/sha1.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/sha2.h17
-rw-r--r--contrib/bind9/lib/isc/include/isc/sockaddr.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/socket.h149
-rw-r--r--contrib/bind9/lib/isc/include/isc/stats.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/symtab.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/task.h108
-rw-r--r--contrib/bind9/lib/isc/include/isc/timer.h93
-rw-r--r--contrib/bind9/lib/isc/include/isc/types.h9
-rw-r--r--contrib/bind9/lib/isc/include/isc/util.h2
-rw-r--r--contrib/bind9/lib/isc/inet_aton.c4
-rw-r--r--contrib/bind9/lib/isc/inet_ntop.c2
-rw-r--r--contrib/bind9/lib/isc/iterated_hash.c2
-rw-r--r--contrib/bind9/lib/isc/lib.c34
-rw-r--r--contrib/bind9/lib/isc/log.c2
-rw-r--r--contrib/bind9/lib/isc/md5.c30
-rw-r--r--contrib/bind9/lib/isc/mem.c573
-rw-r--r--contrib/bind9/lib/isc/mem_api.c303
-rw-r--r--contrib/bind9/lib/isc/netaddr.c24
-rw-r--r--contrib/bind9/lib/isc/nls/Makefile.in4
-rw-r--r--contrib/bind9/lib/isc/nothreads/Makefile.in8
-rw-r--r--contrib/bind9/lib/isc/powerpc/include/isc/atomic.h2
-rw-r--r--contrib/bind9/lib/isc/print.c2
-rw-r--r--contrib/bind9/lib/isc/pthreads/Makefile.in4
-rw-r--r--contrib/bind9/lib/isc/pthreads/mutex.c2
-rw-r--r--contrib/bind9/lib/isc/radix.c2
-rw-r--r--contrib/bind9/lib/isc/random.c4
-rw-r--r--contrib/bind9/lib/isc/rwlock.c2
-rw-r--r--contrib/bind9/lib/isc/sha1.c41
-rw-r--r--contrib/bind9/lib/isc/sha2.c429
-rw-r--r--contrib/bind9/lib/isc/sockaddr.c8
-rw-r--r--contrib/bind9/lib/isc/socket_api.c216
-rw-r--r--contrib/bind9/lib/isc/sparc64/include/isc/atomic.h19
-rw-r--r--contrib/bind9/lib/isc/stats.c2
-rw-r--r--contrib/bind9/lib/isc/task.c517
-rw-r--r--contrib/bind9/lib/isc/task_api.c216
-rw-r--r--contrib/bind9/lib/isc/task_p.h8
-rw-r--r--contrib/bind9/lib/isc/timer.c346
-rw-r--r--contrib/bind9/lib/isc/timer_api.c144
-rw-r--r--contrib/bind9/lib/isc/timer_p.h8
-rw-r--r--contrib/bind9/lib/isc/unix/Makefile.in4
-rw-r--r--contrib/bind9/lib/isc/unix/app.c540
-rw-r--r--contrib/bind9/lib/isc/unix/dir.c4
-rw-r--r--contrib/bind9/lib/isc/unix/entropy.c4
-rw-r--r--contrib/bind9/lib/isc/unix/file.c90
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c2
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_ioctl.c2
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/net.h4
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/offset.h4
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/strerror.h4
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/time.h2
-rw-r--r--contrib/bind9/lib/isc/unix/interfaceiter.c4
-rw-r--r--contrib/bind9/lib/isc/unix/resource.c2
-rw-r--r--contrib/bind9/lib/isc/unix/socket.c952
-rw-r--r--contrib/bind9/lib/isc/unix/socket_p.h9
-rw-r--r--contrib/bind9/lib/isc/unix/strerror.c2
-rw-r--r--contrib/bind9/lib/isccc/Makefile.in6
-rw-r--r--contrib/bind9/lib/isccc/api4
-rw-r--r--contrib/bind9/lib/isccfg/Makefile.in8
-rw-r--r--contrib/bind9/lib/isccfg/aclconf.c25
-rw-r--r--contrib/bind9/lib/isccfg/api6
-rw-r--r--contrib/bind9/lib/isccfg/dnsconf.c69
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/aclconf.h14
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/cfg.h38
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h35
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/grammar.h24
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/log.h2
-rw-r--r--contrib/bind9/lib/isccfg/include/isccfg/namedconf.h16
-rw-r--r--contrib/bind9/lib/isccfg/namedconf.c588
-rw-r--r--contrib/bind9/lib/isccfg/parser.c92
-rw-r--r--contrib/bind9/lib/lwres/api4
-rw-r--r--contrib/bind9/lib/lwres/context.c2
-rw-r--r--contrib/bind9/lib/lwres/context_p.h2
-rw-r--r--contrib/bind9/lib/lwres/getaddrinfo.c4
-rw-r--r--contrib/bind9/lib/lwres/getipnode.c2
-rw-r--r--contrib/bind9/lib/lwres/include/lwres/context.h2
-rw-r--r--contrib/bind9/lib/lwres/include/lwres/netdb.h.in2
-rw-r--r--contrib/bind9/lib/lwres/lwconfig.c2
-rw-r--r--contrib/bind9/lib/lwres/man/lwres.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres.html14
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_buffer.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_buffer.html6
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_config.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_config.html12
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_context.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_context.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gabn.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gabn.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gai_strerror.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gai_strerror.html8
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getaddrinfo.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gethostent.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gethostent.html12
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getipnode.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getipnode.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getnameinfo.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getnameinfo.html12
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gnba.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_gnba.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_hstrerror.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_hstrerror.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_inetntop.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_inetntop.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_noop.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_noop.html10
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_packet.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_packet.html8
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_resutil.32
-rw-r--r--contrib/bind9/lib/lwres/man/lwres_resutil.html10
-rw-r--r--contrib/bind9/lib/lwres/print_p.h2
-rw-r--r--contrib/bind9/make/rules.in91
-rw-r--r--contrib/bind9/version10
-rw-r--r--contrib/binutils/bfd/coffcode.h2
-rw-r--r--contrib/binutils/bfd/opncls.c2
-rw-r--r--contrib/binutils/bfd/peicode.h2
-rw-r--r--contrib/binutils/gas/config/obj-elf.c2
-rw-r--r--contrib/binutils/gas/config/tc-arm.c10
-rw-r--r--contrib/binutils/gas/frags.c2
-rw-r--r--contrib/binutils/gas/subsegs.c4
-rw-r--r--contrib/binutils/ld/ldexp.c6
-rw-r--r--contrib/binutils/ld/sysdep.h3
-rw-r--r--contrib/binutils/opcodes/i386-dis.c24
-rw-r--r--contrib/dialog/CHANGES89
-rw-r--r--contrib/dialog/VERSION2
-rw-r--r--contrib/dialog/aclocal.m4199
-rw-r--r--contrib/dialog/arrows.c42
-rw-r--r--contrib/dialog/buttons.c23
-rw-r--r--contrib/dialog/calendar.c5
-rw-r--r--contrib/dialog/checklist.c26
-rw-r--r--contrib/dialog/columns.c4
-rwxr-xr-xcontrib/dialog/config.guess37
-rwxr-xr-xcontrib/dialog/config.sub75
-rwxr-xr-xcontrib/dialog/configure2189
-rw-r--r--contrib/dialog/configure.in3
-rw-r--r--contrib/dialog/dialog.133
-rw-r--r--contrib/dialog/dialog.3541
-rw-r--r--contrib/dialog/dialog.c60
-rw-r--r--contrib/dialog/dialog.h26
-rw-r--r--contrib/dialog/dlg_keys.h12
-rw-r--r--contrib/dialog/editbox.c6
-rw-r--r--contrib/dialog/formbox.c8
-rw-r--r--contrib/dialog/fselect.c6
-rw-r--r--contrib/dialog/guage.c210
-rw-r--r--contrib/dialog/help.c43
-rw-r--r--contrib/dialog/inputbox.c11
-rw-r--r--contrib/dialog/makefile.in3
-rw-r--r--contrib/dialog/menubox.c6
-rw-r--r--contrib/dialog/mixedgauge.c3
-rw-r--r--contrib/dialog/msgbox.c7
-rw-r--r--contrib/dialog/package/debian/changelog12
-rw-r--r--contrib/dialog/package/debian/control4
-rw-r--r--contrib/dialog/package/dialog.spec4
-rw-r--r--contrib/dialog/pause.c6
-rw-r--r--contrib/dialog/po/sk.po111
-rw-r--r--contrib/dialog/prgbox.c7
-rw-r--r--contrib/dialog/progressbox.c4
-rw-r--r--contrib/dialog/rc.c15
-rw-r--r--contrib/dialog/samples/valgrind.log847
-rw-r--r--contrib/dialog/tailbox.c4
-rw-r--r--contrib/dialog/textbox.c9
-rw-r--r--contrib/dialog/timebox.c4
-rw-r--r--contrib/dialog/trace.c4
-rw-r--r--contrib/dialog/ui_getc.c168
-rw-r--r--contrib/dialog/util.c429
-rw-r--r--contrib/dialog/yesno.c6
-rw-r--r--contrib/gcc/c-decl.c2
-rw-r--r--contrib/gcc/c.opt4
-rw-r--r--contrib/gcc/cfg.c2
-rw-r--r--contrib/gcc/common.opt4
-rw-r--r--contrib/gcc/output.h3
-rw-r--r--contrib/gcc/rtl.h11
-rw-r--r--contrib/gcc/tree-nested.c6
-rw-r--r--contrib/gcc/tree.h13
-rw-r--r--contrib/gperf/src/gen-perf.cc2
-rw-r--r--contrib/gperf/src/key-list.cc2
-rw-r--r--contrib/libpcap/bpf/net/bpf_filter.c11
-rw-r--r--contrib/lukemftp/FreeBSD-patchset64
-rw-r--r--contrib/lukemftp/INSTALL211
-rw-r--r--contrib/lukemftp/Makefile.in33
-rw-r--r--contrib/lukemftp/NEWS84
-rw-r--r--contrib/lukemftp/README61
-rw-r--r--contrib/lukemftp/THANKS30
-rw-r--r--contrib/lukemftp/acconfig.h92
-rw-r--r--contrib/lukemftp/aclocal.m4257
-rw-r--r--contrib/lukemftp/config.h.in275
-rwxr-xr-xcontrib/lukemftp/configure4229
-rw-r--r--contrib/lukemftp/configure.in307
-rw-r--r--contrib/lukemftp/diffout3500
-rwxr-xr-xcontrib/lukemftp/install-sh251
-rw-r--r--contrib/lukemftp/lukemftp.h403
-rw-r--r--contrib/lukemftp/src/Makefile28
-rw-r--r--contrib/lukemftp/src/Makefile.in43
-rw-r--r--contrib/lukemftp/todo25
-rw-r--r--contrib/lukemftpd/src/ftpd.c10
-rw-r--r--contrib/ntp/ntpd/ntp_config.c13
-rw-r--r--contrib/ntp/ntpd/ntp_intres.c43
-rw-r--r--contrib/ntp/ntpd/ntp_io.c6
-rw-r--r--contrib/pf/authpf/authpf.8108
-rw-r--r--contrib/pf/authpf/authpf.c376
-rw-r--r--contrib/pf/authpf/pathnames.h3
-rw-r--r--contrib/pf/ftp-proxy/filter.c18
-rw-r--r--contrib/pf/ftp-proxy/filter.h4
-rw-r--r--contrib/pf/ftp-proxy/ftp-proxy.829
-rw-r--r--contrib/pf/ftp-proxy/ftp-proxy.c139
-rw-r--r--contrib/pf/man/pf.434
-rw-r--r--contrib/pf/man/pf.conf.5178
-rw-r--r--contrib/pf/man/pf.os.58
-rw-r--r--contrib/pf/man/pflog.410
-rw-r--r--contrib/pf/man/pfsync.4141
-rw-r--r--contrib/pf/pfctl/parse.y1562
-rw-r--r--contrib/pf/pfctl/pf_print_state.c150
-rw-r--r--contrib/pf/pfctl/pfctl.8135
-rw-r--r--contrib/pf/pfctl/pfctl.c231
-rw-r--r--contrib/pf/pfctl/pfctl.h13
-rw-r--r--contrib/pf/pfctl/pfctl_altq.c25
-rw-r--r--contrib/pf/pfctl/pfctl_optimize.c15
-rw-r--r--contrib/pf/pfctl/pfctl_osfp.c2
-rw-r--r--contrib/pf/pfctl/pfctl_parser.c41
-rw-r--r--contrib/pf/pfctl/pfctl_parser.h12
-rw-r--r--contrib/pf/pfctl/pfctl_qstats.c14
-rw-r--r--contrib/pf/pfctl/pfctl_radix.c52
-rw-r--r--contrib/pf/pfctl/pfctl_table.c15
-rw-r--r--contrib/pf/pflogd/pflogd.822
-rw-r--r--contrib/pf/pflogd/pflogd.c134
-rw-r--r--contrib/pf/pflogd/privsep.c8
-rw-r--r--contrib/pf/pflogd/privsep_fdpass.c20
-rw-r--r--contrib/sendmail/src/deliver.c6
-rw-r--r--contrib/tnftp/COPYING (renamed from contrib/lukemftp/COPYING)42
-rw-r--r--contrib/tnftp/ChangeLog (renamed from contrib/lukemftp/ChangeLog)728
-rw-r--r--contrib/tnftp/INSTALL60
-rw-r--r--contrib/tnftp/Makefile.am13
-rw-r--r--contrib/tnftp/Makefile.in726
-rw-r--r--contrib/tnftp/NEWS36
-rw-r--r--contrib/tnftp/README68
-rw-r--r--contrib/tnftp/THANKS53
-rw-r--r--contrib/tnftp/src/Makefile.am52
-rw-r--r--contrib/tnftp/src/Makefile.in809
-rw-r--r--contrib/tnftp/src/cmds.c (renamed from contrib/lukemftp/src/cmds.c)500
-rw-r--r--contrib/tnftp/src/cmdtab.c (renamed from contrib/lukemftp/src/cmdtab.c)29
-rw-r--r--contrib/tnftp/src/complete.c (renamed from contrib/lukemftp/src/complete.c)76
-rw-r--r--contrib/tnftp/src/domacro.c (renamed from contrib/lukemftp/src/domacro.c)17
-rw-r--r--contrib/tnftp/src/extern.h (renamed from contrib/lukemftp/src/extern.h)45
-rw-r--r--contrib/tnftp/src/fetch.c (renamed from contrib/lukemftp/src/fetch.c)651
-rw-r--r--contrib/tnftp/src/ftp.1 (renamed from contrib/lukemftp/src/ftp.1)357
-rw-r--r--contrib/tnftp/src/ftp.c (renamed from contrib/lukemftp/src/ftp.c)686
-rw-r--r--contrib/tnftp/src/ftp_var.h (renamed from contrib/lukemftp/src/ftp_var.h)60
-rw-r--r--contrib/tnftp/src/main.c (renamed from contrib/lukemftp/src/main.c)232
-rw-r--r--contrib/tnftp/src/progressbar.c (renamed from contrib/lukemftp/src/progressbar.c)103
-rw-r--r--contrib/tnftp/src/progressbar.h (renamed from contrib/lukemftp/src/progressbar.h)23
-rw-r--r--contrib/tnftp/src/ruserpass.c (renamed from contrib/lukemftp/src/ruserpass.c)84
-rw-r--r--contrib/tnftp/src/util.c (renamed from contrib/lukemftp/src/util.c)662
-rw-r--r--contrib/tnftp/src/version.h (renamed from contrib/lukemftp/src/version.h)15
-rw-r--r--contrib/tnftp/tnftp.h495
-rw-r--r--contrib/tnftp/todo25
-rw-r--r--contrib/top/commands.c1
-rw-r--r--contrib/top/display.c33
-rw-r--r--contrib/top/top.X11
-rw-r--r--contrib/top/top.c23
-rw-r--r--contrib/top/top.h2
-rw-r--r--contrib/traceroute/traceroute.c2
-rw-r--r--contrib/tzdata/antarctica14
-rw-r--r--contrib/tzdata/asia6
-rw-r--r--contrib/tzdata/europe70
-rw-r--r--contrib/tzdata/southamerica10
-rw-r--r--contrib/tzdata/zone.tab6
-rw-r--r--contrib/xz/ChangeLog325
-rw-r--r--contrib/xz/FREEBSD-Xlist1
-rw-r--r--contrib/xz/FREEBSD-upgrade4
-rw-r--r--contrib/xz/THANKS9
-rw-r--r--contrib/xz/po/LINGUAS2
-rw-r--r--contrib/xz/po/fr.po864
-rw-r--r--contrib/xz/po/it.po333
-rw-r--r--contrib/xz/po/pl.po825
-rw-r--r--contrib/xz/src/common/tuklib_open_stdxxx.c4
-rw-r--r--contrib/xz/src/liblzma/api/lzma/block.h1
-rw-r--r--contrib/xz/src/liblzma/api/lzma/container.h12
-rw-r--r--contrib/xz/src/liblzma/api/lzma/filter.h8
-rw-r--r--contrib/xz/src/liblzma/api/lzma/version.h2
-rw-r--r--contrib/xz/src/liblzma/common/alone_decoder.c2
-rw-r--r--contrib/xz/src/liblzma/common/alone_encoder.c4
-rw-r--r--contrib/xz/src/liblzma/common/block_buffer_encoder.c18
-rw-r--r--contrib/xz/src/liblzma/common/block_encoder.c7
-rw-r--r--contrib/xz/src/liblzma/common/common.c2
-rw-r--r--contrib/xz/src/liblzma/common/common.h2
-rw-r--r--contrib/xz/src/liblzma/common/filter_common.c6
-rw-r--r--contrib/xz/src/liblzma/common/index.c7
-rw-r--r--contrib/xz/src/liblzma/common/index_decoder.c9
-rw-r--r--contrib/xz/src/liblzma/common/index_encoder.c11
-rw-r--r--contrib/xz/src/liblzma/common/stream_buffer_encoder.c23
-rw-r--r--contrib/xz/src/liblzma/common/stream_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/delta/delta_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/lz/lz_decoder.c2
-rw-r--r--contrib/xz/src/liblzma/lz/lz_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/lz/lz_encoder_hash.h2
-rw-r--r--contrib/xz/src/liblzma/lzma/lzma2_decoder.c8
-rw-r--r--contrib/xz/src/liblzma/lzma/lzma2_encoder.c2
-rw-r--r--contrib/xz/src/liblzma/simple/arm.c2
-rw-r--r--contrib/xz/src/liblzma/simple/armthumb.c2
-rw-r--r--contrib/xz/src/liblzma/simple/ia64.c2
-rw-r--r--contrib/xz/src/liblzma/simple/powerpc.c2
-rw-r--r--contrib/xz/src/liblzma/simple/simple_coder.c2
-rw-r--r--contrib/xz/src/liblzma/simple/sparc.c2
-rw-r--r--contrib/xz/src/lzmainfo/lzmainfo.c4
-rw-r--r--contrib/xz/src/xz/coder.c2
-rw-r--r--contrib/xz/src/xz/file_io.c2
-rw-r--r--contrib/xz/src/xz/hardware.h2
-rw-r--r--contrib/xz/src/xz/list.c21
-rw-r--r--contrib/xz/src/xz/message.c8
-rw-r--r--contrib/xz/src/xz/message.h18
-rw-r--r--contrib/xz/src/xz/options.c6
-rw-r--r--contrib/xz/src/xz/signals.c2
-rw-r--r--contrib/xz/src/xz/suffix.c53
-rw-r--r--contrib/xz/src/xz/util.h6
-rw-r--r--contrib/xz/src/xz/xz.12
-rw-r--r--contrib/xz/src/xzdec/xzdec.c6
-rw-r--r--etc/defaults/rc.conf8
-rw-r--r--etc/devd/Makefile2
-rw-r--r--etc/devd/uath.conf4
-rw-r--r--etc/devd/usb.conf4267
-rw-r--r--etc/namedb/named.conf20
-rw-r--r--etc/namedb/named.root5
-rw-r--r--etc/network.subr2
-rw-r--r--etc/periodic/monthly/Makefile2
-rw-r--r--etc/rc.d/Makefile6
-rwxr-xr-xetc/rc.d/kld66
-rwxr-xr-xetc/rc.d/lockd2
-rwxr-xr-xetc/rc.d/mountcritremote2
-rwxr-xr-xetc/rc.d/mountd2
-rwxr-xr-xetc/rc.d/netwait98
-rwxr-xr-xetc/rc.d/nfsd6
-rwxr-xr-xetc/rc.d/nfsserver19
-rwxr-xr-xetc/rc.d/quota2
-rwxr-xr-xetc/rc.d/routing42
-rwxr-xr-xetc/rc.d/statd2
-rwxr-xr-xetc/rc.d/var2
-rw-r--r--etc/rc.subr16
-rw-r--r--etc/regdomain.xml162
-rw-r--r--gnu/lib/libdialog/Makefile10
-rw-r--r--gnu/usr.bin/groff/tmac/mdoc.local1
-rw-r--r--include/rpc/xdr.h1
-rw-r--r--kerberos5/Makefile2
-rw-r--r--lib/bind/Makefile2
-rw-r--r--lib/bind/config.h54
-rw-r--r--lib/bind/config.mk27
-rw-r--r--lib/bind/dns/Makefile21
-rw-r--r--lib/bind/dns/code.h147
-rw-r--r--lib/bind/dns/dns/enumtype.h4
-rw-r--r--lib/bind/dns/dns/rdatastruct.h194
-rw-r--r--lib/bind/isc/Makefile20
-rw-r--r--lib/bind/isc/backtrace-emptytbl.c36
-rw-r--r--lib/bind/isc/isc/platform.h53
-rw-r--r--lib/bind/lwres/lwres/netdb.h2
-rw-r--r--lib/bind/lwres/lwres/platform.h2
-rw-r--r--lib/csu/powerpc64/Makefile14
-rw-r--r--lib/libc/db/btree/bt_split.c7
-rw-r--r--lib/libc/db/man/mpool.311
-rw-r--r--lib/libc/gen/basename.351
-rw-r--r--lib/libc/gen/basename.c71
-rw-r--r--lib/libc/gen/ftw.c8
-rw-r--r--lib/libc/gen/getutxent.34
-rw-r--r--lib/libc/gen/posix_spawn.325
-rw-r--r--lib/libc/gen/posix_spawn.c9
-rw-r--r--lib/libc/gen/pututxline.c4
-rw-r--r--lib/libc/iconv/citrus_mapper.c2
-rw-r--r--lib/libc/iconv/iconv.c2
-rw-r--r--lib/libc/net/sctp_opt_info.335
-rw-r--r--lib/libc/net/sctp_sys_calls.c134
-rw-r--r--lib/libc/stdlib/malloc.c2
-rw-r--r--lib/libc/stdlib/ptsname.c2
-rw-r--r--lib/libc/sys/rfork.216
-rw-r--r--lib/libc/sys/wait.213
-rw-r--r--lib/libc/xdr/Makefile.inc4
-rw-r--r--lib/libc/xdr/Symbol.map5
-rw-r--r--lib/libc/xdr/xdr.318
-rw-r--r--lib/libc/xdr/xdr_sizeof.c4
-rw-r--r--lib/libkvm/kvm_pcpu.c31
-rw-r--r--lib/liblzma/config.h10
-rw-r--r--lib/libmd/sha256.32
-rw-r--r--lib/libmd/sha512.32
-rw-r--r--lib/libprocstat/Makefile8
-rw-r--r--lib/libprocstat/libprocstat.3258
-rw-r--r--lib/libprocstat/libprocstat.c30
-rw-r--r--lib/libstand/Makefile2
-rw-r--r--lib/libstand/stand.h6
-rw-r--r--lib/libstand/tftp.c183
-rw-r--r--lib/libstand/zalloc.c22
-rw-r--r--lib/libstand/zalloc_defs.h17
-rw-r--r--lib/libstand/zalloc_malloc.c4
-rw-r--r--lib/libstand/zalloc_mem.h6
-rw-r--r--lib/libstand/zalloc_protos.h6
-rw-r--r--lib/libthr/arch/sparc64/Makefile.inc2
-rw-r--r--lib/libthr/arch/sparc64/include/pthread_md.h23
-rw-r--r--lib/libthr/arch/sparc64/sparc64/_umtx_op_err.S38
-rw-r--r--lib/libthr/arch/sparc64/sparc64/pthread_md.c12
-rw-r--r--lib/libthr/thread/thr_init.c1
-rw-r--r--lib/libusb/Makefile4
-rw-r--r--lib/libusb/libusb.32
-rw-r--r--lib/libusb/libusb01.c (renamed from lib/libusb/libusb20_compat01.c)70
-rw-r--r--lib/libusb/libusb10.c4
-rw-r--r--lib/libusb/libusb10_desc.c9
-rw-r--r--lib/libusb/libusb20.323
-rw-r--r--lib/libusb/libusb20.c14
-rw-r--r--lib/libusb/libusb20.h2
-rw-r--r--lib/libusb/libusb20_int.h2
-rw-r--r--lib/libusb/libusb20_ugen20.c5
-rw-r--r--lib/libusb/usb.h2
-rw-r--r--lib/libutil/login.conf.53
-rw-r--r--lib/msun/ld80/e_rem_pio2l.h2
-rw-r--r--lib/msun/src/e_rem_pio2.c3
-rw-r--r--libexec/ftpd/ftpd.c11
-rw-r--r--libexec/rtld-elf/Makefile1
-rw-r--r--libexec/rtld-elf/rtld.c8
-rw-r--r--libexec/tftpd/tftp-file.c33
-rw-r--r--libexec/tftpd/tftpd.860
-rw-r--r--libexec/ulog-helper/Makefile4
-rw-r--r--libexec/ulog-helper/ulog-helper.c24
-rw-r--r--libexec/ypxfr/ypxfr_extern.h2
-rw-r--r--libexec/ypxfr/ypxfr_main.c4
-rw-r--r--release/Makefile7
-rw-r--r--release/doc/en_US.ISO8859-1/readme/article.sgml3
-rw-r--r--release/doc/share/sgml/release.ent4
-rwxr-xr-xrelease/generate-release.sh3
-rwxr-xr-xrelease/ia64/make-memstick.sh38
-rw-r--r--release/ia64/mkisoimages.sh2
-rw-r--r--sbin/ddb/ddb.82
-rw-r--r--sbin/dumpfs/dumpfs.811
-rw-r--r--sbin/dumpfs/dumpfs.c21
-rw-r--r--sbin/fsck_ffs/fsck.h1
-rw-r--r--sbin/fsck_ffs/pass5.c72
-rw-r--r--sbin/fsck_ffs/suj.c1
-rw-r--r--sbin/geom/class/part/geom_part.c14
-rw-r--r--sbin/growfs/growfs.814
-rw-r--r--sbin/growfs/growfs.c12
-rw-r--r--sbin/hastctl/Makefile1
-rw-r--r--sbin/hastctl/hastctl.c6
-rw-r--r--sbin/hastd/Makefile3
-rw-r--r--sbin/hastd/activemap.c13
-rw-r--r--sbin/hastd/control.c3
-rw-r--r--sbin/hastd/primary.c9
-rw-r--r--sbin/hastd/secondary.c4
-rw-r--r--sbin/hastd/subr.c12
-rw-r--r--sbin/ifconfig/Makefile1
-rw-r--r--sbin/ifconfig/ifconfig.815
-rw-r--r--sbin/ifconfig/iffib.c103
-rw-r--r--sbin/ipfw/ipfw.889
-rw-r--r--sbin/ipfw/ipfw2.c19
-rw-r--r--sbin/ipfw/ipfw2.h2
-rw-r--r--sbin/ipfw/main.c15
-rw-r--r--sbin/ipfw/nat.c88
-rw-r--r--sbin/natd/natd.82
-rw-r--r--sbin/newfs/newfs.83
-rw-r--r--sbin/newfs_msdos/newfs_msdos.c24
-rw-r--r--sbin/pflogd/Makefile2
-rw-r--r--sbin/savecore/savecore.c1
-rw-r--r--sbin/shutdown/shutdown.830
-rw-r--r--sbin/tunefs/tunefs.83
-rw-r--r--sbin/umount/umount.c2
-rw-r--r--share/doc/bind9/Makefile13
-rw-r--r--share/examples/etc/make.conf1
-rw-r--r--share/man/man3/pthread_set_name_np.33
-rw-r--r--share/man/man4/axe.485
-rw-r--r--share/man/man4/jme.416
-rw-r--r--share/man/man4/ng_ether.43
-rw-r--r--share/man/man4/snd_hda.420
-rw-r--r--share/man/man4/stf.4129
-rw-r--r--share/man/man5/make.conf.549
-rw-r--r--share/man/man5/rc.conf.566
-rw-r--r--share/man/man5/src.conf.523
-rw-r--r--share/man/man7/build.76
-rw-r--r--share/man/man8/picobsd.83
-rw-r--r--share/man/man9/Makefile26
-rw-r--r--share/man/man9/copy.956
-rw-r--r--share/man/man9/device_get_sysctl.94
-rw-r--r--share/man/man9/fail.97
-rw-r--r--share/man/man9/ifnet.911
-rw-r--r--share/man/man9/uio.945
-rw-r--r--share/man/man9/vm_map.911
-rw-r--r--share/man/man9/vm_map_sync.9 (renamed from share/man/man9/vm_map_clean.9)16
-rw-r--r--share/man/man9/vm_page_copy.957
-rw-r--r--share/man/man9/vm_page_protect.975
-rw-r--r--share/man/man9/vm_page_zero_fill.953
-rw-r--r--share/misc/committers-ports.dot3
-rw-r--r--share/misc/iso31661
-rw-r--r--share/misc/pci_vendors31202
-rw-r--r--share/misc/usb_hid_usages10
-rw-r--r--share/mk/bsd.own.mk15
-rw-r--r--sys/amd64/acpica/acpi_wakeup.c3
-rw-r--r--sys/amd64/amd64/mp_machdep.c71
-rw-r--r--sys/amd64/amd64/pmap.c76
-rw-r--r--sys/amd64/amd64/sys_machdep.c38
-rw-r--r--sys/amd64/amd64/vm_machdep.c9
-rw-r--r--sys/amd64/ia32/ia32_sigtramp.S25
-rw-r--r--sys/amd64/include/cpufunc.h12
-rw-r--r--sys/amd64/include/pci_cfgreg.h43
-rw-r--r--sys/amd64/pci/pci_bus.c425
-rw-r--r--sys/arm/arm/pmap.c13
-rw-r--r--sys/arm/arm/sys_machdep.c24
-rw-r--r--sys/arm/at91/at91_machdep.c1
-rw-r--r--sys/arm/conf/CAMBRIA2
-rw-r--r--sys/arm/mv/common.c2
-rw-r--r--sys/arm/mv/gpio.c21
-rw-r--r--sys/arm/mv/mv_machdep.c8
-rw-r--r--sys/arm/sa11x0/assabet_machdep.c1
-rw-r--r--sys/arm/sa11x0/sa11x0.c2
-rw-r--r--sys/boot/Makefile4
-rw-r--r--sys/boot/Makefile.amd641
-rw-r--r--sys/boot/Makefile.arm4
-rw-r--r--sys/boot/Makefile.powerpc4
-rw-r--r--sys/boot/common/Makefile.inc2
-rw-r--r--sys/boot/common/disk.c799
-rw-r--r--sys/boot/common/disk.h99
-rw-r--r--sys/boot/common/load_elf.c2
-rw-r--r--sys/boot/common/load_elf_obj.c37
-rw-r--r--sys/boot/common/reloc_elf.c2
-rw-r--r--sys/boot/common/ufsread.c66
-rw-r--r--sys/boot/ficl/amd64/sysdep.c101
-rw-r--r--sys/boot/ficl/amd64/sysdep.h434
-rw-r--r--sys/boot/i386/Makefile.inc1
-rw-r--r--sys/boot/i386/boot2/Makefile3
-rw-r--r--sys/boot/i386/libi386/biosacpi.c2
-rw-r--r--sys/boot/i386/libi386/bioscd.c6
-rw-r--r--sys/boot/i386/zfsboot/Makefile3
-rw-r--r--sys/boot/i386/zfsboot/zfsldr.S220
-rw-r--r--sys/boot/powerpc/ps3/Makefile4
-rw-r--r--sys/boot/powerpc/ps3/conf.c6
-rw-r--r--sys/boot/powerpc/ps3/devicename.c20
-rw-r--r--sys/boot/powerpc/ps3/lv1call.S98
-rw-r--r--sys/boot/powerpc/ps3/lv1call.h8
-rw-r--r--sys/boot/powerpc/ps3/main.c46
-rw-r--r--sys/boot/powerpc/ps3/ps3bus.h41
-rw-r--r--sys/boot/powerpc/ps3/ps3devdesc.h53
-rw-r--r--sys/boot/powerpc/ps3/ps3disk.c313
-rw-r--r--sys/boot/powerpc/ps3/ps3repo.c249
-rw-r--r--sys/boot/powerpc/ps3/ps3repo.h51
-rw-r--r--sys/boot/powerpc/ps3/ps3stor.c165
-rw-r--r--sys/boot/powerpc/ps3/ps3stor.h59
-rw-r--r--sys/boot/powerpc/ps3/version2
-rw-r--r--sys/boot/sparc64/loader/main.c88
-rw-r--r--sys/boot/userboot/Makefile8
-rw-r--r--sys/boot/userboot/ficl/Makefile73
-rw-r--r--sys/boot/userboot/libstand/Makefile161
-rw-r--r--sys/boot/userboot/libstand/amd64/_setjmp.S93
-rw-r--r--sys/boot/userboot/test/Makefile15
-rw-r--r--sys/boot/userboot/test/test.c428
-rw-r--r--sys/boot/userboot/userboot.h178
-rw-r--r--sys/boot/userboot/userboot/Makefile61
-rw-r--r--sys/boot/userboot/userboot/autoload.c35
-rw-r--r--sys/boot/userboot/userboot/bootinfo.c192
-rw-r--r--sys/boot/userboot/userboot/bootinfo32.c264
-rw-r--r--sys/boot/userboot/userboot/bootinfo64.c304
-rw-r--r--sys/boot/userboot/userboot/conf.c93
-rw-r--r--sys/boot/userboot/userboot/copy.c74
-rw-r--r--sys/boot/userboot/userboot/devicename.c274
-rw-r--r--sys/boot/userboot/userboot/elf32_freebsd.c99
-rw-r--r--sys/boot/userboot/userboot/elf64_freebsd.c172
-rw-r--r--sys/boot/userboot/userboot/host.c198
-rw-r--r--sys/boot/userboot/userboot/libuserboot.h67
-rw-r--r--sys/boot/userboot/userboot/main.c177
-rw-r--r--sys/boot/userboot/userboot/userboot_cons.c86
-rw-r--r--sys/boot/userboot/userboot/userboot_disk.c146
-rw-r--r--sys/boot/userboot/userboot/version4
-rw-r--r--sys/cam/ata/ata_da.c2
-rw-r--r--sys/cam/ata/ata_xpt.c36
-rw-r--r--sys/cam/cam_xpt.c4
-rw-r--r--sys/cam/scsi/scsi_cd.c11
-rw-r--r--sys/cam/scsi/scsi_xpt.c7
-rw-r--r--sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c13
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c9
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h2
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h2
-rw-r--r--sys/cddl/dev/dtrace/amd64/dtrace_subr.c4
-rw-r--r--sys/cddl/dev/dtrace/i386/dtrace_subr.c4
-rw-r--r--sys/compat/freebsd32/freebsd32.h2
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c13
-rw-r--r--sys/compat/freebsd32/freebsd32_proto.h7
-rw-r--r--sys/compat/freebsd32/freebsd32_syscall.h4
-rw-r--r--sys/compat/freebsd32/freebsd32_syscalls.c6
-rw-r--r--sys/compat/freebsd32/freebsd32_sysent.c6
-rw-r--r--sys/compat/freebsd32/freebsd32_systrace_args.c42
-rw-r--r--sys/compat/freebsd32/syscalls.master8
-rw-r--r--sys/compat/linprocfs/linprocfs.c18
-rw-r--r--sys/compat/linux/linux_ipc.c10
-rw-r--r--sys/conf/Makefile.mips21
-rw-r--r--sys/conf/NOTES12
-rw-r--r--sys/conf/files16
-rw-r--r--sys/conf/files.amd644
-rw-r--r--sys/conf/files.i3866
-rw-r--r--sys/conf/files.ia641
-rw-r--r--sys/conf/files.mips1
-rw-r--r--sys/conf/files.pc982
-rw-r--r--sys/conf/files.powerpc2
-rw-r--r--sys/conf/options8
-rw-r--r--sys/conf/options.mips9
-rw-r--r--sys/contrib/altq/altq/altq_red.c11
-rw-r--r--sys/contrib/pf/net/if_pflog.c47
-rw-r--r--sys/contrib/pf/net/if_pflog.h26
-rw-r--r--sys/contrib/pf/net/if_pflow.h126
-rw-r--r--sys/contrib/pf/net/if_pfsync.c3845
-rw-r--r--sys/contrib/pf/net/if_pfsync.h493
-rw-r--r--sys/contrib/pf/net/pf.c5632
-rw-r--r--sys/contrib/pf/net/pf_if.c309
-rw-r--r--sys/contrib/pf/net/pf_ioctl.c1392
-rw-r--r--sys/contrib/pf/net/pf_lb.c792
-rw-r--r--sys/contrib/pf/net/pf_mtag.h6
-rw-r--r--sys/contrib/pf/net/pf_norm.c411
-rw-r--r--sys/contrib/pf/net/pf_osfp.c140
-rw-r--r--sys/contrib/pf/net/pf_ruleset.c94
-rw-r--r--sys/contrib/pf/net/pf_subr.c168
-rw-r--r--sys/contrib/pf/net/pf_table.c430
-rw-r--r--sys/contrib/pf/net/pfvar.h798
-rw-r--r--sys/dev/acpica/acpi.c34
-rw-r--r--sys/dev/acpica/acpi_cpu.c4
-rw-r--r--sys/dev/acpica/acpi_pci.c26
-rw-r--r--sys/dev/acpica/acpi_pcib_acpi.c185
-rw-r--r--sys/dev/acpica/acpi_resource.c595
-rw-r--r--sys/dev/acpica/acpi_thermal.c1
-rw-r--r--sys/dev/acpica/acpivar.h22
-rw-r--r--sys/dev/adb/adb_kbd.c1
-rw-r--r--sys/dev/ahci/ahci.c1
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm.c2
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm.h4
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_gram.y5
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y5
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l4
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_scan.l4
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_symbol.c8
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_symbol.h4
-rw-r--r--sys/dev/an/if_an.c1
-rw-r--r--sys/dev/ath/ah_osdep.c25
-rw-r--r--sys/dev/ath/ath_hal/ah.h12
-rw-r--r--sys/dev/ath/ath_hal/ah_eeprom_9287.h2
-rw-r--r--sys/dev/ath/ath_hal/ah_internal.h31
-rw-r--r--sys/dev/ath/ath_hal/ah_regdomain.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5210/ar5210_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5211/ar5211_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5211/ar5211_xmit.c5
-rw-r--r--sys/dev/ath/ath_hal/ar5212/ar5112.c2
-rw-r--r--sys/dev/ath/ath_hal/ar5212/ar5212_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c6
-rw-r--r--sys/dev/ath/ath_hal/ar5312/ar5312_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar2133.c2
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar5416_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c4
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar5416_misc.c2
-rw-r--r--sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c6
-rw-r--r--sys/dev/ath/ath_hal/ar9001/ar9130_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar9001/ar9160_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar9002/ar9280_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar9002/ar9285_attach.c4
-rw-r--r--sys/dev/ath/ath_hal/ar9002/ar9287_attach.c5
-rw-r--r--sys/dev/ath/if_ath.c35
-rw-r--r--sys/dev/ath/if_ath_sysctl.c40
-rw-r--r--sys/dev/ath/if_ath_sysctl.h2
-rw-r--r--sys/dev/atkbdc/atkbd.c3
-rw-r--r--sys/dev/cardbus/cardbus_cis.c21
-rw-r--r--sys/dev/cas/if_cas.c133
-rw-r--r--sys/dev/cas/if_casvar.h2
-rw-r--r--sys/dev/dc/dcphy.c1
-rw-r--r--sys/dev/dc/if_dc.c2
-rw-r--r--sys/dev/dc/pnphy.c1
-rw-r--r--sys/dev/e1000/if_em.c29
-rw-r--r--sys/dev/e1000/if_igb.c282
-rw-r--r--sys/dev/e1000/if_igb.h7
-rw-r--r--sys/dev/en/if_en_pci.c3
-rw-r--r--sys/dev/et/if_et.c1
-rw-r--r--sys/dev/fdc/fdc_pccard.c2
-rw-r--r--sys/dev/firewire/fwohci.c5
-rw-r--r--sys/dev/fxp/if_fxp.c6
-rw-r--r--sys/dev/gem/if_gem.c124
-rw-r--r--sys/dev/gem/if_gem_pci.c4
-rw-r--r--sys/dev/gem/if_gemreg.h23
-rw-r--r--sys/dev/gem/if_gemvar.h2
-rw-r--r--sys/dev/iicbus/ad7417.c170
-rw-r--r--sys/dev/iicbus/if_ic.c4
-rw-r--r--sys/dev/kbd/kbd.c40
-rw-r--r--sys/dev/kbdmux/kbdmux.c1
-rw-r--r--sys/dev/lmc/if_lmc.c1
-rw-r--r--sys/dev/md/md.c1
-rw-r--r--sys/dev/mfi/mfi.c19
-rw-r--r--sys/dev/mfi/mfi_cam.c3
-rw-r--r--sys/dev/mfi/mfireg.h2
-rw-r--r--sys/dev/mii/e1000phy.c6
-rw-r--r--sys/dev/mii/miidevs1
-rw-r--r--sys/dev/mpt/mpt.h2
-rw-r--r--sys/dev/mpt/mpt_pci.c51
-rw-r--r--sys/dev/mxge/eth_z8e.h14774
-rw-r--r--sys/dev/mxge/ethp_z8e.h14855
-rw-r--r--sys/dev/mxge/if_mxge.c2
-rw-r--r--sys/dev/mxge/rss_eth_z8e.h19537
-rw-r--r--sys/dev/mxge/rss_ethp_z8e.h19682
-rw-r--r--sys/dev/my/if_my.c1
-rw-r--r--sys/dev/pccbb/pccbb.c20
-rw-r--r--sys/dev/pccbb/pccbb_pci.c6
-rw-r--r--sys/dev/pci/pci.c27
-rw-r--r--sys/dev/pci/pci_pci.c106
-rw-r--r--sys/dev/pci/pci_subr.c285
-rw-r--r--sys/dev/pci/pcib_private.h28
-rw-r--r--sys/dev/pci/pcivar.h1
-rw-r--r--sys/dev/ppbus/if_plip.c4
-rw-r--r--sys/dev/pty/pty.c6
-rw-r--r--sys/dev/rt/if_rt.c2616
-rw-r--r--sys/dev/rt/if_rtreg.h289
-rw-r--r--sys/dev/rt/if_rtvar.h282
-rw-r--r--sys/dev/sis/if_sis.c1
-rw-r--r--sys/dev/snp/snp.c4
-rw-r--r--sys/dev/sound/macio/i2s.c12
-rw-r--r--sys/dev/sound/usb/uaudio.c60
-rw-r--r--sys/dev/syscons/scterm-teken.c4
-rw-r--r--sys/dev/syscons/syscons.c2
-rw-r--r--sys/dev/tdfx/tdfx_pci.c1
-rw-r--r--sys/dev/uart/uart_bus_pci.c3
-rw-r--r--sys/dev/uart/uart_kbd_sun.c1
-rw-r--r--sys/dev/usb/input/atp.c2
-rw-r--r--sys/dev/usb/input/uep.c21
-rw-r--r--sys/dev/usb/input/uhid.c38
-rw-r--r--sys/dev/usb/input/ukbd.c630
-rw-r--r--sys/dev/usb/input/ums.c7
-rw-r--r--sys/dev/usb/misc/udbp.c41
-rw-r--r--sys/dev/usb/misc/ufm.c18
-rw-r--r--sys/dev/usb/net/if_aue.c2
-rw-r--r--sys/dev/usb/net/if_axe.c122
-rw-r--r--sys/dev/usb/net/if_axereg.h29
-rw-r--r--sys/dev/usb/net/if_cdce.c10
-rw-r--r--sys/dev/usb/net/if_cue.c2
-rw-r--r--sys/dev/usb/net/if_ipheth.c2
-rw-r--r--sys/dev/usb/net/if_kue.c2
-rw-r--r--sys/dev/usb/net/if_mos.c2
-rw-r--r--sys/dev/usb/net/if_rue.c2
-rw-r--r--sys/dev/usb/net/if_udav.c3
-rw-r--r--sys/dev/usb/net/if_usie.c1586
-rw-r--r--sys/dev/usb/net/if_usievar.h256
-rw-r--r--sys/dev/usb/net/uhso.c3
-rw-r--r--sys/dev/usb/quirk/usb_quirk.c2
-rw-r--r--sys/dev/usb/quirk/usb_quirk.h1
-rw-r--r--sys/dev/usb/serial/u3g.c2
-rw-r--r--sys/dev/usb/serial/uark.c2
-rw-r--r--sys/dev/usb/serial/ubsa.c2
-rw-r--r--sys/dev/usb/serial/uchcom.c2
-rw-r--r--sys/dev/usb/serial/ucycom.c2
-rw-r--r--sys/dev/usb/serial/ufoma.c30
-rw-r--r--sys/dev/usb/serial/uftdi.c2
-rw-r--r--sys/dev/usb/serial/ugensa.c2
-rw-r--r--sys/dev/usb/serial/uipaq.c2
-rw-r--r--sys/dev/usb/serial/ulpt.c35
-rw-r--r--sys/dev/usb/serial/umcs.c2
-rw-r--r--sys/dev/usb/serial/umct.c2
-rw-r--r--sys/dev/usb/serial/umodem.c11
-rw-r--r--sys/dev/usb/serial/umoscom.c2
-rw-r--r--sys/dev/usb/serial/uplcom.c2
-rw-r--r--sys/dev/usb/serial/uslcom.c2
-rw-r--r--sys/dev/usb/serial/uvisor.c2
-rw-r--r--sys/dev/usb/serial/uvscom.c2
-rw-r--r--sys/dev/usb/storage/umass.c5
-rw-r--r--sys/dev/usb/storage/urio.c21
-rw-r--r--sys/dev/usb/template/usb_template.c48
-rw-r--r--sys/dev/usb/template/usb_template.h14
-rw-r--r--sys/dev/usb/template/usb_template_audio.c405
-rw-r--r--sys/dev/usb/template/usb_template_cdce.c2
-rw-r--r--sys/dev/usb/template/usb_template_kbd.c224
-rw-r--r--sys/dev/usb/template/usb_template_modem.c252
-rw-r--r--sys/dev/usb/template/usb_template_mouse.c222
-rw-r--r--sys/dev/usb/template/usb_template_msc.c4
-rw-r--r--sys/dev/usb/template/usb_template_mtp.c4
-rw-r--r--sys/dev/usb/usb_device.c41
-rw-r--r--sys/dev/usb/usb_hid.c37
-rw-r--r--sys/dev/usb/usb_hub.c6
-rw-r--r--sys/dev/usb/usb_ioctl.h14
-rw-r--r--sys/dev/usb/usb_lookup.c114
-rw-r--r--sys/dev/usb/usb_msctest.c19
-rw-r--r--sys/dev/usb/usb_request.c35
-rw-r--r--sys/dev/usb/usbdevs7
-rw-r--r--sys/dev/usb/usbdi.h20
-rw-r--r--sys/dev/usb/usbhid.h2
-rw-r--r--sys/dev/usb/wlan/if_rum.c2
-rw-r--r--sys/dev/usb/wlan/if_run.c2
-rw-r--r--sys/dev/usb/wlan/if_uath.c3
-rw-r--r--sys/dev/usb/wlan/if_upgt.c4
-rw-r--r--sys/dev/usb/wlan/if_ural.c2
-rw-r--r--sys/dev/usb/wlan/if_urtw.c4
-rw-r--r--sys/dev/usb/wlan/if_zyd.c2
-rw-r--r--sys/dev/vkbd/vkbd.c1
-rw-r--r--sys/dev/vr/if_vr.c47
-rw-r--r--sys/dev/vr/if_vrreg.h1
-rw-r--r--sys/dev/xen/control/control.c9
-rw-r--r--sys/dev/xl/if_xl.c4
-rw-r--r--sys/fs/devfs/devfs_vnops.c18
-rw-r--r--sys/fs/nfs/nfs_commonacl.c38
-rw-r--r--sys/fs/nfs/nfs_commonkrpc.c112
-rw-r--r--sys/fs/nfs/nfs_commonport.c59
-rw-r--r--sys/fs/nfs/nfs_commonsubs.c246
-rw-r--r--sys/fs/nfs/nfs_var.h5
-rw-r--r--sys/fs/nfs/nfsdport.h16
-rw-r--r--sys/fs/nfs/nfsport.h13
-rw-r--r--sys/fs/nfs/nfsproto.h57
-rw-r--r--sys/fs/nfsclient/nfs_clbio.c7
-rw-r--r--sys/fs/nfsclient/nfs_clkdtrace.c600
-rw-r--r--sys/fs/nfsclient/nfs_clkrpc.c12
-rw-r--r--sys/fs/nfsclient/nfs_clnode.c5
-rw-r--r--sys/fs/nfsclient/nfs_clport.c36
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c50
-rw-r--r--sys/fs/nfsclient/nfs_clstate.c181
-rw-r--r--sys/fs/nfsclient/nfs_clsubs.c11
-rw-r--r--sys/fs/nfsclient/nfs_clvfsops.c6
-rw-r--r--sys/fs/nfsclient/nfs_clvnops.c108
-rw-r--r--sys/fs/nfsclient/nfs_kdtrace.h120
-rw-r--r--sys/fs/nfsserver/nfs_nfsdcache.c42
-rw-r--r--sys/fs/nfsserver/nfs_nfsdkrpc.c79
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c325
-rw-r--r--sys/fs/nfsserver/nfs_nfsdserv.c411
-rw-r--r--sys/fs/nfsserver/nfs_nfsdsocket.c27
-rw-r--r--sys/fs/nfsserver/nfs_nfsdstate.c396
-rw-r--r--sys/fs/nfsserver/nfs_nfsdsubs.c74
-rw-r--r--sys/fs/smbfs/smbfs_smb.c2
-rw-r--r--sys/fs/tmpfs/tmpfs_subr.c2
-rw-r--r--sys/geom/cache/g_cache.c1
-rw-r--r--sys/geom/concat/g_concat.c1
-rw-r--r--sys/geom/eli/g_eli.c1
-rw-r--r--sys/geom/gate/g_gate.c1
-rw-r--r--sys/geom/geom.h1
-rw-r--r--sys/geom/geom_bsd.c1
-rw-r--r--sys/geom/geom_ccd.c1
-rw-r--r--sys/geom/geom_disk.c1
-rw-r--r--sys/geom/geom_pc98.c1
-rw-r--r--sys/geom/geom_sunlabel.c1
-rw-r--r--sys/geom/geom_vfs.c2
-rw-r--r--sys/geom/label/g_label_gpt.c1
-rw-r--r--sys/geom/mirror/g_mirror.c1
-rw-r--r--sys/geom/mountver/g_mountver.c1
-rw-r--r--sys/geom/multipath/g_multipath.c1
-rw-r--r--sys/geom/nop/g_nop.c1
-rw-r--r--sys/geom/part/g_part_bsd.c25
-rw-r--r--sys/geom/part/g_part_ebr.c36
-rw-r--r--sys/geom/part/g_part_gpt.c67
-rw-r--r--sys/geom/part/g_part_mbr.c14
-rw-r--r--sys/geom/raid/g_raid.c1
-rw-r--r--sys/geom/raid3/g_raid3.c1
-rw-r--r--sys/geom/sched/g_sched.c1
-rw-r--r--sys/geom/sched/gs_rr.c1
-rw-r--r--sys/geom/shsec/g_shsec.c1
-rw-r--r--sys/geom/stripe/g_stripe.c1
-rw-r--r--sys/geom/vinum/geom_vinum.c1
-rw-r--r--sys/geom/vinum/geom_vinum_drive.c2
-rw-r--r--sys/geom/vinum/geom_vinum_list.c2
-rw-r--r--sys/geom/vinum/geom_vinum_subr.c1
-rw-r--r--sys/geom/virstor/g_virstor.c1
-rw-r--r--sys/i386/Makefile3
-rw-r--r--sys/i386/i386/mp_machdep.c60
-rw-r--r--sys/i386/i386/pmap.c96
-rw-r--r--sys/i386/i386/sys_machdep.c30
-rw-r--r--sys/i386/i386/vm_machdep.c20
-rw-r--r--sys/i386/ibcs2/ibcs2_ioctl.c4
-rw-r--r--sys/i386/include/cpufunc.h12
-rw-r--r--sys/i386/include/param.h1
-rw-r--r--sys/i386/include/pci_cfgreg.h52
-rw-r--r--sys/i386/xen/mp_machdep.c54
-rw-r--r--sys/i386/xen/mptable.c23
-rw-r--r--sys/i386/xen/pmap.c59
-rw-r--r--sys/ia64/conf/GENERIC2
-rw-r--r--sys/ia64/conf/NOTES2
-rw-r--r--sys/ia64/ia64/busdma_machdep.c167
-rw-r--r--sys/ia64/ia64/clock.c193
-rw-r--r--sys/ia64/ia64/db_machdep.c12
-rw-r--r--sys/ia64/ia64/efi.c55
-rw-r--r--sys/ia64/ia64/exception.S225
-rw-r--r--sys/ia64/ia64/interrupt.c63
-rw-r--r--sys/ia64/ia64/machdep.c13
-rw-r--r--sys/ia64/ia64/mp_machdep.c34
-rw-r--r--sys/ia64/ia64/pmap.c194
-rw-r--r--sys/ia64/include/efi.h3
-rw-r--r--sys/ia64/include/ia64_cpu.h13
-rw-r--r--sys/ia64/include/pcpu.h4
-rw-r--r--sys/ia64/include/pmap.h10
-rw-r--r--sys/ia64/include/sf_buf.h16
-rw-r--r--sys/ia64/include/smp.h2
-rw-r--r--sys/kern/Make.tags.inc2
-rw-r--r--sys/kern/imgact_aout.c4
-rw-r--r--sys/kern/imgact_elf.c13
-rw-r--r--sys/kern/init_sysent.c4
-rw-r--r--sys/kern/kern_clocksource.c1
-rw-r--r--sys/kern/kern_descrip.c207
-rw-r--r--sys/kern/kern_exec.c24
-rw-r--r--sys/kern/kern_exit.c6
-rw-r--r--sys/kern/kern_fail.c171
-rw-r--r--sys/kern/kern_fork.c23
-rw-r--r--sys/kern/kern_jail.c1
-rw-r--r--sys/kern/kern_racct.c28
-rw-r--r--sys/kern/kern_rctl.c36
-rw-r--r--sys/kern/kern_rmlock.c6
-rw-r--r--sys/kern/kern_tc.c6
-rw-r--r--sys/kern/kern_thr.c4
-rw-r--r--sys/kern/link_elf.c2
-rw-r--r--sys/kern/sched_4bsd.c57
-rw-r--r--sys/kern/subr_kdb.c37
-rw-r--r--sys/kern/subr_pcpu.c1
-rw-r--r--sys/kern/subr_smp.c8
-rw-r--r--sys/kern/subr_trap.c4
-rw-r--r--sys/kern/subr_uio.c63
-rw-r--r--sys/kern/sys_capability.c412
-rw-r--r--sys/kern/sys_process.c9
-rw-r--r--sys/kern/syscalls.c4
-rw-r--r--sys/kern/syscalls.master5
-rw-r--r--sys/kern/systrace_args.c42
-rw-r--r--sys/kern/sysv_msg.c8
-rw-r--r--sys/kern/sysv_sem.c11
-rw-r--r--sys/kern/sysv_shm.c4
-rw-r--r--sys/kern/tty.c50
-rw-r--r--sys/kern/tty_inq.c8
-rw-r--r--sys/kern/tty_outq.c2
-rw-r--r--sys/kern/tty_pts.c6
-rw-r--r--sys/kern/tty_ttydisc.c20
-rw-r--r--sys/kern/uipc_shm.c13
-rw-r--r--sys/kern/uipc_socket.c24
-rw-r--r--sys/kern/uipc_syscalls.c7
-rw-r--r--sys/kern/vfs_bio.c8
-rw-r--r--sys/kern/vfs_mount.c1
-rw-r--r--sys/kern/vfs_mountroot.c1
-rw-r--r--sys/kern/vfs_subr.c7
-rw-r--r--sys/kgssapi/gss_impl.c41
-rw-r--r--sys/mips/atheros/ar71xx_chip.c8
-rw-r--r--sys/mips/atheros/ar71xx_machdep.c8
-rw-r--r--sys/mips/atheros/ar71xx_ohci.c2
-rw-r--r--sys/mips/atheros/ar71xx_setup.c8
-rw-r--r--sys/mips/atheros/ar724x_chip.c8
-rw-r--r--sys/mips/atheros/ar91xx_chip.c8
-rw-r--r--sys/mips/conf/RT305X6
-rw-r--r--sys/mips/conf/RT305X.hints11
-rw-r--r--sys/mips/conf/XLP93
-rw-r--r--sys/mips/conf/XLP6495
-rw-r--r--sys/mips/conf/XLPN3294
-rw-r--r--sys/mips/include/bus.h2
-rw-r--r--sys/mips/include/cpufunc.h4
-rw-r--r--sys/mips/include/intr_machdep.h2
-rw-r--r--sys/mips/malta/gt_pci.c12
-rw-r--r--sys/mips/mips/cache.c22
-rw-r--r--sys/mips/mips/cache_mipsNN.c25
-rw-r--r--sys/mips/mips/cpu.c6
-rw-r--r--sys/mips/mips/elf_trampoline.c47
-rw-r--r--sys/mips/mips/exception.S6
-rw-r--r--sys/mips/mips/genassym.c1
-rw-r--r--sys/mips/mips/locore.S2
-rw-r--r--sys/mips/mips/machdep.c2
-rw-r--r--sys/mips/mips/mp_machdep.c32
-rw-r--r--sys/mips/mips/pmap.c53
-rw-r--r--sys/mips/mips/trap.c4
-rw-r--r--sys/mips/nlm/board.c80
-rw-r--r--sys/mips/nlm/board.h75
-rw-r--r--sys/mips/nlm/bus_space_rmi.c688
-rw-r--r--sys/mips/nlm/clock.h41
-rw-r--r--sys/mips/nlm/cms.c452
-rw-r--r--sys/mips/nlm/files.xlp12
-rw-r--r--sys/mips/nlm/hal/bridge.h177
-rw-r--r--sys/mips/nlm/hal/cop0.h280
-rw-r--r--sys/mips/nlm/hal/cop2.h327
-rw-r--r--sys/mips/nlm/hal/cpucontrol.h70
-rw-r--r--sys/mips/nlm/hal/fmn.c789
-rw-r--r--sys/mips/nlm/hal/fmn.h275
-rw-r--r--sys/mips/nlm/hal/iomap.h237
-rw-r--r--sys/mips/nlm/hal/mips-extns.h200
-rw-r--r--sys/mips/nlm/hal/mmio.h338
-rw-r--r--sys/mips/nlm/hal/mmu.h204
-rw-r--r--sys/mips/nlm/hal/pic.h427
-rw-r--r--sys/mips/nlm/hal/sys.h125
-rw-r--r--sys/mips/nlm/hal/uart.h196
-rw-r--r--sys/mips/nlm/interrupt.h49
-rw-r--r--sys/mips/nlm/intr_machdep.c253
-rw-r--r--sys/mips/nlm/iodi.c233
-rw-r--r--sys/mips/nlm/mpreset.S159
-rw-r--r--sys/mips/nlm/msgring.h44
-rw-r--r--sys/mips/nlm/std.xlp4
-rw-r--r--sys/mips/nlm/tick.c393
-rw-r--r--sys/mips/nlm/uart_bus_xlp_iodi.c88
-rw-r--r--sys/mips/nlm/uart_cpu_mips_xlp.c89
-rw-r--r--sys/mips/nlm/xlp.h133
-rw-r--r--sys/mips/nlm/xlp_machdep.c665
-rw-r--r--sys/mips/rmi/dev/xlr/rge.c2
-rw-r--r--sys/mips/rmi/fmn.c1
-rw-r--r--sys/mips/rmi/iodi.c1
-rw-r--r--sys/mips/sentry5/s5_machdep.c7
-rw-r--r--sys/mips/sibyte/sb_machdep.c2
-rw-r--r--sys/modules/Makefile6
-rw-r--r--sys/modules/cxgbe/if_cxgbe/Makefile1
-rw-r--r--sys/modules/dtrace/Makefile1
-rw-r--r--sys/modules/dtrace/dtnfscl/Makefile13
-rw-r--r--sys/modules/dtrace/dtraceall/dtraceall.c1
-rw-r--r--sys/modules/ipdivert/Makefile7
-rw-r--r--sys/modules/kgssapi_krb5/Makefile3
-rw-r--r--sys/modules/nfscl/Makefile9
-rw-r--r--sys/modules/nfscommon/Makefile7
-rw-r--r--sys/modules/pf/Makefile16
-rw-r--r--sys/modules/pflog/Makefile18
-rw-r--r--sys/modules/pfsync/Makefile38
-rw-r--r--sys/modules/usb/Makefile2
-rw-r--r--sys/modules/usb/template/Makefile9
-rw-r--r--sys/modules/usb/usie/Makefile35
-rw-r--r--sys/net/bpf_filter.c2
-rw-r--r--sys/net/if.c18
-rw-r--r--sys/net/if.h2
-rw-r--r--sys/net/if_arcsubr.c1
-rw-r--r--sys/net/if_atmsubr.c1
-rw-r--r--sys/net/if_debug.c1
-rw-r--r--sys/net/if_ethersubr.c2
-rw-r--r--sys/net/if_fddisubr.c1
-rw-r--r--sys/net/if_fwsubr.c1
-rw-r--r--sys/net/if_gif.c1
-rw-r--r--sys/net/if_gre.c83
-rw-r--r--sys/net/if_gre.h2
-rw-r--r--sys/net/if_iso88025subr.c1
-rw-r--r--sys/net/if_lagg.c3
-rw-r--r--sys/net/if_llatbl.h3
-rw-r--r--sys/net/if_spppfr.c2
-rw-r--r--sys/net/if_spppsubr.c1
-rw-r--r--sys/net/if_stf.c911
-rw-r--r--sys/net/if_tun.c1
-rw-r--r--sys/net/if_var.h5
-rw-r--r--sys/net/route.c7
-rw-r--r--sys/net/route.h2
-rw-r--r--sys/net/rtsock.c14
-rw-r--r--sys/net80211/ieee80211_ageq.c2
-rw-r--r--sys/net80211/ieee80211_dfs.c2
-rw-r--r--sys/net80211/ieee80211_ht.c19
-rw-r--r--sys/net80211/ieee80211_power.c2
-rw-r--r--sys/net80211/ieee80211_var.h2
-rw-r--r--sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c4
-rw-r--r--sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c2
-rw-r--r--sys/netgraph/netflow/netflow.c207
-rw-r--r--sys/netgraph/netflow/netflow_v9.c1
-rw-r--r--sys/netgraph/netflow/ng_netflow.c13
-rw-r--r--sys/netgraph/netflow/ng_netflow.h39
-rw-r--r--sys/netgraph/netgraph.h13
-rw-r--r--sys/netgraph/ng_base.c21
-rw-r--r--sys/netgraph/ng_ether.c3
-rw-r--r--sys/netgraph/ng_iface.c1
-rw-r--r--sys/netgraph/ng_socket.c31
-rw-r--r--sys/netinet/if_ether.c15
-rw-r--r--sys/netinet/in.c39
-rw-r--r--sys/netinet/in.h1
-rw-r--r--sys/netinet/in_gif.c2
-rw-r--r--sys/netinet/in_proto.c14
-rw-r--r--sys/netinet/ip_divert.c157
-rw-r--r--sys/netinet/ip_fw.h8
-rw-r--r--sys/netinet/ip_icmp.c2
-rw-r--r--sys/netinet/ip_var.h1
-rw-r--r--sys/netinet/ipfw/ip_dn_io.c1
-rw-r--r--sys/netinet/ipfw/ip_fw2.c121
-rw-r--r--sys/netinet/ipfw/ip_fw_log.c7
-rw-r--r--sys/netinet/ipfw/ip_fw_pfil.c35
-rw-r--r--sys/netinet/ipfw/ip_fw_sockopt.c1
-rw-r--r--sys/netinet/libalias/alias_db.c24
-rw-r--r--sys/netinet/libalias/alias_ftp.c124
-rw-r--r--sys/netinet/libalias/alias_local.h7
-rw-r--r--sys/netinet/libalias/libalias.3140
-rw-r--r--sys/netinet/raw_ip.c3
-rw-r--r--sys/netinet/sctp.h1
-rw-r--r--sys/netinet/sctp_pcb.c10
-rw-r--r--sys/netinet/sctp_uio.h11
-rw-r--r--sys/netinet/sctp_usrreq.c86
-rw-r--r--sys/netinet/tcp_lro.c8
-rw-r--r--sys/netinet/tcp_output.c28
-rw-r--r--sys/netinet/tcp_subr.c9
-rw-r--r--sys/netinet6/icmp6.c4
-rw-r--r--sys/netinet6/in6.c2
-rw-r--r--sys/netinet6/in6_gif.c2
-rw-r--r--sys/netinet6/in6_proto.c50
-rw-r--r--sys/netinet6/ip6_input.c7
-rw-r--r--sys/netinet6/nd6.c59
-rw-r--r--sys/netinet6/nd6.h10
-rw-r--r--sys/netipsec/ipsec_input.c2
-rw-r--r--sys/netipsec/ipsec_output.c2
-rw-r--r--sys/netipsec/xform_ipip.c2
-rw-r--r--sys/nfs/bootp_subr.c4
-rw-r--r--sys/nfsclient/nfs_krpc.c12
-rw-r--r--sys/nfsserver/nfs_srvkrpc.c16
-rw-r--r--sys/pc98/cbus/pckbd.c1
-rw-r--r--sys/pc98/conf/DEFAULTS2
-rw-r--r--sys/powerpc/aim/copyinout.c22
-rw-r--r--sys/powerpc/aim/locore32.S3
-rw-r--r--sys/powerpc/aim/locore64.S3
-rw-r--r--sys/powerpc/aim/machdep.c4
-rw-r--r--sys/powerpc/aim/mmu_oea.c8
-rw-r--r--sys/powerpc/aim/mmu_oea64.c10
-rw-r--r--sys/powerpc/aim/mp_cpudep.c2
-rw-r--r--sys/powerpc/aim/swtch32.S18
-rw-r--r--sys/powerpc/aim/swtch64.S18
-rw-r--r--sys/powerpc/aim/trap.c6
-rw-r--r--sys/powerpc/aim/trap_subr32.S14
-rw-r--r--sys/powerpc/aim/trap_subr64.S13
-rw-r--r--sys/powerpc/booke/copyinout.c16
-rw-r--r--sys/powerpc/booke/interrupt.c2
-rw-r--r--sys/powerpc/booke/pmap.c12
-rw-r--r--sys/powerpc/booke/trap.c6
-rw-r--r--sys/powerpc/conf/GENERIC1
-rw-r--r--sys/powerpc/conf/GENERIC641
-rw-r--r--sys/powerpc/include/pcpu.h8
-rw-r--r--sys/powerpc/ofw/ofwcall32.S14
-rw-r--r--sys/powerpc/ofw/rtas.c19
-rw-r--r--sys/powerpc/powermac/fcu.c2
-rw-r--r--sys/powerpc/powerpc/db_trace.c2
-rw-r--r--sys/powerpc/powerpc/mp_machdep.c25
-rw-r--r--sys/powerpc/ps3/if_glc.c58
-rw-r--r--sys/powerpc/ps3/ohci_ps3.c170
-rw-r--r--sys/powerpc/ps3/ps3-hvcall.h28
-rw-r--r--sys/powerpc/ps3/ps3-hvcall.master28
-rw-r--r--sys/powerpc/ps3/ps3bus.c209
-rw-r--r--sys/powerpc/ps3/ps3bus.h6
-rw-r--r--sys/powerpc/ps3/ps3disk.c702
-rw-r--r--sys/powerpc/ps3/ps3pic.c16
-rw-r--r--sys/rpc/rpc_generic.c4
-rw-r--r--sys/rpc/rpcsec_gss.h265
-rw-r--r--sys/sparc64/include/cache.h9
-rw-r--r--sys/sparc64/include/cpu.h1
-rw-r--r--sys/sparc64/include/pmap.h3
-rw-r--r--sys/sparc64/include/tlb.h15
-rw-r--r--sys/sparc64/include/tsb.h1
-rw-r--r--sys/sparc64/include/vmparam.h13
-rw-r--r--sys/sparc64/pci/fire.c23
-rw-r--r--sys/sparc64/pci/schizo.c6
-rw-r--r--sys/sparc64/sparc64/cache.c6
-rw-r--r--sys/sparc64/sparc64/cheetah.c107
-rw-r--r--sys/sparc64/sparc64/counter.c6
-rw-r--r--sys/sparc64/sparc64/exception.S20
-rw-r--r--sys/sparc64/sparc64/interrupt.S24
-rw-r--r--sys/sparc64/sparc64/intr_machdep.c29
-rw-r--r--sys/sparc64/sparc64/machdep.c5
-rw-r--r--sys/sparc64/sparc64/mp_exception.S4
-rw-r--r--sys/sparc64/sparc64/mp_machdep.c41
-rw-r--r--sys/sparc64/sparc64/pmap.c54
-rw-r--r--sys/sparc64/sparc64/spitfire.c38
-rw-r--r--sys/sparc64/sparc64/sys_machdep.c21
-rw-r--r--sys/sparc64/sparc64/tick.c4
-rw-r--r--sys/sparc64/sparc64/tlb.c6
-rw-r--r--sys/sparc64/sparc64/vm_machdep.c2
-rw-r--r--sys/sparc64/sparc64/zeus.c108
-rw-r--r--sys/sys/_types.h1
-rw-r--r--sys/sys/bus.h1
-rw-r--r--sys/sys/capability.h58
-rw-r--r--sys/sys/cpuset.h8
-rw-r--r--sys/sys/diskmbr.h1
-rw-r--r--sys/sys/diskpc98.h4
-rw-r--r--sys/sys/dtrace_bsd.h25
-rw-r--r--sys/sys/file.h2
-rw-r--r--sys/sys/filedesc.h2
-rw-r--r--sys/sys/kbio.h18
-rw-r--r--sys/sys/mbuf.h10
-rw-r--r--sys/sys/param.h8
-rw-r--r--sys/sys/pcpu.h14
-rw-r--r--sys/sys/priv.h1
-rw-r--r--sys/sys/proc.h21
-rw-r--r--sys/sys/racct.h14
-rw-r--r--sys/sys/sem.h3
-rw-r--r--sys/sys/sockio.h3
-rw-r--r--sys/sys/soundcard.h6
-rw-r--r--sys/sys/syscall.h2
-rw-r--r--sys/sys/syscall.mk2
-rw-r--r--sys/sys/sysproto.h12
-rw-r--r--sys/sys/systm.h16
-rw-r--r--sys/sys/timetc.h4
-rw-r--r--sys/sys/tty.h5
-rw-r--r--sys/sys/ttydevsw.h14
-rw-r--r--sys/sys/types.h2
-rw-r--r--sys/sys/uio.h1
-rw-r--r--sys/sys/unistd.h8
-rw-r--r--sys/sys/vnode.h7
-rw-r--r--sys/teken/demo/teken_demo.c6
-rw-r--r--sys/teken/gensequences4
-rw-r--r--sys/teken/libteken/teken.32
-rw-r--r--sys/teken/teken.c2
-rw-r--r--sys/teken/teken_subr.h4
-rw-r--r--sys/ufs/ffs/ffs_alloc.c193
-rw-r--r--sys/ufs/ffs/ffs_balloc.c28
-rw-r--r--sys/ufs/ffs/ffs_extern.h9
-rw-r--r--sys/ufs/ffs/ffs_inode.c4
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c3
-rw-r--r--sys/ufs/ffs/ffs_softdep.c311
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c160
-rw-r--r--sys/ufs/ffs/fs.h4
-rw-r--r--sys/ufs/ffs/softdep.h3
-rw-r--r--sys/ufs/ufs/ufs_inode.c9
-rw-r--r--sys/ufs/ufs/ufsmount.h1
-rw-r--r--sys/vm/device_pager.c6
-rw-r--r--sys/vm/swap_pager.c6
-rw-r--r--sys/vm/vm_extern.h3
-rw-r--r--sys/vm/vm_fault.c25
-rw-r--r--sys/vm/vm_glue.c4
-rw-r--r--sys/vm/vm_map.c20
-rw-r--r--sys/vm/vm_mmap.c21
-rw-r--r--sys/vm/vm_object.c123
-rw-r--r--sys/vm/vm_object.h9
-rw-r--r--sys/vm/vm_page.c34
-rw-r--r--sys/vm/vm_page.h33
-rw-r--r--sys/vm/vm_pageout.c14
-rw-r--r--sys/vm/vm_unix.c6
-rw-r--r--sys/vm/vnode_pager.c2
-rw-r--r--sys/x86/include/mptable.h64
-rw-r--r--sys/x86/include/pci_cfgreg.h60
-rw-r--r--sys/x86/pci/pci_bus.c (renamed from sys/i386/pci/pci_bus.c)111
-rw-r--r--sys/x86/x86/mptable.c177
-rw-r--r--sys/x86/x86/mptable_pci.c85
-rw-r--r--sys/x86/x86/tsc.c21
-rw-r--r--tools/build/mk/OptionalObsoleteFiles.inc21
-rw-r--r--tools/build/options/WITHOUT_ACCT4
-rw-r--r--tools/build/options/WITHOUT_UTMPX10
-rw-r--r--tools/regression/bin/sh/builtins/case10.016
-rw-r--r--tools/regression/bin/sh/builtins/case9.039
-rw-r--r--tools/regression/bin/sh/builtins/export1.03
-rw-r--r--tools/regression/bin/sh/builtins/set2.03
-rw-r--r--tools/regression/bin/sh/execution/bg4.06
-rw-r--r--tools/regression/bin/sh/expansion/cmdsubst11.05
-rw-r--r--tools/regression/bin/sh/parser/alias6.06
-rw-r--r--tools/regression/kqueue/config.h6
-rw-r--r--tools/regression/kqueue/main.c3
-rw-r--r--tools/regression/kqueue/proc.c16
-rw-r--r--tools/regression/lib/libc/gen/Makefile2
-rw-r--r--tools/regression/lib/libc/gen/test-posix_spawn.c90
-rw-r--r--tools/tools/bus_autoconf/Makefile46
-rw-r--r--tools/tools/bus_autoconf/bus_autoconf.c125
-rw-r--r--tools/tools/bus_autoconf/bus_autoconf.h31
-rw-r--r--tools/tools/bus_autoconf/bus_autoconf.sh78
-rw-r--r--tools/tools/bus_autoconf/bus_autoconf_format_example.txt111
-rw-r--r--tools/tools/bus_autoconf/bus_load_file.c76
-rw-r--r--tools/tools/bus_autoconf/bus_load_file.h33
-rw-r--r--tools/tools/bus_autoconf/bus_sections.c223
-rw-r--r--tools/tools/bus_autoconf/bus_sections.h35
-rw-r--r--tools/tools/bus_autoconf/bus_usb.c386
-rw-r--r--tools/tools/bus_autoconf/bus_usb.h73
-rw-r--r--tools/tools/pciid/mk_pci_vendors.pl263
-rw-r--r--usr.bin/Makefile11
-rw-r--r--usr.bin/calendar/calendars/calendar.freebsd2
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all1
-rw-r--r--usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk16
-rw-r--r--usr.bin/calendar/parsedata.c30
-rw-r--r--usr.bin/calendar/pom.c2
-rw-r--r--usr.bin/cmp/regular.c2
-rw-r--r--usr.bin/cmp/special.c1
-rw-r--r--usr.bin/finger/net.c2
-rw-r--r--usr.bin/fstat/fuser.c5
-rw-r--r--usr.bin/ftp/Makefile10
-rw-r--r--usr.bin/ftp/config.h285
-rw-r--r--usr.bin/ftp/tnftp_config.h514
-rw-r--r--usr.bin/gcore/elfcore.c2
-rw-r--r--usr.bin/ipcs/ipc.c7
-rw-r--r--usr.bin/ipcs/ipcs.c2
-rw-r--r--usr.bin/kdump/mksubr23
-rw-r--r--usr.bin/ktrace/ktrace.c1
-rw-r--r--usr.bin/lastcomm/lastcomm.c2
-rw-r--r--usr.bin/lastcomm/readrec.c4
-rw-r--r--usr.bin/ldd/sods.c46
-rw-r--r--usr.bin/ncal/ncal.12
-rw-r--r--usr.bin/ncal/ncal.c3
-rw-r--r--usr.bin/ncplogin/ncplogin.c2
-rw-r--r--usr.bin/netstat/if.c2
-rw-r--r--usr.bin/nsupdate/Makefile1
-rw-r--r--usr.bin/quota/quota.c16
-rw-r--r--usr.bin/rctl/rctl.849
-rw-r--r--usr.bin/rpcgen/rpc_scan.c26
-rw-r--r--usr.bin/systat/netstat.c1
-rw-r--r--usr.bin/tar/util.c6
-rw-r--r--usr.bin/tar/write.c23
-rw-r--r--usr.bin/tftp/main.c3
-rw-r--r--usr.bin/tftp/tftp.190
-rw-r--r--usr.bin/top/machine.c180
-rw-r--r--usr.bin/users/users.c2
-rw-r--r--usr.bin/vmstat/vmstat.c1
-rw-r--r--usr.bin/w/w.c2
-rw-r--r--usr.bin/wall/wall.c3
-rw-r--r--usr.bin/xlint/lint1/decl.c3
-rw-r--r--usr.bin/xlint/lint1/scan.l3
-rw-r--r--usr.bin/xlint/lint2/msg.c3
-rw-r--r--usr.bin/xlint/lint2/read.c4
-rw-r--r--usr.sbin/Makefile21
-rw-r--r--usr.sbin/ancontrol/ancontrol.c1
-rw-r--r--usr.sbin/arpaname/Makefile24
-rw-r--r--usr.sbin/bsdinstall/partedit/partedit.c2
-rw-r--r--usr.sbin/bsdinstall/partedit/partedit_powerpc.c27
-rw-r--r--usr.sbin/bsdinstall/scripts/Makefile6
-rwxr-xr-xusr.sbin/bsdinstall/scripts/auto7
-rwxr-xr-xusr.sbin/bsdinstall/scripts/config4
-rw-r--r--usr.sbin/bsdinstall/scripts/docsinstall69
-rw-r--r--usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c16
-rw-r--r--usr.sbin/config/main.c9
-rw-r--r--usr.sbin/ddns-confgen/Makefile31
-rw-r--r--usr.sbin/dnssec-revoke/Makefile24
-rw-r--r--usr.sbin/dnssec-settime/Makefile24
-rw-r--r--usr.sbin/dnssec-signzone/Makefile2
-rw-r--r--usr.sbin/fdread/fdread.c2
-rw-r--r--usr.sbin/flowctl/Makefile9
-rw-r--r--usr.sbin/flowctl/flowctl.811
-rw-r--r--usr.sbin/flowctl/flowctl.c232
-rw-r--r--usr.sbin/ftp-proxy/ftp-proxy/Makefile8
-rw-r--r--usr.sbin/genrandom/Makefile24
-rw-r--r--usr.sbin/ifmcstat/ifmcstat.c1
-rw-r--r--usr.sbin/isc-hmac-fixup/Makefile24
-rw-r--r--usr.sbin/jls/jls.c2
-rw-r--r--usr.sbin/makefs/Makefile4
-rw-r--r--usr.sbin/makefs/cd9660/cd9660_write.c8
-rw-r--r--usr.sbin/makefs/ffs.c11
-rw-r--r--usr.sbin/makefs/ffs/ffs_bswap.c8
-rw-r--r--usr.sbin/makefs/ffs/ffs_subr.c9
-rw-r--r--usr.sbin/makefs/makefs.811
-rw-r--r--usr.sbin/makefs/makefs.c41
-rw-r--r--usr.sbin/makefs/makefs.h3
-rw-r--r--usr.sbin/makefs/mtree.c1051
-rw-r--r--usr.sbin/mfiutil/mfi_config.c4
-rw-r--r--usr.sbin/mfiutil/mfi_drive.c85
-rw-r--r--usr.sbin/mfiutil/mfi_patrol.c8
-rw-r--r--usr.sbin/mfiutil/mfi_show.c43
-rw-r--r--usr.sbin/mfiutil/mfiutil.840
-rw-r--r--usr.sbin/mfiutil/mfiutil.c13
-rw-r--r--usr.sbin/mfiutil/mfiutil.h8
-rw-r--r--usr.sbin/mountd/exports.522
-rw-r--r--usr.sbin/mountd/mountd.c6
-rw-r--r--usr.sbin/mtest/mtest.c30
-rw-r--r--usr.sbin/named-checkconf/Makefile1
-rw-r--r--usr.sbin/named-journalprint/Makefile24
-rw-r--r--usr.sbin/named/Makefile8
-rw-r--r--usr.sbin/nfsd/nfsd.c1
-rw-r--r--usr.sbin/nfsuserd/nfsuserd.c29
-rw-r--r--usr.sbin/nsec3hash/Makefile24
-rw-r--r--usr.sbin/pmccontrol/pmccontrol.c39
-rw-r--r--usr.sbin/pmcstat/pmcpl_calltree.c1
-rw-r--r--usr.sbin/pmcstat/pmcstat.c12
-rw-r--r--usr.sbin/ppp/nat_cmd.c1
-rw-r--r--usr.sbin/pwd_mkdb/pwd_mkdb.c8
-rw-r--r--usr.sbin/rndc-confgen/Makefile4
-rw-r--r--usr.sbin/rndc/Makefile6
-rw-r--r--usr.sbin/route6d/Makefile2
-rw-r--r--usr.sbin/route6d/route6d.834
-rw-r--r--usr.sbin/route6d/route6d.c490
-rw-r--r--usr.sbin/rpc.yppasswdd/Makefile8
-rw-r--r--usr.sbin/rpc.yppasswdd/yppasswdd_extern.h2
-rw-r--r--usr.sbin/rpc.yppasswdd/yppasswdd_main.c7
-rw-r--r--usr.sbin/rpc.ypupdated/update.c1
-rw-r--r--usr.sbin/rpc.ypupdated/ypupdated_main.c5
-rw-r--r--usr.sbin/rpc.ypupdated/ypupdated_server.c1
-rw-r--r--usr.sbin/rpc.ypxfrd/Makefile14
-rw-r--r--usr.sbin/rpc.ypxfrd/ypxfrd_extern.h5
-rw-r--r--usr.sbin/rpc.ypxfrd/ypxfrd_main.c8
-rw-r--r--usr.sbin/rpc.ypxfrd/ypxfrd_server.c1
-rw-r--r--usr.sbin/rpcbind/rpcb_stat.c2
-rw-r--r--usr.sbin/rpcbind/rpcb_svc_com.c2
-rw-r--r--usr.sbin/rpcbind/rpcbind.c5
-rw-r--r--usr.sbin/rpcbind/util.c2
-rw-r--r--usr.sbin/rpcbind/warmstart.c4
-rw-r--r--usr.sbin/rtadvctl/Makefile4
-rw-r--r--usr.sbin/rtadvctl/rtadvctl.863
-rw-r--r--usr.sbin/rtadvctl/rtadvctl.c227
-rw-r--r--usr.sbin/rtadvd/Makefile4
-rw-r--r--usr.sbin/rtadvd/config.c367
-rw-r--r--usr.sbin/rtadvd/config.h6
-rw-r--r--usr.sbin/rtadvd/control.c22
-rw-r--r--usr.sbin/rtadvd/control_server.c147
-rw-r--r--usr.sbin/rtadvd/control_server.h10
-rw-r--r--usr.sbin/rtadvd/if.c10
-rw-r--r--usr.sbin/rtadvd/if.h2
-rw-r--r--usr.sbin/rtadvd/rtadvd.c472
-rw-r--r--usr.sbin/rtadvd/rtadvd.h114
-rw-r--r--usr.sbin/rtadvd/timer.c25
-rw-r--r--usr.sbin/rtadvd/timer_subr.c24
-rw-r--r--usr.sbin/rtadvd/timer_subr.h2
-rw-r--r--usr.sbin/rtsold/rtsol.c133
-rw-r--r--usr.sbin/rtsold/rtsold.828
-rw-r--r--usr.sbin/rtsold/rtsold.c21
-rw-r--r--usr.sbin/rtsold/rtsold.h6
-rw-r--r--usr.sbin/sysinstall/modules.c1
-rw-r--r--usr.sbin/syslogd/syslogd.89
-rw-r--r--usr.sbin/syslogd/syslogd.c30
-rw-r--r--usr.sbin/wpa/ndis_events/ndis_events.c2
-rw-r--r--usr.sbin/wpa/wpa_supplicant/Packet32.c1
-rw-r--r--usr.sbin/yp_mkdb/yp_mkdb.c2
-rw-r--r--usr.sbin/yppush/Makefile2
-rw-r--r--usr.sbin/yppush/yppush_main.c4
-rw-r--r--usr.sbin/ypserv/Makefile10
-rw-r--r--usr.sbin/ypserv/yp_access.c568
-rw-r--r--usr.sbin/ypserv/yp_access_inet.c126
-rw-r--r--usr.sbin/ypserv/yp_access_inet6.c141
-rw-r--r--usr.sbin/ypserv/yp_dblookup.c15
-rw-r--r--usr.sbin/ypserv/yp_dnslookup.c6
-rw-r--r--usr.sbin/ypserv/yp_error.c2
-rw-r--r--usr.sbin/ypserv/yp_extern.h37
-rw-r--r--usr.sbin/ypserv/yp_main.c166
-rw-r--r--usr.sbin/ypserv/yp_server.c40
-rw-r--r--usr.sbin/ypserv/ypserv.852
1906 files changed, 198069 insertions, 93662 deletions
diff --git a/Makefile b/Makefile
index e28569a..61e678b 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@
# kernel - buildkernel + installkernel.
# kernel-toolchain - Builds the subset of world necessary to build a kernel
# doxygen - Build API documentation of the kernel, needs doxygen.
-# update - Convenient way to update your source tree (cvs).
+# update - Convenient way to update your source tree(s).
# check-old - List obsolete directories/files/libraries.
# check-old-dirs - List obsolete directories.
# check-old-files - List obsolete files.
diff --git a/Makefile.inc1 b/Makefile.inc1
index 9ebc1e3..7fdce36 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -12,6 +12,7 @@
# -DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel
# -DNO_PORTSUPDATE do not update ports in ${MAKE} update
# -DNO_DOCUPDATE do not update doc in ${MAKE} update
+# -DNO_WWWUPDATE do not update www in ${MAKE} update
# -DNO_CTF do not run the DTrace CTF conversion tools on built objects
# LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
# TARGET="machine" to crossbuild world for a different machine type
@@ -904,7 +905,7 @@ doxygen:
#
# update
#
-# Update the source tree, by running cvsup and/or running cvs to update to the
+# Update the source tree(s), by running cvsup/cvs/svn to update to the
# latest copy.
#
update:
@@ -927,6 +928,9 @@ update:
.if defined(DOCSUPFILE) && !defined(NO_DOCUPDATE)
@${SUP} ${SUPFLAGS} ${DOCSUPFILE}
.endif
+.if defined(WWWSUPFILE) && !defined(NO_WWWUPDATE)
+ @${SUP} ${SUPFLAGS} ${WWWSUPFILE}
+.endif
.endif
.if defined(CVS_UPDATE)
@cd ${.CURDIR} ; \
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 8500b6b..8ab7ddb 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -38,6 +38,31 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20110709: vm_map_clean.9 -> vm_map_sync.9
+OLD_FILES+=usr/share/man/man9/vm_map_clean.9.gz
+# 20110709: Catch up with removal of these functions.
+OLD_FILES+=usr/share/man/man9/vm_page_copy.9.gz
+OLD_FILES+=usr/share/man/man9/vm_page_protect.9.gz
+OLD_FILES+=usr/share/man/man9/vm_page_zero_fill.9.gz
+# 20110707: script no longer needed by /etc/rc.d/nfsd
+OLD_FILES+=etc/rc.d/nfsserver
+# 20110705: files moved so both NFS clients can share them
+OLD_FILES+=usr/include/nfsclient/krpc.h
+OLD_FILES+=usr/include/nfsclient/nfsdiskless.h
+# 20110705: the switch of default NFS client to the new one
+OLD_FILES+=sbin/mount_newnfs
+OLD_FILES+=usr/share/man/man8/mount_newnfs.8.gz
+OLD_FILES+=usr/include/nfsclient/nfs_kdtrace.h
+# 20110628: calendar.msk removed
+OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.msk
+# 20110517: libpkg removed
+OLD_FILES+=usr/include/pkg.h
+OLD_FILES+=usr/lib/libpkg.a
+OLD_FILES+=usr/lib/libpkg.so
+OLD_LIBS+=usr/lib/libpkg.so.0
+OLD_FILES+=usr/lib/libpkg_p.a
+# 20110517: libsbuf version bump
+OLD_LIBS+=lib/libsbuf.so.5
# 20110502: new clang import which bumps version from 2.9 to 3.0
OLD_FILES+=usr/include/clang/2.9/emmintrin.h
OLD_FILES+=usr/include/clang/2.9/mm_malloc.h
@@ -66,6 +91,8 @@ OLD_FILES+=usr/lib/libobjc_p.a
OLD_FILES+=usr/libexec/cc1obj
OLD_LIBS+=usr/lib/libobjc.so.4
OLD_DIRS+=usr/include/objc
+# 20110331: firmware.img created at build time
+OLD_FILES+=usr/share/examples/kld/firmware/fwimage/firmware.img
# 20110224: sticky.8 -> sticky.7
OLD_FILES+=usr/share/man/man8/sticky.8.gz
# 20110220: new clang import which bumps version from 2.8 to 2.9
@@ -76,6 +103,8 @@ OLD_FILES+=usr/include/clang/2.8/pmmintrin.h
OLD_FILES+=usr/include/clang/2.8/tmmintrin.h
OLD_FILES+=usr/include/clang/2.8/xmmintrin.h
OLD_DIRS+=usr/include/clang/2.8
+# 20110119: netinet/sctp_cc_functions.h removed
+OLD_FILES+=usr/include/netinet/sctp_cc_functions.h
# 20110119: Remove SYSCTL_*X* sysctl additions.
OLD_FILES+=usr/share/man/man9/SYSCTL_XINT.9.gz \
usr/share/man/man9/SYSCTL_XLONG.9.gz
@@ -131,6 +160,8 @@ OLD_FILES+=usr/share/man/man8/MAKEDEV.8.gz
OLD_FILES+=usr/share/man/man9/vgonel.9.gz
# 20101112: removed gasp.info
OLD_FILES+=usr/share/info/gasp.info.gz
+# 20101109: machine/mutex.h removed
+OLD_FILES+=usr/include/machine/mutex.h
# 20101109: headers moved from machine/ to x86/
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386"
OLD_FILES+=usr/include/machine/mptable.h
diff --git a/UPDATING b/UPDATING
index c8c3582..7df65a3 100644
--- a/UPDATING
+++ b/UPDATING
@@ -22,6 +22,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW:
machines to maximize performance. (To disable malloc debugging, run
ln -s aj /etc/malloc.conf.)
+20110628:
+ The packet filter (pf) code has been updated to OpenBSD 4.5.
+ You need to update userland tools to be in sync with kernel.
+ This update breaks backward compatibility with earlier pfsync(4)
+ versions. Care must be taken when updating redundant firewall setups.
+
20110608:
The following sysctls and tunables are retired on x86 platforms:
machdep.hlt_cpus
@@ -52,6 +58,18 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW:
20110513:
Support for sun4v architecture is officially dropped
+20110503:
+ Several KPI breaking changes have been committed to the mii(4) layer,
+ the PHY drivers and consequently some Ethernet drivers using mii(4).
+ This means that miibus.ko and the modules of the affected Ethernet
+ drivers need to be recompiled.
+
+ Note to kernel developers: Given that the OUI bit reversion problem
+ was fixed as part of these changes all mii(4) commits related to OUIs,
+ i.e. to sys/dev/mii/miidevs, PHY driver probing and vendor specific
+ handling, no longer can be merged verbatim to stable/8 and previous
+ branches.
+
20110430:
Users of the Atheros AR71xx SoC code now need to add 'device ar71xx_pci'
into their kernel configurations along with 'device pci'.
diff --git a/bin/expr/expr.1 b/bin/expr/expr.1
index 5c3cb44..6b9c610 100644
--- a/bin/expr/expr.1
+++ b/bin/expr/expr.1
@@ -50,25 +50,25 @@ and writes the result on standard output.
All operators and operands must be passed as separate arguments.
Several of the operators have special meaning to command interpreters
and must therefore be quoted appropriately.
-All integer operands are interpreted in base 10.
+All integer operands are interpreted in base 10 and must consist of only
+an optional leading minus sign followed by one or more digits (unless
+less strict parsing has been enabled for backwards compatibilty with
+prior versions of
+.Nm
+in
+.Fx ) .
.Pp
-Arithmetic operations are performed using signed integer math.
-If the
-.Fl e
-flag is specified, arithmetic uses the C
+Arithmetic operations are performed using signed integer math with a
+range according to the C
.Vt intmax_t
-data type (the largest integral type available), and
-.Nm
-will detect arithmetic overflow and return an error indication.
-If a numeric operand is specified which is so large as to overflow
-conversion to an integer, it is parsed as a string instead.
-If
+data type (the largest signed integral type available).
+All conversions and operations are checked for overflow.
+Overflow results in program termination with an error message on stdout
+and with an error status.
+.Pp
+The
.Fl e
-is not specified, arithmetic operations and parsing of integer
-arguments will overflow silently according to the rules of the C
-standard, using the
-.Vt long
-data type.
+option enables backwards compatible behaviour as detailed below.
.Pp
Operators are listed below in order of increasing precedence; all
are left-associative.
@@ -82,7 +82,9 @@ Return the evaluation of
.Ar expr1
if it is neither an empty string nor zero;
otherwise, returns the evaluation of
-.Ar expr2 .
+.Ar expr2
+if it is not an empty string;
+otherwise, returns zero.
.It Ar expr1 Li & Ar expr2
Return the evaluation of
.Ar expr1
@@ -163,25 +165,26 @@ function (with a
.Fa utility
argument of
.Dq Li expr )
-is used to determine whether compatibility mode should be enabled.
+is used to determine whether backwards compatibility mode should be enabled.
This feature is intended for use as a transition and debugging aid, when
.Nm
is used in complex scripts which cannot easily be recast to avoid the
non-portable usage.
-Enabling compatibility mode
-also implicitly enables the
+Enabling backwards compatibility mode also implicitly enables the
.Fl e
option, since this matches the historic behavior of
.Nm
in
-.Fx .
+.Fx . This option makes number parsing less strict and permits leading
+white space and an optional leading plus sign. In addition, empty operands
+have an implied value of zero in numeric context.
For historical reasons, defining the environment variable
.Ev EXPR_COMPAT
-also enables compatibility mode.
+also enables backwards compatibility mode.
.Sh ENVIRONMENT
.Bl -tag -width ".Ev EXPR_COMPAT"
.It Ev EXPR_COMPAT
-If set, enables compatibility mode.
+If set, enables backwards compatibility mode.
.El
.Sh EXIT STATUS
The
@@ -270,8 +273,37 @@ expands to the required number.
The
.Nm
utility conforms to
-.St -p1003.1-2001 ,
-provided that compatibility mode is not enabled.
+.St -p1003.1-2008 ,
+provided that backwards compatibility mode is not enabled.
+.Pp
+Backwards compatibility mode performs less strict checks of numeric arguments:
+.Bl -bullet
+.It
+An empty operand string is interpreted as 0.
+.El
+.Bl -bullet
+.It
+Leading white space and/or a plus sign before an otherwise valid positive
+numberic operand are allowed and will be ignored.
+.El
+.Pp
+The extended arithmetic range and overflow checks do not conflict with
+POSIX's requirement that arithmetic be done using signed longs, since
+they only make a difference to the result in cases where using signed
+longs would give undefined behavior.
+.Pp
+According to the
+.Tn POSIX
+standard, the use of string arguments
+.Va length ,
+.Va substr ,
+.Va index ,
+or
+.Va match
+produces undefined results. In this version of
+.Nm ,
+these arguments are treated just as their respective string values.
+.Pp
The
.Fl e
flag is an extension.
diff --git a/bin/expr/expr.y b/bin/expr/expr.y
index 356bac2..89f8cce 100644
--- a/bin/expr/expr.y
+++ b/bin/expr/expr.y
@@ -1,6 +1,6 @@
%{
/*-
- * Written by Pace Willisson (pace@blitz.com)
+ * Written by Pace Willisson (pace@blitz.com)
* and placed in the public domain.
*
* Largely rewritten by J.T. Conklin (jtc@wimsey.com)
@@ -21,7 +21,7 @@
#include <string.h>
#include <regex.h>
#include <unistd.h>
-
+
/*
* POSIX specifies a specific error code for syntax errors. We exit
* with this code for all errors.
@@ -40,15 +40,20 @@ struct val {
} u;
} ;
-struct val *result;
+char **av;
+int nonposix;
+struct val *result;
-int chk_div(intmax_t, intmax_t);
-int chk_minus(intmax_t, intmax_t, intmax_t);
-int chk_plus(intmax_t, intmax_t, intmax_t);
-int chk_times(intmax_t, intmax_t, intmax_t);
+void assert_to_integer(struct val *);
+void assert_div(intmax_t, intmax_t);
+void assert_minus(intmax_t, intmax_t, intmax_t);
+void assert_plus(intmax_t, intmax_t, intmax_t);
+void assert_times(intmax_t, intmax_t, intmax_t);
+int compare_vals(struct val *, struct val *);
void free_value(struct val *);
+int is_integer(const char *);
+int is_string(struct val *);
int is_zero_or_null(struct val *);
-int isstring(struct val *);
struct val *make_integer(intmax_t);
struct val *make_str(const char *);
struct val *op_and(struct val *, struct val *);
@@ -65,14 +70,12 @@ struct val *op_or(struct val *, struct val *);
struct val *op_plus(struct val *, struct val *);
struct val *op_rem(struct val *, struct val *);
struct val *op_times(struct val *, struct val *);
-intmax_t to_integer(struct val *);
+int to_integer(struct val *);
void to_string(struct val *);
int yyerror(const char *);
int yylex(void);
int yyparse(void);
-static int eflag;
-char **av;
%}
%union
@@ -96,23 +99,22 @@ start: expr { result = $$; }
expr: TOKEN
| '(' expr ')' { $$ = $2; }
- | expr '|' expr { $$ = op_or ($1, $3); }
- | expr '&' expr { $$ = op_and ($1, $3); }
- | expr '=' expr { $$ = op_eq ($1, $3); }
- | expr '>' expr { $$ = op_gt ($1, $3); }
- | expr '<' expr { $$ = op_lt ($1, $3); }
- | expr GE expr { $$ = op_ge ($1, $3); }
- | expr LE expr { $$ = op_le ($1, $3); }
- | expr NE expr { $$ = op_ne ($1, $3); }
- | expr '+' expr { $$ = op_plus ($1, $3); }
- | expr '-' expr { $$ = op_minus ($1, $3); }
- | expr '*' expr { $$ = op_times ($1, $3); }
- | expr '/' expr { $$ = op_div ($1, $3); }
- | expr '%' expr { $$ = op_rem ($1, $3); }
- | expr ':' expr { $$ = op_colon ($1, $3); }
+ | expr '|' expr { $$ = op_or($1, $3); }
+ | expr '&' expr { $$ = op_and($1, $3); }
+ | expr '=' expr { $$ = op_eq($1, $3); }
+ | expr '>' expr { $$ = op_gt($1, $3); }
+ | expr '<' expr { $$ = op_lt($1, $3); }
+ | expr GE expr { $$ = op_ge($1, $3); }
+ | expr LE expr { $$ = op_le($1, $3); }
+ | expr NE expr { $$ = op_ne($1, $3); }
+ | expr '+' expr { $$ = op_plus($1, $3); }
+ | expr '-' expr { $$ = op_minus($1, $3); }
+ | expr '*' expr { $$ = op_times($1, $3); }
+ | expr '/' expr { $$ = op_div($1, $3); }
+ | expr '%' expr { $$ = op_rem($1, $3); }
+ | expr ':' expr { $$ = op_colon($1, $3); }
;
-
%%
struct val *
@@ -120,89 +122,65 @@ make_integer(intmax_t i)
{
struct val *vp;
- vp = (struct val *) malloc (sizeof (*vp));
- if (vp == NULL) {
+ vp = (struct val *)malloc(sizeof(*vp));
+ if (vp == NULL)
errx(ERR_EXIT, "malloc() failed");
- }
vp->type = integer;
vp->u.i = i;
- return vp;
+ return (vp);
}
struct val *
make_str(const char *s)
{
struct val *vp;
- char *ep;
- vp = (struct val *) malloc (sizeof (*vp));
- if (vp == NULL || ((vp->u.s = strdup (s)) == NULL)) {
+ vp = (struct val *)malloc(sizeof(*vp));
+ if (vp == NULL || ((vp->u.s = strdup(s)) == NULL))
errx(ERR_EXIT, "malloc() failed");
- }
- /*
- * Previously we tried to scan the string to see if it ``looked like''
- * an integer (erroneously, as it happened). Let strtoimax() do the
- * dirty work. We could cache the value, except that we are using
- * a union and need to preserve the original string form until we
- * are certain that it is not needed.
- *
- * IEEE Std.1003.1-2001 says:
- * /integer/ An argument consisting only of an (optional) unary minus
- * followed by digits.
- *
- * This means that arguments which consist of digits followed by
- * non-digits MUST NOT be considered integers. strtoimax() will
- * figure this out for us.
- */
- if (eflag)
- (void)strtoimax(s, &ep, 10);
+ if (is_integer(s))
+ vp->type = numeric_string;
else
- (void)strtol(s, &ep, 10);
-
- if (*ep != '\0')
vp->type = string;
- else
- vp->type = numeric_string;
- return vp;
+ return (vp);
}
-
void
free_value(struct val *vp)
{
if (vp->type == string || vp->type == numeric_string)
- free (vp->u.s);
+ free(vp->u.s);
}
-
-intmax_t
+int
to_integer(struct val *vp)
{
intmax_t i;
- if (vp->type == integer)
- return 1;
-
- if (vp->type == string)
- return 0;
-
- /* vp->type == numeric_string, make it numeric */
- errno = 0;
- if (eflag) {
+ /* we can only convert numeric_string to integer, here */
+ if (vp->type == numeric_string) {
+ errno = 0;
i = strtoimax(vp->u.s, (char **)NULL, 10);
- if (errno == ERANGE)
- err(ERR_EXIT, NULL);
- } else {
- i = strtol(vp->u.s, (char **)NULL, 10);
+ /* just keep as numeric_string, if the conversion fails */
+ if (errno != ERANGE) {
+ free(vp->u.s);
+ vp->u.i = i;
+ vp->type = integer;
+ }
}
+ return (vp->type == integer);
+}
- free (vp->u.s);
- vp->u.i = i;
- vp->type = integer;
- return 1;
+void
+assert_to_integer(struct val *vp)
+{
+ if (vp->type == string)
+ errx(ERR_EXIT, "not a decimal number: '%s'", vp->u.s);
+ if (!to_integer(vp))
+ errx(ERR_EXIT, "operand too large: '%s'", vp->u.s);
}
void
@@ -228,15 +206,31 @@ to_string(struct val *vp)
vp->u.s = tmp;
}
+int
+is_integer(const char *s)
+{
+ if (nonposix) {
+ if (*s == '\0')
+ return (1);
+ while (isspace((unsigned char)*s))
+ s++;
+ }
+ if (*s == '-' || (nonposix && *s == '+'))
+ s++;
+ if (*s == '\0')
+ return (0);
+ while (isdigit((unsigned char)*s))
+ s++;
+ return (*s == '\0');
+}
int
-isstring(struct val *vp)
+is_string(struct val *vp)
{
/* only TRUE if this string is not a valid integer */
return (vp->type == string);
}
-
int
yylex(void)
{
@@ -247,10 +241,10 @@ yylex(void)
p = *av++;
- if (strlen (p) == 1) {
- if (strchr ("|&=<>+-*/%:()", *p))
+ if (strlen(p) == 1) {
+ if (strchr("|&=<>+-*/%:()", *p))
return (*p);
- } else if (strlen (p) == 2 && p[1] == '=') {
+ } else if (strlen(p) == 2 && p[1] == '=') {
switch (*p) {
case '>': return (GE);
case '<': return (LE);
@@ -258,19 +252,17 @@ yylex(void)
}
}
- yylval.val = make_str (p);
+ yylval.val = make_str(p);
return (TOKEN);
}
int
is_zero_or_null(struct val *vp)
{
- if (vp->type == integer) {
+ if (vp->type == integer)
return (vp->u.i == 0);
- } else {
- return (*vp->u.s == 0 || (to_integer (vp) && vp->u.i == 0));
- }
- /* NOTREACHED */
+
+ return (*vp->u.s == 0 || (to_integer(vp) && vp->u.i == 0));
}
int
@@ -278,23 +270,22 @@ main(int argc, char *argv[])
{
int c;
- setlocale (LC_ALL, "");
+ setlocale(LC_ALL, "");
if (getenv("EXPR_COMPAT") != NULL
|| check_utility_compat("expr")) {
av = argv + 1;
- eflag = 1;
+ nonposix = 1;
} else {
- while ((c = getopt(argc, argv, "e")) != -1)
+ while ((c = getopt(argc, argv, "e")) != -1) {
switch (c) {
case 'e':
- eflag = 1;
+ nonposix = 1;
break;
-
default:
- fprintf(stderr,
+ errx(ERR_EXIT,
"usage: expr [-e] expression\n");
- exit(ERR_EXIT);
}
+ }
av = argv + optind;
}
@@ -314,164 +305,104 @@ yyerror(const char *s __unused)
errx(ERR_EXIT, "syntax error");
}
-
struct val *
op_or(struct val *a, struct val *b)
{
- if (is_zero_or_null (a)) {
- free_value (a);
- return (b);
- } else {
- free_value (b);
+ if (!is_zero_or_null(a)) {
+ free_value(b);
return (a);
}
+ free_value(a);
+ if (!is_zero_or_null(b))
+ return (b);
+ free_value(b);
+ return (make_integer((intmax_t)0));
}
-
+
struct val *
op_and(struct val *a, struct val *b)
{
- if (is_zero_or_null (a) || is_zero_or_null (b)) {
- free_value (a);
- free_value (b);
- return (make_integer ((intmax_t)0));
+ if (is_zero_or_null(a) || is_zero_or_null(b)) {
+ free_value(a);
+ free_value(b);
+ return (make_integer((intmax_t)0));
} else {
- free_value (b);
+ free_value(b);
return (a);
}
}
-struct val *
-op_eq(struct val *a, struct val *b)
+int
+compare_vals(struct val *a, struct val *b)
{
- struct val *r;
+ int r;
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) == 0));
+ if (is_string(a) || is_string(b)) {
+ to_string(a);
+ to_string(b);
+ r = strcoll(a->u.s, b->u.s);
} else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i == b->u.i));
+ assert_to_integer(a);
+ assert_to_integer(b);
+ if (a->u.i > b->u.i)
+ r = 1;
+ else if (a->u.i < b->u.i)
+ r = -1;
+ else
+ r = 0;
}
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
struct val *
-op_gt(struct val *a, struct val *b)
+op_eq(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) > 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i > b->u.i));
- }
+ return (make_integer((intmax_t)(compare_vals(a, b) == 0)));
+}
- free_value (a);
- free_value (b);
- return r;
+struct val *
+op_gt(struct val *a, struct val *b)
+{
+ return (make_integer((intmax_t)(compare_vals(a, b) > 0)));
}
struct val *
op_lt(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) < 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i < b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) < 0)));
}
struct val *
op_ge(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) >= 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i >= b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) >= 0)));
}
struct val *
op_le(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) <= 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i <= b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) <= 0)));
}
struct val *
op_ne(struct val *a, struct val *b)
{
- struct val *r;
-
- if (isstring (a) || isstring (b)) {
- to_string (a);
- to_string (b);
- r = make_integer ((intmax_t)(strcoll (a->u.s, b->u.s) != 0));
- } else {
- (void)to_integer(a);
- (void)to_integer(b);
- r = make_integer ((intmax_t)(a->u.i != b->u.i));
- }
-
- free_value (a);
- free_value (b);
- return r;
+ return (make_integer((intmax_t)(compare_vals(a, b) != 0)));
}
-int
-chk_plus(intmax_t a, intmax_t b, intmax_t r)
+void
+assert_plus(intmax_t a, intmax_t b, intmax_t r)
{
-
- /* sum of two positive numbers must be positive */
- if (a > 0 && b > 0 && r <= 0)
- return 1;
- /* sum of two negative numbers must be negative */
- if (a < 0 && b < 0 && r >= 0)
- return 1;
- /* all other cases are OK */
- return 0;
+ /*
+ * sum of two positive numbers must be positive,
+ * sum of two negative numbers must be negative
+ */
+ if ((a > 0 && b > 0 && r <= 0) ||
+ (a < 0 && b < 0 && r >= 0))
+ errx(ERR_EXIT, "overflow");
}
struct val *
@@ -479,36 +410,24 @@ op_plus(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (eflag) {
- r = make_integer(a->u.i + b->u.i);
- if (chk_plus(a->u.i, b->u.i, r->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i + (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ r = make_integer(a->u.i + b->u.i);
+ assert_plus(a->u.i, b->u.i, r->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-int
-chk_minus(intmax_t a, intmax_t b, intmax_t r)
+void
+assert_minus(intmax_t a, intmax_t b, intmax_t r)
{
-
/* special case subtraction of INTMAX_MIN */
- if (b == INTMAX_MIN) {
- if (a >= 0)
- return 1;
- else
- return 0;
- }
- /* this is allowed for b != INTMAX_MIN */
- return chk_plus (a, -b, r);
+ if (b == INTMAX_MIN && a < 0)
+ errx(ERR_EXIT, "overflow");
+ /* check addition of negative subtrahend */
+ assert_plus(a, -b, r);
}
struct val *
@@ -516,33 +435,25 @@ op_minus(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (eflag) {
- r = make_integer(a->u.i - b->u.i);
- if (chk_minus(a->u.i, b->u.i, r->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i - (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ r = make_integer(a->u.i - b->u.i);
+ assert_minus(a->u.i, b->u.i, r->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-int
-chk_times(intmax_t a, intmax_t b, intmax_t r)
+void
+assert_times(intmax_t a, intmax_t b, intmax_t r)
{
- /* special case: first operand is 0, no overflow possible */
- if (a == 0)
- return 0;
- /* verify that result of division matches second operand */
- if (r / a != b)
- return 1;
- return 0;
+ /*
+ * if first operand is 0, no overflow is possible,
+ * else result of division test must match second operand
+ */
+ if (a != 0 && r / a != b)
+ errx(ERR_EXIT, "overflow");
}
struct val *
@@ -550,32 +461,24 @@ op_times(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (eflag) {
- r = make_integer(a->u.i * b->u.i);
- if (chk_times(a->u.i, b->u.i, r->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i * (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ r = make_integer(a->u.i * b->u.i);
+ assert_times(a->u.i, b->u.i, r->u.i);
- free_value (a);
- free_value (b);
+ free_value(a);
+ free_value(b);
return (r);
}
-int
-chk_div(intmax_t a, intmax_t b)
+void
+assert_div(intmax_t a, intmax_t b)
{
- /* div by zero has been taken care of before */
+ if (b == 0)
+ errx(ERR_EXIT, "division by zero");
/* only INTMAX_MIN / -1 causes overflow */
if (a == INTMAX_MIN && b == -1)
- return 1;
- /* everything else is OK */
- return 0;
+ errx(ERR_EXIT, "overflow");
}
struct val *
@@ -583,51 +486,33 @@ op_div(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (b->u.i == 0) {
- errx(ERR_EXIT, "division by zero");
- }
-
- if (eflag) {
- r = make_integer(a->u.i / b->u.i);
- if (chk_div(a->u.i, b->u.i)) {
- errx(ERR_EXIT, "overflow");
- }
- } else
- r = make_integer((long)a->u.i / (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ /* assert based on operands only, not on result */
+ assert_div(a->u.i, b->u.i);
+ r = make_integer(a->u.i / b->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-
+
struct val *
op_rem(struct val *a, struct val *b)
{
struct val *r;
- if (!to_integer(a) || !to_integer(b)) {
- errx(ERR_EXIT, "non-numeric argument");
- }
-
- if (b->u.i == 0) {
- errx(ERR_EXIT, "division by zero");
- }
-
- if (eflag)
- r = make_integer(a->u.i % b->u.i);
- /* chk_rem necessary ??? */
- else
- r = make_integer((long)a->u.i % (long)b->u.i);
+ assert_to_integer(a);
+ assert_to_integer(b);
+ /* pass a=1 to only check for div by zero */
+ assert_div(1, b->u.i);
+ r = make_integer(a->u.i % b->u.i);
- free_value (a);
- free_value (b);
- return r;
+ free_value(a);
+ free_value(b);
+ return (r);
}
-
+
struct val *
op_colon(struct val *a, struct val *b)
{
@@ -642,33 +527,30 @@ op_colon(struct val *a, struct val *b)
to_string(b);
/* compile regular expression */
- if ((eval = regcomp (&rp, b->u.s, 0)) != 0) {
- regerror (eval, &rp, errbuf, sizeof(errbuf));
+ if ((eval = regcomp(&rp, b->u.s, 0)) != 0) {
+ regerror(eval, &rp, errbuf, sizeof(errbuf));
errx(ERR_EXIT, "%s", errbuf);
}
/* compare string against pattern */
/* remember that patterns are anchored to the beginning of the line */
- if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 && rm[0].rm_so == 0) {
+ if (regexec(&rp, a->u.s, (size_t)2, rm, 0) == 0 && rm[0].rm_so == 0)
if (rm[1].rm_so >= 0) {
*(a->u.s + rm[1].rm_eo) = '\0';
- v = make_str (a->u.s + rm[1].rm_so);
+ v = make_str(a->u.s + rm[1].rm_so);
- } else {
- v = make_integer ((intmax_t)(rm[0].rm_eo - rm[0].rm_so));
- }
- } else {
- if (rp.re_nsub == 0) {
- v = make_integer ((intmax_t)0);
- } else {
- v = make_str ("");
- }
- }
+ } else
+ v = make_integer((intmax_t)(rm[0].rm_eo - rm[0].rm_so));
+ else
+ if (rp.re_nsub == 0)
+ v = make_integer((intmax_t)0);
+ else
+ v = make_str("");
/* free arguments and pattern buffer */
- free_value (a);
- free_value (b);
- regfree (&rp);
+ free_value(a);
+ free_value(b);
+ regfree(&rp);
- return v;
+ return (v);
}
diff --git a/bin/ps/ps.1 b/bin/ps/ps.1
index 10dd6af..a66ed5d 100644
--- a/bin/ps/ps.1
+++ b/bin/ps/ps.1
@@ -29,7 +29,7 @@
.\" @(#)ps.1 8.3 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd June 14, 2011
+.Dd July 1, 2011
.Dt PS 1
.Os
.Sh NAME
@@ -492,6 +492,8 @@ command
command and arguments
.It Cm cpu
short-term CPU usage factor (for scheduling)
+.It Cm emul
+system-call emulation environment
.It Cm etime
elapsed running time, format
.Op days- Ns
@@ -527,6 +529,8 @@ lock currently blocked on (as a symbolic name)
login name of user who started the session
.It Cm lstart
time started
+.It Cm lwp
+process thread-id
.It Cm majflt
total page faults
.It Cm minflt
@@ -542,6 +546,8 @@ nice value (alias
.Cm ni )
.It Cm nivcsw
total involuntary context switches
+.It Cm nlwp
+number of threads tied to a process
.It Cm nsigs
total signals taken (alias
.Cm nsignals )
@@ -562,8 +568,6 @@ pageins (same as majflt)
process group number
.It Cm pid
process ID
-.It Cm poip
-pageouts in progress
.It Cm ppid
parent process ID
.It Cm pri
@@ -574,8 +578,6 @@ core residency time (in seconds; 127 = infinity)
real group ID
.It Cm rgroup
group name (from rgid)
-.It Cm rlink
-reverse link on run queue, or 0
.It Cm rss
resident set size
.It Cm rtprio
@@ -630,8 +632,6 @@ text size (in Kbytes)
control terminal name (two letter abbreviation)
.It Cm tty
full name of control terminal
-.It Cm uprocp
-process pointer
.It Cm ucomm
name to be used for accounting
.It Cm uid
@@ -640,6 +640,8 @@ effective user ID (alias
.It Cm upr
scheduling priority on return from system call (alias
.Cm usrpri )
+.It Cm uprocp
+process pointer
.It Cm user
user name (from UID)
.It Cm usertime
diff --git a/bin/rcp/rcp.c b/bin/rcp/rcp.c
index 2c27b63..4577b20 100644
--- a/bin/rcp/rcp.c
+++ b/bin/rcp/rcp.c
@@ -71,7 +71,6 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <string.h>
#include <unistd.h>
#include "extern.h"
diff --git a/bin/realpath/realpath.1 b/bin/realpath/realpath.1
index cf904ed..8df1047 100644
--- a/bin/realpath/realpath.1
+++ b/bin/realpath/realpath.1
@@ -33,7 +33,7 @@
.\" From: src/bin/pwd/pwd.1,v 1.11 2000/11/20 11:39:39 ru Exp
.\" $FreeBSD$
.\"
-.Dd November 24, 2000
+.Dd June 21, 2011
.Dt REALPATH 1
.Os
.Sh NAME
@@ -42,8 +42,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl q
-.Ar path
-.Op Ar ...
+.Op Ar path ...
.Sh DESCRIPTION
The
.Nm
@@ -57,6 +56,11 @@ and
.Pa /../
in
.Ar path .
+If
+.Ar path
+is absent, the current working directory
+.Pq Sq Pa .\&
+is assumed.
.Pp
If
.Fl q
diff --git a/bin/realpath/realpath.c b/bin/realpath/realpath.c
index 99f5a9d5..a2ae06b 100644
--- a/bin/realpath/realpath.c
+++ b/bin/realpath/realpath.c
@@ -44,7 +44,8 @@ main(int argc, char *argv[])
{
char buf[PATH_MAX];
char *p;
- int ch, i, qflag, rval;
+ const char *path;
+ int ch, qflag, rval;
qflag = 0;
while ((ch = getopt(argc, argv, "q")) != -1) {
@@ -59,17 +60,16 @@ main(int argc, char *argv[])
}
argc -= optind;
argv += optind;
- if (argc < 1)
- usage();
+ path = *argv != NULL ? *argv++ : ".";
rval = 0;
- for (i = 0; i < argc; i++) {
- if ((p = realpath(argv[i], buf)) == NULL) {
+ do {
+ if ((p = realpath(path, buf)) == NULL) {
if (!qflag)
- warn("%s", argv[i]);
+ warn("%s", path);
rval = 1;
} else
(void)printf("%s\n", p);
- }
+ } while ((path = *argv++) != NULL);
exit(rval);
}
@@ -77,6 +77,6 @@ static void
usage(void)
{
- (void)fprintf(stderr, "usage: realpath [-q] path [...]\n");
+ (void)fprintf(stderr, "usage: realpath [-q] [path ...]\n");
exit(1);
}
diff --git a/bin/sh/arith_yacc.c b/bin/sh/arith_yacc.c
index f1ac59e..041e638 100644
--- a/bin/sh/arith_yacc.c
+++ b/bin/sh/arith_yacc.c
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/limits.h>
+#include <limits.h>
#include <errno.h>
#include <inttypes.h>
#include <stdlib.h>
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index 9d67b9e..d5da7d3 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -140,7 +140,7 @@ evalcmd(int argc, char **argv)
STPUTC('\0', concat);
p = grabstackstr(concat);
}
- evalstring(p, builtin_flags & EV_TESTED);
+ evalstring(p, builtin_flags);
} else
exitstatus = 0;
return exitstatus;
@@ -386,6 +386,14 @@ evalcase(union node *n, int flags)
for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) {
for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) {
if (casematch(patp, arglist.list->text)) {
+ while (cp->nclist.next &&
+ cp->type == NCLISTFALLTHRU) {
+ if (evalskip != 0)
+ break;
+ evaltree(cp->nclist.body,
+ flags & ~EV_EXIT);
+ cp = cp->nclist.next;
+ }
if (evalskip == 0) {
evaltree(cp->nclist.body, flags);
}
@@ -886,14 +894,13 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
}
/* Fork off a child process if necessary. */
- if (cmd->ncmd.backgnd
- || ((cmdentry.cmdtype == CMDNORMAL || cmdentry.cmdtype == CMDUNKNOWN)
+ if (((cmdentry.cmdtype == CMDNORMAL || cmdentry.cmdtype == CMDUNKNOWN)
&& ((flags & EV_EXIT) == 0 || have_traps()))
|| ((flags & EV_BACKCMD) != 0
&& (cmdentry.cmdtype != CMDBUILTIN ||
!safe_builtin(cmdentry.u.index, argc, argv)))) {
jp = makejob(cmd, 1);
- mode = cmd->ncmd.backgnd;
+ mode = FORK_FG;
if (flags & EV_BACKCMD) {
mode = FORK_NOJOB;
if (pipe(pip) < 0)
@@ -908,6 +915,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
dup2(pip[1], 1);
close(pip[1]);
}
+ flags &= ~EV_BACKCMD;
}
flags |= EV_EXIT;
}
@@ -1059,8 +1067,7 @@ parent: /* parent process gets here (if we forked) */
backcmd->fd = pip[0];
close(pip[1]);
backcmd->jp = jp;
- } else
- exitstatus = 0;
+ }
out:
if (lastarg)
diff --git a/bin/sh/mkinit.c b/bin/sh/mkinit.c
index 866b238..1d1d93e 100644
--- a/bin/sh/mkinit.c
+++ b/bin/sh/mkinit.c
@@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$");
*/
-#include <sys/cdefs.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/bin/sh/mktokens b/bin/sh/mktokens
index b85c8cb9..82d7cd7 100644
--- a/bin/sh/mktokens
+++ b/bin/sh/mktokens
@@ -50,6 +50,7 @@ TPIPE 0 "|"
TLP 0 "("
TRP 1 ")"
TENDCASE 1 ";;"
+TFALLTHRU 1 ";&"
TREDIR 0 redirection
TWORD 0 word
TIF 0 "if"
diff --git a/bin/sh/nodetypes b/bin/sh/nodetypes
index e1e1b04..ae4bc4a 100644
--- a/bin/sh/nodetypes
+++ b/bin/sh/nodetypes
@@ -56,7 +56,6 @@ NSEMI nbinary # two commands separated by a semicolon
NCMD ncmd # a simple command
type int
- backgnd int # set to run command in background
args nodeptr # the arguments
redirect nodeptr # list of file redirections
@@ -96,12 +95,13 @@ NCASE ncase # a case statement
expr nodeptr # the word to switch on
cases nodeptr # the list of cases (NCLIST nodes)
-NCLIST nclist # a case
+NCLIST nclist # a case ending with ;;
type int
next nodeptr # the next case in list
pattern nodeptr # list of patterns for this case
body nodeptr # code to execute for this case
+NCLISTFALLTHRU nclist # a case ending with ;&
NDEFUN narg # define a function. The "next" field contains
# the body of the function.
diff --git a/bin/sh/options.h b/bin/sh/options.h
index f3d3d3d..acc2a11 100644
--- a/bin/sh/options.h
+++ b/bin/sh/options.h
@@ -62,8 +62,9 @@ struct shparam {
#define privileged optlist[15].val
#define Tflag optlist[16].val
#define Pflag optlist[17].val
+#define hflag optlist[18].val
-#define NOPTS 18
+#define NOPTS 19
struct optent {
const char *name;
@@ -91,6 +92,7 @@ struct optent optlist[NOPTS] = {
{ "privileged", 'p', 0 },
{ "trapsasync", 'T', 0 },
{ "physical", 'P', 0 },
+ { "trackall", 'h', 0 },
};
#else
extern struct optent optlist[NOPTS];
diff --git a/bin/sh/parser.c b/bin/sh/parser.c
index 2fea1ec..ef1aa36 100644
--- a/bin/sh/parser.c
+++ b/bin/sh/parser.c
@@ -240,8 +240,8 @@ list(int nlflag, int erflag)
n2 = andor();
tok = readtoken();
if (tok == TBACKGND) {
- if (n2->type == NCMD || n2->type == NPIPE) {
- n2->ncmd.backgnd = 1;
+ if (n2->type == NPIPE) {
+ n2->npipe.backgnd = 1;
} else if (n2->type == NREDIR) {
n2->type = NBACKGND;
} else {
@@ -542,10 +542,13 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
checkkwd = CHKNL | CHKKWD | CHKALIAS;
if ((t = readtoken()) != TESAC) {
- if (t != TENDCASE)
- synexpect(TENDCASE);
+ if (t == TENDCASE)
+ ;
+ else if (t == TFALLTHRU)
+ cp->type = NCLISTFALLTHRU;
else
- checkkwd = CHKNL | CHKKWD, readtoken();
+ synexpect(TENDCASE);
+ checkkwd = CHKNL | CHKKWD, readtoken();
}
cpp = &cp->nclist.next;
}
@@ -686,7 +689,6 @@ simplecmd(union node **rpp, union node *redir)
*rpp = NULL;
n = (union node *)stalloc(sizeof (struct ncmd));
n->type = NCMD;
- n->ncmd.backgnd = 0;
n->ncmd.args = args;
n->ncmd.redirect = redir;
return n;
@@ -931,8 +933,11 @@ xxreadtoken(void)
pungetc();
RETURN(TPIPE);
case ';':
- if (pgetc() == ';')
+ c = pgetc();
+ if (c == ';')
RETURN(TENDCASE);
+ else if (c == '&')
+ RETURN(TFALLTHRU);
pungetc();
RETURN(TSEMI);
case '(':
diff --git a/bin/sh/sh.1 b/bin/sh/sh.1
index 67ffcc6..bbb0f49 100644
--- a/bin/sh/sh.1
+++ b/bin/sh/sh.1
@@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
-.Dd June 15, 2011
+.Dd July 10, 2011
.Dt SH 1
.Os
.Sh NAME
@@ -241,6 +241,10 @@ tested, all commands of the function are considered to be tested as
well.
.It Fl f Li noglob
Disable pathname expansion.
+.It Fl h Li trackall
+A do-nothing option for
+.Tn POSIX
+compliance.
.It Fl I Li ignoreeof
Ignore
.Dv EOF Ap s
@@ -372,7 +376,7 @@ The following is a list of valid operators:
.It Control operators:
.Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact
.It Li & Ta Li && Ta Li ( Ta Li ) Ta Li \en
-.It Li ;; Ta Li ; Ta Li | Ta Li ||
+.It Li ;; Ta Li ;& Ta Li ; Ta Li | Ta Li ||
.El
.It Redirection operators:
.Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact
@@ -857,7 +861,9 @@ causes asynchronous execution of the preceding AND-OR-list.
.Ss Background Commands (&)
If a command is terminated by the control operator ampersand
.Pq Ql & ,
-the shell executes the command asynchronously;
+the shell executes the command in a subshell environment (see
+.Sx Grouping Commands Together
+below) and asynchronously;
the shell does not wait for the command to finish
before executing the next command.
.Pp
@@ -990,6 +996,22 @@ described later),
separated by
.Ql \&|
characters.
+Tilde expansion, parameter expansion, command substitution,
+arithmetic expansion and quote removal are applied to the word.
+Then, each pattern is expanded in turn using tilde expansion,
+parameter expansion, command substitution and arithmetic expansion and
+the expanded form of the word is checked against it.
+If a match is found, the corresponding list is executed.
+If the selected list is terminated by the control operator
+.Ql ;&
+instead of
+.Ql ;; ,
+execution continues with the next list,
+continuing until a list terminated with
+.Ql ;;
+or the end of the
+.Ic case
+command.
The exit code of the
.Ic case
command is the exit code of the last command executed in the list or
@@ -1004,7 +1026,41 @@ or
.D1 Li { Ar list Ns Li \&; }
.Pp
The first form executes the commands in a subshell environment.
-Note that built-in commands thus executed do not affect the current shell.
+A subshell environment has its own copy of:
+.Pp
+.Bl -enum
+.It
+The current working directory as set by
+.Ic cd .
+.It
+The file creation mask as set by
+.Ic umask .
+.It
+References to open files.
+.It
+Traps as set by
+.Ic trap .
+.It
+Known jobs.
+.It
+Positional parameters and variables.
+.It
+Shell options.
+.It
+Shell functions.
+.It
+Shell aliases.
+.El
+.Pp
+These are copied from the parent shell environment,
+except that trapped (but not ignored) signals are reset to the default action
+and known jobs are cleared.
+Any changes do not affect the parent shell environment.
+.Pp
+A subshell environment may be implemented as a child process or differently.
+If job control is enabled in an interactive shell,
+commands grouped in parentheses can be suspended and continued as a unit.
+.Pp
The second form never forks another shell,
so it is slightly more efficient.
Grouping commands together this way allows the user to
@@ -1532,10 +1588,12 @@ The command is executed in a subshell environment,
except that the built-in commands
.Ic jobid ,
.Ic jobs ,
-.Ic times
and
.Ic trap
-return information about the main shell environment
+return information about the parent shell environment
+and
+.Ic times
+returns information about the same process
if they are the only command in a command substitution.
.Ss Arithmetic Expansion
Arithmetic expansion provides a mechanism for evaluating an arithmetic
@@ -1609,15 +1667,15 @@ There are two restrictions on this: first, a pattern cannot match
a string containing a slash, and second,
a pattern cannot match a string starting with a period
unless the first character of the pattern is a period.
-The next section describes the patterns used for both
-Pathname Expansion and the
+The next section describes the patterns used for
+Pathname Expansion,
+the four varieties of parameter expansion for substring processing and the
.Ic case
command.
.Ss Shell Patterns
A pattern consists of normal characters, which match themselves,
and meta-characters.
The meta-characters are
-.Ql \&! ,
.Ql * ,
.Ql \&? ,
and
@@ -1647,7 +1705,7 @@ matches a
.Ql \&[
rather than introducing a character class.
A character class matches any of the characters between the square brackets.
-A range of characters may be specified using a minus sign.
+A locale-dependent range of characters may be specified using a minus sign.
A named class of characters (see
.Xr wctype 3 )
may be specified by surrounding the name with
@@ -1660,12 +1718,17 @@ is a shell pattern that matches a single letter.
The character class may be complemented by making an exclamation point
.Pq Ql !\&
the first character of the character class.
+A caret
+.Pq Ql ^
+has the same effect but is non-standard.
.Pp
To include a
.Ql \&]
in a character class, make it the first character listed
(after the
-.Ql \&! ,
+.Ql \&!
+or
+.Ql ^ ,
if any).
To include a
.Ql - ,
@@ -2334,8 +2397,8 @@ If there are zero positional parameters, shifting does not do anything.
A built-in equivalent of
.Xr test 1 .
.It Ic times
-Print the amount of time spent executing the shell and its children.
-The first output line shows the user and system times for the shell
+Print the amount of time spent executing the shell process and its children.
+The first output line shows the user and system times for the shell process
itself, the second one contains the user and system times for the
children.
.It Ic trap Oo Ar action Oc Ar signal ...
@@ -2361,7 +2424,7 @@ Omitting the
.Ar action
is another way to request the default action, for compatibility reasons this
usage is not recommended though.
-In a subshell environment,
+In a subshell or utility environment,
the shell resets trapped (but not ignored) signals to the default action.
The
.Ic trap
diff --git a/bin/sh/var.c b/bin/sh/var.c
index d5b2522..b3bc6f7f 100644
--- a/bin/sh/var.c
+++ b/bin/sh/var.c
@@ -612,6 +612,12 @@ showvarscmd(int argc __unused, char **argv __unused)
qsort(vars, n, sizeof(*vars), var_compare);
for (i = 0; i < n; i++) {
+ /*
+ * Skip improper variable names so the output remains usable as
+ * shell input.
+ */
+ if (!isassignment(vars[i]))
+ continue;
s = strchr(vars[i], '=');
s++;
outbin(vars[i], s - vars[i], out1);
@@ -683,6 +689,13 @@ exportcmd(int argc, char **argv)
for (vp = *vpp ; vp ; vp = vp->next) {
if (vp->flags & flag) {
if (values) {
+ /*
+ * Skip improper variable names
+ * so the output remains usable
+ * as shell input.
+ */
+ if (!isassignment(vp->text))
+ continue;
out1str(cmdname);
out1c(' ');
}
diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs.8 b/cddl/contrib/opensolaris/cmd/zfs/zfs.8
index 0d40a90..e5d8590 100644
--- a/cddl/contrib/opensolaris/cmd/zfs/zfs.8
+++ b/cddl/contrib/opensolaris/cmd/zfs/zfs.8
@@ -6,6 +6,7 @@
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License. You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.
.\" See the License for the specific language governing permissions and limitations under the License. When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with
.\" the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
+.\" Copyright 2011 by Delphix. All rights reserved.
.TH zfs 1M "24 Sep 2009" "SunOS 5.11" "System Administration Commands"
.SH NAME
zfs \- configures ZFS file systems
@@ -389,7 +390,7 @@ This property can also be referred to by its shortened column name, \fBavail\fR.
.ad
.sp .6
.RS 4n
-The compression ratio achieved for this dataset, expressed as a multiplier. Compression can be turned on by running: \fBzfs set compression=on \fIdataset\fR\fR. The default value is \fBoff\fR.
+For non-snapshots, the compression ratio achieved for the \fBused\fR space of this dataset, expressed as a multiplier. The \fBused\fR property includes descendant datasets, and, for clones, does not include the space shared with the origin snapshot. For snapshots, the \fBcompressratio\fR is the same as the \fBrefcompressratio\fR property. Compression can be turned on by running: \fBzfs set compression=on \fIdataset\fR\fR. The default value is \fBoff\fR.
.RE
.sp
@@ -453,6 +454,17 @@ This property can also be referred to by its shortened column name, \fBrefer\fR.
.ne 2
.mk
.na
+\fB\fBrefcompressratio\fR\fR
+.ad
+.sp .6
+.RS 4n
+The compression ratio achieved for the \fBreferenced\fR space of this dataset, expressed as a multiplier. See also the \fBcompressratio\fR property.
+.RE
+
+.sp
+.ne 2
+.mk
+.na
\fB\fBtype\fR\fR
.ad
.sp .6
@@ -1278,7 +1290,7 @@ Recursively destroy all dependents, including cloned file systems outside the ta
Force an unmount of any file systems using the \fBunmount -f\fR command. This option has no effect on non-file systems or unmounted file systems.
.RE
-Extreme care should be taken when applying either the \fB-r\fR or the \fB-f\fR options, as they can destroy large portions of a pool and cause unexpected behavior for mounted file systems in use.
+Extreme care should be taken when applying either the \fB-r\fR or the \fB-R\fR options, as they can destroy large portions of a pool and cause unexpected behavior for mounted file systems in use.
.RE
.sp
diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
index 8383dbc..bc5a662 100644
--- a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
+++ b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
#include <assert.h>
@@ -1292,7 +1292,7 @@ static int
zfs_do_get(int argc, char **argv)
{
zprop_get_cbdata_t cb = { 0 };
- int i, c, flags = 0;
+ int i, c, flags = ZFS_ITER_ARGS_CAN_BE_PATHS;
char *value, *fields;
int ret;
int limit = 0;
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c
index f4eadbc..ea4607f 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c
@@ -45,6 +45,7 @@
#include <assert.h>
#include <libgen.h>
#include <limits.h>
+#include <stdint.h>
#include <dt_impl.h>
@@ -811,15 +812,14 @@ dt_basename(char *str)
ulong_t
dt_popc(ulong_t x)
{
-#ifdef _ILP32
+#if defined(_ILP32)
x = x - ((x >> 1) & 0x55555555UL);
x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
x = (x + (x >> 4)) & 0x0F0F0F0FUL;
x = x + (x >> 8);
x = x + (x >> 16);
return (x & 0x3F);
-#endif
-#ifdef _LP64
+#elif defined(_LP64)
x = x - ((x >> 1) & 0x5555555555555555ULL);
x = (x & 0x3333333333333333ULL) + ((x >> 2) & 0x3333333333333333ULL);
x = (x + (x >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
@@ -827,6 +827,8 @@ dt_popc(ulong_t x)
x = x + (x >> 16);
x = x + (x >> 32);
return (x & 0x7F);
+#else
+/* This should be a #warning but for now ignore error. Err: "need td_popc() implementation" */
#endif
}
@@ -958,7 +960,7 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid,
P = dt_proc_grab(dtp, pid, PGRAB_RDONLY | PGRAB_FORCE, 0);
if (P == NULL) {
- (void) snprintf(c, sizeof (c), "0x%llx", addr);
+ (void) snprintf(c, sizeof (c), "0x%jx", (uintmax_t)addr);
return (dt_string2str(c, str, nbytes));
}
@@ -976,10 +978,10 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid,
(void) snprintf(c, sizeof (c), "%s`%s", obj, name);
}
} else if (Pobjname(P, addr, objname, sizeof (objname)) != 0) {
- (void) snprintf(c, sizeof (c), "%s`0x%llx",
- dt_basename(objname), addr);
+ (void) snprintf(c, sizeof (c), "%s`0x%jx",
+ dt_basename(objname), (uintmax_t)addr);
} else {
- (void) snprintf(c, sizeof (c), "0x%llx", addr);
+ (void) snprintf(c, sizeof (c), "0x%jx", (uintmax_t)addr);
}
dt_proc_unlock(dtp, P);
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
index 824834e..82f4925 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
@@ -22,6 +22,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2010 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#include <ctype.h>
@@ -2038,6 +2039,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
}
break;
+ case ZFS_PROP_REFRATIO:
case ZFS_PROP_COMPRESSRATIO:
if (get_numeric_property(zhp, prop, src, &source, &val) != 0)
return (-1);
diff --git a/contrib/bind9/CHANGES b/contrib/bind9/CHANGES
index cd744c6..80ac38a 100644
--- a/contrib/bind9/CHANGES
+++ b/contrib/bind9/CHANGES
@@ -1,4 +1,28 @@
- --- 9.6-ESV-R4-P1 released ---
+ --- 9.8.0-P4 released ---
+
+3124. [bug] Use an rdataset attribute flag to indicate
+ negative-cache records rather than using rrtype 0;
+ this will prevent problems when that rrtype is
+ used in actual DNS packets. [RT #24777]
+
+ --- 9.8.0-P3 released (withdrawn) ---
+
+3126. [security] Using DNAME record to generate replacements caused
+ RPZ to exit with a assertion failure. [RT #23766]
+
+3125. [security] Using wildcard CNAME records as a replacement with
+ RPZ caused named to exit with a assertion failure.
+ [RT #24715]
+
+3123. [security] Change #2912 exposed a latent flaw in
+ dns_rdataset_totext() that could cause named to
+ crash with an assertion failure. [RT #24777]
+
+3115. [bug] Named could fail to return requested data when
+ following a CNAME that points into the same zone.
+ [RT #2445]
+
+ --- 9.8.0-P2 released ---
3121. [security] An authoritative name server sending a negative
response containing a very large RRset could
@@ -9,22 +33,114 @@
that validated insecure without using DLV and had
DS records in the parent zone. [RT #24631]
- --- 9.6-ESV-R4 released ---
+ --- 9.8.0-P1 released ---
+
+3100. [security] Certain response policy zone configurations could
+ trigger an INSIST when receiving a query of type
+ RRSIG. [RT #24280]
+
+ --- 9.8.0 released ---
+
+3025. [bug] Fixed a possible deadlock due to zone resigning.
+ [RT #22964]
+
+3024. [func] RTT Banding removed due to minor security increase
+ but major impact on resolver latency. [RT #23310]
+
+3023. [bug] Named could be left in an inconsistent state when
+ receiving multiple AXFR response messages that were
+ not all TSIG-signed. [RT #23254]
+
+3022. [bug] Fixed rpz SERVFAILs after failed zone transfers
+ [RT #23246]
+
+3021. [bug] Change #3010 was incomplete. [RT #22296]
+
+3020. [bug] auto-dnssec failed to correctly update the zone when
+ changing the DNSKEY RRset. [RT #23232]
+
+3019. [test] Test: check apex NSEC3 records after adding DNSKEY
+ record via UPDATE. [RT #23229]
+
+ --- 9.8.0rc1 released ---
- --- 9.6.3 released ---
+3018. [bug] Named failed to check for the "none;" acl when deciding
+ if a zone may need to be re-signed. [RT #23120]
+
+3017. [doc] dnssec-keyfromlabel -I was not properly documented.
+ [RT #22887]
+
+3016. [bug] rndc usage missing '-b'. [RT #22937]
+
+3015. [port] win32: fix IN6_IS_ADDR_LINKLOCAL and
+ IN6_IS_ADDR_SITELOCAL macros. [RT #22724]
+
+3013. [bug] The DNS64 ttl was not always being set as expected.
+ [RT #23034]
+
+3012. [bug] Remove DNSKEY TTL change pairs before generating
+ signing records for any remaining DNSKEY changes.
+ [RT #22590]
+
+3011. [func] Allow setting this in named.conf using the new
+ 'resolver-query-timeout' option, which specifies a max
+ time in seconds. 0 means 'default' and anything longer
+ than 30 will be silently set to 30. [RT #22852]
+
+3010. [bug] Fixed a bug where "rndc reconfig" stopped the timer
+ for refreshing managed-keys. [RT #22296]
3009. [bug] clients-per-query code didn't work as expected with
particular query patterns. [RT #22972]
- --- 9.6.3rc1 released ---
+ --- 9.8.0b1 released ---
+
+3008. [func] Response policy zones (RPZ) support. [RT #21726]
3007. [bug] Named failed to preserve the case of domain names in
rdata which is not compressible when writing master
files. [RT #22863]
+3006. [func] Allow dynamically generated TSIG keys to be preserved
+ across restarts of named. Initially this is for
+ TSIG keys generated using GSSAPI. [RT #22639]
+
+3005. [port] Solaris: Work around the lack of
+ gsskrb5_register_acceptor_identity() by setting
+ the KRB5_KTNAME environment variable to the
+ contents of tkey-gssapi-keytab. Also fixed
+ test errors on MacOSX. [RT #22853]
+
+3004. [func] DNS64 reverse support. [RT #22769]
+
+3003. [experimental] Added update-policy match type "external",
+ enabling named to defer the decision of whether to
+ allow a dynamic update to an external daemon.
+ (Contributed by Andrew Tridgell.) [RT #22758]
+
3002. [bug] isc_mutex_init_errcheck() failed to destroy attr.
[RT #22766]
+3001. [func] Added a default trust anchor for the root zone, which
+ can be switched on by setting "dnssec-validation auto;"
+ in the named.conf options. [RT #21727]
+
+3000. [bug] More TKEY/GSS fixes:
+ - nsupdate can now get the default realm from
+ the user's Kerberos principal
+ - corrected gsstest compilation flags
+ - improved documentation
+ - fixed some NULL dereferences
+ [RT #22795]
+
+2999. [func] Add GOST support (RFC 5933). [RT #20639]
+
+2998. [func] Add isc_task_beginexclusive and isc_task_endexclusive
+ to the task api. [RT #22776]
+
+2997. [func] named -V now reports the OpenSSL and libxml2 verions
+ it was compiled against. [RT #22687]
+
2996. [security] Temporarily disable SO_ACCEPTFILTER support.
[RT #22589]
@@ -35,13 +151,52 @@
do not use threads on earlier versions. Also kill
the unproven-pthreads, mit-pthreads, and ptl2 support.
+2993. [func] Dynamically grow adb hash tables. [RT #21186]
+
+2992. [contrib] contrib/check-secure-delegation.pl: A simple tool
+ for looking at a secure delegation. [RT #22059]
+
+2991. [contrib] contrib/zone-edit.sh: A simple zone editing tool for
+ dynamic zones. [RT #22365]
+
+2990. [bug] 'dnssec-settime -S' no longer tests prepublication
+ interval validity when the interval is set to 0.
+ [RT #22761]
+
+2989. [func] Added support for writable DLZ zones. (Contributed
+ by Andrew Tridgell of the Samba project.) [RT #22629]
+
+2988. [experimental] Added a "dlopen" DLZ driver, allowing the creation
+ of external DLZ drivers that can be loaded as
+ shared objects at runtime rather than linked with
+ named. Currently this is switched on via a
+ compile-time option, "configure --with-dlz-dlopen".
+ Note: the syntax for configuring DLZ zones
+ is likely to be refined in future releases.
+ (Contributed by Andrew Tridgell of the Samba
+ project.) [RT #22629]
+
+2987. [func] Improve ease of configuring TKEY/GSS updates by
+ adding a "tkey-gssapi-keytab" option. If set,
+ updates will be allowed with any key matching
+ a principal in the specified keytab file.
+ "tkey-gssapi-credential" is no longer required
+ and is expected to be deprecated. (Contributed
+ by Andrew Tridgell of the Samba project.)
+ [RT #22629]
+
+2986. [func] Add new zone type "static-stub". It's like a stub
+ zone, but the nameserver names and/or their IP
+ addresses are statically configured. [RT #21474]
+
+2985. [bug] Add a regression test for change #2896. [RT #21324]
+
2984. [bug] Don't run MX checks when the target of the MX record
is ".". [RT #22645]
-2817. [cleanup] Removed unnecessary isc_task_endexclusive() calls.
- [RT #20768]
+2983. [bug] Include "loadkeys" in rndc help output. [RT #22493]
- --- 9.6.3b1 released ---
+ --- 9.8.0a1 released ---
2982. [bug] Reference count dst keys. dst_key_attach() can be used
increment the reference count.
@@ -50,34 +205,103 @@
always call dst_key_free() rather than setting it
to NULL on success. [RT #22672]
+2981. [func] Partial DNS64 support (AAAA synthesis). [RT #21991]
+
+2980. [bug] named didn't properly handle UPDATES that changed the
+ TTL of the NSEC3PARAM RRset. [RT #22363]
+
2979. [bug] named could deadlock during shutdown if two
"rndc stop" commands were issued at the same
time. [RT #22108]
2978. [port] hpux: look for <devpoll.h> [RT #21919]
+2977. [bug] 'nsupdate -l' report if the session key is missing.
+ [RT #21670]
+
2976. [bug] named could die on exit after negotiating a GSS-TSIG
key. [RT #22573]
-2975. [bug] rbtdb.c:cleanup_dead_nodes_callback() aquired the
+2975. [bug] rbtdb.c:cleanup_dead_nodes_callback() acquired the
wrong lock which could lead to server deadlock.
[RT #22614]
+2974. [bug] Some valid UPDATE requests could fail due to a
+ consistency check examining the existing version
+ of the zone rather than the new version resulting
+ from the UPDATE. [RT #22413]
+
+2973. [bug] bind.keys.h was being removed by the "make clean"
+ at the end of configure resulting in build failures
+ where there is very old version of perl installed.
+ Move it to "make maintainer-clean". [RT #22230]
+
+2972. [bug] win32: address windows socket errors. [RT #21906]
+
+2971. [bug] Fixed a bug that caused journal files not to be
+ compacted on Windows systems as a result of
+ non-POSIX-compliant rename() semantics. [RT #22434]
+
+2970. [security] Adding a NO DATA negative cache entry failed to clear
+ any matching RRSIG records. A subsequent lookup of
+ of NO DATA cache entry could trigger a INSIST when the
+ unexpected RRSIG was also returned with the NO DATA
+ cache entry.
+
+ CVE-2010-3613, VU#706148. [RT #22288]
+
+2969. [security] Fix acl type processing so that allow-query works
+ in options and view statements. Also add a new
+ set of tests to verify proper functioning.
+
+ CVE-2010-3615, VU#510208. [RT #22418]
+
+2968. [security] Named could fail to prove a data set was insecure
+ before marking it as insecure. One set of conditions
+ that can trigger this occurs naturally when rolling
+ DNSKEY algorithms.
+
+ CVE-2010-3614, VU#837744. [RT #22309]
+
+2967. [bug] 'host -D' now turns on debugging messages earlier.
+ [RT #22361]
+
+2966. [bug] isc_print_vsnprintf() failed to check if there was
+ space available in the buffer when adding a left
+ justified character with a non zero width,
+ (e.g. "%-1c"). [RT #22270]
+
2965. [func] Test HMAC functions using test data from RFC 2104 and
RFC 4634. [RT #21702]
+2964. [placeholder]
+
+2963. [security] The allow-query acl was being applied instead of the
+ allow-query-cache acl to cache lookups. [RT #22114]
+
+2962. [port] win32: add more dependencies to BINDBuild.dsw.
+ [RT #22062]
+
+2961. [bug] Be still more selective about the non-authoritative
+ answers we apply change 2748 to. [RT #22074]
+
2960. [func] Check that named accepts non-authoritative answers.
[RT #21594]
2959. [func] Check that named starts with a missing masterfile.
[RT #22076]
+2958. [bug] named failed to start with a missing master file.
+ [RT #22076]
+
2957. [bug] entropy_get() and entropy_getpseudo() failed to match
the API for RAND_bytes() and RAND_pseudo_bytes()
respectively. [RT #21962]
2956. [port] Enable atomic operations on the PowerPC64. [RT #21899]
+2955. [func] Provide more detail in the recursing log. [RT #22043]
+
2954. [bug] contrib: dlz_mysql_driver.c bad error handling on
build_sqldbinstance failure. [RT #21623]
@@ -85,10 +309,26 @@
exact match" message when returning a wildcard
no data response. [RT #21744]
+2952. [port] win32: named-checkzone and named-checkconf failed
+ to initialise winsock. [RT #21932]
+
+2951. [bug] named failed to generate a correct signed response
+ in a optout, delegation only zone with no secure
+ delegations. [RT #22007]
+
2950. [bug] named failed to perform a SOA up to date check when
falling back to TCP on UDP timeouts when
ixfr-from-differences was set. [RT #21595]
+2949. [bug] dns_view_setnewzones() contained a memory leak if
+ it was called multiple times. [RT #21942]
+
+2948. [port] MacOS: provide a mechanism to configure the test
+ interfaces at reboot. See bin/tests/system/README
+ for details.
+
+2947. [placeholder]
+
2946. [doc] Document the default values for the minimum and maximum
zone refresh and retry values in the ARM. [RT #21886]
@@ -97,12 +337,59 @@
2944. [maint] Remove ORCHID prefix from built in empty zones.
[RT #21772]
+2943. [func] Add support to load new keys into managed zones
+ without signing immediately with "rndc loadkeys".
+ Add support to link keys with "dnssec-keygen -S"
+ and "dnssec-settime -S". [RT #21351]
+
2942. [contrib] zone2sqlite failed to setup the entropy sources.
[RT #21610]
2941. [bug] sdb and sdlz (dlz's zone database) failed to support
DNAME at the zone apex. [RT #21610]
+2940. [port] Remove connection aborted error message on
+ Windows. [RT #21549]
+
+2939. [func] Check that named successfully skips NSEC3 records
+ that fail to match the NSEC3PARAM record currently
+ in use. [RT# 21868]
+
+2938. [bug] When generating signed responses, from a signed zone
+ that uses NSEC3, named would use a uninitialised
+ pointer if it needed to skip a NSEC3 record because
+ it didn't match the selected NSEC3PARAM record for
+ zone. [RT# 21868]
+
+2937. [bug] Worked around an apparent race condition in over
+ memory conditions. Without this fix a DNS cache DB or
+ ADB could incorrectly stay in an over memory state,
+ effectively refusing further caching, which
+ subsequently made a BIND 9 caching server unworkable.
+ This fix prevents this problem from happening by
+ polling the state of the memory context, rather than
+ making a copy of the state, which appeared to cause
+ a race. This is a "workaround" in that it doesn't
+ solve the possible race per se, but several experiments
+ proved this change solves the symptom. Also, the
+ polling overhead hasn't been reported to be an issue.
+ This bug should only affect a caching server that
+ specifies a finite max-cache-size. It's also quite
+ likely that the bug happens only when enabling threads,
+ but it's not confirmed yet. [RT #21818]
+
+2936. [func] Improved configuration syntax and multiple-view
+ support for addzone/delzone feature (see change
+ #2930). Removed "new-zone-file" option, replaced
+ with "allow-new-zones (yes|no)". The new-zone-file
+ for each view is now created automatically, with
+ a filename generated from a hash of the view name.
+ It is no longer necessary to "include" the
+ new-zone-file in named.conf; this happens
+ automatically. Zones that were not added via
+ "rndc addzone" can no longer be removed with
+ "rndc delzone". [RT #19447]
+
2935. [bug] nsupdate: improve 'file not found' error message.
[RT #21871]
@@ -123,6 +410,17 @@
revisit the issue and complete the fix later.
[RT #21710]
+2930. [experimental] New "rndc addzone" and "rndc delzone" commads
+ allow dynamic addition and deletion of zones.
+ To enable this feature, specify a "new-zone-file"
+ option at the view or options level in named.conf.
+ Zone configuration information for the new zones
+ will be written into that file. To make the new
+ zones persist after a restart, "include" the file
+ into named.conf in the appropriate view. (Note:
+ This feature is not yet documented, and its syntax
+ is expected to change.) [RT #19447]
+
2929. [bug] Improved handling of GSS security contexts:
- added LRU expiration for generated TSIGs
- added the ability to use a non-default realm
@@ -132,19 +430,49 @@
smaller)
[RT #19737]
+2928. [bug] Be more selective about the non-authoritative
+ answer we apply change 2748 to. [RT #21594]
+
+2927. [placeholder]
+
+2926. [placeholder]
+h
+2925. [bug] Named failed to accept uncachable negative responses
+ from insecure zones. [RT# 21555]
+
+2924. [func] 'rndc secroots' dump a combined summary of the
+ current managed keys combined with trusted keys.
+ [RT #20904]
+
2923. [bug] 'dig +trace' could drop core after "connection
timeout". [RT #21514]
2922. [contrib] Update zkt to version 1.0.
+2921. [bug] The resolver could attempt to destroy a fetch context
+ too soon. [RT #19878]
+
+2920. [func] Allow 'filter-aaaa-on-v4' to be applied selectively
+ to IPv4 clients. New acl 'filter-aaaa' (default any).
+
+2919. [func] Add autosign-ksk and autosign-zsk virtual time tests.
+ [RT #20840]
+
2918. [maint] Add AAAA address for I.ROOT-SERVERS.NET.
+2917. [func] Virtual time test framework. [RT #20801]
+
2916. [func] Add framework to use IPv6 in tests.
fd92:7065:b8e:ffff::1 ... fd92:7065:b8e:ffff::7
2915. [cleanup] Be smarter about which objects we attempt to compile
based on configure options. [RT #21444]
+2914. [bug] Make the "autosign" system test more portable.
+ [RT #20997]
+
+2913. [func] Add pkcs#11 system tests. [RT #20784]
+
2912. [func] Windows clients don't like UPDATE responses that clear
the zone section. [RT #20986]
@@ -153,9 +481,17 @@
2910. [func] Sanity check Kerberos credentials. [RT #20986]
+2909. [bug] named-checkconf -p could die if "update-policy local;"
+ was specified in named.conf. [RT #21416]
+
2908. [bug] It was possible for re-signing to stop after removing
a DNSKEY. [RT #21384]
+2907. [bug] The export version of libdns had undefined references.
+ [RT #21444]
+
+2906. [bug] Address RFC 5011 implementation issues. [RT #20903]
+
2905. [port] aix: set use_atomic=yes with native compiler.
[RT #21402]
@@ -164,23 +500,55 @@
secure leading to negative proofs failing. This was
a unintended outcome from change 2890. [RT# 21392]
+2903. [bug] managed-keys-directory missing from namedconf.c.
+ [RT #21370]
+
+2902. [func] Add regression test for change 2897. [RT #21040]
+
2901. [port] Use AC_C_FLEXIBLE_ARRAY_MEMBER. [RT #21316]
+2900. [bug] The placeholder negative caching element was not
+ properly constructed triggering a INSIST in
+ dns_ncache_towire(). [RT #21346]
+
2899. [port] win32: Support linking against OpenSSL 1.0.0.
2898. [bug] nslookup leaked memory when -domain=value was
specified. [RT #21301]
+2897. [bug] NSEC3 chains could be left behind when transitioning
+ to insecure. [RT #21040]
+
+2896. [bug] "rndc sign" failed to properly update the zone
+ when adding a DNSKEY for publication only. [RT #21045]
+
+2895. [func] genrandom: add support for the generation of multiple
+ files. [RT #20917]
+
2894. [contrib] DLZ LDAP support now use '$' not '%'. [RT #21294]
+2893. [bug] Improve managed keys support. New named.conf option
+ managed-keys-directory. [RT #20924]
+
+2892. [bug] Handle REVOKED keys better. [RT #20961]
+
2891. [maint] Update empty-zones list to match
draft-ietf-dnsop-default-local-zones-13. [RT# 21099]
+2890. [bug] Handle the introduction of new trusted-keys and
+ DS, DLV RRsets better. [RT #21097]
+
2889. [bug] Elements of the grammar where not properly reported.
[RT #21046]
2888. [bug] Only the first EDNS option was displayed. [RT #21273]
+2887. [bug] Report the keytag times in UTC in the .key file,
+ local time is presented as a comment within the
+ comment. [RT #21223]
+
+2886. [bug] ctime() is not thread safe. [RT #21223]
+
2885. [bug] Improve -fno-strict-aliasing support probing in
configure. [RT #21080]
@@ -196,12 +564,21 @@
2881. [bug] Reduce the amount of time the rbtdb write lock
is held when closing a version. [RT #21198]
+2880. [cleanup] Make the output of dnssec-keygen and dnssec-revoke
+ consistent. [RT #21078]
+
2879. [contrib] DLZ bdbhpt driver fails to close correct cursor.
[RT #21106]
+2878. [func] Incrementally write the master file after performing
+ a AXFR. [RT #21010]
+
2877. [bug] The validator failed to skip obviously mismatching
RRSIGs. [RT #21138]
+2876. [bug] Named could return SERVFAIL for negative responses
+ from unsigned zones. [RT #21131]
+
2875. [bug] dns_time64_fromtext() could accept non digits.
[RT #21033]
@@ -209,8 +586,22 @@
successfully responds to the query using plain DNS.
[RT #20930]
+2873. [bug] Cancelling a dynamic update via the dns/client module
+ could trigger an assertion failure. [RT #21133]
+
+2872. [bug] Modify dns/client.c:dns_client_createx() to only
+ require one of IPv4 or IPv6 rather than both.
+ [RT #21122]
+
+2871. [bug] Type mismatch in mem_api.c between the definition and
+ the header file, causing build failure with
+ --enable-exportlib. [RT #21138]
+
2870. [maint] Add AAAA address for L.ROOT-SERVERS.NET.
+2869. [bug] Fix arguments to dns_keytable_findnextkeynode() call.
+ [RT #20877]
+
2868. [cleanup] Run "make clean" at the end of configure to ensure
any changes made by configure are integrated.
Use --with-make-clean=no to disable. [RT #20994]
@@ -232,6 +623,11 @@
2862. [bug] nsupdate didn't default to the parent zone when
updating DS records. [RT #20896]
+2861. [doc] dnssec-settime man pages didn't correctly document the
+ inactivation time. [RT #21039]
+
+2860. [bug] named-checkconf's usage was out of date. [RT #21039]
+
2859. [bug] When cancelling validation it was possible to leak
memory. [RT #20800]
@@ -244,173 +640,244 @@
2856. [bug] The size of a memory allocation was not always properly
recorded. [RT #20927]
-2853. [bug] add_sigs() could run out of scratch space. [RT #21015]
-
-2851. [doc] nslookup.1, removed <informalexample> from the docbook
- source as it produced bad nroff. [RT #21007]
-
- --- 9.6-ESV-R3 released ---
-
-2972. [bug] win32: address windows socket errors. [RT #21906]
-
-2971. [bug] Fixed a bug that caused journal files not to be
- compacted on Windows systems as a result of
- non-POSIX-compliant rename() semantics. [RT #22434]
-
-2970. [security] Adding a NO DATA negative cache entry failed to clear
- any matching RRSIG records. A subsequent lookup of
- of NO DATA cache entry could trigger a INSIST when the
- unexpected RRSIG was also returned with the NO DATA
- cache entry.
-
- CVE-2010-3613, VU#706148. [RT #22288]
-
-2969. [security] Fix acl type processing so that allow-query works
- in options and view statements. Also add a new
- set of tests to verify proper functioning.
-
- CVE-2010-3615, VU#510208. [RT #22418]
+2855. [func] nsupdate will now preserve the entered case of domain
+ names in update requests it sends. [RT #20928]
-2968. [security] Named could fail to prove a data set was insecure
- before marking it as insecure. One set of conditions
- that can trigger this occurs naturally when rolling
- DNSKEY algorithms.
+2854. [func] dig: allow the final soa record in a axfr response to
+ be suppressed, dig +onesoa. [RT #20929]
- CVE-2010-3614, VU#837744. [RT #22309]
-
-2967. [bug] 'host -D' now turns on debugging messages earlier.
- [RT #22361]
-
-2966. [bug] isc_print_vsnprintf() failed to check if there was
- space available in the buffer when adding a left
- justified character with a non zero width,
- (e.g. "%-1c"). [RT #22270]
-
-2964. [bug] view->queryacl was being overloaded. Seperate the
- usage into view->queryacl, view->cacheacl and
- view->queryonacl. [RT #22114]
-
-2962. [port] win32: add more dependencies to BINDBuild.dsw.
- [RT #22062]
-
-2952. [port] win32: named-checkzone and named-checkconf failed
- to initialise winsock. [RT #21932]
+2853. [bug] add_sigs() could run out of scratch space. [RT #21015]
-2951. [bug] named failed to generate a correct signed response
- in a optout, delegation only zone with no secure
- delegations. [RT #22007]
+2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619]
- --- 9.6-ESV-R2 released ---
+2851. [doc] nslookup.1, removed <informalexample> from the docbook
+ source as it produced bad nroff. [RT #21007]
-2939. [func] Check that named successfully skips NSEC3 records
- that fail to match the NSEC3PARAM record currently
- in use. [RT# 21868]
+2850. [bug] If isc_heap_insert() failed due to memory shortage
+ the heap would have corrupted entries. [RT #20951]
-2937. [bug] Worked around an apparent race condition in over
- memory conditions. Without this fix a DNS cache DB or
- ADB could incorrectly stay in an over memory state,
- effectively refusing further caching, which
- subsequently made a BIND 9 caching server unworkable.
- This fix prevents this problem from happening by
- polling the state of the memory context, rather than
- making a copy of the state, which appeared to cause
- a race. This is a "workaround" in that it doesn't
- solve the possible race per se, but several experiments
- proved this change solves the symptom. Also, the
- polling overhead hasn't been reported to be an issue.
- This bug should only affect a caching server that
- specifies a finite max-cache-size. It's also quite
- likely that the bug happens only when enabling threads,
- but it's not confirmed yet. [RT #21818]
+2849. [bug] Don't treat errors from the xml2 library as fatal.
+ [RT #20945]
-2925. [bug] Named failed to accept uncachable negative responses
- from insecure zones. [RT# 21555]
+2848. [doc] Moved README.dnssec, README.libdns, README.pkcs11 and
+ README.rfc5011 into the ARM. [RT #20899]
-2921. [bug] The resolver could attempt to destroy a fetch context
- too soon. [RT #19878]
+2847. [cleanup] Corrected usage message in dnssec-settime. [RT #20921]
-2900. [bug] The placeholder negative caching element was not
- properly constructed triggering a INSIST in
- dns_ncache_towire(). [RT #21346]
+2846. [bug] EOF on unix domain sockets was not being handled
+ correctly. [RT #20731]
-2890. [bug] Handle the introduction of new trusted-keys and
- DS, DLV RRsets better. [RT #21097]
+2845. [bug] RFC 5011 client could crash on shutdown. [RT #20903]
-2869. [bug] Fix arguments to dns_keytable_findnextkeynode() call.
- [RT #20877]
+2844. [doc] notify-delay default in ARM was wrong. It should have
+ been five (5) seconds.
- --- 9.6-ESV-R1 released ---
+2843. [func] Prevent dnssec-keygen and dnssec-keyfromlabel from
+ creating key files if there is a chance that the new
+ key ID will collide with an existing one after
+ either of the keys has been revoked. (To override
+ this in the case of dnssec-keyfromlabel, use the -y
+ option. dnssec-keygen will simply create a
+ different, non-colliding key, so an override is
+ not necessary.) [RT #20838]
-2876. [bug] Named could return SERVFAIL for negative responses
- from unsigned zones. [RT #21131]
+2842. [func] Added "smartsign" and improved "autosign" and
+ "dnssec" regression tests. [RT #20865]
- --- 9.6-ESV released ---
+2841. [bug] Change 2836 was not complete. [RT #20883]
-2852. [bug] Handle broken DNSSEC trust chains better. [RT #15619]
+2840. [bug] Temporary fixed pkcs11-destroy usage check.
+ [RT #20760]
- --- 9.6.2 released ---
+2839. [bug] A KSK revoked by named could not be deleted.
+ [RT #20881]
-2850. [bug] If isc_heap_insert() failed due to memory shortage
- the heap would have corrupted entries. [RT #20951]
+2838. [placeholder]
-2849. [bug] Don't treat errors from the xml2 library as fatal.
- [RT #20945]
+2837. [port] Prevent Linux spurious warnings about fwrite().
+ [RT #20812]
-2846. [bug] EOF on unix domain sockets was not being handled
- correctly. [RT #20731]
+2836. [bug] Keys that were scheduled to become active could
+ be delayed. [RT #20874]
-2844. [doc] notify-delay default in ARM was wrong. It should have
- been five (5) seconds.
+2835. [bug] Key inactivity dates were inadvertently stored in
+ the private key file with the outdated tag
+ "Unpublish" rather than "Inactive". This has been
+ fixed; however, any existing keys that had Inactive
+ dates set will now need to have them reset, using
+ 'dnssec-settime -I'. [RT #20868]
- --- 9.6.2rc1 released ---
+2834. [bug] HMAC-SHA* keys that were longer than the algorithm
+ digest length were used incorrectly, leading to
+ interoperability problems with other DNS
+ implementations. This has been corrected.
+ (Note: If an oversize key is in use, and
+ compatibility is needed with an older release of
+ BIND, the new tool "isc-hmac-fixup" can convert
+ the key secret to a form that will work with all
+ versions.) [RT #20751]
-2838. [func] Backport support for SHA-2 DNSSEC algorithms,
- RSASHA256 and RSASHA512, from BIND 9.7. (This
- incorporates changes 2726 and 2738 from that
- release branch.) [RT #20871]
+2833. [cleanup] Fix usage messages in dnssec-keygen and dnssec-settime.
+ [RT #20851]
-2837. [port] Prevent Linux spurious warnings about fwrite().
- [RT #20812]
+2832. [bug] Modify "struct stat" in lib/export/samples/nsprobe.c
+ to avoid redefinition in some OSs [RT 20831]
2831. [security] Do not attempt to validate or cache
out-of-bailiwick data returned with a secure
answer; it must be re-fetched from its original
source and validated in that context. [RT #20819]
+2830. [bug] Changing the OPTOUT setting could take multiple
+ passes. [RT #20813]
+
+2829. [bug] Fixed potential node inconsistency in rbtdb.c.
+ [RT #20808]
+
2828. [security] Cached CNAME or DNAME RR could be returned to clients
without DNSSEC validation. [RT #20737]
2827. [security] Bogus NXDOMAIN could be cached as if valid. [RT #20712]
+2826. [bug] NSEC3->NSEC transitions could fail due to a lock not
+ being released. [RT #20740]
+
2825. [bug] Changing the setting of OPTOUT in a NSEC3 chain that
was in the process of being created was not properly
recorded in the zone. [RT #20786]
+2824. [bug] "rndc sign" was not being run by the correct task.
+ [RT #20759]
+
2823. [bug] rbtdb.c:getsigningtime() was missing locks. [RT #20781]
+2822. [bug] rbtdb.c:loadnode() could return the wrong result.
+ [RT #20802]
+
+2821. [doc] Add note that named-checkconf doesn't automatically
+ read rndc.key and bind.keys [RT #20758]
+
+2820. [func] Handle read access failure of OpenSSL configuration
+ file more user friendly (PKCS#11 engine patch).
+ [RT #20668]
+
2819. [cleanup] Removed unnecessary DNS_POINTER_MAXHOPS define.
[RT #20771]
2818. [cleanup] rndc could return an incorrect error code
when a zone was not found. [RT #20767]
+2817. [cleanup] Removed unnecessary isc_task_endexclusive() calls.
+ [RT #20768]
+
+2816. [bug] previous_closest_nsec() could fail to return
+ data for NSEC3 nodes [RT #29730]
+
2815. [bug] Exclusively lock the task when freezing a zone.
[RT #19838]
2814. [func] Provide a definitive error message when a master
zone is not loaded. [RT #20757]
- --- 9.6.2b1 released ---
+2813. [bug] Better handling of unreadable DNSSEC key files.
+ [RT #20710]
+
+2812. [bug] Make sure updates can't result in a zone with
+ NSEC-only keys and NSEC3 records. [RT 20748]
+
+2811. [cleanup] Add "rndc sign" to list of commands in rndc usage
+ output. [RT #20733]
+
+2810. [doc] Clarified the process of transitioning an NSEC3 zone
+ to insecure. [RT #20746]
+
+2809. [cleanup] Restored accidentally-deleted text in usage output
+ in dnssec-settime and dnssec-revoke [RT #20739]
+
+2808. [bug] Remove the attempt to install atomic.h from lib/isc.
+ atomic.h is correctly installed by the architecture
+ specific subdirectories. [RT #20722]
+
+2807. [bug] Fixed a possible ASSERT when reconfiguring zone
+ keys. [RT #20720]
+
+ --- 9.7.0rc1 released ---
+
+2806. [bug] "rdnc sign" could delay re-signing the DNSKEY
+ when it had changed. [RT #20703]
+
+2805. [bug] Fixed namespace problems encountered when building
+ external programs using non-exported BIND9 libraries
+ (i.e., built without --enable-exportlib). [RT #20679]
+
+2804. [bug] Send notifies when a zone is signed with "rndc sign"
+ or as a result of a scheduled key change. [RT #20700]
+
+2803. [port] win32: Install named-journalprint, nsec3hash, arpaname
+ and genrandom under windows. [RT #20670]
+
+2802. [cleanup] Rename journalprint to named-journalprint. [RT #20670]
+
+2801. [func] Detect and report records that are different according
+ to DNSSEC but are semantically equal according to plain
+ DNS. Apply plain DNS comparisons rather than DNSSEC
+ comparisons when processing UPDATE requests.
+ dnssec-signzone now removes such semantically duplicate
+ records prior to signing the RRset.
+
+ named-checkzone -r {ignore|warn|fail} (default warn)
+ named-compilezone -r {ignore|warn|fail} (default warn)
+
+ named.conf: check-dup-records {ignore|warn|fail};
+
+2800. [func] Reject zones which have NS records which refer to
+ CNAMEs, DNAMEs or don't have address record (class IN
+ only). Reject UPDATEs which would cause the zone
+ to fail the above checks if committed. [RT #20678]
+
+2799. [cleanup] Changed the "secure-to-insecure" option to
+ "dnssec-secure-to-insecure", and "dnskey-ksk-only"
+ to "dnssec-dnskey-kskonly", for clarity. [RT #20586]
+
+2798. [bug] Addressed bugs in managed-keys initialization
+ and rollover. [RT #20683]
2797. [bug] Don't decrement the dispatch manager's maxbuffers.
[RT #20613]
+2796. [bug] Missing dns_rdataset_disassociate() call in
+ dns_nsec3_delnsec3sx(). [RT #20681]
+
+2795. [cleanup] Add text to differentiate "update with no effect"
+ log messages. [RT #18889]
+
+2794. [bug] Install <isc/namespace.h>. [RT #20677]
+
+2793. [func] Add "autosign" and "metadata" tests to the
+ automatic tests. [RT #19946]
+
+2792. [func] "filter-aaaa-on-v4" can now be set in view
+ options (if compiled in). [RT #20635]
+
+2791. [bug] The installation of isc-config.sh was broken.
+ [RT #20667]
+
2790. [bug] Handle DS queries to stub zones. [RT #20440]
2789. [bug] Fixed an INSIST in dispatch.c [RT #20576]
+2788. [bug] dnssec-signzone could sign with keys that were
+ not requested [RT #20625]
+
+2787. [bug] Spurious log message when zone keys were
+ dynamically reconfigured. [RT #20659]
+
2786. [bug] Additional could be promoted to answer. [RT #20663]
+ --- 9.7.0b3 released ---
+
+2785. [bug] Revoked keys could fail to self-sign [RT #20652]
+
2784. [bug] TC was not always being set when required glue was
dropped. [RT #20655]
@@ -420,15 +887,65 @@
2782. [port] win32: use getaddrinfo() for hostname lookups.
[RT #20650]
+2781. [bug] Inactive keys could be used for signing. [RT #20649]
+
+2780. [bug] dnssec-keygen -A none didn't properly unset the
+ activation date in all cases. [RT #20648]
+
+2779. [bug] Dynamic key revocation could fail. [RT #20644]
+
+2778. [bug] dnssec-signzone could fail when a key was revoked
+ without deleting the unrevoked version. [RT #20638]
+
2777. [contrib] DLZ MYSQL auto reconnect support discovery was wrong.
+2776. [bug] Change #2762 was not correct. [RT #20647]
+
+2775. [bug] Accept RSASHA256 and RSASHA512 as NSEC3 compatible
+ in dnssec-keyfromlabel. [RT #20643]
+
+2774. [bug] Existing cache DB wasn't being reused after
+ reconfiguration. [RT #20629]
+
+2773. [bug] In autosigned zones, the SOA could be signed
+ with the KSK. [RT #20628]
+
2772. [security] When validating, track whether pending data was from
the additional section or not and only return it if
validates as secure. [RT #20438]
+2771. [bug] dnssec-signzone: DNSKEY records could be
+ corrupted when importing from key files [RT #20624]
+
+2770. [cleanup] Add log messages to resolver.c to indicate events
+ causing FORMERR responses. [RT #20526]
+
+2769. [cleanup] Change #2742 was incomplete. [RT #19589]
+
+2768. [bug] dnssec-signzone: -S no longer implies -g [RT #20568]
+
+2767. [bug] named could crash on startup if a zone was
+ configured with auto-dnssec and there was no
+ key-directory. [RT #20615]
+
+2766. [bug] isc_socket_fdwatchpoke() should only update the
+ socketmgr state if the socket is not pending on a
+ read or write. [RT #20603]
+
2765. [bug] Skip masters for which the TSIG key cannot be found.
[RT #20595]
+2764. [bug] "rndc-confgen -a" could trigger a REQUIRE. [RT #20610]
+
+2763. [bug] "rndc sign" didn't create an NSEC chain. [RT #20591]
+
+2762. [bug] DLV validation failed with a local slave DLV zone.
+ [RT #20577]
+
+2761. [cleanup] Enable internal symbol table for backtrace only for
+ systems that are known to work. Currently, BSD
+ variants, Linux and Solaris are supported. [RT# 20202]
+
2760. [cleanup] Corrected named-compilezone usage summary. [RT #20533]
2759. [doc] Add information about .jbk/.jnw files to
@@ -441,27 +958,115 @@
2757. [bug] dig: assertion failure could occur in connect
timeout. [RT #20599]
-2755. [doc] Clarify documentation of keyset- files in
- dnssec-signzone man page. [RT #19810]
+2756. [bug] Fixed corrupt logfile message in update.c. [RT# 20597]
+
+2755. [placeholder]
2754. [bug] Secure-to-insecure transitions failed when zone
was signed with NSEC3. [RT #20587]
+2753. [bug] Removed an unnecessary warning that could appear when
+ building an NSEC chain. [RT #20589]
+
+2752. [bug] Locking violation. [RT #20587]
+
+2751. [bug] Fixed a memory leak in dnssec-keyfromlabel. [RT #20588]
+
2750. [bug] dig: assertion failure could occur when a server
didn't have an address. [RT #20579]
2749. [bug] ixfr-from-differences generated a non-minimal ixfr
for NSEC3 signed zones. [RT #20452]
+2748. [func] Identify bad answers from GTLD servers and treat them
+ as referrals. [RT #18884]
+
2747. [bug] Journal roll forwards failed to set the re-signing
time of RRSIGs correctly. [RT #20541]
+2746. [port] hpux: address signed/unsigned expansion mismatch of
+ dns_rbtnode_t.nsec. [RT #20542]
+
+2745. [bug] configure script didn't probe the return type of
+ gai_strerror(3) correctly. [RT #20573]
+
+2744. [func] Log if a query was over TCP. [RT #19961]
+
2743. [bug] RRSIG could be incorrectly set in the NSEC3 record
for a insecure delegation.
+ --- 9.7.0b2 released ---
+
+2742. [cleanup] Clarify some DNSSEC-related log messages in
+ validator.c. [RT #19589]
+
+2741. [func] Allow the dnssec-keygen progress messages to be
+ suppressed (dnssec-keygen -q). Automatically
+ suppress the progress messages when stdin is not
+ a tty. [RT #20474]
+
+2740. [placeholder]
+
+2739. [cleanup] Clean up API for initializing and clearing trust
+ anchors for a view. [RT #20211]
+
+2738. [func] Add RSASHA256 and RSASHA512 tests to the dnssec system
+ test. [RT #20453]
+
+2737. [func] UPDATE requests can leak existence information.
+ [RT #17261]
+
+2736. [func] Improve the performance of NSEC signed zones with
+ more than a normal amount of glue below a delegation.
+ [RT #20191]
+
+2735. [bug] dnssec-signzone could fail to read keys
+ that were specified on the command line with
+ full paths, but weren't in the current
+ directory. [RT #20421]
+
+2734. [port] cygwin: arpaname did not compile. [RT #20473]
+
+2733. [cleanup] Clean up coding style in pkcs11-* tools. [RT #20355]
+
+2732. [func] Add optional filter-aaaa-on-v4 option, available
+ if built with './configure --enable-filter-aaaa'.
+ Filters out AAAA answers to clients connecting
+ via IPv4. (This is NOT recommended for general
+ use.) [RT #20339]
+
+2731. [func] Additional work on change 2709. The key parser
+ will now ignore unrecognized fields when the
+ minor version number of the private key format
+ has been increased. It will reject any key with
+ the major version number increased. [RT #20310]
+
+2730. [func] Have dnssec-keygen display a progress indication
+ a la 'openssl genrsa' on standard error. Note
+ when the first '.' is followed by a long stop
+ one has the choice between slow generation vs.
+ poor random quality, i.e., '-r /dev/urandom'.
+ [RT #20284]
+
2729. [func] When constructing a CNAME from a DNAME use the DNAME
TTL. [RT #20451]
+2728. [bug] dnssec-keygen, dnssec-keyfromlabel and
+ dnssec-signzone now warn immediately if asked to
+ write into a nonexistent directory. [RT #20278]
+
+2727. [func] The 'key-directory' option can now specify a relative
+ path. [RT #20154]
+
+2726. [func] Added support for SHA-2 DNSSEC algorithms,
+ RSASHA256 and RSASHA512. [RT #20023]
+
+2725. [doc] Added information about the file "managed-keys.bind"
+ to the ARM. [RT #20235]
+
+2724. [bug] Updates to a existing node in secure zone using NSEC
+ were failing. [RT #20448]
+
2723. [bug] isc_base32_totext(), isc_base32hex_totext(), and
isc_base64_totext(), didn't always mark regions of
memory as fully consumed after conversion. [RT #20445]
@@ -473,11 +1078,24 @@
2721. [port] Have dst__entropy_status() prime the random number
generator. [RT #20369]
+2720. [bug] RFC 5011 trust anchor updates could trigger an
+ assert if the DNSKEY record was unsigned. [RT #20406]
+
+2719. [func] Skip trusted/managed keys for unsupported algorithms.
+ [RT #20392]
+
2718. [bug] The space calculations in opensslrsa_todns() were
incorrect. [RT #20394]
+2717. [bug] named failed to update the NSEC/NSEC3 record when
+ the last private type record was removed as a result
+ of completing the signing the zone with a key.
+ [RT #20399]
+
2716. [bug] nslookup debug mode didn't return the ttl. [RT #20414]
+ --- 9.7.0b1 released ---
+
2715. [bug] Require OpenSSL support to be explicitly disabled.
[RT #20288]
@@ -487,19 +1105,63 @@
2713. [bug] powerpc: atomic operations missing asm("ics") /
__isync() calls.
+2712. [func] New 'auto-dnssec' zone option allows zone signing
+ to be fully automated in zones configured for
+ dynamic DNS. 'auto-dnssec allow;' permits a zone
+ to be signed by creating keys for it in the
+ key-directory and using 'rndc sign <zone>'.
+ 'auto-dnssec maintain;' allows that too, plus it
+ also keeps the zone's DNSSEC keys up to date
+ according to their timing metadata. [RT #19943]
+
+2711. [port] win32: Add the bin/pkcs11 tools into the full
+ build. [RT #20372]
+
+2710. [func] New 'dnssec-signzone -x' flag and 'dnskey-ksk-only'
+ zone option cause a zone to be signed with only KSKs
+ signing the DNSKEY RRset, not ZSKs. This reduces
+ the size of a DNSKEY answer. [RT #20340]
+
+2709. [func] Added some data fields, currently unused, to the
+ private key file format, to allow implementation
+ of explicit key rollover in a future release
+ without impairing backward or forward compatibility.
+ [RT #20310]
+
+2708. [func] Insecure to secure and NSEC3 parameter changes via
+ update are now fully supported and no longer require
+ defines to enable. We now no longer overload the
+ NSEC3PARAM flag field, nor the NSEC OPT bit at the
+ apex. Secure to insecure changes are controlled by
+ by the named.conf option 'secure-to-insecure'.
+
+ Warning: If you had previously enabled support by
+ adding defines at compile time to BIND 9.6 you should
+ ensure that all changes that are in progress have
+ completed prior to upgrading to BIND 9.7. BIND 9.7
+ is not backwards compatible.
+
+2707. [func] dnssec-keyfromlabel no longer require engine name
+ to be specified in the label if there is a default
+ engine or the -E option has been used. Also, it
+ now uses default algorithms as dnssec-keygen does
+ (i.e., RSASHA1, or NSEC3RSASHA1 if -3 is used).
+ [RT #20371]
+
2706. [bug] Loading a zone with a very large NSEC3 salt could
trigger an assert. [RT #20368]
-2705. [bug] Reconcile the XML stats version number with a later
- BIND9 release, by adding a "name" attribute to
- "cache" elements and increasing the version number
- to 2.2. (This is a minor version change, but may
- affect XML parsers if they assume the cache element
- doesn't take an attribute.)
+2705. [placeholder]
2704. [bug] Serial of dynamic and stub zones could be inconsistent
with their SOA serial. [RT #19387]
+2703. [func] Introduce an OpenSSL "engine" argument with -E
+ for all binaries which can take benefit of
+ crypto hardware. [RT #20230]
+
+2702. [func] Update PKCS#11 tools (bin/pkcs11) [RT #20225 & all]
+
2701. [doc] Correction to ARM: hmac-md5 is no longer the only
supported TSIG key algorithm. [RT #18046]
@@ -508,6 +1170,8 @@
2699. [bug] Missing lock in rbtdb.c. [RT #20037]
+2698. [placeholder]
+
2697. [port] win32: ensure that S_IFMT, S_IFDIR, S_IFCHR and
S_IFREG are defined after including <isc/stat.h>.
[RT #20309]
@@ -515,8 +1179,25 @@
2696. [bug] named failed to successfully process some valid
acl constructs. [RT #20308]
+2695. [func] DHCP/DDNS - update fdwatch code for use by
+ DHCP. Modify the api to isc_sockfdwatch_t (the
+ callback functon for isc_socket_fdwatchcreate)
+ to include information about the direction (read
+ or write) and add isc_socket_fdwatchpoke.
+ [RT #20253]
+
+2694. [bug] Reduce default NSEC3 iterations from 100 to 10.
+ [RT #19970]
+
+2693. [port] Add some noreturn attributes. [RT #20257]
+
2692. [port] win32: 32/64 bit cleanups. [RT #20335]
+2691. [func] dnssec-signzone: retain the existing NSEC or NSEC3
+ chain when re-signing a previously-signed zone.
+ Use -u to modify NSEC3 parameters or switch
+ between NSEC and NSEC3. [RT #20304]
+
2690. [bug] win32: fix isc_thread_key_getspecific() prototype.
[RT #20315]
@@ -525,25 +1206,102 @@
2688. [bug] Use INTERFACE_F_POINTTOPOINT, not IFF_POINTOPOINT,
to decide to fetch the destination address. [RT #20305]
+2687. [bug] Fixed dnssec-signzone -S handling of revoked keys.
+ Also, added warnings when revoking a ZSK, as this is
+ not defined by protocol (but is legal). [RT #19943]
+
2686. [bug] dnssec-signzone should clean the old NSEC chain when
signing with NSEC3 and vice versa. [RT #20301]
+2685. [contrib] Update contrib/zkt to version 0.99c. [RT #20054]
+
+2684. [cleanup] dig: formalize +ad and +cd as synonyms for
+ +adflag and +cdflag. [RT #19305]
+
2683. [bug] dnssec-signzone should clean out old NSEC3 chains when
the NSEC3 parameters used to sign the zone change.
[RT #20246]
+2682. [bug] "configure --enable-symtable=all" failed to
+ build. [RT #20282]
+
2681. [bug] IPSECKEY RR of gateway type 3 was not correctly
decoded. [RT #20269]
+2680. [func] Move contrib/pkcs11-keygen to bin/pkcs11. [RT #20067]
+
+2679. [func] dig -k can now accept TSIG keys in named.conf
+ format. [RT #20031]
+
2678. [func] Treat DS queries as if "minimal-response yes;"
was set. [RT #20258]
+2677. [func] Changes to key metadata behavior:
+ - Keys without "publish" or "active" dates set will
+ no longer be used for smart signing. However,
+ those dates will be set to "now" by default when
+ a key is created; to generate a key but not use
+ it yet, use dnssec-keygen -G.
+ - New "inactive" date (dnssec-keygen/settime -I)
+ sets the time when a key is no longer used for
+ signing but is still published.
+ - The "unpublished" date (-U) is deprecated in
+ favour of "deleted" (-D).
+ [RT #20247]
+
+2676. [bug] --with-export-installdir should have been
+ --with-export-includedir. [RT #20252]
+
+2675. [bug] dnssec-signzone could crash if the key directory
+ did not exist. [RT #20232]
+
+ --- 9.7.0a3 released ---
+
+2674. [bug] "dnssec-lookaside auto;" crashed if named was built
+ without openssl. [RT #20231]
+
+2673. [bug] The managed-keys.bind zone file could fail to
+ load due to a spurious result from sync_keyzone()
+ [RT #20045]
+
2672. [bug] Don't enable searching in 'host' when doing reverse
lookups. [RT #20218]
+2671. [bug] Add support for PKCS#11 providers not returning
+ the public exponent in RSA private keys
+ (OpenCryptoki for instance) in
+ dnssec-keyfromlabel. [RT #19294]
+
2670. [bug] Unexpected connect failures failed to log enough
information to be useful. [RT #20205]
+2669. [func] Update PKCS#11 support to support Keyper HSM.
+ Update PKCS#11 patch to be against openssl-0.9.8i.
+
+2668. [func] Several improvements to dnssec-* tools, including:
+ - dnssec-keygen and dnssec-settime can now set key
+ metadata fields 0 (to unset a value, use "none")
+ - dnssec-revoke sets the revocation date in
+ addition to the revoke bit
+ - dnssec-settime can now print individual metadata
+ fields instead of always printing all of them,
+ and can print them in unix epoch time format for
+ use by scripts
+ [RT #19942]
+
+2667. [func] Add support for logging stack backtrace on assertion
+ failure (not available for all platforms). [RT #19780]
+
+2666. [func] Added an 'options' argument to dns_name_fromstring()
+ (API change from 9.7.0a2). [RT #20196]
+
+2665. [func] Clarify syntax for managed-keys {} statement, add
+ ARM documentation about RFC 5011 support. [RT #19874]
+
+2664. [bug] create_keydata() and minimal_update() in zone.c
+ didn't properly check return values for some
+ functions. [RT #19956]
+
2663. [func] win32: allow named to run as a service using
"NT AUTHORITY\LocalService" as the account. [RT #19977]
@@ -554,19 +1312,40 @@
2661. [bug] Check whether socket fd exceeds FD_SETSIZE when
creating lwres context. [RT #20029]
+2660. [func] Add a new set of DNS libraries for non-BIND9
+ applications. See README.libdns. [RT #19369]
+
2659. [doc] Clarify dnssec-keygen doc: key name must match zone
name for DNSSEC keys. [RT #19938]
+2658. [bug] dnssec-settime and dnssec-revoke didn't process
+ key file paths correctly. [RT #20078]
+
+2657. [cleanup] Lower "journal file <path> does not exist, creating it"
+ log level to debug 1. [RT #20058]
+
2656. [func] win32: add a "tools only" check box to the installer
which causes it to only install dig, host, nslookup,
nsupdate and relevant DLLs. [RT #19998]
2655. [doc] Document that key-directory does not affect
- rndc.key. [RT #20155]
+ bind.keys, rndc.key or session.key. [RT #20155]
+
+2654. [bug] Improve error reporting on duplicated names for
+ deny-answer-xxx. [RT #20164]
2653. [bug] Treat ENGINE_load_private_key() failures as key
not found rather than out of memory. [RT #18033]
+2652. [func] Provide more detail about what record is being
+ deleted. [RT #20061]
+
+2651. [bug] Dates could print incorrectly in K*.key files on
+ 64-bit systems. [RT #20076]
+
+2650. [bug] Assertion failure in dnssec-signzone when trying
+ to read keyset-* files. [RT #20075]
+
2649. [bug] Set the domain for forward only zones. [RT #19944]
2648. [port] win32: isc_time_seconds() was broken. [RT #19900]
@@ -579,37 +1358,99 @@
2645. [port] "gcc -m32" didn't work on amd64 and x86_64 platforms
which default to 64 bits. [RT #19927]
+ --- 9.7.0a2 released ---
+
+2644. [bug] Change #2628 caused a regression on some systems;
+ named was unable to write the PID file and would
+ fail on startup. [RT #20001]
+
2643. [bug] Stub zones interacted badly with NSEC3 support.
[RT #19777]
2642. [bug] nsupdate could dump core on solaris when reading
improperly formatted key files. [RT #20015]
+2641. [bug] Fixed an error in parsing update-policy syntax,
+ added a regression test to check it. [RT #20007]
+
2640. [security] A specially crafted update packet will cause named
to exit. [RT #20000]
2639. [bug] Silence compiler warnings in gssapi code. [RT #19954]
+2638. [bug] Install arpaname. [RT #19957]
+
2637. [func] Rationalize dnssec-signzone's signwithkey() calling.
[RT #19959]
+2636. [func] Simplify zone signing and key maintenance with the
+ dnssec-* tools. Major changes:
+ - all dnssec-* tools now take a -K option to
+ specify a directory in which key files will be
+ stored
+ - DNSSEC can now store metadata indicating when
+ they are scheduled to be published, activated,
+ revoked or removed; these values can be set by
+ dnssec-keygen or overwritten by the new
+ dnssec-settime command
+ - dnssec-signzone -S (for "smart") option reads key
+ metadata and uses it to determine automatically
+ which keys to publish to the zone, use for
+ signing, revoke, or remove from the zone
+ [RT #19816]
+
2635. [bug] isc_inet_ntop() incorrectly handled 0.0/16 addresses.
[RT #19716]
+2634. [port] win32: Add support for libxml2, enable
+ statschannel. [RT #19773]
+
2633. [bug] Handle 15 bit rand() functions. [RT #19783]
2632. [func] util/kit.sh: warn if documentation appears to be out of
date. [RT #19922]
+2631. [bug] Handle "//", "/./" and "/../" in mkdirpath().
+ [RT #19926 ]
+
+2630. [func] Improved syntax for DDNS autoconfiguration: use
+ "update-policy local;" to switch on local DDNS in a
+ zone. (The "ddns-autoconf" option has been removed.)
+ [RT #19875]
+
+2629. [port] Check for seteuid()/setegid(), use setresuid()/
+ setresgid() if not present. [RT #19932]
+
+2628. [port] linux: Allow /var/run/named/named.pid to be opened
+ at startup with reduced capabilities in operation.
+ [RT #19884]
+
+2627. [bug] Named aborted if the same key was included in
+ trusted-keys more than once. [RT #19918]
+
+2626. [bug] Multiple trusted-keys could trigger an assertion
+ failure. [RT #19914]
+
2625. [bug] Missing UNLOCK in rbtdb.c. [RT #19865]
-2623. [bug] Named started seaches for DS non-optimally. [RT #19915]
+2624. [func] 'named-checkconf -p' will print out the parsed
+ configuration. [RT #18871]
+
+2623. [bug] Named started searches for DS non-optimally. [RT #19915]
+
+2622. [bug] Printing of named.conf grammar was broken. [RT #19919]
-2621. [doc] Made copyright boilterplate consistent. [RT #19833]
+2621. [doc] Made copyright boilerplate consistent. [RT #19833]
2620. [bug] Delay thawing the zone until the reload of it has
completed successfully. [RT #19750]
+2619. [func] Add support for RFC 5011, automatic trust anchor
+ maintenance. The new "managed-keys" statement can
+ be used in place of "trusted-keys" for zones which
+ support this protocol. (Note: this syntax is
+ expected to change prior to 9.7.0 final.) [RT #19248]
+
2618. [bug] The sdb and sdlz db_interator_seek() methods could
loop infinitely. [RT #19847]
@@ -625,11 +1466,33 @@
2614. [port] win32: 'named -v' should automatically be executed
in the foreground. [RT #19844]
-2613. [bug] Option argument validation was missing for
- dnssec-dsfromkey. [RT #19828]
+2613. [placeholder]
+
+ --- 9.7.0a1 released ---
+
+2612. [func] Add default values for the arguments to
+ dnssec-keygen. Without arguments, it will now
+ generate a 1024-bit RSASHA1 zone-signing key,
+ or with the -f KSK option, a 2048-bit RSASHA1
+ key-signing key. [RT #19300]
+
+2611. [func] Add -l option to dnssec-dsfromkey to generate
+ DLV records instead of DS records. [RT #19300]
2610. [port] sunos: Change #2363 was not complete. [RT #19796]
+2609. [func] Simplify the configuration of dynamic zones:
+ - add ddns-confgen command to generate
+ configuration text for named.conf
+ - add zone option "ddns-autoconf yes;", which
+ causes named to generate a TSIG session key
+ and allow updates to the zone using that key
+ - add '-l' (localhost) option to nsupdate, which
+ causes nsupdate to connect to a locally-running
+ named process using the session key generated
+ by named
+ [RT #19284]
+
2608. [func] Perform post signing verification checks in
dnssec-signzone. These can be disabled with -P.
@@ -639,27 +1502,6 @@
self signed. That all records in the zone are signed
by the algorithm. [RT #19653]
-2601. [doc] Mention file creation mode mask in the
- named manual page.
-
-2593. [bug] Improve a corner source of SERVFAILs [RT #19632]
-
-2589. [bug] dns_db_unregister() failed to clear '*dbimp'.
- [RT #19626]
-
-2581. [contrib] dlz/mysql set MYSQL_OPT_RECONNECT option on connection.
- Requires MySQL 5.0.19 or later. [RT #19084]
-
-2580. [bug] UpdateRej statistics counter could be incremented twice
- for one rejection. [RT #19476]
-
-2533. [doc] ARM: document @ (at-sign). [RT #17144]
-
-2500. [contrib] contrib/sdb/pgsql/zonetodb.c called non-existent
- function. [RT #18582]
-
- --- 9.6.1 released ---
-
2607. [bug] named could incorrectly delete NSEC3 records for
empty nodes when processing a update request.
[RT #19749]
@@ -670,6 +1512,11 @@
2605. [bug] Accept DS responses from delegation only zones.
[RT # 19296]
+2604. [func] Add support for DNS rebinding attack prevention through
+ new options, deny-answer-addresses and
+ deny-answer-aliases. Based on contributed code from
+ JD Nurmi, Google. [RT #18192]
+
2603. [port] win32: handle .exe extension of named-checkzone and
named-comilezone argv[0] names under windows.
[RT #19767]
@@ -677,11 +1524,17 @@
2602. [port] win32: fix debugging command line build of libisccfg.
[RT #19767]
- --- 9.6.1rc1 released ---
+2601. [doc] Mention file creation mode mask in the
+ named manual page.
+
+2600. [doc] ARM: miscellaneous reformatting for different
+ page widths. [RT #19574]
2599. [bug] Address rapid memory growth when validation fails.
[RT #19654]
+2598. [func] Reserve the -F flag. [RT #19657]
+
2597. [bug] Handle a validation failure with a insecure delegation
from a NSEC3 signed master/slave zone. [RT #19464]
@@ -691,16 +1544,31 @@
2595. [bug] Fix unknown extended rcodes in dig. [RT #19625]
+2594. [func] Have rndc warn if using its default configuration
+ file when the key file also exists. [RT #19424]
+
+2593. [bug] Improve a corner source of SERVFAILs [RT #19632]
+
2592. [bug] Treat "any" as a type in nsupdate. [RT #19455]
2591. [bug] named could die when processing a update in
removed_orphaned_ds(). [RT #19507]
+2590. [func] Report zone/class of "update with no effect".
+ [RT #19542]
+
+2589. [bug] dns_db_unregister() failed to clear '*dbimp'.
+ [RT #19626]
+
2588. [bug] SO_REUSEADDR could be set unconditionally after failure
of bind(2) call. This should be rare and mostly
harmless, but may cause interference with other
processes that happen to use the same port. [RT #19642]
+2587. [func] Improve logging by reporting serial numbers for
+ when zone serial has gone backwards or unchanged.
+ [RT #19506]
+
2586. [bug] Missing cleanup of SIG rdataset in searching a DLZ DB
or SDB. [RT #19577]
@@ -717,28 +1585,57 @@
2582. [bug] Don't emit warning log message when we attempt to
remove non-existent journal. [RT #19516]
+2581. [contrib] dlz/mysql set MYSQL_OPT_RECONNECT option on connection.
+ Requires MySQL 5.0.19 or later. [RT #19084]
+
+2580. [bug] UpdateRej statistics counter could be incremented twice
+ for one rejection. [RT #19476]
+
2579. [bug] DNSSEC lookaside validation failed to handle unknown
algorithms. [RT #19479]
2578. [bug] Changed default sig-signing-type to 65534, because
65535 turns out to be reserved. [RT #19477]
-2499. [port] solaris: lib/lwres/getaddrinfo.c namespace clash.
- [RT #18837]
-
- --- 9.6.1b1 released ---
-
2577. [doc] Clarified some statistics counters. [RT #19454]
2576. [bug] NSEC record were not being correctly signed when
a zone transitions from insecure to secure.
Handle such incorrectly signed zones. [RT #19114]
+2575. [func] New functions dns_name_fromstring() and
+ dns_name_tostring(), to simplify conversion
+ of a string to a dns_name structure and vice
+ versa. [RT #19451]
+
2574. [doc] Document nsupdate -g and -o. [RT #19351]
2573. [bug] Replacing a non-CNAME record with a CNAME record in a
single transaction in a signed zone failed. [RT #19397]
+2572. [func] Simplify DLV configuration, with a new option
+ "dnssec-lookaside auto;" This is the equivalent
+ of "dnssec-lookaside . trust-anchor dlv.isc.org;"
+ plus setting a trusted-key for dlv.isc.org.
+
+ Note: The trusted key is hard-coded into named,
+ but is also stored in (and can be overridden
+ by) $sysconfdir/bind.keys. As the ISC DLV key
+ rolls over it can be kept up to date by replacing
+ the bind.keys file with a key downloaded from
+ https://www.isc.org/solutions/dlv. [RT #18685]
+
+2571. [func] Add a new tool "arpaname" which translates IP addresses
+ to the corresponding IN-ADDR.ARPA or IP6.ARPA name.
+ [RT #18976]
+
+2570. [func] Log the destination address the query was sent to.
+ [RT #19209]
+
+2569. [func] Move journalprint, nsec3hash, and genrandom
+ commands from bin/tests into bin/tools;
+ "make install" will put them in $sbindir. [RT #19301]
+
2568. [bug] Report when the write to indicate a otherwise
successful start fails. [RT #19360]
@@ -747,6 +1644,15 @@
dnssec-dsfromkey could miss write errors.
[RT #19360]
+2566. [cleanup] Clarify logged message when an insecure DNSSEC
+ response arrives from a zone thought to be secure:
+ "insecurity proof failed" instead of "not
+ insecure". [RT #19400]
+
+2565. [func] Add support for HIP record. Includes new functions
+ dns_rdata_hip_first(), dns_rdata_hip_next()
+ and dns_rdata_hip_current(). [RT #19384]
+
2564. [bug] Only take EDNS fallback steps when processing timeouts.
[RT #19405]
@@ -763,6 +1669,10 @@
2559. [bug] dnssec-dsfromkey could compute bad DS records when
reading from a K* files. [RT #19357]
+2558. [func] Set the ownership of missing directories created
+ for pid-file if -u has been specified on the command
+ line. [RT #19328]
+
2557. [cleanup] PCI compliance:
* new libisc log module file
* isc_dir_chroot() now also changes the working
@@ -774,6 +1684,9 @@
error checks in the correct order resulting in the
wrong error code sometimes being returned. [RT #19249]
+2555. [func] dig: when emitting a hex dump also display the
+ corresponding characters. [RT #19258]
+
2554. [bug] Validation of uppercase queries from NSEC3 zones could
fail. [RT #19297]
@@ -797,6 +1710,10 @@
function isc_mem_reallocate() was introduced to address
this bug. [RT #19313]
+2546. [func] Add --enable-openssl-hash configure flag to use
+ OpenSSL (in place of internal routine) for hash
+ functions (MD5, SHA[12] and HMAC). [RT #18815]
+
2545. [doc] ARM: Legal hostname checking (check-names) is
for SRV RDATA too. [RT #19304]
@@ -809,6 +1726,8 @@
2541. [bug] Conditionally update dispatch manager statistics.
[RT #19247]
+2540. [func] Add a nibble mode to $GENERATE. [RT #18872]
+
2539. [security] Update the interaction between recursion, allow-query,
allow-query-cache and allow-recursion. [RT #19198]
@@ -816,7 +1735,7 @@
especially with threads and smaller max-cache-size
values. [RT #19240]
-2537. [experimental] Added more statistics counters including those on socket
+2537. [func] Added more statistics counters including those on socket
I/O events and query RTT histograms. [RT #18802]
2536. [cleanup] Silence some warnings when -Werror=format-security is
@@ -824,6 +1743,12 @@
2535. [bug] dig +showsearch and +trace interacted badly. [RT #19091]
+2534. [func] Check NAPTR records regular expressions and
+ replacement strings to ensure they are syntactically
+ valid and consistant. [RT #18168]
+
+2533. [doc] ARM: document @ (at-sign). [RT #17144]
+
2532. [bug] dig: check the question section of the response to
see if it matches the asked question. [RT #18495]
@@ -838,10 +1763,14 @@
2528. [cleanup] Silence spurious configure warning about
--datarootdir [RT #19096]
-2527. [bug] named could reuse cache on reload with
- enabling/disabling validation. [RT #19119]
+2527. [placeholder]
-2525. [experimental] New logging category "query-errors" to provide detailed
+2526. [func] New named option "attach-cache" that allows multiple
+ views to share a single cache to save memory and
+ improve lookup efficiency. Based on contributed code
+ from Barclay Osborn, Google. [RT #18905]
+
+2525. [func] New logging category "query-errors" to provide detailed
internal information about query failures, especially
about server failures. [RT #19027]
@@ -854,10 +1783,17 @@
2521. [bug] Improve epoll cross compilation support. [RT #19047]
+2520. [bug] Update xml statistics version number to 2.0 as change
+ #2388 made the schema incompatible to the previous
+ version. [RT #19080]
+
2519. [bug] dig/host with -4 or -6 didn't work if more than two
nameserver addresses of the excluded address family
preceded in resolv.conf. [RT #19081]
+2518. [func] Add support for the new CERT types from RFC 4398.
+ [RT #19077]
+
2517. [bug] dig +trace with -4 or -6 failed when it chose a
nameserver address of the excluded address type.
[RT #18843]
@@ -865,45 +1801,56 @@
2516. [bug] glue sort for responses was performed even when not
needed. [RT #19039]
+2515. [port] win32: build dnssec-dsfromkey and dnssec-keyfromlabel.
+ [RT #19063]
+
2514. [bug] dig/host failed with -4 or -6 when resolv.conf contains
a nameserver of the excluded address family.
[RT #18848]
+2513. [bug] Fix windows cli build. [RT #19062]
+
+2512. [func] Print a summary of the cached records which make up
+ the negative response. [RT #18885]
+
2511. [cleanup] dns_rdata_tofmttext() add const to linebreak.
[RT #18885]
+2510. [bug] "dig +sigchase" could trigger REQUIRE failures.
+ [RT #19033]
+
+2509. [bug] Specifying a fixed query source port was broken.
+ [RT #19051]
+
+2508. [placeholder]
+
+2507. [func] Log the recursion quota values when killing the
+ oldest query or refusing to recurse due to quota.
+ [RT #19022]
+
2506. [port] solaris: Check at configure time if
hack_shutup_pthreadonceinit is needed. [RT #19037]
2505. [port] Treat amd64 similarly to x86_64 when determining
atomic operation support. [RT #19031]
+2504. [bug] Address race condition in the socket code. [RT #18899]
+
2503. [port] linux: improve compatibility with Linux Standard
Base. [RT #18793]
2502. [cleanup] isc_radix: Improve compliance with coding style,
document function in <isc/radix.h>. [RT #18534]
- --- 9.6.0 released ---
-
-2520. [bug] Update xml statistics version number to 2.0 as change
- #2388 made the schema incompatible to the previous
- version. [RT #19080]
-
- --- 9.6.0rc2 released ---
-
-2515. [port] win32: build dnssec-dsfromkey and dnssec-keyfromlabel.
- [RT #19063]
-
-2513. [bug] Fix windows cli build. [RT #19062]
-
-2510. [bug] "dig +sigchase" could trigger REQUIRE failures.
- [RT #19033]
+2501. [func] $GENERATE now supports all rdata types. Multi-field
+ rdata types need to be quoted. See the ARM for
+ details. [RT #18368]
-2509. [bug] Specifying a fixed query source port was broken.
- [RT #19051]
+2500. [contrib] contrib/sdb/pgsql/zonetodb.c called non-existent
+ function. [RT #18582]
-2504. [bug] Address race condition in the socket code. [RT #18899]
+2499. [port] solaris: lib/lwres/getaddrinfo.c namespace clash.
+ [RT #18837]
--- 9.6.0rc1 released ---
diff --git a/contrib/bind9/COPYRIGHT b/contrib/bind9/COPYRIGHT
index ee90ece..8721cec 100644
--- a/contrib/bind9/COPYRIGHT
+++ b/contrib/bind9/COPYRIGHT
@@ -13,7 +13,7 @@ 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.
-$Id: COPYRIGHT,v 1.14.176.3 2011-01-04 23:45:42 tbox Exp $
+$Id: COPYRIGHT,v 1.17 2011-01-04 23:47:13 tbox Exp $
Portions Copyright (C) 1996-2001 Nominum, Inc.
diff --git a/contrib/bind9/FAQ.xml b/contrib/bind9/FAQ.xml
index a9b2b41..4c83f76 100644
--- a/contrib/bind9/FAQ.xml
+++ b/contrib/bind9/FAQ.xml
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: FAQ.xml,v 1.46.56.9 2010-01-20 23:47:43 tbox Exp $ -->
+<!-- $Id: FAQ.xml,v 1.54 2010-01-19 23:48:55 tbox Exp $ -->
<article class="faq">
<title>Frequently Asked Questions about BIND 9</title>
diff --git a/contrib/bind9/HISTORY b/contrib/bind9/HISTORY
new file mode 100644
index 0000000..e98f9b4
--- /dev/null
+++ b/contrib/bind9/HISTORY
@@ -0,0 +1,313 @@
+Summary of functional enhancements from prior major releases of BIND 9:
+
+BIND 9.6.0
+
+ Full NSEC3 support
+
+ Automatic zone re-signing
+
+ New update-policy methods tcp-self and 6to4-self
+
+ The BIND 8 resolver library, libbind, has been removed from the
+ BIND 9 distribution and is now available as a separate download.
+
+ Change the default pid file location from /var/run to
+ /var/run/{named,lwresd} for improved chroot/setuid support.
+
+BIND 9.5.0
+
+ GSS-TSIG support (RFC 3645).
+
+ DHCID support.
+
+ Experimental http server and statistics support for named via xml.
+
+ More detailed statistics counters including those supported in BIND 8.
+
+ Faster ACL processing.
+
+ Use Doxygen to generate internal documentation.
+
+ Efficient LRU cache-cleaning mechanism.
+
+ NSID support.
+
+BIND 9.4.0
+
+ Implemented "additional section caching (or acache)", an
+ internal cache framework for additional section content to
+ improve response performance. Several configuration options
+ were provided to control the behavior.
+
+ New notify type 'master-only'. Enable notify for master
+ zones only.
+
+ Accept 'notify-source' style syntax for query-source.
+
+ rndc now allows addresses to be set in the server clauses.
+
+ New option "allow-query-cache". This lets "allow-query"
+ be used to specify the default zone access level rather
+ than having to have every zone override the global value.
+ "allow-query-cache" can be set at both the options and view
+ levels. If "allow-query-cache" is not set then "allow-recursion"
+ is used if set, otherwise "allow-query" is used if set
+ unless "recursion no;" is set in which case "none;" is used,
+ otherwise the default (localhost; localnets;) is used.
+
+ rndc: the source address can now be specified.
+
+ ixfr-from-differences now takes master and slave in addition
+ to yes and no at the options and view levels.
+
+ Allow the journal's name to be changed via named.conf.
+
+ 'rndc notify zone [class [view]]' resend the NOTIFY messages
+ for the specified zone.
+
+ 'dig +trace' now randomly selects the next servers to try.
+ Report if there is a bad delegation.
+
+ Improve check-names error messages.
+
+ Make public the function to read a key file, dst_key_read_public().
+
+ dig now returns the byte count for axfr/ixfr.
+
+ allow-update is now settable at the options / view level.
+
+ named-checkconf now checks the logging configuration.
+
+ host now can turn on memory debugging flags with '-m'.
+
+ Don't send notify messages to self.
+
+ Perform sanity checks on NS records which refer to 'in zone' names.
+
+ New zone option "notify-delay". Specify a minimum delay
+ between sets of NOTIFY messages.
+
+ Extend adjusting TTL warning messages.
+
+ Named and named-checkzone can now both check for non-terminal
+ wildcard records.
+
+ "rndc freeze/thaw" now freezes/thaws all zones.
+
+ named-checkconf now check acls to verify that they only
+ refer to existing acls.
+
+ The server syntax has been extended to support a range of
+ servers.
+
+ Report differences between hints and real NS rrset and
+ associated address records.
+
+ Preserve the case of domain names in rdata during zone
+ transfers.
+
+ Restructured the data locking framework using architecture
+ dependent atomic operations (when available), improving
+ response performance on multi-processor machines significantly.
+ x86, x86_64, alpha, powerpc, and mips are currently supported.
+
+ UNIX domain controls are now supported.
+
+ Add support for additional zone file formats for improving
+ loading performance. The masterfile-format option in
+ named.conf can be used to specify a non-default format. A
+ separate command named-compilezone was provided to generate
+ zone files in the new format. Additionally, the -I and -O
+ options for dnssec-signzone specify the input and output
+ formats.
+
+ dnssec-signzone can now randomize signature end times
+ (dnssec-signzone -j jitter).
+
+ Add support for CH A record.
+
+ Add additional zone data constancy checks. named-checkzone
+ has extended checking of NS, MX and SRV record and the hosts
+ they reference. named has extended post zone load checks.
+ New zone options: check-mx and integrity-check.
+
+
+ edns-udp-size can now be overridden on a per server basis.
+
+ dig can now specify the EDNS version when making a query.
+
+ Added framework for handling multiple EDNS versions.
+
+ Additional memory debugging support to track size and mctx
+ arguments.
+
+ Detect duplicates of UDP queries we are recursing on and
+ drop them. New stats category "duplicates".
+
+ "USE INTERNAL MALLOC" is now runtime selectable.
+
+ The lame cache is now done on a <qname,qclass,qtype> basis
+ as some servers only appear to be lame for certain query
+ types.
+
+ Limit the number of recursive clients that can be waiting
+ for a single query (<qname,qtype,qclass>) to resolve. New
+ options clients-per-query and max-clients-per-query.
+
+ dig: report the number of extra bytes still left in the
+ packet after processing all the records.
+
+ Support for IPSECKEY rdata type.
+
+ Raise the UDP recieve buffer size to 32k if it is less than 32k.
+
+ x86 and x86_64 now have seperate atomic locking implementations.
+
+ named-checkconf now validates update-policy entries.
+
+ Attempt to make the amount of work performed in a iteration
+ self tuning. The covers nodes clean from the cache per
+ iteration, nodes written to disk when rewriting a master
+ file and nodes destroyed per iteration when destroying a
+ zone or a cache.
+
+ ISC string copy API.
+
+ Automatic empty zone creation for D.F.IP6.ARPA and friends.
+ Note: RFC 1918 zones are not yet covered by this but are
+ likely to be in a future release.
+
+ New options: empty-server, empty-contact, empty-zones-enable
+ and disable-empty-zone.
+
+ dig now has a '-q queryname' and '+showsearch' options.
+
+ host/nslookup now continue (default)/fail on SERVFAIL.
+
+ dig now warns if 'RA' is not set in the answer when 'RD'
+ was set in the query. host/nslookup skip servers that fail
+ to set 'RA' when 'RD' is set unless a server is explicitly
+ set.
+
+ Integrate contibuted DLZ code into named.
+
+ Integrate contibuted IDN code from JPNIC.
+
+ libbind: corresponds to that from BIND 8.4.7.
+
+BIND 9.3.0
+
+ DNSSEC is now DS based (RFC 3658).
+ See also RFC 3845, doc/draft/draft-ietf-dnsext-dnssec-*.
+
+ DNSSEC lookaside validation.
+
+ check-names is now implemented.
+ rrset-order in more complete.
+
+ IPv4/IPv6 transition support, dual-stack-servers.
+
+ IXFR deltas can now be generated when loading master files,
+ ixfr-from-differences.
+
+ It is now possible to specify the size of a journal, max-journal-size.
+
+ It is now possible to define a named set of master servers to be
+ used in masters clause, masters.
+
+ The advertised EDNS UDP size can now be set, edns-udp-size.
+
+ allow-v6-synthesis has been obsoleted.
+
+ NOTE:
+ * Zones containing MD and MF will now be rejected.
+ * dig, nslookup name. now report "Not Implemented" as
+ NOTIMP rather than NOTIMPL. This will have impact on scripts
+ that are looking for NOTIMPL.
+
+ libbind: corresponds to that from BIND 8.4.5.
+
+BIND 9.2.0
+
+ The size of the cache can now be limited using the
+ "max-cache-size" option.
+
+ The server can now automatically convert RFC1886-style recursive
+ lookup requests into RFC2874-style lookups, when enabled using the
+ new option "allow-v6-synthesis". This allows stub resolvers that
+ support AAAA records but not A6 record chains or binary labels to
+ perform lookups in domains that make use of these IPv6 DNS
+ features.
+
+ Performance has been improved.
+
+ The man pages now use the more portable "man" macros rather than
+ the "mandoc" macros, and are installed by "make install".
+
+ The named.conf parser has been completely rewritten. It now
+ supports "include" directives in more places such as inside "view"
+ statements, and it no longer has any reserved words.
+
+ The "rndc status" command is now implemented.
+
+ rndc can now be configured automatically.
+
+ A BIND 8 compatible stub resolver library is now included in
+ lib/bind.
+
+ OpenSSL has been removed from the distribution. This means that to
+ use DNSSEC, OpenSSL must be installed and the --with-openssl option
+ must be supplied to configure. This does not apply to the use of
+ TSIG, which does not require OpenSSL.
+
+ The source distribution now builds on Windows. See
+ win32utils/readme1.txt and win32utils/win32-build.txt for details.
+
+ This distribution also includes a new lightweight stub
+ resolver library and associated resolver daemon that fully
+ support forward and reverse lookups of both IPv4 and IPv6
+ addresses. This library is considered experimental and
+ is not a complete replacement for the BIND 8 resolver library.
+ Applications that use the BIND 8 res_* functions to perform
+ DNS lookups or dynamic updates still need to be linked against
+ the BIND 8 libraries. For DNS lookups, they can also use the
+ new "getrrsetbyname()" API.
+
+ BIND 9.2 is capable of acting as an authoritative server
+ for DNSSEC secured zones. This functionality is believed to
+ be stable and complete except for lacking support for
+ verifications involving wildcard records in secure zones.
+
+ When acting as a caching server, BIND 9.2 can be configured
+ to perform DNSSEC secure resolution on behalf of its clients.
+ This part of the DNSSEC implementation is still considered
+ experimental. For detailed information about the state of the
+ DNSSEC implementation, see the file doc/misc/dnssec.
+
+ There are a few known bugs:
+
+ On some systems, IPv6 and IPv4 sockets interact in
+ unexpected ways. For details, see doc/misc/ipv6.
+ To reduce the impact of these problems, the server
+ no longer listens for requests on IPv6 addresses
+ by default. If you need to accept DNS queries over
+ IPv6, you must specify "listen-on-v6 { any; };"
+ in the named.conf options statement.
+
+ FreeBSD prior to 4.2 (and 4.2 if running as non-root)
+ and OpenBSD prior to 2.8 log messages like
+ "fcntl(8, F_SETFL, 4): Inappropriate ioctl for device".
+ This is due to a bug in "/dev/random" and impacts the
+ server's DNSSEC support.
+
+ OS X 10.1.4 (Darwin 5.4), OS X 10.1.5 (Darwin 5.5) and
+ OS X 10.2 (Darwin 6.0) reports errors like
+ "fcntl(3, F_SETFL, 4): Operation not supported by device".
+ This is due to a bug in "/dev/random" and impacts the
+ server's DNSSEC support.
+
+ --with-libtool does not work on AIX.
+
+ A bug in some versions of the Microsoft DNS server can cause zone
+ transfers from a BIND 9 server to a W2K server to fail. For details,
+ see the "Zone Transfers" section in doc/misc/migration.
diff --git a/contrib/bind9/KNOWN-DEFECTS b/contrib/bind9/KNOWN-DEFECTS
deleted file mode 100644
index 83d7175..0000000
--- a/contrib/bind9/KNOWN-DEFECTS
+++ /dev/null
@@ -1,15 +0,0 @@
-dnssec-signzone was designed so that it could sign a zone partially, using
-only a subset of the DNSSEC keys needed to produce a fully-signed zone.
-This permits a zone administrator, for example, to sign a zone with one
-key on one machine, move the resulting partially-signed zone to a second
-machine, and sign it again with a second key.
-
-An unfortunate side-effect of this flexibility is that dnssec-signzone
-does not check to make sure it's signing a zone with any valid keys at
-all. An attempt to sign a zone without any keys will appear to succeed,
-producing a "signed" zone with no signatures. There is no warning issued
-when a zone is not signed.
-
-This will be corrected in a future release. In the meantime, ISC
-recommends examining the output of dnssec-signzone to confirm that
-the zone is properly signed by all keys before using it.
diff --git a/contrib/bind9/Makefile.in b/contrib/bind9/Makefile.in
index e4d5639..95944d9 100644
--- a/contrib/bind9/Makefile.in
+++ b/contrib/bind9/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.52.48.2 2009-02-20 23:47:23 tbox Exp $
+# $Id: Makefile.in,v 1.58 2009-11-26 20:52:44 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -21,13 +21,13 @@ top_srcdir = @top_srcdir@
@BIND9_VERSION@
-SUBDIRS = make lib bin doc
+SUBDIRS = make lib bin doc @LIBEXPORT@
TARGETS =
MANPAGES = isc-config.sh.1
-
+
HTMLPAGES = isc-config.sh.html
-
+
MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
@@ -54,7 +54,8 @@ installdirs:
install:: isc-config.sh installdirs
${INSTALL_SCRIPT} isc-config.sh ${DESTDIR}${bindir}
- ${INSTALL_DATA} ${srcdir}/isc-config.sh.1 ${DESTDIR}${mandir}/man1
+ ${INSTALL_DATA} ${top_srcdir}/isc-config.sh.1 ${DESTDIR}${mandir}/man1
+ ${INSTALL_DATA} ${top_srcdir}/bind.keys ${DESTDIR}${sysconfdir}
tags:
rm -f TAGS
diff --git a/contrib/bind9/NSEC3-NOTES b/contrib/bind9/NSEC3-NOTES
deleted file mode 100644
index 3f8d8f9..0000000
--- a/contrib/bind9/NSEC3-NOTES
+++ /dev/null
@@ -1,128 +0,0 @@
-
- DNSSEC and UPDATE
-
- Converting from insecure to secure
-
-As of BIND 9.6.0 it is possible to move a zone between being insecure
-to secure and back again. A secure zone can be using NSEC or NSEC3.
-
-To move a zone from insecure to secure you need to configure named
-so that it can see the K* files which contain the public and private
-parts of the keys that will be used to sign the zone. These files
-will have been generated by dnssec-keygen. You can do this by
-placing them in the key-directory as specified in named.conf.
-
- zone example.net {
- type master;
- allow-update { .... };
- file "dynamic/example.net/example.net";
- key-directory "dynamic/example.net";
- };
-
-Assuming one KSK and one ZSK DNSKEY key have been generated. Then
-this will cause the zone to be signed with the ZSK and the DNSKEY
-RRset to be signed with the KSK DNSKEY. A NSEC chain will also be
-generated as part of the initial signing process.
-
- % nsupdate
- > ttl 3600
- > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
- > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
- > send
-
-While the update request will complete almost immediately the zone
-will not be completely signed until named has had time to walk the
-zone and generate the NSEC and RRSIG records. Initially the NSEC
-record at the zone apex will have the OPT bit set. When the NSEC
-chain is complete the OPT bit will be cleared. Additionally when
-the zone is fully signed the private type (default TYPE65534) records
-will have a non zero value for the final octet.
-
-The private type record has 5 octets.
- algorithm (octet 1)
- key id in network order (octet 2 and 3)
- removal flag (octet 4)
- complete flag (octet 5)
-
-If you wish to go straight to a secure zone using NSEC3 you should
-also add a NSEC3PARAM record to the update request with the flags
-field set to indicate whether the NSEC3 chain will have the OPTOUT
-bit set or not.
-
- % nsupdate
- > ttl 3600
- > update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
- > update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
- > update add example.net NSEC3PARAM 1 1 100 1234567890
- > send
-
-Again the update request will complete almost immediately however the
-NSEC3PARAM record will have additional flag bits set indicating that the
-NSEC3 chain is under construction. When the NSEC3 chain is complete the
-flags field will be set to zero.
-
-While the initial signing and NSEC/NSEC3 chain generation is happening
-other updates are possible.
-
- DNSKEY roll overs via UPDATE
-
-It is possible to perform key rollovers via update. You need to
-add the K* files for the new keys so that named can find them. You
-can then add the new DNSKEY RRs via update. Named will then cause
-the zone to be signed with the new keys. When the signing is
-complete the private type records will be updated so that the last
-octet is non zero.
-
-If this is for a KSK you need to inform the parent and any trust
-anchor repositories of the new KSK.
-
-You should then wait for the maximum TLL in the zone before removing the
-old DNSKEY. If it is a KSK that is being updated you also need to wait
-for the DS RRset in the parent to be updated and its TTL to expire.
-This ensures that all clients will be able to verify at least a signature
-when you remove the old DNSKEY.
-
-The old DNSKEY can be removed via UPDATE. Take care to specify
-the correct key. Named will clean out any signatures generated by
-the old key after the update completes.
-
- NSEC3PARAM rollovers via UPDATE.
-
-Add the new NSEC3PARAM record via update. When the new NSEC3 chain
-has been generated the NSEC3PARAM flag field will be zero. At this
-point you can remove the old NSEC3PARAM record. The old chain will
-be removed after the update request completes.
-
- Converting from NSEC to NSEC3
-
-To do this you just need to add a NSEC3PARAM record. When the
-conversion is complete the NSEC chain will have been removed and
-the NSEC3PARAM record will have a zero flag field. The NSEC3 chain
-will be generated before the NSEC chain is destroyed.
-
- Converting from NSEC3 to NSEC
-
-To do this remove all NSEC3PARAM records with a zero flag field. The
-NSEC chain will be generated before the NSEC3 chain is removed.
-
- Converting from secure to insecure
-
-To do this remove all the DNSKEY records. Any NSEC or NSEC3 chains
-will be removed as well as associated NSEC3PARAM records. This will
-take place after the update requests completes.
-
- Periodic re-signing.
-
-Named will periodically re-sign RRsets which have not been re-signed
-as a result of some update action. The signature lifetimes will
-be adjusted so as to spread the re-sign load over time rather than
-all at once.
-
- NSEC3 and OPTOUT
-
-Named only supports creating new NSEC3 chains where all the NSEC3
-records in the zone have the same OPTOUT state. Named supports
-UPDATES to zones where the NSEC3 records in the chain have mixed
-OPTOUT state. Named does not support changing the OPTOUT state of
-an individual NSEC3 record, the entire chain needs to be changed if
-the OPTOUT state of an individual NSEC3 needs to be changed.
diff --git a/contrib/bind9/README b/contrib/bind9/README
index 54d90fe..00010c3 100644
--- a/contrib/bind9/README
+++ b/contrib/bind9/README
@@ -42,368 +42,95 @@ BIND 9
Stichting NLnet - NLnet Foundation
Nominum, Inc.
-BIND 9.6.3
-
- BIND 9.6.3 is a maintenance release, fixing bugs in 9.6.2.
-
-BIND 9.6.2
-
- BIND 9.6.2 is a maintenance release, fixing bugs in 9.6.1.
- It also introduces support for the SHA-2 DNSSEC algorithms,
- RSASHA256 and RSASHA512.
-
- Known issues in this release:
-
- - A validating resolver that has been incorrectly configured with
- an invalid trust anchor will be unable to resolve names covered
- by that trust anchor. In all current versions of BIND 9, such a
- resolver will also generate significant unnecessary DNS traffic
- while trying to validate. The latter problem will be addressed
- in future BIND 9 releases. In the meantime, to avoid these
- problems, exercise caution when configuring "trusted-keys":
- make sure all keys are correct and current when you add them,
- and update your configuration in a timely manner when keys
- roll over.
-
-BIND 9.6.1
-
- BIND 9.6.1 is a maintenance release, fixing bugs in 9.6.0.
-
-BIND 9.6.0
-
- BIND 9.6.0 includes a number of changes from BIND 9.5 and earlier
- releases, including:
-
- Full NSEC3 support
-
- Automatic zone re-signing
-
- New update-policy methods tcp-self and 6to4-self
-
- The BIND 8 resolver library, libbind, has been removed from the
- BIND 9 distribution and is now available as a separate download.
-
- Change the default pid file location from /var/run to
- /var/run/{named,lwresd} for improved chroot/setuid support.
-
-BIND 9.5.0
-
- BIND 9.5.0 has a number of new features over 9.4,
- including:
-
- GSS-TSIG support (RFC 3645).
-
- DHCID support.
-
- Experimental http server and statistics support for named via xml.
-
- More detailed statistics counters including those supported in BIND 8.
-
- Faster ACL processing.
-
- Use Doxygen to generate internal documentation.
-
- Efficient LRU cache-cleaning mechanism.
-
- NSID support.
-
-BIND 9.4.0
-
- BIND 9.4.0 has a number of new features over 9.3,
- including:
-
- Implemented "additional section caching (or acache)", an
- internal cache framework for additional section content to
- improve response performance. Several configuration options
- were provided to control the behavior.
-
- New notify type 'master-only'. Enable notify for master
- zones only.
-
- Accept 'notify-source' style syntax for query-source.
-
- rndc now allows addresses to be set in the server clauses.
-
- New option "allow-query-cache". This lets "allow-query"
- be used to specify the default zone access level rather
- than having to have every zone override the global value.
- "allow-query-cache" can be set at both the options and view
- levels. If "allow-query-cache" is not set then "allow-recursion"
- is used if set, otherwise "allow-query" is used if set
- unless "recursion no;" is set in which case "none;" is used,
- otherwise the default (localhost; localnets;) is used.
-
- rndc: the source address can now be specified.
-
- ixfr-from-differences now takes master and slave in addition
- to yes and no at the options and view levels.
-
- Allow the journal's name to be changed via named.conf.
-
- 'rndc notify zone [class [view]]' resend the NOTIFY messages
- for the specified zone.
-
- 'dig +trace' now randomly selects the next servers to try.
- Report if there is a bad delegation.
-
- Improve check-names error messages.
-
- Make public the function to read a key file, dst_key_read_public().
-
- dig now returns the byte count for axfr/ixfr.
-
- allow-update is now settable at the options / view level.
-
- named-checkconf now checks the logging configuration.
-
- host now can turn on memory debugging flags with '-m'.
-
- Don't send notify messages to self.
-
- Perform sanity checks on NS records which refer to 'in zone' names.
-
- New zone option "notify-delay". Specify a minimum delay
- between sets of NOTIFY messages.
-
- Extend adjusting TTL warning messages.
-
- Named and named-checkzone can now both check for non-terminal
- wildcard records.
-
- "rndc freeze/thaw" now freezes/thaws all zones.
-
- named-checkconf now check acls to verify that they only
- refer to existing acls.
-
- The server syntax has been extended to support a range of
- servers.
-
- Report differences between hints and real NS rrset and
- associated address records.
-
- Preserve the case of domain names in rdata during zone
- transfers.
-
- Restructured the data locking framework using architecture
- dependent atomic operations (when available), improving
- response performance on multi-processor machines significantly.
- x86, x86_64, alpha, powerpc, and mips are currently supported.
-
- UNIX domain controls are now supported.
-
- Add support for additional zone file formats for improving
- loading performance. The masterfile-format option in
- named.conf can be used to specify a non-default format. A
- separate command named-compilezone was provided to generate
- zone files in the new format. Additionally, the -I and -O
- options for dnssec-signzone specify the input and output
- formats.
-
- dnssec-signzone can now randomize signature end times
- (dnssec-signzone -j jitter).
-
- Add support for CH A record.
-
- Add additional zone data constancy checks. named-checkzone
- has extended checking of NS, MX and SRV record and the hosts
- they reference. named has extended post zone load checks.
- New zone options: check-mx and integrity-check.
-
-
- edns-udp-size can now be overridden on a per server basis.
-
- dig can now specify the EDNS version when making a query.
-
- Added framework for handling multiple EDNS versions.
-
- Additional memory debugging support to track size and mctx
- arguments.
-
- Detect duplicates of UDP queries we are recursing on and
- drop them. New stats category "duplicates".
-
- "USE INTERNAL MALLOC" is now runtime selectable.
-
- The lame cache is now done on a <qname,qclass,qtype> basis
- as some servers only appear to be lame for certain query
- types.
-
- Limit the number of recursive clients that can be waiting
- for a single query (<qname,qtype,qclass>) to resolve. New
- options clients-per-query and max-clients-per-query.
-
- dig: report the number of extra bytes still left in the
- packet after processing all the records.
-
- Support for IPSECKEY rdata type.
-
- Raise the UDP recieve buffer size to 32k if it is less than 32k.
-
- x86 and x86_64 now have seperate atomic locking implementations.
-
- named-checkconf now validates update-policy entries.
-
- Attempt to make the amount of work performed in a iteration
- self tuning. The covers nodes clean from the cache per
- iteration, nodes written to disk when rewriting a master
- file and nodes destroyed per iteration when destroying a
- zone or a cache.
-
- ISC string copy API.
-
- Automatic empty zone creation for D.F.IP6.ARPA and friends.
- Note: RFC 1918 zones are not yet covered by this but are
- likely to be in a future release.
-
- New options: empty-server, empty-contact, empty-zones-enable
- and disable-empty-zone.
-
- dig now has a '-q queryname' and '+showsearch' options.
-
- host/nslookup now continue (default)/fail on SERVFAIL.
-
- dig now warns if 'RA' is not set in the answer when 'RD'
- was set in the query. host/nslookup skip servers that fail
- to set 'RA' when 'RD' is set unless a server is explicitly
- set.
-
- Integrate contibuted DLZ code into named.
-
- Integrate contibuted IDN code from JPNIC.
-
- libbind: corresponds to that from BIND 8.4.7.
-
-BIND 9.3.0
-
- BIND 9.3.0 has a number of new features over 9.2,
- including:
-
- DNSSEC is now DS based (RFC 3658).
- See also RFC 3845, doc/draft/draft-ietf-dnsext-dnssec-*.
-
- DNSSEC lookaside validation.
-
- check-names is now implemented.
- rrset-order in more complete.
-
- IPv4/IPv6 transition support, dual-stack-servers.
-
- IXFR deltas can now be generated when loading master files,
- ixfr-from-differences.
-
- It is now possible to specify the size of a journal, max-journal-size.
-
- It is now possible to define a named set of master servers to be
- used in masters clause, masters.
-
- The advertised EDNS UDP size can now be set, edns-udp-size.
-
- allow-v6-synthesis has been obsoleted.
-
- NOTE:
- * Zones containing MD and MF will now be rejected.
- * dig, nslookup name. now report "Not Implemented" as
- NOTIMP rather than NOTIMPL. This will have impact on scripts
- that are looking for NOTIMPL.
-
- libbind: corresponds to that from BIND 8.4.5.
-
-BIND 9.2.0
-
- BIND 9.2.0 has a number of new features over 9.1,
- including:
-
- - The size of the cache can now be limited using the
- "max-cache-size" option.
-
- - The server can now automatically convert RFC1886-style
- recursive lookup requests into RFC2874-style lookups,
- when enabled using the new option "allow-v6-synthesis".
- This allows stub resolvers that support AAAA records
- but not A6 record chains or binary labels to perform
- lookups in domains that make use of these IPv6 DNS
- features.
-
- - Performance has been improved.
-
- - The man pages now use the more portable "man" macros
- rather than the "mandoc" macros, and are installed
- by "make install".
-
- - The named.conf parser has been completely rewritten.
- It now supports "include" directives in more
- places such as inside "view" statements, and it no
- longer has any reserved words.
-
- - The "rndc status" command is now implemented.
-
- - rndc can now be configured automatically.
-
- - A BIND 8 compatible stub resolver library is now
- included in lib/bind.
-
- - OpenSSL has been removed from the distribution. This
- means that to use DNSSEC, OpenSSL must be installed and
- the --with-openssl option must be supplied to configure.
- This does not apply to the use of TSIG, which does not
- require OpenSSL.
-
- - The source distribution now builds on Windows.
- See win32utils/readme1.txt and win32utils/win32-build.txt
- for details.
-
- This distribution also includes a new lightweight stub
- resolver library and associated resolver daemon that fully
- support forward and reverse lookups of both IPv4 and IPv6
- addresses. This library is considered experimental and
- is not a complete replacement for the BIND 8 resolver library.
- Applications that use the BIND 8 res_* functions to perform
- DNS lookups or dynamic updates still need to be linked against
- the BIND 8 libraries. For DNS lookups, they can also use the
- new "getrrsetbyname()" API.
-
- BIND 9.2 is capable of acting as an authoritative server
- for DNSSEC secured zones. This functionality is believed to
- be stable and complete except for lacking support for
- verifications involving wildcard records in secure zones.
-
- When acting as a caching server, BIND 9.2 can be configured
- to perform DNSSEC secure resolution on behalf of its clients.
- This part of the DNSSEC implementation is still considered
- experimental. For detailed information about the state of the
- DNSSEC implementation, see the file doc/misc/dnssec.
-
- There are a few known bugs:
-
- On some systems, IPv6 and IPv4 sockets interact in
- unexpected ways. For details, see doc/misc/ipv6.
- To reduce the impact of these problems, the server
- no longer listens for requests on IPv6 addresses
- by default. If you need to accept DNS queries over
- IPv6, you must specify "listen-on-v6 { any; };"
- in the named.conf options statement.
-
- FreeBSD prior to 4.2 (and 4.2 if running as non-root)
- and OpenBSD prior to 2.8 log messages like
- "fcntl(8, F_SETFL, 4): Inappropriate ioctl for device".
- This is due to a bug in "/dev/random" and impacts the
- server's DNSSEC support.
-
- OS X 10.1.4 (Darwin 5.4), OS X 10.1.5 (Darwin 5.5) and
- OS X 10.2 (Darwin 6.0) reports errors like
- "fcntl(3, F_SETFL, 4): Operation not supported by device".
- This is due to a bug in "/dev/random" and impacts the
- server's DNSSEC support.
-
- --with-libtool does not work on AIX.
-
- A bug in some versions of the Microsoft DNS server can cause zone
- transfers from a BIND 9 server to a W2K server to fail. For details,
- see the "Zone Transfers" section in doc/misc/migration.
+ For a summary of functional enhancements in previous
+ releases, see the HISTORY file.
For a detailed list of user-visible changes from
previous releases, see the CHANGES file.
+BIND 9.8.0
+
+ BIND 9.8.0 includes a number of changes from BIND 9.7 and earlier
+ releases. New features include:
+
+ - Built-in trust anchor for the root zone, which can be
+ switched on via "dnssec-validation auto;"
+ - Support for DNS64.
+ - Support for response policy zones (RPZ).
+ - Support for writable DLZ zones.
+ - Improved ease of configuration of GSS/TSIG for
+ interoperability with Active Directory
+ - Support for GOST signing algorithm for DNSSEC.
+ - Removed RTT Banding from server selection algorithm.
+ - New "static-stub" zone type.
+ - Allow configuration of resolver timeouts via
+ "resolver-query-timeout" option.
+
+BIND 9.7.0
+
+ BIND 9.7.0 includes a number of changes from BIND 9.6 and earlier
+ releases. Most are intended to simplify DNSSEC configuration.
+
+ New features include:
+
+ - Fully automatic signing of zones by "named".
+ - Simplified configuration of DNSSEC Lookaside Validation (DLV).
+ - Simplified configuration of Dynamic DNS, using the "ddns-confgen"
+ command line tool or the "local" update-policy option. (As a side
+ effect, this also makes it easier to configure automatic zone
+ re-signing.)
+ - New named option "attach-cache" that allows multiple views to
+ share a single cache.
+ - DNS rebinding attack prevention.
+ - New default values for dnssec-keygen parameters.
+ - Support for RFC 5011 automated trust anchor maintenance
+ - Smart signing: simplified tools for zone signing and key
+ maintenance.
+ - The "statistics-channels" option is now available on Windows.
+ - A new DNSSEC-aware libdns API for use by non-BIND9 applications
+ - On some platforms, named and other binaries can now print out
+ a stack backtrace on assertion failure, to aid in debugging.
+ - A "tools only" installation mode on Windows, which only installs
+ dig, host, nslookup and nsupdate.
+ - Improved PKCS#11 support, including Keyper support and explicit
+ OpenSSL engine selection.
+
+ Known issues in this release:
+
+ - In rare cases, DNSSEC validation can leak memory. When this
+ happens, it will cause an assertion failure when named exits,
+ but is otherwise harmless. A fix exists, but was too late for
+ this release; it will be included in BIND 9.7.1.
+
+ Compatibility notes:
+
+ - If you had built BIND 9.6 with any of ALLOW_NSEC3PARAM_UPDATE,
+ ALLOW_SECURE_TO_INSECURE or ALLOW_INSECURE_TO_SECURE defined, then
+ you should ensure that all changes that are in progress have
+ completed prior to upgrading to BIND 9.7. BIND 9.7 implements
+ those features in a way which is not backwards compatible.
+
+ - Prior releases had a bug which caused HMAC-SHA* keys with long
+ secrets to be used incorrectly. Fixing this bug means that older
+ versions of BIND 9 may fail to interoperate with this version
+ when using TSIG keys. If this occurs, the new "isc-hmac-fixup"
+ tool will convert a key with a long secret into a form that works
+ correctly with all versions of BIND 9. See the "isc-hmac-fixup"
+ man page for additional details.
+
+ - Revoking a DNSSEC key with "dnssec-revoke" changes its key ID.
+ It is possible for the new key ID to collide with that of a
+ different key. Newly generated keys will not have this problem,
+ as "dnssec-keygen" looks for potential collisions before
+ generating keys, but exercise caution if using key revokation
+ with keys that were generated by older versions of BIND 9. See
+ the Administrator's Reference Manual, section 4.10 ("Dynamic
+ Trust Anchor Management") for more details.
+
+ - A bug was fixed in which a key's scheduled inactivity date was
+ stored incorectly. Users who participated in the 9.7.0 BETA test
+ and had DNSSEC keys with scheduled inactivity dates will need to
+ reset those keys' dates using "dnssec-settime -I".
Building
@@ -417,7 +144,7 @@ Building
FreeBSD 4.10, 5.2.1, 6.2
HP-UX 11.11
Mac OS X 10.5
- NetBSD 3.x and 4.0-beta
+ NetBSD 3.x, 4.0-beta, 5.0-beta
OpenBSD 3.3 and up
Solaris 8, 9, 9 (x86), 10
Ubuntu 7.04, 7.10
@@ -594,6 +321,9 @@ Documentation
Frequently asked questions and their answers can be found in
FAQ.
+ Additional information on various subjects can be found
+ in the other README files.
+
Bug Reports and Mailing Lists
diff --git a/contrib/bind9/README.idnkit b/contrib/bind9/README.idnkit
deleted file mode 100644
index f5255f5..0000000
--- a/contrib/bind9/README.idnkit
+++ /dev/null
@@ -1,112 +0,0 @@
-
- BIND-9 IDN patch
-
- Japan Network Information Center (JPNIC)
-
-
-* What is this patch for?
-
-This patch adds internationalized domain name (IDN) support to BIND-9.
-You'll get internationalized version of dig/host/nslookup commands.
-
- + internationalized dig/host/nslookup
- dig/host/nslookup accepts non-ASCII domain names in the local
- codeset (such as Shift JIS, Big5 or ISO8859-1) determined by
- the locale information. The domain names are normalized and
- converted to the encoding on the DNS protocol, and sent to DNS
- servers. The replies are converted back to the local codeset
- and displayed.
-
-
-* Compilation & installation
-
-0. Prerequisite
-
-You have to build and install idnkit before building this patched version
-of bind-9.
-
-1. Running configure script
-
-Run `configure' in the top directory. See `README' for the
-configuration options.
-
-This patch adds the following 4 options to `configure'. You should
-at least specify `--with-idn' option to enable IDN support.
-
- --with-idn[=IDN_PREFIX]
- To enable IDN support, you have to specify `--with-idn' option.
- The argument IDN_PREFIX is the install prefix of idnkit. If
- IDN_PREFIX is omitted, PREFIX (derived from `--prefix=PREFIX')
- is assumed.
-
- --with-libiconv[=LIBICONV_PREFIX]
- Specify this option if idnkit you have installed links GNU
- libiconv. The argument LIBICONV_PREFIX is install prefix of
- GNU libiconv. If the argument is omitted, PREFIX (derived
- from `--prefix=PREFIX') is assumed.
-
- `--with-libiconv' is shorthand option for GNU libiconv.
-
- --with-libiconv=/usr/local
-
- This is equivalent to:
-
- --with-iconv='-L/usr/local/lib -R/usr/local/lib -liconv'
-
- `--with-libiconv' assumes that your C compiler has `-R'
- option, and that the option adds the specified run-time path
- to an executable binary. If `-R' option of your compiler has
- different meaning, or your compiler lacks the option, you
- should use `--with-iconv' option instead. Binary command
- without run-time path information might be unexecutable.
- In that case, you would see an error message like:
-
- error in loading shared libraries: libiconv.so.2: cannot
- open shared object file
-
- If both `--with-libiconv' and `--with-iconv' options are
- specified, `--with-iconv' is prior to `--with-libiconv'.
-
- --with-iconv=ICONV_LIBSPEC
- If your libc doesn't provide iconv(), you need to specify the
- library containing iconv() with this option. `ICONV_LIBSPEC'
- is the argument(s) to `cc' or `ld' to link the library, for
- example, `--with-iconv="-L/usr/local/lib -liconv"'.
- You don't need to specify the header file directory for "iconv.h"
- to the compiler, as it isn't included directly by bind-9 with
- this patch.
-
- --with-idnlib=IDN_LIBSPEC
- With this option, you can explicitly specify the argument(s)
- to `cc' or `ld' to link the idnkit's library, `libidnkit'. If
- this option is not specified, `-L${PREFIX}/lib -lidnkit' is
- assumed, where ${PREFIX} is the installation prefix specified
- with `--with-idn' option above. You may need to use this
- option to specify extra arguments, for example,
- `--with-idnlib="-L/usr/local/lib -R/usr/local/lib -lidnkit"'.
-
-Please consult `README' for other configuration options.
-
-Note that if you want to specify some extra header file directories,
-you should use the environment variable STD_CINCLUDES instead of
-CFLAGS, as described in README.
-
-2. Compilation and installation
-
-After running "configure", just do
-
- make
- make install
-
-for compiling and installing.
-
-
-* Contact information
-
-Please see http//www.nic.ad.jp/en/idn/ for the latest news
-about idnkit and this patch.
-
-Bug reports and comments on this kit should be sent to
-mdnkit-bugs@nic.ad.jp and idn-cmt@nic.ad.jp, respectively.
-
-; $Id: README.idnkit,v 1.2.762.1 2009-01-18 23:25:14 marka Exp $
diff --git a/contrib/bind9/README.pkcs11 b/contrib/bind9/README.pkcs11
deleted file mode 100644
index b58640d..0000000
--- a/contrib/bind9/README.pkcs11
+++ /dev/null
@@ -1,61 +0,0 @@
-
- BIND-9 PKCS#11 support
-
-Prerequisite
-
-The PKCS#11 support needs a PKCS#11 OpenSSL engine based on the Solaris one,
-released the 2007-11-21 for OpenSSL 0.9.8g, with a bug fix (call to free)
-and some improvements, including user friendly PIN management.
-
-Compilation
-
-"configure --with-pkcs11 ..."
-
-PKCS#11 Libraries
-
-Tested with Solaris one with a SCA board and with openCryptoki with the
-software token.
-
-OpenSSL Engines
-
-With PKCS#11 support the PKCS#11 engine is statically loaded but at its
-initialization it dynamically loads the PKCS#11 objects.
-Even the pre commands are therefore unused they are defined with:
- SO_PATH:
- define: PKCS11_SO_PATH
- default: /usr/local/lib/engines/engine_pkcs11.so
- MODULE_PATH:
- define: PKCS11_MODULE_PATH
- default: /usr/lib/libpkcs11.so
-Without PKCS#11 support, a specific OpenSSL engine can be still used
-by defining ENGINE_ID at compile time.
-
-PKCS#11 tools
-
-The contrib/pkcs11-keygen directory contains a set of experimental tools
-to handle keys stored in a Hardware Security Module at the benefit of BIND.
-
-The patch for OpenSSL 0.9.8g is in this directory. Read its README.pkcs11
-for the way to use it (these are the original notes so with the original
-path, etc. Define OPENCRYPTOKI to use it with openCryptoki.)
-
-PIN management
-
-With the just fixed PKCS#11 OpenSSL engine, the PIN should be entered
-each time it is required. With the improved engine, the PIN should be
-entered the first time it is required or can be configured in the
-OpenSSL configuration file (aka. openssl.cnf) by adding in it:
- - at the beginning:
- openssl_conf = openssl_def
- - at any place these sections:
- [ openssl_def ]
- engines = engine_section
- [ engine_section ]
- pkcs11 = pkcs11_section
- [ pkcs11_section ]
- PIN = put__your__pin__value__here
-
-Note
-
-Some names here are registered trademarks, at least Solaris is a trademark
-of Sun Microsystems Inc...
diff --git a/contrib/bind9/acconfig.h b/contrib/bind9/acconfig.h
index d64404a..d9da221 100644
--- a/contrib/bind9/acconfig.h
+++ b/contrib/bind9/acconfig.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acconfig.h,v 1.51.334.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: acconfig.h,v 1.53 2008-12-01 23:47:44 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/bin/Makefile.in b/contrib/bind9/bin/Makefile.in
index 1694268..d263d79 100644
--- a/contrib/bind9/bin/Makefile.in
+++ b/contrib/bind9/bin/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,13 +13,14 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.25 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.29 2009-10-05 12:07:08 fdupont Exp $
srcdir = @srcdir@
VPATH = @srcdir@
top_srcdir = @top_srcdir@
-SUBDIRS = named rndc dig dnssec tests nsupdate check
+SUBDIRS = named rndc dig dnssec tests tools nsupdate \
+ check confgen @PKCS11_TOOLS@
TARGETS =
@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/bin/check/Makefile.in b/contrib/bind9/bin/check/Makefile.in
index 46271c7..d5827dc 100644
--- a/contrib/bind9/bin/check/Makefile.in
+++ b/contrib/bind9/bin/check/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.32 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.36 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -32,6 +32,7 @@ CWARNINGS =
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@
@@ -39,7 +40,8 @@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
ISCDEPLIBS = ../../lib/isc/libisc.@A@
BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@
-LIBS = @LIBS@
+LIBS = ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@
SUBDIRS =
@@ -69,14 +71,14 @@ named-checkzone.@O@: named-checkzone.c
named-checkconf@EXEEXT@: named-checkconf.@O@ check-tool.@O@ ${ISCDEPLIBS} \
${ISCCFGDEPLIBS} ${BIND9DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- named-checkconf.@O@ check-tool.@O@ ${BIND9LIBS} ${ISCCFGLIBS} \
- ${DNSLIBS} ${ISCLIBS} ${LIBS}
+ export BASEOBJS="named-checkconf.@O@ check-tool.@O@"; \
+ export LIBS0="${BIND9LIBS} ${ISCCFGLIBS} ${DNSLIBS}"; \
+ ${FINALBUILDCMD}
named-checkzone@EXEEXT@: named-checkzone.@O@ check-tool.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- named-checkzone.@O@ check-tool.@O@ ${ISCCFGLIBS} ${DNSLIBS} \
- ${ISCLIBS} ${LIBS}
+ export BASEOBJS="named-checkzone.@O@ check-tool.@O@"; \
+ export LIBS0="${ISCCFGLIBS} ${DNSLIBS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/check/check-tool.c b/contrib/bind9/bin/check/check-tool.c
index ed9224b..4d2ca5c 100644
--- a/contrib/bind9/bin/check/check-tool.c
+++ b/contrib/bind9/bin/check/check-tool.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: check-tool.c,v 1.35.36.5 2010-09-07 23:46:05 tbox Exp $ */
+/* $Id: check-tool.c,v 1.41 2010-09-07 23:46:59 tbox Exp $ */
/*! \file */
@@ -601,8 +601,7 @@ load_zone(isc_mem_t *mctx, const char *zonename, const char *filename,
isc_buffer_add(&buffer, strlen(zonename));
dns_fixedname_init(&fixorigin);
origin = dns_fixedname_name(&fixorigin);
- CHECK(dns_name_fromtext(origin, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(origin, &buffer, dns_rootname, 0, NULL));
CHECK(dns_zone_setorigin(zone, origin));
CHECK(dns_zone_setdbtype(zone, 1, (const char * const *) dbtype));
CHECK(dns_zone_setfile2(zone, filename, fileformat));
diff --git a/contrib/bind9/bin/check/check-tool.h b/contrib/bind9/bin/check/check-tool.h
index f9273ff..4371ae2 100644
--- a/contrib/bind9/bin/check/check-tool.h
+++ b/contrib/bind9/bin/check/check-tool.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: check-tool.h,v 1.14.334.2 2010-09-07 23:46:05 tbox Exp $ */
+/* $Id: check-tool.h,v 1.16 2010-09-07 23:46:59 tbox Exp $ */
#ifndef CHECK_TOOL_H
#define CHECK_TOOL_H
diff --git a/contrib/bind9/bin/check/named-checkconf.8 b/contrib/bind9/bin/check/named-checkconf.8
index 7131007..fabcfa9 100644
--- a/contrib/bind9/bin/check/named-checkconf.8
+++ b/contrib/bind9/bin/check/named-checkconf.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2000-2002 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named-checkconf.8,v 1.30.334.1 2009-07-11 01:55:20 tbox Exp $
+.\" $Id: named-checkconf.8,v 1.33 2009-12-29 01:14:03 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,11 +33,29 @@
named\-checkconf \- named configuration file syntax checking tool
.SH "SYNOPSIS"
.HP 16
-\fBnamed\-checkconf\fR [\fB\-h\fR] [\fB\-v\fR] [\fB\-j\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] {filename} [\fB\-z\fR]
+\fBnamed\-checkconf\fR [\fB\-h\fR] [\fB\-v\fR] [\fB\-j\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] {filename} [\fB\-p\fR] [\fB\-z\fR]
.SH "DESCRIPTION"
.PP
\fBnamed\-checkconf\fR
-checks the syntax, but not the semantics, of a named configuration file.
+checks the syntax, but not the semantics, of a
+\fBnamed\fR
+configuration file. The file is parsed and checked for syntax errors, along with all files included by it. If no file is specified,
+\fI/etc/named.conf\fR
+is read by default.
+.PP
+Note: files that
+\fBnamed\fR
+reads in separate parser contexts, such as
+\fIrndc.key\fR
+and
+\fIbind.keys\fR, are not automatically read by
+\fBnamed\-checkconf\fR. Configuration errors in these files may cause
+\fBnamed\fR
+to fail to run, even if
+\fBnamed\-checkconf\fR
+was successful.
+\fBnamed\-checkconf\fR
+can be run on these files explicitly, however.
.SH "OPTIONS"
.PP
\-h
@@ -59,6 +77,13 @@ Print the version of the
program and exit.
.RE
.PP
+\-p
+.RS 4
+Print out the
+\fInamed.conf\fR
+and included files in canonical form if no errors were detected.
+.RE
+.PP
\-z
.RS 4
Perform a test load of all master zones found in
@@ -88,7 +113,7 @@ BIND 9 Administrator Reference Manual.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2000\-2002 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/check/named-checkconf.c b/contrib/bind9/bin/check/named-checkconf.c
index 20983b5..521ed31 100644
--- a/contrib/bind9/bin/check/named-checkconf.c
+++ b/contrib/bind9/bin/check/named-checkconf.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: named-checkconf.c,v 1.46.222.4 2010-09-07 23:46:05 tbox Exp $ */
+/* $Id: named-checkconf.c,v 1.54 2010-09-07 01:49:08 marka Exp $ */
/*! \file */
@@ -59,9 +59,12 @@ isc_log_t *logc = NULL;
} while (0)
/*% usage */
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
- fprintf(stderr, "usage: %s [-h] [-j] [-v] [-z] [-t directory] "
+ fprintf(stderr, "usage: %s [-h] [-j] [-p] [-v] [-z] [-t directory] "
"[named.conf]\n", program);
exit(1);
}
@@ -203,6 +206,24 @@ configure_zone(const char *vclass, const char *view,
zfile = cfg_obj_asstring(fileobj);
obj = NULL;
+ if (get_maps(maps, "check-dup-records", &obj)) {
+ if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options |= DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else
+ INSIST(0);
+ } else {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ }
+
+ obj = NULL;
if (get_maps(maps, "check-mx", &obj)) {
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
zone_options |= DNS_ZONEOPT_CHECKMX;
@@ -387,6 +408,15 @@ load_zones_fromconfig(const cfg_obj_t *config, isc_mem_t *mctx) {
return (result);
}
+static void
+output(void *closure, const char *text, int textlen) {
+ UNUSED(closure);
+ if (fwrite(text, 1, textlen, stdout) != (size_t)textlen) {
+ perror("fwrite");
+ exit(1);
+ }
+}
+
/*% The main processing routine */
int
main(int argc, char **argv) {
@@ -399,10 +429,11 @@ main(int argc, char **argv) {
int exit_status = 0;
isc_entropy_t *ectx = NULL;
isc_boolean_t load_zones = ISC_FALSE;
+ isc_boolean_t print = ISC_FALSE;
isc_commandline_errprint = ISC_FALSE;
- while ((c = isc_commandline_parse(argc, argv, "dhjt:vz")) != EOF) {
+ while ((c = isc_commandline_parse(argc, argv, "dhjt:pvz")) != EOF) {
switch (c) {
case 'd':
debug++;
@@ -421,6 +452,10 @@ main(int argc, char **argv) {
}
break;
+ case 'p':
+ print = ISC_TRUE;
+ break;
+
case 'v':
printf(VERSION "\n");
exit(0);
@@ -485,6 +520,8 @@ main(int argc, char **argv) {
exit_status = 1;
}
+ if (print && exit_status == 0)
+ cfg_print(config, output, NULL);
cfg_obj_destroy(parser, &config);
cfg_parser_destroy(&parser);
diff --git a/contrib/bind9/bin/check/named-checkconf.docbook b/contrib/bind9/bin/check/named-checkconf.docbook
index e0c43d1..fe12cb3 100644
--- a/contrib/bind9/bin/check/named-checkconf.docbook
+++ b/contrib/bind9/bin/check/named-checkconf.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkconf.docbook,v 1.19 2007-06-19 06:58:03 marka Exp $ -->
+<!-- $Id: named-checkconf.docbook,v 1.22 2009-12-28 23:21:16 each Exp $ -->
<refentry id="man.named-checkconf">
<refentryinfo>
<date>June 14, 2000</date>
@@ -35,6 +35,7 @@
<year>2004</year>
<year>2005</year>
<year>2007</year>
+ <year>2009</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -58,6 +59,7 @@
<arg><option>-j</option></arg>
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
<arg choice="req">filename</arg>
+ <arg><option>-p</option></arg>
<arg><option>-z</option></arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -65,8 +67,21 @@
<refsect1>
<title>DESCRIPTION</title>
<para><command>named-checkconf</command>
- checks the syntax, but not the semantics, of a named
- configuration file.
+ checks the syntax, but not the semantics, of a
+ <command>named</command> configuration file. The file is parsed
+ and checked for syntax errors, along with all files included by it.
+ If no file is specified, <filename>/etc/named.conf</filename> is read
+ by default.
+ </para>
+ <para>
+ Note: files that <command>named</command> reads in separate
+ parser contexts, such as <filename>rndc.key</filename> and
+ <filename>bind.keys</filename>, are not automatically read
+ by <command>named-checkconf</command>. Configuration
+ errors in these files may cause <command>named</command> to
+ fail to run, even if <command>named-checkconf</command> was
+ successful. <command>named-checkconf</command> can be run
+ on these files explicitly, however.
</para>
</refsect1>
@@ -87,8 +102,7 @@
<term>-t <replaceable class="parameter">directory</replaceable></term>
<listitem>
<para>
- Chroot to <filename>directory</filename> so that
- include
+ Chroot to <filename>directory</filename> so that include
directives in the configuration file are processed as if
run by a similarly chrooted named.
</para>
@@ -106,6 +120,16 @@
</varlistentry>
<varlistentry>
+ <term>-p</term>
+ <listitem>
+ <para>
+ Print out the <filename>named.conf</filename> and included files
+ in canonical form if no errors were detected.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-z</term>
<listitem>
<para>
diff --git a/contrib/bind9/bin/check/named-checkconf.html b/contrib/bind9/bin/check/named-checkconf.html
index 458b486..f5e4cd3 100644
--- a/contrib/bind9/bin/check/named-checkconf.html
+++ b/contrib/bind9/bin/check/named-checkconf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkconf.html,v 1.30.334.1 2009-07-11 01:55:20 tbox Exp $ -->
+<!-- $Id: named-checkconf.html,v 1.33 2009-12-29 01:14:03 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,17 +29,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-z</code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-p</code>] [<code class="option">-z</code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543387"></a><h2>DESCRIPTION</h2>
+<a name="id2543395"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkconf</strong></span>
- checks the syntax, but not the semantics, of a named
- configuration file.
+ checks the syntax, but not the semantics, of a
+ <span><strong class="command">named</strong></span> configuration file. The file is parsed
+ and checked for syntax errors, along with all files included by it.
+ If no file is specified, <code class="filename">/etc/named.conf</code> is read
+ by default.
+ </p>
+<p>
+ Note: files that <span><strong class="command">named</strong></span> reads in separate
+ parser contexts, such as <code class="filename">rndc.key</code> and
+ <code class="filename">bind.keys</code>, are not automatically read
+ by <span><strong class="command">named-checkconf</strong></span>. Configuration
+ errors in these files may cause <span><strong class="command">named</strong></span> to
+ fail to run, even if <span><strong class="command">named-checkconf</strong></span> was
+ successful. <span><strong class="command">named-checkconf</strong></span> can be run
+ on these files explicitly, however.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543399"></a><h2>OPTIONS</h2>
+<a name="id2543444"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-h</span></dt>
<dd><p>
@@ -47,8 +60,7 @@
</p></dd>
<dt><span class="term">-t <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Chroot to <code class="filename">directory</code> so that
- include
+ Chroot to <code class="filename">directory</code> so that include
directives in the configuration file are processed as if
run by a similarly chrooted named.
</p></dd>
@@ -57,6 +69,11 @@
Print the version of the <span><strong class="command">named-checkconf</strong></span>
program and exit.
</p></dd>
+<dt><span class="term">-p</span></dt>
+<dd><p>
+ Print out the <code class="filename">named.conf</code> and included files
+ in canonical form if no errors were detected.
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
Perform a test load of all master zones found in
@@ -74,21 +91,21 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543507"></a><h2>RETURN VALUES</h2>
+<a name="id2543568"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkconf</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543518"></a><h2>SEE ALSO</h2>
+<a name="id2543579"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543548"></a><h2>AUTHOR</h2>
+<a name="id2543609"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/check/named-checkzone.8 b/contrib/bind9/bin/check/named-checkzone.8
index e5f0790..1bb7846 100644
--- a/contrib/bind9/bin/check/named-checkzone.8
+++ b/contrib/bind9/bin/check/named-checkzone.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2000-2002 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named-checkzone.8,v 1.42.334.3 2009-11-11 01:56:22 tbox Exp $
+.\" $Id: named-checkzone.8,v 1.47 2010-01-17 01:14:02 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,9 +33,9 @@
named\-checkzone, named\-compilezone \- zone file validity checking or converting tool
.SH "SYNOPSIS"
.HP 16
-\fBnamed\-checkzone\fR [\fB\-d\fR] [\fB\-h\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-M\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-S\ \fR\fB\fImode\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename}
+\fBnamed\-checkzone\fR [\fB\-d\fR] [\fB\-h\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-M\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-r\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-S\ \fR\fB\fImode\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {zonename} {filename}
.HP 18
-\fBnamed\-compilezone\fR [\fB\-d\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-C\ \fR\fB\fImode\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-o\ \fR\fB\fIfilename\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {\fB\-o\ \fR\fB\fIfilename\fR\fR} {zonename} {filename}
+\fBnamed\-compilezone\fR [\fB\-d\fR] [\fB\-j\fR] [\fB\-q\fR] [\fB\-v\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-C\ \fR\fB\fImode\fR\fR] [\fB\-f\ \fR\fB\fIformat\fR\fR] [\fB\-F\ \fR\fB\fIformat\fR\fR] [\fB\-i\ \fR\fB\fImode\fR\fR] [\fB\-k\ \fR\fB\fImode\fR\fR] [\fB\-m\ \fR\fB\fImode\fR\fR] [\fB\-n\ \fR\fB\fImode\fR\fR] [\fB\-r\ \fR\fB\fImode\fR\fR] [\fB\-s\ \fR\fB\fIstyle\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-w\ \fR\fB\fIdirectory\fR\fR] [\fB\-D\fR] [\fB\-W\ \fR\fB\fImode\fR\fR] {\fB\-o\ \fR\fB\fIfilename\fR\fR} {zonename} {filename}
.SH "DESCRIPTION"
.PP
\fBnamed\-checkzone\fR
@@ -201,6 +201,15 @@ then write to standard out. This is mandatory for
\fBnamed\-compilezone\fR.
.RE
.PP
+\-r \fImode\fR
+.RS 4
+Check for records that are treated as different by DNSSEC but are semantically equal in plain DNS. Possible modes are
+\fB"fail"\fR,
+\fB"warn"\fR
+(default) and
+\fB"ignore"\fR.
+.RE
+.PP
\-s \fIstyle\fR
.RS 4
Specify the style of the dumped zone file. Possible styles are
@@ -272,7 +281,7 @@ BIND 9 Administrator Reference Manual.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2004\-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004\-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2000\-2002 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/check/named-checkzone.c b/contrib/bind9/bin/check/named-checkzone.c
index 3b86e57..100e809 100644
--- a/contrib/bind9/bin/check/named-checkzone.c
+++ b/contrib/bind9/bin/check/named-checkzone.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: named-checkzone.c,v 1.51.34.6 2010-09-07 23:46:06 tbox Exp $ */
+/* $Id: named-checkzone.c,v 1.61 2010-09-07 23:46:59 tbox Exp $ */
/*! \file */
@@ -70,6 +70,9 @@ static enum { progmode_check, progmode_compile } progmode;
} \
} while (0)
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
fprintf(stderr,
@@ -77,12 +80,13 @@ usage(void) {
"[-f inputformat] [-F outputformat] "
"[-t directory] [-w directory] [-k (ignore|warn|fail)] "
"[-n (ignore|warn|fail)] [-m (ignore|warn|fail)] "
+ "[-r (ignore|warn|fail)] "
"[-i (full|full-sibling|local|local-sibling|none)] "
"[-M (ignore|warn|fail)] [-S (ignore|warn|fail)] "
"[-W (ignore|warn)] "
"%s zonename filename\n",
prog_name,
- progmode == progmode_check ? "[-o filename]" : "{-o filename}");
+ progmode == progmode_check ? "[-o filename]" : "-o filename");
exit(1);
}
@@ -140,17 +144,19 @@ main(int argc, char **argv) {
if (progmode == progmode_compile) {
zone_options |= (DNS_ZONEOPT_CHECKNS |
DNS_ZONEOPT_FATALNS |
+ DNS_ZONEOPT_CHECKDUPRR |
DNS_ZONEOPT_CHECKNAMES |
DNS_ZONEOPT_CHECKNAMESFAIL |
DNS_ZONEOPT_CHECKWILDCARD);
- }
+ } else
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
#define ARGCMP(X) (strcmp(isc_commandline_argument, X) == 0)
isc_commandline_errprint = ISC_FALSE;
while ((c = isc_commandline_parse(argc, argv,
- "c:df:hi:jk:m:n:qs:t:o:vw:DF:M:S:W:"))
+ "c:df:hi:jk:m:n:qr:s:t:o:vw:DF:M:S:W:"))
!= EOF) {
switch (c) {
case 'c':
@@ -262,16 +268,27 @@ main(int argc, char **argv) {
}
break;
+ case 'o':
+ output_filename = isc_commandline_argument;
+ break;
+
case 'q':
quiet++;
break;
- case 't':
- result = isc_dir_chroot(isc_commandline_argument);
- if (result != ISC_R_SUCCESS) {
- fprintf(stderr, "isc_dir_chroot: %s: %s\n",
- isc_commandline_argument,
- isc_result_totext(result));
+ case 'r':
+ if (ARGCMP("warn")) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR;
+ zone_options &= ~DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (ARGCMP("fail")) {
+ zone_options |= DNS_ZONEOPT_CHECKDUPRR |
+ DNS_ZONEOPT_CHECKDUPRRFAIL;
+ } else if (ARGCMP("ignore")) {
+ zone_options &= ~(DNS_ZONEOPT_CHECKDUPRR |
+ DNS_ZONEOPT_CHECKDUPRRFAIL);
+ } else {
+ fprintf(stderr, "invalid argument to -r: %s\n",
+ isc_commandline_argument);
exit(1);
}
break;
@@ -289,8 +306,14 @@ main(int argc, char **argv) {
}
break;
- case 'o':
- output_filename = isc_commandline_argument;
+ case 't':
+ result = isc_dir_chroot(isc_commandline_argument);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "isc_dir_chroot: %s: %s\n",
+ isc_commandline_argument,
+ isc_result_totext(result));
+ exit(1);
+ }
break;
case 'v':
diff --git a/contrib/bind9/bin/check/named-checkzone.docbook b/contrib/bind9/bin/check/named-checkzone.docbook
index 0e04c03..415ee1c 100644
--- a/contrib/bind9/bin/check/named-checkzone.docbook
+++ b/contrib/bind9/bin/check/named-checkzone.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkzone.docbook,v 1.34.334.3 2009-11-10 20:01:41 each Exp $ -->
+<!-- $Id: named-checkzone.docbook,v 1.40 2010-01-16 23:48:15 tbox Exp $ -->
<refentry id="man.named-checkzone">
<refentryinfo>
<date>June 13, 2000</date>
@@ -37,6 +37,7 @@
<year>2006</year>
<year>2007</year>
<year>2009</year>
+ <year>2010</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -69,6 +70,8 @@
<arg><option>-m <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-M <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-n <replaceable class="parameter">mode</replaceable></option></arg>
+ <arg><option>-o <replaceable class="parameter">filename</replaceable></option></arg>
+ <arg><option>-r <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-s <replaceable class="parameter">style</replaceable></option></arg>
<arg><option>-S <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
@@ -92,7 +95,7 @@
<arg><option>-k <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-m <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-n <replaceable class="parameter">mode</replaceable></option></arg>
- <arg><option>-o <replaceable class="parameter">filename</replaceable></option></arg>
+ <arg><option>-r <replaceable class="parameter">mode</replaceable></option></arg>
<arg><option>-s <replaceable class="parameter">style</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-w <replaceable class="parameter">directory</replaceable></option></arg>
@@ -320,6 +323,19 @@
</varlistentry>
<varlistentry>
+ <term>-r <replaceable class="parameter">mode</replaceable></term>
+ <listitem>
+ <para>
+ Check for records that are treated as different by DNSSEC but
+ are semantically equal in plain DNS.
+ Possible modes are <command>"fail"</command>,
+ <command>"warn"</command> (default) and
+ <command>"ignore"</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-s <replaceable class="parameter">style</replaceable></term>
<listitem>
<para>
diff --git a/contrib/bind9/bin/check/named-checkzone.html b/contrib/bind9/bin/check/named-checkzone.html
index 24f5c05..e0532af 100644
--- a/contrib/bind9/bin/check/named-checkzone.html
+++ b/contrib/bind9/bin/check/named-checkzone.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2002 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named-checkzone.html,v 1.42.334.3 2009-11-11 01:56:22 tbox Exp $ -->
+<!-- $Id: named-checkzone.html,v 1.47 2010-01-17 01:14:02 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,11 +29,11 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
-<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543674"></a><h2>DESCRIPTION</h2>
+<a name="id2543694"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkzone</strong></span>
checks the syntax and integrity of a zone file. It performs the
same checks as <span><strong class="command">named</strong></span> does when loading a
@@ -53,7 +53,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543709"></a><h2>OPTIONS</h2>
+<a name="id2543730"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-d</span></dt>
<dd><p>
@@ -177,6 +177,14 @@
write to standard out.
This is mandatory for <span><strong class="command">named-compilezone</strong></span>.
</p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>mode</code></em></span></dt>
+<dd><p>
+ Check for records that are treated as different by DNSSEC but
+ are semantically equal in plain DNS.
+ Possible modes are <span><strong class="command">"fail"</strong></span>,
+ <span><strong class="command">"warn"</strong></span> (default) and
+ <span><strong class="command">"ignore"</strong></span>.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>style</code></em></span></dt>
<dd><p>
Specify the style of the dumped zone file.
@@ -239,14 +247,14 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544330"></a><h2>RETURN VALUES</h2>
+<a name="id2544377"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkzone</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544342"></a><h2>SEE ALSO</h2>
+<a name="id2544389"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>,
<em class="citetitle">RFC 1035</em>,
@@ -254,7 +262,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544375"></a><h2>AUTHOR</h2>
+<a name="id2544422"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/confgen/Makefile.in b/contrib/bind9/bin/confgen/Makefile.in
new file mode 100644
index 0000000..da35879
--- /dev/null
+++ b/contrib/bind9/bin/confgen/Makefile.in
@@ -0,0 +1,101 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.8 2009-12-05 23:31:40 each Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include ${ISC_INCLUDES} ${ISCCC_INCLUDES} \
+ ${ISCCFG_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
+ISCCCLIBS = ../../lib/isccc/libisccc.@A@
+ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
+DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
+BIND9LIBS = ../../lib/bind9/libbind9.@A@
+
+ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
+ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@
+ISCDEPLIBS = ../../lib/isc/libisc.@A@
+DNSDEPLIBS = ../../lib/dns/libdns.@A@
+BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@
+
+RNDCLIBS = ${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS} ${ISCLIBS} @LIBS@
+RNDCDEPLIBS = ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${BIND9DEPLIBS} ${DNSDEPLIBS} ${ISCDEPLIBS}
+
+LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@
+
+NOSYMLIBS = ${DNSLIBS} ${ISCNOSYMLIBS} @LIBS@
+
+CONFDEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS}
+
+SRCS= rndc-confgen.c ddns-confgen.c
+
+SUBDIRS = unix
+
+TARGETS = rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@
+
+MANPAGES = rndc-confgen.8 ddns-confgen.8
+
+HTMLPAGES = rndc-confgen.html ddns-confgen.html
+
+MANOBJS = ${MANPAGES} ${HTMLPAGES}
+
+UOBJS = unix/os.@O@
+
+@BIND9_MAKE_RULES@
+
+rndc-confgen.@O@: rndc-confgen.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \
+ -c ${srcdir}/rndc-confgen.c
+
+ddns-confgen.@O@: ddns-confgen.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c ${srcdir}/ddns-confgen.c
+
+rndc-confgen@EXEEXT@: rndc-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS} ${CONFDEPLIBS}
+ export BASEOBJS="rndc-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
+
+ddns-confgen@EXEEXT@: ddns-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS} ${CONFDEPLIBS}
+ export BASEOBJS="ddns-confgen.@O@ util.@O@ keygen.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
+
+doc man:: ${MANOBJS}
+
+docclean manclean maintainer-clean::
+ rm -f ${MANOBJS}
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir}
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8
+
+install:: rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@ installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc-confgen@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} ddns-confgen@EXEEXT@ ${DESTDIR}${sbindir}
+ ${INSTALL_DATA} ${srcdir}/rndc-confgen.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/ddns-confgen.8 ${DESTDIR}${mandir}/man8
+
+clean distclean maintainer-clean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.8 b/contrib/bind9/bin/confgen/ddns-confgen.8
new file mode 100644
index 0000000..d69af39
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.8
@@ -0,0 +1,143 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: ddns-confgen.8,v 1.10 2009-09-19 01:14:52 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: ddns\-confgen
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Jan 29, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "DDNS\-CONFGEN" "8" "Jan 29, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+ddns\-confgen \- ddns key generation tool
+.SH "SYNOPSIS"
+.HP 13
+\fBddns\-confgen\fR [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkeyname\fR\fR] [\fB\-r\ \fR\fB\fIrandomfile\fR\fR] [\-s\ \fIname\fR | \-z\ \fIzone\fR] [\fB\-q\fR] [name]
+.SH "DESCRIPTION"
+.PP
+\fBddns\-confgen\fR
+generates a key for use by
+\fBnsupdate\fR
+and
+\fBnamed\fR. It simplifies configuration of dynamic zones by generating a key and providing the
+\fBnsupdate\fR
+and
+\fBnamed.conf\fR
+syntax that will be needed to use it, including an example
+\fBupdate\-policy\fR
+statement.
+.PP
+If a domain name is specified on the command line, it will be used in the name of the generated key and in the sample
+\fBnamed.conf\fR
+syntax. For example,
+\fBddns\-confgen example.com\fR
+would generate a key called "ddns\-key.example.com", and sample
+\fBnamed.conf\fR
+command that could be used in the zone definition for "example.com".
+.PP
+Note that
+\fBnamed\fR
+itself can configure a local DDNS key for use with
+\fBnsupdate \-l\fR.
+\fBddns\-confgen\fR
+is only needed when a more elaborate configuration is required: for instance, if
+\fBnsupdate\fR
+is to be used from a remote system.
+.SH "OPTIONS"
+.PP
+\-a \fIalgorithm\fR
+.RS 4
+Specifies the algorithm to use for the TSIG key. Available choices are: hmac\-md5, hmac\-sha1, hmac\-sha224, hmac\-sha256, hmac\-sha384 and hmac\-sha512. The default is hmac\-sha256.
+.RE
+.PP
+\-h
+.RS 4
+Prints a short summary of the options and arguments to
+\fBddns\-confgen\fR.
+.RE
+.PP
+\-k \fIkeyname\fR
+.RS 4
+Specifies the key name of the DDNS authentication key. The default is
+\fBddns\-key\fR
+when neither the
+\fB\-s\fR
+nor
+\fB\-z\fR
+option is specified; otherwise, the default is
+\fBddns\-key\fR
+as a separate label followed by the argument of the option, e.g.,
+\fBddns\-key.example.com.\fR
+The key name must have the format of a valid domain name, consisting of letters, digits, hyphens and periods.
+.RE
+.PP
+\-q
+.RS 4
+Quiet mode: Print only the key, with no explanatory text or usage examples.
+.RE
+.PP
+\-r \fIrandomfile\fR
+.RS 4
+Specifies a source of random data for generating the authorization. If the operating system does not provide a
+\fI/dev/random\fR
+or equivalent device, the default source of randomness is keyboard input.
+\fIrandomdev\fR
+specifies the name of a character device or file containing random data to be used instead of the default. The special value
+\fIkeyboard\fR
+indicates that keyboard input should be used.
+.RE
+.PP
+\-s \fIname\fR
+.RS 4
+Single host mode: The example
+\fBnamed.conf\fR
+text shows how to set an update policy for the specified
+\fIname\fR
+using the "name" nametype. The default key name is ddns\-key.\fIname\fR. Note that the "self" nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the
+\fB\-z\fR
+option.
+.RE
+.PP
+\-z \fIzone\fR
+.RS 4
+zone mode: The example
+\fBnamed.conf\fR
+text shows how to set an update policy for the specified
+\fIzone\fR
+using the "zonesub" nametype, allowing updates to all subdomain names within that
+\fIzone\fR. This option cannot be used with the
+\fB\-s\fR
+option.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBnsupdate\fR(1),
+\fBnamed.conf\fR(5),
+\fBnamed\fR(8),
+BIND 9 Administrator Reference Manual.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.c b/contrib/bind9/bin/confgen/ddns-confgen.c
new file mode 100644
index 0000000..814a565
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.c
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ddns-confgen.c,v 1.9 2009-09-29 15:06:05 fdupont Exp $ */
+
+/*! \file */
+
+/**
+ * ddns-confgen generates configuration files for dynamic DNS. It can
+ * be used as a convenient alternative to writing the ddns.key file
+ * and the corresponding key and update-policy statements in named.conf.
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <isc/assertions.h>
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/keyboard.h>
+#include <isc/mem.h>
+#include <isc/net.h>
+#include <isc/print.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/time.h>
+#include <isc/util.h>
+
+#include <dns/keyvalues.h>
+#include <dns/name.h>
+
+#include <dst/dst.h>
+#include <confgen/os.h>
+
+#include "util.h"
+#include "keygen.h"
+
+#define DEFAULT_KEYNAME "ddns-key"
+
+static char program[256];
+const char *progname;
+
+isc_boolean_t verbose = ISC_FALSE;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(int status) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(int status) {
+
+ fprintf(stderr, "\
+Usage:\n\
+ %s [-a alg] [-k keyname] [-r randomfile] [-q] [-s name | -z zone]\n\
+ -a alg: algorithm (default hmac-sha256)\n\
+ -k keyname: name of the key as it will be used in named.conf\n\
+ -r randomfile: source of random data (use \"keyboard\" for key timing)\n\
+ -s name: domain name to be updated using the created key\n\
+ -z zone: name of the zone as it will be used in named.conf\n\
+ -q: quiet mode: print the key, with no explanatory text\n",
+ progname);
+
+ exit (status);
+}
+
+int
+main(int argc, char **argv) {
+ isc_boolean_t show_final_mem = ISC_FALSE;
+ isc_boolean_t quiet = ISC_FALSE;
+ isc_buffer_t key_txtbuffer;
+ char key_txtsecret[256];
+ isc_mem_t *mctx = NULL;
+ isc_result_t result = ISC_R_SUCCESS;
+ const char *randomfile = NULL;
+ const char *keyname = NULL;
+ const char *zone = NULL;
+ const char *self_domain = NULL;
+ char *keybuf = NULL;
+ dns_secalg_t alg = DST_ALG_HMACSHA256;
+ const char *algname = alg_totext(alg);
+ int keysize = 256;
+ int len = 0;
+ int ch;
+
+ result = isc_file_progname(*argv, program, sizeof(program));
+ if (result != ISC_R_SUCCESS)
+ memcpy(program, "ddns-confgen", 13);
+ progname = program;
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((ch = isc_commandline_parse(argc, argv,
+ "a:hk:Mmr:qs:Vy:z:")) != -1) {
+ switch (ch) {
+ case 'a':
+ algname = isc_commandline_argument;
+ alg = alg_fromtext(algname);
+ if (alg == DST_ALG_UNKNOWN)
+ fatal("Unsupported algorithm '%s'", algname);
+ keysize = alg_bits(alg);
+ break;
+ case 'h':
+ usage(0);
+ case 'k':
+ case 'y':
+ keyname = isc_commandline_argument;
+ break;
+ case 'M':
+ isc_mem_debugging = ISC_MEM_DEBUGTRACE;
+ break;
+ case 'm':
+ show_final_mem = ISC_TRUE;
+ break;
+ case 'q':
+ quiet = ISC_TRUE;
+ break;
+ case 'r':
+ randomfile = isc_commandline_argument;
+ break;
+ case 's':
+ self_domain = isc_commandline_argument;
+ break;
+ case 'V':
+ verbose = ISC_TRUE;
+ break;
+ case 'z':
+ zone = isc_commandline_argument;
+ break;
+ case '?':
+ if (isc_commandline_option != '?') {
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ usage(1);
+ } else
+ usage(0);
+ break;
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ argc -= isc_commandline_index;
+ argv += isc_commandline_index;
+
+ if (self_domain != NULL && zone != NULL)
+ usage(1); /* -s and -z cannot coexist */
+
+ if (argc > 0)
+ usage(1);
+
+ DO("create memory context", isc_mem_create(0, 0, &mctx));
+
+ if (keyname == NULL) {
+ const char *suffix = NULL;
+
+ keyname = DEFAULT_KEYNAME;
+ if (self_domain != NULL)
+ suffix = self_domain;
+ else if (zone != NULL)
+ suffix = zone;
+ if (suffix != NULL) {
+ len = strlen(keyname) + strlen(suffix) + 2;
+ keybuf = isc_mem_get(mctx, len);
+ if (keybuf == NULL)
+ fatal("failed to allocate memory for keyname");
+ snprintf(keybuf, len, "%s.%s", keyname, suffix);
+ keyname = (const char *) keybuf;
+ }
+ }
+
+ isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
+
+ generate_key(mctx, randomfile, alg, keysize, &key_txtbuffer);
+
+
+ if (!quiet)
+ printf("\
+# To activate this key, place the following in named.conf, and\n\
+# in a separate keyfile on the system or systems from which nsupdate\n\
+# will be run:\n");
+
+ printf("\
+key \"%s\" {\n\
+ algorithm %s;\n\
+ secret \"%.*s\";\n\
+};\n",
+ keyname, algname,
+ (int)isc_buffer_usedlength(&key_txtbuffer),
+ (char *)isc_buffer_base(&key_txtbuffer));
+
+ if (!quiet) {
+ if (self_domain != NULL) {
+ printf("\n\
+# Then, in the \"zone\" statement for the zone containing the\n\
+# name \"%s\", place an \"update-policy\" statement\n\
+# like this one, adjusted as needed for your preferred permissions:\n\
+update-policy {\n\
+ grant %s name %s ANY;\n\
+};\n",
+ self_domain, keyname, self_domain);
+ } else if (zone != NULL) {
+ printf("\n\
+# Then, in the \"zone\" definition statement for \"%s\",\n\
+# place an \"update-policy\" statement like this one, adjusted as \n\
+# needed for your preferred permissions:\n\
+update-policy {\n\
+ grant %s zonesub ANY;\n\
+};\n",
+ zone, keyname);
+ } else {
+ printf("\n\
+# Then, in the \"zone\" statement for each zone you wish to dynamically\n\
+# update, place an \"update-policy\" statement granting update permission\n\
+# to this key. For example, the following statement grants this key\n\
+# permission to update any name within the zone:\n\
+update-policy {\n\
+ grant %s zonesub ANY;\n\
+};\n",
+ keyname);
+ }
+
+ printf("\n\
+# After the keyfile has been placed, the following command will\n\
+# execute nsupdate using this key:\n\
+nsupdate -k <keyfile>\n");
+
+ }
+
+ if (keybuf != NULL)
+ isc_mem_put(mctx, keybuf, len);
+
+ if (show_final_mem)
+ isc_mem_stats(mctx, stderr);
+
+ isc_mem_destroy(&mctx);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.docbook b/contrib/bind9/bin/confgen/ddns-confgen.docbook
new file mode 100644
index 0000000..2b3e1c0
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.docbook
@@ -0,0 +1,218 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: ddns-confgen.docbook,v 1.6 2009-09-18 22:08:55 fdupont Exp $ -->
+<refentry id="man.ddns-confgen">
+ <refentryinfo>
+ <date>Jan 29, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>ddns-confgen</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>ddns-confgen</application></refname>
+ <refpurpose>ddns key generation tool</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>ddns-confgen</command>
+ <arg><option>-a <replaceable class="parameter">algorithm</replaceable></option></arg>
+ <arg><option>-h</option></arg>
+ <arg><option>-k <replaceable class="parameter">keyname</replaceable></option></arg>
+ <arg><option>-r <replaceable class="parameter">randomfile</replaceable></option></arg>
+ <group>
+ <arg choice="plain">-s <replaceable class="parameter">name</replaceable></arg>
+ <arg choice="plain">-z <replaceable class="parameter">zone</replaceable></arg>
+ </group>
+ <arg><option>-q</option></arg>
+ <arg choice="opt">name</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para><command>ddns-confgen</command>
+ generates a key for use by <command>nsupdate</command>
+ and <command>named</command>. It simplifies configuration
+ of dynamic zones by generating a key and providing the
+ <command>nsupdate</command> and <command>named.conf</command>
+ syntax that will be needed to use it, including an example
+ <command>update-policy</command> statement.
+ </para>
+
+ <para>
+ If a domain name is specified on the command line, it will
+ be used in the name of the generated key and in the sample
+ <command>named.conf</command> syntax. For example,
+ <command>ddns-confgen example.com</command> would
+ generate a key called "ddns-key.example.com", and sample
+ <command>named.conf</command> command that could be used
+ in the zone definition for "example.com".
+ </para>
+
+ <para>
+ Note that <command>named</command> itself can configure a
+ local DDNS key for use with <command>nsupdate -l</command>.
+ <command>ddns-confgen</command> is only needed when a
+ more elaborate configuration is required: for instance, if
+ <command>nsupdate</command> is to be used from a remote system.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-a <replaceable class="parameter">algorithm</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the algorithm to use for the TSIG key. Available
+ choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384 and hmac-sha512. The default is hmac-sha256.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-h</term>
+ <listitem>
+ <para>
+ Prints a short summary of the options and arguments to
+ <command>ddns-confgen</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-k <replaceable class="parameter">keyname</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the key name of the DDNS authentication key.
+ The default is <constant>ddns-key</constant> when neither
+ the <option>-s</option> nor <option>-z</option> option is
+ specified; otherwise, the default
+ is <constant>ddns-key</constant> as a separate label
+ followed by the argument of the option, e.g.,
+ <constant>ddns-key.example.com.</constant>
+ The key name must have the format of a valid domain name,
+ consisting of letters, digits, hyphens and periods.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-q</term>
+ <listitem>
+ <para>
+ Quiet mode: Print only the key, with no explanatory text or
+ usage examples.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-r <replaceable class="parameter">randomfile</replaceable></term>
+ <listitem>
+ <para>
+ Specifies a source of random data for generating the
+ authorization. If the operating system does not provide a
+ <filename>/dev/random</filename> or equivalent device, the
+ default source of randomness is keyboard input.
+ <filename>randomdev</filename> specifies the name of a
+ character device or file containing random data to be used
+ instead of the default. The special value
+ <filename>keyboard</filename> indicates that keyboard input
+ should be used.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-s <replaceable class="parameter">name</replaceable></term>
+ <listitem>
+ <para>
+ Single host mode: The example <command>named.conf</command> text
+ shows how to set an update policy for the specified
+ <replaceable class="parameter">name</replaceable>
+ using the "name" nametype.
+ The default key name is
+ ddns-key.<replaceable class="parameter">name</replaceable>.
+ Note that the "self" nametype cannot be used, since
+ the name to be updated may differ from the key name.
+ This option cannot be used with the <option>-z</option> option.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-z <replaceable class="parameter">zone</replaceable></term>
+ <listitem>
+ <para>
+ zone mode: The example <command>named.conf</command> text
+ shows how to set an update policy for the specified
+ <replaceable class="parameter">zone</replaceable>
+ using the "zonesub" nametype, allowing updates to all subdomain
+ names within
+ that <replaceable class="parameter">zone</replaceable>.
+ This option cannot be used with the <option>-s</option> option.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para><citerefentry>
+ <refentrytitle>nsupdate</refentrytitle><manvolnum>1</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>named.conf</refentrytitle><manvolnum>5</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/confgen/ddns-confgen.html b/contrib/bind9/bin/confgen/ddns-confgen.html
new file mode 100644
index 0000000..17c3f26
--- /dev/null
+++ b/contrib/bind9/bin/confgen/ddns-confgen.html
@@ -0,0 +1,141 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: ddns-confgen.html,v 1.10 2009-09-19 01:14:52 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>ddns-confgen</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.ddns-confgen"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">ddns-confgen</span> &#8212; ddns key generation tool</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">ddns-confgen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [ -s <em class="replaceable"><code>name</code></em> | -z <em class="replaceable"><code>zone</code></em> ] [<code class="option">-q</code>] [name]</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543395"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">ddns-confgen</strong></span>
+ generates a key for use by <span><strong class="command">nsupdate</strong></span>
+ and <span><strong class="command">named</strong></span>. It simplifies configuration
+ of dynamic zones by generating a key and providing the
+ <span><strong class="command">nsupdate</strong></span> and <span><strong class="command">named.conf</strong></span>
+ syntax that will be needed to use it, including an example
+ <span><strong class="command">update-policy</strong></span> statement.
+ </p>
+<p>
+ If a domain name is specified on the command line, it will
+ be used in the name of the generated key and in the sample
+ <span><strong class="command">named.conf</strong></span> syntax. For example,
+ <span><strong class="command">ddns-confgen example.com</strong></span> would
+ generate a key called "ddns-key.example.com", and sample
+ <span><strong class="command">named.conf</strong></span> command that could be used
+ in the zone definition for "example.com".
+ </p>
+<p>
+ Note that <span><strong class="command">named</strong></span> itself can configure a
+ local DDNS key for use with <span><strong class="command">nsupdate -l</strong></span>.
+ <span><strong class="command">ddns-confgen</strong></span> is only needed when a
+ more elaborate configuration is required: for instance, if
+ <span><strong class="command">nsupdate</strong></span> is to be used from a remote system.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543454"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
+<dd><p>
+ Specifies the algorithm to use for the TSIG key. Available
+ choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384 and hmac-sha512. The default is hmac-sha256.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Prints a short summary of the options and arguments to
+ <span><strong class="command">ddns-confgen</strong></span>.
+ </p></dd>
+<dt><span class="term">-k <em class="replaceable"><code>keyname</code></em></span></dt>
+<dd><p>
+ Specifies the key name of the DDNS authentication key.
+ The default is <code class="constant">ddns-key</code> when neither
+ the <code class="option">-s</code> nor <code class="option">-z</code> option is
+ specified; otherwise, the default
+ is <code class="constant">ddns-key</code> as a separate label
+ followed by the argument of the option, e.g.,
+ <code class="constant">ddns-key.example.com.</code>
+ The key name must have the format of a valid domain name,
+ consisting of letters, digits, hyphens and periods.
+ </p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Print only the key, with no explanatory text or
+ usage examples.
+ </p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>randomfile</code></em></span></dt>
+<dd><p>
+ Specifies a source of random data for generating the
+ authorization. If the operating system does not provide a
+ <code class="filename">/dev/random</code> or equivalent device, the
+ default source of randomness is keyboard input.
+ <code class="filename">randomdev</code> specifies the name of a
+ character device or file containing random data to be used
+ instead of the default. The special value
+ <code class="filename">keyboard</code> indicates that keyboard input
+ should be used.
+ </p></dd>
+<dt><span class="term">-s <em class="replaceable"><code>name</code></em></span></dt>
+<dd><p>
+ Single host mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>name</code></em>
+ using the "name" nametype.
+ The default key name is
+ ddns-key.<em class="replaceable"><code>name</code></em>.
+ Note that the "self" nametype cannot be used, since
+ the name to be updated may differ from the key name.
+ This option cannot be used with the <code class="option">-z</code> option.
+ </p></dd>
+<dt><span class="term">-z <em class="replaceable"><code>zone</code></em></span></dt>
+<dd><p>
+ zone mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>zone</code></em>
+ using the "zonesub" nametype, allowing updates to all subdomain
+ names within
+ that <em class="replaceable"><code>zone</code></em>.
+ This option cannot be used with the <code class="option">-s</code> option.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543642"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">nsupdate</span>(1)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named.conf</span>(5)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543681"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/confgen/include/confgen/os.h b/contrib/bind9/bin/confgen/include/confgen/os.h
new file mode 100644
index 0000000..bf80f00
--- /dev/null
+++ b/contrib/bind9/bin/confgen/include/confgen/os.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: os.h,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
+
+/*! \file */
+
+#ifndef RNDC_OS_H
+#define RNDC_OS_H 1
+
+#include <isc/lang.h>
+#include <stdio.h>
+
+ISC_LANG_BEGINDECLS
+
+int set_user(FILE *fd, const char *user);
+/*%<
+ * Set the owner of the file referenced by 'fd' to 'user'.
+ * Returns:
+ * 0 success
+ * -1 insufficient permissions, or 'user' does not exist.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif
diff --git a/contrib/bind9/bin/confgen/keygen.c b/contrib/bind9/bin/confgen/keygen.c
new file mode 100644
index 0000000..c259e7e
--- /dev/null
+++ b/contrib/bind9/bin/confgen/keygen.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keygen.c,v 1.4 2009-11-12 14:02:38 marka Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/keyboard.h>
+#include <isc/mem.h>
+#include <isc/result.h>
+#include <isc/string.h>
+
+#include <dns/keyvalues.h>
+#include <dns/name.h>
+
+#include <dst/dst.h>
+#include <confgen/os.h>
+
+#include "util.h"
+#include "keygen.h"
+
+/*%
+ * Convert algorithm type to string.
+ */
+const char *
+alg_totext(dns_secalg_t alg) {
+ switch (alg) {
+ case DST_ALG_HMACMD5:
+ return "hmac-md5";
+ case DST_ALG_HMACSHA1:
+ return "hmac-sha1";
+ case DST_ALG_HMACSHA224:
+ return "hmac-sha224";
+ case DST_ALG_HMACSHA256:
+ return "hmac-sha256";
+ case DST_ALG_HMACSHA384:
+ return "hmac-sha384";
+ case DST_ALG_HMACSHA512:
+ return "hmac-sha512";
+ default:
+ return "(unknown)";
+ }
+}
+
+/*%
+ * Convert string to algorithm type.
+ */
+dns_secalg_t
+alg_fromtext(const char *name) {
+ if (strcmp(name, "hmac-md5") == 0)
+ return DST_ALG_HMACMD5;
+ if (strcmp(name, "hmac-sha1") == 0)
+ return DST_ALG_HMACSHA1;
+ if (strcmp(name, "hmac-sha224") == 0)
+ return DST_ALG_HMACSHA224;
+ if (strcmp(name, "hmac-sha256") == 0)
+ return DST_ALG_HMACSHA256;
+ if (strcmp(name, "hmac-sha384") == 0)
+ return DST_ALG_HMACSHA384;
+ if (strcmp(name, "hmac-sha512") == 0)
+ return DST_ALG_HMACSHA512;
+ return DST_ALG_UNKNOWN;
+}
+
+/*%
+ * Return default keysize for a given algorithm type.
+ */
+int
+alg_bits(dns_secalg_t alg) {
+ switch (alg) {
+ case DST_ALG_HMACMD5:
+ return 128;
+ case DST_ALG_HMACSHA1:
+ return 160;
+ case DST_ALG_HMACSHA224:
+ return 224;
+ case DST_ALG_HMACSHA256:
+ return 256;
+ case DST_ALG_HMACSHA384:
+ return 384;
+ case DST_ALG_HMACSHA512:
+ return 512;
+ default:
+ return 0;
+ }
+}
+
+/*%
+ * Generate a key of size 'keysize' using entropy source 'randomfile',
+ * and place it in 'key_txtbuffer'
+ */
+void
+generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg,
+ int keysize, isc_buffer_t *key_txtbuffer) {
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_entropysource_t *entropy_source = NULL;
+ int open_keyboard = ISC_ENTROPY_KEYBOARDMAYBE;
+ int entropy_flags = 0;
+ isc_entropy_t *ectx = NULL;
+ isc_buffer_t key_rawbuffer;
+ isc_region_t key_rawregion;
+ char key_rawsecret[64];
+ dst_key_t *key = NULL;
+
+ switch (alg) {
+ case DST_ALG_HMACMD5:
+ if (keysize < 1 || keysize > 512)
+ fatal("keysize %d out of range (must be 1-512)\n",
+ keysize);
+ break;
+ case DST_ALG_HMACSHA256:
+ if (keysize < 1 || keysize > 256)
+ fatal("keysize %d out of range (must be 1-256)\n",
+ keysize);
+ break;
+ default:
+ fatal("unsupported algorithm %d\n", alg);
+ }
+
+
+ DO("create entropy context", isc_entropy_create(mctx, &ectx));
+
+ if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) {
+ randomfile = NULL;
+ open_keyboard = ISC_ENTROPY_KEYBOARDYES;
+ }
+ DO("start entropy source", isc_entropy_usebestsource(ectx,
+ &entropy_source,
+ randomfile,
+ open_keyboard));
+
+ entropy_flags = ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY;
+
+ DO("initialize dst library", dst_lib_init(mctx, ectx, entropy_flags));
+
+ DO("generate key", dst_key_generate(dns_rootname, alg,
+ keysize, 0, 0,
+ DNS_KEYPROTO_ANY,
+ dns_rdataclass_in, mctx, &key));
+
+ isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret));
+
+ DO("dump key to buffer", dst_key_tobuffer(key, &key_rawbuffer));
+
+ isc_buffer_usedregion(&key_rawbuffer, &key_rawregion);
+
+ DO("bsse64 encode secret", isc_base64_totext(&key_rawregion, -1, "",
+ key_txtbuffer));
+
+ /*
+ * Shut down the entropy source now so the "stop typing" message
+ * does not muck with the output.
+ */
+ if (entropy_source != NULL)
+ isc_entropy_destroysource(&entropy_source);
+
+ if (key != NULL)
+ dst_key_free(&key);
+
+ isc_entropy_detach(&ectx);
+ dst_lib_destroy();
+}
+
+/*%
+ * Write a key file to 'keyfile'. If 'user' is non-NULL,
+ * make that user the owner of the file. The key will have
+ * the name 'keyname' and the secret in the buffer 'secret'.
+ */
+void
+write_key_file(const char *keyfile, const char *user,
+ const char *keyname, isc_buffer_t *secret,
+ dns_secalg_t alg) {
+ isc_result_t result;
+ const char *algname = alg_totext(alg);
+ FILE *fd = NULL;
+
+ DO("create keyfile", isc_file_safecreate(keyfile, &fd));
+
+ if (user != NULL) {
+ if (set_user(fd, user) == -1)
+ fatal("unable to set file owner\n");
+ }
+
+ fprintf(fd, "key \"%s\" {\n\talgorithm %s;\n"
+ "\tsecret \"%.*s\";\n};\n",
+ keyname, algname,
+ (int)isc_buffer_usedlength(secret),
+ (char *)isc_buffer_base(secret));
+ fflush(fd);
+ if (ferror(fd))
+ fatal("write to %s failed\n", keyfile);
+ if (fclose(fd))
+ fatal("fclose(%s) failed\n", keyfile);
+ fprintf(stderr, "wrote key file \"%s\"\n", keyfile);
+}
+
diff --git a/contrib/bind9/bin/confgen/keygen.h b/contrib/bind9/bin/confgen/keygen.h
new file mode 100644
index 0000000..cea25dd
--- /dev/null
+++ b/contrib/bind9/bin/confgen/keygen.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keygen.h,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
+
+#ifndef RNDC_KEYGEN_H
+#define RNDC_KEYGEN_H 1
+
+/*! \file */
+
+#include <isc/lang.h>
+
+ISC_LANG_BEGINDECLS
+
+void generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg,
+ int keysize, isc_buffer_t *key_txtbuffer);
+
+void write_key_file(const char *keyfile, const char *user,
+ const char *keyname, isc_buffer_t *secret,
+ dns_secalg_t alg);
+
+const char *alg_totext(dns_secalg_t alg);
+dns_secalg_t alg_fromtext(const char *name);
+int alg_bits(dns_secalg_t alg);
+
+ISC_LANG_ENDDECLS
+
+#endif /* RNDC_KEYGEN_H */
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.8 b/contrib/bind9/bin/confgen/rndc-confgen.8
index db45df4..a1b3ae8 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.8
+++ b/contrib/bind9/bin/confgen/rndc-confgen.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2001, 2003 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: rndc-confgen.8,v 1.20.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: rndc-confgen.8,v 1.7 2009-07-11 01:12:45 tbox Exp $
.\"
.hy 0
.ad l
@@ -205,7 +205,7 @@ BIND 9 Administrator Reference Manual.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2001, 2003 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.c b/contrib/bind9/bin/confgen/rndc-confgen.c
index 1cb0a0a..766e3b4 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.c
+++ b/contrib/bind9/bin/confgen/rndc-confgen.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rndc-confgen.c,v 1.26 2008-10-15 23:47:31 tbox Exp $ */
+/* $Id: rndc-confgen.c,v 1.5 2009-09-29 15:06:05 fdupont Exp $ */
/*! \file */
@@ -52,9 +52,10 @@
#include <dns/name.h>
#include <dst/dst.h>
-#include <rndc/os.h>
+#include <confgen/os.h>
#include "util.h"
+#include "keygen.h"
#define DEFAULT_KEYLENGTH 128 /*% Bits. */
#define DEFAULT_KEYNAME "rndc-key"
@@ -68,6 +69,9 @@ isc_boolean_t verbose = ISC_FALSE;
const char *keyfile, *keydef;
+ISC_PLATFORM_NORETURN_PRE static void
+usage(int status) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(int status) {
@@ -75,72 +79,36 @@ usage(int status) {
Usage:\n\
%s [-a] [-b bits] [-c keyfile] [-k keyname] [-p port] [-r randomfile] \
[-s addr] [-t chrootdir] [-u user]\n\
- -a: generate just the key clause and write it to keyfile (%s)\n\
- -b bits: from 1 through 512, default %d; total length of the secret\n\
- -c keyfile: specify an alternate key file (requires -a)\n\
- -k keyname: the name as it will be used in named.conf and rndc.conf\n\
- -p port: the port named will listen on and rndc will connect to\n\
- -r randomfile: a file containing random data\n\
- -s addr: the address to which rndc should connect\n\
- -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\
- -u user: set the keyfile owner to \"user\" (requires -a)\n",
- progname, keydef, DEFAULT_KEYLENGTH);
+ -a: generate just the key clause and write it to keyfile (%s)\n\
+ -b bits: from 1 through 512, default %d; total length of the secret\n\
+ -c keyfile: specify an alternate key file (requires -a)\n\
+ -k keyname: the name as it will be used in named.conf and rndc.conf\n\
+ -p port: the port named will listen on and rndc will connect to\n\
+ -r randomfile: source of random data (use \"keyboard\" for key timing)\n\
+ -s addr: the address to which rndc should connect\n\
+ -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\
+ -u user: set the keyfile owner to \"user\" (requires -a)\n",
+ progname, keydef, DEFAULT_KEYLENGTH);
exit (status);
}
-/*%
- * Write an rndc.key file to 'keyfile'. If 'user' is non-NULL,
- * make that user the owner of the file. The key will have
- * the name 'keyname' and the secret in the buffer 'secret'.
- */
-static void
-write_key_file(const char *keyfile, const char *user,
- const char *keyname, isc_buffer_t *secret )
-{
- FILE *fd;
-
- fd = safe_create(keyfile);
- if (fd == NULL)
- fatal( "unable to create \"%s\"\n", keyfile);
- if (user != NULL) {
- if (set_user(fd, user) == -1)
- fatal("unable to set file owner\n");
- }
- fprintf(fd, "key \"%s\" {\n\talgorithm hmac-md5;\n"
- "\tsecret \"%.*s\";\n};\n", keyname,
- (int)isc_buffer_usedlength(secret),
- (char *)isc_buffer_base(secret));
- fflush(fd);
- if (ferror(fd))
- fatal("write to %s failed\n", keyfile);
- if (fclose(fd))
- fatal("fclose(%s) failed\n", keyfile);
- fprintf(stderr, "wrote key file \"%s\"\n", keyfile);
-}
-
int
main(int argc, char **argv) {
isc_boolean_t show_final_mem = ISC_FALSE;
- isc_buffer_t key_rawbuffer;
isc_buffer_t key_txtbuffer;
- isc_region_t key_rawregion;
+ char key_txtsecret[256];
isc_mem_t *mctx = NULL;
- isc_entropy_t *ectx = NULL;
- isc_entropysource_t *entropy_source = NULL;
isc_result_t result = ISC_R_SUCCESS;
- dst_key_t *key = NULL;
const char *keyname = NULL;
const char *randomfile = NULL;
const char *serveraddr = NULL;
- char key_rawsecret[64];
- char key_txtsecret[256];
+ dns_secalg_t alg = DST_ALG_HMACMD5;
+ const char *algname = alg_totext(alg);
char *p;
int ch;
int port;
int keysize;
- int entropy_flags = 0;
- int open_keyboard = ISC_ENTROPY_KEYBOARDMAYBE;
struct in_addr addr4_dummy;
struct in6_addr addr6_dummy;
char *chrootdir = NULL;
@@ -237,53 +205,13 @@ main(int argc, char **argv) {
usage(1);
DO("create memory context", isc_mem_create(0, 0, &mctx));
-
- DO("create entropy context", isc_entropy_create(mctx, &ectx));
-
- if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) {
- randomfile = NULL;
- open_keyboard = ISC_ENTROPY_KEYBOARDYES;
- }
- DO("start entropy source", isc_entropy_usebestsource(ectx,
- &entropy_source,
- randomfile,
- open_keyboard));
-
- entropy_flags = ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY;
-
- DO("initialize dst library", dst_lib_init(mctx, ectx, entropy_flags));
-
- DO("generate key", dst_key_generate(dns_rootname, DST_ALG_HMACMD5,
- keysize, 0, 0,
- DNS_KEYPROTO_ANY,
- dns_rdataclass_in, mctx, &key));
-
- isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret));
-
- DO("dump key to buffer", dst_key_tobuffer(key, &key_rawbuffer));
-
isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
- isc_buffer_usedregion(&key_rawbuffer, &key_rawregion);
-
- DO("bsse64 encode secret", isc_base64_totext(&key_rawregion, -1, "",
- &key_txtbuffer));
-
- /*
- * Shut down the entropy source now so the "stop typing" message
- * does not muck with the output.
- */
- if (entropy_source != NULL)
- isc_entropy_destroysource(&entropy_source);
-
- if (key != NULL)
- dst_key_free(&key);
- isc_entropy_detach(&ectx);
- dst_lib_destroy();
+ generate_key(mctx, randomfile, alg, keysize, &key_txtbuffer);
if (keyonly) {
write_key_file(keyfile, chrootdir == NULL ? user : NULL,
- keyname, &key_txtbuffer);
+ keyname, &key_txtbuffer, alg);
if (chrootdir != NULL) {
char *buf;
@@ -294,14 +222,14 @@ main(int argc, char **argv) {
snprintf(buf, len, "%s%s%s", chrootdir,
(*keyfile != '/') ? "/" : "", keyfile);
- write_key_file(buf, user, keyname, &key_txtbuffer);
+ write_key_file(buf, user, keyname, &key_txtbuffer, alg);
isc_mem_put(mctx, buf, len);
}
} else {
printf("\
# Start of rndc.conf\n\
key \"%s\" {\n\
- algorithm hmac-md5;\n\
+ algorithm %s;\n\
secret \"%.*s\";\n\
};\n\
\n\
@@ -314,7 +242,7 @@ options {\n\
\n\
# Use with the following in named.conf, adjusting the allow list as needed:\n\
# key \"%s\" {\n\
-# algorithm hmac-md5;\n\
+# algorithm %s;\n\
# secret \"%.*s\";\n\
# };\n\
# \n\
@@ -323,11 +251,11 @@ options {\n\
# allow { %s; } keys { \"%s\"; };\n\
# };\n\
# End of named.conf\n",
- keyname,
+ keyname, algname,
(int)isc_buffer_usedlength(&key_txtbuffer),
(char *)isc_buffer_base(&key_txtbuffer),
keyname, serveraddr, port,
- keyname,
+ keyname, algname,
(int)isc_buffer_usedlength(&key_txtbuffer),
(char *)isc_buffer_base(&key_txtbuffer),
serveraddr, port, serveraddr, keyname);
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.docbook b/contrib/bind9/bin/confgen/rndc-confgen.docbook
index f71dd9f..d43fcfb 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.docbook
+++ b/contrib/bind9/bin/confgen/rndc-confgen.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2001, 2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc-confgen.docbook,v 1.13 2007-06-18 23:47:25 tbox Exp $ -->
+<!-- $Id: rndc-confgen.docbook,v 1.4 2009-06-15 23:47:59 tbox Exp $ -->
<refentry id="man.rndc-confgen">
<refentryinfo>
<date>Aug 27, 2001</date>
@@ -40,6 +40,7 @@
<year>2004</year>
<year>2005</year>
<year>2007</year>
+ <year>2009</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
diff --git a/contrib/bind9/bin/rndc/rndc-confgen.html b/contrib/bind9/bin/confgen/rndc-confgen.html
index 6ef1073..82a7120 100644
--- a/contrib/bind9/bin/rndc/rndc-confgen.html
+++ b/contrib/bind9/bin/confgen/rndc-confgen.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2001, 2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc-confgen.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: rndc-confgen.html,v 1.7 2009-07-11 01:12:45 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -32,7 +32,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc-confgen</code> [<code class="option">-a</code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-c <em class="replaceable"><code>keyfile</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [<code class="option">-s <em class="replaceable"><code>address</code></em></code>] [<code class="option">-t <em class="replaceable"><code>chrootdir</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543429"></a><h2>DESCRIPTION</h2>
+<a name="id2543432"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">rndc-confgen</strong></span>
generates configuration files
for <span><strong class="command">rndc</strong></span>. It can be used as a
@@ -48,7 +48,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543474"></a><h2>OPTIONS</h2>
+<a name="id2543477"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd>
@@ -155,7 +155,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543787"></a><h2>EXAMPLES</h2>
+<a name="id2543790"></a><h2>EXAMPLES</h2>
<p>
To allow <span><strong class="command">rndc</strong></span> to be used with
no manual configuration, run
@@ -172,7 +172,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543829"></a><h2>SEE ALSO</h2>
+<a name="id2543832"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
@@ -180,7 +180,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543867"></a><h2>AUTHOR</h2>
+<a name="id2543870"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/rndc/unix/Makefile.in b/contrib/bind9/bin/confgen/unix/Makefile.in
index e503db3..1785e0d 100644
--- a/contrib/bind9/bin/rndc/unix/Makefile.in
+++ b/contrib/bind9/bin/confgen/unix/Makefile.in
@@ -1,5 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
-# Copyright (C) 2001 Internet Software Consortium.
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +12,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.5 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.3 2009-06-11 23:47:55 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/bin/rndc/unix/os.c b/contrib/bind9/bin/confgen/unix/os.c
index e9ece1b..e439a51 100644
--- a/contrib/bind9/bin/rndc/unix/os.c
+++ b/contrib/bind9/bin/confgen/unix/os.c
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 2001 Internet Software Consortium.
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -15,13 +14,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.c,v 1.10 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: os.c,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
/*! \file */
#include <config.h>
-#include <rndc/os.h>
+#include <confgen/os.h>
#include <fcntl.h>
#include <unistd.h>
@@ -42,29 +41,3 @@ set_user(FILE *fd, const char *user) {
}
return (fchown(fileno(fd), pw->pw_uid, -1));
}
-
-FILE *
-safe_create(const char *filename) {
- int fd;
- FILE *f;
- struct stat sb;
- int flags = O_WRONLY;
-
- if (stat(filename, &sb) == -1) {
- if (errno != ENOENT)
- return (NULL);
- flags = O_WRONLY | O_CREAT | O_EXCL;
- } else if ((sb.st_mode & S_IFREG) == 0) {
- errno = EOPNOTSUPP;
- return (NULL);
- } else
- flags = O_WRONLY | O_TRUNC;
-
- fd = open(filename, flags, S_IRUSR | S_IWUSR);
- if (fd == -1)
- return (NULL);
- f = fdopen(fd, "w");
- if (f == NULL)
- close(fd);
- return (f);
-}
diff --git a/contrib/bind9/bin/confgen/util.c b/contrib/bind9/bin/confgen/util.c
new file mode 100644
index 0000000..158a8d3
--- /dev/null
+++ b/contrib/bind9/bin/confgen/util.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: util.c,v 1.3 2009-06-11 23:47:55 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <isc/boolean.h>
+
+#include "util.h"
+
+extern isc_boolean_t verbose;
+extern const char *progname;
+
+void
+notify(const char *fmt, ...) {
+ va_list ap;
+
+ if (verbose) {
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fputs("\n", stderr);
+ }
+}
+
+void
+fatal(const char *format, ...) {
+ va_list args;
+
+ fprintf(stderr, "%s: ", progname);
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
diff --git a/contrib/bind9/bin/confgen/util.h b/contrib/bind9/bin/confgen/util.h
new file mode 100644
index 0000000..651b6e5
--- /dev/null
+++ b/contrib/bind9/bin/confgen/util.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: util.h,v 1.4 2009-09-29 15:06:05 fdupont Exp $ */
+
+#ifndef RNDC_UTIL_H
+#define RNDC_UTIL_H 1
+
+/*! \file */
+
+#include <isc/lang.h>
+#include <isc/platform.h>
+
+#include <isc/formatcheck.h>
+
+#define NS_CONTROL_PORT 953
+
+#undef DO
+#define DO(name, function) \
+ do { \
+ result = function; \
+ if (result != ISC_R_SUCCESS) \
+ fatal("%s: %s", name, isc_result_totext(result)); \
+ else \
+ notify("%s", name); \
+ } while (0)
+
+ISC_LANG_BEGINDECLS
+
+void
+notify(const char *fmt, ...) ISC_FORMAT_PRINTF(1, 2);
+
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
+
+ISC_LANG_ENDDECLS
+
+#endif /* RNDC_UTIL_H */
diff --git a/contrib/bind9/bin/dig/Makefile.in b/contrib/bind9/bin/dig/Makefile.in
index ad20553..bebef6f 100644
--- a/contrib/bind9/bin/dig/Makefile.in
+++ b/contrib/bind9/bin/dig/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.41 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.47 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -24,7 +24,7 @@ top_srcdir = @top_srcdir@
@BIND9_MAKE_INCLUDES@
CINCLUDES = -I${srcdir}/include ${DNS_INCLUDES} ${BIND9_INCLUDES} \
- ${ISC_INCLUDES} ${LWRES_INCLUDES}
+ ${ISC_INCLUDES} ${LWRES_INCLUDES} ${ISCCFG_INCLUDES}
CDEFINES = -DVERSION=\"${VERSION}\"
CWARNINGS =
@@ -33,6 +33,7 @@ ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
LWRESLIBS = ../../lib/lwres/liblwres.@A@
ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
@@ -44,8 +45,11 @@ LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
DEPLIBS = ${DNSDEPLIBS} ${BIND9DEPLIBS} ${ISCDEPLIBS} ${ISCCFGDEPLIBS} \
${LWRESDEPLIBS}
-LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCLIBS} \
- ${ISCCFGLIBS} @IDNLIBS@ @LIBS@
+LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \
+ ${ISCLIBS} @IDNLIBS@ @LIBS@
+
+NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} \
+ ${ISCNOSYMLIBS} @IDNLIBS@ @LIBS@
SUBDIRS =
@@ -66,16 +70,16 @@ MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
dig@EXEEXT@: dig.@O@ dighost.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dig.@O@ dighost.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="dig.@O@ dighost.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
host@EXEEXT@: host.@O@ dighost.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- host.@O@ dighost.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="host.@O@ dighost.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
nslookup@EXEEXT@: nslookup.@O@ dighost.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- nslookup.@O@ dighost.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="nslookup.@O@ dighost.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/dig/dig.1 b/contrib/bind9/bin/dig/dig.1
index 93f90b2..87d5045 100644
--- a/contrib/bind9/bin/dig/dig.1
+++ b/contrib/bind9/bin/dig/dig.1
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (C) 2000-2003 Internet Software Consortium.
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dig.1,v 1.50.44.3 2009-07-11 01:55:20 tbox Exp $
+.\" $Id: dig.1,v 1.54 2010-03-05 01:14:15 tbox Exp $
.\"
.hy 0
.ad l
@@ -455,6 +455,11 @@ Print records like the SOA records in a verbose multi\-line format with human\-r
output.
.RE
.PP
+\fB+[no]onesoa\fR
+.RS 4
+Print only one (starting) SOA record when performing an AXFR. The default is to print both the starting and ending SOA records.
+.RE
+.PP
\fB+[no]fail\fR
.RS 4
Do not try the next server if you receive a SERVFAIL. The default is to not try the next server which is the reverse of normal stub resolver behavior.
@@ -562,7 +567,7 @@ RFC1035.
.PP
There are probably too many query options.
.SH "COPYRIGHT"
-Copyright \(co 2004\-2009 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004\-2010 Internet Systems Consortium, Inc. ("ISC")
.br
Copyright \(co 2000\-2003 Internet Software Consortium.
.br
diff --git a/contrib/bind9/bin/dig/dig.c b/contrib/bind9/bin/dig/dig.c
index 7de934b..a3143c9 100644
--- a/contrib/bind9/bin/dig/dig.c
+++ b/contrib/bind9/bin/dig/dig.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dig.c,v 1.225.26.7 2010-05-13 00:43:37 marka Exp $ */
+/* $Id: dig.c,v 1.237 2010-05-13 00:40:46 marka Exp $ */
/*! \file */
@@ -68,7 +68,8 @@ static char domainopt[DNS_NAME_MAXTEXT];
static isc_boolean_t short_form = ISC_FALSE, printcmd = ISC_TRUE,
ip6_int = ISC_FALSE, plusquest = ISC_FALSE, pluscomm = ISC_FALSE,
- multiline = ISC_FALSE, nottl = ISC_FALSE, noclass = ISC_FALSE;
+ multiline = ISC_FALSE, nottl = ISC_FALSE, noclass = ISC_FALSE,
+ onesoa = ISC_FALSE;
/*% opcode text */
static const char * const opcodetext[] = {
@@ -138,6 +139,9 @@ print_usage(FILE *fp) {
" [ host [@local-server] {local-d-opt} [...]]\n", fp);
}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
print_usage(stderr);
@@ -222,6 +226,7 @@ help(void) {
#endif
#endif
" +[no]multiline (Print records in an expanded format)\n"
+" +[no]onesoa (AXFR prints only one soa record)\n"
" global d-opts and servers (before host name) affect all queries.\n"
" local d-opts and servers (after host name) affect only that lookup.\n"
" -h (print help and exit)\n"
@@ -468,6 +473,9 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
flags |= DNS_MESSAGETEXTFLAG_NOHEADERS;
flags |= DNS_MESSAGETEXTFLAG_NOCOMMENTS;
}
+ if (onesoa && query->lookup->rdtype == dns_rdatatype_axfr)
+ flags |= (query->msg_count == 0) ? DNS_MESSAGETEXTFLAG_ONESOA :
+ DNS_MESSAGETEXTFLAG_OMITSOA;
if (!query->lookup->comments)
flags |= DNS_MESSAGETEXTFLAG_NOCOMMENTS;
@@ -673,19 +681,6 @@ printgreeting(int argc, char **argv, dig_lookup_t *lookup) {
}
}
-static isc_uint32_t
-parse_uint(char *arg, const char *desc, isc_uint32_t max) {
- isc_result_t result;
- isc_uint32_t tmp;
-
- result = isc_parse_uint32(&tmp, arg, 10);
- if (result == ISC_R_SUCCESS && tmp > max)
- result = ISC_R_RANGE;
- if (result != ISC_R_SUCCESS)
- fatal("%s '%s': %s", desc, arg, isc_result_totext(result));
- return (tmp);
-}
-
/*%
* We're not using isc_commandline_parse() here since the command line
* syntax of dig is quite a bit different from that which can be described
@@ -697,8 +692,10 @@ static void
plus_option(char *option, isc_boolean_t is_batchfile,
dig_lookup_t *lookup)
{
+ isc_result_t result;
char option_store[256];
char *cmd, *value, *ptr;
+ isc_uint32_t num;
isc_boolean_t state = ISC_TRUE;
#ifdef DIG_SIGCHASE
size_t n;
@@ -746,6 +743,7 @@ plus_option(char *option, isc_boolean_t is_batchfile,
lookup->section_additional = state;
break;
case 'f': /* adflag */
+ case '\0': /* +ad is a synonym for +adflag */
FULLCHECK("adflag");
lookup->adflag = state;
break;
@@ -787,8 +785,11 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- lookup->udpsize = (isc_uint16_t) parse_uint(value,
- "buffer size", COMMSIZE);
+ result = parse_uint(&num, value, COMMSIZE,
+ "buffer size");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse buffer size");
+ lookup->udpsize = num;
break;
default:
goto invalid_option;
@@ -797,8 +798,15 @@ plus_option(char *option, isc_boolean_t is_batchfile,
case 'c':
switch (cmd[1]) {
case 'd':/* cdflag */
- FULLCHECK("cdflag");
- lookup->cdflag = state;
+ switch (cmd[2]) {
+ case 'f': /* cdflag */
+ case '\0': /* +cd is a synonym for +cdflag */
+ FULLCHECK("cdflag");
+ lookup->cdflag = state;
+ break;
+ default:
+ goto invalid_option;
+ }
break;
case 'l': /* cl */
FULLCHECK("cl");
@@ -853,7 +861,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
}
if (value == NULL)
goto need_value;
- lookup->edns = (isc_int16_t) parse_uint(value, "edns", 255);
+ result = parse_uint(&num, value, 255, "edns");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse edns");
+ lookup->edns = num;
break;
case 'f': /* fail */
FULLCHECK("fail");
@@ -883,7 +894,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- ndots = parse_uint(value, "ndots", MAXNDOTS);
+ result = parse_uint(&num, value, MAXNDOTS, "ndots");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse ndots");
+ ndots = num;
break;
case 's':
switch (cmd[2]) {
@@ -918,6 +932,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto invalid_option;
}
break;
+ case 'o':
+ FULLCHECK("onesoa");
+ onesoa = state;
+ break;
case 'q':
switch (cmd[1]) {
case 'r': /* qr */
@@ -948,8 +966,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- lookup->retries = parse_uint(value, "retries",
- MAXTRIES - 1);
+ result = parse_uint(&lookup->retries, value,
+ MAXTRIES - 1, "retries");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse retries");
lookup->retries++;
break;
default:
@@ -1025,7 +1045,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- timeout = parse_uint(value, "timeout", MAXTIMEOUT);
+ result = parse_uint(&timeout, value, MAXTIMEOUT,
+ "timeout");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse timeout");
if (timeout == 0)
timeout = 1;
break;
@@ -1058,8 +1081,10 @@ plus_option(char *option, isc_boolean_t is_batchfile,
goto need_value;
if (!state)
goto invalid_option;
- lookup->retries = parse_uint(value, "tries",
- MAXTRIES);
+ result = parse_uint(&lookup->retries, value,
+ MAXTRIES, "tries");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse tries");
if (lookup->retries == 0)
lookup->retries = 1;
break;
@@ -1125,6 +1150,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
struct in6_addr in6;
in_port_t srcport;
char *hash, *cmd;
+ isc_uint32_t num;
while (strpbrk(option, single_dash_opts) == &option[0]) {
/*
@@ -1140,6 +1166,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
have_ipv6 = ISC_FALSE;
} else {
fatal("can't find IPv4 networking");
+ /* NOTREACHED */
return (ISC_FALSE);
}
break;
@@ -1149,6 +1176,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
have_ipv4 = ISC_FALSE;
} else {
fatal("can't find IPv6 networking");
+ /* NOTREACHED */
return (ISC_FALSE);
}
break;
@@ -1199,9 +1227,11 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
case 'b':
hash = strchr(value, '#');
if (hash != NULL) {
- srcport = (in_port_t)
- parse_uint(hash + 1,
- "port number", MAXPORT);
+ result = parse_uint(&num, hash + 1, MAXPORT,
+ "port number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse port number");
+ srcport = num;
*hash = '\0';
} else
srcport = 0;
@@ -1245,7 +1275,10 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
keyfile[sizeof(keyfile)-1]=0;
return (value_from_next);
case 'p':
- port = (in_port_t) parse_uint(value, "port number", MAXPORT);
+ result = parse_uint(&num, value, MAXPORT, "port number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse port number");
+ port = num;
return (value_from_next);
case 'q':
if (!config_only) {
@@ -1288,11 +1321,14 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
"extra type option\n");
}
if (rdtype == dns_rdatatype_ixfr) {
+ isc_uint32_t serial;
(*lookup)->rdtype = dns_rdatatype_ixfr;
(*lookup)->rdtypeset = ISC_TRUE;
- (*lookup)->ixfr_serial =
- parse_uint(&value[5], "serial number",
- MAXSERIAL);
+ result = parse_uint(&serial, &value[5],
+ MAXSERIAL, "serial number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse serial number");
+ (*lookup)->ixfr_serial = serial;
(*lookup)->section_question = plusquest;
(*lookup)->comments = pluscomm;
(*lookup)->tcp_mode = ISC_TRUE;
@@ -1320,65 +1356,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
usage();
ptr3 = next_token(&value,":"); /* secret or NULL */
if (ptr3 != NULL) {
- if (strcasecmp(ptr, "hmac-md5") == 0) {
- hmacname = DNS_TSIG_HMACMD5_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-md5-", 9) == 0) {
- hmacname = DNS_TSIG_HMACMD5_NAME;
- digestbits = parse_uint(&ptr[9],
- "digest-bits [0..128]",
- 128);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha1") == 0) {
- hmacname = DNS_TSIG_HMACSHA1_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha1-", 10) == 0) {
- hmacname = DNS_TSIG_HMACSHA1_NAME;
- digestbits = parse_uint(&ptr[10],
- "digest-bits [0..160]",
- 160);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha224") == 0) {
- hmacname = DNS_TSIG_HMACSHA224_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha224-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA224_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..224]",
- 224);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha256") == 0) {
- hmacname = DNS_TSIG_HMACSHA256_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha256-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA256_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..256]",
- 256);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha384") == 0) {
- hmacname = DNS_TSIG_HMACSHA384_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha384-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA384_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..384]",
- 384);
- digestbits = (digestbits + 7) & ~0x7U;
- } else if (strcasecmp(ptr, "hmac-sha512") == 0) {
- hmacname = DNS_TSIG_HMACSHA512_NAME;
- digestbits = 0;
- } else if (strncasecmp(ptr, "hmac-sha512-", 12) == 0) {
- hmacname = DNS_TSIG_HMACSHA512_NAME;
- digestbits = parse_uint(&ptr[12],
- "digest-bits [0..512]",
- 512);
- digestbits = (digestbits + 7) & ~0x7U;
- } else {
- fprintf(stderr, ";; Warning, ignoring "
- "invalid TSIG algorithm %s\n", ptr);
- return (value_from_next);
- }
+ parse_hmac(ptr);
ptr = ptr2;
ptr2 = ptr3;
} else {
@@ -1422,6 +1400,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup,
fprintf(stderr, "Invalid option: -%s\n", option);
usage();
}
+ /* NOTREACHED */
return (ISC_FALSE);
}
@@ -1626,13 +1605,18 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
"extra type option\n");
}
if (rdtype == dns_rdatatype_ixfr) {
+ isc_uint32_t serial;
lookup->rdtype =
dns_rdatatype_ixfr;
lookup->rdtypeset = ISC_TRUE;
- lookup->ixfr_serial =
- parse_uint(&rv[0][5],
- "serial number",
- MAXSERIAL);
+ result = parse_uint(&serial,
+ &rv[0][5],
+ MAXSERIAL,
+ "serial number");
+ if (result != ISC_R_SUCCESS)
+ fatal("Couldn't parse "
+ "serial number");
+ lookup->ixfr_serial = serial;
lookup->section_question =
plusquest;
lookup->comments = pluscomm;
diff --git a/contrib/bind9/bin/dig/dig.docbook b/contrib/bind9/bin/dig/dig.docbook
index d8e3586..19e2ca2 100644
--- a/contrib/bind9/bin/dig/dig.docbook
+++ b/contrib/bind9/bin/dig/dig.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dig.docbook,v 1.42.44.3 2009-02-02 04:42:48 marka Exp $ -->
+<!-- $Id: dig.docbook,v 1.47 2010-03-04 23:50:34 tbox Exp $ -->
<refentry id="man.dig">
<refentryinfo>
@@ -44,6 +44,7 @@
<year>2007</year>
<year>2008</year>
<year>2009</year>
+ <year>2010</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -766,6 +767,17 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>+[no]onesoa</option></term>
+ <listitem>
+ <para>
+ Print only one (starting) SOA record when performing
+ an AXFR. The default is to print both the starting and
+ ending SOA records.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><option>+[no]fail</option></term>
<listitem>
diff --git a/contrib/bind9/bin/dig/dig.html b/contrib/bind9/bin/dig/dig.html
index 17fd5bb..c9ce8f0 100644
--- a/contrib/bind9/bin/dig/dig.html
+++ b/contrib/bind9/bin/dig/dig.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dig.html,v 1.45.44.3 2009-07-11 01:55:20 tbox Exp $ -->
+<!-- $Id: dig.html,v 1.49 2010-03-05 01:14:15 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -34,7 +34,7 @@
<div class="cmdsynopsis"><p><code class="command">dig</code> [global-queryopt...] [query...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543518"></a><h2>DESCRIPTION</h2>
+<a name="id2543522"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dig</strong></span>
(domain information groper) is a flexible tool
for interrogating DNS name servers. It performs DNS lookups and
@@ -80,7 +80,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543592"></a><h2>SIMPLE USAGE</h2>
+<a name="id2543595"></a><h2>SIMPLE USAGE</h2>
<p>
A typical invocation of <span><strong class="command">dig</strong></span> looks like:
</p>
@@ -126,7 +126,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543683"></a><h2>OPTIONS</h2>
+<a name="id2543686"></a><h2>OPTIONS</h2>
<p>
The <code class="option">-b</code> option sets the source IP address of the query
to <em class="parameter"><code>address</code></em>. This must be a valid
@@ -230,7 +230,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544032"></a><h2>QUERY OPTIONS</h2>
+<a name="id2544035"></a><h2>QUERY OPTIONS</h2>
<p><span><strong class="command">dig</strong></span>
provides a number of query options which affect
the way in which lookups are made and the results displayed. Some of
@@ -499,6 +499,12 @@
each record on a single line, to facilitate machine parsing
of the <span><strong class="command">dig</strong></span> output.
</p></dd>
+<dt><span class="term"><code class="option">+[no]onesoa</code></span></dt>
+<dd><p>
+ Print only one (starting) SOA record when performing
+ an AXFR. The default is to print both the starting and
+ ending SOA records.
+ </p></dd>
<dt><span class="term"><code class="option">+[no]fail</code></span></dt>
<dd><p>
Do not try the next server if you receive a SERVFAIL. The
@@ -555,7 +561,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545166"></a><h2>MULTIPLE QUERIES</h2>
+<a name="id2545184"></a><h2>MULTIPLE QUERIES</h2>
<p>
The BIND 9 implementation of <span><strong class="command">dig </strong></span>
supports
@@ -601,7 +607,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545228"></a><h2>IDN SUPPORT</h2>
+<a name="id2545245"></a><h2>IDN SUPPORT</h2>
<p>
If <span><strong class="command">dig</strong></span> has been built with IDN (internationalized
domain name) support, it can accept and display non-ASCII domain names.
@@ -615,14 +621,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545251"></a><h2>FILES</h2>
+<a name="id2545336"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
<p><code class="filename">${HOME}/.digrc</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545336"></a><h2>SEE ALSO</h2>
+<a name="id2545353"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">host</span>(1)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
@@ -630,7 +636,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545373"></a><h2>BUGS</h2>
+<a name="id2545390"></a><h2>BUGS</h2>
<p>
There are probably too many query options.
</p>
diff --git a/contrib/bind9/bin/dig/dighost.c b/contrib/bind9/bin/dig/dighost.c
index df5a0c0..e92bc6e 100644
--- a/contrib/bind9/bin/dig/dighost.c
+++ b/contrib/bind9/bin/dig/dighost.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dighost.c,v 1.311.70.17 2010-12-09 01:12:54 marka Exp $ */
+/* $Id: dighost.c,v 1.336 2010-12-09 00:54:33 marka Exp $ */
/*! \file
* \note
@@ -53,6 +53,7 @@
#include <ctype.h>
#endif
#include <dns/fixedname.h>
+#include <dns/log.h>
#include <dns/message.h>
#include <dns/name.h>
#include <dns/rdata.h>
@@ -71,10 +72,12 @@
#include <isc/entropy.h>
#include <isc/file.h>
#include <isc/lang.h>
+#include <isc/log.h>
#include <isc/netaddr.h>
#ifdef DIG_SIGCHASE
#include <isc/netdb.h>
#endif
+#include <isc/parseint.h>
#include <isc/print.h>
#include <isc/random.h>
#include <isc/result.h>
@@ -84,6 +87,8 @@
#include <isc/types.h>
#include <isc/util.h>
+#include <isccfg/namedconf.h>
+
#include <lwres/lwres.h>
#include <lwres/net.h>
@@ -121,6 +126,7 @@ in_port_t port = 53;
unsigned int timeout = 0;
unsigned int extrabytes;
isc_mem_t *mctx = NULL;
+isc_log_t *lctx = NULL;
isc_taskmgr_t *taskmgr = NULL;
isc_task_t *global_task = NULL;
isc_timermgr_t *timermgr = NULL;
@@ -393,7 +399,7 @@ count_dots(char *string) {
static void
hex_dump(isc_buffer_t *b) {
- unsigned int len;
+ unsigned int len, i;
isc_region_t r;
isc_buffer_usedregion(b, &r);
@@ -401,11 +407,29 @@ hex_dump(isc_buffer_t *b) {
printf("%d bytes\n", r.length);
for (len = 0; len < r.length; len++) {
printf("%02x ", r.base[len]);
- if (len % 16 == 15)
+ if (len % 16 == 15) {
+ fputs(" ", stdout);
+ for (i = len - 15; i <= len; i++) {
+ if (r.base[i] >= '!' && r.base[i] <= '}')
+ putchar(r.base[i]);
+ else
+ putchar('.');
+ }
printf("\n");
+ }
}
- if (len % 16 != 0)
+ if (len % 16 != 0) {
+ for (i = len; (i % 16) != 0; i++)
+ fputs(" ", stdout);
+ fputs(" ", stdout);
+ for (i = ((len>>4)<<4); i < len; i++) {
+ if (r.base[i] >= '!' && r.base[i] <= '}')
+ putchar(r.base[i]);
+ else
+ putchar('.');
+ }
printf("\n");
+ }
}
/*%
@@ -903,9 +927,7 @@ setup_text_key(void) {
secretsize = isc_buffer_usedlength(&secretbuf);
- result = dns_name_fromtext(&keyname, namebuf,
- dns_rootname, ISC_FALSE,
- namebuf);
+ result = dns_name_fromtext(&keyname, namebuf, dns_rootname, 0, namebuf);
if (result != ISC_R_SUCCESS)
goto failure;
@@ -924,14 +946,164 @@ setup_text_key(void) {
isc_buffer_free(&namebuf);
}
+isc_result_t
+parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
+ const char *desc) {
+ isc_uint32_t n;
+ isc_result_t result = isc_parse_uint32(&n, value, 10);
+ if (result == ISC_R_SUCCESS && n > max)
+ result = ISC_R_RANGE;
+ if (result != ISC_R_SUCCESS) {
+ printf("invalid %s '%s': %s\n", desc,
+ value, isc_result_totext(result));
+ return (result);
+ }
+ *uip = n;
+ return (ISC_R_SUCCESS);
+}
+
+static isc_uint32_t
+parse_bits(char *arg, const char *desc, isc_uint32_t max) {
+ isc_result_t result;
+ isc_uint32_t tmp;
+
+ result = parse_uint(&tmp, arg, max, desc);
+ if (result != ISC_R_SUCCESS)
+ fatal("couldn't parse digest bits");
+ tmp = (tmp + 7) & ~0x7U;
+ return (tmp);
+}
+
+
+/*
+ * Parse HMAC algorithm specification
+ */
+void
+parse_hmac(const char *hmac) {
+ char buf[20];
+ int len;
+
+ REQUIRE(hmac != NULL);
+
+ len = strlen(hmac);
+ if (len >= (int) sizeof(buf))
+ fatal("unknown key type '%.*s'", len, hmac);
+ strncpy(buf, hmac, sizeof(buf));
+
+ digestbits = 0;
+
+ if (strcasecmp(buf, "hmac-md5") == 0) {
+ hmacname = DNS_TSIG_HMACMD5_NAME;
+ } else if (strncasecmp(buf, "hmac-md5-", 9) == 0) {
+ hmacname = DNS_TSIG_HMACMD5_NAME;
+ digestbits = parse_bits(&buf[9], "digest-bits [0..128]", 128);
+ } else if (strcasecmp(buf, "hmac-sha1") == 0) {
+ hmacname = DNS_TSIG_HMACSHA1_NAME;
+ digestbits = 0;
+ } else if (strncasecmp(buf, "hmac-sha1-", 10) == 0) {
+ hmacname = DNS_TSIG_HMACSHA1_NAME;
+ digestbits = parse_bits(&buf[10], "digest-bits [0..160]", 160);
+ } else if (strcasecmp(buf, "hmac-sha224") == 0) {
+ hmacname = DNS_TSIG_HMACSHA224_NAME;
+ } else if (strncasecmp(buf, "hmac-sha224-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA224_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..224]", 224);
+ } else if (strcasecmp(buf, "hmac-sha256") == 0) {
+ hmacname = DNS_TSIG_HMACSHA256_NAME;
+ } else if (strncasecmp(buf, "hmac-sha256-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA256_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..256]", 256);
+ } else if (strcasecmp(buf, "hmac-sha384") == 0) {
+ hmacname = DNS_TSIG_HMACSHA384_NAME;
+ } else if (strncasecmp(buf, "hmac-sha384-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA384_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..384]", 384);
+ } else if (strcasecmp(buf, "hmac-sha512") == 0) {
+ hmacname = DNS_TSIG_HMACSHA512_NAME;
+ } else if (strncasecmp(buf, "hmac-sha512-", 12) == 0) {
+ hmacname = DNS_TSIG_HMACSHA512_NAME;
+ digestbits = parse_bits(&buf[12], "digest-bits [0..512]", 512);
+ } else {
+ fprintf(stderr, ";; Warning, ignoring "
+ "invalid TSIG algorithm %s\n", buf);
+ }
+}
+
+/*
+ * Get a key from a named.conf format keyfile
+ */
+static isc_result_t
+read_confkey(void) {
+ isc_log_t *lctx = NULL;
+ cfg_parser_t *pctx = NULL;
+ cfg_obj_t *file = NULL;
+ const cfg_obj_t *key = NULL;
+ const cfg_obj_t *secretobj = NULL;
+ const cfg_obj_t *algorithmobj = NULL;
+ const char *keyname;
+ const char *secretstr;
+ const char *algorithm;
+ isc_result_t result;
+
+ if (! isc_file_exists(keyfile))
+ return (ISC_R_FILENOTFOUND);
+
+ result = cfg_parser_create(mctx, lctx, &pctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_parse_file(pctx, keyfile, &cfg_type_sessionkey,
+ &file);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_map_get(file, "key", &key);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ (void) cfg_map_get(key, "secret", &secretobj);
+ (void) cfg_map_get(key, "algorithm", &algorithmobj);
+ if (secretobj == NULL || algorithmobj == NULL)
+ fatal("key must have algorithm and secret");
+
+ keyname = cfg_obj_asstring(cfg_map_getname(key));
+ secretstr = cfg_obj_asstring(secretobj);
+ algorithm = cfg_obj_asstring(algorithmobj);
+
+ strncpy(keynametext, keyname, sizeof(keynametext));
+ strncpy(keysecret, secretstr, sizeof(keysecret));
+ parse_hmac(algorithm);
+ setup_text_key();
+
+ cleanup:
+ if (pctx != NULL) {
+ if (file != NULL)
+ cfg_obj_destroy(pctx, &file);
+ cfg_parser_destroy(&pctx);
+ }
+
+ return (result);
+}
+
static void
setup_file_key(void) {
isc_result_t result;
dst_key_t *dstkey = NULL;
debug("setup_file_key()");
- result = dst_key_fromnamedfile(keyfile, DST_TYPE_PRIVATE | DST_TYPE_KEY,
- mctx, &dstkey);
+
+ /* Try reading the key from a K* pair */
+ result = dst_key_fromnamedfile(keyfile, NULL,
+ DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
+ &dstkey);
+
+ /* If that didn't work, try reading it as a session.key keyfile */
+ if (result != ISC_R_SUCCESS) {
+ result = read_confkey();
+ if (result == ISC_R_SUCCESS)
+ return;
+ }
+
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "Couldn't read key from %s: %s\n",
keyfile, isc_result_totext(result));
@@ -1119,6 +1291,7 @@ set_search_domain(char *domain) {
void
setup_libs(void) {
isc_result_t result;
+ isc_logconfig_t *logconfig = NULL;
debug("setup_libs()");
@@ -1135,6 +1308,18 @@ setup_libs(void) {
result = isc_mem_create(0, 0, &mctx);
check_result(result, "isc_mem_create");
+ result = isc_log_create(mctx, &lctx, &logconfig);
+ check_result(result, "isc_log_create");
+
+ isc_log_setcontext(lctx);
+ dns_log_init(lctx);
+ dns_log_setcontext(lctx);
+
+ result = isc_log_usechannel(logconfig, "default_debug", NULL, NULL);
+ check_result(result, "isc_log_usechannel");
+
+ isc_log_setdebuglevel(lctx, 0);
+
result = isc_taskmgr_create(mctx, 1, 0, &taskmgr);
check_result(result, "isc_taskmgr_create");
@@ -1871,7 +2056,7 @@ setup_lookup(dig_lookup_t *lookup) {
isc_buffer_init(&b, lookup->origin->origin, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->oname, &b, dns_rootname,
- ISC_FALSE, &lookup->onamebuf);
+ 0, &lookup->onamebuf);
if (result != ISC_R_SUCCESS) {
dns_message_puttempname(lookup->sendmsg,
&lookup->name);
@@ -1888,7 +2073,7 @@ setup_lookup(dig_lookup_t *lookup) {
isc_buffer_init(&b, lookup->textname, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->name, &b,
- lookup->oname, ISC_FALSE,
+ lookup->oname, 0,
&lookup->namebuf);
}
if (result != ISC_R_SUCCESS) {
@@ -1912,16 +2097,14 @@ setup_lookup(dig_lookup_t *lookup) {
isc_buffer_init(&b, idn_textname, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->name, &b,
- dns_rootname,
- ISC_FALSE,
+ dns_rootname, 0,
&lookup->namebuf);
#else
len = strlen(lookup->textname);
isc_buffer_init(&b, lookup->textname, len);
isc_buffer_add(&b, len);
result = dns_name_fromtext(lookup->name, &b,
- dns_rootname,
- ISC_FALSE,
+ dns_rootname, 0,
&lookup->namebuf);
#endif
}
@@ -3549,9 +3732,11 @@ destroy_libs(void) {
free_name(&chase_signame, mctx);
#endif
- debug("Destroy memory");
-
#endif
+ debug("Removing log context");
+ isc_log_destroy(&lctx);
+
+ debug("Destroy memory");
if (memdebugging != 0)
isc_mem_stats(mctx, stderr);
if (mctx != NULL)
@@ -4041,7 +4226,7 @@ get_trusted_key(isc_mem_t *mctx)
return (ISC_R_FAILURE);
}
fclose(fptemp);
- result = dst_key_fromnamedfile(filetemp, DST_TYPE_PUBLIC,
+ result = dst_key_fromnamedfile(filetemp, NULL, DST_TYPE_PUBLIC,
mctx, &key);
removetmpkey(mctx, filetemp);
isc_mem_free(mctx, filetemp);
@@ -4075,7 +4260,7 @@ nameFromString(const char *str, dns_name_t *p_ret) {
dns_fixedname_init(&fixedname);
result = dns_name_fromtext(dns_fixedname_name(&fixedname), &buffer,
- dns_rootname, ISC_TRUE, NULL);
+ dns_rootname, DNS_NAME_DOWNCASE, NULL);
check_result(result, "nameFromString");
if (dns_name_dynamic(p_ret))
diff --git a/contrib/bind9/bin/dig/host.1 b/contrib/bind9/bin/dig/host.1
index 1573eff..464d517 100644
--- a/contrib/bind9/bin/dig/host.1
+++ b/contrib/bind9/bin/dig/host.1
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: host.1,v 1.29.114.2 2009-07-11 01:55:20 tbox Exp $
+.\" $Id: host.1,v 1.31 2009-07-11 01:12:45 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/dig/host.c b/contrib/bind9/bin/dig/host.c
index ab0be99..13569f6 100644
--- a/contrib/bind9/bin/dig/host.c
+++ b/contrib/bind9/bin/dig/host.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: host.c,v 1.116.216.5 2010-10-19 23:45:58 tbox Exp $ */
+/* $Id: host.c,v 1.124 2010-11-16 05:38:30 marka Exp $ */
/*! \file */
@@ -141,6 +141,9 @@ rcode_totext(dns_rcode_t rcode)
return totext.deconsttext;
}
+ISC_PLATFORM_NORETURN_PRE static void
+show_usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
show_usage(void) {
fputs(
diff --git a/contrib/bind9/bin/dig/host.docbook b/contrib/bind9/bin/dig/host.docbook
index 41175aa..9ffd8e6 100644
--- a/contrib/bind9/bin/dig/host.docbook
+++ b/contrib/bind9/bin/dig/host.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: host.docbook,v 1.18.114.2 2009-01-22 23:47:05 tbox Exp $ -->
+<!-- $Id: host.docbook,v 1.20 2009-01-20 23:47:56 tbox Exp $ -->
<refentry id="man.host">
<refentryinfo>
diff --git a/contrib/bind9/bin/dig/host.html b/contrib/bind9/bin/dig/host.html
index de4b579..531fc1d 100644
--- a/contrib/bind9/bin/dig/host.html
+++ b/contrib/bind9/bin/dig/host.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: host.html,v 1.28.114.2 2009-07-11 01:55:20 tbox Exp $ -->
+<!-- $Id: host.html,v 1.30 2009-07-11 01:12:45 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/dig/include/dig/dig.h b/contrib/bind9/bin/dig/include/dig/dig.h
index 3d696c7..c0f778b 100644
--- a/contrib/bind9/bin/dig/include/dig/dig.h
+++ b/contrib/bind9/bin/dig/include/dig/dig.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dig.h,v 1.107.120.2 2009-01-06 23:47:26 tbox Exp $ */
+/* $Id: dig.h,v 1.111 2009-09-29 15:06:06 fdupont Exp $ */
#ifndef DIG_H
#define DIG_H
@@ -292,8 +292,9 @@ isc_result_t
get_reverse(char *reverse, size_t len, char *value, isc_boolean_t ip6_int,
isc_boolean_t strict);
-void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
void
debug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
@@ -325,6 +326,13 @@ setup_libs(void);
void
setup_system(void);
+isc_result_t
+parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
+ const char *desc);
+
+void
+parse_hmac(const char *hmacstr);
+
dig_lookup_t *
requeue_lookup(dig_lookup_t *lookold, isc_boolean_t servers);
diff --git a/contrib/bind9/bin/dig/nslookup.1 b/contrib/bind9/bin/dig/nslookup.1
index a8331f9..e97ee1f 100644
--- a/contrib/bind9/bin/dig/nslookup.1
+++ b/contrib/bind9/bin/dig/nslookup.1
@@ -12,7 +12,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: nslookup.1,v 1.14.354.2 2010-02-23 01:56:02 tbox Exp $
+.\" $Id: nslookup.1,v 1.16 2010-02-23 01:14:31 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/dig/nslookup.c b/contrib/bind9/bin/dig/nslookup.c
index 8a166fd..0d368b1 100644
--- a/contrib/bind9/bin/dig/nslookup.c
+++ b/contrib/bind9/bin/dig/nslookup.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nslookup.c,v 1.117.334.5 2009-10-20 01:11:22 marka Exp $ */
+/* $Id: nslookup.c,v 1.127 2010-11-17 23:47:08 tbox Exp $ */
#include <config.h>
@@ -541,22 +541,6 @@ safecpy(char *dest, char *src, int size) {
dest[size-1] = 0;
}
-static isc_result_t
-parse_uint(isc_uint32_t *uip, const char *value, isc_uint32_t max,
- const char *desc) {
- isc_uint32_t n;
- isc_result_t result = isc_parse_uint32(&n, value, 10);
- if (result == ISC_R_SUCCESS && n > max)
- result = ISC_R_RANGE;
- if (result != ISC_R_SUCCESS) {
- printf("invalid %s '%s': %s\n", desc,
- value, isc_result_totext(result));
- return result;
- }
- *uip = n;
- return (ISC_R_SUCCESS);
-}
-
static void
set_port(const char *value) {
isc_uint32_t n;
diff --git a/contrib/bind9/bin/dig/nslookup.docbook b/contrib/bind9/bin/dig/nslookup.docbook
index fb6e706..9c4789d 100644
--- a/contrib/bind9/bin/dig/nslookup.docbook
+++ b/contrib/bind9/bin/dig/nslookup.docbook
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nslookup.docbook,v 1.16.334.2 2010-02-22 23:47:53 tbox Exp $ -->
+<!-- $Id: nslookup.docbook,v 1.18 2010-02-22 23:49:11 tbox Exp $ -->
<!--
- Copyright (c) 1985, 1989
- The Regents of the University of California. All rights reserved.
diff --git a/contrib/bind9/bin/dig/nslookup.html b/contrib/bind9/bin/dig/nslookup.html
index bff3528..bae63bd 100644
--- a/contrib/bind9/bin/dig/nslookup.html
+++ b/contrib/bind9/bin/dig/nslookup.html
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nslookup.html,v 1.21.354.2 2010-02-23 01:56:02 tbox Exp $ -->
+<!-- $Id: nslookup.html,v 1.23 2010-02-23 01:14:31 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/dnssec/Makefile.in b/contrib/bind9/bin/dnssec/Makefile.in
index 50429be..0f5e4e8 100644
--- a/contrib/bind9/bin/dnssec/Makefile.in
+++ b/contrib/bind9/bin/dnssec/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.35 2008-11-07 02:28:49 marka Exp $
+# $Id: Makefile.in,v 1.42 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -25,11 +25,12 @@ top_srcdir = @top_srcdir@
CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES}
-CDEFINES = -DVERSION=\"${VERSION}\"
+CDEFINES = -DVERSION=\"${VERSION}\" @USE_PKCS11@
CWARNINGS =
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@
ISCDEPLIBS = ../../lib/isc/libisc.@A@
@@ -38,44 +39,56 @@ DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS}
LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${DNSLIBS} ${ISCNOSYMLIBS} @LIBS@
+
# Alphabetically
TARGETS = dnssec-keygen@EXEEXT@ dnssec-signzone@EXEEXT@ \
- dnssec-keyfromlabel@EXEEXT@ dnssec-dsfromkey@EXEEXT@
+ dnssec-keyfromlabel@EXEEXT@ dnssec-dsfromkey@EXEEXT@ \
+ dnssec-revoke@EXEEXT@ dnssec-settime@EXEEXT@
OBJS = dnssectool.@O@
SRCS = dnssec-dsfromkey.c dnssec-keyfromlabel.c dnssec-keygen.c \
- dnssec-signzone.c dnssectool.c
+ dnssec-revoke.c dnssec-settime.c dnssec-signzone.c dnssectool.c
MANPAGES = dnssec-dsfromkey.8 dnssec-keyfromlabel.8 dnssec-keygen.8 \
- dnssec-signzone.8
+ dnssec-revoke.8 dnssec-settime.8 dnssec-signzone.8
HTMLPAGES = dnssec-dsfromkey.html dnssec-keyfromlabel.html \
- dnssec-keygen.html dnssec-signzone.html
+ dnssec-keygen.html dnssec-revoke.html \
+ dnssec-settime.html dnssec-signzone.html
MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
dnssec-dsfromkey@EXEEXT@: dnssec-dsfromkey.@O@ ${OBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-dsfromkey.@O@ ${OBJS} ${LIBS}
+ export BASEOBJS="dnssec-dsfromkey.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
dnssec-keyfromlabel@EXEEXT@: dnssec-keyfromlabel.@O@ ${OBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-keyfromlabel.@O@ ${OBJS} ${LIBS}
+ export BASEOBJS="dnssec-keyfromlabel.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
dnssec-keygen@EXEEXT@: dnssec-keygen.@O@ ${OBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-keygen.@O@ ${OBJS} ${LIBS}
+ export BASEOBJS="dnssec-keygen.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
dnssec-signzone.@O@: dnssec-signzone.c
${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -DVERSION=\"${VERSION}\" \
-c ${srcdir}/dnssec-signzone.c
dnssec-signzone@EXEEXT@: dnssec-signzone.@O@ ${OBJS} ${DEPLIBS}
+ export BASEOBJS="dnssec-signzone.@O@ ${OBJS}"; \
+ ${FINALBUILDCMD}
+
+dnssec-revoke@EXEEXT@: dnssec-revoke.@O@ ${OBJS} ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dnssec-revoke.@O@ ${OBJS} ${LIBS}
+
+dnssec-settime@EXEEXT@: dnssec-settime.@O@ ${OBJS} ${DEPLIBS}
${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- dnssec-signzone.@O@ ${OBJS} ${LIBS}
+ dnssec-settime.@O@ ${OBJS} ${LIBS}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8 b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8
index c49ccdc..25aa2bf 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
@@ -12,18 +12,18 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-dsfromkey.8,v 1.5.14.1 2010-05-19 02:06:11 tbox Exp $
+.\" $Id: dnssec-dsfromkey.8,v 1.13 2010-12-24 01:14:20 tbox Exp $
.\"
.hy 0
.ad l
.\" Title: dnssec\-dsfromkey
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
-.\" Date: November 29, 2008
+.\" Date: August 26, 2009
.\" Manual: BIND9
.\" Source: BIND9
.\"
-.TH "DNSSEC\-DSFROMKEY" "8" "November 29, 2008" "BIND9" "BIND9"
+.TH "DNSSEC\-DSFROMKEY" "8" "August 26, 2009" "BIND9" "BIND9"
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@@ -32,9 +32,9 @@
dnssec\-dsfromkey \- DNSSEC DS RR generation tool
.SH "SYNOPSIS"
.HP 17
-\fBdnssec\-dsfromkey\fR [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] {keyfile}
+\fBdnssec\-dsfromkey\fR [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] {keyfile}
.HP 17
-\fBdnssec\-dsfromkey\fR {\-s} [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdir\fR\fR] {dnsname}
+\fBdnssec\-dsfromkey\fR {\-s} [\fB\-1\fR] [\fB\-2\fR] [\fB\-a\ \fR\fB\fIalg\fR\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-s\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIfile\fR\fR] [\fB\-A\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] {dnsname}
.SH "DESCRIPTION"
.PP
\fBdnssec\-dsfromkey\fR
@@ -55,31 +55,49 @@ Use SHA\-256 as the digest algorithm.
.RS 4
Select the digest algorithm. The value of
\fBalgorithm\fR
-must be one of SHA\-1 (SHA1) or SHA\-256 (SHA256). These values are case insensitive.
+must be one of SHA\-1 (SHA1), SHA\-256 (SHA256) or GOST. These values are case insensitive.
.RE
.PP
-\-v \fIlevel\fR
+\-K \fIdirectory\fR
.RS 4
-Sets the debugging level.
+Look for key files (or, in keyset mode,
+\fIkeyset\-\fR
+files) in
+\fBdirectory\fR.
+.RE
+.PP
+\-f \fIfile\fR
+.RS 4
+Zone file mode: in place of the keyfile name, the argument is the DNS domain name of a zone master file, which can be read from
+\fBfile\fR. If the zone name is the same as
+\fBfile\fR, then it may be omitted.
+.RE
+.PP
+\-A
+.RS 4
+Include ZSK's when generating DS records. Without this option, only keys which have the KSK flag set will be converted to DS records and printed. Useful only in zone file mode.
+.RE
+.PP
+\-l \fIdomain\fR
+.RS 4
+Generate a DLV set instead of a DS set. The specified
+\fBdomain\fR
+is appended to the name for each record in the set. The DNSSEC Lookaside Validation (DLV) RR is described in RFC 4431.
.RE
.PP
\-s
.RS 4
-Keyset mode: in place of the keyfile name, the argument is the DNS domain name of a keyset file. Following options make sense only in this mode.
+Keyset mode: in place of the keyfile name, the argument is the DNS domain name of a keyset file.
.RE
.PP
\-c \fIclass\fR
.RS 4
-Specifies the DNS class (default is IN), useful only in the keyset mode.
+Specifies the DNS class (default is IN). Useful only in keyset or zone file mode.
.RE
.PP
-\-d \fIdirectory\fR
+\-v \fIlevel\fR
.RS 4
-Look for
-\fIkeyset\fR
-files in
-\fBdirectory\fR
-as the directory, ignored when not in the keyset mode.
+Sets the debugging level.
.RE
.SH "EXAMPLE"
.PP
@@ -115,10 +133,11 @@ A keyfile error can give a "file not found" even if the file exists.
\fBdnssec\-signzone\fR(8),
BIND 9 Administrator Reference Manual,
RFC 3658,
+RFC 4431.
RFC 4509.
.SH "AUTHOR"
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2008 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2008\-2010 Internet Systems Consortium, Inc. ("ISC")
.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c
index 934d25b..b7f84a0 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-dsfromkey.c,v 1.2.14.6 2010-01-11 23:47:22 tbox Exp $ */
+/* $Id: dnssec-dsfromkey.c,v 1.19 2010-12-23 04:07:59 marka Exp $ */
/*! \file */
@@ -36,6 +36,8 @@
#include <dns/ds.h>
#include <dns/fixedname.h>
#include <dns/log.h>
+#include <dns/keyvalues.h>
+#include <dns/master.h>
#include <dns/name.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
@@ -48,54 +50,40 @@
#include "dnssectool.h"
+#ifndef PATH_MAX
+#define PATH_MAX 1024 /* AIX, WIN32, and others don't define this. */
+#endif
+
const char *program = "dnssec-dsfromkey";
int verbose;
static dns_rdataclass_t rdclass;
-static dns_fixedname_t fixed;
-static dns_name_t *name = NULL;
-static dns_db_t *db = NULL;
-static dns_dbnode_t *node = NULL;
-static dns_rdataset_t keyset;
-static isc_mem_t *mctx = NULL;
+static dns_fixedname_t fixed;
+static dns_name_t *name = NULL;
+static isc_mem_t *mctx = NULL;
-static void
-loadkeys(char *dirname, char *setname)
-{
- isc_result_t result;
- char filename[1024];
- isc_buffer_t buf;
+static isc_result_t
+initname(char *setname) {
+ isc_result_t result;
+ isc_buffer_t buf;
- dns_rdataset_init(&keyset);
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
isc_buffer_init(&buf, setname, strlen(setname));
isc_buffer_add(&buf, strlen(setname));
- result = dns_name_fromtext(name, &buf, dns_rootname, ISC_FALSE, NULL);
- if (result != ISC_R_SUCCESS)
- fatal("can't convert DNS name %s", setname);
+ result = dns_name_fromtext(name, &buf, dns_rootname, 0, NULL);
+ return (result);
+}
- isc_buffer_init(&buf, filename, sizeof(filename));
- if (dirname != NULL) {
- if (isc_buffer_availablelength(&buf) < strlen(dirname))
- fatal("directory name '%s' too long", dirname);
- isc_buffer_putstr(&buf, dirname);
- if (dirname[strlen(dirname) - 1] != '/') {
- if (isc_buffer_availablelength(&buf) < 1)
- fatal("directory name '%s' too long", dirname);
- isc_buffer_putstr(&buf, "/");
- }
- }
+static isc_result_t
+loadsetfromfile(char *filename, dns_rdataset_t *rdataset) {
+ isc_result_t result;
+ dns_db_t *db = NULL;
+ dns_dbnode_t *node = NULL;
+ char setname[DNS_NAME_FORMATSIZE];
- if (isc_buffer_availablelength(&buf) < strlen("keyset-"))
- fatal("directory name '%s' too long", dirname);
- isc_buffer_putstr(&buf, "keyset-");
- result = dns_name_tofilenametext(name, ISC_FALSE, &buf);
- check_result(result, "dns_name_tofilenametext()");
- if (isc_buffer_availablelength(&buf) == 0)
- fatal("name %s too long", setname);
- isc_buffer_putuint8(&buf, 0);
+ dns_name_format(name, setname, sizeof(setname));
result = dns_db_create(mctx, "rbt", name, dns_dbtype_zone,
rdclass, 0, NULL, &db);
@@ -111,11 +99,49 @@ loadkeys(char *dirname, char *setname)
fatal("can't find %s node in %s", setname, filename);
result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey,
- 0, 0, &keyset, NULL);
+ 0, 0, rdataset, NULL);
+
if (result == ISC_R_NOTFOUND)
fatal("no DNSKEY RR for %s in %s", setname, filename);
else if (result != ISC_R_SUCCESS)
fatal("dns_db_findrdataset");
+
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ if (db != NULL)
+ dns_db_detach(&db);
+ return (result);
+}
+
+static isc_result_t
+loadkeyset(char *dirname, dns_rdataset_t *rdataset) {
+ isc_result_t result;
+ char filename[PATH_MAX + 1];
+ isc_buffer_t buf;
+
+ dns_rdataset_init(rdataset);
+
+ isc_buffer_init(&buf, filename, sizeof(filename));
+ if (dirname != NULL) {
+ /* allow room for a trailing slash */
+ if (strlen(dirname) >= isc_buffer_availablelength(&buf))
+ return (ISC_R_NOSPACE);
+ isc_buffer_putstr(&buf, dirname);
+ if (dirname[strlen(dirname) - 1] != '/')
+ isc_buffer_putstr(&buf, "/");
+ }
+
+ if (isc_buffer_availablelength(&buf) < 7)
+ return (ISC_R_NOSPACE);
+ isc_buffer_putstr(&buf, "keyset-");
+
+ result = dns_name_tofilenametext(name, ISC_FALSE, &buf);
+ check_result(result, "dns_name_tofilenametext()");
+ if (isc_buffer_availablelength(&buf) == 0)
+ return (ISC_R_NOSPACE);
+ isc_buffer_putuint8(&buf, 0);
+
+ return (loadsetfromfile(filename, rdataset));
}
static void
@@ -127,20 +153,20 @@ loadkey(char *filename, unsigned char *key_buf, unsigned int key_buf_size,
isc_buffer_t keyb;
isc_region_t r;
- dns_rdataset_init(&keyset);
dns_rdata_init(rdata);
isc_buffer_init(&keyb, key_buf, key_buf_size);
- result = dst_key_fromnamedfile(filename, DST_TYPE_PUBLIC, mctx, &key);
+ result = dst_key_fromnamedfile(filename, NULL, DST_TYPE_PUBLIC,
+ mctx, &key);
if (result != ISC_R_SUCCESS)
fatal("invalid keyfile name %s: %s",
filename, isc_result_totext(result));
if (verbose > 2) {
- char keystr[KEY_FORMATSIZE];
+ char keystr[DST_KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ dst_key_format(key, keystr, sizeof(keystr));
fprintf(stderr, "%s: %s\n", program, keystr);
}
@@ -169,7 +195,7 @@ logkey(dns_rdata_t *rdata)
isc_result_t result;
dst_key_t *key = NULL;
isc_buffer_t buf;
- char keystr[KEY_FORMATSIZE];
+ char keystr[DST_KEY_FORMATSIZE];
isc_buffer_init(&buf, rdata->data, rdata->length);
isc_buffer_add(&buf, rdata->length);
@@ -177,89 +203,132 @@ logkey(dns_rdata_t *rdata)
if (result != ISC_R_SUCCESS)
return;
- key_format(key, keystr, sizeof(keystr));
+ dst_key_format(key, keystr, sizeof(keystr));
fprintf(stderr, "%s: %s\n", program, keystr);
dst_key_free(&key);
}
static void
-emitds(unsigned int dtype, dns_rdata_t *rdata)
+emit(unsigned int dtype, isc_boolean_t showall, char *lookaside,
+ dns_rdata_t *rdata)
{
- isc_result_t result;
- unsigned char buf[DNS_DS_BUFFERSIZE];
- char text_buf[DST_KEY_MAXTEXTSIZE];
- char class_buf[10];
- isc_buffer_t textb, classb;
- isc_region_t r;
- dns_rdata_t ds;
+ isc_result_t result;
+ unsigned char buf[DNS_DS_BUFFERSIZE];
+ char text_buf[DST_KEY_MAXTEXTSIZE];
+ char name_buf[DNS_NAME_MAXWIRE];
+ char class_buf[10];
+ isc_buffer_t textb, nameb, classb;
+ isc_region_t r;
+ dns_rdata_t ds;
+ dns_rdata_dnskey_t dnskey;
isc_buffer_init(&textb, text_buf, sizeof(text_buf));
+ isc_buffer_init(&nameb, name_buf, sizeof(name_buf));
isc_buffer_init(&classb, class_buf, sizeof(class_buf));
dns_rdata_init(&ds);
+ result = dns_rdata_tostruct(rdata, &dnskey, NULL);
+ if (result != ISC_R_SUCCESS)
+ fatal("can't convert DNSKEY");
+
+ if ((dnskey.flags & DNS_KEYFLAG_KSK) == 0 && !showall)
+ return;
+
result = dns_ds_buildrdata(name, rdata, dtype, buf, &ds);
if (result != ISC_R_SUCCESS)
- fatal("can't build DS");
+ fatal("can't build record");
+
+ result = dns_name_totext(name, ISC_FALSE, &nameb);
+ if (result != ISC_R_SUCCESS)
+ fatal("can't print name");
+
+ /* Add lookaside origin, if set */
+ if (lookaside != NULL) {
+ if (isc_buffer_availablelength(&nameb) < strlen(lookaside))
+ fatal("DLV origin '%s' is too long", lookaside);
+ isc_buffer_putstr(&nameb, lookaside);
+ if (lookaside[strlen(lookaside) - 1] != '.') {
+ if (isc_buffer_availablelength(&nameb) < 1)
+ fatal("DLV origin '%s' is too long", lookaside);
+ isc_buffer_putstr(&nameb, ".");
+ }
+ }
result = dns_rdata_totext(&ds, (dns_name_t *) NULL, &textb);
if (result != ISC_R_SUCCESS)
- fatal("can't print DS rdata");
+ fatal("can't print rdata");
result = dns_rdataclass_totext(rdclass, &classb);
if (result != ISC_R_SUCCESS)
- fatal("can't print DS class");
+ fatal("can't print class");
- result = dns_name_print(name, stdout);
- if (result != ISC_R_SUCCESS)
- fatal("can't print DS name");
+ isc_buffer_usedregion(&nameb, &r);
+ isc_util_fwrite(r.base, 1, r.length, stdout);
putchar(' ');
isc_buffer_usedregion(&classb, &r);
isc_util_fwrite(r.base, 1, r.length, stdout);
- printf(" DS ");
+ if (lookaside == NULL)
+ printf(" DS ");
+ else
+ printf(" DLV ");
isc_buffer_usedregion(&textb, &r);
isc_util_fwrite(r.base, 1, r.length, stdout);
putchar('\n');
}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s options keyfile\n\n", program);
- fprintf(stderr, " %s options [-c class] [-d dir] -s dnsname\n\n",
+ fprintf(stderr, " %s options [-K dir] keyfile\n\n", program);
+ fprintf(stderr, " %s options [-K dir] [-c class] -s dnsname\n\n",
program);
+ fprintf(stderr, " %s options -f zonefile (as zone name)\n\n", program);
+ fprintf(stderr, " %s options -f zonefile zonename\n\n", program);
fprintf(stderr, "Version: %s\n", VERSION);
fprintf(stderr, "Options:\n");
fprintf(stderr, " -v <verbose level>\n");
+ fprintf(stderr, " -K <directory>: directory in which to find "
+ "key file or keyset file\n");
+ fprintf(stderr, " -a algorithm: digest algorithm "
+ "(SHA-1, SHA-256 or GOST)\n");
fprintf(stderr, " -1: use SHA-1\n");
fprintf(stderr, " -2: use SHA-256\n");
- fprintf(stderr, " -a algorithm: use algorithm\n");
- fprintf(stderr, "Keyset options:\n");
- fprintf(stderr, " -s: keyset mode\n");
- fprintf(stderr, " -c class\n");
- fprintf(stderr, " -d directory\n");
- fprintf(stderr, "Output: DS RRs\n");
+ fprintf(stderr, " -l: add lookaside zone and print DLV records\n");
+ fprintf(stderr, " -s: read keyset from keyset-<dnsname> file\n");
+ fprintf(stderr, " -c class: rdata class for DS set (default: IN)\n");
+ fprintf(stderr, " -f file: read keyset from zone file\n");
+ fprintf(stderr, " -A: when used with -f, "
+ "include all keys in DS set, not just KSKs\n");
+ fprintf(stderr, "Output: DS or DLV RRs\n");
exit (-1);
}
int
main(int argc, char **argv) {
- char *algname = NULL, *classname = NULL, *dirname = NULL;
- char *endp;
- int ch;
- unsigned int dtype = DNS_DSDIGEST_SHA1;
- isc_boolean_t both = ISC_TRUE;
- isc_boolean_t usekeyset = ISC_FALSE;
- isc_result_t result;
- isc_log_t *log = NULL;
- isc_entropy_t *ectx = NULL;
- dns_rdata_t rdata;
+ char *algname = NULL, *classname = NULL;
+ char *filename = NULL, *dir = NULL, *namestr;
+ char *lookaside = NULL;
+ char *endp;
+ int ch;
+ unsigned int dtype = DNS_DSDIGEST_SHA1;
+ isc_boolean_t both = ISC_TRUE;
+ isc_boolean_t usekeyset = ISC_FALSE;
+ isc_boolean_t showall = ISC_FALSE;
+ isc_result_t result;
+ isc_log_t *log = NULL;
+ isc_entropy_t *ectx = NULL;
+ dns_rdataset_t rdataset;
+ dns_rdata_t rdata;
dns_rdata_init(&rdata);
@@ -275,7 +344,7 @@ main(int argc, char **argv) {
isc_commandline_errprint = ISC_FALSE;
while ((ch = isc_commandline_parse(argc, argv,
- "12a:c:d:sv:h")) != -1) {
+ "12Aa:c:d:Ff:K:l:sv:h")) != -1) {
switch (ch) {
case '1':
dtype = DNS_DSDIGEST_SHA1;
@@ -285,6 +354,9 @@ main(int argc, char **argv) {
dtype = DNS_DSDIGEST_SHA256;
both = ISC_FALSE;
break;
+ case 'A':
+ showall = ISC_TRUE;
+ break;
case 'a':
algname = isc_commandline_argument;
both = ISC_FALSE;
@@ -293,7 +365,21 @@ main(int argc, char **argv) {
classname = isc_commandline_argument;
break;
case 'd':
- dirname = isc_commandline_argument;
+ fprintf(stderr, "%s: the -d option is deprecated; "
+ "use -K\n", program);
+ /* fall through */
+ case 'K':
+ dir = isc_commandline_argument;
+ if (strlen(dir) == 0U)
+ fatal("directory must be non-empty string");
+ break;
+ case 'f':
+ filename = isc_commandline_argument;
+ break;
+ case 'l':
+ lookaside = isc_commandline_argument;
+ if (strlen(lookaside) == 0U)
+ fatal("lookaside must be a non-empty string");
break;
case 's':
usekeyset = ISC_TRUE;
@@ -303,11 +389,14 @@ main(int argc, char **argv) {
if (*endp != '\0')
fatal("-v must be followed by a number");
break;
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
program, isc_commandline_option);
- /* Falls into */
+ /* FALLTHROUGH */
case 'h':
usage();
@@ -325,13 +414,24 @@ main(int argc, char **argv) {
else if (strcasecmp(algname, "SHA256") == 0 ||
strcasecmp(algname, "SHA-256") == 0)
dtype = DNS_DSDIGEST_SHA256;
+#ifdef HAVE_OPENSSL_GOST
+ else if (strcasecmp(algname, "GOST") == 0)
+ dtype = DNS_DSDIGEST_GOST;
+#endif
else
fatal("unknown algorithm %s", algname);
}
rdclass = strtoclass(classname);
- if (argc < isc_commandline_index + 1)
+ if (usekeyset && filename != NULL)
+ fatal("cannot use both -s and -f");
+
+ /* When not using -f, -A is implicit */
+ if (filename == NULL)
+ showall = ISC_TRUE;
+
+ if (argc < isc_commandline_index + 1 && filename == NULL)
fatal("the key file name was not specified");
if (argc > isc_commandline_index + 1)
fatal("extraneous arguments");
@@ -344,28 +444,50 @@ main(int argc, char **argv) {
result = dst_lib_init(mctx, ectx,
ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
if (result != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(result));
isc_entropy_stopcallbacksources(ectx);
setup_logging(verbose, mctx, &log);
- if (usekeyset) {
- loadkeys(dirname, argv[isc_commandline_index]);
+ dns_rdataset_init(&rdataset);
+
+ if (usekeyset || filename != NULL) {
+ if (argc < isc_commandline_index + 1 && filename != NULL) {
+ /* using zone name as the zone file name */
+ namestr = filename;
+ } else
+ namestr = argv[isc_commandline_index];
- for (result = dns_rdataset_first(&keyset);
+ result = initname(namestr);
+ if (result != ISC_R_SUCCESS)
+ fatal("could not initialize name %s", namestr);
+
+ if (usekeyset)
+ result = loadkeyset(dir, &rdataset);
+ else
+ result = loadsetfromfile(filename, &rdataset);
+
+ if (result != ISC_R_SUCCESS)
+ fatal("could not load DNSKEY set: %s\n",
+ isc_result_totext(result));
+
+ for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&keyset)) {
+ result = dns_rdataset_next(&rdataset)) {
dns_rdata_init(&rdata);
- dns_rdataset_current(&keyset, &rdata);
+ dns_rdataset_current(&rdataset, &rdata);
if (verbose > 2)
logkey(&rdata);
if (both) {
- emitds(DNS_DSDIGEST_SHA1, &rdata);
- emitds(DNS_DSDIGEST_SHA256, &rdata);
+ emit(DNS_DSDIGEST_SHA1, showall, lookaside,
+ &rdata);
+ emit(DNS_DSDIGEST_SHA256, showall, lookaside,
+ &rdata);
} else
- emitds(dtype, &rdata);
+ emit(dtype, showall, lookaside, &rdata);
}
} else {
unsigned char key_buf[DST_KEY_MAXSIZE];
@@ -374,18 +496,14 @@ main(int argc, char **argv) {
DST_KEY_MAXSIZE, &rdata);
if (both) {
- emitds(DNS_DSDIGEST_SHA1, &rdata);
- emitds(DNS_DSDIGEST_SHA256, &rdata);
+ emit(DNS_DSDIGEST_SHA1, showall, lookaside, &rdata);
+ emit(DNS_DSDIGEST_SHA256, showall, lookaside, &rdata);
} else
- emitds(dtype, &rdata);
+ emit(dtype, showall, lookaside, &rdata);
}
- if (dns_rdataset_isassociated(&keyset))
- dns_rdataset_disassociate(&keyset);
- if (node != NULL)
- dns_db_detachnode(db, &node);
- if (db != NULL)
- dns_db_detach(&db);
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
cleanup_logging(&log);
dst_lib_destroy();
isc_hash_destroy();
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook
index c4ea38d..36410d5 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -17,10 +17,10 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-dsfromkey.docbook,v 1.6 2008-11-07 13:54:11 jreed Exp $ -->
+<!-- $Id: dnssec-dsfromkey.docbook,v 1.12 2010-12-23 23:47:08 tbox Exp $ -->
<refentry id="man.dnssec-dsfromkey">
<refentryinfo>
- <date>November 29, 2008</date>
+ <date>August 26, 2009</date>
</refentryinfo>
<refmeta>
@@ -37,6 +37,8 @@
<docinfo>
<copyright>
<year>2008</year>
+ <year>2009</year>
+ <year>2010</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
@@ -48,17 +50,22 @@
<arg><option>-1</option></arg>
<arg><option>-2</option></arg>
<arg><option>-a <replaceable class="parameter">alg</replaceable></option></arg>
+ <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
<arg choice="req">keyfile</arg>
</cmdsynopsis>
<cmdsynopsis>
<command>dnssec-dsfromkey</command>
<arg choice="req">-s</arg>
- <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
<arg><option>-1</option></arg>
<arg><option>-2</option></arg>
<arg><option>-a <replaceable class="parameter">alg</replaceable></option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
+ <arg><option>-s</option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
- <arg><option>-d <replaceable class="parameter">dir</replaceable></option></arg>
+ <arg><option>-f <replaceable class="parameter">file</replaceable></option></arg>
+ <arg><option>-A</option></arg>
+ <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
<arg choice="req">dnsname</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -99,17 +106,55 @@
<listitem>
<para>
Select the digest algorithm. The value of
- <option>algorithm</option> must be one of SHA-1 (SHA1) or
- SHA-256 (SHA256). These values are case insensitive.
+ <option>algorithm</option> must be one of SHA-1 (SHA1),
+ SHA-256 (SHA256) or GOST. These values are case insensitive.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-v <replaceable class="parameter">level</replaceable></term>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
<listitem>
<para>
- Sets the debugging level.
+ Look for key files (or, in keyset mode,
+ <filename>keyset-</filename> files) in
+ <option>directory</option>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-f <replaceable class="parameter">file</replaceable></term>
+ <listitem>
+ <para>
+ Zone file mode: in place of the keyfile name, the argument is
+ the DNS domain name of a zone master file, which can be read
+ from <option>file</option>. If the zone name is the same as
+ <option>file</option>, then it may be omitted.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A</term>
+ <listitem>
+ <para>
+ Include ZSK's when generating DS records. Without this option,
+ only keys which have the KSK flag set will be converted to DS
+ records and printed. Useful only in zone file mode.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-l <replaceable class="parameter">domain</replaceable></term>
+ <listitem>
+ <para>
+ Generate a DLV set instead of a DS set. The specified
+ <option>domain</option> is appended to the name for each
+ record in the set.
+ The DNSSEC Lookaside Validation (DLV) RR is described
+ in RFC 4431.
</para>
</listitem>
</varlistentry>
@@ -119,8 +164,7 @@
<listitem>
<para>
Keyset mode: in place of the keyfile name, the argument is
- the DNS domain name of a keyset file. Following options make sense
- only in this mode.
+ the DNS domain name of a keyset file.
</para>
</listitem>
</varlistentry>
@@ -129,23 +173,20 @@
<term>-c <replaceable class="parameter">class</replaceable></term>
<listitem>
<para>
- Specifies the DNS class (default is IN), useful only
- in the keyset mode.
+ Specifies the DNS class (default is IN). Useful only
+ in keyset or zone file mode.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-d <replaceable class="parameter">directory</replaceable></term>
+ <term>-v <replaceable class="parameter">level</replaceable></term>
<listitem>
<para>
- Look for <filename>keyset</filename> files in
- <option>directory</option> as the directory, ignored when
- not in the keyset mode.
+ Sets the debugging level.
</para>
</listitem>
</varlistentry>
-
</variablelist>
</refsect1>
@@ -197,6 +238,7 @@
</citerefentry>,
<citetitle>BIND 9 Administrator Reference Manual</citetitle>,
<citetitle>RFC 3658</citetitle>,
+ <citetitle>RFC 4431</citetitle>.
<citetitle>RFC 4509</citetitle>.
</para>
</refsect1>
diff --git a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html
index 6186481..54cc1ab 100644
--- a/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html
+++ b/contrib/bind9/bin/dnssec/dnssec-dsfromkey.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-dsfromkey.html,v 1.5.14.1 2010-05-19 02:06:11 tbox Exp $ -->
+<!-- $Id: dnssec-dsfromkey.html,v 1.13 2010-12-24 01:14:19 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -28,18 +28,18 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] {keyfile}</p></div>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>dir</code></em></code>] {dnsname}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] {keyfile}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-s</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>file</code></em></code>] [<code class="option">-A</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {dnsname}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543424"></a><h2>DESCRIPTION</h2>
+<a name="id2543464"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-dsfromkey</strong></span>
outputs the Delegation Signer (DS) resource record (RR), as defined in
RFC 3658 and RFC 4509, for the given key(s).
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543435"></a><h2>OPTIONS</h2>
+<a name="id2543476"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-1</span></dt>
<dd><p>
@@ -53,34 +53,54 @@
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd><p>
Select the digest algorithm. The value of
- <code class="option">algorithm</code> must be one of SHA-1 (SHA1) or
- SHA-256 (SHA256). These values are case insensitive.
+ <code class="option">algorithm</code> must be one of SHA-1 (SHA1),
+ SHA-256 (SHA256) or GOST. These values are case insensitive.
</p></dd>
-<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Sets the debugging level.
+ Look for key files (or, in keyset mode,
+ <code class="filename">keyset-</code> files) in
+ <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-f <em class="replaceable"><code>file</code></em></span></dt>
+<dd><p>
+ Zone file mode: in place of the keyfile name, the argument is
+ the DNS domain name of a zone master file, which can be read
+ from <code class="option">file</code>. If the zone name is the same as
+ <code class="option">file</code>, then it may be omitted.
+ </p></dd>
+<dt><span class="term">-A</span></dt>
+<dd><p>
+ Include ZSK's when generating DS records. Without this option,
+ only keys which have the KSK flag set will be converted to DS
+ records and printed. Useful only in zone file mode.
+ </p></dd>
+<dt><span class="term">-l <em class="replaceable"><code>domain</code></em></span></dt>
+<dd><p>
+ Generate a DLV set instead of a DS set. The specified
+ <code class="option">domain</code> is appended to the name for each
+ record in the set.
+ The DNSSEC Lookaside Validation (DLV) RR is described
+ in RFC 4431.
</p></dd>
<dt><span class="term">-s</span></dt>
<dd><p>
Keyset mode: in place of the keyfile name, the argument is
- the DNS domain name of a keyset file. Following options make sense
- only in this mode.
+ the DNS domain name of a keyset file.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
- Specifies the DNS class (default is IN), useful only
- in the keyset mode.
+ Specifies the DNS class (default is IN). Useful only
+ in keyset or zone file mode.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory, ignored when
- not in the keyset mode.
+ Sets the debugging level.
</p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543563"></a><h2>EXAMPLE</h2>
+<a name="id2543662"></a><h2>EXAMPLE</h2>
<p>
To build the SHA-256 DS RR from the
<strong class="userinput"><code>Kexample.com.+003+26160</code></strong>
@@ -95,7 +115,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543593"></a><h2>FILES</h2>
+<a name="id2543692"></a><h2>FILES</h2>
<p>
The keyfile can be designed by the key identification
<code class="filename">Knnnn.+aaa+iiiii</code> or the full file name
@@ -109,22 +129,23 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543628"></a><h2>CAVEAT</h2>
+<a name="id2543728"></a><h2>CAVEAT</h2>
<p>
A keyfile error can give a "file not found" even if the file exists.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543638"></a><h2>SEE ALSO</h2>
+<a name="id2543737"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 3658</em>,
+ <em class="citetitle">RFC 4431</em>.
<em class="citetitle">RFC 4509</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543674"></a><h2>AUTHOR</h2>
+<a name="id2543777"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8 b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8
index 45fc087..d8c19f2 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.8
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC")
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
@@ -12,7 +12,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-keyfromlabel.8,v 1.6.14.3 2010-01-16 01:55:32 tbox Exp $
+.\" $Id: dnssec-keyfromlabel.8,v 1.18.14.1.2.1 2011-06-09 03:41:05 tbox Exp $
.\"
.hy 0
.ad l
@@ -32,18 +32,22 @@
dnssec\-keyfromlabel \- DNSSEC key generation tool
.SH "SYNOPSIS"
.HP 20
-\fBdnssec\-keyfromlabel\fR {\-a\ \fIalgorithm\fR} {\-l\ \fIlabel\fR} [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-k\fR] [\fB\-n\ \fR\fB\fInametype\fR\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] {name}
+\fBdnssec\-keyfromlabel\fR {\-l\ \fIlabel\fR} [\fB\-3\fR] [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-A\ \fR\fB\fIdate/offset\fR\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-D\ \fR\fB\fIdate/offset\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-G\fR] [\fB\-I\ \fR\fB\fIdate/offset\fR\fR] [\fB\-k\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-n\ \fR\fB\fInametype\fR\fR] [\fB\-P\ \fR\fB\fIdate/offset\fR\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-R\ \fR\fB\fIdate/offset\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-y\fR] {name}
.SH "DESCRIPTION"
.PP
\fBdnssec\-keyfromlabel\fR
gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034.
+.PP
+The
+\fBname\fR
+of the key is specified on the command line. This must match the name of the zone for which the key is being generated.
.SH "OPTIONS"
.PP
\-a \fIalgorithm\fR
.RS 4
Selects the cryptographic algorithm. The value of
\fBalgorithm\fR
-must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or DH (Diffie Hellman). These values are case insensitive.
+must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST. These values are case insensitive.
.sp
If no algorithm is specified, then RSASHA1 will be used by default, unless the
\fB\-3\fR
@@ -56,9 +60,19 @@ Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA
Note 2: DH automatically sets the \-k flag.
.RE
.PP
+\-3
+.RS 4
+Use an NSEC3\-capable algorithm to generate a DNSSEC key. If this option is used and no algorithm is explicitly set on the command line, NSEC3RSASHA1 will be used by default.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Specifies the name of the crypto hardware (OpenSSL engine). When compiled with PKCS#11 support it defaults to "pkcs11".
+.RE
+.PP
\-l \fIlabel\fR
.RS 4
-Specifies the label of keys in the crypto hardware (PKCS#11 device).
+Specifies the label of the key pair in the crypto hardware. The label may be preceded by an optional OpenSSL engine name, separated by a colon, as in "pkcs11:keylabel".
.RE
.PP
\-n \fInametype\fR
@@ -68,6 +82,15 @@ Specifies the owner type of the key. The value of
must either be ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)) or OTHER (DNSKEY). These values are case insensitive.
.RE
.PP
+\-C
+.RS 4
+Compatibility mode: generates an old\-style key, without any metadata. By default,
+\fBdnssec\-keyfromlabel\fR
+will include the key's creation date in the metadata stored with the private key, and other dates may be set there as well (publication date, activation date, etc). Keys that include this data may be incompatible with older versions of BIND; the
+\fB\-C\fR
+option suppresses them.
+.RE
+.PP
\-c \fIclass\fR
.RS 4
Indicates that the DNS record containing the key should have the specified class. If not specified, class IN is used.
@@ -75,13 +98,23 @@ Indicates that the DNS record containing the key should have the specified class
.PP
\-f \fIflag\fR
.RS 4
-Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flag is KSK (Key Signing Key) DNSKEY.
+Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flags are KSK (Key Signing Key) and REVOKE.
+.RE
+.PP
+\-G
+.RS 4
+Generate a key, but do not publish it or sign with it. This option is incompatible with \-P and \-A.
.RE
.PP
\-h
.RS 4
Prints a short summary of the options and arguments to
-\fBdnssec\-keygen\fR.
+\fBdnssec\-keyfromlabel\fR.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to be written.
.RE
.PP
\-k
@@ -91,7 +124,7 @@ Generate KEY records rather than DNSKEY records.
.PP
\-p \fIprotocol\fR
.RS 4
-Sets the protocol value for the generated key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.
+Sets the protocol value for the key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.
.RE
.PP
\-t \fItype\fR
@@ -105,6 +138,39 @@ must be one of AUTHCONF, NOAUTHCONF, NOAUTH, or NOCONF. The default is AUTHCONF.
.RS 4
Sets the debugging level.
.RE
+.PP
+\-y
+.RS 4
+Allows DNSSEC key files to be generated even if the key ID would collide with that of an existing key, in the event of either key being revoked. (This is only safe to use if you are sure you won't be using RFC 5011 trust anchor maintenance with either of the keys involved.)
+.RE
+.SH "TIMING OPTIONS"
+.PP
+Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '\-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24\-hour days, ignoring leap years), months (defined as 30 24\-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds.
+.PP
+\-P \fIdate/offset\fR
+.RS 4
+Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-A \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-R \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.
+.RE
+.PP
+\-I \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.
+.RE
+.PP
+\-D \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)
+.RE
.SH "GENERATED KEY FILES"
.PP
When
@@ -138,7 +204,7 @@ file contains a DNS KEY record that can be inserted into a zone file (directly o
.PP
The
\fI.private\fR
-file contains algorithm specific fields. For obvious security reasons, this file does not have general read permission.
+file contains algorithm\-specific fields. For obvious security reasons, this file does not have general read permission.
.SH "SEE ALSO"
.PP
\fBdnssec\-keygen\fR(8),
@@ -149,5 +215,5 @@ RFC 4034.
.PP
Internet Systems Consortium
.SH "COPYRIGHT"
-Copyright \(co 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2008\-2011 Internet Systems Consortium, Inc. ("ISC")
.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c
index 8e9a53b..323f918 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2007-2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,12 +14,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-keyfromlabel.c,v 1.4.50.2 2010-01-15 23:47:31 tbox Exp $ */
+/* $Id: dnssec-keyfromlabel.c,v 1.32 2010-12-23 04:07:59 marka Exp $ */
/*! \file */
#include <config.h>
+#include <ctype.h>
#include <stdlib.h>
#include <isc/buffer.h>
@@ -27,9 +28,11 @@
#include <isc/entropy.h>
#include <isc/mem.h>
#include <isc/region.h>
+#include <isc/print.h>
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/dnssec.h>
#include <dns/fixedname.h>
#include <dns/keyvalues.h>
#include <dns/log.h>
@@ -47,35 +50,60 @@
const char *program = "dnssec-keyfromlabel";
int verbose;
+#define DEFAULT_ALGORITHM "RSASHA1"
+#define DEFAULT_NSEC3_ALGORITHM "NSEC3RSASHA1"
+
static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 |"
" NSEC3DSA | NSEC3RSASHA1 |"
- " RSASHA256 | RSASHA512";
+ " RSASHA256 | RSASHA512 | ECCGOST";
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
static void
usage(void) {
fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s -a alg -l label [options] name\n\n",
+ fprintf(stderr, " %s -l label [options] name\n\n",
program);
fprintf(stderr, "Version: %s\n", VERSION);
fprintf(stderr, "Required options:\n");
- fprintf(stderr, " -a algorithm: %s\n", algs);
- fprintf(stderr, " -l label: label of the key\n");
+ fprintf(stderr, " -l label: label of the key pair\n");
fprintf(stderr, " name: owner of the key\n");
fprintf(stderr, "Other options:\n");
+ fprintf(stderr, " -a algorithm: %s\n", algs);
+ fprintf(stderr, " (default: RSASHA1, or "
+ "NSEC3RSASHA1 if using -3)\n");
+ fprintf(stderr, " -3: use NSEC3-capable algorithm\n");
+ fprintf(stderr, " -c class (default: IN)\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E enginename (default: pkcs11)\n");
+#else
+ fprintf(stderr, " -E enginename\n");
+#endif
+ fprintf(stderr, " -f keyflag: KSK | REVOKE\n");
+ fprintf(stderr, " -K directory: directory in which to place "
+ "key files\n");
+ fprintf(stderr, " -k: generate a TYPE=KEY key\n");
fprintf(stderr, " -n nametype: ZONE | HOST | ENTITY | USER | OTHER\n");
fprintf(stderr, " (DNSKEY generation defaults to ZONE\n");
- fprintf(stderr, " -c <class> (default: IN)\n");
- fprintf(stderr, " -f keyflag: KSK\n");
- fprintf(stderr, " -t <type>: "
+ fprintf(stderr, " -p protocol: default: 3 [dnssec]\n");
+ fprintf(stderr, " -t type: "
"AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF "
"(default: AUTHCONF)\n");
- fprintf(stderr, " -p <protocol>: "
- "default: 3 [dnssec]\n");
- fprintf(stderr, " -v <verbose level>\n");
- fprintf(stderr, " -k : generate a TYPE=KEY key\n");
+ fprintf(stderr, " -y: permit keys that might collide\n");
+ fprintf(stderr, " -v verbose level\n");
+ fprintf(stderr, "Date options:\n");
+ fprintf(stderr, " -P date/[+-]offset: set key publication date\n");
+ fprintf(stderr, " -A date/[+-]offset: set key activation date\n");
+ fprintf(stderr, " -R date/[+-]offset: set key revocation date\n");
+ fprintf(stderr, " -I date/[+-]offset: set key inactivation date\n");
+ fprintf(stderr, " -D date/[+-]offset: set key deletion date\n");
+ fprintf(stderr, " -G: generate key only; do not set -P or -A\n");
+ fprintf(stderr, " -C: generate a backward-compatible key, omitting"
+ " all dates\n");
fprintf(stderr, "Output:\n");
fprintf(stderr, " K<name>+<alg>+<id>.key, "
- "K<name>+<alg>+<id>.private\n");
+ "K<name>+<alg>+<id>.private\n");
exit (-1);
}
@@ -83,14 +111,20 @@ usage(void) {
int
main(int argc, char **argv) {
char *algname = NULL, *nametype = NULL, *type = NULL;
+ const char *directory = NULL;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
char *classname = NULL;
char *endp;
- dst_key_t *key = NULL, *oldkey;
+ dst_key_t *key = NULL;
dns_fixedname_t fname;
dns_name_t *name;
- isc_uint16_t flags = 0, ksk = 0;
+ isc_uint16_t flags = 0, kskflag = 0, revflag = 0;
dns_secalg_t alg;
- isc_boolean_t null_key = ISC_FALSE;
+ isc_boolean_t oldstyle = ISC_FALSE;
isc_mem_t *mctx = NULL;
int ch;
int protocol = -1, signatory = 0;
@@ -103,6 +137,20 @@ main(int argc, char **argv) {
dns_rdataclass_t rdclass;
int options = DST_TYPE_PRIVATE | DST_TYPE_PUBLIC;
char *label = NULL;
+ isc_stdtime_t publish = 0, activate = 0, revoke = 0;
+ isc_stdtime_t inactive = 0, delete = 0;
+ isc_stdtime_t now;
+ isc_boolean_t setpub = ISC_FALSE, setact = ISC_FALSE;
+ isc_boolean_t setrev = ISC_FALSE, setinact = ISC_FALSE;
+ isc_boolean_t setdel = ISC_FALSE;
+ isc_boolean_t unsetpub = ISC_FALSE, unsetact = ISC_FALSE;
+ isc_boolean_t unsetrev = ISC_FALSE, unsetinact = ISC_FALSE;
+ isc_boolean_t unsetdel = ISC_FALSE;
+ isc_boolean_t genonly = ISC_FALSE;
+ isc_boolean_t use_nsec3 = ISC_FALSE;
+ isc_boolean_t avoid_collisions = ISC_TRUE;
+ isc_boolean_t exact;
+ unsigned char c;
if (argc == 1)
usage();
@@ -113,28 +161,49 @@ main(int argc, char **argv) {
isc_commandline_errprint = ISC_FALSE;
+ isc_stdtime_get(&now);
+
while ((ch = isc_commandline_parse(argc, argv,
- "a:c:f:kl:n:p:t:v:h")) != -1)
+ "3a:Cc:E:f:K:kl:n:p:t:v:yFhGP:A:R:I:D:")) != -1)
{
switch (ch) {
+ case '3':
+ use_nsec3 = ISC_TRUE;
+ break;
case 'a':
algname = isc_commandline_argument;
break;
+ case 'C':
+ oldstyle = ISC_TRUE;
+ break;
case 'c':
classname = isc_commandline_argument;
break;
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
case 'f':
- if (strcasecmp(isc_commandline_argument, "KSK") == 0)
- ksk = DNS_KEYFLAG_KSK;
+ c = (unsigned char)(isc_commandline_argument[0]);
+ if (toupper(c) == 'K')
+ kskflag = DNS_KEYFLAG_KSK;
+ else if (toupper(c) == 'R')
+ revflag = DNS_KEYFLAG_REVOKE;
else
fatal("unknown flag '%s'",
isc_commandline_argument);
break;
+ case 'K':
+ directory = isc_commandline_argument;
+ ret = try_dir(directory);
+ if (ret != ISC_R_SUCCESS)
+ fatal("cannot open directory %s: %s",
+ directory, isc_result_totext(ret));
+ break;
case 'k':
options |= DST_TYPE_KEY;
break;
case 'l':
- label = isc_commandline_argument;
+ label = isc_mem_strdup(mctx, isc_commandline_argument);
break;
case 'n':
nametype = isc_commandline_argument;
@@ -153,11 +222,80 @@ main(int argc, char **argv) {
if (*endp != '\0')
fatal("-v must be followed by a number");
break;
-
+ case 'y':
+ avoid_collisions = ISC_FALSE;
+ break;
+ case 'G':
+ genonly = ISC_TRUE;
+ break;
+ case 'P':
+ if (setpub || unsetpub)
+ fatal("-P specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setpub = ISC_TRUE;
+ publish = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetpub = ISC_TRUE;
+ }
+ break;
+ case 'A':
+ if (setact || unsetact)
+ fatal("-A specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setact = ISC_TRUE;
+ activate = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetact = ISC_TRUE;
+ }
+ break;
+ case 'R':
+ if (setrev || unsetrev)
+ fatal("-R specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setrev = ISC_TRUE;
+ revoke = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetrev = ISC_TRUE;
+ }
+ break;
+ case 'I':
+ if (setinact || unsetinact)
+ fatal("-I specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setinact = ISC_TRUE;
+ inactive = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetinact = ISC_TRUE;
+ }
+ break;
+ case 'D':
+ if (setdel || unsetdel)
+ fatal("-D specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setdel = ISC_TRUE;
+ delete = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetdel = ISC_TRUE;
+ }
+ break;
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
program, isc_commandline_option);
+ /* FALLTHROUGH */
case 'h':
usage();
@@ -170,10 +308,11 @@ main(int argc, char **argv) {
if (ectx == NULL)
setup_entropy(mctx, NULL, &ectx);
- ret = dst_lib_init(mctx, ectx,
- ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ ret = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
if (ret != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(ret));
setup_logging(verbose, mctx, &log);
@@ -184,8 +323,30 @@ main(int argc, char **argv) {
if (argc > isc_commandline_index + 1)
fatal("extraneous arguments");
- if (algname == NULL)
- fatal("no algorithm was specified");
+ if (strchr(label, ':') == NULL &&
+ engine != NULL && strlen(engine) != 0U) {
+ char *l;
+ int len;
+
+ len = strlen(label) + strlen(engine) + 2;
+ l = isc_mem_allocate(mctx, len);
+ if (l == NULL)
+ fatal("cannot allocate memory");
+ snprintf(l, len, "%s:%s", engine, label);
+ isc_mem_free(mctx, label);
+ label = l;
+ }
+
+ if (algname == NULL) {
+ if (use_nsec3)
+ algname = strdup(DEFAULT_NSEC3_ALGORITHM);
+ else
+ algname = strdup(DEFAULT_ALGORITHM);
+ if (verbose > 0)
+ fprintf(stderr, "no algorithm specified; "
+ "defaulting to %s\n", algname);
+ }
+
if (strcasecmp(algname, "RSA") == 0) {
fprintf(stderr, "The use of RSA (RSAMD5) is not recommended.\n"
"If you still wish to use RSA (RSAMD5) please "
@@ -201,6 +362,14 @@ main(int argc, char **argv) {
options |= DST_TYPE_KEY;
}
+ if (use_nsec3 &&
+ alg != DST_ALG_NSEC3DSA && alg != DST_ALG_NSEC3RSASHA1 &&
+ alg != DST_ALG_RSASHA256 && alg != DST_ALG_RSASHA512 &&
+ alg != DST_ALG_ECCGOST) {
+ fatal("%s is incompatible with NSEC3; "
+ "do not use the -3 option", algname);
+ }
+
if (type != NULL && (options & DST_TYPE_KEY) != 0) {
if (strcasecmp(type, "NOAUTH") == 0)
flags |= DNS_KEYTYPE_NOAUTH;
@@ -234,10 +403,15 @@ main(int argc, char **argv) {
rdclass = strtoclass(classname);
+ if (directory == NULL)
+ directory = ".";
+
if ((options & DST_TYPE_KEY) != 0) /* KEY */
flags |= signatory;
- else if ((flags & DNS_KEYOWNER_ZONE) != 0) /* DNSKEY */
- flags |= ksk;
+ else if ((flags & DNS_KEYOWNER_ZONE) != 0) { /* DNSKEY */
+ flags |= kskflag;
+ flags |= revflag;
+ }
if (protocol == -1)
protocol = DNS_KEYPROTO_DNSSEC;
@@ -260,53 +434,108 @@ main(int argc, char **argv) {
isc_buffer_init(&buf, argv[isc_commandline_index],
strlen(argv[isc_commandline_index]));
isc_buffer_add(&buf, strlen(argv[isc_commandline_index]));
- ret = dns_name_fromtext(name, &buf, dns_rootname, ISC_FALSE, NULL);
+ ret = dns_name_fromtext(name, &buf, dns_rootname, 0, NULL);
if (ret != ISC_R_SUCCESS)
fatal("invalid key name %s: %s", argv[isc_commandline_index],
isc_result_totext(ret));
- if ((flags & DNS_KEYFLAG_TYPEMASK) == DNS_KEYTYPE_NOKEY)
- null_key = ISC_TRUE;
-
isc_buffer_init(&buf, filename, sizeof(filename) - 1);
/* associate the key */
ret = dst_key_fromlabel(name, alg, flags, protocol,
- rdclass, "", label, NULL, mctx, &key);
+ rdclass, engine, label, NULL, mctx, &key);
isc_entropy_stopcallbacksources(ectx);
if (ret != ISC_R_SUCCESS) {
char namestr[DNS_NAME_FORMATSIZE];
- char algstr[ALG_FORMATSIZE];
+ char algstr[DNS_SECALG_FORMATSIZE];
dns_name_format(name, namestr, sizeof(namestr));
- alg_format(alg, algstr, sizeof(algstr));
- fatal("failed to generate key %s/%s: %s\n",
+ dns_secalg_format(alg, algstr, sizeof(algstr));
+ fatal("failed to get key %s/%s: %s\n",
namestr, algstr, isc_result_totext(ret));
+ /* NOTREACHED */
exit(-1);
}
/*
- * Try to read a key with the same name, alg and id from disk.
- * If there is one we must continue generating a new one
- * unless we were asked to generate a null key, in which
- * case we return failure.
+ * Set key timing metadata (unless using -C)
+ *
+ * Publish and activation dates are set to "now" by default, but
+ * can be overridden. Creation date is always set to "now".
*/
- ret = dst_key_fromfile(name, dst_key_id(key), alg,
- DST_TYPE_PRIVATE, NULL, mctx, &oldkey);
- /* do not overwrite an existing key */
- if (ret == ISC_R_SUCCESS) {
+ if (!oldstyle) {
+ dst_key_settime(key, DST_TIME_CREATED, now);
+
+ if (genonly && (setpub || setact))
+ fatal("cannot use -G together with -P or -A options");
+
+ if (setpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, publish);
+ else if (setact)
+ dst_key_settime(key, DST_TIME_PUBLISH, activate);
+ else if (!genonly && !unsetpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, now);
+
+ if (setact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, activate);
+ else if (!genonly && !unsetact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, now);
+
+ if (setrev) {
+ if (kskflag == 0)
+ fprintf(stderr, "%s: warning: Key is "
+ "not flagged as a KSK, but -R "
+ "was used. Revoking a ZSK is "
+ "legal, but undefined.\n",
+ program);
+ dst_key_settime(key, DST_TIME_REVOKE, revoke);
+ }
+
+ if (setinact)
+ dst_key_settime(key, DST_TIME_INACTIVE, inactive);
+
+ if (setdel)
+ dst_key_settime(key, DST_TIME_DELETE, delete);
+ } else {
+ if (setpub || setact || setrev || setinact ||
+ setdel || unsetpub || unsetact ||
+ unsetrev || unsetinact || unsetdel || genonly)
+ fatal("cannot use -C together with "
+ "-P, -A, -R, -I, -D, or -G options");
+ /*
+ * Compatibility mode: Private-key-format
+ * should be set to 1.2.
+ */
+ dst_key_setprivateformat(key, 1, 2);
+ }
+
+ /*
+ * Do not overwrite an existing key. Warn LOUDLY if there
+ * is a risk of ID collision due to this key or another key
+ * being revoked.
+ */
+ if (key_collision(dst_key_id(key), name, directory, alg, mctx, &exact))
+ {
isc_buffer_clear(&buf);
- ret = dst_key_buildfilename(key, 0, NULL, &buf);
- fprintf(stderr, "%s: %s already exists\n",
- program, filename);
- dst_key_free(&key);
- exit (1);
+ ret = dst_key_buildfilename(key, 0, directory, &buf);
+ if (exact)
+ fatal("%s: %s already exists\n", program, filename);
+
+ if (avoid_collisions)
+ fatal("%s: %s could collide with another key upon "
+ "revokation\n", program, filename);
+
+ fprintf(stderr, "%s: WARNING: Key %s could collide with "
+ "another key upon revokation. If you plan "
+ "to revoke keys, destroy this key and "
+ "generate a different one.\n",
+ program, filename);
}
- ret = dst_key_tofile(key, options, NULL);
+ ret = dst_key_tofile(key, options, directory);
if (ret != ISC_R_SUCCESS) {
- char keystr[KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ char keystr[DST_KEY_FORMATSIZE];
+ dst_key_format(key, keystr, sizeof(keystr));
fatal("failed to write key %s: %s\n", keystr,
isc_result_totext(ret));
}
@@ -322,6 +551,7 @@ main(int argc, char **argv) {
dns_name_destroy();
if (verbose > 10)
isc_mem_stats(mctx, stdout);
+ isc_mem_free(mctx, label);
isc_mem_destroy(&mctx);
return (0);
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook
index a2fff5a..be38a24 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keyfromlabel.docbook,v 1.6.14.2 2010-01-15 23:47:31 tbox Exp $ -->
+<!-- $Id: dnssec-keyfromlabel.docbook,v 1.18.14.1.2.1 2011-06-02 23:47:27 tbox Exp $ -->
<refentry id="man.dnssec-keyfromlabel">
<refentryinfo>
<date>February 8, 2008</date>
@@ -37,7 +37,9 @@
<docinfo>
<copyright>
<year>2008</year>
+ <year>2009</year>
<year>2010</year>
+ <year>2011</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
@@ -45,15 +47,25 @@
<refsynopsisdiv>
<cmdsynopsis>
<command>dnssec-keyfromlabel</command>
- <arg choice="req">-a <replaceable class="parameter">algorithm</replaceable></arg>
<arg choice="req">-l <replaceable class="parameter">label</replaceable></arg>
+ <arg><option>-3</option></arg>
+ <arg><option>-a <replaceable class="parameter">algorithm</replaceable></option></arg>
+ <arg><option>-A <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
+ <arg><option>-D <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
<arg><option>-f <replaceable class="parameter">flag</replaceable></option></arg>
+ <arg><option>-G</option></arg>
+ <arg><option>-I <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-k</option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-n <replaceable class="parameter">nametype</replaceable></option></arg>
+ <arg><option>-P <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-p <replaceable class="parameter">protocol</replaceable></option></arg>
+ <arg><option>-R <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">type</replaceable></option></arg>
<arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-y</option></arg>
<arg choice="req">name</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -65,6 +77,11 @@
key files for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034.
</para>
+ <para>
+ The <option>name</option> of the key is specified on the command
+ line. This must match the name of the zone for which the key is
+ being generated.
+ </para>
</refsect1>
<refsect1>
@@ -76,9 +93,8 @@
<listitem>
<para>
Selects the cryptographic algorithm. The value of
- <option>algorithm</option> must be one of RSAMD5,
- RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256,
- RSASHA512 or DH (Diffie Hellman).
+ <option>algorithm</option> must be one of RSAMD5, RSASHA1,
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
These values are case insensitive.
</para>
<para>
@@ -99,11 +115,34 @@
</varlistentry>
<varlistentry>
+ <term>-3</term>
+ <listitem>
+ <para>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the name of the crypto hardware (OpenSSL engine).
+ When compiled with PKCS#11 support it defaults to "pkcs11".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-l <replaceable class="parameter">label</replaceable></term>
<listitem>
<para>
- Specifies the label of keys in the crypto hardware
- (PKCS#11 device).
+ Specifies the label of the key pair in the crypto hardware.
+ The label may be preceded by an optional OpenSSL engine name,
+ separated by a colon, as in "pkcs11:keylabel".
</para>
</listitem>
</varlistentry>
@@ -117,8 +156,22 @@
zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with
a host (KEY)),
USER (for a key associated with a user(KEY)) or OTHER (DNSKEY).
- These values are
- case insensitive.
+ These values are case insensitive.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-C</term>
+ <listitem>
+ <para>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <command>dnssec-keyfromlabel</command>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <option>-C</option> option suppresses them.
</para>
</listitem>
</varlistentry>
@@ -138,7 +191,17 @@
<listitem>
<para>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-G</term>
+ <listitem>
+ <para>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</para>
</listitem>
</varlistentry>
@@ -148,7 +211,16 @@
<listitem>
<para>
Prints a short summary of the options and arguments to
- <command>dnssec-keygen</command>.
+ <command>dnssec-keyfromlabel</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to be written.
</para>
</listitem>
</varlistentry>
@@ -166,7 +238,7 @@
<term>-p <replaceable class="parameter">protocol</replaceable></term>
<listitem>
<para>
- Sets the protocol value for the generated key. The protocol
+ Sets the protocol value for the key. The protocol
is a number between 0 and 255. The default is 3 (DNSSEC).
Other possible values for this argument are listed in
RFC 2535 and its successors.
@@ -195,6 +267,93 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>-y</term>
+ <listitem>
+ <para>
+ Allows DNSSEC key files to be generated even if the key ID
+ would collide with that of an existing key, in the event of
+ either key being revoked. (This is only safe to use if you
+ are sure you won't be using RFC 5011 trust anchor maintenance
+ with either of the keys involved.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>TIMING OPTIONS</title>
+
+ <para>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-P <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-I <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-D <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
@@ -214,8 +373,7 @@
</listitem>
<listitem>
<para><filename>aaa</filename> is the numeric representation
- of the
- algorithm.
+ of the algorithm.
</para>
</listitem>
<listitem>
@@ -229,8 +387,7 @@
on the printed string. <filename>Knnnn.+aaa+iiiii.key</filename>
contains the public key, and
<filename>Knnnn.+aaa+iiiii.private</filename> contains the
- private
- key.
+ private key.
</para>
<para>
The <filename>.key</filename> file contains a DNS KEY record
@@ -239,8 +396,8 @@
statement).
</para>
<para>
- The <filename>.private</filename> file contains algorithm
- specific
+ The <filename>.private</filename> file contains
+ algorithm-specific
fields. For obvious security reasons, this file does not have
general read permission.
</para>
diff --git a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html
index ad2a562..2b1b236 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html
+++ b/contrib/bind9/bin/dnssec/dnssec-keyfromlabel.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keyfromlabel.html,v 1.5.44.3 2010-01-16 01:55:32 tbox Exp $ -->
+<!-- $Id: dnssec-keyfromlabel.html,v 1.17.14.1.2.1 2011-06-09 03:41:05 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -28,26 +28,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-k</code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-3</code>] [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-k</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-y</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543416"></a><h2>DESCRIPTION</h2>
+<a name="id2543494"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keyfromlabel</strong></span>
gets keys with the given label from a crypto hardware and builds
key files for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034.
</p>
+<p>
+ The <code class="option">name</code> of the key is specified on the command
+ line. This must match the name of the zone for which the key is
+ being generated.
+ </p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543428"></a><h2>OPTIONS</h2>
+<a name="id2543512"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. The value of
- <code class="option">algorithm</code> must be one of RSAMD5,
- RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256,
- RSASHA512 or DH (Diffie Hellman).
+ <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
These values are case insensitive.
</p>
<p>
@@ -65,10 +69,23 @@
Note 2: DH automatically sets the -k flag.
</p>
</dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Specifies the name of the crypto hardware (OpenSSL engine).
+ When compiled with PKCS#11 support it defaults to "pkcs11".
+ </p></dd>
<dt><span class="term">-l <em class="replaceable"><code>label</code></em></span></dt>
<dd><p>
- Specifies the label of keys in the crypto hardware
- (PKCS#11 device).
+ Specifies the label of the key pair in the crypto hardware.
+ The label may be preceded by an optional OpenSSL engine name,
+ separated by a colon, as in "pkcs11:keylabel".
</p></dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
@@ -77,8 +94,17 @@
zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with
a host (KEY)),
USER (for a key associated with a user(KEY)) or OTHER (DNSKEY).
- These values are
- case insensitive.
+ These values are case insensitive.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keyfromlabel</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
@@ -88,12 +114,21 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-h</span></dt>
<dd><p>
Prints a short summary of the options and arguments to
- <span><strong class="command">dnssec-keygen</strong></span>.
+ <span><strong class="command">dnssec-keyfromlabel</strong></span>.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
</p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
@@ -101,7 +136,7 @@
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
- Sets the protocol value for the generated key. The protocol
+ Sets the protocol value for the key. The protocol
is a number between 0 and 255. The default is 3 (DNSSEC).
Other possible values for this argument are listed in
RFC 2535 and its successors.
@@ -117,10 +152,65 @@
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-y</span></dt>
+<dd><p>
+ Allows DNSSEC key files to be generated even if the key ID
+ would collide with that of an existing key, in the event of
+ either key being revoked. (This is only safe to use if you
+ are sure you won't be using RFC 5011 trust anchor maintenance
+ with either of the keys involved.)
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543876"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543632"></a><h2>GENERATED KEY FILES</h2>
+<a name="id2544042"></a><h2>GENERATED KEY FILES</h2>
<p>
When <span><strong class="command">dnssec-keyfromlabel</strong></span> completes
successfully,
@@ -132,8 +222,7 @@
<li><p><code class="filename">nnnn</code> is the key name.
</p></li>
<li><p><code class="filename">aaa</code> is the numeric representation
- of the
- algorithm.
+ of the algorithm.
</p></li>
<li><p><code class="filename">iiiii</code> is the key identifier (or
footprint).
@@ -144,8 +233,7 @@
on the printed string. <code class="filename">Knnnn.+aaa+iiiii.key</code>
contains the public key, and
<code class="filename">Knnnn.+aaa+iiiii.private</code> contains the
- private
- key.
+ private key.
</p>
<p>
The <code class="filename">.key</code> file contains a DNS KEY record
@@ -154,14 +242,14 @@
statement).
</p>
<p>
- The <code class="filename">.private</code> file contains algorithm
- specific
+ The <code class="filename">.private</code> file contains
+ algorithm-specific
fields. For obvious security reasons, this file does not have
general read permission.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543704"></a><h2>SEE ALSO</h2>
+<a name="id2544115"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
@@ -169,7 +257,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543737"></a><h2>AUTHOR</h2>
+<a name="id2544148"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.8 b/contrib/bind9/bin/dnssec/dnssec-keygen.8
index c4be24e..ea4690e 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.8
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-keygen.8,v 1.40.44.4 2010-01-16 01:55:32 tbox Exp $
+.\" $Id: dnssec-keygen.8,v 1.55 2010-12-24 01:14:19 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,11 +33,11 @@
dnssec\-keygen \- DNSSEC key generation tool
.SH "SYNOPSIS"
.HP 14
-\fBdnssec\-keygen\fR {\-a\ \fIalgorithm\fR} {\-b\ \fIkeysize\fR} {\-n\ \fInametype\fR} [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-e\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-g\ \fR\fB\fIgenerator\fR\fR] [\fB\-h\fR] [\fB\-k\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstrength\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] {name}
+\fBdnssec\-keygen\fR [\fB\-a\ \fR\fB\fIalgorithm\fR\fR] [\fB\-b\ \fR\fB\fIkeysize\fR\fR] [\fB\-n\ \fR\fB\fInametype\fR\fR] [\fB\-3\fR] [\fB\-A\ \fR\fB\fIdate/offset\fR\fR] [\fB\-C\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-D\ \fR\fB\fIdate/offset\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-e\fR] [\fB\-f\ \fR\fB\fIflag\fR\fR] [\fB\-G\fR] [\fB\-g\ \fR\fB\fIgenerator\fR\fR] [\fB\-h\fR] [\fB\-I\ \fR\fB\fIdate/offset\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-k\fR] [\fB\-P\ \fR\fB\fIdate/offset\fR\fR] [\fB\-p\ \fR\fB\fIprotocol\fR\fR] [\fB\-q\fR] [\fB\-R\ \fR\fB\fIdate/offset\fR\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-S\ \fR\fB\fIkey\fR\fR] [\fB\-s\ \fR\fB\fIstrength\fR\fR] [\fB\-t\ \fR\fB\fItype\fR\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] {name}
.SH "DESCRIPTION"
.PP
\fBdnssec\-keygen\fR
-generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures), as defined in RFC 2845.
+generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY (Transaction Key) as defined in RFC 2930.
.PP
The
\fBname\fR
@@ -48,16 +48,28 @@ of the key is specified on the command line. For DNSSEC keys, this must match th
.RS 4
Selects the cryptographic algorithm. For DNSSEC keys, the value of
\fBalgorithm\fR
-must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC\-MD5, HMAC\-SHA1, HMAC\-SHA224, HMAC\-SHA256, HMAC\-SHA384, or HMAC\-SHA512. These values are case insensitive.
+must be one of RSAMD5, RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST. For TSIG/TKEY, the value must be DH (Diffie Hellman), HMAC\-MD5, HMAC\-SHA1, HMAC\-SHA224, HMAC\-SHA256, HMAC\-SHA384, or HMAC\-SHA512. These values are case insensitive.
+.sp
+If no algorithm is specified, then RSASHA1 will be used by default, unless the
+\fB\-3\fR
+option is specified, in which case NSEC3RSASHA1 will be used instead. (If
+\fB\-3\fR
+is used and an algorithm is specified, that algorithm will be checked for compatibility with NSEC3.)
.sp
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement algorithm, and DSA is recommended. For TSIG, HMAC\-MD5 is mandatory.
.sp
-Note 2: HMAC\-MD5 and DH automatically set the \-k flag.
+Note 2: DH, HMAC\-MD5, and HMAC\-SHA1 through HMAC\-SHA512 automatically set the \-T KEY option.
.RE
.PP
\-b \fIkeysize\fR
.RS 4
Specifies the number of bits in the key. The choice of key size depends on the algorithm used. RSA keys must be between 512 and 2048 bits. Diffie Hellman keys must be between 128 and 4096 bits. DSA keys must be between 512 and 1024 bits and an exact multiple of 64. HMAC keys must be between 1 and 512 bits.
+.sp
+The key size does not need to be specified if using a default algorithm. The default key size is 1024 bits for zone signing keys (ZSK's) and 2048 bits for key signing keys (KSK's, generated with
+\fB\-f KSK\fR). However, if an algorithm is explicitly specified with the
+\fB\-a\fR, then there is no default key size, and the
+\fB\-b\fR
+must be used.
.RE
.PP
\-n \fInametype\fR
@@ -67,11 +79,30 @@ Specifies the owner type of the key. The value of
must either be ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)) or OTHER (DNSKEY). These values are case insensitive. Defaults to ZONE for DNSKEY generation.
.RE
.PP
+\-3
+.RS 4
+Use an NSEC3\-capable algorithm to generate a DNSSEC key. If this option is used and no algorithm is explicitly set on the command line, NSEC3RSASHA1 will be used by default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms are NSEC3\-capable.
+.RE
+.PP
+\-C
+.RS 4
+Compatibility mode: generates an old\-style key, without any metadata. By default,
+\fBdnssec\-keygen\fR
+will include the key's creation date in the metadata stored with the private key, and other dates may be set there as well (publication date, activation date, etc). Keys that include this data may be incompatible with older versions of BIND; the
+\fB\-C\fR
+option suppresses them.
+.RE
+.PP
\-c \fIclass\fR
.RS 4
Indicates that the DNS record containing the key should have the specified class. If not specified, class IN is used.
.RE
.PP
+\-E \fIengine\fR
+.RS 4
+Uses a crypto hardware (OpenSSL engine) for random number and, when supported, key generation. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
+.RE
+.PP
\-e
.RS 4
If generating an RSAMD5/RSASHA1 key, use a large exponent.
@@ -79,7 +110,12 @@ If generating an RSAMD5/RSASHA1 key, use a large exponent.
.PP
\-f \fIflag\fR
.RS 4
-Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flag is KSK (Key Signing Key) DNSKEY.
+Set the specified flag in the flag field of the KEY/DNSKEY record. The only recognized flags are KSK (Key Signing Key) and REVOKE.
+.RE
+.PP
+\-G
+.RS 4
+Generate a key, but do not publish it or sign with it. This option is incompatible with \-P and \-A.
.RE
.PP
\-g \fIgenerator\fR
@@ -93,9 +129,14 @@ Prints a short summary of the options and arguments to
\fBdnssec\-keygen\fR.
.RE
.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to be written.
+.RE
+.PP
\-k
.RS 4
-Generate KEY records rather than DNSKEY records.
+Deprecated in favor of \-T KEY.
.RE
.PP
\-p \fIprotocol\fR
@@ -103,6 +144,15 @@ Generate KEY records rather than DNSKEY records.
Sets the protocol value for the generated key. The protocol is a number between 0 and 255. The default is 3 (DNSSEC). Other possible values for this argument are listed in RFC 2535 and its successors.
.RE
.PP
+\-q
+.RS 4
+Quiet mode: Suppresses unnecessary output, including progress indication. Without this option, when
+\fBdnssec\-keygen\fR
+is run interactively to generate an RSA or DSA key pair, it will print a string of symbols to
+\fIstderr\fR
+indicating the progress of the key generation. A '.' indicates that a random number has been found which passed an initial sieve test; '+' means a number has passed a single round of the Miller\-Rabin primality test; a space means that the number has passed all the tests and is a satisfactory key.
+.RE
+.PP
\-r \fIrandomdev\fR
.RS 4
Specifies the source of randomness. If the operating system does not provide a
@@ -114,11 +164,24 @@ specifies the name of a character device or file containing random data to be us
indicates that keyboard input should be used.
.RE
.PP
+\-S \fIkey\fR
+.RS 4
+Create a new key which is an explicit successor to an existing key. The name, algorithm, size, and type of the key will be set to match the existing key. The activation date of the new key will be set to the inactivation date of the existing one. The publication date will be set to the activation date minus the prepublication interval, which defaults to 30 days.
+.RE
+.PP
\-s \fIstrength\fR
.RS 4
Specifies the strength value of the key. The strength is a number between 0 and 15, and currently has no defined purpose in DNSSEC.
.RE
.PP
+\-T \fIrrtype\fR
+.RS 4
+Specifies the resource record type to use for the key.
+\fBrrtype\fR
+must be either DNSKEY or KEY. The default is DNSKEY when using a DNSSEC algorithm, but it can be overridden to KEY for use with SIG(0).
+Using any TSIG algorithm (HMAC\-* or DH) forces this option to KEY.
+.RE
+.PP
\-t \fItype\fR
.RS 4
Indicates the use of the key.
@@ -130,6 +193,43 @@ must be one of AUTHCONF, NOAUTHCONF, NOAUTH, or NOCONF. The default is AUTHCONF.
.RS 4
Sets the debugging level.
.RE
+.SH "TIMING OPTIONS"
+.PP
+Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '\-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24\-hour days, ignoring leap years), months (defined as 30 24\-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds.
+.PP
+\-P \fIdate/offset\fR
+.RS 4
+Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-A \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it. If not set, and if the \-G option has not been used, the default is "now".
+.RE
+.PP
+\-R \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.
+.RE
+.PP
+\-I \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.
+.RE
+.PP
+\-D \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)
+.RE
+.PP
+\-i \fIinterval\fR
+.RS 4
+Sets the prepublication interval for a key. If set, then the publication and activation dates must be separated by at least this much time. If the activation date is specified but the publication date isn't, then the publication date will default to this much time before the activation date; conversely, if the publication date is specified but activation date isn't, then activation will be set to this much time after publication.
+.sp
+If the key is being created as an explicit successor to another key, then the default prepublication interval is 30 days; otherwise it is zero.
+.sp
+As with date offsets, if the argument is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the interval is measured in years, months, weeks, days, hours, or minutes, respectively. Without a suffix, the interval is measured in seconds.
+.RE
.SH "GENERATED KEYS"
.PP
When
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.c b/contrib/bind9/bin/dnssec/dnssec-keygen.c
index 2184122..f369326 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.c
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,13 +29,15 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-keygen.c,v 1.81.48.2 2010-01-15 23:47:31 tbox Exp $ */
+/* $Id: dnssec-keygen.c,v 1.115 2010-12-23 04:07:59 marka Exp $ */
/*! \file */
#include <config.h>
+#include <ctype.h>
#include <stdlib.h>
+#include <unistd.h>
#include <isc/buffer.h>
#include <isc/commandline.h>
@@ -45,6 +47,7 @@
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/dnssec.h>
#include <dns/fixedname.h>
#include <dns/keyvalues.h>
#include <dns/log.h>
@@ -62,103 +65,224 @@
const char *program = "dnssec-keygen";
int verbose;
-static const char *algs = "RSA | RSAMD5 | DH | DSA | RSASHA1 | RSASHA256 |"
- " RSASHA512 | NSEC3DSA | NSEC3RSASHA1 | HMAC-MD5 |"
- " HMAC-SHA1 | HMAC-SHA224 | HMAC-SHA256 |"
- " HMAC-SHA384 | HMAC-SHA512";
+#define DEFAULT_ALGORITHM "RSASHA1"
+#define DEFAULT_NSEC3_ALGORITHM "NSEC3RSASHA1"
-static isc_boolean_t
-dsa_size_ok(int size) {
- return (ISC_TF(size >= 512 && size <= 1024 && size % 64 == 0));
-}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void progress(int p);
static void
usage(void) {
fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s -a alg -b bits [-n type] [options] name\n\n",
- program);
+ fprintf(stderr, " %s [options] name\n\n", program);
fprintf(stderr, "Version: %s\n", VERSION);
- fprintf(stderr, "Required options:\n");
- fprintf(stderr, " -a algorithm: %s\n", algs);
- fprintf(stderr, " -b key size, in bits:\n");
- fprintf(stderr, " RSAMD5:\t\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " RSASHA1:\t\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " NSEC3RSASHA1:\t\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " RSASHA256:\t[512..%d]\n", MAX_RSA);
- fprintf(stderr, " RSASHA512:\t[1024..%d]\n", MAX_RSA);
+ fprintf(stderr, " name: owner of the key\n");
+ fprintf(stderr, "Options:\n");
+ fprintf(stderr, " -K <directory>: write keys into directory\n");
+ fprintf(stderr, " -a <algorithm>:\n");
+ fprintf(stderr, " RSA | RSAMD5 | DSA | RSASHA1 | NSEC3RSASHA1"
+ " | NSEC3DSA |\n");
+ fprintf(stderr, " RSASHA256 | RSASHA512 | ECCGOST |\n");
+ fprintf(stderr, " DH | HMAC-MD5 | HMAC-SHA1 | HMAC-SHA224 | "
+ "HMAC-SHA256 | \n");
+ fprintf(stderr, " HMAC-SHA384 | HMAC-SHA512\n");
+ fprintf(stderr, " (default: RSASHA1, or "
+ "NSEC3RSASHA1 if using -3)\n");
+ fprintf(stderr, " -3: use NSEC3-capable algorithm\n");
+ fprintf(stderr, " -b <key size in bits>:\n");
+ fprintf(stderr, " RSAMD5:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " RSASHA1:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " NSEC3RSASHA1:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " RSASHA256:\t[512..%d]\n", MAX_RSA);
+ fprintf(stderr, " RSASHA512:\t[1024..%d]\n", MAX_RSA);
fprintf(stderr, " DH:\t\t[128..4096]\n");
fprintf(stderr, " DSA:\t\t[512..1024] and divisible by 64\n");
- fprintf(stderr, " NSEC3DSA:\t\t[512..1024] and divisible by 64\n");
+ fprintf(stderr, " NSEC3DSA:\t[512..1024] and divisible "
+ "by 64\n");
+ fprintf(stderr, " ECCGOST:\tignored\n");
fprintf(stderr, " HMAC-MD5:\t[1..512]\n");
fprintf(stderr, " HMAC-SHA1:\t[1..160]\n");
fprintf(stderr, " HMAC-SHA224:\t[1..224]\n");
fprintf(stderr, " HMAC-SHA256:\t[1..256]\n");
fprintf(stderr, " HMAC-SHA384:\t[1..384]\n");
fprintf(stderr, " HMAC-SHA512:\t[1..512]\n");
- fprintf(stderr, " -n nametype: ZONE | HOST | ENTITY | USER | OTHER\n");
- fprintf(stderr, " (DNSKEY generation defaults to ZONE\n");
- fprintf(stderr, " name: owner of the key\n");
- fprintf(stderr, "Other options:\n");
- fprintf(stderr, " -c <class> (default: IN)\n");
+ fprintf(stderr, " (if using the default algorithm, key size\n"
+ " defaults to 2048 for KSK, or 1024 for all "
+ "others)\n");
+ fprintf(stderr, " -n <nametype>: ZONE | HOST | ENTITY | "
+ "USER | OTHER\n");
+ fprintf(stderr, " (DNSKEY generation defaults to ZONE)\n");
+ fprintf(stderr, " -c <class>: (default: IN)\n");
fprintf(stderr, " -d <digest bits> (0 => max, default)\n");
- fprintf(stderr, " -e use large exponent (RSAMD5/RSASHA1 only)\n");
- fprintf(stderr, " -f keyflag: KSK\n");
- fprintf(stderr, " -g <generator> use specified generator "
- "(DH only)\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E <engine name> (default \"pkcs11\")\n");
+#else
+ fprintf(stderr, " -E <engine name>\n");
+#endif
+ fprintf(stderr, " -e: use large exponent (RSAMD5/RSASHA1 only)\n");
+ fprintf(stderr, " -f <keyflag>: KSK | REVOKE\n");
+ fprintf(stderr, " -g <generator>: use specified generator "
+ "(DH only)\n");
+ fprintf(stderr, " -p <protocol>: (default: 3 [dnssec])\n");
+ fprintf(stderr, " -s <strength>: strength value this key signs DNS "
+ "records with (default: 0)\n");
+ fprintf(stderr, " -T <rrtype>: DNSKEY | KEY (default: DNSKEY; "
+ "use KEY for SIG(0))\n");
+ fprintf(stderr, " ECCGOST:\tignored\n");
fprintf(stderr, " -t <type>: "
- "AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF "
- "(default: AUTHCONF)\n");
- fprintf(stderr, " -p <protocol>: "
- "default: 3 [dnssec]\n");
- fprintf(stderr, " -s <strength> strength value this key signs DNS "
- "records with (default: 0)\n");
+ "AUTHCONF | NOAUTHCONF | NOAUTH | NOCONF "
+ "(default: AUTHCONF)\n");
fprintf(stderr, " -r <randomdev>: a file containing random data\n");
- fprintf(stderr, " -v <verbose level>\n");
- fprintf(stderr, " -k : generate a TYPE=KEY key\n");
+
+ fprintf(stderr, " -h: print usage and exit\n");
+ fprintf(stderr, " -m <memory debugging mode>:\n");
+ fprintf(stderr, " usage | trace | record | size | mctx\n");
+ fprintf(stderr, " -v <level>: set verbosity level (0 - 10)\n");
+ fprintf(stderr, "Timing options:\n");
+ fprintf(stderr, " -P date/[+-]offset/none: set key publication date "
+ "(default: now)\n");
+ fprintf(stderr, " -A date/[+-]offset/none: set key activation date "
+ "(default: now)\n");
+ fprintf(stderr, " -R date/[+-]offset/none: set key "
+ "revocation date\n");
+ fprintf(stderr, " -I date/[+-]offset/none: set key "
+ "inactivation date\n");
+ fprintf(stderr, " -D date/[+-]offset/none: set key deletion date\n");
+ fprintf(stderr, " -G: generate key only; do not set -P or -A\n");
+ fprintf(stderr, " -C: generate a backward-compatible key, omitting "
+ "all dates\n");
+ fprintf(stderr, " -S <key>: generate a successor to an existing "
+ "key\n");
+ fprintf(stderr, " -i <interval>: prepublication interval for "
+ "successor key "
+ "(default: 30 days)\n");
fprintf(stderr, "Output:\n");
fprintf(stderr, " K<name>+<alg>+<id>.key, "
- "K<name>+<alg>+<id>.private\n");
+ "K<name>+<alg>+<id>.private\n");
exit (-1);
}
+static isc_boolean_t
+dsa_size_ok(int size) {
+ return (ISC_TF(size >= 512 && size <= 1024 && size % 64 == 0));
+}
+
+static void
+progress(int p)
+{
+ char c = '*';
+
+ switch (p) {
+ case 0:
+ c = '.';
+ break;
+ case 1:
+ c = '+';
+ break;
+ case 2:
+ c = '*';
+ break;
+ case 3:
+ c = ' ';
+ break;
+ default:
+ break;
+ }
+ (void) putc(c, stderr);
+ (void) fflush(stderr);
+}
+
int
main(int argc, char **argv) {
char *algname = NULL, *nametype = NULL, *type = NULL;
char *classname = NULL;
char *endp;
- dst_key_t *key = NULL, *oldkey;
+ dst_key_t *key = NULL;
dns_fixedname_t fname;
dns_name_t *name;
- isc_uint16_t flags = 0, ksk = 0;
+ isc_uint16_t flags = 0, kskflag = 0, revflag = 0;
dns_secalg_t alg;
isc_boolean_t conflict = ISC_FALSE, null_key = ISC_FALSE;
+ isc_boolean_t oldstyle = ISC_FALSE;
isc_mem_t *mctx = NULL;
int ch, rsa_exp = 0, generator = 0, param = 0;
int protocol = -1, size = -1, signatory = 0;
isc_result_t ret;
isc_textregion_t r;
char filename[255];
+ const char *directory = NULL;
+ const char *predecessor = NULL;
+ dst_key_t *prevkey = NULL;
isc_buffer_t buf;
isc_log_t *log = NULL;
isc_entropy_t *ectx = NULL;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
dns_rdataclass_t rdclass;
int options = DST_TYPE_PRIVATE | DST_TYPE_PUBLIC;
int dbits = 0;
+ isc_boolean_t use_default = ISC_FALSE, use_nsec3 = ISC_FALSE;
+ isc_stdtime_t publish = 0, activate = 0, revoke = 0;
+ isc_stdtime_t inactive = 0, delete = 0;
+ isc_stdtime_t now;
+ int prepub = -1;
+ isc_boolean_t setpub = ISC_FALSE, setact = ISC_FALSE;
+ isc_boolean_t setrev = ISC_FALSE, setinact = ISC_FALSE;
+ isc_boolean_t setdel = ISC_FALSE;
+ isc_boolean_t unsetpub = ISC_FALSE, unsetact = ISC_FALSE;
+ isc_boolean_t unsetrev = ISC_FALSE, unsetinact = ISC_FALSE;
+ isc_boolean_t unsetdel = ISC_FALSE;
+ isc_boolean_t genonly = ISC_FALSE;
+ isc_boolean_t quiet = ISC_FALSE;
+ isc_boolean_t show_progress = ISC_FALSE;
+ unsigned char c;
if (argc == 1)
usage();
- RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
-
dns_result_register();
isc_commandline_errprint = ISC_FALSE;
- while ((ch = isc_commandline_parse(argc, argv,
- "a:b:c:d:ef:g:kn:t:p:s:r:v:h")) != -1)
- {
+ /*
+ * Process memory debugging argument first.
+ */
+#define CMDLINE_FLAGS "3A:a:b:Cc:D:d:E:eFf:Gg:hI:i:K:km:n:P:p:qR:r:S:s:T:t:v:"
+ while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
+ switch (ch) {
+ case 'm':
+ if (strcasecmp(isc_commandline_argument, "record") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
+ if (strcasecmp(isc_commandline_argument, "trace") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGTRACE;
+ if (strcasecmp(isc_commandline_argument, "usage") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGUSAGE;
+ if (strcasecmp(isc_commandline_argument, "size") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGSIZE;
+ if (strcasecmp(isc_commandline_argument, "mctx") == 0)
+ isc_mem_debugging |= ISC_MEM_DEBUGCTX;
+ break;
+ default:
+ break;
+ }
+ }
+ isc_commandline_reset = ISC_TRUE;
+
+ RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
+
+ isc_stdtime_get(&now);
+
+ while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
switch (ch) {
+ case '3':
+ use_nsec3 = ISC_TRUE;
+ break;
case 'a':
algname = isc_commandline_argument;
break;
@@ -167,6 +291,9 @@ main(int argc, char **argv) {
if (*endp != '\0' || size < 0)
fatal("-b requires a non-negative number");
break;
+ case 'C':
+ oldstyle = ISC_TRUE;
+ break;
case 'c':
classname = isc_commandline_argument;
break;
@@ -175,12 +302,18 @@ main(int argc, char **argv) {
if (*endp != '\0' || dbits < 0)
fatal("-d requires a non-negative number");
break;
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
case 'e':
rsa_exp = 1;
break;
case 'f':
- if (strcasecmp(isc_commandline_argument, "KSK") == 0)
- ksk = DNS_KEYFLAG_KSK;
+ c = (unsigned char)(isc_commandline_argument[0]);
+ if (toupper(c) == 'K')
+ kskflag = DNS_KEYFLAG_KSK;
+ else if (toupper(c) == 'R')
+ revflag = DNS_KEYFLAG_REVOKE;
else
fatal("unknown flag '%s'",
isc_commandline_argument);
@@ -191,14 +324,22 @@ main(int argc, char **argv) {
if (*endp != '\0' || generator <= 0)
fatal("-g requires a positive number");
break;
+ case 'K':
+ directory = isc_commandline_argument;
+ ret = try_dir(directory);
+ if (ret != ISC_R_SUCCESS)
+ fatal("cannot open directory %s: %s",
+ directory, isc_result_totext(ret));
+ break;
case 'k':
- options |= DST_TYPE_KEY;
+ fatal("The -k option has been deprecated.\n"
+ "To generate a key-signing key, use -f KSK.\n"
+ "To generate a key with TYPE=KEY, use -T KEY.\n");
break;
case 'n':
nametype = isc_commandline_argument;
break;
- case 't':
- type = isc_commandline_argument;
+ case 'm':
break;
case 'p':
protocol = strtol(isc_commandline_argument, &endp, 10);
@@ -206,6 +347,12 @@ main(int argc, char **argv) {
fatal("-p must be followed by a number "
"[0..255]");
break;
+ case 'q':
+ quiet = ISC_TRUE;
+ break;
+ case 'r':
+ setup_entropy(mctx, isc_commandline_argument, &ectx);
+ break;
case 's':
signatory = strtol(isc_commandline_argument,
&endp, 10);
@@ -213,8 +360,19 @@ main(int argc, char **argv) {
fatal("-s must be followed by a number "
"[0..15]");
break;
- case 'r':
- setup_entropy(mctx, isc_commandline_argument, &ectx);
+ case 'T':
+ if (strcasecmp(isc_commandline_argument, "KEY") == 0)
+ options |= DST_TYPE_KEY;
+ else if (strcasecmp(isc_commandline_argument,
+ "DNSKEY") == 0)
+ /* default behavior */
+ ;
+ else
+ fatal("unknown type '%s'",
+ isc_commandline_argument);
+ break;
+ case 't':
+ type = isc_commandline_argument;
break;
case 'v':
endp = NULL;
@@ -222,11 +380,86 @@ main(int argc, char **argv) {
if (*endp != '\0')
fatal("-v must be followed by a number");
break;
-
+ case 'z':
+ /* already the default */
+ break;
+ case 'G':
+ genonly = ISC_TRUE;
+ break;
+ case 'P':
+ if (setpub || unsetpub)
+ fatal("-P specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setpub = ISC_TRUE;
+ publish = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetpub = ISC_TRUE;
+ }
+ break;
+ case 'A':
+ if (setact || unsetact)
+ fatal("-A specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setact = ISC_TRUE;
+ activate = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetact = ISC_TRUE;
+ }
+ break;
+ case 'R':
+ if (setrev || unsetrev)
+ fatal("-R specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setrev = ISC_TRUE;
+ revoke = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetrev = ISC_TRUE;
+ }
+ break;
+ case 'I':
+ if (setinact || unsetinact)
+ fatal("-I specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setinact = ISC_TRUE;
+ inactive = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetinact = ISC_TRUE;
+ }
+ break;
+ case 'D':
+ if (setdel || unsetdel)
+ fatal("-D specified more than once");
+
+ if (strcasecmp(isc_commandline_argument, "none")) {
+ setdel = ISC_TRUE;
+ delete = strtotime(isc_commandline_argument,
+ now, now);
+ } else {
+ unsetdel = ISC_TRUE;
+ }
+ break;
+ case 'S':
+ predecessor = isc_commandline_argument;
+ break;
+ case 'i':
+ prepub = strtottl(isc_commandline_argument);
+ break;
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
program, isc_commandline_option);
+ /* FALLTHROUGH */
case 'h':
usage();
@@ -237,73 +470,219 @@ main(int argc, char **argv) {
}
}
+ if (!isatty(0))
+ quiet = ISC_TRUE;
+
if (ectx == NULL)
setup_entropy(mctx, NULL, &ectx);
- ret = dst_lib_init(mctx, ectx,
- ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ ret = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
if (ret != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(ret));
setup_logging(verbose, mctx, &log);
- if (argc < isc_commandline_index + 1)
- fatal("the key name was not specified");
- if (argc > isc_commandline_index + 1)
- fatal("extraneous arguments");
-
- if (algname == NULL)
- fatal("no algorithm was specified");
- if (strcasecmp(algname, "RSA") == 0) {
- fprintf(stderr, "The use of RSA (RSAMD5) is not recommended.\n"
- "If you still wish to use RSA (RSAMD5) please "
- "specify \"-a RSAMD5\"\n");
- return (1);
- } else if (strcasecmp(algname, "HMAC-MD5") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACMD5;
- } else if (strcasecmp(algname, "HMAC-SHA1") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA1;
- } else if (strcasecmp(algname, "HMAC-SHA224") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA224;
- } else if (strcasecmp(algname, "HMAC-SHA256") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA256;
- } else if (strcasecmp(algname, "HMAC-SHA384") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA384;
- } else if (strcasecmp(algname, "HMAC-SHA512") == 0) {
- options |= DST_TYPE_KEY;
- alg = DST_ALG_HMACSHA512;
- } else {
- r.base = algname;
- r.length = strlen(algname);
- ret = dns_secalg_fromtext(&alg, &r);
+ if (predecessor == NULL) {
+ if (prepub == -1)
+ prepub = 0;
+
+ if (argc < isc_commandline_index + 1)
+ fatal("the key name was not specified");
+ if (argc > isc_commandline_index + 1)
+ fatal("extraneous arguments");
+
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ isc_buffer_init(&buf, argv[isc_commandline_index],
+ strlen(argv[isc_commandline_index]));
+ isc_buffer_add(&buf, strlen(argv[isc_commandline_index]));
+ ret = dns_name_fromtext(name, &buf, dns_rootname, 0, NULL);
if (ret != ISC_R_SUCCESS)
- fatal("unknown algorithm %s", algname);
- if (alg == DST_ALG_DH)
- options |= DST_TYPE_KEY;
- }
+ fatal("invalid key name %s: %s",
+ argv[isc_commandline_index],
+ isc_result_totext(ret));
+
+ if (algname == NULL) {
+ use_default = ISC_TRUE;
+ if (use_nsec3)
+ algname = strdup(DEFAULT_NSEC3_ALGORITHM);
+ else
+ algname = strdup(DEFAULT_ALGORITHM);
+ if (verbose > 0)
+ fprintf(stderr, "no algorithm specified; "
+ "defaulting to %s\n", algname);
+ }
- if (type != NULL && (options & DST_TYPE_KEY) != 0) {
- if (strcasecmp(type, "NOAUTH") == 0)
- flags |= DNS_KEYTYPE_NOAUTH;
- else if (strcasecmp(type, "NOCONF") == 0)
- flags |= DNS_KEYTYPE_NOCONF;
- else if (strcasecmp(type, "NOAUTHCONF") == 0) {
- flags |= (DNS_KEYTYPE_NOAUTH | DNS_KEYTYPE_NOCONF);
- if (size < 0)
- size = 0;
+ if (strcasecmp(algname, "RSA") == 0) {
+ fprintf(stderr, "The use of RSA (RSAMD5) is not "
+ "recommended.\nIf you still wish to "
+ "use RSA (RSAMD5) please specify "
+ "\"-a RSAMD5\"\n");
+ return (1);
+ } else if (strcasecmp(algname, "HMAC-MD5") == 0)
+ alg = DST_ALG_HMACMD5;
+ else if (strcasecmp(algname, "HMAC-SHA1") == 0)
+ alg = DST_ALG_HMACSHA1;
+ else if (strcasecmp(algname, "HMAC-SHA224") == 0)
+ alg = DST_ALG_HMACSHA224;
+ else if (strcasecmp(algname, "HMAC-SHA256") == 0)
+ alg = DST_ALG_HMACSHA256;
+ else if (strcasecmp(algname, "HMAC-SHA384") == 0)
+ alg = DST_ALG_HMACSHA384;
+ else if (strcasecmp(algname, "HMAC-SHA512") == 0)
+ alg = DST_ALG_HMACSHA512;
+ else {
+ r.base = algname;
+ r.length = strlen(algname);
+ ret = dns_secalg_fromtext(&alg, &r);
+ if (ret != ISC_R_SUCCESS)
+ fatal("unknown algorithm %s", algname);
+ if (alg == DST_ALG_DH)
+ options |= DST_TYPE_KEY;
}
- else if (strcasecmp(type, "AUTHCONF") == 0)
- /* nothing */;
- else
- fatal("invalid type %s", type);
- }
- if (size < 0)
- fatal("key size not specified (-b option)");
+ if (use_nsec3 &&
+ alg != DST_ALG_NSEC3DSA && alg != DST_ALG_NSEC3RSASHA1 &&
+ alg != DST_ALG_RSASHA256 && alg!= DST_ALG_RSASHA512 &&
+ alg != DST_ALG_ECCGOST) {
+ fatal("%s is incompatible with NSEC3; "
+ "do not use the -3 option", algname);
+ }
+
+ if (type != NULL && (options & DST_TYPE_KEY) != 0) {
+ if (strcasecmp(type, "NOAUTH") == 0)
+ flags |= DNS_KEYTYPE_NOAUTH;
+ else if (strcasecmp(type, "NOCONF") == 0)
+ flags |= DNS_KEYTYPE_NOCONF;
+ else if (strcasecmp(type, "NOAUTHCONF") == 0) {
+ flags |= (DNS_KEYTYPE_NOAUTH |
+ DNS_KEYTYPE_NOCONF);
+ if (size < 0)
+ size = 0;
+ }
+ else if (strcasecmp(type, "AUTHCONF") == 0)
+ /* nothing */;
+ else
+ fatal("invalid type %s", type);
+ }
+
+ if (size < 0) {
+ if (use_default) {
+ if ((kskflag & DNS_KEYFLAG_KSK) != 0)
+ size = 2048;
+ else
+ size = 1024;
+ if (verbose > 0)
+ fprintf(stderr, "key size not "
+ "specified; defaulting "
+ "to %d\n", size);
+ } else if (alg != DST_ALG_ECCGOST)
+ fatal("key size not specified (-b option)");
+ }
+
+ if (!oldstyle && prepub > 0) {
+ if (setpub && setact && (activate - prepub) < publish)
+ fatal("Activation and publication dates "
+ "are closer together than the\n\t"
+ "prepublication interval.");
+
+ if (!setpub && !setact) {
+ setpub = setact = ISC_TRUE;
+ publish = now;
+ activate = now + prepub;
+ } else if (setpub && !setact) {
+ setact = ISC_TRUE;
+ activate = publish + prepub;
+ } else if (setact && !setpub) {
+ setpub = ISC_TRUE;
+ publish = activate - prepub;
+ }
+
+ if ((activate - prepub) < now)
+ fatal("Time until activation is shorter "
+ "than the\n\tprepublication interval.");
+ }
+ } else {
+ char keystr[DST_KEY_FORMATSIZE];
+ isc_stdtime_t when;
+ int major, minor;
+
+ if (prepub == -1)
+ prepub = (30 * 86400);
+
+ if (algname != NULL)
+ fatal("-S and -a cannot be used together");
+ if (size >= 0)
+ fatal("-S and -b cannot be used together");
+ if (nametype != NULL)
+ fatal("-S and -n cannot be used together");
+ if (type != NULL)
+ fatal("-S and -t cannot be used together");
+ if (setpub || unsetpub)
+ fatal("-S and -P cannot be used together");
+ if (setact || unsetact)
+ fatal("-S and -A cannot be used together");
+ if (use_nsec3)
+ fatal("-S and -3 cannot be used together");
+ if (oldstyle)
+ fatal("-S and -C cannot be used together");
+ if (genonly)
+ fatal("-S and -G cannot be used together");
+
+ ret = dst_key_fromnamedfile(predecessor, directory,
+ DST_TYPE_PUBLIC | DST_TYPE_PRIVATE,
+ mctx, &prevkey);
+ if (ret != ISC_R_SUCCESS)
+ fatal("Invalid keyfile %s: %s",
+ filename, isc_result_totext(ret));
+ if (!dst_key_isprivate(prevkey))
+ fatal("%s is not a private key", filename);
+
+ name = dst_key_name(prevkey);
+ alg = dst_key_alg(prevkey);
+ size = dst_key_size(prevkey);
+ flags = dst_key_flags(prevkey);
+
+ dst_key_format(prevkey, keystr, sizeof(keystr));
+ dst_key_getprivateformat(prevkey, &major, &minor);
+ if (major != DST_MAJOR_VERSION || minor < DST_MINOR_VERSION)
+ fatal("Key %s has incompatible format version %d.%d\n\t"
+ "It is not possible to generate a successor key.",
+ keystr, major, minor);
+
+ ret = dst_key_gettime(prevkey, DST_TIME_ACTIVATE, &when);
+ if (ret != ISC_R_SUCCESS)
+ fatal("Key %s has no activation date.\n\t"
+ "You must use dnssec-settime -A to set one "
+ "before generating a successor.", keystr);
+
+ ret = dst_key_gettime(prevkey, DST_TIME_INACTIVE, &activate);
+ if (ret != ISC_R_SUCCESS)
+ fatal("Key %s has no inactivation date.\n\t"
+ "You must use dnssec-settime -I to set one "
+ "before generating a successor.", keystr);
+
+ publish = activate - prepub;
+ if (publish < now)
+ fatal("Key %s becomes inactive\n\t"
+ "sooner than the prepublication period "
+ "for the new key ends.\n\t"
+ "Either change the inactivation date with "
+ "dnssec-settime -I,\n\t"
+ "or use the -i option to set a shorter "
+ "prepublication interval.", keystr);
+
+ ret = dst_key_gettime(prevkey, DST_TIME_DELETE, &when);
+ if (ret != ISC_R_SUCCESS)
+ fprintf(stderr, "%s: WARNING: Key %s has no removal "
+ "date;\n\t it will remain in the zone "
+ "indefinitely after rollover.\n\t "
+ "You can use dnssec-settime -D to "
+ "change this.\n", program, keystr);
+
+ setpub = setact = ISC_TRUE;
+ }
switch (alg) {
case DNS_KEYALG_RSAMD5:
@@ -326,7 +705,10 @@ main(int argc, char **argv) {
if (size != 0 && !dsa_size_ok(size))
fatal("invalid DSS key size: %d", size);
break;
+ case DST_ALG_ECCGOST:
+ break;
case DST_ALG_HMACMD5:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 512)
fatal("HMAC-MD5 key size %d out of range", size);
if (dbits != 0 && (dbits < 80 || dbits > 128))
@@ -336,6 +718,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA1:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 160)
fatal("HMAC-SHA1 key size %d out of range", size);
if (dbits != 0 && (dbits < 80 || dbits > 160))
@@ -345,6 +728,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA224:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 224)
fatal("HMAC-SHA224 key size %d out of range", size);
if (dbits != 0 && (dbits < 112 || dbits > 224))
@@ -354,6 +738,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA256:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 256)
fatal("HMAC-SHA256 key size %d out of range", size);
if (dbits != 0 && (dbits < 128 || dbits > 256))
@@ -363,6 +748,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA384:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 384)
fatal("HMAC-384 key size %d out of range", size);
if (dbits != 0 && (dbits < 192 || dbits > 384))
@@ -372,6 +758,7 @@ main(int argc, char **argv) {
dbits);
break;
case DST_ALG_HMACSHA512:
+ options |= DST_TYPE_KEY;
if (size < 1 || size > 512)
fatal("HMAC-SHA512 key size %d out of range", size);
if (dbits != 0 && (dbits < 256 || dbits > 512))
@@ -384,7 +771,8 @@ main(int argc, char **argv) {
if (!(alg == DNS_KEYALG_RSAMD5 || alg == DNS_KEYALG_RSASHA1 ||
alg == DNS_KEYALG_NSEC3RSASHA1 || alg == DNS_KEYALG_RSASHA256 ||
- alg == DNS_KEYALG_RSASHA512) && rsa_exp != 0)
+ alg == DNS_KEYALG_RSASHA512 || alg == DST_ALG_ECCGOST) &&
+ rsa_exp != 0)
fatal("specified RSA exponent for a non-RSA key");
if (alg != DNS_KEYALG_DH && generator != 0)
@@ -409,10 +797,15 @@ main(int argc, char **argv) {
rdclass = strtoclass(classname);
+ if (directory == NULL)
+ directory = ".";
+
if ((options & DST_TYPE_KEY) != 0) /* KEY / HMAC */
flags |= signatory;
- else if ((flags & DNS_KEYOWNER_ZONE) != 0) /* DNSKEY */
- flags |= ksk;
+ else if ((flags & DNS_KEYOWNER_ZONE) != 0) { /* DNSKEY */
+ flags |= kskflag;
+ flags |= revflag;
+ }
if (protocol == -1)
protocol = DNS_KEYPROTO_DNSSEC;
@@ -435,16 +828,6 @@ main(int argc, char **argv) {
fatal("a key with algorithm '%s' cannot be a zone key",
algname);
- dns_fixedname_init(&fname);
- name = dns_fixedname_name(&fname);
- isc_buffer_init(&buf, argv[isc_commandline_index],
- strlen(argv[isc_commandline_index]));
- isc_buffer_add(&buf, strlen(argv[isc_commandline_index]));
- ret = dns_name_fromtext(name, &buf, dns_rootname, ISC_FALSE, NULL);
- if (ret != ISC_R_SUCCESS)
- fatal("invalid key name %s: %s", argv[isc_commandline_index],
- isc_result_totext(ret));
-
switch(alg) {
case DNS_KEYALG_RSAMD5:
case DNS_KEYALG_RSASHA1:
@@ -452,12 +835,19 @@ main(int argc, char **argv) {
case DNS_KEYALG_RSASHA256:
case DNS_KEYALG_RSASHA512:
param = rsa_exp;
+ show_progress = ISC_TRUE;
break;
+
case DNS_KEYALG_DH:
param = generator;
break;
+
case DNS_KEYALG_DSA:
case DNS_KEYALG_NSEC3DSA:
+ case DST_ALG_ECCGOST:
+ show_progress = ISC_TRUE;
+ /* fall through */
+
case DST_ALG_HMACMD5:
case DST_ALG_HMACSHA1:
case DST_ALG_HMACSHA224:
@@ -475,62 +865,136 @@ main(int argc, char **argv) {
do {
conflict = ISC_FALSE;
- oldkey = NULL;
- /* generate the key */
- ret = dst_key_generate(name, alg, size, param, flags, protocol,
- rdclass, mctx, &key);
+ if (!quiet && show_progress) {
+ fprintf(stderr, "Generating key pair.");
+ ret = dst_key_generate2(name, alg, size, param, flags,
+ protocol, rdclass, mctx, &key,
+ &progress);
+ putc('\n', stderr);
+ fflush(stderr);
+ } else {
+ ret = dst_key_generate2(name, alg, size, param, flags,
+ protocol, rdclass, mctx, &key,
+ NULL);
+ }
+
isc_entropy_stopcallbacksources(ectx);
if (ret != ISC_R_SUCCESS) {
char namestr[DNS_NAME_FORMATSIZE];
- char algstr[ALG_FORMATSIZE];
+ char algstr[DNS_SECALG_FORMATSIZE];
dns_name_format(name, namestr, sizeof(namestr));
- alg_format(alg, algstr, sizeof(algstr));
+ dns_secalg_format(alg, algstr, sizeof(algstr));
fatal("failed to generate key %s/%s: %s\n",
namestr, algstr, isc_result_totext(ret));
+ /* NOTREACHED */
exit(-1);
}
dst_key_setbits(key, dbits);
/*
- * Try to read a key with the same name, alg and id from disk.
- * If there is one we must continue generating a new one
- * unless we were asked to generate a null key, in which
- * case we return failure.
+ * Set key timing metadata (unless using -C)
+ *
+ * Creation date is always set to "now".
+ *
+ * For a new key without an explicit predecessor, publish
+ * and activation dates are set to "now" by default, but
+ * can both be overridden.
+ *
+ * For a successor key, activation is set to match the
+ * predecessor's inactivation date. Publish is set to 30
+ * days earlier than that (XXX: this should be configurable).
+ * If either of the resulting dates are in the past, that's
+ * an error; the inactivation date of the predecessor key
+ * must be updated before a successor key can be created.
*/
- ret = dst_key_fromfile(name, dst_key_id(key), alg,
- DST_TYPE_PRIVATE, NULL, mctx, &oldkey);
- /* do not overwrite an existing key */
- if (ret == ISC_R_SUCCESS) {
- dst_key_free(&oldkey);
+ if (!oldstyle) {
+ dst_key_settime(key, DST_TIME_CREATED, now);
+
+ if (genonly && (setpub || setact))
+ fatal("cannot use -G together with "
+ "-P or -A options");
+
+ if (setpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, publish);
+ else if (setact)
+ dst_key_settime(key, DST_TIME_PUBLISH,
+ activate);
+ else if (!genonly && !unsetpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, now);
+
+ if (setact)
+ dst_key_settime(key, DST_TIME_ACTIVATE,
+ activate);
+ else if (!genonly && !unsetact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, now);
+
+ if (setrev) {
+ if (kskflag == 0)
+ fprintf(stderr, "%s: warning: Key is "
+ "not flagged as a KSK, but -R "
+ "was used. Revoking a ZSK is "
+ "legal, but undefined.\n",
+ program);
+ dst_key_settime(key, DST_TIME_REVOKE, revoke);
+ }
+
+ if (setinact)
+ dst_key_settime(key, DST_TIME_INACTIVE,
+ inactive);
+
+ if (setdel)
+ dst_key_settime(key, DST_TIME_DELETE, delete);
+ } else {
+ if (setpub || setact || setrev || setinact ||
+ setdel || unsetpub || unsetact ||
+ unsetrev || unsetinact || unsetdel || genonly)
+ fatal("cannot use -C together with "
+ "-P, -A, -R, -I, -D, or -G options");
+ /*
+ * Compatibility mode: Private-key-format
+ * should be set to 1.2.
+ */
+ dst_key_setprivateformat(key, 1, 2);
+ }
+
+ /*
+ * Do not overwrite an existing key, or create a key
+ * if there is a risk of ID collision due to this key
+ * or another key being revoked.
+ */
+ if (key_collision(dst_key_id(key), name, directory,
+ alg, mctx, NULL)) {
conflict = ISC_TRUE;
- if (null_key)
+ if (null_key) {
+ dst_key_free(&key);
break;
- }
- if (conflict == ISC_TRUE) {
+ }
+
if (verbose > 0) {
isc_buffer_clear(&buf);
- ret = dst_key_buildfilename(key, 0, NULL, &buf);
+ dst_key_buildfilename(key, 0, directory, &buf);
fprintf(stderr,
- "%s: %s already exists, "
- "generating a new key\n",
+ "%s: %s already exists, or might "
+ "collide with another key upon "
+ "revokation. Generating a new key\n",
program, filename);
}
+
dst_key_free(&key);
}
-
} while (conflict == ISC_TRUE);
if (conflict)
- fatal("cannot generate a null key when a key with id 0 "
- "already exists");
+ fatal("cannot generate a null key due to possible key ID "
+ "collision");
- ret = dst_key_tofile(key, options, NULL);
+ ret = dst_key_tofile(key, options, directory);
if (ret != ISC_R_SUCCESS) {
- char keystr[KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ char keystr[DST_KEY_FORMATSIZE];
+ dst_key_format(key, keystr, sizeof(keystr));
fatal("failed to write key %s: %s\n", keystr,
isc_result_totext(ret));
}
@@ -539,6 +1003,8 @@ main(int argc, char **argv) {
ret = dst_key_buildfilename(key, 0, NULL, &buf);
printf("%s\n", filename);
dst_key_free(&key);
+ if (prevkey != NULL)
+ dst_key_free(&prevkey);
cleanup_logging(&log);
cleanup_entropy(&ectx);
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.docbook b/contrib/bind9/bin/dnssec/dnssec-keygen.docbook
index 5c7d164..dc140eb 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keygen.docbook,v 1.22.44.4 2010-01-15 23:47:33 tbox Exp $ -->
+<!-- $Id: dnssec-keygen.docbook,v 1.36 2010-12-23 04:07:59 marka Exp $ -->
<refentry id="man.dnssec-keygen">
<refentryinfo>
<date>June 30, 2000</date>
@@ -57,20 +57,34 @@
<refsynopsisdiv>
<cmdsynopsis>
<command>dnssec-keygen</command>
- <arg choice="req">-a <replaceable class="parameter">algorithm</replaceable></arg>
- <arg choice="req">-b <replaceable class="parameter">keysize</replaceable></arg>
- <arg choice="req">-n <replaceable class="parameter">nametype</replaceable></arg>
+ <arg><option>-a <replaceable class="parameter">algorithm</replaceable></option></arg>
+ <arg ><option>-b <replaceable class="parameter">keysize</replaceable></option></arg>
+ <arg><option>-n <replaceable class="parameter">nametype</replaceable></option></arg>
+ <arg><option>-3</option></arg>
+ <arg><option>-A <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-C</option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
+ <arg><option>-D <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
<arg><option>-e</option></arg>
<arg><option>-f <replaceable class="parameter">flag</replaceable></option></arg>
+ <arg><option>-G</option></arg>
<arg><option>-g <replaceable class="parameter">generator</replaceable></option></arg>
<arg><option>-h</option></arg>
+ <arg><option>-I <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-i <replaceable class="parameter">interval</replaceable></option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-k</option></arg>
+ <arg><option>-P <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-p <replaceable class="parameter">protocol</replaceable></option></arg>
+ <arg><option>-q</option></arg>
+ <arg><option>-R <replaceable class="parameter">date/offset</replaceable></option></arg>
<arg><option>-r <replaceable class="parameter">randomdev</replaceable></option></arg>
+ <arg><option>-S <replaceable class="parameter">key</replaceable></option></arg>
<arg><option>-s <replaceable class="parameter">strength</replaceable></option></arg>
<arg><option>-t <replaceable class="parameter">type</replaceable></option></arg>
<arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-z</option></arg>
<arg choice="req">name</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -80,7 +94,8 @@
<para><command>dnssec-keygen</command>
generates keys for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034. It can also generate keys for use with
- TSIG (Transaction Signatures), as defined in RFC 2845.
+ TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY
+ (Transaction Key) as defined in RFC 2930.
</para>
<para>
The <option>name</option> of the key is specified on the command
@@ -99,19 +114,27 @@
<para>
Selects the cryptographic algorithm. For DNSSEC keys, the value
of <option>algorithm</option> must be one of RSAMD5, RSASHA1,
- DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512.
- For TSIG/TKEY, the value must
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
+ For TSIG/TKEY, the value must
be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224,
HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are
case insensitive.
</para>
<para>
+ If no algorithm is specified, then RSASHA1 will be used by
+ default, unless the <option>-3</option> option is specified,
+ in which case NSEC3RSASHA1 will be used instead. (If
+ <option>-3</option> is used and an algorithm is specified,
+ that algorithm will be checked for compatibility with NSEC3.)
+ </para>
+ <para>
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement
algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is
mandatory.
</para>
<para>
- Note 2: HMAC-MD5 and DH automatically set the -k flag.
+ Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512
+ automatically set the -T KEY option.
</para>
</listitem>
</varlistentry>
@@ -127,6 +150,15 @@
bits and an exact multiple of 64. HMAC keys must be
between 1 and 512 bits.
</para>
+ <para>
+ The key size does not need to be specified if using a default
+ algorithm. The default key size is 1024 bits for zone signing
+ keys (ZSK's) and 2048 bits for key signing keys (KSK's,
+ generated with <option>-f KSK</option>). However, if an
+ algorithm is explicitly specified with the <option>-a</option>,
+ then there is no default key size, and the <option>-b</option>
+ must be used.
+ </para>
</listitem>
</varlistentry>
@@ -146,6 +178,34 @@
</varlistentry>
<varlistentry>
+ <term>-3</term>
+ <listitem>
+ <para>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms
+ are NSEC3-capable.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-C</term>
+ <listitem>
+ <para>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <command>dnssec-keygen</command>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <option>-C</option> option suppresses them.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-c <replaceable class="parameter">class</replaceable></term>
<listitem>
<para>
@@ -156,6 +216,18 @@
</varlistentry>
<varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Uses a crypto hardware (OpenSSL engine) for random number
+ and, when supported, key generation. When compiled with PKCS#11
+ support it defaults to pkcs11; the empty name resets it to
+ no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-e</term>
<listitem>
<para>
@@ -169,7 +241,17 @@
<listitem>
<para>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-G</term>
+ <listitem>
+ <para>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</para>
</listitem>
</varlistentry>
@@ -197,10 +279,19 @@
</varlistentry>
<varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to be written.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-k</term>
<listitem>
<para>
- Generate KEY records rather than DNSKEY records.
+ Deprecated in favor of -T KEY.
</para>
</listitem>
</varlistentry>
@@ -218,6 +309,25 @@
</varlistentry>
<varlistentry>
+ <term>-q</term>
+ <listitem>
+ <para>
+ Quiet mode: Suppresses unnecessary output, including
+ progress indication. Without this option, when
+ <command>dnssec-keygen</command> is run interactively
+ to generate an RSA or DSA key pair, it will print a string
+ of symbols to <filename>stderr</filename> indicating the
+ progress of the key generation. A '.' indicates that a
+ random number has been found which passed an initial
+ sieve test; '+' means a number has passed a single
+ round of the Miller-Rabin primality test; a space
+ means that the number has passed all the tests and is
+ a satisfactory key.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-r <replaceable class="parameter">randomdev</replaceable></term>
<listitem>
<para>
@@ -235,6 +345,21 @@
</varlistentry>
<varlistentry>
+ <term>-S <replaceable class="parameter">key</replaceable></term>
+ <listitem>
+ <para>
+ Create a new key which is an explicit successor to an
+ existing key. The name, algorithm, size, and type of the
+ key will be set to match the existing key. The activation
+ date of the new key will be set to the inactivation date of
+ the existing one. The publication date will be set to the
+ activation date minus the prepublication interval, which
+ defaults to 30 days.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-s <replaceable class="parameter">strength</replaceable></term>
<listitem>
<para>
@@ -246,6 +371,22 @@
</varlistentry>
<varlistentry>
+ <term>-T <replaceable class="parameter">rrtype</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the resource record type to use for the key.
+ <option>rrtype</option> must be either DNSKEY or KEY. The
+ default is DNSKEY when using a DNSSEC algorithm, but it can be
+ overridden to KEY for use with SIG(0).
+ <para>
+ </para>
+ Using any TSIG algorithm (HMAC-* or DH) forces this option
+ to KEY.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-t <replaceable class="parameter">type</replaceable></term>
<listitem>
<para>
@@ -270,6 +411,109 @@
</refsect1>
<refsect1>
+ <title>TIMING OPTIONS</title>
+
+ <para>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-P <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-I <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-D <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-i <replaceable class="parameter">interval</replaceable></term>
+ <listitem>
+ <para>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </para>
+ <para>
+ If the key is being created as an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </para>
+ <para>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+
+ <refsect1>
<title>GENERATED KEYS</title>
<para>
When <command>dnssec-keygen</command> completes
diff --git a/contrib/bind9/bin/dnssec/dnssec-keygen.html b/contrib/bind9/bin/dnssec/dnssec-keygen.html
index 7ca7d57..2f3a69b 100644
--- a/contrib/bind9/bin/dnssec/dnssec-keygen.html
+++ b/contrib/bind9/bin/dnssec/dnssec-keygen.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-keygen.html,v 1.32.44.4 2010-01-16 01:55:32 tbox Exp $ -->
+<!-- $Id: dnssec-keygen.html,v 1.47 2010-12-24 01:14:20 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,14 +29,15 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-b <em class="replaceable"><code>keysize</code></em>} {-n <em class="replaceable"><code>nametype</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k</code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-3</code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-C</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k</code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-q</code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S <em class="replaceable"><code>key</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543483"></a><h2>DESCRIPTION</h2>
+<a name="id2543578"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keygen</strong></span>
generates keys for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034. It can also generate keys for use with
- TSIG (Transaction Signatures), as defined in RFC 2845.
+ TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY
+ (Transaction Key) as defined in RFC 2930.
</p>
<p>
The <code class="option">name</code> of the key is specified on the command
@@ -45,37 +46,56 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543501"></a><h2>OPTIONS</h2>
+<a name="id2543596"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. For DNSSEC keys, the value
of <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
- DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512.
- For TSIG/TKEY, the value must
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
+ For TSIG/TKEY, the value must
be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224,
HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are
case insensitive.
</p>
<p>
+ If no algorithm is specified, then RSASHA1 will be used by
+ default, unless the <code class="option">-3</code> option is specified,
+ in which case NSEC3RSASHA1 will be used instead. (If
+ <code class="option">-3</code> is used and an algorithm is specified,
+ that algorithm will be checked for compatibility with NSEC3.)
+ </p>
+<p>
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement
algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is
mandatory.
</p>
<p>
- Note 2: HMAC-MD5 and DH automatically set the -k flag.
+ Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512
+ automatically set the -T KEY option.
</p>
</dd>
<dt><span class="term">-b <em class="replaceable"><code>keysize</code></em></span></dt>
-<dd><p>
+<dd>
+<p>
Specifies the number of bits in the key. The choice of key
size depends on the algorithm used. RSA keys must be
between 512 and 2048 bits. Diffie Hellman keys must be between
128 and 4096 bits. DSA keys must be between 512 and 1024
bits and an exact multiple of 64. HMAC keys must be
between 1 and 512 bits.
- </p></dd>
+ </p>
+<p>
+ The key size does not need to be specified if using a default
+ algorithm. The default key size is 1024 bits for zone signing
+ keys (ZSK's) and 2048 bits for key signing keys (KSK's,
+ generated with <code class="option">-f KSK</code>). However, if an
+ algorithm is explicitly specified with the <code class="option">-a</code>,
+ then there is no default key size, and the <code class="option">-b</code>
+ must be used.
+ </p>
+</dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
Specifies the owner type of the key. The value of
@@ -86,11 +106,36 @@
These values are case insensitive. Defaults to ZONE for DNSKEY
generation.
</p></dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms
+ are NSEC3-capable.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keygen</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
+ </p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
Indicates that the DNS record containing the key should have
the specified class. If not specified, class IN is used.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for random number
+ and, when supported, key generation. When compiled with PKCS#11
+ support it defaults to pkcs11; the empty name resets it to
+ no engine.
+ </p></dd>
<dt><span class="term">-e</span></dt>
<dd><p>
If generating an RSAMD5/RSASHA1 key, use a large exponent.
@@ -98,7 +143,12 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-g <em class="replaceable"><code>generator</code></em></span></dt>
<dd><p>
@@ -112,9 +162,13 @@
Prints a short summary of the options and arguments to
<span><strong class="command">dnssec-keygen</strong></span>.
</p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
+ </p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
- Generate KEY records rather than DNSKEY records.
+ Deprecated in favor of -T KEY.
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
@@ -123,6 +177,20 @@
Other possible values for this argument are listed in
RFC 2535 and its successors.
</p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Suppresses unnecessary output, including
+ progress indication. Without this option, when
+ <span><strong class="command">dnssec-keygen</strong></span> is run interactively
+ to generate an RSA or DSA key pair, it will print a string
+ of symbols to <code class="filename">stderr</code> indicating the
+ progress of the key generation. A '.' indicates that a
+ random number has been found which passed an initial
+ sieve test; '+' means a number has passed a single
+ round of the Miller-Rabin primality test; a space
+ means that the number has passed all the tests and is
+ a satisfactory key.
+ </p></dd>
<dt><span class="term">-r <em class="replaceable"><code>randomdev</code></em></span></dt>
<dd><p>
Specifies the source of randomness. If the operating
@@ -135,12 +203,37 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>key</code></em></span></dt>
+<dd><p>
+ Create a new key which is an explicit successor to an
+ existing key. The name, algorithm, size, and type of the
+ key will be set to match the existing key. The activation
+ date of the new key will be set to the inactivation date of
+ the existing one. The publication date will be set to the
+ activation date minus the prepublication interval, which
+ defaults to 30 days.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>strength</code></em></span></dt>
<dd><p>
Specifies the strength value of the key. The strength is
a number between 0 and 15, and currently has no defined
purpose in DNSSEC.
</p></dd>
+<dt><span class="term">-T <em class="replaceable"><code>rrtype</code></em></span></dt>
+<dd>
+<p>
+ Specifies the resource record type to use for the key.
+ <code class="option">rrtype</code> must be either DNSKEY or KEY. The
+ default is DNSKEY when using a DNSSEC algorithm, but it can be
+ overridden to KEY for use with SIG(0).
+ </p>
+<p>
+ </p>
+<p>
+ Using any TSIG algorithm (HMAC-* or DH) forces this option
+ to KEY.
+ </p>
+</dd>
<dt><span class="term">-t <em class="replaceable"><code>type</code></em></span></dt>
<dd><p>
Indicates the use of the key. <code class="option">type</code> must be
@@ -155,7 +248,78 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543836"></a><h2>GENERATED KEYS</h2>
+<a name="id2544301"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being created as an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2544491"></a><h2>GENERATED KEYS</h2>
<p>
When <span><strong class="command">dnssec-keygen</strong></span> completes
successfully,
@@ -201,7 +365,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543918"></a><h2>EXAMPLE</h2>
+<a name="id2544642"></a><h2>EXAMPLE</h2>
<p>
To generate a 768-bit DSA key for the domain
<strong class="userinput"><code>example.com</code></strong>, the following command would be
@@ -222,7 +386,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544030"></a><h2>SEE ALSO</h2>
+<a name="id2544685"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 2539</em>,
@@ -231,7 +395,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544061"></a><h2>AUTHOR</h2>
+<a name="id2544716"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.8 b/contrib/bind9/bin/dnssec/dnssec-revoke.8
new file mode 100644
index 0000000..d57b6aa
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.8
@@ -0,0 +1,83 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: dnssec-revoke.8,v 1.9 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: dnssec\-revoke
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: June 1, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "DNSSEC\-REVOKE" "8" "June 1, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+dnssec\-revoke \- Set the REVOKED bit on a DNSSEC key
+.SH "SYNOPSIS"
+.HP 14
+\fBdnssec\-revoke\fR [\fB\-hr\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-f\fR] {keyfile}
+.SH "DESCRIPTION"
+.PP
+\fBdnssec\-revoke\fR
+reads a DNSSEC key file, sets the REVOKED bit on the key as defined in RFC 5011, and creates a new pair of key files containing the now\-revoked key.
+.SH "OPTIONS"
+.PP
+\-h
+.RS 4
+Emit usage message and exit.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to reside.
+.RE
+.PP
+\-r
+.RS 4
+After writing the new keyset files remove the original keyset files.
+.RE
+.PP
+\-v \fIlevel\fR
+.RS 4
+Sets the debugging level.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Use the given OpenSSL engine. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
+.RE
+.PP
+\-f
+.RS 4
+Force overwrite: Causes
+\fBdnssec\-revoke\fR
+to write the new key pair even if a file already exists matching the algorithm and key ID of the revoked key.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBdnssec\-keygen\fR(8),
+BIND 9 Administrator Reference Manual,
+RFC 5011.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.c b/contrib/bind9/bin/dnssec/dnssec-revoke.c
new file mode 100644
index 0000000..90e905c
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnssec-revoke.c,v 1.22 2010-05-06 23:50:56 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <libgen.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/hash.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/keyvalues.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
+#include "dnssectool.h"
+
+const char *program = "dnssec-revoke";
+int verbose;
+
+static isc_mem_t *mctx = NULL;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, " %s [options] keyfile\n\n", program);
+ fprintf(stderr, "Version: %s\n", VERSION);
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E engine: specify OpenSSL engine "
+ "(default \"pkcs11\")\n");
+#else
+ fprintf(stderr, " -E engine: specify OpenSSL engine\n");
+#endif
+ fprintf(stderr, " -f: force overwrite\n");
+ fprintf(stderr, " -K directory: use directory for key files\n");
+ fprintf(stderr, " -h: help\n");
+ fprintf(stderr, " -r: remove old keyfiles after "
+ "creating revoked version\n");
+ fprintf(stderr, " -v level: set level of verbosity\n");
+ fprintf(stderr, "Output:\n");
+ fprintf(stderr, " K<name>+<alg>+<new id>.key, "
+ "K<name>+<alg>+<new id>.private\n");
+
+ exit (-1);
+}
+
+int
+main(int argc, char **argv) {
+ isc_result_t result;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
+ char *filename = NULL, *dir = NULL;
+ char newname[1024], oldname[1024];
+ char keystr[DST_KEY_FORMATSIZE];
+ char *endp;
+ int ch;
+ isc_entropy_t *ectx = NULL;
+ dst_key_t *key = NULL;
+ isc_uint32_t flags;
+ isc_buffer_t buf;
+ isc_boolean_t force = ISC_FALSE;
+ isc_boolean_t remove = ISC_FALSE;
+
+ if (argc == 1)
+ usage();
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS)
+ fatal("Out of memory");
+
+ dns_result_register();
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((ch = isc_commandline_parse(argc, argv, "E:fK:rhv:")) != -1) {
+ switch (ch) {
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
+ case 'f':
+ force = ISC_TRUE;
+ break;
+ case 'K':
+ /*
+ * We don't have to copy it here, but do it to
+ * simplify cleanup later
+ */
+ dir = isc_mem_strdup(mctx, isc_commandline_argument);
+ if (dir == NULL) {
+ fatal("Failed to allocate memory for "
+ "directory");
+ }
+ break;
+ case 'r':
+ remove = ISC_TRUE;
+ break;
+ case 'v':
+ verbose = strtol(isc_commandline_argument, &endp, 0);
+ if (*endp != '\0')
+ fatal("-v must be followed by a number");
+ break;
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ /* Falls into */
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (argc < isc_commandline_index + 1 ||
+ argv[isc_commandline_index] == NULL)
+ fatal("The key file name was not specified");
+ if (argc > isc_commandline_index + 1)
+ fatal("Extraneous arguments");
+
+ if (dir != NULL) {
+ filename = argv[isc_commandline_index];
+ } else {
+ result = isc_file_splitpath(mctx, argv[isc_commandline_index],
+ &dir, &filename);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot process filename %s: %s",
+ argv[isc_commandline_index],
+ isc_result_totext(result));
+ if (strcmp(dir, ".") == 0) {
+ isc_mem_free(mctx, dir);
+ dir = NULL;
+ }
+ }
+
+ if (ectx == NULL)
+ setup_entropy(mctx, NULL, &ectx);
+ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize hash");
+ result = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize dst: %s",
+ isc_result_totext(result));
+ isc_entropy_stopcallbacksources(ectx);
+
+ result = dst_key_fromnamedfile(filename, dir,
+ DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ fatal("Invalid keyfile name %s: %s",
+ filename, isc_result_totext(result));
+
+ dst_key_format(key, keystr, sizeof(keystr));
+
+ if (verbose > 2)
+ fprintf(stderr, "%s: %s\n", program, keystr);
+
+ if (force)
+ set_keyversion(key);
+ else
+ check_keyversion(key, keystr);
+
+
+ flags = dst_key_flags(key);
+ if ((flags & DNS_KEYFLAG_REVOKE) == 0) {
+ isc_stdtime_t now;
+
+ if ((flags & DNS_KEYFLAG_KSK) == 0)
+ fprintf(stderr, "%s: warning: Key is not flagged "
+ "as a KSK. Revoking a ZSK is "
+ "legal, but undefined.\n",
+ program);
+
+ isc_stdtime_get(&now);
+ dst_key_settime(key, DST_TIME_REVOKE, now);
+
+ dst_key_setflags(key, flags | DNS_KEYFLAG_REVOKE);
+
+ isc_buffer_init(&buf, newname, sizeof(newname));
+ dst_key_buildfilename(key, DST_TYPE_PUBLIC, dir, &buf);
+
+ if (access(newname, F_OK) == 0 && !force) {
+ fatal("Key file %s already exists; "
+ "use -f to force overwrite", newname);
+ }
+
+ result = dst_key_tofile(key, DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ dir);
+ if (result != ISC_R_SUCCESS) {
+ dst_key_format(key, keystr, sizeof(keystr));
+ fatal("Failed to write key %s: %s", keystr,
+ isc_result_totext(result));
+ }
+
+ isc_buffer_clear(&buf);
+ dst_key_buildfilename(key, 0, dir, &buf);
+ printf("%s\n", newname);
+
+ /*
+ * Remove old key file, if told to (and if
+ * it isn't the same as the new file)
+ */
+ if (remove && dst_key_alg(key) != DST_ALG_RSAMD5) {
+ isc_buffer_init(&buf, oldname, sizeof(oldname));
+ dst_key_setflags(key, flags & ~DNS_KEYFLAG_REVOKE);
+ dst_key_buildfilename(key, DST_TYPE_PRIVATE, dir, &buf);
+ if (strcmp(oldname, newname) == 0)
+ goto cleanup;
+ if (access(oldname, F_OK) == 0)
+ unlink(oldname);
+ isc_buffer_clear(&buf);
+ dst_key_buildfilename(key, DST_TYPE_PUBLIC, dir, &buf);
+ if (access(oldname, F_OK) == 0)
+ unlink(oldname);
+ }
+ } else {
+ dst_key_format(key, keystr, sizeof(keystr));
+ fatal("Key %s is already revoked", keystr);
+ }
+
+cleanup:
+ dst_key_free(&key);
+ dst_lib_destroy();
+ isc_hash_destroy();
+ cleanup_entropy(&ectx);
+ if (verbose > 10)
+ isc_mem_stats(mctx, stdout);
+ if (dir != NULL)
+ isc_mem_free(mctx, dir);
+ isc_mem_destroy(&mctx);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.docbook b/contrib/bind9/bin/dnssec/dnssec-revoke.docbook
new file mode 100644
index 0000000..b7b5620
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.docbook
@@ -0,0 +1,149 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: dnssec-revoke.docbook,v 1.7 2009-11-03 21:44:46 each Exp $ -->
+<refentry id="man.dnssec-revoke">
+ <refentryinfo>
+ <date>June 1, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>dnssec-revoke</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>dnssec-revoke</application></refname>
+ <refpurpose>Set the REVOKED bit on a DNSSEC key</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>dnssec-revoke</command>
+ <arg><option>-hr</option></arg>
+ <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
+ <arg><option>-f</option></arg>
+ <arg choice="req">keyfile</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para><command>dnssec-revoke</command>
+ reads a DNSSEC key file, sets the REVOKED bit on the key as defined
+ in RFC 5011, and creates a new pair of key files containing the
+ now-revoked key.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-h</term>
+ <listitem>
+ <para>
+ Emit usage message and exit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to reside.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-r</term>
+ <listitem>
+ <para>
+ After writing the new keyset files remove the original keyset
+ files.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-v <replaceable class="parameter">level</replaceable></term>
+ <listitem>
+ <para>
+ Sets the debugging level.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-f</term>
+ <listitem>
+ <para>
+ Force overwrite: Causes <command>dnssec-revoke</command> to
+ write the new key pair even if a file already exists matching
+ the algorithm and key ID of the revoked key.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para><citerefentry>
+ <refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 5011</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/dnssec/dnssec-revoke.html b/contrib/bind9/bin/dnssec/dnssec-revoke.html
new file mode 100644
index 0000000..fad9ac5
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-revoke.html
@@ -0,0 +1,87 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: dnssec-revoke.html,v 1.9 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-revoke</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.dnssec-revoke"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-revoke</span> &#8212; Set the REVOKED bit on a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-revoke</code> [<code class="option">-hr</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f</code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543373"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-revoke</strong></span>
+ reads a DNSSEC key file, sets the REVOKED bit on the key as defined
+ in RFC 5011, and creates a new pair of key files containing the
+ now-revoked key.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543385"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-r</span></dt>
+<dd><p>
+ After writing the new keyset files remove the original keyset
+ files.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force overwrite: Causes <span><strong class="command">dnssec-revoke</strong></span> to
+ write the new key pair even if a file already exists matching
+ the algorithm and key ID of the revoked key.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543491"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543515"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.8 b/contrib/bind9/bin/dnssec/dnssec-settime.8
new file mode 100644
index 0000000..4390494
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.8
@@ -0,0 +1,166 @@
+.\" Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: dnssec-settime.8,v 1.14 2010-08-17 01:15:26 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: dnssec\-settime
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: July 15, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "DNSSEC\-SETTIME" "8" "July 15, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+dnssec\-settime \- Set the key timing metadata for a DNSSEC key
+.SH "SYNOPSIS"
+.HP 15
+\fBdnssec\-settime\fR [\fB\-f\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-P\ \fR\fB\fIdate/offset\fR\fR] [\fB\-A\ \fR\fB\fIdate/offset\fR\fR] [\fB\-R\ \fR\fB\fIdate/offset\fR\fR] [\fB\-I\ \fR\fB\fIdate/offset\fR\fR] [\fB\-D\ \fR\fB\fIdate/offset\fR\fR] [\fB\-h\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] {keyfile}
+.SH "DESCRIPTION"
+.PP
+\fBdnssec\-settime\fR
+reads a DNSSEC private key file and sets the key timing metadata as specified by the
+\fB\-P\fR,
+\fB\-A\fR,
+\fB\-R\fR,
+\fB\-I\fR, and
+\fB\-D\fR
+options. The metadata can then be used by
+\fBdnssec\-signzone\fR
+or other signing software to determine when a key is to be published, whether it should be used for signing a zone, etc.
+.PP
+If none of these options is set on the command line, then
+\fBdnssec\-settime\fR
+simply prints the key timing metadata already stored in the key.
+.PP
+When key metadata fields are changed, both files of a key pair (\fIKnnnn.+aaa+iiiii.key\fR
+and
+\fIKnnnn.+aaa+iiiii.private\fR) are regenerated. Metadata fields are stored in the private file. A human\-readable description of the metadata is also placed in comments in the key file.
+.SH "OPTIONS"
+.PP
+\-f
+.RS 4
+Force an update of an old\-format key with no metadata fields. Without this option,
+\fBdnssec\-settime\fR
+will fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be set to the present time.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Sets the directory in which the key files are to reside.
+.RE
+.PP
+\-h
+.RS 4
+Emit usage message and exit.
+.RE
+.PP
+\-v \fIlevel\fR
+.RS 4
+Sets the debugging level.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Use the given OpenSSL engine. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
+.RE
+.SH "TIMING OPTIONS"
+.PP
+Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '\-', it is interpreted as an offset from the present time. For convenience, if such an offset is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the offset is computed in years (defined as 365 24\-hour days, ignoring leap years), months (defined as 30 24\-hour days), weeks, days, hours, or minutes, respectively. Without a suffix, the offset is computed in seconds. To unset a date, use 'none'.
+.PP
+\-P \fIdate/offset\fR
+.RS 4
+Sets the date on which a key is to be published to the zone. After that date, the key will be included in the zone but will not be used to sign it.
+.RE
+.PP
+\-A \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be activated. After that date, the key will be included in the zone and used to sign it.
+.RE
+.PP
+\-R \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be revoked. After that date, the key will be flagged as revoked. It will be included in the zone and will be used to sign it.
+.RE
+.PP
+\-I \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be retired. After that date, the key will still be included in the zone, but it will not be used to sign it.
+.RE
+.PP
+\-D \fIdate/offset\fR
+.RS 4
+Sets the date on which the key is to be deleted. After that date, the key will no longer be included in the zone. (It may remain in the key repository, however.)
+.RE
+.PP
+\-S \fIpredecessor key\fR
+.RS 4
+Select a key for which the key being modified will be an explicit successor. The name, algorithm, size, and type of the predecessor key must exactly match those of the key being modified. The activation date of the successor key will be set to the inactivation date of the predecessor. The publication date will be set to the activation date minus the prepublication interval, which defaults to 30 days.
+.RE
+.PP
+\-i \fIinterval\fR
+.RS 4
+Sets the prepublication interval for a key. If set, then the publication and activation dates must be separated by at least this much time. If the activation date is specified but the publication date isn't, then the publication date will default to this much time before the activation date; conversely, if the publication date is specified but activation date isn't, then activation will be set to this much time after publication.
+.sp
+If the key is being set to be an explicit successor to another key, then the default prepublication interval is 30 days; otherwise it is zero.
+.sp
+As with date offsets, if the argument is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the interval is measured in years, months, weeks, days, hours, or minutes, respectively. Without a suffix, the interval is measured in seconds.
+.RE
+.SH "PRINTING OPTIONS"
+.PP
+\fBdnssec\-settime\fR
+can also be used to print the timing metadata associated with a key.
+.PP
+\-u
+.RS 4
+Print times in UNIX epoch format.
+.RE
+.PP
+\-p \fIC/P/A/R/I/D/all\fR
+.RS 4
+Print a specific metadata value or set of metadata values. The
+\fB\-p\fR
+option may be followed by one or more of the following letters to indicate which value or values to print:
+\fBC\fR
+for the creation date,
+\fBP\fR
+for the publication date,
+\fBA\fR
+for the activation date,
+\fBR\fR
+for the revocation date,
+\fBI\fR
+for the inactivation date, or
+\fBD\fR
+for the deletion date. To print all of the metadata, use
+\fB\-p all\fR.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBdnssec\-keygen\fR(8),
+\fBdnssec\-signzone\fR(8),
+BIND 9 Administrator Reference Manual,
+RFC 5011.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.c b/contrib/bind9/bin/dnssec/dnssec-settime.c
new file mode 100644
index 0000000..364e2ab
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.c
@@ -0,0 +1,576 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnssec-settime.c,v 1.28 2010-12-19 07:29:36 each Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <libgen.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <time.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/entropy.h>
+#include <isc/file.h>
+#include <isc/hash.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/keyvalues.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
+#include "dnssectool.h"
+
+const char *program = "dnssec-settime";
+int verbose;
+
+static isc_mem_t *mctx = NULL;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "Usage:\n");
+ fprintf(stderr, " %s [options] keyfile\n\n", program);
+ fprintf(stderr, "Version: %s\n", VERSION);
+ fprintf(stderr, "General options:\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, " -E engine: specify OpenSSL engine "
+ "(default \"pkcs11\")\n");
+#else
+ fprintf(stderr, " -E engine: specify OpenSSL engine\n");
+#endif
+ fprintf(stderr, " -f: force update of old-style "
+ "keys\n");
+ fprintf(stderr, " -K directory: set key file location\n");
+ fprintf(stderr, " -v level: set level of verbosity\n");
+ fprintf(stderr, " -h: help\n");
+ fprintf(stderr, "Timing options:\n");
+ fprintf(stderr, " -P date/[+-]offset/none: set/unset key "
+ "publication date\n");
+ fprintf(stderr, " -A date/[+-]offset/none: set/unset key "
+ "activation date\n");
+ fprintf(stderr, " -R date/[+-]offset/none: set/unset key "
+ "revocation date\n");
+ fprintf(stderr, " -I date/[+-]offset/none: set/unset key "
+ "inactivation date\n");
+ fprintf(stderr, " -D date/[+-]offset/none: set/unset key "
+ "deletion date\n");
+ fprintf(stderr, "Printing options:\n");
+ fprintf(stderr, " -p C/P/A/R/I/D/all: print a particular time "
+ "value or values "
+ "[default: all]\n");
+ fprintf(stderr, " -u: print times in unix epoch "
+ "format\n");
+ fprintf(stderr, "Output:\n");
+ fprintf(stderr, " K<name>+<alg>+<new id>.key, "
+ "K<name>+<alg>+<new id>.private\n");
+
+ exit (-1);
+}
+
+static void
+printtime(dst_key_t *key, int type, const char *tag, isc_boolean_t epoch,
+ FILE *stream)
+{
+ isc_result_t result;
+ const char *output = NULL;
+ isc_stdtime_t when;
+
+ if (tag != NULL)
+ fprintf(stream, "%s: ", tag);
+
+ result = dst_key_gettime(key, type, &when);
+ if (result == ISC_R_NOTFOUND) {
+ fprintf(stream, "UNSET\n");
+ } else if (epoch) {
+ fprintf(stream, "%d\n", (int) when);
+ } else {
+ time_t time = when;
+ output = ctime(&time);
+ fprintf(stream, "%s", output);
+ }
+}
+
+int
+main(int argc, char **argv) {
+ isc_result_t result;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
+ char *filename = NULL, *directory = NULL;
+ char newname[1024];
+ char keystr[DST_KEY_FORMATSIZE];
+ char *endp, *p;
+ int ch;
+ isc_entropy_t *ectx = NULL;
+ const char *predecessor = NULL;
+ dst_key_t *prevkey = NULL;
+ dst_key_t *key = NULL;
+ isc_buffer_t buf;
+ dns_name_t *name = NULL;
+ dns_secalg_t alg = 0;
+ unsigned int size = 0;
+ isc_uint16_t flags = 0;
+ int prepub = -1;
+ isc_stdtime_t now;
+ isc_stdtime_t pub = 0, act = 0, rev = 0, inact = 0, del = 0;
+ isc_boolean_t setpub = ISC_FALSE, setact = ISC_FALSE;
+ isc_boolean_t setrev = ISC_FALSE, setinact = ISC_FALSE;
+ isc_boolean_t setdel = ISC_FALSE;
+ isc_boolean_t unsetpub = ISC_FALSE, unsetact = ISC_FALSE;
+ isc_boolean_t unsetrev = ISC_FALSE, unsetinact = ISC_FALSE;
+ isc_boolean_t unsetdel = ISC_FALSE;
+ isc_boolean_t printcreate = ISC_FALSE, printpub = ISC_FALSE;
+ isc_boolean_t printact = ISC_FALSE, printrev = ISC_FALSE;
+ isc_boolean_t printinact = ISC_FALSE, printdel = ISC_FALSE;
+ isc_boolean_t force = ISC_FALSE;
+ isc_boolean_t epoch = ISC_FALSE;
+ isc_boolean_t changed = ISC_FALSE;
+
+ if (argc == 1)
+ usage();
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS)
+ fatal("Out of memory");
+
+ dns_result_register();
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ isc_stdtime_get(&now);
+
+#define CMDLINE_FLAGS "A:D:E:fhI:i:K:P:p:R:S:uv:"
+ while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
+ switch (ch) {
+ case 'E':
+ engine = isc_commandline_argument;
+ break;
+ case 'f':
+ force = ISC_TRUE;
+ break;
+ case 'p':
+ p = isc_commandline_argument;
+ if (!strcasecmp(p, "all")) {
+ printcreate = ISC_TRUE;
+ printpub = ISC_TRUE;
+ printact = ISC_TRUE;
+ printrev = ISC_TRUE;
+ printinact = ISC_TRUE;
+ printdel = ISC_TRUE;
+ break;
+ }
+
+ do {
+ switch (*p++) {
+ case 'C':
+ printcreate = ISC_TRUE;
+ break;
+ case 'P':
+ printpub = ISC_TRUE;
+ break;
+ case 'A':
+ printact = ISC_TRUE;
+ break;
+ case 'R':
+ printrev = ISC_TRUE;
+ break;
+ case 'I':
+ printinact = ISC_TRUE;
+ break;
+ case 'D':
+ printdel = ISC_TRUE;
+ break;
+ case ' ':
+ break;
+ default:
+ usage();
+ break;
+ }
+ } while (*p != '\0');
+ break;
+ case 'u':
+ epoch = ISC_TRUE;
+ break;
+ case 'K':
+ /*
+ * We don't have to copy it here, but do it to
+ * simplify cleanup later
+ */
+ directory = isc_mem_strdup(mctx,
+ isc_commandline_argument);
+ if (directory == NULL) {
+ fatal("Failed to allocate memory for "
+ "directory");
+ }
+ break;
+ case 'v':
+ verbose = strtol(isc_commandline_argument, &endp, 0);
+ if (*endp != '\0')
+ fatal("-v must be followed by a number");
+ break;
+ case 'P':
+ if (setpub || unsetpub)
+ fatal("-P specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetpub = ISC_TRUE;
+ } else {
+ setpub = ISC_TRUE;
+ pub = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'A':
+ if (setact || unsetact)
+ fatal("-A specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetact = ISC_TRUE;
+ } else {
+ setact = ISC_TRUE;
+ act = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'R':
+ if (setrev || unsetrev)
+ fatal("-R specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetrev = ISC_TRUE;
+ } else {
+ setrev = ISC_TRUE;
+ rev = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'I':
+ if (setinact || unsetinact)
+ fatal("-I specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetinact = ISC_TRUE;
+ } else {
+ setinact = ISC_TRUE;
+ inact = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'D':
+ if (setdel || unsetdel)
+ fatal("-D specified more than once");
+
+ changed = ISC_TRUE;
+ if (!strcasecmp(isc_commandline_argument, "none")) {
+ unsetdel = ISC_TRUE;
+ } else {
+ setdel = ISC_TRUE;
+ del = strtotime(isc_commandline_argument,
+ now, now);
+ }
+ break;
+ case 'S':
+ predecessor = isc_commandline_argument;
+ break;
+ case 'i':
+ prepub = strtottl(isc_commandline_argument);
+ break;
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ /* Falls into */
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (argc < isc_commandline_index + 1 ||
+ argv[isc_commandline_index] == NULL)
+ fatal("The key file name was not specified");
+ if (argc > isc_commandline_index + 1)
+ fatal("Extraneous arguments");
+
+ if (ectx == NULL)
+ setup_entropy(mctx, NULL, &ectx);
+ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize hash");
+ result = dst_lib_init2(mctx, ectx, engine,
+ ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
+ if (result != ISC_R_SUCCESS)
+ fatal("Could not initialize dst: %s",
+ isc_result_totext(result));
+ isc_entropy_stopcallbacksources(ectx);
+
+ if (predecessor != NULL) {
+ char keystr[DST_KEY_FORMATSIZE];
+ isc_stdtime_t when;
+ int major, minor;
+
+ if (prepub == -1)
+ prepub = (30 * 86400);
+
+ if (setpub || unsetpub)
+ fatal("-S and -P cannot be used together");
+ if (setact || unsetact)
+ fatal("-S and -A cannot be used together");
+
+ result = dst_key_fromnamedfile(predecessor, directory,
+ DST_TYPE_PUBLIC |
+ DST_TYPE_PRIVATE,
+ mctx, &prevkey);
+ if (result != ISC_R_SUCCESS)
+ fatal("Invalid keyfile %s: %s",
+ filename, isc_result_totext(result));
+ if (!dst_key_isprivate(prevkey))
+ fatal("%s is not a private key", filename);
+
+ name = dst_key_name(prevkey);
+ alg = dst_key_alg(prevkey);
+ size = dst_key_size(prevkey);
+ flags = dst_key_flags(prevkey);
+
+ dst_key_format(prevkey, keystr, sizeof(keystr));
+ dst_key_getprivateformat(prevkey, &major, &minor);
+ if (major != DST_MAJOR_VERSION || minor < DST_MINOR_VERSION)
+ fatal("Predecessor has incompatible format "
+ "version %d.%d\n\t", major, minor);
+
+ result = dst_key_gettime(prevkey, DST_TIME_ACTIVATE, &when);
+ if (result != ISC_R_SUCCESS)
+ fatal("Predecessor has no activation date. "
+ "You must set one before\n\t"
+ "generating a successor.");
+
+ result = dst_key_gettime(prevkey, DST_TIME_INACTIVE, &act);
+ if (result != ISC_R_SUCCESS)
+ fatal("Predecessor has no inactivation date. "
+ "You must set one before\n\t"
+ "generating a successor.");
+
+ pub = act - prepub;
+ if (pub < now && prepub != 0)
+ fatal("Predecessor will become inactive before the\n\t"
+ "prepublication period ends. Either change "
+ "its inactivation date,\n\t"
+ "or use the -i option to set a shorter "
+ "prepublication interval.");
+
+ result = dst_key_gettime(prevkey, DST_TIME_DELETE, &when);
+ if (result != ISC_R_SUCCESS)
+ fprintf(stderr, "%s: WARNING: Predecessor has no "
+ "removal date;\n\t"
+ "it will remain in the zone "
+ "indefinitely after rollover.\n",
+ program);
+
+ changed = setpub = setact = ISC_TRUE;
+ dst_key_free(&prevkey);
+ } else {
+ if (prepub < 0)
+ prepub = 0;
+
+ if (prepub > 0) {
+ if (setpub && setact && (act - prepub) < pub)
+ fatal("Activation and publication dates "
+ "are closer together than the\n\t"
+ "prepublication interval.");
+
+ if (setpub && !setact) {
+ setact = ISC_TRUE;
+ act = pub + prepub;
+ } else if (setact && !setpub) {
+ setpub = ISC_TRUE;
+ pub = act - prepub;
+ }
+
+ if ((act - prepub) < now)
+ fatal("Time until activation is shorter "
+ "than the\n\tprepublication interval.");
+ }
+ }
+
+ if (directory != NULL) {
+ filename = argv[isc_commandline_index];
+ } else {
+ result = isc_file_splitpath(mctx, argv[isc_commandline_index],
+ &directory, &filename);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot process filename %s: %s",
+ argv[isc_commandline_index],
+ isc_result_totext(result));
+ }
+
+ result = dst_key_fromnamedfile(filename, directory,
+ DST_TYPE_PUBLIC | DST_TYPE_PRIVATE,
+ mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ fatal("Invalid keyfile %s: %s",
+ filename, isc_result_totext(result));
+
+ if (!dst_key_isprivate(key))
+ fatal("%s is not a private key", filename);
+
+ dst_key_format(key, keystr, sizeof(keystr));
+
+ if (predecessor != NULL) {
+ if (!dns_name_equal(name, dst_key_name(key)))
+ fatal("Key name mismatch");
+ if (alg != dst_key_alg(key))
+ fatal("Key algorithm mismatch");
+ if (size != dst_key_size(key))
+ fatal("Key size mismatch");
+ if (flags != dst_key_flags(key))
+ fatal("Key flags mismatch");
+ }
+
+ if (force)
+ set_keyversion(key);
+ else
+ check_keyversion(key, keystr);
+
+ if (verbose > 2)
+ fprintf(stderr, "%s: %s\n", program, keystr);
+
+ /*
+ * Set time values.
+ */
+ if (setpub)
+ dst_key_settime(key, DST_TIME_PUBLISH, pub);
+ else if (unsetpub)
+ dst_key_unsettime(key, DST_TIME_PUBLISH);
+
+ if (setact)
+ dst_key_settime(key, DST_TIME_ACTIVATE, act);
+ else if (unsetact)
+ dst_key_unsettime(key, DST_TIME_ACTIVATE);
+
+ if (setrev) {
+ if ((dst_key_flags(key) & DNS_KEYFLAG_REVOKE) != 0)
+ fprintf(stderr, "%s: warning: Key %s is already "
+ "revoked; changing the revocation date "
+ "will not affect this.\n",
+ program, keystr);
+ if ((dst_key_flags(key) & DNS_KEYFLAG_KSK) == 0)
+ fprintf(stderr, "%s: warning: Key %s is not flagged as "
+ "a KSK, but -R was used. Revoking a "
+ "ZSK is legal, but undefined.\n",
+ program, keystr);
+ dst_key_settime(key, DST_TIME_REVOKE, rev);
+ } else if (unsetrev) {
+ if ((dst_key_flags(key) & DNS_KEYFLAG_REVOKE) != 0)
+ fprintf(stderr, "%s: warning: Key %s is already "
+ "revoked; removing the revocation date "
+ "will not affect this.\n",
+ program, keystr);
+ dst_key_unsettime(key, DST_TIME_REVOKE);
+ }
+
+ if (setinact)
+ dst_key_settime(key, DST_TIME_INACTIVE, inact);
+ else if (unsetinact)
+ dst_key_unsettime(key, DST_TIME_INACTIVE);
+
+ if (setdel)
+ dst_key_settime(key, DST_TIME_DELETE, del);
+ else if (unsetdel)
+ dst_key_unsettime(key, DST_TIME_DELETE);
+
+ /*
+ * Print out time values, if -p was used.
+ */
+ if (printcreate)
+ printtime(key, DST_TIME_CREATED, "Created", epoch, stdout);
+
+ if (printpub)
+ printtime(key, DST_TIME_PUBLISH, "Publish", epoch, stdout);
+
+ if (printact)
+ printtime(key, DST_TIME_ACTIVATE, "Activate", epoch, stdout);
+
+ if (printrev)
+ printtime(key, DST_TIME_REVOKE, "Revoke", epoch, stdout);
+
+ if (printinact)
+ printtime(key, DST_TIME_INACTIVE, "Inactive", epoch, stdout);
+
+ if (printdel)
+ printtime(key, DST_TIME_DELETE, "Delete", epoch, stdout);
+
+ if (changed) {
+ isc_buffer_init(&buf, newname, sizeof(newname));
+ result = dst_key_buildfilename(key, DST_TYPE_PUBLIC, directory,
+ &buf);
+ if (result != ISC_R_SUCCESS) {
+ fatal("Failed to build public key filename: %s",
+ isc_result_totext(result));
+ }
+
+ result = dst_key_tofile(key, DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ directory);
+ if (result != ISC_R_SUCCESS) {
+ dst_key_format(key, keystr, sizeof(keystr));
+ fatal("Failed to write key %s: %s", keystr,
+ isc_result_totext(result));
+ }
+
+ printf("%s\n", newname);
+
+ isc_buffer_clear(&buf);
+ result = dst_key_buildfilename(key, DST_TYPE_PRIVATE, directory,
+ &buf);
+ if (result != ISC_R_SUCCESS) {
+ fatal("Failed to build private key filename: %s",
+ isc_result_totext(result));
+ }
+ printf("%s\n", newname);
+ }
+
+ dst_key_free(&key);
+ dst_lib_destroy();
+ isc_hash_destroy();
+ cleanup_entropy(&ectx);
+ if (verbose > 10)
+ isc_mem_stats(mctx, stdout);
+ isc_mem_free(mctx, directory);
+ isc_mem_destroy(&mctx);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.docbook b/contrib/bind9/bin/dnssec/dnssec-settime.docbook
new file mode 100644
index 0000000..1096cb7
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.docbook
@@ -0,0 +1,319 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: dnssec-settime.docbook,v 1.11 2010-08-16 22:21:06 marka Exp $ -->
+<refentry id="man.dnssec-settime">
+ <refentryinfo>
+ <date>July 15, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>dnssec-settime</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>dnssec-settime</application></refname>
+ <refpurpose>Set the key timing metadata for a DNSSEC key</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <year>2010</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>dnssec-settime</command>
+ <arg><option>-f</option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-P <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-A <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-R <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-I <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-D <replaceable class="parameter">date/offset</replaceable></option></arg>
+ <arg><option>-h</option></arg>
+ <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
+ <arg choice="req">keyfile</arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para><command>dnssec-settime</command>
+ reads a DNSSEC private key file and sets the key timing metadata
+ as specified by the <option>-P</option>, <option>-A</option>,
+ <option>-R</option>, <option>-I</option>, and <option>-D</option>
+ options. The metadata can then be used by
+ <command>dnssec-signzone</command> or other signing software to
+ determine when a key is to be published, whether it should be
+ used for signing a zone, etc.
+ </para>
+ <para>
+ If none of these options is set on the command line,
+ then <command>dnssec-settime</command> simply prints the key timing
+ metadata already stored in the key.
+ </para>
+ <para>
+ When key metadata fields are changed, both files of a key
+ pair (<filename>Knnnn.+aaa+iiiii.key</filename> and
+ <filename>Knnnn.+aaa+iiiii.private</filename>) are regenerated.
+ Metadata fields are stored in the private file. A human-readable
+ description of the metadata is also placed in comments in the key
+ file.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>-f</term>
+ <listitem>
+ <para>
+ Force an update of an old-format key with no metadata fields.
+ Without this option, <command>dnssec-settime</command> will
+ fail when attempting to update a legacy key. With this option,
+ the key will be recreated in the new format, but with the
+ original key data retained. The key's creation date will be
+ set to the present time.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Sets the directory in which the key files are to reside.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-h</term>
+ <listitem>
+ <para>
+ Emit usage message and exit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-v <replaceable class="parameter">level</replaceable></term>
+ <listitem>
+ <para>
+ Sets the debugging level.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
+ <listitem>
+ <para>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>TIMING OPTIONS</title>
+ <para>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds. To unset a date, use 'none'.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-P <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-A <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-R <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-I <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-D <replaceable class="parameter">date/offset</replaceable></term>
+ <listitem>
+ <para>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-S <replaceable class="parameter">predecessor key</replaceable></term>
+ <listitem>
+ <para>
+ Select a key for which the key being modified will be an
+ explicit successor. The name, algorithm, size, and type of the
+ predecessor key must exactly match those of the key being
+ modified. The activation date of the successor key will be set
+ to the inactivation date of the predecessor. The publication
+ date will be set to the activation date minus the prepublication
+ interval, which defaults to 30 days.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-i <replaceable class="parameter">interval</replaceable></term>
+ <listitem>
+ <para>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </para>
+ <para>
+ If the key is being set to be an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </para>
+ <para>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>PRINTING OPTIONS</title>
+ <para>
+ <command>dnssec-settime</command> can also be used to print the
+ timing metadata associated with a key.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>-u</term>
+ <listitem>
+ <para>
+ Print times in UNIX epoch format.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-p <replaceable class="parameter">C/P/A/R/I/D/all</replaceable></term>
+ <listitem>
+ <para>
+ Print a specific metadata value or set of metadata values.
+ The <option>-p</option> option may be followed by one or more
+ of the following letters to indicate which value or values to print:
+ <option>C</option> for the creation date,
+ <option>P</option> for the publication date,
+ <option>A</option> for the activation date,
+ <option>R</option> for the revocation date,
+ <option>I</option> for the inactivation date, or
+ <option>D</option> for the deletion date.
+ To print all of the metadata, use <option>-p all</option>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para><citerefentry>
+ <refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>dnssec-signzone</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 5011</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/dnssec/dnssec-settime.html b/contrib/bind9/bin/dnssec/dnssec-settime.html
new file mode 100644
index 0000000..84c8dde
--- /dev/null
+++ b/contrib/bind9/bin/dnssec/dnssec-settime.html
@@ -0,0 +1,208 @@
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: dnssec-settime.html,v 1.14 2010-08-17 01:15:26 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-settime</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.dnssec-settime"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-settime</span> &#8212; Set the key timing metadata for a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-settime</code> [<code class="option">-f</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-h</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543419"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-settime</strong></span>
+ reads a DNSSEC private key file and sets the key timing metadata
+ as specified by the <code class="option">-P</code>, <code class="option">-A</code>,
+ <code class="option">-R</code>, <code class="option">-I</code>, and <code class="option">-D</code>
+ options. The metadata can then be used by
+ <span><strong class="command">dnssec-signzone</strong></span> or other signing software to
+ determine when a key is to be published, whether it should be
+ used for signing a zone, etc.
+ </p>
+<p>
+ If none of these options is set on the command line,
+ then <span><strong class="command">dnssec-settime</strong></span> simply prints the key timing
+ metadata already stored in the key.
+ </p>
+<p>
+ When key metadata fields are changed, both files of a key
+ pair (<code class="filename">Knnnn.+aaa+iiiii.key</code> and
+ <code class="filename">Knnnn.+aaa+iiiii.private</code>) are regenerated.
+ Metadata fields are stored in the private file. A human-readable
+ description of the metadata is also placed in comments in the key
+ file.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543467"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force an update of an old-format key with no metadata fields.
+ Without this option, <span><strong class="command">dnssec-settime</strong></span> will
+ fail when attempting to update a legacy key. With this option,
+ the key will be recreated in the new format, but with the
+ original key data retained. The key's creation date will be
+ set to the present time.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543559"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds. To unset a date, use 'none'.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it.
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it.
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>predecessor key</code></em></span></dt>
+<dd><p>
+ Select a key for which the key being modified will be an
+ explicit successor. The name, algorithm, size, and type of the
+ predecessor key must exactly match those of the key being
+ modified. The activation date of the successor key will be set
+ to the inactivation date of the predecessor. The publication
+ date will be set to the activation date minus the prepublication
+ interval, which defaults to 30 days.
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being set to be an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543698"></a><h2>PRINTING OPTIONS</h2>
+<p>
+ <span><strong class="command">dnssec-settime</strong></span> can also be used to print the
+ timing metadata associated with a key.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Print times in UNIX epoch format.
+ </p></dd>
+<dt><span class="term">-p <em class="replaceable"><code>C/P/A/R/I/D/all</code></em></span></dt>
+<dd><p>
+ Print a specific metadata value or set of metadata values.
+ The <code class="option">-p</code> option may be followed by one or more
+ of the following letters to indicate which value or values to print:
+ <code class="option">C</code> for the creation date,
+ <code class="option">P</code> for the publication date,
+ <code class="option">A</code> for the activation date,
+ <code class="option">R</code> for the revocation date,
+ <code class="option">I</code> for the inactivation date, or
+ <code class="option">D</code> for the deletion date.
+ To print all of the metadata, use <code class="option">-p all</code>.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543912"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543945"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.8 b/contrib/bind9/bin/dnssec/dnssec-signzone.8
index bfe7a20..9822883 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.8
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.8
@@ -13,18 +13,18 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: dnssec-signzone.8,v 1.47.44.8 2009-11-07 01:56:11 tbox Exp $
+.\" $Id: dnssec-signzone.8,v 1.59 2009-12-04 01:13:44 tbox Exp $
.\"
.hy 0
.ad l
.\" Title: dnssec\-signzone
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
-.\" Date: June 08, 2009
+.\" Date: June 05, 2009
.\" Manual: BIND9
.\" Source: BIND9
.\"
-.TH "DNSSEC\-SIGNZONE" "8" "June 08, 2009" "BIND9" "BIND9"
+.TH "DNSSEC\-SIGNZONE" "8" "June 05, 2009" "BIND9" "BIND9"
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@@ -33,15 +33,13 @@
dnssec\-signzone \- DNSSEC zone signing tool
.SH "SYNOPSIS"
.HP 16
-\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-P\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...]
+\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-E\ \fR\fB\fIengine\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-K\ \fR\fB\fIdirectory\fR\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-P\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-S\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-T\ \fR\fB\fIttl\fR\fR] [\fB\-t\fR] [\fB\-u\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-x\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...]
.SH "DESCRIPTION"
.PP
\fBdnssec\-signzone\fR
-signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. It also generates a
-\fIkeyset\-\fR
-file containing the key\-signing keys for the zone, and if signing a zone which contains delegations, it can optionally generate DS records for the child zones from their
-\fIkeyset\-\fR
-files.
+signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a
+\fIkeyset\fR
+file for each child zone.
.SH "OPTIONS"
.PP
\-a
@@ -54,30 +52,53 @@ Verify all generated signatures.
Specifies the DNS class of the zone.
.RE
.PP
-\-k \fIkey\fR
-.RS 4
-Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times.
-.RE
-.PP
-\-l \fIdomain\fR
+\-C
.RS 4
-Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records.
+Compatibility mode: Generate a
+\fIkeyset\-\fR\fI\fIzonename\fR\fR
+file in addition to
+\fIdsset\-\fR\fI\fIzonename\fR\fR
+when signing a zone, for use by older versions of
+\fBdnssec\-signzone\fR.
.RE
.PP
\-d \fIdirectory\fR
.RS 4
Look for
-\fIkeyset\fR
+\fIdsset\-\fR
+or
+\fIkeyset\-\fR
files in
-\fBdirectory\fR
-as the directory
+\fBdirectory\fR.
+.RE
+.PP
+\-E \fIengine\fR
+.RS 4
+Uses a crypto hardware (OpenSSL engine) for the crypto operations it supports, for instance signing with private keys from a secure key store. When compiled with PKCS#11 support it defaults to pkcs11; the empty name resets it to no engine.
.RE
.PP
\-g
.RS 4
-If the zone contains any delegations, and there are
+Generate DS records for child zones from
+\fIdsset\-\fR
+or
\fIkeyset\-\fR
-files for any of the child zones, then DS records for the child zones will be generated from the keys in those files. Existing DS records will be removed.
+file. Existing DS records will be removed.
+.RE
+.PP
+\-K \fIdirectory\fR
+.RS 4
+Key repository: Specify a directory to search for DNSSEC keys. If not specified, defaults to the current directory.
+.RE
+.PP
+\-k \fIkey\fR
+.RS 4
+Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times.
+.RE
+.PP
+\-l \fIdomain\fR
+.RS 4
+Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records.
.RE
.PP
\-s \fIstart\-time\fR
@@ -93,6 +114,9 @@ Specify the date and time when the generated RRSIG records expire. As with
\fBstart\-time\fR, an absolute time is indicated in YYYYMMDDHHMMSS notation. A time relative to the start time is indicated with +N, which is N seconds from the start time. A time relative to the current time is indicated with now+N. If no
\fBend\-time\fR
is specified, 30 days from the start time is used as a default.
+\fBend\-time\fR
+must be later than
+\fBstart\-time\fR.
.RE
.PP
\-f \fIoutput\-file\fR
@@ -208,34 +232,94 @@ specifies the name of a character device or file containing random data to be us
indicates that keyboard input should be used.
.RE
.PP
+\-S
+.RS 4
+Smart signing: Instructs
+\fBdnssec\-signzone\fR
+to search the key repository for keys that match the zone being signed, and to include them in the zone if appropriate.
+.sp
+When a key is found, its timing metadata is examined to determine how it should be used, according to the following rules. Each successive rule takes priority over the prior ones:
+.RS 4
+.PP
+.RS 4
+If no timing metadata has been set for the key, the key is published in the zone and used to sign the zone.
+.RE
+.PP
+.RS 4
+If the key's publication date is set and is in the past, the key is published in the zone.
+.RE
+.PP
+.RS 4
+If the key's activation date is set and in the past, the key is published (regardless of publication date) and used to sign the zone.
+.RE
+.PP
+.RS 4
+If the key's revocation date is set and in the past, and the key is published, then the key is revoked, and the revoked key is used to sign the zone.
+.RE
+.PP
+.RS 4
+If either of the key's unpublication or deletion dates are set and in the past, the key is NOT published or used to sign the zone, regardless of any other metadata.
+.RE
+.RE
+.RE
+.PP
+\-T \fIttl\fR
+.RS 4
+Specifies the TTL to be used for new DNSKEY records imported into the zone from the key repository. If not specified, the default is the minimum TTL value from the zone's SOA record. This option is ignored when signing without
+\fB\-S\fR, since DNSKEY records are not imported from the key repository in that case. It is also ignored if there are any pre\-existing DNSKEY records at the zone apex, in which case new records' TTL values will be set to match them.
+.RE
+.PP
\-t
.RS 4
Print statistics at completion.
.RE
.PP
+\-u
+.RS 4
+Update NSEC/NSEC3 chain when re\-signing a previously signed zone. With this option, a zone signed with NSEC can be switched to NSEC3, or a zone signed with NSEC3 can be switch to NSEC or to NSEC3 with different parameters. Without this option,
+\fBdnssec\-signzone\fR
+will retain the existing chain when re\-signing.
+.RE
+.PP
\-v \fIlevel\fR
.RS 4
Sets the debugging level.
.RE
.PP
+\-x
+.RS 4
+Only sign the DNSKEY RRset with key\-signing keys, and omit signatures from zone\-signing keys. (This is similar to the
+\fBdnssec\-dnskey\-kskonly yes;\fR
+zone option in
+\fBnamed\fR.)
+.RE
+.PP
\-z
.RS 4
-Ignore KSK flag on key when determining what to sign.
+Ignore KSK flag on key when determining what to sign. This causes KSK\-flagged keys to sign all records, not just the DNSKEY RRset. (This is similar to the
+\fBupdate\-check\-ksk no;\fR
+zone option in
+\fBnamed\fR.)
.RE
.PP
\-3 \fIsalt\fR
.RS 4
-Generate a NSEC3 chain with the given hex encoded salt. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain.
+Generate an NSEC3 chain with the given hex encoded salt. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain.
.RE
.PP
\-H \fIiterations\fR
.RS 4
-When generating a NSEC3 chain use this many interations. The default is 100.
+When generating an NSEC3 chain, use this many interations. The default is 10.
.RE
.PP
\-A
.RS 4
-When generating a NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations.
+When generating an NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations.
+.sp
+Using this option twice (i.e.,
+\fB\-AA\fR) turns the OPTOUT flag off for all records. This is useful when using the
+\fB\-u\fR
+option to modify an NSEC3 chain which previously had OPTOUT set.
.RE
.PP
zonefile
@@ -253,9 +337,11 @@ The following command signs the
\fBexample.com\fR
zone with the DSA key generated by
\fBdnssec\-keygen\fR
-(Kexample.com.+003+17247). The zone's keys must be in the master file (\fIdb.example.com\fR). This invocation looks for
-\fIkeyset\fR
-files, in the current directory, so that DS records can be generated from them (\fB\-g\fR).
+(Kexample.com.+003+17247). Because the
+\fB\-S\fR
+option is not being used, the zone's keys must be in the master file (\fIdb.example.com\fR). This invocation looks for
+\fIdsset\fR
+files, in the current directory, so that DS records can be imported from them (\fB\-g\fR).
.sp
.RS 4
.nf
@@ -283,18 +369,6 @@ db.example.com.signed
%
.fi
.RE
-.SH "KNOWN BUGS"
-.PP
-\fBdnssec\-signzone\fR
-was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys needed to produce a fully\-signed zone. This permits a zone administrator, for example, to sign a zone with one key on one machine, move the resulting partially\-signed zone to a second machine, and sign it again with a second key.
-.PP
-An unfortunate side\-effect of this flexibility is that
-\fBdnssec\-signzone\fR
-does not check to make sure it's signing a zone with any valid keys at all. An attempt to sign a zone without any keys will appear to succeed, producing a "signed" zone with no signatures. There is no warning issued when a zone is not fully signed.
-.PP
-This will be corrected in a future release. In the meantime, ISC recommends examining the output of
-\fBdnssec\-signzone\fR
-to confirm that the zone is properly signed by all keys before using it.
.SH "SEE ALSO"
.PP
\fBdnssec\-keygen\fR(8),
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.c b/contrib/bind9/bin/dnssec/dnssec-signzone.c
index b8f4d66..3997a13 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.c
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.c
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec-signzone.c,v 1.209.12.20 2010-06-03 23:47:48 tbox Exp $ */
+/* $Id: dnssec-signzone.c,v 1.262 2010-06-03 23:51:04 tbox Exp $ */
/*! \file */
@@ -87,6 +87,10 @@
#include "dnssectool.h"
+#ifndef PATH_MAX
+#define PATH_MAX 1024 /* AIX, WIN32, and others don't define this. */
+#endif
+
const char *program = "dnssec-signzone";
int verbose;
@@ -97,22 +101,11 @@ static int nsec_datatype = dns_rdatatype_nsec;
#define IS_NSEC3 (nsec_datatype == dns_rdatatype_nsec3)
#define OPTOUT(x) (((x) & DNS_NSEC3FLAG_OPTOUT) != 0)
+#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
+
#define BUFSIZE 2048
#define MAXDSKEYS 8
-typedef struct signer_key_struct signer_key_t;
-
-struct signer_key_struct {
- dst_key_t *key;
- isc_boolean_t issigningkey;
- isc_boolean_t isdsk;
- isc_boolean_t isksk;
- isc_boolean_t wasused;
- isc_boolean_t commandline;
- unsigned int position;
- ISC_LINK(signer_key_t) link;
-};
-
#define SIGNER_EVENTCLASS ISC_EVENTCLASS(0x4453)
#define SIGNER_EVENT_WRITE (SIGNER_EVENTCLASS + 0)
#define SIGNER_EVENT_WORK (SIGNER_EVENTCLASS + 1)
@@ -128,7 +121,7 @@ struct signer_event {
dns_dbnode_t *node;
};
-static ISC_LIST(signer_key_t) keylist;
+static dns_dnsseckeylist_t keylist;
static unsigned int keycount = 0;
isc_rwlock_t keylist_lock;
static isc_stdtime_t starttime = 0, endtime = 0, now;
@@ -138,7 +131,8 @@ static isc_boolean_t tryverify = ISC_FALSE;
static isc_boolean_t printstats = ISC_FALSE;
static isc_mem_t *mctx = NULL;
static isc_entropy_t *ectx = NULL;
-static dns_ttl_t zonettl;
+static dns_ttl_t zone_soa_min_ttl;
+static dns_ttl_t soa_ttl;
static FILE *fp;
static char *tempfile = NULL;
static const dns_master_style_t *masterstyle;
@@ -146,7 +140,7 @@ static dns_masterformat_t inputformat = dns_masterformat_text;
static dns_masterformat_t outputformat = dns_masterformat_text;
static unsigned int nsigned = 0, nretained = 0, ndropped = 0;
static unsigned int nverified = 0, nverifyfailed = 0;
-static const char *directory;
+static const char *directory = NULL, *dsdir = NULL;
static isc_mutex_t namelock, statslock;
static isc_taskmgr_t *taskmgr = NULL;
static dns_db_t *gdb; /* The database */
@@ -155,13 +149,18 @@ static dns_dbiterator_t *gdbiter; /* The database iterator */
static dns_rdataclass_t gclass; /* The class */
static dns_name_t *gorigin; /* The database origin */
static int nsec3flags = 0;
+static dns_iterations_t nsec3iter = 10U;
+static unsigned char saltbuf[255];
+static unsigned char *salt = saltbuf;
+static size_t salt_length = 0;
static isc_task_t *master = NULL;
static unsigned int ntasks = 0;
static isc_boolean_t shuttingdown = ISC_FALSE, finished = ISC_FALSE;
static isc_boolean_t nokeys = ISC_FALSE;
static isc_boolean_t removefile = ISC_FALSE;
static isc_boolean_t generateds = ISC_FALSE;
-static isc_boolean_t ignoreksk = ISC_FALSE;
+static isc_boolean_t ignore_kskflag = ISC_FALSE;
+static isc_boolean_t keyset_kskonly = ISC_FALSE;
static dns_name_t *dlv = NULL;
static dns_fixedname_t dlv_fixed;
static dns_master_style_t *dsstyle = NULL;
@@ -169,6 +168,9 @@ static unsigned int serialformat = SOA_SERIAL_KEEP;
static unsigned int hash_length = 0;
static isc_boolean_t unknownalg = ISC_FALSE;
static isc_boolean_t disable_zone_check = ISC_FALSE;
+static isc_boolean_t update_chain = ISC_FALSE;
+static isc_boolean_t set_keyttl = ISC_FALSE;
+static dns_ttl_t keyttl;
#define INCSTAT(counter) \
if (printstats) { \
@@ -195,48 +197,23 @@ dumpnode(dns_name_t *name, dns_dbnode_t *node) {
check_result(result, "dns_master_dumpnodetostream");
}
-static signer_key_t *
-newkeystruct(dst_key_t *dstkey, isc_boolean_t signwithkey) {
- signer_key_t *key;
-
- key = isc_mem_get(mctx, sizeof(signer_key_t));
- if (key == NULL)
- fatal("out of memory");
- key->key = dstkey;
- if ((dst_key_flags(dstkey) & DNS_KEYFLAG_KSK) != 0) {
- key->issigningkey = signwithkey;
- key->isksk = ISC_TRUE;
- key->isdsk = ISC_FALSE;
- } else {
- key->issigningkey = signwithkey;
- key->isksk = ISC_FALSE;
- key->isdsk = ISC_TRUE;
- }
- key->wasused = ISC_FALSE;
- key->commandline = ISC_FALSE;
- key->position = keycount++;
- ISC_LINK_INIT(key, link);
- return (key);
-}
-
/*%
* Sign the given RRset with given key, and add the signature record to the
* given tuple.
*/
-
static void
signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key,
dns_ttl_t ttl, dns_diff_t *add, const char *logmsg)
{
isc_result_t result;
isc_stdtime_t jendtime;
- char keystr[KEY_FORMATSIZE];
+ char keystr[DST_KEY_FORMATSIZE];
dns_rdata_t trdata = DNS_RDATA_INIT;
unsigned char array[BUFSIZE];
isc_buffer_t b;
dns_difftuple_t *tuple;
- key_format(key, keystr, sizeof(keystr));
+ dst_key_format(key, keystr, sizeof(keystr));
vbprintf(1, "\t%s %s\n", logmsg, keystr);
jendtime = (jitter != 0) ? isc_random_jitter(endtime, jitter) : endtime;
@@ -245,8 +222,8 @@ signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key,
mctx, &b, &trdata);
isc_entropy_stopcallbacksources(ectx);
if (result != ISC_R_SUCCESS) {
- char keystr[KEY_FORMATSIZE];
- key_format(key, keystr, sizeof(keystr));
+ char keystr[DST_KEY_FORMATSIZE];
+ dst_key_format(key, keystr, sizeof(keystr));
fatal("dnskey '%s' failed to sign data: %s",
keystr, isc_result_totext(result));
}
@@ -272,31 +249,43 @@ signwithkey(dns_name_t *name, dns_rdataset_t *rdataset, dst_key_t *key,
}
static inline isc_boolean_t
-issigningkey(signer_key_t *key) {
- return (key->issigningkey);
+issigningkey(dns_dnsseckey_t *key) {
+ return (key->force_sign || key->hint_sign);
}
static inline isc_boolean_t
-iszonekey(signer_key_t *key) {
+iszonekey(dns_dnsseckey_t *key) {
return (ISC_TF(dns_name_equal(dst_key_name(key->key), gorigin) &&
dst_key_iszonekey(key->key)));
}
+static inline isc_boolean_t
+isksk(dns_dnsseckey_t *key) {
+ return (key->ksk);
+}
+
+static inline isc_boolean_t
+iszsk(dns_dnsseckey_t *key) {
+ return (ignore_kskflag || !key->ksk);
+}
+
/*%
- * Find the key if it is in our list. If it is, return it, otherwise null.
+ * Find the key that generated an RRSIG, if it is in the key list. If
+ * so, return a pointer to it, otherwise return NULL.
+ *
* No locking is performed here, this must be done by the caller.
*/
-static signer_key_t *
+static dns_dnsseckey_t *
keythatsigned_unlocked(dns_rdata_rrsig_t *rrsig) {
- signer_key_t *key;
+ dns_dnsseckey_t *key;
- key = ISC_LIST_HEAD(keylist);
- while (key != NULL) {
+ for (key = ISC_LIST_HEAD(keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
if (rrsig->keyid == dst_key_id(key->key) &&
rrsig->algorithm == dst_key_alg(key->key) &&
dns_name_equal(&rrsig->signer, dst_key_name(key->key)))
return (key);
- key = ISC_LIST_NEXT(key, link);
}
return (NULL);
}
@@ -305,11 +294,11 @@ keythatsigned_unlocked(dns_rdata_rrsig_t *rrsig) {
* Finds the key that generated a RRSIG, if possible. First look at the keys
* that we've loaded already, and then see if there's a key on disk.
*/
-static signer_key_t *
+static dns_dnsseckey_t *
keythatsigned(dns_rdata_rrsig_t *rrsig) {
isc_result_t result;
dst_key_t *pubkey = NULL, *privkey = NULL;
- signer_key_t *key;
+ dns_dnsseckey_t *key = NULL;
isc_rwlock_lock(&keylist_lock, isc_rwlocktype_read);
key = keythatsigned_unlocked(rrsig);
@@ -325,7 +314,6 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) {
* after all.
*/
isc_rwlock_lock(&keylist_lock, isc_rwlocktype_write);
-
key = keythatsigned_unlocked(rrsig);
if (key != NULL) {
isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write);
@@ -334,7 +322,7 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) {
result = dst_key_fromfile(&rrsig->signer, rrsig->keyid,
rrsig->algorithm, DST_TYPE_PUBLIC,
- NULL, mctx, &pubkey);
+ directory, mctx, &pubkey);
if (result != ISC_R_SUCCESS) {
isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write);
return (NULL);
@@ -343,12 +331,15 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) {
result = dst_key_fromfile(&rrsig->signer, rrsig->keyid,
rrsig->algorithm,
DST_TYPE_PUBLIC | DST_TYPE_PRIVATE,
- NULL, mctx, &privkey);
+ directory, mctx, &privkey);
if (result == ISC_R_SUCCESS) {
dst_key_free(&pubkey);
- key = newkeystruct(privkey, ISC_FALSE);
- } else
- key = newkeystruct(pubkey, ISC_FALSE);
+ dns_dnsseckey_create(mctx, &privkey, &key);
+ } else {
+ dns_dnsseckey_create(mctx, &pubkey, &key);
+ }
+ key->force_publish = ISC_TRUE;
+ key->force_sign = ISC_FALSE;
ISC_LIST_APPEND(keylist, key, link);
isc_rwlock_unlock(&keylist_lock, isc_rwlocktype_write);
@@ -383,15 +374,16 @@ expecttofindkey(dns_name_t *name) {
dns_name_format(name, namestr, sizeof(namestr));
fatal("failure looking for '%s DNSKEY' in database: %s",
namestr, isc_result_totext(result));
+ /* NOTREACHED */
return (ISC_FALSE); /* removes a warning */
}
static inline isc_boolean_t
-setverifies(dns_name_t *name, dns_rdataset_t *set, signer_key_t *key,
+setverifies(dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
dns_rdata_t *rrsig)
{
isc_result_t result;
- result = dns_dnssec_verify(name, set, key->key, ISC_FALSE, mctx, rrsig);
+ result = dns_dnssec_verify(name, set, key, ISC_FALSE, mctx, rrsig);
if (result == ISC_R_SUCCESS) {
INCSTAT(nverified);
return (ISC_TRUE);
@@ -413,7 +405,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
dns_rdataset_t sigset;
dns_rdata_t sigrdata = DNS_RDATA_INIT;
dns_rdata_rrsig_t rrsig;
- signer_key_t *key;
+ dns_dnsseckey_t *key;
isc_result_t result;
isc_boolean_t nosigs = ISC_FALSE;
isc_boolean_t *wassignedby, *nowsignedby;
@@ -483,8 +475,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
"invalid validity period\n",
sigstr);
} else if (key == NULL && !future &&
- expecttofindkey(&rrsig.signer))
- {
+ expecttofindkey(&rrsig.signer)) {
/* rrsig is dropped and not replaced */
vbprintf(2, "\trrsig by %s dropped - "
"private dnskey not found\n",
@@ -495,35 +486,33 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
if (!expired)
keep = ISC_TRUE;
} else if (issigningkey(key)) {
- if (!expired && setverifies(name, set, key, &sigrdata))
- {
+ if (!expired && setverifies(name, set, key->key,
+ &sigrdata)) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = ISC_TRUE;
- wassignedby[key->position] = ISC_TRUE;
- nowsignedby[key->position] = ISC_TRUE;
- key->wasused = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
} else {
vbprintf(2, "\trrsig by %s dropped - %s\n",
sigstr,
expired ? "expired" :
"failed to verify");
- wassignedby[key->position] = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
resign = ISC_TRUE;
}
} else if (iszonekey(key)) {
- if (!expired && setverifies(name, set, key, &sigrdata))
- {
+ if (!expired && setverifies(name, set, key->key,
+ &sigrdata)) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
keep = ISC_TRUE;
- wassignedby[key->position] = ISC_TRUE;
- nowsignedby[key->position] = ISC_TRUE;
- key->wasused = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
} else {
vbprintf(2, "\trrsig by %s dropped - %s\n",
sigstr,
expired ? "expired" :
"failed to verify");
- wassignedby[key->position] = ISC_TRUE;
+ wassignedby[key->index] = ISC_TRUE;
}
} else if (!expired) {
vbprintf(2, "\trrsig by %s retained\n", sigstr);
@@ -533,7 +522,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
}
if (keep) {
- nowsignedby[key->position] = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
INCSTAT(nretained);
if (sigset.ttl != ttl) {
vbprintf(2, "\tfixing ttl %s\n", sigstr);
@@ -568,8 +557,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
signwithkey(name, set, key->key, ttl, add,
"resigning with dnskey");
- nowsignedby[key->position] = ISC_TRUE;
- key->wasused = ISC_TRUE;
+ nowsignedby[key->index] = ISC_TRUE;
}
dns_rdata_reset(&sigrdata);
@@ -587,20 +575,37 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
key != NULL;
key = ISC_LIST_NEXT(key, link))
{
- if (nowsignedby[key->position])
+ if (nowsignedby[key->index])
continue;
- if (!key->issigningkey)
- continue;
- if (!(ignoreksk || key->isdsk ||
- (key->isksk &&
- set->type == dns_rdatatype_dnskey &&
- dns_name_equal(name, gorigin))))
+ if (!issigningkey(key))
continue;
- signwithkey(name, set, key->key, ttl, add,
- "signing with dnskey");
- key->wasused = ISC_TRUE;
+ if (set->type == dns_rdatatype_dnskey &&
+ dns_name_equal(name, gorigin)) {
+ isc_boolean_t have_ksk;
+ dns_dnsseckey_t *tmpkey;
+
+ have_ksk = isksk(key);
+ for (tmpkey = ISC_LIST_HEAD(keylist);
+ tmpkey != NULL;
+ tmpkey = ISC_LIST_NEXT(tmpkey, link)) {
+ if (dst_key_alg(key->key) !=
+ dst_key_alg(tmpkey->key))
+ continue;
+ if (REVOKE(tmpkey->key))
+ continue;
+ if (isksk(tmpkey))
+ have_ksk = ISC_TRUE;
+ }
+ if (isksk(key) || !have_ksk ||
+ (iszsk(key) && !keyset_kskonly))
+ signwithkey(name, set, key->key, ttl, add,
+ "signing with dnskey");
+ } else if (iszsk(key)) {
+ signwithkey(name, set, key->key, ttl, add,
+ "signing with dnskey");
+ }
}
isc_mem_put(mctx, wassignedby, arraysize * sizeof(isc_boolean_t));
@@ -774,16 +779,21 @@ static void
opendb(const char *prefix, dns_name_t *name, dns_rdataclass_t rdclass,
dns_db_t **dbp)
{
- char filename[256];
+ char filename[PATH_MAX];
isc_buffer_t b;
isc_result_t result;
isc_buffer_init(&b, filename, sizeof(filename));
- if (directory != NULL) {
- isc_buffer_putstr(&b, directory);
- if (directory[strlen(directory) - 1] != '/')
+ if (dsdir != NULL) {
+ /* allow room for a trailing slash */
+ if (strlen(dsdir) >= isc_buffer_availablelength(&b))
+ fatal("path '%s' is too long", dsdir);
+ isc_buffer_putstr(&b, dsdir);
+ if (dsdir[strlen(dsdir) - 1] != '/')
isc_buffer_putstr(&b, "/");
}
+ if (strlen(prefix) > isc_buffer_availablelength(&b))
+ fatal("path '%s' is too long", dsdir);
isc_buffer_putstr(&b, prefix);
result = dns_name_tofilenametext(name, ISC_FALSE, &b);
check_result(result, "dns_name_tofilenametext()");
@@ -798,13 +808,15 @@ opendb(const char *prefix, dns_name_t *name, dns_rdataclass_t rdclass,
rdclass, 0, NULL, dbp);
check_result(result, "dns_db_create()");
- result = dns_db_load(*dbp, filename);
+ result = dns_db_load3(*dbp, filename, inputformat, DNS_MASTER_HINT);
if (result != ISC_R_SUCCESS && result != DNS_R_SEENINCLUDE)
dns_db_detach(dbp);
}
/*%
- * Loads the key set for a child zone, if there is one, and builds DS records.
+ * Load the DS set for a child zone, if a dsset-* file can be found.
+ * If not, try to find a keyset-* file from an earlier version of
+ * dnssec-signzone, and build DS records from that.
*/
static isc_result_t
loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) {
@@ -818,29 +830,49 @@ loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) {
dns_diff_t diff;
dns_difftuple_t *tuple = NULL;
+ opendb("dsset-", name, gclass, &db);
+ if (db != NULL) {
+ result = dns_db_findnode(db, name, ISC_FALSE, &node);
+ if (result == ISC_R_SUCCESS) {
+ dns_rdataset_init(dsset);
+ result = dns_db_findrdataset(db, node, NULL,
+ dns_rdatatype_ds, 0, 0,
+ dsset, NULL);
+ dns_db_detachnode(db, &node);
+ if (result == ISC_R_SUCCESS) {
+ vbprintf(2, "found DS records\n");
+ dsset->ttl = ttl;
+ dns_db_detach(&db);
+ return (result);
+ }
+ }
+ dns_db_detach(&db);
+ }
+
+ /* No DS records found; try again, looking for DNSKEY records */
opendb("keyset-", name, gclass, &db);
- if (db == NULL)
+ if (db == NULL) {
return (ISC_R_NOTFOUND);
+ }
result = dns_db_findnode(db, name, ISC_FALSE, &node);
if (result != ISC_R_SUCCESS) {
dns_db_detach(&db);
- return (DNS_R_BADDB);
+ return (result);
}
+
dns_rdataset_init(&keyset);
- result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0,
- 0, &keyset, NULL);
+ result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_dnskey, 0, 0,
+ &keyset, NULL);
if (result != ISC_R_SUCCESS) {
dns_db_detachnode(db, &node);
dns_db_detach(&db);
return (result);
}
-
vbprintf(2, "found DNSKEY records\n");
result = dns_db_newversion(db, &ver);
check_result(result, "dns_db_newversion");
-
dns_diff_init(mctx, &diff);
for (result = dns_rdataset_first(&keyset);
@@ -869,6 +901,7 @@ loadds(dns_name_t *name, isc_uint32_t ttl, dns_rdataset_t *dsset) {
check_result(result, "dns_difftuple_create");
dns_diff_append(&diff, &tuple);
}
+
result = dns_diff_apply(&diff, db, ver);
check_result(result, "dns_diff_apply");
dns_diff_clear(&diff);
@@ -1112,17 +1145,15 @@ active_node(dns_dbnode_t *node) {
}
/*%
- * Extracts the TTL from the SOA.
+ * Extracts the minimum TTL from the SOA record, and the SOA record's TTL.
*/
-static dns_ttl_t
-soattl(void) {
+static void
+get_soa_ttls(void) {
dns_rdataset_t soaset;
dns_fixedname_t fname;
dns_name_t *name;
isc_result_t result;
- dns_ttl_t ttl;
dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdata_soa_t soa;
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
@@ -1136,11 +1167,9 @@ soattl(void) {
result = dns_rdataset_first(&soaset);
check_result(result, "dns_rdataset_first");
dns_rdataset_current(&soaset, &rdata);
- result = dns_rdata_tostruct(&rdata, &soa, NULL);
- check_result(result, "dns_rdata_tostruct");
- ttl = soa.minimum;
+ zone_soa_min_ttl = dns_soa_getminimum(&rdata);
+ soa_ttl = soaset.ttl;
dns_rdataset_disassociate(&soaset);
- return (ttl);
}
/*%
@@ -1371,7 +1400,7 @@ verifyset(dns_rdataset_t *rdataset, dns_name_t *name, dns_dbnode_t *node,
for (i = 0; i < 256; i++)
if ((ksk_algorithms[i] != 0) &&
(set_algorithms[i] == 0)) {
- alg_format(i, algbuf, sizeof(algbuf));
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
fprintf(stderr, "Missing %s signature for "
"%s %s\n", algbuf, namebuf, typebuf);
bad_algorithms[i] = 1;
@@ -1414,8 +1443,8 @@ verifynode(dns_name_t *name, dns_dbnode_t *node, isc_boolean_t delegation,
/*%
* Verify that certain things are sane:
*
- * The apex has a DNSKEY record with at least one KSK and at least
- * one ZSK.
+ * The apex has a DNSKEY record with at least one KSK, and at least
+ * one ZSK if the -x flag was not used.
*
* The DNSKEY record was signed with at least one of the KSKs in this
* set.
@@ -1440,8 +1469,10 @@ verifyzone(void) {
isc_boolean_t goodksk = ISC_FALSE;
isc_boolean_t goodzsk = ISC_FALSE;
isc_result_t result;
- unsigned char revoked[256];
- unsigned char standby[256];
+ unsigned char revoked_ksk[256];
+ unsigned char revoked_zsk[256];
+ unsigned char standby_ksk[256];
+ unsigned char standby_zsk[256];
unsigned char ksk_algorithms[256];
unsigned char zsk_algorithms[256];
unsigned char bad_algorithms[256];
@@ -1470,8 +1501,10 @@ verifyzone(void) {
if (!dns_rdataset_isassociated(&sigrdataset))
fatal("cannot find DNSKEY RRSIGs\n");
- memset(revoked, 0, sizeof(revoked));
- memset(standby, 0, sizeof(revoked));
+ memset(revoked_ksk, 0, sizeof(revoked_ksk));
+ memset(revoked_zsk, 0, sizeof(revoked_zsk));
+ memset(standby_ksk, 0, sizeof(standby_ksk));
+ memset(standby_zsk, 0, sizeof(standby_zsk));
memset(ksk_algorithms, 0, sizeof(ksk_algorithms));
memset(zsk_algorithms, 0, sizeof(zsk_algorithms));
memset(bad_algorithms, 0, sizeof(bad_algorithms));
@@ -1480,8 +1513,9 @@ verifyzone(void) {
#endif
/*
- * Check that the DNSKEY RR has at least one self signing KSK and
- * one ZSK per algorithm in it.
+ * Check that the DNSKEY RR has at least one self signing KSK
+ * and one ZSK per algorithm in it (or, if -x was used, one
+ * self-signing KSK).
*/
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
@@ -1511,8 +1545,11 @@ verifyzone(void) {
(int)isc_buffer_usedlength(&buf), buffer);
}
if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0 &&
- revoked[dnskey.algorithm] != 255)
- revoked[dnskey.algorithm]++;
+ revoked_ksk[dnskey.algorithm] != 255)
+ revoked_ksk[dnskey.algorithm]++;
+ else if ((dnskey.flags & DNS_KEYFLAG_KSK) == 0 &&
+ revoked_zsk[dnskey.algorithm] != 255)
+ revoked_zsk[dnskey.algorithm]++;
} else if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0) {
if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset,
&sigrdataset, ISC_FALSE, mctx)) {
@@ -1520,8 +1557,8 @@ verifyzone(void) {
ksk_algorithms[dnskey.algorithm]++;
goodksk = ISC_TRUE;
} else {
- if (standby[dnskey.algorithm] != 255)
- standby[dnskey.algorithm]++;
+ if (standby_ksk[dnskey.algorithm] != 255)
+ standby_ksk[dnskey.algorithm]++;
}
} else if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset,
&sigrdataset, ISC_FALSE,
@@ -1534,8 +1571,8 @@ verifyzone(void) {
zsk_algorithms[dnskey.algorithm]++;
goodzsk = ISC_TRUE;
} else {
- if (zsk_algorithms[dnskey.algorithm] != 255)
- zsk_algorithms[dnskey.algorithm]++;
+ if (standby_zsk[dnskey.algorithm] != 255)
+ standby_zsk[dnskey.algorithm]++;
#ifdef ALLOW_KSKLESS_ZONES
allzsksigned = ISC_FALSE;
#endif
@@ -1545,42 +1582,54 @@ verifyzone(void) {
}
dns_rdataset_disassociate(&sigrdataset);
- if (!goodksk) {
#ifdef ALLOW_KSKLESS_ZONES
- if (!goodzsk)
- fatal("no self signing keys found");
- fprintf(stderr, "No self signing KSK found. Using self signed "
- "ZSK's for active algorithm list.\n");
+ if (!goodksk) {
+ if (!ignore_kskflag)
+ fprintf(stderr, "No self signing KSK found. Using "
+ "self signed ZSK's for active "
+ "algorithm list.\n");
memcpy(ksk_algorithms, self_algorithms, sizeof(ksk_algorithms));
if (!allzsksigned)
fprintf(stderr, "warning: not all ZSK's are self "
"signed.\n");
+ }
#else
+ if (!goodksk) {
fatal("no self signed KSK's found");
-#endif
}
+#endif
fprintf(stderr, "Verifying the zone using the following algorithms:");
for (i = 0; i < 256; i++) {
- if (ksk_algorithms[i] != 0) {
- alg_format(i, algbuf, sizeof(algbuf));
+#ifdef ALLOW_KSKLESS_ZONES
+ if (ksk_algorithms[i] != 0 || zsk_algorithms[i] != 0)
+#else
+ if (ksk_algorithms[i] != 0)
+#endif
+ {
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
fprintf(stderr, " %s", algbuf);
}
}
fprintf(stderr, ".\n");
- for (i = 0; i < 256; i++) {
- /*
- * The counts should both be zero or both be non-zero.
- * Mark the algorithm as bad if this is not met.
- */
- if ((ksk_algorithms[i] != 0) == (zsk_algorithms[i] != 0))
- continue;
- alg_format(i, algbuf, sizeof(algbuf));
- fprintf(stderr, "Missing %s for algorithm %s\n",
- (ksk_algorithms[i] != 0) ? "ZSK" : "self signing KSK",
- algbuf);
- bad_algorithms[i] = 1;
+ if (!ignore_kskflag && !keyset_kskonly) {
+ for (i = 0; i < 256; i++) {
+ /*
+ * The counts should both be zero or both be non-zero.
+ * Mark the algorithm as bad if this is not met.
+ */
+ if ((ksk_algorithms[i] != 0) ==
+ (zsk_algorithms[i] != 0))
+ continue;
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
+ fprintf(stderr, "Missing %s for algorithm %s\n",
+ (ksk_algorithms[i] != 0)
+ ? "ZSK"
+ : "self signing KSK",
+ algbuf);
+ bad_algorithms[i] = 1;
+ }
}
/*
@@ -1674,7 +1723,7 @@ verifyzone(void) {
if (first)
fprintf(stderr, "The zone is not fully signed "
"for the following algorithms:");
- alg_format(i, algbuf, sizeof(algbuf));
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
fprintf(stderr, " %s", algbuf);
first = ISC_FALSE;
}
@@ -1684,21 +1733,30 @@ verifyzone(void) {
fatal("DNSSEC completeness test failed.");
}
- if (goodksk) {
+ if (goodksk || ignore_kskflag) {
/*
* Print the success summary.
*/
fprintf(stderr, "Zone signing complete:\n");
for (i = 0; i < 256; i++) {
- if ((zsk_algorithms[i] != 0) ||
- (ksk_algorithms[i] != 0) ||
- (revoked[i] != 0) || (standby[i] != 0)) {
- alg_format(i, algbuf, sizeof(algbuf));
- fprintf(stderr, "Algorithm: %s: ZSKs: %u, "
- "KSKs: %u active, %u revoked, %u "
- "stand-by\n", algbuf,
- zsk_algorithms[i], ksk_algorithms[i],
- revoked[i], standby[i]);
+ if ((ksk_algorithms[i] != 0) ||
+ (standby_ksk[i] != 0) ||
+ (revoked_zsk[i] != 0) ||
+ (zsk_algorithms[i] != 0) ||
+ (standby_zsk[i] != 0) ||
+ (revoked_zsk[i] != 0)) {
+ dns_secalg_format(i, algbuf, sizeof(algbuf));
+ fprintf(stderr, "Algorithm: %s: KSKs: "
+ "%u active, %u stand-by, %u revoked\n",
+ algbuf, ksk_algorithms[i],
+ standby_ksk[i], revoked_ksk[i]);
+ fprintf(stderr, "%*sZSKs: "
+ "%u active, %u %s, %u revoked\n",
+ (int) strlen(algbuf) + 13, "",
+ zsk_algorithms[i],
+ standby_zsk[i],
+ keyset_kskonly ? "present" : "stand-by",
+ revoked_zsk[i]);
}
}
}
@@ -1923,6 +1981,7 @@ add_ds(dns_name_t *name, dns_dbnode_t *node, isc_uint32_t nsttl) {
dns_rdatatype_ds, 0);
check_result(result, "dns_db_deleterdataset");
}
+
result = loadds(name, nsttl, &dsset);
if (result == ISC_R_SUCCESS) {
result = dns_db_addrdataset(gdb, node, gversion, 0,
@@ -1953,7 +2012,7 @@ remove_records(dns_dbnode_t *node, dns_rdatatype_t which) {
dns_rdataset_init(&rdataset);
/*
- * Delete any NSEC records at the apex.
+ * Delete any records of the given type at the apex.
*/
result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter);
check_result(result, "dns_db_allrdatasets()");
@@ -1965,6 +2024,12 @@ remove_records(dns_dbnode_t *node, dns_rdatatype_t which) {
covers = rdataset.covers;
dns_rdataset_disassociate(&rdataset);
if (type == which || covers == which) {
+ if (which == dns_rdatatype_nsec && !update_chain)
+ fatal("Zone contains NSEC records. Use -u "
+ "to update to NSEC3.");
+ if (which == dns_rdatatype_nsec3param && !update_chain)
+ fatal("Zone contains NSEC3 chains. Use -u "
+ "to update to NSEC.");
result = dns_db_deleterdataset(gdb, node, gversion,
type, covers);
check_result(result, "dns_db_deleterdataset()");
@@ -2088,8 +2153,9 @@ nsecify(void) {
} else if (result != ISC_R_SUCCESS)
fatal("iterating through the database failed: %s",
isc_result_totext(result));
+ dns_dbiterator_pause(dbiter);
result = dns_nsec_build(gdb, gversion, node, nextname,
- zonettl);
+ zone_soa_min_ttl);
check_result(result, "dns_nsec_build()");
dns_db_detachnode(gdb, &node);
}
@@ -2320,6 +2386,97 @@ nsec3clean(dns_name_t *name, dns_dbnode_t *node,
check_result(result, "dns_db_deleterdataset(RRSIG(NSEC3))");
}
+static void
+rrset_remove_duplicates(dns_name_t *name, dns_rdataset_t *rdataset,
+ dns_diff_t *diff)
+{
+ dns_difftuple_t *tuple = NULL;
+ isc_result_t result;
+ unsigned int count1 = 0;
+ dns_rdataset_t tmprdataset;
+
+ dns_rdataset_init(&tmprdataset);
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ unsigned int count2 = 0;
+
+ count1++;
+ dns_rdataset_current(rdataset, &rdata1);
+ dns_rdataset_clone(rdataset, &tmprdataset);
+ for (result = dns_rdataset_first(&tmprdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&tmprdataset)) {
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ count2++;
+ if (count1 >= count2)
+ continue;
+ dns_rdataset_current(&tmprdataset, &rdata2);
+ if (dns_rdata_casecompare(&rdata1, &rdata2) == 0) {
+ result = dns_difftuple_create(mctx,
+ DNS_DIFFOP_DEL,
+ name,
+ rdataset->ttl,
+ &rdata2, &tuple);
+ check_result(result, "dns_difftuple_create");
+ dns_diff_append(diff, &tuple);
+ }
+ }
+ dns_rdataset_disassociate(&tmprdataset);
+ }
+}
+
+static void
+remove_duplicates(void) {
+ isc_result_t result;
+ dns_dbiterator_t *dbiter = NULL;
+ dns_rdatasetiter_t *rdsiter = NULL;
+ dns_diff_t diff;
+ dns_dbnode_t *node = NULL;
+ dns_rdataset_t rdataset;
+ dns_fixedname_t fname;
+ dns_name_t *name;
+
+ dns_diff_init(mctx, &diff);
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rdataset_init(&rdataset);
+
+ result = dns_db_createiterator(gdb, 0, &dbiter);
+ check_result(result, "dns_db_createiterator()");
+
+ for (result = dns_dbiterator_first(dbiter);
+ result == ISC_R_SUCCESS;
+ result = dns_dbiterator_next(dbiter)) {
+
+ result = dns_dbiterator_current(dbiter, &node, name);
+ check_dns_dbiterator_current(result);
+ result = dns_db_allrdatasets(gdb, node, gversion, 0, &rdsiter);
+ check_result(result, "dns_db_allrdatasets()");
+ for (result = dns_rdatasetiter_first(rdsiter);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsiter)) {
+ dns_rdatasetiter_current(rdsiter, &rdataset);
+ rrset_remove_duplicates(name, &rdataset, &diff);
+ dns_rdataset_disassociate(&rdataset);
+ }
+ if (result != ISC_R_NOMORE)
+ fatal("rdatasets iteration failed.");
+ dns_rdatasetiter_destroy(&rdsiter);
+ dns_db_detachnode(gdb, &node);
+ }
+ if (result != ISC_R_NOMORE)
+ fatal("zone iteration failed.");
+
+ if (!ISC_LIST_EMPTY(diff.tuples)) {
+ result = dns_diff_applysilently(&diff, gdb, gversion);
+ check_result(result, "dns_diff_applysilently");
+ }
+ dns_diff_clear(&diff);
+ dns_dbiterator_destroy(&dbiter);
+}
+
/*
* Generate NSEC3 records for the zone.
*/
@@ -2546,7 +2703,7 @@ nsec3ify(unsigned int hashalg, unsigned int iterations,
*/
dns_dbiterator_pause(dbiter);
addnsec3(name, node, salt, salt_length, iterations,
- hashlist, zonettl);
+ hashlist, zone_soa_min_ttl);
dns_db_detachnode(gdb, &node);
/*
* Add NSEC3's for empty nodes. Use closest encloser logic.
@@ -2557,7 +2714,7 @@ nsec3ify(unsigned int hashalg, unsigned int iterations,
count--;
dns_name_split(nextname, count, NULL, nextname);
addnsec3(nextname, NULL, salt, salt_length,
- iterations, hashlist, zonettl);
+ iterations, hashlist, zone_soa_min_ttl);
}
}
dns_dbiterator_destroy(&dbiter);
@@ -2580,7 +2737,7 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
fatal("failed converting name '%s' to dns format: %s",
origin, isc_result_totext(result));
@@ -2600,90 +2757,169 @@ loadzone(char *file, char *origin, dns_rdataclass_t rdclass, dns_db_t **db) {
* private keys from disk.
*/
static void
-loadzonekeys(dns_db_t *db) {
+loadzonekeys(isc_boolean_t preserve_keys, isc_boolean_t load_public) {
dns_dbnode_t *node;
- dns_dbversion_t *currentversion;
+ dns_dbversion_t *currentversion = NULL;
isc_result_t result;
- dst_key_t *keys[20];
- unsigned int nkeys, i;
-
- currentversion = NULL;
- dns_db_currentversion(db, &currentversion);
+ dns_rdataset_t rdataset, keysigs, soasigs;
node = NULL;
- result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);
+ result = dns_db_findnode(gdb, gorigin, ISC_FALSE, &node);
if (result != ISC_R_SUCCESS)
fatal("failed to find the zone's origin: %s",
isc_result_totext(result));
- result = dns_dnssec_findzonekeys(db, currentversion, node, gorigin,
- mctx, 20, keys, &nkeys);
- if (result == ISC_R_NOTFOUND)
- result = ISC_R_SUCCESS;
+ dns_db_currentversion(gdb, &currentversion);
+
+ dns_rdataset_init(&rdataset);
+ dns_rdataset_init(&soasigs);
+ dns_rdataset_init(&keysigs);
+
+ /* Make note of the keys which signed the SOA, if any */
+ result = dns_db_findrdataset(gdb, node, currentversion,
+ dns_rdatatype_soa, 0, 0,
+ &rdataset, &soasigs);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Preserve the TTL of the DNSKEY RRset, if any */
+ dns_rdataset_disassociate(&rdataset);
+ result = dns_db_findrdataset(gdb, node, currentversion,
+ dns_rdatatype_dnskey, 0, 0,
+ &rdataset, &keysigs);
+
if (result != ISC_R_SUCCESS)
- fatal("failed to find the zone keys: %s",
+ goto cleanup;
+
+ if (set_keyttl && keyttl != rdataset.ttl) {
+ fprintf(stderr, "User-specified TTL (%d) conflicts "
+ "with existing DNSKEY RRset TTL.\n",
+ keyttl);
+ fprintf(stderr, "Imported keys will use the RRSet "
+ "TTL (%d) instead.\n",
+ rdataset.ttl);
+ }
+ keyttl = rdataset.ttl;
+
+ /* Load keys corresponding to the existing DNSKEY RRset */
+ result = dns_dnssec_keylistfromrdataset(gorigin, directory, mctx,
+ &rdataset, &keysigs, &soasigs,
+ preserve_keys, load_public,
+ &keylist);
+ if (result != ISC_R_SUCCESS)
+ fatal("failed to load the zone keys: %s",
isc_result_totext(result));
- for (i = 0; i < nkeys; i++) {
- signer_key_t *key;
+ cleanup:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (dns_rdataset_isassociated(&keysigs))
+ dns_rdataset_disassociate(&keysigs);
+ if (dns_rdataset_isassociated(&soasigs))
+ dns_rdataset_disassociate(&soasigs);
+ dns_db_detachnode(gdb, &node);
+ dns_db_closeversion(gdb, &currentversion, ISC_FALSE);
+}
+
+static void
+loadexplicitkeys(char *keyfiles[], int n, isc_boolean_t setksk) {
+ isc_result_t result;
+ int i;
+
+ for (i = 0; i < n; i++) {
+ dns_dnsseckey_t *key = NULL;
+ dst_key_t *newkey = NULL;
+
+ result = dst_key_fromnamedfile(keyfiles[i], directory,
+ DST_TYPE_PUBLIC |
+ DST_TYPE_PRIVATE,
+ mctx, &newkey);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot load dnskey %s: %s", keyfiles[i],
+ isc_result_totext(result));
+
+ if (!dns_name_equal(gorigin, dst_key_name(newkey)))
+ fatal("key %s not at origin\n", keyfiles[i]);
+
+ if (!dst_key_isprivate(newkey))
+ fatal("cannot sign zone with non-private dnskey %s",
+ keyfiles[i]);
+
+ /* Skip any duplicates */
+ for (key = ISC_LIST_HEAD(keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (dst_key_id(key->key) == dst_key_id(newkey) &&
+ dst_key_alg(key->key) == dst_key_alg(newkey))
+ break;
+ }
+
+ if (key == NULL) {
+ /* We haven't seen this key before */
+ dns_dnsseckey_create(mctx, &newkey, &key);
+ ISC_LIST_APPEND(keylist, key, link);
+ key->source = dns_keysource_user;
+ } else {
+ dst_key_free(&key->key);
+ key->key = newkey;
+ }
+
+ key->force_publish = ISC_TRUE;
+ key->force_sign = ISC_TRUE;
- key = newkeystruct(keys[i], dst_key_isprivate(keys[i]));
- ISC_LIST_APPEND(keylist, key, link);
+ if (setksk)
+ key->ksk = ISC_TRUE;
}
- dns_db_detachnode(db, &node);
- dns_db_closeversion(db, &currentversion, ISC_FALSE);
}
-/*%
- * Finds all public zone keys in the zone.
- */
static void
-loadzonepubkeys(dns_db_t *db) {
- dns_dbversion_t *currentversion = NULL;
- dns_dbnode_t *node = NULL;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dst_key_t *pubkey;
- signer_key_t *key;
+report(const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ putc('\n', stderr);
+}
+
+static void
+build_final_keylist() {
isc_result_t result;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ dns_dnsseckeylist_t matchkeys;
+ char name[DNS_NAME_FORMATSIZE];
- dns_db_currentversion(db, &currentversion);
+ /*
+ * Find keys that match this zone in the key repository.
+ */
+ ISC_LIST_INIT(matchkeys);
+ result = dns_dnssec_findmatchingkeys(gorigin, directory,
+ mctx, &matchkeys);
+ if (result == ISC_R_NOTFOUND)
+ result = ISC_R_SUCCESS;
+ check_result(result, "dns_dnssec_findmatchingkeys");
- result = dns_db_findnode(db, gorigin, ISC_FALSE, &node);
- if (result != ISC_R_SUCCESS)
- fatal("failed to find the zone's origin: %s",
- isc_result_totext(result));
+ result = dns_db_newversion(gdb, &ver);
+ check_result(result, "dns_db_newversion");
- dns_rdataset_init(&rdataset);
- result = dns_db_findrdataset(db, node, currentversion,
- dns_rdatatype_dnskey, 0, 0, &rdataset,
- NULL);
+ dns_diff_init(mctx, &diff);
+
+ /*
+ * Update keylist with information from from the key repository.
+ */
+ dns_dnssec_updatekeys(&keylist, &matchkeys, NULL, gorigin, keyttl,
+ &diff, ignore_kskflag, mctx, report);
+
+ dns_name_format(gorigin, name, sizeof(name));
+
+ result = dns_diff_applysilently(&diff, gdb, ver);
if (result != ISC_R_SUCCESS)
- fatal("failed to find keys at the zone apex: %s",
- isc_result_totext(result));
- result = dns_rdataset_first(&rdataset);
- check_result(result, "dns_rdataset_first");
- while (result == ISC_R_SUCCESS) {
- pubkey = NULL;
- dns_rdata_reset(&rdata);
- dns_rdataset_current(&rdataset, &rdata);
- result = dns_dnssec_keyfromrdata(gorigin, &rdata, mctx,
- &pubkey);
- if (result != ISC_R_SUCCESS)
- goto next;
- if (!dst_key_iszonekey(pubkey)) {
- dst_key_free(&pubkey);
- goto next;
- }
+ fatal("failed to update DNSKEY RRset at node '%s': %s",
+ name, isc_result_totext(result));
- key = newkeystruct(pubkey, ISC_FALSE);
- ISC_LIST_APPEND(keylist, key, link);
- next:
- result = dns_rdataset_next(&rdataset);
- }
- dns_rdataset_disassociate(&rdataset);
- dns_db_detachnode(db, &node);
- dns_db_closeversion(db, &currentversion, ISC_FALSE);
+ dns_db_closeversion(gdb, &ver, ISC_TRUE);
+
+ dns_diff_clear(&diff);
}
static void
@@ -2727,18 +2963,112 @@ warnifallksk(dns_db_t *db) {
dns_rdataset_disassociate(&rdataset);
dns_db_detachnode(db, &node);
dns_db_closeversion(db, &currentversion, ISC_FALSE);
- if (!have_non_ksk && !ignoreksk) {
+ if (!have_non_ksk && !ignore_kskflag) {
if (disable_zone_check)
- fprintf(stderr, "%s: warning: No non-KSK dnskey found. "
- "Supply non-KSK dnskey or use '-z'.\n",
+ fprintf(stderr, "%s: warning: No non-KSK DNSKEY found; "
+ "supply a ZSK or use '-z'.\n",
program);
else
- fatal("No non-KSK dnskey found. "
- "Supply non-KSK dnskey or use '-z'.");
+ fatal("No non-KSK DNSKEY found; "
+ "supply a ZSK or use '-z'.");
}
}
static void
+set_nsec3params(isc_boolean_t update_chain, isc_boolean_t set_salt,
+ isc_boolean_t set_optout, isc_boolean_t set_iter)
+{
+ isc_result_t result;
+ dns_dbversion_t *ver = NULL;
+ dns_dbnode_t *node = NULL;
+ dns_rdataset_t rdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_nsec3_t nsec3;
+ dns_fixedname_t fname;
+ dns_name_t *hashname;
+ unsigned char orig_salt[256];
+ size_t orig_saltlen;
+ dns_hash_t orig_hash;
+ isc_uint16_t orig_iter;
+
+ dns_db_currentversion(gdb, &ver);
+ dns_rdataset_init(&rdataset);
+
+ orig_saltlen = sizeof(orig_salt);
+ result = dns_db_getnsec3parameters(gdb, ver, &orig_hash, NULL,
+ &orig_iter, orig_salt,
+ &orig_saltlen);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ nsec_datatype = dns_rdatatype_nsec3;
+
+ if (!update_chain && set_salt) {
+ if (salt_length != orig_saltlen ||
+ memcmp(saltbuf, orig_salt, salt_length) != 0)
+ fatal("An NSEC3 chain exists with a different salt. "
+ "Use -u to update it.");
+ } else if (!set_salt) {
+ salt_length = orig_saltlen;
+ memcpy(saltbuf, orig_salt, orig_saltlen);
+ salt = saltbuf;
+ }
+
+ if (!update_chain && set_iter) {
+ if (nsec3iter != orig_iter)
+ fatal("An NSEC3 chain exists with different "
+ "iterations. Use -u to update it.");
+ } else if (!set_iter)
+ nsec3iter = orig_iter;
+
+ /*
+ * Find an NSEC3 record to get the current OPTOUT value.
+ * (This assumes all NSEC3 records agree.)
+ */
+
+ dns_fixedname_init(&fname);
+ hashname = dns_fixedname_name(&fname);
+ result = dns_nsec3_hashname(&fname, NULL, NULL,
+ gorigin, gorigin, dns_hash_sha1,
+ orig_iter, orig_salt, orig_saltlen);
+ check_result(result, "dns_nsec3_hashname");
+
+ result = dns_db_findnsec3node(gdb, hashname, ISC_FALSE, &node);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_db_findrdataset(gdb, node, ver, dns_rdatatype_nsec3,
+ 0, 0, &rdataset, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_rdataset_first(&rdataset);
+ check_result(result, "dns_rdataset_first");
+ dns_rdataset_current(&rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &nsec3, NULL);
+ check_result(result, "dns_rdata_tostruct");
+
+ if (!update_chain && set_optout) {
+ if (nsec3flags != nsec3.flags)
+ fatal("An NSEC3 chain exists with%s OPTOUT. "
+ "Use -u -%s to %s it.",
+ OPTOUT(nsec3.flags) ? "" : "out",
+ OPTOUT(nsec3.flags) ? "AA" : "A",
+ OPTOUT(nsec3.flags) ? "clear" : "set");
+ } else if (!set_optout)
+ nsec3flags = nsec3.flags;
+
+ dns_rdata_freestruct(&nsec3);
+
+ cleanup:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (node != NULL)
+ dns_db_detachnode(gdb, &node);
+ dns_db_closeversion(gdb, &ver, ISC_FALSE);
+}
+
+static void
writeset(const char *prefix, dns_rdatatype_t type) {
char *filename;
char namestr[DNS_NAME_FORMATSIZE];
@@ -2755,7 +3085,7 @@ writeset(const char *prefix, dns_rdatatype_t type) {
isc_buffer_t namebuf;
isc_region_t r;
isc_result_t result;
- signer_key_t *key;
+ dns_dnsseckey_t *key, *tmpkey;
unsigned char dsbuf[DNS_DS_BUFFERSIZE];
unsigned char keybuf[DST_KEY_MAXSIZE];
unsigned int filenamelen;
@@ -2767,13 +3097,13 @@ writeset(const char *prefix, dns_rdatatype_t type) {
check_result(result, "dns_name_tofilenametext");
isc_buffer_putuint8(&namebuf, 0);
filenamelen = strlen(prefix) + strlen(namestr);
- if (directory != NULL)
- filenamelen += strlen(directory) + 1;
+ if (dsdir != NULL)
+ filenamelen += strlen(dsdir) + 1;
filename = isc_mem_get(mctx, filenamelen + 1);
if (filename == NULL)
fatal("out of memory");
- if (directory != NULL)
- sprintf(filename, "%s/", directory);
+ if (dsdir != NULL)
+ sprintf(filename, "%s/", dsdir);
else
filename[0] = 0;
strcat(filename, prefix);
@@ -2781,22 +3111,6 @@ writeset(const char *prefix, dns_rdatatype_t type) {
dns_diff_init(mctx, &diff);
- for (key = ISC_LIST_HEAD(keylist);
- key != NULL;
- key = ISC_LIST_NEXT(key, link))
- if (!key->isksk) {
- have_non_ksk = ISC_TRUE;
- break;
- }
-
- for (key = ISC_LIST_HEAD(keylist);
- key != NULL;
- key = ISC_LIST_NEXT(key, link))
- if (key->isksk) {
- have_ksk = ISC_TRUE;
- break;
- }
-
if (type == dns_rdatatype_dlv) {
dns_name_t tname;
unsigned int labels;
@@ -2815,7 +3129,28 @@ writeset(const char *prefix, dns_rdatatype_t type) {
key != NULL;
key = ISC_LIST_NEXT(key, link))
{
- if (have_ksk && have_non_ksk && !key->isksk)
+ if (REVOKE(key->key))
+ continue;
+ if (isksk(key)) {
+ have_ksk = ISC_TRUE;
+ have_non_ksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_non_ksk = ISC_TRUE;
+ }
+ for (tmpkey = ISC_LIST_HEAD(keylist);
+ tmpkey != NULL;
+ tmpkey = ISC_LIST_NEXT(tmpkey, link)) {
+ if (dst_key_alg(key->key) != dst_key_alg(tmpkey->key))
+ continue;
+ if (REVOKE(tmpkey->key))
+ continue;
+ if (isksk(tmpkey))
+ have_ksk = ISC_TRUE;
+ else
+ have_non_ksk = ISC_TRUE;
+ }
+ if (have_ksk && have_non_ksk && !isksk(key))
continue;
dns_rdata_init(&rdata);
dns_rdata_init(&ds);
@@ -2848,7 +3183,7 @@ writeset(const char *prefix, dns_rdatatype_t type) {
} else
result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,
- gorigin, zonettl,
+ gorigin, zone_soa_min_ttl,
&rdata, &tuple);
check_result(result, "dns_difftuple_create");
dns_diff_append(&diff, &tuple);
@@ -2893,6 +3228,9 @@ print_version(FILE *fp) {
fprintf(fp, "; dnssec_signzone version " VERSION "\n");
}
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(void) {
fprintf(stderr, "Usage:\n");
@@ -2903,14 +3241,18 @@ usage(void) {
fprintf(stderr, "Version: %s\n", VERSION);
fprintf(stderr, "Options: (default value in parenthesis) \n");
- fprintf(stderr, "\t-c class (IN)\n");
- fprintf(stderr, "\t-d directory\n");
- fprintf(stderr, "\t\tdirectory to find keyset files (.)\n");
+ fprintf(stderr, "\t-S:\tsmart signing: automatically finds key files\n"
+ "\t\tfor the zone and determines how they are to "
+ "be used\n");
+ fprintf(stderr, "\t-K directory:\n");
+ fprintf(stderr, "\t\tdirectory to find key files (.)\n");
+ fprintf(stderr, "\t-d directory:\n");
+ fprintf(stderr, "\t\tdirectory to find dsset-* files (.)\n");
fprintf(stderr, "\t-g:\t");
- fprintf(stderr, "generate DS records from keyset files\n");
+ fprintf(stderr, "update DS records based on child zones' "
+ "dsset-* files\n");
fprintf(stderr, "\t-s [YYYYMMDDHHMMSS|+offset]:\n");
- fprintf(stderr, "\t\tRRSIG start time - absolute|offset "
- "(now - 1 hour)\n");
+ fprintf(stderr, "\t\tRRSIG start time - absolute|offset (now - 1 hour)\n");
fprintf(stderr, "\t-e [YYYYMMDDHHMMSS|+offset|\"now\"+offset]:\n");
fprintf(stderr, "\t\tRRSIG end time - absolute|from start|from now "
"(now + 30 days)\n");
@@ -2918,8 +3260,7 @@ usage(void) {
fprintf(stderr, "\t\tcycle interval - resign "
"if < interval from end ( (end-start)/4 )\n");
fprintf(stderr, "\t-j jitter:\n");
- fprintf(stderr, "\t\trandomize signature end time up to jitter "
- "seconds\n");
+ fprintf(stderr, "\t\trandomize signature end time up to jitter seconds\n");
fprintf(stderr, "\t-v debuglevel (0)\n");
fprintf(stderr, "\t-o origin:\n");
fprintf(stderr, "\t\tzone origin (name of zonefile)\n");
@@ -2936,20 +3277,33 @@ usage(void) {
fprintf(stderr, "\t\ta file containing random data\n");
fprintf(stderr, "\t-a:\t");
fprintf(stderr, "verify generated signatures\n");
+ fprintf(stderr, "\t-c class (IN)\n");
+ fprintf(stderr, "\t-E engine:\n");
+#ifdef USE_PKCS11
+ fprintf(stderr, "\t\tname of an OpenSSL engine to use "
+ "(default is \"pkcs11\")\n");
+#else
+ fprintf(stderr, "\t\tname of an OpenSSL engine to use\n");
+#endif
fprintf(stderr, "\t-p:\t");
fprintf(stderr, "use pseudorandom data (faster but less secure)\n");
fprintf(stderr, "\t-P:\t");
fprintf(stderr, "disable post-sign verification\n");
+ fprintf(stderr, "\t-T TTL:\tTTL for newly added DNSKEYs\n");
fprintf(stderr, "\t-t:\t");
fprintf(stderr, "print statistics\n");
+ fprintf(stderr, "\t-u:\t");
+ fprintf(stderr, "update or replace an existing NSEC/NSEC3 chain\n");
+ fprintf(stderr, "\t-x:\tsign DNSKEY record with KSKs only, not ZSKs\n");
+ fprintf(stderr, "\t-z:\tsign all records with KSKs\n");
+ fprintf(stderr, "\t-C:\tgenerate a keyset file, for compatibility\n"
+ "\t\twith older versions of dnssec-signzone -g\n");
fprintf(stderr, "\t-n ncpus (number of cpus present)\n");
fprintf(stderr, "\t-k key_signing_key\n");
fprintf(stderr, "\t-l lookasidezone\n");
- fprintf(stderr, "\t-3 salt (NSEC3 salt)\n");
- fprintf(stderr, "\t-H iterations (NSEC3 iterations)\n");
- fprintf(stderr, "\t-A (NSEC3 optout)\n");
- fprintf(stderr, "\t-z:\t");
- fprintf(stderr, "ignore KSK flag in DNSKEYs");
+ fprintf(stderr, "\t-3 NSEC3 salt\n");
+ fprintf(stderr, "\t-H NSEC3 iterations (10)\n");
+ fprintf(stderr, "\t-A NSEC3 optout\n");
fprintf(stderr, "\n");
@@ -3001,10 +3355,15 @@ main(int argc, char *argv[]) {
int ndskeys = 0;
char *endp;
isc_time_t timer_start, timer_finish;
- signer_key_t *key;
+ dns_dnsseckey_t *key;
isc_result_t result;
isc_log_t *log = NULL;
isc_boolean_t pseudorandom = ISC_FALSE;
+#ifdef USE_PKCS11
+ const char *engine = "pkcs11";
+#else
+ const char *engine = NULL;
+#endif
unsigned int eflags;
isc_boolean_t free_output = ISC_FALSE;
int tempfilelen;
@@ -3012,13 +3371,15 @@ main(int argc, char *argv[]) {
isc_task_t **tasks = NULL;
isc_buffer_t b;
int len;
- unsigned int iterations = 100U;
- const unsigned char *salt = NULL;
- size_t salt_length = 0;
- unsigned char saltbuf[255];
hashlist_t hashlist;
+ isc_boolean_t smartsign = ISC_FALSE;
+ isc_boolean_t make_keyset = ISC_FALSE;
+ isc_boolean_t set_salt = ISC_FALSE;
+ isc_boolean_t set_optout = ISC_FALSE;
+ isc_boolean_t set_iter = ISC_FALSE;
-#define CMDLINE_FLAGS "3:aAc:d:e:f:FghH:i:I:j:k:l:m:n:N:o:O:pPr:s:StUv:z"
+#define CMDLINE_FLAGS \
+ "3:AaCc:Dd:E:e:f:FghH:i:I:j:K:k:l:m:n:N:o:O:pPr:s:ST:tuUv:xz"
/*
* Process memory debugging argument first.
@@ -3058,7 +3419,9 @@ main(int argc, char *argv[]) {
while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
switch (ch) {
case '3':
- if (strcmp(isc_commandline_argument, "-")) {
+ set_salt = ISC_TRUE;
+ nsec_datatype = dns_rdatatype_nsec3;
+ if (strcmp(isc_commandline_argument, "-") != 0) {
isc_buffer_t target;
char *sarg;
@@ -3068,29 +3431,42 @@ main(int argc, char *argv[]) {
result = isc_hex_decodestring(sarg, &target);
check_result(result,
"isc_hex_decodestring(salt)");
- salt = saltbuf;
salt_length = isc_buffer_usedlength(&target);
- } else {
- salt = saltbuf;
- salt_length = 0;
}
- nsec_datatype = dns_rdatatype_nsec3;
break;
case 'A':
- nsec3flags |= DNS_NSEC3FLAG_OPTOUT;
+ set_optout = ISC_TRUE;
+ if (OPTOUT(nsec3flags))
+ nsec3flags &= ~DNS_NSEC3FLAG_OPTOUT;
+ else
+ nsec3flags |= DNS_NSEC3FLAG_OPTOUT;
break;
case 'a':
tryverify = ISC_TRUE;
break;
+ case 'C':
+ make_keyset = ISC_TRUE;
+ break;
+
case 'c':
classname = isc_commandline_argument;
break;
case 'd':
- directory = isc_commandline_argument;
+ dsdir = isc_commandline_argument;
+ if (strlen(dsdir) == 0U)
+ fatal("DS directory must be non-empty string");
+ result = try_dir(dsdir);
+ if (result != ISC_R_SUCCESS)
+ fatal("cannot open directory %s: %s",
+ dsdir, isc_result_totext(result));
+ break;
+
+ case 'E':
+ engine = isc_commandline_argument;
break;
case 'e':
@@ -3106,11 +3482,11 @@ main(int argc, char *argv[]) {
break;
case 'H':
- iterations = strtoul(isc_commandline_argument,
- &endp, 0);
+ set_iter = ISC_TRUE;
+ nsec3iter = strtoul(isc_commandline_argument, &endp, 0);
if (*endp != '\0')
fatal("iterations must be numeric");
- if (iterations > 0xffffU)
+ if (nsec3iter > 0xffffU)
fatal("iterations too big");
break;
@@ -3118,6 +3494,10 @@ main(int argc, char *argv[]) {
usage();
break;
+ case 'I':
+ inputformatstr = isc_commandline_argument;
+ break;
+
case 'i':
endp = NULL;
cycle = strtol(isc_commandline_argument, &endp, 0);
@@ -3126,10 +3506,6 @@ main(int argc, char *argv[]) {
"positive");
break;
- case 'I':
- inputformatstr = isc_commandline_argument;
- break;
-
case 'j':
endp = NULL;
jitter = strtol(isc_commandline_argument, &endp, 0);
@@ -3137,6 +3513,10 @@ main(int argc, char *argv[]) {
fatal("jitter must be numeric and positive");
break;
+ case 'K':
+ directory = isc_commandline_argument;
+ break;
+
case 'k':
if (ndskeys == MAXDSKEYS)
fatal("too many key-signing keys specified");
@@ -3150,14 +3530,18 @@ main(int argc, char *argv[]) {
dns_fixedname_init(&dlv_fixed);
dlv = dns_fixedname_name(&dlv_fixed);
- result = dns_name_fromtext(dlv, &b, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(dlv, &b, dns_rootname, 0,
+ NULL);
check_result(result, "dns_name_fromtext(dlv)");
break;
case 'm':
break;
+ case 'N':
+ serialformatstr = isc_commandline_argument;
+ break;
+
case 'n':
endp = NULL;
ntasks = strtol(isc_commandline_argument, &endp, 0);
@@ -3165,38 +3549,38 @@ main(int argc, char *argv[]) {
fatal("number of cpus must be numeric");
break;
- case 'N':
- serialformatstr = isc_commandline_argument;
+ case 'O':
+ outputformatstr = isc_commandline_argument;
break;
case 'o':
origin = isc_commandline_argument;
break;
- case 'O':
- outputformatstr = isc_commandline_argument;
+ case 'P':
+ disable_zone_check = ISC_TRUE;
break;
case 'p':
pseudorandom = ISC_TRUE;
break;
- case 'P':
- disable_zone_check = ISC_TRUE;
- break;
-
case 'r':
setup_entropy(mctx, isc_commandline_argument, &ectx);
break;
+ case 'S':
+ smartsign = ISC_TRUE;
+ break;
+
case 's':
startstr = isc_commandline_argument;
break;
- case 'S':
- /* This is intentionally undocumented */
- /* -S: simple output style */
- masterstyle = &dns_master_style_simple;
+ case 'T':
+ endp = NULL;
+ set_keyttl = ISC_TRUE;
+ keyttl = strtottl(isc_commandline_argument);
break;
case 't':
@@ -3207,6 +3591,10 @@ main(int argc, char *argv[]) {
unknownalg = ISC_TRUE;
break;
+ case 'u':
+ update_chain = ISC_TRUE;
+ break;
+
case 'v':
endp = NULL;
verbose = strtol(isc_commandline_argument, &endp, 0);
@@ -3214,8 +3602,12 @@ main(int argc, char *argv[]) {
fatal("verbose level must be numeric");
break;
+ case 'x':
+ keyset_kskonly = ISC_TRUE;
+ break;
+
case 'z':
- ignoreksk = ISC_TRUE;
+ ignore_kskflag = ISC_TRUE;
break;
case 'F':
@@ -3245,20 +3637,21 @@ main(int argc, char *argv[]) {
if (result != ISC_R_SUCCESS)
fatal("could not create hash context");
- result = dst_lib_init(mctx, ectx, eflags);
+ result = dst_lib_init2(mctx, ectx, engine, eflags);
if (result != ISC_R_SUCCESS)
- fatal("could not initialize dst");
+ fatal("could not initialize dst: %s",
+ isc_result_totext(result));
isc_stdtime_get(&now);
- if (startstr != NULL)
+ if (startstr != NULL) {
starttime = strtotime(startstr, now, now);
- else
+ } else
starttime = now - 3600; /* Allow for some clock skew. */
- if (endstr != NULL)
+ if (endstr != NULL) {
endtime = strtotime(endstr, now, starttime);
- else
+ } else
endtime = starttime + (30 * 24 * 60 * 60);
if (cycle == -1)
@@ -3270,6 +3663,9 @@ main(int argc, char *argv[]) {
rdclass = strtoclass(classname);
+ if (directory == NULL)
+ directory = ".";
+
setup_logging(verbose, mctx, &log);
argc -= isc_commandline_index;
@@ -3335,7 +3731,19 @@ main(int argc, char *argv[]) {
loadzone(file, origin, rdclass, &gdb);
gorigin = dns_db_origin(gdb);
gclass = dns_db_class(gdb);
- zonettl = soattl();
+ get_soa_ttls();
+
+ if (!set_keyttl)
+ keyttl = soa_ttl;
+
+ /*
+ * Check for any existing NSEC3 parameters in the zone,
+ * and use them as defaults if -u was not specified.
+ */
+ if (update_chain && !set_optout && !set_iter && !set_salt)
+ nsec_datatype = dns_rdatatype_nsec;
+ else
+ set_nsec3params(update_chain, set_salt, set_optout, set_iter);
if (IS_NSEC3) {
isc_boolean_t answer;
@@ -3356,95 +3764,42 @@ main(int argc, char *argv[]) {
ISC_LIST_INIT(keylist);
isc_rwlock_init(&keylist_lock, 0, 0);
- if (argc == 0) {
- loadzonekeys(gdb);
- } else {
- for (i = 0; i < argc; i++) {
- dst_key_t *newkey = NULL;
-
- result = dst_key_fromnamedfile(argv[i],
- DST_TYPE_PUBLIC |
- DST_TYPE_PRIVATE,
- mctx, &newkey);
- if (result != ISC_R_SUCCESS)
- fatal("cannot load dnskey %s: %s", argv[i],
- isc_result_totext(result));
-
- if (!dns_name_equal(gorigin, dst_key_name(newkey)))
- fatal("key %s not at origin\n", argv[i]);
-
- key = ISC_LIST_HEAD(keylist);
- while (key != NULL) {
- dst_key_t *dkey = key->key;
- if (dst_key_id(dkey) == dst_key_id(newkey) &&
- dst_key_alg(dkey) == dst_key_alg(newkey) &&
- dns_name_equal(dst_key_name(dkey),
- dst_key_name(newkey)))
- {
- if (!dst_key_isprivate(dkey))
- fatal("cannot sign zone with "
- "non-private dnskey %s",
- argv[i]);
- break;
- }
- key = ISC_LIST_NEXT(key, link);
- }
- if (key == NULL) {
- key = newkeystruct(newkey, ISC_TRUE);
- key->commandline = ISC_TRUE;
- ISC_LIST_APPEND(keylist, key, link);
- } else
- dst_key_free(&newkey);
- }
-
- loadzonepubkeys(gdb);
- }
-
- for (i = 0; i < ndskeys; i++) {
- dst_key_t *newkey = NULL;
-
- result = dst_key_fromnamedfile(dskeyfile[i],
- DST_TYPE_PUBLIC |
- DST_TYPE_PRIVATE,
- mctx, &newkey);
- if (result != ISC_R_SUCCESS)
- fatal("cannot load dnskey %s: %s", dskeyfile[i],
- isc_result_totext(result));
+ /*
+ * Fill keylist with:
+ * 1) Keys listed in the DNSKEY set that have
+ * private keys associated, *if* no keys were
+ * set on the command line.
+ * 2) ZSKs set on the command line
+ * 3) KSKs set on the command line
+ * 4) Any keys remaining in the DNSKEY set which
+ * do not have private keys associated and were
+ * not specified on the command line.
+ */
+ if (argc == 0 || smartsign)
+ loadzonekeys(!smartsign, ISC_FALSE);
+ loadexplicitkeys(argv, argc, ISC_FALSE);
+ loadexplicitkeys(dskeyfile, ndskeys, ISC_TRUE);
+ loadzonekeys(!smartsign, ISC_TRUE);
- if (!dns_name_equal(gorigin, dst_key_name(newkey)))
- fatal("key %s not at origin\n", dskeyfile[i]);
+ /*
+ * If we're doing smart signing, look in the key repository for
+ * key files with metadata, and merge them with the keylist
+ * we have now.
+ */
+ if (smartsign)
+ build_final_keylist();
- key = ISC_LIST_HEAD(keylist);
- while (key != NULL) {
- dst_key_t *dkey = key->key;
- if (dst_key_id(dkey) == dst_key_id(newkey) &&
- dst_key_alg(dkey) == dst_key_alg(newkey) &&
- dns_name_equal(dst_key_name(dkey),
- dst_key_name(newkey)))
- {
- /* Override key flags. */
- key->issigningkey = ISC_TRUE;
- key->isksk = ISC_TRUE;
- key->isdsk = ISC_FALSE;
- dst_key_free(&dkey);
- key->key = newkey;
- break;
- }
- key = ISC_LIST_NEXT(key, link);
- }
- if (key == NULL) {
- /* Override dnskey flags. */
- key = newkeystruct(newkey, ISC_TRUE);
- key->isksk = ISC_TRUE;
- key->isdsk = ISC_FALSE;
- ISC_LIST_APPEND(keylist, key, link);
- }
+ /* Now enumerate the key list */
+ for (key = ISC_LIST_HEAD(keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ key->index = keycount++;
}
- if (ISC_LIST_EMPTY(keylist)) {
+ if (keycount == 0) {
if (disable_zone_check)
fprintf(stderr, "%s: warning: No keys specified "
- "or found\n", program);
+ "or found\n", program);
else
fatal("No signing keys specified or found.");
nokeys = ISC_TRUE;
@@ -3454,7 +3809,7 @@ main(int argc, char *argv[]) {
unsigned int max;
result = dns_nsec3_maxiterations(gdb, NULL, mctx, &max);
check_result(result, "dns_nsec3_maxiterations()");
- if (iterations > max)
+ if (nsec3iter > max)
fatal("NSEC3 iterations too big for weakest DNSKEY "
"strength. Maximum iterations allowed %u.", max);
}
@@ -3478,15 +3833,18 @@ main(int argc, char *argv[]) {
break;
}
+ remove_duplicates();
+
if (IS_NSEC3)
- nsec3ify(dns_hash_sha1, iterations, salt, salt_length,
+ nsec3ify(dns_hash_sha1, nsec3iter, salt, salt_length,
&hashlist);
else
nsecify();
if (!nokeys) {
- writeset("keyset-", dns_rdatatype_dnskey);
writeset("dsset-", dns_rdatatype_ds);
+ if (make_keyset)
+ writeset("keyset-", dns_rdatatype_dnskey);
if (dlv != NULL) {
writeset("dlvset-", dns_rdatatype_dlv);
}
@@ -3591,8 +3949,7 @@ main(int argc, char *argv[]) {
while (!ISC_LIST_EMPTY(keylist)) {
key = ISC_LIST_HEAD(keylist);
ISC_LIST_UNLINK(keylist, key, link);
- dst_key_free(&key->key);
- isc_mem_put(mctx, key, sizeof(signer_key_t));
+ dns_dnsseckey_destroy(mctx, &key);
}
isc_mem_put(mctx, tempfile, tempfilelen);
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.docbook b/contrib/bind9/bin/dnssec/dnssec-signzone.docbook
index 87a801e..51a1496 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.docbook
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.docbook
@@ -18,10 +18,10 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-signzone.docbook,v 1.31.44.8 2009-11-06 21:36:22 each Exp $ -->
+<!-- $Id: dnssec-signzone.docbook,v 1.44 2009-12-03 23:18:16 each Exp $ -->
<refentry id="man.dnssec-signzone">
<refentryinfo>
- <date>June 08, 2009</date>
+ <date>June 05, 2009</date>
</refentryinfo>
<refmeta>
@@ -60,10 +60,12 @@
<arg><option>-a</option></arg>
<arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
<arg><option>-d <replaceable class="parameter">directory</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine</replaceable></option></arg>
<arg><option>-e <replaceable class="parameter">end-time</replaceable></option></arg>
<arg><option>-f <replaceable class="parameter">output-file</replaceable></option></arg>
<arg><option>-g</option></arg>
<arg><option>-h</option></arg>
+ <arg><option>-K <replaceable class="parameter">directory</replaceable></option></arg>
<arg><option>-k <replaceable class="parameter">key</replaceable></option></arg>
<arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
<arg><option>-i <replaceable class="parameter">interval</replaceable></option></arg>
@@ -75,9 +77,13 @@
<arg><option>-p</option></arg>
<arg><option>-P</option></arg>
<arg><option>-r <replaceable class="parameter">randomdev</replaceable></option></arg>
+ <arg><option>-S</option></arg>
<arg><option>-s <replaceable class="parameter">start-time</replaceable></option></arg>
+ <arg><option>-T <replaceable class="parameter">ttl</replaceable></option></arg>
<arg><option>-t</option></arg>
+ <arg><option>-u</option></arg>
<arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
+ <arg><option>-x</option></arg>
<arg><option>-z</option></arg>
<arg><option>-3 <replaceable class="parameter">salt</replaceable></option></arg>
<arg><option>-H <replaceable class="parameter">iterations</replaceable></option></arg>
@@ -92,10 +98,10 @@
<para><command>dnssec-signzone</command>
signs a zone. It generates
NSEC and RRSIG records and produces a signed version of the
- zone. It also generates a <filename>keyset-</filename> file containing
- the key-signing keys for the zone, and if signing a zone which
- contains delegations, it can optionally generate DS records for
- the child zones from their <filename>keyset-</filename> files.
+ zone. The security status of delegations from the signed zone
+ (that is, whether the child zones are secure or not) is
+ determined by the presence or absence of a
+ <filename>keyset</filename> file for each child zone.
</para>
</refsect1>
@@ -122,31 +128,37 @@
</varlistentry>
<varlistentry>
- <term>-k <replaceable class="parameter">key</replaceable></term>
+ <term>-C</term>
<listitem>
<para>
- Treat specified key as a key signing key ignoring any
- key flags. This option may be specified multiple times.
+ Compatibility mode: Generate a
+ <filename>keyset-<replaceable>zonename</replaceable></filename>
+ file in addition to
+ <filename>dsset-<replaceable>zonename</replaceable></filename>
+ when signing a zone, for use by older versions of
+ <command>dnssec-signzone</command>.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-l <replaceable class="parameter">domain</replaceable></term>
+ <term>-d <replaceable class="parameter">directory</replaceable></term>
<listitem>
<para>
- Generate a DLV set in addition to the key (DNSKEY) and DS sets.
- The domain is appended to the name of the records.
+ Look for <filename>dsset-</filename> or
+ <filename>keyset-</filename> files in <option>directory</option>.
</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>-d <replaceable class="parameter">directory</replaceable></term>
+ <term>-E <replaceable class="parameter">engine</replaceable></term>
<listitem>
<para>
- Look for <filename>keyset</filename> files in
- <option>directory</option> as the directory
+ Uses a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
</para>
</listitem>
</varlistentry>
@@ -155,10 +167,39 @@
<term>-g</term>
<listitem>
<para>
- If the zone contains any delegations, and there are
- <filename>keyset-</filename> files for any of the child zones,
- then DS records for the child zones will be generated from the
- keys in those files. Existing DS records will be removed.
+ Generate DS records for child zones from
+ <filename>dsset-</filename> or <filename>keyset-</filename>
+ file. Existing DS records will be removed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-K <replaceable class="parameter">directory</replaceable></term>
+ <listitem>
+ <para>
+ Key repository: Specify a directory to search for DNSSEC keys.
+ If not specified, defaults to the current directory.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-k <replaceable class="parameter">key</replaceable></term>
+ <listitem>
+ <para>
+ Treat specified key as a key signing key ignoring any
+ key flags. This option may be specified multiple times.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-l <replaceable class="parameter">domain</replaceable></term>
+ <listitem>
+ <para>
+ Generate a DLV set in addition to the key (DNSKEY) and DS sets.
+ The domain is appended to the name of the records.
</para>
</listitem>
</varlistentry>
@@ -190,6 +231,8 @@
the start time. A time relative to the current time is
indicated with now+N. If no <option>end-time</option> is
specified, 30 days from the start time is used as a default.
+ <option>end-time</option> must be later than
+ <option>start-time</option>.
</para>
</listitem>
</varlistentry>
@@ -396,6 +439,89 @@
</varlistentry>
<varlistentry>
+ <term>-S</term>
+ <listitem>
+ <para>
+ Smart signing: Instructs <command>dnssec-signzone</command> to
+ search the key repository for keys that match the zone being
+ signed, and to include them in the zone if appropriate.
+ </para>
+ <para>
+ When a key is found, its timing metadata is examined to
+ determine how it should be used, according to the following
+ rules. Each successive rule takes priority over the prior
+ ones:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <listitem>
+ <para>
+ If no timing metadata has been set for the key, the key is
+ published in the zone and used to sign the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If the key's publication date is set and is in the past, the
+ key is published in the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If the key's activation date is set and in the past, the
+ key is published (regardless of publication date) and
+ used to sign the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If the key's revocation date is set and in the past, and the
+ key is published, then the key is revoked, and the revoked key
+ is used to sign the zone.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <listitem>
+ <para>
+ If either of the key's unpublication or deletion dates are set
+ and in the past, the key is NOT published or used to sign the
+ zone, regardless of any other metadata.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-T <replaceable class="parameter">ttl</replaceable></term>
+ <listitem>
+ <para>
+ Specifies the TTL to be used for new DNSKEY records imported
+ into the zone from the key repository. If not specified,
+ the default is the minimum TTL value from the zone's SOA
+ record. This option is ignored when signing without
+ <option>-S</option>, since DNSKEY records are not imported
+ from the key repository in that case. It is also ignored if
+ there are any pre-existing DNSKEY records at the zone apex,
+ in which case new records' TTL values will be set to match
+ them.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-t</term>
<listitem>
<para>
@@ -405,6 +531,20 @@
</varlistentry>
<varlistentry>
+ <term>-u</term>
+ <listitem>
+ <para>
+ Update NSEC/NSEC3 chain when re-signing a previously signed
+ zone. With this option, a zone signed with NSEC can be
+ switched to NSEC3, or a zone signed with NSEC3 can
+ be switch to NSEC or to NSEC3 with different parameters.
+ Without this option, <command>dnssec-signzone</command> will
+ retain the existing chain when re-signing.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-v <replaceable class="parameter">level</replaceable></term>
<listitem>
<para>
@@ -414,10 +554,26 @@
</varlistentry>
<varlistentry>
+ <term>-x</term>
+ <listitem>
+ <para>
+ Only sign the DNSKEY RRset with key-signing keys, and omit
+ signatures from zone-signing keys. (This is similar to the
+ <command>dnssec-dnskey-kskonly yes;</command> zone option in
+ <command>named</command>.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-z</term>
<listitem>
<para>
- Ignore KSK flag on key when determining what to sign.
+ Ignore KSK flag on key when determining what to sign. This
+ causes KSK-flagged keys to sign all records, not just the
+ DNSKEY RRset. (This is similar to the
+ <command>update-check-ksk no;</command> zone option in
+ <command>named</command>.)
</para>
</listitem>
</varlistentry>
@@ -426,7 +582,7 @@
<term>-3 <replaceable class="parameter">salt</replaceable></term>
<listitem>
<para>
- Generate a NSEC3 chain with the given hex encoded salt.
+ Generate an NSEC3 chain with the given hex encoded salt.
A dash (<replaceable class="parameter">salt</replaceable>) can
be used to indicate that no salt is to be used when generating the NSEC3 chain.
</para>
@@ -437,8 +593,8 @@
<term>-H <replaceable class="parameter">iterations</replaceable></term>
<listitem>
<para>
- When generating a NSEC3 chain use this many interations. The
- default is 100.
+ When generating an NSEC3 chain, use this many interations. The
+ default is 10.
</para>
</listitem>
</varlistentry>
@@ -447,10 +603,16 @@
<term>-A</term>
<listitem>
<para>
- When generating a NSEC3 chain set the OPTOUT flag on all
+ When generating an NSEC3 chain set the OPTOUT flag on all
NSEC3 records and do not generate NSEC3 records for insecure
delegations.
</para>
+ <para>
+ Using this option twice (i.e., <option>-AA</option>)
+ turns the OPTOUT flag off for all records. This is useful
+ when using the <option>-u</option> option to modify an NSEC3
+ chain which previously had OPTOUT set.
+ </para>
</listitem>
</varlistentry>
@@ -484,10 +646,11 @@
<para>
The following command signs the <userinput>example.com</userinput>
zone with the DSA key generated by <command>dnssec-keygen</command>
- (Kexample.com.+003+17247). The zone's keys must be in the master
- file (<filename>db.example.com</filename>). This invocation looks
- for <filename>keyset</filename> files, in the current directory,
- so that DS records can be generated from them (<command>-g</command>).
+ (Kexample.com.+003+17247). Because the <command>-S</command> option
+ is not being used, the zone's keys must be in the master file
+ (<filename>db.example.com</filename>). This invocation looks
+ for <filename>dsset</filename> files, in the current directory,
+ so that DS records can be imported from them (<command>-g</command>).
</para>
<programlisting>% dnssec-signzone -g -o example.com db.example.com \
Kexample.com.+003+17247
@@ -510,33 +673,6 @@ db.example.com.signed
</refsect1>
<refsect1>
- <title>KNOWN BUGS</title>
- <para>
- <command>dnssec-signzone</command> was designed so that it could
- sign a zone partially, using only a subset of the DNSSEC keys
- needed to produce a fully-signed zone. This permits a zone
- administrator, for example, to sign a zone with one key on one
- machine, move the resulting partially-signed zone to a second
- machine, and sign it again with a second key.
- </para>
- <para>
- An unfortunate side-effect of this flexibility is that
- <command>dnssec-signzone</command> does not check to make sure
- it's signing a zone with any valid keys at all. An attempt to
- sign a zone without any keys will appear to succeed, producing
- a "signed" zone with no signatures. There is no warning issued
- when a zone is not fully signed.
- </para>
-
- <para>
- This will be corrected in a future release. In the meantime, ISC
- recommends examining the output of <command>dnssec-signzone</command>
- to confirm that the zone is properly signed by all keys before
- using it.
- </para>
- </refsect1>
-
- <refsect1>
<title>SEE ALSO</title>
<para><citerefentry>
<refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.html b/contrib/bind9/bin/dnssec/dnssec-signzone.html
index 1d4ecff..28e7158 100644
--- a/contrib/bind9/bin/dnssec/dnssec-signzone.html
+++ b/contrib/bind9/bin/dnssec/dnssec-signzone.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: dnssec-signzone.html,v 1.33.44.8 2009-11-07 01:56:11 tbox Exp $ -->
+<!-- $Id: dnssec-signzone.html,v 1.45 2009-12-04 01:13:44 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,21 +29,21 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-t</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S</code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-T <em class="replaceable"><code>ttl</code></em></code>] [<code class="option">-t</code>] [<code class="option">-u</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-x</code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543558"></a><h2>DESCRIPTION</h2>
+<a name="id2543596"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-signzone</strong></span>
signs a zone. It generates
NSEC and RRSIG records and produces a signed version of the
- zone. It also generates a <code class="filename">keyset-</code> file containing
- the key-signing keys for the zone, and if signing a zone which
- contains delegations, it can optionally generate DS records for
- the child zones from their <code class="filename">keyset-</code> files.
+ zone. The security status of delegations from the signed zone
+ (that is, whether the child zones are secure or not) is
+ determined by the presence or absence of a
+ <code class="filename">keyset</code> file for each child zone.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543576"></a><h2>OPTIONS</h2>
+<a name="id2543611"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd><p>
@@ -53,6 +53,38 @@
<dd><p>
Specifies the DNS class of the zone.
</p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: Generate a
+ <code class="filename">keyset-<em class="replaceable"><code>zonename</code></em></code>
+ file in addition to
+ <code class="filename">dsset-<em class="replaceable"><code>zonename</code></em></code>
+ when signing a zone, for use by older versions of
+ <span><strong class="command">dnssec-signzone</strong></span>.
+ </p></dd>
+<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Look for <code class="filename">dsset-</code> or
+ <code class="filename">keyset-</code> files in <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-g</span></dt>
+<dd><p>
+ Generate DS records for child zones from
+ <code class="filename">dsset-</code> or <code class="filename">keyset-</code>
+ file. Existing DS records will be removed.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Key repository: Specify a directory to search for DNSSEC keys.
+ If not specified, defaults to the current directory.
+ </p></dd>
<dt><span class="term">-k <em class="replaceable"><code>key</code></em></span></dt>
<dd><p>
Treat specified key as a key signing key ignoring any
@@ -63,18 +95,6 @@
Generate a DLV set in addition to the key (DNSKEY) and DS sets.
The domain is appended to the name of the records.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
-<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory
- </p></dd>
-<dt><span class="term">-g</span></dt>
-<dd><p>
- If the zone contains any delegations, and there are
- <code class="filename">keyset-</code> files for any of the child zones,
- then DS records for the child zones will be generated from the
- keys in those files. Existing DS records will be removed.
- </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>start-time</code></em></span></dt>
<dd><p>
Specify the date and time when the generated RRSIG records
@@ -95,6 +115,8 @@
the start time. A time relative to the current time is
indicated with now+N. If no <code class="option">end-time</code> is
specified, 30 days from the start time is used as a default.
+ <code class="option">end-time</code> must be later than
+ <code class="option">start-time</code>.
</p></dd>
<dt><span class="term">-f <em class="replaceable"><code>output-file</code></em></span></dt>
<dd><p>
@@ -229,35 +251,119 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S</span></dt>
+<dd>
+<p>
+ Smart signing: Instructs <span><strong class="command">dnssec-signzone</strong></span> to
+ search the key repository for keys that match the zone being
+ signed, and to include them in the zone if appropriate.
+ </p>
+<p>
+ When a key is found, its timing metadata is examined to
+ determine how it should be used, according to the following
+ rules. Each successive rule takes priority over the prior
+ ones:
+ </p>
+<div class="variablelist"><dl>
+<dt></dt>
+<dd><p>
+ If no timing metadata has been set for the key, the key is
+ published in the zone and used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's publication date is set and is in the past, the
+ key is published in the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's activation date is set and in the past, the
+ key is published (regardless of publication date) and
+ used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's revocation date is set and in the past, and the
+ key is published, then the key is revoked, and the revoked key
+ is used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If either of the key's unpublication or deletion dates are set
+ and in the past, the key is NOT published or used to sign the
+ zone, regardless of any other metadata.
+ </p></dd>
+</dl></div>
+</dd>
+<dt><span class="term">-T <em class="replaceable"><code>ttl</code></em></span></dt>
+<dd><p>
+ Specifies the TTL to be used for new DNSKEY records imported
+ into the zone from the key repository. If not specified,
+ the default is the minimum TTL value from the zone's SOA
+ record. This option is ignored when signing without
+ <code class="option">-S</code>, since DNSKEY records are not imported
+ from the key repository in that case. It is also ignored if
+ there are any pre-existing DNSKEY records at the zone apex,
+ in which case new records' TTL values will be set to match
+ them.
+ </p></dd>
<dt><span class="term">-t</span></dt>
<dd><p>
Print statistics at completion.
</p></dd>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Update NSEC/NSEC3 chain when re-signing a previously signed
+ zone. With this option, a zone signed with NSEC can be
+ switched to NSEC3, or a zone signed with NSEC3 can
+ be switch to NSEC or to NSEC3 with different parameters.
+ Without this option, <span><strong class="command">dnssec-signzone</strong></span> will
+ retain the existing chain when re-signing.
+ </p></dd>
<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-x</span></dt>
+<dd><p>
+ Only sign the DNSKEY RRset with key-signing keys, and omit
+ signatures from zone-signing keys. (This is similar to the
+ <span><strong class="command">dnssec-dnskey-kskonly yes;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
- Ignore KSK flag on key when determining what to sign.
+ Ignore KSK flag on key when determining what to sign. This
+ causes KSK-flagged keys to sign all records, not just the
+ DNSKEY RRset. (This is similar to the
+ <span><strong class="command">update-check-ksk no;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
</p></dd>
<dt><span class="term">-3 <em class="replaceable"><code>salt</code></em></span></dt>
<dd><p>
- Generate a NSEC3 chain with the given hex encoded salt.
+ Generate an NSEC3 chain with the given hex encoded salt.
A dash (<em class="replaceable"><code>salt</code></em>) can
be used to indicate that no salt is to be used when generating the NSEC3 chain.
</p></dd>
<dt><span class="term">-H <em class="replaceable"><code>iterations</code></em></span></dt>
<dd><p>
- When generating a NSEC3 chain use this many interations. The
- default is 100.
+ When generating an NSEC3 chain, use this many interations. The
+ default is 10.
</p></dd>
<dt><span class="term">-A</span></dt>
-<dd><p>
- When generating a NSEC3 chain set the OPTOUT flag on all
+<dd>
+<p>
+ When generating an NSEC3 chain set the OPTOUT flag on all
NSEC3 records and do not generate NSEC3 records for insecure
delegations.
- </p></dd>
+ </p>
+<p>
+ Using this option twice (i.e., <code class="option">-AA</code>)
+ turns the OPTOUT flag off for all records. This is useful
+ when using the <code class="option">-u</code> option to modify an NSEC3
+ chain which previously had OPTOUT set.
+ </p>
+</dd>
<dt><span class="term">zonefile</span></dt>
<dd><p>
The file containing the zone to be signed.
@@ -273,14 +379,15 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544503"></a><h2>EXAMPLE</h2>
+<a name="id2544896"></a><h2>EXAMPLE</h2>
<p>
The following command signs the <strong class="userinput"><code>example.com</code></strong>
zone with the DSA key generated by <span><strong class="command">dnssec-keygen</strong></span>
- (Kexample.com.+003+17247). The zone's keys must be in the master
- file (<code class="filename">db.example.com</code>). This invocation looks
- for <code class="filename">keyset</code> files, in the current directory,
- so that DS records can be generated from them (<span><strong class="command">-g</strong></span>).
+ (Kexample.com.+003+17247). Because the <span><strong class="command">-S</strong></span> option
+ is not being used, the zone's keys must be in the master file
+ (<code class="filename">db.example.com</code>). This invocation looks
+ for <code class="filename">dsset</code> files, in the current directory,
+ so that DS records can be imported from them (<span><strong class="command">-g</strong></span>).
</p>
<pre class="programlisting">% dnssec-signzone -g -o example.com db.example.com \
Kexample.com.+003+17247
@@ -302,39 +409,14 @@ db.example.com.signed
%</pre>
</div>
<div class="refsect1" lang="en">
-<a name="id2544554"></a><h2>KNOWN BUGS</h2>
-<p>
- <span><strong class="command">dnssec-signzone</strong></span> was designed so that it could
- sign a zone partially, using only a subset of the DNSSEC keys
- needed to produce a fully-signed zone. This permits a zone
- administrator, for example, to sign a zone with one key on one
- machine, move the resulting partially-signed zone to a second
- machine, and sign it again with a second key.
- </p>
-<p>
- An unfortunate side-effect of this flexibility is that
- <span><strong class="command">dnssec-signzone</strong></span> does not check to make sure
- it's signing a zone with any valid keys at all. An attempt to
- sign a zone without any keys will appear to succeed, producing
- a "signed" zone with no signatures. There is no warning issued
- when a zone is not fully signed.
- </p>
-<p>
- This will be corrected in a future release. In the meantime, ISC
- recommends examining the output of <span><strong class="command">dnssec-signzone</strong></span>
- to confirm that the zone is properly signed by all keys before
- using it.
- </p>
-</div>
-<div class="refsect1" lang="en">
-<a name="id2544716"></a><h2>SEE ALSO</h2>
+<a name="id2545019"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 4033</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544741"></a><h2>AUTHOR</h2>
+<a name="id2545044"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/dnssec/dnssectool.c b/contrib/bind9/bin/dnssec/dnssectool.c
index 81120e3..da6b0b2 100644
--- a/contrib/bind9/bin/dnssec/dnssectool.c
+++ b/contrib/bind9/bin/dnssec/dnssectool.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssectool.c,v 1.45.334.5 2009-06-22 05:05:00 marka Exp $ */
+/* $Id: dnssectool.c,v 1.60 2010-01-19 23:48:56 tbox Exp $ */
/*! \file */
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <isc/buffer.h>
+#include <isc/dir.h>
#include <isc/entropy.h>
#include <isc/list.h>
#include <isc/mem.h>
@@ -36,6 +37,8 @@
#include <isc/util.h>
#include <isc/print.h>
+#include <dns/dnssec.h>
+#include <dns/keyvalues.h>
#include <dns/log.h>
#include <dns/name.h>
#include <dns/rdatastruct.h>
@@ -111,39 +114,16 @@ type_format(const dns_rdatatype_t type, char *cp, unsigned int size) {
}
void
-alg_format(const dns_secalg_t alg, char *cp, unsigned int size) {
- isc_buffer_t b;
- isc_region_t r;
- isc_result_t result;
-
- isc_buffer_init(&b, cp, size - 1);
- result = dns_secalg_totext(alg, &b);
- check_result(result, "dns_secalg_totext()");
- isc_buffer_usedregion(&b, &r);
- r.base[r.length] = 0;
-}
-
-void
sig_format(dns_rdata_rrsig_t *sig, char *cp, unsigned int size) {
char namestr[DNS_NAME_FORMATSIZE];
char algstr[DNS_NAME_FORMATSIZE];
dns_name_format(&sig->signer, namestr, sizeof(namestr));
- alg_format(sig->algorithm, algstr, sizeof(algstr));
+ dns_secalg_format(sig->algorithm, algstr, sizeof(algstr));
snprintf(cp, size, "%s/%s/%d", namestr, algstr, sig->keyid);
}
void
-key_format(const dst_key_t *key, char *cp, unsigned int size) {
- char namestr[DNS_NAME_FORMATSIZE];
- char algstr[DNS_NAME_FORMATSIZE];
-
- dns_name_format(dst_key_name(key), namestr, sizeof(namestr));
- alg_format((dns_secalg_t) dst_key_alg(key), algstr, sizeof(algstr));
- snprintf(cp, size, "%s/%s/%d", namestr, algstr, dst_key_id(key));
-}
-
-void
setup_logging(int verbose, isc_mem_t *mctx, isc_log_t **logp) {
isc_result_t result;
isc_logdestination_t destination;
@@ -265,32 +245,92 @@ cleanup_entropy(isc_entropy_t **ectx) {
isc_entropy_detach(ectx);
}
+static isc_stdtime_t
+time_units(isc_stdtime_t offset, char *suffix, const char *str) {
+ switch (suffix[0]) {
+ case 'Y': case 'y':
+ return (offset * (365 * 24 * 3600));
+ case 'M': case 'm':
+ switch (suffix[1]) {
+ case 'O': case 'o':
+ return (offset * (30 * 24 * 3600));
+ case 'I': case 'i':
+ return (offset * 60);
+ case '\0':
+ fatal("'%s' ambiguous: use 'mi' for minutes "
+ "or 'mo' for months", str);
+ default:
+ fatal("time value %s is invalid", str);
+ }
+ /* NOTREACHED */
+ break;
+ case 'W': case 'w':
+ return (offset * (7 * 24 * 3600));
+ case 'D': case 'd':
+ return (offset * (24 * 3600));
+ case 'H': case 'h':
+ return (offset * 3600);
+ case 'S': case 's': case '\0':
+ return (offset);
+ default:
+ fatal("time value %s is invalid", str);
+ }
+ /* NOTREACHED */
+ return(0); /* silence compiler warning */
+}
+
+dns_ttl_t
+strtottl(const char *str) {
+ const char *orig = str;
+ dns_ttl_t ttl;
+ char *endp;
+
+ ttl = strtol(str, &endp, 0);
+ if (ttl == 0 && endp == str)
+ fatal("TTL must be numeric");
+ ttl = time_units(ttl, endp, orig);
+ return (ttl);
+}
+
isc_stdtime_t
strtotime(const char *str, isc_int64_t now, isc_int64_t base) {
isc_int64_t val, offset;
isc_result_t result;
+ const char *orig = str;
char *endp;
- if (str[0] == '+') {
+ if ((str[0] == '0' || str[0] == '-') && str[1] == '\0')
+ return ((isc_stdtime_t) 0);
+
+ if (strncmp(str, "now", 3) == 0) {
+ base = now;
+ str += 3;
+ }
+
+ if (str[0] == '\0')
+ return ((isc_stdtime_t) base);
+ else if (str[0] == '+') {
offset = strtol(str + 1, &endp, 0);
- if (*endp != '\0')
- fatal("time value %s is invalid", str);
+ offset = time_units((isc_stdtime_t) offset, endp, orig);
val = base + offset;
- } else if (strncmp(str, "now+", 4) == 0) {
- offset = strtol(str + 4, &endp, 0);
- if (*endp != '\0')
- fatal("time value %s is invalid", str);
- val = now + offset;
+ } else if (str[0] == '-') {
+ offset = strtol(str + 1, &endp, 0);
+ offset = time_units((isc_stdtime_t) offset, endp, orig);
+ val = base - offset;
} else if (strlen(str) == 8U) {
char timestr[15];
sprintf(timestr, "%s000000", str);
result = dns_time64_fromtext(timestr, &val);
if (result != ISC_R_SUCCESS)
- fatal("time value %s is invalid", str);
+ fatal("time value %s is invalid: %s", orig,
+ isc_result_totext(result));
+ } else if (strlen(str) > 14U) {
+ fatal("time value %s is invalid", orig);
} else {
result = dns_time64_fromtext(str, &val);
if (result != ISC_R_SUCCESS)
- fatal("time value %s is invalid", str);
+ fatal("time value %s is invalid: %s", orig,
+ isc_result_totext(result));
}
return ((isc_stdtime_t) val);
@@ -311,3 +351,114 @@ strtoclass(const char *str) {
fatal("unknown class %s", str);
return (rdclass);
}
+
+isc_result_t
+try_dir(const char *dirname) {
+ isc_result_t result;
+ isc_dir_t d;
+
+ isc_dir_init(&d);
+ result = isc_dir_open(&d, dirname);
+ if (result == ISC_R_SUCCESS) {
+ isc_dir_close(&d);
+ }
+ return (result);
+}
+
+/*
+ * Check private key version compatibility.
+ */
+void
+check_keyversion(dst_key_t *key, char *keystr) {
+ int major, minor;
+ dst_key_getprivateformat(key, &major, &minor);
+ INSIST(major <= DST_MAJOR_VERSION); /* invalid private key */
+
+ if (major < DST_MAJOR_VERSION || minor < DST_MINOR_VERSION)
+ fatal("Key %s has incompatible format version %d.%d, "
+ "use -f to force upgrade to new version.",
+ keystr, major, minor);
+ if (minor > DST_MINOR_VERSION)
+ fatal("Key %s has incompatible format version %d.%d, "
+ "use -f to force downgrade to current version.",
+ keystr, major, minor);
+}
+
+void
+set_keyversion(dst_key_t *key) {
+ int major, minor;
+ dst_key_getprivateformat(key, &major, &minor);
+ INSIST(major <= DST_MAJOR_VERSION);
+
+ if (major != DST_MAJOR_VERSION || minor != DST_MINOR_VERSION)
+ dst_key_setprivateformat(key, DST_MAJOR_VERSION,
+ DST_MINOR_VERSION);
+
+ /*
+ * If the key is from a version older than 1.3, set
+ * set the creation date
+ */
+ if (major < 1 || (major == 1 && minor <= 2)) {
+ isc_stdtime_t now;
+ isc_stdtime_get(&now);
+ dst_key_settime(key, DST_TIME_CREATED, now);
+ }
+}
+
+isc_boolean_t
+key_collision(isc_uint16_t id, dns_name_t *name, const char *dir,
+ dns_secalg_t alg, isc_mem_t *mctx, isc_boolean_t *exact)
+{
+ isc_result_t result;
+ isc_boolean_t conflict = ISC_FALSE;
+ dns_dnsseckeylist_t matchkeys;
+ dns_dnsseckey_t *key = NULL;
+ isc_uint16_t oldid, diff;
+ isc_uint16_t bits = DNS_KEYFLAG_REVOKE; /* flag bits to look for */
+
+ if (exact != NULL)
+ *exact = ISC_FALSE;
+
+ ISC_LIST_INIT(matchkeys);
+ result = dns_dnssec_findmatchingkeys(name, dir, mctx, &matchkeys);
+ if (result == ISC_R_NOTFOUND)
+ return (ISC_FALSE);
+
+ while (!ISC_LIST_EMPTY(matchkeys) && !conflict) {
+ key = ISC_LIST_HEAD(matchkeys);
+ if (dst_key_alg(key->key) != alg)
+ goto next;
+
+ oldid = dst_key_id(key->key);
+ diff = (oldid > id) ? (oldid - id) : (id - oldid);
+ if ((diff & ~bits) == 0) {
+ conflict = ISC_TRUE;
+ if (diff != 0) {
+ if (verbose > 1)
+ fprintf(stderr, "Key ID %d could "
+ "collide with %d\n",
+ id, oldid);
+ } else {
+ if (exact != NULL)
+ *exact = ISC_TRUE;
+ if (verbose > 1)
+ fprintf(stderr, "Key ID %d exists\n",
+ id);
+ }
+ }
+
+ next:
+ ISC_LIST_UNLINK(matchkeys, key, link);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+
+ /* Finish freeing the list */
+ while (!ISC_LIST_EMPTY(matchkeys)) {
+ key = ISC_LIST_HEAD(matchkeys);
+ ISC_LIST_UNLINK(matchkeys, key, link);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+
+ return (conflict);
+}
+
diff --git a/contrib/bind9/bin/dnssec/dnssectool.h b/contrib/bind9/bin/dnssec/dnssectool.h
index 8cc133d..b52bc13 100644
--- a/contrib/bind9/bin/dnssec/dnssectool.h
+++ b/contrib/bind9/bin/dnssec/dnssectool.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssectool.h,v 1.22.48.2 2009-09-04 23:46:58 tbox Exp $ */
+/* $Id: dnssectool.h,v 1.31 2010-01-19 23:48:56 tbox Exp $ */
#ifndef DNSSECTOOL_H
#define DNSSECTOOL_H 1
@@ -27,8 +27,9 @@
typedef void (fatalcallback_t)(void);
-void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
void
setfatalcallback(fatalcallback_t *callback);
@@ -44,16 +45,8 @@ type_format(const dns_rdatatype_t type, char *cp, unsigned int size);
#define TYPE_FORMATSIZE 20
void
-alg_format(const dns_secalg_t alg, char *cp, unsigned int size);
-#define ALG_FORMATSIZE 20
-
-void
sig_format(dns_rdata_rrsig_t *sig, char *cp, unsigned int size);
-#define SIG_FORMATSIZE (DNS_NAME_FORMATSIZE + ALG_FORMATSIZE + sizeof("65535"))
-
-void
-key_format(const dst_key_t *key, char *cp, unsigned int size);
-#define KEY_FORMATSIZE (DNS_NAME_FORMATSIZE + ALG_FORMATSIZE + sizeof("65535"))
+#define SIG_FORMATSIZE (DNS_NAME_FORMATSIZE + DNS_SECALG_FORMATSIZE + sizeof("65535"))
void
setup_logging(int verbose, isc_mem_t *mctx, isc_log_t **logp);
@@ -67,10 +60,24 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx);
void
cleanup_entropy(isc_entropy_t **ectx);
+dns_ttl_t strtottl(const char *str);
+
isc_stdtime_t
strtotime(const char *str, isc_int64_t now, isc_int64_t base);
dns_rdataclass_t
strtoclass(const char *str);
+isc_result_t
+try_dir(const char *dirname);
+
+void
+check_keyversion(dst_key_t *key, char *keystr);
+
+void
+set_keyversion(dst_key_t *key);
+
+isc_boolean_t
+key_collision(isc_uint16_t id, dns_name_t *name, const char *dir,
+ dns_secalg_t alg, isc_mem_t *mctx, isc_boolean_t *exact);
#endif /* DNSSEC_DNSSECTOOL_H */
diff --git a/contrib/bind9/bin/named/Makefile.in b/contrib/bind9/bin/named/Makefile.in
index ee76134..a3dbb38 100644
--- a/contrib/bind9/bin/named/Makefile.in
+++ b/contrib/bind9/bin/named/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.101 2008-09-23 17:25:47 jinmei Exp $
+# $Id: Makefile.in,v 1.114 2010-12-22 09:00:40 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -43,9 +43,9 @@ DLZDRIVER_LIBS = @DLZ_DRIVER_LIBS@
CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include -I. \
${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \
${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \
- ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES}
+ ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} @DST_OPENSSL_INC@
-CDEFINES = @USE_DLZ@
+CDEFINES = @USE_DLZ@ @USE_PKCS11@ @USE_OPENSSL@
CWARNINGS =
@@ -53,6 +53,7 @@ DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCLIBS = ../../lib/isccc/libisccc.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
LWRESLIBS = ../../lib/lwres/liblwres.@A@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
@@ -70,6 +71,10 @@ LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \
${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} \
${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@
+NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \
+ ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCNOSYMLIBS} \
+ ${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@
+
SUBDIRS = unix
TARGETS = named@EXEEXT@ lwresd@EXEEXT@
@@ -86,10 +91,12 @@ OBJS = builtin.@O@ client.@O@ config.@O@ control.@O@ \
UOBJS = unix/os.@O@
+SYMOBJS = symtbl.@O@
+
SRCS = builtin.c client.c config.c control.c \
controlconf.c interfacemgr.c \
listenlist.c log.c logconf.c main.c notify.c \
- query.c server.c sortlist.c statschannel.c \
+ query.c server.c sortlist.c statschannel.c symtbl.c symtbl-empty.c \
tkeyconf.c tsigconf.c update.c xfrout.c \
zoneconf.c \
lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \
@@ -111,15 +118,20 @@ main.@O@: main.c
-DNS_LOCALSTATEDIR=\"${localstatedir}\" \
-DNS_SYSCONFDIR=\"${sysconfdir}\" -c ${srcdir}/main.c
-config.@O@: config.c
+bind.keys.h: ${top_srcdir}/bind.keys ${srcdir}/bindkeys.pl
+ ${PERL} ${srcdir}/bindkeys.pl < ${top_srcdir}/bind.keys > $@
+
+config.@O@: config.c bind.keys.h
${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
-DVERSION=\"${VERSION}\" \
-DNS_LOCALSTATEDIR=\"${localstatedir}\" \
+ -DNS_SYSCONFDIR=\"${sysconfdir}\" \
-c ${srcdir}/config.c
named@EXEEXT@: ${OBJS} ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
- ${OBJS} ${UOBJS} ${LIBS}
+ export MAKE_SYMTABLE="yes"; \
+ export BASEOBJS="${OBJS} ${UOBJS}"; \
+ ${FINALBUILDCMD}
lwresd@EXEEXT@: named@EXEEXT@
rm -f lwresd@EXEEXT@
@@ -133,7 +145,10 @@ docclean manclean maintainer-clean::
clean distclean maintainer-clean::
rm -f ${TARGETS} ${OBJS}
-bind9.xsl.h: bind9.xsl convertxsl.pl
+maintainer-clean::
+ rm -f bind.keys.h
+
+bind9.xsl.h: bind9.xsl ${srcdir}/convertxsl.pl
${PERL} ${srcdir}/convertxsl.pl < ${srcdir}/bind9.xsl > bind9.xsl.h
depend: bind9.xsl.h
diff --git a/contrib/bind9/bin/named/bind.keys.h b/contrib/bind9/bin/named/bind.keys.h
new file mode 100644
index 0000000..0177214
--- /dev/null
+++ b/contrib/bind9/bin/named/bind.keys.h
@@ -0,0 +1,99 @@
+/*
+ * Generated by bindkeys.pl 1.7 2011-01-04 23:47:13 tbox Exp
+ * From bind.keys 1.7 2011-01-03 23:45:07 each Exp
+ */
+#define TRUSTED_KEYS "\
+# The bind.keys file is used to override the built-in DNSSEC trust anchors\n\
+# which are included as part of BIND 9. As of the current release, the only\n\
+# trust anchors it contains are those for the DNS root zone (\".\"), and for\n\
+# the ISC DNSSEC Lookaside Validation zone (\"dlv.isc.org\"). Trust anchors\n\
+# for any other zones MUST be configured elsewhere; if they are configured\n\
+# here, they will not be recognized or used by named.\n\
+#\n\
+# The built-in trust anchors are provided for convenience of configuration.\n\
+# They are not activated within named.conf unless specifically switched on.\n\
+# To use the built-in root key, set \"dnssec-validation auto;\" in\n\
+# named.conf options. To use the built-in DLV key, set\n\
+# \"dnssec-lookaside auto;\". Without these options being set,\n\
+# the keys in this file are ignored.\n\
+#\n\
+# This file is NOT expected to be user-configured.\n\
+#\n\
+# These keys are current as of January 2011. If any key fails to\n\
+# initialize correctly, it may have expired. In that event you should\n\
+# replace this file with a current version. The latest version of\n\
+# bind.keys can always be obtained from ISC at https://www.isc.org/bind-keys.\n\
+\n\
+trusted-keys {\n\
+ # ISC DLV: See https://www.isc.org/solutions/dlv for details.\n\
+ # NOTE: This key is activated by setting \"dnssec-lookaside auto;\"\n\
+ # in named.conf.\n\
+ dlv.isc.org. 257 3 5 \"BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2\n\
+ brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+\n\
+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5\n\
+ ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk\n\
+ Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM\n\
+ QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt\n\
+ TDN0YUuWrBNh\";\n\
+\n\
+ # ROOT KEY: See https://data.iana.org/root-anchors/root-anchors.xml\n\
+ # for current trust anchor information.\n\
+ # NOTE: This key is activated by setting \"dnssec-validation auto;\"\n\
+ # in named.conf.\n\
+ . 257 3 8 \"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF\n\
+ FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX\n\
+ bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD\n\
+ X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz\n\
+ W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS\n\
+ Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq\n\
+ QxA+Uk1ihz0=\";\n\
+};\n\
+"
+
+#define MANAGED_KEYS "\
+# The bind.keys file is used to override the built-in DNSSEC trust anchors\n\
+# which are included as part of BIND 9. As of the current release, the only\n\
+# trust anchors it contains are those for the DNS root zone (\".\"), and for\n\
+# the ISC DNSSEC Lookaside Validation zone (\"dlv.isc.org\"). Trust anchors\n\
+# for any other zones MUST be configured elsewhere; if they are configured\n\
+# here, they will not be recognized or used by named.\n\
+#\n\
+# The built-in trust anchors are provided for convenience of configuration.\n\
+# They are not activated within named.conf unless specifically switched on.\n\
+# To use the built-in root key, set \"dnssec-validation auto;\" in\n\
+# named.conf options. To use the built-in DLV key, set\n\
+# \"dnssec-lookaside auto;\". Without these options being set,\n\
+# the keys in this file are ignored.\n\
+#\n\
+# This file is NOT expected to be user-configured.\n\
+#\n\
+# These keys are current as of January 2011. If any key fails to\n\
+# initialize correctly, it may have expired. In that event you should\n\
+# replace this file with a current version. The latest version of\n\
+# bind.keys can always be obtained from ISC at https://www.isc.org/bind-keys.\n\
+\n\
+managed-keys {\n\
+ # ISC DLV: See https://www.isc.org/solutions/dlv for details.\n\
+ # NOTE: This key is activated by setting \"dnssec-lookaside auto;\"\n\
+ # in named.conf.\n\
+ dlv.isc.org. initial-key 257 3 5 \"BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2\n\
+ brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+\n\
+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5\n\
+ ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk\n\
+ Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM\n\
+ QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt\n\
+ TDN0YUuWrBNh\";\n\
+\n\
+ # ROOT KEY: See https://data.iana.org/root-anchors/root-anchors.xml\n\
+ # for current trust anchor information.\n\
+ # NOTE: This key is activated by setting \"dnssec-validation auto;\"\n\
+ # in named.conf.\n\
+ . initial-key 257 3 8 \"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF\n\
+ FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX\n\
+ bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD\n\
+ X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz\n\
+ W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS\n\
+ Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq\n\
+ QxA+Uk1ihz0=\";\n\
+};\n\
+"
diff --git a/contrib/bind9/bin/named/bind9.xsl b/contrib/bind9/bin/named/bind9.xsl
index 71d2eba..5913c1c 100644
--- a/contrib/bind9/bin/named/bind9.xsl
+++ b/contrib/bind9/bin/named/bind9.xsl
@@ -15,7 +15,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: bind9.xsl,v 1.19.82.2 2009-01-29 23:47:43 tbox Exp $ -->
+<!-- $Id: bind9.xsl,v 1.21 2009-01-27 23:47:54 tbox Exp $ -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
diff --git a/contrib/bind9/bin/named/bind9.xsl.h b/contrib/bind9/bin/named/bind9.xsl.h
index e42fda0..b6f1f54 100644
--- a/contrib/bind9/bin/named/bind9.xsl.h
+++ b/contrib/bind9/bin/named/bind9.xsl.h
@@ -1,6 +1,6 @@
/*
- * Generated by convertxsl.pl 1.14 2008/07/17 23:43:26 jinmei Exp
- * From bind9.xsl 1.19.82.2 2009/01/29 23:47:43 tbox Exp
+ * Generated by convertxsl.pl 1.14 2008-07-17 23:43:26 jinmei Exp
+ * From bind9.xsl 1.21 2009-01-27 23:47:54 tbox Exp
*/
static char xslmsg[] =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
@@ -20,7 +20,7 @@ static char xslmsg[] =
" - PERFORMANCE OF THIS SOFTWARE.\n"
"-->\n"
"\n"
- "<!-- \045Id: bind9.xsl,v 1.19.82.2 2009/01/29 23:47:43 tbox Exp \045 -->\n"
+ "<!-- \045Id: bind9.xsl,v 1.21 2009-01-27 23:47:54 tbox Exp \045 -->\n"
"\n"
"<xsl:stylesheet version=\"1.0\"\n"
" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n"
diff --git a/contrib/bind9/bin/named/builtin.c b/contrib/bind9/bin/named/builtin.c
index 60cb634..d7730e7 100644
--- a/contrib/bind9/bin/named/builtin.c
+++ b/contrib/bind9/bin/named/builtin.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: builtin.c,v 1.12.334.3 2010-08-03 23:45:47 tbox Exp $ */
+/* $Id: builtin.c,v 1.20 2011-01-07 23:47:07 tbox Exp $ */
/*! \file
* \brief
@@ -47,6 +47,7 @@ static isc_result_t do_hostname_lookup(dns_sdblookup_t *lookup);
static isc_result_t do_authors_lookup(dns_sdblookup_t *lookup);
static isc_result_t do_id_lookup(dns_sdblookup_t *lookup);
static isc_result_t do_empty_lookup(dns_sdblookup_t *lookup);
+static isc_result_t do_dns64_lookup(dns_sdblookup_t *lookup);
/*
* We can't use function pointers as the db_data directly
@@ -65,9 +66,179 @@ static builtin_t hostname_builtin = { do_hostname_lookup, NULL, NULL };
static builtin_t authors_builtin = { do_authors_lookup, NULL, NULL };
static builtin_t id_builtin = { do_id_lookup, NULL, NULL };
static builtin_t empty_builtin = { do_empty_lookup, NULL, NULL };
+static builtin_t dns64_builtin = { do_dns64_lookup, NULL, NULL };
static dns_sdbimplementation_t *builtin_impl;
+static const char hex[] = "0123456789abcdef";
+static const char HEX[] = "0123456789ABCDEF";
+
+static isc_result_t
+dns64_cname(const char *zone, const char *name, dns_sdblookup_t *lookup) {
+ size_t zlen, nlen, j;
+ const char *s;
+ unsigned char v[16];
+ unsigned int i;
+ char reverse[sizeof("123.123.123.123.in-addr.arpa.")];
+
+ /*
+ * The sum the length of the relative name and the length of the zone
+ * name for a IPv6 reverse lookup comes to 71.
+ *
+ * The reverse of 2001::10.0.0.1 (dns64 2001::/96) has a zone of
+ * "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2.ip6.arpa"
+ * and a name of "1.0.0.0.0.0.a.0". The sum of the lengths of these
+ * two strings is 71.
+ *
+ * The minimum length for a ip6.arpa zone name is 8.
+ *
+ * The length of name should always be odd as we are expecting
+ * a series of nibbles.
+ */
+ zlen = strlen(zone);
+ nlen = strlen(name);
+ if ((zlen + nlen) > 71U || zlen < 8U || (nlen % 2) != 1U)
+ return (ISC_R_NOTFOUND);
+
+ /*
+ * We assume the zone name is well formed.
+ */
+
+ /*
+ * XXXMPA We could check the dns64 suffix here if we need to.
+ */
+ /*
+ * Check that name is a series of nibbles.
+ * Compute the byte values that correspond to the nibbles as we go.
+ *
+ * Shift the final result 4 bits, by setting 'i' to 1, if we if we
+ * have a odd number of nibbles so that "must be zero" tests below
+ * are byte aligned and we correctly return ISC_R_NOTFOUND or
+ * ISC_R_SUCCESS. We will not generate a CNAME in this case.
+ */
+ i = (nlen % 4) == 1U ? 1 : 0;
+ j = nlen;
+ memset(v, 0, sizeof(v));
+ while (j >= 1U) {
+ INSIST((i/2) < sizeof(v));
+ if (j > 1U && name[1] != '.')
+ return (ISC_R_NOTFOUND);
+ v[i/2] >>= 4;
+ if ((s = strchr(hex, name[0])) != NULL)
+ v[i/2] |= (s - hex) << 4;
+ else if ((s = strchr(HEX, name[0])) != NULL)
+ v[i/2] |= (s - HEX) << 4;
+ else
+ return (ISC_R_NOTFOUND);
+ if (j > 1U)
+ j -= 2;
+ else
+ j -= 1;
+ name += 2;
+ i++;
+ }
+
+ /*
+ * If we get here then we know name only consisted of nibbles.
+ * Now we need to determine if the name exists or not and whether
+ * it corresponds to a empty node in the zone or there should be
+ * a CNAME.
+ */
+ switch (zlen) {
+ case 24: /* prefix len 32 */
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[8], v[9], v[10], v[11]);
+ break;
+ case 28: /* prefix len 40 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (nlen > 11U && v[nlen/4 - 3] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[6], v[8], v[9], v[10]);
+ break;
+ case 32: /* prefix len 48 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (nlen > 7U && v[nlen/4 - 2] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[5], v[6], v[8], v[9]);
+ break;
+ case 36: /* prefix len 56 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (nlen > 3U && v[nlen/4 - 1] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[4], v[5], v[6], v[8]);
+ break;
+ case 40: /* prefix len 64 */
+ /*
+ * The nibbles that map to this byte must be zero for 'name'
+ * to exist in the zone.
+ */
+ if (v[nlen/4] != 0)
+ return (ISC_R_NOTFOUND);
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[3], v[4], v[5], v[6]);
+ break;
+ case 56: /* prefix len 96 */
+ /*
+ * If the total length is not 71 then this is a empty node
+ * so return success.
+ */
+ if (nlen + zlen != 71U)
+ return (ISC_R_SUCCESS);
+ snprintf(reverse, sizeof(reverse), "%u.%u.%u.%u.in-addr.arpa.",
+ v[0], v[1], v[2], v[3]);
+ break;
+ default:
+ /*
+ * This should never be reached unless someone adds a
+ * zone declaration with this internal type to named.conf.
+ */
+ return (ISC_R_NOTFOUND);
+ }
+ return (dns_sdb_putrr(lookup, "CNAME", 600, reverse));
+}
+
static isc_result_t
builtin_lookup(const char *zone, const char *name, void *dbdata,
dns_sdblookup_t *lookup)
@@ -78,6 +249,8 @@ builtin_lookup(const char *zone, const char *name, void *dbdata,
if (strcmp(name, "@") == 0)
return (b->do_lookup(lookup));
+ else if (b->do_lookup == do_dns64_lookup)
+ return (dns64_cname(zone, name, lookup));
else
return (ISC_R_NOTFOUND);
}
@@ -132,11 +305,13 @@ do_authors_lookup(dns_sdblookup_t *lookup) {
"Michael Graff",
"Andreas Gustafsson",
"Bob Halley",
+ "Evan Hunt",
"JINMEI Tatuya",
"David Lawrence",
"Danny Mayer",
"Damien Neil",
"Matt Nelson",
+ "Jeremy C. Reed",
"Michael Sawyer",
"Brian Wellington",
NULL
@@ -174,6 +349,12 @@ do_id_lookup(dns_sdblookup_t *lookup) {
}
static isc_result_t
+do_dns64_lookup(dns_sdblookup_t *lookup) {
+ UNUSED(lookup);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
do_empty_lookup(dns_sdblookup_t *lookup) {
UNUSED(lookup);
@@ -220,7 +401,7 @@ builtin_create(const char *zone, int argc, char **argv,
UNUSED(zone);
UNUSED(driverdata);
- if (strcmp(argv[0], "empty") == 0) {
+ if (strcmp(argv[0], "empty") == 0 || strcmp(argv[0], "dns64") == 0) {
if (argc != 3)
return (DNS_R_SYNTAX);
} else if (argc != 1)
@@ -234,7 +415,8 @@ builtin_create(const char *zone, int argc, char **argv,
*dbdata = &authors_builtin;
else if (strcmp(argv[0], "id") == 0)
*dbdata = &id_builtin;
- else if (strcmp(argv[0], "empty") == 0) {
+ else if (strcmp(argv[0], "empty") == 0 ||
+ strcmp(argv[0], "dns64") == 0) {
builtin_t *empty;
char *server;
char *contact;
@@ -246,7 +428,10 @@ builtin_create(const char *zone, int argc, char **argv,
server = isc_mem_strdup(ns_g_mctx, argv[1]);
contact = isc_mem_strdup(ns_g_mctx, argv[2]);
if (empty == NULL || server == NULL || contact == NULL) {
- *dbdata = &empty_builtin;
+ if (strcmp(argv[0], "empty") == 0)
+ *dbdata = &empty_builtin;
+ else
+ *dbdata = &dns64_builtin;
if (server != NULL)
isc_mem_free(ns_g_mctx, server);
if (contact != NULL)
@@ -254,7 +439,12 @@ builtin_create(const char *zone, int argc, char **argv,
if (empty != NULL)
isc_mem_put(ns_g_mctx, empty, sizeof (*empty));
} else {
- memcpy(empty, &empty_builtin, sizeof (empty_builtin));
+ if (strcmp(argv[0], "empty") == 0)
+ memcpy(empty, &empty_builtin,
+ sizeof (empty_builtin));
+ else
+ memcpy(empty, &dns64_builtin,
+ sizeof (empty_builtin));
empty->server = server;
empty->contact = contact;
*dbdata = empty;
@@ -276,7 +466,7 @@ builtin_destroy(const char *zone, void *driverdata, void **dbdata) {
*/
if (*dbdata == &version_builtin || *dbdata == &hostname_builtin ||
*dbdata == &authors_builtin || *dbdata == &id_builtin ||
- *dbdata == &empty_builtin)
+ *dbdata == &empty_builtin || *dbdata == &dns64_builtin)
return;
isc_mem_free(ns_g_mctx, b->server);
@@ -306,3 +496,4 @@ void
ns_builtin_deinit(void) {
dns_sdb_unregister(&builtin_impl);
}
+
diff --git a/contrib/bind9/bin/named/client.c b/contrib/bind9/bin/named/client.c
index 6236d27..bc9cc87 100644
--- a/contrib/bind9/bin/named/client.c
+++ b/contrib/bind9/bin/named/client.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: client.c,v 1.259.12.5 2010-09-24 08:30:27 tbox Exp $ */
+/* $Id: client.c,v 1.271 2011-01-11 23:47:12 tbox Exp $ */
#include <config.h>
@@ -918,7 +918,7 @@ ns_client_send(ns_client_t *client) {
dns_compress_t cctx;
isc_boolean_t cleanup_cctx = ISC_FALSE;
unsigned char sendbuf[SEND_BUFFER_SIZE];
- unsigned int dnssec_opts;
+ unsigned int render_opts;
unsigned int preferred_glue;
isc_boolean_t opt_included = ISC_FALSE;
@@ -930,10 +930,21 @@ ns_client_send(ns_client_t *client) {
client->message->flags |= DNS_MESSAGEFLAG_RA;
if ((client->attributes & NS_CLIENTATTR_WANTDNSSEC) != 0)
- dnssec_opts = 0;
+ render_opts = 0;
else
- dnssec_opts = DNS_MESSAGERENDER_OMITDNSSEC;
-
+ render_opts = DNS_MESSAGERENDER_OMITDNSSEC;
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * filter-aaaa-on-v4 yes or break-dnssec option to suppress
+ * AAAA records
+ * We already know that request came via IPv4,
+ * that we have both AAAA and A records,
+ * and that we either have no signatures that the client wants
+ * or we are supposed to break DNSSEC.
+ */
+ if ((client->attributes & NS_CLIENTATTR_FILTER_AAAA) != 0)
+ render_opts |= DNS_MESSAGERENDER_FILTER_AAAA;
+#endif
preferred_glue = 0;
if (client->view != NULL) {
if (client->view->preferred_glue == dns_rdatatype_a)
@@ -977,7 +988,7 @@ ns_client_send(ns_client_t *client) {
result = dns_message_rendersection(client->message,
DNS_SECTION_ANSWER,
DNS_MESSAGERENDER_PARTIAL |
- dnssec_opts);
+ render_opts);
if (result == ISC_R_NOSPACE) {
client->message->flags |= DNS_MESSAGEFLAG_TC;
goto renderend;
@@ -987,7 +998,7 @@ ns_client_send(ns_client_t *client) {
result = dns_message_rendersection(client->message,
DNS_SECTION_AUTHORITY,
DNS_MESSAGERENDER_PARTIAL |
- dnssec_opts);
+ render_opts);
if (result == ISC_R_NOSPACE) {
client->message->flags |= DNS_MESSAGEFLAG_TC;
goto renderend;
@@ -996,7 +1007,7 @@ ns_client_send(ns_client_t *client) {
goto done;
result = dns_message_rendersection(client->message,
DNS_SECTION_ADDITIONAL,
- preferred_glue | dnssec_opts);
+ preferred_glue | render_opts);
if (result != ISC_R_SUCCESS && result != ISC_R_NOSPACE)
goto done;
renderend:
@@ -1355,7 +1366,6 @@ client_request(isc_task_t *task, isc_event_t *event) {
dns_name_t *signame;
isc_boolean_t ra; /* Recursion available. */
isc_netaddr_t netaddr;
- isc_netaddr_t destaddr;
int match;
dns_messageid_t id;
unsigned int flags;
@@ -1473,7 +1483,7 @@ client_request(isc_task_t *task, isc_event_t *event) {
/*
* Silently drop multicast requests for the present.
- * XXXMPA look at when/if mDNS spec stabilizes.
+ * XXXMPA revisit this as mDNS spec was published.
*/
if ((client->attributes & NS_CLIENTATTR_MULTICAST) != 0) {
ns_client_log(client, NS_LOGCATEGORY_CLIENT,
@@ -1647,24 +1657,20 @@ client_request(isc_task_t *task, isc_event_t *event) {
* etc), we regard this as an error for safety.
*/
if ((client->interface->flags & NS_INTERFACEFLAG_ANYADDR) == 0)
- isc_netaddr_fromsockaddr(&destaddr, &client->interface->addr);
+ isc_netaddr_fromsockaddr(&client->destaddr,
+ &client->interface->addr);
else {
+ isc_sockaddr_t sockaddr;
result = ISC_R_FAILURE;
- if (TCP_CLIENT(client)) {
- isc_sockaddr_t destsockaddr;
-
+ if (TCP_CLIENT(client))
result = isc_socket_getsockname(client->tcpsocket,
- &destsockaddr);
- if (result == ISC_R_SUCCESS)
- isc_netaddr_fromsockaddr(&destaddr,
- &destsockaddr);
- }
+ &sockaddr);
+ if (result == ISC_R_SUCCESS)
+ isc_netaddr_fromsockaddr(&client->destaddr, &sockaddr);
if (result != ISC_R_SUCCESS &&
client->interface->addr.type.sa.sa_family == AF_INET6 &&
(client->attributes & NS_CLIENTATTR_PKTINFO) != 0) {
- isc_uint32_t zone = 0;
-
/*
* XXXJT technically, we should convert the receiving
* interface ID to a proper scope zone ID. However,
@@ -1673,12 +1679,11 @@ client_request(isc_task_t *task, isc_event_t *event) {
* interface index as link ID. Despite the assumption,
* it should cover most typical cases.
*/
- if (IN6_IS_ADDR_LINKLOCAL(&client->pktinfo.ipi6_addr))
- zone = (isc_uint32_t)client->pktinfo.ipi6_ifindex;
-
- isc_netaddr_fromin6(&destaddr,
+ isc_netaddr_fromin6(&client->destaddr,
&client->pktinfo.ipi6_addr);
- isc_netaddr_setzone(&destaddr, zone);
+ if (IN6_IS_ADDR_LINKLOCAL(&client->pktinfo.ipi6_addr))
+ isc_netaddr_setzone(&client->destaddr,
+ client->pktinfo.ipi6_ifindex);
result = ISC_R_SUCCESS;
}
if (result != ISC_R_SUCCESS) {
@@ -1708,7 +1713,8 @@ client_request(isc_task_t *task, isc_event_t *event) {
tsig = dns_tsigkey_identity(client->message->tsigkey);
if (allowed(&netaddr, tsig, view->matchclients) &&
- allowed(&destaddr, tsig, view->matchdestinations) &&
+ allowed(&client->destaddr, tsig,
+ view->matchdestinations) &&
!((client->message->flags & DNS_MESSAGEFLAG_RD)
== 0 && view->matchrecursiveonly))
{
@@ -1771,9 +1777,11 @@ client_request(isc_task_t *task, isc_event_t *event) {
}
if (result == ISC_R_SUCCESS) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ dns_name_format(&client->signername, namebuf, sizeof(namebuf));
ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(3),
- "request has valid signature");
+ "request has valid signature: %s", namebuf);
client->signer = &client->signername;
} else if (result == ISC_R_NOTFOUND) {
ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
@@ -1861,10 +1869,10 @@ client_request(isc_task_t *task, isc_event_t *event) {
ns_client_checkaclsilent(client, NULL,
client->view->cacheacl,
ISC_TRUE) == ISC_R_SUCCESS &&
- ns_client_checkaclsilent(client, &client->interface->addr,
+ ns_client_checkaclsilent(client, &client->destaddr,
client->view->recursiononacl,
ISC_TRUE) == ISC_R_SUCCESS &&
- ns_client_checkaclsilent(client, &client->interface->addr,
+ ns_client_checkaclsilent(client, &client->destaddr,
client->view->cacheonacl,
ISC_TRUE) == ISC_R_SUCCESS)
ra = ISC_TRUE;
@@ -2600,12 +2608,12 @@ ns_client_getsockaddr(ns_client_t *client) {
}
isc_result_t
-ns_client_checkaclsilent(ns_client_t *client, isc_sockaddr_t *sockaddr,
+ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
dns_acl_t *acl, isc_boolean_t default_allow)
{
isc_result_t result;
+ isc_netaddr_t tmpnetaddr;
int match;
- isc_netaddr_t netaddr;
if (acl == NULL) {
if (default_allow)
@@ -2614,15 +2622,13 @@ ns_client_checkaclsilent(ns_client_t *client, isc_sockaddr_t *sockaddr,
goto deny;
}
+ if (netaddr == NULL) {
+ isc_netaddr_fromsockaddr(&tmpnetaddr, &client->peeraddr);
+ netaddr = &tmpnetaddr;
+ }
- if (sockaddr == NULL)
- isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
- else
- isc_netaddr_fromsockaddr(&netaddr, sockaddr);
-
- result = dns_acl_match(&netaddr, client->signer, acl,
- &ns_g_server->aclenv,
- &match, NULL);
+ result = dns_acl_match(netaddr, client->signer, acl,
+ &ns_g_server->aclenv, &match, NULL);
if (result != ISC_R_SUCCESS)
goto deny; /* Internal error, already logged. */
@@ -2642,8 +2648,14 @@ ns_client_checkacl(ns_client_t *client, isc_sockaddr_t *sockaddr,
const char *opname, dns_acl_t *acl,
isc_boolean_t default_allow, int log_level)
{
- isc_result_t result =
- ns_client_checkaclsilent(client, sockaddr, acl, default_allow);
+ isc_result_t result;
+ isc_netaddr_t netaddr;
+
+ if (sockaddr != NULL)
+ isc_netaddr_fromsockaddr(&netaddr, sockaddr);
+
+ result = ns_client_checkaclsilent(client, sockaddr ? &netaddr : NULL,
+ acl, default_allow);
if (result == ISC_R_SUCCESS)
ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
@@ -2753,9 +2765,14 @@ void
ns_client_dumprecursing(FILE *f, ns_clientmgr_t *manager) {
ns_client_t *client;
char namebuf[DNS_NAME_FORMATSIZE];
+ char original[DNS_NAME_FORMATSIZE];
char peerbuf[ISC_SOCKADDR_FORMATSIZE];
+ char typebuf[DNS_RDATATYPE_FORMATSIZE];
+ char classbuf[DNS_RDATACLASS_FORMATSIZE];
const char *name;
const char *sep;
+ const char *origfor;
+ dns_rdataset_t *rdataset;
REQUIRE(VALID_MANAGER(manager));
@@ -2773,8 +2790,31 @@ ns_client_dumprecursing(FILE *f, ns_clientmgr_t *manager) {
sep = "";
}
dns_name_format(client->query.qname, namebuf, sizeof(namebuf));
- fprintf(f, "; client %s%s%s: '%s' requesttime %d\n",
- peerbuf, sep, name, namebuf, client->requesttime);
+ if (client->query.qname != client->query.origqname &&
+ client->query.origqname != NULL) {
+ origfor = " for ";
+ dns_name_format(client->query.origqname, original,
+ sizeof(original));
+ } else {
+ origfor = "";
+ original[0] = '\0';
+ }
+ rdataset = ISC_LIST_HEAD(client->query.qname->list);
+ if (rdataset == NULL && client->query.origqname != NULL)
+ rdataset = ISC_LIST_HEAD(client->query.origqname->list);
+ if (rdataset != NULL) {
+ dns_rdatatype_format(rdataset->type, typebuf,
+ sizeof(typebuf));
+ dns_rdataclass_format(rdataset->rdclass, classbuf,
+ sizeof(classbuf));
+ } else {
+ strcpy(typebuf, "-");
+ strcpy(classbuf, "-");
+ }
+ fprintf(f, "; client %s%s%s: id %u '%s/%s/%s'%s%s "
+ "requesttime %d\n", peerbuf, sep, name,
+ client->message->id, namebuf, typebuf, classbuf,
+ origfor, original, client->requesttime);
client = ISC_LIST_NEXT(client, link);
}
UNLOCK(&manager->lock);
diff --git a/contrib/bind9/bin/named/config.c b/contrib/bind9/bin/named/config.c
index 43d0e52..704d7ecc 100644
--- a/contrib/bind9/bin/named/config.c
+++ b/contrib/bind9/bin/named/config.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: config.c,v 1.93.14.2 2009-03-17 23:47:28 tbox Exp $ */
+/* $Id: config.c,v 1.113.16.1.2.1 2011-06-02 23:47:28 tbox Exp $ */
/*! \file */
@@ -42,9 +42,13 @@
#include <dns/tsig.h>
#include <dns/zone.h>
+#include <dst/dst.h>
+
#include <named/config.h>
#include <named/globals.h>
+#include "bind.keys.h"
+
/*% default configuration */
static char defaultconf[] = "\
options {\n\
@@ -55,7 +59,10 @@ options {\n\
files unlimited;\n\
stacksize default;\n"
#endif
-" deallocate-on-exit true;\n\
+"# session-keyfile \"" NS_LOCALSTATEDIR "/run/named/session.key\";\n\
+ session-keyname local-ddns;\n\
+ session-keyalg hmac-sha256;\n\
+ deallocate-on-exit true;\n\
# directory <none>\n\
dump-file \"named_dump.db\";\n\
fake-iquery no;\n\
@@ -70,8 +77,10 @@ options {\n\
multiple-cnames no;\n\
# named-xfer <obsolete>;\n\
# pid-file \"" NS_LOCALSTATEDIR "/run/named/named.pid\"; /* or /lwresd.pid */\n\
+ bindkeys-file \"" NS_SYSCONFDIR "/bind.keys\";\n\
port 53;\n\
recursing-file \"named.recursing\";\n\
+ secroots-file \"named.secroots\";\n\
"
#ifdef PATH_RANDOMDEV
"\
@@ -80,6 +89,7 @@ options {\n\
#endif
"\
recursive-clients 1000;\n\
+ resolver-query-timeout 30;\n\
rrset-order {type NS order random; order cyclic; };\n\
serial-queries 20;\n\
serial-query-rate 20;\n\
@@ -102,6 +112,9 @@ options {\n\
request-nsid false;\n\
reserved-sockets 512;\n\
\n\
+ /* DLV */\n\
+ dnssec-lookaside . trust-anchor dlv.isc.org;\n\
+\n\
/* view */\n\
allow-notify {none;};\n\
allow-update-forwarding {none;};\n\
@@ -135,6 +148,7 @@ options {\n\
check-names master fail;\n\
check-names slave warn;\n\
check-names response ignore;\n\
+ check-dup-records warn;\n\
check-mx warn;\n\
acache-enable no;\n\
acache-cleaning-interval 60;\n\
@@ -146,7 +160,13 @@ options {\n\
max-clients-per-query 100;\n\
zero-no-soa-ttl-cache no;\n\
nsec3-test-zone no;\n\
+ allow-new-zones no;\n\
+"
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+" filter-aaaa-on-v4 no;\n\
+ filter-aaaa { any; };\n\
"
+#endif
" /* zone */\n\
allow-query {any;};\n\
@@ -174,6 +194,7 @@ options {\n\
max-refresh-time 2419200; /* 4 weeks */\n\
min-refresh-time 300;\n\
multi-master no;\n\
+ dnssec-secure-to-insecure no;\n\
sig-validity-interval 30; /* days */\n\
sig-signing-nodes 100;\n\
sig-signing-signatures 10;\n\
@@ -188,6 +209,7 @@ options {\n\
check-srv-cname warn;\n\
zero-no-soa-ttl yes;\n\
update-check-ksk yes;\n\
+ dnssec-dnskey-kskonly no;\n\
try-tcp-refresh yes; /* BIND 8 compat */\n\
};\n\
"
@@ -198,6 +220,7 @@ options {\n\
view \"_bind\" chaos {\n\
recursion no;\n\
notify no;\n\
+ allow-new-zones no;\n\
\n\
zone \"version.bind\" chaos {\n\
type master;\n\
@@ -213,11 +236,24 @@ view \"_bind\" chaos {\n\
type master;\n\
database \"_builtin authors\";\n\
};\n\
+\n\
zone \"id.server\" chaos {\n\
type master;\n\
database \"_builtin id\";\n\
};\n\
};\n\
+"
+"#\n\
+# Default trusted key(s) for builtin DLV support\n\
+# (used if \"dnssec-lookaside auto;\" is set and\n\
+# sysconfdir/bind.keys doesn't exist).\n\
+#\n\
+# BEGIN MANAGED KEYS\n"
+
+/* Imported from bind.keys.h: */
+MANAGED_KEYS
+
+"# END MANAGED KEYS\n\
";
isc_result_t
@@ -339,6 +375,8 @@ ns_config_getzonetype(const cfg_obj_t *zonetypeobj) {
ztype = dns_zone_slave;
else if (strcasecmp(str, "stub") == 0)
ztype = dns_zone_stub;
+ else if (strcasecmp(str, "static-stub") == 0)
+ ztype = dns_zone_staticstub;
else
INSIST(0);
return (ztype);
@@ -615,7 +653,7 @@ ns_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
isc_buffer_add(&b, strlen(keystr));
dns_fixedname_init(&fname);
result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
goto cleanup;
result = dns_name_dup(dns_fixedname_name(&fname), mctx,
@@ -747,23 +785,31 @@ struct keyalgorithms {
const char *str;
enum { hmacnone, hmacmd5, hmacsha1, hmacsha224,
hmacsha256, hmacsha384, hmacsha512 } hmac;
+ unsigned int type;
isc_uint16_t size;
} algorithms[] = {
- { "hmac-md5", hmacmd5, 128 },
- { "hmac-md5.sig-alg.reg.int", hmacmd5, 0 },
- { "hmac-md5.sig-alg.reg.int.", hmacmd5, 0 },
- { "hmac-sha1", hmacsha1, 160 },
- { "hmac-sha224", hmacsha224, 224 },
- { "hmac-sha256", hmacsha256, 256 },
- { "hmac-sha384", hmacsha384, 384 },
- { "hmac-sha512", hmacsha512, 512 },
- { NULL, hmacnone, 0 }
+ { "hmac-md5", hmacmd5, DST_ALG_HMACMD5, 128 },
+ { "hmac-md5.sig-alg.reg.int", hmacmd5, DST_ALG_HMACMD5, 0 },
+ { "hmac-md5.sig-alg.reg.int.", hmacmd5, DST_ALG_HMACMD5, 0 },
+ { "hmac-sha1", hmacsha1, DST_ALG_HMACSHA1, 160 },
+ { "hmac-sha224", hmacsha224, DST_ALG_HMACSHA224, 224 },
+ { "hmac-sha256", hmacsha256, DST_ALG_HMACSHA256, 256 },
+ { "hmac-sha384", hmacsha384, DST_ALG_HMACSHA384, 384 },
+ { "hmac-sha512", hmacsha512, DST_ALG_HMACSHA512, 512 },
+ { NULL, hmacnone, DST_ALG_UNKNOWN, 0 }
};
isc_result_t
ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
isc_uint16_t *digestbits)
{
+ return (ns_config_getkeyalgorithm2(str, name, NULL, digestbits));
+}
+
+isc_result_t
+ns_config_getkeyalgorithm2(const char *str, dns_name_t **name,
+ unsigned int *typep, isc_uint16_t *digestbits)
+{
int i;
size_t len = 0;
isc_uint16_t bits;
@@ -801,6 +847,8 @@ ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
INSIST(0);
}
}
+ if (typep != NULL)
+ *typep = algorithms[i].type;
if (digestbits != NULL)
*digestbits = bits;
return (ISC_R_SUCCESS);
diff --git a/contrib/bind9/bin/named/control.c b/contrib/bind9/bin/named/control.c
index 38115d6..3fc7bd3 100644
--- a/contrib/bind9/bin/named/control.c
+++ b/contrib/bind9/bin/named/control.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: control.c,v 1.33.266.4 2010-12-03 23:45:46 tbox Exp $ */
+/* $Id: control.c,v 1.41 2010-12-03 22:05:19 each Exp $ */
/*! \file */
@@ -158,6 +158,8 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) {
} else if (command_compare(command, NS_COMMAND_DUMPDB)) {
ns_server_dumpdb(ns_g_server, command);
result = ISC_R_SUCCESS;
+ } else if (command_compare(command, NS_COMMAND_SECROOTS)) {
+ result = ns_server_dumpsecroots(ns_g_server, command);
} else if (command_compare(command, NS_COMMAND_TRACE)) {
result = ns_server_setdebuglevel(ns_g_server, command);
} else if (command_compare(command, NS_COMMAND_NOTRACE)) {
@@ -192,6 +194,13 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) {
result = ns_server_notifycommand(ns_g_server, command, text);
} else if (command_compare(command, NS_COMMAND_VALIDATION)) {
result = ns_server_validation(ns_g_server, command);
+ } else if (command_compare(command, NS_COMMAND_SIGN) ||
+ command_compare(command, NS_COMMAND_LOADKEYS)) {
+ result = ns_server_rekey(ns_g_server, command);
+ } else if (command_compare(command, NS_COMMAND_ADDZONE)) {
+ result = ns_server_add_zone(ns_g_server, command);
+ } else if (command_compare(command, NS_COMMAND_DELZONE)) {
+ result = ns_server_del_zone(ns_g_server, command);
} else {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_CONTROL, ISC_LOG_WARNING,
diff --git a/contrib/bind9/bin/named/include/named/client.h b/contrib/bind9/bin/named/include/named/client.h
index 5ad9c6b..33f124d 100644
--- a/contrib/bind9/bin/named/include/named/client.h
+++ b/contrib/bind9/bin/named/include/named/client.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: client.h,v 1.86.120.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: client.h,v 1.91 2009-10-26 23:14:53 each Exp $ */
#ifndef NAMED_CLIENT_H
#define NAMED_CLIENT_H 1
@@ -138,6 +138,7 @@ struct ns_client {
ns_interface_t *interface;
isc_sockaddr_t peeraddr;
isc_boolean_t peeraddr_valid;
+ isc_netaddr_t destaddr;
struct in6_pktinfo pktinfo;
isc_event_t ctlevent;
/*%
@@ -167,6 +168,10 @@ struct ns_client {
#define NS_CLIENTATTR_MULTICAST 0x08 /*%< recv'd from multicast */
#define NS_CLIENTATTR_WANTDNSSEC 0x10 /*%< include dnssec records */
#define NS_CLIENTATTR_WANTNSID 0x20 /*%< include nameserver ID */
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+#define NS_CLIENTATTR_FILTER_AAAA 0x40 /*%< suppress AAAAs */
+#define NS_CLIENTATTR_FILTER_AAAA_RC 0x80 /*%< recursing for A against AAAA */
+#endif
extern unsigned int ns_client_requests;
@@ -274,10 +279,8 @@ ns_client_getsockaddr(ns_client_t *client);
*/
isc_result_t
-ns_client_checkaclsilent(ns_client_t *client,
- isc_sockaddr_t *sockaddr,
- dns_acl_t *acl,
- isc_boolean_t default_allow);
+ns_client_checkaclsilent(ns_client_t *client, isc_netaddr_t *netaddr,
+ dns_acl_t *acl, isc_boolean_t default_allow);
/*%
* Convenience function for client request ACL checking.
@@ -296,12 +299,12 @@ ns_client_checkaclsilent(ns_client_t *client,
*
* Requires:
*\li 'client' points to a valid client.
- *\li 'sockaddr' points to a valid address, or is NULL.
+ *\li 'netaddr' points to a valid address, or is NULL.
*\li 'acl' points to a valid ACL, or is NULL.
*
* Returns:
*\li ISC_R_SUCCESS if the request should be allowed
- * \li ISC_R_REFUSED if the request should be denied
+ * \li DNS_R_REFUSED if the request should be denied
*\li No other return values are possible.
*/
diff --git a/contrib/bind9/bin/named/include/named/config.h b/contrib/bind9/bin/named/include/named/config.h
index fa96d32..d1570b0 100644
--- a/contrib/bind9/bin/named/include/named/config.h
+++ b/contrib/bind9/bin/named/include/named/config.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: config.h,v 1.14 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: config.h,v 1.16 2009-06-11 23:47:55 tbox Exp $ */
#ifndef NAMED_CONFIG_H
#define NAMED_CONFIG_H 1
@@ -75,5 +75,8 @@ ns_config_getport(const cfg_obj_t *config, in_port_t *portp);
isc_result_t
ns_config_getkeyalgorithm(const char *str, dns_name_t **name,
isc_uint16_t *digestbits);
+isc_result_t
+ns_config_getkeyalgorithm2(const char *str, dns_name_t **name,
+ unsigned int *typep, isc_uint16_t *digestbits);
#endif /* NAMED_CONFIG_H */
diff --git a/contrib/bind9/bin/named/include/named/control.h b/contrib/bind9/bin/named/include/named/control.h
index 436fb19..e699892 100644
--- a/contrib/bind9/bin/named/include/named/control.h
+++ b/contrib/bind9/bin/named/include/named/control.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: control.h,v 1.25 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: control.h,v 1.31 2010-08-16 22:21:06 marka Exp $ */
#ifndef NAMED_CONTROL_H
#define NAMED_CONTROL_H 1
@@ -42,6 +42,7 @@
#define NS_COMMAND_DUMPSTATS "stats"
#define NS_COMMAND_QUERYLOG "querylog"
#define NS_COMMAND_DUMPDB "dumpdb"
+#define NS_COMMAND_SECROOTS "secroots"
#define NS_COMMAND_TRACE "trace"
#define NS_COMMAND_NOTRACE "notrace"
#define NS_COMMAND_FLUSH "flush"
@@ -57,6 +58,10 @@
#define NS_COMMAND_NULL "null"
#define NS_COMMAND_NOTIFY "notify"
#define NS_COMMAND_VALIDATION "validation"
+#define NS_COMMAND_SIGN "sign"
+#define NS_COMMAND_LOADKEYS "loadkeys"
+#define NS_COMMAND_ADDZONE "addzone"
+#define NS_COMMAND_DELZONE "delzone"
isc_result_t
ns_controls_create(ns_server_t *server, ns_controls_t **ctrlsp);
diff --git a/contrib/bind9/bin/named/include/named/globals.h b/contrib/bind9/bin/named/include/named/globals.h
index 1d57a18..f155c7f 100644
--- a/contrib/bind9/bin/named/include/named/globals.h
+++ b/contrib/bind9/bin/named/include/named/globals.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: globals.h,v 1.80.12.3 2010-09-15 12:16:50 marka Exp $ */
+/* $Id: globals.h,v 1.89 2010-09-15 12:07:55 marka Exp $ */
#ifndef NAMED_GLOBALS_H
#define NAMED_GLOBALS_H 1
@@ -30,6 +30,8 @@
#include <dns/zone.h>
+#include <dst/dst.h>
+
#include <named/types.h>
#undef EXTERN
@@ -86,8 +88,13 @@ EXTERN cfg_obj_t * ns_g_config INIT(NULL);
EXTERN const cfg_obj_t * ns_g_defaults INIT(NULL);
EXTERN const char * ns_g_conffile INIT(NS_SYSCONFDIR
"/named.conf");
+EXTERN cfg_obj_t * ns_g_bindkeys INIT(NULL);
EXTERN const char * ns_g_keyfile INIT(NS_SYSCONFDIR
"/rndc.key");
+
+EXTERN dns_tsigkey_t * ns_g_sessionkey INIT(NULL);
+EXTERN dns_name_t ns_g_sessionkeyname;
+
EXTERN const char * lwresd_g_conffile INIT(NS_SYSCONFDIR
"/lwresd.conf");
EXTERN const char * lwresd_g_resolvconffile INIT("/etc"
@@ -112,6 +119,10 @@ EXTERN const char * ns_g_chrootdir INIT(NULL);
EXTERN isc_boolean_t ns_g_foreground INIT(ISC_FALSE);
EXTERN isc_boolean_t ns_g_logstderr INIT(ISC_FALSE);
+EXTERN const char * ns_g_defaultsessionkeyfile
+ INIT(NS_LOCALSTATEDIR "/run/named/"
+ "session.key");
+
#if NS_RUN_PID_DIR
EXTERN const char * ns_g_defaultpidfile INIT(NS_LOCALSTATEDIR
"/run/named/"
@@ -128,6 +139,12 @@ EXTERN const char * lwresd_g_defaultpidfile INIT(NS_LOCALSTATEDIR
EXTERN const char * ns_g_username INIT(NULL);
+#ifdef USE_PKCS11
+EXTERN const char * ns_g_engine INIT("pkcs11");
+#else
+EXTERN const char * ns_g_engine INIT(NULL);
+#endif
+
EXTERN int ns_g_listen INIT(3);
EXTERN isc_time_t ns_g_boottime;
EXTERN isc_boolean_t ns_g_memstatistics INIT(ISC_FALSE);
diff --git a/contrib/bind9/bin/named/include/named/log.h b/contrib/bind9/bin/named/include/named/log.h
index 0cfbee9..1ce680f 100644
--- a/contrib/bind9/bin/named/include/named/log.h
+++ b/contrib/bind9/bin/named/include/named/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.25.332.2 2009-01-07 23:47:16 tbox Exp $ */
+/* $Id: log.h,v 1.27 2009-01-07 23:47:46 tbox Exp $ */
#ifndef NAMED_LOG_H
#define NAMED_LOG_H 1
diff --git a/contrib/bind9/bin/named/include/named/lwdclient.h b/contrib/bind9/bin/named/include/named/lwdclient.h
index 44e1fa6..5451b73 100644
--- a/contrib/bind9/bin/named/include/named/lwdclient.h
+++ b/contrib/bind9/bin/named/include/named/lwdclient.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwdclient.h,v 1.18.332.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: lwdclient.h,v 1.20 2009-01-17 23:47:42 tbox Exp $ */
#ifndef NAMED_LWDCLIENT_H
#define NAMED_LWDCLIENT_H 1
diff --git a/contrib/bind9/bin/named/include/named/main.h b/contrib/bind9/bin/named/include/named/main.h
index 96fb23e..6116add 100644
--- a/contrib/bind9/bin/named/include/named/main.h
+++ b/contrib/bind9/bin/named/include/named/main.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,15 +15,16 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: main.h,v 1.15 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: main.h,v 1.17 2009-09-29 23:48:03 tbox Exp $ */
#ifndef NAMED_MAIN_H
#define NAMED_MAIN_H 1
/*! \file */
-void
-ns_main_earlyfatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+ns_main_earlyfatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
void
ns_main_earlywarning(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
diff --git a/contrib/bind9/bin/named/include/named/notify.h b/contrib/bind9/bin/named/include/named/notify.h
index ac7fe2d..34fabcd 100644
--- a/contrib/bind9/bin/named/include/named/notify.h
+++ b/contrib/bind9/bin/named/include/named/notify.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: notify.h,v 1.14.332.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: notify.h,v 1.16 2009-01-17 23:47:42 tbox Exp $ */
#ifndef NAMED_NOTIFY_H
#define NAMED_NOTIFY_H 1
diff --git a/contrib/bind9/bin/named/include/named/query.h b/contrib/bind9/bin/named/include/named/query.h
index 2f00f1e..37f771b 100644
--- a/contrib/bind9/bin/named/include/named/query.h
+++ b/contrib/bind9/bin/named/include/named/query.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: query.h,v 1.40.332.2 2010-09-24 08:30:28 tbox Exp $ */
+/* $Id: query.h,v 1.45 2011-01-13 04:59:24 tbox Exp $ */
#ifndef NAMED_QUERY_H
#define NAMED_QUERY_H 1
@@ -26,6 +26,8 @@
#include <isc/buffer.h>
#include <isc/netaddr.h>
+#include <dns/rdataset.h>
+#include <dns/rpz.h>
#include <dns/types.h>
#include <named/types.h>
@@ -34,6 +36,7 @@
typedef struct ns_dbversion {
dns_db_t *db;
dns_dbversion_t *version;
+ isc_boolean_t acl_checked;
isc_boolean_t queryok;
ISC_LINK(struct ns_dbversion) link;
} ns_dbversion_t;
@@ -54,9 +57,16 @@ struct ns_query {
isc_boolean_t isreferral;
isc_mutex_t fetchlock;
dns_fetch_t * fetch;
+ dns_rpz_st_t * rpz_st;
isc_bufferlist_t namebufs;
ISC_LIST(ns_dbversion_t) activeversions;
ISC_LIST(ns_dbversion_t) freeversions;
+ dns_rdataset_t * dns64_aaaa;
+ dns_rdataset_t * dns64_sigaaaa;
+ isc_boolean_t * dns64_aaaaok;
+ unsigned int dns64_aaaaoklen;
+ unsigned int dns64_options;
+ unsigned int dns64_ttl;
};
#define NS_QUERYATTR_RECURSIONOK 0x0001
@@ -73,6 +83,9 @@ struct ns_query {
#define NS_QUERYATTR_NOADDITIONAL 0x0800
#define NS_QUERYATTR_CACHEACLOKVALID 0x1000
#define NS_QUERYATTR_CACHEACLOK 0x2000
+#define NS_QUERYATTR_DNS64 0x4000
+#define NS_QUERYATTR_DNS64EXCLUDE 0x8000
+
isc_result_t
ns_query_init(ns_client_t *client);
diff --git a/contrib/bind9/bin/named/include/named/server.h b/contrib/bind9/bin/named/include/named/server.h
index 3a4c5f7..3c6426e 100644
--- a/contrib/bind9/bin/named/include/named/server.h
+++ b/contrib/bind9/bin/named/include/named/server.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: server.h,v 1.93.120.3 2009-07-11 04:23:53 marka Exp $ */
+/* $Id: server.h,v 1.110 2010-08-16 23:46:52 tbox Exp $ */
#ifndef NAMED_SERVER_H
#define NAMED_SERVER_H 1
@@ -54,6 +54,8 @@ struct ns_server {
dns_acl_t *blackholeacl;
char * statsfile; /*%< Statistics file name */
char * dumpfile; /*%< Dump file name */
+ char * secrootsfile; /*%< Secroots file name */
+ char * bindkeysfile; /*%< bind.keys file name */
char * recfile; /*%< Recursive file name */
isc_boolean_t version_set; /*%< User has set version */
char * version; /*%< User-specified version */
@@ -91,13 +93,14 @@ struct ns_server {
isc_boolean_t flushonshutdown;
isc_boolean_t log_queries; /*%< For BIND 8 compatibility */
- isc_stats_t * nsstats; /*%< Server statistics */
- dns_stats_t * rcvquerystats; /*% Incoming query statistics */
- dns_stats_t * opcodestats; /*%< Incoming message statistics */
- isc_stats_t * zonestats; /*% Zone management statistics */
- isc_stats_t * resolverstats; /*% Resolver statistics */
+ ns_cachelist_t cachelist; /*%< Possibly shared caches */
+ isc_stats_t * nsstats; /*%< Server stats */
+ dns_stats_t * rcvquerystats; /*% Incoming query stats */
+ dns_stats_t * opcodestats; /*%< Incoming message stats */
+ isc_stats_t * zonestats; /*% Zone management stats */
+ isc_stats_t * resolverstats; /*% Resolver stats */
+ isc_stats_t * sockstats; /*%< Socket stats */
- isc_stats_t * sockstats; /*%< Socket statistics */
ns_controls_t * controls; /*%< Control channels */
unsigned int dispatchgen;
ns_dispatchlist_t dispatches;
@@ -105,6 +108,12 @@ struct ns_server {
dns_acache_t *acache;
ns_statschannellist_t statschannels;
+
+ dns_tsigkey_t *sessionkey;
+ char *session_keyfile;
+ dns_name_t *session_keyname;
+ unsigned int session_keyalg;
+ isc_uint16_t session_keybits;
};
#define NS_SERVER_MAGIC ISC_MAGIC('S','V','E','R')
@@ -237,6 +246,12 @@ isc_result_t
ns_server_dumpdb(ns_server_t *server, char *args);
/*%
+ * Dump the current security roots to the secroots file.
+ */
+isc_result_t
+ns_server_dumpsecroots(ns_server_t *server, char *args);
+
+/*%
* Change or increment the server debug level.
*/
isc_result_t
@@ -280,6 +295,16 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
isc_buffer_t *text);
/*%
+ * Update a zone's DNSKEY set from the key repository. If
+ * the command that triggered the call to this function was "sign",
+ * then force a full signing of the zone. If it was "loadkeys",
+ * then don't sign the zone; any needed changes to signatures can
+ * take place incrementally.
+ */
+isc_result_t
+ns_server_rekey(ns_server_t *server, char *args);
+
+/*%
* Dump the current recursive queries.
*/
isc_result_t
@@ -297,4 +322,16 @@ ns_add_reserved_dispatch(ns_server_t *server, const isc_sockaddr_t *addr);
isc_result_t
ns_server_validation(ns_server_t *server, char *args);
+/*%
+ * Add a zone to a running process
+ */
+isc_result_t
+ns_server_add_zone(ns_server_t *server, char *args);
+
+/*%
+ * Deletes a zone from a running process
+ */
+isc_result_t
+ns_server_del_zone(ns_server_t *server, char *args);
+
#endif /* NAMED_SERVER_H */
diff --git a/contrib/bind9/bin/named/include/named/tsigconf.h b/contrib/bind9/bin/named/include/named/tsigconf.h
index a4841ba..4a59ec2 100644
--- a/contrib/bind9/bin/named/include/named/tsigconf.h
+++ b/contrib/bind9/bin/named/include/named/tsigconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsigconf.h,v 1.16 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: tsigconf.h,v 1.18 2009-06-11 23:47:55 tbox Exp $ */
#ifndef NS_TSIGCONF_H
#define NS_TSIGCONF_H 1
@@ -36,8 +36,9 @@ ns_tsigkeyring_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
*
* Requires:
* \li 'config' is not NULL.
+ * \li 'vconfig' is not NULL.
* \li 'mctx' is not NULL
- * \li 'ring' is not NULL, and '*ring' is NULL
+ * \li 'ringp' is not NULL, and '*ringp' is NULL
*
* Returns:
* \li ISC_R_SUCCESS
diff --git a/contrib/bind9/bin/named/include/named/types.h b/contrib/bind9/bin/named/include/named/types.h
index b0729a7..96c4c01 100644
--- a/contrib/bind9/bin/named/include/named/types.h
+++ b/contrib/bind9/bin/named/include/named/types.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.29 2008-01-17 23:46:59 tbox Exp $ */
+/* $Id: types.h,v 1.31 2009-01-09 23:47:45 tbox Exp $ */
#ifndef NAMED_TYPES_H
#define NAMED_TYPES_H 1
@@ -24,6 +24,8 @@
#include <dns/types.h>
+typedef struct ns_cache ns_cache_t;
+typedef ISC_LIST(ns_cache_t) ns_cachelist_t;
typedef struct ns_client ns_client_t;
typedef struct ns_clientmgr ns_clientmgr_t;
typedef struct ns_query ns_query_t;
diff --git a/contrib/bind9/bin/named/include/named/zoneconf.h b/contrib/bind9/bin/named/include/named/zoneconf.h
index ab84c84..65cf72f 100644
--- a/contrib/bind9/bin/named/include/named/zoneconf.h
+++ b/contrib/bind9/bin/named/include/named/zoneconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zoneconf.h,v 1.26 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: zoneconf.h,v 1.28 2010-12-20 23:47:20 tbox Exp $ */
#ifndef NS_ZONECONF_H
#define NS_ZONECONF_H 1
@@ -58,6 +58,21 @@ ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig);
* and recreated, return ISC_FALSE.
*/
+
+isc_result_t
+ns_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone,
+ dns_rdataclass_t rdclass, dns_name_t *name);
+/*%>
+ * configure a DLZ zone, setting up the database methods and calling
+ * postload to load the origin values
+ *
+ * Require:
+ * \li 'dlzdatabase' to be a valid dlz database
+ * \li 'zone' to be initialized.
+ * \li 'rdclass' to be a valid rdataclass
+ * \li 'name' to be a valid zone origin name
+ */
+
ISC_LANG_ENDDECLS
#endif /* NS_ZONECONF_H */
diff --git a/contrib/bind9/bin/named/interfacemgr.c b/contrib/bind9/bin/named/interfacemgr.c
index fad3213..e99d3b9 100644
--- a/contrib/bind9/bin/named/interfacemgr.c
+++ b/contrib/bind9/bin/named/interfacemgr.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: interfacemgr.c,v 1.93.70.2 2009-01-18 23:47:34 tbox Exp $ */
+/* $Id: interfacemgr.c,v 1.95 2009-01-17 23:47:42 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/bin/named/log.c b/contrib/bind9/bin/named/log.c
index 867ad56..5d1c942 100644
--- a/contrib/bind9/bin/named/log.c
+++ b/contrib/bind9/bin/named/log.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.46.334.3 2009-01-07 01:50:14 jinmei Exp $ */
+/* $Id: log.c,v 1.49 2009-01-07 01:46:40 jinmei Exp $ */
/*! \file */
diff --git a/contrib/bind9/bin/named/lwdgabn.c b/contrib/bind9/bin/named/lwdgabn.c
index 66d7246..6a609c9 100644
--- a/contrib/bind9/bin/named/lwdgabn.c
+++ b/contrib/bind9/bin/named/lwdgabn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwdgabn.c,v 1.22 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: lwdgabn.c,v 1.24 2009-09-02 23:48:01 tbox Exp $ */
/*! \file */
@@ -619,7 +619,7 @@ ns_lwdclient_processgabn(ns_lwdclient_t *client, lwres_buffer_t *b) {
dns_fixedname_init(&client->target_name);
dns_fixedname_init(&client->query_name);
result = dns_name_fromtext(dns_fixedname_name(&client->query_name),
- &namebuf, NULL, ISC_FALSE, NULL);
+ &namebuf, NULL, 0, NULL);
if (result != ISC_R_SUCCESS)
goto out;
ns_lwsearchctx_init(&client->searchctx,
diff --git a/contrib/bind9/bin/named/lwdgrbn.c b/contrib/bind9/bin/named/lwdgrbn.c
index bf29a48..22b62c6 100644
--- a/contrib/bind9/bin/named/lwdgrbn.c
+++ b/contrib/bind9/bin/named/lwdgrbn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwdgrbn.c,v 1.20 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: lwdgrbn.c,v 1.22 2009-09-02 23:48:01 tbox Exp $ */
/*! \file */
@@ -472,7 +472,7 @@ ns_lwdclient_processgrbn(ns_lwdclient_t *client, lwres_buffer_t *b) {
dns_fixedname_init(&client->query_name);
result = dns_name_fromtext(dns_fixedname_name(&client->query_name),
- &namebuf, NULL, ISC_FALSE, NULL);
+ &namebuf, NULL, 0, NULL);
if (result != ISC_R_SUCCESS)
goto out;
ns_lwsearchctx_init(&client->searchctx,
diff --git a/contrib/bind9/bin/named/lwresd.8 b/contrib/bind9/bin/named/lwresd.8
index d1e760d..30dfbd5 100644
--- a/contrib/bind9/bin/named/lwresd.8
+++ b/contrib/bind9/bin/named/lwresd.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwresd.8,v 1.29.14.2 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwresd.8,v 1.31 2009-07-11 01:12:45 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/named/lwresd.c b/contrib/bind9/bin/named/lwresd.c
index b7dc0af..ad36709 100644
--- a/contrib/bind9/bin/named/lwresd.c
+++ b/contrib/bind9/bin/named/lwresd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwresd.c,v 1.58 2008-07-23 23:27:54 marka Exp $ */
+/* $Id: lwresd.c,v 1.60 2009-09-02 23:48:01 tbox Exp $ */
/*! \file
* \brief
@@ -372,8 +372,7 @@ ns_lwdmanager_create(isc_mem_t *mctx, const cfg_obj_t *lwres,
strlen(searchstr));
isc_buffer_add(&namebuf, strlen(searchstr));
result = dns_name_fromtext(name, &namebuf,
- dns_rootname, ISC_FALSE,
- NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
isc_log_write(ns_g_lctx,
NS_LOGCATEGORY_GENERAL,
diff --git a/contrib/bind9/bin/named/lwresd.docbook b/contrib/bind9/bin/named/lwresd.docbook
index f8e1500..934b5da 100644
--- a/contrib/bind9/bin/named/lwresd.docbook
+++ b/contrib/bind9/bin/named/lwresd.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwresd.docbook,v 1.18.14.2 2009-01-22 23:47:05 tbox Exp $ -->
+<!-- $Id: lwresd.docbook,v 1.20 2009-01-20 23:47:56 tbox Exp $ -->
<refentry>
<refentryinfo>
<date>June 30, 2000</date>
diff --git a/contrib/bind9/bin/named/lwresd.html b/contrib/bind9/bin/named/lwresd.html
index dec47ca..223b1c2 100644
--- a/contrib/bind9/bin/named/lwresd.html
+++ b/contrib/bind9/bin/named/lwresd.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwresd.html,v 1.25.14.2 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwresd.html,v 1.27 2009-07-11 01:12:45 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/named/main.c b/contrib/bind9/bin/named/main.c
index a1d94ff..84d86b1 100644
--- a/contrib/bind9/bin/named/main.c
+++ b/contrib/bind9/bin/named/main.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: main.c,v 1.166.34.7 2010-09-15 12:16:49 marka Exp $ */
+/* $Id: main.c,v 1.180 2010-12-22 03:59:02 marka Exp $ */
/*! \file */
@@ -26,6 +26,7 @@
#include <string.h>
#include <isc/app.h>
+#include <isc/backtrace.h>
#include <isc/commandline.h>
#include <isc/dir.h>
#include <isc/entropy.h>
@@ -69,6 +70,12 @@
#include <named/ns_smf_globals.h>
#endif
+#ifdef OPENSSL
+#include <openssl/opensslv.h>
+#endif
+#ifdef HAVE_LIBXML2
+#include <libxml/xmlversion.h>
+#endif
/*
* Include header files for database drivers here.
*/
@@ -81,12 +88,20 @@
#include <dlz/dlz_drivers.h>
#endif
+/*
+ * The maximum number of stack frames to dump on assertion failure.
+ */
+#ifndef BACKTRACE_MAXFRAME
+#define BACKTRACE_MAXFRAME 128
+#endif
+
static isc_boolean_t want_stats = ISC_FALSE;
static char program_name[ISC_DIR_NAMEMAX] = "named";
static char absolute_conffile[ISC_DIR_PATHMAX];
static char saved_command_line[512];
static char version[512];
static unsigned int maxsocks = 0;
+static int maxudp = 0;
void
ns_main_earlywarning(const char *format, ...) {
@@ -129,10 +144,20 @@ ns_main_earlyfatal(const char *format, ...) {
exit(1);
}
+ISC_PLATFORM_NORETURN_PRE static void
+assertion_failed(const char *file, int line, isc_assertiontype_t type,
+ const char *cond) ISC_PLATFORM_NORETURN_POST;
+
static void
assertion_failed(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
+ void *tracebuf[BACKTRACE_MAXFRAME];
+ int i, nframes;
+ isc_result_t result;
+ const char *logsuffix = "";
+ const char *fname;
+
/*
* Handle assertion failures.
*/
@@ -144,10 +169,40 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
*/
isc_assertion_setcallback(NULL);
+ result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME,
+ &nframes);
+ if (result == ISC_R_SUCCESS && nframes > 0)
+ logsuffix = ", back trace";
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
- "%s:%d: %s(%s) failed", file, line,
- isc_assertion_typetotext(type), cond);
+ "%s:%d: %s(%s) failed%s", file, line,
+ isc_assertion_typetotext(type), cond, logsuffix);
+ if (result == ISC_R_SUCCESS) {
+ for (i = 0; i < nframes; i++) {
+ unsigned long offset;
+
+ fname = NULL;
+ result = isc_backtrace_getsymbol(tracebuf[i],
+ &fname,
+ &offset);
+ if (result == ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN,
+ ISC_LOG_CRITICAL,
+ "#%d %p in %s()+0x%lx", i,
+ tracebuf[i], fname,
+ offset);
+ } else {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN,
+ ISC_LOG_CRITICAL,
+ "#%d %p in ??", i,
+ tracebuf[i]);
+ }
+ }
+ }
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
"exiting (due to assertion failure)");
@@ -162,9 +217,10 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
exit(1);
}
-static void
+ISC_PLATFORM_NORETURN_PRE static void
library_fatal_error(const char *file, int line, const char *format,
- va_list args) ISC_FORMAT_PRINTF(3, 0);
+ va_list args)
+ISC_FORMAT_PRINTF(3, 0) ISC_PLATFORM_NORETURN_POST;
static void
library_fatal_error(const char *file, int line, const char *format,
@@ -248,8 +304,9 @@ usage(void) {
}
fprintf(stderr,
"usage: named [-4|-6] [-c conffile] [-d debuglevel] "
- "[-f|-g] [-n number_of_cpus]\n"
- " [-p port] [-s] [-t chrootdir] [-u username]\n"
+ "[-E engine] [-f|-g]\n"
+ " [-n number_of_cpus] [-p port] [-s] "
+ "[-t chrootdir] [-u username]\n"
" [-m {usage|trace|record|size|mctx}]\n");
}
@@ -358,7 +415,7 @@ parse_command_line(int argc, char *argv[]) {
isc_commandline_errprint = ISC_FALSE;
while ((ch = isc_commandline_parse(argc, argv,
- "46c:C:d:fgi:lm:n:N:p:P:"
+ "46c:C:d:E:fFgi:lm:n:N:p:P:"
"sS:t:T:u:vVx:")) != -1) {
switch (ch) {
case '4':
@@ -394,6 +451,9 @@ parse_command_line(int argc, char *argv[]) {
ns_g_debuglevel = parse_int(isc_commandline_argument,
"debug level");
break;
+ case 'E':
+ ns_g_engine = isc_commandline_argument;
+ break;
case 'f':
ns_g_foreground = ISC_TRUE;
break;
@@ -451,12 +511,16 @@ parse_command_line(int argc, char *argv[]) {
* clienttest: make clients single shot with their
* own memory context.
*/
- if (strcmp(isc_commandline_argument, "clienttest") == 0)
+ if (!strcmp(isc_commandline_argument, "clienttest"))
ns_g_clienttest = ISC_TRUE;
else if (!strcmp(isc_commandline_argument, "nosoa"))
ns_g_nosoa = ISC_TRUE;
else if (!strcmp(isc_commandline_argument, "noaa"))
ns_g_noaa = ISC_TRUE;
+ else if (!strcmp(isc_commandline_argument, "maxudp512"))
+ maxudp = 512;
+ else if (!strcmp(isc_commandline_argument, "maxudp1460"))
+ maxudp = 1460;
else
fprintf(stderr, "unknown -T flag '%s\n",
isc_commandline_argument);
@@ -470,13 +534,25 @@ parse_command_line(int argc, char *argv[]) {
case 'V':
printf("BIND %s built with %s\n", ns_g_version,
ns_g_configargs);
+#ifdef OPENSSL
+ printf("using OpenSSL version: %s\n",
+ OPENSSL_VERSION_TEXT);
+#endif
+#ifdef HAVE_LIBXML2
+ printf("using libxml2 version: %s\n",
+ LIBXML_DOTTED_VERSION);
+#endif
exit(0);
+ case 'F':
+ /* Reserved for FIPS mode */
+ /* FALLTHROUGH */
case '?':
usage();
if (isc_commandline_option == '?')
exit(0);
ns_main_earlyfatal("unknown option '-%c'",
isc_commandline_option);
+ /* FALLTHROUGH */
default:
ns_main_earlyfatal("parsing options returned %d", ch);
}
@@ -529,6 +605,7 @@ create_managers(void) {
isc_result_totext(result));
return (ISC_R_UNEXPECTED);
}
+ isc__socketmgr_maxudp(ns_g_socketmgr, maxudp);
result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &socks);
if (result == ISC_R_SUCCESS) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
@@ -579,6 +656,34 @@ destroy_managers(void) {
}
static void
+dump_symboltable() {
+ int i;
+ isc_result_t result;
+ const char *fname;
+ const void *addr;
+
+ if (isc__backtrace_nsymbols == 0)
+ return;
+
+ if (!isc_log_wouldlog(ns_g_lctx, ISC_LOG_DEBUG(99)))
+ return;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
+ ISC_LOG_DEBUG(99), "Symbol table:");
+
+ for (i = 0, result = ISC_R_SUCCESS; result == ISC_R_SUCCESS; i++) {
+ addr = NULL;
+ fname = NULL;
+ result = isc_backtrace_getsymbolfromindex(i, &addr, &fname);
+ if (result == ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_MAIN, ISC_LOG_DEBUG(99),
+ "[%d] %p %s", i, addr, fname);
+ }
+ }
+}
+
+static void
setup(void) {
isc_result_t result;
isc_resourcevalue_t old_openfiles;
@@ -685,6 +790,8 @@ setup(void) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
ISC_LOG_NOTICE, "built with %s", ns_g_configargs);
+ dump_symboltable();
+
/*
* Get the initial resource limits.
*/
@@ -723,8 +830,8 @@ setup(void) {
absolute_conffile,
sizeof(absolute_conffile));
if (result != ISC_R_SUCCESS)
- ns_main_earlyfatal("could not construct absolute path of "
- "configuration file: %s",
+ ns_main_earlyfatal("could not construct absolute path "
+ "of configuration file: %s",
isc_result_totext(result));
ns_g_conffile = absolute_conffile;
}
@@ -896,6 +1003,9 @@ main(int argc, char *argv[]) {
if (strcmp(program_name, "lwresd") == 0)
ns_g_lwresdonly = ISC_TRUE;
+ if (result != ISC_R_SUCCESS)
+ ns_main_earlyfatal("failed to build internal symbol table");
+
isc_assertion_setcallback(assertion_failed);
isc_error_setfatal(library_fatal_error);
isc_error_setunexpected(library_unexpected_error);
diff --git a/contrib/bind9/bin/named/named.8 b/contrib/bind9/bin/named/named.8
index 90782ed..23805b0 100644
--- a/contrib/bind9/bin/named/named.8
+++ b/contrib/bind9/bin/named/named.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named.8,v 1.38.14.2 2009-12-03 05:06:38 tbox Exp $
+.\" $Id: named.8,v 1.41 2009-10-06 01:14:41 tbox Exp $
.\"
.hy 0
.ad l
@@ -33,7 +33,7 @@
named \- Internet domain name server
.SH "SYNOPSIS"
.HP 6
-\fBnamed\fR [\fB\-4\fR] [\fB\-6\fR] [\fB\-c\ \fR\fB\fIconfig\-file\fR\fR] [\fB\-d\ \fR\fB\fIdebug\-level\fR\fR] [\fB\-f\fR] [\fB\-g\fR] [\fB\-m\ \fR\fB\fIflag\fR\fR] [\fB\-n\ \fR\fB\fI#cpus\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-s\fR] [\fB\-S\ \fR\fB\fI#max\-socks\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-x\ \fR\fB\fIcache\-file\fR\fR]
+\fBnamed\fR [\fB\-4\fR] [\fB\-6\fR] [\fB\-c\ \fR\fB\fIconfig\-file\fR\fR] [\fB\-d\ \fR\fB\fIdebug\-level\fR\fR] [\fB\-E\ \fR\fB\fIengine\-name\fR\fR] [\fB\-f\fR] [\fB\-g\fR] [\fB\-m\ \fR\fB\fIflag\fR\fR] [\fB\-n\ \fR\fB\fI#cpus\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-s\fR] [\fB\-S\ \fR\fB\fI#max\-socks\fR\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-x\ \fR\fB\fIcache\-file\fR\fR]
.SH "DESCRIPTION"
.PP
\fBnamed\fR
@@ -83,6 +83,13 @@ Set the daemon's debug level to
become more verbose as the debug level increases.
.RE
.PP
+\-E \fIengine\-name\fR
+.RS 4
+Use a crypto hardware (OpenSSL engine) for the crypto operations it supports, for instance re\-signing with private keys from a secure key store. When compiled with PKCS#11 support
+\fIengine\-name\fR
+defaults to pkcs11, the empty name resets it to no engine.
+.RE
+.PP
\-f
.RS 4
Run the server in the foreground (i.e. do not daemonize).
diff --git a/contrib/bind9/bin/named/named.conf.5 b/contrib/bind9/bin/named/named.conf.5
index cd0d4ad..9dc7002b 100644
--- a/contrib/bind9/bin/named/named.conf.5
+++ b/contrib/bind9/bin/named/named.conf.5
@@ -1,4 +1,4 @@
-.\" Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
.\"
.\" Permission to use, copy, modify, and/or distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
@@ -12,7 +12,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: named.conf.5,v 1.36.48.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: named.conf.5,v 1.44.12.1 2011-02-03 12:29:12 tbox Exp $
.\"
.hy 0
.ad l
@@ -102,6 +102,15 @@ trusted\-keys {
};
.fi
.RE
+.SH "MANAGED\-KEYS"
+.sp
+.RS 4
+.nf
+managed\-keys {
+ \fIdomain_name\fR \fBinitial\-key\fR \fIflags\fR \fIprotocol\fR \fIalgorithm\fR \fIkey\fR; ...
+};
+.fi
+.RE
.SH "CONTROLS"
.sp
.RS 4
@@ -186,6 +195,7 @@ options {
tcp\-listen\-queue \fIinteger\fR;
tkey\-dhkey \fIquoted_string\fR \fIinteger\fR;
tkey\-gssapi\-credential \fIquoted_string\fR;
+ tkey\-gssapi\-keytab \fIquoted_string\fR;
tkey\-domain \fIquoted_string\fR;
transfers\-per\-ns \fIinteger\fR;
transfers\-in \fIinteger\fR;
@@ -214,6 +224,7 @@ options {
queryport\-pool\-ports \fIinteger\fR;
queryport\-pool\-updateinterval \fIinteger\fR;
cleaning\-interval \fIinteger\fR;
+ resolver\-query\-timeout \fIinteger\fR;
min\-roots \fIinteger\fR; // not implemented
lame\-ttl \fIinteger\fR;
max\-ncache\-ttl \fIinteger\fR;
@@ -244,8 +255,19 @@ options {
dnssec\-enable \fIboolean\fR;
dnssec\-validation \fIboolean\fR;
dnssec\-lookaside \fIstring\fR trust\-anchor \fIstring\fR;
+ dnssec\-lookaside ( \fIauto\fR | \fIdomain\fR trust\-anchor \fIdomain\fR );
dnssec\-must\-be\-secure \fIstring\fR \fIboolean\fR;
dnssec\-accept\-expired \fIboolean\fR;
+ dns64\-server \fIstring\fR;
+ dns64\-contact \fIstring\fR;
+ dns64 \fIprefix\fR {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break\-dnssec \fIboolean\fR;
+ recursive\-only \fIboolean\fR;
+ suffix \fIipv6_address\fR;
+ };
empty\-server \fIstring\fR;
empty\-contact \fIstring\fR;
empty\-zones\-enable \fIboolean\fR;
@@ -260,6 +282,7 @@ options {
allow\-update { \fIaddress_match_element\fR; ... };
allow\-update\-forwarding { \fIaddress_match_element\fR; ... };
update\-check\-ksk \fIboolean\fR;
+ dnssec\-dnskey\-kskonly \fIboolean\fR;
masterfile\-format ( text | raw );
notify \fInotifytype\fR;
notify\-source ( \fIipv4_address\fR | * ) [ port ( \fIinteger\fR | * ) ];
@@ -299,9 +322,18 @@ options {
use\-alt\-transfer\-source \fIboolean\fR;
zone\-statistics \fIboolean\fR;
key\-directory \fIquoted_string\fR;
+ managed\-keys\-directory \fIquoted_string\fR;
+ auto\-dnssec \fBallow\fR|\fBmaintain\fR|\fBcreate\fR|\fBoff\fR;
try\-tcp\-refresh \fIboolean\fR;
zero\-no\-soa\-ttl \fIboolean\fR;
zero\-no\-soa\-ttl\-cache \fIboolean\fR;
+ dnssec\-secure\-to\-insecure \fIboolean\fR;
+ deny\-answer\-addresses {
+ \fIaddress_match_list\fR
+ } [ except\-from { \fInamelist\fR } ];
+ deny\-answer\-aliases {
+ \fInamelist\fR
+ } [ except\-from { \fInamelist\fR } ];
nsec3\-test\-zone \fIboolean\fR; // testing only
allow\-v6\-synthesis { \fIaddress_match_element\fR; ... }; // obsolete
deallocate\-on\-exit \fIboolean\fR; // obsolete
@@ -337,7 +369,8 @@ view \fIstring\fR \fIoptional_class\fR {
...
};
trusted\-keys {
- \fIstring\fR \fIinteger\fR \fIinteger\fR \fIinteger\fR \fIquoted_string\fR; ...
+ \fIstring\fR \fIinteger\fR \fIinteger\fR \fIinteger\fR \fIquoted_string\fR;
+ [...]
};
allow\-recursion { \fIaddress_match_element\fR; ... };
allow\-recursion\-on { \fIaddress_match_element\fR; ... };
@@ -361,6 +394,7 @@ view \fIstring\fR \fIoptional_class\fR {
queryport\-pool\-ports \fIinteger\fR;
queryport\-pool\-updateinterval \fIinteger\fR;
cleaning\-interval \fIinteger\fR;
+ resolver\-query\-timeout \fIinteger\fR;
min\-roots \fIinteger\fR; // not implemented
lame\-ttl \fIinteger\fR;
max\-ncache\-ttl \fIinteger\fR;
@@ -393,6 +427,16 @@ view \fIstring\fR \fIoptional_class\fR {
dnssec\-lookaside \fIstring\fR trust\-anchor \fIstring\fR;
dnssec\-must\-be\-secure \fIstring\fR \fIboolean\fR;
dnssec\-accept\-expired \fIboolean\fR;
+ dns64\-server \fIstring\fR;
+ dns64\-contact \fIstring\fR;
+ dns64 \fIprefix\fR {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break\-dnssec \fIboolean\fR;
+ recursive\-only \fIboolean\fR;
+ suffix \fIipv6_address\fR;
+ };
empty\-server \fIstring\fR;
empty\-contact \fIstring\fR;
empty\-zones\-enable \fIboolean\fR;
@@ -407,6 +451,7 @@ view \fIstring\fR \fIoptional_class\fR {
allow\-update { \fIaddress_match_element\fR; ... };
allow\-update\-forwarding { \fIaddress_match_element\fR; ... };
update\-check\-ksk \fIboolean\fR;
+ dnssec\-dnskey\-kskonly \fIboolean\fR;
masterfile\-format ( text | raw );
notify \fInotifytype\fR;
notify\-source ( \fIipv4_address\fR | * ) [ port ( \fIinteger\fR | * ) ];
@@ -445,6 +490,7 @@ view \fIstring\fR \fIoptional_class\fR {
key\-directory \fIquoted_string\fR;
zero\-no\-soa\-ttl \fIboolean\fR;
zero\-no\-soa\-ttl\-cache \fIboolean\fR;
+ dnssec\-secure\-to\-insecure \fIboolean\fR;
allow\-v6\-synthesis { \fIaddress_match_element\fR; ... }; // obsolete
fetch\-glue \fIboolean\fR; // obsolete
maintain\-ixfr\-base \fIboolean\fR; // obsolete
@@ -476,19 +522,22 @@ zone \fIstring\fR \fIoptional_class\fR {
ixfr\-from\-differences \fIboolean\fR;
journal \fIquoted_string\fR;
zero\-no\-soa\-ttl \fIboolean\fR;
+ dnssec\-secure\-to\-insecure \fIboolean\fR;
allow\-query { \fIaddress_match_element\fR; ... };
allow\-query\-on { \fIaddress_match_element\fR; ... };
allow\-transfer { \fIaddress_match_element\fR; ... };
allow\-update { \fIaddress_match_element\fR; ... };
allow\-update\-forwarding { \fIaddress_match_element\fR; ... };
- update\-policy {
- ( grant | deny ) \fIstring\fR
+ update\-policy \fIlocal\fR | \fI {
+ ( grant | deny ) \fR\fI\fIstring\fR\fR\fI
( name | subdomain | wildcard | self | selfsub | selfwild |
krb5\-self | ms\-self | krb5\-subdomain | ms\-subdomain |
- tcp\-self | 6to4\-self ) \fIstring\fR
- \fIrrtypelist\fR; ...
- };
+ tcp\-self | zonesub | 6to4\-self ) \fR\fI\fIstring\fR\fR\fI
+ \fR\fI\fIrrtypelist\fR\fR\fI;
+ \fR\fI[...]\fR\fI
+ }\fR;
update\-check\-ksk \fIboolean\fR;
+ dnssec\-dnskey\-kskonly \fIboolean\fR;
masterfile\-format ( text | raw );
notify \fInotifytype\fR;
notify\-source ( \fIipv4_address\fR | * ) [ port ( \fIinteger\fR | * ) ];
@@ -544,5 +593,5 @@ zone \fIstring\fR \fIoptional_class\fR {
\fBrndc\fR(8),
BIND 9 Administrator Reference Manual.
.SH "COPYRIGHT"
-Copyright \(co 2004\-2008 Internet Systems Consortium, Inc. ("ISC")
+Copyright \(co 2004\-2011 Internet Systems Consortium, Inc. ("ISC")
.br
diff --git a/contrib/bind9/bin/named/named.conf.docbook b/contrib/bind9/bin/named/named.conf.docbook
index d98e289..962eaaa 100644
--- a/contrib/bind9/bin/named/named.conf.docbook
+++ b/contrib/bind9/bin/named/named.conf.docbook
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.conf.docbook,v 1.39 2008-09-24 02:46:21 marka Exp $ -->
+<!-- $Id: named.conf.docbook,v 1.49.14.1 2011-02-03 05:50:05 marka Exp $ -->
<refentry>
<refentryinfo>
<date>Aug 13, 2004</date>
@@ -41,6 +41,9 @@
<year>2006</year>
<year>2007</year>
<year>2008</year>
+ <year>2009</year>
+ <year>2010</year>
+ <year>2011</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
</docinfo>
@@ -132,6 +135,15 @@ trusted-keys {
</refsect1>
<refsect1>
+ <title>MANAGED-KEYS</title>
+ <literallayout>
+managed-keys {
+ <replaceable>domain_name</replaceable> <constant>initial-key</constant> <replaceable>flags</replaceable> <replaceable>protocol</replaceable> <replaceable>algorithm</replaceable> <replaceable>key</replaceable>; ...
+};
+</literallayout>
+ </refsect1>
+
+ <refsect1>
<title>CONTROLS</title>
<literallayout>
controls {
@@ -214,6 +226,7 @@ options {
tcp-listen-queue <replaceable>integer</replaceable>;
tkey-dhkey <replaceable>quoted_string</replaceable> <replaceable>integer</replaceable>;
tkey-gssapi-credential <replaceable>quoted_string</replaceable>;
+ tkey-gssapi-keytab <replaceable>quoted_string</replaceable>;
tkey-domain <replaceable>quoted_string</replaceable>;
transfers-per-ns <replaceable>integer</replaceable>;
transfers-in <replaceable>integer</replaceable>;
@@ -242,6 +255,7 @@ options {
queryport-pool-ports <replaceable>integer</replaceable>;
queryport-pool-updateinterval <replaceable>integer</replaceable>;
cleaning-interval <replaceable>integer</replaceable>;
+ resolver-query-timeout <replaceable>integer</replaceable>;
min-roots <replaceable>integer</replaceable>; // not implemented
lame-ttl <replaceable>integer</replaceable>;
max-ncache-ttl <replaceable>integer</replaceable>;
@@ -272,9 +286,21 @@ options {
dnssec-enable <replaceable>boolean</replaceable>;
dnssec-validation <replaceable>boolean</replaceable>;
dnssec-lookaside <replaceable>string</replaceable> trust-anchor <replaceable>string</replaceable>;
+ dnssec-lookaside ( <replaceable>auto</replaceable> | <replaceable>domain</replaceable> trust-anchor <replaceable>domain</replaceable> );
dnssec-must-be-secure <replaceable>string</replaceable> <replaceable>boolean</replaceable>;
dnssec-accept-expired <replaceable>boolean</replaceable>;
+ dns64-server <replaceable>string</replaceable>;
+ dns64-contact <replaceable>string</replaceable>;
+ dns64 <replaceable>prefix</replaceable> {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break-dnssec <replaceable>boolean</replaceable>;
+ recursive-only <replaceable>boolean</replaceable>;
+ suffix <replaceable>ipv6_address</replaceable>;
+ };
+
empty-server <replaceable>string</replaceable>;
empty-contact <replaceable>string</replaceable>;
empty-zones-enable <replaceable>boolean</replaceable>;
@@ -291,6 +317,7 @@ options {
allow-update { <replaceable>address_match_element</replaceable>; ... };
allow-update-forwarding { <replaceable>address_match_element</replaceable>; ... };
update-check-ksk <replaceable>boolean</replaceable>;
+ dnssec-dnskey-kskonly <replaceable>boolean</replaceable>;
masterfile-format ( text | raw );
notify <replaceable>notifytype</replaceable>;
@@ -337,9 +364,18 @@ options {
zone-statistics <replaceable>boolean</replaceable>;
key-directory <replaceable>quoted_string</replaceable>;
+ managed-keys-directory <replaceable>quoted_string</replaceable>;
+ auto-dnssec <constant>allow</constant>|<constant>maintain</constant>|<constant>create</constant>|<constant>off</constant>;
try-tcp-refresh <replaceable>boolean</replaceable>;
zero-no-soa-ttl <replaceable>boolean</replaceable>;
zero-no-soa-ttl-cache <replaceable>boolean</replaceable>;
+ dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
+ deny-answer-addresses {
+ <replaceable>address_match_list</replaceable>
+ } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;
+ deny-answer-aliases {
+ <replaceable>namelist</replaceable>
+ } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;
nsec3-test-zone <replaceable>boolean</replaceable>; // testing only
@@ -381,7 +417,8 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
};
trusted-keys {
- <replaceable>string</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>quoted_string</replaceable>; ...
+ <replaceable>string</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>integer</replaceable> <replaceable>quoted_string</replaceable>;
+ <optional>...</optional>
};
allow-recursion { <replaceable>address_match_element</replaceable>; ... };
@@ -406,6 +443,7 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
queryport-pool-ports <replaceable>integer</replaceable>;
queryport-pool-updateinterval <replaceable>integer</replaceable>;
cleaning-interval <replaceable>integer</replaceable>;
+ resolver-query-timeout <replaceable>integer</replaceable>;
min-roots <replaceable>integer</replaceable>; // not implemented
lame-ttl <replaceable>integer</replaceable>;
max-ncache-ttl <replaceable>integer</replaceable>;
@@ -439,6 +477,17 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
dnssec-must-be-secure <replaceable>string</replaceable> <replaceable>boolean</replaceable>;
dnssec-accept-expired <replaceable>boolean</replaceable>;
+ dns64-server <replaceable>string</replaceable>;
+ dns64-contact <replaceable>string</replaceable>;
+ dns64 <replaceable>prefix</replaceable> {
+ clients { <replacable>acl</replacable>; };
+ exclude { <replacable>acl</replacable>; };
+ mapped { <replacable>acl</replacable>; };
+ break-dnssec <replaceable>boolean</replaceable>;
+ recursive-only <replaceable>boolean</replaceable>;
+ suffix <replaceable>ipv6_address</replaceable>;
+ };
+
empty-server <replaceable>string</replaceable>;
empty-contact <replaceable>string</replaceable>;
empty-zones-enable <replaceable>boolean</replaceable>;
@@ -455,6 +504,7 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
allow-update { <replaceable>address_match_element</replaceable>; ... };
allow-update-forwarding { <replaceable>address_match_element</replaceable>; ... };
update-check-ksk <replaceable>boolean</replaceable>;
+ dnssec-dnskey-kskonly <replaceable>boolean</replaceable>;
masterfile-format ( text | raw );
notify <replaceable>notifytype</replaceable>;
@@ -499,6 +549,7 @@ view <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
key-directory <replaceable>quoted_string</replaceable>;
zero-no-soa-ttl <replaceable>boolean</replaceable>;
zero-no-soa-ttl-cache <replaceable>boolean</replaceable>;
+ dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
allow-v6-synthesis { <replaceable>address_match_element</replaceable>; ... }; // obsolete
fetch-glue <replaceable>boolean</replaceable>; // obsolete
@@ -533,20 +584,23 @@ zone <replaceable>string</replaceable> <replaceable>optional_class</replaceable>
ixfr-from-differences <replaceable>boolean</replaceable>;
journal <replaceable>quoted_string</replaceable>;
zero-no-soa-ttl <replaceable>boolean</replaceable>;
+ dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
allow-query { <replaceable>address_match_element</replaceable>; ... };
allow-query-on { <replaceable>address_match_element</replaceable>; ... };
allow-transfer { <replaceable>address_match_element</replaceable>; ... };
allow-update { <replaceable>address_match_element</replaceable>; ... };
allow-update-forwarding { <replaceable>address_match_element</replaceable>; ... };
- update-policy {
+ update-policy <replaceable>local</replaceable> | <replaceable> {
( grant | deny ) <replaceable>string</replaceable>
( name | subdomain | wildcard | self | selfsub | selfwild |
krb5-self | ms-self | krb5-subdomain | ms-subdomain |
- tcp-self | 6to4-self ) <replaceable>string</replaceable>
- <replaceable>rrtypelist</replaceable>; ...
- };
+ tcp-self | zonesub | 6to4-self ) <replaceable>string</replaceable>
+ <replaceable>rrtypelist</replaceable>;
+ <optional>...</optional>
+ }</replaceable>;
update-check-ksk <replaceable>boolean</replaceable>;
+ dnssec-dnskey-kskonly <replaceable>boolean</replaceable>;
masterfile-format ( text | raw );
notify <replaceable>notifytype</replaceable>;
diff --git a/contrib/bind9/bin/named/named.conf.html b/contrib/bind9/bin/named/named.conf.html
index fccad18..f20e411 100644
--- a/contrib/bind9/bin/named/named.conf.html
+++ b/contrib/bind9/bin/named/named.conf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
@@ -13,7 +13,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.conf.html,v 1.45.48.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: named.conf.html,v 1.53.12.1 2011-02-03 12:29:12 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -31,7 +31,7 @@
<div class="cmdsynopsis"><p><code class="command">named.conf</code> </p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543342"></a><h2>DESCRIPTION</h2>
+<a name="id2543352"></a><h2>DESCRIPTION</h2>
<p><code class="filename">named.conf</code> is the configuration file
for
<span><strong class="command">named</strong></span>. Statements are enclosed
@@ -50,14 +50,14 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543370"></a><h2>ACL</h2>
+<a name="id2543380"></a><h2>ACL</h2>
<div class="literallayout"><p><br>
acl <em class="replaceable"><code>string</code></em> { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543386"></a><h2>KEY</h2>
+<a name="id2543396"></a><h2>KEY</h2>
<div class="literallayout"><p><br>
key <em class="replaceable"><code>domain_name</code></em> {<br>
algorithm <em class="replaceable"><code>string</code></em>;<br>
@@ -66,7 +66,7 @@ key <em class="replaceable"><code>domain_name</code></em> {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543405"></a><h2>MASTERS</h2>
+<a name="id2543415"></a><h2>MASTERS</h2>
<div class="literallayout"><p><br>
masters <em class="replaceable"><code>string</code></em> [<span class="optional"> port <em class="replaceable"><code>integer</code></em> </span>] {<br>
( <em class="replaceable"><code>masters</code></em> | <em class="replaceable"><code>ipv4_address</code></em> [<span class="optional">port <em class="replaceable"><code>integer</code></em></span>] |<br>
@@ -75,7 +75,7 @@ masters <em class="replaceable"><code>string</code></em> [<span class="optional"
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543451"></a><h2>SERVER</h2>
+<a name="id2543461"></a><h2>SERVER</h2>
<div class="literallayout"><p><br>
server ( <em class="replaceable"><code>ipv4_address[<span class="optional">/prefixlen</span>]</code></em> | <em class="replaceable"><code>ipv6_address[<span class="optional">/prefixlen</span>]</code></em> ) {<br>
bogus <em class="replaceable"><code>boolean</code></em>;<br>
@@ -97,7 +97,7 @@ server ( <em class="replaceable"><code>ipv4_address[<span class="optional">/pref
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543520"></a><h2>TRUSTED-KEYS</h2>
+<a name="id2543529"></a><h2>TRUSTED-KEYS</h2>
<div class="literallayout"><p><br>
trusted-keys {<br>
<em class="replaceable"><code>domain_name</code></em> <em class="replaceable"><code>flags</code></em> <em class="replaceable"><code>protocol</code></em> <em class="replaceable"><code>algorithm</code></em> <em class="replaceable"><code>key</code></em>; ... <br>
@@ -105,7 +105,15 @@ trusted-keys {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543545"></a><h2>CONTROLS</h2>
+<a name="id2543555"></a><h2>MANAGED-KEYS</h2>
+<div class="literallayout"><p><br>
+managed-keys {<br>
+ <em class="replaceable"><code>domain_name</code></em> <code class="constant">initial-key</code> <em class="replaceable"><code>flags</code></em> <em class="replaceable"><code>protocol</code></em> <em class="replaceable"><code>algorithm</code></em> <em class="replaceable"><code>key</code></em>; ... <br>
+};<br>
+</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543584"></a><h2>CONTROLS</h2>
<div class="literallayout"><p><br>
controls {<br>
inet ( <em class="replaceable"><code>ipv4_address</code></em> | <em class="replaceable"><code>ipv6_address</code></em> | * )<br>
@@ -117,7 +125,7 @@ controls {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543580"></a><h2>LOGGING</h2>
+<a name="id2543619"></a><h2>LOGGING</h2>
<div class="literallayout"><p><br>
logging {<br>
channel <em class="replaceable"><code>string</code></em> {<br>
@@ -135,7 +143,7 @@ logging {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543619"></a><h2>LWRES</h2>
+<a name="id2543657"></a><h2>LWRES</h2>
<div class="literallayout"><p><br>
lwres {<br>
listen-on [<span class="optional"> port <em class="replaceable"><code>integer</code></em> </span>] {<br>
@@ -148,7 +156,7 @@ lwres {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543660"></a><h2>OPTIONS</h2>
+<a name="id2543699"></a><h2>OPTIONS</h2>
<div class="literallayout"><p><br>
options {<br>
avoid-v4-udp-ports { <em class="replaceable"><code>port</code></em>; ... };<br>
@@ -184,6 +192,7 @@ options {<br>
tcp-listen-queue <em class="replaceable"><code>integer</code></em>;<br>
tkey-dhkey <em class="replaceable"><code>quoted_string</code></em> <em class="replaceable"><code>integer</code></em>;<br>
tkey-gssapi-credential <em class="replaceable"><code>quoted_string</code></em>;<br>
+ tkey-gssapi-keytab <em class="replaceable"><code>quoted_string</code></em>;<br>
tkey-domain <em class="replaceable"><code>quoted_string</code></em>;<br>
transfers-per-ns <em class="replaceable"><code>integer</code></em>;<br>
transfers-in <em class="replaceable"><code>integer</code></em>;<br>
@@ -212,6 +221,7 @@ options {<br>
queryport-pool-ports <em class="replaceable"><code>integer</code></em>;<br>
queryport-pool-updateinterval <em class="replaceable"><code>integer</code></em>;<br>
cleaning-interval <em class="replaceable"><code>integer</code></em>;<br>
+ resolver-query-timeout <em class="replaceable"><code>integer</code></em>;<br>
min-roots <em class="replaceable"><code>integer</code></em>; // not implemented<br>
lame-ttl <em class="replaceable"><code>integer</code></em>;<br>
max-ncache-ttl <em class="replaceable"><code>integer</code></em>;<br>
@@ -242,9 +252,21 @@ options {<br>
dnssec-enable <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-validation <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-lookaside <em class="replaceable"><code>string</code></em> trust-anchor <em class="replaceable"><code>string</code></em>;<br>
+ dnssec-lookaside ( <em class="replaceable"><code>auto</code></em> | <em class="replaceable"><code>domain</code></em> trust-anchor <em class="replaceable"><code>domain</code></em> );<br>
dnssec-must-be-secure <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-accept-expired <em class="replaceable"><code>boolean</code></em>;<br>
<br>
+ dns64-server <em class="replaceable"><code>string</code></em>;<br>
+ dns64-contact <em class="replaceable"><code>string</code></em>;<br>
+ dns64 <em class="replaceable"><code>prefix</code></em> {<br>
+ clients { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ exclude { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ mapped { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ break-dnssec <em class="replaceable"><code>boolean</code></em>;<br>
+ recursive-only <em class="replaceable"><code>boolean</code></em>;<br>
+ suffix <em class="replaceable"><code>ipv6_address</code></em>;<br>
+ };<br>
+<br>
empty-server <em class="replaceable"><code>string</code></em>;<br>
empty-contact <em class="replaceable"><code>string</code></em>;<br>
empty-zones-enable <em class="replaceable"><code>boolean</code></em>;<br>
@@ -261,6 +283,7 @@ options {<br>
allow-update { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update-forwarding { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
update-check-ksk <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-dnskey-kskonly <em class="replaceable"><code>boolean</code></em>;<br>
<br>
masterfile-format ( text | raw );<br>
notify <em class="replaceable"><code>notifytype</code></em>;<br>
@@ -307,9 +330,18 @@ options {<br>
<br>
zone-statistics <em class="replaceable"><code>boolean</code></em>;<br>
key-directory <em class="replaceable"><code>quoted_string</code></em>;<br>
+ managed-keys-directory <em class="replaceable"><code>quoted_string</code></em>;<br>
+ auto-dnssec <code class="constant">allow</code>|<code class="constant">maintain</code>|<code class="constant">create</code>|<code class="constant">off</code>;<br>
try-tcp-refresh <em class="replaceable"><code>boolean</code></em>;<br>
zero-no-soa-ttl <em class="replaceable"><code>boolean</code></em>;<br>
zero-no-soa-ttl-cache <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-secure-to-insecure <em class="replaceable"><code>boolean</code></em>;<br>
+ deny-answer-addresses {<br>
+ <em class="replaceable"><code>address_match_list</code></em><br>
+ } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];<br>
+ deny-answer-aliases {<br>
+ <em class="replaceable"><code>namelist</code></em><br>
+ } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];<br>
<br>
nsec3-test-zone <em class="replaceable"><code>boolean</code></em>;  // testing only<br>
<br>
@@ -329,7 +361,7 @@ options {<br>
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544452"></a><h2>VIEW</h2>
+<a name="id2544577"></a><h2>VIEW</h2>
<div class="literallayout"><p><br>
view <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>optional_class</code></em> {<br>
match-clients { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
@@ -350,7 +382,8 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
};<br>
<br>
trusted-keys {<br>
- <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>quoted_string</code></em>; ...<br>
+ <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>integer</code></em> <em class="replaceable"><code>quoted_string</code></em>;<br>
+ [<span class="optional">...</span>]<br>
};<br>
<br>
allow-recursion { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
@@ -375,6 +408,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
queryport-pool-ports <em class="replaceable"><code>integer</code></em>;<br>
queryport-pool-updateinterval <em class="replaceable"><code>integer</code></em>;<br>
cleaning-interval <em class="replaceable"><code>integer</code></em>;<br>
+ resolver-query-timeout <em class="replaceable"><code>integer</code></em>;<br>
min-roots <em class="replaceable"><code>integer</code></em>; // not implemented<br>
lame-ttl <em class="replaceable"><code>integer</code></em>;<br>
max-ncache-ttl <em class="replaceable"><code>integer</code></em>;<br>
@@ -408,6 +442,17 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
dnssec-must-be-secure <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>boolean</code></em>;<br>
dnssec-accept-expired <em class="replaceable"><code>boolean</code></em>;<br>
<br>
+ dns64-server <em class="replaceable"><code>string</code></em>;<br>
+ dns64-contact <em class="replaceable"><code>string</code></em>;<br>
+ dns64 <em class="replaceable"><code>prefix</code></em> {<br>
+ clients { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ exclude { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ mapped { <font color="red">&lt;replacable&gt;acl&lt;/replacable&gt;</font>; };<br>
+ break-dnssec <em class="replaceable"><code>boolean</code></em>;<br>
+ recursive-only <em class="replaceable"><code>boolean</code></em>;<br>
+ suffix <em class="replaceable"><code>ipv6_address</code></em>;<br>
+ };<br>
+<br>
empty-server <em class="replaceable"><code>string</code></em>;<br>
empty-contact <em class="replaceable"><code>string</code></em>;<br>
empty-zones-enable <em class="replaceable"><code>boolean</code></em>;<br>
@@ -424,6 +469,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
allow-update { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update-forwarding { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
update-check-ksk <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-dnskey-kskonly <em class="replaceable"><code>boolean</code></em>;<br>
<br>
masterfile-format ( text | raw );<br>
notify <em class="replaceable"><code>notifytype</code></em>;<br>
@@ -468,6 +514,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
key-directory <em class="replaceable"><code>quoted_string</code></em>;<br>
zero-no-soa-ttl <em class="replaceable"><code>boolean</code></em>;<br>
zero-no-soa-ttl-cache <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-secure-to-insecure <em class="replaceable"><code>boolean</code></em>;<br>
<br>
allow-v6-synthesis { <em class="replaceable"><code>address_match_element</code></em>; ... }; // obsolete<br>
fetch-glue <em class="replaceable"><code>boolean</code></em>; // obsolete<br>
@@ -477,7 +524,7 @@ view <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2545113"></a><h2>ZONE</h2>
+<a name="id2545280"></a><h2>ZONE</h2>
<div class="literallayout"><p><br>
zone <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>optional_class</code></em> {<br>
type ( master | slave | stub | hint |<br>
@@ -501,20 +548,23 @@ zone <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
ixfr-from-differences <em class="replaceable"><code>boolean</code></em>;<br>
journal <em class="replaceable"><code>quoted_string</code></em>;<br>
zero-no-soa-ttl <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-secure-to-insecure <em class="replaceable"><code>boolean</code></em>;<br>
<br>
allow-query { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-query-on { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-transfer { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
allow-update-forwarding { <em class="replaceable"><code>address_match_element</code></em>; ... };<br>
- update-policy {<br>
+ update-policy <em class="replaceable"><code>local</code></em> | <em class="replaceable"><code> {<br>
( grant | deny ) <em class="replaceable"><code>string</code></em><br>
( name | subdomain | wildcard | self | selfsub | selfwild |<br>
                  krb5-self | ms-self | krb5-subdomain | ms-subdomain |<br>
-   tcp-self | 6to4-self ) <em class="replaceable"><code>string</code></em><br>
- <em class="replaceable"><code>rrtypelist</code></em>; ...<br>
- };<br>
+   tcp-self | zonesub | 6to4-self ) <em class="replaceable"><code>string</code></em><br>
+ <em class="replaceable"><code>rrtypelist</code></em>;<br>
+ [<span class="optional">...</span>]<br>
+ }</code></em>;<br>
update-check-ksk <em class="replaceable"><code>boolean</code></em>;<br>
+ dnssec-dnskey-kskonly <em class="replaceable"><code>boolean</code></em>;<br>
<br>
masterfile-format ( text | raw );<br>
notify <em class="replaceable"><code>notifytype</code></em>;<br>
@@ -569,12 +619,12 @@ zone <em class="replaceable"><code>string</code></em> <em class="replaceable"><c
</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2545410"></a><h2>FILES</h2>
+<a name="id2545659"></a><h2>FILES</h2>
<p><code class="filename">/etc/named.conf</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2545421"></a><h2>SEE ALSO</h2>
+<a name="id2545671"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
diff --git a/contrib/bind9/bin/named/named.docbook b/contrib/bind9/bin/named/named.docbook
index 808e998..214f8ac 100644
--- a/contrib/bind9/bin/named/named.docbook
+++ b/contrib/bind9/bin/named/named.docbook
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.docbook,v 1.23.14.2 2009-12-03 04:49:32 tbox Exp $ -->
+<!-- $Id: named.docbook,v 1.26 2009-10-05 17:30:49 fdupont Exp $ -->
<refentry id="man.named">
<refentryinfo>
<date>May 21, 2009</date>
@@ -60,6 +60,7 @@
<arg><option>-6</option></arg>
<arg><option>-c <replaceable class="parameter">config-file</replaceable></option></arg>
<arg><option>-d <replaceable class="parameter">debug-level</replaceable></option></arg>
+ <arg><option>-E <replaceable class="parameter">engine-name</replaceable></option></arg>
<arg><option>-f</option></arg>
<arg><option>-g</option></arg>
<arg><option>-m <replaceable class="parameter">flag</replaceable></option></arg>
@@ -116,6 +117,7 @@
</para>
</listitem>
</varlistentry>
+
<varlistentry>
<term>-c <replaceable class="parameter">config-file</replaceable></term>
<listitem>
@@ -145,6 +147,19 @@
</varlistentry>
<varlistentry>
+ <term>-E <replaceable class="parameter">engine-name</replaceable></term>
+ <listitem>
+ <para>
+ Use a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance re-signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ <replaceable class="parameter">engine-name</replaceable>
+ defaults to pkcs11, the empty name resets it to no engine.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term>-f</term>
<listitem>
<para>
diff --git a/contrib/bind9/bin/named/named.html b/contrib/bind9/bin/named/named.html
index 031b492..fa869c4 100644
--- a/contrib/bind9/bin/named/named.html
+++ b/contrib/bind9/bin/named/named.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: named.html,v 1.30.14.2 2009-12-03 05:06:38 tbox Exp $ -->
+<!-- $Id: named.html,v 1.33 2009-10-06 01:14:41 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,10 +29,10 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine-name</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543472"></a><h2>DESCRIPTION</h2>
+<a name="id2543480"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named</strong></span>
is a Domain Name System (DNS) server,
part of the BIND 9 distribution from ISC. For more
@@ -47,7 +47,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543496"></a><h2>OPTIONS</h2>
+<a name="id2543505"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-4</span></dt>
<dd><p>
@@ -79,6 +79,14 @@
Debugging traces from <span><strong class="command">named</strong></span> become
more verbose as the debug level increases.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine-name</code></em></span></dt>
+<dd><p>
+ Use a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance re-signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ <em class="replaceable"><code>engine-name</code></em>
+ defaults to pkcs11, the empty name resets it to no engine.
+ </p></dd>
<dt><span class="term">-f</span></dt>
<dd><p>
Run the server in the foreground (i.e. do not daemonize).
@@ -220,7 +228,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543931"></a><h2>SIGNALS</h2>
+<a name="id2543962"></a><h2>SIGNALS</h2>
<p>
In routine operation, signals should not be used to control
the nameserver; <span><strong class="command">rndc</strong></span> should be used
@@ -241,7 +249,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543979"></a><h2>CONFIGURATION</h2>
+<a name="id2544010"></a><h2>CONFIGURATION</h2>
<p>
The <span><strong class="command">named</strong></span> configuration file is too complex
to describe in detail here. A complete description is provided
@@ -258,7 +266,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544016"></a><h2>FILES</h2>
+<a name="id2544046"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="filename">/etc/named.conf</code></span></dt>
<dd><p>
@@ -271,7 +279,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544123"></a><h2>SEE ALSO</h2>
+<a name="id2544086"></a><h2>SEE ALSO</h2>
<p><em class="citetitle">RFC 1033</em>,
<em class="citetitle">RFC 1034</em>,
<em class="citetitle">RFC 1035</em>,
@@ -284,7 +292,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544194"></a><h2>AUTHOR</h2>
+<a name="id2544293"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/bin/named/query.c b/contrib/bind9/bin/named/query.c
index fa34da6..1950257 100644
--- a/contrib/bind9/bin/named/query.c
+++ b/contrib/bind9/bin/named/query.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: query.c,v 1.313.20.24 2010-09-24 08:09:07 marka Exp $ */
+/* $Id: query.c,v 1.353.8.2.2.5 2011-06-09 03:17:10 marka Exp $ */
/*! \file */
@@ -34,6 +34,7 @@
#ifdef DLZ
#include <dns/dlz.h>
#endif
+#include <dns/dns64.h>
#include <dns/dnssec.h>
#include <dns/events.h>
#include <dns/message.h>
@@ -62,6 +63,17 @@
#include <named/sortlist.h>
#include <named/xfrout.h>
+#if 0
+/*
+ * It has been recommended that DNS64 be changed to return excluded
+ * AAAA addresses if DNS64 synthesis does not occur. This minimises
+ * the impact on the lookup results. While most DNS AAAA lookups are
+ * done to send IP packets to a host, not all of them are and filtering
+ * excluded addresses has a negative impact on those uses.
+ */
+#define dns64_bis_return_excluded_addresses 1
+#endif
+
/*% Partial answer? */
#define PARTIALANSWER(c) (((c)->query.attributes & \
NS_QUERYATTR_PARTIALANSWER) != 0)
@@ -92,6 +104,12 @@
/*% Secure? */
#define SECURE(c) (((c)->query.attributes & \
NS_QUERYATTR_SECURE) != 0)
+/*% DNS64 A lookup? */
+#define DNS64(c) (((c)->query.attributes & \
+ NS_QUERYATTR_DNS64) != 0)
+
+#define DNS64EXCLUDE(c) (((c)->query.attributes & \
+ NS_QUERYATTR_DNS64EXCLUDE) != 0)
/*% No QNAME Proof? */
#define NOQNAME(r) (((r)->attributes & \
@@ -116,6 +134,7 @@
#define DNS_GETDB_NOEXACT 0x01U
#define DNS_GETDB_NOLOG 0x02U
#define DNS_GETDB_PARTIAL 0x04U
+#define DNS_GETDB_IGNOREACL 0x08U
#define PENDINGOK(x) (((x) & DNS_DBFIND_PENDINGOK) != 0)
@@ -141,6 +160,9 @@ query_findclosestnsec3(dns_name_t *qname, dns_db_t *db,
static inline void
log_queryerror(ns_client_t *client, isc_result_t result, int line, int level);
+static void
+rpz_st_clear(ns_client_t *client);
+
/*%
* Increment query statistics counters.
*/
@@ -252,6 +274,19 @@ ns_query_cancel(ns_client_t *client) {
}
static inline void
+query_putrdataset(ns_client_t *client, dns_rdataset_t **rdatasetp) {
+ dns_rdataset_t *rdataset = *rdatasetp;
+
+ CTRACE("query_putrdataset");
+ if (rdataset != NULL) {
+ if (dns_rdataset_isassociated(rdataset))
+ dns_rdataset_disassociate(rdataset);
+ dns_message_puttemprdataset(client->message, rdatasetp);
+ }
+ CTRACE("query_putrdataset: done");
+}
+
+static inline void
query_reset(ns_client_t *client, isc_boolean_t everything) {
isc_buffer_t *dbuf, *dbuf_next;
ns_dbversion_t *dbversion, *dbversion_next;
@@ -285,6 +320,18 @@ query_reset(ns_client_t *client, isc_boolean_t everything) {
if (client->query.authzone != NULL)
dns_zone_detach(&client->query.authzone);
+ if (client->query.dns64_aaaa != NULL)
+ query_putrdataset(client, &client->query.dns64_aaaa);
+ if (client->query.dns64_sigaaaa != NULL)
+ query_putrdataset(client, &client->query.dns64_sigaaaa);
+ if (client->query.dns64_aaaaok != NULL) {
+ isc_mem_put(client->mctx, client->query.dns64_aaaaok,
+ client->query.dns64_aaaaoklen *
+ sizeof(isc_boolean_t));
+ client->query.dns64_aaaaok = NULL;
+ client->query.dns64_aaaaoklen = 0;
+ }
+
query_freefreeversions(client, everything);
for (dbuf = ISC_LIST_HEAD(client->query.namebufs);
@@ -310,13 +357,22 @@ query_reset(ns_client_t *client, isc_boolean_t everything) {
NS_QUERYATTR_SECURE);
client->query.restarts = 0;
client->query.timerset = ISC_FALSE;
+ if (client->query.rpz_st != NULL) {
+ rpz_st_clear(client);
+ if (everything) {
+ isc_mem_put(client->mctx, client->query.rpz_st,
+ sizeof(*client->query.rpz_st));
+ client->query.rpz_st = NULL;
+ }
+ }
client->query.origqname = NULL;
- client->query.qname = NULL;
client->query.dboptions = 0;
client->query.fetchoptions = 0;
client->query.gluedb = NULL;
client->query.authdbset = ISC_FALSE;
client->query.isreferral = ISC_FALSE;
+ client->query.dns64_options = 0;
+ client->query.dns64_ttl = ISC_UINT32_MAX;
}
static void
@@ -473,20 +529,6 @@ query_newrdataset(ns_client_t *client) {
return (rdataset);
}
-static inline void
-query_putrdataset(ns_client_t *client, dns_rdataset_t **rdatasetp) {
- dns_rdataset_t *rdataset = *rdatasetp;
-
- CTRACE("query_putrdataset");
- if (rdataset != NULL) {
- if (dns_rdataset_isassociated(rdataset))
- dns_rdataset_disassociate(rdataset);
- dns_message_puttemprdataset(client->message, rdatasetp);
- }
- CTRACE("query_putrdataset: done");
-}
-
-
static inline isc_result_t
query_newdbversion(ns_client_t *client, unsigned int n) {
unsigned int i;
@@ -540,6 +582,7 @@ ns_query_init(ns_client_t *client) {
ISC_LIST_INIT(client->query.freeversions);
client->query.restarts = 0;
client->query.timerset = ISC_FALSE;
+ client->query.rpz_st = NULL;
client->query.qname = NULL;
result = isc_mutex_init(&client->query.fetchlock);
if (result != ISC_R_SUCCESS)
@@ -549,6 +592,10 @@ ns_query_init(ns_client_t *client) {
client->query.authzone = NULL;
client->query.authdbset = ISC_FALSE;
client->query.isreferral = ISC_FALSE;
+ client->query.dns64_aaaa = NULL;
+ client->query.dns64_sigaaaa = NULL;
+ client->query.dns64_aaaaok = NULL;
+ client->query.dns64_aaaaoklen = 0;
query_reset(client, ISC_FALSE);
result = query_newdbversion(client, 3);
if (result != ISC_R_SUCCESS) {
@@ -563,8 +610,7 @@ ns_query_init(ns_client_t *client) {
}
static inline ns_dbversion_t *
-query_findversion(ns_client_t *client, dns_db_t *db,
- isc_boolean_t *newzonep)
+query_findversion(ns_client_t *client, dns_db_t *db)
{
ns_dbversion_t *dbversion;
@@ -590,12 +636,11 @@ query_findversion(ns_client_t *client, dns_db_t *db,
return (NULL);
dns_db_attach(db, &dbversion->db);
dns_db_currentversion(db, &dbversion->version);
+ dbversion->acl_checked = ISC_FALSE;
dbversion->queryok = ISC_FALSE;
ISC_LIST_APPEND(client->query.activeversions,
dbversion, link);
- *newzonep = ISC_TRUE;
- } else
- *newzonep = ISC_FALSE;
+ }
return (dbversion);
}
@@ -607,7 +652,6 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
dns_dbversion_t **versionp)
{
isc_result_t result;
- isc_boolean_t check_acl, new_zone;
dns_acl_t *queryacl;
ns_dbversion_t *dbversion;
@@ -623,7 +667,17 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
if (!client->view->additionalfromauth &&
client->query.authdbset &&
db != client->query.authdb)
- goto refuse;
+ return (DNS_R_REFUSED);
+
+ /*
+ * Non recursive query to a static-stub zone is prohibited; its
+ * zone content is not public data, but a part of local configuration
+ * and should not be disclosed.
+ */
+ if (dns_zone_gettype(zone) == dns_zone_staticstub &&
+ !RECURSIONOK(client)) {
+ return (DNS_R_REFUSED);
+ }
/*
* If the zone has an ACL, we'll check it, otherwise
@@ -633,23 +687,19 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
* Also, get the database version to use.
*/
- check_acl = ISC_TRUE; /* Keep compiler happy. */
- queryacl = NULL;
-
/*
* Get the current version of this database.
*/
- dbversion = query_findversion(client, db, &new_zone);
- if (dbversion == NULL) {
- result = DNS_R_SERVFAIL;
- goto fail;
- }
- if (new_zone) {
- check_acl = ISC_TRUE;
- } else if (!dbversion->queryok) {
- goto refuse;
- } else {
- check_acl = ISC_FALSE;
+ dbversion = query_findversion(client, db);
+ if (dbversion == NULL)
+ return (DNS_R_SERVFAIL);
+
+ if ((options & DNS_GETDB_IGNOREACL) != 0)
+ goto approved;
+ if (dbversion->acl_checked) {
+ if (!dbversion->queryok)
+ return (DNS_R_REFUSED);
+ goto approved;
}
queryacl = dns_zone_getqueryacl(zone);
@@ -663,88 +713,69 @@ query_validatezonedb(ns_client_t *client, dns_name_t *name,
* allowed to make queries, otherwise the query should
* be refused.
*/
- check_acl = ISC_FALSE;
+ dbversion->acl_checked = ISC_TRUE;
if ((client->query.attributes &
- NS_QUERYATTR_QUERYOK) == 0)
- goto refuse;
- } else {
- /*
- * We haven't evaluated the view's queryacl yet.
- */
- check_acl = ISC_TRUE;
+ NS_QUERYATTR_QUERYOK) == 0) {
+ dbversion->queryok = ISC_FALSE;
+ return (DNS_R_REFUSED);
+ }
+ dbversion->queryok = ISC_TRUE;
+ goto approved;
}
}
- if (check_acl) {
- isc_boolean_t log = ISC_TF((options & DNS_GETDB_NOLOG) == 0);
-
- result = ns_client_checkaclsilent(client, NULL, queryacl,
- ISC_TRUE);
- if (log) {
- char msg[NS_CLIENT_ACLMSGSIZE("query")];
- if (result == ISC_R_SUCCESS) {
- if (isc_log_wouldlog(ns_g_lctx,
- ISC_LOG_DEBUG(3)))
- {
- ns_client_aclmsg("query", name, qtype,
- client->view->rdclass,
- msg, sizeof(msg));
- ns_client_log(client,
- DNS_LOGCATEGORY_SECURITY,
- NS_LOGMODULE_QUERY,
- ISC_LOG_DEBUG(3),
- "%s approved", msg);
- }
- } else {
+ result = ns_client_checkaclsilent(client, NULL, queryacl, ISC_TRUE);
+ if ((options & DNS_GETDB_NOLOG) == 0) {
+ char msg[NS_CLIENT_ACLMSGSIZE("query")];
+ if (result == ISC_R_SUCCESS) {
+ if (isc_log_wouldlog(ns_g_lctx, ISC_LOG_DEBUG(3))) {
ns_client_aclmsg("query", name, qtype,
client->view->rdclass,
msg, sizeof(msg));
- ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
- NS_LOGMODULE_QUERY, ISC_LOG_INFO,
- "%s denied", msg);
+ ns_client_log(client,
+ DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_QUERY,
+ ISC_LOG_DEBUG(3),
+ "%s approved", msg);
}
+ } else {
+ ns_client_aclmsg("query", name, qtype,
+ client->view->rdclass,
+ msg, sizeof(msg));
+ ns_client_log(client, DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_QUERY, ISC_LOG_INFO,
+ "%s denied", msg);
}
+ }
- if (queryacl == client->view->queryacl) {
- if (result == ISC_R_SUCCESS) {
- /*
- * We were allowed by the default
- * "allow-query" ACL. Remember this so we
- * don't have to check again.
- */
- client->query.attributes |=
- NS_QUERYATTR_QUERYOK;
- }
+ if (queryacl == client->view->queryacl) {
+ if (result == ISC_R_SUCCESS) {
/*
- * We've now evaluated the view's query ACL, and
- * the NS_QUERYATTR_QUERYOK attribute is now valid.
+ * We were allowed by the default
+ * "allow-query" ACL. Remember this so we
+ * don't have to check again.
*/
- client->query.attributes |= NS_QUERYATTR_QUERYOKVALID;
+ client->query.attributes |= NS_QUERYATTR_QUERYOK;
}
-
- if (result != ISC_R_SUCCESS)
- goto refuse;
+ /*
+ * We've now evaluated the view's query ACL, and
+ * the NS_QUERYATTR_QUERYOK attribute is now valid.
+ */
+ client->query.attributes |= NS_QUERYATTR_QUERYOKVALID;
}
- /* Approved. */
-
- /*
- * Remember the result of the ACL check so we
- * don't have to check again.
- */
+ dbversion->acl_checked = ISC_TRUE;
+ if (result != ISC_R_SUCCESS) {
+ dbversion->queryok = ISC_FALSE;
+ return (DNS_R_REFUSED);
+ }
dbversion->queryok = ISC_TRUE;
+ approved:
/* Transfer ownership, if necessary. */
if (versionp != NULL)
*versionp = dbversion->version;
-
return (ISC_R_SUCCESS);
-
- refuse:
- return (DNS_R_REFUSED);
-
- fail:
- return (result);
}
static inline isc_result_t
@@ -800,6 +831,97 @@ query_getzonedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,
return (result);
}
+static void
+rpz_log(ns_client_t *client) {
+ char namebuf1[DNS_NAME_FORMATSIZE];
+ char namebuf2[DNS_NAME_FORMATSIZE];
+ dns_rpz_st_t *st;
+ const char *pat;
+
+ if (!ns_g_server->log_queries ||
+ !isc_log_wouldlog(ns_g_lctx, DNS_RPZ_INFO_LEVEL))
+ return;
+
+ st = client->query.rpz_st;
+ dns_name_format(client->query.qname, namebuf1, sizeof(namebuf1));
+ dns_name_format(st->qname, namebuf2, sizeof(namebuf2));
+
+ switch (st->m.policy) {
+ case DNS_RPZ_POLICY_NO_OP:
+ pat ="response policy %s rewrite %s NO-OP using %s";
+ break;
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ pat = "response policy %s rewrite %s to NXDOMAIN using %s";
+ break;
+ case DNS_RPZ_POLICY_NODATA:
+ pat = "response policy %s rewrite %s to NODATA using %s";
+ break;
+ case DNS_RPZ_POLICY_RECORD:
+ case DNS_RPZ_POLICY_CNAME:
+ pat = "response policy %s rewrite %s using %s";
+ break;
+ default:
+ INSIST(0);
+ }
+ ns_client_log(client, NS_LOGCATEGORY_QUERIES, NS_LOGMODULE_QUERY,
+ DNS_RPZ_INFO_LEVEL, pat, dns_rpz_type2str(st->m.type),
+ namebuf1, namebuf2);
+}
+
+static void
+rpz_fail_log(ns_client_t *client, int level, dns_rpz_type_t rpz_type,
+ dns_name_t *name, const char *str, isc_result_t result)
+{
+ char namebuf1[DNS_NAME_FORMATSIZE];
+ char namebuf2[DNS_NAME_FORMATSIZE];
+
+ if (!ns_g_server->log_queries || !isc_log_wouldlog(ns_g_lctx, level))
+ return;
+
+ dns_name_format(client->query.qname, namebuf1, sizeof(namebuf1));
+ dns_name_format(name, namebuf2, sizeof(namebuf2));
+ ns_client_log(client, NS_LOGCATEGORY_QUERY_EERRORS,
+ NS_LOGMODULE_QUERY, level,
+ "response policy %s rewrite %s via %s %sfailed: %s",
+ dns_rpz_type2str(rpz_type),
+ namebuf1, namebuf2, str, isc_result_totext(result));
+}
+
+/*
+ * Get a policy rewrite zone database.
+ */
+static isc_result_t
+rpz_getdb(ns_client_t *client, dns_rpz_type_t rpz_type,
+ dns_name_t *rpz_qname, dns_zone_t **zonep,
+ dns_db_t **dbp, dns_dbversion_t **versionp)
+{
+ char namebuf1[DNS_NAME_FORMATSIZE];
+ char namebuf2[DNS_NAME_FORMATSIZE];
+ dns_dbversion_t *rpz_version = NULL;
+ isc_result_t result;
+
+ result = query_getzonedb(client, rpz_qname, dns_rdatatype_any,
+ DNS_GETDB_IGNOREACL, zonep, dbp, &rpz_version);
+ if (result == ISC_R_SUCCESS) {
+ if (ns_g_server->log_queries &&
+ isc_log_wouldlog(ns_g_lctx, DNS_RPZ_DEBUG_LEVEL2)) {
+ dns_name_format(client->query.qname, namebuf1,
+ sizeof(namebuf1));
+ dns_name_format(rpz_qname, namebuf2, sizeof(namebuf2));
+ ns_client_log(client, NS_LOGCATEGORY_QUERIES,
+ NS_LOGMODULE_QUERY, DNS_RPZ_DEBUG_LEVEL2,
+ "try rpz %s rewrite %s via %s",
+ dns_rpz_type2str(rpz_type),
+ namebuf1, namebuf2);
+ }
+ *versionp = rpz_version;
+ return (ISC_R_SUCCESS);
+ }
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL, rpz_type, rpz_qname,
+ "query_getzonedb() ", result);
+ return (result);
+}
+
static inline isc_result_t
query_getcachedb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype,
dns_db_t **dbp, unsigned int options)
@@ -1958,6 +2080,323 @@ query_addrdataset(ns_client_t *client, dns_name_t *fname,
CTRACE("query_addrdataset: done");
}
+static isc_result_t
+query_dns64(ns_client_t *client, dns_name_t **namep, dns_rdataset_t *rdataset,
+ dns_rdataset_t *sigrdataset, isc_buffer_t *dbuf,
+ dns_section_t section)
+{
+ dns_name_t *name, *mname;
+ dns_rdata_t *dns64_rdata;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdatalist_t *dns64_rdatalist;
+ dns_rdataset_t *dns64_rdataset;
+ dns_rdataset_t *mrdataset;
+ isc_buffer_t *buffer;
+ isc_region_t r;
+ isc_result_t result;
+ dns_view_t *view = client->view;
+ isc_netaddr_t netaddr;
+ dns_dns64_t *dns64;
+ unsigned int flags = 0;
+
+ /*%
+ * To the current response for 'client', add the answer RRset
+ * '*rdatasetp' and an optional signature set '*sigrdatasetp', with
+ * owner name '*namep', to section 'section', unless they are
+ * already there. Also add any pertinent additional data.
+ *
+ * If 'dbuf' is not NULL, then '*namep' is the name whose data is
+ * stored in 'dbuf'. In this case, query_addrrset() guarantees that
+ * when it returns the name will either have been kept or released.
+ */
+ CTRACE("query_dns64");
+ name = *namep;
+ mname = NULL;
+ mrdataset = NULL;
+ buffer = NULL;
+ dns64_rdata = NULL;
+ dns64_rdataset = NULL;
+ dns64_rdatalist = NULL;
+ result = dns_message_findname(client->message, section,
+ name, dns_rdatatype_aaaa,
+ rdataset->covers,
+ &mname, &mrdataset);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * We've already got an RRset of the given name and type.
+ * There's nothing else to do;
+ */
+ CTRACE("query_dns64: dns_message_findname succeeded: done");
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ return (ISC_R_SUCCESS);
+ } else if (result == DNS_R_NXDOMAIN) {
+ /*
+ * The name doesn't exist.
+ */
+ if (dbuf != NULL)
+ query_keepname(client, name, dbuf);
+ dns_message_addname(client->message, name, section);
+ *namep = NULL;
+ mname = name;
+ } else {
+ RUNTIME_CHECK(result == DNS_R_NXRRSET);
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ }
+
+ if (rdataset->trust != dns_trust_secure &&
+ (section == DNS_SECTION_ANSWER ||
+ section == DNS_SECTION_AUTHORITY))
+ client->query.attributes &= ~NS_QUERYATTR_SECURE;
+
+ isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
+
+ result = isc_buffer_allocate(client->mctx, &buffer, view->dns64cnt *
+ 16 * dns_rdataset_count(rdataset));
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdataset(client->message, &dns64_rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdatalist(client->message,
+ &dns64_rdatalist);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_rdataset_init(dns64_rdataset);
+ dns_rdatalist_init(dns64_rdatalist);
+ dns64_rdatalist->rdclass = dns_rdataclass_in;
+ dns64_rdatalist->type = dns_rdatatype_aaaa;
+ if (client->query.dns64_ttl != ISC_UINT32_MAX)
+ dns64_rdatalist->ttl = ISC_MIN(rdataset->ttl,
+ client->query.dns64_ttl);
+ else
+ dns64_rdatalist->ttl = ISC_MIN(rdataset->ttl, 600);
+
+ if (RECURSIONOK(client))
+ flags |= DNS_DNS64_RECURSIVE;
+
+ /*
+ * We use the signatures from the A lookup to set DNS_DNS64_DNSSEC
+ * as this provides a easy way to see if the answer was signed.
+ */
+ if (sigrdataset != NULL && dns_rdataset_isassociated(sigrdataset))
+ flags |= DNS_DNS64_DNSSEC;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ for (dns64 = ISC_LIST_HEAD(client->view->dns64);
+ dns64 != NULL; dns64 = dns_dns64_next(dns64)) {
+
+ dns_rdataset_current(rdataset, &rdata);
+ isc__buffer_availableregion(buffer, &r);
+ INSIST(r.length >= 16);
+ result = dns_dns64_aaaafroma(dns64, &netaddr,
+ client->signer,
+ &ns_g_server->aclenv,
+ flags, rdata.data, r.base);
+ if (result != ISC_R_SUCCESS) {
+ dns_rdata_reset(&rdata);
+ continue;
+ }
+ isc_buffer_add(buffer, 16);
+ isc_buffer_remainingregion(buffer, &r);
+ isc_buffer_forward(buffer, 16);
+ result = dns_message_gettemprdata(client->message,
+ &dns64_rdata);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rdata_init(dns64_rdata);
+ dns_rdata_fromregion(dns64_rdata, dns_rdataclass_in,
+ dns_rdatatype_aaaa, &r);
+ ISC_LIST_APPEND(dns64_rdatalist->rdata, dns64_rdata,
+ link);
+ dns64_rdata = NULL;
+ dns_rdata_reset(&rdata);
+ }
+ }
+ if (result != ISC_R_NOMORE)
+ goto cleanup;
+
+ if (ISC_LIST_EMPTY(dns64_rdatalist->rdata))
+ goto cleanup;
+
+ result = dns_rdatalist_tordataset(dns64_rdatalist, dns64_rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ client->query.attributes |= NS_QUERYATTR_NOADDITIONAL;
+ dns64_rdataset->trust = rdataset->trust;
+ query_addrdataset(client, mname, dns64_rdataset);
+ dns64_rdataset = NULL;
+ dns64_rdatalist = NULL;
+ dns_message_takebuffer(client->message, &buffer);
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (buffer != NULL)
+ isc_buffer_free(&buffer);
+
+ if (dns64_rdata != NULL)
+ dns_message_puttemprdata(client->message, &dns64_rdata);
+
+ if (dns64_rdataset != NULL)
+ dns_message_puttemprdataset(client->message, &dns64_rdataset);
+
+ if (dns64_rdatalist != NULL) {
+ for (dns64_rdata = ISC_LIST_HEAD(dns64_rdatalist->rdata);
+ dns64_rdata != NULL;
+ dns64_rdata = ISC_LIST_HEAD(dns64_rdatalist->rdata))
+ {
+ ISC_LIST_UNLINK(dns64_rdatalist->rdata,
+ dns64_rdata, link);
+ dns_message_puttemprdata(client->message, &dns64_rdata);
+ }
+ dns_message_puttemprdatalist(client->message, &dns64_rdatalist);
+ }
+
+ CTRACE("query_dns64: done");
+ return (result);
+}
+
+static void
+query_filter64(ns_client_t *client, dns_name_t **namep,
+ dns_rdataset_t *rdataset, isc_buffer_t *dbuf,
+ dns_section_t section)
+{
+ dns_name_t *name, *mname;
+ dns_rdata_t *myrdata;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdatalist_t *myrdatalist;
+ dns_rdataset_t *myrdataset;
+ isc_buffer_t *buffer;
+ isc_region_t r;
+ isc_result_t result;
+ unsigned int i;
+
+ CTRACE("query_filter64");
+
+ INSIST(client->query.dns64_aaaaok != NULL);
+ INSIST(client->query.dns64_aaaaoklen == dns_rdataset_count(rdataset));
+
+ name = *namep;
+ mname = NULL;
+ buffer = NULL;
+ myrdata = NULL;
+ myrdataset = NULL;
+ myrdatalist = NULL;
+ result = dns_message_findname(client->message, section,
+ name, dns_rdatatype_aaaa,
+ rdataset->covers,
+ &mname, &myrdataset);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * We've already got an RRset of the given name and type.
+ * There's nothing else to do;
+ */
+ CTRACE("query_filter64: dns_message_findname succeeded: done");
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ return;
+ } else if (result == DNS_R_NXDOMAIN) {
+ mname = name;
+ *namep = NULL;
+ } else {
+ RUNTIME_CHECK(result == DNS_R_NXRRSET);
+ if (dbuf != NULL)
+ query_releasename(client, namep);
+ dbuf = NULL;
+ }
+
+ if (rdataset->trust != dns_trust_secure &&
+ (section == DNS_SECTION_ANSWER ||
+ section == DNS_SECTION_AUTHORITY))
+ client->query.attributes &= ~NS_QUERYATTR_SECURE;
+
+ result = isc_buffer_allocate(client->mctx, &buffer,
+ 16 * dns_rdataset_count(rdataset));
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdataset(client->message, &myrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_message_gettemprdatalist(client->message, &myrdatalist);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_rdataset_init(myrdataset);
+ dns_rdatalist_init(myrdatalist);
+ myrdatalist->rdclass = dns_rdataclass_in;
+ myrdatalist->type = dns_rdatatype_aaaa;
+ myrdatalist->ttl = rdataset->ttl;
+
+ i = 0;
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ if (!client->query.dns64_aaaaok[i++])
+ continue;
+ dns_rdataset_current(rdataset, &rdata);
+ INSIST(rdata.length == 16);
+ isc_buffer_putmem(buffer, rdata.data, rdata.length);
+ isc_buffer_remainingregion(buffer, &r);
+ isc_buffer_forward(buffer, rdata.length);
+ result = dns_message_gettemprdata(client->message, &myrdata);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rdata_init(myrdata);
+ dns_rdata_fromregion(myrdata, dns_rdataclass_in,
+ dns_rdatatype_aaaa, &r);
+ ISC_LIST_APPEND(myrdatalist->rdata, myrdata, link);
+ myrdata = NULL;
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto cleanup;
+
+ result = dns_rdatalist_tordataset(myrdatalist, myrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ client->query.attributes |= NS_QUERYATTR_NOADDITIONAL;
+ if (mname == name) {
+ if (dbuf != NULL)
+ query_keepname(client, name, dbuf);
+ dns_message_addname(client->message, name, section);
+ dbuf = NULL;
+ }
+ myrdataset->trust = rdataset->trust;
+ query_addrdataset(client, mname, myrdataset);
+ myrdataset = NULL;
+ myrdatalist = NULL;
+ dns_message_takebuffer(client->message, &buffer);
+
+ cleanup:
+ if (buffer != NULL)
+ isc_buffer_free(&buffer);
+
+ if (myrdata != NULL)
+ dns_message_puttemprdata(client->message, &myrdata);
+
+ if (myrdataset != NULL)
+ dns_message_puttemprdataset(client->message, &myrdataset);
+
+ if (myrdatalist != NULL) {
+ for (myrdata = ISC_LIST_HEAD(myrdatalist->rdata);
+ myrdata != NULL;
+ myrdata = ISC_LIST_HEAD(myrdatalist->rdata))
+ {
+ ISC_LIST_UNLINK(myrdatalist->rdata, myrdata, link);
+ dns_message_puttemprdata(client->message, &myrdata);
+ }
+ dns_message_puttemprdatalist(client->message, &myrdatalist);
+ }
+ if (dbuf != NULL)
+ query_releasename(client, &name);
+
+ CTRACE("query_filter64: done");
+}
+
static void
query_addrrset(ns_client_t *client, dns_name_t **namep,
dns_rdataset_t **rdatasetp, dns_rdataset_t **sigrdatasetp,
@@ -2036,7 +2475,7 @@ query_addrrset(ns_client_t *client, dns_name_t **namep,
static inline isc_result_t
query_addsoa(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version,
- isc_boolean_t zero_ttl, isc_boolean_t isassociated)
+ unsigned int override_ttl, isc_boolean_t isassociated)
{
dns_name_t *name;
dns_dbnode_t *node;
@@ -2119,10 +2558,11 @@ query_addsoa(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version,
if (result != ISC_R_SUCCESS)
goto cleanup;
- if (zero_ttl) {
- rdataset->ttl = 0;
+ if (override_ttl != ISC_UINT32_MAX &&
+ override_ttl < rdataset->ttl) {
+ rdataset->ttl = override_ttl;
if (sigrdataset != NULL)
- sigrdataset->ttl = 0;
+ sigrdataset->ttl = override_ttl;
}
/*
@@ -2246,67 +2686,79 @@ query_addns(ns_client_t *client, dns_db_t *db, dns_dbversion_t *version) {
return (eresult);
}
-static inline isc_result_t
-query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
- dns_rdataset_t *dname, dns_name_t **anamep,
- dns_rdatatype_t type)
+static isc_result_t
+query_add_cname(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
+ dns_trust_t trust, dns_ttl_t ttl)
{
dns_rdataset_t *rdataset;
dns_rdatalist_t *rdatalist;
dns_rdata_t *rdata;
- isc_result_t result;
isc_region_t r;
+ dns_name_t *aname;
+ isc_result_t result;
/*
* We assume the name data referred to by tname won't go away.
*/
- REQUIRE(anamep != NULL);
+ aname = NULL;
+ result = dns_message_gettempname(client->message, &aname);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = dns_name_dup(qname, client->mctx, aname);
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(client->message, &aname);
+ return (result);
+ }
rdatalist = NULL;
result = dns_message_gettemprdatalist(client->message, &rdatalist);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(client->message, &aname);
return (result);
+ }
rdata = NULL;
result = dns_message_gettemprdata(client->message, &rdata);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(client->message, &aname);
+ dns_message_puttemprdatalist(client->message, &rdatalist);
return (result);
+ }
rdataset = NULL;
result = dns_message_gettemprdataset(client->message, &rdataset);
- if (result != ISC_R_SUCCESS)
- return (result);
- dns_rdataset_init(rdataset);
- result = dns_name_dup(qname, client->mctx, *anamep);
if (result != ISC_R_SUCCESS) {
- dns_message_puttemprdataset(client->message, &rdataset);
+ dns_message_puttempname(client->message, &aname);
+ dns_message_puttemprdatalist(client->message, &rdatalist);
+ dns_message_puttemprdata(client->message, &rdata);
return (result);
}
-
- rdatalist->type = type;
+ dns_rdataset_init(rdataset);
+ rdatalist->type = dns_rdatatype_cname;
rdatalist->covers = 0;
rdatalist->rdclass = client->message->rdclass;
- rdatalist->ttl = dname->ttl;
+ rdatalist->ttl = ttl;
dns_name_toregion(tname, &r);
rdata->data = r.base;
rdata->length = r.length;
rdata->rdclass = client->message->rdclass;
- rdata->type = type;
+ rdata->type = dns_rdatatype_cname;
ISC_LIST_INIT(rdatalist->rdata);
ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset)
== ISC_R_SUCCESS);
- rdataset->trust = dname->trust;
+ rdataset->trust = trust;
- query_addrrset(client, anamep, &rdataset, NULL, NULL,
+ query_addrrset(client, &aname, &rdataset, NULL, NULL,
DNS_SECTION_ANSWER);
-
if (rdataset != NULL) {
if (dns_rdataset_isassociated(rdataset))
dns_rdataset_disassociate(rdataset);
dns_message_puttemprdataset(client->message, &rdataset);
}
+ if (aname != NULL)
+ dns_message_puttempname(client->message, &aname);
return (ISC_R_SUCCESS);
}
@@ -2860,7 +3312,7 @@ query_addwildcardproof(ns_client_t *client, dns_db_t *db,
* j.example -> z.i.example NSEC example
* owner common example
* next common example
- * wild *.f.example
+ * wild *.example
*/
options = client->query.dboptions | DNS_DBFIND_NOWILD;
dns_fixedname_init(&wfixed);
@@ -3196,8 +3648,9 @@ query_resume(isc_task_t *task, isc_event_t *event) {
}
static isc_result_t
-query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
- dns_rdataset_t *nameservers, isc_boolean_t resuming)
+query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
+ dns_name_t *qdomain, dns_rdataset_t *nameservers,
+ isc_boolean_t resuming)
{
isc_result_t result;
dns_rdataset_t *rdataset, *sigrdataset;
@@ -3229,7 +3682,11 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
NS_LOGMODULE_QUERY,
ISC_LOG_WARNING,
"recursive-clients soft limit "
- "exceeded, aborting oldest query");
+ "exceeded (%d/%d/%d), "
+ "aborting oldest query",
+ client->recursionquota->used,
+ client->recursionquota->soft,
+ client->recursionquota->max);
}
ns_client_killoldestquery(client);
result = ISC_R_SUCCESS;
@@ -3242,7 +3699,11 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
ns_client_log(client, NS_LOGCATEGORY_CLIENT,
NS_LOGMODULE_QUERY,
ISC_LOG_WARNING,
- "no more recursive clients: %s",
+ "no more recursive clients "
+ "(%d/%d/%d): %s",
+ ns_g_server->recursionquota.used,
+ ns_g_server->recursionquota.soft,
+ ns_g_server->recursionquota.max,
isc_result_totext(result));
}
ns_client_killoldestquery(client);
@@ -3289,8 +3750,7 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
else
peeraddr = NULL;
result = dns_resolver_createfetch2(client->view->resolver,
- client->query.qname,
- qtype, qdomain, nameservers,
+ qname, qtype, qdomain, nameservers,
NULL, peeraddr, client->message->id,
client->query.fetchoptions,
client->task,
@@ -3313,6 +3773,696 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qdomain,
return (result);
}
+static inline void
+rpz_clean(dns_zone_t **zonep, dns_db_t **dbp, dns_dbnode_t **nodep,
+ dns_rdataset_t **rdatasetp)
+{
+ if (nodep != NULL && *nodep != NULL) {
+ REQUIRE(dbp != NULL && *dbp != NULL);
+ dns_db_detachnode(*dbp, nodep);
+ }
+ if (dbp != NULL && *dbp != NULL)
+ dns_db_detach(dbp);
+ if (zonep != NULL && *zonep != NULL)
+ dns_zone_detach(zonep);
+ if (rdatasetp != NULL && *rdatasetp != NULL &&
+ dns_rdataset_isassociated(*rdatasetp))
+ dns_rdataset_disassociate(*rdatasetp);
+}
+
+static inline isc_result_t
+rpz_ready(ns_client_t *client, dns_zone_t **zonep, dns_db_t **dbp,
+ dns_dbnode_t **nodep, dns_rdataset_t **rdatasetp)
+{
+ REQUIRE(rdatasetp != NULL);
+
+ rpz_clean(zonep, dbp, nodep, rdatasetp);
+ if (*rdatasetp == NULL) {
+ *rdatasetp = query_newrdataset(client);
+ if (*rdatasetp == NULL)
+ return (DNS_R_SERVFAIL);
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static void
+rpz_st_clear(ns_client_t *client) {
+ dns_rpz_st_t *st = client->query.rpz_st;
+
+ rpz_clean(&st->m.zone, &st->m.db, &st->m.node, NULL);
+ if (st->m.rdataset != NULL)
+ query_putrdataset(client, &st->m.rdataset);
+
+ rpz_clean(NULL, &st->ns.db, NULL, NULL);
+ if (st->ns.ns_rdataset != NULL)
+ query_putrdataset(client, &st->ns.ns_rdataset);
+ if (st->ns.r_rdataset != NULL)
+ query_putrdataset(client, &st->ns.r_rdataset);
+
+ rpz_clean(&st->q.zone, &st->q.db, &st->q.node, NULL);
+ if (st->q.rdataset != NULL)
+ query_putrdataset(client, &st->q.rdataset);
+ if (st->q.sigrdataset != NULL)
+ query_putrdataset(client, &st->q.sigrdataset);
+ st->state = 0;
+}
+
+/*
+ * Get NS, A, or AAAA rrset for rpz nsdname or nsip checking.
+ */
+static isc_result_t
+rpz_ns_find(ns_client_t *client, dns_name_t *name, dns_rdatatype_t type,
+ dns_db_t **dbp, dns_dbversion_t *version,
+ dns_rdataset_t **rdatasetp, isc_boolean_t resuming)
+{
+ dns_rpz_st_t *st;
+ isc_boolean_t is_zone;
+ dns_dbnode_t *node;
+ dns_fixedname_t fixed;
+ dns_name_t *found;
+ isc_result_t result;
+
+ st = client->query.rpz_st;
+ if ((st->state & DNS_RPZ_RECURSING) != 0) {
+ INSIST(st->ns.r_type == type);
+ INSIST(dns_name_equal(name, st->r_name));
+ INSIST(*rdatasetp == NULL ||
+ !dns_rdataset_isassociated(*rdatasetp));
+ st->state &= ~DNS_RPZ_RECURSING;
+ *dbp = st->ns.db;
+ st->ns.db = NULL;
+ if (*rdatasetp != NULL)
+ query_putrdataset(client, rdatasetp);
+ *rdatasetp = st->ns.r_rdataset;
+ st->ns.r_rdataset = NULL;
+ result = st->ns.r_result;
+ if (result == DNS_R_DELEGATION) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ DNS_RPZ_TYPE_NSIP, name,
+ "rpz_ns_find() ", result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ result = DNS_R_SERVFAIL;
+ }
+ return (result);
+ }
+
+ result = rpz_ready(client, NULL, NULL, NULL, rdatasetp);
+ if (result != ISC_R_SUCCESS) {
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ return (result);
+ }
+ if (*dbp != NULL) {
+ is_zone = ISC_FALSE;
+ } else {
+ dns_zone_t *zone;
+
+ version = NULL;
+ zone = NULL;
+ result = query_getdb(client, name, type, 0, &zone, dbp,
+ &version, &is_zone);
+ if (result != ISC_R_SUCCESS) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ DNS_RPZ_TYPE_NSIP, name, "NS getdb() ",
+ result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ return (result);
+ }
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ }
+
+ node = NULL;
+ dns_fixedname_init(&fixed);
+ found = dns_fixedname_name(&fixed);
+ result = dns_db_find(*dbp, name, version, type, 0, client->now, &node,
+ found, *rdatasetp, NULL);
+ if (result == DNS_R_DELEGATION && is_zone && USECACHE(client)) {
+ /*
+ * Try the cache if we're authoritative for an
+ * ancestor but not the domain itself.
+ */
+ rpz_clean(NULL, dbp, &node, rdatasetp);
+ version = NULL;
+ dns_db_attach(client->view->cachedb, dbp);
+ result = dns_db_find(*dbp, name, version, dns_rdatatype_ns,
+ 0, client->now, &node, found,
+ *rdatasetp, NULL);
+ }
+ rpz_clean(NULL, dbp, &node, NULL);
+ if (result == DNS_R_DELEGATION) {
+ /*
+ * Recurse to get NS rrset or A or AAAA rrset for an NS name.
+ */
+ rpz_clean(NULL, NULL, NULL, rdatasetp);
+ dns_name_copy(name, st->r_name, NULL);
+ result = query_recurse(client, type, st->r_name, NULL, NULL,
+ resuming);
+ if (result == ISC_R_SUCCESS) {
+ st->state |= DNS_RPZ_RECURSING;
+ result = DNS_R_DELEGATION;
+ }
+ }
+ return (result);
+}
+
+/*
+ * Check the IP address in an A or AAAA rdataset against
+ * the IP or NSIP response policy rules of a view.
+ */
+static isc_result_t
+rpz_rewrite_ip(ns_client_t *client, dns_rdataset_t *rdataset,
+ dns_rpz_type_t rpz_type)
+{
+ dns_rpz_st_t *st;
+ dns_dbversion_t *version;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_rpz_zone_t *new_rpz;
+ isc_result_t result;
+
+ st = client->query.rpz_st;
+ if (st->m.rdataset == NULL) {
+ st->m.rdataset = query_newrdataset(client);
+ if (st->m.rdataset == NULL)
+ return (DNS_R_SERVFAIL);
+ }
+ zone = NULL;
+ db = NULL;
+ for (new_rpz = ISC_LIST_HEAD(client->view->rpz_zones);
+ new_rpz != NULL;
+ new_rpz = ISC_LIST_NEXT(new_rpz, link)) {
+ version = NULL;
+
+ /*
+ * Find the database for this policy zone to get its
+ * radix tree.
+ */
+ result = rpz_getdb(client, rpz_type, &new_rpz->origin,
+ &zone, &db, &version);
+ if (result != ISC_R_SUCCESS) {
+ rpz_clean(&zone, &db, NULL, NULL);
+ continue;
+ }
+ /*
+ * Look for a better (e.g. longer prefix) hit for an IP address
+ * in this rdataset in this radix tree than than the previous
+ * hit, if any. Note the domain name and quality of the
+ * best hit.
+ */
+ result = dns_db_rpz_findips(new_rpz, rpz_type, zone, db,
+ version, rdataset, st);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ rpz_clean(&zone, &db, NULL, NULL);
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+rpz_rewrite_nsip(ns_client_t *client, dns_rdatatype_t type, dns_name_t *name,
+ dns_db_t **dbp, dns_dbversion_t *version,
+ dns_rdataset_t **rdatasetp, isc_boolean_t resuming)
+{
+ isc_result_t result;
+
+ result = rpz_ns_find(client, name, type, dbp, version, rdatasetp,
+ resuming);
+ switch (result) {
+ case ISC_R_SUCCESS:
+ result = rpz_rewrite_ip(client, *rdatasetp, DNS_RPZ_TYPE_NSIP);
+ break;
+ case DNS_R_EMPTYNAME:
+ case DNS_R_EMPTYWILD:
+ case DNS_R_NXDOMAIN:
+ case DNS_R_NCACHENXDOMAIN:
+ case DNS_R_NXRRSET:
+ case DNS_R_NCACHENXRRSET:
+ result = ISC_R_SUCCESS;
+ break;
+ case DNS_R_DELEGATION:
+ case DNS_R_DUPLICATE:
+ case DNS_R_DROP:
+ break;
+ default:
+ if (client->query.rpz_st->m.policy != DNS_RPZ_POLICY_ERROR) {
+ client->query.rpz_st->m.policy = DNS_RPZ_POLICY_ERROR;
+ rpz_fail_log(client, ISC_LOG_WARNING, DNS_RPZ_TYPE_NSIP,
+ name, "NS address rewrite nsip ", result);
+ }
+ break;
+ }
+ return (result);
+}
+
+/*
+ * Get the rrset from a response policy zone.
+ */
+static isc_result_t
+rpz_find(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qnamef,
+ dns_name_t *sname, dns_rpz_type_t rpz_type, dns_zone_t **zonep,
+ dns_db_t **dbp, dns_dbnode_t **nodep, dns_rdataset_t **rdatasetp,
+ dns_rpz_policy_t *policyp)
+{
+ dns_dbversion_t *version;
+ dns_rpz_policy_t policy;
+ dns_fixedname_t fixed;
+ dns_name_t *found;
+ isc_result_t result;
+
+ result = rpz_ready(client, zonep, dbp, nodep, rdatasetp);
+ if (result != ISC_R_SUCCESS) {
+ *policyp = DNS_RPZ_POLICY_ERROR;
+ return (result);
+ }
+
+ /*
+ * Try to get either a CNAME or the type of record demanded by the
+ * request from the policy zone.
+ */
+ version = NULL;
+ result = rpz_getdb(client, rpz_type, qnamef, zonep, dbp, &version);
+ if (result != ISC_R_SUCCESS) {
+ *policyp = DNS_RPZ_POLICY_MISS;
+ return (DNS_R_NXDOMAIN);
+ }
+
+ dns_fixedname_init(&fixed);
+ found = dns_fixedname_name(&fixed);
+ result = dns_db_find(*dbp, qnamef, version, dns_rdatatype_any, 0,
+ client->now, nodep, found, *rdatasetp, NULL);
+ if (result == ISC_R_SUCCESS) {
+ dns_rdatasetiter_t *rdsiter;
+
+ rdsiter = NULL;
+ result = dns_db_allrdatasets(*dbp, *nodep, version, 0,
+ &rdsiter);
+ if (result != ISC_R_SUCCESS) {
+ dns_db_detachnode(*dbp, nodep);
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL, rpz_type,
+ qnamef, "allrdatasets()", result);
+ *policyp = DNS_RPZ_POLICY_ERROR;
+ return (DNS_R_SERVFAIL);
+ }
+ for (result = dns_rdatasetiter_first(rdsiter);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsiter)) {
+ dns_rdatasetiter_current(rdsiter, *rdatasetp);
+ if ((*rdatasetp)->type == dns_rdatatype_cname ||
+ (*rdatasetp)->type == qtype)
+ break;
+ dns_rdataset_disassociate(*rdatasetp);
+ }
+ dns_rdatasetiter_destroy(&rdsiter);
+ if (result != ISC_R_SUCCESS) {
+ if (result != ISC_R_NOMORE) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ rpz_type, qnamef, "rdatasetiter",
+ result);
+ *policyp = DNS_RPZ_POLICY_ERROR;
+ return (DNS_R_SERVFAIL);
+ }
+ /*
+ * Ask again to get the right DNS_R_DNAME/NXRRSET/...
+ * result if there is neither a CNAME nor target type.
+ */
+ if (dns_rdataset_isassociated(*rdatasetp))
+ dns_rdataset_disassociate(*rdatasetp);
+ dns_db_detachnode(*dbp, nodep);
+
+ if (qtype == dns_rdatatype_rrsig ||
+ qtype == dns_rdatatype_sig)
+ result = DNS_R_NXRRSET;
+ else
+ result = dns_db_find(*dbp, qnamef, version,
+ qtype, 0, client->now,
+ nodep, found, *rdatasetp,
+ NULL);
+ }
+ }
+ switch (result) {
+ case ISC_R_SUCCESS:
+ if ((*rdatasetp)->type != dns_rdatatype_cname) {
+ policy = DNS_RPZ_POLICY_RECORD;
+ } else {
+ policy = dns_rpz_decode_cname(*rdatasetp, sname);
+ if (policy == DNS_RPZ_POLICY_RECORD &&
+ qtype != dns_rdatatype_cname &&
+ qtype != dns_rdatatype_any)
+ result = DNS_R_CNAME;
+ }
+ break;
+ case DNS_R_DNAME:
+ /*
+ * DNAME policy RRs have very few if any uses that are not
+ * better served with simple wildcards. Making the work would
+ * require complications to get the number of labels matched
+ * in the name or the found name itself to the main DNS_R_DNAME
+ * case in query_find(). So fall through to treat them as NODATA.
+ */
+ case DNS_R_NXRRSET:
+ policy = DNS_RPZ_POLICY_NODATA;
+ break;
+ case DNS_R_NXDOMAIN:
+ case DNS_R_EMPTYNAME:
+ /*
+ * If we don't get a qname hit,
+ * see if it is worth looking for other types.
+ */
+ dns_db_rpz_enabled(*dbp, client->query.rpz_st);
+ dns_db_detach(dbp);
+ dns_zone_detach(zonep);
+ policy = DNS_RPZ_POLICY_MISS;
+ break;
+ default:
+ dns_db_detach(dbp);
+ dns_zone_detach(zonep);
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL, rpz_type, qnamef,
+ "", result);
+ policy = DNS_RPZ_POLICY_ERROR;
+ result = DNS_R_SERVFAIL;
+ break;
+ }
+
+ *policyp = policy;
+ return (result);
+}
+
+/*
+ * Build and look for a QNAME or NSDNAME owner name in a response policy zone.
+ */
+static isc_result_t
+rpz_rewrite_name(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
+ dns_rpz_type_t rpz_type, dns_rdataset_t **rdatasetp)
+{
+ dns_rpz_st_t *st;
+ dns_rpz_zone_t *rpz;
+ dns_fixedname_t prefixf, rpz_qnamef;
+ dns_name_t *prefix, *suffix, *rpz_qname;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_dbnode_t *node;
+ dns_rpz_policy_t policy;
+ unsigned int labels;
+ isc_result_t result;
+
+ st = client->query.rpz_st;
+ zone = NULL;
+ db = NULL;
+ node = NULL;
+
+ for (rpz = ISC_LIST_HEAD(client->view->rpz_zones);
+ rpz != NULL;
+ rpz = ISC_LIST_NEXT(rpz, link)) {
+ /*
+ * Construct the rule's owner name.
+ */
+ dns_fixedname_init(&prefixf);
+ prefix = dns_fixedname_name(&prefixf);
+ dns_name_split(qname, 1, prefix, NULL);
+ if (rpz_type == DNS_RPZ_TYPE_NSDNAME)
+ suffix = &rpz->nsdname;
+ else
+ suffix = &rpz->origin;
+ dns_fixedname_init(&rpz_qnamef);
+ rpz_qname = dns_fixedname_name(&rpz_qnamef);
+ for (;;) {
+ result = dns_name_concatenate(prefix, suffix,
+ rpz_qname, NULL);
+ if (result == ISC_R_SUCCESS)
+ break;
+ INSIST(result == DNS_R_NAMETOOLONG);
+ labels = dns_name_countlabels(prefix);
+ if (labels < 2) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ rpz_type, suffix,
+ "concatentate() ", result);
+ return (ISC_R_SUCCESS);
+ }
+ if (labels+1 == dns_name_countlabels(qname)) {
+ rpz_fail_log(client, DNS_RPZ_DEBUG_LEVEL1,
+ rpz_type, suffix,
+ "concatentate() ", result);
+ }
+ dns_name_split(prefix, labels - 1, NULL, prefix);
+ }
+
+ /*
+ * See if the qname rule (or RR) exists.
+ */
+ result = rpz_find(client, qtype, rpz_qname, qname, rpz_type,
+ &zone, &db, &node, rdatasetp, &policy);
+ switch (result) {
+ case DNS_R_NXDOMAIN:
+ case DNS_R_EMPTYNAME:
+ break;
+ case DNS_R_SERVFAIL:
+ rpz_clean(&zone, &db, &node, rdatasetp);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ return (DNS_R_SERVFAIL);
+ default:
+ /*
+ * when more than one name or address hits a rule,
+ * prefer the first set of names (qname or NS),
+ * the first policy zone, and the smallest name
+ */
+ if (st->m.type == rpz_type &&
+ rpz->num > st->m.rpz->num &&
+ 0 <= dns_name_compare(rpz_qname, st->qname))
+ continue;
+ rpz_clean(&st->m.zone, &st->m.db, &st->m.node,
+ &st->m.rdataset);
+ st->m.rpz = rpz;
+ st->m.type = rpz_type;
+ st->m.prefix = 0;
+ st->m.policy = policy;
+ st->m.result = result;
+ dns_name_copy(rpz_qname, st->qname, NULL);
+ if (dns_rdataset_isassociated(*rdatasetp)) {
+ dns_rdataset_t *trdataset;
+
+ trdataset = st->m.rdataset;
+ st->m.rdataset = *rdatasetp;
+ *rdatasetp = trdataset;
+ st->m.ttl = st->m.rdataset->ttl;
+ } else {
+ st->m.ttl = DNS_RPZ_TTL_DEFAULT;
+ }
+ st->m.node = node;
+ node = NULL;
+ st->m.db = db;
+ db = NULL;
+ st->m.zone = zone;
+ zone = NULL;
+ }
+ }
+
+ rpz_clean(&zone, &db, &node, rdatasetp);
+ return (ISC_R_SUCCESS);
+}
+
+/*
+ * Look for response policy zone NSIP and NSDNAME rewriting.
+ */
+static isc_result_t
+rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype,
+ isc_boolean_t resuming)
+{
+ dns_rpz_st_t *st;
+ dns_db_t *ipdb;
+ dns_rdataset_t *rdataset;
+ dns_fixedname_t nsnamef;
+ dns_name_t *nsname;
+ dns_dbversion_t *version;
+ isc_result_t result;
+
+ ipdb = NULL;
+ rdataset = NULL;
+
+ st = client->query.rpz_st;
+ if (st == NULL) {
+ st = isc_mem_get(client->mctx, sizeof(*st));
+ if (st == NULL)
+ return (ISC_R_NOMEMORY);
+ st->state = 0;
+ memset(&st->m, 0, sizeof(st->m));
+ memset(&st->ns, 0, sizeof(st->ns));
+ memset(&st->q, 0, sizeof(st->q));
+ dns_fixedname_init(&st->_qnamef);
+ dns_fixedname_init(&st->_r_namef);
+ dns_fixedname_init(&st->_fnamef);
+ st->qname = dns_fixedname_name(&st->_qnamef);
+ st->r_name = dns_fixedname_name(&st->_r_namef);
+ st->fname = dns_fixedname_name(&st->_fnamef);
+ client->query.rpz_st = st;
+ }
+ if ((st->state & DNS_RPZ_DONE_QNAME) == 0) {
+ st->state = DNS_RPZ_DONE_QNAME;
+ st->m.type = DNS_RPZ_TYPE_BAD;
+ st->m.policy = DNS_RPZ_POLICY_MISS;
+
+ /*
+ * Check rules for the name if this it the first time,
+ * i.e. we've not been recursing.
+ */
+ result = DNS_R_SERVFAIL;
+ st->state &= ~(DNS_RPZ_HAVE_IP | DNS_RPZ_HAVE_NSIPv4 |
+ DNS_RPZ_HAVE_NSIPv6 | DNS_RPZ_HAD_NSDNAME);
+ result = rpz_rewrite_name(client, qtype, client->query.qname,
+ DNS_RPZ_TYPE_QNAME, &rdataset);
+ if (st->m.policy != DNS_RPZ_POLICY_MISS)
+ goto cleanup;
+ if ((st->state & (DNS_RPZ_HAVE_NSIPv4 | DNS_RPZ_HAVE_NSIPv6 |
+ DNS_RPZ_HAD_NSDNAME)) == 0)
+ goto cleanup;
+ st->ns.label = dns_name_countlabels(client->query.qname);
+ }
+
+ dns_fixedname_init(&nsnamef);
+ dns_name_clone(client->query.qname, dns_fixedname_name(&nsnamef));
+ while (st->ns.label > 1 && st->m.policy == DNS_RPZ_POLICY_MISS) {
+ if (st->ns.label == dns_name_countlabels(client->query.qname)) {
+ nsname = client->query.qname;
+ } else {
+ nsname = dns_fixedname_name(&nsnamef);
+ dns_name_split(client->query.qname, st->ns.label,
+ NULL, nsname);
+ }
+ if (st->ns.ns_rdataset == NULL ||
+ !dns_rdataset_isassociated(st->ns.ns_rdataset)) {
+ dns_db_t *db = NULL;
+ result = rpz_ns_find(client, nsname, dns_rdatatype_ns,
+ &db, NULL, &st->ns.ns_rdataset,
+ resuming);
+ if (db != NULL)
+ dns_db_detach(&db);
+ if (result != ISC_R_SUCCESS) {
+ if (result == DNS_R_DELEGATION)
+ goto cleanup;
+ if (result == DNS_R_EMPTYNAME ||
+ result == DNS_R_NXRRSET ||
+ result == DNS_R_EMPTYWILD ||
+ result == DNS_R_NXDOMAIN ||
+ result == DNS_R_NCACHENXDOMAIN ||
+ result == DNS_R_NCACHENXRRSET ||
+ result == DNS_R_CNAME ||
+ result == DNS_R_DNAME) {
+ rpz_fail_log(client,
+ DNS_RPZ_DEBUG_LEVEL2,
+ DNS_RPZ_TYPE_NSIP, nsname,
+ "NS db_find() ", result);
+ dns_rdataset_disassociate(st->ns.
+ ns_rdataset);
+ st->ns.label--;
+ continue;
+ }
+ if (st->m.policy != DNS_RPZ_POLICY_ERROR) {
+ rpz_fail_log(client, DNS_RPZ_INFO_LEVEL,
+ DNS_RPZ_TYPE_NSIP, nsname,
+ "NS db_find() ", result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ }
+ goto cleanup;
+ }
+ result = dns_rdataset_first(st->ns.ns_rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ /*
+ * Check all NS names.
+ */
+ do {
+ dns_rdata_ns_t ns;
+ dns_rdata_t nsrdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(st->ns.ns_rdataset, &nsrdata);
+ result = dns_rdata_tostruct(&nsrdata, &ns, NULL);
+ dns_rdata_reset(&nsrdata);
+ if (result != ISC_R_SUCCESS) {
+ rpz_fail_log(client, DNS_RPZ_ERROR_LEVEL,
+ DNS_RPZ_TYPE_NSIP, nsname,
+ "rdata_tostruct() ", result);
+ st->m.policy = DNS_RPZ_POLICY_ERROR;
+ goto cleanup;
+ }
+ if ((st->state & DNS_RPZ_HAD_NSDNAME) != 0) {
+ result = rpz_rewrite_name(client, qtype,
+ &ns.name,
+ DNS_RPZ_TYPE_NSDNAME,
+ &rdataset);
+ if (result != ISC_R_SUCCESS) {
+ dns_rdata_freestruct(&ns);
+ goto cleanup;
+ }
+ }
+ /*
+ * Check all IP addresses for this NS name, but don't
+ * bother without NSIP rules or with a NSDNAME hit.
+ */
+ version = NULL;
+ if ((st->state & DNS_RPZ_HAVE_NSIPv4) != 0 &&
+ st->m.type != DNS_RPZ_TYPE_NSDNAME &&
+ (st->state & DNS_RPZ_DONE_A) == 0) {
+ result = rpz_rewrite_nsip(client,
+ dns_rdatatype_a,
+ &ns.name, &ipdb,
+ version, &rdataset,
+ resuming);
+ if (result == ISC_R_SUCCESS)
+ st->state |= DNS_RPZ_DONE_A;
+ }
+ if (result == ISC_R_SUCCESS &&
+ (st->state & DNS_RPZ_HAVE_NSIPv6) != 0 &&
+ st->m.type != DNS_RPZ_TYPE_NSDNAME) {
+ result = rpz_rewrite_nsip(client,
+ dns_rdatatype_aaaa,
+ &ns.name, &ipdb, version,
+ &rdataset, resuming);
+ }
+ dns_rdata_freestruct(&ns);
+ if (ipdb != NULL)
+ dns_db_detach(&ipdb);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ st->state &= ~DNS_RPZ_DONE_A;
+ result = dns_rdataset_next(st->ns.ns_rdataset);
+ } while (result == ISC_R_SUCCESS);
+ dns_rdataset_disassociate(st->ns.ns_rdataset);
+ st->ns.label--;
+ }
+
+ /*
+ * Use the best, if any, hit.
+ */
+ result = ISC_R_SUCCESS;
+
+cleanup:
+ if (st->m.policy != DNS_RPZ_POLICY_MISS &&
+ st->m.policy != DNS_RPZ_POLICY_NO_OP &&
+ st->m.policy != DNS_RPZ_POLICY_ERROR &&
+ st->m.rpz->policy != DNS_RPZ_POLICY_GIVEN)
+ st->m.policy = st->m.rpz->policy;
+ if (st->m.policy == DNS_RPZ_POLICY_NO_OP)
+ rpz_log(client);
+ if (st->m.policy == DNS_RPZ_POLICY_MISS ||
+ st->m.policy == DNS_RPZ_POLICY_NO_OP ||
+ st->m.policy == DNS_RPZ_POLICY_ERROR)
+ rpz_clean(&st->m.zone, &st->m.db, &st->m.node, &st->m.rdataset);
+ if (st->m.policy != DNS_RPZ_POLICY_MISS)
+ st->state |= DNS_RPZ_REWRITTEN;
+ if (st->m.policy == DNS_RPZ_POLICY_ERROR) {
+ st->m.type = DNS_RPZ_TYPE_BAD;
+ result = DNS_R_SERVFAIL;
+ }
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ if ((st->state & DNS_RPZ_RECURSING) == 0) {
+ rpz_clean(NULL, &st->ns.db, NULL, &st->ns.ns_rdataset);
+ }
+
+ return (result);
+}
+
#define MAX_RESTARTS 16
#define QUERY_ERROR(r) \
@@ -3698,6 +4848,99 @@ query_findclosestnsec3(dns_name_t *qname, dns_db_t *db,
return;
}
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+static isc_boolean_t
+is_v4_client(ns_client_t *client) {
+ if (isc_sockaddr_pf(&client->peeraddr) == AF_INET)
+ return (ISC_TRUE);
+ if (isc_sockaddr_pf(&client->peeraddr) == AF_INET6 &&
+ IN6_IS_ADDR_V4MAPPED(&client->peeraddr.type.sin6.sin6_addr))
+ return (ISC_TRUE);
+ return (ISC_FALSE);
+}
+#endif
+
+static isc_uint32_t
+dns64_ttl(dns_db_t *db, dns_dbversion_t *version) {
+ dns_dbnode_t *node = NULL;
+ dns_rdata_soa_t soa;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_t rdataset;
+ isc_result_t result;
+ isc_uint32_t ttl = ISC_UINT32_MAX;
+
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rdataset_init(&rdataset);
+ result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa,
+ 0, 0, &rdataset, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_rdataset_first(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_rdataset_current(&rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &soa, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ ttl = ISC_MIN(rdataset.ttl, soa.minimum);
+
+cleanup:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (ttl);
+}
+
+static isc_boolean_t
+dns64_aaaaok(ns_client_t *client, dns_rdataset_t *rdataset,
+ dns_rdataset_t *sigrdataset)
+{
+ isc_netaddr_t netaddr;
+ dns_dns64_t *dns64 = ISC_LIST_HEAD(client->view->dns64);
+ unsigned int flags = 0;
+ unsigned int i, count;
+ isc_boolean_t *aaaaok;
+
+ INSIST(client->query.dns64_aaaaok == NULL);
+ INSIST(client->query.dns64_aaaaoklen == 0);
+ INSIST(client->query.dns64_aaaa == NULL);
+ INSIST(client->query.dns64_sigaaaa == NULL);
+
+ if (dns64 == NULL)
+ return (ISC_TRUE);
+
+ if (RECURSIONOK(client))
+ flags |= DNS_DNS64_RECURSIVE;
+
+ if (sigrdataset != NULL && dns_rdataset_isassociated(sigrdataset))
+ flags |= DNS_DNS64_DNSSEC;
+
+ count = dns_rdataset_count(rdataset);
+ aaaaok = isc_mem_get(client->mctx, sizeof(isc_boolean_t) * count);
+
+ isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
+ if (dns_dns64_aaaaok(dns64, &netaddr, client->signer,
+ &ns_g_server->aclenv, flags, rdataset,
+ aaaaok, count)) {
+ for (i = 0; i < count; i++) {
+ if (aaaaok != NULL && !aaaaok[i]) {
+ client->query.dns64_aaaaok = aaaaok;
+ client->query.dns64_aaaaoklen = count;
+ break;
+ }
+ }
+ if (i == count)
+ isc_mem_put(client->mctx, aaaaok,
+ sizeof(isc_boolean_t) * count);
+ return (ISC_TRUE);
+ }
+ isc_mem_put(client->mctx, aaaaok, sizeof(isc_boolean_t) * count);
+ return (ISC_FALSE);
+}
+
/*
* Do the bulk of query processing for the current query of 'client'.
* If 'event' is non-NULL, we are returning from recursion and 'qtype'
@@ -3716,6 +4959,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdatasetiter_t *rdsiter;
isc_boolean_t want_restart, authoritative, is_zone, need_wildcardproof;
+ isc_boolean_t is_staticstub_zone;
unsigned int n, nlabels;
dns_namereln_t namereln;
int order;
@@ -3731,8 +4975,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
unsigned int options;
isc_boolean_t empty_wild;
dns_rdataset_t *noqname;
+ dns_rpz_st_t *rpz_st;
isc_boolean_t resuming;
int line = -1;
+ isc_boolean_t dns64_exclude, dns64;
CTRACE("query_find");
@@ -3758,28 +5004,67 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
zone = NULL;
need_wildcardproof = ISC_FALSE;
empty_wild = ISC_FALSE;
+ dns64_exclude = dns64 = ISC_FALSE;
options = 0;
resuming = ISC_FALSE;
is_zone = ISC_FALSE;
+ is_staticstub_zone = ISC_FALSE;
if (event != NULL) {
/*
* We're returning from recursion. Restore the query context
* and resume.
*/
-
want_restart = ISC_FALSE;
- authoritative = ISC_FALSE;
- qtype = event->qtype;
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_RECURSING) != 0) {
+ is_zone = rpz_st->q.is_zone;
+ authoritative = rpz_st->q.authoritative;
+ zone = rpz_st->q.zone;
+ rpz_st->q.zone = NULL;
+ node = rpz_st->q.node;
+ rpz_st->q.node = NULL;
+ db = rpz_st->q.db;
+ rpz_st->q.db = NULL;
+ rdataset = rpz_st->q.rdataset;
+ rpz_st->q.rdataset = NULL;
+ sigrdataset = rpz_st->q.sigrdataset;
+ rpz_st->q.sigrdataset = NULL;
+ qtype = rpz_st->q.qtype;
+
+ if (event->node != NULL)
+ dns_db_detachnode(db, &event->node);
+ rpz_st->ns.db = event->db;
+ rpz_st->ns.r_type = event->qtype;
+ rpz_st->ns.r_rdataset = event->rdataset;
+ if (event->sigrdataset != NULL &&
+ dns_rdataset_isassociated(event->sigrdataset))
+ dns_rdataset_disassociate(event->sigrdataset);
+ } else {
+ authoritative = ISC_FALSE;
+
+ qtype = event->qtype;
+ db = event->db;
+ node = event->node;
+ rdataset = event->rdataset;
+ sigrdataset = event->sigrdataset;
+ }
+
if (qtype == dns_rdatatype_rrsig || qtype == dns_rdatatype_sig)
type = dns_rdatatype_any;
else
type = qtype;
- db = event->db;
- node = event->node;
- rdataset = event->rdataset;
- sigrdataset = event->sigrdataset;
+
+ if (DNS64(client)) {
+ client->query.attributes &= ~NS_QUERYATTR_DNS64;
+ dns64 = ISC_TRUE;
+ }
+ if (DNS64EXCLUDE(client)) {
+ client->query.attributes &= ~NS_QUERYATTR_DNS64EXCLUDE;
+ dns64_exclude = ISC_TRUE;
+ }
/*
* We'll need some resources...
@@ -3794,16 +5079,26 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
QUERY_ERROR(DNS_R_SERVFAIL);
goto cleanup;
}
- tname = dns_fixedname_name(&event->foundname);
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_RECURSING) != 0) {
+ tname = rpz_st->fname;
+ } else {
+ tname = dns_fixedname_name(&event->foundname);
+ }
result = dns_name_copy(tname, fname, NULL);
if (result != ISC_R_SUCCESS) {
QUERY_ERROR(DNS_R_SERVFAIL);
goto cleanup;
}
-
- result = event->result;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_RECURSING) != 0) {
+ rpz_st->ns.r_result = event->result;
+ result = rpz_st->q.result;
+ isc_event_free(ISC_EVENT_PTR(&event));
+ } else {
+ result = event->result;
+ }
resuming = ISC_TRUE;
-
goto resume;
}
@@ -3902,8 +5197,12 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
goto cleanup;
}
- if (is_zone)
+ is_staticstub_zone = ISC_FALSE;
+ if (is_zone && zone != NULL) {
authoritative = ISC_TRUE;
+ if (dns_zone_gettype(zone) == dns_zone_staticstub)
+ is_staticstub_zone = ISC_TRUE;
+ }
if (event == NULL && client->query.restarts == 0) {
if (is_zone) {
@@ -3956,6 +5255,119 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
resume:
CTRACE("query_find: resume");
+
+ if (!ISC_LIST_EMPTY(client->view->rpz_zones) &&
+ RECURSIONOK(client) && !RECURSING(client) &&
+ result != DNS_R_DELEGATION && result != ISC_R_NOTFOUND &&
+ (client->query.rpz_st == NULL ||
+ (client->query.rpz_st->state & DNS_RPZ_REWRITTEN) == 0) &&
+ !dns_name_equal(client->query.qname, dns_rootname)) {
+ isc_result_t rresult;
+
+ rresult = rpz_rewrite(client, qtype, resuming);
+ rpz_st = client->query.rpz_st;
+ switch (rresult) {
+ case ISC_R_SUCCESS:
+ break;
+ case DNS_R_DELEGATION:
+ /*
+ * recursing for NS names or addresses,
+ * so save the main query state
+ */
+ rpz_st->q.qtype = qtype;
+ rpz_st->q.is_zone = is_zone;
+ rpz_st->q.authoritative = authoritative;
+ rpz_st->q.zone = zone;
+ zone = NULL;
+ rpz_st->q.db = db;
+ db = NULL;
+ rpz_st->q.node = node;
+ node = NULL;
+ rpz_st->q.rdataset = rdataset;
+ rdataset = NULL;
+ rpz_st->q.sigrdataset = sigrdataset;
+ sigrdataset = NULL;
+ dns_name_copy(fname, rpz_st->fname, NULL);
+ rpz_st->q.result = result;
+ client->query.attributes |= NS_QUERYATTR_RECURSING;
+ result = ISC_R_SUCCESS;
+ goto cleanup;
+ default:
+ RECURSE_ERROR(rresult);
+ goto cleanup;
+ }
+ if (rpz_st->m.policy != DNS_RPZ_POLICY_MISS &&
+ rpz_st->m.policy != DNS_RPZ_POLICY_NO_OP) {
+ result = dns_name_copy(client->query.qname, fname,
+ NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ finish_rewrite:
+ rpz_clean(&zone, &db, &node, NULL);
+ if (rpz_st->m.rdataset != NULL) {
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ rdataset = rpz_st->m.rdataset;
+ rpz_st->m.rdataset = NULL;
+ } else if (rdataset != NULL &&
+ dns_rdataset_isassociated(rdataset)) {
+ dns_rdataset_disassociate(rdataset);
+ }
+ node = rpz_st->m.node;
+ rpz_st->m.node = NULL;
+ db = rpz_st->m.db;
+ rpz_st->m.db = NULL;
+ zone = rpz_st->m.zone;
+ rpz_st->m.zone = NULL;
+
+ result = rpz_st->m.result;
+ switch (rpz_st->m.policy) {
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ result = DNS_R_NXDOMAIN;
+ break;
+ case DNS_RPZ_POLICY_NODATA:
+ result = DNS_R_NXRRSET;
+ break;
+ case DNS_RPZ_POLICY_RECORD:
+ if (type == dns_rdatatype_any &&
+ result != DNS_R_CNAME &&
+ dns_rdataset_isassociated(rdataset))
+ dns_rdataset_disassociate(rdataset);
+ break;
+ case DNS_RPZ_POLICY_CNAME:
+ result = dns_name_copy(&rpz_st->m.rpz->cname,
+ fname, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ query_keepname(client, fname, dbuf);
+ result = query_add_cname(client,
+ client->query.qname,
+ fname,
+ dns_trust_authanswer,
+ rpz_st->m.ttl);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ ns_client_qnamereplace(client, fname);
+ fname = NULL;
+ client->attributes &= ~NS_CLIENTATTR_WANTDNSSEC;
+ rpz_log(client);
+ want_restart = ISC_TRUE;
+ goto cleanup;
+ default:
+ INSIST(0);
+ }
+
+ /*
+ * Turn off DNSSEC because the results of a
+ * response policy zone cannot verify.
+ */
+ client->attributes &= ~NS_CLIENTATTR_WANTDNSSEC;
+ if (sigrdataset != NULL &&
+ dns_rdataset_isassociated(sigrdataset))
+ dns_rdataset_disassociate(sigrdataset);
+ is_zone = ISC_TRUE;
+ rpz_log(client);
+ }
+ }
+
switch (result) {
case ISC_R_SUCCESS:
/*
@@ -4008,11 +5420,18 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
*/
if (RECURSIONOK(client)) {
result = query_recurse(client, qtype,
+ client->query.qname,
NULL, NULL, resuming);
- if (result == ISC_R_SUCCESS)
+ if (result == ISC_R_SUCCESS) {
client->query.attributes |=
NS_QUERYATTR_RECURSING;
- else
+ if (dns64)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64;
+ if (dns64_exclude)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64EXCLUDE;
+ } else
RECURSE_ERROR(result);
goto cleanup;
} else {
@@ -4143,12 +5562,22 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
} else {
if (zfname != NULL &&
- !dns_name_issubdomain(fname, zfname)) {
+ (!dns_name_issubdomain(fname, zfname) ||
+ (is_staticstub_zone &&
+ dns_name_equal(fname, zfname)))) {
/*
- * We've already got a delegation from
- * authoritative data, and it is better
- * than what we found in the cache. Use
- * it instead of the cache delegation.
+ * In the following cases use "authoritative"
+ * data instead of the cache delegation:
+ * 1. We've already got a delegation from
+ * authoritative data, and it is better
+ * than what we found in the cache.
+ * 2. The query name matches the origin name
+ * of a static-stub zone. This needs to be
+ * considered for the case where the NS of
+ * the static-stub zone and the cached NS
+ * are different. We still need to contact
+ * the nameservers configured in the
+ * static-stub zone.
*/
query_releasename(client, &fname);
fname = zfname;
@@ -4183,15 +5612,31 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
*/
if (dns_rdatatype_atparent(type))
result = query_recurse(client, qtype,
- NULL, NULL,
- resuming);
+ client->query.qname,
+ NULL, NULL, resuming);
+ else if (dns64)
+ result = query_recurse(client,
+ dns_rdatatype_a,
+ client->query.qname,
+ NULL, NULL, resuming);
else
result = query_recurse(client, qtype,
- fname, rdataset,
- resuming);
- if (result == ISC_R_SUCCESS)
+ client->query.qname,
+ fname, rdataset,
+ resuming);
+
+ if (result == ISC_R_SUCCESS) {
client->query.attributes |=
NS_QUERYATTR_RECURSING;
+ if (dns64)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64;
+ if (dns64_exclude)
+ client->query.attributes |=
+ NS_QUERYATTR_DNS64EXCLUDE;
+ } else if (result == DNS_R_DUPLICATE ||
+ result == DNS_R_DROP)
+ QUERY_ERROR(result);
else
RECURSE_ERROR(result);
} else {
@@ -4231,11 +5676,75 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
}
goto cleanup;
+
case DNS_R_EMPTYNAME:
- result = DNS_R_NXRRSET;
- /* FALLTHROUGH */
case DNS_R_NXRRSET:
+ nxrrset:
INSIST(is_zone);
+
+#ifdef dns64_bis_return_excluded_addresses
+ if (dns64)
+#else
+ if (dns64 && !dns64_exclude)
+#endif
+ {
+ /*
+ * Restore the answers from the previous AAAA lookup.
+ */
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ if (sigrdataset != NULL)
+ query_putrdataset(client, &sigrdataset);
+ rdataset = client->query.dns64_aaaa;
+ sigrdataset = client->query.dns64_sigaaaa;
+ if (fname == NULL) {
+ dbuf = query_getnamebuf(client);
+ if (dbuf == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ fname = query_newname(client, dbuf, &b);
+ if (fname == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ }
+ dns_name_copy(client->query.qname, fname, NULL);
+ client->query.dns64_aaaa = NULL;
+ client->query.dns64_sigaaaa = NULL;
+ dns64 = ISC_FALSE;
+#ifdef dns64_bis_return_excluded_addresses
+ /*
+ * Resume the diverted processing of the AAAA response?
+ */
+ if (dns64_excluded)
+ break;
+#endif
+ } else if (result == DNS_R_NXRRSET &&
+ !ISC_LIST_EMPTY(client->view->dns64) &&
+ client->message->rdclass == dns_rdataclass_in &&
+ qtype == dns_rdatatype_aaaa)
+ {
+ /*
+ * Look to see if there are A records for this
+ * name.
+ */
+ INSIST(client->query.dns64_aaaa == NULL);
+ INSIST(client->query.dns64_sigaaaa == NULL);
+ client->query.dns64_aaaa = rdataset;
+ client->query.dns64_sigaaaa = sigrdataset;
+ client->query.dns64_ttl = dns64_ttl(db, version);
+ query_releasename(client, &fname);
+ dns_db_detachnode(db, &node);
+ rdataset = NULL;
+ sigrdataset = NULL;
+ type = qtype = dns_rdatatype_a;
+ dns64 = ISC_TRUE;
+ goto db_find;
+ }
+
+ result = DNS_R_NXRRSET;
+
/*
* Look for a NSEC3 record if we don't have a NSEC record.
*/
@@ -4258,10 +5767,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* instead? If so add the nearest to the
* closest provable encloser.
*/
- if (found &&
- dns_rdataset_isassociated(rdataset) &&
- !dns_name_equal(qname, found))
- {
+ if (dns_rdataset_isassociated(rdataset) &&
+ !dns_name_equal(qname, found)) {
unsigned int count;
unsigned int skip;
@@ -4328,7 +5835,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
/*
* Add SOA.
*/
- result = query_addsoa(client, db, version, ISC_FALSE,
+ result = query_addsoa(client, db, version, ISC_UINT32_MAX,
dns_rdataset_isassociated(rdataset));
if (result != ISC_R_SUCCESS) {
QUERY_ERROR(result);
@@ -4377,10 +5884,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
zone != NULL &&
#endif
dns_zone_getzeronosoattl(zone))
- result = query_addsoa(client, db, version, ISC_TRUE,
+ result = query_addsoa(client, db, version, 0,
dns_rdataset_isassociated(rdataset));
else
- result = query_addsoa(client, db, version, ISC_FALSE,
+ result = query_addsoa(client, db, version,
+ ISC_UINT32_MAX,
dns_rdataset_isassociated(rdataset));
if (result != ISC_R_SUCCESS) {
QUERY_ERROR(result);
@@ -4411,6 +5919,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
case DNS_R_NCACHENXDOMAIN:
case DNS_R_NCACHENXRRSET:
+ ncache_nxrrset:
INSIST(!is_zone);
authoritative = ISC_FALSE;
/*
@@ -4426,6 +5935,74 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
client->message->rdclass == dns_rdataclass_in &&
dns_name_countlabels(fname) == 7)
warn_rfc1918(client, fname, rdataset);
+
+#ifdef dns64_bis_return_excluded_addresses
+ if (dns64)
+#else
+ if (dns64 && !dns64_exclude)
+#endif
+ {
+ /*
+ * Restore the answers from the previous AAAA lookup.
+ */
+ if (rdataset != NULL)
+ query_putrdataset(client, &rdataset);
+ if (sigrdataset != NULL)
+ query_putrdataset(client, &sigrdataset);
+ rdataset = client->query.dns64_aaaa;
+ sigrdataset = client->query.dns64_sigaaaa;
+ if (fname == NULL) {
+ dbuf = query_getnamebuf(client);
+ if (dbuf == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ fname = query_newname(client, dbuf, &b);
+ if (fname == NULL) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ }
+ dns_name_copy(client->query.qname, fname, NULL);
+ client->query.dns64_aaaa = NULL;
+ client->query.dns64_sigaaaa = NULL;
+ dns64 = ISC_FALSE;
+#ifdef dns64_bis_return_excluded_addresses
+ if (dns64_excluded)
+ break;
+#endif
+ } else if (result == DNS_R_NCACHENXRRSET &&
+ !ISC_LIST_EMPTY(client->view->dns64) &&
+ client->message->rdclass == dns_rdataclass_in &&
+ qtype == dns_rdatatype_aaaa)
+ {
+ /*
+ * Look to see if there are A records for this
+ * name.
+ */
+ INSIST(client->query.dns64_aaaa == NULL);
+ INSIST(client->query.dns64_sigaaaa == NULL);
+ client->query.dns64_aaaa = rdataset;
+ client->query.dns64_sigaaaa = sigrdataset;
+ /*
+ * If the ttl is zero we need to workout if we have just
+ * decremented to zero or if there was no negative cache
+ * ttl in the answer.
+ */
+ if (rdataset->ttl != 0)
+ client->query.dns64_ttl = rdataset->ttl;
+ else if (dns_rdataset_first(rdataset) == ISC_R_SUCCESS)
+ client->query.dns64_ttl = 0;
+ query_releasename(client, &fname);
+ dns_db_detachnode(db, &node);
+ rdataset = NULL;
+ sigrdataset = NULL;
+ fname = NULL;
+ type = qtype = dns_rdatatype_a;
+ dns64 = ISC_TRUE;
+ goto db_find;
+ }
+
/*
* We don't call query_addrrset() because we don't need any
* of its extra features (and things would probably break!).
@@ -4562,11 +6139,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_message_puttempname(client->message, &tname);
goto cleanup;
}
- dns_name_init(tname, NULL);
dns_name_clone(&dname.dname, tname);
dns_rdata_freestruct(&dname);
/*
- * Construct the new qname.
+ * Construct the new qname consisting of
+ * <found name prefix>.<dname target>
*/
dns_fixedname_init(&fixed);
prefix = dns_fixedname_name(&fixed);
@@ -4583,8 +6160,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
goto cleanup;
}
result = dns_name_concatenate(prefix, tname, fname, NULL);
+ dns_message_puttempname(client->message, &tname);
if (result != ISC_R_SUCCESS) {
- dns_message_puttempname(client->message, &tname);
if (result == ISC_R_NOSPACE) {
/*
* RFC2672, section 4.1, subsection 3c says
@@ -4597,11 +6174,12 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
query_keepname(client, fname, dbuf);
/*
- * Synthesize a CNAME for this DNAME.
+ * Synthesize a CNAME consisting of
+ * <old qname> <dname ttl> CNAME <new qname>
+ * with <dname trust value>
*
- * We want to synthesize a CNAME since if we don't
- * then older software that doesn't understand DNAME
- * will not chain like it should.
+ * Synthesize a CNAME so old old clients that don't understand
+ * DNAME can chain.
*
* We do not try to synthesize a signature because we hope
* that security aware servers will understand DNAME. Also,
@@ -4609,12 +6187,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* on-the-fly is costly, and not really legitimate anyway
* since the synthesized CNAME is NOT in the zone.
*/
- dns_name_init(tname, NULL);
- (void)query_addcnamelike(client, client->query.qname, fname,
- trdataset, &tname,
- dns_rdatatype_cname);
- if (tname != NULL)
- dns_message_puttempname(client->message, &tname);
+ result = query_add_cname(client, client->query.qname, fname,
+ trdataset->trust, trdataset->ttl);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
/*
* Switch to the new qname and restart.
*/
@@ -4641,6 +6217,28 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
}
if (type == dns_rdatatype_any) {
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ isc_boolean_t have_aaaa, have_a, have_sig, filter_aaaa;
+
+ /*
+ * The filter-aaaa-on-v4 option should
+ * suppress AAAAs for IPv4 clients if there is an A.
+ * If we are not authoritative, assume there is a A
+ * even in if it is not in our cache. This assumption could
+ * be wrong but it is a good bet.
+ */
+ have_aaaa = ISC_FALSE;
+ have_a = !authoritative;
+ have_sig = ISC_FALSE;
+ if (client->view->v4_aaaa != dns_v4_aaaa_ok &&
+ is_v4_client(client) &&
+ ns_client_checkaclsilent(client, NULL,
+ client->view->v4_aaaa_acl,
+ ISC_TRUE) == ISC_R_SUCCESS)
+ filter_aaaa = ISC_TRUE;
+ else
+ filter_aaaa = ISC_FALSE;
+#endif
/*
* XXXRTH Need to handle zonecuts with special case
* code.
@@ -4652,6 +6250,54 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
QUERY_ERROR(DNS_R_SERVFAIL);
goto cleanup;
}
+
+ /*
+ * Check all A and AAAA records in all response policy
+ * IP address zones
+ */
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_DONE_QNAME) != 0 &&
+ (rpz_st->state & DNS_RPZ_REWRITTEN) == 0 &&
+ RECURSIONOK(client) && !RECURSING(client) &&
+ (rpz_st->state & DNS_RPZ_HAVE_IP) != 0) {
+ for (result = dns_rdatasetiter_first(rdsiter);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsiter)) {
+ dns_rdatasetiter_current(rdsiter, rdataset);
+ if (rdataset->type == dns_rdatatype_a ||
+ rdataset->type == dns_rdatatype_aaaa)
+ result = rpz_rewrite_ip(client,
+ rdataset,
+ DNS_RPZ_TYPE_IP);
+ dns_rdataset_disassociate(rdataset);
+ if (result != ISC_R_SUCCESS)
+ break;
+ }
+ if (result != ISC_R_NOMORE) {
+ dns_rdatasetiter_destroy(&rdsiter);
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ switch (rpz_st->m.policy) {
+ case DNS_RPZ_POLICY_MISS:
+ break;
+ case DNS_RPZ_POLICY_NO_OP:
+ rpz_log(client);
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ break;
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ case DNS_RPZ_POLICY_NODATA:
+ case DNS_RPZ_POLICY_RECORD:
+ case DNS_RPZ_POLICY_CNAME:
+ dns_rdatasetiter_destroy(&rdsiter);
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ goto finish_rewrite;
+ default:
+ INSIST(0);
+ }
+ }
+
/*
* Calling query_addrrset() with a non-NULL dbuf is going
* to either keep or release the name. We don't want it to
@@ -4668,6 +6314,18 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
result = dns_rdatasetiter_first(rdsiter);
while (result == ISC_R_SUCCESS) {
dns_rdatasetiter_current(rdsiter, rdataset);
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Notice the presence of A and AAAAs so
+ * that AAAAs can be hidden from IPv4 clients.
+ */
+ if (filter_aaaa) {
+ if (rdataset->type == dns_rdatatype_aaaa)
+ have_aaaa = ISC_TRUE;
+ else if (rdataset->type == dns_rdatatype_a)
+ have_a = ISC_TRUE;
+ }
+#endif
if (is_zone && qtype == dns_rdatatype_any &&
!dns_db_issecure(db) &&
dns_rdatatype_isdnssec(rdataset->type)) {
@@ -4679,6 +6337,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_rdataset_disassociate(rdataset);
} else if ((qtype == dns_rdatatype_any ||
rdataset->type == qtype) && rdataset->type != 0) {
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ if (dns_rdatatype_isdnssec(rdataset->type))
+ have_sig = ISC_TRUE;
+#endif
if (NOQNAME(rdataset) && WANTDNSSEC(client))
noqname = rdataset;
else
@@ -4709,6 +6371,16 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
result = dns_rdatasetiter_next(rdsiter);
}
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Filter AAAAs if there is an A and there is no signature
+ * or we are supposed to break DNSSEC.
+ */
+ if (filter_aaaa && have_aaaa && have_a &&
+ (!have_sig || !WANTDNSSEC(client) ||
+ client->view->v4_aaaa == dns_v4_aaaa_break_dnssec))
+ client->attributes |= NS_CLIENTATTR_FILTER_AAAA;
+#endif
if (fname != NULL)
dns_message_puttempname(client->message, &fname);
@@ -4742,10 +6414,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_rdatasetiter_destroy(&rdsiter);
if (RECURSIONOK(client)) {
result = query_recurse(client,
- qtype,
- NULL,
- NULL,
- resuming);
+ qtype,
+ client->query.qname,
+ NULL, NULL,
+ resuming);
if (result == ISC_R_SUCCESS)
client->query.attributes |=
NS_QUERYATTR_RECURSING;
@@ -4763,7 +6435,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* Add SOA.
*/
result = query_addsoa(client, db, version,
- ISC_FALSE, ISC_FALSE);
+ ISC_UINT32_MAX,
+ ISC_FALSE);
if (result == ISC_R_SUCCESS)
result = ISC_R_NOMORE;
} else {
@@ -4783,6 +6456,162 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
* This is the "normal" case -- an ordinary question to which
* we know the answer.
*/
+
+ /*
+ * Check all A and AAAA records in all response policy
+ * IP address zones
+ */
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL &&
+ (rpz_st->state & DNS_RPZ_DONE_QNAME) != 0 &&
+ (rpz_st->state & DNS_RPZ_REWRITTEN) == 0 &&
+ RECURSIONOK(client) && !RECURSING(client) &&
+ (rpz_st->state & DNS_RPZ_HAVE_IP) != 0 &&
+ (qtype == dns_rdatatype_aaaa || qtype == dns_rdatatype_a)) {
+ result = rpz_rewrite_ip(client, rdataset,
+ DNS_RPZ_TYPE_IP);
+ if (result != ISC_R_SUCCESS) {
+ QUERY_ERROR(DNS_R_SERVFAIL);
+ goto cleanup;
+ }
+ /*
+ * After a hit in the radix tree for the policy domain,
+ * either stop trying to rewrite (DNS_RPZ_POLICY_NO_OP)
+ * or restart to ask the ordinary database of the
+ * policy zone for the DNS record corresponding to the
+ * record in the radix tree.
+ */
+ switch (rpz_st->m.policy) {
+ case DNS_RPZ_POLICY_MISS:
+ break;
+ case DNS_RPZ_POLICY_NO_OP:
+ rpz_log(client);
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ break;
+ case DNS_RPZ_POLICY_NXDOMAIN:
+ case DNS_RPZ_POLICY_NODATA:
+ case DNS_RPZ_POLICY_RECORD:
+ case DNS_RPZ_POLICY_CNAME:
+ rpz_st->state |= DNS_RPZ_REWRITTEN;
+ goto finish_rewrite;
+ default:
+ INSIST(0);
+ }
+ }
+
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Optionally hide AAAAs from IPv4 clients if there is an A.
+ * We add the AAAAs now, but might refuse to render them later
+ * after DNSSEC is figured out.
+ * This could be more efficient, but the whole idea is
+ * so fundamentally wrong, unavoidably inaccurate, and
+ * unneeded that it is best to keep it as short as possible.
+ */
+ if (client->view->v4_aaaa != dns_v4_aaaa_ok &&
+ is_v4_client(client) &&
+ ns_client_checkaclsilent(client, NULL,
+ client->view->v4_aaaa_acl,
+ ISC_TRUE) == ISC_R_SUCCESS &&
+ (!WANTDNSSEC(client) ||
+ sigrdataset == NULL ||
+ !dns_rdataset_isassociated(sigrdataset) ||
+ client->view->v4_aaaa == dns_v4_aaaa_break_dnssec)) {
+ if (qtype == dns_rdatatype_aaaa) {
+ trdataset = query_newrdataset(client);
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_a, 0,
+ client->now,
+ trdataset, NULL);
+ if (dns_rdataset_isassociated(trdataset))
+ dns_rdataset_disassociate(trdataset);
+ query_putrdataset(client, &trdataset);
+
+ /*
+ * We have an AAAA but the A is not in our cache.
+ * Assume any result other than DNS_R_DELEGATION
+ * or ISC_R_NOTFOUND means there is no A and
+ * so AAAAs are ok.
+ * Assume there is no A if we can't recurse
+ * for this client, although that could be
+ * the wrong answer. What else can we do?
+ * Besides, that we have the AAAA and are using
+ * this mechanism suggests that we care more
+ * about As than AAAAs and would have cached
+ * the A if it existed.
+ */
+ if (result == ISC_R_SUCCESS) {
+ client->attributes |=
+ NS_CLIENTATTR_FILTER_AAAA;
+
+ } else if (authoritative ||
+ !RECURSIONOK(client) ||
+ (result != DNS_R_DELEGATION &&
+ result != ISC_R_NOTFOUND)) {
+ client->attributes &=
+ ~NS_CLIENTATTR_FILTER_AAAA;
+ } else {
+ /*
+ * This is an ugly kludge to recurse
+ * for the A and discard the result.
+ *
+ * Continue to add the AAAA now.
+ * We'll make a note to not render it
+ * if the recursion for the A succeeds.
+ */
+ result = query_recurse(client,
+ dns_rdatatype_a,
+ client->query.qname,
+ NULL, NULL, resuming);
+ if (result == ISC_R_SUCCESS) {
+ client->attributes |=
+ NS_CLIENTATTR_FILTER_AAAA_RC;
+ client->query.attributes |=
+ NS_QUERYATTR_RECURSING;
+ }
+ }
+
+ } else if (qtype == dns_rdatatype_a &&
+ (client->attributes &
+ NS_CLIENTATTR_FILTER_AAAA_RC) != 0) {
+ client->attributes &=
+ ~NS_CLIENTATTR_FILTER_AAAA_RC;
+ client->attributes |=
+ NS_CLIENTATTR_FILTER_AAAA;
+ dns_rdataset_disassociate(rdataset);
+ if (sigrdataset != NULL &&
+ dns_rdataset_isassociated(sigrdataset))
+ dns_rdataset_disassociate(sigrdataset);
+ goto cleanup;
+ }
+ }
+#endif
+ /*
+ * Check to see if the AAAA RRset has non-excluded addresses
+ * in it. If not look for a A RRset.
+ */
+ INSIST(client->query.dns64_aaaaok == NULL);
+
+ if (qtype == dns_rdatatype_aaaa && !dns64_exclude &&
+ !ISC_LIST_EMPTY(client->view->dns64) &&
+ client->message->rdclass == dns_rdataclass_in &&
+ !dns64_aaaaok(client, rdataset, sigrdataset)) {
+ /*
+ * Look to see if there are A records for this
+ * name.
+ */
+ client->query.dns64_aaaa = rdataset;
+ client->query.dns64_sigaaaa = sigrdataset;
+ client->query.dns64_ttl = rdataset->ttl;
+ query_releasename(client, &fname);
+ dns_db_detachnode(db, &node);
+ rdataset = NULL;
+ sigrdataset = NULL;
+ type = qtype = dns_rdatatype_a;
+ dns64_exclude = dns64 = ISC_TRUE;
+ goto db_find;
+ }
+
if (sigrdataset != NULL)
sigrdatasetp = &sigrdataset;
else
@@ -4798,8 +6627,43 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
dns_name_equal(client->query.qname, dns_rootname))
client->query.attributes &= ~NS_QUERYATTR_NOADDITIONAL;
- query_addrrset(client, &fname, &rdataset, sigrdatasetp, dbuf,
- DNS_SECTION_ANSWER);
+ if (dns64) {
+ qtype = type = dns_rdatatype_aaaa;
+ result = query_dns64(client, &fname, rdataset,
+ sigrdataset, dbuf,
+ DNS_SECTION_ANSWER);
+ dns_rdataset_disassociate(rdataset);
+ dns_message_puttemprdataset(client->message, &rdataset);
+ if (result == ISC_R_NOMORE) {
+#ifndef dns64_bis_return_excluded_addresses
+ if (dns64_exclude) {
+ if (!is_zone)
+ goto cleanup;
+ /*
+ * Add a fake SOA record.
+ */
+ result = query_addsoa(client, db,
+ version, 600,
+ ISC_FALSE);
+ goto cleanup;
+ }
+#endif
+ if (is_zone)
+ goto nxrrset;
+ else
+ goto ncache_nxrrset;
+ } else if (result != ISC_R_SUCCESS) {
+ eresult = result;
+ goto cleanup;
+ }
+ } else if (client->query.dns64_aaaaok != NULL) {
+ query_filter64(client, &fname, rdataset, dbuf,
+ DNS_SECTION_ANSWER);
+ query_putrdataset(client, &rdataset);
+ } else
+ query_addrrset(client, &fname, &rdataset,
+ sigrdatasetp, dbuf, DNS_SECTION_ANSWER);
+
if (noqname != NULL)
query_addnoqnameproof(client, noqname);
/*
@@ -4842,6 +6706,10 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
/*
* General cleanup.
*/
+ rpz_st = client->query.rpz_st;
+ if (rpz_st != NULL && (rpz_st->state & DNS_RPZ_RECURSING) == 0)
+ rpz_clean(&rpz_st->m.zone, &rpz_st->m.db, &rpz_st->m.node,
+ &rpz_st->m.rdataset);
if (rdataset != NULL)
query_putrdataset(client, &rdataset);
if (sigrdataset != NULL)
@@ -4949,6 +6817,7 @@ log_query(ns_client_t *client, unsigned int flags, unsigned int extflags) {
char namebuf[DNS_NAME_FORMATSIZE];
char typename[DNS_RDATATYPE_FORMATSIZE];
char classname[DNS_RDATACLASS_FORMATSIZE];
+ char onbuf[ISC_NETADDR_FORMATSIZE];
dns_rdataset_t *rdataset;
int level = ISC_LOG_INFO;
@@ -4960,14 +6829,18 @@ log_query(ns_client_t *client, unsigned int flags, unsigned int extflags) {
dns_name_format(client->query.qname, namebuf, sizeof(namebuf));
dns_rdataclass_format(rdataset->rdclass, classname, sizeof(classname));
dns_rdatatype_format(rdataset->type, typename, sizeof(typename));
+ isc_netaddr_format(&client->destaddr, onbuf, sizeof(onbuf));
ns_client_log(client, NS_LOGCATEGORY_QUERIES, NS_LOGMODULE_QUERY,
- level, "query: %s %s %s %s%s%s%s%s", namebuf, classname,
- typename, WANTRECURSION(client) ? "+" : "-",
+ level, "query: %s %s %s %s%s%s%s%s%s (%s)", namebuf,
+ classname, typename, WANTRECURSION(client) ? "+" : "-",
(client->signer != NULL) ? "S": "",
(client->opt != NULL) ? "E" : "",
+ ((client->attributes & NS_CLIENTATTR_TCP) != 0) ?
+ "T" : "",
((extflags & DNS_MESSAGEEXTFLAG_DO) != 0) ? "D" : "",
- ((flags & DNS_MESSAGEFLAG_CD) != 0) ? "C" : "");
+ ((flags & DNS_MESSAGEFLAG_CD) != 0) ? "C" : "",
+ onbuf);
}
static inline void
diff --git a/contrib/bind9/bin/named/server.c b/contrib/bind9/bin/named/server.c
index bc7fc17..5bbf94b 100644
--- a/contrib/bind9/bin/named/server.c
+++ b/contrib/bind9/bin/named/server.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: server.c,v 1.520.12.21 2011-01-14 23:45:49 tbox Exp $ */
+/* $Id: server.c,v 1.599.8.4 2011-02-16 19:46:12 each Exp $ */
/*! \file */
@@ -23,6 +23,10 @@
#include <stdlib.h>
#include <unistd.h>
+#include <limits.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <isc/app.h>
#include <isc/base64.h>
@@ -36,7 +40,9 @@
#include <isc/portset.h>
#include <isc/print.h>
#include <isc/resource.h>
+#include <isc/sha2.h>
#include <isc/socket.h>
+#include <isc/stat.h>
#include <isc/stats.h>
#include <isc/stdio.h>
#include <isc/string.h>
@@ -57,9 +63,11 @@
#ifdef DLZ
#include <dns/dlz.h>
#endif
+#include <dns/dns64.h>
#include <dns/forward.h>
#include <dns/journal.h>
#include <dns/keytable.h>
+#include <dns/keyvalues.h>
#include <dns/lib.h>
#include <dns/master.h>
#include <dns/masterdump.h>
@@ -102,6 +110,10 @@
#include <stdlib.h>
#endif
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
/*%
* Check an operation for failure. Assumes that the function
* using it has a 'result' variable and a 'cleanup' label.
@@ -143,6 +155,14 @@
fatal(msg, result); \
} while (0) \
+/*%
+ * Maximum ADB size for views that share a cache. Use this limit to suppress
+ * the total of memory footprint, which should be the main reason for sharing
+ * a cache. Only effective when a finite max-cache-size is specified.
+ * This is currently defined to be 8MB.
+ */
+#define MAX_ADB_SIZE_FOR_CACHESHARE 8388608
+
struct ns_dispatch {
isc_sockaddr_t addr;
unsigned int dispatchgen;
@@ -150,6 +170,14 @@ struct ns_dispatch {
ISC_LINK(struct ns_dispatch) link;
};
+struct ns_cache {
+ dns_cache_t *cache;
+ dns_view_t *primaryview;
+ isc_boolean_t needflush;
+ isc_boolean_t adbsizeadjusted;
+ ISC_LINK(ns_cache_t) link;
+};
+
struct dumpcontext {
isc_mem_t *mctx;
isc_boolean_t dumpcache;
@@ -176,6 +204,17 @@ struct zonelistentry {
ISC_LINK(struct zonelistentry) link;
};
+/*%
+ * Configuration context to retain for each view that allows
+ * new zones to be added at runtime
+ */
+struct cfg_context {
+ isc_mem_t * mctx;
+ cfg_obj_t * config;
+ cfg_parser_t * parser;
+ cfg_aclconfctx_t actx;
+};
+
/*
* These zones should not leak onto the Internet.
*/
@@ -230,8 +269,8 @@ static const struct {
{ NULL, ISC_FALSE }
};
-static void
-fatal(const char *msg, isc_result_t result);
+ISC_PLATFORM_NORETURN_PRE static void
+fatal(const char *msg, isc_result_t result) ISC_PLATFORM_NORETURN_POST;
static void
ns_server_reload(isc_task_t *task, isc_event_t *event);
@@ -256,19 +295,25 @@ configure_alternates(const cfg_obj_t *config, dns_view_t *view,
static isc_result_t
configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
const cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
- cfg_aclconfctx_t *aclconf);
+ cfg_aclconfctx_t *aclconf, isc_boolean_t added);
+
+static isc_result_t
+add_keydata_zone(dns_view_t *view, const char *directory, isc_mem_t *mctx);
static void
end_reserved_dispatches(ns_server_t *server, isc_boolean_t all);
+static void
+cfgctx_destroy(void **cfgp);
+
/*%
* Configure a single view ACL at '*aclp'. Get its configuration from
* 'vconfig' (for per-view configuration) and maybe from 'config'
*/
static isc_result_t
configure_view_acl(const cfg_obj_t *vconfig, const cfg_obj_t *config,
- const char *aclname, cfg_aclconfctx_t *actx,
- isc_mem_t *mctx, dns_acl_t **aclp)
+ const char *aclname, const char *acltuplename,
+ cfg_aclconfctx_t *actx, isc_mem_t *mctx, dns_acl_t **aclp)
{
isc_result_t result;
const cfg_obj_t *maps[3];
@@ -294,13 +339,21 @@ configure_view_acl(const cfg_obj_t *vconfig, const cfg_obj_t *config,
*/
return (ISC_R_SUCCESS);
+ if (acltuplename != NULL) {
+ /*
+ * If the ACL is given in an optional tuple, retrieve it.
+ * The parser should have ensured that a valid object be
+ * returned.
+ */
+ aclobj = cfg_tuple_get(aclobj, acltuplename);
+ }
+
result = cfg_acl_fromconfig(aclobj, config, ns_g_lctx,
actx, mctx, 0, aclp);
return (result);
}
-
/*%
* Configure a sortlist at '*aclp'. Essentially the same as
* configure_view_acl() except it calls cfg_acl_fromconfig with a
@@ -345,8 +398,88 @@ configure_view_sortlist(const cfg_obj_t *vconfig, const cfg_obj_t *config,
}
static isc_result_t
-configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
- dns_keytable_t *keytable, isc_mem_t *mctx)
+configure_view_nametable(const cfg_obj_t *vconfig, const cfg_obj_t *config,
+ const char *confname, const char *conftuplename,
+ isc_mem_t *mctx, dns_rbt_t **rbtp)
+{
+ isc_result_t result;
+ const cfg_obj_t *maps[3];
+ const cfg_obj_t *obj = NULL;
+ const cfg_listelt_t *element;
+ int i = 0;
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ isc_buffer_t b;
+ const char *str;
+ const cfg_obj_t *nameobj;
+
+ if (*rbtp != NULL)
+ dns_rbt_destroy(rbtp);
+ if (vconfig != NULL)
+ maps[i++] = cfg_tuple_get(vconfig, "options");
+ if (config != NULL) {
+ const cfg_obj_t *options = NULL;
+ (void)cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ maps[i++] = options;
+ }
+ maps[i] = NULL;
+
+ (void)ns_config_get(maps, confname, &obj);
+ if (obj == NULL)
+ /*
+ * No value available. *rbtp == NULL.
+ */
+ return (ISC_R_SUCCESS);
+
+ if (conftuplename != NULL) {
+ obj = cfg_tuple_get(obj, conftuplename);
+ if (cfg_obj_isvoid(obj))
+ return (ISC_R_SUCCESS);
+ }
+
+ result = dns_rbt_create(mctx, NULL, NULL, rbtp);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element)) {
+ nameobj = cfg_listelt_value(element);
+ str = cfg_obj_asstring(nameobj);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
+ /*
+ * We don't need the node data, but need to set dummy data to
+ * avoid a partial match with an empty node. For example, if
+ * we have foo.example.com and bar.example.com, we'd get a match
+ * for baz.example.com, which is not the expected result.
+ * We simply use (void *)1 as the dummy data.
+ */
+ result = dns_rbt_addname(*rbtp, name, (void *)1);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(nameobj, ns_g_lctx, ISC_LOG_ERROR,
+ "failed to add %s for %s: %s",
+ str, confname, isc_result_totext(result));
+ goto cleanup;
+ }
+
+ }
+
+ return (result);
+
+ cleanup:
+ dns_rbt_destroy(rbtp);
+ return (result);
+
+}
+
+static isc_result_t
+dstkey_fromconfig(const cfg_obj_t *vconfig, const cfg_obj_t *key,
+ isc_boolean_t managed, dst_key_t **target, isc_mem_t *mctx)
{
dns_rdataclass_t viewclass;
dns_rdata_dnskey_t keystruct;
@@ -363,12 +496,28 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
isc_result_t result;
dst_key_t *dstkey = NULL;
+ INSIST(target != NULL && *target == NULL);
+
flags = cfg_obj_asuint32(cfg_tuple_get(key, "flags"));
proto = cfg_obj_asuint32(cfg_tuple_get(key, "protocol"));
alg = cfg_obj_asuint32(cfg_tuple_get(key, "algorithm"));
keyname = dns_fixedname_name(&fkeyname);
keynamestr = cfg_obj_asstring(cfg_tuple_get(key, "name"));
+ if (managed) {
+ const char *initmethod;
+ initmethod = cfg_obj_asstring(cfg_tuple_get(key, "init"));
+
+ if (strcasecmp(initmethod, "initial-key") != 0) {
+ cfg_obj_log(key, ns_g_lctx, ISC_LOG_ERROR,
+ "managed key '%s': "
+ "invalid initialization method '%s'",
+ keynamestr, initmethod);
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+ }
+
if (vconfig == NULL)
viewclass = dns_rdataclass_in;
else {
@@ -408,7 +557,8 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
keystruct.algorithm == DST_ALG_RSAMD5) &&
r.length > 1 && r.base[0] == 1 && r.base[1] == 3)
cfg_obj_log(key, ns_g_lctx, ISC_LOG_WARNING,
- "trusted key '%s' has a weak exponent",
+ "%s key '%s' has a weak exponent",
+ managed ? "managed" : "trusted",
keynamestr);
CHECK(dns_rdata_fromstruct(NULL,
@@ -418,25 +568,28 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
dns_fixedname_init(&fkeyname);
isc_buffer_init(&namebuf, keynamestr, strlen(keynamestr));
isc_buffer_add(&namebuf, strlen(keynamestr));
- CHECK(dns_name_fromtext(keyname, &namebuf,
- dns_rootname, ISC_FALSE,
- NULL));
+ CHECK(dns_name_fromtext(keyname, &namebuf, dns_rootname, 0, NULL));
CHECK(dst_key_fromdns(keyname, viewclass, &rrdatabuf,
mctx, &dstkey));
- CHECK(dns_keytable_add(keytable, &dstkey));
- INSIST(dstkey == NULL);
+ *target = dstkey;
return (ISC_R_SUCCESS);
cleanup:
if (result == DST_R_NOCRYPTO) {
cfg_obj_log(key, ns_g_lctx, ISC_LOG_ERROR,
- "ignoring trusted key for '%s': no crypto support",
+ "ignoring %s key for '%s': no crypto support",
+ managed ? "managed" : "trusted",
keynamestr);
- result = ISC_R_SUCCESS;
+ } else if (result == DST_R_UNSUPPORTEDALG) {
+ cfg_obj_log(key, ns_g_lctx, ISC_LOG_WARNING,
+ "skipping %s key for '%s': %s",
+ managed ? "managed" : "trusted",
+ keynamestr, isc_result_totext(result));
} else {
cfg_obj_log(key, ns_g_lctx, ISC_LOG_ERROR,
- "configuring trusted key for '%s': %s",
+ "configuring %s key for '%s': %s",
+ managed ? "managed" : "trusted",
keynamestr, isc_result_totext(result));
result = ISC_R_FAILURE;
}
@@ -447,63 +600,215 @@ configure_view_dnsseckey(const cfg_obj_t *vconfig, const cfg_obj_t *key,
return (result);
}
+static isc_result_t
+load_view_keys(const cfg_obj_t *keys, const cfg_obj_t *vconfig,
+ dns_view_t *view, isc_boolean_t managed,
+ dns_name_t *keyname, isc_mem_t *mctx)
+{
+ const cfg_listelt_t *elt, *elt2;
+ const cfg_obj_t *key, *keylist;
+ dst_key_t *dstkey = NULL;
+ isc_result_t result;
+ dns_keytable_t *secroots = NULL;
+
+ CHECK(dns_view_getsecroots(view, &secroots));
+
+ for (elt = cfg_list_first(keys);
+ elt != NULL;
+ elt = cfg_list_next(elt)) {
+ keylist = cfg_listelt_value(elt);
+
+ for (elt2 = cfg_list_first(keylist);
+ elt2 != NULL;
+ elt2 = cfg_list_next(elt2)) {
+ key = cfg_listelt_value(elt2);
+ result = dstkey_fromconfig(vconfig, key, managed,
+ &dstkey, mctx);
+ if (result == DST_R_UNSUPPORTEDALG) {
+ result = ISC_R_SUCCESS;
+ continue;
+ }
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /*
+ * If keyname was specified, we only add that key.
+ */
+ if (keyname != NULL &&
+ !dns_name_equal(keyname, dst_key_name(dstkey)))
+ {
+ dst_key_free(&dstkey);
+ continue;
+ }
+
+ CHECK(dns_keytable_add(secroots, managed, &dstkey));
+ }
+ }
+
+ cleanup:
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ if (result == DST_R_NOCRYPTO)
+ result = ISC_R_SUCCESS;
+ return (result);
+}
+
/*%
- * Configure DNSSEC keys for a view. Currently used only for
- * the security roots.
+ * Configure DNSSEC keys for a view.
*
* The per-view configuration values and the server-global defaults are read
- * from 'vconfig' and 'config'. The variable to be configured is '*target'.
+ * from 'vconfig' and 'config'.
*/
static isc_result_t
-configure_view_dnsseckeys(const cfg_obj_t *vconfig, const cfg_obj_t *config,
- isc_mem_t *mctx, dns_keytable_t **target)
+configure_view_dnsseckeys(dns_view_t *view, const cfg_obj_t *vconfig,
+ const cfg_obj_t *config, const cfg_obj_t *bindkeys,
+ isc_boolean_t auto_dlv, isc_boolean_t auto_root,
+ isc_mem_t *mctx)
{
- isc_result_t result;
- const cfg_obj_t *keys = NULL;
+ isc_result_t result = ISC_R_SUCCESS;
+ const cfg_obj_t *view_keys = NULL;
+ const cfg_obj_t *global_keys = NULL;
+ const cfg_obj_t *view_managed_keys = NULL;
+ const cfg_obj_t *global_managed_keys = NULL;
+ const cfg_obj_t *maps[4];
const cfg_obj_t *voptions = NULL;
- const cfg_listelt_t *element, *element2;
- const cfg_obj_t *keylist;
- const cfg_obj_t *key;
- dns_keytable_t *keytable = NULL;
+ const cfg_obj_t *options = NULL;
+ const cfg_obj_t *obj = NULL;
+ const char *directory;
+ int i = 0;
- CHECK(dns_keytable_create(mctx, &keytable));
+ /* We don't need trust anchors for the _bind view */
+ if (strcmp(view->name, "_bind") == 0 &&
+ view->rdclass == dns_rdataclass_chaos) {
+ return (ISC_R_SUCCESS);
+ }
- if (vconfig != NULL)
+ if (vconfig != NULL) {
voptions = cfg_tuple_get(vconfig, "options");
+ if (voptions != NULL) {
+ (void) cfg_map_get(voptions, "trusted-keys",
+ &view_keys);
+ (void) cfg_map_get(voptions, "managed-keys",
+ &view_managed_keys);
+ maps[i++] = voptions;
+ }
+ }
- keys = NULL;
- if (voptions != NULL)
- (void)cfg_map_get(voptions, "trusted-keys", &keys);
- if (keys == NULL)
- (void)cfg_map_get(config, "trusted-keys", &keys);
+ if (config != NULL) {
+ (void)cfg_map_get(config, "trusted-keys", &global_keys);
+ (void)cfg_map_get(config, "managed-keys", &global_managed_keys);
+ (void)cfg_map_get(config, "options", &options);
+ if (options != NULL) {
+ maps[i++] = options;
+ }
+ }
- for (element = cfg_list_first(keys);
- element != NULL;
- element = cfg_list_next(element))
- {
- keylist = cfg_listelt_value(element);
- for (element2 = cfg_list_first(keylist);
- element2 != NULL;
- element2 = cfg_list_next(element2))
- {
- key = cfg_listelt_value(element2);
- CHECK(configure_view_dnsseckey(vconfig, key,
- keytable, mctx));
+ maps[i++] = ns_g_defaults;
+ maps[i] = NULL;
+
+ result = dns_view_initsecroots(view, mctx);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "couldn't create keytable");
+ return (ISC_R_UNEXPECTED);
+ }
+
+ if (auto_dlv && view->rdclass == dns_rdataclass_in) {
+ const cfg_obj_t *builtin_keys = NULL;
+ const cfg_obj_t *builtin_managed_keys = NULL;
+
+ isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "using built-in DLV key for view %s",
+ view->name);
+
+ /*
+ * If bind.keys exists, it overrides the managed-keys
+ * clause hard-coded in ns_g_config.
+ */
+ if (bindkeys != NULL) {
+ (void)cfg_map_get(bindkeys, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(bindkeys, "managed-keys",
+ &builtin_managed_keys);
+ } else {
+ (void)cfg_map_get(ns_g_config, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(ns_g_config, "managed-keys",
+ &builtin_managed_keys);
}
+
+ if (builtin_keys != NULL)
+ CHECK(load_view_keys(builtin_keys, vconfig, view,
+ ISC_FALSE, view->dlv, mctx));
+ if (builtin_managed_keys != NULL)
+ CHECK(load_view_keys(builtin_managed_keys, vconfig,
+ view, ISC_TRUE, view->dlv, mctx));
}
- dns_keytable_detach(target);
- *target = keytable; /* Transfer ownership. */
- keytable = NULL;
- result = ISC_R_SUCCESS;
+ if (auto_root && view->rdclass == dns_rdataclass_in) {
+ const cfg_obj_t *builtin_keys = NULL;
+ const cfg_obj_t *builtin_managed_keys = NULL;
- cleanup:
+ isc_log_write(ns_g_lctx, DNS_LOGCATEGORY_SECURITY,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "using built-in root key for view %s",
+ view->name);
+
+ /*
+ * If bind.keys exists, it overrides the managed-keys
+ * clause hard-coded in ns_g_config.
+ */
+ if (bindkeys != NULL) {
+ (void)cfg_map_get(bindkeys, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(bindkeys, "managed-keys",
+ &builtin_managed_keys);
+ } else {
+ (void)cfg_map_get(ns_g_config, "trusted-keys",
+ &builtin_keys);
+ (void)cfg_map_get(ns_g_config, "managed-keys",
+ &builtin_managed_keys);
+ }
+
+ if (builtin_keys != NULL)
+ CHECK(load_view_keys(builtin_keys, vconfig, view,
+ ISC_FALSE, dns_rootname, mctx));
+ if (builtin_managed_keys != NULL)
+ CHECK(load_view_keys(builtin_managed_keys, vconfig,
+ view, ISC_TRUE, dns_rootname,
+ mctx));
+ }
+
+ CHECK(load_view_keys(view_keys, vconfig, view, ISC_FALSE,
+ NULL, mctx));
+ CHECK(load_view_keys(view_managed_keys, vconfig, view, ISC_TRUE,
+ NULL, mctx));
+
+ if (view->rdclass == dns_rdataclass_in) {
+ CHECK(load_view_keys(global_keys, vconfig, view, ISC_FALSE,
+ NULL, mctx));
+ CHECK(load_view_keys(global_managed_keys, vconfig, view,
+ ISC_TRUE, NULL, mctx));
+ }
+
+ /*
+ * Add key zone for managed-keys.
+ */
+ obj = NULL;
+ (void)ns_config_get(maps, "managed-keys-directory", &obj);
+ directory = obj != NULL ? cfg_obj_asstring(obj) : NULL;
+ CHECK(add_keydata_zone(view, directory, ns_g_mctx));
+
+ cleanup:
return (result);
}
static isc_result_t
-mustbesecure(const cfg_obj_t *mbs, dns_resolver_t *resolver)
-{
+mustbesecure(const cfg_obj_t *mbs, dns_resolver_t *resolver) {
const cfg_listelt_t *element;
const cfg_obj_t *obj;
const char *str;
@@ -523,8 +828,7 @@ mustbesecure(const cfg_obj_t *mbs, dns_resolver_t *resolver)
str = cfg_obj_asstring(cfg_tuple_get(obj, "name"));
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- CHECK(dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
value = cfg_obj_asboolean(cfg_tuple_get(obj, "value"));
CHECK(dns_resolver_setmustbesecure(resolver, name, value));
}
@@ -684,7 +988,7 @@ configure_order(dns_order_t *order, const cfg_obj_t *ent) {
isc_buffer_add(&b, strlen(str));
dns_fixedname_init(&fixed);
result = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -868,7 +1172,7 @@ disable_algorithms(const cfg_obj_t *disabled, dns_resolver_t *resolver) {
str = cfg_obj_asstring(cfg_tuple_get(disabled, "name"));
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- CHECK(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
algorithms = cfg_tuple_get(disabled, "algorithms");
for (element = cfg_list_first(algorithms);
@@ -921,7 +1225,7 @@ on_disable_list(const cfg_obj_t *disablelist, dns_name_t *zonename) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
result = dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL);
+ 0, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (dns_name_equal(name, zonename))
return (ISC_TRUE);
@@ -979,6 +1283,20 @@ setquerystats(dns_zone_t *zone, isc_mem_t *mctx, isc_boolean_t on) {
return (ISC_R_SUCCESS);
}
+static ns_cache_t *
+cachelist_find(ns_cachelist_t *cachelist, const char *cachename) {
+ ns_cache_t *nsc;
+
+ for (nsc = ISC_LIST_HEAD(*cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (strcmp(dns_cache_getname(nsc->cache), cachename) == 0)
+ return (nsc);
+ }
+
+ return (NULL);
+}
+
static isc_boolean_t
cache_reusable(dns_view_t *originview, dns_view_t *view,
isc_boolean_t new_zero_no_soattl)
@@ -996,6 +1314,238 @@ cache_reusable(dns_view_t *originview, dns_view_t *view,
return (ISC_TRUE);
}
+static isc_boolean_t
+cache_sharable(dns_view_t *originview, dns_view_t *view,
+ isc_boolean_t new_zero_no_soattl,
+ unsigned int new_cleaning_interval,
+ isc_uint32_t new_max_cache_size)
+{
+ /*
+ * If the cache cannot even reused for the same view, it cannot be
+ * shared with other views.
+ */
+ if (!cache_reusable(originview, view, new_zero_no_soattl))
+ return (ISC_FALSE);
+
+ /*
+ * Check other cache related parameters that must be consistent among
+ * the sharing views.
+ */
+ if (dns_cache_getcleaninginterval(originview->cache) !=
+ new_cleaning_interval ||
+ dns_cache_getcachesize(originview->cache) != new_max_cache_size) {
+ return (ISC_FALSE);
+ }
+
+ return (ISC_TRUE);
+}
+
+#ifdef DLZ
+/*
+ * Callback from DLZ configure when the driver sets up a writeable zone
+ */
+static isc_result_t
+dlzconfigure_callback(dns_view_t *view, dns_zone_t *zone) {
+ dns_name_t *origin = dns_zone_getorigin(zone);
+ dns_rdataclass_t zclass = view->rdclass;
+ isc_result_t result;
+
+ result = dns_zonemgr_managezone(ns_g_server->zonemgr, zone);
+ if (result != ISC_R_SUCCESS)
+ return result;
+ dns_zone_setstats(zone, ns_g_server->zonestats);
+
+ return ns_zone_configure_writeable_dlz(view->dlzdatabase,
+ zone, zclass, origin);
+}
+#endif
+
+static isc_result_t
+dns64_reverse(dns_view_t *view, isc_mem_t *mctx, isc_netaddr_t *na,
+ unsigned int prefixlen, const char *server,
+ const char *contact)
+{
+ char *cp;
+ char reverse[48+sizeof("ip6.arpa.")];
+ const char *dns64_dbtype[4] = { "_builtin", "dns64", ".", "." };
+ const char *sep = ": view ";
+ const char *viewname = view->name;
+ const unsigned char *s6;
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ dns_zone_t *zone = NULL;
+ int dns64_dbtypec = 4;
+ isc_buffer_t b;
+ isc_result_t result;
+
+ REQUIRE(prefixlen == 32 || prefixlen == 40 || prefixlen == 48 ||
+ prefixlen == 56 || prefixlen == 64 || prefixlen == 96);
+
+ if (!strcmp(viewname, "_default")) {
+ sep = "";
+ viewname = "";
+ }
+
+ /*
+ * Construct the reverse name of the zone.
+ */
+ cp = reverse;
+ s6 = na->type.in6.s6_addr;
+ while (prefixlen > 0) {
+ prefixlen -= 8;
+ sprintf(cp, "%x.%x.", s6[prefixlen/8] & 0xf,
+ (s6[prefixlen/8] >> 4) & 0xf);
+ cp += 4;
+ }
+ strcat(cp, "ip6.arpa.");
+
+ /*
+ * Create the actual zone.
+ */
+ if (server != NULL)
+ dns64_dbtype[2] = server;
+ if (contact != NULL)
+ dns64_dbtype[3] = contact;
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ isc_buffer_init(&b, reverse, strlen(reverse));
+ isc_buffer_add(&b, strlen(reverse));
+ CHECK(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
+ CHECK(dns_zone_create(&zone, mctx));
+ CHECK(dns_zone_setorigin(zone, name));
+ dns_zone_setview(zone, view);
+ CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone));
+ dns_zone_setclass(zone, view->rdclass);
+ dns_zone_settype(zone, dns_zone_master);
+ dns_zone_setstats(zone, ns_g_server->zonestats);
+ CHECK(dns_zone_setdbtype(zone, dns64_dbtypec, dns64_dbtype));
+ if (view->queryacl != NULL)
+ dns_zone_setqueryacl(zone, view->queryacl);
+ if (view->queryonacl != NULL)
+ dns_zone_setqueryonacl(zone, view->queryonacl);
+ dns_zone_setdialup(zone, dns_dialuptype_no);
+ dns_zone_setnotifytype(zone, dns_notifytype_no);
+ dns_zone_setoption(zone, DNS_ZONEOPT_NOCHECKNS, ISC_TRUE);
+ CHECK(setquerystats(zone, mctx, ISC_FALSE)); /* XXXMPA */
+ CHECK(dns_view_addzone(view, zone));
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+ ISC_LOG_INFO, "dns64 reverse zone%s%s: %s", sep,
+ viewname, reverse);
+
+cleanup:
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ return (result);
+}
+
+static isc_result_t
+configure_rpz(dns_view_t *view, const cfg_listelt_t *element) {
+ const cfg_obj_t *rpz_obj, *policy_obj;
+ const char *str;
+ dns_fixedname_t fixed;
+ dns_name_t *origin;
+ dns_rpz_zone_t *old, *new;
+ dns_zone_t *zone = NULL;
+ isc_result_t result;
+ unsigned int l1, l2;
+
+ new = isc_mem_get(view->mctx, sizeof(*new));
+ if (new == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+
+ memset(new, 0, sizeof(*new));
+ dns_name_init(&new->nsdname, NULL);
+ dns_name_init(&new->origin, NULL);
+ dns_name_init(&new->cname, NULL);
+ ISC_LIST_INITANDAPPEND(view->rpz_zones, new, link);
+
+ rpz_obj = cfg_listelt_value(element);
+ policy_obj = cfg_tuple_get(rpz_obj, "policy");
+ if (cfg_obj_isvoid(policy_obj)) {
+ new->policy = DNS_RPZ_POLICY_GIVEN;
+ } else {
+ str = cfg_obj_asstring(policy_obj);
+ new->policy = dns_rpz_str2policy(str);
+ INSIST(new->policy != DNS_RPZ_POLICY_ERROR);
+ }
+
+ dns_fixedname_init(&fixed);
+ origin = dns_fixedname_name(&fixed);
+ str = cfg_obj_asstring(cfg_tuple_get(rpz_obj, "name"));
+ result = dns_name_fromstring(origin, str, DNS_NAME_DOWNCASE, NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "invalid zone '%s'", str);
+ goto cleanup;
+ }
+
+ result = dns_name_fromstring2(&new->nsdname, DNS_RPZ_NSDNAME_ZONE,
+ origin, DNS_NAME_DOWNCASE, view->mctx);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "invalid zone '%s'", str);
+ goto cleanup;
+ }
+
+ /*
+ * The origin is part of 'nsdname' so we don't need to keep it
+ * seperately.
+ */
+ l1 = dns_name_countlabels(&new->nsdname);
+ l2 = dns_name_countlabels(origin);
+ dns_name_getlabelsequence(&new->nsdname, l1 - l2, l2, &new->origin);
+
+ /*
+ * Are we configured to with the reponse policy zone?
+ */
+ result = dns_view_findzone(view, &new->origin, &zone);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "unknown zone '%s'", str);
+ goto cleanup;
+ }
+
+ if (dns_zone_gettype(zone) != dns_zone_master &&
+ dns_zone_gettype(zone) != dns_zone_slave) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "zone '%s' is neither master nor slave", str);
+ dns_zone_detach(&zone);
+ result = DNS_R_NOTMASTER;
+ goto cleanup;
+ }
+ dns_zone_detach(&zone);
+
+ for (old = ISC_LIST_HEAD(view->rpz_zones);
+ old != new;
+ old = ISC_LIST_NEXT(old, link)) {
+ ++new->num;
+ if (dns_name_equal(&old->origin, &new->origin)) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "duplicate '%s'", str);
+ result = DNS_R_DUPLICATE;
+ goto cleanup;
+ }
+ }
+
+ if (new->policy == DNS_RPZ_POLICY_CNAME) {
+ str = cfg_obj_asstring(cfg_tuple_get(rpz_obj, "cname"));
+ result = dns_name_fromstring(&new->cname, str, 0, view->mctx);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(rpz_obj, ns_g_lctx, DNS_RPZ_ERROR_LEVEL,
+ "invalid cname '%s'", str);
+ goto cleanup;
+ }
+ }
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ dns_rpz_view_destroy(view);
+ return (result);
+}
+
/*
* Configure 'view' according to 'vconfig', taking defaults from 'config'
* where values are missing in 'vconfig'.
@@ -1004,12 +1554,15 @@ cache_reusable(dns_view_t *originview, dns_view_t *view,
* global defaults in 'config' used exclusively.
*/
static isc_result_t
-configure_view(dns_view_t *view, const cfg_obj_t *config,
- const cfg_obj_t *vconfig, isc_mem_t *mctx,
- cfg_aclconfctx_t *actx, isc_boolean_t need_hints)
+configure_view(dns_view_t *view, cfg_parser_t* parser,
+ cfg_obj_t *config, cfg_obj_t *vconfig,
+ ns_cachelist_t *cachelist, const cfg_obj_t *bindkeys,
+ isc_mem_t *mctx, cfg_aclconfctx_t *actx,
+ isc_boolean_t need_hints)
{
const cfg_obj_t *maps[4];
const cfg_obj_t *cfgmaps[3];
+ const cfg_obj_t *optionmaps[3];
const cfg_obj_t *options = NULL;
const cfg_obj_t *voptions = NULL;
const cfg_obj_t *forwardtype;
@@ -1028,17 +1581,20 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_cache_t *cache = NULL;
isc_result_t result;
isc_uint32_t max_adb_size;
+ unsigned int cleaning_interval;
isc_uint32_t max_cache_size;
isc_uint32_t max_acache_size;
isc_uint32_t lame_ttl;
- dns_tsig_keyring_t *ring;
+ dns_tsig_keyring_t *ring = NULL;
dns_view_t *pview = NULL; /* Production view */
isc_mem_t *cmctx;
dns_dispatch_t *dispatch4 = NULL;
dns_dispatch_t *dispatch6 = NULL;
isc_boolean_t reused_cache = ISC_FALSE;
- int i;
+ isc_boolean_t shared_cache = ISC_FALSE;
+ int i = 0, j = 0, k = 0;
const char *str;
+ const char *cachename = NULL;
dns_order_t *order = NULL;
isc_uint32_t udpsize;
unsigned int resopts = 0;
@@ -1052,7 +1608,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
const cfg_obj_t *disablelist = NULL;
isc_stats_t *resstats = NULL;
dns_stats_t *resquerystats = NULL;
+ isc_boolean_t auto_dlv = ISC_FALSE;
+ isc_boolean_t auto_root = ISC_FALSE;
+ ns_cache_t *nsc;
isc_boolean_t zero_no_soattl;
+ cfg_parser_t *newzones_parser = NULL;
+ cfg_obj_t *nzfconf = NULL;
+ dns_acl_t *clients = NULL, *mapped = NULL, *excluded = NULL;
+ unsigned int query_timeout;
REQUIRE(DNS_VIEW_VALID(view));
@@ -1061,22 +1624,28 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
if (config != NULL)
(void)cfg_map_get(config, "options", &options);
- i = 0;
+ /*
+ * maps: view options, options, defaults
+ * cfgmaps: view options, config
+ * optionmaps: view options, options
+ */
if (vconfig != NULL) {
voptions = cfg_tuple_get(vconfig, "options");
maps[i++] = voptions;
+ optionmaps[j++] = voptions;
+ cfgmaps[k++] = voptions;
}
- if (options != NULL)
+ if (options != NULL) {
maps[i++] = options;
+ optionmaps[j++] = options;
+ }
+
maps[i++] = ns_g_defaults;
maps[i] = NULL;
-
- i = 0;
- if (voptions != NULL)
- cfgmaps[i++] = voptions;
+ optionmaps[j] = NULL;
if (config != NULL)
- cfgmaps[i++] = config;
- cfgmaps[i] = NULL;
+ cfgmaps[k++] = config;
+ cfgmaps[k] = NULL;
if (!strcmp(viewname, "_default")) {
sep = "";
@@ -1137,12 +1706,12 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_acache_setcachesize(view->acache, max_acache_size);
}
- CHECK(configure_view_acl(vconfig, config, "allow-query", actx,
+ CHECK(configure_view_acl(vconfig, config, "allow-query", NULL, actx,
ns_g_mctx, &view->queryacl));
-
if (view->queryacl == NULL) {
- CHECK(configure_view_acl(NULL, ns_g_config, "allow-query", actx,
- ns_g_mctx, &view->queryacl));
+ CHECK(configure_view_acl(NULL, ns_g_config, "allow-query",
+ NULL, actx, ns_g_mctx,
+ &view->queryacl));
}
/*
@@ -1159,7 +1728,62 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
{
const cfg_obj_t *zconfig = cfg_listelt_value(element);
CHECK(configure_zone(config, zconfig, vconfig, mctx, view,
- actx));
+ actx, ISC_FALSE));
+ }
+
+ /*
+ * Are we allowing zones to be added and deleted dynamically?
+ */
+ obj = NULL;
+ result = ns_config_get(maps, "allow-new-zones", &obj);
+ if (result == ISC_R_SUCCESS) {
+ isc_boolean_t allow = cfg_obj_asboolean(obj);
+ struct cfg_context *cfg = NULL;
+ if (allow) {
+ cfg = isc_mem_get(view->mctx, sizeof(*cfg));
+ if (cfg == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ memset(cfg, 0, sizeof(*cfg));
+ isc_mem_attach(view->mctx, &cfg->mctx);
+ if (config != NULL)
+ cfg_obj_attach(config, &cfg->config);
+ cfg_parser_attach(parser, &cfg->parser);
+ cfg_aclconfctx_clone(actx, &cfg->actx);
+ }
+ dns_view_setnewzones(view, allow, cfg, cfgctx_destroy);
+ }
+
+ /*
+ * If we're allowing added zones, then load zone configuration
+ * from the newzone file for zones that were added during previous
+ * runs.
+ */
+ if (view->new_zone_file != NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "loading additional zones for view '%s'",
+ view->name);
+
+ CHECK(cfg_parser_create(view->mctx, ns_g_lctx,
+ &newzones_parser));
+ result = cfg_parse_file(newzones_parser, view->new_zone_file,
+ &cfg_type_newzones, &nzfconf);
+ if (result == ISC_R_SUCCESS) {
+ zonelist = NULL;
+ cfg_map_get(nzfconf, "zone", &zonelist);
+ for (element = cfg_list_first(zonelist);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *zconfig =
+ cfg_listelt_value(element);
+ CHECK(configure_zone(config, zconfig, vconfig,
+ mctx, view, actx,
+ ISC_TRUE));
+ }
+ }
}
#ifdef DLZ
@@ -1197,6 +1821,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
isc_mem_put(mctx, dlzargv, dlzargc * sizeof(*dlzargv));
if (result != ISC_R_SUCCESS)
goto cleanup;
+
+ /*
+ * If the dlz backend supports configuration,
+ * then call its configure method now.
+ */
+ result = dns_dlzconfigure(view, dlzconfigure_callback);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
}
}
#endif
@@ -1205,6 +1837,32 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
* Obtain configuration parameters that affect the decision of whether
* we can reuse/share an existing cache.
*/
+ obj = NULL;
+ result = ns_config_get(maps, "cleaning-interval", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ cleaning_interval = cfg_obj_asuint32(obj) * 60;
+
+ obj = NULL;
+ result = ns_config_get(maps, "max-cache-size", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ if (cfg_obj_isstring(obj)) {
+ str = cfg_obj_asstring(obj);
+ INSIST(strcasecmp(str, "unlimited") == 0);
+ max_cache_size = ISC_UINT32_MAX;
+ } else {
+ isc_resourcevalue_t value;
+ value = cfg_obj_asuint64(obj);
+ if (value > ISC_UINT32_MAX) {
+ cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
+ "'max-cache-size "
+ "%" ISC_PRINT_QUADFORMAT "d' is too large",
+ value);
+ result = ISC_R_RANGE;
+ goto cleanup;
+ }
+ max_cache_size = (isc_uint32_t)value;
+ }
+
/* Check-names. */
obj = NULL;
result = ns_checknames_get(maps, "response", &obj);
@@ -1229,6 +1887,109 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
zero_no_soattl = cfg_obj_asboolean(obj);
obj = NULL;
+ result = ns_config_get(maps, "dns64", &obj);
+ if (result == ISC_R_SUCCESS && strcmp(view->name, "_bind") &&
+ strcmp(view->name, "_meta")) {
+ const cfg_listelt_t *element;
+ isc_netaddr_t na, suffix, *sp;
+ unsigned int prefixlen;
+ const char *server, *contact;
+ const cfg_obj_t *myobj;
+
+ myobj = NULL;
+ result = ns_config_get(maps, "dns64-server", &myobj);
+ if (result == ISC_R_SUCCESS)
+ server = cfg_obj_asstring(myobj);
+ else
+ server = NULL;
+
+ myobj = NULL;
+ result = ns_config_get(maps, "dns64-contact", &myobj);
+ if (result == ISC_R_SUCCESS)
+ contact = cfg_obj_asstring(myobj);
+ else
+ contact = NULL;
+
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *map = cfg_listelt_value(element);
+ dns_dns64_t *dns64 = NULL;
+ unsigned int dns64options = 0;
+
+ cfg_obj_asnetprefix(cfg_map_getname(map), &na,
+ &prefixlen);
+
+ obj = NULL;
+ (void)cfg_map_get(map, "suffix", &obj);
+ if (obj != NULL) {
+ sp = &suffix;
+ isc_netaddr_fromsockaddr(sp,
+ cfg_obj_assockaddr(obj));
+ } else
+ sp = NULL;
+
+ clients = mapped = excluded = NULL;
+ obj = NULL;
+ (void)cfg_map_get(map, "clients", &obj);
+ if (obj != NULL) {
+ result = cfg_acl_fromconfig(obj, config,
+ ns_g_lctx, actx,
+ mctx, 0, &clients);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ obj = NULL;
+ (void)cfg_map_get(map, "mapped", &obj);
+ if (obj != NULL) {
+ result = cfg_acl_fromconfig(obj, config,
+ ns_g_lctx, actx,
+ mctx, 0, &mapped);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ obj = NULL;
+ (void)cfg_map_get(map, "exclude", &obj);
+ if (obj != NULL) {
+ result = cfg_acl_fromconfig(obj, config,
+ ns_g_lctx, actx,
+ mctx, 0, &excluded);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ obj = NULL;
+ (void)cfg_map_get(map, "recursive-only", &obj);
+ if (obj != NULL && cfg_obj_asboolean(obj))
+ dns64options |= DNS_DNS64_RECURSIVE_ONLY;
+
+ obj = NULL;
+ (void)cfg_map_get(map, "break-dnssec", &obj);
+ if (obj != NULL && cfg_obj_asboolean(obj))
+ dns64options |= DNS_DNS64_BREAK_DNSSEC;
+
+ result = dns_dns64_create(mctx, &na, prefixlen, sp,
+ clients, mapped, excluded,
+ dns64options, &dns64);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_dns64_append(&view->dns64, dns64);
+ view->dns64cnt++;
+ result = dns64_reverse(view, mctx, &na, prefixlen,
+ server, contact);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ if (clients != NULL)
+ dns_acl_detach(&clients);
+ if (mapped != NULL)
+ dns_acl_detach(&mapped);
+ if (excluded != NULL)
+ dns_acl_detach(&excluded);
+ }
+ }
+
+ obj = NULL;
result = ns_config_get(maps, "dnssec-accept-expired", &obj);
INSIST(result == ISC_R_SUCCESS);
view->acceptexpired = cfg_obj_asboolean(obj);
@@ -1236,7 +1997,13 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
obj = NULL;
result = ns_config_get(maps, "dnssec-validation", &obj);
INSIST(result == ISC_R_SUCCESS);
- view->enablevalidation = cfg_obj_asboolean(obj);
+ if (cfg_obj_isboolean(obj)) {
+ view->enablevalidation = cfg_obj_asboolean(obj);
+ } else {
+ /* If dnssec-validation is not boolean, it must be "auto" */
+ view->enablevalidation = ISC_TRUE;
+ auto_root = ISC_TRUE;
+ }
obj = NULL;
result = ns_config_get(maps, "max-cache-ttl", &obj);
@@ -1251,53 +2018,113 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
view->maxncachettl = 7 * 24 * 3600;
/*
- * Configure the view's cache. Try to reuse an existing
- * cache if possible, otherwise create a new cache.
- * Note that the ADB is not preserved in either case.
- * When a matching view is found, the associated statistics are
- * also retrieved and reused.
+ * Configure the view's cache.
+ *
+ * First, check to see if there are any attach-cache options. If yes,
+ * attempt to lookup an existing cache at attach it to the view. If
+ * there is not one, then try to reuse an existing cache if possible;
+ * otherwise create a new cache.
*
- * XXX Determining when it is safe to reuse a cache is tricky.
+ * Note that the ADB is not preserved or shared in either case.
+ *
+ * When a matching view is found, the associated statistics are also
+ * retrieved and reused.
+ *
+ * XXX Determining when it is safe to reuse or share a cache is tricky.
* When the view's configuration changes, the cached data may become
* invalid because it reflects our old view of the world. We check
- * some of the configuration parameters that could invalidate the cache,
- * but there are other configuration options that should be checked.
- * For example, if a view uses a forwarder, changes in the forwarder
- * configuration may invalidate the cache. At the moment, it's the
- * administrator's responsibility to ensure these configuration options
- * don't invalidate reusing.
+ * some of the configuration parameters that could invalidate the cache
+ * or otherwise make it unsharable, but there are other configuration
+ * options that should be checked. For example, if a view uses a
+ * forwarder, changes in the forwarder configuration may invalidate
+ * the cache. At the moment, it's the administrator's responsibility to
+ * ensure these configuration options don't invalidate reusing/sharing.
*/
- result = dns_viewlist_find(&ns_g_server->viewlist,
- view->name, view->rdclass,
- &pview);
- if (result != ISC_R_NOTFOUND && result != ISC_R_SUCCESS)
- goto cleanup;
- if (pview != NULL) {
- if (cache_reusable(pview, view, zero_no_soattl)) {
- INSIST(pview->cache != NULL);
- isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
- NS_LOGMODULE_SERVER, ISC_LOG_DEBUG(3),
- "reusing existing cache");
- reused_cache = ISC_TRUE;
- dns_cache_attach(pview->cache, &cache);
- } else {
+ obj = NULL;
+ result = ns_config_get(maps, "attach-cache", &obj);
+ if (result == ISC_R_SUCCESS)
+ cachename = cfg_obj_asstring(obj);
+ else
+ cachename = view->name;
+ cache = NULL;
+ nsc = cachelist_find(cachelist, cachename);
+ if (nsc != NULL) {
+ if (!cache_sharable(nsc->primaryview, view, zero_no_soattl,
+ cleaning_interval, max_cache_size)) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
- NS_LOGMODULE_SERVER, ISC_LOG_DEBUG(1),
- "cache cannot be reused for view %s "
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "views %s and %s can't share the cache "
"due to configuration parameter mismatch",
- view->name);
+ nsc->primaryview->name, view->name);
+ result = ISC_R_FAILURE;
+ goto cleanup;
}
- dns_view_getresstats(pview, &resstats);
- dns_view_getresquerystats(pview, &resquerystats);
- dns_view_detach(&pview);
- }
- if (cache == NULL) {
- CHECK(isc_mem_create(0, 0, &cmctx));
- CHECK(dns_cache_create(cmctx, ns_g_taskmgr, ns_g_timermgr,
- view->rdclass, "rbt", 0, NULL, &cache));
- isc_mem_setname(cmctx, "cache", NULL);
+ dns_cache_attach(nsc->cache, &cache);
+ shared_cache = ISC_TRUE;
+ } else {
+ if (strcmp(cachename, view->name) == 0) {
+ result = dns_viewlist_find(&ns_g_server->viewlist,
+ cachename, view->rdclass,
+ &pview);
+ if (result != ISC_R_NOTFOUND && result != ISC_R_SUCCESS)
+ goto cleanup;
+ if (pview != NULL) {
+ if (!cache_reusable(pview, view,
+ zero_no_soattl)) {
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER,
+ ISC_LOG_DEBUG(1),
+ "cache cannot be reused "
+ "for view %s due to "
+ "configuration parameter "
+ "mismatch", view->name);
+ } else {
+ INSIST(pview->cache != NULL);
+ isc_log_write(ns_g_lctx,
+ NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER,
+ ISC_LOG_DEBUG(3),
+ "reusing existing cache");
+ reused_cache = ISC_TRUE;
+ dns_cache_attach(pview->cache, &cache);
+ }
+ dns_view_getresstats(pview, &resstats);
+ dns_view_getresquerystats(pview,
+ &resquerystats);
+ dns_view_detach(&pview);
+ }
+ }
+ if (cache == NULL) {
+ /*
+ * Create a cache with the desired name. This normally
+ * equals the view name, but may also be a forward
+ * reference to a view that share the cache with this
+ * view but is not yet configured. If it is not the
+ * view name but not a forward reference either, then it
+ * is simply a named cache that is not shared.
+ */
+ CHECK(isc_mem_create(0, 0, &cmctx));
+ isc_mem_setname(cmctx, "cache", NULL);
+ CHECK(dns_cache_create2(cmctx, ns_g_taskmgr,
+ ns_g_timermgr, view->rdclass,
+ cachename, "rbt", 0, NULL,
+ &cache));
+ }
+ nsc = isc_mem_get(mctx, sizeof(*nsc));
+ if (nsc == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ nsc->cache = NULL;
+ dns_cache_attach(cache, &nsc->cache);
+ nsc->primaryview = view;
+ nsc->needflush = ISC_FALSE;
+ nsc->adbsizeadjusted = ISC_FALSE;
+ ISC_LINK_INIT(nsc, link);
+ ISC_LIST_APPEND(*cachelist, nsc, link);
}
- dns_view_setcache(view, cache);
+ dns_view_setcache2(view, cache, shared_cache);
/*
* cache-file cannot be inherited if views are present, but this
@@ -1307,35 +2134,11 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
result = ns_config_get(maps, "cache-file", &obj);
if (result == ISC_R_SUCCESS && strcmp(view->name, "_bind") != 0) {
CHECK(dns_cache_setfilename(cache, cfg_obj_asstring(obj)));
- if (!reused_cache)
+ if (!reused_cache && !shared_cache)
CHECK(dns_cache_load(cache));
}
- obj = NULL;
- result = ns_config_get(maps, "cleaning-interval", &obj);
- INSIST(result == ISC_R_SUCCESS);
- dns_cache_setcleaninginterval(cache, cfg_obj_asuint32(obj) * 60);
-
- obj = NULL;
- result = ns_config_get(maps, "max-cache-size", &obj);
- INSIST(result == ISC_R_SUCCESS);
- if (cfg_obj_isstring(obj)) {
- str = cfg_obj_asstring(obj);
- INSIST(strcasecmp(str, "unlimited") == 0);
- max_cache_size = ISC_UINT32_MAX;
- } else {
- isc_resourcevalue_t value;
- value = cfg_obj_asuint64(obj);
- if (value > ISC_UINT32_MAX) {
- cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
- "'max-cache-size "
- "%" ISC_PRINT_QUADFORMAT "d' is too large",
- value);
- result = ISC_R_RANGE;
- goto cleanup;
- }
- max_cache_size = (isc_uint32_t)value;
- }
+ dns_cache_setcleaninginterval(cache, cleaning_interval);
dns_cache_setcachesize(cache, max_cache_size);
dns_cache_detach(&cache);
@@ -1373,13 +2176,23 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_view_setresquerystats(view, resquerystats);
/*
- * Set the ADB cache size to 1/8th of the max-cache-size.
+ * Set the ADB cache size to 1/8th of the max-cache-size or
+ * MAX_ADB_SIZE_FOR_CACHESHARE when the cache is shared.
*/
max_adb_size = 0;
if (max_cache_size != 0) {
max_adb_size = max_cache_size / 8;
if (max_adb_size == 0)
max_adb_size = 1; /* Force minimum. */
+ if (view != nsc->primaryview &&
+ max_adb_size > MAX_ADB_SIZE_FOR_CACHESHARE) {
+ max_adb_size = MAX_ADB_SIZE_FOR_CACHESHARE;
+ if (!nsc->adbsizeadjusted) {
+ dns_adb_setadbsize(nsc->primaryview->adb,
+ MAX_ADB_SIZE_FOR_CACHESHARE);
+ nsc->adbsizeadjusted = ISC_TRUE;
+ }
+ }
}
dns_adb_setadbsize(view->adb, max_adb_size);
@@ -1395,6 +2208,18 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_resolver_setlamettl(view->resolver, lame_ttl);
/*
+ * Set the resolver's query timeout.
+ */
+ obj = NULL;
+ result = ns_config_get(maps, "resolver-query-timeout", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ query_timeout = cfg_obj_asuint32(obj);
+ dns_resolver_settimeout(view->resolver, query_timeout);
+
+ /* Specify whether to use 0-TTL for negative response for SOA query */
+ dns_resolver_setzeronosoattl(view->resolver, zero_no_soattl);
+
+ /*
* Set the resolver's EDNS UDP size.
*/
obj = NULL;
@@ -1484,9 +2309,29 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
/*
* Configure the view's TSIG keys.
*/
- ring = NULL;
CHECK(ns_tsigkeyring_fromconfig(config, vconfig, view->mctx, &ring));
+ if (ns_g_server->sessionkey != NULL) {
+ CHECK(dns_tsigkeyring_add(ring, ns_g_server->session_keyname,
+ ns_g_server->sessionkey));
+ }
dns_view_setkeyring(view, ring);
+ dns_tsigkeyring_detach(&ring);
+
+ /*
+ * See if we can re-use a dynamic key ring.
+ */
+ result = dns_viewlist_find(&ns_g_server->viewlist, view->name,
+ view->rdclass, &pview);
+ if (result != ISC_R_NOTFOUND && result != ISC_R_SUCCESS)
+ goto cleanup;
+ if (pview != NULL) {
+ dns_view_getdynamickeyring(pview, &ring);
+ if (ring != NULL)
+ dns_view_setdynamickeyring(view, ring);
+ dns_tsigkeyring_detach(&ring);
+ dns_view_detach(&pview);
+ } else
+ dns_view_restorekeyring(view);
/*
* Configure the view's peer list.
@@ -1543,10 +2388,10 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
/*
* Configure the "match-clients" and "match-destinations" ACL.
*/
- CHECK(configure_view_acl(vconfig, config, "match-clients", actx,
+ CHECK(configure_view_acl(vconfig, config, "match-clients", NULL, actx,
ns_g_mctx, &view->matchclients));
- CHECK(configure_view_acl(vconfig, config, "match-destinations", actx,
- ns_g_mctx, &view->matchdestinations));
+ CHECK(configure_view_acl(vconfig, config, "match-destinations", NULL,
+ actx, ns_g_mctx, &view->matchdestinations));
/*
* Configure the "match-recursive-only" option.
@@ -1618,20 +2463,20 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
* "allow-recursion", and "allow-recursion-on" acls if
* configured in named.conf.
*/
- CHECK(configure_view_acl(vconfig, config, "allow-query-cache",
+ CHECK(configure_view_acl(vconfig, config, "allow-query-cache", NULL,
actx, ns_g_mctx, &view->cacheacl));
- CHECK(configure_view_acl(vconfig, config, "allow-query-cache-on",
+ CHECK(configure_view_acl(vconfig, config, "allow-query-cache-on", NULL,
actx, ns_g_mctx, &view->cacheonacl));
if (view->cacheonacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-query-cache-on", actx,
+ "allow-query-cache-on", NULL, actx,
ns_g_mctx, &view->cacheonacl));
if (strcmp(view->name, "_bind") != 0) {
CHECK(configure_view_acl(vconfig, config, "allow-recursion",
- actx, ns_g_mctx,
+ NULL, actx, ns_g_mctx,
&view->recursionacl));
CHECK(configure_view_acl(vconfig, config, "allow-recursion-on",
- actx, ns_g_mctx,
+ NULL, actx, ns_g_mctx,
&view->recursiononacl));
}
@@ -1643,8 +2488,14 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
*/
if (view->cacheacl == NULL && view->recursionacl != NULL)
dns_acl_attach(view->recursionacl, &view->cacheacl);
+ /*
+ * XXXEACH: This call to configure_view_acl() is redundant. We
+ * are leaving it as it is because we are making a minimal change
+ * for a patch release. In the future this should be changed to
+ * dns_acl_attach(view->queryacl, &view->cacheacl).
+ */
if (view->cacheacl == NULL && view->recursion)
- CHECK(configure_view_acl(vconfig, config, "allow-query",
+ CHECK(configure_view_acl(vconfig, config, "allow-query", NULL,
actx, ns_g_mctx, &view->cacheacl));
if (view->recursion &&
view->recursionacl == NULL && view->cacheacl != NULL)
@@ -1656,24 +2507,44 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
*/
if (view->recursionacl == NULL && view->recursion)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-recursion",
+ "allow-recursion", NULL,
actx, ns_g_mctx,
&view->recursionacl));
if (view->recursiononacl == NULL && view->recursion)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-recursion-on",
+ "allow-recursion-on", NULL,
actx, ns_g_mctx,
&view->recursiononacl));
if (view->cacheacl == NULL) {
if (view->recursion)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-query-cache", actx,
- ns_g_mctx, &view->cacheacl));
+ "allow-query-cache", NULL,
+ actx, ns_g_mctx,
+ &view->cacheacl));
else
- CHECK(dns_acl_none(ns_g_mctx, &view->cacheacl));
+ CHECK(dns_acl_none(mctx, &view->cacheacl));
}
/*
+ * Filter setting on addresses in the answer section.
+ */
+ CHECK(configure_view_acl(vconfig, config, "deny-answer-addresses",
+ "acl", actx, ns_g_mctx, &view->denyansweracl));
+ CHECK(configure_view_nametable(vconfig, config, "deny-answer-addresses",
+ "except-from", ns_g_mctx,
+ &view->answeracl_exclude));
+
+ /*
+ * Filter setting on names (CNAME/DNAME targets) in the answer section.
+ */
+ CHECK(configure_view_nametable(vconfig, config, "deny-answer-aliases",
+ "name", ns_g_mctx,
+ &view->denyanswernames));
+ CHECK(configure_view_nametable(vconfig, config, "deny-answer-aliases",
+ "except-from", ns_g_mctx,
+ &view->answernames_exclude));
+
+ /*
* Configure sortlist, if set
*/
CHECK(configure_view_sortlist(vconfig, config, actx, ns_g_mctx,
@@ -1686,19 +2557,19 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
*/
if (view->notifyacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-notify", actx,
+ "allow-notify", NULL, actx,
ns_g_mctx, &view->notifyacl));
if (view->transferacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-transfer", actx,
+ "allow-transfer", NULL, actx,
ns_g_mctx, &view->transferacl));
if (view->updateacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-update", actx,
+ "allow-update", NULL, actx,
ns_g_mctx, &view->updateacl));
if (view->upfwdacl == NULL)
CHECK(configure_view_acl(NULL, ns_g_config,
- "allow-update-forwarding", actx,
+ "allow-update-forwarding", NULL, actx,
ns_g_mctx, &view->upfwdacl));
obj = NULL;
@@ -1728,13 +2599,47 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
cfg_obj_asuint32(obj),
max_clients_per_query);
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ obj = NULL;
+ result = ns_config_get(maps, "filter-aaaa-on-v4", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ if (cfg_obj_isboolean(obj)) {
+ if (cfg_obj_asboolean(obj))
+ view->v4_aaaa = dns_v4_aaaa_filter;
+ else
+ view->v4_aaaa = dns_v4_aaaa_ok;
+ } else {
+ const char *v4_aaaastr = cfg_obj_asstring(obj);
+ if (strcasecmp(v4_aaaastr, "break-dnssec") == 0)
+ view->v4_aaaa = dns_v4_aaaa_break_dnssec;
+ else
+ INSIST(0);
+ }
+ CHECK(configure_view_acl(vconfig, config, "filter-aaaa", NULL,
+ actx, ns_g_mctx, &view->v4_aaaa_acl));
+#endif
+
obj = NULL;
result = ns_config_get(maps, "dnssec-enable", &obj);
INSIST(result == ISC_R_SUCCESS);
view->enablednssec = cfg_obj_asboolean(obj);
obj = NULL;
- result = ns_config_get(maps, "dnssec-lookaside", &obj);
+ result = ns_config_get(optionmaps, "dnssec-lookaside", &obj);
+ if (result == ISC_R_SUCCESS) {
+ /* If set to "auto", use the version from the defaults */
+ const cfg_obj_t *dlvobj;
+ dlvobj = cfg_listelt_value(cfg_list_first(obj));
+ if (!strcmp(cfg_obj_asstring(cfg_tuple_get(dlvobj, "domain")),
+ "auto") &&
+ cfg_obj_isvoid(cfg_tuple_get(dlvobj, "trust-anchor"))) {
+ auto_dlv = ISC_TRUE;
+ obj = NULL;
+ result = cfg_map_get(ns_g_defaults,
+ "dnssec-lookaside", &obj);
+ }
+ }
+
if (result == ISC_R_SUCCESS) {
for (element = cfg_list_first(obj);
element != NULL;
@@ -1745,31 +2650,13 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
dns_name_t *dlv;
obj = cfg_listelt_value(element);
-#if 0
- dns_fixedname_t fixed;
- dns_name_t *name;
-
- /*
- * When we support multiple dnssec-lookaside
- * entries this is how to find the domain to be
- * checked. XXXMPA
- */
- dns_fixedname_init(&fixed);
- name = dns_fixedname_name(&fixed);
- str = cfg_obj_asstring(cfg_tuple_get(obj,
- "domain"));
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- CHECK(dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL));
-#endif
str = cfg_obj_asstring(cfg_tuple_get(obj,
"trust-anchor"));
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
dlv = dns_fixedname_name(&view->dlv_fixed);
CHECK(dns_name_fromtext(dlv, &b, dns_rootname,
- ISC_TRUE, NULL));
+ DNS_NAME_DOWNCASE, NULL));
view->dlv = dns_fixedname_name(&view->dlv_fixed);
}
} else
@@ -1779,8 +2666,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
* For now, there is only one kind of trusted keys, the
* "security roots".
*/
- CHECK(configure_view_dnsseckeys(vconfig, config, mctx,
- &view->secroots));
+ CHECK(configure_view_dnsseckeys(view, vconfig, config, bindkeys,
+ auto_dlv, auto_root, mctx));
dns_resolver_resetmustbesecure(view->resolver);
obj = NULL;
result = ns_config_get(maps, "dnssec-must-be-secure", &obj);
@@ -1821,7 +2708,7 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
CHECK(dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL));
+ 0, NULL));
CHECK(dns_view_excludedelegationonly(view,
name));
}
@@ -1874,8 +2761,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
str = cfg_obj_asstring(obj);
isc_buffer_init(&buffer, str, strlen(str));
isc_buffer_add(&buffer, strlen(str));
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
isc_buffer_init(&buffer, server, sizeof(server) - 1);
CHECK(dns_name_totext(name, ISC_FALSE, &buffer));
server[isc_buffer_usedlength(&buffer)] = 0;
@@ -1889,8 +2776,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
str = cfg_obj_asstring(obj);
isc_buffer_init(&buffer, str, strlen(str));
isc_buffer_add(&buffer, strlen(str));
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
isc_buffer_init(&buffer, contact, sizeof(contact) - 1);
CHECK(dns_name_totext(name, ISC_FALSE, &buffer));
contact[isc_buffer_usedlength(&buffer)] = 0;
@@ -1916,8 +2803,8 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
/*
* Look for zone on drop list.
*/
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
if (disablelist != NULL &&
on_disable_list(disablelist, name))
continue;
@@ -2012,9 +2899,40 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
}
}
+ /*
+ * Make the list of response policy zone names for views that
+ * are used for real lookups and so care about hints.
+ */
+ zonelist = NULL;
+ if (view->rdclass == dns_rdataclass_in && need_hints) {
+ obj = NULL;
+ result = ns_config_get(maps, "response-policy", &obj);
+ if (result == ISC_R_SUCCESS)
+ cfg_map_get(obj, "zone", &zonelist);
+ }
+ if (zonelist != NULL) {
+
+ for (element = cfg_list_first(zonelist);
+ element != NULL;
+ element = cfg_list_next(element)) {
+ result = configure_rpz(view, element);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_rpz_set_need(ISC_TRUE);
+ }
+ }
+
result = ISC_R_SUCCESS;
cleanup:
+ if (clients != NULL)
+ dns_acl_detach(&clients);
+ if (mapped != NULL)
+ dns_acl_detach(&mapped);
+ if (excluded != NULL)
+ dns_acl_detach(&excluded);
+ if (ring != NULL)
+ dns_tsigkeyring_detach(&ring);
if (zone != NULL)
dns_zone_detach(&zone);
if (dispatch4 != NULL)
@@ -2033,6 +2951,12 @@ configure_view(dns_view_t *view, const cfg_obj_t *config,
if (cache != NULL)
dns_cache_detach(&cache);
+ if (newzones_parser != NULL) {
+ if (nzfconf != NULL)
+ cfg_obj_destroy(newzones_parser, &nzfconf);
+ cfg_parser_destroy(&newzones_parser);
+ }
+
return (result);
}
@@ -2105,8 +3029,8 @@ configure_alternates(const cfg_obj_t *config, dns_view_t *view,
isc_buffer_add(&buffer, strlen(str));
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
- CHECK(dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ CHECK(dns_name_fromtext(name, &buffer, dns_rootname, 0,
+ NULL));
portobj = cfg_tuple_get(alternate, "port");
if (cfg_obj_isuint32(portobj)) {
@@ -2286,7 +3210,7 @@ create_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist,
static isc_result_t
configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
const cfg_obj_t *vconfig, isc_mem_t *mctx, dns_view_t *view,
- cfg_aclconfctx_t *aclconf)
+ cfg_aclconfctx_t *aclconf, isc_boolean_t added)
{
dns_view_t *pview = NULL; /* Production view */
dns_zone_t *zone = NULL; /* New or reused zone */
@@ -2319,7 +3243,7 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
isc_buffer_add(&buffer, strlen(zname));
dns_fixedname_init(&fixorigin);
CHECK(dns_name_fromtext(dns_fixedname_name(&fixorigin),
- &buffer, dns_rootname, ISC_FALSE, NULL));
+ &buffer, dns_rootname, 0, NULL));
origin = dns_fixedname_name(&fixorigin);
CHECK(ns_config_getclass(cfg_tuple_get(zconfig, "class"),
@@ -2349,7 +3273,7 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
ztypestr = cfg_obj_asstring(typeobj);
/*
- * "hints zones" aren't zones. If we've got one,
+ * "hints zones" aren't zones. If we've got one,
* configure it and return.
*/
if (strcasecmp(ztypestr, "hint") == 0) {
@@ -2500,6 +3424,11 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
}
/*
+ * Mark whether the zone was originally added at runtime or not
+ */
+ dns_zone_setadded(zone, added);
+
+ /*
* Configure the zone.
*/
CHECK(ns_zone_configure(config, vconfig, zconfig, aclconf, zone));
@@ -2519,6 +3448,95 @@ configure_zone(const cfg_obj_t *config, const cfg_obj_t *zconfig,
}
/*
+ * Configure built-in zone for storing managed-key data.
+ */
+
+#define KEYZONE "managed-keys.bind"
+#define MKEYS ".mkeys"
+
+static isc_result_t
+add_keydata_zone(dns_view_t *view, const char *directory, isc_mem_t *mctx) {
+ isc_result_t result;
+ dns_view_t *pview = NULL;
+ dns_zone_t *zone = NULL;
+ dns_acl_t *none = NULL;
+ char filename[PATH_MAX];
+ char buffer[ISC_SHA256_DIGESTSTRINGLENGTH + sizeof(MKEYS)];
+ int n;
+
+ REQUIRE(view != NULL);
+
+ /* See if we can re-use an existing keydata zone. */
+ result = dns_viewlist_find(&ns_g_server->viewlist,
+ view->name, view->rdclass,
+ &pview);
+ if (result != ISC_R_NOTFOUND &&
+ result != ISC_R_SUCCESS)
+ return (result);
+
+ if (pview != NULL && pview->managed_keys != NULL) {
+ dns_zone_attach(pview->managed_keys, &view->managed_keys);
+ dns_zone_setview(pview->managed_keys, view);
+ dns_view_detach(&pview);
+ return (ISC_R_SUCCESS);
+ }
+
+ /* No existing keydata zone was found; create one */
+ CHECK(dns_zone_create(&zone, mctx));
+ CHECK(dns_zone_setorigin(zone, dns_rootname));
+
+ isc_sha256_data((void *)view->name, strlen(view->name), buffer);
+ strcat(buffer, MKEYS);
+ n = snprintf(filename, sizeof(filename), "%s%s%s",
+ directory ? directory : "", directory ? "/" : "",
+ strcmp(view->name, "_default") == 0 ? KEYZONE : buffer);
+ if (n < 0 || (size_t)n >= sizeof(filename)) {
+ result = (n < 0) ? ISC_R_FAILURE : ISC_R_NOSPACE;
+ goto cleanup;
+ }
+ CHECK(dns_zone_setfile(zone, filename));
+
+ dns_zone_setview(zone, view);
+ dns_zone_settype(zone, dns_zone_key);
+ dns_zone_setclass(zone, view->rdclass);
+
+ CHECK(dns_zonemgr_managezone(ns_g_server->zonemgr, zone));
+
+ if (view->acache != NULL)
+ dns_zone_setacache(zone, view->acache);
+
+ CHECK(dns_acl_none(mctx, &none));
+ dns_zone_setqueryacl(zone, none);
+ dns_zone_setqueryonacl(zone, none);
+ dns_acl_detach(&none);
+
+ dns_zone_setdialup(zone, dns_dialuptype_no);
+ dns_zone_setnotifytype(zone, dns_notifytype_no);
+ dns_zone_setoption(zone, DNS_ZONEOPT_NOCHECKNS, ISC_TRUE);
+ dns_zone_setjournalsize(zone, 0);
+
+ dns_zone_setstats(zone, ns_g_server->zonestats);
+ CHECK(setquerystats(zone, mctx, ISC_FALSE));
+
+ if (view->managed_keys != NULL)
+ dns_zone_detach(&view->managed_keys);
+ dns_zone_attach(zone, &view->managed_keys);
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "set up managed keys zone for view %s, file '%s'",
+ view->name, filename);
+
+cleanup:
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ if (none != NULL)
+ dns_acl_detach(&none);
+
+ return (result);
+}
+
+/*
* Configure a single server quota.
*/
static void
@@ -2914,13 +3932,226 @@ removed(dns_zone_t *zone, void *uap) {
return (ISC_R_SUCCESS);
}
+static void
+cleanup_session_key(ns_server_t *server, isc_mem_t *mctx) {
+ if (server->session_keyfile != NULL) {
+ isc_file_remove(server->session_keyfile);
+ isc_mem_free(mctx, server->session_keyfile);
+ server->session_keyfile = NULL;
+ }
+
+ if (server->session_keyname != NULL) {
+ if (dns_name_dynamic(server->session_keyname))
+ dns_name_free(server->session_keyname, mctx);
+ isc_mem_put(mctx, server->session_keyname, sizeof(dns_name_t));
+ server->session_keyname = NULL;
+ }
+
+ if (server->sessionkey != NULL)
+ dns_tsigkey_detach(&server->sessionkey);
+
+ server->session_keyalg = DST_ALG_UNKNOWN;
+ server->session_keybits = 0;
+}
+
+static isc_result_t
+generate_session_key(const char *filename, const char *keynamestr,
+ dns_name_t *keyname, const char *algstr,
+ dns_name_t *algname, unsigned int algtype,
+ isc_uint16_t bits, isc_mem_t *mctx,
+ dns_tsigkey_t **tsigkeyp)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ dst_key_t *key = NULL;
+ isc_buffer_t key_txtbuffer;
+ isc_buffer_t key_rawbuffer;
+ char key_txtsecret[256];
+ char key_rawsecret[64];
+ isc_region_t key_rawregion;
+ isc_stdtime_t now;
+ dns_tsigkey_t *tsigkey = NULL;
+ FILE *fp = NULL;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "generating session key for dynamic DNS");
+
+ /* generate key */
+ result = dst_key_generate(keyname, algtype, bits, 1, 0,
+ DNS_KEYPROTO_ANY, dns_rdataclass_in,
+ mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * Dump the key to the buffer for later use. Should be done before
+ * we transfer the ownership of key to tsigkey.
+ */
+ isc_buffer_init(&key_rawbuffer, &key_rawsecret, sizeof(key_rawsecret));
+ CHECK(dst_key_tobuffer(key, &key_rawbuffer));
+
+ isc_buffer_usedregion(&key_rawbuffer, &key_rawregion);
+ isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
+ CHECK(isc_base64_totext(&key_rawregion, -1, "", &key_txtbuffer));
+
+ /* Store the key in tsigkey. */
+ isc_stdtime_get(&now);
+ CHECK(dns_tsigkey_createfromkey(dst_key_name(key), algname, key,
+ ISC_FALSE, NULL, now, now, mctx, NULL,
+ &tsigkey));
+
+ /* Dump the key to the key file. */
+ fp = ns_os_openfile(filename, S_IRUSR|S_IWUSR, ISC_TRUE);
+ if (fp == NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "could not create %s", filename);
+ result = ISC_R_NOPERM;
+ goto cleanup;
+ }
+
+ fprintf(fp, "key \"%s\" {\n"
+ "\talgorithm %s;\n"
+ "\tsecret \"%.*s\";\n};\n", keynamestr, algstr,
+ (int) isc_buffer_usedlength(&key_txtbuffer),
+ (char*) isc_buffer_base(&key_txtbuffer));
+
+ RUNTIME_CHECK(isc_stdio_flush(fp) == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc_stdio_close(fp) == ISC_R_SUCCESS);
+
+ dst_key_free(&key);
+
+ *tsigkeyp = tsigkey;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "failed to generate session key "
+ "for dynamic DNS: %s", isc_result_totext(result));
+ if (tsigkey != NULL)
+ dns_tsigkey_detach(&tsigkey);
+ if (key != NULL)
+ dst_key_free(&key);
+
+ return (result);
+}
+
+static isc_result_t
+configure_session_key(const cfg_obj_t **maps, ns_server_t *server,
+ isc_mem_t *mctx)
+{
+ const char *keyfile, *keynamestr, *algstr;
+ unsigned int algtype;
+ dns_fixedname_t fname;
+ dns_name_t *keyname, *algname;
+ isc_buffer_t buffer;
+ isc_uint16_t bits;
+ const cfg_obj_t *obj;
+ isc_boolean_t need_deleteold = ISC_FALSE;
+ isc_boolean_t need_createnew = ISC_FALSE;
+ isc_result_t result;
+
+ obj = NULL;
+ result = ns_config_get(maps, "session-keyfile", &obj);
+ if (result == ISC_R_SUCCESS) {
+ if (cfg_obj_isvoid(obj))
+ keyfile = NULL; /* disable it */
+ else
+ keyfile = cfg_obj_asstring(obj);
+ } else
+ keyfile = ns_g_defaultsessionkeyfile;
+
+ obj = NULL;
+ result = ns_config_get(maps, "session-keyname", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ keynamestr = cfg_obj_asstring(obj);
+ dns_fixedname_init(&fname);
+ isc_buffer_init(&buffer, keynamestr, strlen(keynamestr));
+ isc_buffer_add(&buffer, strlen(keynamestr));
+ keyname = dns_fixedname_name(&fname);
+ result = dns_name_fromtext(keyname, &buffer, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ obj = NULL;
+ result = ns_config_get(maps, "session-keyalg", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ algstr = cfg_obj_asstring(obj);
+ algname = NULL;
+ result = ns_config_getkeyalgorithm2(algstr, &algname, &algtype, &bits);
+ if (result != ISC_R_SUCCESS) {
+ const char *s = " (keeping current key)";
+
+ cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR, "session-keyalg: "
+ "unsupported or unknown algorithm '%s'%s",
+ algstr,
+ server->session_keyfile != NULL ? s : "");
+ return (result);
+ }
+
+ /* See if we need to (re)generate a new key. */
+ if (keyfile == NULL) {
+ if (server->session_keyfile != NULL)
+ need_deleteold = ISC_TRUE;
+ } else if (server->session_keyfile == NULL)
+ need_createnew = ISC_TRUE;
+ else if (strcmp(keyfile, server->session_keyfile) != 0 ||
+ !dns_name_equal(server->session_keyname, keyname) ||
+ server->session_keyalg != algtype ||
+ server->session_keybits != bits) {
+ need_deleteold = ISC_TRUE;
+ need_createnew = ISC_TRUE;
+ }
+
+ if (need_deleteold) {
+ INSIST(server->session_keyfile != NULL);
+ INSIST(server->session_keyname != NULL);
+ INSIST(server->sessionkey != NULL);
+
+ cleanup_session_key(server, mctx);
+ }
+
+ if (need_createnew) {
+ INSIST(server->sessionkey == NULL);
+ INSIST(server->session_keyfile == NULL);
+ INSIST(server->session_keyname == NULL);
+ INSIST(server->session_keyalg == DST_ALG_UNKNOWN);
+ INSIST(server->session_keybits == 0);
+
+ server->session_keyname = isc_mem_get(mctx, sizeof(dns_name_t));
+ if (server->session_keyname == NULL)
+ goto cleanup;
+ dns_name_init(server->session_keyname, NULL);
+ CHECK(dns_name_dup(keyname, mctx, server->session_keyname));
+
+ server->session_keyfile = isc_mem_strdup(mctx, keyfile);
+ if (server->session_keyfile == NULL)
+ goto cleanup;
+
+ server->session_keyalg = algtype;
+ server->session_keybits = bits;
+
+ CHECK(generate_session_key(keyfile, keynamestr, keyname, algstr,
+ algname, algtype, bits, mctx,
+ &server->sessionkey));
+ }
+
+ return (result);
+
+ cleanup:
+ cleanup_session_key(server, mctx);
+ return (result);
+}
+
static isc_result_t
load_configuration(const char *filename, ns_server_t *server,
isc_boolean_t first_time)
{
cfg_aclconfctx_t aclconfctx;
- cfg_obj_t *config;
- cfg_parser_t *parser = NULL;
+ cfg_obj_t *config = NULL, *bindkeys = NULL;
+ cfg_parser_t *conf_parser = NULL, *bindkeys_parser = NULL;
const cfg_listelt_t *element;
const cfg_obj_t *builtin_views;
const cfg_obj_t *maps[3];
@@ -2931,7 +4162,7 @@ load_configuration(const char *filename, ns_server_t *server,
dns_view_t *view = NULL;
dns_view_t *view_next;
dns_viewlist_t tmpviewlist;
- dns_viewlist_t viewlist;
+ dns_viewlist_t viewlist, builtin_viewlist;
in_port_t listen_port, udpport_low, udpport_high;
int i;
isc_interval_t interval;
@@ -2943,10 +4174,14 @@ load_configuration(const char *filename, ns_server_t *server,
isc_uint32_t interface_interval;
isc_uint32_t reserved;
isc_uint32_t udpsize;
+ ns_cachelist_t cachelist, tmpcachelist;
unsigned int maxsocks;
+ ns_cache_t *nsc;
cfg_aclconfctx_init(&aclconfctx);
ISC_LIST_INIT(viewlist);
+ ISC_LIST_INIT(builtin_viewlist);
+ ISC_LIST_INIT(cachelist);
/* Ensure exclusive access to configuration data. */
result = isc_task_beginexclusive(server->task);
@@ -2958,8 +4193,7 @@ load_configuration(const char *filename, ns_server_t *server,
if (first_time) {
CHECK(ns_config_parsedefaults(ns_g_parser, &ns_g_config));
RUNTIME_CHECK(cfg_map_get(ns_g_config, "options",
- &ns_g_defaults) ==
- ISC_R_SUCCESS);
+ &ns_g_defaults) == ISC_R_SUCCESS);
}
/*
@@ -2976,10 +4210,10 @@ load_configuration(const char *filename, ns_server_t *server,
NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
ISC_LOG_INFO, "loading configuration from '%s'",
filename);
- CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &parser));
- cfg_parser_setcallback(parser, directory_callback, NULL);
- result = cfg_parse_file(parser, filename, &cfg_type_namedconf,
- &config);
+ CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &conf_parser));
+ cfg_parser_setcallback(conf_parser, directory_callback, NULL);
+ result = cfg_parse_file(conf_parser, filename,
+ &cfg_type_namedconf, &config);
}
/*
@@ -2994,10 +4228,10 @@ load_configuration(const char *filename, ns_server_t *server,
NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
ISC_LOG_INFO, "loading configuration from '%s'",
lwresd_g_resolvconffile);
- if (parser != NULL)
- cfg_parser_destroy(&parser);
- CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &parser));
- result = ns_lwresd_parseeresolvconf(ns_g_mctx, parser,
+ if (conf_parser != NULL)
+ cfg_parser_destroy(&conf_parser);
+ CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx, &conf_parser));
+ result = ns_lwresd_parseeresolvconf(ns_g_mctx, conf_parser,
&config);
}
CHECK(result);
@@ -3019,13 +4253,38 @@ load_configuration(const char *filename, ns_server_t *server,
maps[i++] = NULL;
/*
+ * If bind.keys exists, load it. If "dnssec-lookaside auto"
+ * is turned on, the keys found there will be used as default
+ * trust anchors.
+ */
+ obj = NULL;
+ result = ns_config_get(maps, "bindkeys-file", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ CHECKM(setstring(server, &server->bindkeysfile,
+ cfg_obj_asstring(obj)), "strdup");
+
+ if (access(server->bindkeysfile, R_OK) == 0) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "reading built-in trusted "
+ "keys from file '%s'", server->bindkeysfile);
+
+ CHECK(cfg_parser_create(ns_g_mctx, ns_g_lctx,
+ &bindkeys_parser));
+
+ result = cfg_parse_file(bindkeys_parser, server->bindkeysfile,
+ &cfg_type_bindkeys, &bindkeys);
+ CHECK(result);
+ }
+
+ /*
* Set process limits, which (usually) needs to be done as root.
*/
set_limits(maps);
/*
* Check if max number of open sockets that the system allows is
- * sufficiently large. Failing this condition is not necessarily fatal,
+ * sufficiently large. Failing this condition is not necessarily fatal,
* but may cause subsequent runtime failures for a busy recursive
* server.
*/
@@ -3078,7 +4337,7 @@ load_configuration(const char *filename, ns_server_t *server,
else
isc_quota_soft(&server->recursionquota, 0);
- CHECK(configure_view_acl(NULL, config, "blackhole", &aclconfctx,
+ CHECK(configure_view_acl(NULL, config, "blackhole", NULL, &aclconfctx,
ns_g_mctx, &server->blackholeacl));
if (server->blackholeacl != NULL)
dns_dispatchmgr_setblackhole(ns_g_dispatchmgr,
@@ -3318,6 +4577,31 @@ load_configuration(const char *filename, ns_server_t *server,
&interval, ISC_FALSE));
/*
+ * Write the PID file.
+ */
+ obj = NULL;
+ if (ns_config_get(maps, "pid-file", &obj) == ISC_R_SUCCESS)
+ if (cfg_obj_isvoid(obj))
+ ns_os_writepidfile(NULL, first_time);
+ else
+ ns_os_writepidfile(cfg_obj_asstring(obj), first_time);
+ else if (ns_g_lwresdonly)
+ ns_os_writepidfile(lwresd_g_defaultpidfile, first_time);
+ else
+ ns_os_writepidfile(ns_g_defaultpidfile, first_time);
+
+ /*
+ * Configure the server-wide session key. This must be done before
+ * configure views because zone configuration may need to know
+ * session-keyname.
+ *
+ * Failure of session key generation isn't fatal at this time; if it
+ * turns out that a session key is really needed but doesn't exist,
+ * we'll treat it as a fatal error then.
+ */
+ (void)configure_session_key(maps, server, ns_g_mctx);
+
+ /*
* Configure and freeze all explicit views. Explicit
* views that have zones were already created at parsing
* time, but views with no zones must be created here.
@@ -3328,12 +4612,13 @@ load_configuration(const char *filename, ns_server_t *server,
element != NULL;
element = cfg_list_next(element))
{
- const cfg_obj_t *vconfig = cfg_listelt_value(element);
+ cfg_obj_t *vconfig = cfg_listelt_value(element);
view = NULL;
CHECK(create_view(vconfig, &viewlist, &view));
INSIST(view != NULL);
- CHECK(configure_view(view, config, vconfig,
+ CHECK(configure_view(view, conf_parser, config, vconfig,
+ &cachelist, bindkeys,
ns_g_mctx, &aclconfctx, ISC_TRUE));
dns_view_freeze(view);
dns_view_detach(&view);
@@ -3351,15 +4636,15 @@ load_configuration(const char *filename, ns_server_t *server,
* In either case, we need to configure and freeze it.
*/
CHECK(create_view(NULL, &viewlist, &view));
- CHECK(configure_view(view, config, NULL, ns_g_mctx,
- &aclconfctx, ISC_TRUE));
+ CHECK(configure_view(view, conf_parser, config, NULL,
+ &cachelist, bindkeys,
+ ns_g_mctx, &aclconfctx, ISC_TRUE));
dns_view_freeze(view);
dns_view_detach(&view);
}
/*
- * Create (or recreate) the built-in views. Currently
- * there is only one, the _bind view.
+ * Create (or recreate) the built-in views.
*/
builtin_views = NULL;
RUNTIME_CHECK(cfg_map_get(ns_g_config, "view",
@@ -3368,25 +4653,38 @@ load_configuration(const char *filename, ns_server_t *server,
element != NULL;
element = cfg_list_next(element))
{
- const cfg_obj_t *vconfig = cfg_listelt_value(element);
- CHECK(create_view(vconfig, &viewlist, &view));
- CHECK(configure_view(view, config, vconfig, ns_g_mctx,
- &aclconfctx, ISC_FALSE));
+ cfg_obj_t *vconfig = cfg_listelt_value(element);
+
+ CHECK(create_view(vconfig, &builtin_viewlist, &view));
+ CHECK(configure_view(view, conf_parser, config, vconfig,
+ &cachelist, bindkeys,
+ ns_g_mctx, &aclconfctx, ISC_FALSE));
dns_view_freeze(view);
dns_view_detach(&view);
view = NULL;
}
- /*
- * Swap our new view list with the production one.
- */
+ /* Now combine the two viewlists into one */
+ ISC_LIST_APPENDLIST(viewlist, builtin_viewlist, link);
+
+ /* Swap our new view list with the production one. */
tmpviewlist = server->viewlist;
server->viewlist = viewlist;
viewlist = tmpviewlist;
- /*
- * Load the TKEY information from the configuration.
- */
+ /* Make the view list available to each of the views */
+ view = ISC_LIST_HEAD(server->viewlist);
+ while (view != NULL) {
+ view->viewlist = &server->viewlist;
+ view = ISC_LIST_NEXT(view, link);
+ }
+
+ /* Swap our new cache list with the production one. */
+ tmpcachelist = server->cachelist;
+ server->cachelist = cachelist;
+ cachelist = tmpcachelist;
+
+ /* Load the TKEY information from the configuration. */
if (options != NULL) {
dns_tkeyctx_t *t = NULL;
CHECKM(ns_tkeyctx_fromconfig(options, ns_g_mctx, ns_g_entropy,
@@ -3551,16 +4849,6 @@ load_configuration(const char *filename, ns_server_t *server,
}
}
- obj = NULL;
- if (ns_config_get(maps, "pid-file", &obj) == ISC_R_SUCCESS)
- if (cfg_obj_isvoid(obj))
- ns_os_writepidfile(NULL, first_time);
- else
- ns_os_writepidfile(cfg_obj_asstring(obj), first_time);
- else if (ns_g_lwresdonly)
- ns_os_writepidfile(lwresd_g_defaultpidfile, first_time);
- else
- ns_os_writepidfile(ns_g_defaultpidfile, first_time);
obj = NULL;
if (options != NULL &&
@@ -3591,6 +4879,12 @@ load_configuration(const char *filename, ns_server_t *server,
"strdup");
obj = NULL;
+ result = ns_config_get(maps, "secroots-file", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ CHECKM(setstring(server, &server->secrootsfile, cfg_obj_asstring(obj)),
+ "strdup");
+
+ obj = NULL;
result = ns_config_get(maps, "recursing-file", &obj);
INSIST(result == ISC_R_SUCCESS);
CHECKM(setstring(server, &server->recfile, cfg_obj_asstring(obj)),
@@ -3647,12 +4941,18 @@ load_configuration(const char *filename, ns_server_t *server,
if (v6portset != NULL)
isc_portset_destroy(ns_g_mctx, &v6portset);
- cfg_aclconfctx_destroy(&aclconfctx);
+ cfg_aclconfctx_clear(&aclconfctx);
- if (parser != NULL) {
+ if (conf_parser != NULL) {
if (config != NULL)
- cfg_obj_destroy(parser, &config);
- cfg_parser_destroy(&parser);
+ cfg_obj_destroy(conf_parser, &config);
+ cfg_parser_destroy(&conf_parser);
+ }
+
+ if (bindkeys_parser != NULL) {
+ if (bindkeys != NULL)
+ cfg_obj_destroy(bindkeys_parser, &bindkeys);
+ cfg_parser_destroy(&bindkeys_parser);
}
if (view != NULL)
@@ -3675,6 +4975,13 @@ load_configuration(const char *filename, ns_server_t *server,
dns_view_detach(&view);
}
+ /* Same cleanup for cache list. */
+ while ((nsc = ISC_LIST_HEAD(cachelist)) != NULL) {
+ ISC_LIST_UNLINK(cachelist, nsc, link);
+ dns_cache_detach(&nsc->cache);
+ isc_mem_put(server->mctx, nsc, sizeof(*nsc));
+ }
+
/*
* Adjust the listening interfaces in accordance with the source
* addresses specified in views and zones.
@@ -3708,6 +5015,8 @@ load_zones(ns_server_t *server, isc_boolean_t stop) {
view = ISC_LIST_NEXT(view, link))
{
CHECK(dns_view_load(view, stop));
+ if (view->managed_keys != NULL)
+ CHECK(dns_zone_load(view->managed_keys));
}
/*
@@ -3737,11 +5046,14 @@ load_new_zones(ns_server_t *server, isc_boolean_t stop) {
view = ISC_LIST_NEXT(view, link))
{
CHECK(dns_view_loadnew(view, stop));
+
+ /* Load managed-keys data */
+ if (view->managed_keys != NULL)
+ CHECK(dns_zone_loadnew(view->managed_keys));
}
+
/*
- * Force zone maintenance. Do this after loading
- * so that we know when we need to force AXFR of
- * slave zones whose master files are missing.
+ * Resume zone XFRs.
*/
dns_zonemgr_resumexfrs(server->zonemgr);
cleanup:
@@ -3820,6 +5132,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
dns_view_t *view, *view_next;
ns_server_t *server = (ns_server_t *)event->ev_arg;
isc_boolean_t flush = server->flushonshutdown;
+ ns_cache_t *nsc;
UNUSED(task);
INSIST(task == server->task);
@@ -3834,6 +5147,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
ns_statschannels_shutdown(server);
ns_controls_shutdown(server->controls);
end_reserved_dispatches(server, ISC_TRUE);
+ cleanup_session_key(server, server->mctx);
cfg_obj_destroy(ns_g_parser, &ns_g_config);
cfg_parser_destroy(&ns_g_parser);
@@ -3849,6 +5163,12 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
dns_view_detach(&view);
}
+ while ((nsc = ISC_LIST_HEAD(server->cachelist)) != NULL) {
+ ISC_LIST_UNLINK(server->cachelist, nsc, link);
+ dns_cache_detach(&nsc->cache);
+ isc_mem_put(server->mctx, nsc, sizeof(*nsc));
+ }
+
isc_timer_detach(&server->interface_timer);
isc_timer_detach(&server->heartbeat_timer);
isc_timer_detach(&server->pps_timer);
@@ -3860,6 +5180,11 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
dns_zonemgr_shutdown(server->zonemgr);
+ if (ns_g_sessionkey != NULL) {
+ dns_tsigkey_detach(&ns_g_sessionkey);
+ dns_name_free(&ns_g_sessionkeyname, server->mctx);
+ }
+
if (server->blackholeacl != NULL)
dns_acl_detach(&server->blackholeacl);
@@ -3918,7 +5243,8 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
ISC_R_NOMEMORY : ISC_R_SUCCESS,
"allocating reload event");
- CHECKFATAL(dst_lib_init(ns_g_mctx, ns_g_entropy, ISC_ENTROPY_GOODONLY),
+ CHECKFATAL(dst_lib_init2(ns_g_mctx, ns_g_entropy,
+ ns_g_engine, ISC_ENTROPY_GOODONLY),
"initializing DST");
server->tkeyctx = NULL;
@@ -3963,10 +5289,20 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
"isc_stats_create");
isc_socketmgr_setstats(ns_g_socketmgr, server->sockstats);
+ server->bindkeysfile = isc_mem_strdup(server->mctx, "bind.keys");
+ CHECKFATAL(server->bindkeysfile == NULL ? ISC_R_NOMEMORY :
+ ISC_R_SUCCESS,
+ "isc_mem_strdup");
+
server->dumpfile = isc_mem_strdup(server->mctx, "named_dump.db");
CHECKFATAL(server->dumpfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS,
"isc_mem_strdup");
+ server->secrootsfile = isc_mem_strdup(server->mctx, "named.secroots");
+ CHECKFATAL(server->secrootsfile == NULL ? ISC_R_NOMEMORY :
+ ISC_R_SUCCESS,
+ "isc_mem_strdup");
+
server->recfile = isc_mem_strdup(server->mctx, "named.recursing");
CHECKFATAL(server->recfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS,
"isc_mem_strdup");
@@ -4008,6 +5344,14 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) {
ISC_LIST_INIT(server->statschannels);
+ ISC_LIST_INIT(server->cachelist);
+
+ server->sessionkey = NULL;
+ server->session_keyfile = NULL;
+ server->session_keyname = NULL;
+ server->session_keyalg = DST_ALG_UNKNOWN;
+ server->session_keybits = 0;
+
server->magic = NS_SERVER_MAGIC;
*serverp = server;
}
@@ -4027,7 +5371,9 @@ ns_server_destroy(ns_server_t **serverp) {
isc_stats_detach(&server->sockstats);
isc_mem_free(server->mctx, server->statsfile);
+ isc_mem_free(server->mctx, server->bindkeysfile);
isc_mem_free(server->mctx, server->dumpfile);
+ isc_mem_free(server->mctx, server->secrootsfile);
isc_mem_free(server->mctx, server->recfile);
if (server->version != NULL)
@@ -4047,6 +5393,7 @@ ns_server_destroy(ns_server_t **serverp) {
isc_event_free(&server->reload_event);
INSIST(ISC_LIST_EMPTY(server->viewlist));
+ INSIST(ISC_LIST_EMPTY(server->cachelist));
dns_aclenv_destroy(&server->aclenv);
@@ -4278,7 +5625,9 @@ next_token(char **stringp, const char *delim) {
* set '*zonep' to NULL.
*/
static isc_result_t
-zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) {
+zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep,
+ const char **zonename)
+{
char *input, *ptr;
const char *zonetxt;
char *classtxt;
@@ -4302,6 +5651,8 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) {
zonetxt = next_token(&input, " \t");
if (zonetxt == NULL)
return (ISC_R_SUCCESS);
+ if (zonename)
+ *zonename = zonetxt;
/* Look for the optional class name. */
classtxt = next_token(&input, " \t");
@@ -4314,7 +5665,7 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep) {
isc_buffer_add(&buf, strlen(zonetxt));
dns_fixedname_init(&name);
result = dns_name_fromtext(dns_fixedname_name(&name),
- &buf, dns_rootname, ISC_FALSE, NULL);
+ &buf, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
goto fail1;
@@ -4362,7 +5713,7 @@ ns_server_retransfercommand(ns_server_t *server, char *args) {
dns_zone_t *zone = NULL;
dns_zonetype_t type;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL)
@@ -4386,7 +5737,7 @@ ns_server_reloadcommand(ns_server_t *server, char *args, isc_buffer_t *text) {
dns_zonetype_t type;
const char *msg = NULL;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL) {
@@ -4446,7 +5797,7 @@ ns_server_notifycommand(ns_server_t *server, char *args, isc_buffer_t *text) {
dns_zone_t *zone = NULL;
const unsigned char msg[] = "zone notify queued";
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL)
@@ -4471,7 +5822,7 @@ ns_server_refreshcommand(ns_server_t *server, char *args, isc_buffer_t *text) {
const unsigned char msg2[] = "not a slave or stub zone";
dns_zonetype_t type;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL)
@@ -4710,15 +6061,23 @@ dumpdone(void *arg, isc_result_t result) {
nextview:
fprintf(dctx->fp, ";\n; Start view %s\n;\n", dctx->view->view->name);
resume:
- if (dctx->zone == NULL && dctx->cache == NULL && dctx->dumpcache) {
+ if (dctx->dumpcache && dns_view_iscacheshared(dctx->view->view)) {
+ fprintf(dctx->fp,
+ ";\n; Cache of view '%s' is shared as '%s'\n",
+ dctx->view->view->name,
+ dns_cache_getname(dctx->view->view->cache));
+ } else if (dctx->zone == NULL && dctx->cache == NULL &&
+ dctx->dumpcache)
+ {
style = &dns_master_style_cache;
/* start cache dump */
if (dctx->view->view->cachedb != NULL)
dns_db_attach(dctx->view->view->cachedb, &dctx->cache);
if (dctx->cache != NULL) {
-
- fprintf(dctx->fp, ";\n; Cache dump of view '%s'\n;\n",
- dctx->view->view->name);
+ fprintf(dctx->fp,
+ ";\n; Cache dump of view '%s' (cache %s)\n;\n",
+ dctx->view->view->name,
+ dns_cache_getname(dctx->view->view->cache));
result = dns_master_dumptostreaminc(dctx->mctx,
dctx->cache, NULL,
style, dctx->fp,
@@ -4880,6 +6239,68 @@ ns_server_dumpdb(ns_server_t *server, char *args) {
}
isc_result_t
+ns_server_dumpsecroots(ns_server_t *server, char *args) {
+ dns_view_t *view;
+ dns_keytable_t *secroots = NULL;
+ isc_result_t result;
+ char *ptr;
+ FILE *fp = NULL;
+ isc_time_t now;
+ char tbuf[64];
+
+ /* Skip the command name. */
+ ptr = next_token(&args, " \t");
+ if (ptr == NULL)
+ return (ISC_R_UNEXPECTEDEND);
+ ptr = next_token(&args, " \t");
+
+ CHECKMF(isc_stdio_open(server->secrootsfile, "w", &fp),
+ "could not open secroots dump file", server->secrootsfile);
+ TIME_NOW(&now);
+ isc_time_formattimestamp(&now, tbuf, sizeof(tbuf));
+ fprintf(fp, "%s\n", tbuf);
+
+ nextview:
+ for (view = ISC_LIST_HEAD(server->viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ {
+ if (ptr != NULL && strcmp(view->name, ptr) != 0)
+ continue;
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ result = dns_view_getsecroots(view, &secroots);
+ if (result == ISC_R_NOTFOUND) {
+ result = ISC_R_SUCCESS;
+ continue;
+ }
+ fprintf(fp, "\n Start view %s\n\n", view->name);
+ CHECK(dns_keytable_dump(secroots, fp));
+ }
+ if (ptr != NULL) {
+ ptr = next_token(&args, " \t");
+ if (ptr != NULL)
+ goto nextview;
+ }
+
+ cleanup:
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ if (fp != NULL)
+ (void)isc_stdio_close(fp);
+ if (result == ISC_R_SUCCESS)
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "dumpsecroots complete");
+ else
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "dumpsecroots failed: %s",
+ dns_result_totext(result));
+ return (result);
+}
+
+isc_result_t
ns_server_dumprecursing(ns_server_t *server) {
FILE *fp = NULL;
isc_result_t result;
@@ -4997,6 +6418,7 @@ ns_server_flushcache(ns_server_t *server, char *args) {
isc_boolean_t flushed;
isc_boolean_t found;
isc_result_t result;
+ ns_cache_t *nsc;
/* Skip the command name. */
ptr = next_token(&args, " \t");
@@ -5010,22 +6432,96 @@ ns_server_flushcache(ns_server_t *server, char *args) {
RUNTIME_CHECK(result == ISC_R_SUCCESS);
flushed = ISC_TRUE;
found = ISC_FALSE;
- for (view = ISC_LIST_HEAD(server->viewlist);
- view != NULL;
- view = ISC_LIST_NEXT(view, link))
- {
- if (viewname != NULL && strcasecmp(viewname, view->name) != 0)
- continue;
+
+ /*
+ * Flushing a cache is tricky when caches are shared by multiple views.
+ * We first identify which caches should be flushed in the local cache
+ * list, flush these caches, and then update other views that refer to
+ * the flushed cache DB.
+ */
+ if (viewname != NULL) {
+ /*
+ * Mark caches that need to be flushed. This is an O(#view^2)
+ * operation in the very worst case, but should be normally
+ * much more lightweight because only a few (most typically just
+ * one) views will match.
+ */
+ for (view = ISC_LIST_HEAD(server->viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ {
+ if (strcasecmp(viewname, view->name) != 0)
+ continue;
+ found = ISC_TRUE;
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (nsc->cache == view->cache)
+ break;
+ }
+ INSIST(nsc != NULL);
+ nsc->needflush = ISC_TRUE;
+ }
+ } else
found = ISC_TRUE;
- result = dns_view_flushcache(view);
+
+ /* Perform flush */
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (viewname != NULL && !nsc->needflush)
+ continue;
+ nsc->needflush = ISC_TRUE;
+ result = dns_view_flushcache2(nsc->primaryview, ISC_FALSE);
if (result != ISC_R_SUCCESS) {
flushed = ISC_FALSE;
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
"flushing cache in view '%s' failed: %s",
- view->name, isc_result_totext(result));
+ nsc->primaryview->name,
+ isc_result_totext(result));
+ }
+ }
+
+ /*
+ * Fix up views that share a flushed cache: let the views update the
+ * cache DB they're referring to. This could also be an expensive
+ * operation, but should typically be marginal: the inner loop is only
+ * necessary for views that share a cache, and if there are many such
+ * views the number of shared cache should normally be small.
+ * A worst case is that we have n views and n/2 caches, each shared by
+ * two views. Then this will be a O(n^2/4) operation.
+ */
+ for (view = ISC_LIST_HEAD(server->viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ {
+ if (!dns_view_iscacheshared(view))
+ continue;
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ if (!nsc->needflush || nsc->cache != view->cache)
+ continue;
+ result = dns_view_flushcache2(view, ISC_TRUE);
+ if (result != ISC_R_SUCCESS) {
+ flushed = ISC_FALSE;
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "fixing cache in view '%s' "
+ "failed: %s", view->name,
+ isc_result_totext(result));
+ }
}
}
+
+ /* Cleanup the cache list. */
+ for (nsc = ISC_LIST_HEAD(server->cachelist);
+ nsc != NULL;
+ nsc = ISC_LIST_NEXT(nsc, link)) {
+ nsc->needflush = ISC_FALSE;
+ }
+
if (flushed && found) {
if (viewname != NULL)
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
@@ -5076,7 +6572,7 @@ ns_server_flushname(ns_server_t *server, char *args) {
isc_buffer_add(&b, strlen(target));
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
- result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -5094,6 +6590,11 @@ ns_server_flushname(ns_server_t *server, char *args) {
if (viewname != NULL && strcasecmp(viewname, view->name) != 0)
continue;
found = ISC_TRUE;
+ /*
+ * It's a little inefficient to try flushing name for all views
+ * if some of the views share a single cache. But since the
+ * operation is lightweight we prefer simplicity here.
+ */
result = dns_view_flushname(view, name);
if (result != ISC_R_SUCCESS) {
flushed = ISC_FALSE;
@@ -5408,6 +6909,46 @@ ns_server_tsiglist(ns_server_t *server, isc_buffer_t *text) {
}
/*
+ * Act on a "sign" or "loadkeys" command from the command channel.
+ */
+isc_result_t
+ns_server_rekey(ns_server_t *server, char *args) {
+ isc_result_t result;
+ dns_zone_t *zone = NULL;
+ dns_zonetype_t type;
+ isc_uint16_t keyopts;
+ isc_boolean_t fullsign = ISC_FALSE;
+
+ if (strncasecmp(args, NS_COMMAND_SIGN, strlen(NS_COMMAND_SIGN)) == 0)
+ fullsign = ISC_TRUE;
+
+ result = zone_from_args(server, args, &zone, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (zone == NULL)
+ return (ISC_R_UNEXPECTEDEND); /* XXX: or do all zones? */
+
+ type = dns_zone_gettype(zone);
+ if (type != dns_zone_master) {
+ dns_zone_detach(&zone);
+ return (DNS_R_NOTMASTER);
+ }
+
+ keyopts = dns_zone_getkeyopts(zone);
+
+ /* "rndc loadkeys" requires "auto-dnssec maintain". */
+ if ((keyopts & DNS_ZONEKEY_ALLOW) == 0)
+ result = ISC_R_NOPERM;
+ else if ((keyopts & DNS_ZONEKEY_MAINTAIN) == 0 && !fullsign)
+ result = ISC_R_NOPERM;
+ else
+ dns_zone_rekey(zone, fullsign);
+
+ dns_zone_detach(&zone);
+ return (result);
+}
+
+/*
* Act on a "freeze" or "thaw" command from the command channel.
*/
isc_result_t
@@ -5425,7 +6966,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
isc_boolean_t frozen;
const char *msg = NULL;
- result = zone_from_args(server, args, &zone);
+ result = zone_from_args(server, args, &zone, NULL);
if (result != ISC_R_SUCCESS)
return (result);
if (zone == NULL) {
@@ -5451,7 +6992,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
type = dns_zone_gettype(zone);
if (type != dns_zone_master) {
dns_zone_detach(&zone);
- return (ISC_R_NOTFOUND);
+ return (DNS_R_NOTMASTER);
}
result = isc_task_beginexclusive(server->task);
@@ -5502,8 +7043,8 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
strlen(msg) + 1);
view = dns_zone_getview(zone);
- if (strcmp(view->name, "_bind") == 0 ||
- strcmp(view->name, "_default") == 0)
+ if (strcmp(view->name, "_default") == 0 ||
+ strcmp(view->name, "_bind") == 0)
{
vname = "";
sep = "";
@@ -5543,3 +7084,376 @@ ns_smf_add_message(isc_buffer_t *text) {
return (ISC_R_SUCCESS);
}
#endif /* HAVE_LIBSCF */
+
+/*
+ * Act on an "addzone" command from the command channel.
+ */
+isc_result_t
+ns_server_add_zone(ns_server_t *server, char *args) {
+ isc_result_t result;
+ isc_buffer_t argbuf;
+ size_t arglen;
+ cfg_parser_t *parser = NULL;
+ cfg_obj_t *config = NULL;
+ const cfg_obj_t *vconfig = NULL;
+ const cfg_obj_t *views = NULL;
+ const cfg_obj_t *parms = NULL;
+ const cfg_obj_t *obj = NULL;
+ const cfg_listelt_t *element;
+ const char *zonename;
+ const char *classname = NULL;
+ const char *argp;
+ const char *viewname = NULL;
+ dns_rdataclass_t rdclass;
+ dns_view_t *view = 0;
+ isc_buffer_t buf, *nbuf = NULL;
+ dns_name_t dnsname;
+ dns_zone_t *zone = NULL;
+ FILE *fp = NULL;
+ struct cfg_context *cfg = NULL;
+
+ /* Try to parse the argument string */
+ arglen = strlen(args);
+ isc_buffer_init(&argbuf, args, arglen);
+ isc_buffer_add(&argbuf, strlen(args));
+ CHECK(cfg_parser_create(server->mctx, ns_g_lctx, &parser));
+ CHECK(cfg_parse_buffer(parser, &argbuf, &cfg_type_addzoneconf,
+ &config));
+ CHECK(cfg_map_get(config, "addzone", &parms));
+
+ zonename = cfg_obj_asstring(cfg_tuple_get(parms, "name"));
+ isc_buffer_init(&buf, zonename, strlen(zonename));
+ isc_buffer_add(&buf, strlen(zonename));
+ dns_name_init(&dnsname, NULL);
+ isc_buffer_allocate(server->mctx, &nbuf, 256);
+ dns_name_setbuffer(&dnsname, nbuf);
+ CHECK(dns_name_fromtext(&dnsname, &buf, dns_rootname, ISC_FALSE, NULL));
+
+ /* Make sense of optional class argument */
+ obj = cfg_tuple_get(parms, "class");
+ CHECK(ns_config_getclass(obj, dns_rdataclass_in, &rdclass));
+ if (rdclass != dns_rdataclass_in && obj)
+ classname = cfg_obj_asstring(obj);
+
+ /* Make sense of optional view argument */
+ obj = cfg_tuple_get(parms, "view");
+ if (obj && cfg_obj_isstring(obj))
+ viewname = cfg_obj_asstring(obj);
+ if (viewname == NULL || *viewname == '\0')
+ viewname = "_default";
+ CHECK(dns_viewlist_find(&server->viewlist, viewname, rdclass, &view));
+
+ /* Are we accepting new zones? */
+ if (view->new_zone_file == NULL) {
+ result = ISC_R_NOPERM;
+ goto cleanup;
+ }
+
+ cfg = (struct cfg_context *) view->new_zone_config;
+ if (cfg == NULL) {
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ /* Zone shouldn't already exist */
+ result = dns_zt_find(view->zonetable, &dnsname, 0, NULL, &zone);
+ if (result == ISC_R_SUCCESS) {
+ result = ISC_R_EXISTS;
+ goto cleanup;
+ } else if (result == DNS_R_PARTIALMATCH) {
+ /* Create our sub-zone anyway */
+ dns_zone_detach(&zone);
+ zone = NULL;
+ }
+ else if (result != ISC_R_NOTFOUND)
+ goto cleanup;
+
+ /* Find the view statement */
+ cfg_map_get(cfg->config, "view", &views);
+ for (element = cfg_list_first(views);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const char *vname;
+ vconfig = cfg_listelt_value(element);
+ vname = cfg_obj_asstring(cfg_tuple_get(vconfig, "name"));
+ if (vname && !strcasecmp(vname, viewname))
+ break;
+ vconfig = NULL;
+ }
+
+ /* Open save file for write configuration */
+ CHECK(isc_stdio_open(view->new_zone_file, "a", &fp));
+
+ /* Mark view unfrozen so that zone can be added */
+ dns_view_thaw(view);
+ result = configure_zone(cfg->config, parms, vconfig,
+ server->mctx, view, &cfg->actx, ISC_FALSE);
+ dns_view_freeze(view);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+ /* Is it there yet? */
+ CHECK(dns_zt_find(view->zonetable, &dnsname, 0, NULL, &zone));
+
+ /*
+ * Load the zone from the master file. If this fails, we'll
+ * need to undo the configuration we've done already.
+ */
+ result = dns_zone_loadnew(zone);
+ if (result != ISC_R_SUCCESS) {
+ dns_db_t *dbp = NULL;
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "addzone failed; reverting.");
+
+ /* If the zone loaded partially, unload it */
+ if (dns_zone_getdb(zone, &dbp) == ISC_R_SUCCESS) {
+ dns_db_detach(&dbp);
+ dns_zone_unload(zone);
+ }
+
+ /* Remove the zone from the zone table */
+ dns_zt_unmount(view->zonetable, zone);
+ goto cleanup;
+ }
+
+ /* Flag the zone as having been added at runtime */
+ dns_zone_setadded(zone, ISC_TRUE);
+
+ /* Emit just the zone name from args */
+ CHECK(isc_stdio_write("zone ", 5, 1, fp, NULL));
+ CHECK(isc_stdio_write(zonename, strlen(zonename), 1, fp, NULL));
+ CHECK(isc_stdio_write(" ", 1, 1, fp, NULL));
+
+ /* Classname, if not default */
+ if (classname != NULL && *classname != '\0') {
+ CHECK(isc_stdio_write(classname, strlen(classname), 1, fp,
+ NULL));
+ CHECK(isc_stdio_write(" ", 1, 1, fp, NULL));
+ }
+
+ /* Find beginning of option block from args */
+ for (argp = args; *argp; argp++, arglen--) {
+ if (*argp == '{') { /* Assume matching '}' */
+ /* Add that to our file */
+ CHECK(isc_stdio_write(argp, arglen, 1, fp, NULL));
+
+ /* Make sure we end with a LF */
+ if (argp[arglen-1] != '\n') {
+ CHECK(isc_stdio_write("\n", 1, 1, fp, NULL));
+ }
+ break;
+ }
+ }
+
+ CHECK(isc_stdio_close(fp));
+ fp = NULL;
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "zone %s added to view %s via addzone",
+ zonename, viewname);
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (fp != NULL)
+ isc_stdio_close(fp);
+ if (parser != NULL) {
+ if (config != NULL)
+ cfg_obj_destroy(parser, &config);
+ cfg_parser_destroy(&parser);
+ }
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+ if (view != NULL)
+ dns_view_detach(&view);
+ if (nbuf != NULL)
+ isc_buffer_free(&nbuf);
+
+ return (result);
+}
+
+/*
+ * Act on a "delzone" command from the command channel.
+ */
+isc_result_t
+ns_server_del_zone(ns_server_t *server, char *args) {
+ isc_result_t result;
+ dns_zone_t *zone = NULL;
+ dns_view_t *view = NULL;
+ dns_db_t *dbp = NULL;
+ const char *filename = NULL;
+ char *tmpname = NULL;
+ char buf[1024];
+ const char *zonename = NULL;
+ size_t znamelen = 0;
+ FILE *ifp = NULL, *ofp = NULL;
+
+ /* Parse parameters */
+ CHECK(zone_from_args(server, args, &zone, &zonename));
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (zone == NULL) {
+ result = ISC_R_UNEXPECTEDEND;
+ goto cleanup;
+ }
+
+ /*
+ * Was this zone originally added at runtime?
+ * If not, we can't delete it now.
+ */
+ if (!dns_zone_getadded(zone)) {
+ result = ISC_R_NOPERM;
+ goto cleanup;
+ }
+
+ if (zonename != NULL)
+ znamelen = strlen(zonename);
+
+ /* Dig out configuration for this zone */
+ view = dns_zone_getview(zone);
+ filename = view->new_zone_file;
+ if (filename == NULL) {
+ /* No adding zones in this view */
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ /* Rewrite zone list */
+ result = isc_stdio_open(filename, "r", &ifp);
+ if (ifp != NULL && result == ISC_R_SUCCESS) {
+ char *found = NULL, *p = NULL;
+ size_t n;
+
+ /* Create a temporary file */
+ CHECK(isc_string_printf(buf, 1023, "%s.%ld", filename,
+ (long)getpid()));
+ if (!(tmpname = isc_mem_strdup(server->mctx, buf))) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ CHECK(isc_stdio_open(tmpname, "w", &ofp));
+
+ /* Look for the entry for that zone */
+ while (fgets(buf, 1024, ifp)) {
+ /* A 'zone' line */
+ if (strncasecmp(buf, "zone", 4)) {
+ fputs(buf, ofp);
+ continue;
+ }
+ p = buf+4;
+
+ /* Locate a name */
+ while (*p &&
+ ((*p == '"') || isspace((unsigned char)*p)))
+ p++;
+
+ /* Is that the zone we're looking for */
+ if (strncasecmp(p, zonename, znamelen)) {
+ fputs(buf, ofp);
+ continue;
+ }
+
+ /* And nothing else? */
+ p += znamelen;
+ if (isspace((unsigned char)*p) ||
+ *p == '"' || *p == '{') {
+ /* This must be the entry */
+ found = p;
+ break;
+ }
+
+ /* Spit it out, keep looking */
+ fputs(buf, ofp);
+ }
+
+ /* Skip over an option block (matching # of braces) */
+ if (found) {
+ int obrace = 0, cbrace = 0;
+ for (;;) {
+ while (*p) {
+ if (*p == '{') obrace++;
+ if (*p == '}') cbrace++;
+ p++;
+ }
+ if (obrace && (obrace == cbrace))
+ break;
+ if (!fgets(buf, 1024, ifp))
+ break;
+ p = buf;
+ }
+
+ /* Just spool the remainder of the file out */
+ result = isc_stdio_read(buf, 1, 1024, ifp, &n);
+ while (n > 0U) {
+ if (result == ISC_R_EOF)
+ result = ISC_R_SUCCESS;
+ CHECK(result);
+ isc_stdio_write(buf, 1, n, ofp, NULL);
+ result = isc_stdio_read(buf, 1, 1024, ifp, &n);
+ }
+
+ /* Move temporary into place */
+ CHECK(isc_file_rename(tmpname, view->new_zone_file));
+ } else {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_WARNING,
+ "deleted zone %s was missing from "
+ "new zone file", zonename);
+ goto cleanup;
+ }
+ }
+
+ /* Stop answering for this zone */
+ if (dns_zone_getdb(zone, &dbp) == ISC_R_SUCCESS) {
+ dns_db_detach(&dbp);
+ dns_zone_unload(zone);
+ }
+
+ CHECK(dns_zt_unmount(view->zonetable, zone));
+
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_INFO,
+ "zone %s removed via delzone", zonename);
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (ifp != NULL)
+ isc_stdio_close(ifp);
+ if (ofp != NULL) {
+ isc_stdio_close(ofp);
+ isc_file_remove(tmpname);
+ }
+ if (tmpname != NULL)
+ isc_mem_free(server->mctx, tmpname);
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+
+ return (result);
+}
+
+static void
+cfgctx_destroy(void **cfgp) {
+ struct cfg_context *cfg;
+ isc_mem_t *mctx;
+
+ REQUIRE(cfgp != NULL && *cfgp != NULL);
+ cfg = *cfgp;
+ mctx = cfg->mctx;
+ cfg->mctx = NULL;
+
+ if (cfg->parser != NULL) {
+ if (cfg->config != NULL)
+ cfg_obj_destroy(cfg->parser, &cfg->config);
+ cfg_parser_destroy(&cfg->parser);
+ }
+ cfg_aclconfctx_clear(&cfg->actx);
+
+ isc_mem_put(mctx, cfg, sizeof(*cfg));
+ isc_mem_detach(&mctx);
+ *cfgp = NULL;
+}
diff --git a/contrib/bind9/bin/named/statschannel.c b/contrib/bind9/bin/named/statschannel.c
index c77d3ca..6dce8e0 100644
--- a/contrib/bind9/bin/named/statschannel.c
+++ b/contrib/bind9/bin/named/statschannel.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: statschannel.c,v 1.14.64.11 2010-02-04 23:47:46 tbox Exp $ */
+/* $Id: statschannel.c,v 1.26 2010-02-04 23:49:13 tbox Exp $ */
/*! \file */
@@ -29,6 +29,7 @@
#include <isc/stats.h>
#include <isc/task.h>
+#include <dns/cache.h>
#include <dns/db.h>
#include <dns/opcode.h>
#include <dns/resolver.h>
@@ -823,9 +824,9 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
TRY0(xmlTextWriterStartElement(writer,
ISC_XMLCHAR "cache"));
TRY0(xmlTextWriterWriteAttribute(writer,
- ISC_XMLCHAR "name",
- ISC_XMLCHAR
- view->name));
+ ISC_XMLCHAR "name",
+ ISC_XMLCHAR
+ dns_cache_getname(view->cache)));
dumparg.result = ISC_R_SUCCESS;
dns_rdatasetstats_dump(cachestats, rdatasetstats_dump,
&dumparg, 0);
@@ -1405,7 +1406,15 @@ ns_stats_dump(ns_server_t *server, FILE *fp) {
if (strcmp(view->name, "_default") == 0)
fprintf(fp, "[View: default]\n");
else
- fprintf(fp, "[View: %s]\n", view->name);
+ fprintf(fp, "[View: %s (Cache: %s)]\n", view->name,
+ dns_cache_getname(view->cache));
+ if (dns_view_iscacheshared(view)) {
+ /*
+ * Avoid dumping redundant statistics when the cache is
+ * shared.
+ */
+ continue;
+ }
dns_rdatasetstats_dump(cachestats, rdatasetstats_dump, &dumparg,
0);
}
diff --git a/contrib/bind9/bin/named/tkeyconf.c b/contrib/bind9/bin/named/tkeyconf.c
index 7344978..66c2d7f 100644
--- a/contrib/bind9/bin/named/tkeyconf.c
+++ b/contrib/bind9/bin/named/tkeyconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tkeyconf.c,v 1.29 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: tkeyconf.c,v 1.33 2010-12-20 23:47:20 tbox Exp $ */
/*! \file */
@@ -77,8 +77,7 @@ ns_tkeyctx_fromconfig(const cfg_obj_t *options, isc_mem_t *mctx,
isc_buffer_add(&b, strlen(s));
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- RETERR(dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL));
+ RETERR(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
type = DST_TYPE_PUBLIC|DST_TYPE_PRIVATE|DST_TYPE_KEY;
RETERR(dst_key_fromfile(name, (dns_keytag_t) n, DNS_KEYALG_DH,
type, NULL, mctx, &tctx->dhkey));
@@ -92,8 +91,7 @@ ns_tkeyctx_fromconfig(const cfg_obj_t *options, isc_mem_t *mctx,
isc_buffer_add(&b, strlen(s));
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- RETERR(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE,
- NULL));
+ RETERR(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
tctx->domain = isc_mem_get(mctx, sizeof(dns_name_t));
if (tctx->domain == NULL) {
result = ISC_R_NOMEMORY;
@@ -112,12 +110,22 @@ ns_tkeyctx_fromconfig(const cfg_obj_t *options, isc_mem_t *mctx,
isc_buffer_add(&b, strlen(s));
dns_fixedname_init(&fname);
name = dns_fixedname_name(&fname);
- RETERR(dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE,
- NULL));
- RETERR(dst_gssapi_acquirecred(name, ISC_FALSE,
- &tctx->gsscred));
+ RETERR(dns_name_fromtext(name, &b, dns_rootname, 0, NULL));
+ RETERR(dst_gssapi_acquirecred(name, ISC_FALSE, &tctx->gsscred));
}
+ obj = NULL;
+ result = cfg_map_get(options, "tkey-gssapi-keytab", &obj);
+ if (result == ISC_R_SUCCESS) {
+ s = cfg_obj_asstring(obj);
+ tctx->gssapi_keytab = isc_mem_strdup(mctx, s);
+ if (tctx->gssapi_keytab == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto failure;
+ }
+ }
+
+
*tctxp = tctx;
return (ISC_R_SUCCESS);
diff --git a/contrib/bind9/bin/named/tsigconf.c b/contrib/bind9/bin/named/tsigconf.c
index e90a86b..19e8d38 100644
--- a/contrib/bind9/bin/named/tsigconf.c
+++ b/contrib/bind9/bin/named/tsigconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsigconf.c,v 1.30 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: tsigconf.c,v 1.35 2011-01-11 23:47:12 tbox Exp $ */
/*! \file */
@@ -82,7 +82,7 @@ add_initial_keys(const cfg_obj_t *list, dns_tsig_keyring_t *ring,
isc_buffer_add(&keynamesrc, strlen(keyid));
isc_buffer_init(&keynamebuf, keynamedata, sizeof(keynamedata));
ret = dns_name_fromtext(&keyname, &keynamesrc, dns_rootname,
- ISC_TRUE, &keynamebuf);
+ DNS_NAME_DOWNCASE, &keynamebuf);
if (ret != ISC_R_SUCCESS)
goto failure;
@@ -149,6 +149,8 @@ ns_tsigkeyring_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
isc_result_t result;
int i;
+ REQUIRE(ringp != NULL && *ringp == NULL);
+
i = 0;
if (config != NULL)
maps[i++] = config;
@@ -176,6 +178,6 @@ ns_tsigkeyring_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
return (ISC_R_SUCCESS);
failure:
- dns_tsigkeyring_destroy(&ring);
+ dns_tsigkeyring_detach(&ring);
return (result);
}
diff --git a/contrib/bind9/bin/named/unix/Makefile.in b/contrib/bind9/bin/named/unix/Makefile.in
index 502db25..ca92c49 100644
--- a/contrib/bind9/bin/named/unix/Makefile.in
+++ b/contrib/bind9/bin/named/unix/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1999-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.10 2007-06-19 23:46:59 tbox Exp $
+# $Id: Makefile.in,v 1.13 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/bin/named/unix/include/named/os.h b/contrib/bind9/bin/named/unix/include/named/os.h
index 0a84608..c2768f4 100644
--- a/contrib/bind9/bin/named/unix/include/named/os.h
+++ b/contrib/bind9/bin/named/unix/include/named/os.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.h,v 1.29 2008-10-24 01:44:48 tbox Exp $ */
+/* $Id: os.h,v 1.31 2009-08-05 23:47:43 tbox Exp $ */
#ifndef NS_OS_H
#define NS_OS_H 1
@@ -51,8 +51,12 @@ ns_os_adjustnofile(void);
void
ns_os_minprivs(void);
+FILE *
+ns_os_openfile(const char *filename, mode_t mode, isc_boolean_t switch_user);
+
void
ns_os_writepidfile(const char *filename, isc_boolean_t first_time);
+
void
ns_os_shutdown(void);
diff --git a/contrib/bind9/bin/named/unix/os.c b/contrib/bind9/bin/named/unix/os.c
index 3f07784..53e9e45 100644
--- a/contrib/bind9/bin/named/unix/os.c
+++ b/contrib/bind9/bin/named/unix/os.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.c,v 1.89.12.5 2009-03-02 03:03:54 marka Exp $ */
+/* $Id: os.c,v 1.104 2010-11-17 23:47:08 tbox Exp $ */
/*! \file */
@@ -291,6 +291,12 @@ linux_initialprivs(void) {
*/
SET_CAP(CAP_SYS_RESOURCE);
+ /*
+ * We need to be able to set the ownership of the containing
+ * directory of the pid file when we create it.
+ */
+ SET_CAP(CAP_CHOWN);
+
linux_setcaps(caps);
#ifdef HAVE_LIBCAP
@@ -631,7 +637,7 @@ ns_os_minprivs(void) {
}
static int
-safe_open(const char *filename, isc_boolean_t append) {
+safe_open(const char *filename, mode_t mode, isc_boolean_t append) {
int fd;
struct stat sb;
@@ -644,13 +650,11 @@ safe_open(const char *filename, isc_boolean_t append) {
}
if (append)
- fd = open(filename, O_WRONLY|O_CREAT|O_APPEND,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ fd = open(filename, O_WRONLY|O_CREAT|O_APPEND, mode);
else {
if (unlink(filename) < 0 && errno != ENOENT)
return (-1);
- fd = open(filename, O_WRONLY|O_CREAT|O_EXCL,
- S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ fd = open(filename, O_WRONLY|O_CREAT|O_EXCL, mode);
}
return (fd);
}
@@ -686,6 +690,15 @@ mkdirpath(char *filename, void (*report)(const char *, ...)) {
}
if (mkdirpath(filename, report) == -1)
goto error;
+ /*
+ * Handle "//", "/./" and "/../" in path.
+ */
+ if (!strcmp(slash + 1, "") ||
+ !strcmp(slash + 1, ".") ||
+ !strcmp(slash + 1, "..")) {
+ *slash = '/';
+ return (0);
+ }
mode = S_IRUSR | S_IWUSR | S_IXUSR; /* u=rwx */
mode |= S_IRGRP | S_IXGRP; /* g=rx */
mode |= S_IROTH | S_IXOTH; /* o=rx */
@@ -695,6 +708,13 @@ mkdirpath(char *filename, void (*report)(const char *, ...)) {
strbuf);
goto error;
}
+ if (runas_pw != NULL &&
+ chown(filename, runas_pw->pw_uid,
+ runas_pw->pw_gid) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ (*report)("couldn't chown '%s': %s", filename,
+ strbuf);
+ }
}
*slash = '/';
}
@@ -705,11 +725,127 @@ mkdirpath(char *filename, void (*report)(const char *, ...)) {
return (-1);
}
+static void
+setperms(uid_t uid, gid_t gid) {
+ char strbuf[ISC_STRERRORSIZE];
+#if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID)
+ gid_t oldgid, tmpg;
+#endif
+#if !defined(HAVE_SETEUID) && defined(HAVE_SETRESUID)
+ uid_t olduid, tmpu;
+#endif
+#if defined(HAVE_SETEGID)
+ if (getegid() != gid && setegid(gid) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective gid to %ld: %s",
+ (long)gid, strbuf);
+ }
+#elif defined(HAVE_SETRESGID)
+ if (getresgid(&tmpg, &oldgid, &tmpg) == -1 || oldgid != gid) {
+ if (setresgid(-1, gid, -1) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective "
+ "gid to %d: %s", gid, strbuf);
+ }
+ }
+#endif
+
+#if defined(HAVE_SETEUID)
+ if (geteuid() != uid && seteuid(uid) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective uid to %ld: %s",
+ (long)uid, strbuf);
+ }
+#elif defined(HAVE_SETRESUID)
+ if (getresuid(&tmpu, &olduid, &tmpu) == -1 || olduid != uid) {
+ if (setresuid(-1, uid, -1) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("unable to set effective "
+ "uid to %d: %s", uid, strbuf);
+ }
+ }
+#endif
+}
+
+FILE *
+ns_os_openfile(const char *filename, mode_t mode, isc_boolean_t switch_user) {
+ char strbuf[ISC_STRERRORSIZE], *f;
+ FILE *fp;
+ int fd;
+
+ /*
+ * Make the containing directory if it doesn't exist.
+ */
+ f = strdup(filename);
+ if (f == NULL) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("couldn't strdup() '%s': %s",
+ filename, strbuf);
+ return (NULL);
+ }
+ if (mkdirpath(f, ns_main_earlywarning) == -1) {
+ free(f);
+ return (NULL);
+ }
+ free(f);
+
+ if (switch_user && runas_pw != NULL) {
+ /* Set UID/GID to the one we'll be running with eventually */
+ setperms(runas_pw->pw_uid, runas_pw->pw_gid);
+
+ fd = safe_open(filename, mode, ISC_FALSE);
+
+#ifndef HAVE_LINUXTHREADS
+ /* Restore UID/GID to root */
+ setperms(0, 0);
+#endif /* HAVE_LINUXTHREADS */
+
+ if (fd == -1) {
+#ifndef HAVE_LINUXTHREADS
+ fd = safe_open(filename, mode, ISC_FALSE);
+ if (fd != -1) {
+ ns_main_earlywarning("Required root "
+ "permissions to open "
+ "'%s'.", filename);
+ } else {
+ ns_main_earlywarning("Could not open "
+ "'%s'.", filename);
+ }
+ ns_main_earlywarning("Please check file and "
+ "directory permissions "
+ "or reconfigure the filename.");
+#else /* HAVE_LINUXTHREADS */
+ ns_main_earlywarning("Could not open "
+ "'%s'.", filename);
+ ns_main_earlywarning("Please check file and "
+ "directory permissions "
+ "or reconfigure the filename.");
+#endif /* HAVE_LINUXTHREADS */
+ }
+ } else {
+ fd = safe_open(filename, mode, ISC_FALSE);
+ }
+
+ if (fd < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("could not open file '%s': %s",
+ filename, strbuf);
+ return (NULL);
+ }
+
+ fp = fdopen(fd, "w");
+ if (fp == NULL) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ns_main_earlywarning("could not fdopen() file '%s': %s",
+ filename, strbuf);
+ }
+
+ return (fp);
+}
+
void
ns_os_writepidfile(const char *filename, isc_boolean_t first_time) {
- int fd;
FILE *lockfile;
- size_t len;
pid_t pid;
char strbuf[ISC_STRERRORSIZE];
void (*report)(const char *, ...);
@@ -725,40 +861,16 @@ ns_os_writepidfile(const char *filename, isc_boolean_t first_time) {
if (filename == NULL)
return;
- len = strlen(filename);
- pidfile = malloc(len + 1);
+ pidfile = strdup(filename);
if (pidfile == NULL) {
isc__strerror(errno, strbuf, sizeof(strbuf));
- (*report)("couldn't malloc '%s': %s", filename, strbuf);
+ (*report)("couldn't strdup() '%s': %s", filename, strbuf);
return;
}
- /* This is safe. */
- strcpy(pidfile, filename);
-
- /*
- * Make the containing directory if it doesn't exist.
- */
- if (mkdirpath(pidfile, report) == -1) {
- free(pidfile);
- pidfile = NULL;
- return;
- }
-
- fd = safe_open(filename, ISC_FALSE);
- if (fd < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- (*report)("couldn't open pid file '%s': %s", filename, strbuf);
- free(pidfile);
- pidfile = NULL;
- return;
- }
- lockfile = fdopen(fd, "w");
+ lockfile = ns_os_openfile(filename, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,
+ first_time);
if (lockfile == NULL) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- (*report)("could not fdopen() pid file '%s': %s",
- filename, strbuf);
- (void)close(fd);
cleanup_pidfile();
return;
}
diff --git a/contrib/bind9/bin/named/update.c b/contrib/bind9/bin/named/update.c
index 1504a44..eb1ed1d 100644
--- a/contrib/bind9/bin/named/update.c
+++ b/contrib/bind9/bin/named/update.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: update.c,v 1.151.12.11 2010-02-26 23:48:43 tbox Exp $ */
+/* $Id: update.c,v 1.186.16.1.2.1 2011-06-02 23:47:28 tbox Exp $ */
#include <config.h>
@@ -38,6 +38,7 @@
#include <dns/message.h>
#include <dns/nsec.h>
#include <dns/nsec3.h>
+#include <dns/private.h>
#include <dns/rdataclass.h>
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
@@ -45,6 +46,7 @@
#include <dns/rdatatype.h>
#include <dns/soa.h>
#include <dns/ssu.h>
+#include <dns/tsig.h>
#include <dns/view.h>
#include <dns/zone.h>
#include <dns/zt.h>
@@ -281,6 +283,47 @@ inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
}
/*%
+ * Check if we could have queried for the contents of this zone or
+ * if the zone is potentially updateable.
+ * If the zone can potentially be updated and the check failed then
+ * log a error otherwise we log a informational message.
+ */
+static isc_result_t
+checkqueryacl(ns_client_t *client, dns_acl_t *queryacl, dns_name_t *zonename,
+ dns_acl_t *updateacl, dns_ssutable_t *ssutable)
+{
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char classbuf[DNS_RDATACLASS_FORMATSIZE];
+ int level;
+ isc_result_t result;
+
+ result = ns_client_checkaclsilent(client, NULL, queryacl, ISC_TRUE);
+ if (result != ISC_R_SUCCESS) {
+ dns_name_format(zonename, namebuf, sizeof(namebuf));
+ dns_rdataclass_format(client->view->rdclass, classbuf,
+ sizeof(classbuf));
+
+ level = (updateacl == NULL && ssutable == NULL) ?
+ ISC_LOG_INFO : ISC_LOG_ERROR;
+
+ ns_client_log(client, NS_LOGCATEGORY_UPDATE_SECURITY,
+ NS_LOGMODULE_UPDATE, level,
+ "update '%s/%s' denied due to allow-query",
+ namebuf, classbuf);
+ } else if (updateacl == NULL && ssutable == NULL) {
+ dns_name_format(zonename, namebuf, sizeof(namebuf));
+ dns_rdataclass_format(client->view->rdclass, classbuf,
+ sizeof(classbuf));
+
+ result = DNS_R_REFUSED;
+ ns_client_log(client, NS_LOGCATEGORY_UPDATE_SECURITY,
+ NS_LOGMODULE_UPDATE, ISC_LOG_INFO,
+ "update '%s/%s' denied", namebuf, classbuf);
+ }
+ return (result);
+}
+
+/*%
* Override the default acl logging when checking whether a client
* can update the zone or whether we can forward the request to the
* master based on IP address.
@@ -809,6 +852,9 @@ typedef struct {
/* The ssu table to check against. */
dns_ssutable_t *table;
+
+ /* the key used for TKEY requests */
+ dst_key_t *key;
} ssu_check_t;
static isc_result_t
@@ -825,14 +871,14 @@ ssu_checkrule(void *data, dns_rdataset_t *rrset) {
return (ISC_R_SUCCESS);
result = dns_ssutable_checkrules(ssuinfo->table, ssuinfo->signer,
ssuinfo->name, ssuinfo->tcpaddr,
- rrset->type);
+ rrset->type, ssuinfo->key);
return (result == ISC_TRUE ? ISC_R_SUCCESS : ISC_R_FAILURE);
}
static isc_boolean_t
ssu_checkall(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_ssutable_t *ssutable, dns_name_t *signer,
- isc_netaddr_t *tcpaddr)
+ isc_netaddr_t *tcpaddr, dst_key_t *key)
{
isc_result_t result;
ssu_check_t ssuinfo;
@@ -841,6 +887,7 @@ ssu_checkall(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
ssuinfo.table = ssutable;
ssuinfo.signer = signer;
ssuinfo.tcpaddr = tcpaddr;
+ ssuinfo.key = key;
result = foreach_rrset(db, ver, name, ssu_checkrule, &ssuinfo);
return (ISC_TF(result == ISC_R_SUCCESS));
}
@@ -889,7 +936,7 @@ temp_check_rrset(dns_difftuple_t *a, dns_difftuple_t *b) {
b->op == DNS_DIFFOP_EXISTS);
INSIST(a->rdata.type == b->rdata.type);
INSIST(dns_name_equal(&a->name, &b->name));
- if (dns_rdata_compare(&a->rdata, &b->rdata) != 0)
+ if (dns_rdata_casecompare(&a->rdata, &b->rdata) != 0)
return (DNS_R_NXRRSET);
a = ISC_LIST_NEXT(a, link);
b = ISC_LIST_NEXT(b, link);
@@ -917,7 +964,7 @@ temp_order(const void *av, const void *bv) {
r = (b->rdata.type - a->rdata.type);
if (r != 0)
return (r);
- r = dns_rdata_compare(&a->rdata, &b->rdata);
+ r = dns_rdata_casecompare(&a->rdata, &b->rdata);
return (r);
}
@@ -1146,7 +1193,7 @@ rr_equal_p(dns_rdata_t *update_rr, dns_rdata_t *db_rr) {
* dns_rdata_equal() (that used dns_name_equal()), since it
* would be faster. Not a priority.
*/
- return (dns_rdata_compare(update_rr, db_rr) == 0 ?
+ return (dns_rdata_casecompare(update_rr, db_rr) == 0 ?
ISC_TRUE : ISC_FALSE);
}
@@ -1208,11 +1255,10 @@ replaces_p(dns_rdata_t *update_rr, dns_rdata_t *db_rr) {
return (ISC_FALSE);
INSIST(db_rr->length >= 4 && update_rr->length >= 4);
/*
- * Replace records added in this UPDATE request.
+ * Replace NSEC3PARAM records that only differ by the
+ * flags field.
*/
if (db_rr->data[0] == update_rr->data[0] &&
- db_rr->data[1] & DNS_NSEC3FLAG_UPDATE &&
- update_rr->data[1] & DNS_NSEC3FLAG_UPDATE &&
memcmp(db_rr->data+2, update_rr->data+2,
update_rr->length - 2) == 0)
return (ISC_TRUE);
@@ -1293,7 +1339,7 @@ add_rr_prepare_action(void *data, rr_t *rr) {
* If the update RR is a "duplicate" of the update RR,
* the update should be silently ignored.
*/
- equal = ISC_TF(dns_rdata_compare(&rr->rdata, ctx->update_rr) == 0);
+ equal = ISC_TF(dns_rdata_casecompare(&rr->rdata, ctx->update_rr) == 0);
if (equal && rr->ttl == ctx->update_rr_ttl) {
ctx->ignore_add = ISC_TRUE;
return (ISC_R_SUCCESS);
@@ -1717,35 +1763,6 @@ next_active(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
return (result);
}
-static isc_boolean_t
-has_opt_bit(dns_db_t *db, dns_dbversion_t *version, dns_dbnode_t *node) {
- isc_result_t result;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdataset_t rdataset;
- isc_boolean_t has_bit = ISC_FALSE;
-
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findrdataset(db, node, version, dns_rdatatype_nsec,
- dns_rdatatype_none, 0, &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- dns_rdataset_current(&rdataset, &rdata);
- has_bit = dns_nsec_typepresent(&rdata, dns_rdatatype_opt);
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- return (has_bit);
-}
-
-static void
-set_bit(unsigned char *array, unsigned int index) {
- unsigned int shift, bit;
-
- shift = 7 - (index % 8);
- bit = 1 << shift;
-
- array[index / 8] |= bit;
-}
-
/*%
* Add a NSEC record for "name", recording the change in "diff".
* The existing NSEC is removed.
@@ -1777,24 +1794,6 @@ add_nsec(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
dns_rdata_init(&rdata);
CHECK(dns_nsec_buildrdata(db, ver, node, target, buffer, &rdata));
- /*
- * Preserve the status of the OPT bit in the origin's NSEC record.
- */
- if (dns_name_equal(dns_db_origin(db), name) &&
- has_opt_bit(db, ver, node))
- {
- isc_region_t region;
- dns_name_t next;
-
- dns_name_init(&next, NULL);
- dns_rdata_toregion(&rdata, &region);
- dns_name_fromregion(&next, &region);
- isc_region_consume(&region, next.length);
- INSIST(region.length > (2 + dns_rdatatype_opt / 8) &&
- region.base[0] == 0 &&
- region.base[1] > dns_rdatatype_opt / 8);
- set_bit(region.base + 2, dns_rdatatype_opt);
- }
dns_db_detachnode(db, &node);
/*
@@ -1856,44 +1855,6 @@ find_zone_keys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
return (result);
}
-static isc_boolean_t
-ksk_sanity(dns_db_t *db, dns_dbversion_t *ver) {
- isc_boolean_t ret = ISC_FALSE;
- isc_boolean_t have_ksk = ISC_FALSE, have_nonksk = ISC_FALSE;
- isc_result_t result;
- dns_dbnode_t *node = NULL;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdata_dnskey_t dnskey;
-
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findnode(db, dns_db_origin(db), ISC_FALSE, &node));
- CHECK(dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey, 0, 0,
- &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- while (result == ISC_R_SUCCESS && (!have_ksk || !have_nonksk)) {
- dns_rdataset_current(&rdataset, &rdata);
- CHECK(dns_rdata_tostruct(&rdata, &dnskey, NULL));
- if ((dnskey.flags & (DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
- == DNS_KEYOWNER_ZONE) {
- if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0)
- have_ksk = ISC_TRUE;
- else
- have_nonksk = ISC_TRUE;
- }
- dns_rdata_reset(&rdata);
- result = dns_rdataset_next(&rdataset);
- }
- if (have_ksk && have_nonksk)
- ret = ISC_TRUE;
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- if (node != NULL)
- dns_db_detachnode(db, &node);
- return (ret);
-}
-
/*%
* Add RRSIG records for an RRset, recording the change in "diff".
*/
@@ -1902,7 +1863,7 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_name_t *name, dns_rdatatype_t type,
dns_diff_t *diff, dst_key_t **keys, unsigned int nkeys,
isc_stdtime_t inception, isc_stdtime_t expire,
- isc_boolean_t check_ksk)
+ isc_boolean_t check_ksk, isc_boolean_t keyset_kskonly)
{
isc_result_t result;
dns_dbnode_t *node = NULL;
@@ -1910,7 +1871,7 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_rdata_t sig_rdata = DNS_RDATA_INIT;
isc_buffer_t buffer;
unsigned char data[1024]; /* XXX */
- unsigned int i;
+ unsigned int i, j;
isc_boolean_t added_sig = ISC_FALSE;
isc_mem_t *mctx = client->mctx;
@@ -1926,13 +1887,52 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
(isc_stdtime_t) 0, &rdataset, NULL));
dns_db_detachnode(db, &node);
+#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
+#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0)
+#define ALG(x) dst_key_alg(x)
+
+ /*
+ * If we are honoring KSK flags then we need to check that we
+ * have both KSK and non-KSK keys that are not revoked per
+ * algorithm.
+ */
for (i = 0; i < nkeys; i++) {
+ isc_boolean_t both = ISC_FALSE;
- if (check_ksk && type != dns_rdatatype_dnskey &&
- (dst_key_flags(keys[i]) & DNS_KEYFLAG_KSK) != 0)
+ if (!dst_key_isprivate(keys[i]))
continue;
- if (!dst_key_isprivate(keys[i]))
+ if (check_ksk && !REVOKE(keys[i])) {
+ isc_boolean_t have_ksk, have_nonksk;
+ if (KSK(keys[i])) {
+ have_ksk = ISC_TRUE;
+ have_nonksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_nonksk = ISC_TRUE;
+ }
+ for (j = 0; j < nkeys; j++) {
+ if (j == i || ALG(keys[i]) != ALG(keys[j]))
+ continue;
+ if (REVOKE(keys[j]))
+ continue;
+ if (KSK(keys[j]))
+ have_ksk = ISC_TRUE;
+ else
+ have_nonksk = ISC_TRUE;
+ both = have_ksk && have_nonksk;
+ if (both)
+ break;
+ }
+ }
+
+ if (both) {
+ if (type == dns_rdatatype_dnskey) {
+ if (!KSK(keys[i]) && keyset_kskonly)
+ continue;
+ } else if (KSK(keys[i]))
+ continue;
+ } else if (REVOKE(keys[i]) && type != dns_rdatatype_dnskey)
continue;
/* Calculate the signature, creating a RRSIG RDATA. */
@@ -1950,7 +1950,7 @@ add_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
}
if (!added_sig) {
update_log(client, zone, ISC_LOG_ERROR,
- "found no private keys, "
+ "found no active private keys, "
"unable to generate any signatures");
result = ISC_R_NOTFOUND;
}
@@ -2044,7 +2044,7 @@ add_exposed_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_name_t *name, isc_boolean_t cut,
dns_diff_t *diff, dst_key_t **keys, unsigned int nkeys,
isc_stdtime_t inception, isc_stdtime_t expire,
- isc_boolean_t check_ksk)
+ isc_boolean_t check_ksk, isc_boolean_t keyset_kskonly)
{
isc_result_t result;
dns_dbnode_t *node;
@@ -2090,7 +2090,8 @@ add_exposed_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
if (flag)
continue;;
result = add_sigs(client, zone, db, ver, name, type, diff,
- keys, nkeys, inception, expire, check_ksk);
+ keys, nkeys, inception, expire,
+ check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS)
goto cleanup_iterator;
}
@@ -2120,8 +2121,7 @@ add_exposed_sigs(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
static isc_result_t
update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *oldver, dns_dbversion_t *newver,
- dns_diff_t *diff, isc_uint32_t sigvalidityinterval,
- isc_boolean_t *deleted_zsk)
+ dns_diff_t *diff, isc_uint32_t sigvalidityinterval)
{
isc_result_t result;
dns_difftuple_t *t;
@@ -2130,7 +2130,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_diff_t sig_diff;
dns_diff_t nsec_diff;
dns_diff_t nsec_mindiff;
- isc_boolean_t flag;
+ isc_boolean_t flag, build_nsec, build_nsec3;
dst_key_t *zone_keys[MAXZONEKEYS];
unsigned int nkeys = 0;
unsigned int i;
@@ -2140,9 +2140,10 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_t rdataset;
dns_dbnode_t *node = NULL;
- isc_boolean_t check_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly;
isc_boolean_t unsecure;
isc_boolean_t cut;
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
dns_diff_init(client->mctx, &diffnames);
dns_diff_init(client->mctx, &affected);
@@ -2172,27 +2173,8 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
*/
check_ksk = ISC_TF((dns_zone_getoptions(zone) &
DNS_ZONEOPT_UPDATECHECKKSK) != 0);
- /*
- * If we are not checking the ZSK flag then all DNSKEY's are
- * already signing all RRsets so we don't need to trigger special
- * changes.
- */
- if (*deleted_zsk && (!check_ksk || !ksk_sanity(db, oldver)))
- *deleted_zsk = ISC_FALSE;
-
- if (check_ksk) {
- check_ksk = ksk_sanity(db, newver);
- if (!check_ksk && ksk_sanity(db, oldver))
- update_log(client, zone, ISC_LOG_WARNING,
- "disabling update-check-ksk");
- }
-
- /*
- * If we have deleted a ZSK and we we still have some ZSK's
- * we don't need to convert the KSK's to a ZSK's.
- */
- if (*deleted_zsk && check_ksk)
- *deleted_zsk = ISC_FALSE;
+ keyset_kskonly = ISC_TF((dns_zone_getoptions(zone) &
+ DNS_ZONEOPT_DNSKEYKSKONLY) != 0);
/*
* Get the NSEC/NSEC3 TTL from the SOA MINIMUM field.
@@ -2259,7 +2241,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(add_sigs(client, zone, db, newver, name,
type, &sig_diff, zone_keys,
nkeys, inception, expire,
- check_ksk));
+ check_ksk, keyset_kskonly));
}
skip:
/* Skip any other updates to the same RRset. */
@@ -2289,12 +2271,11 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
"removed any orphaned NSEC records");
/*
- * If we don't have a NSEC record at the origin then we need to
- * update the NSEC3 records.
+ * See if we need to build NSEC or NSEC3 chains.
*/
- CHECK(rrset_exists(db, newver, dns_db_origin(db), dns_rdatatype_nsec,
- 0, &flag));
- if (!flag)
+ CHECK(dns_private_chains(db, newver, privatetype, &build_nsec,
+ &build_nsec3));
+ if (!build_nsec)
goto update_nsec3;
update_log(client, zone, ISC_LOG_DEBUG(3), "rebuilding NSEC chain");
@@ -2398,16 +2379,25 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_rdatatype_any, 0, NULL, diff));
} else {
/*
- * This name is not obscured. It should have a NSEC.
+ * This name is not obscured. It needs to have a
+ * NSEC unless it is the at the origin, in which
+ * case it should already exist if there is a complete
+ * NSEC chain and if there isn't a complete NSEC chain
+ * we don't want to add one as that would signal that
+ * there is a complete NSEC chain.
*/
- CHECK(rrset_exists(db, newver, name,
- dns_rdatatype_nsec, 0, &flag));
- if (! flag)
- CHECK(add_placeholder_nsec(db, newver, name,
- diff));
+ if (!dns_name_equal(name, dns_db_origin(db))) {
+ CHECK(rrset_exists(db, newver, name,
+ dns_rdatatype_nsec, 0,
+ &flag));
+ if (!flag)
+ CHECK(add_placeholder_nsec(db, newver,
+ name, diff));
+ }
CHECK(add_exposed_sigs(client, zone, db, newver, name,
cut, diff, zone_keys, nkeys,
- inception, expire, check_ksk));
+ inception, expire, check_ksk,
+ keyset_kskonly));
}
}
@@ -2469,7 +2459,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(add_sigs(client, zone, db, newver, &t->name,
dns_rdatatype_nsec, &sig_diff,
zone_keys, nkeys, inception, expire,
- check_ksk));
+ check_ksk, keyset_kskonly));
} else {
INSIST(0);
}
@@ -2491,13 +2481,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
INSIST(ISC_LIST_EMPTY(nsec_diff.tuples));
INSIST(ISC_LIST_EMPTY(nsec_mindiff.tuples));
- /*
- * Check if we have any active NSEC3 chains by looking for a
- * NSEC3PARAM RRset.
- */
- CHECK(rrset_exists(db, newver, dns_db_origin(db),
- dns_rdatatype_nsec3param, 0, &flag));
- if (!flag) {
+ if (!build_nsec3) {
update_log(client, zone, ISC_LOG_DEBUG(3),
"no NSEC3 chains to rebuild");
goto failure;
@@ -2521,6 +2505,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
isc_boolean_t ns_existed, dname_existed;
isc_boolean_t ns_exists, dname_exists;
+ isc_boolean_t exists, existed;
if (t->rdata.type == dns_rdatatype_nsec ||
t->rdata.type == dns_rdatatype_rrsig) {
@@ -2539,7 +2524,9 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(rrset_exists(db, newver, name, dns_rdatatype_dname, 0,
&dname_exists));
- if ((ns_exists || dname_exists) == (ns_existed || dname_existed))
+ exists = ns_exists || dname_exists;
+ existed = ns_existed || dname_existed;
+ if (exists == existed)
goto nextname;
/*
* There was a delegation change. Mark all subdomains
@@ -2563,14 +2550,16 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
if (!flag) {
CHECK(delete_if(rrsig_p, db, newver, name,
dns_rdatatype_any, 0, NULL, diff));
- CHECK(dns_nsec3_delnsec3s(db, newver, name,
- &nsec_diff));
+ CHECK(dns_nsec3_delnsec3sx(db, newver, name,
+ privatetype, &nsec_diff));
} else {
CHECK(add_exposed_sigs(client, zone, db, newver, name,
cut, diff, zone_keys, nkeys,
- inception, expire, check_ksk));
- CHECK(dns_nsec3_addnsec3s(db, newver, name, nsecttl,
- unsecure, &nsec_diff));
+ inception, expire, check_ksk,
+ keyset_kskonly));
+ CHECK(dns_nsec3_addnsec3sx(db, newver, name, nsecttl,
+ unsecure, privatetype,
+ &nsec_diff));
}
}
@@ -2601,7 +2590,8 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
CHECK(add_sigs(client, zone, db, newver, &t->name,
dns_rdatatype_nsec3,
&sig_diff, zone_keys, nkeys,
- inception, expire, check_ksk));
+ inception, expire, check_ksk,
+ keyset_kskonly));
} else {
INSIST(0);
}
@@ -2734,6 +2724,7 @@ ns_update_start(ns_client_t *client, isc_result_t sigresult) {
switch(dns_zone_gettype(zone)) {
case dns_zone_master:
+ case dns_zone_dlz:
/*
* We can now fail due to a bad signature as we now know
* that we are the master.
@@ -2943,7 +2934,7 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
result = dns_rdataset_next(&rdataset)) {
dns_rdata_t myrdata = DNS_RDATA_INIT;
dns_rdataset_current(&rdataset, &myrdata);
- if (!dns_rdata_compare(&myrdata, rdata))
+ if (!dns_rdata_casecompare(&myrdata, rdata))
break;
}
dns_rdataset_disassociate(&rdataset);
@@ -2961,7 +2952,9 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
}
static isc_result_t
-get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
+get_iterations(dns_db_t *db, dns_dbversion_t *ver, dns_rdatatype_t privatetype,
+ unsigned int *iterationsp)
+{
dns_dbnode_t *node = NULL;
dns_rdata_nsec3param_t nsec3param;
dns_rdataset_t rdataset;
@@ -2975,7 +2968,33 @@ get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
return (result);
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
0, (isc_stdtime_t) 0, &rdataset, NULL);
- dns_db_detachnode(db, &node);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &rdata);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
+ if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
+ continue;
+ if (nsec3param.iterations > iterations)
+ iterations = nsec3param.iterations;
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (privatetype == 0)
+ goto success;
+
+ result = dns_db_findrdataset(db, node, ver, privatetype,
+ 0, (isc_stdtime_t) 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND)
goto success;
if (result != ISC_R_SUCCESS)
@@ -2984,8 +3003,14 @@ get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t private = DNS_RDATA_INIT;
dns_rdata_t rdata = DNS_RDATA_INIT;
+
dns_rdataset_current(&rdataset, &rdata);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
continue;
@@ -3000,6 +3025,8 @@ get_iterations(dns_db_t *db, dns_dbversion_t *ver, unsigned int *iterationsp) {
result = ISC_R_SUCCESS;
failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
return (result);
@@ -3013,77 +3040,83 @@ static isc_result_t
check_dnssec(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_dbversion_t *ver, dns_diff_t *diff)
{
- dns_diff_t temp_diff;
- dns_diffop_t op;
- dns_difftuple_t *tuple, *newtuple = NULL, *next;
- isc_boolean_t flag;
+ dns_difftuple_t *tuple;
+ isc_boolean_t nseconly = ISC_FALSE, nsec3 = ISC_FALSE;
isc_result_t result;
unsigned int iterations = 0, max;
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
- dns_diff_init(diff->mctx, &temp_diff);
-
- CHECK(dns_nsec_nseconly(db, ver, &flag));
+ /* Scan the tuples for an NSEC-only DNSKEY or an NSEC3PARAM */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ if (tuple->op != DNS_DIFFOP_ADD)
+ continue;
- if (flag)
- CHECK(dns_nsec3_active(db, ver, ISC_FALSE, &flag));
- if (flag) {
- update_log(client, zone, ISC_LOG_WARNING,
- "NSEC only DNSKEYs and NSEC3 chains not allowed");
- } else {
- CHECK(get_iterations(db, ver, &iterations));
- CHECK(dns_nsec3_maxiterations(db, ver, client->mctx, &max));
- if (max != 0 && iterations > max) {
- flag = ISC_TRUE;
- update_log(client, zone, ISC_LOG_WARNING,
- "too many NSEC3 iterations (%u) for "
- "weakest DNSKEY (%u)", iterations, max);
+ if (tuple->rdata.type == dns_rdatatype_dnskey) {
+ isc_uint8_t alg;
+ alg = tuple->rdata.data[3];
+ if (alg == DST_ALG_RSAMD5 || alg == DST_ALG_RSASHA1 ||
+ alg == DST_ALG_DSA || alg == DST_ALG_ECC) {
+ nseconly = ISC_TRUE;
+ break;
+ }
+ } else if (tuple->rdata.type == dns_rdatatype_nsec3param) {
+ nsec3 = ISC_TRUE;
+ break;
}
}
- if (flag) {
- for (tuple = ISC_LIST_HEAD(diff->tuples);
- tuple != NULL;
- tuple = next) {
- next = ISC_LIST_NEXT(tuple, link);
- if (tuple->rdata.type != dns_rdatatype_dnskey &&
- tuple->rdata.type != dns_rdatatype_nsec3param)
- continue;
- op = (tuple->op == DNS_DIFFOP_DEL) ?
- DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
- CHECK(dns_difftuple_create(temp_diff.mctx, op,
- &tuple->name, tuple->ttl,
- &tuple->rdata, &newtuple));
- CHECK(do_one_tuple(&newtuple, db, ver, &temp_diff));
- INSIST(newtuple == NULL);
- }
- for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(temp_diff.tuples)) {
- ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
- dns_diff_appendminimal(diff, &tuple);
- }
+
+ /* Check existing DB for NSEC-only DNSKEY */
+ if (!nseconly)
+ CHECK(dns_nsec_nseconly(db, ver, &nseconly));
+
+ /* Check existing DB for NSEC3 */
+ if (!nsec3)
+ CHECK(dns_nsec3_activex(db, ver, ISC_FALSE,
+ privatetype, &nsec3));
+
+ /* Refuse to allow NSEC3 with NSEC-only keys */
+ if (nseconly && nsec3) {
+ update_log(client, zone, ISC_LOG_ERROR,
+ "NSEC only DNSKEYs and NSEC3 chains not allowed");
+ result = DNS_R_REFUSED;
+ goto failure;
}
+ /* Verify NSEC3 params */
+ CHECK(get_iterations(db, ver, privatetype, &iterations));
+ CHECK(dns_nsec3_maxiterations(db, ver, client->mctx, &max));
+ if (max != 0 && iterations > max) {
+ update_log(client, zone, ISC_LOG_ERROR,
+ "too many NSEC3 iterations (%u) for "
+ "weakest DNSKEY (%u)", iterations, max);
+ result = DNS_R_REFUSED;
+ goto failure;
+ }
failure:
- dns_diff_clear(&temp_diff);
return (result);
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
/*
* Delay NSEC3PARAM changes as they need to be applied to the whole zone.
*/
static isc_result_t
add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
- dns_name_t *name, dns_dbversion_t *ver, dns_diff_t *diff)
+ dns_dbversion_t *ver, dns_diff_t *diff)
{
isc_result_t result = ISC_R_SUCCESS;
dns_difftuple_t *tuple, *newtuple = NULL, *next;
dns_rdata_t rdata = DNS_RDATA_INIT;
- unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE + 1];
dns_diff_t temp_diff;
dns_diffop_t op;
isc_boolean_t flag;
+ dns_name_t *name = dns_zone_getorigin(zone);
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
+ isc_uint32_t ttl = 0;
+ isc_boolean_t ttl_good = ISC_FALSE;
update_log(client, zone, ISC_LOG_DEBUG(3),
"checking for NSEC3PARAM changes");
@@ -3106,55 +3139,143 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
ISC_LIST_APPEND(temp_diff.tuples, tuple, link);
}
+ /*
+ * Extract TTL changes pairs, we don't need to convert these to
+ * delayed changes.
+ */
for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
tuple != NULL; tuple = next) {
-
if (tuple->op == DNS_DIFFOP_ADD) {
+ if (!ttl_good) {
+ /*
+ * Any adds here will contain the final
+ * NSEC3PARAM RRset TTL.
+ */
+ ttl = tuple->ttl;
+ ttl_good = ISC_TRUE;
+ }
+ /*
+ * Walk the temp_diff list looking for the
+ * corresponding delete.
+ */
+ next = ISC_LIST_HEAD(temp_diff.tuples);
+ while (next != NULL) {
+ unsigned char *next_data = next->rdata.data;
+ unsigned char *tuple_data = tuple->rdata.data;
+ if (next->op == DNS_DIFFOP_DEL &&
+ next->rdata.length == tuple->rdata.length &&
+ !memcmp(next_data, tuple_data,
+ next->rdata.length)) {
+ ISC_LIST_UNLINK(temp_diff.tuples, next,
+ link);
+ ISC_LIST_APPEND(diff->tuples, next,
+ link);
+ break;
+ }
+ next = ISC_LIST_NEXT(next, link);
+ }
+ /*
+ * If we have not found a pair move onto the next
+ * tuple.
+ */
+ if (next == NULL) {
+ next = ISC_LIST_NEXT(tuple, link);
+ continue;
+ }
+ /*
+ * Find the next tuple to be processed before
+ * unlinking then complete moving the pair to 'diff'.
+ */
+ next = ISC_LIST_NEXT(tuple, link);
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ ISC_LIST_APPEND(diff->tuples, tuple, link);
+ } else
next = ISC_LIST_NEXT(tuple, link);
+ }
+
+ /*
+ * Preserve any ongoing changes from a BIND 9.6.x upgrade.
+ *
+ * Any NSEC3PARAM records with flags other than OPTOUT named
+ * in managing and should not be touched so revert such changes
+ * taking into account any TTL change of the NSEC3PARAM RRset.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL; tuple = next) {
+ next = ISC_LIST_NEXT(tuple, link);
+ if ((tuple->rdata.data[1] & ~DNS_NSEC3FLAG_OPTOUT) != 0) {
+ /*
+ * If we havn't had any adds then the tuple->ttl must
+ * be the original ttl and should be used for any
+ * future changes.
+ */
+ if (!ttl_good) {
+ ttl = tuple->ttl;
+ ttl_good = ISC_TRUE;
+ }
+ op = (tuple->op == DNS_DIFFOP_DEL) ?
+ DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
+ CHECK(dns_difftuple_create(diff->mctx, op, name,
+ ttl, &tuple->rdata,
+ &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, diff));
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ dns_diff_appendminimal(diff, &tuple);
+ }
+ }
+
+ /*
+ * We now have just the actual changes to the NSEC3PARAM RRset.
+ * Convert the adds to delayed adds and the deletions into delayed
+ * deletions.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL; tuple = next) {
+ /*
+ * If we havn't had any adds then the tuple->ttl must be the
+ * original ttl and should be used for any future changes.
+ */
+ if (!ttl_good) {
+ ttl = tuple->ttl;
+ ttl_good = ISC_TRUE;
+ }
+ if (tuple->op == DNS_DIFFOP_ADD) {
+ /*
+ * Look for any deletes which match this ADD ignoring
+ * OPTOUT. We don't need to explictly remove them as
+ * they will be removed a side effect of processing
+ * the add.
+ */
+ next = ISC_LIST_HEAD(temp_diff.tuples);
while (next != NULL) {
unsigned char *next_data = next->rdata.data;
unsigned char *tuple_data = tuple->rdata.data;
- if (next_data[0] != tuple_data[0] ||
- /* Ignore flags. */
+ if (next->op != DNS_DIFFOP_DEL ||
+ next->rdata.length != tuple->rdata.length ||
+ next_data[0] != tuple_data[0] ||
next_data[2] != tuple_data[2] ||
next_data[3] != tuple_data[3] ||
- next_data[4] != tuple_data[4] ||
- !memcmp(&next_data[5], &tuple_data[5],
- tuple_data[4])) {
+ memcmp(next_data + 4, tuple_data + 4,
+ tuple->rdata.length - 4)) {
next = ISC_LIST_NEXT(next, link);
continue;
}
- op = (next->op == DNS_DIFFOP_DEL) ?
- DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
- CHECK(dns_difftuple_create(diff->mctx, op,
- name, next->ttl,
- &next->rdata,
- &newtuple));
- CHECK(do_one_tuple(&newtuple, db, ver, diff));
ISC_LIST_UNLINK(temp_diff.tuples, next, link);
- dns_diff_appendminimal(diff, &next);
- next = ISC_LIST_NEXT(tuple, link);
+ ISC_LIST_APPEND(diff->tuples, next, link);
+ next = ISC_LIST_HEAD(temp_diff.tuples);
}
-
- INSIST(tuple->rdata.data[1] & DNS_NSEC3FLAG_UPDATE);
-
/*
* See if we already have a CREATE request in progress.
*/
- dns_rdata_clone(&tuple->rdata, &rdata);
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
- buf[1] |= DNS_NSEC3FLAG_CREATE;
- buf[1] &= ~DNS_NSEC3FLAG_UPDATE;
- rdata.data = buf;
-
+ dns_nsec3param_toprivate(&tuple->rdata, &rdata,
+ privatetype, buf, sizeof(buf));
+ buf[2] |= DNS_NSEC3FLAG_CREATE;
CHECK(rr_exists(db, ver, name, &rdata, &flag));
if (!flag) {
CHECK(dns_difftuple_create(diff->mctx,
DNS_DIFFOP_ADD,
- name, tuple->ttl,
- &rdata,
+ name, 0, &rdata,
&newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
}
@@ -3164,26 +3285,26 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
* otherwise indentical chain with a reversed
* OPTOUT state.
*/
- buf[1] ^= DNS_NSEC3FLAG_OPTOUT;
+ buf[2] ^= DNS_NSEC3FLAG_OPTOUT;
CHECK(rr_exists(db, ver, name, &rdata, &flag));
if (flag) {
CHECK(dns_difftuple_create(diff->mctx,
DNS_DIFFOP_DEL,
- name, tuple->ttl,
- &rdata,
+ name, 0, &rdata,
&newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
}
/*
- * Remove the temporary add record.
+ * Find the next tuple to be processed and remove the
+ * temporary add record.
*/
+ next = ISC_LIST_NEXT(tuple, link);
CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL,
- name, tuple->ttl,
- &tuple->rdata, &newtuple));
+ name, ttl, &tuple->rdata,
+ &newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
- next = ISC_LIST_NEXT(tuple, link);
ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
dns_diff_appendminimal(diff, &tuple);
dns_rdata_reset(&rdata);
@@ -3191,50 +3312,33 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
next = ISC_LIST_NEXT(tuple, link);
}
- /*
- * Reverse any pending changes.
- */
for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
tuple != NULL; tuple = next) {
- next = ISC_LIST_NEXT(tuple, link);
- if ((tuple->rdata.data[1] & ~DNS_NSEC3FLAG_OPTOUT) != 0) {
- op = (tuple->op == DNS_DIFFOP_DEL) ?
- DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
- CHECK(dns_difftuple_create(diff->mctx, op, name,
- tuple->ttl, &tuple->rdata,
- &newtuple));
- CHECK(do_one_tuple(&newtuple, db, ver, diff));
- ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
- dns_diff_appendminimal(diff, &tuple);
- }
- }
- /*
- * Convert deletions into delayed deletions.
- */
- for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
- tuple != NULL; tuple = next) {
+ INSIST(ttl_good);
+
next = ISC_LIST_NEXT(tuple, link);
/*
* See if we already have a REMOVE request in progress.
*/
- dns_rdata_clone(&tuple->rdata, &rdata);
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
- buf[1] |= DNS_NSEC3FLAG_REMOVE;
- rdata.data = buf;
+ dns_nsec3param_toprivate(&tuple->rdata, &rdata, privatetype,
+ buf, sizeof(buf));
+
+ buf[2] |= DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ if (!flag) {
+ buf[2] &= ~DNS_NSEC3FLAG_NONSEC;
+ CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ }
if (!flag) {
CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
- name, tuple->ttl, &rdata,
- &newtuple));
+ name, 0, &rdata, &newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
}
CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD, name,
- tuple->ttl, &tuple->rdata,
- &newtuple));
+ ttl, &tuple->rdata, &newtuple));
CHECK(do_one_tuple(&newtuple, db, ver, diff));
ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
dns_diff_appendminimal(diff, &tuple);
@@ -3246,17 +3350,75 @@ add_nsec3param_records(ns_client_t *client, dns_zone_t *zone, dns_db_t *db,
dns_diff_clear(&temp_diff);
return (result);
}
-#endif
+
+static isc_result_t
+rollback_private(dns_db_t *db, dns_rdatatype_t privatetype,
+ dns_dbversion_t *ver, dns_diff_t *diff)
+{
+ dns_diff_t temp_diff;
+ dns_diffop_t op;
+ dns_difftuple_t *tuple, *newtuple = NULL, *next;
+ dns_name_t *name = dns_db_origin(db);
+ isc_mem_t *mctx = diff->mctx;
+ isc_result_t result;
+
+ if (privatetype == 0)
+ return (ISC_R_SUCCESS);
+
+ dns_diff_init(mctx, &temp_diff);
+
+ /*
+ * Extract the changes to be rolled back.
+ */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL; tuple = next) {
+
+ next = ISC_LIST_NEXT(tuple, link);
+
+ if (tuple->rdata.type != privatetype ||
+ !dns_name_equal(name, &tuple->name))
+ continue;
+
+ /*
+ * Allow records which indicate that a zone has been
+ * signed with a DNSKEY to be be removed.
+ */
+ if (tuple->op == DNS_DIFFOP_DEL &&
+ tuple->rdata.length == 5 &&
+ tuple->rdata.data[0] != 0 &&
+ tuple->rdata.data[4] != 0)
+ continue;
+
+ ISC_LIST_UNLINK(diff->tuples, tuple, link);
+ ISC_LIST_PREPEND(temp_diff.tuples, tuple, link);
+ }
+
+ /*
+ * Rollback the changes.
+ */
+ while ((tuple = ISC_LIST_HEAD(temp_diff.tuples)) != NULL) {
+ op = (tuple->op == DNS_DIFFOP_DEL) ?
+ DNS_DIFFOP_ADD : DNS_DIFFOP_DEL;
+ CHECK(dns_difftuple_create(mctx, op, name, tuple->ttl,
+ &tuple->rdata, &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, &temp_diff));
+ }
+ result = ISC_R_SUCCESS;
+
+ failure:
+ dns_diff_clear(&temp_diff);
+ return (result);
+}
/*
* Add records to cause the delayed signing of the zone by added DNSKEY
* to remove the RRSIG records generated by a deleted DNSKEY.
*/
static isc_result_t
-add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
- dns_rdatatype_t privatetype, dns_diff_t *diff)
+add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype,
+ dns_dbversion_t *ver, dns_diff_t *diff)
{
- dns_difftuple_t *tuple, *newtuple = NULL;
+ dns_difftuple_t *tuple, *newtuple = NULL, *next;
dns_rdata_dnskey_t dnskey;
dns_rdata_t rdata = DNS_RDATA_INIT;
isc_boolean_t flag;
@@ -3264,13 +3426,82 @@ add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
isc_result_t result = ISC_R_SUCCESS;
isc_uint16_t keyid;
unsigned char buf[5];
+ dns_name_t *name = dns_db_origin(db);
+ dns_diff_t temp_diff;
+
+ dns_diff_init(diff->mctx, &temp_diff);
+ /*
+ * Extract the DNSKEY tuples from the list.
+ */
for (tuple = ISC_LIST_HEAD(diff->tuples);
- tuple != NULL;
- tuple = ISC_LIST_NEXT(tuple, link)) {
+ tuple != NULL; tuple = next) {
+
+ next = ISC_LIST_NEXT(tuple, link);
+
if (tuple->rdata.type != dns_rdatatype_dnskey)
continue;
+ ISC_LIST_UNLINK(diff->tuples, tuple, link);
+ ISC_LIST_APPEND(temp_diff.tuples, tuple, link);
+ }
+
+ /*
+ * Extract TTL changes pairs, we don't need signing records for these.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL; tuple = next) {
+ if (tuple->op == DNS_DIFFOP_ADD) {
+ /*
+ * Walk the temp_diff list looking for the
+ * corresponding delete.
+ */
+ next = ISC_LIST_HEAD(temp_diff.tuples);
+ while (next != NULL) {
+ unsigned char *next_data = next->rdata.data;
+ unsigned char *tuple_data = tuple->rdata.data;
+ if (next->op == DNS_DIFFOP_DEL &&
+ dns_name_equal(&tuple->name, &next->name) &&
+ next->rdata.length == tuple->rdata.length &&
+ !memcmp(next_data, tuple_data,
+ next->rdata.length)) {
+ ISC_LIST_UNLINK(temp_diff.tuples, next,
+ link);
+ ISC_LIST_APPEND(diff->tuples, next,
+ link);
+ break;
+ }
+ next = ISC_LIST_NEXT(next, link);
+ }
+ /*
+ * If we have not found a pair move onto the next
+ * tuple.
+ */
+ if (next == NULL) {
+ next = ISC_LIST_NEXT(tuple, link);
+ continue;
+ }
+ /*
+ * Find the next tuple to be processed before
+ * unlinking then complete moving the pair to 'diff'.
+ */
+ next = ISC_LIST_NEXT(tuple, link);
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ ISC_LIST_APPEND(diff->tuples, tuple, link);
+ } else
+ next = ISC_LIST_NEXT(tuple, link);
+ }
+
+ /*
+ * Process the remaining DNSKEY entries.
+ */
+ for (tuple = ISC_LIST_HEAD(temp_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_HEAD(temp_diff.tuples)) {
+
+ ISC_LIST_UNLINK(temp_diff.tuples, tuple, link);
+ ISC_LIST_APPEND(diff->tuples, tuple, link);
+
dns_rdata_tostruct(&tuple->rdata, &dnskey, NULL);
if ((dnskey.flags &
(DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
@@ -3278,6 +3509,7 @@ add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
continue;
dns_rdata_toregion(&tuple->rdata, &r);
+
keyid = dst_region_computeid(&r, dnskey.algorithm);
buf[0] = dnskey.algorithm;
@@ -3310,87 +3542,25 @@ add_signing_records(dns_db_t *db, dns_name_t *name, dns_dbversion_t *ver,
INSIST(newtuple == NULL);
}
}
+
failure:
+ dns_diff_clear(&temp_diff);
return (result);
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
-/*
- * Mark all NSEC3 chains for deletion without creating a NSEC chain as
- * a side effect of deleting the last chain.
- */
-static isc_result_t
-delete_chains(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *origin,
- dns_diff_t *diff)
-{
- dns_dbnode_t *node = NULL;
- dns_difftuple_t *tuple = NULL;
- dns_name_t next;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdataset_t rdataset;
- isc_boolean_t flag;
- isc_result_t result = ISC_R_SUCCESS;
- unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
-
- dns_name_init(&next, NULL);
- dns_rdataset_init(&rdataset);
-
- result = dns_db_getoriginnode(db, &node);
- if (result != ISC_R_SUCCESS)
- return (result);
-
- /*
- * Cause all NSEC3 chains to be deleted.
- */
- result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
- 0, (isc_stdtime_t) 0, &rdataset, NULL);
- if (result == ISC_R_NOTFOUND)
- goto success;
- if (result != ISC_R_SUCCESS)
- goto failure;
-
- for (result = dns_rdataset_first(&rdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&rdataset)) {
- dns_rdataset_current(&rdataset, &rdata);
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
-
- if (buf[1] == (DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC)) {
- dns_rdata_reset(&rdata);
- continue;
- }
-
- CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL,
- origin, 0, &rdata, &tuple));
- CHECK(do_one_tuple(&tuple, db, ver, diff));
- INSIST(tuple == NULL);
-
- buf[1] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
- rdata.data = buf;
-
- CHECK(rr_exists(db, ver, origin, &rdata, &flag));
+static isc_boolean_t
+isdnssec(dns_db_t *db, dns_dbversion_t *ver, dns_rdatatype_t privatetype) {
+ isc_result_t result;
+ isc_boolean_t build_nsec, build_nsec3;
- if (!flag) {
- CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
- origin, 0, &rdata, &tuple));
- CHECK(do_one_tuple(&tuple, db, ver, diff));
- INSIST(tuple == NULL);
- }
- dns_rdata_reset(&rdata);
- }
- if (result != ISC_R_NOMORE)
- goto failure;
- success:
- result = ISC_R_SUCCESS;
+ if (dns_db_issecure(db))
+ return (ISC_TRUE);
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- dns_db_detachnode(db, &node);
- return (result);
+ result = dns_private_chains(db, ver, privatetype,
+ &build_nsec, &build_nsec3);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ return (build_nsec || build_nsec3);
}
-#endif
static void
update_action(isc_task_t *task, isc_event_t *event) {
@@ -3414,15 +3584,10 @@ update_action(isc_task_t *task, isc_event_t *event) {
dns_fixedname_t tmpnamefixed;
dns_name_t *tmpname = NULL;
unsigned int options;
- isc_boolean_t deleted_zsk;
dns_difftuple_t *tuple;
dns_rdata_dnskey_t dnskey;
-#ifdef ALLOW_NSEC3PARAM_UPDATE
- unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
-#endif
-#if !defined(ALLOW_SECURE_TO_INSECURE) || !defined(ALLOW_INSECURE_TO_SECURE)
isc_boolean_t had_dnskey;
-#endif
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
INSIST(event->ev_type == DNS_EVENT_UPDATE);
@@ -3433,6 +3598,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
zonename = dns_db_origin(db);
zoneclass = dns_db_class(db);
dns_zone_getssutable(zone, &ssutable);
+
+ /*
+ * Update message processing can leak record existance information
+ * so check that we are allowed to query this zone. Additionally
+ * if we would refuse all updates for this zone we bail out here.
+ */
+ CHECK(checkqueryacl(client, dns_zone_getqueryacl(zone), zonename,
+ dns_zone_getupdateacl(zone), ssutable));
+
+ /*
+ * Get old and new versions now that queryacl has been checked.
+ */
dns_db_currentversion(db, &oldver);
CHECK(dns_db_newversion(db, &ver));
@@ -3525,7 +3702,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
if (result != ISC_R_NOMORE)
FAIL(result);
-
/*
* Perform the final check of the "rrset exists (value dependent)"
* prerequisites.
@@ -3619,31 +3795,31 @@ update_action(isc_task_t *task, isc_event_t *event) {
update_class);
FAIL(DNS_R_FORMERR);
}
+
/*
* draft-ietf-dnsind-simple-secure-update-01 says
* "Unlike traditional dynamic update, the client
* is forbidden from updating NSEC records."
*/
- if (dns_db_issecure(db)) {
- if (rdata.type == dns_rdatatype_nsec3) {
- FAILC(DNS_R_REFUSED,
- "explicit NSEC3 updates are not allowed "
- "in secure zones");
- } else if (rdata.type == dns_rdatatype_nsec) {
- FAILC(DNS_R_REFUSED,
- "explicit NSEC updates are not allowed "
- "in secure zones");
- } else if (rdata.type == dns_rdatatype_rrsig &&
- !dns_name_equal(name, zonename)) {
- FAILC(DNS_R_REFUSED,
- "explicit RRSIG updates are currently "
- "not supported in secure zones except "
- "at the apex");
- }
+ if (rdata.type == dns_rdatatype_nsec3) {
+ FAILC(DNS_R_REFUSED,
+ "explicit NSEC3 updates are not allowed "
+ "in secure zones");
+ } else if (rdata.type == dns_rdatatype_nsec) {
+ FAILC(DNS_R_REFUSED,
+ "explicit NSEC updates are not allowed "
+ "in secure zones");
+ } else if (rdata.type == dns_rdatatype_rrsig &&
+ !dns_name_equal(name, zonename)) {
+ FAILC(DNS_R_REFUSED,
+ "explicit RRSIG updates are currently "
+ "not supported in secure zones except "
+ "at the apex");
}
if (ssutable != NULL) {
isc_netaddr_t *tcpaddr, netaddr;
+ dst_key_t *tsigkey = NULL;
/*
* If this is a TCP connection then pass the
* address of the client through for tcp-self
@@ -3656,16 +3832,22 @@ update_action(isc_task_t *task, isc_event_t *event) {
tcpaddr = &netaddr;
} else
tcpaddr = NULL;
+
+ if (client->message->tsigkey != NULL)
+ tsigkey = client->message->tsigkey->key;
+
if (rdata.type != dns_rdatatype_any) {
if (!dns_ssutable_checkrules(ssutable,
client->signer,
name, tcpaddr,
- rdata.type))
+ rdata.type,
+ tsigkey))
FAILC(DNS_R_REFUSED,
"rejected by secure update");
} else {
if (!ssu_checkall(db, ver, name, ssutable,
- client->signer, tcpaddr))
+ client->signer, tcpaddr,
+ tsigkey))
FAILC(DNS_R_REFUSED,
"rejected by secure update");
}
@@ -3774,7 +3956,14 @@ update_action(isc_task_t *task, isc_event_t *event) {
soa_serial_changed = ISC_TRUE;
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
+ if (rdata.type == privatetype) {
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "attempt to add a private type "
+ "(%u) record rejected internal "
+ "use only", privatetype);
+ continue;
+ }
+
if (rdata.type == dns_rdatatype_nsec3param) {
/*
* Ignore attempts to add NSEC3PARAM records
@@ -3788,27 +3977,7 @@ update_action(isc_task_t *task, isc_event_t *event) {
"flag");
continue;
}
-
- /*
- * Set the NSEC3CHAIN creation flag.
- */
- INSIST(rdata.length <= sizeof(buf));
- memcpy(buf, rdata.data, rdata.length);
- buf[1] |= DNS_NSEC3FLAG_UPDATE;
- rdata.data = buf;
- /*
- * Force the TTL to zero for NSEC3PARAM records.
- */
- ttl = 0;
}
-#else
- if (rdata.type == dns_rdatatype_nsec3param) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "attempt to add NSEC3PARAM "
- "record ignored");
- continue;
- };
-#endif
if ((options & DNS_ZONEOPT_CHECKWILDCARD) != 0 &&
dns_name_internalwildcard(name)) {
@@ -3885,13 +4054,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
dns_rdatatype_any, 0,
&rdata, &diff));
}
-#ifndef ALLOW_NSEC3PARAM_UPDATE
- } else if (rdata.type == dns_rdatatype_nsec3param) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "attempt to delete a NSEC3PARAM "
- "records ignored");
- continue;
-#endif
} else if (dns_name_equal(name, zonename) &&
(rdata.type == dns_rdatatype_soa ||
rdata.type == dns_rdatatype_ns)) {
@@ -3920,6 +4082,9 @@ update_action(isc_task_t *task, isc_event_t *event) {
&diff));
}
} else if (update_class == dns_rdataclass_none) {
+ char namestr[DNS_NAME_FORMATSIZE];
+ char typestr[DNS_RDATATYPE_FORMATSIZE];
+
/*
* The (name == zonename) condition appears in
* RFC2136 3.4.2.4 but is missing from the pseudocode.
@@ -3947,11 +4112,13 @@ update_action(isc_task_t *task, isc_event_t *event) {
}
}
}
- update_log(client, zone,
- LOGLEVEL_PROTOCOL,
- "deleting an RR");
- CHECK(delete_if(rr_equal_p, db, ver, name,
- rdata.type, covers, &rdata, &diff));
+ dns_name_format(name, namestr, sizeof(namestr));
+ dns_rdatatype_format(rdata.type, typestr,
+ sizeof(typestr));
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "deleting an RR at %s %s", namestr, typestr);
+ CHECK(delete_if(rr_equal_p, db, ver, name, rdata.type,
+ covers, &rdata, &diff));
}
}
if (result != ISC_R_NOMORE)
@@ -3965,6 +4132,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
if (! ISC_LIST_EMPTY(diff.tuples))
CHECK(check_dnssec(client, zone, db, ver, &diff));
+ if (! ISC_LIST_EMPTY(diff.tuples)) {
+ unsigned int errors = 0;
+ CHECK(dns_zone_nscheck(zone, db, ver, &errors));
+ if (errors != 0) {
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "update rejected: post update name server "
+ "sanity check failed");
+ result = DNS_R_REFUSED;
+ goto failure;
+ }
+ }
+
/*
* If any changes were made, increment the SOA serial number,
* update RRSIGs and NSECs (if zone is secure), and write the update
@@ -3990,37 +4169,29 @@ update_action(isc_task_t *task, isc_event_t *event) {
CHECK(rrset_exists(db, ver, zonename, dns_rdatatype_dnskey,
0, &has_dnskey));
-#if !defined(ALLOW_SECURE_TO_INSECURE) || !defined(ALLOW_INSECURE_TO_SECURE)
- CHECK(rrset_exists(db, oldver, zonename, dns_rdatatype_dnskey,
- 0, &had_dnskey));
+#define ALLOW_SECURE_TO_INSECURE(zone) \
+ ((dns_zone_getoptions(zone) & DNS_ZONEOPT_SECURETOINSECURE) != 0)
-#ifndef ALLOW_SECURE_TO_INSECURE
- if (had_dnskey && !has_dnskey) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "update rejected: all DNSKEY records "
- "removed");
- result = DNS_R_REFUSED;
- goto failure;
- }
-#endif
-#ifndef ALLOW_INSECURE_TO_SECURE
- if (!had_dnskey && has_dnskey) {
- update_log(client, zone, LOGLEVEL_PROTOCOL,
- "update rejected: DNSKEY record added");
- result = DNS_R_REFUSED;
- goto failure;
+ if (!ALLOW_SECURE_TO_INSECURE(zone)) {
+ CHECK(rrset_exists(db, oldver, zonename,
+ dns_rdatatype_dnskey, 0,
+ &had_dnskey));
+ if (had_dnskey && !has_dnskey) {
+ update_log(client, zone, LOGLEVEL_PROTOCOL,
+ "update rejected: all DNSKEY "
+ "records removed and "
+ "'dnssec-secure-to-insecure' "
+ "not set");
+ result = DNS_R_REFUSED;
+ goto failure;
+ }
}
-#endif
-#endif
- CHECK(add_signing_records(db, zonename, ver,
- dns_zone_getprivatetype(zone),
- &diff));
+ CHECK(rollback_private(db, privatetype, ver, &diff));
+
+ CHECK(add_signing_records(db, privatetype, ver, &diff));
-#ifdef ALLOW_NSEC3PARAM_UPDATE
- CHECK(add_nsec3param_records(client, zone, db, zonename,
- ver, &diff));
-#endif
+ CHECK(add_nsec3param_records(client, zone, db, ver, &diff));
if (!has_dnskey) {
/*
@@ -4029,15 +4200,13 @@ update_action(isc_task_t *task, isc_event_t *event) {
* the last signature for the DNSKEY records are
* remove any NSEC chain present will also be removed.
*/
-#ifdef ALLOW_NSEC3PARAM_UPDATE
- CHECK(delete_chains(db, ver, zonename, &diff));
-#endif
- } else if (has_dnskey && dns_db_isdnssec(db)) {
+ CHECK(dns_nsec3param_deletechains(db, ver, zone,
+ &diff));
+ } else if (has_dnskey && isdnssec(db, ver, privatetype)) {
isc_uint32_t interval;
interval = dns_zone_getsigvalidityinterval(zone);
result = update_signatures(client, zone, db, oldver,
- ver, &diff, interval,
- &deleted_zsk);
+ ver, &diff, interval);
if (result != ISC_R_SUCCESS) {
update_log(client, zone,
ISC_LOG_ERROR,
@@ -4123,7 +4292,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
}
}
-#ifdef ALLOW_NSEC3PARAM_UPDATE
/*
* Cause the zone to add/delete NSEC3 chains for the
* deferred NSEC3PARAM changes.
@@ -4133,13 +4301,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
for (tuple = ISC_LIST_HEAD(diff.tuples);
tuple != NULL;
tuple = ISC_LIST_NEXT(tuple, link)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdata_nsec3param_t nsec3param;
- if (tuple->rdata.type != dns_rdatatype_nsec3param ||
+ if (tuple->rdata.type != privatetype ||
tuple->op != DNS_DIFFOP_ADD)
continue;
- dns_rdata_tostruct(&tuple->rdata, &nsec3param, NULL);
+ if (!dns_nsec3param_fromprivate(&tuple->rdata, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ dns_rdata_tostruct(&rdata, &nsec3param, NULL);
if (nsec3param.flags == 0)
continue;
@@ -4150,7 +4323,6 @@ update_action(isc_task_t *task, isc_event_t *event) {
dns_result_totext(result));
}
}
-#endif
} else {
update_log(client, zone, LOGLEVEL_DEBUG, "redundant request");
dns_db_closeversion(db, &ver, ISC_TRUE);
diff --git a/contrib/bind9/bin/named/xfrout.c b/contrib/bind9/bin/named/xfrout.c
index e61dc72..b036ed1 100644
--- a/contrib/bind9/bin/named/xfrout.c
+++ b/contrib/bind9/bin/named/xfrout.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrout.c,v 1.131.26.6 2010-05-27 23:48:18 tbox Exp $ */
+/* $Id: xfrout.c,v 1.139 2010-12-18 01:56:19 each Exp $ */
#include <config.h>
@@ -40,6 +40,7 @@
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
#include <dns/result.h>
+#include <dns/rriterator.h>
#include <dns/soa.h>
#include <dns/stats.h>
#include <dns/timer.h>
@@ -112,43 +113,6 @@
} while (0)
/**************************************************************************/
-/*%
- * A db_rr_iterator_t is an iterator that iterates over an entire database,
- * returning one RR at a time, in some arbitrary order.
- */
-
-typedef struct db_rr_iterator db_rr_iterator_t;
-
-/*% db_rr_iterator structure */
-struct db_rr_iterator {
- isc_result_t result;
- dns_db_t *db;
- dns_dbiterator_t *dbit;
- dns_dbversion_t *ver;
- isc_stdtime_t now;
- dns_dbnode_t *node;
- dns_fixedname_t fixedname;
- dns_rdatasetiter_t *rdatasetit;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata;
-};
-
-static isc_result_t
-db_rr_iterator_init(db_rr_iterator_t *it, dns_db_t *db, dns_dbversion_t *ver,
- isc_stdtime_t now);
-
-static isc_result_t
-db_rr_iterator_first(db_rr_iterator_t *it);
-
-static isc_result_t
-db_rr_iterator_next(db_rr_iterator_t *it);
-
-static void
-db_rr_iterator_current(db_rr_iterator_t *it, dns_name_t **name,
- isc_uint32_t *ttl, dns_rdata_t **rdata);
-
-static void
-db_rr_iterator_destroy(db_rr_iterator_t *it);
static inline void
inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
@@ -160,145 +124,6 @@ inc_stats(dns_zone_t *zone, isc_statscounter_t counter) {
}
}
-static isc_result_t
-db_rr_iterator_init(db_rr_iterator_t *it, dns_db_t *db, dns_dbversion_t *ver,
- isc_stdtime_t now)
-{
- isc_result_t result;
- it->db = db;
- it->dbit = NULL;
- it->ver = ver;
- it->now = now;
- it->node = NULL;
- result = dns_db_createiterator(it->db, 0, &it->dbit);
- if (result != ISC_R_SUCCESS)
- return (result);
- it->rdatasetit = NULL;
- dns_rdata_init(&it->rdata);
- dns_rdataset_init(&it->rdataset);
- dns_fixedname_init(&it->fixedname);
- INSIST(! dns_rdataset_isassociated(&it->rdataset));
- it->result = ISC_R_SUCCESS;
- return (it->result);
-}
-
-static isc_result_t
-db_rr_iterator_first(db_rr_iterator_t *it) {
- it->result = dns_dbiterator_first(it->dbit);
- /*
- * The top node may be empty when out of zone glue exists.
- * Walk the tree to find the first node with data.
- */
- while (it->result == ISC_R_SUCCESS) {
- it->result = dns_dbiterator_current(it->dbit, &it->node,
- dns_fixedname_name(&it->fixedname));
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
-
- it->result = dns_db_allrdatasets(it->db, it->node,
- it->ver, it->now,
- &it->rdatasetit);
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
-
- it->result = dns_rdatasetiter_first(it->rdatasetit);
- if (it->result != ISC_R_SUCCESS) {
- /*
- * This node is empty. Try next node.
- */
- dns_rdatasetiter_destroy(&it->rdatasetit);
- dns_db_detachnode(it->db, &it->node);
- it->result = dns_dbiterator_next(it->dbit);
- continue;
- }
- dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
- it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
- it->result = dns_rdataset_first(&it->rdataset);
- return (it->result);
- }
- return (it->result);
-}
-
-
-static isc_result_t
-db_rr_iterator_next(db_rr_iterator_t *it) {
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
-
- INSIST(it->dbit != NULL);
- INSIST(it->node != NULL);
- INSIST(it->rdatasetit != NULL);
-
- it->result = dns_rdataset_next(&it->rdataset);
- if (it->result == ISC_R_NOMORE) {
- dns_rdataset_disassociate(&it->rdataset);
- it->result = dns_rdatasetiter_next(it->rdatasetit);
- /*
- * The while loop body is executed more than once
- * only when an empty dbnode needs to be skipped.
- */
- while (it->result == ISC_R_NOMORE) {
- dns_rdatasetiter_destroy(&it->rdatasetit);
- dns_db_detachnode(it->db, &it->node);
- it->result = dns_dbiterator_next(it->dbit);
- if (it->result == ISC_R_NOMORE) {
- /* We are at the end of the entire database. */
- return (it->result);
- }
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- it->result = dns_dbiterator_current(it->dbit,
- &it->node,
- dns_fixedname_name(&it->fixedname));
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- it->result = dns_db_allrdatasets(it->db, it->node,
- it->ver, it->now,
- &it->rdatasetit);
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- it->result = dns_rdatasetiter_first(it->rdatasetit);
- }
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
- it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
- it->result = dns_rdataset_first(&it->rdataset);
- if (it->result != ISC_R_SUCCESS)
- return (it->result);
- }
- return (it->result);
-}
-
-static void
-db_rr_iterator_pause(db_rr_iterator_t *it) {
- RUNTIME_CHECK(dns_dbiterator_pause(it->dbit) == ISC_R_SUCCESS);
-}
-
-static void
-db_rr_iterator_destroy(db_rr_iterator_t *it) {
- if (dns_rdataset_isassociated(&it->rdataset))
- dns_rdataset_disassociate(&it->rdataset);
- if (it->rdatasetit != NULL)
- dns_rdatasetiter_destroy(&it->rdatasetit);
- if (it->node != NULL)
- dns_db_detachnode(it->db, &it->node);
- dns_dbiterator_destroy(&it->dbit);
-}
-
-static void
-db_rr_iterator_current(db_rr_iterator_t *it, dns_name_t **name,
- isc_uint32_t *ttl, dns_rdata_t **rdata)
-{
- REQUIRE(name != NULL && *name == NULL);
- REQUIRE(it->result == ISC_R_SUCCESS);
- *name = dns_fixedname_name(&it->fixedname);
- *ttl = it->rdataset.ttl;
- dns_rdata_reset(&it->rdata);
- dns_rdataset_current(&it->rdataset, &it->rdata);
- *rdata = &it->rdata;
-}
-
/**************************************************************************/
/*% Log an RR (for debugging) */
@@ -488,7 +313,7 @@ static rrstream_methods_t ixfr_rrstream_methods = {
typedef struct axfr_rrstream {
rrstream_t common;
- db_rr_iterator_t it;
+ dns_rriterator_t it;
isc_boolean_t it_valid;
} axfr_rrstream_t;
@@ -516,7 +341,7 @@ axfr_rrstream_create(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *ver,
s->common.methods = &axfr_rrstream_methods;
s->it_valid = ISC_FALSE;
- CHECK(db_rr_iterator_init(&s->it, db, ver, 0));
+ CHECK(dns_rriterator_init(&s->it, db, ver, 0));
s->it_valid = ISC_TRUE;
*sp = (rrstream_t *) s;
@@ -531,7 +356,7 @@ static isc_result_t
axfr_rrstream_first(rrstream_t *rs) {
axfr_rrstream_t *s = (axfr_rrstream_t *) rs;
isc_result_t result;
- result = db_rr_iterator_first(&s->it);
+ result = dns_rriterator_first(&s->it);
if (result != ISC_R_SUCCESS)
return (result);
/* Skip SOA records. */
@@ -539,11 +364,11 @@ axfr_rrstream_first(rrstream_t *rs) {
dns_name_t *name_dummy = NULL;
isc_uint32_t ttl_dummy;
dns_rdata_t *rdata = NULL;
- db_rr_iterator_current(&s->it, &name_dummy,
- &ttl_dummy, &rdata);
+ dns_rriterator_current(&s->it, &name_dummy,
+ &ttl_dummy, NULL, &rdata);
if (rdata->type != dns_rdatatype_soa)
break;
- result = db_rr_iterator_next(&s->it);
+ result = dns_rriterator_next(&s->it);
if (result != ISC_R_SUCCESS)
break;
}
@@ -560,11 +385,11 @@ axfr_rrstream_next(rrstream_t *rs) {
dns_name_t *name_dummy = NULL;
isc_uint32_t ttl_dummy;
dns_rdata_t *rdata = NULL;
- result = db_rr_iterator_next(&s->it);
+ result = dns_rriterator_next(&s->it);
if (result != ISC_R_SUCCESS)
break;
- db_rr_iterator_current(&s->it, &name_dummy,
- &ttl_dummy, &rdata);
+ dns_rriterator_current(&s->it, &name_dummy,
+ &ttl_dummy, NULL, &rdata);
if (rdata->type != dns_rdatatype_soa)
break;
}
@@ -576,20 +401,20 @@ axfr_rrstream_current(rrstream_t *rs, dns_name_t **name, isc_uint32_t *ttl,
dns_rdata_t **rdata)
{
axfr_rrstream_t *s = (axfr_rrstream_t *) rs;
- db_rr_iterator_current(&s->it, name, ttl, rdata);
+ dns_rriterator_current(&s->it, name, ttl, NULL, rdata);
}
static void
axfr_rrstream_pause(rrstream_t *rs) {
axfr_rrstream_t *s = (axfr_rrstream_t *) rs;
- db_rr_iterator_pause(&s->it);
+ dns_rriterator_pause(&s->it);
}
static void
axfr_rrstream_destroy(rrstream_t **rsp) {
axfr_rrstream_t *s = (axfr_rrstream_t *) *rsp;
if (s->it_valid)
- db_rr_iterator_destroy(&s->it);
+ dns_rriterator_destroy(&s->it);
isc_mem_put(s->common.mctx, s, sizeof(*s));
}
@@ -1038,6 +863,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) {
switch(dns_zone_gettype(zone)) {
case dns_zone_master:
case dns_zone_slave:
+ case dns_zone_dlz:
break; /* Master and slave zones are OK for transfer. */
default:
FAILQ(DNS_R_NOTAUTH, "non-authoritative zone", question_name, question_class);
diff --git a/contrib/bind9/bin/named/zoneconf.c b/contrib/bind9/bin/named/zoneconf.c
index 367ddd3..eb93f1b 100644
--- a/contrib/bind9/bin/named/zoneconf.c
+++ b/contrib/bind9/bin/named/zoneconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zoneconf.c,v 1.147.50.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: zoneconf.c,v 1.170 2011-01-06 23:47:00 tbox Exp $ */
/*% */
@@ -30,10 +30,16 @@
#include <isc/util.h>
#include <dns/acl.h>
+#include <dns/db.h>
#include <dns/fixedname.h>
#include <dns/log.h>
#include <dns/name.h>
+#include <dns/rdata.h>
#include <dns/rdatatype.h>
+#include <dns/rdataset.h>
+#include <dns/rdatalist.h>
+#include <dns/result.h>
+#include <dns/sdlz.h>
#include <dns/ssu.h>
#include <dns/stats.h>
#include <dns/view.h>
@@ -55,16 +61,18 @@ typedef enum {
allow_update_forwarding
} acl_type_t;
-/*%
- * These are BIND9 server defaults, not necessarily identical to the
- * library defaults defined in zone.c.
- */
#define RETERR(x) do { \
isc_result_t _r = (x); \
if (_r != ISC_R_SUCCESS) \
return (_r); \
} while (0)
+#define CHECK(x) do { \
+ result = (x); \
+ if (result != ISC_R_SUCCESS) \
+ goto cleanup; \
+ } while (0)
+
/*%
* Convenience function for configuring a single zone ACL.
*/
@@ -133,8 +141,11 @@ configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig,
}
/* Check for default ACLs that haven't been parsed yet */
- if (vconfig != NULL)
- maps[i++] = cfg_tuple_get(vconfig, "options");
+ if (vconfig != NULL) {
+ const cfg_obj_t *options = cfg_tuple_get(vconfig, "options");
+ if (options != NULL)
+ maps[i++] = options;
+ }
if (config != NULL) {
const cfg_obj_t *options = NULL;
(void)cfg_map_get(config, "options", &options);
@@ -169,19 +180,29 @@ parse_acl:
* Parse the zone update-policy statement.
*/
static isc_result_t
-configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
+configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ const char *zname)
+{
const cfg_obj_t *updatepolicy = NULL;
const cfg_listelt_t *element, *element2;
dns_ssutable_t *table = NULL;
isc_mem_t *mctx = dns_zone_getmctx(zone);
+ isc_boolean_t autoddns = ISC_FALSE;
isc_result_t result;
(void)cfg_map_get(zconfig, "update-policy", &updatepolicy);
+
if (updatepolicy == NULL) {
dns_zone_setssutable(zone, NULL);
return (ISC_R_SUCCESS);
}
+ if (cfg_obj_isstring(updatepolicy) &&
+ strcmp("local", cfg_obj_asstring(updatepolicy)) == 0) {
+ autoddns = ISC_TRUE;
+ updatepolicy = NULL;
+ }
+
result = dns_ssutable_create(mctx, &table);
if (result != ISC_R_SUCCESS)
return (result);
@@ -198,6 +219,7 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
const cfg_obj_t *typelist = cfg_tuple_get(stmt, "types");
const char *str;
isc_boolean_t grant = ISC_FALSE;
+ isc_boolean_t usezone = ISC_FALSE;
unsigned int mtype = DNS_SSUMATCHTYPE_NAME;
dns_fixedname_t fname, fident;
isc_buffer_t b;
@@ -237,6 +259,11 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
mtype = DNS_SSUMATCHTYPE_TCPSELF;
else if (strcasecmp(str, "6to4-self") == 0)
mtype = DNS_SSUMATCHTYPE_6TO4SELF;
+ else if (strcasecmp(str, "zonesub") == 0) {
+ mtype = DNS_SSUMATCHTYPE_SUBDOMAIN;
+ usezone = ISC_TRUE;
+ } else if (strcasecmp(str, "external") == 0)
+ mtype = DNS_SSUMATCHTYPE_EXTERNAL;
else
INSIST(0);
@@ -245,7 +272,7 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
result = dns_name_fromtext(dns_fixedname_name(&fident), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
"'%s' is not a valid name", str);
@@ -253,15 +280,27 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
}
dns_fixedname_init(&fname);
- str = cfg_obj_asstring(dname);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (result != ISC_R_SUCCESS) {
- cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
- "'%s' is not a valid name", str);
- goto cleanup;
+ if (usezone) {
+ result = dns_name_copy(dns_zone_getorigin(zone),
+ dns_fixedname_name(&fname),
+ NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
+ "error copying origin: %s",
+ isc_result_totext(result));
+ goto cleanup;
+ }
+ } else {
+ str = cfg_obj_asstring(dname);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ result = dns_name_fromtext(dns_fixedname_name(&fname),
+ &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(identity, ns_g_lctx, ISC_LOG_ERROR,
+ "'%s' is not a valid name", str);
+ goto cleanup;
+ }
}
n = ns_config_listcount(typelist);
@@ -311,7 +350,34 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
+ }
+
+ /*
+ * If "update-policy local;" and a session key exists,
+ * then use the default policy, which is equivalent to:
+ * update-policy { grant <session-keyname> zonesub any; };
+ */
+ if (autoddns) {
+ dns_rdatatype_t any = dns_rdatatype_any;
+
+ if (ns_g_server->session_keyname == NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "failed to enable auto DDNS policy "
+ "for zone %s: session key not found",
+ zname);
+ result = ISC_R_NOTFOUND;
+ goto cleanup;
+ }
+ result = dns_ssutable_addrule(table, ISC_TRUE,
+ ns_g_server->session_keyname,
+ DNS_SSUMATCHTYPE_SUBDOMAIN,
+ dns_zone_getorigin(zone),
+ 1, &any);
+
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
}
result = ISC_R_SUCCESS;
@@ -322,6 +388,323 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone) {
return (result);
}
+/*
+ * This is the TTL used for internally generated RRsets for static-stub zones.
+ * The value doesn't matter because the mapping is static, but needs to be
+ * defined for the sake of implementation.
+ */
+#define STATICSTUB_SERVER_TTL 86400
+
+/*%
+ * Configure an apex NS with glues for a static-stub zone.
+ * For example, for the zone named "example.com", the following RRs will be
+ * added to the zone DB:
+ * example.com. NS example.com.
+ * example.com. A 192.0.2.1
+ * example.com. AAAA 2001:db8::1
+ */
+static isc_result_t
+configure_staticstub_serveraddrs(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ dns_rdatalist_t *rdatalist_ns,
+ dns_rdatalist_t *rdatalist_a,
+ dns_rdatalist_t *rdatalist_aaaa)
+{
+ const cfg_listelt_t *element;
+ isc_mem_t *mctx = dns_zone_getmctx(zone);
+ isc_region_t region, sregion;
+ dns_rdata_t *rdata;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ for (element = cfg_list_first(zconfig);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const isc_sockaddr_t* sa;
+ isc_netaddr_t na;
+ const cfg_obj_t *address = cfg_listelt_value(element);
+ dns_rdatalist_t *rdatalist;
+
+ sa = cfg_obj_assockaddr(address);
+ if (isc_sockaddr_getport(sa) != 0) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "port is not configurable for "
+ "static stub server-addresses");
+ return (ISC_R_FAILURE);
+ }
+ isc_netaddr_fromsockaddr(&na, sa);
+ if (isc_netaddr_getzone(&na) != 0) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "scoped address is not allowed "
+ "for static stub "
+ "server-addresses");
+ return (ISC_R_FAILURE);
+ }
+
+ switch (na.family) {
+ case AF_INET:
+ region.length = sizeof(na.type.in);
+ rdatalist = rdatalist_a;
+ break;
+ default:
+ INSIST(na.family == AF_INET6);
+ region.length = sizeof(na.type.in6);
+ rdatalist = rdatalist_aaaa;
+ break;
+ }
+
+ rdata = isc_mem_get(mctx, sizeof(*rdata) + region.length);
+ if (rdata == NULL)
+ return (ISC_R_NOMEMORY);
+ region.base = (unsigned char *)(rdata + 1);
+ memcpy(region.base, &na.type, region.length);
+ dns_rdata_init(rdata);
+ dns_rdata_fromregion(rdata, dns_zone_getclass(zone),
+ rdatalist->type, &region);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ }
+
+ /*
+ * If no address is specified (unlikely in this context, but possible),
+ * there's nothing to do anymore.
+ */
+ if (ISC_LIST_EMPTY(rdatalist_a->rdata) &&
+ ISC_LIST_EMPTY(rdatalist_aaaa->rdata)) {
+ return (ISC_R_SUCCESS);
+ }
+
+ /* Add to the list an apex NS with the ns name being the origin name */
+ dns_name_toregion(dns_zone_getorigin(zone), &sregion);
+ rdata = isc_mem_get(mctx, sizeof(*rdata) + sregion.length);
+ if (rdata == NULL) {
+ /*
+ * Already allocated data will be freed in the caller, so
+ * we can simply return here.
+ */
+ return (ISC_R_NOMEMORY);
+ }
+ region.length = sregion.length;
+ region.base = (unsigned char *)(rdata + 1);
+ memcpy(region.base, sregion.base, region.length);
+ dns_rdata_init(rdata);
+ dns_rdata_fromregion(rdata, dns_zone_getclass(zone),
+ dns_rdatatype_ns, &region);
+ ISC_LIST_APPEND(rdatalist_ns->rdata, rdata, link);
+
+ return (result);
+}
+
+/*%
+ * Configure an apex NS with an out-of-zone NS names for a static-stub zone.
+ * For example, for the zone named "example.com", something like the following
+ * RRs will be added to the zone DB:
+ * example.com. NS ns.example.net.
+ */
+static isc_result_t
+configure_staticstub_servernames(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ dns_rdatalist_t *rdatalist, const char *zname)
+{
+ const cfg_listelt_t *element;
+ isc_mem_t *mctx = dns_zone_getmctx(zone);
+ dns_rdata_t *rdata;
+ isc_region_t sregion, region;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ for (element = cfg_list_first(zconfig);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *obj;
+ const char *str;
+ dns_fixedname_t fixed_name;
+ dns_name_t *nsname;
+ isc_buffer_t b;
+
+ obj = cfg_listelt_value(element);
+ str = cfg_obj_asstring(obj);
+
+ dns_fixedname_init(&fixed_name);
+ nsname = dns_fixedname_name(&fixed_name);
+
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ result = dns_name_fromtext(nsname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "server-name '%s' is not a valid "
+ "name", str);
+ return (result);
+ }
+ if (dns_name_issubdomain(nsname, dns_zone_getorigin(zone))) {
+ cfg_obj_log(zconfig, ns_g_lctx, ISC_LOG_ERROR,
+ "server-name '%s' must not be a "
+ "subdomain of zone name '%s'",
+ str, zname);
+ return (ISC_R_FAILURE);
+ }
+
+ dns_name_toregion(nsname, &sregion);
+ rdata = isc_mem_get(mctx, sizeof(*rdata) + sregion.length);
+ if (rdata == NULL)
+ return (ISC_R_NOMEMORY);
+ region.length = sregion.length;
+ region.base = (unsigned char *)(rdata + 1);
+ memcpy(region.base, sregion.base, region.length);
+ dns_rdata_init(rdata);
+ dns_rdata_fromregion(rdata, dns_zone_getclass(zone),
+ dns_rdatatype_ns, &region);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ }
+
+ return (result);
+}
+
+/*%
+ * Configure static-stub zone.
+ */
+static isc_result_t
+configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone,
+ const char *zname, const char *dbtype)
+{
+ int i = 0;
+ const cfg_obj_t *obj;
+ isc_mem_t *mctx = dns_zone_getmctx(zone);
+ dns_db_t *db = NULL;
+ dns_dbversion_t *dbversion = NULL;
+ dns_dbnode_t *apexnode = NULL;
+ dns_name_t apexname;
+ isc_result_t result;
+ dns_rdataset_t rdataset;
+ dns_rdatalist_t rdatalist_ns, rdatalist_a, rdatalist_aaaa;
+ dns_rdatalist_t* rdatalists[] = {
+ &rdatalist_ns, &rdatalist_a, &rdatalist_aaaa, NULL
+ };
+ dns_rdata_t *rdata;
+ isc_region_t region;
+
+ /* Create the DB beforehand */
+ RETERR(dns_db_create(mctx, dbtype, dns_zone_getorigin(zone),
+ dns_dbtype_stub, dns_zone_getclass(zone),
+ 0, NULL, &db));
+ dns_zone_setdb(zone, db);
+
+ dns_rdatalist_init(&rdatalist_ns);
+ rdatalist_ns.rdclass = dns_zone_getclass(zone);
+ rdatalist_ns.type = dns_rdatatype_ns;
+ rdatalist_ns.ttl = STATICSTUB_SERVER_TTL;
+
+ dns_rdatalist_init(&rdatalist_a);
+ rdatalist_a.rdclass = dns_zone_getclass(zone);
+ rdatalist_a.type = dns_rdatatype_a;
+ rdatalist_a.ttl = STATICSTUB_SERVER_TTL;
+
+ dns_rdatalist_init(&rdatalist_aaaa);
+ rdatalist_aaaa.rdclass = dns_zone_getclass(zone);
+ rdatalist_aaaa.type = dns_rdatatype_aaaa;
+ rdatalist_aaaa.ttl = STATICSTUB_SERVER_TTL;
+
+ /* Prepare zone RRs from the configuration */
+ obj = NULL;
+ result = cfg_map_get(zconfig, "server-addresses", &obj);
+ if (obj != NULL) {
+ result = configure_staticstub_serveraddrs(obj, zone,
+ &rdatalist_ns,
+ &rdatalist_a,
+ &rdatalist_aaaa);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ obj = NULL;
+ result = cfg_map_get(zconfig, "server-names", &obj);
+ if (obj != NULL) {
+ result = configure_staticstub_servernames(obj, zone,
+ &rdatalist_ns,
+ zname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ /*
+ * Sanity check: there should be at least one NS RR at the zone apex
+ * to trigger delegation.
+ */
+ if (ISC_LIST_EMPTY(rdatalist_ns.rdata)) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "No NS record is configured for a "
+ "static-stub zone '%s'", zname);
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ /*
+ * Now add NS and glue A/AAAA RRsets to the zone DB.
+ * First open a new version for the add operation and get a pointer
+ * to the apex node (all RRs are of the apex name).
+ */
+ result = dns_db_newversion(db, &dbversion);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_name_init(&apexname, NULL);
+ dns_name_clone(dns_zone_getorigin(zone), &apexname);
+ result = dns_db_findnode(db, &apexname, ISC_FALSE, &apexnode);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Add NS RRset */
+ dns_rdataset_init(&rdataset);
+ RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_ns, &rdataset)
+ == ISC_R_SUCCESS);
+ result = dns_db_addrdataset(db, apexnode, dbversion, 0, &rdataset,
+ 0, NULL);
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Add glue A RRset, if any */
+ if (!ISC_LIST_EMPTY(rdatalist_a.rdata)) {
+ RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_a, &rdataset)
+ == ISC_R_SUCCESS);
+ result = dns_db_addrdataset(db, apexnode, dbversion, 0,
+ &rdataset, 0, NULL);
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ /* Add glue AAAA RRset, if any */
+ if (!ISC_LIST_EMPTY(rdatalist_aaaa.rdata)) {
+ RUNTIME_CHECK(dns_rdatalist_tordataset(&rdatalist_aaaa,
+ &rdataset)
+ == ISC_R_SUCCESS);
+ result = dns_db_addrdataset(db, apexnode, dbversion, 0,
+ &rdataset, 0, NULL);
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (apexnode != NULL)
+ dns_db_detachnode(db, &apexnode);
+ if (dbversion != NULL)
+ dns_db_closeversion(db, &dbversion, ISC_TRUE);
+ if (db != NULL)
+ dns_db_detach(&db);
+ for (i = 0; rdatalists[i] != NULL; i++) {
+ while ((rdata = ISC_LIST_HEAD(rdatalists[i]->rdata)) != NULL) {
+ ISC_LIST_UNLINK(rdatalists[i]->rdata, rdata, link);
+ dns_rdata_toregion(rdata, &region);
+ isc_mem_put(mctx, rdata,
+ sizeof(*rdata) + region.length);
+ }
+ }
+
+ return (result);
+}
+
/*%
* Convert a config file zone type into a server zone type.
*/
@@ -503,6 +886,19 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
if (result == ISC_R_SUCCESS)
filename = cfg_obj_asstring(obj);
+ /*
+ * Unless we're using some alternative database, a master zone
+ * will be needing a master file.
+ */
+ if (ztype == dns_zone_master && cpval == default_dbtype &&
+ filename == NULL) {
+ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+ NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+ "zone '%s': 'file' not specified",
+ zname);
+ return (ISC_R_FAILURE);
+ }
+
masterformat = dns_masterformat_text;
obj = NULL;
result= ns_config_get(maps, "masterfile-format", &obj);
@@ -577,7 +973,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
* to primary masters (type "master") and slaves
* acting as masters (type "slave"), but not to stubs.
*/
- if (ztype != dns_zone_stub) {
+ if (ztype != dns_zone_stub && ztype != dns_zone_staticstub) {
obj = NULL;
result = ns_config_get(maps, "notify", &obj);
INSIST(result == ISC_R_SUCCESS);
@@ -731,6 +1127,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
*/
if (ztype == dns_zone_master) {
dns_acl_t *updateacl;
+
RETERR(configure_zone_acl(zconfig, vconfig, config,
allow_update, ac, zone,
dns_zone_setupdateacl,
@@ -744,7 +1141,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
"address, which is insecure",
zname);
- RETERR(configure_zone_ssutable(zoptions, zone));
+ RETERR(configure_zone_ssutable(zoptions, zone, zname));
obj = NULL;
result = ns_config_get(maps, "sig-validity-interval", &obj);
@@ -774,12 +1171,6 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
result = ns_config_get(maps, "key-directory", &obj);
if (result == ISC_R_SUCCESS) {
filename = cfg_obj_asstring(obj);
- if (!isc_file_isabsolute(filename)) {
- cfg_obj_log(obj, ns_g_lctx, ISC_LOG_ERROR,
- "key-directory '%s' "
- "is not absolute", filename);
- return (ISC_R_FAILURE);
- }
RETERR(dns_zone_setkeydirectory(zone, filename));
}
@@ -804,6 +1195,11 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
dns_zone_setoption(zone, DNS_ZONEOPT_UPDATECHECKKSK,
cfg_obj_asboolean(obj));
+ obj = NULL;
+ result = ns_config_get(maps, "dnssec-dnskey-kskonly", &obj);
+ INSIST(result == ISC_R_SUCCESS);
+ dns_zone_setoption(zone, DNS_ZONEOPT_DNSKEYKSKONLY,
+ cfg_obj_asboolean(obj));
} else if (ztype == dns_zone_slave) {
RETERR(configure_zone_acl(zconfig, vconfig, config,
allow_update_forwarding, ac, zone,
@@ -811,11 +1207,13 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
dns_zone_clearforwardacl));
}
-
/*%
* Primary master functionality.
*/
if (ztype == dns_zone_master) {
+ isc_boolean_t allow = ISC_FALSE, maint = ISC_FALSE;
+ isc_boolean_t create = ISC_FALSE;
+
obj = NULL;
result = ns_config_get(maps, "check-wildcard", &obj);
if (result == ISC_R_SUCCESS)
@@ -825,6 +1223,21 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
dns_zone_setoption(zone, DNS_ZONEOPT_CHECKWILDCARD, check);
obj = NULL;
+ result = ns_config_get(maps, "check-dup-records", &obj);
+ INSIST(obj != NULL);
+ if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
+ fail = ISC_FALSE;
+ check = ISC_TRUE;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "fail") == 0) {
+ fail = check = ISC_TRUE;
+ } else if (strcasecmp(cfg_obj_asstring(obj), "ignore") == 0) {
+ fail = check = ISC_FALSE;
+ } else
+ INSIST(0);
+ dns_zone_setoption(zone, DNS_ZONEOPT_CHECKDUPRR, check);
+ dns_zone_setoption(zone, DNS_ZONEOPT_CHECKDUPRRFAIL, fail);
+
+ obj = NULL;
result = ns_config_get(maps, "check-mx", &obj);
INSIST(obj != NULL);
if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) {
@@ -874,6 +1287,31 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
INSIST(0);
dns_zone_setoption(zone, DNS_ZONEOPT_WARNSRVCNAME, warn);
dns_zone_setoption(zone, DNS_ZONEOPT_IGNORESRVCNAME, ignore);
+
+ obj = NULL;
+ result = ns_config_get(maps, "dnssec-secure-to-insecure", &obj);
+ INSIST(obj != NULL);
+ dns_zone_setoption(zone, DNS_ZONEOPT_SECURETOINSECURE,
+ cfg_obj_asboolean(obj));
+
+ obj = NULL;
+ result = cfg_map_get(zoptions, "auto-dnssec", &obj);
+ if (result == ISC_R_SUCCESS) {
+ const char *arg = cfg_obj_asstring(obj);
+ if (strcasecmp(arg, "allow") == 0)
+ allow = ISC_TRUE;
+ else if (strcasecmp(arg, "maintain") == 0)
+ allow = maint = ISC_TRUE;
+ else if (strcasecmp(arg, "create") == 0)
+ allow = maint = create = ISC_TRUE;
+ else if (strcasecmp(arg, "off") == 0)
+ ;
+ else
+ INSIST(0);
+ dns_zone_setkeyopt(zone, DNS_ZONEKEY_ALLOW, allow);
+ dns_zone_setkeyopt(zone, DNS_ZONEKEY_MAINTAIN, maint);
+ dns_zone_setkeyopt(zone, DNS_ZONEKEY_CREATE, create);
+ }
}
/*
@@ -982,6 +1420,11 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
cfg_obj_asboolean(obj));
break;
+ case dns_zone_staticstub:
+ RETERR(configure_staticstub(zoptions, zone, zname,
+ default_dbtype));
+ break;
+
default:
break;
}
@@ -989,6 +1432,31 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
return (ISC_R_SUCCESS);
}
+
+#ifdef DLZ
+/*
+ * Set up a DLZ zone as writeable
+ */
+isc_result_t
+ns_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone,
+ dns_rdataclass_t rdclass, dns_name_t *name)
+{
+ dns_db_t *db = NULL;
+ isc_time_t now;
+ isc_result_t result;
+
+ TIME_NOW(&now);
+
+ dns_zone_settype(zone, dns_zone_dlz);
+ result = dns_sdlz_setdb(dlzdatabase, rdclass, name, &db);
+ if (result != ISC_R_SUCCESS)
+ return result;
+ result = dns_zone_dlzpostload(zone, db);
+ dns_db_detach(&db);
+ return result;
+}
+#endif
+
isc_boolean_t
ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) {
const cfg_obj_t *zoptions = NULL;
@@ -1001,6 +1469,13 @@ ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) {
if (zonetype_fromconfig(zoptions) != dns_zone_gettype(zone))
return (ISC_FALSE);
+ /*
+ * We always reconfigure a static-stub zone for simplicity, assuming
+ * the amount of data to be loaded is small.
+ */
+ if (zonetype_fromconfig(zoptions) == dns_zone_staticstub)
+ return (ISC_FALSE);
+
obj = NULL;
(void)cfg_map_get(zoptions, "file", &obj);
if (obj != NULL)
diff --git a/contrib/bind9/bin/nsupdate/Makefile.in b/contrib/bind9/bin/nsupdate/Makefile.in
index f7f6346..a65aad9 100644
--- a/contrib/bind9/bin/nsupdate/Makefile.in
+++ b/contrib/bind9/bin/nsupdate/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2006-2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2006-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.29 2008-08-29 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.36 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -24,7 +24,7 @@ top_srcdir = @top_srcdir@
@BIND9_MAKE_INCLUDES@
CINCLUDES = ${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \
- ${ISC_INCLUDES} @DST_GSSAPI_INC@
+ ${ISC_INCLUDES} ${ISCCFG_INCLUDES} @DST_GSSAPI_INC@
CDEFINES = @USE_GSSAPI@
CWARNINGS =
@@ -33,6 +33,7 @@ LWRESLIBS = ../../lib/lwres/liblwres.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
@@ -43,7 +44,9 @@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
DEPLIBS = ${DNSDEPLIBS} ${BIND9DEPLIBS} ${ISCDEPLIBS} ${ISCCFGDEPLIBS}
-LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCLIBS} ${ISCCFGLIBS} @LIBS@
+LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
+
+NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} ${ISCCFGLIBS} ${ISCNOSYMLIBS} @LIBS@
SUBDIRS =
@@ -63,8 +66,14 @@ MANOBJS = ${MANPAGES} ${HTMLPAGES}
@BIND9_MAKE_RULES@
+nsupdate.@O@: nsupdate.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DSESSION_KEYFILE=\"${localstatedir}/run/named/session.key\" \
+ -c ${srcdir}/nsupdate.c
+
nsupdate@EXEEXT@: nsupdate.@O@ ${UOBJS} ${DEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ nsupdate.@O@ ${UOBJS} ${LIBS}
+ export BASEOBJS="nsupdate.@O@ ${UOBJS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.1 b/contrib/bind9/bin/nsupdate/nsupdate.1
index 6c03486..9d82891 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.1
+++ b/contrib/bind9/bin/nsupdate/nsupdate.1
@@ -13,18 +13,18 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: nsupdate.1,v 1.3.48.4 2010-07-10 02:06:17 tbox Exp $
+.\" $Id: nsupdate.1,v 1.13 2010-07-10 01:14:19 tbox Exp $
.\"
.hy 0
.ad l
.\" Title: nsupdate
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
-.\" Date: Jun 30, 2000
+.\" Date: Aug 25, 2009
.\" Manual: BIND9
.\" Source: BIND9
.\"
-.TH "NSUPDATE" "1" "Jun 30, 2000" "BIND9" "BIND9"
+.TH "NSUPDATE" "1" "Aug 25, 2009" "BIND9" "BIND9"
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@@ -33,11 +33,11 @@
nsupdate \- Dynamic DNS update utility
.SH "SYNOPSIS"
.HP 9
-\fBnsupdate\fR [\fB\-d\fR] [\fB\-D\fR] [[\fB\-g\fR] | [\fB\-o\fR] | [\fB\-y\ \fR\fB\fI[hmac:]\fR\fIkeyname:secret\fR\fR] | [\fB\-k\ \fR\fB\fIkeyfile\fR\fR]] [\fB\-t\ \fR\fB\fItimeout\fR\fR] [\fB\-u\ \fR\fB\fIudptimeout\fR\fR] [\fB\-r\ \fR\fB\fIudpretries\fR\fR] [\fB\-R\ \fR\fB\fIrandomdev\fR\fR] [\fB\-v\fR] [filename]
+\fBnsupdate\fR [\fB\-d\fR] [\fB\-D\fR] [[\fB\-g\fR] | [\fB\-o\fR] | [\fB\-l\fR] | [\fB\-y\ \fR\fB\fI[hmac:]\fR\fIkeyname:secret\fR\fR] | [\fB\-k\ \fR\fB\fIkeyfile\fR\fR]] [\fB\-t\ \fR\fB\fItimeout\fR\fR] [\fB\-u\ \fR\fB\fIudptimeout\fR\fR] [\fB\-r\ \fR\fB\fIudpretries\fR\fR] [\fB\-R\ \fR\fB\fIrandomdev\fR\fR] [\fB\-v\fR] [filename]
.SH "DESCRIPTION"
.PP
\fBnsupdate\fR
-is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. This allows resource records to be added or removed from a zone without manually editing the zone file. A single update request can contain requests to add or remove more than one resource record.
+is used to submit Dynamic DNS Update requests as defined in RFC 2136 to a name server. This allows resource records to be added or removed from a zone without manually editing the zone file. A single update request can contain requests to add or remove more than one resource record.
.PP
Zones that are under dynamic control via
\fBnsupdate\fR
@@ -60,7 +60,11 @@ option makes
report additional debugging information to
\fB\-d\fR.
.PP
-Transaction signatures can be used to authenticate the Dynamic DNS updates. These use the TSIG resource record type described in RFC2845 or the SIG(0) record described in RFC3535 and RFC2931 or GSS\-TSIG as described in RFC3645. TSIG relies on a shared secret that should only be known to
+The
+\fB\-L\fR
+option with an integer argument of zero or higher sets the logging debug level. If zero, logging is disabled.
+.PP
+Transaction signatures can be used to authenticate the Dynamic DNS updates. These use the TSIG resource record type described in RFC 2845 or the SIG(0) record described in RFC 2535 and RFC 2931 or GSS\-TSIG as described in RFC 3645. TSIG relies on a shared secret that should only be known to
\fBnsupdate\fR
and the name server. Currently, the only supported encryption algorithm for TSIG is HMAC\-MD5, which is defined in RFC 2104. Once other algorithms are defined for TSIG, applications will need to ensure they select the appropriate algorithm as well as the key when authenticating each other. For instance, suitable
\fBkey\fR
@@ -71,22 +75,22 @@ statements would be added to
so that the name server can associate the appropriate secret key and algorithm with the IP address of the client application that will be using TSIG authentication. SIG(0) uses public key cryptography. To use a SIG(0) key, the public key must be stored in a KEY record in a zone served by the name server.
\fBnsupdate\fR
does not read
-\fI/etc/named.conf\fR. GSS\-TSIG uses Kerberos credentials.
+\fI/etc/named.conf\fR.
+.PP
+GSS\-TSIG uses Kerberos credentials. Standard GSS\-TSIG mode is switched on with the
+\fB\-g\fR
+flag. A non\-standards\-compliant variant of GSS\-TSIG used by Windows 2000 can be switched on with the
+\fB\-o\fR
+flag.
.PP
\fBnsupdate\fR
uses the
\fB\-y\fR
or
\fB\-k\fR
-option to provide the shared secret needed to generate a TSIG record for authenticating Dynamic DNS update requests, default type HMAC\-MD5. These options are mutually exclusive. With the
-\fB\-k\fR
-option,
-\fBnsupdate\fR
-reads the shared secret from the file
-\fIkeyfile\fR, whose name is of the form
-\fIK{name}.+157.+{random}.private\fR. For historical reasons, the file
-\fIK{name}.+157.+{random}.key\fR
-must also be present. When the
+option to provide the shared secret needed to generate a TSIG record for authenticating Dynamic DNS update requests, default type HMAC\-MD5. These options are mutually exclusive.
+.PP
+When the
\fB\-y\fR
option is used, a signature is generated from
[\fIhmac:\fR]\fIkeyname:secret.\fR
@@ -99,17 +103,37 @@ option is discouraged because the shared secret is supplied as a command line ar
\fBps\fR(1)
or in a history file maintained by the user's shell.
.PP
-The
+With the
+\fB\-k\fR
+option,
+\fBnsupdate\fR
+reads the shared secret from the file
+\fIkeyfile\fR. Keyfiles may be in two formats: a single file containing a
+\fInamed.conf\fR\-format
+\fBkey\fR
+statement, which may be generated automatically by
+\fBddns\-confgen\fR, or a pair of files whose names are of the format
+\fIK{name}.+157.+{random}.key\fR
+and
+\fIK{name}.+157.+{random}.private\fR, which can be generated by
+\fBdnssec\-keygen\fR. The
\fB\-k\fR
may also be used to specify a SIG(0) key used to authenticate Dynamic DNS update requests. In this case, the key specified is not an HMAC\-MD5 key.
.PP
-The
-\fB\-g\fR
-and
-\fB\-o\fR
-specify that GSS\-TSIG is to be used. The
-\fB\-o\fR
-should only be used with old Microsoft Windows 2000 servers.
+\fBnsupdate\fR
+can be run in a local\-host only mode using the
+\fB\-l\fR
+flag. This sets the server address to localhost (disabling the
+\fBserver\fR
+so that the server address cannot be overridden). Connections to the local server will use a TSIG key found in
+\fI/var/run/named/session.key\fR, which is automatically generated by
+\fBnamed\fR
+if any local master zone has set
+\fBupdate\-policy\fR
+to
+\fBlocal\fR. The location of this key file can be overridden with the
+\fB\-k\fR
+option.
.PP
By default,
\fBnsupdate\fR
@@ -120,6 +144,10 @@ option makes
use a TCP connection. This may be preferable when a batch of update requests is made.
.PP
The
+\fB\-p\fR
+sets the default port number to use for connections to a name server. The default is 53.
+.PP
+The
\fB\-t\fR
option sets the maximum time an update request can take before it is aborted. The default is 300 seconds. Zero can be used to disable the timeout.
.PP
@@ -367,7 +395,7 @@ with IP address 172.16.1.1 is added. The newly\-added record has a 1 day TTL (86
.sp
.PP
The prerequisite condition gets the name server to check that there are no resource records of any type for
-\fBnickname.example.com\fR. If there are, the update request fails. If this name does not exist, a CNAME for it is added. This ensures that when the CNAME is added, it cannot conflict with the long\-standing rule in RFC1034 that a name must not exist as any other record type if it exists as a CNAME. (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have RRSIG, DNSKEY and NSEC records.)
+\fBnickname.example.com\fR. If there are, the update request fails. If this name does not exist, a CNAME for it is added. This ensures that when the CNAME is added, it cannot conflict with the long\-standing rule in RFC 1034 that a name must not exist as any other record type if it exists as a CNAME. (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have RRSIG, DNSKEY and NSEC records.)
.SH "FILES"
.PP
\fB/etc/resolv.conf\fR
@@ -375,6 +403,11 @@ The prerequisite condition gets the name server to check that there are no resou
used to identify default name server
.RE
.PP
+\fB/var/run/named/session.key\fR
+.RS 4
+sets the default TSIG key for use in local\-only mode
+.RE
+.PP
\fBK{name}.+157.+{random}.key\fR
.RS 4
base\-64 encoding of HMAC\-MD5 key created by
@@ -388,14 +421,15 @@ base\-64 encoding of HMAC\-MD5 key created by
.RE
.SH "SEE ALSO"
.PP
-\fBRFC2136\fR(),
-\fBRFC3007\fR(),
-\fBRFC2104\fR(),
-\fBRFC2845\fR(),
-\fBRFC1034\fR(),
-\fBRFC2535\fR(),
-\fBRFC2931\fR(),
+RFC 2136,
+RFC 3007,
+RFC 2104,
+RFC 2845,
+RFC 1034,
+RFC 2535,
+RFC 2931,
\fBnamed\fR(8),
+\fBddns\-confgen\fR(8),
\fBdnssec\-keygen\fR(8).
.SH "BUGS"
.PP
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.c b/contrib/bind9/bin/nsupdate/nsupdate.c
index 69d390d..ed01a47 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.c
+++ b/contrib/bind9/bin/nsupdate/nsupdate.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsupdate.c,v 1.163.48.15 2010-12-09 04:30:57 tbox Exp $ */
+/* $Id: nsupdate.c,v 1.193 2011-01-10 05:32:03 marka Exp $ */
/*! \file */
@@ -33,6 +33,7 @@
#include <isc/commandline.h>
#include <isc/entropy.h>
#include <isc/event.h>
+#include <isc/file.h>
#include <isc/hash.h>
#include <isc/lex.h>
#include <isc/log.h>
@@ -50,6 +51,8 @@
#include <isc/types.h>
#include <isc/util.h>
+#include <isccfg/namedconf.h>
+
#include <dns/callbacks.h>
#include <dns/dispatch.h>
#include <dns/dnssec.h>
@@ -78,6 +81,7 @@
#ifdef GSSAPI
#include <dst/gssapi.h>
+#include ISC_PLATFORM_KRB5HEADER
#endif
#include <bind9/getaddresses.h>
@@ -106,6 +110,8 @@ extern int h_errno;
#define DNSDEFAULTPORT 53
+static isc_uint16_t dnsport = DNSDEFAULTPORT;
+
#ifndef RESOLV_CONF
#define RESOLV_CONF "/etc/resolv.conf"
#endif
@@ -119,6 +125,7 @@ static isc_boolean_t usevc = ISC_FALSE;
static isc_boolean_t usegsstsig = ISC_FALSE;
static isc_boolean_t use_win2k_gsstsig = ISC_FALSE;
static isc_boolean_t tried_other_gsstsig = ISC_FALSE;
+static isc_boolean_t local_only = ISC_FALSE;
static isc_taskmgr_t *taskmgr = NULL;
static isc_task_t *global_task = NULL;
static isc_event_t *global_event = NULL;
@@ -148,7 +155,8 @@ static isc_sockaddr_t *userserver = NULL;
static isc_sockaddr_t *localaddr = NULL;
static isc_sockaddr_t *serveraddr = NULL;
static isc_sockaddr_t tempaddr;
-static char *keystr = NULL, *keyfile = NULL;
+static const char *keyfile = NULL;
+static char *keystr = NULL;
static isc_entropy_t *entropy = NULL;
static isc_boolean_t shuttingdown = ISC_FALSE;
static FILE *input;
@@ -174,8 +182,10 @@ typedef struct nsu_requestinfo {
static void
sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
dns_message_t *msg, dns_request_t **request);
-static void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+
+ISC_PLATFORM_NORETURN_PRE static void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
static void
debug(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
@@ -406,7 +416,7 @@ reset_system(void) {
if (tsigkey != NULL)
dns_tsigkey_detach(&tsigkey);
if (gssring != NULL)
- dns_tsigkeyring_destroy(&gssring);
+ dns_tsigkeyring_detach(&gssring);
tried_other_gsstsig = ISC_FALSE;
}
}
@@ -479,6 +489,19 @@ parse_hmac(dns_name_t **hmac, const char *hmacstr, size_t len) {
return (digestbits);
}
+static int
+basenamelen(const char *file) {
+ int len = strlen(file);
+
+ if (len > 1 && file[len - 1] == '.')
+ len -= 1;
+ else if (len > 8 && strcmp(file + len - 8, ".private") == 0)
+ len -= 8;
+ else if (len > 4 && strcmp(file + len - 4, ".key") == 0)
+ len -= 4;
+ return (len);
+}
+
static void
setup_keystr(void) {
unsigned char *secret = NULL;
@@ -520,8 +543,7 @@ setup_keystr(void) {
isc_buffer_add(&keynamesrc, n - name);
debug("namefromtext");
- result = dns_name_fromtext(keyname, &keynamesrc, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &keynamesrc, dns_rootname, 0, NULL);
check_result(result, "dns_name_fromtext");
secretlen = strlen(secretstr) * 3 / 4;
@@ -553,21 +575,67 @@ setup_keystr(void) {
isc_mem_free(mctx, secret);
}
-static int
-basenamelen(const char *file) {
- int len = strlen(file);
+/*
+ * Get a key from a named.conf format keyfile
+ */
+static isc_result_t
+read_sessionkey(isc_mem_t *mctx, isc_log_t *lctx) {
+ cfg_parser_t *pctx = NULL;
+ cfg_obj_t *sessionkey = NULL;
+ const cfg_obj_t *key = NULL;
+ const cfg_obj_t *secretobj = NULL;
+ const cfg_obj_t *algorithmobj = NULL;
+ const char *keyname;
+ const char *secretstr;
+ const char *algorithm;
+ isc_result_t result;
+ int len;
- if (len > 1 && file[len - 1] == '.')
- len -= 1;
- else if (len > 8 && strcmp(file + len - 8, ".private") == 0)
- len -= 8;
- else if (len > 4 && strcmp(file + len - 4, ".key") == 0)
- len -= 4;
- return (len);
+ if (! isc_file_exists(keyfile))
+ return (ISC_R_FILENOTFOUND);
+
+ result = cfg_parser_create(mctx, lctx, &pctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_parse_file(pctx, keyfile, &cfg_type_sessionkey,
+ &sessionkey);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_map_get(sessionkey, "key", &key);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ (void) cfg_map_get(key, "secret", &secretobj);
+ (void) cfg_map_get(key, "algorithm", &algorithmobj);
+ if (secretobj == NULL || algorithmobj == NULL)
+ fatal("key must have algorithm and secret");
+
+ keyname = cfg_obj_asstring(cfg_map_getname(key));
+ secretstr = cfg_obj_asstring(secretobj);
+ algorithm = cfg_obj_asstring(algorithmobj);
+
+ len = strlen(algorithm) + strlen(keyname) + strlen(secretstr) + 3;
+ keystr = isc_mem_allocate(mctx, len);
+ snprintf(keystr, len, "%s:%s:%s", algorithm, keyname, secretstr);
+ setup_keystr();
+
+ cleanup:
+ if (pctx != NULL) {
+ if (sessionkey != NULL)
+ cfg_obj_destroy(pctx, &sessionkey);
+ cfg_parser_destroy(&pctx);
+ }
+
+ if (keystr != NULL)
+ isc_mem_free(mctx, keystr);
+
+ return (result);
}
static void
-setup_keyfile(void) {
+setup_keyfile(isc_mem_t *mctx, isc_log_t *lctx) {
dst_key_t *dstkey = NULL;
isc_result_t result;
dns_name_t *hmacname = NULL;
@@ -577,15 +645,25 @@ setup_keyfile(void) {
if (sig0key != NULL)
dst_key_free(&sig0key);
- result = dst_key_fromnamedfile(keyfile,
+ /* Try reading the key from a K* pair */
+ result = dst_key_fromnamedfile(keyfile, NULL,
DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
&dstkey);
+
+ /* If that didn't work, try reading it as a session.key keyfile */
+ if (result != ISC_R_SUCCESS) {
+ result = read_sessionkey(mctx, lctx);
+ if (result == ISC_R_SUCCESS)
+ return;
+ }
+
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "could not read key from %.*s.{private,key}: "
"%s\n", basenamelen(keyfile), keyfile,
isc_result_totext(result));
return;
}
+
switch (dst_key_alg(dstkey)) {
case DST_ALG_HMACMD5:
hmacname = DNS_TSIG_HMACMD5_NAME;
@@ -748,7 +826,7 @@ setup_system(void) {
if (servers == NULL)
fatal("out of memory");
localhost.s_addr = htonl(INADDR_LOOPBACK);
- isc_sockaddr_fromin(&servers[0], &localhost, DNSDEFAULTPORT);
+ isc_sockaddr_fromin(&servers[0], &localhost, dnsport);
} else {
servers = isc_mem_get(mctx, ns_total * sizeof(isc_sockaddr_t));
if (servers == NULL)
@@ -757,12 +835,12 @@ setup_system(void) {
if (lwconf->nameservers[i].family == LWRES_ADDRTYPE_V4) {
struct in_addr in4;
memcpy(&in4, lwconf->nameservers[i].address, 4);
- isc_sockaddr_fromin(&servers[i], &in4, DNSDEFAULTPORT);
+ isc_sockaddr_fromin(&servers[i], &in4, dnsport);
} else {
struct in6_addr in6;
memcpy(&in6, lwconf->nameservers[i].address, 16);
isc_sockaddr_fromin6(&servers[i], &in6,
- DNSDEFAULTPORT);
+ dnsport);
}
}
}
@@ -829,8 +907,13 @@ setup_system(void) {
if (keystr != NULL)
setup_keystr();
- else if (keyfile != NULL)
- setup_keyfile();
+ else if (local_only) {
+ result = read_sessionkey(mctx, lctx);
+ if (result != ISC_R_SUCCESS)
+ fatal("can't read key from %s: %s\n",
+ keyfile, isc_result_totext(result));
+ } else if (keyfile != NULL)
+ setup_keyfile(mctx, lctx);
}
static void
@@ -847,7 +930,7 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
INSIST(count == 1);
}
-#define PARSE_ARGS_FMT "dDMl:y:govk:rR::t:u:"
+#define PARSE_ARGS_FMT "dDML:y:ghlovk:p:rR::t:u:"
static void
pre_parse_args(int argc, char **argv) {
@@ -864,10 +947,11 @@ pre_parse_args(int argc, char **argv) {
break;
case '?':
+ case 'h':
if (isc_commandline_option != '?')
fprintf(stderr, "%s: invalid argument -%c\n",
argv[0], isc_commandline_option);
- fprintf(stderr, "usage: nsupdate [-d] "
+ fprintf(stderr, "usage: nsupdate [-dD] [-L level] [-l]"
"[-g | -o | -y keyname:secret | -k keyfile] "
"[-v] [filename]\n");
exit(1);
@@ -899,6 +983,9 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
case 'M':
break;
case 'l':
+ local_only = ISC_TRUE;
+ break;
+ case 'L':
result = isc_parse_uint32(&i, isc_commandline_argument,
10);
if (result != ISC_R_SUCCESS) {
@@ -925,6 +1012,15 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
usegsstsig = ISC_TRUE;
use_win2k_gsstsig = ISC_TRUE;
break;
+ case 'p':
+ result = isc_parse_uint16(&dnsport,
+ isc_commandline_argument, 10);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "bad port number "
+ "'%s'\n", isc_commandline_argument);
+ exit(1);
+ }
+ break;
case 't':
result = isc_parse_uint32(&timeout,
isc_commandline_argument, 10);
@@ -970,6 +1066,22 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
exit(1);
}
+ if (local_only) {
+ struct in_addr localhost;
+
+ if (keyfile == NULL)
+ keyfile = SESSION_KEYFILE;
+
+ if (userserver == NULL) {
+ userserver = isc_mem_get(mctx, sizeof(isc_sockaddr_t));
+ if (userserver == NULL)
+ fatal("out of memory");
+ }
+
+ localhost.s_addr = htonl(INADDR_LOOPBACK);
+ isc_sockaddr_fromin(userserver, &localhost, dnsport);
+ }
+
#ifdef GSSAPI
if (usegsstsig && (keyfile != NULL || keystr != NULL)) {
fprintf(stderr, "%s: cannot specify -g with -k or -y\n",
@@ -978,7 +1090,7 @@ parse_args(int argc, char **argv, isc_mem_t *mctx, isc_entropy_t **ectx) {
}
#else
if (usegsstsig) {
- fprintf(stderr, "%s: cannot specify -g or -o, " \
+ fprintf(stderr, "%s: cannot specify -g or -o, " \
"program not linked with GSS API Library\n",
argv[0]);
exit(1);
@@ -1024,8 +1136,7 @@ parse_name(char **cmdlinep, dns_message_t *msg, dns_name_t **namep) {
dns_message_takebuffer(msg, &namebuf);
isc_buffer_init(&source, word, strlen(word));
isc_buffer_add(&source, strlen(word));
- result = dns_name_fromtext(*namep, &source, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(*namep, &source, dns_rootname, 0, NULL);
check_result(result, "dns_name_fromtext");
isc_buffer_invalidate(&source);
return (STATUS_MORE);
@@ -1227,6 +1338,11 @@ evaluate_server(char *cmdline) {
char *word, *server;
long port;
+ if (local_only) {
+ fprintf(stderr, "cannot reset server in localhost-only mode\n");
+ return (STATUS_SYNTAX);
+ }
+
word = nsu_strsep(&cmdline, " \t\r\n");
if (*word == 0) {
fprintf(stderr, "could not read server name\n");
@@ -1236,7 +1352,7 @@ evaluate_server(char *cmdline) {
word = nsu_strsep(&cmdline, " \t\r\n");
if (*word == 0)
- port = DNSDEFAULTPORT;
+ port = dnsport;
else {
char *endp;
port = strtol(word, &endp, 10);
@@ -1342,7 +1458,7 @@ evaluate_key(char *cmdline) {
isc_buffer_init(&b, namestr, strlen(namestr));
isc_buffer_add(&b, strlen(namestr));
- result = dns_name_fromtext(keyname, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "could not parse key name\n");
return (STATUS_SYNTAX);
@@ -1399,8 +1515,7 @@ evaluate_zone(char *cmdline) {
userzone = dns_fixedname_name(&fuserzone);
isc_buffer_init(&b, word, strlen(word));
isc_buffer_add(&b, strlen(word));
- result = dns_name_fromtext(userzone, &b, dns_rootname, ISC_FALSE,
- NULL);
+ result = dns_name_fromtext(userzone, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
userzone = NULL; /* Lest it point to an invalid name */
fprintf(stderr, "could not parse zone name\n");
@@ -1852,9 +1967,9 @@ get_next_command(void) {
"server address [port] (set master server for zone)\n"
"send (send the update request)\n"
"show (show the update request)\n"
-"answer (show the answer to the last request)\n"
+"answer (show the answer to the last request)\n"
"quit (quit, any pending update is not sent\n"
-"help (display this message_\n"
+"help (display this message_\n"
"key [hmac:]keyname secret (use TSIG to sign the request)\n"
"gsstsig (use GSS_TSIG to sign the request)\n"
"oldgsstsig (use Microsoft's GSS_TSIG to sign the request)\n"
@@ -2015,7 +2130,7 @@ send_update(dns_name_t *zonename, isc_sockaddr_t *master,
{
isc_result_t result;
dns_request_t *request = NULL;
- unsigned int options = 0;
+ unsigned int options = DNS_REQUESTOPT_CASE;
ddebug("send_update()");
@@ -2248,7 +2363,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
result = dns_name_totext(&master, ISC_TRUE, &buf);
check_result(result, "dns_name_totext");
serverstr[isc_buffer_usedlength(&buf)] = 0;
- get_address(serverstr, DNSDEFAULTPORT, &tempaddr);
+ get_address(serverstr, dnsport, &tempaddr);
serveraddr = &tempaddr;
}
dns_rdata_freestruct(&soa);
@@ -2319,9 +2434,60 @@ sendrequest(isc_sockaddr_t *srcaddr, isc_sockaddr_t *destaddr,
}
#ifdef GSSAPI
+
+/*
+ * Get the realm from the users kerberos ticket if possible
+ */
static void
-start_gssrequest(dns_name_t *master)
+get_ticket_realm(isc_mem_t *mctx)
{
+ krb5_context ctx;
+ krb5_error_code rc;
+ krb5_ccache ccache;
+ krb5_principal princ;
+ char *name, *ticket_realm;
+
+ rc = krb5_init_context(&ctx);
+ if (rc != 0)
+ return;
+
+ rc = krb5_cc_default(ctx, &ccache);
+ if (rc != 0) {
+ krb5_free_context(ctx);
+ return;
+ }
+
+ rc = krb5_cc_get_principal(ctx, ccache, &princ);
+ if (rc != 0) {
+ krb5_cc_close(ctx, ccache);
+ krb5_free_context(ctx);
+ return;
+ }
+
+ rc = krb5_unparse_name(ctx, princ, &name);
+ if (rc != 0) {
+ krb5_free_principal(ctx, princ);
+ krb5_cc_close(ctx, ccache);
+ krb5_free_context(ctx);
+ return;
+ }
+
+ ticket_realm = strrchr(name, '@');
+ if (ticket_realm != NULL) {
+ realm = isc_mem_strdup(mctx, ticket_realm);
+ }
+
+ free(name);
+ krb5_free_principal(ctx, princ);
+ krb5_cc_close(ctx, ccache);
+ krb5_free_context(ctx);
+ if (realm != NULL && debugging)
+ fprintf(stderr, "Found realm from ticket: %s\n", realm+1);
+}
+
+
+static void
+start_gssrequest(dns_name_t *master) {
gss_ctx_id_t context;
isc_buffer_t buf;
isc_result_t result;
@@ -2332,12 +2498,13 @@ start_gssrequest(dns_name_t *master)
dns_fixedname_t fname;
char namestr[DNS_NAME_FORMATSIZE];
char keystr[DNS_NAME_FORMATSIZE];
+ char *err_message = NULL;
debug("start_gssrequest");
usevc = ISC_TRUE;
if (gssring != NULL)
- dns_tsigkeyring_destroy(&gssring);
+ dns_tsigkeyring_detach(&gssring);
gssring = NULL;
result = dns_tsigkeyring_create(mctx, &gssring);
@@ -2352,13 +2519,16 @@ start_gssrequest(dns_name_t *master)
fatal("out of memory");
}
if (userserver == NULL)
- get_address(namestr, DNSDEFAULTPORT, kserver);
+ get_address(namestr, dnsport, kserver);
else
(void)memcpy(kserver, userserver, sizeof(isc_sockaddr_t));
dns_fixedname_init(&fname);
servname = dns_fixedname_name(&fname);
+ if (realm == NULL)
+ get_ticket_realm(mctx);
+
result = isc_string_printf(servicename, sizeof(servicename),
"DNS/%s%s", namestr, realm ? realm : "");
if (result != ISC_R_SUCCESS)
@@ -2366,8 +2536,7 @@ start_gssrequest(dns_name_t *master)
isc_result_totext(result));
isc_buffer_init(&buf, servicename, strlen(servicename));
isc_buffer_add(&buf, strlen(servicename));
- result = dns_name_fromtext(servname, &buf, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(servname, &buf, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
fatal("dns_name_fromtext(servname) failed: %s",
isc_result_totext(result));
@@ -2384,8 +2553,7 @@ start_gssrequest(dns_name_t *master)
isc_buffer_init(&buf, keystr, strlen(keystr));
isc_buffer_add(&buf, strlen(keystr));
- result = dns_name_fromtext(keyname, &buf, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &buf, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
fatal("dns_name_fromtext(keyname) failed: %s",
isc_result_totext(result));
@@ -2402,9 +2570,11 @@ start_gssrequest(dns_name_t *master)
/* Build first request. */
context = GSS_C_NO_CONTEXT;
result = dns_tkey_buildgssquery(rmsg, keyname, servname, NULL, 0,
- &context, use_win2k_gsstsig);
+ &context, use_win2k_gsstsig,
+ mctx, &err_message);
if (result == ISC_R_FAILURE)
- fatal("Check your Kerberos ticket, it may have expired.");
+ fatal("tkey query failed: %s",
+ err_message != NULL ? err_message : "unknown error");
if (result != ISC_R_SUCCESS)
fatal("dns_tkey_buildgssquery failed: %s",
isc_result_totext(result));
@@ -2453,6 +2623,7 @@ recvgss(isc_task_t *task, isc_event_t *event) {
isc_buffer_t buf;
dns_name_t *servname;
dns_fixedname_t fname;
+ char *err_message = NULL;
UNUSED(task);
@@ -2535,14 +2706,14 @@ recvgss(isc_task_t *task, isc_event_t *event) {
servname = dns_fixedname_name(&fname);
isc_buffer_init(&buf, servicename, strlen(servicename));
isc_buffer_add(&buf, strlen(servicename));
- result = dns_name_fromtext(servname, &buf, dns_rootname,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(servname, &buf, dns_rootname, 0, NULL);
check_result(result, "dns_name_fromtext");
tsigkey = NULL;
result = dns_tkey_gssnegotiate(tsigquery, rcvmsg, servname,
&context, &tsigkey, gssring,
- use_win2k_gsstsig);
+ use_win2k_gsstsig,
+ &err_message);
switch (result) {
case DNS_R_CONTINUE:
@@ -2585,7 +2756,9 @@ recvgss(isc_task_t *task, isc_event_t *event) {
break;
default:
- fatal("dns_tkey_negotiategss: %s", isc_result_totext(result));
+ fatal("dns_tkey_negotiategss: %s %s",
+ isc_result_totext(result),
+ err_message != NULL ? err_message : "");
}
done:
@@ -2695,8 +2868,8 @@ cleanup(void) {
dns_tsigkey_detach(&tsigkey);
}
if (gssring != NULL) {
- ddebug("Destroying GSS-TSIG keyring");
- dns_tsigkeyring_destroy(&gssring);
+ ddebug("Detaching GSS-TSIG keyring");
+ dns_tsigkeyring_detach(&gssring);
}
if (kserver != NULL) {
isc_mem_put(mctx, kserver, sizeof(isc_sockaddr_t));
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.docbook b/contrib/bind9/bin/nsupdate/nsupdate.docbook
index 4069a2b..2a92af4 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.docbook
+++ b/contrib/bind9/bin/nsupdate/nsupdate.docbook
@@ -18,10 +18,10 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nsupdate.docbook,v 1.34.48.5 2010-07-09 23:45:50 tbox Exp $ -->
+<!-- $Id: nsupdate.docbook,v 1.44 2010-07-09 23:46:51 tbox Exp $ -->
<refentry id="man.nsupdate">
<refentryinfo>
- <date>Jun 30, 2000</date>
+ <date>Aug 25, 2009</date>
</refentryinfo>
<refmeta>
<refentrytitle><application>nsupdate</application></refentrytitle>
@@ -61,6 +61,7 @@
<group>
<arg><option>-g</option></arg>
<arg><option>-o</option></arg>
+ <arg><option>-l</option></arg>
<arg><option>-y <replaceable class="parameter"><optional>hmac:</optional>keyname:secret</replaceable></option></arg>
<arg><option>-k <replaceable class="parameter">keyfile</replaceable></option></arg>
</group>
@@ -76,7 +77,7 @@
<refsect1>
<title>DESCRIPTION</title>
<para><command>nsupdate</command>
- is used to submit Dynamic DNS Update requests as defined in RFC2136
+ is used to submit Dynamic DNS Update requests as defined in RFC 2136
to a name server.
This allows resource records to be added or removed from a zone
without manually editing the zone file.
@@ -112,10 +113,14 @@
report additional debugging information to <option>-d</option>.
</para>
<para>
+ The <option>-L</option> option with an integer argument of zero or
+ higher sets the logging debug level. If zero, logging is disabled.
+ </para>
+ <para>
Transaction signatures can be used to authenticate the Dynamic
DNS updates. These use the TSIG resource record type described
- in RFC2845 or the SIG(0) record described in RFC3535 and
- RFC2931 or GSS-TSIG as described in RFC3645. TSIG relies on
+ in RFC 2845 or the SIG(0) record described in RFC 2535 and
+ RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on
a shared secret that should only be known to
<command>nsupdate</command> and the name server. Currently,
the only supported encryption algorithm for TSIG is HMAC-MD5,
@@ -132,46 +137,61 @@
record in a zone served by the name server.
<command>nsupdate</command> does not read
<filename>/etc/named.conf</filename>.
- GSS-TSIG uses Kerberos credentials.
+ </para>
+ <para>
+ GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode
+ is switched on with the <option>-g</option> flag. A
+ non-standards-compliant variant of GSS-TSIG used by Windows
+ 2000 can be switched on with the <option>-o</option> flag.
</para>
<para><command>nsupdate</command>
uses the <option>-y</option> or <option>-k</option> option
to provide the shared secret needed to generate a TSIG record
for authenticating Dynamic DNS update requests, default type
- HMAC-MD5. These options are mutually exclusive. With the
- <option>-k</option> option, <command>nsupdate</command> reads
- the shared secret from the file <parameter>keyfile</parameter>,
- whose name is of the form
- <filename>K{name}.+157.+{random}.private</filename>. For
- historical reasons, the file
- <filename>K{name}.+157.+{random}.key</filename> must also be
- present. When the <option>-y</option> option is used, a
- signature is generated from
+ HMAC-MD5. These options are mutually exclusive.
+ </para>
+ <para>
+ When the <option>-y</option> option is used, a signature is
+ generated from
<optional><parameter>hmac:</parameter></optional><parameter>keyname:secret.</parameter>
<parameter>keyname</parameter> is the name of the key, and
- <parameter>secret</parameter> is the base64 encoded shared
- secret. Use of the <option>-y</option> option is discouraged
- because the shared secret is supplied as a command line
- argument in clear text. This may be visible in the output
- from
+ <parameter>secret</parameter> is the base64 encoded shared secret.
+ Use of the <option>-y</option> option is discouraged because the
+ shared secret is supplied as a command line argument in clear text.
+ This may be visible in the output from
<citerefentry>
- <refentrytitle>ps</refentrytitle><manvolnum>1</manvolnum>
- </citerefentry> or in a history file maintained by the user's
- shell.
+ <refentrytitle>ps</refentrytitle><manvolnum>1</manvolnum>
+ </citerefentry>
+ or in a history file maintained by the user's shell.
</para>
<para>
+ With the
+ <option>-k</option> option, <command>nsupdate</command> reads
+ the shared secret from the file <parameter>keyfile</parameter>.
+ Keyfiles may be in two formats: a single file containing
+ a <filename>named.conf</filename>-format <command>key</command>
+ statement, which may be generated automatically by
+ <command>ddns-confgen</command>, or a pair of files whose names are
+ of the format <filename>K{name}.+157.+{random}.key</filename> and
+ <filename>K{name}.+157.+{random}.private</filename>, which can be
+ generated by <command>dnssec-keygen</command>.
The <option>-k</option> may also be used to specify a SIG(0) key used
to authenticate Dynamic DNS update requests. In this case, the key
specified is not an HMAC-MD5 key.
</para>
<para>
- The <option>-g</option> and <option>-o</option> specify that
- GSS-TSIG is to be used. The <option>-o</option> should only
- be used with old Microsoft Windows 2000 servers.
+ <command>nsupdate</command> can be run in a local-host only mode
+ using the <option>-l</option> flag. This sets the server address to
+ localhost (disabling the <command>server</command> so that the server
+ address cannot be overridden). Connections to the local server will
+ use a TSIG key found in <filename>/var/run/named/session.key</filename>,
+ which is automatically generated by <command>named</command> if any
+ local master zone has set <command>update-policy</command> to
+ <command>local</command>. The location of this key file can be
+ overridden with the <option>-k</option> option.
</para>
<para>
- By default,
- <command>nsupdate</command>
+ By default, <command>nsupdate</command>
uses UDP to send update requests to the name server unless they are too
large to fit in a UDP request in which case TCP will be used.
The
@@ -182,6 +202,10 @@
This may be preferable when a batch of update requests is made.
</para>
<para>
+ The <option>-p</option> sets the default port number to use for
+ connections to a name server. The default is 53.
+ </para>
+ <para>
The <option>-t</option> option sets the maximum time an update request
can
take before it is aborted. The default is 300 seconds. Zero can be
@@ -650,9 +674,9 @@
If there are, the update request fails.
If this name does not exist, a CNAME for it is added.
This ensures that when the CNAME is added, it cannot conflict with the
- long-standing rule in RFC1034 that a name must not exist as any other
+ long-standing rule in RFC 1034 that a name must not exist as any other
record type if it exists as a CNAME.
- (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have
+ (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have
RRSIG, DNSKEY and NSEC records.)
</para>
</refsect1>
@@ -671,6 +695,15 @@
</varlistentry>
<varlistentry>
+ <term><constant>/var/run/named/session.key</constant></term>
+ <listitem>
+ <para>
+ sets the default TSIG key for use in local-only mode
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><constant>K{name}.+157.+{random}.key</constant></term>
<listitem>
<para>
@@ -699,36 +732,26 @@
<refsect1>
<title>SEE ALSO</title>
- <para><citerefentry>
- <refentrytitle>RFC2136</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC3007</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC2104</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC2845</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC1034</refentrytitle>
- </citerefentry>,
- <citerefentry>
- <refentrytitle>RFC2535</refentrytitle>
- </citerefentry>,
+ <para>
+ <citetitle>RFC 2136</citetitle>,
+ <citetitle>RFC 3007</citetitle>,
+ <citetitle>RFC 2104</citetitle>,
+ <citetitle>RFC 2845</citetitle>,
+ <citetitle>RFC 1034</citetitle>,
+ <citetitle>RFC 2535</citetitle>,
+ <citetitle>RFC 2931</citetitle>,
<citerefentry>
- <refentrytitle>RFC2931</refentrytitle>
+ <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>,
<citerefentry>
- <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
+ <refentrytitle>ddns-confgen</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>,
<citerefentry>
<refentrytitle>dnssec-keygen</refentrytitle><manvolnum>8</manvolnum>
</citerefentry>.
</para>
-
</refsect1>
+
<refsect1>
<title>BUGS</title>
<para>
diff --git a/contrib/bind9/bin/nsupdate/nsupdate.html b/contrib/bind9/bin/nsupdate/nsupdate.html
index a383617..f488315 100644
--- a/contrib/bind9/bin/nsupdate/nsupdate.html
+++ b/contrib/bind9/bin/nsupdate/nsupdate.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: nsupdate.html,v 1.40.48.4 2010-07-10 02:06:17 tbox Exp $ -->
+<!-- $Id: nsupdate.html,v 1.50 2010-07-10 01:14:19 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -29,12 +29,12 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
+<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-l</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543452"></a><h2>DESCRIPTION</h2>
+<a name="id2543457"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">nsupdate</strong></span>
- is used to submit Dynamic DNS Update requests as defined in RFC2136
+ is used to submit Dynamic DNS Update requests as defined in RFC 2136
to a name server.
This allows resource records to be added or removed from a zone
without manually editing the zone file.
@@ -70,10 +70,14 @@
report additional debugging information to <code class="option">-d</code>.
</p>
<p>
+ The <code class="option">-L</code> option with an integer argument of zero or
+ higher sets the logging debug level. If zero, logging is disabled.
+ </p>
+<p>
Transaction signatures can be used to authenticate the Dynamic
DNS updates. These use the TSIG resource record type described
- in RFC2845 or the SIG(0) record described in RFC3535 and
- RFC2931 or GSS-TSIG as described in RFC3645. TSIG relies on
+ in RFC 2845 or the SIG(0) record described in RFC 2535 and
+ RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on
a shared secret that should only be known to
<span><strong class="command">nsupdate</strong></span> and the name server. Currently,
the only supported encryption algorithm for TSIG is HMAC-MD5,
@@ -90,44 +94,59 @@
record in a zone served by the name server.
<span><strong class="command">nsupdate</strong></span> does not read
<code class="filename">/etc/named.conf</code>.
- GSS-TSIG uses Kerberos credentials.
+ </p>
+<p>
+ GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode
+ is switched on with the <code class="option">-g</code> flag. A
+ non-standards-compliant variant of GSS-TSIG used by Windows
+ 2000 can be switched on with the <code class="option">-o</code> flag.
</p>
<p><span><strong class="command">nsupdate</strong></span>
uses the <code class="option">-y</code> or <code class="option">-k</code> option
to provide the shared secret needed to generate a TSIG record
for authenticating Dynamic DNS update requests, default type
- HMAC-MD5. These options are mutually exclusive. With the
- <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
- the shared secret from the file <em class="parameter"><code>keyfile</code></em>,
- whose name is of the form
- <code class="filename">K{name}.+157.+{random}.private</code>. For
- historical reasons, the file
- <code class="filename">K{name}.+157.+{random}.key</code> must also be
- present. When the <code class="option">-y</code> option is used, a
- signature is generated from
+ HMAC-MD5. These options are mutually exclusive.
+ </p>
+<p>
+ When the <code class="option">-y</code> option is used, a signature is
+ generated from
[<span class="optional"><em class="parameter"><code>hmac:</code></em></span>]<em class="parameter"><code>keyname:secret.</code></em>
<em class="parameter"><code>keyname</code></em> is the name of the key, and
- <em class="parameter"><code>secret</code></em> is the base64 encoded shared
- secret. Use of the <code class="option">-y</code> option is discouraged
- because the shared secret is supplied as a command line
- argument in clear text. This may be visible in the output
- from
- <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span> or in a history file maintained by the user's
- shell.
+ <em class="parameter"><code>secret</code></em> is the base64 encoded shared secret.
+ Use of the <code class="option">-y</code> option is discouraged because the
+ shared secret is supplied as a command line argument in clear text.
+ This may be visible in the output from
+ <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span>
+ or in a history file maintained by the user's shell.
</p>
<p>
+ With the
+ <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
+ the shared secret from the file <em class="parameter"><code>keyfile</code></em>.
+ Keyfiles may be in two formats: a single file containing
+ a <code class="filename">named.conf</code>-format <span><strong class="command">key</strong></span>
+ statement, which may be generated automatically by
+ <span><strong class="command">ddns-confgen</strong></span>, or a pair of files whose names are
+ of the format <code class="filename">K{name}.+157.+{random}.key</code> and
+ <code class="filename">K{name}.+157.+{random}.private</code>, which can be
+ generated by <span><strong class="command">dnssec-keygen</strong></span>.
The <code class="option">-k</code> may also be used to specify a SIG(0) key used
to authenticate Dynamic DNS update requests. In this case, the key
specified is not an HMAC-MD5 key.
</p>
<p>
- The <code class="option">-g</code> and <code class="option">-o</code> specify that
- GSS-TSIG is to be used. The <code class="option">-o</code> should only
- be used with old Microsoft Windows 2000 servers.
+ <span><strong class="command">nsupdate</strong></span> can be run in a local-host only mode
+ using the <code class="option">-l</code> flag. This sets the server address to
+ localhost (disabling the <span><strong class="command">server</strong></span> so that the server
+ address cannot be overridden). Connections to the local server will
+ use a TSIG key found in <code class="filename">/var/run/named/session.key</code>,
+ which is automatically generated by <span><strong class="command">named</strong></span> if any
+ local master zone has set <span><strong class="command">update-policy</strong></span> to
+ <span><strong class="command">local</strong></span>. The location of this key file can be
+ overridden with the <code class="option">-k</code> option.
</p>
<p>
- By default,
- <span><strong class="command">nsupdate</strong></span>
+ By default, <span><strong class="command">nsupdate</strong></span>
uses UDP to send update requests to the name server unless they are too
large to fit in a UDP request in which case TCP will be used.
The
@@ -138,6 +157,10 @@
This may be preferable when a batch of update requests is made.
</p>
<p>
+ The <code class="option">-p</code> sets the default port number to use for
+ connections to a name server. The default is 53.
+ </p>
+<p>
The <code class="option">-t</code> option sets the maximum time an update request
can
take before it is aborted. The default is 300 seconds. Zero can be
@@ -169,7 +192,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543730"></a><h2>INPUT FORMAT</h2>
+<a name="id2543788"></a><h2>INPUT FORMAT</h2>
<p><span><strong class="command">nsupdate</strong></span>
reads input from
<em class="parameter"><code>filename</code></em>
@@ -457,7 +480,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544642"></a><h2>EXAMPLES</h2>
+<a name="id2544700"></a><h2>EXAMPLES</h2>
<p>
The examples below show how
<span><strong class="command">nsupdate</strong></span>
@@ -504,19 +527,23 @@
If there are, the update request fails.
If this name does not exist, a CNAME for it is added.
This ensures that when the CNAME is added, it cannot conflict with the
- long-standing rule in RFC1034 that a name must not exist as any other
+ long-standing rule in RFC 1034 that a name must not exist as any other
record type if it exists as a CNAME.
- (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have
+ (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have
RRSIG, DNSKEY and NSEC records.)
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544685"></a><h2>FILES</h2>
+<a name="id2544744"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="constant">/etc/resolv.conf</code></span></dt>
<dd><p>
used to identify default name server
</p></dd>
+<dt><span class="term"><code class="constant">/var/run/named/session.key</code></span></dt>
+<dd><p>
+ sets the default TSIG key for use in local-only mode
+ </p></dd>
<dt><span class="term"><code class="constant">K{name}.+157.+{random}.key</code></span></dt>
<dd><p>
base-64 encoding of HMAC-MD5 key created by
@@ -530,20 +557,22 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2544755"></a><h2>SEE ALSO</h2>
-<p><span class="citerefentry"><span class="refentrytitle">RFC2136</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC3007</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2104</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2845</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC1034</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2535</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2931</span></span>,
+<a name="id2544827"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">RFC 2136</em>,
+ <em class="citetitle">RFC 3007</em>,
+ <em class="citetitle">RFC 2104</em>,
+ <em class="citetitle">RFC 2845</em>,
+ <em class="citetitle">RFC 1034</em>,
+ <em class="citetitle">RFC 2535</em>,
+ <em class="citetitle">RFC 2931</em>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">ddns-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2542163"></a><h2>BUGS</h2>
+<a name="id2542154"></a><h2>BUGS</h2>
<p>
The TSIG key is redundantly stored in two separate files.
This is a consequence of nsupdate using the DST library
diff --git a/contrib/bind9/bin/rndc/Makefile.in b/contrib/bind9/bin/rndc/Makefile.in
index 27d4611..6c7c56f 100644
--- a/contrib/bind9/bin/rndc/Makefile.in
+++ b/contrib/bind9/bin/rndc/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000-2002 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.44 2007-06-18 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.49 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -32,6 +32,7 @@ CWARNINGS =
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCLIBS = ../../lib/isccc/libisccc.@A@
ISCLIBS = ../../lib/isc/libisc.@A@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
BIND9LIBS = ../../lib/bind9/libbind9.@A@
@@ -41,26 +42,23 @@ ISCDEPLIBS = ../../lib/isc/libisc.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@
BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@
-RNDCLIBS = ${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS} ${ISCLIBS} @LIBS@
+LIBS = ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@
+
RNDCDEPLIBS = ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${BIND9DEPLIBS} ${DNSDEPLIBS} ${ISCDEPLIBS}
-CONFLIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@
CONFDEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS}
-SRCS= rndc.c rndc-confgen.c
-
-SUBDIRS = unix
+SRCS= rndc.c
-TARGETS = rndc@EXEEXT@ rndc-confgen@EXEEXT@
+TARGETS = rndc@EXEEXT@
-MANPAGES = rndc.8 rndc-confgen.8 rndc.conf.5
+MANPAGES = rndc.8 rndc.conf.5
-HTMLPAGES = rndc.html rndc-confgen.html rndc.conf.html
+HTMLPAGES = rndc.html rndc.conf.html
MANOBJS = ${MANPAGES} ${HTMLPAGES}
-UOBJS = unix/os.@O@
-
@BIND9_MAKE_RULES@
rndc.@O@: rndc.c
@@ -70,18 +68,10 @@ rndc.@O@: rndc.c
-DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \
-c ${srcdir}/rndc.c
-rndc-confgen.@O@: rndc-confgen.c
- ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
- -DRNDC_KEYFILE=\"${sysconfdir}/rndc.key\" \
- -c ${srcdir}/rndc-confgen.c
-
rndc@EXEEXT@: rndc.@O@ util.@O@ ${RNDCDEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ rndc.@O@ util.@O@ \
- ${RNDCLIBS}
-
-rndc-confgen@EXEEXT@: rndc-confgen.@O@ util.@O@ ${UOBJS} ${CONFDEPLIBS}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ rndc-confgen.@O@ util.@O@ \
- ${UOBJS} ${CONFLIBS}
+ export BASEOBJS="rndc.@O@ util.@O@"; \
+ export LIBS0="${ISCCFGLIBS} ${ISCCCLIBS} ${BIND9LIBS} ${DNSLIBS}"; \
+ ${FINALBUILDCMD}
doc man:: ${MANOBJS}
@@ -93,11 +83,9 @@ installdirs:
$(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8
$(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man5
-install:: rndc@EXEEXT@ rndc-confgen@EXEEXT@ installdirs
+install:: rndc@EXEEXT@ installdirs
${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc@EXEEXT@ ${DESTDIR}${sbindir}
- ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc-confgen@EXEEXT@ ${DESTDIR}${sbindir}
${INSTALL_DATA} ${srcdir}/rndc.8 ${DESTDIR}${mandir}/man8
- ${INSTALL_DATA} ${srcdir}/rndc-confgen.8 ${DESTDIR}${mandir}/man8
${INSTALL_DATA} ${srcdir}/rndc.conf.5 ${DESTDIR}${mandir}/man5
clean distclean maintainer-clean::
diff --git a/contrib/bind9/bin/rndc/include/rndc/os.h b/contrib/bind9/bin/rndc/include/rndc/os.h
index 9f96165..91986cb 100644
--- a/contrib/bind9/bin/rndc/include/rndc/os.h
+++ b/contrib/bind9/bin/rndc/include/rndc/os.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.h,v 1.9.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: os.h,v 1.12 2009-06-10 00:27:21 each Exp $ */
/*! \file */
@@ -27,12 +27,6 @@
ISC_LANG_BEGINDECLS
-FILE *safe_create(const char *filename);
-/*%<
- * Open 'filename' for writing, truncate if necessary. If the file was
- * created ensure that only the owner can read/write it.
- */
-
int set_user(FILE *fd, const char *user);
/*%<
* Set the owner of the file referenced by 'fd' to 'user'.
diff --git a/contrib/bind9/bin/rndc/rndc.8 b/contrib/bind9/bin/rndc/rndc.8
index 285ca9b..e4d723b 100644
--- a/contrib/bind9/bin/rndc/rndc.8
+++ b/contrib/bind9/bin/rndc/rndc.8
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: rndc.8,v 1.42.214.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: rndc.8,v 1.43 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/rndc/rndc.c b/contrib/bind9/bin/rndc/rndc.c
index 133103e..1976d9c 100644
--- a/contrib/bind9/bin/rndc/rndc.c
+++ b/contrib/bind9/bin/rndc/rndc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rndc.c,v 1.122.44.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: rndc.c,v 1.131.20.1.2.1 2011-06-02 23:47:28 tbox Exp $ */
/*! \file */
@@ -79,6 +79,7 @@ static unsigned char databuf[2048];
static isccc_ccmsg_t ccmsg;
static isccc_region_t secret;
static isc_boolean_t failed = ISC_FALSE;
+static isc_boolean_t c_flag = ISC_FALSE;
static isc_mem_t *mctx;
static int sends, recvs, connects;
static char *command;
@@ -89,10 +90,13 @@ static isc_uint32_t serial;
static void rndc_startconnect(isc_sockaddr_t *addr, isc_task_t *task);
+ISC_PLATFORM_NORETURN_PRE static void
+usage(int status) ISC_PLATFORM_NORETURN_POST;
+
static void
usage(int status) {
fprintf(stderr, "\
-Usage: %s [-c config] [-s server] [-p port]\n\
+Usage: %s [-b address] [-c config] [-s server] [-p port]\n\
[-k key-file ] [-y key] [-V] command\n\
\n\
command is one of the following:\n\
@@ -113,10 +117,16 @@ command is one of the following:\n\
notify zone [class [view]]\n\
Resend NOTIFY messages for the zone.\n\
reconfig Reload configuration file and new zones only.\n\
+ sign zone [class [view]]\n\
+ Update zone keys, and sign as needed.\n\
+ loadkeys zone [class [view]]\n\
+ Update keys without signing immediately.\n\
stats Write server statistics to the statistics file.\n\
querylog Toggle query logging.\n\
dumpdb [-all|-cache|-zones] [view ...]\n\
Dump cache(s) to the dump file (named_dump.db).\n\
+ secroots [view ...]\n\
+ Write security roots to the secroots file.\n\
stop Save pending updates to master files and stop the server.\n\
stop -p Save pending updates to master files and stop the server\n\
reporting process id.\n\
@@ -135,6 +145,10 @@ command is one of the following:\n\
validation newstate [view]\n\
Enable / disable DNSSEC validation.\n\
*restart Restart the server.\n\
+ addzone [\"file\"] zone [class [view]] { zone-options }\n\
+ Add zone to given view. Requires new-zone-file option.\n\
+ delzone [\"file\"] zone [class [view]]\n\
+ Removes zone from given view. Requires new-zone-file option.\n\
\n\
* == not yet implemented\n\
Version: %s\n",
@@ -455,6 +469,10 @@ parse_config(isc_mem_t *mctx, isc_log_t *log, const char *keyname,
fatal("neither %s nor %s was found",
admin_conffile, admin_keyfile);
key_only = ISC_TRUE;
+ } else if (! c_flag && isc_file_exists(admin_keyfile)) {
+ fprintf(stderr, "WARNING: key file (%s) exists, but using "
+ "default configuration file (%s)\n",
+ admin_keyfile, admin_conffile);
}
DO("create parser", cfg_parser_create(mctx, log, pctxp));
@@ -709,6 +727,7 @@ main(int argc, char **argv) {
case 'c':
admin_conffile = isc_commandline_argument;
+ c_flag = ISC_TRUE;
break;
case 'k':
diff --git a/contrib/bind9/bin/rndc/rndc.conf.5 b/contrib/bind9/bin/rndc/rndc.conf.5
index d7ad81e..54c4af9 100644
--- a/contrib/bind9/bin/rndc/rndc.conf.5
+++ b/contrib/bind9/bin/rndc/rndc.conf.5
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: rndc.conf.5,v 1.38.366.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: rndc.conf.5,v 1.41 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/bin/rndc/rndc.conf.html b/contrib/bind9/bin/rndc/rndc.conf.html
index 114cc15..463b99f 100644
--- a/contrib/bind9/bin/rndc/rndc.conf.html
+++ b/contrib/bind9/bin/rndc/rndc.conf.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc.conf.html,v 1.29.366.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: rndc.conf.html,v 1.32 2009-07-11 01:12:46 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/rndc/rndc.html b/contrib/bind9/bin/rndc/rndc.html
index 0d91784..ecc0f31 100644
--- a/contrib/bind9/bin/rndc/rndc.html
+++ b/contrib/bind9/bin/rndc/rndc.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: rndc.html,v 1.31.214.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: rndc.html,v 1.32 2009-07-11 01:12:46 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
diff --git a/contrib/bind9/bin/rndc/util.h b/contrib/bind9/bin/rndc/util.h
index c5da488..8eba61a 100644
--- a/contrib/bind9/bin/rndc/util.h
+++ b/contrib/bind9/bin/rndc/util.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: util.h,v 1.10 2007-06-19 23:46:59 tbox Exp $ */
+/* $Id: util.h,v 1.12 2009-09-29 23:48:03 tbox Exp $ */
#ifndef RNDC_UTIL_H
#define RNDC_UTIL_H 1
@@ -23,6 +23,7 @@
/*! \file */
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/formatcheck.h>
@@ -43,8 +44,9 @@ ISC_LANG_BEGINDECLS
void
notify(const char *fmt, ...) ISC_FORMAT_PRINTF(1, 2);
-void
-fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
+ISC_PLATFORM_NORETURN_PRE void
+fatal(const char *format, ...)
+ISC_FORMAT_PRINTF(1, 2) ISC_PLATFORM_NORETURN_POST;
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/bin/tools/Makefile.in b/contrib/bind9/bin/tools/Makefile.in
new file mode 100644
index 0000000..35b8285
--- /dev/null
+++ b/contrib/bind9/bin/tools/Makefile.in
@@ -0,0 +1,103 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.13 2010-01-07 23:48:53 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES} \
+ ${LWRES_INCLUDES} ${OMAPI_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@
+ISCLIBS = ../../lib/isc/libisc.@A@ @DNS_CRYPTO_LIBS@
+ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@
+ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
+LWRESLIBS = ../../lib/lwres/liblwres.@A@
+
+DNSDEPLIBS = ../../lib/dns/libdns.@A@
+ISCDEPLIBS = ../../lib/isc/libisc.@A@
+ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
+LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
+
+LIBS = ${ISCLIBS} @LIBS@
+NOSYMLIBS = ${ISCNOSYMLIBS} @LIBS@
+
+SUBDIRS =
+
+TARGETS = arpaname@EXEEXT@ named-journalprint@EXEEXT@ nsec3hash@EXEEXT@ \
+ genrandom@EXEEXT@ isc-hmac-fixup@EXEEXT@
+SRCS = arpaname.c named-journalprint.c nsec3hash.c genrandom.c \
+ isc-hmac-fixup.c
+
+MANPAGES = arpaname.1 named-journalprint.8 nsec3hash.8 genrandom.8 \
+ isc-hmac-fixup.8
+HTMLPAGES = arpaname.html named-journalprint.html nsec3hash.html \
+ genrandom.html isc-hmac-fixup.html
+MANOBJS = ${MANPAGES} ${HTMLPAGES}
+
+@BIND9_MAKE_RULES@
+
+arpaname@EXEEXT@: arpaname.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ arpaname.@O@ \
+ ${ISCLIBS} ${LIBS}
+
+named-journalprint@EXEEXT@: named-journalprint.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ export BASEOBJS="named-journalprint.@O@"; \
+ export LIBS0="${DNSLIBS}"; \
+ ${FINALBUILDCMD}
+
+nsec3hash@EXEEXT@: nsec3hash.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ export BASEOBJS="nsec3hash.@O@"; \
+ export LIBS0="${DNSLIBS}"; \
+ ${FINALBUILDCMD}
+
+isc-hmac-fixup@EXEEXT@: isc-hmac-fixup.@O@ ${ISCDEPLIBS}
+ export BASEOBJS="isc-hmac-fixup.@O@"; \
+ export LIBS0="${ISCLIBS}"; \
+ ${FINALBUILDCMD}
+
+genrandom@EXEEXT@: genrandom.@O@
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ genrandom.@O@ @GENRANDOMLIB@ ${LIBS}
+
+doc man:: ${MANOBJS}
+
+docclean manclean maintainer-clean::
+ rm -f ${MANOBJS}
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir}
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8
+
+install:: ${TARGETS} installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} arpaname@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-journalprint@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} nsec3hash@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} genrandom@EXEEXT@ ${DESTDIR}${sbindir}
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} isc-hmac-fixup@EXEEXT@ ${DESTDIR}${sbindir}
+ ${INSTALL_DATA} ${srcdir}/arpaname.1 ${DESTDIR}${mandir}/man1
+ ${INSTALL_DATA} ${srcdir}/isc-hmac-fixup.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/named-journalprint.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/nsec3hash.8 ${DESTDIR}${mandir}/man8
+ ${INSTALL_DATA} ${srcdir}/genrandom.8 ${DESTDIR}${mandir}/man8
+
+clean distclean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/bin/tools/arpaname.1 b/contrib/bind9/bin/tools/arpaname.1
new file mode 100644
index 0000000..6662380
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.1
@@ -0,0 +1,48 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: arpaname.1,v 1.4 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: arpaname
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: March 4, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "ARPANAME" "1" "March 4, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+arpaname \- translate IP addresses to the corresponding ARPA names
+.SH "SYNOPSIS"
+.HP 9
+\fBarpaname\fR {\fIipaddress\ \fR...}
+.SH "DESCRIPTION"
+.PP
+\fBarpaname\fR
+translates IP addresses (IPv4 and IPv6) to the corresponding IN\-ADDR.ARPA or IP6.ARPA names.
+.SH "SEE ALSO"
+.PP
+BIND 9 Administrator Reference Manual.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/arpaname.c b/contrib/bind9/bin/tools/arpaname.c
new file mode 100644
index 0000000..e7f1434
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: arpaname.c,v 1.4 2009-10-27 03:05:33 marka Exp $ */
+
+#include "config.h"
+
+#include <isc/net.h>
+
+#include <stdio.h>
+
+#define UNUSED(x) (void)(x)
+
+int
+main(int argc, char *argv[]) {
+ unsigned char buf[16];
+ int i;
+
+ UNUSED(argc);
+
+ while (argv[1]) {
+ if (inet_pton(AF_INET6, argv[1], buf) == 1) {
+ for (i = 15; i >= 0; i--)
+ fprintf(stdout, "%X.%X.", buf[i] & 0xf,
+ (buf[i] >> 4) & 0xf);
+ fprintf(stdout, "IP6.ARPA\n");
+ argv++;
+ continue;
+ }
+ if (inet_pton(AF_INET, argv[1], buf) == 1) {
+ fprintf(stdout, "%u.%u.%u.%u.IN-ADDR.ARPA\n",
+ buf[3], buf[2], buf[1], buf[0]);
+ argv++;
+ continue;
+ }
+ return (1);
+ }
+ fflush(stdout);
+ return(ferror(stdout));
+}
diff --git a/contrib/bind9/bin/tools/arpaname.docbook b/contrib/bind9/bin/tools/arpaname.docbook
new file mode 100644
index 0000000..a7eb79e
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.docbook
@@ -0,0 +1,76 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: arpaname.docbook,v 1.1 2009-03-04 01:30:27 marka Exp $ -->
+<refentry id="man.arpaname">
+ <refentryinfo>
+ <date>March 4, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>arpaname</application></refentrytitle>
+ <manvolnum>1</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>arpaname</application></refname>
+ <refpurpose>translate IP addresses to the corresponding ARPA names</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>arpaname</command>
+ <arg choice="req" rep="repeat"><replaceable class="parameter">ipaddress </replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>arpaname</command> translates IP addresses (IPv4 and
+ IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/arpaname.html b/contrib/bind9/bin/tools/arpaname.html
new file mode 100644
index 0000000..e44cfbd
--- /dev/null
+++ b/contrib/bind9/bin/tools/arpaname.html
@@ -0,0 +1,52 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: arpaname.html,v 1.4 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>arpaname</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.arpaname"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">arpaname</span> &#8212; translate IP addresses to the corresponding ARPA names</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">arpaname</code> {<em class="replaceable"><code>ipaddress </code></em>...}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543345"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">arpaname</strong></span> translates IP addresses (IPv4 and
+ IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543357"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543371"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/genrandom.8 b/contrib/bind9/bin/tools/genrandom.8
new file mode 100644
index 0000000..32a4ff0
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.8
@@ -0,0 +1,69 @@
+.\" Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: genrandom.8,v 1.8 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: genrandom
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Feb 19, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "GENRANDOM" "8" "Feb 19, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+genrandom \- generate a file containing random data
+.SH "SYNOPSIS"
+.HP 10
+\fBgenrandom\fR [\fB\-n\ \fR\fB\fInumber\fR\fR] {\fIsize\fR} {\fIfilename\fR}
+.SH "DESCRIPTION"
+.PP
+\fBgenrandom\fR
+generates a file or a set of files containing a specified quantity of pseudo\-random data, which can be used as a source of entropy for other commands on systems with no random device.
+.SH "ARGUMENTS"
+.PP
+\-n \fInumber\fR
+.RS 4
+In place of generating one file, generates
+\fBnumber\fR
+(from 2 to 9) files, appending
+\fBnumber\fR
+to the name.
+.RE
+.PP
+size
+.RS 4
+The size of the file, in kilobytes, to generate.
+.RE
+.PP
+domain
+.RS 4
+The file name into which random data should be written.
+.RE
+.SH "SEE ALSO"
+.PP
+\fBrand\fR(3),
+\fBarc4random\fR(3)
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/genrandom.c b/contrib/bind9/bin/tools/genrandom.c
new file mode 100644
index 0000000..8473be2
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2000-2003 Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: genrandom.c,v 1.7 2010-05-17 23:51:04 tbox Exp $ */
+
+/*! \file */
+#include <config.h>
+
+#include <isc/commandline.h>
+#include <isc/print.h>
+#include <isc/stdlib.h>
+#include <isc/util.h>
+
+#include <stdio.h>
+#include <string.h>
+
+const char *program = "genrandom";
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "usage: %s [-n 2..9] k file\n", program);
+ exit(1);
+}
+
+static void
+generate(char *filename, unsigned int bytes) {
+ FILE *fp;
+
+ fp = fopen(filename, "w");
+ if (fp == NULL) {
+ printf("failed to open %s\n", filename);
+ exit(1);
+ }
+
+ while (bytes > 0) {
+#ifndef HAVE_ARC4RANDOM
+ unsigned short int x = (rand() & 0xFFFF);
+#else
+ unsigned short int x = (arc4random() & 0xFFFF);
+#endif
+ unsigned char c = x & 0xFF;
+ if (putc(c, fp) == EOF) {
+ printf("error writing to %s\n", filename);
+ exit(1);
+ }
+ c = x >> 8;
+ if (putc(c, fp) == EOF) {
+ printf("error writing to %s\n", filename);
+ exit(1);
+ }
+ bytes -= 2;
+ }
+ fclose(fp);
+}
+
+int
+main(int argc, char **argv) {
+ unsigned int bytes;
+ unsigned int k;
+ char *endp;
+ int c, i, n = 1;
+ size_t len;
+ char *name;
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((c = isc_commandline_parse(argc, argv, "hn:")) != EOF) {
+ switch (c) {
+ case 'n':
+ n = strtol(isc_commandline_argument, &endp, 10);
+ if ((*endp != 0) || (n <= 1) || (n > 9))
+ usage();
+ break;
+
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (isc_commandline_index + 2 != argc)
+ usage();
+
+ k = strtoul(argv[isc_commandline_index++], &endp, 10);
+ if (*endp != 0)
+ usage();
+ bytes = k << 10;
+
+#ifndef HAVE_ARC4RANDOM
+ srand(0x12345678);
+#endif
+ if (n == 1) {
+ generate(argv[isc_commandline_index], bytes);
+ return (0);
+ }
+
+ len = strlen(argv[isc_commandline_index]) + 2;
+ name = (char *) malloc(len);
+ if (name == NULL) {
+ perror("malloc");
+ exit(1);
+ }
+
+ for (i = 1; i <= n; i++) {
+ snprintf(name, len, "%s%d", argv[isc_commandline_index], i);
+ generate(name, bytes);
+ }
+ free(name);
+
+ return (0);
+}
diff --git a/contrib/bind9/bin/tools/genrandom.docbook b/contrib/bind9/bin/tools/genrandom.docbook
new file mode 100644
index 0000000..84e4553
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.docbook
@@ -0,0 +1,119 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: genrandom.docbook,v 1.6 2010-05-17 23:51:05 tbox Exp $ -->
+<refentry id="man.genrandom">
+ <refentryinfo>
+ <date>Feb 19, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>genrandom</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>genrandom</application></refname>
+ <refpurpose>generate a file containing random data</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <year>2010</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>genrandom</command>
+ <arg><option>-n <replaceable class="parameter">number</replaceable></option></arg>
+ <arg choice="req"><replaceable class="parameter">size</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">filename</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>genrandom</command>
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>ARGUMENTS</title>
+ <variablelist>
+ <varlistentry>
+ <term>-n <replaceable class="parameter">number</replaceable></term>
+ <listitem>
+ <para>
+ In place of generating one file, generates <option>number</option>
+ (from 2 to 9) files, appending <option>number</option> to the name.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>size</term>
+ <listitem>
+ <para>
+ The size of the file, in kilobytes, to generate.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>domain</term>
+ <listitem>
+ <para>
+ The file name into which random data should be written.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>rand</refentrytitle><manvolnum>3</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>arc4random</refentrytitle><manvolnum>3</manvolnum>
+ </citerefentry>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/genrandom.html b/contrib/bind9/bin/tools/genrandom.html
new file mode 100644
index 0000000..c14af9b
--- /dev/null
+++ b/contrib/bind9/bin/tools/genrandom.html
@@ -0,0 +1,73 @@
+<!--
+ - Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: genrandom.html,v 1.8 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>genrandom</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.genrandom"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">genrandom</span> &#8212; generate a file containing random data</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">genrandom</code> [<code class="option">-n <em class="replaceable"><code>number</code></em></code>] {<em class="replaceable"><code>size</code></em>} {<em class="replaceable"><code>filename</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543363"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">genrandom</strong></span>
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543376"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-n <em class="replaceable"><code>number</code></em></span></dt>
+<dd><p>
+ In place of generating one file, generates <code class="option">number</code>
+ (from 2 to 9) files, appending <code class="option">number</code> to the name.
+ </p></dd>
+<dt><span class="term">size</span></dt>
+<dd><p>
+ The size of the file, in kilobytes, to generate.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The file name into which random data should be written.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543436"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">rand</span>(3)</span>,
+ <span class="citerefentry"><span class="refentrytitle">arc4random</span>(3)</span>
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543463"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.8 b/contrib/bind9/bin/tools/isc-hmac-fixup.8
new file mode 100644
index 0000000..99c58c8
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.8
@@ -0,0 +1,61 @@
+.\" Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: isc-hmac-fixup.8,v 1.4 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: isc\-hmac\-fixup
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: January 5, 2010
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "ISC\-HMAC\-FIXUP" "1" "January 5, 2010" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+isc\-hmac\-fixup \- fixes HMAC keys generated by older versions of BIND
+.SH "SYNOPSIS"
+.HP 15
+\fBisc\-hmac\-fixup\fR {\fIalgorithm\fR} {\fIsecret\fR}
+.SH "DESCRIPTION"
+.PP
+Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC\-SHA* TSIG keys which were longer than the digest length of the hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys longer than 256 bits, etc) to be used incorrectly, generating a message authentication code that was incompatible with other DNS implementations.
+.PP
+This bug has been fixed in BIND 9.7. However, the fix may cause incompatibility between older and newer versions of BIND, when using long keys.
+\fBisc\-hmac\-fixup\fR
+modifies those keys to restore compatibility.
+.PP
+To modify a key, run
+\fBisc\-hmac\-fixup\fR
+and specify the key's algorithm and secret on the command line. If the secret is longer than the digest length of the algorithm (64 bytes for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a new secret will be generated consisting of a hash digest of the old secret. (If the secret did not require conversion, then it will be printed without modification.)
+.SH "SECURITY CONSIDERATIONS"
+.PP
+Secrets that have been converted by
+\fBisc\-hmac\-fixup\fR
+are shortened, but as this is how the HMAC protocol works in operation anyway, it does not affect security. RFC 2104 notes, "Keys longer than [the digest length] are acceptable but the extra length would not significantly increase the function strength."
+.SH "SEE ALSO"
+.PP
+BIND 9 Administrator Reference Manual,
+RFC 2104.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2010 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.c b/contrib/bind9/bin/tools/isc-hmac-fixup.c
new file mode 100644
index 0000000..09cb85d
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: isc-hmac-fixup.c,v 1.4 2010-03-10 02:17:52 marka Exp $ */
+
+#include <config.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/md5.h>
+#include <isc/region.h>
+#include <isc/result.h>
+#include <isc/sha1.h>
+#include <isc/sha2.h>
+#include <isc/stdio.h>
+#include <isc/string.h>
+
+#define HMAC_LEN 64
+
+int
+main(int argc, char **argv) {
+ isc_buffer_t buf;
+ unsigned char key[1024];
+ char secret[1024];
+ char base64[(1024*4)/3];
+ isc_region_t r;
+ isc_result_t result;
+
+ if (argc != 3) {
+ fprintf(stderr, "Usage:\t%s algorithm secret\n", argv[0]);
+ fprintf(stderr, "\talgorithm: (MD5 | SHA1 | SHA224 | "
+ "SHA256 | SHA384 | SHA512)\n");
+ return (1);
+ }
+
+ isc_buffer_init(&buf, secret, sizeof(secret));
+ result = isc_base64_decodestring(argv[2], &buf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "error: %s\n", isc_result_totext(result));
+ return (1);
+ }
+ isc__buffer_usedregion(&buf, &r);
+
+ if (!strcasecmp(argv[1], "md5") ||
+ !strcasecmp(argv[1], "hmac-md5")) {
+ if (r.length > HMAC_LEN) {
+ isc_md5_t md5ctx;
+ isc_md5_init(&md5ctx);
+ isc_md5_update(&md5ctx, r.base, r.length);
+ isc_md5_final(&md5ctx, key);
+
+ r.base = key;
+ r.length = ISC_MD5_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha1") ||
+ !strcasecmp(argv[1], "hmac-sha1")) {
+ if (r.length > ISC_SHA1_DIGESTLENGTH) {
+ isc_sha1_t sha1ctx;
+ isc_sha1_init(&sha1ctx);
+ isc_sha1_update(&sha1ctx, r.base, r.length);
+ isc_sha1_final(&sha1ctx, key);
+
+ r.base = key;
+ r.length = ISC_SHA1_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha224") ||
+ !strcasecmp(argv[1], "hmac-sha224")) {
+ if (r.length > ISC_SHA224_DIGESTLENGTH) {
+ isc_sha224_t sha224ctx;
+ isc_sha224_init(&sha224ctx);
+ isc_sha224_update(&sha224ctx, r.base, r.length);
+ isc_sha224_final(key, &sha224ctx);
+
+ r.base = key;
+ r.length = ISC_SHA224_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha256") ||
+ !strcasecmp(argv[1], "hmac-sha256")) {
+ if (r.length > ISC_SHA256_DIGESTLENGTH) {
+ isc_sha256_t sha256ctx;
+ isc_sha256_init(&sha256ctx);
+ isc_sha256_update(&sha256ctx, r.base, r.length);
+ isc_sha256_final(key, &sha256ctx);
+
+ r.base = key;
+ r.length = ISC_SHA256_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha384") ||
+ !strcasecmp(argv[1], "hmac-sha384")) {
+ if (r.length > ISC_SHA384_DIGESTLENGTH) {
+ isc_sha384_t sha384ctx;
+ isc_sha384_init(&sha384ctx);
+ isc_sha384_update(&sha384ctx, r.base, r.length);
+ isc_sha384_final(key, &sha384ctx);
+
+ r.base = key;
+ r.length = ISC_SHA384_DIGESTLENGTH;
+ }
+ } else if (!strcasecmp(argv[1], "sha512") ||
+ !strcasecmp(argv[1], "hmac-sha512")) {
+ if (r.length > ISC_SHA512_DIGESTLENGTH) {
+ isc_sha512_t sha512ctx;
+ isc_sha512_init(&sha512ctx);
+ isc_sha512_update(&sha512ctx, r.base, r.length);
+ isc_sha512_final(key, &sha512ctx);
+
+ r.base = key;
+ r.length = ISC_SHA512_DIGESTLENGTH;
+ }
+ } else {
+ fprintf(stderr, "unknown hmac/digest algorithm: %s\n", argv[1]);
+ return (1);
+ }
+
+ isc_buffer_init(&buf, base64, sizeof(base64));
+ result = isc_base64_totext(&r, 0, "", &buf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "error: %s\n", isc_result_totext(result));
+ return (1);
+ }
+ fprintf(stdout, "%.*s\n", (int)isc_buffer_usedlength(&buf), base64);
+ return (0);
+}
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.docbook b/contrib/bind9/bin/tools/isc-hmac-fixup.docbook
new file mode 100644
index 0000000..a3039ee
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.docbook
@@ -0,0 +1,109 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: isc-hmac-fixup.docbook,v 1.2 2010-01-07 21:52:11 each Exp $ -->
+<refentry id="man.isc-hmac-fixup">
+ <refentryinfo>
+ <date>January 5, 2010</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>isc-hmac-fixup</application></refentrytitle>
+ <manvolnum>1</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>isc-hmac-fixup</application></refname>
+ <refpurpose>fixes HMAC keys generated by older versions of BIND</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2010</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>isc-hmac-fixup</command>
+ <arg choice="req"><replaceable class="parameter">algorithm</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">secret</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ Versions of BIND 9 up to and including BIND 9.6 had a bug causing
+ HMAC-SHA* TSIG keys which were longer than the digest length of the
+ hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys
+ longer than 256 bits, etc) to be used incorrectly, generating a
+ message authentication code that was incompatible with other DNS
+ implementations.
+ </para>
+ <para>
+ This bug has been fixed in BIND 9.7. However, the fix may
+ cause incompatibility between older and newer versions of
+ BIND, when using long keys. <command>isc-hmac-fixup</command>
+ modifies those keys to restore compatibility.
+ </para>
+ <para>
+ To modify a key, run <command>isc-hmac-fixup</command> and
+ specify the key's algorithm and secret on the command line. If the
+ secret is longer than the digest length of the algorithm (64 bytes
+ for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a
+ new secret will be generated consisting of a hash digest of the old
+ secret. (If the secret did not require conversion, then it will be
+ printed without modification.)
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SECURITY CONSIDERATIONS</title>
+ <para>
+ Secrets that have been converted by <command>isc-hmac-fixup</command>
+ are shortened, but as this is how the HMAC protocol works in
+ operation anyway, it does not affect security. RFC 2104 notes,
+ "Keys longer than [the digest length] are acceptable but the
+ extra length would not significantly increase the function
+ strength."
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 2104</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/isc-hmac-fixup.html b/contrib/bind9/bin/tools/isc-hmac-fixup.html
new file mode 100644
index 0000000..8b70777
--- /dev/null
+++ b/contrib/bind9/bin/tools/isc-hmac-fixup.html
@@ -0,0 +1,83 @@
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: isc-hmac-fixup.html,v 1.4 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>isc-hmac-fixup</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.isc-hmac-fixup"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">isc-hmac-fixup</span> &#8212; fixes HMAC keys generated by older versions of BIND</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">isc-hmac-fixup</code> {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>secret</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543351"></a><h2>DESCRIPTION</h2>
+<p>
+ Versions of BIND 9 up to and including BIND 9.6 had a bug causing
+ HMAC-SHA* TSIG keys which were longer than the digest length of the
+ hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys
+ longer than 256 bits, etc) to be used incorrectly, generating a
+ message authentication code that was incompatible with other DNS
+ implementations.
+ </p>
+<p>
+ This bug has been fixed in BIND 9.7. However, the fix may
+ cause incompatibility between older and newer versions of
+ BIND, when using long keys. <span><strong class="command">isc-hmac-fixup</strong></span>
+ modifies those keys to restore compatibility.
+ </p>
+<p>
+ To modify a key, run <span><strong class="command">isc-hmac-fixup</strong></span> and
+ specify the key's algorithm and secret on the command line. If the
+ secret is longer than the digest length of the algorithm (64 bytes
+ for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a
+ new secret will be generated consisting of a hash digest of the old
+ secret. (If the secret did not require conversion, then it will be
+ printed without modification.)
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543374"></a><h2>SECURITY CONSIDERATIONS</h2>
+<p>
+ Secrets that have been converted by <span><strong class="command">isc-hmac-fixup</strong></span>
+ are shortened, but as this is how the HMAC protocol works in
+ operation anyway, it does not affect security. RFC 2104 notes,
+ "Keys longer than [the digest length] are acceptable but the
+ extra length would not significantly increase the function
+ strength."
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543388"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 2104</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543405"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/named-journalprint.8 b/contrib/bind9/bin/tools/named-journalprint.8
new file mode 100644
index 0000000..347b67b
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.8
@@ -0,0 +1,60 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: named-journalprint.8,v 1.4 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: named\-journalprint
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Feb 18, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "NAMED\-JOURNALPRINT" "8" "Feb 18, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+named\-journalprint \- print zone journal in human\-readable form
+.SH "SYNOPSIS"
+.HP 19
+\fBnamed\-journalprint\fR {\fIjournal\fR}
+.SH "DESCRIPTION"
+.PP
+\fBnamed\-journalprint\fR
+prints the contents of a zone journal file in a human\-readable form.
+.PP
+Journal files are automatically created by
+\fBnamed\fR
+when changes are made to dynamic zones (e.g., by
+\fBnsupdate\fR). They record each addition or deletion of a resource record, in binary format, allowing the changes to be re\-applied to the zone when the server is restarted after a shutdown or crash. By default, the name of the journal file is formed by appending the extension
+\fI.jnl\fR
+to the name of the corresponding zone file.
+.PP
+\fBnamed\-journalprint\fR
+converts the contents of a given journal file into a human\-readable text format. Each line begins with "add" or "del", to indicate whether the record was added or deleted, and continues with the resource record in master\-file format.
+.SH "SEE ALSO"
+.PP
+\fBnamed\fR(8),
+\fBnsupdate\fR(8),
+BIND 9 Administrator Reference Manual.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/named-journalprint.c b/contrib/bind9/bin/tools/named-journalprint.c
new file mode 100644
index 0000000..8a00aa7
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2000, 2001 Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: named-journalprint.c,v 1.2 2009-12-04 21:59:23 marka Exp $ */
+
+/*! \file */
+#include <config.h>
+
+#include <isc/log.h>
+#include <isc/mem.h>
+#include <isc/util.h>
+
+#include <dns/journal.h>
+#include <dns/log.h>
+#include <dns/result.h>
+#include <dns/types.h>
+
+#include <stdlib.h>
+
+/*
+ * Setup logging to use stderr.
+ */
+static isc_result_t
+setup_logging(isc_mem_t *mctx, FILE *errout, isc_log_t **logp) {
+ isc_logdestination_t destination;
+ isc_logconfig_t *logconfig = NULL;
+ isc_log_t *log = NULL;
+
+ RUNTIME_CHECK(isc_log_create(mctx, &log, &logconfig) == ISC_R_SUCCESS);
+ isc_log_setcontext(log);
+ dns_log_init(log);
+ dns_log_setcontext(log);
+
+ destination.file.stream = errout;
+ destination.file.name = NULL;
+ destination.file.versions = ISC_LOG_ROLLNEVER;
+ destination.file.maximum_size = 0;
+ RUNTIME_CHECK(isc_log_createchannel(logconfig, "stderr",
+ ISC_LOG_TOFILEDESC,
+ ISC_LOG_DYNAMIC,
+ &destination, 0) == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc_log_usechannel(logconfig, "stderr",
+ NULL, NULL) == ISC_R_SUCCESS);
+
+ *logp = log;
+ return (ISC_R_SUCCESS);
+}
+
+int
+main(int argc, char **argv) {
+ char *file;
+ isc_mem_t *mctx = NULL;
+ isc_result_t result;
+ isc_log_t *lctx = NULL;
+
+ if (argc != 2) {
+ printf("usage: %s journal\n", argv[0]);
+ return(1);
+ }
+
+ file = argv[1];
+
+ RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
+ RUNTIME_CHECK(setup_logging(mctx, stderr, &lctx) == ISC_R_SUCCESS);
+
+ result = dns_journal_print(mctx, file, stdout);
+ if (result == DNS_R_NOJOURNAL)
+ fprintf(stderr, "%s\n", dns_result_totext(result));
+ isc_log_destroy(&lctx);
+ isc_mem_detach(&mctx);
+ return(result != ISC_R_SUCCESS ? 1 : 0);
+}
diff --git a/contrib/bind9/bin/tools/named-journalprint.docbook b/contrib/bind9/bin/tools/named-journalprint.docbook
new file mode 100644
index 0000000..d523f8c
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.docbook
@@ -0,0 +1,101 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: named-journalprint.docbook,v 1.2 2009-12-04 21:59:23 marka Exp $ -->
+<refentry id="man.named-journalprint">
+ <refentryinfo>
+ <date>Feb 18, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>named-journalprint</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>named-journalprint</application></refname>
+ <refpurpose>print zone journal in human-readable form</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>named-journalprint</command>
+ <arg choice="req"><replaceable class="parameter">journal</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>named-journalprint</command>
+ prints the contents of a zone journal file in a human-readable
+ form.
+ </para>
+ <para>
+ Journal files are automatically created by <command>named</command>
+ when changes are made to dynamic zones (e.g., by
+ <command>nsupdate</command>). They record each addition
+ or deletion of a resource record, in binary format, allowing the
+ changes to be re-applied to the zone when the server is
+ restarted after a shutdown or crash. By default, the name of
+ the journal file is formed by appending the extension
+ <filename>.jnl</filename> to the name of the corresponding
+ zone file.
+ </para>
+ <para>
+ <command>named-journalprint</command> converts the contents of a given
+ journal file into a human-readable text format. Each line begins
+ with "add" or "del", to indicate whether the record was added or
+ deleted, and continues with the resource record in master-file
+ format.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citerefentry>
+ <refentrytitle>named</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citerefentry>
+ <refentrytitle>nsupdate</refentrytitle><manvolnum>8</manvolnum>
+ </citerefentry>,
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/named-journalprint.html b/contrib/bind9/bin/tools/named-journalprint.html
new file mode 100644
index 0000000..8878fc50
--- /dev/null
+++ b/contrib/bind9/bin/tools/named-journalprint.html
@@ -0,0 +1,73 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: named-journalprint.html,v 1.4 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>named-journalprint</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.named-journalprint"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">named-journalprint</span> &#8212; print zone journal in human-readable form</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">named-journalprint</code> {<em class="replaceable"><code>journal</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543342"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">named-journalprint</strong></span>
+ prints the contents of a zone journal file in a human-readable
+ form.
+ </p>
+<p>
+ Journal files are automatically created by <span><strong class="command">named</strong></span>
+ when changes are made to dynamic zones (e.g., by
+ <span><strong class="command">nsupdate</strong></span>). They record each addition
+ or deletion of a resource record, in binary format, allowing the
+ changes to be re-applied to the zone when the server is
+ restarted after a shutdown or crash. By default, the name of
+ the journal file is formed by appending the extension
+ <code class="filename">.jnl</code> to the name of the corresponding
+ zone file.
+ </p>
+<p>
+ <span><strong class="command">named-journalprint</strong></span> converts the contents of a given
+ journal file into a human-readable text format. Each line begins
+ with "add" or "del", to indicate whether the record was added or
+ deleted, and continues with the resource record in master-file
+ format.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543378"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">nsupdate</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543409"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/bin/tools/nsec3hash.8 b/contrib/bind9/bin/tools/nsec3hash.8
new file mode 100644
index 0000000..6fba8c8
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.8
@@ -0,0 +1,70 @@
+.\" Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+.\"
+.\" Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS. IN NO EVENT SHALL ISC 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.
+.\"
+.\" $Id: nsec3hash.8,v 1.5 2010-05-19 01:14:14 tbox Exp $
+.\"
+.hy 0
+.ad l
+.\" Title: nsec3hash
+.\" Author:
+.\" Generator: DocBook XSL Stylesheets v1.71.1 <http://docbook.sf.net/>
+.\" Date: Feb 18, 2009
+.\" Manual: BIND9
+.\" Source: BIND9
+.\"
+.TH "NSEC3HASH" "8" "Feb 18, 2009" "BIND9" "BIND9"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+nsec3hash \- generate NSEC3 hash
+.SH "SYNOPSIS"
+.HP 10
+\fBnsec3hash\fR {\fIsalt\fR} {\fIalgorithm\fR} {\fIiterations\fR} {\fIdomain\fR}
+.SH "DESCRIPTION"
+.PP
+\fBnsec3hash\fR
+generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity of NSEC3 records in a signed zone.
+.SH "ARGUMENTS"
+.PP
+salt
+.RS 4
+The salt provided to the hash algorithm.
+.RE
+.PP
+algorithm
+.RS 4
+A number indicating the hash algorithm. Currently the only supported hash algorithm for NSEC3 is SHA\-1, which is indicated by the number 1; consequently "1" is the only useful value for this argument.
+.RE
+.PP
+iterations
+.RS 4
+The number of additional times the hash should be performed.
+.RE
+.PP
+domain
+.RS 4
+The domain name to be hashed.
+.RE
+.SH "SEE ALSO"
+.PP
+BIND 9 Administrator Reference Manual,
+RFC 5155.
+.SH "AUTHOR"
+.PP
+Internet Systems Consortium
+.SH "COPYRIGHT"
+Copyright \(co 2009 Internet Systems Consortium, Inc. ("ISC")
+.br
diff --git a/contrib/bind9/bin/tools/nsec3hash.c b/contrib/bind9/bin/tools/nsec3hash.c
new file mode 100644
index 0000000..0e2a910
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2006, 2008, 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: nsec3hash.c,v 1.6 2009-10-06 21:20:44 each Exp $ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <isc/base32.h>
+#include <isc/buffer.h>
+#include <isc/hex.h>
+#include <isc/iterated_hash.h>
+#include <isc/print.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/types.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/nsec3.h>
+#include <dns/types.h>
+
+const char *program = "nsec3hash";
+
+ISC_PLATFORM_NORETURN_PRE static void
+fatal(const char *format, ...) ISC_PLATFORM_NORETURN_POST;
+
+static void
+fatal(const char *format, ...) {
+ va_list args;
+
+ fprintf(stderr, "%s: ", program);
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+static void
+check_result(isc_result_t result, const char *message) {
+ if (result != ISC_R_SUCCESS)
+ fatal("%s: %s", message, isc_result_totext(result));
+}
+
+static void
+usage() {
+ fatal("salt hash iterations domain");
+}
+
+int
+main(int argc, char **argv) {
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ isc_buffer_t buffer;
+ isc_region_t region;
+ isc_result_t result;
+ unsigned char hash[NSEC3_MAX_HASH_LENGTH];
+ unsigned char salt[DNS_NSEC3_SALTSIZE];
+ unsigned char text[1024];
+ unsigned int hash_alg;
+ unsigned int length;
+ unsigned int iterations;
+ unsigned int salt_length;
+
+ if (argc != 5)
+ usage();
+
+ if (strcmp(argv[1], "-") == 0) {
+ salt_length = 0;
+ salt[0] = 0;
+ } else {
+ isc_buffer_init(&buffer, salt, sizeof(salt));
+ result = isc_hex_decodestring(argv[1], &buffer);
+ check_result(result, "isc_hex_decodestring(salt)");
+ salt_length = isc_buffer_usedlength(&buffer);
+ if (salt_length > DNS_NSEC3_SALTSIZE)
+ fatal("salt too long");
+ }
+ hash_alg = atoi(argv[2]);
+ if (hash_alg > 255U)
+ fatal("hash algorithm too large");
+ iterations = atoi(argv[3]);
+ if (iterations > 0xffffU)
+ fatal("iterations to large");
+
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ isc_buffer_init(&buffer, argv[4], strlen(argv[4]));
+ isc_buffer_add(&buffer, strlen(argv[4]));
+ result = dns_name_fromtext(name, &buffer, dns_rootname, 0, NULL);
+ check_result(result, "dns_name_fromtext() failed");
+
+ dns_name_downcase(name, name, NULL);
+ length = isc_iterated_hash(hash, hash_alg, iterations, salt,
+ salt_length, name->ndata, name->length);
+ if (length == 0)
+ fatal("isc_iterated_hash failed");
+ region.base = hash;
+ region.length = length;
+ isc_buffer_init(&buffer, text, sizeof(text));
+ isc_base32hex_totext(&region, 1, "", &buffer);
+ fprintf(stdout, "%.*s (salt=%s, hash=%u, iterations=%u)\n",
+ (int)isc_buffer_usedlength(&buffer), text, argv[1], hash_alg, iterations);
+ return(0);
+}
diff --git a/contrib/bind9/bin/tools/nsec3hash.docbook b/contrib/bind9/bin/tools/nsec3hash.docbook
new file mode 100644
index 0000000..48eb4af
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.docbook
@@ -0,0 +1,125 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: nsec3hash.docbook,v 1.3 2009-03-02 23:47:43 tbox Exp $ -->
+<refentry id="man.nsec3hash">
+ <refentryinfo>
+ <date>Feb 18, 2009</date>
+ </refentryinfo>
+
+ <refmeta>
+ <refentrytitle><application>nsec3hash</application></refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo>BIND9</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname><application>nsec3hash</application></refname>
+ <refpurpose>generate NSEC3 hash</refpurpose>
+ </refnamediv>
+
+ <docinfo>
+ <copyright>
+ <year>2009</year>
+ <holder>Internet Systems Consortium, Inc. ("ISC")</holder>
+ </copyright>
+ </docinfo>
+
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>nsec3hash</command>
+ <arg choice="req"><replaceable class="parameter">salt</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">algorithm</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">iterations</replaceable></arg>
+ <arg choice="req"><replaceable class="parameter">domain</replaceable></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>DESCRIPTION</title>
+ <para>
+ <command>nsec3hash</command> generates an NSEC3 hash based on
+ a set of NSEC3 parameters. This can be used to check the validity
+ of NSEC3 records in a signed zone.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>ARGUMENTS</title>
+ <variablelist>
+ <varlistentry>
+ <term>salt</term>
+ <listitem>
+ <para>
+ The salt provided to the hash algorithm.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>algorithm</term>
+ <listitem>
+ <para>
+ A number indicating the hash algorithm. Currently the
+ only supported hash algorithm for NSEC3 is SHA-1, which is
+ indicated by the number 1; consequently "1" is the only
+ useful value for this argument.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>iterations</term>
+ <listitem>
+ <para>
+ The number of additional times the hash should be performed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>domain</term>
+ <listitem>
+ <para>
+ The domain name to be hashed.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+ <para>
+ <citetitle>BIND 9 Administrator Reference Manual</citetitle>,
+ <citetitle>RFC 5155</citetitle>.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+ <para><corpauthor>Internet Systems Consortium</corpauthor>
+ </para>
+ </refsect1>
+
+</refentry><!--
+ - Local variables:
+ - mode: sgml
+ - End:
+-->
diff --git a/contrib/bind9/bin/tools/nsec3hash.html b/contrib/bind9/bin/tools/nsec3hash.html
new file mode 100644
index 0000000..e6c0995
--- /dev/null
+++ b/contrib/bind9/bin/tools/nsec3hash.html
@@ -0,0 +1,78 @@
+<!--
+ - Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: nsec3hash.html,v 1.5 2010-05-19 01:14:14 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>nsec3hash</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
+<a name="man.nsec3hash"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">nsec3hash</span> &#8212; generate NSEC3 hash</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">nsec3hash</code> {<em class="replaceable"><code>salt</code></em>} {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>iterations</code></em>} {<em class="replaceable"><code>domain</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543367"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">nsec3hash</strong></span> generates an NSEC3 hash based on
+ a set of NSEC3 parameters. This can be used to check the validity
+ of NSEC3 records in a signed zone.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543380"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">salt</span></dt>
+<dd><p>
+ The salt provided to the hash algorithm.
+ </p></dd>
+<dt><span class="term">algorithm</span></dt>
+<dd><p>
+ A number indicating the hash algorithm. Currently the
+ only supported hash algorithm for NSEC3 is SHA-1, which is
+ indicated by the number 1; consequently "1" is the only
+ useful value for this argument.
+ </p></dd>
+<dt><span class="term">iterations</span></dt>
+<dd><p>
+ The number of additional times the hash should be performed.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The domain name to be hashed.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543442"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5155</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2543459"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div></body>
+</html>
diff --git a/contrib/bind9/config.guess b/contrib/bind9/config.guess
index c79aebc..f8d6eac 100644
--- a/contrib/bind9/config.guess
+++ b/contrib/bind9/config.guess
@@ -3,7 +3,7 @@
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
-timestamp='2004-09-07'
+timestamp='2009-01-17'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
diff --git a/contrib/bind9/config.h.in b/contrib/bind9/config.h.in
index aa1ba81..01f8b16 100644
--- a/contrib/bind9/config.h.in
+++ b/contrib/bind9/config.h.in
@@ -1,6 +1,6 @@
/* config.h.in. Generated from configure.in by autoheader. */
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: config.h.in,v 1.106.40.24 2010-12-21 04:33:58 marka Exp $ */
+/* $Id: config.h.in,v 1.143.8.1 2011-02-03 05:52:35 marka Exp $ */
/*! \file */
@@ -147,6 +147,9 @@ int sigwait(const unsigned int *set, int *sig);
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
+/* Define to enable the "filter-aaaa-on-v4" option. */
+#undef ALLOW_FILTER_AAAA_ON_V4
+
/* Define if recvmsg() does not meet all of the BSD socket API specifications.
*/
#undef BROKEN_RECVMSG
@@ -157,6 +160,12 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to enable "rrset-order fixed" syntax. */
#undef DNS_RDATASET_FIXED
+/* Define to enable rpz-nsdname rules. */
+#undef ENABLE_RPZ_NSDNAME
+
+/* Define to enable rpz-nsip rules. */
+#undef ENABLE_RPZ_NSIP
+
/* Solaris hack to get select_large_fdset. */
#undef FD_SETSIZE
@@ -175,9 +184,18 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <devpoll.h> header file. */
#undef HAVE_DEVPOLL_H
+/* Define to 1 if you have the `dlclose' function. */
+#undef HAVE_DLCLOSE
+
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
+/* Define to 1 if you have the `dlopen' function. */
+#undef HAVE_DLOPEN
+
+/* Define to 1 if you have the `dlsym' function. */
+#undef HAVE_DLSYM
+
/* Define to 1 if you have the `EVP_sha256' function. */
#undef HAVE_EVP_SHA256
@@ -190,9 +208,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
#undef HAVE_GSSAPI_GSSAPI_H
+/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */
+#undef HAVE_GSSAPI_GSSAPI_KRB5_H
+
/* Define to 1 if you have the <gssapi.h> header file. */
#undef HAVE_GSSAPI_H
+/* Define to 1 if you have the <gssapi_krb5.h> header file. */
+#undef HAVE_GSSAPI_KRB5_H
+
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
@@ -211,9 +235,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the `cap' library (-lcap). */
#undef HAVE_LIBCAP
+/* if system have backtrace function */
+#undef HAVE_LIBCTRACE
+
/* Define to 1 if you have the `c_r' library (-lc_r). */
#undef HAVE_LIBC_R
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
/* Define to 1 if you have the `nsl' library (-lnsl). */
#undef HAVE_LIBNSL
@@ -247,9 +277,27 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <net/if6.h> header file. */
#undef HAVE_NET_IF6_H
+/* Define if your OpenSSL version supports GOST. */
+#undef HAVE_OPENSSL_GOST
+
+/* Define to 1 if you have the <regex.h> header file. */
+#undef HAVE_REGEX_H
+
+/* Define to 1 if you have the `setegid' function. */
+#undef HAVE_SETEGID
+
+/* Define to 1 if you have the `seteuid' function. */
+#undef HAVE_SETEUID
+
/* Define to 1 if you have the `setlocale' function. */
#undef HAVE_SETLOCALE
+/* Define to 1 if you have the `setresgid' function. */
+#undef HAVE_SETRESGID
+
+/* Define to 1 if you have the `setresuid' function. */
+#undef HAVE_SETRESUID
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@@ -304,6 +352,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
+/* return type of gai_strerror */
+#undef IRS_GAISTRERROR_RETURN_T
+
+/* Define to the buffer length type used by getnameinfo(3). */
+#undef IRS_GETNAMEINFO_BUFLEN_T
+
+/* Define to the flags type used by getnameinfo(3). */
+#undef IRS_GETNAMEINFO_FLAGS_T
+
/* Defined if extern char *optarg is not declared. */
#undef NEED_OPTARG
@@ -361,11 +418,8 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
+/* Define to empty if your compiler does not support "static inline". */
#undef inline
-#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t
diff --git a/contrib/bind9/configure.in b/contrib/bind9/configure.in
index 08f0bf3..d5fb15c 100644
--- a/contrib/bind9/configure.in
+++ b/contrib/bind9/configure.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl
esyscmd([sed "s/^/# /" COPYRIGHT])dnl
AC_DIVERT_POP()dnl
-AC_REVISION($Revision: 1.457.26.28 $)
+AC_REVISION($Revision: 1.512.8.1 $)
AC_INIT(lib/dns/name.c)
AC_PREREQ(2.59)
@@ -36,6 +36,7 @@ case $build_os in
sunos*)
# Just set the maximum command line length for sunos as it otherwise
# takes a exceptionally long time to work it out. Required for libtool.
+
lt_cv_sys_max_cmd_len=4096;
;;
esac
@@ -61,7 +62,6 @@ It is available from http://www.isc.org as a separate download.])
;;
esac
-
#
# Make very sure that these are the first files processed by
# config.status, since we use the processed output as the input for
@@ -111,6 +111,8 @@ AC_SUBST(ETAGS)
#
# Perl is optional; it is used only by some of the system test scripts.
+# Note: the backtrace feature (see below) uses perl to build the symbol table,
+# but it still compiles without perl, in which case an empty table will be used.
#
AC_PATH_PROGS(PERL, perl5 perl)
AC_SUBST(PERL)
@@ -269,7 +271,7 @@ esac
AC_HEADER_STDC
-AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
+AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h,,,
[$ac_includes_default
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
@@ -283,6 +285,12 @@ AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))
AC_C_FLEXIBLE_ARRAY_MEMBER
#
+# Older versions of HP/UX don't define seteuid() and setegid()
+#
+AC_CHECK_FUNCS(seteuid setresuid)
+AC_CHECK_FUNCS(setegid setresgid)
+
+#
# UnixWare 7.1.1 with the feature supplement to the UDK compiler
# is reported to not support "static inline" (RT #1212).
#
@@ -300,7 +308,7 @@ AC_TRY_COMPILE(, [
],
[AC_MSG_RESULT(no)],
[AC_MSG_RESULT(yes)
- AC_DEFINE(inline, )])
+ AC_DEFINE(inline, ,[Define to empty if your compiler does not support "static inline".])])
AC_TYPE_SIZE_T
AC_CHECK_TYPE(ssize_t, int)
@@ -332,6 +340,20 @@ AC_TRY_COMPILE([],[long long i = 0; return (0);],
AC_SUBST(ISC_PLATFORM_HAVELONGLONG)
#
+# check for GCC noreturn attribute
+#
+AC_MSG_CHECKING(for GCC noreturn attribute)
+AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));],
+ [AC_MSG_RESULT(yes)
+ ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
+ ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"],
+ [AC_MSG_RESULT(no)
+ ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
+ ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"])
+AC_SUBST(ISC_PLATFORM_NORETURN_PRE)
+AC_SUBST(ISC_PLATFORM_NORETURN_POST)
+
+#
# check if we have lifconf
#
AC_MSG_CHECKING(for struct lifconf)
@@ -495,6 +517,7 @@ then
fi
done
fi
+OPENSSL_GOST=""
case "$use_openssl" in
no)
AC_MSG_RESULT(no)
@@ -650,6 +673,42 @@ esac
AC_MSG_RESULT(no)
fi
AC_CHECK_FUNCS(EVP_sha256 EVP_sha512)
+
+ AC_MSG_CHECKING(for OpenSSL GOST support)
+ have_gost=""
+ AC_TRY_RUN([
+#include <openssl/conf.h>
+#include <openssl/engine.h>
+int main() {
+#if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
+ ENGINE *e;
+
+ OPENSSL_config(NULL);
+
+ e = ENGINE_by_id("gost");
+ if (e == NULL)
+ return (1);
+ if (ENGINE_init(e) <= 0)
+ return (1);
+ return (0);
+#else
+ return (1);
+#endif
+}
+],
+ [AC_MSG_RESULT(yes)
+ have_gost="yes"],
+ [AC_MSG_RESULT(no)
+ have_gost="no"])
+ case $have_gost in
+ yes)
+ OPENSSL_GOST="yes"
+ AC_DEFINE(HAVE_OPENSSL_GOST, 1,
+ [Define if your OpenSSL version supports GOST.])
+ ;;
+ *)
+ ;;
+ esac
CFLAGS="$saved_cflags"
LIBS="$saved_libs"
OPENSSLLINKOBJS='${OPENSSLLINKOBJS}'
@@ -667,9 +726,34 @@ AC_SUBST(USE_OPENSSL)
AC_SUBST(DST_OPENSSL_INC)
AC_SUBST(OPENSSLLINKOBJS)
AC_SUBST(OPENSSLLINKSRCS)
+AC_SUBST(OPENSSL_GOST)
DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS"
#
+# Use OpenSSL for hash functions
+#
+
+AC_ARG_ENABLE(openssl-hash,
+ [ --enable-openssl-hash use OpenSSL for hash functions [[default=no]]],
+ want_openssl_hash="$enableval", want_openssl_hash="no")
+case $want_openssl_hash in
+ yes)
+ if test "$USE_OPENSSL" = ""
+ then
+ AC_MSG_ERROR([No OpenSSL for hash functions])
+ fi
+ ISC_PLATFORM_OPENSSLHASH="#define ISC_PLATFORM_OPENSSLHASH 1"
+ ISC_OPENSSL_INC="$DST_OPENSSL_INC"
+ ;;
+ no)
+ ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH"
+ ISC_OPENSSL_INC=""
+ ;;
+esac
+AC_SUBST(ISC_PLATFORM_OPENSSLHASH)
+AC_SUBST(ISC_OPENSSL_INC)
+
+#
# PKCS11 (aka crypto hardware) support
#
# This works only with the right OpenSSL with PKCS11 engine!
@@ -677,21 +761,37 @@ DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DNS_OPENSSL_LIBS"
AC_MSG_CHECKING(for PKCS11 support)
AC_ARG_WITH(pkcs11,
-[ --with-pkcs11 Build with PKCS11 support],
- use_pkcs11="yes", use_pkcs11="no")
+[ --with-pkcs11[=PATH] Build with PKCS11 support [yes|no|path]
+ (PATH is for the PKCS11 provider)],
+ use_pkcs11="$withval", use_pkcs11="no")
case "$use_pkcs11" in
- no)
+ no|'')
AC_MSG_RESULT(disabled)
- USE_PKCS11=""
+ USE_PKCS11=''
+ PKCS11_TOOLS=''
;;
- yes)
+ yes|*)
AC_MSG_RESULT(using OpenSSL with PKCS11 support)
USE_PKCS11='-DUSE_PKCS11'
+ PKCS11_TOOLS=pkcs11
;;
esac
-
AC_SUBST(USE_PKCS11)
+AC_SUBST(PKCS11_TOOLS)
+
+AC_MSG_CHECKING(for PKCS11 tools)
+case "$use_pkcs11" in
+ no|yes|'')
+ AC_MSG_RESULT(disabled)
+ PKCS11_PROVIDER="undefined"
+ ;;
+ *)
+ AC_MSG_RESULT(PKCS11 provider is "$use_pkcs11")
+ PKCS11_PROVIDER="$use_pkcs11"
+ ;;
+esac
+AC_SUBST(PKCS11_PROVIDER)
AC_MSG_CHECKING(for GSSAPI library)
AC_ARG_WITH(gssapi,
@@ -731,6 +831,9 @@ case "$use_gssapi" in
AC_MSG_ERROR([gssapi.h not found])
fi
+ AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h,
+ [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>"])
+
AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h,
[ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"])
@@ -775,7 +878,12 @@ case "$use_gssapi" in
# -L/usr/local/lib to LIBS, which can make the
# -lgssapi_krb5 test succeed with shared libraries even
# when you are trying to build with KTH in /usr/lib.
- LIBS="-L$use_gssapi/lib $TRY_LIBS"
+ if test "$use_gssapi" = "/usr"
+ then
+ LIBS="$TRY_LIBS"
+ else
+ LIBS="-L$use_gssapi/lib $TRY_LIBS"
+ fi
AC_MSG_CHECKING(linking as $TRY_LIBS)
AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()],
gssapi_linked=yes, gssapi_linked=no)
@@ -839,6 +947,7 @@ esac
AC_SUBST(ISC_PLATFORM_HAVEGSSAPI)
AC_SUBST(ISC_PLATFORM_GSSAPIHEADER)
+AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER)
AC_SUBST(ISC_PLATFORM_KRB5HEADER)
AC_SUBST(USE_GSSAPI)
@@ -1304,6 +1413,65 @@ case $use_libtool in
esac
#
+# enable/disable dumping stack backtrace. Also check if the system supports
+# glibc-compatible backtrace() function.
+#
+AC_ARG_ENABLE(backtrace,
+[ --enable-backtrace log stack backtrace on abort [[default=yes]]],
+ want_backtrace="$enableval", want_backtrace="yes")
+case $want_backtrace in
+yes)
+ ISC_PLATFORM_USEBACKTRACE="#define ISC_PLATFORM_USEBACKTRACE 1"
+ AC_TRY_LINK([#include <execinfo.h>],
+ [return (backtrace((void **)0, 0));],
+ [AC_DEFINE([HAVE_LIBCTRACE], [], [if system have backtrace function])],)
+ ;;
+*)
+ ISC_PLATFORM_USEBACKTRACE="#undef ISC_PLATFORM_USEBACKTRACE"
+ ;;
+esac
+AC_SUBST(ISC_PLATFORM_USEBACKTRACE)
+
+AC_ARG_ENABLE(symtable,
+[ --enable-symtable use internal symbol table for backtrace
+ [[all|minimal(default)|none]]],
+ want_symtable="$enableval", want_symtable="minimal")
+case $want_symtable in
+yes|all|minimal) # "yes" is a hidden value equivalent to "minimal"
+ if test "$PERL" = ""
+ then
+ AC_MSG_ERROR([Internal symbol table requires perl but no perl is found.
+Install perl or explicitly disable the feature by --disable-symtable.])
+ fi
+ if test "$use_libtool" = "yes"; then
+ AC_MSG_WARN([Internal symbol table does not work with libtool. Disabling symbol table.])
+ else
+ # we generate the internal symbol table only for those systems
+ # known to work to avoid unexpected build failure. Also, warn
+ # about unsupported systems when the feature is enabled
+ # manually.
+ case $host_os in
+ freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*)
+ MKSYMTBL_PROGRAM="$PERL"
+ if test $want_symtable = all; then
+ ALWAYS_MAKE_SYMTABLE="yes"
+ fi
+ ;;
+ *)
+ if test $want_symtable = yes -o $want_symtable = all
+ then
+ AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it])
+ fi
+ esac
+ fi
+ ;;
+*)
+ ;;
+esac
+AC_SUBST(MKSYMTBL_PROGRAM)
+AC_SUBST(ALWAYS_MAKE_SYMTABLE)
+
+#
# File name extension for static archive files, for those few places
# where they are treated differently from dynamic ones.
#
@@ -1320,6 +1488,54 @@ AC_SUBST(LIBTOOL_ALLOW_UNDEFINED)
AC_SUBST(LIBTOOL_IN_MAIN)
#
+# build exportable DNS library?
+#
+AC_ARG_ENABLE(exportlib,
+ [ --enable-exportlib build exportable library (GNU make required)
+ [[default=no]]])
+case "$enable_exportlib" in
+ yes)
+ gmake=
+ for x in gmake gnumake make; do
+ if $x --version 2>/dev/null | grep GNU > /dev/null; then
+ gmake=$x
+ break;
+ fi
+ done
+ if test -z "$gmake"; then
+ AC_MSG_ERROR([exportlib requires GNU make. Install it or disable the feature.])
+ fi
+ LIBEXPORT=lib/export
+ AC_SUBST(LIBEXPORT)
+ BIND9_CO_RULE="%.$O: \${srcdir}/%.c"
+ ;;
+ no|*)
+ BIND9_CO_RULE=".c.$O:"
+ ;;
+esac
+AC_SUBST(BIND9_CO_RULE)
+
+AC_ARG_WITH(export-libdir,
+ [ --with-export-libdir[=PATH]
+ installation directory for the export library
+ [[EPREFIX/lib/bind9]]],
+ export_libdir="$withval",)
+if test -z "$export_libdir"; then
+ export_libdir="\${exec_prefix}/lib/bind9/"
+fi
+AC_SUBST(export_libdir)
+
+AC_ARG_WITH(export-includedir,
+ [ --with-export-includedir[=PATH]
+ installation directory for the header files of the
+ export library [[PREFIX/include/bind9]]],
+ export_includedir="$withval",)
+if test -z "$export_includedir"; then
+ export_includedir="\${prefix}/include/bind9/"
+fi
+AC_SUBST(export_includedir)
+
+#
# Here begins a very long section to determine the system's networking
# capabilities. The order of the tests is significant.
#
@@ -1703,10 +1919,13 @@ AC_TRY_COMPILE([
[struct addrinfo a; return (0);],
[AC_MSG_RESULT(yes)
ISC_LWRES_NEEDADDRINFO="#undef ISC_LWRES_NEEDADDRINFO"
+ ISC_IRS_NEEDADDRINFO="#undef ISC_IRS_NEEDADDRINFO"
AC_DEFINE(HAVE_ADDRINFO)],
[AC_MSG_RESULT(no)
- ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"])
+ ISC_LWRES_NEEDADDRINFO="#define ISC_LWRES_NEEDADDRINFO 1"
+ ISC_IRS_NEEDADDRINFO="#define ISC_IRS_NEEDADDRINFO 1"])
AC_SUBST(ISC_LWRES_NEEDADDRINFO)
+AC_SUBST(ISC_IRS_NEEDADDRINFO)
#
# Check for rrsetinfo
@@ -1793,6 +2012,53 @@ AC_TRY_COMPILE([
ISC_LWRES_NEEDHERRNO="#define ISC_LWRES_NEEDHERRNO 1"])
AC_SUBST(ISC_LWRES_NEEDHERRNO)
+#
+# Sadly, the definitions of system-supplied getnameinfo(3) vary. Try to catch
+# known variations here:
+#
+AC_MSG_CHECKING(for getnameinfo prototype definitions)
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int getnameinfo(const struct sockaddr *, socklen_t, char *,
+ socklen_t, char *, socklen_t, unsigned int);],
+[ return (0);],
+ [AC_MSG_RESULT(socklen_t for buflen; u_int for flags)
+ AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t,
+ [Define to the buffer length type used by getnameinfo(3).])
+ AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, unsigned int,
+ [Define to the flags type used by getnameinfo(3).])],
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+int getnameinfo(const struct sockaddr *, socklen_t, char *,
+ size_t, char *, size_t, int);],
+[ return (0);],
+ [AC_MSG_RESULT(size_t for buflen; int for flags)
+ AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t)
+ AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)],
+[AC_MSG_RESULT(not match any subspecies; assume standard definition)
+AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, socklen_t)
+AC_DEFINE(IRS_GETNAMEINFO_FLAGS_T, int)])])
+
+#
+# ...and same for gai_strerror().
+#
+AC_MSG_CHECKING(for gai_strerror prototype definitions)
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+char *gai_strerror(int ecode);],
+[ return (0); ],
+ [AC_MSG_RESULT(returning char *)
+ AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [char *],
+ [return type of gai_strerror])],
+[AC_MSG_RESULT(not match any subspecies; assume standard definition)
+AC_DEFINE([IRS_GAISTRERROR_RETURN_T], [const char *])])
+
AC_CHECK_FUNC(getipnodebyname,
[ISC_LWRES_GETIPNODEPROTO="#undef ISC_LWRES_GETIPNODEPROTO"],
[ISC_LWRES_GETIPNODEPROTO="#define ISC_LWRES_GETIPNODEPROTO 1"])
@@ -1807,6 +2073,7 @@ AC_CHECK_FUNC(gai_strerror, AC_DEFINE(HAVE_GAISTRERROR))
AC_SUBST(ISC_LWRES_GETIPNODEPROTO)
AC_SUBST(ISC_LWRES_GETADDRINFOPROTO)
AC_SUBST(ISC_LWRES_GETNAMEINFOPROTO)
+AC_SUBST(ISC_IRS_GETNAMEINFOSOCKLEN)
AC_ARG_ENABLE(getifaddrs,
[ --enable-getifaddrs Enable the use of getifaddrs() [[yes|no]].],
@@ -2140,6 +2407,8 @@ AC_SUBST(ISC_PLATFORM_USEDECLSPEC)
ISC_PLATFORM_USEDECLSPEC="#undef ISC_PLATFORM_USEDECLSPEC"
AC_SUBST(LWRES_PLATFORM_USEDECLSPEC)
LWRES_PLATFORM_USEDECLSPEC="#undef LWRES_PLATFORM_USEDECLSPEC"
+AC_SUBST(IRS_PLATFORM_USEDECLSPEC)
+IRS_PLATFORM_USEDECLSPEC="#undef IRS_PLATFORM_USEDECLSPEC"
#
# Random remaining OS-specific issues involving compiler warnings.
@@ -2461,6 +2730,61 @@ case "$enable_fixed" in
esac
#
+# Enable response policy rewriting using NS IP addresses
+#
+AC_ARG_ENABLE(rpz-nsip,
+ [ --enable-rpz-nsip enable rpz-nsip rules [[default=no]]],
+ enable_nsip="$enableval",
+ enable_nsip="no")
+case "$enable_nsip" in
+ yes)
+ AC_DEFINE(ENABLE_RPZ_NSIP, 1,
+ [Define to enable rpz-nsip rules.])
+ ;;
+ no)
+ ;;
+ *)
+ ;;
+esac
+
+#
+# Enable response policy rewriting using NS name
+#
+AC_ARG_ENABLE(rpz-nsdname,
+ [ --enable-rpz-nsdname enable rpz-nsdname rules [[default=no]]],
+ enable_nsdname="$enableval",
+ enable_nsdname="no")
+case "$enable_nsdname" in
+ yes)
+ AC_DEFINE(ENABLE_RPZ_NSDNAME, 1,
+ [Define to enable rpz-nsdname rules.])
+ ;;
+ no)
+ ;;
+ *)
+ ;;
+esac
+
+#
+# Activate "filter-aaaa-on-v4" or not?
+#
+AC_ARG_ENABLE(filter-aaaa,
+ [ --enable-filter-aaaa enable filtering of AAAA records over IPv4
+ [[default=no]]],
+ enable_filter="$enableval",
+ enable_filter="no")
+case "$enable_filter" in
+ yes)
+ AC_DEFINE(ALLOW_FILTER_AAAA_ON_V4, 1,
+ [Define to enable the "filter-aaaa-on-v4" option.])
+ ;;
+ no)
+ ;;
+ *)
+ ;;
+esac
+
+#
# The following sets up how non-blocking i/o is established.
# Sunos, cygwin and solaris 2.x (x<5) require special handling.
#
@@ -2780,6 +3104,9 @@ LIBBIND9_API=$srcdir/lib/bind9/api
AC_SUBST_FILE(LIBLWRES_API)
LIBLWRES_API=$srcdir/lib/lwres/api
+AC_SUBST_FILE(LIBIRS_API)
+LIBIRS_API=$srcdir/lib/irs/api
+
#
# Configure any DLZ drivers.
#
@@ -2947,37 +3274,115 @@ AC_CONFIG_COMMANDS(
#
AC_CONFIG_FILES([
+ make/Makefile
+ make/mkdep
Makefile
- make/Makefile
- make/mkdep
+ bin/Makefile
+ bin/check/Makefile
+ bin/confgen/Makefile
+ bin/confgen/unix/Makefile
+ bin/dig/Makefile
+ bin/dnssec/Makefile
+ bin/named/Makefile
+ bin/named/unix/Makefile
+ bin/nsupdate/Makefile
+ bin/pkcs11/Makefile
+ bin/rndc/Makefile
+ bin/tests/Makefile
+ bin/tests/atomic/Makefile
+ bin/tests/db/Makefile
+ bin/tests/dst/Makefile
+ bin/tests/hashes/Makefile
+ bin/tests/headerdep_test.sh
+ bin/tests/master/Makefile
+ bin/tests/mem/Makefile
+ bin/tests/names/Makefile
+ bin/tests/net/Makefile
+ bin/tests/rbt/Makefile
+ bin/tests/resolver/Makefile
+ bin/tests/sockaddr/Makefile
+ bin/tests/system/Makefile
+ bin/tests/system/conf.sh
+ bin/tests/system/filter-aaaa/Makefile
+ bin/tests/system/gost/prereq.sh
+ bin/tests/system/lwresd/Makefile
+ bin/tests/system/rpz/Makefile
+ bin/tests/system/tkey/Makefile
+ bin/tests/tasks/Makefile
+ bin/tests/timers/Makefile
+ bin/tests/virtual-time/Makefile
+ bin/tests/virtual-time/conf.sh
+ bin/tools/Makefile
+ contrib/check-secure-delegation.pl
+ contrib/zone-edit.sh
+ doc/Makefile
+ doc/arm/Makefile
+ doc/doxygen/Doxyfile
+ doc/doxygen/Makefile
+ doc/doxygen/doxygen-input-filter
+ doc/misc/Makefile
+ doc/xsl/Makefile
+ doc/xsl/isc-docbook-chunk.xsl
+ doc/xsl/isc-docbook-html.xsl
+ doc/xsl/isc-docbook-latex.xsl
+ doc/xsl/isc-manpage.xsl
+ isc-config.sh
lib/Makefile
+ lib/bind9/Makefile
+ lib/bind9/include/Makefile
+ lib/bind9/include/bind9/Makefile
+ lib/dns/Makefile
+ lib/dns/include/Makefile
+ lib/dns/include/dns/Makefile
+ lib/dns/include/dst/Makefile
+ lib/export/Makefile
+ lib/export/dns/Makefile
+ lib/export/dns/include/Makefile
+ lib/export/dns/include/dns/Makefile
+ lib/export/dns/include/dst/Makefile
+ lib/export/irs/Makefile
+ lib/export/irs/include/Makefile
+ lib/export/irs/include/irs/Makefile
+ lib/export/isc/$thread_dir/Makefile
+ lib/export/isc/$thread_dir/include/Makefile
+ lib/export/isc/$thread_dir/include/isc/Makefile
+ lib/export/isc/Makefile
+ lib/export/isc/include/Makefile
+ lib/export/isc/include/isc/Makefile
+ lib/export/isc/nls/Makefile
+ lib/export/isc/unix/Makefile
+ lib/export/isc/unix/include/Makefile
+ lib/export/isc/unix/include/isc/Makefile
+ lib/export/isccfg/Makefile
+ lib/export/isccfg/include/Makefile
+ lib/export/isccfg/include/isccfg/Makefile
+ lib/export/samples/Makefile
+ lib/export/samples/Makefile-postinstall
+ lib/irs/Makefile
+ lib/irs/include/Makefile
+ lib/irs/include/irs/Makefile
+ lib/irs/include/irs/netdb.h
+ lib/irs/include/irs/platform.h
+ lib/isc/$arch/Makefile
+ lib/isc/$arch/include/Makefile
+ lib/isc/$arch/include/isc/Makefile
+ lib/isc/$thread_dir/Makefile
+ lib/isc/$thread_dir/include/Makefile
+ lib/isc/$thread_dir/include/isc/Makefile
lib/isc/Makefile
lib/isc/include/Makefile
lib/isc/include/isc/Makefile
lib/isc/include/isc/platform.h
+ lib/isc/nls/Makefile
lib/isc/unix/Makefile
lib/isc/unix/include/Makefile
lib/isc/unix/include/isc/Makefile
- lib/isc/nls/Makefile
- lib/isc/$thread_dir/Makefile
- lib/isc/$thread_dir/include/Makefile
- lib/isc/$thread_dir/include/isc/Makefile
- lib/isc/$arch/Makefile
- lib/isc/$arch/include/Makefile
- lib/isc/$arch/include/isc/Makefile
lib/isccc/Makefile
lib/isccc/include/Makefile
lib/isccc/include/isccc/Makefile
lib/isccfg/Makefile
lib/isccfg/include/Makefile
lib/isccfg/include/isccfg/Makefile
- lib/dns/Makefile
- lib/dns/include/Makefile
- lib/dns/include/dns/Makefile
- lib/dns/include/dst/Makefile
- lib/bind9/Makefile
- lib/bind9/include/Makefile
- lib/bind9/include/bind9/Makefile
lib/lwres/Makefile
lib/lwres/include/Makefile
lib/lwres/include/lwres/Makefile
@@ -2990,44 +3395,6 @@ AC_CONFIG_FILES([
lib/tests/Makefile
lib/tests/include/Makefile
lib/tests/include/tests/Makefile
- bin/Makefile
- bin/check/Makefile
- bin/named/Makefile
- bin/named/unix/Makefile
- bin/rndc/Makefile
- bin/rndc/unix/Makefile
- bin/dig/Makefile
- bin/nsupdate/Makefile
- bin/tests/Makefile
- bin/tests/names/Makefile
- bin/tests/master/Makefile
- bin/tests/rbt/Makefile
- bin/tests/db/Makefile
- bin/tests/tasks/Makefile
- bin/tests/timers/Makefile
- bin/tests/dst/Makefile
- bin/tests/mem/Makefile
- bin/tests/hashes/Makefile
- bin/tests/net/Makefile
- bin/tests/sockaddr/Makefile
- bin/tests/system/Makefile
- bin/tests/system/conf.sh
- bin/tests/system/lwresd/Makefile
- bin/tests/system/tkey/Makefile
- bin/tests/headerdep_test.sh
- bin/dnssec/Makefile
- doc/Makefile
- doc/arm/Makefile
- doc/misc/Makefile
- isc-config.sh
- doc/xsl/Makefile
- doc/xsl/isc-docbook-chunk.xsl
- doc/xsl/isc-docbook-html.xsl
- doc/xsl/isc-docbook-latex.xsl
- doc/xsl/isc-manpage.xsl
- doc/doxygen/Doxyfile
- doc/doxygen/Makefile
- doc/doxygen/doxygen-input-filter
])
#
diff --git a/contrib/bind9/doc/arm/Bv9ARM-book.xml b/contrib/bind9/doc/arm/Bv9ARM-book.xml
index 0013c2e..c351784 100644
--- a/contrib/bind9/doc/arm/Bv9ARM-book.xml
+++ b/contrib/bind9/doc/arm/Bv9ARM-book.xml
@@ -2,7 +2,7 @@
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY mdash "&#8212;">]>
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- File: $Id: Bv9ARM-book.xml,v 1.380.14.28 2010-08-20 01:38:26 marka Exp $ -->
+<!-- File: $Id: Bv9ARM-book.xml,v 1.478.8.2.2.1 2011-06-09 03:17:11 marka Exp $ -->
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<title>BIND 9 Administrator Reference Manual</title>
@@ -31,6 +31,7 @@
<year>2008</year>
<year>2009</year>
<year>2010</year>
+ <year>2011</year>
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
</copyright>
<copyright>
@@ -69,7 +70,7 @@
</para>
<para>
- This version of the manual corresponds to BIND version 9.6.
+ This version of the manual corresponds to BIND version 9.7.
</para>
</sect1>
@@ -644,9 +645,9 @@
<para>
ISC <acronym>BIND</acronym> 9 compiles and runs on a large
number
- of Unix-like operating systems and on NT-derived versions of
- Microsoft Windows such as Windows 2000 and Windows XP. For an
- up-to-date
+ of Unix-like operating systems and on
+ Microsoft Windows Server 2003 and 2008, and Windows XP and Vista.
+ For an up-to-date
list of supported systems, see the README file in the top level
directory
of the BIND 9 source distribution.
@@ -680,10 +681,13 @@
// Two corporate subnets we wish to allow queries from.
acl corpnets { 192.168.4.0/24; 192.168.7.0/24; };
options {
- directory "/etc/namedb"; // Working directory
+ // Working directory
+ directory "/etc/namedb";
+
allow-query { corpnets; };
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -703,13 +707,18 @@ zone "0.0.127.in-addr.arpa" {
<programlisting>
options {
- directory "/etc/namedb"; // Working directory
- allow-query-cache { none; }; // Do not allow access to cache
- allow-query { any; }; // This is the default
- recursion no; // Do not provide recursive service
+ // Working directory
+ directory "/etc/namedb";
+ // Do not allow access to cache
+ allow-query-cache { none; };
+ // This is the default
+ allow-query { any; };
+ // Do not provide recursive service
+ recursion no;
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -719,7 +728,8 @@ zone "0.0.127.in-addr.arpa" {
zone "example.com" {
type master;
file "example.com.db";
- // IP addresses of slave servers allowed to transfer example.com
+ // IP addresses of slave servers allowed to
+ // transfer example.com
allow-transfer {
192.168.4.14;
192.168.5.53;
@@ -881,7 +891,7 @@ zone "eng.example.com" {
</para>
<para>
For more detail on ordering responses, check the
- <command>rrset-order</command> substatement in the
+ <command>rrset-order</command> sub-statement in the
<command>options</command> statement, see
<xref endterm="rrset_ordering_title" linkend="rrset_ordering"/>.
</para>
@@ -1162,7 +1172,62 @@ zone "eng.example.com" {
</varlistentry>
<varlistentry>
+ <term><userinput>sign <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional></userinput></term>
+ <listitem>
+ <para>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <command>key-directory</command> in
+ <xref linkend="options"/>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. If the DNSKEY RRset
+ is changed, then the zone is automatically
+ re-signed with the new key set.
+ </para>
+ <para>
+ This command requires that the
+ <command>auto-dnssec</command> zone option to be set
+ to <literal>allow</literal>,
+ <literal>maintain</literal>, or
+ <literal>create</literal>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <xref linkend="dynamic_update_policies"/> for
+ more details.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><userinput>loadkeys <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional></userinput></term>
+ <listitem>
+ <para>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <command>key-directory</command> in
+ <xref linkend="options"/>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. Unlike <command>rndc
+ sign</command>, however, the zone is not
+ immediately re-signed by the new keys, but is
+ allowed to incrementally re-sign over time.
+ </para>
+ <para>
+ This command requires that the
+ <command>auto-dnssec</command> zone option to
+ be set to <literal>maintain</literal> or
+ <literal>create</literal>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <xref linkend="dynamic_update_policies"/> for
+ more details.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><userinput>freeze
<optional><replaceable>zone</replaceable>
<optional><replaceable>class</replaceable>
@@ -1271,6 +1336,19 @@ zone "eng.example.com" {
</varlistentry>
<varlistentry>
+ <term><userinput>secroots
+ <optional><replaceable>view ...</replaceable></optional></userinput></term>
+ <listitem>
+ <para>
+ Dump the server's security roots to the secroots
+ file for the specified views. If no view is
+ specified, security roots for all
+ views are dumped.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><userinput>stop <optional>-p</optional></userinput></term>
<listitem>
<para>
@@ -1383,6 +1461,65 @@ zone "eng.example.com" {
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><userinput>addzone
+ <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional>
+ <replaceable>configuration</replaceable>
+ </userinput></term>
+ <listitem>
+ <para>
+ Add a zone while the server is running. This
+ command requires the
+ <command>allow-new-zones</command> option to be set
+ to <userinput>yes</userinput>. The
+ <replaceable>configuration</replaceable> string
+ specified on the command line is the zone
+ configuration text that would ordinarily be
+ placed in <filename>named.conf</filename>.
+ </para>
+ <para>
+ The configuration is saved in a file called
+ <filename><replaceable>hash</replaceable>.nzf</filename>,
+ where <replaceable>hash</replaceable> is a
+ cryptographic hash generated from the name of
+ the view. When <command>named</command> is
+ restarted, the file will be loaded into the view
+ configuration, so that zones that were added
+ can persist after a restart.
+ </para>
+ <para>
+ This sample <command>addzone</command> command
+ would add the zone <literal>example.com</literal>
+ to the default view:
+ </para>
+ <para>
+<prompt>$ </prompt><userinput>rndc addzone example.com '{ type master; file "example.com.db"; };'</userinput>
+ </para>
+ <para>
+ (Note the brackets and semi-colon around the zone
+ configuration text.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><userinput>delzone
+ <replaceable>zone</replaceable>
+ <optional><replaceable>class</replaceable>
+ <optional><replaceable>view</replaceable></optional></optional>
+ </userinput></term>
+ <listitem>
+ <para>
+ Delete a zone while the server is running.
+ Only zones that were originally added via
+ <command>rndc addzone</command> can be deleted
+ in this matter.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
<para>
@@ -1488,7 +1625,8 @@ zone "eng.example.com" {
<programlisting>
key rndc_key {
algorithm "hmac-md5";
- secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
+ secret
+ "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};
options {
default-server 127.0.0.1;
@@ -1514,7 +1652,8 @@ options {
<programlisting>
controls {
- inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
+ inet 127.0.0.1
+ allow { localhost; } keys { rndc_key; };
};
</programlisting>
@@ -1641,14 +1780,27 @@ controls {
<para>
Dynamic update is enabled by including an
- <command>allow-update</command> or <command>update-policy</command>
- clause in the <command>zone</command> statement. The
- <command>tkey-gssapi-credential</command> and
- <command>tkey-domain</command> clauses in the
- <command>options</command> statement enable the
- server to negotiate keys that can be matched against those
- in <command>update-policy</command> or
- <command>allow-update</command>.
+ <command>allow-update</command> or an <command>update-policy</command>
+ clause in the <command>zone</command> statement.
+ </para>
+
+ <para>
+ If the zone's <command>update-policy</command> is set to
+ <userinput>local</userinput>, updates to the zone
+ will be permitted for the key <varname>local-ddns</varname>,
+ which will be generated by <command>named</command> at startup.
+ See <xref linkend="dynamic_update_policies"/> for more details.
+ </para>
+
+ <para>
+ Dynamic updates using Kerberos signed requests can be made
+ using the TKEY/GSS protocol by setting either the
+ <command>tkey-gssapi-keytab</command> option, or alternatively
+ by setting both the <command>tkey-gssapi-credential</command>
+ and <command>tkey-domain</command> options. Once enabled,
+ Kerberos signed requests will be matched against the update
+ policies for the zone, using the Kerberos principal as the
+ signer for the request.
</para>
<para>
@@ -1660,7 +1812,7 @@ controls {
</para>
<sect2 id="journal">
- <title>The journal file</title>
+ <title>The journal file</title>
<para>
All changes made to a zone using dynamic update are stored
@@ -1814,7 +1966,7 @@ controls {
and <filename>site2.example.com</filename>, to the servers
in the
DMZ. These internal servers will have complete sets of information
- for <filename>site1.example.com</filename>, <filename>site2.example.com</filename>,<emphasis/> <filename>site1.internal</filename>,
+ for <filename>site1.example.com</filename>, <filename>site2.example.com</filename>, <filename>site1.internal</filename>,
and <filename>site2.internal</filename>.
</para>
<para>
@@ -1927,26 +2079,32 @@ options {
...
...
forward only;
- forwarders { // forward to external servers
+ // forward to external servers
+ forwarders {
<varname>bastion-ips-go-here</varname>;
};
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { internals; externals; }; // restrict query access
- allow-recursion { internals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // restrict query access
+ allow-query { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; };
...
...
};
-zone "site1.example.com" { // sample master zone
+// sample master zone
+zone "site1.example.com" {
type master;
file "m/site1.example.com";
- forwarders { }; // do normal iterative
- // resolution (do not forward)
+ // do normal iterative resolution (do not forward)
+ forwarders { };
allow-query { internals; externals; };
allow-transfer { internals; };
};
-zone "site2.example.com" { // sample slave zone
+// sample slave zone
+zone "site2.example.com" {
type slave;
file "s/site2.example.com";
masters { 172.16.72.3; };
@@ -1985,15 +2143,20 @@ acl externals { bastion-ips-go-here; };
options {
...
...
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { any; }; // default query access
- allow-query-cache { internals; externals; }; // restrict cache access
- allow-recursion { internals; externals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // default query access
+ allow-query { any; };
+ // restrict cache access
+ allow-query-cache { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; externals; };
...
...
};
-zone "site1.example.com" { // sample slave zone
+// sample slave zone
+zone "site1.example.com" {
type master;
file "m/site1.foo.com";
allow-transfer { internals; externals; };
@@ -2187,9 +2350,8 @@ allow-update { key host1-host2. ;};
</para>
<para>
- You may want to read about the more powerful
- <command>update-policy</command> statement in
- <xref linkend="dynamic_update_policies"/>.
+ See <xref linkend="dynamic_update_policies"/> for a discussion of
+ the more flexible <command>update-policy</command> statement.
</para>
</sect2>
@@ -2453,12 +2615,23 @@ allow-update { key host1-host2. ;};
<para>
To enable <command>named</command> to validate answers from
- other servers, the <command>dnssec-enable</command> and
- <command>dnssec-validation</command> options must both be
- set to yes (the default setting in <acronym>BIND</acronym> 9.5
- and later), and at least one trust anchor must be configured
- with a <command>trusted-keys</command> statement in
- <filename>named.conf</filename>.
+ other servers, the <command>dnssec-enable</command> option
+ must be set to <userinput>yes</userinput>, and the
+ <command>dnssec-validation</command> options must be set to
+ <userinput>yes</userinput> or <userinput>auto</userinput>.
+ </para>
+
+ <para>
+ If <command>dnssec-validation</command> is set to
+ <userinput>auto</userinput>, then a default
+ trust anchor for the DNS root zone will be used.
+ If it is set to <userinput>yes</userinput>, however,
+ then at least one trust anchor must be configured
+ with a <command>trusted-keys</command> or
+ <command>managed-keys</command> statement in
+ <filename>named.conf</filename>, or DNSSEC validation
+ will not occur. The default setting is
+ <userinput>yes</userinput>.
</para>
<para>
@@ -2471,7 +2644,14 @@ allow-update { key host1-host2. ;};
</para>
<para>
- <command>trusted-keys</command> are described in more detail
+ <command>managed-keys</command> are trusted keys which are
+ automatically kept up to date via RFC 5011 trust anchor
+ maintenance.
+ </para>
+
+ <para>
+ <command>trusted-keys</command> and
+ <command>managed-keys</command> are described in more detail
later in this document.
</para>
@@ -2484,45 +2664,59 @@ allow-update { key host1-host2. ;};
<para>
After DNSSEC gets established, a typical DNSSEC configuration
- will look something like the following. It has a one or
+ will look something like the following. It has one or
more public keys for the root. This allows answers from
outside the organization to be validated. It will also
have several keys for parts of the namespace the organization
- controls. These are here to ensure that <command>named</command> is immune
- to compromises in the DNSSEC components of the security
- of parent zones.
+ controls. These are here to ensure that <command>named</command>
+ is immune to compromises in the DNSSEC components of the security
+ of parent zones.
</para>
<programlisting>
-trusted-keys {
-
+managed-keys {
/* Root Key */
-"." 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwSJxrGkxJWoZu6I7PzJu/
- E9gx4UC1zGAHlXKdE4zYIpRhaBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3
- zy2Xy4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYghf+6fElrmLkdaz
- MQ2OCnACR817DF4BBa7UR/beDHyp5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M
- /lUUVRbkeg1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq66gKodQj+M
- iA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ97S+LKUTpQcq27R7AT3/V5hRQxScI
- Nqwcz4jYqZD2fQdgxbcDTClU0CRBdiieyLMNzXG3";
-
-/* Key for our organization's forward zone */
-example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM65KbhTjrW1ZaARmPhEZZe
- 3Y9ifgEuq7vZ/zGZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb4JKUbb
- OTcM8pwXlj0EiX3oDFVmjHO444gLkBO UKUf/mC7HvfwYH/Be22GnC
- lrinKJp1Og4ywzO9WglMk7jbfW33gUKvirTHr25GL7STQUzBb5Usxt
- 8lgnyTUHs1t3JwCY5hKZ6CqFxmAVZP20igTixin/1LcrgX/KMEGd/b
- iuvF4qJCyduieHukuY3H4XMAcR+xia2 nIUPvm/oyWR8BW/hWdzOvn
- SCThlHf3xiYleDbt/o1OTQ09A0=";
-
-/* Key for our reverse zone. */
-2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwcxOdNax071L18QqZnQQQA
- VVr+iLhGTnNGp3HoWQLUIzKrJVZ3zggy3WwNT6kZo6c0
- tszYqbtvchmgQC8CzKojM/W16i6MG/ea fGU3siaOdS0
- yOI6BgPsw+YZdzlYMaIJGf4M4dyoKIhzdZyQ2bYQrjyQ
- 4LB0lC7aOnsMyYKHHYeRv PxjIQXmdqgOJGq+vsevG06
- zW+1xgYJh9rCIfnm1GX/KMgxLPG2vXTD/RnLX+D3T3UL
- 7HJYHJhAZD5L59VvjSPsZJHeDCUyWYrvPZesZDIRvhDD
- 52SKvbheeTJUm6EhkzytNN2SN96QRk8j/iI8ib";
+ "." initial-key 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwS
+ JxrGkxJWoZu6I7PzJu/E9gx4UC1zGAHlXKdE4zYIpRh
+ aBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3zy2Xy
+ 4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYg
+ hf+6fElrmLkdaz MQ2OCnACR817DF4BBa7UR/beDHyp
+ 5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M/lUUVRbke
+ g1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq
+ 66gKodQj+MiA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ
+ 97S+LKUTpQcq27R7AT3/V5hRQxScINqwcz4jYqZD2fQ
+ dgxbcDTClU0CRBdiieyLMNzXG3";
+};
+
+trusted-keys {
+ /* Key for our organization's forward zone */
+ example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM6
+ 5KbhTjrW1ZaARmPhEZZe3Y9ifgEuq7vZ/z
+ GZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb
+ 4JKUbbOTcM8pwXlj0EiX3oDFVmjHO444gL
+ kBOUKUf/mC7HvfwYH/Be22GnClrinKJp1O
+ g4ywzO9WglMk7jbfW33gUKvirTHr25GL7S
+ TQUzBb5Usxt8lgnyTUHs1t3JwCY5hKZ6Cq
+ FxmAVZP20igTixin/1LcrgX/KMEGd/biuv
+ F4qJCyduieHukuY3H4XMAcR+xia2nIUPvm
+ /oyWR8BW/hWdzOvnSCThlHf3xiYleDbt/o
+ 1OTQ09A0=";
+
+ /* Key for our reverse zone. */
+ 2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwc
+ xOdNax071L18QqZnQQQAVVr+i
+ LhGTnNGp3HoWQLUIzKrJVZ3zg
+ gy3WwNT6kZo6c0tszYqbtvchm
+ gQC8CzKojM/W16i6MG/eafGU3
+ siaOdS0yOI6BgPsw+YZdzlYMa
+ IJGf4M4dyoKIhzdZyQ2bYQrjy
+ Q4LB0lC7aOnsMyYKHHYeRvPxj
+ IQXmdqgOJGq+vsevG06zW+1xg
+ YJh9rCIfnm1GX/KMgxLPG2vXT
+ D/RnLX+D3T3UL7HJYHJhAZD5L
+ 59VvjSPsZJHeDCUyWYrvPZesZ
+ DIRvhDD52SKvbheeTJUm6Ehkz
+ ytNN2SN96QRk8j/iI8ib";
};
options {
@@ -2575,6 +2769,13 @@ options {
</sect2>
</sect1>
+
+ <xi:include href="dnssec.xml"/>
+
+ <xi:include href="managed-keys.xml"/>
+
+ <xi:include href="pkcs11.xml"/>
+
<sect1>
<title>IPv6 Support in <acronym>BIND</acronym> 9</title>
@@ -2653,7 +2854,8 @@ host 3600 IN AAAA 2001:db8::1
<programlisting>
$ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
-1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR host.example.com.
+1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR (
+ host.example.com. )
</programlisting>
</sect2>
@@ -2831,6 +3033,19 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
<row rowsep="0">
<entry colname="1">
<para>
+ <varname>namelist</varname>
+ </para>
+ </entry>
+ <entry colname="2">
+ <para>
+ A list of one or more <varname>domain_name</varname>
+ elements.
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
<varname>dotted_decimal</varname>
</para>
</entry>
@@ -3224,7 +3439,8 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
<para>
<programlisting>/* This is a <acronym>BIND</acronym> comment as in C */</programlisting>
<programlisting>// This is a <acronym>BIND</acronym> comment as in C++</programlisting>
- <programlisting># This is a <acronym>BIND</acronym> comment as in common UNIX shells and perl</programlisting>
+ <programlisting># This is a <acronym>BIND</acronym> comment as in common UNIX shells
+# and perl</programlisting>
</para>
</sect3>
<sect3>
@@ -3439,6 +3655,17 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
</row>
<row rowsep="0">
<entry colname="1">
+ <para><command>managed-keys</command></para>
+ </entry>
+ <entry colname="2">
+ <para>
+ lists DNSSEC keys to be kept up to date
+ using RFC 5011 trust anchor maintenance.
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
<para><command>view</command></para>
</entry>
<entry colname="2">
@@ -3559,10 +3786,12 @@ $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
<title><command>controls</command> Statement Grammar</title>
<programlisting><command>controls</command> {
- [ inet ( ip_addr | * ) [ port ip_port ] allow { <replaceable> address_match_list </replaceable> }
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ allow { <replaceable> address_match_list </replaceable> }
keys { <replaceable>key_list</replaceable> }; ]
[ inet ...; ]
- [ unix <replaceable>path</replaceable> perm <replaceable>number</replaceable> owner <replaceable>number</replaceable> group <replaceable>number</replaceable> keys { <replaceable>key_list</replaceable> }; ]
+ [ unix <replaceable>path</replaceable> perm <replaceable>number</replaceable> owner <replaceable>number</replaceable> group <replaceable>number</replaceable>
+ keys { <replaceable>key_list</replaceable> }; ]
[ unix ...; ]
};
</programlisting>
@@ -4031,32 +4260,30 @@ notrace</command>. All debugging messages in the server have a debug
</para>
<programlisting>channel default_syslog {
- syslog daemon; // send to syslog's daemon
- // facility
- severity info; // only send priority info
- // and higher
-};
+ // send to syslog's daemon facility
+ syslog daemon;
+ // only send priority info and higher
+ severity info;
channel default_debug {
- file "named.run"; // write to named.run in
- // the working directory
- // Note: stderr is used instead
- // of "named.run"
- // if the server is started
- // with the '-f' option.
- severity dynamic; // log at the server's
- // current debug level
+ // write to named.run in the working directory
+ // Note: stderr is used instead of "named.run" if
+ // the server is started with the '-f' option.
+ file "named.run";
+ // log at the server's current debug level
+ severity dynamic;
};
channel default_stderr {
- stderr; // writes to stderr
- severity info; // only send priority info
- // and higher
+ // writes to stderr
+ stderr;
+ // only send priority info and higher
+ severity info;
};
channel null {
- null; // toss anything sent to
- // this channel
+ // toss anything sent to this channel
+ null;
};
</programlisting>
@@ -4308,12 +4535,14 @@ category notify { null; };
<para>
The query log entry reports the client's IP
address and port number, and the query name,
- class and type. It also reports whether the
+ class and type. Next it reports whether the
Recursion Desired flag was set (+ if set, -
if not set), if the query was signed (S),
- EDNS was in use (E), if DO (DNSSEC Ok) was
- set (D), or if CD (Checking Disabled) was set
- (C).
+ EDNS was in use (E), if TCP was used (T), if
+ DO (DNSSEC Ok) was set (D), or if CD (Checking
+ Disabled) was set (C). After this the
+ destination address the query was sent to is
+ reported.
</para>
<para>
@@ -4453,7 +4682,13 @@ category notify { null; };
The log message will look like as follows:
</para>
<para>
- <computeroutput>fetch completed at resolver.c:2970 for www.example.com/A in 30.000183: timed out/success [domain:example.com,referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,badresp:1,adberr:0,findfail:0,valfail:0]</computeroutput>
+<!-- NOTE: newlines and some spaces added so this would fit on page -->
+ <programlisting>
+fetch completed at resolver.c:2970 for www.example.com/A
+in 30.000183: timed out/success [domain:example.com,
+referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,
+badresp:1,adberr:0,findfail:0,valfail:0]
+ </programlisting>
</para>
<para>
The first part before the colon shows that a recursive
@@ -4485,8 +4720,8 @@ category notify { null; };
<informaltable colsep="0" rowsep="0">
<tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="4Level-table">
- <colspec colname="1" colnum="1" colsep="0" />
- <colspec colname="2" colnum="2" colsep="0" />
+ <colspec colname="1" colnum="1" colsep="0" colwidth="1.150in"/>
+ <colspec colname="2" colnum="2" colsep="0" colwidth="3.350in"/>
<tbody>
<row rowsep="0">
<entry colname="1">
@@ -4651,7 +4886,8 @@ category notify { null; };
</para>
<programlisting><command>lwres</command> {
- <optional> listen-on { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> listen-on { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> view <replaceable>view_name</replaceable>; </optional>
<optional> search { <replaceable>domain_name</replaceable> ; <optional> <replaceable>domain_name</replaceable> ; ... </optional> }; </optional>
<optional> ndots <replaceable>number</replaceable>; </optional>
@@ -4718,7 +4954,8 @@ category notify { null; };
<title><command>masters</command> Statement Grammar</title>
<programlisting>
-<command>masters</command> <replaceable>name</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> };
+<command>masters</command> <replaceable>name</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> |
+ <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> };
</programlisting>
</sect2>
@@ -4741,17 +4978,21 @@ category notify { null; };
</para>
<programlisting><command>options</command> {
+ <optional> attach-cache <replaceable>cache_name</replaceable>; </optional>
<optional> version <replaceable>version_string</replaceable>; </optional>
<optional> hostname <replaceable>hostname_string</replaceable>; </optional>
<optional> server-id <replaceable>server_id_string</replaceable>; </optional>
<optional> directory <replaceable>path_name</replaceable>; </optional>
<optional> key-directory <replaceable>path_name</replaceable>; </optional>
+ <optional> managed-keys-directory <replaceable>path_name</replaceable>; </optional>
<optional> named-xfer <replaceable>path_name</replaceable>; </optional>
+ <optional> tkey-gssapi-keytab <replaceable>path_name</replaceable>; </optional>
<optional> tkey-gssapi-credential <replaceable>principal</replaceable>; </optional>
<optional> tkey-domain <replaceable>domainname</replaceable>; </optional>
<optional> tkey-dhkey <replaceable>key_name</replaceable> <replaceable>key_tag</replaceable>; </optional>
<optional> cache-file <replaceable>path_name</replaceable>; </optional>
<optional> dump-file <replaceable>path_name</replaceable>; </optional>
+ <optional> bindkeys-file <replaceable>path_name</replaceable>; </optional>
<optional> memstatistics <replaceable>yes_or_no</replaceable>; </optional>
<optional> memstatistics-file <replaceable>path_name</replaceable>; </optional>
<optional> pid-file <replaceable>path_name</replaceable>; </optional>
@@ -4776,8 +5017,9 @@ category notify { null; };
<optional> maintain-ixfr-base <replaceable>yes_or_no</replaceable>; </optional>
<optional> ixfr-from-differences (<replaceable>yes_or_no</replaceable> | <constant>master</constant> | <constant>slave</constant>); </optional>
<optional> dnssec-enable <replaceable>yes_or_no</replaceable>; </optional>
- <optional> dnssec-validation <replaceable>yes_or_no</replaceable>; </optional>
- <optional> dnssec-lookaside <replaceable>domain</replaceable> trust-anchor <replaceable>domain</replaceable>; </optional>
+ <optional> dnssec-validation (<replaceable>yes_or_no</replaceable> | <constant>auto</constant>); </optional>
+ <optional> dnssec-lookaside ( <replaceable>auto</replaceable> |
+ <replaceable>domain</replaceable> trust-anchor <replaceable>domain</replaceable> ); </optional>
<optional> dnssec-must-be-secure <replaceable>domain yes_or_no</replaceable>; </optional>
<optional> dnssec-accept-expired <replaceable>yes_or_no</replaceable>; </optional>
<optional> forward ( <replaceable>only</replaceable> | <replaceable>first</replaceable> ); </optional>
@@ -4788,12 +5030,14 @@ category notify { null; };
... }; </optional>
<optional> check-names ( <replaceable>master</replaceable> | <replaceable>slave</replaceable> | <replaceable>response</replaceable> )
( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
+ <optional> check-dup-records ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-mx ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-wildcard <replaceable>yes_or_no</replaceable>; </optional>
<optional> check-integrity <replaceable>yes_or_no</replaceable>; </optional>
<optional> check-mx-cname ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-srv-cname ( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
<optional> check-sibling <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> allow-new-zones { <replaceable>yes_or_no</replaceable> }; </optional>
<optional> allow-notify { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-query { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-query-on { <replaceable>address_match_list</replaceable> }; </optional>
@@ -4805,6 +5049,8 @@ category notify { null; };
<optional> allow-update { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-update-forwarding { <replaceable>address_match_list</replaceable> }; </optional>
<optional> update-check-ksk <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-dnskey-kskonly <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-secure-to-insecure <replaceable>yes_or_no</replaceable> ;</optional>
<optional> try-tcp-refresh <replaceable>yes_or_no</replaceable>; </optional>
<optional> allow-v6-synthesis { <replaceable>address_match_list</replaceable> }; </optional>
<optional> blackhole { <replaceable>address_match_list</replaceable> }; </optional>
@@ -4816,12 +5062,12 @@ category notify { null; };
<optional> listen-on-v6 <optional> port <replaceable>ip_port</replaceable> </optional> { <replaceable>address_match_list</replaceable> }; </optional>
<optional> query-source ( ( <replaceable>ip4_addr</replaceable> | <replaceable>*</replaceable> )
<optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> |
- <optional> address ( <replaceable>ip4_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
- <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
+ <optional> address ( <replaceable>ip4_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
<optional> query-source-v6 ( ( <replaceable>ip6_addr</replaceable> | <replaceable>*</replaceable> )
- <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> |
- <optional> address ( <replaceable>ip6_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
- <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> |
+ <optional> address ( <replaceable>ip6_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional> ) ; </optional>
<optional> use-queryport-pool <replaceable>yes_or_no</replaceable>; </optional>
<optional> queryport-pool-ports <replaceable>number</replaceable>; </optional>
<optional> queryport-pool-updateinterval <replaceable>number</replaceable>; </optional>
@@ -4842,13 +5088,15 @@ category notify { null; };
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> alt-transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> use-alt-transfer-source <replaceable>yes_or_no</replaceable>; </optional>
<optional> notify-delay <replaceable>seconds</replaceable> ; </optional>
<optional> notify-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-to-soa <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> max-ixfr-log-size <replaceable>number</replaceable>; </optional>
<optional> max-journal-size <replaceable>size_spec</replaceable>; </optional>
<optional> coresize <replaceable>size_spec</replaceable> ; </optional>
@@ -4884,12 +5132,25 @@ category notify { null; };
<optional> random-device <replaceable>path_name</replaceable> ; </optional>
<optional> max-cache-size <replaceable>size_spec</replaceable> ; </optional>
<optional> match-mapped-addresses <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> filter-aaaa-on-v4 ( <replaceable>yes_or_no</replaceable> | <replaceable>break-dnssec</replaceable> ); </optional>
+ <optional> filter-aaaa { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> dns64 <replaceable>IPv6-prefix</replaceable> {
+ <optional> clients { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> mapped { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> exclude { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> suffix IPv6-address; </optional>
+ <optional> recursive-only <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> break-dnssec <replaceable>yes_or_no</replaceable>; </optional>
+ }; </optional>;
+ <optional> dns64-server <replaceable>name</replaceable> </optional>
+ <optional> dns64-contact <replaceable>name</replaceable> </optional>
<optional> preferred-glue ( <replaceable>A</replaceable> | <replaceable>AAAA</replaceable> | <replaceable>NONE</replaceable> ); </optional>
<optional> edns-udp-size <replaceable>number</replaceable>; </optional>
<optional> max-udp-size <replaceable>number</replaceable>; </optional>
<optional> root-delegation-only <optional> exclude { <replaceable>namelist</replaceable> } </optional> ; </optional>
<optional> querylog <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> disable-algorithms <replaceable>domain</replaceable> { <replaceable>algorithm</replaceable>; <optional> <replaceable>algorithm</replaceable>; </optional> }; </optional>
+ <optional> disable-algorithms <replaceable>domain</replaceable> { <replaceable>algorithm</replaceable>;
+ <optional> <replaceable>algorithm</replaceable>; </optional> }; </optional>
<optional> acache-enable <replaceable>yes_or_no</replaceable> ; </optional>
<optional> acache-cleaning-interval <replaceable>number</replaceable>; </optional>
<optional> max-acache-size <replaceable>size_spec</replaceable> ; </optional>
@@ -4902,6 +5163,10 @@ category notify { null; };
<optional> disable-empty-zone <replaceable>zone_name</replaceable> ; </optional>
<optional> zero-no-soa-ttl <replaceable>yes_or_no</replaceable> ; </optional>
<optional> zero-no-soa-ttl-cache <replaceable>yes_or_no</replaceable> ; </optional>
+ <optional> resolver-query-timeout <replaceable>number</replaceable> ; </optional>
+ <optional> deny-answer-addresses { <replaceable>address_match_list</replaceable> } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;</optional>
+ <optional> deny-answer-aliases { <replaceable>namelist</replaceable> } <optional> except-from { <replaceable>namelist</replaceable> } </optional>;</optional>
+ <optional> response-policy { <replaceable>zone_name</replaceable> <optional> policy <replaceable>given</replaceable> | <replaceable>no-op</replaceable> | <replaceable>nxdomain</replaceable> | <replaceable>nodata</replaceable> | <replaceable>cname domain</replaceable> </optional> ; } ; </optional>
};
</programlisting>
@@ -4923,6 +5188,102 @@ category notify { null; };
<variablelist>
+ <varlistentry>
+ <term><command>attach-cache</command></term>
+ <listitem>
+ <para>
+ Allows multiple views to share a single cache
+ database.
+ Each view has its own cache database by default, but
+ if multiple views have the same operational policy
+ for name resolution and caching, those views can
+ share a single cache to save memory and possibly
+ improve resolution efficiency by using this option.
+ </para>
+
+ <para>
+ The <command>attach-cache</command> option
+ may also be specified in <command>view</command>
+ statements, in which case it overrides the
+ global <command>attach-cache</command> option.
+ </para>
+
+ <para>
+ The <replaceable>cache_name</replaceable> specifies
+ the cache to be shared.
+ When the <command>named</command> server configures
+ views which are supposed to share a cache, it
+ creates a cache with the specified name for the
+ first view of these sharing views.
+ The rest of the views will simply refer to the
+ already created cache.
+ </para>
+
+ <para>
+ One common configuration to share a cache would be to
+ allow all views to share a single cache.
+ This can be done by specifying
+ the <command>attach-cache</command> as a global
+ option with an arbitrary name.
+ </para>
+
+ <para>
+ Another possible operation is to allow a subset of
+ all views to share a cache while the others to
+ retain their own caches.
+ For example, if there are three views A, B, and C,
+ and only A and B should share a cache, specify the
+ <command>attach-cache</command> option as a view A (or
+ B)'s option, referring to the other view name:
+ </para>
+
+<programlisting>
+ view "A" {
+ // this view has its own cache
+ ...
+ };
+ view "B" {
+ // this view refers to A's cache
+ attach-cache "A";
+ };
+ view "C" {
+ // this view has its own cache
+ ...
+ };
+</programlisting>
+
+ <para>
+ Views that share a cache must have the same policy
+ on configurable parameters that may affect caching.
+ The current implementation requires the following
+ configurable options be consistent among these
+ views:
+ <command>check-names</command>,
+ <command>cleaning-interval</command>,
+ <command>dnssec-accept-expired</command>,
+ <command>dnssec-validation</command>,
+ <command>max-cache-ttl</command>,
+ <command>max-ncache-ttl</command>,
+ <command>max-cache-size</command>, and
+ <command>zero-no-soa-ttl</command>.
+ </para>
+
+ <para>
+ Note that there may be other parameters that may
+ cause confusion if they are inconsistent for
+ different views that share a single cache.
+ For example, if these views define different sets of
+ forwarders that can return different answers for the
+ same question, sharing the answer does not make
+ sense or could even be harmful.
+ It is administrator's responsibility to ensure
+ configuration differences in different views do
+ not cause disruption with a shared cache.
+ </para>
+ </listitem>
+
+ </varlistentry>
+
<varlistentry>
<term><command>directory</command></term>
<listitem>
@@ -4950,10 +5311,24 @@ category notify { null; };
When performing dynamic update of secure zones, the
directory where the public and private DNSSEC key files
should be found, if different than the current working
- directory. The directory specified must be an absolute
- path. (Note that this option has no effect on the paths
- for files containing non-DNSSEC keys such as the
- <filename>rndc.key</filename>.
+ directory. (Note that this option has no effect on the
+ paths for files containing non-DNSSEC keys such as
+ <filename>bind.keys</filename>,
+ <filename>rndc.key</filename> or
+ <filename>session.key</filename>.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>managed-keys-directory</command></term>
+ <listitem>
+ <para>
+ The directory used to hold the files used to track managed keys.
+ By default it is the working directory. It there are no
+ views then the file <filename>managed-keys.bind</filename>
+ otherwise a SHA256 hash of the view name is used with
+ <filename>.mkeys</filename> extension added.
</para>
</listitem>
</varlistentry>
@@ -4973,19 +5348,33 @@ category notify { null; };
</varlistentry>
<varlistentry>
+ <term><command>tkey-gssapi-keytab</command></term>
+ <listitem>
+ <para>
+ The KRB5 keytab file to use for GSS-TSIG updates. If
+ this option is set and tkey-gssapi-credential is not
+ set, then updates will be allowed with any key
+ matching a principal in the specified keytab.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>tkey-gssapi-credential</command></term>
<listitem>
<para>
The security credential with which the server should
authenticate keys requested by the GSS-TSIG protocol.
Currently only Kerberos 5 authentication is available
- and the credential is a Kerberos principal which
- the server can acquire through the default system
- key file, normally <filename>/etc/krb5.keytab</filename>.
- Normally this principal is of the form
- "<userinput>DNS/</userinput><varname>server.domain</varname>".
- To use GSS-TSIG, <command>tkey-domain</command>
- must also be set.
+ and the credential is a Kerberos principal which the
+ server can acquire through the default system key
+ file, normally <filename>/etc/krb5.keytab</filename>.
+ The location keytab file can be overridden using the
+ tkey-gssapi-keytab option. Normally this principal is
+ of the form "<userinput>DNS/</userinput><varname>server.domain</varname>".
+ To use GSS-TSIG, <command>tkey-domain</command> must
+ also be set if a specific keytab is not set with
+ tkey-gssapi-keytab.
</para>
</listitem>
</varlistentry>
@@ -5007,7 +5396,8 @@ category notify { null; };
should be the server's domain name, or an otherwise
non-existent subdomain like
"_tkey.<varname>domainname</varname>". If you are
- using GSS-TSIG, this variable must be defined.
+ using GSS-TSIG, this variable must be defined, unless
+ you specify a specific keytab using tkey-gssapi-keytab.
</para>
</listitem>
</varlistentry>
@@ -5106,6 +5496,84 @@ category notify { null; };
</varlistentry>
<varlistentry>
+ <term><command>bindkeys-file</command></term>
+ <listitem>
+ <para>
+ The pathname of a file to override the built-in trusted
+ keys provided by <command>named</command>.
+ See the discussion of <command>dnssec-lookaside</command>
+ and <command>dnssec-validation</command> for details.
+ If not specified, the default is
+ <filename>/etc/bind.keys</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>secroots-file</command></term>
+ <listitem>
+ <para>
+ The pathname of the file the server dumps
+ security roots to when instructed to do so with
+ <command>rndc secroots</command>.
+ If not specified, the default is <filename>named.secroots</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyfile</command></term>
+ <listitem>
+ <para>
+ The pathname of the file into which to write a TSIG
+ session key generated by <command>named</command> for use by
+ <command>nsupdate -l</command>. If not specified, the
+ default is <filename>/var/run/named/session.key</filename>.
+ (See <xref linkend="dynamic_update_policies"/>, and in
+ particular the discussion of the
+ <command>update-policy</command> statement's
+ <userinput>local</userinput> option for more
+ information about this feature.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyname</command></term>
+ <listitem>
+ <para>
+ The key name to use for the TSIG session key.
+ If not specified, the default is "local-ddns".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyalg</command></term>
+ <listitem>
+ <para>
+ The algorithm to use for the TSIG session key.
+ Valid values are hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384, hmac-sha512 and hmac-md5. If not
+ specified, the default is hmac-sha256.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>session-keyfile</command></term>
+ <listitem>
+ <para>
+ The pathname of the file into which to write a session TSIG
+ key for use by <command>nsupdate -l</command>. (See the
+ discussion of the <command>update-policy</command>
+ statement's <userinput>local</userinput> option for more
+ details on this feature.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>port</command></term>
<listitem>
<para>
@@ -5167,14 +5635,14 @@ category notify { null; };
<para>
DS queries are expected to be made to and be answered by
delegation only zones. Such queries and responses are
- treated as a exception to delegation-only processing
+ treated as an exception to delegation-only processing
and are not converted to NXDOMAIN responses provided
a CNAME is not discovered at the query name.
</para>
<para>
If a delegation only zone server also serves a child
zone it is not always possible to determine whether
- a answer comes from the delegation only zone or the
+ an answer comes from the delegation only zone or the
child zone. SOA NS and DNSKEY records are apex
only records and a matching response that contains
these records or DS is treated as coming from a
@@ -5223,21 +5691,46 @@ options {
<term><command>dnssec-lookaside</command></term>
<listitem>
<para>
- When set, <command>dnssec-lookaside</command>
- provides the
- validator with an alternate method to validate DNSKEY records
- at the
- top of a zone. When a DNSKEY is at or below a domain
- specified by the
- deepest <command>dnssec-lookaside</command>, and
- the normal DNSSEC validation
- has left the key untrusted, the trust-anchor will be append to
- the key
- name and a DLV record will be looked up to see if it can
- validate the
- key. If the DLV record validates a DNSKEY (similarly to the
- way a DS
+ When set, <command>dnssec-lookaside</command> provides the
+ validator with an alternate method to validate DNSKEY
+ records at the top of a zone. When a DNSKEY is at or
+ below a domain specified by the deepest
+ <command>dnssec-lookaside</command>, and the normal DNSSEC
+ validation has left the key untrusted, the trust-anchor
+ will be appended to the key name and a DLV record will be
+ looked up to see if it can validate the key. If the DLV
+ record validates a DNSKEY (similarly to the way a DS
record does) the DNSKEY RRset is deemed to be trusted.
+ </para>
+ <para>
+ If <command>dnssec-lookaside</command> is set to
+ <userinput>auto</userinput>, then built-in default
+ values for the DLV domain and trust anchor will be
+ used, along with a built-in key for validation.
+ </para>
+ <para>
+ The default DLV key is stored in the file
+ <filename>bind.keys</filename>;
+ <command>named</command> will load that key at
+ startup if <command>dnssec-lookaside</command> is set to
+ <constant>auto</constant>. A copy of the file is
+ installed along with <acronym>BIND</acronym> 9, and is
+ current as of the release date. If the DLV key expires, a
+ new copy of <filename>bind.keys</filename> can be downloaded
+ from <ulink>https://www.isc.org/solutions/dlv</ulink>.
+ </para>
+ <para>
+ (To prevent problems if <filename>bind.keys</filename> is
+ not found, the current key is also compiled in to
+ <command>named</command>. Relying on this is not
+ recommended, however, as it requires <command>named</command>
+ to be recompiled with a new key when the DLV key expires.)
+ </para>
+ <para>
+ NOTE: <command>named</command> only loads certain specific
+ keys from <filename>bind.keys</filename>: those for the
+ DLV zone and for the DNS root zone. The file cannot be
+ used to store keys for other zones.
</para>
</listitem>
</varlistentry>
@@ -5246,21 +5739,86 @@ options {
<term><command>dnssec-must-be-secure</command></term>
<listitem>
<para>
- Specify hierarchies which must be or may not be secure (signed and
- validated).
- If <userinput>yes</userinput>, then <command>named</command> will only accept
- answers if they
- are secure.
- If <userinput>no</userinput>, then normal DNSSEC validation
- applies
- allowing for insecure answers to be accepted.
- The specified domain must be under a <command>trusted-key</command> or
- <command>dnssec-lookaside</command> must be
- active.
+ Specify hierarchies which must be or may not be secure
+ (signed and validated). If <userinput>yes</userinput>,
+ then <command>named</command> will only accept answers if
+ they are secure. If <userinput>no</userinput>, then normal
+ DNSSEC validation applies allowing for insecure answers to
+ be accepted. The specified domain must be under a
+ <command>trusted-keys</command> or
+ <command>managed-keys</command> statement, or
+ <command>dnssec-lookaside</command> must be active.
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>dns64</command></term>
+ <listitem>
+ <para>
+ This directive instructs <command>named</command> to
+ return mapped IPv4 addresses to AAAA queries when
+ there are no AAAA records. It is intended to be
+ used in conjunction with a NAT64. Each
+ <command>dns64</command> defines one DNS64 prefix.
+ Multiple DNS64 prefixes can be defined.
+ </para>
+ <para>
+ Compatible IPv6 prefixes have lengths of 32, 40, 48, 56,
+ 64 and 96 as per RFC 6052.
+ </para>
+ <para>
+ Additionally a reverse IP6.ARPA zone will be created for
+ the prefix to provide a mapping from the IP6.ARPA names
+ to the corresponding IN-ADDR.ARPA names using synthesized
+ CNAMEs. <command>dns64-server</command> and
+ <command>dns64-contact</command> can be used to specify
+ the name of the server and contact for the zones. These
+ are settable at the view / options level. These are
+ not settable on a per-prefix basis.
+ </para>
+ <para>
+ Each <command>dns64</command> supports an optional
+ <command>clients</command> ACL that determines which
+ clients are affected by this directive. If not defined,
+ it defaults to <userinput>any;</userinput>.
+ </para>
+ <para>
+ Each <command>dns64</command> supports an optional
+ <command>mapped</command> ACL that selects which
+ IPv4 addresses are to be mapped in the corresponding
+ A RRset. If not defined it defaults to
+ <userinput>any;</userinput>.
+ </para>
+ <para>
+ Each <command>dns64</command> supports an optional
+ <command>exclude</command> ACL that selects which
+ IPv6 addresses will be ignored for the purposes
+ of determining whether dns64 is to be applied.
+ Any non-matching address will prevent further
+ DNS64 processing from occurring for this client.
+ </para>
+ <para>
+ A optional <command>suffix</command> can also
+ be defined to set the bits trailing the mapped
+ IPv4 address bits. By default these bits are
+ set to <userinput>::</userinput>. The bits
+ matching the prefix and mapped IPv4 address
+ must be zero.
+ </para>
+<programlisting>
+ acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
+
+ dns64 64:FF9B::/96 {
+ clients { any; };
+ mapped { !rfc1918; any; };
+ exclude { 64:FF9B::/96; ::ffff:0000:0000/96; };
+ suffix ::;
+ };
+</programlisting>
+ </listitem>
+ </varlistentry>
+
</variablelist>
<sect3 id="boolean_options">
@@ -5269,6 +5827,18 @@ options {
<variablelist>
<varlistentry>
+ <term><command>allow-new-zones</command></term>
+ <listitem>
+ <para>
+ If <userinput>yes</userinput>, then zones can be
+ added at runtime via <command>rndc addzone</command>
+ or deleted via <command>rndc delzone</command>.
+ The default is <userinput>no</userinput>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>auth-nxdomain</command></term>
<listitem>
<para>
@@ -5755,6 +6325,7 @@ options {
off
on a per-zone basis by specifying <command>zone-statistics no</command>
in the <command>zone</command> statement).
+ The default is <userinput>no</userinput>.
These statistics may be accessed
using <command>rndc stats</command>, which will
dump them to the file listed
@@ -5928,6 +6499,60 @@ options {
</varlistentry>
<varlistentry>
+ <term><command>filter-aaaa-on-v4</command></term>
+ <listitem>
+ <para>
+ This option is only available when
+ <acronym>BIND</acronym> 9 is compiled with the
+ <userinput>--enable-filter-aaaa</userinput> option on the
+ "configure" command line. It is intended to help the
+ transition from IPv4 to IPv6 by not giving IPv6 addresses
+ to DNS clients unless they have connections to the IPv6
+ Internet. This is not recommended unless absolutely
+ necessary. The default is <userinput>no</userinput>.
+ The <command>filter-aaaa-on-v4</command> option
+ may also be specified in <command>view</command> statements
+ to override the global <command>filter-aaaa-on-v4</command>
+ option.
+ </para>
+ <para>
+ If <userinput>yes</userinput>,
+ the DNS client is at an IPv4 address, in <command>filter-aaaa</command>,
+ and if the response does not include DNSSEC signatures,
+ then all AAAA records are deleted from the response.
+ This filtering applies to all responses and not only
+ authoritative responses.
+ </para>
+ <para>
+ If <userinput>break-dnssec</userinput>,
+ then AAAA records are deleted even when dnssec is enabled.
+ As suggested by the name, this makes the response not verify,
+ because the DNSSEC protocol is designed detect deletions.
+ </para>
+ <para>
+ This mechanism can erroneously cause other servers to
+ not give AAAA records to their clients.
+ A recursing server with both IPv6 and IPv4 network connections
+ that queries an authoritative server using this mechanism
+ via IPv4 will be denied AAAA records even if its client is
+ using IPv6.
+ </para>
+ <para>
+ This mechanism is applied to authoritative as well as
+ non-authoritative records.
+ A client using IPv4 that is not allowed recursion can
+ erroneously be given AAAA records because the server is not
+ allowed to check for A records.
+ </para>
+ <para>
+ Some AAAA records are given to IPv4 clients in glue records.
+ IPv4 clients that are servers can then erroneously
+ answer requests for AAAA records received via IPv4.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>ixfr-from-differences</command></term>
<listitem>
<para>
@@ -5996,7 +6621,15 @@ options {
Enable DNSSEC validation in <command>named</command>.
Note <command>dnssec-enable</command> also needs to be
set to <userinput>yes</userinput> to be effective.
- The default is <userinput>yes</userinput>.
+ If set to <userinput>no</userinput>, DNSSEC validation
+ is disabled. If set to <userinput>auto</userinput>,
+ DNSSEC validation is enabled, and a default
+ trust-anchor for the DNS root zone is used. If set to
+ <userinput>yes</userinput>, DNSSEC validation is enabled,
+ but a trust anchor must be manually configured using
+ a <command>trusted-keys</command> or
+ <command>managed-keys</command> statement. The default
+ is <userinput>yes</userinput>.
</para>
</listitem>
</varlistentry>
@@ -6007,7 +6640,9 @@ options {
<para>
Accept expired signatures when verifying DNSSEC signatures.
The default is <userinput>no</userinput>.
- Setting this option to "yes" leaves <command>named</command> vulnerable to replay attacks.
+ Setting this option to <userinput>yes</userinput>
+ leaves <command>named</command> vulnerable to
+ replay attacks.
</para>
</listitem>
</varlistentry>
@@ -6057,6 +6692,19 @@ options {
</varlistentry>
<varlistentry>
+ <term><command>check-dup-records</command></term>
+ <listitem>
+ <para>
+ Check master zones for records that are treated as different
+ by DNSSEC but are semantically equal in plain DNS. The
+ default is to <command>warn</command>. Other possible
+ values are <command>fail</command> and
+ <command>ignore</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>check-mx</command></term>
<listitem>
<para>
@@ -6161,13 +6809,49 @@ options {
<term><command>update-check-ksk</command></term>
<listitem>
<para>
- When regenerating the RRSIGs following a UPDATE
- request to a secure zone, check the KSK flag on
- the DNSKEY RR to determine if this key should be
- used to generate the RRSIG. This flag is ignored
- if there are not DNSKEY RRs both with and without
- a KSK.
- The default is <command>yes</command>.
+ When set to the default value of <literal>yes</literal>,
+ check the KSK bit in each key to determine how the key
+ should be used when generating RRSIGs for a secure zone.
+ </para>
+ <para>
+ Ordinarily, zone-signing keys (that is, keys without the
+ KSK bit set) are used to sign the entire zone, while
+ key-signing keys (keys with the KSK bit set) are only
+ used to sign the DNSKEY RRset at the zone apex.
+ However, if this option is set to <literal>no</literal>,
+ then the KSK bit is ignored; KSKs are treated as if they
+ were ZSKs and are used to sign the entire zone. This is
+ similar to the <command>dnssec-signzone -z</command>
+ command line option.
+ </para>
+ <para>
+ When this option is set to <literal>yes</literal>, there
+ must be at least two active keys for every algorithm
+ represented in the DNSKEY RRset: at least one KSK and one
+ ZSK per algorithm. If there is any algorithm for which
+ this requirement is not met, this option will be ignored
+ for that algorithm.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>dnssec-dnskey-kskonly</command></term>
+ <listitem>
+ <para>
+ When this option and <command>update-check-ksk</command>
+ are both set to <literal>yes</literal>, only key-signing
+ keys (that is, keys with the KSK bit set) will be used
+ to sign the DNSKEY RRset at the zone apex. Zone-signing
+ keys (keys without the KSK bit set) will be used to sign
+ the remainder of the zone, but not the DNSKEY RRset.
+ This is similar to the
+ <command>dnssec-signzone -x</command> command line option.
+ </para>
+ <para>
+ The default is <command>no</command>. If
+ <command>update-check-ksk</command> is set to
+ <literal>no</literal>, this option is ignored.
</para>
</listitem>
</varlistentry>
@@ -6183,6 +6867,34 @@ options {
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>dnssec-secure-to-insecure</command></term>
+ <listitem>
+ <para>
+ Allow a dynamic zone to transition from secure to
+ insecure (i.e., signed to unsigned) by deleting all
+ of the DNSKEY records. The default is <command>no</command>.
+ If set to <command>yes</command>, and if the DNSKEY RRset
+ at the zone apex is deleted, all RRSIG and NSEC records
+ will be removed from the zone as well.
+ </para>
+ <para>
+ If the zone uses NSEC3, then it is also necessary to
+ delete the NSEC3PARAM RRset from the zone apex; this will
+ cause the removal of all corresponding NSEC3 records.
+ (It is expected that this requirement will be eliminated
+ in a future release.)
+ </para>
+ <para>
+ Note that if a zone has been configured with
+ <command>auto-dnssec maintain</command> and the
+ private keys remain accessible in the key repository,
+ then the zone will be automatically signed again the
+ next time <command>named</command> is started.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</sect3>
@@ -6495,6 +7207,29 @@ options {
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>filter-aaaa</command></term>
+ <listitem>
+ <para>
+ Specifies a list of addresses to which
+ <command>filter-aaaa-on-v4</command>
+ is applies. The default is <userinput>any</userinput>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>resolver-query-timeout</command></term>
+ <listitem>
+ <para>
+ The amount of time the resolver will spend attempting
+ to resolve a recursive query before failing. The
+ default is <literal>10</literal> and the maximum is
+ <literal>30</literal>. Setting it to <literal>0</literal>
+ will result in the default being used.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</sect3>
@@ -7542,20 +8277,26 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</para>
<programlisting>sortlist {
- { localhost; // IF the local host
- { localnets; // THEN first fit on the
- 192.168.1/24; // following nets
+ // IF the local host
+ // THEN first fit on the following nets
+ { localhost;
+ { localnets;
+ 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.1/24; // IF on class C 192.168.1
- { 192.168.1/24; // THEN use .1, or .2 or .3
+ // IF on class C 192.168.1 THEN use .1, or .2 or .3
+ { 192.168.1/24;
+ { 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.2/24; // IF on class C 192.168.2
- { 192.168.2/24; // THEN use .2, or .1 or .3
+ // IF on class C 192.168.2 THEN use .2, or .1 or .3
+ { 192.168.2/24;
+ { 192.168.2/24;
{ 192.168.1/24; 192.168.3/24; }; }; };
- { 192.168.3/24; // IF on class C 192.168.3
- { 192.168.3/24; // THEN use .3, or .1 or .2
+ // IF on class C 192.168.3 THEN use .3, or .1 or .2
+ { 192.168.3/24;
+ { 192.168.3/24;
{ 192.168.1/24; 192.168.2/24; }; }; };
- { { 192.168.4/24; 192.168.5/24; }; // if .4 or .5, prefer that net
+ // IF .4 or .5 THEN prefer that net
+ { { 192.168.4/24; 192.168.5/24; };
};
};</programlisting>
@@ -7772,7 +8513,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
DNSSEC signatures automatically generated as a
result of dynamic updates (<xref
linkend="dynamic_update"/>) will expire. There
- is a optional second field which specifies how
+ is an optional second field which specifies how
long before expiry that the signatures will be
regenerated. If not specified, the signatures will
be regenerated at 1/4 of base interval. The second
@@ -7877,7 +8618,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<para>
Sets the advertised EDNS UDP buffer size in bytes
to control the size of packets received.
- Valid values are 512 to 4096 (values outside this range
+ Valid values are 1024 to 4096 (values outside this range
will be silently adjusted). The default value
is 4096. The usual reason for setting
<command>edns-udp-size</command> to a non-default
@@ -7885,24 +8626,36 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
firewalls that block fragmented packets and/or
block UDP packets that are greater than 512 bytes.
</para>
+ <para>
+ <command>named</command> will fallback to using 512 bytes
+ if it get a series of timeout at the initial value. 512
+ bytes is not being offered to encourage sites to fix their
+ firewalls. Small EDNS UDP sizes will result in the
+ excessive use of TCP.
+ </para>
</listitem>
</varlistentry>
<varlistentry>
<term><command>max-udp-size</command></term>
- <listitem>
- <para>
- Sets the maximum EDNS UDP message size <command>named</command> will
- send in bytes. Valid values are 512 to 4096 (values outside
- this range will be silently adjusted). The default
+ <listitem>
+ <para>
+ Sets the maximum EDNS UDP message size
+ <command>named</command> will send in bytes.
+ Valid values are 512 to 4096 (values outside this
+ range will be silently adjusted). The default
value is 4096. The usual reason for setting
- <command>max-udp-size</command> to a non-default value is to get UDP
- answers to pass through broken firewalls that
- block fragmented packets and/or block UDP packets
- that are greater than 512 bytes.
+ <command>max-udp-size</command> to a non-default
+ value is to get UDP answers to pass through broken
+ firewalls that block fragmented packets and/or
+ block UDP packets that are greater than 512 bytes.
This is independent of the advertised receive
buffer (<command>edns-udp-size</command>).
</para>
+ <para>
+ Setting this to a low value will encourage additional
+ TCP traffic to the nameserver.
+ </para>
</listitem>
</varlistentry>
@@ -8081,7 +8834,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<para>
Named will attempt to determine if a built-in zone already exists
or is active (covered by a forward-only forwarding declaration)
- and will not create a empty zone in that case.
+ and will not create an empty zone in that case.
</para>
<para>
The current list of empty zones is:
@@ -8308,6 +9061,282 @@ XXX: end of RFC1918 addresses #defined out -->
</sect3>
+ <sect3>
+ <title>Content Filtering</title>
+ <para>
+ <acronym>BIND</acronym> 9 provides the ability to filter
+ out DNS responses from external DNS servers containing
+ certain types of data in the answer section.
+ Specifically, it can reject address (A or AAAA) records if
+ the corresponding IPv4 or IPv6 addresses match the given
+ <varname>address_match_list</varname> of the
+ <command>deny-answer-addresses</command> option.
+ It can also reject CNAME or DNAME records if the "alias"
+ name (i.e., the CNAME alias or the substituted query name
+ due to DNAME) matches the
+ given <varname>namelist</varname> of the
+ <command>deny-answer-aliases</command> option, where
+ "match" means the alias name is a subdomain of one of
+ the <varname>name_list</varname> elements.
+ If the optional <varname>namelist</varname> is specified
+ with <command>except-from</command>, records whose query name
+ matches the list will be accepted regardless of the filter
+ setting.
+ Likewise, if the alias name is a subdomain of the
+ corresponding zone, the <command>deny-answer-aliases</command>
+ filter will not apply;
+ for example, even if "example.com" is specified for
+ <command>deny-answer-aliases</command>,
+ </para>
+<programlisting>www.example.com. CNAME xxx.example.com.</programlisting>
+
+ <para>
+ returned by an "example.com" server will be accepted.
+ </para>
+
+ <para>
+ In the <varname>address_match_list</varname> of the
+ <command>deny-answer-addresses</command> option, only
+ <varname>ip_addr</varname>
+ and <varname>ip_prefix</varname>
+ are meaningful;
+ any <varname>key_id</varname> will be silently ignored.
+ </para>
+
+ <para>
+ If a response message is rejected due to the filtering,
+ the entire message is discarded without being cached, and
+ a SERVFAIL error will be returned to the client.
+ </para>
+
+ <para>
+ This filtering is intended to prevent "DNS rebinding attacks," in
+ which an attacker, in response to a query for a domain name the
+ attacker controls, returns an IP address within your own network or
+ an alias name within your own domain.
+ A naive web browser or script could then serve as an
+ unintended proxy, allowing the attacker
+ to get access to an internal node of your local network
+ that couldn't be externally accessed otherwise.
+ See the paper available at
+ <ulink>
+ http://portal.acm.org/citation.cfm?id=1315245.1315298
+ </ulink>
+ for more details about the attacks.
+ </para>
+
+ <para>
+ For example, if you own a domain named "example.net" and
+ your internal network uses an IPv4 prefix 192.0.2.0/24,
+ you might specify the following rules:
+ </para>
+
+<programlisting>deny-answer-addresses { 192.0.2.0/24; } except-from { "example.net"; };
+deny-answer-aliases { "example.net"; };
+</programlisting>
+
+ <para>
+ If an external attacker lets a web browser in your local
+ network look up an IPv4 address of "attacker.example.com",
+ the attacker's DNS server would return a response like this:
+ </para>
+
+<programlisting>attacker.example.com. A 192.0.2.1</programlisting>
+
+ <para>
+ in the answer section.
+ Since the rdata of this record (the IPv4 address) matches
+ the specified prefix 192.0.2.0/24, this response will be
+ ignored.
+ </para>
+
+ <para>
+ On the other hand, if the browser looks up a legitimate
+ internal web server "www.example.net" and the
+ following response is returned to
+ the <acronym>BIND</acronym> 9 server
+ </para>
+
+<programlisting>www.example.net. A 192.0.2.2</programlisting>
+
+ <para>
+ it will be accepted since the owner name "www.example.net"
+ matches the <command>except-from</command> element,
+ "example.net".
+ </para>
+
+ <para>
+ Note that this is not really an attack on the DNS per se.
+ In fact, there is nothing wrong for an "external" name to
+ be mapped to your "internal" IP address or domain name
+ from the DNS point of view.
+ It might actually be provided for a legitimate purpose,
+ such as for debugging.
+ As long as the mapping is provided by the correct owner,
+ it is not possible or does not make sense to detect
+ whether the intent of the mapping is legitimate or not
+ within the DNS.
+ The "rebinding" attack must primarily be protected at the
+ application that uses the DNS.
+ For a large site, however, it may be difficult to protect
+ all possible applications at once.
+ This filtering feature is provided only to help such an
+ operational environment;
+ it is generally discouraged to turn it on unless you are
+ very sure you have no other choice and the attack is a
+ real threat for your applications.
+ </para>
+
+ <para>
+ Care should be particularly taken if you want to use this
+ option for addresses within 127.0.0.0/8.
+ These addresses are obviously "internal", but many
+ applications conventionally rely on a DNS mapping from
+ some name to such an address.
+ Filtering out DNS records containing this address
+ spuriously can break such applications.
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>Response Policy Zone (RPZ) Rewriting</title>
+ <para>
+ <acronym>BIND</acronym> 9 includes an intentionally limited
+ mechanism to modify DNS responses for recursive requests
+ similar to email anti-spam DNS blacklists.
+ All response policy zones are named in the
+ <command>response-policy</command> option for the view or among the
+ global options if there is no response-policy option for the view.
+ </para>
+
+ <para>
+ The rules encoded in a response policy zone (RPZ) are applied
+ only to responses to queries that ask for recursion (RD=1).
+ RPZs are normal DNS zones containing RRsets
+ that can be queried normally if allowed.
+ It is usually best to restrict those queries with something like
+ <command>allow-query {none; };</command> or
+ <command>allow-query { 127.0.0.1; };</command>.
+ </para>
+
+ <para>
+ There are four kinds of RPZ rewrite rules. QNAME rules are
+ applied to query names in requests and to targets of CNAME
+ records resolved in the process of generating the response.
+ The owner name of a QNAME rule is the query name relativized
+ to the RPZ.
+ The records in a rewrite rule are usually A, AAAA, or special
+ CNAMEs, but can be any type except DNAME.
+ </para>
+
+ <para>
+ IP rules are triggered by addresses in A and AAAA records.
+ All IP addresses in A or AAAA RRsets are tested and the rule
+ longest prefix is applied. Ties between rules with equal prefixes
+ are broken in favor of the first RPZ mentioned in the
+ response-policy option.
+ The rule matching the smallest IP address is chosen among equal
+ prefix rules from a single RPZ.
+ IP rules are expressed in RRsets with owner names that are
+ subdomains of rpz-ip and encoding an IP address block, reversed
+ as in IN-ARPA.
+ prefix.B.B.B.B with prefix between 1 and 32 and B between 1 and 255
+ encodes an IPv4 address.
+ IPv6 addresses are encoded by with prefix.W.W.W.W.W.W.W.W or
+ prefix.WORDS.zz.WORDS. The words in the standard IPv6 text
+ representation are reversed, "::" is replaced with ".zz.",
+ and ":" becomes ".".
+ </para>
+
+ <para>
+ NSDNAME rules match names in NS RRsets for the response or a
+ parent. They are encoded as subdomains of rpz-nsdomain relativized
+ to the RPZ origin name.
+ </para>
+
+ <para>
+ NSIP rules match IP addresses in A and AAAA RRsets for names of
+ responsible servers or the names that can be matched by NSDNAME
+ rules. The are encoded like IP rules except as subdomains of
+ rpz-nsip.
+ </para>
+
+ <para>
+ Authority verification issues and variations in authority data in
+ the current version of <acronym>BIND</acronym> 9 can cause
+ inconsistent results from NSIP and NSDNAME. So they are available
+ only when <acronym>BIND</acronym> is built with the
+ <userinput>--enable-rpz-nsip</userinput> or
+ <userinput>--enable-rpz-nsdname</userinput> options
+ on the "configure" command line.
+ </para>
+
+ <para>
+ Four policies can be expressed.
+ The <command>NXDOMAIN</command> policy causes a NXDOMAIN response
+ and is expressed with an RRset consisting of a single CNAME
+ whose target is the root domain (.).
+ <command>NODATA</command> generates NODATA or ANCOUNT=1 regardless
+ of query type.
+ It is expressed with a CNAME whose target is the wildcard
+ top-level domain (*.).
+ The <command>NO-OP</command> policy does not change the response
+ and is used to "poke holes" in policies for larger CIDR blocks or in
+ zones named later in the <command>response-policy</command> option.
+ The NO-OP policy is expressed by a CNAME with a target consisting
+ of the variable part of the owner name, such as "example.com." for
+ a QNAME rule or "128.1.0.0.127." for an IP rule.
+ The <command>CNAME</command> policy is used to replace the RRsets
+ of response.
+ A and AAAA RRsets are most common and useful to capture
+ an evil domain in a walled garden, but any valid set of RRsets
+ is possible.
+ </para>
+
+ <para>
+ All of the policies in an RPZ can be overridden with a
+ <command>policy</command> clause.
+ <command>given</command> says "do not override."
+ <command>no-op</command> says "do nothing" regardless of the policy
+ in RPZ records.
+ <command>nxdomain</command> causes all RPZ rules to generate
+ NXDOMAIN results.
+ <command>nodata</command> gives nodata.
+ <command>cname domain</command> causes all RPZ rules to act as if
+ the consisted of a "cname domain" record.
+ </para>
+
+ <para>
+ For example, you might use this option statement
+ </para>
+<programlisting>response-policy { zone "bl"; };</programlisting>
+ <para>
+ and this zone statement
+ </para>
+<programlisting>zone "bl" {type master; file "example/bl"; allow-query {none;}; };</programlisting>
+ <para>
+ with this zone file
+ </para>
+<programlisting>$TTL 1H
+@ SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h)
+
+; QNAME rules
+nxdomain.domain.com CNAME .
+nodata.domain.com CNAME *.
+bad.domain.com A 10.0.0.1
+ AAAA 2001:2::1
+ok.domain.com CNAME ok.domain.com.
+*.badzone.domain.com CNAME garden.example.com.
+
+; IP rules rewriting all answers for 127/8 except 127.0.0.1
+8.0.0.0.127.ip CNAME .
+32.1.0.0.127.ip CNAME 32.1.0.0.127.
+
+; NSDNAME and NSIP rules
+ns.domain.com.rpz-nsdname CNAME .
+48.zz.2.2001.rpz-nsip CNAME .
+</programlisting>
+ </sect3>
</sect2>
<sect2 id="server_statement_grammar">
@@ -8327,8 +9356,10 @@ XXX: end of RFC1918 addresses #defined out -->
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> query-source <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional> <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
- <optional> query-source-v6 <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional> <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
+ <optional> query-source <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
+ <optional> query-source-v6 <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional>
+ <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
<optional> use-queryport-pool <replaceable>yes_or_no</replaceable>; </optional>
<optional> queryport-pool-ports <replaceable>number</replaceable>; </optional>
<optional> queryport-pool-updateinterval <replaceable>number</replaceable>; </optional>
@@ -8526,7 +9557,8 @@ XXX: end of RFC1918 addresses #defined out -->
<title><command>statistics-channels</command> Statement Grammar</title>
<programlisting><command>statistics-channels</command> {
- [ inet ( ip_addr | * ) [ port ip_port ] [allow { <replaceable> address_match_list </replaceable> } ]; ]
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ [ allow { <replaceable> address_match_list </replaceable> } ]; ]
[ inet ...; ]
};
</programlisting>
@@ -8590,7 +9622,7 @@ XXX: end of RFC1918 addresses #defined out -->
</sect2>
- <sect2>
+ <sect2 id="trusted-keys">
<title><command>trusted-keys</command> Statement Grammar</title>
<programlisting><command>trusted-keys</command> {
@@ -8632,6 +9664,136 @@ XXX: end of RFC1918 addresses #defined out -->
in the key data, so the configuration may be split up into
multiple lines.
</para>
+ <para>
+ <command>trusted-keys</command> may be set at the top level
+ of <filename>named.conf</filename> or within a view. If it is
+ set in both places, they are additive: keys defined at the top
+ level are inherited by all views, but keys defined in a view
+ are only used within that view.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title><command>managed-keys</command> Statement Grammar</title>
+
+<programlisting><command>managed-keys</command> {
+ <replaceable>string</replaceable> initial-key <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ;
+ <optional> <replaceable>string</replaceable> initial-key <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ; <optional>...</optional></optional>
+};
+</programlisting>
+
+ </sect2>
+ <sect2 id="managed-keys">
+ <title><command>managed-keys</command> Statement Definition
+ and Usage</title>
+ <para>
+ The <command>managed-keys</command> statement, like
+ <command>trusted-keys</command>, defines DNSSEC
+ security roots. The difference is that
+ <command>managed-keys</command> can be kept up to date
+ automatically, without intervention from the resolver
+ operator.
+ </para>
+ <para>
+ Suppose, for example, that a zone's key-signing
+ key was compromised, and the zone owner had to revoke and
+ replace the key. A resolver which had the old key in a
+ <command>trusted-keys</command> statement would be
+ unable to validate this zone any longer; it would
+ reply with a SERVFAIL response code. This would
+ continue until the resolver operator had updated the
+ <command>trusted-keys</command> statement with the new key.
+ </para>
+ <para>
+ If, however, the zone were listed in a
+ <command>managed-keys</command> statement instead, then the
+ zone owner could add a "stand-by" key to the zone in advance.
+ <command>named</command> would store the stand-by key, and
+ when the original key was revoked, <command>named</command>
+ would be able to transition smoothly to the new key. It would
+ also recognize that the old key had been revoked, and cease
+ using that key to validate answers, minimizing the damage that
+ the compromised key could do.
+ </para>
+ <para>
+ A <command>managed-keys</command> statement contains a list of
+ the keys to be managed, along with information about how the
+ keys are to be initialized for the first time. The only
+ initialization method currently supported (as of
+ <acronym>BIND</acronym> 9.7.0) is <literal>initial-key</literal>.
+ This means the <command>managed-keys</command> statement must
+ contain a copy of the initializing key. (Future releases may
+ allow keys to be initialized by other methods, eliminating this
+ requirement.)
+ </para>
+ <para>
+ Consequently, a <command>managed-keys</command> statement
+ appears similar to a <command>trusted-keys</command>, differing
+ in the presence of the second field, containing the keyword
+ <literal>initial-key</literal>. The difference is, whereas the
+ keys listed in a <command>trusted-keys</command> continue to be
+ trusted until they are removed from
+ <filename>named.conf</filename>, an initializing key listed
+ in a <command>managed-keys</command> statement is only trusted
+ <emphasis>once</emphasis>: for as long as it takes to load the
+ managed key database and start the RFC 5011 key maintenance
+ process.
+ </para>
+ <para>
+ The first time <command>named</command> runs with a managed key
+ configured in <filename>named.conf</filename>, it fetches the
+ DNSKEY RRset directly from the zone apex, and validates it
+ using the key specified in the <command>managed-keys</command>
+ statement. If the DNSKEY RRset is validly signed, then it is
+ used as the basis for a new managed keys database.
+ </para>
+ <para>
+ From that point on, whenever <command>named</command> runs, it
+ sees the <command>managed-keys</command> statement, checks to
+ make sure RFC 5011 key maintenance has already been initialized
+ for the specified domain, and if so, it simply moves on. The
+ key specified in the <command>managed-keys</command> is not
+ used to validate answers; it has been superseded by the key or
+ keys stored in the managed keys database.
+ </para>
+ <para>
+ The next time <command>named</command> runs after a name
+ has been <emphasis>removed</emphasis> from the
+ <command>managed-keys</command> statement, the corresponding
+ zone will be removed from the managed keys database,
+ and RFC 5011 key maintenance will no longer be used for that
+ domain.
+ </para>
+ <para>
+ <command>named</command> only maintains a single managed keys
+ database; consequently, unlike <command>trusted-keys</command>,
+ <command>managed-keys</command> may only be set at the top
+ level of <filename>named.conf</filename>, not within a view.
+ </para>
+ <para>
+ In the current implementation, the managed keys database is
+ stored as a master-format zone file called
+ <filename>managed-keys.bind</filename>. When the key database
+ is changed, the zone is updated. As with any other dynamic
+ zone, changes will be written into a journal file,
+ <filename>managed-keys.bind.jnl</filename>. They are committed
+ to the master file as soon as possible afterward; in the case
+ of the managed key database, this will usually occur within 30
+ seconds. So, whenever <command>named</command> is using
+ automatic key maintenance, those two files can be expected to
+ exist in the working directory. (For this reason among others,
+ the working directory should be always be writable by
+ <command>named</command>.)
+ </para>
+ <para>
+ If the <command>dnssec-lookaside</command> option is
+ set to <userinput>auto</userinput>, <command>named</command>
+ will automatically initialize a managed key for the
+ zone <literal>dlv.isc.org</literal>. The key that is
+ used to initialize the key maintenance process is built
+ into <command>named</command>, and can be overridden
+ from <command>bindkeys-file</command>.
+ </para>
</sect2>
<sect2 id="view_statement_grammar">
@@ -8746,11 +9908,12 @@ XXX: end of RFC1918 addresses #defined out -->
// This should match our internal networks.
match-clients { 10.0.0.0/8; };
- // Provide recursive service to internal clients only.
+ // Provide recursive service to internal
+ // clients only.
recursion yes;
- // Provide a complete view of the example.com zone
- // including addresses of internal hosts.
+ // Provide a complete view of the example.com
+ // zone including addresses of internal hosts.
zone "example.com" {
type master;
file "example-internal.db";
@@ -8758,14 +9921,15 @@ XXX: end of RFC1918 addresses #defined out -->
};
view "external" {
- // Match all clients not matched by the previous view.
+ // Match all clients not matched by the
+ // previous view.
match-clients { any; };
// Refuse recursive service to external clients.
recursion no;
- // Provide a restricted view of the example.com zone
- // containing only publicly accessible hosts.
+ // Provide a restricted view of the example.com
+ // zone containing only publicly accessible hosts.
zone "example.com" {
type master;
file "example-external.db";
@@ -8784,8 +9948,9 @@ view "external" {
<optional> allow-query-on { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-transfer { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-update { <replaceable>address_match_list</replaceable> }; </optional>
- <optional> update-policy { <replaceable>update_policy_rule</replaceable> <optional>...</optional> }; </optional>
- <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> update-policy <replaceable>local</replaceable> | { <replaceable>update_policy_rule</replaceable> <optional>...</optional> }; </optional>
+ <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
<optional> check-mx (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
<optional> check-wildcard <replaceable>yes_or_no</replaceable>; </optional>
@@ -8821,6 +9986,7 @@ view "external" {
<optional> min-retry-time <replaceable>number</replaceable> ; </optional>
<optional> max-retry-time <replaceable>number</replaceable> ; </optional>
<optional> key-directory <replaceable>path_name</replaceable>; </optional>
+ <optional> auto-dnssec <constant>allow</constant>|<constant>maintain</constant>|<constant>create</constant>|<constant>off</constant>; </optional>
<optional> zero-no-soa-ttl <replaceable>yes_or_no</replaceable> ; </optional>
};
@@ -8832,8 +9998,11 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> allow-transfer { <replaceable>address_match_list</replaceable> }; </optional>
<optional> allow-update-forwarding { <replaceable>address_match_list</replaceable> }; </optional>
<optional> update-check-ksk <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-dnskey-kskonly <replaceable>yes_or_no</replaceable>; </optional>
+ <optional> dnssec-secure-to-insecure <replaceable>yes_or_no</replaceable> ; </optional>
<optional> try-tcp-refresh <replaceable>yes_or_no</replaceable>; </optional>
- <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
+ <optional> also-notify { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ;
+ <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
<optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
<optional> dialup <replaceable>dialup_option</replaceable> ; </optional>
<optional> file <replaceable>string</replaceable> ; </optional>
@@ -8846,7 +10015,9 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> ixfr-from-differences <replaceable>yes_or_no</replaceable>; </optional>
<optional> ixfr-tmp-file <replaceable>string</replaceable> ; </optional>
<optional> maintain-ixfr-base <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
+ <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable>
+ <optional>port <replaceable>ip_port</replaceable></optional>
+ <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
<optional> max-ixfr-log-size <replaceable>number</replaceable> ; </optional>
<optional> max-transfer-idle-in <replaceable>number</replaceable> ; </optional>
<optional> max-transfer-idle-out <replaceable>number</replaceable> ; </optional>
@@ -8859,7 +10030,8 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> alt-transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> use-alt-transfer-source <replaceable>yes_or_no</replaceable>; </optional>
<optional> notify-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> notify-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
@@ -8877,7 +10049,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
type hint;
file <replaceable>string</replaceable> ;
<optional> delegation-only <replaceable>yes_or_no</replaceable> ; </optional>
- <optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; // Not Implemented. </optional>
+ <optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional> // Not Implemented.
};
zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> {
@@ -8891,14 +10063,18 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<optional> masterfile-format (<constant>text</constant>|<constant>raw</constant>) ; </optional>
<optional> forward (<constant>only</constant>|<constant>first</constant>) ; </optional>
<optional> forwarders { <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
- <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
+ <optional> masters <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>masters_list</replaceable> | <replaceable>ip_addr</replaceable>
+ <optional>port <replaceable>ip_port</replaceable></optional>
+ <optional>key <replaceable>key</replaceable></optional> ) ; <optional>...</optional> }; </optional>
<optional> max-transfer-idle-in <replaceable>number</replaceable> ; </optional>
<optional> max-transfer-time-in <replaceable>number</replaceable> ; </optional>
<optional> pubkey <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ; </optional>
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> alt-transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
- <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
+ <optional> alt-transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>)
+ <optional>port <replaceable>ip_port</replaceable></optional> ; </optional>
<optional> use-alt-transfer-source <replaceable>yes_or_no</replaceable>; </optional>
<optional> zone-statistics <replaceable>yes_or_no</replaceable> ; </optional>
<optional> database <replaceable>string</replaceable> ; </optional>
@@ -8910,6 +10086,14 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
};
zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> {
+ type static-stub;
+ <optional> allow-query { <replaceable>address_match_list</replaceable> }; </optional>
+ <optional> server-addresses { <optional> <replaceable>ip_addr</replaceable> ; ... </optional> }; </optional>
+ <optional> server-names { <optional> <replaceable>namelist</replaceable> </optional> }; </optional>
+ <optional> zone-statistics <replaceable>yes_or_no</replaceable> ; </optional>
+};
+
+zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> {
type forward;
<optional> forward (<constant>only</constant>|<constant>first</constant>) ; </optional>
<optional> forwarders { <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
@@ -9056,6 +10240,55 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<row rowsep="0">
<entry colname="1">
<para>
+ <varname>static-stub</varname>
+ </para>
+ </entry>
+ <entry colname="2">
+ <para>
+ A static-stub zone is similar to a stub zone
+ with the following exceptions:
+ the zone data is statically configured, rather
+ than transferred from a master server;
+ when recursion is necessary for a query that
+ matches a static-stub zone, the locally
+ configured data (nameserver names and glue addresses)
+ is always used even if different authoritative
+ information is cached.
+ </para>
+ <para>
+ Zone data is configured via the
+ <command>server-addresses</command> and
+ <command>server-names</command> zone options.
+ </para>
+ <para>
+ The zone data is maintained in the form of NS
+ and (if necessary) glue A or AAAA RRs
+ internally, which can be seen by dumping zone
+ databases by <command>rndc dumpdb -all</command>.
+ The configured RRs are considered local configuration
+ parameters rather than public data.
+ Non recursive queries (i.e., those with the RD
+ bit off) to a static-stub zone are therefore
+ prohibited and will be responded with REFUSED.
+ </para>
+ <para>
+ Since the data is statically configured, no
+ zone maintenance action takes place for a static-stub
+ zone.
+ For example, there is no periodic refresh
+ attempt, and an incoming notify message
+ will be rejected with an rcode of NOTAUTH.
+ </para>
+ <para>
+ Each static-stub zone is configured with
+ internally generated NS and (if necessary)
+ glue A or AAAA RRs
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
<varname>forward</varname>
</para>
</entry>
@@ -9270,6 +10503,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
received from the
network. The default varies according to zone type. For <command>master</command> zones the default is <command>fail</command>. For <command>slave</command>
zones the default is <command>warn</command>.
+ It is not implemented for <command>hint</command> zones.
</para>
</listitem>
</varlistentry>
@@ -9335,6 +10569,16 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</varlistentry>
<varlistentry>
+ <term><command>dnssec-dnskey-kskonly</command></term>
+ <listitem>
+ <para>
+ See the description of
+ <command>dnssec-dnskey-kskonly</command> in <xref linkend="boolean_options"/>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>try-tcp-refresh</command></term>
<listitem>
<para>
@@ -9569,6 +10813,84 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</varlistentry>
<varlistentry>
+ <term><command>server-addresses</command></term>
+ <listitem>
+ <para>
+ Only meaningful for static-stub zones.
+ This is a list of IP addresses to which queries
+ should be sent in recursive resolution for the
+ zone.
+ A non empty list for this option will internally
+ configure the apex NS RR with associated glue A or
+ AAAA RRs.
+ </para>
+ <para>
+ For example, if "example.com" is configured as a
+ static-stub zone with 192.0.2.1 and 2001:db8::1234
+ in a <command>server-addresses</command> option,
+ the following RRs will be internally configured.
+ </para>
+<programlisting>example.com. NS example.com.
+example.com. A 192.0.2.1
+example.com. AAAA 2001:db8::1234</programlisting>
+ <para>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ will initiate recursive resolution and send
+ queries to 192.0.2.1 and/or 2001:db8::1234.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>server-names</command></term>
+ <listitem>
+ <para>
+ Only meaningful for static-stub zones.
+ This is a list of domain names of nameservers that
+ act as authoritative servers of the static-stub
+ zone.
+ These names will be resolved to IP addresses when
+ <command>named</command> needs to send queries to
+ these servers.
+ To make this supplemental resolution successful,
+ these names must not be a subdomain of the origin
+ name of static-stub zone.
+ That is, when "example.net" is the origin of a
+ static-stub zone, "ns.example" and
+ "master.example.com" can be specified in the
+ <command>server-names</command> option, but
+ "ns.example.net" cannot, and will be rejected by
+ the configuration parser.
+ </para>
+ <para>
+ A non empty list for this option will internally
+ configure the apex NS RR with the specified names.
+ For example, if "example.com" is configured as a
+ static-stub zone with "ns1.example.net" and
+ "ns2.example.net"
+ in a <command>server-names</command> option,
+ the following RRs will be internally configured.
+ </para>
+<programlisting>example.com. NS ns1.example.net.
+example.com. NS ns2.example.net.
+</programlisting>
+ <para>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ initiate recursive resolution,
+ resolve "ns1.example.net" and/or
+ "ns2.example.net" to IP addresses, and then send
+ queries to (one or more of) these addresses.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>sig-validity-interval</command></term>
<listitem>
<para>
@@ -9716,6 +11038,51 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</varlistentry>
<varlistentry>
+ <term><command>auto-dnssec</command></term>
+ <listitem>
+ <para>
+ Zones configured for dynamic DNS may also use this
+ option to allow varying levels of automatic DNSSEC key
+ management. There are four possible settings:
+ </para>
+ <para>
+ <command>auto-dnssec allow;</command> permits
+ keys to be updated and the zone fully re-signed
+ whenever the user issues the command <command>rndc sign
+ <replaceable>zonename</replaceable></command>.
+ </para>
+ <para>
+ <command>auto-dnssec maintain;</command> includes the
+ above, but also automatically adjusts the zone's DNSSEC
+ keys on schedule, according to the keys' timing metadata
+ (see <xref linkend="man.dnssec-keygen"/> and
+ <xref linkend="man.dnssec-settime"/>). The command
+ <command>rndc sign
+ <replaceable>zonename</replaceable></command> causes
+ <command>named</command> to load keys from the key
+ repository and sign the zone with all keys that are
+ active.
+ <command>rndc loadkeys
+ <replaceable>zonename</replaceable></command> causes
+ <command>named</command> to load keys from the key
+ repository and schedule key maintenance events to occur
+ in the future, but it does not sign the full zone
+ immediately.
+ </para>
+ <para>
+ <command>auto-dnssec create;</command> includes the
+ above, but also allows <command>named</command>
+ to create new keys in the key repository when needed.
+ (NOTE: This option is not yet implemented; the syntax is
+ being reserved for future use.)
+ </para>
+ <para>
+ The default setting is <command>auto-dnssec off</command>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><command>multi-master</command></term>
<listitem>
<para>
@@ -9735,6 +11102,16 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><command>dnssec-secure-to-insecure</command></term>
+ <listitem>
+ <para>
+ See the description of
+ <command>dnssec-secure-to-insecure</command> in <xref linkend="boolean_options"/>.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</sect3>
@@ -9753,15 +11130,14 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
record of any name in the zone.
</para>
<para>
- The <command>update-policy</command> clause is new
- in <acronym>BIND</acronym> 9 and allows more fine-grained
- control over what updates are allowed. A set of rules
- is specified, where each rule either grants or denies
- permissions for one or more names to be updated by
- one or more identities. If the dynamic update request
- message is signed (that is, it includes either a TSIG
- or SIG(0) record), the identity of the signer can be
- determined.
+ The <command>update-policy</command> clause
+ allows more fine-grained control over what updates are
+ allowed. A set of rules is specified, where each rule
+ either grants or denies permissions for one or more
+ names to be updated by one or more identities. If
+ the dynamic update request message is signed (that is,
+ it includes either a TSIG or SIG(0) record), the
+ identity of the signer can be determined.
</para>
<para>
Rules are specified in the <command>update-policy</command>
@@ -9773,24 +11149,53 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
only examines the signer of a message; the source
address is not relevant.
</para>
+ <para>
+ There is a pre-defined <command>update-policy</command>
+ rule which can be switched on with the command
+ <command>update-policy local;</command>.
+ Switching on this rule in a zone causes
+ <command>named</command> to generate a TSIG session
+ key and place it in a file, and to allow that key
+ to update the zone. (By default, the file is
+ <filename>/var/run/named/session.key</filename>, the key
+ name is "local-ddns" and the key algorithm is HMAC-SHA256,
+ but these values are configurable with the
+ <command>session-keyfile</command>,
+ <command>session-keyname</command> and
+ <command>session-keyalg</command> options, respectively).
+ </para>
+ <para>
+ A client running on the local system, and with appropriate
+ permissions, may read that file and use the key to sign update
+ requests. The zone's update policy will be set to allow that
+ key to change any record within the zone. Assuming the
+ key name is "local-ddns", this policy is equivalent to:
+ </para>
+
+ <programlisting>update-policy { grant local-ddns zonesub any; };
+ </programlisting>
<para>
- This is how a rule definition looks:
+ The command <command>nsupdate -l</command> sends update
+ requests to localhost, and signs them using the session key.
+ </para>
+
+ <para>
+ Other rule definitions look like this:
</para>
<programlisting>
-( <command>grant</command> | <command>deny</command> ) <replaceable>identity</replaceable> <replaceable>nametype</replaceable> <replaceable>name</replaceable> <optional> <replaceable>types</replaceable> </optional>
+( <command>grant</command> | <command>deny</command> ) <replaceable>identity</replaceable> <replaceable>nametype</replaceable> <optional> <replaceable>name</replaceable> </optional> <optional> <replaceable>types</replaceable> </optional>
</programlisting>
<para>
Each rule grants or denies privileges. Once a message has
successfully matched a rule, the operation is immediately
- granted
- or denied and no further rules are examined. A rule is matched
- when the signer matches the identity field, the name matches the
- name field in accordance with the nametype field, and the type
- matches
- the types specified in the type field.
+ granted or denied and no further rules are examined. A rule
+ is matched when the signer matches the identity field, the
+ name matches the name field in accordance with the nametype
+ field, and the type matches the types specified in the type
+ field.
</para>
<para>
No signer is required for <replaceable>tcp-self</replaceable>
@@ -9817,7 +11222,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</para>
<para>
- The <replaceable>nametype</replaceable> field has 12
+ The <replaceable>nametype</replaceable> field has 13
values:
<varname>name</varname>, <varname>subdomain</varname>,
<varname>wildcard</varname>, <varname>self</varname>,
@@ -9825,7 +11230,8 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<varname>krb5-self</varname>, <varname>ms-self</varname>,
<varname>krb5-subdomain</varname>,
<varname>ms-subdomain</varname>,
- <varname>tcp-self</varname> and <varname>6to4-self</varname>.
+ <varname>tcp-self</varname>, <varname>6to4-self</varname>,
+ <varname>zonesub</varname>, and <varname>external</varname>.
</para>
<informaltable>
<tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="4Level-table">
@@ -9863,6 +11269,28 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
<row rowsep="0">
<entry colname="1">
<para>
+ <varname>zonesub</varname>
+ </para>
+ </entry> <entry colname="2">
+ <para>
+ This rule is similar to subdomain, except that
+ it matches when the name being updated is a
+ subdomain of the zone in which the
+ <command>update-policy</command> statement
+ appears. This obviates the need to type the zone
+ name twice, and enables the use of a standard
+ <command>update-policy</command> statement in
+ multiple zones without modification.
+ </para>
+ <para>
+ When this rule is used, the
+ <replaceable>name</replaceable> field is omitted.
+ </para>
+ </entry>
+ </row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
<varname>wildcard</varname>
</para>
</entry> <entry colname="2">
@@ -9950,7 +11378,7 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</entry> <entry colname="2">
<para>
Allow the 6to4 prefix to be update by any TCP
- conection from the 6to4 network or from the
+ connection from the 6to4 network or from the
corresponding IPv4 address. This is intended
to allow NS or DNAME RRsets to be added to the
reverse tree.
@@ -9961,14 +11389,56 @@ zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replacea
</note>
</entry>
</row>
+ <row rowsep="0">
+ <entry colname="1">
+ <para>
+ <varname>external</varname>
+ </para>
+ </entry> <entry colname="2">
+ <para>
+ This rule allows <command>named</command>
+ to defer the decision of whether to allow a
+ given update to an external daemon.
+ </para>
+ <para>
+ The method of communicating with the daemon is
+ specified in the <replaceable>identity</replaceable>
+ field, the format of which is
+ "<constant>local:</constant><replaceable>path</replaceable>",
+ where <replaceable>path</replaceable> is the location
+ of a UNIX-domain socket. (Currently, "local" is the
+ only supported mechanism.)
+ </para>
+ <para>
+ Requests to the external daemon are sent over the
+ UNIX-domain socket as datagrams with the following
+ format:
+ </para>
+ <programlisting>
+ Protocol version number (4 bytes, network byte order, currently 1)
+ Request length (4 bytes, network byte order)
+ Signer (null-terminated string)
+ Name (null-terminated string)
+ TCP source address (null-terminated string)
+ Rdata type (null-terminated string)
+ Key (null-terminated string)
+ TKEY token length (4 bytes, network byte order)
+ TKEY token (remainder of packet)</programlisting>
+ <para>
+ The daemon replies with a four-byte value in
+ network byte order, containing either 0 or 1; 0
+ indicates that the specified update is not
+ permitted, and 1 indicates that it is.
+ </para>
+ </entry>
+ </row>
</tbody>
</tgroup>
</informaltable>
<para>
In all cases, the <replaceable>name</replaceable>
- field must
- specify a fully-qualified domain name.
+ field must specify a fully-qualified domain name.
</para>
<para>
@@ -11381,7 +12851,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</para>
<programlisting>$ORIGIN 0.0.192.IN-ADDR.ARPA.
-$GENERATE 1-2 0 NS SERVER$.EXAMPLE.
+$GENERATE 1-2 @ NS SERVER$.EXAMPLE.
$GENERATE 1-127 $ CNAME $.0</programlisting>
<para>
@@ -11396,6 +12866,32 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
127.0.0.192.IN-ADDR.ARPA. CNAME 127.0.0.0.192.IN-ADDR.ARPA.
</programlisting>
+ <para>
+ Generate a set of A and MX records. Note the MX's right hand
+ side is a quoted string. The quotes will be stripped when the
+ right hand side is processed.
+ </para>
+
+<programlisting>
+$ORIGIN EXAMPLE.
+$GENERATE 1-127 HOST-$ A 1.2.3.$
+$GENERATE 1-127 HOST-$ MX "0 ."</programlisting>
+
+ <para>
+ is equivalent to
+ </para>
+
+<programlisting>HOST-1.EXAMPLE. A 1.2.3.1
+HOST-1.EXAMPLE. MX 0 .
+HOST-2.EXAMPLE. A 1.2.3.2
+HOST-2.EXAMPLE. MX 0 .
+HOST-3.EXAMPLE. A 1.2.3.3
+HOST-3.EXAMPLE. MX 0 .
+...
+HOST-127.EXAMPLE. A 1.2.3.127
+HOST-127.EXAMPLE. MX 0 .
+</programlisting>
+
<informaltable colsep="0" rowsep="0">
<tgroup cols="2" colsep="0" rowsep="0" tgroupstyle="3Level-table">
<colspec colname="1" colnum="1" colsep="0" colwidth="0.875in"/>
@@ -11445,20 +12941,30 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
Available output forms are decimal
(<command>d</command>), octal
- (<command>o</command>) and hexadecimal
+ (<command>o</command>), hexadecimal
(<command>x</command> or <command>X</command>
- for uppercase). The default modifier is
+ for uppercase) and nibble
+ (<command>n</command> or <command>N</command>\
+ for uppercase). The default modifier is
<command>${0,0,d}</command>. If the
<command>lhs</command> is not absolute, the
current <command>$ORIGIN</command> is appended
to the name.
</para>
- <para>
- For compatibility with earlier versions, <command>$$</command> is still
- recognized as indicating a literal $ in the output.
- </para>
- </entry>
- </row>
+ <para>
+ In nibble mode the value will be treated as
+ if it was a reversed hexadecimal string
+ with each hexadecimal digit as a separate
+ label. The width field includes the label
+ separator.
+ </para>
+ <para>
+ For compatibility with earlier versions,
+ <command>$$</command> is still recognized as
+ indicating a literal $ in the output.
+ </para>
+ </entry>
+ </row>
<row rowsep="0">
<entry colname="1">
<para><command>ttl</command></para>
@@ -11497,8 +13003,7 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</entry>
<entry colname="2">
<para>
- At present the only supported types are
- PTR, CNAME, DNAME, A, AAAA and NS.
+ Any valid type.
</para>
</entry>
</row>
@@ -11508,8 +13013,7 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</entry>
<entry colname="2">
<para>
- <command>rhs</command> is a domain name. It is processed
- similarly to lhs.
+ <command>rhs</command>, optionally, quoted string.
</para>
</entry>
</row>
@@ -11668,9 +13172,12 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</entry>
<entry colname="2">
<para>
- The number of RRsets per RR type (positive
- or negative) and nonexistent names stored in the
- cache database.
+ The number of RRsets per RR type and nonexistent
+ names stored in the cache database.
+ If the exclamation mark (!) is printed for a RR
+ type, it means that particular type of RRset is
+ known to be nonexistent (this is also known as
+ "NXRRSET").
Maintained per view.
</para>
</entry>
@@ -12639,6 +14146,13 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
<entry colname="3">
<para>
Mismatch responses received.
+ The DNS ID, response's source address,
+ and/or the response's source port does not
+ match what was expected.
+ (The port must be 53 or as defined by
+ the <command>port</command> option.)
+ This may be an indication of a cache
+ poisoning attempt.
</para>
</entry>
</row>
@@ -13106,14 +14620,17 @@ $GENERATE 1-127 $ CNAME $.0</programlisting>
</para>
<programlisting>
-// Set up an ACL named "bogusnets" that will block RFC1918 space
-// and some reserved space, which is commonly used in spoofing attacks.
+// Set up an ACL named "bogusnets" that will block
+// RFC1918 space and some reserved space, which is
+// commonly used in spoofing attacks.
acl bogusnets {
- 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3;
- 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
+ 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24;
+ 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12;
+ 192.168.0.0/16;
};
-// Set up an ACL called our-nets. Replace this with the real IP numbers.
+// Set up an ACL called our-nets. Replace this with the
+// real IP numbers.
acl our-nets { x.x.x.x/24; x.x.x.x/21; };
options {
...
@@ -14756,8 +16273,12 @@ zone "example.com" {
</bibliography>
</sect2>
</sect1>
+
+ <xi:include href="libdns.xml"/>
+
</appendix>
+
<reference id="Bv9ARM.ch10">
<title>Manual pages</title>
<xi:include href="../../bin/dig/dig.docbook"/>
@@ -14765,15 +16286,23 @@ zone "example.com" {
<xi:include href="../../bin/dnssec/dnssec-dsfromkey.docbook"/>
<xi:include href="../../bin/dnssec/dnssec-keyfromlabel.docbook"/>
<xi:include href="../../bin/dnssec/dnssec-keygen.docbook"/>
+ <xi:include href="../../bin/dnssec/dnssec-revoke.docbook"/>
+ <xi:include href="../../bin/dnssec/dnssec-settime.docbook"/>
<xi:include href="../../bin/dnssec/dnssec-signzone.docbook"/>
<xi:include href="../../bin/check/named-checkconf.docbook"/>
<xi:include href="../../bin/check/named-checkzone.docbook"/>
<xi:include href="../../bin/named/named.docbook"/>
+ <xi:include href="../../bin/tools/named-journalprint.docbook"/>
<!-- named.conf.docbook and others? -->
<xi:include href="../../bin/nsupdate/nsupdate.docbook"/>
<xi:include href="../../bin/rndc/rndc.docbook"/>
<xi:include href="../../bin/rndc/rndc.conf.docbook"/>
- <xi:include href="../../bin/rndc/rndc-confgen.docbook"/>
+ <xi:include href="../../bin/confgen/rndc-confgen.docbook"/>
+ <xi:include href="../../bin/confgen/ddns-confgen.docbook"/>
+ <xi:include href="../../bin/tools/arpaname.docbook"/>
+ <xi:include href="../../bin/tools/genrandom.docbook"/>
+ <xi:include href="../../bin/tools/isc-hmac-fixup.docbook"/>
+ <xi:include href="../../bin/tools/nsec3hash.docbook"/>
</reference>
</book>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch01.html b/contrib/bind9/doc/arm/Bv9ARM.ch01.html
index 4cdfb09..ff2c5ce 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch01.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch01.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch01.html,v 1.43.48.4 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch01.html,v 1.49 2011-01-05 01:14:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,17 +45,17 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563412">Scope of Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564391">Organization of This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564531">Conventions Used in This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564712">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564371">Scope of Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564394">Organization of This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564534">Conventions Used in This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564715">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564733">DNS Fundamentals</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564768">Domains and Domain Names</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567173">Zones</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567250">Authoritative Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567422">Caching Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567553">Name Servers in Multiple Roles</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564737">DNS Fundamentals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564771">Domains and Domain Names</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567176">Zones</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567253">Authoritative Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567426">Caching Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567556">Name Servers in Multiple Roles</a></span></dt>
</dl></dd>
</dl>
</div>
@@ -71,7 +71,7 @@
</p>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2563412"></a>Scope of Document</h2></div></div></div>
+<a name="id2564371"></a>Scope of Document</h2></div></div></div>
<p>
The Berkeley Internet Name Domain
(<acronym class="acronym">BIND</acronym>) implements a
@@ -82,12 +82,12 @@
system administrators.
</p>
<p>
- This version of the manual corresponds to BIND version 9.6.
+ This version of the manual corresponds to BIND version 9.7.
</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2564391"></a>Organization of This Document</h2></div></div></div>
+<a name="id2564394"></a>Organization of This Document</h2></div></div></div>
<p>
In this document, <span class="emphasis"><em>Chapter 1</em></span> introduces
the basic <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym> concepts. <span class="emphasis"><em>Chapter 2</em></span>
@@ -116,7 +116,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2564531"></a>Conventions Used in This Document</h2></div></div></div>
+<a name="id2564534"></a>Conventions Used in This Document</h2></div></div></div>
<p>
In this document, we use the following general typographic
conventions:
@@ -243,7 +243,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2564712"></a>The Domain Name System (<acronym class="acronym">DNS</acronym>)</h2></div></div></div>
+<a name="id2564715"></a>The Domain Name System (<acronym class="acronym">DNS</acronym>)</h2></div></div></div>
<p>
The purpose of this document is to explain the installation
and upkeep of the <acronym class="acronym">BIND</acronym> (Berkeley Internet
@@ -253,7 +253,7 @@
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2564733"></a>DNS Fundamentals</h3></div></div></div>
+<a name="id2564737"></a>DNS Fundamentals</h3></div></div></div>
<p>
The Domain Name System (DNS) is a hierarchical, distributed
database. It stores information for mapping Internet host names to
@@ -275,7 +275,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2564768"></a>Domains and Domain Names</h3></div></div></div>
+<a name="id2564771"></a>Domains and Domain Names</h3></div></div></div>
<p>
The data stored in the DNS is identified by <span class="emphasis"><em>domain names</em></span> that are organized as a tree according to
organizational or administrative boundaries. Each node of the tree,
@@ -321,7 +321,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567173"></a>Zones</h3></div></div></div>
+<a name="id2567176"></a>Zones</h3></div></div></div>
<p>
To properly operate a name server, it is important to understand
the difference between a <span class="emphasis"><em>zone</em></span>
@@ -374,7 +374,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567250"></a>Authoritative Name Servers</h3></div></div></div>
+<a name="id2567253"></a>Authoritative Name Servers</h3></div></div></div>
<p>
Each zone is served by at least
one <span class="emphasis"><em>authoritative name server</em></span>,
@@ -391,7 +391,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567273"></a>The Primary Master</h4></div></div></div>
+<a name="id2567276"></a>The Primary Master</h4></div></div></div>
<p>
The authoritative server where the master copy of the zone
data is maintained is called the
@@ -411,7 +411,7 @@
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567303"></a>Slave Servers</h4></div></div></div>
+<a name="id2567374"></a>Slave Servers</h4></div></div></div>
<p>
The other authoritative servers, the <span class="emphasis"><em>slave</em></span>
servers (also known as <span class="emphasis"><em>secondary</em></span> servers)
@@ -427,7 +427,7 @@
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567393"></a>Stealth Servers</h4></div></div></div>
+<a name="id2567396"></a>Stealth Servers</h4></div></div></div>
<p>
Usually all of the zone's authoritative servers are listed in
NS records in the parent zone. These NS records constitute
@@ -462,7 +462,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567422"></a>Caching Name Servers</h3></div></div></div>
+<a name="id2567426"></a>Caching Name Servers</h3></div></div></div>
<p>
The resolver libraries provided by most operating systems are
<span class="emphasis"><em>stub resolvers</em></span>, meaning that they are not
@@ -489,7 +489,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2567526"></a>Forwarding</h4></div></div></div>
+<a name="id2567529"></a>Forwarding</h4></div></div></div>
<p>
Even a caching name server does not necessarily perform
the complete recursive lookup itself. Instead, it can
@@ -516,7 +516,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567553"></a>Name Servers in Multiple Roles</h3></div></div></div>
+<a name="id2567556"></a>Name Servers in Multiple Roles</h3></div></div></div>
<p>
The <acronym class="acronym">BIND</acronym> name server can
simultaneously act as
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch02.html b/contrib/bind9/doc/arm/Bv9ARM.ch02.html
index 5181a2a..a9fde32 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch02.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch02.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch02.html,v 1.38.56.3 2010-01-24 01:55:25 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch02.html,v 1.43 2011-01-05 01:14:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,16 +45,16 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567587">Hardware requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567613">CPU Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567626">Memory Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567721">Name Server Intensive Environment Issues</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567732">Supported Operating Systems</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567590">Hardware requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567617">CPU Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567629">Memory Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567724">Name Server Intensive Environment Issues</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567735">Supported Operating Systems</a></span></dt>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567587"></a>Hardware requirements</h2></div></div></div>
+<a name="id2567590"></a>Hardware requirements</h2></div></div></div>
<p>
<acronym class="acronym">DNS</acronym> hardware requirements have
traditionally been quite modest.
@@ -73,7 +73,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567613"></a>CPU Requirements</h2></div></div></div>
+<a name="id2567617"></a>CPU Requirements</h2></div></div></div>
<p>
CPU requirements for <acronym class="acronym">BIND</acronym> 9 range from
i486-class machines
@@ -84,7 +84,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567626"></a>Memory Requirements</h2></div></div></div>
+<a name="id2567629"></a>Memory Requirements</h2></div></div></div>
<p>
The memory of the server has to be large enough to fit the
cache and zones loaded off disk. The <span><strong class="command">max-cache-size</strong></span>
@@ -107,7 +107,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567721"></a>Name Server Intensive Environment Issues</h2></div></div></div>
+<a name="id2567724"></a>Name Server Intensive Environment Issues</h2></div></div></div>
<p>
For name server intensive environments, there are two alternative
configurations that may be used. The first is where clients and
@@ -124,13 +124,13 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2567732"></a>Supported Operating Systems</h2></div></div></div>
+<a name="id2567735"></a>Supported Operating Systems</h2></div></div></div>
<p>
ISC <acronym class="acronym">BIND</acronym> 9 compiles and runs on a large
number
- of Unix-like operating systems and on NT-derived versions of
- Microsoft Windows such as Windows 2000 and Windows XP. For an
- up-to-date
+ of Unix-like operating systems and on
+ Microsoft Windows Server 2003 and 2008, and Windows XP and Vista.
+ For an up-to-date
list of supported systems, see the README file in the top level
directory
of the BIND 9 source distribution.
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch03.html b/contrib/bind9/doc/arm/Bv9ARM.ch03.html
index 454fdd6..e01d69e 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch03.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch03.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch03.html,v 1.71.48.4 2010-01-24 01:55:25 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch03.html,v 1.83 2011-01-21 01:14:13 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,14 +47,14 @@
<dl>
<dt><span class="sect1"><a href="Bv9ARM.ch03.html#sample_configuration">Sample Configurations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567764">A Caching-only Name Server</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567780">An Authoritative-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567767">A Caching-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567988">An Authoritative-only Name Server</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568007">Load Balancing</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568361">Name Server Operations</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568010">Load Balancing</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568364">Name Server Operations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568366">Tools for Use With the Name Server Daemon</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570006">Signals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568370">Tools for Use With the Name Server Daemon</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570385">Signals</a></span></dt>
</dl></dd>
</dl>
</div>
@@ -68,7 +68,7 @@
<a name="sample_configuration"></a>Sample Configurations</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567764"></a>A Caching-only Name Server</h3></div></div></div>
+<a name="id2567767"></a>A Caching-only Name Server</h3></div></div></div>
<p>
The following sample configuration is appropriate for a caching-only
name server for use by clients internal to a corporation. All
@@ -82,10 +82,13 @@
// Two corporate subnets we wish to allow queries from.
acl corpnets { 192.168.4.0/24; 192.168.7.0/24; };
options {
- directory "/etc/namedb"; // Working directory
+ // Working directory
+ directory "/etc/namedb";
+
allow-query { corpnets; };
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -95,7 +98,7 @@ zone "0.0.127.in-addr.arpa" {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2567780"></a>An Authoritative-only Name Server</h3></div></div></div>
+<a name="id2567988"></a>An Authoritative-only Name Server</h3></div></div></div>
<p>
This sample configuration is for an authoritative-only server
that is the master server for "<code class="filename">example.com</code>"
@@ -103,13 +106,18 @@ zone "0.0.127.in-addr.arpa" {
</p>
<pre class="programlisting">
options {
- directory "/etc/namedb"; // Working directory
- allow-query-cache { none; }; // Do not allow access to cache
- allow-query { any; }; // This is the default
- recursion no; // Do not provide recursive service
+ // Working directory
+ directory "/etc/namedb";
+ // Do not allow access to cache
+ allow-query-cache { none; };
+ // This is the default
+ allow-query { any; };
+ // Do not provide recursive service
+ recursion no;
};
-// Provide a reverse mapping for the loopback address 127.0.0.1
+// Provide a reverse mapping for the loopback
+// address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
@@ -119,7 +127,8 @@ zone "0.0.127.in-addr.arpa" {
zone "example.com" {
type master;
file "example.com.db";
- // IP addresses of slave servers allowed to transfer example.com
+ // IP addresses of slave servers allowed to
+ // transfer example.com
allow-transfer {
192.168.4.14;
192.168.5.53;
@@ -137,7 +146,7 @@ zone "eng.example.com" {
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2568007"></a>Load Balancing</h2></div></div></div>
+<a name="id2568010"></a>Load Balancing</h2></div></div></div>
<p>
A primitive form of load balancing can be achieved in
the <acronym class="acronym">DNS</acronym> by using multiple records
@@ -273,17 +282,17 @@ zone "eng.example.com" {
</p>
<p>
For more detail on ordering responses, check the
- <span><strong class="command">rrset-order</strong></span> substatement in the
+ <span><strong class="command">rrset-order</strong></span> sub-statement in the
<span><strong class="command">options</strong></span> statement, see
<a href="Bv9ARM.ch06.html#rrset_ordering">RRset Ordering</a>.
</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2568361"></a>Name Server Operations</h2></div></div></div>
+<a name="id2568364"></a>Name Server Operations</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2568366"></a>Tools for Use With the Name Server Daemon</h3></div></div></div>
+<a name="id2568370"></a>Tools for Use With the Name Server Daemon</h3></div></div></div>
<p>
This section describes several indispensable diagnostic,
administrative and monitoring tools available to the system
@@ -463,6 +472,60 @@ zone "eng.example.com" {
<dd><p>
Retransfer the given zone from the master.
</p></dd>
+<dt><span class="term"><strong class="userinput"><code>sign <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]</code></strong></span></dt>
+<dd>
+<p>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <span><strong class="command">key-directory</strong></span> in
+ <a href="Bv9ARM.ch06.html#options" title="options Statement Definition and
+ Usage">the section called &#8220;<span><strong class="command">options</strong></span> Statement Definition and
+ Usage&#8221;</a>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. If the DNSKEY RRset
+ is changed, then the zone is automatically
+ re-signed with the new key set.
+ </p>
+<p>
+ This command requires that the
+ <span><strong class="command">auto-dnssec</strong></span> zone option to be set
+ to <code class="literal">allow</code>,
+ <code class="literal">maintain</code>, or
+ <code class="literal">create</code>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for
+ more details.
+ </p>
+</dd>
+<dt><span class="term"><strong class="userinput"><code>loadkeys <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]</code></strong></span></dt>
+<dd>
+<p>
+ Fetch all DNSSEC keys for the given zone
+ from the key directory (see
+ <span><strong class="command">key-directory</strong></span> in
+ <a href="Bv9ARM.ch06.html#options" title="options Statement Definition and
+ Usage">the section called &#8220;<span><strong class="command">options</strong></span> Statement Definition and
+ Usage&#8221;</a>). If they are within
+ their publication period, merge them into the
+ zone's DNSKEY RRset. Unlike <span><strong class="command">rndc
+ sign</strong></span>, however, the zone is not
+ immediately re-signed by the new keys, but is
+ allowed to incrementally re-sign over time.
+ </p>
+<p>
+ This command requires that the
+ <span><strong class="command">auto-dnssec</strong></span> zone option to
+ be set to <code class="literal">maintain</code> or
+ <code class="literal">create</code>, and also requires
+ the zone to be configured to allow dynamic DNS.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for
+ more details.
+ </p>
+</dd>
<dt><span class="term"><strong class="userinput"><code>freeze
[<span class="optional"><em class="replaceable"><code>zone</code></em>
[<span class="optional"><em class="replaceable"><code>class</code></em>
@@ -536,6 +599,14 @@ zone "eng.example.com" {
specified, all
views are dumped.
</p></dd>
+<dt><span class="term"><strong class="userinput"><code>secroots
+ [<span class="optional"><em class="replaceable"><code>view ...</code></em></span>]</code></strong></span></dt>
+<dd><p>
+ Dump the server's security roots to the secroots
+ file for the specified views. If no view is
+ specified, security roots for all
+ views are dumped.
+ </p></dd>
<dt><span class="term"><strong class="userinput"><code>stop [<span class="optional">-p</span>]</code></strong></span></dt>
<dd><p>
Stop the server, making sure any recent changes
@@ -599,6 +670,57 @@ zone "eng.example.com" {
set to <strong class="userinput"><code>yes</code></strong> to be effective.
It defaults to enabled.
</p></dd>
+<dt><span class="term"><strong class="userinput"><code>addzone
+ <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]
+ <em class="replaceable"><code>configuration</code></em>
+ </code></strong></span></dt>
+<dd>
+<p>
+ Add a zone while the server is running. This
+ command requires the
+ <span><strong class="command">allow-new-zones</strong></span> option to be set
+ to <strong class="userinput"><code>yes</code></strong>. The
+ <em class="replaceable"><code>configuration</code></em> string
+ specified on the command line is the zone
+ configuration text that would ordinarily be
+ placed in <code class="filename">named.conf</code>.
+ </p>
+<p>
+ The configuration is saved in a file called
+ <code class="filename"><em class="replaceable"><code>hash</code></em>.nzf</code>,
+ where <em class="replaceable"><code>hash</code></em> is a
+ cryptographic hash generated from the name of
+ the view. When <span><strong class="command">named</strong></span> is
+ restarted, the file will be loaded into the view
+ configuration, so that zones that were added
+ can persist after a restart.
+ </p>
+<p>
+ This sample <span><strong class="command">addzone</strong></span> command
+ would add the zone <code class="literal">example.com</code>
+ to the default view:
+ </p>
+<p>
+<code class="prompt">$ </code><strong class="userinput"><code>rndc addzone example.com '{ type master; file "example.com.db"; };'</code></strong>
+ </p>
+<p>
+ (Note the brackets and semi-colon around the zone
+ configuration text.)
+ </p>
+</dd>
+<dt><span class="term"><strong class="userinput"><code>delzone
+ <em class="replaceable"><code>zone</code></em>
+ [<span class="optional"><em class="replaceable"><code>class</code></em>
+ [<span class="optional"><em class="replaceable"><code>view</code></em></span>]</span>]
+ </code></strong></span></dt>
+<dd><p>
+ Delete a zone while the server is running.
+ Only zones that were originally added via
+ <span><strong class="command">rndc addzone</strong></span> can be deleted
+ in this matter.
+ </p></dd>
</dl></div>
<p>
A configuration file is required, since all
@@ -699,7 +821,8 @@ zone "eng.example.com" {
<pre class="programlisting">
key rndc_key {
algorithm "hmac-md5";
- secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
+ secret
+ "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};
options {
default-server 127.0.0.1;
@@ -721,7 +844,8 @@ options {
</p>
<pre class="programlisting">
controls {
- inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
+ inet 127.0.0.1
+ allow { localhost; } keys { rndc_key; };
};
</pre>
<p>
@@ -749,7 +873,7 @@ controls {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2570006"></a>Signals</h3></div></div></div>
+<a name="id2570385"></a>Signals</h3></div></div></div>
<p>
Certain UNIX signals cause the name server to take specific
actions, as described in the following table. These signals can
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch04.html b/contrib/bind9/doc/arm/Bv9ARM.ch04.html
index 7b8a200..77b74cb 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch04.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch04.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch04.html,v 1.87.48.6 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch04.html,v 1.125.8.1.2.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -49,29 +49,59 @@
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dynamic_update">Dynamic Update</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#journal">The journal file</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#incremental_zone_transfers">Incremental Zone Transfers (IXFR)</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570492">Split DNS</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570510">Example split DNS setup</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570823">Split DNS</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570841">Example split DNS setup</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#tsig">TSIG</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571082">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571156">Copying the Shared Secret to Both Machines</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571166">Informing the Servers of the Key's Existence</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571203">Instructing the Server to Use the Key</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571260">TSIG Key Based Access Control</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571445">Errors</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571342">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571553">Copying the Shared Secret to Both Machines</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571563">Informing the Servers of the Key's Existence</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571600">Instructing the Server to Use the Key</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571657">TSIG Key Based Access Control</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571706">Errors</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571459">TKEY</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571576">SIG(0)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571720">TKEY</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2563987">SIG(0)</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#DNSSEC">DNSSEC</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571644">Generating Keys</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571792">Signing the Zone</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571873">Configuring Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2564055">Generating Keys</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572189">Signing the Zone</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572270">Configuring Servers</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572110">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dnssec.dynamic.zones">DNSSEC, Dynamic Zones, and Automatic Signing</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572172">Address Lookups Using AAAA Records</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572194">Address to Name Lookups Using Nibble Format</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607351">Converting from insecure to secure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563493">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563529">Fully automatic zone signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563611">Private-type records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563649">DNSKEY rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563661">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563763">Automatic key rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563789">NSEC3PARAM rollovers via UPDATE</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563799">Converting from NSEC to NSEC3</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563809">Converting from NSEC3 to NSEC</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563821">Converting from secure to insecure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563859">Periodic re-signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563868">NSEC3 and OPTOUT</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#rfc5011.support">Dynamic Trust Anchor Management</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607271">Validating Resolver</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607293">Authoritative Server</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#pkcs11">PKCS #11 (Cryptoki) support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609524">Prerequisites</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607678">Building BIND 9 with PKCS#11</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607842">PKCS #11 Tools</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607873">Using the HSM</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609709">Specifying the engine on the command line</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609755">Running named with automatic zone re-signing</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572490">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572757">Address Lookups Using AAAA Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572846">Address to Name Lookups Using Nibble Format</a></span></dt>
</dl></dd>
</dl>
</div>
@@ -113,14 +143,25 @@
</p>
<p>
Dynamic update is enabled by including an
- <span><strong class="command">allow-update</strong></span> or <span><strong class="command">update-policy</strong></span>
- clause in the <span><strong class="command">zone</strong></span> statement. The
- <span><strong class="command">tkey-gssapi-credential</strong></span> and
- <span><strong class="command">tkey-domain</strong></span> clauses in the
- <span><strong class="command">options</strong></span> statement enable the
- server to negotiate keys that can be matched against those
- in <span><strong class="command">update-policy</strong></span> or
- <span><strong class="command">allow-update</strong></span>.
+ <span><strong class="command">allow-update</strong></span> or an <span><strong class="command">update-policy</strong></span>
+ clause in the <span><strong class="command">zone</strong></span> statement.
+ </p>
+<p>
+ If the zone's <span><strong class="command">update-policy</strong></span> is set to
+ <strong class="userinput"><code>local</code></strong>, updates to the zone
+ will be permitted for the key <code class="varname">local-ddns</code>,
+ which will be generated by <span><strong class="command">named</strong></span> at startup.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for more details.
+ </p>
+<p>
+ Dynamic updates using Kerberos signed requests can be made
+ using the TKEY/GSS protocol by setting either the
+ <span><strong class="command">tkey-gssapi-keytab</strong></span> option, or alternatively
+ by setting both the <span><strong class="command">tkey-gssapi-credential</strong></span>
+ and <span><strong class="command">tkey-domain</strong></span> options. Once enabled,
+ Kerberos signed requests will be matched against the update
+ policies for the zone, using the Kerberos principal as the
+ signer for the request.
</p>
<p>
Updating of secure zones (zones using DNSSEC) follows RFC
@@ -215,7 +256,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2570492"></a>Split DNS</h2></div></div></div>
+<a name="id2570823"></a>Split DNS</h2></div></div></div>
<p>
Setting up different views, or visibility, of the DNS space to
internal and external resolvers is usually referred to as a
@@ -245,7 +286,7 @@
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2570510"></a>Example split DNS setup</h3></div></div></div>
+<a name="id2570841"></a>Example split DNS setup</h3></div></div></div>
<p>
Let's say a company named <span class="emphasis"><em>Example, Inc.</em></span>
(<code class="literal">example.com</code>)
@@ -275,7 +316,7 @@
and <code class="filename">site2.example.com</code>, to the servers
in the
DMZ. These internal servers will have complete sets of information
- for <code class="filename">site1.example.com</code>, <code class="filename">site2.example.com</code>,<span class="emphasis"><em></em></span> <code class="filename">site1.internal</code>,
+ for <code class="filename">site1.example.com</code>, <code class="filename">site2.example.com</code>, <code class="filename">site1.internal</code>,
and <code class="filename">site2.internal</code>.
</p>
<p>
@@ -373,26 +414,32 @@ options {
...
...
forward only;
- forwarders { // forward to external servers
+ // forward to external servers
+ forwarders {
<code class="varname">bastion-ips-go-here</code>;
};
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { internals; externals; }; // restrict query access
- allow-recursion { internals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // restrict query access
+ allow-query { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; };
...
...
};
-zone "site1.example.com" { // sample master zone
+// sample master zone
+zone "site1.example.com" {
type master;
file "m/site1.example.com";
- forwarders { }; // do normal iterative
- // resolution (do not forward)
+ // do normal iterative resolution (do not forward)
+ forwarders { };
allow-query { internals; externals; };
allow-transfer { internals; };
};
-zone "site2.example.com" { // sample slave zone
+// sample slave zone
+zone "site2.example.com" {
type slave;
file "s/site2.example.com";
masters { 172.16.72.3; };
@@ -429,15 +476,20 @@ acl externals { bastion-ips-go-here; };
options {
...
...
- allow-transfer { none; }; // sample allow-transfer (no one)
- allow-query { any; }; // default query access
- allow-query-cache { internals; externals; }; // restrict cache access
- allow-recursion { internals; externals; }; // restrict recursion
+ // sample allow-transfer (no one)
+ allow-transfer { none; };
+ // default query access
+ allow-query { any; };
+ // restrict cache access
+ allow-query-cache { internals; externals; };
+ // restrict recursion
+ allow-recursion { internals; externals; };
...
...
};
-zone "site1.example.com" { // sample slave zone
+// sample slave zone
+zone "site1.example.com" {
type master;
file "m/site1.foo.com";
allow-transfer { internals; externals; };
@@ -491,7 +543,7 @@ nameserver 172.16.72.4
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571082"></a>Generate Shared Keys for Each Pair of Hosts</h3></div></div></div>
+<a name="id2571342"></a>Generate Shared Keys for Each Pair of Hosts</h3></div></div></div>
<p>
A shared secret is generated to be shared between <span class="emphasis"><em>host1</em></span> and <span class="emphasis"><em>host2</em></span>.
An arbitrary key name is chosen: "host1-host2.". The key name must
@@ -499,7 +551,7 @@ nameserver 172.16.72.4
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2571099"></a>Automatic Generation</h4></div></div></div>
+<a name="id2571360"></a>Automatic Generation</h4></div></div></div>
<p>
The following command will generate a 128-bit (16 byte) HMAC-SHA256
key as described above. Longer keys are better, but shorter keys
@@ -523,7 +575,7 @@ nameserver 172.16.72.4
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2571138"></a>Manual Generation</h4></div></div></div>
+<a name="id2571398"></a>Manual Generation</h4></div></div></div>
<p>
The shared secret is simply a random sequence of bits, encoded
in base-64. Most ASCII strings are valid base-64 strings (assuming
@@ -538,7 +590,7 @@ nameserver 172.16.72.4
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571156"></a>Copying the Shared Secret to Both Machines</h3></div></div></div>
+<a name="id2571553"></a>Copying the Shared Secret to Both Machines</h3></div></div></div>
<p>
This is beyond the scope of DNS. A secure transport mechanism
should be used. This could be secure FTP, ssh, telephone, etc.
@@ -546,7 +598,7 @@ nameserver 172.16.72.4
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571166"></a>Informing the Servers of the Key's Existence</h3></div></div></div>
+<a name="id2571563"></a>Informing the Servers of the Key's Existence</h3></div></div></div>
<p>
Imagine <span class="emphasis"><em>host1</em></span> and <span class="emphasis"><em>host 2</em></span>
are
@@ -573,7 +625,7 @@ key host1-host2. {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571203"></a>Instructing the Server to Use the Key</h3></div></div></div>
+<a name="id2571600"></a>Instructing the Server to Use the Key</h3></div></div></div>
<p>
Since keys are shared between two hosts only, the server must
be told when keys are to be used. The following is added to the <code class="filename">named.conf</code> file
@@ -605,7 +657,7 @@ server 10.1.2.3 {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571260"></a>TSIG Key Based Access Control</h3></div></div></div>
+<a name="id2571657"></a>TSIG Key Based Access Control</h3></div></div></div>
<p>
<acronym class="acronym">BIND</acronym> allows IP addresses and ranges
to be specified in ACL
@@ -626,14 +678,13 @@ allow-update { key host1-host2. ;};
was signed by a key named "<span><strong class="command">host1-host2.</strong></span>".
</p>
<p>
- You may want to read about the more powerful
- <span><strong class="command">update-policy</strong></span> statement in
- <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a>.
+ See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a> for a discussion of
+ the more flexible <span><strong class="command">update-policy</strong></span> statement.
</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571445"></a>Errors</h3></div></div></div>
+<a name="id2571706"></a>Errors</h3></div></div></div>
<p>
The processing of TSIG signed messages can result in
several errors. If a signed message is sent to a non-TSIG aware
@@ -659,7 +710,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2571459"></a>TKEY</h2></div></div></div>
+<a name="id2571720"></a>TKEY</h2></div></div></div>
<p><span><strong class="command">TKEY</strong></span>
is a mechanism for automatically generating a shared secret
between two hosts. There are several "modes" of
@@ -695,7 +746,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2571576"></a>SIG(0)</h2></div></div></div>
+<a name="id2563987"></a>SIG(0)</h2></div></div></div>
<p>
<acronym class="acronym">BIND</acronym> 9 partially supports DNSSEC SIG(0)
transaction signatures as specified in RFC 2535 and RFC 2931.
@@ -756,7 +807,7 @@ allow-update { key host1-host2. ;};
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571644"></a>Generating Keys</h3></div></div></div>
+<a name="id2564055"></a>Generating Keys</h3></div></div></div>
<p>
The <span><strong class="command">dnssec-keygen</strong></span> program is used to
generate keys.
@@ -812,7 +863,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571792"></a>Signing the Zone</h3></div></div></div>
+<a name="id2572189"></a>Signing the Zone</h3></div></div></div>
<p>
The <span><strong class="command">dnssec-signzone</strong></span> program is used
to sign a zone.
@@ -854,7 +905,7 @@ allow-update { key host1-host2. ;};
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2571873"></a>Configuring Servers</h3></div></div></div>
+<a name="id2572270"></a>Configuring Servers</h3></div></div></div>
<p>
To enable <span><strong class="command">named</strong></span> to respond appropriately
to DNS requests from DNSSEC aware clients,
@@ -863,12 +914,22 @@ allow-update { key host1-host2. ;};
</p>
<p>
To enable <span><strong class="command">named</strong></span> to validate answers from
- other servers, the <span><strong class="command">dnssec-enable</strong></span> and
- <span><strong class="command">dnssec-validation</strong></span> options must both be
- set to yes (the default setting in <acronym class="acronym">BIND</acronym> 9.5
- and later), and at least one trust anchor must be configured
- with a <span><strong class="command">trusted-keys</strong></span> statement in
- <code class="filename">named.conf</code>.
+ other servers, the <span><strong class="command">dnssec-enable</strong></span> option
+ must be set to <strong class="userinput"><code>yes</code></strong>, and the
+ <span><strong class="command">dnssec-validation</strong></span> options must be set to
+ <strong class="userinput"><code>yes</code></strong> or <strong class="userinput"><code>auto</code></strong>.
+ </p>
+<p>
+ If <span><strong class="command">dnssec-validation</strong></span> is set to
+ <strong class="userinput"><code>auto</code></strong>, then a default
+ trust anchor for the DNS root zone will be used.
+ If it is set to <strong class="userinput"><code>yes</code></strong>, however,
+ then at least one trust anchor must be configured
+ with a <span><strong class="command">trusted-keys</strong></span> or
+ <span><strong class="command">managed-keys</strong></span> statement in
+ <code class="filename">named.conf</code>, or DNSSEC validation
+ will not occur. The default setting is
+ <strong class="userinput"><code>yes</code></strong>.
</p>
<p>
<span><strong class="command">trusted-keys</strong></span> are copies of DNSKEY RRs
@@ -879,7 +940,13 @@ allow-update { key host1-host2. ;};
to validated the DNSKEY RRset that they are from.
</p>
<p>
- <span><strong class="command">trusted-keys</strong></span> are described in more detail
+ <span><strong class="command">managed-keys</strong></span> are trusted keys which are
+ automatically kept up to date via RFC 5011 trust anchor
+ maintenance.
+ </p>
+<p>
+ <span><strong class="command">trusted-keys</strong></span> and
+ <span><strong class="command">managed-keys</strong></span> are described in more detail
later in this document.
</p>
<p>
@@ -890,44 +957,58 @@ allow-update { key host1-host2. ;};
</p>
<p>
After DNSSEC gets established, a typical DNSSEC configuration
- will look something like the following. It has a one or
+ will look something like the following. It has one or
more public keys for the root. This allows answers from
outside the organization to be validated. It will also
have several keys for parts of the namespace the organization
- controls. These are here to ensure that <span><strong class="command">named</strong></span> is immune
- to compromises in the DNSSEC components of the security
+ controls. These are here to ensure that <span><strong class="command">named</strong></span>
+ is immune to compromises in the DNSSEC components of the security
of parent zones.
</p>
<pre class="programlisting">
-trusted-keys {
-
+managed-keys {
/* Root Key */
-"." 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwSJxrGkxJWoZu6I7PzJu/
- E9gx4UC1zGAHlXKdE4zYIpRhaBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3
- zy2Xy4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYghf+6fElrmLkdaz
- MQ2OCnACR817DF4BBa7UR/beDHyp5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M
- /lUUVRbkeg1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq66gKodQj+M
- iA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ97S+LKUTpQcq27R7AT3/V5hRQxScI
- Nqwcz4jYqZD2fQdgxbcDTClU0CRBdiieyLMNzXG3";
+ "." initial-key 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwS
+ JxrGkxJWoZu6I7PzJu/E9gx4UC1zGAHlXKdE4zYIpRh
+ aBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3zy2Xy
+ 4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYg
+ hf+6fElrmLkdaz MQ2OCnACR817DF4BBa7UR/beDHyp
+ 5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M/lUUVRbke
+ g1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq
+ 66gKodQj+MiA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ
+ 97S+LKUTpQcq27R7AT3/V5hRQxScINqwcz4jYqZD2fQ
+ dgxbcDTClU0CRBdiieyLMNzXG3";
+};
-/* Key for our organization's forward zone */
-example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM65KbhTjrW1ZaARmPhEZZe
- 3Y9ifgEuq7vZ/zGZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb4JKUbb
- OTcM8pwXlj0EiX3oDFVmjHO444gLkBO UKUf/mC7HvfwYH/Be22GnC
- lrinKJp1Og4ywzO9WglMk7jbfW33gUKvirTHr25GL7STQUzBb5Usxt
- 8lgnyTUHs1t3JwCY5hKZ6CqFxmAVZP20igTixin/1LcrgX/KMEGd/b
- iuvF4qJCyduieHukuY3H4XMAcR+xia2 nIUPvm/oyWR8BW/hWdzOvn
- SCThlHf3xiYleDbt/o1OTQ09A0=";
+trusted-keys {
+ /* Key for our organization's forward zone */
+ example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM6
+ 5KbhTjrW1ZaARmPhEZZe3Y9ifgEuq7vZ/z
+ GZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb
+ 4JKUbbOTcM8pwXlj0EiX3oDFVmjHO444gL
+ kBOUKUf/mC7HvfwYH/Be22GnClrinKJp1O
+ g4ywzO9WglMk7jbfW33gUKvirTHr25GL7S
+ TQUzBb5Usxt8lgnyTUHs1t3JwCY5hKZ6Cq
+ FxmAVZP20igTixin/1LcrgX/KMEGd/biuv
+ F4qJCyduieHukuY3H4XMAcR+xia2nIUPvm
+ /oyWR8BW/hWdzOvnSCThlHf3xiYleDbt/o
+ 1OTQ09A0=";
-/* Key for our reverse zone. */
-2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwcxOdNax071L18QqZnQQQA
- VVr+iLhGTnNGp3HoWQLUIzKrJVZ3zggy3WwNT6kZo6c0
- tszYqbtvchmgQC8CzKojM/W16i6MG/ea fGU3siaOdS0
- yOI6BgPsw+YZdzlYMaIJGf4M4dyoKIhzdZyQ2bYQrjyQ
- 4LB0lC7aOnsMyYKHHYeRv PxjIQXmdqgOJGq+vsevG06
- zW+1xgYJh9rCIfnm1GX/KMgxLPG2vXTD/RnLX+D3T3UL
- 7HJYHJhAZD5L59VvjSPsZJHeDCUyWYrvPZesZDIRvhDD
- 52SKvbheeTJUm6EhkzytNN2SN96QRk8j/iI8ib";
+ /* Key for our reverse zone. */
+ 2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwc
+ xOdNax071L18QqZnQQQAVVr+i
+ LhGTnNGp3HoWQLUIzKrJVZ3zg
+ gy3WwNT6kZo6c0tszYqbtvchm
+ gQC8CzKojM/W16i6MG/eafGU3
+ siaOdS0yOI6BgPsw+YZdzlYMa
+ IJGf4M4dyoKIhzdZyQ2bYQrjy
+ Q4LB0lC7aOnsMyYKHHYeRvPxj
+ IQXmdqgOJGq+vsevG06zW+1xg
+ YJh9rCIfnm1GX/KMgxLPG2vXT
+ D/RnLX+D3T3UL7HJYHJhAZD5L
+ 59VvjSPsZJHeDCUyWYrvPZesZ
+ DIRvhDD52SKvbheeTJUm6Ehkz
+ ytNN2SN96QRk8j/iI8ib";
};
options {
@@ -979,7 +1060,698 @@ options {
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2572110"></a>IPv6 Support in <acronym class="acronym">BIND</acronym> 9</h2></div></div></div>
+<a name="dnssec.dynamic.zones"></a>DNSSEC, Dynamic Zones, and Automatic Signing</h2></div></div></div>
+<p>As of BIND 9.7.0 it is possible to change a dynamic zone
+ from insecure to signed and back again. A secure zone can use
+ either NSEC or NSEC3 chains.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2607351"></a>Converting from insecure to secure</h3></div></div></div></div>
+<p>Changing a zone from insecure to secure can be done in two
+ ways: using a dynamic DNS update, or the
+ <span><strong class="command">auto-dnssec</strong></span> zone option.</p>
+<p>For either method, you need to configure
+ <span><strong class="command">named</strong></span> so that it can see the
+ <code class="filename">K*</code> files which contain the public and private
+ parts of the keys that will be used to sign the zone. These files
+ will have been generated by
+ <span><strong class="command">dnssec-keygen</strong></span>. You can do this by placing them
+ in the key-directory, as specified in
+ <code class="filename">named.conf</code>:</p>
+<pre class="programlisting">
+ zone example.net {
+ type master;
+ update-policy local;
+ file "dynamic/example.net/example.net";
+ key-directory "dynamic/example.net";
+ };
+</pre>
+<p>If one KSK and one ZSK DNSKEY key have been generated, this
+ configuration will cause all records in the zone to be signed
+ with the ZSK, and the DNSKEY RRset to be signed with the KSK as
+ well. An NSEC chain will be generated as part of the initial
+ signing process.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563493"></a>Dynamic DNS update method</h3></div></div></div></div>
+<p>To insert the keys via dynamic update:</p>
+<pre class="screen">
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; send
+</pre>
+<p>While the update request will complete almost immediately,
+ the zone will not be completely signed until
+ <span><strong class="command">named</strong></span> has had time to walk the zone and
+ generate the NSEC and RRSIG records. The NSEC record at the apex
+ will be added last, to signal that there is a complete NSEC
+ chain.</p>
+<p>If you wish to sign using NSEC3 instead of NSEC, you should
+ add an NSEC3PARAM record to the initial update request. If you
+ wish the NSEC3 chain to have the OPTOUT bit set, set it in the
+ flags field of the NSEC3PARAM record.</p>
+<pre class="screen">
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; update add example.net NSEC3PARAM 1 1 100 1234567890
+ &gt; send
+</pre>
+<p>Again, this update request will complete almost
+ immediately; however, the record won't show up until
+ <span><strong class="command">named</strong></span> has had a chance to build/remove the
+ relevant chain. A private type record will be created to record
+ the state of the operation (see below for more details), and will
+ be removed once the operation completes.</p>
+<p>While the initial signing and NSEC/NSEC3 chain generation
+ is happening, other updates are possible as well.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563529"></a>Fully automatic zone signing</h3></div></div></div></div>
+<p>To enable automatic signing, add the
+ <span><strong class="command">auto-dnssec</strong></span> option to the zone statement in
+ <code class="filename">named.conf</code>.
+ <span><strong class="command">auto-dnssec</strong></span> has two possible arguments:
+ <code class="constant">allow</code> or
+ <code class="constant">maintain</code>.</p>
+<p>With
+ <span><strong class="command">auto-dnssec allow</strong></span>,
+ <span><strong class="command">named</strong></span> can search the key directory for keys
+ matching the zone, insert them into the zone, and use them to
+ sign the zone. It will do so only when it receives an
+ <span><strong class="command">rndc sign &lt;zonename&gt;</strong></span> or
+ <span><strong class="command">rndc loadkeys &lt;zonename&gt;</strong></span> command.</p>
+<p>
+
+ <span><strong class="command">auto-dnssec maintain</strong></span> includes the above
+ functionality, but will also automatically adjust the zone's
+ DNSKEY records on schedule according to the keys' timing metadata.
+ (See <a href="man.dnssec-keygen.html" title="dnssec-keygen"><span class="refentrytitle"><span class="application">dnssec-keygen</span></span>(8)</a> and
+ <a href="man.dnssec-settime.html" title="dnssec-settime"><span class="refentrytitle"><span class="application">dnssec-settime</span></span>(8)</a> for more information.)
+ If keys are present in the key directory the first time the zone
+ is loaded, it will be signed immediately, without waiting for an
+ <span><strong class="command">rndc sign</strong></span> or <span><strong class="command">rndc loadkeys</strong></span>
+ command. (Those commands can still be used when there are unscheduled
+ key changes, however.)
+ </p>
+<p>Using the
+ <span><strong class="command">auto-dnssec</strong></span> option requires the zone to be
+ configured to allow dynamic updates, by adding an
+ <span><strong class="command">allow-update</strong></span> or
+ <span><strong class="command">update-policy</strong></span> statement to the zone
+ configuration. If this has not been done, the configuration will
+ fail.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563611"></a>Private-type records</h3></div></div></div></div>
+<p>The state of the signing process is signaled by
+ private-type records (with a default type value of 65534). When
+ signing is complete, these records will have a nonzero value for
+ the final octet (for those records which have a nonzero initial
+ octet).</p>
+<p>The private type record format: If the first octet is
+ non-zero then the record indicates that the zone needs to be
+ signed with the key matching the record, or that all signatures
+ that match the record should be removed.</p>
+<p>
+ </p>
+<div class="literallayout"><p><br>
+<br>
+  algorithm (octet 1)<br>
+  key id in network order (octet 2 and 3)<br>
+  removal flag (octet 4)<br>
+  complete flag (octet 5)<br>
+</p></div>
+<p>
+ </p>
+<p>Only records flagged as "complete" can be removed via
+ dynamic update. Attempts to remove other private type records
+ will be silently ignored.</p>
+<p>If the first octet is zero (this is a reserved algorithm
+ number that should never appear in a DNSKEY record) then the
+ record indicates changes to the NSEC3 chains are in progress. The
+ rest of the record contains an NSEC3PARAM record. The flag field
+ tells what operation to perform based on the flag bits.</p>
+<p>
+ </p>
+<div class="literallayout"><p><br>
+<br>
+  0x01 OPTOUT<br>
+  0x80 CREATE<br>
+  0x40 REMOVE<br>
+  0x20 NONSEC<br>
+</p></div>
+<p>
+ </p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563649"></a>DNSKEY rollovers</h3></div></div></div></div>
+<p>As with insecure-to-secure conversions, rolling DNSSEC
+ keys can be done in two ways: using a dynamic DNS update, or the
+ <span><strong class="command">auto-dnssec</strong></span> zone option.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563661"></a>Dynamic DNS update method</h3></div></div></div></div>
+<p> To perform key rollovers via dynamic update, you need to add
+ the <code class="filename">K*</code> files for the new keys so that
+ <span><strong class="command">named</strong></span> can find them. You can then add the new
+ DNSKEY RRs via dynamic update.
+ <span><strong class="command">named</strong></span> will then cause the zone to be signed
+ with the new keys. When the signing is complete the private type
+ records will be updated so that the last octet is non
+ zero.</p>
+<p>If this is for a KSK you need to inform the parent and any
+ trust anchor repositories of the new KSK.</p>
+<p>You should then wait for the maximum TTL in the zone before
+ removing the old DNSKEY. If it is a KSK that is being updated,
+ you also need to wait for the DS RRset in the parent to be
+ updated and its TTL to expire. This ensures that all clients will
+ be able to verify at least one signature when you remove the old
+ DNSKEY.</p>
+<p>The old DNSKEY can be removed via UPDATE. Take care to
+ specify the correct key.
+ <span><strong class="command">named</strong></span> will clean out any signatures generated
+ by the old key after the update completes.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563763"></a>Automatic key rollovers</h3></div></div></div></div>
+<p>When a new key reaches its activation date (as set by
+ <span><strong class="command">dnssec-keygen</strong></span> or <span><strong class="command">dnssec-settime</strong></span>),
+ if the <span><strong class="command">auto-dnssec</strong></span> zone option is set to
+ <code class="constant">maintain</code>, <span><strong class="command">named</strong></span> will
+ automatically carry out the key rollover. If the key's algorithm
+ has not previously been used to sign the zone, then the zone will
+ be fully signed as quickly as possible. However, if the new key
+ is replacing an existing key of the same algorithm, then the
+ zone will be re-signed incrementally, with signatures from the
+ old key being replaced with signatures from the new key as their
+ signature validity periods expire. By default, this rollover
+ completes in 30 days, after which it will be safe to remove the
+ old key from the DNSKEY RRset.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563789"></a>NSEC3PARAM rollovers via UPDATE</h3></div></div></div></div>
+<p>Add the new NSEC3PARAM record via dynamic update. When the
+ new NSEC3 chain has been generated, the NSEC3PARAM flag field
+ will be zero. At this point you can remove the old NSEC3PARAM
+ record. The old chain will be removed after the update request
+ completes.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563799"></a>Converting from NSEC to NSEC3</h3></div></div></div></div>
+<p>To do this, you just need to add an NSEC3PARAM record. When
+ the conversion is complete, the NSEC chain will have been removed
+ and the NSEC3PARAM record will have a zero flag field. The NSEC3
+ chain will be generated before the NSEC chain is
+ destroyed.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563809"></a>Converting from NSEC3 to NSEC</h3></div></div></div></div>
+<p>To do this, use <span><strong class="command">nsupdate</strong></span> to
+ remove all NSEC3PARAM records with a zero flag
+ field. The NSEC chain will be generated before the NSEC3 chain is
+ removed.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563821"></a>Converting from secure to insecure</h3></div></div></div></div>
+<p>To convert a signed zone to unsigned using dynamic DNS,
+ delete all the DNSKEY records from the zone apex using
+ <span><strong class="command">nsupdate</strong></span>. All signatures, NSEC or NSEC3 chains,
+ and associated NSEC3PARAM records will be removed automatically.
+ This will take place after the update request completes.</p>
+<p> This requires the
+ <span><strong class="command">dnssec-secure-to-insecure</strong></span> option to be set to
+ <strong class="userinput"><code>yes</code></strong> in
+ <code class="filename">named.conf</code>.</p>
+<p>In addition, if the <span><strong class="command">auto-dnssec maintain</strong></span>
+ zone statement is used, it should be removed or changed to
+ <span><strong class="command">allow</strong></span> instead (or it will re-sign).
+ </p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563859"></a>Periodic re-signing</h3></div></div></div></div>
+<p>In any secure zone which supports dynamic updates, named
+ will periodically re-sign RRsets which have not been re-signed as
+ a result of some update action. The signature lifetimes will be
+ adjusted so as to spread the re-sign load over time rather than
+ all at once.</p>
+<div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title">
+<a name="id2563868"></a>NSEC3 and OPTOUT</h3></div></div></div></div>
+<p>
+ <span><strong class="command">named</strong></span> only supports creating new NSEC3 chains
+ where all the NSEC3 records in the zone have the same OPTOUT
+ state.
+ <span><strong class="command">named</strong></span> supports UPDATES to zones where the NSEC3
+ records in the chain have mixed OPTOUT state.
+ <span><strong class="command">named</strong></span> does not support changing the OPTOUT
+ state of an individual NSEC3 record, the entire chain needs to be
+ changed if the OPTOUT state of an individual NSEC3 needs to be
+ changed.</p>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="rfc5011.support"></a>Dynamic Trust Anchor Management</h2></div></div></div>
+<p>BIND 9.7.0 introduces support for RFC 5011, dynamic trust
+ anchor management. Using this feature allows
+ <span><strong class="command">named</strong></span> to keep track of changes to critical
+ DNSSEC keys without any need for the operator to make changes to
+ configuration files.</p>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607271"></a>Validating Resolver</h3></div></div></div>
+<p>To configure a validating resolver to use RFC 5011 to
+ maintain a trust anchor, configure the trust anchor using a
+ <span><strong class="command">managed-keys</strong></span> statement. Information about
+ this can be found in
+ <a href="Bv9ARM.ch06.html#managed-keys" title="managed-keys Statement Definition
+ and Usage">the section called &#8220;<span><strong class="command">managed-keys</strong></span> Statement Definition
+ and Usage&#8221;</a>.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607293"></a>Authoritative Server</h3></div></div></div>
+<p>To set up an authoritative zone for RFC 5011 trust anchor
+ maintenance, generate two (or more) key signing keys (KSKs) for
+ the zone. Sign the zone with one of them; this is the "active"
+ KSK. All KSK's which do not sign the zone are "stand-by"
+ keys.</p>
+<p>Any validating resolver which is configured to use the
+ active KSK as an RFC 5011-managed trust anchor will take note
+ of the stand-by KSKs in the zone's DNSKEY RRset, and store them
+ for future reference. The resolver will recheck the zone
+ periodically, and after 30 days, if the new key is still there,
+ then the key will be accepted by the resolver as a valid trust
+ anchor for the zone. Any time after this 30-day acceptance
+ timer has completed, the active KSK can be revoked, and the
+ zone can be "rolled over" to the newly accepted key.</p>
+<p>The easiest way to place a stand-by key in a zone is to
+ use the "smart signing" features of
+ <span><strong class="command">dnssec-keygen</strong></span> and
+ <span><strong class="command">dnssec-signzone</strong></span>. If a key with a publication
+ date in the past, but an activation date which is unset or in
+ the future, "
+ <span><strong class="command">dnssec-signzone -S</strong></span>" will include the DNSKEY
+ record in the zone, but will not sign with it:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-keygen -K keys -f KSK -P now -A now+2y example.net</code></strong>
+$ <strong class="userinput"><code>dnssec-signzone -S -K keys example.net</code></strong>
+</pre>
+<p>To revoke a key, the new command
+ <span><strong class="command">dnssec-revoke</strong></span> has been added. This adds the
+ REVOKED bit to the key flags and re-generates the
+ <code class="filename">K*.key</code> and
+ <code class="filename">K*.private</code> files.</p>
+<p>After revoking the active key, the zone must be signed
+ with both the revoked KSK and the new active KSK. (Smart
+ signing takes care of this automatically.)</p>
+<p>Once a key has been revoked and used to sign the DNSKEY
+ RRset in which it appears, that key will never again be
+ accepted as a valid trust anchor by the resolver. However,
+ validation can proceed using the new active key (which had been
+ accepted by the resolver when it was a stand-by key).</p>
+<p>See RFC 5011 for more details on key rollover
+ scenarios.</p>
+<p>When a key has been revoked, its key ID changes,
+ increasing by 128, and wrapping around at 65535. So, for
+ example, the key "<code class="filename">Kexample.com.+005+10000</code>" becomes
+ "<code class="filename">Kexample.com.+005+10128</code>".</p>
+<p>If two keys have ID's exactly 128 apart, and one is
+ revoked, then the two key ID's will collide, causing several
+ problems. To prevent this,
+ <span><strong class="command">dnssec-keygen</strong></span> will not generate a new key if
+ another key is present which may collide. This checking will
+ only occur if the new keys are written to the same directory
+ which holds all other keys in use for that zone.</p>
+<p>Older versions of BIND 9 did not have this precaution.
+ Exercise caution if using key revocation on keys that were
+ generated by previous releases, or if using keys stored in
+ multiple directories or on multiple machines.</p>
+<p>It is expected that a future release of BIND 9 will
+ address this problem in a different way, by storing revoked
+ keys with their original unrevoked key ID's.</p>
+</div>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="pkcs11"></a>PKCS #11 (Cryptoki) support</h2></div></div></div>
+<p>PKCS #11 (Public Key Cryptography Standard #11) defines a
+ platform- independent API for the control of hardware security
+ modules (HSMs) and other cryptographic support devices.</p>
+<p>BIND 9 is known to work with two HSMs: The Sun SCA 6000
+ cryptographic acceleration board, tested under Solaris x86, and
+ the AEP Keyper network-attached key storage device, tested with
+ Debian Linux, Solaris x86 and Windows Server 2003.</p>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609524"></a>Prerequisites</h3></div></div></div>
+<p>See the HSM vendor documentation for information about
+ installing, initializing, testing and troubleshooting the
+ HSM.</p>
+<p>BIND 9 uses OpenSSL for cryptography, but stock OpenSSL
+ does not yet fully support PKCS #11. However, a PKCS #11 engine
+ for OpenSSL is available from the OpenSolaris project. It has
+ been modified by ISC to work with with BIND 9, and to provide
+ new features such as PIN management and key by
+ reference.</p>
+<p>The patched OpenSSL depends on a "PKCS #11 provider".
+ This is a shared library object, providing a low-level PKCS #11
+ interface to the HSM hardware. It is dynamically loaded by
+ OpenSSL at runtime. The PKCS #11 provider comes from the HSM
+ vendor, and and is specific to the HSM to be controlled.</p>
+<p>There are two "flavors" of PKCS #11 support provided by
+ the patched OpenSSL, one of which must be chosen at
+ configuration time. The correct choice depends on the HSM
+ hardware:</p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>Use 'crypto-accelerator' with HSMs that have hardware
+ cryptographic acceleration features, such as the SCA 6000
+ board. This causes OpenSSL to run all supported
+ cryptographic operations in the HSM.</p></li>
+<li><p>Use 'sign-only' with HSMs that are designed to
+ function primarily as secure key storage devices, but lack
+ hardware acceleration. These devices are highly secure, but
+ are not necessarily any faster at cryptography than the
+ system CPU &#8212; often, they are slower. It is therefore
+ most efficient to use them only for those cryptographic
+ functions that require access to the secured private key,
+ such as zone signing, and to use the system CPU for all
+ other computationally-intensive operations. The AEP Keyper
+ is an example of such a device.</p></li>
+</ul></div>
+<p>The modified OpenSSL code is included in the BIND 9.7.0
+ release, in the form of a context diff against the latest OpenSSL.
+ </p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ The latest OpenSSL version at the time of the BIND release
+ is 0.9.8l.
+ ISC will provide an updated patch as new versions of OpenSSL
+ are released. The version number in the following examples
+ is expected to change.</div>
+<p>
+ Before building BIND 9 with PKCS #11 support, it will be
+ necessary to build OpenSSL with this patch in place and inform
+ it of the path to the HSM-specific PKCS #11 provider
+ library.</p>
+<p>Obtain OpenSSL 0.9.8l:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>wget <a href="" target="_top">http://www.openssl.org/source/openssl-0.9.8l.tar.gz</a></code></strong>
+</pre>
+<p>Extract the tarball:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>tar zxf openssl-0.9.8l.tar.gz</code></strong>
+</pre>
+<p>Apply the patch from the BIND 9 release:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>patch -p1 -d openssl-0.9.8l \
+ &lt; bind-9.7.0/bin/pkcs11/openssl-0.9.8l-patch</code></strong>
+</pre>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>(Note that the patch file may not be compatible with the
+ "patch" utility on all operating systems. You may need to
+ install GNU patch.)</div>
+<p>When building OpenSSL, place it in a non-standard
+ location so that it does not interfere with OpenSSL libraries
+ elsewhere on the system. In the following examples, we choose
+ to install into "/opt/pkcs11/usr". We will use this location
+ when we configure BIND 9.</p>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607504"></a>Building OpenSSL for the AEP Keyper on Linux</h4></div></div></div>
+<p>The AEP Keyper is a highly secure key storage device,
+ but does not provide hardware cryptographic acceleration. It
+ can carry out cryptographic operations, but it is probably
+ slower than your system's CPU. Therefore, we choose the
+ 'sign-only' flavor when building OpenSSL.</p>
+<p>The Keyper-specific PKCS #11 provider library is
+ delivered with the Keyper software. In this example, we place
+ it /opt/pkcs11/usr/lib:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so</code></strong>
+</pre>
+<p>This library is only available for Linux as a 32-bit
+ binary. If we are compiling on a 64-bit Linux system, it is
+ necessary to force a 32-bit build, by specifying -m32 in the
+ build options.</p>
+<p>Finally, the Keyper library requires threads, so we
+ must specify -pthread.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd openssl-0.9.8l</code></strong>
+$ <strong class="userinput"><code>./Configure linux-generic32 -m32 -pthread \
+ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \
+ --pk11-flavor=sign-only \
+ --prefix=/opt/pkcs11/usr</code></strong>
+</pre>
+<p>After configuring, run "<span><strong class="command">make</strong></span>"
+ and "<span><strong class="command">make test</strong></span>". If "<span><strong class="command">make
+ test</strong></span>" fails with "pthread_atfork() not found", you forgot to
+ add the -pthread above.</p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607573"></a>Building OpenSSL for the SCA 6000 on Solaris</h4></div></div></div>
+<p>The SCA-6000 PKCS #11 provider is installed as a system
+ library, libpkcs11. It is a true crypto accelerator, up to 4
+ times faster than any CPU, so the flavor shall be
+ 'crypto-accelerator'.</p>
+<p>In this example, we are building on Solaris x86 on an
+ AMD64 system.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd openssl-0.9.8l</code></strong>
+$ <strong class="userinput"><code>./Configure solaris64-x86_64-cc \
+ --pk11-libname=/usr/lib/64/libpkcs11.so \
+ --pk11-flavor=crypto-accelerator \
+ --prefix=/opt/pkcs11/usr</code></strong>
+</pre>
+<p>(For a 32-bit build, use "solaris-x86-cc" and
+ /usr/lib/libpkcs11.so.)</p>
+<p>After configuring, run
+ <span><strong class="command">make</strong></span> and
+ <span><strong class="command">make test</strong></span>.</p>
+<p>Once you have built OpenSSL, run
+ "<span><strong class="command">apps/openssl engine pkcs11</strong></span>" to confirm
+ that PKCS #11 support was compiled in correctly. The output
+ should be one of the following lines, depending on the flavor
+ selected:</p>
+<pre class="screen">
+ (pkcs11) PKCS #11 engine support (sign only)
+</pre>
+<p>Or:</p>
+<pre class="screen">
+ (pkcs11) PKCS #11 engine support (crypto accelerator)
+</pre>
+<p>Next, run
+ "<span><strong class="command">apps/openssl engine pkcs11 -t</strong></span>". This will
+ attempt to initialize the PKCS #11 engine. If it is able to
+ do so successfully, it will report
+ &#8220;<span class="quote"><code class="literal">[ available ]</code></span>&#8221;.</p>
+<p>If the output is correct, run
+ "<span><strong class="command">make install</strong></span>" which will install the
+ modified OpenSSL suite to
+ <code class="filename">/opt/pkcs11/usr</code>.</p>
+</div>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607678"></a>Building BIND 9 with PKCS#11</h3></div></div></div>
+<p>When building BIND 9, the location of the custom-built
+ OpenSSL library must be specified via configure.</p>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607687"></a>Configuring BIND 9 for Linux</h4></div></div></div>
+<p>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</p>
+<p>The PKCS #11 library for the AEP Keyper is currently
+ only available as a 32-bit binary. If we are building on a
+ 64-bit host, we must force a 32-bit build by adding "-m32" to
+ the CC options on the "configure" command line.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd ../bind-9.7.0</code></strong>
+$ <strong class="userinput"><code>./configure CC="gcc -m32" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so</code></strong>
+</pre>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2607786"></a>Configuring BIND 9 for Solaris</h4></div></div></div>
+<p>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</p>
+<pre class="screen">
+$ <strong class="userinput"><code>cd ../bind-9.7.0</code></strong>
+$ <strong class="userinput"><code>./configure CC="cc -xarch=amd64" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/usr/lib/64/libpkcs11.so</code></strong>
+</pre>
+<p>(For a 32-bit build, omit CC="cc -xarch=amd64".)</p>
+<p>If configure complains about OpenSSL not working, you
+ may have a 32/64-bit architecture mismatch. Or, you may have
+ incorrectly specified the path to OpenSSL (it should be the
+ same as the --prefix argument to the OpenSSL
+ Configure).</p>
+</div>
+<p>After configuring, run
+ "<span><strong class="command">make</strong></span>",
+ "<span><strong class="command">make test</strong></span>" and
+ "<span><strong class="command">make install</strong></span>".</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607842"></a>PKCS #11 Tools</h3></div></div></div>
+<p>BIND 9 includes a minimal set of tools to operate the
+ HSM, including
+ <span><strong class="command">pkcs11-keygen</strong></span> to generate a new key pair
+ within the HSM,
+ <span><strong class="command">pkcs11-list</strong></span> to list objects currently
+ available, and
+ <span><strong class="command">pkcs11-destroy</strong></span> to remove objects.</p>
+<p>In UNIX/Linux builds, these tools are built only if BIND
+ 9 is configured with the --with-pkcs11 option. (NOTE: If
+ --with-pkcs11 is set to "yes", rather than to the path of the
+ PKCS #11 provider, then the tools will be built but the
+ provider will be left undefined. Use the -m option or the
+ PKCS11_PROVIDER environment variable to specify the path to the
+ provider.)</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2607873"></a>Using the HSM</h3></div></div></div>
+<p>First, we must set up the runtime environment so the
+ OpenSSL and PKCS #11 libraries can be loaded:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>export LD_LIBRARY_PATH=/opt/pkcs11/usr/lib:${LD_LIBRARY_PATH}</code></strong>
+</pre>
+<p>When operating an AEP Keyper, it is also necessary to
+ specify the location of the "machine" file, which stores
+ information about the Keyper for use by PKCS #11 provider
+ library. If the machine file is in
+ <code class="filename">/opt/Keyper/PKCS11Provider/machine</code>,
+ use:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>export KEYPER_LIBRARY_PATH=/opt/Keyper/PKCS11Provider</code></strong>
+</pre>
+<p>These environment variables must be set whenever running
+ any tool that uses the HSM, including
+ <span><strong class="command">pkcs11-keygen</strong></span>,
+ <span><strong class="command">pkcs11-list</strong></span>,
+ <span><strong class="command">pkcs11-destroy</strong></span>,
+ <span><strong class="command">dnssec-keyfromlabel</strong></span>,
+ <span><strong class="command">dnssec-signzone</strong></span>,
+ <span><strong class="command">dnssec-keygen</strong></span>(which will use the HSM for
+ random number generation), and
+ <span><strong class="command">named</strong></span>.</p>
+<p>We can now create and use keys in the HSM. In this case,
+ we will create a 2048 bit key and give it the label
+ "sample-ksk":</p>
+<pre class="screen">
+$ <strong class="userinput"><code>pkcs11-keygen -b 2048 -l sample-ksk</code></strong>
+</pre>
+<p>To confirm that the key exists:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>pkcs11-list</code></strong>
+Enter PIN:
+object[0]: handle 2147483658 class 3 label[8] 'sample-ksk' id[0]
+object[1]: handle 2147483657 class 2 label[8] 'sample-ksk' id[0]
+</pre>
+<p>Before using this key to sign a zone, we must create a
+ pair of BIND 9 key files. The "dnssec-keyfromlabel" utility
+ does this. In this case, we will be using the HSM key
+ "sample-ksk" as the key-signing key for "example.net":</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-keyfromlabel -l sample-ksk -f KSK example.net</code></strong>
+</pre>
+<p>The resulting K*.key and K*.private files can now be used
+ to sign the zone. Unlike normal K* files, which contain both
+ public and private key data, these files will contain only the
+ public key data, plus an identifier for the private key which
+ remains stored within the HSM. The HSM handles signing with the
+ private key.</p>
+<p>If you wish to generate a second key in the HSM for use
+ as a zone-signing key, follow the same procedure above, using a
+ different keylabel, a smaller key size, and omitting "-f KSK"
+ from the dnssec-keyfromlabel arguments:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>pkcs11-keygen -b 1024 -l sample-zsk</code></strong>
+$ <strong class="userinput"><code>dnssec-keyfromlabel -l sample-zsk example.net</code></strong>
+</pre>
+<p>Alternatively, you may prefer to generate a conventional
+ on-disk key, using dnssec-keygen:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-keygen example.net</code></strong>
+</pre>
+<p>This provides less security than an HSM key, but since
+ HSMs can be slow or cumbersome to use for security reasons, it
+ may be more efficient to reserve HSM keys for use in the less
+ frequent key-signing operation. The zone-signing key can be
+ rolled more frequently, if you wish, to compensate for a
+ reduction in key security.</p>
+<p>Now you can sign the zone. (Note: If not using the -S
+ option to
+ <span><strong class="command">dnssec-signzone</strong></span>, it will be necessary to add
+ the contents of both
+ <code class="filename">K*.key</code> files to the zone master file before
+ signing it.)</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-signzone -S example.net</code></strong>
+Enter PIN:
+Verifying the zone using the following algorithms:
+NSEC3RSASHA1.
+Zone signing complete:
+Algorithm: NSEC3RSASHA1: ZSKs: 1, KSKs: 1 active, 0 revoked, 0 stand-by
+example.net.signed
+</pre>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609709"></a>Specifying the engine on the command line</h3></div></div></div>
+<p>The OpenSSL engine can be specified in
+ <span><strong class="command">named</strong></span> and all of the BIND
+ <span><strong class="command">dnssec-*</strong></span> tools by using the "-E
+ &lt;engine&gt;" command line option. If BIND 9 is built with
+ the --with-pkcs11 option, this option defaults to "pkcs11".
+ Specifying the engine will generally not be necessary unless
+ for some reason you wish to use a different OpenSSL
+ engine.</p>
+<p>If you wish to disable use of the "pkcs11" engine &#8212;
+ for troubleshooting purposes, or because the HSM is unavailable
+ &#8212; set the engine to the empty string. For example:</p>
+<pre class="screen">
+$ <strong class="userinput"><code>dnssec-signzone -E '' -S example.net</code></strong>
+</pre>
+<p>This causes
+ <span><strong class="command">dnssec-signzone</strong></span> to run as if it were compiled
+ without the --with-pkcs11 option.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609755"></a>Running named with automatic zone re-signing</h3></div></div></div>
+<p>If you want
+ <span><strong class="command">named</strong></span> to dynamically re-sign zones using HSM
+ keys, and/or to to sign new records inserted via nsupdate, then
+ named must have access to the HSM PIN. This can be accomplished
+ by placing the PIN into the openssl.cnf file (in the above
+ examples,
+ <code class="filename">/opt/pkcs11/usr/ssl/openssl.cnf</code>).</p>
+<p>The location of the openssl.cnf file can be overridden by
+ setting the OPENSSL_CONF environment variable before running
+ named.</p>
+<p>Sample openssl.cnf:</p>
+<pre class="programlisting">
+ openssl_conf = openssl_def
+ [ openssl_def ]
+ engines = engine_section
+ [ engine_section ]
+ pkcs11 = pkcs11_section
+ [ pkcs11_section ]
+ PIN = <em class="replaceable"><code>&lt;PLACE PIN HERE&gt;</code></em>
+</pre>
+<p>This will also allow the dnssec-* tools to access the HSM
+ without PIN entry. (The pkcs11-* tools access the HSM directly,
+ not via OpenSSL, so a PIN will still be required to use
+ them.)</p>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p>Placing the HSM's PIN in a text file in
+ this manner may reduce the security advantage of using an
+ HSM. Be sure this is what you want to do before configuring
+ OpenSSL in this way.</p>
+</div>
+</div>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="id2572490"></a>IPv6 Support in <acronym class="acronym">BIND</acronym> 9</h2></div></div></div>
<p>
<acronym class="acronym">BIND</acronym> 9 fully supports all currently
defined forms of IPv6 name to address and address to name
@@ -1017,7 +1789,7 @@ options {
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2572172"></a>Address Lookups Using AAAA Records</h3></div></div></div>
+<a name="id2572757"></a>Address Lookups Using AAAA Records</h3></div></div></div>
<p>
The IPv6 AAAA record is a parallel to the IPv4 A record,
and, unlike the deprecated A6 record, specifies the entire
@@ -1036,7 +1808,7 @@ host 3600 IN AAAA 2001:db8::1
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2572194"></a>Address to Name Lookups Using Nibble Format</h3></div></div></div>
+<a name="id2572846"></a>Address to Name Lookups Using Nibble Format</h3></div></div></div>
<p>
When looking up an address in nibble format, the address
components are simply reversed, just as in IPv4, and
@@ -1048,7 +1820,8 @@ host 3600 IN AAAA 2001:db8::1
</p>
<pre class="programlisting">
$ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
-1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR host.example.com.
+1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR (
+ host.example.com. )
</pre>
</div>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch05.html b/contrib/bind9/doc/arm/Bv9ARM.ch05.html
index b0339b4..3b60755 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch05.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch05.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch05.html,v 1.71.48.6 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch05.html,v 1.93 2011-01-05 01:14:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,13 +45,13 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572227">The Lightweight Resolver Library</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572880">The Lightweight Resolver Library</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch05.html#lwresd">Running a Resolver Daemon</a></span></dt>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2572227"></a>The Lightweight Resolver Library</h2></div></div></div>
+<a name="id2572880"></a>The Lightweight Resolver Library</h2></div></div></div>
<p>
Traditionally applications have been linked with a stub resolver
library that sends recursive DNS queries to a local caching name
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch06.html b/contrib/bind9/doc/arm/Bv9ARM.ch06.html
index d969e4b..3524348 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch06.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch06.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch06.html,v 1.201.14.21 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch06.html,v 1.275.8.1.2.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -48,55 +48,58 @@
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#configuration_file_elements">Configuration File Elements</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#address_match_lists">Address Match Lists</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573606">Comment Syntax</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574290">Comment Syntax</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#Configuration_File_Grammar">Configuration File Grammar</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574305"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574944"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#acl"><span><strong class="command">acl</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574494"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575133"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#controls_statement_definition_and_usage"><span><strong class="command">controls</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574923"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574940"><span><strong class="command">include</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575425"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575442"><span><strong class="command">include</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574964"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574987"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575078"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575204"><span><strong class="command">logging</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575465"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575489"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575648"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575842"><span><strong class="command">logging</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577401"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577475"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577539"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577582"><span><strong class="command">masters</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577841"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577982"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578046"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578090"><span><strong class="command">masters</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577597"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578105"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#options"><span><strong class="command">options</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_grammar"><span><strong class="command">server</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_definition_and_usage"><span><strong class="command">server</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#statschannels"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2586907"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589239"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587062"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587113"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#trusted-keys"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589379"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+ and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589494"><span><strong class="command">managed-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#managed-keys"><span><strong class="command">managed-keys</strong></span> Statement Definition
and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#view_statement_grammar"><span><strong class="command">view</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587195"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589851"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zone_statement_grammar"><span><strong class="command">zone</strong></span>
Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2588600"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591396"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2591216">Zone File</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2594660">Zone File</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#types_of_resource_records_and_when_to_use_them">Types of Resource Records and When to Use Them</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593378">Discussion of MX Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2596822">Discussion of MX Records</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#Setting_TTLs">Setting TTLs</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593993">Inverse Mapping in IPv4</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594188">Other Zone File Directives</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594461"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597574">Inverse Mapping in IPv4</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597701">Other Zone File Directives</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597974"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zonefile_format">Additional File Formats</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#statistics">BIND9 Statistics</a></span></dt>
@@ -193,6 +196,19 @@
<tr>
<td>
<p>
+ <code class="varname">namelist</code>
+ </p>
+ </td>
+<td>
+ <p>
+ A list of one or more <code class="varname">domain_name</code>
+ elements.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="varname">dotted_decimal</code>
</p>
</td>
@@ -461,7 +477,7 @@
<a name="address_match_lists"></a>Address Match Lists</h3></div></div></div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573372"></a>Syntax</h4></div></div></div>
+<a name="id2574056"></a>Syntax</h4></div></div></div>
<pre class="programlisting"><code class="varname">address_match_list</code> = address_match_list_element ;
[<span class="optional"> address_match_list_element; ... </span>]
<code class="varname">address_match_list_element</code> = [<span class="optional"> ! </span>] (ip_address [<span class="optional">/length</span>] |
@@ -470,7 +486,7 @@
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573468"></a>Definition and Usage</h4></div></div></div>
+<a name="id2574084"></a>Definition and Usage</h4></div></div></div>
<p>
Address match lists are primarily used to determine access
control for various server operations. They are also used in
@@ -554,7 +570,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2573606"></a>Comment Syntax</h3></div></div></div>
+<a name="id2574290"></a>Comment Syntax</h3></div></div></div>
<p>
The <acronym class="acronym">BIND</acronym> 9 comment syntax allows for
comments to appear
@@ -564,7 +580,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573621"></a>Syntax</h4></div></div></div>
+<a name="id2574305"></a>Syntax</h4></div></div></div>
<p>
</p>
<pre class="programlisting">/* This is a <acronym class="acronym">BIND</acronym> comment as in C */</pre>
@@ -573,13 +589,14 @@
<pre class="programlisting">// This is a <acronym class="acronym">BIND</acronym> comment as in C++</pre>
<p>
</p>
-<pre class="programlisting"># This is a <acronym class="acronym">BIND</acronym> comment as in common UNIX shells and perl</pre>
+<pre class="programlisting"># This is a <acronym class="acronym">BIND</acronym> comment as in common UNIX shells
+# and perl</pre>
<p>
</p>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2573651"></a>Definition and Usage</h4></div></div></div>
+<a name="id2574334"></a>Definition and Usage</h4></div></div></div>
<p>
Comments may appear anywhere that whitespace may appear in
a <acronym class="acronym">BIND</acronym> configuration file.
@@ -792,6 +809,17 @@
</tr>
<tr>
<td>
+ <p><span><strong class="command">managed-keys</strong></span></p>
+ </td>
+<td>
+ <p>
+ lists DNSSEC keys to be kept up to date
+ using RFC 5011 trust anchor maintenance.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
<p><span><strong class="command">view</strong></span></p>
</td>
<td>
@@ -820,7 +848,7 @@
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574305"></a><span><strong class="command">acl</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2574944"></a><span><strong class="command">acl</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">acl</strong></span> acl-name {
address_match_list
};
@@ -902,12 +930,14 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574494"></a><span><strong class="command">controls</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575133"></a><span><strong class="command">controls</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">controls</strong></span> {
- [ inet ( ip_addr | * ) [ port ip_port ] allow { <em class="replaceable"><code> address_match_list </code></em> }
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ allow { <em class="replaceable"><code> address_match_list </code></em> }
keys { <em class="replaceable"><code>key_list</code></em> }; ]
[ inet ...; ]
- [ unix <em class="replaceable"><code>path</code></em> perm <em class="replaceable"><code>number</code></em> owner <em class="replaceable"><code>number</code></em> group <em class="replaceable"><code>number</code></em> keys { <em class="replaceable"><code>key_list</code></em> }; ]
+ [ unix <em class="replaceable"><code>path</code></em> perm <em class="replaceable"><code>number</code></em> owner <em class="replaceable"><code>number</code></em> group <em class="replaceable"><code>number</code></em>
+ keys { <em class="replaceable"><code>key_list</code></em> }; ]
[ unix ...; ]
};
</pre>
@@ -1024,12 +1054,12 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574923"></a><span><strong class="command">include</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575425"></a><span><strong class="command">include</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">include</strong></span> <em class="replaceable"><code>filename</code></em>;</pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574940"></a><span><strong class="command">include</strong></span> Statement Definition and
+<a name="id2575442"></a><span><strong class="command">include</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p>
The <span><strong class="command">include</strong></span> statement inserts the
@@ -1044,7 +1074,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574964"></a><span><strong class="command">key</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575465"></a><span><strong class="command">key</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">key</strong></span> <em class="replaceable"><code>key_id</code></em> {
algorithm <em class="replaceable"><code>string</code></em>;
secret <em class="replaceable"><code>string</code></em>;
@@ -1053,7 +1083,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2574987"></a><span><strong class="command">key</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2575489"></a><span><strong class="command">key</strong></span> Statement Definition and Usage</h3></div></div></div>
<p>
The <span><strong class="command">key</strong></span> statement defines a shared
secret key for use with TSIG (see <a href="Bv9ARM.ch04.html#tsig" title="TSIG">the section called &#8220;TSIG&#8221;</a>)
@@ -1100,7 +1130,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2575078"></a><span><strong class="command">logging</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2575648"></a><span><strong class="command">logging</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">logging</strong></span> {
[ <span><strong class="command">channel</strong></span> <em class="replaceable"><code>channel_name</code></em> {
( <span><strong class="command">file</strong></span> <em class="replaceable"><code>path_name</code></em>
@@ -1124,7 +1154,7 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2575204"></a><span><strong class="command">logging</strong></span> Statement Definition and
+<a name="id2575842"></a><span><strong class="command">logging</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p>
The <span><strong class="command">logging</strong></span> statement configures a
@@ -1158,7 +1188,7 @@
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2575256"></a>The <span><strong class="command">channel</strong></span> Phrase</h4></div></div></div>
+<a name="id2575894"></a>The <span><strong class="command">channel</strong></span> Phrase</h4></div></div></div>
<p>
All log output goes to one or more <span class="emphasis"><em>channels</em></span>;
you can make as many of them as you want.
@@ -1342,32 +1372,30 @@ notrace</strong></span>. All debugging messages in the server have a debug
used is described in <a href="Bv9ARM.ch06.html#the_category_phrase" title="The category Phrase">the section called &#8220;The <span><strong class="command">category</strong></span> Phrase&#8221;</a>.
</p>
<pre class="programlisting">channel default_syslog {
- syslog daemon; // send to syslog's daemon
- // facility
- severity info; // only send priority info
- // and higher
-};
+ // send to syslog's daemon facility
+ syslog daemon;
+ // only send priority info and higher
+ severity info;
channel default_debug {
- file "named.run"; // write to named.run in
- // the working directory
- // Note: stderr is used instead
- // of "named.run"
- // if the server is started
- // with the '-f' option.
- severity dynamic; // log at the server's
- // current debug level
+ // write to named.run in the working directory
+ // Note: stderr is used instead of "named.run" if
+ // the server is started with the '-f' option.
+ file "named.run";
+ // log at the server's current debug level
+ severity dynamic;
};
channel default_stderr {
- stderr; // writes to stderr
- severity info; // only send priority info
- // and higher
+ // writes to stderr
+ stderr;
+ // only send priority info and higher
+ severity info;
};
channel null {
- null; // toss anything sent to
- // this channel
+ // toss anything sent to this channel
+ null;
};
</pre>
<p>
@@ -1610,12 +1638,14 @@ category notify { null; };
<p>
The query log entry reports the client's IP
address and port number, and the query name,
- class and type. It also reports whether the
+ class and type. Next it reports whether the
Recursion Desired flag was set (+ if set, -
if not set), if the query was signed (S),
- EDNS was in use (E), if DO (DNSSEC Ok) was
- set (D), or if CD (Checking Disabled) was set
- (C).
+ EDNS was in use (E), if TCP was used (T), if
+ DO (DNSSEC Ok) was set (D), or if CD (Checking
+ Disabled) was set (C). After this the
+ destination address the query was sent to is
+ reported.
</p>
<p>
@@ -1723,7 +1753,7 @@ category notify { null; };
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2576820"></a>The <span><strong class="command">query-errors</strong></span> Category</h4></div></div></div>
+<a name="id2577253"></a>The <span><strong class="command">query-errors</strong></span> Category</h4></div></div></div>
<p>
The <span><strong class="command">query-errors</strong></span> category is
specifically intended for debugging purposes: To identify
@@ -1754,7 +1784,15 @@ category notify { null; };
The log message will look like as follows:
</p>
<p>
- <code class="computeroutput">fetch completed at resolver.c:2970 for www.example.com/A in 30.000183: timed out/success [domain:example.com,referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,badresp:1,adberr:0,findfail:0,valfail:0]</code>
+
+ </p>
+<pre class="programlisting">
+fetch completed at resolver.c:2970 for www.example.com/A
+in 30.000183: timed out/success [domain:example.com,
+referral:2,restart:7,qrysent:8,timeout:5,lame:0,neterr:0,
+badresp:1,adberr:0,findfail:0,valfail:0]
+ </pre>
+<p>
</p>
<p>
The first part before the colon shows that a recursive
@@ -1943,13 +1981,14 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577401"></a><span><strong class="command">lwres</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2577841"></a><span><strong class="command">lwres</strong></span> Statement Grammar</h3></div></div></div>
<p>
This is the grammar of the <span><strong class="command">lwres</strong></span>
statement in the <code class="filename">named.conf</code> file:
</p>
<pre class="programlisting"><span><strong class="command">lwres</strong></span> {
- [<span class="optional"> listen-on { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> listen-on { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> view <em class="replaceable"><code>view_name</code></em>; </span>]
[<span class="optional"> search { <em class="replaceable"><code>domain_name</code></em> ; [<span class="optional"> <em class="replaceable"><code>domain_name</code></em> ; ... </span>] }; </span>]
[<span class="optional"> ndots <em class="replaceable"><code>number</code></em>; </span>]
@@ -1958,7 +1997,7 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577475"></a><span><strong class="command">lwres</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2577982"></a><span><strong class="command">lwres</strong></span> Statement Definition and Usage</h3></div></div></div>
<p>
The <span><strong class="command">lwres</strong></span> statement configures the
name
@@ -2009,14 +2048,15 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577539"></a><span><strong class="command">masters</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2578046"></a><span><strong class="command">masters</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting">
-<span><strong class="command">masters</strong></span> <em class="replaceable"><code>name</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] };
+<span><strong class="command">masters</strong></span> <em class="replaceable"><code>name</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> |
+ <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] };
</pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577582"></a><span><strong class="command">masters</strong></span> Statement Definition and
+<a name="id2578090"></a><span><strong class="command">masters</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p><span><strong class="command">masters</strong></span>
lists allow for a common set of masters to be easily used by
@@ -2025,23 +2065,27 @@ category notify { null; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2577597"></a><span><strong class="command">options</strong></span> Statement Grammar</h3></div></div></div>
+<a name="id2578105"></a><span><strong class="command">options</strong></span> Statement Grammar</h3></div></div></div>
<p>
This is the grammar of the <span><strong class="command">options</strong></span>
statement in the <code class="filename">named.conf</code> file:
</p>
<pre class="programlisting"><span><strong class="command">options</strong></span> {
+ [<span class="optional"> attach-cache <em class="replaceable"><code>cache_name</code></em>; </span>]
[<span class="optional"> version <em class="replaceable"><code>version_string</code></em>; </span>]
[<span class="optional"> hostname <em class="replaceable"><code>hostname_string</code></em>; </span>]
[<span class="optional"> server-id <em class="replaceable"><code>server_id_string</code></em>; </span>]
[<span class="optional"> directory <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> key-directory <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> managed-keys-directory <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> named-xfer <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> tkey-gssapi-keytab <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> tkey-gssapi-credential <em class="replaceable"><code>principal</code></em>; </span>]
[<span class="optional"> tkey-domain <em class="replaceable"><code>domainname</code></em>; </span>]
[<span class="optional"> tkey-dhkey <em class="replaceable"><code>key_name</code></em> <em class="replaceable"><code>key_tag</code></em>; </span>]
[<span class="optional"> cache-file <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> dump-file <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> bindkeys-file <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> memstatistics <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> memstatistics-file <em class="replaceable"><code>path_name</code></em>; </span>]
[<span class="optional"> pid-file <em class="replaceable"><code>path_name</code></em>; </span>]
@@ -2066,8 +2110,9 @@ category notify { null; };
[<span class="optional"> maintain-ixfr-base <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> ixfr-from-differences (<em class="replaceable"><code>yes_or_no</code></em> | <code class="constant">master</code> | <code class="constant">slave</code>); </span>]
[<span class="optional"> dnssec-enable <em class="replaceable"><code>yes_or_no</code></em>; </span>]
- [<span class="optional"> dnssec-validation <em class="replaceable"><code>yes_or_no</code></em>; </span>]
- [<span class="optional"> dnssec-lookaside <em class="replaceable"><code>domain</code></em> trust-anchor <em class="replaceable"><code>domain</code></em>; </span>]
+ [<span class="optional"> dnssec-validation (<em class="replaceable"><code>yes_or_no</code></em> | <code class="constant">auto</code>); </span>]
+ [<span class="optional"> dnssec-lookaside ( <em class="replaceable"><code>auto</code></em> |
+ <em class="replaceable"><code>domain</code></em> trust-anchor <em class="replaceable"><code>domain</code></em> ); </span>]
[<span class="optional"> dnssec-must-be-secure <em class="replaceable"><code>domain yes_or_no</code></em>; </span>]
[<span class="optional"> dnssec-accept-expired <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> forward ( <em class="replaceable"><code>only</code></em> | <em class="replaceable"><code>first</code></em> ); </span>]
@@ -2078,12 +2123,14 @@ category notify { null; };
... }; </span>]
[<span class="optional"> check-names ( <em class="replaceable"><code>master</code></em> | <em class="replaceable"><code>slave</code></em> | <em class="replaceable"><code>response</code></em> )
( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
+ [<span class="optional"> check-dup-records ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-mx ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-wildcard <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> check-integrity <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> check-mx-cname ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-srv-cname ( <em class="replaceable"><code>warn</code></em> | <em class="replaceable"><code>fail</code></em> | <em class="replaceable"><code>ignore</code></em> ); </span>]
[<span class="optional"> check-sibling <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> allow-new-zones { <em class="replaceable"><code>yes_or_no</code></em> }; </span>]
[<span class="optional"> allow-notify { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-query { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-query-on { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
@@ -2095,6 +2142,8 @@ category notify { null; };
[<span class="optional"> allow-update { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-update-forwarding { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> update-check-ksk <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-dnskey-kskonly <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-secure-to-insecure <em class="replaceable"><code>yes_or_no</code></em> ;</span>]
[<span class="optional"> try-tcp-refresh <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> allow-v6-synthesis { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> blackhole { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
@@ -2132,13 +2181,15 @@ category notify { null; };
[<span class="optional"> transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> alt-transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> use-alt-transfer-source <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> notify-delay <em class="replaceable"><code>seconds</code></em> ; </span>]
[<span class="optional"> notify-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-to-soa <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> max-ixfr-log-size <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> max-journal-size <em class="replaceable"><code>size_spec</code></em>; </span>]
[<span class="optional"> coresize <em class="replaceable"><code>size_spec</code></em> ; </span>]
@@ -2174,12 +2225,25 @@ category notify { null; };
[<span class="optional"> random-device <em class="replaceable"><code>path_name</code></em> ; </span>]
[<span class="optional"> max-cache-size <em class="replaceable"><code>size_spec</code></em> ; </span>]
[<span class="optional"> match-mapped-addresses <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> filter-aaaa-on-v4 ( <em class="replaceable"><code>yes_or_no</code></em> | <em class="replaceable"><code>break-dnssec</code></em> ); </span>]
+ [<span class="optional"> filter-aaaa { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> dns64 <em class="replaceable"><code>IPv6-prefix</code></em> {
+ [<span class="optional"> clients { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> mapped { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> exclude { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> suffix IPv6-address; </span>]
+ [<span class="optional"> recursive-only <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> break-dnssec <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ }; </span>];
+ [<span class="optional"> dns64-server <em class="replaceable"><code>name</code></em> </span>]
+ [<span class="optional"> dns64-contact <em class="replaceable"><code>name</code></em> </span>]
[<span class="optional"> preferred-glue ( <em class="replaceable"><code>A</code></em> | <em class="replaceable"><code>AAAA</code></em> | <em class="replaceable"><code>NONE</code></em> ); </span>]
[<span class="optional"> edns-udp-size <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> max-udp-size <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> root-delegation-only [<span class="optional"> exclude { <em class="replaceable"><code>namelist</code></em> } </span>] ; </span>]
[<span class="optional"> querylog <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> disable-algorithms <em class="replaceable"><code>domain</code></em> { <em class="replaceable"><code>algorithm</code></em>; [<span class="optional"> <em class="replaceable"><code>algorithm</code></em>; </span>] }; </span>]
+ [<span class="optional"> disable-algorithms <em class="replaceable"><code>domain</code></em> { <em class="replaceable"><code>algorithm</code></em>;
+ [<span class="optional"> <em class="replaceable"><code>algorithm</code></em>; </span>] }; </span>]
[<span class="optional"> acache-enable <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> acache-cleaning-interval <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> max-acache-size <em class="replaceable"><code>size_spec</code></em> ; </span>]
@@ -2192,6 +2256,10 @@ category notify { null; };
[<span class="optional"> disable-empty-zone <em class="replaceable"><code>zone_name</code></em> ; </span>]
[<span class="optional"> zero-no-soa-ttl <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> zero-no-soa-ttl-cache <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
+ [<span class="optional"> resolver-query-timeout <em class="replaceable"><code>number</code></em> ; </span>]
+ [<span class="optional"> deny-answer-addresses { <em class="replaceable"><code>address_match_list</code></em> } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];</span>]
+ [<span class="optional"> deny-answer-aliases { <em class="replaceable"><code>namelist</code></em> } [<span class="optional"> except-from { <em class="replaceable"><code>namelist</code></em> } </span>];</span>]
+ [<span class="optional"> response-policy { <em class="replaceable"><code>zone_name</code></em> [<span class="optional"> policy <em class="replaceable"><code>given</code></em> | <em class="replaceable"><code>no-op</code></em> | <em class="replaceable"><code>nxdomain</code></em> | <em class="replaceable"><code>nodata</code></em> | <em class="replaceable"><code>cname domain</code></em> </span>] ; } ; </span>]
};
</pre>
</div>
@@ -2209,6 +2277,91 @@ category notify { null; };
be used.
</p>
<div class="variablelist"><dl>
+<dt><span class="term"><span><strong class="command">attach-cache</strong></span></span></dt>
+<dd>
+<p>
+ Allows multiple views to share a single cache
+ database.
+ Each view has its own cache database by default, but
+ if multiple views have the same operational policy
+ for name resolution and caching, those views can
+ share a single cache to save memory and possibly
+ improve resolution efficiency by using this option.
+ </p>
+<p>
+ The <span><strong class="command">attach-cache</strong></span> option
+ may also be specified in <span><strong class="command">view</strong></span>
+ statements, in which case it overrides the
+ global <span><strong class="command">attach-cache</strong></span> option.
+ </p>
+<p>
+ The <em class="replaceable"><code>cache_name</code></em> specifies
+ the cache to be shared.
+ When the <span><strong class="command">named</strong></span> server configures
+ views which are supposed to share a cache, it
+ creates a cache with the specified name for the
+ first view of these sharing views.
+ The rest of the views will simply refer to the
+ already created cache.
+ </p>
+<p>
+ One common configuration to share a cache would be to
+ allow all views to share a single cache.
+ This can be done by specifying
+ the <span><strong class="command">attach-cache</strong></span> as a global
+ option with an arbitrary name.
+ </p>
+<p>
+ Another possible operation is to allow a subset of
+ all views to share a cache while the others to
+ retain their own caches.
+ For example, if there are three views A, B, and C,
+ and only A and B should share a cache, specify the
+ <span><strong class="command">attach-cache</strong></span> option as a view A (or
+ B)'s option, referring to the other view name:
+ </p>
+<pre class="programlisting">
+ view "A" {
+ // this view has its own cache
+ ...
+ };
+ view "B" {
+ // this view refers to A's cache
+ attach-cache "A";
+ };
+ view "C" {
+ // this view has its own cache
+ ...
+ };
+</pre>
+<p>
+ Views that share a cache must have the same policy
+ on configurable parameters that may affect caching.
+ The current implementation requires the following
+ configurable options be consistent among these
+ views:
+ <span><strong class="command">check-names</strong></span>,
+ <span><strong class="command">cleaning-interval</strong></span>,
+ <span><strong class="command">dnssec-accept-expired</strong></span>,
+ <span><strong class="command">dnssec-validation</strong></span>,
+ <span><strong class="command">max-cache-ttl</strong></span>,
+ <span><strong class="command">max-ncache-ttl</strong></span>,
+ <span><strong class="command">max-cache-size</strong></span>, and
+ <span><strong class="command">zero-no-soa-ttl</strong></span>.
+ </p>
+<p>
+ Note that there may be other parameters that may
+ cause confusion if they are inconsistent for
+ different views that share a single cache.
+ For example, if these views define different sets of
+ forwarders that can return different answers for the
+ same question, sharing the answer does not make
+ sense or could even be harmful.
+ It is administrator's responsibility to ensure
+ configuration differences in different views do
+ not cause disruption with a shared cache.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">directory</strong></span></span></dt>
<dd><p>
The working directory of the server.
@@ -2229,10 +2382,19 @@ category notify { null; };
When performing dynamic update of secure zones, the
directory where the public and private DNSSEC key files
should be found, if different than the current working
- directory. The directory specified must be an absolute
- path. (Note that this option has no effect on the paths
- for files containing non-DNSSEC keys such as the
- <code class="filename">rndc.key</code>.
+ directory. (Note that this option has no effect on the
+ paths for files containing non-DNSSEC keys such as
+ <code class="filename">bind.keys</code>,
+ <code class="filename">rndc.key</code> or
+ <code class="filename">session.key</code>.)
+ </p></dd>
+<dt><span class="term"><span><strong class="command">managed-keys-directory</strong></span></span></dt>
+<dd><p>
+ The directory used to hold the files used to track managed keys.
+ By default it is the working directory. It there are no
+ views then the file <code class="filename">managed-keys.bind</code>
+ otherwise a SHA256 hash of the view name is used with
+ <code class="filename">.mkeys</code> extension added.
</p></dd>
<dt><span class="term"><span><strong class="command">named-xfer</strong></span></span></dt>
<dd><p>
@@ -2243,18 +2405,27 @@ category notify { null; };
<span><strong class="command">named-xfer</strong></span> program is needed;
its functionality is built into the name server.
</p></dd>
+<dt><span class="term"><span><strong class="command">tkey-gssapi-keytab</strong></span></span></dt>
+<dd><p>
+ The KRB5 keytab file to use for GSS-TSIG updates. If
+ this option is set and tkey-gssapi-credential is not
+ set, then updates will be allowed with any key
+ matching a principal in the specified keytab.
+ </p></dd>
<dt><span class="term"><span><strong class="command">tkey-gssapi-credential</strong></span></span></dt>
<dd><p>
The security credential with which the server should
authenticate keys requested by the GSS-TSIG protocol.
Currently only Kerberos 5 authentication is available
- and the credential is a Kerberos principal which
- the server can acquire through the default system
- key file, normally <code class="filename">/etc/krb5.keytab</code>.
- Normally this principal is of the form
- "<strong class="userinput"><code>DNS/</code></strong><code class="varname">server.domain</code>".
- To use GSS-TSIG, <span><strong class="command">tkey-domain</strong></span>
- must also be set.
+ and the credential is a Kerberos principal which the
+ server can acquire through the default system key
+ file, normally <code class="filename">/etc/krb5.keytab</code>.
+ The location keytab file can be overridden using the
+ tkey-gssapi-keytab option. Normally this principal is
+ of the form "<strong class="userinput"><code>DNS/</code></strong><code class="varname">server.domain</code>".
+ To use GSS-TSIG, <span><strong class="command">tkey-domain</strong></span> must
+ also be set if a specific keytab is not set with
+ tkey-gssapi-keytab.
</p></dd>
<dt><span class="term"><span><strong class="command">tkey-domain</strong></span></span></dt>
<dd><p>
@@ -2271,7 +2442,8 @@ category notify { null; };
should be the server's domain name, or an otherwise
non-existent subdomain like
"_tkey.<code class="varname">domainname</code>". If you are
- using GSS-TSIG, this variable must be defined.
+ using GSS-TSIG, this variable must be defined, unless
+ you specify a specific keytab using tkey-gssapi-keytab.
</p></dd>
<dt><span class="term"><span><strong class="command">tkey-dhkey</strong></span></span></dt>
<dd><p>
@@ -2331,6 +2503,54 @@ category notify { null; };
described
in <a href="Bv9ARM.ch06.html#statsfile" title="The Statistics File">the section called &#8220;The Statistics File&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">bindkeys-file</strong></span></span></dt>
+<dd><p>
+ The pathname of a file to override the built-in trusted
+ keys provided by <span><strong class="command">named</strong></span>.
+ See the discussion of <span><strong class="command">dnssec-lookaside</strong></span>
+ and <span><strong class="command">dnssec-validation</strong></span> for details.
+ If not specified, the default is
+ <code class="filename">/etc/bind.keys</code>.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">secroots-file</strong></span></span></dt>
+<dd><p>
+ The pathname of the file the server dumps
+ security roots to when instructed to do so with
+ <span><strong class="command">rndc secroots</strong></span>.
+ If not specified, the default is <code class="filename">named.secroots</code>.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyfile</strong></span></span></dt>
+<dd><p>
+ The pathname of the file into which to write a TSIG
+ session key generated by <span><strong class="command">named</strong></span> for use by
+ <span><strong class="command">nsupdate -l</strong></span>. If not specified, the
+ default is <code class="filename">/var/run/named/session.key</code>.
+ (See <a href="Bv9ARM.ch06.html#dynamic_update_policies" title="Dynamic Update Policies">the section called &#8220;Dynamic Update Policies&#8221;</a>, and in
+ particular the discussion of the
+ <span><strong class="command">update-policy</strong></span> statement's
+ <strong class="userinput"><code>local</code></strong> option for more
+ information about this feature.)
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyname</strong></span></span></dt>
+<dd><p>
+ The key name to use for the TSIG session key.
+ If not specified, the default is "local-ddns".
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyalg</strong></span></span></dt>
+<dd><p>
+ The algorithm to use for the TSIG session key.
+ Valid values are hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384, hmac-sha512 and hmac-md5. If not
+ specified, the default is hmac-sha256.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">session-keyfile</strong></span></span></dt>
+<dd><p>
+ The pathname of the file into which to write a session TSIG
+ key for use by <span><strong class="command">nsupdate -l</strong></span>. (See the
+ discussion of the <span><strong class="command">update-policy</strong></span>
+ statement's <strong class="userinput"><code>local</code></strong> option for more
+ details on this feature.)
+ </p></dd>
<dt><span class="term"><span><strong class="command">port</strong></span></span></dt>
<dd><p>
The UDP/TCP port number the server uses for
@@ -2379,14 +2599,14 @@ category notify { null; };
<p>
DS queries are expected to be made to and be answered by
delegation only zones. Such queries and responses are
- treated as a exception to delegation-only processing
+ treated as an exception to delegation-only processing
and are not converted to NXDOMAIN responses provided
a CNAME is not discovered at the query name.
</p>
<p>
If a delegation only zone server also serves a child
zone it is not always possible to determine whether
- a answer comes from the delegation only zone or the
+ an answer comes from the delegation only zone or the
child zone. SOA NS and DNSKEY records are apex
only records and a matching response that contains
these records or DS is treated as coming from a
@@ -2423,42 +2643,138 @@ options {
Only the most specific will be applied.
</p></dd>
<dt><span class="term"><span><strong class="command">dnssec-lookaside</strong></span></span></dt>
-<dd><p>
- When set, <span><strong class="command">dnssec-lookaside</strong></span>
- provides the
- validator with an alternate method to validate DNSKEY records
- at the
- top of a zone. When a DNSKEY is at or below a domain
- specified by the
- deepest <span><strong class="command">dnssec-lookaside</strong></span>, and
- the normal DNSSEC validation
- has left the key untrusted, the trust-anchor will be append to
- the key
- name and a DLV record will be looked up to see if it can
- validate the
- key. If the DLV record validates a DNSKEY (similarly to the
- way a DS
+<dd>
+<p>
+ When set, <span><strong class="command">dnssec-lookaside</strong></span> provides the
+ validator with an alternate method to validate DNSKEY
+ records at the top of a zone. When a DNSKEY is at or
+ below a domain specified by the deepest
+ <span><strong class="command">dnssec-lookaside</strong></span>, and the normal DNSSEC
+ validation has left the key untrusted, the trust-anchor
+ will be appended to the key name and a DLV record will be
+ looked up to see if it can validate the key. If the DLV
+ record validates a DNSKEY (similarly to the way a DS
record does) the DNSKEY RRset is deemed to be trusted.
- </p></dd>
+ </p>
+<p>
+ If <span><strong class="command">dnssec-lookaside</strong></span> is set to
+ <strong class="userinput"><code>auto</code></strong>, then built-in default
+ values for the DLV domain and trust anchor will be
+ used, along with a built-in key for validation.
+ </p>
+<p>
+ The default DLV key is stored in the file
+ <code class="filename">bind.keys</code>;
+ <span><strong class="command">named</strong></span> will load that key at
+ startup if <span><strong class="command">dnssec-lookaside</strong></span> is set to
+ <code class="constant">auto</code>. A copy of the file is
+ installed along with <acronym class="acronym">BIND</acronym> 9, and is
+ current as of the release date. If the DLV key expires, a
+ new copy of <code class="filename">bind.keys</code> can be downloaded
+ from <a href="" target="_top">https://www.isc.org/solutions/dlv</a>.
+ </p>
+<p>
+ (To prevent problems if <code class="filename">bind.keys</code> is
+ not found, the current key is also compiled in to
+ <span><strong class="command">named</strong></span>. Relying on this is not
+ recommended, however, as it requires <span><strong class="command">named</strong></span>
+ to be recompiled with a new key when the DLV key expires.)
+ </p>
+<p>
+ NOTE: <span><strong class="command">named</strong></span> only loads certain specific
+ keys from <code class="filename">bind.keys</code>: those for the
+ DLV zone and for the DNS root zone. The file cannot be
+ used to store keys for other zones.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">dnssec-must-be-secure</strong></span></span></dt>
<dd><p>
- Specify hierarchies which must be or may not be secure (signed and
- validated).
- If <strong class="userinput"><code>yes</code></strong>, then <span><strong class="command">named</strong></span> will only accept
- answers if they
- are secure.
- If <strong class="userinput"><code>no</code></strong>, then normal DNSSEC validation
- applies
- allowing for insecure answers to be accepted.
- The specified domain must be under a <span><strong class="command">trusted-key</strong></span> or
- <span><strong class="command">dnssec-lookaside</strong></span> must be
- active.
+ Specify hierarchies which must be or may not be secure
+ (signed and validated). If <strong class="userinput"><code>yes</code></strong>,
+ then <span><strong class="command">named</strong></span> will only accept answers if
+ they are secure. If <strong class="userinput"><code>no</code></strong>, then normal
+ DNSSEC validation applies allowing for insecure answers to
+ be accepted. The specified domain must be under a
+ <span><strong class="command">trusted-keys</strong></span> or
+ <span><strong class="command">managed-keys</strong></span> statement, or
+ <span><strong class="command">dnssec-lookaside</strong></span> must be active.
</p></dd>
+<dt><span class="term"><span><strong class="command">dns64</strong></span></span></dt>
+<dd>
+<p>
+ This directive instructs <span><strong class="command">named</strong></span> to
+ return mapped IPv4 addresses to AAAA queries when
+ there are no AAAA records. It is intended to be
+ used in conjunction with a NAT64. Each
+ <span><strong class="command">dns64</strong></span> defines one DNS64 prefix.
+ Multiple DNS64 prefixes can be defined.
+ </p>
+<p>
+ Compatible IPv6 prefixes have lengths of 32, 40, 48, 56,
+ 64 and 96 as per RFC 6052.
+ </p>
+<p>
+ Additionally a reverse IP6.ARPA zone will be created for
+ the prefix to provide a mapping from the IP6.ARPA names
+ to the corresponding IN-ADDR.ARPA names using synthesized
+ CNAMEs. <span><strong class="command">dns64-server</strong></span> and
+ <span><strong class="command">dns64-contact</strong></span> can be used to specify
+ the name of the server and contact for the zones. These
+ are settable at the view / options level. These are
+ not settable on a per-prefix basis.
+ </p>
+<p>
+ Each <span><strong class="command">dns64</strong></span> supports an optional
+ <span><strong class="command">clients</strong></span> ACL that determines which
+ clients are affected by this directive. If not defined,
+ it defaults to <strong class="userinput"><code>any;</code></strong>.
+ </p>
+<p>
+ Each <span><strong class="command">dns64</strong></span> supports an optional
+ <span><strong class="command">mapped</strong></span> ACL that selects which
+ IPv4 addresses are to be mapped in the corresponding
+ A RRset. If not defined it defaults to
+ <strong class="userinput"><code>any;</code></strong>.
+ </p>
+<p>
+ Each <span><strong class="command">dns64</strong></span> supports an optional
+ <span><strong class="command">exclude</strong></span> ACL that selects which
+ IPv6 addresses will be ignored for the purposes
+ of determining whether dns64 is to be applied.
+ Any non-matching address will prevent further
+ DNS64 processing from occurring for this client.
+ </p>
+<p>
+ A optional <span><strong class="command">suffix</strong></span> can also
+ be defined to set the bits trailing the mapped
+ IPv4 address bits. By default these bits are
+ set to <strong class="userinput"><code>::</code></strong>. The bits
+ matching the prefix and mapped IPv4 address
+ must be zero.
+ </p>
+<pre class="programlisting">
+ acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
+
+ dns64 64:FF9B::/96 {
+ clients { any; };
+ mapped { !rfc1918; any; };
+ exclude { 64:FF9B::/96; ::ffff:0000:0000/96; };
+ suffix ::;
+ };
+</pre>
+</dd>
</dl></div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
<a name="boolean_options"></a>Boolean Options</h4></div></div></div>
<div class="variablelist"><dl>
+<dt><span class="term"><span><strong class="command">allow-new-zones</strong></span></span></dt>
+<dd><p>
+ If <strong class="userinput"><code>yes</code></strong>, then zones can be
+ added at runtime via <span><strong class="command">rndc addzone</strong></span>
+ or deleted via <span><strong class="command">rndc delzone</strong></span>.
+ The default is <strong class="userinput"><code>no</code></strong>.
+ </p></dd>
<dt><span class="term"><span><strong class="command">auth-nxdomain</strong></span></span></dt>
<dd><p>
If <strong class="userinput"><code>yes</code></strong>, then the <span><strong class="command">AA</strong></span> bit
@@ -2863,6 +3179,7 @@ options {
off
on a per-zone basis by specifying <span><strong class="command">zone-statistics no</strong></span>
in the <span><strong class="command">zone</strong></span> statement).
+ The default is <strong class="userinput"><code>no</code></strong>.
These statistics may be accessed
using <span><strong class="command">rndc stats</strong></span>, which will
dump them to the file listed
@@ -3006,6 +3323,57 @@ options {
internally. The use of this option is discouraged.
</p>
</dd>
+<dt><span class="term"><span><strong class="command">filter-aaaa-on-v4</strong></span></span></dt>
+<dd>
+<p>
+ This option is only available when
+ <acronym class="acronym">BIND</acronym> 9 is compiled with the
+ <strong class="userinput"><code>--enable-filter-aaaa</code></strong> option on the
+ "configure" command line. It is intended to help the
+ transition from IPv4 to IPv6 by not giving IPv6 addresses
+ to DNS clients unless they have connections to the IPv6
+ Internet. This is not recommended unless absolutely
+ necessary. The default is <strong class="userinput"><code>no</code></strong>.
+ The <span><strong class="command">filter-aaaa-on-v4</strong></span> option
+ may also be specified in <span><strong class="command">view</strong></span> statements
+ to override the global <span><strong class="command">filter-aaaa-on-v4</strong></span>
+ option.
+ </p>
+<p>
+ If <strong class="userinput"><code>yes</code></strong>,
+ the DNS client is at an IPv4 address, in <span><strong class="command">filter-aaaa</strong></span>,
+ and if the response does not include DNSSEC signatures,
+ then all AAAA records are deleted from the response.
+ This filtering applies to all responses and not only
+ authoritative responses.
+ </p>
+<p>
+ If <strong class="userinput"><code>break-dnssec</code></strong>,
+ then AAAA records are deleted even when dnssec is enabled.
+ As suggested by the name, this makes the response not verify,
+ because the DNSSEC protocol is designed detect deletions.
+ </p>
+<p>
+ This mechanism can erroneously cause other servers to
+ not give AAAA records to their clients.
+ A recursing server with both IPv6 and IPv4 network connections
+ that queries an authoritative server using this mechanism
+ via IPv4 will be denied AAAA records even if its client is
+ using IPv6.
+ </p>
+<p>
+ This mechanism is applied to authoritative as well as
+ non-authoritative records.
+ A client using IPv4 that is not allowed recursion can
+ erroneously be given AAAA records because the server is not
+ allowed to check for A records.
+ </p>
+<p>
+ Some AAAA records are given to IPv4 clients in glue records.
+ IPv4 clients that are servers can then erroneously
+ answer requests for AAAA records received via IPv4.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">ixfr-from-differences</strong></span></span></dt>
<dd>
<p>
@@ -3060,13 +3428,23 @@ options {
Enable DNSSEC validation in <span><strong class="command">named</strong></span>.
Note <span><strong class="command">dnssec-enable</strong></span> also needs to be
set to <strong class="userinput"><code>yes</code></strong> to be effective.
- The default is <strong class="userinput"><code>yes</code></strong>.
+ If set to <strong class="userinput"><code>no</code></strong>, DNSSEC validation
+ is disabled. If set to <strong class="userinput"><code>auto</code></strong>,
+ DNSSEC validation is enabled, and a default
+ trust-anchor for the DNS root zone is used. If set to
+ <strong class="userinput"><code>yes</code></strong>, DNSSEC validation is enabled,
+ but a trust anchor must be manually configured using
+ a <span><strong class="command">trusted-keys</strong></span> or
+ <span><strong class="command">managed-keys</strong></span> statement. The default
+ is <strong class="userinput"><code>yes</code></strong>.
</p></dd>
<dt><span class="term"><span><strong class="command">dnssec-accept-expired</strong></span></span></dt>
<dd><p>
Accept expired signatures when verifying DNSSEC signatures.
The default is <strong class="userinput"><code>no</code></strong>.
- Setting this option to "yes" leaves <span><strong class="command">named</strong></span> vulnerable to replay attacks.
+ Setting this option to <strong class="userinput"><code>yes</code></strong>
+ leaves <span><strong class="command">named</strong></span> vulnerable to
+ replay attacks.
</p></dd>
<dt><span class="term"><span><strong class="command">querylog</strong></span></span></dt>
<dd><p>
@@ -3104,6 +3482,14 @@ options {
(the owner name ends in IN-ADDR.ARPA, IP6.ARPA, or IP6.INT).
</p>
</dd>
+<dt><span class="term"><span><strong class="command">check-dup-records</strong></span></span></dt>
+<dd><p>
+ Check master zones for records that are treated as different
+ by DNSSEC but are semantically equal in plain DNS. The
+ default is to <span><strong class="command">warn</strong></span>. Other possible
+ values are <span><strong class="command">fail</strong></span> and
+ <span><strong class="command">ignore</strong></span>.
+ </p></dd>
<dt><span class="term"><span><strong class="command">check-mx</strong></span></span></dt>
<dd><p>
Check whether the MX record appears to refer to a IP address.
@@ -3166,26 +3552,86 @@ options {
The default is <span><strong class="command">no</strong></span>.
</p></dd>
<dt><span class="term"><span><strong class="command">update-check-ksk</strong></span></span></dt>
-<dd><p>
- When regenerating the RRSIGs following a UPDATE
- request to a secure zone, check the KSK flag on
- the DNSKEY RR to determine if this key should be
- used to generate the RRSIG. This flag is ignored
- if there are not DNSKEY RRs both with and without
- a KSK.
- The default is <span><strong class="command">yes</strong></span>.
- </p></dd>
+<dd>
+<p>
+ When set to the default value of <code class="literal">yes</code>,
+ check the KSK bit in each key to determine how the key
+ should be used when generating RRSIGs for a secure zone.
+ </p>
+<p>
+ Ordinarily, zone-signing keys (that is, keys without the
+ KSK bit set) are used to sign the entire zone, while
+ key-signing keys (keys with the KSK bit set) are only
+ used to sign the DNSKEY RRset at the zone apex.
+ However, if this option is set to <code class="literal">no</code>,
+ then the KSK bit is ignored; KSKs are treated as if they
+ were ZSKs and are used to sign the entire zone. This is
+ similar to the <span><strong class="command">dnssec-signzone -z</strong></span>
+ command line option.
+ </p>
+<p>
+ When this option is set to <code class="literal">yes</code>, there
+ must be at least two active keys for every algorithm
+ represented in the DNSKEY RRset: at least one KSK and one
+ ZSK per algorithm. If there is any algorithm for which
+ this requirement is not met, this option will be ignored
+ for that algorithm.
+ </p>
+</dd>
+<dt><span class="term"><span><strong class="command">dnssec-dnskey-kskonly</strong></span></span></dt>
+<dd>
+<p>
+ When this option and <span><strong class="command">update-check-ksk</strong></span>
+ are both set to <code class="literal">yes</code>, only key-signing
+ keys (that is, keys with the KSK bit set) will be used
+ to sign the DNSKEY RRset at the zone apex. Zone-signing
+ keys (keys without the KSK bit set) will be used to sign
+ the remainder of the zone, but not the DNSKEY RRset.
+ This is similar to the
+ <span><strong class="command">dnssec-signzone -x</strong></span> command line option.
+ </p>
+<p>
+ The default is <span><strong class="command">no</strong></span>. If
+ <span><strong class="command">update-check-ksk</strong></span> is set to
+ <code class="literal">no</code>, this option is ignored.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">try-tcp-refresh</strong></span></span></dt>
<dd><p>
Try to refresh the zone using TCP if UDP queries fail.
For BIND 8 compatibility, the default is
<span><strong class="command">yes</strong></span>.
</p></dd>
+<dt><span class="term"><span><strong class="command">dnssec-secure-to-insecure</strong></span></span></dt>
+<dd>
+<p>
+ Allow a dynamic zone to transition from secure to
+ insecure (i.e., signed to unsigned) by deleting all
+ of the DNSKEY records. The default is <span><strong class="command">no</strong></span>.
+ If set to <span><strong class="command">yes</strong></span>, and if the DNSKEY RRset
+ at the zone apex is deleted, all RRSIG and NSEC records
+ will be removed from the zone as well.
+ </p>
+<p>
+ If the zone uses NSEC3, then it is also necessary to
+ delete the NSEC3PARAM RRset from the zone apex; this will
+ cause the removal of all corresponding NSEC3 records.
+ (It is expected that this requirement will be eliminated
+ in a future release.)
+ </p>
+<p>
+ Note that if a zone has been configured with
+ <span><strong class="command">auto-dnssec maintain</strong></span> and the
+ private keys remain accessible in the key repository,
+ then the zone will be automatically signed again the
+ next time <span><strong class="command">named</strong></span> is started.
+ </p>
+</dd>
</dl></div>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2581856"></a>Forwarding</h4></div></div></div>
+<a name="id2583480"></a>Forwarding</h4></div></div></div>
<p>
The forwarding facility can be used to create a large site-wide
cache on a few servers, reducing traffic over links to external
@@ -3229,7 +3675,7 @@ options {
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2581914"></a>Dual-stack Servers</h4></div></div></div>
+<a name="id2583607"></a>Dual-stack Servers</h4></div></div></div>
<p>
Dual-stack servers are used as servers of last resort to work
around
@@ -3422,11 +3868,25 @@ options {
from these addresses will not be responded to. The default
is <strong class="userinput"><code>none</code></strong>.
</p></dd>
+<dt><span class="term"><span><strong class="command">filter-aaaa</strong></span></span></dt>
+<dd><p>
+ Specifies a list of addresses to which
+ <span><strong class="command">filter-aaaa-on-v4</strong></span>
+ is applies. The default is <strong class="userinput"><code>any</code></strong>.
+ </p></dd>
+<dt><span class="term"><span><strong class="command">resolver-query-timeout</strong></span></span></dt>
+<dd><p>
+ The amount of time the resolver will spend attempting
+ to resolve a recursive query before failing. The
+ default is <code class="literal">10</code> and the maximum is
+ <code class="literal">30</code>. Setting it to <code class="literal">0</code>
+ will result in the default being used.
+ </p></dd>
</dl></div>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2582420"></a>Interfaces</h4></div></div></div>
+<a name="id2584227"></a>Interfaces</h4></div></div></div>
<p>
The interfaces and ports that the server will answer queries
from may be specified using the <span><strong class="command">listen-on</strong></span> option. <span><strong class="command">listen-on</strong></span> takes
@@ -3878,7 +4338,7 @@ avoid-v6-udp-ports {};
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2583691"></a>UDP Port Lists</h4></div></div></div>
+<a name="id2585362"></a>UDP Port Lists</h4></div></div></div>
<p>
<span><strong class="command">use-v4-udp-ports</strong></span>,
<span><strong class="command">avoid-v4-udp-ports</strong></span>,
@@ -3920,7 +4380,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2583751"></a>Operating System Resource Limits</h4></div></div></div>
+<a name="id2585421"></a>Operating System Resource Limits</h4></div></div></div>
<p>
The server's usage of many system resources can be limited.
Scaled values are allowed when specifying resource limits. For
@@ -4082,7 +4542,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2584173"></a>Periodic Task Intervals</h4></div></div></div>
+<a name="id2585912"></a>Periodic Task Intervals</h4></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span><strong class="command">cleaning-interval</strong></span></span></dt>
<dd><p>
@@ -4252,20 +4712,26 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
their directly connected networks.
</p>
<pre class="programlisting">sortlist {
- { localhost; // IF the local host
- { localnets; // THEN first fit on the
- 192.168.1/24; // following nets
+ // IF the local host
+ // THEN first fit on the following nets
+ { localhost;
+ { localnets;
+ 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.1/24; // IF on class C 192.168.1
- { 192.168.1/24; // THEN use .1, or .2 or .3
+ // IF on class C 192.168.1 THEN use .1, or .2 or .3
+ { 192.168.1/24;
+ { 192.168.1/24;
{ 192.168.2/24; 192.168.3/24; }; }; };
- { 192.168.2/24; // IF on class C 192.168.2
- { 192.168.2/24; // THEN use .2, or .1 or .3
+ // IF on class C 192.168.2 THEN use .2, or .1 or .3
+ { 192.168.2/24;
+ { 192.168.2/24;
{ 192.168.1/24; 192.168.3/24; }; }; };
- { 192.168.3/24; // IF on class C 192.168.3
- { 192.168.3/24; // THEN use .3, or .1 or .2
+ // IF on class C 192.168.3 THEN use .3, or .1 or .2
+ { 192.168.3/24;
+ { 192.168.3/24;
{ 192.168.1/24; 192.168.2/24; }; }; };
- { { 192.168.4/24; 192.168.5/24; }; // if .4 or .5, prefer that net
+ // IF .4 or .5 THEN prefer that net
+ { { 192.168.4/24; 192.168.5/24; };
};
};</pre>
<p>
@@ -4456,7 +4922,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
Specifies the number of days into the future when
DNSSEC signatures automatically generated as a
result of dynamic updates (<a href="Bv9ARM.ch04.html#dynamic_update" title="Dynamic Update">the section called &#8220;Dynamic Update&#8221;</a>) will expire. There
- is a optional second field which specifies how
+ is an optional second field which specifies how
long before expiry that the signatures will be
regenerated. If not specified, the signatures will
be regenerated at 1/4 of base interval. The second
@@ -4537,30 +5003,46 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</p>
</dd>
<dt><span class="term"><span><strong class="command">edns-udp-size</strong></span></span></dt>
-<dd><p>
+<dd>
+<p>
Sets the advertised EDNS UDP buffer size in bytes
to control the size of packets received.
- Valid values are 512 to 4096 (values outside this range
+ Valid values are 1024 to 4096 (values outside this range
will be silently adjusted). The default value
is 4096. The usual reason for setting
<span><strong class="command">edns-udp-size</strong></span> to a non-default
value is to get UDP answers to pass through broken
firewalls that block fragmented packets and/or
block UDP packets that are greater than 512 bytes.
- </p></dd>
+ </p>
+<p>
+ <span><strong class="command">named</strong></span> will fallback to using 512 bytes
+ if it get a series of timeout at the initial value. 512
+ bytes is not being offered to encourage sites to fix their
+ firewalls. Small EDNS UDP sizes will result in the
+ excessive use of TCP.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">max-udp-size</strong></span></span></dt>
-<dd><p>
- Sets the maximum EDNS UDP message size <span><strong class="command">named</strong></span> will
- send in bytes. Valid values are 512 to 4096 (values outside
- this range will be silently adjusted). The default
+<dd>
+<p>
+ Sets the maximum EDNS UDP message size
+ <span><strong class="command">named</strong></span> will send in bytes.
+ Valid values are 512 to 4096 (values outside this
+ range will be silently adjusted). The default
value is 4096. The usual reason for setting
- <span><strong class="command">max-udp-size</strong></span> to a non-default value is to get UDP
- answers to pass through broken firewalls that
- block fragmented packets and/or block UDP packets
- that are greater than 512 bytes.
+ <span><strong class="command">max-udp-size</strong></span> to a non-default
+ value is to get UDP answers to pass through broken
+ firewalls that block fragmented packets and/or
+ block UDP packets that are greater than 512 bytes.
This is independent of the advertised receive
buffer (<span><strong class="command">edns-udp-size</strong></span>).
- </p></dd>
+ </p>
+<p>
+ Setting this to a low value will encourage additional
+ TCP traffic to the nameserver.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">masterfile-format</strong></span></span></dt>
<dd><p>Specifies
the file format of zone files (see
@@ -4705,7 +5187,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<p>
Named will attempt to determine if a built-in zone already exists
or is active (covered by a forward-only forwarding declaration)
- and will not create a empty zone in that case.
+ and will not create an empty zone in that case.
</p>
<p>
The current list of empty zones is:
@@ -4873,6 +5355,260 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</p></dd>
</dl></div>
</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2588025"></a>Content Filtering</h4></div></div></div>
+<p>
+ <acronym class="acronym">BIND</acronym> 9 provides the ability to filter
+ out DNS responses from external DNS servers containing
+ certain types of data in the answer section.
+ Specifically, it can reject address (A or AAAA) records if
+ the corresponding IPv4 or IPv6 addresses match the given
+ <code class="varname">address_match_list</code> of the
+ <span><strong class="command">deny-answer-addresses</strong></span> option.
+ It can also reject CNAME or DNAME records if the "alias"
+ name (i.e., the CNAME alias or the substituted query name
+ due to DNAME) matches the
+ given <code class="varname">namelist</code> of the
+ <span><strong class="command">deny-answer-aliases</strong></span> option, where
+ "match" means the alias name is a subdomain of one of
+ the <code class="varname">name_list</code> elements.
+ If the optional <code class="varname">namelist</code> is specified
+ with <span><strong class="command">except-from</strong></span>, records whose query name
+ matches the list will be accepted regardless of the filter
+ setting.
+ Likewise, if the alias name is a subdomain of the
+ corresponding zone, the <span><strong class="command">deny-answer-aliases</strong></span>
+ filter will not apply;
+ for example, even if "example.com" is specified for
+ <span><strong class="command">deny-answer-aliases</strong></span>,
+ </p>
+<pre class="programlisting">www.example.com. CNAME xxx.example.com.</pre>
+<p>
+ returned by an "example.com" server will be accepted.
+ </p>
+<p>
+ In the <code class="varname">address_match_list</code> of the
+ <span><strong class="command">deny-answer-addresses</strong></span> option, only
+ <code class="varname">ip_addr</code>
+ and <code class="varname">ip_prefix</code>
+ are meaningful;
+ any <code class="varname">key_id</code> will be silently ignored.
+ </p>
+<p>
+ If a response message is rejected due to the filtering,
+ the entire message is discarded without being cached, and
+ a SERVFAIL error will be returned to the client.
+ </p>
+<p>
+ This filtering is intended to prevent "DNS rebinding attacks," in
+ which an attacker, in response to a query for a domain name the
+ attacker controls, returns an IP address within your own network or
+ an alias name within your own domain.
+ A naive web browser or script could then serve as an
+ unintended proxy, allowing the attacker
+ to get access to an internal node of your local network
+ that couldn't be externally accessed otherwise.
+ See the paper available at
+ <a href="" target="_top">
+ http://portal.acm.org/citation.cfm?id=1315245.1315298
+ </a>
+ for more details about the attacks.
+ </p>
+<p>
+ For example, if you own a domain named "example.net" and
+ your internal network uses an IPv4 prefix 192.0.2.0/24,
+ you might specify the following rules:
+ </p>
+<pre class="programlisting">deny-answer-addresses { 192.0.2.0/24; } except-from { "example.net"; };
+deny-answer-aliases { "example.net"; };
+</pre>
+<p>
+ If an external attacker lets a web browser in your local
+ network look up an IPv4 address of "attacker.example.com",
+ the attacker's DNS server would return a response like this:
+ </p>
+<pre class="programlisting">attacker.example.com. A 192.0.2.1</pre>
+<p>
+ in the answer section.
+ Since the rdata of this record (the IPv4 address) matches
+ the specified prefix 192.0.2.0/24, this response will be
+ ignored.
+ </p>
+<p>
+ On the other hand, if the browser looks up a legitimate
+ internal web server "www.example.net" and the
+ following response is returned to
+ the <acronym class="acronym">BIND</acronym> 9 server
+ </p>
+<pre class="programlisting">www.example.net. A 192.0.2.2</pre>
+<p>
+ it will be accepted since the owner name "www.example.net"
+ matches the <span><strong class="command">except-from</strong></span> element,
+ "example.net".
+ </p>
+<p>
+ Note that this is not really an attack on the DNS per se.
+ In fact, there is nothing wrong for an "external" name to
+ be mapped to your "internal" IP address or domain name
+ from the DNS point of view.
+ It might actually be provided for a legitimate purpose,
+ such as for debugging.
+ As long as the mapping is provided by the correct owner,
+ it is not possible or does not make sense to detect
+ whether the intent of the mapping is legitimate or not
+ within the DNS.
+ The "rebinding" attack must primarily be protected at the
+ application that uses the DNS.
+ For a large site, however, it may be difficult to protect
+ all possible applications at once.
+ This filtering feature is provided only to help such an
+ operational environment;
+ it is generally discouraged to turn it on unless you are
+ very sure you have no other choice and the attack is a
+ real threat for your applications.
+ </p>
+<p>
+ Care should be particularly taken if you want to use this
+ option for addresses within 127.0.0.0/8.
+ These addresses are obviously "internal", but many
+ applications conventionally rely on a DNS mapping from
+ some name to such an address.
+ Filtering out DNS records containing this address
+ spuriously can break such applications.
+ </p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2588148"></a>Response Policy Zone (RPZ) Rewriting</h4></div></div></div>
+<p>
+ <acronym class="acronym">BIND</acronym> 9 includes an intentionally limited
+ mechanism to modify DNS responses for recursive requests
+ similar to email anti-spam DNS blacklists.
+ All response policy zones are named in the
+ <span><strong class="command">response-policy</strong></span> option for the view or among the
+ global options if there is no response-policy option for the view.
+ </p>
+<p>
+ The rules encoded in a response policy zone (RPZ) are applied
+ only to responses to queries that ask for recursion (RD=1).
+ RPZs are normal DNS zones containing RRsets
+ that can be queried normally if allowed.
+ It is usually best to restrict those queries with something like
+ <span><strong class="command">allow-query {none; };</strong></span> or
+ <span><strong class="command">allow-query { 127.0.0.1; };</strong></span>.
+ </p>
+<p>
+ There are four kinds of RPZ rewrite rules. QNAME rules are
+ applied to query names in requests and to targets of CNAME
+ records resolved in the process of generating the response.
+ The owner name of a QNAME rule is the query name relativized
+ to the RPZ.
+ The records in a rewrite rule are usually A, AAAA, or special
+ CNAMEs, but can be any type except DNAME.
+ </p>
+<p>
+ IP rules are triggered by addresses in A and AAAA records.
+ All IP addresses in A or AAAA RRsets are tested and the rule
+ longest prefix is applied. Ties between rules with equal prefixes
+ are broken in favor of the first RPZ mentioned in the
+ response-policy option.
+ The rule matching the smallest IP address is chosen among equal
+ prefix rules from a single RPZ.
+ IP rules are expressed in RRsets with owner names that are
+ subdomains of rpz-ip and encoding an IP address block, reversed
+ as in IN-ARPA.
+ prefix.B.B.B.B with prefix between 1 and 32 and B between 1 and 255
+ encodes an IPv4 address.
+ IPv6 addresses are encoded by with prefix.W.W.W.W.W.W.W.W or
+ prefix.WORDS.zz.WORDS. The words in the standard IPv6 text
+ representation are reversed, "::" is replaced with ".zz.",
+ and ":" becomes ".".
+ </p>
+<p>
+ NSDNAME rules match names in NS RRsets for the response or a
+ parent. They are encoded as subdomains of rpz-nsdomain relativized
+ to the RPZ origin name.
+ </p>
+<p>
+ NSIP rules match IP addresses in A and AAAA RRsets for names of
+ responsible servers or the names that can be matched by NSDNAME
+ rules. The are encoded like IP rules except as subdomains of
+ rpz-nsip.
+ </p>
+<p>
+ Authority verification issues and variations in authority data in
+ the current version of <acronym class="acronym">BIND</acronym> 9 can cause
+ inconsistent results from NSIP and NSDNAME. So they are available
+ only when <acronym class="acronym">BIND</acronym> is built with the
+ <strong class="userinput"><code>--enable-rpz-nsip</code></strong> or
+ <strong class="userinput"><code>--enable-rpz-nsdname</code></strong> options
+ on the "configure" command line.
+ </p>
+<p>
+ Four policies can be expressed.
+ The <span><strong class="command">NXDOMAIN</strong></span> policy causes a NXDOMAIN response
+ and is expressed with an RRset consisting of a single CNAME
+ whose target is the root domain (.).
+ <span><strong class="command">NODATA</strong></span> generates NODATA or ANCOUNT=1 regardless
+ of query type.
+ It is expressed with a CNAME whose target is the wildcard
+ top-level domain (*.).
+ The <span><strong class="command">NO-OP</strong></span> policy does not change the response
+ and is used to "poke holes" in policies for larger CIDR blocks or in
+ zones named later in the <span><strong class="command">response-policy</strong></span> option.
+ The NO-OP policy is expressed by a CNAME with a target consisting
+ of the variable part of the owner name, such as "example.com." for
+ a QNAME rule or "128.1.0.0.127." for an IP rule.
+ The <span><strong class="command">CNAME</strong></span> policy is used to replace the RRsets
+ of response.
+ A and AAAA RRsets are most common and useful to capture
+ an evil domain in a walled garden, but any valid set of RRsets
+ is possible.
+ </p>
+<p>
+ All of the policies in an RPZ can be overridden with a
+ <span><strong class="command">policy</strong></span> clause.
+ <span><strong class="command">given</strong></span> says "do not override."
+ <span><strong class="command">no-op</strong></span> says "do nothing" regardless of the policy
+ in RPZ records.
+ <span><strong class="command">nxdomain</strong></span> causes all RPZ rules to generate
+ NXDOMAIN results.
+ <span><strong class="command">nodata</strong></span> gives nodata.
+ <span><strong class="command">cname domain</strong></span> causes all RPZ rules to act as if
+ the consisted of a "cname domain" record.
+ </p>
+<p>
+ For example, you might use this option statement
+ </p>
+<pre class="programlisting">response-policy { zone "bl"; };</pre>
+<p>
+ and this zone statement
+ </p>
+<pre class="programlisting">zone "bl" {type master; file "example/bl"; allow-query {none;}; };</pre>
+<p>
+ with this zone file
+ </p>
+<pre class="programlisting">$TTL 1H
+@ SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h)
+
+; QNAME rules
+nxdomain.domain.com CNAME .
+nodata.domain.com CNAME *.
+bad.domain.com A 10.0.0.1
+ AAAA 2001:2::1
+ok.domain.com CNAME ok.domain.com.
+*.badzone.domain.com CNAME garden.example.com.
+
+; IP rules rewriting all answers for 127/8 except 127.0.0.1
+8.0.0.0.127.ip CNAME .
+32.1.0.0.127.ip CNAME 32.1.0.0.127.
+
+; NSDNAME and NSIP rules
+ns.domain.com.rpz-nsdname CNAME .
+48.zz.2.2001.rpz-nsip CNAME .
+</pre>
+</div>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
@@ -4891,8 +5627,10 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
[<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> query-source [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>] [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
- [<span class="optional"> query-source-v6 [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>] [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
+ [<span class="optional"> query-source [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]
+ [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
+ [<span class="optional"> query-source-v6 [<span class="optional"> address ( <em class="replaceable"><code>ip_addr</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]
+ [<span class="optional"> port ( <em class="replaceable"><code>ip_port</code></em> | <em class="replaceable"><code>*</code></em> ) </span>]; </span>]
[<span class="optional"> use-queryport-pool <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> queryport-pool-ports <em class="replaceable"><code>number</code></em>; </span>]
[<span class="optional"> queryport-pool-updateinterval <em class="replaceable"><code>number</code></em>; </span>]
@@ -5072,14 +5810,15 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
<div class="titlepage"><div><div><h3 class="title">
<a name="statschannels"></a><span><strong class="command">statistics-channels</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">statistics-channels</strong></span> {
- [ inet ( ip_addr | * ) [ port ip_port ] [allow { <em class="replaceable"><code> address_match_list </code></em> } ]; ]
+ [ inet ( ip_addr | * ) [ port ip_port ]
+ [ allow { <em class="replaceable"><code> address_match_list </code></em> } ]; ]
[ inet ...; ]
};
</pre>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2586907"></a><span><strong class="command">statistics-channels</strong></span> Statement Definition and
+<a name="id2589239"></a><span><strong class="command">statistics-channels</strong></span> Statement Definition and
Usage</h3></div></div></div>
<p>
The <span><strong class="command">statistics-channels</strong></span> statement
@@ -5130,7 +5869,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2587062"></a><span><strong class="command">trusted-keys</strong></span> Statement Grammar</h3></div></div></div>
+<a name="trusted-keys"></a><span><strong class="command">trusted-keys</strong></span> Statement Grammar</h3></div></div></div>
<pre class="programlisting"><span><strong class="command">trusted-keys</strong></span> {
<em class="replaceable"><code>string</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ;
[<span class="optional"> <em class="replaceable"><code>string</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; [<span class="optional">...</span>]</span>]
@@ -5139,7 +5878,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2587113"></a><span><strong class="command">trusted-keys</strong></span> Statement Definition
+<a name="id2589379"></a><span><strong class="command">trusted-keys</strong></span> Statement Definition
and Usage</h3></div></div></div>
<p>
The <span><strong class="command">trusted-keys</strong></span> statement defines
@@ -5169,6 +5908,135 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
in the key data, so the configuration may be split up into
multiple lines.
</p>
+<p>
+ <span><strong class="command">trusted-keys</strong></span> may be set at the top level
+ of <code class="filename">named.conf</code> or within a view. If it is
+ set in both places, they are additive: keys defined at the top
+ level are inherited by all views, but keys defined in a view
+ are only used within that view.
+ </p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2589494"></a><span><strong class="command">managed-keys</strong></span> Statement Grammar</h3></div></div></div>
+<pre class="programlisting"><span><strong class="command">managed-keys</strong></span> {
+ <em class="replaceable"><code>string</code></em> initial-key <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ;
+ [<span class="optional"> <em class="replaceable"><code>string</code></em> initial-key <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; [<span class="optional">...</span>]</span>]
+};
+</pre>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="managed-keys"></a><span><strong class="command">managed-keys</strong></span> Statement Definition
+ and Usage</h3></div></div></div>
+<p>
+ The <span><strong class="command">managed-keys</strong></span> statement, like
+ <span><strong class="command">trusted-keys</strong></span>, defines DNSSEC
+ security roots. The difference is that
+ <span><strong class="command">managed-keys</strong></span> can be kept up to date
+ automatically, without intervention from the resolver
+ operator.
+ </p>
+<p>
+ Suppose, for example, that a zone's key-signing
+ key was compromised, and the zone owner had to revoke and
+ replace the key. A resolver which had the old key in a
+ <span><strong class="command">trusted-keys</strong></span> statement would be
+ unable to validate this zone any longer; it would
+ reply with a SERVFAIL response code. This would
+ continue until the resolver operator had updated the
+ <span><strong class="command">trusted-keys</strong></span> statement with the new key.
+ </p>
+<p>
+ If, however, the zone were listed in a
+ <span><strong class="command">managed-keys</strong></span> statement instead, then the
+ zone owner could add a "stand-by" key to the zone in advance.
+ <span><strong class="command">named</strong></span> would store the stand-by key, and
+ when the original key was revoked, <span><strong class="command">named</strong></span>
+ would be able to transition smoothly to the new key. It would
+ also recognize that the old key had been revoked, and cease
+ using that key to validate answers, minimizing the damage that
+ the compromised key could do.
+ </p>
+<p>
+ A <span><strong class="command">managed-keys</strong></span> statement contains a list of
+ the keys to be managed, along with information about how the
+ keys are to be initialized for the first time. The only
+ initialization method currently supported (as of
+ <acronym class="acronym">BIND</acronym> 9.7.0) is <code class="literal">initial-key</code>.
+ This means the <span><strong class="command">managed-keys</strong></span> statement must
+ contain a copy of the initializing key. (Future releases may
+ allow keys to be initialized by other methods, eliminating this
+ requirement.)
+ </p>
+<p>
+ Consequently, a <span><strong class="command">managed-keys</strong></span> statement
+ appears similar to a <span><strong class="command">trusted-keys</strong></span>, differing
+ in the presence of the second field, containing the keyword
+ <code class="literal">initial-key</code>. The difference is, whereas the
+ keys listed in a <span><strong class="command">trusted-keys</strong></span> continue to be
+ trusted until they are removed from
+ <code class="filename">named.conf</code>, an initializing key listed
+ in a <span><strong class="command">managed-keys</strong></span> statement is only trusted
+ <span class="emphasis"><em>once</em></span>: for as long as it takes to load the
+ managed key database and start the RFC 5011 key maintenance
+ process.
+ </p>
+<p>
+ The first time <span><strong class="command">named</strong></span> runs with a managed key
+ configured in <code class="filename">named.conf</code>, it fetches the
+ DNSKEY RRset directly from the zone apex, and validates it
+ using the key specified in the <span><strong class="command">managed-keys</strong></span>
+ statement. If the DNSKEY RRset is validly signed, then it is
+ used as the basis for a new managed keys database.
+ </p>
+<p>
+ From that point on, whenever <span><strong class="command">named</strong></span> runs, it
+ sees the <span><strong class="command">managed-keys</strong></span> statement, checks to
+ make sure RFC 5011 key maintenance has already been initialized
+ for the specified domain, and if so, it simply moves on. The
+ key specified in the <span><strong class="command">managed-keys</strong></span> is not
+ used to validate answers; it has been superseded by the key or
+ keys stored in the managed keys database.
+ </p>
+<p>
+ The next time <span><strong class="command">named</strong></span> runs after a name
+ has been <span class="emphasis"><em>removed</em></span> from the
+ <span><strong class="command">managed-keys</strong></span> statement, the corresponding
+ zone will be removed from the managed keys database,
+ and RFC 5011 key maintenance will no longer be used for that
+ domain.
+ </p>
+<p>
+ <span><strong class="command">named</strong></span> only maintains a single managed keys
+ database; consequently, unlike <span><strong class="command">trusted-keys</strong></span>,
+ <span><strong class="command">managed-keys</strong></span> may only be set at the top
+ level of <code class="filename">named.conf</code>, not within a view.
+ </p>
+<p>
+ In the current implementation, the managed keys database is
+ stored as a master-format zone file called
+ <code class="filename">managed-keys.bind</code>. When the key database
+ is changed, the zone is updated. As with any other dynamic
+ zone, changes will be written into a journal file,
+ <code class="filename">managed-keys.bind.jnl</code>. They are committed
+ to the master file as soon as possible afterward; in the case
+ of the managed key database, this will usually occur within 30
+ seconds. So, whenever <span><strong class="command">named</strong></span> is using
+ automatic key maintenance, those two files can be expected to
+ exist in the working directory. (For this reason among others,
+ the working directory should be always be writable by
+ <span><strong class="command">named</strong></span>.)
+ </p>
+<p>
+ If the <span><strong class="command">dnssec-lookaside</strong></span> option is
+ set to <strong class="userinput"><code>auto</code></strong>, <span><strong class="command">named</strong></span>
+ will automatically initialize a managed key for the
+ zone <code class="literal">dlv.isc.org</code>. The key that is
+ used to initialize the key maintenance process is built
+ into <span><strong class="command">named</strong></span>, and can be overridden
+ from <span><strong class="command">bindkeys-file</strong></span>.
+ </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
@@ -5185,7 +6053,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2587195"></a><span><strong class="command">view</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2589851"></a><span><strong class="command">view</strong></span> Statement Definition and Usage</h3></div></div></div>
<p>
The <span><strong class="command">view</strong></span> statement is a powerful
feature
@@ -5274,11 +6142,12 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
// This should match our internal networks.
match-clients { 10.0.0.0/8; };
- // Provide recursive service to internal clients only.
+ // Provide recursive service to internal
+ // clients only.
recursion yes;
- // Provide a complete view of the example.com zone
- // including addresses of internal hosts.
+ // Provide a complete view of the example.com
+ // zone including addresses of internal hosts.
zone "example.com" {
type master;
file "example-internal.db";
@@ -5286,14 +6155,15 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
};
view "external" {
- // Match all clients not matched by the previous view.
+ // Match all clients not matched by the
+ // previous view.
match-clients { any; };
// Refuse recursive service to external clients.
recursion no;
- // Provide a restricted view of the example.com zone
- // containing only publicly accessible hosts.
+ // Provide a restricted view of the example.com
+ // zone containing only publicly accessible hosts.
zone "example.com" {
type master;
file "example-external.db";
@@ -5311,8 +6181,9 @@ view "external" {
[<span class="optional"> allow-query-on { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-transfer { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-update { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
- [<span class="optional"> update-policy { <em class="replaceable"><code>update_policy_rule</code></em> [<span class="optional">...</span>] }; </span>]
- [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> update-policy <em class="replaceable"><code>local</code></em> | { <em class="replaceable"><code>update_policy_rule</code></em> [<span class="optional">...</span>] }; </span>]
+ [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>]
[<span class="optional"> check-mx (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>]
[<span class="optional"> check-wildcard <em class="replaceable"><code>yes_or_no</code></em>; </span>]
@@ -5348,6 +6219,7 @@ view "external" {
[<span class="optional"> min-retry-time <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-retry-time <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> key-directory <em class="replaceable"><code>path_name</code></em>; </span>]
+ [<span class="optional"> auto-dnssec <code class="constant">allow</code>|<code class="constant">maintain</code>|<code class="constant">create</code>|<code class="constant">off</code>; </span>]
[<span class="optional"> zero-no-soa-ttl <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
};
@@ -5359,8 +6231,11 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> allow-transfer { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> allow-update-forwarding { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
[<span class="optional"> update-check-ksk <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-dnskey-kskonly <em class="replaceable"><code>yes_or_no</code></em>; </span>]
+ [<span class="optional"> dnssec-secure-to-insecure <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> try-tcp-refresh <em class="replaceable"><code>yes_or_no</code></em>; </span>]
- [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
+ [<span class="optional"> also-notify { <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ;
+ [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
[<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>]
[<span class="optional"> dialup <em class="replaceable"><code>dialup_option</code></em> ; </span>]
[<span class="optional"> file <em class="replaceable"><code>string</code></em> ; </span>]
@@ -5373,7 +6248,9 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> ixfr-from-differences <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> ixfr-tmp-file <em class="replaceable"><code>string</code></em> ; </span>]
[<span class="optional"> maintain-ixfr-base <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
+ [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em>
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>]
+ [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
[<span class="optional"> max-ixfr-log-size <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-transfer-idle-in <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-transfer-idle-out <em class="replaceable"><code>number</code></em> ; </span>]
@@ -5386,7 +6263,8 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> alt-transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> use-alt-transfer-source <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> notify-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> notify-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
@@ -5404,7 +6282,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
type hint;
file <em class="replaceable"><code>string</code></em> ;
[<span class="optional"> delegation-only <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
- [<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; // Not Implemented. </span>]
+ [<span class="optional"> check-names (<code class="constant">warn</code>|<code class="constant">fail</code>|<code class="constant">ignore</code>) ; </span>] // Not Implemented.
};
zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"><em class="replaceable"><code>class</code></em></span>] {
@@ -5418,14 +6296,18 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
[<span class="optional"> masterfile-format (<code class="constant">text</code>|<code class="constant">raw</code>) ; </span>]
[<span class="optional"> forward (<code class="constant">only</code>|<code class="constant">first</code>) ; </span>]
[<span class="optional"> forwarders { [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
- [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
+ [<span class="optional"> masters [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] { ( <em class="replaceable"><code>masters_list</code></em> | <em class="replaceable"><code>ip_addr</code></em>
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>]
+ [<span class="optional">key <em class="replaceable"><code>key</code></em></span>] ) ; [<span class="optional">...</span>] }; </span>]
[<span class="optional"> max-transfer-idle-in <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> max-transfer-time-in <em class="replaceable"><code>number</code></em> ; </span>]
[<span class="optional"> pubkey <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>number</code></em> <em class="replaceable"><code>string</code></em> ; </span>]
[<span class="optional"> transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> alt-transfer-source (<em class="replaceable"><code>ip4_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
- [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>) [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
+ [<span class="optional"> alt-transfer-source-v6 (<em class="replaceable"><code>ip6_addr</code></em> | <code class="constant">*</code>)
+ [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; </span>]
[<span class="optional"> use-alt-transfer-source <em class="replaceable"><code>yes_or_no</code></em>; </span>]
[<span class="optional"> zone-statistics <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
[<span class="optional"> database <em class="replaceable"><code>string</code></em> ; </span>]
@@ -5437,6 +6319,14 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
};
zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"><em class="replaceable"><code>class</code></em></span>] {
+ type static-stub;
+ [<span class="optional"> allow-query { <em class="replaceable"><code>address_match_list</code></em> }; </span>]
+ [<span class="optional"> server-addresses { [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> ; ... </span>] }; </span>]
+ [<span class="optional"> server-names { [<span class="optional"> <em class="replaceable"><code>namelist</code></em> </span>] }; </span>]
+ [<span class="optional"> zone-statistics <em class="replaceable"><code>yes_or_no</code></em> ; </span>]
+};
+
+zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"><em class="replaceable"><code>class</code></em></span>] {
type forward;
[<span class="optional"> forward (<code class="constant">only</code>|<code class="constant">first</code>) ; </span>]
[<span class="optional"> forwarders { [<span class="optional"> <em class="replaceable"><code>ip_addr</code></em> [<span class="optional">port <em class="replaceable"><code>ip_port</code></em></span>] ; ... </span>] }; </span>]
@@ -5451,10 +6341,10 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2588600"></a><span><strong class="command">zone</strong></span> Statement Definition and Usage</h3></div></div></div>
+<a name="id2591396"></a><span><strong class="command">zone</strong></span> Statement Definition and Usage</h3></div></div></div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2588608"></a>Zone Types</h4></div></div></div>
+<a name="id2591403"></a>Zone Types</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -5583,6 +6473,55 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<tr>
<td>
<p>
+ <code class="varname">static-stub</code>
+ </p>
+ </td>
+<td>
+ <p>
+ A static-stub zone is similar to a stub zone
+ with the following exceptions:
+ the zone data is statically configured, rather
+ than transferred from a master server;
+ when recursion is necessary for a query that
+ matches a static-stub zone, the locally
+ configured data (nameserver names and glue addresses)
+ is always used even if different authoritative
+ information is cached.
+ </p>
+ <p>
+ Zone data is configured via the
+ <span><strong class="command">server-addresses</strong></span> and
+ <span><strong class="command">server-names</strong></span> zone options.
+ </p>
+ <p>
+ The zone data is maintained in the form of NS
+ and (if necessary) glue A or AAAA RRs
+ internally, which can be seen by dumping zone
+ databases by <span><strong class="command">rndc dumpdb -all</strong></span>.
+ The configured RRs are considered local configuration
+ parameters rather than public data.
+ Non recursive queries (i.e., those with the RD
+ bit off) to a static-stub zone are therefore
+ prohibited and will be responded with REFUSED.
+ </p>
+ <p>
+ Since the data is statically configured, no
+ zone maintenance action takes place for a static-stub
+ zone.
+ For example, there is no periodic refresh
+ attempt, and an incoming notify message
+ will be rejected with an rcode of NOTAUTH.
+ </p>
+ <p>
+ Each static-stub zone is configured with
+ internally generated NS and (if necessary)
+ glue A or AAAA RRs
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="varname">forward</code>
</p>
</td>
@@ -5665,7 +6604,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2589104"></a>Class</h4></div></div></div>
+<a name="id2592085"></a>Class</h4></div></div></div>
<p>
The zone's name may optionally be followed by a class. If
a class is not specified, class <code class="literal">IN</code> (for <code class="varname">Internet</code>),
@@ -5687,7 +6626,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2589137"></a>Zone Options</h4></div></div></div>
+<a name="id2592118"></a>Zone Options</h4></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span><strong class="command">allow-notify</strong></span></span></dt>
<dd><p>
@@ -5752,6 +6691,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
received from the
network. The default varies according to zone type. For <span><strong class="command">master</strong></span> zones the default is <span><strong class="command">fail</strong></span>. For <span><strong class="command">slave</strong></span>
zones the default is <span><strong class="command">warn</strong></span>.
+ It is not implemented for <span><strong class="command">hint</strong></span> zones.
</p></dd>
<dt><span class="term"><span><strong class="command">check-mx</strong></span></span></dt>
<dd><p>
@@ -5783,6 +6723,11 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
See the description of
<span><strong class="command">update-check-ksk</strong></span> in <a href="Bv9ARM.ch06.html#boolean_options" title="Boolean Options">the section called &#8220;Boolean Options&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">dnssec-dnskey-kskonly</strong></span></span></dt>
+<dd><p>
+ See the description of
+ <span><strong class="command">dnssec-dnskey-kskonly</strong></span> in <a href="Bv9ARM.ch06.html#boolean_options" title="Boolean Options">the section called &#8220;Boolean Options&#8221;</a>.
+ </p></dd>
<dt><span class="term"><span><strong class="command">try-tcp-refresh</strong></span></span></dt>
<dd><p>
See the description of
@@ -5926,6 +6871,78 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<span><strong class="command">statistics-file</strong></span> defined in
the server options.
</p></dd>
+<dt><span class="term"><span><strong class="command">server-addresses</strong></span></span></dt>
+<dd>
+<p>
+ Only meaningful for static-stub zones.
+ This is a list of IP addresses to which queries
+ should be sent in recursive resolution for the
+ zone.
+ A non empty list for this option will internally
+ configure the apex NS RR with associated glue A or
+ AAAA RRs.
+ </p>
+<p>
+ For example, if "example.com" is configured as a
+ static-stub zone with 192.0.2.1 and 2001:db8::1234
+ in a <span><strong class="command">server-addresses</strong></span> option,
+ the following RRs will be internally configured.
+ </p>
+<pre class="programlisting">example.com. NS example.com.
+example.com. A 192.0.2.1
+example.com. AAAA 2001:db8::1234</pre>
+<p>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ will initiate recursive resolution and send
+ queries to 192.0.2.1 and/or 2001:db8::1234.
+ </p>
+</dd>
+<dt><span class="term"><span><strong class="command">server-names</strong></span></span></dt>
+<dd>
+<p>
+ Only meaningful for static-stub zones.
+ This is a list of domain names of nameservers that
+ act as authoritative servers of the static-stub
+ zone.
+ These names will be resolved to IP addresses when
+ <span><strong class="command">named</strong></span> needs to send queries to
+ these servers.
+ To make this supplemental resolution successful,
+ these names must not be a subdomain of the origin
+ name of static-stub zone.
+ That is, when "example.net" is the origin of a
+ static-stub zone, "ns.example" and
+ "master.example.com" can be specified in the
+ <span><strong class="command">server-names</strong></span> option, but
+ "ns.example.net" cannot, and will be rejected by
+ the configuration parser.
+ </p>
+<p>
+ A non empty list for this option will internally
+ configure the apex NS RR with the specified names.
+ For example, if "example.com" is configured as a
+ static-stub zone with "ns1.example.net" and
+ "ns2.example.net"
+ in a <span><strong class="command">server-names</strong></span> option,
+ the following RRs will be internally configured.
+ </p>
+<pre class="programlisting">example.com. NS ns1.example.net.
+example.com. NS ns2.example.net.
+</pre>
+<p>
+ These records are internally used to resolve
+ names under the static-stub zone.
+ For instance, if the server receives a query for
+ "www.example.com" with the RD bit on, the server
+ initiate recursive resolution,
+ resolve "ns1.example.net" and/or
+ "ns2.example.net" to IP addresses, and then send
+ queries to (one or more of) these addresses.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">sig-validity-interval</strong></span></span></dt>
<dd><p>
See the description of
@@ -6003,6 +7020,48 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
Usage">the section called &#8220;<span><strong class="command">options</strong></span> Statement Definition and
Usage&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">auto-dnssec</strong></span></span></dt>
+<dd>
+<p>
+ Zones configured for dynamic DNS may also use this
+ option to allow varying levels of automatic DNSSEC key
+ management. There are four possible settings:
+ </p>
+<p>
+ <span><strong class="command">auto-dnssec allow;</strong></span> permits
+ keys to be updated and the zone fully re-signed
+ whenever the user issues the command <span><strong class="command">rndc sign
+ <em class="replaceable"><code>zonename</code></em></strong></span>.
+ </p>
+<p>
+ <span><strong class="command">auto-dnssec maintain;</strong></span> includes the
+ above, but also automatically adjusts the zone's DNSSEC
+ keys on schedule, according to the keys' timing metadata
+ (see <a href="man.dnssec-keygen.html" title="dnssec-keygen"><span class="refentrytitle"><span class="application">dnssec-keygen</span></span>(8)</a> and
+ <a href="man.dnssec-settime.html" title="dnssec-settime"><span class="refentrytitle"><span class="application">dnssec-settime</span></span>(8)</a>). The command
+ <span><strong class="command">rndc sign
+ <em class="replaceable"><code>zonename</code></em></strong></span> causes
+ <span><strong class="command">named</strong></span> to load keys from the key
+ repository and sign the zone with all keys that are
+ active.
+ <span><strong class="command">rndc loadkeys
+ <em class="replaceable"><code>zonename</code></em></strong></span> causes
+ <span><strong class="command">named</strong></span> to load keys from the key
+ repository and schedule key maintenance events to occur
+ in the future, but it does not sign the full zone
+ immediately.
+ </p>
+<p>
+ <span><strong class="command">auto-dnssec create;</strong></span> includes the
+ above, but also allows <span><strong class="command">named</strong></span>
+ to create new keys in the key repository when needed.
+ (NOTE: This option is not yet implemented; the syntax is
+ being reserved for future use.)
+ </p>
+<p>
+ The default setting is <span><strong class="command">auto-dnssec off</strong></span>.
+ </p>
+</dd>
<dt><span class="term"><span><strong class="command">multi-master</strong></span></span></dt>
<dd><p>
See the description of <span><strong class="command">multi-master</strong></span> in
@@ -6013,6 +7072,11 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
See the description of <span><strong class="command">masterfile-format</strong></span>
in <a href="Bv9ARM.ch06.html#tuning" title="Tuning">the section called &#8220;Tuning&#8221;</a>.
</p></dd>
+<dt><span class="term"><span><strong class="command">dnssec-secure-to-insecure</strong></span></span></dt>
+<dd><p>
+ See the description of
+ <span><strong class="command">dnssec-secure-to-insecure</strong></span> in <a href="Bv9ARM.ch06.html#boolean_options" title="Boolean Options">the section called &#8220;Boolean Options&#8221;</a>.
+ </p></dd>
</dl></div>
</div>
<div class="sect3" lang="en">
@@ -6031,15 +7095,14 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
record of any name in the zone.
</p>
<p>
- The <span><strong class="command">update-policy</strong></span> clause is new
- in <acronym class="acronym">BIND</acronym> 9 and allows more fine-grained
- control over what updates are allowed. A set of rules
- is specified, where each rule either grants or denies
- permissions for one or more names to be updated by
- one or more identities. If the dynamic update request
- message is signed (that is, it includes either a TSIG
- or SIG(0) record), the identity of the signer can be
- determined.
+ The <span><strong class="command">update-policy</strong></span> clause
+ allows more fine-grained control over what updates are
+ allowed. A set of rules is specified, where each rule
+ either grants or denies permissions for one or more
+ names to be updated by one or more identities. If
+ the dynamic update request message is signed (that is,
+ it includes either a TSIG or SIG(0) record), the
+ identity of the signer can be determined.
</p>
<p>
Rules are specified in the <span><strong class="command">update-policy</strong></span>
@@ -6052,20 +7115,47 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
address is not relevant.
</p>
<p>
- This is how a rule definition looks:
+ There is a pre-defined <span><strong class="command">update-policy</strong></span>
+ rule which can be switched on with the command
+ <span><strong class="command">update-policy local;</strong></span>.
+ Switching on this rule in a zone causes
+ <span><strong class="command">named</strong></span> to generate a TSIG session
+ key and place it in a file, and to allow that key
+ to update the zone. (By default, the file is
+ <code class="filename">/var/run/named/session.key</code>, the key
+ name is "local-ddns" and the key algorithm is HMAC-SHA256,
+ but these values are configurable with the
+ <span><strong class="command">session-keyfile</strong></span>,
+ <span><strong class="command">session-keyname</strong></span> and
+ <span><strong class="command">session-keyalg</strong></span> options, respectively).
+ </p>
+<p>
+ A client running on the local system, and with appropriate
+ permissions, may read that file and use the key to sign update
+ requests. The zone's update policy will be set to allow that
+ key to change any record within the zone. Assuming the
+ key name is "local-ddns", this policy is equivalent to:
+ </p>
+<pre class="programlisting">update-policy { grant local-ddns zonesub any; };
+ </pre>
+<p>
+ The command <span><strong class="command">nsupdate -l</strong></span> sends update
+ requests to localhost, and signs them using the session key.
+ </p>
+<p>
+ Other rule definitions look like this:
</p>
<pre class="programlisting">
-( <span><strong class="command">grant</strong></span> | <span><strong class="command">deny</strong></span> ) <em class="replaceable"><code>identity</code></em> <em class="replaceable"><code>nametype</code></em> <em class="replaceable"><code>name</code></em> [<span class="optional"> <em class="replaceable"><code>types</code></em> </span>]
+( <span><strong class="command">grant</strong></span> | <span><strong class="command">deny</strong></span> ) <em class="replaceable"><code>identity</code></em> <em class="replaceable"><code>nametype</code></em> [<span class="optional"> <em class="replaceable"><code>name</code></em> </span>] [<span class="optional"> <em class="replaceable"><code>types</code></em> </span>]
</pre>
<p>
Each rule grants or denies privileges. Once a message has
successfully matched a rule, the operation is immediately
- granted
- or denied and no further rules are examined. A rule is matched
- when the signer matches the identity field, the name matches the
- name field in accordance with the nametype field, and the type
- matches
- the types specified in the type field.
+ granted or denied and no further rules are examined. A rule
+ is matched when the signer matches the identity field, the
+ name matches the name field in accordance with the nametype
+ field, and the type matches the types specified in the type
+ field.
</p>
<p>
No signer is required for <em class="replaceable"><code>tcp-self</code></em>
@@ -6091,7 +7181,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
contain a fully-qualified domain name.
</p>
<p>
- The <em class="replaceable"><code>nametype</code></em> field has 12
+ The <em class="replaceable"><code>nametype</code></em> field has 13
values:
<code class="varname">name</code>, <code class="varname">subdomain</code>,
<code class="varname">wildcard</code>, <code class="varname">self</code>,
@@ -6099,7 +7189,8 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<code class="varname">krb5-self</code>, <code class="varname">ms-self</code>,
<code class="varname">krb5-subdomain</code>,
<code class="varname">ms-subdomain</code>,
- <code class="varname">tcp-self</code> and <code class="varname">6to4-self</code>.
+ <code class="varname">tcp-self</code>, <code class="varname">6to4-self</code>,
+ <code class="varname">zonesub</code>, and <code class="varname">external</code>.
</p>
<div class="informaltable"><table border="1">
<colgroup>
@@ -6140,6 +7231,29 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<tr>
<td>
<p>
+ <code class="varname">zonesub</code>
+ </p>
+ </td>
+<td>
+ <p>
+ This rule is similar to subdomain, except that
+ it matches when the name being updated is a
+ subdomain of the zone in which the
+ <span><strong class="command">update-policy</strong></span> statement
+ appears. This obviates the need to type the zone
+ name twice, and enables the use of a standard
+ <span><strong class="command">update-policy</strong></span> statement in
+ multiple zones without modification.
+ </p>
+ <p>
+ When this rule is used, the
+ <em class="replaceable"><code>name</code></em> field is omitted.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="varname">wildcard</code>
</p>
</td>
@@ -6233,7 +7347,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
<td>
<p>
Allow the 6to4 prefix to be update by any TCP
- conection from the 6to4 network or from the
+ connection from the 6to4 network or from the
corresponding IPv4 address. This is intended
to allow NS or DNAME RRsets to be added to the
reverse tree.
@@ -6245,12 +7359,55 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
</td>
</tr>
+<tr>
+<td>
+ <p>
+ <code class="varname">external</code>
+ </p>
+ </td>
+<td>
+ <p>
+ This rule allows <span><strong class="command">named</strong></span>
+ to defer the decision of whether to allow a
+ given update to an external daemon.
+ </p>
+ <p>
+ The method of communicating with the daemon is
+ specified in the <em class="replaceable"><code>identity</code></em>
+ field, the format of which is
+ "<code class="constant">local:</code><em class="replaceable"><code>path</code></em>",
+ where <em class="replaceable"><code>path</code></em> is the location
+ of a UNIX-domain socket. (Currently, "local" is the
+ only supported mechanism.)
+ </p>
+ <p>
+ Requests to the external daemon are sent over the
+ UNIX-domain socket as datagrams with the following
+ format:
+ </p>
+ <pre class="programlisting">
+ Protocol version number (4 bytes, network byte order, currently 1)
+ Request length (4 bytes, network byte order)
+ Signer (null-terminated string)
+ Name (null-terminated string)
+ TCP source address (null-terminated string)
+ Rdata type (null-terminated string)
+ Key (null-terminated string)
+ TKEY token length (4 bytes, network byte order)
+ TKEY token (remainder of packet)</pre>
+ <p>
+ The daemon replies with a four-byte value in
+ network byte order, containing either 0 or 1; 0
+ indicates that the specified update is not
+ permitted, and 1 indicates that it is.
+ </p>
+ </td>
+</tr>
</tbody>
</table></div>
<p>
In all cases, the <em class="replaceable"><code>name</code></em>
- field must
- specify a fully-qualified domain name.
+ field must specify a fully-qualified domain name.
</p>
<p>
If no types are explicitly specified, this rule matches
@@ -6266,7 +7423,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2591216"></a>Zone File</h2></div></div></div>
+<a name="id2594660"></a>Zone File</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="types_of_resource_records_and_when_to_use_them"></a>Types of Resource Records and When to Use Them</h3></div></div></div>
@@ -6279,7 +7436,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2591234"></a>Resource Records</h4></div></div></div>
+<a name="id2594678"></a>Resource Records</h4></div></div></div>
<p>
A domain name identifies a node. Each node has a set of
resource information, which may be empty. The set of resource
@@ -7016,7 +8173,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2592857"></a>Textual expression of RRs</h4></div></div></div>
+<a name="id2596301"></a>Textual expression of RRs</h4></div></div></div>
<p>
RRs are represented in binary form in the packets of the DNS
protocol, and are usually represented in highly encoded form
@@ -7219,7 +8376,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2593378"></a>Discussion of MX Records</h3></div></div></div>
+<a name="id2596822"></a>Discussion of MX Records</h3></div></div></div>
<p>
As described above, domain servers store information as a
series of resource records, each of which contains a particular
@@ -7475,7 +8632,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2593993"></a>Inverse Mapping in IPv4</h3></div></div></div>
+<a name="id2597574"></a>Inverse Mapping in IPv4</h3></div></div></div>
<p>
Reverse name resolution (that is, translation from IP address
to name) is achieved by means of the <span class="emphasis"><em>in-addr.arpa</em></span> domain
@@ -7536,7 +8693,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2594188"></a>Other Zone File Directives</h3></div></div></div>
+<a name="id2597701"></a>Other Zone File Directives</h3></div></div></div>
<p>
The Master File Format was initially defined in RFC 1035 and
has subsequently been extended. While the Master File Format
@@ -7551,7 +8708,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594211"></a>The <span><strong class="command">@</strong></span> (at-sign)</h4></div></div></div>
+<a name="id2597723"></a>The <span><strong class="command">@</strong></span> (at-sign)</h4></div></div></div>
<p>
When used in the label (or name) field, the asperand or
at-sign (@) symbol represents the current origin.
@@ -7562,7 +8719,7 @@ zone <em class="replaceable"><code>zone_name</code></em> [<span class="optional"
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594227"></a>The <span><strong class="command">$ORIGIN</strong></span> Directive</h4></div></div></div>
+<a name="id2597739"></a>The <span><strong class="command">$ORIGIN</strong></span> Directive</h4></div></div></div>
<p>
Syntax: <span><strong class="command">$ORIGIN</strong></span>
<em class="replaceable"><code>domain-name</code></em>
@@ -7591,7 +8748,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594356"></a>The <span><strong class="command">$INCLUDE</strong></span> Directive</h4></div></div></div>
+<a name="id2597868"></a>The <span><strong class="command">$INCLUDE</strong></span> Directive</h4></div></div></div>
<p>
Syntax: <span><strong class="command">$INCLUDE</strong></span>
<em class="replaceable"><code>filename</code></em>
@@ -7627,7 +8784,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2594425"></a>The <span><strong class="command">$TTL</strong></span> Directive</h4></div></div></div>
+<a name="id2597938"></a>The <span><strong class="command">$TTL</strong></span> Directive</h4></div></div></div>
<p>
Syntax: <span><strong class="command">$TTL</strong></span>
<em class="replaceable"><code>default-ttl</code></em>
@@ -7646,7 +8803,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2594461"></a><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</h3></div></div></div>
+<a name="id2597974"></a><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</h3></div></div></div>
<p>
Syntax: <span><strong class="command">$GENERATE</strong></span>
<em class="replaceable"><code>range</code></em>
@@ -7666,7 +8823,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.
Classless IN-ADDR.ARPA delegation.
</p>
<pre class="programlisting">$ORIGIN 0.0.192.IN-ADDR.ARPA.
-$GENERATE 1-2 0 NS SERVER$.EXAMPLE.
+$GENERATE 1-2 @ NS SERVER$.EXAMPLE.
$GENERATE 1-127 $ CNAME $.0</pre>
<p>
is equivalent to
@@ -7678,6 +8835,28 @@ $GENERATE 1-127 $ CNAME $.0</pre>
...
127.0.0.192.IN-ADDR.ARPA. CNAME 127.0.0.0.192.IN-ADDR.ARPA.
</pre>
+<p>
+ Generate a set of A and MX records. Note the MX's right hand
+ side is a quoted string. The quotes will be stripped when the
+ right hand side is processed.
+ </p>
+<pre class="programlisting">
+$ORIGIN EXAMPLE.
+$GENERATE 1-127 HOST-$ A 1.2.3.$
+$GENERATE 1-127 HOST-$ MX "0 ."</pre>
+<p>
+ is equivalent to
+ </p>
+<pre class="programlisting">HOST-1.EXAMPLE. A 1.2.3.1
+HOST-1.EXAMPLE. MX 0 .
+HOST-2.EXAMPLE. A 1.2.3.2
+HOST-2.EXAMPLE. MX 0 .
+HOST-3.EXAMPLE. A 1.2.3.3
+HOST-3.EXAMPLE. MX 0 .
+...
+HOST-127.EXAMPLE. A 1.2.3.127
+HOST-127.EXAMPLE. MX 0 .
+</pre>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -7728,8 +8907,10 @@ $GENERATE 1-127 $ CNAME $.0</pre>
Available output forms are decimal
(<span><strong class="command">d</strong></span>), octal
- (<span><strong class="command">o</strong></span>) and hexadecimal
+ (<span><strong class="command">o</strong></span>), hexadecimal
(<span><strong class="command">x</strong></span> or <span><strong class="command">X</strong></span>
+ for uppercase) and nibble
+ (<span><strong class="command">n</strong></span> or <span><strong class="command">N</strong></span>\
for uppercase). The default modifier is
<span><strong class="command">${0,0,d}</strong></span>. If the
<span><strong class="command">lhs</strong></span> is not absolute, the
@@ -7737,8 +8918,16 @@ $GENERATE 1-127 $ CNAME $.0</pre>
to the name.
</p>
<p>
- For compatibility with earlier versions, <span><strong class="command">$$</strong></span> is still
- recognized as indicating a literal $ in the output.
+ In nibble mode the value will be treated as
+ if it was a reversed hexadecimal string
+ with each hexadecimal digit as a separate
+ label. The width field includes the label
+ separator.
+ </p>
+ <p>
+ For compatibility with earlier versions,
+ <span><strong class="command">$$</strong></span> is still recognized as
+ indicating a literal $ in the output.
</p>
</td>
</tr>
@@ -7780,8 +8969,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</td>
<td>
<p>
- At present the only supported types are
- PTR, CNAME, DNAME, A, AAAA and NS.
+ Any valid type.
</p>
</td>
</tr>
@@ -7791,8 +8979,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</td>
<td>
<p>
- <span><strong class="command">rhs</strong></span> is a domain name. It is processed
- similarly to lhs.
+ <span><strong class="command">rhs</strong></span>, optionally, quoted string.
</p>
</td>
</tr>
@@ -7942,9 +9129,12 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</td>
<td>
<p>
- The number of RRsets per RR type (positive
- or negative) and nonexistent names stored in the
- cache database.
+ The number of RRsets per RR type and nonexistent
+ names stored in the cache database.
+ If the exclamation mark (!) is printed for a RR
+ type, it means that particular type of RRset is
+ known to be nonexistent (this is also known as
+ "NXRRSET").
Maintained per view.
</p>
</td>
@@ -8037,7 +9227,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</p>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2595458"></a>Name Server Statistics Counters</h4></div></div></div>
+<a name="id2598928"></a>Name Server Statistics Counters</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -8594,7 +9784,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2596931"></a>Zone Maintenance Statistics Counters</h4></div></div></div>
+<a name="id2600401"></a>Zone Maintenance Statistics Counters</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -8748,7 +9938,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2597314"></a>Resolver Statistics Counters</h4></div></div></div>
+<a name="id2600852"></a>Resolver Statistics Counters</h4></div></div></div>
<div class="informaltable"><table border="1">
<colgroup>
<col>
@@ -8900,6 +10090,13 @@ $GENERATE 1-127 $ CNAME $.0</pre>
<td>
<p>
Mismatch responses received.
+ The DNS ID, response's source address,
+ and/or the response's source port does not
+ match what was expected.
+ (The port must be 53 or as defined by
+ the <span><strong class="command">port</strong></span> option.)
+ This may be an indication of a cache
+ poisoning attempt.
</p>
</td>
</tr>
@@ -9124,7 +10321,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2598332"></a>Socket I/O Statistics Counters</h4></div></div></div>
+<a name="id2601942"></a>Socket I/O Statistics Counters</h4></div></div></div>
<p>
Socket I/O statistics counters are defined per socket
types, which are
@@ -9279,7 +10476,7 @@ $GENERATE 1-127 $ CNAME $.0</pre>
</div>
<div class="sect3" lang="en">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2598842"></a>Compatibility with <span class="emphasis"><em>BIND</em></span> 8 Counters</h4></div></div></div>
+<a name="id2602384"></a>Compatibility with <span class="emphasis"><em>BIND</em></span> 8 Counters</h4></div></div></div>
<p>
Most statistics counters that were available
in <span><strong class="command">BIND</strong></span> 8 are also supported in
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch07.html b/contrib/bind9/doc/arm/Bv9ARM.ch07.html
index ce23cad..371f4a9 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch07.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch07.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch07.html,v 1.178.14.15 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch07.html,v 1.242.8.1.2.1 2011-06-09 03:41:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -46,10 +46,10 @@
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#Access_Control_Lists">Access Control Lists</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2599016"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2602626"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599234">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599362">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602707">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602766">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#dynamic_update_security">Dynamic Update Security</a></span></dt>
</dl>
@@ -80,14 +80,17 @@
Here is an example of how to properly apply ACLs:
</p>
<pre class="programlisting">
-// Set up an ACL named "bogusnets" that will block RFC1918 space
-// and some reserved space, which is commonly used in spoofing attacks.
+// Set up an ACL named "bogusnets" that will block
+// RFC1918 space and some reserved space, which is
+// commonly used in spoofing attacks.
acl bogusnets {
- 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3;
- 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
+ 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24;
+ 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12;
+ 192.168.0.0/16;
};
-// Set up an ACL called our-nets. Replace this with the real IP numbers.
+// Set up an ACL called our-nets. Replace this with the
+// real IP numbers.
acl our-nets { x.x.x.x/24; x.x.x.x/21; };
options {
...
@@ -119,7 +122,7 @@ zone "example.com" {
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599016"></a><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span>
+<a name="id2602626"></a><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span>
</h2></div></div></div>
<p>
On UNIX servers, it is possible to run <acronym class="acronym">BIND</acronym>
@@ -145,7 +148,7 @@ zone "example.com" {
</p>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2599234"></a>The <span><strong class="command">chroot</strong></span> Environment</h3></div></div></div>
+<a name="id2602707"></a>The <span><strong class="command">chroot</strong></span> Environment</h3></div></div></div>
<p>
In order for a <span><strong class="command">chroot</strong></span> environment
to
@@ -173,7 +176,7 @@ zone "example.com" {
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2599362"></a>Using the <span><strong class="command">setuid</strong></span> Function</h3></div></div></div>
+<a name="id2602766"></a>Using the <span><strong class="command">setuid</strong></span> Function</h3></div></div></div>
<p>
Prior to running the <span><strong class="command">named</strong></span> daemon,
use
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch08.html b/contrib/bind9/doc/arm/Bv9ARM.ch08.html
index bb9ecc8..0681e47 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch08.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch08.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch08.html,v 1.178.14.15 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch08.html,v 1.242.8.1.2.1 2011-06-09 03:41:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,18 +45,18 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599442">Common Problems</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2599447">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599459">Incrementing and Changing the Serial Number</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599476">Where Can I Get Help?</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602915">Common Problems</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2602920">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602932">Incrementing and Changing the Serial Number</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602949">Where Can I Get Help?</a></span></dt>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599442"></a>Common Problems</h2></div></div></div>
+<a name="id2602915"></a>Common Problems</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2599447"></a>It's not working; how can I figure out what's wrong?</h3></div></div></div>
+<a name="id2602920"></a>It's not working; how can I figure out what's wrong?</h3></div></div></div>
<p>
The best solution to solving installation and
configuration issues is to take preventative measures by setting
@@ -68,7 +68,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599459"></a>Incrementing and Changing the Serial Number</h2></div></div></div>
+<a name="id2602932"></a>Incrementing and Changing the Serial Number</h2></div></div></div>
<p>
Zone serial numbers are just numbers &#8212; they aren't
date related. A lot of people set them to a number that
@@ -95,7 +95,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599476"></a>Where Can I Get Help?</h2></div></div></div>
+<a name="id2602949"></a>Where Can I Get Help?</h2></div></div></div>
<p>
The Internet Systems Consortium
(<acronym class="acronym">ISC</acronym>) offers a wide range
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch09.html b/contrib/bind9/doc/arm/Bv9ARM.ch09.html
index c5bd994..fd53237 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch09.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch09.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch09.html,v 1.180.16.16 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch09.html,v 1.246.8.1.2.1 2011-06-09 03:41:08 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -45,21 +45,31 @@
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599606">Acknowledgments</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603147">Acknowledgments</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#historical_dns_information">A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599778">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603319">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#ipv6addresses">IPv6 addresses (AAAA)</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bibliography">Bibliography (and Suggested Reading)</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#rfcs">Request for Comments (RFCs)</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#internet_drafts">Internet Drafts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2603126">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2606462">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bind9.library">BIND 9 DNS Library Support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608789">Prerequisite</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608798">Compilation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608004">Installation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608035">Known Defects/Restrictions</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608112">The dns.conf File</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608138">Sample Applications</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2609111">Library References</a></span></dt>
</dl></dd>
</dl>
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599606"></a>Acknowledgments</h2></div></div></div>
+<a name="id2603147"></a>Acknowledgments</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="historical_dns_information"></a>A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym>
@@ -162,7 +172,7 @@
</div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="id2599778"></a>General <acronym class="acronym">DNS</acronym> Reference Information</h2></div></div></div>
+<a name="id2603319"></a>General <acronym class="acronym">DNS</acronym> Reference Information</h2></div></div></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="ipv6addresses"></a>IPv6 addresses (AAAA)</h3></div></div></div>
@@ -250,17 +260,17 @@
</p>
<div class="bibliography">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2599897"></a>Bibliography</h4></div></div></div>
+<a name="id2603507"></a>Bibliography</h4></div></div></div>
<div class="bibliodiv">
<h3 class="title">Standards</h3>
<div class="biblioentry">
-<a name="id2599908"></a><p>[<abbr class="abbrev">RFC974</abbr>] <span class="author"><span class="firstname">C.</span> <span class="surname">Partridge</span>. </span><span class="title"><i>Mail Routing and the Domain System</i>. </span><span class="pubdate">January 1986. </span></p>
+<a name="id2603517"></a><p>[<abbr class="abbrev">RFC974</abbr>] <span class="author"><span class="firstname">C.</span> <span class="surname">Partridge</span>. </span><span class="title"><i>Mail Routing and the Domain System</i>. </span><span class="pubdate">January 1986. </span></p>
</div>
<div class="biblioentry">
-<a name="id2599931"></a><p>[<abbr class="abbrev">RFC1034</abbr>] <span class="author"><span class="firstname">P.V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Concepts and Facilities</i>. </span><span class="pubdate">November 1987. </span></p>
+<a name="id2603541"></a><p>[<abbr class="abbrev">RFC1034</abbr>] <span class="author"><span class="firstname">P.V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Concepts and Facilities</i>. </span><span class="pubdate">November 1987. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600023"></a><p>[<abbr class="abbrev">RFC1035</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Implementation and
+<a name="id2603564"></a><p>[<abbr class="abbrev">RFC1035</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>Domain Names &#8212; Implementation and
Specification</i>. </span><span class="pubdate">November 1987. </span></p>
</div>
</div>
@@ -268,42 +278,42 @@
<h3 class="title">
<a name="proposed_standards"></a>Proposed Standards</h3>
<div class="biblioentry">
-<a name="id2600059"></a><p>[<abbr class="abbrev">RFC2181</abbr>] <span class="author"><span class="firstname">R., R. Bush</span> <span class="surname">Elz</span>. </span><span class="title"><i>Clarifications to the <acronym class="acronym">DNS</acronym>
+<a name="id2603601"></a><p>[<abbr class="abbrev">RFC2181</abbr>] <span class="author"><span class="firstname">R., R. Bush</span> <span class="surname">Elz</span>. </span><span class="title"><i>Clarifications to the <acronym class="acronym">DNS</acronym>
Specification</i>. </span><span class="pubdate">July 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600086"></a><p>[<abbr class="abbrev">RFC2308</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Andrews</span>. </span><span class="title"><i>Negative Caching of <acronym class="acronym">DNS</acronym>
+<a name="id2603627"></a><p>[<abbr class="abbrev">RFC2308</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Andrews</span>. </span><span class="title"><i>Negative Caching of <acronym class="acronym">DNS</acronym>
Queries</i>. </span><span class="pubdate">March 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600112"></a><p>[<abbr class="abbrev">RFC1995</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Ohta</span>. </span><span class="title"><i>Incremental Zone Transfer in <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">August 1996. </span></p>
+<a name="id2603653"></a><p>[<abbr class="abbrev">RFC1995</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Ohta</span>. </span><span class="title"><i>Incremental Zone Transfer in <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">August 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600136"></a><p>[<abbr class="abbrev">RFC1996</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A Mechanism for Prompt Notification of Zone Changes</i>. </span><span class="pubdate">August 1996. </span></p>
+<a name="id2603677"></a><p>[<abbr class="abbrev">RFC1996</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A Mechanism for Prompt Notification of Zone Changes</i>. </span><span class="pubdate">August 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600160"></a><p>[<abbr class="abbrev">RFC2136</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">Y.</span> <span class="surname">Rekhter</span>, and <span class="firstname">J.</span> <span class="surname">Bound</span>. </span><span class="title"><i>Dynamic Updates in the Domain Name System</i>. </span><span class="pubdate">April 1997. </span></p>
+<a name="id2603701"></a><p>[<abbr class="abbrev">RFC2136</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">Y.</span> <span class="surname">Rekhter</span>, and <span class="firstname">J.</span> <span class="surname">Bound</span>. </span><span class="title"><i>Dynamic Updates in the Domain Name System</i>. </span><span class="pubdate">April 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600215"></a><p>[<abbr class="abbrev">RFC2671</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Extension Mechanisms for DNS (EDNS0)</i>. </span><span class="pubdate">August 1997. </span></p>
+<a name="id2603756"></a><p>[<abbr class="abbrev">RFC2671</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Extension Mechanisms for DNS (EDNS0)</i>. </span><span class="pubdate">August 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600242"></a><p>[<abbr class="abbrev">RFC2672</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Non-Terminal DNS Name Redirection</i>. </span><span class="pubdate">August 1999. </span></p>
+<a name="id2603783"></a><p>[<abbr class="abbrev">RFC2672</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Non-Terminal DNS Name Redirection</i>. </span><span class="pubdate">August 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600268"></a><p>[<abbr class="abbrev">RFC2845</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>, <span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, and <span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secret Key Transaction Authentication for <acronym class="acronym">DNS</acronym> (TSIG)</i>. </span><span class="pubdate">May 2000. </span></p>
+<a name="id2603810"></a><p>[<abbr class="abbrev">RFC2845</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>, <span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, and <span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secret Key Transaction Authentication for <acronym class="acronym">DNS</acronym> (TSIG)</i>. </span><span class="pubdate">May 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600330"></a><p>[<abbr class="abbrev">RFC2930</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secret Key Establishment for DNS (TKEY RR)</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2603872"></a><p>[<abbr class="abbrev">RFC2930</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secret Key Establishment for DNS (TKEY RR)</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600360"></a><p>[<abbr class="abbrev">RFC2931</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DNS Request and Transaction Signatures (SIG(0)s)</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2603901"></a><p>[<abbr class="abbrev">RFC2931</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DNS Request and Transaction Signatures (SIG(0)s)</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600390"></a><p>[<abbr class="abbrev">RFC3007</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secure Domain Name System (DNS) Dynamic Update</i>. </span><span class="pubdate">November 2000. </span></p>
+<a name="id2603931"></a><p>[<abbr class="abbrev">RFC3007</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Secure Domain Name System (DNS) Dynamic Update</i>. </span><span class="pubdate">November 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600417"></a><p>[<abbr class="abbrev">RFC3645</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Kwan</span>, <span class="firstname">P.</span> <span class="surname">Garg</span>, <span class="firstname">J.</span> <span class="surname">Gilroy</span>, <span class="firstname">L.</span> <span class="surname">Esibov</span>, <span class="firstname">J.</span> <span class="surname">Westhead</span>, and <span class="firstname">R.</span> <span class="surname">Hall</span>. </span><span class="title"><i>Generic Security Service Algorithm for Secret
+<a name="id2603958"></a><p>[<abbr class="abbrev">RFC3645</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Kwan</span>, <span class="firstname">P.</span> <span class="surname">Garg</span>, <span class="firstname">J.</span> <span class="surname">Gilroy</span>, <span class="firstname">L.</span> <span class="surname">Esibov</span>, <span class="firstname">J.</span> <span class="surname">Westhead</span>, and <span class="firstname">R.</span> <span class="surname">Hall</span>. </span><span class="title"><i>Generic Security Service Algorithm for Secret
Key Transaction Authentication for DNS
(GSS-TSIG)</i>. </span><span class="pubdate">October 2003. </span></p>
</div>
@@ -312,19 +322,19 @@
<h3 class="title">
<acronym class="acronym">DNS</acronym> Security Proposed Standards</h3>
<div class="biblioentry">
-<a name="id2600499"></a><p>[<abbr class="abbrev">RFC3225</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Conrad</span>. </span><span class="title"><i>Indicating Resolver Support of DNSSEC</i>. </span><span class="pubdate">December 2001. </span></p>
+<a name="id2604040"></a><p>[<abbr class="abbrev">RFC3225</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Conrad</span>. </span><span class="title"><i>Indicating Resolver Support of DNSSEC</i>. </span><span class="pubdate">December 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600525"></a><p>[<abbr class="abbrev">RFC3833</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Atkins</span> and <span class="firstname">R.</span> <span class="surname">Austein</span>. </span><span class="title"><i>Threat Analysis of the Domain Name System (DNS)</i>. </span><span class="pubdate">August 2004. </span></p>
+<a name="id2604067"></a><p>[<abbr class="abbrev">RFC3833</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Atkins</span> and <span class="firstname">R.</span> <span class="surname">Austein</span>. </span><span class="title"><i>Threat Analysis of the Domain Name System (DNS)</i>. </span><span class="pubdate">August 2004. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600562"></a><p>[<abbr class="abbrev">RFC4033</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>DNS Security Introduction and Requirements</i>. </span><span class="pubdate">March 2005. </span></p>
+<a name="id2604103"></a><p>[<abbr class="abbrev">RFC4033</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>DNS Security Introduction and Requirements</i>. </span><span class="pubdate">March 2005. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600627"></a><p>[<abbr class="abbrev">RFC4034</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Resource Records for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p>
+<a name="id2604168"></a><p>[<abbr class="abbrev">RFC4034</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Resource Records for the DNS Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600692"></a><p>[<abbr class="abbrev">RFC4035</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Protocol Modifications for the DNS
+<a name="id2604233"></a><p>[<abbr class="abbrev">RFC4035</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Arends</span>, <span class="firstname">R.</span> <span class="surname">Austein</span>, <span class="firstname">M.</span> <span class="surname">Larson</span>, <span class="firstname">D.</span> <span class="surname">Massey</span>, and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Protocol Modifications for the DNS
Security Extensions</i>. </span><span class="pubdate">March 2005. </span></p>
</div>
</div>
@@ -332,146 +342,146 @@
<h3 class="title">Other Important RFCs About <acronym class="acronym">DNS</acronym>
Implementation</h3>
<div class="biblioentry">
-<a name="id2600765"></a><p>[<abbr class="abbrev">RFC1535</abbr>] <span class="author"><span class="firstname">E.</span> <span class="surname">Gavron</span>. </span><span class="title"><i>A Security Problem and Proposed Correction With Widely
+<a name="id2604375"></a><p>[<abbr class="abbrev">RFC1535</abbr>] <span class="author"><span class="firstname">E.</span> <span class="surname">Gavron</span>. </span><span class="title"><i>A Security Problem and Proposed Correction With Widely
Deployed <acronym class="acronym">DNS</acronym> Software.</i>. </span><span class="pubdate">October 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600791"></a><p>[<abbr class="abbrev">RFC1536</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Kumar</span>, <span class="firstname">J.</span> <span class="surname">Postel</span>, <span class="firstname">C.</span> <span class="surname">Neuman</span>, <span class="firstname">P.</span> <span class="surname">Danzig</span>, and <span class="firstname">S.</span> <span class="surname">Miller</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Implementation
+<a name="id2604401"></a><p>[<abbr class="abbrev">RFC1536</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Kumar</span>, <span class="firstname">J.</span> <span class="surname">Postel</span>, <span class="firstname">C.</span> <span class="surname">Neuman</span>, <span class="firstname">P.</span> <span class="surname">Danzig</span>, and <span class="firstname">S.</span> <span class="surname">Miller</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Implementation
Errors and Suggested Fixes</i>. </span><span class="pubdate">October 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600859"></a><p>[<abbr class="abbrev">RFC1982</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Elz</span> and <span class="firstname">R.</span> <span class="surname">Bush</span>. </span><span class="title"><i>Serial Number Arithmetic</i>. </span><span class="pubdate">August 1996. </span></p>
+<a name="id2604469"></a><p>[<abbr class="abbrev">RFC1982</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Elz</span> and <span class="firstname">R.</span> <span class="surname">Bush</span>. </span><span class="title"><i>Serial Number Arithmetic</i>. </span><span class="pubdate">August 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600894"></a><p>[<abbr class="abbrev">RFC4074</abbr>] <span class="authorgroup"><span class="firstname">Y.</span> <span class="surname">Morishita</span> and <span class="firstname">T.</span> <span class="surname">Jinmei</span>. </span><span class="title"><i>Common Misbehaviour Against <acronym class="acronym">DNS</acronym>
+<a name="id2604504"></a><p>[<abbr class="abbrev">RFC4074</abbr>] <span class="authorgroup"><span class="firstname">Y.</span> <span class="surname">Morishita</span> and <span class="firstname">T.</span> <span class="surname">Jinmei</span>. </span><span class="title"><i>Common Misbehaviour Against <acronym class="acronym">DNS</acronym>
Queries for IPv6 Addresses</i>. </span><span class="pubdate">May 2005. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">Resource Record Types</h3>
<div class="biblioentry">
-<a name="id2600940"></a><p>[<abbr class="abbrev">RFC1183</abbr>] <span class="authorgroup"><span class="firstname">C.F.</span> <span class="surname">Everhart</span>, <span class="firstname">L. A.</span> <span class="surname">Mamakos</span>, <span class="firstname">R.</span> <span class="surname">Ullmann</span>, and <span class="firstname">P.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>New <acronym class="acronym">DNS</acronym> RR Definitions</i>. </span><span class="pubdate">October 1990. </span></p>
+<a name="id2604550"></a><p>[<abbr class="abbrev">RFC1183</abbr>] <span class="authorgroup"><span class="firstname">C.F.</span> <span class="surname">Everhart</span>, <span class="firstname">L. A.</span> <span class="surname">Mamakos</span>, <span class="firstname">R.</span> <span class="surname">Ullmann</span>, and <span class="firstname">P.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i>New <acronym class="acronym">DNS</acronym> RR Definitions</i>. </span><span class="pubdate">October 1990. </span></p>
</div>
<div class="biblioentry">
-<a name="id2600998"></a><p>[<abbr class="abbrev">RFC1706</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">R.</span> <span class="surname">Colella</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> NSAP Resource Records</i>. </span><span class="pubdate">October 1994. </span></p>
+<a name="id2604608"></a><p>[<abbr class="abbrev">RFC1706</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">R.</span> <span class="surname">Colella</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> NSAP Resource Records</i>. </span><span class="pubdate">October 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601035"></a><p>[<abbr class="abbrev">RFC2168</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Daniel</span> and <span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="title"><i>Resolution of Uniform Resource Identifiers using
+<a name="id2604645"></a><p>[<abbr class="abbrev">RFC2168</abbr>] <span class="authorgroup"><span class="firstname">R.</span> <span class="surname">Daniel</span> and <span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="title"><i>Resolution of Uniform Resource Identifiers using
the Domain Name System</i>. </span><span class="pubdate">June 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601070"></a><p>[<abbr class="abbrev">RFC1876</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Davis</span>, <span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">T.</span>, and <span class="firstname">I.</span> <span class="surname">Dickinson</span>. </span><span class="title"><i>A Means for Expressing Location Information in the
+<a name="id2604680"></a><p>[<abbr class="abbrev">RFC1876</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Davis</span>, <span class="firstname">P.</span> <span class="surname">Vixie</span>, <span class="firstname">T.</span>, and <span class="firstname">I.</span> <span class="surname">Dickinson</span>. </span><span class="title"><i>A Means for Expressing Location Information in the
Domain
Name System</i>. </span><span class="pubdate">January 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601125"></a><p>[<abbr class="abbrev">RFC2052</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A <acronym class="acronym">DNS</acronym> RR for Specifying the
+<a name="id2604734"></a><p>[<abbr class="abbrev">RFC2052</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>A <acronym class="acronym">DNS</acronym> RR for Specifying the
Location of
Services.</i>. </span><span class="pubdate">October 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601163"></a><p>[<abbr class="abbrev">RFC2163</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Allocchio</span>. </span><span class="title"><i>Using the Internet <acronym class="acronym">DNS</acronym> to
+<a name="id2604773"></a><p>[<abbr class="abbrev">RFC2163</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Allocchio</span>. </span><span class="title"><i>Using the Internet <acronym class="acronym">DNS</acronym> to
Distribute MIXER
Conformant Global Address Mapping</i>. </span><span class="pubdate">January 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601189"></a><p>[<abbr class="abbrev">RFC2230</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Atkinson</span>. </span><span class="title"><i>Key Exchange Delegation Record for the <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">October 1997. </span></p>
+<a name="id2604798"></a><p>[<abbr class="abbrev">RFC2230</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Atkinson</span>. </span><span class="title"><i>Key Exchange Delegation Record for the <acronym class="acronym">DNS</acronym></i>. </span><span class="pubdate">October 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601214"></a><p>[<abbr class="abbrev">RFC2536</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DSA KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604824"></a><p>[<abbr class="abbrev">RFC2536</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>DSA KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601241"></a><p>[<abbr class="abbrev">RFC2537</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/MD5 KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604851"></a><p>[<abbr class="abbrev">RFC2537</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/MD5 KEYs and SIGs in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601268"></a><p>[<abbr class="abbrev">RFC2538</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Storing Certificates in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604877"></a><p>[<abbr class="abbrev">RFC2538</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Storing Certificates in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601307"></a><p>[<abbr class="abbrev">RFC2539</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Storage of Diffie-Hellman Keys in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604917"></a><p>[<abbr class="abbrev">RFC2539</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Storage of Diffie-Hellman Keys in the Domain Name System (DNS)</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601337"></a><p>[<abbr class="abbrev">RFC2540</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Detached Domain Name System (DNS) Information</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2604947"></a><p>[<abbr class="abbrev">RFC2540</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Detached Domain Name System (DNS) Information</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601367"></a><p>[<abbr class="abbrev">RFC2782</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span>. </span><span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="author"><span class="firstname">L.</span> <span class="surname">Esibov</span>. </span><span class="title"><i>A DNS RR for specifying the location of services (DNS SRV)</i>. </span><span class="pubdate">February 2000. </span></p>
+<a name="id2604977"></a><p>[<abbr class="abbrev">RFC2782</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gulbrandsen</span>. </span><span class="author"><span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="author"><span class="firstname">L.</span> <span class="surname">Esibov</span>. </span><span class="title"><i>A DNS RR for specifying the location of services (DNS SRV)</i>. </span><span class="pubdate">February 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601410"></a><p>[<abbr class="abbrev">RFC2915</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="author"><span class="firstname">R.</span> <span class="surname">Daniel</span>. </span><span class="title"><i>The Naming Authority Pointer (NAPTR) DNS Resource Record</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2605019"></a><p>[<abbr class="abbrev">RFC2915</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Mealling</span>. </span><span class="author"><span class="firstname">R.</span> <span class="surname">Daniel</span>. </span><span class="title"><i>The Naming Authority Pointer (NAPTR) DNS Resource Record</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601443"></a><p>[<abbr class="abbrev">RFC3110</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)</i>. </span><span class="pubdate">May 2001. </span></p>
+<a name="id2605052"></a><p>[<abbr class="abbrev">RFC3110</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS)</i>. </span><span class="pubdate">May 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601469"></a><p>[<abbr class="abbrev">RFC3123</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Koch</span>. </span><span class="title"><i>A DNS RR Type for Lists of Address Prefixes (APL RR)</i>. </span><span class="pubdate">June 2001. </span></p>
+<a name="id2605079"></a><p>[<abbr class="abbrev">RFC3123</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Koch</span>. </span><span class="title"><i>A DNS RR Type for Lists of Address Prefixes (APL RR)</i>. </span><span class="pubdate">June 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601493"></a><p>[<abbr class="abbrev">RFC3596</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">C.</span> <span class="surname">Huitema</span>, <span class="firstname">V.</span> <span class="surname">Ksinant</span>, and <span class="firstname">M.</span> <span class="surname">Souissi</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Extensions to support IP
+<a name="id2605102"></a><p>[<abbr class="abbrev">RFC3596</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Thomson</span>, <span class="firstname">C.</span> <span class="surname">Huitema</span>, <span class="firstname">V.</span> <span class="surname">Ksinant</span>, and <span class="firstname">M.</span> <span class="surname">Souissi</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Extensions to support IP
version 6</i>. </span><span class="pubdate">October 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601619"></a><p>[<abbr class="abbrev">RFC3597</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gustafsson</span>. </span><span class="title"><i>Handling of Unknown DNS Resource Record (RR) Types</i>. </span><span class="pubdate">September 2003. </span></p>
+<a name="id2605160"></a><p>[<abbr class="abbrev">RFC3597</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Gustafsson</span>. </span><span class="title"><i>Handling of Unknown DNS Resource Record (RR) Types</i>. </span><span class="pubdate">September 2003. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">
<acronym class="acronym">DNS</acronym> and the Internet</h3>
<div class="biblioentry">
-<a name="id2601651"></a><p>[<abbr class="abbrev">RFC1101</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Network Names
+<a name="id2605192"></a><p>[<abbr class="abbrev">RFC1101</abbr>] <span class="author"><span class="firstname">P. V.</span> <span class="surname">Mockapetris</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Network Names
and Other Types</i>. </span><span class="pubdate">April 1989. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601676"></a><p>[<abbr class="abbrev">RFC1123</abbr>] <span class="author"><span class="surname">Braden</span>. </span><span class="title"><i>Requirements for Internet Hosts - Application and
+<a name="id2605218"></a><p>[<abbr class="abbrev">RFC1123</abbr>] <span class="author"><span class="surname">Braden</span>. </span><span class="title"><i>Requirements for Internet Hosts - Application and
Support</i>. </span><span class="pubdate">October 1989. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601699"></a><p>[<abbr class="abbrev">RFC1591</abbr>] <span class="author"><span class="firstname">J.</span> <span class="surname">Postel</span>. </span><span class="title"><i>Domain Name System Structure and Delegation</i>. </span><span class="pubdate">March 1994. </span></p>
+<a name="id2605240"></a><p>[<abbr class="abbrev">RFC1591</abbr>] <span class="author"><span class="firstname">J.</span> <span class="surname">Postel</span>. </span><span class="title"><i>Domain Name System Structure and Delegation</i>. </span><span class="pubdate">March 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601790"></a><p>[<abbr class="abbrev">RFC2317</abbr>] <span class="authorgroup"><span class="firstname">H.</span> <span class="surname">Eidnes</span>, <span class="firstname">G.</span> <span class="surname">de Groot</span>, and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Classless IN-ADDR.ARPA Delegation</i>. </span><span class="pubdate">March 1998. </span></p>
+<a name="id2605264"></a><p>[<abbr class="abbrev">RFC2317</abbr>] <span class="authorgroup"><span class="firstname">H.</span> <span class="surname">Eidnes</span>, <span class="firstname">G.</span> <span class="surname">de Groot</span>, and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Classless IN-ADDR.ARPA Delegation</i>. </span><span class="pubdate">March 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601836"></a><p>[<abbr class="abbrev">RFC2826</abbr>] <span class="authorgroup"><span class="surname">Internet Architecture Board</span>. </span><span class="title"><i>IAB Technical Comment on the Unique DNS Root</i>. </span><span class="pubdate">May 2000. </span></p>
+<a name="id2605309"></a><p>[<abbr class="abbrev">RFC2826</abbr>] <span class="authorgroup"><span class="surname">Internet Architecture Board</span>. </span><span class="title"><i>IAB Technical Comment on the Unique DNS Root</i>. </span><span class="pubdate">May 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601860"></a><p>[<abbr class="abbrev">RFC2929</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, <span class="firstname">E.</span> <span class="surname">Brunner-Williams</span>, and <span class="firstname">B.</span> <span class="surname">Manning</span>. </span><span class="title"><i>Domain Name System (DNS) IANA Considerations</i>. </span><span class="pubdate">September 2000. </span></p>
+<a name="id2605333"></a><p>[<abbr class="abbrev">RFC2929</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>, <span class="firstname">E.</span> <span class="surname">Brunner-Williams</span>, and <span class="firstname">B.</span> <span class="surname">Manning</span>. </span><span class="title"><i>Domain Name System (DNS) IANA Considerations</i>. </span><span class="pubdate">September 2000. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">
<acronym class="acronym">DNS</acronym> Operations</h3>
<div class="biblioentry">
-<a name="id2601917"></a><p>[<abbr class="abbrev">RFC1033</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Lottor</span>. </span><span class="title"><i>Domain administrators operations guide.</i>. </span><span class="pubdate">November 1987. </span></p>
+<a name="id2605390"></a><p>[<abbr class="abbrev">RFC1033</abbr>] <span class="author"><span class="firstname">M.</span> <span class="surname">Lottor</span>. </span><span class="title"><i>Domain administrators operations guide.</i>. </span><span class="pubdate">November 1987. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601941"></a><p>[<abbr class="abbrev">RFC1537</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Beertema</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Data File
+<a name="id2605414"></a><p>[<abbr class="abbrev">RFC1537</abbr>] <span class="author"><span class="firstname">P.</span> <span class="surname">Beertema</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Data File
Configuration Errors</i>. </span><span class="pubdate">October 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601968"></a><p>[<abbr class="abbrev">RFC1912</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Barr</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Operational and
+<a name="id2605441"></a><p>[<abbr class="abbrev">RFC1912</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Barr</span>. </span><span class="title"><i>Common <acronym class="acronym">DNS</acronym> Operational and
Configuration Errors</i>. </span><span class="pubdate">February 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2601994"></a><p>[<abbr class="abbrev">RFC2010</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Operational Criteria for Root Name Servers.</i>. </span><span class="pubdate">October 1996. </span></p>
+<a name="id2605467"></a><p>[<abbr class="abbrev">RFC2010</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Manning</span> and <span class="firstname">P.</span> <span class="surname">Vixie</span>. </span><span class="title"><i>Operational Criteria for Root Name Servers.</i>. </span><span class="pubdate">October 1996. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602030"></a><p>[<abbr class="abbrev">RFC2219</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Hamilton</span> and <span class="firstname">R.</span> <span class="surname">Wright</span>. </span><span class="title"><i>Use of <acronym class="acronym">DNS</acronym> Aliases for
+<a name="id2605504"></a><p>[<abbr class="abbrev">RFC2219</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Hamilton</span> and <span class="firstname">R.</span> <span class="surname">Wright</span>. </span><span class="title"><i>Use of <acronym class="acronym">DNS</acronym> Aliases for
Network Services.</i>. </span><span class="pubdate">October 1997. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">Internationalized Domain Names</h3>
<div class="biblioentry">
-<a name="id2602076"></a><p>[<abbr class="abbrev">RFC2825</abbr>] <span class="authorgroup"><span class="surname">IAB</span> and <span class="firstname">R.</span> <span class="surname">Daigle</span>. </span><span class="title"><i>A Tangled Web: Issues of I18N, Domain Names,
+<a name="id2605549"></a><p>[<abbr class="abbrev">RFC2825</abbr>] <span class="authorgroup"><span class="surname">IAB</span> and <span class="firstname">R.</span> <span class="surname">Daigle</span>. </span><span class="title"><i>A Tangled Web: Issues of I18N, Domain Names,
and the Other Internet protocols</i>. </span><span class="pubdate">May 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602108"></a><p>[<abbr class="abbrev">RFC3490</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Faltstrom</span>, <span class="firstname">P.</span> <span class="surname">Hoffman</span>, and <span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Internationalizing Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p>
+<a name="id2605581"></a><p>[<abbr class="abbrev">RFC3490</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Faltstrom</span>, <span class="firstname">P.</span> <span class="surname">Hoffman</span>, and <span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Internationalizing Domain Names in Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602154"></a><p>[<abbr class="abbrev">RFC3491</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Hoffman</span> and <span class="firstname">M.</span> <span class="surname">Blanchet</span>. </span><span class="title"><i>Nameprep: A Stringprep Profile for Internationalized Domain Names</i>. </span><span class="pubdate">March 2003. </span></p>
+<a name="id2605627"></a><p>[<abbr class="abbrev">RFC3491</abbr>] <span class="authorgroup"><span class="firstname">P.</span> <span class="surname">Hoffman</span> and <span class="firstname">M.</span> <span class="surname">Blanchet</span>. </span><span class="title"><i>Nameprep: A Stringprep Profile for Internationalized Domain Names</i>. </span><span class="pubdate">March 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602189"></a><p>[<abbr class="abbrev">RFC3492</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Punycode: A Bootstring encoding of Unicode
+<a name="id2605662"></a><p>[<abbr class="abbrev">RFC3492</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Costello</span>. </span><span class="title"><i>Punycode: A Bootstring encoding of Unicode
for Internationalized Domain Names in
Applications (IDNA)</i>. </span><span class="pubdate">March 2003. </span></p>
</div>
@@ -487,47 +497,47 @@
</p>
</div>
<div class="biblioentry">
-<a name="id2602234"></a><p>[<abbr class="abbrev">RFC1464</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Rosenbaum</span>. </span><span class="title"><i>Using the Domain Name System To Store Arbitrary String
+<a name="id2605707"></a><p>[<abbr class="abbrev">RFC1464</abbr>] <span class="author"><span class="firstname">R.</span> <span class="surname">Rosenbaum</span>. </span><span class="title"><i>Using the Domain Name System To Store Arbitrary String
Attributes</i>. </span><span class="pubdate">May 1993. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602257"></a><p>[<abbr class="abbrev">RFC1713</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Romao</span>. </span><span class="title"><i>Tools for <acronym class="acronym">DNS</acronym> Debugging</i>. </span><span class="pubdate">November 1994. </span></p>
+<a name="id2605730"></a><p>[<abbr class="abbrev">RFC1713</abbr>] <span class="author"><span class="firstname">A.</span> <span class="surname">Romao</span>. </span><span class="title"><i>Tools for <acronym class="acronym">DNS</acronym> Debugging</i>. </span><span class="pubdate">November 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602282"></a><p>[<abbr class="abbrev">RFC1794</abbr>] <span class="author"><span class="firstname">T.</span> <span class="surname">Brisco</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Support for Load
+<a name="id2605755"></a><p>[<abbr class="abbrev">RFC1794</abbr>] <span class="author"><span class="firstname">T.</span> <span class="surname">Brisco</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Support for Load
Balancing</i>. </span><span class="pubdate">April 1995. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602308"></a><p>[<abbr class="abbrev">RFC2240</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Legal Basis for Domain Name Allocation</i>. </span><span class="pubdate">November 1997. </span></p>
+<a name="id2605781"></a><p>[<abbr class="abbrev">RFC2240</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Legal Basis for Domain Name Allocation</i>. </span><span class="pubdate">November 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602331"></a><p>[<abbr class="abbrev">RFC2345</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>, <span class="firstname">T.</span> <span class="surname">Wolf</span>, and <span class="firstname">G.</span> <span class="surname">Oglesby</span>. </span><span class="title"><i>Domain Names and Company Name Retrieval</i>. </span><span class="pubdate">May 1998. </span></p>
+<a name="id2605804"></a><p>[<abbr class="abbrev">RFC2345</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>, <span class="firstname">T.</span> <span class="surname">Wolf</span>, and <span class="firstname">G.</span> <span class="surname">Oglesby</span>. </span><span class="title"><i>Domain Names and Company Name Retrieval</i>. </span><span class="pubdate">May 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602377"></a><p>[<abbr class="abbrev">RFC2352</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Convention For Using Legal Names as Domain Names</i>. </span><span class="pubdate">May 1998. </span></p>
+<a name="id2605850"></a><p>[<abbr class="abbrev">RFC2352</abbr>] <span class="author"><span class="firstname">O.</span> <span class="surname">Vaughan</span>. </span><span class="title"><i>A Convention For Using Legal Names as Domain Names</i>. </span><span class="pubdate">May 1998. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602401"></a><p>[<abbr class="abbrev">RFC3071</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>. </span><span class="title"><i>Reflections on the DNS, RFC 1591, and Categories of Domains</i>. </span><span class="pubdate">February 2001. </span></p>
+<a name="id2605874"></a><p>[<abbr class="abbrev">RFC3071</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Klensin</span>. </span><span class="title"><i>Reflections on the DNS, RFC 1591, and Categories of Domains</i>. </span><span class="pubdate">February 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602427"></a><p>[<abbr class="abbrev">RFC3258</abbr>] <span class="authorgroup"><span class="firstname">T.</span> <span class="surname">Hardie</span>. </span><span class="title"><i>Distributing Authoritative Name Servers via
+<a name="id2605900"></a><p>[<abbr class="abbrev">RFC3258</abbr>] <span class="authorgroup"><span class="firstname">T.</span> <span class="surname">Hardie</span>. </span><span class="title"><i>Distributing Authoritative Name Servers via
Shared Unicast Addresses</i>. </span><span class="pubdate">April 2002. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602453"></a><p>[<abbr class="abbrev">RFC3901</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Durand</span> and <span class="firstname">J.</span> <span class="surname">Ihren</span>. </span><span class="title"><i>DNS IPv6 Transport Operational Guidelines</i>. </span><span class="pubdate">September 2004. </span></p>
+<a name="id2605926"></a><p>[<abbr class="abbrev">RFC3901</abbr>] <span class="authorgroup"><span class="firstname">A.</span> <span class="surname">Durand</span> and <span class="firstname">J.</span> <span class="surname">Ihren</span>. </span><span class="title"><i>DNS IPv6 Transport Operational Guidelines</i>. </span><span class="pubdate">September 2004. </span></p>
</div>
</div>
<div class="bibliodiv">
<h3 class="title">Obsolete and Unimplemented Experimental RFC</h3>
<div class="biblioentry">
-<a name="id2602497"></a><p>[<abbr class="abbrev">RFC1712</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Farrell</span>, <span class="firstname">M.</span> <span class="surname">Schulze</span>, <span class="firstname">S.</span> <span class="surname">Pleitner</span>, and <span class="firstname">D.</span> <span class="surname">Baldoni</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Geographical
+<a name="id2605970"></a><p>[<abbr class="abbrev">RFC1712</abbr>] <span class="authorgroup"><span class="firstname">C.</span> <span class="surname">Farrell</span>, <span class="firstname">M.</span> <span class="surname">Schulze</span>, <span class="firstname">S.</span> <span class="surname">Pleitner</span>, and <span class="firstname">D.</span> <span class="surname">Baldoni</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> Encoding of Geographical
Location</i>. </span><span class="pubdate">November 1994. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602554"></a><p>[<abbr class="abbrev">RFC2673</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Binary Labels in the Domain Name System</i>. </span><span class="pubdate">August 1999. </span></p>
+<a name="id2606027"></a><p>[<abbr class="abbrev">RFC2673</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span>. </span><span class="title"><i>Binary Labels in the Domain Name System</i>. </span><span class="pubdate">August 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602581"></a><p>[<abbr class="abbrev">RFC2874</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span> and <span class="firstname">C.</span> <span class="surname">Huitema</span>. </span><span class="title"><i>DNS Extensions to Support IPv6 Address Aggregation
+<a name="id2606054"></a><p>[<abbr class="abbrev">RFC2874</abbr>] <span class="authorgroup"><span class="firstname">M.</span> <span class="surname">Crawford</span> and <span class="firstname">C.</span> <span class="surname">Huitema</span>. </span><span class="title"><i>DNS Extensions to Support IPv6 Address Aggregation
and Renumbering</i>. </span><span class="pubdate">July 2000. </span></p>
</div>
</div>
@@ -541,39 +551,39 @@
</p>
</div>
<div class="biblioentry">
-<a name="id2602629"></a><p>[<abbr class="abbrev">RFC2065</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">C.</span> <span class="surname">Kaufman</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">January 1997. </span></p>
+<a name="id2606102"></a><p>[<abbr class="abbrev">RFC2065</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span> and <span class="firstname">C.</span> <span class="surname">Kaufman</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">January 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602737"></a><p>[<abbr class="abbrev">RFC2137</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secure Domain Name System Dynamic Update</i>. </span><span class="pubdate">April 1997. </span></p>
+<a name="id2606141"></a><p>[<abbr class="abbrev">RFC2137</abbr>] <span class="author"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Secure Domain Name System Dynamic Update</i>. </span><span class="pubdate">April 1997. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602763"></a><p>[<abbr class="abbrev">RFC2535</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">March 1999. </span></p>
+<a name="id2606168"></a><p>[<abbr class="abbrev">RFC2535</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Eastlake</span>, <span class="lineage">3rd</span>. </span><span class="title"><i>Domain Name System Security Extensions</i>. </span><span class="pubdate">March 1999. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602793"></a><p>[<abbr class="abbrev">RFC3008</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Domain Name System Security (DNSSEC)
+<a name="id2606198"></a><p>[<abbr class="abbrev">RFC3008</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span>. </span><span class="title"><i>Domain Name System Security (DNSSEC)
Signing Authority</i>. </span><span class="pubdate">November 2000. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602819"></a><p>[<abbr class="abbrev">RFC3090</abbr>] <span class="authorgroup"><span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>DNS Security Extension Clarification on Zone Status</i>. </span><span class="pubdate">March 2001. </span></p>
+<a name="id2606224"></a><p>[<abbr class="abbrev">RFC3090</abbr>] <span class="authorgroup"><span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>DNS Security Extension Clarification on Zone Status</i>. </span><span class="pubdate">March 2001. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602845"></a><p>[<abbr class="abbrev">RFC3445</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Massey</span> and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Limiting the Scope of the KEY Resource Record (RR)</i>. </span><span class="pubdate">December 2002. </span></p>
+<a name="id2606250"></a><p>[<abbr class="abbrev">RFC3445</abbr>] <span class="authorgroup"><span class="firstname">D.</span> <span class="surname">Massey</span> and <span class="firstname">S.</span> <span class="surname">Rose</span>. </span><span class="title"><i>Limiting the Scope of the KEY Resource Record (RR)</i>. </span><span class="pubdate">December 2002. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602950"></a><p>[<abbr class="abbrev">RFC3655</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Redefinition of DNS Authenticated Data (AD) bit</i>. </span><span class="pubdate">November 2003. </span></p>
+<a name="id2606286"></a><p>[<abbr class="abbrev">RFC3655</abbr>] <span class="authorgroup"><span class="firstname">B.</span> <span class="surname">Wellington</span> and <span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Redefinition of DNS Authenticated Data (AD) bit</i>. </span><span class="pubdate">November 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2602986"></a><p>[<abbr class="abbrev">RFC3658</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Delegation Signer (DS) Resource Record (RR)</i>. </span><span class="pubdate">December 2003. </span></p>
+<a name="id2606323"></a><p>[<abbr class="abbrev">RFC3658</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Gudmundsson</span>. </span><span class="title"><i>Delegation Signer (DS) Resource Record (RR)</i>. </span><span class="pubdate">December 2003. </span></p>
</div>
<div class="biblioentry">
-<a name="id2603013"></a><p>[<abbr class="abbrev">RFC3755</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Weiler</span>. </span><span class="title"><i>Legacy Resolver Compatibility for Delegation Signer (DS)</i>. </span><span class="pubdate">May 2004. </span></p>
+<a name="id2606349"></a><p>[<abbr class="abbrev">RFC3755</abbr>] <span class="authorgroup"><span class="firstname">S.</span> <span class="surname">Weiler</span>. </span><span class="title"><i>Legacy Resolver Compatibility for Delegation Signer (DS)</i>. </span><span class="pubdate">May 2004. </span></p>
</div>
<div class="biblioentry">
-<a name="id2603040"></a><p>[<abbr class="abbrev">RFC3757</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Kolkman</span>, <span class="firstname">J.</span> <span class="surname">Schlyter</span>, and <span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>Domain Name System KEY (DNSKEY) Resource Record
+<a name="id2606376"></a><p>[<abbr class="abbrev">RFC3757</abbr>] <span class="authorgroup"><span class="firstname">O.</span> <span class="surname">Kolkman</span>, <span class="firstname">J.</span> <span class="surname">Schlyter</span>, and <span class="firstname">E.</span> <span class="surname">Lewis</span>. </span><span class="title"><i>Domain Name System KEY (DNSKEY) Resource Record
(RR) Secure Entry Point (SEP) Flag</i>. </span><span class="pubdate">April 2004. </span></p>
</div>
<div class="biblioentry">
-<a name="id2603084"></a><p>[<abbr class="abbrev">RFC3845</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Schlyter</span>. </span><span class="title"><i>DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format</i>. </span><span class="pubdate">August 2004. </span></p>
+<a name="id2606421"></a><p>[<abbr class="abbrev">RFC3845</abbr>] <span class="authorgroup"><span class="firstname">J.</span> <span class="surname">Schlyter</span>. </span><span class="title"><i>DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format</i>. </span><span class="pubdate">August 2004. </span></p>
</div>
</div>
</div>
@@ -594,16 +604,481 @@
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
-<a name="id2603126"></a>Other Documents About <acronym class="acronym">BIND</acronym>
+<a name="id2606462"></a>Other Documents About <acronym class="acronym">BIND</acronym>
</h3></div></div></div>
<p></p>
<div class="bibliography">
<div class="titlepage"><div><div><h4 class="title">
-<a name="id2603136"></a>Bibliography</h4></div></div></div>
+<a name="id2606472"></a>Bibliography</h4></div></div></div>
<div class="biblioentry">
-<a name="id2603138"></a><p><span class="authorgroup"><span class="firstname">Paul</span> <span class="surname">Albitz</span> and <span class="firstname">Cricket</span> <span class="surname">Liu</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></i>. </span><span class="copyright">Copyright © 1998 Sebastopol, CA: O'Reilly and Associates. </span></p>
+<a name="id2606474"></a><p><span class="authorgroup"><span class="firstname">Paul</span> <span class="surname">Albitz</span> and <span class="firstname">Cricket</span> <span class="surname">Liu</span>. </span><span class="title"><i><acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></i>. </span><span class="copyright">Copyright © 1998 Sebastopol, CA: O'Reilly and Associates. </span></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bind9.library"></a>BIND 9 DNS Library Support</h2></div></div></div>
+<p>This version of BIND 9 "exports" its internal libraries so
+ that they can be used by third-party applications more easily (we
+ call them "export" libraries in this document). In addition to
+ all major DNS-related APIs BIND 9 is currently using, the export
+ libraries provide the following features:</p>
+<div class="itemizedlist"><ul type="disc">
+<li><p>The newly created "DNS client" module. This is a higher
+ level API that provides an interface to name resolution,
+ single DNS transaction with a particular server, and dynamic
+ update. Regarding name resolution, it supports advanced
+ features such as DNSSEC validation and caching. This module
+ supports both synchronous and asynchronous mode.</p></li>
+<li><p>The new "IRS" (Information Retrieval System) library.
+ It provides an interface to parse the traditional resolv.conf
+ file and more advanced, DNS-specific configuration file for
+ the rest of this package (see the description for the
+ dns.conf file below).</p></li>
+<li><p>As part of the IRS library, newly implemented standard
+ address-name mapping functions, getaddrinfo() and
+ getnameinfo(), are provided. They use the DNSSEC-aware
+ validating resolver backend, and could use other advanced
+ features of the BIND 9 libraries such as caching. The
+ getaddrinfo() function resolves both A and AAAA RRs
+ concurrently (when the address family is unspecified).</p></li>
+<li><p>An experimental framework to support other event
+ libraries than BIND 9's internal event task system.</p></li>
+</ul></div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608789"></a>Prerequisite</h3></div></div></div>
+<p>GNU make is required to build the export libraries (other
+ part of BIND 9 can still be built with other types of make). In
+ the reminder of this document, "make" means GNU make. Note that
+ in some platforms you may need to invoke a different command name
+ than "make" (e.g. "gmake") to indicate it's GNU make.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608798"></a>Compilation</h3></div></div></div>
+<pre class="screen">
+$ <strong class="userinput"><code>./configure --enable-exportlib <em class="replaceable"><code>[other flags]</code></em></code></strong>
+$ <strong class="userinput"><code>make</code></strong>
+</pre>
+<p>
+ This will create (in addition to usual BIND 9 programs) and a
+ separate set of libraries under the lib/export directory. For
+ example, <code class="filename">lib/export/dns/libdns.a</code> is the archive file of the
+ export version of the BIND 9 DNS library. Sample application
+ programs using the libraries will also be built under the
+ lib/export/samples directory (see below).</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608004"></a>Installation</h3></div></div></div>
+<pre class="screen">
+$ <strong class="userinput"><code>cd lib/export</code></strong>
+$ <strong class="userinput"><code>make install</code></strong>
+</pre>
+<p>
+ This will install library object files under the directory
+ specified by the --with-export-libdir configure option (default:
+ EPREFIX/lib/bind9), and header files under the directory
+ specified by the --with-export-includedir configure option
+ (default: PREFIX/include/bind9).
+ Root privilege is normally required.
+ "<span><strong class="command">make install</strong></span>" at the top directory will do the
+ same.
+ </p>
+<p>
+ To see how to build your own
+ application after the installation, see
+ <code class="filename">lib/export/samples/Makefile-postinstall.in</code>.</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608035"></a>Known Defects/Restrictions</h3></div></div></div>
+<div class="itemizedlist"><ul type="disc">
+<li><p>Currently, win32 is not supported for the export
+ library. (Normal BIND 9 application can be built as
+ before).</p></li>
+<li>
+<p>The "fixed" RRset order is not (currently) supported in
+ the export library. If you want to use "fixed" RRset order
+ for, e.g. <span><strong class="command">named</strong></span> while still building the
+ export library even without the fixed order support, build
+ them separately:
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>./configure --enable-fixed-rrset <em class="replaceable"><code>[other flags, but not --enable-exportlib]</code></em></code></strong>
+$ <strong class="userinput"><code>make</code></strong>
+$ <strong class="userinput"><code>./configure --enable-exportlib <em class="replaceable"><code>[other flags, but not --enable-fixed-rrset]</code></em></code></strong>
+$ <strong class="userinput"><code>cd lib/export</code></strong>
+$ <strong class="userinput"><code>make</code></strong>
+</pre>
+<p>
+ </p>
+</li>
+<li><p>The client module and the IRS library currently do not
+ support DNSSEC validation using DLV (the underlying modules
+ can handle it, but there is no tunable interface to enable
+ the feature).</p></li>
+<li><p>RFC 5011 is not supported in the validating stub
+ resolver of the export library. In fact, it is not clear
+ whether it should: trust anchors would be a system-wide
+ configuration which would be managed by an administrator,
+ while the stub resolver will be used by ordinary applications
+ run by a normal user.</p></li>
+<li><p>Not all common <code class="filename">/etc/resolv.conf</code>
+ options are supported
+ in the IRS library. The only available options in this
+ version are "debug" and "ndots".</p></li>
+</ul></div>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608112"></a>The dns.conf File</h3></div></div></div>
+<p>The IRS library supports an "advanced" configuration file
+ related to the DNS library for configuration parameters that
+ would be beyond the capability of the
+ <code class="filename">resolv.conf</code> file.
+ Specifically, it is intended to provide DNSSEC related
+ configuration parameters. By default the path to this
+ configuration file is <code class="filename">/etc/dns.conf</code>.
+ This module is very
+ experimental and the configuration syntax or library interfaces
+ may change in future versions. Currently, only the
+ <span><strong class="command">trusted-keys</strong></span>
+ statement is supported, whose syntax is the same as the same name
+ of statement for <code class="filename">named.conf</code>. (See
+ <a href="Bv9ARM.ch06.html#trusted-keys" title="trusted-keys Statement Grammar">the section called &#8220;<span><strong class="command">trusted-keys</strong></span> Statement Grammar&#8221;</a> for details.)</p>
+</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2608138"></a>Sample Applications</h3></div></div></div>
+<p>Some sample application programs using this API are
+ provided for reference. The following is a brief description of
+ these applications.
+ </p>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608147"></a>sample: a simple stub resolver utility</h4></div></div></div>
+<p>
+ It sends a query of a given name (of a given optional RR type) to a
+ specified recursive server, and prints the result as a list of
+ RRs. It can also act as a validating stub resolver if a trust
+ anchor is given via a set of command line options.</p>
+<p>
+ Usage: sample [options] server_address hostname
+ </p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -t RRtype
+ </span></dt>
+<dd><p>
+ specify the RR type of the query. The default is the A RR.
+ </p></dd>
+<dt><span class="term">
+ [-a algorithm] [-e] -k keyname -K keystring
+ </span></dt>
+<dd>
+<p>
+ specify a command-line DNS key to validate the answer. For
+ example, to specify the following DNSKEY of example.com:
+</p>
+<div class="literallayout"><p><br>
+                example.com. 3600 IN DNSKEY 257 3 5 xxx<br>
+</p></div>
+<p>
+ specify the options as follows:
+</p>
+<pre class="screen">
+<strong class="userinput"><code>
+ -e -k example.com -K "xxx"
+</code></strong>
+</pre>
+<p>
+ -e means that this key is a zone's "key signing key" (as known
+ as "secure Entry point").
+ When -a is omitted rsasha1 will be used by default.
+ </p>
+</dd>
+<dt><span class="term">
+ -s domain:alt_server_address
+ </span></dt>
+<dd><p>
+ specify a separate recursive server address for the specific
+ "domain". Example: -s example.com:2001:db8::1234
+ </p></dd>
+<dt><span class="term">server_address</span></dt>
+<dd><p>
+ an IP(v4/v6) address of the recursive server to which queries
+ are sent.
+ </p></dd>
+<dt><span class="term">hostname</span></dt>
+<dd><p>
+ the domain name for the query
+ </p></dd>
+</dl></div>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608237"></a>sample-async: a simple stub resolver, working asynchronously</h4></div></div></div>
+<p>
+ Similar to "sample", but accepts a list
+ of (query) domain names as a separate file and resolves the names
+ asynchronously.</p>
+<p>
+ Usage: sample-async [-s server_address] [-t RR_type] input_file</p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -s server_address
+ </span></dt>
+<dd>
+ an IPv4 address of the recursive server to which queries are sent.
+ (IPv6 addresses are not supported in this implementation)
+ </dd>
+<dt><span class="term">
+ -t RR_type
+ </span></dt>
+<dd>
+ specify the RR type of the queries. The default is the A
+ RR.
+ </dd>
+<dt><span class="term">
+ input_file
+ </span></dt>
+<dd>
+ a list of domain names to be resolved. each line
+ consists of a single domain name. Example:
+ <div class="literallayout"><p><br>
+  www.example.com<br>
+  mx.examle.net<br>
+  ns.xxx.example<br>
+</p></div>
+</dd>
+</dl></div>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608291"></a>sample-request: a simple DNS transaction client</h4></div></div></div>
+<p>
+ It sends a query to a specified server, and
+ prints the response with minimal processing. It doesn't act as a
+ "stub resolver": it stops the processing once it gets any
+ response from the server, whether it's a referral or an alias
+ (CNAME or DNAME) that would require further queries to get the
+ ultimate answer. In other words, this utility acts as a very
+ simplified <span><strong class="command">dig</strong></span>.
+ </p>
+<p>
+ Usage: sample-request [-t RRtype] server_address hostname
+ </p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -t RRtype
+ </span></dt>
+<dd><p>
+ specify the RR type of
+ the queries. The default is the A RR.
+ </p></dd>
+<dt><span class="term">
+ server_address
+ </span></dt>
+<dd><p>
+ an IP(v4/v6)
+ address of the recursive server to which the query is sent.
+ </p></dd>
+<dt><span class="term">
+ hostname
+ </span></dt>
+<dd><p>
+ the domain name for the query
+ </p></dd>
+</dl></div>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608355"></a>sample-gai: getaddrinfo() and getnameinfo() test code</h4></div></div></div>
+<p>
+ This is a test program
+ to check getaddrinfo() and getnameinfo() behavior. It takes a
+ host name as an argument, calls getaddrinfo() with the given host
+ name, and calls getnameinfo() with the resulting IP addresses
+ returned by getaddrinfo(). If the dns.conf file exists and
+ defines a trust anchor, the underlying resolver will act as a
+ validating resolver, and getaddrinfo()/getnameinfo() will fail
+ with an EAI_INSECUREDATA error when DNSSEC validation fails.
+ </p>
+<p>
+ Usage: sample-gai hostname
+ </p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2608370"></a>sample-update: a simple dynamic update client program</h4></div></div></div>
+<p>
+ It accepts a single update command as a
+ command-line argument, sends an update request message to the
+ authoritative server, and shows the response from the server. In
+ other words, this is a simplified <span><strong class="command">nsupdate</strong></span>.
+ </p>
+<p>
+ Usage: sample-update [options] (add|delete) "update data"
+ </p>
+<p>
+ Options and Arguments:
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -a auth_server
+ </span></dt>
+<dd><p>
+ An IP address of the authoritative server that has authority
+ for the zone containing the update name. This should normally
+ be the primary authoritative server that accepts dynamic
+ updates. It can also be a secondary server that is configured
+ to forward update requests to the primary server.
+ </p></dd>
+<dt><span class="term">
+ -k keyfile
+ </span></dt>
+<dd><p>
+ A TSIG key file to secure the update transaction. The keyfile
+ format is the same as that for the nsupdate utility.
+ </p></dd>
+<dt><span class="term">
+ -p prerequisite
+ </span></dt>
+<dd><p>
+ A prerequisite for the update (only one prerequisite can be
+ specified). The prerequisite format is the same as that is
+ accepted by the nsupdate utility.
+ </p></dd>
+<dt><span class="term">
+ -r recursive_server
+ </span></dt>
+<dd><p>
+ An IP address of a recursive server that this utility will
+ use. A recursive server may be necessary to identify the
+ authoritative server address to which the update request is
+ sent.
+ </p></dd>
+<dt><span class="term">
+ -z zonename
+ </span></dt>
+<dd><p>
+ The domain name of the zone that contains
+ </p></dd>
+<dt><span class="term">
+ (add|delete)
+ </span></dt>
+<dd><p>
+ Specify the type of update operation. Either "add" or "delete"
+ must be specified.
+ </p></dd>
+<dt><span class="term">
+ "update data"
+ </span></dt>
+<dd><p>
+ Specify the data to be updated. A typical example of the data
+ would look like "name TTL RRtype RDATA".
+ </p></dd>
+</dl></div>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>In practice, either -a or -r must be specified. Others can
+ be optional; the underlying library routine tries to identify the
+ appropriate server and the zone name for the update.</div>
+<p>
+ Examples: assuming the primary authoritative server of the
+ dynamic.example.com zone has an IPv6 address 2001:db8::1234,
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key add "foo.dynamic.example.com 30 IN A 192.168.2.1"</code></strong></pre>
+<p>
+ adds an A RR for foo.dynamic.example.com using the given key.
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com 30 IN A"</code></strong></pre>
+<p>
+ removes all A RRs for foo.dynamic.example.com using the given key.
+ </p>
+<pre class="screen">
+$ <strong class="userinput"><code>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com"</code></strong></pre>
+<p>
+ removes all RRs for foo.dynamic.example.com using the given key.
+ </p>
+</div>
+<div class="sect3" lang="en">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="id2609047"></a>nsprobe: domain/name server checker in terms of RFC 4074</h4></div></div></div>
+<p>
+ It checks a set
+ of domains to see the name servers of the domains behave
+ correctly in terms of RFC 4074. This is included in the set of
+ sample programs to show how the export library can be used in a
+ DNS-related application.
+ </p>
+<p>
+ Usage: nsprobe [-d] [-v [-v...]] [-c cache_address] [input_file]
+ </p>
+<p>
+ Options
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">
+ -d
+ </span></dt>
+<dd><p>
+ run in the "debug" mode. with this option nsprobe will dump
+ every RRs it receives.
+ </p></dd>
+<dt><span class="term">
+ -v
+ </span></dt>
+<dd><p>
+ increase verbosity of other normal log messages. This can be
+ specified multiple times
+ </p></dd>
+<dt><span class="term">
+ -c cache_address
+ </span></dt>
+<dd><p>
+ specify an IP address of a recursive (caching) name server.
+ nsprobe uses this server to get the NS RRset of each domain and
+ the A and/or AAAA RRsets for the name servers. The default
+ value is 127.0.0.1.
+ </p></dd>
+<dt><span class="term">
+ input_file
+ </span></dt>
+<dd><p>
+ a file name containing a list of domain (zone) names to be
+ probed. when omitted the standard input will be used. Each
+ line of the input file specifies a single domain name such as
+ "example.com". In general this domain name must be the apex
+ name of some DNS zone (unlike normal "host names" such as
+ "www.example.com"). nsprobe first identifies the NS RRsets for
+ the given domain name, and sends A and AAAA queries to these
+ servers for some "widely used" names under the zone;
+ specifically, adding "www" and "ftp" to the zone name.
+ </p></dd>
+</dl></div>
</div>
</div>
+<div class="sect2" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="id2609111"></a>Library References</h3></div></div></div>
+<p>As of this writing, there is no formal "manual" of the
+ libraries, except this document, header files (some of them
+ provide pretty detailed explanations), and sample application
+ programs.</p>
</div>
</div>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.ch10.html b/contrib/bind9/doc/arm/Bv9ARM.ch10.html
index 6929485..7ff08e1 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.ch10.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.ch10.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.ch10.html,v 1.11.14.3 2010-01-24 01:55:26 tbox Exp $ -->
+<!-- $Id: Bv9ARM.ch10.html,v 1.20 2011-01-05 01:14:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -64,6 +64,12 @@
<span class="refentrytitle"><a href="man.dnssec-keygen.html"><span class="application">dnssec-keygen</span></a></span><span class="refpurpose"> &#8212; DNSSEC key generation tool</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.dnssec-revoke.html"><span class="application">dnssec-revoke</span></a></span><span class="refpurpose"> &#8212; Set the REVOKED bit on a DNSSEC key</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.dnssec-settime.html"><span class="application">dnssec-settime</span></a></span><span class="refpurpose"> &#8212; Set the key timing metadata for a DNSSEC key</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.dnssec-signzone.html"><span class="application">dnssec-signzone</span></a></span><span class="refpurpose"> &#8212; DNSSEC zone signing tool</span>
</dt>
<dt>
@@ -76,6 +82,9 @@
<span class="refentrytitle"><a href="man.named.html"><span class="application">named</span></a></span><span class="refpurpose"> &#8212; Internet domain name server</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.named-journalprint.html"><span class="application">named-journalprint</span></a></span><span class="refpurpose"> &#8212; print zone journal in human-readable form</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.nsupdate.html"><span class="application">nsupdate</span></a></span><span class="refpurpose"> &#8212; Dynamic DNS update utility</span>
</dt>
<dt>
@@ -87,6 +96,21 @@
<dt>
<span class="refentrytitle"><a href="man.rndc-confgen.html"><span class="application">rndc-confgen</span></a></span><span class="refpurpose"> &#8212; rndc key generation tool</span>
</dt>
+<dt>
+<span class="refentrytitle"><a href="man.ddns-confgen.html"><span class="application">ddns-confgen</span></a></span><span class="refpurpose"> &#8212; ddns key generation tool</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.arpaname.html"><span class="application">arpaname</span></a></span><span class="refpurpose"> &#8212; translate IP addresses to the corresponding ARPA names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.genrandom.html"><span class="application">genrandom</span></a></span><span class="refpurpose"> &#8212; generate a file containing random data</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.isc-hmac-fixup.html"><span class="application">isc-hmac-fixup</span></a></span><span class="refpurpose"> &#8212; fixes HMAC keys generated by older versions of BIND</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.nsec3hash.html"><span class="application">nsec3hash</span></a></span><span class="refpurpose"> &#8212; generate NSEC3 hash</span>
+</dt>
</dl>
</div>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.html b/contrib/bind9/doc/arm/Bv9ARM.html
index 8c21270..7341705 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.html
+++ b/contrib/bind9/doc/arm/Bv9ARM.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: Bv9ARM.html,v 1.193.14.16 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: Bv9ARM.html,v 1.263.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -41,7 +41,7 @@
<div>
<div><h1 class="title">
<a name="id2563174"></a>BIND 9 Administrator Reference Manual</h1></div>
-<div><p class="copyright">Copyright © 2004-2010 Internet Systems Consortium, Inc. ("ISC")</p></div>
+<div><p class="copyright">Copyright © 2004-2011 Internet Systems Consortium, Inc. ("ISC")</p></div>
<div><p class="copyright">Copyright © 2000-2003 Internet Software Consortium.</p></div>
</div>
<hr>
@@ -51,39 +51,39 @@
<dl>
<dt><span class="chapter"><a href="Bv9ARM.ch01.html">1. Introduction</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2563412">Scope of Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564391">Organization of This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564531">Conventions Used in This Document</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564712">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564371">Scope of Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564394">Organization of This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564534">Conventions Used in This Document</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch01.html#id2564715">The Domain Name System (<acronym class="acronym">DNS</acronym>)</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564733">DNS Fundamentals</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564768">Domains and Domain Names</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567173">Zones</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567250">Authoritative Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567422">Caching Name Servers</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567553">Name Servers in Multiple Roles</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564737">DNS Fundamentals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2564771">Domains and Domain Names</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567176">Zones</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567253">Authoritative Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567426">Caching Name Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch01.html#id2567556">Name Servers in Multiple Roles</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch02.html">2. <acronym class="acronym">BIND</acronym> Resource Requirements</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567587">Hardware requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567613">CPU Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567626">Memory Requirements</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567721">Name Server Intensive Environment Issues</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567732">Supported Operating Systems</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567590">Hardware requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567617">CPU Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567629">Memory Requirements</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567724">Name Server Intensive Environment Issues</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch02.html#id2567735">Supported Operating Systems</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch03.html">3. Name Server Configuration</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="Bv9ARM.ch03.html#sample_configuration">Sample Configurations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567764">A Caching-only Name Server</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567780">An Authoritative-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567767">A Caching-only Name Server</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2567988">An Authoritative-only Name Server</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568007">Load Balancing</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568361">Name Server Operations</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568010">Load Balancing</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch03.html#id2568364">Name Server Operations</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568366">Tools for Use With the Name Server Daemon</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570006">Signals</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2568370">Tools for Use With the Name Server Daemon</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch03.html#id2570385">Signals</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch04.html">4. Advanced DNS Features</a></span></dt>
@@ -92,34 +92,64 @@
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dynamic_update">Dynamic Update</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#journal">The journal file</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#incremental_zone_transfers">Incremental Zone Transfers (IXFR)</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570492">Split DNS</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570510">Example split DNS setup</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2570823">Split DNS</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2570841">Example split DNS setup</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#tsig">TSIG</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571082">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571156">Copying the Shared Secret to Both Machines</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571166">Informing the Servers of the Key's Existence</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571203">Instructing the Server to Use the Key</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571260">TSIG Key Based Access Control</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571445">Errors</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571342">Generate Shared Keys for Each Pair of Hosts</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571553">Copying the Shared Secret to Both Machines</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571563">Informing the Servers of the Key's Existence</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571600">Instructing the Server to Use the Key</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571657">TSIG Key Based Access Control</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571706">Errors</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571459">TKEY</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571576">SIG(0)</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2571720">TKEY</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2563987">SIG(0)</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch04.html#DNSSEC">DNSSEC</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571644">Generating Keys</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571792">Signing the Zone</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2571873">Configuring Servers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2564055">Generating Keys</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572189">Signing the Zone</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572270">Configuring Servers</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572110">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#dnssec.dynamic.zones">DNSSEC, Dynamic Zones, and Automatic Signing</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572172">Address Lookups Using AAAA Records</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572194">Address to Name Lookups Using Nibble Format</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607351">Converting from insecure to secure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563493">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563529">Fully automatic zone signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563611">Private-type records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563649">DNSKEY rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563661">Dynamic DNS update method</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563763">Automatic key rollovers</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563789">NSEC3PARAM rollovers via UPDATE</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563799">Converting from NSEC to NSEC3</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563809">Converting from NSEC3 to NSEC</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563821">Converting from secure to insecure</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563859">Periodic re-signing</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2563868">NSEC3 and OPTOUT</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#rfc5011.support">Dynamic Trust Anchor Management</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607271">Validating Resolver</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607293">Authoritative Server</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#pkcs11">PKCS #11 (Cryptoki) support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609524">Prerequisites</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607678">Building BIND 9 with PKCS#11</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607842">PKCS #11 Tools</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2607873">Using the HSM</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609709">Specifying the engine on the command line</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2609755">Running named with automatic zone re-signing</a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch04.html#id2572490">IPv6 Support in <acronym class="acronym">BIND</acronym> 9</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572757">Address Lookups Using AAAA Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch04.html#id2572846">Address to Name Lookups Using Nibble Format</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch05.html">5. The <acronym class="acronym">BIND</acronym> 9 Lightweight Resolver</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572227">The Lightweight Resolver Library</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch05.html#id2572880">The Lightweight Resolver Library</a></span></dt>
<dt><span class="sect1"><a href="Bv9ARM.ch05.html#lwresd">Running a Resolver Daemon</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch06.html">6. <acronym class="acronym">BIND</acronym> 9 Configuration Reference</a></span></dt>
@@ -127,55 +157,58 @@
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#configuration_file_elements">Configuration File Elements</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#address_match_lists">Address Match Lists</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2573606">Comment Syntax</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574290">Comment Syntax</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#Configuration_File_Grammar">Configuration File Grammar</a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574305"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574944"><span><strong class="command">acl</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#acl"><span><strong class="command">acl</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574494"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575133"><span><strong class="command">controls</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#controls_statement_definition_and_usage"><span><strong class="command">controls</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574923"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574940"><span><strong class="command">include</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575425"><span><strong class="command">include</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575442"><span><strong class="command">include</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574964"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2574987"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575078"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575204"><span><strong class="command">logging</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575465"><span><strong class="command">key</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575489"><span><strong class="command">key</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575648"><span><strong class="command">logging</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2575842"><span><strong class="command">logging</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577401"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577475"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577539"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577582"><span><strong class="command">masters</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577841"><span><strong class="command">lwres</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577982"><span><strong class="command">lwres</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578046"><span><strong class="command">masters</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578090"><span><strong class="command">masters</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2577597"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2578105"><span><strong class="command">options</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#options"><span><strong class="command">options</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_grammar"><span><strong class="command">server</strong></span> Statement Grammar</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#server_statement_definition_and_usage"><span><strong class="command">server</strong></span> Statement Definition and
Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#statschannels"><span><strong class="command">statistics-channels</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2586907"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589239"><span><strong class="command">statistics-channels</strong></span> Statement Definition and
Usage</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587062"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587113"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#trusted-keys"><span><strong class="command">trusted-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589379"><span><strong class="command">trusted-keys</strong></span> Statement Definition
+ and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589494"><span><strong class="command">managed-keys</strong></span> Statement Grammar</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#managed-keys"><span><strong class="command">managed-keys</strong></span> Statement Definition
and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#view_statement_grammar"><span><strong class="command">view</strong></span> Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2587195"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2589851"><span><strong class="command">view</strong></span> Statement Definition and Usage</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zone_statement_grammar"><span><strong class="command">zone</strong></span>
Statement Grammar</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2588600"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2591396"><span><strong class="command">zone</strong></span> Statement Definition and Usage</a></span></dt>
</dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2591216">Zone File</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch06.html#id2594660">Zone File</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#types_of_resource_records_and_when_to_use_them">Types of Resource Records and When to Use Them</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593378">Discussion of MX Records</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2596822">Discussion of MX Records</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#Setting_TTLs">Setting TTLs</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2593993">Inverse Mapping in IPv4</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594188">Other Zone File Directives</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2594461"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597574">Inverse Mapping in IPv4</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597701">Other Zone File Directives</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch06.html#id2597974"><acronym class="acronym">BIND</acronym> Master File Extension: the <span><strong class="command">$GENERATE</strong></span> Directive</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch06.html#zonefile_format">Additional File Formats</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch06.html#statistics">BIND9 Statistics</a></span></dt>
@@ -184,31 +217,41 @@
<dt><span class="chapter"><a href="Bv9ARM.ch07.html">7. <acronym class="acronym">BIND</acronym> 9 Security Considerations</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#Access_Control_Lists">Access Control Lists</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2599016"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch07.html#id2602626"><span><strong class="command">Chroot</strong></span> and <span><strong class="command">Setuid</strong></span></a></span></dt>
<dd><dl>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599234">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2599362">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602707">The <span><strong class="command">chroot</strong></span> Environment</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch07.html#id2602766">Using the <span><strong class="command">setuid</strong></span> Function</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch07.html#dynamic_update_security">Dynamic Update Security</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="Bv9ARM.ch08.html">8. Troubleshooting</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599442">Common Problems</a></span></dt>
-<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2599447">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599459">Incrementing and Changing the Serial Number</a></span></dt>
-<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2599476">Where Can I Get Help?</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602915">Common Problems</a></span></dt>
+<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch08.html#id2602920">It's not working; how can I figure out what's wrong?</a></span></dt></dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602932">Incrementing and Changing the Serial Number</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch08.html#id2602949">Where Can I Get Help?</a></span></dt>
</dl></dd>
<dt><span class="appendix"><a href="Bv9ARM.ch09.html">A. Appendices</a></span></dt>
<dd><dl>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599606">Acknowledgments</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603147">Acknowledgments</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#historical_dns_information">A Brief History of the <acronym class="acronym">DNS</acronym> and <acronym class="acronym">BIND</acronym></a></span></dt></dl></dd>
-<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2599778">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#id2603319">General <acronym class="acronym">DNS</acronym> Reference Information</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="Bv9ARM.ch09.html#ipv6addresses">IPv6 addresses (AAAA)</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bibliography">Bibliography (and Suggested Reading)</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#rfcs">Request for Comments (RFCs)</a></span></dt>
<dt><span class="sect2"><a href="Bv9ARM.ch09.html#internet_drafts">Internet Drafts</a></span></dt>
-<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2603126">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2606462">Other Documents About <acronym class="acronym">BIND</acronym></a></span></dt>
+</dl></dd>
+<dt><span class="sect1"><a href="Bv9ARM.ch09.html#bind9.library">BIND 9 DNS Library Support</a></span></dt>
+<dd><dl>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608789">Prerequisite</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608798">Compilation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608004">Installation</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608035">Known Defects/Restrictions</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608112">The dns.conf File</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2608138">Sample Applications</a></span></dt>
+<dt><span class="sect2"><a href="Bv9ARM.ch09.html#id2609111">Library References</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="reference"><a href="Bv9ARM.ch10.html">I. Manual pages</a></span></dt>
@@ -229,6 +272,12 @@
<span class="refentrytitle"><a href="man.dnssec-keygen.html"><span class="application">dnssec-keygen</span></a></span><span class="refpurpose"> &#8212; DNSSEC key generation tool</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.dnssec-revoke.html"><span class="application">dnssec-revoke</span></a></span><span class="refpurpose"> &#8212; Set the REVOKED bit on a DNSSEC key</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.dnssec-settime.html"><span class="application">dnssec-settime</span></a></span><span class="refpurpose"> &#8212; Set the key timing metadata for a DNSSEC key</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.dnssec-signzone.html"><span class="application">dnssec-signzone</span></a></span><span class="refpurpose"> &#8212; DNSSEC zone signing tool</span>
</dt>
<dt>
@@ -241,6 +290,9 @@
<span class="refentrytitle"><a href="man.named.html"><span class="application">named</span></a></span><span class="refpurpose"> &#8212; Internet domain name server</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="man.named-journalprint.html"><span class="application">named-journalprint</span></a></span><span class="refpurpose"> &#8212; print zone journal in human-readable form</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="man.nsupdate.html"><span class="application">nsupdate</span></a></span><span class="refpurpose"> &#8212; Dynamic DNS update utility</span>
</dt>
<dt>
@@ -252,6 +304,21 @@
<dt>
<span class="refentrytitle"><a href="man.rndc-confgen.html"><span class="application">rndc-confgen</span></a></span><span class="refpurpose"> &#8212; rndc key generation tool</span>
</dt>
+<dt>
+<span class="refentrytitle"><a href="man.ddns-confgen.html"><span class="application">ddns-confgen</span></a></span><span class="refpurpose"> &#8212; ddns key generation tool</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.arpaname.html"><span class="application">arpaname</span></a></span><span class="refpurpose"> &#8212; translate IP addresses to the corresponding ARPA names</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.genrandom.html"><span class="application">genrandom</span></a></span><span class="refpurpose"> &#8212; generate a file containing random data</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.isc-hmac-fixup.html"><span class="application">isc-hmac-fixup</span></a></span><span class="refpurpose"> &#8212; fixes HMAC keys generated by older versions of BIND</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="man.nsec3hash.html"><span class="application">nsec3hash</span></a></span><span class="refpurpose"> &#8212; generate NSEC3 hash</span>
+</dt>
</dl></dd>
</dl>
</div>
diff --git a/contrib/bind9/doc/arm/Bv9ARM.pdf b/contrib/bind9/doc/arm/Bv9ARM.pdf
index 9fc0349..a8a88dc 100644
--- a/contrib/bind9/doc/arm/Bv9ARM.pdf
+++ b/contrib/bind9/doc/arm/Bv9ARM.pdf
@@ -321,738 +321,1062 @@ endobj
<< /S /GoTo /D (section.4.9) >>
endobj
220 0 obj
-(4.9 IPv6 Support in BIND 9)
+(4.9 DNSSEC, Dynamic Zones, and Automatic Signing)
endobj
221 0 obj
<< /S /GoTo /D (subsection.4.9.1) >>
endobj
224 0 obj
-(4.9.1 Address Lookups Using AAAA Records)
+(4.9.1 Converting from insecure to secure)
endobj
225 0 obj
<< /S /GoTo /D (subsection.4.9.2) >>
endobj
228 0 obj
-(4.9.2 Address to Name Lookups Using Nibble Format)
+(4.9.2 Dynamic DNS update method)
endobj
229 0 obj
-<< /S /GoTo /D (chapter.5) >>
+<< /S /GoTo /D (subsection.4.9.3) >>
endobj
232 0 obj
-(5 The BIND 9 Lightweight Resolver)
+(4.9.3 Fully automatic zone signing)
endobj
233 0 obj
-<< /S /GoTo /D (section.5.1) >>
+<< /S /GoTo /D (subsection.4.9.4) >>
endobj
236 0 obj
-(5.1 The Lightweight Resolver Library)
+(4.9.4 Private-type records)
endobj
237 0 obj
-<< /S /GoTo /D (section.5.2) >>
+<< /S /GoTo /D (subsection.4.9.5) >>
endobj
240 0 obj
-(5.2 Running a Resolver Daemon)
+(4.9.5 DNSKEY rollovers)
endobj
241 0 obj
-<< /S /GoTo /D (chapter.6) >>
+<< /S /GoTo /D (subsection.4.9.6) >>
endobj
244 0 obj
-(6 BIND 9 Configuration Reference)
+(4.9.6 Dynamic DNS update method)
endobj
245 0 obj
-<< /S /GoTo /D (section.6.1) >>
+<< /S /GoTo /D (subsection.4.9.7) >>
endobj
248 0 obj
-(6.1 Configuration File Elements)
+(4.9.7 Automatic key rollovers)
endobj
249 0 obj
-<< /S /GoTo /D (subsection.6.1.1) >>
+<< /S /GoTo /D (subsection.4.9.8) >>
endobj
252 0 obj
-(6.1.1 Address Match Lists)
+(4.9.8 NSEC3PARAM rollovers via UPDATE)
endobj
253 0 obj
-<< /S /GoTo /D (subsubsection.6.1.1.1) >>
+<< /S /GoTo /D (subsection.4.9.9) >>
endobj
256 0 obj
-(6.1.1.1 Syntax)
+(4.9.9 Converting from NSEC to NSEC3)
endobj
257 0 obj
-<< /S /GoTo /D (subsubsection.6.1.1.2) >>
+<< /S /GoTo /D (subsection.4.9.10) >>
endobj
260 0 obj
-(6.1.1.2 Definition and Usage)
+(4.9.10 Converting from NSEC3 to NSEC)
endobj
261 0 obj
-<< /S /GoTo /D (subsection.6.1.2) >>
+<< /S /GoTo /D (subsection.4.9.11) >>
endobj
264 0 obj
-(6.1.2 Comment Syntax)
+(4.9.11 Converting from secure to insecure)
endobj
265 0 obj
-<< /S /GoTo /D (subsubsection.6.1.2.1) >>
+<< /S /GoTo /D (subsection.4.9.12) >>
endobj
268 0 obj
-(6.1.2.1 Syntax)
+(4.9.12 Periodic re-signing)
endobj
269 0 obj
-<< /S /GoTo /D (subsubsection.6.1.2.2) >>
+<< /S /GoTo /D (subsection.4.9.13) >>
endobj
272 0 obj
-(6.1.2.2 Definition and Usage)
+(4.9.13 NSEC3 and OPTOUT)
endobj
273 0 obj
-<< /S /GoTo /D (section.6.2) >>
+<< /S /GoTo /D (section.4.10) >>
endobj
276 0 obj
-(6.2 Configuration File Grammar)
+(4.10 Dynamic Trust Anchor Management)
endobj
277 0 obj
-<< /S /GoTo /D (subsection.6.2.1) >>
+<< /S /GoTo /D (subsection.4.10.1) >>
endobj
280 0 obj
-(6.2.1 acl Statement Grammar)
+(4.10.1 Validating Resolver)
endobj
281 0 obj
-<< /S /GoTo /D (subsection.6.2.2) >>
+<< /S /GoTo /D (subsection.4.10.2) >>
endobj
284 0 obj
-(6.2.2 acl Statement Definition and Usage)
+(4.10.2 Authoritative Server)
endobj
285 0 obj
-<< /S /GoTo /D (subsection.6.2.3) >>
+<< /S /GoTo /D (section.4.11) >>
endobj
288 0 obj
-(6.2.3 controls Statement Grammar)
+(4.11 PKCS \04311 \(Cryptoki\) support)
endobj
289 0 obj
-<< /S /GoTo /D (subsection.6.2.4) >>
+<< /S /GoTo /D (subsection.4.11.1) >>
endobj
292 0 obj
-(6.2.4 controls Statement Definition and Usage)
+(4.11.1 Prerequisites)
endobj
293 0 obj
-<< /S /GoTo /D (subsection.6.2.5) >>
+<< /S /GoTo /D (subsubsection.4.11.1.1) >>
endobj
296 0 obj
-(6.2.5 include Statement Grammar)
+(4.11.1.1 Building OpenSSL for the AEP Keyper on Linux)
endobj
297 0 obj
-<< /S /GoTo /D (subsection.6.2.6) >>
+<< /S /GoTo /D (subsubsection.4.11.1.2) >>
endobj
300 0 obj
-(6.2.6 include Statement Definition and Usage)
+(4.11.1.2 Building OpenSSL for the SCA 6000 on Solaris)
endobj
301 0 obj
-<< /S /GoTo /D (subsection.6.2.7) >>
+<< /S /GoTo /D (subsection.4.11.2) >>
endobj
304 0 obj
-(6.2.7 key Statement Grammar)
+(4.11.2 Building BIND 9 with PKCS\04311)
endobj
305 0 obj
-<< /S /GoTo /D (subsection.6.2.8) >>
+<< /S /GoTo /D (subsubsection.4.11.2.1) >>
endobj
308 0 obj
-(6.2.8 key Statement Definition and Usage)
+(4.11.2.1 Configuring BIND 9 for Linux)
endobj
309 0 obj
-<< /S /GoTo /D (subsection.6.2.9) >>
+<< /S /GoTo /D (subsubsection.4.11.2.2) >>
endobj
312 0 obj
-(6.2.9 logging Statement Grammar)
+(4.11.2.2 Configuring BIND 9 for Solaris)
endobj
313 0 obj
-<< /S /GoTo /D (subsection.6.2.10) >>
+<< /S /GoTo /D (subsection.4.11.3) >>
endobj
316 0 obj
-(6.2.10 logging Statement Definition and Usage)
+(4.11.3 PKCS \04311 Tools)
endobj
317 0 obj
-<< /S /GoTo /D (subsubsection.6.2.10.1) >>
+<< /S /GoTo /D (subsection.4.11.4) >>
endobj
320 0 obj
-(6.2.10.1 The channel Phrase)
+(4.11.4 Using the HSM)
endobj
321 0 obj
-<< /S /GoTo /D (subsubsection.6.2.10.2) >>
+<< /S /GoTo /D (subsection.4.11.5) >>
endobj
324 0 obj
-(6.2.10.2 The category Phrase)
+(4.11.5 Specifying the engine on the command line)
endobj
325 0 obj
-<< /S /GoTo /D (subsubsection.6.2.10.3) >>
+<< /S /GoTo /D (subsection.4.11.6) >>
endobj
328 0 obj
-(6.2.10.3 The query-errors Category)
+(4.11.6 Running named with automatic zone re-signing)
endobj
329 0 obj
-<< /S /GoTo /D (subsection.6.2.11) >>
+<< /S /GoTo /D (section.4.12) >>
endobj
332 0 obj
-(6.2.11 lwres Statement Grammar)
+(4.12 IPv6 Support in BIND 9)
endobj
333 0 obj
-<< /S /GoTo /D (subsection.6.2.12) >>
+<< /S /GoTo /D (subsection.4.12.1) >>
endobj
336 0 obj
-(6.2.12 lwres Statement Definition and Usage)
+(4.12.1 Address Lookups Using AAAA Records)
endobj
337 0 obj
-<< /S /GoTo /D (subsection.6.2.13) >>
+<< /S /GoTo /D (subsection.4.12.2) >>
endobj
340 0 obj
-(6.2.13 masters Statement Grammar)
+(4.12.2 Address to Name Lookups Using Nibble Format)
endobj
341 0 obj
-<< /S /GoTo /D (subsection.6.2.14) >>
+<< /S /GoTo /D (chapter.5) >>
endobj
344 0 obj
-(6.2.14 masters Statement Definition and Usage)
+(5 The BIND 9 Lightweight Resolver)
endobj
345 0 obj
-<< /S /GoTo /D (subsection.6.2.15) >>
+<< /S /GoTo /D (section.5.1) >>
endobj
348 0 obj
-(6.2.15 options Statement Grammar)
+(5.1 The Lightweight Resolver Library)
endobj
349 0 obj
-<< /S /GoTo /D (subsection.6.2.16) >>
+<< /S /GoTo /D (section.5.2) >>
endobj
352 0 obj
-(6.2.16 options Statement Definition and Usage)
+(5.2 Running a Resolver Daemon)
endobj
353 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.1) >>
+<< /S /GoTo /D (chapter.6) >>
endobj
356 0 obj
-(6.2.16.1 Boolean Options)
+(6 BIND 9 Configuration Reference)
endobj
357 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.2) >>
+<< /S /GoTo /D (section.6.1) >>
endobj
360 0 obj
-(6.2.16.2 Forwarding)
+(6.1 Configuration File Elements)
endobj
361 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.3) >>
+<< /S /GoTo /D (subsection.6.1.1) >>
endobj
364 0 obj
-(6.2.16.3 Dual-stack Servers)
+(6.1.1 Address Match Lists)
endobj
365 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.4) >>
+<< /S /GoTo /D (subsubsection.6.1.1.1) >>
endobj
368 0 obj
-(6.2.16.4 Access Control)
+(6.1.1.1 Syntax)
endobj
369 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.5) >>
+<< /S /GoTo /D (subsubsection.6.1.1.2) >>
endobj
372 0 obj
-(6.2.16.5 Interfaces)
+(6.1.1.2 Definition and Usage)
endobj
373 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.6) >>
+<< /S /GoTo /D (subsection.6.1.2) >>
endobj
376 0 obj
-(6.2.16.6 Query Address)
+(6.1.2 Comment Syntax)
endobj
377 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.7) >>
+<< /S /GoTo /D (subsubsection.6.1.2.1) >>
endobj
380 0 obj
-(6.2.16.7 Zone Transfers)
+(6.1.2.1 Syntax)
endobj
381 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.8) >>
+<< /S /GoTo /D (subsubsection.6.1.2.2) >>
endobj
384 0 obj
-(6.2.16.8 UDP Port Lists)
+(6.1.2.2 Definition and Usage)
endobj
385 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.9) >>
+<< /S /GoTo /D (section.6.2) >>
endobj
388 0 obj
-(6.2.16.9 Operating System Resource Limits)
+(6.2 Configuration File Grammar)
endobj
389 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.10) >>
+<< /S /GoTo /D (subsection.6.2.1) >>
endobj
392 0 obj
-(6.2.16.10 Server Resource Limits)
+(6.2.1 acl Statement Grammar)
endobj
393 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.11) >>
+<< /S /GoTo /D (subsection.6.2.2) >>
endobj
396 0 obj
-(6.2.16.11 Periodic Task Intervals)
+(6.2.2 acl Statement Definition and Usage)
endobj
397 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.12) >>
+<< /S /GoTo /D (subsection.6.2.3) >>
endobj
400 0 obj
-(6.2.16.12 Topology)
+(6.2.3 controls Statement Grammar)
endobj
401 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.13) >>
+<< /S /GoTo /D (subsection.6.2.4) >>
endobj
404 0 obj
-(6.2.16.13 The sortlist Statement)
+(6.2.4 controls Statement Definition and Usage)
endobj
405 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.14) >>
+<< /S /GoTo /D (subsection.6.2.5) >>
endobj
408 0 obj
-(6.2.16.14 RRset Ordering)
+(6.2.5 include Statement Grammar)
endobj
409 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.15) >>
+<< /S /GoTo /D (subsection.6.2.6) >>
endobj
412 0 obj
-(6.2.16.15 Tuning)
+(6.2.6 include Statement Definition and Usage)
endobj
413 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.16) >>
+<< /S /GoTo /D (subsection.6.2.7) >>
endobj
416 0 obj
-(6.2.16.16 Built-in server information zones)
+(6.2.7 key Statement Grammar)
endobj
417 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.17) >>
+<< /S /GoTo /D (subsection.6.2.8) >>
endobj
420 0 obj
-(6.2.16.17 Built-in Empty Zones)
+(6.2.8 key Statement Definition and Usage)
endobj
421 0 obj
-<< /S /GoTo /D (subsubsection.6.2.16.18) >>
+<< /S /GoTo /D (subsection.6.2.9) >>
endobj
424 0 obj
-(6.2.16.18 Additional Section Caching)
+(6.2.9 logging Statement Grammar)
endobj
425 0 obj
-<< /S /GoTo /D (subsection.6.2.17) >>
+<< /S /GoTo /D (subsection.6.2.10) >>
endobj
428 0 obj
-(6.2.17 server Statement Grammar)
+(6.2.10 logging Statement Definition and Usage)
endobj
429 0 obj
-<< /S /GoTo /D (subsection.6.2.18) >>
+<< /S /GoTo /D (subsubsection.6.2.10.1) >>
endobj
432 0 obj
-(6.2.18 server Statement Definition and Usage)
+(6.2.10.1 The channel Phrase)
endobj
433 0 obj
-<< /S /GoTo /D (subsection.6.2.19) >>
+<< /S /GoTo /D (subsubsection.6.2.10.2) >>
endobj
436 0 obj
-(6.2.19 statistics-channels Statement Grammar)
+(6.2.10.2 The category Phrase)
endobj
437 0 obj
-<< /S /GoTo /D (subsection.6.2.20) >>
+<< /S /GoTo /D (subsubsection.6.2.10.3) >>
endobj
440 0 obj
-(6.2.20 statistics-channels Statement Definition and Usage)
+(6.2.10.3 The query-errors Category)
endobj
441 0 obj
-<< /S /GoTo /D (subsection.6.2.21) >>
+<< /S /GoTo /D (subsection.6.2.11) >>
endobj
444 0 obj
-(6.2.21 trusted-keys Statement Grammar)
+(6.2.11 lwres Statement Grammar)
endobj
445 0 obj
-<< /S /GoTo /D (subsection.6.2.22) >>
+<< /S /GoTo /D (subsection.6.2.12) >>
endobj
448 0 obj
-(6.2.22 trusted-keys Statement Definition and Usage)
+(6.2.12 lwres Statement Definition and Usage)
endobj
449 0 obj
-<< /S /GoTo /D (subsection.6.2.23) >>
+<< /S /GoTo /D (subsection.6.2.13) >>
endobj
452 0 obj
-(6.2.23 view Statement Grammar)
+(6.2.13 masters Statement Grammar)
endobj
453 0 obj
-<< /S /GoTo /D (subsection.6.2.24) >>
+<< /S /GoTo /D (subsection.6.2.14) >>
endobj
456 0 obj
-(6.2.24 view Statement Definition and Usage)
+(6.2.14 masters Statement Definition and Usage)
endobj
457 0 obj
-<< /S /GoTo /D (subsection.6.2.25) >>
+<< /S /GoTo /D (subsection.6.2.15) >>
endobj
460 0 obj
-(6.2.25 zone Statement Grammar)
+(6.2.15 options Statement Grammar)
endobj
461 0 obj
-<< /S /GoTo /D (subsection.6.2.26) >>
+<< /S /GoTo /D (subsection.6.2.16) >>
endobj
464 0 obj
-(6.2.26 zone Statement Definition and Usage)
+(6.2.16 options Statement Definition and Usage)
endobj
465 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.1) >>
endobj
468 0 obj
-(6.2.26.1 Zone Types)
+(6.2.16.1 Boolean Options)
endobj
469 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.2) >>
endobj
472 0 obj
-(6.2.26.2 Class)
+(6.2.16.2 Forwarding)
endobj
473 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.3) >>
endobj
476 0 obj
-(6.2.26.3 Zone Options)
+(6.2.16.3 Dual-stack Servers)
endobj
477 0 obj
-<< /S /GoTo /D (subsubsection.6.2.26.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.4) >>
endobj
480 0 obj
-(6.2.26.4 Dynamic Update Policies)
+(6.2.16.4 Access Control)
endobj
481 0 obj
-<< /S /GoTo /D (section.6.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.5) >>
endobj
484 0 obj
-(6.3 Zone File)
+(6.2.16.5 Interfaces)
endobj
485 0 obj
-<< /S /GoTo /D (subsection.6.3.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.6) >>
endobj
488 0 obj
-(6.3.1 Types of Resource Records and When to Use Them)
+(6.2.16.6 Query Address)
endobj
489 0 obj
-<< /S /GoTo /D (subsubsection.6.3.1.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.7) >>
endobj
492 0 obj
-(6.3.1.1 Resource Records)
+(6.2.16.7 Zone Transfers)
endobj
493 0 obj
-<< /S /GoTo /D (subsubsection.6.3.1.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.8) >>
endobj
496 0 obj
-(6.3.1.2 Textual expression of RRs)
+(6.2.16.8 UDP Port Lists)
endobj
497 0 obj
-<< /S /GoTo /D (subsection.6.3.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.9) >>
endobj
500 0 obj
-(6.3.2 Discussion of MX Records)
+(6.2.16.9 Operating System Resource Limits)
endobj
501 0 obj
-<< /S /GoTo /D (subsection.6.3.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.10) >>
endobj
504 0 obj
-(6.3.3 Setting TTLs)
+(6.2.16.10 Server Resource Limits)
endobj
505 0 obj
-<< /S /GoTo /D (subsection.6.3.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.11) >>
endobj
508 0 obj
-(6.3.4 Inverse Mapping in IPv4)
+(6.2.16.11 Periodic Task Intervals)
endobj
509 0 obj
-<< /S /GoTo /D (subsection.6.3.5) >>
+<< /S /GoTo /D (subsubsection.6.2.16.12) >>
endobj
512 0 obj
-(6.3.5 Other Zone File Directives)
+(6.2.16.12 Topology)
endobj
513 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.13) >>
endobj
516 0 obj
-(6.3.5.1 The @ \(at-sign\))
+(6.2.16.13 The sortlist Statement)
endobj
517 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.2) >>
+<< /S /GoTo /D (subsubsection.6.2.16.14) >>
endobj
520 0 obj
-(6.3.5.2 The \044ORIGIN Directive)
+(6.2.16.14 RRset Ordering)
endobj
521 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.3) >>
+<< /S /GoTo /D (subsubsection.6.2.16.15) >>
endobj
524 0 obj
-(6.3.5.3 The \044INCLUDE Directive)
+(6.2.16.15 Tuning)
endobj
525 0 obj
-<< /S /GoTo /D (subsubsection.6.3.5.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.16) >>
endobj
528 0 obj
-(6.3.5.4 The \044TTL Directive)
+(6.2.16.16 Built-in server information zones)
endobj
529 0 obj
-<< /S /GoTo /D (subsection.6.3.6) >>
+<< /S /GoTo /D (subsubsection.6.2.16.17) >>
endobj
532 0 obj
-(6.3.6 BIND Master File Extension: the \044GENERATE Directive)
+(6.2.16.17 Built-in Empty Zones)
endobj
533 0 obj
-<< /S /GoTo /D (subsection.6.3.7) >>
+<< /S /GoTo /D (subsubsection.6.2.16.18) >>
endobj
536 0 obj
-(6.3.7 Additional File Formats)
+(6.2.16.18 Additional Section Caching)
endobj
537 0 obj
-<< /S /GoTo /D (section.6.4) >>
+<< /S /GoTo /D (subsubsection.6.2.16.19) >>
endobj
540 0 obj
-(6.4 BIND9 Statistics)
+(6.2.16.19 Content Filtering)
endobj
541 0 obj
-<< /S /GoTo /D (subsubsection.6.4.0.1) >>
+<< /S /GoTo /D (subsubsection.6.2.16.20) >>
endobj
544 0 obj
-(6.4.0.1 The Statistics File)
+(6.2.16.20 Response Policy Zone \(RPZ\) Rewriting)
endobj
545 0 obj
-<< /S /GoTo /D (subsection.6.4.1) >>
+<< /S /GoTo /D (subsection.6.2.17) >>
endobj
548 0 obj
-(6.4.1 Statistics Counters)
+(6.2.17 server Statement Grammar)
endobj
549 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.1) >>
+<< /S /GoTo /D (subsection.6.2.18) >>
endobj
552 0 obj
-(6.4.1.1 Name Server Statistics Counters)
+(6.2.18 server Statement Definition and Usage)
endobj
553 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.2) >>
+<< /S /GoTo /D (subsection.6.2.19) >>
endobj
556 0 obj
-(6.4.1.2 Zone Maintenance Statistics Counters)
+(6.2.19 statistics-channels Statement Grammar)
endobj
557 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.3) >>
+<< /S /GoTo /D (subsection.6.2.20) >>
endobj
560 0 obj
-(6.4.1.3 Resolver Statistics Counters)
+(6.2.20 statistics-channels Statement Definition and Usage)
endobj
561 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.4) >>
+<< /S /GoTo /D (subsection.6.2.21) >>
endobj
564 0 obj
-(6.4.1.4 Socket I/O Statistics Counters)
+(6.2.21 trusted-keys Statement Grammar)
endobj
565 0 obj
-<< /S /GoTo /D (subsubsection.6.4.1.5) >>
+<< /S /GoTo /D (subsection.6.2.22) >>
endobj
568 0 obj
-(6.4.1.5 Compatibility with BIND 8 Counters)
+(6.2.22 trusted-keys Statement Definition and Usage)
endobj
569 0 obj
-<< /S /GoTo /D (chapter.7) >>
+<< /S /GoTo /D (subsection.6.2.23) >>
endobj
572 0 obj
-(7 BIND 9 Security Considerations)
+(6.2.23 managed-keys Statement Grammar)
endobj
573 0 obj
-<< /S /GoTo /D (section.7.1) >>
+<< /S /GoTo /D (subsection.6.2.24) >>
endobj
576 0 obj
-(7.1 Access Control Lists)
+(6.2.24 managed-keys Statement Definition and Usage)
endobj
577 0 obj
-<< /S /GoTo /D (section.7.2) >>
+<< /S /GoTo /D (subsection.6.2.25) >>
endobj
580 0 obj
-(7.2 Chroot and Setuid)
+(6.2.25 view Statement Grammar)
endobj
581 0 obj
-<< /S /GoTo /D (subsection.7.2.1) >>
+<< /S /GoTo /D (subsection.6.2.26) >>
endobj
584 0 obj
-(7.2.1 The chroot Environment)
+(6.2.26 view Statement Definition and Usage)
endobj
585 0 obj
-<< /S /GoTo /D (subsection.7.2.2) >>
+<< /S /GoTo /D (subsection.6.2.27) >>
endobj
588 0 obj
-(7.2.2 Using the setuid Function)
+(6.2.27 zone Statement Grammar)
endobj
589 0 obj
-<< /S /GoTo /D (section.7.3) >>
+<< /S /GoTo /D (subsection.6.2.28) >>
endobj
592 0 obj
-(7.3 Dynamic Update Security)
+(6.2.28 zone Statement Definition and Usage)
endobj
593 0 obj
-<< /S /GoTo /D (chapter.8) >>
+<< /S /GoTo /D (subsubsection.6.2.28.1) >>
endobj
596 0 obj
-(8 Troubleshooting)
+(6.2.28.1 Zone Types)
endobj
597 0 obj
-<< /S /GoTo /D (section.8.1) >>
+<< /S /GoTo /D (subsubsection.6.2.28.2) >>
endobj
600 0 obj
-(8.1 Common Problems)
+(6.2.28.2 Class)
endobj
601 0 obj
-<< /S /GoTo /D (subsection.8.1.1) >>
+<< /S /GoTo /D (subsubsection.6.2.28.3) >>
endobj
604 0 obj
-(8.1.1 It's not working; how can I figure out what's wrong?)
+(6.2.28.3 Zone Options)
endobj
605 0 obj
-<< /S /GoTo /D (section.8.2) >>
+<< /S /GoTo /D (subsubsection.6.2.28.4) >>
endobj
608 0 obj
-(8.2 Incrementing and Changing the Serial Number)
+(6.2.28.4 Dynamic Update Policies)
endobj
609 0 obj
-<< /S /GoTo /D (section.8.3) >>
+<< /S /GoTo /D (section.6.3) >>
endobj
612 0 obj
-(8.3 Where Can I Get Help?)
+(6.3 Zone File)
endobj
613 0 obj
-<< /S /GoTo /D (appendix.A) >>
+<< /S /GoTo /D (subsection.6.3.1) >>
endobj
616 0 obj
-(A Appendices)
+(6.3.1 Types of Resource Records and When to Use Them)
endobj
617 0 obj
-<< /S /GoTo /D (section.A.1) >>
+<< /S /GoTo /D (subsubsection.6.3.1.1) >>
endobj
620 0 obj
-(A.1 Acknowledgments)
+(6.3.1.1 Resource Records)
endobj
621 0 obj
-<< /S /GoTo /D (subsection.A.1.1) >>
+<< /S /GoTo /D (subsubsection.6.3.1.2) >>
endobj
624 0 obj
-(A.1.1 A Brief History of the DNS and BIND)
+(6.3.1.2 Textual expression of RRs)
endobj
625 0 obj
-<< /S /GoTo /D (section.A.2) >>
+<< /S /GoTo /D (subsection.6.3.2) >>
endobj
628 0 obj
-(A.2 General DNS Reference Information)
+(6.3.2 Discussion of MX Records)
endobj
629 0 obj
-<< /S /GoTo /D (subsection.A.2.1) >>
+<< /S /GoTo /D (subsection.6.3.3) >>
endobj
632 0 obj
-(A.2.1 IPv6 addresses \(AAAA\))
+(6.3.3 Setting TTLs)
endobj
633 0 obj
-<< /S /GoTo /D (section.A.3) >>
+<< /S /GoTo /D (subsection.6.3.4) >>
endobj
636 0 obj
-(A.3 Bibliography \(and Suggested Reading\))
+(6.3.4 Inverse Mapping in IPv4)
endobj
637 0 obj
-<< /S /GoTo /D (subsection.A.3.1) >>
+<< /S /GoTo /D (subsection.6.3.5) >>
endobj
640 0 obj
-(A.3.1 Request for Comments \(RFCs\))
+(6.3.5 Other Zone File Directives)
endobj
641 0 obj
-<< /S /GoTo /D (subsection.A.3.2) >>
+<< /S /GoTo /D (subsubsection.6.3.5.1) >>
endobj
644 0 obj
-(A.3.2 Internet Drafts)
+(6.3.5.1 The @ \(at-sign\))
endobj
645 0 obj
-<< /S /GoTo /D (subsection.A.3.3) >>
+<< /S /GoTo /D (subsubsection.6.3.5.2) >>
endobj
648 0 obj
-(A.3.3 Other Documents About BIND)
+(6.3.5.2 The \044ORIGIN Directive)
endobj
649 0 obj
-<< /S /GoTo /D (appendix.B) >>
+<< /S /GoTo /D (subsubsection.6.3.5.3) >>
endobj
652 0 obj
-(B Manual pages)
+(6.3.5.3 The \044INCLUDE Directive)
endobj
653 0 obj
-<< /S /GoTo /D (section.B.1) >>
+<< /S /GoTo /D (subsubsection.6.3.5.4) >>
endobj
656 0 obj
-(B.1 dig)
+(6.3.5.4 The \044TTL Directive)
endobj
657 0 obj
-<< /S /GoTo /D (section.B.2) >>
+<< /S /GoTo /D (subsection.6.3.6) >>
endobj
660 0 obj
-(B.2 host)
+(6.3.6 BIND Master File Extension: the \044GENERATE Directive)
endobj
661 0 obj
-<< /S /GoTo /D (section.B.3) >>
+<< /S /GoTo /D (subsection.6.3.7) >>
endobj
664 0 obj
-(B.3 dnssec-dsfromkey)
+(6.3.7 Additional File Formats)
endobj
665 0 obj
-<< /S /GoTo /D (section.B.4) >>
+<< /S /GoTo /D (section.6.4) >>
endobj
668 0 obj
-(B.4 dnssec-keyfromlabel)
+(6.4 BIND9 Statistics)
endobj
669 0 obj
-<< /S /GoTo /D (section.B.5) >>
+<< /S /GoTo /D (subsubsection.6.4.0.1) >>
endobj
672 0 obj
-(B.5 dnssec-keygen)
+(6.4.0.1 The Statistics File)
endobj
673 0 obj
-<< /S /GoTo /D (section.B.6) >>
+<< /S /GoTo /D (subsection.6.4.1) >>
endobj
676 0 obj
-(B.6 dnssec-signzone)
+(6.4.1 Statistics Counters)
endobj
677 0 obj
-<< /S /GoTo /D (section.B.7) >>
+<< /S /GoTo /D (subsubsection.6.4.1.1) >>
endobj
680 0 obj
-(B.7 named-checkconf)
+(6.4.1.1 Name Server Statistics Counters)
endobj
681 0 obj
-<< /S /GoTo /D (section.B.8) >>
+<< /S /GoTo /D (subsubsection.6.4.1.2) >>
endobj
684 0 obj
-(B.8 named-checkzone)
+(6.4.1.2 Zone Maintenance Statistics Counters)
endobj
685 0 obj
-<< /S /GoTo /D (section.B.9) >>
+<< /S /GoTo /D (subsubsection.6.4.1.3) >>
endobj
688 0 obj
-(B.9 named)
+(6.4.1.3 Resolver Statistics Counters)
endobj
689 0 obj
-<< /S /GoTo /D (section.B.10) >>
+<< /S /GoTo /D (subsubsection.6.4.1.4) >>
endobj
692 0 obj
-(B.10 nsupdate)
+(6.4.1.4 Socket I/O Statistics Counters)
endobj
693 0 obj
-<< /S /GoTo /D (section.B.11) >>
+<< /S /GoTo /D (subsubsection.6.4.1.5) >>
endobj
696 0 obj
-(B.11 rndc)
+(6.4.1.5 Compatibility with BIND 8 Counters)
endobj
697 0 obj
-<< /S /GoTo /D (section.B.12) >>
+<< /S /GoTo /D (chapter.7) >>
endobj
700 0 obj
-(B.12 rndc.conf)
+(7 BIND 9 Security Considerations)
endobj
701 0 obj
-<< /S /GoTo /D (section.B.13) >>
+<< /S /GoTo /D (section.7.1) >>
endobj
704 0 obj
-(B.13 rndc-confgen)
+(7.1 Access Control Lists)
endobj
705 0 obj
-<< /S /GoTo /D [706 0 R /FitH ] >>
+<< /S /GoTo /D (section.7.2) >>
+endobj
+708 0 obj
+(7.2 Chroot and Setuid)
+endobj
+709 0 obj
+<< /S /GoTo /D (subsection.7.2.1) >>
+endobj
+712 0 obj
+(7.2.1 The chroot Environment)
+endobj
+713 0 obj
+<< /S /GoTo /D (subsection.7.2.2) >>
+endobj
+716 0 obj
+(7.2.2 Using the setuid Function)
+endobj
+717 0 obj
+<< /S /GoTo /D (section.7.3) >>
+endobj
+720 0 obj
+(7.3 Dynamic Update Security)
+endobj
+721 0 obj
+<< /S /GoTo /D (chapter.8) >>
+endobj
+724 0 obj
+(8 Troubleshooting)
+endobj
+725 0 obj
+<< /S /GoTo /D (section.8.1) >>
+endobj
+728 0 obj
+(8.1 Common Problems)
+endobj
+729 0 obj
+<< /S /GoTo /D (subsection.8.1.1) >>
+endobj
+732 0 obj
+(8.1.1 It's not working; how can I figure out what's wrong?)
+endobj
+733 0 obj
+<< /S /GoTo /D (section.8.2) >>
+endobj
+736 0 obj
+(8.2 Incrementing and Changing the Serial Number)
+endobj
+737 0 obj
+<< /S /GoTo /D (section.8.3) >>
+endobj
+740 0 obj
+(8.3 Where Can I Get Help?)
+endobj
+741 0 obj
+<< /S /GoTo /D (appendix.A) >>
+endobj
+744 0 obj
+(A Appendices)
+endobj
+745 0 obj
+<< /S /GoTo /D (section.A.1) >>
+endobj
+748 0 obj
+(A.1 Acknowledgments)
+endobj
+749 0 obj
+<< /S /GoTo /D (subsection.A.1.1) >>
+endobj
+752 0 obj
+(A.1.1 A Brief History of the DNS and BIND)
+endobj
+753 0 obj
+<< /S /GoTo /D (section.A.2) >>
+endobj
+756 0 obj
+(A.2 General DNS Reference Information)
+endobj
+757 0 obj
+<< /S /GoTo /D (subsection.A.2.1) >>
+endobj
+760 0 obj
+(A.2.1 IPv6 addresses \(AAAA\))
+endobj
+761 0 obj
+<< /S /GoTo /D (section.A.3) >>
+endobj
+764 0 obj
+(A.3 Bibliography \(and Suggested Reading\))
+endobj
+765 0 obj
+<< /S /GoTo /D (subsection.A.3.1) >>
+endobj
+768 0 obj
+(A.3.1 Request for Comments \(RFCs\))
+endobj
+769 0 obj
+<< /S /GoTo /D (subsection.A.3.2) >>
+endobj
+772 0 obj
+(A.3.2 Internet Drafts)
+endobj
+773 0 obj
+<< /S /GoTo /D (subsection.A.3.3) >>
+endobj
+776 0 obj
+(A.3.3 Other Documents About BIND)
+endobj
+777 0 obj
+<< /S /GoTo /D (section.A.4) >>
+endobj
+780 0 obj
+(A.4 BIND 9 DNS Library Support)
+endobj
+781 0 obj
+<< /S /GoTo /D (subsection.A.4.1) >>
+endobj
+784 0 obj
+(A.4.1 Prerequisite)
+endobj
+785 0 obj
+<< /S /GoTo /D (subsection.A.4.2) >>
+endobj
+788 0 obj
+(A.4.2 Compilation)
+endobj
+789 0 obj
+<< /S /GoTo /D (subsection.A.4.3) >>
+endobj
+792 0 obj
+(A.4.3 Installation)
+endobj
+793 0 obj
+<< /S /GoTo /D (subsection.A.4.4) >>
+endobj
+796 0 obj
+(A.4.4 Known Defects/Restrictions)
+endobj
+797 0 obj
+<< /S /GoTo /D (subsection.A.4.5) >>
endobj
-709 0 obj <<
+800 0 obj
+(A.4.5 The dns.conf File)
+endobj
+801 0 obj
+<< /S /GoTo /D (subsection.A.4.6) >>
+endobj
+804 0 obj
+(A.4.6 Sample Applications)
+endobj
+805 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.1) >>
+endobj
+808 0 obj
+(A.4.6.1 sample: a simple stub resolver utility)
+endobj
+809 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.2) >>
+endobj
+812 0 obj
+(A.4.6.2 sample-async: a simple stub resolver, working asynchronously)
+endobj
+813 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.3) >>
+endobj
+816 0 obj
+(A.4.6.3 sample-request: a simple DNS transaction client)
+endobj
+817 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.4) >>
+endobj
+820 0 obj
+(A.4.6.4 sample-gai: getaddrinfo\(\) and getnameinfo\(\) test code)
+endobj
+821 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.5) >>
+endobj
+824 0 obj
+(A.4.6.5 sample-update: a simple dynamic update client program)
+endobj
+825 0 obj
+<< /S /GoTo /D (subsubsection.A.4.6.6) >>
+endobj
+828 0 obj
+(A.4.6.6 nsprobe: domain/name server checker in terms of RFC 4074)
+endobj
+829 0 obj
+<< /S /GoTo /D (subsection.A.4.7) >>
+endobj
+832 0 obj
+(A.4.7 Library References)
+endobj
+833 0 obj
+<< /S /GoTo /D (appendix.B) >>
+endobj
+836 0 obj
+(B Manual pages)
+endobj
+837 0 obj
+<< /S /GoTo /D (section.B.1) >>
+endobj
+840 0 obj
+(B.1 dig)
+endobj
+841 0 obj
+<< /S /GoTo /D (section.B.2) >>
+endobj
+844 0 obj
+(B.2 host)
+endobj
+845 0 obj
+<< /S /GoTo /D (section.B.3) >>
+endobj
+848 0 obj
+(B.3 dnssec-dsfromkey)
+endobj
+849 0 obj
+<< /S /GoTo /D (section.B.4) >>
+endobj
+852 0 obj
+(B.4 dnssec-keyfromlabel)
+endobj
+853 0 obj
+<< /S /GoTo /D (section.B.5) >>
+endobj
+856 0 obj
+(B.5 dnssec-keygen)
+endobj
+857 0 obj
+<< /S /GoTo /D (section.B.6) >>
+endobj
+860 0 obj
+(B.6 dnssec-revoke)
+endobj
+861 0 obj
+<< /S /GoTo /D (section.B.7) >>
+endobj
+864 0 obj
+(B.7 dnssec-settime)
+endobj
+865 0 obj
+<< /S /GoTo /D (section.B.8) >>
+endobj
+868 0 obj
+(B.8 dnssec-signzone)
+endobj
+869 0 obj
+<< /S /GoTo /D (section.B.9) >>
+endobj
+872 0 obj
+(B.9 named-checkconf)
+endobj
+873 0 obj
+<< /S /GoTo /D (section.B.10) >>
+endobj
+876 0 obj
+(B.10 named-checkzone)
+endobj
+877 0 obj
+<< /S /GoTo /D (section.B.11) >>
+endobj
+880 0 obj
+(B.11 named)
+endobj
+881 0 obj
+<< /S /GoTo /D (section.B.12) >>
+endobj
+884 0 obj
+(B.12 named-journalprint)
+endobj
+885 0 obj
+<< /S /GoTo /D (section.B.13) >>
+endobj
+888 0 obj
+(B.13 nsupdate)
+endobj
+889 0 obj
+<< /S /GoTo /D (section.B.14) >>
+endobj
+892 0 obj
+(B.14 rndc)
+endobj
+893 0 obj
+<< /S /GoTo /D (section.B.15) >>
+endobj
+896 0 obj
+(B.15 rndc.conf)
+endobj
+897 0 obj
+<< /S /GoTo /D (section.B.16) >>
+endobj
+900 0 obj
+(B.16 rndc-confgen)
+endobj
+901 0 obj
+<< /S /GoTo /D (section.B.17) >>
+endobj
+904 0 obj
+(B.17 ddns-confgen)
+endobj
+905 0 obj
+<< /S /GoTo /D (section.B.18) >>
+endobj
+908 0 obj
+(B.18 arpaname)
+endobj
+909 0 obj
+<< /S /GoTo /D (section.B.19) >>
+endobj
+912 0 obj
+(B.19 genrandom)
+endobj
+913 0 obj
+<< /S /GoTo /D (section.B.20) >>
+endobj
+916 0 obj
+(B.20 isc-hmac-fixup)
+endobj
+917 0 obj
+<< /S /GoTo /D (section.B.21) >>
+endobj
+920 0 obj
+(B.21 nsec3hash)
+endobj
+921 0 obj
+<< /S /GoTo /D [922 0 R /FitH ] >>
+endobj
+925 0 obj <<
/Length 240
/Filter /FlateDecode
>>
@@ -1060,32 +1384,32 @@ stream
xÚ•OKA Åïó)rl›N2Éü9ZªRA¡27ñ°´[)¸[ºÖïïlWË‚^$0ïý˜y[Š *Z—BTK
ÛÖXx+Þ½¡oFÔ¡Šsåð‡[ LÁ+T\@1M±_8±Eo=C¥BÈÌ~À—Ù,C yÄŠƒÂ•Ë»—Ùrý´š——ì,ãf׺Ãǹ¯ÏÇ~”ž›}Ó7ݶ™¿æ a$/¾äKc¼\óXwŸõûà›Û| §â1'p®äðqH'`Ô ð3‹zšüßÚ±y±n VG³1°™ž07l(%tî[þM^Xúendstream
endobj
-706 0 obj <<
+922 0 obj <<
/Type /Page
-/Contents 709 0 R
-/Resources 708 0 R
+/Contents 925 0 R
+/Resources 924 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
+/Parent 931 0 R
>> endobj
-707 0 obj <<
+923 0 obj <<
/Type /XObject
/Subtype /Form
/FormType 1
/PTEX.FileName (./isc-logo.pdf)
/PTEX.PageNumber 1
-/PTEX.InfoDict 716 0 R
+/PTEX.InfoDict 932 0 R
/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
/BBox [0.00000000 0.00000000 612.00000000 792.00000000]
/PieceInfo <<
-/Illustrator 717 0 R
+/Illustrator 933 0 R
>>
/Resources <<
/ColorSpace <<
-/CS0 718 0 R
+/CS0 934 0 R
>>/Properties <<
-/MC0 719 0 R
+/MC0 935 0 R
>>/ExtGState <<
-/GS0 720 0 R
+/GS0 936 0 R
>>>>
/Length 843
/Filter /FlateDecode
@@ -1101,7 +1425,7 @@ BqÕ•l9uš
!=§ ¨Œø†vGc £I#/'~<1‚ÀÔRPy±´ýl1½Ͷw1 чd }¡þa
Ë9b :žÎÞF" ‹>64”~0IGD˜Ë Ø°$ÙtMâ¯%Z½Gð¾¥Úñ§aÑÌ‘ I¼ ý—/øýzü+À
endobj
-716 0 obj
+932 0 obj
<<
/CreationDate (D:20100303120319-08'00')
/Creator (Adobe Illustrator CS3)
@@ -1110,24 +1434,24 @@ endobj
/Title (ISC_logo_only_RGB)
>>
endobj
-717 0 obj
+933 0 obj
<<
-/Private 721 0 R
+/Private 937 0 R
/LastModified (D:20100412113400-07'00')
>>
endobj
-718 0 obj
-[/ICCBased 722 0 R]
+934 0 obj
+[/ICCBased 938 0 R]
endobj
-719 0 obj
+935 0 obj
<<
-/Intent 723 0 R
-/Usage 724 0 R
+/Intent 939 0 R
+/Usage 940 0 R
/Name (Layer 1)
/Type /OCG
>>
endobj
-720 0 obj
+936 0 obj
<<
/OPM 1
/BM /Normal
@@ -1141,22 +1465,22 @@ endobj
/SA true
>>
endobj
-721 0 obj
+937 0 obj
<<
/RoundtripVersion 13
/ContainerVersion 11
/CreatorVersion 13
-/AIMetaData 725 0 R
-/AIPrivateData1 726 0 R
-/AIPrivateData2 727 0 R
-/AIPrivateData3 728 0 R
-/AIPrivateData4 729 0 R
-/AIPrivateData5 730 0 R
+/AIMetaData 941 0 R
+/AIPrivateData1 942 0 R
+/AIPrivateData2 943 0 R
+/AIPrivateData3 944 0 R
+/AIPrivateData4 945 0 R
+/AIPrivateData5 946 0 R
/NumBlock 5
/RoundtripStreamType 1
>>
endobj
-722 0 obj
+938 0 obj
<<
/Length 281
/Filter /FlateDecode
@@ -1167,10 +1491,10 @@ H‰b``2ptqre``ÈÍ+)
rwRˆˆŒR`?ÏÀÆÀÌ
ò‹KRS€j!îAˆBPˆi
endobj
-723 0 obj
+939 0 obj
[/View/Design]
endobj
-724 0 obj
+940 0 obj
<<
/CreatorInfo <<
/Subtype /Artwork
@@ -1178,21 +1502,21 @@ endobj
>>
>>
endobj
-725 0 obj
+941 0 obj
<<
/Length 981
>>
stream
%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Brian Reid) () %%Title: (ISC_logo_only_RGB.ai) %%CreationDate: 4/12/10 11:34 AM %%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0.658824 0.8 (ISC logo blue) %%+ 0.372549 0.376471 0.384314 (PANTONE 425 U) %%+ 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 33.1201 594 786.96 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 3 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 0 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -381 793 0.92 1268 743 26 0 0 117 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream
endobj
-726 0 obj
+942 0 obj
<<
/Length 11082
>>
stream
%%BoundingBox: 247 367 366 413 %%HiResBoundingBox: 247.0869 367.5654 365.0859 412.583 %AI7_Thumbnail: 128 52 8 %%BeginData: 10932 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1F52285252A8FD04FFFD05A8FFFFFFA87DFD4F52285252522852 %525228525252285252522852525228525252285252522852277DA8FFFFA8 %7D7D525227FD04527DA8FFFFA85252275252522852525228525252285252 %522852525228525252285252522852525228525252285252522852525228 %52525228525252285252522852525228525252285252522852525228FD21 %52A8FFFF7D7D525227FD0752275252A8FFFF7DFD215227FD2A522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227527DFFFFA85252 %27522E5227522E5227522E5227522752A8FF7D5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E522752277D7D7D275227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %2E5227FD1A52277DA8FFA87D2EFD11522E527DFFA853FD1D52A8FFFFFF7D %28FD285228525252285252522852525228525252285252522852277DFFFF %7D522752525228525252285252522852525228525252275252FFA8522752 %285252522852525228525252285252522852525228525252277DFFA852A8 %FF5227525252285252522852525228525252285252522852525228525252 %285252522852525228FD1852277DFFFFFD1B52FFA8FD1A527DFFA8275252 %FF7DFD265227522E5227522E5227522E5227522E5227522E522752277DFF %FF525227522E5227522E5227522E5227522E5227522E5227522E52275252 %FFA852275227522E5227522E5227522E5227522E5227522E522752A8A827 %522E527DA9275227522E5227522E5227522E5227522E5227522E52275227 %5227522E5227522E5227522EFD17527DFFA8FD1E527DFFA8FD17527DFFFD %0452287DFFFD155228FD075228FD08522852525228525252285252522852 %5252285252522852527D2752525228525252285252522852525228525252 %2852525228525252285252527DFF7D522852525228525252285252522852 %525228FD0452FF7D5228FD0452FF52522852525228525252285252522752 %2752527DA1A8A8FFCACFA8CAA17D5252275228FD3C52A8FFFD145228A8FF %53FD0652FFA82EFD0C527D7DCAFD04FFAFAF85AF85AFAFFFFFFFA87DFD05 %522E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522752A8 %FF275227522E5227522E5227522E5227522E522752FFA827522E5227522E %FF7D522E5227522E522752275252A8FFFFAFAF603CFD041413FD04143C60 %AFFFFF535227FD3A52277DFFA827FD11527DFFFD0852A8FFFD0952A8CFFF %FFAF3C3D1414141A141A141A141A141A14141461AFFFA8FD045228525252 %285252522852525228525252285252522852525228525252285252522852 %5252285252522852525228525252285252522852525227A8FF5227525252 %2852525228525252285252522EFFA85227525252285228A87D5252522852 %27527DFFFFAF603CFD07141A1414141A1414141AFD041460FFA8FD3D52FF %A8FD10527DFF7DFD0F527DFFFFA9611414141A141A141A141A141A141A14 %1A141A141A141A14143CFFA827522E5227522E5227522E5227522E522752 %2E5227522E5227522E5227522E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522E527DFF525227522E5227522E5227522E522752 %A8FF27522E5227522E5227522852275252A8FFFF3C1413FD191436FFFD3C %5259FFA828FD0E52FF7DFD0D527DFFFF8B1414141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141460285252522852525228525252 %285252522852525228525252275227522752275227525252285252522852 %52522852525228525252285252522852525227A8FF7D2752525228525252 %2852525227A8FF52275252522852525228522752A8FFA93CFD05141A1414 %141A1414141A1414141A1414141A1414141A1414141A1414FD1552285252 %7D527D597D527DFD065227FD1852FFA8FD0D52FFFFFD0A52277DFFFF601A %141A141A141A141A141A141A141A141A141A141A141A141A141A141A141A %141A142E5227522E5227522E5227522E5227522752527D7DA8A8FD09FFA8 %FFA8A87D532852275227522E5227522E5227522E5227522E5227522E527D %FF525227522E5227522E52275252FF7D522E5227522E522752277DFFFF36 %FD2314FD0E527D7DFD07FFA8A87DA87DA87DFD04A8FD05FFA87DFD15527D %FFA827FD0A52A8FF7DFD0952A8FFAF1414141A141A141A141A141A141A14 %1A141A141A141A141A141A141A141A141A141A141A145252285252522852 %525227527DA8FFFFFFA87D7D52522752275227522752275227522752527D %A8FFFFFFA87E52522752525228525252285252522852525227A8FF522752 %5252285252522752FFA8275252522852525227A8FF85FD05141A1414141A %1414141A1414141A1414141A1414141A1414141A1414141A1414141AFD07 %52275253A8FFFFFFA8FD045227FD0F522EFD04527D7DFFFFFFA87DFD1052 %7DFF7DFD0A52FF7DFD0852A8FF8B1414141A141A141A141A141A141A141A %141A141A141A141A141A141A141A141A141A141A141A1427522E52275227 %7DA8FFFFA85252275227522E5227522E5227522E5227522E5227522E5227 %522E52275227527DFFFFFF7D52275227522E5227522E5227522752A8A827 %5227522E52275227A8FF5227522752525227A8FF6113FD2714FD0652A8FF %FF7D7D28FD22527DA8FFFF7DFD0C5227A8FF7DFD0852A8FFFD06522EA8FF %61141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A141A141A14285227527DFFFF7D52522752285252522852 %525228525252285252522852525228525252285252522852525228522752 %52FFFFA8525228522852525228FD0452FF7D5228525252285252FF7D5252 %52285227A8FF611414141A1414141A1414141A1414141A1414141A141414 %1A1414141A1414141A1414141A1414141A141452277DFFFFA87D28FD2952 %287DFFFF7EFD0B52A8FFFD065227A8FF7D2752525227A8FF8B141A141A14 %1A141A141A141A141A141A141A141A141A141A141A141A141A141A141A14 %1A141A141A141A1428A8FFFF525227522E5227522E5227522E5227522E52 %27522E5227522E5227522E5227522E5227522E5227522E5227522E522752 %7DFFA87D275227522E522752277EFF52275227522852A8FF52522752277D %FF8BFD121413FD0F1413FD0914FFFFA8FD3352FFFFA8FD0952FF7DFD0652 %FFA8FD04527DFFAF141A141A141A141A141A141A141A141A141A14613C3C %141A141A141A141A141A141A143D3C3C141A141A141A14FF7D2752525228 %525252285252522852525228525252285252522852525228525252285252 %522852525228525252285252522852525227A8FFA8FD045228525252A8A8 %27522852277DFF7D27522752A8FFFD051461A9AF848B1414141A141436AF %AFFFFFFFAFAF36FD04141A14141461A9FFAFFFAFAF601A1414141A7D2EFD %3552277DFFFFFD0752A8FFFD05527DFFFD04527DFF3C14141A141484FFFF %FFAF1A141A141A85FD09FF841A141A141A14AFFD08FF841A141A1427522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522E5227522E5227522E5227522E5227522E5227522E52277DA8FF52522E %5227527DFF52522E5227FFA852275252FF60FD061485FFFFFFAFFD041460 %FD0BFF36FD0414AFFD0AFF60141414FD3A5253FFFF7DFD04527DFFA85252 %527DFFA8285252FFAF1A141A141A141A84FFFFFFAF3D141A14FD05FF603D %60FD04FFAF141A1461FD04FFA96136AFFD04FF141A142852525228525252 %285252522852525228525252285252522852525228525252285252522852 %52522852525228525252285252522852525228522752A8FF5252285252FF %A8FD0452FF7D5227A8FF3C141AFD051485FFFFFFAF14141460FD04FF3614 %141460FFFFFFA91A141484FFFFFFA91A141414FD04FF611414FD3D52A8FF %FD0452A8FF525228A8FF7D277DFF8B141A141A141A141A85FFFFFFAF1A14 %1A60FD04FF3C141A1461FD04FF141A14FD04FF8B141A141AAFFFFFFF601A %142E5227522E5227522E5227522E5227522E5227522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FF5252277DFF7D2752A8FF2752A8FFFD08141385FFFFFFAF1414 %1361FD04FF36FD04148584856014133CFD04FF60FD0414FD04FF851314FD %3D52287DFFFF525252FF7D5252FFA8527DFF3C1A141A141A141A141A85FF %FFFFAF1A141A60FD04FFAF141A141A141A141A141A3CFD04FF61141A141A %3C616061361A145252285252522852525228525252285252522852525228 %525252285252522852525228525252285252522852525228525252275252 %522752525228525252277DFF7E2752FFA82753FF7E27FFA914141A141414 %1A1414148BFFFFFFAF1414143CAFFD04FFAFFD091461FD04FF3614141AFD %07141AFD2B522852285227FD075227FD075227A8FF7D27FFA8527DFF7D7D %FF3D141A141A141A141A141484FFFFFFA91A141A1485FD06FF603C141A14 %1A14143CFD04FF61141A141A141A141A141A1427522E5227522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E522752275227 %FD04527D7DA8A8FFA8FFA8FFA8A87D7D52522752275227FFA8527DFF277D %FF52A8AF13FD0A1485FFFFFFAFFD0414138BFD06FFA860FD05143CFD04FF %36FD0B14FD2852A8A8FD07FFA8FFA8FFA8FD06FFA87D5227527DFF7D7DFF %7DA8FF7DFF3C1A141A141A141A141A141A84FFFFFFAF3D141A141A148BFD %07FF8B141A141A3CFD04FF61141A141A141A141A141A1428525252285252 %522852525228525252285252522852525228525252285252522752275252 %A8A8FFFFFFA8A87D7DFD065227FD04527D7DA8FFFFA87D2752A8FF52FF7D %A8A8CAA914141A1414141A1414141A1485FFFFFFAFFD071460A8FD06FF8B %1414143CFD04FF36FD04141A1414141A1414FD2252A8FD04FF7D7D525228 %5227FD0B52275252527DFFFFFF5253FFA8A8A8FFA8FF61141A141A141A14 %1A141A141A85FFFFFFAF1A141A141A141A141A60FD06FF85141A3CFD04FF %61141A141A141A141A141A142E5227522E5227522E5227522E5227522E52 %27522E5227522E5227522752277DA8FFFFA859522752275227522E522752 %2E5227522E5227522E5227522752277DA8FF7DA8FFFFA8FFFFAFFD0C1413 %85FFFFFFAFFD061413FD0414AFFD04FFA9141360FD04FF36FD051413FD05 %14FD1D527DFFFFFF7D7DFD1E52A8FFA8FD05FF601A141A141A141A141A14 %1A141A85FFFFFFAF1A141A143D363D141A141A14FD05FF3C1A3CFD04FF61 %141A141A60AF85AF601A1452522852525228525252285252522852525228 %52525228525252277DFFFFA87D2E52275252522852525228525252285252 %52285252522852525228525252285228527DFD06FF3C141A1414141A1414 %141A1414148BFFFFFFAF141414AFFFFFAF8BFD04143CFD04FF3C143CFD04 %FF60FD04148BFFFFFFAF1414FD1752285259FFFFA9525227FD2352A8FD04 %FFAF141A141A141A141A141A141A141484FFFFFFA91A141484FFFFFFA91A %141A1461FD04FF3C1414FD04FF8B141A141AA9FFFFFF85141427522E5227 %522E5227522E5227522E5227522E52275227527DFFA87D27522E5227522E %5227522E5227522E5227522E5227522E5227522E5227522E5227522E5227 %522752A8FFFFFF60FD0E1485FFFFFFAF14141485FD04FFFD041436FD04FF %3C141484FFFFFFA8FD0414FD04FF611414FD16527DFFFF7D5228FD275227 %A8FFFFFF3D141A141A141A141A141A141A141A84FFFFFFAF3D141460FD04 %FFAF363C3CFD05FF141A1461FD04FF853C148BFD04FF3C1A142752275227 %52275227522752275227522752275227A8FFA82852275227522752275227 %522752275227522752275227522752275227522752275227522752275227 %52275252FFFFAFFD0F1485FFFFFFAFFD0414A8FD05FFAFFD05FF36FD0414 %AFFD0AFF841414147D527D527D527D527D527D527D527D527D527D52A8FF %FF527D527D527D527D527D527D527D527D527D527D527D527D527D527D52 %7D527D527D527D527D527D527D527D527DA8FF853C363D3C3C363D3C3C36 %3D3C3C363D85FFFFFFAF3D363D3685FD0AFFAF3C363D3C3C60FD0AFF6136 %3D3CFD16FFA8FD49FFAFFD11FFAFFD09FFAFFFFFFF %%EndData endstream
endobj
-727 0 obj
+943 0 obj
<<
/Length 65536
>>
@@ -1466,7 +1790,7 @@ sÓ ·ÓíÑ·OÒ„ŸuMÊ’ÏyÒÁQÊ—*V€)-z=¦Hèªmƈœ~ÅñÓ×z…Sý[t¸c&4 ŽªªAj^råº;ņÜ(cçç
Dx^QÜ×}Ì
˜ØyY‰Ÿ‹© ¨zŽ…N¬V¥%™­‚¨™@“£=HU˜ü¢³l0¼Tq_PIÐ/u,dÆö¶fý"íŒØ¾MMæu [endstream
endobj
-728 0 obj
+944 0 obj
<<
/Length 65536
>>
@@ -1708,7 +2032,7 @@ qlÞ¯­ò×âô`>
¶“¬ûVG=# [ül&wJ΂fkíY”&{öñß1øÀ ÛÄ%'DSì
 F?؆Fß®U E2,„Ò -[‰Ðð~Eô׈bˆ¨<Þë‹uAhÜš:®—Ú[ɬëxÏ*}ñ
endobj
-729 0 obj
+945 0 obj
<<
/Length 65536
>>
@@ -1931,7 +2255,7 @@ uALŽk‹Š=ŽÉÀÇš?éì•ëðå0ƒ¨Ua¦7S“«ÙŽ®&éÀ­Ó˜çÈî¹m(‚4„Ћz35Ãùd2pnSø׸®÷—fSµNP™š
]×g1ͼ‘ôAÚF¥5³ò(ª®Í
endobj
-730 0 obj
+946 0 obj
<<
/Length 53114
>>
@@ -2128,1390 +2452,1811 @@ Y‘φ㧻Ç'ÇÕpV— ´Š›·§/ óü8
œ;ø# ñ<Ý°'€å‰íö Ð"W€­
Ö^IYïc­
endobj
-710 0 obj <<
-/D [706 0 R /XYZ 85.0394 794.5015 null]
+926 0 obj <<
+/D [922 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-711 0 obj <<
-/D [706 0 R /XYZ 85.0394 769.5949 null]
+927 0 obj <<
+/D [922 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-708 0 obj <<
-/Font << /F21 714 0 R >>
-/XObject << /Im1 707 0 R >>
+924 0 obj <<
+/Font << /F21 930 0 R >>
+/XObject << /Im1 923 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-733 0 obj <<
-/Length 1059
+949 0 obj <<
+/Length 1063
/Filter /FlateDecode
>>
stream
-xÚµVËn«HÝç+XÆRh÷ƒWÏŽ`l3Âà|£ÑÜY›ÄH‰± ¹Vþ~ªéŒ‰f3ò¢«éãªS§ªDÃð#ši!‹S®ÙÜ@&&¦¶}¿ÃÚ+¬-îˆÂ&C¦ÁL¾XÕ #ÃâšÎ 䀳KÐ Øâȶlªé¶É‘Å(èÇìn:§Tãˆ[ÔÒ²Í6m8¦Ö£²Ý_÷^uü<•¯ûfòwö»fbdc¤ÃX¶ba:'Æ…'B@nkúî'$*¡£ „"HU¤)@cãa¢S ÓLk0íÁt“÷&ÁÒ
-Mq:œ¥ŸuS¼×râU‡º:5åÇûC‡Ý¢‰Îš&þI©¤ž`Jë;?ëõ$Œ"Ó²,Œ@!¹ù­ø=Z¿„ߪO˜ ·ùàõßä§ÿ§üx” &Lö¥ºÕKsÎOâÜ×£ký ³)ÅŽfS<-ç[ù:°~‰¾UÏtÅ” >E:ëâô^ÖuY$§¦’ãG]¨|¶ ï„r¯æïÕ®|}É»iu’ö®¬›SùüѨ›}©ª¾Éÿ¥ûS~ø”Æñãt¬jµ|.›½´:œøR}(=_
-…ƒ
-ÙiíôP5å¶è5¸Nøx%í~<¹ÊªTëùÛ›L„;ˆcËg±Ë¢nšsÄ %'6âŒÚ-$[úªÕâyö4áôÞMÔ— •ã:‰3&gb÷ºi‡3i»Ñ¬ûèIcVè+vÃP*JâFYà«Å§ [J+ñn2“ÛŽ`FÇ)eBýXB³eGñ ò‘nfA´¸
-¬ÖaÐåò“x.Ç•ŸxKX˜Øƽû„Aöç¨`g!n8vÇŽ´ìæAùiŠ:rŒ_ÿ‡þ$áåÀ¨ÓëQQ÷1Tö<Nº¨*|ºö½À :ßk9v'ntó \´ @0²Æbzq”úl€xTÝ•»èµ¸>Z}Zº"J–ÆXÒU/Ý„í×^úy¯Tbq:ˆ,(aãU7©ßå&Ý·óŽ¥Ó‡Ž‡]œŒ5w»ÑË‚8—ÒÎw¤Qä/Â`áGž?Ž·žWxP‡ŒË-›1™0ò7éeHåØM‚´—"Þdc&ñk`ùŒ‡mÑïSÐgTV±ñ9#c×~³r‡|æßm™›«„ n[p@šà•|{•ô`ý}{•PJ±ÞûD¿zL\_tmš”ÂvcÖXnª7‰·ÏOàHyiäù]4ªï-dûJ¡¤Ø«J¿^ÙŒ.'/+á¢9”yëÁ0ááÀnúÔ•î™pOÇÄöMsüm:=ŸÏBaTÖ[Tµ¤^§7·¶z´2‰gé~²þpz”¦endstream
+xÚµV]“ª8}Ÿ_ÁãX5D’0ûÆ *[.àÚÚ»ŒâHÕŒXÂ\kþývH
+c2Š˜I)Lî¬ê&#ˆB5šhÞ.Q7hf#Š)×t›qdQø ŸÓ‡ñŒ#nKKwšEáŒh*Ýþõè–ǯSñ¶¯G§¿kÌ@¶Á¢†!±0žaó“Nmq[Ó/p?!S ÅA®"O"†a>t a²Þ´zÓîÍIoòÎÄFobiù‡:?òZÎ’¯ªÎ?*9qËCUžêâóã©ÅnÐH§Ø
+Dá1F„Boè`pÛU¤·ÏeÀWàí”AQ¶Šø±Y,Û|ÛÒÍêÖRî³×òWÞK!;­™ʺØä× ¯¤ÀÇ<SYj={—‰ð â†Å†™@ì"¯šFæ58¢&…’cqJì’.<ÕjÑ,}qòèÄê‹ŸÈqG?ü©7•3±{¤Eˆ™´pÚ~t¥1+pü¥;A %vÂÔ÷Ôâ‹Ÿ.¤{s'žÊm §1%ÔR¡~$¡é¢¥x‡|èë©ί‚ûËUà·¹ÜcÍä¸ôbw #Û|tžýÀOÿìì,Ä͉ݲà »™Ÿ†^’ –ƒCÅ×ûá?IxÑ3jõzVÔßy”=‹â6ª
+Ÿ¬<×w‚§VãØsŽí‰Þ|M`YC1Ý(L¼?ÖÀ
+<*‡ÎÒ™wZ\¬¾,%M"H,n«—¬ƒæk'ý,Ž–*±(éE” ãU׉×æ&Ý7òŽ¥“§–‡]5wÚÑMý(–ÒNcg QèÍî…®7Œ5žWx –[6c<¢6ä­“ËʱûI'E´N‡L¢+ÖÀ,ô.÷Û¢Û§ Ï ¬bãsŠ‡"®¼:géôù̾Û27W ÁÂܶà€dà{•t`ý}{•‚¶'¼ó)ˆÞ{L\_tMšÞh&µ†úsf(ð>;#奖çw^«¾·í+…â|{.KuþºE=¸œÜì½€‹æPd“ÁÃÞô©#ÝSáž ‰íëúøÛx|>Ÿ…¨¨6¨lH½onmõ€¥ ‰'ê~¾þN!–Éendstream
endobj
-732 0 obj <<
+948 0 obj <<
/Type /Page
-/Contents 733 0 R
-/Resources 731 0 R
+/Contents 949 0 R
+/Resources 947 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
+/Parent 931 0 R
>> endobj
-734 0 obj <<
-/D [732 0 R /XYZ 56.6929 794.5015 null]
+950 0 obj <<
+/D [948 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-731 0 obj <<
-/Font << /F22 737 0 R /F14 740 0 R >>
+947 0 obj <<
+/Font << /F22 953 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-743 0 obj <<
-/Length 2884
+959 0 obj <<
+/Length 2886
/Filter /FlateDecode
>>
stream
-xÚí]wÛ¸†ïó+tWûB(¾ ^:Ž“u·ÉæÄÎé×ö‚GflõX¤KQ¾ €# œÍn²±tr!ÙÒp&ó>Àf3jÿ±™Q„Š\β\E™š-V/èìÚ~öæsß‘J%…°?D>+aˆ2<›ÍáA^^¾øãkÎf\’Ìdlvùiô¥8á\ä³Ë«ÖU[VíúøŸ—ê r’k®»ïÓÙ\s"0ý7ÙñœQJΫ¶©¯6‹vYWÕ‹³ËŒ‚hÊäL›œd’².”áÃæz6¼ù°»ûþøØÇPv;D´ãÞ¥ IØ®Sœæö­±i×YF´d. ¤Ïƒ¢G‹ú®<žsû¶þ4¼¾ª›•Íæñ\™üˆØ›¯gù"ó/ùÿMRã3½#Ûç膻Bîÿ3ôDÂÀ(BŠ´êÎbí(⎢ŸšcfŽ®‹jùߢ?£¶€º¼Y®£%E¶?ÀL’â³™L
-0ÄHÙRkš”H)¨ó@Šï¥ô)‘bGê{ €eÄ!ñq]^ ï–Õ4.Bég È$>{Éd
-Á$† ê|Ä„e„)ª&ÜcÒ$îbRTWññÅ~.´|–TLâà3–Œ0Äp€Š 8DÂÀp@8P;ET\„ÃáïuÕ‹Mù³žÕ|ƒÑÅg<'`ˆáEpŠ„á„:8©œ“\ÉP®ôK‡Óɦ½©›ekg<÷åN¹R6÷eÓ_“²}¬KBÖR‘€†[ªˆI$ba HàΙ’$˲|¦ %F©±.*«Ø÷ÍrU4Ão [¼66g‚ïÕÀ•L0Ä(€B DÂÀ(@hC2•i@w\Ü÷ÅÍþ\)>Ç…O]2ÀãJƒp ãu>r¡4Ñ*€ á¹hËⶽyD†¦ù¡†YKFbH@U$"a`H ÎÇBJ¢4kåjˆÓbq³¬®'«aØÞ›“„ø$& 1B HršH!¨óqÐœHÍÇ’B…’âuÝü§èدzTäw2ùš×Ÿ½d4€!†TA#†ê|<8%B˱ÎÐnðˆÍ6À:úÛÍm»¼»u_ùPßv“ß\èç>óðéJfb,@9"a`,ì8‡;Ç~Ó[æÉ„ b˜[Ù/Ïß½r—ëzÓ,¼âå¿7˦\ùñh¶ÂŸºÅ -î­HÕd–àÑìì:m,H›&-„[«[Ü?¸ÁÓ ¢.;Ãû.Cý›!Ks# ?èÙrœzvACäìÚÒá&Æê<ð“ ¢„Ì?~sûôýGxBA\2j‹‡é ù<'3 1† ŽC‘00†Pç!m¯ÐB»•ï°íý¶\Õ~1h#™Ë8OÇ'7`ˆÅCÀ‰„ƒ:àÈœaÜ¥=ìŠ?®ñ†÷ç]»Û:,;ŸU÷Pu5´KôßY¯7]Å÷{jâúµÚ#B²’A
- ø]ll}ý}Š’õ†˜þPDÿH˜þ¨óñj@É8ED˜‹\,¯«b8ùÙ¡ ý2’¸!šS6&û‰$y»94Œ´sü¾¯cº­=†ÒŽ÷Øú!7‚P“K×Å0¬ž\ÝÛéŒ_bo²*‹vÓ”ëÉL…ƒ}få0dDVwŽÛghºiÉÌ®×X¡Î3Jòœ ¼ K‡ïêvùÉÎì홺Gw|«a À‹‘zBCäÜ#,Fê=¦ŒÖ…ͯ.¼z¨Š•/ë>Þ]­½š›L ú¿!ryNfh´Ã*b턹å
-€°u^-ÆÖNwãd˜QУ¦¨ÖŸB»iw3þù__îÆ×yöœÁ™DÅg3`ˆ¡ÕbÓ]§±80TPï;Þ¨ÜøŠÈ·¦\ÜÝ.[X*}¨…~ËáÈËÌ0ă2cŒEâÀC½×2F‰M_î! ײ³_À¦ýú1sÝïÊvsוHbŸáðéK†bp@y08"q`p Þý
+xÚí]wÛ¸†ïó+tWûB(¾ ^:Ž“u·ÉæÄÎé×ö‚GflõX¤KQ¾ €# œÍn²±tö´¥áÌÎû
+x6$a»N9pšÛCcÓ®³ŒhÉ\HŸE.õ]y<çö°þ4ü|U/6+›Íã¹2ù±?l¾žå™Éÿß$5>Ó;²}Ž`¸+äîù?CO$ Œ"Ôy H«î*ÖŽ"î(ú©9fæ躨–ÿ-ú+j ¨Ë›åú1ZRdûÌ$)>›É¤
+êœqNLžYç<'\_³È¾já6Vü„×›êªè†ˆâ¶3ŒØ»*䉘øL&c 1L R&‘00LPç#&,#LQ0á“~$q7“¢ºŠ/ös¡å³¤bŸ±d€!†TÁ!†ê|ÄÚ)¢â"à ¯«^lÊŸõ¬æŒ.>ãÉ8C '¨(‚S$ 'ÔyÀIåœäJ†r¥/X:œN6íMÝ,[;ã¹/wÊ•²¹/›þž”íc]²–Š4DØREL" AwΔ$Y–å3e(1JuÉP™Xžo–«¢y~y[Øâµ±9|¯†¨d
+€!F¡ Fê|¤@’©L
+¸£àⶸ<(nöçNñ9.|ê’¹
+¿Z×U½n— ÷Ð̈ƒ2fûHBÎ’
+‹µÁPá_ù™óœ˜ØûÆ»Õõ Î…~‰‰&Áº"15s_êb["_ø3yoÿ>ªendstream
endobj
-742 0 obj <<
+958 0 obj <<
/Type /Page
-/Contents 743 0 R
-/Resources 741 0 R
+/Contents 959 0 R
+/Resources 957 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R ]
+/Parent 931 0 R
+/Annots [ 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R ]
>> endobj
-746 0 obj <<
+962 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 688.709 539.579 697.4212]
/Subtype /Link
/A << /S /GoTo /D (chapter.1) >>
>> endobj
-747 0 obj <<
+963 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 676.5858 539.579 685.5919]
/Subtype /Link
/A << /S /GoTo /D (section.1.1) >>
>> endobj
-748 0 obj <<
+964 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 664.4876 539.579 673.4937]
/Subtype /Link
/A << /S /GoTo /D (section.1.2) >>
>> endobj
-749 0 obj <<
+965 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 652.3894 539.579 661.3954]
/Subtype /Link
/A << /S /GoTo /D (section.1.3) >>
>> endobj
-750 0 obj <<
+966 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 640.2911 539.579 649.1477]
/Subtype /Link
/A << /S /GoTo /D (section.1.4) >>
>> endobj
-751 0 obj <<
+967 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 628.1929 539.579 637.0495]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.1) >>
>> endobj
-752 0 obj <<
+968 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 616.0946 539.579 624.9512]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.2) >>
>> endobj
-753 0 obj <<
+969 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 603.9964 539.579 612.853]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.3) >>
>> endobj
-754 0 obj <<
+970 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 591.7985 539.579 600.7547]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.4) >>
>> endobj
-755 0 obj <<
+971 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 579.7002 539.579 588.6565]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.4.1) >>
>> endobj
-756 0 obj <<
+972 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 567.6019 539.579 576.5582]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.4.2) >>
>> endobj
-757 0 obj <<
+973 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 555.5037 539.579 564.46]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.4.3) >>
>> endobj
-758 0 obj <<
+974 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 543.5051 539.579 552.5112]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.5) >>
>> endobj
-759 0 obj <<
+975 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 531.4069 539.579 540.413]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.4.5.1) >>
>> endobj
-760 0 obj <<
+976 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 519.3086 539.579 528.3147]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.4.6) >>
>> endobj
-761 0 obj <<
+977 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 496.5559 539.579 505.288]
/Subtype /Link
/A << /S /GoTo /D (chapter.2) >>
>> endobj
-762 0 obj <<
+978 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 484.4775 539.579 493.4338]
/Subtype /Link
/A << /S /GoTo /D (section.2.1) >>
>> endobj
-763 0 obj <<
+979 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 472.3792 539.579 481.3355]
/Subtype /Link
/A << /S /GoTo /D (section.2.2) >>
>> endobj
-764 0 obj <<
+980 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 460.281 539.579 469.2373]
/Subtype /Link
/A << /S /GoTo /D (section.2.3) >>
>> endobj
-765 0 obj <<
+981 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 448.1827 539.579 457.139]
/Subtype /Link
/A << /S /GoTo /D (section.2.4) >>
>> endobj
-766 0 obj <<
+982 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 436.0845 539.579 445.0408]
/Subtype /Link
/A << /S /GoTo /D (section.2.5) >>
>> endobj
-767 0 obj <<
+983 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 413.5759 539.579 422.1635]
/Subtype /Link
/A << /S /GoTo /D (chapter.3) >>
>> endobj
-768 0 obj <<
+984 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 401.4527 539.579 410.3093]
/Subtype /Link
/A << /S /GoTo /D (section.3.1) >>
>> endobj
-769 0 obj <<
+985 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 389.3544 539.579 398.2111]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.1.1) >>
>> endobj
-770 0 obj <<
+986 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 377.2562 539.579 386.1128]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.1.2) >>
>> endobj
-771 0 obj <<
+987 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 365.0583 539.579 374.0146]
/Subtype /Link
/A << /S /GoTo /D (section.3.2) >>
>> endobj
-772 0 obj <<
+988 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 352.96 539.579 361.9163]
/Subtype /Link
/A << /S /GoTo /D (section.3.3) >>
>> endobj
-773 0 obj <<
+989 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 340.8618 539.579 349.818]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.3.1) >>
>> endobj
-774 0 obj <<
+990 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 328.7635 539.579 337.7198]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.3.3.1.1) >>
>> endobj
-775 0 obj <<
+991 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [532.6051 316.6653 539.579 325.6216]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.3.3.1.2) >>
>> endobj
-776 0 obj <<
+992 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 304.6667 539.579 313.6728]
+/Rect [527.6238 304.567 539.579 313.6728]
/Subtype /Link
/A << /S /GoTo /D (subsection.3.3.2) >>
>> endobj
-777 0 obj <<
+993 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 281.9139 539.579 290.7706]
/Subtype /Link
/A << /S /GoTo /D (chapter.4) >>
>> endobj
-778 0 obj <<
+994 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 269.8356 539.579 278.9413]
/Subtype /Link
/A << /S /GoTo /D (section.4.1) >>
>> endobj
-779 0 obj <<
+995 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 257.7373 539.579 266.8431]
/Subtype /Link
/A << /S /GoTo /D (section.4.2) >>
>> endobj
-780 0 obj <<
+996 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 245.6391 539.579 254.7448]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.2.1) >>
>> endobj
-781 0 obj <<
+997 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 233.6405 539.579 242.6465]
+/Rect [527.6238 233.5408 539.579 242.6465]
/Subtype /Link
/A << /S /GoTo /D (section.4.3) >>
>> endobj
-782 0 obj <<
+998 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 221.5422 539.579 230.5483]
+/Rect [527.6238 221.4426 539.579 230.5483]
/Subtype /Link
/A << /S /GoTo /D (section.4.4) >>
>> endobj
-783 0 obj <<
+999 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [527.6238 209.444 539.579 218.4501]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.4.1) >>
>> endobj
-784 0 obj <<
+1000 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 197.3457 539.579 206.3518]
+/Rect [527.6238 197.2461 539.579 206.3518]
/Subtype /Link
/A << /S /GoTo /D (section.4.5) >>
>> endobj
-785 0 obj <<
+1001 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 185.2475 539.579 194.2536]
+/Rect [527.6238 185.1478 539.579 194.1041]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.1) >>
>> endobj
-786 0 obj <<
+1002 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 173.1492 539.579 182.1553]
+/Rect [527.6238 173.0496 539.579 182.0058]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.4.5.1.1) >>
>> endobj
-787 0 obj <<
+1003 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 160.9513 539.579 170.0571]
+/Rect [527.6238 160.9513 539.579 169.9076]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.4.5.1.2) >>
>> endobj
-788 0 obj <<
+1004 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 148.8531 539.579 157.9588]
+/Rect [527.6238 148.8531 539.579 157.8094]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.2) >>
>> endobj
-789 0 obj <<
+1005 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 136.7548 539.579 145.8606]
+/Rect [527.6238 136.7548 539.579 145.7111]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.3) >>
>> endobj
-790 0 obj <<
+1006 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 124.6566 539.579 133.7623]
+/Rect [527.6238 124.7562 539.579 133.7623]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.4) >>
>> endobj
-791 0 obj <<
+1007 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 112.5583 539.579 121.6641]
+/Rect [527.6238 112.658 539.579 121.6641]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.5) >>
>> endobj
-792 0 obj <<
+1008 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 100.4601 539.579 109.5658]
+/Rect [527.6238 100.5597 539.579 109.5658]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.5.6) >>
>> endobj
-793 0 obj <<
+1009 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 88.3618 539.579 97.4676]
+/Rect [527.6238 88.4615 539.579 97.4676]
/Subtype /Link
/A << /S /GoTo /D (section.4.6) >>
>> endobj
-794 0 obj <<
+1010 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 76.2636 539.579 85.3693]
+/Rect [527.6238 76.3632 539.579 85.2199]
/Subtype /Link
/A << /S /GoTo /D (section.4.7) >>
>> endobj
-795 0 obj <<
+1011 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 64.1653 539.579 73.1216]
+/Rect [527.6238 64.265 539.579 73.1216]
/Subtype /Link
/A << /S /GoTo /D (section.4.8) >>
>> endobj
-744 0 obj <<
-/D [742 0 R /XYZ 85.0394 794.5015 null]
+960 0 obj <<
+/D [958 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-745 0 obj <<
-/D [742 0 R /XYZ 85.0394 711.9273 null]
+961 0 obj <<
+/D [958 0 R /XYZ 85.0394 711.9273 null]
>> endobj
-741 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R >>
+957 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-798 0 obj <<
-/Length 3163
+1014 0 obj <<
+/Length 3289
/Filter /FlateDecode
>>
stream
-xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±÷¥Û}`dÆÖ‰$z%9©ûé Š8´À‘ÐÆili÷ìÚ‰9œñüÂ`@d#êÿe#¥‰vÜŒ“DQ¦F“ù ]ùŸ½9aí1ãpÐõüâä/¯…9â4×£‹Ï#©ájs2K¨µltqùûé‹÷ï.^½»8?ûãâ—“Wñ¬Ð3£¢>åŸ'¿ÿAG—>€_N(ΪÑ7ÿJ˜s|4?‘J%…3;9?ù5žütcšüM%\hžøU8¿JýCÅFF9¢›_DKØÙ˜qJOß”‹rY¬§‹«³1Wôô¯åÝêll5?%gcåx|_¤sßíd÷¥¦>ëFè.Ÿ[Ú,¯FÍ7¡ZÁn ·ÕÚ>­§[qõSq`¬ Þ+ÒM©Ž¬ð–•óéÕ"‚²¾.›oþQ-üw†ê#1(1!«ÙÄ
-9Îb
-eÉÅ)̳ËË峧åjÕò·ªúr{Óþá·Uzžùšï>–“jcs¹™ì˜Ç@À æ!/ÙšCLs˜w.†5OÄiŽzo5×Îi„‹šó!Í×Uóõ]1/q
-ÞM?}šµÇ¼®–ób3⸟]昊\™¡!"s/Ո̩8™·½3è½m´1„ù2²q®êÊàsqf˜½°‘vzu½þVÖÿŸçU5óÓŠáì>Œý² qow“55œ5p:,[[^S•TkE˜d¶ÉÖf¬+iÌ×pzÚZË;_N¥|Ê%s…¾ìO0Ä>IPŒ‰D¨÷Ȇ„1Ê[6xËÆÇÛE׺)*^å¼ò“.gÔÁͪI ÉÌ&b¤@±0Rq`¤lyOŽ¹‚K]ƒ©nÇÜ­¡¶ëàŠõ´Zr>—Ër1)‡3N¾÷x °ñÍÍpÆÀé°LmyM~¦˜%Æ´«€:Ž·ÉÔ¼ž†¹Å«Y9/k?QÌj¿2ÈGHiö' bŸ,(ÆI"ŒÔ{˜´RMŒÔ*à2ܨü½XO®CQ^Õ¨hÃ=í=TB:³Q†*P.n‡QIÄ¡‚zg\)˜)aÒv°lpõzÈÝb]üël,œ:.­îJLe.(Ð¥'J*Ü{ŠåD[Á
-
-0Ä@Ra $âÀ@A½w HM”íšʱ®l3²”Í
-©Í¦¦³Ã ÂaÌl!ƒ¹Äpωa2n'2³êêªÞI–(TÆyNíZÏQò vÆg£ 1v „<‰80zPï&ýáNwKô¡øÙc¢óÿÙeõÝîËlN€!Æ Ô
-ã$Æ ê=^e’”N¤Ô×#m»myM}W-ìwr],ejÕÏrR)Ý÷ázY¬< ZðÚՄôfà 1x |BÓˆƒõáÎÃb@;UŸ ?\UËÔLGR¢­¹¤ö *TLo.<Ч'ŸÐƒð¤â@àÁ½wðK˜”°FÕ·§î ÏŸ·åòn\.—Õ2µø§,q҆ſ4/´Ô r2™Í 0Ä8J‰áýu©80NPïíLÆ÷ê„1êÓî«š³oË2Å÷ó˜8¨ Mƒ¹Ò|}<¦;%`ˆ¡åÄPJÄ¡„z()I¨e¼C‰?J»gÄ’¹'T¥BZ³‘†2P61¼ +† ê= #9¡Ò©™ÝW4çÅj]&kRÝGI§wöáú°f9!ÇÙü
-Ê8¼U*ö¶+Ìuxo€"‚ƒ&Â>>û< ï)ôœm>óßÝÌÐ7·tZaïm¹Á"ñ]¿cî¼´É–øÿqJñÿýÕÂÝe}k‘ØžÅ-%J+5~þ*š±t:Eî‰ÙBÿíÈTìendstream
+xÚímS#7Çßó)\uo ê¬=K/ Ëæ’ì²ÜÚ{UwI^8f\ñ1ö&äÓŸÆ3­icMƒrû8©Z{ÚÝôÿçVK£±y¯ÿóž6Ìxá{Ö+¦ ®{ãÙAÑ» Ï}{À›súpRŸõÍðà/¥íyæ0½áûžÒš ½y1Ç
+çxoxñãáÉ›³áéÙppôóðûƒÓa|U왲zÉß~ü¹è]„
+½@$B5Dœ/'Bè¯n¯ýëâ?^l~^„&Ò:»o"ï éÌFR¨`¹(TqP¨Þ#™´®D4 "gƒNÿƒ YL§‹zža ±Ÿ’¦Ilf“‚ )R°ZÂv“’ˆƒ"…ô¤hΤjgÌìÛN WÙ CŠ¬ÅA"ŠÒ;p C‡Áu;¸Ø†ƒ;É_ËÛdõÐÊ퇔˜Äl@!‰$é
+D ¤w¸ü©µf…óŒªÁÐw¯x|UPÜáúfÕ\Ëúøõh>º,gå|UÉaŸ$/h@ö²Ñ@†X
+D¤w¨J²ÂÄ9H0nºŽW“ÏÑtrög½-oÓЋõ¥ÐûuÍ4,ÐlX! Œ‚% é`‘œ²P-,MWr¼^…J1YV>”x«MhI´Ú÷"w4f#‚ )D°LÂw#’ˆƒB„ô‡î˜÷Î#¼jÎ8iV»ÿV=TüTèâdy{½Zü: ÇÍ£7ëëëÅ2Œ2V=?p:‰¤fƒ )b°h1‰8(bHïPT
+ŠSÎa:¯g7õ¿¿­'7“UY­{ºG¼ÙóË Kål‚!EVQÝ%â "½sa˜’\õT`ÉË8ªª(r¡ž|³žL/bó溜¯š…hnãvâãÓó¸ýºlž]Ì럯&óõáE¥ú2mhü#s%Ć„„[I”¼SÂT„„´÷VB'˜/¤ÅŠ¿ áàä¸>0EQl 8XLGËI(!^Š/ZÎãßš­$2¤”Ť”LÄA)Izoʹ²sñÒ7çÐ"n‹øÍwg/ê#_ÿø}²ºªªN¡îŒzý ¤,›†ÖŽ‚ "»oæHA¡@¹nßÓÚ1§
+‰`€²œØœ¿ÃD|s7•W®}wŸVmHJ¶ÜÈÒ'<¥8齕\æ
+ÔþÉÅ_¼­ÕÂ<jµ!Ùj#CJmœoJíD”Ú¤w(õR1k‘ÔͲsb®7¬V“‹iÔnß±?„œ&»Ùà´v7H;
+›Ý (j(×
+¬œì¾+ é¨ §[.MK®©\—ãÉûÛ]tÊùåvîà >9^ÌfñŠØtsžü\”}ìY!d&[udH©Ž3/U·ê‰8(ÕIïêÒ;f÷­ê¦VýízÞÞ <ÍÊ‹»³ˆÎ»8î^2~¾v‰cr%Ɔ„Ä[i&$NÅAHL{‡õbé 3º#ˆz½ø»ó¦éaA¸ÞÕ’h½àû‚rœ 2¤
+¤3dH¡‚åRÝZRqP¨Þãe4¡-sº– .²Z¹¯Fõ¥×ûõð‡€©ÌR `©(PqP Þ[P”fÖŽ@ (/ÊjšOÚQ(.y¿»]–_ÉËÏqi$f)›dH1€UPÝnRqP Þa\‘’Y£ÚqEÄ»ˆgõýU íì¾j¨@:³QA†*X.
+•D*¤÷¶\άí¸"öãÊ_R™
+2¤@ÁRQ $â @!½· žÙ‚sÊ~\Ùe
+ª³FãisÎV ÒLðPŸês«ÑªlÛ˜H—ûFjsžÍ2¤xšªî?©8(žHïÀ“•ÌqbS ?Ÿ€§ûÇ2çùÓ«CÛln!Å ÖŽâ&Å é¸1œéЀDnä½ÜŒóÕ²Ú›º ô¬àRÜSŒ´{šŸ£ÐÉä8›dHñƒ5¤øIÄAñCz~”gZ‰vSŸŒŸ4ÒZ<\:9\fs‚ )N°Vª{ãZ*ŠÒ;p"-Ó¼žô½˜Læãéú¢LQb˜õü¾–Çqñ¼ºå&ÃÙð´v;H?
+Ý (r(×
+Ž¨¶+ïÒbŠ0VÐ环Fóy™Zì“Ž)­MsÞùÕrt 0R<«>¦Inþ7*€ù}
+Q8™Ývˆ‰_4Ûž%?Æ·ú—sæµÿÿ÷Ú¶_¿« ÎulÖ®`ÚhÝ“¡G—uñœLº·àÖg¡ÐÿÞÄ
endobj
-797 0 obj <<
+1013 0 obj <<
/Type /Page
-/Contents 798 0 R
-/Resources 796 0 R
+/Contents 1014 0 R
+/Resources 1012 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R ]
+/Parent 931 0 R
+/Annots [ 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R ]
>> endobj
-803 0 obj <<
+1019 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 758.4766 511.2325 767.4329]
+/Rect [499.2773 758.5763 511.2325 767.4329]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.8.1) >>
>> endobj
-804 0 obj <<
+1020 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [499.2773 746.445 511.2325 755.4012]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.8.2) >>
>> endobj
-805 0 obj <<
+1021 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 734.5129 511.2325 743.519]
+/Rect [499.2773 734.4133 511.2325 743.3696]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.8.3) >>
>> endobj
-806 0 obj <<
+1022 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 722.4813 511.2325 731.3379]
+/Rect [499.2773 722.3816 511.2325 731.3379]
/Subtype /Link
/A << /S /GoTo /D (section.4.9) >>
>> endobj
-807 0 obj <<
+1023 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [499.2773 710.3499 511.2325 719.3062]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.9.1) >>
>> endobj
-808 0 obj <<
+1024 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [499.2773 698.3182 511.2325 707.2745]
/Subtype /Link
/A << /S /GoTo /D (subsection.4.9.2) >>
>> endobj
-809 0 obj <<
+1025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 686.2866 511.2325 695.2428]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.3) >>
+>> endobj
+1026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 674.2549 511.2325 683.2112]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.4) >>
+>> endobj
+1027 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 675.998 511.2325 684.7301]
+/Rect [499.2773 662.3229 511.2325 671.1795]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.5) >>
+>> endobj
+1028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 650.2912 511.2325 659.1478]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.6) >>
+>> endobj
+1029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 638.2595 511.2325 647.1161]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.7) >>
+>> endobj
+1030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 626.2278 511.2325 635.0845]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.8) >>
+>> endobj
+1031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 614.0965 511.2325 623.0528]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.9) >>
+>> endobj
+1032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 602.0648 511.2325 611.0211]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.10) >>
+>> endobj
+1033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 590.0331 511.2325 598.9894]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.11) >>
+>> endobj
+1034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 578.0015 511.2325 586.9578]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.12) >>
+>> endobj
+1035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 565.9698 511.2325 574.9261]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.9.13) >>
+>> endobj
+1036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 553.9381 511.2325 562.8944]
+/Subtype /Link
+/A << /S /GoTo /D (section.4.10) >>
+>> endobj
+1037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 541.9064 511.2325 550.8627]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.10.1) >>
+>> endobj
+1038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 529.8748 511.2325 538.831]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.10.2) >>
+>> endobj
+1039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 517.8431 511.2325 526.7994]
+/Subtype /Link
+/A << /S /GoTo /D (section.4.11) >>
+>> endobj
+1040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 505.8114 511.2325 514.7677]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.1) >>
+>> endobj
+1041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 493.7797 511.2325 502.8855]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.1.1) >>
+>> endobj
+1042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 481.7481 511.2325 490.8538]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.1.2) >>
+>> endobj
+1043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 469.7164 511.2325 478.6727]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.2) >>
+>> endobj
+1044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 457.6847 511.2325 466.641]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.2.1) >>
+>> endobj
+1045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 445.653 511.2325 454.6093]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.4.11.2.2) >>
+>> endobj
+1046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 433.6213 511.2325 442.5776]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.3) >>
+>> endobj
+1047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 421.5897 511.2325 430.5459]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.4) >>
+>> endobj
+1048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 409.558 511.2325 418.6637]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.5) >>
+>> endobj
+1049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 397.5263 511.2325 406.6321]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.11.6) >>
+>> endobj
+1050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 385.4946 511.2325 394.4509]
+/Subtype /Link
+/A << /S /GoTo /D (section.4.12) >>
+>> endobj
+1051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 373.4629 511.2325 382.4192]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.12.1) >>
+>> endobj
+1052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 361.4313 511.2325 370.3876]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.4.12.2) >>
+>> endobj
+1053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [499.2773 339.111 511.2325 347.8432]
/Subtype /Link
/A << /S /GoTo /D (chapter.5) >>
>> endobj
-810 0 obj <<
+1054 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 663.9862 511.2325 672.9425]
+/Rect [499.2773 327.0992 511.2325 336.0555]
/Subtype /Link
/A << /S /GoTo /D (section.5.1) >>
>> endobj
-811 0 obj <<
+1055 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 651.9545 511.2325 660.9108]
+/Rect [499.2773 315.0676 511.2325 324.0238]
/Subtype /Link
/A << /S /GoTo /D (section.5.2) >>
>> endobj
-812 0 obj <<
+1056 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 629.7788 511.2325 638.3664]
+/Rect [499.2773 292.7473 511.2325 301.4795]
/Subtype /Link
/A << /S /GoTo /D (chapter.6) >>
>> endobj
-813 0 obj <<
+1057 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 617.7222 511.2325 626.5788]
+/Rect [499.2773 280.7355 511.2325 289.6918]
/Subtype /Link
/A << /S /GoTo /D (section.6.1) >>
>> endobj
-814 0 obj <<
+1058 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 605.5908 511.2325 614.5471]
+/Rect [499.2773 268.7038 511.2325 277.8096]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.1.1) >>
>> endobj
-815 0 obj <<
+1059 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 593.5591 511.2325 602.5154]
+/Rect [499.2773 256.6722 511.2325 265.7779]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.1.1) >>
>> endobj
-816 0 obj <<
+1060 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 581.5275 511.2325 590.4837]
+/Rect [499.2773 244.7402 511.2325 253.7462]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.1.2) >>
>> endobj
-817 0 obj <<
+1061 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 569.4958 511.2325 578.4521]
+/Rect [499.2773 232.7085 511.2325 241.7146]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.1.2) >>
>> endobj
-818 0 obj <<
+1062 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 557.4641 511.2325 566.4204]
+/Rect [499.2773 220.6768 511.2325 229.6829]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.2.1) >>
>> endobj
-819 0 obj <<
+1063 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 545.4324 511.2325 554.3887]
+/Rect [499.2773 208.6451 511.2325 217.6512]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.1.2.2) >>
>> endobj
-820 0 obj <<
+1064 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 533.4007 511.2325 542.357]
+/Rect [499.2773 196.6134 511.2325 205.6195]
/Subtype /Link
/A << /S /GoTo /D (section.6.2) >>
>> endobj
-821 0 obj <<
+1065 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 521.3691 511.2325 530.4748]
+/Rect [499.2773 184.4821 511.2325 193.5878]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.1) >>
>> endobj
-822 0 obj <<
+1066 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 509.3374 511.2325 518.4431]
+/Rect [499.2773 172.4504 511.2325 181.5562]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.2) >>
>> endobj
-823 0 obj <<
+1067 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 497.3057 511.2325 506.4115]
+/Rect [499.2773 160.4187 511.2325 169.5245]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.3) >>
>> endobj
-824 0 obj <<
+1068 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 485.274 511.2325 494.2303]
+/Rect [499.2773 148.4867 511.2325 157.4928]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.4) >>
>> endobj
-825 0 obj <<
+1069 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 473.2424 511.2325 482.1986]
+/Rect [499.2773 136.4551 511.2325 145.4611]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.5) >>
>> endobj
-826 0 obj <<
+1070 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 461.2107 511.2325 470.167]
+/Rect [499.2773 124.3237 511.2325 133.4295]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.6) >>
>> endobj
-827 0 obj <<
+1071 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 449.179 511.2325 458.1353]
+/Rect [499.2773 112.292 511.2325 121.3978]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.7) >>
>> endobj
-828 0 obj <<
+1072 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 437.1473 511.2325 446.1036]
+/Rect [499.2773 100.2604 511.2325 109.3661]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.8) >>
>> endobj
-829 0 obj <<
+1073 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 425.1157 511.2325 434.0719]
+/Rect [499.2773 88.2287 511.2325 97.3344]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.9) >>
>> endobj
-830 0 obj <<
+1074 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 413.084 511.2325 422.0403]
+/Rect [499.2773 76.197 511.2325 85.3027]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.10) >>
>> endobj
-831 0 obj <<
+1075 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 401.0523 511.2325 410.158]
+/Rect [499.2773 64.1653 511.2325 73.2711]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.10.1) >>
>> endobj
-832 0 obj <<
+1015 0 obj <<
+/D [1013 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1012 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1078 0 obj <<
+/Length 3422
+/Filter /FlateDecode
+>>
+stream
+xÚíYSIÇßùz˜xPmÝÇ>­m°ƒ íÁ8vcŽ…hƒb„ÄHÂÇ~ú­VwUeCuŠÚlˆ‰ËX©LåÿGYG³õÿ±U„
+'ÆI¢(Sƒñåœû{µÇÚ÷ Û†ð]ÏO÷þñR˜#Ns=8ý>Ëj-œžýºÿâí›Ó£7§ï~?ýqïè4~(t̨¨?ñϽ_§ƒ3ïÿÇ=J„³jðÙÿ…æ\îI%ˆ’B„ŸL÷Þïý?üëÚ4÷E”°DYn2ß„sðM˜’ÄãF9¢믢 ÷¡~àB÷O/ªú;yK,5%”IãÝÕãѪ:Ÿ/¾¶o„.$%Ú†÷½»XŒ–ÕÁPR»O†ŠÒú‡tîÿ±»¡½â–hNYJï-±çƒæÅ ”/Ø ¡ámùn~dioÅpÈÅÁƒzOðHC´fÂ#îÏŸ×Õâë°Z,æ‹e e‰“V´o~HóñGKM/'!“Åœ
+y-¦bÔ@Ýï§&F ê=QÃ1ÒH"5b#5—£åªÊöMÂs#½O¼2½ú»
+9.&bA 1‚2q`¡Þ#AÚ¹fØ ’÷EÐæ–Ç}Ÿ–§˜>Rb.KI†)­Rrq ¤àÞ)ÖKAS£6‚2¿ªµÎ‚¢ýg1³¡©±ŒíTSR\ÌO²Ãðbô܃sØ1ŠX¡Y‚Gß<wheŒ|Ô­LÈe1%ÀÃj¥T?'™80PPïqö­µ V+H!¬™}?ŸÏ§Õ¨õmK‡÷à¶rtGBºŠa
+ÝB& Ô{â×Ù€ðl<®–Ë‚óÙjÝ^̧u§±CÍD/!qÅX
+`ˆQÑÑ¥í/Fê=R¡¯×·¤Â4Tü2ŸU §Žî/F³åÇõ Bö„EL\)ÐÁ¢#ŒéŸ‡äâ@°À½',,%Tw¨° ß5P¼›/ÚÄëÉrUc!ŸZ‹˜¸b*’Åô´2A`H`®Úê,,h× ñöªZŒVëIézòñu¹ª.›×'Õr~½îPÆU€årRÓb¥z\«±1ÅÒCL[˜`LÜL˜º¨÷$¯Ò„qÓ­BQ?ˆ³ÉM‚¦·äW¼—€£b€!F
+M»uÛ¨ÿììl½Éi4 «Üãô+ýb4¾XwNëí)9Ät 1¥aºm•9¦5ê=‰--ÖuK®»^½Ž[Ü^ú_ûvH(„Øá±`ÌX1Àã*bû„äâÀx@½'„&’ÙÎÞ!OªåÕ|¶¬ÂâÃt2móê7ªèÉ»_ü,T+?/&MeZ2ùà»õðõ‹Å†˜¸0½¶¿Âœ‹õwÄJ.‰”—ÌƱí .S, ž ½ñà7Û<=èå(dº˜#`ˆq•´ýEÊ\G¨÷ÄãD JPöž8Ú¼±Úºm(<ÅŒó 1^ b¶¿d™‹ãõžx¡”(ª@áÉmæŃ0Y®&ãåp|1šÍªinW¾UD*ë64B’›-8Ù³XÌ0Ä*Ùþâd.ŒÔ{dDXo d*Bqú-ÙÜÀ(÷‘èc!f«”hˆ°ÐQa!Âî=±`4Q:AùæCî«ÅõrU ÿ¨¾öÝ€Àí¦ÁŠ•[; )-æ%Ùa¸
+‹á
+n~~­£ý;_s àîc/ÀêgÈpg#¼í'ËñuFïŸþ“i!$ÝÉg! C‹†"P#‘L "¨û„ˆ„ÖûÄ"¢Eä}µJ7«œž¾^ƒ ŸF˜å
+§èŽß}òoæVìðd$hØ&±‘d‡$B¹Ææ;á!a,^ï#ê‹!×|¼]]„S²7§¾ë¥”I3(¯&ŸêÉŠl—;¡Åb@€!FT‰Ñþò¹@0FP÷i¸* a2Þ
+bPAUQ¨2`P¡îTÜSd”Pñ¨~x{rüêøMîÁ„†/Œé4TC÷€Èú»vA=CB‹y†/P0”—L /¨ûÄ óó#*àE”ðrüæÅë‡G¹Õ~$®E0\l_wRYL
+0ÄHR¡¤dÁHAÝ'R(#\ H‘%¤øÙTng‰&VºJŒR»5 ).&bA í?¼‘ #uGÅÖ®y*ÏévPüüøÍa˜1Õþº9*>ú²ªfuÙæŸ~DÌèþ*‹3ÚƒªÂ6É^½9:yV×ýNsÍ“öó<*d<ýŠ?} „L•r
+endobj
+1077 0 obj <<
+/Type /Page
+/Contents 1078 0 R
+/Resources 1076 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 931 0 R
+/Annots [ 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R ]
+>> endobj
+1080 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 389.0206 511.2325 397.9769]
+/Rect [527.6238 758.4766 539.579 767.5824]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.10.2) >>
>> endobj
-833 0 obj <<
+1081 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 376.9889 511.2325 385.9452]
+/Rect [527.6238 746.5057 539.579 755.462]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.10.3) >>
>> endobj
-834 0 obj <<
+1082 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 364.9573 511.2325 373.9135]
+/Rect [527.6238 734.5349 539.579 743.6406]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.11) >>
>> endobj
-835 0 obj <<
+1083 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 352.9256 511.2325 361.8819]
+/Rect [527.6238 722.564 539.579 731.5203]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.12) >>
>> endobj
-836 0 obj <<
+1084 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 340.8939 511.2325 349.8502]
+/Rect [527.6238 710.5931 539.579 719.5494]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.13) >>
>> endobj
-837 0 obj <<
+1085 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 328.8622 511.2325 337.8185]
+/Rect [527.6238 698.6222 539.579 707.5785]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.14) >>
>> endobj
-838 0 obj <<
+1086 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 316.8305 511.2325 325.7868]
+/Rect [527.6238 686.6513 539.579 695.6076]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.15) >>
>> endobj
-839 0 obj <<
+1087 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 304.8985 511.2325 313.9046]
+/Rect [527.6238 674.6804 539.579 683.6367]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.16) >>
>> endobj
-840 0 obj <<
+1088 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 292.8669 511.2325 301.873]
+/Rect [527.6238 662.7096 539.579 671.6658]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.1) >>
>> endobj
-841 0 obj <<
+1089 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 280.7355 511.2325 289.8413]
+/Rect [527.6238 650.7387 539.579 659.695]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.2) >>
>> endobj
-842 0 obj <<
+1090 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 268.7038 511.2325 277.8096]
+/Rect [527.6238 638.7678 539.579 647.7241]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.3) >>
>> endobj
-843 0 obj <<
+1091 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 256.6722 511.2325 265.7779]
+/Rect [527.6238 626.7969 539.579 635.7532]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.4) >>
>> endobj
-844 0 obj <<
+1092 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 244.6405 511.2325 253.7462]
+/Rect [527.6238 614.826 539.579 623.7823]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.5) >>
>> endobj
-845 0 obj <<
+1093 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 232.6088 511.2325 241.5651]
+/Rect [527.6238 602.8551 539.579 611.8114]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.6) >>
>> endobj
-846 0 obj <<
+1094 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 220.5771 511.2325 229.5334]
+/Rect [527.6238 590.8843 539.579 599.8405]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.7) >>
>> endobj
-847 0 obj <<
+1095 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 208.5455 511.2325 217.5017]
+/Rect [527.6238 579.013 539.579 587.8696]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.8) >>
>> endobj
-848 0 obj <<
+1096 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 196.5138 511.2325 205.4701]
+/Rect [527.6238 567.0421 539.579 575.8988]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.9) >>
>> endobj
-849 0 obj <<
+1097 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 184.4821 511.2325 193.4384]
+/Rect [527.6238 554.9716 539.579 563.9279]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.10) >>
>> endobj
-850 0 obj <<
+1098 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 172.4504 511.2325 181.4067]
+/Rect [527.6238 543.0007 539.579 551.957]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.11) >>
>> endobj
-851 0 obj <<
+1099 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 160.4187 511.2325 169.375]
+/Rect [527.6238 531.1295 539.579 540.1356]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.12) >>
>> endobj
-852 0 obj <<
+1100 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 148.3871 511.2325 157.3433]
+/Rect [527.6238 519.0589 539.579 528.0152]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.13) >>
>> endobj
-853 0 obj <<
+1101 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 136.3554 511.2325 145.3117]
+/Rect [527.6238 507.0881 539.579 516.0443]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.14) >>
>> endobj
-854 0 obj <<
+1102 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 124.3237 511.2325 133.28]
+/Rect [527.6238 495.1172 539.579 504.0735]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.15) >>
>> endobj
-855 0 obj <<
+1103 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 112.292 511.2325 121.2483]
+/Rect [527.6238 483.1463 539.579 492.1026]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.16) >>
>> endobj
-856 0 obj <<
+1104 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 100.2604 511.2325 109.2166]
+/Rect [527.6238 471.1754 539.579 480.1317]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.17) >>
>> endobj
-857 0 obj <<
+1105 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 88.2287 511.2325 97.185]
+/Rect [527.6238 459.2045 539.579 468.1608]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.2.16.18) >>
>> endobj
-858 0 obj <<
+1106 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 76.197 511.2325 85.3027]
+/Rect [527.6238 447.2336 539.579 456.3394]
/Subtype /Link
-/A << /S /GoTo /D (subsection.6.2.17) >>
+/A << /S /GoTo /D (subsubsection.6.2.16.19) >>
>> endobj
-859 0 obj <<
+1107 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [499.2773 64.1653 511.2325 73.1216]
+/Rect [527.6238 435.2628 539.579 444.219]
/Subtype /Link
-/A << /S /GoTo /D (subsection.6.2.18) >>
+/A << /S /GoTo /D (subsubsection.6.2.16.20) >>
>> endobj
-799 0 obj <<
-/D [797 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-796 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R >>
-/ProcSet [ /PDF /Text ]
+1108 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 423.2919 539.579 432.2481]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.17) >>
>> endobj
-862 0 obj <<
-/Length 3454
-/Filter /FlateDecode
->>
-stream
-xÚí[SÜFÇßùó°U túªîÞ}ØÅ€R1ö©lm’‡ñŒ *3™ Äûé·5R·Î0­3ô&&®Š1èèœ9ÿŸNßP÷‡ Œ"TX9ÐVE™Œ&;tpé~öf‡µ×ìû‹öáU¯.v¾y-ôÀ›ñlpñÜËj \ŒÚ=|wzq|zq¾÷ËÅw;Çá¦Ð1£¢¾ã¯;?ýBcçÿ»J„5jpçþA ³–&;R ¢¤þ;×;ç;ÿ
-7?]šÆ>ˆ†(Ãuä“p> 㜫]tÊ’Lp±ü(áÎqýAÜå \.1†J磾l6΋ټÍöGWò̯g­ _M–Tƶ6çÎ&Ÿäå|oŸ+ºûf:œL†Ó½}Éõ.ÙÛW”>â_ÒÚ‡]yObÅ É8e]×4™^š/ΠJÞn®«´~ÿ¥JÙZ^õX#¨÷Ž©‰R”F8ý39ʦ”—ż¨Êæ;ÃrÜ|ñÃlx™;Qì#"ÑË‚ÏV2 ÀcaE „…H ¨÷Žá$Ë `mda>]ÌæùxÿSþ92Är“m(FÒÇ/©õâÄøœ& 1bV4Cˆ‰Äƒzïˆá‚“±ŽþE‰Ù\6¸O““^@|
-“† +!€DâÀ
-º#D´„œçóyQ^¶­úÅ÷K䶙ÎÏp2?Àã*ˆñ‰ãõÞñ#9aîÚÀlù9)oó©ï¾ÞܘŠ¶æœ¼¿us#¶C‘ÅdF€!ÆTÉ°~F"q`Œ Þ;F%T‹ŽÕ2òn~•Oî~—K*EÓ-Í‹Ûz¸"${ÉíÏb2#Àcª„1‰cõÞõW™&Ö2Ñ1†/nHY±ËÜm™ô‹qÿŒ,×¹¯÷üLÎ÷gÅeé¾dõì
-Û¶M!ëÉLCŒ)¨*ÆT$Œ)Ô{ÇUÄR ™â LýåÝÙÉ›“ÓYR»®•ûNsÝJ™ÚÛ·O¬?xdHh2.ÀÃ
-†á‰Ãõp‘Vw=¸ˆ\NN¿ÿáè8¶Rš‰>^¸xvmUHe*(ÐeE*Ó¿j‹÷ÞbÑRAPd
-(n4Û]’#m$úq–z­CRœ 0Ä
-dD?‘80<Pï~XJ×°X¿ M¶ËÄu° çá —Ëß®ÿnšÚ„'ÃÔÙa,91”ÖƒÀHÂ\w=!ˆd~-Xº2¸^c©«8Öð—8.öùJ¡³Ã@
-꽫Ô®8@%ÓáÄW|z뻩ýIn¾j}&’u†˜Î0Ó¦3Z,LgÔ{ÐYXM˜¦èìgɺIù·ÃÂiYËQ¾IlWfžú<VøÈ©‚BCDЕ”šþ­±8Aqï õ‹-Œ‚
-°èú¬Éøó)Ó!ÉjCLm˜oLíH˜Ú¨÷Nm]ß3 Ôö“QçÕèSÞO:ùæÝ&ѳ?yyÿ ©íó‘¬60ÄÔ†ù6ý‡!cq`j£Þ;µ3J,—PmÕª}XMnœ´Šëbþ¹Ñö®˜_5>®ôµ3P<9é™ÔD„Ãnf ñÔz…½@ø”% 1  $¦ÿhc, ˆ5ï,ò¢#ᮚ7‹¶õä]™Eôóùh1 TVå¬çÓasܤ7oþÖ.€‡å ¬G¼~ße¾úwÄÁÛayZó›Jõù,KÛ<-;²õ\ÊÁh”ÏB!,ç˩ϪsûÞ•ÉåÏävb%ý©ó O~ê€!öÔAA1Š"q`4¡ÞMLN§)öº7à¶L²¶|^M«j)²BêÆcíeõûÈt¾%BiáçóE1ŽÝʸ޾4íe/üàÈÿC¬5™X`ˆ ¡±ýûôbq`Ä¢ÞÃÄ œ0ž lw$º„¤˜ãÒxæF½øº±b]{›ËŽËÛfñ¨*›sñ"/§ örå3ŸÌ0ĸ‚Êb\EâÀ¸B½®\±t¤ÈŽ+¿Ãü‡YØð_¥Ô™»ó¥oÖ[Ö(Ñ4¬¿^”£æ R¿„ƶªöT¨ !ÕŠ¬T±8¨pï¾yåZ×ßã-Sþ|dï‰Ø®{«U¶«Žãsš 0Ä€šaÀDâÀ€Yóq¥Hû>+ÓŽ.öc»Ójñá:Ÿ]¹Ö«®F½Éiì:Ðé.G†9 &Û¿Ø×Ý
-KÂ=ÑgF
-"xû¾8‡ÕdâÏø¼oÚf—I=€—r;žIŒ|š“#`ˆ=FPFŒ›HA¨÷®1¯ûsRˆB'ñdþ×v”\Ví„â]5ýäž©¿7ÿºªîš/FCº£ù«~)Òesø´­ÖÕÂßájn{×ö/ÿáŠ83O©¥õ9IVbŠÃœcŠGâÀG½‡ªáÆ–,kߊb–}·ºjœ”£F±ººqáø÷áÕ°¼\éÝùµÀÂïW:]L>ÔË "³Ï  Ò”Ì
-endobj
-861 0 obj <<
-/Type /Page
-/Contents 862 0 R
-/Resources 860 0 R
-/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R ]
+1109 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 411.321 539.579 420.4267]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.18) >>
>> endobj
-864 0 obj <<
+1110 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 758.4766 539.579 767.4329]
+/Rect [527.6238 399.3501 539.579 408.3064]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.19) >>
>> endobj
-865 0 obj <<
+1111 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 746.3946 539.579 755.3509]
+/Rect [527.6238 387.3792 539.579 396.3355]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.20) >>
>> endobj
-866 0 obj <<
+1112 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 734.3125 539.579 743.2688]
+/Rect [527.6238 375.4083 539.579 384.3646]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.21) >>
>> endobj
-867 0 obj <<
+1113 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 722.2305 539.579 731.1868]
+/Rect [527.6238 363.4374 539.579 372.3937]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.22) >>
>> endobj
-868 0 obj <<
+1114 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 710.1484 539.579 719.1047]
+/Rect [527.6238 351.4666 539.579 360.4228]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.23) >>
>> endobj
-869 0 obj <<
+1115 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 698.0664 539.579 707.0227]
+/Rect [527.6238 339.4957 539.579 348.452]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.24) >>
>> endobj
-870 0 obj <<
+1116 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 685.9843 539.579 694.9406]
+/Rect [527.6238 327.5248 539.579 336.4811]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.25) >>
>> endobj
-871 0 obj <<
+1117 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 673.9023 539.579 682.8586]
+/Rect [527.6238 315.5539 539.579 324.5102]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.2.26) >>
>> endobj
-872 0 obj <<
+1118 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 661.8203 539.579 670.7765]
+/Rect [527.6238 303.583 539.579 312.5393]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.1) >>
+/A << /S /GoTo /D (subsection.6.2.27) >>
>> endobj
-873 0 obj <<
+1119 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 649.8379 539.579 658.6945]
+/Rect [527.6238 291.6121 539.579 300.7179]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.2) >>
+/A << /S /GoTo /D (subsection.6.2.28) >>
>> endobj
-874 0 obj <<
+1120 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 637.7558 539.579 646.6124]
+/Rect [527.6238 279.6413 539.579 288.747]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.3) >>
+/A << /S /GoTo /D (subsubsection.6.2.28.1) >>
>> endobj
-875 0 obj <<
+1121 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 267.6704 539.579 276.6267]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.28.2) >>
+>> endobj
+1122 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [527.6238 255.6995 539.579 264.6558]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.28.3) >>
+>> endobj
+1123 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 625.5741 539.579 634.5304]
+/Rect [527.6238 243.7286 539.579 252.6849]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.6.2.26.4) >>
+/A << /S /GoTo /D (subsubsection.6.2.28.4) >>
>> endobj
-876 0 obj <<
+1124 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 613.4921 539.579 622.4483]
+/Rect [527.6238 231.7577 539.579 240.714]
/Subtype /Link
/A << /S /GoTo /D (section.6.3) >>
>> endobj
-877 0 obj <<
+1125 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 601.41 539.579 610.3663]
+/Rect [527.6238 219.7868 539.579 228.7431]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.1) >>
>> endobj
-878 0 obj <<
+1126 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 589.328 539.579 598.2842]
+/Rect [527.6238 207.8159 539.579 216.7722]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.1.1) >>
>> endobj
-879 0 obj <<
+1127 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 577.2459 539.579 586.2022]
+/Rect [522.6425 195.845 539.579 204.9508]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.1.2) >>
>> endobj
-880 0 obj <<
+1128 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 565.1639 539.579 574.1201]
+/Rect [522.6425 183.8742 539.579 192.9799]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.2) >>
>> endobj
-881 0 obj <<
+1129 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 553.0818 539.579 562.0381]
+/Rect [522.6425 171.9033 539.579 181.009]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.3) >>
>> endobj
-882 0 obj <<
+1130 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 540.9998 539.579 550.1055]
+/Rect [522.6425 159.9324 539.579 169.0381]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.4) >>
>> endobj
-883 0 obj <<
+1131 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 528.9177 539.579 538.0235]
+/Rect [522.6425 147.9615 539.579 157.0673]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.5) >>
>> endobj
-884 0 obj <<
+1132 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 516.8357 539.579 525.9414]
+/Rect [522.6425 135.9906 539.579 145.0964]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.1) >>
>> endobj
-885 0 obj <<
+1133 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 504.7536 539.579 513.8594]
+/Rect [522.6425 124.0197 539.579 133.1255]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.2) >>
>> endobj
-886 0 obj <<
+1134 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 492.6716 539.579 501.6279]
+/Rect [522.6425 112.0489 539.579 121.1546]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.3) >>
>> endobj
-887 0 obj <<
+1135 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 480.5895 539.579 489.5458]
+/Rect [522.6425 100.078 539.579 109.1837]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.3.5.4) >>
>> endobj
-888 0 obj <<
+1136 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 468.5075 539.579 477.4638]
+/Rect [522.6425 88.1071 539.579 97.2128]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.6) >>
>> endobj
-889 0 obj <<
+1137 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 456.4254 539.579 465.3817]
+/Rect [522.6425 76.1362 539.579 85.242]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.3.7) >>
>> endobj
-890 0 obj <<
+1138 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 444.3434 539.579 453.2997]
+/Rect [522.6425 64.1653 539.579 73.2711]
/Subtype /Link
/A << /S /GoTo /D (section.6.4) >>
>> endobj
-891 0 obj <<
+1079 0 obj <<
+/D [1077 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1076 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1141 0 obj <<
+/Length 3413
+/Filter /FlateDecode
+>>
+stream
+xÚímsÛÆÇßëSð]¥™êŒ{Ƶ/:–§J'•”éLÓ¼€HˆBM4AZã~úˆ»ãR<lt±[6ãÉ’°Øåþ·¸'€t”Ùt$Q†™‘6‚ÈŒÊÑx~”¦öoßQwÌ©?èuv}ôì%×#CŒbjt};R&7'ËI–çtt=ùåøüÇW×ß¼º¾:ùõú»£o®ÃY¡gšñî”oŽ~ù5Ml
+eŠNÅHKCg|óQìïˆu}rJ¹ÌŽ¯ïÊ“Sfß\­ŠUÕ®ªqÛÿü²šÙ¿˜œ““S™eŸÛ‹0æýÏò@Ma¬öÆæ)$l/ýËé¨s  v§Ðp_ýów‚ÐLïa厂ñ€ºï`‘t¤…¶¯ 4t,°lóf]¯Ê¥ý)ÏÌgŠÁ''Å'3™`ˆ‘Å¢Y>LJ$ŒÔý¶rpI„Ê+¡r¼*æ¾t”Ë·å2^F¶ –?½…ö™HbBÃL£BGÁ„FÝo…fœð\Q 4sBÿ»©Ð?•³.êqù[j->aõ9YQ`ˆ)
+SJ33¬h$LQÔýVQJ ÏT”;E/˶™=¢ÉæŠ=½‚=(·ÏG²ÜÀ“æ•;&7ê>È­Œ!ŒÁB-œÚWÍøu¹êµ½xöão‰®2ñ¨íÓ‘*6°C´†É¦4”:¢4ê{+t®‰}Ùê,ÎçÍ|aE½©fÕê]¯ê}µºë‚³c³s.M„É”  ;ÍÙÅ«ýQ;íAÜhwL¾‡ ÿܺ„ƒ(ô K&!˜a lÅ ”s°†ÁÇ8öãM¥l_>×ùƳ¶
+’¹E‡IîG¨›QÐõ‰‰/›õͬlïìõ«+HCù gxì` ƒÈ(^àçCò±ï6Ö‚¤2Ýâa?/‘‡ÁÎy3Ÿwųk4?õj››y7ˆâ0¶InT!Í©
+"jGFžH D¨{we—R¡h`(t/Vræºq³‰÷Íòµm]íºkîû7ãÂÁvÑ¿ü'ËØt½Ï•îfíÏpW„ÓÞ»>äôo¶¢ÓüP0(¸ÏI²àÀæ<&8ê>T ! ×Æ+Î\Õ¸¨Ç½d]Ÿ>t꺑j?krWÔÓ¾ž_ ¬
+7òj=¿é¬“'T
+!ðiJ†
+%Òþ.P {
+Âc&uKÆM} ¢ r}((2>«ÉÈ
+ u¿:“„Ë
+Ív„>-Úwõ8Yn-Žÿ¼³'Ó-v'»sû*›u;{×íÑbï)‘ÿ ÉCL"˜#ʆ7/ÅÁ$B݉˜á„©(Äwòs¶—7¬S˜ïZ-‹º-Æ~x‘gÕæ&)“ñOÓÄüL•Ø!êÁôaâE¢@´C}o¥Ë)¡¹Ò‰]é¦Eå$›–«n…¼ªo›nI«_ÎÚÙ,c¨‹y¹Ä*¬‘›‰•[rùñ5sŸ,Y³­¦ÈªÙ~˜f˜ï­fÊtON3@4¹+ÚzsÏÏpS›À„Öà!ßÒº÷‹¾N—ÅüäTï,[~¨ Âá“$‹ 1•`¦(~BP,L'ÔýV(©IÆ(J9¡êÖ¥÷ÆË4iæEU?«Ã3¢ZðŒ¨ñ]9~í¨jߪ–óvw'ÛåËóþÈ´H¿ËkP'ÿA’u†˜N0Q” o‹‚鄺w£ &1Ül/_ºmì,»ìl³I×™<l4³âÓ™Ì
+0ÄXr¡¬DÁXÙsÛ¨Í#<×}á?ë¶sðãŠzí÷.Š)²_;X?v¿64@ökïDEùðSUàù°\ì¹­c2{¼í!ö«bg›e)nŽ'ÕôËØñðäæ„‚É-b-êR £ uïi£&'ŒqOëi»kºž¥ÔÜþpÜ‚ ©¸AC·Á)žwˆ‚à†»¸åŠPáTu¶YúêŠ[ݶåøtÒÞö½·ùëÒvxžhúÝùD'c 1Œ ”b`¡îFZL‘ØÁÈÂã9š7åì‰?5ø°ã³›Ì0ÄØêQ1¼Ç4Æê>°£(1ZsÇŽ|Èδìömy¸®} š|¾“i†MPO*Ø0M‘@0šP÷&aHn¤§IíÐÔmß6¯»µWID} ¢|Γ‰†QPS*.R$Œ(Ô} Šk’Sî‰Ò;DµåjUuSY‡õápò OÆ b8AA©žÕŽ‚ᄺ81I4wô8#ù.NÕ´þßæ©êBðHï ’Ou2HÀ Ji‹É0H‘@0P÷$ʉƃdzº‰õÉéf"½ßm¤$;ô» ò9N&bA ©~fm,Œ Ô} (£D*÷03B³nôB®ÉCúýù$'# 1„ ˆTß´ CuïÊ ¹ Q@æy˜¡üø3”^ƒTÀ€ÂT˜ÊáÎR$
+„.Ô·‡Kk"2ßï¦ V§ÿ6ëe]Ì˪[ÇJðIÿÞ“>½ÉßzÌ°ï<ÙJGÕð„Ò~Ø÷ Ž·Oõ'~ŸE†;dZ¿ùCjq(Eó‰é}úÓŸðO~{ƒ&Cj?„=¤ÂW)ž2Cò<ú}öJŒ”ìý¿¹qû“Bž}ãÓ†°,Ó£î{¹Üè´z‹ÜÄ°9
+„þ¿í†endstream
+endobj
+1140 0 obj <<
+/Type /Page
+/Contents 1141 0 R
+/Resources 1139 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 931 0 R
+/Annots [ 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R ]
+>> endobj
+1143 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 432.2613 539.579 441.3671]
+/Rect [494.296 758.4766 511.2325 767.5824]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.0.1) >>
>> endobj
-892 0 obj <<
+1144 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 420.1793 539.579 429.285]
+/Rect [494.296 746.3946 511.2325 755.5003]
/Subtype /Link
/A << /S /GoTo /D (subsection.6.4.1) >>
>> endobj
-893 0 obj <<
+1145 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 408.0972 539.579 417.0535]
+/Rect [494.296 734.3125 511.2325 743.4183]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.1) >>
>> endobj
-894 0 obj <<
+1146 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 396.0152 539.579 404.9715]
+/Rect [494.296 722.2305 511.2325 731.3362]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.2) >>
>> endobj
-895 0 obj <<
+1147 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 383.9331 539.579 392.8894]
+/Rect [494.296 710.1484 511.2325 719.2542]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.3) >>
>> endobj
-896 0 obj <<
+1148 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 371.8511 539.579 380.8074]
+/Rect [494.296 698.0664 511.2325 707.1721]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.4) >>
>> endobj
-900 0 obj <<
+1152 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 359.769 539.579 368.7253]
+/Rect [494.296 686.084 511.2325 695.0901]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.6.4.1.5) >>
>> endobj
-901 0 obj <<
+1153 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 337.1969 539.579 345.9291]
+/Rect [494.296 663.4123 511.2325 672.2689]
/Subtype /Link
/A << /S /GoTo /D (chapter.7) >>
>> endobj
-902 0 obj <<
+1154 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 325.1348 539.579 334.091]
+/Rect [494.296 651.3501 511.2325 660.4558]
/Subtype /Link
/A << /S /GoTo /D (section.7.1) >>
>> endobj
-903 0 obj <<
+1155 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 313.0527 539.579 322.009]
+/Rect [494.296 639.3677 511.2325 648.3738]
/Subtype /Link
/A << /S /GoTo /D (section.7.2) >>
>> endobj
-904 0 obj <<
+1156 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 300.9707 539.579 309.9269]
+/Rect [494.296 627.2856 511.2325 636.2917]
/Subtype /Link
/A << /S /GoTo /D (subsection.7.2.1) >>
>> endobj
-905 0 obj <<
+1157 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 288.8886 539.579 297.8449]
+/Rect [494.296 615.2036 511.2325 624.2097]
/Subtype /Link
/A << /S /GoTo /D (subsection.7.2.2) >>
>> endobj
-906 0 obj <<
+1158 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 276.8066 539.579 285.7628]
+/Rect [494.296 603.1215 511.2325 612.1276]
/Subtype /Link
/A << /S /GoTo /D (section.7.3) >>
>> endobj
-907 0 obj <<
+1159 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 254.2345 539.579 262.9666]
+/Rect [494.296 580.5943 511.2325 589.3064]
/Subtype /Link
/A << /S /GoTo /D (chapter.8) >>
>> endobj
-908 0 obj <<
+1160 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 242.1723 539.579 251.1286]
+/Rect [494.296 568.4873 511.2325 577.4934]
/Subtype /Link
/A << /S /GoTo /D (section.8.1) >>
>> endobj
-909 0 obj <<
+1161 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 230.0903 539.579 239.0465]
+/Rect [494.296 556.4052 511.2325 565.4113]
/Subtype /Link
/A << /S /GoTo /D (subsection.8.1.1) >>
>> endobj
-910 0 obj <<
+1162 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 218.0082 539.579 226.9645]
+/Rect [494.296 544.3232 511.2325 553.3293]
/Subtype /Link
/A << /S /GoTo /D (section.8.2) >>
>> endobj
-911 0 obj <<
+1163 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 205.9262 539.579 214.8824]
+/Rect [494.296 532.2411 511.2325 541.2472]
/Subtype /Link
/A << /S /GoTo /D (section.8.3) >>
>> endobj
-912 0 obj <<
+1164 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 183.3541 539.579 192.0862]
+/Rect [494.296 509.5694 511.2325 518.426]
/Subtype /Link
/A << /S /GoTo /D (appendix.A) >>
>> endobj
-913 0 obj <<
+1165 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 171.2919 539.579 180.2482]
+/Rect [494.296 497.5072 511.2325 506.6129]
/Subtype /Link
/A << /S /GoTo /D (section.A.1) >>
>> endobj
-914 0 obj <<
+1166 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 159.2098 539.579 168.1661]
+/Rect [494.296 485.4252 511.2325 494.5309]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.1.1) >>
>> endobj
-915 0 obj <<
+1167 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 147.1278 539.579 156.0841]
+/Rect [494.296 473.3431 511.2325 482.4488]
/Subtype /Link
/A << /S /GoTo /D (section.A.2) >>
>> endobj
-916 0 obj <<
+1168 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 135.0457 539.579 144.002]
+/Rect [494.296 461.2611 511.2325 470.3668]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.2.1) >>
>> endobj
-917 0 obj <<
+1169 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 122.9637 539.579 131.92]
+/Rect [494.296 449.179 511.2325 458.2847]
/Subtype /Link
/A << /S /GoTo /D (section.A.3) >>
>> endobj
-918 0 obj <<
+1170 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [527.6238 110.8816 539.579 119.8379]
+/Rect [494.296 437.097 511.2325 446.2027]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.3.1) >>
>> endobj
-919 0 obj <<
+1171 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [522.6425 98.7996 539.579 107.9053]
+/Rect [494.296 425.1146 511.2325 434.1207]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.3.2) >>
>> endobj
-920 0 obj <<
+1172 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [522.6425 86.7175 539.579 95.8233]
+/Rect [494.296 413.0325 511.2325 422.0386]
/Subtype /Link
/A << /S /GoTo /D (subsection.A.3.3) >>
>> endobj
-921 0 obj <<
+1173 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [522.6425 64.1455 539.579 73.0021]
+/Rect [494.296 400.9505 511.2325 409.9566]
/Subtype /Link
-/A << /S /GoTo /D (appendix.B) >>
+/A << /S /GoTo /D (section.A.4) >>
>> endobj
-863 0 obj <<
-/D [861 0 R /XYZ 85.0394 794.5015 null]
+1174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 388.7688 511.2325 397.8745]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.1) >>
>> endobj
-860 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R >>
-/ProcSet [ /PDF /Text ]
+1175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 376.6867 511.2325 385.7925]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.2) >>
>> endobj
-924 0 obj <<
-/Length 885
-/Filter /FlateDecode
->>
-stream
-xÚíÙOOÛ0
-‚¶e›¶O?§Í+už(œ"„ ÏïÅï§`'Pòð¥6ÌxáKëÓt9]¼œ‡¿}. =§Š'Uø¬ãIqt*mé™7”“›RiÍ„Þ æwÊÉìrôéËùää|r1¾šœ'“4*Î \6Cþ,.¯x9 œœIïtù'üÀx/ÊE¡´dZIóP\_Ӏ诛Ðì•
-¤4á~ë§L!”&2}Ôd¼gNÕj2;šÖwóå¿Õ²n<ÉÒ!¥©î vZ ;!å
-! Ñé$g™ç·}v iy½¨gÕô¶žÞOWË›qe´½ZPœãÞ‚P %÷Àv ÊB "Ó'AV3¯LÜʹ=Aí­H÷ × ŠsÜ[
-¤át/«s…P‚ÈôI‘Ì{wg
-‹h¯‡ýÿûïÿSz C”0Üc¼[X¦J™> Ó‚q©ãÆ x˜Ô†Øú×ÙõSÝ<sR¯÷äЛ
-¤xრQ™B(^dúÄKqÆ{»°Øðz\ΦáÜðóýŎôö†)o¸ã ˆ%W¦Ê™>yŽÐq÷¢Itª
-·$±V˲‡*½¬®´ãÌJ+rï«Ã70¯5¼ýíøóK|e™tNä/WXÏ綔š…±¶{Ÿ»ßOCÅÿx3B*endstream
-endobj
-923 0 obj <<
-/Type /Page
-/Contents 924 0 R
-/Resources 922 0 R
-/MediaBox [0 0 595.2756 841.8898]
-/Parent 715 0 R
-/Annots [ 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 940 0 R 941 0 R ]
+1176 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 364.6047 511.2325 373.7104]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.3) >>
>> endobj
-926 0 obj <<
+1177 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 758.4766 511.2325 767.5824]
+/Rect [494.296 352.5226 511.2325 361.6284]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.4) >>
+>> endobj
+1178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 340.4406 511.2325 349.5463]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.5) >>
+>> endobj
+1179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 328.3585 511.2325 337.4643]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.6) >>
+>> endobj
+1180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 316.2765 511.2325 325.3822]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.1) >>
+>> endobj
+1181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 304.2941 511.2325 313.3002]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.2) >>
+>> endobj
+1182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 292.212 511.2325 301.2181]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.3) >>
+>> endobj
+1183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 280.13 511.2325 289.1361]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.4) >>
+>> endobj
+1184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 267.9483 511.2325 277.054]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.5) >>
+>> endobj
+1185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 255.8662 511.2325 264.972]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.A.4.6.6) >>
+>> endobj
+1186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 243.7842 511.2325 252.8899]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.A.4.7) >>
+>> endobj
+1187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 221.2121 511.2325 230.0687]
+/Subtype /Link
+/A << /S /GoTo /D (appendix.B) >>
+>> endobj
+1188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [494.296 209.1499 511.2325 218.2557]
/Subtype /Link
/A << /S /GoTo /D (section.B.1) >>
>> endobj
-927 0 obj <<
+1189 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 746.5215 511.2325 755.6272]
+/Rect [494.296 197.0679 511.2325 206.1736]
/Subtype /Link
/A << /S /GoTo /D (section.B.2) >>
>> endobj
-928 0 obj <<
+1190 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 734.5663 511.2325 743.672]
+/Rect [494.296 184.9858 511.2325 194.0916]
/Subtype /Link
/A << /S /GoTo /D (section.B.3) >>
>> endobj
-929 0 obj <<
+1191 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 722.6111 511.2325 731.7169]
+/Rect [494.296 172.9038 511.2325 182.0095]
/Subtype /Link
/A << /S /GoTo /D (section.B.4) >>
>> endobj
-930 0 obj <<
+1192 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 710.7556 511.2325 719.7617]
+/Rect [494.296 160.9214 511.2325 169.9275]
/Subtype /Link
/A << /S /GoTo /D (section.B.5) >>
>> endobj
-931 0 obj <<
+1193 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 698.7008 511.2325 707.8065]
+/Rect [494.296 148.7397 511.2325 157.8454]
/Subtype /Link
/A << /S /GoTo /D (section.B.6) >>
>> endobj
-932 0 obj <<
+1194 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 686.8453 511.2325 695.8514]
+/Rect [494.296 136.7573 511.2325 145.7634]
/Subtype /Link
/A << /S /GoTo /D (section.B.7) >>
>> endobj
-933 0 obj <<
+1195 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 674.7905 511.2325 683.8962]
+/Rect [494.296 124.5756 511.2325 133.6813]
/Subtype /Link
/A << /S /GoTo /D (section.B.8) >>
>> endobj
-934 0 obj <<
+1196 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 662.8353 511.2325 671.941]
+/Rect [494.296 112.4935 511.2325 121.5993]
/Subtype /Link
/A << /S /GoTo /D (section.B.9) >>
>> endobj
-935 0 obj <<
+1197 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 650.8801 511.2325 659.9859]
+/Rect [494.296 100.4115 511.2325 109.5172]
/Subtype /Link
/A << /S /GoTo /D (section.B.10) >>
>> endobj
-936 0 obj <<
+1198 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 639.0246 511.2325 648.0307]
+/Rect [494.296 88.3294 511.2325 97.4352]
/Subtype /Link
/A << /S /GoTo /D (section.B.11) >>
>> endobj
-940 0 obj <<
+1199 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 626.9698 511.2325 636.0755]
+/Rect [494.296 76.2474 511.2325 85.3531]
/Subtype /Link
/A << /S /GoTo /D (section.B.12) >>
>> endobj
-941 0 obj <<
+1200 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [494.296 615.0146 511.2325 624.1204]
+/Rect [494.296 64.1653 511.2325 73.2711]
/Subtype /Link
/A << /S /GoTo /D (section.B.13) >>
>> endobj
-925 0 obj <<
-/D [923 0 R /XYZ 56.6929 794.5015 null]
+1142 0 obj <<
+/D [1140 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-922 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R >>
+1139 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1203 0 obj <<
+/Length 660
+/Filter /FlateDecode
+>>
+stream
+xÚíØ;oÛ0
+Ü[PÍùü²Qˆg›ì-ZHßg9iïvEú‹/qÃCO~:×q0ê¤ (UHÎ[6ýàMYf¬…àMwé¯ïDc…`ªKÑ ê(²úµ}éG¾›Õ
+Û>U˜C·ŒG•($‡*›~@åËðç‘ ¨lªiÚÝ•3vÖt&Ma¿'kŠsšâ~‚ÁqM‰Brš²éM
+3»è'`hÀd^Q`ŽWÜ`°0Î+QHŽW6}àeü…ÓF^ØóògÔ¶j›×M÷ñgf_—€5lýTXq`Ö»Öæ`¥
+ÉÀʧ`9ËC¸¥¼‡õmWÓõ¦ªéWÎÅŸŸoÞÂ,êL¢ÂžOæDÅ=+ÆE%
+ɉʦDYÍP™pÓ( Õî–µ\W»õ‚¢”óQuXaë'Ês°âÖ‚•ã°…œÀžQ£8Ó !õÌÿC­Åÿ?’;>8ôwÒ9‘^®äŽ!KümD7W·Ø_£K= Š*ÿ ïK¿endstream
+endobj
+1202 0 obj <<
+/Type /Page
+/Contents 1203 0 R
+/Resources 1201 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1216 0 R
+/Annots [ 1205 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R ]
+>> endobj
+1205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 758.4766 539.579 767.5824]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.14) >>
+>> endobj
+1209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 746.5215 539.579 755.6272]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.15) >>
+>> endobj
+1210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 734.5663 539.579 743.672]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.16) >>
+>> endobj
+1211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 722.6111 539.579 731.7169]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.17) >>
+>> endobj
+1212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 710.7556 539.579 719.7617]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.18) >>
+>> endobj
+1213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 698.8005 539.579 707.8065]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.19) >>
+>> endobj
+1214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 686.8453 539.579 695.8514]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.20) >>
+>> endobj
+1215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [522.6425 674.7905 539.579 683.8962]
+/Subtype /Link
+/A << /S /GoTo /D (section.B.21) >>
+>> endobj
+1204 0 obj <<
+/D [1202 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1201 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-944 0 obj <<
-/Length 2175
+1219 0 obj <<
+/Length 2174
/Filter /FlateDecode
>>
stream
@@ -3519,55 +4264,55 @@ xÚÝYÝoã6÷_áGXëø%‘ìãî¶ÅÅî’¢½>(c kK®>’ºý 9C[ŠåÍö6ÀE€ˆ¤†äpæ7¿Ê|Éà/M–2iÕR
ìn+×í 7Éz[­‹Žî‹º3k•¼iPÿ¦½1É°ó›ûE†Î•8þдØ(ÝÎmŠ¾ª7´ÏÐo›¶êAÍ#Ž4ŽdÃáh‡¢¦•h+F
žœˆ‡UûÃÎíÁEðëJ€¢ý¶ðîÒYR¬û¡ØíŽ8¾/¶¢)A$؆F~öË2XÂuëRPÂȼŠ¢eÑ(Vuqå
4¨joßñË`wÖj†Ž‚÷f|SHÚê~èÃ"Ùœ?ü¨ßü¾ZEÌs•J• B±b©È%bž§
-<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||Oñ
-†A8Bs]ÜÖá®—0F4•Ò`„LC‹ÖîÐGî˜('˜NY.ÔœvâEí BÖÀ^Q1òc3 a2ZI-RÃa‹ šQö·¡ÂF¤- |Щ¦®1|¡O$ˆieòX´U3Ð<W?âbMVóaøj±8ùÒJˆ<WúÒ2‘WìÀu\.iS£x”è‹îÓ
-Ò (L¹^ŒùÉë¸sÕwhC%yª³\Omx ƒ¡„
-5
-(ÁÝîx‰kàXÛòä¾)Óò³B£:Ò96&'ȉj\@4@a&
-²MáÓŽ‚Ëx¿õŸC ®•’p¹gbçN"ùéß?¾AÉmÓõ#IàµPÏ|>Ø‘¢wI>Ü‚éž_»'‚€k÷ÓWT¾^Gôè”_g¸¢Ÿ[Ì3‡è‘徫~÷›ý>Ue¿½ÞWÓ÷/ÞèèWäB¡Êò—ÀËeʤˆëÏiX¥9ï0|?£^Ÿ+¯Ì,~ÆÊ
+<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||Oñ
+FŠüäuܹê;´¡’<ÕY®§6<ÁG‰ÐB
+žD8^øú &®*‚îóSˆÏš|SXuYµ)©Ú„âüѳoSSiùS¯wUý•eg(£ãÜsÙºOëàïg7b¸„%Wð¡Ðñ€^Á;NÀNTÿ¯ÕâÛ»Ó÷›CHᙺQ
+ÿñæ·Å/¿²e¹`Ë,•ÖdË'è0°&TŠû…’Ðd™‰#»Åíâ_ÿ㬨ǨP¸ªÎc°5#º§K­â™V܇3üôEjŠfø
+–Q£­¢+O(Ÿèº³ß…Ù¤
+µ¾€Ð5༚ºÜ¸c3Í¡vÃH-Ôø·¿‹ß
endobj
-943 0 obj <<
+1218 0 obj <<
/Type /Page
-/Contents 944 0 R
-/Resources 942 0 R
+/Contents 1219 0 R
+/Resources 1217 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
+/Parent 1216 0 R
>> endobj
6 0 obj <<
-/D [943 0 R /XYZ 85.0394 769.5949 null]
+/D [1218 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-945 0 obj <<
-/D [943 0 R /XYZ 85.0394 582.8476 null]
+1220 0 obj <<
+/D [1218 0 R /XYZ 85.0394 582.8476 null]
>> endobj
10 0 obj <<
-/D [943 0 R /XYZ 85.0394 512.9824 null]
+/D [1218 0 R /XYZ 85.0394 512.9824 null]
>> endobj
-946 0 obj <<
-/D [943 0 R /XYZ 85.0394 474.7837 null]
+1221 0 obj <<
+/D [1218 0 R /XYZ 85.0394 474.7837 null]
>> endobj
14 0 obj <<
-/D [943 0 R /XYZ 85.0394 399.5462 null]
+/D [1218 0 R /XYZ 85.0394 399.5462 null]
>> endobj
-947 0 obj <<
-/D [943 0 R /XYZ 85.0394 363.8828 null]
+1222 0 obj <<
+/D [1218 0 R /XYZ 85.0394 363.8828 null]
>> endobj
18 0 obj <<
-/D [943 0 R /XYZ 85.0394 223.0066 null]
+/D [1218 0 R /XYZ 85.0394 223.0066 null]
>> endobj
-948 0 obj <<
-/D [943 0 R /XYZ 85.0394 190.9009 null]
+1223 0 obj <<
+/D [1218 0 R /XYZ 85.0394 190.9009 null]
>> endobj
-949 0 obj <<
-/D [943 0 R /XYZ 85.0394 170.4169 null]
+1224 0 obj <<
+/D [1218 0 R /XYZ 85.0394 170.4169 null]
>> endobj
-950 0 obj <<
-/D [943 0 R /XYZ 85.0394 158.4617 null]
+1225 0 obj <<
+/D [1218 0 R /XYZ 85.0394 158.4617 null]
>> endobj
-942 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F48 953 0 R >>
+1217 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-957 0 obj <<
+1231 0 obj <<
/Length 3187
/Filter /FlateDecode
>>
@@ -3585,63 +4330,63 @@ H•²/hÊ
®£fw"®höx׺©;°Çn|>”°ÃÓ¶PˇýjÎÖzýÁ”rþ!È£+Œ­$üE™ Bö‘Q™…­Ê"ôãÇœ/Áò±r=?5M[ô°ÌÏ[€Ì°u¸Âz ÆmÜo<)¶ó=P¿+{’‘OíRzwdîØPÖ6ôV`0ÐhõðlÓã>§¦|êv=£lÁá“xý1‡š[ÚÍ„C9ßšÞ4â¦Å7ɵkù ’ß ÿe¬ˆ¦¯¸Çÿ¤ùâãý×þ{Ôñ¿Ä T0iª_ð‡)¶ˆÌ€
@Ÿ!þêó4Ï©Êendstream
endobj
-956 0 obj <<
+1230 0 obj <<
/Type /Page
-/Contents 957 0 R
-/Resources 955 0 R
+/Contents 1231 0 R
+/Resources 1229 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
-/Annots [ 963 0 R 964 0 R ]
+/Parent 1216 0 R
+/Annots [ 1237 0 R 1238 0 R ]
>> endobj
-963 0 obj <<
+1237 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [272.8897 207.1951 329.1084 219.2548]
/Subtype /Link
/A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >>
>> endobj
-964 0 obj <<
+1238 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [190.6691 179.6723 249.6573 189.0819]
/Subtype /Link
/A << /S /GoTo /D (rfcs) >>
>> endobj
-958 0 obj <<
-/D [956 0 R /XYZ 56.6929 756.8229 null]
+1232 0 obj <<
+/D [1230 0 R /XYZ 56.6929 756.8229 null]
>> endobj
-959 0 obj <<
-/D [956 0 R /XYZ 56.6929 744.8677 null]
+1233 0 obj <<
+/D [1230 0 R /XYZ 56.6929 744.8677 null]
>> endobj
22 0 obj <<
-/D [956 0 R /XYZ 56.6929 651.295 null]
+/D [1230 0 R /XYZ 56.6929 651.295 null]
>> endobj
-960 0 obj <<
-/D [956 0 R /XYZ 56.6929 612.4036 null]
+1234 0 obj <<
+/D [1230 0 R /XYZ 56.6929 612.4036 null]
>> endobj
26 0 obj <<
-/D [956 0 R /XYZ 56.6929 555.4285 null]
+/D [1230 0 R /XYZ 56.6929 555.4285 null]
>> endobj
-961 0 obj <<
-/D [956 0 R /XYZ 56.6929 530.6703 null]
+1235 0 obj <<
+/D [1230 0 R /XYZ 56.6929 530.6703 null]
>> endobj
30 0 obj <<
-/D [956 0 R /XYZ 56.6929 416.0112 null]
+/D [1230 0 R /XYZ 56.6929 416.0112 null]
>> endobj
-962 0 obj <<
-/D [956 0 R /XYZ 56.6929 391.253 null]
+1236 0 obj <<
+/D [1230 0 R /XYZ 56.6929 391.253 null]
>> endobj
34 0 obj <<
-/D [956 0 R /XYZ 56.6929 164.815 null]
+/D [1230 0 R /XYZ 56.6929 164.815 null]
>> endobj
-965 0 obj <<
-/D [956 0 R /XYZ 56.6929 137.4068 null]
+1239 0 obj <<
+/D [1230 0 R /XYZ 56.6929 137.4068 null]
>> endobj
-955 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F21 714 0 R >>
+1229 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-970 0 obj <<
+1244 0 obj <<
/Length 3415
/Filter /FlateDecode
>>
@@ -3661,60 +4406,60 @@ txÕÁ(1Âùãqt0úØÇ‘C×µLm›§:ÂÄ$è’y¦
·o¾Àbº¦úž&\Õ=¯d‚Ó÷aŠKѨðÀæ@pð
–þvA•c«ÇøÀ†û,¤ÆAg€hCõoœ€}¼ew8ýš*çÐð‡#çô/œÿn1]/‚0Péú\í8 °ef´>+sŒBOD‡+^ .ùRéØ{
endobj
-969 0 obj <<
+1243 0 obj <<
/Type /Page
-/Contents 970 0 R
-/Resources 968 0 R
+/Contents 1244 0 R
+/Resources 1242 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
-/Annots [ 973 0 R 974 0 R ]
+/Parent 1216 0 R
+/Annots [ 1247 0 R 1248 0 R ]
>> endobj
-973 0 obj <<
+1247 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [519.8432 463.1122 539.579 475.1718]
/Subtype /Link
/A << /S /GoTo /D (diagnostic_tools) >>
>> endobj
-974 0 obj <<
+1248 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [84.0431 451.8246 133.308 463.2167]
/Subtype /Link
/A << /S /GoTo /D (diagnostic_tools) >>
>> endobj
-971 0 obj <<
-/D [969 0 R /XYZ 85.0394 794.5015 null]
+1245 0 obj <<
+/D [1243 0 R /XYZ 85.0394 794.5015 null]
>> endobj
38 0 obj <<
-/D [969 0 R /XYZ 85.0394 570.5252 null]
+/D [1243 0 R /XYZ 85.0394 570.5252 null]
>> endobj
-972 0 obj <<
-/D [969 0 R /XYZ 85.0394 541.3751 null]
+1246 0 obj <<
+/D [1243 0 R /XYZ 85.0394 541.3751 null]
>> endobj
42 0 obj <<
-/D [969 0 R /XYZ 85.0394 434.1868 null]
+/D [1243 0 R /XYZ 85.0394 434.1868 null]
>> endobj
-975 0 obj <<
-/D [969 0 R /XYZ 85.0394 406.5769 null]
+1249 0 obj <<
+/D [1243 0 R /XYZ 85.0394 406.5769 null]
>> endobj
46 0 obj <<
-/D [969 0 R /XYZ 85.0394 301.1559 null]
+/D [1243 0 R /XYZ 85.0394 301.1559 null]
>> endobj
-976 0 obj <<
-/D [969 0 R /XYZ 85.0394 276.6843 null]
+1250 0 obj <<
+/D [1243 0 R /XYZ 85.0394 276.6843 null]
>> endobj
50 0 obj <<
-/D [969 0 R /XYZ 85.0394 200.1512 null]
+/D [1243 0 R /XYZ 85.0394 200.1512 null]
>> endobj
-977 0 obj <<
-/D [969 0 R /XYZ 85.0394 175.6796 null]
+1251 0 obj <<
+/D [1243 0 R /XYZ 85.0394 175.6796 null]
>> endobj
-968 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F21 714 0 R >>
+1242 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-981 0 obj <<
+1255 0 obj <<
/Length 2457
/Filter /FlateDecode
>>
@@ -3733,39 +4478,39 @@ S¦…€Äüœºã2±öŠ 41ÑÍ–,÷úBäí]¨u›«˜úDOâ‚ÙLë–3žatÙ±º÷5vxnïH‘šªmÝóìAߌå
M­
 ZãŠÜƒ[æž.ÇñS!L%:P–ô˜¥Hé!”·i"®"!G­š¼ü…3Ãø(M¶æÒ?/ÕºðõwÕNïÉzê-çÕÃÿ­@úÂ?Dþ ÇD÷ÿï2ýý¥Ê2¹ü—ŠÌ OÕÈŠ%ºaÜÿ?sËùy;:»endstream
endobj
-980 0 obj <<
+1254 0 obj <<
/Type /Page
-/Contents 981 0 R
-/Resources 979 0 R
+/Contents 1255 0 R
+/Resources 1253 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
+/Parent 1216 0 R
>> endobj
-982 0 obj <<
-/D [980 0 R /XYZ 56.6929 794.5015 null]
+1256 0 obj <<
+/D [1254 0 R /XYZ 56.6929 794.5015 null]
>> endobj
54 0 obj <<
-/D [980 0 R /XYZ 56.6929 717.7272 null]
+/D [1254 0 R /XYZ 56.6929 717.7272 null]
>> endobj
-983 0 obj <<
-/D [980 0 R /XYZ 56.6929 690.4227 null]
+1257 0 obj <<
+/D [1254 0 R /XYZ 56.6929 690.4227 null]
>> endobj
58 0 obj <<
-/D [980 0 R /XYZ 56.6929 550.0786 null]
+/D [1254 0 R /XYZ 56.6929 550.0786 null]
>> endobj
-984 0 obj <<
-/D [980 0 R /XYZ 56.6929 525.2967 null]
+1258 0 obj <<
+/D [1254 0 R /XYZ 56.6929 525.2967 null]
>> endobj
62 0 obj <<
-/D [980 0 R /XYZ 56.6929 393.0502 null]
+/D [1254 0 R /XYZ 56.6929 393.0502 null]
>> endobj
-985 0 obj <<
-/D [980 0 R /XYZ 56.6929 363.1913 null]
+1259 0 obj <<
+/D [1254 0 R /XYZ 56.6929 363.1913 null]
>> endobj
-979 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R >>
+1253 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-988 0 obj <<
+1262 0 obj <<
/Length 2097
/Filter /FlateDecode
>>
@@ -3781,406 +4526,513 @@ hZã|jY/ýE‰áÝN6“dy 8xp]7b~{é0h”~’e±½„3×rÓ,Ã,*r¸2Ư{ë³½ŸØøÎê±×꛼cµ¬Ë"
Ìk
âþî^̲EÑÅk˜èP<sgÕ1B ÚÖP!žÅj˜K±dx ’;mêá6¨BÐ ¾I½Ÿp
endobj
-987 0 obj <<
+1261 0 obj <<
/Type /Page
-/Contents 988 0 R
-/Resources 986 0 R
+/Contents 1262 0 R
+/Resources 1260 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
-/Annots [ 994 0 R 995 0 R ]
+/Parent 1216 0 R
+/Annots [ 1268 0 R 1269 0 R ]
>> endobj
-994 0 obj <<
+1268 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [519.8432 268.1131 539.579 280.1727]
/Subtype /Link
/A << /S /GoTo /D (acache) >>
>> endobj
-995 0 obj <<
+1269 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [84.0431 256.1579 143.5361 268.2175]
/Subtype /Link
/A << /S /GoTo /D (acache) >>
>> endobj
-989 0 obj <<
-/D [987 0 R /XYZ 85.0394 794.5015 null]
+1263 0 obj <<
+/D [1261 0 R /XYZ 85.0394 794.5015 null]
>> endobj
66 0 obj <<
-/D [987 0 R /XYZ 85.0394 769.5949 null]
+/D [1261 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-990 0 obj <<
-/D [987 0 R /XYZ 85.0394 574.3444 null]
+1264 0 obj <<
+/D [1261 0 R /XYZ 85.0394 574.3444 null]
>> endobj
70 0 obj <<
-/D [987 0 R /XYZ 85.0394 574.3444 null]
+/D [1261 0 R /XYZ 85.0394 574.3444 null]
>> endobj
-991 0 obj <<
-/D [987 0 R /XYZ 85.0394 540.5052 null]
+1265 0 obj <<
+/D [1261 0 R /XYZ 85.0394 540.5052 null]
>> endobj
74 0 obj <<
-/D [987 0 R /XYZ 85.0394 447.7637 null]
+/D [1261 0 R /XYZ 85.0394 447.7637 null]
>> endobj
-992 0 obj <<
-/D [987 0 R /XYZ 85.0394 410.3389 null]
+1266 0 obj <<
+/D [1261 0 R /XYZ 85.0394 410.3389 null]
>> endobj
78 0 obj <<
-/D [987 0 R /XYZ 85.0394 348.7624 null]
+/D [1261 0 R /XYZ 85.0394 348.7624 null]
>> endobj
-993 0 obj <<
-/D [987 0 R /XYZ 85.0394 311.223 null]
+1267 0 obj <<
+/D [1261 0 R /XYZ 85.0394 311.223 null]
>> endobj
82 0 obj <<
-/D [987 0 R /XYZ 85.0394 189.9853 null]
+/D [1261 0 R /XYZ 85.0394 189.9853 null]
>> endobj
-996 0 obj <<
-/D [987 0 R /XYZ 85.0394 156.0037 null]
+1270 0 obj <<
+/D [1261 0 R /XYZ 85.0394 156.0037 null]
>> endobj
-986 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R >>
+1260 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1000 0 obj <<
-/Length 605
+1274 0 obj <<
+/Length 591
/Filter /FlateDecode
>>
stream
-xÚ¥TÛr›0}ç+x3EÕô˜ I;ŽÁÓvÒ<8FI˜bD¹8ÉßW “Ä}ê0 Ú=»«³GZ°‹ôƒ]ÂPáF"€ aænwr5vé`ãAþ4ê4u¾^ÐÈP„$tÓ‡I-çØM³[@ ƒž®€@²^.¯W@Ÿ{>a\/ãÕ‰ -.+ù™¤ñ<ñ|* ξ,Óxe b Î6'×ëÕY<Z7ëÙ*žÇ‹4ñîÒ+'Nßz˜ö‰íøãÜÞ!7Óí^9RÁ™û¬ ±ÄÝ9£”ŽžÂIœ›·‚tH=ªFÐŽ`œ*Ç$<"£ržÒštU¥êVfVµJÖ›6/­b¯M+wMß±®K&‚\ŸpF‚gÉ™–•P+ %ãت]•²1Ö¦ÌÌ¢ö8èJëU¥IÙ³ØÔæàQ³ìv÷²¶‘æ».ó¿ÈK“¨´{´±´ßoiv¡`‘zŒ?“u¾×}ëÞún0†‚1#Ï^ÖM®zv„Þ„S0Ï·/Õ¨‡Ö@ßûJy™©çÆÄ4ÝöÉ@ëù
+xÚ¥TKs›0¾ó+t3AÕtt’:3Nƒû˜4Ç()SŒ\ÀIóï+!°Iâž: ³«}|ì~Ú…
+ÕºÕõ«3uEó»$hô®ËZ«¤iëâa׺BÿÚ*Æ‘]…#;`ÞþÒþ{ã¿¡0FLzX¦ñÐS‘ŒÙ¾(Klô¡ða3?VþP%6endstream
endobj
-999 0 obj <<
+1273 0 obj <<
/Type /Page
-/Contents 1000 0 R
-/Resources 998 0 R
+/Contents 1274 0 R
+/Resources 1272 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 954 0 R
+/Parent 1277 0 R
>> endobj
-1001 0 obj <<
-/D [999 0 R /XYZ 56.6929 794.5015 null]
+1275 0 obj <<
+/D [1273 0 R /XYZ 56.6929 794.5015 null]
>> endobj
86 0 obj <<
-/D [999 0 R /XYZ 56.6929 769.5949 null]
+/D [1273 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1002 0 obj <<
-/D [999 0 R /XYZ 56.6929 744.7247 null]
+1276 0 obj <<
+/D [1273 0 R /XYZ 56.6929 744.7247 null]
>> endobj
-998 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R >>
+1272 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1005 0 obj <<
-/Length 1215
+1280 0 obj <<
+/Length 1159
/Filter /FlateDecode
>>
stream
-xÚÍWÉŽã6½÷W}’ˆæ¢}êt$‡ @ Ì!“-Ó¶0²¨H”N0ÿž"‹”í¶fæ0‡>ˆK±êÕ«â“Å~lQ¤„Š2YäeBRÊÒEu| ‹=ìýøÀ¼M’
-’&BÀdf7NEAÒ‚ç‹øÚÉ·ë‡Õœ-8%YÆÓÅz7ÅÊr8 àÀzû{ôrQý2æ)ÄòõÏx,!y‘3{ŒBˆŒ°R8û_äQ¡ñoª?…ƒ/º}O)ß½4µn½¾(I™ñÌ{É¡yž87?µp0g‘9ÔƒѨš€ÀòYá³ë—¬ˆô©Þ*´ôÑo ã~¯£¶8­nx§²ÑíÞ»¬ÍGûÜ5u«¼ÑN÷ŒªýpYÆ"çÑ»eÉ£KÌØæf³aŒ”iÊ]6áð*9èVnOÔI6£‹•†X0¨TodÝâDwŽ57”1u»ÈT –‘dܳ˜0’Ñ’¹¸‚°eÌ(…bÈcâ½¼¥br ;G‚žù.
-\·Ðš­lÀ0M#£í3q‘S ¿ï4B‡žÉx=7ÞòÏQõµ­½ì0#Îôh×ÖÖSív$6Np¼°[4¤Ñâ
-ê­½>k„’)œã¦U–~;9ûÅs=pdü)G%§ÂÚÉ®×GrÛ6H–¬šK¼K„ðÁJNXV„ÐOžnóëÅOsM‰Õš|Z ^’¢ÈË[»mÝC 4ÔßY>®”©Vörl76€] ½ÓýW;¹œËíª¯®³
-©ÞBg‘Íç°üÚ{áwÜ㣇fé¿vm˜Àº{íªuðÛÖÝFV¼ƒí¶Wƒg‹qà~l.³¿uë=<:°­ÛØž'²ïäã 7¯Ý„ÞPýl–»º Q]Éæ C ½Ç§9L­6õÎÝê/s:£÷ tÜ×IïyÐ{ÿâyÍA÷pëìÝþJÙwâÍJ'ôNåáêÞ«< aáU¤ß3h¬á$å`cÒàjˆçjoHüý‘)Î{ΓáHhJroEDõ—K (bؼ!¼E¿§„夼ð~\4¼Ökô:×È“zóßà"¥ãf«Óß„O`fPYJE0·{pÏc+JøO(®±Íi(„Lá¯H¨×RöÿRؾñÕö´ps/ºo°«ßé`cîÔ\VÕ$ AìÑûÌÅý”ðÉöõ*v‘\ÅÆ aGá9‰ÔVíäؘ¹@@ÃØk3ñÙœºkÉôçOá%× ®Ô¬t°7rÌ)Mþ9~ø~=}Ü„O‘û4÷ùLâ‹ ~û\w¼ %æ&G6¯üm°éCê>Ú¿x>—Ãendstream
+xÚÍWÉŽã6½÷W}’ˆæ¢}êt$‡ @ Ì!“-Ó–0²èH”NO‘EÊ›2sÈ%ðA\ŠU¯^-¤Ù‚Â-Š”PQ&‹¼LHJYº¨Ot±‡½ïŸ˜—IRAÒD˜ÌìÆ©(HZð|_+ùzý´úŽ³§$ËxºXï&[YXoÞjy4ª_Æ<¥‘Xþ¶þ%$/rfQ0‘V
+'ÿ“<(þEõ§pðMw)åû±—¦ÑWÃ%)3žy-#4ϧæ‡æ,2u3ت ,Ÿ~ý’‘>5[…Rƒ>ø­aÜïÕ`Ô§Õ-¯T¶ºÛ{•©q´A]ÛtÊ ítÀ¨ÆÇA‘e,r}X–<ºØŒ­oÖÆH™¦Üyc ¯’ƒîä¦õDd;:[i°ƒJõF6Nôѱæƃ2¦éö™bÁ"’Œ{F2Z2gW¶Œ¥ y8{o÷TLŠd§H0Â3Ÿ hRõêµÈª±îÚw\yýl”yj“ yY×p@d)¸Ý¶úÜØXØé
+¦ÝŽÄ$ Žw
+xfŒE_aNX0˜ÀSš¨¿S•/ŽJí‡/bƒ¦Nʯzßœ–±1—²éLœ¥åK­ˆÆV…BIØm
+JxI1|«ÄR{}Ö8!S8ÆM§,ývrö‹çf¨qdü)G%§ÀÚÉ®×r›6H–¬Ú‹½‹…¿ðÃJNXV„ÐO^nóëÅ¿_æ’£5é´¼$E‘—·rÁûºÿäøµ“mÓC\4&Å=î˦“}^)S­l9m7Ï.HÉhòd×.¿oýˆï`¢Ñy'øŸ{ ¸@েÌé¿v€F1yçŠÜ…®öÛ­ÖǬ>}ΆÜn{5xB‡ÀÍô§î¼Þg'²MÛóDöGùüŘ˜÷ã„.±~Ö÷]Ó+­®d[ëÁpúùeS§M³óôwzži~ÅôÌ•@2BIOWW‚¿›^GSë
+Ó–ÿ¼\g¥» ÜE
+¾qÂôrœº=ȘZ\ ö\FØÿxd²ó‘ód¦·$4%9‡‹{¦úÃ9šfؼ!¼‚¦ÿH ËI)xáõ8kØ;ߥo…­<©»çÃ¥ÛŽ›­>L/‰ÁÌ ²”Š,`îö$àžÇV”ðl×ØæÚ,˜Lá5]Ö·[öhLs&¾Ñ¡0ÌC/—U5U}hõö5¡æ^uº…®û]}á¦×=}»ž^êáý-Rb_ósoù _dð!AK"8YXù½±é_Á£µ
endobj
-1004 0 obj <<
+1279 0 obj <<
/Type /Page
-/Contents 1005 0 R
-/Resources 1003 0 R
+/Contents 1280 0 R
+/Resources 1278 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1277 0 R
>> endobj
-1006 0 obj <<
-/D [1004 0 R /XYZ 85.0394 794.5015 null]
+1281 0 obj <<
+/D [1279 0 R /XYZ 85.0394 794.5015 null]
>> endobj
90 0 obj <<
-/D [1004 0 R /XYZ 85.0394 769.5949 null]
+/D [1279 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1007 0 obj <<
-/D [1004 0 R /XYZ 85.0394 575.896 null]
+1282 0 obj <<
+/D [1279 0 R /XYZ 85.0394 575.896 null]
>> endobj
94 0 obj <<
-/D [1004 0 R /XYZ 85.0394 529.2011 null]
+/D [1279 0 R /XYZ 85.0394 529.2011 null]
>> endobj
-1008 0 obj <<
-/D [1004 0 R /XYZ 85.0394 492.9468 null]
+1283 0 obj <<
+/D [1279 0 R /XYZ 85.0394 492.9468 null]
>> endobj
98 0 obj <<
-/D [1004 0 R /XYZ 85.0394 492.9468 null]
+/D [1279 0 R /XYZ 85.0394 492.9468 null]
>> endobj
-1009 0 obj <<
-/D [1004 0 R /XYZ 85.0394 466.0581 null]
+1284 0 obj <<
+/D [1279 0 R /XYZ 85.0394 466.0581 null]
>> endobj
102 0 obj <<
-/D [1004 0 R /XYZ 85.0394 237.1121 null]
+/D [1279 0 R /XYZ 85.0394 201.2466 null]
>> endobj
-1010 0 obj <<
-/D [1004 0 R /XYZ 85.0394 206.4074 null]
+1285 0 obj <<
+/D [1279 0 R /XYZ 85.0394 170.5419 null]
>> endobj
-1003 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1278 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1014 0 obj <<
-/Length 1863
+1288 0 obj <<
+/Length 1768
/Filter /FlateDecode
>>
stream
-xÚÍXYoÛF~ׯ üDÑz/’ËæɉíÔA⸲R£Hó@‘+‹…¤¬ºEÿ{gR”LÙnk öšùvvÃGÏG~HC'9ò0ñœ8açÖÞˆ¥™´D“>Õ›ÙèøœNˆBŸúÎlÑã%‚8³ä‹ËCcà€ÝË“gã õ°{}6{žû34züéêlz2¸;»øty=ž8äîÛO®f-ÅÓ<Þ~º<¿x÷yËgüuö~t6ë´èkJ0S*|}ùŠ~?ˆ…Âs60Àˆ„!uò÷ò8cíL6ºýÔ1ì­ê­ƒÈŒ(óé
-F!uÓ…šåî}9&îÚô—úÍ(ÚfiŽ–fáææÆÌwG 6i³4ë…l6eõÍL+£Ô›ëRëåÂ,™ 6YìÚ}Eb¨í4{5è£
-¶›ƒ¤%²‰ÒÌôK…#§[øtòFwÌ2N¥>‡©.?þf(¬…éªdû¨(ñÀ „ÑöVAV9)«ÄGû/#ÏÌÒÖëy­žBnLŽÐ×|ð(å ¦Üî.WM
-ÂœÂ|0ÜJÔ¡•RY¯<ô£Š„ù:˜•êÖ1éЯ¹-õaWci”өηõß·>ú{²qÌãAO˜¯£yT†}NJ4TWN 2õ}"ÔÏ3ä‹€¶¿m}i’Dý ÐþÐJ¬dõ¯€tQÅT›ÌfÂïþIËn6&„¸e™Õ{uØçöÝŒYàšÂ¨oüÃrœF2³.xaäÙߢ³eª«, Vr›A"ë¸JçÚ½ckÀ8ÊÌZZÀK\É¢Žæº6Uäit[€7Hcå婪Ôò´HëFaqg‰Œ/‡–6ee+$p_FkMsRó*]Ê=ÕëûºQ‘B»‰í‰-r„PV5&Æd™yÚ;~EÎ×··Ý|ǽ耭{À&Xtè±ÀõrÆ ;O&UÏýå»}n<@Lˆ¡b€Ê¶R)ÅÑÛòÿ\c¯endstream
+xÚÍXYSãF~÷¯Pñ$WáaáÉ Ë†kˆqB¥6û ¤1V­,y%ÇI忧ç’d#›JJsõôñMOwˆ…á#–ë!/¤¡å‡r1q­x9ÀÖ¬}M32D£.Õ»Ùàä‚ùVˆBzÖlÞá Äš%Ÿl†(l_]χ#êbûÝøj<9»œ|Žq©oŸ}?¾™½ŸªU¦é'ãïÕÌ-,¹®ý³¡8»ž\\~øi:úŽ=»¼ž ?Ï~¼Ÿ5w­"˜ u¿>}ÆVÆý0Àˆ…km`€ Cj-ŽËë0ff²ÁíàdžagUníE‰`D™G{`rH¦ÀCn€ËwCä1Ê$L''ч±=[¤•ê™¶^pÕIø<Zgµ°r(t]*wGYVlF_×¼Ü*Ú?TåÛSÕûó´oŸ‘z^¨6/jÕY•ÅcšhÁ%×e•>êaÅËÇ4æ»üÔakÊ"7ì”Ô Qøá®ðV%ÊP(Ž©«ÒMWƒÈ(òÈËJÏ-£Õ*ÍÔ`^”{heE±ºâ/Ï™%IÉ+3¡>Â𑾿¹æ{$i€6ÍGb?ŠÊUtdP[÷ŒUÈÔÛU£wUó²÷8æif¤dEe‹¢ª}ÔK ‡•Î·Ï#MöîCá΀\ò= •ªí©›~ƒ6ÿ-Z®2ŽâbùjÊ·«Ã%÷GÏZ{y³sö\Ÿ~1×ffQ×ÏÁÝ4¹¸a<Ñ
+tèErÆ)LÌ ìÔ)ÂpÉ!è©n½ˆ4ï8Ky^ëéMšezºÈsk¿²å‘µΔk1…éÔ‹T©¦ô0j }z¬¬Ó%ÿn¿ô¡ô1µ(Ô¾ç{¯ª$ ÔŠAìV’o—Ñ££ëA Ô> ¼t×ìØe526¨CP@¨Ó”©; `;³¨ã‚D&àñÑ0bÏfW£|Ï>»ߊ»êøÔžýr5»C¨gOyU¬%þ±¾/ÓÆWÔXÜÑé´½açQí€@Àó°kieÝn¿@š„PnþŠøìúì@åo e 9S˜n6xïøÔ±!Î %̾œÀ”CePò0%Í-> OGðÿ%Áž~xˆ ïFL0† ÒœÄÇ â죂Û`v•Ž¼·E…¼%*ØE¡ã¿
+¡¦cÞ+Aa‡AiŽ&í«ø¿Ž‹ÐÀˆ¬w dÝçù“g:õ¡°
+˜8I wÝöÇ?ób
+|HÜï\*“Iv‹LÖ»bF¼ÂS‘…Å@ ¢IG<\Û-MÚ„ÄÌ<Ï~w99Wë:ëÊ¢ŽjÞ0Yjé"qwä¯
+3!“£¢mõÙ΢z0«=9ðIF§~(K3ÑFªI ŒUñZÄy-*¨ŠÔ¥M)~Ë ö¥Þ,Õ]i–÷Å£¬Ž¿ÍübAa zð2JŠe¶Õ#¥ —hg¢_ãF¨Q®Tº’ã¾Ç=ÖÿŸNUÛŒuKô¼*šº º?ºÁöGx¶«™Ö&h› ·®tFT
+ÊTˆiivíÚÔ«×eΓ=5’´Š£.mÃU;GÝ©ÔE^à9"–JØCàxy¥™Zÿqdkà“µ› jÝ
+Na>¤¯xÁã/jY»—|‘´7ŠÂ-Ý M¤³•PQŽŠ2Q£ýëq€:Ž¦­Ö÷£J\„¥r8.ù ¬ "~AªíŪNAÕ1̃`àùFŒ!Mr¡äå‡~-zP©Ä¢VÊKu¦}?N[êÃFÓ=¦SYl‹3¼îb¿§ ”Cˆ¹Ê[öOÂ]Có¬ûœ„èéÌEc½â°õbz|í/×<ÇG,„i¸Ï(ôY«•P=x¢ºù7Û£û_`#~›endstream
endobj
-1013 0 obj <<
+1287 0 obj <<
/Type /Page
-/Contents 1014 0 R
-/Resources 1012 0 R
+/Contents 1288 0 R
+/Resources 1286 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
-/Annots [ 1019 0 R ]
+/Parent 1277 0 R
+/Annots [ 1293 0 R ]
>> endobj
-1019 0 obj <<
+1293 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 190.8043 126.3509 202.8639]
+/Rect [55.6967 61.5153 126.3509 73.5749]
/Subtype /Link
/A << /S /GoTo /D (rrset_ordering) >>
>> endobj
-1015 0 obj <<
-/D [1013 0 R /XYZ 56.6929 794.5015 null]
+1289 0 obj <<
+/D [1287 0 R /XYZ 56.6929 794.5015 null]
>> endobj
106 0 obj <<
-/D [1013 0 R /XYZ 56.6929 480.2651 null]
+/D [1287 0 R /XYZ 56.6929 372.6686 null]
>> endobj
-1016 0 obj <<
-/D [1013 0 R /XYZ 56.6929 441.7923 null]
+1290 0 obj <<
+/D [1287 0 R /XYZ 56.6929 334.1957 null]
>> endobj
-1017 0 obj <<
-/D [1013 0 R /XYZ 56.6929 373.7178 null]
+1291 0 obj <<
+/D [1287 0 R /XYZ 56.6929 266.1213 null]
>> endobj
-1018 0 obj <<
-/D [1013 0 R /XYZ 56.6929 361.7627 null]
+1292 0 obj <<
+/D [1287 0 R /XYZ 56.6929 254.1661 null]
+>> endobj
+1286 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1297 0 obj <<
+/Length 2693
+/Filter /FlateDecode
+>>
+stream
+xÚÕZK“Û¸¾Ï¯Ð%NÅDˆ9­×·*öÆ–³ÇUáˆÄ¬DjEjÆ“ÊO @$Žìò)5`³»ÑÏÀÐEt‘K’ðB,²B™P¹Xío’ÅÞýtC-Mìˆâ!ÕË›?¿æÙ¢ EÊÒÅr=à•“$ÏébY}Š^üõù/ËWïoc&“ˆ“ÛX¦Iôöùß^áÌx%eôGñâÝÛ×o~úøþùm&¢å›wooã,)|yýÛw¿¼:÷áöóòç›WK¿ŠáJiÂõ~¿ùô9YT°àŸo‹\.à!!´(Øb#$'Rpîfv7nþîÞšOC–“<'2gYÀtŒ.¨ \¤ld;Y
+ XݷǺÙàs«64÷e½3|As­«7èÚ·“¥w]¯ö8Ht–ó&\µM¼¥yÔîvFªù@«£•º;m6~Þso¼a»a+cXâ½;²,‡8Îr~v®wïKo!d3p÷¼2ë"F ’Hª£ZÓTõ&À‚¹<·4Ï\Éó¬°[Ð/Ä¥ <͘ç3Aõ.Ù1X?Ë…%mº]Ûþv:x
+ )E3Kx@çlŽå^G?Ï£ÒÌhósŠÝgWí~nƒð¤Â‘MŠ.‡9 ;ÁwøôûIÑÃðdË ëØÎxbe¤` G˜ÿѺ¾^k­Ö.êƆGÿ¸S“ jOýáÔû8Ü—=¹¨~ xJ²ÌÁÀI’†ë¼%Š‡T®X]ÖyO5Š¡Ì>É9{Z¦#
+ÈÅEá•
+9º4é“dQÕîKc!¨uƒ60õE¿Ü ÇÆ”ðüÏD&¡ ‚@´ñoˆràD‘§.lZxï4Úëø6#ítÐÆx (Ðk0vØ©ÞÒ·kÏ ³S6 ÍØ„t@V¤ÑËx[v6–$hžðtRÁZ]ç(¨ö/·± ,êj-ç릇B»rE qdBÌ•øÜA<»ÏL|›Š¢ë/®ÖÒè®ìWÛ)«‡mí&Õµ:õXç©cìØWTU®¶ã$(ñgWw6êõLñ´½C? gKÙ(m>N“èùîò}{À6ŠÜ}=Ы•êºúÎ%݃i?©ßçja¥]f €"–C6ˆŒP‘ñMIÁS ãPªØ
+q‡\1Äl3J2>²ŸÆ¦ãòS|ݸõf^PØ(¸ª¿Î-ÕôW]ö9P¯¡6
+ˆe“ÒÊ5°ÉòT°§18ƒ‚øŠzèR÷ÛÊHí€:ê[ýGu8eÒ¦^y‹™´m“D0ef «tNdô£%®Ôº<ízí|³ßÄYØBA\÷~u§ú¥|µEXÓX[ü#`ž&l\­|€½Ñ0§Q½ÛºUÖ]§\ÐÝ9ð\÷nC|j̵´K×áëâèÎF¨úÒ«¦RVÊÃåfyXD†¡> DƒŒ~Wò˜‡žê*4àEJ( ‡è×ê4ä1 <•Mlqù¢Ú5ÇnùpïzF¼
+u"yŸ ×çº(+`:mBñÛ«
+v‚_Ñ&-Ë÷–Ðùs’LŒ“é¨úc­º¯ç½¿ªîzWnBˇ¢—ålÊOøQ‚x# £cÇl»„“¬ðܯb¼ocàÁ
+° ‡åþßv×ùöKð_×^9ø>KRñt{RÍ·WO5=öµXFO2ö´dOuE4åv-¹œ—}yäøÐ9ézÌ2Ž[r=p[r.³ñ6\¿DçÁ i›xðV÷ÎÜö³!=îµÍ—»]ûàdmí$´¡#öÉ´ ”3ß'éù 3Ë4H„¶n6Äðd­`ds€F>ã¶<ËÎ1 ïLØÂ\yך^
+Ã{˜.u{²ßéh²C»ÀÔ‚V;‹|S¯ÐákÇ©glÀ„IÏ4px€P˜aúp+È
+#si¿Xô ªGfœ¥V˜ž2G·ð{Þ÷觑²†l=âà¶VfªÅß;ûFç­sIË«'eóÍ…–
+(>pGÊìéóÉ¥ñ7Þ“†>ïÏê‡]ùè¸Cø½Úø«‰CyìÇWþÔ
+p¬xJ´§¹=vrB þ²¡ðÙ£,ˆ†—
+N8çŒd¬`—·Àvÿ¤?í.îü›¾ü2õÃ%0'üµµQ†Ìè‘2ÂÒTúÄ„íû&·×ˆã<dÏÄŸ¼÷?²œÿ¿Gd„çùÌ9#×çŒ,ñJiõ‹©âþ^.5ÿ+Lendstream
+endobj
+1296 0 obj <<
+/Type /Page
+/Contents 1297 0 R
+/Resources 1295 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1277 0 R
+>> endobj
+1298 0 obj <<
+/D [1296 0 R /XYZ 85.0394 794.5015 null]
>> endobj
110 0 obj <<
-/D [1013 0 R /XYZ 56.6929 167.4388 null]
+/D [1296 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1020 0 obj <<
-/D [1013 0 R /XYZ 56.6929 126.8733 null]
+1299 0 obj <<
+/D [1296 0 R /XYZ 85.0394 744.949 null]
>> endobj
114 0 obj <<
-/D [1013 0 R /XYZ 56.6929 126.8733 null]
+/D [1296 0 R /XYZ 85.0394 744.949 null]
>> endobj
-1021 0 obj <<
-/D [1013 0 R /XYZ 56.6929 98.4089 null]
+1300 0 obj <<
+/D [1296 0 R /XYZ 85.0394 721.0357 null]
>> endobj
-1012 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+118 0 obj <<
+/D [1296 0 R /XYZ 85.0394 672.3079 null]
+>> endobj
+1252 0 obj <<
+/D [1296 0 R /XYZ 85.0394 647.0603 null]
+>> endobj
+122 0 obj <<
+/D [1296 0 R /XYZ 85.0394 136.5325 null]
+>> endobj
+1304 0 obj <<
+/D [1296 0 R /XYZ 85.0394 113.5963 null]
+>> endobj
+1295 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1025 0 obj <<
-/Length 2719
-/Filter /FlateDecode
->>
-stream
-xÚÕZÝsÛ¸÷_¡—NåéÅA°O—Ë%×ÜÌ%×ÄiÒÌ”– ‰w©);Îôï À$EJÎø©ãàrw¹Øf3
-l¦SBE.gY.IJY:[ì®èl Ï~ºbž& DI—ꇛ«¿¾Ù,'¹âjv³êðÒ„jÍf7ËOó—ñëÍ«÷× Oé\ë$UtþöÅ/¯på<JÓù?ÅËwo_¿ùéãû×™œß¼y÷ö:Éh.áÍËï¾ûõÕã{®?ßü|õê&~E÷Köþ¸úô™Î–ðÁ?_Q"rÎîaB Ës>Û]ÉTT
-V¶W®þvžºWÇ,—
-MRͳÓq6fº4'JpáLg¿™v0JéüDzXWuÓ– üÚ›kÆؼ®·ýRàÇ;üè,áŠä<˧›ñD]¡,'4eVWK³,×#Œ˜$¹ÚÓ|7ÂE­A l@Á1.9*ã‘KÂ%›Õr„‡ÝáZzÒªÙÖõïÇýO™‚õYæ ÷‡k¦çõúPì`/ô¼p+ÆNòy±Ýâê¢Þí¬`7Ù–•ÁQëìèHWõ×€îï=àì£9<”ÕgU±óœs¸3‡†X g ãXÂÎ3Fò4åÁü¸iËreµZ™ÎË
-›öakpˆÚÁ >¶ûc‹cPjW´äħ)ì šÒ98WÎÆ£×%]ªiŒT§èÊÌá-øy™hDfÏ/(¸—’i_¨õÖ„Ól¾¬w…³Õ`)´AYWøp;¾w¦„ù¿iJÇœ\JÞ&¾ÁËCžeƒÂÛ ÑÎú·ÙMmܮƒí·¦õôõ*2hü’wh7vnyçjþÆ3Þ÷¥4§Bõ}©½¯¯A¨²4Íß®Éø¼)­P\/«ÖŠE[Þ™GB9×K
-œ7àÏá5çß.¥@x
-&ñ‹ì“Û¢]l†¬î7eX4_ÌâØšgE—ýÚ×à \Ú–A7
-üÙ–÷zg=¬]lq‚œ=ee¬ù£óÛÓçõÞºKã¹Ç|`'‹…išò6Ý
-i‡3Ün<f /í4¡Ôq Ñ  ÊáH40ÈÄB¥0 P"º<Nã“QKõ(ÉZócS¬Í¤NB‘jõ,:<œNrT§@B,QàeŸ¾ÇPKEç‘­ÒÔ‡fO$ëqŠp[Oöy„Qp*ט*NIF´ѧF)ɳLyç=Iû°7#¼ 8gYª£Rø•cºA\÷x.¶EÓŒ0U)ÉR!Lÿ2• ’[äÒåŠ.>Â6c$=ûÍ!]Åïä§ä²qËõ´ q£üé¢þ6¶LÕ^ܲÏ#ùrcN$…µ ðõX7 RÍ1d‹qÙļ2R(¨¨¦óó…"#RÈà½÷eH:mñ»ä[®FÄ
-µSR¥ÎKT#bù ¯
-‹ª{r§Q<“ü<
-Ä”-À4ÿà‰—fU·­Ý|ªÅÕE][· ¾ukÚ{c*|´ALËU{ð#áÈ¥(©
- ìÅ8•ñÎY,—èÖMc‚ÓÝä\¶Þ;WÇjaݲðŸnÝ7øÑ­÷Pó¥5ÕÒx)÷e»u7…t]}¤”ª`'ŸQƒ»<¦qA¤ºˆ dÆ…CÖstêò˜Æ‘*º&V‡¤x¹ÜV‡ææþ.Œd1V†Ľ–¡8N•PžÃtX’·ÑGµ¬ÛI~ñL¶Nà†~á‹üþu™_¹3p |Bô,ß°„²¯‰Ê¹ì×ýƒi¥ižÎ{wQÝÕ¶X}>$½Ló!?Gj ßõ
-°Lªœ0Áù EàTÊ,D„ªîÃ0ó-+ù€ó?ÎñHže> ÏœÛÂZq[»R
-Ã;X.e}ôïYoòCÿÊCV¿Š|UTh€oÇ¥W|À‚ ‚È´×8Àâ@˜cø/Èþ³ùÛ¾Y‘Ðh]VÀnK9àIЖ~;6~䫽&³B1úÄC, Älnüê ØyèrÀþõ@<â±ÁÜCú“(Bdê {Šèò˜F‘ê"ŠŠ’”«gu<º<¦QD¤ê…¨¯˜ !PMŸ:KA¤êb䤭“U:Ðý“³&Œ†@ÿ/ÊI¼8 ÏãÕÒhªò^qèG¶ÎƒSÂÈ9%üKâ¼j‰ ÷‡Œs
-ÙW°uµ>ÚórÓ]ò¬ÖÀ¾Â¡í‚¢ÿÂÄCqœxgÖ¡eí…áFçâ.]tÄqÑ]£Š*"c+˜òºu_a¤ÃÌ]ôÂtó°G)ªüŸäϾëji\°u™7ÎËK¼‘Ür¯ƒ"!‚sT]uŽ#)¦sTfü Üh0a&ç$2r»ŽŒNò‘àihžÂÈ*l1ÙÔŽÜG®¼0»äº¶ðûxê±³ž²ŽlÕãVn©Æß[ÿĆPmCÉÊ+G³np- üE3ÃàqËíÓζ¸¡öýx†1êZ20‹›9xË?Ý›Ei9›¡8¿«0òû Ñ4\ªÁÎI>µÆÜø ûèè~<Z{1,ö×&í
-°L³ø<qu¹UJ
-?°ú4`ƒ‚À•°qâI[„4Ú´áb+Þ³œÆsì–Ä»ÀËíé Ü”ΞuU9œ¹¼Ešé0ô›-Rbÿ³hD wsÏþ¦ÇÿëWZóq'ö2‚Ó¨”U>*ÿÑéTóÿQ”mFendstream
+1307 0 obj <<
+/Length 3388
+/Filter /FlateDecode
+>>
+stream
+xÚÝ[ÝsÛ¸÷_¡·Ê3Ÿ$зÜ]rM;Í]m_;\h‰²™H¤N¤ìsþú.>Eˆ å4ÓéLÆÁåb¹Øß.h2ÃðGf"C™¢j–+Ž&b¶Ü^àÙ=Üûé‚8š…'Zô©¾¿½øî Ëg
+©Œf³Ûu—DXJ2»]½Ÿ3ÄÐ%pÀów¯þþúrAžß¼¾¾bþOø1×?ÿòúúÕeÎç·o~ws¹È±âóþòê—[OqžÇ?¿{óö§_|.?Üþõâõmx‹þ›Ìô+ü~ñþž­à…ÿzSRÌžà#¢m/¸`HpÆüÌæâæâaï®y4¥9.0‚‹Ù‚q$aýÉb™€qŠErIa ÊeAù”ô”/ J‰Y ÒÊÿµ-îË"€@’|–óeyN¾F¤ #OŠä©´Hu±-W‹åC¹ü´lêõå"Ãxþ~ñññó?î´Äß½¬Ç‹d´Ì% ¹¬ª}¹ìšý³%–eTG鹦xæð’Ô³\W›R —àòKŠ³ÀñT¡å„d³´&˜X҇ѢO5ÜÆ`¥žêDgŸ›z°¡„IP´àÓª„´¯fgy,ÂíƒSL$-Qˆd¹rŠIˆyÂ[rØDæ·f·¿$rÞÜï‹­õaóhkÇ…ýÙmWîíø7Œé¦´ãuã&Ûçº+þpÏÔ+Ǩ©Û
+¬—Ï—„9óLåˆq¦¾Âú,ÆÝ2PuËL
+Ĥ̿F¤‹q· T©½s®¸úøûãÁ1—I'‚/ÜŽ.7EÛ&ˆ* ©—\4 ~L@œžasèv‡.Á1&› 1é—GŽÅS‚)Äsýa¿„ %ýo¹:+òoXàê¾nöÎ¥ïÇ&‚$.õ1ÁŒ"ðf}àBR:)¾Ëº¨6 Ûjyú’õ7ø’C{þWÒP¨D9–Ü
+ùŸ¼î Mø¯³^KqŒÛlR¹T •çÙKSi~.•f @ãt:•ö©ÆSi êŹf»“É”CN#"Ÿ!P%dˆ’)8=V
+îU/KKõýÛw?Ú‘Bô*‰`Á‘%gÔ¹‡ÌÑv»fßµNžÍÆŒ>ô
+¯Ï+mxþôP]¨ìÃO.Ø«bÓj+ÊÙ¼n:'°Ý…reç«zÄø¥ÕSÊÔeŽ
+¹ëO­e¿|(êºÜXæÛfU‚q1°ú·kk³ÿe™Èâ´þÜløÚ_Êù!%ƒZ˜JqÆÞ( ™û©êšCçkF›ö W-UîîS¥­Ñ†Õv·)ž£P{0u‡­«ÊöxQ´>æ÷þóXiÕ "M£Ïb¼Z
+Tg«%‘‹jTý"õXŒWK*lÛDQ$Ê•ôö­ûÕ}ªˆÉgŒÂÈö,Xv!/É‘RNO9îÎrÔ®”~düžÏòûT¦J PX¨ìÅpÔEÒŽ”ˆE^ŠH'¬íÈBRá–Ih"×8Ò…TäÅ=‘há8æˆQêß´r.hq˜¬í¯Í²Á9«ú~àžÞ’y0]9mî}*kî2aîʘ{¹iŠÕ
+íf[4ª&VÈÁ4¦ÕÔ£šP“§ŠÕ¦(Fë¹^%Ç
+ç÷ .Æ S9ê…£l¼_<VåSJ–Øíe…,†Áʧu¨†ÊŒ³ÆJ’X›ý­Np_=–õq“Ç÷CšÅŒŸÙãÕÄ{*»Çk€5©MŽ*Û©MÒ£ÛóÞe0DApœÔf ªód—s
+)(.*°Mc*wÛliËüƒ\Fu+#ÀàÅÉ™@ôö¬ƒ}#×Ö°±¦1bƒÏ1}Ì¢ x²7÷÷3;¸Ž”îèýZð5Áätý:‡J€ì@ ‰Á‹:'Æ€›ï?éVN–éjÛ;æ4_ø¶€¾Ð•qU’jo‡»ÃݦZÇwÙ•ûªY]ÁPú÷¡ù[-åI/¸icÉ%lŠn`±<wfSÚ®tŸ@Á,ÿöúß–àúº-;<SÌJ÷ÝCyPZB;]9>ºßp_j91±¬N,ê$2žšŽZÅ¡k¶ðνN«UÕB‡¥råÝÃI¸¬!˜ñs¦ªßÂ/<FZ™‡²Æ\Øe~?8r$ÝC¡_Qf¾ÏwZ'q…¸ ±ªÛ¶L5DDîH£j±M·`cïJ»¬U±½‘(E ¼&}$4ÍT'&ŠËW F-ƒZŠÐŠ¢£ððÊÚ×ýsªsMÔøLUö„!ªBßh¹/‹.uÂ'
+ûO±PÓÀ¦O5Žl•–G×b&ë&EÔìú6
+mDM«3P õ‡PŒÆ
+õGq` ŽÂâÀ¬…8Šx× `XÏy/%}ˆs¤%¾§í#ÎNYðqØ&Ø&㺕óblÃ!f“lÛpŽ$Z
+ûÆŸÃ6ž~Ñ Uhžò± ¼bÛ@ˆ@4’f°ç–äŒ
+Ù¯›tôWÌUáT
+ Ѩ´<[7Œ.Z+|¹Ò Â} —¼÷ÉŒ€ X
+Ç Tç¦í2ÂV¸µ-VeÿŽý
endobj
-1024 0 obj <<
+1306 0 obj <<
/Type /Page
-/Contents 1025 0 R
-/Resources 1023 0 R
+/Contents 1307 0 R
+/Resources 1305 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1277 0 R
+/Annots [ 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R ]
>> endobj
-1026 0 obj <<
-/D [1024 0 R /XYZ 85.0394 794.5015 null]
+1312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [219.3839 329.5541 281.1025 341.6138]
+/Subtype /Link
+/A << /S /GoTo /D (options) >>
>> endobj
-118 0 obj <<
-/D [1024 0 R /XYZ 85.0394 769.5949 null]
+1313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [491.4967 274.4996 511.2325 286.5592]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-978 0 obj <<
-/D [1024 0 R /XYZ 85.0394 749.3395 null]
+1314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [102.5211 265.1945 156.7673 274.6041]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-122 0 obj <<
-/D [1024 0 R /XYZ 85.0394 221.8894 null]
+1315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.8464 219.4451 306.1963 231.5047]
+/Subtype /Link
+/A << /S /GoTo /D (options) >>
>> endobj
-1030 0 obj <<
-/D [1024 0 R /XYZ 85.0394 197.4323 null]
+1316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.9845 164.3905 495.353 176.4501]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-1023 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R >>
+1308 0 obj <<
+/D [1306 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1305 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F14 956 0 R /F48 1228 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1033 0 obj <<
-/Length 3426
+1321 0 obj <<
+/Length 3086
/Filter /FlateDecode
>>
stream
-xÚå[Ý“Û¶¿¿BoáÍX>H‚lŸœÄN™Ú‰ïÒ´ãø'RwŒ)R©;Ë“?¾»øâ(y’δ“Î=€‹ÅbñÃîÇVþØ*ŠIœòt%ÓD”E«Íîá·o¯˜¡Y[¢õê«Û«/_
-¹JIóxu»ðJM¶ºÍß‚r hðúùß_\¯yDƒ›o¯£(ø|TýÍ÷/Þ>¿–apûêÍë›ëµ¤i|ý·çßßZŠË<¾~óúå«oìù\¿¿ýîêÅ­›Åp¦Œ
-œÂ¯WïÞÓUþ&Ñê *”°4å«ÝU …BØ–êêæêÇpð«êêÓ\QEa´Z‹$0¾ŠÅ$qe r³„C!JI,¸pÊÙ@ù #QšF+G…ʯ³]‘¯7Åæç¦.®×1¥Á»uþ˯߼·µ jêË—‘pcÖ %B.›*k[M4’§$Idj¨¿ÆÃOD0ûÈ2lŽÝþØy8ŽÉÇî"Ǽ<›®9œ<L£Ä<bS¦O¦°J¸¦L®ÖŒ‘4Šøïåþá¢È?Óˆ–÷us(4) ¤!#I(,×_<Ì8‘± ÁSv¨=\¸ )šúgrÙfeR±¥¥N¦“¬ÿ„“œÛóO^Cá ‘4 džòŸžîg
-êÙ¿F(M¡öþ%6ï<l"’J[Í•U€âáJ’p*‡ —ÉX¼’4"RJÿchÖ"…rœùŽC4
-Kïʺl»C'ŸnRæã“(b 5ª´6„Åf_
-
-yV™àHG©;¯¾h5ûÍCV×E¥™ïš¼
-èÁ¶dQAàæ°–ñ¼†TgTd©Æ:#Œ£·AD•,…Éï<\”)ûò*Éâþ[dcwÄcY<ùdoøYPÆáü¢`ßçué¨æÊŸsè]¤ ks¸ôÎüïËÇ¢îyqÔ@À »`Hµ¼ÆŽJ¯ñšß"âØs‹< ›—翼Ê!8 )ÀâYm:ª¹:'«  )ÁUéó"Ùühwð'|»¬ÄØ3S>¼‰¯-€¯ËS).Ø€êŒ-X*m àÔíÖžÁ£ˆ!Ä\ôOa0÷”Ãî<«PG5×èØ@A)&ÁF*}Û«ôìb›ÐänB»Ë 5¡à’MJDÄà 61 :c–J%ºEñÉ&Ëÿ”(á‰Ø°ô¼RÕ\«c»
-´6•ƒ‰tèÏͳ5m.l…J«…/rÌL°<Fåç%á ‘ÕÖÇÌp*ò²3Í:ow…þi—åÅðK\ÚJ5¦Ë0ņs¡ãÐTë zwÂ/C¥AÌmôuM„ÒÆêvšXßXÚdÇV©Ë ßë
-SÙ<l4IüÒuVéŠuÕ²3¬î a{ 7Rð7†Ê¤†èxÌþ^sn}>nóP|0&Vœ{e¥/ ¼3u›a{T ƒ#?¯L7gEXÑÚÐ}³®+v{µ6ÜÅÙœNxnA?F¬§‡²òN¡UgÖû7°ö©¨ñ 6‰’89_CªeürTZ¬ìi½Æˆò‡Ùÿð²>êYöžìL¥~Ov¤Óuv§Œ0Nzìâqª-3]í×]7÷V?,q¬° ¯›þ'ÝRƈeÊDB„Nn%Ë–I‡eÒb™Ëu‡mrˆm˜£Ç¹)dk·È–8ŒÀ&E,mÂB76šP33®þØâ™óÐ!/ÛÏ|Ц 
-}çŒAº!ŠÔÞ—ÆAÞªÆ4Œ 
-êÅDzíÊú¾ç1µ57Ì<äc¨*t0“¦A‰Xž&8“nyÈ ݦ}+…­Ql±û´ú÷­õƒ   ¦Ö­™nØ?æyI.8 cwK3LY4/„¯îþééÁÊ r:øOÍÍ™®VúlP7
-ÐZwwZÀ3™úš81gËÇ(hmêìßhdM™·˯‹Âæ‡ DM­;ÕǃM®Î»Í oØ•;;à,Ç:Æ,åòþ¢à%¾[RÙ_–Jåö»¬kçéVg¹ŒÎë¨æãŽ7‹Á
-¦ÐÄîʼ SÜ»·k£ÙãúpwdöC|wÙDˆÔ]ƒ™Uä
+xÚÕZKsÜF¾ëWÌ-£ª ÝO’]{òú‘(U+'–öU‰Ô Gâ†C*CŽd¥òã4ºùÒ[ÞË–Ë¥&6Ðhàk
+l¨"°¯6A(…lì«âŽ}9ƒ±
+W Ú·~Hž/7!cëŸqůÞkÝùDj fy/‹”˜zó
+ÄqdÓÔ4:0Q:†mžTÕÄ4}Y‹Ó<eéó”220¸=ÄôéÓ§á>ŠP–¿êkdÓ†klS!ºâ"Ø=¥tߨïŠä.OÁ«Âx}zÜ%uZáƒY×%zÜ/y¼.O "ï^Šämé%Z|V†áújO}E”ÌM\=¦Û .ÜAÆŠ¸çÑZX•²_éî[`7ìºGë$ÏiÐÓžQFåxì+”û¶h¦_ß>X €¾MN•ÿ
+)„›rCªUHã­-‘¡Ù|Hö5ê„LV6ÒH=$n‚myxÌÓÚ.U ½~í?¸}ø‡FÞÌMÑd, 6}­ ÑüⴾϙÝ
+Ùm†¿yYÜ[ëÁø.¥¿´Ô=Øô¸v¡‘‹`0]¶ópÑpYåË:Û¿LĦâA¬$ÿ?FŠ³@1kÍ(FÖœŠž9?¦UŠNŒ;{ýáöêý¿i|H«*¹÷ž±/P¨À€°áìö‡"1È]ØþÛÌö{.Ô÷˜nËbŸÝDë(ˆÂpI´ç‹îÙŠÃÛ”é‰þè!C†Î0
+žÓÏYUgÅ};GWjE,8º}¸JŸ,¶³ÎÏMŒëx!ÊCò”mû@Ô[|Õ¡ÇWü¦¢÷û¤²8„4€›‚¨ ö'Àëê‚÷\]
+ÇÌí¢]ñu /yéг=?x}AÏæ0îÐrB9÷)Q‹ÓáŽß“=D¨ÁÍÀ þˆ±ðfÏzÈjú›<•Ù®¸~‘¦.`j“ég@Ô"ðÊ=ó¶Þ3ðevðËýDH¹wn+gŒ#Çl)ë²Í˜çB“TuRW#¹pSJ³ ×såö£KA.Éa z‚ÿ‰‰ï1«5šƒÇ úü¶êÛ½1ÝìwÞ|:Š(ÁŸ7_—í¼ù.\Åo§ôø’—çñi^tƒO#Ñ“øÔ}{iĺ¼¿Gä‘<"Upd@ Ì#¸Xÿ4zAl1–‘šäUI¤»”(.çrD÷qúù1϶Y¿}—QŒnk7¥Å— 4˜F'Ô7³ èR§÷åñe#¢0EslZ_€’ 9<À='âZ‘æS¨|¬™1+hÆiÝEðXû ÂÛobÎð–H|¥t&7uç…˜`1Ç) 0uSÃæsÎýÔöh†YqW„Ô6‡ ©Õª+%A,bÿ©õ—´K0k,ù`OГmD½¤Õ_¦V qu-çârÒrÊ„>i*Ñ Õ™9G–#Ìœ´œVB}‰å DŠ"í<ƒŽ«X/å/]¶|ð\(sw:<îî\½»ÚçÍ6Ù>¤lþ?/„y2j–iSJËÁDn©"Øhæ8J-%´œ‡áüJ®ñJû;[Æ ¤Õ½¥¾…¥^n¸q8ê€ôßTD²«wã_˜f»tŸœò†œˆ@½BÇ1‘t 3 Åû¥ÍèdØY%Ú3á\>k£†*T" +¬~9£ê·S‘ñm¢P>ÿÖ¥¾–²9Z“Ã8ÍæJ(ái«ì²÷Á†Ë…Ô±,á”?ëlý8ù2_‹Îùš€:G ÆçWÔpWÔ/cDŒ<Õ_ùšT±+¨•ú¾ƒ…Ÿ Ãx¡'*ñ­]§3å°x·օú;.d]ÔÀA°ÚGÔ¯õ«v M1N
+öüúë½Î/nøR†Ôe›ñ>ÏE fùèñïqä,<”Ù(¹ €ç+0È“â z ÁÕ@2¿w,öξ‚­!ׇä×ì’¯mÃ`oOÞxÈ/4pùNZÔôL¥SE‡d—z1´O§û"´­!æûs4†ý£ÓÎ@ÛvíºÎÕ¿ÞDìôÃðÝãXÕø®+(ãvDG‡æ&òèBT¸ùrÂÝÈ–"øqÃI*¹y,èXN ôØñ,B€‹Øx
+¦´¡¢öY¨Ý†Ö§ca àPKW
+ X…ó®tØfpÅsÙœÿ˜lÓ³«y¹MÇj$wºcÕ|UP‚˜zõ„õñÊoÇÝÉõYì­Jú”ºôìÎåq³ÝtÉ@Bª»`º.ÛyÓ5\=ÓÍÞº’¾Cí"„ƨí<×X»¾c€é˜Å}õnÒºš´k“ÕÏ[ׇCRø>-5¬\jœä§9«+ªóE«wØf¬î¹ÜÖ¤ËAÅ${®±ä¾Eu5S}Ñÿ+‹²»!B³tõ×e›±›çBå÷ù©z8èór›@Éôžà÷(8ýÃÙfÆyÓð˜’EKm¥.ÛyÓ4\iÁ§Šù0qÜM£G
+p¥å‚‚žk¬`߆²X4œ¶á}FWRX£bTŶ—ï_io¨ B®—rÙ.ÛŒ½=—¿%9¯I”Æv¨^ì¹Æ‚Ì q_òÛ¬zÌ<6˜ðjر½Ob>µe¢SÓÚâM­¯ËÚ½ª’Ú©¹4ƒ)h*ÑÜHÁ0+¶ùi矚¯²¢ÍR†ÅŒŠ€|¯ù.+v¯Þ|?‘`àL𘸛óð½võ¨I8!ò$£™?¹‚WW×82S>ñyÈüéÝŠÌÚ˹n×Ä·eènöìÉâ»2ÃYÛËb;çLû…³ñÒý^—mÆs=—»@?+w;0Y€ÍËn
+°‘ìé¬'ümÓm¶2Ϫº!êï&V&6ñ•±ú=ƒe“Ù {aÕþ”ÅÛÃ%bç7%Š…K-±×Ì/à“í&y¶swĶ:.‹?Êý~î.@è@‹æbë+ïDl@(‘çÖ×0Ö×,(Ï„V¦·@ÿc4ìàûNþ.«ZâÛë››wohÜZâ#Ôšðñýëµ+ª*ݺß_MbŒÅ„\ÐE§¿ÔQw͹S7/ÆÆÅŸŠªæ2î%­¦ñFµ…Öpþtn¸Ç{®§Ôw†ëÐ 4k~w梾ãÏ:'öþ;ˆýê_¶?ªÿ’ñ9 ,ïƒDÊ)…à|¨¹–q cM¨þ'[–Cendstream
endobj
-1032 0 obj <<
+1320 0 obj <<
/Type /Page
-/Contents 1033 0 R
-/Resources 1031 0 R
+/Contents 1321 0 R
+/Resources 1319 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1277 0 R
>> endobj
-1034 0 obj <<
-/D [1032 0 R /XYZ 56.6929 794.5015 null]
+1322 0 obj <<
+/D [1320 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1031 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F53 1029 0 R /F14 740 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F55 1037 0 R >>
+1319 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F55 1311 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1040 0 obj <<
-/Length 3964
-/Filter /FlateDecode
->>
-stream
-xÚ­[ÝsÛ6÷_á·“g"Ÿ$x÷”¦IëÎ\ÚK|3mhŠ²x¡HW¤âúæþøÛÅIA’;½Éd‚ `±Øß.h~Íà¿6:a2W×Y®͸¾.·WìúÞ}wÅÍÒ-ÇTßÜ]½~/³ë<ÉS‘^ß­Gs™„ïïV?/Þ~ÿ槻wo–B³…Ln–:e‹oþúŽz>Á+­ÿðoüðþö»¿|s“©ÅÝín–ËŒ¼<öÇŸÞÆ}ºù|÷ÃÕ»»°‹ñN9“¸…_¯~þÌ®W°á®X"s£¯Ÿà%<ÏÅõöJi™h%¥ïi®>]ý-L8zk‡Æ$§¥I´YDtBŒDÇ%OL*Íu¦ó$•BZÙÕ«›¥LÕ¢îñW/v7Ü,ªa¿k«H#Õrq·ñ/‹¦éžzP´ÔWý6T»¶h¨÷ÑŽïʪwdCGd«
-ȶu[Q÷Ó¦jQzÀ#ñ(™NxÆì ™k‹mµrdã­H•¤B¥ŽjS¸=”Ýö±uì륔y’åéõ’ó$×ZXâ~èëö!™Ÿg
-æWÙuÆÓÄdŒG…¨–c2+leÆÂfÐ1Ú RÆ?/?1Ê$SJ^`ÀS30=íÔ$™Ð3>ÁîA‘…\ ›
-bÑW»¯ÕŽ:ë-È».†ªy¾áœ/@$ã‹UYµ‘”›¢}¨nø¢§çm±ªüŒtöû‡ u¬žáüê’–Ù?®`^zѹånÿõþ£;*à1åfzTé"ðÀõ¢íjôÅ×jEM«[\Ñ^°c[ôîÛ¿0&šªO’/î÷nøSÝ4Ôºwƒˆë¦ñ³®»Ý-½¢é×D±u‹úÅþÝíÞVsk rbÜ ó;£c2Ïrkx"3Îðú¡Ø Öòdž.nפüjl#`äF³Ì)ÿò1b\%™äŽ‚ÈýcUÖÈg0©ñ¬C&/Kò\zÃû“›ybô¸t*Ç{ N·FN‰¼SAÂâfÉ-µƒc±Âs‘(%fÖ<]ü3ªþŽÜ >žp7\ðDÈ‹ÞF&Ê(9ö68çÁÛØG4î³~%Õèâ³ô‚_“ö+
-YvEY­ ÞÏ€ ¼°®§:^w¦Q u¤>Yø¶-éh·äð
-™_7û~sÒÐϯ ýhݸ¡O~ W/\Y”›s*%Rhäæ’hFdgDã©‚hЃGŒA“Üüƒ9x5
--ˆ §w÷u»zýöûÀ
-›lDX{>uYÆ+QJ1碌GçЬm¯“ÏÀgÞqª|> cÝíÛÕ«Èa¢ô!gùTB§NÂe&<“®Bȸs‹Øjºî µê6"‰L%:åéÑ‘~©žc'
-¨–eÞeÿÂ4CÍÄÉŸÀl*tÇK¤€Ø¤òZÓ?÷¨.«z™?
-KAˆÜÖM±ß?ù‰=]¬¨h-ÑŠó1°>å‘uŽöe‚G^Ê\¸ ˜¾Õ)¤VïZŒÉ´ÅýÎi øFÉÓ|~?úŒåT¼¹iv"ZAr‘3>q«}ü¢L†MÅ¥†0’ùd1n†rS–e/ÄèÝÈsO†X#†f•‡páRîØ\)šòGp†ÐrP¨]HþðŸÕáR _>LVÑ÷]‰7_t6/Í0¹˜ø?ŠT&‚“¡àzzcþi6*ƒC¯‹¨ØÚÔå†(€ô™:¼Áö*Z7½ŸôÞ/€zZž;ø”Ý[Y„„6¡Äc!
-2<ÈóGÞ€©Ú ‘ç°m?ëc·bÓª$3ʳÄ\
-hᣣwêÈ}ÁS,/ÊC
-½È°uïèÀ1EIqm­
-¹ë"ž}éw71åe¬æÌLô-B9ä©Ç‰ÎŠÞ…ö(Ö~„°uõ: ÁÀ]kÍ5P=8wñ2 ÿÊŒ˜V~M*ÇÚ•(s‚Ç/Öµà³Û@=¸±ãcrI…
-”µFVU3íT¿Q1]õüZ›˜Õ[G×Êò¦ qÌjœ£Û¹)|6ÕC•@lO_»y<ûô´0Z:V1Tw"§—Tò[ F5ìé± ÒshP¨tž~!dØä@ ÂF¸UÚ¼àlsî'»ø¡†CåS#CçH‰²„‰`翯Ȃׇ<*_Ün³ý3¸½ß|®‚T³T£§ÔÜ“eË~œÂÝw2씄t”±”_:’Œ±È‘ØÕb)1Øaž…kˆß§qÓ9w90 =9X);Âù¥&?ïj +b"Üå{­;üî„>ú¡Ô{‹°(=#ã¯|NlÀ̬Våpœ0‹íÞFIá**Â~Í‚?¶”KÍU·-¬=MíÊeþ«©|a¯P€+±®Õ¹.yû¢±Õ½Ñ*›r`+ rƒgþª„ ›½M!¤ô|ôÃŽÔ7õ—*†BŪçIn¸œYÉüZI­ †B¬Lú’oÌjLüËÇe˜q9ž2r  £š²3j J)N´{–
-zô¦è\½*îÏrôßýËø3X€à.ºó§ŽzÎ]˜*U
-ÍC·³,ª2Èü‚Q̶¤é!&5U,¤Š„ûDiüsSû²œÿÈ ëÚä¹'*)륋Çb×[¤§Rï U”eõ8¸vûL ¶JQ>½Rém*—á/4•Ý~ eå“ùÜb‘ªôK,c³-Êåv¥ãçaDÈ9œêÙÏƼîµîN?û!YÐ:wý2Ê9GÈ p·(E_-Så/FÊnå?L òCâ>Vë„ïߺϨµ2.¼#,dâEÁÝà  ¹„&6¥Ž„d‡L¼'OUP7ExxãPèß»›Ky*¼Ù1²pOxÂDak¹–qŽ\Ö~àeò]dtþú]VXi@SÊ_˜—d©_ãJÁÇK¸À¿¸s©vPN€-[]F’Cª†ß¹ y¢,~d/
-ž‡WÔÚžŽ:îݵØãŠø™ßD¢=Ø—ti§tØ#lÚ˜èçÈ@ø*ò½I$¿ËÀ¢BîvB¼€º$Ëó™<7O£›_ÒG7»VdëçY¢3Zi
-â!@}ñæ|ÎQ~F×N.?1p”dmþÄ_}HàŸjDjçðßéãþ‹ÃÊ`„7FÄ‹ð’¥dÃŽ)Ü4çsÎߎ³þ?¡.ܯendstream
+1325 0 obj <<
+/Length 3852
+/Filter /FlateDecode
+>>
+stream
+xÚÝZÝÛ6ß¿Â(¨ˆU~Jdó”öÒÜöpI/Ù¶èZ[k ±¥­%g»-ú¿ß ‡¤$›Þ,zo?˜"G$çƒ3¿ŠÏüøLçYn…Vešq=[î.Øl c¯.¸§Y¢Å˜ê‹ë‹Ï¾’ÅÌf6ùìúv4—ɘ1|v½úi.3™] lþúÅ¿^^.„fów/ß^j=ÿþÜó›o^¾}qY¨ùõÕ›×ï.³jþå?^|s(>>Ç—o^uõêÛažË_®¿¾xy¹sÊ™D~½øé6[Ã__°LZ£g÷ðÀ2n­˜í.”–™VR†žíÅ»‹Ç G£îÕ”ä`8˹‚$·I¢"G Å3žÛ<ŠW™‘x Ï´µz©P¼åjõ{ÛTÈìg_i="WEf+` ¤ˆ&s
+›SXOôSbÙ¢È=Ár[v]b©3“ÃkOœæC]ݧ6#3‹š!¢_~ILËÌJaÂvÚæ¶^öe_·Í±¾¥
+Ž&ÛŒ¡ayy’cêú}ݬaÓhæ®ZÖ?3&*”jÁçŽÍÂë;™Cï¶n|·SɘŽ,
+‘S%sc3-lp›²Û$ØœúŒ¬ù=Å )Oô MKÀ ­èÈ$Ö–9¸Å(‘aéé¬E&0 Q`ܳ¸Ü?Üõíz_Þmê%„iÀ ¸raŠ©J×US(V­™ßºÝµ;z"ƒj’ZííÑs«VàÙØ4ÿ~S5 ' ˊܘ±e$¸ƒÀes>æ—ðN¦/÷°Ïg#ÿ†ƒA­Ø¾¯·[j9a‹ù¶-W·º!7¾Nª¬¬˜žMšLÛ±äZGÇéõv-ýûÓ¤ÉwÇ÷AÕî bf8:˲¡Æ]µïêΓ—·=úiפ¿ßY<Ž“sQûE»rw·M9_­³¼`ÁiMâöDð_„“Î-ødÃ{
+â!0Y Œ'—E¦Œ Æ_ýæö®`—X;7™PŠ{Ú¾=ZbUÝ–‡m?¨æóÄ‚`Ýà9¤”S ý-& `߬à äŒEÙ¸‡ñ†]ǧÐÿpçIveúzN·.îbë“Ñ«ÙêæOðçóOSAÂïe²çŸ™f¯Û¾:Ã;\¾¯z¯ð¨®ÚÕ‹e»m½I•t€MRS)£öt#2Xš#š€uQ@X†£ò(˜S“‘
+ù]UÛÿk09¦€
+^¸î7Ô"dTQi†ÅEÊ 7=¾Š<"™{3æV Š¾Äx)ìbÝ”ýa€óR†H£Ôí”ýÎe@oIݦôù©ª%=÷.eî}•›p0 t"‡ÿ¦¥áûò:zßqG¾ìC½òo„ÉÑ"4Òº¹Ã¶›)¿Þ!ôÓÆõ|y‰ûÈB?!
+̘"쉽C‚¶í2¾ æ·ížéö˜mjà `Йå£$óxcj€:Ю»D4E&u°üϪ~ù.v Ih."@uæ® 5å*ŸšÊÍùVvS¹…CSQ÷HÞ@w8rÓD¼*”$6ÅׂeJDزHÉ‹ƒ·QÑÕR–˜6¼º&?ñÔ`;œþ¦õŒÞb}–P¦ÃŽ&gv*¡sJ•™*DØ$ÁSÀá ?ÄØÚ¶í{j%ªBe:çúD¥ï«‡tæ\° H´{šüNN…Þât‰Òm©ÂKÝC‡æ²ª÷)×*0g †|_v4ùªBY6Îḵª†Z䪠ñÅÕë¿YH®ùô¾9Ôc¢»ÂYÅÄ·’wAp‚‘ˆ‰!AWÇ…†\)9:ggä¤À•¼ˆrò†à5.>N‹ ûæþ‡˜˜,th€¯àú ”åÅo/ÊÄ^@«p
+‰yi·Ü×7”$Ô
+
+Aîê4¶_Ϩñv4ùbLŠ3NfÅÅßUËáÈç™ÈÔñf8ÀÆe>ÙÍ Ø‰TÙÄél£ºA’犧ʹóÏ; 2—.ž> ž†p Šµ‚\Qh…ÿ®ÞÕÛrï_o‰"ö´·)G¦áü*Ο^±£zdÕÎóâô[XB:®Ž‘Ë/K ÌqyØ{kß(ùQ¢id_í
+|:ŽOˆ"±æ—>…’VOÄÃÄ^„Wë‹Í*u6m¦lŒ
+<ÊáfˆÂƒÌ0²hWì\íQŽÆðYùÄËÞPdí²ÆHIh˜6X_JTL>…5¦@Áu4â0þiáÅáG}@ÅÖ¦^nˆH¨sØ<쪲ñÓ‡IoÂòÊ¡£åÖ£ ô5B‡±€ÐUð…±€ŒPÉ1Ò¤¨Š@
+Ò¦QØ_?¹"δx’¬Û•±¡\öXìæyôìSma´TT~ZŒP6ÿ˜i@z«áÁÈh†=–ôGv
+•ÞSÀ?„ —4ØÄnÀT…6OЭåÁ
+ˬ•£{NÅìüª÷Ìvàö~ ©
+RM½Z¸8÷䶅i,ç„‚ýeÌéÖ e,çSIÁXB%nµTF¬±æÉô_¹b\(Ë}V
+ì´Ü ÎŸS!¬ß\
+!eØG¼Ô†—·õûäÕñÏB¨„˜!•3\’I “0¼Å— ÌIæú)ŸÐ¼ø7éhqÆÅxÊÓË
+Î 3Ãʘñä3Ç뤮TÒcP˜"%ùrUÚŸYôßõgÌ
+žðg°
+y¢,~O
+_ò†<¨u=-uÜøwÔb¯áj|‰çÁ Ò]¤›ÒW|€G`Ú¤ @øìè³…3ÅÇNTÌÝΈP—dÖÉcò]M¸xò ×kGþéöá(Ñ­4ñ Œþè½øœ“üŒn|~6ÚÀI’5>ó”ôiJWëŸ^8>ô!^7õÎ]àžû¨#ÞlŒÝºÿ§ÓÞ¥>¦a 5.l4K÷ Jà?ñé·ÝðùÅä` ø¾‰ áë“ç©
+z\ŽT0©ßerÚeê«r©3ü<q­Â¢(ÿç/·ñú#Î|ŒRüäK†Máι8Ù9g™¹Hlý¿Ñ7ëendstream
endobj
-1039 0 obj <<
+1324 0 obj <<
/Type /Page
-/Contents 1040 0 R
-/Resources 1038 0 R
+/Contents 1325 0 R
+/Resources 1323 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
-/Annots [ 1042 0 R ]
+/Parent 1328 0 R
+/Annots [ 1327 0 R ]
>> endobj
-1042 0 obj <<
+1327 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [120.1376 318.9001 176.3563 328.1154]
+/Rect [91.7912 473.8206 148.0099 483.036]
/Subtype /Link
/A << /S /GoTo /D (controls_statement_definition_and_usage) >>
>> endobj
-1041 0 obj <<
-/D [1039 0 R /XYZ 85.0394 794.5015 null]
+1326 0 obj <<
+/D [1324 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1038 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F41 939 0 R /F55 1037 0 R >>
+1323 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F55 1311 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1046 0 obj <<
-/Length 1675
+1332 0 obj <<
+/Length 1516
/Filter /FlateDecode
>>
stream
-xÚÝXmoÛ6þî_!û`ÃQ$×Oi¦îдKœlmW Š¤ØBõâYr³`èßQ$eÙ–Û  ¶að‰Òñîx÷ÜsgÃx<D¡¢Ê*@îÅÅ{sxw6"VÆwB~_êÙltôœ O!ÒЛÝötI„¥$Þ,y?fˆ¡ hÀãóãW§Ÿr<¾<½˜p>¾†K»~ýæôâx"‚ñlúúürâ ¬‚ñÉ‹ã73'ñu'¯ÏŸOÏ®6z&f/G§³îý“Ìô~½ÿ€½ür„S’{w°Àˆ(E½bp†xÀ˜{’.G?u
-{oÛ­ƒ‘#QÒÐQÚ $ˆ+Å=Á
-emèŽÍÉê¨X橹/²2+¢Ü,âªüc:_¯¢&«JóP?qÒYm®‘½ÞVy^ÝÕ?èÐ=HÏìùT!)ekùcz?ñCŒÇ«2‰ëVêž•ó AŠs“å(ŸW«¬YFðÉ¢ˆb¿Hø“§íì¤i+]§ñ*m¬hÌ.îo(/§g×ëv]F'ÏŠ6¿½|Ö¼ý9˜¿-¯ñôŒ,Þ]Íßê~zv:O¨Òï~´êým—Œ‘Ï;¦£ÕR‡ª>|³9Io£uÞøuºú”®Œ4¡aø‘Á3¹m°hЋݠ¤çã\*„jef —F“Úïmnoíµ¬›(ÏÓ¤Kõ~r ÆHaÀ<n5¥M|¤½C€ Û$C¡Ðqkð®ZçΈ†‘¹m©cQDe2„-ŸHÀ¾ 9Ü ¤5 ûΊÊ>… %Dh k- Ó¼Š’O}»Á*í¾¦—×õQ¦qcîa—E³\V++ 837p
-»?Zשݽ°7eTØ;¾òÕ„Èqë«š$&KZç—v·¥Û7’W1Ôø
-Ç,-zÌööÒžwQÕÍS³þl.P;õ–ܦ¢Œ˜­¬Aó)-“i]D¹."‡p˦YaÉbǸ¦¸û!s!^ •ò§”ôá¼Ó”¨ £Jz”H²à!m‰"¥™d°)ùF¿¯²í8[ÎQ©#2ÜXvÄ¿6W\æÈòå(äDlõE‡A%Z@m}Ë\BTÀÞ&*¾æ¡yZ˜¢B:á¥î|ÆÂ]–ëÔ¨PãòSZf’üÞ¼‹My@¢ŒD4”"p†„aß™C¤óƒàÛ]›C:û­…ûj uÏ°²ÈÒFóº2ñb,D%b»$Y½Ì#í1¡–
-sÍqÉÁ *$—’ÚøçMº*a†ù”Bî!ÐrLÈ ûÁveG5“¹*5Ü75µ@‡Öîó£4?Üå¹ .øÔ–úzib šˆB¥ú`.(eMÛÅRK<–ÊÊ,ª$»½°&Uå {H C'5]G]кCS 0AL€ŸqD»IžN|&`úÎæe4ˆ6M±R1„r’®š(kãMÆWçÓ_Ì]m÷Âv}žÛq‚¸N©E]§Ô¯+³£‰>º·Ë4Ît
-‚°'Œ<Á³Ó‹W‡!ÜSùhÞssÂ}? á8OSvÔ0ý#kcìÑNúÿÆô %ÿ
-Æ(E\Äalz>; ±žÆGƒØž—Ãë»ù@ìÑNú_„cABÉ`VÛß(÷¾UÂ?U$¯)ü×ÁB ~ÒÄÞWQûШ›ïÊЙ”(Hæ#FaªAZ—F¡{ŸwÝ—V+Õsý/• gÀendstream
+xÚÝX[oÔF~ß_á‡>ìJx2÷KyJQ€ (YªJUÆv²^;];„¨ê½¶×¢ªBû°ž™3gÎùæ;›D~$Òafx¤ G¥ÛŽ.aíÙ‚™¸Š‡R¿¬GO™Š 2’Êh}1Ð¥ÖšDëìÝòÉóã×ë“7«˜
+¼dh ‰—gÇ/OüÌ9, ±ü­“xòêìéé³·oŽWŠ/ק¯ÎV±Â†Ãίï}õúd¿ï|õ~ýbq²î½zJ0³.üµx÷G8üb3ZD70ÀˆC£í‚ †g¬›)ç‹_{…ƒU·u9Á4šªè(@G0<s)ad”9èÖ›¢ñžý1-óG~P\„ÿªi“²Ì3?LëñÑSNFz12¼ÅNãQÞ¦G»*KQZW^~d‡fHjIƒx8ð¦¾.»Cʲ¾ñí&÷i½Ý&UöóÌñ1Ñൖž2Œj§÷§ ª¢¥d8Øš¸Š%ÆË]^ÖI6ci6ÅÊíkk0I 0©ªò´õƒn’P…0üˆ^Õ» `óàEØŸ\7yؽ U² OM¾û”ïÆÊw+¢—ÎV š&þ–¬Î/í®«É!e&¥õ€ˆ AFê<Û&馨â7¹?Îv+½¼®ª¢º «E»ñOµ½®~PiÝƺ ¼µù6¯ÚfîöÀjÖÊ8Üv·Õ^ÌßÎJ®¦Xm;[/´‡Ü
+S†Œ¼‘p`”Wéþ›ºiûñ?þïc~ÛŒä,Iþ„ÙNì±;$V)FºC|òkMÜó—oãªõÿ›¤#}2@ª°ä†pôÅõÝ\$jŒ(¥dÈðI†b„#© ú$‘ˆ(Lï“£(2Zëù ÷ã¡J—~FÆ1" QÚKY­‡¨uqìÝ@sJ’‚èq4¾éYi”£¸×6<Xh
+*^Ï%ÑqÙæ»*i‹O9Ü!ÊG îŸSÅLjy;mvëÂÔçÃ9² Ä(ãšÛ'3&*(ˆ¸¿i‡€ø<ÄúõUH3@ØÜ(Òi>¤Ä5!lÊ&—yB
+ªêpà¶ÎŠ‹Û™Ó4dZCÅ}`—Qí^4iûÒŽzÐz„¡ÐrLS !f‚¥Ûf2ºŠ¡Á€F¬¸¬’Y²ÙË¡³!Ü7ƒù®M
+‡7Y¾=;ýÝ?5a? h_{a>´¤«žV´«žv¹ö;Úäc·z•§…0õã$m‹ºjy¹¤ñ³YÞ¤»âƒoœ RW“ÓFeÓªÿPæh®(¯7ynjà€ŠºÕ¾8\7}9žÏˆXÊû8þhsÚL†®’aÞ»kÀдžÈþJ@ÎDHsŸzÂ\{,&åÛvu† `»Ó¿ƒ®ðØ혔´Þ©˜+(† ÚwÔ#)A„q
+a¨‘ÒÚ·Ôç§Ïž¿}=ŠbHYÊ×På÷™Ù«œ1sx“ÜᶙùÄÆ@3é³÷ÔÇ}"
+e-›ËÄAFàê2B—uöMíÄ”, Hšü€rÜæRðD’†VÐ6îß³~ ô^„¾Âa Íã²ã0¼P¿¼›Ä^%yPt~‰ÄC;ïMâ´Ì»„Ù×ÓŽ‚ùç¢ýËÌÕœeÐbpÃù×h&8Âá» °ìôl}7ÉŒdVΓl`åÁ±óôÿÂ1b(ŠHÀšF5þtuð ÞY‘2öµA!4gs_ºpÔ½o÷wµýçFè ™Ötž à ¼0DЕ‚.ÏÂî±û׉ ŒÿAáôendstream
endobj
-1045 0 obj <<
+1331 0 obj <<
/Type /Page
-/Contents 1046 0 R
-/Resources 1044 0 R
+/Contents 1332 0 R
+/Resources 1330 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1011 0 R
+/Parent 1328 0 R
>> endobj
-1047 0 obj <<
-/D [1045 0 R /XYZ 56.6929 794.5015 null]
+1333 0 obj <<
+/D [1331 0 R /XYZ 85.0394 794.5015 null]
>> endobj
126 0 obj <<
-/D [1045 0 R /XYZ 56.6929 424.8255 null]
+/D [1331 0 R /XYZ 85.0394 556.3324 null]
>> endobj
-1048 0 obj <<
-/D [1045 0 R /XYZ 56.6929 397.5211 null]
+1334 0 obj <<
+/D [1331 0 R /XYZ 85.0394 529.0279 null]
>> endobj
-1049 0 obj <<
-/D [1045 0 R /XYZ 56.6929 368.0037 null]
+1335 0 obj <<
+/D [1331 0 R /XYZ 85.0394 499.5106 null]
>> endobj
-1050 0 obj <<
-/D [1045 0 R /XYZ 56.6929 356.0485 null]
+1336 0 obj <<
+/D [1331 0 R /XYZ 85.0394 487.5554 null]
>> endobj
-1044 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F21 714 0 R >>
+1330 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1054 0 obj <<
-/Length 2369
+1339 0 obj <<
+/Length 69
/Filter /FlateDecode
>>
stream
-xÚ¥XKsã6¾ûWè¶TÕÁ‹
-D%턱 -¸îBYt.xj(´:þÆ©ò|"¥u# Lüá£èªW~ãž~ÁÂa¤kƦ=Ÿâò¤ñTtÞôÀ¢)sðjA/á]ÞÁmrèIújº}:£“Šûþ<‰Ž¼bÆî,µý–Îa„–½"–NÕH8 QÕCyjŽ“
-Wþóæ×ßù¦ýü|Ùʳtó>8Fh¹9Üh!Yž§:Œ´7·7ÿ‰Â2ÅŒOÖyÑ>¼<v,Yí‚t;¥9ÜL-,/»ßäˆ/¼YSRÓ›ý0Óqj´Ë4g),ð:þe»3"¹ƒÿ2y{©à©ˆ¦ ¦&ܽÒÍŸÁ¸ÎsE‹f´»ë¤7ðÝûƒÜ¼éáF›Ù¥ãÝœ³»”‘ дŒ[ d€5)÷¹:A–¹X?-·ÒV¦df“¯[àÞ;,(‹Îo€MÔ}=ca§° C£_ÒrœVN÷+Ò«QsP3
-ŸRéÄëÂ-|ÔøAWv8qùššéW5#ý¶}Q9Í
-¤B$·ø@÷OM÷°¦)y/—±Ðññ–
-­a­ ƒE9×ܪ``M¾6ãÿP}@’ ±ŒÐ.ˆ`•\?ô³â.ëîðÐ(yâ><¨b,ó)@+Ã6õáÕ5«þ ±Ÿg1»þ¦?¦,µS%ºêà‚e&ÕóÁ@D1f3¯kXJZ¾qÀÔ2B‹5xy-
-@ ¿Ž† ci:†/†a|n þy›Ö³ÐçÙ­Ý ÜìÔ|õ—9¨ßCðË0åº;E9­š‡[˜Ô€»ˆ%ÁÕë¿Žà“wëx- ½³’À±:AÕ¡†—2ô@eì‚Æ0öG>u! b jŸÉ°øœÒ‹].õ eŠí¼ª¦azцB­‰ý­4«)1™"—Û͆Ñ÷¹*š¤ÈhB+ÎL½MX<»‹ñwÁ¨--\—̆=3?†>¶jܹ㠕”$Šw:¸÷$ Ñ:@y¬»‹i<üä
->H±”ôu€;ŠON«@bî„×yæ­ƒ˜åà`~Ƥ`ë'š‹7Ià‹iŒ»ŽöyzÞñX‡4
-†}Ó(OënˆÝ"½ì'BMmMˆ©ìn-àaï8E¡s“x
+xÚ3T0
endobj
-1053 0 obj <<
+1338 0 obj <<
/Type /Page
-/Contents 1054 0 R
-/Resources 1052 0 R
+/Contents 1339 0 R
+/Resources 1337 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
-/Annots [ 1058 0 R 1059 0 R ]
+/Parent 1328 0 R
>> endobj
-1051 0 obj <<
+1340 0 obj <<
+/D [1338 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1337 0 obj <<
+/ProcSet [ /PDF ]
+>> endobj
+1344 0 obj <<
+/Length 2407
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YKÛ8¾÷¯ðme RÄ·¸{ÚÍ ™:Øtïa03Z’»…±%Ç’“éüú­b‘²d«Ó ÄY,Ö‹U_±Ù*‡lU¨,V®Œ•™Ê™Z•û›|õ
+ «©E¦
+nVé”Éîo^¿çlÅóLk®V÷Ûñ,mT¦ )V÷կɛGwêã:å*Oäú÷ûŸh›ÌLanËá›å’I¿áßÕW×–uE;ÞÞÞÑà}í†Ó±îGLfBj8h“å $C2cë”åyžÜvC³}
+[øÊfVsv‘I%éLŠ:¹ýtÿñý/4nzü5‰£Ï}]>º¶é÷ô9<º!¬ïvÝ·>¹Þ+‹ã¾>~­aa舸%‰‹º‰´;÷µ¾Úf’nK“xôC}ÁË¡b¨
+c™UŠ{U¾wmý äB%•\´¹J>¶4u\³"©ûC×ö5Í 7üu£eÏfb\g‚™AÞÁ:×æ”,ÓR˜@¶õ‡tûÈ×ÿDËà˜T\™¼Â‰-VÈ8üÖìv4*ëò¹°}¥÷nÀQ3­ÑzMô¢‘Rb5H0ó’Ò¹]h5¡×ñw\*OG2Z;ÐÄ™?|¸¶z6né<gÚfhÜø¸Ë“†£kû-Ù!‹®ä,c… ¨|ßatä&Ùw$}5í¶;îÝàeÀ ·éN 1ܨ@g.ÍKn69ÌÙ+béMoTu_›ÃY
+W6©BpÂ
+¢I[ÃäÚ91Àáh‰(ü3Ò§Ó ×6¹æ;sªœc®D*°Z̺rM yIˆ N(‚ϱEr¿þPé´1ò/¤P#sÈ”B‡®ìv¤™ÏKàÂþP—ÍoyΡBúÌ&´«z^šŸ>¿Cf­Î.Í2Fã™Ö Ê_n~ý=_U`ŸŸnòLØB­¾ÁGž¾Úß ­µJÆ™ÝÍÝÍGŽÂ
+‘éœéçyѾx…!íP¬Ò(]*8à1÷Ȩìve1¿Àª°6“¹¥;{;±±ÒÒ# –gJðèŠOëT³äþçÉ»KË
+SDôçÃÃ@x´»'¡w˜+ "1f¼ù¤È,Üì£ù™0Ž–ïé3€>5áwâ„K¤`Á.ä›&‘¿——0*«í* {ÿvÖœ¦º3±ž¶X“N'ÒqåZ±ÐïðÐï¼}W6%eüÿ*Ÿ/7?ã&mã&?ö%~ýìëá±C
+ƒ·¡Å/øx#}o›žž‹$ͳ"·± z_?ǘ«ŒÉoˆazèvM¹„0Ò(SØ@]î|›‹=Ój(íjØåQï5k€cy!£~ý€rP• Œâv^RöÐ÷]8ƒ
+×j ¤‡
+΄£Màõ¿|ŒÜHÖôA-08×I@t98ÔÌÁˆÏùMã혽B†·Ã³å `æp„²Þ"°q—o—^ÇãsÇM´^„ |UÀ1øXžÆÛŒØ<âr“ü–«üû¦GŒ—¼{÷Ö-m»ðhŽ|€Jä¹ùç_4’ÏŸï>~xEë·°•z…)AÃK,¹pÝ׶½ÿ¬&TdÍ9³à¤Õ‚w:|d…êäÛ£dZK&œÈªVŸ±*Œ£_KSÐ=5m8#<ÌÁ,–JÍ#D±”îI—€-`ñcóÝÓ|Ä—×Ç:—üK³›”Œ üs
+ý1àÖº@TÿyÀp.ª…aGØ…~æII¨L>óznvFš¥Â¦ˆBE D¨3SÏ>º^÷µµ^endstream
+endobj
+1343 0 obj <<
+/Type /Page
+/Contents 1344 0 R
+/Resources 1342 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1328 0 R
+/Annots [ 1348 0 R 1349 0 R 1357 0 R ]
+>> endobj
+1341 0 obj <<
/Type /XObject
/Subtype /Form
/FormType 1
/PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf)
/PTEX.PageNumber 1
-/PTEX.InfoDict 1069 0 R
+/PTEX.InfoDict 1358 0 R
/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
/BBox [0.00000000 0.00000000 27.00000000 27.00000000]
/Resources <<
/ProcSet [ /PDF ]
/ExtGState <<
-/R4 1070 0 R
+/R4 1359 0 R
>>>>
-/Length 1071 0 R
+/Length 1360 0 R
/Filter /FlateDecode
>>
stream
@@ -4193,12 +5045,12 @@ qª„Ñ«ò^ÿï>‹«>÷— .13×…Óƒ!¶3¢SËAÕ”ih¥Å¨Š^…(€<Îm䦽ªšÛÆlLÊâ³ò7Ù
n*Œ1½÷¨¾x¥Æˆpîâ‹&XîÃœ§³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãê
þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ
endobj
-1069 0 obj
+1358 0 obj
<<
/Producer (AFPL Ghostscript 6.50)
>>
endobj
-1070 0 obj
+1359 0 obj
<<
/Type /ExtGState
/Name /R4
@@ -4208,679 +5060,1180 @@ endobj
/SA true
>>
endobj
-1071 0 obj
+1360 0 obj
1049
endobj
-1058 0 obj <<
+1348 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [470.3398 477.3512 539.579 489.4108]
+/Rect [470.3398 467.2776 539.579 479.3373]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1059 0 obj <<
+1349 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [316.7164 465.396 385.3363 477.4557]
+/Rect [316.7164 455.3224 385.3363 467.3821]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1055 0 obj <<
-/D [1053 0 R /XYZ 85.0394 794.5015 null]
+1357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [304.6433 163.6578 373.3153 175.7175]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
+>> endobj
+1345 0 obj <<
+/D [1343 0 R /XYZ 85.0394 794.5015 null]
>> endobj
130 0 obj <<
-/D [1053 0 R /XYZ 85.0394 769.5949 null]
+/D [1343 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1056 0 obj <<
-/D [1053 0 R /XYZ 85.0394 580.0302 null]
+1346 0 obj <<
+/D [1343 0 R /XYZ 85.0394 576.3463 null]
>> endobj
134 0 obj <<
-/D [1053 0 R /XYZ 85.0394 580.0302 null]
+/D [1343 0 R /XYZ 85.0394 576.3463 null]
>> endobj
-1057 0 obj <<
-/D [1053 0 R /XYZ 85.0394 539.9341 null]
+1347 0 obj <<
+/D [1343 0 R /XYZ 85.0394 533.5444 null]
>> endobj
138 0 obj <<
-/D [1053 0 R /XYZ 85.0394 315.9171 null]
+/D [1343 0 R /XYZ 85.0394 299.6823 null]
>> endobj
-1066 0 obj <<
-/D [1053 0 R /XYZ 85.0394 282.0038 null]
->> endobj
-142 0 obj <<
-/D [1053 0 R /XYZ 85.0394 146.7217 null]
->> endobj
-1067 0 obj <<
-/D [1053 0 R /XYZ 85.0394 117.3479 null]
+1356 0 obj <<
+/D [1343 0 R /XYZ 85.0394 263.0631 null]
>> endobj
-1052 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F41 939 0 R >>
-/XObject << /Im2 1051 0 R >>
+1342 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F48 1228 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1076 0 obj <<
-/Length 3492
-/Filter /FlateDecode
->>
-stream
-xÚ¥Év¤Fò®¯ÐÍè½.H’„™“Ü’ÆígË=’fy^(n
-Ê@©ºúë'¶d©Böa^È%2222ö,ÿÒƒŸ©#7J‚äÒ$¡«=__fÛ ïòæþqá ÌÊ­¦Pß>]¼¿Sæ2q“(ˆ.ŸÖ\±ëűù”ÿâ„®r¯
-Öë›_ù¾ï\߸½á©›{Áqw{{=ýëáöñê·§ï/nŸ†CMî{
-OôÇÅ/¿y—9œÿû ÏUI¬/Ðñ\?I‚ËíE¨•«C¥ìHuñxñÏád––.2Ò÷Ü@EÁ'ƒ`‰“:q#(âäÓ¦€cEÆéŠöµh¹}(«Š[iÕ5Üj²,íʦN«ê(PmÙËbäë¯Aæûí¿Ì_œé-þ¬Ùzu_Ô}'¸×'Àû]žöEίMMÃ±Ó -¥]HSpÀˆ•ï»‰ÖêWÏ ª.3TŽX"x8ö[7=7rFSÛm‘—°).ñtÝ;`®H³Àët[fÜa"ßyó\dé¾dý&• ;Êá³lntUs¨MQs+]:M•¶W~ì¼ ‚ ±ü€¾#» ³&àâ=ðƒbì2ë®/Ò(T(Ìb/mŽ//ªôhñ=í&ü¥K€¯¯ù»-ë}_t„UÀÀ©Êú…çÒ</{šù¹X‹™ìŽ©`´ðM?]ÆÙUiVéʹٷ‚4¶„›ðØÙÑ™›¬è˜àr›Ö] ,`
-4•Îæþ^h¦ƒ+ 5»à´Îú‰kŒŠ„ÏŸÊMÐÒ0Ðß[¾röuβë; ,/ë´=²ˆe% eûmקuF7‡Ò§´ò+ J‚Ah™?Û敤b"²¾p•ƒ¯c¢gVçe<&§5ɨ§Åpè7hO0´]ºfm„vùRóIŠÜD)v/Ñ´æ?LN Aƒàæ †X¬µNÝŠ²D¤åpå­ô®Ûìû¼9ÂF&³6í6$]@NÏsV’"Á "{ä‘íüÞì[”ê°ò
-x ®Îšv×´i_ØžŠÉ‚=
-‚‰Á€aòOzjþ¶ãqgv)0 rº©E`| ËŽylÃú §Î†áNdñäØJ|Œ¾ìSàN_0:…r´ #è`SbHY5ζ¡kN¬¼fl ¡?ñlà‡ †ð熇ûMÃ"š¦f§iœ³ GéGLƒWáùlõ”'Õ€0¶{Ùháˆ1·b<JРiÐæëäbr‹ÓegUÉꎀ³bN ìL{ƒ©£<µÜ]ùÖt·u.»u}³[0âaà*å%ÖÒ³m¸^˜¹¨~ijÄÆ96{nlÒW$/
-#[ö ñô¡c§S†¹!-®÷$¾¨,醴 kÖÍèÝvðºù~‡xˆ±Õ´Ÿÿ¶?ÖÎMÙ¥ÏÕâ=”
-•sÜAÂp«:Ä fçáz–Àº§
-ÙX-¨×56ð„Ž¾U*tvE‹ÀvCq–Ãë=…**´F¦&¦ÆÑH^‹‘”‰ Å—ˆKDÄè@0,VÖ‚“Œ NíHÎÝ¥
-c×x¡0Ê/œ=­Öm³]å€:@T û‚CHP´ ËNÔ*ŒÜ0ð‚9OºbÈ%‰g±+D:LÇÅÝ|ã&`Cçñ*äòq¨ƒEÆÊ–Õa¬­u2ƺV`nfYÔF†•Ð
-¡û¾ØîzîPhˆE8Ò€ÅÆ¡7Ù¡ìy¶”~ñeW•Y‰…1êç–æ ±î‰$Ç·ÍÛyÇL—°és³ï¹ÉøXÌÄڼ㙮(¸Á²€°E—µånÄCN *°õ^œØ›i±Â×õ+’”ó+ÒÚÕ:±W”U’_þå.ÚÀåy6º”*Ê9zå¹¾¯­´v=Ø 9c"p> /Q˜œÆF¡ÄFp'ýXeÿ“p'f·Uô"K`%0]Ãï¨#tq˜×âðkY¨Âr%‡Çºò¹„=‡,G _”]¨Alt;ª()Úà,XÁ‰­²–
-ƒŠâKå;ÃŒ±5‘¦âȈ–Êwß±M\0^G‘’Ú¹PÂ]å°ý ¹VüþN%NEèÀ&3–±
-ý0#ä#›|7ótR °©ùŸ–y~"oÖ%·D™ÒÏsìl`¢³R†£D¡¨»ü„@Gð][*Œ’0Ùˆƒ0Šh0BÈ…|%±B„mž¼êÄÆÀÌPL[zí€õXšq)ÉOUò vËš›,ߟpIJ»ŠŒžÞ8Ζ²²k¶2’ÏF±àFÌ°¡rp¿¡ø7“/•¬š93Å
-Þ@"ìmOì.… GE‹´¨d¤Oâ)¨ŠôsÇM2Æ Äß-•I±#@è×_Ë”;„$²ÃÒ PU´ ‰âKŠ¥ly7„VyDN%5luéëëñ­ûç•fŸ³\N¨
- ¹VEè´­@c~Bž92|Mµ?ã*5á?Ìo ˆ`ðV•q¾k¨­6@ŽK2Ù£‚€•Àª4ÏÅZu§Ñ ƒG¬&¶{“¬/´%9¶òȽA©c«¥°
-5\$û¡è¿¡,
-Ÿ»@Eº:«µÚ[(ü*WùÆöâjÜŒý):í­ôˆÏg’7©=› ΰ3yYD ®äÒzbµ‰W’ä%dÿ¸
-›è$ŒNÓžá2Í ›Ü‘§r3<±ŠÊàˆS6±Ÿæ%6ÃŽøã'©Amu›l©Á߉S1˜?m1ˆOÛò«ÝL²xÚ›æ´ýé(íâ_kªZÞ ›ÿ÷?xÆÿ9…ÆUq,—Ç»a H„(丞QnÿêsNúÿ
+1365 0 obj <<
+/Length 3579
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZIw㸾ûWèú½‡.ÉÉÓmg:/ñLlgy³ ’²8M‘.V{~}ªP”ÙÓ‡<ˆµ
+6ÏÐ÷׫Çlí ­;êÛ§«oîd²Éü,ñæiïÐJý MÃÍSñ“ùÒ¿
+÷ñþýÃí?n“È»ùûõV¨Àûñûû[*==ÜÜ?ÞÝ><Rõç@ÿ{÷
+ì´ †wÐn Ð—ÝKÙQù|(›‹n\¼ëª®C/§úÄœ¡?®BñTë!²”¥0“Kíþb™ ¼`ÍpÚÅɾömw4lj2:¨>ʦ IA3‘†Bùy(›¾jÒ(t4$MSIŒªŠdý_›zED ÊIdÔdZ
+ÞÔ¡k.7-÷î˜hYT¤dP>êf4ûF˜ò'&~&EjvM›Œ“Yý |®Œ‘BI×}K¥6Ï5ÊUGuÕÀ“1"*Æã ¿„œØ3Xúy{<Õå0ÕЇ¡gÚû‹Á¤ÏUXNqJB‡–ÊN4]+š9p$•5àLxöK<ƒBA¤±ëª\Á¢ætYèéý`Ø}¥Î<~¨Ð&ß°ÜÏõØ3±á y3
+îlgÛR¡¯Û3"s‡’^ƒ’š`í ˆIo¡dÎß™]PÙ“®ÿ6'É›=~lú¡ÔìXȈ™-R…¶¤W”µ~µôŒe›Eèk„
+ÒÝÐ#XXDË+Ó”Ç~ÐMn$‡Ú§´úË ÊĤ´ÄŸ#`\±TÙ¹ƒÆAâpìÌÚ<¯@ø…íº!$¤§pè…ZX ëõž¬ò¹±ÎüÆ3ç?´¡ †Šx†3h"µV|8uÇÆ+‘w\£qýaŠöÌ[îÌ;ÝŒvÁv곚3mPÙWêaq ¨Là/8ÐÁÝ5àŸNmGÜ4PE*+vcc"ôÌŸÙ” Âðƒ¥¶ýD%cL<‰‘ÍŒä¶Z÷<e&Žò\õïçÈÍ]ŒÙ;Ö\' jÖÇ6pgj¬R`¢Ö5ÎKëÝ—¯á„uuI³_­­·»p£}u¬:Må¬W`â8A%§0JÊ…ÛS;è3»a¯Ða“Tl?Ð:;eÁ¡’ôìÏ]ç¡L4Æ“cKëç…÷<jàÎP9‰z´¢#è`µaHf#Þ,ñŽ­sfõ5'€Ì܆͡9ô€?O¨y8´„n  •¶!§™xoœµ?sÂêb.âùböÙOƦ
+ˆG—2È,Ò6ü  ]ØÞG<Kšx¯íH…ƒ~Áí¥ìA¡åH4uåÛ­iôÌ…t
+±Ìd'b|çJæìÛÙ»ÃØÉëã¤é=b©í>ý°?UÞ‡ª×»zΦ
+j=§’úq’IÇ¥kn5 . '·JíË4¶°AmÞò\y0SS•:5×R*ô5ãOÀ!O ´ .–d¬‡Ò, üÔïÖ ¡¢ ¥hÆcD<Ž#Ô”-r–QjÎð
+´Úl8 <ëfXžŒ (Ñq–zxûȦÐOžüö^þ‡9žï Ä'“’G³¡ÄÝ?õ‘³ŽÞj¶š %&êÀ*½ñâ Wð]Gjä]$’cä„D"é€ FoŸH¬a™ú™®¼Àè™2i+ê‚ó1/=Ó’ Ü|ꊞW°Òâ“I¿| À)%í6N”+qì­xfß¹¥(wF$Œà ÃpbrÁÃÁÄ'¸M¾
+Gg\ªà 8"À`xbílgC‹›d¬.â)h¨Ký©§¢cDߣɑb ÃЯ¿Tš*%„$¼Âî`ªˆ ™qÄgylþ;
endobj
-1075 0 obj <<
+1364 0 obj <<
/Type /Page
-/Contents 1076 0 R
-/Resources 1074 0 R
+/Contents 1365 0 R
+/Resources 1363 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
-/Annots [ 1079 0 R 1080 0 R ]
+/Parent 1328 0 R
+/Annots [ 1369 0 R 1370 0 R ]
>> endobj
-1079 0 obj <<
+1369 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [464.1993 469.2511 511.2325 481.3107]
+/Rect [464.1993 393.2115 511.2325 405.2711]
/Subtype /Link
/A << /S /GoTo /D (proposed_standards) >>
>> endobj
-1080 0 obj <<
+1370 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 458.3121 105.4 469.3555]
+/Rect [55.6967 382.2725 105.4 393.3159]
/Subtype /Link
/A << /S /GoTo /D (proposed_standards) >>
>> endobj
-1077 0 obj <<
-/D [1075 0 R /XYZ 56.6929 794.5015 null]
+1366 0 obj <<
+/D [1364 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-146 0 obj <<
-/D [1075 0 R /XYZ 56.6929 535.4755 null]
+142 0 obj <<
+/D [1364 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1078 0 obj <<
-/D [1075 0 R /XYZ 56.6929 501.7295 null]
+1367 0 obj <<
+/D [1364 0 R /XYZ 56.6929 749.4437 null]
>> endobj
-150 0 obj <<
-/D [1075 0 R /XYZ 56.6929 345.0948 null]
+146 0 obj <<
+/D [1364 0 R /XYZ 56.6929 458.7525 null]
>> endobj
-1081 0 obj <<
-/D [1075 0 R /XYZ 56.6929 309.1395 null]
+1368 0 obj <<
+/D [1364 0 R /XYZ 56.6929 425.4132 null]
>> endobj
-154 0 obj <<
-/D [1075 0 R /XYZ 56.6929 120.0167 null]
+150 0 obj <<
+/D [1364 0 R /XYZ 56.6929 270.5184 null]
>> endobj
-1082 0 obj <<
-/D [1075 0 R /XYZ 56.6929 92.4013 null]
+1371 0 obj <<
+/D [1364 0 R /XYZ 56.6929 234.9696 null]
>> endobj
-1074 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F55 1037 0 R /F48 953 0 R /F39 899 0 R >>
+1363 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F48 1228 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1086 0 obj <<
-/Length 3046
+1375 0 obj <<
+/Length 3172
/Filter /FlateDecode
>>
stream
-xÚå]“Û¶ñý~…Þ¢ËD>LžÜøÒ8»I|m3M2SJ¢-Ö:Ry'_;ýïÝÅ HQÒ]3}êxÎÅb±ß»”˜qø'fF3®òd–å Ó\èÙêîŠÏÞÃÚ¯„ƒYx E õ‡Û«Ï¿VÙ,gy*ÓÙí»—aÜ1»]ÿ<ÿê›ßßÞüx½šÏv½Ð)Ÿ¿xù—k!ÄüÅ›¯n^ÒÒË7oiðõÍ‹ë,™ßþùǘ&Ñöùo¿ÿîÕm¿ã×Ûo¯nn¥ñmWHæoW?ÿÊgk¸Ô·Wœ©ÜèÙ^8y.gwW‰VL'Jù™íÕÛ«ÂhÕnâŽV†i#³ öH9ųTIeÙÓìé2¿H™4÷][­KÒd[®ºª©é¥yGÏ‚uÙšý‡Ïè­ÛªÖ=Õ¶XnKÐx@7±»_n«C‚óˆN>[ˆŒåY"-…7‹»Ý¶„ƒTbæ¯j¿gp·T°4K4ìÅ-‡¢î€ %óyE3¯ê®Ü×Å–¦WÛª 0H>—%ÕñÊþZ˜yÙ6ÛR~Œ±mš¶«‹»Òá+êu¼¡W›¢~ïÞcð
-³…§z!˵¦ûªn€i6ß•ÍÎRc”>-ÿì Ô2MåüÖO¯š»]Q?ÒK±myŽÀ°
-ƒž#ð]qï
-Fâ²Vp4 b]‚E(î„Ópgàé¶j7n~Sµ¨ŒR;aÀ\ÏuØp¨BœnËŽ¦îwnïÁ!…•–¦pœAýñ»ö(lbòùŸêr„Ìá‡ÑÒ-5îHϤŸL`¼dùü®yUÓ1Nˆ5½úžVÚ]±*a W«æ¸¶60Ú;X¤‰ZœZz¨šV–Eë¼ L¢ ![¥eÝT«;#h†!µ³ÍÇGë¥&.klU8'ÖÛC‡´lÐܬ·&µCmª<ª¡·«ê‘²½|ý·‘j1d–z`kðæ$Œ/Æ‹¦—xÕÔ¿p.ßßÓå×4kõžïšýز&…ßÿÛ}¹¯J«œ&A§SîºÁJ@@ô¿÷ `ÊL¥©w¡mÕ•‚²=®Q,5©tàŸM`\$Z0®10‘€DÀ,按L¨¥%E –8Rpð´Âäç"ÉH‘KÃ@Ùb>È'a!Gq%2%IÀY¡ã,jP´šöŽE21z¨Ö I-€Š<öløÐâ éŽÈgãÈz¯²+=xç`QÇ (Ä]A¦ˆÓúËaÒßÃõc¬˜¯(9ÉkÇ ÈZt³!7Nœ–áöìq¹)Î3‘ÂÏ´Ò$L©sž¡âîªR$,•`%CrË9š>OçÎùu–Ñ„sø#bRHWÓ4{ò5S–©;MßOÀPè'_ÏbôÜX7ñÔ3¹™iìá͇¿4rŽðrwߺ«.KÇ%1£¹:•c—)]þ…ÏuÕ‚“lôF  ‚W °ÊÒ‡†f·áôòŽxçp`°ÇAŸJ—Ú(¦Üoµ½_Wõ{‡ßÆ
-8 {~ÙÐ1J5çŽÍ†C¤´I«”øbxvI8_<•Eq ÑGšÊÚóGÈm\¶é<•8‡DâÚW#N(/¸_a‚3µÊ;¡aJ²4É%M3.žåÈÁrà
-n‹ÍU1 ãPnlac$ðç~»¦ˆKµƒiï)ó¢í/k—ù4Eü]¹´ÓítÎw†…'Ð¥GzNl&E
-†‚/˜ÊM¹•’{K<8ãYi~‰¯BçÞ;ëvpCª<<æÖB—@ñ¶"²£¾R’JØK½þÉeœŠOpìôÍ…Ö,ƒÒÙ_…Ý}t~6‘à}µN†Zyþ)$I".ñÒ+à¼ÀlÍÒ$(1^“yÙ+8Nš¡G°uŠ•Z¯+4f´`ÌÐWÔS„qÅôlJ1n¤<{GÉOŸkRrelRtvC†„¤»
-gwåª"gÇ篢É#¹ã¤Íî)$@­•Q㡶u©U5psëUÈšÑ=£ÚüýÓO¼r%SÊ•Ìw „)òá°‡bDâ}yùrXu¾¢•öîÀÃT—åÚÆ%ÜV®Š{e
-KùzIÅ1"F²ølTnyb|Âkë8·æ©öiÀTï©›¦ÊÓà ÏAŸ)ÝhPxQuèªÅzxΰõp:ÄãÈüÄ·ÌgQ“m·‘"k2|yöÅ„ñâñ9ËD–Úã?µ43̱U)X–¨„Í›ëEÊ 3>§§×ÔAÞ?Õ[x¤ƒë¾ASJ»ºœFå#°³´s³$^ÙŒÅ̦ؾssî šnC.½UuÀè'BÚo}ý®tÚõi¼¸Î]Vd7–ë)´ùÏçj{+ž“ý„Æ7½ýऻSXÎùoH‰IÉÑc[gØÂÔ t †¸¨¥ƒ#W"ìÊýöZÌm—ÛfÞIß­·ú|‰ç§:HGÓŽÍÏòiØXq
-<‘šGPÖÁž0ÓQ ÏVÔ–ö‰Y娮w4OZÞ!ó7Êa07fTÜÔÅEßÇR®…®¶=DŽWé’½!Æ>w—¹oŸÁt_†¸üÏÎFaÁ³˜’Œ§pÒFËó}Y¬>„öé ¾NÝÔ—¼h{²½*!DÚŒ¯tQ¡]9&R§ÖvÔÐÓu*a´»¶Y@•°˜£rÍ–RÅlØÐÛ·(ˆ)B{ Ð[6á†c PÚŠçqâ3$L™PÛ÷Dþ“3“*ŸïDTüRFÊ1ßḴhŸ¤ðN5]êa-*Û4oGfYbÛï»òªñPþ¸-~øypÈ›-ë2† M˜î®»¬Õůnà¶U˜¢õù
-½ór>æ¿Ðƒ
-Ögµýg"Äpâ3Ô~ødÔÇÝ¡ŸéÕgèà(=êÛúâÔ‡@Ë2ìÙÏš1”ýnEAT&ÀШU "Š¹vž&ÙùSÔñ±£ÌÆI:<ö;ÈéÒ”6rŸpò¿õÈ'J¥™N¹º\æ«Ìè'”]É3k¸]:,óOHPæ’%ôY ÆP§% .Jð쩽Ž”ààØÿ¥/ô!ñ4Ϩ ŸÒf”ù°ÍxZT¢2M.2‚:#HuYçN9>vZñ±Oä‘¿~eyZv§y¥SfÐQžçUu†Wê2¯Îñj|ì4¯âcoú¶Ò¨|ôÿúÏ€Ãh@Yšæq>†Ê~š÷{ Œ§é0íù¦Ï’OòÿTÞö¤Ð"%‡c!$ž—QuFF게ÎÉh|ì´ŒâcÿC —,—yvA‚Ô z¨Ë<wj$Áñ±ÓŒ½le Ѧ.Ÿ$E-dxÙ“¤˜>;ªü—R„œ NÌyžOwrð‡ µü²„ú9Yõsà%XѸ¯®8Oi}曋6
-o!ô˜òðÃÎcÒÿ’
+xÚå]sãÆíÝ¿Bo¡3'v¿¹LŸ®9§¹Lr¹äÜ6Ó$3¥%Þ™=™TDÚ:ç×Xì’KŠ’ìfúÔуö°
+ú[5w—<Ùµ_®‹»rMeaäøÎr ¨£çìÅå„‘¼®Wé N¯÷üÂ4# X€d*yЖ„6E®fðé4ÓR ø8ñ|[„Õå®ØÐdÕì¶Í®èJj«®ô`ÝmÑ…'JZ+j$b":Wz±ì´ªº+w5b™Nê²Û7»4ÙWÝ-v—Ü&e[î@‚nåµ{¬D­e&yë
+–³/êÕ+ò¤¢´†Ë«MUö0Èþß”JLÇ;^›ÍæÁƒ
+ÀíÛ¦íð®x|N]Ã㽺-êéÈ…ì+p=RÙ4Y²-wáqŒJÀ'>·@ºÏgŒH®Ã2\aRlÚ†FA"0¬úÁ ˜EGÜy€Î?ì/"\­ÊÖíÚ~wUªçl+PX6õæ‘´Ž†ÙNM¦ âÞ®šnÖ€zàÍÆÛ#I`lœ½yE·t0Ö´çr°¯×(YÎð"
+ ¶z[­n=Þ0,y¨-¹ÍOÎGÍÖ!šÚתð.¬+6Çîè¦q}©SP}]UOl üëœeÑ¥Ô£›3¯`œØ MX¾ñÀ«¦þ…1ñážÎ¾¦UgŽðÿ¾ÙíI*kBP„ç»/wUélÓ*t9å¶íôæ¯ÉRiLp yÚ³}èo­„„ÂþbãRiž2™O¬Ä,þæ,å—#NO§
+œŸå6ïq.UFö{ˆ\Øl-–ƒxö rT—†LD¯è•Ž«h@Ñ® üŠH%ä€Aj<XR  <ýÎz´8![Âyl9çUve
+ °®‚ê¯÷ȃrP1¡N^~8¢¸ƒP‰Áp_„5WÔÈdÓ4éP°ˆ•©ÃáÂ# :}]nª‡€Ãómwp^O4.´Å n’\jPG èújIŒÕ1"&ºx1)¶3!ßuUœß \‡,`®ï4¨MSÝé „²sT/Þ–~4ª»¨6ôµb=¦3î;ð_{.? Ý2¦Œ»¼“ŽÛÄŽ5Ýü‹ì‹™»‹M`ÁÂ’ÿܱ¾0ÇN8O3%5ù™7—KÃ3þsFÿÁPGYÿ\'nŽÜ×´/)uh·ºQùH#ì*mý*iG.aq÷å¶Ø¼÷kþ ÝE\šUu1,ôY“ÔQñ.µ€†¬&¾m€CŸ¹ËõÜ téË“µ;Ëéúô]#f‡ëƒ‹þLýv>Ê~û4p©¬!?=q7
+3ƒ¾ý4ÆEýùa[î6—<yt/Q\Þ­†VÕ´ÍÚG,?Ö>:¸/íôö99»*Þ€góÊù×#·tÒ¾sõu¤CÞC—rò¤?Þ=ò<¹x¤½ú¼ßJÁŽ¼˜•qC7CKú&zÚvùÜy¤ÿ>×cRw‘‡Þ,EˆOÿÜj<3Ë9Íg]aä°‚ÜoŠÕǾuzDîÑÛ¤HÐM}Ή¶ÇZ«AdÌ8¥srík1n¼U»QCÿ¾K £í¥Ë2(ƒy‚¶Ý¶2–2Àöm}‡‚dÂu0н“>ph =”vÚyœyAéF*m_»îöLö“§ÖÈ’èxTùR>Ê0ÛSöP³O²wo?)5€}âá.Õ)®_ÞNne‰=<ï*XÆCUr|åóà!Q6`×ç 3†pª±î£¾‡ îÚ™KÑ~Bt¥v1º„Á…5ϼ~ÔY
+åk~ðú1yAä! Qwìeë»7ÊùÅ/µ¾8ö–Y
+CEÕ0´2ÂE¥ϦD1ÑÎÊNSí¡ÉNÒv+3&û-¤thÊYÈ6ÙÈ[NÚã3õˆÔ©6Lž¯ñefõj.õÌ‚NgÆ5þ1 J“f"³g4AÐ`€:¯ÁST# NÉÎk0&û¿Ôà™~ ÏŒ}Fùü”# ÌÇ-Æ㊧Q÷œ"#¨Š PçyŠj¤È)ÙyEÆdŸ®Èw>B8*+µ<øIYÅPÇeÕC•ÕIªƒ¬ÈÎÊjDöjè)MjÇðÞox8Ž”£igc¡ÜKùдΘ1ãóë!G>*ÿcYÛ“B 7?¿1gtAÐQ€:¯£ST#MÉÎë(&ûÿZ¸Â¯¡Ä™êb¨ Pç5xŠj¤Á)Ùy ÆdÏß2Ð(}’t^‹Z¤áeOÒ¢yvTù/µ¸XJ ˜³<Ÿ\ö²ÿD!SÔïË”ÿNKEݘôµ4þ+®SVŸ…Îb¦ü—|n¸÷Kÿv¯Âp´.ÛÕ®º¡¯3€ÔMó€_A=’¼iº2 *º0
+L…ÿ1NÌÑlyÙó¨G¯‰ÿ<©EFoc§wòæPdNŠ-Z|lîwçAQÙQ†Î_[–S“V «¤]púÒô1'mî>,hðcdÜ=ü2~àиñ¢ ÞÅ_ÁÉ”pã>3sp¿Ð9¦¸¢WÄÒ²Tkk¦oâð4©ßÇ‚?QÀqâw¬3|³þÕ?ü¹ìàØÔoÖŠy HfR+ò,0…g<tjýwµ‡¬ÿíp~endstream
endobj
-1085 0 obj <<
+1374 0 obj <<
/Type /Page
-/Contents 1086 0 R
-/Resources 1084 0 R
+/Contents 1375 0 R
+/Resources 1373 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
-/Annots [ 1088 0 R ]
+/Parent 1328 0 R
+/Annots [ 1378 0 R ]
>> endobj
-1088 0 obj <<
+1378 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [417.8476 169.1947 466.5943 181.2543]
+/Rect [417.8476 110.3446 466.5943 122.4042]
/Subtype /Link
/A << /S /GoTo /D (sample_configuration) >>
>> endobj
-1087 0 obj <<
-/D [1085 0 R /XYZ 85.0394 794.5015 null]
+1376 0 obj <<
+/D [1374 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1084 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F14 740 0 R >>
+154 0 obj <<
+/D [1374 0 R /XYZ 85.0394 769.5949 null]
+>> endobj
+1377 0 obj <<
+/D [1374 0 R /XYZ 85.0394 749.3028 null]
+>> endobj
+1373 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1091 0 obj <<
-/Length 826
+1381 0 obj <<
+/Length 735
/Filter /FlateDecode
>>
stream
-xÚÕW[OÛ0~ϯˆxjâø–Ûxê lCb4Û ð¥*¥I‰ÃmÓþûì¸IêJ'¤©Rë8Çß9þÎwÜcdCñA¶ç?‘Dxyv:· }-Þ}²ÐÒÆiŒÝêcl¹G$°#ùØ·ã+ +0 ‘OÏP0p09ýú%:؃ƒÃ“ÉÐA!õÂÁÁçÑi<>SóéèðÇ!4Œµ%rp4 :ˆ¿Ÿ'ÃËøØÇm¤ún$2Ì[ëüÚS±©c …žý  @Q„í¹E=<JH3“Yë[ ¨½­—ÙA`âc=iô„øP@^|‚IM
+xÚÅWMs›0½ó+˜œà Y€a|r§m¦“IcÚKšÅrÊ Gïɯ@ ܤNÓÉL‚–§ÝÕ{om›Hü`Óõ ÀtvÍ83y!Þ}4ð´QBctHÇf
+:=øncŒ­éñþì µ¥z8œMí±c…ßNgsû<<2faÓiû4ѪÍKãì™ q¨#Aø®y#â ff8.…®C©Š¤ÆÜøÚ$l½­·jÙÁê =ÖÑãУ„ÖôDqj!+Y•Œ¯¢´Ëù Ŀш8“M0¨‚>Äíàã¤"Ct…FN7=»Õ¥ÿe’¯@².ÀE~1ÎÒÉnóuorTU ` ×%5B¨¶Ë0Ö‡%z™ó›ˆ/dÖ|•ÞMt¨ÑH:è2ïO®
+Ư/t-lvWo{‡ Ý‚Zr*4ÐÂ'ºzªë"ÊÖ)“ÏQšæ7 äѪX2.c?‹V¹¢€‰%Ö‘ ÛºÑr%¶õÄÓÈYQò$.åêòŠñ»M_qÌ
+-k²l úðÌ´“g.û‹F8‹¯x!>÷d[z!¼§Â@ëcýè4Í„Y” ÷B ]­:^#öŠ¤d²Û:Œól¯mGµ©s€ònÝ©¥¥v™¨†ö²Q¿ÈV9¹2ÏÔ$‰ <*“kÖ(–§We£@åÚ§meg@ûšÀ-Vy[ãm™ž­úÏZ-Š4RÜõ]u® /uy抺ԟLQŒú5´ã"=6ôeD·Òü_Æo¤ð¶Áï °Êù^7½M…É»ÍÒî³óêÑéÍÀKˆÅ» À¯d÷ÿ MÞMÝ5šº°ºûj.½¨cç+öÓÎRß'Íí™Ö홌}èø"ɦ©ªsì÷:Wwñ~ë¿ÈUendstream
endobj
-1090 0 obj <<
+1380 0 obj <<
/Type /Page
-/Contents 1091 0 R
-/Resources 1089 0 R
+/Contents 1381 0 R
+/Resources 1379 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
+/Parent 1383 0 R
>> endobj
-1092 0 obj <<
-/D [1090 0 R /XYZ 56.6929 794.5015 null]
+1382 0 obj <<
+/D [1380 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1089 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1379 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1095 0 obj <<
-/Length 1945
+1386 0 obj <<
+/Length 1364
/Filter /FlateDecode
>>
stream
-xÚ­ksÛ6ò»~…&Ÿ¤™&
-žÉI}hõPíØ—û—èËЉ˜ù<¦’Ø2È>«~U´4‡ªnôWû.K5aÛÊžê¶ÍÊ=mº#­›5<…˜*±Q
-u1<3ME¨­¦µkô®Ëé”ÂÈô},K,Å1U­ÆH¸ruM8Šû‰6CPÇ,Ôœâ>\xåPuyj•«Ê–RÞªñôÄg*?Œlå‡ñ™=bIQ:@²DC*x¢Ôµ„¾{ç؈á+ÈœL´Àì±kÙt¦À±¡$Ô7¸"ˆ!½I 0 >Ûj_«ãT™7¢u!'îËýºtJ˜í‰VŠBFHª­yÝQ×YeÒݨuúfô|sÉd„ô<5ÖI_>-žÏ"Ï(Z­À¨bhK{ªÚC¦˜8°ãHX¶Îo3’¹ÏB)zÉX–3cˆËÏØœfØ80zÀGSt1xc?šaž•¶ËVÇÖV&n옒•gŒõO=mÃí¬£aa‚»¾Õñœ¥ Ü0°4ì<ôú‚Üq´B†ÌRö“ãv6x£K]›LGuîªÖÖ¼‡ö¿ëMºQ‰mçïTVO-¹…«ybÊ€˜DÜ3²¡æ¥ô fÕùĽ¶Ö–ô)I¿·êY2S³°bÃA²K6[Ý>j]’2ÇF)Ý>è8òm…Çb7¾Ìž)'ü¢#1ÇÒ'Œâ!:Ž@Ã+IMUo3xd°çáãk
+xÚ¥WÝÓ8ï_ñÔJ$µóÛ§…]¸åqл@È›8mtiRâd—ºÿýf<N7-î‡*Õ“ñx>~3öØÜaðãNy,ÈB'ÉB/b<ròíŒ9k˜{9ãFÆ…Ü©Ô³Õlù"HœÌËb?vVåDWê±4åΪx?þûå›ÕõÛ…ëGlz 7ŠÙüòê¯ç|~ùúùõM]½~GÄ‹ëËEÎW¾½F÷3\™•«w7/W¯f׫ƒÓ8 йϳ÷™S@(¯fÌ ²4rîáƒy<Ë|g; £À‹Â 9õìÝìƒÂɬ^jÃ$
+R/JýÄŠïÛ@‰2/ü@ƒrý¥—]#jŠø‹Ø­P}Õ6ÄØ´ª&?AFÉîNvDçmó1ý‚±|ò‰Iæ¸ï± ü@c";1cóª!«Š>¿ÒÀßã±ÿl釆™!3õø”ùïCõ~àeˆô‘zùŦÞæV;å®[w#;yF]¨Õµ;?è@ ν,Š|Ç%‚êÊó¼qù8ÿ{¹$…Jlwµ$ZÔu{ïöhT‰°"SÑ´D·ÔI8RGÆmKM¼ ,û&@›+…,ÅP÷ôñyÝÞ¸•çR)ÛJ²:5&E³?c‘Yì¤ê»*7&s‘oäO˜t' ¾žÔÅIü
+¼¼Ý>y¤üÉÑ~¿3«·°Ádg ²¬Fžl—d¤l[màâ'ËúQv­ÎÚŽ
+غ–›ÅØ‹cQRtù†p9³e±•cg<îgþω¶’8/À¸ÃC/cߤú|4ºƒ…Ë{¸·XRÖxB[bµ© úü8ž£ AmÚ®G2š¯‡ªÄí[3+û¾jÖô1ìh\-àâ„õ'r“`‚è‡nÁÓ¹4&0+èžÉ$˜€Äɘ8Õ ð®ú½qÓpŸÝ¼¾òˆ¼ém°Rå]u‹6ÍóhÖㆡG,=k.7C'È02‘SaVÞ˺>álDo1!(bú *˜ˆ‚¸%Ö6EU"·-N7F_)€{j+•ªÉë¡ <L·ÁN/ju‹¥Rš;iýÚ#´ñ·Ü›E¢)ˆÔyqU­Ó ¼ûªßEIOb¸ùÂíG>H$¸ZmEWÕ{úTÃnu‡Š’˜JXó5TZ`¼‘&”ECނωC.·Û¡©rI(‘ Æ2Obƒ™vTPGÐÊƃ^O•úp±ê«r¯Ÿ O­'®(e&½úª€=Yæ΄$lg% .À•ñù[}
+ÑKL æ—Ä£´ïéãÓ©
+ñ¦lÌ.Ù´C]çÚ¦§‚7nœ¿\ê}Ÿ¤fß'Ùƒzä’£4>U¹„J9$iè‰}óÆ5 ÃÆž9ò'+eÆF z{ãq’W°»Š8ƒê&' €n¿ëÛu'vre‚íÙD¾-Dv¸ºüò“ôá &^¦¾ýµ°ØKý,B˜yvêùáíú­ëÿ¨6Eendstream
endobj
-1094 0 obj <<
+1385 0 obj <<
/Type /Page
-/Contents 1095 0 R
-/Resources 1093 0 R
+/Contents 1386 0 R
+/Resources 1384 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
+/Parent 1383 0 R
>> endobj
-1096 0 obj <<
-/D [1094 0 R /XYZ 85.0394 794.5015 null]
+1387 0 obj <<
+/D [1385 0 R /XYZ 85.0394 794.5015 null]
>> endobj
158 0 obj <<
-/D [1094 0 R /XYZ 85.0394 418.0047 null]
+/D [1385 0 R /XYZ 85.0394 223.4026 null]
>> endobj
-1097 0 obj <<
-/D [1094 0 R /XYZ 85.0394 382.2497 null]
->> endobj
-162 0 obj <<
-/D [1094 0 R /XYZ 85.0394 223.9723 null]
->> endobj
-1098 0 obj <<
-/D [1094 0 R /XYZ 85.0394 195.8278 null]
->> endobj
-166 0 obj <<
-/D [1094 0 R /XYZ 85.0394 149.2124 null]
->> endobj
-1099 0 obj <<
-/D [1094 0 R /XYZ 85.0394 126.0612 null]
+1388 0 obj <<
+/D [1385 0 R /XYZ 85.0394 185.2496 null]
>> endobj
-1093 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R /F48 953 0 R >>
+1384 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1102 0 obj <<
-/Length 2252
+1391 0 obj <<
+/Length 2265
/Filter /FlateDecode
>>
stream
-xÚ¥ÛvÛ6òÝ_¡Ó—P'!‚ ÁKsúà:Nêî&›­Õ}iú@I”Ä”"‘²ëÝÓß
-÷õì·ßùd GùùŒ3•¥zr ÎD–ÉÉö,ÒŠéH)©Î®Ïþé öVÍÖQΤŠåˆR¤SŠÎX¬¤2J™m
-8èáâŽe‹_”5Í;‡ñ™sYxä×ï"Ñ#œ)&E„ò Å¿mš¶!þ/ÙK«—ÿ±Ý¾¼É;» ˜H5S\;`ƒH‰àcÓmÊzM¼—å~*Ò Xt•óЭЉL¾š†Šó`~èŽ
-Á2­¥a7ÏÛ"Œ#2nQ/še±¤IÛíI
-ˆ…àC^òŠÈ½/êbŸweSëLjŒÖžÊT2IÅ=‘hÝÂËíÎ ÀrúìÁEŒ ™m_àñ–h³"è¼ìZˆ!õÃà&!
-Á îÛJA—ŸÄ‰~ŽýC<,ñú©ê¦o›=¦%b+Q¾ÌçÔ»+iªbõ Žñ „/å]sd­{#ÝÛ€h:`¨ ÁµÐÄuPTB@íÕÁÓžßh‡}ãQíÀõ+I| QepXàQbom(MY“e]Ë¡­rpà°œ×uùo“æäh›æ5–¨„é {Wb©º„€cK°
-B#w
-èjó~¬ÇL%"{ªÇL'©Ã²­UyÚ]}ò³N|l–îsN!ñ(Ùïnä“ÝSàx§ej´¶«H°XëlXý±îºíÔvႧuHtoþ¯ÕòÙµúÃñ˜d–¥LÀKó;ÍíÒÎjµ LŒMµyj‚%{„Y¶£í÷­]7Šƒ¯uV•Å.-æIiC¼eSØuÓ8\—›«8@óÚ²;–}suÇƽÆ€ðy–®™wÃ{gY^‰Lµ ‡…òøÖ4z½ó®ŒE*UO·Î*’®Õ½.Í¡©È |‘I|ÅJì#,ç4%a¿ŠÖjÊDó`G/"Œ–¢£™<n˪¢ÑÜ.ûÒfVMû¸
-  vW,l!/TÐÿ¤\?ZŠ’à‰Ò?>ï’aÅ4… @çž
-é=ÉÝo.÷Eÿ/~¶ÕAendstream
+xÚ¥Y[wÛ6~÷¯ÐéK©“%
+@aQÔyµ£iïŠ8yÈ‹‚F»Ïx=M‹\$>hœ&W]sN³ë7‹Kÿöz!”}mԆݽMÖ®çÜkòU¶±Võ}fô‚íò[]í2 ±D¨¥‘Å+M
+Nƽ“š2:Š`
+„®ìNgx8»u+–ª‹8¶3й=¨©¶Õ;w"ßU„¨Ø~ŠŽRâ×êçSîˆ(•AHÅ
+€u¾}¤1¡
+/ ‚3ÉÝýsÑÿdiÙendstream
endobj
-1101 0 obj <<
+1390 0 obj <<
/Type /Page
-/Contents 1102 0 R
-/Resources 1100 0 R
+/Contents 1391 0 R
+/Resources 1389 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1068 0 R
+/Parent 1383 0 R
>> endobj
-1103 0 obj <<
-/D [1101 0 R /XYZ 56.6929 794.5015 null]
+1392 0 obj <<
+/D [1390 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+162 0 obj <<
+/D [1390 0 R /XYZ 56.6929 726.8027 null]
+>> endobj
+1393 0 obj <<
+/D [1390 0 R /XYZ 56.6929 697.6944 null]
+>> endobj
+166 0 obj <<
+/D [1390 0 R /XYZ 56.6929 648.8841 null]
+>> endobj
+1394 0 obj <<
+/D [1390 0 R /XYZ 56.6929 624.769 null]
>> endobj
170 0 obj <<
-/D [1101 0 R /XYZ 56.6929 691.7741 null]
+/D [1390 0 R /XYZ 56.6929 472.4047 null]
>> endobj
-1104 0 obj <<
-/D [1101 0 R /XYZ 56.6929 668.7722 null]
+1395 0 obj <<
+/D [1390 0 R /XYZ 56.6929 448.2896 null]
>> endobj
174 0 obj <<
-/D [1101 0 R /XYZ 56.6929 579.8329 null]
+/D [1390 0 R /XYZ 56.6929 356.0575 null]
>> endobj
-1105 0 obj <<
-/D [1101 0 R /XYZ 56.6929 549.1878 null]
+1396 0 obj <<
+/D [1390 0 R /XYZ 56.6929 324.2991 null]
>> endobj
178 0 obj <<
-/D [1101 0 R /XYZ 56.6929 502.9124 null]
->> endobj
-1106 0 obj <<
-/D [1101 0 R /XYZ 56.6929 474.9173 null]
+/D [1390 0 R /XYZ 56.6929 275.4888 null]
>> endobj
-182 0 obj <<
-/D [1101 0 R /XYZ 56.6929 277.7919 null]
->> endobj
-1107 0 obj <<
-/D [1101 0 R /XYZ 56.6929 249.7968 null]
+1397 0 obj <<
+/D [1390 0 R /XYZ 56.6929 246.3805 null]
>> endobj
-1100 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F39 899 0 R >>
+1389 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F39 1151 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1110 0 obj <<
-/Length 3204
-/Filter /FlateDecode
->>
-stream
-xÚ¥Ùrã6òÝ_¡·•«" ;OžO29&Y²[©$´[ÌH¤BRöx·öß·/ð©8U[®2€Ðh4ú¦ôBÁŸ^¤6P&‹IVi»Øì/Ôâ澺вfå­Æ«^¯/¾|g’Edq/Öw#\i ÒT/ÖÅ/Ë7__ý¸¾¾¹\…V-£àrecµ¼zûÏK­õòêÛë·<õöÃGî¼»¾ºL¢åú§›k„¨ ÖEA,;×ß^ÿ|ùÛú›‹ëuOßøZ$î‹_~S‹®òÍ…
-L–ÚÅ# T ³,\ì/"kã!»‹ÿèŽfiëO¬I›†É SB½Ð:Ȭ '\±Y›ÐW`G`/WZ)¸ÒÇ÷_ñÕ¿uOÜy·®àîÕfãÚ–ûoêªkêÞN G¬W‹UY¤#Bÿúýdkª—ùnW?âö4\¾ÿQ`EÑ\êt x]+ ªàN“W÷NÖw5Ãn·íÁmÊ_•
-‰6XPV<qõæ;²+ëJ f¦Wè5‘”MR é%*W¼®0¬ Ó It&Ëîf0%A’F2ÿÇÑ5OsX²À$¡?ì÷,ð‰LwÀ‚öÎ53xàÉCE‚gYÛl±êE
-WÕ+f9£ƒ$Ó‰g [‡O^â·uÛéþƒyùÖIxDÜvUñ.÷9ßvŽõ·y5s|Šªœ$y¿Êä´8 Ré9®óþæнug Ñä¶:2A¨t
-z™išdÏÏ]Å üÿá†ø€ ò꿯Î(ü±ÞÞ+<ô‹§*ß—ð©2C’
-lㄤg>³_õ!Ï°!!AÏç‘w]EJYÚÅ
-liEiï_cñ¯×MS7íËN“mN–zäýnYÝ3ŒŒ‹Ž½½H/øÐßÃÒœý&Œ6yÅ‹ÅËwO¿Ä­îÁ5ùŽ®áã4èa–.ßßñD~öÁÖò)-‹
-@H‡U]‘O%ë9òFr‡¬úcÞ 4 [×
-ã/]²Ú㪊…â£gÞqlzÉ4±Ã}Ü&ž`xæ GKæ2!´(`:q76,-09–œðwƾ°Üa\2Ú=’XÚ!c}­«¸=VŸªú±â]è90?
-xLÙ’WOÜ!N'º/$»hÁ5/ÿ·vD 1kF Ñïk™µâø0VóA±; -?ü°F{{õÓúk‰ƒû5´ÓG ¨êÊ ¨bØF¡N!YJ¸b xÉ|„ãã_9 A1ºIƒ8ɸâ0Zž¤Æ6ò 6»Æˆöl¶yU¶{†ÞÕ ÃÞü?ÐËos÷®rè%)^Â%âзùÈÇ`ÌFBtœ¬Âd÷X3Jo•Æ¨l¢ŒâÓÇQûû›Lsƒ=<QKy¬ÉP6fòÿ(PJûôã ¯Œ
-´ê‹ "Í€‘üëݶ˜Yå… œA‡¸ ­ðŠx‚5¼!oIÛ/5Å,ȵ”q`M&0ÛÅÔ å-’±!’ʯ·X¥X Y™°Ãë¬#®Ú‡Þd«å[Hü€½¤\«¯Ýn·'mô—À%î3ÊĽó$Öh”øâ­'kx$€ûÔ±ì¸SË®üAÎÎ0O.GùóhC´”´+ßuÛúxÔ´Á%0¶åÁÜzhY)ÍÝ8MtŽ6°=ˆIà¶QŒo(þÁæßð0¬ÑäìÖ[7—ýBøe}x^U-VxÑ(Iá“$쎭7
-„Ð)í°v*>q¡ÐÖ %ÄçÜ ‡´'ö},ˆZf
-möùå«
-òO£½ƒ†œ’Ÿ€º(õ—è7“ò3áE€4qw”„Á k¢MÇ'ž*?ÈõMIÕA0
-hòZŽ.Œ¤÷†Ó{lˆ¦,\®Æ!/U†ôneµf…ÍP¿eÀ,B4ƒžÀDTøÃÙ²“X¶á²!!àXLûp5Á„¶ËÑò1y³ÁȤqV 4ô…Ϭ´Jå;ä
-ê!ä”o8‹µlª¦ÄË«»Ž¬˜Â4’ ô¼û‚+(·ìÄ`ã!o ¬)9¹X\Ê
-ç\%î eÅ%,ŒùèƒH–¹ O+@C›}é]tLôǽ¾¾Â„Ì +Ýç|#ÑÆÔðöHvëã
-0ÿþ†Mhb&C¼_—#ügWœBëÆJ·“gçP»× %àû¹Ÿ9—ò·ùÞIÈ«Šìºùv!ú/'í+ï—ˇrçúˆ£|HpÒõŸpTeÿUfø˜ìËøýÉ'šÙj (½áj$Xý)óq¢av¨C©´šh\x¡ê/†Û/‘*/,’\ÆHÙ Cž/èî¸eêM$Ô’"Q[ EðtéÒW#ûÓ€eî‰ÈG¾:áS_ßµ¾JCLëø®sûÃIο«Yºø›dñ¥_t›y
-®!μ Óå»áѧÏ=ÄÚ%¤ˆ«I9xýæGÙÓÉ'®};­Wôc€–ÀG|'Ÿ]מÖáKaW×;|–‡ƒ´!.–zÙi êÃK!bþŽ'îð™4Ê$A˜j³UíÙ¼àh”ísŽàÜJŒ ðW 3Ÿ²Tÿ êÿþ±Éðëš( Lšžù&Ùc†Yâ‰BÂuvJyÿ«”ç¤ÿWuJpendstream
+1400 0 obj <<
+/Length 2935
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Z[sÛÆ~ׯà[©ÙnÍ“l˱’ÚI%º34‰ˆI@!@Ëj§ÿ½ç¶à‚„¬Étø°÷³g¿sö\Ô3?=ËâHÙÜÍÒÜE±Òñlµ=S³{ûáLËœ…Ÿ´g½^ž}÷Φ³<Ê“Ì–w­,RY¦gËò×ù›÷¿,/¯Ï&Vs/âDÍ/Þþã\k=¿øøæò-½ýxÕw—ç©›/?]_bÊaž‹Y¹üéòŸç¿-<»\ü…gÐÊ"sœýú›š•p”ÏTdó,ž=BCE:ÏÍl{æbÅÎZß³9»9ûû@0¥¥S˜Ä6‹â̤ =Ó:ÊãØŒP‰ó(±Æ*°"rç ­”š_5]¿Û¯úº¹gúuÅ•›j÷¥ÚIgË姮:šõSõ„ˆÀ¾&†šÁ`ät–Ò†7u³‚ùVeóÏÕSǵbw®³9uçón-Í’o«þ±ªnô-WÖm×Ëê¶Ù<‘_AÛXf:aëÛ}×3ý[íÛìð¸öäŸa©o=+\=pY<_Âfph<æ€5ó®ÝlÚÇɺã²(K<VˆcϾ{çt€šÖ„”€ä‰\SlaÇUÛÜM œ˜È$I,Sÿ¥”ÙˆDîÚÏ·y0ßêȦ:—ù¤ž jt§™ŸõJÎqw$ó«_†ƒ1`œ´½›Ø9Ë£Ôš,ØÙLíì"•äþ<: 7$2‘ýëZ ët”Äq5 [àR/ÿD–së?$3/°‘äXxЂ˜¸çûÿ~OëGØÐðàé-`Îršóa¿éëSšË–&--ž¸ëV†ÕªéQ p·ûž‡Hí©ÆÒ€å(û]'㔢¬6O@YkÙ¨¬™0Üö/²UÙV²¢i{ž
+×uýE#ÛuÕŠ÷ñ”Ì»v|ˆºgÉñ¡ r+JCQi¸xlw›rÁ$‹²¸õÚËš ¤³ÈÄ)[‘«)íÊ#g3û’Z»È:èQ¢!MI‡N‰”
+n2³ì«N¢Û<ZÜBÉÄ4Úã±Þl¸v+Ã]}ß• Ñ~-;¬eA÷P­jÄæZ¥™ŠOÔ˜lb4”wblò2RÁ56A,ÕW`@DË:9êCÛtU76pÃqPøäG3¼^„3åà¡­éÀrmt¸ÙÂLs«½Š$Äð_—®ÞÖ›b'¾è«-Ü%n²O KUq\7î
+ï~¿+úºm¸s0ÚT~bc ÇÎrû}}„4wN;ˆ$Fcª_6ÓàÕý6$KÂû¾©^â8ëåøæL©ÄÄÅVplÿÔ±EïÇ!p~Â*°Ø6€+uCK´¼¹úáÎPåuÑy­¼X­÷Œã®Ý¼ò¼¾úˆ±e¦ç$Þûr!°«)¹²+Fæ3ÀZTUÌ
+oþÆ•²Âá¦F5"HÙãà=`'З ž§]ˆp¥‡Àán‚R
+–ÈÉ8Èx÷4E%‡ðc~Ÿ ÒH½ZÝ]µ› q¯Ñ¹û…‹pŒaAè—ö%˜)Š¶§Þ,ÞO6=°6r¡zØØz›ÄóuAÃèkÕ×ü É &@¡—àæ.Q>蔀†»–ˆ;Š5¹ï¶%¯ K>“–Bßc»ß”~G++ðäU9‰ŒŽÒ\§§>ƒT{òLêwèŒ/ïŠíƒwÞí÷Ûg˜Ï¤éHßB©‡·™rz
+u?ðÉÉ“L†‡ÚÙÈ(ÃÃѾaÄG8|3ô{.ºc¢xzá¡^>A_¯¸Á»{Ê=˜oj$¼›
+ºOlècÑzÐÛ§Q”5—r ‰°ŒqSö G{0\­´!Ƭ3ö’Ü2\äÄ%cm¹©ªã¼Y+Ì•‹áJÛH¥Î`˃»ûW®ƒ”w˜¿pÊrvJ—X‰ãÈ À¬¹–’,Ê3ðBá'¹÷0ë%FR¹1‚Î7”PYw«}× ¼µÇr߶>)•ðØV_k —OE¨c°ÕÆx[Íê¶xh7õj*IOÐäZ!‡0iÚ‰ZÈ¥RK·éȉ&âD/w»v×½ìÙ éTâ®+çÌÐGÇ׉7ŠÐ3h7Ôƒ°Z«¢áÉâJ!½ârŠ¸´‚L°Øp£Úñv;´Ú&Ï0 âÙ}„ZÇ»H|=tu+›¶YL¥Br¦ûqxYÀ¦¤¨©£ ÛäDúßý|ýáòúš‚²l)µ€öÀ¿rÐ%á¹ã¥¤hûEhwüö‚£¬SŽˆp•=ø+È(9"‘uÏb“Y?)ÛTÆ›AÏ}Y„¬‰ ›$ å.À8:FÆ­:0{Æã€ñ!7ÈC I
+¨zÝ“ 5aÔퟖˆXëi5eÀ¡8â‰sNä2c.WyÎÄÜÄ|”Î&>]XCÙ%¬-Ö¤¡¶àÀð u¼Âà#Xh,­†±Žæ5\î›ÏMûØð*ŸRáš“lûÃÄŽ—±–ÁÊ’m&ã<ÎZ-$¡"dz*ˆ°Pkn®Ú²âi]Õ ‰–Ë×oñù•S@ê!¡,x…ßB„æ€ Ô´ŠWë
+»¾›m1½U*ÿVy‚3,œU*ÏŽÉgêÆhC!"dž®
+öÒ÷rÜò0F ;Ráû“Œ43€-Ȩ£ìæäÃÇ€q–ï"¥´O2žÁ
+Ò*­†'Qg Höî‰kÌŸ­òZ–ç’ìäò¥`E˜ C;^PttÝÏ5-[k`N.0§Å`¸ã%’—!‘¦
+7[døÙ/ÏŽl©\˜G¨Ð½7Þf«ù[Hï4?ÝW‹÷Õf³¥ëèSª¯¨÷•g±¥§Q:xçÙ: ú}‚XÒäfàªâ‹ì]pÇ4 8A„òípc´Œ®W±é×íþ¹³h„k
+ò-?ÎCño _iòvËõT‚du¹|Hyž¿ª1¾ð¤ Ká$î´ô‘…»‚H½R”hcð|æB±­=„” Wào8¦Í9}‚Aìie:l5œÑJ"eò£Ðú™›g 1O•Ñ/žÝ©tôÎç'ù‘‘ÉŽŒLîo*ÔØ»ù¤eø{”Ljeñðflðe]åÉø
+Ÿˆ_–œœž/Ëâ÷âñÌCysI/6ÝÑW‰}wüɶ¬6Uï?J„@>Žù콟㿇­ ™+Šü¥n÷ì UôÜ¿ ,$ÐÖN½G¨!Mÿ¿ÿypø«…K#›eÏ<lÀýŠ2“§ž)„Òèc·¿(œ²þ?G°±endstream
endobj
-1109 0 obj <<
+1399 0 obj <<
/Type /Page
-/Contents 1110 0 R
-/Resources 1108 0 R
+/Contents 1400 0 R
+/Resources 1398 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
-/Annots [ 1113 0 R ]
+/Parent 1383 0 R
+/Annots [ 1404 0 R ]
>> endobj
-1113 0 obj <<
+1404 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [418.3461 611.3335 487.0181 623.3932]
+/Rect [101.3082 379.428 169.9802 391.3282]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-1111 0 obj <<
-/D [1109 0 R /XYZ 85.0394 794.5015 null]
+1401 0 obj <<
+/D [1399 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+182 0 obj <<
+/D [1399 0 R /XYZ 85.0394 769.5949 null]
+>> endobj
+1402 0 obj <<
+/D [1399 0 R /XYZ 85.0394 749.2913 null]
>> endobj
186 0 obj <<
-/D [1109 0 R /XYZ 85.0394 769.5949 null]
+/D [1399 0 R /XYZ 85.0394 546.785 null]
>> endobj
-1112 0 obj <<
-/D [1109 0 R /XYZ 85.0394 749.4437 null]
+1403 0 obj <<
+/D [1399 0 R /XYZ 85.0394 519.0032 null]
>> endobj
190 0 obj <<
-/D [1109 0 R /XYZ 85.0394 597.4103 null]
+/D [1399 0 R /XYZ 85.0394 364.477 null]
>> endobj
-1114 0 obj <<
-/D [1109 0 R /XYZ 85.0394 573.0707 null]
+1405 0 obj <<
+/D [1399 0 R /XYZ 85.0394 339.5007 null]
>> endobj
194 0 obj <<
-/D [1109 0 R /XYZ 85.0394 410.9267 null]
+/D [1399 0 R /XYZ 85.0394 175.6792 null]
>> endobj
-1115 0 obj <<
-/D [1109 0 R /XYZ 85.0394 378.8211 null]
->> endobj
-198 0 obj <<
-/D [1109 0 R /XYZ 85.0394 204.765 null]
->> endobj
-1116 0 obj <<
-/D [1109 0 R /XYZ 85.0394 171.4256 null]
+1406 0 obj <<
+/D [1399 0 R /XYZ 85.0394 143.0963 null]
>> endobj
-1108 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F14 740 0 R /F41 939 0 R >>
+1398 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1121 0 obj <<
-/Length 3252
+1409 0 obj <<
+/Length 3227
/Filter /FlateDecode
>>
stream
-xÚ­M—ã¶í>¿Â‡¾·ž×µBŠ¢H¥§ÉÎl²I»ig&=äã [ôX/¶äXòîN~}¤%[“M_û|‚$€ø -g~r¦ó$/ÒbfŠ,ÑBêÙjw%fOÐ÷õ•dšE Z ©¾z¼úâ­2³")ò4Ÿ=®sÙDX+gÕOó,±É5Ì æ·ïîÞ\/d¡µš¿ùææŸw÷׋T "’›Û_K)ç7ïßÜÝRŒ"àíÝ͵Éæ?Üß=\ÿòøíÕÝcäp¸ )²÷ÛÕO¿ˆY›ùöJ$ª°zö"‘E‘ÎvW™V‰Î”
-˜íÕÃտ℃^?tR*R$©ÊÓ ±¤r&³DeÐ9”‹.`R­ƒ\@BD¹À–``:§˜-Ò"‘R~Ä›Ãó¾oŸå~S¯@&E>/ýÆ5}½*ûºm×®ñ«Yp€¨›u{Ø (ꎾû¶ëêåÖQ«¿–óÍáZÚy{|Ú0nÃq²·:êþ™Z? -ˆqU WEž(e ì
- Ð>MMŠC’ã†6<æÂM¥…¬Ç“+IuÎÎ k*·]K¸%÷Áº»csŠd@–qÇU»ºc=” ´Ž:½É‰öå=ïä¿h¼Ì¦ÞVD†.G2/0mÓíê~Ê¡µâAÎ KÁà—ùñ¯|(UäN9,fà
-ËþÈ=¼gÀú¦n*ܦwòˆ~&4ÇZ5fŸ×¡žµß JjÇc¨U¹/9–+>x]»ýàxlqÂçô‡k;g¥ˆyíý
-™åÃPûÖ»,·>,(1ú\;Â{¿„ß(J$A Þû)ÀpÈLµä@Ÿ©›ã$t»:¬”Η“9ѦÀl¶Ûgj¯ÚÕGñŠ¦á‰üŒÖ{ÕMÙôïQ•¿"C=EMѵ5,”1]¹l?D V{ëæl˜à÷´—°¦!‡¼ú\XåÛg&V’óç¯]Ù@ï}?ÎóœÔ²i(cƒgŠË
-ÒíÜlPUÓÁ¹^À¾Ÿ\31cš!uåLòóÝøÀPúáwØÒ÷‰8>É•½çÂÚ$—fìCÑÛ@Z2LØ°Íòˆ=LŠ¾»ô£¡Fì÷*Eºvz<{6ˆ,^*½}¬}ºRŽJPPÁ
-£‡!tìF9ø™EIßȹG.é {cS{‹÷ЈËdÚÉD}]€(1B«ò”~ôAVÄzÃw¬òÅ|Ù—WÇ•«¾œžÌER@-ÆâønÌ×_…Е©Êt‚Ú˜È[Lž%‚ìQé €j/i ®´%¦c<­5ß´œ „=Éütí">Ê~°?
-«ðF­|¼§v°ôå? KjzóC /Ÿð2'AÅY²ùS?ГÐòì1xao?¤÷[öJ>Tevp56s™ÈtÚʧìǪ$·y:¸ÂLÍŒ<–n¸š¢…)Í2¡Þ¼&Œ$uX4òÜjžG_ôáàNׯ’áš¾>Ì KÈYz¥ËbØÊ,Gdx
-¾!'D ^6°zq_΃Åxrr%€Åéhù‚7‘Ö$& î,O‹D¤ú$a´ëGœv´4çL¸^Kß„ÅŽïþÖ$åzšö¶s\n!–Pv¯€Å\çeyɸÇ=f®M‡Zÿ…“æI&äÔæ&Âè£Gû!”þ*"Äb¿ £­ó 'ñ;”’) ºaÛA,—Õ†oÅù  ØóíÝ¡÷7|Ø‹¢Y!Zö甄¨ê5ŽZ»Aá:\‘}OJ­ÐÞ•<sacá
-°~\új“{ƒ- ¶e!÷e=]¹ä]lÅ‚_†„å”Uĸè/Š.·»ÀD5K³±õ¼Ÿ~oLñúK¨XB^N¶`Up8‹š’]š+ÿ0·›1:«÷÷ï¾~i"‘O^ïùÛÕ@ nOE¼]\b@7
-êÖ©ª‰5ê¬.xy©SÊÎ_|,ù:ú >ˆ·|qw‡¨›¨:i†á=Œ§ø“¨pAw~à—¡â­ªÐÑÿèo@ñ?áÒ–ØŸˆ&E>¬°±+llàqê¤Q˜`<(ٲ뎻8KmÅOçHè딂ÞCý;8\8tÕd0ÉÀ•ª|PC'Ÿ+»¡–Nt‘ŸbèÂ@ðGü ªˆ r¬çÊ­Ëã¶gu•áat‘ËRç·Nù–‹Ë<ÿýPB>‚N¥Áð–aôˆô¹›ÎqÖžL\ œeuçÑ„®Ú‰Ë
+xÚ¥]sܶñ]¿Bo¡&>ŒŸ[NœLÝÔRÛi>x$¤ã„GÒGžeå×w»À‘'ÚéLG3°X
+Y\æEk‘èËj!.`îû‹„q6i3Çúîîâ›7*¿,â"“ÙåÝýl/ c’Ë»ú×(óø
+vÑíÛïZø—\m¤ÈU½úáúç»›÷0ÔP ñúõ¿®’$‰®ß½ºyMS¯ßÝRçÍÍõUžFwÿ|s{õûÝ7wÎ9/‰PH䇋_—5°ôã…ˆUaôå# Dœ…¼Ü_¤ZÅ:UÊCÚ‹Û‹„ g³néªlK•ÉáH¹&]Ä™’Ê çng‘ @Mf¨vÔ:‡ýÎO7ÿa¤ù~JĹЊ‘†ÃUb¢¾²ãxµQºˆßvÍÔ”“­i¸}‚D\Ò°jÛMÔïÔŽöðÑ–製J¢®nº‡Åò±yè`çò,.„ÈþRFúp´‡'ÚͤéªöÈ'¨ìžp‡K˜Xgùå&IâBkéÖ– `8 ³°$É#8t$[ÃÑÔS[RãH*d´)K·”1÷`bhŒ`„¨¢ùŒëÓŠqè;Ëh_
+îšöttº(
+vDw’§Eá£ÐÕ&â,
+=pÖ˜ç áwoß½F‚²¨ Æ\¶­#ïô
+¶<wÁ†]0ûÈ/8_ºð¯OÃÔÃvME ÉÌõ4­3Ò`¡¹F(²E~A€‘Ú¡ÇfÛZMàˆväš(5AØŽ'Ãf·¶:šé‰F(f"\sùpl|ÊN n¶AÖ‹B@A‘{ ú0²ÒöKm–NÏ~šl7'£»ü8'¼Öì3¤ó™Øº˜ •ŠR¡£2L",e_m¹˜Ôà·•€ªŠr<Øb5‹0j;V‡fë,†ìBÀµó•8a†Ý!¤(gÅQø(ynªö×îÏ[ ep>ëòp¡)"xt9
+!šs
+9ÅZ˜oàwu¾€ˆZb¹óŒA.ÁÑ9'úè‚â6GlxÉ,föñùrûih¡0¡­²°Õ¾Ÿ#Az^6LØÖŸXU9N k v§¿bÄVgÖYqJ¹ÓEN›Æ2-|M³Ù­\'p<ºH}FÛlŒ™ÆàO…HFñšû£ ?ÐkÔ’ÌRrˆ^ ŒC­YŒÒ:z×»8“iïx3>³“e9 é»$™ÇÆ‹O‹03±¼ÞâÖŽt÷¡¦5©:KõqKCf$Y•Òp‚ €ÇþðÈ
+Þƒv‹è—•ýXªÐãgÛ9üø½.ôV©\çæòK¡7= Ü£áÌ(3"”S¿üýÝÍúƒ·’…w†/h;
+ü&„!èmù¤ãÈñÂøÀbÔYA‰ñN@ÞÊ+9ô»ßÛ®¶|
+/\øŽó8«úÁjÜ(,ÿñÃ=½•8 «þXÒЙv¦òsð \}6 óiÁ@È»Ÿ¾û¥ü%Èã;VÅ —A.T¥föµ4ó$N井¯™QqfÂWCd
+<Å^Ÿ"ßX=³°ŸDáS¢“+(}€¦þº7ILç©ð¯¿`yZÐ÷+/a´~¨EJG:š3&<¯§væa´üP„ÁNr9M|zvÜÎî!}Ì3-%Üeàñ³3×>e~æfC‚™Šd¹Õt0øè?ü¶ÏŸ,|(þ̯;”Žñ'+¿Å!}þ¿ùqúÉKšÇʹþ£™›85° å>µÉg”ûŸˆ<'ý¿w€=endstream
endobj
-1120 0 obj <<
+1408 0 obj <<
/Type /Page
-/Contents 1121 0 R
-/Resources 1119 0 R
+/Contents 1409 0 R
+/Resources 1407 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1383 0 R
>> endobj
-1122 0 obj <<
-/D [1120 0 R /XYZ 56.6929 794.5015 null]
+1410 0 obj <<
+/D [1408 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+198 0 obj <<
+/D [1408 0 R /XYZ 56.6929 678.9507 null]
+>> endobj
+1411 0 obj <<
+/D [1408 0 R /XYZ 56.6929 644.5195 null]
>> endobj
202 0 obj <<
-/D [1120 0 R /XYZ 56.6929 769.5949 null]
+/D [1408 0 R /XYZ 56.6929 514.5361 null]
>> endobj
-1123 0 obj <<
-/D [1120 0 R /XYZ 56.6929 748.4014 null]
+1412 0 obj <<
+/D [1408 0 R /XYZ 56.6929 481.3387 null]
>> endobj
206 0 obj <<
-/D [1120 0 R /XYZ 56.6929 549.4516 null]
+/D [1408 0 R /XYZ 56.6929 279.5586 null]
>> endobj
-1124 0 obj <<
-/D [1120 0 R /XYZ 56.6929 521.7105 null]
+1413 0 obj <<
+/D [1408 0 R /XYZ 56.6929 251.1623 null]
+>> endobj
+1407 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1416 0 obj <<
+/Length 3255
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sã¶ñݿ“éLèö„
+)·‡ù±éòR–UOÏC_4ZznÊ9=øúi°Ï«ŽFk¶›¬[uO{‡c›ÛÅ#=K^ØðQËCU»S·åñdð):ÍÇ1bÌOR†uÙƒÎk%ƒCO¦qèóMIÊA}µ«ê¼£ h†Àñ4Öá?Aíf8™$@h<­L%èp
+¤ž‹o¡3ì˺ZÑ÷8RA¿mxq„.yeÕô ¤eáÞ…¸vp¨~kxû“Û°ªEÕlŽ»ì ¢ñ…ÁÄ„–±vW`^ŸÜ3LEb€ïrÌp:åÐã 県p˜Þò‡¯ÿúíû›Ü‹HJaR™Mí ÀÈw`i½ðØýüCÇ°M‘‡@Ÿ‚”RwÕ¦±·¶RÞ²üyu~:à c¡•Ñ/™JR3UŠŽùmiš‚ÜgÍk¤Œl^¤‰¬ž›†F9==+•I„Ž„‰N½mžfD†PB§”¨b`¶çD‚CÎbcÎd*ø¦ŽŒ³ß·MQ_´J3Vá 88ûÕÀóþ°Dby¿WfÉÊ °=c‰‚¥F‰b‹€)VcI@oŽÐǪ®iÄ.ȘÓàEê…ÑÔ)|äÀwªÈZŒyté73è@2í|#bÑs¼ Eš)^„¾ëè Ä0‡èööîÃWÏ!’ΰˆEÀ}ë!QOŒ Ö-:,Ãfä×bM΋KdŽ
+•±,PMt|˜;a¡Y
+Žzâ4ž?*’j|dlvÇ#ßx§Á†øžó¬Û[0"ÞH¬û–±5à»cU|dXžü’×çEᦠüòº~²Û>“?NLÔÔuûH^^!­ØÙ`Š/hN= )f˜Ô)r6ïûÃÎï¬~ö´°jè=§‡0xPX³Ñ$‚
+ü¸ÕsXGëCîµø¿ÊÞf
+>é|Ê™ ½Ÿjµ†œÏIÞºFxçOF»Ž ';0ÞíÀ#¬¨–¤MûF‡=£m ¥|y¨rÜ~yMƒX*5%‚ nEtŸ|Yƒ*¼fU¾Ä•WÛ» ýß>ýl ãÔù„O{mŸ;JÈûUW-nTܼڵÓEC^±šÕÀ¼nºxðù~Ñ®;Û…§ˆ%"îuâÛ¦®~ædö݇øѼtÆù´ƒèÀÐDÑ–œ‘“k„çjýÄéð¤%F0Jž!L·yÁh{Nø¹‰“lA˜é·œÙƒˆ+ˆiÕ¯rV˜-Z!3ŸVŸoÀŽZÀ§ls-]Ÿ¸˜æû>Ó¯µôafM“QU˜à÷ÓžFPCB¡Qõ[ê9keÛ*!8å+<íÑFè}¼ýœ
+=º§u|ü¤ 3ìt¹§v½g¸”Óþ=!ãö"È‘ÞæK<‹Ã—xöôÃÐS_hŒ•HÙäMõóÅN·ô\–s7ôîSmìÃÄ»êDºvZl\Û8Ájô:笉oùìP ³2ñ
+dlVÕïóU9†ãÂ3ê
+¢èêuÏ$º¾Zrôô“‹‘ÛÚ–GÁbB„½žþ0séÄaeø¨(üTŽ=þ(W>€²Úí”hKæ½ý·VvU_º… /Ú21NÅÝP¶fèi²‘æŶ‹U O~šœXŠ0;탆þ[Œ˜É±•%…ŠŽÁ8zjÛtÿ¯=&JEÊ“¨ò…ÂFXŠiºH#M¬?Ú '›ÑÄ­-ºí7üdžض³ôÌvÆ;‚á{¨©<- >Ÿ⪩†*¯öÂ8¥ž<>{÷ñ‡è±û×ßTs½þúO×ß²ûîû§vírHû››õ7zUß.¿Êïïžû‘Žþ÷gæO?Ò· ÿï¿ÿUBÐYÎÿ{Hc54©#
+™êSÊý‘ÎIÿݳÊZendstream
+endobj
+1415 0 obj <<
+/Type /Page
+/Contents 1416 0 R
+/Resources 1414 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1383 0 R
+>> endobj
+1417 0 obj <<
+/D [1415 0 R /XYZ 85.0394 794.5015 null]
>> endobj
210 0 obj <<
-/D [1120 0 R /XYZ 56.6929 231.5025 null]
+/D [1415 0 R /XYZ 85.0394 671.4386 null]
>> endobj
-1125 0 obj <<
-/D [1120 0 R /XYZ 56.6929 201.1114 null]
+1418 0 obj <<
+/D [1415 0 R /XYZ 85.0394 641.1061 null]
>> endobj
-1119 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F48 953 0 R >>
+214 0 obj <<
+/D [1415 0 R /XYZ 85.0394 444.8166 null]
+>> endobj
+1419 0 obj <<
+/D [1415 0 R /XYZ 85.0394 417.1342 null]
+>> endobj
+1414 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1128 0 obj <<
-/Length 3056
+1422 0 obj <<
+/Length 1913
/Filter /FlateDecode
>>
stream
-xÚµYI“«8¾×¯¨è˸¦º0’X£cÞž÷¯Ý}À€›Å¼NÌ-@Ùõ˜yýbbÂD*•ÊåËT
-ƒWÿÀ«"r<R…WY8‘â«á¿ð¯6žk¾€”ç#cúxäªj/åoH~U9U‚Ò«¶}¥p¼¢€WÍü½TkUFZcòöE¾$po¢Ä—*õù
-PEáuJº³Mµ·?µÎKCË5|´ðˆ¨w|ùýOþÕÄÆt^x©ŠøzÁ/<T¾ú/‚ˆ8Q@(£x/Ó—q.ða–.-òŠˆNT \àŠÜ"ªœ„ ¢n1ƒ8¶ŒØµƒ{XÄ ¼ >,“eNUïEø/®çaÿ(rI÷âÑPJ¡y2¬tŠ=öÖ-¶’”˜d ”Ì8§ýÁóгâ'¹7 tÏ»= 3½ó—…8%ͱâl_ªˆÅ6:Å–IÌÁnI-ø
-ˆ$?2&‹&O3Æ[ƒlc=ažDªÌ!QQŸ]ùévœ6Ô}d€auzœÀ~Œnlx]âTÊ~YF¼Ì¥º‚×|›-Vò‰âe–Ï$ÎKžçKµ0 °Oq3µ¢³ùËØnˆ}Läho*,% Â*êÏÊ7ˆ âp1©£ÝgÐú"! ¤\I*ô!P„
-8¨Bðý.áä…bÆMŠc‘HNP}–˜êKhTrŠ,dÅ%<|°´ð ‚ñ­|©X)nO,܃nÒ2‡i$ð„BR
-ê¹(q²$¡GPsXÏm‘p•“å\®@Ù¨âÆB’¤çìú±Ò2òŠT{ìà’¸gÈ–ÑØÇÆ“IÌ[rœ.RèS=`èèI&=Á)/VºØÏ–¤L$NQœ0>Ï öŒL@õÄgD·CÚ‘~p\ƒÁ>3ç õ†£“µPÔòÌpD„JÚa:õy.qgÁ{>AEù‹ØÀIêC Àš#,üûƒŸ’©/ÙM^?ÏübZ–ŸéF‹~ZW—B^M3‰Zà“ˆúòø ƒÂ—S>¯×¹±xœº€&uËC±ð= Ym5¿œ
-÷¸än0’‹:
-q;œ°òØ*ƒ½fõIJ¨fûãËœÖ4A)¥íÙ‰è•óîG}ê~ˆ§$¦W¦'©L[Ü{æ!RƒC6»±ŠNß¼(n©Ìv)/(x”Þ4EûƒÂN"}"Ƹž2¤†â3sâË[’Òh—r0©ô쌺a=Ò ã÷ÚKz 3Ý‹S³+§ôY
-‚HÚC²†vG¹ŧ'zz¹úzYÇ`?na}ös$„D¤ëû'Ú ,ÕÍýôÖá»±•1)““*“=[ñ7&âF¦pÊL/xnr˧iErøúýåðx¼Kg·¼˜+èrÈí ¿ ¸3ù®lHø®÷Oº ãö˜ÇWzˆ°Ÿx2—é”H®Ï¤¢r²€ØÄßéDº‡‰IH*&ÛµØá'Ò›*XžÊ} —3‹ENÄýÔ3¬á~a’¡(³zzüR¬„K´èƒ ¶í¼×–&Í—·•n9n4¶]dx“MS×.ÓÎ5jî¯E¸>ImytïœØÖ²ÌÉ<==\ÝPí«0«{³Òò–]³!ÜWíÃÄÑ«ÝàlÔàLõ×ÎÞœL0Ãr«bî–Òóû^p_¡" ßopyöÞbX©k£ûô¬Zº¿Sæ@µš»jOŸ'«ó¾ìâºrØ­lgû.m^ä÷ö¦~/ÊùþkA¥6Q€\ÿ&T«º<›”7V½u;ˆîB[.¦®´ôÃNoÓT§ÆÑ=™ïÖÞy9Aý"ËÞl6Ÿlö– Ú£ÎÔ5ý.ZßjžçËiw³³Ê‚8힌–\fâÎÚö“£$ÙÝÐïÞ %º*ÛÙÜ’Oªº¸k=ì£w­;×Õx ùocUž¾÷º3í06ŽPžÈ •ç¢3_§F»ÈêÁñbÜ…Ý긮ÃíØ´¯£®Õ¼_›TM×µn½þà¾l¢_~Ë¿[±ðþ4Èá#L ´)ähq$ƒð” ¢Ïj÷·8çºè‘É^²o‚¯©ä‹æO%”Ç$?{ÁºêþÛéÛ
-3DL3¤riT*úuÔ7&ðÊ·6ã¹°°ÖU)lÔ—ï?îKbwãh»hÖzeâœÆzÍÔp"/}¹Ñ¢•êníÆé(Ÿ×å{s=3ÍÁâöÞYßO1ïÍÉÅÞ5/Îl
-DQim„Nw¶Ùc¨}åpYz;¾á.QXÿ6÷w­¡ vo_2fÝÙ¶ì×äÖy{YµÊU ÂfP+B†¹A·s
-S—|K¢_ü6ŸGïnÏijÁ y@­p1îÍÚ÷nÔ™¯ÑݶohqhÒ~J_ð$¾¯Ž›äl8¾=®)µ{7ÜõË ¹R¿Y¶ôԧ͊]}hNù¢0߆m©jâËûjmÞ½U_owš[¡/˜·°Ûvîæú6†›Õ8ÚÝÆEJ½*ïÕd}ÄýÛªÛj­¬É™í<ºîÚã¥oía§y|?ã°ÉK…Öâ\íUÇQ£Z{ø In_{£&</µzyô–ïu¤¡Y¯È¹ÕYµ:Ne]{¢:?念xÝiYõÚì¶XEçÑÚŠ×õöäìÔëEû‹pÚ=oËÒ:3_j8ûû- àt JãÉ^ٕݶânrØFó_¿e’Y2 ô“]úU.o…Šþ~BÍýYÄçùò?ÿ5õùonÆ¢ÀÏžZTò7¾dJÑ$_5ÏÿÃú^õ<šv0endstream
+xÚ­W[“ªH~ï_aÌËê:B](.qbPlñ.
+^˜AQQؘÿ>¥h»³—8Ñ•·/³2³²` Ð?X"<ÃKH* Ç
+5kó}p‡Ö¡š¤ølV…×Âh,:ž7Úëp[·Úq¯½Q %s½†ÂŽÃÞ¼ª`=Aí,ÔŽ'›
+)ì Dš&›ÉèhvTGiél'#Ó9šEÌJ{œxŠBФ›,=ÇÑ;ÆŽozÛÂ>˜ž4H¼6ÞŠÖo‹þòYbc"ò¥ß~½Úò‹ö·«åßÝj¹4Ã0…÷lx<:«šZËàQp©süV„øÁšXoßï³/ìµB»9ê¢Qò½¼8þ¿šE!b$‰pų(*P¥@­+—T×cù”ø¬êû$/
+ 8îcbE裋ё•G”
+iÇ!€D.÷upsõÎ)1„§#.e¤#0l)ð;ÇÆ –uú•›_Cu T„b ¹3¥mj€“$œ3½¬ï®~Á}ƒmïPI‰¨C¥ŸžŠk¯šïNñèe §ÊEíC‘†FÌG§Ám>©!A*GëÛ¯X>ym²sûw›ªn¤À¿Y9ÕŸìþ1ßq*”óÙ$'YñCSRA¤|Ë+Úƒ1GÊí0ßß[ôFà@ùä¯Î]ÓGί_@ÄQtÊ·^à<<P…”£ õ_Œ~9Ž—$Jbé%~.«nùK$ž¦Õ÷çÒÏåüK¢òôò#Òk¢þøâäéý„€tw|æ9·ø"ñãÁy[¿Öõíû=ú›·;ÿ°Âû‚žL\"m>NTà=àts…ÿ
endobj
-1127 0 obj <<
+1421 0 obj <<
/Type /Page
-/Contents 1128 0 R
-/Resources 1126 0 R
+/Contents 1422 0 R
+/Resources 1420 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1424 0 R
>> endobj
-1129 0 obj <<
-/D [1127 0 R /XYZ 85.0394 794.5015 null]
+1423 0 obj <<
+/D [1421 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-214 0 obj <<
-/D [1127 0 R /XYZ 85.0394 717.5894 null]
+1420 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1130 0 obj <<
-/D [1127 0 R /XYZ 85.0394 690.1986 null]
+1427 0 obj <<
+/Length 2465
+/Filter /FlateDecode
+>>
+stream
+xÚ¥kÛ6òûþ
+¡Àò¡VDQÔ£p7›t›ë¦Íº=¤M?heÚÖU–\KÞ­s¸ÿÞÎP¢¥w@°Àj8g†ó"-¼þ„—© ”yì¥y¨P(¯Ü]…Þæ^] ¦™[¢¹KõõòêÙK™zy'Qâ-ׯ,³LxËÕ/þõ7‹ï—7ogóH…~Ìæ* ýÅ‹ŸfBqw}ó‚¦^ÜÝðòf1KcùãÛ›û™LR«r^D÷7×_òŠww‹ïn¯iðó›»›{žXÜ1ÏÅË™Èü7ßGK{ûêîöîÕì×å·W7ËAM×"”¨ãïW¿üz+°È·Wa óLyO0‘ç‘·»Š• T,¥ÅÔW÷W? Y³tÊ´JfÊ¢t¶Q4e[•‰Œ¤±mWm½b­;]¨®¦ñ‡¶ÑO۪ܸ.ªš ¾¥ïcQW«¢×̦hV¼¨ª™’¸öÇCÃöƒãTÊÿé%ZuqûÏs~ý–(ëJ7}€f]ç" D–§Fð·ºÛ·MgäËbWœ`é2EÜ
+„YT»ã•ôAžçST¬Ç”ekÖ²}_¨zöÀQVë­ÛöX³§m‹Gv™­›Ko>§
+–Ë¢t&BÿØ™Qâ—mó> #”§ ÅSÕoiÖh‰(âd‘³¦GQ‘à G($NUM+«¶)êúDóµ^3ƒc3Ÿ
+JÒJ¥”‰‹j«!á( ê÷0‹BÿD0Í«õ‰³"ÔÚǪ ŠÁ¸JÙê Üó³swPšŸá?Ic8Ïö°êP«/'³&Mš±W
+ë‹ï£(¶Å×DXbO?´¦u±þ
+^!õ™l¹a°iY+×j£6χؙlN(…)¬^U%„+f˜0£Äh[‰F“ãmƒ{C6‰eä¿Uø=ª
+>!­W"Êš°‰=æ:à>Ø Mgs&Š„6gIiÌÀ˜ØÚCèÛ‹bŠCÇäŽþSnDh*.«jœ§Ðt'Òs+úgv Ø‘¨<ɽùx;ø¼.æ¼ñP"kt$<2N"÷.'9ô‚, —,8Þ0¼¼dšbW•|ÉÂ+Åå=aqì[ha-Í=T ìÇ6ƦD8Ú6T EÑ¢£B…a åàF€7
+BB'TÅÄû÷‡ZÓ¬ñ@À–Û¢Ù0® ÔÊʃTcavlr ׳¶ØåhkÂFSœ|(ÊßµZ„wÒôŸòÛ©Ëߊ
+îpc4ô ú@0–O‚Z#yé+`À¦n/ ÛK膓<·‡>Î붫Q?ôæÜ?aw>¦§ggÜôù©@ŠŒÊæ5¸JIMUdõ„sòò³¬¸Ä“}
+cT‘öí/.v“;8¢[#‰'¤Ñum:ùÄ_4SÞ5ö¦É¸|~ààu“®˜;¹Þ­/½jª¾*˜Mǽ!-¢¡ÔÝ_¶4éÐÐD¶?u[Òág
+&‚©~þïfirÜØ Y-ÜdÅ*òkHè´æSÙd2(þFq×t,ì„›ýƒHú¾&@¿O=€‚yð×…‰ŸÂÁŸý#Æx«
+endobj
+1426 0 obj <<
+/Type /Page
+/Contents 1427 0 R
+/Resources 1425 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1424 0 R
>> endobj
-1126 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1428 0 obj <<
+/D [1426 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+218 0 obj <<
+/D [1426 0 R /XYZ 85.0394 486.5796 null]
+>> endobj
+1432 0 obj <<
+/D [1426 0 R /XYZ 85.0394 454.3582 null]
+>> endobj
+222 0 obj <<
+/D [1426 0 R /XYZ 85.0394 412.0822 null]
+>> endobj
+1433 0 obj <<
+/D [1426 0 R /XYZ 85.0394 381.7503 null]
+>> endobj
+226 0 obj <<
+/D [1426 0 R /XYZ 85.0394 150.1125 null]
+>> endobj
+1434 0 obj <<
+/D [1426 0 R /XYZ 85.0394 122.4306 null]
+>> endobj
+1425 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F65 1431 0 R /F21 930 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1133 0 obj <<
-/Length 2753
+1437 0 obj <<
+/Length 3008
/Filter /FlateDecode
>>
stream
-xÚµ]sÛ¸ñÝ¿BÔŒÅàƒÉÉ“/¶{¾i×ö¥—{ EÈbC‘
-IY§Ìô¿w LgÚÉ]2c,‹Å~cñƒÿ|«Pe"›%YƌdzåæŒÍžaîogÜÒ,ѧúéñìݵLfY˜)¡f+W²4å³Çâ·
-³pXps÷IÍ"fÁïwwïç2  qsKãO7·—eóçŠÉàÃÏwW÷„,«‹ËOsÎypqûáÊ.¸¼} àúêbžDÁã¯÷Wóß9»z4ñµåL¢_Ï~ûÍ
-Pú—3Ê,g{ø`!Ï21ÛœE± ãHJ‡©ÎÎþ90ôfÍÒIëq
-©Ä„ù"î™3˜åRÍ’8 •ÒØ/ CÔXAÂ,Ž…Au×éåB×ùS¥ç ÅXpÐÝûï¾äUYä}ÙÔ'ä‹( SÁ·ŠüöŸ÷oO%iÈWÿ“õ¸³,Ž¦­‚&À4bâm^´Ž/ ºǬÆUŒ‡±àÑ`d!fƒ9V3%B™€ðJAdJNF¾E] eÆ
-¼bÜÆR€ä†â#c¸*\Zx²D$0²0ÉW³¯3²(Ë$y°Ñu´A¼»ÙˆÙeÍ<¥ã…ÏÙ(¥„9o@ûKT`m£SSC`ˆ$ šŽiЯ-âË\°@ãŸCGSUÙõº Ù²väeG=—,ø#ßl+MSyk9½ÌE``AbÊ(njÂoóv¾ˆXЗË]0äåù‰mÓô„òıX©j 8
-h
-MoÓGD* Eš¥3?~,®0‚ãLA`)þcQª\
-sE½*·&3BGàŠúh­òS×صP˜õ¶×VíEÊÈCÝ:
-šŸh{ŒnÓ¯ºxp­'´•+;ö4‚ÂptÙI+‹7=&
-~å]·ÛØÖ5w”N%jhGÑ‘_Cã“[Cƒõé3*@‡÷SUö.°§êNÀßÇuuØÂ7ÏCѨ۶1úOFˣ㠟uá/±êä.? ¹ƒ×¤W°aMüÊ VhztÔG²e†Á³k÷}«Ú¼g1eª>,ÕE¹„\ÅòÂRªj€v§0Âhrœ£mpo(%4³ŸYÌîP臚–ˆÐO¸ˆž‚³bBº¨D”3.°&BôXèà÷yua¡Ðt[Q$´8kwÉiµ1°uNè› eSÇ^Þ
-ASþæåÈ?Í°Cø+oG(¦ˆùx> >ãQ(#%üë‘Pq˜%‘r¯Mà^ÆðµéŽ6í¶Û¦ímW¿~iûWôÀp•æ1(†\-1Æ «9ÌSAGÜ;šÈÍM
-'-@È£i7ñ09(+3@unj @&sQØN×.¢äz=3.™TMóe·í&_’núÓ[R^u¶ëÝu¶­éíæ.e®GÞä_,ù×nËñÎæZávžÂ‘_ÍuS»›Úé.Ë|K[¦ƒ>t½Þ]¿ŒäצT ‰¦ÜS[^Âê{N·Pë>Àg4XŸÁå·#DS'tÿ"-Ý… Ã¼e<¸¿þ@ÓКH‚
-½N–Üv€¶7giˆ»¬ìjr‡ó)ï—Ufï ‹®,4!º!¬áƒ®“
-¾É¼é`rNBV€®T·S˜šøŒlÞ:¤}­ ÅcÃYw‚õ´ç¸ç9ºUBó2>eؤia»•Ù3 ä§tGÚÁ÷…òŸ2¼ðœxœ ;–M,å–¡¡5My©¢äàdó
-óv›OÔh¡ë]‹fF:·ïÙÐæÀIŸd’9oE°×&²9`ì*‚¦*¼pN1³ý´~--8tÐqæI ÷ aÞ‡‹/I‹Y”$ÁG³©ÙÝ6íH<ꬄó @MXŸP»à‰–*ë¼=]•?éʸØ…',L’T‡)öD¶à«8øR7ûš@ªÊrí»¾…ÄÓ[rð9U…§]OX¯0ŤŒƒ\À_Q4»Ýg‘†ÞL
-m,MµÏöêÞû•p ^Œä¯8剺?ÀAVºVê"„¾õUçÏX•kdýêWÊæ»ûŸr2¿P¾õ¬ :’rr;6<þðO°ã…!JB™¦rZr¨ç(¹¤BÑ…x%»û±vBøÿS½Íendstream
+xÚÝ]sÛ8î=¿Â/7µg׊HêƒÜ»Û7M³Ù¶iš8mÚÝ}-&ÖU–œHNšüúR–l¥íL÷á榓ŠA
+ˆÆ> RÔÙyˆÙ°. rŸäŸíœ‘V@J
+»îZú–4×Æ<˜³…yvA„†¤àyižiD
+d…§°GûCÄIVú ¬¶a4ssijt
+Ã<©jØðD•'vE½Hj7ÒÄ ½f•%E–U„ û_$Yá5f£Œ=¾™!j>”k0`³ZA2Bu•×4DÚ‚æ³¢ª5ÂË+žP¬o‘‰å:OiÞx8“b³@œŽNÎ&ohn[ëm®PÃ=n˜YµEjãKÍ _ÂcŽ¤± 8 Ñ7æ +&ÂŒ jŽž‹äNo-x{Ji ²—yŸe5aTÚ0dŸ
+c驆¬#ò§ï‹äÚz¼p§]aéðPÙÖ(6'ÞV"ºJôÈ#;É¥76ýƒâYQY%>òê:·aþû›üÿDšbÿiêû¤ s"SÂwÖ}ø–ÆEF±Tþß•'×àkè.z… rAËaÜMrá5í ð&5¸•ÿIEy¯ï ¢‚[6Ûuvh…|ܤ,žYZÌî[öùƒy1ð|Îd;1
+? Äˆƒ„†Š¹¦±‰…𜭳<Ý'†—å›]ØMäún„Y°nè`J
+6«Vå­( 0Ò¶ÙÛbÍ Ö§ s”­\gÚ¥)¿|XÕ– Aé¤=W®0ËgeAð?ýЯ´EžéÏÑ®€²-K—.ñ-Õu’å¬b˜œXDU®p +‘«¾PŸ¥´ŠoØ-vz,ßbÕ›y]ñ§\üV~+{)*
+¶ÎMQ‰E˺.—Àïœ^mQn$ßu ÌZ$é4ÅT‡ÉXò¡.’™Q¨Ê0e顇+[z Ø–[îÊ¢¯ZÊ:"’§EUéy?pi $wÕl¹²ÊGâ%±Bg
+î)ÚË{[²66CÇkÌéz’V¿ôÉÈ¥Ìñ•£ûöî*âæÆ
+cKðˆ:qjíÐrÙ¦¥*°(¸¨3_±-ÿ…!”h‹ur¼Œ³¨ÇB(¦<!ˆäÔnóŸ{‡žôcÕ>óþDÁ ßZ¬¹) a×J“ÂçX¾³ØÆ(˜ø¬hf6ìÖåí!Qœ$¤Š@à7óÕù
+ês‹þ¯Š±ÒYŠã\"‚ËI×!Ñz¶ÁHè7îøk©˜î’
+¶\‡?í:$š¹‘–IjŒbw_óÃo‰'[â=!˜L Âï—
+ `WëbŽ?ɳºi¶€j  « Ú%.ËA¬IN‰É„f2ýϺª·6B½=«¬ska×¹Ü-#ÛåjE@LFø¬æ ®10v›;4ã戀Îfž M<úg–-¼%PP1$à}xÅòë\ëíVjÀ¸ÆÁ@ÀéI'1_Ú¹Ûë ÎZMP‡>nã›h7voSÝäª1° Õ²#±¸ÛaHJO©(êp´ÓŒm°¾ÅˆžˆTÔå$¡ûM_K™+‰N¦¾¡‡¦ÏÞÆßÝ~‡jK•®±ö¤"˜€TÇÀãÚ[ì(¢Áú' Š<… ¼ÃŠÉ)XØljo¬z²&–¦<õ kã
+—s]U„NŸû‚|- K
+›>RÛØ-N ƒÆAzKè‘ê«d״̆wI¾¶CÇj†"@ßõúz/(\Ä!ðþâ„w
+æáp`Û 1ž`>)˜“» ÇAéæñOl (‹GŠJ%ÁÃ0g#ºS.@ÐèÛ@Ëym>x跰˧¸é‘÷~‘Í6¶s›¯B]æÂv› ^Ìþ]=š زmzƒœ‡î\
endobj
-1132 0 obj <<
+1436 0 obj <<
/Type /Page
-/Contents 1133 0 R
-/Resources 1131 0 R
+/Contents 1437 0 R
+/Resources 1435 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
-/Annots [ 1139 0 R ]
+/Parent 1424 0 R
+/Annots [ 1443 0 R 1444 0 R ]
>> endobj
-1139 0 obj <<
+1443 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [349.4919 62.7905 408.4801 73.5749]
+/Rect [411.5778 307.0154 489.9929 319.075]
/Subtype /Link
-/A << /S /GoTo /D (ipv6addresses) >>
+/A << /S /GoTo /D (man.dnssec-keygen) >>
>> endobj
-1134 0 obj <<
-/D [1132 0 R /XYZ 56.6929 794.5015 null]
+1444 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [55.6967 295.0602 134.1116 307.1199]
+/Subtype /Link
+/A << /S /GoTo /D (man.dnssec-settime) >>
>> endobj
-218 0 obj <<
-/D [1132 0 R /XYZ 56.6929 285.3652 null]
+1438 0 obj <<
+/D [1436 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1138 0 obj <<
-/D [1132 0 R /XYZ 56.6929 250.4165 null]
+230 0 obj <<
+/D [1436 0 R /XYZ 56.6929 439.2963 null]
>> endobj
-1131 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F62 1062 0 R /F65 1137 0 R /F21 714 0 R /F39 899 0 R >>
-/XObject << /Im2 1051 0 R >>
+1439 0 obj <<
+/D [1436 0 R /XYZ 56.6929 409.315 null]
+>> endobj
+234 0 obj <<
+/D [1436 0 R /XYZ 56.6929 215.0565 null]
+>> endobj
+1445 0 obj <<
+/D [1436 0 R /XYZ 56.6929 187.7252 null]
+>> endobj
+1435 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1143 0 obj <<
-/Length 1018
+1450 0 obj <<
+/Length 2621
/Filter /FlateDecode
>>
stream
-xÚ¥VK“ÓH ¾ûWø°»
-÷öÓÜØP[!›ñ°àà;Äà×ÆÉ üûU·ÚÆ™1Ãû ~I-}ú¤jæRø™+BE"Ý(‘DQ¦Ü»Ú¡îgØ{ã0{&ÓS/SçÏ×"r’„<tÓýÄVLh37Í?x¯þZnÓÕθ¢ž$~ Bê-¯ÞûŒ1o¹yµºÂ­«Í5^¯–~$½ôf·‚ÆB*@/±šëíûÏ]ßl·ïv¾ˆ¼Ö”/×k3ñ?¥oU:F2–Q¡ÃøÏùð‰º9ýÖ¡D$±r`B KîÖŽT‚()Ä°R9×Î?£ÁÉ®QCO‰˜¨˜G3ðqæ2F¥ø~*!¡àÂà§Cg€¥
-žœµð|c
-‰”ŠÌ˜ x(`hÿ¼RrùÇä–ä ™™qr‘ÊÇ´`„>÷CùÅp“R÷ßpÚ~·éN§€"Jäq3Ÿ{@uë'ÅÌ[‚Žýà·_.?u2""ŽùGÉ{ACó$œ2Ù=Ÿ8O]ÿŽ|ƒKendstream
+xÚ¥Y[—Û6~Ÿ_á·•÷Ä*EêÚ7wâ¤iš™ìŒÓžlÛMÛ:‘%Ç’çÒ_¿
+Ò‹†Ú¿µW[îH´;;fÛœfÓº>²ù` ÜÖÇ¢Ýíé³:íï0&IœWjvõ©\“ˆJß[†üpÐ9÷‹êl¡óÁÛÅÇшíÙÌÖLÉ·[¹uú¬H‹`u±W4IJÚåÕÖ~·ž ¸‚œ¤cQ1_N‚éÃ(‚dÄ-›¨ÁÀQ©·ì+cÜ
+0®±5*¾Ÿf¢7ówcaŠ¨@"8JçÇõ¥FϘ¸Ôeicи{õAó¶¨y94¶@ÝÔÇ=ÇiÞh–áøÆV»+ÚƧ4ÐKv—³Pú
+ê‹Ù®xeë÷ËkÈ÷=“Ì“
+â¹¼YÌ—‹1³‰Çynï®ûdž«k4(§ªÀiÖå*Ô2õcɹ
++X4B³ä‚º,!-›‘¬‹ËDD‘1›Y
+ç¾Ýa/ƒjôêD^œµõ¬û"Nˆ Ni°0ŠŒ<KÕ–X¨ž’8(&¼„ɆHºcIëºÒvM¢@y!ÂCþÔüÒÓÐ;5NnNƒ6WŽØÒ•{“B5WnˆEÖ¸gø"ñ³0ƒrj$ä'Øóºj`Û#Ö‹b?ˆ2fýÛèOqŠAê{.ĺŸ*(3±Çœ'Ñu±uÍý=ÀB; þ^·»zýmo.ñ(Ö”êÜ!ÁSÒ]uáaH\ƒ’ó”tTIà=Õ'›?5gÒ–—É×–`Û;]J$¾ˆ£MöÖ8-ò³$‰Á4~*Òüß#›ËüP…áäŒ 3F©YïM}ìVfíÜv™©©-ä”羇ì'ý0IÂ~ô˜¹•òÓ Ix3& eªŒZv0\A™=$½’ÞGãÑ3•
+$Ó1‰(fHq§ú77 G!Å9Êœã(ds*Œý0RV÷û6Å
+™­Çj°~<$ÁŸˆü‘™2X±a,aD¹#C¹9rÐY•(Æø$* †ï®äžÑZ¨dÅæ‰äYi¥¦ƒˆÞ´€¹#oO]€xŽ5kw•õnU]ÄhŒŠqÄÑÅÈÈ…ˆoqT¥ñYnlUˆ9MFý"8éÇÞ‡÷/é½aáÓˆ)öù'MÃ+w/À1ʾ‘×ôŠŒ“Æ63ªõ‘³`K#܆U$‰ý,•ÙwT€
+ƒ*k+\~:("õ©¤žž›8½lu…›ÜîžÙ¦¶·ƒsŒ¸M«®sDekF3
+ÚÄs°–0X›>ÜÃd5Xð`nªkJEæ¾ áèLS6 òÕ΀ ˜Ã§€†U‹eÍ܉p€¶„=¼;çÌnÎ>vÀTÏ]*’ÊÌB»3X|K ~"€;²®­#é'Aö‚m±×#c)•Zv¼F#ÐŒà>»!µÇ‘:øDÄá9PçÀÂ!’~h}Ä+PV
endobj
-1142 0 obj <<
+1449 0 obj <<
/Type /Page
-/Contents 1143 0 R
-/Resources 1141 0 R
+/Contents 1450 0 R
+/Resources 1448 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1424 0 R
>> endobj
-1144 0 obj <<
-/D [1142 0 R /XYZ 85.0394 794.5015 null]
+1451 0 obj <<
+/D [1449 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-222 0 obj <<
-/D [1142 0 R /XYZ 85.0394 769.5949 null]
+238 0 obj <<
+/D [1449 0 R /XYZ 85.0394 544.6974 null]
>> endobj
-1145 0 obj <<
-/D [1142 0 R /XYZ 85.0394 749.4437 null]
+1452 0 obj <<
+/D [1449 0 R /XYZ 85.0394 516.8643 null]
>> endobj
-226 0 obj <<
-/D [1142 0 R /XYZ 85.0394 622.33 null]
+242 0 obj <<
+/D [1449 0 R /XYZ 85.0394 467.6389 null]
>> endobj
-1146 0 obj <<
-/D [1142 0 R /XYZ 85.0394 593.7503 null]
+1453 0 obj <<
+/D [1449 0 R /XYZ 85.0394 439.6503 null]
>> endobj
-1141 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+246 0 obj <<
+/D [1449 0 R /XYZ 85.0394 266.4633 null]
+>> endobj
+1454 0 obj <<
+/D [1449 0 R /XYZ 85.0394 238.4748 null]
+>> endobj
+250 0 obj <<
+/D [1449 0 R /XYZ 85.0394 132.4384 null]
+>> endobj
+1455 0 obj <<
+/D [1449 0 R /XYZ 85.0394 107.4147 null]
+>> endobj
+1448 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1149 0 obj <<
+1458 0 obj <<
+/Length 2222
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YKsã6¾ûWèHUEX<ø<*¶&™lÙãÈò¦RI4 IÜ‘HE¤ìq~}ºÑ
+"¸wóëÝüöãõt&î­–+Îï®ü´¤ñíünþÃâvqk"’‘wýãü~µ°«¾•4¿ùßT;7´ts÷@ƒ‹ù4ò½Õãrñ0ýcõÓÕbÕÞ¤[Á^ãÏ«ßþà“.ýÓg*‰ƒÉ L8I"'û+?P,ð•r”ÝÕÃÕÏ­ÀÞªÙ:j=0€T¡1Ÿ!Xr`¿ a¡’ÊÚ ¶àœ{×Uù¬MQnèªëcµ§ÑÝÃÂÚµ©:ŠÂûÃ)²÷H|2“1‹’$2âWÓDzfKàåö·Ùõw8 ½×êD´ÿŸê†F¥Ö¹å³üin¾—–D0gߣäùr~K´ãTÄžÎ*ó›Ã;*x¿luéÎÔ4ÈÌ뢲 EíèûÃN7Ú*Öò››Ã5ñb­-ábÙ6-@„RÜ{)v;mÓgM£'­Íª°Ší«g¼.¥¥˜3pp~¤ ïóöA)ò—6Œç\¥›v,õ- [Й¢{¿îb¢1|c:GOš~7ºÔÇ´¡Bòš´ËÖj}¼ôÄ‘©¹—ëº!m_5èE Tò‹“P´ü] U—(ý M")üZ*žx§Z·Jv2ˆEQ‚,QÖ§C†9ÌÒ16V~ š§ÆÔ0¸
+àwMo¾ì³z„­ô ¿`l”V³K\p­üwàZ2Ha1¾@:›%•1RÚœHgãI¾ x:\°Yt É ƒ8… ’@MëºÊ
+ÂY»ÁºÇ2ô-‘Ïmc œ
+çö)`ô²-²­e:Õ±©iÖÆnœ#c¤òyDp´Û©>ƒÑÁjkˆ¡ô¬@„å|§îŸ;RŒQ'ýÐ++4¬ÙÊI=‘&r)­í/ñÚ qÚ5D®Öô[W{MmPÂMº£¢‡Šäír"튵nŠ½¶‡Ù§6ºYI9ÖóN©º¢Õ´ËH.¢Ô:ª›Ë!aW9@½‹²ÅÞ±§°³½©Ý“:4¦ŸU™éwWÊ‚°W˘…ƒO÷«O«÷:ƒ!áä­Êg¾Ï]yX•0þ
+
+h!jˆQÈØpCkÙÙ®§ Eô·6
+ŒÁÒ¡â®äùÌ€çÒ aÌ ÌwQ¾ílÓù±$í{ïœ>ØQãÃÌU:®3[W'W¢P?ÒÿP­bHQ‘/'aÀ „'øŘ֎› –½OÌ-û¬ÇO_˜Þw.¯ó ³NõIh‚εñȈ¡5êI¿øÌÝ2}]‡ Ym8ö¡^ ¿®œÇ[ïù×ñ»ÿoøЇƱ×\F1ócb•BÅe|¡¹ûÚ©úßúQyrendstream
+endobj
+1457 0 obj <<
+/Type /Page
+/Contents 1458 0 R
+/Resources 1456 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1424 0 R
+/Annots [ 1467 0 R ]
+>> endobj
+1467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [379.778 61.5153 440.978 73.5749]
+/Subtype /Link
+/A << /S /GoTo /D (managed-keys) >>
+>> endobj
+1459 0 obj <<
+/D [1457 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+254 0 obj <<
+/D [1457 0 R /XYZ 56.6929 769.5949 null]
+>> endobj
+1460 0 obj <<
+/D [1457 0 R /XYZ 56.6929 748.2119 null]
+>> endobj
+258 0 obj <<
+/D [1457 0 R /XYZ 56.6929 682.7685 null]
+>> endobj
+1461 0 obj <<
+/D [1457 0 R /XYZ 56.6929 651.6058 null]
+>> endobj
+262 0 obj <<
+/D [1457 0 R /XYZ 56.6929 598.1176 null]
+>> endobj
+1462 0 obj <<
+/D [1457 0 R /XYZ 56.6929 566.9549 null]
+>> endobj
+266 0 obj <<
+/D [1457 0 R /XYZ 56.6929 448.4378 null]
+>> endobj
+1463 0 obj <<
+/D [1457 0 R /XYZ 56.6929 417.2751 null]
+>> endobj
+270 0 obj <<
+/D [1457 0 R /XYZ 56.6929 351.8318 null]
+>> endobj
+1464 0 obj <<
+/D [1457 0 R /XYZ 56.6929 323.6339 null]
+>> endobj
+274 0 obj <<
+/D [1457 0 R /XYZ 56.6929 230.1472 null]
+>> endobj
+1465 0 obj <<
+/D [1457 0 R /XYZ 56.6929 190.6255 null]
+>> endobj
+278 0 obj <<
+/D [1457 0 R /XYZ 56.6929 125.8181 null]
+>> endobj
+1466 0 obj <<
+/D [1457 0 R /XYZ 56.6929 94.6554 null]
+>> endobj
+1456 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1471 0 obj <<
+/Length 3064
+/Filter /FlateDecode
+>>
+stream
+xÚ¥koÛÈñ»…€ÕD,—ä’Ëë'_ì\rn×òÝáp¹4I[D(R©(ê¯ï¼–™F-x‡³»³3³ó\E-<ø§F»^„‹8 ]í)½È¶Þâ æ~¸P²fe­Æ«¾¿¿øë» ^$nùÑâþqD˸ž1jqŸÿæ¼}y{}·\ùÚsBw¹Ò‘ç\^ý¼TJ9—ß^_ñÔÕÇ5ï®/—qèÜÿtw ˜8Ñ>lSJvÞÞ¼•uRŠÏžöÞÞ-ƒØùõö~©ŒóéæàdvýÓíí'š½_þ~ÿãÅõ}/×Xvå(Ô¿.~ûÝ[ä ‚/<7HŒ^áÃsU’ø‹íE¨W‡A`1ÕÅúâŸ=ÁÑ,mÓ¥Œ«Ï(ÓW 3ÑÚŸhS'nøiuýåJyhñÐmš}Ù¥]ùµi‹ý×b‚9t7Þbå×6ѹ_&¾Ó,WA;mÑ1pØñ˜Ö2Né#êßM-Ðc³gàîÝ[@ÅP·_çÐv–\¶±‹·iYwE ¨â `’Èy*êbŸvBµ;
+Sx©ý&
+Ÿ¸z
+(sáÀecàI ö„&rÓ*†Jü‚BÁ‘;/ÂPFQTù3XÊ:É[¸²”©t·+Ò=Î ¥Ý„I‰á3¯.¸¶ MzJ9±†|шJ)Àr”Э´­l) mÎKeK”NŒ“xqÖöÅ!•:tÞ7ÇB0ýLß/6ÂSÆ ];;.³‚ùÒp0Þý©mm8<xŒ‚öF½ñ&•ð#ÑðYIùp:ë”Ïú$¥…ÝZŠ‰Sksb²Cɼ áÍ©ëBŽá¾
+ W»¯=O¿Æ7o&º« vC†“¢ŽíöÚö¡ÚwéSÃÜ¡ ²?v¨$” ¨Öc{÷¨\7Š_×|c«DmRò$€>\½ð‘uÔˆº4Ʀ;ˆÔ¨V#m!"9¿©½:·clënl–
+S™åš0¶TÌÏ%ôhÚЭfÛ‰-J!•™ïú¾2óo…·¶­ºü¶$U!, G y×ëoÔš,pM–ö —ʺ—²:JYËRã÷F¤·/»Žì@)éŸÕÐ6·éVÖå¥48]³—cYˆ™¬·iªÜ†câä(M÷6®¹?‘ûõqÀåkßIgãæ§*'Š!äÊbßB&kù‹
+¿ÿðñŠ¡„‡œjÊÝFœ,Ô¶j m,À¬1;Êóïõ7~öÊÊV6È<”räAb+€l¡î¯o¶‘ź_ÔΧVßDαèoË oò9Rü6=Ë_ËæÐò #*öœ
+AÕ‘/=4TE‘1ýoXJ~Ázé×¼ýi×AÏ3üŠ×v»fÿrƒ%ÿ°%C_(€o銿oØe|‡y‚dC˜ÀYc=—Ú·¡"\ÀG^`ûV“)ÂgÊîJ;ˆ(Û–u^ì
+øC—·à°
+¹¹»²½ÎFX:N:!ÈG«'[;懪¯7@ä÷ë´ƒûv|!³A~ÒÍHÏR€~-³b¾œ”¨¹(áeSÓ—º9Öòô!9÷Øì¿0ƾÊ}ˆB6¿ÃWÅPr·>Ô¼jýö’1V_„:g“)ö,i3ÀÑ¥2MÑ¢gÏ$¨5Iʲ‚ò™ÊÜÄùf"ÜJׇó|k0w¹TÎõ-Ã`L;K .:u•vòXÁþð/=é“Ð`ÝÒže&DE°þªx(©]ìßËúðm¶ð¸†®Ï®û—¥ÆX’7Çvò 1Á¾çîK¿ŠCÅ?eÏü†íõ?Sÿß¿˜ÿµ ŒÝÀø1|ìä¹êË
+î'çœ÷?­?gý?û”ƒendstream
+endobj
+1470 0 obj <<
+/Type /Page
+/Contents 1471 0 R
+/Resources 1469 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1424 0 R
+>> endobj
+1472 0 obj <<
+/D [1470 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+282 0 obj <<
+/D [1470 0 R /XYZ 85.0394 769.5949 null]
+>> endobj
+1473 0 obj <<
+/D [1470 0 R /XYZ 85.0394 750.8067 null]
+>> endobj
+286 0 obj <<
+/D [1470 0 R /XYZ 85.0394 180.7476 null]
+>> endobj
+1474 0 obj <<
+/D [1470 0 R /XYZ 85.0394 140.0669 null]
+>> endobj
+1469 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1477 0 obj <<
+/Length 2492
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sÛ¸ñÝ¿B3×™P3Mð›™¾ø_ãK›¸±Ò™Îå ’ØP$CRV”_ß]삤dÚÍ4£.‹Å~c‰™?1 B;LÜd%¾8"˜¥» g¶¹¿]¦Y¢Å˜ê×åÅÕo^4Kì$tÃÙr=âÛN‹Ù2ûÃòm!ì9°p¬ûw7ó…8Ö/BðÙ œ›s/²þ}¿œ‹Øúðîp<ûðéþþƒž]ÎaïÀµnÞ^ß/o?Ò´Ï|¯ßük.„°®ßßܾ¡©7ïy§ßn¯ç‘o-?}¼}˜ÿ¹üýâvÙë5Ö]8*õõâ?Y&øý±½$f8¶Hw¶»ðÏ|Ï3˜ââáâŸ=ÃѬ^:iKáØ®ºÆtÅ l•{bÍ ±CÏõk‚u„ã€=Õ¨¯û¼Í;Õ¢rÀÂùÙ-ÜÐvƒˆ<ñ Ô|á‹Èê¶ ¼}øªÌªáØʪt¿Se'»¼*izMs‘•—
+S€ Ì>_Ô‘HA… ňÿZÑ·LÕYtR/uøƉUË.Ý‚‰ô`+d
+FYKÌ4ü‚óÝ
+¦ëúB€¤:ŠÌÕ$'ù.”ÍmÎlÌWÒ§ÝJ3#¶E¾jdsä-WègL‚8Ï…Õ3§$z9e€¸€˜-0ªM¤{ŽËq
+¨¼ìT³–©"¼v )î
+‰×t‚Y¹gÏß%ɽ׆îO¿€4±g‡Qè?Ï‹Ö9À‹AZá±2¸&ڮ랜)£'–Ð…ÖE„3/ ì0ŒéPy?zI B_ ¡pìÀsArMña¾>I…®u{nàéDn4ó8±<_o=û:¶ã£4ÑÖº6Ј«»;{SF³‘R†ñbÌY+ŽÊ$¶
+ö@fdžàõô1C¾Ex¸Áàq7jÕ´úÈC„dªÎ,ÅV™ ·“)¾›ÔpÔê¾¥Á×±;.ôcÇ×~Àr¨ qX7Õ\ßâ=ÊdüîëLê6ÉsùöÌó-}¡€¹ÐPÒ`¤Ok©ÝÑU[¯mx›:ð l೘’´åþ ¶Ê9\ ö»•.B0ÎO9aú¡E¡U;Ð5:Â2h*P-¯lÇ3p¤ÆyUôMá…Öø<ÉJ?Ll¸ÀdzqÜÿ\*aÒ ô[‹áMóç}œ>ÔWߟîø ™çø6&©~Úã \x÷ya%L">!wIO_U“¾ï¾ä—‰Ž°:*5áŠ÷0]Б†Ú 8[j8Nöìèb
+Ö‰Êùª i.˜Ã3@Éáîôüêk5pÞ>ÿ:°8Bø¡× ó„ÝÃäÛÁ‡U'äƒî0 DM*çÉS´çØQì‘ÿµÓcoðµ¡m×Õ¯¯®‡ƒ §Ù¶…]5›«¶Ú7©ºbÔ‚ I'{ó}úÁ›v¡ªwû­k¤¹Ä÷vÕ+è:^”2K øþmMÀÿ)Ïu]S'}ê@ÓŠ<ótÄQPTθ;øqSó>.jÁ@6¥á> Ï×¾‡Û^ä‰Ófñ¯D³ÊËl¡Û–+
+endobj
+1476 0 obj <<
+/Type /Page
+/Contents 1477 0 R
+/Resources 1475 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1478 0 obj <<
+/D [1476 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+290 0 obj <<
+/D [1476 0 R /XYZ 56.6929 769.5949 null]
+>> endobj
+1479 0 obj <<
+/D [1476 0 R /XYZ 56.6929 749.1192 null]
+>> endobj
+1475 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F62 1352 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1483 0 obj <<
+/Length 2317
+/Filter /FlateDecode
+>>
+stream
+xÚ½koÛ8ò{~…; 21|è¹À~È&i/ÛÝ$׸·XlY–c¡²¤JrRÿû›á²ä(Û^‹;†Ãáp8oÒbÆáOÌ"Ÿq{³0ö˜Ï…?K·'|ö
+ßïs9·o¯gfïßßÝÝêÙÅüÏÅÏ'W‹þ\ó ®ðPŸNþø“ÏV ‚ŸO8SqäÏž`À™ˆc9Ûžx¾b¾§”Å'÷'ÿìfõÒ)]ö4 S æWm+$‹cߛޖƒaBÁ_Öqàe@»bÌê`ê ÌW\ô¦–rVˆ}_¢­cÎB&}ì­oPÚ2f~à $ØH\SÜÎÝ@€%Ü@:WÇö
+_Fˆíé>deÖä)ꑤQ ¡T >åiæÐ@…JŒmîºõG!\ÐQ™l³¿)cŽGâfë“ß}Vüâ¢&[çŸ÷žJמ`˜Î׶´çp³SÂ5óÈÙ•ë~þy 8Ü<"?4×¥mò1›Øº›˜¾!¢«2…¶ï%î
+dæž2×ëº <êù6žb*RÃm0ðˆRÁˇ
+ꂤ¯Ž
+]n¯Ëã›QßYjR2¼{ËcЃÏQ0žµg<ÿõ20ú°÷Èÿ[)kIBèV@¼Ã'M¿¡lÙZxß\®¦Lô¿¬[˜Ÿ^[ŸùBÕ_–1q¡¾@Y&ukkš¼3Y¹û‡¢ã6ÊÖÏÑÛÔOÝ0éú9U594Ø}¥z©j†ûCaˆPÄ N1S~èKúÿ‹¥ËƒÜeÈ)‚ðQ‚AzÆg»-S}“)¡#°I
+Üxx3‘m”Œ^lŸÉHÙ–!©ëöÌÄ
+¸¿×úJ«ÚMµ+V„_f„«JK¸&DgW^  ¬~~R¾·QPܪŸªŒ4f©È®W–b5í²Õ/ýÌ€}RS?
+ðþeý»‚8<ezàîQ$§»ÅÉ8´BáÔ³Ç[_EÌd8!ú
+endobj
+1482 0 obj <<
+/Type /Page
+/Contents 1483 0 R
+/Resources 1481 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1484 0 obj <<
+/D [1482 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+294 0 obj <<
+/D [1482 0 R /XYZ 85.0394 629.0401 null]
+>> endobj
+1485 0 obj <<
+/D [1482 0 R /XYZ 85.0394 603.8306 null]
+>> endobj
+298 0 obj <<
+/D [1482 0 R /XYZ 85.0394 304.8197 null]
+>> endobj
+1486 0 obj <<
+/D [1482 0 R /XYZ 85.0394 279.6102 null]
+>> endobj
+1481 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F21 930 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1489 0 obj <<
+/Length 1904
+/Filter /FlateDecode
+>>
+stream
+xÚÝX[sã¶~ׯФy fL^;³^­·Ùl²v×J;™Í>Pm±æEáÅ^å×÷€¦$:M“¶‡ÀpnøÎ@bÎáOÌý€±Œçaì1Ÿ ž–3>¿‡±¿Ì„™ãÚIîxÖëõlùV…ó˜Å æ뻑®ˆñ(óõö“ã1!ØTpçæýêváJŸ;‚?qŸ¯>.Tèüx³^ˆÈ¹~ÿdfôö‡››k=º^€m_:«o.oÖWiØ3z/ßüm!„p.?¬®ÞÐЛÆÒÛ«ËEè9ë>^Ý.>¯¿]­‡¸Æ± ®0¨ŸgŸ>óùRðíŒ3Gþü :œ‰8–óræùŠùžRVRÌngŽFõÒÉ\
+Τ
+äD2=1J¦à0*T0½aHÙÄ|íÒVÊRÀmZ±¥ÓŠ¬ºÏ«ŒÚm¿ß×MG\ßæ÷õêª8h=˜å[)Gæ]°IÎ]Å™'Á_4Ýü™æ¹:9õ?áiÚö]Mý$M³"k’®nþ-—?d_º ÀB9Í"rú
+Û ^JÏè‡âÃæÈ0€­ÂµÉ~ß.ë}VµmAˬ»Ø¦è¨ívÁî1ıц&±³Þå--|Ê £:麬ÜwÔÁ¨ñ›Wy—'Eþ‹±ÙíLÃÔRdk)èÛBÀŠLλ;£Ãè“àãÜQÀü8ô¡%Xìû„¬dSdT2Ú6|·æÛÚo[жw}Qt½]\ë÷‡P Õ`%g´—ºÊ¥T¸aÈüH„&?ŸÌF?&yAÞ`÷óDba]È£à(¯:4éûLÆPÊ$óLÍ`TàSî°Q÷ݾï°íaR´,­ò:E´¨ØЂ£/ E(ÉÂ0ôŒ#eò`,äUÛ%s×ý)ðïÙsZð´ËÓiê4jߌ–cïËz›ÿĹ̶Կ|ÞÞ~G¶Ï»ŒVÃ6ž§\*`(Øz²Øî–”9O*ø¾gAAÅC_öm3J Áû‘Ñņü
+ $íðˆÅ€™ç#A.\Áa_÷y±Íº)¯ß}0 [Pu;j!âëçŽpÜx*Iêÿ¾Ë`ÛD¬œÍ {¤[1"—›œ¢ ¨Ó¤Ëk³¬¾£¯öœ´o»ºtQ]GCCÒõê|Ó$Í:%Ì5ÖòvŸ¥ÃŽ¡à1OŒÞºBù}OÐcƒØ”©ƒÓä9uL˜ä­/gð®n¨ñ]^õ_þuúÖ‹X:¦ä‹¼z8Ý¢ ò8ßë@êÇ|›5xì^Ø%`²mI@IÂÖÆ(Ë*,ù­a”êÄÔYPzg©èùQ±¯õáYï„2ÞhØ'”RZ@ÚÙ—W74ô>;ì33ªydioø¡êŠ áéI-KY@¿FWÒš/­VÒÝhšÑ&¯Ð $P jGDÔ0ëÉ.&KfºÅ°uTžX%|´¢DàYAÑ®n5‘)©Õâ0%1v°fGË­“(ÒVI¼9˜Y[*%”!q¹¥’†À` é ;cpµ¢1`¨­–„ÖçÎÎB'…`éö9^ÚÜ´.ˤÚØ´ãVÌèüÿšŽ‘tK_Æ–°[x‰ñ©œšùl >Ýåà‘9‡V«W_ݧ)u0ö¯LÓ%èº
+¼)Xݾ­'§€·& }.´¹6;Y—V
+ѤR“¢éÊ$Fß÷ìà„þ5•ÈNÅ
+Ë}‘äÈDŽádSã-G†ã;Um¤Ouó
+vɣќÐGÉ¥å`-5nÕ,íFžÀ%!oˤKwlj ®|‡±Z«¡°VC¼ên­…>ºm €}¢ë E5}ŸÃ¸WÚsT²«û¬ßd'zÚ¤4-}ʇ`k‚½áppá i¦<Ü÷p¢¿;†Ò|vÏ3’Qï‹©óÿò®Ë ÞÒ1‡]Ø—‰yú/>÷W^4¾ÔŸÃ óÀ]ä/~]+Ì÷Ž
+:Ö¬z9zŠy*ˆŽž º„ìá÷‚%X$xpfæWÞ#~,NŸRgyÀ"¼¬ÄÔM^™3c‚´×úšS×Åo8 «X±ŠÞE¿ÍZ&$,áE\&ÉÚ¬#)ÞØQÐiS¦i†öø£Af„Z ýæöû ‘sÁ:M'ÇìØ]#ös²Ã=<0Îã bÅÊÎ&û±s"Š"vªì‰ž]
+ÒʽðäÙ&sàÐKrsëCÏ.”R ÔQL`Mø, ý.òI¨AP#¯Ñ„ž¬mÔ›
+endobj
+1488 0 obj <<
+/Type /Page
+/Contents 1489 0 R
+/Resources 1487 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1490 0 obj <<
+/D [1488 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+302 0 obj <<
+/D [1488 0 R /XYZ 56.6929 596.0056 null]
+>> endobj
+1491 0 obj <<
+/D [1488 0 R /XYZ 56.6929 566.6651 null]
+>> endobj
+306 0 obj <<
+/D [1488 0 R /XYZ 56.6929 532.1171 null]
+>> endobj
+1492 0 obj <<
+/D [1488 0 R /XYZ 56.6929 506.5445 null]
+>> endobj
+310 0 obj <<
+/D [1488 0 R /XYZ 56.6929 353.6477 null]
+>> endobj
+1493 0 obj <<
+/D [1488 0 R /XYZ 56.6929 325.2657 null]
+>> endobj
+314 0 obj <<
+/D [1488 0 R /XYZ 56.6929 132.6175 null]
+>> endobj
+1494 0 obj <<
+/D [1488 0 R /XYZ 56.6929 107.4872 null]
+>> endobj
+1487 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1497 0 obj <<
+/Length 2294
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y_oÛ8ϧ0° ¬|ˆ‰Ôß
+ìŒê¥}¾ d챈zœ)DŸ3ƒÄ ¥Ú™%ÆÖû«‹Ÿ¼ËËõêO×y‘ÕÇЉ¤ÕÜ«Z¿©ª¢&2]¡kÔv~CdU¤+ŸçÕÅÕ9Q 59‹˜Uå'×wk•÷)oîy·{E’> j¶gÙˇY­O
+øղɫÒÁs
+IÅL/ëñtŸÏîû
+‘ÚÁqñše6Dzºõ}Kð­k³¯¯›¼ÈL:á[Y¥¯J!µ±XIOç:r®Ã ÉuŸsù锾ºa{ŽV2O#(r(Í…ß“©43­÷–Â
+}s´B[x`}w¥¾hÑN©š—@ßý÷­Ä'þœ+¨ÛKSVµ[?«N[ÂÐârx]Po]þÍ!SaXƒ"À\®òGT˜Äñ@ƒõ‘ Ô‡á)‹g¹8B‘«9FŒ]8zÈ5ë}Yä¼E‰¥ya¶§–·=îýš ¯Z[ý¦IõmiÕ0{¹žùŒh‚{d³°C D–6)æ“í—$à¶Vc‡o›ýíøS’0_‚D´³ïáÒZëÚhÕgÔ¾ðFÅÍ龦 ¾EÇ è0–‹Ö'Ç'½
+¶ÿ©ø‘#ãXôñ”nèÄ"‰ŒRèV)÷5oÿS8Tý/Þn­™endstream
+endobj
+1496 0 obj <<
+/Type /Page
+/Contents 1497 0 R
+/Resources 1495 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1498 0 obj <<
+/D [1496 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+318 0 obj <<
+/D [1496 0 R /XYZ 85.0394 704.2027 null]
+>> endobj
+1499 0 obj <<
+/D [1496 0 R /XYZ 85.0394 675.9152 null]
+>> endobj
+1495 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1503 0 obj <<
+/Length 2284
+/Filter /FlateDecode
+>>
+stream
+xÚ¥koãÆñ»…€×\¾i¤ŸÜ»8‘]K ÐÜJZYÄQ¤Â‡\å×wfgø’ØË…?h8;;¯Ýy­åÄ‚?9ñ|áGv4 "Wx–ô&ëý•5yµ\I¦1"³OõýòêúÞ &‘ˆ|ÛŸ,·=^¡°ÂPN–›†+¤S`aOw‹©i{–ñ) øhyÖÝóÔ Œ=-§24ÞŽW??==êÕåd{¶q÷îöi9{¦e—ùÞ¾ýe*¥4nçw³·´ôvÎ’îg·ÓÀ5–??ÏÓOË®fËÖ®¾íÒrШ߯>|²&pÁW–p¢Ð›¼Â‡%dÙ“ý•ë9Âs§Á¤W‹«¶ {«zë¨/¥%lÇ·GœéÊ1gºðƒ€œùשé[–±ÉÊR­ÍÏêô¢2B©ÇûCªD¦*4óúÞ¶{̬‰éX“ž£Ù,wI95'2:=?&5•#SU2Rê"©NøÕ.ÎO¿¡ñnñ!@}oàNdUWÌ ÉÖª¥e®ëfûJ1Uš¿&/˜¤Þ¯TQæ{¦¨rZ¯KFlìDËà~EžgkË:…íÈ7´q*.ó¬DŬÀH*ZÙÇL‚*Ø‘gìs"&¬ÚâÇG˲׉ÊxêÐq-Uqä½Ú ¸^( Bõ4 F Ɉ¸Ú1‚¼¬‰‰ãïu+
+™eò’%ÙËÐJºùAq•ä™@wÃíÖ<ýÐø#ÏT»Qcð`4 nûY :ù4Uúîy
+‰vs( oæx•”ô€,ÇÍà‚è<©†N””Šæy¥nèóý–H³¼" .É©°‹·[†ÉY&?t:ƒ(
+äˆÀu<½ðm¡‡xš—Û¾p-ÉL1ô @ZÕÕ>ÓÐ>.+U4µ÷4~Ùv×™žÝ(t¹4Í”mÝÐ †ùr˜vÛSÓH¼# øüNÏ2­'R>½ŸßŒEõ/ªH¶'­%’ikèdñ¬n!„óק/9Èn_ÞŒ©1_ÌîœçÅíâÝ­c¿¶ÂZ—átª08F¿mdÞq_£~]<” Ê7ôûÐC±îë*9*^¶è§PÇü³Ú ‘egsu3 wM€ôÖ„cK¦ ¢ ·ØwÝ®Iñ¦¦´€ûâ ÖÍA ®Ê^’æâåÙEí÷ }¤ÉhPƒTÛ¡ßTa¬eÐÔ<B®\,~ħ‚ T(Ð…KT ï9&m\€y™ldè ÙÅRï['ôµq°ýp›£uG–1æ†i
+ajûvD +±“i«<OK6ïDø~÷„ÚÆGÛvÍq“ƒXu<0À3çÿÝX2…ä,—|ÉÐŽ„´dÿ3>¨V=·wôGG¯ÑT°º„•@jj("zìÄðsU'iEà+Ä-Òíóm>¯KÝ<·°6„X“êàp_[€j£¶qBn×Áõ„øg>Ó 6 ´I$
+ Ïð¹Îºf‰ªG«
+û>HuÀÕ‰~i¼æŠ@ÜGr
+ˆh¦¸‹ìãxX¦bm/›wœÄ’óþ*^åG5Èp0—©ÃƸ즫¹†H¸¦È¸®Ëâd^÷e_^$lž˜ÚAÄãFÙt%\Þ ð†•foz¾|sÕu$%}§Ñß9·(Z‹fDuxžÃíGUÉf£ü‰~! sâwdÇûñi6Ç*vö¾åD0R=±]pŠ÷U\¶ˆ ŽÆŸ·Ì–¡Ù㨟®†±EÂõýV,ºéîq~Oʪì˜P5ËöT‡Á”c\$&Ϭ®- K”ÃËÔU¤óÑŽÒêYÂ}XèksqÇ*Œ¡m¼ç7˜–·TeþF?Í´Zc#ɇK*ø4:¿è¢Zøî7¨9ú‚ÄÚ‡QÂÿ.¥)=!„2°ãŒpLH/ô$|÷ôãíݬ‚ x7{žõÚæèp²
+¦ã(N˼ôC"‚Ü9‡Ý<Bh:äMM¾ìï¢<©Å4E>(£º,š7(ˆ
+O§¬e³™4"’E=y5iŽ놕+Hÿù­ÿE…¢ëay½Ì}o›„»7£²ºx>jûXæfØÓµ½4h¹oŸNÆ^ÒOàó÷È»·Õö ÿ÷+{÷ï¸"NÚãY.ܘ°RèfǽмyŽ¿Tý?,{Cendstream
+endobj
+1502 0 obj <<
+/Type /Page
+/Contents 1503 0 R
+/Resources 1501 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+>> endobj
+1504 0 obj <<
+/D [1502 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+322 0 obj <<
+/D [1502 0 R /XYZ 56.6929 519.9229 null]
+>> endobj
+1505 0 obj <<
+/D [1502 0 R /XYZ 56.6929 488.8874 null]
+>> endobj
+326 0 obj <<
+/D [1502 0 R /XYZ 56.6929 326.6298 null]
+>> endobj
+1506 0 obj <<
+/D [1502 0 R /XYZ 56.6929 298.4037 null]
+>> endobj
+1501 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1442 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1509 0 obj <<
+/Length 2429
+/Filter /FlateDecode
+>>
+stream
+xÚ¥YKsã6¾ûW誥ª,/‚¤ošgœJ<^[“29Ð"d1C‘‘´âüúíFƒ%ÑÎV]e4€F£Ñ ZL8üŠI2®=‰ÍB.ÂÉrsÁ'0÷ñBxžYÇ4r½Y\üøAE“„%FšÉb53Çb²ÈþÞþ4¿]¼¿›ÎdÈͦ³Ðð`þî·©"˜ß¼}ÿŽ¦ÞÝÜñáý|é`ñùî=Œ
+Û0h›Ã½®¬Ä*Qª#m1‹¢(øä6uû£[À¦5©çàF½O€JhÂûÄt¨>Zþ!/ÓÝ3ñéƒ-œ;œYD…lËc€ù–ò˜oÂàkYíK" +Œ—ÚÔÍb;°B 9ø’Pá¡mht
+3¡“w„ßnˆLƒTB !6R„ØDSáæÑdHp;±Ô¨!åß#÷Ý)ÜõæÚ™·~¥T*»§Üî}oåAwm{¼%÷¸%¨!ıFY6-Ùùxí UÐ¥_kíiÉ­¢˜Åx3£á€PÌÒäîÑ¿ÚîÏåž6\Ð=HÀw&-p×YÞÕTs&™8{
+ÿCñçöŽë_´8—†Z0}bø€ž©'á RLnúz´¤Š}6¥Ôÿ…î$ê|®wg@ÝáÍúxõ®Y¢…v›,¨
+ ;÷5øñU^xrÒ˜{T᳑¬îÒ$¯Ëmp%/¶ÙxåIŒJuå…‹3Oµe‘µGBôéeCªšWäÕ[»Ì1“l=†}¬CÙ˜z4H¾
+AËwuø±
+ˆ­‚ÒÎþ"b_’C´8qHÂâ8JœZ?|º»þˆ ï—1ÀûÑçɺª!I# ¬
+øa/Íé{v»xÀ1`WÙC|u%^ŠŸ±øQJ»ÜVŠ8ËË™g6pY >yõàûl ì` 3Ïfcá¦ÈÜG;\¯¼jè8¸ÎÝyn¦¤–B§»!:‡!= ÌÁ/Þ Ã¿Ðýuð(Zì²{ò5ëw aàÝÞ—*WW+ø¹‚76&fÚãʉ}q7:ö‹ÒúngG©$Óa$FBŽ!D÷꼡çÃ+˜qãŠRÿ‰•Pÿ_Aãw÷hpsÕ1}ÿ‚N»¥6õ“G郹Ÿ(ýžH÷5’‘ÿ€5¶+¸ËÆ÷Ó.c±Sç%ÏD
+øÌI5Á_­ +®á½"c}ˆ1¯Þyç¾×PR‹DÔÞlÄ`!„B,:ÆNgH ~Ò]„£ý™ýÛ¢ñÕ®–€TÑ‘‡dë¡äØb«ª(ª}ï‹}Õ~#‚Íê _ÆTèrÍ bÔqeqüòÁÜèc‡Þ@ã/1ÊÙ>aÎps$ƒüÚ­#oבɄ,
+U÷Üa#âð]°öË8ÊÙñoÌX­p=ÉŽ\y‚ñ×~!ý…ÖÀ"ö
+endobj
+1508 0 obj <<
+/Type /Page
+/Contents 1509 0 R
+/Resources 1507 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1480 0 R
+/Annots [ 1512 0 R ]
+>> endobj
+1500 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (/usr/local/share/db2latex/xsl/figures/warning.pdf)
+/PTEX.PageNumber 1
+/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
+/BBox [0.00000000 0.00000000 31.00000000 31.00000000]
+/Resources <<
+/ProcSet [ /PDF ]
+>>
+/Length 557
+/Filter [/FlateDecode]
+>>
+stream
+xÚm”In1 EOPw¨u€$ÅIg0²Êľÿ6¤¤êV5 oʯÅésÀóή¯ƒÖ×O²Î Ž¢‘ÿ¨#h8Çùø:„5?ùÆ [ÄIÚL’~”F Ø PÈùYÌÀ¹dˆÐzZ8å±Ýƒ²ÙËò‘–Œ€f¾Å(ÌÀE#@x˜oL Û¹[ƒ±ñðù
+6\>RgÈbÏWÖ¹j[†›
+WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream
+endobj
+1512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [377.8384 431.1147 436.8266 441.8991]
+/Subtype /Link
+/A << /S /GoTo /D (ipv6addresses) >>
+>> endobj
+1510 0 obj <<
+/D [1508 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+330 0 obj <<
+/D [1508 0 R /XYZ 85.0394 640.7425 null]
+>> endobj
+1511 0 obj <<
+/D [1508 0 R /XYZ 85.0394 609.2714 null]
+>> endobj
+334 0 obj <<
+/D [1508 0 R /XYZ 85.0394 416.9256 null]
+>> endobj
+1513 0 obj <<
+/D [1508 0 R /XYZ 85.0394 388.3459 null]
+>> endobj
+338 0 obj <<
+/D [1508 0 R /XYZ 85.0394 261.2322 null]
+>> endobj
+1514 0 obj <<
+/D [1508 0 R /XYZ 85.0394 232.6525 null]
+>> endobj
+1507 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R >>
+/XObject << /Im3 1500 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1518 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1148 0 obj <<
+1517 0 obj <<
/Type /Page
-/Contents 1149 0 R
-/Resources 1147 0 R
+/Contents 1518 0 R
+/Resources 1516 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1117 0 R
+/Parent 1520 0 R
>> endobj
-1150 0 obj <<
-/D [1148 0 R /XYZ 56.6929 794.5015 null]
+1519 0 obj <<
+/D [1517 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1147 0 obj <<
+1516 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1153 0 obj <<
+1523 0 obj <<
/Length 1913
/Filter /FlateDecode
>>
stream
-xÚX_Û8ï§È£h\KòßÇöfoÑÅ]±èÎ>]ïA±•‰P[ÊFöäæÛ)JNœqºE€˜¦(Š"©)³M?¶©‹4M¾©š<-2VlÚá]¶y†±_ß± “"-r!àeet[ˆ:-j^m¶×J>=½ûðOÎ6<KË’›§ý¼VYÕi#òfóÔý'ùÇAGuzØò"KŠ‡ÿ>ýFÓò´ª+†Ó2X¢H«&«ý„§ƒ"áOŸ¿<ÕÐã_úù0žþã«r¶åQ+ËS‘—<h-EZ•™Q¤ìa˲,»è¿¯. ïNòôtóM“6%/ƒj^§eÕ2ø¡É’“ìô¨­‘}ÿ
- 5e"Ç^·™Ž8ù¢ª’R†x½6ßUGôY—Äpã´#êôÀêd6&’y^~<È1LQ¦s×sÚéä4­[&_þ  MꤕÃÍávK›¢à~;£¥ýKzô¶•=‘­lÚ<Ó‹‘Cð£S'´ªÊ“tÖWA@Æ ¾Ï¿¿”[«[Ó*¤ªD›Ñ[g»©ÅÝã¨QglípìÕÿôøJ lid<(bÍî˜Ð½Ä;’ÆV9÷þa 霸©=ÐDéHfoûÞžýý1Ö¤6.ˆšnÍ+_>þûØ/¯£_­v¸Üσá*qz˜úQe'Gzk¿OGµ{âWr¢æ‰ä(Ï꺰C§\
-veÒÖNϬ—ê¼g¸rÞÊ.ÎèŒÈ¢h¡Á¾¨îý<æBh%ÒËÞ:z³á˜èáhÓ»>HÅôÑhÇ L8[Ú,²j¼œ—D>Õ/…T¿—T„ ¬ñØ€0š&îm´Ù­4DÈÞY¢Bž¼è.ÈÜ&ò0§5¤RP¦†³à÷öÆ'çSʯ†í°ÓF^b ®Æû+ìY‰Óò¸ó†_Ž;oDHàJz+ÞI©!úê`Dñ:™Œ¡£ Q’â™ÞR-ÅãT!pº
-M&PÄqíèÙi7jÓŽ4¾§YyŸ"A¦͠ì‚d,"û©ì±‰kkÒ;¥)ÏR^Š:”&JÓ×9*—“²,Jן©IW؃È!6Š‚O
-q¿–D"mX• ‘¹ÈjmËúÿ@CH®2#¶¦È²&RØš8"u£
-:åô³¡&Ä«»Û†ý5é˜âB€û}Ye¡ødÉ °]B楖x¬†Í@”üizT(þ¶Úxe訳vTn3o-òÁa^¨ª1ü8Háã=ô6³¶µ{Ó‘¡š»hW”P·Šj‰v¢æwЮ„Z[Š´»ƒhM 5ƒ© º¡s?‡+ì
-ïp,'èñ+)jä‘jåQúk ©ï¯‘ÙYºÝÕ¡Eâ¦Á§âÛð´â·I-§Ñ;ÀÍÍ$b®»Ö¬Ý‰ÜQµ㩺›{JýÐà4;,ÿ‰f`¨º ‡W$‚7€Úù«1[Ë/¥nÆÏX «Eš Q S£»»·ž;šWïP{“øÄDN)ój=u”ö¬ÊùßC;»òÕ]Û Ñ_;Œ`ÝÄF
-q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb¼¸]mþpùv¹ÿ`)iendstream
+xÚXQÛ8~ï¯È£h\K²-û±½Ù[tqW,º³O×{Ple"Ô¶²‘=¹ù÷GŠ’gœn ¦)Š¢Hê#e¶ÉàÇ6U‘f¢Î7²ÎÓ"cŦéße›gûõ 2y!Ò"^VF·…¨Ò¢âr³½Vòéé݇r¶áYZ–¼Ø<íçµJY¥µÈëÍSûŸäuõéaË‹,)þûôMËSYI†Ó2X¢HeU~ÂÓA“ð§Ï_‰ªéñ/ó|Ïÿ‰ñU;Û½€ò¨•å©ÈK´–"•eFf){ز,Ë.úï« Ã»“:½Ý|S§uÉË šWi)kA?ÔYrR­T×½ÂBu™¨ã±3B¦#ÎA½h¤d²Óz ^g†ïº%úlÆ+b¸qÚuz`U2›GÉ</?Ô¦è¡u×sšéä ­[&_þ  Múd´ÃÍávKë¢à~;£¥ý+zt¶Q‘jfx¦—AõÁNŸÐ*™'é¬OB@Æ ¾Ï¿¿”[«Û¡ÑHÉÄ £·Î¶Sƒ»ÇÑAŸi°±ý±Óÿ3ã+ €°¥‘ñ ‰5»cB÷ïHíÜû‡-¤sâ¦æ@•#™½í:{ö{@öÇ`XsPfpAth×¼òøåã¿ýò*úÕúg‹‹qÁý<–‰3ýÔjÐvr4¡³öût¤Q»'x%'jžHŽò¬¶ ;tÚ¥`WÆ!míô| ñÞºq©Î{‰+ç­ì⌎À˜ü@-ÔÛݾŸÇ\­¢Qz9Ð[Ko6Ó­sfש˜>íèõΖY5^ÎKH"ŸêƒBªßK*ÂV{lÀM÷6ÚŒìF D¨ÎY¢Bž¼˜6ÈÜ&ò0§ ¤RP¦†³àwöÆ'çSʯ†m¿3ƒº(Ä@]wWس§åqç5¿w^‹2ÀUôþV¼UÒ諃Å«d:Ê )‰@ žyà ÕR<NÓØ^? ˆnšÄ‚¼qË 1¿!çÓ39Kþ|ü}»SNû=ÔѼÑ6¶ƒ LDCêäçùµ«üüån‘s­§ÐdE7Žž­q£š‘Æ÷4«§1ïS$ÈÔ t « ‹È~êB{lEâÚšôNiʳ”—¢
+¥‰‡ÒôuŽÊå¤,‹Ò#ÅõgjÄö rˆ&‚à€qéR¹q)p
+q¿–D"­Y• ‘¹ÈjmËêÿ@CH®FlM‘e‡Hakâˆ4A~ŒJ
+í,7 >ßš§’ß&µšF;Ønn 1ûpݵÃÚÈuc0žº½¹§T?
+¯“Ä `ÄЖœè•
+Hg‘…žEÎJŸ°ÕËûkŽ½.{²úöúâ-Tšz§mØÀ"'©3V‡+úJZ•ø?Õ“²Û¦t¾¦¿  ,çóýÃì(êTÊ¢ºîUÞýò4KŒ_E‘â÷Ƶ¯Qd{‘¡O‹“‘ä
endobj
-1152 0 obj <<
+1522 0 obj <<
/Type /Page
-/Contents 1153 0 R
-/Resources 1151 0 R
+/Contents 1523 0 R
+/Resources 1521 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1154 0 obj <<
-/D [1152 0 R /XYZ 85.0394 794.5015 null]
+1524 0 obj <<
+/D [1522 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-230 0 obj <<
-/D [1152 0 R /XYZ 85.0394 769.5949 null]
+342 0 obj <<
+/D [1522 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1155 0 obj <<
-/D [1152 0 R /XYZ 85.0394 576.7004 null]
+1525 0 obj <<
+/D [1522 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-234 0 obj <<
-/D [1152 0 R /XYZ 85.0394 576.7004 null]
+346 0 obj <<
+/D [1522 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-1156 0 obj <<
-/D [1152 0 R /XYZ 85.0394 544.8207 null]
+1526 0 obj <<
+/D [1522 0 R /XYZ 85.0394 544.8207 null]
>> endobj
-238 0 obj <<
-/D [1152 0 R /XYZ 85.0394 403.9445 null]
+350 0 obj <<
+/D [1522 0 R /XYZ 85.0394 403.9445 null]
>> endobj
-1157 0 obj <<
-/D [1152 0 R /XYZ 85.0394 368.2811 null]
+1527 0 obj <<
+/D [1522 0 R /XYZ 85.0394 368.2811 null]
>> endobj
-1151 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1521 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1161 0 obj <<
+1530 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1160 0 obj <<
+1529 0 obj <<
/Type /Page
-/Contents 1161 0 R
-/Resources 1159 0 R
+/Contents 1530 0 R
+/Resources 1528 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1162 0 obj <<
-/D [1160 0 R /XYZ 56.6929 794.5015 null]
+1531 0 obj <<
+/D [1529 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1159 0 obj <<
+1528 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1165 0 obj <<
-/Length 3113
-/Filter /FlateDecode
->>
-stream
-xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑ
-Waƒš)m%ÂÌ ™æLZEBµL€ap~ƽ¯Wq/¿£ÍïòI:pH^”ïÛÕª}Žòâäv -©YÕ]O½`ùÐV sø·ëª¨ý’XP»ëÓXu¬,óݤÔ_´ó.>¿Eúï¾û8øoAè…žh!™å^¢óÿíîç_ùd±âû;Δwfò 8
-h\±›f¢š%žfÊÁ¾x燈v œ0“)¥ÌDsͤæEؾr¾:–‘‚9«üð „$™wÎå™ gc”!:à€D´‰œ 8À‚¢|D]QÜxè¡Ê)ºØdlµÌ9íâìr±ØV]w,
-e5¨.·’DBxEÊLØcA€š/OHô³ÚÝ’Æ„ñ
-‘šC^¢@È º[”ÔsŸÄÝÑ-*4Ý}
-{Häí¶–Y@ªùîj
-&1èI Û§ u~M ð§4)Ú1^¤ç§j¾Ïˆ!чTÿX½`Œ(Ä=''$Ô*N± ÕH>ÀŽB×­l2¹/G™fœ °PÛx ±éJ€5 
-2Æ­®¯¶Â+Þ0¸/…Ö=gb”Œ»Á!hgAó1S:Æ/ ‰4¶¿BgK —â—PaÙó~]yÅ8™ßH@¾‹RÞ@"jÕX@ç"X™JÖNgC÷ šY¹Êðl3ÎúóÞp%º¶·âyÀw‘gÃj­óœuíà:<ÓÎeÏe³ø*ëà•cZ€EŸÛbé=D<n]k¦¡¦x½[Ogc”™mæPÞq m
-h4:‰[q=`¼Âµ®•úë3ö¼pÃåÀ Ô^VØiÝÌW»E…ŠiÎ|3‘]8~½ÑXQÎDzLe=HF}Ü7Pƒˆq6F™‰î*ÓÂíNòÈlATq®ðãcµ| …ˆ×EãJQß²R×À…,®2È…Ñ&ð¼h×eÝœD2åYám±‡}u,Kgc”¹h&!e0GTž;â–q<3â™ÔvúÛî^€‡SFøÛõ[:ªÔfú¼¬Ã ?×álù1ŒÄƒI/4]q@óí?Ñ8’ñ†Æ1b§ú½\ÏrGþ›t<ù‹”:cPÒ5رdŒ/¬¯ºží÷ãˆW°>ëlŠMˆó‚ºŽá{°!H€K}E]%L°Z‹¨®=nì9u`o§®c”ÔõÊj^¯ËÕuý{È®Àëâ%…¨V»-ÔM_=¡g ãŸËÕ.$ið…Ç)ûÓs‚‘ÆЗ®Ú”Û²'xØ
-”]—»Íùb¿؟¡©°¡k8<Óï2§r<¬3Ék
-©rŒjæµò‡•ñ
-'öuð8Z¿›· CHU™îá|éAæshQ‰P¼××ãÞÍcoY~®°ç¦åú¡~ÚÕý }À£/­ê-uÊüo<»ÓŽþ­w]D÷På¢à¢î;N-xœZ¼L¤v³¡»ÙÖ%¾4©h<,z¾¥™äut¼×
-Ÿ6ô’fŽ&û@d !{A¹I1ùO!&Ó
-²>Ÿ2˜ÄáÎG9ü)¿²ÁrÔ™½ã7àã~€ª;'è¼UðB4²nÃÑ2–'ÁN;ú3Þ*ü?ÚªŠª•YZêð€rõ\¾ÄE^í…
-¶ÍÍ^f"|-Ô—0zp™=Ÿ?¬†3©­ÒŠI®åÍØ^fSi Ó¿ŒËX9\+ÒGêý:ƒÑZ0)-Ø ºÈÙ"{Kšž‡ã$¾6Ï_Ôr i;B]œ°ž¤ïQ¥åþ_"ÑÔendstream
+1534 0 obj <<
+/Length 3198
+/Filter /FlateDecode
+>>
+stream
+xÚÍË’ã¶ñ>_¡K*šªŒ7ÍiýØd}p{o¶«Â‘8#ÖJ¤,R;ž|}ºÑ
+ŸiÇð€ÏͶz¬Ïpª ¹!åTE€O ³êÀí(NoÇjÂxUßkqä9êE.îF¿šØœY¨÷Úm†]Ì¥ÑÖô¡3Τâ*ÐÌ­ƒŽ‘¯f|À8£<e\€Ú¢™'° )Ä
+=XdJdßPÞÙUÕ‰…š‚I zcèåöiBG{ü)ÍGŠvŒéù©šï3bHô!Õ?V/X#
+q@ÏÉÉ
+»[ƒbä]Ža «”ç±|4šÄ­¸0^áZ×ÆJ}Èõû^¸áràj/+ì´næ«Ý¢Â‡bÚ†=ßLdNŸAo4V”3‘SY’Q@÷Å Ô bœQf¢»‡Ê´pû‰“<r[Uœ+üx[-ÈF!âuQç¸RÔ·¬Á5p!‹k rac´ </ÚuY7'‘LyVx[ìa_ËÆÙe.šIHÌ•çöƒ¸e÷L†x&µþ¶» Æa—»~K[•ÚLŸ—u8`€áç:ìíÂ`Ø7†‘¸1©ãღ#h¾ýá'G2ÞÐØ#ÆCìT¿—ëYnË“¶'‘Rg JBº+–Œñ…õU׳ýzñ
+ÖgM± q^Pב"Ü*ïJ¬}9ÊôÅ9u•½Ma®¨«„¬ÖbP„sÉ dKFè±2dw£CF:ñPïBFã!¤C‘Ÿ·(9˜p@Ê@èë‹òˆq6F™‰xT¨âTD_ZÈœW¡¸8öõëýGz<i=Ô°…¼¦BNƒñø¸ˆ=º†s/ÞÎß0^pw$Vóz]®®;¼¿‡ä‚6žq)^i·¥‘ºé«' Ìaüs¹Ú…ÞðøÉþð…`¤1ô¦«6å¶ì ÞÆÚ×åüÜ/Rü‹ý‘êb:ÅÅ#¡.³©k @;“‚®*kÌÌkå7V°
+*3ëÛk
endobj
-1164 0 obj <<
+1533 0 obj <<
/Type /Page
-/Contents 1165 0 R
-/Resources 1163 0 R
+/Contents 1534 0 R
+/Resources 1532 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
-/Annots [ 1171 0 R ]
+/Parent 1520 0 R
+/Annots [ 1540 0 R ]
>> endobj
-1171 0 obj <<
+1540 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [356.2946 363.7923 412.5133 376.6291]
/Subtype /Link
/A << /S /GoTo /D (address_match_lists) >>
>> endobj
-1166 0 obj <<
-/D [1164 0 R /XYZ 85.0394 794.5015 null]
+1535 0 obj <<
+/D [1533 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-242 0 obj <<
-/D [1164 0 R /XYZ 85.0394 769.5949 null]
+354 0 obj <<
+/D [1533 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1167 0 obj <<
-/D [1164 0 R /XYZ 85.0394 576.7004 null]
+1536 0 obj <<
+/D [1533 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-246 0 obj <<
-/D [1164 0 R /XYZ 85.0394 479.565 null]
+358 0 obj <<
+/D [1533 0 R /XYZ 85.0394 479.565 null]
>> endobj
-1168 0 obj <<
-/D [1164 0 R /XYZ 85.0394 441.8891 null]
+1537 0 obj <<
+/D [1533 0 R /XYZ 85.0394 441.8891 null]
>> endobj
-1169 0 obj <<
-/D [1164 0 R /XYZ 85.0394 424.9629 null]
+1538 0 obj <<
+/D [1533 0 R /XYZ 85.0394 424.9629 null]
>> endobj
-1170 0 obj <<
-/D [1164 0 R /XYZ 85.0394 413.0077 null]
+1539 0 obj <<
+/D [1533 0 R /XYZ 85.0394 413.0077 null]
>> endobj
-1163 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1532 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1175 0 obj <<
-/Length 4063
+1544 0 obj <<
+/Length 4062
/Filter /FlateDecode
>>
stream
@@ -4911,3276 +6264,3737 @@ s–Ö*hîžm­™â‰µ
ÚŒ8‹Áµñ.pÃ\bŸ®šîN N!‚š æP³‡yãKΨ ©ÐCËxMU›U×ܯ°ÔùÒ¨0 D¬x/DyHvkͬ”ÚHI0×¥™¿bjïJÚMÿÖÅ º½8‹A¼¤_âÛ5±ŒêmšSØQ-1ØÅÇüͦé¦î²]K×Fm4PÕ]½H©0u?º‡ ŒŒyÏh)ÓánŤ ÷JìøßLŸÁc®ã‡âÃr F×Ѐӟƒs)Ýõçvg»ëR<|×?š_0ÃéÁBm!3Î5¿LñÄ},Øh‚«¶–) '%’¹
ÇÉ} ((º™dàâ^좀Ë*§2¤Ô™üuC{2

-›¬s짼h "”IŒ)%F*<zé“'â¡jÿÿÍ”àxÒ‡BvÉ
+›¬s짼h "”IŒ)%F*<zé“'â¡jÿÿÍ”àxÒ‡BvÉ
endobj
-1174 0 obj <<
+1543 0 obj <<
/Type /Page
-/Contents 1175 0 R
-/Resources 1173 0 R
+/Contents 1544 0 R
+/Resources 1542 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1176 0 obj <<
-/D [1174 0 R /XYZ 56.6929 794.5015 null]
+1545 0 obj <<
+/D [1543 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-250 0 obj <<
-/D [1174 0 R /XYZ 56.6929 165.9801 null]
+362 0 obj <<
+/D [1543 0 R /XYZ 56.6929 165.9801 null]
>> endobj
-1172 0 obj <<
-/D [1174 0 R /XYZ 56.6929 136.242 null]
+1541 0 obj <<
+/D [1543 0 R /XYZ 56.6929 136.242 null]
>> endobj
-254 0 obj <<
-/D [1174 0 R /XYZ 56.6929 136.242 null]
+366 0 obj <<
+/D [1543 0 R /XYZ 56.6929 136.242 null]
>> endobj
-1177 0 obj <<
-/D [1174 0 R /XYZ 56.6929 106.2766 null]
+1546 0 obj <<
+/D [1543 0 R /XYZ 56.6929 106.2766 null]
>> endobj
-1173 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R >>
+1542 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1180 0 obj <<
-/Length 3096
+1549 0 obj <<
+/Length 3065
/Filter /FlateDecode
>>
stream
-xÚ­ZÝsÛ6÷_¡Î=Dn,˜øà×õ)uÖÖÉ%ÎÜÍ4”–`‹cŠTHÊŽçîþ÷ÛÅ.(R¢å~Üèàb±X,v¿%'üä$ E S3‰S#Â@†“ùê(˜ÜBß÷G’yfžiÖçúöêèôµŽ'©H#M®nz²$‰œ\-~™žýðêíÕù»ã™
-ƒi$ŽgaL¿½¸üŽ()=ÎÞ\¾¾øþûWDZ™^]¼¹$ò»ó×çïÎ/ÏÎáDÃxÉžðúâ§sjÿtþóùåÕûã_¯~<:¿êÓ_° 4®äóÑ/¿“¬ûÇ£@è4 'ð™¦j²:2¡¡ÑÚSŠ£÷GÿèözÝÐ1†:a¢â Ù³  ”Hc%'q˜ŠH+íLxggQ`ãS¾ öè‘Í‹Oe¶²⿹o±¨mÓ|Zeí|ù©È›–èÿ¥ÇÇ ”hÓת¯ÃLÆ"Õ¨«s±r: å¥PÇ3ÀÐïìÇ PeÞæUIæÎÊ5>4Ù­e±ª'6˜@7X(4NÞ+ÐíX&SÐÆÅzꔤ&jê¨jšÑ×u¾Êê¼x¤×McÔj+z.lkëU^Z<ŸwâçUÙ:YUA„›ª¦Æ=ˆ¬6<_cë{ËÕÚÖ®°ŸÓq:½ZÂFÀÊp-RŠ4 É6=%aÒ¢©¨µ9–SVQMó’žíÒŽØ<IÀ³"p!'×o˘vߌF‹ cæD«ïK“©c#™§©êÖíý¾0m„Ò‰Ö´YkW¶li½!®—”¶Ñéía™ÓNI´jÓæí¦õ‹çUfÃÝU¼»h»™„”I¼ e·fr yÆ.um½k=R£º¡g»äž›ª(ª‡¼¼ýûSQ™*Ž§µ>— JizVJ¡™èž,Ô÷c ãÝIaU0Èćgí¸ö§lŽ  m¢á´Þ6oÙ6C‡.¨ƒ‹·÷†-V{öûȇû¨™T,b&Ϙ©ÇuÀLžëy3šµg¦ÝiÇÍÔŸv×Lk2&­/[;åÌõÛé j”Uëþ ©`>“êôSõ¸˜Ês=oªC³öLµ;í¸©úÓf´twÆ8“}w®Åµ \o9¿_?nƒp$õ@î1FúÜsG sWrX¢wÓÎSS8xB˜æ Åû\O[¼ãzÖâgÝZ|oÚQ‹¦íÒÛýÌæýv/¬ýéÍm¦ÜÙ™‡¼]Ú¥ŒHbú³c^ŒíM(”TÉïÞ›Î#†Qö¦Çu`o<×ó{shÖÞÞìN;¾7ýi9J 'ðâì…-çEÕø1>³\×@:÷ÀúiEx
-e$EßùödÕš>h¸£O+Ðã6#E€Èû ­Œ…ÍpøÑ‹ý2/²UƈLã‘[ßQæºß¾zY c[GŒÖ ‹|Qoá—Ö~QÐBmHÚGð8ˆñádÄŽRV¥%Ò
-ÀQâÏŠæædXDùC=™(L„6Aô;Jn)B-=öÝÝØÎ`ƒ,ÐKØÀâq9cÁUµV"ƒd¸§œ “û„2®köÒ-І·$@ða¼=àÈŸma ž>íH,ǽøN¬ñë ;OŒ_Ø2·ÝøÙX¸ PÌÛ*<«Lºzõ‘SVôîäŸP»SªÇç&E\¡ƒÔË·ÍŒ6R‘ñ(—<ƒÂ1¿+uÂÊ¡8î¶{_ Â8 Òj<I›|ÔMc)àÌŠžhÆ’I!’‘£†¦ eÌaÜăù>ol=j¢DÉç„%ûÂÆc6„JÂäÏÈ›góåØ5e¢EFZ⸞iõvšþ1©pŽ”Í ¸ö¾¼È™$PKÚzeHËpxºnÖ~§+sÐÝB‘èáî“°ä^lóЭð0ÞúÐÑ×™*ÄÅxë]R¸[Vض&i¥[m0Q¤S‡›5dˆ`Á€AÓ]:#tÑô}¾Ê‹¬!¥ôÊ=qá‘D"Nõﹺ©…D“ÃÎWPS=@„ÖœÑ>4¹F‹¶—ÓH¬èÉ8 cF_¤
-/^,Ý "áfGä*Cða_ð€ž¼ Û ÍÏ ÙŽ]Ñ?U/¡=FÑÆñb1œ±°H71·eŽç< o¬¼à!«m)#
-§ßZöa§Ú Ÿ<A¤»–³¾6^“™79®í2»Ï«È3tÁ®íΠ/Zëî^Œefôh6×e^çnØ®L
-K徃ÿ° $V >)J¹•š·U †XÑ+gP©ºä„<.ÿÁ¨¢ªî6k"ÒÀ=½\b•j?¡ÉY©K- Ýtú¡¯BdÁ¹Ô]¼~EÜ[SΔJ¶‚G`N,’T›^°~qÙYÆìô
-œ…ËãkЈºÜE=<1z\y íþR8J«ùƒá=v6lLžá|â?Û‘$qºãçþÊ"ó7Õ¶€¡Ù¾¦¼™ñ5mÇÜ»üá:ù®~Ó‘lç?BûOÐgÕj[½Ç®/Ïuæ/šÆÿ&å[ªN¼4$Ž.–|Môî›1s7ý;(ƒw6cp¹‡^]ûü„-8R[Û¬éÆÃ}ú~Ü`ö®ATw?Å^}hÍñkU n7µ¿úç"ÞƒèHN¯ŽS<~\‡›  ‘Nkx²ãÜÖ¬©nˆèò (˜û.‡êþ„¾ú¶KwKÝt·ÝîÆžŠ­ebÎêKáì„Ÿ/_žP^ªê± k–¶(N׶î®Rq9£õ½,nÿ£ „déû„‘OûÄ©Ó€¿±Î¤ˆ&oûÚuxë÷:®Üq…¡ðÏŒ´-ØêÜÉõzî’žg$8%‡wçdezôSþ†¤B„b©ÓS’û—õzùrìŠñoÿéØYqûÃåÅ¿¨å¶ÚË+ù¿-nçŸøâ¤C¶ùòt{õ—ÿÓ³ýt%…N5þ ICbOT{¥ÐZ*ÝÕ¼ûóϾêÿ®4~»endstream
+xÚ¥ZÝsÛ6÷_¡>En,˜ø ^ŸR×iÝi“\âÎ=4”–`‹cŠTHÊŽ§wÿûíb’’(¹£
+éLxoŸNgIaåS¾ ú©Èæŧ2[Ù-â¾o±¨mÓ|Zeí|ù©È›–èÿ£âcs´Îùk1ÔaÆ5K%êª@iÎS§Zž3q:ã ýÎ~Œ"Qæm^•dî¬\På—&»³^¬ˆ&3‘0såä½ÝN¹™‚~0NË©S’ª¨©£ŠiFLD_×ù*«ó≚›Æ.¨ÖVT.lkëU^Z?x>ïÄÏ«²u²ª‚·UM•Ymü|­¬ï¨Ö¶Îp… øœÔéôz +õpÎÒ8n-%aÒ¢©¨¶9åS¯¢˜æ%•íÒŽØÜð¬\ÈÉÃõÛr¦Ý7£’,Jcí9ÑêûÒxÊb­¸çiªºu{¿/L*&¤ š6kíÊ–-­7Æõ’Ò¶ :µ—9íG«6mÞnÚ°x¿Êl{w…ß]´ÝŒÃ ä‘2Á†¼[39Ð<ó.ucƒk=Q¥º¥²]úžÛª(ªÇ¼¼ûסSž(ÎtªÓãamÈå%8io¥ªFd¡¾#®w'…UÁ ¥ÏÚqíO»µ9<‚ºJ¶§ ¶¹zçm³eèØêèê݃ò«ûCŽû¨™„`FjñŒ™\G̸ž7Ó±YfÚvÜLÃiwÍ´&#aÐúÒÛ)÷\¿Ÿ¿ JYµîÀ5U$™ÑÉ3å눩×ó¦:6ëÀT»ÓŽ›j8mFKwwŒ3ÙwgÞµ¼G-(Ö[ßožúC8z ö(ÅC칧€¹«G
+1ÌÈÝ°sÈâ±åñØ·øë°Å;®g-~tÖÞâ{ÓŽZ|kÚ.|ѽ=ŒlÁo÷Žu¸¡ÚGÊyÌÛå±½BÁ¶«8Üóblob&¸0zo’˜bøñ½pÙ›ÀõüÞ›u°7»ÓŽïÍpZJ 7ðâ¯ì…-çEÕ„1!²ÜÔ@º÷Àúi”$x‚ùÂe³Jé¯>¨¸«O
+Ðã.#E€è÷j…ÍpùQÃ~™Ù*óˆLâ•[ßSƺ߿zQ ϶L<Zƒ.òEÙÃ/)â †Ú´à=pcádhG)«Òi ù-„Ž¢šgŲjZ?P ?¹LyÏPÚ¶Á‘;8… ¹;Wh¢A³Ÿ«ž Í h.¬G…²…©½ ¿¬:3cåÆ÷ÝV› SÞ´cPoa›y¯{Ü»‡IðX¹JwvX'Èm¼v‚[Å ºW£/.â’—“)ìî¦ñÄU¶°;|!– tå Õš§²Íæm>§1Íù¾jeÓyÑ`pF¬«¼)¡Æ$Ë] fÚäå|Ô4oê¼õàôvÐOy§ÖÞ©¸]u¸ý!+òEF RmÁvôùjÓRƒ¶üŽücGDFºux¾õX¹“€¢ÃYFhî`®áÓ7àÄ`Ç&=·µ˜\xô€§á™¸@í¢A<"/¼slºPÑ.)-ÙÜù…iQÍ7¸WεGýè?K‹æ5d(îrXÛC :
+"è1þ(¹q$1o*?¾Íî­¹. Púù˱`’­IÓê 䀭ÅP
+>}‹±;¼æÚm¾²øB Äô‡êÑ>t®+eJgIŠh HCÃhŸ7yUPÖ2kCÍ“(4b 
+Š"?GÊMVg0­Û_lnJØuªfcÞålæÏß
+ –^P‘p»#r•!ø°/ü€‚ŒðÚ Õ…Ÿ¢Uº¤QïçKý³î(ÚxK žÀöÀBà ‹ xÃx€ !é¸+s¼ç!™
+¬_²Õº°n–Ô§X;‘LjÉRÓaXΓçB}ƒY™š~E•qùÍX|ë$Œ¤Ï\tc©ÕƒZN‰
+覷=èv/P>ÂQl­'æ^r) \œùòåË3ŠKU=ú”¸´Eq¾¶u÷”ú„ËÍïe‚€=éýƒqï!C§Pü°Sœ;bH›4†.¦•¤ÿ(|í:‚bƒŽkw_á(B™QAû‚µÎŸ\oà.©¼ ÁÒ¡ÈÁÁÝ9½2ú¹ÿˆ¥L
endobj
-1179 0 obj <<
+1548 0 obj <<
/Type /Page
-/Contents 1180 0 R
-/Resources 1178 0 R
+/Contents 1549 0 R
+/Resources 1547 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1520 0 R
>> endobj
-1181 0 obj <<
-/D [1179 0 R /XYZ 85.0394 794.5015 null]
+1550 0 obj <<
+/D [1548 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-258 0 obj <<
-/D [1179 0 R /XYZ 85.0394 731.767 null]
+370 0 obj <<
+/D [1548 0 R /XYZ 85.0394 730.0812 null]
>> endobj
-1182 0 obj <<
-/D [1179 0 R /XYZ 85.0394 703.7216 null]
+1551 0 obj <<
+/D [1548 0 R /XYZ 85.0394 700.9798 null]
>> endobj
-262 0 obj <<
-/D [1179 0 R /XYZ 85.0394 229.6467 null]
+374 0 obj <<
+/D [1548 0 R /XYZ 85.0394 216.5924 null]
>> endobj
-1183 0 obj <<
-/D [1179 0 R /XYZ 85.0394 201.8883 null]
+1552 0 obj <<
+/D [1548 0 R /XYZ 85.0394 187.7778 null]
>> endobj
-266 0 obj <<
-/D [1179 0 R /XYZ 85.0394 144.1965 null]
+378 0 obj <<
+/D [1548 0 R /XYZ 85.0394 127.6814 null]
>> endobj
-1184 0 obj <<
-/D [1179 0 R /XYZ 85.0394 118.9605 null]
+1553 0 obj <<
+/D [1548 0 R /XYZ 85.0394 101.3894 null]
>> endobj
-1178 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R /F14 740 0 R /F39 899 0 R >>
+1547 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1188 0 obj <<
-/Length 2472
+1556 0 obj <<
+/Length 2310
/Filter /FlateDecode
>>
stream
-xÚ½koã6ò{~…~¨½>õh?ew“4Åí¶Í¦8Ú§È\[¨,¹’œ4ýõ7ä•(6¹"@ÄÇp8œ÷ŒÙŒÂ›©ˆD)Ogq*‰¢LÍòí­aïì€9˜¥Z†Po/ŽNE<KIñhvù9À•š$lv¹úyN€Îß}ÿñôü짋ãE,ç—çß\,¹¢óÓóàèìâøÇã‹Å’%ŠÍß}{üÃåÉnEÇÛóïq%ÅÏH/NNO.N>¾;YüzùÝÁÉeÿ–ð½Œ
-óß~þ•ÎVðìï(i¢f70¡„¥)Ÿm¤DI!üJyðéàÇa°kNòQÂEÄ'ÈÙUJ"Á…c rà
-¥tþ^ÿB)¯Š®¨+|jV­pðS›­µy/`åV:[rIRɤÅ÷®ÞnuÕµxh›Ý:4»Îòöf£›KæWºMÖáèfStºÝe¹~AáiÃÏ µ¼® ýë}“ /0+¥&†tC,‹I*x‚Ä.Û«„àpØS.„˜·]Öt¸qSt\ì6¶»©q%ßdM–wºiqãè ®ÿBmˬÝÂ\!:Xce™jÀ4Â;ÞáŠÅ
-Œ4žgžÑfoÜ•ºÓ¥Û\é²ØÇW8uTÐÈœoý™þ‰† _°y>Ï*\9p ÈaëêþRÃXœÔ•¿;ÃÏ®nPVv÷³ß½‰Û7•Eå´¢vŠ`n0_P'ìí¾ìŠ]éà̉öŽäã±äùHò\0ó¢ªîpçÊA
-ðö‰rü´û„V5~˺Zƒ³uDûGÜNPé€8ÿjî„‚%ç1a2HÄS’$qŠ¶öÕW½µÉ4´6˜9%1C§Á0B 6ãgí¡ÀÏšùÑ~C?kÑy‰SŒ^öR°©jïÑÖwîÑΨÕhg·¹m—S–WäYiüad½ŒñÈ"1X¿‹Þ‹˜±ufͱÂi–[#¯Ûçƒï23sñøŽöGý*¬m²k[WnPÖëáÌàwab]䄹M8ÌCë,ß «Þ½zw‚^+ô6V$ÊØhaƒ–ñ–Œ:oið¡·|Ž:Bí|™oY2nqhoŒ¸ö9¬ð×ö¦îÞŒ0âL_ëÊUï×w¶ãp˜7¡BþÂG¼Ú®Ñ×E½oï›ëDØܧ.ËÐꌡxIìtãöœÕNëo뽃ÀðóY7ƒ-=e·½.„æ:!lH!ˆŒÀPKéI
-ÞÍ'ŸÈŸ¿£÷±cÅ?«ö<¼õÓú/^ ôSµ–H"¢€£Ï*¶'iªät±„&œÄ)•ãÂsp¹¡?1F5µ1’„ªd¨ÉxŸi€
-Dœˆ˜E3 ÀÇ•eÑ¿›P¨
- Jv€‚ûeL¨ÀGþgÁ$<Ž¤C¼4c[$V!8hõ¶ÈëÒ” fj\¿ù½€Œ©õ7 0:ô9x¶vGM £¹Cž¹û|p´0{êìn‹ßÛ·´M„‰sQ½/MWÒúSœe8ýsÁ”‹Ç0ÃÚÓ,™!fh—f'x‘9]T+°(}q·ó`X €­Œ`Á]3TºöÙ®‚ÂB³Ó“ ˤÉ(%<I“™SÓôåšol ìTèY¼Ì.ÇÆ$i,ÓDȈ‡I õ-"×Ýx7Õ8-|òsÖdÛmÖ<\Å©ðÆÇÁÊ\ßF)~î·"aÛ¢µa@lœ¯“§‘ë Ž!ŠÈxþéœöp.蚣£W¨ð䃊`£¸òÑS‚»zf₺r¥»éRЮ{c°Ø2Ü ðÝJë½…0úœ—u‹µ1ì]A– í[i:ÿ`˳pg‚~é³;= «²Î‡òvµöý%ŸÕfa*+[Ÿèf[T™í‰ŒëjwUÀè‰ÆÂ¥O Â.€¢cß½½ÝïLD¯¾¾kŸ øKÏXœFUô[)Ø^léï
-"#°ÿXKóžð'î³{Ò’)pJL7+SAD"ÀºcJb¼ÍòrÂ8M èŒ]`\aÓ:Ò(µîâC•mmÕ+ç?àR¶Z¡ZºÍº|cåe¶K°YÓïJSdãå9BǶÕØaùVNéhß6­»nú’©½ï€A²
-ªîYÈŽ—1؈R±((z>Jâ!™IA¸¤ì ™Éˆ$<Š{kmê²}†äòÒYEÛ·s{ã²]¶ãîß•îùë˜~u;dóxmH&K©)@|*ÕT«|‚8¨RÒHxâö]QÝí‚16D†{^Æðÿ§ ƒ/Ó'd($Ib†©Z^{¿ÒOŠÐÁµ#ôߧ™ÐóZL{}gEcÈÓeôӌҰ³„ßôí“ kw:/ ƒ,Ï"j× $¯Àílû<‚¢2;Øy‰\
-ßlzÅoÞg5¾ñå6ëåTÛiоíCÕå§ó³GÄpâµüÈ×Wib$ùãÒJ¡b¡þ´P¯×æýM^"†|Âæ>0rÝûòƒæÚº|X¼6ó¾Qa ¿} ç,,"ØB1¿µ±y‹ >W˜ˆ3ídRïe°áuEõŠ–¥€V%žðF±"4UPÊ›F?MÂÉF”ûq@¦$Š"ßfÂá>ZðƒQ,m½šLÀ¦‹60¿
+xÚ½koã6ò{~…~8{3|èÙ~Êf“\ŠÛ´—õâîÐ8EæÆBeɵäMÓ_3R¢låÑf{ñ1ç=c1áð'&aÄ¢T¦“8 XÈE8É×G|r{—GÂÂÌÐ܇z»8:¹Pñ$ei$£ÉⓇ+a<IÄd±üq1Éf€OϾ¿¾¸ºüxs:‹ƒéâêûëÙ\†|zqõs]Þœ¾z3›‹$Ó³¿Ÿþ°8¿¡­Èâx{uýŽVRú<‚ôæüâüæüúì|öó⻣óE÷ÿ½‚+|ȯG?þÌ'KxöwGœ©4 '÷0áL¤©œ¬‚P±0PÊ­”GŽþÙ!ôvÍÑQþ ΤŠä1ÆÀ0e‘’Ê0ð«Ù<â|ºX Ü7£±Gy½^몵»ºê7k;þx}õo5+]– 2 ( ÁÒ0”þµYµ¤ÁFoK„;¹>ÉpJ)&D'mò– BgÞéŸ8—UÑx3ÊÅ ÃÁÇ&»ÓŸâ“K|gô¤†­³‹f³ÑÙÖ¡|¸_éíL$SM+í*kit¿*ZÝl²\? p´Ñ§W±¼®þ»Ý6ë_€+¥fËb–*™±ó¦}(á*¥¤Fƒ35mÚlÛÒÆ}Ñ®h±]YØö¾¦•|•m³¼ÕÛ†6NÞÐúO<äM™5«c˜‡„ÖA¦"˜¦Ç›Z1àš‰C‚ ÚV˜Lßê<Û5z¨ $V §x<Í£qoÜ”ºÕ¥Ý\ê²XÇ—4µTðÏ7îL÷D$CÂãgbڡϳŠ·²ØÚº»”´'uåîÎ賩·$+³ûÉí(xYTV+j«x~Aa¬°×»²-6¥…ÃÍžäã¡äå@òR |QU·´sk!
+LHE(ãÍã{¦˜…“«µš¼«á‰ï•ïÜClùÖœdC¶ïŽùøÿÌD
+̽·%1SA$ýfŒ)‹Eœ¸n–ímœ5.
+—ú\n³õ:Û>ZÅÖ:Áö$™í:À(¥Ïaó!R¸Ø š
+Œ[†,Šñ6ËËãgÛ¸¸¤þ¥q¤QjÜ%ć*[›š V®~ ¥l¹$4tµùÊÈ ·K°Yìv¥)Hrk‘å9AǦÑØRñVŽéh×4­Û•ÞvSsè€ãsqÏŽ×ñ%Š(î z9Jwâ‘AQ”<#2òqh›†M5µ«Ÿ‘[^Z›hºVnÇaZXAŽ ËfØù»Õw-ËoúLþ°û-RŽÅ‡Ë£¶Õ2!*”ÕŽ€vmQíÃL1}\‚w^Çî¿P‚ DC!¢§%˜@ôLÛä
+ós.ÔÓ‹c–Šš¿è‡g¹Õlt^ w Ã"nË ¯Àݬ»ü“÷Áê·D¶î„o¶ ‡’7ï²×î²›õhøß¿{éÏ®éBÔâÃÕåã²òøð:Æ`[‰â È*bI”¨±ßßøäYÕé¯}}öÄ ­Dú…˜gñq‚¨!.dU JN÷³ …òHÿ’ Q>endstream
endobj
-1187 0 obj <<
+1555 0 obj <<
/Type /Page
-/Contents 1188 0 R
-/Resources 1186 0 R
+/Contents 1556 0 R
+/Resources 1554 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1158 0 R
+/Parent 1562 0 R
>> endobj
-1185 0 obj <<
-/Type /XObject
-/Subtype /Form
-/FormType 1
-/PTEX.FileName (/usr/local/share/db2latex/xsl/figures/warning.pdf)
-/PTEX.PageNumber 1
-/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000]
-/BBox [0.00000000 0.00000000 31.00000000 31.00000000]
-/Resources <<
-/ProcSet [ /PDF ]
->>
-/Length 557
-/Filter [/FlateDecode]
->>
-stream
-xÚm”In1 EOPw¨u€$ÅIg0²Êľÿ6¤¤êV5 oʯÅésÀóή¯ƒÖ×O²Î Ž¢‘ÿ¨#h8Çùø:„5?ùÆ [ÄIÚL’~”F Ø PÈùYÌÀ¹dˆÐzZ8å±Ýƒ²ÙËò‘–Œ€f¾Å(ÌÀE#@x˜oL Û¹[ƒ±ñðù
-6\>RgÈbÏWÖ¹j[†›
-WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream
-endobj
-1189 0 obj <<
-/D [1187 0 R /XYZ 56.6929 794.5015 null]
+1557 0 obj <<
+/D [1555 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-270 0 obj <<
-/D [1187 0 R /XYZ 56.6929 769.5949 null]
+382 0 obj <<
+/D [1555 0 R /XYZ 56.6929 730.9277 null]
>> endobj
-1190 0 obj <<
-/D [1187 0 R /XYZ 56.6929 749.9737 null]
+1558 0 obj <<
+/D [1555 0 R /XYZ 56.6929 704.9004 null]
>> endobj
-274 0 obj <<
-/D [1187 0 R /XYZ 56.6929 282.0726 null]
+386 0 obj <<
+/D [1555 0 R /XYZ 56.6929 236.9993 null]
>> endobj
-1191 0 obj <<
-/D [1187 0 R /XYZ 56.6929 250.2286 null]
+1559 0 obj <<
+/D [1555 0 R /XYZ 56.6929 205.1553 null]
>> endobj
-1192 0 obj <<
-/D [1187 0 R /XYZ 56.6929 191.4593 null]
+1560 0 obj <<
+/D [1555 0 R /XYZ 56.6929 146.386 null]
>> endobj
-1193 0 obj <<
-/D [1187 0 R /XYZ 56.6929 179.5041 null]
+1561 0 obj <<
+/D [1555 0 R /XYZ 56.6929 134.4308 null]
>> endobj
-1186 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F62 1062 0 R >>
-/XObject << /Im3 1185 0 R >>
+1554 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F62 1352 0 R >>
+/XObject << /Im3 1500 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1196 0 obj <<
-/Length 2134
+1565 0 obj <<
+/Length 2383
/Filter /FlateDecode
>>
stream
-xÚÍYMsã6½ûWè¶òVˆàƒˆääx<§fœÄvN“©)Z¢$f(Ò+RV¼»ùïÛ$ʦ,;ÖTmù  4¯×´pøƒ4a\Ùx`lÌ.’Áh~ÄS{w$üœ(LŠº³~¸>úö­2ˬ–zp=éèJOS1¸žþxòËõÙåq$>Ôì8J4þp~ñ†$–~N¾x{þî·Ë“c¯Ï¾ ñåÙ۳˳‹Ó³ãH¤‰€õÒkرàíùû3j½»<ùðáäòøÓõOGg×ë³tÏ+¸Âƒüëèã'>ñ:âLÙ4¬ Ã™°VæGq¢X+$åÑÕѯk…Q·´¿X*&¥Uƒ(á,b÷®´‡]}VZ´s{ÓHˆ„©D¡Kâ˜qË7.‘¢ã!3Ò&“X¦•TÎ'ó¬ióEƒØÀ|ÙÏS&bƒûàÄqþ;ç²Ê›ãH™d˜áO<¬²y>&IÐä:eÑ´4cR/HTT£rÙuº4޴˯²òšš2»ËÑ"ØŽÇl’Hgÿë*'—®7ÃΨ̖MÞ°‡N¸a©ábÐæu`++Y"´DaÂ!ý'afÊå>ÿ©Â:HêÛ }†ÿFuÕ.ŽE:¬K„ͦÃiYßd%¶í°Éwù‚ä0]=].²Ö¹ '„}Ü ç)l4yÛÐø8Ÿd˲m¶ÝF÷Þ…
-üÍ©^ÔW½2:™Àö€¯­ei¢cBÒS1j¢Ñ,«ª¼|Vúƒ,ã@Ä ˜h N˜Ï—U1ò.p¢ ÎõÚš~§yKl4Ê7hpöìÚ+cÁ¸„ÌL{Rr}lZ´ž·uÍ6çÚíÕ.^ÿÇWJ -»ïNi“0k:~»X›0Ž¾ä÷/{Îð2@jL‡n=õß\\]R>hÇÔC]”¯¨ºÁcµQ Þ¶œÞ–»"_½IŸqÜZ+‡O
-Á‰‰`% ¤â"pT’¾«`¯ŸÙ|žyºwÏËñ-‚,`§@“¦_/êýÇ‘ÂðŽl1úl<^À›øyžµ£ÙgW5àÜèÁdÊð}ßw0°!†ÈÑþîáäž½¡›WlÈ1ZhüÖdÓ¾»ûऻCI¤!”p÷ž$
-¶.5 ³J·ñEÝ”xfV J;€P²e xcp ù‡ (/¯ãÆKBΓxU´³>gRfù:Ñï A‡p“c•„ÖÑF…ßx¬' 4?& Í|5#fŸ¥³Vµ¿?‚Õˆn-VDb}´Óډ׉%¼EÁ×)Ëz•{ñÆ{à&Mjœ…™ÓuÑI=ªn–EÙFEõÝÃNˆ˜c$dYÈGJ<ï5‚ª^óÒרoU°ƒ”|ù3E
-¨Ž0 vr‘(¯‚bFKŸK«ûž ±
-è{¡ÀkŸ•þ¾ÌꦷªFæ
-‚*oWõâ uŠªÍ“ Ž†Uß'¥6ä抶ùžë@òÚ‚7xèF*ùKjè°b§ç¤Ñ,NíÞhXð
-³q]•·Íó]'lì 4”‹y! ¢!!§º‘ý’Oqlí/OÂøjVàSŠœkPF®éûŽ;ËйBwrãwF߯jÇD`)ihÚ¸&aU·Ô¸%¢páRŒýŠŒ~VŽDC£…A¿nœÃ6ó¢êý¸L!%c¯Ô=ô’¤Ì+P2mg õ]£=@MôÐÚ
-zGºÄð¼¢±féØ$+A0Êšü›Þ/A†ià’ëªd·«£õÜ­²©æÝ„·¾8ÁvhzÛ·ùZÞ|C²? "Æö¥õJ,Neªº¶îÈ(1§ï54s÷­í^‡×]±Í­}I™{xb! æ‰Lð?@ npúÌ2W*°ß¨­”Þ)~Âÿ°D
-Utb75ò%ûìOŸü_XØ)°3ñdd£eSϸu‰>Ò ¸b-µ±{Ùíg^®ó_R!KLŒ™™X%NÅ?ý)í é§Õ~—ÛzÑ®uo:Ÿ| Š„4 Éy_µIk1´u$÷=1¨ÁøµØƒ¢ÔïêTà Oõö]|„
-clkïEqYú“fPgP µªåü&÷pÖ«*4»âé¢^Þ>¿èDûL{x_¤}¥{ß_UÂb
-€öÒÊçþgvóokp±JÓ_Ö×Î…–+ñ(K©”%©4=¦ÿüÑU&endstream
+xÚÍZ_sÛ6÷§ÐÛÉ7  }r'çNâö÷)Ídh‰–x¡HŸHÅõÝõ»ß.¤(‡’ìF7“ñ°Xì.v YŒ8ü‰‘3Œ+¯GÖkf¸0£éò„æ0öúDÄ9“vÒ¤?ëÇë“¿½Rvä™Od2º¾íñrŒ;'F׳÷ã?ûåúüêt" 'ìtb>þñâò%Q<}^ü|ùêâõ¯Wg§V¯/~¾$òÕù«ó«óËç§ጀõ2rرàÕÅ›sj½¾:{ûöìêôÃõO'ç×ÝYúç\áAþuòþÍàØ?p¦¼3£{èp&¼—£å‰6Š­TK)NÞü£cØ K‡ô§¥bRz5šδ»w¥8ì›°Ò£œÛ›N„0L…&ÑšqÏ7&‘¢g!³Ò›‘5ž%Jª`“¢šÏórŽºù²?Ÿ;&´Å}pb}—Móß8—Y ZUv|¿Hj5‹ n\g«ÏÙŠˆÀ¸þššÓrÖ.QáÆÙÖº0—,³S1®ëtN›¸qçƒx œ•yc$ ”• {lSÃ-s–‹Q__§_å%3"±£I;á˜&“0ÓqyÈdÊ@Cx2Ùý
+ÔsÐ`ÓªDsÍפÂvEŸ¿GH”é2› ðUš%VÅIMu:Q‰§E- Ö6‘TÇ/Ñ‹|¾h&÷~h
+RÁI2K³I°íÄi¦B\!SÀXV%Ýà߸áòKÃœ–>Šô2x
+F'ÏVMšÇÐ÷¥‰P»‰°‰)}î(ÇN:;í&­ó}ÚïëëTõÿ½4*aÚëCÊ7pq¤Tð=ˆOù´žLiYfÅ“â„™6kÄLÀËåºÌ§ÑÔ² =L‹øg 5Òé4«Ã ÅÁÜ¥ãRªÉwÒÍÛ?ݹöXu£®oùJI¨#”;”É &’FY­!'Ì&Ÿ²‡ç¥3¼ Ý8¬§þËËwïÎ_PîQhOÔoùšpÎ@]s‹H˜°\ElPè~ªF1å£6mO{Ví¯Rn2êÊîj­ïh„fp@€MF
+LçG« %´œ.Ú¼³„ÀÙd%²=†ìiè¾Æ9DÞ‡²¤ñ”m>çÙý³¯DÌa­—ãÝŠëKt¬Ðþc*Î&Ì
+w¨ª26áÚm
+¿oÊ2(3Ûʱì /eºúv7Ȇl기-Zë@mwZ4V´­étÝ¢aGt6„ëX'YÙnÑ¥%ƒŠ\Z&§BŸ¾ ,
+αú.ˆß»V øæµJ—Ë4ÂNÝ?/GLÁ¼¤àÀ !ND!ÔûO´mÔÛ·³ÚõÇeÚLCùJøG“©„ÿ㇡ƒ <'‰( $è%ݼ|‚©4Ưø`4`±G'ÝíJµ®„»P~¢ücÓãëÔ²uÏסVÆOý°¼©Š|J=Ò*¶BÖÃieü‚* g†õÉ8è”ÆP± ªdîÆq«9•ÐÊÛƆ÷-•|Ë-AîV9xÁu r&K)ͤ“nÛ¬ÕmTë–LÁµI&Ã)ñB >>‹7¼Ùn*N"¼‰!¾Ýœ½xSwï.!}C]«¤ _V”õ„'E¥’  ¤l ƒQCaþɤ¤.×uäq)mÌžù>oCxÜ:(µ»@¿ÃpZÝÆ€› Ë]zÏÄò¸ñ´•ž$HPñ3¢@Áu¯ ?àˆ—U¼?œÅõ=#ÑÛiímä¥ÍEÝÓ*vŠ¢ºÏfƒú¾^ÄI·Î"Ô]4Ò
+ÿ ¡ 6k „ÌjE¥Õ_ã1í è§Õq—»jÕt¼7[غã˶§˜ÉùP J E.z—Œëñ„¸{P¢öe°t^¼_GŒ±þ²¡ÿ+’]ÓSÙc_ᣃØë©ÿs²ù‡ÐrnÇÛJçœQ(<“V_\eðHã¤ý|[moendstream
endobj
-1195 0 obj <<
+1564 0 obj <<
/Type /Page
-/Contents 1196 0 R
-/Resources 1194 0 R
+/Contents 1565 0 R
+/Resources 1563 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
+/Parent 1562 0 R
>> endobj
-1197 0 obj <<
-/D [1195 0 R /XYZ 85.0394 794.5015 null]
+1566 0 obj <<
+/D [1564 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-278 0 obj <<
-/D [1195 0 R /XYZ 85.0394 585.0446 null]
+390 0 obj <<
+/D [1564 0 R /XYZ 85.0394 513.3136 null]
>> endobj
-1198 0 obj <<
-/D [1195 0 R /XYZ 85.0394 560.705 null]
+1567 0 obj <<
+/D [1564 0 R /XYZ 85.0394 488.974 null]
>> endobj
-282 0 obj <<
-/D [1195 0 R /XYZ 85.0394 491.9365 null]
+394 0 obj <<
+/D [1564 0 R /XYZ 85.0394 420.2055 null]
>> endobj
-1199 0 obj <<
-/D [1195 0 R /XYZ 85.0394 461.8226 null]
+1568 0 obj <<
+/D [1564 0 R /XYZ 85.0394 390.0916 null]
>> endobj
-1200 0 obj <<
-/D [1195 0 R /XYZ 85.0394 384.4846 null]
+1569 0 obj <<
+/D [1564 0 R /XYZ 85.0394 312.7536 null]
>> endobj
-1201 0 obj <<
-/D [1195 0 R /XYZ 85.0394 372.5294 null]
+1570 0 obj <<
+/D [1564 0 R /XYZ 85.0394 300.7984 null]
>> endobj
-286 0 obj <<
-/D [1195 0 R /XYZ 85.0394 206.4979 null]
+398 0 obj <<
+/D [1564 0 R /XYZ 85.0394 159.3 null]
>> endobj
-1202 0 obj <<
-/D [1195 0 R /XYZ 85.0394 171.8379 null]
+1571 0 obj <<
+/D [1564 0 R /XYZ 85.0394 131.3824 null]
>> endobj
-1194 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1563 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1206 0 obj <<
-/Length 4496
-/Filter /FlateDecode
->>
-stream
-xÚµ[_sÛ8’ϧÐÛ)W ó”Í$sÙÚÍÌ&žª½š™Z¢-V$Ò'Rñø>ýu£” Û[É•HP£Ñhtÿºæ |¡Ë¢tÂ-ŒS…f\/Öûlq }?½àaÌ*ZMGýõêÅ_ÞK³p…+E¹¸º™Ð²³–/®6¿-ËB/[¾ýùãû?ýúéÍK£–W~þør%4[¾ÿð÷wôöÓ§7ÿøÇ›O/WÜj¾|û_o~¹z÷‰ºÊ@ã¯>þH-Žˆ~z÷þݧwß¾{ùÇÕß^¼»Jk™®—3‰ ùŸ¿ýÁXöß^°B:«÷ðÁ
-îœXì_(- ­¤Œ-»Ÿ_ü3œôúŸfåÇY!d)2|Áyá´3 jW”RÈ$ABaŒ-×];º]O«ü<TC½¯Û>¬gL´ÍÐt-µTí†^~í«Ûe3ŠÉ–±ÅJ
-ú½X¤p…TÜF¹r$e"Ö‡CS­©¥íÚÕ?O»ûãnjzCrØ ?!)ÂÛTŠ8=è$·…qÜøiß´Ip]Xà8,²ië!# ¯–‹©Þ¦ IÝðÃ.›ž+ú¼zû }÷ÝúK=Ðûô«n›ö–ÆT¡™ú»zÝà„ÝÌœ"UÂÑבå»SË$•+³rQ:VaÄsl“€Z›·L«Dq5%ÍÎD­4ì²3|œ9¼ë9¡
-^0m?#ÏßZ./Š@i0Êt÷»‰ Q|BJ›‚—¥™‹ ÚlD yXÅ+X¸”Ëûm³ÞÒéQЯ™²s«²®PVÖz{&,hZøþðËWE-Ý!µ”ôæ𧩠£„¾pÀŽqaÔEÁ
-0òVXž“õäš®&ÏÅ
-ºQXî.ŽzLª²pLE±‚ÕõCÔl¼"7Ê £¤òÿ3CÊVƒUŸŒúiVÁé=4ýxç$^èAðM =wÁ¬ySŒ²ïéIº £âFÙå}³Û¬É‚oÂfŽõià´@–s
-F¨­×è\¼—ÓHÊ;%E~Zªõº¾È×i°·jBà ==[øB^ð?zGLz:#K5jOi ½tbÙQ?Y3úÍ2!J*×ÍóD¯'ÓÀQ\ 7ƒ†è#o”Õ梪ri ر„“kKðߪª‘àjJñ\U¹â`œ'~LWUÁx©ŸÐU6 yý:矂ip ZvCÂ{莠ZÎE ¦®Ý=Њø\´ÎRñ$<PÚê‰G‚¤ä0Û®[Waºm×iK½×;ÙÝ]Wë/a¯G5ú¯qWÊ+ˆç0#,YHn"O`É
-<Ã=
-€†1–8ÑcXföß‘õ8Ýxœðãîn×øæ!y:2dAûh¬O¿CǦ aÃÐþ©ExñMG$mƒ÷fèëÝ ‰‹ÃA!@£ÇO?ËÀQQºåÝ¡ÙWžGø¨ŽÃ¶;4ÿ›RÞn¹¯ñ 7ýžÒ”Y>ŸP÷p5|¤3þ|„¡¨‰¬»„ý2¾ 4ø!4Á B´R}‡$h¤¸š’̘` ¸Þ‚¤Ò°gc Ö
-0%ÿÁÄaTôð´ü[LÌXIL—ªœïpFHà,¬³r¡ ¼“ýÍ"ŠôV‚ç2àv0|‹ƒ.B üF+å †²ËwùÛ³Ô3X4æ.+fo¦o¾×bÁÇW‹Û±Ò=½\øB«2•"0;rÉ Þýõ†Q Ý÷[m$øøj
-ø˜T›à‹ÂÜ(,x1'€AÆ%(Ñ纾TÏUVLK‹ë£¾Ãí‚^>å*ÙÓñ$‘©d§Q¸Ôß>Õ{r{F,?RùÊÈå4·ÔúvÆ?tz²ö¦õ³¸@묓œñ~V;N£ž`¶¤à|ÏxnÚ³Y¯k.øs%–Æ?5ÿ]ïÎ)n'é@ÌW
-8u@ 7I "[ç6
-ð/õ5-å4!‹Y?ZÚñµÎP4*HÒ7žAån0¸9§_
-X½ŽwïÃÃN¢c¼ÓÇYë–ÞÂE.l‹×Çf7 ¡.è–N,Vbßšô³"÷Ë¢âÍø¦¢tiN"ÊÇ¥ !‰LâÁ]{+@vyŒb·S]ƒ9dÂpH|…ò¹Å…¬—«*WÆ|4sÏQ³RÏ|º‚¥N"v%íç(N9¦©o@bÇ"båº
-%ïQ ¡ÜMiM}=+|ÃË¡jûx«Ì:Š¡ò*àä€@WØ^x³¯Bs‹U
- ÁèM¦%£-Þ¨x¹V¥Ü|7Ím3Pe&†H7- ,3¡’iƒ±ff<ÔØ:–Kàc¿º?Lc†í14yî°És‡/dòüðl Å¥RO>˜í¸7ylÁ|ˆø¾úBlá:‚½6àkÁhŸØë®ï›kŸà’lKC•wlðwK$¢oð“ä%¡;l
-´[zŒ0' iÆÌ høKã¯]BñE‰ÞR¡Rºp7 :`:o}ahÜѳb®§o±A@"ÒÃûîð%,5Z^
-Ú¥[,><P›OÂ(
-}Hú*fOÔ˜=9·-<8þïÈO¥bvu3ø°j¦ƒ] ¾ß@ì«Í r iþ¦È°Û%È.}nÚuM)Ô!k¢¢Z‰g™(;^Vš™(¤îQé¶÷×s¨ ïgïèI…Êĉï>\VÉíï@¯ý)ÁQG–hßГ$„¿´Ô
-oD„«Tþp`J“FЕ±íŽ» 5¢É£·œOåë—0­×*<ù«!R&lußøÒ
-IX‘”2W‚`É(|ó? NêP3‚âBMÅØBY ˜Â•Ë³úIúïÂsÖÿb]+endstream
+1574 0 obj <<
+/Length 4330
+/Filter /FlateDecode
+>>
+stream
+xÚ­[_sÛ¸÷§Ð[åŽÅÃ_‚HžÒ\rõM›»&¾™vîn:´D[œH¤+Rçs;ýîÝÅ )A–;ÉøA$
+lþö‡ﯿûéã›K£æ7×?|¸\Íæï¯ÿòŽž¾ûøæ¯}óñrÁ ÍçoÿüæÇ›w©+÷4þtýá[j±ôs‚èÇwïß}|÷áí»Ë_o¾¿xw×2^/gò¯‹Ÿe³,ûû –I[èÙ#¼°Œ[+fÛ ¥e¦•”¡esñéâo‘à¨×}š”g™¹HPñ‘
+Ó‰4-sû“Á13Ó½lAÏJ/ÃÜÌÛ;ü-ÜG®¡)·5uÕî7P,8ŠÎ$P~ï›LŠŸ «Ãn/
+ꢥá.-Lv¼’.0Ž„wÍj™Ø!3.ãvíûzS÷OD%BŒ7~Âe»Ý‚–x® ßÉE
+›IÅ´5jñÞïêê·ŠZš¶Y|ûáÓ¸»Ûoz¯§w$ˆ­WJÿ ‰žÆbÄéA)¹Í”…5à´oš„(¸Î
+àØ/²nª>!  b .ÆŠwDD}×b^wÔXÒëÍÛé½k—Ÿ«žžÑ&TMÝÜÓ˜Ò7“f@C÷P-k<ƒ°‰c¤r0†:°üph«¥²c…œÕÈ
+åÖZÀ
+‹"m«‘âbLÒâ©^iØekø03røÐîRB<c6h—;$/o .OŠ@ipSÆ_O‘â(m2žçf*‚rµÚ §ð
+.åüq]/×tzôk¦Š©YY–(«¢pM iþýúÇßµ´»Ø’Ó“cÀ¦LŒúÄi
+&Ó`ÙG£~aš•p€wu÷ž9IØ{}Ý@σ·lΣø;ú%õ†Qa¯Šùc½Y-ÉŠ¯ü~{õšA€Ó×LæS3
+v¨©–è`œ§ÓHÊ9&E¾ZÊå²zèÉßiwÈ°·lž|Ãý:¶ð<á:GL::K*P^
+epc .ѯs±“YGþóêpŒÕr:q#"OÎr'tå-½ý"„JÈVÆr°‹ç¬¨Î€õ|bE‘¢£ ­i=k·ÕÀÑ ©„zÂ+ ?lžYSiàP&ùr (.Æ$ÈÂ3‡ÅÇaÏ` Þ…ÛáÔhÎÀ`ÎoyC*²Å·ˆ£±í½®»nïû$îL<"bºŽ&aŒð«£tÉçþ[Ÿ/£¹}¬{"°P`ïòx¦Êͦ}LÙ ‹»Ž †É` TØaZ'm§ÉU8ìî"ôÒÓ@âÄh¼;M¡%…2Zx[ Sx Þð!Þ‚L$Ô=yyx½-½Ö
+³H=8*l;š;oê&*œ
+¡ûW“A¤xFRÎñC¤†a™.
+ œEa ÀLf
+¥ b¾b/ƺsÈãøås û_‹2U™ÆÄ4SÏX³<Q<Hl6ì Ö¶_¢8ù¯¾‰íc¬ˆ%ìÒ×¾úº7å?,4uÕ¤»²é³ÂR`í”`ñGºüöÂSqåë™k,W¸H F¯j?-hqFÅÉÅ°L(up¤Võ}ÝS‰&†7. ,3¾¤YxcÍÌp¨±u¨›ÀË,~y>ŒcúõÞ79î°Éq‡dòÜðd-Åd¹Rç+ ÌvÜ™<¶à®{"¾-?[¸o¯ øZ0ÚSq<´]WߺL—ô`[*Ácƒ»g"}ƒŸ$/ Ý~S ½ Ÿæ$ÍBƒµ§¾4îR*4ì”è=U,¥õ÷Ä ¦sÖ††=ªº9\¦Î€"ˆHD¼ÑöØî>û¥Ë
+9ѽ1W·.ýU¥Q^^‡«ltsiçÛ×þzÖ`šX°ÏxÀíQºº¢¶ª;Ïòxš!ºÄ¢W‘ƒpÇ€~1\Má™$¿ »à…Kq˜x•Ò/Lå6I“«“4ý­€ûdè»"ÃÞ¿N©+Žåã8èð?aR‹ÌXéÊ™T~oñ?b´ÿ@"›ýªJþCÌw»¤
+kþï%A\uWo*´>¯O¦—u†ÿ•HL²Èüÿ£Õ†xB…8‘i5EAƒ Láj”:â<üGÖ1ëÿnI”endstream
endobj
-1205 0 obj <<
+1573 0 obj <<
/Type /Page
-/Contents 1206 0 R
-/Resources 1204 0 R
+/Contents 1574 0 R
+/Resources 1572 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
-/Annots [ 1208 0 R 1209 0 R ]
+/Parent 1562 0 R
+/Annots [ 1576 0 R 1577 0 R ]
>> endobj
-1208 0 obj <<
+1576 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 480.2482 256.3816 492.3078]
+/Rect [55.6967 387.5149 256.3816 399.5745]
/Subtype /Link
/A << /S /GoTo /D (rndc) >>
>> endobj
-1209 0 obj <<
+1577 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [268.5158 480.2482 332.4306 492.3078]
+/Rect [268.5158 387.5149 332.4306 399.5745]
/Subtype /Link
/A << /S /GoTo /D (admin_tools) >>
>> endobj
-1207 0 obj <<
-/D [1205 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-290 0 obj <<
-/D [1205 0 R /XYZ 56.6929 769.5949 null]
->> endobj
-1043 0 obj <<
-/D [1205 0 R /XYZ 56.6929 749.0409 null]
+1575 0 obj <<
+/D [1573 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-294 0 obj <<
-/D [1205 0 R /XYZ 56.6929 209.5509 null]
+402 0 obj <<
+/D [1573 0 R /XYZ 56.6929 692.9565 null]
>> endobj
-1210 0 obj <<
-/D [1205 0 R /XYZ 56.6929 183.9497 null]
+1329 0 obj <<
+/D [1573 0 R /XYZ 56.6929 660.5438 null]
>> endobj
-298 0 obj <<
-/D [1205 0 R /XYZ 56.6929 147.0778 null]
+406 0 obj <<
+/D [1573 0 R /XYZ 56.6929 112.3379 null]
>> endobj
-1211 0 obj <<
-/D [1205 0 R /XYZ 56.6929 116.7981 null]
+1578 0 obj <<
+/D [1573 0 R /XYZ 56.6929 85.6994 null]
>> endobj
-1204 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F14 740 0 R >>
+1572 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1215 0 obj <<
-/Length 2349
+1582 0 obj <<
+/Length 2372
/Filter /FlateDecode
>>
stream
-xÚµ]sÛ8îÝ¿ÂÊLÅòC¥ÉS·›ô²w›½K½OÝNG‘[³¶äµäd|·ûß$HY²ä:½Î’ €
-ÞÿíÝ?7W!—4ˆÉU(cüpwÿ#ΤøyÿËýí݇_Þ]©(XÜýrÓ7·77÷ïo®B–Hû¹£pfÃíÝ?núððîçŸß=\}^ü4»Yt²ôåeTAþ˜}úLçˆýÓŒ‘&rþJXšòùfIAd$„ŸYÏ>ÎþÕì­Ú­Sú“"!2ájBœÍ#©”| A™’Xpa5h„V 
-” ö†‹»å‡žvøah_à1]#øG£ö G`ß#n¤$à½é€›‘“tX—xQ3<€"2àõÖ®œÞò\l£P”$ŒË¡5櫬ªôÍæŒNYÄà¶c5iJø%vØá},Ë)Í61`r8IAlóHz¤ÍçëçŸPòš$¨,Æ(Q±0ÊJH"hú Å È|Í_
-ÀK¢¨<•
-*žÊàïúÐà … ÆŠ€ECÄhaB—0œáä QÔ1wJÁ£rAãiDGo:ª€G_ˆ5$Äÿ5NáI€$N&‹ÖêªÀMc–£3”cJ»\I"˜Šspkí®^7RÀó™˜gæÔn¬6#0Rˆ røsb‘˜I5—qL"•$—ÜØã‡ý Ž4¢ûJW– ZÁ¬O~ìÌë#jÇÐhXØì÷jÚ ‡¯¤Ü‹™¹et%XÀ¡ J˜ q.*Hqb`îC(€sHˆâx.#xZ"•¾&#ã$M@¸É|,ì(†}’VYCÖ¸$Q*£ãɆŲ˜ò"ç¦(ÅcÒ <£©â*ø½ª_*³¿¨@³fÓU¶Ñv'J‡”áJQo²Òí7Xí«ò½^paªj˧dU¸ip
-I}*ÔèݳÞMy)dnŒOwÇ0BäY0í G(Ÿ¢·«Ì͸Sq¶îG-ØW.»À‰Iî-]ò*²êÇaâŠyiþ&kó• . zl^Ñ~lY—Èr¢•$ €7¸7‡LTV{à•ΉÀ°¾Êž5®=j]á\' ÀN˜Äff­
-û'!K°˜Ä0GxHâïŽXž^Ø#8XÌK¦,éŽÅ'ÔFŸÉtXÉDöb–Q+^kÊ-»P»kpë.Éï]ŒÛJûo¶n Õ6àzB¾Áb6Y"žç-”bd¾.ÛÌÆ4<Š…GDÉ™^ÊX”v½ Ôõ‚ÖõréÌùé„aÛ§#rì€1ÙªiÓõ¥ý„]‹ 7ø‚éZ€ÛwRØIŠHOåÚ¡o³v…»':o¬.d „GGZÞ_ ü'~öպܔö.Cèó”ƒ:úMùo=‚à…ëï 'år§6‡TÙ‡¿<ey¹†gpªMèwµ…Þí¦øúÓË·^å¸îóÁ¦Ñ& kGEå0„xº( N­‡j{ÉvUgþôvj?eÎvaf KY=Õƒm…~Ü;BŽ+ק@]PpýeÞ±¯ñáqA·à2mhÞpV'îA;ñ²Uõõå»GJCŽšSjKï—¨L[Ô_¯ày(·]òDÖoóõ¯—uvòÜ
-¸ucØ·uÃ}Eü?¶Ä©PþÝñL¾O\¤l¢-.T¯9‡5—™Åî¸0iÇè9Û•Úؤ˜|Ä`uBÛÉm‹qÑ °[.\ámpñÍ”+Ud²©LÜL5ûdJ 'ñ)£÷cñ }SDªääíj—amkÞ¿¦ÎK»Á^A½o·û×6º]ÕEókM`|“¹•N"Û^°W&úqÍŒl<q(/¦
-Ár“+Xw A»Ú™ù6ŸM„¥3;vNÌÕUž®4¡¬”Pé3æÎ%'Š(¯ÒNCÒ%%&Ðk;»]Õ/˜Ë¯÷.‡È× M혙%6Æ’}šqL‚Ñ3tAÎýñ'$1ÿÖM´Ùhç{ßý§àñS¨ÆD’œi¿ C­–*Ï”Q’§œwÿŽYÿ/%Ž\endstream
+xÚµËrã6òî¯ÐQ®
+<,Ÿ&ÛëìÆÙxœÓdjŠ&a‹>‘²W»É¿§)R¤,ﺶt`h4ºýB‹-(üØBKBE.TI™\¤å]<ÁÚõó8A‡ ±¾»?ûöJ¨ELâˆG‹ûÇ-M¨ÖlqŸ}^~üÛ‡Þ_Þ\ÒeDÎÑåw7·ßãLŒŸ?Ý^Ý\ÿr÷á\…Ëû›ŸnqúîòêòîòöãåyÀ´d°Ÿ{
+G6\Ýüã¡ë»?þøáîüËýg—÷½,CyVßÏ>¡‹ ÄþáŒk¹x%,Žù¢< ¥ 2¢›)Î>ýܬº­sú“B©¹šQ g ÆH,%iPÆ$\8 Z¡#P
+Îq³æ_I¹.Ì70âùrD÷ú±Dà’Š Wzg±óëMþ ˆ8øÍìÎÙ²éxIüÞÄÛ”‹Žo´“>y(¼÷ÕU±CèÁQU
+gRLöõ„ÝáÉC)’g~.™‘ R‹ë„zÎÍË\D€úQQy($-ËåßÍ®Á2x{Œ{ Çöˆ‘ÃU?–3ü‚¼Š:åN)"B®Ni<éDã RG•ð`ð qgÄ
+·Önꢙ+ƒ4x¿d»qÚ ÁH!>Èq;æÐ4$“j*A4„”SÝáà 3®4¡ûF‡– ZmH~êÐÖ).&ÔöaÒ²PnŸA|UÒ%,Ÿ=“ö ~AÀ¡ –8åÇ¢‚ö'¢)€sxE‘ ñ‘ŽÂ·¼Ã8‰µÖó¯° § I:eYƒz Œ¡êèÑ\-žÍy‘wS”âkÒ <£©âjù[U¿T& ~QvÍ•0<r• ÛÉña‘q%«Ë$÷û}½жÊßWXÂÂTÕæ;,¹y4>€1¶t®É—7-N£kðÐѳ®U:Ø!c|}^sT¸D!iWùBvÆK)¡ŒÏ=lÑ&}hÀdlºÇ`3AÇ‚ÜÎøSq¶F-Ø—?õ &Ü›û Õ©È©‹…QˆË2ä¥ñøeÒ¦+\@ôÈfÒal)rdžBŽ­—ÀÜŽŸC¦‚gG]úW’>ÖWɳÁµc*œë…Ø £]%i'К
+¢b-N‘Ò¤8gˆE·8½™/.££ÄäKLèYÎ kF}Yêýä€P…ò€ždü(½.ú‡#Ù]ÉTˆƒVÑÐb¶6îÏc
+q„Ìc–!l4+׬‘¢oT¸oFˆ'|7búz EF ˜öÉ],m“¨Ü–ˆTmË`aÁUÔr¢óþùêÈæ.~Áúçƒq\Á ™, c߉WÙaìÛÖ Ø½!OdFÙ1ÔÇLðC 4ѶbD‰®6´"ÈÍG¢Vy,ê3ö.B–`‰ `ΠryoÈêCŠÓ%lK0fz0fQ€f+b%µ„-«Y¼Ù˜: n¡ö7á×}?¸¿•Óvr Ú.æmµï·¸£m¡èÛbm_Jú…ÄœIc‚(Äm f"ÊøÖ¦Xì[CEýôä-úiŒaïhìûaLA½jÛóCa?#Fß0 ¾bÁ6 à÷<í$E¤Ç¼ðèë¤]áî£}8.Ô „„G{ZÇZøül«"/sw—!ôe.õ{úMþo3 Ç w³rùS›]ªÂ_}oz7º]mf6›9¾þèä+Š½C>ؼ Æ–aín¯¨ÔöžÓ¤) N­Çj{I6UoÝé5ì4Ý”=Ûš‘,yõX¶eæaë y®|§u9BÝÁõçéPÄ¡ÆÇÇ]ƒÇ´Íà«^ÜñÒÉVÕ§ï)÷fJlJ©Í;w8EeÞ¢þ|Ïc¹»Ñ)Odæß
+­ù|ƒAЊËXuLYÎÃIï·ÿ“sÊú_—0‰Äendstream
endobj
-1214 0 obj <<
+1581 0 obj <<
/Type /Page
-/Contents 1215 0 R
-/Resources 1213 0 R
+/Contents 1582 0 R
+/Resources 1580 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
-/Annots [ 1219 0 R 1220 0 R 1221 0 R ]
+/Parent 1562 0 R
+/Annots [ 1587 0 R 1588 0 R 1589 0 R ]
>> endobj
-1219 0 obj <<
+1587 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [406.6264 617.3695 456.8481 629.4292]
+/Rect [406.6264 524.1437 456.8481 536.2033]
/Subtype /Link
/A << /S /GoTo /D (tsig) >>
>> endobj
-1220 0 obj <<
+1588 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [140.5805 606.0819 196.7992 617.474]
+/Rect [140.5805 512.856 196.7992 524.2481]
/Subtype /Link
/A << /S /GoTo /D (controls_statement_definition_and_usage) >>
>> endobj
-1221 0 obj <<
+1589 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [103.6195 562.6731 159.8382 574.7328]
+/Rect [103.6195 470.0794 159.8382 482.1391]
/Subtype /Link
/A << /S /GoTo /D (controls_statement_definition_and_usage) >>
>> endobj
-1216 0 obj <<
-/D [1214 0 R /XYZ 85.0394 794.5015 null]
+1583 0 obj <<
+/D [1581 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-302 0 obj <<
-/D [1214 0 R /XYZ 85.0394 769.5949 null]
+410 0 obj <<
+/D [1581 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1217 0 obj <<
-/D [1214 0 R /XYZ 85.0394 749.0225 null]
+1584 0 obj <<
+/D [1581 0 R /XYZ 85.0394 749.3189 null]
>> endobj
-306 0 obj <<
-/D [1214 0 R /XYZ 85.0394 668.2594 null]
+414 0 obj <<
+/D [1581 0 R /XYZ 85.0394 679.8163 null]
>> endobj
-1218 0 obj <<
-/D [1214 0 R /XYZ 85.0394 636.8261 null]
+1585 0 obj <<
+/D [1581 0 R /XYZ 85.0394 652.1211 null]
>> endobj
-310 0 obj <<
-/D [1214 0 R /XYZ 85.0394 425.0299 null]
+418 0 obj <<
+/D [1581 0 R /XYZ 85.0394 573.4726 null]
>> endobj
-1222 0 obj <<
-/D [1214 0 R /XYZ 85.0394 396.4061 null]
+1586 0 obj <<
+/D [1581 0 R /XYZ 85.0394 542.9681 null]
>> endobj
-314 0 obj <<
-/D [1214 0 R /XYZ 85.0394 136.3155 null]
+422 0 obj <<
+/D [1581 0 R /XYZ 85.0394 335.1831 null]
>> endobj
-1223 0 obj <<
-/D [1214 0 R /XYZ 85.0394 104.8822 null]
+1590 0 obj <<
+/D [1581 0 R /XYZ 85.0394 307.4879 null]
>> endobj
-1213 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F41 939 0 R /F22 737 0 R /F53 1029 0 R >>
+1580 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1226 0 obj <<
-/Length 3704
-/Filter /FlateDecode
->>
-stream
-xÚ­]sã¶ñݿ“—Ê3'†
-‹ÏÖZŽJࢮ:K:Ž›’{¼ ÞÊ)×YÔ©yÁ¦à}% ›0¼+öUa§t2¡ÝÉ„™ex2%gUO3G‹&¦Ô€&ô¬k-#Rÿ\Ë%ª/:œÕœ1¸’gf[Ý“cüóý˜YÞÁ¸+÷À2Iö©Ž nl¢HV&*ÁMö=‰þvÈ .
-ÈÙ¹9öíž½DKO8r³bª âɤ¿ÕúÄ­ü,eðÂHˆ™“×<$QG-±ˆˆ¨ÝÈ'Y‡‹”íÊe…§Gñ>W£¹H“Èh¢TI”«Lù¨ AK@,ŽÁæïÕÌúóãf_teØॎÒ$Î,²7Î=‚à™ÒC¿;ô4~hËnÊ̶)§\Þ¶l´v+•y¡1ŽÇ‚™á£QÀtkþ^â§öÀç*˜oÛâ‘7w äP‡ä 2ÜN×x<Ñ"²‘å‘ÐM¼þ-Ø¢3鈗Ƹ0[±az{èzš«še}X•.ÜúL¬–/ë‚7Mö›¢'hW<uoh#+áöFg•u¹ìK°õÖ-¯c×sÆ`M¦­5á³ç'˜684—<™ÎYoÓWËC]ìé?.¯‹eUWýÓbvò:¾057ØnlnviL±enbÈ?àϪꖌÅ:¿<á]OQ#Á’l \
-Q8ê‰SÙ¬®¶èåHtŒùLЮÙãÉh9ü«Ýr+.
-“yý·iDÐL„Ô&Äl•jÏl•"GˆªeßÑ$©&®r´ã2k3©õ™ø
-W¶ô\”ËvkÀI¸:(nj\a×±\០µç6d/i±Ó³+>¸Ëb¹áw­Fž%;èßÁ™¬‚úªJr
-Š$šäg2tc¢$VNsüùžë¨¹1&2yÂêSVŸÚ¡…¤Ö•5ýrÈ’/ùÎN¤œç Vân¤“}aÓikPh›8C2ÂÑ¢X>v4?È gÚõÀ ;=
-ä‚zÉ8=ñ“ËT*yc —²ýTr~…#.á`„r¨õi:{k5€Ëàámš¬¶I6BIB0XnÚ–ÌN²=ÉÙcYîÜ>´7/hë FGCðÚS…5ñ“Ü=>µ- ŠPžÏÅ ó(M}:Š‚MR,xÈlö›üáhQ®[_²ÂÿŠá¶Ø‚')l¨’
-tˆûF{ëñ¥5à¬\¢Ôuí²¢¼é;V[G™‘á‚7ª!îœÅ‘ŽOÒ²}H!N¢Ôš³HÃÍ.­¸FÖì"Æ)¢L/JÆbœ§°àòã²,WÝÉ‹U³ª–| X„œÁæ¬LgïZZá"
-»s;:ZH™iM¼"ð¥é¶øXm[çÀȹŠQwuÒ:X”›âCåûÇç .@Žk`ëÐN[–c_ô”·”KÓº÷­Npª¥Pc½èJEž¸E>;:uÉJ§ê"+G6Õº.xï&RbH²é9}•·YEó+׿Nà|!§¢o‰'ò\WÈ$\ô¿ŠÙÕ\þSô yàHÆÛ×Ák¤}ÕôsªXqÝSÙïêhÝôÆίɽäJîlÔ™o}p“62 °äâLŸIŽúLrÚú@
-¾aÖàÍÒLœvó_ õ­­ŽÏVü)$øIž¼È0Aþäj­mÁ8w`qXßÆföǦ=2”ûáö"ÿã«©¸¨”· Çrß„›‚ñi6m[DRGHnêv­šT^Še[TuØ+$žÜ³Hœþ­
-pÕ¡ÙÌDf—S öŸ#æâ#®Ì"P¢ôR<õ.È_}ò@ó?)À\gâ 9Lp iŠ$ ‘8½=–»™,É^ÂâÒ†å>(,Ðœ\êKIAYËû’zŽ¹Gr)¦u¿;ÇçX\Š¤n—Eª¢%¨ ‰åoÂ#þw<zŒG~&zÔg“|¦séÏD áÁ«Yß²:›$FecTé$Í¥QØß.ýÇIŒ½¾D~ºdC•p÷-bâé턯7àOwØíÚ=÷ÄŒ‚«ÄxF.·ÓvC”š}K=þÓ› W:R·OÅ÷ÌŸ›ï°DìUÍä¿+âk
-I;¥Ž©‡]n›$ÊÓL6|öEõ°ÁÝeNÚOTt5êÓœ}m‚Ë6–6ºáµiêšE"Kcre;7jöýà{dî-Qæã†+œÊϺ,:Ú
-W¹*
+1593 0 obj <<
+/Length 3489
+/Filter /FlateDecode
+>>
+stream
+xÚ­Z_“㶠ßO±“'ïÌYÿJê=]’½tÓæ’^6Óé$™ŒlË»êYÒÖ’ooÛéw/@€”ä¥ïÜöÆ"A
+@ø²¸Lá'.Ml!‹Ë¬Ð‰I…¹\7éåŒ}{!xÎÒOZNg}u{ñåk•]Ia¥½¼ÝNxåIšçâòvóËÂ&2¹éâëÞ¼¾ùöç·¯®2½¸½ùáÍÕRštñúæÏ×Ôúöí«ï¿õöj)r#_ÿñÕ·×oiÈ2¯nÞ|C”‚'˜¾½~}ýöúÍ××W¿Ý~wq}t™ê+R…Šüãâ—ßÒË ¨ýÝEš¨"7—ÐIQò²¹ÐF%F+å)»‹Ÿ.þNFÝ«Qû‰4‘Êʈ¥¸")Œ‘3 š"±Jª`A‘‚UÒ4]캻»º½#-Ê¡jªv î7Õ¯i*Ûz¨»–(e»¡ÆÏ}yW¡-`E9Ù²ô†“ãò°Ôí½Ÿ$&“dš¤*30çx ž3S9hYž×Â)•-Ö]‹ÒÝöW"_T=RóEIƒõ¦¢Öûr_WÃuº-Í
+J;âê×SgÛí©1ÜW4·-fÕWû÷Õý'“‹›¡h§ÀÖ*‹½¾/Û¶ÚEÔ[j‘%&ËÕå2l¼ðp¿/{XR*°wßwëôî±/Ýax8 4ÖTÃ}·é_`O£àMÉ#A#|…¶ ¨}Ò×h
+ìí ·ã)õ•
+09¤ …@Ã&tž™‰è¯øìÜáÀV¸ÚÕ½ .v`+ð…Ý­½od”O¸/yUÌfÆãZî{çÁ&ÍH3a¼fÂ.rÔLÉE=ÐÈ£ãsi@fÑwNŽ %Ï$z/¦í3r[*U$µÁ~™%ÃÁø
+›0©j‡òµ«½ìöüJÝÒ“ó¨Šl*Œ†M…ö]Çot³7u8\‘}öQŽƒ&ïYR ð±ÔD bR·ÞE•_¥Ô‘P!¬ •ûýZÆvÔËES#êa’JÎ4ýCµ®Q{Î0Gn´™N¬Á¸ª
+¨}ùÔ ‚¡Ë«Ä{Ä"8Éš
+Žú†šbƒ#ω³
+‡H¿nêˆ$'ÐØÎD¢âœP±ŸN°7÷8h+~©\¯«‡ÁA2_=-0îPMMFNÀ‘ºÂÆ<)„)øDÔí¶‹Åš<ÉEbMjÄ ro­³$SFÌ]ÃÁ?%²Ñß°ã-<ƒ'c§Œ!7a’\ûœ†•Á&v’Ó¤(” !²j+õ¯<Ô ¯
+Ð]’Fâ$F˜ü]¡PÐ^"…<­˜Æ1¤vDtþ ýÙƒ «dê6q(/@¡‹€Îy y˜
+’˜ÈT&ya—~&[a‹Ë7há¶Àtú,[¼vQÈÕïc€©ÀF*í4Ö÷]G§Nòq’‹wUõàסµyB·ÛPc¢’·A*l¨Y˜áöôøè4À(Áý|¾ ¦H²,@QÜXñM—’ùâïùakUm»P®B¿fº+´àIþ«"`§m–†+ úçò@P™÷AÏ<ìK¬@ºÈJŠ†,²ŽŒ­I‰ ösf (Ôœ™Ïð.Ø~~^q¡4æçš 8…ÒâH¡ô´BPNÈ3-7×̤\œ{Îê!‹b§Ÿv¨
+0sÈèi.AëÆò9¤}kÂé e5ð¬=Lò×å’oŸG\d¹Ø-ÆRˆoÍÒĤG †o¹=
+ˆÒ†–/º°µáúØpˆD ;&9^UÌÅúHáÈÕ‡uUmú£ëvS¯Y!˜„–Á{Y™-Þt4Ãg
+
+̉ˆµ·üƹ|Aƒ*ŒEN ( #Ëì§Ñ0Ai‡(ö*›•Ã~èÐx!”J´qŠ¯|½…„°Ð†X
+íISÓkè K¿ q:Ö©J”ÍåÜF‘#%ón·#w‘|×+±vXïëU ¯º÷üWÖÒ•ðh«Gj€¢‚ØJ8ñw‡Ã`aØ©äôs
+vk^)úåDa%“…KåãVYH13ø ŠmG+4ÝtÝM9”\k
+ü“Ål7·5Ú'}Á¯"´ú‚HcÀÀž¢í¶dÚ¼Œ~?Ú×í°¤jç=U}ô#Í›ª s—QqÏùw2Eš<\{ðõl$a@Z)ĉ+&9¹b’ók$0L’Óë#Ép2
+kî²Úc¯0¹¿C8_Pø;v! ¹(Éï3S|µŒ@x"BÉ_– IJ,Ç÷xc$†âÖ•Æ'Ëý н.ô' &
endobj
-1225 0 obj <<
+1592 0 obj <<
/Type /Page
-/Contents 1226 0 R
-/Resources 1224 0 R
+/Contents 1593 0 R
+/Resources 1591 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
+/Parent 1562 0 R
>> endobj
-1227 0 obj <<
-/D [1225 0 R /XYZ 56.6929 794.5015 null]
+1594 0 obj <<
+/D [1592 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-318 0 obj <<
-/D [1225 0 R /XYZ 56.6929 607.7662 null]
+426 0 obj <<
+/D [1592 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1228 0 obj <<
-/D [1225 0 R /XYZ 56.6929 584.6557 null]
+1595 0 obj <<
+/D [1592 0 R /XYZ 56.6929 749.2381 null]
>> endobj
-1224 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R /F39 899 0 R >>
+430 0 obj <<
+/D [1592 0 R /XYZ 56.6929 540.3599 null]
+>> endobj
+1596 0 obj <<
+/D [1592 0 R /XYZ 56.6929 517.4049 null]
+>> endobj
+1591 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1231 0 obj <<
-/Length 2890
-/Filter /FlateDecode
->>
-stream
-xÚ½ZÝoãÆ÷_aäådà´ÙOry÷tIíä‚äÒ:îS4EÉD)R!©SÔ"ÿ{gvv)RZÛ)
-‡÷{çó73+‹kÿĵ5Œ«L_§™f† s]l¯øõæ¾¹~Í2,ZNW}õpõåJ¯3–%2¹~XOβŒ[+®V?/¾þöÃ_nïo–ÒðEÂn–&ዯ>~ú dôùúÇOw¿ùûý‡›T/>þø‰†ïoïnïo?}}{³ÖØ/ý Ïl¸ûøý-µ¾¹ÿðÃîo~yøîêöaäeʯà
-ùíêç_øõ
-ØþîŠ3•Ys}€g"ËäõöJÅŒV*ŒÔW?]ým<p2ë¶Æäg”eÆÊ4"@)c4K”TN€M;G%}û².‹¡\QoÝvÔžü|ñ”7MY¿§Þ¶ìû|SöÔk×ô}ª6OeÎû\vÕp¤^ ½Ú¯>Tu=¿;/Šrw3”+0jaIf¥£ô#®E¶8¶{jäÝ°‹’:û±è«fƒ;o1á;µLÉ Å…ÇôǾnò©x¤e©©_öŽM²ÝÐ(€Ë³µe6Qfv6+Úf¹À¦R.ýÚ]Wµ —
-e‡ç“4_ußbË.VåPvÛªñ<žòZ ÅfØçu}¤þ.ï{8¥¶”B0¥µé –CÒžœ´Úýæ l<±bq‡ªU`ßåïùvW—È17pç?8— ŠfÕ"§E^íÔYçEU;b/oV´ô¤j7ÜG䥸
-0^†,/rÐ,5:êó–J’2 JrN §zÈËv\e„\—×$€rz$—l,ÆâKR­çÎph÷µ
-ÿQüC“fôÂ~X•]³ÙŒ -Ó*zP’7ؾ(jòl¯*Oî€\$#uÙ ±ƒÖê¾a¶/»Ïó@oüÎ~
-‡Í›Ó=ôdÃP³ÙwùrÔø4d~ž5¸Wœ˜Š¼ñƒûݱËßAz=ØMMé€.\· v
-“…)RÑ\_­%@+Ò¬\u¤1ðŠÎc$ôâi•’I¥’×±P:8¿—÷éîÖñ|=K 9Ä0R±eìla˜< ?ªÊ=É붮ÛBÙ”­œ>»Â38ì¡÷‚´7'dV† &ÃΉ^Jb)!QÚª¹„»fUx
-Ï2.œ;­‚¾q8F‡Ö«¯’§ZO
-·{¡ÝdžØúø¹ÇŠK1d€RJœêÿfX:-Gä`™MÁÖhé“KÌ´
-êÙ$à¼ÇW ÿÀ¹Ïð2°/ÿž‚] ì‘«`·¯š"š¦¤‚q‘þ9:DHTè}Ï…ÕþŸ5f^aH) ç@ʤL7+¡–*;WMçlÚî¡&I™Hm£>ƒ[j0-ùYD!ðøm“«—1¯÷fÐBT§f1Þæzî05§iï=´É[ ?úi²:j;SO±j¯b¤›wP«¡fBÈÁ
-&&¥%³b|O 9œ=wÌä
-zk ép_ˆÓÊQØñ1Z~$xßRgÉ3õ®TS2Ñ3Ÿ)xù˜ýµ;¬qzOD~œ_ Ⱥ¢– &"!%ÚöÑWÊo=n&„)Hºç.êlr[¯\H5óú{uŠ†1Gné—ºTJ+YÊ«)ñ¢4Ù=vïè]Ý
-ÓeôNÿì^¡áù¥/AJ0lajçFÜ&´œÓ6º²³Z3œ3þ0≙-•‘¢Ÿ .¨¡ß&ætùŸ‹&ÛbÔÈ5yØìëL_ó`hPg ü1P$Bý¼Ô'uTTèâ¼>sNÊ
-/?/ü¿=9ög
+1599 0 obj <<
+/Length 3318
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZYoãF~÷¯ò220êôÁ£9ó4™µ“ 6“]Çû”-Q‰THÊŠv±ÿ}«ºªyÈm{‚…a°/v×ùUUSj&áOÍl,¤É¢YšE"–*ž-÷Wr¶¹o¯¯YøE‹ñªo¾5é,Y¢“Ùýz´—ÒZ5»_ý<ÿø݇ÜßÜ]/t,牸^ĉœóéóßh$£ÇÇ?ß~úö_w®Óh~ÿéÇÏ4|ws{swóùãÍõBÙXÁûšwxæ…ÛO¿¡Ö·w~øáÃÝõ¯÷ß_ÝÜ÷¼ŒùUÒ #\ýü«œ­€íﯤ0™g'èH¡²LÏöWQlDãGvW?]ý³ßp4ë^ É/6VÄV§j`œ‰ÄhãXÕp”©y¾ÛQc/Ë]Ù•EË͵²ó‚:íñp¨›®XQ·®&/Ëy}(š¼+« /?·]±oAªÀÃü»ú„²Ôˆ,Æ"†0ƒÁ+»zÃëÆä%+ý²SééÝæÕjÇä틶Í7žò¶¨˜¹®æç¶lqëÙÂÈTè4«SJdq¬Ý®Ìû•læ%îGóUÑ.›òÁ1Ã=»m`G©X¨46vIJ®Öž@»©V)¯Ýç¼óx
+eÓô¯É =UšùöÀÞ‘¬ž9 ŽðGù¹+ò–›õšÖ Õ»Þ0xåc±£æ¦|,˜„$ª4
+³ÒÔàÁbØžÛbW, Á¡·®›ÁÕÈöALU±{O½¢¢¯é¹á߯'zŽH^Í=:;_¢õx—‘SWA¨‹TFV^pØ9^ ‡Õ–n
+Ò‘'ö±ÌƒKÄÚD_fL„ˆÞZÉxf–ŒÔ#ßÄ ôM½ˆ&S|SrD¿iY­ëŸ(aMoòaÕ@
+$mR_
+8”\Rá°y3œC@6 5›c“/zõó¬)pÇL ”Yr êÒp,þéµå#¯Ó]¸fïí
+Sÿ&t«&b_­À’‰ÌG)MœJH•œÃBÇe^0CÉóèXè ùÂlÂd 0—AÎÚ¢#h-Jʯ‚£Î4^Ñ0FBï¹*YC g’×±Pº/“HÞ=¤»Sûý£IJ(!†Å> Y„öÆ:]Kþ`¨&g’×õnWŸÊÆlåô8Ô~œÁa½¤½ÙÄÙ0éß¹a ÂÖÀ˜h¨pÈ7šjµd
+ˆü"Š¤{'BEc„LåEiÇ3¢å Y=ˆ&Òñü¹D6u;iÖXûÖŽp5ów/ÖÂÙÁg¸:sNjYR0ß×Iµ|à†ÀË¢9¡\ˆy˜° õB^î|­ÝáØ¡æ•œ¤àå/Pú«—öP,Ë5Wgùh ¡yIýÞ@FÕœRjþö¢Fdôp¸ ïCi"= åò7wÎolƒ8óÇ«6‡]jw]b˜ÁE_­ëú«÷¡
+au–z¢³(½¤¼ÿµÕSÒÿ:[)Žendstream
endobj
-1230 0 obj <<
+1598 0 obj <<
/Type /Page
-/Contents 1231 0 R
-/Resources 1229 0 R
+/Contents 1599 0 R
+/Resources 1597 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
-/Annots [ 1233 0 R ]
+/Parent 1562 0 R
+/Annots [ 1601 0 R ]
>> endobj
-1233 0 obj <<
+1601 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [173.6261 333.9221 242.2981 343.3317]
+/Rect [173.6261 273.4719 242.2981 282.8815]
/Subtype /Link
/A << /S /GoTo /D (the_category_phrase) >>
>> endobj
-1232 0 obj <<
-/D [1230 0 R /XYZ 85.0394 794.5015 null]
+1600 0 obj <<
+/D [1598 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1229 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1597 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1237 0 obj <<
-/Length 2569
+1605 0 obj <<
+/Length 2400
/Filter /FlateDecode
>>
stream
-xÚµ]sÛ6òÝ¿BÓ—H3B€ žŸÜÄιsIz®ûpÓv24IœP¤Ê»êÍý÷ÛÅüiÙ½äÆ‹Åb¿4ŸyðÇg2da,âYLz\ÎÒÝ™7ÛÀÚû3nq–i9ÄúþöìÍ•Íb‡"œÝ®´ó”â³ÛÕ/ó ¶
-Þüí§W×ï¾¹XDÁüöúÓÇÅRHo~uýK½¿¹øðáâf±äJòùÛ¿_üx{yCK¡¥ñýõÇw‰éç ¢7—W—7—ß^.~»ýáìò¶»Ëð¾Üóñ"¿Ÿýò›7[Áµ8ó˜+9{€‰Çx‹Ùî,>“ï;H~öÓÙ?;‚ƒU³uR~ÜcÂÅ„
-s’+j²ÒoT¿m­W†7i8šàçP¾L摈Ãvœ–Z‰4zeYBÓ%ÁF‚ .Ž‚G²n@M¡A0Å•25åv«¥r"4ž&ddüoc8ÊÚaäLCÍ ý@Ÿ¯ß½¦ÉÖ j¤óÕy‚7ºÐ•½D‡Ëò©ÀÒfŠ£¿Ä~f¹¯›¤j¬¡ªy»·â‹¤ø‘ø ã`äu“aÎÀaµ€]EA`n¤Yc-K¼IäÓi
-RšP± ËÍK
-(vžƒ‹ŒÁ³ÞÝG
-Y@°#ˆ®H´Õ‰À碋ÏD ¹ .Ê°ñ©H­ã–8ìóÂȵ$¨)Ö›)9 <ÜÒŽï4°œ» Ö ! ·–ie´9œ'y£|^Ñ̆/ Ùfy³47k5!õ²É)ˆ¾žÒÛ]kEGÇš`e½+WÙúp»]%@Ù¨Ülº¨}gQ÷eV44‡Ü”Uæ2Ob·x¾M:=öaÏh‹óAÝ‹eT\ÔE·[=:Ü2öã¶JjýD=°8ેœóø1ÄŸ~¢æ;„Ü_ tør^—´`FoE Jý
-E@‰4vAG Ç©1•²xÕ é“Œ)ÒÀªE‹z4[&ã@ YÂYm‰”둯Xƒ\Sžîð;íq‚ã„lÚN×u²Ñ–笘ºŸ-Ë„¨Ü1ˆ/ÂÑûBÅ6BŒ”ÒL–¿<PHÿq|œ'$‹]Ì®€ÕºÑ :¸Gi"”4çZi"¬“&‚uŽ†°G¢
-”ã¡8äc`uäØë2ÏˇÎ1œŽ|×Nú0ëêI,Jþ6Á½q`ìHGš£!ìs}¨A™çc Éáö’&åÝE@FŸá\ÿ‘ìö¹6²€2K7¯jZ¨“aZA‡Î±
-™=J;•®Ëü¾{²Z¼ï>þ´XJ(HÉaW‹b~ß}£yݦ[\¦×iD3qöE±áßkZËËòK»¯i}Oya2Ý`yëjO§RltóõØCÒ<£6|ø¨˜ôq©Sû£ gºå§t>æ×)(ð€’€šËN¡ääghoöl{éGïþ?‚ˆùJ rÕ¨U‹®ŠÜ}’w_Ç-Ö€õÿî@+(endstream
-endobj
-1236 0 obj <<
+xÚ­]sÛ6òÝ¿BÓ—H3B€ ^žÒÔιÓ$=ŸûpÓv2´IœR¤JRqÕ›ûï·‹]ðC¦ß%ã‹Åb¿?`9 àOÎt,âT¥³$„¤ž­öÁl {o/$ã,=ÒrˆõÝíÅË«0™¥"U<»Ý h#g·ë_æ±Pb‚ù›ﯮßþ|óz‘DóÛëïK¥ƒùÕõ—´z{óúÝ»×7‹¥4ZÎßüýõO·—7´3ï®ßO”~!zsyuysùþÍåâ·Û..o;Y†òÊ DAþ¸øå·`¶±¸D˜=»‡@È4U³ýE¤C¡£0ôââŸÿèvÝÑIýÉ@¨0V
+Ί@&q
+NØ5©q»°)$x ë±Ìöv-êc9¡qÈAʘ”1ó’/Ýñc¹‰¹ªþÝ~¬s'Ž]µU}ZH)ç‚´±ˆ’$öžž8úWÐRitWG
+kü"YS•Í· <Ê&À=b¿*MÈ*£P˜TJ–`yœÒ[ˆP!GrUí÷.áG‘—î& ^Ôæ_ïL¿ÇÆ®oÚq4Á‡Ë“±~žÎ•úhí,:¸mÅiíšYB×%Å&J(©¢±ße›–òçy^PÂH£†LM…” m¼
+]¤)¸øÛ:´a?L¼k˜yiï òóõ÷ßÒŠt {- ÒŃé" Á[[Úš¥Ópy1•Õ@Û"2iò?±Ÿ3÷M›Õ-;ª™¬¾HªHž©Ï1NÞ´9–\Ö 8U–D¾VvÖªBI’nè:oV™ÛZƒÝÁQŒš_ohïTiQZË÷8mÂï*;´G26Ñ£:‚[¤/Ô¬ zûcÓùcrÎ(È?Ç+®ïóv7®BTܺà~$¢”„”ú”°Ü>7 €b9:ðÎpt÷™‚3K ¬1‚@gáT[?‘ø|v …Š´ìË(²ñ¡\q
+ù§ÿ0ó½KBî›G¡ž7m8Y×)!Ô³"ˆJ?€@s òU†í®ÚŠ¶ËØ÷ž#†N1šßÓ ¯%‹€_ÐÕÊsê\¥*_´CzÎ%SÊ4°ËhIÆm’sÔÎ&RmF±Â¹¡:ÝáwÖ!ç„Àq
+* Ø$´½mšlk™ç¼œ’Û2e&U
+*ÁÄ‹pŒ>„P“§e€´“½¯Œ4t
+ª÷ .k}ü “sgó'í—<œ_÷§^G4ΞÅÄñÛ+‡ôÍð8‚¿yõ5§î!±×õæû ¯ò½šª†ç.;ÁÁ™O ðôÜ=4­³ªŸzºfKeÁ“Þ bœ–£æ<5LzÇD/µHÂ~šÃŒ‡ìB׎çæ)Ïù ±'2ÄŸ[/±< S½] ’À¹AÆ4 rb=Eáé4r5ÈŠAÔ×vü 0Bè§,/²».†ŒºÄpm(,î
+;Ízm×c?Ú¾@´€Ú6âÁÃOB¤3Ç"ÔÐÚ?ãéê–H‚äì¥ñÿ;åÁ^ju¬õãй
+endobj
+1604 0 obj <<
/Type /Page
-/Contents 1237 0 R
-/Resources 1235 0 R
+/Contents 1605 0 R
+/Resources 1603 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1203 0 R
+/Parent 1609 0 R
>> endobj
-1238 0 obj <<
-/D [1236 0 R /XYZ 56.6929 794.5015 null]
+1606 0 obj <<
+/D [1604 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-322 0 obj <<
-/D [1236 0 R /XYZ 56.6929 556.3324 null]
+434 0 obj <<
+/D [1604 0 R /XYZ 56.6929 520.4669 null]
>> endobj
-1234 0 obj <<
-/D [1236 0 R /XYZ 56.6929 531.5504 null]
+1602 0 obj <<
+/D [1604 0 R /XYZ 56.6929 495.6849 null]
>> endobj
-1239 0 obj <<
-/D [1236 0 R /XYZ 56.6929 214.5791 null]
+1607 0 obj <<
+/D [1604 0 R /XYZ 56.6929 178.7136 null]
>> endobj
-1240 0 obj <<
-/D [1236 0 R /XYZ 56.6929 202.6239 null]
+1608 0 obj <<
+/D [1604 0 R /XYZ 56.6929 166.7584 null]
>> endobj
-1235 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R >>
+1603 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1243 0 obj <<
-/Length 2985
+1612 0 obj <<
+/Length 2418
/Filter /FlateDecode
>>
stream
-xÚÍZÝsÛ¸÷_¡™>=W±ø"@æͱåÔ7;µÝ™¶w÷@‹°Í EêDÊ>ß_ßv!Q
-e6M2“x&Xâc,»¿]ˆOüñIšÄLfjb2'Œ'“ùâˆM íݧ>ÓÐiÚïõööèoçÒL²8ÓBOnï{¼Ò˜¥)ŸÜ¿D§?ùp;»>žŠ„E:>ž&šEo/.Ï°&ÃâôêòüâÝ?¯OŽŠn/®.±úzv>»ž]žÎŽ§<M8ŒÄáÀ€ó‹ŸgH½»>yÿþäúø·ÛŸŽf·›½ô÷Ë™tùýè—ßؤ€mÿtÄb™¥Éä>X̳LLG*‘q¢¤ 5ÕÑÍÑ?6 {­~èüã1‰œLe«$IO‹S0˜–HÎã,Iögri€“qg’蘹9Á{g•ŒS)“‰I²XK!ý¡üqoWÇ<¦eícDo ˆÆ$ÊÀD®ïšÚ¢H»U^·0²¥ÏGªoíê øyº¤FÏÞÎmùTÖñþ)(8£µ˜ôÿe‘*%hˆ†:|M+³Œ%c2V&ÖÆð]7ëî ¹µuñºx{ëþžÅ+EÌe"ÇÄ+a[‚g^buÓ•÷/£‚½ ò»¼º½8ÿ7ÒK0M×Ì›êááªÔ÷.<=S&Æ„'¤ÛVê¥2¯J[kå”Óܶ-¨Ê®¹Ç’Xô.ûïkÛví+òì-ôkÉŒš1ŸeOȃòԚŊ)5&OX[ʹö‚Z׋¼›?ÚbT¤ïA–ùƒ… œp·;§ÐŸD;S kÁ!u¾d,ÁtfJP¯çœx®ëü®²Ä¿Á²°]-Ê:TÃ¥
-{Ÿ¯+bYúÀšw–Ôs7táý„ä>•P^PJÔw]UCâá± ÂyÌëÚ¾b‰ûWòË®ù7µÄ˜+•YbÀ  ZâÚvÏÍêã¨Ý¸¤~hƒ—v•weS¿bmû‹ùŽ½—+¦²1c«ƒˆ‚‘±]p3F%vö†³œ£ÄpÌkâÚ®ã{–X»D¦é˜¸œí`|¶âš¶v¾^•Ý8b:Y<zÊ+^^H¶.CeÀtŸú›øj²Ö&–
-Ö`2“mÍëb‰f5îå.j9Z}ò;— óäÖËÁ‡„=EfB4ÜßQkÛ,,ÖÜçeµÆŽ‡aFs_ fg¯f?aF>1>v
- !
-Þ¹WT´wö_KE!žŸåýiÄAåBÄàÜFUTdâjŠ—ÁgL Âéã†ÍGŸL÷ôé , úu¤@íèŸëÝ`_»¸Še•—Ô×Å=ž(ÖvÐîxŸE]¹°€ýœ]……474` ¾ê¾óóC•cåë6ƒQ©w¬ªïÐ3e™í”öÎR¢ÎóS$
-"ÇE :‹•~SP9Cщ¾i€jtïn0…ÍPgÿ
-e‡Ó=X„ó.©Ða¹=:}„j‡íihƒ%²eã£Ó楹Ÿ>#Æ;ˆ´hꨒ¶ 2Lç\‚¢½q©3²«RR:Ç |ÊÃy^#™GÝQ“×f)A‹A”H"ä Û6’î[KÑ){&{©TÁLõ„˜¡Ûðµ5Ø_Tu¨%U‡ê êóá‹Šò1½”£Î¨›
-™òm4uOyU@Â7=¬»ná9…2£Ä„ÜP÷à m£Ùý ‘~ìõp4¾õq¯ã}Ìòe8h ­¶?žû5žc˜Ùû5Þÿ7*,„ë _¦‰†nøŒ~Å÷ɯù„à±É
+xÚÍZKsã6¾ûW¨j+W"çæØò¬S3ö¬­­ÚÝ$Z„%ÖP¤"Rö8¿> 4(R2%Æe¹jì@
+CÜ÷+SÙ£YõB|q}[šŠ¡ÃÌJ­-Ô?Ú}Ëõtn«ƒa\b³jn°
+FÑu¾ˆ«éBU¤ŸËxflìcŒ;®µÐDYsA³º:@J¢€ûVO±ïsÇ÷–ö¸þ LS™Õ"Íëb0
+mGŒ‚nø«­¨;Íâ:^Û.Ç#‚Èd,xš§6â ôP¸|Mìeóe4vÿ¼\(§À¡Ê¯á15O å6
+«È7f­h4<ÃpЖ֡lL˶Agòa–Ö¹r½XÄ«güpþÒ8+ ß°˜ÍÓ5—"L»; „0ª7¸ï5%® “µ§qef ÏCÂSº Í·ÁŸÌÝä„ldàK ëÒ{02,)Ñþ ÌMÒ+6ÄŠ¬¾\ã*1+Gw~´Y4HÌC¼Î|—iÕÅÂZÑƼЧ—Ià—B°zû®³¬ FD Î<ÎssÈ·Lòmfþ¾ž˜q"µèõÄLRôĹ©žŠÕ×^¿qíÛ¡Îì:‡¼mk2ßs觔(®ûˆ•¢áÌ[÷z™€iôŸXžÁs¦S„ eáÕšÈwŒ—ÔoBôà%#N¸Œ¢^£ÒÂÒªŸ3-=AzŒ³sbò´.¬™€WÇ+˜@{GÃ:b„kþªý^‹ìE[D!ˆC|êA[Ã(4À“,~•B€ïCùni¦–Á:Üžšj?ë>Ðí΋u–Ô‡_L7áÊ9cÒåµÏÀWB€çWÕz n?ÐÐŽê蜭uÇ ›ÙD›Žˆ§Àø«Ýõþ
+MhÈ6Œ$ÇïúvaÖÇ<N„àr{ªÆSF¶÷S6Ä@¹u"õ„už{êš  ¸nMð$;f ƒ:2KY}ÏcG .“{rRi¡·©…ÐFX“tÂŽèÈͳv..´.Cu/‹Uå®jAdÿôÅW_p‚q’ø›_am²c|Û£ æïâÞ4!_z+Ü%ØfŽ¶5°LßÎó?[Úˆ</ 0/Ø劾íÐDÈð¾•ÙØÜŽ#º7¶ÍÜâU€ý¼0eŠ’ 
+iŽ› Ç|«º±ê(sÃ;‘t–;³ƒB;æݦ5Û²Ž¹¡0Ò™cº. flãº*p
+P>9ÿ‚™(ˆ$Ìd#Ã727M=Län|Ž}Þ|µ»Ô…˜“¶˜BF£¬ïÛV8®åv û}~Ñ´;Ÿ›éWg™¶æ"-­'n,×f·÷¥lƒnoõP¹Ë ·;‘ë²zŸÚóKY¥y}· 5ÛÖÐliÞliæჲš);j€à6;×÷O—AÛÏì X: ­ ¢ðÏþ¡¸êÃéˆqŠŽüùCç¶xz"æ[¼Xf†L‹öruéüaq—t{èpÐðРìÅ ¹©ö :ÂA;cw;$¾1ξ+0á@È>b)tD(ç¬ #8'«þø}•ÛÛézO±.¾·}.ÛÄoÆðïr~ËÂqË™3”8Ÿ
+"Òû|'¤ L*¼
+í¼{lñ ¢]@¤ÐDZRY7kMþ/ÌŠpendstream
endobj
-1242 0 obj <<
+1611 0 obj <<
/Type /Page
-/Contents 1243 0 R
-/Resources 1241 0 R
+/Contents 1612 0 R
+/Resources 1610 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1609 0 R
>> endobj
-1244 0 obj <<
-/D [1242 0 R /XYZ 85.0394 794.5015 null]
+1613 0 obj <<
+/D [1611 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1241 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1610 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1248 0 obj <<
-/Length 3540
+1616 0 obj <<
+/Length 2956
/Filter /FlateDecode
>>
stream
-xÚÍ[msÛ6þî_¡™ûpòŒ…
-F0c ¦,’ìÚKXÎùôæAÓ?®uý8Óu]Õ]‹¬Õ÷UýˆsÉ'™Ofb©ÊÈD!TÉï^¤, T •±Î@þ®D"mݹëy&E4ÍúmVzžÿÆy0ϊ••­.zA_wU‰pºÐ·ëûû¼¼§üÕº^UnÎOgJÓ›Ó4˜VVÀB—m~gÅml"+­È‡jƒ£Å¥f*HãÉL–†a`Ú –L…f’¹ÆõSÑ´>ÉT7뢥¼䯪²¡ª!ô›Ï¨4/9Ο
-2ÛFŸŠimš€_ÉÓé+Ý4Ù½“RÝQåö!·9ýBb~F=SQû éÍeGÓª,ŒÂQÅ4S²»¢º¿ÇeF`lòöaDßaÈB!«C£‚EKÁ‚’T«ÐŸtÑ0Zâ$bq"è8f© S㢥N[Tl’ÔšÒfòð+ìgM¿ù=N–ìŒ2tfVR¾¼‰ {3•æÕB{y L†Ó__¢ä‹«Ÿ(7·cñ+³ywUQT€ Y%†ÖD3Ž ýE˜<E`ž"ˆ‡ÿâ/‘y
-\èVÏ[có(¾¥â"/5嘱šj ›jMz´5Ðb °(=¢ ™( Ëd@[l>2w%X¢¤°õÀ ãPNªî Ë*ˆ˜JD<´¢eo¯˜¬½:@;,6µÊê6Ÿ¯‹¬FÖ3 ÖÅÊ"®£¯jçÙº9
-±wÎN Ñàïº}¨ê¼ÍÚü“•Ðèú“¶¬ã ²m ‘´Gª3PÈë ²Í@ / Ó1d 4ŠQ½ÒXm^Ãÿa»ÈKï†V•C™¦ùºnhÔ]VSk¬nÇÐ>dí àG=)DßïcèHÆÂÛJ!—VÝÛ
--ªêƒMåôçÓ­ûn‘ÉÐJÁ˜Á¦[GÎxkœ>¨ìv.~€ .(%Ðç"‘ŽsÚ| ŒpEµnŸ5ëù&KMß-ªe–—çžô³ZßdÅy
-Ét ‚ý©‘™ÉÁáCXãÈŽ˜9ìmˆC¾ªš&ï6h+šul—·gŽ}W~~UŽwo²èØÇWÛCÿPÏÅèÈø9^t¿ÃàcuÊ’´?àûœÅÜk7> ¿²Ý|MÆS¡8‘âi»‘
-f,¢ã”(ŽT¢·:ß²ã€%AœPb1ÐPHŽ’õÓG(ÅúÝB>©D+Åy=y9×_´£ºó¥Ìm^¾å?¥oâßòæq–ÄàÆŒê'T0‘XO˜ÒÍžYX óåGé¦ØbÂææEó‡ÍME,áB~ñt±ËÒÎÇŽÃÑý­Þž—Î{?üöqxÜ›—&ˆÜw!Ò»ÝvP‘Ž!üµ¬ªëÕЗÇ+Öô¯®ýbaÛº9dàÓgî·Å‹ßãÖùoÚwÛö(kàÚÍMÀô”5x0û–ÙJ%,q´‡­RÆU“ rEašŽÀ+
-X5±–ÀXͶº?ǃÓå¼Z—­ÕßV„7pt{ÜÓö$!JO¾Øž^;o Üù¥ó¤æóqóßv>‡•·Ž¶Bˆã8¾ÚåÕóW??!|+l·÷ OaÞÓ·Œy¡
-ÕZq<Û5ªµ×£Íã">*<Y—ú•G¦ÛWô–›¼ 0rŒïAâ\»=ÛS A\ugHÛ.ûÀ zÏîöñ ¢ž¶+˜¦"üºÎŸ§³oÙ¹Àà±<@§AÂÂT¶èÂid}D,X+·Ž/³¼X[] iΣõD÷™x[ãîýð¨k!ðÉŒŸO…{Û`çe”:@’»÷Öù¡awαš:¯ F•›{w`ý}êõq±uöX=|Ë<($P] ž<ó“"¢—
-æ6ØÞ‰Ž
-lªÆV ·H¡kùcTä„EþëMÌw/ #÷ gÜÓ‘«Ð.\07ì!9¯&µý^m]FÓkCø¶jK©RßÛGaøµå!cV³ÆƒfL™—z(æ/^¿º¸º¶¹Ý%:J«Z_Ð=ÒK^O‚7ò‘y¹ÃÑ»ìÏÕ°úk8ø¯iXuVã†ì_Jz{F•mÂÞ¯Iór¸±)óˆRuŤÄQêÍß´îô«úáKåže«„Ô„ØØŽ]o¢{µ1p÷„oýÅÜÅÕîtl‘ßaót»;Ær»ˆ÷Â8¿k1¼|ǘuï¡;­˜÷gR±$QýŸ.aßÝ›Úm™oÛ¬ÕË.Êû¡ÎðVü˜W÷»î·录1F _éCĪÂ.–¡q„¬1ëÅ6Ãû‹´»óÅàpÅN<ºú 6¯Ê»ñS*
-ѪÑY힇ÚÙ‘Ïñ;E[»ÙW|ä˜Ë[.ªÖꂼ}¿ÍØÛ p{ð^FþÚ…Oz×Çþm÷¦ÑœãþBçVØAá¼d²3r÷G8»Cÿ7?â[4endstream
+xÚÅYKsÛ8¾ûW¨jKWY Aðé=9;ë©ÄÙu¼sÉä@‘Å
+E*"Åóë§_àC¦wf6‡M*a£4€F?¾†Ôƒ¿jFn”úé"N7ôT¸È·gÞâúÞž)³´ƒ–ãQ¯Î^Ýèx‘ºiäG‹‡õHVâzI¢Å''r}÷$xΛw7·oÿsuÎÃ퇻ó¥zÎÍí»k¦ÞÞ_½u¾TI¨œ7ÿ¼ú×Ãõ=wE"ãõíÝOÌIùó‚Ðûë›ëûë»7×çŸ~>»~èÏ2>¯ò4äëÙ§ÏÞ¢€cÿ|æ¹:MÂÅž«ÒÔ_lÏ‚P»a µåTgÏþÝ õÒÔ9ýžr•êÅÒ¬Z{q]^Ãu…ôU„>Yv©¼ÔUðÜN軉'ý¥øjt)
+¦I¼ˆÃÔ´¯éRLQ·Ë¢l³Ue
+TLòG“@9qÄ°Ž~×<‚V½Èùz0ûÒ´Üè6Y‡Tèl²o†y+cj¦ÖÍþ\%NâytÃc­ ÝUY)cºûÈDq0¸Xv©”›ÂÁh}š¦NWnMsèZ°­CçaS¶ÜÁßÄiÖ­,E¼~òÆ0Aû2Û¦“­Ù3{‘T7ÝÜV¦¬QqèÜß¼a¬'@*ròf»«Ê¬î¸ãW/ôP5²ê˜=µLóÊÝa_‹´È¹ùp¿œ.È^óþú-ß×è¾Ó–Û²Êö̤CóšUœáj€Õ…L†SË|ótÓ–Mݾ¤b+Ö$XÇžsÜ J¥ï‰©ŒO :*Ž<Ôè±kš4 à’¢X;·2™w2³ò‘ ¥h/P#>¬B·ÅŽýv¼Ü£éȘ€C†ßáê¢ÄÚ#°×YYÉÔ†¿¼ßv×b"²Š­³6!| Ú„†&
+5€TÑÔ¦tîÎï íò|$‘(W'N……ÄÖ´mö(Ü<«™Èª¶aj%]dÍZƒŸƒ*™ÜeùÓYm;»úk#ŽˆÆžjQÄ®Ùwl‚i0R"ô¯ÉÜ€[7õ’M¸bêÀ¶¦ž›9ý‰~ÀÚMs¨H×)y¼ö²3-_$°è~à[ÀÝî·emxû*ðë ¼ÅnÚÍZæmfnzØ!† ¥ú0³`e>6¤—~‡Ð±ã5¾™Zî”´
+!#¬ìÞÀßöJM‹™4ð‡óÔ§<ˆ
+ˆ”à·Ü:n„ „Ħ9r$‹S7ðÓÓ@Öo =0eþ ²°áPuÜI€uàœhyhØû\€'*J<?wd2Ç€×ïi"jÌN^ê¼g R(y‘AÀ‰üxa!*lŽR<ŒijΧ! @Ç£‘„w,»ÍÌ}‡¡*åËÒÌååP‹dT™ª’t¶L"7N48£ŠÝTû ¸Г€'L$ÏžfN5ÎÁž³)ñ  ² f˜Œ4ݾ‡ÑÁ¦«qÒfºÊG(-ÃÐùå%_ݾc®…
+ceeÂ[7UÕÁI%šzŸ˜=4¯J‚¸§Âx
+z^ï À¦
+J”Kï¢Æ2oÄÜ=­²„ì.ÕEV¬xØR)FG ã2õù0ƒzMz,CÏI$ 2ÇFL>h©F Ó“²‡äMÕÈ“T‡Ç“w®Øɘqjª=ËšêðFÓ(BgŽ40É`Ü&¢šñΩid)
+†ãõ*¨^úëev «Ô¸6
+á :)rP3uV1wŒr°“ŒTeìÄÆv‰€çN…Ã(Àcw_ÏËü^ …x¤ÈœgLÊ»qÀÇ6ü¹h&n¤6Ø3Pã8LúxÏõ­‚£Ó<ˆëj-ÞÌ埬A‡µmã¦Fy Ù½’±1’Ú>Ñ “!Òfø>Á½ÓÑšµü¾ÞPõ” ìž”ÔÍ?¶Qr‡Â×¾Jj­œÞó±C^û4•©Ô=..i*ÈÞî:nXyÛ¬Àç°Q~ðÓJR"vŠACrÐ}ªÄpÈ4–“dc íl¶6A /”—œf•­¨¾
endobj
-1247 0 obj <<
+1615 0 obj <<
/Type /Page
-/Contents 1248 0 R
-/Resources 1246 0 R
+/Contents 1616 0 R
+/Resources 1614 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1609 0 R
>> endobj
-1249 0 obj <<
-/D [1247 0 R /XYZ 56.6929 794.5015 null]
+1617 0 obj <<
+/D [1615 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-326 0 obj <<
-/D [1247 0 R /XYZ 56.6929 769.5949 null]
+438 0 obj <<
+/D [1615 0 R /XYZ 56.6929 510.1455 null]
>> endobj
-1250 0 obj <<
-/D [1247 0 R /XYZ 56.6929 749.9737 null]
+1618 0 obj <<
+/D [1615 0 R /XYZ 56.6929 482.5541 null]
>> endobj
-1251 0 obj <<
-/D [1247 0 R /XYZ 56.6929 433.0023 null]
+1619 0 obj <<
+/D [1615 0 R /XYZ 56.6929 117.762 null]
>> endobj
-1252 0 obj <<
-/D [1247 0 R /XYZ 56.6929 421.0471 null]
+1620 0 obj <<
+/D [1615 0 R /XYZ 56.6929 105.8069 null]
>> endobj
-330 0 obj <<
-/D [1247 0 R /XYZ 56.6929 173.1316 null]
+1614 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1253 0 obj <<
-/D [1247 0 R /XYZ 56.6929 148.792 null]
+1623 0 obj <<
+/Length 2444
+/Filter /FlateDecode
+>>
+stream
+xÚÍ]oÛ8ò=¿Âo§
+òÇÁåG>ÉáØ?p¦ÒÄL¾À€3‘¦r²<ÐF1£•
+ÅÁ‡ƒ¿w{³néØýi.˜FÁM bköoK[pØÖwMÊâØ$;»N…Š™61Ê„'LÊ­H´è‰DhÅ¥Ì$:VIåd².š6[·x7?HÙÇ[‰ŽaÄ»¸)§°KTm–WÅšúõ5µ³¯³EÑP¿½ÉÚÐóKÖ‡"‰Š¦^܆…íº,òþä²n äv›
+ÁRc¤Û¶)Ö°HÁ#$lxê;~ç³ ‹mj=¿y½ÌÊjäXš³TÃÚ¿ëª
+S?«0-gškõ0cnÄÒÁÛrYÔ›Ç
+bW'Lè;aˆ4mÊjæ‘Û°jG°dV”·èM•›Q7ºÈš–baßÜ#¬Þ-<—°‚i>c¼³œ3+“‡ž5"=¢«XŒvÂn£0í
+©»‡
+4i½~œQ)-;£Â¾“/´H
+gveÄìÁ´Ôö›UùˆDµ/¼§)ÄVÇtÌŒÏ'VìÕ1øÏ„µå>üŠ‰¥€•_=ÆQŸdåbãeEojœ«4)*—ÞS"¸ïwpü¢ö"p ‚ZŠSO. “$Mz¾<
+׎GÅ}!„
+G
+Sm8ÒÂo[Wø䉽›lµ**ê—cÙÈ4I>™?.>x¥$Nö«{_‘žË#nþú’€kbï|Iø¾UaS¦b ¥,KâD÷¿@Üù¡8 É4ž`>Î$Wº3©Á}†Ï$J@‡“A¹wÄà‰¬‰òâj3'Ø¢¸- ÉÁÚHQS¯ |SÎ1íćí˜oé4þåÙX 44Ê<Áö¦n<½eš°Ööy4åXñØ]­Žðz>wU L\SÀœKŠG¬³«\|ÁãRf×ûp|~:ûû åèôFµÍå„ÚR¯*æàn=|'/GP³Á‡xWP5žÌ?Þ¼wtzæ¡Ûç ㇎М&sgÑ=
+=ÎG<@xñ`aü?hÕ÷IXÿ%,˜„u'a=.a
+endobj
+1622 0 obj <<
+/Type /Page
+/Contents 1623 0 R
+/Resources 1621 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1609 0 R
>> endobj
-1246 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1624 0 obj <<
+/D [1622 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+442 0 obj <<
+/D [1622 0 R /XYZ 85.0394 220.329 null]
+>> endobj
+1625 0 obj <<
+/D [1622 0 R /XYZ 85.0394 191.1908 null]
+>> endobj
+1621 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1256 0 obj <<
-/Length 1976
+1628 0 obj <<
+/Length 2008
/Filter /FlateDecode
>>
stream
-xÚ¥YKsã6¾ëWèHW­0Àçæ4™±'N%ή휗‹&! >’²ãd÷¿o7 D‰öj<5UÃf³Ñϯ€Ìç>üãó$d¾Lƒyœ,ôy8Ï«™?_Á·/3neNh±/õýíìÃ…Œç)K#Ío—{ºæ' ŸßwÞ§>þëöüúl!Bß‹ØÙ"Œ|ïûË«ÏÄIéñé—«‹Ë/¿^<‹ïöò—+b_Ÿ_œ_Ÿ_}:?[ð$ä°^X ¯,¸¸ü霨/×þùãõÙýí³óÛ!–ýx¹/1?fw÷þ¼€°œùL¦I8†Ÿñ4ój„’…”ŽSÎnfÿî}5K§òÊ„…‰ˆ'ð©†)‹¤&ÿýcøp!øœs–†¡@Q¾b–D24B˜. K¾ï{ås«:ÊÂMŸõªRuO¯ŸÕo¾/jÝë¦&NVDüÚe+e-‰=ŸÀ™Hyl Ý®ÕàÎNˆ§,‰ŒeÈþ±*°H¥°RÝÎ5)¸—75ú¶Ú¶g<ñÐäö`ÎuVÊ÷:Õ>©Ö~n處£r«/³2z”zµîŸþO k¦)­²A1à 1&¤÷›ú7JB(>K°LQ± Ž9“>¶«9×ûÕwò‹ý¦ú£ôëÅ4ݨ|@½eÈ’ùb
-Œ›ÖŽ³lM}¾º!7†ÎMÈ€!Æ…Ød¹ÂÜÉÄÃMB@#´…¹"ÂúµiêN‘¼/éåÑŠÁéúö,ñ¶9UÊ4…Ój…:³W!Ueumâľ숗ѣnÚ*³Ú)`@Ú·´Ï×f’ ׂ#”‰]!Sav,Ÿ[¬Vƒ1V¥çØ;tJéÛ]>j™Á˜&Ê>Rnv…é”Î æÛ`rÿû†¨ƒ}ÍrðÚšÏj’Q- Òv°:qßêÕÊš*¾bÖþyÆÛ*kóõD HÎDLÌZ$&(|B#맬ø¶Ajò8atFÑîÜó>Óv[Ãh·-|P}þ¡5Å
-…×ROMÑÝÞ1Ø5S,™w;¦¡}Š×i$˜ˆ"ç ®TÿœP 7aŸ…iäCb© qøÉRüj4‚îHo¤Ó{/pî„ã í©û©£‘]½nº~7 ÜÛéëéJ¼ÐÅþëƒ.ÞÔ0ò¿Ð­Êû¦µ³éúp‚q˜#‹oXnŠ¸øïí§¬yÝ£íU×e½È[U
+xÚ¥YYsÛ8~÷¯Ð#]µB
+G«æÓÙü ΤÊ™J±‚%A ' úÒ2($d…sî•O­î(Æ›>íu¥ëž^?ëß8—uÑMMœ´Î‰øµK×3öä¨`|ËL&*2†n7NHŒ„DÂâHa,(CöUI(y‚Y0RÝÞ5_
+/kjôm½kÏEì¡ÿÈíÁœ!ê´2÷:Ý>êÖ.7ôLËÎQ™Õ—Z )=Êb½éŸ4þ%†5Ó”VÙ 0‚@’¾÷øÖ‡ðP‰d*ñ‘¯˜ïG!Ö‰ÖÚõ‚ˆëQaør,Ou'çH+æèFgK4Zü€Åœƒ¾
+°Nu‰ò D‡~Æ1S!‘”Ì¥š…ZŽ¥Ž½;Ò…Ö$H
+nþ±ÓW›zÆ»\£nè‰ÁUXÑ}¢ò¿`·‡#™D
+²à„wÎ4Û, ¦QÈ€«ø(¶¦*úÞ˜ÂÑ:õ9OEY… bæ°‰TÛa즳˜0a5‘Ófk“â Xƒù¬’Ðbè±ÐOs ¦Ðÿèh2ö½‡¢Î;")Hío|¦ô(‹sá0¼i"ÇÞ(n&
+Œ›ÖŽ³lM}¾º!w…ÎMHÅT »3Í4æÎ=Ü!¤4B[k"¬_Û¦î4 AÀý’^¬ ™®oÏco—Q¥LS8­V¨3RUZ×&NìËŽx)=ꦭR«‚&
+'¾vþšöµM«
+Ì#
+ˆoƒAAÔVˆ1f×þûÃ\ê–ƒ*‚»%Wû ª2xâEW¼|ÑuÚgæ4\ö§)ÌœFY6OD"ΈG¬©*çI§­“æÄâf¢;ê´+Êg¢q ¶«–3Ü«Hs¿{8ˆ¶+S7SÿÕÔv|'Û†t ×À&»Ùb*O€ëë?n¨»h7Ö¹µÕ1IÌ ã&¿
+T` à<›)ŒK.æN´£me°1é³Ègo,v‚Cgå/ÍØP2†Î„]©ÿ:£îÉœ Üì'§•!±ÔŸØ|Ò‡"pzî¹#‰´ïÓl³ÌàmvCÞ£‹¶·¾Í 7û9^wMKŒ^îáP g;Þ4]¿Ÿ2îíÕï'ÎÓ}{Yäã×û"?݃¼huÖ7­08¢O ¦ÑòmŸO|‡Ó<Ì| jºåw¸a°´ü\xó·=Æ°îºt[ }úðö8Æ:²VçÐ^EŒ¨BVlÓòT_ÜömJcè·D’oÆ[ÅýYøÖ§§ Ê€¹*Jýölæ»jûÎOñ:l€pòçS,é
+§ìEf;ÿYw÷M{_7'XŸ|þζEþNçù;˜õú–Ow}î7yØ ð‡ô™Ÿ2ù°£}÷ïõûÿ̀ÇÇrþGQÁFƒëý ;ü°ìúÿ
endobj
-1255 0 obj <<
+1627 0 obj <<
/Type /Page
-/Contents 1256 0 R
-/Resources 1254 0 R
+/Contents 1628 0 R
+/Resources 1626 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
-/Annots [ 1259 0 R 1260 0 R ]
+/Parent 1609 0 R
+/Annots [ 1631 0 R 1632 0 R ]
>> endobj
-1259 0 obj <<
+1631 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [519.8432 682.6714 539.579 694.731]
+/Rect [491.4967 730.5319 511.2325 742.5915]
/Subtype /Link
/A << /S /GoTo /D (lwresd) >>
>> endobj
-1260 0 obj <<
+1632 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.0431 670.7162 117.8035 682.7759]
+/Rect [55.6967 718.5767 89.457 730.6364]
/Subtype /Link
/A << /S /GoTo /D (lwresd) >>
>> endobj
-1257 0 obj <<
-/D [1255 0 R /XYZ 85.0394 794.5015 null]
+1629 0 obj <<
+/D [1627 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-334 0 obj <<
-/D [1255 0 R /XYZ 85.0394 731.9325 null]
+446 0 obj <<
+/D [1627 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1258 0 obj <<
-/D [1255 0 R /XYZ 85.0394 701.4683 null]
+1630 0 obj <<
+/D [1627 0 R /XYZ 56.6929 749.3309 null]
>> endobj
-338 0 obj <<
-/D [1255 0 R /XYZ 85.0394 475.6865 null]
+450 0 obj <<
+/D [1627 0 R /XYZ 56.6929 523.534 null]
>> endobj
-1261 0 obj <<
-/D [1255 0 R /XYZ 85.0394 450.9966 null]
+1633 0 obj <<
+/D [1627 0 R /XYZ 56.6929 498.8411 null]
>> endobj
-342 0 obj <<
-/D [1255 0 R /XYZ 85.0394 393.3855 null]
+454 0 obj <<
+/D [1627 0 R /XYZ 56.6929 429.268 null]
>> endobj
-1262 0 obj <<
-/D [1255 0 R /XYZ 85.0394 362.9213 null]
+1634 0 obj <<
+/D [1627 0 R /XYZ 56.6929 398.8008 null]
>> endobj
-346 0 obj <<
-/D [1255 0 R /XYZ 85.0394 329.3761 null]
+458 0 obj <<
+/D [1627 0 R /XYZ 56.6929 365.2487 null]
>> endobj
-1263 0 obj <<
-/D [1255 0 R /XYZ 85.0394 301.8169 null]
+1635 0 obj <<
+/D [1627 0 R /XYZ 56.6929 337.6865 null]
>> endobj
-1254 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+1626 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1266 0 obj <<
-/Length 1168
+1638 0 obj <<
+/Length 1135
/Filter /FlateDecode
>>
stream
-xÚ½XÛnã6}÷WèÑ.@V÷ ö)›:iÝlëzŸÒÀ %*&B‰Z’rìnößKYK‰ÝJŽ$J<3çpf8¦¡éêÏкh^`CG7-LFºö Þ]ŒêPÚ_}œ~¾²<-€kºÚ<naùP÷}C›Gwcšp¢ôñå—Û«›ë¯³‹‰gç7_n'ÀtôñÕÍoÓòîzvñùóÅl ß1Æ—¿^ü>ŸÎÊWn…ññæö—r$(/G@gÓ«élz{9ÜÏ?¦ó†K›¯¡[‘o£»{]‹íO#ZïhOêA‡F˜Z2² :¶eÕ#tôçè°õv7õ ~†MË5h-}ºº‚òœ
-CœIU3ÂqtBucü ñh¿¼å]‘%ÅŒ ²ùÊèŒy;ßËKdÙEQ¥ã]ƸlÆ‹‡ûò©2!¬íí.?úè“«2¥j]ø¨äæëÆ£¶¾ïÀL ŶÞa´×¥\­EQ¹þîyW£tàúq/d®U( À ¬’m#MWpG%M¸ÂJ•VõÝó;–Æ‘ºø·üì!
-†´RˆÐÎ
-z¶eïPê´ª­Mk ׃–gÚõßSlo1¯{a :žmT¶c¶½í¶nÏ•'¦38ÜÙV¢öRÂò íÛöpoŽZ,Nñßé â› ÷'©¶Zß7›s@Ólšž¯È)Ê©‚‚­¿ò¼>U|íú?ËØ̈endstream
+xÚ½X]s£6}÷¯à1~åÃØ0û”M4;ÝlëºOiÆ#ƒˆ5+ tÛÿ^§†xw2Œ@G÷]]d–ú³ ß3-7“`dz–ía2°Œgõìn`ï€ò%Pëã|ðÓ­;13;cc×°|Óò}Û˜GW7¿\ÿ6ŸÎ†Àñ¬«±9Þغúxÿð³n ôåæËÃíýÝŸ³ëádt5¿ÿò ›gÓÛélúp3Û÷lÕß)Nt¸½ÿuªÝÍ®?¾ž ŸæŸÓyÅ¥Î׶ܜÈ×Áã“eDŠö§eºï[uc™v8F2y®é\·l!ƒ?¿W€µ§/]Ûôó\ßô|gÒ"àÈ® h[¾Œ‚‰1ñsì:î‹‚C0¶¬«¿E@H(±8ºqÄ‚ñeôýSÎW
+lÛ <Ï©ÀL®
+ÔƒeÇÇI oÿÑ´K Ë -($âj
+ÉþŒ(9
+3.Tjv'ÈãÐq-È}Šìîô2¡ò<)c¤‡¸jmKõð.æ` êŽñÒ5æ,ŽcÄ ËiúËò¬vɵº&Aà©ö9Î@…@!@.I‹îHpe5k§ÃUfÈN‡Ö†M[C#t€>@•Ø9Šm¦b7iò¬Û®ä™Z‡†+V(Vú*,pŒØ^’C.Õ‘ç-zÚCM†(•ÊêSÌQÔÃ8ßBë•/ÀÆ\Ę y‚û ;×ȈiùM_ÊüM0Š
+eSÆeÕžß<é»bÓ4Ëñ^.ÿž£O¦PÙh¸VróMÆɱ¾½€9®ä5GC«ƒ.z¶¹)þ\™g:°F„çqÏe.U(2¬«’¦© håQH®R¥fì~§¢ÑRî+µ8[¤sŽ¤SÉ@›)1i4àgÊ8:µÀZጢ,U{^ÈxôŠ×;·ÞÐ1Ù}¯ÁZ(n1‰Âj½vñ Ý_m<è™c¹ïî%[]ü@΂o~ü˜xI0}î®R^oE[]Œ6¬ïh—;ÇÅ
+¸Z1U`å‚„X$PÍ ‚Ks>´V¥÷ôO`‚rg¿l¨ „jn¾ò;ÃnQCrHE\ÚéÅb>ªz/{y%²TU|—ž;
+Š:£Z­À/µ¬ÅºÇG´®ÎÔeö9Ä¡ êQäézH¦ü»^;ʇ· ¤Êsæd¬tYõu¶Íˆ=•+$°¸˜ÞK¢Ê´#—Ëüûl3Y”‚¼¤j†š·tMã SŸ{ïD|á¸^ÛI™ë™ùñV˹–U• ï>E;1Ž&¦ëûNu@æ8µ2×›¾LÊ rΞ{yuÜö:ôÿ
endobj
-1265 0 obj <<
+1637 0 obj <<
/Type /Page
-/Contents 1266 0 R
-/Resources 1264 0 R
+/Contents 1638 0 R
+/Resources 1636 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1609 0 R
>> endobj
-1267 0 obj <<
-/D [1265 0 R /XYZ 56.6929 794.5015 null]
+1639 0 obj <<
+/D [1637 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1264 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1636 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1270 0 obj <<
-/Length 1164
+1642 0 obj <<
+/Length 1187
/Filter /FlateDecode
>>
stream
-xÚµXMsÛ6½ëWðhu(>’˜œWviœVUOªFÆ"r¢4ýï?$‘e‘t<>˜¹oßb ` ™?ly "ÊmËå6d3+XuoÞÝŒpõ Ø}ê_½~¾¦®Å!wˆcÍV5,"ÏÃÖ,œ_\ýzùûl2ÂÐ…Ç€9èâííÝ/å/ÿ]}¸»¾½ùkz9ví‹Ù퇻rx:¹žL'wW“1ÀÃÆžT' ®o›”O7ÓË÷ï/§ãÅìÝh2ÛûR÷#š;òy4_ +4n¿!H¹Ç¬/悘sb­G6£Ù”îF¢ÑŸ£?ö€µ·…i›~ŒzyÄmÐÆ51%Ðs¶\Æ¡C -œƒÐEš(]>ý*Ÿdº< Ï}µ06|\ 0tmÊ
-ˆŸªW3†­Ú …KëÅ»x³ÏM¶9´)wÌSBêÔ>o„Ú‚,Ù¨@€Gç)Ë:_g釡jæ.$Ž Å)ÂäˆpÉÈ„’"ó¶Ñ0±ìSsÛíb}¯˜átÇ×™äîŠ,ë¤u¡íÙ¬è·èG­òãWÏ& XA9&ITŽoE¶LÔ2NX¨Uå¦=ÈŸ*ÉãÍú£PíäˆMúZÈX õèG=±ÖþW •g+¡€–kd|?‘lôKhÈ0êFã D' Wt‚ ’"î“9F~šÚ|̃Êä£è>}ƒ¸™\úQ¹82Ë¡çü5{)ú’ÏU‹d¦EœlD_ÑwA[%jíå~ `>ø"ö¨
-w¼­Æ% wa[M—K “^žîm¬­½mj|{‹¼S©Ü¼*ÉÔ>®Ï.‡”¸mõ™AîºN{mœŠlUq­5²ÜÏpžM¶Ã¦jŸ j£J…„º¼}Ë4è%k íd%ˆC‚k•µ…ëYi Á»Èy%ºÄ…ØöÈÉò¤¼}¶Ë8Ñrµ¡ˆüí®TIf-”Ú§Bè”6Ž ©KìS‚±—¥K!µ9?Ïò|Ò2ð’s Iq8®þ“xvŽ‰e (‘Ê÷¬®žc;`!l´ÿul,äוQr2ùM èþ1qÍ{0ÏŸ–Y*‚ ‚Ä´Ç–å6ý¡ßÓ¾áÁJF»¦ ÿä™öƒO/aDÂe|º·¸ öÂWú£ð5Ø#f+?CŒÚôG2Ȇú “41˯™-Õmiš¦àa™w`Õ¢^¼yŽŒIŠÃ·/‚R*$*ÜõfZ1räù³oŸ¦æ!COËùæ´¡õCOøÁÃPã¶Í6]Þ|J½m]
-•PåE÷“yeº/²$NÂf?%ÿïëê…OAém*ñY˨$é}˜Ê›¼`÷ØäS•<Ê°£ÓQ΂2=ÐZ«¼P
-øÈRÿ¨eêìD!žX™
+xÚÍX[“›6~÷¯àÑîŒT]‚Ù§ÍÖ»ÝL³i\÷ÉõxÈ»j08 oâ&ýï°Y v·Óñ–ÄùÎwnÒAØ@ú‡ fAË!ŽÁ2„™á­ÈxÔkw\¼v/ê[o¦ƒo)7èXÄ2¦Ë
+– ‘mccêφ$p¤ÐðæýÃíýÝï“ë7‡Óû÷#@ÞÞÿ2ÎÿÝM®ß½»žŒ
+ +  gk
endobj
-1269 0 obj <<
+1641 0 obj <<
/Type /Page
-/Contents 1270 0 R
-/Resources 1268 0 R
+/Contents 1642 0 R
+/Resources 1640 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1644 0 R
>> endobj
-1271 0 obj <<
-/D [1269 0 R /XYZ 85.0394 794.5015 null]
+1643 0 obj <<
+/D [1641 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1268 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1640 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1274 0 obj <<
-/Length 2424
+1647 0 obj <<
+/Length 1337
/Filter /FlateDecode
>>
stream
-xÚ¥]s›HòÝ¿Bo‡«af>*OÞÄÉyïÖ¹³½uI*‡ÐH¢‚@ÁŽr»ÿýº§ö*Žý@ÓÓÓÝÓ߃Ø̇6“¡&<™EIàIŸÉY¶9óg+X{wÆ,Û¹Cª_îÎ^¾Ñ,ñ’‡³»å€WìùqÌfw‹Nèqï8øÎë÷×o¯Þý~sqÎÝÕûës—Kßy{õÏK‚ÞÝ\üöÛÅ͹Ëbɜ׿ø×Ýå -…–Ç/W×o“Ðã¦7—o/o.¯__žºûõìò®?Ëð¼Ìx¯g>ù³û×3ßI,gðâ{,IølsHáÉ@ˆSœÝžý»g8X5['íÇ|‹O0`ƾúÀ*’‰
-.Œ?œ»¡ï;›¼tk¥ë«ó"\Ùnæª&ø=>áAªË˜—HÉG,Òo?Ëb[Õš |û_¦÷°ážt±Èu^•iá.ëj㦭^ÓÊN5Ÿ«úsY,ÿW–fkõ\fuZ.€ÇBÝç™e²Mõús™vÖ9áthT£…Ûäßí6„>7[•ý€kt¶v7év«.²VM£šƒƒâŸZ-U]“UÑZm>úÒ'è‚Ø7ø!®ß__ö[Ø gW‹²qÛÅvptŠ§ƒñ™[ëªÒàµB­RŒ·*‹­tz}ËŠvaÙþÏr§yc£÷ÏNÊ©nþÚªzWT«çÆÚ"oÒy¡Ü´XUu®×ë\À4/Gšö$¯F‡:D[Ýÿ<%k(@U‰*üÀ Ø“¬Pi™—+7/µªïÓâ~O>a²"W¥nÜ­ª]ã›SËÙqò>—ÓÁ±0Ç2/«ÒyŸ{Z}ÓÔé&ÕÉüÔf«wnî”ø¡ªDÛ³ªÔi¦OÛ?!þ{UªæÇÃf2ð÷ ÐUÚ类ܲr›*uµ.ž«Ð›S[ˆË…—0?ó„ìƒÅ—o9›õè%
-–Ì‹ƒ Ÿ€XS̪-–¬†¦”[jµè£×7ê£ïóÒ48Â@ƒ"à÷&])+Š&Ä#χÉȺ[«^Ÿ=‹½$I" FšNƒcff#!¤¥kÊ á4J7µ[z®ŠjŽéðþXð¢+|Î\Ù Z4ßÑÇ8À»un·ܤ–›bZ[9¦Ô”)rŒ”¨6;kªC'ÅGä@& mWm’uq 1…=B™8WKBê5$‹EQ9DCLL6Œ½8IØ_[6Ð-ûx'¼L²z#¢ÀyQe_|Èq`B
-±J8¢%\CËhxD亱1ë‡^,“dœO µLÛÂÝC^wÁÝåÍÍÌ‹ g‚^Gâ‘9—ˆÜ!•sGfëfðžÊ(•×*Ó”ßÉIä…A?-¹#š<ôó9ÄŠÏÇ¢1k\Á¥óPÕ_ µÑ (dâ
-à{ßU´¢M"´?1—1fŽ”0k ¤è"@€vjÂt=6U£ 2¦ãÙ…ªÕÛÖ.Ñ¡šîEúÊ[y”8£ÑA'@ã-¼º-'r îapñä6ǨÙrp‹)/QwN„&Ï)bnj
-¥~Q;÷ÑbÅXäÉ(xZzG4!}T¬8‡U)Æâÿ³6©Íà®ó&ŒšT°üÄYì =òŒÛí"5e`S³€ QYÛ÷6F#Xó‚j9—ùGÔà%›žtÛ΋NN*p>:(>ðTß“:‚;o®oo/_ Æ$`_Û,Ìí®eÕ–˜bB
-'_n
-6§‰»ó„;i ‚bZÄÒ‹DŽƒº‹áÅ5ˆ½PF]m5ÕâQ]Bü­‹wdz£EÑTãïÒÞc?ãÁdŒ¿½M¿ÿ ÷Ó?ñíÿÄæÇ|ºRñ<«ž+àÇEÚþx¬úÿ[@•¿endstream
+xÚ­Ûr›8ôÝ_Á£=³¢,.Ó§4uºél“nê>µ ²Í#Šd'ζÿ¾G08$ÁnœÉ ç~Ó‘°aÁ6|bZN06¼`l #\,c ß> p‰ƒ*$ÔÄz7¼¹p<#0×vé¢ÁË7-ßÇÆ4ú6<ÿûìótr3B6±†®9Bĵ†ï.¯ÞkH ç×W—¾Þœ¼ñpzy}¥Á7“‹ÉÍäê|2BØ'èí’×ÿLôêÃÍÙ§Og7£ÛéÇÁdZÛÒ´[Ž2äçàÛ­eD`öÇe:OŒ;x±L¶±Œ‰c’±ãTdðeðoÍ°ñµ íòq|“ø¶×áÀ1n8[¾ŒÏðH`ºŽíü6B®e E¼DðŸÆéÉ]Æ44ݬç,×ë·úq«lÁc3 Än2YÇ)Ê9—¢I݃n#Šï¥ 3žÏRþœ\ܤÏr¾£N=¤çìç† y"µÌ•(ÌHd4d§Q8-r&VHÆë#@ï_I¡‰ÌwG±Àõ8–EK‹ŒçR¯âl¦^zÐÐ(ŠeÌSš EÎ׈näêÔxò
+i¸:&¸í£i<"¶« ɨ\ÍRZy§gp - RXU·l&2®Ðšf‹ ¹"˜8>ñq"¤=üOÑv¬Áß-buzé—~Ì¡^~ (¡aM“§ÿÕqR&Ì
+»fI,ʬùÝà†[ê}ùyë¢ j'¾¯Ø+:Û1ÕÉ»4
+“˜¥U³;M›ƒøª˜¼šqì>L6{5õÄfQ;§ðVɬW‹ 7¹ˆ· 2%Ùõʵ–)“¦›u†«6îí3*©€Ë·UÚ×æ‹)„BžJÊÛý rå9á2Ù°Ãâ9kÍüZ€«ë«ÉQÕÃ@O´‰²Fëxn{~ÔÌû“¶Ó
+°ùÃùŒ žl«Ì)†V¾‘'åbÄÒ¢©¸SÃJ{¼zi>ìŒ,“ÅìÙ£;¾}6vM•’˜*ÔÉòõÕ
endobj
-1273 0 obj <<
+1646 0 obj <<
/Type /Page
-/Contents 1274 0 R
-/Resources 1272 0 R
+/Contents 1647 0 R
+/Resources 1645 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1245 0 R
+/Parent 1644 0 R
>> endobj
-1275 0 obj <<
-/D [1273 0 R /XYZ 56.6929 794.5015 null]
+1648 0 obj <<
+/D [1646 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-350 0 obj <<
-/D [1273 0 R /XYZ 56.6929 418.3076 null]
+462 0 obj <<
+/D [1646 0 R /XYZ 85.0394 122.4687 null]
>> endobj
-1276 0 obj <<
-/D [1273 0 R /XYZ 56.6929 386.0953 null]
+1317 0 obj <<
+/D [1646 0 R /XYZ 85.0394 92.1609 null]
>> endobj
-1272 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F48 953 0 R >>
+1645 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1279 0 obj <<
-/Length 3843
+1651 0 obj <<
+/Length 3032
/Filter /FlateDecode
>>
stream
-xÚµZ_sÛ6÷§ðÛÉsC
-@_ÌsëzH*bkÝvÓkÓ6óêkÝõÖ0‘±Û?†Êgëú÷Š ÃMoà=¿J™Er¡ÁÏ€!5¢çÈ^2Ê1Ó¹kîGœ‡CNÄ} L¨ü Ùm9Gˆcã°MF:ë8»?:²L»˜‡+ÇP,br0—¿´{j°Ð˾«›'Nö÷÷óÅýí‡oèµ_Õµž‹]]<¬ù‹Í [L)«_ãX6UÎÆ©Ž£<Ó¯¤ìëtÊö\‡Y¡Çû¬²(N“ó¢Ó„èaÆ–Q e(Ûfl Ñõº~D¢ªùwÕz½±öìB1²ì;Œ;Hz`Jï¾vÞ‚˜Þ‘æò3QÃÐ…½”ÇeΉÛòPôîœ4ÚÔܸ
-!tS¶U:Js˜Û0^€Ö[½1ÖØÌ¿´»ß½³” –}»óÞºFñ[.ƒ‰Q²ÂM§òœãh
-¤•Ç8éu:O£4ɲó^rö:Ïe¡B±\UsÒÖ‘ßÁ¦§ƒ/&ÏqMˆx˜m*ãl(áC“{ZàeÕðÑoRÛ¬{sݲÖÚÞE¿3ÚK¡PzE{×í9.Æ÷›íIåå‘I_‘í˜&dU—D&‘#á ‡‡¶E¿rp)=†K<¿xUHÄUt£Ê¢/ŠÎ}Ö2À¢Z
-¬-­%JW5ü}W?5źóÝ yjLJ/Òè™ÍYMC¸Â$3´Û:Àfè—"™ÝÓ‘²N fˆD™†:"[¬ ÊÝÉÊ[
-èN‡PÌËÑó!4à:B—ÅQÕr¿ÃÚñT Mt9&=?Ï51…A<€bZ©Ñ(Ýj¦[ÍV ÏþJ̇·Yíü@ëCÆ…6CÔAÿç=¨ïêÊw=µ‚c==ÐkÓ¯_ˆÄõ)ˆHÙRlÄcI3´‡ÚµÙ·u›Íx“Ÿ'Юˆ¡€NR—‚0×oÔô)¡ÎÂSÂÿÒ5hpnNUêÏO6¤©ÈdòùN¶ç²8èU$‰'<1lÜÙ)x®‰9 Ï‹R€ì©N‚2]œ„Þ,FˆÙD‘àó´=Ñcà,¶[Hgw˜Ñ~ÑÒ“«.`W]SÉO[uë¾›N\s<'KâQÀ#{T)Mb
-& ¤® ßk®ø !üvˆTlЯ¨ë€TRuÂAÓ"CK<5À÷*Ë|>hHKSãƒì Â
-v©öqäp‡@vÈeÕ-wõC%F+5 ‹JJ0¶”®C©s÷tIOízþyøÁ±í‹ó¿‡×mã. “ŠÑ£ÚV@Çb0£#ò\¯Ìãx´ó¡#N#€mœ×™Ðá¸,Hkéîk-°2Ò&=/ÕsMˆ•£³T£ ÐÈåhaf?_ÿôfñî'z±³ ýýæ‚«$ qˆaG¬öp Il»UýlS’,n£O›ÒS¯ïîéSFÙ}»l×,kWø3ã%â5@ŒÎøøb:²ü ›dlÝf¦æ%%ýI^6k·ÎÀÌÌÑðºƒÒ/–:=߃cŸ÷§çx)Ngƒ·TX7bð—™ë%}bŸ½z""`‚ÆÍÓ®+_‚°a:u§¶‡k—ê—íf³oê%I»\?
-ÑR‡3,Ò$nƃÕ=·»zSìê5“›ª*ݨ|µo7èþæÃ>øÌŒn£Û-ÞÝ€1ÛKX!gÝ~¹BçóèèiïKl Ü©é
-\;ºe„€7x½/ûmi-Û„¨”­˜ù?PuèŽ:g§²œ[X¹Kýù”AÛì‹\Â¥CÉ×l`б "ÂÁ z÷+öí˪¶‹…,È
-Î"°½ÂÝÃÞ,!kõuUì»ÞÖ®*ヹ̅†ìig®ÞClÌð–u½gI“PG%Y”àÙ0ÊÀþ¼á_#L@%‰C^¼{d±BGy’ŒªäƒÎh_e’;m$ùðÇ*–BÕ~’Såm[þêõç.'Œ w‰¹nôkŠ ‘Å‘Ö®”ñ¤õÅﶂƒfeÓÑ#
-=]ý‹Š j:›B®ÓIÀsY¤³««Ý®*çOh‰GY F\hÎË÷\f£Äpt¨-Ç.“û+_5[ã¯Aø¦·ÙòE0Zø[b Ÿ”ÈÙ[øÃÆ Tw¦å.˜Õ¬ÚàéUéˆÁ™ Â`
-Që@¾bQÂ9Äö†aYm¨ðºÍ¹7a8qK¬yÅ×±£ŠûvKäuõ\­ùsûžŽ³§áX_P²r·9?BìÉæø1ˆ,œMmCs«¾.×û’÷}&òI2C*éöïúžÊ4Àºâ†/ÕWpÅ£cƒîÝe5ìaðr`tó¥:üð{^øìÁk’ÏAHÐòX&S³{ÆN‡INà’*‡îƒË‘"XŽD´EX„V„½uô
-j«8ËXö–ÈÇ›.ãðR†@‡‡‰RuH›b wxá|û0B&wÿºþøãÛÛ»ã€Ð…Þ>×¥K'GÞݽýñæDx(ënÙ>Wƒ,äRš¯C‚@4ýÃW ë¬=á“ð÷åOÿ&üðƒy
+xÚ½]“Û¶ñý~…&/æ͘
+¡ ¯~ý/
+û§+΢,Õ‹'xáLd™\ì®”Ž˜VQä Û«_®þ:œÌš¥^ý ÎdK¥ô)Pg,ŽddX”ëü°íI®§j»¥Ñ²¤ç¡+ v"¥`‰ñ"‘NÂÏ!…S,bJø˜rXÈTÞ÷ùj®à_y¼¹’ˆâòî–gû©N€C–e±šï³Ý6OÝu¥q°íTûmIoUé&ú†žÝ&o¯EXŒÜB«ú½[Dr˜a‘÷ù2ïJ0¸ÖÜÁÌH˜F›ÜlUowjžê)!PÈ"Œ4Dœ¡¤,ÓZÒaZê€-¢`ùLO{Ä/áMfÁòиZÓs" ¼9a¸É-°ßØA—ïì¨Ù—mÞWMo °o¶ÕÊî¸nZÔ>©¨k¶\ddàsæóº
+œ˜hS>e@j&¤Eéú¼/weÝwh•B"]CÿiS€½WÆͦ==Aým[eG½ó©KeÏOàý¶Y‚qž² žžè$ûƒjKX*ѦG¦ Ó OÏœ”Ž¦JÄæÔRñǵˆ³4åbƒ4"ÉþPò,KÓÔŸ:Âb8%ibàœ¹(biœfãÎȤq]Ï)ÆŒK'ÈhhÂ.PH8Oçqk´´ïƒÇBbcM‚lÊz\î1¯²Z Ù”ŒÎ@
+!„Ãêʬ…È®š™|°nKü¸hdudK™f'qu 1ø?ì!:‡ÐV:Íâ–&Ô¨™VdÅ#<p€î—†OU¿±ähî‰Ú…V\o¢í ñÚÎîG™GÍzÀëJ_ÐB!†ÀdôÃÐ=¹±j´´õänc>ètVKt>·ÏÓõks2¸°9"o­v
+»`ÔVa¨&o|[›¨…ç½Ûap£±;ûœ"Mêæ³CÃWLÝ\ é OÍa[ÐpYÎ×æX# C¸äùÅ-&ùiØ‘ùNäaÈ”ñ&¥YÑÔå<«Y?OR‹×´‚L©ÿ&þå–™œ6ÄN²—;{²_@´¼]V}›·–S4^EÁ!/@5:;Ë›ºC2FeÉx¬<hõƒ`£pxwç"©HwXveOc´X3eŽ
+1ı¯þŸŠ—/&9A赟¿_k¸¶.þòžFÓ@¯9=†@Ç¡5ì,ªë3× fC/˜MZ?¨ÑkKeÌ»¹/oaMOqrÆ µ °cnÚ¦u¹ê}*±!ÆÇ(¦¢$Òi°:´$Gät†ýÚÖ´.O
+ aßû4CŸÅ#u®‚´4ôH®¾H/†¾Ç_CÈuÕg_¢‹SmüÈŸ-³
+_£ …^”º­?—mÖMØ5ù9Vá´t¤]}–\Î˳û¦7¥…r>|\(ëÒ
+î%y=][ÁÔ`M^Z``¨£ÏŽ
+‹rÂÀ,L$ ü]É„
+¿<9ñfžš_oÐ$}ŽH‚MCß3RkŠ
+K/(1ºäÒ[»+Îü(&Ò Éâ‘žŸÿófÆ_©„Ei*ýš”IÊT
+D,S¨IŸŽýeÍ)ëÿ)”o#endstream
endobj
-1278 0 obj <<
+1650 0 obj <<
/Type /Page
-/Contents 1279 0 R
-/Resources 1277 0 R
+/Contents 1651 0 R
+/Resources 1649 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
-/Annots [ 1281 0 R ]
+/Parent 1644 0 R
>> endobj
-1281 0 obj <<
+1652 0 obj <<
+/D [1650 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1649 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1655 0 obj <<
+/Length 3894
+/Filter /FlateDecode
+>>
+stream
+xÚµ[ÝsÜ8Ž÷_Ño×®KÓü”ÄÚ§Ìäc¼s›ÙM¼µu5³ê–l«Ò-9-u<þï H꣥öÜM]¥’¦@„@øTÄŠÃ±Ê ãÊêUj53\˜ÕîpÅWÐ÷ñJxžM`Ú ¹~¸»ºù Ò•e6‘Éêî~0WÆx–‰Õ]ñëúÇŸÞþýîýçë4|°ëIøú‡ÛOïˆbéçÇ_>}¸ýøÏÏo¯S½¾»ýå‘?¿ÿðþóûO?¾¿ÞˆÌ/ý >Üþ×{j}üüöo{ûùúßw½zßeø¾‚+|‘oW¿þ›¯
+xí¿^q¦lfVÏðÀ™°V®WÚ(f´R²¿úrõ8á × ÓŸQ3™Lg(å@‚C['«ÔX–(©œ«^Ȧ몥ßÆssüZÕø­‹êx-²u¹ëšã˵b ŠÒ ²Û.#zÌû‡l]7Dü^•Ïý*õd½ß8—ûzóA‹Ø2•,Y
+/‹ò:(‹Í×ò¥eÛª.hÈäMA©5~HƒÒ=WmG¬6*Mˆ'W!˜5F:Þ/?½•&¡M~ÌÛGj5÷ôKÒBß…Zu~ð4§Bø=µeA­çª{œy#a¦•â±¾ËÌkÀ¾*“HÏVþÞ•u[55ÍEY°3äŒ8©HAiJÎ8Ï´r‘½ˆ¹¸P
+|Ýbóû=l÷di¡RÆe/¯¹Îâ@GZ2®aSF«ß=¢’•ÊÖÍSçT¡Ù®£mÛf_v%›Ñ¥µLÂñðºD³ÅÏyKSО!©ªé—œöeDèúmŸÊ]uÿâ‰hÈô”wd
+C^ì&YF­ “J%^˜±J'rƒ™&,rb¦Oî€5ÇüÀp)½¾uv‘Eç—­íøM?xn˧ü˜ws 2¥Œø#8[ÖXÏ:„V¡S
+¦sY€Èt.Áȱ1(ŒE¸s6(’õÏŸ0Ôò’¸¶w¬®íì~O­#¤ëûæH”_¾lî¾Ü~ôýOJ‹ÑgëÛ{?šN´âéƒv µeGsæuáùQ7´} x<Îõ؈½Úv,Š²îª|û©%…V`»5@`±îТµAàÁEèñ²ÒÃsµ÷3lK¢äû}óì2C&rýB$‘(‡¼Û=RÄrNħcU盛(–_3˜%Û£s ¨ï
+Eóž¦ã‹ò>?‘‡}zŨƒNɽñØ©9à|¾Ì`¤Éɺ)»ÝÍ×ãÖ°ÞÉN#¼a‰!ÂÃN;õ¾1Ñë}ÔŽOÑ?B;úGh»wV‰rÞ ¨ãXÔòO­óØìÂÔó!`µ v‰<'¢gðcŸÂûƒU÷*­í<²C¡ÖÌlÐ{hìoRj¯Ålˆ4`ið[i¾ûôåfa+f1[!&²V4‡Üݹž6§< àvo“¬ï®­\7$Ù©õ"†³ôfuXÉŒ’a¦A´ÐÜ0—5·( Jel˜æpj½ýåû¶¡Ö6¢ßUÝ÷géÁoï†n{Œê) 'ñÁíÿÌ]¾‘œI V}Ñå¹–]~äŠêëu4òóZ1a^Y;0ͬ=òó:c€Æ'‹Ó1¼æpíüéÉ…éÂAkãQ±  1"à·–šhÛʤ®‰Ð>ú$Ò&¿Ž­‡².Ç4¢O²FJRR‚ ñ`w?¿ÿïÛ‘)ôNø—ËNÝ+øT1C›×vl»}ÞcM2Œ5.ú:‘ @ž@õŠH–ñ4ÉbÖ·{Ìëç1yâÒu\ï¿P£9Òr‘àì1OÁe µ(Û*êÕñ; -È›)2£×öɾ´Âá@$SD,[xû7¤ Á932MÆ
+¢}†ŒÛ'FÐrÛÒ~lŒ¶Ùf(°ƒ¶¶sU‘&´ KØ‹„ûÓ|_áŒøIO7W#
+Äã‚$‡“€mXf‚Ǻ©7åï` 4LdlOÛ~*»ÞW_}rĽPé#O. œ30 «µ•¤Â(™Í²l¾¾¸‰3n†SÎø}‘1# ãŒla˽‡˜À˜É`÷ÇXÀå&c
+¬Õ¡Ë‘Ü®_šâ`>¨,Õ£1¤÷8Ãõx,ßóc€5è€ûJQbà¯ËGBözª÷eëÇÆUƒ/¥$"c™L&¾î ‰ íÿ0hT<œáË€aȵ "W\qg+yúòÒifiy^ÇSãµïBÕ÷ 1ØO—3o~*÷ûƒ;M! ‹/§iû2©ÇtŸ@Z@D:Nì%áêÛ„Þ€‡bGV‹EïX{Rð
+ ƾ y&À™ÎHôã3µ6ŠÀùu`’õÞ'&­Á¼ñ½q5²èÌW<€â­ZN'гoòÂSÂO§í¾Úù.ÛDâ±úNªªW´î)Ý;øX¯ ¯± ÛØ[¹,Êc媞”ËûËÃç/œ²[?Œ¢å  F“`ƒÂ_ðå˜9§¾kúqnœcñÔA^.Ù¼R-r-ŸºÈå€J¾{,7ýeÇèÜÁ¦'£³/pÍ,?:y`¶‰äéx}ª ûœÚ
+UíNEŸ"l:¼˜n°Âë0ÈŒ\f—ªÄþiìgÜ §tæ0’NiÁ$j.²[d³
+öL+¶pJ¤…ÙRuù ˜–ÏH`rõòÐvy¸³ÚµKg=‚µö¢‘é\†ÑYI,K2!GBøHÅGŸ\+ –‘ñxTD1ˆn8ŽÕö¡ o†õOmþàÇõoëçiüb5ýï°BÅ)E­‹eˆ;•™Ü­ý9Kæ
+N™2ó[2—ce
+”78[K¦b8ËŒ~ÅTz¦ ¦â™ÜÝ]U,€5©tzqáÈt¾ò8ÑVLŠd´òÝüµ)¹Ò´÷š½+Íæ\iíÃÝÜvþ2×WìwÇ#áö]¸Ûż3•t£Î{¹9G{®Þ/÷Ü_5Ÿï¹æ˜ÇZÄ/bJÌꬤ#7ÇS}ã,ƒþe°sé7
+Yg2x Ô˜P˜˜«› ìÙ\_
+ ±ªÃaã.Š¹fd׈€é‰ A‘Žë!F€'‡¸7Q$ÄøÇuOŒ8ó§'g­ï E7¢¡_Ÿiû4Ó0þ×eZÜøbÑ\‰:e\s3—jáñÔB×øÛ!BHÇŽ‘Šsúþ"ºG*‰Z°Dдàbl‰KÒ
+fbÞèòpe–Çï¬Ç2ƒ‡ˆŽøI¿çûª omffÅŠ ™’/=
+8¾]^í[}µ¾"D_y}CºÑW,ø<´m/—n–¾Ù‡ ÚÏØ'üõ¾éOÏßÿgüâ6ËnMOX&m„BÁM:•<~ø.úÿ
+endobj
+1654 0 obj <<
+/Type /Page
+/Contents 1655 0 R
+/Resources 1653 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1644 0 R
+/Annots [ 1657 0 R ]
+>> endobj
+1657 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [250.9056 335.8063 314.5963 345.2159]
+/Rect [250.9056 106.0844 314.5963 115.494]
/Subtype /Link
/A << /S /GoTo /D (statsfile) >>
>> endobj
-1280 0 obj <<
-/D [1278 0 R /XYZ 85.0394 794.5015 null]
+1656 0 obj <<
+/D [1654 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1277 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1653 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F39 1151 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1286 0 obj <<
-/Length 3459
+1661 0 obj <<
+/Length 3489
/Filter /FlateDecode
>>
stream
-xÚ¥]sÛ6òÝ¿Âs/•g" Aœ>¹±“K¯qîlçz¶´YœP¤*Rv|7÷ßo»€@‰R’¹ñŒ ,‹Åb±_<ð'ÏÓ,ÊŠ¸8Ï ¥B¦ç³Õ™8„±·g’q¦ibýxöý›$?/¢"‹³óûE@KGBky~?ÿm’EqtÄäõ‡›7ïÞ~¼½¼ÈÕäþ݇›‹iœŠÉ›w?_Sëííåû÷—·S©S9yý×Ë¿ß_ßÒPÆ4~|wsE‚>GˆÞ^¿¹¾½¾y}}ñÇýOg×÷~/á~¥Hp#žýö‡8ŸÃ¶:QRèôü:"’EŸ¯ÎTšD©J©ÏîÎþá £vê¨ü¤ˆâ$‹GÇ
-ÙCðbs!õ¤]Ñ
-'{™aÇ*(¶Ìçu‡éõ í #V Xš—:]õèç>X=äräDYé©M"*;lBi=¹GBP¹í—í¦ê_³33¾}бwqè–d· „÷­›ÄÄp°7˜阧jnš™qHxê–Î’AîÂXZÝØžvç”ÄOŒµ¿ê
-úUo¡¬kh¨Â_™}ê<x§;dêðÛõrRÙ¹)Ù¨Ô™ºª®pð…`킾 8xC$kš¬…Å°vÍØñ”Ž¾8Þvl<¾ul´ç‘§¤#)‰ä®ZUu¹±æ_)Ç
-6cË,qƒYÙP£ÜT+87è™ÕÚj¸JàdænÞï"MK탫léõô%=ÃÉåÊÀ,Iઠ«Ð„‡­æ@(V¶E&n͆ñú—õžð¬^aãòæ× )ådOx´ÒMkUEÝ
-g.Ž²¼Œ"RqîŽqMþ#œŽÖ¡3‚ÆSYWó²·Ñ*tŸA/¨U2Ge 1HS’Í–“d휉´;¬œR+XXMáœf§‰‹ðm{$>M覤îV
-ù&¾‚HfC_ww³æíª¬˜Ðð.ÂtkGœ¦ÏtæƬMלä¨Bùûô'—C/³‚' ÇÊÕ.Eò+6ífUÖÔö¦ø<}¢¶´  ÔfÑÈÓød8‡Û6•è ¸+3ç‰N4‘è§äÞÎZ6³¥àEη:¨³²µAÖ±MyîꌖG:ÆwÈ%¡\‘ï&ØPaŽ-‰²5<º]‡Kgœ ˆœsœnøb6âÃY˜f„q
-o ]‘T&
-H™”ØóH­«Í]ÙçÌÛEÿÌä^ˆVÁ ³äœ³1û‘É.|éýÀˆÔðUHëäÔõh€Ž5´øÂ=°NÜs‡eíA70>m›©ù\õ‡I*šÛBæÁc01¬ƒØz‰rÁ50,Á®Ù[a&OÎØ@ÅC»CM(¨Ý-5MÃ5WöeWòqx¶fÕR­QBòR~r‹3uƒ-=HZˆj#ü„Œ‡*Åï•'µ|­÷êá~(„JwOn¶m6ÀÖj•µêƒÔ`± —:­!Öq}ðXÖ™fª®¯f‡%10‚™*ŠÓË{¬‘õª'Q–€D ü‚O¾*ù)òƒ'k ºo¶ïŽ›Kž‚A‡=ÿBíE!0øð2F
-é"s1À@S&7ÄÏ+wum
-)­¸}\ö4àæãû1~Å¢pÑç@|ôX5pçqCˆ<£á 런Ţ7Ž]Ùr›W–ü‚#›~,¯1Œ3ëí#±ÂDŠ/+1 [–/¿µ"Ä>ŒYt[Î’)>´Î` ×|¤{–ÌÃ(¾ÇHÐ
+xÚ¥ZÝsÛ6÷_¡·“g*š ~Ì=¹±’K¯qz¶Ò¹NÓŠ„,N)R%);î_»ØER”ÜÎ%“X,>¸ûÛ/PbæÂ_1SÄ^< cßQ®P³twåΞ`ìÕ`ž…eZô¹¾_]ݼ—á,vâÀ f«Mo­Èq£HÌVÙ¯óÀñœkXÁ¿û|ÿþã‡/·×¡?_}ü|½ð”;ÿñÇ%µ><Ü~útûp½‘ówÿºýiµ| ¡€×øþãýQbzœYôaù~ù°¼·¼þmõÃÕrÕ½Kÿ}…+ñEþ¸úõ7w–Ákÿpå:2ŽÔì:®#âØ›í®|%åKi)ÅÕãÕº{£fê¤ü„ëx2ð&è‹ž
+¡œØ­ °ÚjPºÏ÷I»-“éEójCÔvË>ßØèúY×DÌ»}cÉé¡ÎÛW¨¯¬ïHƒmEä—­.‰’—M[_GóCÚêŒw`¦¬âí¤¼Ý²û¢]Hß‘®¡,œX)ϼZ]f)ÚJy
+d€…îüã†æ•UË ìuš£töQHÐÈô&9Ì—ó`
+©œ@Ä!ïBÎœ GŠ¤D€÷70 <Nä‹70Ùç:ÉŽ‹0Ù4yU.ÀdΠÒóјåå#t\gàà("7ÂàR
+¯‡Kì!.ñÙÚa‹Klç%â[/Û<Ý2§%"™/¡ÇêñãjñS^›OºÔub0‰Ýõëò¤r·Ó•Qí„F2À—bÐM¶#•7?4š“{ø`®AÔÁ§9ì³¤å ‹b
+Ó^ùGL"0˜–J¦qêÓ2 Y¨0Ôa'ä×b> k_9®¿CÛÜ<'õM}(oŒnX¤èw'N(”r|zÃ#~u•û¨Oàf{xN,…@ÑXý4£ÆCw–}Ñç?…ÝɪxG¶O˜àëEŽ?râXÈÁNáo¹Þ8ÇéjxÔˆŒçI‰àóÚt¦}R·yz(’šè¤2Èò&=X{l(@G†SH‰0vÂгò'D-öU‘§Sê
+@]lZàÝé²ý‡EEÔÇžVßb¯¨Òd
+¡R:nìZèT{#t`CK‰È9µt°»Ê„ö½y »„T†„d]Zë ó†Z´šæ
+mŠ/€¥ÕM ¯ðOè=Á˜áИ7D2’<q¬!òší6)í9‡œLü%/ŠQɾÖ6%,¸e²x¦Õnw(óÔQH0·
+êþ©¨Ö / ¢?|¡Ïuß(Âû\n¹ÌåÀ Ú-2ýœ§“!! ÀÌ/nßqMì? !€fx
+9i^}®óA ã2iN­7º®u¶xB$žDt¡äåý;®‰ £@è(ÃۉƗ…^l 2’ó"oèÞØÚ×½¦"ü–Lb
+‘ž'Â{™hŽNZfOˆ¡ת1 ””Z]YŠeYŸW;jÓ[ bð6/2â;ÎÎ[~64B÷p8©xI^y}Z0Åö ÍáZ]ïòRO]ÄA‚Ãn^*€y¼š6”nFäÐ<&¹Ø#yA£ÿòØgp@‹Žohõh¿¤å2ù’š?~¾%–Þž J@€‚Ë… ¤p=OÞ*kx^‡< eî^#²=ZxfíF…1ôwI ç4°†^„Ä5rKc€é}š¥kb ¦÷!i„Æõ`?·óz–9eá|#
+̘oì}ùØ1^Ç–gØ^¿öNñ)'0ɨ‡ü™Ê-cÀæ–%²©÷‡v[ÑO³K-°CU“kÍ (Ç—@z[ÙI¼X¾!‚1ëøëhô2eª-jݬ³e’5³Ö¤wîˆ^low£ÎÖÆšR¾šßšåËk¶æcPòâ£UótºŽ(æ@¿¿aD7Âñq»È
+Ù‹‡Ëòý~Ô÷Ò¼üßóÒ\ÝA?··>‰É?©$i˜–nuú{ӑߙܴÝ]ûxrtyÊÛ×a>¹­s9V¿ôÜå XÌMà-±'a«±^»BÖšMŽ]v6ó]^$µqþ¾o‚M81¸p1§Ó %Eo‹¤Î-WOiÐÓ»½·_ù2;³ª²¢ö‰›õZzÈ|úúÈÉór0<ÈA&TÌ.s ®ŠÏÍcŽ}oïáûŽ áÝW'>8jÇ-J&=¿ïÑL Bc{ Ï§õéÓ‚vž†ø ónù•>Ž™ahþˆ_á~!~yÄÿyOªð‰ûÓ—Çå—OØ¢’ |ihòKjYJÉyìH |W@pÎýØO*¡7‘îÃ?^êÿþ!àñW’~èÈ(ò¦ëH?‚EøPø
+*:-˜øƒ§Gÿ—âƒhendstream
endobj
-1285 0 obj <<
+1660 0 obj <<
/Type /Page
-/Contents 1286 0 R
-/Resources 1284 0 R
+/Contents 1661 0 R
+/Resources 1659 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1644 0 R
+/Annots [ 1663 0 R ]
>> endobj
-1287 0 obj <<
-/D [1285 0 R /XYZ 56.6929 794.5015 null]
+1663 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.6033 659.1254 149.9876 671.185]
+/Subtype /Link
+/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-354 0 obj <<
-/D [1285 0 R /XYZ 56.6929 333.8409 null]
+1662 0 obj <<
+/D [1660 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1072 0 obj <<
-/D [1285 0 R /XYZ 56.6929 308.7186 null]
+1659 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1284 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F48 953 0 R >>
+1666 0 obj <<
+/Length 3661
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sܶñ]¿â&O§™ ‚ÄíNgYN•Ä²+«ít’<PGJbÃ#/Gž¥ÓÿÞ]ì‚_âIJk?ÜX,‹ý†Â…€ÿáª@DI¼0I(ªÅzs$·0÷íQÈ8+´b}suôæCdIh©W7Z6Ö†‹«ìÇåé_N>_]¯¤K¯”ËoÎ/ÞÓHB?§Ÿ.>œû·Ë“c/¯Î?]ÐðåÙ‡³Ë³‹Ó³ãUhUë%S8°àÃùg}{yòñãÉåñÏWß]ugž7ä×£‹ ŽýÝ‘¢ÄªÅ|ˆ L¹ØÅ*
+TE~¤<úrô׎à`Ö-“ŸŠl ¬43ŒÃ
+îç«,ÿêƒå}î›Üì›|¿ñŸÿyçv^M¶&ir$f àϪ#­†XN*2œQ« ·ÌŠ&½.óUZÞÖ»¢½Û4SB# Øϲà‘fXË1*0ÖFcÞ o:^¶wˆ–Í6_? !óŒfÞ_|ùrvJ“vÝ\Úòo•Âu^Ö/Q¬ÒMvE|Ü—m±¢»Ñ*°±ŒÆj±av"ÓPaœ  s"k©@´¤iÓ6ßäUÛ¹¥»ãÐ.sþ(áy†,†bùÉ)"ŽÓ‰
+ê„| ôwFô;Võn“–w®ø>!4ÐÜ]ÚÐD™ß´4ÔÑø%¤¹}ÕîŽírß´yÆ;"ÝhBÃMŽ®Ôã¯Òj}G2•UK¶ê­:¯2"ë‹òÊ
+:l·¹W`é”\HŸ¹Œsdä.|!×E•@~.c ¥ˆ¿ºwsÑ3Ðõi=M6C%Âøy,2pXÖ)3ßÞ¹2<§€4i×:Wƒ‡œÕôR”H&cU§;‡”$°I¤Æwþœ@z®bÍ@&lÒöf0ä ‚”ÞØ?dX„ÅzyBä×õö‘èc(ÆÒr
+LlM§¸¤ÆP-?ŠDX¯PMÈ“ãüž4,Œ}¶ ¥ÖoˆRÌ]k( S¯»W$2TC{ªUÍÞÔû
+=xoS08V|@'…„¿>-›šqëͶ SCn+í,|$QpD¼—Ü¡’$ÒcyÆëI=6µË¼|,\Ð1zé²Nƒ¾Ò…
+k¶á8YµÂ›5@ézoç„t¥jò]C®îµÎyÔNF&È K[!æÏ,EŽVzª¹TÒLj§‡v»vý +úþ…¥*ä8\úÔX8‡ŽCN×߀ä”ú†®«¥¨#IÁ(æj HE‡ª€ˆHbÍm,Ž
+é̵câçãV»seôêç´`KÖû{rzÓj#„’Wyg¿I«ôö0=š‘Šžt|¹¢œ¥¯
+mËçqó¦Ë_Æ&ç9Éf»=§ÿ‚—½öÔA+ôaâwé=ã•yuÛÞñ0µìÅ2’ìLbáË€Ò xÞ¹ÿ+– ï—2±­O›.?œò¡äl¯ñ$Ë
+¼_Ü4 f‚¯ôv 7.Î?ëàäò3fä'„B‰%ÎQXEèš[kZ™MP¿¯ï„Ø‘txª¦ßÁ ¡¦4Ž¶WPkdRÑÏ5i! N™ôRØH=bÕcƒý°oë*£ÈÅêäýûËÄöM‡Û<V@®)~wçâ§'Ï(uÅ$Ô9£€swŸïæBÔ¢QWeâÕÏø:(üc­†V¶n!dÌQŒ›aEr½7HØO$Ó]:|áçj茧ø,æç\l
+–ŸŽ±DÞîwÛšð‹?ÖtžˆT& ÕæNÎ:™ºq—c¥]Ó÷5“íþ¾f‡Éò¤z¤áª®V›´]ßu„§#w¶™2vÔ7w=®ý®on=IGë5Pì4»Kt(ܬ±ÛÝOúf·‘•w·³æ„z‡Ïè†
+KÕ©–sÐÄfÝR"§o0Ú7Ûµá×=4<v‰ Ó+œö €
+'ph—%¥UÚ?ãÃpW~Ìå—6ã‹À)¤ƒOW*Y~óÈ]*h=}-C—„¸d@æCR
+ø6«&Ï‚¿SS‡þ^WE³õ¾èNùÿ-iÿ‡¶±/jå|ã :°ÛÄ@%Sλ?:}Êú} ûendstream
+endobj
+1665 0 obj <<
+/Type /Page
+/Contents 1666 0 R
+/Resources 1664 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1644 0 R
+/Annots [ 1668 0 R ]
+>> endobj
+1668 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [278.4002 485.7209 280.3928 497.7806]
+/Subtype/Link/A<</Type/Action/S/URI/URI()>>
+>> endobj
+1667 0 obj <<
+/D [1665 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1664 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1290 0 obj <<
-/Length 3312
-/Filter /FlateDecode
->>
-stream
-xÚÍ]sã¶ñÝ¿Bo•fŽ ñE—‹}u¦çkg:i’Z¢,6©ˆ”}î¯ï.° A‰’®éÍôÆãá
-\»‹ýØ$?6Ñ*N„‘“ÌÈX%LM曫dòïÞ_1‰<Rb}ûpõÍÈ&&6)O'Ë`.'Z³ÉÃâ—黿¾ýûÃõý,â*™¦ñ,Ri2ýööî;7bÜãÝÇ»›Û÷?Ý¿erúpûñÎ ß_ß\ß_ß½»žEL+ßsšáÄ7·»vÐûû·>¼½ŸýöðýÕõCÇKÈ/K2òÇÕ/¿%“°ýýU £Õä~$13†O6WR‰XI!üÈúêÇ«º ƒ·öÓ1ù)¡c¥y6"@β`™N2eâTpax»œEB«i»*ðïº"¨lÜ3wMÞ´Å®Gz3‹$3øau0ESìž=æK¹^ûÑjá zßf¾ûøp{ó³ƒw3¦§Åû¢!œ¶&\?O¿Ì:.ÜCÄXl”â–©_•,Še¾_·
-cÏHP0” _³hP/ý
-Ð(„@Ã\•Å3šƒ}uÏ}C}s#u¨ÍYóT^¶ : _&¡ÉâÄnsB®vŽà hUþT4oFW‡ð¥!ô„«;eOžÆ™éPnÛ¼iÀïŒÙšŠ¹Pì€B™ttIÖÓÞ.÷Æ*›ÅŒÁ¿tþ^V |ÖçàCê”Ø!ñ
-ßÄJi¯R;ø?;fäˆsrÄÌ18æICøˆ4¤`3‡ol¬À1˵ÑÉèäÇaâgn››˜wõߘ[Ô}4`:0¼7w¼SW©XkchÅ3J"c!D6Tœö_û†¢Ì¢lòÇuAÑÇ‹µ·Ó@288k|˜ø1Ü$‚MRðA@Åg¥~"3±fÊ S¿?÷•'$º')pß%0~+†SESQš0p“?‘Xró æIÈ?pÞli“  ½M½°I›Tç%-&œ"E¨I'°X&²#¬Þ¥…û9|ÈÁÿ&”¿dtü ¦'*3“³22x’71
-{&Ø…ࢊ3Ç€’¯Y` qÁÄ%A¼Ö,3¢ú }–û
-ùš-’C%™¥ý¿à±N©j lúÏ‹í¬a})¹õ­¬ÿG‚ÄL†ŠpÒ€ôÔŽzk‚ÿàú"iÀ j¦Ï·Ö$.-õoê¶ë²ôYJŸý„µáaÖvF`ƒ)'^"Ò²˜·g» J$(ƒý†Sv¬°µ:Ëtصô2A<J3È¥5ðfNôn )
-±Ž5×÷E;,ÛÈ/¢KŽ£´ ³Ôdçï°FV&Cà,®~‹Å<¤AÔ,Örª±ô0vËJ•[*úámQa¹°p/šr³_ç­Û*ß“D¬ú±©×…ÝwþîîG8&-Fûº¥··?üt}?ƒTöçc 6`@š*EŒ–8¨—ªÂõw°Ž©} Ìç:jDd]ÞÛ$Y’¤ö6À:³·ËîmÑÎWÑÓz_omŸBntvíkdñÁÖ
-[r‚«»N/Ou¿ƒØÌñc´GØÔL…S&Á¤G{P{J-|#`ª£äD ¾Pؽ·ßÌó}c5Ö Ö[ôê45–ô4oÛb³mÃn“v+R¯)Íb-ÌP'-Üh*˜šzoù`t^Û'vpûÐø\”‹ê/¯\ß j¸4¯«¦ÝÍôt?'­7ž
-r†9ùÄœ~Ãû¼o&XàèdhÔÊö¤Áy„I/8Ãë´ÁtX®FKľYEØtm¢ºŠšÕ¾]Ô/Õ!%B3—Üœ'¥Ã¡eÀl8 ‰ù‡;Ó‚ZbrÑ|Stç:ð¢øT¶{µØnŒ4¬(ŸÝ9¼ûñöýÃõý‡7˜t¯jšiQÓ
-æB,«êèË4*F^½RؤìáÇ®l‹æðЂJàN£FzþØ%eBvuó™=9tLÇ©‘¬Ï²FŠrbáBÀ‰Ž¥Ì.8å댎y,Û¡Ë‹õ"š¯Ë¢j’>‘±Á„à,Öf¡‚ìŠ I 3¸,í<3Â/9 –36­ÀE‘&µ¶çŒã›íºØ
-1
-§¶#çr7…ç»'“v)ùÁ2˘䂟 ±N[^‡e-¯¬ÊM¾ŽvTq{Ú („ |ž„k„†a Ncùà€ˆÛåˆð äœ:ýŒ°®ƒ°®2ñC)_§ô:¶ó •j¬Æ¡¿U—õ×´ð º…cPÕ9à¸r<§ˆÁtùžNô„°ßŸð:UnW5$å83¤ú®lX8
-î GÁ|áظqbPØhá'qd¹a·¢ì+Bán¦ñ“µ1ô4ëâÉöC¬ê f…¿mµ+øPVîÞØÙ¢t“¿v¡†nxÞª¢‹,y5/†÷¥úÛ[nÈÏ\,WŠÃÁD¢ä¨9Ô‹þ<áŒÙXgÌÎcY³JˆÄÑÜVÇ‘ŽÅÂpuž€k„‚³i‹Lè! ´c&èçì"„I}¬‚¡’^‘«H;«ëF¹xºe¿‹ò£:|ßIQæ»»·®±@•$9VS¡ŽŽ:ΧÏeíºznØj÷w¹`À59Þ;Ëik]ŠoÁëÐÕK>X(_¿ä¯ŸcWº2 ßÕ²¦žRs°jÏRrÈ‹žî»Ìñ±nWÃtÌ_+E
-nÞ¡vM›Å+H¶œS´Úâå³&>uóV¨¯ËŽhQ2¹xÀõ¹·rû+ËP"
-­OÜ‹ Ä
+1671 0 obj <<
+/Length 3076
+/Filter /FlateDecode
+>>
+stream
+xÚÍZÝsÛ¸÷_¡><"ø"
+™1-¹œXm™±–,˜ÏVç‰á|ºYÌD&Ýü›.‚¿t¯™I&Œ{)L°8ðRÈpÿŸ×h P)‘Še¸{?¯£‰ÁèWWWÙ›W¯^f&®‚3@'¹$B°,M¥Ÿ7[•EµmÚäÕÓÁZý9ëüþ¾˜¦ü!ìêõsÈÅÇÙj7/"új‡É¯^-àï‡?ÿ_÷d\±f·X”ã\bIF·Mó_^ÉþÁ%`i+­‚9)ãV©úÂ0€¦oêzUäôýý¶¬«æ
+´\#È>žUÆúÆ@…· ² v}Vð^äYžH³}q–eJÚÀóâ<QNL·ËLªR3¥ ™NgyEÄmA×|>GÜyrK×͹›îªm¹.húC™œ¬È8ãZé°è¦šÏZ‰¸àˆšÎ=ÓqF½!þy±*¶Q‡ñµ`¢PFô—"ræVfDxD•²Ìê,ÈÈ©ŸÞ, BÞ¼Xä»Õ–nÊfä,Œ_. ó«zì(‚"q‰c0Ö3­{ÅÓ &áÝv™Tçõ:/«K1 vjí–épñ!~Ó\êÁê£ð͘U­ÅO¡×õÐ+[ôr‡Ô$ œHm#$..Æä:–YnK„7·x²þš¯ó§@7Å–«+¸þûwïß]¼½¦»Í¹pÓ¢¹‡¸T4AÁ⡼傮¨¨Ò›‡bÓ®æ¡*´`Òº½˜YÕ7—A*Ûî =…;8Çz
+ pÊò¡
+o˜ªfù¶Hê*)>ÂŽr•e
+ªÓ:´\#J ö«%ÓNf Å á,Yû„Môcîœq<2<ê
+TG,ˆîšÈ¢ÊoW!
+Ï–ÅìWÜ-0Kø³-Öõæ‰Ø¡Xø5.¤£|<´Ç”áÌ!‡.Êãò®ªƒ[@Ä4ÐßO^…]Ä`ô}±µÖûó¼âÍq<hÀ–2ö<ô¸Nà!rùÒ±X7[Ͷœ–-βÓË·\#ë 
+%ÁÔ÷tð_VöNÂó÷Ñøù]¤4ŠYë>³‹œ$Ò¦ÐL)¬gB¡B¬íÎ!¡»ØwuAr¿!–Ìé,6´m哹PKc8 ÃÐmA×½ í(Å„è5¢Jê ~l»æ‡²xÑD¦Lp—ö
+¬y}¢+½y1e-“F?ïøY¡mpcÉ ‚épÂ]7D¶è5 *¿Ã·›c«s¦œ6ƒÕCnTÐEÙlÿü}Þ4wÆ|-eR¥bOCÍ[½´èôÒ¼Õ‹žP ­ù~¹çRüÖ]‡ƒÄÔ‚˜€Çö
+s ÝkSð¦â´Ãì\ôw$²Cq,ª†ôj8’Í æ„V-¼…òÉFG'·Ž‰7¡«äGÜMiÇRןänI;iØuŽ÷¢{qvhÜ4eÎe±*=Í”RvûÏ]²Ì¼lðasX¸XÆ¿³˜õà5E¦àЙƒH—Ÿôõ[Y(GEš ¿~ÿ¾YQ^ì=ªÍã +qÆPT÷”@ƒ~Íù™e”ÝD*ÊzxßþÔs_±éô´™Ì&%£#\Â*{ÀÕųþ¡h+ñsݤ¯ÿÿf4¾Vw.û­¬ ”ørüÕUkdÍO9ùžPˆˆü½B?®@áŒo–Ç¡ý vDAÔ¨ñ:µ¾¬í¾(B±iÆ=c<éð—)úÄë5üˆÔUr­y:‹=~Ùo-ÕSâ+6I©æSá¯+´“§«…¡µF`uÊZ==¾bkqÎ 7úkqpºL=“ðŸÅÖ '$5Ò¯ÛXÎ1“
+uÚV™„úÍfÏ$ð#¶ú„xÕSâëµ”Å/Fœ¶”ãLºÐ6†’ù÷ì„'ö”ùRë~±÷ÿ(‚ð³‚3ʘB~½á“gõS¨ØýŠS[¨þœ/”¤…2Ä)‰¿"Òñ‡lüðƒWøEcàê©þ_ì¶Aendstream
endobj
-1289 0 obj <<
+1670 0 obj <<
/Type /Page
-/Contents 1290 0 R
-/Resources 1288 0 R
+/Contents 1671 0 R
+/Resources 1669 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1675 0 R
>> endobj
-1291 0 obj <<
-/D [1289 0 R /XYZ 85.0394 794.5015 null]
+1672 0 obj <<
+/D [1670 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1292 0 obj <<
-/D [1289 0 R /XYZ 85.0394 625.316 null]
+466 0 obj <<
+/D [1670 0 R /XYZ 56.6929 636.8504 null]
>> endobj
-1293 0 obj <<
-/D [1289 0 R /XYZ 85.0394 613.3608 null]
+1361 0 obj <<
+/D [1670 0 R /XYZ 56.6929 609.3387 null]
>> endobj
-1288 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F39 899 0 R >>
+1673 0 obj <<
+/D [1670 0 R /XYZ 56.6929 172.736 null]
+>> endobj
+1674 0 obj <<
+/D [1670 0 R /XYZ 56.6929 160.7808 null]
+>> endobj
+1669 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1296 0 obj <<
-/Length 3798
-/Filter /FlateDecode
->>
-stream
-xÚ­]sÛ6òÝ¿Bo•g"Ÿ8÷”&N΋sg»3½iû@S´Í‰,*"×÷ëo Pü’äN;™1A`¹»Xì71ãðOÌLÂ’T¦3›jf¸0³üéŒÏ`íÓ™0‹´èBýx{öö£²³”¥‰Lf·÷\ŽqçÄìvùë<a’>ÿåêã姟¯ß[=¿½üru¾†Ï?^þë‚FŸ®ß}þüîú|!œó÷ÿ|÷ïÛ‹kZJŽ/¯>ÐLJH¯/>^\_\½¿8ÿýö§³‹Ûv/Ýý
-®p#ßÎ~ýÏ–°íŸÎ8S©3³gxáL¤©œ=i£˜ÑJÅ™ÕÙÍÙZ„Uÿé”ü´qÌHÌJ3ô§¥,˜€¬IY¢¤j¥,Å””#Jy]5åýËp³N3•87ë"‘@de‡¬K™‚£ï“½¼G’o?jלIcSÀŽ /EM0=lR0#Œ 0¿qÛÇâ|¡àˆ—Å}¶[50'ÞÀŒ³óW700éüêËíåÇÿØSQ×Ù ÷+Ùö\¸yÀPë†FÏÅ:
-NYG‡ËÐOñBÒpê«x,Èâ6Zé ›
-ÏeþHÃ<«?eCÏ
-tc .¦>ÆÍã:}Í¢­£ø]zX\‰e­î´,¢Ó–Éü²¡Ÿ«ÝjICÒjéœÇ\äèÒ·/ôŠÞ —›Ýv>¹Ç“¿Ëeà(ž —aµ ólW{½‡µz•}/ê¹WbºçÞòmV?²Qž’©LÏ}<áê
-&PyñÙB`¨Åçõu]4ôuö•ëº
- Š³øIÈÜ$xÕ˜ûá8¤ôâÕ
-ž´6JHIÙÎ0 `21ð·ó_®/?]^ap¦÷, /›>±z·ÙT¤©ˆ¿"zy”Å<óB’*Zí> ÓŽP¨
-ê×z¦0ˆÑ~o]hoXˆ¢YôNFÙ
--Ž»§.ÔaÿÔBᦶE¾ÛÖèf”S¶\Úã”#ÐåžsâšI§û”ä‡ÆqsÔ9K•tŒ «|©ôj
-ªñýÛ®ðq†”^ÀDÝÔ²~À›¶ X<Q*Ûd?y&•AJ DB,pÚkL.Ó´"’çjû5dËØ°ƒª"2WÒ
-ݲä6yU5JpH\GÑ4ÓɶŒó¥m礛N’ …m b—1ÞÂ`C;ÿŽáŠÊ¨å…4j߬J€ðÎÔÌïý7Õ½=vá%™/³&›
-žÓ´Z
-?µµ#Ú¬CÊrt=ªúºÛÔ¡»)Šzêj²ô€ìÈɨ‚÷E“?.V»©D;¦Eô¥ÙCÆžHG Ðá
-ˆ]Ì~SIß’K`Ï3e$KdêhSUHÀ_Î%Ÿá¥|Ú¬|¿ äöá~Féèèu’Bºx»Âýkç¥à ’”ƒ“Øß¾ü5m‚Œ‹9‡†$ 0)’㎊2`LÉãž±…B‰‚ËX”ËŦªV#ÇÈ!gàÖ̺hÇž1B©«´g‰p ¸Ñù[êÀ‰·}2wš»««UÑLÅ›6É ƒ8ºËVÏÙKÝÖPU¥Zx9; /?„¹Nö€ÐEs0^IKEÇÑcé
-lÙ:— z–á:'£¤YøÅ"Ü×ÁÌ]V—áèî%Ü !Õû—ÝqP­ÙéÔvØ#˜ `œ1Æu¯™&:ÓŽAš.Ntƒ5XŸvZ±Çä¯ÈRŒÀu¼îpˆ‰-uËÁ‹ki½Oߊ5vžåØŠ¥fDrðÂÀ;èXì—9}D§´K+¦S©»m~»Öø]Ð) ¸Ü=mhäôF­…–ˆõ7_«‚&÷½z'‡zÜ’C¬å"íÈ´ø&*/x‰éz*Õ¦×I›^Oe%RùÄÙœ¸œmÓ„.üÄ•ùkïj–~Ö _Ï
-¼L­íñ3ö7êcl“™Yë`Aೌã¶uÄÅF¨6ðýØ’hDî8á4&Ü‹yi‚7/¢O˜Bž²û«·s‡C^*™Ý—¤Ö·c”ãÔ²DëÂßYºÁ粬³;Tu|¹üåãu9£Ç&Û‚ïVÙ–‚óP<À«¿á´ñ÷ ØñÕBøŸ²Ð[†t
-ûÜl«ïårVC벶Ìàš-4A‡¿3€šUƒÓ‚Ê}êG|Ñ…Ÿø½Áë„]I&Üp~,I„é±3Ò´êcl¼hTÌ÷øH lhþj±´ð§8á F35JË…÷ OH¥…:ÁÃÛQg>sRŸh?t¡;›jJ‰ûýH ØõQê-Ôù~Á Ú˜@1Ø£ß*@³/¯ë|[vÌ¥ºŸ0Äü–ÔÊ“}ª24?ˆ@ Mo£Çì/ŸØòïk-P &l÷¬&-0B`cŒí¸®)É ‡ü縮u ŽèZ„¢n°¿}˜Ö5õ$@§ÞBMïëšfÖ[W—þߣkÃ] u ¼°yX׬
-ÃcNœ{ u‚1¶ãºÆA5]bNèZꈮE(¤Øl‹¬YäTeõ¢Þdùødž2…4(ÇÙh¡&øè)ÒÌHnúŒ„>‚û
-0…çÕ-=ýÖàùáË žüíݺùe
+1678 0 obj <<
+/Length 3726
+/Filter /FlateDecode
+>>
+stream
+xÚ­ZÝsã¶÷_á·È3' LŸ.ßÕž¯ñ9ÓI“<ÐeqŽ"‘:û×w @¤DÉÉ´ãñÀûõÛ%Å5‡?qm4ãÊ&×™M˜æB_ë+~ý c®„§™¢ùêûÇ«¿¼WÙµe6•éõãr°–aÜqý¸øeöîooÿùxûp3—šÏRv3×)Ÿ}wÿõXúy÷éþý݇ŸÞÞdÉìñîÓ=u?ܾ¿}¸½w{3F ˜/ý
+g&¼¿ûÇ-µ><¼ýøñíÃÍo¿º}ŒgžWp…ùýê—ßøõŽý÷+Δ5úzœ kåõú*ÑŠéD©ÐS_}¾ú1.8uS§îO
+ˤµÙõ\%̤°Æ€ê„Z!µQpÛÚ²TIo[ÊÁm í$½ÎTIânû¾íK:¿Ê{j5ív×Ô¾ÿôx÷þgjo¶7ÂÌڢ캪y¦¾ª süä|‰D˲èËõ<½à3bÀŒL4KlšÁ E•×»§2--3Yf<;‘g\ƒâdÎdD2­žh>¤¢ûSÚ¨pÇeþ¥œW¿ïÊíËñÞB&RÒÅÍ#ÕÄî#é$Š -Æ»ß5p…Fõ7É̼_›€´ÜÍÃX»é«¶¡Ñ²ÉŸjwï0ÐUë]÷$*xîW%QµO][—NîÐýÃýgjÐ!Eÿ²ñ£w?þ¶¨²ÙÏ7BÀˆ æ·*¨˜äN+˜ÕZ:æ›òk¹%X´¥×“Ázî90Ù6ge›¦–e™’—e;¤:/ÛHåd[öÅjþ\ïÊSÑr˜ššË{Gª‰ÍG¢U oxÜý‘$˜šƒÓlû¼ŒàÂUªH Û_<´@œµ$f¸“«2*õæ28à<å|öR851“2¥Ñ¹9E¾ëœÁ¤1ÀUWnI–ØÙÒoÞ÷åzÓAèt;’J@73ÊŽu‚x‘ÖÌœ/)»vçŨ·hÝΪ§ßEµh¾óíUþÕOٯʆZEÛtýöÆÌv…×zÎ
+Æ­ûôi¶%g‰Œv‡"œØÞB,ÍB,Ý. ©¸™#œS—%™‰w5m \¿¶ž¤‚øVæ‹óF ,Þ|) ©.e rro»~Þõ€Óº¾*N232ir™H5ÁÁØ(Ai–Yp2ºCttPz<†Á_ ¿”åÆ»]AQ~gpDËvë§~%ð M<ì8%E`,†ã—
+˜ÚhYÛ¼ ‹
+NÎ7D½?[÷†žw]9U8€
+œH¨l¶íWÀФ°§VV2Iú:௞D&L¥ /ÛÛ€ê‚Å*gsUS­óz¾õYÆ©wÍ€CÄ—YˆT<ŒƒoÊ bÀwˉ˳€3MúB¹„r¡³tÆ Cn­gбm(Fèt”WuDâ}¬xVX¡ªkšÑ6õ õA&GÓlèHË廹‡é€ñ¬=ªRô«€8® ðžr0%ÆÉ"¦”,*’ÅŽúý•‹ab‹º©ýû®:d@ò+×¼dÏÎÆÐÓÔ峫8ÕWÌ
+Ÿ]† Ô£»‚©‚MÙä!]ç/1¼PÉîk¬ñ•!'Ù.±Ê×ÁR—G^Þϼš¢ŒG‚=(®“ÿCž¡2Î4W¯„¹!Õy³‹TÎìàDßyá²ÆÓ'˜²R_f RMp0:lš2•)3fÁKÌjxЦaÓ« «òCÞÕCˉÓuxÌëÚ°I?ñ:*Y 7Їꉎ×@”ïîß~¼%cÌ(‘˜A uìÔà¤"}­ZªäQ·Ó(è&‚*4B€°f‘û5œ DX£àuüÍ>m”×ûü¥ kl+J½p¤l–­¯#uG»ŽtT¸q…¢ˆŸÚ~5†`ëÀ¶/»@’-#i,Ô,^àf«ÂG« øÌçÏ)²HYª¬}E‘T9P‘uõ˜7ë¯,Z]Þ7RMl<6ÖŒ¥6MÇ;O ÁÄ
+]4¸}¾¦ÆÃP.~>œ0!—“u‘¯Ï¡ž‰¼%LœTç‡Ùš7§Õ¹@õ
+§«y
+ÃÕ‰·"XI¥MÔ‘csù[á0¹RI()&Ñ `ûPZL°nÛôúÇ’¢„b4õó§·Ôøè\kº õ"¨7¢“ÆÏw‡‡_W7<l×ÑC<üÑN§
+CÌ
+G°»½žHŸ1aW”tº(¾ì•ÉÏ„op ›—ß6uUTý—IÆŒäÙŸà2ð&#¿J¾'tŒå¥‹Á#ðR{à¤Mi‚æ‰RØ]¦3êQåœ@TÕI6ÈŽÑMßRb” czÞzÄÁñš\´ŒhX“oöê…EýLÈ ^Ö#¢É”³TêdgΨq1Òe8(Àˆ±—D­§’~]Ù1š±ÇZ80m\XBÄô›¸€2ß4ÓJN°æäR^,þ*wدªbEÍ«,®…ïºð ûv N¦»Ä $ìŠñ$㸪£siìùëJ3ô1‹è¶eJu˜¼owõ‚š>ý2Æ][¹Ä/rzgl [Âp¿Û6~
+U˜ý°am/¬Í¬ò£•ß0¾}„±®”ÚÅÅÖÓ#C*¶y·: »D†…(þJItHuvEªƒÎûvÞµùiA_æssyûH5±ÿ¸l˜@2b`Òz \—Á:ú6|¯%¹ñŸo@£X•ÅlZ¡q0¾Vë¨ÃAdnÙÃïÃCWö4;ÆTDèb"6\Ld~¶ûÞ„â¾K‡ø,_¦ª_£ ï'DA•‡ýtŽ,0pzyȤç>.cãìÿôp÷áîc4=ç~ñªoÖí6›–Ô×oi¿¢m° HÙ—TÁtã²OÊTJ‰’J=ƒ*›aJ¶vï:°ÛǸPðÓ³Ïíº‚’Šv¶j÷¥OÕ}ON3QÓ± K×øòÊÇxt';lú»F¸E¯±xU-
+Ó!mŒÔÎ&ð“4´‰óþ‰
endobj
-1295 0 obj <<
+1677 0 obj <<
/Type /Page
-/Contents 1296 0 R
-/Resources 1294 0 R
+/Contents 1678 0 R
+/Resources 1676 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
-/Annots [ 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R ]
+/Parent 1675 0 R
+/Annots [ 1680 0 R ]
>> endobj
-1298 0 obj <<
+1680 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [154.2681 743.8714 203.5396 755.9311]
+/Rect [182.6146 300.8791 231.8861 312.9387]
/Subtype /Link
/A << /S /GoTo /D (notify) >>
>> endobj
-1299 0 obj <<
+1679 0 obj <<
+/D [1677 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1676 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F39 1151 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1683 0 obj <<
+/Length 3742
+/Filter /FlateDecode
+>>
+stream
+xÚ­]sã¶ñÝ¿Bo¥gŽñA|tîìÔž¯µi:IhŠ²9G‘ŠHYq}w±
+o¿Ü]†"Ž‚›Û^Sí‡û«ÏŸ¯î/Cnb|üûÕ¿¯ïiH»9¾¿½ûD=)'&½¿¾¹¾¿¾ûx}ùëã?.®ûµ ×Ë#‰ ùíâç_£Å–ý‹ˆÉÔÄ‹=4"ÆÓT,Ö*–,VRúžêâáâßý„ƒQûé,ÿxÄ„Ôb†B h8‹Ó4^$qÊ´Ò20«aI2ŠÕ%7ÁªÈ;lë YQ^•Eíú~Û—<Ø–E ü’‘>fùKY?ä:{£JÛ•UåfÉóÝ–z³Ö•5 ÆA÷RÐ@[l_ ø8þ7÷MYwŶÎ*j5›b›ueSÀv´»ü7¸rÎÒ8´´–vëîËãíÍ©ž-—[Ä[´n°jš¯»]‚‡¢ppUÛàœÀB>`!ך¥F(@…VE—¿„Ïð…`‡ìV†)n¸Ížš×‚Mä…³„s½H8Ì+sb (BÑöò9ýðPˆv»Ê…ŒLؽm
+~Œó„E\Ëóè{¨üÃõr¼O=&à¡è:+"2J`ËÖÕw•Ì Kt;Ž½í WEú Ø[Ià ól×KAâé%É!´e[ÔKªÝ=PIò7¶\¶ôiV5žè}Ù½Œ&N‚‡/W6þÖ
+aÈ…f\%éXWÍ–$«.žAx_½œÕí¾Øzñ{|qÝËb•íªŽe;Ã+JœðÔ‹WÝÌðÊã'‰ðy{ ÁŒ0ú[¬•4Öøšyk¡Œ0éøô\ô]s¹ªÿb<Uè© uÄ™ ê©ë9 V-a kb¡!1è¦]ëÝ€±VÜr#b±ìU÷Ëe¨yðÿE01ãléBó˜)­¢^ü¶à,Ri* hP·k=ðÀv|w»‹O ¬h1\”›8Îl¥Çª$ÁB+¹ÐB€AÆÙE5(‰ Þ.E®Q®7U±],]GM¥sfPK'[¯tÊ„IÍbÈÜ?·_6B§àóƒ«úsÒŠ”ƒŠ$À0$<9oãD³(æéyëØC!GÁd„å2Ü4M5±‘aI”Ä‹á´SÛ衦Øe:ÒDØP\èý£5‡¨âÍýY¯îÔ÷Ô6UÑ͹`›ŠµéÛIð’Uûì­õõªÉ³®pMðäÛ7ªÞ~r}+kÄšµû€
+dÍI¯«˜ÉHèwöe
+ö/eþBß¹  Xîà<°ÞP6dM
+–äI¶{IŸÎ
+n·6„8Äûý"¶„nÞéÀª¤Œ ä$¸Ùˆ7”‡G)S2±‘·Ïέß­‹‡‡ÌX—ɼ烯0œM¢s¡$ÈØ›!‚‰•ë¡Þ¡c:ÛlLè­¶J 8¬÷$C¨Ó¦½‡ê]îïàkŽ§îÅÜœG즈GÞ6ÕéI>FLÎV&iïl±Þ÷v¶©`’­NôñDÁ[³£ êÂ
+5Ô¬ôC¹,ÛìÉJ=4nº¹gTl²-ˆò®Ê¶4akØtl&žŒ<G ʨ8‡–›Ö)"Ç‘“²†cÇ:;ˆš/çÎĹun¶Ík¹<ìÕ±‚:£¼M…/õDáЬbA§ãLnøŒfyðp?#ÐdzÎè•`ÜS#Áúƒu‹GäL$­‡z‡Šélßjp¤6,VÑ7³¥‡¢É¼Æ(&'8@ñWz¨wh˜ÎvÞØÈõR¾clPgŒ‡šâqò ³½>‹½‡šA?öð NŸ#ü½
+oAŒ$¦ÂØ*Ë˪Ä3-µ«&[Ò Ì`ou “NñX£#”Cm7I¡âǻ۟¹oph[/YèѽÐþÀB(CPP빨ñ–†dÁå. ;såÝ#•viP~úò@•µ½R*ì“ n¸!¤¨|j0+5G%ÔNí?O(Ùùû_Ïì?ìªéS[ÎÒ¯ç;·„øIÌàØ•þA)¯d(…Ñ:\.B2påGLJºØWeís†Y¿½Ç¹Å</6°Óü•ÆòÈÍe7ËçšnMŠåi[
+‡£Óô[:€:cK=”½Œ[.K$)«ÂÕ¶Y‡Ù®{ùÐ_Ž†rlj™1¸¥DšóöP3$ŽO2–ù|L£O¥Êñ¯¥FÞÔdL¤ÒeYRL ½d¯¥=1âG+*Qãl kl¶hðò‰F°(ÆHo¸ëÞ+YŸ¢ÆwUÖà
+\Ó‡£‘¡<Ø•0ÚoòQ¤j;{ãA76‰ ý.mOÅœ`XVQš;¥$5.7j»|>Ý /< „RóæHUìhŸj7ξAßð{ã“üi`-ø/Çä¿ ¯mÖn´-»]æÄ>³1M]vùøî†`¾Üb&ÉÞ&Hzî
+q#g´
+¼›Ý^k³ÿ€ªIŸhÌwÛ–>˜d)œœØø±â°{å‡(iÛÅàQÅ€‡ÓeϧH˜´Ž“£pø >ÃókÕ<ÞÂì³mM±4Ö`ÿ²çbV˜ÎqCf¸ö'‚ùã&DºâÔK‚„qÝÛÇ,‡h’xÀ•U^ ¡B,SÂÅÖƒ‘¶ÎÕ~:RLå™tóÄ“g3…—®3'á¨
+ï<Uö­¸˜&ÜËéâÿ ëpendstream
+endobj
+1682 0 obj <<
+/Type /Page
+/Contents 1683 0 R
+/Resources 1681 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1675 0 R
+/Annots [ 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R ]
+>> endobj
+1685 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [80.6033 237.2629 144.294 246.4782]
+/Rect [180.4479 508.2615 244.1386 517.691]
/Subtype /Link
/A << /S /GoTo /D (statsfile) >>
>> endobj
-1300 0 obj <<
+1686 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [265.4578 191.3384 326.6578 203.3981]
+/Rect [265.4578 462.9269 326.6578 474.9865]
/Subtype /Link
/A << /S /GoTo /D (server_statement_definition_and_usage) >>
>> endobj
-1301 0 obj <<
+1687 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [367.5441 191.3384 416.2908 203.3981]
+/Rect [367.5441 462.9269 416.2908 474.9865]
/Subtype /Link
/A << /S /GoTo /D (incremental_zone_transfers) >>
>> endobj
-1302 0 obj <<
+1688 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [280.9692 160.0192 342.1692 172.0789]
+/Rect [280.9692 432.1776 342.1692 444.2372]
/Subtype /Link
/A << /S /GoTo /D (server_statement_definition_and_usage) >>
>> endobj
-1303 0 obj <<
+1689 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [277.6219 128.7 338.8219 140.7596]
+/Rect [277.6219 401.4283 338.8219 413.4879]
/Subtype /Link
/A << /S /GoTo /D (server_statement_definition_and_usage) >>
>> endobj
-1297 0 obj <<
-/D [1295 0 R /XYZ 56.6929 794.5015 null]
+1684 0 obj <<
+/D [1682 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1294 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F62 1062 0 R /F39 899 0 R /F14 740 0 R >>
-/XObject << /Im2 1051 0 R >>
+1681 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F62 1352 0 R /F39 1151 0 R /F14 956 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1307 0 obj <<
-/Length 3849
-/Filter /FlateDecode
->>
-stream
-xÚ¥Ërã6òî¯ðm媈!
-“Ûæ×0ÔƒßÇ«Cãt(±ôà™¾º™
-ÈŽ4§Äã!ç€w<ÖÏ ?Wµ,°±K’dÖ5Q˜#…øÍVCG|Cì À‘_A±Ç¹®Ð(²¢“ÑFŸÎÏ„`
-.Å$Éê¶îZ”Nð…ÅS[mY4w… J$Ûb4ôwpÜY“»Ëô\¸3å„ FD^Ö-‘ÀáÈ_gkq¸=Ú“ \²ç/Ƕë*Û?Ž¶édˆ®êÚ›é…kpšËÕµõ“èÛyO;c«ê­h%
-Ö¹ê¬W=úYž*¾+€TÍTíg•û¢ìKöú=
- p¶âp$y×!èÅ¡ZE«ˆÍ¢ûÒqk×Þ¨•ÌF‡ßþÃ_‘ìÖ ®µs[íÛ®Û> ´1Ašå©Øí]ÛBTP‚¿´óY$‰É_('ÁÅ]ˆ¸ïKZöÁበXm•âù•ýªu´@k䙊dg<t†+ò÷PTµ'½±ýéÊ(SG;îBôëUÓžE]·CwºR‘šŽóS ýÈ­Làó…«[øc‡=ѪKÖkp«©óª3ú…9q¤1„–3]\>¬Ž×"º¨"`ø^0@ȦÂ÷lëÙ
- ‚¾4í¹˜}"“ PpÃ#Ú EõY–ñf:MÛs£òsdd*T@“°gølûMÚä‹S£=1,®Ì"áT&ÓFXÑ´K’:‚|…Q¶U‡^§ã ÄÖÁêcœ‰p1ÎnêˈkæíRØ 'èÔºjVF˜Ù
-+š›!6d DÈ l`Û2Æ+•˜0’:î8=·=Q>‹·™„ÐBƒdô¶!QÁÑ¡óãøÛ`˜ìšCâ(ÑÆìFÊÍ<òð³ÌꩲçIŒ;9ümßÛñÇ#꘭ºN8r%ÀÞüÐK¡Pa¤Æ¼-˜…ys®Pàeõ<©lx´eµ{y]ؚΚžl9œ:Žø`‘ÅM!LáâçŠ ÈeAÌÆ-ùÚæ¥l€ê±i½
-2D‘2d^zꋹÂFÝ>
-Dbqj8X€ÎÌ_ñh…éó[܈² S‰K –Nuõ+·¡Ò@%ÊÙÇ¢„p²æàXOU6rj fY¤%¸žŒÌvë©q˱bF¢˜ Ȭ›œU$q§šÈ
-kd]ûe8¢Å§¡¼ ”å[²â brR` ŒÈIRâË`“ƒžR.C•¬>tÂú‰5ûì‰Óã„ã^I©–Ôƒ‘4Š“ÆP{𼌥]V3ÃBÆog™PÌGb týnX–0ÎmÉÓ°ëiŠƒøO¤’€<P³ªPõž,8BßÇ÷ ÐBfÉšèØ
-çÂ:ÙÏù´…ÔÝ»?¡éhÿàWlž'Ôm—˜ŽÖÍ¢ÉÈ|NìycŽ´CÌ_ \†ã¹ðQùÐ;{:5ÅO
-%¹;B¦¿cdN„ÈOœÀkî$áÈÅóQ'3ÊÒ©l†ÐvæBŒÈ ¶º¶ü‚™LÏ]©§ÊûH®– ÏxIT{‹²Ø…oaƇÞr{&V&ô²‡c(V2cºÇ†'å«ÐCÎ9ÌŸB6®øÝUÍcBk
-ß·gûÄqåWKÞ$Oƒ$2.ÈF¼]ôo^Š xÍ+VÕ¼À»ànb†]ͬ‘¢8G)…®Q!&¤b™]Õm "ÝR£p±#ä
-s¶"1Ä‘‚˜<èä”ÈsH±«ÔãÈtñÍ3à S #x«y
-.a\N(αºÉ±xHF@‡XÔ…Å˵v˹žOIµ7ùˆÆZf!ã:rä=!eQ—C]ôÎP~õƒ>³#_bÌA{IÖ,NcÖÑWPdͱ|”³g^0”uûøÈojR"Œ\‰0Š‰ÿèø_Pl®ŽAÇÝ ¶%”ŒbçUÆ"|!m­,Q²ÁFÖ§Ë9T}ï( Gß-¤+ûI[d‰Ž'Ýr´éŒÚ…HÌ tS‘Xôàß`IJè_†±÷rU/hz"ht[þnd˜Nq¾Û(ÀÛg°ñUÉhô,…Á”ñÏs¨SÎÖ¢f`ö¤i½Äˆsµ¥ 54ô”ƒ_NhøÇÊK}hƳâÍêÝÇŸd…F {h)3„6DÝp²ö‰œáêI”äô‰ô †²ïuR¥Xç^z(b?¤Yñ°á;ì”4GÚß°D9汶=Wb3ª
-½ØÀ¶Øhzœ<©ÆzÜz®Ì´-Õ
-fH\óô$™e¥D2: 6fã·Ý,àëª?-‡{l£8“ÆŒBCŽ›ªq!¥›8®(ˆøë TºèRØ;¾º{ '™¥Çô»å¨|áLZÞE\FæßêíáØžŠSåªZ¨b%YA®k²„M§ì[÷8Æî^]ÔqÉkW1냅
-±wÞˆjžB2È×¥µ•Wa|0ŠÔÅ{Ä…UBÊSŒ»Ë=Xiú=äÄ‹ÕüUfœü½òË‚Ý Œò¯X¯¥‘ø[ƒX_¼u™\aKSy‡JSÇòÔY’_úNUá& ‡ ñÚíqL6°M÷‹ s‡Ðä%d­ÀV†ñø²Ã®‘~òò|:cèöÞ8`”Eî€åpr×á<оè.³^Ñ;¯¡ ¿¿BfôæÛ¥£¯ý¾Õ@êh)ôKüß¿}¥É2½¬’&„쌽#
- ÒKÊc÷üÐéÿÝÁ’endstream
+1693 0 obj <<
+/Length 3806
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Ërã6òî¯ðm媈K
+Bã…1R]}¹úÏ°àd”¦®ñ/4‰&:^a Ö*ÚAt‡©mˆEÖe7[g®šæ©?¶Ð ÓÍCß14«Ú†[ç½­y1Ëú‘Áý‘ÝÞÊŒº=Û2˜™ts¿/[*eõ¾í³ªzaà0±°myºQÉÆB„ÝgÏes’ɵ[¹Gß*å¥a¨éYßí›SÙe]ùl·M«ãEµöô ÔPNÀës—6ÆFÞœžwµm[6»%V–ï‘2l3×°U
+:P%ý¶·Þ@aâÜ Rø ñO«`ƒS•ÙÔÙÁ2`  ´ Àê¦Þ
+Uý©…Cщ
+›3Þ#`Á{2KSƒ';Ä?úÑÜ"”mÉÔä šªÇ›™‘”ƒ¡ô.ÜŸïù!xf°úž¯ýxÝÝ ÒvŠÅÞJ­¸û sȺ|¿=dÇ£-¶ 1' .aA†ö}/J‚ôm:¬B¦‚¦ýЋ¢ÈÌ)¹Û±LÉ”f/ ý@ú… [:áØKN%P“b’kHØÀ÷îÓs çD@Š€HPàØ|/-Dn‰ØãzaØú©*ÛŽäo«´†ÈÁ„sekç„ÜwZn…UJZCÑ‚ñ"‰#«îqÔ•æè¤ Î– °RHðŠ>gM­<7§'FgqoúZ02þ<ÙSm+§¸%c§d~I9rš´µ½Q›|
+¼ î&fX¢¼º‘¢8G)…®Q>pÊYæÖ.ƒH·Ô(ÜcìX”mÞô§ìÔ+&5 ´gT¾mR§X¯›Ô ŽŽ±ê80ÞfðÁó®fA‡
+QWMô6!Ö
+%3+/ÀöÎH`ôÈ%h3 ‡cz€dÏ )œ`—lIâ­”ç¸õ j:–Ù œÀîÚh4-̸ŽS/H#gÈ·[[ãnÛ]‰ŒÚ²Å4F{iš…ÁߊØéÈK “‡Ó¥ÁÆ}ÙBC^0x-=«GÁ8ç8ddÜ S•5†™DHwƒè¼øù¬ +ˆd'á»·Õq±›r$gŒ)±'Ö; q :µ;ÈÒä¡oò£ÍÞK¤€Çò™M)´Z<73<H4Â÷»_'¯Jp?2Ú×û/èÀˆì­l ¢e”‰‘<Y‘Ï:ÛÿŽÔ×vÞš {êûr`ºà/A¸‹@G¶³
+–(W£™ã¤ì4˜‰HEl&p´°»¬¯ºa³KI4*
+¤h¬Ïº‡¦¼Î«¾°b†B ÅÓxn‡€_nßÃe'ñÃŽ¬ŠçÓiäâlÎ(d†Æ;øã–Sî1¥B¼!‚Na+Kv&–z,dÃ*|4ÎZ;·ƒŽwlqùã±*—q$k—f¦tLÆhå¡èT,2»±ð5+ˆ­¬°„¿"ŸqªŒ\æÃÉfOÛ¢˯i„òâ!Ë×\T?e„ßغà7~cgà7¤úþd )D"“AíRV`_™~&›wmûÇGÛvõnå…Z/|79¯HÉ]J‡j à`ô=Ùv†¨LSéB`LQ¹có/K=XÎûç{ ² @ 7»&o*)QÈŽc8s
+àNÞ­%!Ä9t…o¦ZÑæ`ó}V—-…µ!ø5Ã-'s“4}ËmÙ€(52„µ5ì°Ð†NÉÿ[n‰¢Áॢ 3IEKYY¬dK_k¸Ì5=™ÔHI«ô¤œ
+m‰õ õи–x³é!Ò„’Oê`TèÀe€Ð @Ð!¾áz¢t@´Ó;€
+=+ÄKR6Of—âƒ+Ì–¹´«TN¶°uéü«ã´¿Æi_‰±d'¥s ÎL““ ‰È·…@EÓ Ñ íXIt`¶sÅ´˜¨–Šð\ɲuµ©æ@¬ˆ_ÌQËCâ ¤‹ïxÎà±VI'Y¹…I˜Ë× -Ž¤$C, v2Ђ¡¡ãÈÙé4.u€tOðE}P[®)]Sšáô- ]¼Ž¢Í$®fp#Á“Ð(ßÛüiQî[–UËñ…+%jð›€zI½šúMø¸C+ Ê¥¾Å1Îp)hUoWWÇÂjš¾6ݽy,öMNp%¶NÊÒKÛ¹bû†G­YõÔ¶NoFV¾­z´å³»—™r¿šüƒÛðT¬ÞÎý'H¯§þ ZþÉ1 ×Û °ÐÙÙ“­óËšª‚},~¾EË€tIÌ,šj_ψùex$˜§â)ÖøÍ›Á±V­…s˜JHfÂd|í
+é2„€s£(ÐòKUÃL4•Œ–G2`ò ?’P"Ï!U¨( Æ‘éâÐ L°Ð~BÍ[aÚDoJ0.'W{ä*›‹‡äÈDTLqúµ¸rXŸ8ÒÓ)éRí3éˆÆÑŽ}.AÝxHÈI\Ê€åÖ*ï+ÈöÎЖj›Ðgv¤›Q†ù­.§"f‡’s¯£ÈšCäÉÄ­¾2W „‘¨ºAÀ¶*pµ” $6þ£eà›ëƒÜqw‚myA
+_3®
+ö\Ρì:GSø͹n¹<n³ƒìƒ"ÑòĬ]dréøB$È"Ažc"«>á[ªÊ…ìo8V€Þ媃 é‰ µÒmøû Ã\gÆ)®dŒmàâ¢ò2g4\r;”+)†“â!h†pf?€4m×.õ\ô0íN–}ydžýóh9+õùeÃÙ2)‡›ÍûO?Ë
+µ@öÐЃ0´!Œlûƒµ²Oà ÿh"ˆÀà &hZW¢ì: >¬Ü½ªxšªNgn Š‡®Ek~Ñà K5ä")&\ìǫ́*7dÅJã:œ¤¿®¹2Ó¶ôéíH’YWJD £³"»î½f7{çiË¿,¿ò°’ñä©HhHᡬÝK’›8®(ˆpÄʽ%¹G%ao:°p°pò <`»¿BIWÎ$›]k=›Sv*‡(T,'+ÈyKØtÊ^Èæî^ÝcÃ’×î‡2\] eÿÛ˜aá›ÓÄ3c%HŠƒi,Xíʆa©yèJž¢— ã™4Š&N¥rÁƒJŠì$WkóÚ7‹ãWÐU"¡%ÞAl`ZîTOUÒ>ïK²îi<y \¶ÈxzóÛÿjÆÆ^»Rn·(¹J dœfÕZñ3I½X 7ô:¿µ—êÈmØœÖØ­¼$
+ƒ¿cwèÅƸˆŽ,ø¼:…ù6ýÚiò²v·HJfœúÅåÀTN5Š†“j£ÌÛQôéõ(Ú!Ç`Ër;òm4Æ‹’$ysëérïYÐ$^ûj¶ùýP–~`i„Y)BÉ ´^šžqäá Zx€cåzt–‘XtТñG Þ`âܯš²xÓÊb;2|‘Þ°Ò¯ƒÅ ìÒ,!å1ÞùÌ4U€RõJ}2»‹¾îg+vÇ3*2ó| ª‡C:"e˜Ø½wŘ_<rCX;KS¥¬ÌÜ„þð@|v3G³ lÓýâÂüþEhò È­[é‡ñâ5îŒqåÊãO
+!D!á‘YR>ü<÷’ôÿÚßÌtendstream
endobj
-1306 0 obj <<
+1692 0 obj <<
/Type /Page
-/Contents 1307 0 R
-/Resources 1305 0 R
+/Contents 1693 0 R
+/Resources 1691 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1675 0 R
>> endobj
-1308 0 obj <<
-/D [1306 0 R /XYZ 85.0394 794.5015 null]
+1694 0 obj <<
+/D [1692 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1305 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F41 939 0 R >>
+1691 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1311 0 obj <<
-/Length 3367
-/Filter /FlateDecode
->>
-stream
-xÚÅZÝsÛ6÷_áGy&B‰/|t§çN㤶{×™¶ŒDٜȤ*RqÜ¿þv± Š” )¹væâ™\,°‹ÅûRž'ð'Ïm*Ò\åçYn„M¤=Ÿ=%çÐ÷Ùdži`š¹¾¿?ûî­ÎÎs‘§*=¿_ ær"qNžßÏ›¤B‰ ˜!™¼~óöú‡_n//23¹¿~s1U6™¼½þéŠZ?Ü^¾{wy{1•ÎÊÉë]~¸¿º¥®”çøþúæ Qrú90éíÕÛ«Û«›×WÜÿxvu߯e¸^™h\ÈŸg¿ý‘œÏaÙ?ž%BçΞ?ÃC"dž«ó§3cµ°Fë@YžÝýÜO8èõCcö3Ö «L
-–ÔB¥RÇ­,E&%0eF
-eÕ[Yɘ•Zy^·m9›–uñqYî®YªD¸L†ÄÄ÷\ùj _*+œÕj¬ÀIž*§&onîî®^S»Ý¬Vͺ£‡ªFÕvÖ#•&»&~¢ºx*çÌ6«‘ç
-=WD‡ÑrÉyë) ­uÖCÛ­üsÕ :ý
-°ì¢ÚfrrÓtedJ
-þ¹)×/ËæaWpž‰Ôºü¸àÀ<Ú£D‰3‘ä»U9
-ÌfŸiÎÑ)åœöm”1oÚâá&m
-<𙚼… ö±%PÞ¦–!ˈ"’\ýÕÔ>}ÏÂaÊ!©U,Ú8Å“ .kQTËXð³Âärj˜;®º‚Ó–gµ]B‹%fò¢Ôýƒš?ë:&<²Qͽ¢nŸËuËàK¡:ÎíŽOƒ}Ò<#¿ÅàáhŸØ$Zc*(ÿ\ÈÆ׌Ә+÷e|pZ0ÜÍOG°ÔÜúGÈ”šut+r•y6tç0iÎ5ÁÂÏ"Š= ÊNØÄM6þªTOÞš@^–Å’hMÛñùÆï þ„øò$ò<
-îGNƆ‡±ïöík"Ã6ñÈš¹KOœ’,”'jæÕt|*[£Ý8RÑ4Р±j22ÉŽoß­} vÆ› .~V«%¹ŽÌ·Í4û 4ϵwr@ Ž© ú½|E]—ð(äsôîW"0PÙ!aB‘:9¹îˆ‹+/¸UC³Æ«á7>¨<2TðÚ*³A9lŸY;¹}C×_øß%‘|x‡ß›»WÔ¸{É­w¿rƒöûn/¬ü›ö×£õëñcüzT–âz.ä„–„Ï>ó=­UÄK¸Ç[>³'šˆÏ˜62JM˜¼qØDÛP«ªçæ.óÀ\tÜ~yÖb(*–'X6ͧ͊%,F¼álÑzš]"Pg~,zë9'kgw×7ÓË7onÅå퇋\y¨yò‡t—ä:w]ßÜ£W:˜Ne ÷s4rN§z®í‘{ú²WHäÂYÈyŽ
-LÁãB€û]F’_£d´€”VŸLGÇø!À´,Ö-h†Œ‹~"&ôsýçsÎjü)y¸¥ÐÃ( 9 ×ý½É8]¶‰È·×›_.AÚ{¿TŠ‘P‰i·›¡­š¶­úÒós±Ü”Œ±àØ#ÑR
-ÓßžÊ;2A00¡ŸˆÄTˆ_6ÓÿC˜‹ÁVgNäRGí€é0hÓ³ÏÕr>+Öû÷/*ªÆc²Ͼ쑽´„íQz$œ
-
-úA‡¦>|p%L˜»¯´†\GŽnàڞݪîÊØÝ—ýà ÅybËLùãã›åR=VàC¹ÛzT%èj=ž!ãiŠ9Ñ ÔÚjéY¼ê-uùs¿BØ „»Æ^8¶£dH\€êcüò¹}²FG؉ԥ.Z:mÓ(¼‡„<­_þËaŒ#‚÷’šTãKŸüqdtvÊŠuP[ËMI#ödD§(¿T-%Hk,I°¶éè6o÷4÷¬C•¥KÉ\.csa›Ûu?ÁŽ¦^¾PwUOyO<,¥pÂÞgAŸß*ï¿¡-¶ò›M7mý4Ù`šHz¸ic!¢o"¥ÞfN½D?ë¾Ópþí•8 |-˜¶J"'xI£’ÈÞa'¯ºÃrø±\6ÏDíš3.ˆÀ‹ƒÖÖ(‰z¶FÁ£xØâk6©óý\9¤/Áˆü$ì
-¯"Ò"K•þ¶
-Êt€é:Î!ö:÷qDÆUßM¸B‰ ‘÷peånÞþÿƹ²Ù \ ¸Žà*p pe.&ü{ïqœ è{T|Ï‘?~£Eâ ^ŒøíºI'+J©ð0Ù(ë3œ´¯¨ïÉ RuÓû †õx29 ûˆ2ÃP\
+1697 0 obj <<
+/Length 3567
+/Filter /FlateDecode
+>>
+stream
+xÚÅZÝsÛ6÷_áGy&BñMðÑMœž;'g»wiûÀH”­‰Dº"Çýëo ðC‚¤xz3Ï„àb],~ûˆâœÃŸ87–Ù\æçY®™áÂœÏÖgüüú~:g™¦C®ïÏ~x¯²óœåVÚóûÅ`.Ǹsâü~þÛÄ2É.`>yûñæýõO¿Ü^^dzrýñæb* Ÿ¼¿þçµ~º½üðáòöb*œ“·ÿ¸ütuK]6ÌñãõÍ;¢äô80éíÕû«Û«›·WÜÿ|vuß­e¸^Á.äϳßþàçsXöÏgœ©Ü™ógxáLä¹<_Ÿi£˜ÑJEÊêìîì_Ý„ƒ^?4e?m3R[°¤b™i# – <™æ,s¼72 H9r¡‘çUÓ”³iYŸWåî’…äÌeb0$%¾ãJÈ—ùB挒c®HòT:9ywswwõ–ÚÍöé©Þ´ô²¬Pµõ©™æ`Vî'ªŠu9lC±Š³<´ As;ù¥Z•M$•AJ[ÓpííaÆä* )›„‘±\É(âMBWÃT–ŸRT1Ç¥\ŸËÇâkT,Âs¹Ï ñ¼ŽUÝâ”çS%%LM…`¹1ÒÏÕÛ
+êíB
+¡2sî¸WBÑ’-ØÅr1VäÒk€QUL¼rŸ4ˇªhšbz~,+êýZn–‹Âtô Hì ĤÕ²ßCìíý^’{U<³âóAßM\îʶõŠ!JÚG@¡U?… ŠÔT,È¡©»œt0sh©b’[•¾xÚ÷™³ÌºÓ•˜v:BõëvU•›P¥’ŠþIf|Z/ô^´m1ûÒD­É
+þ¹-7/«úaWpž1k\~\pdJí'—Ìjˆ¤#ÉwOå Àë×!yaƒI*'ˆš=Ю½y¬·«9uø¼Ž´¶Ø´å¼›%UI ELÎÅéSŽë>\mÚÆçe‹i'eÓÖF˜ ¹31ˆW¦+l=rAY¬ºi `ˆiH9à$Fíæœ%f
+’ÒLÊ?·>ŒKK c$1ê¤t
+‘Ç«?5¬–T8­ª4Bá8+é~°ûn„‚4B(Õ’ygüÝ“Ì
+ªõ¦¥NF‡ÆpÅDYíì‘nv¼jõfÙ>®I
+ðràÈ&UKÿE@ãÕo>>¬Åß•x¸ŒÍó+Фâ€óݽ†®VâqL2+L>ÎÜdtük¶!¨ôÀ°¦>ì¾àæ:ß;î¾®#î¹z÷]Vmù
+|*7`[*Ž×ãNu1'ý쇭^KÏâUo¨‹~>å„°?Bw-D àèG‰XäÕg8x¿ÝÁ†\Š g]ò¢aP%*1L|JÉð£¶f:" x/©I7b Š829; UT[«mI#öd$§(¿-›0” ­ðüŽ-Ý}ï±:GëÐ=Œ³d.—s¡?uÿ0uåËU‡_(LÞyxï€v1 úüVùø =h±E”_oÛi½è¦ÉÓ$Ò¶I˜ãBèáÝÿÔKô³î ç¿Ê0ƒ eu®ƒU¸˜à•¦ä‰½Ãΰ~èŽËâçrU?µ­Ÿã‚aqÐêÂÅÀ(ÐÓŒâa›C'T¾®ŒELŒG"_W
+æ õ…{dhÅò\w1ˆq%ž}ÝCÕ`<P
endobj
-1310 0 obj <<
+1696 0 obj <<
/Type /Page
-/Contents 1311 0 R
-/Resources 1309 0 R
+/Contents 1697 0 R
+/Resources 1695 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1282 0 R
+/Parent 1675 0 R
>> endobj
-1312 0 obj <<
-/D [1310 0 R /XYZ 56.6929 794.5015 null]
+1698 0 obj <<
+/D [1696 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1309 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R >>
+1695 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1315 0 obj <<
-/Length 3178
+1701 0 obj <<
+/Length 3339
/Filter /FlateDecode
>>
stream
-xÚ¥ZÝsÛ8Ï_á·Ufj­ø¥Çn›ö²½íöœtnvv÷A¶e[YÊZrr¹¿þ
-à¹&$Ö˜P $¸¿Î¢à
-¹?RìÕ! ]š
-7>q]€ÂmA¾äu†Ü;Ï»rµ£.ã®Ë{ m)@'?š‡²Ï~b~B}ƒª.ÆìVÙÃåóº}öË×Üv<ÑÚðE7* `ËëÞçºŒàž õDN»>Cn)B“ˆìõ=×ÄÎP’qh ¤‹ƒ­)p«LÍcWZÇÍDàitÁ@Ùy 6°9V4b:s€„ð
-KúÒœ?#9¦×e8[ëbù£
-M¬å‰ƒçŸ÷'LDí³u‡©ˆFŠ±<FAÆ(Ù_þ |=×R¸ Ò4Œ£ÌklÄE——U;´á>Èõ}ÂÖ›ÛØQ—a¼í.~ì
-¬7žéû\—£™ç²NŒeÀrG”pÇÀItš¼±»çšØ~øü §£ý‡ÅŸþñMJ˜zú èVf*{¸„–`ø&éßF8[ÆçDâh+
-•P†™÷ù ­Î¯Å)‡Ah{D°‰Ëv.ƒP2Œ´v? X¹'ÞHL¨g‚ˆÈ
-õ˜.ƒc:Ù<=YžA|*ô«;{¦ó­‡
+xÚ­]sã¶ñÝ¿Bo•g"–
+oùO»mu³h›bÑuÕøÔBÇQ–‹lÖ_új‚Ùã@heF‰! ÿ~´5\½óí¹Èæ¶Ûmëò\Ìë»î±Ù–]Ñ•ÏQñ¼¶áÍOkŸšºµ-¡º†o?^âÝ–4Ï[Û1Ù#/xw÷aš5!xD¸àRPQ. žVD¹ÖÄ;m½lÜsE
+t<…eLYÓ“Àé@¯­]veã‰z‚dp¡ôV!‡~îÊ®‹]ÕñÊ-27´4I$Q!bÇãÁz¢,’(OTÆ4Ñ ugJó4Jóܼ®x}ªÓŠ¨&o±,–p±ú™ŒMg¯³¨&ø9KÀ½1d„ÔOäÉY(QëD®æ᎚†o}M#2”Ž0¹Ó7Ä£¾ç´ '~tÚæ0<»'k™ ’5⽬‚TE"‚’—œT€<JEmÝLI_D
+wÜ=­ŠÎ.@äËO‹Oí§‚OÁSˆô Õ ƒÓš82¹ñ@‚WŠ%¤”vò@„“ÁØpô¹¨vŒ7á.5“Ê"£Ó7ìÎD¹’†i¾‚å´ž»{`üÖßß~OÀ}Éû—Ì®=%è“= _ÙÎn7emIe¤4cb9tZÍ~äÜ:Î=6»Š½Ö=îZïÇöä©z°µÝ‚a8ñöæöêCKð¼!y¹àÝvd8ìØšÚ:ƒ;
+ G:Õú/øë¬ç¯3§9GÿÌ7»¶£ ï-= Þ·²…êö -)¡Àqï¥4yMÐV4ZT˜%>nh„¶|Z‚A„’bÙDBÚ‚èËÊŠ™i
+¸ÁÇwÃù” çˆ9Æw7Ãé)ŽóŽ †²A7b‚IŽ«†¸0Åu7^t£ÝÙ“D‘|Â@$e2÷IB½ì%ïe`øB[äœ!@Ì{MrÄqžÀäªËM öWeP”õ
+ý¢\Mߧ¡dl"K»ßu#wRäpq.ÛNC]#i¯šŸŽ¤Ô,Ε8Iaæâó”€zšÜG®¿@1êG±‘é0~AW!•‘Îý%U¥» «õÄb"‰L’¤_dö=Nì«^.-ºpÍ/í\A†(Sùv†({f~201ÃÁig/$°go8ûÕ+ÎÞS!‡Ýö°è–O‹­]omû8Õ®S
+üñ« ª Æí:%ôƒ»ó­KP—C>ü®9ùxäAªŒ|U \)Éœ˜ß½û‰
+)…4â=eH‚›À8'#èÿ£÷e…-µP7†üÕ5ïTšý×Û*Ùj"ÒôÿÑGSie(ÎW5¢OuZ#Ußg`‘m]³(k‚ÇœÈXDª’×Y T¼ô-ã4’ñˆ—‹ªÂÖ‚9ÖþJ‚[9ÔŦ\Žõ@Pí‰Ãݶ¨Û’óvÀ“5í7Â,xò ýPb¸)#¡Ø¹ré¯ôža¶ÈSì‰5`W%—ý™™ß£bgèFe©»Ø#Íš†9—6½\ÚŒzÁ-&¿R’‡¥%QÝ Ôîè}Rã\–e_æeqʱ W<Èb3¥Ð ¬4d[E¡áFXžÓ~*\ñ,KÈ_Ülˆ–R…4@—fHÉQU*Ÿfà¤9G O'»B§,3’-w{õ縘Àõíå;Zy$æTBr*!C–Ð<[^á¨yøæO7ÑÄá|ŸƒÁÞVÕd…zåZ©ï1¤¡5âò´–pȶrm Úéœz)÷ «Ú†0µ]Ú¶-¶^›ÑtQƒý4­ýÓy.ç7?Ò —€½ó¾àrªé|ªà££Jýµ"´,vØGL#í]qÁDÎxàY„YÍöØP_‘µ¥$LÕ_£oR)·Æ®:¢ ^’¹ýü¦e—Tö¦ ×fÄ™ÚøL'kÆ—% ­ §«]sgðA‡;œë]7èpŒu´œo(ˆÛüºA‰a+†S²-ÀôÊî¨nˆº·®ï¨eSÿÇòa*SweÄDšKìEy—Qì LPÜ Å0[îàoÊÄqdâØ»ò±oSÖOÛò¹ðgáv i¸O?!ÓñèóY±D….ï±
+õ*|Ö­¨J
+võ¢ä“"ÒFä¯o¨&v¸{™FZ+5Üšz
+r‰ÐdÏé;Ñ€³±6ƒÖ»ŠF\@Ë}%ˆžã!3
+í«iãCªL¹ÎŸÿdÚ'¥
endobj
-1314 0 obj <<
+1700 0 obj <<
/Type /Page
-/Contents 1315 0 R
-/Resources 1313 0 R
+/Contents 1701 0 R
+/Resources 1699 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
-/Annots [ 1318 0 R 1321 0 R ]
+/Parent 1675 0 R
>> endobj
-1318 0 obj <<
+1702 0 obj <<
+/D [1700 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+470 0 obj <<
+/D [1700 0 R /XYZ 85.0394 227.0652 null]
+>> endobj
+1703 0 obj <<
+/D [1700 0 R /XYZ 85.0394 197.3345 null]
+>> endobj
+1699 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1706 0 obj <<
+/Length 2753
+/Filter /FlateDecode
+>>
+stream
+xÚÍZKsã6¾ûWè¶rÕC<’ÇÉŒ'ëÔffÖã=l%9Ðm³†"Q²×ûë÷k4@ñ%;µIªR®2ÁF£Ñht÷×
+ÏjDYì“L…ŽmæX?TÅ *^®óšyÕ6Ür‹¥®¦&{ÝØ*¦6Ÿk¸i¶yé»nò¶lß ­#ˆ­š§n6¶l4îªæ&¯ºÞ‰~ÍþlêÖjÜꢡœ¾V/›Çb·+7›‚Ô°féÔ=çÇc¾+ gnô5·L|ÊŸ[ì™F8þûoLg³€±-öLyÈwûr}¨ò¿ó‚[ær~"üÃ÷–·´Ž[¶NQ·B„™ÈÚ¥³ :ïóÇb¸>ÎN9§‹©HðŽâÎ$"Aˆ@B/àxxSWÏoi?wmÙšT k2éGÞP¦„bHXoüø?ëfÏÞZ˜ûl¹ÓÅ8Ôµ¡ EÁÅÂDYF1Ì»»7®zAßñ¯ú¦A?•ë‚¾X“û„ü¬„J&
+eø(4É=×kjL¤‘bf«°2E¹T»„k£¤¤´B`¢(Z~8äÕªÝçëo¼†¯ÅîÑ'ÐÑÌp‹Øãäôjm±x.—ëÞyç
+~á´¦5¢ºí±3oì‚…ˆUN9Š(>O6»=÷ÿý©Ù}ëËoõ†ßhnGº©Š­Ÿ…"”ž,._ßç7eURŒ’°ÍÁ«GÉb&î«Î*.šÉßN'ïŸÜ(JðíË/fèÏ Ø!üäÜ„Æ}ÓzY[èVÖ…˜ µ‡Cii^ÆÌ>×iÌì¸h›nWíqëØ©3!í/ª˜fT §AÁCÈ©Mìí¢]Öù6Éžô¡(q9ÿA—·¢ð„máþ|½7S'vÓpoì·Ì‰v΄N·g笱4éÐ1ö»¼nÉ(µÛ ü¤@’R&ÕIæô'Í™H¨LT
+ä-#=@SÛœû··jPo
+¦äpe¦8­A qQ=†Ž{Ïæ£yJÄá½QZæÖ /ïOLÕ²ôÏûœg¢Ä-Ž(ì¶hx3{þ–ŸäHÔÒKçMn©*sÎ^ÇOÓ¼_d:UæýqŒ%±P± C¬¹\Uƒgálí×r¨+Ú·¡ˆw!ÓÌŒ Ð{ˆ ÏÆÃŒíÙ‡b6÷l7EQàli§6'¢|Ýl·Î³è¥báEeX!îæR·JQW&‘õ ¤­õÃWfÆñŸê`Ž®H›à€¶
+ Ê`úáPÉåÓ}¹¾§¦rˆà©]aDt§2Ÿ|üaO¿Ç°¿/ý8G¾`V àÔòŸ'¹(
+ñùIц•Îõ8#âÔ«”¡Nð I­-ª4ä幓¥"K2ŸˆÆÛ1²¡„–:%¶ù3Kçc"µnü|mg× \Uçu›ê µBia‚`§÷tv¤/›Ä3ppä!|†Â ~©¹FVòöBºL2™ V:ìVá芼îųj&(Îm´ìN¡4æÃÁÈÒÚ‰êTŠ$¨f¼¥ð°]ä5Ráí¡¢wÃàæã‡s$n’Ñ‚¼[&ѱÌ-_&Ø”nú
+Úa+$*g«úqØy!¼)*Ÿk•¡÷×ÁŸz†BYº­ŽPwiyÃ>#ÁÊå5þ«åäŠ>µ„¤Gº¥î&zñëBÚ²L3S¯íÖz´#¼½ÜªÅ‡+Zôå¯ú’Ý¢Iz^©´°ØD±6VIÃçGkç“tdX>¯ÖùúàÜvpRËè»@H·ph­Y¿ø+oÈ¥ç±È¤#u8[ôØCå5š5ñ,c3T•.ú{÷ûÜAcŸm! Ž_9~Ÿ³ú ÷Ì]§km^)‰•ÞhýÊ'‘Žk”tW\ï ðH‘3@»¾ä)®x¤6’C †x¤x„fլݥN&ßFtê‹š]àaÏíÂ`=0ÂÏ.¯¹tÖT±~ BK/ç¡iýG8¢S±âJ[â@ÿ†*ãë$Cu'rl½t¾IÊB&¤f— é…Qô,k*‹]W«Û|íN£ž^ì@ü7‡=7è>á(ξ
+,þ³gis×9a®˜ŠÖ'uº k>—×ÅT¾+CAõ­ßPúùß)XçU´§Û×Pb 6lþ£á·¡©'ŽÜ±‘É 
+endobj
+1705 0 obj <<
+/Type /Page
+/Contents 1706 0 R
+/Resources 1704 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1712 0 R
+/Annots [ 1708 0 R 1711 0 R ]
+>> endobj
+1708 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [367.5469 410.6007 428.747 422.5009]
+/Rect [339.2005 701.7636 400.4005 713.6638]
/Subtype /Link
/A << /S /GoTo /D (zone_statement_grammar) >>
>> endobj
-1321 0 obj <<
+1711 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [483.4431 196.7586 539.579 208.8182]
+/Rect [455.0966 503.2689 511.2325 515.3285]
/Subtype /Link
/A << /S /GoTo /D (address_match_lists) >>
>> endobj
-1316 0 obj <<
-/D [1314 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-358 0 obj <<
-/D [1314 0 R /XYZ 85.0394 649.9934 null]
->> endobj
-1317 0 obj <<
-/D [1314 0 R /XYZ 85.0394 622.3077 null]
+1707 0 obj <<
+/D [1705 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-362 0 obj <<
-/D [1314 0 R /XYZ 85.0394 392.0307 null]
+474 0 obj <<
+/D [1705 0 R /XYZ 56.6929 686.5799 null]
>> endobj
-1319 0 obj <<
-/D [1314 0 R /XYZ 85.0394 366.8157 null]
+1709 0 obj <<
+/D [1705 0 R /XYZ 56.6929 663.4862 null]
>> endobj
-366 0 obj <<
-/D [1314 0 R /XYZ 85.0394 245.2415 null]
+478 0 obj <<
+/D [1705 0 R /XYZ 56.6929 548.1865 null]
>> endobj
-1320 0 obj <<
-/D [1314 0 R /XYZ 85.0394 220.1859 null]
+1710 0 obj <<
+/D [1705 0 R /XYZ 56.6929 525.2522 null]
>> endobj
-1313 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1704 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F63 1355 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1326 0 obj <<
-/Length 2907
+1716 0 obj <<
+/Length 3489
/Filter /FlateDecode
>>
stream
-xÚÍËnãFòî¯Ð-20êôûœ&OÖÁÆÉ:ÞS’-Ñ#b$Ò©qœÅþûVu5)’¢d“2FÅêêêêêz6)fþÄÌXfƒ 343\˜Ùr{Ág`ìÛ ‘h-Ñ¢OõõÝÅ—ï•›¬´³»‡/ϸ÷bv·úyn™d—ÀÏ¿ùáæýõ·ÿ¾}{éôüîú‡›Ë…4|þþúŸW}{ûöûïßÞ^.„7bþÍ?ÞþxwuKC6ñøúúæaýœ`z{õþêöê曫Ë_ï¾»¸ºëöÒ߯à
-7òÛÅÏ¿òÙ
-¶ýÝg*x3{‚ÎDr¶½ÐF1£•j1›‹Ÿ.þÕ1ìÆ©SúÓÒ3«¬È3)€Ç+–U>jÑO/Ëá0³ÚêÓ¼h^ lg Y-¼`&3[X§ANºã•r& ÆH<_ï˜tØ(Å8¢àxoPÁ‘00cµ@:Á™QRs¤øáraÅüþ—ó£ãð–8Š™…ÍáqáÙo3Á¸AMŽ;=h "¾¼ÞÊÙ»
-ö3ëo)ñ]ôÇYÕ3X!ìW«™ † "£ÀÙfS]
-3Zü¶Ïw`|þ¼XfËK
-üÁr1”à'<Ì_8—9¢òó§u±\¸©–ÙA7ÏV«Ý¥ðs8ë–p™•  <6W‘jU”Ùî™0ïn~"°Ëº)ª²†€¨¸ß­‹Äi›}l™‰ÏcU/P ^87ËA½;ƒÔuq¿Éß
-~«OùnW¬¢¡Áã iœeÆ@•@ UÑ`Éä]%kÏS¼ZoÎY;Óv4…ŠD×éH«d=¾Á*Èö›DW¤Ã€ÌÁÎôÉðºñSÖ2Hu)Ë •TÓ@ƒ2pò…À(΂Rê¯,4
-Ä`APŒ‰abí”8Nži®}϶•‘Z¨ó€€å„4ÖaÛèÂìòå~WÓá^ƒá„0ZŽ\ ¡â¡[7Ö) !Xy÷TÔ“ùb‘2Îëbbiã™7\½fiÔ|_nЃ—…2†3εæºÃ¾À€¿šÂjð«.UG)€–Ö ˆ“mgk€Š¹úXˆÀ™oõXBY0µ¸)§àÚ_ ·ŒÊµ¡§Ü8BVËwi±¿p甯
-~0Û(£<(ä…@t 9†ÍdšjBŒ)ý¹õ;š#QÈB¬uc{ Û¶ýàÇíŒRûcŠO9¡ºðƒèCøÁ!JL€nà –ê,¤: uÕgž§íÐþtñE±éLV>Õao&,RB !ß-rÂ
-¡¸|mÒäÚœ]šŠ¨=çb ’@èʇDsº?;•ht& Î:›h¢XVM?M)ÒCû`Õ I¥OuÚ_;ª ›J+œLx}^†ŽjBˆaëXÁ ¥º¬ì’‹’]rAì(¹àhL.q,Ým!rì®ÒµîŠå¬æ1Ÿ !—r”ObÝ‘®fà³P–òQ ûÚ|2’äsûûÎ44«ØŸ7‡Õsh©æ°\eÍqŸ#”šPîŸ]½£šX^Ž®“‚wn¸þ¨Ê8\rBÎO±±]ìŽmìF¢x€¬÷÷Ûx¡ð»ç2ÛK" [NÀÒ&Û¯&»Íê&O0^qÕ©¹kÍ,DyÊ ’¥Ð”ÌžWy,
-{u~l+Þ0‡©E‚9(°Ñhp÷!]©Üö­¦¥_ô'LXÍßh5ù²)ZWrL¥‘J2í¥Hsd¹Õ 2H¥¡«EÏéË@óH“›Ó¾+ ‡BwoÏûnŸê´ïvTcß]€8OÙn…†2>'0?ªó‚tT’ÈÑ=¬óým»±Uغ1€7ƇÎá|GÜàƒãCtc
-ßѳñ¸Òèµã­8<“â⻑( ^8T‰thR šN £Céå…¶…üò½ö}ë‘¥nkùÿ@QÈyj›#øß©ÚG1 nšó†Ø·:Er訒°)
-S`’„BÒõÄÐz8“
- õXôÿ@««hendstream
+xÚ­ZMsã6½ûWè¶rUÄà‹
+ÅTåGkQ¹RÌwÝ@¾ñ Pp—ÑFô ;Rfß,û¾ív™éŒ*ªÊÚÉt‡ÞÙ ZíCœ÷ h°̼iû&3;ç
+‚ ã© KsB£uëˆ5èZÖÙµ[€j°ã®Û5¹É„-˜ÿO†KFãj›×Ý!Âô«æ¡>l¼N¿²’åŒ/¡]É0ú¦[Ö›]3ô_ÁSVÒ5úIN1P^0 pz¨í Ê«BTb‚aT¼8 >Îh€–àçB~F©Ôù`¥²ÁhAÈÅ£
+",à²Q*£Æ(U`™ë1ŠG‚™€$cSo½ZQDê{Ô€ Ý{lŸꊡ»¡o9`wEÂj Eî¦ x³Ú
+Œó¦®b,ƒfÈ›Ð<æM¼ˆy.\Þ„ßmý»¿M¢nEϾ+‚Ã=±&ס£õ·úfÿÜì‘V’µ.óIuQÂJJ-Çàý¬tÆ*e’
+c.§O \2ñ¹é“©òâÔD? xUŒñ±)½BèÈÇ”ãB@6@œK9\;å*“rð©‹)Ç©¥Å(失èbrvÄ°¼’\R©óÞ¥2Ë¥à ©¡]Ô!Je”S]ÇùX‹±ËŠ˜Z¤ˆ©{'©ïºÔâî-—ÍÓ@Sw…ÛÞ]‘Ø*æ²
+Í“lâÈ@ø‡¡èNŸ›M&šœÏ*›ÍIVAmÏÁAÂvK”W‚w*uAê‡ÃÓªN÷<ª„$ìåÙ£TfúJ ÎR‰ñüŽQ9† ±{cìv!v£{ÐÙî·í@ío_wõ¶]’À·>Q/-20nO½Ûºßþ°ÚÞó»
+y¢†½Š¨ÌH›äF©k:hYHŽž“ê@ryd¨ÛÍyßUÆBª·WBy*uÞw£ÔÔw ÎK½_!P¦Æ` ˆ©®.+¥2šŒŒÁJðÞtY§n¬etch7†æÑñ"º1\ïÈ£CûèÆxá܉O%mêgï¯ô«Ä$|;ÏÆ×å]÷}C×d8Ôkå”ÁÒCçE×^Æ ât’Ü$/„Íä—ï +&º`\&ÿo …Œù ´kþ'Ç}dal¸Ã4|°)*ÔÀ~Ê+K‘:w^mÍÝ]D),ÍWj¼³
+b︌–OAFA2n]pR zžš=Œ´E²ÌÎïn­˜w$Óìêû—‹S+“Fþ‚„]Þ}xÍÙÉÂþ©rÄ ³à†uÙÑKö¦… [°ìWgM+ãvif ü>¼: `%í¹Þ¨
+çù£/°­ë]Fu,L0#Ì_{Å‹¼AxM™qE¡µš ›,/7*XvZ€‘H5`ÏWºXv‡ ù‰ÒÑê° e<–‘'ûià1È8Y»[⻵Á3
+’÷~-Ú릃n¹©ýÒDHM…'¿jžüî‚’¯‘²iq4°úø M/ÀmJû.
+GÞàgÓöµºcZ­ ›3j5ÔˆLO¿Ñ–/LŠ¤¬)’#¸HŽïqN?ÂÁñCAÛZìðt›ç&¨K[&XšÕjì³TzçœÏ=˜~Nk•I6%…úôÄÏEü€ˆÃû&-‰âaòÃÐùùîÎ!ót3$Á ”a&9>ãìø]Ê•Ã0á"ø•ô’J]
+¦Ã†3ÐxåôÌ…¢ 4¹yˆ)¼~€ṁÕ¬F­}÷ñ+nŽ¨£—Á–Ñr–MYK(ŽŽãØC˜d[ÿÙnÛ “زˆ…™Á¯òXƒ‚U|joC˜¤ü¬]f|-
+XB@~n‹5Ú ‚i<œ“õÞDš>þáæxö%³šÒˆ ‡_÷Mdññsz¸ ÉÆ2­‘ë
+ˆdÞH9&OF^ãzÂÙÌQ¸”SÂxfþ{ŠX +ð#ãLNe1ÿÏß2?ôV†óeKàj•°&(å‚£™j^ʪ(+a2ªÿ‡endstream
endobj
-1325 0 obj <<
+1715 0 obj <<
/Type /Page
-/Contents 1326 0 R
-/Resources 1324 0 R
+/Contents 1716 0 R
+/Resources 1714 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
-/Annots [ 1328 0 R 1329 0 R ]
+/Parent 1712 0 R
+/Annots [ 1718 0 R 1719 0 R ]
>> endobj
-1328 0 obj <<
+1718 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [184.7318 214.5925 233.4785 225.3769]
+/Rect [213.0783 507.6843 261.825 518.4687]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_security) >>
>> endobj
-1329 0 obj <<
+1719 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [369.8158 92.1907 418.5625 104.2503]
+/Rect [398.1622 385.1227 446.9089 397.1824]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_security) >>
>> endobj
-1327 0 obj <<
-/D [1325 0 R /XYZ 56.6929 794.5015 null]
+1717 0 obj <<
+/D [1715 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1324 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F63 1065 0 R /F62 1062 0 R /F21 714 0 R /F48 953 0 R >>
-/XObject << /Im2 1051 0 R >>
+482 0 obj <<
+/D [1715 0 R /XYZ 85.0394 131.4374 null]
+>> endobj
+1720 0 obj <<
+/D [1715 0 R /XYZ 85.0394 107.8521 null]
+>> endobj
+1714 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1333 0 obj <<
-/Length 2684
+1724 0 obj <<
+/Length 2819
/Filter /FlateDecode
>>
stream
-xÚ­]sÛ6òÝ¿B÷&ÏDñAHžÜœºsIS×{hú@I´¥‰D:"m×wsÿ½»ØER”ã›fô@p±Xì.ö”œ$ð“—ŠD{3±Þˆ4‘éd±=I&·0÷þD2Î,"ͺX?\Ÿ¼¾Ðvâ…ÏT6¹¾éÐr"qNN®—¿Oßýxöéúüêt¦Òdš‰ÓYš%Ó.?þ“ žï~þxqùþ·«³Sk¦×—?$ðÕùÅùÕùÇwç§3éR ëS8²àâò_ç4zuöáÃÙÕé×?œ_·²t啉FA¾žüþG2Y‚Ø?$B{—Ná%Ò{5Ùž˜T‹Ôh!›“_O~i vfÃÒ1ý¥Ú‰Ô);¢@¥:
-” ŒM6±©™V:(ð³R¦\Ï盳Ùt“Ï‹MPzo*|Úé|]滧.¨J;?ý±z,Š*êL;=­×å‚©Í«fE£³Œžy¹<FÆ@Kº)hVEIøËâŽ&yS,_¡æAü™”§©
-²4«uMÇSÝ5몤ñcÎÀ|SW4êÓBAd2½lh2Ò(«GÜ–¡/™â:H£ºÚq—]¹.oée[Ôu~[€Š†ö‘ˆ$Óµ26MŽø#ͺXtœrÌ"ª ßlªÇY³ËËú9Ø^/”rÏo‘F¶ïYSj„J¼îïÿë]±XNU€J§«õbEÃUU7
-VÏágÔ-¾ ½á“ϧX?0Öª’GQ:¦uP«-O®«.vl–áÊÓi*2ô”¤£¶`S3í½p™qÛê¨t  mÄ$Ϥ¶9µöÑÜ`4/èY·ÊY`]Ò™>äQ*-¤ÑŠ îHÞJÉHu½-Ê}ÑÈv>.òù1`Ø A*PÔn½Ä#{†ë„J]ÔyXEí¨/®­´Q}òêó‰5C¢WÞDod÷ì(ñA‘“[ßä÷›7UôþMtèŽ 0h õ¨ïf>½ÔÙó¾ÛÅ:î»-Š>ßä‹/«jS¸­B‹üÆÎidçžÛj#œQƒ­{n«•šæôجë†FÕ O,—äšuq›UÞÄQAv¾0~\£^qÎ0Y,Š;½/vëHjïËaO¦p_²:œ˜ƒjóPDvƒí)Íg¦ï¹¸ÁÓ©”rÊ&õKÜÏz¿#›RÍÆ4”â~´ÖçŒÍ¨wU¹ŒY¢©x¿ëcö|MÇÀŒM,;CyÜ屺 ¤±ð™Šg3 gÂkKÉ ™‰ê$ß*›bw“/ŠzdÈ­
-<SgäÀ$„LjÒ.‚wÅ &îª]SÓ,g›¸,ZŽYaqý¡­!àKçX
-mô±Nùé–ÿ„ÿ|#Ñ.|®—PI"ß,çîÍ›×Z½ßá%í„NҶР7¤vA­4˜%ÀøÚ XŸ"$X€ °/ÁÜЗ`#-}d Ä+2Ò‹k4ì'ºÀéÆ„¸Q(ñý>«Oz,!ÄŽ¼!Eœ\3$dÑ
-dæ §3ñÖÓtn=ìt¤K
-ª/!´¦Fã¹’ÏŒÐÖ?+âYâ¤{ÉM+G_“éCãg¥u/b?ޱƯv­„0Ž€
-ù§HÔå¼ýÿÂ!ëd¤$endstream
+xÚµ]sÛ¸ñÝ¿B}:¹!ø$€äÉ—8©o_Îu§Ó¹»Z¢-Ž%R'Jöe:ýïÝÅIÑŽÓkG‹Åb±ß¢˜pø‰‰ÉX楟X¯™áÂLæë>¹ƒ¹'"âÌÒ¬‹õýõÉëÊN<ó™Ì&×·ZŽqçÄäzñó4c’>}÷ã凋¿:;µzz}ñãåéL>ýpñ×s}¼:ûôéìêt&œÓw9û|}~ESY¤ñýÅå{‚xz<AôêüÃùÕùå»óÓ_¯89¿nÏÒ=¯à
+òÛÉÏ¿òÉŽýà gÊ;3y„΄÷r²>ÑF1£•JÕÉßN~j vfÃÒQù ΤÊäˆ
+NšSTùÍ
+`Õt·,XåëjŠíC±%(ò…0â !F䶎(-…‹Ï4“/$⦉KH¯ðÍOójñm:3Âê[‚äÕ4i1í>"Öu>_–U¼ä²¢gUìh
+£p]™<-»øü “xvÅö6Ÿ v–f-zÀŽ†_/ÇlRxÆ3}tØÙC6r^4x¡r½Ù•)…¯ütß ‚ìj‚iÜ~‰À Ý嘰H¥Z € 
+”>…é.¿àîsJ‡cA´s a?O¯%$ZQ°®ÂJBÅ£s„DjÑI°0‘ =QƳ,!-C…„!íž7Å2@_–¹>?±¡\@y3v°CØ¿MjϨ[>ÃÔP’ÑÂH„Ô! ü»r¾_
+’æo¾ s¡ xý“ÿe ñ¤×´¢E&¯™ ·Ø*R|ÿ¶Â[¦´r}MëñÓÍü;Ñþù¢]ø\!9o7îÍ›×J¾ßá%•„⦭$u
+%t+eMHjUÛðˆÈ,.©)·@hŒ:-͘”u‘­yJ³¦ÞoçÅÈg-z?ijU/%‹E”ÊLßq†â â¥õ8FqÍ>¤y0Û ð™±”J BÛUØ¡«€Ø5‰`1qV_RƒqÊÄIZ|H5¤{Ê®lƽ_j‡t½£+5U­w긡0´%Ë´'tL JmLÄøókŒk“8ÚƒnËæ>;¨Uð ^.ƒø¾.w;òÒ$.œì§ˆšœÙ°!
+?®(ÊÛÔF *UuP ¨v*ª:šÜ‚M×kBØ„"tG/Õ~}SD
+·A7Z\¾”ÿè=îö‡
+€î]ÑßSB‚· Ø~iUE  ›Øà•4`bKÕ§F‰·©¾yR‡»ÕF…./ñe‰¯ÐÙˆ¶Ó2hS ~¥ˆ(UB)F“Ô˒U
+–@„Túàö&I¹;mgSzÈê¬Y…-i›uQb&¬bÏŽÙÓŠiücøÿËÝ0‹‚¡“ö¨
+‹;F8ñM^ T´?F”E2)Ú
+%zž—Ó¤Þ&¤U¯”ñpY×£>Y¨(¨ÜÚ?b òóe1¿ÇaFÝjgR¿Õôºç0߶|aŠBZ]™7T‹‡rÜ›2! U©óQßmó5ýs†sXé@8 $Ôð$Ùm±å[<¤Éev`fý]Ü$z†¸œ+.£7òÓ0(6Ëby2Ô\ ·¾»ÐTÙ
+¿‡ù‚·Zý‡?»8|“‚>Ñ99þE…´Rg ™
+…ž;â<}ŸqÌú
endobj
-1332 0 obj <<
+1723 0 obj <<
/Type /Page
-/Contents 1333 0 R
-/Resources 1331 0 R
+/Contents 1724 0 R
+/Resources 1722 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
+/Parent 1712 0 R
>> endobj
-1334 0 obj <<
-/D [1332 0 R /XYZ 85.0394 794.5015 null]
+1725 0 obj <<
+/D [1723 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-370 0 obj <<
-/D [1332 0 R /XYZ 85.0394 625.1831 null]
+486 0 obj <<
+/D [1723 0 R /XYZ 56.6929 291.4983 null]
>> endobj
-1335 0 obj <<
-/D [1332 0 R /XYZ 85.0394 599.8772 null]
+1726 0 obj <<
+/D [1723 0 R /XYZ 56.6929 263.1273 null]
>> endobj
-1331 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F41 939 0 R >>
+1722 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1338 0 obj <<
-/Length 2990
+1729 0 obj <<
+/Length 2567
/Filter /FlateDecode
>>
stream
-xÚµZßsã¶~÷_¡·È‹ß${ONâKiœÄufÚIò@IÍ9‰TDÊεÓÿ½»ØEÊ”ÎwiǤ `±Øýöh9ð''Ö%.Wù$ÍMb…´“ÅæBL í› É:³¨4ëk}yñçw:äIܯzce‰È29¹_þ<u‰J.a1ýêûÛw7ßütwu™šéýÍ÷·—3eÅôÝÍß®éí›»«ï¾»º»œÉÌÊéW½úáþúŽšñåÍí×$Ééqbлëw×w×·_]_þzÿíÅõ}·–þz¥Ð¸ß.~þUL–°ìo/D¢óÌNžá‡Hdž«ÉæÂXX£u”¬/þ~ñc7`¯5tõŸ‰ÒN8PÉ1Ú<qZéÎÀ-Bˆé{¿û@‹¼Z.w¾ip‰0ê $&3•'&•4ÄÍêr¦¡Cûèé¥ñ»'¿Ãw9]Ö¾©¾h©á}U?éUóLº ¬©OA?Ûû¦-ëê üLí´äAžËõºS@c±K ò(U±ØÑ$¼„¾/4xJ+›ÃZp a¤YSïw ?²àY§>“2É­U¡W³õ‹ò!”o`BçxUÎN ðݥ̦è¿ÐRTKzÙÖ»–tögÙªÞÑK³_<R#Tz0}æl:}XÌÚ¾â¡jr7Èn~xrè¯ÜNƒGÐÒ)£%±ó¶Ø­ñˆ«”/|3{r#îImâÒ4c_Ö[Ü´„¶
-wÖõ†¶—€B˜Ûø£ÚoæžGX…ðˆjÜsK13[ÔÈÞ~/I Æ}ðÃù·åâ=5gÓý–ǪXÀ.ÑÜóVdI®­î!N°‰–—N}ˆƒ"S ‹ƒÔ…²3½d¶¼¬”ìÂøn8}:S€›¢%Éy¶²Š*cp£
-øY(cMÑJ(&S´RŒŠ ÆΧþ÷Åz¿,«j¤º}‚ƒ܈èƨ=âF …<‹–Ou¹ü˜s©ÕùqÜYàáòt8lç.HªÐå(ÌÎù ’L‚¤_*Ð) £°ì¶|òëŒ4÷ÀE(ô\úU±_· ýªWô÷à\j¥|]áw€+";ë ™'Ú¦fd¼“ÅÒvØÉ {©¼ø¿P'ÓŸdÈœ
-¦R¹†Ý2 »Ôß$nW¯!"ë¨]–¥ùH/›äiêúÞÒîÈT'ÇQp쉗æd­ÿ_뎩œÌ¡ f*R…3•î\å±2“Ÿ„K¤½
-2-*Q2͇Øóú1ØfÀ«:¼Ã8×ÇT¤ÄË1†¥“L»ß\E`øÅ£_¼ÇW7-W$
-…/õÖo Ð…íÍ Tj¢¢V38€“›‡ÅS¹
-x¸*0²Qð¤$iw%4û§ØøÈ/ÁhÙ|Á“04p_€WìF¿©áÅoýÉò´X“$ìF8:Þ€LÎÑð*’—~™@“Ù^§Å°Upl)žŠr]Ì×~l›rÈÐÔÙoSª23Ü&˜‡æ ÍÉ¢ÞE­+ª/ØÞm¨tÁ†PoÞâî¥t„z.pœ‰pÞB‘ùJ
-UX?¤£æè\T?WC\ƒ´#ê÷"½^ü›̇ðUB¹¥7g­¶oéý?o‡;¢ÆÓë3Æ|yôíÃÆmÝ^mpÓMñãJ¤(ݹKdš";ÔvxŸ³¬Ù¯PóxQÂqnýäkª<"E*êûÅ~W¶ž–™é5AZaJì0ÔX¹ü—m[_-yçS±+ë= ·Ål̃“¢:Th#§ó=Æð—g V€k4Å´îE½Ùø@MA£ä@tÛ"Aø˜"4®=ÇH$Î ½ò^¡*ÉâyIÒœ
-<´‚Ã;¶há‘S¸°'<ͺ©é-Ó‘œ¥Ä‘Æ4
-c0»\ûEÂhùqô‘*í rw Ǫ„AôPµfZùgV‰fÐ\ÓbßÖ¨ ŽPsßb»]—«}5z\
-¼®é².œ¥‹ŠÞ„
-"ã FÆG<‚Ú¡¨•=ıVÀü*<ÜVX>µ›˜Röø\oB‘£K¤«-ý2^
+xÚµY_sÛF÷§ÐÛÑ3§íþ'Ù<¥‰“s§ur®2s3m(‘²9•HE$íúnî»°
+•¦z²>³Îgé)«³_Îþ¹8˜ KÇüçL"\¢ãj=æ@—
+o´ ,«¶Ø.³Eû‚½– ~]”Ýeå*›¯Š¿ãAJp±· %Tٺșk¨Îë¤çº/W+RÑ5éhoYé¢ÞnÏUͦ®ò²º¡ùæ¡i‹5±äÅ2ëV-Ml³ê¦xã$Žj²½/0~˨dž}eÛ ™“©Ò©0Ò&0R"uN ëûŠÎ–u5ßÓ¦ìpër2ÕZèD§a ÈžÞÙi—o¦›z ò§^Êè?ô fÒPImiä3î ÿû&Ø#í2ýëdh0Vh“Wu[|>µÚGëìfd5þJèhpô54ž3­é–Èú›”zQU»z ú* "nXâ²Þ2±è¶eûp®”Š Álb£·4•My®@ D3—ÿ.ú¹MQ嬻®è{—m˺câ&›Ž9p  AÝ`DXÍ; “F÷ ¬Šm¶B³‘Lû^Ôë5¨#Ž’W,êªÍÊŠ~d-M®Š¬áyåMbiÈG… ¿IÈA&ÏK¢¦Q½¤YpXÐXo€Q ÜŠgÂjVMM£öTì0òFyN¿¡R¦8N~[TD„ÈÊi´Îhr΢ں&B³ÎBâ
+ïcÇ 0,Fœ …ôÎ…úõ¼ øü¼( l` o‡BF v˜ãl¿KÀ@e„Ñq|˜Ncp†e`
+kRÓ‚,\W`¸*AÐW4Â& ”].yÏÝâ–û¯„(?p 4Úí#ÙhèüªÅªË - WªˆÊIÍئX”?ÄaC• &s¨·‹¶È± ÑlS´4…ÇŠ„¯]±} R°
+Ôø„7kèÐÈpQì/ðȼ
+¡ôšš««P¦½&J° Ç:ðvèÍ Hòê3Üä+À27Ö´âKz¸>…‘гÅxëÝ°LºÎæDÞíàQžÚ4Ìš SáuÙ…iìRŸN¦û?•¼:õš<îý[ÈŠ½ð1ÄÞËwÚ¯8…#)^C ðŸ†åbaµÖßF”‚~<Iô·‡‘¡ä'`Di‡ºƒþR‡ÖTQïoA(EÃðn‡ƒ‚y ‹¶DÉë‚ùCÓŽº¹ôy(EËï1?[*u±¤¡/ü±ƒ
+üI7òZÑÔ Ìø?ð¿¢å,=•!ƒC~]Øü_Äá;YbÇê¿Üã«ÿ
+ºy 3ŒŽÃç8éE¢Óš-²Ð×>=öìîÏ¥Ì50ý9”©
+endstream
endobj
-1337 0 obj <<
+1728 0 obj <<
/Type /Page
-/Contents 1338 0 R
-/Resources 1336 0 R
+/Contents 1729 0 R
+/Resources 1727 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
->> endobj
-1339 0 obj <<
-/D [1337 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-374 0 obj <<
-/D [1337 0 R /XYZ 56.6929 769.5949 null]
+/Parent 1712 0 R
>> endobj
-1340 0 obj <<
-/D [1337 0 R /XYZ 56.6929 748.5275 null]
+1730 0 obj <<
+/D [1728 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1336 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+1727 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1343 0 obj <<
-/Length 2667
+1733 0 obj <<
+/Length 3302
/Filter /FlateDecode
>>
stream
-xÚÝZÝsÛ¸÷_¡·£f">Iâ1—8©ozvêè¦ÓÞÝ-Q'©ˆ”}¾¿¾»X€"eJN›tzÓÉL¸
-7òùâ—ßød Ûþñ‚3eS3y„gÂZ9Ù\h£˜ÑJ…™òâãÅß:½·né˜ÿ:°Œ)nÄ©’Ykô¸Z§¢X¬•=-‹ÖqåÉ°b(êp¼1PÆÈÃñJ9‚Y˜Ãóµœ%Ž51Î<¦ó½F;NËL¬2
-ÎŒ’`¹ã¸™ÎbÍá]ŸÈÔLK@Oª¤óÌäóD0®­UÄÔ£Ý^>pß_määm ;šô6Ïú’ݦbÙì ã‰6í,ž¯óéLKeËå.o¨¨Ùæ‹âWÎe¾¤·EEÏØbÕ—¬4‹ÁíÞ Ÿ÷ùPÌ£§YSïwSÉ£EXÖ7(N˜T:ø®Þ¶EíÕÞŽ} XMê îêvMÔÏo?gV-QÀŽƒ
-³|î*èùRš@³¥ã°ÖÃã*m!ªÏÑV¬^ªÏ€®Œ_q:<ú'üu ùöá1Ä¡äú
-È™mÖæ4õ‡3Å1uV¸!eZ eQ›¢õok¯„R(²oê}åë•_PgKÒÒ®³v,wöt¢7¼ÉH¢|RDóÔ´ù
-ô[¾$Ž°~ ï;¯éúãX0é‹Ú=—
-L®‰ÏwEVÎð7¹§Ù¿°£*æLÚØœÕß1=7`€©Ø0™@CÕ·àc™= ¿”<|˜€—!™Àôl¬—ÅÂ]ËÝ;g.½ÜdMëR•ýõ’î·ðtŽ–ÄP»ß8a²XÑ„OŠ¤»È¼Âj¿¹ó_6'3c˜R‡&‹Pµ&›SáwÌ{‡/-ãè/ûn¾Ù* 価Ÿ<­û¤
- Ø‰Ä‹?Kã-XŠðçÀc{"›#™W$Ý«{\ãuqᢇèÇ`d ߆pÐÐUV†»rS€økeþùÅHy÷³ËWÿ%Hï«zÂTšÊq¸+³TÚ$…î7êØr£RWõdÄôfŽ¢õendstream
+xÚÝZQoã6~ϯð[e fIJ”ÈÇm7ÛKqÍövs(îÚ>(¶ kK^ËÞ4ýõ7ÃÒ’-{³×îpRä3œùf8$­&þÔÄä"wÚM
+— #•™Ì×Wrò}ß_)¦™¢YŸêÛ»«oÞ¤ÅÄ —ë|r÷ЛË
+i­šÜ-~Ir¡ÅfÉwooßÜ|ÿ÷w¯¦E–Üݼ½Î´‘É››¿^Síûw¯~üñÕ»éLY£’ïþòꧻëwÔ•óßÞܾ¦GÅ™Iß]¿¹~w}ûÝõô·»®®ïâZúëU2Å…|¼úå79YÀ²¸’"uÖLžàC
+圞¬¯2“
+“¥ihY]½¿ú[œ°×뇎é/Ò€l"•F½ˆ­ÒÂ9“³•` %ò\eçç¢qæâj1œê`Þܤëj=QJ8c4š7×"-T>)Œ“çdÞ[T°§tÂä™BB%a ‚{Š·ÓY®’;ø¯“sÀœ²ÐH¦„M5rž|œ(!3çR¢éÕýJð ßܬõäu ë™ô–æõ&öKÊu°€S BîP±yîå}_U€¡Â&åªkiuyÚ”)XàžV·Û–M÷0U2©¶S-“Y×î}e^ñØ>ÃÌŸ[6‹‘ù•© Ó7í®~x¾<)¬ÕI°Ç*Îr'´uvÒ³îŸÃ "Ó¸
+ ©!‚`Q$«ö¾\QÓªîvTó†„Þ›Ÿ˜x±ØN•Mª®£ñ“ؤ)×Õºjû‰P¤Ùð4–FòÆ-OÐU ܾ½»yóª¯CùXy‡
+OIR|• W£En\1ÔGX2¸ L¹ÅªEƒ5ÔÈlÀòÕC¹_Òj„ä 4.]ró@0ìT*·Bk“¿T…–ŠiÉçqæº#–õ§Še«j*GxÂþ {ØÙ½WòÒ™&¨ÃÝg ~ÿ5M[3gÂ"¶´€ªm½¨HŸ©2È#º *lD…ÐJ†Ô$ni¦zê€-pL#’£N¤Ä´Þêäç%ª#Í䨬Y!]_ žéyõç yÂŒFá&ÍRÓî •];Æ6ƒm(‰ØPÔÞ1ºå)G˜ÔöLvÒzKÒ:¢ØÇ5f€
+o§¢IR¦_†ELÛõ‹89G'¨ÁPªÜ{¾:ìÐ÷ ¨ü¿Úm¶db´ 4s–rl‹‡uwX ×/8OBú;ÐCµÞì8·`×Ú¯`ц3°¡b×m^ÒVF½:›~
+IûP˜¤R •J9ˆTR"•T© ‰T0ÐG*°Ec}¤’„­)bˆ{8RI‚—Å*a€å¢€ø5Lòÿ­´ƒ¤[js`}ªó
+ð~U~B¥úp%¡ÓN y"¶‹zîä¾ÏKKë²Ûù`•ªþxM'[(ý•Ñ‚Ðo|cý@ ‰w]2Ãf¿¾ç+MP®O€-{€«%Él]‚˜a°§'×xÌ÷íÝ>Ô‚°PÝû»'¬•T鹉¯!µ¥Û+l££5N·Ši•ÓY‘%_ñlMµ{j·èã¾lOõb·½Û¸›: j`«÷·¢Xå l‹R@ÝK©A˜‘haxפµ
+F@ãzSvGszXÑìÌîi‰çÄ9OˆòW>ž$Ü
+áGG‡XÎ<HM.6r åÅ•úÌñ2.ãÂ9mõGp-à<ž›ÁqW­Tâ·D`T7»
+wJ°÷xŸ—|ˆ$‡à ®ˆ"{X»T|2ÄæM ëªyÛ,¼2¯:ÙÉTXcŽ¶ÓÑ°¦åù ¢@'ºø̮էºTÕ‘zk:”"Š²"ÿ w¦a>ˆ(:y†¥ÏýÍ£]
+²‡» Ã]ÿ 3gªâÈsãSÑa¹ø
+C!>">°¹ Y =‡,èsßÅ·¤sŒVPÉ—ÅÀ"+ì‘B΄K“²P—ÃIŸê|8‰Tý§6Ÿí=´ÛuyšþjÓô²‘jDŠa¦"E^dùP zúTÎô^üœã†€•{î'[aâ=µTYà5®MxA‘”Ö}=¶w¥…°. »È1ž`‚‘ É ŒlÔñ#ø‘_+]¸àÄœ›çu
+[Mt
+J*ü=‡ÊŽîµïÆaç ^FÎØòwJ˜ÜžÄXcy[+|B-¡‡}ÈRBSÄdÉ´T.*0m˜œœÓS³<ĈK|N¡g¢£u¥
+b{6aÕH‹P7C?k/HŠµŠ·é”!¦~YþùªH^ß¾§¾!¦VŸ `+‡Á–^Óü³yl /r4$¨žúckÒà öBd8‘©ø€²)çXvÿ¾ýiŽ®äñ'#x§>PÊ©ìZǯ‰ÔXr¹i»®¾_1)d`-÷SÁ:£8ÔÂZõRÔ[!U^Ejæ¾nÙi‘TÞýõxÍoB:Mîý!CqPÛøs ÔºýßÒªï¹5ô¢ûg:`§U¹ƒíØ?nJLôŸ¨“ϾJ§|ÑŸ;°ÝA†4[œ§‰[9ôYñ;Óý£ìõe CmóTÞv38dŒ»zêÄŠÌöUÌö§7æcêO!îÚ­è—˜twTÒ;¼–iO«¾õ‡%Ã(¦Ô?Ösº„èÚnúyj `hÑ>u4þ ¾ Ç”ÛÓ’kbdõ`Î"wÙ`õ…E|
+³¦p_S3§T”Žß€îïVèárQ5Ã_±”üûžþPahÙ…SÆýó “ ñ.5ñ¹‘§Q*ǯދæ™_¦FàO
+WPÈÓ´I
+Іý_ãe˜$endstream
endobj
-1342 0 obj <<
+1732 0 obj <<
/Type /Page
-/Contents 1343 0 R
-/Resources 1341 0 R
+/Contents 1733 0 R
+/Resources 1731 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
+/Parent 1712 0 R
>> endobj
-1344 0 obj <<
-/D [1342 0 R /XYZ 85.0394 794.5015 null]
+1734 0 obj <<
+/D [1732 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-378 0 obj <<
-/D [1342 0 R /XYZ 85.0394 460.4475 null]
+490 0 obj <<
+/D [1732 0 R /XYZ 56.6929 672.8271 null]
>> endobj
-1073 0 obj <<
-/D [1342 0 R /XYZ 85.0394 437.5053 null]
+1362 0 obj <<
+/D [1732 0 R /XYZ 56.6929 648.9121 null]
>> endobj
-1341 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1731 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1347 0 obj <<
-/Length 3382
+1737 0 obj <<
+/Length 3226
/Filter /FlateDecode
>>
stream
-xÚ­]oã6ò=¿Âoç
-d›ÿQn[êT‡í€ˆˆ,¢P¼¬)ª–†w®)–uµ¦*l£›ÍÀ‘Y ‚&¥ðÖª€äªXç‡MKŒ ¨ÀS%ℵR8)Ó™“VèL¹3¬  EŠ8!§D9BÈ‹w/e&ÒNg˜‰Ãû,’J‹ÔH=<ý#²Gù¨*›gÈ­ÏHFjE¢ev*ŒûèÐÔeŒØ-G쇑#ûa´c?LöÃ0wyØï¯e6'Þ‡mƒnÍ‚Yî¤@,ûiÅHk?Ï7›ú©XÑL[Óó® g}h›6¯VeuÏÐ-MäÕ35îËÇ¢¢¹¶ÜhPœej⼧Ǫ¦ó
-x!½íj¨»D‡€;ž'^a‹™=ÕÔX•k¼ _¨¥‹5o¦|—v"ó&z/Àc<Á§,³à7¥ ¨1Sz!²4ÁlAóy¿I¥°àj:¥$ÆÜ© ùvZì<ØË¡3¼Ëø÷4;±±6c·æ€°$÷`Ðx†u(ƒû€ªî „ü‘Úd ñ¹*`z[V NÊ :ˆŸÀËU#&î¥%2%ëñ„I“d(êv¨ágù¥!îÃøŠ¶k¡Q ×B
-H½ÿô#l‹¦Éïy48Êf°>„Ʋè.ÉH®hI$=Í­¦î¤@ÿ
-|ç…Ç’áˆ0+‡¹LüÁÀèY±qœ3 Kƒuõ”37ÀšÌŸQuí=Ø
-“õIÌü§?¥Sä×£N´:½Ä »¡g¾iõ‰îQ5L ýðÉbÔ…Ôß—Ë0T7õš‡þ{m-ÈЪ~jh«*"zöBî
-ÔA ‰Þi-Àç!›¾x|5qþPN¼pκ!AƒŒìeã؉dT˜†c€ «öH…°ÕS!'‰ BظcȾ
-!è"ÍÉ„t©rž’ŒÀÃhÕC¶€d­i›(ô,þXBÐÃü_ùO96ŸÊÍfhòiÏ5†Ò‚ým\7(%±sUéTƒµÕfw‘Õ«Tøœ§V/Haê‚F¨¡FOV¦T&ŒÑò2ÔÃ$R ™Ï¢°Lz¥!è+ƒ\’ÉÑœc‡d[=Y Ý
-ŒXqèŽ!Odo°~ÏF35SãàdM±âç)€W†°IÛnëPê€>FNÔb— µò|eß**F¨”Oe4ßjÊf ï\Úó
-:y•W
-‹±0Ñ\£Æ®¤ƒV¬@¬éèc¤å<_­¸âÁÈ%j¶™ød“ С²€åó£¡Öí»ÏÔ
-YRÂo݈®©œß¿šŸ|Ù‚µq¨„ÍᲡ7û}rd|ˆö’A;ÜõHƒ0ðÍÇ­š½¯áF³þ¥xãEçp©ôä«môLRY˜„òÇzƒVU†*ÄM~®„’šTž‡FÁ0›2ÄÀ0¯á¡E¯á¡Aqȇ@tx¤h[R=è±ÆQÒ): >{謯!Èa»:r-9Œ"–×*™ÿ†hè
-ß‘õ¹ü×GiSŸ€•?~Fô×Ä29`fn*`©^x- ê4¤ËãêêŒ![<¦'¡µÎðuZ:ëŸpZG¨ DBÉ‹önˆHWÞi([§ &räT@hþUf8E‰ïª¸oŽ¥©‘þ<)lM}å
-ñ¥3…C°®Âd° #…w°æTôùSÉSÔÿ%´)endstream
+xÚÅ]sÛ6òÝ¿Bo'ÍD ¾>¦©ÓsçšäR÷á®í%Q6§©Š”]÷×w ЄDÉɤ77™˜ `,û ñ ƒ|âtÆd®&6W™f\O–Û+6¹ƒ±ï®xÀ™G¤ùë›Û«×ï¤äYn„™Ü®k¹Œ9Ç'·«Ÿ§oÿùæãíõ§Ù\h65Ùl® ›~sóþ[êÉéóöÃûw7ßýôéÍ̪éí͇÷ÔýéúÝõ§ë÷o¯gsî4‡ù"¬pf»›]ôݧ7?üðæÓì×Ûﯮoû³ Ï˙ăü~õó¯l²‚cÅ2™;=y„Ëxž‹ÉöJi™i%eìÙ\ýxõï~ÁÁ¨Ÿ:Æ?¥]¦…2“¹T™3°Æ(—YÆ4pmnuž)dÏeÁǸ±Ëݾ¨Ûu¹oçU}|d.mf·“áº'»÷X#Û‹Áö\‰L;™n{_ÎæR¨é¶ø£Ú¶Ô¨ÛE¹'¸YÓ·ªÍ¡^QãϦózúCó¾èZ5‹€¹Ÿ¹é¡®«ú. 4õò°ßϸ›–u·yšqΧ($Rx²€Àv´ÂÑ8Ïr­…§yU®‹Ã·azúPl%U‹s^¿SC¦[ž9©,°
+§rF()cÂÚ„(Ì›zI¤-RL³† k9&M˜u|G[
+¤dÆs—·ï±FöOÈe\@WB€× Åóg ÂFÔ %˜¿4ìƒ
+a‹T¡
+!:©xB`0‡*„¨gTˆ4ˆµF¤7ÿ_¿©¿Ã°)µh‰ßeÛµQ è[þ±,ÛЇIï¿Ú‚¤yð±ÚIX”Ã5ׇ¶\e(žŒX…C½c#h°ßtLƒ%Øi–sñ%*|F
+a™`O.Jáë¼öX©îHgçu{"ŒÚdÖåæ2=Öɉ ϬeyJq˜³gaÄFFÁrºCΞÍ96HÈ¢ozYÄy^±k0Od/™¿Fs2×`€…ÊS9\ûy Ò—³iAŸ»ê¡¬ ¤e·MWR».¶jË=šE°Ðh¨EŽœ…*ªüŒP ¥2kxô bÌfg¹µfà$û,¯
+i¦Õš)î´ª¥ðùËêÆÍÓüX´Ý4d, Œû É wúȽhöëCmÒ'Ø  ;&bà@ ±"»ã #„:äÿ܆ŽÄc;ŒÔŒø¡*žâH(:ÀHôÌ>„(›ÃŠ¼3t£B¡2-¾”#<c¨c÷e‚厂ÛǪ»¯©ò)%ÊfV³ÈfâÓD…ÂFj›ýÈ:°«3:çù3º³y dà°~KS¼>Óƒ¢wwؤ
+W>ƒ›ü>IR¹øXûÓ>sÁw¼¾ÙŠÉ· œi2<V\y>\ÚŸË$É!œ&w (à9D>Œ"Ÿ› Vî+eEæS‘éŒèý eÀÙT>†žUS|ôvh»ª§é =eבöAƒì5ö’ZÑ`óÉÞCc=ƒ8'˜Ö#ïBaÅ@b9lúþA[Dˆ¡Ê-äNo/úëd2±ÌäLNæυᯓlÈæ2}Šs~!´Æè^@À®øåȺÇ:cÉææD,”Vîp\G¬BÃh•<¢¤¯ð´”°TŒùgm2.rþE–|´s}%÷Õsyj
+Iž·B݊º0ÞüÚ¶ 5ÍÑ!ª9›IÈ£Œ/¤EC¬ —±(6é染áñA>.Ò‘FèHï<·ë“òý±µHP¹¯ bY3(âà0¸Ç62ø%tòÑг© ¦]¬z,Uæ gƺ/uÇFÆ)ë¢Ú´èz5æg!ÊU4Ú(Ì‘ÛÁwç*s¹ÔãņÃ$i{¿[1xÖM
+¸{kùßã&VÔX:?ìÎ9/) TäÂò—¼¤
+sL%HÝ
+H#¤$Òç0$³2¥å—6tLؼ`A+©:YN¶Ée!Õ¶¬wL;&¡$ï³àól8¢Þ) ÉEêœ<áãÎ l¥evàœH/Xe'¬:~³=&“ÖõuåKÎ)†-\ŠÌ‚¼Ú .ÈP@:5@—ƒ¼wƒ÷~’é””D†r5åLBËOþUÛEûàòD˜œ
+“ËÂÔÒpÀ¤ùg'M@Áä½ Köa&ô
+94ÚQǹa)û›±?è‹e¤2P7cOŸ
+„5JQçÛƒoŠï©]òÞDatGÎdfEË OåØ“DlòGœ_˜f¡ä:üa‹Å„í®èªEµ©º'@ågÅÏå™\^¿Òyñ‹HĬ®Z?8J‚űK{÷H—7çÌ·‚ ôâîÇɌ̤6|ä}k~¡È‹¿äï Ø›ÄÞ0””Óýï?(‰ÔaÛ¾nŽsBÝ‘©|Œ£‹ðc/ZæcÏ Ò“Åo[R±ÀN߸½y÷êÝů#c±Òb/bR±‡b±×8*öš˜Jà6áÁÒôïs«¦ãõ^“ãO3ž_ÿÀÄ>ºIü=—G3ª§¥MZÝ]nŠƒ”“Šª‘R™Xs@†2Ü$eg…±æRµ‰öò?’ã‘y°Ý è뛾è‹Ðxe‘+ˆ™ó¾^ùb¶Ò 뽸¶¯÷"Ð?k*»’~ÙuæÇyRgø‹ºmb}BñÕ?Ü{þU#Äí&‰qG
endobj
-1346 0 obj <<
+1736 0 obj <<
/Type /Page
-/Contents 1347 0 R
-/Resources 1345 0 R
+/Contents 1737 0 R
+/Resources 1735 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1322 0 R
+/Parent 1712 0 R
>> endobj
-1348 0 obj <<
-/D [1346 0 R /XYZ 56.6929 794.5015 null]
+1738 0 obj <<
+/D [1736 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1345 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R /F62 1062 0 R >>
-/XObject << /Im2 1051 0 R >>
+1735 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1351 0 obj <<
-/Length 3017
+1741 0 obj <<
+/Length 3298
/Filter /FlateDecode
>>
stream
-xÚÅZÝ“›Fß¿BoÇV2ßÀùÉqÖ¾M9kßzýp•ä ´¢Œ@håêþ÷ëžžA !¯SÎÕ%U¦™izzzúã×£å3ÿóY¢#&S5‹SiÆõl±¾b³G˜{{ÅOè™Â!×÷Wß½‘ñ,R#Ììa9•D,Iøì!ÿ9xýWnî¯C¡Y`¢ëP|{÷¤ôxýþîÍíÛO÷¯®c<ܾ¿£áû›77÷7w¯o®Cžhß 'áÂonßÝõöþÕO?½º¿þõáÇ«›‡~/Ãýr&q#¿]ýü+›å°í¯X$ÓDÏöðÂ"ž¦b¶¾RZFZIéGª«Wÿìfí§SöS"‰Œ4ñ 4‹$Óük–•‰µb2½,ƒS‘‘Q2½,‹¾c Ë‘þ‹±¨38Cef¡ëh-ŽÇ+ÄŒó(…1<_Îud„Šg±Öpè†øMlYÓHÅ-'‹´
-Ä#ÇûëÐðàþÁÍé P)t2‹a¥D
-k›Ùo31•¦’¸´ÝíÑ
-và»Ûµ˜ýÐÀžfÃmyÉáP´Ý—·å¶˜0Ð@2`SVçÛåu( ׂÍŽ^òŸ<¨›Žöe»"ª[DdUWlу:ëÜX·½æ0S·ËkÉœF)m³Û.<GCϹ{ßµEþI3Ö ]5»*wtÑ‘éì†áÆÝ‘Á>@P*…ÝÖ.Ïíò 0ÄÕ‘
-¥±–ÓÙ›E £À'ñ1ºùDòî¹ìÁ÷žÆâ yÍ¢ŸÌY'öffÃEÎ4ñLªŒ¼/1‘‰c9Öå•õ`[øÚ«g߬Wƒ¢ ;˃ré¸VŽ½©Q•mWäD—µËaCƒ–D¼ÓÅÀe3œhŸ¨Hqå?[feÕ:ÅÁùÏ—Q*cæ# ÕâBARND¬Æá|á@¦ÔÀJcs&~W¶T!gœy:ùŸGU¹ìD@ ¹¾àEžë<)>v#8zƒGÿ%ez® mFŽ”‚¿©ÄŒÕùÔ¢ $>K$éÈ¥püèR0yt©–¦7‰-Âl¦m±À™§²Ø·N¤ýÆ l7Å¢ÄTdf»Ué„åÅ2ÛUû
-ò×¹‡„51zä u3qè@ ÷¾ÔÀþ¶P¡
-:ú²£ç`EͦW`Å"ÕNÐv>±V)©<Ï/L³¥µŒ»„‹f½Éºr^Vew
-ºè4‚ºçcŠÖ² ÷ƃåÚ2Õº¨;÷ZtnÍ4Ì
-àsj¼!¾Â !e&¾|ù=fÖ3€@YçÒà%;§Ã"shÌ€XZŽÑÜÜ¡±Nl[æyá
-Ÿ˜k¬K»m†éq¤*ÎR´o¶Î©RI#Ô­¿\û/.5±
-
-“<y®‰UPMRÛ¯þ…M¬’ZÈÿA {ü…V©$ŠS`G…?6UæZ6›dÓ@D:âDRY
-¦¶qüƒ) ”ºÜ” ùÛüæÿÜ”ÉTD\%_2Ž‰Ÿg¬©N Šˆ`²ú¯&±Œç
-‡lÚ@°'`è‘ïÊÏSÙN
-wù&Dx5;b€Ï&IûíOt†éK²§¦ÌŸ“ ®¬ ÷üZ™VKó§´ …L/4²X¼u¢ï—¥'
-—b´¬°l–lœ
-Bëÿ¥c†ŽŠõI¿w»ÎbÕ4-Å!¬fS,Œ–6Þa
-”Hã1šecEÙ˜(,(* ¸
-
-îš®€œ ¹pÁ|^´%i䤹ŒŠ¤ $²ªmˆ}î¦è˜
-ýçM]¹•íQL'“_éžK ÚÖ‰]€`&þxg¯zìQðKWJD‰ã<3æ°=Žhº}lIn_¶ñÅ™}Wç™õc²‰ž{Œ†#`Û¶xéŽwUÆr(kÐ+IDZAGÓ<•y‘ûRï@Á<[|Þ“„|â’ú$Áû¬¾iÚ¶œWnº-WôI'6}ƒÐ_üSh_(MGꚎ÷›AˆG&mW¬ÝßF¾Ý¦Vd]NñIgò°r w|êpoöèf-Ú4»Îêƒã÷Kí~ôà SÂé
-•"<†hw‘U=?eÕÎvDqø‚œ¸Ò`¿*œD× !&Rà©>¸ž Õj+c â¯î=œ¨ Pš¸îo|øÛ©_=ÊÄrX2q­¹[ÓÝŒUÖ`¯Ì½€9§~e‘<^÷qËXñD¨©‹a :棉þZ@;&|É»¦­Z|„«×N»Çò1›ºó«½”ëÿ”eß³þí›ÿbæøçD*Žd’ˆéFA2è½±À;¥pãZ_nNÎTÿ/`å÷endstream
+xÚ¥Z_sÛ6÷§ÐÛÉ3Šÿ.OiâäÜiœã>õú@I´Í‰Dª"eÕ½¹ï~»X€¤$ÊI&íL‚‹ÝÅb÷·»Å„Ãÿbb,³^úIæ53\˜Éb}Á'ðíý…ˆ4³D4Rýtwñã;•M<óVÚÉÝý€—cÜ91¹[þ>µL²KàÀ§o>ܼ»~ÿÛíëËLOï®?Ü\ΤáÓw׿\Ñèýíë_}}{9Έé›½þxwuKŸläñÓõÍ[šñô8ÃôöêÝÕíÕÍ›«Ë?î~¾¸ºëö2ܯà
+7òçÅïðɶýógÊ;3Ùà gÂ{9Y_h£˜ÑJ¥™Õŧ‹w _ÃÒQû Τ²rÄ€R è3Þ›If<³Jª`Ày[ÊÜ´~*¶Ûr¹,ªøžÙ4§×M±½n:û»®Ò‚íá—§²ØÓ’yÞ” }œ?Ó³¬«Ý²¬è5G»vb ÌÀdFg°'Ô«ªÛòþyÖÔ»í¢ˆäÃÍXŸç&R7mÞë¢j‰ÿ¾l˸ö±‘6S*cR0ŸÌ#Ÿ°½SaR3žy…ÁÎOgŽ$Á£|¬Ì’ÒóU½øL”…'*‹ºúçòa·ÍÛ²Ž_qfU°c§ëÎU†qñN§\ˆ!7ît< 9¥Ïò¢uxÅaZqÈj–”›Yå™äN}³3=8'Gæ€ —Ìnƒ…n64V‹`hÎŒ’ÉÐ.gVLïà_9=‰Fg™‡˜Xã˜6ìfòçD0®½WD4‡½ö6?^¯åäm ;š 7φœÃ¦ìð¸…ThZMlÆ™v 4ªü©^å;ÂL1J”õSÉ 4Ì«% ŠH³*!¾Â̲."=Ä šÝfƒq¨ÁsâLѶ!Ìð%xS˜¥(" Ëå¶h"§ûKÅ£?ã©CáîÍG
+¦¦^\J>ýŒÿms J¸ ¶p¸Î»Éð”¿Ïqx„õ€¡³ú¾Ï­gÒC|dh µTî š²L g+4SΊÞaÅH6ê¨N@ködÍ$g@bÈúDD4¢Às)ˆveÔ¡¿”ŸÇàN¦¾[Á¶R%ê|æ»–ùfNÙDÀªéI,i¼÷ÊEC¨< ½þ–!Và‹˜<`AÑ°1˜V0i‡Ò¸]Ûe}a™ƒáœO{û‘ø}¬·QÖ/e®ÝZ8«¸t×ÀÁèÙn¹™AèÍÑö³Œië|·ýSµ@ëd$ÈŸêrù%žàÌZ ýµ<ƒ–ö›´œIEð1rú¾œ>Ò÷eîγÌó”ñšM± ãU6TðX…qd¦õ=ÍÀ¹ê`r€üçúQ¶Ié’HO¦H0ló–Fûrµ"ºP¥À Ø%òå<"Iÿ)ŒÐ¿Ñ»Q dܧåÉi¡T\M?Å ÆiŲ ÂÂhÈõÞg—ôqû3Æí Ž;úÙpÁi Ÿò Y¢XÄÄÊE?Á“®òJx¡>|Y‘ipÒkmèÐæu
+üÇzT¥äOy¹Êç«øš Œ_(®éeY´Åv]VÅ­+ (æ‡/Å_ùz³*"Ä`Ùv$á¾^­ê=Ž#eQp\=ôuwÀOÍ…¤™Àø/=¶yõPÐPÉÌ:Zc”yEãÿ½:Lâ\ ÙjÀ$þêD„Áé(b@A"ŽŽâhÁK•ì,¬¤Q‡SL8Óã.Îîâü}8‹z=VµBò…¼p©Ê×ÅrDÀ^ᬊT–(Ã%`ùŠï¡9*GêП#γ4ÿ„ÊZ±h{$Ãß•‡ÿ~ 0‘à¾:3Ù!˜ ‘Åa^Ñ´ˆü/`!SÑ…Ë6xÌpÚÊo
+rìäÂôcþ BxÓ,èò‡¼¬vqzzS·`‚2jß—ES’F‘[DT†°ÀA¾jj"ŸÇO´$BaZ^W«(9Å8 Üö+êEÇ¡«ï‚ëL †!a³ï(ï”Òñ(ĹK -™“ÒàÌX˜Ãö´H¬ëMpmâÛ¥m|‰fßUË<ø1L ©FðmS¼ŠÇûX<ò!
+•¢z «ÝE¾JÕóS¾Ú¥e}‡/˜Á‰ÊO÷Eä{4Ä8ëƒò$IÇR[[KÅ ‚dÒƒ#R“0Ý­x?bN¥Lv2QÖ<Ê$ÇQY½òøæÇ%Sý…Ÿà½µpRˆEç–<ES@8`ÛuLø’vM[ õJ¯¢våC>n‹Ñ&Xqͬæòд»*âˆR:ch•¢C
+HÏš.àœKåœ ÆÍôCìqDò
+éªÞcá“Â|Ap"<ôeï
+*°Ìgæ› )«cØé%Ëœ•G7kHd cìªß—
endobj
-1350 0 obj <<
+1740 0 obj <<
/Type /Page
-/Contents 1351 0 R
-/Resources 1349 0 R
+/Contents 1741 0 R
+/Resources 1739 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1354 0 R ]
+/Parent 1747 0 R
+/Annots [ 1744 0 R 1746 0 R ]
>> endobj
-1354 0 obj <<
+1744 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [471.1233 313.2012 539.579 325.2608]
+/Rect [442.7768 538.094 511.2325 550.1536]
/Subtype /Link
/A << /S /GoTo /D (query_address) >>
>> endobj
-1352 0 obj <<
-/D [1350 0 R /XYZ 85.0394 794.5015 null]
+1746 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [361.118 266.807 409.8647 278.8666]
+/Subtype /Link
+/A << /S /GoTo /D (configuration_file_elements) >>
>> endobj
-382 0 obj <<
-/D [1350 0 R /XYZ 85.0394 371.6561 null]
+1742 0 obj <<
+/D [1740 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1353 0 obj <<
-/D [1350 0 R /XYZ 85.0394 347.7805 null]
+494 0 obj <<
+/D [1740 0 R /XYZ 56.6929 595.1873 null]
>> endobj
-386 0 obj <<
-/D [1350 0 R /XYZ 85.0394 119.9702 null]
+1743 0 obj <<
+/D [1740 0 R /XYZ 56.6929 572.1218 null]
>> endobj
-1355 0 obj <<
-/D [1350 0 R /XYZ 85.0394 93.6238 null]
+498 0 obj <<
+/D [1740 0 R /XYZ 56.6929 347.8106 null]
>> endobj
-1349 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R /F41 939 0 R >>
-/XObject << /Im2 1051 0 R >>
+1745 0 obj <<
+/D [1740 0 R /XYZ 56.6929 322.2744 null]
+>> endobj
+1739 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F62 1352 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1359 0 obj <<
-/Length 3265
+1750 0 obj <<
+/Length 3299
/Filter /FlateDecode
>>
stream
-xÚ¥ZKsã6¾ûWè¹jĈÉÚÓÌÄ3;©d’µµ•C6Š‚lîP¤"Rvœ_Ÿn4@‚%e²år&ºtý øŒÁŸ)é,ÎfI&#ŸšÛ6{„¹7ÜÑ,<Ñ"¤z·¼ùÇ‘̲(Ó±ž-7ÁZiÄҔϖë_æ:Š£[XÍßÿøùçÿ¹{›ÈùòÓŸo±b󟾿£ÖÇû·?üðöþvÁSÅçïÿõö§åÝ=Mi·Æ»OŸ¿¥‘Œg½¿ûpw÷ùýÝí¯Ëïnî–ý^Âýr&p#¿Ýüò+›­aÛßÝ°Hd©š½@‡E<ËâÙöF*))„©nnþÝ/ÌÚW'ϳ(:ž8À˜O Ê"-baðPWå¶ìÌ·/ÄÁ 2‰Îà‚”û[žÎÍoÓv-ƒPÁ»ÔmÍl¥ófO#Ý“¡Æ6ÿ½Ü¶ÔÉŸó²ÊW•›Ë·Í¡î"Ç?8Ö<JµTN€µÙ䇪›TÈ(KSOr´Gü­œ~,w­—Ü‘•5®9[ ǧAéœG™R±]nÓ؆îþåÉÔÔ¢Õ¡Ñšý³Ù»i»(vùŽ4Kp60æ襵i‹}¹ëÊÆ-×l¦Ž@±H‰Äo­-ÿ0Ç:'b$<™%p_:Iø_Ѻ,Ö¹E¿â"\òT¡DœF*fjàleÜ™bâŽâ8’Len#tä£mè8â\ŠÑ6hrÿ8£Æ} õ=ý„#Ý8Yù?˜b8yñci$KAõR9’æÄòzª+2œ®†2DNë˜(Z—EŠsš\’ê
-P¿ªj^Êú‘ºÕ«¸¯ó£fŸw=QûÚvfKm2Û¶9 Z oZƒh=‡=5:ϳηÆspª £;»BS˜¶E­frþÐxºA
-ƒE‘1Ú5ºsçÛ¨íÇöt‰¦z¥>¨Ýæ€Ø­Å<w49=^rGcý…vn‚0_{ïäÎBREŽÅš¬àj_©yƸc‚ìÀ†¾Ù|upÑ%Å›z^ä55p1CMâ€-{œ@½ÏËÖMzú‘OWO×Þ^¡å 6 quâjrGô6£ßæVMPžWšsFh]ºF}Ÿ¸»×æ
-J€³!h¾è“Bªó>©§B)þËX\™ö˜oq?ƒÄð"_O4Á7ÜvÊ"™
-=æë¢Ú$L“y}Ø®(ÈLH]àé%´Î¿6„£‰4È6Ÿ½ðåÍÍ U45ÜAGÝx@\=·*®!i•ˆH¢ÿeW“e…ž-× Åà>T¦¯\i@uáJ=•E¢./¾LÆr€Ï¼ÌÙMp7ÉYi߈õtô׃@ÿY!­Çƒs™4Ý/ÅÒ_
-Á¢”©ôGÇ Yä¹Z+´}ȥݗž8¤ŽìvÁÃýÞ&\¾dð=%[§¼eã$ŠƒSqf|aˆs6ãÆOà,EMc_Á# è7îÅ> /Ôg‚8–ÒB
-Ôãv6;ÿÙ–ˆQBä3'HÑdÌ#-!<g°;WlÃP=ñA4°ÀZâ6ˆÆ¸;Œ–Sáªh8h]nøZS­MÛ¹Á}^·yáCQ±F’÷cÇ%—ÐZ¹éüÐ5[
-ÎÁF©½t4í>AB+§ÉM^îi`Uvá®ú’+†UÄÓþ`¸Ãðt¬ÙäS¸ýÊŠåM<eÁ ðq8fÔÿRVÍêµ3øDø¡8ñœW¿Ä††¦k+<Å`”é“BÈùbG’@¤g£b±²@Œ¼(]Ç!4nY¹þÚt®9UàpSî(b é–j¬$"­×±î)øã­>8ܳ֎Ûdq&.[{HuÞÚ{*{SÅî¬C ‘0ˆ˜/2ï©&¸Óò4Òi¢Æì—¾–Ôÿõ`çЦ³>¶sé•ÚË÷?¹Á¦®M4d}¡q¨'£ºñP’¦Ä}ð„”—¥GJý±Ž!1êÀ'M™'QIëµb —2Ò,¹R_ ©.ܼ§"S±ç°^´MñÅLÃ|¦.ów4ì!>\ŒùÛã„
-ºn^&2ª¾ráoÞ&Pþ´ÿ÷Oë†ßÊ®%§Ž?d/”Õc}êQÜoðNEÿ˜"0Ûendstream
+xÚ¥]sÛÆñ]¿‚o¥fBä¾
+Ö>lýa•’÷(é%ÚÄ5›–_\ÓtÕônß”uýLãå3%%èIJê1y»ûÐûpýes¢íÎ…—€ó¹ëÝ6yaÌl1™‰²Ö^6«!Õy³ŠTÈ:(ô¢ú¶ñ§^ÔíýbÒÄ2™äV—ÙˆT|ŒL,Ë’<Ôˆ‘»‡
+¯±Ð¬ «yÄ-»¶v½ûëõÂdf^õãérµr»Þ_Žš5Oß7tŸa¯×äž‘ÆbÕnwp˪®úçk)%Ê"×Ö«,^9øäÄÊLožy}iRZ&Z¨`t(僽€&EŸH%·`xlèPàuÛ±£a{¨KV©Í¡Y‘œ¼‡àç ìœÕ¥‚—RÆ\Ö¥!Õy]ŠTçNyªFF(s™ƒH5Á©i«í˜‡/Î{ ã…†è±qà¹òi
+Wûj×·ûŽÜ,ð' ×|I€S¨ ŠýïhØõëªE8Íç®_Ë´"ãäËoíÜšA´u|.-¹¬îÙû§‰Ö§>Î5íáíÙJ Ö¡¤Yˆòê@Ôf˜÷Ú 8ߘؔ+×Mº4•EZCM¹L*µNŒAU é‰óJË·Íwëš,ɲ;N ÿ´~(cD`¡äuŸœ·8HÀÐÁÍœKÇj툀Æí–+ ¡„[”¿2¥áÊý}KAJcà?ÇY |[
+âxfNÚRÙ©/ PVáÚH &¸33t渳IÏd²ÀD&¬ö¿ìX»® [ú>í܆c½øÂå%nÎÅ L…øJ¯=°dÞ!ªæx:Î/hN~’ym=õ]ë: ¶4£¨Mwl²<”]¾}_³/w\e!c\fýz‚›uût¾¦RøA毸æ!ÕyשB'f…Uõt{ô…Î/ï©&iu
+³y*ÇP§×Øaÿ¥ˆsœðYp›ç}®8Ÿ‹"ÀmšÐ÷ÌißPþ¤˜ÿåÚ_?â|Nª”‰…NEqT
+w­
+yÒýüLq§æë²/ òŠO®þmK 'tÜÆÈ$y‚)Ÿ¨aÊ›¥ÇWc0'~AÊÁã‚+N~y)*ÕÜ}ÛU¡mãATzºW±¤„S^’’š9u¥ÓùÇÛ_ˆ4ÂÞ¾ìÝý3MP[Á„l( ‡ÀŸfÉj $¶Lä¾­ :RsD™ù" >9ÙÐSŒð5wY£ÜR°zW6è¯'[モoäK‘!òØÞ7 §øaàÞgÞ€¢Æw»%jV2®Á¶ñ½€žX<]µ§îî>òVÇ[ñ 2=Rð_
+Š©£®6¤ól¨‰
+ªË¥Õbºé‡¦«îê•KŸaÜ»=/ˆþY|#_wù?ôá˜-©$Vùæªçã™jBC#ð>®u¨l²¡©@WnºZ£;Ƨ ‡¯Á,ü«‡
+®ºq]Xªä7ºÃn×îy°m£rØð‰!­è¹¤O–:þàªp©$_ø@¸éÉÏB»¶«úŠê@MÂǥለÔsÒ›!ÔOo xBþÑ-à€
+Gsò5Cê˜Âö¼TKhX%!ÌMC˜’†Áë Š*IÄbUTíêÀe垨–Ñ[ž+Ú»ÀnMù•ï4îJtuøæÙž|ò
+sÐ{á^@¸ñ5èÇkmTÿgCª´&QJ¾Ò¦R©‘*d»”"/ «<¸©ž–ÌEq™ƒH5ÁÂiOK¦Axà Zp®N0q³Ð^V»þÁ={¤ôØ f›šÅŠHÍïÞlFA·
+v8ÉÉ4’S2 f†(“ð23U åÙ™OeÕa`žø9€2I!²lú×
+‹Š÷Ù“€2RX}qÿHô’±æ‰±E6â€?c[5,Ј±ÇÁg€ä¯Ûàó)¢dóϤ.U{èêØ6õ-Š‹Çá§öP¯ <D¼aLKÖ1î¦FgSß±ð'ñwi1‘Rr2¥ÁE
+cþ†ôh¼K
+OœëSÎSm“Ôª|‚õÿÿ²½)endstream
endobj
-1358 0 obj <<
+1749 0 obj <<
/Type /Page
-/Contents 1359 0 R
-/Resources 1357 0 R
+/Contents 1750 0 R
+/Resources 1748 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1361 0 R 1363 0 R ]
->> endobj
-1361 0 obj <<
-/Type /Annot
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [361.118 743.8714 409.8647 755.9311]
-/Subtype /Link
-/A << /S /GoTo /D (configuration_file_elements) >>
+/Parent 1747 0 R
+/Annots [ 1753 0 R ]
>> endobj
-1363 0 obj <<
+1753 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [347.1258 350.3535 404.2417 362.4131]
+/Rect [375.4723 594.4187 432.5882 606.4783]
/Subtype /Link
/A << /S /GoTo /D (journal) >>
>> endobj
-1360 0 obj <<
-/D [1358 0 R /XYZ 56.6929 794.5015 null]
+1751 0 obj <<
+/D [1749 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-390 0 obj <<
-/D [1358 0 R /XYZ 56.6929 484.9636 null]
+502 0 obj <<
+/D [1749 0 R /XYZ 85.0394 722.9644 null]
>> endobj
-1362 0 obj <<
-/D [1358 0 R /XYZ 56.6929 460.3339 null]
+1752 0 obj <<
+/D [1749 0 R /XYZ 85.0394 700.3281 null]
>> endobj
-1357 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+506 0 obj <<
+/D [1749 0 R /XYZ 85.0394 132.4925 null]
+>> endobj
+1754 0 obj <<
+/D [1749 0 R /XYZ 85.0394 107.2061 null]
+>> endobj
+1748 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1366 0 obj <<
-/Length 3380
+1757 0 obj <<
+/Length 2635
/Filter /FlateDecode
>>
stream
-xÚ­Ërã6òî¯Ðm媃'G'ñdJ&³Ž³{Èæ@KÅŠÔˆ”=Ê×o7ºÁ‡DiR•-W™F£Ñhô €äLÀŸœ¥6:3³$3‘ÒΖÛ1{¾n$Ó,ÑbHõíÓÍ7ïu2Ë¢,Vñìi=à•F"Måìiõûü»Þ}|º¼](+æqt»°±˜ûðá{Âdôùî—ï~øíñî61ó§‡_>úñþýýãý‡ïîo2µÆ+æpaÀû‡Ÿî úáñîçŸïoÿxúñæþ©[Ëp½Rh\Èç›ßÿ³,ûÇé,µ³7hˆHf™šmoŒÕ‘5ZLyóëÍ¿:†ƒ^?tJƦ‘U&ž-´‰ÒxLjYD‚։͢X+ÝiYÉ)-*Ôò6ÿ²XæË[4ÅŸîtÑdìÕóÙüÕ„
-ñe2åPJØ7£ÐX±Ü9ŽÄMû`}´ØMþŠ¦‚W
-ú Qãw ›WÀVW® ¬rÑv»zÏmÝñx­è za^Y8"„*dµË—¸Ó‰°ÓÇ)ÛÜÕMÑ~AR“ò‘¡4óÒ5 µÔÏ õ󷼡ü°ñìè {ïˆ#5×2«šÐÀ%"ÌCE˜œš!ê ê­h7„ÝʶؕAʽ5Kµè¢å‰Avþ;°Û•…yÐhÜ.ÇQ©íÕ!Pˆ.`ZÁn/|Ì$'¾ûð¢ ʈ_¹uR£à©Dt–È9[ÆÆD‰òzJR]N©•4ËÝ¢,šÖU‹Ïw˜HªY$‘]— £ša”Tc¨G,äÒ‘ œT³9 B0I³Ð^W»vã“^ÚÓv
-ô ¸Z°-*Ž ¬VDjû°%Ý Ö¾r%ÁìC í2ª5‘±>ɨË%ˆ„“@ªl½ýaK)ƒ¹•3çêˆê¢Ü‰P^bÚAhYW-…ê’û6õÛ¼:ôôÝÇŽº‚(QÔUXæ,e[„¼[¥)éoE8ÈñV¯¤$·'ð-ä¾Pñõ–û¹t
-¦Zw±{ž]7n—7”qö_Òì…Ê’ù¿Ñ)8t`'…Oî#Bš¢JÂOÈÂ¥«Úr2:íó¢ÁÄLYehÿ e¢LÄXŸ&T׉§Çb[Æ‘”P| zݾ¨WÅ’<òéV¢äÍ'j>@òØCÄk.ù©Õ*26Ö×ýtHuÙO;*sYR±°(X„3GZR}]„ŽjB†±£&‘I³x,Ä›°šwRP‹±}&ƒôàë @ÖÏM]B0—sÊ+ñü#ÍkQ B cf•6dǾ’Dø­>”+¹"¬_™¬/NV]ö…cJ|b”Pj*’–>ªd… …“ €P8è@®ã„uÉÄFʘŒ‹–Éý:Qr*#abÊœ¢:pq¯>;â„}*
-3Iòs’ ƒàûã}3³\ƒ@W_ƒ@#ŒŽµþ c]ÞÔUþ\òЮl¸?ÍÁpX
-Ø34… /§jƒ±aWd{@ tØåòpÝqÇU¦¿r5¤ºì‰Êèc ÕÒOÔQ,ÍuÑ„ã<œF6³z,Ÿ"²Á…K¯À.é$  ²‡káhþ‰(»%PVÝ]ÊmJ H«P ˆ+*8OnÒ¦g¹Mkªá}ÊÒ‰ˆ´³±Mw^%³ØÛ'~Ñ«ðÛsRP@zExt0o µ%›÷p8š7~ɼ˜÷€/›7òFóÆoÞ y#{oÞž|>í4‰=¨øó6´=iÆW/* fì‘t ƒí
-1ÀÓÁÉ;ÙžÝKÁ3ñ©pj-”¼µå{L
-´_‰yª+1/Pá²›–‹•as5è EˆŽjBŠÓ°'dr"ƺ2Ôî„Ãvw†žg¦.ëºéåò=ƒ:'S!`]XñDk{äLª¹H}‘@O›Èª$9ñ'6€Xœ^õiï’ÂýrcäÓ6^‘PÚ¶b”¶‘Á8mï‡u¨qÛñ…–x7®’‡Š[ö3KAŠ=³G)@E&ž©ÄDq&ì_y~BišN??Aü‚4ñ^4N
-„´Q¬L2S±ŒL,h§> ¬ÀÆFzJHŽZ¶‚_ Þ“ó'ø¯æ÷gš¦ZAZT*Wû¬?û<Ã`–i¢À~±½<⛇­š}_Ã’fÃU΋!k¿®xü¬KLH  öÂвüÃT›Ç[Ç#nÛ]鶮òÇA¨èË›
-‡ú×»5=µÄšoð ²r“3qhHŲú‘º–%.¬ ýLß6®\ãÑÊtåäi²`56 ÷1íå 2vy÷½Éó|øŠñɱty51§‰“àýùjÁ/±:ƒú79¹8^íñšs"\Ì RêHÿWàÅWÍÛp–éYžÛ·”*‚NÛÏL¯ìírs&¤à(Bý… ¿&¤“RœÉ±Þ<Ï÷b_¢U¸R£++P¥Åé¯ø׆>üÆþN šý‹&4ú’ka9¿÷Ï:Øæ´(¡–(i,9 v¸2˜²æ©ò¦{Ä} nñ L÷]‹$Ž 0JÇõ懺ZTî…/ä” ì‘/êÿF¦¼Ïb;°$$?z#è+r%º^@Ñ+^èðJPá©XQÉêßËüѤ+¸UxÁZï™û$‹f*ZxÖ)
+xÚ­YÝsÛ6÷_¡{:y&bðE˜<¹©“sçêܹ¾§¶´IœP¤"Òqtûßo P D)í$“q,‹ðÛ/ˆOüã“4K2#Ì$7*IO'óÍ›¬`ìý÷<³À4‹¹~x¼zýN擘Ld“Çe$K'Lk>y\ü:Í‘\ƒ6}ûáþÝÝûÿ<Ü\çjúx÷áþz&R6}w÷Ï[j½¸ùù盇ë×)Ÿ¾ýÇÍ¿oh(ó2~¸»ÿ‘(†>g„>ܾ»}¸½{{ýûãOW·ý^âýr&q#Ÿ®~ýM°íŸ®X"N'/Ða 7FL6W*•Iª¤ ”êê—«÷£Q7uôü8K„ÌÄÈ
+ æIjL:ÉS“dRHw€»ivûë™LÍ´¼æÓšš}`ìšë©Åžž¶Ív]¶]9/:»ð E]Û µ'.Û©n:"‘˜jOäƯҭ½ä­Ý•Í¢œy^Ù¢.ëU»*“à©ÃÖgœ'&M…ÛÇ/[;/—{7 ¯¨M©Õl»$ª%Ë~cH^ž·nèk—8º´óÎË8̧FkwŸqß
+a:l€Ôièˉ¼(öC» ù‡ ,)ò4, DËJ“ªn¨øRnž7ØÉhq¢;3’ÐÔ‡u<E+&ÅÙÙônIŒ­íˆUF{_-ÈÜ€NPÀ‘
+#VîÐà ±õ¦èñ€MBš3Øùüù²%f©
+pìˆèŒ¨EWySÿƘX=ï
+ã`
+R*ÏàŒ¾US,ìÔVBOo–ÝIB½@iÉXD ÈÁÅ{Ýžìªô+!*l=s;½eJ‹OÏãC“Š
+\nžˆ\ °®<Ñ©!F H3År 4J¡<>@¾Ç§ð¿˜ž:K Tq•Ë$n/“O8$eà”OÔv;=œ€#¼¾ÛˆÉ ìgoÉËE‚ÝŽ²Q •¡’¥Y’g>©¿o\ú¦§ûk¥‘ï”›me7¶v¥ #ÔôõE4´Ìɽ«Ì$Dô$>Ùo»,HbÁA­=;”Èߥáý3­äeG¨D
+ •ö<K¸€xÏ š>:‡Ül°„ýˆƒ
+•Å•›~㪜áJUh
+¬;êUKä'ëb’í§ç¢ƒT)÷¹1[âì+0 Î×MÓZ/¢ Oí\%Ž8¹³t¤a´ÞiIqvÍ>!tŠ.‰âäd$½ÅäÂði‰µ
+Ï\:Ær}OCó
+7Ö…qÏßµ¶Zb]¥úLò8Ð3@Mæ-²;=J%Lù|‡y¿¤wÅGëµ+ê‘u
+sxš_,(Yš)ˆ^"×QZ»³m;â*™æb"ó,Ñê’Åð-sÝNà,–xŠn ;Ï«ºðUtóõIXçJl©¿Ÿ‚½Ä¯hÈ9dí’™§‰¯Rðpî©Jæ”`y0v­§ua ¿™{ ƒn‹/L®æ‡Î!Ó‚<…Oo 87
endobj
-1365 0 obj <<
+1756 0 obj <<
/Type /Page
-/Contents 1366 0 R
-/Resources 1364 0 R
+/Contents 1757 0 R
+/Resources 1755 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
->> endobj
-1367 0 obj <<
-/D [1365 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-394 0 obj <<
-/D [1365 0 R /XYZ 85.0394 590.4054 null]
+/Parent 1747 0 R
>> endobj
-1368 0 obj <<
-/D [1365 0 R /XYZ 85.0394 563.4931 null]
+1758 0 obj <<
+/D [1756 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-398 0 obj <<
-/D [1365 0 R /XYZ 85.0394 179.4044 null]
+510 0 obj <<
+/D [1756 0 R /XYZ 56.6929 439.8265 null]
>> endobj
-1369 0 obj <<
-/D [1365 0 R /XYZ 85.0394 153.6629 null]
+1759 0 obj <<
+/D [1756 0 R /XYZ 56.6929 416.0359 null]
>> endobj
-1364 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F62 1062 0 R >>
-/XObject << /Im2 1051 0 R >>
+1755 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F62 1352 0 R /F41 1208 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1372 0 obj <<
-/Length 3131
-/Filter /FlateDecode
->>
-stream
-xÚ­]sÛ6òÝ¿B÷tôLDŸ'Oiâ¤î´NëøæÚ>Ðes"‘ŽHÅñdúßo P Ù¹I&ãàk±Xì.ö‹b³ þ±™Ò©.x1Ë ™ªŒ©Ùbs’ÍnaíÝ s0s4¡~º>9{+òY‘šëÙõ*ÀeÒÌ6»^þ™è”§§€!K^¿¿|{ñî?W¯Ns™\_¼¿<s•%o/~=§Þ»«W¿ýöêêtÎŒbÉëŸ_ý~}~EKÚáøéâò ÍÔAzuþöüêüòõùéß׿œœ_w ïË2ùtòçßÙl ×þå$KEaÔìYÊŠ‚Ï6'R‰TI!üÌúäÃÉÂ`Õnòe)šG(YŒªHµàÂ2°oïÛu{ûx:×Y–|Š͸H –ÉÙœ±´PŠ[@–™—v9/ü‹ Ä—“UÐWB 0gL¿¤@L¶÷í™GO¤Å³·œ—@ôyZn,ÌC½^ƒL Kî·§Ì$ÕªÚÒ¸«¶Ÿ«m‡ž´ M6UÿÐn?Ò€eÔöwAmÚ®Ý"YµëuûP- âæ‘Ú;
-]¿`”–PAÝ1™
-K®ážX;À™å :%ÀHe™Á£gŸf,ÍdQ
-úö®{؉³‹ Ÿ½iáF³àRñ<Äl/¥C[
-ÞoYõÞÄI³î^@NĽá}nvˆ/ËêŠ:½³cõb©QÊÛ¡í蘷[‡x¢2
- Ƹƒíå²èîÉ3Ûj]¨™
- ³
-N‹Û[g›®‚
-èäMÙyàÖá€éÿîhH­"G?Sw~«åñjúiW;X‡iàq <ÅšÔ¨A¶¹Ä r^$_
-c]„꽑٠nÍZKoæ/yhã¤vÌèC'ÀÍ¢aµö7¤.Î5 ¼ò#ÞWÊ&F
-©Ü”=$#XVˆFÌ£qÀø Ä(s¡ÇD‘$(…Ђy~cʇ©!–Ü:ÓÔ;Õ=ÉìMC3›Ö[u÷Õ¢Fu^XOO†×
-ƒiÅ7¥Ùw‹J ‹<#¨—"Çóµ€{ÙÚgÉjä¡ßÍ d4 C
-E
-øžó»~nˆùÝ)ޱ߼ßå‡zÍArW‡GDü®ƒzŽ’lß1Ÿ—6‡F1´÷ÔYƒp×Ä´ 7ë'%Æ$èQ1d+O›&¤Üì:¿ïªõŠ´Ff€-“z¬5hËEÎmÌécR}¹_׋º£e
- ÚŠ0H”lEHˆÎåw¿Ðã<DyøB™‚7Wùþä£f„™Ò@0ˆ?ŽHñ9"±ÄÀyÌŒH’‡@µ!”UÛT$,Œ#p¢h©SQÆŠ>SçŠb@D²E¥€üŠÊ\Ý×l6…·“ô‚'¿“1ÅS,kŒc¾½·* °ÛTÛlë¬Òñeòêõ¯Ô¡t{ö^ЖØ@J^u=Už¦Žƒc)C=ãØ 8NµR<ðà4Æyˆ2æ4TŠ2 Ž;60º…
-!]:‚!ù˜°<
-w8rø®t@7•  gé©–øX4¤æãÍÜñWÎÅ’„Œ0„8¸GƹãmÔŒ[Ñ|D’gð@î‚xÁ€=‹~‡iƒ`˜VÕ›º¯?W4Ü–¹Ì§å4ðŒøÃØ„?Œ‘B
-¬¾ÚÒ¤\—Õ—žà6örøáÒì+n8XÎcvtLlf_Úu%P“°sM“²3.iÉQ„¦ši§×
+1762 0 obj <<
+/Length 3018
+/Filter /FlateDecode
+>>
+stream
+xÚÅ]oÜ6òÝ¿bßN²
+?%
+yJS;qÑ:­ãÃ=´}we[ˆVr$m£è¿©¥´ZÛwñá`’Ãáp8œ/-_0øã £c&3µH3kÆõbµ9b‹˜{ÄÎÒ#-C¬.^ŸÊt‘ÅY"’Ååu@ËÄ̾¸\ÿ½ûðö×Ë“‹ã¥Ð,Jâã¥NXôÃÙù4’QóîãùéÙû^¼=NUtyöñœ†/NNO.NÎß/¹ÑÖ GáÀ‚Ó³ŸOzñö—_Þ^ÿyùÓÑÉåp–ð¼œI<È—£ßÿd‹5û§#ËÌèÅ=tX̳L,6GJËX+)ýHuôéè·`0k—ÎÉOKk#Ò
+>'@ʼnÒ
+ÏÌ“˜Kc,º¼-è„]ÓöUÙõÔûÔç}±)êO tE@—-–ÂÄ™I´¥H¤ŠÚcn¢¢»kêΎȨoh&§î矨ÿe[´nòš\Á2ÚF›kÜl«¾¼«Æ4[ ¬F£«Æ¶ëŽþÁ4»¸è á„uÝ´›²¾¡Ùü?¡À#sgZ {ä®@>3å·)zÜtI)éä“u¾qPW´_‹–àû²ªÜ<°”WÕõhÛ~ÛÖÔŽ€¾_Ùß–ãYÙÝ ôsyM ËcÕë¢/ðäp4êÎìŒFÏ ÏsµEz,® p3RƒP½àÀFkÐT»²meÓ:•Ñ,œ{ÜnP.Køž<+¡dÌx²HY§R[ý¦¹öfAÀEð <ú2ħ÷2±GyùT¬ú²©‰ÿ8Ô”!ÉU,”s´÷0¬'Ù§æd*$²Ä©0´ªÊAL^[+R%œmÖ¯»m¶Õ:ÄËÛ6¯o‚ ´
+ß$Ž–I'»€N^åGn­™ÎðŽzÁ­ IèdÊÎ/µò1^M¿lK‡ë( R# „»X{:k‘U«’à¹è~ û ÷.ŽØ¦ÁâÄ$jðbû6ŽƒçL”òvË»È}'ÁCL±oà$øX´ªÖ˜b窨š{ç—2¸¼ü3žgòzŽpö&ËGe rÝ·O6¤&]$€.„QωDøpcæãå@q’Ü2$ØK¤z·3²¹ÉûÕí“JÅFrñ‚LzŠO1©ÒØÆÇL¸JžÆ2‘Ü ¼^Óí”58Rg›zwceO—§¦‘MãÍöº»bU¢>¯¬Ÿ'Ëkà,Jš±ƒmÅG•ðε@e©cªo¹y˜á}œ
+ó‹òU¿Å¬Ar̪ÊMÙ—_ êî, g.±ÃaÇ9u:#ùp>‘礀¸í†µ µàÄÀÏûm®¯çNE—/²iaId” B»i¾NF†EWÅMY×”ERóÑ|HÔæf2:›â„>_Þc›Sãªe!ñ{Ç…·æ¯¨¤ÔSÒçHÏ$¥]7nEg«1N²&ê]Vß“€S/LHúÈö”{ÜùĘ8UL>aqY ÐÚ…–Ë;/`Ì<ÅeHr.‘
+a0#‡·u¬öÏœ¢F×)çë 8ÞÝ6÷5W@¢)£Î¡PV!y(o­eôÛ ˜€?QLÀz95NÃ$Uq-u«|@a$͹R«?®Ô©×I€‚ƒÙ¾+è"8UyMwˆS.HÑ阬 4´÷‡zz–¨õ¬zz!”ŸxùÌ\ÄNZ:›JKžñ.áqÒ¸º¦ÇX6ì®Üî>YšAÑSiÚ‹Ðøˆp—ž9afN˜3§™¾e4ˆõ`Ë–Àu9ªccÑ4xÁX^ %öúTñɇÁÀzî¾(&ŒEY¦„Œ3üP:bíõkB9;¥ÖÊWõFÐ
+vFÇüÚË'ç]—­ßóºt
+ÙÚWâ
+SiÔ•›²Ê[´E í™Ó#æ¡G K0=©“%ÖÅ]›nÁˆÿ-T©8‹¿9..‚X—QÎp0¤,Hkˆl%WLz9"èCÄ!B‘å_mxƒ”áHWj”ÙŽÆX´8DØ ã×4 ³t K±¡v—yA' g‰‹™gàM`äp÷F¸/ÜôC!h&*
+¿_?ü*¨V:÷Ó6©c5ÿÝ þÝÎßý³·ÝoñÙ1âÀ<–€¡ÌRÏž8ÕS·ßÇí³þoòÒ!endstream
endobj
-1371 0 obj <<
+1761 0 obj <<
/Type /Page
-/Contents 1372 0 R
-/Resources 1370 0 R
+/Contents 1762 0 R
+/Resources 1760 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1375 0 R 1376 0 R ]
+/Parent 1747 0 R
+/Annots [ 1765 0 R 1766 0 R ]
>> endobj
-1375 0 obj <<
+1765 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [213.6732 432.1255 286.8984 444.1851]
+/Rect [242.0197 702.9298 315.2448 714.9895]
/Subtype /Link
/A << /S /GoTo /D (rrset_ordering) >>
>> endobj
-1376 0 obj <<
+1766 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [209.702 354.4169 283.4678 366.4765]
+/Rect [238.0484 622.4676 311.8142 634.5272]
/Subtype /Link
/A << /S /GoTo /D (topology) >>
>> endobj
-1373 0 obj <<
-/D [1371 0 R /XYZ 56.6929 794.5015 null]
+1763 0 obj <<
+/D [1761 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-402 0 obj <<
-/D [1371 0 R /XYZ 56.6929 498.9148 null]
+514 0 obj <<
+/D [1761 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1374 0 obj <<
-/D [1371 0 R /XYZ 56.6929 477.595 null]
+1764 0 obj <<
+/D [1761 0 R /XYZ 85.0394 751.153 null]
>> endobj
-1370 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1760 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1379 0 obj <<
-/Length 2398
+1769 0 obj <<
+/Length 2587
/Filter /FlateDecode
>>
stream
-xÚÅÛrã¶õÝ_¡Ù'¹Á¸Ø<9[{ãLãmµÎd:›} %Êæ„"‘Z¯Òé¿÷àF‚e«u2† xpn887˜L0ü‘‰3Í'‰æH`"&‹õž<À·÷gÄÃÌÐ,†úîîìâš%´¤rr·Šp)„•"“»å§é»ï/ÿ~w5?ŸQ§Ï„ÄÓïnnÿêf´{¼ûp{}óþ§ùåy§w7nÝôüêúj~uûîê|F” °žz G\ßüíÊÞÏ/üñr~þù«»V–X^‚™ä·³OŸñd bÿp†ÓJLžà#¢5¬Ï¸`HpÆÂLqöñì-Âè«]:¦?ÁŠ&#
-ä$R % î„F’Qf5ø¯ó™ÄxJ4ED*D/(ÿ¶?ź©>A“O¢8 i!è3˜á&/.ÜÇ›k£{T¥›Xi]»á»ÁzKŠ2¤ Èp
-%©"Jwß_ݺѮÎÜ
-¢ý³º†)G‰úSffêtõ°‚ð÷÷>‚ÈψÑ;ÚRx‚QY5npŸ¹§±¡l‰Ü1íÅÒö˜&·,òº È—%‚{\k!F©ßFï SÝ÷sxÔužlÌ€{™JÂ\
-`ò"—G0 œÏëÌkâÃv ª¯3ê©($N¸Eòócf½‚˜®wE“·ÎÉ›GeŸËÚ¤n6†hvÛÒÚ |ÎËà{<xY?Ù½3ß¼_Z§{7qïÑ@xZí
-7gÏ.<ÁÁ˜>ìbzÞ߉©ç)ó~Ðú³øñë#[²)Ò…åš3àÚ’åÜc€)oÒÖ8¿[5ýpG#œüív ;0«ŒòG4/0 Õ¶nÒ&[;·$7ÙvÛÃ
-Œtò§MnÏ@X9áÙrÙêÁ…Xw
-H@„a=ÃÎÝbë àY¼õñÄs’ž~Ì<|ZÔ•5ãzS äÇ\]„sx¨4Ɔ‰Î¾fðLp$1á&©š˜TÚ}Û>LÜ`åÞ|ÃÛÔ»O|ˆÕ0ñ¼¤Û[»¸3Ȇ q*cBõ8:¨Z¨9Äf8An?#Ô’÷SËrLïÒ:‰Wgk¨1ã„0
-N1‚e'UCi¥Ôx-4k1Îb”NÈsTÃ^óŽ°ÝòM¶1 JÇ"œ»ÜÇ„efŽóGÆ
-ý´KÂê·Þß‚*5æýHðÉ%â–`1!‰ ²$žP ÕÓ§PÙaŠ¤fòõ g1J«±sĆ޶隉¶#ó¹¬ä³Ó̧f¿ÉF¤·F$ v€b¡)iÜé&t‹ñ¡)MäL¿Bê¸/µ€!úͲZ§yyàiÀJµÐú¼Åø‚àŒh3&¹FJ%º/y:G¤§ˆ*%cß0žAWoÌS÷ÎÉ…d¸&s*”¶f*?'S?4ç97§4[BeÆ”ëfÁ2[¥uü’zÔ}÷“I8ö—·ÿw Ró`»È¡sÌ)Ϥ×{`i“µ´ìÇ£¼é˜7u„·„!NÛöoòyÞ¬uF„@á.™"²ŸÄôÙ ÁÖ;BÏ®y Þñ8acŒc–Òž‘¿Œ°ÍA2ÈP€EãbÓº;©…1ññˆ†fÉXI «Šì!õ™û—´Øe­“ÞŽ0§`ìe£„˜è6¹ò‰êÛWÍÄxL¨ŸP‚µ:åð2®
-²ž H\Þg è«+ü*…ÂÄÚšSé¼W pœ ‹ølóIl@â´ÝÍïõC8,`ÁÓß«2Ëèͪ"Ci˜HI'±j^§n³±P¨.}>eXq|1ìçì¥Ä°€aíªŽ´\ºÖƱ"Ö{›Í·(p[ÔÕ:À8BƒH’ðé3jäyŽ:µ‡.âé(Ê£j‡RÏ(ðŽ«jx"\ʸØ/Š|ñ§©Ý×ažJ\íÊåÌîìáf ǯ }3Í”½öÓa­í‹â§¼yÔ’ÆïÃOf¶59ó~cfk^LQº +¦£ÍÕEµÞ䶰dp®Mj°ÎLüb¶
-aBe_§iñ”îë~‹ø¸ß}&ÈÙ×eh;GéC5žîçcÄGFnýxÜž;L™¹p~rKRš³7h¯ 6›,µ¼tõÅ~D¸¶û
-1)H;˜ |'XT3p¸@¤È³»“‡¢Ü\¤tÏðäÅìÔûú©´=Ò Í3e”&ôóöbÿõÿ
+xÚÅksÛ¸ñ»'Ÿ¨Î Á›Àå“/g§¾é9­£N§“ËF¢cN)R'Rq|7ýï]¼(ð!;©¯ÓÉ$„€Åbw±o„$þDH$5ÕI¦9˜ˆd½=ÃÉ'X{sF<Ì2
+|zóx9:Ð]­[|yIc
+:ض˻b[Ô;rWì·e×:BŽüç]ÙÔÂò ßžÊ^æ¢í¾ Èœ(À¤¨Î†g/T'wŸHà×O<wÁé»ÂÃçUÛ¸Q7/7•esdìp*4Ɔ‰‘̾ûF%b|„¤)N”ñnqÿ)qƒ›ÈmôðËxƒuÃã'x ¿ë?² M:CZi6 iâÀz¨§(™`3” w¥Œƒjiœ@Ávñ¼ž½Dpy‰öº'I¥²DýÀúk9Ú”šwãË€o!t ÃÉ,ý±öÆwÅzF+(E‹`JeënbS«qîÈ(¡Ÿ¾mªª¹o¿÷î.Tc$•Y ï×UÞ¶î Áâƒ$‚ØHüA=T,-BÊ°'4C:“ìÙòê1.c”VbâÜeFAb=˜!²Î·ÅœÈ
+a¹.»Ò†
+†Çµ.,ÛZ7†í˜»/«ÊMnón}7'–>VâtýO‡÷уþÖÃ>åob¥zž¢uÿØûD,"5b$ŸP:#%é 7)ji¦Àló"PÀsÁæ‹ÚЕc¦e¨¸ói—ÍÞI¹ø’ow• ã£vž¹MHp%V“ÆKÔË ùéàæ}bj ®®Ý×8vtî>.3£¦Ý‡<%4ø…›Îr®ñÕœÆGPÎœ}Ïo–°¾ç7j×A1¦ˆpñÚk¶”é:?´Eè·=Ä/×’±-»ÌæU®}fy4£ó“>Ù·ð¼ÌÐÉ`êîrßûË?{TÇœrp;TSPò¶±gØ„P!MKrcÖ<¹û´‡[C­õ@ÆsdÄô }’¬6áf Ó¼ºÏ¼ûýø¤ç}$ÈÙþÖyå3×|Â~®5ömž>vñ'<¹UòìèÉãÖÜ4_æÕŽì“íHÉ´·Ö»]‘[ZŽÅÅà suãË ¸WˆJC¸Álä=A£º‘Ë…Cª²hÑ©—È¡2ÙW=%(²µà'nÅ@Řþ—vŒ\rÿd”A>lØõÊÙ€5 U¸p%\îpÝ„
+08:ù5!àcµf([^2°/¯¶4ù±Ž’ˆ©€xc¶LÉ*ÓqÊŠ@ù‡ˆ+PgNLÞ¤f´/ª"7îÉü0‘Ú|]bFtŠs}lËAƒ‡c„©Ô½/`‹ÓäÅÇîÅ€0Á!)îK먹nÎÛ4…'̪«´‡ÝθFS]¸›åDz€ ¢Ø×flpĬk'æÙä$R§ yn %¸ÁcÊpã< ˜¹,=f0³íN´Ñ©I¸ Î*lrXG™üèÊm1%À¦3·¾\§?qJçNXF¼R» òÍÚ}-ÃÀ,ÓÇâ „mÁ‰ºøswÓ< ’ ª´Jb zžQó”æò¤Ç]ÆÐÎ…yu›- ŽÁôos¿ͭ²ÑCí¯càìh.¸‰,C4“äÄ+§ƒYF@§) @†
+2™e×U“?Ø»†xìÔ
endobj
-1378 0 obj <<
+1768 0 obj <<
/Type /Page
-/Contents 1379 0 R
-/Resources 1377 0 R
+/Contents 1769 0 R
+/Resources 1767 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1381 0 R ]
+/Parent 1747 0 R
+/Annots [ 1771 0 R ]
>> endobj
-1381 0 obj <<
+1771 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.6787 434.7534 427.332 446.813]
+/Rect [325.3322 626.0361 398.9856 638.0957]
/Subtype /Link
/A << /S /GoTo /D (the_sortlist_statement) >>
>> endobj
-1380 0 obj <<
-/D [1378 0 R /XYZ 85.0394 794.5015 null]
+1770 0 obj <<
+/D [1768 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-406 0 obj <<
-/D [1378 0 R /XYZ 85.0394 505.3435 null]
+518 0 obj <<
+/D [1768 0 R /XYZ 56.6929 696.6262 null]
>> endobj
-1022 0 obj <<
-/D [1378 0 R /XYZ 85.0394 477.7522 null]
+1294 0 obj <<
+/D [1768 0 R /XYZ 56.6929 669.0349 null]
>> endobj
-1382 0 obj <<
-/D [1378 0 R /XYZ 85.0394 352.0635 null]
+1772 0 obj <<
+/D [1768 0 R /XYZ 56.6929 543.3462 null]
>> endobj
-1383 0 obj <<
-/D [1378 0 R /XYZ 85.0394 340.1083 null]
+1773 0 obj <<
+/D [1768 0 R /XYZ 56.6929 531.391 null]
>> endobj
-1377 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F53 1029 0 R >>
+522 0 obj <<
+/D [1768 0 R /XYZ 56.6929 132.8855 null]
+>> endobj
+1774 0 obj <<
+/D [1768 0 R /XYZ 56.6929 106.4421 null]
+>> endobj
+1767 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1386 0 obj <<
-/Length 3099
+1777 0 obj <<
+/Length 3335
/Filter /FlateDecode
>>
stream
-xÚ­ZÝsÜ6÷_±Ú™Já—HñÑMœ{=çÎöÝÌMÛy—v4Ù•6’6Žû×H€úØ·½Ôž±(@ø€Ì ~ù"×™¶Â.ŒUYÎx¾Xm/Øâ ÆÞ_p¢I#Q:¥úþþâÍ;i6³ZèÅýã„W‘±¢à‹ûõωÎD¶,yûáæÝõûß^.Jî¯?Ü,S‘³äÝõOWØz{ù\Þ.S^ä<yû·ËÞ_Ýâ&ß_ßü€=g˜Þ^½»º½ºy{µüõþÇ‹«ûa-Óõr&ýB>_üü+[¬aÙ?^°LÚ"_<à ˸µb±½P¹Ìr%eìÙ\Ü]ük`8 SOíß@ºe’åü‰å"³6W§Å²EZÈL+iÏóÂy xQ3Θ³Wy–çb<^!œgúüùj‘IÃõÂä9œ¹Æó½ñ;(m–kÅ=!gY.h(>,SÍ“{ø+’£ó
-
-_×ËTñ<é?V¶Z·qeçð¥yÄ'Ú¢oÙïà©,Lp¸ZNDpÅ2&´¥íhÛ%Lé\Ÿ6íR°díZš4Õ+W™áJÓœ®/{·uuòÖ#ÅꆺºýnüRÅêùEõ câëR²Ä­ý«—³H9˜¾
-hųMëIabU?i›<xõ^°½vžO¹ßôàŠRñä]Eœ‘àÄüUY#‡OW—ç&N*{¢l¶»jCT}µuÇ
-t;·ª_<s¿
-µG+ ‹BÒÉÚÓ¶…ý;
-S$MO^¡á‡VMí§<í[7R‚bÛ²^ã˦ª?»ìЈ•¶™(l±˜:зù¤÷þ܂Ѥ#®|bÌÝœÙàåüˆkNÎß#ˆs “à€càÌ\Ød_ÓiÌ
-«¸
-|NçòÀó`t‘i> G°!“}¬Pí%ê9‚ô¡Æ=X%ú”Ÿ‡ž­Ç¦¥®®£>Z¾Tõ0eÅýˆƒjfþ&F­gk%P5¨oä|Äò?²96|Üœc<´™.”‰hÈNᄹQìÄå ‚#6?6ûvDÆÍ Q˜ÿŸæP†€×Kq_W!Æ$†ö«|!m¼ý"*CÔÂü=6»Ðž« ÊAMÑgÝo^GÚeÑ \ć fèº#I#h¡R‰'rŸ>B¼˜Îâ‘Ò
-À„¿G¢óh‰â6ŸÇ"Ø"k!cyMö@t,|ŽD€ŒžI§¸)×ÙõôªÎ£‹A7º4ž?V«³9tñãt€z¼Lt‚€³®ê²}Áo”»¦«ú
-B¥/.zÄŸTŠp¢µ@¢&MÁçî8†6Ý“ðlj/´È“gç>a—f°éÍ
-º×aöox 7Ø»-_°±*÷Q–a¡@úyï誄ޞf`íÛßï®n—°Uÿyç«!—×?}‡sr<‘8yM¤„ܦézß²¸£öâ¨ôûݺuvŒ#··]8Vßö+ïöþÀ<mI½7wø w‰x
-Ë÷]—ðóæÛ1¸Äã
-•Iuè„åjåv=F¯¿Ÿw³ýÒY‘›‚®qâ’ɳàÈp
-‰8\z2„õÅÉÄe* ÅÙÚ¦Æò?Q'ÀGI}ÔüœÃMW˜3µ»Ò‰,8XÉÿŠÚ]w‚dQؘËü/«ÝEÆé”óqíÎÇÇZ*p,& ™c÷Þ+3`ÄÛÝ&ÍÕo**ûPZö|)gºŸßvDö^[&ÿL)çu‚}ÉŠÂØPOVpżfp{f‚öu0¨BlW=¥!½¬ú—4 ?¼›2^ºYL[¤:¡Çì4Á¿ ùŸëqç«~>1 7Ÿ‰á€1#¶AgÀ63€Ð*7ØG ¸Ø÷û!å5>Æp5’ 95ôÂÂ벟dÑ0^îûf Ù fÄ©aY!äAùtµ¿½•Nž\íZ
-áµìè‰⌠¥Hwx®_êr[­ðe¿ƒ¼ÞÑD½n=X; š3U2¾Ú
-ò€Àopšgʘhû4+Üý†>­çªÿ8ªÝ36 püûÕ—œ‡q¾çO|˜Z.†’ëIð6™•¢8—šuÈäɳcCøÍÿè2~?†[ò“3ŸN!­ÊTLH)üØwlö l²¹cÕÿ¿íîendstream
+xÚ½]sä¶íÝ¿bß*Ïœt")Šâ£sçK&¾Öv:ÓIó Ý¥mÍi¥=IkŸóë ¾Vk§s3µ‚ ‚
+ÇT?ܽÿ$ÔJG:åéêî~4WÅYÆVwÛß‚¿øçÝåÍyÈe¤Ñy(Ó8øáêú#b4~>|¾þtõã¯7ç* î®>_#úæòÓåÍåõ‡Ëóe’ÁxN3œðéêçK„~¼¹øå—‹›óßï~:»¼ë÷2Þ/‹…ÝÈ׳ß~W[ØöOgq$t&WÏЈ#¦5_íÎ)"™á1åÙíÙ¿ú G½nè’ü¤È"™qµ @ÎGd1ÀIºRRG©à ðç|g®+a[Iäe[#´©«®9gYP—­ÅÈ {4D´«U‡p}ß®ØQïÇëÛÛË?åe±Í»¢®pŠû¼(nVÓÒ\Ø¢5óÍ£Ùˆ8 î͸¯ðp¦]Q¡•>ˆ d,ÒRr·ŸÝa‡'ä8ƒ¯ˆñÛØÒ¶ÅF¾ß—…Ùb£«ñ»Î áø@Ѐ
+C£
+š²ó½å <ÛÝú•ºéÄ¥i[?2¯ÙŠŽ4)Žb J®Xi.Õ²åQ8¦ÂƒgK–ã©œ òoaåvêv0[žI%\ë××縉hžL£„11åàî\óÀŠˆË
+ôGÆÁÇúдÐfK'œñHÇ ÿß8gD¾É«ªîpómcÐ˨@‘¼òâƪ°°
+õ\”äWÖämÚ¢„ƒ/_È•4çYp
+Û·´¨þýÉFXW?¿Ã±kƒ3Nnvt9–!² ¬ÛÎB%Ú"{5¸1ÐâÙ ÍØssÓºcµ°Ýy{°fisÂ^ßâ×]*¶ãÁmߢ.àïý¸… ^‹g„k"S
+¿”̤<Ñ
+2¹T¬Æ"ý¾SL©!u ‡Œóût(wa;­¹(%^ @† 2êvÚ›õT.Ä+B—hÝKèÜ?´ŽÎ_ÉHe_8ölžjÉY»*… sÂÈíÞl
+›£¸»Où€@©Á»Òy7Õ‚€žkÄÑ
+¦d“‚÷
+¶¤_Ä÷úÅÀÛ'IüÆãÙ˜ê´~õTsýê^öæøùLC*§¯sÐS-°0Ùmš@¢Ã§, ª¥ñU>û¦xBM€ÆÍG|½vVD9V²JK|[€6½CD§EÏ]%ÁC«b®d^µU"†BµLlMäTú”$°Qðát¾ë¹ ®°Ð×Ëè¹
+´GĉœFWv1FEq&íMi":ãÄ›•ƒ<Å>oòÁX›ù‚7
+øL2xè¶UD¼Ÿ™­ÉoŒ_ÐŒ©põ~’¶ƒ»#PZÅžàiu d¡Þ(©^QwOÕŒÍ=¸ÐÇÐïðèì{ÍÚQwÍË1­G%噶ohÙë[è©ö0IÊ5¤"áÓMÜá«(åÖ-6F¿t@„»ñ-àßqÀ€þFá>Ï`jW!+ôÚ<æO… Ñ„Ü) ÿX{ï½=ZŒÀ‡]ø#øóõ`C…æ…¨Šø€£I
+Hà†D=À¬¥uÙ
+,Ðv‡5¢,S--OÝ`-e¾ÛŸú}–‘ýQÕ‚“‰ûØâ»»5ü°-Qdü„·²Ï>\+Ï”½RsÎûy³þ'oPÑÂendstream
endobj
-1385 0 obj <<
+1776 0 obj <<
/Type /Page
-/Contents 1386 0 R
-/Resources 1384 0 R
+/Contents 1777 0 R
+/Resources 1775 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1356 0 R
-/Annots [ 1389 0 R ]
+/Parent 1747 0 R
+/Annots [ 1779 0 R ]
>> endobj
-1389 0 obj <<
+1779 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [289.8576 239.4581 338.5646 251.5177]
+/Rect [315.1789 427.0782 363.5077 439.1379]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update) >>
>> endobj
-1387 0 obj <<
-/D [1385 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-410 0 obj <<
-/D [1385 0 R /XYZ 56.6929 661.3973 null]
->> endobj
-1388 0 obj <<
-/D [1385 0 R /XYZ 56.6929 635.5371 null]
+1778 0 obj <<
+/D [1776 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1384 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F63 1065 0 R /F21 714 0 R /F41 939 0 R /F48 953 0 R >>
-/XObject << /Im2 1051 0 R >>
+1775 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1392 0 obj <<
-/Length 3978
-/Filter /FlateDecode
->>
-stream
-xÚ¥ksã¶ñ»…¿Už91xò1ÓéÌ%çK¯m.©ÏéL'ÉZ¤dö(R'Rö9¿¾»ØDR”œNçƧ°
-,˜Í‹GX3gªÐeÚ¨ñ!@#;`3ܶE»ëA5VmÓ“µ¬©£d´®Ü?¡ÀýùSGÊ¥RX:MÕXŸÊÇü©jQW´^8)Ã/ víÍ<]èÏé‡-¨6‹_…_7rQî_ È/÷éÇ·¬ófSv€-y£ýp£>LÖ‹u^ÕN1î÷yÓ­Aýàfja?w¸!5
-Ú ëÔ…Du¼=Ãe©óínNê½AH³8á–‹eÜBaÔqËɸÅÚâ\¨Ç;ôÈ¿
-¡JžKú}F7' œµÁi°±÷Œ æ»]à y¿¡©–ÚF&•)»¿©‘žñ—à àöñ’‚¶éÀ{7°ðtÑÑùú-&n Q›’<A™©É6dHµµQb¦Á'ZBÃaeY~v¶nŽ,aúøáɇ¾eBTœEƤžQ ròòç?Ý)Ì‘Ç'^l²S^VÄ]*‘œݨU“ƒžõëVšH
-Ý{ ¨ó¹B/^SãwèÀÿ7½óí¸yñŸC‡ç) R4w)äc8nØfÍù·u*­ä Í+@ß¡;ä5tμsQ´Éˆ
-± Mf QH
-cƒ¯0‚´e4£ß´$Êl‘Z$l;‹„À‹¤’(M@yĬ6N ’‰¬MìÀ"áê9ýŒ,vøãpº¿~Š³HNá"l‘FhÎö8™BtOÒÑ‘EBÿ5´HJ˜S‹„H\At².-Î F½EÍ1ÞOë1òqù£ ä¡ šq:ç-pë‰UªHôÛån ÐÌiÛz¥Œà;çÎ à ŽÕftÂç(ƒ õG½Vð¼×ºîiGVëì²Qb7ª‹Ôsg~].álÉGŒlk¬£Xéô2k†ŠqÙÒ¢‘ñ)¤IN¯¹Š€
-¿ð—¤í2øauÓ Ávd¶$wœ–Ã}Α¿x¸Ô,ÞW$}\·¡ß–Ê’ît´3!§ÕÞéDůœ4‰B\zt•HêË®Z¹‡k–_—>¯£8=¼É-…js•÷„+ïI¨²Ó°¥ŠWêq'9¿ƒŸŒâ‡åªÝî€îvœ!³‘z§¶Fã™êÅÇÖ½$áA) Åÿ„^‹ ƒ {Ðá/'öVc¤¢
-9Ôô>‚N#›™l¬þb«DŸ“ \°,É+¢FkíSmgÿaÅºÍ ¬9ÎÔ ÀKC)ãlä¥ñEÇÿB˶ۊ9ÔµÛ’ûÖþÌ•Õc¹úÌt°â;ž¶Xp­Yü<{Wî‘^+0(!—‹(QÉ$JÃÜLE`8Õåë4ÃA¥2”-ÎsPã¹pnøWßåà*W‡:ç’ë)[3é£Áp,X"s»9(ÁyélˆÛÑ>EK§jÚž:¨ôåÀµ¯)ÎU*‰yš¿ûüyî¨"Ò:™;© !èê&pe“*q™»:¥¥Â½UáéSå°“‡Õçˆ6Jc“½F¤±ÂŽ¨¤E·˜¾»Íx»¡Õ€¦„õe èêò-CŽÑÖåSYbÞy‚ý.Ãú%é¢Ó;)Ò‘æé3
--¦Íâׯ™‘6hBÛඛÃ>'ŠËsCé¸âb1x¾ÜRxg\u¼»DŽLñ9P x³!ÐLSÄuáÚ3UYÆgz×ÀŠs΄?ð˧V„¥‡ˆ¯ûª(œ™Õ ?¥ô(”Ž
-팰¸z»yÈ;*¥ä4 «jVõ¡àg \tF>6‰ {RÿC Ե‹k(Øu¯âcÌ a v:&‘ã«uÆa)‰$hÙÅ©T%Ü&민cÉì:±
-ŽÏ'(.G˜¤§úgEп3Q:–‡2 fçb”>Ä:¥,wê
-_”–^à_åþeðŠ:;>¥RÅÀ‚^&3`ÍÐ9Ž‚¸0Ü#BýsŽˆù½NX_TÇU_¹š )/öc¬Î/Xü)ü« Œ†W,lðç0ì‚8™„Îc5”R¸Ã¾£$Î@·óæMÙøŽ0ßh˜_W3Øú…€ Lm$Ž†r,©–]"Ðg›„2Οç^¢äøäðíà›/øzÿæ˪æü}²h
-Æ6Ê_έ™ rH®"“×þ™Tž?áà®CÉ€‡Á‡ñqMpµ*w΀!)×í±D˜-
-ªìvüýØ”¢¨ð’8ÙÚÀÖÙ*8Q|´½|CÍŸ4áN=X"Œ+å_†ë5Aý¡a"¹,nCvãfÓ^æŸÍ}H* k’“"˜ß“ëçøÜn6Xëç*ÃÜWK¡JoŸ¬*Åä Q
-1ÿHŸ{Äl
-{&øáëÙÿûcïã—ð’?ü:n¾n*â(U®béˆr_vÊ)åC«T%3¤ÿšY$Vendstream
+1782 0 obj <<
+/Length 3921
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ksÛ6ò»…?Ê3‹'s77“¦I››kÚKÜûÒö-B6/©ŠT÷×ß.v‘e·sO„Çb±Xì”×þÉk›&i¡Šë¬0‰Ò^ovWâúæ¾»’ ³@ë1Ô7·W_¿ÕÙu‘©J¯o·#\y"ò\^ßV¿¬ÒD%7€A¬^ÿøþí»ï~þðê&3«Ûw?¾¿Y++Voßýë µ¾ûðê‡^}¸YËÜÊÕëï_ýtûæM¥Œã›wï¿¥‘‚~. ýðæí›oÞ¿~sóÛí?¯ÞÜƳŒÏ+…ƃü~õËo⺂cÿóJ$ºÈíõ#tD"‹B]ﮌՉ5Z‡‘æêãÕ¿#ÂѬ_ºÈ?)¥SµÀ@¥F Ìeb‹Â^g¶HR­´gàðàèL|EÃÌWnK?ý –m5žOÔêë¹ÙñoÀØïݦþUåxíç²9º>A¦åp‰ÉÒ“q‹‹´ÈVÛ®iºÇº½ÇnºªÜ¶<6CO“å~ß<ÝH)W œOŽÎ'µML. À(wu»>À9à k$“WL8"«ŒäZÚ¦w›®­ú¯ö°y’ZkÂå—· ¬*l›j¶gÇZ[›dF`‹L
+k•‡ÿUXaˆyÎ}ê¡/—È2i’ c&'‡;ºDTZ$Æä9ƒ[$È_X8w¼òó2ØÉœxìðÌN™H„H3—Jél7êàAÕì É™vÉ$“2òó$KÁ,k­ÇP¤ rÁšD(¤ÏUm¿>Vûu_ÿáæ»ñIžÉâùí#ÔÂþcÆHe“Üj5%à£CQWB±A£¬>»ÃP÷^‰ ÿæÛ÷©õó·?Qãî¸E­ÜºöõÊSïgê–!žwô ̼2wÍlÇÓònK÷åæS¤Œ,ÀÆÕŸ]Eº¼6&QŒõDvÿsS
+¼c×–ÍɼÒCéŒR±¹£¡ œÃÂE
+ý{׺CÉÓÛ3؃[,liðU™‡>ëM·Û?¼vœ¡
+;¡’î ʧÍïx»±Ù€îc=<
+M¦-Ò—õÌH%¡kqÛ{ˆ´È‰"zb®¿¥<©0 ncp;
+M±KÁñErd®A>£¸-”êOµj–?¸B%ÀÇ ì#S²)™ð;Çò‚Èg® ƒðïPW•·³:[ùÓêÜËüìɆ®YÆà0ù\»Gš¹+{Ϙô^†êvÓ+
+z=Ò…û±dë©úk 0ÝŠp]ã+€MQöj>Æò%¬ÁP'Âd³Êá¥L"²(Adç·*A›âã‹gÉ"žTEÏ’+ŸßÌ"ósù³"Êß…0Ÿià†ŸÒG@—ƒô
+. úIÄD=Tðw0¹;î0L¥yzM„Y¬ ùÂvÚãîÎE‡¨à®³™UöÎW‡rÝæxàœÆ²ÞÂݲuݱ§‘ ¸_âõI¡¡Q¶OÔ¸‡Õ-5‰£¾yJZåDƒ@˜m&ƒ`ý}é±+ÉL¬|üŽFð«ß!d„ÿ7 fHs°´i OþñNæ .‚ùÖß
+‰ÊâZ(­Tà—ÌØŽy ¿$é’žà'È94ÛrLòƒ:NñÎCùÉ1¹þ."}}×|^,Œ‡¨Bú</ÕêÝ–†ØðÊ è£"“ÉJ__§GŽJ8žeKÁ(ªfžG›ÿ\ôQħø
+SÝiÃD=3¬g:Mƒû0ÜŸÕÁ„ù¼hçØê|ÄÔU,ØÒ(Y…½ÂM`ÕèåàÏòX
+ƒ_@xlTN<6Š¾+ÀM¦‚è©|ÌcìmGë{Ï(ºëŽÈlré‰Ö—-Ö»}çëãøi)*–Ò‚?R³×¤Cg¡—bmó"°‹1ªL}œœ>¤Ž¡.G©ŠßuëíÓºrMùtþ¸¨[€v<»{„ZØ~r¡2ƒ` réÉþä”3üP)ÀïÀP]rNótüSŽU—áѹ8ÕrŠ”e!„ÕsR>ñs$? “7…á’~ÐxûbZ1&(D Љ•›Ù¼6ŠùEx.ÁHÓrLwú j)¬‚ 3)DŠ¹4t®ãÇ2…¿›5Äbõͱn†uÈsb<èsJòbšãsÙ=Uø!šÈG‚ù ¾šRu¶û\WŽßz©<†­×ì·Ç†
+?‹óg¾œú¡ÅT)§Æ
endobj
-1391 0 obj <<
+1781 0 obj <<
/Type /Page
-/Contents 1392 0 R
-/Resources 1390 0 R
+/Contents 1782 0 R
+/Resources 1780 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1394 0 R ]
+/Parent 1787 0 R
+/Annots [ 1784 0 R 1786 0 R ]
>> endobj
-1394 0 obj <<
+1784 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.2799 352.7282 410.176 364.7879]
+/Rect [324.9335 477.5927 381.8296 489.6523]
/Subtype /Link
/A << /S /GoTo /D (zonefile_format) >>
>> endobj
-1393 0 obj <<
-/D [1391 0 R /XYZ 85.0394 794.5015 null]
+1786 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [55.6967 61.5153 116.59 73.5749]
+/Subtype /Link
+/A << /S /GoTo /D (view_statement_grammar) >>
>> endobj
-1390 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F11 1397 0 R >>
+1783 0 obj <<
+/D [1781 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+526 0 obj <<
+/D [1781 0 R /XYZ 56.6929 131.3071 null]
+>> endobj
+1785 0 obj <<
+/D [1781 0 R /XYZ 56.6929 107.529 null]
+>> endobj
+1780 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1402 0 obj <<
-/Length 3086
+1792 0 obj <<
+/Length 2818
/Filter /FlateDecode
>>
stream
-xÚ­Z_sã¶÷§Ð[陈%þ’hžœ³/U¦ñ]mµ“išZ¤-NhR);î§ï.  š’ÜIÇç°XìbØ Ù,6S:Ö†›Yjd¬¦f«ç‹dö}ß_0Ç3÷Lóë»åÅŸ?‹tfb£¹ž-YYœd›-‹Ÿ#óø$$ѧ/·Ÿßÿãîê2•ÑrñåörÎU}^üí†jßß]ýøãÕÝåœeŠEŸþzõuysG]ÚÉønq{MCÅ¡w7Ÿoînn?Ý\þ²üáâf9ØÚˆüvñó/ɬ
-Ÿ€*˜¶’ÇE¶&2m¶—,‹Ú—ª@ÙÞöÙñ­Ëz󸫉±¨ò§¦íújE³@B¿&Q»§5ȉÞìž¼6\ ¤= Æa‹æovM¼èñäÐÕ½¼H£MWîŠvÞ·›y]¾”õ¼hŸsdÍ—¡Ÿ™à±Vi¢PÂCÕNâiÌS&“hAuïWŽ›˜~+ Í—û 2‰M–y®UwBQÊq:g…7YdQnÝæ­Ë·=Õ¬«°›šÇ õR•¯ÔÛ®+Ëc ¥¥ˆS-,|PßöiF•»)¸ùßGò;©há}¹r[‘»‹¹x'
-øCñxâ¸ÎÌâ½4ŠEz0‹PZ×O¬¢0±H3}f+c\:®×uµZ“ت£²+a±òß'Ñ#mþgê³»+{,­Ú0EulŠ<Éb {×i_ÜNLЗ¥’;–oÅ´è°Dôä:Ê›7bxªÛ‡¼ö˜–Å©`©4:~¨1`Ï—¶£F·³.0
-’LûØ눎g´-é¾. ’é1t+8NVëª xé¼ YühÜ}”Kcfó ’­Lzæ±…«¸T¦ö4åÒã(žÊÞO Óo—yÇã®±¹0˜ø% Øl«çÜnl춛Öf2Òa4]n%3…D®\iÓè„$¢qW[ ú¤”ä\š(•Ã½óxr³ 5­N(!'\å]O ò ªK2R‹«~çó›çï^an?  ×–jp@6uà`oñŒ«Ñ'9ˆpßN9æ«ÌÃû€l”Ã'2IWïÿ‚wRJ8·åi¸ ˜Ž£g
-Òk˜Þ¼*Þå:6 òSª=Ï{Õ|œCý˜¥ÑâšÊÞ”úG¹l„rî8û3ô¬Êꅜѓ
-·´žP»¤.ìÎÅtÔS0tnï×.|€B˜é_‚ %Ï$Ù®5Obnöíq´ÌÐë3n…‘ph9óع¸Žïoîþys7uMQ°€ú0ÙAÁÇ’Ó!ÿ¸¢¸£yMŠ{ûcàª÷àŠ"—äƒd=H°{È]ÌaR<ö·µŒ¹4£ÌBv ¤¡Ü#¶"aÕÂ4”9ôz ÂÆ€AV°+÷Düa“0k{ ’ú ^–
-ž[¡u÷ù ã,scìjïûT$ÜUè
-”ª¾ls¶©ð Ž¢„¼nk¿í¿ .u~€a ¾€:#zç윊rùÎbûЯŒU…<ªœtþÒ/Þj·% RW]x9érû êþrìÃT#5ìô_„\ö®§^V±X È¢ï9pŽ”¦ ÁEð¤RÏô^éáó œåƨC¥I¼¸_]_ßÅWw_ñÿê¨Ý)äæJŸùë‡ë„Ýžë¬Ý§”îí+¶;TÊà¦ñaËU7JaÎXp°Üsµü”Ò½åc¥Ó–‡J¹‚ÄO›[o¿ 2qÆú€ë„õžë¬õ§”î­+¶>TÊcü þqë!føqû´õ× ë=×YëO)Ý[?V:m}¨_Ž!Ge&û¸+¼(v@Àužë¬N)Ý;`¬tÚ¡RØ°x">l?Üú´ùÓqë=Ó9ãOilkœ4=ÔÈ•ŠÃßÚ¯U,ø™Õßó·Þñœ3þ„ºÁö‘ºIÓuIüÇ~_õY/á}VL¢üºÔóÿÝÞápYƧ]ÀS|Ý!nRöŽÍß¿ùBÍ'¦þ_å/*endstream
+xÚ½]oã¸ñ=¿"ou€3ËO‰jŸ²›äêC7»MÒâÐÛ{Ple#¬#û,ysé¯ï ‡”)E–²¸¢’£á|q¾ÈDœrø§Ö0®2}šfš.Ìéòé„Ÿ~o?ž3HóëÝÝÉŸ¯Tzš±,‘ÉéÝCDË2n­8½[ý2{ÿ·óOw—7gsiø,ags“ðÙ»ÅõA2Þ¼¾ZüøÏ›ó³TÏî¯ |syuysyýþòl.¬°_z
+G6\-þ~I³oÎ?|8¿9ûõ˻V—X_Á*òÛÉ/¿òÓ¨ýÓ g*³æôœ‰,“§O'Ú(f´R²>¹=ùGK0úê¶ÙÏ(ËŒ•é€¥2 ÉX¢¤r¬‹Ý·bJev¶Ù6妪iQï—8Kgyj1\0+­L¾^ožç¿í‹Ý‹GŽ9Ë·™Ç]mˆCµih’o·ëâÕ<ƒIí§ÿÙTE ¶˜-ö²ÙÓä¡(Öí¢QÅʃ<§UYç÷ëeòt.0ºJÁrB°Ìéäsü~8›«ÄÎö(„Òš¨ã¤5’Òfv_€Úg™œ9ôt¶Ùü±\õ÷ÝïËu3/«[J©YªD°%øôÇÛ+jÁ¸IÖ·²xö”_ˆéªø̹¬Êê ÁóŠÆâ÷íº\– ­Â>3Û<d¹Îë¡#žËÄ°ÔfI×<GÅ[ŠLyñšÇ¼¡PyÊ›%˜œà'4Y®Ë¢jàXûÄAIî”&u¢†3†GšÇXäðbÈá–³[±«á
+­`:MB]  C°7y'‘ÉpΕ…h²FuÃéMÑ{ÍÑÀSœe’«ï< yG!b“y5Á±L»Ñ…žÁ.Ÿ T”åcYE¸Tòb”°ûpž¥N<×2mu×2›}…G­SWP¥Y
+TOÌ,¼›×ÜÙ©L1®y¯LüO²Áª˜@ˆŽf»ëx¶k±¢&$œ—«×)ZèßÇÙ·Xü»I3©2Ó€Ó¦³ÅM
+ÓÐM¦‘”©‘ãRJÎÔÖÎ!C4¿•Yë¶ë5mYæûúH› ´¢{ÖH}¨Ž*:ø°ó„LûKr¦‚¶:.à
+Q§Á &ß=ù:û‚FÊ ŽüŠ ëÍ2 ’¡¡Ê’¨ëÊ¢>æþUê@¼†4G3zN2á¥)™-ª¦ØUEó'O‡A à“&&hØÐq:6H°«ã²Ä»¦T*jÍ”neørCEU©öy ¦2õ6_~Ù¡Ùï*ú~ýóÅÇç‹kZÑ×z»©jÚ H-¥cš‡l¥¸5 a›ïšr9:—ý:w7^,ßV¶¤RÓ
+»Á„„@= Õ— yÂóÕÊ LÒèŒüD«›«÷´Ê™õ{Üi¾™™RÐÑm
+L­Šh¡ÔŸ9ÔÀþ-‰Cë‘@eåÚb½fÛmÅ9ÌuÒeËÙâz~~qqÃÎo>á£þùQÍye;±šGX#š¬iÍǸFš÷Ùk³pÝx«îp+ƒ{屇ù {Œu\÷kR÷Q®Ý_±Ô½ÃVèÿ’ìíú.‡örBÿkDÿ€5­ÿ×Hÿ>Ûaýc¶’áåÛõ7ò‹ÑúGX#ú¬iýǸFú÷Ùë³…VZ{0}» Oü1;B1€GšÖ„e¤~ç°öOWMÎ$Wo×vh dÆ•°F´XÓêqôï³6@ÌV|W;ü¾Õ"sLŸb¬ãvh±&í0Êõ`‡WlíÐaËÙûY|J¦m–&Lk•NØ,±YÀš¶Ù×Èf}¶Ã6‹ÙŠÿ‡ÍLÊ2Ù ›EX#6 XÓ6ãÙ¬ÏvØf1[ËÞ± ,9Îòm6PÓ\N´[1Öˆ Ö´ ƸF6賶AÌö‚]¡¾oÓ]rf­œh·b¬ÝÖ´îc\#Ýûl‡uÙZvù=ÚsÉT"&š­kDû€5­ý×Hû>Ûaíc¶Ùwio³ZLtZÒqÝÒ¤êc,š÷y*ó<ÿ.½Ôœ¨¬œãZ{œI¥Gøtî1T9bøî»4V†á?ù H
+"rX¼Z™¥A(Ô&Íú’·ÿtøZôÿÃóîendstream
endobj
-1401 0 obj <<
+1791 0 obj <<
/Type /Page
-/Contents 1402 0 R
-/Resources 1400 0 R
+/Contents 1792 0 R
+/Resources 1790 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1405 0 R ]
+/Parent 1787 0 R
>> endobj
-1405 0 obj <<
-/Type /Annot
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 639.9582 116.59 652.0178]
-/Subtype /Link
-/A << /S /GoTo /D (view_statement_grammar) >>
+1793 0 obj <<
+/D [1791 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1403 0 obj <<
-/D [1401 0 R /XYZ 56.6929 794.5015 null]
+530 0 obj <<
+/D [1791 0 R /XYZ 85.0394 496.0455 null]
>> endobj
-414 0 obj <<
-/D [1401 0 R /XYZ 56.6929 710.1097 null]
+1794 0 obj <<
+/D [1791 0 R /XYZ 85.0394 467.7701 null]
>> endobj
-1404 0 obj <<
-/D [1401 0 R /XYZ 56.6929 686.1175 null]
+1790 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F14 956 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-418 0 obj <<
-/D [1401 0 R /XYZ 56.6929 367.6759 null]
+1797 0 obj <<
+/Length 3233
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sÛ6òÝ¿BÓ—£f"” ’¸{J§u§uîßô¡íEQ6ç(R);]ì‚%Êé]&3¸X,‹ý†å"„r¡‘˜È,R J½(vWáâæ~¸’Œ³rH+ë»û«oß«ta„I¢dq¿õhe"Ì2¹¸ßü$"K ß¸}óÿïÞ.Ó8¸¿ùp»\E: Þßü|M£îÞþòËÛ»åJfZßÿøöŸ÷×w4•0ïnnßÄÐÏ¢w×ï¯ï®o¿¿^þqÿÓÕõýpÿ¼2TxOW¿ý.6p쟮B¡L¦Ïð
+iL´Ø]ÅZ +å õÕÇ« ½Y»tV~2‘J¢FÑœ
+xŸö©<ªÍì‰ ¨æx
+ø¨«®gð–~=^áË2ø†Æ/í‘EÞLpécØ€dÖö#åý "ÙÀñ6Ûö@ƒòs¾Û×åßñ4ß¾¥§¨©©ÅV¡HCðx@ffeÅ»¢m“0 ¾ßüƒHLt}5¥‘Y7(“ðQðq\Ê «šú¢c ÎfCXV-pÈ›‡’ÇÞ‰ÝÀ©Ë¼¾tÜ©{l5ãä5áäÔ£ƒÇü‰7£  Ù1À©ÛkÂߌxÜâ:¥câÇ®­J"Ü4Ùò¢¯Š’¾úÇŠ—€©–ù?ÐXñ·Á;ÇÁÚâ³ê" È;=Wý#vyóB£OG`Û1³.í cSú;èó3‘¯ší!ïúÃ2 ŽEî,…û*(,ú Õ‚A“ïJ†U ýéέÙÃEçEÙ¡‰¥*øØœ8ömA:nyΣ./Ö‹*¯g˜x.}þš²ÜXÕ@íÜ…­ÙZ6å¾n_œaZ‰¶ø˜7õ©¾e¡D_Ø´Úœ—äÏ9Ã<·æ¯º$F˜âˆKá, ¡ô_Œg2Æèx>žÁé3ˆh)ØûEZ´.Z<¤§¤Æ¼AG‘HS€^Ød¼]$‘P©LÚ(!Iê·žËÐ 0hEµŠ€o‹ñ,E‚û{ ÎÂ<P Ó(]è8&Kpßŧ…alŒ"ol:
+À¾½ÙE‹w-gáÈÑ]y„íß·AþH°{’
+#3:ѽ½æ4 %é¥ öù¡lz‚ £G
+ž–„(RÖ,Ø.DVcFÉ‚?—6r—Œ68/À²~x¡S§É¼®ià ¹õ4ql6冼ÖÀi¦ýµ¹Øì…¾¦§@D´á$ÞÉ\H…‹G°ÎH€ €†¦,eÿ‡Hî—ΖÛB&ŽUݯ¬oÈÆ0ïqÜC3ìž(ƒ
+ÛǺ,ìëB¥w&ìDd²¶Wy°f˜˜
+[Š,…È3áâÝ X…Á¦zª6G›NÀ÷PãËQ¾aLò˜'_Û&h˜Œ×=C%n×*—"¨+x09(âé“ÊqX°¦Ôi•†"Jµ™fÓþ\ߨöCõ^íJJïOn
+9ë×Dzè‰Aì‘åÅ#uçE8dAPQ,†UÅ‹ÔœŠcˆrL' gËçsË®%”tŽv~
+FhìQŒ¶…*ˆˆIé“\f0“§‹ü$ éü$¤j¬Œ€ MЉÿt­×¼Ïg•óCÃo3íú©jÝøܳycÏÜôœ¤
+…‰#õ¢P¤ÂÈB*q–ˆ/QüKwõéX±["èîhc%ŽÚ1»Äßü Eö®’ñ­É‹mðe9ãg©Q+™(!Óñr\Ÿñˆ/F
+’|#SIèÞÎbLM­3Šva@pk½µû„C#Î:þ¥;îö¬” ÅM‹doi ‡· À÷U1¾¹ôR6s[‰ÐFFá²-kLl‡­péÒš[nÞ[|­¹7zÙHÈì³ØL™ðêÍ^’DÄa¬^õ"RÄI¨_õ"Xó$ŽŠ ½á®1u- çáÙ·]W­‡žeËg^B :;µîã~ïR•ºÚU'F>è­>¹÷ÉÛaîYïúÅuæ¥Ay§±„æKË?¯X²]õçœ\S%B¥ÓA"t¨“tbÔåtÊKB(ÚÌ°•‹¬Š¢/|惘ì3öâ?¿H7“ŒDSÆD°iÂd³Œfò¢Ÿ¤HÚqÇÉɯK .¿\Í>™ûYiª²ÿµÔ:'ù¹L\ü+^Šº*æèdBÃ9ÍÏBC>
+~lŸñÿ¦Ä–ÉIlóIûŠ3˜i~¶Þ_;Å
+¦µ36odr5—·œ?G%£RÇe‘QAGýJs¦Á&vE¨¡'füý­pdµé‹¢,m ì–ùa§ã ö@—MÍ÷1ù™‘ŸxpÇnö ¨Òÿ
+g¦ÏO_ýÇ>ã‹&$X*Ë¢ù†8Yg@„™Â+ÈÂó>ÿUÐ9ëÿ ù«_endstream
+endobj
+1796 0 obj <<
+/Type /Page
+/Contents 1797 0 R
+/Resources 1795 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1787 0 R
>> endobj
-1406 0 obj <<
-/D [1401 0 R /XYZ 56.6929 339.2505 null]
+1798 0 obj <<
+/D [1796 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1400 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F14 740 0 R >>
+534 0 obj <<
+/D [1796 0 R /XYZ 56.6929 349.7668 null]
+>> endobj
+1271 0 obj <<
+/D [1796 0 R /XYZ 56.6929 323.7864 null]
+>> endobj
+1795 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F62 1352 0 R /F21 930 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1410 0 obj <<
-/Length 2656
+1801 0 obj <<
+/Length 3598
/Filter /FlateDecode
>>
stream
-xÚ¥]sÛ¸ñÝ¿Bs/¥f"„ @lŸœØN}ÓsRÇ>\˜3©ˆ”}¾_ß],@‚%%Ídæ´\,°ØÅ~øø,„|¦bŠLÎÒL²8äñ¬X_„³¯°öá‚[š…#ZøTï.ÞÞˆt–±,‰’ÙÃÊ;K±P)>{Xþ¼ÿç姇ëûù"ŠÃ aóEœ„Á»Û»+ÂdôóþãÝÍí‡ÿÜ_ÎS<Ü~¼#ôýõÍõýõÝûëù‚«˜ÃþÈžpdÃÍí¿® úpùÛo—÷ó?~½¸~èuñõå¡@E¾]üþG8[‚Ú¿^„Ld*ž½ÀGÈx–E³õ…Œ‹¥S]|¾øw ·j¶NÙ¯§YÉTgœ¶rœ±DD¢·2—ž•3
-t'ÛEßgƒhc~ÆÑ X¢ó8ÁÒÓç´úÏ+vƒš~ŸÖ!Ø' ŵ=ªz;ªóŠŸâêi¾ÏvZuŸ­b×? }¢B&“,=­½Ou\ûžê¬ö'¹Ú°Ô~Ä6û1í“%ivÆå}ªÚ;ªóÚŸâêi¿ÏvZ{Ÿíåi/C¦”’g´÷¨Nhï¨ÎkŠ«§ý>Ûií}¶ïŽj?[Dpn˜$À!c)@fÃõzÓ½B"çqðWSëAäÛ9W&|«».¬ìWÞI÷dÏ¥~!¨ÒϺ²ÔKÂ5ueÏ7ao3lm-ÝŠ–Š*o-êöŽpU¶ÈIzB⸗5 AEβ8ŽŒŠVeý¤·egNI°2{š5-6›®lê––Ê!AËÞ€ìkuCÈå `x°àÄl»ÑEù% #ÇÛ˜‘šQX3‚ê"Œƒ¼?˧yÖÛm¹ÜÓ‘¼žŽjlÐ>ª²í,zE¿ž¬ðe|Cðk³# Èë-}ô ÈfM7œ@PÞíZ…P TȲY5[ôŸùzSé¿£6oo$÷<;å, ~eœ­0 cÞ±MÂ0ø…ýò:b‹ñÊœq‹FÈ«jæ_g»¶¬¿žt@‚å’HŒOb›×_µ… ¼³º$„ó•7xwéÀ¦}jv•¥É+¢É—¯Äö)¶ÌhÎl-Âùã5’o <iqŸˆ%É€À®ÕàRI$‚Ûš0›m^te¡é«{*íˆSoíF*þÖxá<zë·ˆ(òÖB/e÷DÐ:¯_ ú¶±0Úh@Kísˆu¢à-ëÕ6o»í\»¢Ûõ–rx—¶h,ú ¿ Î×ÚâÊš~áèÖíÙÌyºÅøJEð¹!<IìoZuÜöÜBm^lMe^Mñ¢}ùj­—Æ5ðŒfJ¹G*K½©šW•æuÄ@|ÊëÚ<¨~X¡E_m\5¹Ý’¿äç½iþ®cf„%«;–"e"Y¢2õ]X–Årºƒíôg©ŒŽŸEûB8Ë‚nÇø¨!7 Åçñ¨1èm É9d)WØ=ro eÉ;ïňx{L:e±ˆ@rCñb…Ãë \ï[ΔD“aÊD›ü<û6ƒ>Cf™ "6º60ˆ··ëhvÕ€F3O)wðÂ?Ù(•Œ2”²m"#èÓã”2ùƒ¹ëT[MΙ›|«ëŽ°pÍø,Ïó’y¬
-Vs@QèdCœ¨à¯¹ÉÝÚ’õ/P™—xá³N‹yUàR¹ý´°«—zKà‘0ï%U±¿WÑ»
-W ˆ;xèQ ‰§OjÇaÃ#N‹ÄMã½×w<_€ë[ƒ
-<êBD4AÄ¿þð„q5_ðšìËå²Ä±Bnýë³.:ÿ¢”OØ×6áPA¥š¤¡W 
-cŸÚ'¤„gÃÅŽ3t‚•eÛI¾ ª*À•d<RÂÖí¹Ù>!K9+…G•Èìù¦åEjâRÖÞZ±¬$´`šT@•ë õWÏV•ÎQØÆ{ÓÔ­]‚JlEïèÂÎ߸da•üèæ ó,4ÍfH£ú?Ú&CïÈTð_z!a mîÑ߆
-óáŽÂÞ†YAÊ–@ζÐõ8ÐË¡Ó‘¹=s0‹a÷Ôl»E±ë&çPX‰F©Í5
+xÚ­Z[wÛ6~÷¯ÐÙ—ÊçD@€ Øì席Óu7I»Ž»ûÐö)›ŠTEʲ»gÿûÎ`
+”(;mb?àB\ƒ¹|3˜pø3.S5IRÅb.âÉbuÆ'·ðíÛ3áÆÌü Y8ê«›³—¯e2IYª#=¹YkÆ“›ü§é׿øáæòú|Å|ªÙù,Ö|úÕÕ»o¨'¥âëïß½¾úöÇë‹óDMo®¾GÝ×—¯/¯/ß}}y>&0?r+œ˜ðúêÍ%Õ¾½¾xûöâúü—›ïÎ.oú³„ç\âA~=ûé>ÉáØßq&SOvÐàL¤i4Y©X²XIé{ª³÷gÿì ¾Ú©cü‹¥a±‰’FbŒqÊ´Œ¤eàfÓݬÙäÅS¢`Š2L(c`‹Ìáéôæ®8ŸI¡§Åò\˜é²XtØN¦Í’ú»»²¥žö®ÙV9õÎݬUY7äë hK9½kvÅ}ö´e½(h¬¦I××@&UËš>užŒ,ÏË®lꬢv AÓz\Ïð`“™?ËL–ÆqdT.²ªz„¡ȯ}mÑÔ]VÖ-µ2*Ú ¥j½]Íbšµ¤(¤ÊÏ<æYSà å*«ýÚY[¸‘e÷q—õmUø]`yñb¸øî®\ÜÙCòáép/’WË,¬
+° :f°ûÕr„o):ÖŽpÕÇ,Š¥Jz–½p×h•½G¯UØÀc]8:g¨x|/y±Ì¶•“¬û¬Úý´‘[Ö‚¡RGKÝŒ‘+ÔÔ³7ÇLƒ¾?}ÃûAOÜ°Üð¢*²80+kÐ8ÕÑe§1¨ŠÔO’Ñ:¦c ÒœÃG`JHñ7Jáb6÷VY¡¾+ÑDa”jÕÜûQ]†6$’ty®·¨»MY´xå`wç`.rú`/ÊÌ•o®¤ÉÁ˜¬ºm6ew·zA6å,‘&š 4í£Í Wñ@›Ç¹ztû3‘ð3Á›l»¢¡‹Rçš"ð{¡`:5§öpÎÕ’¾ZƒŸÁüØŽl‰
+¡m¯Áh6y¹ QžV:»)
+¥?;飻 ´w‹ÅÖz¸ÓÒÊBégÄ5õ„¼úQ–AÙÃ̱·-;6J1 ©$~†€~ÔƒËÑ(Õ$`ài)WÛ5²U³­;ª“… ±›Gª“w©|ìÈaJ{3Xn[·à²Ù¸/~ ¯ Àë/Ü,:=ܶÒéôßwE½ŸbïL©\ åÖSÅÊy-5ͳ.£ZYSéܪòîÈÖIõ°ÝúQ¥«Uåªì¬÷s{†ºEòEÕ9m¿Õí-5Û¶¼/ªG·Hã÷ʺ=mL@BiIÀÂîÈû}1-E‘;®¦W5ugTì錀ÎîŽzW fåÚÚhÝ—ÅΚã(Â-³õº*‰/¸à:Û€Û§3D¤xÐßOÜs5ÂKA8ÈfçY`çó4š>é~¼ÏQb`Q“‘ˆœEúí˜ÙIX*£¬8Ð>P
+˜uR‘t X5õ‘'nsB
+L‹6‘údõïWœ…K«¿R€¼ÀØ~ØS꟰(N½úU±?ßÚŒ¢±QFÀÐb1ˆbGµØ>CF¥pñF”¦*ñtP*
+í˜c"Špõ1  Ú çŒ†Wÿ;Î šrÛ‹í±®Íü—ñ$·¿Ûí˜;'
+´Uõè>½eéOí•—íÂá¿?J
+ÎýË
+ƒ€¹÷¥Ko)Ã|±è€cþWskª6Ò™'ï™t¥bè˜^Û¥eÆe–.©$‡*¤mŠ ;´û(U’É©! `.QÞ1ЊnÇ@je`$pô–ÙÒ½+ËÔç¿á›3ÒhÚÆ„Q
+ä_y{ç˜dcÈåãÇ~¢²97ÓmU´_ŽÀ§`ì
+Xù'?åÕØ¡»»xöãV:;%gZ˶X]¬©Ü¿í†z‹…­ªèZ×O…5¼X^ì(Ýr$ v2Ù%¬ö‚@ý«m×CRH lO莬ÕqTÛlsàtÙAxübô½i¨<Á1vZ0pT{Ÿ— úwì©Êý/®Ê§å‹Õ“3’X¸Ê—x>›`µŠÂŠ7“ƒw3mÌô½û]8š`¢}…“î]Ž¾[xÕ¿ ùÔõaz¿_nÏ=Ê»Ë$ ²|á¶ÃÌ$tüSàŸØÇîä‡Âû±Ÿpʘáï.G~ Á'ž˜Oþyçþ·¯*aÒ˜hüg’kÑMâ‰B&qHyÿ;ÐcÒÿbTü,endstream
endobj
-1409 0 obj <<
+1800 0 obj <<
/Type /Page
-/Contents 1410 0 R
-/Resources 1408 0 R
+/Contents 1801 0 R
+/Resources 1799 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
+/Parent 1787 0 R
+/Annots [ 1804 0 R ]
>> endobj
-1411 0 obj <<
-/D [1409 0 R /XYZ 85.0394 794.5015 null]
+1804 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [91.7919 217.2504 93.7844 226.8901]
+/Subtype/Link/A<</Type/Action/S/URI/URI()>>
>> endobj
-422 0 obj <<
-/D [1409 0 R /XYZ 85.0394 201.4944 null]
+1802 0 obj <<
+/D [1800 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-997 0 obj <<
-/D [1409 0 R /XYZ 85.0394 173.9833 null]
+538 0 obj <<
+/D [1800 0 R /XYZ 85.0394 548.0867 null]
>> endobj
-1408 0 obj <<
-/Font << /F37 802 0 R /F14 740 0 R /F22 737 0 R /F41 939 0 R /F62 1062 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1803 0 obj <<
+/D [1800 0 R /XYZ 85.0394 519.5161 null]
+>> endobj
+1799 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1414 0 obj <<
-/Length 2658
+1807 0 obj <<
+/Length 3771
/Filter /FlateDecode
>>
stream
-xÚµËrÜ6ò®¯˜Ûr¶D„x‘Dåä8²£TlïÊJåà¨\Ô FÃ
->$MvóïÛ@rDI–][:h4ýîFtÁ]ȘĊ©E¢‘•‹Uy-n`íí u8¡G
-ÇX?\ž|÷†' ETÌâÅåfD+%QšÒÅåúSF–@!
-^xÿæüí¯¯–‰.Ï?¼_†LFÁ›ó_ÎpôöâÕ»w¯.–!M% ^ÿôê_—g¸;?œ¿ÿ!
-?½8{svqöþõÙòêò瓳ËA–±¼4âF?O>]E‹5ˆýóID¸Jåâ&¡J±Ey"$'Rpî!ÅÉÇ“G«vë¬þhDÙŒ›S T$æŒ[žW˃pu³¤i°Ö N»Ú¯»,w(ÝVã Ìîó²/q²ÓͦnʬZ¹Õ¼ÜYZõ­.uÕ!pƒ ·'[¯ó.¯«¬0s´zÕåKÔÎWÙj›W7§ËPDfµë`ft Ñ‘DÑ"¤”()™•å@6Ü4u2Úm+‚F‚Ä‚+Øo¶¬ISFbªR‡RÕsd$‘2õ(y ¼+XAõª.Aøµ^8 Úõ£¼sÕ7ˆl•
-
-šˆ˜œê±ÝÖM®ú½X°ß±ÕÌÜZÍði&ye½à
-oi ÂÛ 8Ê*+N½QÇtƒ&ÖŠ‰T”}±bIV©WÛ¬Ê[ãcI
-j4®—¨àZ#À8Êua5 ³ë=®>žNh‘T¨)¡® ‘^☈Hð'³%"Žä“Y„y*ô¼Cž­7ÏYÑÖÙÕm›~쬫L;½Ê7{DÍ-B)"ÓƒaPõ»±¶ ¼"/ó£ üVÙÝÆtí6f£è½vØ};¯U&)‘œÇÞhÙ}è4ÛæÍé5á$â24‚²0(m±â>A /½§$.F)‰UWœ¼ÍZÂy™WŸ"ÐãÄ ‚KHIø¸•ÁÅx†‚9‘»sö´Ì™DZ1”µß–R~· 炤î»Y%IÂÓç‚„)’&‰G;!$IBc_ÿVûU‘¯æè¤D‚mÜ!D
-s
-~¤v²‹ŽÒ.Š)÷S“–Ú;0¦(3è;(Ty·h¢*Ô’TQ5u{s^kTÏxðS}§o´"§Æyã£Ú6v$9v$Xù=ŠØ½ÍþÒ; y,ÝmµÛŽ!†;›¶;ÐÔÐò´8µ© p¼ƒÈÛèÃ䬷 œ«óSt2«,滦xÐf¥FÐÏ
-êèü‘Â1^éÌpÀšísƧS7O&èÓÇX3çOš& d1eà|.ꡱôMà >Ó: hðù¡Î=KeòƒÙQð5ÁR38ÉZo²¾pþu›½¶ÍØ:†šC…zI§÷ˆE›«'ÚÎc¬Çí<`ì¼*44ÍÕMh/! Ø“Ç þ‹=ÍÉ€5ÃÊDê„ÎS9åµÌLÕnnmàÂØ•æ/2e}뱺̶¼üpo(Ü”›ÜV9øRǬ¹™Âª
-ß_.~ÅÍ#œ¬¸1ÍöÄKJ¨"­•š¦#“æ÷³æ&i$äô¢0«Ø>ÀH欧 •¥ï´iK˜reŠA=8¸Ôë¦
-M8tÁ³fŸðø¼2–ù?(“*JXÊ’YeB"k¦ºt †Gûp3 M—¶ÇÜ3F¡LDs^ëœeÿjrÞA–Éa°SOˆH…xñaSð”Kñ¬NÛ½\-ÐWC›ó=ï0³Î÷-j‘/>lªED¨”Îú4´®¡U9<ÜÕuqT¿¾ ñO÷‡f4© /'Ñï ·Õíë1ZálCñ÷÷ýˆÏ%1¿¼ÏÜ(¢ÁѾùþÃ?ÈSiÊæ¯&,IÁ¸@Ä1e{3ñð:æþà!ëÿ:šš¡endstream
+xÚ¥]sÛ6òÝ¿ÂôMÄ’
+Û~weB‡ÃHDê›$Έ8K=(YÞœ›0S>ÈÍWŒg$©<e‡gÕÞ±¬*î-
+nóå²ØuD¹R^[ÖK9iPÍLÕ^oø öj„µÜ퀋itϪUä«D§@,ÒX|AJfûf;q P=ű[Û¢îPµTJÄ 3’ãL§¡ŸèÀŒåéPè÷òvXtÓt…[Žì2ô¬©HÝt®Ôóªzá¼fxÞuùò‰ûMmÑæ7Ÿ²#Ž’"€Lux×2÷1_Ò±X}x—W$lzµ<²Ñ'®n¯%‡YÃÖB™Ðt–ªÿ„Š«“ˆ”¿·ùn‡ª03ÞKsØsñYKdÁã¼ë;ÍW+±™–Íž'¬šm^Ö ³[GÞ#d+„l„âŽïØJ=rû\¬€`©ñ®»ñáؽoËõE§ êÝAgl
+öe†9ÖšqÚöÐ
+âݶݗ¨Iø¹<"<7HfBÉ­$6.$¡ǪÊeÞ•ä)’Þõ@ïÐ2¿ÙL:‚®X*i(ŒT9m½.Ú–kgämšcñìÈ=¹ÀÓî,ý
+"4 ù#Ôò
+/'D➟¸ÔÒ²í|š<–>¡¢'ù),ÔÆÏtªû‹bÿpÿ ý¾ÝîÀõÂýßšZ Qp÷4¡ÜûŠã¢œn2g‡Œ81AJûñ¥’d¼4h‘º^V‡jñ°Ørí'V嶤”Ç·Ånae»åOJã`ζÿÂ0N² ã^rZžGf2Œ-û¶Dw3€þ<m7™©´@†&p¯F|räýU “-gí.ßò'+LYTà”ª°¢*EÚ›W²âäc¶"|‡u_ï­ BFDú»b8YulÞº‘ÀÍ!úÉ^všÉ&¯E6ëWŒÁàgßØß(oå ‚u–ÛÆ&ôý¬uÕ,¬¿e|ö*òøöõ
+±ß¢
+­É$xQP’IA
+Òö×"Û´2Ì«-g»}¹´#›†ÍO ¼Å ›ÜÃØao©ðY•O“æ4¦h *gˆQL-4n ó-s'ЯNa O¨Ñ?L hžFi$³Öo¡±ûü0UŠ€0Ðûˆf?yŸ&£cqiÂ(ã'IÝÅ[GV™ÄAúGNÀ6-ûl¢NÛ(_›P}ëØæ/Ž­|“¶
+ &½_næŸ.Ç#{ #à™ÕÔŨ ëø–˜#©W“7ÓFìÔ^¼¬áÒY ý $~dHs`ÛTÏDa(4(ñÄØ‘ Î’ (n¾tt½ãèW¸>ÜS s]ã”·ÀAÕsºÂeþ û·Rv[Õ󺵲É(ù\~ew¥„mÎR¹Ï½‡Íháˆ]J˜£,ic9%ÐñÂŽsÃù»©´}ÿÞr»+–¥¾$ËVfpv6Û”û3•Ü$Àv/;qIÓÖþ
+Û\^>„U5>´ÂÍe&ï*NEÖ E#²¹‚Ù”À¬ˆ8…#Þ‚¨[û6pÛÉ—&’9NP¢R®íRdÈü¤Ç¸ÀŒÒ䞙صNM*0¢˜éiYp`C=öúk`ëDÒjy¨ FU~XB ?Û™´8²F`¾éˆ3# Xf8Ë"yr^ ð…ÛA§23ºG-a2s¥ héf†o®Ô#?ô'Û /MÈÌ8(dÌœ‹BŸrPÀ•ÝT‰|~€‹6ä¸xpqÀ­’g¬mkHp°öЈ‰ âÜ|_öåb-†‚Æ(Wy—'°¦`yØ[cè·oe_9L—6
endobj
-1413 0 obj <<
+1806 0 obj <<
/Type /Page
-/Contents 1414 0 R
-/Resources 1412 0 R
+/Contents 1807 0 R
+/Resources 1805 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
+/Parent 1787 0 R
>> endobj
-1415 0 obj <<
-/D [1413 0 R /XYZ 56.6929 794.5015 null]
+1808 0 obj <<
+/D [1806 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-426 0 obj <<
-/D [1413 0 R /XYZ 56.6929 362.9244 null]
+542 0 obj <<
+/D [1806 0 R /XYZ 56.6929 511.0366 null]
>> endobj
-1416 0 obj <<
-/D [1413 0 R /XYZ 56.6929 327.7284 null]
+1809 0 obj <<
+/D [1806 0 R /XYZ 56.6929 485.4552 null]
>> endobj
-1412 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1805 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F14 956 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1419 0 obj <<
-/Length 4207
-/Filter /FlateDecode
->>
-stream
-xÚ¥;]wÛ¸±ïù~”ωXâ‹
-4žxPs\Ó “(z“8á§ÊЋ¥RÞ[ÐÑr_7ƒÖj›†ÃhÀC Ö—Æm8¢n–øc-Og^ÁŸÌ;¹Ä%,í ™ìm¾–ЉtZþÖµøvgËà–¸©À2€Svn‹]~®º6é OÐz: µY=5gjlË–ÌcøêîQQ•Î0¶þøm!¶Ñ¼âï¾|(ë=µ›3Ï¿Ë·¼@Þåȹ̯ùéK?²ìè7g,wÍþÌÍDzª¨Å.ä!h¢ÝO w§%›ú¯3xº`ŽÁ’‚A Ú+Ò`î„ÙCyuŽ–x·¨RS¤–χh\<E‘eqTÙ.`¿-zûÓ‹§œˆL-5³Ý€R¿ÆvË4Ѻïã©y
-Rúi%?zó°f¢ôÌŒƒµžQF©9>Âî-w§qÜùxlNÜ; fQX~îšä1 ”|êÕŽL´îò°¡Ñºï
-Å4–w¼7ßt”ë~ÔDÆÚûæ\!•„æÕcþÔRû±9}AÍÉ2Žv<ŸŽ”ödž$óÏ™s'­”yµ9×VÆ ¹¶h(î•èe³ÞOì$ï«äßpÒ!ðþ6äBÔvɽGѤɠ33Ç)BNC]<=hôV™\^/óÐ*È9ÅñŽºkB] `l´B›dÁúÒHØIyàÅîí%>Jò¿bµkKñ5?`èi,™"2ÀNõ$ò1ÎUeò‘A¹;ï÷O³
-ßæ”·÷1ňVjÓœN×nu>vܵxûÐbæÌ Ö¢QzÖ…:-¢-.¶uûLaA÷òØõ¡Â4¸NLb‡ˆ^8Ž…#z€õ‰´9NÇÜ·ƒüôØñ´†~y»zÿãÇÏ<ƒâlåŒÃá\ƒÑ Ž—ü€†œÊÌÜ
-‹°«{É&”±Å¡ÙØ‚c”Há>|U$Eû ¢PÀÿ¾DÆ­È!ÿúMýæ[¨™~§>ê·Hc]ô×òp>ÐG4¤)+;öm¸^¢ùÂӌ[&Bû²>§¶×z–û@U*­ÎM•1ÊÈEG0rNÎSÄþ`¥$•’/›
- ƒŠ"tª¢°'ÁJÐÇŒDòÅüF¥Ä~S€>£_êæq.jß/Ñ¿]LYÉbò¸pü†*ÓלŸ=þ4ñ^eS/§Ò,QÚ.ÜA^9TVÔŒ¡
-HZ„zFK«ô4‘Br¢ÁÇ‘+É`àU"¬XrYmsMˆ•ãE߆/î–ö;î¯+,‡„Ãéïw!õzâM-"™KtŸU@fØÒÒ!³…åt½Òómg“Ç‘?–3(G K[ÄMüYÚˆ^$Îr«—·"û»Ë òö—Xð%!­ÅpáZ‚6£ÛÐãM¦I2ÞK5±&` ^s‘¾ÏõèèšfËð'‚ó[€xÆ?@\ò•aèÃðcÞmîcQŒ·0Ù5æ TÀ‚(æøK8±‘db@æ3¯WÿÆ48z藣ط̻'úàÔ9TɃ¾P;øq#lh‹œ‘D½D\/wÏ•sø#Où,z-Þ¯ïìÒBBÝÏš¨Sv7‹é:VñÒï[ÌÊ$uý½h]ROôBÓJêg6ê<æÿÅÊ£…ˆ”¢è­/׳
-4[뉟_¼%²‰ò=ÿG×¾¸Dðm\ÂO!*·³kŽ»b–6Έ˜%‘CÉñ’ 6SI7ÖIÛÐ,{m€Tå!” lŒ¿ QŸwTbç7àzs> ñ(ÂÊú®9m‚X ÓJh:©„Ž™ð§M3?º ¦T’·2ÎåË_0]²Øð{”Jݼþ<òس§)ãø4òl<º`@¾‰&¹÷öñšrY°$ä“C…§§y}dq^”2«©{Å‹ŠÊ¡›HRî‹_“Ê
-##¿¾OÏÔLšÉy½ACÚ³Q µYz6áT¢Za‘ùC2‰M4„4Âò
-¨„LÜpLñÖ–¶L‡~®‚®Å)3cÀœÉ)Ú&77hùR,¬ÃŒçWÐ"_K£ààÍGH?4ú ¯ ¦bõÄ×>Ó§^ÎJ2 ß~¾ùéíüT„È „̲pŸ¥¬·ÈBê<í¯¨ñiô2¯¿O žOoçx‘ŒÏE$ÝYð«æ‚šÌ$B¨ 1ã —(˜ãb>Zw—­º¼â§ x ×ð/·vZìpÙÔ~Y™®þ—ÙàÈû|ϤønŽ¦ÖÝ7WÁ›z^ÈN.ŠÂÉ:8X«²©Ä5Ÿ­i0­Ü×ywî«-¦/ý0øÝuq¢÷‚øyn‰ &V`Ê1!œ8R
-¹jóØR;lÎUW+‚81ÙRøB +ïOIv£LŒ†R½õ2±]rUAd:±/ÃFaEÅ\äìó¢vþBÕF@b¿bê´Y*Þ@ª¤w/ÝÖ(°YÏã]?d ¨!¢ßÍ/nðyUL
-¤Ž7Ã
-üQ’:g¦Þd[tyYµo£ñ,fæu[´›SyÌ/¿´Ã7tø¿ß«¤Ãƒ×ç•ÔXõ”T
-QÓ†qÔÆ+‘NÙ+ˆ,øí¨½†_Fsœ“è‡þ³C‚éHì1N™’#b." ~Ì·I˜aêK„KÿÞ¡ ^/­–öÿoñ_ÿëÇð1qçä2áXÀt"6&*üOÇE¬ØÿÈ%éÿ*[h”endstream
+1812 0 obj <<
+/Length 2026
+/Filter /FlateDecode
+>>
+stream
+xÚµY[oÛ¸~÷¯0çÁ9X±"© Õ¾¬7MÚ,Ú¤ëø
+Ù¦m¡²¤•ä$Înÿû9¤,9jšlpàñ23œùæ‘L‡.üèPøÄå‘7 #ø.õ‡óÍÀ®`ïÝ€Ç9mª_§ƒW§<F$
+X0œ.[²q… Ãéâjtü~üiz29r˜ïŽräø;úõìü-®Dø8¾8?={÷ŸÉø(ôFÓ³‹s\žœœžLNÎOŽ*|
+üÌHøÃéÙ‡½›Œ?~OŽ®§¿ N¦-m{©Ë•! ®®ÝáÌþmà x —Ð(bÃÍÀó9ñ=ÎíJ:¸üÞlíjÖ>ü|.ˆ/XØ c}
+±ÔVØ}žYIY¼±ú¤q-ëµTˆƒ]´e”.ÄŠ«-*eUäY%­ãÎ0´p‡Rù>ÓŒyQ'yÀ©;š®%zúü¹ø„C#P“
+Ÿò®Ð&Ë
+„¥™!‰Mð?š¨¹Mêug¯¶xÕ8ŸƒâIU'Ù
+çùÒÐYmnâ2‰g©™qY?$ƒŠ®i·™Æ’3ðÏjŒªí\©Ãù(®pS9ZÞÅ›"•džoˆq<ì ‹)Î7VÁJy$F[­¬çå^e‚Pâ²°‘Å­,6Š3\8û„s#I¹Àõ´ zÛ£K#ãmD·ÇÇ ëEãBÁÑ…‚Ù€BY¤<Z¤ñ\š ?ÐN&•¬+\Ô˜7Ôt ºçŠÑwâÌÇGÔ®¶e ÿÍ)›¼ªñÀ~“gB@Ïå6m4íqó<.êm#Q…Yf¢ô&Iq´È7qbVíÓãmœ¦6†W¨ØBf?› ÞÖVäΆbšêJ„acb+SŠ¼ª’™ò®Õ\/b¾Ö|œ*ýÜ%À‡A«ÒÀL«ìhÌ'Ÿþ‡ƒ¹]™¾üF–e²
+¾ÒÛt‡TÀ˜tYi«ztƒ aT ŒúðêÀMÝ9ˆÛ¿õŽ…> †­ub2”QBÕu×Ñr/:ç¥ Àê1…Œ‹œ@ƒðy]þ±js¦¸€ƒ¾f¯_#¹sH¦å_;ÇEîý=8œ‘7LQÁÖ‘ï‰ùpA{ÐŽ ØçmÕªî]Cy[&س›Ü1ƒ¬º•¥!Ò=¯Ž0¾8”wsYÔÍr ߃ðÄmÚè¤0Žy$r zÚa èP<âç—o÷A®‹®vÁè‹ûªíÁ²¸w²jEŸŠ§D?\î÷÷ðZ®âÉð+KtD>`Öwes¼®%Àqʨ×{ƒŠ³J–7ÒÜ—M…Åwû2Þl Ãé-NÌ'aÀ1ú¬ AR|‰‹òêUQÊer—ÊìÚÞ :G ¨t®b–¯¶&Jv²ú’—_²§þë>d sQæ7Ð:Éݲ|†ŒŽ¥„J_Õ/’!Ù?¶Añ:ÛEáTɽ¹“²íff¡}Âé›øîeê²uÙdë¹i·Y¾‰ëýí‚#(Dœÿe•ÎvN§H蛦sèc:•»ªÓTuÙT!#àêû;„k£ßž“SåÛr.÷–&…§ÀZ¨o‰0"œ©BªK³wX²ýak}oûU‘—u“UjrÝ£Ÿúd]68âQ žÎMÐV5x¨jh[Ÿv‰>[U¯fÐ'G½Â;V²Ü= Ðý5Ú hð2@Cõ>òc æÞ3ÿ5#
+ïà,ìõ»nY;Xš ¥£~[í¦¦)Ûmí[½Ña(XdzcÁªçEÄãQЋãÞÂŽ
+ûe ô8~èõhmîEðú0ì"͡׫J©Æ£Ï‹GêC·÷lMûÁ¢/ëéþjƒÕ÷ŸûD}yïùäî6’_üÿ-ëÿvÏÝ€…V)ÝòCÍ›ªþ7öNl¤endstream
endobj
-1418 0 obj <<
+1811 0 obj <<
/Type /Page
-/Contents 1419 0 R
-/Resources 1417 0 R
+/Contents 1812 0 R
+/Resources 1810 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1421 0 R 1422 0 R ]
+/Parent 1787 0 R
>> endobj
-1421 0 obj <<
+1813 0 obj <<
+/D [1811 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+546 0 obj <<
+/D [1811 0 R /XYZ 85.0394 314.8075 null]
+>> endobj
+1814 0 obj <<
+/D [1811 0 R /XYZ 85.0394 286.8362 null]
+>> endobj
+1810 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1817 0 obj <<
+/Length 3838
+/Filter /FlateDecode
+>>
+stream
+xÚ¥:Ûr㸱ïþ
+?ÒU#‚
+çäåÍæ—$OUzDòýOÞ_ÿøóÇ·W6Kn®úpµRF$ï¯ÿðŽZ?~|ûÇ?¾ýxµ’ÎÈäûß½ýÓÍ»4”3Žß^ø žþžAúñÝûwß}øþÝÕ¯7¿¿xwÓŸe|^)4ä_¿ü*.7pìß_ˆT{g. #R齺<\dF§&Ó:BöŸ.þ¯G8 Kù'Eªt®˜ÉHs¨¬ñi®• üåj• ‘œÛrõ¯syz<6§nulš=ÁËöÍéuóõÅö+)SoŒ㘮_a«¥‘ú|¸-Oߎâ|Ü]YÕ]yº/öÏâZ)z)²ˆ’Dãÿ¿ÃÁß¼Wò²ßi‹û‘z¯³^~¤™€­…mÊ]ñ§v>”uGÝÊ¿ ¡êª«šš E½¡ÆÏm±+y+5b7ì¤@òœNxsWöô “¤Ks'r˜Œs˜€§¸ܘáài#Ú„L6D[ÙRw}WœŠ5°¬j»jÍÀ®¡ÿÛ’þ‹¶mÖ ÙPÿ¡êîx„þNWÒ%å¡é•ÔÅ—2‘  5Êëäz;Yy¤¥HÓZ»/¯dRï`‡p[™Kµñn*
+­NÖEMf½>Ÿ¨Yð$¦kŽÙ—÷åžço'“
+€ÉËâÕe"uÖ¼æîT&Ÿlߢ’[Í€½º»¦åíQÒ#´!K°£SÒ,2„<©9®è‚I½IôS.5Á^iBÂg ZíêfÐÙÌŠpaM¸¯À–àÖØ؆3êf‰?Ö‚éÏù2rïÔ´´t6Üdr¶ù^2K•ËÔ»×?ÀêlÜ75Ø0ŸrjY6å¶8ï»6íÍ*½ cƒ™I›356UK¶1ôº;TSåÅ
+-=³Ü&€N¿Ær+‘fY/ÝÇSsqU}Ù.Ƀå&î}š¹MÙ¡«L©%€îÊÀõÐ j¯­KöÍ1„ q
+dâ4X¨×,¤ $‘'ÿf[Dí6Ð. ¤føO
+ôub?füÄKT’Îê,¬î¨‡F:=‹‚¢fÃÓ»åØÊšÔHã_©¢à­ŒŽúÜ9
+£Ív aÁ2
+šêâíA£·Êäòz™‡VI†ÌiŽ·pÖmŠJ
+F*‚’øù"¯œ ·É·Oþ.Œ£hÎÕq°»«Ìåc²#šHbµ‡ýc bóÏ3® `–éRýᆰfb¸Jí“%Ùž÷c”Ë0`)ªöŽñ21Ü`Kð‚À0nÀŒ-{~ª‹@ðæâ:ìE|ÐÞ‘GhÁÄ‘te}$’´`#{rÆ¡ðFBÿ†`Ûhƒ=Þ—oæFpˆW&–%VuiøÂ"ê^² Ulqh6¶à%R¸½=IÑn‚(Tï¿Í
+[ã£9_¾ªßü
+Vv/Ûð¶Dë‡ §·JefìËú,†'–û@U
+­ÎM•QDeäš#9§æ)b±J‘Š*Å/M
+H™ õŒ–véi"…
+äD=‚Α+É`àu*­\rYmsuˆ•ã+ßš_í&ú÷¯ –CÁåÓ[Žú‘µˆä.Íú¬2Ö¶™-lw ×•ž˜¯“8[<Žü±œA9½Ø"nâÏÒ@4ðq–[½|È0†ÊxHû7,è)Hk±^[+ÐftdÄø’€“i‘ŠÏR
+ôaú±èÖw±(ÆG˜Ì¨QÌ/ðŸpb "ÉÔ€Ìç>Kþ†Æ48zO£ØOÌÛGêpêªäA_¨ü¸64‚‹ÅFÁH¢^"®—»çÊ9ü„§|½–ïW€÷
+endobj
+1816 0 obj <<
+/Type /Page
+/Contents 1817 0 R
+/Resources 1815 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1820 0 R
+/Annots [ 1819 0 R ]
+>> endobj
+1819 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [116.0003 171.5741 166.1092 183.6337]
+/Rect [87.6538 85.4256 137.7628 97.4853]
/Subtype /Link
/A << /S /GoTo /D (tsig) >>
>> endobj
-1422 0 obj <<
+1818 0 obj <<
+/D [1816 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+550 0 obj <<
+/D [1816 0 R /XYZ 56.6929 693.8729 null]
+>> endobj
+1690 0 obj <<
+/D [1816 0 R /XYZ 56.6929 662.0342 null]
+>> endobj
+1815 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1823 0 obj <<
+/Length 2987
+/Filter /FlateDecode
+>>
+stream
+xÚÅÉrÛFö®¯àm¨©°§÷%>9Žœ(•8™99®DB*$@ ÍLþ}^÷ëÐ2NÕ”ìõõÛ7ˆÍ(ü±™U„
+'gÆI¢(S³ÕöŒÎnaï»3Ï,Ò¡E÷Ô7˳¼fæˆÓ\Ï–7X–PkÙl¹~?õýË·Ë‹«óWt®ÉùBi:ÿæòÍ·¸âðçÕÏo^_~÷ËÕËs#çËËŸßàòÕÅë‹«‹7¯.ÎÌ*÷y„0qáõå8úîêåO?½¼:ÿ°üáìbÙÒÒ¥—Qá ùxöþ­ìÎ(ΪÙg˜PÂœã³í™T‚()DZÙœ½;ûg °³®ŽñO K”åf„œ1P9¢/7Í]u¸½;_HJçÍ]ŽƒÛ}¶Ýf{œT7Ç] À²X&1Zi@Æü=¿¯ã©îãgZÄC«Mv¨ãSÙfS}®q|SÅ'·‡MSì6ñˆ‡ù …Wå9›oîý:›g¸]åmç(vyUçûOi\Ôf ¦%1–91â”âˆÕa¿?gvž—Á˹>ìvÕ¾É×$\¤³§„jƒÌ[Ž3ÄÆx$µÙge}“À‹º:ìWù{ È—;ïdåz®`LOÃ]|Ò# -¨¢6¶Çy`7—j^ïòUqãI•eïW/ß~’¸äñHK:^—ü“«<Y¯‘gu„ÙT¸q¡ÁkëÈtljLö™D.¨œÿ«*s?RGÒÂú碹‹ëw9.á‹Ûª‰¢ˆÁVAKìE”€¼¦ø”ƒ0cs°miÄü5>¨€:„†ôú•>\9„[•
+øDŽ7•Ðžn˜
+úÛ6kVw¿m€ò¸ñgû¢ žö5q@7!äEÀ.ÓÇæÏcÂØsª\+dNŸ)äos¯Meq̱0ìÃà„GT´/ýÉÌÇX‘Ìt ™‘¼‘¦s'â ÑRið¶Ñ3áʪÚne±Êu(GçGJýàíà7xOøÅ\ÄŸ»¾Ç•ú¾†7pœ­·E Hî³EUÄ*{¢MµŒ ÙüÞæ‘•Ùj…yPgóH9΋œÌ6ëUýš¡Ì¶3Qð(Ó]VùiQ6y¹Ž{fÐÀ¤-ò?ŠëMÞÝש¹€“cÇÃÏNí—vAUS­ªM^
+ýj}¿\¾ÅQËhñ·ÓñÅìü2äŒ)Ô}<­îøÓÍ]Öà(öç`äð'0
+~ê]± Ù+Ì°ð÷£MqýÇvÃÁh¹µm(ɨ/ ÔPýc”Jû=ßð€iHA¸älhÜjd…8ß› .y횀<läŸò2½‰¿ îàUŸ‡b—<¥Õ!‚FaÂ*P½ÏöÇhéT'ìeå=žŽŠï×u˜°ºb9å»HOOô‘Çø›c¬š6‚—å˜óÃåÚ¶,è¥à¡œemaT• ¾åqå. ÃO,² 3œ._½Åy]­~Öcò²(oñL—‘ƒ°Ð‰Ücy‚ÔDѤ0Åî´ÀP4 %íL
+}!¬ùŠÊÿ¢/ нË6c È~­íÆPb!Æ´94öÚ~ {Õu’áÙêø|û½F{>ô\Q<g#yþ#.Îc‰“]¾ß Rè €ÊP½œÅ¼–š‰&%%†Ë¤g±]0Hè àB:!ò}y>—
+˜ø6îI2ˆ><Ä: Σ-ÇÝ,Z¶q/Tb~ÐÍ6°ÕQ”ᣠl¢Â o Ôà¾}³ÉŠø X¾ì§S!oØa3ô3&‹yltÄXSœD£»âö.ýk"ë y¹N^<õPºþæ¤YÒûÕé¦ô˜Ö‚øx
+endobj
+1822 0 obj <<
+/Type /Page
+/Contents 1823 0 R
+/Resources 1821 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1820 0 R
+/Annots [ 1825 0 R ]
+>> endobj
+1825 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [399.2874 61.5153 467.9594 73.5749]
+/Rect [399.2874 687.9386 467.9594 699.9982]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1420 0 obj <<
-/D [1418 0 R /XYZ 85.0394 794.5015 null]
+1824 0 obj <<
+/D [1822 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-430 0 obj <<
-/D [1418 0 R /XYZ 85.0394 769.5949 null]
+554 0 obj <<
+/D [1822 0 R /XYZ 85.0394 580.7887 null]
>> endobj
-1304 0 obj <<
-/D [1418 0 R /XYZ 85.0394 748.8663 null]
+1826 0 obj <<
+/D [1822 0 R /XYZ 85.0394 553.3134 null]
>> endobj
-1417 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R >>
+558 0 obj <<
+/D [1822 0 R /XYZ 85.0394 453.4945 null]
+>> endobj
+1827 0 obj <<
+/D [1822 0 R /XYZ 85.0394 420.245 null]
+>> endobj
+562 0 obj <<
+/D [1822 0 R /XYZ 85.0394 160.4691 null]
+>> endobj
+1828 0 obj <<
+/D [1822 0 R /XYZ 85.0394 130.029 null]
+>> endobj
+1821 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1425 0 obj <<
-/Length 3036
+1831 0 obj <<
+/Length 3468
/Filter /FlateDecode
>>
stream
-xÚÅËrÛFò®¯àm©-;/`fâ“cˉS‰í•™“ír$$¢L4
-´F¯&¬|€Ç(ŠNÎyј¡ÿùxêe™KP"m™j_T°o|Ñg™S"oò²Š¾ÁÁï.àN¨ãÉSŸMs´$“U‡1b^_·Š^w„J.æ› \+¹!\Y—ûý±È×)Ò.Áh;V€wmðõ®¾˜x8¸Õ®Ôw5Üãt³Ï ²Jô,ŽLlN^°)+’¤O=à{›‘,Óõ“žÞfÇ9Îó<Ê>íÄ]ÞÐ-Ùs‘îGã";‡¹CÊ“¾¨Ü4/š¬ØО'„kt0‡ç–Ùùj—õ÷Çñ€fà&ûã®ÉäDÐnéà_¢lÊu¹«Ã­„Ð37ÞŒe™ó‡ÞáØàÎ×-W=ù≢ÙùÄ/F'êG?/—¯qÔ
-Æ9}‰~ôærVŸ †¸ö阷ºã ›mÚàˆ
-YüxAÁ¸>ä;ŸªÂìKÞlq´ËWìw¬Vã¹k¿‚ºÁ&2«?…¤°?°ò{LCÉH(ÁǦ!L‚"0Ô›|·Ã%'¡C㉇ìsVè }ÜÁ£+ùŽ–§å‘PãcÂ*p]¥UmLÏ {iq‡ÐôBt]„ª›4ß…äù<=ɸl³
-õì¼<)¦œ®HBÂéíX¤€ÅÞVAeÑà]ŽVaÃc¸‰A1ÁbŠÓåÓ×8¯ËõGoý0v!+òâaRZF ÂB/NO%*ú2(L~8-¥²càŒ\6£$dÓ_Q
-½¯ UðˆÙàõ½³øzh8kÚœo,C寵ùëDÐb|@*ÖO=ÏH¦E ƒ¥:S‘rþe›¯·!åðÐÊ U³:ð'Þû;s*FaÅ'¢¸’à¨W€ÓS">c pîYÁº„ÔHÇ‘ÒIòÝ‚m1.ú(Ç‚íˆ çqwó}‚•P¼© Yˆ›ã,Dš@ºK9¡êrÂÓL;Ó³”Ë5S0à*¯?b²è$ŒîÑúˆZaÌËÈ«‚øë.x¨ðVƹ¼Í³• ½g÷VQ ‚"ÈäDJð:kh} “÷”àÿ°â‹{¾]úøˆ»Þ û…üR½S’ó·áBõ9hÔdN£æËK+æ%î£CÃSxKi¨Xã!¯ƒ€Î»×Äk¨.‚<¬uócuM@%´>ï ¹O©…Ic îKäwkk‹qÑG9ÖVõSœpÝÝ|¿¶Æ= ­Bé¦~øa*H‘ $
-¥ÐaåI{ä%’ež”͹œ³UŠNa ÂR“®_St‡QHT¨p^†Ô5ÎÞ ¡&¸–P¸©„ÙqávÚT¬†ª¾_Å9ŒHP6ÃBxHòX±,¸Ñü||Ñ:’pB‚
-Áù÷‡B¸ècœˆ.03kº‹ï °\·b¨J÷” ÷Ë|ôI°ÿCƒ_oH0òCHV~Å
-Ì»ä´HÆÜTù]!¬¹zÊ}ÑzìÎ…¥»©Þä¾ÆÊÐ`ÃJ{Â~t¤u›Ac[ÍéSó§}é¯-»ë±(Mñú¤t°g ±wÉç;œSy‰“CVíó9´P>¥¨]Ö`ZKÍ™~$‹´hÃu F!×
-ðrÞ\B½/ }wÈ }”!×BrìÆ-˜#Ó75F9'd;\$ê¯#²Åø
-ùØïUI›ËȘÈì\žcâ©n›oBß©ƒé³—oÞ\=Åq­UÞÜá M·l|ñËø
-Z&â5£ÿJh¡¢a„-HД'A¤‹îW2ÁlrÒ’ ò–¼•7Î0äísùLÍ¿l½3‘!ÂÀàp\íò5ŽA!p€U Rüe±HͶ„ûR
-4°ü¯²Èq¸ïcQ~ñÑD†$,¶å
-JUcÄ´#.“5€„ˆòa'QþYjLú­£Éendstream
+xÚµZÝsã¶÷_¡·Ò3C
+!<TPÂzˆèˆpVK¼²vÌ<Ð
+#‡Lm½®KîÊÊGte›­m‡ŒbÒ9 ¾ÍÀ÷Æ!5èŒv|«a7ŒAøeÍ$<—‘Å |Aø»]¶6Nž6[9²2Dz°×g¢3عÎöûc¿^¶‡½²Þ^í«ºóCøkÅÑ¡0D^0øÕ“A½ß í6{_³+ ¶ÇÃÎ-×2¯)@ËîÒŸ±È‰Ù¾n’Z’M’
+Sžtc€°ˆ:C‚Ž¶ÞQš'S 'gWG7D®$³z´´Üu<ÌHCd¦ÂÁÊžØÁ®¬ÖQz<æx®¥Ç·ÿæº –ÖOCñiºöVu»¡ž]Éd7³1ÏŒ4¡ÕõØ`&½,Ï ŒØ¾F îqNŽBÃP±Ê¤S™t*“½Êä˜sQAàU0LKoõÌŒJŒ»&‘Ç‚@¼°¾ä=KRM>YSvÏ„‹ŒÓ,YýÖž3¶Ïþœ ò6à¥ÀSÑç¼RqƶÍ*¸z¿“±½ßgÛ-ÈxjJ.1K5[ëS ¼ÿiw"Úôĉ6
+pz¬FwÜé!IB ™ÔeÞs³¢¶•`ÆÖTúIFo®`¥Q8¹Z©êƒ[zeèpUŒ‰ŒŸRe+Œ_–KjzöÑ¿íÝؤº«„ •UÏD”uõhöß î%åÔÐéwÐ/GÛeô¸»º="ïï×h…—7? gafÙð‚ë:Ǥ:ŠB¸ÑNZg.˜„p½¨.}€Fùöë`[ö(é‚rÀM?=6©
+Z@Mv@«KG±žTÑsÎLE, zTñ›F„s…V» ,™å½„¼ìŒ¬|Ù‘\“}Yùò| (hEBò—¤b’*IÂÊU¾\=#=Éܨ^ö™+ùiÏ%cYþ”Ëðg“tå $Ã`zF`$
+s8ÅWY7mÝ2º´0õœÀ½°Î „‚ý>ô»bç`"$}E••ýDRMûQyÅèþ[ø•q8€ÈübÎ… _ê4~}“±ŒâÉ&»õ|ð$°AÊ*=†£Þg³ÿ‚þf Þ{c‹Ý(F$è:ÄáŸÁgy7-uÖÌʦîm]ƒÿùÍð²ìîKÂ=
+åØbºD—\&.ã塇+˜]ê̺Ðû\{m²†Yò~0•ÝeŸHSÑ
+;àk³å.iÃ\·¼n‹ß˜M—Ž'6l9ü›BaŸ òÞ‘£dÌîra0RÏ—ç.ð•êj.¯AÄ›aW©z®8p¥–†Z=J[ÈCÊV"bÞ ,Û®šž+~ÃR îÒ¬¡¶j‹Ê"UTÏl]¡×[aheí" ü¿±:V1\t™t¹F>Ý5†nk¸ ><9í
+ï0Xûõ@ç¾Ì„Él‘„¾TòÍ`!d:w~j·3Ù¾¡FC•÷!œ¦óŒJ!î*lÿi>Š»ê³Icªgá“A9õúRêÚ…à°°J§æCÎM Ìhkë? AÁ”ÄÀ~ØJiÍ~JŠæq¤0"Ÿ«÷éÄ—ˆeðv* \h.Æþ¢a~•5“m1RCGš–ÄÊT: KlÜ¥åüñûÐJ½9KR=. -é&ÁÓÞ$-Fß±ß%ZR5’$êî®véà¶~¢)¢Ï¾OCSŒ3ÞPs¡“$J&À¬’ È@Oâ©8œ0žÔ*º¸>âxžsz #ò«·Ãj†z.ÑTS';¬Ø}¾=ž;ø¯®•Å£î;`ÍWf²¨€íié}M׌iLŸxqUrôv—ÜS°\möÙp–YÔ«†Q\»S£ŸCüž|„Áï +áªq ý4캽æ¼Q Ä$è¯>­©2ªJá'3²£µiš¿|A‡ìƒl`Ð0s°`NQ«×bwüƒF÷%ÌžºaäK“°÷Ñ>: 6?Kœ~ÈÖ^ç)~Gì6È ´GŠÜL»Þ–³uZá•–¦oŒt?dè ¡&_rvokŠ•âtXC‹]Z§…1úóå‚Â.:sès{CMksqê¢þ#:w šY♉½ŸñK’è »¿8½~E#¥NJµŠ@NtãBð q,&øÛY­ÓääkmÑ þ¬P²ÓB.:»çŠd1™ÓÆȚɫäF=¸RL6©ƒ ®gàõ¥rwý—þN§"?œÿ7SÐèÿë¿ÚõÿC tõrþoQp†>¸Uå„B•§ñ‰äî?y§¢ÿ‚Çqendstream
endobj
-1424 0 obj <<
+1830 0 obj <<
/Type /Page
-/Contents 1425 0 R
-/Resources 1423 0 R
+/Contents 1831 0 R
+/Resources 1829 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1398 0 R
-/Annots [ 1431 0 R ]
+/Parent 1820 0 R
+/Annots [ 1834 0 R ]
>> endobj
-1431 0 obj <<
+1834 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [432.8521 109.336 481.8988 121.3956]
+/Rect [432.8521 729.0977 481.8988 741.1573]
/Subtype /Link
/A << /S /GoTo /D (DNSSEC) >>
>> endobj
-1426 0 obj <<
-/D [1424 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-434 0 obj <<
-/D [1424 0 R /XYZ 56.6929 671.1595 null]
->> endobj
-1427 0 obj <<
-/D [1424 0 R /XYZ 56.6929 644.745 null]
+1832 0 obj <<
+/D [1830 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-438 0 obj <<
-/D [1424 0 R /XYZ 56.6929 559.2968 null]
+566 0 obj <<
+/D [1830 0 R /XYZ 56.6929 769.5949 null]
>> endobj
-1428 0 obj <<
-/D [1424 0 R /XYZ 56.6929 527.1081 null]
+1833 0 obj <<
+/D [1830 0 R /XYZ 56.6929 748.873 null]
>> endobj
-442 0 obj <<
-/D [1424 0 R /XYZ 56.6929 273.3583 null]
+570 0 obj <<
+/D [1830 0 R /XYZ 56.6929 537.7045 null]
>> endobj
-1429 0 obj <<
-/D [1424 0 R /XYZ 56.6929 243.979 null]
+1835 0 obj <<
+/D [1830 0 R /XYZ 56.6929 505.9624 null]
>> endobj
-446 0 obj <<
-/D [1424 0 R /XYZ 56.6929 161.4956 null]
+574 0 obj <<
+/D [1830 0 R /XYZ 56.6929 424.1332 null]
>> endobj
-1430 0 obj <<
-/D [1424 0 R /XYZ 56.6929 129.3069 null]
+1468 0 obj <<
+/D [1830 0 R /XYZ 56.6929 392.2318 null]
>> endobj
-1423 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1829 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1434 0 obj <<
-/Length 3304
-/Filter /FlateDecode
->>
-stream
-xÚ­ÙrÇñ_ò‹—UÂj®½¢'Ê¢lÚ1íPtR‰¬R-¹%`Æ.H1©ü{º§{ö
-ì-G{Ë"‰³"KbܵÛíqÁÜmJ³Ç”&9L.üä’ ìKk7~§®¡¯ý ÛHS¯iÉrm[æ©YÑ÷î¦ä™[F[wHÀ NdWdj6—2.’D¹½Ÿ°À¤Q[ÞK)#P-Šè]µ©Öån}O£«fG@é
-
-Ø-ƒÝ4ÝrÜ!¤S±H’âùR“©W©¶¦7xöÀ_-Ê´½îʪ¦ÞÍ~ÝUÛµ¥à%
-êºn¨½äŽš¾×8:
-Ðr\ƽFö‡µBfuÃuγèP”ï"„ˆn+{Gëß´}É®Ül€q‡ÏŒ5Ð)™$[MRÆõlj¶ÌÓä@mÞ/ÖeÛ~ ùÿ™ÍØ”Ýâf¾XW@Iëç¹O¹\îÀt~t3>®uÅþÿ¾
-)áYZÔ}'á߇lLÔÎ.ö»¶ºµs²o8ÿÞ¶›ÝǺ¡fpõû‘xš-ÒòŠzâ8þ¢ ™ÿØ…Ã5󠀉þ€˜,–Ú
-`žR€7õ³®í$÷ À/-Þ•‡æì@35J’mžÛþ!&@“îdlðV-}Kúl›;»[íý΢•_*£ýpeÙÏÂL‚¥‚¡E)çÚvS¬NÝêÖîníŽëö®‡én‰€ßövwOà²Záö+먘Óy .++¦çL9W™ùµ[ëƒh:©Ã÷î¦!À± ß²ý“ÐÍ::릃àíºj±÷1
-#@Fgu?ÖGn{eH)oìâûê‚|Á!ž«`©²\èçJOÇF õEéb“$ÿôr\¢zKTzF×-3וŸBñ&„IÚƒ@ù‘ŒÏÄxõ»»©0‘Ö©ñ)îmµÄ ‘ê À]Ü”uÕn¨éB,§›=Þ#ìÎ[»¶ ßç'ºx¤PXËI A›ÊQ
-"ò[Ï]11£›ÀSB9÷Ü=Ü´Ò†>"Ǭ6K½|T&A ¥K—3é£êLø:ô‘‚ñã.ˆšÛŽ®HÆÆèï‚CÕg„8Äå?i´­»7LêäÖŒ„«EÂå!D”Ë/]PÍ}»`îRäq£Oæ.h›Ñ–ðVüm«ëÚjG]¿*•!d\d}äðHXÔÁ"
-,«z˜Pl“Æ21þîy$ø"E­T¨¢½Õ½Õ\xÔ¾*ŸŒîÎ ‘‚ï"y¦ž6I€õt¸ã1þ ·µ}R#Ô¡ân·î…¿Ž
-j8Vyî$qÔðÚ0»óDC¾“ÔÆžåQÆõQ.°·ì¹Öä‰d¾Õ.f¤g"ŽPìÒÖ îk¸î'úg¬ƒrÀ'*ÌæŒzÖÅòA˜À~Pç# 35#?N¬õ8Ï’Œž% eËýËì0q§ÑÓ¹½ò*iÆÃgçÓi0°ßà{˜Ã{Þt¼»wrþ¥ÑmVÏýòÛèÍÞE0H?kŒ7Y°;lcQ%ýKJ5œ™€ñ³ÊÙ¹·ÝÄb)[ÿä²ÙVk»œû#Ô—7kƒÖÛ‰/Á⟪Êrü*¤P´ÔXËgXFcŠP¼x‰ToP Ã¿Q AvrŠ¤¦Æ\©¾¼ßGåÐ7”úpy&9D›¸«Üw Ì®pª÷¤™yŽ™ÛY^(J÷ , "[ÒvÇœÔ÷ÁPÍÄ
-ëÀ¢â rËâá»
-,Pñ,ß!Š"ôÆ’÷â
-p8Æ%o#‹õ¼X{±°ÙãИ ]MâÚî~‹·ý‰ —ñúG$ÿ¾o9ï8Ìk o†Øê÷ñù—@q¸Ö±ÈM2}>ž¢¿òÁþWã§æƒS’ÕË—4åÒ]>„Ú›f¿^Ì9‚ø’â
+1838 0 obj <<
+/Length 3726
+/Filter /FlateDecode
+>>
+stream
+xÚ­Zmܶþ~¿â¾uðªâ«(ä““Ø©ƒÆIí
+4 ݮ֧X+m—Ú»\Šþ÷Îp†”´ÖùÜ68–¢È!9óÌ+%.sø—Îd¹*õeQêÌäÂ\nöùå{x÷Í…à1ë8h=õåõÅŸ_ªâ²ÌJ+íåõnBËe¹sâòzûÓê«¿<ÿáúÅ›«µ4ùÊfWkcóÕ—¯^M=%ý|õýë—¯¾ùñÍó«B¯®_}ÿšºß¼xùâÍ‹×_½¸Z gÌ—Lá‘ /_ýõµ¾yóü»ïž¿¹úåúÛ‹×é,ÓóŠ\áAþyñÓ/ùåŽýíEž©Ò™Ë{xÈ3Q–òr¡ÊŒV*ö´o/þ–NÞ†©Kü3ÊeÆÉbR.1Д™UR¾<^ ·ê÷Wk%óÕp[ Ô:ôMÇ;{ åV÷·uWßÕG<5ÐÚB™ÚÀŽjWíë-›nA[œ’<êxåV§Î3õ†—óuíãnê…¥
+•Ik
+¦±¯ºê}½]¨ü‚¶Ìr#ã‚~¨†z_w/¹¹­7âb=ýî«5oäxöp¹VBgJ{¹"+‘â›—_Á`­VÀv-¹‚P×¾Ö]Õmj긭< ©Z¢\myèM]wôªéš¡©Úæwà_xµëÔ@n„!þPošŸó\Æ!Û—Â3Y»ªº-SÚÑ[ßó›À`ìhö‡ö!œ*ŸŸfßßÞ BUÐe¹ºËB óõ¡£éèwY^Âæ
+ Q€Ût†ôûƒ©Á™žD+©¹+¶6Ø66Sru×ÚÚ¾{_3vo˜¤^ØÚEX“Kð f&[ÊT?aýGÙõ]‹ö$/hóð:š;„özàu[SWâ¾ Nawäj»² ÇÎ×ÿ<„²b…vOJÀuÛ|X“23¢Œ
+ôz‹Ø/lœ•óÆbu: ÛÜòBÏy:Š‘ZU÷@{ r$¦MÎ`¼}
+:Ø üú¾ïhdì9ôÞ77iúâ{ÚÎ -(Þ’e\âXB´úÝlý©é„ 9ó1JãèÆ/ŃìÛÄþX ‡~:JͤõÐV9ýú ÈÖ#O¥Y½ÅðS–ŧ²©HÃ>±8«Å$4¤‘S†fuÀE ˆD|$ïèÜ4{Á÷žãz°Zåbéá¾'K2óäR7U7uõåªþ bá!ú𡽨+ð¦(G§ß?¤(bÛÌ6`“ÈeÓT‰FÆä/ƒ.X:
+g ¾çmTûžH•¤¤žc^­L«-Èv¾6¹“ÛþÔnç.¦jï«ŸÆ>TÜ* ”#ㅠߤ[ñ”Hó¬,Uôt[°TÀEäéG_áÈW
+ßqüCíßõÇw˜ˆáãâV~š°‡,ÓÔ“eÙ/Ÿ˜€Šú.¥ºçsÖ‹ ¦ýŸ#èk°½:·#ìSøºFð¡zö1ˆHÿуýY
+!êC=©KÄÈàþ–ã—†«
+•Ç@ „jõj˜¿<TGp!§¶:F²`s‰9ÐÞÅ@„1X<-çmôèDØW§ƒÅˆ´NÃ’zÜVwDÆäl×s®BqìÔÍ¡M™.²Ó/VÆ^T›Û¥p@C\gž@ŒÉ¤åLjQBk–©"Jy ôô±bm!8Ö†ŽÀìAøCµá~®ªC‹“ ÁIôx®HÊPaœ¬ãO7!ú˜®Ä.TfÍê9#«ùö !4£Á‚ Qaá¡¢øÐN: X)ÆwÍÀƒ|Ošœ'<¿ú'ƒ â}Œ¬'¤STöQ‚&dòûlCÏ/N”ÝÍ•©Oyñ9W'2+ƒº/]œ¬Åõ”d¸™íOA¤jJ©Ç•“ñ>ߤA©Ü&Å'6©%„<Ûdð@  ¶YQˆˆü~7J'4ÀòKå«2+l>fÒè¾bRfÆ„hü#Œùåh8w
+6•©BÉKŒuµ1æ
+ËF¯n y^¼ÓOˆÙ&½Õ™°eŒþ«Tä›áDãÌœâG+qJrQÛzWZ>I(6)Etbša;˜‰XœºÛ*dŒÀ‰ZÕž³°Pƒ¥w)r‹ÙVI·¤ì«Kòçt–Ž
+þ·p)ó}’{€5•ËOr€©ÿ ÷N‘ÉUñ ­çà ÕâÕ
+?Žf6׬æ:9W «¹~¬ì YzauñÄve&”Ü.IÈ ¾| 5˜A£ ãg´g5+4"Þ$ٜܽ 4|HñUÇ-A—všÏa/î2|øãÜYÞËVo\G„Û
+"ÂÆŒÓ'èx†»ÈJŠerÉ„5Ë`pŠ(õoæ¸|· º¥±Œˆ÷PØ>+h`èÅÙëQŒ“/?øB4¦ËX(¡@NéòY^Kþ.ÜÀI£¸¡¢z)®U{z``³éÆ ÀÖ6FÛYÁÛ/—áÔÇ_Mmv¢*9QŵK•*µÃqK[1
+Àfp@ØÆ‚§íb샗ôò¸‡CP²Œê­ûp³Š­Ñ’߀.¬Ê4Á|àÈp%J×FA+¡oâ´)øš_„¯+xÀ:9Ø wVí©¦fÃăðžM
+ çãº%œ>ö¥UVè¤ãŸo‘É%ÃUjÞ–Ž’,5Ý—ä^JP<·–«ç-}]¾‘oÈaÈÎ’ÃlÜVwõŒ=„£òØY<vÃs—»6
+ò[.¸ì§<Ê´@ÊßMøzüha.8¼j§-³V‡˜1´¡ÔÛšo¨€©ö‘êô°Ÿ(1›Óò³3… Ùcß¡*H”Zúj4O¥ÞÿûÕñ^]d`Ðåòç§*·xÓUÄMá \q¾óô1ëÇ[ÿÎ};endstream
endobj
-1433 0 obj <<
+1837 0 obj <<
/Type /Page
-/Contents 1434 0 R
-/Resources 1432 0 R
+/Contents 1838 0 R
+/Resources 1836 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1820 0 R
>> endobj
-1435 0 obj <<
-/D [1433 0 R /XYZ 85.0394 794.5015 null]
+1839 0 obj <<
+/D [1837 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-450 0 obj <<
-/D [1433 0 R /XYZ 85.0394 675.8159 null]
+578 0 obj <<
+/D [1837 0 R /XYZ 85.0394 500.2755 null]
>> endobj
-1407 0 obj <<
-/D [1433 0 R /XYZ 85.0394 651.4464 null]
+1789 0 obj <<
+/D [1837 0 R /XYZ 85.0394 475.2167 null]
>> endobj
-454 0 obj <<
-/D [1433 0 R /XYZ 85.0394 522.8339 null]
+582 0 obj <<
+/D [1837 0 R /XYZ 85.0394 345.3976 null]
>> endobj
-1436 0 obj <<
-/D [1433 0 R /XYZ 85.0394 492.6901 null]
+1840 0 obj <<
+/D [1837 0 R /XYZ 85.0394 314.7239 null]
>> endobj
-1432 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1836 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1440 0 obj <<
-/Length 1169
+1843 0 obj <<
+/Length 1604
/Filter /FlateDecode
>>
stream
-xÚµXKsÛ6¾ëWpr’:˜ïÇä串ëLí¤ŠzR5Šm4$Á€ e%ê/H
-X¼bWSi7˜ žÈ£¯ vd™„ÿÒ}Ò|—„8ÝỜPÄÇŒž¤—³Ç×ÃOá68£ÊlºEåŠÐU—ªS_ºw³íÀ`«b¦UÑm¯HÁÚ+b€!û<X_ *y-2E½$„r—ß3Ëx&ÝÑpsÒýMªý5ø².F_—G ÷ƒWñÖª,P4@:7aÓdmC}}íLKv’Ñ~ñð?ÆMü˜P°Ë×i³;¡$1NxÆDy¤âïßn`XV€S|ëà<qSL€{NÚ3”Üu\#¯²µº¢¨kà˜»<©ØP$ãY$†³“z:uSù/;UÂüÊÀ¬7(Â쫳Á¢@ŒÒp«*Y^îÅå`³%# $áéÅ+ȯhû”¦çÚ'ú½Ô®äDUçu
-À…Ý ×]`¸´<Óæ8г-»ù¥™r`ày®ÖßgŽ—b}ùÜ£›×˜õKùÈYoëËŸ~ïÿ­àEªåûfûÖ6ÍNÕiz>´}"•j*Yÿ‰æêåþTõDäƒ7endstream
+xÚ­XKsÓH¾ûW¸8ÙUh¢½7§
++‘oV±ß×€%4wunP¨\hÑk…¼À•”ßðçòõ`í nJ]©@¤Qî/wWI, #F(óˆ· kºäóÍÉÇg–5JÂñ¬7-ð~¿0½
+¼%·Ð7WpþªQE@–äJÕ¥Žì©Ä`ñ}8žC ú1T&zÄÐê1Ú³¨›^ ã6¨
+\·ûKÊ<¸É™„â(ûÔ» ‰£e¸Ý­âð()w õm÷PBZeáV/Ú›ðå
+Úøʤù¼dv­î—?fí¿ôÙ±|Ÿé¿S1.÷>(‘N‰(}ÿÀsõÕëÐõÿ82Z[endstream
endobj
-1439 0 obj <<
+1842 0 obj <<
/Type /Page
-/Contents 1440 0 R
-/Resources 1438 0 R
+/Contents 1843 0 R
+/Resources 1841 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1820 0 R
>> endobj
-1441 0 obj <<
-/D [1439 0 R /XYZ 56.6929 794.5015 null]
+1844 0 obj <<
+/D [1842 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-458 0 obj <<
-/D [1439 0 R /XYZ 56.6929 469.1685 null]
+586 0 obj <<
+/D [1842 0 R /XYZ 56.6929 267.6943 null]
>> endobj
-1323 0 obj <<
-/D [1439 0 R /XYZ 56.6929 441.8256 null]
+1713 0 obj <<
+/D [1842 0 R /XYZ 56.6929 239.3021 null]
>> endobj
-1438 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+1841 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1444 0 obj <<
-/Length 1176
+1847 0 obj <<
+/Length 1107
/Filter /FlateDecode
>>
stream
-xÚÅXßsâ6~ç¯ðcèŒTK¶lkò”KIš›^îJéeʼncû,‘„÷¿Wþ†@°L‡ñ ËÞÏ»«ow¥E†©Èð4-j.µ!11üiÇ4îõ³ë*ßÕK þÖ§Aç×+Ë5(¤vŒÁ¤†åAÓó1†g—¿_|ôú]€‰yæÀ. Žyöéæö·b†—_o¯n®ÿî_t]ûlpóõ¶˜î÷®zýÞíe¯ G–Ç%«›?zÅèºñåËE¿;|îôK[êö"ÓÊ ùÞŽL#Ðfî˜Ð¢1žõ ¥Ø˜vlbAb[V5vþêü¹¬=ÍE·ùX$v·8ÐF5"ÓƒÔ¦®á
- [¹‡]à˜æY+1™ÏRŸƒ'§˜ýÇ$¦Hœ1 ‚´˜Yd&Ú]Ð2‰þ8‚®m‘é—üÔu£6¯AP!<LâTC‘Œ³›Qqw^ür€(‚87!H ÁuE_㈩˜R _“s.Çq:Žâ-pæV)îÁ E ÔˆHñTß•®˜Mïxiî°¸½‡‹6qõ‰èDqÀå[̆ÚU(Ù?S³ôPjžð¦ kVL±;&Ka©RÖXƒ©ˆ@Ê'Ú€ Ä”dÆ”½‚Þj¢Òù±zñÈç )÷UœÎ‹©„©‡qĦ¼¯<5µt¨2 T¸?
-÷Z¤Gc™p¿Á×ËèXÙGá|1©T­¬(qx*×èø [s„x™¤ààòœKOÒxª‹ÒD'"ù\¶êFMІ[ë©÷aúö´ßÜ,•{<þcµîkbµ|¸h³‚C]Ø—~´_§ÑP/p‹ä‘q<wGß×HÞvߣQª:D ƒWDï~Öâ™:)ÛJµP ½t¨Jõ‚²Á¹’ü% …/ÖÉQ°d©£å§@ÀCV
-IîÇQ ›]"¨|Ø>Z“ÙÝ’­u7í·Ì)Ë)Γõäýö0éRha—”‡I{ÇaÒ>ð0¹:ª¾õ↞ûϽԅØÉ÷¼pîŦ±åÒ»EZ¹µ†ö!ºRˆ!MuÝëZŒD®é| 0v!²=¼•3ÉÁN÷¶‰ªµ&ÊÒ;.´\lïZr\ŵ eSº_˶­žSGçF«}@«çi^ S4/ð¡Í‹m=I‹À¬‘¸¥ƒ¨¯òsG÷+WÍ\[óÛóð²‰q­i™ô0u+¥23º©ù²±ùVõÿ
+xÚÍX[Sã6~ϯð#éŒTËwÏ>±4Pvºì6MŸh&#lTË+)Ðô¿Wò%qˆ;¡³;äãèÓ9Gç*d˜ê‡ŒÀ…¦:†:Ð5‘kDóiܪoTýÔÍ}œ ~>·}#„¡gyÆ$i`Ð dLâ듳_O¿NFã!°\óăCàzæÉÇË«_JJXg_®Î//þŸ}çdrùåª$Gç£ñèêl4(p‘ZoU/,8¿ümTÎ.ƧŸ?ŸŽ‡ÓɧÁh²‘¥)/2m-È·ÁõÔ4b%ö§ í0pGõbB†–18® ]ǶkJ:øcðû°ñµXÚ¦?× X~‹ÔP 2:¡oøn=Û² ^gš' MI9’Ó출(‡©–Sm‚¡ëZÍ…s,$áz9HŸcY’ÿ2]S’¥\sü¨æ¨3ÞßlÁ3œvåíò²Õz èS-šÍDN¢»+1·2°,]­Ê…ì%E…C¸(ßÿ)‡ê+Íg8ŽyEË—º~™îl!¬÷+†;(‚.n°8ìH‹Õ gsÓ$!œd©äX1c|–±®0ržƒ>¶õì<i&՞ɳᢇ•.K”Ý6L#[Ìoï…"9΄R
+ ±2y¶]‘ЋH’Î{!íð”1I“U«^Öå@–yJ#*wˆ¥ÛmÞ=·1IqµHˆe±è,v…  ÷·¨|qsOVûjziÞÓî+î„Š Ù†
+¨x@øCšg}]¾L;Û¢ÆUO¦,d,®#\O÷k¢èË(¹ÊÉA%Æøç*Ôr’(tp<ís"ùêX>Ž‚PÁF¥@N"Éxvr,ïfž“Bà…
+tq&T”¬iÊ×uV[Gœ`IÖ,I:ðòD8Svª'2}Û›€eÃP¡;hªz¨ö¨?kªvÕ­ÓòU^¥Xˆi]Ä襭°[{)~ ^ÓŠVh¦­ª8Ò¡‹1S5dt7KUÔxµà±öA¿-ÿ_0Už<¶Eþ:ù¿3·‹\€¢×åçÆ÷ß¿BŽîHtîÅ}§ì½š
+OСýJAl‹>E@£iu)A³r~h‚)BD”×A«¿`8¬Í »–ù9°¡xV{!ý~íxmŸòlµó‹mQ¡ì(['˜¦k•š'oµA»GNqºÈ›óË%­½©K#õûRtD_jý0})ú¾}©õ#ô¥èè¾Ô:²/m»%²]¨¯vZîtÔSízô ÒözÍQ-KX›Ë!Ëj\Ù¦+ôk¦´´AøœóÍUÓ>ëÿ7ò>×endstream
endobj
-1443 0 obj <<
+1846 0 obj <<
/Type /Page
-/Contents 1444 0 R
-/Resources 1442 0 R
+/Contents 1847 0 R
+/Resources 1845 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1820 0 R
>> endobj
-1445 0 obj <<
-/D [1443 0 R /XYZ 85.0394 794.5015 null]
+1848 0 obj <<
+/D [1846 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1442 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R >>
+1845 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1448 0 obj <<
-/Length 1031
+1851 0 obj <<
+/Length 1084
/Filter /FlateDecode
>>
stream
-xÚÕX[sÚ8~çWøvFŠ.–eOi
-Y:[ºKéK)Ã8XOM-±)-ýï+_1‡Ûfgvò`ùÈúôOs‚ ¤ÿ°Á,h9Ä1¸cB†03¦‹2æzî¾óo@ñ¨~õfظéRn8бˆe g,"ÛÆÆÐ5-H`K# æ݇~·wÿipÛâfsØûÐoÂP³Ûû£“î·ïßßZ
-™Iia •€•ÙtéAý0‚„Z䀀&®h#h! Å™-Jh*à¨,„š ÷;ˆ…Š×@ù ‘ÙÂÕâAÄÙ¸=ƉÃzW€1t#;«@ù`áJU,Z 9‰âIŒñCÄ# #(‡„B#³@Ë¢âW»Ø£˜N¬?¢0÷,MB·pt4 \)ÇÙËÏtéAXµ^æ+ýPµù1óƒü©b?œ”ë]öD æ®ò£Da°>C9\…™>ŠéWø$3ÃÄГ‡›™ëF±Ð6¼ƒxs“=û‘ʽÅ2 *áÁ—t&u¦×êLžé,Õêá%ñÜ ˆžÀ·•ˆ×jf÷¼XH9Y¸jú8 |™»÷ë%+˜úD®%×ÐKˆžï«eu<‰–I 4—ÇÞ‘º ?~e¤—E²Ì¢X«ºUF‰ïj»OÇÙñGƒhE½-JâÕfæÇR¥lŽ#b¹süù¬¿œ$Û–Q¬J{ò2ÞÙÂòwtr¨d²È#üܺ¹³¬—›s¾Š<ô`\‚ïª6ÒþŒOÿ-%iEÅn(g"¾§ÏÙ/K.U $E]
-´\=”~V—ÖGôŽÃ%G­â©Ø‘¿4+‡°I!0w %œi$ÈMÊR ßÒ)Î-£bßűËol]æ@ª”áOð·U¥jíSu8$ºzxªQ]Áp§æŽWà,Y+h '³†«y)WÌXMîØãzTZB0ÄY¯$-á›69(íJ
-P+o™N©Ût¢RéT"•?•—1ž«ÜW^˜LüP—°3 ¯(bÓ:ø|¼Ïäºbú¿®ÇË
-îU
-iZWH癶}<ÿ“úuµÖóùwKnZWr?ãÙ>Êå¦K°Qšg 5 A›sZvèD_åì²ú£¾,ÒF#{}«K_DB?+_‹zÙà“tç¢ÜhÛÎ&0È™Å+û@œïô¹ÜiØr´ÐK]v×4ë”Á¤Ã>ÐZ£Ò¯«ùí9L©m“²G'¤âá64m ’“J<ãhyÑñïSÿnQ{Àendstream
+xÚíX[Sã6~ϯðcÒ ],Ëš}biزÓeÛ4}J™ŒIЬcg%e!þ{å ‰ ˜$Û}h‡a"ëòéÓ§sŽt„=äþ°Ç"<.|ÈfÞdÞAÞ•kûÐÁeðØ T{½vŽN)÷ ¼á¬‚B†ØNGÝ
+ίR¿q¬­!à‰{… R7¨Q†'<Á· J5xNUpH\„ú>T ¢.JrÑH5Š-x“¬´Œ“¿…«¿+W‰ ]ÛßÀõUi Ás´—6çÁ9ä( ^ÜM¦á èS4ê½4lÕüWkòõVžpH9ñ·iÀöóN!õ…x)ž´õƒS}—’ðF¢wi"±‘u繚˜ÆpÝbW¦‘.##Û†·ú™£ åLKs9;\»€àçL¬^íËc?ˆel(Â]7äNê$ùq¬_‡„BóX\aä.WåÍYmf4ó'ÑãBG“82f}wÌQ¬]-Ê×*±ïš´˜©¸Ñš^°AË+gÈiR¹=´R®¦þäZN¾€lMfãµ7‘Nîg‘ŠïÕU’jùìBZ®ùè¨ø=OKÇ<›/b9—‰•Sø#u6vyù’xQ§7àëRêUí柅*iÌxÙÉuåÖÿÐBÉ
+¦Û‘ƒÁîºA/XŽŠâå¢Z§‹ÌZÍlo›Ñ·¸ÿgÁ"f©vªn”±òÖÞëèæ5EêDRínP²UÝÏ”6vœu¢Ynÿ¨ž3¶:Í\ÆWsµ‡Ö²ü“Üç§û$•ÿ§GÿRz´ÿž0Ȉ mó7åLÏïê9ù!9SÓc uÞIiÓÓû/¹îýP¸yEõ]š†dýHHå ðú¡)IeÜzÆüñEñ9õ
endobj
-1447 0 obj <<
+1850 0 obj <<
/Type /Page
-/Contents 1448 0 R
-/Resources 1446 0 R
+/Contents 1851 0 R
+/Resources 1849 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1853 0 R
>> endobj
-1449 0 obj <<
-/D [1447 0 R /XYZ 56.6929 794.5015 null]
+1852 0 obj <<
+/D [1850 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-462 0 obj <<
-/D [1447 0 R /XYZ 56.6929 121.4768 null]
+1849 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1450 0 obj <<
-/D [1447 0 R /XYZ 56.6929 90.5476 null]
+1856 0 obj <<
+/Length 2052
+/Filter /FlateDecode
+>>
+stream
+xÚÍXÝsã6Ï_¡GyfÅ%©ïÉSv›ì¥s›¶Y÷åÒL†¶èX­,¹’¯Ûëÿ~
+¥ÞMÏÞ^…©—³<‘‰7]èÊÏ2áM‹;ÿý¿.~œ^ÞNs?a“ N¸ÿîúæ;âäôyÿÃÍÕõ‡Ÿo/&iäO¯¸!öíåÕåíåÍûËI ²XÀzi5|eÁÕõ¿/‰úp{ññãÅíä~úýÙåt8Ëáyñ ¿ŸÝÝs¯€cÆY˜g±·…g"Ï¥·:‹âÅQ:Nuöéì§AáÁ¬Y:æ¿8ÌXœÉtÄ‘8p Œ%‹„H½4ÎYÊÐxðnÝ´ý$H8÷ËõîitNŸ{<£ˆ(dQ",cIkIdÓé@U}зªîº ºfÓÎ5Mît÷дus¤*ú£©uÐõª/»¾œw'
+FÌÔˆC5…êÕLuÖ€®oËúñ¹ÅG6¬Ê:hõ¢ÕÝ2èË•URoV3ݾ\‰úü”ˆ/-éÛÝkíxŠMÕ—ÁJu½[ô\@²‘t ¿ÎÝ4.F{÷‡Z9 ïæ•ê: Ã?ÍÒQµýn=Ä03èlfçÏœEUU³ ~ßèv甿( TÝÃJõóåCè#þ_/ðO§Û'€¼U¡»#ÅwCbáü‘¿cNùs{‰‘½ÐS£ûàÄÞúû—âo'ÞiœåhœÃ×ÆYžÄyÑ´[ÕçÏøÈŠÐàó¦®vÿ]”m×ÃH¼÷Vn¿Ño•Ð†úhûBWúâÑÔàÿ6óNì<ÿ&:Þ^Iá ìšíˆKRŒ-Xfй5ŽÚí'€¦^麧áwúÎe]â¶ÄQuAÄÏzÔÃ>û懈X‰è`&ìNÿvšNrðóò뤵 Áaâ…"ƒÃÉüEÍCûÎããÞþ93rë«ûÓ:ª,éV«
+†#2‡‹ O^°÷Ë,Ëàèn#¹Ð¶rµ<O#–Š<ƒ=PlºDÏæ®x½TU2Ë}Ec×^ž7ëQÍ‚„z§;QD s,¨Ó`XÛ²ªˆšé±TS³ÊF½oè»n'"󛧲°jÓ/›¶ÄÊøäXu·5UdeÏN p›ð}ûºx!0DžÀMYŠ¨¿»â«Hs–ñü«€„IÓÄ“YWG@W©'=ÁÒPØð_`LR+kH¨Ì/;â(úßëuUÎÍSü‡ù$V ÕHJ°/ó]òœ¥QY3hm7bm˜²T:k©yƒ×z^¶šE)Ü}³è=X‚´AêÛò&·ÄX5t]ÿH³¦e ›.
+fåÂ.p‡1Ê+Ð/Uï(»‰s&ðæPwÇša¯æ½S`°ø›5¤]VÒdâ’m0$q» .Cî´Þ3ÖG ¥k²S¥jb«ªkÆÒ ’0Áµöú‚$nj¾°k‹d6DÊðq¯Œ€ùïvÄ+ôBÁô Eß½9ìåÜÀ£y¿ ,_¹©ð©yËTúqHÓTàK®
+bye™îZxdqz°|ß`Nm1~EBP3”—
+|}¿
+á)ÑöXŸ“ndnÕ­±Ï©—\P_tÍ›T™ÂØ.$cYÏ`Oßfaœ‡k >ºèˆ=@i´h³&!º!
+PE{Å#Ú¤`ðHtî°
+¡Ãð ™4úØ8e ÀzÁ! »dóªCÔL/•»ú?™?Žêªf[Yº\Ðw×lì+bc³ß–œMѲՃbéŠ êSÜc¤(máëØN@Éc&sÇŸ÷ö×="|§žQÄÂ4ý³™{Î7¯þk{ÿ¿?\¯áæ'‡§Çñýœ',“yê…1]”üKo¸?ÁØñÿôZ<»endstream
+endobj
+1855 0 obj <<
+/Type /Page
+/Contents 1856 0 R
+/Resources 1854 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1853 0 R
>> endobj
-466 0 obj <<
-/D [1447 0 R /XYZ 56.6929 90.5476 null]
+1857 0 obj <<
+/D [1855 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1451 0 obj <<
-/D [1447 0 R /XYZ 56.6929 65.321 null]
+590 0 obj <<
+/D [1855 0 R /XYZ 85.0394 385.7919 null]
>> endobj
-1452 0 obj <<
-/D [1447 0 R /XYZ 56.6929 65.321 null]
+1858 0 obj <<
+/D [1855 0 R /XYZ 85.0394 355.678 null]
>> endobj
-1446 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F21 714 0 R /F22 737 0 R >>
+594 0 obj <<
+/D [1855 0 R /XYZ 85.0394 355.678 null]
+>> endobj
+1859 0 obj <<
+/D [1855 0 R /XYZ 85.0394 331.2666 null]
+>> endobj
+1860 0 obj <<
+/D [1855 0 R /XYZ 85.0394 331.2666 null]
+>> endobj
+1861 0 obj <<
+/D [1855 0 R /XYZ 85.0394 319.3114 null]
+>> endobj
+1854 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1455 0 obj <<
-/Length 3466
-/Filter /FlateDecode
->>
-stream
-xÚ¥]sÛ6òÝ¿BôŒÅ
-H È+’3Rs­U¬tâ@'’4ÎŒ.‚NX=Ò m“Øäy>ËRú‚J±)û¡Ú¡lÞÝ3šžÙ8ÓE{à´‡uÂ,TÔW»g˜OðºìÈ‹¨äßB‹àE·=0Ô­xÒàI,ËA¬:™ÆþìÚJh¶KF½ÔMÃÐc…çDæiijèhåcS±¢ ·»KGÝs½”r?¬»]=”CýìQmÿRízþÁç
- JÏö„f9iù+¶ó 7ÓѶÛá}2¥ cº–¿Ì
-
-½±
-ÇJKs[ž[NIo[Ѻypä©ËžX`¹<V4ÈŠÚŸì‰
-²|Ž4,}¨‰Û¸¬;[~ 1çL"¾'Ú±ªDÊ¥A;ÈóRk†ÎŽ¸‡Ï·ú½:à±RUD·+!˴С†÷Ä/ɇLy5ixp/˜éïÀ‰_ï)‘ ‡eÊ ™!,ì<Ú p\ T|ñ&ìUªû)ñ‰f¢ÄuÊA2QFÎÖt`)‚9þ’3
-|Kþ¾‚ýPîôÏÎE¿ô~Õʯšà›'o”æ¸h-º x™%Ýh0ƺ]ø‰»1×€|ªeÏè ªã‰ö[žÄ9`«¦ÞÔ“´_)QÃ-¢7 ÂŒ|Aåd<'Lx²/õrX£’kÝu~†÷á>c€É {ª'™ÁV=)¹/*U52Ü{¤$ŠUÛ3ŠŒ0ë}+V¶ô#+™»îö=œ­Jz<¤Ikzžµ% g‡I9ºX¥ˆË8p®XF¼:‡ƒD ØDû¾bDÉ¿‡—nÞ€Ê6Œ÷OÞ ‡úÅBã%™2>A
-hÞ.÷^>—})A8M~ íÍ ëS„ê+íƒZNdÊ„47>먟Öï²mÊEåãG%y$]65É©¼Å’Á/Cp8¾â¯º%Ç
-é&¬šÃ”ÿfŸmŠèî3~óÖèKÎÉ#¶møéËD‰C
-Ù ¬ÃÄƺè³ðñ\¹Åÿc( ™³—ßvYKþ ѳ]ò ‰œÛ’²f%áOy?
-ˆî>Pƨ¢«ªöc|È­“™U烩ØɱU£CÃR„ÒÉxJ
-Ä`‹ 1Ϥ’GÉÃ
-@*$ÙyVÉH"
-漓å‹nß,|ª$¡-‘Ñ„’Z‘æM7TD8cÈß
-Á”®Ú3–å‹PÝò ôܱÁƒ+¼Í
-­UHùnÅXÉÇ<üˆ?¨àO`™a7ÃÌ?.8aT”q‡ÙˆòMöYX?•=Þ+Ù<RTq&Ò¿Q^˜°Æç *õt
-¹)Œ¼n“IåI‘eÜ—>& !öõâUPDDòRWwú«è¨òU.Ñ
-8õëÇ¢ TÆúkÛ@§­Œ$ÎŽ“  ¨â· †¶SQÀ7HwYû6“<vYèñ낦°4È]\TNЇÙå".×?^e&Ίô¬ÙòÆ0sƧ^å«€wÞœìGoš6?½ÏôóZ
-Ö’æ¯Øv%y׺^ ÿ±Î7Å*·[ʒѹvŒúc_íêJò{­S`ìrz#ðdÄ#å_Ê ž%P!| øxàa™Þ$Uvì9z T7õ¾n ŽÿtœgAüÄ/—Æ6IÒSÕÝHý—È«C"/ÓU/†»¾˜š´ü­6ÛáÀ ¼ýhsôÞæ´øÒ äôoÜĶ–BûŽ6 F^…惜€¹„Ó6v:)ΞÜÎŒ9±ÙHâ£lx¼±’#Jž´$äcÁ{ÅÉ;XÇŠsOLæAt–ä•Þ?q䜢=HÙr<G*Ž…ÏkylrçŸÝ–ÊÃ)kvqø4sb—BN¼÷›­x3n:t\±4)YõÁòL¦íy‡©–0Fþ‡ÞºÕ1<Í&ù%hœOâÛv9kýân>aϵ{„P<a p&›ž+Ô?ŠXU¾ec›g¯ëò.h 5n%*[|„À¤ÜÚ×aG¥aÌ‘MODQ‰ÞÔB,Üp@ˆó+ŽžkjÚÃ*LÊÉ¿Çý Ž\ jî0â—3í|×ÆIÞNPHbЩû×ÅJ(<5Èm8?Ù
-2“BÅi–Ú©?¸‚Ââoþó®ãß¾Ù,NòüØ€>ÕN…=©"Ãà†´{Ùë¦;„è47aÖèèÿ@y"Bendstream
+1864 0 obj <<
+/Length 3279
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ËrÛFò®¯àª2áÁ`0
+³ !’…@[¿2
+œ*´VYjÉÃ1VG êÇ<|ˆ?¨äG`™f7ÃÌ?L8bT”­\Ï
+'qLˆ?Ø¢Û8>Eä‡#åÓåÓ ¾[ïÑ¿†Y§sèëòè¹yA‚à¢Ã0‡pA\BÜ#¡áXŠÌPšjOi¾S à x4¢Û«n×`ÒðR{椵Ýqœ·yæLæ3DA·ŽýÀº§f¯ S¶»æER ˜R¯Ýî~Ù÷óét×·6z¸û”IÁ/£°+˜¼ñ ‰ ž§zÀXq|6äÖ°ìœÎÃ÷É¡7í»ÝÖMÄð2!j'Ã)µ² ,…8àø”J|À'$2õ®uk¦–¡g©¤`Rsø÷›'4Dz&k † /l¸™ò1 Ö±ø´23…‰ ›ÚÙ¸žùÆɨl¹K–Ä*ãúì¯.ê§\*¼4”~¥.ìtáUXffJÈš bæÊ/(­MóQùU˜£)€H½§ƒ!ÊÕ
+N°éütžg¼T”“ˆW‚Zvëu÷Ê
+)ZEÛµ#zHƧ9ÞÁûq¼ÓÊ·OS¨wï˜6‰°ã²,Kçy] è輸¨O·hª©c‰Ä„ë¨?
+Ráa¨7[ìn¤:¸(Hr[žv)¥Jli5K©·6趞k`Ù
+6ß±ùO]¡"LHK1Oâ—mÝÂûì%?ï~ÄO7¿<þ0YIÞ:vn' ÄI[šÞ5‰.½5Q¿]¹÷¡„z®ÛŒÝÓ‚3Ÿ*[©ˆ½kGøصJ €nä–R°3§/4ýÅ
+`œXc²~¨
+-$ŸÞxXèòЙË)Ÿ%M±Ñ§¥ º©d9Iã ÷þ+<€,7â'xáØ,†”;;VÝ|’lž[‰2 9ó¤:‰Ÿ8Þ\7½-'…—Xp !üúÁ5ú8ÿýņù.|€”0—fX‹Å6IË“êêĘS“$N‘Ê`k¢„‘Î8¢8©2ÒöÃ^ï¸_aø_‡Å„ÎBTåv5ô<r¡¯Ø¾É§‹ÃÉ8£¤O ‡ç ,‹¿¯¥¤ ™²f—ÏAó1­°¤Ð{¿Ù’7{ëö ¼:þ(ÃþQK·ŒU,Oç‰9ù:ºò…(ùŸ¹6eˆÙ‡ÊËw”+H‘ŸzÊ@þT¯ÜKãC ŸZÎÏXèwOn=e p&“*Ô?J(%Tø”‰M^š“ÄÓ}é·´+LJˆÙ—1çaG1Šìú#N:"OEQi½©‰øñdqb _Ja¶ Ý»)MzÚüm•å†¹­ÄJ—3±þË­•Þ=A¡‘‰N½÷HYáyÜ^K¾‚Räëóhv“Q>«cžx"N’¥ï~ŽôÿrËsœG|cn‚¿5jBR&RS¿HÿÂäoþýËáÇA&Ó¢Ð!:~y›IÉ)ÿJ}öëœDÅP–hO5:úÿ
endobj
-1454 0 obj <<
+1863 0 obj <<
/Type /Page
-/Contents 1455 0 R
-/Resources 1453 0 R
+/Contents 1864 0 R
+/Resources 1862 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
+/Parent 1853 0 R
>> endobj
-1456 0 obj <<
-/D [1454 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-1457 0 obj <<
-/D [1454 0 R /XYZ 85.0394 769.5949 null]
+1865 0 obj <<
+/D [1863 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1453 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R >>
+1862 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1460 0 obj <<
-/Length 3003
+1868 0 obj <<
+/Length 3218
/Filter /FlateDecode
>>
stream
-xÚµZ[wÛ6~÷¯Ð[és"WxtS'uOcw÷ì¥í-Q6»©Š”Sï¯ß H‘"E¥›îÉq8ƒ¹| Š‡bfb;éf‰ÓÌpaf‹ÍŸ=Aßû xæ Ó¼ËõÍÃÅ×ïT2sÌÅ2ž=¬:²,ãÖŠÙÃòç(f’]‚½½»}wóþ§û«ËDG7w·—sixôîæ‡k¢Þß_}øpu9ÖˆèíwW?>\ßSWd|ssû-µ8zœzýîúþúöíõå¯ß_\?´¶tí\¡!¿_üü+Ÿ-Áìï/8SΚÙ'øÁ™pNÎ6Ú(f´RMËúâãÅßZ^?tÌZZfbxF*‘œž–¦à0m Á%Ž&[Áâ8"vààØÙ6"Zt""$gÄÌãX¬¤ò!y΋ýòõ;);̱e‰–892=<gàJ!¢¼Èë<]Ó*«‰(Wø”ÑîRب,Ck‘n²†q÷’íª "<«m¶Èá\fKjØWyñD‚RjùEJíõó¿þS¶0T› Áœ1Òkø÷ç¬@6Õ¤« ³ºNwuEô~ûi¢¼ UVíZ⼎’ž¨x±$:ã­Q´Õ*Ž£ÔK
-r‚Xk½Eí²*Œ½vDÖÏiAÔÍm•¾dÔ‚ÞÁçã>_ר܈>AÕŠ²K˜ñ(µh«™U<ë®É/Zåš+èŽ ä Ãb-ÔŸØŒ8™88g±´f<qXÈàZIÈ s\¨à„uö”ÖyYÌËbý:’Bñº6‡x<5O
-*ì„vŠÉ^t›ÒÙ@5«c§Úò^°¦9$@¿ÿŽ¬!ŽÓ0c…=—ÂÑ*ýª"šª¤6é+å“®×á÷c`X•ëuù‰r´†Þ”¾Bñ™…û
-踋ȼ™•²ï–<>õËÀ=Ì
-vk'E2T#;¡bV'&°ànƒë{(Kàþ*“FTQg»"«Îu¬äÉA xC™BÃæ¤4ýT‡Åì7Ù BÁÛ ™·ý‹rSH¯TèaJ}Éä%­Bß&ý-l,ø«\5ɦÊ:ùÈA%ÃEæ“ä¦ñÞsVåårÄ`åwʶ9%µWŸˆ—%‘^i$üFŠ<XUlš]°ḇÄðì‡Ä ¿>Ü<|DþH¿Q&‡†+ðB‘â˧’ÑMÝW€Š¤pûQðzQ=§êcn,sÎé£ÈtUCŒ¦Xøð%Ýå¥/o¯Um*êY¦uúˆŽl‚{£j¿xÃh³£^=‘ûmþÝå­ ™^B`LUÒ³,ÀD­Dx냖g¯ŸhCZžßC¿û8¶4ÓÚ4ñkñHêµ(‹×Íä ¥y3> Šfº*BQÙ‡„† ñ%[—Û ½0AŸ žoŸÓ²‚õ„ ª”Z¸º¥q[rS].Ê5u-ºõ—T+­hØäKÐ(á˜a´ÐÑ¿èÝ z0DÄLÙðº‰bÓb¬ÚjJ™þÛ4`©xX…CÿCu`xãÚ·ß]Ý
-‚wÆä Ø:\`k¸qú}ŸíF°&WÚMOÞrÌÞÇàCĪ?ý_ ¶Öˆc¬AA¡ÚÊc kŠñX$=;'±øÏX<”ûùXÓ°h!§]ßrQd(mkª>ÃâœÄZ—ë4ÖZ®£0Á»Ñ
-j û´Å©Ÿ4xõÖJ«I¿·Lg´8–52ÕŽKÎì¡]® œ5\‡í·PgÃMÂÉc=={Ë52}hÕ,ôöæÿ2¤¹ÒVãL2˵8½‹B©Î¹î»yjmøϘ<”û'*6ÈBtžô}ËuF‘¡´I´‰$fFÈ3I­Ëum-ÎHšoËu¾©Ù`«OŒ›ž¾å™¿7 «<Q}>¶/qýW]¼¿üˆGø„£æŠÂÿþÉ+Ž\ô;X „ˆÂ© ù8†°Ãv¯{M密ÿŒiC¹£°’c°rx,˜œñqËuN‘´iXiͬ<“Ã:L 
-LÇk/õŸÒÝ/¬Ñ»¹å\MjÑ2 Õèa ÌMlÇ¢ÿO&;²fä¥Ä8{:«i.Aš®ÅèkÙ§mHý씦cï¯ÂMF e:£Å±¬iàù3 ¦‘× ^ÃEѪÊS§Ü@= ™vrò–kdö~°9Ì~G®ÒE›,-
+xÚµZYsã6~÷¯Ð[䪃“$‰gâTÆžxœÚ#É-Q‰THÊŽ÷×o7 x‰šìdËå"4ÐׇFãà3|ë€I£f‘Qf\Ï–» 6{‚¶÷ÜÑ,<Ñ¢MõÍÃÅ×ïd43 E8{X·ÆŠÇ|ö°úyþö»«×÷— ¡Ù< .:dóonn¿¥CŸ·w·ïnÞÿtu©ùÃÍÝ-Uß_¿»¾¿¾}{}¹à±æÐ_¸NtxwóÃ5•Þß_}øpuùëÃ÷×.m}9“¨È?ÿÊf+Pûû HëÙ ü`7FÌvJË@+)}ÍöâÓÅÍ€­VÛuÌ~JÄ ”À2Bòè4[bÁ€­+F<ˆ$ï1]pÎÆe8[„Œš¸q‰â-—pe 5}µ B)¤õÉ&Ëk4Ì×ï„h‡q)Ü‘èa“‚%9ŸgyVgÉ–~TiM…b_1//y</
+W›'»Ô–ÏiY¹!Ü·Ú§ËìÆDº¢ŠC•åO4PB5¿¡¬|ö׊<Åš
+ ôpFئOIù¢È·¯#!„3„Ü4!ÄÂI‹¹ÿ&VT²“
+¾iŽÈß.BÚc ZúÜl%Lêúà³sÏ×eRÕåe<?,ëMž1'"̱/ƒ0Ã4K/ù<xà£`Aùð†šn¯pQ±¿Øüîþ=Ðò€Ú®òWªNòêÅYlÕT›¹ÑýüÍž…Õ*_²zSFÑn±©¢yúç~›-1FIh/©6Ûµkfq­îkí†Éø”YýJõUºôÄ1È°ÝRõc:j’<©Qhn`êVø•óÛ~{÷áêæ6 jò,–VEêHrœœ¶Ï~îÂ"zÛ¬pXA‘†¨Ò?­í96À^ÛM9;:Sú"—,u­„&6ߦɚJÖ×A´íÁÄ>‡i³PK¿,nÐ"Ò
+Dßt&[ƒ•ñ7œê !Žø”kÖÐvÔÉÍ…µÂÂsì¸æ%±$+ÝGŒõ)u†YB`K|¤¢hÖŽR"æ¥X< ™‚Œ€˧î[ÉKC¿hw°!C´í:¥*!d/FlÜ–HF
+Zmƒ$ª¡‘£í®áh(ÇÉ`Ý
+ƒ_ZÑú˜ žM-¡6º›YþO¼ Aóý¦A¿H´m9´)ja¢ÙBGsûÖgÍZ‰@† š“qHlLg±Ï®¼#Ó`
+ù›Q\ÓJnh‚~UQ™ò,í’W*{ÄK²ÝºßŽ`]l·Å …'¨u­ }lnbƒ
+³¹O¿‰Š™çJ‹µ“õ…£ +µ<tÁ
+I€wóˆÊPdÚ›f“VY±QXš€é³ç9)”¿ˆ—­ÐX°k(Ò`B±ó $T`®˜avaÉa~}¸yøÊ ù‘~£8W`…<Áí¦ó›º+
+›Ù _«:ÝUÔ²Jêä Ø”GT‡åÆuw MI­lþDzöž|_f-72m? OUзÈAE%¹ÛïAÍïéë -G«óËçwŸÆf€
+”Ò±ó_ƒGúT¯y‘¿îz#,”¾QW¹Kç!Z£ã° `9|N·Å~G[%h±Üàûv“Ì'œÐ€$TûÃÕ-õÛ“™êbYl©iÙN}ìH9‘Òl€Š]¶‚p1Œ0Îæÿ¦]´ ‹ˆ˜ŠÝF‡Mò±DËg1Ý}T`–xœ…CûCn ™7íÛï®îÆ !LGqØž@.ê„õ‡E"ŽCØ@P)ÙìÒv§&Htgcr58S=xK†°Þ‚&ãGHD³h^g*›cÀ_€÷³õ uà
+"`ñiæ Õû.nÃ@…q“X5aq•VË2Û»yLñph]L(ÅúZôXc¼ÀÙM™AÖ&aUUØQt"kkèϨ<—T^•C8ÀvP DŸ
+cÎؾ¡:'È`´Ñ´pTR’‹)°!ËÕÚ<ÕÑOÒrlŽÅ\M3o¨F¸wÁ¦!—‚õ¿Ãþï[£DkOÈ&ñÃLÖ3ò$Öý‡ã~>Ö"<RŽÂiÓ7TçŒ65ØH(¡ä¬µ¨&°æ©zn‚Ñ
+ËÁ´íªs‚ F›Fìï¢ȧÑÖ¢š@›§BŽä¡Å¾ØfË‘ì-`©WÓìªþ]¸I¼?Žº|jvsÝ=/^a~Âc|B𑿦°¿²‚#ývpÎçîøÜ÷!¬è\BÎ×–t
+VžþŒjÃqGa;Äá¢)ðôV·I7TgŽ6 +« ŽÄXµ©Nê¡êOÿlð_’r…×Öýƒuvƒíã´ Õˆ$måÓ
endobj
-1459 0 obj <<
+1867 0 obj <<
/Type /Page
-/Contents 1460 0 R
-/Resources 1458 0 R
+/Contents 1868 0 R
+/Resources 1866 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1437 0 R
-/Annots [ 1462 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R ]
+/Parent 1853 0 R
+/Annots [ 1870 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R ]
>> endobj
-1462 0 obj <<
+1870 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [251.8681 599.6322 347.399 612.3694]
+/Rect [280.2146 599.6322 375.7455 612.3694]
/Subtype /Link
/A << /S /GoTo /D (root_delegation_only) >>
>> endobj
-1465 0 obj <<
+1873 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [284.2769 331.1334 352.9489 343.193]
+/Rect [312.6233 360.3945 381.2953 372.4541]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1466 0 obj <<
+1874 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [282.0654 299.4481 350.7374 311.5077]
+/Rect [310.4119 330.5066 379.0839 342.5662]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1467 0 obj <<
+1875 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [311.9531 267.7627 380.6251 279.8223]
+/Rect [340.2996 300.6187 408.9716 312.6783]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1468 0 obj <<
+1876 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [299.7586 236.0774 368.4306 248.137]
+/Rect [328.1051 270.7307 396.7771 282.7904]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1469 0 obj <<
+1877 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [292.0084 204.392 360.6804 216.4516]
+/Rect [320.3548 240.8428 389.0268 252.9024]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1470 0 obj <<
+1878 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [330.7921 172.7067 399.4641 184.7663]
+/Rect [359.1386 210.9549 427.8106 223.0145]
/Subtype /Link
/A << /S /GoTo /D (dynamic_update_policies) >>
>> endobj
-1471 0 obj <<
+1879 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [401.5962 141.0213 470.2682 153.0809]
+/Rect [429.9426 181.067 498.6146 193.1266]
/Subtype /Link
/A << /S /GoTo /D (access_control) >>
>> endobj
-1461 0 obj <<
-/D [1459 0 R /XYZ 56.6929 794.5015 null]
+1869 0 obj <<
+/D [1867 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-470 0 obj <<
-/D [1459 0 R /XYZ 56.6929 548.1995 null]
+598 0 obj <<
+/D [1867 0 R /XYZ 85.0394 560.3013 null]
>> endobj
-1463 0 obj <<
-/D [1459 0 R /XYZ 56.6929 520.4385 null]
+1871 0 obj <<
+/D [1867 0 R /XYZ 85.0394 535.1807 null]
>> endobj
-474 0 obj <<
-/D [1459 0 R /XYZ 56.6929 391.3968 null]
+602 0 obj <<
+/D [1867 0 R /XYZ 85.0394 416.2201 null]
>> endobj
-1464 0 obj <<
-/D [1459 0 R /XYZ 56.6929 364.0541 null]
+1872 0 obj <<
+/D [1867 0 R /XYZ 85.0394 391.5178 null]
>> endobj
-1458 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R >>
+1866 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1475 0 obj <<
-/Length 3204
+1883 0 obj <<
+/Length 3164
/Filter /FlateDecode
>>
stream
-xÚ­[msÛ6þî_¡é—Ê3J¼>¦­ÓKçšÜ9îÜÍ´ý@K”Íš"U’Šëûõ·ÀßD&SOÆ#xˆÝ, „®"øGW*&×b•hAâˆÆ«íá*Z=@ÛWÔa6´é¢¾»»úö-OVšhÉäênßéK‘H)ººÛýºþþoþuws{½aq´–äzËhýÝ»÷?`ÆŸï?¼ûîÇ_nß\'b}÷îÃ{¬¾½y{s{óþû›ë U1…÷™ëá oßýóK?Þ¾ùùç7·×¿ßýtusléÚK#n ùóê×ߣÕÌþé*"\«xõ ¡Z³ÕáJĜĂs_S\}¼úwè°Ój_?+3!W
-l·•íi——®¯ÊZyp®ý¯*3dûrÌ NaJÀ»€°HJQš@ÛÖýÜœÍ$s0Óã<:IAk†_|,J%DpJ]û4/&јô™UNŠKmŠôS6Ñ!‹IÂÍ´|5ÍŸÓºœÄ ì¬ùÐá¸Y-¡3šH:?õ»¨ËS? ÎSÿð×hÞ3þ*aó’jBtïûpð\‰’}Ù³l4¨Í¶Î`8?Ç«1¡Ü˜u-ˆ1‘¼*qþvd  ‰ê‰õÃ
- ·s~ÁÜq¿hîöl˜Y‹¨$t¨ŸPÍçÇ= ÷6ϲX„˜.j†euþFÏy±Û¦õnĵXD$ñ¼ü€šP ï 4øg¥ú¼&׺v „'ðUµRÇ„"b=Sgð FûýlƉH“x~ôjA‘qoóŒc‚xɯuP3Œó¨ó—ÊË6{¨óöeL9XbEg¨ ú”ƒ°†3ÕWá5)×3dÈ9
-±(›áOˆŠ÷lãœÇ/X=î÷ 8'ˆdI2?üµ È¸·YÎÅZÁ–Âè.ê2çêü©šü¾0‘Ö(¤€%pV|@MÈï3ŽB«Ö}þãtq3²%'Jk}™oÌìiXßÒ9¾yü‚Íã~?UÕaÐÙìØ{Ð’þæÉ¡2…ÝÎÙ:¨²y”I³ºÚ”Õ¦©ÒMÛcÁW¢j^€šÐ O·˜¨„Ó¾
-¯C· C†„S„ >ãß|¥{¦Îú7‡_0zÜïðMƒOVb~ôjI‘Qoó”ã1¬¼|É¿uP3”ó(#ñtÜ¥m¶AÿðÔ<8'%T.hP*ô8—D$ÑÉ@‡×YT§,ˆW°1“ ý"ë$#°æˆž±s¬óø³Çý~þª
-»1K=?þµ È¸·yÖE°ÙJøéΠÎ9×Ö/›v{ÜÔپΚÇ)/ÛôdVz
-Ó æ£C}cúãþØzÖ__Óuƒå2móON|^nÙ¡ª_ðGa·¹/RZ|ôš:ËL®9JÜëMR «2/§j‘FÚ¦ˆdØÛôÉ RïƒNŽÖ^;ÁÅúSZœ0ÏÏÏT1 Ǫ1¸ ›ò=Ö¦»]n¼{Z`}סˆõ®†¨]o&/n«ï³¬Ä:Ø>áá„0<©°Ö9,±n²Þ7'jöl‚®?V‡IŽ5éáXx†x¡gÛ3OºmqÚy
->çíã\¹ñU÷§óze,”á(£×¥7 Ëéû—^>ÿâÊÃ…"*ŠVž.êòÊPÖSæð£u‡
-𪠛—P‚{ëøheÎ{’_'º9ë?>ýár.û.#" Âï™8—}÷øcÇý~~`ÃBc½0굠ȸ·Ù؆Ã$ vÍðËìçÉŠì!5¦oª²˜H„J¢a;'ÜcÆÂ{“0ÅÍÙnW:zvmÏDyú`ÊñÚêakÓã±Èqù”na’ëÇÃØ/—‚’Ó=–ìQø!’õ»½kÍÏ5+ã°{ÔŸø½dÍÔ"¡<äP¿A§Ó¢tªy3Ü)Èz΋ÂQ4Ns·¤š¥žDæ ïãÑ¥aYMÛ3îÙþžO±;>/¼ÃoVU,å&WŒ0Ñ·àÕÓ¶ pH†B“ÑeJ‰¥ð›î c^Žû5ZÕUÕnèɤ$Rɤ§Ñˆ 5¡Gß3 {›,VPó²º<!=ÈaWõóÔ!£$N¨ž•@c±ým†„ÈyOîËÎãõ!KKê÷§Â­å{¬w+yv€«RüAåm„êBaƒp»â ;Ý'ŽÜažDÒmþ;OÂMüq¹lPæ6=¹[â¬bQUO°ê Þ6úË0:šjÎÞ{0ÝÛ+,‰Ì–ÜnkXBÝäN¢‘q¦]4>dm^)+¬LËæCc&Òl?Šé! À<哘~Ë11
-ö"P¸4P
-'?5[1§Ö”U}0‘œ©òÃam«°Î{#–0))ú4²ÝeêG&ÉÏÙ÷;¨ò{T‡ýf|‡€Ã¾Ô¬hšÝ¿o
+xÚ­[[oã6~ϯ0úR¨¸â|œv3ÝÛ™n&Å.ÐöA±åD,¹–Ü4ýõ{x“u35EƒA`‰<:òã¹¼Já^q„&z%5C<Å|µÙ_¥«Gèûö
+{š$%}ª¯ï¯þñžÊ•FZ±ºßõx)”*…W÷ÛŸÖt Òõ7?¼¿ýöÇ»w×’­ïo?~¸NO×ïoÿ}ãž¾½{÷ý÷ï8^ó¯w?Üßܹ.áy|}û៮E»Ÿ LïnÞßÜÝ|øææú—ûï®nî;[úöâ”C~»úé—tµ³¿»JÕŠ¯^à%EXk²Ú_1Ng”†–òêÓÕ:†½^ûéìøá*ÈÌ
+º $Ês7~v’ÍÃ6o6ÇâÐuåêÝÜDK”¦ü°õõ‰e ¦"Šjl"á
+„²®óø¸rw=k;ús§|¹›³aÆ{bðX%J8¢’, {Gµ È”›CýŒ %–Ç1Ö§ºŒ±Žê<G/E¹ÝdÇíX<†ÕÏRˆfÄFaA)ð°ùiz€´¾#áÒx %/â‚‘šª¥¼uô FOù~>Þ¤BLRüŽjI‘ ·8Þ¸uû >­OÁ[ :ÏxÜüñX´¯SÀÁ²Hy\~ š‘?¤
+I¦Ð tT3* @Çb<éð6uÎ’qÉ…¢ô2ê(”†lΓ/=áúÙciŠ†|%:øÕ‚SnqÈQÁ—.¹¹UrÊHÜVM“oøyÎ_ÍLÕU9Mç,TªÔè¨fôàNhdÊöoãë.Z3)—¡¬¦’]¤×) êÀâúý‚íS¾Ÿ?N‘ä1±I訙r‹ã/…J_Òø‰"èóDF\{|MÚÍ!9æ»cÞ<Mc,FP푨ôŽh*~a!{J ä¿ èf¬X‰¤â‘øJ€*œžÑðêÉãO¸þ…„jÆUtÜ;¢-Ƽ¢0c’Cü%<Ž³>Õe uTÖ1dmö5ùdN N)‹ D3‚‡N#Ž™JþtÈ7Åîõ:¡,l¶Rm7¤]
+µ$M[M Ñc ~Ïú C³÷¯Òõ}Û´çOvuYÖ/S¤'ž1'aOFsìW(”XiXà…_@_¬ÖF{"Ý°ù…’ûx°=¹Ýå¥D­3ß™¹Ÿ²hZ÷dÇ^žŠ6oÙ&O¶yYì ÿ©\)±˜o1tüœ¦äøŒtÙæU[$n#:è=؇6›}r¢¥wðpž(Û ùÕµ)ë×YµumYõêšÓC“ÿv1î½ÓÒÓ9ûÝË!kìÛŽÁãÉl…5ê¸:¾ûÁÎ ÌÂp_}<êÆ Þdîç%{u®÷‘õØWž%ópÄ„*¥[ìv*ÃçóÀ‹öü$A§a³å‹ãCûÅÜŽ>Än%C¦ù•áGÃñpÖ_^ãuãž«¬-~÷â‹*Ùçûúøê^Ý(l“‡2ƒµu¯ASo2+Á‚Âò˜lÈê<È çöˆ¢Ì`ØÛìÙÒ`BgGë# ¯]àlý{Vžì) ¥g¨˜ŽCݘ „Üu;ךm·…ñíYéÚû…­·Gˆ£çödΈlóCžW®­,ªg»š pR»Vï°ØºÉð½9*´ç‰xý©ÞÏb¬ÉÌáGHz¶= Û”§m€àKÑ>ÁU_õp:G+xv•uq–Á€>¦^CX·Ð»w(SH¥|!îô©.ÇŽÊzÊ&ñ0«  HÀyTl šÛ_ ‚Ž9þˆ}£lºS~rꨈ$40Àg``l“*Ð/Ø:åûÙ9 Ñð&*>æÕ’"nÑ´†Â
+ç‹è:EÀå‰ìôäeþ˜Ó“Ù¢(ȼH\zG4?܃§H:”ï»&LÒìÑ<óµÕĶf‡CY¸è)|\îÖúh) '9=¸'>›0&×·;ß›{zà0   ‡È×¼™+ö$TüDã…ñé°0*¯Z0Ã¥NFÖKQ–Þˆ²ñšûˆj7ðS­F™‚YU3ïõŒw¶¿ÞyÁ:Æç¸;žÍ.¨º'£ÜlÀè–úœzÖ6Ã1@*V+¢¢)[Z“}Òÿ`ŠÌ)_£Õ±®Ûd „š}Ç” 4š.É@5£ÇÐ7Œ¹E—¤9AN9‹/ÉÑå%ˆìmŽúø2sþª)"æòELh ™
+x{˜ùT¨Ð.”òõ>Ï*Hèw§ÒÇñk÷QœwÕƒ qM™ûqšÛìÔ§ Ì&à6Ú3»Ög®žðÉT„„íÂf ¡à+eØ^¶Y“¹É ¬ñ²:˺~† ãô®]g¸$c4†€ñpõe;s]'!æ:ËñÕ–4Db¿²e:1Ît:ÿyÛvŸTµk̪æÅ¥;&¿””åü`$Tw%(”3£`o9…Qx©O¥—Ÿ™2ÌëäZªú¸7Yœi
+Ãam«][pED”*Á†Å¤Mùö2îSsÀDÉð{TäªôÍøŽ=OjîéøÇdwT3ÂÞleÊ,¾ô]í„}3]Cæy„Ï·>ùWTš'STÂDz~°£ mC  ãùµ EÐYø­ “ôÛ†®R
+:Øô(2÷êK'ÓU3`¢\#I wÃÎÞd²«‚8%¢ i®„%÷°QíQÕÝ ª`™{/m»„Ún. òÆ?ÏÉvµõu#gÒI›ZÎ¥ún˜¸ÛøˆK,Ì:’ 9RŸê2.;*›þ±³Ú$¶(§:.=ÍHoÿ€Ó"Cñÿ½ÖÄ&ò
+·‹ƒ5³1-®l5OÊuøš×&l™;⦷Êö¹k2HêuÁÃ|Væ3aC[Ö®ç甧¿Ö§#T†ðˆCcJJÏÕκiܾ‚€b㕵G8ZpI¹y] (oÿ÷þ¹G_† wËŠÇÊmzØLP§,b\cÇj‚\J­O›vü3Þ4ÙetîÂkož£ ¦™[
+±KKÎYryͤöÔxáP¨OY3j°fÚý!ñÃ9¹q‘b|A‰ŽjF‹¡SH1R£[;Îýx/RmëÍ©9´îUµ¡ð?ßvVf§ëÛˆÛK¤úòÝP‰Èâµ½Qäf¨'²ò¨ïhˆk)Ä„š©ÐA¶©¹Ôl ôO7TX>ŠôvæT·–¾lÜ«›~W µHV6 ±¿>ÎnóÊTn)÷e¡ÂC®6Ö˜ÏC¯Aù%v?È9ÈŠ¥Öà çÒêE0"áHͯOÈEµ¹¼>^ŸÎ?˜ødÁâwüúõš©f7ÙCØÚ
+å訒H¶|œ }óÆùÍðÒuºãñ‹×º98fÊâœÃÞGæ¶ý œàÏ{¶¿}©ÿü?`,¨R²8bî1*³“ã”2Úk6]~þöÿTõÿaØ—Úendstream
endobj
-1474 0 obj <<
+1882 0 obj <<
/Type /Page
-/Contents 1475 0 R
-/Resources 1473 0 R
+/Contents 1883 0 R
+/Resources 1881 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R ]
+/Parent 1853 0 R
+/Annots [ 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R ]
>> endobj
-1477 0 obj <<
+1885 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [286.0435 683.3704 354.7155 695.4301]
+/Rect [257.6971 713.6209 326.3691 725.6806]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1478 0 obj <<
+1886 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [339.144 653.1199 407.816 665.1795]
+/Rect [310.7975 683.3704 379.4695 695.4301]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1479 0 obj <<
+1887 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [336.952 622.8694 405.624 634.929]
+/Rect [308.6055 653.1199 377.2775 665.1795]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1480 0 obj <<
+1888 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [322.5463 592.6189 391.2183 604.6785]
+/Rect [294.1999 622.8694 362.8719 634.929]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1481 0 obj <<
+1889 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [331.4327 562.3684 400.1047 574.428]
+/Rect [303.0862 592.6189 371.7582 604.6785]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1482 0 obj <<
+1890 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [361.2812 532.1179 429.9532 544.1775]
+/Rect [332.9347 562.3684 401.6067 574.428]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1483 0 obj <<
+1891 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [330.3165 501.8674 398.9885 513.927]
+/Rect [386.0748 532.1179 454.7468 544.1775]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1484 0 obj <<
+1892 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [259.4835 344.9998 328.1555 357.0595]
+/Rect [301.97 501.8674 370.642 513.927]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1485 0 obj <<
+1893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [231.137 344.9998 299.809 357.0595]
+/Subtype /Link
+/A << /S /GoTo /D (boolean_options) >>
+>> endobj
+1894 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [172.152 284.6583 267.6829 296.4589]
+/Rect [143.8055 284.6583 239.3365 296.4589]
/Subtype /Link
/A << /S /GoTo /D (root_delegation_only) >>
>> endobj
-1476 0 obj <<
-/D [1474 0 R /XYZ 85.0394 794.5015 null]
+1884 0 obj <<
+/D [1882 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1473 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F41 939 0 R >>
+1881 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1489 0 obj <<
-/Length 2563
+1897 0 obj <<
+/Length 2840
/Filter /FlateDecode
>>
stream
-xÚµ[]sÛ6}÷¯Ð£=añýñ˜¦NÖmºëxŸº}P-:áÆ–¼’œÔýõ{!@òTžLFuxqîá%
-/äg¿þFgKýÓ%ÂY5û_(aÎñÙÙT‚()D8söéì_1`òëþÒ±þ“ÊÅ¥†žDXíÆ{™Ã€Œd„1€‡^æl¬—Ê÷òÃâù×O›Õâ~¾mÿl†²™„*=KCh„
-ïÿˆª1)¢y&¤°zï'Ã(Ñ’ÕL— ÓTHÖn³XmïšÍ³çó]ûÐÌËŒ0E‰²83B#³žRDi&r§³Þ”š èa bA ¥B±\2fÁ€¯È/ãNYÐ )I®‰ŒãYˆ¨
-‘2ê@m·v w`Ššv`Dæ¬]Þ:PbU8“ˆ¡’»ã —Wra¢hèBA4µ|Ú…J͸ÉDc. øŠü2î \Èw ÍCDUˆ”ÑpJÒ²âÂ…¸0 ¦+ÇúiWBx80à‰R‰¨.™ 5TêM’yÍbØKò Œ8èþi#È“ ¹l̈_é€2îñF†8ê*¦ˆ¨
-‘2nDæçBWŒ˜ #Ôtñ5"ŒC¥«P‰¨.y=´D: ó׌èÐz8nDç”p<–ñU"Uƒ>•;xE}õ&ä0Žð70–…ˆªð(£¡&TÖ£¨ÅM˜¢¦MQ¾ÅÕz×Þ=›µ’m-Þl
-À0ëöÂi±p‹Á­a©%(Äd•¤h·žo׋ÒfRàÍGÔHû¹Ñ1V™œÀIv1h&“šr†XÍ
-"úІ¹0¡ÒÜ|)jÚ|Òåë8<ðæ«õ²)Ë^÷‚Œã"j„Cf<)eVå$N3D•2œmCò…DV÷„"Tk–©Å\ðÝeܸŽj˜5k‡g ¢*LÊh¸ñ„ƒÉ£ª¼oKQˆñj˜­0qŸ‚G›(ˆ!’/2ÃÃV39½ûr=Å
-³ F!ëË0ÙrZdŠÑõå_Ñ^Æ}% ½•ax"ªÂ¤Œ†;:ÿªºò¾-E! ¨aÆvÏ#Û `(ã3œADPÈ7À€+•s8½÷‚’áFݽڜÞh
-xeOAÂó˜=ÔVÔQ_º§@ 9ˆ œE w˜ÇWy—¢ÿ”oñiÛÌ­‚Þ5Ü÷F&¢FØäs_°*…SÓ<ˆ+¢Š °$ŒYLÁ0ðìÌ„£Sà_é‚2îñN”à&ðTP…F w"N~³îÄ…81 ’7ªÞƒMk­ÐHëùüƒçŒÈ›?å—i¯iN,Cö×s' œ°™PìµpÀW4—qŸz(G N ¼ï#ªB¤Œ†ºÍ)bœ¨,3' i¯P‘¥Ñ%&ˆXëS¶^¬²%²æ_ÁjãÏW¿È¢˜ÁYœ³©ÐÚ‹‡ãš‹¨Ç[ ….A;>‚*,†±ð]£0æµ-ôƒìí0ûÍ•íj¾iî6ÍöË~ƒï›N»ßs9vzÞmžKl8YŽŽÑTKŒ|Äìó‘&Ê“Òß›”¹Þ¤þ 3©?QJú]ÓÚoÞ­!~Šh”Ü0fæ&Ocr½NÁ‹ûQ–Ý€A9 #{),ê*âÿdm¤5øß¿jþËwø³A >·vb”éx¤… =)OÜÈò. „ ÍG¨ÿ(¾endstream
+xÚÅZKsã6¾ûWè(W
+œ–êŽÕ³$ ø3ö×ý $ä,éü>DÐ5kÍ’Pƒ wól¦)A(®¬ÅÃë€nB‚f:™Ú€†R;d)’ÒtÄ~®”ïo0\÷ ˆœ"„>㩶mûfxÕÀç-¬:yÕ]‚+õ7 y-kͳJ+f„<sÙh£fxQ§½Ymòm6¤\ƒ\â’yé jD|‡`JÃE„›®ü/É°“=ÑÚ²Äq=À D´„ wÛ‚¹ñgL®;I5=,1ƒrÅÌ;¿AÓd°Ú<Ý$ÀÂœ¹U´Q3t‹¨ÖFªU]eC¾%ànçÅ7¨ù]¾Y¸JHÑUàËÔp3z²áÄ0\ŠÂæ°¾l›0K¸€?cópÝÏÏmpÿ7ø`Öù êœ"ƒÕfù¦œ”;sh£¦ùÖ Pâóñþc>rnÂ4nõ¼Ü5"¸C4©˜µ0Ú‘|ƒþNUü -ûžV
+f9=ºW§ž2eÊšXLœvf…áµû¢®Sº™±ÉHÁ‚t+{,k\Ó0®ž¤ÞR#ÎÜxÛ¨iÒ5(o)Ãl³Ùçu©§Üä¼ jDî þºÓÑãÇr‹1mõr—g%$¿‡#ÂÆý‡¿k‘ã=øô™C ³¼#r
+ÿ:s<!`(²
+º~?B¾ ¹e…ŸlµÔ‘EôÃAýT·¸É*%êÁ³ÎK”ª m;ô¨õq_ŸòvW]míÐGÖªAŠ¬ôéÑ-¯h¨Œà|÷|x¥f0S™ö
+ÞÐjŽh‡ „ž?øûÐöu,q®«éûxl’x›»ÙsþµÞ?/†Ÿ%_ŠÃSÀÔuµ.²C €Çí1̾
+¤ä¿‚ÿâ"^Ǹ¤Ì;„
+§—ùÙîy‹ÁŒeñ€½jù œa„­«¾€Ïž1êÍÂhFä×¥X6Ã>:i±EvaKÀéϱ¸
+³Ë°œ„üòõæÞ~ýµ‰óiLÙH¶–íbÝ9–ýŸðR¦ ‡¶ùMo«ªí¶z¡r‚\7ÊZ÷yÌP !ü{ßk,mµWêLiUÜ/:KZ›Ô5œh‚ÏÎHÇEbbæ=N^qìÈ,Ï)l ·¥çÄ×îžò’¤IŒYª65u6U ¾´]†ïÇÉ…-L%§5 È?…)e¶ËÃRG(ÿöþä‡Õ€…I¨÷ЮÔQ$d@–k ņˆ_hU%š³ÛÁªòPM==0Õ½RÓ'l`,½¼¼\:¹dƒC
+vNØ´›9O™§›]fëØðüN—ÙñðTí TØG! Åõü‹Ï@Ï´gŒÄäI“ 7ê
+ÍHbë³iÒ>Ý?ù”€ËWôÄÄ«·Y1½[•HCw«á‰a“IóÛ%ê²ûôš0©Tü¦_æù&¬ê#Aš(Ò´¥5Œ>Áx`ï6_È妅€Ûeó8£kÔÇgÈ;¨…|u=½õ» e ² lÇ õq½
+ÊvÉ›²]Æ\ˆ£T¶Kúš²]6ÕšpÝ*Mò‘B@¤¯l
+uèò…º …:¼‡B]ÆX€®îöÊilŒ¡±­Š\ î+ò$MÇ+r„{ÂÃsX‘coF3Z¥ËøÔ†r[¡ìH#ïÅ~¡r3¦=Í‘#j]ÔG«t.™4Zÿ%F›D™ÿg‰Ç;sôñ£ÅÊé½çMöy÷i¶Ìû«ÑD3üSÏ‘Úþ’þö_”žþÜV¥,±“ŽÃ ä—F¥ÐB7ø¥F'–i+ÓÕÿ­™õendstream
endobj
-1488 0 obj <<
+1896 0 obj <<
/Type /Page
-/Contents 1489 0 R
-/Resources 1487 0 R
+/Contents 1897 0 R
+/Resources 1895 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R ]
+/Parent 1853 0 R
+/Annots [ 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R ]
>> endobj
-1491 0 obj <<
+1899 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [324.1075 737.309 397.7608 749.3686]
+/Rect [352.4539 736.7854 426.1073 748.845]
/Subtype /Link
/A << /S /GoTo /D (server_resource_limits) >>
>> endobj
-1492 0 obj <<
+1900 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [359.1555 706.8362 427.8275 718.8959]
+/Rect [387.5019 705.7889 456.1739 717.8486]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1493 0 obj <<
+1901 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.6164 676.3634 422.2884 688.4231]
+/Rect [381.9629 674.7925 450.6349 686.8522]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1494 0 obj <<
+1902 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [370.2338 645.8907 438.9058 657.9503]
+/Rect [398.5803 643.7961 467.2523 655.8558]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1495 0 obj <<
+1903 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [364.6948 615.4179 433.3668 627.4775]
+/Rect [393.0412 612.7997 461.7132 624.8594]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1496 0 obj <<
+1904 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [226.7331 584.9451 295.4051 597.0048]
+/Rect [255.0796 581.8033 323.7516 593.8629]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1497 0 obj <<
+1905 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [283.1811 554.4724 356.8344 566.532]
+/Rect [311.5276 550.8069 385.1809 562.8665]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1498 0 obj <<
+1906 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [287.6042 523.9996 356.2762 536.0592]
+/Rect [315.9507 519.8105 384.6227 531.8701]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1499 0 obj <<
+1898 0 obj <<
+/D [1896 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+1895 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1909 0 obj <<
+/Length 3202
+/Filter /FlateDecode
+>>
+stream
+xÚµ[Ksã6¾ûWè¹j…àIÉi2ñd'•L²ïe“8msW"'"eóë·ñ4AP S™”Ë%üØèFhtSYaø#+Q BQµ*G±Ú.ðêî}wAfãA›1ê››‹/ß°r¥*h±º¹É’KIV7»_Ö¢è$àõëŸÞ½yûÝ¿¯_]–|}óö§w—*ðúÍÛ®lë»ëW?þøêúrC¤ ë×ÿ|õóÍÕµ½U8ß¼}÷­íQöãŒÐë«7W×Wï^_]þvóýÅÕM°el/ÁLòûÅ/¿áÕÌþþ#¦¤X=ÂFD)º:\pÁàŒùžýÅû‹£»æÑÙù#QVЙ ¤t4’ ¡”X•B¡‚Qf&ðæ¾îk°ª$ëã%‘ëzÛ™Ï]o;+Ûk/šv¨mµß?ÙëS_ïlkèÆ2únÿài«CíDÚ]}tð{w»ª¡ÙnúáôÁvüѵ5xƒ•lý¦;úaÖnëèËrÝÜ> ù‡IØ‚”ÔXÔ×Ç3Ž*½Iuó`”Pr]Ù¿Ÿêã“mÞvü+¥üñññRÑ5ª?U‡ûm»ƒî¶Ï>6ý…Zý¡qý­ýüÐ Óµ %Ãê2Ö§i›¡©†Úbv§cúÍ™fó44VpQÄSÌ83z·= :·õ`uÖ7«v÷¥6qê€t¨=¨?ßþìÜíÜH}Ý»¡A˜ß×­mõ5ôEªÛ…©'¸1“ëÅ°>Ń텙vø<tbº÷@Ä=æ¸ ÍH”,;‚JBŠ¬=$eyf•XÌf²k„Ì2„jî6Õ¾Ù5ÃÓÆ,¸šª@x‰8'eV‡
+‘Û!H*D¬Ãççž·d2| 3ÀI&ðQŒ
+‰IdlŽv¿`v*÷å´c°32ŽUÞµ¤I"-K;Q(Ä
+¨þ²´£ÎÓ. ôˆÃ±jûÛÚd™›¾;·)ó(”We¹ D@Íh1*Xo->ñÎØ2åÔ”¥È$yX"ÈXIdnŽ{¿`x*÷÷ÊÙ(L ‘÷@@-)’HËS’).%_ Þ•¡žGq×桘Ëø8 zÔŒ"ÓŒ©2VäocŸ3gšõqD ãÙ¬ORF"‹²>ƒ_°=•ûbrL‘ÀTäP Š¤ÒòÄ%*ðR};FeèQzÄj?l^ÿD,BD^‘€šÑ$f G\Q«òyêÜŒAS
+Ä°¢BE¸ŒlÎrÐá¬Oåþ rð!gy7Ô‚"©´,y©ë”…¬o:Ï@Êøk.
+
+ˆ[\‰¬"”j¿g‘ˆÁn©ò·p>*¥÷à  S6Òs‚ž·>‘úr2HÙJ̲> ¼‰¬<û8Dn ô¡2üó(=⩯7/‚š5TÏ[N™€šÑ&®}ªº"u>ÏF¼`TR
+‘xþ&vɬ´²€"“e* À*N"˳¥…Ã/ÌA*7"¤¶Ö2-.JÈ „Ì;# I¥Y>n
+ÁÍq„wÝS Ö3î`ÉÄÀ|Йè¯tÆg4^àXѾ%C­w¨úòòÔq ªQxXeÏXL$˜Ò;·ßWs©–©¯BV¿½ïš­?–Q^Àêzªf_}Øû“Ãd{þ#œàØ×õ™ógÖ7-‚:|á•éu~}”¶ãõÌõÕŸæ²dQòüè43zœ%S$$-ÑðŸ§>KŒ˜fÉP–Df²d¨Øìãc²Y²Ã/ØœÊ=“±Ì a¼dù™¨5RiÙ½æ|¸6Be¸æQfõ†n³kû¾Þ¦LÃò–< fF¸FL‹xøÿÀzƒË `m»öWŒéÝÉ.Üí5Øtc÷ÔV‡fk/¾}÷^7Ę'ÛSíûζNúX•n ÷ÝùH÷vþ}÷h›Õñ©iï¬Äý%Yë¥ßÛKËtýêÁöHâð¨'ï ÏøYÞ€Vï¯^Û6ÐßgsmuWêvÐ'ÿևǡ)ŠS·âÛÖǮúz@Ãþ«™e§Ï¦I¤(‰CAkf ýzîí0øAgv~¬‡fèí3 ½i¹é‚žµý<}ÜUƒqcîÈãn߇?uëödNRê»ÖBóm±òñ¾nksrP_…ÇÁwG;ß^¹x;êûS8vçƒÓ¶;Â$x´ ±Ý9?iE,\ˆè ’”øùЖèó3Ça—£Ø[hn;%P…@þ-¼oŠÔ7” GÓðÿõì++“çüf»?íŒõÔŸ1¥@Ÿ݃)h¹þpì]»LË3ÔkÕOìþ{ê‡XŽ=šú…ë <¦Ø2Áx$è…41“Òu¿½¯w§½W¥Úú£¶faiÄÐECR#ú ××îPp¬²W:éë´
+‚ªœêº“”)L¿¾õøÍø¹o.¦rµ‘ÖePø®nµFr./°§œ(t:sf
+P šp ÄaÀ²HGôøt DCJþ©ø%¹£©0éPŸ 9$?µ J*M«¢ÇE–›Iå$\Ü؃Ø4" üåD–qˆ€'Î…¨t9DŒU^ÀÖÏ Ïì‰Ä@ZÖn.Ë…½SŸåÚÓèt½ïªmÙh­[6[ïöjðöÛÍ(œ`‡½¥1Y™¹i‚øØæ•^Á`'p/šN'®ðI2´Ü¡qhA|±ؽ2…«9ÌÍçsöp™ÖC=5I!(Â'Þ(Œ©>M<TŒ/óH#e="™xGxx?g=R£I±Yh¡0ŸÄP™óå©Ÿ¨ÛlõMj'Ϙ½¬‡ÒÌÞýµµqž»àËÖÝvk2 èjZÛåF‡Të4¸ÜËqå÷¶6çÿ±ëìþÃ\A¥•ñ¤ÁsdÑ)ÍÉ0#ª­šL«þ©
+±*&kÔóEJ“bé–‚qê]½ƒô“Saß ütsõ•Eݘ$Y£|’¬{mŸtn†›OõàîèWèl¶Þ}­ "ªp«‚\æÓX
+endobj
+1908 0 obj <<
+/Type /Page
+/Contents 1909 0 R
+/Resources 1907 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1927 0 R
+/Annots [ 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R ]
+>> endobj
+1911 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [352.879 396.7158 426.5323 408.7754]
+/Rect [352.879 689.0814 426.5323 701.141]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1500 0 obj <<
+1912 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [334.0699 366.243 407.7232 378.3026]
+/Rect [334.0699 658.2017 407.7232 670.2613]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1501 0 obj <<
+1913 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [373.9 335.7702 447.5533 347.8299]
+/Rect [373.9 627.3219 447.5533 639.3816]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1502 0 obj <<
+1914 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [319.6839 305.2975 393.3372 317.3571]
+/Rect [319.6839 596.4422 393.3372 608.5018]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1503 0 obj <<
+1915 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [307.1508 274.8247 375.8228 286.8843]
+/Rect [307.1508 565.5625 375.8228 577.6221]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1504 0 obj <<
+1916 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [334.8268 244.3519 403.4988 256.4115]
+/Rect [334.8268 534.6827 403.4988 546.7424]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1505 0 obj <<
+1917 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [337.0185 213.8792 405.6905 225.9388]
+/Rect [337.0185 503.803 405.6905 515.8626]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1506 0 obj <<
+1918 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [364.6945 183.4064 433.3665 195.466]
+/Rect [364.6945 472.9233 433.3665 484.9829]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1507 0 obj <<
+1919 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [374.6372 152.9336 443.3092 164.9932]
+/Rect [374.6372 442.0436 443.3092 454.1032]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1508 0 obj <<
+1920 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [292.0276 122.4608 360.6996 134.5205]
+/Rect [292.0276 411.1638 360.6996 423.2235]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1509 0 obj <<
+1921 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [319.7036 91.9881 388.3756 104.0477]
+/Rect [319.7036 380.2841 388.3756 392.3437]
/Subtype /Link
/A << /S /GoTo /D (zone_transfers) >>
>> endobj
-1510 0 obj <<
+1922 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [460.1655 61.5153 533.2211 73.5749]
+/Rect [460.1655 349.4044 533.2211 361.464]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1490 0 obj <<
-/D [1488 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-1487 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-1513 0 obj <<
-/Length 3476
-/Filter /FlateDecode
->>
-stream
-xÚµZ_sã¶÷§ÐäIž±
-åÚSNpÁtªPˆW©µ'Kš2.Täg×ûšÃ±Hq=Òœ·3jÜö ПكC¾´ y¯."WÄL실bèŒetú0ÕA¹¡ `2±Vó_¸æ7MN&ëèhðŒbiYÄ°¦,ÕZ¾öH”IÂL"݉¬³¶+¶ÁþéØ“eõr‚“H&ñ‡ÛVÙS1ÅI²(1±£Ê›å²!³‚ôR7ë}ÊÊ*»¯\æº-p±ñï¦v­ªx**»xpˆÞtaǙѱ:mßCªãö¨PÅ ìõ
-p=´Ã@Å.õéTçä8àvj
-†Çg 6 :5OÕG„_8—U±X5Û5øß}ÄW€fN ¨&¤!.Äqf#1þ÷vD™= ÀÈy¢O
-JÎùü›—:[—9éðÓf™uîlª2/'óD>[HÅ Ï$ëªÛjín³i¶æ
-2¥ç†º³
-Ž·Îºò© ŽuÑ=6Ë–^
-Ú„Äçœy•íZLŸy2n¶[jR6[ûÑì…™£)± àñ|CZ<•ÍÎ<Û”to"|"$5ßwô´¸rd°55=ºì>°¾Ÿ²ŸøZ—m,Þ ž»ÕdõËp»óÆ>—ÁŽ‰j«1¶Êz"of¡çOÅ°4 …Â+`5gºw.2ŠæeKϺxv(X$½‘COJ„+5nÚº E¼¡ùÔÅv¾¬ G VÕYš¦"Æ œ =Û’
-[½½"Ç’NHä\ŒOÈJP,ñÀe4ƒ¨çmaKåv]Á‰˜ù®¢jF“¢Ð‹Q¢ ÅÒJ b€ó)úbGÏ‹,ñpÝ%œÖ–<ºì‚[_uY¸¾;®cå©\}ÔO {8áž0ÈÀhBŸQóû‚ÞiÏ–®ó…:‰96¶408 è-AÄ®ì@JØ;pçó÷+"#EïFÃDAl~ÛmGƒ X›=¸ÑÒ Ù–tòÐÆúÙVÍ#½((•­óReçí!¯vK_zö; ÆC»ïß9«rÐKp[aNØ ö_íY™Û€—±}†a+¾cŸgÎDïCŠÓá¡Ö¼‘«Ò­ÃZœ *gx
-(ÆØ\F‹¬ö†\Z9X”VN˜õÇÂÖªéj¨%µ0¢£XˆL×C5nRhlRht<à\leÇ2zÜ}wýOjŸòǬ~pS­Æ% i€b¥¦—= à™ÓaIǶ}ÌzÃ@A GYÓ1+Ôøf‹mÅûá[5d릷nÈæPÑ­¬Ýcwf5ÚxÔVT‘[V; ‚¹9)>œewtBG¿¿Q±Ûxé\ŠÔXæ¶ õ8“€,¥xhºÒ2´F{¡Em’
-[te$çï>|X ¾®èõù±$#“ÿtÙ}U¶ÎoBbä.¢}£_Ø¢ƒ )ú£÷~Wl煮mZêH_çå&«è÷ŸaÝ„ p܆÷GêΦ~–&aqî¹¾
-*ŒO›¬n]%–Â|7Å¥ÃÜÍ`Œ®*ê/OYPV±¿Ïl<é°’Ÿ@÷ÝäÞŠª’þŸØ\ÍY$BUÑ;òQÐÀ›ÌÇr—eÛôpñÛ.«FŸ@Òß¹kÈÎ:±¹þÔ}×XtÃtª¯¹LãB„Ñ.89QlIϧ¬g<•õŤ 9‚‡Ka©‚ßÄÑÕüú'òBvÜ>Llx…™y5+´å”þ 3øÊk…šÎVH5õ{¸€zSâfT {#Tîóû¸½×Gs±³»½P‰dJ&ñجÖí1–¯Ñ35Á¤Hº€0øƒpøÂã,?ì·D°äõÂJ‰­cPžˆ£žœÌ‰Gçpðkª€,Váo!Bkë×|{)Þì}{ö¿Íòb`Ýí,ý¨4/×ô3ƬA%hᙤIøÕo¼‡*‚
-Ý(qw9Øåß5÷…­GúF–ã‹
-39¦!ÃQBaÄýÞ·w%{$,,ûËÑc~9fý—
-ÃÂeô+-ÞºÅ`aÃø¼ÃEE¿âøà…£ÿKÕ9¼Hûœ8qÆ ñ÷gbxO&†µ½ð—¾`ņÿ=Kô(Cˆ¹g›ÑÃJ´˜‚QŸ 4««ñEÿ‚®>BÂÆ•T(„góGA(ÒÌÄZÿ–~ÆQAHã(=ƒ ’2üEûLž±ŸIsiU¸@9¶ÕP%$z?_‹bªãñ’î(¦¤;mÒqÒ=ä ;ÜeAP‡M“ýb—ÊT9p‡jè•ôîPI_WJ}¤tÐÇÎ
-endobj
-1512 0 obj <<
-/Type /Page
-/Contents 1513 0 R
-/Resources 1511 0 R
-/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1515 0 R 1516 0 R 1517 0 R 1518 0 R ]
->> endobj
-1515 0 obj <<
+1923 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [397.3443 737.8938 467.1586 749.9535]
+/Rect [368.9978 318.5246 438.8121 330.5843]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1516 0 obj <<
+1924 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [321.49 696.0508 382.69 708.1104]
+/Rect [293.1435 275.6898 354.3435 287.7494]
/Subtype /Link
/A << /S /GoTo /D (options) >>
>> endobj
-1517 0 obj <<
+1925 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [329.3035 171.0954 407.7186 183.155]
+/Subtype /Link
+/A << /S /GoTo /D (man.dnssec-keygen) >>
+>> endobj
+1926 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [317.0267 666.1628 385.6987 678.2225]
+/Rect [427.0093 171.0954 505.4243 183.155]
+/Subtype /Link
+/A << /S /GoTo /D (man.dnssec-settime) >>
+>> endobj
+1910 0 obj <<
+/D [1908 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+1907 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1930 0 obj <<
+/Length 3378
+/Filter /FlateDecode
+>>
+stream
+xÚ­]sã¶ñÝ¿B“—Ê3 ì½Ô¹ø.N_j;Óé$y EZb"u"eÇiûß»‹]€¢ä뤓¹X,û]Èr&à?9ÓÊAÎâ$ô”j¶Üœ‰Ù
+Ö>œIÆYX¤Eëëû³7ïƒx–xIäG³ûÇ-í ­åì>ûyþîÛËï¯nϾóÈ;_¨HÌ¿¾¾ù† }Þ}¼yýá§ÛËó8œß_¼!ðíÕû«Û«›wWç ©•„ý>S8²áýõ_¯hôáöò‡.oϽÿîìêÞÉÒ—WŠ
+¤† 1Ï+ U¾
+>£ª[v)?ð|?d8ÚTæO)ªc®qÞ­Û_ý…Uæ"Ëé’šª£ lÖ¡«µ¾@‘:ö­7w…Æ‹­0ˆ¶YDsoó\´ËµÉ0«y€¼‡;ëÍfºÞó}(ÚÃ@c*P{‹`¨Â²^¦åÛ Q€žˆÅôÌ]›Ìï £…)±1HS™
+;«ÈC’¡—h9AÒèqâuMx
+¢æ zÁð&¨uŠÇÄëBj†æH3ˆå”í…£f‹óXq·Dc“"ªŠ’H¬(‰À—oE)‰†Í ÔS$ÚŠ l¥[ÊáõvWpU:(³ÍN¸†Ò{6òŸföÄ”yrу4í1¦¹±œMTŸÆ¡r xÒÈ4¾8Çɹ©“Mµ$smT ó?5ãm ¥n3~.Ê’FLÔt;ý³m¢ X0:àp¹N«@ݤcеœGÂàH§i¢ê²iö2hƒóÜ _mè{˜\UnQœzÛ ×( œÉ—L+ýç‰T7*‡wá"‚fñ_ô1  ;fhn*ÛýM@UoiôŸ·ÓïZðÈB®Óæ— c·5Ö±Ú¦Óªé¿,ʉT
+“<qõ }¸ËDÝýf{‡Ø  Õ(?J³åöMÛ³áÉG«S†¹Ÿòí¤ïšºçìË)!užl )M¡"É–N6(¸¸ÁŸ‚Kþ©à‚öñ½Žl ÃepÈãh‰»·Þùƒ¾cEXP½e4Â[Ù¢òÌ@觃Ä]Ÿ8î]Ÿ˜x ¹˜-³–rÑöýÕ?h”ÿfK)œ™4ŒG<`g6I1æ
+endobj
+1929 0 obj <<
+/Type /Page
+/Contents 1930 0 R
+/Resources 1928 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1927 0 R
+/Annots [ 1932 0 R 1933 0 R 1934 0 R ]
+>> endobj
+1932 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [317.0267 736.8562 385.6987 748.9158]
/Subtype /Link
/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1518 0 obj <<
+1933 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [356.8967 636.2749 430.5501 648.3346]
+/Rect [356.8967 705.9305 430.5501 717.9902]
/Subtype /Link
/A << /S /GoTo /D (tuning) >>
>> endobj
-1514 0 obj <<
-/D [1512 0 R /XYZ 85.0394 794.5015 null]
->> endobj
-478 0 obj <<
-/D [1512 0 R /XYZ 85.0394 622.0858 null]
+1934 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [432.0945 675.005 500.7665 687.0646]
+/Subtype /Link
+/A << /S /GoTo /D (boolean_options) >>
>> endobj
-1118 0 obj <<
-/D [1512 0 R /XYZ 85.0394 597.3039 null]
+1931 0 obj <<
+/D [1929 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1519 0 obj <<
-/D [1512 0 R /XYZ 85.0394 168.0037 null]
+606 0 obj <<
+/D [1929 0 R /XYZ 85.0394 658.3825 null]
>> endobj
-1520 0 obj <<
-/D [1512 0 R /XYZ 85.0394 156.0485 null]
+1318 0 obj <<
+/D [1929 0 R /XYZ 85.0394 632.0762 null]
>> endobj
-1511 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F48 953 0 R /F41 939 0 R /F53 1029 0 R >>
+1928 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1523 0 obj <<
-/Length 2578
+1937 0 obj <<
+/Length 2611
/Filter /FlateDecode
>>
stream
-xÚÍZKsÛ8¾ûWèHmYž$pôø‘õÔ®œ•5µµó8P±"‰ŠHÅñ¿Ÿn4HQ6í8R®ÀÆ»ñáCwÃbÀáO LÊR'Ý sš.Ì`¾>áƒPöþDÄ:£¦Ò¨[ë—éÉ»+• s©LÓ»N_–qkÅ`ºø#I™bCè'¿ßŒ/‡#ixruý/È ¥LÎÿyöaz9¡‚4Výåz|AGÉùÍøêúýo“³a¦“éõ͘ē˫ËÉåøürø×ôדËi;åî²W8ßÏ'üÅ Xݯ'œ)gÍà>8ÎÉÁúDÅŒVª‘¬NnOþÓvØ) MûÔ¤¹`B5 ØÔ>?.ÁaܘµŠ¥6}<ìHpÇ 7Ð}j5SBg­îµèè^ôÍ™q,URÝW~u‡šyw%e§nÆ™“
-GÇJÓeQÁf¸,Ù m²_yüH“u^Ï—>–Ü/ý†rõ2–oòµ'ÑÌ›$Üoyí$?êÛÁL`LPsÆÈ0ø¼ÜÔ~SC%%uRÞQ+¿»]¦:&…Èâ´‹´+ꇞõÁ¸v*Vü“séW D–’°Ú¾®uÊÓM‹°´§ÝÊŒ åŽ{¥ùqþÅÇM¹
-›øÅiX-,]3‹=­z¶¯¡Aj’jYîC'ŸyLiñT4Œ¹¼¢´_/Bsf Àê5ŠÑ8‡ÇŠI>(æVÐdzfÑÏài$5_¤Í*E«Æúa‹kЂt¤e².«š$ûÊßíW$%€¡4_­Êû
-®$˜·bNpý]R õ1§œi®ÕËÄœf†9Šö UûÙ+¹YÂØr3(>i„U±.VùŽ„
-~ô#l6cô7‘â`©ú HÁ\¹Y=ÄA;˜ %}˜ ©™ËÌ£+ò¨rÇoózœ6à­`&“ ¹ïè³mò,P´Ë˜´Ö|)Ò¢½I,]Ï·£WÙ{gxÁ¢Q梾‚…fã¢x™ñ”›y²û,ìÇ&–~)rÊLÏ?P&ß,¨ÒX?Ar¿,æKÊ>s?V5´ÊÃEî#æâv.{ü¸ %åš¾ÂE +€¤¨‹¼n«] 4_,èN¯*›º<j uǣ㉟]\LØÙäÃÐÉä,®3×Òn‘váZ¯¶ùÜÇ ,ظͭQ¯~•}KÿZÁq
-í¸·æïnÇÏó·ràW‚7ÿSòww[~rþvoÊ߯Ÿ$¶Éxö(Rûÿµj‘™:¦2 ^€$sÜu#¼O"½° &µT·N™î)zW°»–\ëæ®Aêô@8=‘OC ùðd×5jÓÁHÝW5åBèî!N€’»=
-¸á  ö‡•B ­¤õa
-íJA—b£ ÖˆÔi%EŸL*g³Ä+d›l¬ŠFíbpr\Ö±,†ƒ 6ÅkQF]Ù$¯k¿S1@Âu¾hš–$Yø•oº£å02§Øù¢Š¥UUÎ zNCõ2–<p=}rk E_í
-¤Å˜a7p—²!Q, wŠþ¦HCðÖ·=Óe|¿¢Á!×¢opÍ»ƒÇ—±!â7b(¡d›ïÀnÝSœ¾£ÞÚÇ7`½r ÆlÓA3~å¡ep%ñ 0ˆo¥ Éø*Õ÷®®ÀóUJô=ƒóAsº~øÑýð:cÊZÙoeµÖX3+Tw–>™;¾TyÝ7ù¿ùë`endstream
+xÚÍZKsÛ8¾ûWè(m¼ ìÍ;YOmœ¬Ç[{˜%Ñ17’¨i;ž_¿Ýh"%ê‘Ø©šr•`èþúC7(1àð'Æ2ë¥$^3Ã…Lg|ðúÞŸ‰8f\·Gý|{öæJžy+íàö®%Ë1îœÜÎ~Z&Ù$ðáÛ×ï®Þÿûæ|”èáíÕÇëÑX>|wõÏKª½¿9ÿðáüf4ΈáÛœº½¼¡.eü|u}A-žŠ=Bo.ß]Þ\^¿½ý~ûËÙåm³—ö~W¸‘?Î~ûf°í_Î8SÞ™Á<p&¼—ƒÅ™6Š­TÝ2?ûõì_ÀVoxµW‚3©¬ìQ ”}
+4žY%UPàí}†›xóΨÖPá˜I8΀c–é"«žWq`G¦ö,ÊÆÿå\fó¨Øóá}ZRE(*ÓùCVþ¤hÑ’â4“R™Öt=SIÅ<ê”ýÔ#7¯êE—“Y±Hóe(P* èdQOù|6M׳¾ý'ÌIžœ¼¨l~·wkú[¤Àöú–#˜Ó͸“áæ^¾±/ë‰ïÙÝqmu"™–‰Œ…`Þ†.Ê}"OÙ§wBuVw
+¼}‘.«|ZÂigêÏKêYÜðažÑCx#‹=O÷ÙkzXÝÇþzrÔFÛ['Y¾üLpxXÍÒ*›ÑNÊY†³
+S…ÀP?ÓSƒMHÊ”Š·„G„¾ÒÈD]t§'…2f×É ôd[ÃV0ádM]´”ñª˜çÓç[Ëœ·õ±\V0x §¹ÒÕ*K×Èç w5ŸC{1yÌɽÆBÐ/ºº)8TF'Vt•…H²L(1äï
+›MQµØù”O30žR>Ä¡1[¦“9ÍÑèaÛ`%:®6äªP¦TÀ&—3€‰pÃYþ
+ت>V6¢/¯¶#«±QrãÎ5äGO¨]¿ƒõæqýùçeÀ†DKï5°Hî xò|#`zr^jIJN…°“ÜjiIåÚÖœÙÍIŠÑ¨ùmÅX£7Šé¦í€>8à_0Á¹Q‡[,ÍÅø…Öœ±(ÊŠZà<º{˜wù‚øù¼xŠü€cª à
+ɸãîÉØÚ3žSaB˜'ÎY®²i%BÖ¤¨víí! ä É­L÷·^“ϸÑ»prK‚”ái$ã´¬²u^~6ãƒ8eš–Ù~^n3Þk… ? iÖ@¹‰çGRà}•”GîX{SfÛ‰èü°nlRl°÷Ø3$òÈ1DtÞšæ&R$Ù¤H(½I\âÔÅ]ÏlB8Tÿ·ÒyÌ´μŒ·7“¬sãs
+ÖŠåü9NÚMèé $‘šùĨ.‹Àj“}49(- ¼P (`’û 2ã+r žkm@ÔaxÒ‘«þ.TÎñˆÅ°ÌG……ÍEbó}ú˜Qm’QäIEHl±í1O©rûöUBfŽƒîð> [âEV÷„~D¼ 3ˆÕŠnøàá.ô z¢ˆâ·|™W9$Ãõ°«OT¦³êeI ù2ÜoÞ…±×½·‚ç7ìüæÓÈËáùæ‹C¨\}²í.íÃÁ^®Òi°xÞI;ê+K=m;88Wá
endobj
-1522 0 obj <<
+1936 0 obj <<
/Type /Page
-/Contents 1523 0 R
-/Resources 1521 0 R
+/Contents 1937 0 R
+/Resources 1935 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
->> endobj
-1524 0 obj <<
-/D [1522 0 R /XYZ 56.6929 794.5015 null]
->> endobj
-482 0 obj <<
-/D [1522 0 R /XYZ 56.6929 237.323 null]
->> endobj
-1525 0 obj <<
-/D [1522 0 R /XYZ 56.6929 204.9886 null]
+/Parent 1927 0 R
>> endobj
-486 0 obj <<
-/D [1522 0 R /XYZ 56.6929 204.9886 null]
->> endobj
-966 0 obj <<
-/D [1522 0 R /XYZ 56.6929 174.9041 null]
+1938 0 obj <<
+/D [1936 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-490 0 obj <<
-/D [1522 0 R /XYZ 56.6929 117.7253 null]
+1939 0 obj <<
+/D [1936 0 R /XYZ 56.6929 746.113 null]
>> endobj
-1526 0 obj <<
-/D [1522 0 R /XYZ 56.6929 95.1854 null]
+1940 0 obj <<
+/D [1936 0 R /XYZ 56.6929 734.1579 null]
>> endobj
-1521 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F53 1029 0 R /F62 1062 0 R /F21 714 0 R >>
-/XObject << /Im2 1051 0 R >>
+1935 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R /F21 930 0 R /F62 1352 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1529 0 obj <<
-/Length 3258
+1943 0 obj <<
+/Length 2894
/Filter /FlateDecode
>>
stream
-xÚÍ]sÛ6òÝ¿BôLÄâ“ îž\$nSÇg»3w×ö–h›SŠÔ‰Tœô×w R¤,ŠéÙž:ž ÁÅö{Ÿ0øã“X‡LZ51V…šq=™-ØäúÞp3m¦]¬ïo¾;“fbC‰hrs×™+YóÉÍü—àøÃÑåÍéÕáThDááTG,øþüâ„ –ÇŸ.ÎÎßÿ|uthTpsþé‚ÀW§g§W§ǧ‡S.•0ôSü÷ÓÅ)!<=üí懃ӛvÉÝmq&q½ÿ;øå76™Ãî~8`¡´±ž< ¹µb²8PZ†ZIÙ@òƒëƒµvzÝÐ]dÒ2u,Ì: ±‹NÚ†‘ÒÑ©\ò8˜§«Ã©d6(ïèyuUQ#+è™Àƒ³ Jk÷ýEéUv_d¿2&fIáAI1÷Hi:ßB¿Mé¹tßO«tõÙáÀ7n¿zÜdá‘\ïªzoB~D™w`e³þú¶\ÒL9­ÖÂís™¬jX²`±Û£
-³¢4ÀÄ‚› *WuVÜ÷G.Öy-s?ÜÑJxš `™®Y]ã~ðõ‡ýå²ÎÙI•…Ç\¯–e•Vþc-fú%YÀüïví¤.Iþªe:Ëî¾ÒKýÔÔJèûÍfë<YÑ{‘&«[Lä¤6òÁM°ÊÜz¡‰L\UuHܸNÓm)—J„<âfb¤àå:W÷j\u´ÅŸv<Чóâ~¯Ó™'˜ÓdD ¹Ü^“â2Œ…P½5=Q•kd%
-¾!¹äý• <oú#Ãô·’¢Å[À“yI¡¶×¤™ ¥äb?)Z¬‘•< W:Éœ*!Bay jB+Áaç̓ªY¹X–EZ8̓w§?½%^;mž¥ dæ ’G$]ÿÇö¹4¡Ò¸ÍD åßbi¥ŠCÃÌ–¥ýÿF5 éèæà
-hƒ¹|³ÑŸjÚnjY†ÜàW ÄRêIæ^h£É?N“á±5VÌËE’½~h=¢µD
-7V¤áƒwœ™gÜ]¹.æááb¢HLºë} Úœød*dh÷ºÐ'S6#†ÉE°^‘5°0ÎÚ~]M"éàÉg£ -fåÜK«Mo³š:>'ù:¥¦·Ç€àÌ4šÔ´jº75â8½èvS¦NÉb‰”â}'°­84 Qž=œêàydÝpJ°©Ìü…)›Ãœâ1˜;ª
-Pz*WJ×&p/w|5ب|âÝó¼1ÇžÁgÇÔ
->DhIîA]áT '<I8¡!b Ç°pv¸þ<IzÕ¸Jqà)hL8% •Šbγë“ïA»Ê嬩¢jéB `|t›T)}õé+ø’hCòA“ûÔFp®†ÙÐÙß[¶±àø¬M³Ä;ZFÞÆ^B’¨µäÁQ_³YO’gmy›î; ùù )FÓ´‡Ìõ¿”)~2KËBk•!³ÄÓ›Ø'~ǧW‡Ò߸ ‚Ê|^õò¬yvŸÕ‘¥«Ú¾Ô鈗r7Ôxt4HÝî²ßpUOF²ÇjÌÑAn„•bRçã‹£ŸNL‘‚(®Ÿ CÚÖ–†Àv—E6sT¸¯›_°ˆ³íXʳĘXõè(™GA‘4/û#¶îßp²,Ôܨ1£.5$\“Q?ùp|~2ÎlœùáK¾Ö)‡ñ¶ˆq÷ÕeKx|ÈfÔ„).©5˳ÏÝ?âå,KjšfõÃ0ê6¶A^c¸¨ ã{˜×¡Ê®¸
-«C©å¨IÆL“+8ñZ¤Aê¯ÒežÌ¨Äd‚Œ Õ²ÍæäÚ^ƒ µ)‹Ï àãZ tîwkwƒ|s§ÉVyYþ­ ÖËw.ZRdÞa ø9Å‚*b:uâäÞ
-ƒRÖ†‰
-¿M =×ñvÊ!5ÆIJ+1,Þ]¹yõWa8D’rÌ6 Hül¬¼mº¸þñô?Àop„Áuí«ÖÈåîCàc¹¾Í³µOýùz×æ`‡íÍ(¼+ÑоBÀ?Êbcq¦Ã²>bŒ˜Ü“tÉð²žD½(·@D4ž&p+’!3Ê£kÌ]…îqŠ[¯%Üêà!©¨…zÏ„0&"È1Ñõõ‡òLlGé–‰ØF&2¬ÇØgq¯C–7œUˆe´1zŒ{Ò†<Rd©Þ_~þ©ÜëÞi×zÝçåmñ.Ë*à °¹¥²^b±‚С=hòÚøñÓñ’ÒZ£—q_V!à£Øá1’
-
-FuÌçgŸ€¤<Û!.7ž¦Ð8¾ü™Tu½AF À9räÈéà^±$Ò‰QWž¡ÇÉ3 >#Öíîô Ǻ<6¡ÑÑXæ Î96ŽÜÆÏ/¯OGFªà’Ê>Cl[õÌÑ"­JoX| Ö¬š~5ÌT¥{Õ‚`­V®ð†oÈ o›Âá:Ú¸E{¸Õ%Ãö'˜–1‹Ä eS~~}rq8ÕLŒm›[ŠEíëNZPµPcõžPE¯\˜b>È9ÄŸ[•{†‡ß_yênõ¥8ò
-Õi–ÊÆcá×:TÍÁŒÓ Q?4w ÆcÛ¹q××qãøNn¼3ÊÅ_ØðŸŽtðsÕ g{JР÷YáÍêýOz¡å¹ŒhNº¶¡Û RÐä¡·™» "ãàv]ïJ.ª:˽÷ó¶opQl ­ëó÷XœfXz 7ª¶
-º·ŽDJ
+xÚÅZKsÜ6¾ëWÌ‘ªò xñ•=9Š”(IÉÞѤvó:P$¤a… É‘¬üúíFR¢,;>lé@ Ñ
+ýCKæÖt´ü°3ž–—}Ù6Ôkoiøag€£#"L‡@!<-j -ÁÒ–ÇÅ­ ä}îÊ{ÓPó°/²ÁP¥°\nlÔ황ۆÙø|‡-ʪÃ4¨A¨¶€6x!JŠ´¼­ëCSæÙP6wDz(‡1 ~&­NmT7ö{“¯çûQà”¿s.A­ëXª lè‹KY=ƒ—õ ®“rí­Q¦ÊáqÁ !„…”Â1Ú ªâÍé:Ñ‚¤Ä=nÛ®Îjãùðû°+ó6%
+Nv 8P<WÒïRjÚwæœè¸B¹m«6Ϫ¯Ž¡B–DaèØöèïù$œ#šûüa*ÐYºS‘K
+Ò!KãqÒK+§Lˆ(òZû„NãÐVìÁºhèƒÔŒº?_]þwíô¢R–@èÏôR´u†6Ô: ú6ÿÓ ÆR®À!?;t$y3T§Bˆ
+-Í;Ö·-&
+kÛt–XRTeš;<û²8$ñG¶~n{RÀuy×LOÙªj ö®Ë&C‡²ýÐ~b^AÖ_’ñ“Øž½wí¡Ë×ÊŠ¢3}ÿ™’mÐ_–Î9<îÍg®õ£yü²Cþxþ µ†öOã¼Ê™ñ…uÿ‰Q÷ZÐ
+¿*0x~µ>bß×À4ΉyüLÿ³Y^ð0‚ðšÀM¦ üW<b‰LŸè8ª“7ÏÛW
+:„E•$ \º»P%5ò¬·±èïœ –
+$ÖY᧶D)Leürt<•¸äž»tÛ»ÑÐZI—ŸÝ’€Ž,YÊ)|Üœ¹$wtE º©+ز|çK·²FÈ7Ðí6acõ*4Sr#"Çj²‚¢àˆ˜:…Âá׶q»_”•9Nõ§°SgQ,Æ©L¸ÉSO ébµ¯Æ× ÞÆIúŸ/V}úsï&À][/äCBŽ\=-ࡲ„y"ȱTAçN¢ "­ÞŒiä¸i©àhP»*L‚[ê×4¾¹8#2ZÚ-R˜>ïÊÓÓUî¶òmÈÙ‘j ÷­o»tp\9wÜ›‰ãj³!c'>½¥{ÆØWépo!c+¡œ/ ­tc‡ÞŒª§kjCT’&ì7Uéë8±׎ d FV<HoÌ-±Ù¸­vÙ½[þÆx¨övÉf Ïz{—õ¾250{ÿöy| Œo¯®Ùè
+³? êYA#Àx©g2=y÷\¯H¢aHÓb.‰»tfÛª®x~ª*Fþ×x¶î‹ªÐOe
+y 
+”UÅÈõŠ$ÏWCI\¡¥d2„3+!¶þj²ª,ÿèdS¼ãÓäx±Lp™»Æ¾~zÄñÇ¡¡Ž¹þÕš“ØüôÚç¥Áp'"|Á"ã/8v)%ò‡ÆÇ4%N(%â£)ž–€ît| ŸcŠÍÆ¿xP}hŠ—¦ò~™Žoô~ÿY¿Œ¹ÿ—ÕÊSúýãµÊiÅÓ—@…Á[T_¦É‹Ø- D´¾±ï,0࣠éò10«ÊÞy»4òظ˜‘Qè <Qä_³ëìiàÌ‹šXj¢‚/SëÑR:†œÊ£ÏX’f|ä'ÌH2žèWýŸ ªÈÕ5ÛŸð 1åÎçcPgY›5\—"XWå½#Z]Ç^×q¾ÎˆB•’Ž/.@öÄŒºJ:ƒ©X~g£ùš—ÍuhJ›Tüö`­¦°7¿öõKǶïÊ:ëJûºÝCoãÌP‘l½³€}à¨8)‚jà´¡&!C¸r¾€dUˆI ‡ÝýÅ4âAÕZ$YJ‹øujܘ%Èb·-<à¸m§9Ç?Rö»öPsPR”}ž9€ú§žxË—9 æœÅ2Âì±(„Koáæä«W3þ§þ³Àñ&@ •$ò\äŸ(àZ¨Ò4}ví«„…‰¹&¢ÿikwendstream
endobj
-1528 0 obj <<
+1942 0 obj <<
/Type /Page
-/Contents 1529 0 R
-/Resources 1527 0 R
+/Contents 1943 0 R
+/Resources 1941 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
-/Annots [ 1531 0 R 1532 0 R ]
+/Parent 1927 0 R
+/Annots [ 1947 0 R 1948 0 R ]
>> endobj
-1531 0 obj <<
+1947 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [341.1654 731.9163 414.8187 743.9759]
+/Rect [341.1654 175.0606 414.8187 187.1202]
/Subtype /Link
/A << /S /GoTo /D (the_sortlist_statement) >>
>> endobj
-1532 0 obj <<
+1948 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [434.6742 731.9163 508.3275 743.9759]
+/Rect [434.6742 175.0606 508.3275 187.1202]
/Subtype /Link
/A << /S /GoTo /D (rrset_ordering) >>
>> endobj
-1530 0 obj <<
-/D [1528 0 R /XYZ 85.0394 794.5015 null]
+1944 0 obj <<
+/D [1942 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1533 0 obj <<
-/D [1528 0 R /XYZ 85.0394 714.9798 null]
+610 0 obj <<
+/D [1942 0 R /XYZ 85.0394 385.3709 null]
>> endobj
-1534 0 obj <<
-/D [1528 0 R /XYZ 85.0394 703.0246 null]
+1945 0 obj <<
+/D [1942 0 R /XYZ 85.0394 353.2653 null]
>> endobj
-1535 0 obj <<
-/D [1528 0 R /XYZ 85.0394 522.9001 null]
+614 0 obj <<
+/D [1942 0 R /XYZ 85.0394 353.2653 null]
>> endobj
-1536 0 obj <<
-/D [1528 0 R /XYZ 85.0394 510.9449 null]
+1240 0 obj <<
+/D [1942 0 R /XYZ 85.0394 323.4096 null]
>> endobj
-1527 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R >>
+618 0 obj <<
+/D [1942 0 R /XYZ 85.0394 266.7517 null]
+>> endobj
+1946 0 obj <<
+/D [1942 0 R /XYZ 85.0394 244.4404 null]
+>> endobj
+1949 0 obj <<
+/D [1942 0 R /XYZ 85.0394 158.1241 null]
+>> endobj
+1950 0 obj <<
+/D [1942 0 R /XYZ 85.0394 146.1689 null]
+>> endobj
+1941 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1539 0 obj <<
-/Length 2765
+1953 0 obj <<
+/Length 2922
/Filter /FlateDecode
>>
stream
-xÚíZMsã6½ûWèªjÄà‹
-F—Ÿ®¨yx~q><¿:;ïÿ>úñä|TO¹¹,Î$Î÷“_g½ ¬îÇÊØF½G¸a!cÑ›Ÿ¨H†‘’²j™Üœü³~a㩺&ÅxÈE${iCEöðÏÒO0øY/rÆQ´û«ÎâÃ?€–ÄTdjè…h@Ïy*kz&ŠC-…tÐ_²
-qð%gÁû´¯²ÛtB²…Ǻσ‹3’EÌ#P ŒØÁ&*ãD6Ó}RÙP‚9¾Ã1QU*d1‹:PU&ÔÆA_Ýœ^¨Æêà”ÐX¤åc¾úB7EºzÈÆÖãqZ  w HwQ® æ†éxó>¼B†q«¯|õÊjÄaxô´LtÀ+£Ð{xû͵ FSQšÚ`“2{ðM ²fn°^'ßåN°AY äó$[ è,Ú²k舺€$Áâ­‹t¼Ñƒ¹ÖBcy/ƒl£05+Ø·øM5â ´¡Œâ.#
-þ) ƳŒ
-Äõ(ýÅõÏWbUq½RÂëÝÆ2
-‹¨6¯ªq™¬J’ò;ßÍ‘#”n‘LFR±ýaa”ý>vœvµ§b͵‹×^aÃùr­;R1Q¹a–P¹þ »ØgpM¡ÐC6AOÖód¹'ów·iù˜¦ º!Ø@°Bà¨
-­5ÄuÃáÍåØ…€î‚³|QRüÄÑ ÿ”A‘Ý/’r]mƒØ4IÊàål»Ž„(Æ߃jÏ›‹9æ@–VGßâsÕˆƒ˜C®¨²ŽðÈ%ŒñéG_š`„NbÁóu™Ê)ñØú~Š…¸(¸ÅØÄ…
-RW5<Ló¢,H¤H %Œˆðê""×+¡’ vJ3?°ÃT6ÉH¯c ¤$Æt“”$÷`„¦E]÷h›'¶rÌçYcëÝ}Ó¾ÖêŽMÌ_¦Ç×5 i ¨Pî(uý¹q¨8gŒl7œÑ`Zëcu”w<›*OD™‚IãËÂá:˜<è‰u€)y´`JN&>ñdM.¢¦š%ÞÁ½ä¾T
-n®/ÐeÓ³AÙç*å›t1q)1È×ù,?‘|±‚$Á³,ÃjL#ˆÂç5($‡q¿ÏRï1)„M37!ÔsJäð‡U×Ää G¯¸ÕZÙÁÀÒ$á©nØ¢à_˜
-óqÙÍÏ£ë>qðΗê)OÁÍ]ÈŸ Y/—ùª¬Tû1+Jˆ;Ƙ;Tà™73p d˜­nW ôŒ©TÿYD3D&¦sµ÷XI¥E¸~±+J›Ýnvó1Ãâ|ìpüÿ¢êHs±ÇÒÉæDY×5c˜Ù9¢öÿª&ÂuJ#$؆ ™Ù>ÚöÕ7Ø€A1T™×µWçï¸Ô¡±¾ZF'z
-ÒД¹Óz³¢ûåzµÌ‹— ÕA°™^¸çExœ÷»b_]ävÍÊA½GV‡ùœÏ5+êЀ¹{áwÚ4¼ß)€ÈP*Ð ‘¼«€á!÷0ˆá°#qß·åßFÕ/³,ŒP;, çû³^§ï>÷Èòæض2¡´öÀ‡ Oé§ïB4Œýê@5gÀ·ZT½Sÿ©„·‘endstream
+xÚÍZÝsÛ¸÷_¡Gz&Âá`ûäØrâkNq%g¦íÝ=Ðms"‹®HÛqÿúîbA‰’-1©•©“c øÛïDÃÑ3–ÙT¦=—jf¸0½Éíï]û"Žé7ƒúíQï/~9U®—²ÔJÛ»¸j­å÷^ô.¦¿'–)v+ðä_Ÿ‡ƒÃ¾4<9=û”PÚÈäøãÑùÅ`D/lúþlxB=)5ÇŸ‡§g¾ŒŽN.Î>©{48ŒÃãÁ៿ .–[n–à
+÷ûïƒßÿä½)|ݯœ©Ô›Þ#<p&ÒTön´QÌh¥šžÙÁøàïË[oÃÔ—`Ò\0!À8ÓBlÿUú¿I©XŠû\ÿѾà)ðךñ”¯—²…¼†iïzΤÌ*©ò“YVU‡}«´NŽæ
+Ù‚âuð*í™Iíõ›û䘄‘žËŽ)Ãœi
+ö VU[ä£1`Öiæ×þÀaDúªœÍÊÇb~Õ‡dA“œ¶–ñ¸e;ó‘ÓZû1@ØHaã¨F)Á$ÓhgGÕ_6Yº”t‹F‡;ýÿb
+N¶½ÀÚî±woqc|]')èÉÛ_PH@ ½*ïçSÄ’§ÉàÛ]¾
+ÃÇ|öD#ƒ¶a
+Osšƒ2¶ ¡¿º¿¬é9§!,L),\ üHz–ßÊU³sÇ]ªcйÈâ§q41YšÅq°ŸY3"Ú2´SzŸUôŽ~¡±QÐ1Áç…8´Iûë¦ÈmåÿŒˆ.á–ÖÉÂݛ׉âϵK’C©;„[YÆáË¢pÿ6ø'p[¥<×e r0ôN๻¿œ¢¿æOÑ5·ì ¾ˆ‚½šU×ómøêüO9_Y›þvûÔaˆ¸Ú‘´@د Ù«+W©…8Su¤Ø3¡L4DcÌV¥Yã“H£†ˆÔ$7YuCê¶hXˆ]…áÝšËБ…ËYfÉB¤‘…[ Ó[_û6*ûM%öäBðìò€òž»H¢?œöiíxéª Ãu=+/›8÷®¬
+Lú"®ãû»ÜÍb†Û˨ŠŸ>ï@´µÕ7Ù*Ë™“^t ê,“6¥3‡gÃÓÏ
+Äñù"¨ÌjƒŒÀŠ¿
+H
+:$‚G,€2:j‹3¼ â _⶿ô ‡¸
+¼„®#[V”*“ÚðÝgçãÁqð&Ò)œÓ™ØÄ´Õš1ºÍë›2š•ù‚­›£^+UùÊZ-»oÁV-B¡ ŸÑ2½¢p¬¹ÜŬ
+o™Yà&Rîºì‘ôLC˜NÌŸ û†‡Amt'X° B“‘T4X©§¡r­:˜c(žŎзŹËïpî»KMí/ÝC~B-Z:1VÇ ªâšåÉš½„Ö£0¥‚Ö`Ó¸p¤ƒ ïZ.ŸÉ…·f…È ‰˜çk’/U3¼˜oç¨ãu1ÞˆÖåþ+=ÐöB&4¥ž`@i
+<ø õ’eº‘
+Øm8Ú_÷†²6í’q ã¥p‘ ƒãPòM@®b¡]ÆÌôîy@ Y1]¢¤˜0-ð 4Ž `‘âÔ˜
+öçÈb-ï¡Áýáf°'£^3ê“ËQ" ¦íó\f\¥¬‰È¿U½¹Þ á?–ñÅR¬ŽDëÛà鑾 ¨ÑˆZº¤[Þ# ý­l–:‚ÔÒÒÔ†Mõ_òË›‰?r.¶³¤Ù׉#æ ¬Ç;ÕL*ºp±yO“÷:Mø÷Þ_Ýž‡ )ï·¤³Ò“-ºl\‹J`üÙÅvÁqÓ²ÖÚû€ÊÜendstream
endobj
-1538 0 obj <<
+1952 0 obj <<
/Type /Page
-/Contents 1539 0 R
-/Resources 1537 0 R
+/Contents 1953 0 R
+/Resources 1951 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1486 0 R
+/Parent 1927 0 R
>> endobj
-1540 0 obj <<
-/D [1538 0 R /XYZ 56.6929 794.5015 null]
+1954 0 obj <<
+/D [1952 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1541 0 obj <<
-/D [1538 0 R /XYZ 56.6929 133.9784 null]
+1955 0 obj <<
+/D [1952 0 R /XYZ 56.6929 671.961 null]
>> endobj
-1542 0 obj <<
-/D [1538 0 R /XYZ 56.6929 122.0233 null]
+1956 0 obj <<
+/D [1952 0 R /XYZ 56.6929 660.0058 null]
>> endobj
-1537 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R >>
+1951 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1545 0 obj <<
-/Length 3132
-/Filter /FlateDecode
->>
-stream
-xÚÍZÝsÛ6÷_¡·“g"ð wO©c7ê¤nÏQï2×öi‰ EªeÅýëo» (™Š“6½éd&Àb±Ÿ?@–£
-5‘êx ”úñ|Ç{ÏýƤ]oÃ{6åŠÍ Ç›S“—=r¨d9.&t¢NðË™§‘Ý ›
-cØÚrY;á€ê$1áG–Cžƒ0€4èr•áì€K6¢Ös%—ßíõ$P責³Ö¥ƒbå?«²L”AJ”ÚR˹6æ} ` ͆_x]þVø ÔŸƒ.Æg,
-TøüFâ6Ý6ÔØuUÎËÖñáÄ(ÙRYU¶eÁ3]DÂwêÒr1耛bë€I½` bwËea™PôS«°<]ÈòäU³«øÌy˜
-üf†=O‘NóÝ‚ÀAìD²Æy=6,LoÐô<
-.C€–s²“Q=@‡Ú. wzC¥ 't†1ÊcB£xÔ{‹Atµx_´¼ƒ“˨Ã(ŸæsNl›ESa,öy,×Îî‹žÒ‰1à«r¹rKc3†pÔ˜S‡å‡Ú¸§šmNÔ/™žÑ‡1k0Z&jÃ_“*8ADÝiMK8–ŒGæ–z¬„‡2?ÝôîæŠVÊ@‡/†r>fÏ
-¥¥¦·Õifç«8×Øj—û¤N°î†“åÙ¼Üõèríà]ææP^1¶ÉÉ¡AJ Ç<fâñžéUéX* ”L¢k$Îwyiî>É<ïOVÒ%W‡IÝBdF­-N®ëbÝÔåÂÞ\
-Œûº«ÑóæÁGì³qìalte=ãÚë(ÈÐÆ÷M§÷>z Ù°Åw;<G()5bÝ?$7½!röД^*@
-ËšæŸ@°Y†Ð袸̀Ò1t蕋̓J\÷à/ÐÉKû –xd«SU8ÅGwv6¡ScƒNÝÛ {é¹U{‡œ± ‚!4ÖAÈÉæMoûRŸ=¸/™ÇÁgB lÛE
-@Æí™À9JyáÐcP=ô ¹š†OgØGœ!g=¯n\pGßù¡ƒ©“ø Í÷u³¯Š|YœaÕÝZ÷ðU‡áJu¢1<Ö :nüÔÃ3öö¼n  …s!UÔ#®Tú¢>¸î™‹Q'€\›-»ûÓ·`©¥“Ž” D"õ§½Üƈc}æËíà*/HO‰ŸþíW<ùm‚…¿ˆ¤ÿ®ö¡6þ†‘F‘©T †Æeúv*®_ý€>: Æß¾»œ$:Q€¿€üß×·×w/E7íôuÝH‘„4ÚÛû5>øçh(ŽEh9¬!¡B…‡MRCnûT%/ßu
-9¯ÞN_Tò‹ê#
-E¦Ï9L”ŠP‡ôKÀ±C¸Ÿ LV‰A©T©óŠ9lùö“P‰Ô¨ô9? c\@×ËN° ¨ úˆ
-zÜÿÂ:Ðäî$~Î9tg ©…€¼¾k€¤ •œWKoÿpÈHpñTEϹ†R"Š<v ú¼zì¿>ãGÊ?¡ÔÉ$‚jcÌçþH)A#QEÿ‘R&ZDIoáÏИ²µ
- 4 a•=ð½’>ZîÇkµ°Ã?eáT~÷dVô¬é7Ëx2w?X
+1959 0 obj <<
+/Length 2986
+/Filter /FlateDecode
+>>
+stream
+xÚíZÝsã¶÷_¡·P3'_$ÀöÉñÙwNî|®¬´7Mò@I°ÅF"U‘²Ïý뻋%Jч/öMýÐñŒ¹X|ØÅþ°»€èpø3®RÝ1©f1qg4;á;¨{w"B›^Ó¨×nõÃàäû e:)K™t·­±,ãÖŠÎ`üKtöþôzpÞïödÌ£„u{q£.¯Þ'¥ÏÙ§«‹Ëw?÷O»FGƒËOWÄîŸ_œ÷ϯÎλ=¡t,a
+·€ÙHÙÌ!%ýd“ÑgäuF<¹j% Uí÷Ù”øã2ŒRÖD¸/yUo‡óà›3øOYà"âæ9&¢µ6(=ÐÚ€ê÷é[?ή26QFR!þœ
+•+B‡ÛrÑ M_?©Þæ4È&òâ'Éýa?[ U9Îoqì[·¨ˆqë«œQéª+"hLZ.Jñœð ¼‡ VdöæŠåÌ- ?ȹ,ˆ7\ÖDøÝaT4+W«͗uVCûlê· 4q_殨ò{·ëçüÀ —aé·ŠŸ²#VªÅ4éˆPË£Ñ4'{f†Aq1jðÖU£E>t¡c^ìyÿâŒÐ"q̶áB^˜¬¯mdÏ3\0¦
+\ƒ?5ž¨ë–Ÿ§˜µ®|‰¿÷›ûuÍ9K¤é:–päÁ@^ºŸpJj¡‚†µM )l£aâ¡Hñ» ùÔºEߎÐ(ùHä#õÈ*äËT7¯µ ºA¦ß¹©ŠÀžîò׌\ÒÔ_©@¿=Ÿf£¦Óð‘¾W^a˜X™ô­<˜CVÓÚŽÏÛâÛ©^!c“0#¬<b5q*™ŒÓÔ êzÐGßR¥Ñ):3:š—~RÜ# º†¬aγEMTyšy|b\Î2ò´tØÕHUsP º° í·®·ßrëÖ~@GíÅ¿²}ƒS –Ê,7ö˜Ž˜ƒNÒÑg8¹`‡F×äÝçc´UiM4Ëæs0³PºúÁ¹‚
+$7 ¬”Dx0@â3œ<ðÆã`á•«Ø~Õ5 ‘¨Êi­úe•ó²$-³©9vìÄZ3­RLÿÚ+GF—@ãÌ»‡ #£æ;Ÿ¶ô‡=‚°çÀÈ锦ÇT Þ¤7$ä!!xƒéûí4€µ3@èlúD¸ÂÒVK ¯Y[aÍQ¸“œÁŠîúý›ËwpâEgeQ“¦­h;ÚʨÊ^6G!²ÆY|çq[ÀXE~†ôÞkBš+}@è­Õ¼”Ð/m›{…®“â}q,"èb‰°„_ý®2Ñ
+»±#*8?è¦iˆUPËÅï¡j*{¶1͵íYcW'Ü–3ôƒl ýyŠü¶{C)p,’c©!1±"±xsŒmš¶ÌÑ`€<v¤·lY-"M.¥ ‰Nñʥܜ5n¦ñ–› ¡°w3±&À²¼[¬N¼²!i
+Ñàˆƒç Üóop IÊÌ™Cf€0$W†-{s SµÄá¼3ܳ›ƒë®iô&dî)^Áí£ˆèj9Ÿ—‹ºQîû¼ªÁûa ±W…-Ù¼bL“p®€pDƒà¸2e¹ñ²ü,côbõ]+ÝÜ@VQž¾Ÿ6Ej}ä@a;03<Ý
+ÌþtZëp\ÖZìK©d}Õ~ìîûn¶îîÿ\¯f"Me¤B=2n6ïüÿp÷¯x¬LMEÅÔ¾À¯y— •dZ†´Ù`n¸nËé´|ÀФüýHsÝ3Ñ0I«á×°Ëhš¡‚©ÝÆ/ ¬*˜µó>ý
+H«’δ‘Û ¯;®àà¤bQûÓX÷Ù4ßÚ"u³
+@_ð¸“<fJs1%iDTÊåU·—àuÑJñ—xÍ
+ù©ÚC:ç5U|¼ÃoÐæÒ‰Y>î‰ÔðCéý~Ör…¢ PMnX¹ÏÄ1YVTž/ó²r¸É)‚lpÇ@øê»jW~d¸Ì§uouH†›u²ºvrÂWá¨u쎽!XТ-{z@!X€±*èÎ0Ó¸C ¯J„¶û÷d[Û¯8'”bGS*Â$nB øܨDÀþyï@Lc­Õþ’b­-ù›U˜G…±»wÓrN‰K—´ÆoI4
+õMØ
+u÷Ù"/—a¤ê±Ú™¡­Ý,˜]fÕjƒýÑÛƒÙ,šÚ»Êž7 þø‡LÙº*¼å€=¸{­ôöR›ëÕ8 ãÂè':‚&-{Ï}¡Ö>
+Ï/TxjFí"¨¼­]X³ù4åµÏãÚh‘…nzXá–ò×Xh˜¨Ý»Â–Âu¸|㑸‘ýð\ë¢ #»/ü¬ ¿9ËŠÇ];‘æöG¢{¿«ÂÛ3¬ÄÉU“!8j縓Œ|ˆì¡–£&‰^­ý'¡kë—ñÒþ =ÑÇšž-QKÿ(y%=Ü£BQŽ½ ®…öÙñ4ƒf€±Ý÷há¡H-½(+b­=2ݤtÀÜÃ3Ðzâ2ŸM¤Š˜ãœ°Vä*z0ø€‰%jâ@잇_áUlUû.X&¡@ƒÌ'?üôš±HÚ?ãÁ&ˆ+þ±Öž§¸
+S†Jìz9Ë;GóO}§»~«¬ „Uû€(®ñ8aV!]-¶ç+ $MÓ¬5÷ÿY¨—lendstream
endobj
-1544 0 obj <<
+1958 0 obj <<
/Type /Page
-/Contents 1545 0 R
-/Resources 1543 0 R
+/Contents 1959 0 R
+/Resources 1957 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
->> endobj
-1546 0 obj <<
-/D [1544 0 R /XYZ 85.0394 794.5015 null]
+/Parent 1927 0 R
>> endobj
-494 0 obj <<
-/D [1544 0 R /XYZ 85.0394 513.3136 null]
->> endobj
-1547 0 obj <<
-/D [1544 0 R /XYZ 85.0394 488.6113 null]
->> endobj
-1548 0 obj <<
-/D [1544 0 R /XYZ 85.0394 303.0671 null]
->> endobj
-1549 0 obj <<
-/D [1544 0 R /XYZ 85.0394 291.112 null]
+1960 0 obj <<
+/D [1958 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1550 0 obj <<
-/D [1544 0 R /XYZ 85.0394 122.9426 null]
+1961 0 obj <<
+/D [1958 0 R /XYZ 85.0394 229.6198 null]
>> endobj
-1551 0 obj <<
-/D [1544 0 R /XYZ 85.0394 110.9875 null]
+1962 0 obj <<
+/D [1958 0 R /XYZ 85.0394 217.6646 null]
>> endobj
-1543 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F41 939 0 R >>
+1957 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1555 0 obj <<
-/Length 2939
+1965 0 obj <<
+/Length 3016
/Filter /FlateDecode
>>
stream
-xÚÍ]sã6î=¿Â÷ Ì¬Y~I¢î-ÝÍöÒÙÍö²éÌε}e%ÖT–|–¼Ùܯ?€
-á:§ŽÐ—íäQzw Nm•Æ%uJüH |ѵõ®/©·.óöL8?k8 胠
->AæÅÉFObY!ýrK>}‹Ž'dü²Ž‡=D¥¨<ø­î›v¯:tþªk;÷NnöYpD0å)‘ $yŒç`p½ØÞŒ®IÏEóÂj~ÿÙ„Ö
- ´%„Z«
-bÙ¢(}
-íkŸ{¹Æò„ØУ²±ØöþsJj‚Ð9Žcæ0rgu¢¸š(¬ÞÚ§ÅUÃÅÕeßSVÔnoß½ ŒzKqZõÕºœ÷í¼¦, $£4„r W†î—õ’:”PP]£ç‹ªç!ïIâ Ç“NMJŽ#=Ø5UßWN r- 7ïü‘„€~X2Áœyo+Ÿ‰"¬.
-IG%Ûš‹¾K™ˆ ™/´Š¼ \
+xÚÍ]sÛ6òÝ¿BôŒÍ
+÷ïï®Ï/ex7·o*Œ¤wõÝ«Ÿî¯çÔóÐ×·wo£éçêÇ»›Ûož¿:OBïþöÇ;Bϯo®ç×wW×ç¿Ýv}?°<Þ–òûûÙ/¿³v÷ýYà+F³4_h-gë³0R~*å0ÕÙ»³ G½vꤘDàKË 9I9%§Hû±’ÊÊi“m;ÚÔ¯AÌßÐNñß+@êêVÙ0(]ë°%uYŒkŽú¶ç"õʶé-3vQšzI`Q¶ùÖ,ÊÂGaÂŽ.Eâk%SËÞ=ÒQÀͺÌj;G%‘]‘õFÞýý[ eUPôԛñh³æá•Y›ŽMM¿«fÇ} ­zYM˜ùœÚyÆcLæC¹a*¦>X)ÏòU 6§
+vàØ UÝ&…¯£HÚMMi‡¯n,ÁÀË6›ê‰p]è¾[5[Óey,©«ÈºŒ b ðþhê²ýûùe¨
+B6}wÃá-z^{á&é:>°*W¬ámšÊäÆñþÐl7GŽHTthY™$¡`­Žô¦YUZyYÛšem™¬åD‡{Y±6µi»mÖÁjõ@€:\ˆ Ýª$¦È('7@@—¦Îº²µ¬Iï_+S•SJjAøè©@®[‚¬I €&¿}‹¼#„jÃ_dxmþ(Ý„åw- ƃ3úùƒØm†eØve¦k§è·šv›U¦³jA”õHø½­»r[—“¸)· ÆuV£*)½¶_.˶£y?AeË#ЄZ¼jzër
+b·O¼L‡‚uk¦T4ëÌ1Ygktý ‰ß»ÝÃ1ÓeÖê­\d±’£Æï}Yw·×šÈxʯR†›Æ #¶j§éVN',̈…9ÖÅ›»w–]Èíb”Ûy¥|!FÕð%;A€ä…^ù±ëÑ›Jùq³-!Ô6õaÚFqyH\†¾Eh‰“ž´‰
+jÆgôƒ¦CSÚrûh5 ؆]™Taø „:'´i
+ûpñ1[o*kƒ±vBx4Åñ¢ó›+š Uhx11z¼»§ªd¢T•m©aƒW0ÿÀ¥6ÄÙb~×D1…—å »Œ˜mžŽçsÁ°”À<²s‹2K*!NvLÍ& øù„qlåCL;¥@›Õ°À‘2òÖ f4 K“ =²øÁõk­_Òö@©JBU¦¶qXB5RAEÖ/WÔ¼šºw! ¦áЖÀÑB ¶\oQñ²}K;xXmm{º"–±ÍQé Å>åÌDÙ•’ÞŠÅö¨¶Iö71s>÷ ¸åžŒè8Š
+ò"TLLrgºÕhtVYýÅÊáìtbeÃ$ âë±*wZ8
+‚-ùÒ(´îO(ÏN ìí¦é[å|^#·:]Göæ¡åت/\P·õÊþ„“ÙÂ@Ýõdcí¤ænöé}›Œ
+8=Æ1{;ÆWÆV`ã¡P¥\0êiSòx÷—W L¦ùp4Óî«ý a"#¨oË£‰ëº\7µÉÛ) %ú}=äèEóh#vÑ8ve,C"æ4¾½$s@?4ƒÜÇÕñ†Ÿíp¡ ÐˆyLìð†ÐÙccWP),{TÍA}ÎÖr &ŠËLDÚ†
+pÜ‹Ä6÷ö´ÿÁdUêŽ
+Ç£xë­•ì¡]#@»-†­ˆdˆÔª­œÆ°4VAÈÁÆÝÞ¹>¹/0_R+?á œ`»Á(û¬]I1d¦©ºÅV=”亣»àq{ÂqŠÌpê2°®ô 9›†Ï+Îp\q†õœ¸qÂœ~÷û††Nžàb4€êfW•Å²<Aj8µìÕ”¦3Õ‘Äp[“â¸qCYä|*Øñ¼5- )£P¥Ô‹ë‘º¸ê„"·Í–CˆýÛñ5¾PJÍ”Ö~˜Fñç\t©8ðãXF‡]n–cdŽNr@ó Å û!©ËaS—*MüHûk´p\j‹@ûQ Cؼ€Š;¡HxûîÖ¿~ó3^ú¨4ð~x~™¨DBý¨Áÿy}w=åÃŽ$Æ
+N@¢£µÿÚ~Pr`ƒ{3û’J"?J"5-!)?Õ1l&Ѿˆ…¶z.’WÇh¥¯XÀn,ñ)‹‰_1¹ñ¡E`µvÑ*Ñ(#™úÚ–äiÉКò+—L$À£OJù2±Ì XD½ ‚=ñ¯XJûI ÓOÙF¨|©c:b¸ycË
+?Hß‚ž½ A0Älå ±$ÉËoB2•@=Ô£G©lÈV2¤¢«ì‘»è–ôY©…]C©…ÝÊä+Ê÷žLŠn€Ý↞ˆ/öÁPu¿^ÐE±â;Iºzå7I WsØ…÷+/_äeEÁ…X{T ÙSϨþ£u]P-ÈÒíO'hÐ ÃáMÞdG%•’´¿¡Æ«øc’/T¿Ÿ®*¿}•ÇÜ´æã°5WÒÙÛ5GûvŒ—Y¾:>=O§î@'¸ïèÉ]€N¤eù¬˜Ô©+ΤоŠ…ü<ÓÊÁôçÔ’_ ̹=]Ê ñà >û#?t[| Féïý{ÿíÕ;ÿ‡Û{.(¥Nè@‡EøX ›ð/ ŸGÀ"gòÜ/ýW þÂY`БFAz* „¾°2Ðò•Pn¼ún, áí…XÊà¤HÆË}!™ü/IáËÛ¬€;uIA)`èó’‚
+wà”pÏ*
+fŸŒÿŸûUÓþË®ÂVšÊé8$¡äµi‘™BuˆàÙq¿R¼ÿVÁfendstream
endobj
-1554 0 obj <<
+1964 0 obj <<
/Type /Page
-/Contents 1555 0 R
-/Resources 1553 0 R
+/Contents 1965 0 R
+/Resources 1963 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1556 0 obj <<
-/D [1554 0 R /XYZ 56.6929 794.5015 null]
+1966 0 obj <<
+/D [1964 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-498 0 obj <<
-/D [1554 0 R /XYZ 56.6929 723.7047 null]
+622 0 obj <<
+/D [1964 0 R /XYZ 56.6929 622.0858 null]
>> endobj
-1557 0 obj <<
-/D [1554 0 R /XYZ 56.6929 699.3651 null]
+1967 0 obj <<
+/D [1964 0 R /XYZ 56.6929 597.3835 null]
>> endobj
-1558 0 obj <<
-/D [1554 0 R /XYZ 56.6929 499.5106 null]
+1968 0 obj <<
+/D [1964 0 R /XYZ 56.6929 411.8393 null]
>> endobj
-1559 0 obj <<
-/D [1554 0 R /XYZ 56.6929 487.5554 null]
+1969 0 obj <<
+/D [1964 0 R /XYZ 56.6929 399.8842 null]
>> endobj
-502 0 obj <<
-/D [1554 0 R /XYZ 56.6929 352.0214 null]
+1970 0 obj <<
+/D [1964 0 R /XYZ 56.6929 231.7148 null]
>> endobj
-1560 0 obj <<
-/D [1554 0 R /XYZ 56.6929 324.7169 null]
+1971 0 obj <<
+/D [1964 0 R /XYZ 56.6929 219.7596 null]
>> endobj
-1561 0 obj <<
-/D [1554 0 R /XYZ 56.6929 283.2444 null]
+626 0 obj <<
+/D [1964 0 R /XYZ 56.6929 131.5008 null]
>> endobj
-1562 0 obj <<
-/D [1554 0 R /XYZ 56.6929 271.2892 null]
+1972 0 obj <<
+/D [1964 0 R /XYZ 56.6929 107.0349 null]
>> endobj
-1553 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F39 899 0 R >>
+1963 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1565 0 obj <<
-/Length 2487
+1976 0 obj <<
+/Length 3209
/Filter /FlateDecode
>>
stream
-xÚÅYÝoã6Ï_¡‡{Šå‡(REqhšuö\l>.ë6‡n÷A±•X€,y-9Ùô¯¿!‡”%[Ùlo X1Cr83œßÐ, ðZ*Ò8PiL$e2X¬Ohð
-R’&< æ÷=^šP­Y0_~Ïþuz=ŸÞL".i˜I$þ<»|ƒ”?gW—ç³·¿ÞœNTÎgW—H¾™žOo¦—gÓIÄD,90ŽÅïW—S\t>{7|œÿr2w"÷ÕbTy?|øHƒ%h÷Ë %"Õ2x‚?(aiʃõI,‘±žRž¼?ùwÇ°7k·Ž™I
-M¤æjÄNœŒ‘TJ>0”LI"¸°†2ªÅ '¥4œUù¶ÉQ¿‹l³)ªü£¨ð;»~ŒÒÀš÷®€I³Øò¼É‘Ò°ÊÖf¤Óp;a:Ì›ºÜµE]áìTÒv•µ¸¢h¾›D1—a»Íª¦ÌÜ:˜¹·›ë5îš]#5[.Ó'Ú'Ì¡Àš!µhÜòŪ
-Ë©Ý°¬×YaõQaV)t^Ïop€Š,jû]6àoŠÓpZµÛ"opnN¬xŽp ‚œƒlqb-ó!§2Ïš6jëh]7­QÀ¸ÊìtÅpjŠ‡ªøƒR¾È*¸+®yèÍíépm<eN‡l‰+ÊüÞ®öZ e[<¬ZÐ,¦*œ¯Ìµ*~ªeYo6uS´9’÷ÙIÏË­áSöŒãæÛóŠÜ±îÌ`æwÍ.+Ëg·{[´‘ÕüàzÛ¼2’r ’îŒ_
-ˆÌl—1žTvà,OE»BrV!9pOîüËL0v‰p ê]¹Ä‰Uö踺“À‹M]-1G]<w^ß4¢’€3$&r¸‚û+‘Ús’*lVN: :通!Á:¯ùÛ‡öÎ9N]W>­êÆM/³6C¢ñ¬ÜŸ‚2(wÁa¬ý€ââs¯ziïZ¬¢c
-j<ʤ{ëŒ1¤Šp½+ÛbSº ¨ "‰Å=~Q*ØÃ&,ôç­2·r]wÎf×£W€ ~¥ÑǸ–HÂóz‹´üs¶Iœ`žc¹r©ùƒ[Mõú#’0æ8,HŒAZ–*’X•&úkJ’HQT”¤ÿm—¤§Ê‹à>
-¼ÜÐﲊ:¥¢DH¢c–t/f½ìË8#B$"%ÈhÅ\ÝÌÞΠÒK&h8 ˆ.÷m(©&<IxÐ?íÛ40¶€Uöîûw… ¢u"_3
-W$V#2‘V`c—òœ3¸¯kÒó6ò²qz§þ]ÆÙƒžÿ‡Ë²”­
-zXÆ»°¬ª¡½SoqìX‚<´¶7
-Ô' ¨´¹ò¢-<b7€‹•½';‹[oÎÏ
-ˆ;5¯Œ¨È?GœP7™W˜Ë¾¯Ë²~²'ñ Ìšr›e÷Ø·¬[ãd$h
-Þ í×0Ù~!3‚<ö¾Úä6%ó±Âº·>.y÷NÂ<,‚ÑS%…¹rÀ-ˆ3eέ¬ñ›UÏ8ØUŸ
+xÚÍËrãÆñ®¯àÁ¨ÊDæ |“m­C—W»‘•*Wl Q†
+Á[ Æ¹Œ<Ë{Òâl[ì?Ð.±Œ-7Më9Ú{ v³­Î¥”ÑhÕ #ö8ÂÞésd© ¬§üÄe'vš9¢Ý5õª¬ïð¼™âk8Ñ®ƒÃÔ¾£n~WxÙv(¶ìsj™è6_þ›×5ü (ëâ#ã¨è wø&~ª?4ßßH½ïY—Ð;µ¾j¦x²n›rÑ&ÿ€[ª ˜ø†òÛ¶©]A½m‘×pg‚ùM©”†á¤¼'
+ðí©‰âˆj !p´YØß?+À±xMñ+ ›R,lÖ…Ú8O-æ lzI±†åÁâë.7^!úц¾AæÆ€^ölxll݆mII‘ó™^ÈÀ¤fSf"&EƒWØZ†@"KˆÞ·É‰À`m’ž°tÛ6Ë2ï¼)e fƒßd¤½ŠÇ~V\PÓÓ¾ðÃ’ˆ'Ц_]¼½Ûâ3h´‡5"Eµ±,‹GÆ!õ|ãwHHT“£¨B“Þ %/UQ¹¦AÏ4Ì|Ðõ›Â÷¶ñ&2Ižp°Ä=¾"îV÷ úz|Ì›“Œ> 5<
+éhì{Òé{tw<"í·àZÖ™ð̃ßò®nŽ¬c€ç5ØìÜ+q°$¬5² ˆ`Éc$#¤!Ò:¯‡^õf'fÒŸ¢æU ±ÃO‚l‚q`l×”u7ØjB Ý>sÐÅìåv+>æÛ]U|sêòei,-¤!UŸäó©,¶©LÇ>ßÿ·*œcð~Ož€Ö ÀÅÍ°bŒjî4·. V½?iä@üÁÁzf3¥K<5™Nñ²Ù¢†Ñàµ-À­ÖJ
+²,y‰-„‰“àPRy÷\áTG—9&X•²4©,ÛBh„œµõÔ„Qû-}I¡)ËÎ
+EÝ㟩„<mÿ,êX„Ó9Š~8ÿ'ð£:Ú‚ò/w/ Ë@ãqI:ãbdÿs
+´@¢à¯•¼ `cÝ4Ï×Äe{¾eþ\GݤLbо¥IÒ©ŸŠÙ‹¯÷©?@<þB{í¯7ò$0ŽÒàUÎÀwC\Þúѳ„Ÿ*2ØàìÿR¥'ùendstream
endobj
-1564 0 obj <<
+1975 0 obj <<
/Type /Page
-/Contents 1565 0 R
-/Resources 1563 0 R
+/Contents 1976 0 R
+/Resources 1974 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1566 0 obj <<
-/D [1564 0 R /XYZ 85.0394 794.5015 null]
+1977 0 obj <<
+/D [1975 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-506 0 obj <<
-/D [1564 0 R /XYZ 85.0394 769.5949 null]
+1978 0 obj <<
+/D [1975 0 R /XYZ 85.0394 613.3608 null]
>> endobj
-1567 0 obj <<
-/D [1564 0 R /XYZ 85.0394 749.4437 null]
+1979 0 obj <<
+/D [1975 0 R /XYZ 85.0394 601.4057 null]
>> endobj
-1568 0 obj <<
-/D [1564 0 R /XYZ 85.0394 660.1505 null]
+630 0 obj <<
+/D [1975 0 R /XYZ 85.0394 465.8716 null]
>> endobj
-1569 0 obj <<
-/D [1564 0 R /XYZ 85.0394 648.1953 null]
+1980 0 obj <<
+/D [1975 0 R /XYZ 85.0394 438.5672 null]
>> endobj
-510 0 obj <<
-/D [1564 0 R /XYZ 85.0394 449.4639 null]
+1981 0 obj <<
+/D [1975 0 R /XYZ 85.0394 397.0946 null]
>> endobj
-1570 0 obj <<
-/D [1564 0 R /XYZ 85.0394 424.0768 null]
+1982 0 obj <<
+/D [1975 0 R /XYZ 85.0394 385.1395 null]
>> endobj
-514 0 obj <<
-/D [1564 0 R /XYZ 85.0394 352.0618 null]
+634 0 obj <<
+/D [1975 0 R /XYZ 85.0394 216.4249 null]
>> endobj
-1571 0 obj <<
-/D [1564 0 R /XYZ 85.0394 323.4047 null]
+1983 0 obj <<
+/D [1975 0 R /XYZ 85.0394 186.4354 null]
>> endobj
-518 0 obj <<
-/D [1564 0 R /XYZ 85.0394 272.2519 null]
+1984 0 obj <<
+/D [1975 0 R /XYZ 85.0394 97.1422 null]
>> endobj
-1572 0 obj <<
-/D [1564 0 R /XYZ 85.0394 246.3845 null]
+1985 0 obj <<
+/D [1975 0 R /XYZ 85.0394 85.1871 null]
>> endobj
-1563 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F62 1062 0 R /F63 1065 0 R /F11 1397 0 R /F53 1029 0 R >>
-/XObject << /Im2 1051 0 R >>
+1974 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1575 0 obj <<
-/Length 2175
+1988 0 obj <<
+/Length 2116
/Filter /FlateDecode
>>
stream
-xÚµMsÛ¸îž_áCöLÍò[âÞ²‰Û—ÔéK½;;ÛíA±éF3¶åZr³ý÷ H[ªÕ®û:Ì„‚
-
-âüñߎ‰ƒ•‹d‰}½õó%
-Z´8_òò)AÕ’Fo×ÎBBäœÄ+|Bmê†ÎmïÄ»ˆä ?R½Ë‚LÏ»&oJ4ÌòárW­
-΄
-ý6´.u
-&ýÄ{Zg—Sg¶Ð»s•ê{ëlVu_¯%YÎå¹ÁÑaé¿óº¶*ê>‰¤cp!rí0ûò>
-"çIææó6*¸ëUPÃyCüÿ”ðÿâ àFå  sɯ³¯X7?I–«Ú.M¸šji‡óØÀ6žð µß•>.
-
-#QÖÕ>
-/Pãþ€R·Ã«Ž½TR¤£ý¯ü‡•C’«ç»òáINd1 ]a0­è…f ÿ¼¼¾¾g—÷oИ—‰_Ú€õ¼Yð/Ü6ÞZÇr"´
-ÐMHÖâ{ÉúÚ¬x‚˜ÿpËÈ€†é[ßNîÿ˜Ü?c“?/_¿¹œÇJÈŒÀg4\M/_ÇÉgŒ÷gضF©và)–ê'=|ÃTœÐ
+xÚµXÝsÛ6×_Á‡{ fJßnn:u9§N,÷µ¾i’Z¢mÎP¤"RqÜ¿þ_)ÓqziÇ3æ
+X,v±»¿]€DþH$$’šê(Õ LD´ÞNpts¯'Äó$)ésý´š|ÁÒH#-©ŒV·=Y
+a¥H´Ú¼‹%bh
+püûÕb6M¨ÀñÅü P„qAãóŸý²š-Ý„ô¬?ͯ܈vŸó«ÅÅüõ¯Ë³iÊãÕüjᆗ³‹Ùr¶8ŸM?¬~žÌVÊ}³fFß“wp´ë~ž`Ä´ÑüÀˆhM£í„ †g,Œ”“·“ÿt{³véØ1QFP*X”0ŽlßgzÊLYcÃÍÕZ~•Ž„"­×G‰b°3œü³²Ü: ²<V E].9E\rÙ¹œÒˆ¤… Æç’"–¥„ÁASn}¾0î°œ ɉa$ óØr\MIâü§ñçLœÒ4’RAl)n¶Ž>Fa®5sL=ÚÚz<;ðý|K£W5XõŒ
+‚“¾dk”¤½8†ð.Ø_¥(å0e4^ÝçÎ*Éz¬àD,H°êWËùë¹·~ ’CD,=_YTy3M˜ÆqQ¹o â-‘OŽ?gÛ]X²½Ÿº5SõÞýØíë)ñ§bSTwnh]W­[Þz¡õ—„ƒ–piL£¤s)¨WWå#ð¿§4u”AqìÇ7µûVuë‰|7MºNEXžív¹c„8CIÐÅL®ÛCV:úÐdw¹1òŸslû¸›;
+„–¡GDú6øæ<–’sžôs>ð é­
+8”¦“œti—P¥âË Žzïh/Jéø¢Þo­Gaô!kQTE[d¥‰ós“¿Ç˜VÖOvÖ-]^œ»¨ÂQYåyî(7‡›&ÿxÈ«6H»ÉóÊQùç6¯6ùÆÄ,ÄÈõ½Ñj$&]´€Ý ƒÓèL
+Hòr\ßÛ°cÔAPÌùFœ£€(³›¼tsfƒHf¸ÿÙ]ü ¦y¹1¶2Ö²8kvùÞ%
+ñ¦ÚB˜vå‡Ä…«'Ä×j;8Sã<gí¾YõèˆCõz¸ÂBÊÆ­8©DÈôk,À—‘èV†œ%>=‰ÍÝ}Ó:L ¦ @Á‰ÎìFÂW7‹`nÂ7î›ÙiÐØ뢫7$p6 ƒÜ1ÚHF¿ "\DEÊ"©Êû 0"HLú"G@B¤
+Ñ#kó˜8àÉÿSÜÜóææù¥_ΖÐY¸}±4v=dm^ÜŒo!•ïïFÂ…@¬
+ÎÕWQTg~›_°µÍ/øýp¬)fÖ]Y¼zEe!bD/;µa²ðÂw5,1Іe<¿»Z†°ê@óy7A—Ç™ölA|“\ñÄæµI§Ï\C;e{8Ò;ò€lE{?Z4Á‹ŒÒ? iÐœÂk¸ôBÏ^›jþP4ù ¿TÀû)ÿ³:ãÍÊßåXšBË…Õ0F(p<ci®<D×'˜é*оßÊñ|Ê÷žËžÈQŽrÒ8™0øèFï3¿ßn_ØëÙÉÒ¼‘¥©øŠ[0à ç!®êjÄšÇ&i
endobj
-1574 0 obj <<
+1987 0 obj <<
/Type /Page
-/Contents 1575 0 R
-/Resources 1573 0 R
+/Contents 1988 0 R
+/Resources 1986 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1576 0 obj <<
-/D [1574 0 R /XYZ 56.6929 794.5015 null]
+1989 0 obj <<
+/D [1987 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-522 0 obj <<
-/D [1574 0 R /XYZ 56.6929 769.5949 null]
+638 0 obj <<
+/D [1987 0 R /XYZ 56.6929 617.17 null]
>> endobj
-1577 0 obj <<
-/D [1574 0 R /XYZ 56.6929 751.488 null]
+1990 0 obj <<
+/D [1987 0 R /XYZ 56.6929 591.42 null]
>> endobj
-526 0 obj <<
-/D [1574 0 R /XYZ 56.6929 529.8403 null]
+642 0 obj <<
+/D [1987 0 R /XYZ 56.6929 518.3317 null]
>> endobj
-1578 0 obj <<
-/D [1574 0 R /XYZ 56.6929 507.5641 null]
+1991 0 obj <<
+/D [1987 0 R /XYZ 56.6929 489.3118 null]
>> endobj
-530 0 obj <<
-/D [1574 0 R /XYZ 56.6929 426.6253 null]
+646 0 obj <<
+/D [1987 0 R /XYZ 56.6929 437.3327 null]
>> endobj
-1579 0 obj <<
-/D [1574 0 R /XYZ 56.6929 399.4643 null]
+1992 0 obj <<
+/D [1987 0 R /XYZ 56.6929 411.1024 null]
>> endobj
-1580 0 obj <<
-/D [1574 0 R /XYZ 56.6929 191.6116 null]
+650 0 obj <<
+/D [1987 0 R /XYZ 56.6929 208.889 null]
>> endobj
-1581 0 obj <<
-/D [1574 0 R /XYZ 56.6929 179.6564 null]
+1993 0 obj <<
+/D [1987 0 R /XYZ 56.6929 179.8493 null]
>> endobj
-1573 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F62 1062 0 R /F63 1065 0 R >>
-/XObject << /Im2 1051 0 R >>
+1986 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R /F11 1442 0 R /F41 1208 0 R /F53 1303 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1584 0 obj <<
-/Length 3620
+1996 0 obj <<
+/Length 1853
/Filter /FlateDecode
>>
stream
-xÚåZKsÛȾëWðàªPUâd^À
-®p÷ÿºøø‰ÏR8ë/œ©8
-fOð™ˆc9Û]è@±@+å)ÅÅýÅßÛ {_íÐ)¦i©X(5[ˆX±È¼°,-ÁaYסaÊH=Zv!„fq`@!ç0{ÔIBŠž$„L)ÌL³PIeEQlkä ô•½¾§ p ì³ÜæõåB >O³z}ÈW™}óf›½z*³ÑÊd牛Q¯Ã¥ˆæY]mcÑg¢®+ûLÝBMEÏ•ë´¦^I“¥ ÷ ;ƒƒã&¥ÝâuyÂŽz^çåC‘¹#õ¦6îHo&D‘ëð'xZErðó>”@îí´[UEM/Oy³ÍKjãYŸ¯-t¢ ¤›{šç"Äã®OÝà$4iB‡§jï‹d¥– )%‹…–CŽ¬€!ÒDÄ}iÌ<o²CÒ
-^¢`~ªŽô¹Ì`Sö{ãæ…IöY7ø9sZIŠ$#C®gŽ51FƸG|¬’õçºHê- º?T°( =çˉÉAÕ#¡\8Òñ<clb22#d4šLŒ'Ó/(Ù`5ô[Ú€}MñEs®_TØ[vɉ¸Q훼*“¢pïÖ„à¹m®žP>–z"åA¯k-†Ê³«ÒüOÎev¨‰!OÛ|½Å&Øí6)2"“iClÔrS£öàûƪiµ£!m·VÁ/#«šÛeŠÔ-“§Í–šI™Nú*©Qm øøß`“—bÞí36=S‰CPÚ†¶‘×öÜÐÍ¿%â†3
-¯,›I–ÇJ„=Qd›†f\À$‹€…òÝ.KspX…[ø¿p<70M z4P|ŽUl©åKÑ1 Dð’F@„ÀK’zÊ 'TÃ9\hè朎ûà?^Yé}¼B}ú41s k‡wÁß`Š›ù;ë²€)Ù—d·/²«‰-…ªõgO¥¿õT ɯÔU:åb¦Ô 'H >®œÈeÞ] 3TæT¦Í•\Î%ǧêYRÉßy}<j— }±ý¯ó=Ä
-?O;ÂEÛcá$®CBŸÓlï’‚hÖ½wß¾f´‰Å”î“4µ^L°5^|ÁxOgÄ2sÅ(Œ_c„yLò"Y™ëmµ7ÕaWS³5`ÞíÑ®ðI7‰ Gx–§2 yÑ­¸r[X709ÉÇ€kç‘šä™%SÂxe«& X bÙ[]š±.ÍúÃ-¨r{6ürf¡(fZµóeÒiÝZ3Ê„ÁKusüs
-x
-u“Í2ÿJ0'°NŸy™æ>úBâq¨†'_ÃlôED¢ç}ÞÐÃ:Ê>ƒÈ±qvpg€;û9Ù&z
-p"ç¥OûìUµ½nHÇö.i°Y†>s‡/UióX Õ
-̈D«·Õ‘.TÌüÁbïÐapã½µ±'¤IÅFÈ_Òö¦!ë„óB²=R°¦ÕŸP#o=c{È¿­˜¦sÔS×mÊ0!ÙÒ\~''…
-†œtý
-šŒªZ Üè\Åa,8 y–= ï¸3µT»
+xÚµX[oã¶~÷¯Š
+õ}î}üÄ£X÷k3•g&úœ‰<—Ѳ§bF+ÕÌ,zw½í
+ÉòÜèn±<JrŤLó·±h¬@6;¡öQL­˜åû(J Árc$†1çÌ
+ˆž5È–RGèaÏ™3“jŒ‚3£$hî9nûI*â ü—ñ«x
+O• MBYƒMBA_ëMÞ¯ëG¢ÖsA½eØ;y,Û”Ôð;\3µªjŠÛÖÍ»ì 3×W<þ\äz~èòºD÷H›ÅóÍzI”O&$0™~ ²LˆåŠz»q}1spD;ØËzѹe©‚´h×ê·•?6PQ²oaßÖœ;Š±bßPDDZ
+ÔiÓ¡<¸g2íz“)ËtÞ”ÛÌÍ‹í¢NêzÑ!9͘Ժ)ªh
+ÛšÀ0]/—X'¯À™V Ð'ª
+ØȬ…ã
+(–+™‘y
+MæœÊ‰ #}LúJx隯\Æk¢oÐ{žú“Æà hbj{_¹ç­/füÞôE»éÚ³Š&¿”XjHmW3‡íq…uãåMn*¨9 þ;Š.ek)JÓX¬1¥z@±z¹À)´Õ™Jµ¥™
+[Í*Öi~è³}¨¼N¡n¼Ž-aÛ&Á'ö2ùð „Tp¶ìd¶NʤÁK Ñ„àé.µÓØû‹Îû¢òmßßX Ñ5ü«v«
+ÚÉÐwDb,„«áh×!pédø·WD“Ÿ‡R^'sª窩ŸVlU‡F²ŒËS‹£»Âš(6…áÅuaåLHc›B[U—F2gYfóv™½€1 rÖè\}
+n: Ôo¨ÿ¤ü_*Q<g
+Tymß
+Øa’ÌšTµ\Â)WùܪÆÖ ÓxJ%YÔŽæ *·)]Øä Fâ¬Ö[OL¼îˆî/K~ójñ•¨Y9G–¹Ï}øžûþÔWLúf y¶+K(œN~|tÕ~ÒX}pHÿWWÁË Ýݦ(L¥)]R|†3è3]¤¯D?¸êx}ÕâtåêŠ('¥W~ÂEš|Þ–DȱВŸžÖ›: nï‰x'u{óg·©Â]ª1äÀú™[¸‡/*»&WM7åý‘&'lhBçXL W…pÿ\\ŒÙ`ü9hð!$º³‡´½__]ã.…žÈÞ&$káX×5+Dûî‰$â'Fw4Þ Ç¿ÇgløÇàý‡›áiPð òŒ†óÑà}X<c¼»Ã¶-jÎŒâç‚îÍø A<â :œÐ].è°J¼a•ø_äQ÷ˆc@-×߉á“'‚ÊÓ@Édƺ À÷Ýi&Î7äuœ«áA1W»²—ôVÀ¡ò÷3K5ƒ°¼šñþ_ôÐMei<Z7xtøû ßW ¬ð¶| wU9 ¼>÷Ê<onFìðÈ)W^Œ Wì†#À)‹.wÞ‡SžžšžoÁÐ5v×”MPÈ î"å°Ë„*y¢¦?…ž‚Ï»Î
+iûù _üuýËíÝ$ Å=h²WÂÕì¬+­NÃÁ@âø§‘}w¬QdßÐ(¨ÉxÙ­ˆŒ¬rgŽèrK÷ÆFýFû7wÊã"e—»7ž,R©Nßx\äÑ.Bnƒ±‡L_;2ãô½]Ú´úBÀµÝXYxð[•ò*Wð·ܾñK%R.2xðKx«ò¬ë§J¾{Å|ó£û´e*ËdûWÅÖ½˜k¦<•à‚X¾isóÒFeÌdþ­¥û
endobj
-1583 0 obj <<
+1995 0 obj <<
/Type /Page
-/Contents 1584 0 R
-/Resources 1582 0 R
+/Contents 1996 0 R
+/Resources 1994 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
+/Parent 1973 0 R
>> endobj
-1585 0 obj <<
-/D [1583 0 R /XYZ 85.0394 794.5015 null]
+1997 0 obj <<
+/D [1995 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-534 0 obj <<
-/D [1583 0 R /XYZ 85.0394 408.8853 null]
+654 0 obj <<
+/D [1995 0 R /XYZ 85.0394 655.4043 null]
>> endobj
-1399 0 obj <<
-/D [1583 0 R /XYZ 85.0394 384.5457 null]
+1998 0 obj <<
+/D [1995 0 R /XYZ 85.0394 633.1281 null]
>> endobj
-538 0 obj <<
-/D [1583 0 R /XYZ 85.0394 174.3152 null]
+658 0 obj <<
+/D [1995 0 R /XYZ 85.0394 552.1893 null]
>> endobj
-1586 0 obj <<
-/D [1583 0 R /XYZ 85.0394 142.2096 null]
+1999 0 obj <<
+/D [1995 0 R /XYZ 85.0394 525.0283 null]
>> endobj
-1587 0 obj <<
-/D [1583 0 R /XYZ 85.0394 79.8825 null]
+2000 0 obj <<
+/D [1995 0 R /XYZ 85.0394 90.0274 null]
>> endobj
-1588 0 obj <<
-/D [1583 0 R /XYZ 85.0394 67.9273 null]
+2001 0 obj <<
+/D [1995 0 R /XYZ 85.0394 78.0723 null]
>> endobj
-1582 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F14 740 0 R /F41 939 0 R >>
+1994 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1591 0 obj <<
-/Length 2761
+2004 0 obj <<
+/Length 3601
/Filter /FlateDecode
>>
stream
-xÚÝZÍsÛ¶¿û¯ÐQžD,>H€|ï”8vëÌÔNm÷òÚ( ¶8‘HE¤ä8ýÛÅhQrÒèÉd‚‹°Øýí@ñƒ|¨He"è,ŽÆ“ÁdqÂÐ÷ë w<#Ï4
-¹ÞÞür!õ ‹2%Ôàî>˜+XšòÁÝô¯¡Šâèf`÷—Wï²Ó‘HØðöîTÇÃ7øßÝåíÝåÙíé(ËR1<ûí͇»óâRÁ@¢¸ág×W—¿þyã&¸¾"òÍùÅùÍùÕÙùé?wïOÎïÚ „›äL¢ôŸNþú‡ ¦°×÷',’Yš á…E<ËÄ`q'2Jb)=e~r{òG;aÐk‡ö)-ND¤D¬#G)¬ÿuËòH3Õ¿*Œ„Œ2ÎâýSÑ8S¹&Ϧ%:RœƒpZ&‘<kM*D`R£S­ä
-¬&½,'Õ¢(œÖͧµ©›ú¹Ò%ÓQ¢’x®ð}B·S¾ µä0>˜vľ›XgÃr½›¶ÓauO´b»'x{wuKÝ«Sžým×}µÂ¢18²$vr“Of¤ëg×ïΣ ²ö”ñ#ªÁ*I£- ÿÀŽƒJyLT‚nc.ù ¨
-,g=¨ücmV…9
-[ØÂPÆìÐ`ÙYîÖi{óu3«VEóÔ‡˜Ç™±• ¨€*:â:N€™PŒQÝñ­ç.
-*SʱÛ&|X{ÿl*ö Ü"‰’Øy2}³Z3)RÇ‘YBd†dT·@¨bXgëCØK'
-Ïê´ \E3#"¨¨XuÞ Ð°±ÝvÚC9#ÑYòLv3Í¥›»®ü5Âr‰«ñiÿÙŒîx²N1‹¢i|ÍF6'˜šû|=ozrµk
-’¹û
-Z.›º!|“höï€Ìô\έãŽ8; ©åzAŠÝÙl<´µñ®õàx ›šeÅ rþÛ6äÐÓgŒ9v+&û~Qô"«>ˆ×L×ï62YGuÁ
-•¢à³IÑU©56…¿¡ñq˜YÌÂcåökßühþÓ³·gQîÕ«WýÛx׮ز n2-u–fq¨N쟞>x1½ýàÅ4Å-gÜQLHµëtÏœ ˆrên¶hÔŸeñRéÓÜÍÜš|±„KÁ‡ “×ëí¡FänÊÚ€kLýKa/¾°ù>/×ùꉘùë¾sÏ ’A5¼€ê£z¤Ï=1_k3™YåSËú*<sb¡,ï¶ÜgǺÀP”˜¨@të°hÀx[¦óM "<@!òÅú~ì.æ cjêɪ[2®;®6&¢ÍïùLS‡.xtPû‹Ÿ¾^ÆÑ9}pç:›cÉ_Ö}¬wçi|¢À5J,¤ÿRTàÅã(ÖÖ¹îZƒ·çêÜäóµã»·†·:.›ZøÕÑ‘×xÑ„/deÿ¥’Oc¨›Æ`6ScS»šhù&/æùxîX|iæ†^x¶1a}ƒå)ç|ˆ×<¬ä”ö(öY¾1Dˉàw¨œÄC[W­¬¢ú:P)J=Jû¸{yÐ54å }ÅzoÚ#…v{ ¹.СH£ÊGhç{Hz ʶ£ @‚*¤Sˆ=ÅÄÞ
-ªÜxa:cÀ?ËÎœ)¹ET™Q¤ÿ>+CÍgˆSóÃ.Dºû[ýR`Þòì‹Ì˜FDv 9¬Íe>“=_àÌ#ç@K«I<[ÍA=>,"¥AàÚogPÉ®‹£uuL,yçC›pHE:ý iÜ·´ ˜ ½ Iòd!?G.bz$²ým…ôUu+×ë^¿´<¢œ¹oUbpo¾^”ÔcÃ}Å ù¸u?ˆÍ ƒ)Ñë§Å¸š3]gcËJùß#oÏ[î.:θ?œa'MR»•ZTcù ©ôsšÞ0ß1nF©fÑ–ÕÌÕÆt`Ê\ Üuÿvw÷(™ Ç²Ždêë™l¸*fN{–Ë"Ã*_Šq’¸“Û+y+)žÑO·|™» p¨:òt›1µ«–;Ÿ×Q|Ør :Su¶¦ù¶XÖºÖxÝØ%T0´p¼Ój²Æ*ÝÉ°¬ìAã‰:].…õõ²·äN"ü}aO…ËZþîŸ1n+v<€§û.°Û;'š!w$ç,R‰Ñÿó2Dendstream
+xÚÝËrÛÈñ®¯àÁUªDì¼€rÓ:’£-GNl¥*¯ ’(ƒ
+·ûí‚ù2Ž‚Ù ˜ÏãX̶*~ ¤t3ÅŇ‹´
+,ŠcÏ í¡ÎÒ+
+
+»!± jÒl™o“‚Æ}™o*÷5#”æ»$M}‡„¡U[rc2§¾ØÅD*î]£oyLò"Y™]m\-3Á(u[ÕÅ5-vtVÀ¦ ¤I5Z—žNp#„´H‹N]ù±C2Œ¨øH«ec"õÉ#5HpìĨš81ðO„„"ö6 ½Éetêú: û2i‚¤jtcBÇ…¯e«gÿšŠ5ÀÐnNPÃðևݎx½¶¦LÚ¿—ùÂpñ …¸
+ås,¡àû’qWŽ?Bþ[ S+­-¦¹§¼°&da?6]êBŒ!†ùŠÆyCã'ú …††ö=BlC;#4"ó©ì§gYL.ìRfršÍÀÁÜÐÁ§4_à[b3»Ä‚Êv l6ž˜ƒI·1ëØW8ô= òrYÒ¬Ñß@¤®=ŠbÃÉÏRÞ²Úî’&_äEÞ˜ W¹{ÂÇ,Ù¹IFa‰Áp=3p­ý(nù«©xŠKÓÿN¦ð„º! Õæ®ë2ÿJ‘u@$„6/ÓÜ|ù°8TÃû,á&àC9µô0²¥È+GºÑÈž.Vô‹
+ÐHŸcîg FS|³Vña’mDϘ$[}0|›Í›j^ävÆ„-ŠuKÖY‰ù‰1êYeÂÆ£d;¹³u $í‘©;’|Âså(,k™ãí&Ûç³O6µš(ˆœD<<¼ìKÊ¥]µ¿Œ¼C‘Õþ·ì%dÊS](0€±‹¡mú5Öˆ~íTfšÀ1¥¤ã&{W#OÎ6K‡ò
+ŸŠ"N$Ï:c0)é}úYe¹ÿ «È×±>_”Sj¬¢³,:'êp2#í~3gd¼ÿ­/ã0?!ã\»Â2,·µSX¹Mšå†&H»¼¯Xiž°Ö-Ì8:Ó6¶µó=Å9+·üÿNn{ñ³äÖÑþå ÝŽ“r+C?Rã•[Å|a5ö¸ûö£…)Õ"± jÊ]`Ï«‡ÈÝmL.þ3É‚E:<O.ašTd‘õ<d3½‰L¤Vñ®2i$¬«îqÐì쇪u"þ¡fÏŸEÍîî¿{}û±7; ¯ Í—(²|F¼ÿXøìÑPh`AŠ>—J$Ä01ñ¶
+v`ZÃ<]©ëÂCݦ(onîoÞ›ºÇÃÍTMBBî--Jsk
+KzæÑÆ„ÝÓlö¥ÉJŒgí÷2u!‚5¬AÛ^µ…5 )•X쮯ôDh#õÂö± “46'Š øÒ;Î…ÀªÙៈš´rq}‹H )uåpéW+»£`¦½Çë·×> ’‡^<Óúã0)ÔP»o}9çŒ1ï:Móþ!·¹»Ø­¹Ø”šá“/ಗóZ̃”d.çÔ|þ¨¼ãèhŠ?Ž…8ÛÍDŸz3iSšÞ‰6}´‡P©ˆ~Øî†ëˆŸØ#~N† ¦ÐÉIE> »„)zþ@„«„3æ3Õ>£ì“§)GÌQZº’ @µ™Íˆzy>=N@²Ô•û¹SbÑLzììpµ¨ÞÀ'Ô,ò2Ùûëmø ®G¾}N³ÅRÀ¬À{‰ø“ d0he+Mš¤5¹/›C[ÃÄï­jµ!=~X]ðŽ£m²ÿ ”°sù–pªŸ§E•¤ÝlîJl¨§T7+”P³ÛCÆ„1&öûǬ}†aí"k ×è›P'î=K …CKˆœ¸>/ÌdŽ¤Ã
+åx!‹«ƒ“—±É¸òVÄr`x3]ê¿jß°j”α
+ÖÅÅ¿ã"'f&ÂYyX»sá­‰3B¤± 
+ú&Ú7JƒV¯¡ïæ 0N˜G¶Pžz cüO“n.kÐ*âмSØq,$|Á"·‡<‰­PÃOø‡’‰g!L Úö ÐXŵ{ÕEÃjïEv:mŽcB‰h”šT`Ì Œñg«ÆåmöIY¯zy‚iŸè0T¨,Ž­Rƒ®º%‡Ø›Øw*nË“èå Sî4¦:å…¾QÞn‘3ØoÕúøt_SD•tû¶ÚŪªD)㒤̳¯íÀfŠx„9ëtå#ÈN¶'…¥ŠºNa->ÄqÊ{'üsEøÊÙ«‰÷”4ˆþfh È2«k¢ ‡„ ¹zS¨Â©½µ©-‡¶Æ¬µÖæ†Ô#®/¹õÒN¸/„œ£—©¦•—Ž"ma§*Û-›mLggݲ)Å„ðY1ñ”ä2RÒJô:ÉKß=F~H=ôP×E7_cáVòÎ%~Kþ­ÀlŸG
+1— àŸgB‡R³ðêœQÅîÿ13TÆendstream
endobj
-1590 0 obj <<
+2003 0 obj <<
/Type /Page
-/Contents 1591 0 R
-/Resources 1589 0 R
+/Contents 2004 0 R
+/Resources 2002 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1552 0 R
-/Annots [ 1593 0 R ]
+/Parent 1973 0 R
>> endobj
-1593 0 obj <<
+2005 0 obj <<
+/D [2003 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+662 0 obj <<
+/D [2003 0 R /XYZ 56.6929 306.3415 null]
+>> endobj
+1788 0 obj <<
+/D [2003 0 R /XYZ 56.6929 275.1221 null]
+>> endobj
+2002 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2008 0 obj <<
+/Length 2796
+/Filter /FlateDecode
+>>
+stream
+xÚÝZÝsÛ6÷_¡{“§ƒ ïžòa÷œ™Ú­íÎÜ\ÛJ‚-N(R);Î_»X€%ZNÍ\&“q-‹Åâ·‹Å1øÇGi1™Å#ÅQÂx2š-OØèê~<áŽgâ™&!×ÛÛ“×çR²(SBnïYiÄÒ”nç¿ßýûÍÏ·gק‘°±ŠN'‰bã·—ÑçÝÕåùÅ¿^¿9Õñøöâê’È×gçg×g—ïÎN'Y–
+h\Û›[läZÞÜ^¼»9ýãöÃÉÙm7€pœIÔþÏ“ßþ`£9Œõà ‹d–&£GøÁ"žeb´<‰%±”žRžÜœüÒ jmÓ!£%2’Tè« >âq$c%zfK2š$Öl0ÒÓ g¬?Ò6o‹¦-f ŽäˆÀúl4i¤t&­
+`Lo©&çyQæÓr‘~Õ¬ÜÌ=oYsÍêMu
+’®@hyK¥GcG>Ü[QÑ×YR"Ý°àZ niòª¨îï6%Mµ–ô<å}Ij0ÈÚs‡S§2V5ôÕUóE8 0ÐaÔ飣L`Q2)ðô¬3ÔU×AÞšûz]|öÒµ×Æ »«Ë²~„q:Ùf†ršhÀa³$)-£T}™»òH3Õ÷Ö¿ÕÈ«€î$£ì`¸ v D¹¢oÑ5qÙ¨Ü5Îô6„œ‰Hʘ”J¢8㱇‹jV/;ƒ]›?7¦i›]{I =pžÂ¾NçNä ZËXD"MûZzt6®6Ë©©N)Îhë…~Hðëýå U2ÝølÆW1ùlAæ¸úùÝÕû³=ô$RGB%êˆÖ@¨H¦Õh²øÿGLÆGĤH"³ôLÆ<â)Òö0ùËƬ s
+37$S nê²9̧£¡^~r‰¤_çW> y(Ìãi&ÆÏ{Áñ&à ÈGLXHÙKN¤,R,£\í2_ºüêƬülô7 Ãþ°íêX‘ù öÞzÚz‚eÓoʽñW>‡ b¤¥
+Ó…>HiÛé¶(¸§€&y,|Ç€ŒY{Sñ"ãg™µþëÊ!Ò SåÕÌ|9,ƒ†Ëƒƒè€¢LÕ¦òø»§-Ýœ`©ôø³92Øý¶™ EÐÀ5DO»™r»¨fã“ÛÜQ>w¶l×yÕÜà|4Ó}Çi‹a§’¼„g – Š&×~Müb}-Ó8¨wáPﱊÇ*ñ±+*»„ ±K6v‹?€^@,àò/5·'R J)ˆàS
+üµŸRL|0.L†÷ßÍ,Žfðoø©ŒTªþʈ|‹g€ Åœ%‡VŒ´ð§·iºèóþ­;ƒ¸n̈°“¯S{‹üÊ{ä÷§;K¶9v¦(Çš‚¥­¨2±É3~)yÆ*<iŠÞ?WÙÔZ3f¤© Ïëî„ «Ð9n 3kÐÜÏó6Ÿæ l!a¾ØøU•îè æÓ¬Ìý¹–ùú#•~g ûüÇ©iÑ zíý+õ'²PÈéc÷°ðűã1cšŽ‹–Hx0Ù¸Z:T„Ò*_CP\Û6en7ÌÚRº“¤X»S±h¨êcU?VŽ¿&ÒÔÐokçÁá/ ¾]Xq‚#ñ›— J¼ë@Њj›_þçúúæì‹h¹cotŽçßo^)3qÆ_8 aFT,é\ñ¦ž}4î`ûâõÕ/ÇaWÇÊ(«ß¥žúárœ…eœén9†ŠÊ´µuo S@)sôÞ¡ãÐð…)áñÆþm@Q€k¥Æ3:✫ðömïN2¥¶š“§Q’ûþ|ùK8™ÀÖ4ÖtPó
+l?f›5ý¬Úò IÐÃcMux-K¥ðæVº[Zdµ·´2¸¥ÝV:HÊÞ2&ù±_U®¦h¼|×µo²*s¢á}ë'× ]0źùf¹²–R©»Av©~gL”®Ü¬Ì¬@qgãé“kEÙ×ô9ìû5WûÛLœÐ}œ&Y¤dæ[Ìê
+9ï7ëî¾Òž–°¯¢+1ÐÄ_Ûƒu対–ukÊ'b";SêBW‘„`Þóã‡"²8Ñw ÏyU™’*­Ó»4nÐ1,lxô±g'fÈY!jj-TÐÆ,mf†ýØÑ¡Z½¹H XA3‡ŠîYj»éLòcž{×!´ˆ2hƒ¡êÖ÷#*\=c ùŸ_
+:.»tÓUµÆ"`eÚÕ†Çq$b•õÔÙ[:®´Ø—fã¡Mó÷gopL'˜ D|û†$‚%Ô½#énôov"èy1pLùb
+{hˆÅyµÉ×OÄÌ_ EJžiæ^Çœ.b¼fA㻧+î¥KN,´ˆÃo›íì>‘‰Ý#SPÝú+N`¼ÍRyý7!±;Ô„Š¹ifëbjüØiý`"ÜÙÞåE»&ôÀ£ƒŠØ_¼IqøzGgôHë@o®è=p€*k^ø¢Â j,¤Ý
+ÎË]ÓsÏ6%¬?`v
+ùû®y˜È)íQ
+ì‹üÁ-'‚¡rs ]Z´ªn‰êÓ@¥håQÚ/»N³Äh z.×BïM{m¤Ð.ða!×!i”øí|IAÖrtH¤îXæn±§˜Ù³UA)’[¯L¯ øgÕ“™’ÛXD ŒUú×Nj>Aœ*É…†V^HèñäÀBNöW¿¶Ü.ܘ‡§Ï­˜’Å‘”÷JÙ0ÈôþÆؽËÜ×ý U\endstream
+endobj
+2007 0 obj <<
+/Type /Page
+/Contents 2008 0 R
+/Resources 2006 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 1973 0 R
+/Annots [ 2013 0 R ]
+>> endobj
+2013 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [55.6967 389.5558 116.8967 400.9478]
+/Rect [84.0431 269.7901 145.2431 281.1822]
/Subtype /Link
/A << /S /GoTo /D (statschannels) >>
>> endobj
-1592 0 obj <<
-/D [1590 0 R /XYZ 56.6929 794.5015 null]
+2009 0 obj <<
+/D [2007 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-542 0 obj <<
-/D [1590 0 R /XYZ 56.6929 374.4628 null]
+666 0 obj <<
+/D [2007 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1283 0 obj <<
-/D [1590 0 R /XYZ 56.6929 350.9179 null]
+2010 0 obj <<
+/D [2007 0 R /XYZ 85.0394 748.5408 null]
>> endobj
-546 0 obj <<
-/D [1590 0 R /XYZ 56.6929 144.4344 null]
+2011 0 obj <<
+/D [2007 0 R /XYZ 85.0394 686.2137 null]
>> endobj
-1594 0 obj <<
-/D [1590 0 R /XYZ 56.6929 119.2896 null]
+2012 0 obj <<
+/D [2007 0 R /XYZ 85.0394 674.2585 null]
>> endobj
-1589 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R >>
+670 0 obj <<
+/D [2007 0 R /XYZ 85.0394 255.5751 null]
+>> endobj
+1658 0 obj <<
+/D [2007 0 R /XYZ 85.0394 232.5802 null]
+>> endobj
+2006 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1597 0 obj <<
-/Length 2948
+2016 0 obj <<
+/Length 2917
/Filter /FlateDecode
>>
stream
-xÚÍ[[sâ8~ϯàÑT ZÝeí[º“ôfj&é&ôl×Î̃N·§Àf°I:ÿ~.6L ÓEñ`Y–ŽŽ>«$HÃôb0Ó¼§4GÑÏÎpï+|ûpF|›AÝh¶z7:û×S=´¤²7zhÅÇ1é&¿Gïÿsþqt9ì¨À‘Dý8zw}sáj´{¼¿½¹ºþðyxÞW<]ßÞ¸êáåÕåðòæýe uL¡?(ø¾w#ÓÉ÷¼]¿¿ëÿ9úùìrÔL œ$ÁÌpÿ÷ÙïâÞæúóFLÇ¢÷/­iovÆC‚3V×LÏîÎ>5ƒ¯¶kh‚ÅHÄTµ FijB#É(³¨ÍŠIöÆtœTY‘÷L°è¡X¸Â}ZU©//ú$ŽÒd’ÜgÓ¬zþ I¢£óÉ$3“©k™UZºâ,yv…dZ5M÷œ[‚Åc6I'®&óÃWß2ß}\L—³Ü Cqôßo©oØaîB‚º‰d“ÉhSª|?WN¿geUº2Ìç)Mí ä¥o_=aÇò'xc4Ê*Wû5{L˦SÝrá)çE>Éò¯uõ2·™—<™ùÖѨînå²e±“´²‚å(«llYŠìÁ=“ù|š“ûiŠLwXa¬0c â5Â1A¤? ãèÆqcä8]<ZM¹É뇛@¹)Ùƒ¦õdÌ–t?Áæ qI×åúUj¬vŽïúa å‹uuR7ŸT
-³DœÉ^8öÛ&cPÃH‚Ø"ý¢áÙ"Y÷ØWÐLÆ+‹BÚð‘)|†éßË´¬yÀãÑð“—ÔБXƒ¥c„mŸë®9÷fÆR(-_3NA '`
-tL¢°0ÿ½±0휉14¬–®œ»XÉŽS `ñìÖ-í^¬
-!:"hSj€½ÿhRmGþ‘yí\Ûg3 8HŽNOÖ.0HÔ1îŒObˆL .çËêÛ§Åó0ý ‘˜‹høyˆÎô*™IÓ•
-ñÒvÇâb÷d˜D`À¥oøla°Ç:? s¬{ìBA(h—-dPÇu£©ß‹2­QMª6Uj2Afå{WÍš ª¼ó5÷Yü-ÈþÔ&*N®ˆÞ–+[i$É>[% GL4î5ß9MXa®Ù”$CÙHˆy®K’©1^ j`ÙƘÁR¯…¯µ`ß&ÿ WÀq-»¼æК5^áîrhÌÆoWfcþüú€"Æà®’lz4ß`ò0ˆ¹]wýË @“8U÷KãÒÒ±'G5E„Ƹºþ
-jh
-ð½\,Ž†¯§½ÖåSu®Tr$éØRéDD1ÚØÊ/·¿ž_߀ °¸Âû!~–°M?K¼Ÿ…/5mä^½O%¬%µ ÖöíH—Z,¡D Dz1„“b–dy ãà⸹Éó£|j¸§êS)!s†Ô QIãUfbì X³q;¼zš|:PT|žkE Y–N^˜K‰M¡ô×.meážótñP,f¡¬ÕŒ´ˆ‹=¦Íy2´œXb;bPmîñæ_gG­+]$ˆ7"AU§ô¦Ý¶Ô:Ê-éö>R»ç±)¶ŒùÛ@$ŽåŸ…FJt ¢îÑ.¶DÆHkÜ
-RjPÛ¸XÚëÀæ0†Q&¢!T"¶Têf{Šn÷
-µ¨šrRUéliS¸çJX}Ÿûeå
-“¬´Iï¸ðA˜Û’ îi¯hÛ+ÔæÍìõIôìÞ\ôiJ–9S(íEfSºþè M&^vËŸÚÖÜʲwºy³/Eut}aë°½§í?WÏóÔ}MŒ&™¯ãiR–¾nZß‚vßîSwó›Õ[´Ï³÷!¥nö T›Ê)‡¯}¶+˜|)¥ò 9iÖ¿Eˤ¹@¦6µÌÐíqa°sÆ×¹=ªî…rý6EYép-ùA^ÈõØ[(H<xܱ‰‘¤¤ /Å|¾Ï1UpÊÏTpÊo^Ü?-i|‡ª-·Â+eЩ5õ1}’V‘~7Òæ†c4Ê—³{K„»p¦n¥oæmír‡k¸â¾;¡à%rs@§Ž‚ÊZ„^L¥Õ#Sðz´V÷ägäÞÊå}iŽ’ójúܦÆNÉ-ì K„N™ T?-|¦PÏÜ”ÍÌÍ3 `*V3m™×déwŸÝ]ím{#Pº=-ƒç|
-š‹»W»Õt§£y“¬VÌi.sŸ :Õ²©\w[cÒ Ù²)CPLIíŠgÉ÷Á¾£H
-Ý’ûbYm Æ8dô”õ ‰5¶± û¶øÚs…að§¦ù h¿­¸[T_D;ä‡C>Ï°ŽC~¶þuÕ4ÚæbÍ
-oÒ2\ w†Å÷l Ùò¦ÒÊž‡{{-Ü ã†äî4MÜÜY?.a,ëÛ,5¿²IÍö6$Bµ­ îu&óûþïnõOD®‹Ãºµ­(,AÓ´2ñ¢¡eÿÂ%¶áðÐó­Öÿ؆QÃendstream
+xÚÍ[ÝsÛ6÷_¡Gj&Âá“ îÍíÔÖId¥×¹¦´HÇìH¤JRv}ý-° EÉ’iÙjFã\‹Å‹ý
+£„‹oA³m¨)CBÁ…Cí+çÚCUÇuVÕÙ´Â÷³å|¥U¯TQ£àn¤fpÝ0FŒRÜöC#¡cT·ó†#FéÓ>Þ˼NËʳái —ÄH&—É]: ÁƒÛb6dÁ¬xÈòoH©ã›YZa¹ZÂÇù<.³ÿùúU§K!X0mºÄ¶wqtœ{K3HX”CÅ}–¤•Õ¥‚‹¢Ä*i<½ÃZXéÉÅ-ëFXíž‚„êŠu fém=/*+³âÍ–ó¿d>}UÄ77®¿ô>‹ëFš ½zœß
+'ñM6ËêG»Øü™à4I2Û8žaͼ¨Ýòƒâ<~Ä"<ñÙYN R2ß=ŽÎ–Pùm7œÿ¹K}…xÛ\ͳ$q¨qÝ.[Nÿl+,ÃxÒÔ}-þ•¯_?݆•EVkV#µQlÔÔ,‘jQ䉳=HFµp/¸ôlÉ©í¨iî¬Ë–QDhW*ñ Ù->ãÅb–M­!­©]³‘B€¥íx@ÖÚÚ+”ÆZö´¼w2ªç-pד…Œh!ÂÒ`Ê#¾È•IA$ø¡5OöªF´vöí(°òŦÅ:«Q3"ðôü¥”«ØÂt0 #ðÜFƒ· IÄØko_Ci¸›J?m ]pɃ34,nYm†Tm´V]¿m46
+^Ról¬ñ„eÓb'@ÂÛF´
+mzU†p.UǼI;³ü>žeÉjŸd¥®EùöôUö-ë%ÎÀ3ØwFuÄØï0â=±ˆ”šðЈÖ.¼ÿd7àtŒ‡Jöµw\›ÍØ`/eîˆzÄæA@‰ëžhA
+E“-œ.ë»Ïåã8ý2“Hª`üåámU”™MïÓ•çÞk í>]i¯ Ò²t ø?Óiý,ð!±&3C´æ}!B51Å´]*Æö—„ÕãÓ×ãÙ‘ôˆñ„€6bº/b
+Œ~»-š¡‚müå·‹q?œÿ-rd]ÆyuÛì{ì²½àvÄ>^pD¶Q؃­0†H ¡¼ÅéË"‰ë•5äàJ?¼gy<Ϧ>ðu<Þ†¯—üÈC
+¬¡aOH!"M¤MHaw
+íŽ#Ø\ŸæÕKŒ6òVi^?]G¨#†NÛ
+¬'"ZjQ˜¸´¬\æÓØæUýáÀÐX•‹‚¦EG÷Á´#íc
+±«1¡êÁ4DE‚µ˜Ú¼”î­„Ïn"ô ‰r¹§‡•P{Îø<šŠ‘G+}a¶°ËUvÐaG¸#†P„„ö; aH¨;¾4‹ÝáÓ4¶ËŽ”‡Â2™ˆÓ}ìEÓb–<Š 9R}‹›k¢™FgaçõÒ¬ö£ù¹ 0!hìãræ,¦¤þ€¾Äø¨ííræÉyõÐ Û½Ý îíBËy£‹{rªŠ‡µbµ¡+ÚÃSŽ
+N¨E»\ÿ.Ë*­÷YŸ\o®O dþ2Íʯªµ±¼¶w_üš$®c²M[Pµ˜yªZŽh•É=·*€ë¥ÏwS"µb›Êd9[%±Ïue²{9Hx%lÄ@!#³½N¼ZÛ:óø6Õø'3’Ù㘥Êhë®ÏÇÖvüza7íO/0"
+>â"Îfs¶`Ø‹¼—?;ˆãõÃ,¢$ìÛIb‘£¨Z_pñqü ¬D‹H¨àó²<Àž÷3¸®$>^ËTH éÙfbšA©jíåog9½¼Úö
+Y„è3v
+|®´Õ·¹YÖXH²jëüiác1ÜŽ
+ÝìÓÝêv·®í›ÝH²àß0µ%'œ-Tîî³-]~òŒ’Ä+ïöŸcØû[î¸l·©¸ .Ï Uá?׋¿Æv)Ù¯ÓY\Už6k.Î?â·›/‹‹Fe‹í#w?‹°WßM»%¥·­9øºçöU†+ Cí'2içË2ƒ©Ã'©—å Ë£a{gÎþ
endobj
-1596 0 obj <<
+2015 0 obj <<
/Type /Page
-/Contents 1597 0 R
-/Resources 1595 0 R
+/Contents 2016 0 R
+/Resources 2014 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
-/Annots [ 1602 0 R ]
+/Parent 2022 0 R
>> endobj
-1602 0 obj <<
-/Type /Annot
-/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [333.4761 85.0848 413.3061 97.1444]
-/Subtype /Link
-/A << /S /GoTo /D (clients-per-query) >>
+2017 0 obj <<
+/D [2015 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1598 0 obj <<
-/D [1596 0 R /XYZ 85.0394 794.5015 null]
+674 0 obj <<
+/D [2015 0 R /XYZ 56.6929 741.8766 null]
>> endobj
-550 0 obj <<
-/D [1596 0 R /XYZ 85.0394 717.7272 null]
+2018 0 obj <<
+/D [2015 0 R /XYZ 56.6929 717.2979 null]
>> endobj
-1599 0 obj <<
-/D [1596 0 R /XYZ 85.0394 695.4159 null]
+678 0 obj <<
+/D [2015 0 R /XYZ 56.6929 609.8545 null]
>> endobj
-1600 0 obj <<
-/D [1596 0 R /XYZ 85.0394 695.4159 null]
+2019 0 obj <<
+/D [2015 0 R /XYZ 56.6929 587.5432 null]
>> endobj
-1601 0 obj <<
-/D [1596 0 R /XYZ 85.0394 683.4608 null]
+2020 0 obj <<
+/D [2015 0 R /XYZ 56.6929 587.5432 null]
>> endobj
-1595 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R >>
+2021 0 obj <<
+/D [2015 0 R /XYZ 56.6929 575.5881 null]
+>> endobj
+2014 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1607 0 obj <<
-/Length 2370
+2025 0 obj <<
+/Length 2524
/Filter /FlateDecode
>>
stream
-xÚÍ›[s⸀ßó+x4U‹Žî—ó–I`[;ÉØSS{yð€™xàÄ6IeýiY6VÀ8ÉÖºRŒ­–ZŸZênY†?ÒICMOŽ&¢7_ŸáÞwxöã)Ë ªB¿Ô§ÙÙ¿FLõ 2’ÊÞléÕ¥Öšôf‹ß‰8êC 8ø4¾º4ý8˜ÎúŠçößl</¦ý1šÿ9ÿ2N\)é º;¥øÅõÕhüã/“²‚ë+w{2 'ë‹aÿÙOgÃÙ®~' fVûû³ßþÀ½ôõ§3Œ˜Ñ¢÷_0"ÆÐÞúŒ †g¬º³:›žÝì*ôž¢û q®Jáôp³® Í–—F É {Ñê@¤ƒ¥¢ˆ S%Þ8H ½4ª§„A’QVŒÃMú4
-ãÕ6, žÑt5š±e¯óÛ(í˜Áý6JŸì¥ –…xŸè Ê`d¤Áì6Î\¹y’–î’Í"syâBue£¾š”`¤$7e£ËƒÚ v%„ #-æÉv“[=a ‚di?ipç´xˆ“mæž<Di'›Ì=wåXiSöŽ¾h¡ƒ«$þ ÝRV_èèšío‘)=WU‹ÉC¼ˆîÉ:Œ7«'÷t™”Å¿…óÿ=†EÙ…{4OÖwa‹Wƒç¹‰ç¶
-ƒÇ8¿uW–cqñ¼—ŒÔ½´SSèLºW«²†Ð}¬'æ¾ýŽ1ÝDƒ}ýüžBlo¨RU§3÷-ÛÎoÝU˜íSB(’T†t¾ÍoÁð&ÑŸ{†¬“b­Ê¢áf±¯>°`ªDYfÍÖ6 †À„RòyWòÛ0·«ƒ“íÊvI
-3èi+çœ-ÖJO·Û$Æ…è†h[B§()½~i“o5ÈìDôë.>¡5’pyŸ0QaŒ‡ïS¸ø’Fitÿ†n½ü3šïœûb[ùöÄ}–Ñtå¥â,Þ- uÊsxüþ}Ô(Ôyec¢
-2\Òçyꛄ*5(,ŠÃ ¨A
-k駷¯Ò\ªÀEkèý@Hx¥<RT9¸ \ºÞí Dû‚1~Ý]Ÿ!ýÈ£M¸™—7¦9$Jıå ^T9É‹1KBþÁàd°<‰ ƒ CaÅÚ!Ü/U)‚?p"í:5àÂ[Aê™ÄÌ³Ü ÈB>CnI¹™4}ZK Åì™—Q6Oã»Å—ä¸Pˆc¥ë6Þ§·%Ä0¸Çsj
- %Ì!cÛ¡Ðü uÖ ~¼|ºÞæ|Ï‚b`6 ^e£ã/P¨05ÈÊb›*WëImrt˜ž§ÖÇÒûXCRŒrÒ
-¦¯5÷ÊÖe{‚žrFˆ!žäR6 „jc´<¡áÞy[«âXª`2ic„{^›Ý ªzªvwR#1¤á%T…„*fî€Êv@å;úªv×B‰†˜“Ɇ—–D+$)užùêëåõçóñx ÆE0ïÍ@k¡=Ý:LPQ„5! !¶‘R•žx8±'zÿ;ê œîÛÍvLN{n¥A¤íÙb+Ý©§l‡g¹„‚´aÕ$’!eKY&£ëÉç!Ll»W &9¦i3ÈP ~µf¶Há ç ü”Š×'¡š=ÅË!Áä$‚åjË/r碓´Ý"é©Úa LÚ#/MÉ Ò˜:7>¼¼šâÓæ³-ú;Ã?RBO¯ŽfdG8zvx^SŽ¨ÄMÞ›*¤¹rÞûsœ­ÃÜž æF€ï¾ÜÞà¾k©÷¹pOß['¡6‹&NÒ†8>ë˜ãév3íq¡Fž³¾±ÌtPI¼“«§q‡¹b¸É±c† “αÿ®£þ@a»€×dDq\+ZEßÃÜý„£KOËî²Ôd¹9ŽÒ@%fµçv,PNaÒŸGÞÔ‹¦C—×Éä]”.“t} d¡bǧº’ˆƒðqŒ#L¥—ŸKÒü4~;`¡•9x’ð~›äauúu“;Ï¿:ÌÖÓû½pm'9µïb†lnßOÒp¯Ñuú¸ú'v'Mkï–Or·Ñi·“˜;\¬å+ö%-“»Ržêÿf3Šâendstream
+xÚÍ›[Sã8€ßùy4Uc­î—}£˜ejº³Õ5—‡˜Æ³‰Žhö×ï9–+äâÒU)"˺}::G:2¬Gáõ¬"T8Ù3NE™ê ''´÷Þý|Âê2qS(K}¸;ùÇ¥0=Gœæºw÷´e µ–õîFDÿuöéî¢sE#MNc¥iôáêúÜç8ÿóñæúòêçßúg§FFwW7×>»qyÑ¿¸þxq;g9Ô—A uÝÛ;¬T×¼½»úx{ú×Ý/'w‹„ƒdT ôßNþø‹öF0Ö_N(ΪÞ3<PÂœã½É‰T‚()D“3>¹=ù¼h0x[U]MJ ¬¸éÅŒsÂ$ßÜ­ï‚B·uÒ)¢%¯z®½XN„rí,pÌ‚HJ³žQŽhÁE5 Ÿg/ç³|:MFÈjð ³$>´*ÛO†óY‘>%§±04ú6OfiRø‡‡|† =?¦ÃGŸW>Ö%‹dö”Ì|z”ߘ ÓªÎ ÃΡ—˜1â”âUwÉ÷aRÔÝ eóÉ}Õˆ`Qþàó’ïiQ¦ÙWÿäÛle„‚­ŒðÞË lM‡Å`Õ×Q©Ÿ éTT¾LëÌA6ò‰áxP¯òžëù§b~_$ÐwVŽ_–{òº?ª
+WØAmw)¶ „šß
+&š‘cGŽ¿A ˜ÑŽt͸Fó„ˆÊýø« /ó È3ÿ"ù>Ò ÛÄ×ÏiùØÖðújÓ‚-jõŽSpO=Š%zY£UqSmIH$¹ÚgÄr¦ë&ƒïñ®½0*‰ãÕêÁªù´Ló ÈJg¢?©¢E’àƒõ00w”ÃY:+„0)š…«*œ8lˆ@µÁ}>/_Û!$‘––¶†8Ê*‹â_ξö|¢˜‚Eù8¬°ºtWÛÝ
+<I2° ÔÙ%‘VmRSj !ÕÕÖP@@T²Vc4Ìg^½ŠižêÌJk諳]AR¾RÑF%áB5s<ÌçY‰ ?.üz!žÒ|^ø0>…×…°\àyÈk†J°ÓBõBû>‹ ƒ$TC“qSàPN@P\fùv' a :G]ã.éx>KºÀ LšQ­"¯oÔÑCUÝO7X4­t­ XnE°j¾\¯ œQb´tu§¥‹%—Tf¡
+à‹«)–`ö—Uß´ª€ï}9Q«æ€*ÀÇF×y™ü†ePÞ´XgÒ=¢C«Fnšó§tÔ¸º ˜×ñ‹»ð™÷ƒáŸUÙ‘5Ì'ÓA™Þ§ãxEOKl‚ÉÚBcÊ;[H,R°v”¸C¢3› Æ㺅ÿ™äÿ§?)åY²¶ë¯³ÆAÓ ºðOÅ=?¦Å:o¶T¯Q¤³yùŠ×Oþ^3­°EáÔšºèzßÀ`Ãj7'[‹™c°œŒ~eÌ%.y=çóqåó€Ç¸È}æ@òyiVÖy¥7oJ…Æ*5ððM8é?a–n°²áÀ5@›V1Õj]H…É,/}â>ñ¿Õ~'sAu”ž²¨ª[­´²ÎÌ|±él0\;e:L6ۻЖÊÞ5½ïÞdScƒ½Ó €ØnàXœ®ÆüåaÖO¾çY²Ëž¬\Qúþ‡•ªT9dŃ×}xÄ;NJÜÏm„Ù
+ú¾ÿ@–ŠK퀩ÀK;)+@¿MGƒ2L—Ï;!|iÌkj…·†±1ƒ[AR-II‰…£@I û:áøÉbúF”è^‹dO–œ‡eÉÇ’[bé8Ö*Á‰´’p€#îkºYž¿À‰/zró
+æpÚ4Lt¹e\¥l‰ß>*¸7¿P°#Ö?nà@£l—Cæ–ã}­wÈWoп«½ù‚3?ØïY*º\17Љuf‰ß>ú·?¿@°c^¿°Ó³g:®,‘B.nunçCüd¨“ßï+·8›n$
+l1m%ÚŠzÌ
+ ›>ëx'Q©‰4N6D7D,ߊsC
+Àzo€z€pG«Õw…ªãJ’1î¹úË ß*%©6Q¿¿®¹2ß jq¢-N
+Uí¸¡dT'êë—N½Ný^œ¨ÇŠÓZüÞÅm§é  ˼+¾þr~óëÙÕ5~n.UÔ‡çn˜m¥ÝéU’õÊ6¿péø¢ÈBY®kÏ{ÑÇÿØøÏå©RÑÙÕ¿ñ»b+£þn—çXêAmü׬½;Ì@Ôc¥©%~ãÒᨵ%Ô0ï§/oú¿^ÀRŽe¥ˆ—³Y7ÄE¥ÝÙ‚½—ì—¨äÕ†™*¦×}¯N{`wýö˜¤³xøÝtHHPI„p¬'Á¶£n•‡%ÊrÓ dÿ?ýÿendstream
endobj
-1606 0 obj <<
+2024 0 obj <<
/Type /Page
-/Contents 1607 0 R
-/Resources 1605 0 R
+/Contents 2025 0 R
+/Resources 2023 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
+/Annots [ 2027 0 R ]
>> endobj
-1608 0 obj <<
-/D [1606 0 R /XYZ 56.6929 794.5015 null]
+2027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [333.4761 684.0956 413.3061 696.1552]
+/Subtype /Link
+/A << /S /GoTo /D (clients-per-query) >>
>> endobj
-554 0 obj <<
-/D [1606 0 R /XYZ 56.6929 543.3808 null]
+2026 0 obj <<
+/D [2024 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1609 0 obj <<
-/D [1606 0 R /XYZ 56.6929 518.2602 null]
+682 0 obj <<
+/D [2024 0 R /XYZ 85.0394 447.7394 null]
>> endobj
-1610 0 obj <<
-/D [1606 0 R /XYZ 56.6929 518.2602 null]
+2028 0 obj <<
+/D [2024 0 R /XYZ 85.0394 422.6188 null]
>> endobj
-1611 0 obj <<
-/D [1606 0 R /XYZ 56.6929 506.305 null]
+2029 0 obj <<
+/D [2024 0 R /XYZ 85.0394 422.6188 null]
>> endobj
-558 0 obj <<
-/D [1606 0 R /XYZ 56.6929 293.2416 null]
+2030 0 obj <<
+/D [2024 0 R /XYZ 85.0394 410.6637 null]
>> endobj
-1612 0 obj <<
-/D [1606 0 R /XYZ 56.6929 268.121 null]
+686 0 obj <<
+/D [2024 0 R /XYZ 85.0394 197.6003 null]
>> endobj
-1613 0 obj <<
-/D [1606 0 R /XYZ 56.6929 268.121 null]
+2031 0 obj <<
+/D [2024 0 R /XYZ 85.0394 172.4796 null]
>> endobj
-1614 0 obj <<
-/D [1606 0 R /XYZ 56.6929 256.1658 null]
+2032 0 obj <<
+/D [2024 0 R /XYZ 85.0394 172.4796 null]
>> endobj
-1605 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2033 0 obj <<
+/D [2024 0 R /XYZ 85.0394 160.5245 null]
+>> endobj
+2023 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1617 0 obj <<
-/Length 3227
+2037 0 obj <<
+/Length 3512
/Filter /FlateDecode
>>
stream
-xÚÍ[Ýoã6Ï_áGW³üþÀØf³½hv7v8´}Ple#¬-§–tÿû›)‰JdËÙ8AàI9äÌü8_”ـ ¬"T890NE™Ì–'tðÞý|ÂBŸqÕi÷úizòãaŽ8Íõ`zѲ„ZËÓùïÃÓÿ¼û4=»¹¢CMFc¥éð§ó‹÷¾ÅùËéÇ‹ç?ÿvùndäpzþñÂ7_ž}8»<»8=³ÆˈB;™â 0r2=?Œþœþrr6­ˆ™dTàêÿ:ùýO:˜¯¿œP"œUƒ{x „9ÇË©QRˆªeq29ù\ŒÞ–C»„&¥Yq3kN„Ö|÷´~
-
-Ó†[¡ˆÕJ=˜uì(È´ 8aB‰Z œEZp $¥ÙÀ(G´à¢ÔÂçmºþ6Y;~H²Šñh³ "¢ewìµ]˜¦™²a–ûëê6ͳü >Ðá_HÕ·@;Ý îäðcžúæÙj¹\…¡ž^RÀ3,
-5ˆ5÷<(H)Õ@2¬›=dÅétqèf)ïAÄhmtMGJ ³eºÚnúö9 ·ñcöI-ZÑóX|(5~<©QK8W=B–1]ŠàçÅ6ýnf7wr4FÈádò­øÜ/»óO8Ew1 0ÏÃ6)|Ã5ÒMÃC–ß­¾¦ó=òmÖþVÅ«A„\;»_¾Ú9b•–ä«Ÿ,_}TùÆ‹?®€·ëµ•D0izl q”‰‡
-Üp 4÷J5Zñ›…­ׯ\YÐF'5{Ûƒ¥ª(ÕhÅoVªšIeOü£µ ÎQW
-é¿#ÆØ0Y¼ÛlÒåíêýÅdrvêev—,²yäþOd¯£%¾Ù-ª”®ÇÑkÅ!xV¶%Æ_Ÿ'Aˆñfi:ß+ÁhuÇ’ Ä,ŽQù’~„Ø%Aé°}^Iboª[¼H¿<EˆFº–MˆB±=O¿@ë]ê[³"éeÔ d=îŠq{1÷<i½ „'ÊŠ>¯Å4a†Š–3®û@ÜkJ£ÅÍPC”ÓO2ÏÕn**‰³¦Ï
-@/ΔwQŸ×ß.1ØŸNóü€\Òû"Èó†üum’«2mÂL-÷cÙiµÍ硤RáÒƒÂßþA½ 
-c3Ööøi¾Á⨰bXܬ¶‹9ÞKOÚü&¿ ¡tNC‡¤è”/l½ÆïtÉ‚KˆÙ på`$;‚|ÅqL²K¾·€1lf.}É?º6²$¶Ž(Á™HfÀfXÕ@‘,Ó$–ð³BwXðoµåÊø¨Új‹ÁÀb{ÛÀâËÚÀâkˆË’…o÷çÀ®Ãõæx¬‹éc]pg1`ËKRf_îp .jŠã˜d‡Q¡Œ®e3ó.¿
-HÑ6ösð4ïWË$Ë=ñ2
-ȲÂ÷;Ö͉¼ÜØp“ÜÞ.²îò~¨±âÖZ5[¬ÃpH^8;ÄJC(Wqä­ÌNXEúz^V §šõÁŠ3¢”±¯ «Gmhµ?ÕÔ…ºm>‚ÂÆæû,˜#À ;ÕðÂNY P ߾UxEz;¼^À‚s'!U¡®^-zMx.0Ë=Ülzg8d¾[)1·Çr%/¡Ë £Êô)ØÒ.|=ùJJù)Ëçß±çË/¯ýõ* OMhVìQY$‹·¬2ˆ¹™¢ªOeF`Ä^u­òü™*›‰t¶y‚Ö¼8ô[×$ÜÌ©¾˜kLùk+­Wa§A-u“˜fÅM•¹tÄn;UÉâX*«> ~ö§Ä‘Ê8'ºõ:,éˆåúUã¡w3L'¿c«)!Ë­¦„&%‘r§as–ÏVËúiV+Ü?קöŦûƒ‚£3YQ#6ôa:<Wí>LgÂÇQUÈ/Ê Ú»C&¦4qN˦TÕ]áZTâ鮿0ëÏ/úb/ü˜Ÿp%E»€R¦ó{@¡åy|QP3«i½vˆA„¨™x}P÷ú¼Æ©&Âi ¶¶C€Àҕꯙ4܃µ+Ž¯âi|ü×·x㟷åunÖÂÝ~ܶiý1M7n!ßÒ¢–Ò±qâX¸}ä”iÈœ”ìKN™±„:õªÆx’æó³õº¸gþ{¨Ö…e­OY× ±­Hñ›/¼ƒ|u]~^‡Yª¶´ÊRáU“¥Ù|fÕ™˜–ß^ufú˜¬qWÕ¾'Ý|€i“LURkj0>në jˆÐ¬äñïm‡ šÖª°{©þXùíKXVØËÚZ݇P% ³êUóÛËtv÷T„r*ÂßÜšÿˆa›Û,-?±Å—- âg‡!(ÇÏÛyžÒ†zR}`ÂÀ|C8PçáØÙ_‚åOCo´¯ž@]‚7hºýljóö”Þ2^…ÿ\%¡´~~úë§ÝVKõKp(É—=%˜X÷Ç2¢‡è¾DŸiG„Œ¬) Å±½Gº|”q°áð
+xÚÍ\[oÛ8~ϯðÛ*Ø5Ë;EìbN.³ì&mâY`13Š­4Bmɵì¤ý÷{ŽHI´#[ÎØ-‚j‰"Éï|<’6 ð(M´åv`¬$Š25ÏNèà|ûù„ù:úÒ0¬õÓèäÝ¥0K¬æz0zdÅ„Æ1Œ&¿EšHr
+hôÓÕõ¹=rE£»Ñ©‘Ñ{ügtu7º:»;Zóèì_ï?Œ.n]-4t%¾ùÙÍõåÕÏ¿Þz7×®øöâòâöâúìâôÑ/'£fá$8ú/'¿ýA˜ë/'”«Á3¼P¬åƒÙ‰T‚()D]2=¹;ùØ ¾VM»@“2¬
+E g¶ç?Y9K–ãG ¥U&º=_Íoû!m[qÃ<Ëy‘—)²Ól²s( F©ûêpí®ÎÿöRÀ_Jìúñ<sê. §£1Ê,J&ߨDBEI>ywÊ"\`XaùèknÈ®Ê6¥Í‹ÅÒ=MŠt£^õŸXA먞6<>?&¾ð9)ÝCúužŽ—nÊ*ŽunÚðÍw‚2V¥º¯¾™H ÷^,º:¯¤[MÒß)åy:ÁWÝsÅ8U§±PÛƆ^À)¬êü¥Z90‡‰r•Šù2+râ–‰4FYéúš%¾³jÄð›äîC–O²q2¬†=d”K©\×
+uk­xp¿‰û'ã
+xœYYäYþÉWX.ÓÙ|¹}=†L?lñ|O»¦ 'BÙ»¦"VjÖè”wX¬òq<ê_‰£S‹«-ŽêshWäÞþ"ñÛõZS"©=¸jA¬¥ÎÎý;™Õ E×[=÷"ëZ t“tš~JƯÃ2åq±dÇÄ%)-ïÁRqBÁ¤UÈܦKôž˜wà0>öƒù±u¸¼å"«™9OÅb¶Ê`o˜–Âm˜òn$%…ðœê–÷÷Ýƹ³ÛÔ«}²òD]uxS,k[äK8NwÀÛüXèBŒkõ;R·ØŠ.8Íã>cÊá+ÙÂ{WŒ?ï(^¡  GÑ»¹ßbžzçDÛà‘b 1þœ.!n_(£›<uÅãb6+|S'/ïÖåÚ0^aVDå
+fùZ@ê¾e¥û’¸× ‚+G·ŠšQ•óôÙ½»¡ºB$LGUÓÇSgšÍ²exoÿ‹AÈ´1åx‘Í—–ì W ¹ÃÈð=W¯ŠcH/DSQ–®¬mù5:U*Êfi±Z¾Ê.]›¸…#z»D AdÜã@T ]PéÈÏÓUz™B ý$172º»ûVîáF®>` D¯Ê!«m"àó9”[›É,*>ïr,áàß®cQ†«û˜ BZ½°~5Âú¸·cÃ
+ê1Ì>ýúbö³l:ÍÊt  ÷s•Ñ¥;L¦­c²–h*͆cJ>#Ó´;ßÄ_ò”æ™÷VPðìëÜ.K'A¡Úèíd„>µÔ$ø—‡“±–8 Ev‘Aä(ahM5!í4uªn'ã¤ïýä)À
+Tr°`š”Kp¬FglØ4¯Î™D,¢ò±XM'ø,<(sk|îC ¨œú
+IÙ‰¯$¼u;]øÂ, W‰§Øh™Ç×K†"»ð…5¦ahMµÊ•üµk!Ó›ˆ| 4K˜áîB2K“ÜÛWf$šq¾±ÅïÜãƾ‚÷Çòqk_±ÐÛW,_·¯ø±±¯øâ²dêÊÝ BìnaàïSºèÐÅæ劺àÁf`]Œ˜_îÕ‰ÃPäK]pHÀô4•¶9u?øìšMëÆc[*¦¦-m.ÔÞë½Tm Ä_èO5jÔÄÀµKH‹ éÀ´È„Wñ^\Éã&†é @6‚u« ¾/(Àkq¥š{ŒŒÈS¼bB£;–…ùçÕ»«ϪÊe6ö›~gE-ÓEÙ¡<ภë³~×yqøPâð}\‹«Þ’öümí^¾ÎÓ…È]~›§ÕU%ÊëÊéˆM,þèÚñþzþAv]ౘñ°ÀµAÅw¸ÕŒž­+¢V VXÕŠÕ¯«·‰KÙ¡0ñúÒuÛ@ÖmL *î¶.Ô.*ë×HÕ{Iý5ϾvI¦è8„ë 98šób–d¹^åßÝ!”eÄĵW¼<®®u¤Eâd#ƒžüñ²ë Ow«|^-Ël’º—6mæ1o^«‹ŠfÅd5­‚ q¸®Ro®tíTôPL§Å³¿ˆ¥ýE5V¶æMÑœª&,üG×40 qÛè.:Äpˆ¿µ¬­è?»#W
+ë;™ßN[>nœ¬gá±{:}¹Óƨ% þ`FÅ÷sbjÄë|Aw«zôˆÍœ†œsÜ|h½µ°k^Ø%pˆd!ˆtæüÛ쾘b¬iytÀ¸ðÁê—Ìbë¶ÃÆ ŠµÛ–‡o·P0ð0ÞöÐg}EÖP
+¡Þ¡ü@Rm9žX'Öúµ-A­ß0¢í…(,lïj[òäÂJ ¹°Ræ%Tä¯o•\ÖŽE®£LäÒ0w%{¸¥5aÒ߈üAä:›bv»¿É›”Ød²C%í\åD¾ƒ?e
+·cÛ£éVìs¯¤’Ÿ²|ò'Ö{øw÷™?nj#²r‡Â(Ž«±ã®!›¦Gc’.èuûgEž¨±1ˆHÇËW(-@ã-+k¢ã¸'Vc°qócÝ**­Wag^-MÚ’–˜ fåc¯tm[U`q,•ízy«2ˆpâà"P·Â €ùÛ¿?HaïǘAþ‰u¦„¬Ö™"J*!Õ2Ãâ,³æmÜhÛ½7çôå²û
+Ì™¬‚§S¹àÞërœ3áâ§:T‚U¨åÝ¡SšX«e»;Õ½!õ¨wº·\@OÖÊþ˜ /ô®äF~_eðÛÝRå0ò}W>ƒ ·ÊôX ˜©üÖÊç^._5ÕÂ-± nì¯2AU¡cyõç—LVršuþ5iòKãB~ü­(‹!eñ)[ýn¡,ío»›²xW ¹9ÓMYÎÌ!þN” ØpàŸ`@ï†kt›–(.;ÿüžz}ê¾ìßþï¤!€Op†¶¾÷«`ÅÃ3 eU§áŒ¾8‹ÁýD<óÕ‚±ÿóÿ
endobj
-1616 0 obj <<
+2036 0 obj <<
/Type /Page
-/Contents 1617 0 R
-/Resources 1615 0 R
+/Contents 2037 0 R
+/Resources 2035 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
>> endobj
-1618 0 obj <<
-/D [1616 0 R /XYZ 85.0394 794.5015 null]
+2038 0 obj <<
+/D [2036 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-562 0 obj <<
-/D [1616 0 R /XYZ 85.0394 459.6946 null]
+690 0 obj <<
+/D [2036 0 R /XYZ 56.6929 328.1878 null]
>> endobj
-1619 0 obj <<
-/D [1616 0 R /XYZ 85.0394 434.574 null]
+2039 0 obj <<
+/D [2036 0 R /XYZ 56.6929 303.0671 null]
>> endobj
-1620 0 obj <<
-/D [1616 0 R /XYZ 85.0394 378.1456 null]
+2040 0 obj <<
+/D [2036 0 R /XYZ 56.6929 246.6387 null]
>> endobj
-1621 0 obj <<
-/D [1616 0 R /XYZ 85.0394 366.1904 null]
+2041 0 obj <<
+/D [2036 0 R /XYZ 56.6929 234.6836 null]
>> endobj
-1615 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F11 1397 0 R /F39 899 0 R >>
+2035 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F11 1442 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1624 0 obj <<
-/Length 951
+2044 0 obj <<
+/Length 1362
/Filter /FlateDecode
>>
stream
-xÚ­V]oÛ6}÷¯Ð£ L,¿E>¦™ÝºÀ’ÆÖ€]d‰i8–kÊ5öï{)Q
-íÈΊ ’:¼çÞÃÃaø#‘Hjª£Ts$0Qñ<ÁÑ7øöaB<&éAIˆzŸMÞÍYi¤%•QöÄR+E¢¬üKÄÑ"àøýâîw=M¨Àñ*›¦<¾q?Ùb•-nWÓDkEãÛ7Ÿ³Ù²CÉ`b7â§ßÞßÍþ\ú
-
-Œ1ËÚø<«ˆó²Þùœ·úU½íÚõc›é0Næ\øèõ>é\ ›ÁZëSWó}Ym¿%)Îú3$·cÕ‚´Z’ëÅR8ô°:;‹Êª¼ì6h`ÌÓ7Ü ®¸­Gµn»ùkþÊg
-T"T]gíA#¬'–Ä`INNYßr¸5‚cÏu¯{R#¡Hú+'î¯*sN[œ\‚ÁÍ·øìoÀ[-{a¡ÿƘ²Ûä…A—ž‹L ÷ÆÑGý)ùŸŸ’/kO¥èøJÑT!® ˆOª=-ÕkGú7çëÔ6&ÉÁendstream
+xÚ½XmoÛ6þî_¡60±|§ ÒÔn] y±]`C׊Ì$Âɵäý÷;Š”,Ù²³,à "¥ç^x÷Ü`ø!A$fšJs$0Aò4ÀÁ|û8 Ö °z¿¼›0h¤%•Áâ¾¥+B8ŠH°X~^~º¸YŒg£
+<”h
+‰‡ï§WÜí—×W“éǯ³‹‘âÃÅôúʽž'ãÙøêr<
+µŽ(Èó–/;_X!/9_L/ç£ï‹Ïƒñ¢9@û3ëýÁ·ï8XÂY?0b:Á6­ið4à‚!Á«ß¬óÁm£°õµí Ç*X
+Œ8!§­: ¬ú%eH[?»FCÂâBÙ<pŽ°Æû<€ú}g(bLJh$eU"~µQy7¡m¤BŠG
+´[Àâ›±Ãt´Q¸ä̃~;¥%ò€¹É–ãÍÆÃh 1Sšj³ óM1
+™bÃ4³O>,òä/Sºwèr«|m6q™æYù—.S/˜äÛ¬4'äN­ ­`*$i!he³XçÙ²p¬)óž“p8+­rQ¥ÿ”B:EµÆ¼Ušß÷)UˆIRǧ¢~RÈnR¡C
+sà°’’íÔ¿NŒGˆAÂJ HŠ×¨¬%N3GˆÒ
+z%úÿ$èÌ$ϯ%(ÅŽ Ó† öãZbÒgã>vxJ5÷<uòÉj»4~göÚ{ˆ
+<>)_
+jgaåeú'Æ@“®OßýtŽ3÷œ^~¹q«ÆU·}2E?˜3 ݧþmlÚtßf_êÛVFauзÿTí‘1m4¤
+aÕí÷G}Ÿa‰"ªU`û”%^SNÖ3IB{T»°ó 1
+ Æ0ó§5äü.]¥¥ÏÎ.-se{òpÌ&ò¨Åtê$B‚ÀÒ·?x]û*zÊ!$B",™„ss¤9á•à—¼°í™B%”à]Q¦‰íĔԭ°p_ËÇØãvÆÕ‰CÅÏqºŠïVÆ}„²êqÛž)ÅùžÉ •”îÏcÕÅS«"÷®n×ë|SÕÇI£Ç9£¯0ª½Q€â1ßeSU›NÐYÔ-ôø.¯Z‡H6&¶m0‚‡ŸšU5ÙÞ@?Ã@z[úɆ|îÓP©­Ò`W˼QàÅ×k{¡4«á¦8pèð2…p¹°ˆ¸àý7F
+Û¨ÓEРª=Ù-g¿ÌíïCÛD€
+¡´d\w¹¹‹7Ë4{èsRœÕc9.úNKÔ’¼êÒãiš.OsŽiŒ½À¹ê çjTŹ‹ß'Çl#Ð÷%æçÍ6¨»¶Aeœ¨®a?Ø—­/Ǻ“ÆmZu˃2õc:Kò'›¥jw»5›´î\€§ƒ‰5"„¿TÀ-Ô™`Ö¨*˜ÓÛ£Pbè~XÊóFTÕN(á+‹”îšýoC93?¶¦(ÿa,¹Òpç‘â|,Û¨Ó±lPU,¯×eqLL ’€{ÊY³ ªÇn'š–Àö®á¢Ù ‘Vÿ³Û3ýnQõš– ëÉeÍ&™Ø„Sk…þXß–{rmïÁ›Â‹¬Wqr|Ÿ­Ó—Sû—~O„qP·Ë7ÿCaÿ/û×bÑþT1(Æ4©²1"„º× 5U=¾ÿ 16.Éendstream
endobj
-1623 0 obj <<
+2043 0 obj <<
/Type /Page
-/Contents 1624 0 R
-/Resources 1622 0 R
+/Contents 2044 0 R
+/Resources 2042 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
>> endobj
-1625 0 obj <<
-/D [1623 0 R /XYZ 56.6929 794.5015 null]
+2045 0 obj <<
+/D [2043 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-566 0 obj <<
-/D [1623 0 R /XYZ 56.6929 769.5949 null]
+694 0 obj <<
+/D [2043 0 R /XYZ 85.0394 665.5626 null]
>> endobj
-1629 0 obj <<
-/D [1623 0 R /XYZ 56.6929 749.9737 null]
+2049 0 obj <<
+/D [2043 0 R /XYZ 85.0394 637.9713 null]
>> endobj
-1622 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F67 1628 0 R /F22 737 0 R /F39 899 0 R >>
+2042 0 obj <<
+/Font << /F37 1018 0 R /F11 1442 0 R /F21 930 0 R /F22 953 0 R /F67 2048 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1632 0 obj <<
-/Length 1321
+2052 0 obj <<
+/Length 69
/Filter /FlateDecode
>>
stream
-xÚ•WÝoÛ6Ï_aäÉ*Z$EJZžÚtÝ2ðfOëh™¶…È¢¦¦ÙÐÿ}<)[±à.0 Çßï‹]ÄöG™ 1Ï“Eš'DÄT,ŠÃU¼ØÙµŸ®¨—I'"áÜNfV#Á3"2–.¢SwW«Œ.XL¤dbñ°uÉ4%”³lñ°ùsy·WM¯Û›ˆ‰x™Þüõð nKHš¥¶ÅVEJDÎr·áÝý¯ïQ:Çá“.†¶ìŸqvgê®ÜèVõ¥¥F<šžHæñ¤ BrgM¹‰hÇË·E¡»nDé[SáäcÙõ‰-r’K&=§„3)RØϹÄý74[0Ã’bù9ñÛ»).*'ªýd³ÁiÀ:¨¾Ø#YQú½ê‘ùl$
-U#Ñi¿44(¬ê 2ê²x¬ÕÁ«ÚšÖC?œÚ0tÎ '¤”äB0w²ýyô‚ˆ9eVDTU™§¨6}¹}žq™$IÒÔ ¿™KH&äìïA·³X†”½*2õ Z–‰ü;p£
-CÅó“P±œ°1R;c6~ËF«¹¢$ËSêÅ! ­Ã8ë$žæ¾ýˆd*&í¬ ½ÓÒ(”x?çèurIšÛnz({—" x¾™Ÿovôú“ÎÖ&• Ædžnth£Ú¾ ÁÀô€XèʱAwÑuŒ®1Æ¥ž¦;3]—ªš† l* â.â÷æ^nkßÛÊõºÕN•u׿LS—L¢ô³í„ˀ塿ªCSé©M{ó„„+©ñˆ¦ÑmåïVÕ4„èþ€I‘г;Q¢«• W 7t”
+xÚ3T0
endobj
-1631 0 obj <<
+2051 0 obj <<
/Type /Page
-/Contents 1632 0 R
-/Resources 1630 0 R
+/Contents 2052 0 R
+/Resources 2050 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
+/Parent 2022 0 R
>> endobj
-1633 0 obj <<
-/D [1631 0 R /XYZ 85.0394 794.5015 null]
+2053 0 obj <<
+/D [2051 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-570 0 obj <<
-/D [1631 0 R /XYZ 85.0394 769.5949 null]
+2050 0 obj <<
+/ProcSet [ /PDF ]
>> endobj
-1634 0 obj <<
-/D [1631 0 R /XYZ 85.0394 573.0962 null]
+2056 0 obj <<
+/Length 1238
+/Filter /FlateDecode
+>>
+stream
+xÚ•WKÛ6¾ï¯0öä"š¤ÞÝS²iÚ-‚¢h¶§¦®L[ÂÊ¢*QÙ8Eþ{9R¶lÁ­aR3ß¼‡[Póc‹,&4Ì£EšG$¦,^»ºØšg?Ý0ÇÅ!‰£04›™§Af$ÎxºŽAÞ=ݬ>p¶à”$ O›QW’¦Äe‹§õŸË‡R´Zvwé2½ûëé‹Hš¥ ĨQ‘šç¹x÷øë{äÎqù$‹¡«ôwªé«µì„® 5ⱈ„QÂ^b,I^JØ]À(¥Ë·E!û~„Ѫqó±êµ‡â‹œä ORhÜ£<²H^> ”¿cÙ0à
+Ñ ÑK÷hh‘Y4k<hªâ¥;§j£:G z8¶aè%ø 2Fò8fÖêzˆ‚a !ã†XD]«× QºÚìgB'$ŠÒÔ1¿™‹H'°¿ÙÍbÅ&§üz¨@53h)%<‹óÿ€¯ƒÚë«y@FÂŒ%WÙ7âÍÛ˜%$äqô?!ŸkQ¼”ª–3H‘aäìº<ØŠ"hÍÔ4¹« n9t'š~cúø\U“ˆ%U¶¥¤.âùÇË N…?úªÙÎÄt¥é¤¬Ž¶5„V¸–â‹Dê3¥¼±%aËÂÄ‘-­gê >¥Ë×ÒIÛα:ü @Ž;¨^v FÖ‘$\¾VºTƒv0õ Í0Û'݃1‚fß®¡Œu`íw@ÖÒ ÀEª¶)×ý@ª ®¿áz44dOFíG!}„‘‡ËªÇU`ªÂü(UÜð™Ú*µv"k)æjˆ‘,O™c‡D
+—˜´¶P‡Ý³ìNsǦ¹óVøÔÙå+±?ôésßg©Z|—=*ÿxÂGȬQgÇüìÝêØJoúE“Nß~®
+endobj
+2055 0 obj <<
+/Type /Page
+/Contents 2056 0 R
+/Resources 2054 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2022 0 R
>> endobj
-574 0 obj <<
-/D [1631 0 R /XYZ 85.0394 573.0962 null]
+2057 0 obj <<
+/D [2055 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1635 0 obj <<
-/D [1631 0 R /XYZ 85.0394 542.127 null]
+698 0 obj <<
+/D [2055 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1630 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R >>
+2058 0 obj <<
+/D [2055 0 R /XYZ 85.0394 574.0823 null]
+>> endobj
+702 0 obj <<
+/D [2055 0 R /XYZ 85.0394 574.0823 null]
+>> endobj
+2059 0 obj <<
+/D [2055 0 R /XYZ 85.0394 543.8373 null]
+>> endobj
+2054 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1638 0 obj <<
-/Length 3450
-/Filter /FlateDecode
->>
-stream
-xÚ¥ZëoãFÿž¿ÂßÎbYóÐcŠÃé>®é»½]wEÛ²¬Äº•%W’“ºý‘CÎX²•fb±Ñˆq8>~¤,f!ü³(b#Í,1:ˆBÍòÝU8{„gÿ¼<gá&-†³¾]]-ß«dfËx¶zðJƒ0MÅlµùyž2¸þuõýò}"seDR{œóæ»O?®hÖˆ£N-RÉÓn?¼âR Ís>¿[Ýß½`%¥Uì—¼ýqõîÓõBF!Èx { çßÞÁ
-–bèòùÝ›ûOw«ŸèîÍÇŸïÞ¾ût{èùêîp«w+¯©¡6E¨PM¿]ýük8Û€R¿¿
-eÒhö 7a Œ‘³Ý•ŽTi¥¥ºú|õoÏpðÔ¾:y:" Ärâx¤œ:žÈ±å£Þ7-mn‘Î º+뇦Ýe}ÙÔDp×móLƒ¾¡ë¡ãWnßüÐí-Ǧ/òžÇæÀ«uEûT´¨ÇG`6ý¶àÓ3Ù•A’wz·÷ŸßÀáEÑœ­f´Q© ÏÍ6Oe×´GbŸõßÐbhC ƒN“Ì`&"J"ûêßÏÏ7ÖÖ"™%Z:Ñ =ý2s£Îƽ°¾aF×¿à‹«?ôûo–Kød‡./Ú>hÚG/÷‡õ’IK·»åí 0âpFd‚0ÔÁ¦îÎÅ×
-Œ, åHþ× T&MÓió\xŽ¯lLÔjÆÜ4—F"Í…†Ï,ÞϺ\ut¬—ÜpٰɈ™ÐÒà8ÖÀw`ó)p‡—D»èu½aοm›†í8«7ŠþPn&L0œ-$ƒ!CúˆÞ“FóûwÿÅQÌСõ=/{¢–ÍÛ7]W®«‚¨ÖŸ€Ú^§óCM4U@-™w6á6R$žyB¾%‡œ’YÅAd7¹¨ŸJš^§5~ £ðЕõ# æ|Uµ.Â8Hµî¹U¾ ÿÅÔºi ãÐðô‡Ccر“í¢ë#¾„'dJ >*E”_º}‘—G+“Ò‰• éü)5­6²ÄDBúà°è'"öN–eÝì)"w[‡›ÆIÊoÖÙnZÑa`ŒÏD{âPÎW[<|dg5­·-ª=ÊÇÒ'Þ\wìúbG»"?´e¤»õ‘fì«,÷J!k±œXþŒt
-¾€(‰Ó©ô[îÀÈ×Íï8äý¼-ó-˪¢QUîÊþ¹í`“í²G7nj—RØyF€qâÈ·Ï]Ù‹Е†1ù¶n`!|QÛäóp@I´˜?Yð9L‡äð€ä{pe1ï(»Á}ó@3Ø«€bEÒnS@ÈÖee•l© ]½G—ÙdÅÎ1ΘMÆ÷‡zß–OeU<’eØÝ 4b ÃL˜¯„ˆ¤@l¾š©¡ùb2‰œ?YŽ—6¨I{/@_3T"œÿçÚHºÃãcÑñéÒVkò}<ÆÎÅBÆÃ9dÐ:Ë)ܬÎ3˜2‰ ߈t<¦|H2‘õ Î>à`|”Jã±ñ|W8QÂØ3Æ«õ7¸¿g»}ÅÁw6ÎãMUÖLÆ“·”&ãgì[À¶d>ÙÔ¾
-ñªÅ€!(Ÿm/Ò6rG]ãrÏMû…(f÷E[éYY;IhBÖöe~¨2–tC\Ê[(S0Bù °ïÜL„,f’zbÁÙ
-â(:Kè/Y1à©4MÌ d¡%'«
-Êi”•pTh 8²Ö ³èipà”šq"¼P˜}k›ñ¨¬óê°)858Žý–ój:È«¸b7^’ʦw=Ïyvîö2rdö7ŒªÆ
-
-Òeì".†Å HkuRÚ¾Ü,HSîqŸ¹,Ï›CÍãÁ•Ü`H]àpÄhq–­îkÞ&
-PÑ’nhhÃB–㾄hY?8¨‰‚AƒøF8ùëɈ#`Nâó 4" FEãÊê…S‰dô*>VP‰ù‚ ë³~(yÝ´ßÁ#Úð°Ó(>ËEÛŒÂJ˜`_·Y[ZƒK³ØHŒOÈÂS´Ûg¢8O@`dÒùwÍs1hY¤ Dñ}QoÏÀ| ùRßä@
-„Wª¥1û •Nt.@ÝeGšÍzL-ºACáò*g̽7Ÿú±;÷‚q±)D¸Œ»ÜOË?Š¶™‚*HŒo´M…°LYµà+ÐÎCL!Féט©!³ªy|¡“#Ãä„\\õ=Œ5á=æYô9Áƒ¾ÜM¹iªÐM¥¯Á&
-D§D¸¦ÀýÎracñ¿çböÏ
-ã¯q)ã*!7ð`½iþ TRžÚjÀ‰ä ‡.ˆz_+ Ü–òmV?Žn#¨¥C|,ºŽK&Û\â®Ù”8)wmHÔœfçú APa¢ôy¦hÿ´Â€ëCy¾mž§NGÉÀÈX]ì‡ 3×½OúÓ?ÁYg°Ÿ¥“è‘‚ŠóàrÃ]ŽAƒ•3츓:(½)p -s åÔ¶öóÛ²§Jhª;­@kÚÈè«ÚÓ4a
-ØA{à–
-ˤ2¥=5½IÚÁQa…(lÚñ°ò‡5¬f/bA|†P¶|†±€¹wtk‘=HÉìE¨î±Ú·“N%¿%£õƒýÝP3¡d©*ÔPØÁº`àBæQJ=8[_KHjèS j¼B·S *‡yÏtÓ]ÏBå}Á3÷¶@ÏèèÞv¡Ã–™[U
-­ùt%ú²b7†8LûM¬oûw6ø¹ØÁ/l—Ûr"å­nÖÌ=oû¾yl³ýÖõðqv
-wf Éݯ‰.Eÿ?€ž¦ùendstream
+2062 0 obj <<
+/Length 3283
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ZëoÛFÿî¿Bߎ,Šû ¹,¸‰su¯Hz‰»¢íZ¤-^(RáÃŽú×ßÌÎ,EJt b.g‡³¯yüfVbÀ?±#?Jd²ˆí‡›ÝE°x„¾^æY9¦Õ˜ëûÛ‹õ;/?‰d´¸}É2~`ŒXÜf¿z±/ýåï·?®ßÅbÄ+?”
+Ä#Ï›>~øpK\‰ÚøZÉlWïßÎIŠ|©„fžO×·w7ogD “Ò*†¼úùöúãr%Ã
+°+!ü$ ¥]Wz_æ™?ô?ÒØžwuCǹ«I$½ÕCÝìÒÎÎ î¹­Ÿ©ÑÕôì[þäêÍOí´‹&Ywù¦#¡îy4Þ!ÐœKG`1¸C¤¯Éè´”~l§¯WwŸÞ€º†¡Çv29Zû& ó¦ÙSÑÖÍħÝwô…[ÍJE q»ÍIì§?ÕèHûZ‹xƒ’éÌÌj õ~^¸Ö¿ŽÚè>X¿°Ê¨ÇãŸÉÅѺýwë5üõÓ¾ÝäMç×Í#´×ûþ~ͤµ[Ýú꧘màÙ$~h?«ÚÓékfr2ÿ×LRú‰1fÞ WƒÄWFë‹0™.0«Ïg
+?HÎvøÄÆ®óQ'Çz. ‡ý«ŒXí+ ®Âj
+¶ëÃTâi¸À%· ä÷õWl²‹~Þ›-7‹²¤VYìŠîè¹m#Kwé£kו )l<“@]86µ[ç®h_XWU á‡ÚŸ‡g¢…÷§]?Ä0a@Í l}@‘!lRtƒwŒàÈÁV;%í„ô¾(í&[jMÏÁ"ÇÃdi¾s‚S“ò{_í›â©(óGÒŒÓ@ â=Aƒ™Q_ IÅ¡SßžXB5V_ &¡³'+ñ\'êÁ
+ÐÖ|D÷Ÿe"hûÇǼåÓ¥¥VdûxŒ­ó…ŒÆ+sÈ qš“;®v0ï<dB¼fâ<ælHø2–çŽÎÞggr”2ÑTy~È‚(‘x„õ»|æ_ÓݾäNÐÅõóøR“ñä-¥N¹m Ä,'[—‚phõ ëJÂÄ/áåŒ@­ü@NÞú)mÖ/ù8\ibÇ
+Ö¬Tä ks+b]žuj¡1êÔ©a „H©“çѾÁíÅŽYÎ?²–È@26Óf‚Íø»ÉI®û¶Y—õ&-×í}QñÚÁ“hö ò˜ÐÑól“Äàê)d«ØW&Œ†LMpì¿užm3× 98Î
+ñªÆ€"¨!Úž…m”Ž{Ã=×Íg¢°›Ýç ¦ØWTn&Ä6]±éË”gšœ˜tJ# z¨al;—3.Kš˜„ØCpú£ü( õT^ÒbÀSÆÄÉÈe¡&dz
+Ši•°Uå¨ Ø²Ú3ï¨ÑsHM9žm˜ýj›r«¨6eŸåšs‡nËqÕŒâ*ŽØN‡$ƒ²á]{ï\hWîÖ2A2(ìoèU“
+´ÝÆ€tŸ¶”)òí‰vi”òn~&Bše„O[þˆ.å8µ·­)erƒ_ [bH9f£»dëâI–ÅÀª©N÷ÂÐ3+¥ˆ…6ÖQÕ@†•.N²ý%Åï¯D·•Öмxû:NÖ²7«+>êÙüÔ˜Á‹ýÁåcÃé‚qr±É»¼ÛÖOƒi r×™`æÆçÇ9Zî¶&×1= ñáX#Wd-“lå˜Ai±}÷w7ÄòÉæ3a3L+OÛÂ&1!]ÀXVaÁzWe[óŽ×Ý0ÕÔ‰x˜L>¦SœN:çaìþR Ö*¼x2*Q¾”,|ådVûL^ÃØ"’­–Ð MÓ‚Õrì G[¦OÌ:Ü
+`µŠAV£@ßò¯¤["@ó™R;NÀFR—‚/´{ϦÄqJ»r±fNñ7TÐ&7#C0Z,ksú ä´ëðl3ê¼gj;d‚¡3óPTC34s& »êKjøN W+z¼Fꢋ–Q¼þÞ
+B¼T<±lR\¼^'°N§†
endobj
-1637 0 obj <<
+2061 0 obj <<
/Type /Page
-/Contents 1638 0 R
-/Resources 1636 0 R
+/Contents 2062 0 R
+/Resources 2060 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1603 0 R
-/Annots [ 1643 0 R ]
+/Parent 2071 0 R
+/Annots [ 2067 0 R ]
>> endobj
-1643 0 obj <<
+2067 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
-/Rect [63.4454 738.9144 452.088 749.0762]
+/Rect [63.4454 707.8911 452.088 718.0529]
/Subtype/Link/A<</Type/Action/S/URI/URI(ftp://ftp.auscert.org.au/pub/auscert/advisory/AL-1999.004.dns_dos)>>
>> endobj
-1639 0 obj <<
-/D [1637 0 R /XYZ 56.6929 794.5015 null]
+2063 0 obj <<
+/D [2061 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-578 0 obj <<
-/D [1637 0 R /XYZ 56.6929 723.0302 null]
+706 0 obj <<
+/D [2061 0 R /XYZ 56.6929 690.9391 null]
>> endobj
-1644 0 obj <<
-/D [1637 0 R /XYZ 56.6929 689.3491 null]
+2068 0 obj <<
+/D [2061 0 R /XYZ 56.6929 656.5891 null]
>> endobj
-582 0 obj <<
-/D [1637 0 R /XYZ 56.6929 552.677 null]
+710 0 obj <<
+/D [2061 0 R /XYZ 56.6929 517.028 null]
>> endobj
-1645 0 obj <<
-/D [1637 0 R /XYZ 56.6929 525.9649 null]
+2069 0 obj <<
+/D [2061 0 R /XYZ 56.6929 489.6469 null]
>> endobj
-586 0 obj <<
-/D [1637 0 R /XYZ 56.6929 411.5673 null]
+714 0 obj <<
+/D [2061 0 R /XYZ 56.6929 373.2709 null]
>> endobj
-1646 0 obj <<
-/D [1637 0 R /XYZ 56.6929 383.9327 null]
+2070 0 obj <<
+/D [2061 0 R /XYZ 56.6929 344.9674 null]
>> endobj
-590 0 obj <<
-/D [1637 0 R /XYZ 56.6929 225.6356 null]
+718 0 obj <<
+/D [2061 0 R /XYZ 56.6929 184.6919 null]
>> endobj
-1330 0 obj <<
-/D [1637 0 R /XYZ 56.6929 193.4614 null]
+1721 0 obj <<
+/D [2061 0 R /XYZ 56.6929 151.8489 null]
>> endobj
-1636 0 obj <<
-/Font << /F37 802 0 R /F71 1642 0 R /F22 737 0 R /F39 899 0 R /F11 1397 0 R /F41 939 0 R /F21 714 0 R /F53 1029 0 R /F48 953 0 R /F62 1062 0 R /F63 1065 0 R >>
-/XObject << /Im2 1051 0 R >>
+2060 0 obj <<
+/Font << /F37 1018 0 R /F71 2066 0 R /F22 953 0 R /F39 1151 0 R /F11 1442 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F48 1228 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1649 0 obj <<
-/Length 533
+2074 0 obj <<
+/Length 846
/Filter /FlateDecode
>>
stream
-xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6ÊþúšŒ“ -{ZEóÆo>Þx€"b~ Ž “!Šeˆ9¡å[‡ µ9ûîPËñ/$¿ÏºK¯ßXŒ$–Q¡ô¥—K`"Eiñ䎌æétáù'nŒ=ŸGĽKfðHx,§ã‡E’>ÿš-“Ét1òâÐMƒ<?D˜xf3Lg£ŸÉøó P§ï²=§÷Î4½
-é‹¥„u*þ:OÏFó½C0“‚££S)´uBÎ0»x*géü¾&ìžC‡†Ç™À\ñÀô‚`hz\âˆì<½¥ÞªNSä6e«0óÖu·º{r÷R;ðdUFqª³m™|ò»"kU“nžgFÖf`•5¤±°9¬
-½ÍÀkRÖ6²P•Z›D¶ö&k{|¿·ÑìSŠ%çÁY€MÂtÊ乄Úe{HeЛ®•¹YF"7Ý” 0ÙÉ£”º_ ‰)§Àßê_©WUÝbÁÊuÝšze½¶x_¶Ý
+xÚ¥UMÛ6½ëWè(KŠ¢,7k'u€n·kå$9Ðc ‘DU¤ã¸¿¾C ½ënÝSaœ>ÎÇ›!Åb
+?—‚P.óx)s"(qÝG4ÞÃÞûˆLz¥×¨·UôË;¾Œ%‘EVÄÕ·+_%¡eÉâªùœÜÿz÷X­Ÿi&h²$‹T4y»yX¡Eâ²]ß|ÚTŸP»ÿýa»Y­ŸîË<©6 -Ò¼¤%œçÁÃêÓÃÝo›{Ä|\!týÊÛ×êC´®ž ¹.–Qî«ø3úü•Æ Ôü!¢„ËRÄ'P(aRfqå‚‘s~±tÑ6úãÙáÕî|ôy‚—D”Ùò{Yv‹=!IÁ3>³÷ÎL‹”Ó"qmµ—É´`e¢•5ƒ}–Œ&' ëæ=3ì»ó5¶6}¯‡æâI9”Žc£œ¶¨ì‚÷z:Îì'5ÚZuè¨HÔ2˜œŽv!F¯Õ`=ÕPoÊ‘Bdsòæ´£È7@Õ®5ƒ7°Ä¶ûA¹#&gô…
+Zm7ïaeaÕœ©ßl}¥Y‘{|$ Ž]QÇdAòd:Ç…¬Í)Åêúšè"#’É2€ÍxÉ+KìÁ»ƒw­ ÁÍàI˜‚üÐö]ŸQ,Q‹”%=ÓÉ`ÜLL£$¼Èò³yÄ9UM8°3 `òýöë ÝÉLßQõ…Ò짶Àg4¹ëœž€Æö‡†ücÉD{Ž‚Ó ²²\ZpêGšÒÑtm}¾Å– bÉ‹×lûZaâ­nÖÍYC\Àг%‘¦ßŸÞš~†Â¤¶+.’ú`Œ fgü*€^=¢z‰BsTZÛàÆÊ¿3B9…R; › Úã®1½B+¸ÂÉFwzïgcã´]ðé­‰Nx‰™r9‡
+´¿Ì  ^’êÐZDžÔK—òK—Àî̘všør¥Ú âµÃ>èSëï_‡ÇBµ>ö±> ¤B¨à»ÄAó¯ 0p9o8w0ØΓޅ1E¨/¿CÉê釞ìeÎt
+¢F/%b^°ä¿^j.ˆ^o¼«ðyÿïWüåû–æ,³Û4§9á\²KRž/ÆÄëÔŸßûçþ7rà_endstream
endobj
-1648 0 obj <<
+2073 0 obj <<
/Type /Page
-/Contents 1649 0 R
-/Resources 1647 0 R
+/Contents 2074 0 R
+/Resources 2072 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1650 0 obj <<
-/D [1648 0 R /XYZ 85.0394 794.5015 null]
+2075 0 obj <<
+/D [2073 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1647 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R >>
+2072 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1654 0 obj <<
+2078 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1653 0 obj <<
+2077 0 obj <<
/Type /Page
-/Contents 1654 0 R
-/Resources 1652 0 R
+/Contents 2078 0 R
+/Resources 2076 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1655 0 obj <<
-/D [1653 0 R /XYZ 56.6929 794.5015 null]
+2079 0 obj <<
+/D [2077 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1652 0 obj <<
+2076 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1658 0 obj <<
-/Length 1964
+2082 0 obj <<
+/Length 1965
/Filter /FlateDecode
>>
stream
@@ -8191,206 +10005,210 @@ i ·¥Ý3éÀ–yíˆùðŠ&Â8K<æcø¡›‚hïCû™<»úÐŒ­êhüýÔï Æס\@•‰ó÷w= vV
ýf3GÕ51b‘æi‘diNŒ‘Œâ±ˆ±0·"ð0àâÄßZÕ7’\sÂw"ó‡&0ÍåþF—?$cRÍZº”í(õåŠ:éH^04g¢°û(½À ÙWáÓ7˜¿S,[>°úŒ¹…;î3`ô¦'bÕÀ¤Ö^ ïöEy˜]¹œ­Þv‹íçÞa¯Úák@n@þzh|ÇütÓOÓ0J¿mºã—¿ÞeÚâš(°ÁiÇEðá êÍâÀz҃ѣm§žæˆ§çOŒ$
­è×ØÚ:‰óÎÐÃBYn?z·XdÌqâd¾©Üä¤ÚNí:ørðï»QÕaáƒL·CÕMucVìâªV.Wª4 Û8Hü»Uoy)”@»Zìo+B)ˆ×­©ôD9ƒ©;B.ÊõTyåvÂ)Î6™îZds§¡ÁÓÏMí­µ°r=¶öä&vÓž®é^/yr€¡¶¯ÓP;«y Â1{9B€FãŸà{ËוÂM>p\×-ž‘7>å èWˆÌ¨W
¥Ìrcø-Š¼ûãËü
-“¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀdñ:Æ›š¥îãºÊǽµÿ¶Uø]5èTíŠË°ç§ð6hÿ˜ÈŸ%×"ö"Û‹ ½H.ƒ€k(,â2÷†0”2¹õ6¿oÞ»ûq0Œâendstream
+“¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀdñ:Æ›š¥îãºÊǽµÿ¶Uø]5èTíŠË°ç§ð6hÿ˜ÈŸ%×"ö"Û‹ ½H.ƒH"h<H# a(Bä·îæÎ{ÿúhendstream
endobj
-1657 0 obj <<
+2081 0 obj <<
/Type /Page
-/Contents 1658 0 R
-/Resources 1656 0 R
+/Contents 2082 0 R
+/Resources 2080 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
-/Annots [ 1665 0 R 1666 0 R ]
+/Parent 2071 0 R
+/Annots [ 2089 0 R 2090 0 R ]
>> endobj
-1665 0 obj <<
+2089 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [348.3486 128.9523 463.9152 141.0119]
/Subtype/Link/A<</Type/Action/S/URI/URI(mailto:info@isc.org)>>
>> endobj
-1666 0 obj <<
+2090 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [147.3629 116.9971 364.5484 129.0567]
/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.isc.org/services/support/)>>
>> endobj
-1659 0 obj <<
-/D [1657 0 R /XYZ 85.0394 794.5015 null]
+2083 0 obj <<
+/D [2081 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-594 0 obj <<
-/D [1657 0 R /XYZ 85.0394 769.5949 null]
+722 0 obj <<
+/D [2081 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1660 0 obj <<
-/D [1657 0 R /XYZ 85.0394 576.7004 null]
+2084 0 obj <<
+/D [2081 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-598 0 obj <<
-/D [1657 0 R /XYZ 85.0394 576.7004 null]
+726 0 obj <<
+/D [2081 0 R /XYZ 85.0394 576.7004 null]
>> endobj
-1661 0 obj <<
-/D [1657 0 R /XYZ 85.0394 548.3785 null]
+2085 0 obj <<
+/D [2081 0 R /XYZ 85.0394 548.3785 null]
>> endobj
-602 0 obj <<
-/D [1657 0 R /XYZ 85.0394 548.3785 null]
+730 0 obj <<
+/D [2081 0 R /XYZ 85.0394 548.3785 null]
>> endobj
-1662 0 obj <<
-/D [1657 0 R /XYZ 85.0394 518.5228 null]
+2086 0 obj <<
+/D [2081 0 R /XYZ 85.0394 518.5228 null]
>> endobj
-606 0 obj <<
-/D [1657 0 R /XYZ 85.0394 460.6968 null]
+734 0 obj <<
+/D [2081 0 R /XYZ 85.0394 460.6968 null]
>> endobj
-1663 0 obj <<
-/D [1657 0 R /XYZ 85.0394 425.0333 null]
+2087 0 obj <<
+/D [2081 0 R /XYZ 85.0394 425.0333 null]
>> endobj
-610 0 obj <<
-/D [1657 0 R /XYZ 85.0394 260.2468 null]
+738 0 obj <<
+/D [2081 0 R /XYZ 85.0394 260.2468 null]
>> endobj
-1664 0 obj <<
-/D [1657 0 R /XYZ 85.0394 224.698 null]
+2088 0 obj <<
+/D [2081 0 R /XYZ 85.0394 224.698 null]
>> endobj
-1656 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F11 1397 0 R /F41 939 0 R >>
+2080 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F11 1442 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1669 0 obj <<
+2093 0 obj <<
/Length 69
/Filter /FlateDecode
>>
stream
xÚ3T0
endobj
-1668 0 obj <<
+2092 0 obj <<
/Type /Page
-/Contents 1669 0 R
-/Resources 1667 0 R
+/Contents 2093 0 R
+/Resources 2091 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1670 0 obj <<
-/D [1668 0 R /XYZ 56.6929 794.5015 null]
+2094 0 obj <<
+/D [2092 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1667 0 obj <<
+2091 0 obj <<
/ProcSet [ /PDF ]
>> endobj
-1673 0 obj <<
-/Length 2543
+2097 0 obj <<
+/Length 2544
/Filter /FlateDecode
>>
stream
-xÚuYYsÛ8~ϯð[誑ÂûØ7[ÎádìrYÎNÕnö"! k’`ÒŠæ×O7ºyØéTJ@£hôñuƒö.\øç]¤ÑÚ ²ð"ÉÂuäzÑE^½s/°öùÇ<a¬£0`²°ºŠ‚t¥~r±šorýôîÃ'ß»ðÝuûÑÅÓ~<+N’µ¥OÅ«¦‘u¡~]®üÈu®.ÿ÷ô•ÄÂu’&Š¹pD²ã$žKäÒŒÌ^¸ÂØgæ8Z‡A’óÚ»\y® [çϵ>•²8T²îf²Þ:‹¢A6Ö^yƒì$Mú]·JîiøE™N·gšh&vGIƒ›û- D]°èíý ê_dë,öc>Ӈ˹!ë[vGÝŽ d¼ ~ø~gx©óÃuý\‰)´¶»ôyPu­êQ¬6sñ] UÓø^TLÝžM'+Éó¾mñ
-\Ó±8 ØãràÔòD3h Ä“0D,¤É[µ³:Ýê dÐ9 QÔ€EÒÔ'{)Áúrø®óɪ¢«q—µÑ$”ÄêY_ÝÔ'ÿ=>\f¾sUË"' Á_‘k/ƒ“†®
-¦6pkK­é·ç÷'‘s[w²…-@Ø£åÌ­ßp,XBšÎÞ'h7ü•¿Ù*Œpv
-÷Ãa…|‘¥nl Ø-H±ÈZyá6µ¨€÷ƒ(
-RÜŠ1ÏuL~”6`l ¿‚~ZѨ¢<ÓCƒÚ̓
-’ r”OœBç=Á 1j"«¢ºÑpQɧUäzý"GöÄÙ G,ØÝfS6ä ÐBdz˜€z²Ó„Q™DÏ B0q
-ã”U#7Cã@Q²€.ÿ¾ô
-ÝD‘øñðñ^=:\è±æí
-®o¬ƒñ+ñ'E\2}8Ç’;i %Ò‡ï&ª°Wõ\~jÀaÛÍ{³˜¢GË!zeoA_^†NmÞxš^Xð”Ð;’ù‚Ïr{z8Ø'"Hóȃ…×UØNÑô
+xÚuY[sÛ¸~ï¯È[•™µ««e·Äé%í&“‰Ó³3çô<ÐmóDUQŠëýõ  ¤dµÓé˜Äå¨>ü .ÖÉÒ²ø"ÍâeâÉE^½ó/°öù]À<q-“8Š`2³ºH¢õ2Y‡éÅbºÉõÓ»ŸÂà"ô—«U˜\<퇳Viº “õÅSñ_ïªid]¨_—‹0ñ½«Ëÿ=}%±x™®Ó
+#œ‚Ľ;¬/²Ô »)–X+Ïܦð~EAŠC1øžÉÒŒ­‘áWÐO+U”gš€B`hC»  ŸUM”Ä
+FXЭ‚dƒ\#åS¯ÐyOpBŒšÈª†¨n4\Tòi¹^¿È=õvÂÀ3v·Ù”¹<ƒZˆLPO–`š8I9³€øQ &ŽÀ6 CÆg”ñf±Ñu.{4ÐÈ,0ø$rUªNIƒb¼Ã°:Ý>±‹átûÕé°Ûª)å$
+£ÄÁ¶‘¹µ/!. N…Ùzê°Wâ.pl „ÓÁº°â…!R߸“OG•y—²œ ™®Õ+Å cøˆP¾·ëU é6É–+?£ÂôD˜•ZŒnMG“Ñu Æ »Æ51ŒŒl_àêiìYpɼÔ$LK­¹¿JH\ç d`
+¼
+–a“p¯Gkଯ ëÃá5³îǪÿêÄ- ÜȽ¬Í|µ/^ÄwxÒH‚
+D¤<ÐÎÿ—yÇ‘sU@E…ÎqÌ*Š‘×8P”Ì Ë¿/@f4áRÊ}^º¦ÖÒRº#›Úv°/×ˈÖFtÅŒ‚þ[åSr Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ñpJµÙ>~æÜpËLtGY­Fgá±[A —(-̃ÅÙ¶Ä ˜Þ°)Ëx™AaíF¼¨‚ÕáPâ¥V)§8·º>@ÌÔ4ûôÜÄP‰BÍÞ(dv P&máªëæßFD3zœ`·“¢ÂEàÛ=ÃBj{ †rh®ÔÐq½ ‘®³«zß&Å(uùJ¸8…B×ò5ø?Š²9Òp#ªf'Ë’•ú&_æ ùM_—¢±J6iðU£ª#E}ïãÏ^5X*‰eÃÏÖJ©>KF\¢P¯SSŒo&Œ>Ï! ·LÝ–è@±¸ˆ¤ægH@Ä9³ZI( Ž:ž()6Sq
+UŸiQc¢õFêƆEiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡šMÔºõÁùˆ4òs®øbðج–×
endobj
-1672 0 obj <<
+2096 0 obj <<
/Type /Page
-/Contents 1673 0 R
-/Resources 1671 0 R
+/Contents 2097 0 R
+/Resources 2095 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
+/Parent 2071 0 R
>> endobj
-1674 0 obj <<
-/D [1672 0 R /XYZ 85.0394 794.5015 null]
+2098 0 obj <<
+/D [2096 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-614 0 obj <<
-/D [1672 0 R /XYZ 85.0394 769.5949 null]
+742 0 obj <<
+/D [2096 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1675 0 obj <<
-/D [1672 0 R /XYZ 85.0394 573.5449 null]
+2099 0 obj <<
+/D [2096 0 R /XYZ 85.0394 573.5449 null]
>> endobj
-618 0 obj <<
-/D [1672 0 R /XYZ 85.0394 573.5449 null]
+746 0 obj <<
+/D [2096 0 R /XYZ 85.0394 573.5449 null]
>> endobj
-1676 0 obj <<
-/D [1672 0 R /XYZ 85.0394 539.0037 null]
+2100 0 obj <<
+/D [2096 0 R /XYZ 85.0394 539.0037 null]
>> endobj
-622 0 obj <<
-/D [1672 0 R /XYZ 85.0394 539.0037 null]
+750 0 obj <<
+/D [2096 0 R /XYZ 85.0394 539.0037 null]
>> endobj
-1677 0 obj <<
-/D [1672 0 R /XYZ 85.0394 510.2426 null]
+2101 0 obj <<
+/D [2096 0 R /XYZ 85.0394 510.2426 null]
>> endobj
-1671 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R >>
+2095 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1680 0 obj <<
-/Length 2810
+2104 0 obj <<
+/Length 2811
/Filter /FlateDecode
>>
stream
-xÚ­koã¸ñ{~…¿ÕbEõô²Ù$Í]/—&.Zàö€Òm«+K>QJ6÷ë;Ã!õ°•½ÚäƒÉáp8/΃b3þÙ,0ñ’Y”øNà²`–îÏÜÙÖîΘÁYX¤Åëãêìò–G³ÄIB/œ­6Z±ãÆ1›­²_æWŽçœw~wópótõ·ó…¸óOÏ4xº¹½yºy¸¾¡éýÃíÏO?]Gþ|uÿóÃù"Ž’`~õøxóðéþ_„s…]×B¯ožÏ]ýpv³ê8JÅ\Žìþvö˯î,á~8sžÄÁì&®Ã’Ä›íÏü€;Ϲ…gÏgïVõÖI-1×ñxèM¨Éó¦Ô$NÈ=®ÕôñþáHçÅóY«¼*q’Ì‚½
-EƒúœÅsYH¡dFyI+ÏòÐÈýZÖ4õ\×%QfÊ Að½øOU©¾Öy#i­ÚÐB)E]¼™mEaªƒLCÌb6;³µ-3©é-Ð( ™cNž³xËË-YÑH #¡ñÓŸ6-1ãØÝžë¸Q4Ôì0:R4óáÇ·‚Â<’•4>aòÙu½4IÞhK&„”ŠFfàVœ¹ó‡Êìϲ¼SDAóL¾È¢:ìeÙ@+©T¥=¥<–­·¦ftB%Úï¡ Θâþüµª¿Ð’f~÷"“´v¨”Ê×…$xSeâ†ë7B +@@»U­vùV´qΫµF`’Võ¡ª*I] (2F8"9!u“[WVÆŠ†qIm«MU7ª3žþ-Û=ùVÕš•¼Ìò—<kE¡´žàª±óîÃ=„»§ú‘ãã­4Áè|ÁàjÌïdiä#¹‘µ,ScÎû˜ØkùzâVMœs'öXÜE:fÈß?¾„Õ £4 v÷
-þà—šÃØ€f†à™0Š
-†Li2Za†TüÖ™/ÖyC+yîŸ3íïàLÝhOܼld½iGHÛ ”Ô‡‘Ö8R¡Fó×]žîÌPöçkD²LÖ¦2³çÐÚ‰ Pf ­G 8"ýÂ9y‘7BG!˜«T‚Üf÷ÈJ)š7h œàµM¢ùj×3b8iv4³Ó·ƒ(2‘чú]’ex2° ?Ë 2ÿ2O…j&LÈ™ñ¯E‚Šé² ™Å VAå,xÃF6¾&«¹Ïæ
-ÄD=pßíMòa‚ËØsxÌ=søUùö“ðü“<äšI<mÌ$B´ëàá–4P}#¦Ô
-÷ ×&
- ¶™ìLtÑâÏ©®ÄAÝ€}ºÚòaÁpÙ"âÖ‘ôª» è&~¯ ¡”)üaª »OÕ^XjO]4ƒ “ëûOOE. húÃ|[JúóÇÕÓ”$¤Qx²hº ÀDXækвN‰NÉØ/í
-¹·ÚÖ5 ”FE³Ã¼`Pó«è·c'ƒv51y~+PqgjÍäF@9I“Þ@H{C¿¥„«®Dýv΀¬Å‚x~5Š ?ÈS[ŸŒ[¹QµÏ·;SRUeº×"ÿ"—]»8(GBè9·µ¯çºl™­ã¥¿ÉR¸.Œ¨ñ]ndÌ–Þš{ mÑÑ™(Ù’ã( }¾Öh'J©Q'´jÓèxš`V é»— ËÚâ9Ô BCD‡
-÷ Ín©äIM AïoV·&÷&¶µHâA–ù6ý禟Åó;Óh‘è?ß!}‡0P¥´øε·²Zc¬ÜÌܾý¾ä¦T½]=š;Ù,'²ý¦9,//___QN®rGfíe^.´•.±Õ×®ðaòð¸V¡íŸ¿ÂßÄñ¸“0×"9ÍWó°ÂÆyÈ YdÛâ?:ñ߉’ Ö-; Ÿ¾uÐò—™ýØ÷èv,†[ôwxð)å‘:†ªÀï;äµ—ÇüùÈGGü}‹é°Ny)ã”òô—©¼Ë˜h1ÆDWzíOíÑÐcû³…ŽïZœ\ÙDvÞkÛ–Ø'–n¼Åz1ÍÔÄ·Q(ûIãEäöIuè²½¢SÊõÈT¶ÀÏV,d#=œ¸Qè;¾Ï@¯Œ;. þØ‹ì†ÅpÇ©ÐÕuBÓ;‘l6NUo/ëMzâ;ž9‰Ë¹:ò딕‘"N©½ç;‘ùq4|à9NÏà¦1›$°iš›Œ`¾G¨÷¾pòÀÁÏ’r¸]bþŸ¿~ö€9ÇÞô‡M/ŠJSËJ„'œÛϤ§¬ÿ¤ð endstream
+xÚ­koã¸ñ{~…¿ÕbEõ̲»É6w½\š¸hÛ*K´­®,ùD9Ùܯï g¨‡­ì-Ð&L‡Ãyq”˜¹ð/fA脉—Ì¢ÄwW³lwæÎ6°öéL0ÎÂ"-†Xï—g—·2š%Nzál¹Њ7ŽÅl™ÿ2¿v<ç(¸óO7÷7×;_x;ÿxÿDƒÇ›Û›Ç›û74½»¿ýùñ§ëóÈŸ/ï~¾?_ÄQ̯nî?Þý‹p®‘ ëZ臛§ó_—?œÝ,;Ž‡R W"»¿ýò«;ËA¸Î\G&q0{‰ëˆ$ñf»3?NàKi!åÙÓÙß;‚ƒU³uRKÂu<zjò¼)5‰JO5½¿»ÿÒyñüY5º¨+œ$ó„`/©¦As.â¹*UªUNEE+OjߪÝJ54õ\×%„´Ê T0”à»ô?u3¤úÒ­¢µzM •J›ò•·•%Ô{•µLÌb¶[Þz¨reè-Ð( ™…Nž³|-ª Y‘%†Qjð³-ŸµbƱ»=×q£h¨#ØÁ:Ò4óáÇ·‚Â<’U4>aòÙu½¬
+dþU‘¥º0¡N$;<¼q*¦cÈ2d¬‚ÊYÈ(†b|M VK_Ì5ˆ‰z¾Û›äÝ—±çÈXz|øuõú“ðü“2”†I<mÌ$BŒëàá–4P}#¦ô;
+h»zxXÑGWø ŸøxûpdGS—é³çùŸ˜Œ3;¦`²ƒ€[sƒ›&²K¼C*Ç!@þ®Û(Nê'¨u|6çfÀéà&€S2Z÷ë„c€‹»ÞÐ1Þ<Ós l³ˆú°¢àYcè>§'„)ŽN°ÕEZME‡È ¡äå-W}×q‘t¼@Ú½”î¾ç;~ 7eh˜%¥ç¤×ŸŒô‹#ýU1¯Ô0Mˆ†ÊÒ‰Müñü°×ÈUº’3›‚˜<¸wOçJ¾ sêOLŽc®6ÛòÕ¤:³êö (/rÍG×= …8£?¡prmRXÖ”aÄwâ ´QCɵµÇ¥«°¥«7¾µhÒjƒ—VBF_Z¬Î‘`|΢‰(%[
+KÌÄ­tg¹Ñä äh&ÆZéI¥”»
+À¡ìLLÑâÏ©®ÄA Ý]
+ûLµ³òa¹lIëÈ
+»õ.µÔ»h &î>>b¹`:&Ðô‡ù¶”ôçËÇ)IH£5xrÚv €‰°*V e“ œ’1/ã
+ItdöW9€°;˜
+#";"2ôoÆG‰Fõ
+EЙ­OƭܨŒÚ›-—e]s÷Z_ÔU×.Ê‘zE)míë¹®¸ÊWñ•¿ÉUêº0¢Æ÷j­bqå­¤7‘Љ’-9ŽÂÐákq¢ŒuB«×­‰§ fe°¹{ º ©-žC
+â”mÖöÑëC½Ã
+cåàföí÷¹àRõvùÀw²½šÈöëvuyùòò‚*p
+]8*?\ÕÂXé[}ãú&?kÚþù+üM\O:‰p-’Ó~å‡1ÎCN("ÛÿùøÓ‰øN”±iÙE˜øô­ƒ–¿ÌìèÇþ»G·c1Üb¾{øÃO)Ô1T~ß!¯½<æÏGþã8:âïè[L‡uÊÓH§Ô§¿Lå]ÀĈ90&ºÒK÷ðxj7ˆ†žÄ˜-t|×âÚv ª{ô^Ù¶Ä>±t‹à-Ö‹i¦'¾}¤¥¶Ÿ4žÓÂ>©]¶£÷OtJµùï‘ÊøÙJ„b¤‡7
+}Ç÷èUHÇÁ{‘Ý°î8u¢º¦Nh{'RíÚ©›Íe³ÎN|Çs#'qå1WG¾Óa²2RÄ)µ·|'r"?Ž†<ÇéÜ4†`“6MKÎü=B¿õ…S~–œÃíóÿüõ³ÿ
endobj
-1679 0 obj <<
+2103 0 obj <<
/Type /Page
-/Contents 1680 0 R
-/Resources 1678 0 R
+/Contents 2104 0 R
+/Resources 2102 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1651 0 R
-/Annots [ 1684 0 R 1685 0 R ]
+/Parent 2112 0 R
+/Annots [ 2108 0 R 2109 0 R ]
>> endobj
-1684 0 obj <<
+2108 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [253.7995 149.3637 417.685 161.4234]
/Subtype/Link/A<</Type/Action/S/URI/URI(ftp://www.isi.edu/in-notes/)>>
>> endobj
-1685 0 obj <<
+2109 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [63.4454 110.455 208.8999 120.6168]
/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.ietf.org/rfc/)>>
>> endobj
-1681 0 obj <<
-/D [1679 0 R /XYZ 56.6929 794.5015 null]
+2105 0 obj <<
+/D [2103 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-626 0 obj <<
-/D [1679 0 R /XYZ 56.6929 662.0717 null]
+754 0 obj <<
+/D [2103 0 R /XYZ 56.6929 662.0717 null]
>> endobj
-1682 0 obj <<
-/D [1679 0 R /XYZ 56.6929 624.1661 null]
+2106 0 obj <<
+/D [2103 0 R /XYZ 56.6929 624.1661 null]
>> endobj
-630 0 obj <<
-/D [1679 0 R /XYZ 56.6929 624.1661 null]
+758 0 obj <<
+/D [2103 0 R /XYZ 56.6929 624.1661 null]
>> endobj
-1140 0 obj <<
-/D [1679 0 R /XYZ 56.6929 593.0972 null]
+1515 0 obj <<
+/D [2103 0 R /XYZ 56.6929 593.0972 null]
>> endobj
-634 0 obj <<
-/D [1679 0 R /XYZ 56.6929 294.2701 null]
+762 0 obj <<
+/D [2103 0 R /XYZ 56.6929 294.2701 null]
>> endobj
-1683 0 obj <<
-/D [1679 0 R /XYZ 56.6929 255.4568 null]
+2107 0 obj <<
+/D [2103 0 R /XYZ 56.6929 255.4568 null]
>> endobj
-638 0 obj <<
-/D [1679 0 R /XYZ 56.6929 255.4568 null]
+766 0 obj <<
+/D [2103 0 R /XYZ 56.6929 255.4568 null]
>> endobj
-967 0 obj <<
-/D [1679 0 R /XYZ 56.6929 226.1045 null]
+1241 0 obj <<
+/D [2103 0 R /XYZ 56.6929 226.1045 null]
>> endobj
-1686 0 obj <<
-/D [1679 0 R /XYZ 56.6929 53.5688 null]
+2110 0 obj <<
+/D [2103 0 R /XYZ 56.6929 53.5688 null]
>> endobj
-1687 0 obj <<
-/D [1679 0 R /XYZ 56.6929 53.5688 null]
+2111 0 obj <<
+/D [2103 0 R /XYZ 56.6929 53.5688 null]
>> endobj
-1678 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F39 899 0 R /F53 1029 0 R /F11 1397 0 R /F41 939 0 R >>
+2102 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F11 1442 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1690 0 obj <<
-/Length 2825
+2115 0 obj <<
+/Length 2826
/Filter /FlateDecode
>>
stream
@@ -8407,191 +10225,192 @@ Zî–ÁÅ“ž„N(ËEHq¤;#UO«E;õ4:É$£ÇgöHm)7™FJ“>2½Ð-™'ØÃdvÀ›
À´jP'Ïå±îí0ô¾ˆpØ!f
ã3­¤%ä¶B-dU™Ï}¸­ ö‡MÐFžŒ¯ -3wÊ,Ÿw¢^ [ÖŒ*…ÅÈ´<Øû©ÍØ/cŒ ­±ïÖÙN­>Ë^vå›~¾Ñó
åçú«d>C¶K¡`Œidå7ÆÁâU<2³û»I_å Cæœ:& ôÚäLcjKy¨ÖRמZ/´EvÛÁ¶ >-÷{¹ëŠõfëÀ·@09—¬–‡JÊH…‰Åq³N¬é„`ü]þmøèœÆ(æØ>F¢aóù XäýqŸêSW±ïÚôy°Úc +ïÔàT >d mâŒ^·Ãs§÷œ¥ÅùÆgîóÝÎœø~ŸIð‘0Šüa ¹ B µT$žƒnk}àak°‘Ù!×G%ǶÚ4[Y¯†ªLÆ,<=5G±Žö\×~ïGI ¶àÏÔÿ–[áZ¨Íø¾Ï¾|¸­ÂûÀÃ
-·‘÷AŸWÏÙ6}ÍE5#P}m kkôÓÒ9áBŸÔ6"²€ÑÛÇ×H^MÖêD2ì #FEÐ|X|Ö~ѼJyÈ«m^§DRãKá%Jæ./öY®P¯ÙÙC²7Ü…¤jñ î€j“Ûÿò—¾ÖÎaŒh’8Óh¡„ðX¿”ø<ù$øôÕÿ Æ¡bxendstream
+·‘÷AŸWÏÙ6}ÍE5#P}m kkôÓÒ9áBŸÔ6"²€ÑÛÇ×H^MÖêD2ì #FEÐ|X|Ö~ѼJyÈ«m^§DRãKá%Jæ./öY®P¯ÙÙC²7Ü…¤jñ î€j“Ûÿò—¾ÖÎaŒh’8Ó(4Ÿ”r¬_Jü
+LN>D6ߟ¾û#ïbendstream
endobj
-1689 0 obj <<
+2114 0 obj <<
/Type /Page
-/Contents 1690 0 R
-/Resources 1688 0 R
+/Contents 2115 0 R
+/Resources 2113 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1691 0 obj <<
-/D [1689 0 R /XYZ 85.0394 794.5015 null]
+2116 0 obj <<
+/D [2114 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1692 0 obj <<
-/D [1689 0 R /XYZ 85.0394 752.3015 null]
+2117 0 obj <<
+/D [2114 0 R /XYZ 85.0394 752.3015 null]
>> endobj
-1693 0 obj <<
-/D [1689 0 R /XYZ 85.0394 752.3015 null]
+2118 0 obj <<
+/D [2114 0 R /XYZ 85.0394 752.3015 null]
>> endobj
-1694 0 obj <<
-/D [1689 0 R /XYZ 85.0394 752.3015 null]
+2119 0 obj <<
+/D [2114 0 R /XYZ 85.0394 752.3015 null]
>> endobj
-1695 0 obj <<
-/D [1689 0 R /XYZ 85.0394 746.3107 null]
+2120 0 obj <<
+/D [2114 0 R /XYZ 85.0394 746.3107 null]
>> endobj
-1696 0 obj <<
-/D [1689 0 R /XYZ 85.0394 731.5461 null]
+2121 0 obj <<
+/D [2114 0 R /XYZ 85.0394 731.5461 null]
>> endobj
-1697 0 obj <<
-/D [1689 0 R /XYZ 85.0394 728.1497 null]
+2122 0 obj <<
+/D [2114 0 R /XYZ 85.0394 728.1497 null]
>> endobj
-1698 0 obj <<
-/D [1689 0 R /XYZ 85.0394 713.3851 null]
+2123 0 obj <<
+/D [2114 0 R /XYZ 85.0394 713.3851 null]
>> endobj
-1699 0 obj <<
-/D [1689 0 R /XYZ 85.0394 709.9887 null]
+2124 0 obj <<
+/D [2114 0 R /XYZ 85.0394 709.9887 null]
>> endobj
-1700 0 obj <<
-/D [1689 0 R /XYZ 85.0394 651.9592 null]
+2125 0 obj <<
+/D [2114 0 R /XYZ 85.0394 651.9592 null]
>> endobj
-1083 0 obj <<
-/D [1689 0 R /XYZ 85.0394 651.9592 null]
+1372 0 obj <<
+/D [2114 0 R /XYZ 85.0394 651.9592 null]
>> endobj
-1701 0 obj <<
-/D [1689 0 R /XYZ 85.0394 651.9592 null]
+2126 0 obj <<
+/D [2114 0 R /XYZ 85.0394 651.9592 null]
>> endobj
-1702 0 obj <<
-/D [1689 0 R /XYZ 85.0394 648.8377 null]
+2127 0 obj <<
+/D [2114 0 R /XYZ 85.0394 648.8377 null]
>> endobj
-1703 0 obj <<
-/D [1689 0 R /XYZ 85.0394 634.0731 null]
+2128 0 obj <<
+/D [2114 0 R /XYZ 85.0394 634.0731 null]
>> endobj
-1704 0 obj <<
-/D [1689 0 R /XYZ 85.0394 630.6767 null]
+2129 0 obj <<
+/D [2114 0 R /XYZ 85.0394 630.6767 null]
>> endobj
-1705 0 obj <<
-/D [1689 0 R /XYZ 85.0394 615.9121 null]
+2130 0 obj <<
+/D [2114 0 R /XYZ 85.0394 615.9121 null]
>> endobj
-1706 0 obj <<
-/D [1689 0 R /XYZ 85.0394 612.5156 null]
+2131 0 obj <<
+/D [2114 0 R /XYZ 85.0394 612.5156 null]
>> endobj
-1707 0 obj <<
-/D [1689 0 R /XYZ 85.0394 585.7959 null]
+2132 0 obj <<
+/D [2114 0 R /XYZ 85.0394 585.7959 null]
>> endobj
-1708 0 obj <<
-/D [1689 0 R /XYZ 85.0394 582.3994 null]
+2133 0 obj <<
+/D [2114 0 R /XYZ 85.0394 582.3994 null]
>> endobj
-1709 0 obj <<
-/D [1689 0 R /XYZ 85.0394 567.6349 null]
+2134 0 obj <<
+/D [2114 0 R /XYZ 85.0394 567.6349 null]
>> endobj
-1710 0 obj <<
-/D [1689 0 R /XYZ 85.0394 564.2384 null]
+2135 0 obj <<
+/D [2114 0 R /XYZ 85.0394 564.2384 null]
>> endobj
-1711 0 obj <<
-/D [1689 0 R /XYZ 85.0394 549.5337 null]
+2136 0 obj <<
+/D [2114 0 R /XYZ 85.0394 549.5337 null]
>> endobj
-1712 0 obj <<
-/D [1689 0 R /XYZ 85.0394 546.0774 null]
+2137 0 obj <<
+/D [2114 0 R /XYZ 85.0394 546.0774 null]
>> endobj
-1713 0 obj <<
-/D [1689 0 R /XYZ 85.0394 531.3128 null]
+2138 0 obj <<
+/D [2114 0 R /XYZ 85.0394 531.3128 null]
>> endobj
-1714 0 obj <<
-/D [1689 0 R /XYZ 85.0394 527.9163 null]
+2139 0 obj <<
+/D [2114 0 R /XYZ 85.0394 527.9163 null]
>> endobj
-1715 0 obj <<
-/D [1689 0 R /XYZ 85.0394 513.1518 null]
+2140 0 obj <<
+/D [2114 0 R /XYZ 85.0394 513.1518 null]
>> endobj
-1716 0 obj <<
-/D [1689 0 R /XYZ 85.0394 509.7553 null]
+2141 0 obj <<
+/D [2114 0 R /XYZ 85.0394 509.7553 null]
>> endobj
-1717 0 obj <<
-/D [1689 0 R /XYZ 85.0394 483.0356 null]
+2142 0 obj <<
+/D [2114 0 R /XYZ 85.0394 483.0356 null]
>> endobj
-1718 0 obj <<
-/D [1689 0 R /XYZ 85.0394 479.6391 null]
+2143 0 obj <<
+/D [2114 0 R /XYZ 85.0394 479.6391 null]
>> endobj
-1719 0 obj <<
-/D [1689 0 R /XYZ 85.0394 464.8745 null]
+2144 0 obj <<
+/D [2114 0 R /XYZ 85.0394 464.8745 null]
>> endobj
-1720 0 obj <<
-/D [1689 0 R /XYZ 85.0394 461.4781 null]
+2145 0 obj <<
+/D [2114 0 R /XYZ 85.0394 461.4781 null]
>> endobj
-1721 0 obj <<
-/D [1689 0 R /XYZ 85.0394 446.7135 null]
+2146 0 obj <<
+/D [2114 0 R /XYZ 85.0394 446.7135 null]
>> endobj
-1722 0 obj <<
-/D [1689 0 R /XYZ 85.0394 443.3171 null]
+2147 0 obj <<
+/D [2114 0 R /XYZ 85.0394 443.3171 null]
>> endobj
-1723 0 obj <<
-/D [1689 0 R /XYZ 85.0394 428.5525 null]
+2148 0 obj <<
+/D [2114 0 R /XYZ 85.0394 428.5525 null]
>> endobj
-1724 0 obj <<
-/D [1689 0 R /XYZ 85.0394 425.156 null]
+2149 0 obj <<
+/D [2114 0 R /XYZ 85.0394 425.156 null]
>> endobj
-1725 0 obj <<
-/D [1689 0 R /XYZ 85.0394 355.0758 null]
+2150 0 obj <<
+/D [2114 0 R /XYZ 85.0394 355.0758 null]
>> endobj
-1726 0 obj <<
-/D [1689 0 R /XYZ 85.0394 355.0758 null]
+2151 0 obj <<
+/D [2114 0 R /XYZ 85.0394 355.0758 null]
>> endobj
-1727 0 obj <<
-/D [1689 0 R /XYZ 85.0394 355.0758 null]
+2152 0 obj <<
+/D [2114 0 R /XYZ 85.0394 355.0758 null]
>> endobj
-1728 0 obj <<
-/D [1689 0 R /XYZ 85.0394 352.0499 null]
+2153 0 obj <<
+/D [2114 0 R /XYZ 85.0394 352.0499 null]
>> endobj
-1729 0 obj <<
-/D [1689 0 R /XYZ 85.0394 337.3452 null]
+2154 0 obj <<
+/D [2114 0 R /XYZ 85.0394 337.3452 null]
>> endobj
-1730 0 obj <<
-/D [1689 0 R /XYZ 85.0394 333.8889 null]
+2155 0 obj <<
+/D [2114 0 R /XYZ 85.0394 333.8889 null]
>> endobj
-1731 0 obj <<
-/D [1689 0 R /XYZ 85.0394 309.8192 null]
+2156 0 obj <<
+/D [2114 0 R /XYZ 85.0394 309.8192 null]
>> endobj
-1732 0 obj <<
-/D [1689 0 R /XYZ 85.0394 303.7727 null]
+2157 0 obj <<
+/D [2114 0 R /XYZ 85.0394 303.7727 null]
>> endobj
-1733 0 obj <<
-/D [1689 0 R /XYZ 85.0394 278.3282 null]
+2158 0 obj <<
+/D [2114 0 R /XYZ 85.0394 278.3282 null]
>> endobj
-1734 0 obj <<
-/D [1689 0 R /XYZ 85.0394 273.6565 null]
+2159 0 obj <<
+/D [2114 0 R /XYZ 85.0394 273.6565 null]
>> endobj
-1735 0 obj <<
-/D [1689 0 R /XYZ 85.0394 246.9367 null]
+2160 0 obj <<
+/D [2114 0 R /XYZ 85.0394 246.9367 null]
>> endobj
-1736 0 obj <<
-/D [1689 0 R /XYZ 85.0394 243.5403 null]
+2161 0 obj <<
+/D [2114 0 R /XYZ 85.0394 243.5403 null]
>> endobj
-1737 0 obj <<
-/D [1689 0 R /XYZ 85.0394 173.5556 null]
+2162 0 obj <<
+/D [2114 0 R /XYZ 85.0394 173.5556 null]
>> endobj
-1738 0 obj <<
-/D [1689 0 R /XYZ 85.0394 173.5556 null]
+2163 0 obj <<
+/D [2114 0 R /XYZ 85.0394 173.5556 null]
>> endobj
-1739 0 obj <<
-/D [1689 0 R /XYZ 85.0394 173.5556 null]
+2164 0 obj <<
+/D [2114 0 R /XYZ 85.0394 173.5556 null]
>> endobj
-1740 0 obj <<
-/D [1689 0 R /XYZ 85.0394 170.4341 null]
+2165 0 obj <<
+/D [2114 0 R /XYZ 85.0394 170.4341 null]
>> endobj
-1741 0 obj <<
-/D [1689 0 R /XYZ 85.0394 144.9896 null]
+2166 0 obj <<
+/D [2114 0 R /XYZ 85.0394 144.9896 null]
>> endobj
-1742 0 obj <<
-/D [1689 0 R /XYZ 85.0394 140.3179 null]
+2167 0 obj <<
+/D [2114 0 R /XYZ 85.0394 140.3179 null]
>> endobj
-1743 0 obj <<
-/D [1689 0 R /XYZ 85.0394 113.5982 null]
+2168 0 obj <<
+/D [2114 0 R /XYZ 85.0394 113.5982 null]
>> endobj
-1744 0 obj <<
-/D [1689 0 R /XYZ 85.0394 110.2017 null]
+2169 0 obj <<
+/D [2114 0 R /XYZ 85.0394 110.2017 null]
>> endobj
-1745 0 obj <<
-/D [1689 0 R /XYZ 85.0394 95.4372 null]
+2170 0 obj <<
+/D [2114 0 R /XYZ 85.0394 95.4372 null]
>> endobj
-1746 0 obj <<
-/D [1689 0 R /XYZ 85.0394 92.0407 null]
+2171 0 obj <<
+/D [2114 0 R /XYZ 85.0394 92.0407 null]
>> endobj
-1688 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2113 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1750 0 obj <<
+2174 0 obj <<
/Length 2889
/Filter /FlateDecode
>>
@@ -8609,484 +10428,742 @@ id„ý4¦Õ0m¥Ñ¡¥
¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿ
ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹
…º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ã
-.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñ
+.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñ
endobj
-1749 0 obj <<
+2173 0 obj <<
/Type /Page
-/Contents 1750 0 R
-/Resources 1748 0 R
+/Contents 2174 0 R
+/Resources 2172 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1751 0 obj <<
-/D [1749 0 R /XYZ 56.6929 794.5015 null]
+2175 0 obj <<
+/D [2173 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1752 0 obj <<
-/D [1749 0 R /XYZ 56.6929 748.5056 null]
+2176 0 obj <<
+/D [2173 0 R /XYZ 56.6929 748.5056 null]
>> endobj
-1753 0 obj <<
-/D [1749 0 R /XYZ 56.6929 748.5056 null]
+2177 0 obj <<
+/D [2173 0 R /XYZ 56.6929 748.5056 null]
>> endobj
-1754 0 obj <<
-/D [1749 0 R /XYZ 56.6929 748.5056 null]
+2178 0 obj <<
+/D [2173 0 R /XYZ 56.6929 748.5056 null]
>> endobj
-1755 0 obj <<
-/D [1749 0 R /XYZ 56.6929 743.7078 null]
+2179 0 obj <<
+/D [2173 0 R /XYZ 56.6929 743.7078 null]
>> endobj
-1756 0 obj <<
-/D [1749 0 R /XYZ 56.6929 719.6381 null]
+2180 0 obj <<
+/D [2173 0 R /XYZ 56.6929 719.6381 null]
>> endobj
-1757 0 obj <<
-/D [1749 0 R /XYZ 56.6929 711.8197 null]
+2181 0 obj <<
+/D [2173 0 R /XYZ 56.6929 711.8197 null]
>> endobj
-1758 0 obj <<
-/D [1749 0 R /XYZ 56.6929 697.0552 null]
+2182 0 obj <<
+/D [2173 0 R /XYZ 56.6929 697.0552 null]
>> endobj
-1759 0 obj <<
-/D [1749 0 R /XYZ 56.6929 691.8868 null]
+2183 0 obj <<
+/D [2173 0 R /XYZ 56.6929 691.8868 null]
>> endobj
-1760 0 obj <<
-/D [1749 0 R /XYZ 56.6929 665.1671 null]
+2184 0 obj <<
+/D [2173 0 R /XYZ 56.6929 665.1671 null]
>> endobj
-1761 0 obj <<
-/D [1749 0 R /XYZ 56.6929 659.9987 null]
+2185 0 obj <<
+/D [2173 0 R /XYZ 56.6929 659.9987 null]
>> endobj
-1762 0 obj <<
-/D [1749 0 R /XYZ 56.6929 635.929 null]
+2186 0 obj <<
+/D [2173 0 R /XYZ 56.6929 635.929 null]
>> endobj
-1763 0 obj <<
-/D [1749 0 R /XYZ 56.6929 628.1106 null]
+2187 0 obj <<
+/D [2173 0 R /XYZ 56.6929 628.1106 null]
>> endobj
-1764 0 obj <<
-/D [1749 0 R /XYZ 56.6929 601.3909 null]
+2188 0 obj <<
+/D [2173 0 R /XYZ 56.6929 601.3909 null]
>> endobj
-1765 0 obj <<
-/D [1749 0 R /XYZ 56.6929 596.2225 null]
+2189 0 obj <<
+/D [2173 0 R /XYZ 56.6929 596.2225 null]
>> endobj
-1766 0 obj <<
-/D [1749 0 R /XYZ 56.6929 569.5028 null]
+2190 0 obj <<
+/D [2173 0 R /XYZ 56.6929 569.5028 null]
>> endobj
-1767 0 obj <<
-/D [1749 0 R /XYZ 56.6929 564.3344 null]
+2191 0 obj <<
+/D [2173 0 R /XYZ 56.6929 564.3344 null]
>> endobj
-1768 0 obj <<
-/D [1749 0 R /XYZ 56.6929 549.6297 null]
+2192 0 obj <<
+/D [2173 0 R /XYZ 56.6929 549.6297 null]
>> endobj
-1769 0 obj <<
-/D [1749 0 R /XYZ 56.6929 544.4015 null]
+2193 0 obj <<
+/D [2173 0 R /XYZ 56.6929 544.4015 null]
>> endobj
-1770 0 obj <<
-/D [1749 0 R /XYZ 56.6929 529.6968 null]
+2194 0 obj <<
+/D [2173 0 R /XYZ 56.6929 529.6968 null]
>> endobj
-1771 0 obj <<
-/D [1749 0 R /XYZ 56.6929 524.4686 null]
+2195 0 obj <<
+/D [2173 0 R /XYZ 56.6929 524.4686 null]
>> endobj
-1772 0 obj <<
-/D [1749 0 R /XYZ 56.6929 500.3989 null]
+2196 0 obj <<
+/D [2173 0 R /XYZ 56.6929 500.3989 null]
>> endobj
-1773 0 obj <<
-/D [1749 0 R /XYZ 56.6929 492.5805 null]
+2197 0 obj <<
+/D [2173 0 R /XYZ 56.6929 492.5805 null]
>> endobj
-1774 0 obj <<
-/D [1749 0 R /XYZ 56.6929 467.136 null]
+2198 0 obj <<
+/D [2173 0 R /XYZ 56.6929 467.136 null]
>> endobj
-1775 0 obj <<
-/D [1749 0 R /XYZ 56.6929 460.6924 null]
+2199 0 obj <<
+/D [2173 0 R /XYZ 56.6929 460.6924 null]
>> endobj
-1776 0 obj <<
-/D [1749 0 R /XYZ 56.6929 436.6227 null]
+2200 0 obj <<
+/D [2173 0 R /XYZ 56.6929 436.6227 null]
>> endobj
-1777 0 obj <<
-/D [1749 0 R /XYZ 56.6929 428.8043 null]
+2201 0 obj <<
+/D [2173 0 R /XYZ 56.6929 428.8043 null]
>> endobj
-1778 0 obj <<
-/D [1749 0 R /XYZ 56.6929 414.0996 null]
+2202 0 obj <<
+/D [2173 0 R /XYZ 56.6929 414.0996 null]
>> endobj
-1779 0 obj <<
-/D [1749 0 R /XYZ 56.6929 408.8714 null]
+2203 0 obj <<
+/D [2173 0 R /XYZ 56.6929 408.8714 null]
>> endobj
-1780 0 obj <<
-/D [1749 0 R /XYZ 56.6929 382.1516 null]
+2204 0 obj <<
+/D [2173 0 R /XYZ 56.6929 382.1516 null]
>> endobj
-1781 0 obj <<
-/D [1749 0 R /XYZ 56.6929 376.9833 null]
+2205 0 obj <<
+/D [2173 0 R /XYZ 56.6929 376.9833 null]
>> endobj
-1782 0 obj <<
-/D [1749 0 R /XYZ 56.6929 350.2636 null]
+2206 0 obj <<
+/D [2173 0 R /XYZ 56.6929 350.2636 null]
>> endobj
-1783 0 obj <<
-/D [1749 0 R /XYZ 56.6929 345.0952 null]
+2207 0 obj <<
+/D [2173 0 R /XYZ 56.6929 345.0952 null]
>> endobj
-1784 0 obj <<
-/D [1749 0 R /XYZ 56.6929 321.0255 null]
+2208 0 obj <<
+/D [2173 0 R /XYZ 56.6929 321.0255 null]
>> endobj
-1785 0 obj <<
-/D [1749 0 R /XYZ 56.6929 313.2071 null]
+2209 0 obj <<
+/D [2173 0 R /XYZ 56.6929 313.2071 null]
>> endobj
-1786 0 obj <<
-/D [1749 0 R /XYZ 56.6929 298.5024 null]
+2210 0 obj <<
+/D [2173 0 R /XYZ 56.6929 298.5024 null]
>> endobj
-1787 0 obj <<
-/D [1749 0 R /XYZ 56.6929 293.2742 null]
+2211 0 obj <<
+/D [2173 0 R /XYZ 56.6929 293.2742 null]
>> endobj
-1788 0 obj <<
-/D [1749 0 R /XYZ 56.6929 267.8297 null]
+2212 0 obj <<
+/D [2173 0 R /XYZ 56.6929 267.8297 null]
>> endobj
-1789 0 obj <<
-/D [1749 0 R /XYZ 56.6929 261.3861 null]
+2213 0 obj <<
+/D [2173 0 R /XYZ 56.6929 261.3861 null]
>> endobj
-1790 0 obj <<
-/D [1749 0 R /XYZ 56.6929 199.468 null]
+2214 0 obj <<
+/D [2173 0 R /XYZ 56.6929 199.468 null]
>> endobj
-1791 0 obj <<
-/D [1749 0 R /XYZ 56.6929 199.468 null]
+2215 0 obj <<
+/D [2173 0 R /XYZ 56.6929 199.468 null]
>> endobj
-1792 0 obj <<
-/D [1749 0 R /XYZ 56.6929 199.468 null]
+2216 0 obj <<
+/D [2173 0 R /XYZ 56.6929 199.468 null]
>> endobj
-1793 0 obj <<
-/D [1749 0 R /XYZ 56.6929 191.7053 null]
+2217 0 obj <<
+/D [2173 0 R /XYZ 56.6929 191.7053 null]
>> endobj
-1794 0 obj <<
-/D [1749 0 R /XYZ 56.6929 176.9408 null]
+2218 0 obj <<
+/D [2173 0 R /XYZ 56.6929 176.9408 null]
>> endobj
-1795 0 obj <<
-/D [1749 0 R /XYZ 56.6929 171.7724 null]
+2219 0 obj <<
+/D [2173 0 R /XYZ 56.6929 171.7724 null]
>> endobj
-1796 0 obj <<
-/D [1749 0 R /XYZ 56.6929 157.0677 null]
+2220 0 obj <<
+/D [2173 0 R /XYZ 56.6929 157.0677 null]
>> endobj
-1797 0 obj <<
-/D [1749 0 R /XYZ 56.6929 151.8395 null]
+2221 0 obj <<
+/D [2173 0 R /XYZ 56.6929 151.8395 null]
>> endobj
-1798 0 obj <<
-/D [1749 0 R /XYZ 56.6929 137.1348 null]
+2222 0 obj <<
+/D [2173 0 R /XYZ 56.6929 137.1348 null]
>> endobj
-1799 0 obj <<
-/D [1749 0 R /XYZ 56.6929 131.9066 null]
+2223 0 obj <<
+/D [2173 0 R /XYZ 56.6929 131.9066 null]
>> endobj
-1800 0 obj <<
-/D [1749 0 R /XYZ 56.6929 117.2018 null]
+2224 0 obj <<
+/D [2173 0 R /XYZ 56.6929 117.2018 null]
>> endobj
-1801 0 obj <<
-/D [1749 0 R /XYZ 56.6929 111.9736 null]
+2225 0 obj <<
+/D [2173 0 R /XYZ 56.6929 111.9736 null]
>> endobj
-1802 0 obj <<
-/D [1749 0 R /XYZ 56.6929 97.2091 null]
+2226 0 obj <<
+/D [2173 0 R /XYZ 56.6929 97.2091 null]
>> endobj
-1803 0 obj <<
-/D [1749 0 R /XYZ 56.6929 92.0407 null]
+2227 0 obj <<
+/D [2173 0 R /XYZ 56.6929 92.0407 null]
>> endobj
-1748 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2172 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1806 0 obj <<
-/Length 2545
+2230 0 obj <<
+/Length 2542
/Filter /FlateDecode
>>
stream
-xÚ¥ZKs㸾ûWè(U€ øÈM¶l&3¶#y²IÍî–`™ŠTHʳ³¿> âA" É¦|0 4ñýu7º›ÂxS‘$˜DIàQ„éd{¸B“=ÌÝ_a)3WBsSêúùê/w$š$^úáäùÕX+öPãÉóîÛtñôtû°\ýs6÷)š.¼Ùœ"¤Fon7³y&|‚ð©M¯WןW÷ëÅÓlj‡~E-–âfóõþþvó|+o×·‹åêáDðì·çOW·ÏúµÍ­aDø;ÿçêÛoh²ƒ~ºBIb:ù7ÈÃIâOW% Q#ùÕæêïzAc¶}tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6b[GV¥MVµuWÃ[\ KˈðÇÈ2ýÛúîE~bbŠ¼8÷w€j™!*\v¨˜R/Ž5a—å!Í
-±ïtwÈŠ¬n`óeU‹±²ÓE{¿?e;æñwl ‡Ô â0†âë~â_<ñÿsÙÀš³(På;;¼°JÜá$Ž<«²8_ÚC݆”CáJJ«œ’È¡r´¡ô!¶Eí&øMy8”RñÚò–i“Š«»,gâê¦,~EÈߟbð¶ªf8žršF¨
-i’|œ8Hrà €-È_k©îòuà8‹<KkV˜z`Í÷²úwGQ¶eã…±ùA0~’|LYÞ(§Ó$­åô/ܪlÿÖXŠd/!˜û$ñ(…¼bø¼ˆ°ÂU6WH;Ìþ`Ì<4¹ÙYó%^Œð…LÁ”²³®¥4í±Oí´;¡;Þϰljï/`ça8}žaŒ}Þê%Œ@ù>š²—¿Îæ$𧫺>µV
-)ÒI8² ×à|
-ý¨ŸF,<•Âÿ”³Ÿå ØÅ%È<Aœˆê„YмbyÚ¨dµæœ!4ò/䦔Ì””®¦ t˜‘ Ú0£!¶ÅŒLð¯ukâ ‡*«suÈLn~
-örÚï9 # <‚ÍÄÃ^yÞ,¡´t’À®â
-¬¸ulH9”¬¤:-'WqBjb[ôl‚k}nNÇcY5u.ÓjðÃÊ¢oxaLýžg^ ©C•Õ[¥ôűÊr­qj׸{(Š/´zL)‡Æ•TW³Ž<Ö mh|ˆmѸ ¾še{ÕY¸NëìÌΞ*lóR¤³£­×´O£n$þ4=íßDR:fúö(Al8¾PN˜R"””&‚Ž*Ò m1Ķa‚ë!Ô9
-.¤¦”ƒ(%¥™‚³ÙÁ” Ú jˆmáÊ_ò/o<“mÝ$ átqjÞ@å œ8ïL ‰8ȯd“›ßDÓwÞoGßD!Ë~Ï«²´näz»˜¬ëQ§" s Ì8 :Ô’¯ðQ¬¾kÛß|Rä¢y¦žîB Ò· U”P¾ì™R"•”&2A.—sAD±-Dšà:§[=½‡*ãGG•u—ä}á¸çŸVó¬`ãßô—ð£s4§^ž*í©úB¹ÚêM°®œmÃŽ‘z
-Æâ¶SÊn Zʨ¢‡¢º³…3ìq[è [ðÃém×4»6zÂÿ{Vî«ôøNš‹‘ÏŽ3ô½˜ÒÄlŽâé'¼KÅ÷G–çr¦ýbâCµ¼};å09º‘òO9Ëš‚éïŽK.an)e èØ•EöAf:
-¿×ùJ8Œx ½àƒb%¥óž0rÊNhƒâ!¶…bü:+ô±õ9}aªfÎÎNÚÑšB¶@,õD$ãŸÁnªôû«è‘ìT08íOu£yH¬<@(A@¤›CÈ΂ê>IEŽ:Ú…Ûq0§ÀDNc8 Ï*D²÷MÉÿ›Å5 ʨ WÆy(ö{1°Wßõcå°Êš'néãE8›@Qd6=âDÐ÷éê–•ç¦|°çV7êsç)3~§ñé”ÿÌç'žVQ[G:Àÿß?È2ú“‘Gb[Ï… 2õ$R/Å7—$Ã7׿Ü:õÿo÷±endstream
-endobj
-1805 0 obj <<
+xÚ¥Z[w£º~ϯð£½Ö˜Jqé›'Og’ÔÎô´kÎy ¶â°ŠÁœ9s~}·Ð‘<=]yH>Øß¾c<Að‡'1õI‚I”E˜N¶‡+4ÙÃÞý–2s%47¥®Ÿ¯þrG¢Iâ%¡Nž_{ÅŠc<yÞ}›.žžn–«Îæ>EÓ…7›S„ÔêÍíf6„o¾¢éõêúóêñ~½xúø/qѯˆ¢ÅÃRœl¾Þßßnžoåéúv±\=܃žýöüéêöY?¶ùjþÌÿ¹úöšìà ?]!$1|‡äá$ñ'‡«€„¨•üjsõw}Cc·½tLU”ÄýhDW>ž`ì%”ú=eÑÄ ‰OZe-6⵬J›¬,jë[ Oq.-#À#KÈpôoë»Pùmˆ‰)òâžßªe†¨pØ¡bJ½8"Ô„]–‡4+Ä{§»CVdu/_VµX+;]´çûS¶cÆÁ+ázAÆð@ü¾„øOüÿ\6pÏY¨‡ò^X%ÎpGžUÙ@œ/mÈ¡nCÊ¡p%¥UNIäP¹ ÚPúÛ¢vü¦<J©xmyË´IÅÑ]–3qtS¿"äïO‚±x[U3O9M#T€2ƒ0 }*žfØO¦’kƪ†R¹÷¸mJƒŒ„XÉ èB¨2¥ìdh)MF‚};N莌3ìq2zà£dè0æÒ?ŠÝŸ¥ÄÇÔ ãØïS²Tl¤•éw쥚ÅÓSZýÐŒ„vF"xsŠâ ŒRF””bÄG9qAŒ ±-Œ˜àgÊ¿©²†U™t×Rëº,QÒƒô˜ «ÞYUF©(ŒÃ>×’‡/iQdÅ~ÀvÏqþ1£tšýž1‹ç8x}„¾@S'ä`I
+i’|œ8Hrà €-È_k©îòuà8‹<KkV˜z`Í÷²úwGQ¶eã…±ùA0žI>¦‡,o”Ói’ÖrûîGU¶k,E
+²WÌ}’x”B]1|DXáª
+)ÒI8² ×à|
+D}`k°ùzH‹v;–<óç‘<k˜¹mP7,ÏKÍt ²}Ó|Û«"
+éÿBp7¥Œ+)ƒrì Ümp>Ķn‚sF…‹±#ø4¥ w}vÓT`j¯K‚^ñÒ•‹µ±ŸïÄQ¾¯Ì‡‹è8:4‰8Œmúp€ÂŽq~ƒqq¯–p¾óE®nÒ#ü:O‹íkþáAL ƒº”ÍM);áZÊ ÜQ;¡;ÂÏ°Ç ï?ŠÛrÇx
+ÈLíª¯ÝƒïüÂÙ)óWy~„{¹ÿý_ýò£ Šòr,4æ0[ÄV>ýˆzQx)]˜Rv>µTÇ'uNèŽÏ3ìq>{à =}gE7½S.%«‚ó©êÏrjÇtå¬Q„Gõ1þYoÓm»›x1xé„´H!]Ò£ÈÑùp RÀN ä5ƒnŒ°­Q3+ZÄpEdôºP•:¢ þ0yCA»/ÁóêÁЯ%k”"J¼8 õ÷'IQ猣o(À±&B½
+endobj
+2229 0 obj <<
/Type /Page
-/Contents 1806 0 R
-/Resources 1804 0 R
+/Contents 2230 0 R
+/Resources 2228 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1807 0 obj <<
-/D [1805 0 R /XYZ 85.0394 794.5015 null]
+2231 0 obj <<
+/D [2229 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1808 0 obj <<
-/D [1805 0 R /XYZ 85.0394 748.4854 null]
+2232 0 obj <<
+/D [2229 0 R /XYZ 85.0394 748.4854 null]
>> endobj
-1809 0 obj <<
-/D [1805 0 R /XYZ 85.0394 748.4854 null]
+2233 0 obj <<
+/D [2229 0 R /XYZ 85.0394 748.4854 null]
>> endobj
-1810 0 obj <<
-/D [1805 0 R /XYZ 85.0394 748.4854 null]
+2234 0 obj <<
+/D [2229 0 R /XYZ 85.0394 748.4854 null]
>> endobj
-1811 0 obj <<
-/D [1805 0 R /XYZ 85.0394 743.3452 null]
+2235 0 obj <<
+/D [2229 0 R /XYZ 85.0394 743.3452 null]
>> endobj
-1812 0 obj <<
-/D [1805 0 R /XYZ 85.0394 728.6405 null]
+2236 0 obj <<
+/D [2229 0 R /XYZ 85.0394 728.6405 null]
>> endobj
-1813 0 obj <<
-/D [1805 0 R /XYZ 85.0394 723.1655 null]
+2237 0 obj <<
+/D [2229 0 R /XYZ 85.0394 723.1655 null]
>> endobj
-1814 0 obj <<
-/D [1805 0 R /XYZ 85.0394 708.4607 null]
+2238 0 obj <<
+/D [2229 0 R /XYZ 85.0394 708.4607 null]
>> endobj
-1815 0 obj <<
-/D [1805 0 R /XYZ 85.0394 702.9857 null]
+2239 0 obj <<
+/D [2229 0 R /XYZ 85.0394 702.9857 null]
>> endobj
-1816 0 obj <<
-/D [1805 0 R /XYZ 85.0394 688.2211 null]
+2240 0 obj <<
+/D [2229 0 R /XYZ 85.0394 688.2211 null]
>> endobj
-1817 0 obj <<
-/D [1805 0 R /XYZ 85.0394 682.8059 null]
+2241 0 obj <<
+/D [2229 0 R /XYZ 85.0394 682.8059 null]
>> endobj
-1818 0 obj <<
-/D [1805 0 R /XYZ 85.0394 668.0414 null]
+2242 0 obj <<
+/D [2229 0 R /XYZ 85.0394 668.0414 null]
>> endobj
-1819 0 obj <<
-/D [1805 0 R /XYZ 85.0394 662.6262 null]
+2243 0 obj <<
+/D [2229 0 R /XYZ 85.0394 662.6262 null]
>> endobj
-1820 0 obj <<
-/D [1805 0 R /XYZ 85.0394 599.7666 null]
+2244 0 obj <<
+/D [2229 0 R /XYZ 85.0394 599.7666 null]
>> endobj
-1821 0 obj <<
-/D [1805 0 R /XYZ 85.0394 599.7666 null]
+2245 0 obj <<
+/D [2229 0 R /XYZ 85.0394 599.7666 null]
>> endobj
-1822 0 obj <<
-/D [1805 0 R /XYZ 85.0394 599.7666 null]
+2246 0 obj <<
+/D [2229 0 R /XYZ 85.0394 599.7666 null]
>> endobj
-1823 0 obj <<
-/D [1805 0 R /XYZ 85.0394 591.7571 null]
+2247 0 obj <<
+/D [2229 0 R /XYZ 85.0394 591.7571 null]
>> endobj
-1824 0 obj <<
-/D [1805 0 R /XYZ 85.0394 565.0374 null]
+2248 0 obj <<
+/D [2229 0 R /XYZ 85.0394 565.0374 null]
>> endobj
-1825 0 obj <<
-/D [1805 0 R /XYZ 85.0394 559.6222 null]
+2249 0 obj <<
+/D [2229 0 R /XYZ 85.0394 559.6222 null]
>> endobj
-1826 0 obj <<
-/D [1805 0 R /XYZ 85.0394 534.1777 null]
+2250 0 obj <<
+/D [2229 0 R /XYZ 85.0394 534.1777 null]
>> endobj
-1827 0 obj <<
-/D [1805 0 R /XYZ 85.0394 527.4872 null]
+2251 0 obj <<
+/D [2229 0 R /XYZ 85.0394 527.4872 null]
>> endobj
-1828 0 obj <<
-/D [1805 0 R /XYZ 85.0394 502.0427 null]
+2252 0 obj <<
+/D [2229 0 R /XYZ 85.0394 502.0427 null]
>> endobj
-1829 0 obj <<
-/D [1805 0 R /XYZ 85.0394 495.3523 null]
+2253 0 obj <<
+/D [2229 0 R /XYZ 85.0394 495.3523 null]
>> endobj
-1830 0 obj <<
-/D [1805 0 R /XYZ 85.0394 420.5376 null]
+2254 0 obj <<
+/D [2229 0 R /XYZ 85.0394 420.5376 null]
>> endobj
-1831 0 obj <<
-/D [1805 0 R /XYZ 85.0394 420.5376 null]
+2255 0 obj <<
+/D [2229 0 R /XYZ 85.0394 420.5376 null]
>> endobj
-1832 0 obj <<
-/D [1805 0 R /XYZ 85.0394 420.5376 null]
+2256 0 obj <<
+/D [2229 0 R /XYZ 85.0394 420.5376 null]
>> endobj
-1833 0 obj <<
-/D [1805 0 R /XYZ 85.0394 412.5281 null]
+2257 0 obj <<
+/D [2229 0 R /XYZ 85.0394 412.5281 null]
>> endobj
-1834 0 obj <<
-/D [1805 0 R /XYZ 85.0394 388.4584 null]
+2258 0 obj <<
+/D [2229 0 R /XYZ 85.0394 388.4584 null]
>> endobj
-1835 0 obj <<
-/D [1805 0 R /XYZ 85.0394 380.3932 null]
+2259 0 obj <<
+/D [2229 0 R /XYZ 85.0394 380.3932 null]
>> endobj
-1836 0 obj <<
-/D [1805 0 R /XYZ 85.0394 365.6884 null]
+2260 0 obj <<
+/D [2229 0 R /XYZ 85.0394 365.6884 null]
>> endobj
-1837 0 obj <<
-/D [1805 0 R /XYZ 85.0394 360.2134 null]
+2261 0 obj <<
+/D [2229 0 R /XYZ 85.0394 360.2134 null]
>> endobj
-1838 0 obj <<
-/D [1805 0 R /XYZ 85.0394 345.4488 null]
+2262 0 obj <<
+/D [2229 0 R /XYZ 85.0394 345.4488 null]
>> endobj
-1839 0 obj <<
-/D [1805 0 R /XYZ 85.0394 340.0336 null]
+2263 0 obj <<
+/D [2229 0 R /XYZ 85.0394 340.0336 null]
>> endobj
-1840 0 obj <<
-/D [1805 0 R /XYZ 85.0394 325.269 null]
+2264 0 obj <<
+/D [2229 0 R /XYZ 85.0394 325.269 null]
>> endobj
-1841 0 obj <<
-/D [1805 0 R /XYZ 85.0394 319.8539 null]
+2265 0 obj <<
+/D [2229 0 R /XYZ 85.0394 319.8539 null]
>> endobj
-1842 0 obj <<
-/D [1805 0 R /XYZ 85.0394 295.7842 null]
+2266 0 obj <<
+/D [2229 0 R /XYZ 85.0394 295.7842 null]
>> endobj
-1843 0 obj <<
-/D [1805 0 R /XYZ 85.0394 287.7189 null]
+2267 0 obj <<
+/D [2229 0 R /XYZ 85.0394 287.7189 null]
>> endobj
-1844 0 obj <<
-/D [1805 0 R /XYZ 85.0394 272.9543 null]
+2268 0 obj <<
+/D [2229 0 R /XYZ 85.0394 272.9543 null]
>> endobj
-1845 0 obj <<
-/D [1805 0 R /XYZ 85.0394 267.5392 null]
+2269 0 obj <<
+/D [2229 0 R /XYZ 85.0394 267.5392 null]
>> endobj
-1846 0 obj <<
-/D [1805 0 R /XYZ 85.0394 252.7746 null]
+2270 0 obj <<
+/D [2229 0 R /XYZ 85.0394 252.7746 null]
>> endobj
-1847 0 obj <<
-/D [1805 0 R /XYZ 85.0394 247.3594 null]
+2271 0 obj <<
+/D [2229 0 R /XYZ 85.0394 247.3594 null]
>> endobj
-1848 0 obj <<
-/D [1805 0 R /XYZ 85.0394 223.2897 null]
+2272 0 obj <<
+/D [2229 0 R /XYZ 85.0394 223.2897 null]
>> endobj
-1849 0 obj <<
-/D [1805 0 R /XYZ 85.0394 215.2245 null]
+2273 0 obj <<
+/D [2229 0 R /XYZ 85.0394 215.2245 null]
>> endobj
-1850 0 obj <<
-/D [1805 0 R /XYZ 85.0394 149.4956 null]
+2274 0 obj <<
+/D [2229 0 R /XYZ 85.0394 149.4956 null]
>> endobj
-1851 0 obj <<
-/D [1805 0 R /XYZ 85.0394 149.4956 null]
+2275 0 obj <<
+/D [2229 0 R /XYZ 85.0394 149.4956 null]
>> endobj
-1852 0 obj <<
-/D [1805 0 R /XYZ 85.0394 149.4956 null]
+2276 0 obj <<
+/D [2229 0 R /XYZ 85.0394 149.4956 null]
>> endobj
-1853 0 obj <<
-/D [1805 0 R /XYZ 85.0394 144.3554 null]
+2277 0 obj <<
+/D [2229 0 R /XYZ 85.0394 144.3554 null]
>> endobj
-1854 0 obj <<
-/D [1805 0 R /XYZ 85.0394 120.2857 null]
+2278 0 obj <<
+/D [2229 0 R /XYZ 85.0394 120.2857 null]
>> endobj
-1855 0 obj <<
-/D [1805 0 R /XYZ 85.0394 112.2205 null]
+2279 0 obj <<
+/D [2229 0 R /XYZ 85.0394 112.2205 null]
>> endobj
-1856 0 obj <<
-/D [1805 0 R /XYZ 85.0394 97.4559 null]
+2280 0 obj <<
+/D [2229 0 R /XYZ 85.0394 97.4559 null]
>> endobj
-1857 0 obj <<
-/D [1805 0 R /XYZ 85.0394 92.0407 null]
+2281 0 obj <<
+/D [2229 0 R /XYZ 85.0394 92.0407 null]
>> endobj
-1804 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+2228 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1860 0 obj <<
-/Length 2121
+2284 0 obj <<
+/Length 2928
/Filter /FlateDecode
>>
stream
-xÚ¥YIs㸾ûWèª*B°pÍM¶ÔŽ»=¶cy*™t÷¦`‰eŠÔˆ”»5¿>x J$5•”Äòà}x 6¢ðc#Ï'~Ä£Q¹Ä£Ì%›+:ZÁÜí34“šhbS]¿\ýí“F‰|î^Þ,Y!¡aÈF/˯Δ2 Ô¹¾»¾¿{¼}ž>ýã·ñ„{ÔùF=:}˜agñëíí|ñ27Ýçùtv÷p $l< üˆ:Ó§§ùÃìîß8?URi3z3_Œ¿¿|¾š¿4˶·Æ¨Pkþýêëw:ZÂ?_Q"¢Ðý€%,Šøhsåz‚x®õHvµ¸úg#Кլ¦b”páó[q6bŒDžÇ[Æò"â .´±_Ë"“•\âg c™ìwiu0¦ùtSönV¸Ð Ñ-*\ﱦRKû
-Z9õ½ï§šç`/VÝPë‘¥›ñ€x<hëž›8ÍÇ—Sç!ÞHÕbÎâPVrƒ£G©™ùÏJæeZäÚL'»c!%Aø°.%û¯Àâ gF k\VYü.Ç g\GìÆ,t–¨'ÎMãÆЉ÷o›87R>Çù>Þ”VØr­hÒÀúà\¤=ê’ê
-›ª‹†ªÃ~4¨úˆÆ™îN8Zº/Û¿h†ý($Š¼ÿƒ_bÝMÖ Q?~H"\ÈK6Õ
-¸÷‹Š{Jð/qYÊŽéZA/‰E©¢
-\§Il‡·îLx‹j
-aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp
-uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉WÃ
-BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚
-ÓÙ„õç‘A­Ç<r¦¶3´´b¡žq+êÛ–²íC@ …ñç)ÞgÈ4ÍàÂõlj¤8Nš¼ëøýût¯™ çö°KWk\F,an¨þ^¡æ9Á%@?.aÂIàG°O‹îe^×å€ÃúúdQâÚò5.«b[èhAöfúwœyüË3¤™yÂçžÒur¥kª‘)\+’ÎrÙ[tÀaUuàE›cýÿ/eU/aßU„f¿^”6 ¥gK¯ÿÁ:_ûl«½endstream
-endobj
-1859 0 obj <<
+xÚ¥ZKs㸾ûWèºjÅ
+<ÃL[µFÛ„¦2q¦âØ—r“§Ôùm»”m6dÂ]ßK, Õ\—¾HMÖ(êÞl[ç5Gñcᆰñq<l®Óxt\ñ¦QÕ<ÞéÄ£§ûüù÷Ã͸7EÂM’àÀàW©ºéºÃ!9Cè»O£38X\#8.ƒƒ`,ÁaLµ…ñîalÝÇlT»ÃAÄ‘ó 2Ââæ
+Z\sä«2/WÔ™íÚu¥øßãä…’Vb=Ïs>¸4ñŸ—^³¢
+>4°îëEáz—S×綹e¦%]×ò¹*©^a ÆT6Z³âÀÌ‚6•}·×>”Ý!AGµ«Ýj=]â"¾Uõ‹*Aqþ²Jw¨LÿªúÄñ¾æ›r•—YVëéú°eóBÌpÜäÂøÚÄatÑãë{‘^£*abG]*£ÈÉ 
+-S¢&ôjô°§Š[š^@-]âó•"6­\e µ©ü
+eöšÕ÷+
+îÜn¶E†ýªÖÒ»ó‰©Üa¢ -rʪժ«þ6š¹’æÅÍs,¨!ÕW8æÆ“¿Êm)61!Rõÿž¸šuµ+4UiÅÆSFß?v½±£Êj@KsMòÕù(¥öŒV_Ñƺ»²€cÖüiZm¦Cøle™+éœ9O{ú’E@c™7i!óÊ¡j@¶‹f>!t¾yž6×PW-¾„bµ"Ö¦q‘†è¡±–¯Zˆ¤O‘?g ,zÊZáÛä?¨±©Êv­ç‚½›%¾­s¸rlT¯8°W ef½jwG†mõ¸§žôT’ëzBª'f08°÷AAè p"Lµbá…aç©ÚéX¡~èäÂÄ;¹ž véëÈsV£|s÷"Ïeqäg›ë}6᜹À&ÂT:á§ɨÖC"y§v0‘ô´R"aö+ÚGe/:„ì +äÃœ¹+hÒ¬€{ןG’®À,œ<}Qú_òNä>”œÛ}¯Ö*»LxÃükaú‘Ò
+¥ë,ž'šž^¦°ƒŽ_R‡­„>+²(»¡°Ä¼Õ2r•´0b¯P+Ê3=ØTô¥¸E-ŒØJ¥VŒ¡—'/ôvEÙæœâýt+ëVåv[äôzÖ Å™MÕ…À)“M^à 1ÊßošžÊ¢ *¬hC´ÃFuxZ‘ƒQv{BŠŠ© ÓvÞ÷±0Àª& •kã^.õS…RUiªÑ½‘ÿQIh
+® ,¸è«ª íEšN¡hKÂsÚZ–LµYÃÈ[Þ®©%éƒÞš§»BÖÔo²úõPá óAÖ²û9Ø(ããûÃ÷VSì¡Á ø9-]@ öné>Ã
+\˜šE©º¬ôxéæ‚Þ¯ý¿Ô! Jendstream
+endobj
+2283 0 obj <<
/Type /Page
-/Contents 1860 0 R
-/Resources 1858 0 R
+/Contents 2284 0 R
+/Resources 2282 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2112 0 R
>> endobj
-1861 0 obj <<
-/D [1859 0 R /XYZ 56.6929 794.5015 null]
+2285 0 obj <<
+/D [2283 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1862 0 obj <<
-/D [1859 0 R /XYZ 56.6929 749.4437 null]
+2286 0 obj <<
+/D [2283 0 R /XYZ 56.6929 749.0089 null]
>> endobj
-1863 0 obj <<
-/D [1859 0 R /XYZ 56.6929 749.4437 null]
+2287 0 obj <<
+/D [2283 0 R /XYZ 56.6929 749.0089 null]
>> endobj
-1864 0 obj <<
-/D [1859 0 R /XYZ 56.6929 749.4437 null]
+2288 0 obj <<
+/D [2283 0 R /XYZ 56.6929 749.0089 null]
>> endobj
-1865 0 obj <<
-/D [1859 0 R /XYZ 56.6929 746.6461 null]
+2289 0 obj <<
+/D [2283 0 R /XYZ 56.6929 745.2843 null]
>> endobj
-1866 0 obj <<
-/D [1859 0 R /XYZ 56.6929 722.5763 null]
+2290 0 obj <<
+/D [2283 0 R /XYZ 56.6929 721.2146 null]
>> endobj
-1867 0 obj <<
-/D [1859 0 R /XYZ 56.6929 716.7581 null]
+2291 0 obj <<
+/D [2283 0 R /XYZ 56.6929 714.4694 null]
>> endobj
-1868 0 obj <<
-/D [1859 0 R /XYZ 56.6929 701.9936 null]
+2292 0 obj <<
+/D [2283 0 R /XYZ 56.6929 699.7048 null]
>> endobj
-1869 0 obj <<
-/D [1859 0 R /XYZ 56.6929 698.8254 null]
+2293 0 obj <<
+/D [2283 0 R /XYZ 56.6929 695.6096 null]
>> endobj
-1870 0 obj <<
-/D [1859 0 R /XYZ 56.6929 684.1207 null]
+2294 0 obj <<
+/D [2283 0 R /XYZ 56.6929 680.9049 null]
>> endobj
-1871 0 obj <<
-/D [1859 0 R /XYZ 56.6929 680.8926 null]
+2295 0 obj <<
+/D [2283 0 R /XYZ 56.6929 676.7499 null]
>> endobj
-1872 0 obj <<
-/D [1859 0 R /XYZ 56.6929 656.8229 null]
+2296 0 obj <<
+/D [2283 0 R /XYZ 56.6929 652.6802 null]
>> endobj
-1873 0 obj <<
-/D [1859 0 R /XYZ 56.6929 651.0047 null]
+2297 0 obj <<
+/D [2283 0 R /XYZ 56.6929 645.935 null]
>> endobj
-1874 0 obj <<
-/D [1859 0 R /XYZ 56.6929 636.3 null]
+2298 0 obj <<
+/D [2283 0 R /XYZ 56.6929 631.2303 null]
>> endobj
-1875 0 obj <<
-/D [1859 0 R /XYZ 56.6929 633.072 null]
+2299 0 obj <<
+/D [2283 0 R /XYZ 56.6929 627.0752 null]
>> endobj
-1876 0 obj <<
-/D [1859 0 R /XYZ 56.6929 609.0023 null]
+2300 0 obj <<
+/D [2283 0 R /XYZ 56.6929 603.0055 null]
>> endobj
-1877 0 obj <<
-/D [1859 0 R /XYZ 56.6929 603.184 null]
+2301 0 obj <<
+/D [2283 0 R /XYZ 56.6929 596.2603 null]
>> endobj
-1878 0 obj <<
-/D [1859 0 R /XYZ 56.6929 579.1143 null]
+2302 0 obj <<
+/D [2283 0 R /XYZ 56.6929 572.1906 null]
>> endobj
-1879 0 obj <<
-/D [1859 0 R /XYZ 56.6929 573.2961 null]
+2303 0 obj <<
+/D [2283 0 R /XYZ 56.6929 565.4454 null]
>> endobj
-1880 0 obj <<
-/D [1859 0 R /XYZ 56.6929 558.5914 null]
+2304 0 obj <<
+/D [2283 0 R /XYZ 56.6929 550.7407 null]
>> endobj
-1881 0 obj <<
-/D [1859 0 R /XYZ 56.6929 555.3634 null]
+2305 0 obj <<
+/D [2283 0 R /XYZ 56.6929 546.5857 null]
>> endobj
-1882 0 obj <<
-/D [1859 0 R /XYZ 56.6929 540.5988 null]
+2306 0 obj <<
+/D [2283 0 R /XYZ 56.6929 531.8211 null]
>> endobj
-1883 0 obj <<
-/D [1859 0 R /XYZ 56.6929 537.4306 null]
+2307 0 obj <<
+/D [2283 0 R /XYZ 56.6929 527.7259 null]
>> endobj
-1884 0 obj <<
-/D [1859 0 R /XYZ 56.6929 510.7109 null]
+2308 0 obj <<
+/D [2283 0 R /XYZ 56.6929 501.0062 null]
>> endobj
-1885 0 obj <<
-/D [1859 0 R /XYZ 56.6929 507.5427 null]
+2309 0 obj <<
+/D [2283 0 R /XYZ 56.6929 496.911 null]
>> endobj
-642 0 obj <<
-/D [1859 0 R /XYZ 56.6929 477.5928 null]
+770 0 obj <<
+/D [2283 0 R /XYZ 56.6929 464.7873 null]
>> endobj
-1886 0 obj <<
-/D [1859 0 R /XYZ 56.6929 453.2532 null]
+2310 0 obj <<
+/D [2283 0 R /XYZ 56.6929 439.0859 null]
>> endobj
-646 0 obj <<
-/D [1859 0 R /XYZ 56.6929 369.7201 null]
+774 0 obj <<
+/D [2283 0 R /XYZ 56.6929 352.4521 null]
>> endobj
-1887 0 obj <<
-/D [1859 0 R /XYZ 56.6929 345.3805 null]
+2311 0 obj <<
+/D [2283 0 R /XYZ 56.6929 326.7507 null]
>> endobj
-1888 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2312 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1889 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2313 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1890 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2314 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1891 0 obj <<
-/D [1859 0 R /XYZ 56.6929 310.6805 null]
+2315 0 obj <<
+/D [2283 0 R /XYZ 56.6929 290.6891 null]
>> endobj
-1858 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F14 740 0 R >>
+778 0 obj <<
+/D [2283 0 R /XYZ 56.6929 241.4457 null]
+>> endobj
+2316 0 obj <<
+/D [2283 0 R /XYZ 56.6929 201.7704 null]
+>> endobj
+2282 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1894 0 obj <<
+2319 0 obj <<
+/Length 2294
+/Filter /FlateDecode
+>>
+stream
+xÚ¥]sã6î=¿Â9yf­"õÕ·ìn¶“¶—Ë9éLov÷A–¨˜]Yrõa×ÿþ
+S ÃH:t Eô[óRít¦2pRîú´VZìKE–
+NP˜d»¤L•%ÎUÒvVž%Íi¯93"(èŠéA·¨û M—®iKb1i’®AÐÆ„žº >y¨OøÆ&™sgg$rjñÍØ°r?„Z.ÒªL»šø”-úbQæ~­Jz#aÿÈÏìi’î÷h+¾+'¯¤ÙªTaÌSjã¾”~‚X¸’ þz"S½œª7Á«R‰àBìd"8{ƒF |GýµUµÆ8N
+Âä5DÒ¾ª¿ákà´¡›n»­0iàKï¡È`{ »î\'VˆuJ€â4hHuÙ˘À®¤ù6åuÍ¡iÕÆÜè6ê/1Ÿ-<0 ÈÖÓ†PˆÀ;9ƒ2õP«ZýÙéF·Êr[Dy¾x>íüéþ78‹' U}Có<ò"ÀŸ'2ÂÁsÕiÌ°œp``2Àc ºsoIX¥œŒ‰jxZ»iLˆÔX€¦ÕEAK+un÷ïµ 5ädØOø}{Øâ1¼( 
+
+(„bzØŽàr^CWbøà5sr
+|4
+bsب–
+7™06— z[_ÚT(c›¹$³­4;E+X& ›%‡"óÀÐ 5Ô H²RÏu‡l»‘ ù© èj$5.’û4-È¡ƒì1á<k´“Žˆôã;%Lטn ©Íyåi_„xr0\HŠ¦"he%ØÌj8ÑÝöœ&RÐÈþ9eCñzzÇ…®Û(E/+UTû¡ùŽ 6¨ïJ輋ÿ1ªÓŒž¯ûå8X ¤IÖ÷F®çÖ°õ›ÍK©æ¥Zýv!˜œÌlö{s#žÊ
+²y<ChR µJH%âWÇ«jØb€;WP§ªbu8›ZÎURC—iÑÁ„&L^š
+P#¢ &6æ0wV}-±b]íO«–í%9µ2¶žTû¾Ò“žAäíEÑѣ̀~ãÊ»Ì^¹¾'åe ±)ìúŸ`ÖnqaSx¿áÄ«¶´¥$ÓÕå„á#áQàY1Ó½|Os‘ï¤Íw¿”Æ
+惒ÊáNšë¥jÚZÓ‡„—8@Ääܘêån zs€{Uêq€»;9Àˆýp2ßh0á–ÂCP˜XÃg‰±ˆ€âLî€×Û Èwƒã´‚ðYÝ26iàÞ.‘ØO|)Úˆ8ñKD˜‰••@Åt"'%M_ñX¨Ù«9÷}WúL¾qŸ#ªWzû>_“:ºÏs±Ó÷9K^"áÐtÀ¼¿TF¹ ‘Ë¥é:$ã˜b¯¦m‹ì›ýpG'ßNìWšèäúÍÖ’žm/zèᢋÛYìÜå´dF+ö‰™Ú¡¾™ 8¢oX/dîpŠ³:áØ8Ò WÐBi:–Ž™ .Ó>÷7ŠCßfœÈ²‰œ#„‰¸§Ú¯ua‡H;B£x“kéƒÞqàõÁûxÁÏD‚…¶êÚ³IÙªJ¹’Ì Exêìc…±dÐż³@©ß•%±3Hqøñ….oÔ~½9»åη¨ks“ÓÛ;‚W%0þ5=ÿ}Ï ÷Âòÿ?]¾}¾‘Ž_§œòÕVx*åW1ùQž %ìoÿ{☻dèŠ(ò¦sˆ€\Sï…
+qÏ??º/ PG^8qöÿIì»äendstream
+endobj
+2318 0 obj <<
+/Type /Page
+/Contents 2319 0 R
+/Resources 2317 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2112 0 R
+>> endobj
+2320 0 obj <<
+/D [2318 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+782 0 obj <<
+/D [2318 0 R /XYZ 85.0394 662.3711 null]
+>> endobj
+2321 0 obj <<
+/D [2318 0 R /XYZ 85.0394 634.4781 null]
+>> endobj
+786 0 obj <<
+/D [2318 0 R /XYZ 85.0394 566.8617 null]
+>> endobj
+2322 0 obj <<
+/D [2318 0 R /XYZ 85.0394 536.3186 null]
+>> endobj
+790 0 obj <<
+/D [2318 0 R /XYZ 85.0394 411.7882 null]
+>> endobj
+2323 0 obj <<
+/D [2318 0 R /XYZ 85.0394 386.7645 null]
+>> endobj
+794 0 obj <<
+/D [2318 0 R /XYZ 85.0394 230.2565 null]
+>> endobj
+2324 0 obj <<
+/D [2318 0 R /XYZ 85.0394 203.9874 null]
+>> endobj
+2317 0 obj <<
+/Font << /F37 1018 0 R /F14 956 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2327 0 obj <<
+/Length 2527
+/Filter /FlateDecode
+>>
+stream
+xÚ¥koÛ8ò{~…±8àd bùгßÒ6=d»Èöììí.Ú~-Ù*K^INâýõ7Ã!eÉ–®*r8œçI‹ ‡?1ñÄ2ž„±Ç|.üÉr{Ã'kXû×08®ErûXïoÞ~Rá$fq ƒÉãªG+b<ŠÄä1ýêÜ2MwÞß?|œºÒçNLŸsürÿ~v;›ªÐù“
+íp_¦Y]ô>œÓš,“’8Naväí,ö- €Á ˜Ýee–÷e²èv—mV¯’¥™¶'ë¡t²­²¤ÝeY°KFÄ!SxòU«êc]6«ë5»ºÊ´3¬3¦£–5`:û·+Eà€÷ ù¤Q€h‹@€±ˆ,%x^˜4
+¦Â¡[
+Žù¡FÏ -iÇ(Êš¤OU²Ôœ Vσ¢D;3 NŠ„® uú‚…Ö
+A! zBΪª zÊaÄwIl3H’ ²R7IK#«pˆ1‚¾‡JʤM.“]²È‹¼=Ð<QÊF,\zÔya`,öºu1ƒâA\R ²¾ræ»l™#d ^Eæ
+ÑPùB‡w䟛a
+‡P€bPœÆD”µO†mÇhJS¾N°ò,§&§Í“íÎ64·ý*íÕ„6¯Ð
+×–¡ià¸WéÀDÆ5·† ¶ûã]ÈÒï ÷†€u½Þf «)AôÑq@h+ÓÑA‚Ę$M˜EQ=w¬ˆ‘À"§‹:ÏVcy-ÍšeïŽ×lm¡±¾ÑSñt © S’Ü?ê› £qÒÖ;2éÄøO~¼S€Ã¨>ö?Ø·”+_½˜{ôBJ7È^ ‘ ôáí)
+)‚Mþ//€’ÅQ¿ÿ¹E·Oò<8Â
+ävXíÐð0Išõ›  ±ÕFM-‡ÇJ ðk¿ãètw«é¬÷˜Øšwg=§
+
+H¨ã
+e0ì>Ùr${ÑÁãÍðÍtÜŠzéÙüDñùîÏ¡9rP#nßÔ“±ÏOè(µ”GµMo£g~ÿÑèþ¾–Ž¥4úøôyyyI´î KyÅK¶˜¦C7c§±¯ë)ÆãØ£‘8hyøíÎ,|¦ïO ðOcŸõ;²2ˆm–h CnÚwš‡i3ÁE HèówUfÿ4ûðU‚ð`¡É×%Ý(í6O!•î‰%[VÏ¥!Ø£Ò``Û.X»+ÛÚÐÝUù‡ž×]DÎïa38îÈË­-Õ6oé+ª&i6‰ ‰yÊÄ_ì E\áê⃣òþR5âѼ«ÃÿïÄŽ/—T•Ñ¥^A†Ð±Ä06B¡„ Î#©ùéì\öÿ=- endstream
+endobj
+2326 0 obj <<
+/Type /Page
+/Contents 2327 0 R
+/Resources 2325 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+/Annots [ 2330 0 R ]
+>> endobj
+2330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.9397 501.3201 406.1397 512.7122]
+/Subtype /Link
+/A << /S /GoTo /D (trusted-keys) >>
+>> endobj
+2328 0 obj <<
+/D [2326 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+798 0 obj <<
+/D [2326 0 R /XYZ 56.6929 609.3932 null]
+>> endobj
+2329 0 obj <<
+/D [2326 0 R /XYZ 56.6929 583.208 null]
+>> endobj
+802 0 obj <<
+/D [2326 0 R /XYZ 56.6929 484.1849 null]
+>> endobj
+2331 0 obj <<
+/D [2326 0 R /XYZ 56.6929 454.463 null]
+>> endobj
+806 0 obj <<
+/D [2326 0 R /XYZ 56.6929 405.4622 null]
+>> endobj
+2332 0 obj <<
+/D [2326 0 R /XYZ 56.6929 378.8348 null]
+>> endobj
+2325 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F14 956 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2336 0 obj <<
+/Length 2458
+/Filter /FlateDecode
+>>
+stream
+xÚÍZ[oÛ:~ϯðÛq€c–w‰yKÛì"»9Ù&vÑöA±åD¨,¹’œË¿ß!‡TD[¶Hv±(ZÓähøif8ó k6¡ð‡MRE¨0r’Iej2_ÐÉ=¬ýõ„y™Yš ¥>Þž|ø‹H&†Íõäv9Еš¦lr»ø6=¿¾¾¸ú|ùÏÓWtzNNgŠÒ0ûéâætÆdb8¬H»¦éôãåÕg”6øñùê»üøåüË©H¦ÿ‰›¯×׺‰ÛÓ·œ\Üö ‡/ƨ°ˆ|ûA' x¿?N(&U“'øB 3†OV'R ¢¤a¦<¹9ùG¯p°ê3”T)Q\êÉ „ÁNlÜœ”Pæ™%’™jÙ›“³1s)kÎY‹o¾¨WYQee·ýâLJ’JÀ0Ô~ìÕ91išŽ¿ø¬×x08’¤B¨q›7y³ƒ2Ñà–„½#Ê ñÊÄj”‰Qf‹E“·í6LÎ1JšæŽC{©‘­ù`kÎRb„[Zçóbù~fšÁ‡¤`´uÖd]Ž“Í)K§ù|Ó´Å£ŸòVu»“h[\\Ö º‡Üë³{|§”Ïqá;çCÈŽàà šL/žgöýÁ”p843ÆàÅG­Öe~¢Œöa˜?»Y2¯WgœRv¶¸KÏÎrç<ú ×Æ)ð@î?C©ý'£—:gàÁD´íÛÂÌ+<‘1MeiŒqO”A¢ LÓô°qz©‘­‡QÆ SñÖzìòú;UôQ~xÔ0`8GLÔKüÄ
+‡P¡‹¾¶Ù}ÈœC¡‰¿…d:žÁ8gD =QüL¾=}³Â‘RU˜Œé· é˧‰{‡ƒ/_vpJ©Ìû
+ 7‚$B¦òîe{ÈEµÞì&!ç“wÛ+< VHM4$ì¬QWŠ¹o%š‡€2NâÏuWÔUÈ­.Œ-¹vι߬ ¿¶gû¬Œ¤F¡¦C©ý ¶—RÓ=…˜[ú,U´ÿÛ*qÐx,ãˆ{„v_){ Ãåa3õR#[Gõ@ H IŠ·¶9Kj(ÅGqý• f=XðNïÔ_©0ÁL s¡þÂðµþÚ úúë´õ(ŸqY`è¹tÁÄBò$‰aUûÐnÖëºéòE8g¡ª>0\²Á™Ùèuy|OŒÊÔ@3æpŒ¥öÇh/åbtoºbÔÀù‚`j}[|G€2Æ ‰Ž‘ÚŒµƒQpB5OÛ§—Ù7&+ ¡R²xß×ndÈHÀ^8aQ3DoËÜmÏyòe¶)½ÙC$ôõ{ù ¤<Hçé±PH… e_t´0Fm®ÐѶoì¼Æ#m_¡ êÆ _KAœKbh*§—Ù9ŽNÒÔ¤ñΞ5z"6pø6‰mãà.j§Zø˜È³Ð”EåÅæPÆ`‹­¶£§¬Õ}¹‡;{Ͼ-uÌTFl,ŽË p ÅÜûôôDMë³[=; ¨ò.@UKžŸŸƒš1ž.4I5³'P‘$õi‰ºˆ‰z“ùi»ýT½¿üꚬj³¹MÞte¹ô8%¿td6í/œ9îÃ|Ÿá†è¾~¥¿/ÀlÎC±I$v ,°>]7E…þcá\³àý5x7G±§¢{ÀµUQ«¬Ä/kdÐs(9àlçTÕ#^Ôy[ýæ¿À«{ˆã|ÜòuŽ­v7ðm„]3s£§E‡ËmW¯[zÂÏ·
+¤px—í¾¾ã bzéQ×Nñˆk¡!µíïÛŒbÓeÑùbq¥‘Gåþ`…¸Þ=·,M‰N(
+É)´ ½ n»v—?dEÈ€Ò‰£~v›.û™±)8±sY©F)á ¨
+endobj
+2335 0 obj <<
+/Type /Page
+/Contents 2336 0 R
+/Resources 2334 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2337 0 obj <<
+/D [2335 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+810 0 obj <<
+/D [2335 0 R /XYZ 85.0394 650.8348 null]
+>> endobj
+2338 0 obj <<
+/D [2335 0 R /XYZ 85.0394 625.7398 null]
+>> endobj
+814 0 obj <<
+/D [2335 0 R /XYZ 85.0394 378.0874 null]
+>> endobj
+2339 0 obj <<
+/D [2335 0 R /XYZ 85.0394 350.2627 null]
+>> endobj
+818 0 obj <<
+/D [2335 0 R /XYZ 85.0394 153.7325 null]
+>> endobj
+2340 0 obj <<
+/D [2335 0 R /XYZ 85.0394 128.6375 null]
+>> endobj
+2334 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2343 0 obj <<
+/Length 2393
+/Filter /FlateDecode
+>>
+stream
+xÚÅY_sÛ8ϧðtîAž]sùWsOé5·“Ý6—xgî¦ÛÅV]m˵”¦î§?€ eÊ–Îv(Aø€ÅˆÃ12)K­´£Ìjf¸0£ÙòŒ`îç3áy&is½žžýôw•,³©LGÓûHVÎxž‹Ñtþ>¹`šAO^_½}3žHÃK7ooiðÛÕ뛋›±Ê’áö÷ëëwŽ0O„άL.®¯/ß¾¹ú'1\ LÎõo—·ãÓ_Î.§ÒñÆW¨ñ§³÷øhûûåŒ3es3z†΄µr´<ÓF1£•
+”ÅÙíÙ?:ѬûtÐP‚3©R9`))‡,e,K•TÎR¿7ÅCy>ž(Á“¦X®å䡨h¿uÓ®Še‰»Y"’ÅG¥™ÍyÚÙ;eÌÆy'çi=/Ú » ‘M…S4žoAx5£b¦ñlQ•«–ÆëMý°)–^ÙWA›¡\á©NŠÙ¬\· ¾(·*КjõàV…q·ŒgõrY¬æž·ñzs“EµòÜÅf,òäái Êýˆ¤,iÊÕ<|¶"1±|÷Aùé©l¼r˲A{ÓK[ã®pB0kŒtûhaZ©4)žÚÇzSµE[}ö¤¦Ü|.7ãL'°¾2Yâ”w3õsCÃN
+ùÔi߽3¬XÂu…xìœxyiu¿ï´û Îî‚£é¾1vâž«Ù㞬ØýûeTDP~µÇãA@6¯sõB<D\'â!p¹xøJ«còÊã~ú @™eö´×€
+=GƒjÁ‘žÓ`§y½„´ÏŸV‡;äf‘9}¢Øƒ"Ÿ26Ç ¨rÅR®ÒÓŒ¹Ž°ãBåW`’CØ+¹W€‰o(À΀3+2qz×À.úg`XŽÖÛÆ-Þ(AÐn×{‡»r½.7…OQ0£¸¬¨Äå#˜ÅUŒÄMø­vs˧ !V£ îhL(£˜0ù ÙdÌuâH—;Ò¥o?ÕàPÀʜԤãP¥Ÿj(ØSÓ×¥;%C“¨‘'Õô¼ó3¤÷K È.<Óv]ÍŠ½”_
+j[á ëÉϾh’Y²¨¡ò«?ú—ê£çE›Ì€ÈWL+¸½zØ;þF6¼¹ÙùÒÍ› ¬¦øç…°c­GÈ\™Jõ7ÝÁZÀ-l¾…¡pqÇeÑwdùaøbïBïš¹Òõì²^ u»¿Ám¤2ðAiS&”²Î"o£FŒIáÎuU3J xõ«À¶m*“Ë}Ë€LžÉlW ìÖ:_} @S,ìS4v{ÝÙÀ~ºZÊÑ›v4Š6ObÉnSi쥬Ÿq@ß÷q-6ž»¼³Á¶š•c¸½±½&²¤ô¸€,ØÁg½¡ºdâéKüÒÁ
+ÔGÏ^¬×›zí¿éú¨ ™"ù<–&qp‰¬¡që?ÖÉW4`Vö·!ŒîÇÊé@5Nßfy
+—„oÍ98ŒÍ již–î•.¡UÔèj”ëй^ÖQ›ENj¾×¡ËÚB-3s½h˜£üG®ù…ßQ‹GC.ý9òÃtRr.Îçwùù9”ªúG ½ÿ«dZgNÂ_
+endobj
+2342 0 obj <<
+/Type /Page
+/Contents 2343 0 R
+/Resources 2341 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2344 0 obj <<
+/D [2342 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+822 0 obj <<
+/D [2342 0 R /XYZ 56.6929 740.3318 null]
+>> endobj
+2345 0 obj <<
+/D [2342 0 R /XYZ 56.6929 714.7319 null]
+>> endobj
+2341 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F14 956 0 R /F62 1352 0 R /F41 1208 0 R >>
+/XObject << /Im2 1341 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2348 0 obj <<
+/Length 1890
+/Filter /FlateDecode
+>>
+stream
+xÚ­ÉrÛ6ô®¯Ð‘š‰l\Оœ&í¸ÓI\Çi'ñ"!‹.*Iyé×÷ H‰¶;“Ú>oß
+‰ÖRíŠ%®š{Ý¡viY"p}íV¶Më†äOuZÑiµ/5Éš
+7]Qß!Øï4wŽ®ü¦ŸVŒ±€“`l$]®… ŒyçS"(8­îöm³Ñ?¬Ö‚Ñ oª´¨ß‚ ŽE§Û{íäËv:ûæŽq¯ÛÊ)Òlf?ÿ„€¤±tòð©<\%™´ò\öÀ;
+‘|‡pj>¸»=CÚ|Q>‡Ô7K»…P~¡ü"z*Þ„ÜFïÒ{·‘5-z.ëË'<l¶‡Qá±TFaPÓ(ÆQaÈ­bF}©dp³+ÌÆü2 —•‡\çþî¢d°€šÃŠåal< ¼·²5wmZ9ªÖk×< ä€Iý¸oZGµ,6mÚ>áF–Öl4îºS¹Ò9ý …×h¥2íÍ ßû}Ydi_45ÅD H sè.½óÑfbÏj²qÑöeßzèþØÀ&äö}Yg. Sˆ™ÓÁÈP‰eysÿ—*Á‰J’d¾F¬Šë1ÉóÀa—Š9…Ó<G#u×­¨÷‡þTnÁ#’Êþ?¹Š¯È-¸" KÔTòRßZB¾JÇ*ô¾L,ʧ½qswV¥)¡!›È UóÝÇá¬GH(›)©É0]ç§ü *K)_æçqÎù-¡‘<œòkWIp¨OŠž¯À_9—¹Þî €KU“k‚úPô; ðEÒÚ á³ø(|wÈÕ! õëé¤e=~]ÒÐ:òœ wÊ{Ùc¬ç1`YOÜŸyBDE¯°ôH3,'¾HHÇ',¡j¢ÎiçLÖÙ4]Ñ?M{P.rªnÚ*uf-×C+HG(DóÔÍà[ à}ÒíuV˜dð®:”}ak±õl¤ž5}È ‚¿búÖ ¦÷XÖô/U@Æ)‰£pÊþ»*É@ñY$Od5¬}&e˜ˆ‰—mä‘føŽc…E0Æ))¦Œ­ç¶¶É©Àö8NƒË+÷ûX–qÃ6Zø¦¸ïRëÐv…
+`ç+ ©18 b
+‰ù<Û¡#ÓD¾lœk†ó$“'I¢’)g“Ty,ì}5¨©{ˆ/{=1;¹,º!‘ð=Æ!æÒ?M­]"9‚‚6äá»q¼†4ÊM€%Ið°3÷K»*z;{Ús;'RקõÚM.à)’“HL-E[Ð#ç| ú¹ò™œ…ô2Œaê >ؤ2ëeQ; l9‘
+&ô¼ÅxŽI‡›)~ÌÅ®tG½‰ ì/a€qð\SwÔŒ抸žæ6Iwo48Vl\Z’jH­[ì…r˜I䈫¸Jès]kíOh\H÷ú—Žèht_qW|Gã’qû¡.‹oî·ëÍ3ÅÂH¿k¬Šap¸KQoØ°¯Ù{xxX)ŒïÎfÙ„˜‰ÁO.s ÜÑ"¨C¹®û£‡`Àj¢èPÍÞÛÇXxŸ«|>ò9ºõ €2rÅÖ:]ç¶ĶóÑ–«Å°ó÷A·…MX¶)ÂmÐu÷W]XÇbmH7•Û·&í…–ÛÈÎѤfÓo&šuî'©aì5ýñd<ÊÒ²Ä7ˆ7î&˜çÓ…sÏqJ¶úùm¿?îÍΘ¹Id<>p Þâ{ ®Š@‘‡‡ŽØ=süæ/¼vŽÖ[Ýê:C…_~¸0ÞXÄÌ×e€"Ô=(h´•6pd@´Â«üný
+®UZÒÒi=!ïà üíèëÇLï{$àe0%5;Tµi§St–ðźó?Bj#aÆÁ~dÖî­É%É=ËxA÷~ÊÎ5TüÒÄúq_¦µ½òw&ÙÞœ¸Ø?]œ<LxÙ· òÜ{xÕ<ÒÍ46:„Áw¿_DeLD’<3k
+*¡1*æ…2&d\Š>¼žËþ/+bHÐendstream
+endobj
+2347 0 obj <<
+/Type /Page
+/Contents 2348 0 R
+/Resources 2346 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2349 0 obj <<
+/D [2347 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+826 0 obj <<
+/D [2347 0 R /XYZ 85.0394 741.6375 null]
+>> endobj
+2350 0 obj <<
+/D [2347 0 R /XYZ 85.0394 716.9352 null]
+>> endobj
+830 0 obj <<
+/D [2347 0 R /XYZ 85.0394 420.5643 null]
+>> endobj
+2351 0 obj <<
+/D [2347 0 R /XYZ 85.0394 393.2598 null]
+>> endobj
+2346 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2354 0 obj <<
+/Length 69
+/Filter /FlateDecode
+>>
+stream
+xÚ3T0
+endobj
+2353 0 obj <<
+/Type /Page
+/Contents 2354 0 R
+/Resources 2352 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2333 0 R
+>> endobj
+2355 0 obj <<
+/D [2353 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2352 0 obj <<
+/ProcSet [ /PDF ]
+>> endobj
+2358 0 obj <<
/Length 1945
/Filter /FlateDecode
>>
@@ -9102,44 +11179,44 @@ FU—¨UÙ‘[¢–õ„/
c˜"v¨¯]¿x /¨¦zŠ©,ƒ‡“jì^MÈ=n´B$ŽÌÿ/Š™AÃozrm@ £óÀ’O#°ã—_ØäƒcÒú:ƒÄl²«Ö2[PCçB‡A|ßöÀ7z WQ@x©k†ÿˆŽ=]LÈw›{Šh( Ï`žÙ±¥|ßd³ø)¼Áº.4h@õ
Ôζ–ú‘*ÁŽ––nU@€u´ŽÂMô©…2&ô5»XžG»<•Å”?
iô¦?ÿûãçOþóšÞn1˜)f3+NAÍï7QUÊñ§êgCí r õ(G§ÀM¡É\3-äY=òaoø‰ëà¤m!.cÖAs/ç˜S¤à¬“içÞ7˜P²nïèK]- Þ}¤/ýÞà[fÌ)Qˆéªhij;Œú«p}ÓXåž\E4z%d˜^§ÙüCIMÒ©s gLü¬
-§g=42¾ûùÁC#j*u[ø a;xs»icŸì½‡ÁKØù;üø<fø³ìäC;°$GúEöÔfГ/U\œ7üÀûò¼ÿSçžqendstream
+§g=42¾ûùÁC#j*u[ø a;xs»icŸì½‡ÁKØù;üø<fø³ìäC;°$GúEöÔfГ/U€Îâü¸áÞ—çýTnžtendstream
endobj
-1893 0 obj <<
+2357 0 obj <<
/Type /Page
-/Contents 1894 0 R
-/Resources 1892 0 R
+/Contents 2358 0 R
+/Resources 2356 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2333 0 R
>> endobj
-1895 0 obj <<
-/D [1893 0 R /XYZ 85.0394 794.5015 null]
+2359 0 obj <<
+/D [2357 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-650 0 obj <<
-/D [1893 0 R /XYZ 85.0394 769.5949 null]
+834 0 obj <<
+/D [2357 0 R /XYZ 85.0394 769.5949 null]
>> endobj
-1896 0 obj <<
-/D [1893 0 R /XYZ 85.0394 573.0107 null]
+2360 0 obj <<
+/D [2357 0 R /XYZ 85.0394 573.0107 null]
>> endobj
-654 0 obj <<
-/D [1893 0 R /XYZ 85.0394 573.0107 null]
+838 0 obj <<
+/D [2357 0 R /XYZ 85.0394 573.0107 null]
>> endobj
-1897 0 obj <<
-/D [1893 0 R /XYZ 85.0394 538.4209 null]
+2361 0 obj <<
+/D [2357 0 R /XYZ 85.0394 538.4209 null]
>> endobj
-1898 0 obj <<
-/D [1893 0 R /XYZ 85.0394 504.6118 null]
+2362 0 obj <<
+/D [2357 0 R /XYZ 85.0394 504.6118 null]
>> endobj
-1899 0 obj <<
-/D [1893 0 R /XYZ 85.0394 432.7569 null]
+2363 0 obj <<
+/D [2357 0 R /XYZ 85.0394 432.7569 null]
>> endobj
-1900 0 obj <<
-/D [1893 0 R /XYZ 85.0394 303.3232 null]
+2364 0 obj <<
+/D [2357 0 R /XYZ 85.0394 303.3232 null]
>> endobj
-1892 0 obj <<
-/Font << /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R >>
+2356 0 obj <<
+/Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1903 0 obj <<
+2367 0 obj <<
/Length 3825
/Filter /FlateDecode
>>
@@ -9159,29 +11236,29 @@ bÎDü…îR
”®DXð9I;܉
ô½¿ù@„0È•œåñú¹X¶åçbã?^¡€™ À° õW¶ÖƒMw›gÂW%fèÂphðRØ.]¡Ã‰h¾,¤ª\,6<ÏËe³8´Z9ÿký¾ÅEÓèâ}ÂÆLÁ©—îÀS7ØQóëEÚP8d½¡é“löá»—)Rú±-Ú5˜³Àe’ù¸Ÿ9.¯nè­NmÆÇácÕyW­ µãrâÖK…zº÷¿
"BV˜ñI§ë†¾xÀfHÏqàÛw/çï^%cÁ8`–Y(bOud)ú O¨&y¢álD ×Tˆc÷Âà)†Ì‰HÉ´ õ0QÉÓÁù âþ“I‘r5Æ|Äï4K‹0ANEÞóTS_Q-ëÁ'ï Ñþ´ôŸõnx’»¢ÂK2œvE”'0«
-‚ÕrœÀ4d‹VM}­°¢Æ¾ÌáK‰ÿù{éã×àÚDÊÚ‰o|b‰amfÊ¡Ÿ~ËÄ_VŸòþ_dsÈkendstream
+‚ÕrœÀ4d‹VM}­°¢Æ¾ÌáK‰ÿù{éã×àÚDÊÚ‰o|b‰amfÊ¡Ÿ~ËÄ_VŸòþ_dúÈnendstream
endobj
-1902 0 obj <<
+2366 0 obj <<
/Type /Page
-/Contents 1903 0 R
-/Resources 1901 0 R
+/Contents 2367 0 R
+/Resources 2365 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1747 0 R
+/Parent 2371 0 R
>> endobj
-1904 0 obj <<
-/D [1902 0 R /XYZ 56.6929 794.5015 null]
+2368 0 obj <<
+/D [2366 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1905 0 obj <<
-/D [1902 0 R /XYZ 56.6929 752.1413 null]
+2369 0 obj <<
+/D [2366 0 R /XYZ 56.6929 752.1413 null]
>> endobj
-1906 0 obj <<
-/D [1902 0 R /XYZ 56.6929 501.191 null]
+2370 0 obj <<
+/D [2366 0 R /XYZ 56.6929 501.191 null]
>> endobj
-1901 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F53 1029 0 R /F11 1397 0 R >>
+2365 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F53 1303 0 R /F11 1442 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1909 0 obj <<
+2374 0 obj <<
/Length 3111
/Filter /FlateDecode
>>
@@ -9199,26 +11276,26 @@ X&dÜ‘Lr­2KU=Æ
Í©ßpª'uÆ©Vª³nuÞ©ç”{NjŸpª¯ÞdÁRÇÄ£X0<Š…¦hï©dЇ…ëúÅèæžà¨j•·9=ÿá×CɃ”Õ`ÀóP‡|èÆ&ô²Ol¦²öÅÛþ:sày]|Y¦pªÇ#mÈ—ò!¿“š{ oÊ+’Ââ«Û‘ê½{}ø¢«F#F£âÓªy³„ÒK¾)WL˜!=Ë¢$Œpp‰"Ö/—|wJ¡-ªIôä¹@òûŒÀe³]½¹‚d|yôg•u³b¯¥‘¹ 
ÖïIMeµÂÇÓ¢±]Ìm¯ï#ÞåxoÖ“ÍüÉ‚qÞ|³Î³o=†hI9üRX‡‚÷à¬)ö@å—Û¾®Í¿|]PÅ>¯žð 9Rf¶‚ãÙÒOV»ç¨Ûå{Öc¼¨%{
¾U¯ycGôsd*ö6Åe%ÎK“ƒ÷¦€}žb|©iŠqRŽb–ç)æ¬òŽbN´SLO½¡ؘœªevM3Ƀ%ò6>ÜÐ/RÌr],Ÿik@ͪlðD¸â?2€Ã2X0aÒ¥Ç2 ŸX›ú,fa×Ë=äãPõVæšôqóùîîã‡Þr»býØK,ébh
-p2£·RKOhV¨ÃÁfòÞöœÖîÚv¨vüÖÖ×{C¸Sù:¿ñÞ2¿\ßÝÙ;ò¢ò^F]Þîdû\5éVˆõ*|ãY¥“™v*Ët7½-,ö‰[!wÉ$
+p2£·RKOhV¨ÃÁfòÞöœÖîÚv¨vüÖÖ×{C¸Sù:¿ñÞ2¿\ßÝÙ;ò¢ò^F]Þîdû\5éVˆõ*|ãY¥“™v*Ët7½-,ö‰[!wÉ$
endobj
-1908 0 obj <<
+2373 0 obj <<
/Type /Page
-/Contents 1909 0 R
-/Resources 1907 0 R
+/Contents 2374 0 R
+/Resources 2372 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1910 0 obj <<
-/D [1908 0 R /XYZ 85.0394 794.5015 null]
+2375 0 obj <<
+/D [2373 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1911 0 obj <<
-/D [1908 0 R /XYZ 85.0394 679.319 null]
+2376 0 obj <<
+/D [2373 0 R /XYZ 85.0394 679.319 null]
>> endobj
-1907 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F48 953 0 R /F53 1029 0 R >>
+2372 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1915 0 obj <<
+2379 0 obj <<
/Length 2837
/Filter /FlateDecode
>>
@@ -9236,119 +11313,112 @@ arFáàJ6ò±´Ð‚c9<™‘m›î} Œåºn0ÝzE½ÂA¨=Ÿ‘Ð Hãœ/çˆÇVt°RÈ=UA‚©Z€Æ-Ä»`>cÝ{ÿ
^f¢óá^žÜ¥›õl(š˜9{™a–f9]Ü&QÎÖ¶I<åLø‡ùtgÚ(0v{$W©Ã´:ÇÃÓæx@  8ùø`zÍ|º© cZFhûß ©Ó†Óª\€ ¯Å&åtsÈÖ¨]-¯3ZÈYZÐŒÇé±×v‹ÞwgÍmïšÆ¸‚ @Æ4ªåL£cßÃtÂÅôzÝ·Zö5í¶kžz/rz!‘†Tžä¨ÆDjbo¿îI[ìOšò_ñ¤P€°†Ž´2nk%GY¢©[ÙÇ!Êm²çÿBÖí•(¿`€jÃŽjÌ1°åìWsÌ&ï1Ç̘/瘈»MÇ4÷ÉšÎÉU{ðuzÑj…FP÷(úóT«¨û¡Þ÷V§9L… ¨~ÚÉÇ'S‚BãPVòµÚŒâ‘®¯JÏ`}Oã`œøؼL¼¸·æîÚMtÜK¨^j·Íý#)3¨‡Æ¥¯"ˆŠ,eŒ\È!Õ:‚<•GÐ÷Ó”o‘§œ^`kiæ\'U1…ê¶ÀÛ›Q#_*«%“½ºîÖõå¶õÄ5{pBk¥wqõ÷z}2÷qÌ}ãtÒ,ÅPåo[b$Ú0„%í 2˜òžµÈºÅ{ ¬SæËq5äîÌ¡*mW™ø}Š2‡ ãN‹ªßz¹_ÌN†êÐPj]CÓ¾Â<¥¥õ…#´µ%„ÛþçSk
Vh§[/Vþër5^Ãf?¾8l•Qh_2¯@èB¦ ©Öáà©<Æ2-¾ë àH‚n3÷Tsî“ÐnI`Û±¦Ó¹‡Úl{·± ˆ´êr9 ¶öã§Ý(Ï׆,(»rCª Ã8ªÑ0ö¬w¾›`(¥Y·ù{ª¹
gÚGXûkŸÌÛGSQ¤Í'цÑpAR$.ĺ€hÝdŽh´XÓ¬Îm±Ïæ¦|—æBÆŸ¤1®lÛ7²´M%Ï<Þ|Eˆ–ëUê
-éVìÍ)OHjŽ}>«CŸ¦þ¶tê ž€Òœ4>¦5qféø™«ÿß8Oð˜th«:9Ýü×í¾9WÓÃE}ç þýjåwÀWý[nhçœëÿþSÞø—C–AÆÌÉ2žHÆSøX8¡”&
+éVìÍ)OHjŽ}>«CŸ¦þ¶tê ž€Òœ4>¦5qféø™«ÿß8Oð˜th«:9Ýü×í¾9WÓÃE}ç þýjåwÀWý[nhçœëÿþSÞø—C–AÆÌÉ2žHÆSøX8¡”& Ï¥„BÚËþ'ƒþ‡endstream
endobj
-1914 0 obj <<
+2378 0 obj <<
/Type /Page
-/Contents 1915 0 R
-/Resources 1913 0 R
+/Contents 2379 0 R
+/Resources 2377 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1916 0 obj <<
-/D [1914 0 R /XYZ 56.6929 794.5015 null]
+2380 0 obj <<
+/D [2378 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1913 0 obj <<
-/Font << /F37 802 0 R /F48 953 0 R /F22 737 0 R /F21 714 0 R /F53 1029 0 R >>
+2377 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1919 0 obj <<
-/Length 3266
-/Filter /FlateDecode
->>
-stream
-xÚ­]sÛ6òÝ¿B3}¡§‚O~<äÁ©ÝœÛ4Ik§w7m(‰²9¥HU¤œº¿þv±
-9ùýâç_ùl|{Á™ÊR3û ÎD–ÉÙæBÅŒVʯTw?„½·vë”
-%Ys1ëãQPcÒRöH •°T‹#ÚwEw9W*‰ºÇ‚õ~³(v8Ž£fMkÈŸË݆ÇüÉíèzæÛmq)¢|GӲƽúƨ’g,NµÞ‘|o
-‚ð*&ãX8 À?F$$ãZ9ˆë S
-I
-`â¨nH*É@‰àèNdçŽU™Ë*œÆq‹+¥{³…eo¡Ž´ðì\k½p ŸËîG:ZŸQqÑãÖ¨Xx;mÝ»-­t(J áÑr•wåSAoꕼvП˪¢¥…UBÄàjÛ‚(.-~pWVp
->ý¼Kö ¡Ô²> z˜°‘0­´‡°²ÝŸv® :…âæîAÑitz—Õ¸:„ÔQ%ñyÒjLû(QïdCÚ×X$i(EšŽ:¥öÚWÅî][ìžlݨ]Ù
-›e⛜w7?^ýôÍe¢£«ÛwŒ–ï=úCQHl%¥]í6Á–/ž
-W
-¡»-–£ë4*™ž' ÆÔ‡× iM’h1$ÿcÉG‹w$ j†€wó5GÁKPYmŸ­mØ•g¿âr%œX8Føá;·£t[á†_€ÿÍ12Š,>ìþðñ~ŠºsmÀ­¥G½›QŸ¯Ve©K°m,8šzQz‰¥ü'AehR.Ï+Bê´"¨ mù°|ÌÛ‰LG²pœ¥îÆÔ‡Š
-+±·Ù–•5´Æàh~=ÑÖ©d:SzpÒ—ZÂ’eišN7„çã bÑp+
-†±<#úsêT}ÿéV¥÷·ßÝš>Ýüx{s7á}Á+ʘ)‘¾xJ(²ßܾG†ue´Pn¶•ýò—»¬YÛ
-ÿt>Å5#¸öüYŽìúô÷>ô¾†û:Ÿút&4Ë’ÌËf‘w˜• L.E„§Äi³E.° Â/©‰pù ·ßí¤{´ÍB\
-2Áõeî¸_î«Ò~‘†Uò0¸n‹ñsí íˆ HÄŒcÀxUùCû•K{,«­·†Õ¨‘í
-xƒ~iG`°ºßVn¼´Jƒ
-!4]§ãmÛ¡éI _ôtf¤’\ždŽ;?õK1UºšüÐÃCˆüÇ¿";üFNC€_Þ'óðžLáïÇS(vÁÍ1ëcc*“ Þÿ:ÇÀTendstream
-endobj
-1918 0 obj <<
+2383 0 obj <<
+/Length 3255
+/Filter /FlateDecode
+>>
+stream
+xÚ­Z[sÛ6~÷¯Ð̾ÐÓ
+!®òàÔNÖmš¤±ÓíNÛJ¢,N)RI»î¯ßsp)Rr§Ýx2ÀCœà;WˆÎbø£3-IÌS1KRAdLål¹½ˆgðîÝu4sO4ïS½¹¿xõ–'³”¤Š©Ùýº7—&±Ötv¿ú9ºúôéæÃõíO—s&ãè ¹œË8Ž¾¿úðåê½ût™²èêÝÍt•ŒQ$Sqt}ûîò×ûo/nîƒ0}iÌQ’ß/~þ5ž­@îo/bÂS-gOЉ MS6Û^ɉœû‘òâîâ‡0aï­ùtj„ÔD2¡fs ¦\&ÓÛ“X²牠„+©Ã6 =µMž
+·é«jU·ÍëëãåRΈV1õçqTcÖŒõXSž-èﻼ½œsžDí&·ªÛ.ò=¶UT¯íÊçÉ2÷Á&{t_´µ}f»]~I£lo»E… zõVòž,N‰Ò‚ìȾʶ¹¥ÈÊ”¢ŽæOD‰w×s¤„s&ÁºöBµ}™U´pkXÖUS¬`ÝTGùÊ­gÑÔe×ægŸÍ™V„1Š[NI*%33ß›}“°Gù:ëÊÖv³²sãEcŸnç å/qÌ*ú]SÀ®UžÌ}W¹M‡fÓfm¾Í+÷½ßXAû[¦a€-·àWy»|µÏaÖ¶žÚ I” ~ ¿†¹µˆÌ>êX!
+Ø>,Y³³8-Ÿ/)¥Šœ&ÑB ¹õ\»-ù€µŽ£}ûG /è ›vÝU«|5eºU ¯û«úÉé48<ûín_€…îÉEã¡\ø9`aïmAæføÓzœÚöœA‚Ö2맙}à©ÛÖï]¾v¹ŽÖšÕSºÆ(¡B½¤k=ª3ºæ©Œ®å«ªyý¯‘¢1E
+ƒnñ±jžDÐŒ(T°³(èSFA 
+(XgE9®h<,užu ó>Šf9D½é÷5¦ÊÒºµÝΆ™Wùî]“ïMõ@¸äžÏugéÝ6æ&×À7™}ÜÝ|¾”2úñíe"¢«Û÷Äßûé©5Lbòiá2ø ±|
+ ¤F,¸Âº>4^TymŠ¥H1íðЩåCÓR¡½-=šºEŸs#?ù"ßd€Vw:"&B‹s :Gp³È!]ƒ¢µ#ô$œ?Ï=Ø™KSÙ‘þWm›ow¨´Êz
+¦@“‹fWfÏnÐl34 ‘lÑéX³Ç0êÒ¥Æöü1)Ú‹É*+ÑŽä+ƒç±ðÅÁh@§hœ„”k9´>”2p2a~:·Íàáäaò²ì2¬³§Ù§:}œ*œ'„nM¾<é Î2?xƒ÷io0`ÿ9‡à³Á3¢©Œ à»»ùƶGÁ µeólL1ÈŒ<û+cÇ@àxÂß¹/
+÷):šëÖÅPS
+bXœç¨Æì%‰¤Éÿljnw2W5 éÁ™Á‹cgF½3³m—»ÚNf?‡Í]y˜šb±ÊZS
+“Ã >pú
+¹9%:–G˜ý{£XëÓfœ0moµÿÆüŒóþ”­–‚Éç¿„1šr+¥Ïc¬Ouc*` ¯uO&ÍgY’æïɤyÀû¶Z–Ýʇ•Õq‰ÔÜ{»ó…Þ^÷SHjûô4¯B…÷PŸÈ&ãP㠌ր- Š¾zÎñÛâÿû/ï1½¿ýôþÆÎòכϷ7wÆŒ"xyÁir¸ñf^¿¹ý€‹4Jí@±Ý•ææ7sQ³0—@c§…[+£/Ößhê½VÓívÁ6–Scëþv'€‹)…îJ'nHaT ¨ì õ0€ÕM[î:²ÕSla~Q8¡1pÞ¡TS~”-šõñ˜Û2D,¼|F"3>}ßSÀsì]ê|êê”
+’&©ß›EÖbT‚,0¸¤®»õ¥À„oÒêâdn~·$íÆ‹q(ì Ž/3'ý"?H_æ 0j- Ž›ÀÅÌøT9JóƒËÃnU$F‡?0] +Ïš¯]ØcDmŽJm½‹ G0á¡pîïò µ„ gæÊ–šÇw ‰$2öA‘å3qJ¬ýFÛ‚ÂCç~¹
+endobj
+2382 0 obj <<
/Type /Page
-/Contents 1919 0 R
-/Resources 1917 0 R
+/Contents 2383 0 R
+/Resources 2381 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1920 0 obj <<
-/D [1918 0 R /XYZ 85.0394 794.5015 null]
+2384 0 obj <<
+/D [2382 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1921 0 obj <<
-/D [1918 0 R /XYZ 85.0394 179.5067 null]
+2385 0 obj <<
+/D [2382 0 R /XYZ 85.0394 147.4749 null]
>> endobj
-1917 0 obj <<
-/Font << /F37 802 0 R /F48 953 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F21 714 0 R >>
+2381 0 obj <<
+/Font << /F37 1018 0 R /F48 1228 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R /F21 930 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1924 0 obj <<
-/Length 1913
+2388 0 obj <<
+/Length 2054
/Filter /FlateDecode
>>
stream
-xÚ¥X[sÛº~ׯÐCgJ͉`Üx;oJlçøLŽãFÊ´Ç4 YœP„BRVÔNÿ{X¦$jt:=
-?6öÄ<‡±$>eþ8]èøæ>Ž˜[3mMû«Þ/FW·"Ç$x0^,{º"B£ˆÙ£÷žp2 Ôûíó|1™r?àÔ›=<ÜÜ_ßýÃŒ)¬”zÌî¿Î>¡ìasoöñf>yZü>ºYtÖô-fTS~ŒŸè8ÃQ"âÈï`@ ‹c>^¤/ˆ/…h%Åh>ú[§°7kÿ:ˆ
-©^¯“2Ci‘—
- 4òfå¼ú9)pþÇVUN¬7M®ËåߨOÕÏTmœ4Úµ«[Éz¶ñ(&”q<2VýòXê§táÊC/ÀY?n!n{0grâœxv>èWUUy–©ÒèO…ˆ ¢h<eŒÄ¾Ï­šç=6ÁÆú2­7*Í¿QÊS”ÖªÁŽ^ö–9ºl
-ÑJwñCÈTU&&“"ÿV—éu’»‹ºLÖª½¿¯Þn6ºjÞáÈFÚîVOÒ¶¼®2ÉòzS${”–ºœºø*#ÿðÈÌæîîÌñ‚rkDMb¨²æVq@Ûü&ÂË 26iT±ÇíR]÷75n˜®’*IœTeª³¼|Á‘½ ,Dé³Zb2ºq­JûW$
-N 놇Imø!ˆ]*Ã9©Ø{5ˆ¼k›ì ¨Uõjl2}íZ/¼èÛÍ°w§Ýö r§î^‚÷áÝ'özû× ¹½Ø;“ ÝV%.4@íò@kìÒ̘Œcݧ‡n#ír×.49©uin
-Þ)˹ªÆ•ÃÕ)ƒ*€†]ujö>*ü9…ãûñØç>
-‰}¨¤ŽØ¶Ý y-¯
-mËã÷ ÔdŒ_ä/)d±jyÛ²>Cµ€ •!R-ãØþåöî¾ïNëö½^©&½ªT­‹W'|Ù¦!à ²+þòïß>ÿqóŸ+vVéôpãùÍ z?û4ÿ|‘ßWºn Ó2áïð†+2#Œz¬¬k•N¿«ý‹*{“v÷¡  “v_n?ÀSÖ* "úݺap9¨ÏÞ®±÷_?Î/º9×rœ}—õŽ^Ÿ!qÜë«Ñ;kûF:÷6ëìSdÐaxew&ðn2¸¶Á?ááìÛ÷†‡Ï=§B&ã.*¸ù7ÎCì]·E[÷›þ¶É‹¼ÙŸO Äl¾/õ¦†óqD;‚‘0‚ÇpAE•ÇÀçFrß\NÃßÀh§²§á”cº/nÑ›‹æ‰ù8M>dEYÕ‹ÝëS+J‡
-Maž²½LÓ"©ëÁW ±´hu
-ï
-ŸDß&`™é款0>Vøå²ÂíúY >¹dÇ›‹›ýfðë‡ 1£òXßß/êÛ%ysVŸèôáƒ,‚·‚Ãø8]ìrhвH^†v‘D†Ñ
-²ë®‡µ‹•a1ðtî»xg>v d*íŽÆÿýMíí“¡4Enć?—ñÐ'ðç 5Ê8ÉhpbzûõíÔöÿB"endstream
-endobj
-1923 0 obj <<
+xÚ¥XKsÛ8¾ûWè°UK×D0^|ÍMŽíŒ§2Ž7rjwËñ&!‹ŠTDÊŠvkþût£Z²¨r¶¶x Ðh6ýøºA1âðˆQ±(•é(N5 ¹Gùâ„ž`íÉp<cÏ4Þå:¿;9»Rñ(ei$£ÑÝlGVÂx’ˆÑ]qœ3ÉNA~û4½;Ë0’<˜ÜÞ^Þ\\ÿ çx€ƒóàÉÍ—ÉG¢Ýž¦2˜|¸œž>Üý~ry×k³«±à
+Uù~rÿÀG(þû g*MÂÑ&œ‰4•£Å‰ µRžRLOþÑ ÜYµŸZ@p&U$L å ”EJ*k‚ œHEÁSÕ<fŽã 5›½¿¯ÍjëHË®lêöÎÒ`3/ó¹ûhÞ¬«‚˜ ½³å²*MA ]ãˆUõ"µ4^TžÕ~½mè /¦]“p„âap77­!§58,1‚¥a(í±œÊŠ ¯2Nd°X·‘—«S‘&7…¡¥nnhå+çrEl@]/+GGs ©Î´VBy•µ­wÛ%‘Ã+áÈSÙ“ŸeuAbŽ©ÇÉÛRë A[éTFBÞ,V0R«²6ÖVI0©·ÄÐûÖ½;Qßé_yÈÍÜ,;ZDé ÇÙ•;Q$“”q!CPµúå¾nòEAœûñaFÊ1ÒV°‡p*gîî ͳY­Ê¢0µ=ýX©”É(I¼(e·”‚½ìYÆíÒä%º-'*E0 l{6G¢#£®š‘ÍlžþuàÄàˆ„2¦(ŸNÇ Â/ßW4Øl6¬lsÖ¬ÜJ†fÇÁø½…Œ‡GÐtÍoÅÕ <4c¿=…$Úë
+
+ÕîN ïa`0t¥€P½Î$ÌU4¹´kˆÚͳn ˜ɤ?Α`N<Ë’ihPÖeWړäÇ] wô^d…ã$_ÁÀdXÙpDÎKêDcñAjl‹D½/ÒSD!H—ûq8Ï0e•|UMNÕö%â•îMnÇC&ö¨Q†’LŠ— ñ5’ÒdµÓ㘹!¢ÞÂHÏÈ‹/+wºéh°\•uç·14è=ðêÈ›¹±VÖdšæ›SRÎÚTꘅ±ŠömJ²º1›ð}MHF+­¹üŸ³É[¬×c:IÍd‚ÈÜ)©å½¾¸!¦_no?}> ¡qwÀ‘: új6à”” ù6ž«$õ.§hÓЈ
+
+úî¤(Ûe•m‰Z7õØù8bÐdžû.žLß__cŠ©^ ߀µlÀR‚\@ä¼e«4â>ƨÀAÔf©¶´]ÞÔ€ÿkÉòy¶Êr0-š:oŠ²~¢µ…‡õÑÌ( ݼ5µý”ÀBrDÞxÿÔˆQêÂr[Q$ØÚ%Á… x ´fõŒ:á¸qog^PDODÚ“·Äât§®£l›L ÜÉ„ú˨&^ÏhaÛ¬ÿ^sUÚâÞ«ïõª&6°ˆíIM]˜¡Ê1ûý-‚^) $XãAq •³¶©±ZÀ-¡0wMKœÃª€N€Ç}‡Š{¿º¦I)›†)´¨ÓØØýÄEM²4ntðš6î%ŽwEÚ;Ø~瀞‰Ž_vF/®§“ó—C
+q‚Ž:#ª3(8& ¡›z…¸~'¶²}Õl[,¨)З ù&~i¥½ÇV§I°®Û#p ä:öpKš]]¤Ëøaë¾ ¯g¦ËÏV¦mªg>ëÿ Wüí¿¿}úãòÏ3Š®ò! øÞÎÓËK:ýäãôÓÛ
+$&;Ä¢n[“¿™í“©wí lÇv4bº7Þç«÷‚«p¨/HXö|ÃÖ•€ :M÷ŽxþåÃôí“AÜyœ³÷³Ý‰ƒØGw 뚆 {W:vGëUÔLé¨7?D€Gs&O!&àþ„¦õUp¿Q©¶7ˆÅÇ®UQ$’Þ1´ùW)c]øÎÂ÷ÿ8^weUvÛŸˆŒmÝ,[È’Wà»Æ D[œ@o¼¿t0eˆ%jø‹…€ÜÜ‘pˆ4ýßÇôrH¼lÞ³÷EU¯Ú»Íóƒ'åC-§ÂËö%Õþð¼Ÿ0 Ž–©x3 P…,‰B…uÑtGåÅékŸß¸^<šÁ‹cĤÔâµÄîM‰ø_gHCwr®_Ëûç›ò6YÙ•§zyt5KÁÑë¶è~¼Øe_¡Y•= í¢™Ž“+è~¹u0–F-Áñp:üA9©¼OŽÿû?èËo^­n"‡qÊ8dðqä•ÂC
+¨îÿ˜êþŽâšendstream
+endobj
+2387 0 obj <<
/Type /Page
-/Contents 1924 0 R
-/Resources 1922 0 R
+/Contents 2388 0 R
+/Resources 2386 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1925 0 obj <<
-/D [1923 0 R /XYZ 56.6929 794.5015 null]
+2389 0 obj <<
+/D [2387 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1926 0 obj <<
-/D [1923 0 R /XYZ 56.6929 581.7741 null]
+2390 0 obj <<
+/D [2387 0 R /XYZ 56.6929 562.0317 null]
>> endobj
-1927 0 obj <<
-/D [1923 0 R /XYZ 56.6929 460.6765 null]
+2391 0 obj <<
+/D [2387 0 R /XYZ 56.6929 444.3852 null]
>> endobj
-1928 0 obj <<
-/D [1923 0 R /XYZ 56.6929 366.7195 null]
+2392 0 obj <<
+/D [2387 0 R /XYZ 56.6929 354.5963 null]
>> endobj
-1929 0 obj <<
-/D [1923 0 R /XYZ 56.6929 293.4426 null]
+2393 0 obj <<
+/D [2387 0 R /XYZ 56.6929 284.7704 null]
>> endobj
-658 0 obj <<
-/D [1923 0 R /XYZ 56.6929 247.3727 null]
+842 0 obj <<
+/D [2387 0 R /XYZ 56.6929 241.0985 null]
>> endobj
-1930 0 obj <<
-/D [1923 0 R /XYZ 56.6929 211.2315 null]
+2394 0 obj <<
+/D [2387 0 R /XYZ 56.6929 206.0104 null]
>> endobj
-1931 0 obj <<
-/D [1923 0 R /XYZ 56.6929 172.539 null]
+2395 0 obj <<
+/D [2387 0 R /XYZ 56.6929 168.371 null]
>> endobj
-1932 0 obj <<
-/D [1923 0 R /XYZ 56.6929 96.3402 null]
+2396 0 obj <<
+/D [2387 0 R /XYZ 56.6929 95.6233 null]
>> endobj
-1922 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F53 1029 0 R /F39 899 0 R >>
+2386 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1935 0 obj <<
+2399 0 obj <<
/Length 4190
/Filter /FlateDecode
>>
@@ -9373,1103 +11443,1652 @@ p˺ëæ‚[À‘ r8ô >ð >­EðI‡<ãt
ì`WAŠõÉóõ82ÒþÀ˜Ï9Ì7ÏÜÌÞ¶óMŒŒ® N“:å“ÄÔgÚ_ó€Íu2±@0°_¹šT‡ÉÙ’›ê’o:æ¤ËHÐŒoi!Ž,«ë4¸«Tz²ézVÿ–N{ÖJf†Nb‡÷ûW³¦nòD&3çMg,Âù²×/‹op…}ŽRcpõ7+z›@
‰PÍ}n@© rüƒva¢ ±}qM›ï9îîþ@™3}]}9O!£…ìX"B¾gøzPТZ†C1ÿ8ú|ãOù7›úyü]Wï
DrÐYúûé8ÆEôȵî9'ÝȇH¥ã$5öäq2U*tìJ, ÕÔ>çÎh¾P@N WNœq‚Gbˆ¦š³CÔUK–iC'vbÂ×<Ítþ”¨È¤q8`ûùÄ9‹íÎY&ñUfÂ0ϧ†!»³{i' k’fŸAÛ‘ÖñÉ¿T‚“L?óVÜHi‹ðæäÊŸ¤‹t˜™„Ã{ì=mtÀNr§”¯rŠ—$Ùtõ)Ñ’u×*?gT2ez¶aóäjkA3;ê•Pݺ\©ú‰ÌÃ4¿¦kn ÿÉgêù.—Ö'ë¡I¤cm?%%˜EE‰µ£"]x•r(`Nß겑LSs>ÛSbxW/V¨6+*gS8`¼jÚÔG¸UáúäôÜé*ß,ˆeÆZXë¡E„ã¡Óv;ÐþÆSi8¤KÝÆ8Ù‰ⵑ¸ú”ú“EE@zp~ü„q\ó5
-¾NQü­ñ—ÿ(·‡-_às¤þ*o‡Q¶ýô`“«¶»€qâ§ÏÍôÔDømÂ_þ™D÷+Ø
-Æendstream
+¾NQü­ñ—ÿ(·‡-_às¤þ*o‡Q¶ýô`“«¶»€qâ§ÏÍôÔDømÂ_þ™D÷+Ø
+Éendstream
endobj
-1934 0 obj <<
+2398 0 obj <<
/Type /Page
-/Contents 1935 0 R
-/Resources 1933 0 R
+/Contents 2399 0 R
+/Resources 2397 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2371 0 R
>> endobj
-1936 0 obj <<
-/D [1934 0 R /XYZ 85.0394 794.5015 null]
+2400 0 obj <<
+/D [2398 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1937 0 obj <<
-/D [1934 0 R /XYZ 85.0394 751.6872 null]
+2401 0 obj <<
+/D [2398 0 R /XYZ 85.0394 751.6872 null]
>> endobj
-1933 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R >>
+2397 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1940 0 obj <<
-/Length 1972
+2404 0 obj <<
+/Length 2028
/Filter /FlateDecode
>>
stream
-xÚ½XKsÛ8¾ëWè6RÕÁƒ £ËYÍdl¯¥líV&Z„$ÖP¤†¤œñüúm
-Ù/veÝ&&ûš)’,tb‹²ñ©ŽãØò4¥Q[«"µÀžÚÁŸGU½XZ9X““BýÕR‘ìU­ªgU™y¶1ï¤xq’O‹Õ”ˆ‰ªe‘Ö†ò-kvömë8 T"΄€A’sÚš¹œ?N9Ÿüëv‡“ÙÂfÒI\­~6¤o»l½3ì6ïÖè;S[B¹1öInÆus|H/óÖ|MyR»ä9++mjÍÅ`¦@àYz%ˆD$Š»|Øû‚¢0ä.pë¤p
-ÍûX«Ôn¦´fªælw{µ/u¼ ²µäT=·Û¬Øšéï³dkŒ³~î°r2r‰Q©uY¥SG"âܲýì‘B¦fŒ)1±¸Ëç¤H=‚ÀqŒÇNRS%kŸ$H!œëPW:]úlÆ“ E„@¹Ã&C†Mõ.nîŒS–ŸîÛ[yäCŒ)‡6¸ØxªS@MaqQœC; $6#Ž)ÑéIbˆ±Òц\{:fycˆ¦,4Ñ ¤ß1ÇYѨªH4Z$yöw›°”–û$³Bt=+1+õñp(«F '™•nò ˜“õZ,Q‡ÀHËêCž¼Xqe˜Âd
-õ§ŽÂ»m“ pFÒ"àdÝB[‘Ї£!8ðÓãÒ¾­Á2ÙÒ@Þ¡Ý!L7fÛ{+»-ô¨ÔƒÅ:#Û…—òøSj˜óìÕ7 ÞǪ0là »H•6Ï´É&e:xëE[û)`\Tjç1J­ÉI]cŒÁî û0-Tm8?"BÍâ˜:ѺÏzŠCD%—ãXád–ßÓ P}D
-/tƒ¾Èö ?;½cDá„<iÖ&Þ,–³÷Ÿæžd 9ÂaHíVTñœ™°{U4Æ Ï dîS®t3e¸ÚYçµ>oýi}ÞN²Ú¬BžèRKݪu(FrhD¢ab:Mð;,¾í
-eþ=Þ{)ÊCÕç%È‚šÁê€ø/°$)×'´¿·ÖBŠöE\Vœk­;®3gXGDàë/Á³¯O º–®QÈ¡ÇË}}¹nº þê$’nD»QâÑ¢ë-ìúš$ßú€MÀGC`ý&ËÕ«þÅ.XšðoOÄÿ:®×ý —•k~ÒÕðnÿw/ ÖqÃnu'uýý™‘¾)0°÷ÚG% ;q¦…P‚CÀ†0'lÂ(…Fú aµÞÌ—«ÅýÉÏ‘ÎMg$8‚s]iylǶ§¢Üö4šÜ¨\m°ÀÂ2ÛmWc š7KÛq¯»5ÛÁZ.C]›>+=}ùøè@>M¬^×BX¾¶cƒåÇÛ†À".ÌÈ^ÆÛÅ ]1
-n1{wïäøħ6É1oήéew×µ—ß²Ù]ê,Òò¨ •7
-endobj
-1939 0 obj <<
+xÚµËrÛ8ò®¯Ðm¥ª!‚A‚G%–³šÉØ^SÙÚ­L´I¬¡H I9ãýúm<H‘,';µ¥ƒ€F³»Ñï™bø‘)PÑhF>â˜ðéæ0ÁÓœ}œ‹ãµH^ëýzòî–…ÓE ¦ëm–@X2]§_fïCs €g7wq¼üàÝÄ·÷¿þ²ü÷Ü#¡ÀÑlñð°¼»YýkîQŽ°1žýº¸û¼ød`óˆÎ—ñüëúçÉrÝIÖ—ž`¦Äúcòå+ž¦p‰Ÿ'±Hðé7Ø`D¢ˆNŸ3Ä}ÆZH>‰'ÿèöNõ§NmŒ( ¨C”ºÔÁ#0Ê´:Ö{©.ñîÖ'=T
+}?ú
+Ç« Ê€áˆS*,Jyl²²˜{Œ‹Y#ó¼ý¢O® Ø/öeÝ$õ9S1¿%[”‹u€„†§) ÛZ©
+š¥WüDˆaç—Q|äû¼5Ü&)Z†æÿTËÔ^¦´bÊft»ƒ<”Ê^?ÙYp*ŸN»]VìÌö7ŒY²³ÆYßwX>´ŽQÉMY¥QG"àÜ¢ýä äƒ§fŒ(2±°óç¤H„@qŒ‡-¥¦J6.Jà0B´ªC]ètî³z,b( Â.é3l¢wusg”~x¸×¶vÐS;lRàjëˆN1…ÅEpå$àØŒ´H‰rO‚¥²6øÚÓ)Ë4a¡€FH
+È¡'‚1Š|ö–¦(ÂA—¢’ãQ‡by¬²Òã‹á±) ̦¶»}îÑèH…­,6ejœv:Î"šÕ“Ü–&ÖÍ^¥Bõ©MG aEÁ^Ûø@˜Ad3äɺ1
+òÌY‰x³Šï?-Îês„}ŸÚ«Èâ93f+²hŒžðܧ\ªfÂp½·ÊÓ:×ú´:×›¬6§à'ê£ÔB·j
+†‰84"ÁÐ1[NÃ
+Ø‹o{È5Žì- ¡o§/Á»*VÍÅìTÔît ™ù!‡éövõÉô|#…òë;ÙlÞUºî"ˆñ­‹RŽ—Ks¿Å§øþí žf;•L‰J“¶mPÙ U@¡€½[ùˆùAËÓ§ˆ ÆÛNZ^ ½mZÔµÜxi½­ÊÃïò¥(”AÈ}§²[0Ð}$Œ\gB&ð1Sµ) ÍÊ´Ýv›ÿÇGó¿“…¬ÓJš^¡Ì¿G{/Ey¬³z‚Œ (Ð þ!ˆ{˜€£ˆrU¡Ý½µú\´Oâ2âÚÖºÃ)Ã*"
+9ôx¹«/WBçÁ_[Š¤[Ñn•8¸¨xó»¾&Éw®Ä&`„ÀÁ˜Eî 7ì£liº¤8D³AÛ,—¯Z ÙÀØÁb=W,Öb½n1~PÏ3˜È:;ý¢y[Ñt¶ê”/‰rZyNþßÖûâÕÝjã ­&,„9ó‡¹}“'uýýn½}SêÖ…Æô`ÒTã÷ˆÞâëµ 8
+9ãÿK‚ßçô8¬$TMç„Œ*ÉÍ2þð¸zX¯îïÕlœíéy”†G&$ô0~jŽ'ÝVRnÛ#Ìnd.wmn…ƒ8Ûº±ƒµª7±mº·Oz±‘Ë@7¦ÕLÏ_>>¶u>M,߶‹²xºi…ãÇÛÀ.ÌÊNNSÏ^bа|(>Ç‘-uº‰LŽ»ìYÚ’úQ2Õ£*øjí¸×F¸|ɱi„0¸"ºžkúXæáÅ•k:,=D“1Ë
+ ='ùIœrë¬É!
+ê¼áø55D$¤m¥=œZÞO–UYœé
+endobj
+2403 0 obj <<
/Type /Page
-/Contents 1940 0 R
-/Resources 1938 0 R
+/Contents 2404 0 R
+/Resources 2402 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1912 0 R
+/Parent 2414 0 R
>> endobj
-1941 0 obj <<
-/D [1939 0 R /XYZ 56.6929 794.5015 null]
+2405 0 obj <<
+/D [2403 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1942 0 obj <<
-/D [1939 0 R /XYZ 56.6929 684.0716 null]
+2406 0 obj <<
+/D [2403 0 R /XYZ 56.6929 684.0716 null]
>> endobj
-1943 0 obj <<
-/D [1939 0 R /XYZ 56.6929 572.8605 null]
+2407 0 obj <<
+/D [2403 0 R /XYZ 56.6929 572.8605 null]
>> endobj
-1944 0 obj <<
-/D [1939 0 R /XYZ 56.6929 509.4701 null]
+2408 0 obj <<
+/D [2403 0 R /XYZ 56.6929 509.4701 null]
>> endobj
-662 0 obj <<
-/D [1939 0 R /XYZ 56.6929 470.2699 null]
+846 0 obj <<
+/D [2403 0 R /XYZ 56.6929 470.2699 null]
>> endobj
-1945 0 obj <<
-/D [1939 0 R /XYZ 56.6929 433.5878 null]
+2409 0 obj <<
+/D [2403 0 R /XYZ 56.6929 433.5878 null]
>> endobj
-1946 0 obj <<
-/D [1939 0 R /XYZ 56.6929 401.47 null]
+2410 0 obj <<
+/D [2403 0 R /XYZ 56.6929 401.47 null]
>> endobj
-1947 0 obj <<
-/D [1939 0 R /XYZ 56.6929 335.1577 null]
+2411 0 obj <<
+/D [2403 0 R /XYZ 56.6929 335.1577 null]
>> endobj
-1948 0 obj <<
-/D [1939 0 R /XYZ 56.6929 244.1508 null]
+2412 0 obj <<
+/D [2403 0 R /XYZ 56.6929 244.1508 null]
>> endobj
-1949 0 obj <<
-/D [1939 0 R /XYZ 56.6929 168.8052 null]
+2413 0 obj <<
+/D [2403 0 R /XYZ 56.6929 168.8052 null]
>> endobj
-1938 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R /F39 899 0 R /F53 1029 0 R /F55 1037 0 R >>
+2402 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1952 0 obj <<
-/Length 1659
+2417 0 obj <<
+/Length 2162
/Filter /FlateDecode
>>
stream
-xÚ¥X[wÚ8~çWð'±ª»å¾™„´i“4èžîiûà`A}jì,†¤Ù_¿#KœÐ=›<X¶G3ŸæòÍÒÇðOúJ Ì"Þ#Ž&¢?[öpïÞõˆ“ ¼PДM{o.XØP$©ìOç ]
-a¥Hš~Ä··ã›óË/À
-<¡a 0\Ç7Ÿã+ûìvÑAün<D(%Aˆ1‰ç7“Éø,ø8þëâîÓõU<_ ¿O?ôÆÓ-¸æfÙß½¯ßq?…s|èaÄ"%úOpƒ‰"Ú_ö¸`HpÆü“¼7éý±UØx[oír
- Êe?`•cÕí6Œ°
-)˜¥¯çDCèå”ðBuF̺ª#Ê€ÃlÍò¤ª«H ÃE¯ÂÚ
-âj×6AZÀ&z–÷ëýRª£iX½ü†Nõ<Ùäkç\÷âò^‘S{³©ô|“¿gÀ'Àñ0ŽB*Ø‘˜4¤^ Š—ª£’vs›Š„ç¶4[éÙº\=DF`9¿
-Î u€kEFÎÚè®Êò'”–ƒy¹²@yóH(1‚B±@7k±–r¦PD€%¬˜­´Êê…ªeÀBDŠ®óïi).C'™8¥–`[ e¸í„AÍ) ‹¢´¯R+ùôCvU”ë-´¶¶Ýùú% 艞#l*os¨ýöÍä9Š°„&Ã"$”%Ìñ—øúöjÜq, $lpsÃÔL¥IS2¸ßdyj–Ô§1LÞÇp•öéùÄ>¼»³÷óúœåÒ>5{¬ÃU3úR!…¡bÇä¿’å°á¬\¢ŒÙ ¶Ç@!ª(RQ´Ë
-Áà"ö<š©­Ï§r“»å½ö¥_mtú¶ã@à@A[j«S¨¨*= Òj¾*—
-¦×ã)]»Ž‘VÊÀí,1ͨ1<HuÅjÊÔÜÝ?Û뺱Ý.²¦‚ºÌÓ™;hÄÜóÊÇþÐI’$'™ùë
-‘
-Uزo“Ÿ“É0Tí‘c‡ ™sâS‘Pªý™ÜZèB¯’µöÕ⺟+Ц*Ó0
+xÚ¥Y]{›8¾Ï¯ðÝâ§c„$$z‡§“Išvã´;;ÄÈ O1d N&ûë÷è &Nf·½@Wç¼çC™`øO&’#Lc61C>YmNðäÞ}<!Nfæ…f]©ùÍÉgTLbGa4¹Ywö’KI&7ÙoAòåËâêôü—é,ä8˜£éŒc|J®¾&—víË4ƒäãb9!q BT‹E88½Z.f§Ë³ëÏŸ.ÿžþqóóÉâ¦EÖEO0Õ°þ<ùí<Éà?Ÿ`DcÉ'O0ÁˆÄq8Ùœ0Ng”ú•âdyòÏvÃÎ[óé˜5—ˆ‡,šÌ@8b8·F˜ƒ f‚a$#µ6 ɘͼ”¶ÙìBôÇ3Î;’ñ6×Y¾U«¦Ú>-BxÈ£hÒU{
+ycumÒçÖ,ÆÀReÄHè-lKBµÉ›Fe/SÄ9bq$SWêå`j¥L0%C•quCˆã*½ÐˆÊ^˜`e/î«</WÅ.ÓD¤qðëòâµ>ãéÑ*Õ6mòòÎÎO—öi)µªÌ3«‘¶¬þ5å
+ipsïö¬Ô*×N
+—W×p ÅD_!©€æ0²wÃÅ/ɧ/—‹‘$'Ð|#"¨¼ÑùÑ4$¸Ýå…Ƀ¡ÇA‚åO <#»j;â’h§¿6«ú[{d¯Ñ†æ3_U.Ô_éæ¢uUmÐ;èpÞ…ŠðPtŽeï/ž{‘}’i±œª(ª'g3¸T›™/HPÙbƇ ßó<U»"ë÷Py]ïTö~ä@`@¸¯ A¬³²®Õj–Õëmµ1÷ïã`ÚçÛ;ض-zðá(PÓ§¹RYm´Ÿ-Wòïê À»È¦À_¬£Ý¢Ö~ÖO‹Õ ¹[±šEršˆD°¹<ÅóDF"ŒæøCŠ$‘<™Ëùü4œÃ¦ Zx-ÎÎ̹ ŽŽ>ðE‚ç1#7î³úìür±<Æiѱ%=ÎPw[ ©½-ê(þù]ij?ÌnŸí³é|nÐf”ɦ+Û_ŒµXztæóþE ÿл4Mßåúßh¨Â1kãÂdÌ®rÈ´…EkŽ0%²SSH¤¢§ß²Ÿ©FÈþåo ésâ“Ú¢‘ÿ='u ÊÝ’|¿t늀‹Ø t5‘¶n
endobj
-1951 0 obj <<
+2416 0 obj <<
/Type /Page
-/Contents 1952 0 R
-/Resources 1950 0 R
+/Contents 2417 0 R
+/Resources 2415 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2414 0 R
>> endobj
-1953 0 obj <<
-/D [1951 0 R /XYZ 85.0394 794.5015 null]
+2418 0 obj <<
+/D [2416 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1954 0 obj <<
-/D [1951 0 R /XYZ 85.0394 575.4191 null]
+2419 0 obj <<
+/D [2416 0 R /XYZ 85.0394 463.2352 null]
>> endobj
-1955 0 obj <<
-/D [1951 0 R /XYZ 85.0394 427.1073 null]
+2420 0 obj <<
+/D [2416 0 R /XYZ 85.0394 318.8302 null]
>> endobj
-1956 0 obj <<
-/D [1951 0 R /XYZ 85.0394 329.3834 null]
+2421 0 obj <<
+/D [2416 0 R /XYZ 85.0394 224.0131 null]
>> endobj
-1957 0 obj <<
-/D [1951 0 R /XYZ 85.0394 262.8864 null]
+2422 0 obj <<
+/D [2416 0 R /XYZ 85.0394 159.9229 null]
>> endobj
-1958 0 obj <<
-/D [1951 0 R /XYZ 85.0394 196.3893 null]
+2423 0 obj <<
+/D [2416 0 R /XYZ 85.0394 83.8775 null]
>> endobj
-666 0 obj <<
-/D [1951 0 R /XYZ 85.0394 155.0304 null]
+2415 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1959 0 obj <<
-/D [1951 0 R /XYZ 85.0394 117.4002 null]
+2426 0 obj <<
+/Length 2546
+/Filter /FlateDecode
+>>
+stream
+xÚµßs›ÌñÝ…fúPy&û \Þ[Iü%±]K™6Mò€²#P²ëþõÝ»½C€”Nç=°ÜííîíïEtDàGG2ðÅÔ(T—„ÊÑbuFF°÷ñŒZÏ!ym¬÷ó³·x8R¾
+X0š/[´"ŸDÍ“ã÷¾ðÏ_^ÏfÓ ïóôû‡»›¯_&ï§_Î=*£(Ono§×—Wÿ8÷˜$p2þ:¹þ6ù‚k·çŠ'§³ó_ó?ΦóF¸ö(áZ²ýøEF Üã3âsÉÑ ¼Ÿ*ÅF«3!¹/çn%?›ý­!ØÚ5GB‰ÏxÀ4Âèˆ
+Ÿ Øl«D*ŸE!s*‹¸aRTUºðžÒ×å¦\åñ}šëûK_­W8p¯R½ÔYK߀Ŕ/‰šn;§ÑØ4úûÉXˆšaÀEà!-ÒM\geïuYæ–#܇úJJfYòÀ”Š ËÙkQ®«¬ê…S?Œ>
+4 AÚ%R¸“ æöCJƒ‘×&a,è€Ë5X}E4J@Ýž½pÝ‘ <ôE$ðÕ‡#ô8=¢@J‹õÃã¿æ/
+>QÀ-vœ?”›¬~\ ÐL%ÂÀb6D'D»"$q¾-—Ë*­ÈôÁEŸìb€,¸ZèGâÕk, gy\U”Áå¢(ê¾üsäž$›Y‘ž4XCqy’â2†î-|F¬Oïc] Pî^ëSNWRçRѵÍï©aûù¤û%Ù&]ÔåæuÈý„0Iû·*Nj©€œT¿®‡4/À û4oÿYŸ$»Þ”u¹(óßõn0LBHT„Îô·eÞsÂú¤ÌTË [è*×£÷|’^ž>¦µáh~µP±+<2à1ø4R•eÎ_NgwW·ó«›ëæT·\:XHféý­Dgô‡´®Î!_Q]¹,ô‰¡ú1Eà!{N 2›Îͪ«Šøãc±y]×%±ÁH^ði‰ÅE‚Àý6Ë“{~Âò´BfËrƒQë¤îm»ðþ$’ÌÒÅÖ1²…–é|‹+|&©fQ¤ ¾f¶@ß}°” „J{¢Hz{‚ph¾lCA#hB¬óÇ!ç‚ŠL¹ˆZ>`ø<p8å‰5ÏD`
+XÉ*|Vët‘é˜
+žÓëùÕü;îîdPXõÛtãª*™uox·=©¢ˆÉÆ¥¹éN„ïvïÛlz§/ËÚ7G®³\ƒ× áP‡ …zÓ㇎âÍüS›ÓN->.â°hÀf<ÔŒ›ñ^ìxû×ÖÌ8²aè³0 Ç#¶…t8`’‰×‹½Îv Gù9œ}~m?™O#uø]tg]fWe’¾Ãßµ¶ˆm.óÄ«ê×ÜÖv×;j—$hÑr[»#ŽjZÇ0|Ķڿ·Ëͼÿ•´È]€þÞgTý­Ògj÷?^ÓN¦¦¿b‘o“_lù2ŸóþZáÚýÄþG¨WÓ8ãáÞ9w+\®`¶2‡|·_lw$Ô®ìÙ’ ÚŠãÜ}€¤óŠFIŒöü¬ÿ:僟¯Hóîÿþ›x÷§¸}ElعX=„Ø
+¥µNÙû‡ò¾ìÿ‚Ê¿Áendstream
+endobj
+2425 0 obj <<
+/Type /Page
+/Contents 2426 0 R
+/Resources 2424 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2414 0 R
>> endobj
-1960 0 obj <<
-/D [1951 0 R /XYZ 85.0394 84.3344 null]
+2427 0 obj <<
+/D [2425 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1950 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F39 899 0 R >>
+850 0 obj <<
+/D [2425 0 R /XYZ 56.6929 769.5949 null]
+>> endobj
+2428 0 obj <<
+/D [2425 0 R /XYZ 56.6929 744.4739 null]
+>> endobj
+2429 0 obj <<
+/D [2425 0 R /XYZ 56.6929 712.5891 null]
+>> endobj
+2430 0 obj <<
+/D [2425 0 R /XYZ 56.6929 647.0402 null]
+>> endobj
+2431 0 obj <<
+/D [2425 0 R /XYZ 56.6929 551.5126 null]
+>> endobj
+2432 0 obj <<
+/D [2425 0 R /XYZ 56.6929 446.5077 null]
+>> endobj
+2424 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1964 0 obj <<
-/Length 2625
+2435 0 obj <<
+/Length 2973
/Filter /FlateDecode
>>
stream
-xÚ¥Z]oÛ¸}ϯ0p_ fù!RÒ¾¥MÚdÓ:¹µ Ün·Š­ØBdÉ×’dý9¤$ʲ³À"¤ÈáÌs8<¤ÃFþØH*¢bÂ8 ’29ZlÎèh}ŸÏ˜•™8¡IWêÃüìý'Žb+®FóÇŽ®ˆÐ(b£ùòçø È9h ãËélvõqr{õãÓ·»¯_.>\}9Ÿ0Ej|q5½¼ùßù„K
-C`
-&BDA
-Ãá,±}€ƒxg¤8QÿUZWç!Ù†ÙÚ l¬Õë+«ì9-t•ŒŸ³qŽ_»sË Š%X,v¯ÛºÄú:1Ë,­¾¤XbåaŸåËÖ¬üI)ÏÓÊZ(wz£‰sÜæfÌ´RIgébï é6è‡fö¿’
-ËeªMé?³ËoŸ¬&ÈSÒŽ(–½¾€
-8BHýÐÝ™¨f}›è¤ŠHL!ŸÌ†])—¤³a#eÒ”Kz²›¦($èXå¼®sŒ3Â#€ÓIï©÷ºHcœÐé¹7Kót¡1Ç9G|é
-"fµK¶ëlM“p¦
-ÊÆs'ûœä{[-‡¶äd Ùi8Á{ÂRƬàf_Õ¨öÁ©/Z;¦ü6»øz)ß!‹Ø
-}@‚ÈìúBNDl|9»Ð5)ÇS€©èvrlj%°“KeÇâ·d»a˜òòKöËìQc]ƒÙl,5¾Nó|bü£Î/d3›¤ÐA/&£z1+»CÌrÚ}‘t·Î"q"YQ¥E•ÕH£;" ‘Üèå £qQê2î,¹iÎ*l®¶é";Çí.õ–(PÌ.ʾdyŽÍ&Pî+³]¡ïá[–éc²Ïk«h_@ʨ°GãjàbRæNŒ‰@ HÈ›¤]në¬,g1±Ppz
-*}dÍüªLn¡¿
-ŽœvÌ 8æçP˜@,Bß³›b ÇOmV4îÀ5µ+ ]á͈ ;eQ'Y‘«Þ(Tªu¹Ï­ô:yN=9Þe V£^s‘ˆ­B[QZ§Œ´¥t\¿¬Ì°ÇepIMõfjs¿ýÖê( ô?T‘8 ƒ®Ôq4Rƒ')t«ÞÛÀI¤¢Ón9¡·¼' ÷¼ˆùnÍRC†ì#‚®øQ ™åºÎñüìJ·öÆÛQ&·w%Ûœ‡ª|H騇¦{=¼0¬jNnUd ºdY.D©Hù˜¸Ý¶§ømj‰Ö,[YØ´ڤ„ÚA<€ŽADÄ„êלÓéH€ˆ“2Y÷M*¸ùÆá&ЀÉnøCFhõLÞï²Â‘ÎIJÐu¹³×€j¿Ù$»WŸL5Ô ¯]Uïóòj¯i¶£fåÀ«‡k\Öl_ÅVi1phÃ$c¹„y<64Ò kûv¤NÄÆI™Ø<Í)“mlLƦkòs
-”)q÷Ü7’öö]bCî‚׸ÂCóа£+ÈÂðœƒ]©ã+ØH™ܾI]»ÏȃÔõ¤s-u=ônºzîÍð‰•Åö9•SpǼš¢K¦Ë’PÝi‘'¾²ñZbûSKd%¨™×jnöÜl@ýYì7:–ºé!­_Ró¦ ÔŠÁVCúáN{/[\Js‚R÷ÇÜ ~˜SJ¡ ê(VG¹ ï΂ ªÛ²ª²‡Üjj˜[
-ß­.™ã.KÃRî 3æ6·=´ÐÃÛ”V-¢ :ø-Æs„+¨ì=ÌÚG"ÎÜÃlkúâûüúãÝô“þ­õ6Mï™m´î‡¦Q´}ÆÃiOïÜXƒ]åP¯º¨WõÊó€´Mº&mŠ|LwVؼ påVL“æe«Ó›ìõãhmßZNêD;/ì/(ºÍ€tsš&ÝW3÷"‘æ}¾;€Ú£pWÜÂipí¡ã`wBëÏÃ9[aÐÿYÍ£­!‰yÄOzåd½òo.œÄ4–ž[³Ã‡²eú°_­Rg¼"Ç~Ë’è༢ÍOEÿúwþö¿‚öRtäy‹‡’À`åœÒócŒÆÙþGÀ¡ï;úendstream
-endobj
-1963 0 obj <<
+xÚ¥ZKsÛ8¾ûWèfºÖb€à£öäÄvâqüØس»S“9Pe±B‘‘²ãùõÛ(€¢è­Ýä
+¥ðe(„)ŽþÑmhͪ¥C‘"ñeÂã‰pnI„УI,S?\(‰¬³7¸¸H¼YNm“·Ø‰½v•oNXâéñ¬¡ö5/Kê}dð¼•Å<k‹º¢ÁEÖæ§Ð /›·ÅËðTÞÎa5ÁŠ ò®ó7½y»ÊôéE5/·‹Ü M·GF=›qЈbʘŸJÉÕ½`}½~†ÓgeNš}-ÚõêrWSÝ—|Ó
+ ÕË©‰î‘0çµj49¯«6+ª¢zê­ú‘¿Q§YÕÛRS¯²—Ü¡ã^óœÏ‹ïAÀs³#JBA6ñ®–4VÕš)E=UHœr4å¹€¤NIÛ$TÕ½º¥¶Ð¿·M¾8„(æ¾dà%F`SBG¥€°
+bì|
+ Ynêu™Íòr V§¨ȈhÍa EÒ‡ì)}GCÕˆ† •ÒÐõP†ÔO¦æÅ&Ÿ·5­ïƒ%‡Ô0ŠÆ™ë¨¸sÌN‚ãÄå\pÓÓ°C.O±¤Í@ƒUÌW=òÆŸ¡.MÎãø¿V›ëÌØЦhÛ¼:¬ br½£ ‹jD†JéâÇAk;rg-{GZ‹}¤ë×TôÁŽ}´Ð€ne²Wȉ´ÐMÐXvX‚„Y¿“LØT#4TJ‚ÏChf˜1{ÞÔm=¯Ë=4‡!àN†ãÌuTܹ)xêÇ"Š]öÎÂäzr=JÇ5Kjê%+·9u—#J“‹.ä`a˜$:!€ñþ6\Ŝɨ©¶ëY®w›åíkžW4h2ôvØáRZ›«BÀ]Ò vSˆE¾Ì¶%fH@ªKROÐOL$¨f5µÌÝzpþ¹nŠY8¡.ÜÐ Ý©ðÂ!ÛýÒ\g½8 µU‰L¨ ƾ]~¢.…Ô»T†¦mܪêóf;ŸCQTo£6 c?¥G­Muµ•Bm;˜CcbIûöœ¥ÀP²„ã|uTŒõSà@`ÎìJˆ¯Ê–
+4¢Bèn&°
+€eÇ${ç`ûöάõ‘<";ÃN‡zü¡Ò0híÃüÝö¤ö‰K¨öiFElÍ–Ù¬(‹öÍͶ0_µJøúä¬ÍyÁtfcêÐ0wÑo··çòj¾y{6¹*l{ñ"e¾"G¼Muñ•BüË°ŸPåhÍ—ùK¾ï¤<†Bm”³Žj€5·úg>—‘ËÚPʑ϶OO]1¤8;,3 ¾#3‹jDf†JÉl/K¶è# ÑÀ‘NvøI÷Ž<+ËúÝp ô$ö9%U8Ø%U8ŠøÂÁYNí“Î-4 R«h¢Xê+MÙíwuN3¯ô>‚CÐÊb‘ëqUÞà0=Êà•ÒÁ¨ÍBD@e¡a
+†öjÌTŠ©ô¶ªòó—º|ɨ7S8uYN¦<ôÓ
+"êI=áW˜j5~n1xýenFñÎ"o†öÁbça@‹ÅšMh¶j[ô=?•®aò,ÚS2â¡w¼®©+¼ã×®·èz+ÓSwÂÕë aØ¥côy±{ ¦E-¾½lIæ,&$Áè[žm4Sè9òYÕ€I’žOD’:<œ®êí†~,²·F‰´üTÕ2_˜(óì™zê0´*M·®«v¥7uOWCÝyÁ㬭 BøaŽ·8AzÓ×ITO뢩4§vIˆ§ma³«^ðqë_'®Ö–­û^c)ø´ÿDc+Ãz
+³”a½4PŒV#…(KŸ§é;)½Mu8XwT*Xß¿[ˆâG©õR]¥ŸæDÜ’÷øë¨tÒœ(ö£fuž“ÙBi´ d†ÔCcº{QÁ¢‹F(øaeV×ÔÎô&ú­Sišîù Ÿ³yê-[=Ô´rºš‰SŒäf>T¥ë2öc.¤kE¯…ú.síè¹ù„·0¿¨Õ~Ž+ô…¼XX{У­µÙ¶1©»@«_lqkõN žü¿µ´zª®2|,{|L?SÛ=íBE6Jßw¬k¦
+wó¹æt/S5å‰eßÁ'Võ+6‡ Ap?Nâw2}›jÄ •2„³wßÇì ô…dÉ8{Õ
+IÌ\ØÁ]‚;¶´î8D Â`ZQÕÔ¦‘\aZJÂ4N)Lã aZÈn#Êï#Lck0}…ig'B±áDm*Ìï>âÿgLÇ1TPùŒºÞ|¹ÖD
+Ð߆Œÿ7ˆ~lí8Œg¢ÙçÍEsâÇ1D›9 æD»ìh0'äÔ±5`¶©rI _òÈo#(gøÕ’ºnƒƒ6ˆNŒ7‚FCÆ÷¶gÑI°C4ž<.¢é æ“ çYc'»*+ð®ZS“(ÿm½â[1ÀJ:O©c€ýgíú­·“ÝÇ:4“ƒ#¤83 Û «zþï¿ÏÙý5RƒOH<D‹
+¥ËBÖg½ûKž}Þÿ¢Êòƒendstream
+endobj
+2434 0 obj <<
/Type /Page
-/Contents 1964 0 R
-/Resources 1962 0 R
+/Contents 2435 0 R
+/Resources 2433 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2414 0 R
>> endobj
-1965 0 obj <<
-/D [1963 0 R /XYZ 56.6929 794.5015 null]
+2436 0 obj <<
+/D [2434 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1966 0 obj <<
-/D [1963 0 R /XYZ 56.6929 749.0289 null]
+2437 0 obj <<
+/D [2434 0 R /XYZ 85.0394 287.1527 null]
>> endobj
-1967 0 obj <<
-/D [1963 0 R /XYZ 56.6929 675.7286 null]
+2433 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1968 0 obj <<
-/D [1963 0 R /XYZ 56.6929 599.4635 null]
+2440 0 obj <<
+/Length 2099
+/Filter /FlateDecode
+>>
+stream
+xÚµYKsÛ8¾ûWè°©f…àI
+?ÊÂz³âöñJþéœY©(ý«¿l[‹v³öYgEXŽèì9“h8üubõµŽ3«Ój©u¡±µ#ßB­AFøëáuZ‘øöÈÅ 5¹ c¥ÌC‚c—•,»(¥]{Zmê­…õ¥{¶©€E “›¦eÃ$°Ê™°”
+žl’©ŠØõY©ð–ó²x#ŽS°1 â>§ ÞÀ-ÁãoXàkÏ¡uúâWë4,<0àbì47e5eõ2Ú{Ò®ÊgóÁJ>Fà„8
+S¥mÝ9z…ÂHRybjèkµ½€ð@’ „%=[Ÿo˜È¡S öˆ¢¯; J‡N÷ò¨ ÿh-öÚdF2HÄ1ñðbY¤ks¨#¡4;TOë ‚ÖI ^sºjè4Tß)ð=†Fœvõy
+¶|j§òÖ¦½…ûäh‘„ÝJ×ÊÝšøF‡b­ZÀh£¤<Òª‘;»áÜFšr¾x[@œw°6+†¹ØlòÀrk¦wC‡ÄIìÉKŽE ›}²3Ða4„ ˜Êáøõ{ñø½SM Ý év{¿_™X”ÚöÉà (k¯ä2mG®¤ý”Ú‡´B÷¹*¬àX3/Ã9hß¹­5bÏ<+´—0
+Ñ$ M?4EB?º½ºp9f<b®\Ôž3žfÑK
+&!û£Q’„Šƒ²ü£“>ÿ Ùœ„dS•M9/ÿ$vÒíÿ8h7b‚`ûuZE|Q蟇õ\ ÊõÂ<Áâ÷–Nã®w}ÒŒ1Pø0¿íæ¤Í#]ÛÆöžNÚËÍ“ÉuP5´÷ÃK…Ÿ!b¿+€}û÷ È‘Œ»1à¿þ³Óî
+@’)Eã¿™S ÷= ²Ên†pzøg˜J V‡±ÿÑÉkendstream
+endobj
+2439 0 obj <<
+/Type /Page
+/Contents 2440 0 R
+/Resources 2438 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2414 0 R
>> endobj
-1962 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F41 939 0 R /F53 1029 0 R /F22 737 0 R /F55 1037 0 R >>
+2441 0 obj <<
+/D [2439 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2442 0 obj <<
+/D [2439 0 R /XYZ 56.6929 632.7441 null]
+>> endobj
+2443 0 obj <<
+/D [2439 0 R /XYZ 56.6929 393.4246 null]
+>> endobj
+2444 0 obj <<
+/D [2439 0 R /XYZ 56.6929 322.7553 null]
+>> endobj
+854 0 obj <<
+/D [2439 0 R /XYZ 56.6929 278.4974 null]
+>> endobj
+1446 0 obj <<
+/D [2439 0 R /XYZ 56.6929 239.5941 null]
+>> endobj
+2445 0 obj <<
+/D [2439 0 R /XYZ 56.6929 205.2551 null]
+>> endobj
+2446 0 obj <<
+/D [2439 0 R /XYZ 56.6929 131.664 null]
+>> endobj
+2438 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F14 956 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1971 0 obj <<
-/Length 2140
+2449 0 obj <<
+/Length 3022
/Filter /FlateDecode
>>
stream
-xÚ¥YKsã6¾ûWè] <<jlÍÄÉŒfÖÒÔnÊ™MA+©ˆ”§œ_¿EÊ•­9F?¾î†ÉÃ2‘a–%“4KÇ„OŠíž<ÁÚ‡+âhbO©Þ-¯~~ÏÒI†2AÅd¹ð’KI&ËÕC4ýòe6¿½ûÏuL9ŽÞ¡ë˜c}šÎ¿N?Ú¹/צf‹ë˜d’g@Ä5™ÀÑí|±˜ÝÄ¿Í~ÿ0›_[þz5[öb E'˜i™þºzø†'+¸Á¯W1à6ù‘,£“íUÂâ c~¦ºZ\ý«g8X5[CªàL".iÐ%BPÆ9)ƒgH0ÊŒ2à³û©¾ïrvkow³ƒ÷wApGàDZÅXF)IÃâßU;*2 ¢è
-Ò2îöÍvW©Nµ N*£öPªmׇªz¹&„D?Á¼äQÙÙõݾ¬;C›E¹ÛÒÁÜ“7kûÛm”¬›ýÖÊŒäfÉDP'Äo5üC?æyþc©ÿ¤Ž¹1Ľ¶ac×X-Úó`Ðvy½Ê÷×DF+;ӺݡÏbGËMÙÚiÿ›×î{¥ê®ücZä]ÙÔž»Œá*'‡¢í@o«”çÜÙßMî&žT­öy§Vè¬/cpA Qõv¨Œë‘dhVJ6à¥õó&éé¡'°)Iß>µ§z}ìÈ’Ã8ãcµ96¤%˜8›{¼ÖfoÕYU =H’ ªRWUOuQUožzTÕ«cƒª >ÒF  Ϩª>lÕ¾,ì‡qvµ³?-xñÀM<wæÕS³/»Íö¼‚…
-£ˆ¥R\ôÆ#0¨½vŽ=¬›¦3˜“:Ø
-ÈI(ø 9'%\ö´†$¦éqÜþ‘<îî4#`mAœµ¥5÷r£BRf(¥½2Ñ âÌYKC*Ãb þÊõOª+'ûmê =°^S4>%ê¹n“wŽ‰Nzð¨,`¨öÆô,xE3à/¢¿›Ú?EĪt'uP8V:DôªuÈ“îæ±UW"ƒ#O¹ùøõvÖgóNmÕ ºt]4¤°fÁ«0`€×ìyƒSJúŒÔ_)ÁCí&ÔÔŸ$jwª°¥‚]6àP­Z]¾J(éÌÍ®y|† +›Cëö©â
-ž~]þòùþ²fï
-¥kšêMO´â,^êf×BxœZ:ˆM%(‹ê
-\_€bcWÎq6*LDz?ÂÉkìâFXßÅ!nб>KÁámùw“IŠ=]\Ÿe%‰.º—]ˆôÈÐß{±â"ÀŒ2ȺØ7£E•·mœ3$¥?ñ›UÚC¬úÑ:ÀY@(ð¾LXWùSˆq‚’T’ž³Í0,''Pù?]”ß9*àK@Pq‘^bÓþìG»ÀAG"éÑe·oº¦ðQ° 8=gà ±+÷]ý
-£f»RÏaáî=¬gÚ^d
-x«ê'Hæ—\­çÙxÆL_ßÖHÆ$öÁèŒßmÒ3~¾(l¥žUõݯ>bÝ´ )Oq2Æ¢ÛÙâæþîËòîó<Pð¿•€*2ÄiFÇNgËvibÛŽÜダª4u×B×&ïõë}Ò•Q”®(j[âK¨ëì¯Kl2¢œq·£^¬é¤§ŸOî:;¥ËF^^ú‘)óªmÆ/}hOžR­[ó] Ž–‹»Ç>kyaíÍm^sÆjˆ¼s×n5†q]»ëâc§*ý\NBþ iÞu81B¡Î‰7£i»q= lúƒé3=–FFX0wn)šíÖ>ª²VÚ ³Õ¥fÑ{‚åoú?‘¸"ROnmçFyWlNø›{Ø£×+Ám3ðññ ›o{lé?²Þ÷MYlÎöÍΪA?„]¨=?›
-endobj
-1970 0 obj <<
+xÚ¥Évã6òî¯Ð-ô{ƒ[æäØN·ÓwOKyo²(
+¶ù"KŠIµã|ýÔŠ”hõaì
+@U(Ô
+JOüëIžÄÊn’.N”N&ÕÓ™š<ÀÜ»3-8Ó€4íc}??ûö›MŠ¸HM:™ß÷öÊc•çz2_þ]~útsw}ûßó©ITô}|>M”Š~º¼ûùòß<öé¼0Ñå»›ÙùTyR
+`‡ÆgEÁË},|½~`0hã2gèp΀ÃÈø:>’uÏŽœ•ŠU.1)l¬ŒÊÆý¬ MûXÁ·ûÙ éNKf.IúZ bP‚à#ÊÕÃæìåé9íÀG™ì+ÜuX#ìõµJ'.NøÏ3¿òU‹ÂÍ­ˆ=wQõüºm7Ïåî„ç:.AoœV¢7€ÛéMn;½È!{ÙèK¹Úɶ¬&aÈ-Kõ˜4Ž¤pR¬‡ô‘5M¥±MÕ[ /Ò@uM€%KÂϳ˟®Ñ]XS`göþ’ü«…È6»¼`ä;8”NÒЃ'M’Ê4÷ÁrǼ»û"º¹ºz÷q6?¯‰˜‰ q
+=å·äµÀ‡D<HbD4#Ž±!"´Éë÷ÜGßv]ߣe@£ïýj¶ÂH#?]^MYÂ>u‡\³åð¦ÈÏkÜáIÀi7bó€ÃJ’ã ø&š¡
+‹.²!ÍÈøt ã–þFø©ÊÆGÜøuS·õ?ê~oÑkfy´Þ`[ôÔŠ†ÉÀ0¹NàŒ¤µD¦óe¾f4¹Æ}©W+F±c ánÉs‹WYúûr·je£Ýz囆gÚÑx`Áx3¥sQé©Ñzíâ dÂÁV"ÖÁ)øþà¾]ììÞXuw>Œ!zŠÃE‹P_ïC,Çs#´ð]˜_rä‡kh}¹Ät"ç;fãÀ~œ%úä)“8-””ºRJ$! ¤%ÝRJЈ
+1e+¡¾§†øš)Öp[=úêÏtá
+ê¶lëE½ªÛ×°´•
+&&!Å‚¢ý#©0d Pr[Ø‘Bž41Q¿Î>|*p˜d_
+„©Í‹ÿn ,ႇ.ÌjÖ[;Ì ¬D2hýßÛU]Õ-Æì/ÖK`Õ9ŸIllUÑå|åÛr0F%/åÃR ¬Q²kUOul(¡‹T "”f±.²l¨4弑®B’–&¡
+a Ÿ8hý#W˦{ÀQÓ]mB­)LÐ
+ÕÄIMîc½­ÉiòÕ‘&'qâŠâ4É€4Br””Š«ÍæÕÁGuÈfé¿~ ’§cJš Ý¬–Ó¦}]ùîA8¼f¢SEG·Ùµa í
+e‡oËeÙ–x½ªˆ¾bÝ[Úñ'9ÐâX!rí‹ÄDÐï,7C%‘w-Ÿ“ªÕné¹#…bŠ¼ÓðXŪPŠyÁÈ’ UË·¨þºpnÚ /^r_¾Œí$Ñö¹þ"Û¥}‰Y«CúDŽ³ˆ²$±UG%¥z‰¡eû´Ù0aÌùë´/žlÏr¤Þî`ÝrHDBxsŒ¡j‘ɱ)ßVy¬Jñ+šl.oZ@½“/×M·GÉPŸñ‘úÖ‹.®üáK(œ—°é| ŠùR’„߶oï®ÿu*©5*Á<0ä6lj£Ym~ø {6»íV>[6¾éè<½é#ò"†lÜžv=¤·=D@"®«ñïL€ʧjyÇQvk’X'y~’­阯,ÖNéc·ë%ê‰ÆÙ .|lrô…Ó=<R»äÉj³nËšKÊÁ*N¦
+©ÝQâÔýÀâ˜÷ÿº ˜endstream
+endobj
+2448 0 obj <<
/Type /Page
-/Contents 1971 0 R
-/Resources 1969 0 R
+/Contents 2449 0 R
+/Resources 2447 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2414 0 R
>> endobj
-1972 0 obj <<
-/D [1970 0 R /XYZ 85.0394 794.5015 null]
+2450 0 obj <<
+/D [2448 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1973 0 obj <<
-/D [1970 0 R /XYZ 85.0394 752.1618 null]
+2451 0 obj <<
+/D [2448 0 R /XYZ 85.0394 751.3869 null]
>> endobj
-1974 0 obj <<
-/D [1970 0 R /XYZ 85.0394 531.002 null]
+2452 0 obj <<
+/D [2448 0 R /XYZ 85.0394 624.8718 null]
>> endobj
-1975 0 obj <<
-/D [1970 0 R /XYZ 85.0394 468.4168 null]
+2447 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-670 0 obj <<
-/D [1970 0 R /XYZ 85.0394 429.776 null]
+2455 0 obj <<
+/Length 3191
+/Filter /FlateDecode
+>>
+stream
+xڥ˒Û6ò>_¡ª=X³kÁxð…ÍiÖžØÎÄŽcM6»•äÀ‘ Ë©ˆ¤'“¯ßºA%¥jKÐhô?1‰–h©'©ŽXÌE<Yl®øäÆÞ^ ™y¤Yˆõ¯û«Wߪt¢™Nd2¹_keŒg™˜Ü/™þ‹ÅìVàÓ7çóÛ׳»Ûÿ¾½ýx=:‹õôæÓ§ÛoÞÿçz&cÈ€ÊùôÃÍÇŸn¾Gاk-§7ooç׿Ýwu{ß“’.¸²4ý~õËo|²„|wÅ™‚&OÐáLh-'›«(V,Ž”òòj~õc¿`0ꦎ±"Š3Ë(™ÌTÄ2Øœa‚¥B
+¿Ÿç7Þįà3w#fE@1}‰Ý®14?%Jå#AÍÛº2U{’‘I*YÄùN†X§YÙc9^®Ft,S é÷ªÌÉÒœÉ,ÉΓå‘FÈ
+9®c&°Ï²æ¦µº¡ÐÚF³5‹âWÎ¥ÕÅcPe®€27XTØûA‡(¯ÅÔ”4±^ ƒxþ
+›Û]aý°m®=6ò°“?ûÁ2V[OEYbë¦
+©šbOi-¿3÷H’rÎ 1 ÑÉÇ8{pï ­›‚eîO¯ŠÞ}2Zi¥¹}2.•…Nh`ÇœÇSš¥š§C'ã˜aæëv”RÎ:ÎyÀWÙƶXo±,ñ¬O¦÷VØóÎYzX :wÛ
+ k¡ÙåµÝ¥ÕRRá×ùQÛ
+—sÅétS/Í?A¢¤šÎ»-™€‹-0ÜU•±œq.QÅÉ´îÚm×Úà&³©Ø¢ì–ÓÁIâ£_—(ªe±ð%B’Ÿ¯ãX¿®;¢¢9h¡}éîJpK~P¹:̈gM‰ø«ŽU3•öᱶHA†—Áq± ¨Þ¢-¾+dÏÅJ‹ê{9Íù<¿± ‰i
+íMŒÄt»‹µ6KnLLçb¶h
+ÓVµ’SñýLÀÜîSr»Ð3øÒ -k¿+±ØaR÷¯Å’¦ç#FA´ ´ôØ+`Ö+\d,²ì@È{•>4A6îO}ª„±X™ß»bØ–/Æz#ÕK®ÞÇ'vÊ€=ö
+tì>¦l$qtFšèŒˆÎÈ.²¡Õ`chãˆ6‘ƒ“Øaûæh´}j´ÕöE¿˜ó±¬þ D$Y“þ1`STÝaÁ‡2•!%NÉÁ4‚‘yyTü ^MƒòŽâ4š?ŸÎýDbÿ}]¨î„X§µ¿ÇrÚߌi?D¶¶äåƒô©Ûõq #
+p–¸k„ºAÌ! ÷—I4$ï èàÞ=qK•ã¿£ÌA|)ƒsrv¨ ÷
+=¶J±ä·Ÿð1~_º€ïè±!b÷¯‚bFÆ„LôP¦ÝŽvlK
+818ž¹—Æž¸ò5°m·ÛÖþE×Ä°ÂqZ^ ÒË´¼ð댼x,'/÷cò"íÿ*¼çÜíœ;ú‹FÌøEÒz¬Úÿ¢¡ˆJ‹ì+YÚÿß ŒÄz¨zµ°Œì³›\ã—Þ|4ÈÂe¹ÂA<Y.p%JŽ¸rgŠÈónÓ5-.ý@[˜KW¶Ý?ø˜RƦ3} fû¢(˜må¿
+
+gÐq©|ý²RGô7 ír%X@<9…îÏÆm_”¾‹œÖy ­ë¯êË¥_=™{ó(+_ïíÿÌ°÷œ¿k«| |~2Øgô_ào¤f÷0‹@žöýcø»7¯g>Ú¾y· _Õ$8½{³õ&ýtIÚ—ßbfÿl5¢|â¯ñÿþO×þ¿kQÊT–P%™ÆV•O”埈¢cËbB"Ghÿîÿ“Îendstream
+endobj
+2454 0 obj <<
+/Type /Page
+/Contents 2455 0 R
+/Resources 2453 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2457 0 R
>> endobj
-1976 0 obj <<
-/D [1970 0 R /XYZ 85.0394 393.3396 null]
+2456 0 obj <<
+/D [2454 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1977 0 obj <<
-/D [1970 0 R /XYZ 85.0394 361.4675 null]
+2453 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-1978 0 obj <<
-/D [1970 0 R /XYZ 85.0394 295.9604 null]
+2460 0 obj <<
+/Length 2936
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Z_wÛ¶ϧð[”ÓZERΞ²%í²Þ¤½Kvv{Ö=ȶœèÔ–<KNš}ú  MÙ²“³µ¤I
+ØðdÁ»—‡ùy[ò⹡o–;{·Öq*wÕ²„ Ê, Þ[U¦MýXÖ8CiTŠƒjN3ífúp\nµ³}º÷æÍbÑ<ÝELÐëDÊñ
+L¼‚RÚaû5Šâïæ¬aò¢g`l«àtÙPW§O®7s½Û3{ÂÕËÊaø 1,/íïB°é¡6ËÕ†lT/{.‹5+õ5ÒѬD=k 8x:§,‰¦N¬ÆÍfM?fÅskL §|_7kr$˜X”ÅŠzFˆL·lêî™ö¥›!'/: ÎcõT–߬xO¤·}¾ v6µ¬j°Š¡ÇeH­ÊiWûÛKn,Eü~¦ak°ä ZPãðÛ˜Ò; ø]qÐñGkæT\gíÁ@ ™S¨âô…Ôħ:¨• ÔŸ‡u–k¨á)ß5s³•ÝpÄa’½¤Ÿ£P°®“4L’\÷5äx[Ûf¹Ñˆ†ššÚ§‡Êø4L4‚yŠù]ÙÕ µf²ÚLUû`N›vBþdžóWqœÏ!vÙitY 8tÙ5,Ô¤: ÓXêÝð¹X „cô‘êéb3#ÔÇãcçb£/0ÈK¥Ç£nº>³Mk™½@Û‚;2ë¡ ‘â¿·Nõ-;]mõ˜ïè1þ@m³êª†9>JÃi XNÊ’±z½Ý»qmšå¹ÆWˆ‰uó„ÍaGˆ4<W’ìGð¨Ž8‚¥2Žp>äðzÐùkü@…R‹ì¸zŽj@¿¾ä¡”Rô$?šïAì`OEjeý Ge<;•]ßP;a‚C°šF¸–îÄáne!ÜájßçL¨džä
+aÚâ:³aÜ
+„sU"Þc/,®³h‹kÈûã\öq €,îïí¥^´~Ja5ÀDâŠÑÁQ\ómdwxi‹—| ózvˆ_
+Ê®o¨¥úX ×Ì¢¤»ZFÂ¥¦†…IMY’y&f|ù”cÌܨ]4õ}¹v÷vPÜÍå^¤8Ðá›Î»eñìÇÃeaî1 åªi«®YÓSŒAû
+£≢Àoð•YhdÊ"èù…“’
+d04¥3a\ÃœI3.LÂïòû
+¤™ :3…ËiÙ¶ÆUaÒ½!n@Úz+ÎÆËÜ• }…¶ðÉ£Ã
+ê ;ù'UÑa íìï@]tïc <©óhû1† úáòæò×süRwwyAL>^~yÅ™ßñ4¬ïk%ÜíB'6«¬[Pi Nvï¨}ž ¦ÊN±Ô‹¹š)”åÖ{ç›Å6xÆYJNOÌլô µ-¦çôyÁ>‚q
+ Ý#Õpw¬«iï ²ýÒèÕ¸¢¿²XÜ7k…˃¦Mt‰úqËni–i^´ëy[³î´ª'ðPü1>K^ÄÞÖóm2…ÏDëìó¦éLÄgÝA;JâŸó ì+rwÿþ«¡í‘¨4”Yv ¨$ÁRB¤e¥p÷Bé]Õ5\O:‹ÓÝÿ×LDòendstream
+endobj
+2459 0 obj <<
+/Type /Page
+/Contents 2460 0 R
+/Resources 2458 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2457 0 R
>> endobj
-1979 0 obj <<
-/D [1970 0 R /XYZ 85.0394 212.4297 null]
+2461 0 obj <<
+/D [2459 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1980 0 obj <<
-/D [1970 0 R /XYZ 85.0394 107.4752 null]
+2462 0 obj <<
+/D [2459 0 R /XYZ 85.0394 658.0977 null]
>> endobj
-1969 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F14 740 0 R /F39 899 0 R /F53 1029 0 R /F55 1037 0 R >>
+2463 0 obj <<
+/D [2459 0 R /XYZ 85.0394 153.2806 null]
+>> endobj
+2458 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F14 956 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1983 0 obj <<
-/Length 2949
+2466 0 obj <<
+/Length 1723
/Filter /FlateDecode
>>
stream
-xÚ¥ZKsã6¾ûWè(Wh
-dzéãç›pâšs>þ@ƒí‹¢Îk^îMw³oZêÍõˆß=Ðó™dwÅꚧÐeÂàTYnò
-&9®Çã‡/·'_î¤û8}¸¥é„ž‘³p¼ çA&¥Ð´FˆP"äÝ[BÆz„u#aj1x6!;H.à6C&ƳÕ(šÔGk¨Ÿïx3±È-¤¨U5E[¼ª #, @¨RMØSÝ"2ÉÆü'<CŒË[Yi" C²†”¥lümz‹'¦™¢¡6§˜µÌÛz÷Nж6¨Í¶TU™uór]ïŠöe£WLÆð’Ùgzë, Йõ戩¤ °âR-‘-œ‘4 „£4| ®½-zÒ‹B{ Åeˆ+
-­| ±œ4:Õ~3W;ê×+jçEk`E…-·×|Lop<†¹ÜI”1TÂ.^êb¡ü•«;úືT[-³~m×·‹tâ«%g†AÊCîëû¾!Ádê ªt¨yK=²C"ŒÆs Z™®jß”ªêN’4è¥Ô㛵}“…“ÆdÛ‘,µÎv\¤Dn×£iËbÔLÞmžDV[¹Ý&vÄ)ÛÚmàN8£ñ|Ì™ˆ SÏL"ŠÔ_ùÂ,»Ù—mÆ„žð
-b„$…ZKiHÓÔcˆ … …se[K!<ð#ý&Š%3ç>£±2‹ƒDr>¬±.ê¼Æv(­±ÕE­òjß·=*K³aâ:TužÊ
-^œ Ÿ<OeEœSú­BèO8\y¨lü¥¿ÓÔ0–¤©8e¼¶yM3!rÙ%xð.õ” G¤K0JYhÙeî–U ÂDcJ²
-~TaRw»+6Šº+MO½¡—¿}úHÃB†õÞŠ²¤Þܼ‚vàÅʬW7M1/Õ?P ýÃ(ñ­h U©'ÚXR€áû qV|CcøAñuQçÅ·Ciñ}9qqÀ²ä–Ô³¥+’ X’mùuWT6²2\øÎð¢Ùo6ùÎè|½:ªˆÔ[ ¯š£¤Ë¸‹=VŒ!Eö^e R"1z¹¬šF-& ã M=‰
-£PÚZpvÐ |ÅcOM…9sØCãEÓ©÷¼Îmv¬gªížò¢ãÃÂ¥Œ¥}âqt¬Íš
-endobj
-1982 0 obj <<
+xÚ¥XM{ÚF¾ó+8ô
+F š{lÁ™Ï*&ZpQÛ"ÍËÒ̃ofwkr«lâM!ðŽb 'YêùfÈ¢I*S!ä z(ì@ ¾PÊW¦| 3¥YµD‚<Y#­Ü$¥IqµÈq©²ÁÒàøn“åUCPV0»%(ìjÁµ !åÌIt–üI’äMf4ñ¨L‰cöÆH¬G}Š¼J²¼D·VV;¸ÛÞ¬²9Ž-?ÆØà-N“<õŸ$ñ³"f÷`2XL*†‡yŸÇí?§¶M?àà H‡€S"y¨kF³¥ñI“‡ÍaÏXŠkÒØ¡[Á'Tw¤³³Ä>B›A8?ÿ ‘yQ?S\«–Iå˜$9n 2
+ŽÏ?žŒÑºe†^›¼‚š˜þˆi‚†L4¦}ÞãÀ•3=6¯d]óJˆ³Õm±=ÖAygæ™%œ#šUZZ\Šøà]­5¬7÷Y±uÛ!§·°}‡¯\Ö–E^'¨à¬Ü³kDH ãöçE… AÞH³Cƒ-“{
+n²ÊN (OG¸ŠÂÂJmk»‚šÂJZ¬!WœÛ£·3›‰Ò¹Óü•¬ïV†Ì‹µG`­H¨DCkmlKÚÒɶ(V«âÊ ,ÖhTx÷PlW)®ß8rˆõ­IñÈp­IÄaÍe@è)½†&#HðY› ^¸Á'È-8Ê?/'c½¬¢½j—ïµI£ FK^¹i qƒ6€q±xqà™µOåGÇžu„$o(o¸fš¾$/Úè´®ªÁ+*u߶ÚéU$‘T4eøµÎFÃ0ޗރΦ>Ñà "<…ÀFÊâ«žÑñc„…ÎêE ƒ‚Ó¶· VˆʹTìqGspø ­‡
+è¢ K‘Å»ü
+ñº¸¯¤¯ÖÊé./îʬ||O„´
+#°"“1"’¾{M~ˆ;û/}$dÌ6²õOúî|-U×<Î4¶ˆ|–›¯Íðƒ³»7ÐJ7-×
+‘•¯éŠI5ÙÛò;óðwZ5Ø ½<ôñÅfçá©$Ѽ ã–éøU¦&¿Ír_³~HÖr\¸xv‘­Œ?_`¯
+­Ý;^>O¯O¯f§—OUò£á>Ä—¥Õ¶£MKmÓJcj¶CÝtt0À:e›èïKS¹-áºáÀ#\»ï’9~¬nOíBj,çÜö½vš¹ ˆ>@§(cõ©¼©bý Qâ°4uKl'«róàz$Ûöm»Ú¶åØ»Ô7¥¶+i“8/:IŸz.̾5àRû…Å“e´õýÿþ³ÿ`%Á6QÄ÷ßho6Êv%ºÊÚIýDôæ“ÏSÙÿ2®Çìendstream
+endobj
+2465 0 obj <<
/Type /Page
-/Contents 1983 0 R
-/Resources 1981 0 R
+/Contents 2466 0 R
+/Resources 2464 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2457 0 R
>> endobj
-1984 0 obj <<
-/D [1982 0 R /XYZ 56.6929 794.5015 null]
+2467 0 obj <<
+/D [2465 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-1981 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F55 1037 0 R /F41 939 0 R >>
+2468 0 obj <<
+/D [2465 0 R /XYZ 56.6929 598.7685 null]
+>> endobj
+2469 0 obj <<
+/D [2465 0 R /XYZ 56.6929 432.9509 null]
+>> endobj
+2470 0 obj <<
+/D [2465 0 R /XYZ 56.6929 360.8886 null]
+>> endobj
+858 0 obj <<
+/D [2465 0 R /XYZ 56.6929 315.6627 null]
+>> endobj
+2471 0 obj <<
+/D [2465 0 R /XYZ 56.6929 279.8921 null]
+>> endobj
+2472 0 obj <<
+/D [2465 0 R /XYZ 56.6929 241.5703 null]
+>> endobj
+2473 0 obj <<
+/D [2465 0 R /XYZ 56.6929 166.5861 null]
+>> endobj
+2474 0 obj <<
+/D [2465 0 R /XYZ 56.6929 97.4887 null]
+>> endobj
+2464 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1987 0 obj <<
-/Length 2192
+2477 0 obj <<
+/Length 2079
/Filter /FlateDecode
>>
stream
-xÚ¥YM{›H¾ûWè°ùÉÐÛMÓìMv”Ä“XñFʳ³›ä€¶˜A ÈϯßjúCHj„g×>Ð4EUõ[߈Œ0ü“‘dÓ8‰8B 6Z®/ðèž½¿ †&°DA—êjqñ÷wTŒbó^a)Éh‘~Oî·7¿\!Ãã+t0ŒÇ·“Ù×É'½ww‡ãÉûéü2 RD\‘q<~;›Ï§×Áüæýì?ŸgÓË‹Ÿ/¦ §XWy‚©Òê÷‹o?ð(…3ü|%=à F$ŽÃÑú"b±ˆR»S\Ì/þévž¶¯úÀ`T"&CáA#$#BPÌXx
-`™¬³^¨¸äQtª.U?TŽjª³R÷PˆõBu œÞ‡w { *wël›/õMëßÙF_jp܎˶Ù}3)«mÞ¬Öý
-ÙVÑ.¼Q'5õ&[êê¯éÚà/ÒZ5¤2¿kO ûÕýS^íÌëÏ;xýE?2[Weœœ‚AòzÏΪV™y¿¬ ˜
-pû}ÑèŒ `9ÊÚ6]i3ýer{÷i:<,ÔL¡zcJ4x—D$7°Èô~¢/‚Ëà¾mU)ŒXó‰ÞÕÊRÛßÂŽ>)ì¤ÕbŘ]˜¨H´ÍJöG¢F
-“…oø€S1×Ø(Œm=Rª¢¨žu“ "ÅZƒ
-Ïž«]‘êý{C¾¾ËÒxt
-BΑ aïLÙ 8 ¡A¢¯-íƽ¾@fÃP¶Ãg»:DOöjM¾? ÜØÓ03S94N:85RùŽ|$öcGIôcú&ä„ãa}oÚjÁl¾Â‘=îOžîFDÐÑSòúÉÆmáíjZ‰™h3ÂiŠÜˆIlsUÏ{Rá ,tUgsì»Zìè\Ac5:3rÜÑ?ÓzPÈ{˜ÛJä üÀ™ {>5Õròiþy8CÔùc©ª¹ªÝR•WcBw?ØH$cf•ºº™™/±˜®ó2LÛó~É2m»riœò6)wP“| Ã`Î9wª
-endobj
-1986 0 obj <<
+xÚµYÛrÛ8}×W¨j_äÊÁ… ‰Ý'ÅV²ÊÅöXJíVeò@KÄ
+/‘²ÇóõÓ
+»RïY4H„4.Ö]1ÂqL†‹Õ·Ñäþ~z{3ûïÕ˜r<z‡®ÆãÑ—Éí×Ég=w%èhòa:¿
+B‘ ñèæv>Ÿ^çÓÅböezõ}ñq0]´~u}'˜)§~|ûŽ‡+x…Œ˜ˆùð0"BÐa>8C<`ÌÎdƒùà×VaçÛf© ÎbÄcyÀ dHœS .PÈ(kи»_Ìînç'o‚æ
+(æi­|¨’ÔÃ\VLJ¤Xéü#­Ñ9LBA ‚ð2&]©ó˜´R &Ÿ”É·ï9ïHÈ
+!LF@4{ÅUòŸð‡£ëäP59êøO0(‰CjKXQUr9Þ˧ò‡4â]Ûaˆ"N#Ýà ÖKz¨‡©áD˜Ñu»$Ýë‘l²OÒµ–Nô£æ<=N2ædeÖCÙ¯šˆÃ8OêåVmú&…HH µ‚Ô19DÜJ² Ðl½Í{}D[ñf7†Œ×=rÑ(,:K!#ÔBÙiáÆ4@«Û‘Nåùtª×N>Ïï<bXÇÕˆº
+ÀÉ×Å¿ï^GnV@™.lùœ¿TµÌ A\—EÜ”ò£Ý
+ZHž
+:(7ÑáˆQUxUÕÁãËÔÙUÑðXà£ÎVÊUaø6^·#Û„³nª G
+ëvá=“<@!m“°UzïQ
+QŽC(KFiRË·åz­º³Sµ!VdA_íäç¨}ð¨…Ȇ( 1sËèÿ¥ösܾù9j·íèÉc@/âý¶µ§öjG¢¯zê: Ôù<tkͱ¹ë©vßШ† º†~ÊË°ý"8»x3_?ÌšË
+ˆð6GË]B¹TWj4-š‚öN¸ài™j@UX
+=õh¡Ñ\éï_| §ˆéìy“¬é¦ø³,¼ÙAS…í¾WeOY)Áð^›QkÛVAWGaì&DU®ëgïUÆJBÓ«½k.FdáÔÕ¶§•»ðѬس´ÚÊÕ/­íZ÷`RmËC¶rjœœZnߤë€BŨ–õÙ&„ĈDßýÌ m…îŽ=ê5˜jÿÍ xRÙ)V=ŸšÏ没ù¶hè 8òåzWÃl–6>0Ât¼O£
+'u8¥³°Õ³Â›Ušï²m Ȧ¨+í„ñÆD¡™Ñ¢C­nbN\&vÛ$÷¡ ®õAÉbooĜޫíðûHë#1¥ÂäíÒ˜šn˜+S\ªžŽËmRltš06z,Õ!Z)8ÞPsQ+{VÌÙ©±À±o›Cý0±øTÀz“$É›Tý¡cOèì|uË°]åghöHÀ]Í:‰PE½ÍÖ±j+‡Ç2œ;¹m¨3DXt0Sz ! §¹NŠx4úr¤"Ñ…œ‰Ø]Þ ¶zVÁVŸ:¯`p¬lFQ&‰žÛ`ŒÍ)Óºìä›Í¯ä1ko¤ªå>m¶Û™c¥›£–Y’¬2ܲ˒e?AÕ†”E{ãQ\¾½Eç~ü€~DýbáiÛq[Uþö#Ç_€‚±8¦þ‹ †á ƱN)8¡åé»Þþ„rêû_·Ïj¤endstream
+endobj
+2476 0 obj <<
/Type /Page
-/Contents 1987 0 R
-/Resources 1985 0 R
+/Contents 2477 0 R
+/Resources 2475 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2457 0 R
>> endobj
-1988 0 obj <<
-/D [1986 0 R /XYZ 85.0394 794.5015 null]
+2478 0 obj <<
+/D [2476 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-1989 0 obj <<
-/D [1986 0 R /XYZ 85.0394 752.3199 null]
+2479 0 obj <<
+/D [2476 0 R /XYZ 85.0394 752.123 null]
>> endobj
-1990 0 obj <<
-/D [1986 0 R /XYZ 85.0394 504.8188 null]
+2480 0 obj <<
+/D [2476 0 R /XYZ 85.0394 500.7908 null]
>> endobj
-1991 0 obj <<
-/D [1986 0 R /XYZ 85.0394 359.3246 null]
+2481 0 obj <<
+/D [2476 0 R /XYZ 85.0394 437.8079 null]
>> endobj
-1992 0 obj <<
-/D [1986 0 R /XYZ 85.0394 298.3625 null]
+862 0 obj <<
+/D [2476 0 R /XYZ 85.0394 398.8908 null]
>> endobj
-674 0 obj <<
-/D [1986 0 R /XYZ 85.0394 260.8495 null]
+1447 0 obj <<
+/D [2476 0 R /XYZ 85.0394 365.8909 null]
>> endobj
-1993 0 obj <<
-/D [1986 0 R /XYZ 85.0394 224.9084 null]
+2482 0 obj <<
+/D [2476 0 R /XYZ 85.0394 330.3396 null]
>> endobj
-1994 0 obj <<
-/D [1986 0 R /XYZ 85.0394 193.5316 null]
+2483 0 obj <<
+/D [2476 0 R /XYZ 85.0394 264.4348 null]
>> endobj
-1995 0 obj <<
-/D [1986 0 R /XYZ 85.0394 129.6476 null]
+2484 0 obj <<
+/D [2476 0 R /XYZ 85.0394 180.5065 null]
>> endobj
-1985 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F14 740 0 R /F48 953 0 R /F39 899 0 R /F53 1029 0 R >>
+2475 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F39 1151 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1998 0 obj <<
-/Length 2985
+2487 0 obj <<
+/Length 2923
/Filter /FlateDecode
>>
stream
-xÚ¥Z[wÛ6~÷¯Ð£|qq%‰î“[{Ótc'»Ýí¶} EÚæ‰Dº"×ýõ;ƒ ‚¢¤œ³öÁÁÌåà >cðÏg:MR#Ì,3*ÑŒëÙr}ÆfÐ÷öŒ;ž…gZ ¹¾»;ûÛ?d63‰IE:»{Œ•',Ïùì®üuþ]’&ç0›_ÞÜÞ^}¿¸}÷öæ¿n®Î<Ïx6¿øøñêæòÝÎB3`fÆæ×7?]¼'ÚÇs#æo¯nÏ¿ûñìê.6ž3‰RýqöëïlVÂ~<c‰4¹ž½À K¸1b¶>SZ&ZIé)«³Û³…½öÓIep–™Š m>ã<1Z‹HÚ$©ÒªãòêöûOï>Þ½ûpƒ«±ßì4Èf ‘&J
-Ë[6]W-]ýØüÕ6•ãþ,K¤P|‡üÈØÊR5/ð!çø(Tj>×é±jªMÑWŽñLBESéÓ'0Ñ6ç<ŸWËÖ>K?61Êù³%·åvYÅÓ¢ •íKµé궡Žöšsr/‚º@üþ©.¤VÒÔ@*V]K­¡üØAZQC-r‘3áÔò¹zíª~1¡>¥’,å^}¿1&VN„eÛôEÝÔÍ#½Ù`0kЃ£SëÔ3ãBÞ€ú™×.ÐêzúA¬>x&ÀsãB¡ƒÚ̹…Z/Oõò‰šNÀŽÞÊjU==è¹{ƒ3¯{ÇW ês1oŸ±»X­^©Ãë‘Þ.oé¹op Ò A ÃQŸêU¹“Îó‘?¬iB`®7Öa±ÕZGJ[§KBÔ "máY2‡ˆT¹ý⃲}ÐàIÆy:KK”‚øœrbZ ¹|Œï#^àÂyÅxÊT%Æðüø”žibÊ¡VRhf’ÇSþ|Î9ŸW›úá• ìL oæ’^ÑëŠ~Kf&eNéFçp‰ãºrÖM಺Y’ý´Æ+*À(z¹*ºn,˜I“œ u\0Ï4!˜ˆ¦ƒð–H²ÛçjY£“YoU‘³k»oQƒ$³ÍöaÄD˜uH:‡ KO¨sÀuDžËªóó”:y’-wè7+O c•ÊñL5T¥án°³EBÝ怤
-cÁÐãÓ\ñã’® ÑâøÙR­bÙÞîöŸèùå{LÝ~&À<QëÆ1•eÝ»Ü@Ïû–¨RаVŞߘf„ÿ¼úZ<JB4í\4zgS´{E}N¶¿îˆV<?WMéM-tÂRmF‰H;
-î¦XWâ~´aô ;¼'
-bûKE\:ã󋆘‡Ÿ*²ËŽ—ZV>;~YŸc1JkÊý«›ŸÍv}ïE«Ýø¿Àßõõå"öV
-ÈË~¸¾¾?—<›7moQèïtÒ!ü¾q¥4cȪ¬€ ù¹úVéo}×Ow Ù÷Ô¶9"p\Û’õOXÁKe‡ÅÄ’‹ùqÅZBvR„¼^%¹SInUô‘;}äóonš„ µþà“ztàMéhì€7ò0h,·’®é]·Ÿ$ RÓNnŸ°…03lãJ6•§ŽÕ 9Ȧß/Ê,K´†â rÆ°ÑÆ¢ºäšZëºÙº}™Óã©Ýn¨…I¡OÔ Úm_v©†+ÖÚ¥K?ºÏÕ‹Ë1kp#n»cÇòDåPfG¸×„ó\áªi„Ë esš„ôtßÀ4`?~\¸À5!]œ²¬æJÅâ|ãÆåBØ |ÖÅ7Ûg„-·ˆ€oøêð¶oH¬þ|vÉ–66¿p/
-‘æÒGd»íŸ·ýâ¡^탘 =cŽ‹¸&ä‹“´,ᜋX@[ÿKžºº# ¤%`E$¢?øGúðàß{?–¿ÓÀö_-ø´½£Ð,ÛMç,BZ«âŒ-½Ó¹Ãš¥°•y/KDAáj3Êàœ‡ªd_öî`Ô],훸XÔÌAÏáyŠ'`'6¿!×aÏ \ÖsžöªÚ4a&;1¥gš˜2ªjyÂ`§ü¸©›Þíø…KžÚSF·]¯‹Íë³:5ô7îjÙÇíº
-÷íÄ]žPÐC„“¹Ó—y
-TÅøÀ&­£ubÌ©3‡!×ëx.kúÔé"¨²Ú@²Ÿ™À†,<.[àš.
-jž')T\±tÿiFAº}¬¾Ôí¶[Ñ¥œO8èä[µË$ž‹®ó½…£Ù À‘‰é¼Äžcã¾f/4“KU0ø'blo„Rz-ªPðV:v;`gÔÝ8Ë]®|Y᧰o…ã,ÜàÚ ùÀŽªãœUÔž,¨…wÝD5fÕ¶ª¡ª(h_Ó%ÖíÔÙÃ.t7‰ÅC_íÝ9ºÅæ<,ÖÞuæ᮳˜ãÖL
-jžXù¾Ô]uàXMW—îÌÊÝlZÍÝ© <­”tÈo]Û6hÊɌŌ;ÿÑltÆò¼*–®±Ÿæà™Úí`Ò£°¥p#¼¾3·}ëˆÁ¹½œÿ±…<5ˆ/ˆkØÛ‡Akr·Üféè÷UÿRQ” ¸£+C"UT_„Ô›»»‘±Bn[ú€½‡´©qûñƒŸsõ^‚†ÓÃÉcf”Àä_[Ñú9‹p|‰¿gÕ´#4MAˆLñ¯züõƒô~ôƒŒ‘º;%Rô®–¶Ø(ÒX±;aeF'DØL]1 4LP‘€ *:­b¾:
-endobj
-1997 0 obj <<
+xÚµZÝsÛ6÷_¡™{°<±@ðcú”Önê¶N|'wînÚ>Ð$qB‘ªHÙqþúÛÅ. R¢ä¤7—<\,‹Ý÷´…ð_ŒtÄ™ÌFI:z4[_„£%̽»Ì3qL“.×wßü ’Qd±ŒG‹Ž¬4ÓTŒæ¿¿ ’à
+$„ãë÷ÓéÍ÷“éÍÃÃíÝÍÕDd©ã·÷÷7ï¯oÿ}5‘:nà ÃñÝÛ÷¿¾ý…h÷W°½»™^ýñðÓÅ̓׫«»*õçÅo„£9᧋0PYªGÏð"Ëäh}ièH)G)/¦ÿð;³vé -DHËcH1"È´–=kè,ˆ•TÖîn?¼?>‰!âQ"E #-NìLL“.—ÛxÀ Ž ÷,·ŒU¦:=¿¥cØRv¶ŒÓ Ñßò‡z{%ÒñÌ€³tœWø›Œw›yÞ2­^æ๜Oõv·ôüѼÃsÑ®ˆTÕDY›6A9QCiÊyèŽÿu¥õ–Ô;Ô®Š†ÖÕ›¶¨«7h»©$
+"&prT^5™MÓ¶ÅÚ0÷Ð °tªFïuX÷\”åÕD©h¼È ;Òãç•©ˆ–·­Yƒ
+Õ’fÚšèÎ*HˉTše>{!B1¶o’=_4.®Ä­bÅØóá*w¾‰Ò1Í~½vÚéñ£!Šu’™Ñè0§é¢Â#ƒ-øpäS+P&ñ¸2Ï8Ðcrì'S9~´ö†iöW¢÷+êm±,ª¼$2yÈìC ‘m^TfçTi2~p‹ý²!6¯)Ó‹04G§CÚ#SÀ}D@CÛߕ錼¶!©©Z
+:èôàÔkk€J’œK;L§_RÇdßÑŸ eZwD$9L[3këíË¡bBFA¨CyV3Ït¬Z×BfA¨ ¬uu›š¶aÃXŸÀ
+ö(æþç蓼ÈÍn³©·-=-qÌÍ"ß•è4»MÔÍÇY#Ä·60C”RvëÅgï^ÌžHª|mzÃÁ½O. TüëŽã’§Z›@pÌÂ8´žBUQ؃Bõöý;ZÜ)ݬ ¹DÆ`gRõÒ‘ËU¶°I"ŸŽÌ'—h´NÙ˜¹O”.£ÒäàßÝÝõ5Í@AÕ£þøãÝÝtÐäí‚&½
+­ËÝšrZ‚)Žß ¥¿}¾æd|ù÷K—¶™0¹´I^qa¦àCUk¶|¬–Nbx2çÓA¥ó ŸŽ–¿^œ½Ÿ†qƦaðIlëI²j]Z SÍ ×Å‚³ýn¶:¿o1xüE]–õ³Õ]@í€øP*V†¶L©)ÚV,f²OÖ×0yùr *$£ñ庶æ’j|ùìGs?Z¹‘=®^ŽÔÚ× ·áý’þ)›^Ð{¸#›WÁË^L¾e¥~‡|?7¨'UCù)«XÓ@F(›·ô0Ï_kbðò²‚
+ÎFU˜(M¾¡‘Ý ¶Ì·®«vÅBû»[’ß/<±]GÔ³1ÝöMßÁ|î\XÅòìƒÃ
+ˆr¥/¤•Ì´ôÓuð›ƒÓs:gtJ!è!êÊ6&¸ß¶²Œv•Á»b!ûÆU¼Ûe0¼<™À¢0„VÙùÖå:À<—M`÷¯&0T÷›za-q˜ÅTÕHÎëç¹ìe1•Ø@÷äÔŸ9Ϥ™k€d[ƒl_ˆÂdN*Cá¹p«kú}d!›ÝcY4+ëÇδßäsmb$³ñÛD>7mC6+íWèÖð¦6·é$H¤Š†:Ftö£qà™•»ù!”<?Sd·{UÝö…í'È¥Ã^f—(O"KAï/³ø•Ò¨ËuYžË"ëí«mÎ9`A¡Ϫç¹ôë+
+ƒ,…¤ßS%÷ÏZ3²p„ÈRÐ}3²z\ÔecDqëkú}d†CöØ
+rmEÍ ¸¶Â–-'¥¯­º\T]Á pëkúµ®€EsSÊ*¾€²"lÅ;ÙV(Ë^†QŒ˺Zš­Ï…Þvô0õqŠcö-.Þ­ó—nH\çná‘
+endobj
+2486 0 obj <<
/Type /Page
-/Contents 1998 0 R
-/Resources 1996 0 R
+/Contents 2487 0 R
+/Resources 2485 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 1961 0 R
+/Parent 2457 0 R
>> endobj
-1999 0 obj <<
-/D [1997 0 R /XYZ 56.6929 794.5015 null]
+2488 0 obj <<
+/D [2486 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2000 0 obj <<
-/D [1997 0 R /XYZ 56.6929 751.9327 null]
+2489 0 obj <<
+/D [2486 0 R /XYZ 56.6929 751.9327 null]
>> endobj
-2001 0 obj <<
-/D [1997 0 R /XYZ 56.6929 651.1304 null]
+2490 0 obj <<
+/D [2486 0 R /XYZ 56.6929 503.6095 null]
>> endobj
-1996 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F55 1037 0 R >>
+2485 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2004 0 obj <<
-/Length 3048
+2493 0 obj <<
+/Length 2264
/Filter /FlateDecode
>>
stream
-xÚ¥ZKsã6¾ûWè¶tUÄÁ“ã¼k’]3öÔnm’%R63©ˆ”=ίßn4@IÕÔ–€F£Ñ/˜/üñE¢C&SµˆSjÆõb½»b‹èûxÅ-fé@Ë!êÍýÕ«2^¤a‰hq¿Ì•„,Iøâ>ÿ-x}{ûþæݧÿ\/…fÁ›ðz© þõúæëëíö:Áëïï®—<‰y  a ÞÝÜݽ»¼ûôñæ¿ŸoÞ_ÿqÿóÕûûŽ±!óœIä꯫ßþ`‹öðó ešèÅ3|°§©Xì®”–¡VR:Êöêîê×nÂA¯:& ¥“P -–Z…RK5.22 "XÆ
-VRÐr"|Ld…"[~¾ú õ
-˜ìãȲ‘­êŽ#â¦Ïv£;Ã3ñ(0bhÌÍPÃ;N#29»'ú,“0¹³ú΀H.‚f_¬KÔO³+8ÞŒèv*Ó~.«¼~¦6™W>—FZ@3Û†_²ÜUæ
- *†B†ãÙYv˜så Ú*²ÓŒÉÓ[„ÔŽæVuÓU=»¢â‰(,û®v™Mg–órsj–2RRDÊh†2B`8#&°di‡tARØŒ°jRCüZ¨­Œ.°`A#ø•&<V> Ÿ†ñÓHÌ´M‡}ùð–<M„u’ÈŽv)­›á‚¥Ñb¢n7î
-LÚ&Èx ߆•.jíæp|Mì/RâBÄ8DÍœŸC™óû|)®€üb¦bCHcgùs þ¼3L8Þ#é3HõÚ˜õõÚ˜S˜»ÜÄ$µÝ! Ðï®y`Ì’º1.ÈÀ¶ 2"èv»U:dÄdCÀpdÌ×wÙty×èÎhT S¸ú?ZÞÓ/‘ª²Ï CÔ´~u(£_ûÓ%¡W)uaIYr¸»²u¡O–üŠuO`$Ø7Å1¯—TŸ@D÷Y›Q糩óI[k&íH•Õ[uÆ°SI[÷–¶Ö¨MÖ´]Q œj°2ÊJC†Ú–,†òPì²Îñ6I¡Ô–£ÿ8Tû"†}´]qìŠñ±ìKÅ
-êDÄ#¼ÿ.áŠQendstream
-endobj
-2003 0 obj <<
+xÚ¥ÛrÛ¸õÝ_¡7Ó3! € ¶OŽíõj»+»–2í4ñ-A7©);Ê×÷à*R‚"§ϘàÁá¹á\!2ÀðGœ!eñ ÍbÄ0aƒéò ^`ïÐ"…]¬“³Ë_¢t¡,¡É`2ïÐâsN“Ùçàêáávt3ü÷EH>¢‹aüq5útõ»†=\d4¸º»_„„§$$.ÑÜŒÆãÛëp<¼ýç~t{ñ4ùíìvâë
+Op$¥úëìóÌ@‡ßÎ0Š2Îoð‚É2:XžÅ,B,Ž" )ÏÆgÿt;»êSŸ1XÄã4õXƒÒŽ5†uœ R–¡$¢‘²Æp~F4 Ú…‹4ø*¶R4ð,ŠêEƒÑìÚîé÷¼ÒïâÛª,.H0-Z h6Ó©hšzÝÿ.¯j`h€’#!$ø
+ÏÐÓºš5Š?Ä 8kÎ!Q†“dÆq–eJª‡Çáh2Ýéïï&ÃûÑØ}¾ aP†¦(N}2³ª^!øX[,…Áï†|’¡˜f2SHôinÌ˦֫g£â¦±J´fgµ.ªvÏÀEå­~›ƒ·óåãÓœßPÑѱ¯ rt21 Rs‚!erz$ߤ°‹¥3ñä{‡%µ7û,!KÆq|‚¥Eò°ìZ8“f{,:¶ƒƒiúîñid‹XÕSc¦y½^æíQë°”"–2þcët±Ž[Ça)무Û0Ö­ñŒEÆm®/.¯./‡—7—yYî‹Hx‚˜¬M?”Ñay„ì©ŒÀnÆûRZƒÊÒ!<±^ÈhjpÇa‚u#ô†J²‰VïÉäyä Ù0Â4˜,L0Å]ûQˆ&ãÔ˜ÅZ®/~Œ(ÅÜ Ô+Už4»|«9=+Úƒ0JJ¤•{ùi—ù!nUæ—O•ùi†µ6
+z¸…1‰XFúÇ¥ùöËgOGÕ~I®ºýZû¸e’`ËýÆ«kœpÚÓµËs&Àç{üdhLdoXâd^ÓòÌ÷(Ù4ñÁJ_jˆ¨8Þ¥(šê¡èC<|«qý]B ežÇ„Ø6A§Áñí­–âê÷ñ½‡²¿=€Òû"ª/˜aÿˆQÄöÅKõÒKg[Ѳîy¤Ñ,³iíãpt£‰dFœôEÓ®ó֞ģ˜ëÎYTScÉ?òj“û BŽh’ØxõI
+QÝ}t'1sñßì&
+K/îçöâÑw…#ºË3àÑòZÈ3¢q±Äæ=yÍT
+wOgîîr{ugÍbZjtìG!H\ò—OË‹],ýß?í~ƒúqNý×l†™$‚ÙÝ%Õ„6x_t÷ÓÒ¡ìÿ§ìÕÅendstream
+endobj
+2492 0 obj <<
/Type /Page
-/Contents 2004 0 R
-/Resources 2002 0 R
+/Contents 2493 0 R
+/Resources 2491 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2457 0 R
>> endobj
-2005 0 obj <<
-/D [2003 0 R /XYZ 85.0394 794.5015 null]
+2494 0 obj <<
+/D [2492 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2002 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F41 939 0 R >>
+2495 0 obj <<
+/D [2492 0 R /XYZ 85.0394 655.2256 null]
+>> endobj
+2496 0 obj <<
+/D [2492 0 R /XYZ 85.0394 487.8207 null]
+>> endobj
+2497 0 obj <<
+/D [2492 0 R /XYZ 85.0394 419.4946 null]
+>> endobj
+866 0 obj <<
+/D [2492 0 R /XYZ 85.0394 376.8649 null]
+>> endobj
+2498 0 obj <<
+/D [2492 0 R /XYZ 85.0394 338.6766 null]
+>> endobj
+2499 0 obj <<
+/D [2492 0 R /XYZ 85.0394 305.0527 null]
+>> endobj
+2500 0 obj <<
+/D [2492 0 R /XYZ 85.0394 233.8048 null]
+>> endobj
+2501 0 obj <<
+/D [2492 0 R /XYZ 85.0394 108.6677 null]
+>> endobj
+2491 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2009 0 obj <<
-/Length 2546
+2504 0 obj <<
+/Length 3157
/Filter /FlateDecode
>>
stream
-xÚ­YÝsÛ6÷_¡—Nåi„â‹ùè6n.uëäFδwMh²8‘Hפì¸ýíbˆ¤h%sw£‚‹%v±Ÿ?@bÆá'fIÊÒ\æ3“k–p‘ÌV»3>»ƒ¹7gÂó,Ó¢ÏõÃÍÙ÷?)3ËYžÊtv³î­•1žebvSþ1ÿ¥ìVàó××Ëåå‹åÛ7×ÿ~w}y¾™f~ñþýåõë·¿Ÿ/d˜9Ÿÿzqýá⢽?ÏåüâÍåòüÏ›ŸÏ.o¢b}åW¨Õ_güÉg%ìáç3ÎTž%³'xáL乜íÎt¢X¢•
-”íÙòìŸqÁÞ¬ûtÊ:ÉX"u
-fÑL›4Ÿ6™`F`2š3ŽìÁdRL™,p¡É7šj–ç"›õ;˜&DʞȆF‰¡È·wuóp.²¹%“_-¯hð‘sUÜѸ©éùÉ>Óàic=©´}ØUuUß…©¢£Q×г­îjväAo&Ã3¦SPþ´-{\'l¸œ-Šüþ§$éq
-ÎL–'°:²´Å¶ë• 
-Áò$‘nÁ.†MÂõp£ªÔ­U’4ŒÇ;2o Gg9xãЙøňL1´úBDö¹^ŽÈÈå"òS‰Ìx«VÓ½©Û±rBq–˜$;­]äšP¯ïK¡–$F õûíE#Ó&Œ^¦ŽÚµ/U·Q©Ÿß‡”v]ìÇ.œ¿ì¥˜‚ærÚ/¦nñLÎ+G5×0“
-uR^à9–×·³‘Ìh™ä‘••ÌVÆ÷‚ÞÊ8ôVÆak;¸€ÆÁ»÷7X·ß}¸¡÷P°qÜø¯ŠíöhQªö+ªúeëë’eCϺéZRòf,KÌ0q{Aq´2×ðêC¡µ«}¿×”vkïBp¼àô$ËY–ªÓNï1½ìôÀ„JÿÝÔì%·ö¨þK–¦&?)7ðËTÃR @£/7¿N¹ÔÔ]Ñë ±d¡–Ó•[ª-_6 ¾`µ× ³.ÔÀH¦Q8ý™iBæ _2&31’¹¼·«jõ$…–¸©V‚.-ÚM³ß–4v‚§ï )u!Ç6ó”gBcYJ²ùÛ5‘êf¼zCAeÐy¶|ã¼å–5Ãe½º& × ì Ì(ƒìç
-o÷Õc(|¸-´à«ú£È†:@kÖ¾þ—•ßb×<<Ÿ !æ¯â'‡C§ñf„±Þ ¿AOæ± ôРÜz¶Ð÷x
-dyî%”u åzKÀÇú,¢ÆLçC§#ļêí„}]é;a¤6!&ÈÉ~°€ÛÇ·Ø‚2Úž‹ù³ÙíÛŽXn=«k„™Ï2$슰C9E†ÊÕýý)e y[Þ²ÓöÎK³TöànÔ½j Èj)ą̀E°
-ÎC‡G×â‹ôûY„.„q@÷4óX5ûvûLSÞÖnv(CoZï¬ °¨½t¤ÓÕŠˆ›GP(ø
-§ýjeéŸò^vû[Cþ•RS@ãˆh¡Cf¨ìyC/tq¹7»ë‘Ja<tÁÌßw†o ”Їp„“ힺqo¶£Bá‡5º©ºÊtt]4F‹TŸ”Ñz’°=<û‡öêð=ÜICHòÝ!¼D
-™„ùåýOñmëÒ«D7#>ãjApOq 1%'Ú ~”õ`T„_»€Bâ[Çt{ú@‚Z?´½6žV„ë‹€‘ó¬ÿÃ…>çê{éÿO•0üÓrâÊG@ð?ÿ7zøXþ̲.ï¤I|œ¥Ð”B¤Çw”œI'ëcÝÿ&,±&endstream
-endobj
-2008 0 obj <<
+xÚ­Z[wÛ6~÷¯Ð9û"ŸV(n$öÉMÜ4Mâd+·ÝnÛZ¤mžH¤*RqÝ_¿3€"$JÊž]û 0ƒ™o.˜pø“$e©•v’YÍ.’ÉbuÁ'0öêBxšY š ©¾½½øê;•M,³©L'·÷ƒ¹ ãƈÉmñÛô[fØ%ÌÀ§/oæóë³ùëW7ÿ~s}9&ÙôêÇ뛗¯ÿu9“ r æ|úîê槫·Ô÷áÒÊéÕ«ëùå·?\\ßöŒ ™\!W^üöŸ°‡.8SÖ$“'xáLX+'« (–h¥BÏòb~ñÏ~ÂÁ¨ûtT‚3©R9" )&B0›$2GbYª¤râxÿáöõû›Ã– ‘N2)X*„9²2͆Taá‘cT¸î,ß_2ÕÌZ=¹d YR–L¡™)/ùó¥bZnªûg:Ç|¹¤ÆCY—›¼+ zm«‡:ﶛKa¦eËŽÉ&µdk²Ó²R—MOåd³À%¿ú.I”î”ál¹#Y,ó¶Ýg̦Ì©O3ˆF“Ñr° æq6_—‹êwÎeÙ’¨ºÇ’`LÔ Î\³¹ß#ú»©ËãâLAÉyrNœªâ TNœ/T-c’+}zÉ@4²äPP™dÂh/ù¢Y­ó®º«–UʦR1]5Eù5`‰ÓW^Ýh §ÃÖÃ} m•„ÓþX>·e7óZ¡„Z0£•ðt(ß:_•D± Ô" „x„K¿~U{>Š¢êªÆ½Á™5#lÉŒµÖOR´G˜R 3iÏüg3õôXÖH4™i®@ç,Ⱦ‡/G³¬êo»;ú’š÷͆ÛÖ«Û·ófY”~ìS¹ia;%¦"Ù[Á„«¢†m.f¸8.6²‹LƒÒ³D\¿EtYrF¿T'ô;P9ý.ÆàéøMT›rÑ5›ç}æ„”LÁa殧a/ ™1•f&æïmÓ|ÜÑ¡Vip}Ù˜REs+ÃT^ŽÈF'Â=§‰3šh*­™R
+CªãªÐS9U¸>«
+eýP‘GzÀ5ƒ`Ãœf­§á-v–i†1÷Së¤ NWØébó¼œq]¹s·Å=K¢ø'üýº¬çó·DFÜC· w2z $=»Ií´Y#Îz{‡±ª£g»]¯›M×"rÈd7IU·]^/JB!PfƒìAHÄ ¤¸˜>UÝ#µÖ›ê!:¼ æQëÞm¦YÑ[N€“mؤ'÷ U®bNªé/ˆndþ¤Zb|/ûáÍ‹ù?„ÀvE#•¥³
+"I+ÎÃdÂ2ž%L‚ffRO¯ÿªÚŽÌ
+„“ÒX
+Êï=EN`—ñ캜mr
+Ø—¯!>+ÂQË„ñ4±ñYØþ.8(ìù£:¡R ‘%„Ú'ubHu\'z*§íÙâ ‰›n†:{è Rð™\f¯§á/R L<Ìp³} †à>.4
+R®üIâXµòƒ.³Ò«¨äý?þ8ýŠš^;ï cå?ý”/«Â9‡ÄCR,ò:’*$œqƒ7T…BW—‹KT9ÿ¼k›åÖ±ÁxãG‰%„ïŸJêÁý0Šj¯j"~ªé\v´ÔrüI4’¢º„HÚïz\y@’mÁ£Þ®îk•ŸÿWø{÷îå^Míå÷ß¿{7ÇÐ< 8G—h|ƒ#¦’ÊBë„s$Q–@ä"= úk|†~ºÎ^PÛÁ*P¼s°
+Šwàg•ÒnZÄb!§WDK ÉI#!‰ñ"1N$½<Œ—‡™~qãò" jS¹ aðÉ = …iêÂ÷í’|# ƒFìàq$œŸ¢˜ºêf4݆PœÛQcÛ¯ó:»H=i`2
+Pœ.ª,ƒX.K÷$r4ñ²‚Öªª·>Éôxl¶¾˜„8°-_.›§½BÔbÙ,|å£ýX>y°Åt©í+Uǃ]i þÌô™zÑê8ÂõTáÊq„Ë Êé‹Å8¾ÁÑÀù‰ÓÌõT#ÜÅÁ.ÀªÑ:f¯Ç7a½_Àᶾ¹1wHØ"|‹èø†¯ß„å‡ø†å_ëªÏ½%t\ù—k訂t ´ÏPÒR²¬O$¼FjH !ÎP±F:HüàZ"{m^qDd¹@PùÏ<\õÈ„}™ÐòD‚¸½»)÷p—k<Í£' ¸XCǘÕcVùJ¨`—롺nèu*Ð7
+«™6É^EÞç}lÌ@RHš„üŒ r¦„ÙÕjÛz¾ó
+Ú7`‹X„ø0Û-ç5‰>tÚˆ+6ôN)ƨ’Át_¢bZ¥„4ÊŠÃÛ£²8z±Êa¹JU»Í’¿ÇÍ¢dŽjŽ€ˆD[y¦21¤:®9=•ÓœÇƒ¢fʸÍÎ,ˆF–ŒÊš‚qpÿñ’6U
+¼þº­}l6^ívµÊ7ÏGÒ8*„k±N…§‡íª¬ÅçÃ+8©- Þ®Øùÿº‚ÄÊ({&¤R8@åN§:WH
+aã®F]´’±ÐøGl¯¾¥Ö#rÛÛìL™”Y½»¡!Cµ©8h÷³“çÅ2¤Ca ÷–{ÊÜOª÷LTlÙËvðÚ à¬¤öhÂC-̪:Ê0`tq²¡œæ ¹¸Ü¯¨^»Àù6à¸ïÉ_šÀA#lÖˆ~³xxÆ߈Xš "Œ»cÒ«½ÇŒý©jË#ŸÀnÚ
+/Øñ˯ÜÐóί긤»{xk›¦þ’j×y]ŒFZdèò`ø
+ø2_øÔÉ}jð¶Ùî<˜€°®w)ÂÊ ìß·{k‰À«½šþ¹…ø%ˆ/ˆk8Úõ“V¤~»xWèúïÊî©$+PG?$¢®’²Ò˜>¤Åæ® º/¹+æ»÷T}«}!åÐ~’„Y#ôg^ZksæBÝZó¹™xXswƒ ïçâ{hš™þ/~k‘1%Upø!ÉkýZÑï¶Bõ3ïŽýLO% [7¸¼ÿÝÜÿü¾Ý5ðnŽÕúd熞×3…Û ?ôdþÇ~‡¼ÿŸD
+endobj
+2503 0 obj <<
/Type /Page
-/Contents 2009 0 R
-/Resources 2007 0 R
+/Contents 2504 0 R
+/Resources 2502 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2010 0 obj <<
-/D [2008 0 R /XYZ 56.6929 794.5015 null]
+2505 0 obj <<
+/D [2503 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2011 0 obj <<
-/D [2008 0 R /XYZ 56.6929 485.757 null]
+2506 0 obj <<
+/D [2503 0 R /XYZ 56.6929 752.0497 null]
>> endobj
-2012 0 obj <<
-/D [2008 0 R /XYZ 56.6929 207.615 null]
+2502 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F41 1208 0 R /F53 1303 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2007 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F55 1037 0 R /F53 1029 0 R /F48 953 0 R /F41 939 0 R >>
+2510 0 obj <<
+/Length 3243
+/Filter /FlateDecode
+>>
+stream
+xÚ¥ÙrÛHîÝ_¡·¥«FLŸ<ö-wef×ÉÆNíÖÎÌ-R6'©©8š¯_ æ!‘r¥¶üàÝ@h\M¹ð'‰ …NÍ"NMh…´‹ÕöJ,`îý•dœ¥GZ±^Ý]½x§ãE¦‘ŠwëÁ^I(’D.îò_ƒ—Ÿ>½½yóá?×KeEð*¼^Z!‚¾¼ùòòûtªàåû··×K™Ä2¤Ñ"¼¹¹½}ûzyûáýÍ?Þ¼½þýîç«·wcCæ¥ÐÈÕŸW¿þ.9œáç+ê4±‹'ø!B™¦j±½2V‡Öhí!›«Û«ufÝÒ)aX„6Qñ„4”HC
+›hÛ4Œ´ÒNÙþZ&A×qð-Û”9£`]ï ¦òìØüC#‚§²}$`F8«ãjS¤¬ÚbûÐD½&hZà. J-¢àî±`ÚÒQÃ!(yYViYñ½lÚ²z ðçÏ š e+Zž7ôg倄–R†©µÊ7?¤ã¶¦ÿÅ÷]Ù‰
+ãH(–ÅoJ™¶øÞâÆ@àR+=²°"/ÖÙaÓÂP2©*Ÿ Ip=Ú ¨ì³§9"q(eâ9r³X…ÒDrlÈw%Úgjƒz×–uEcÛíËm¶/7GÃ¥¬ò"§_ÎôÓˆ¬~?C—ù±Ê¶åŠ~4åCå1PL£©y»GÔxÇü°ÝÑŠˆT6º‰’Eˆ
+ÄûÓ¥3äNàgUWKTýò¶ãU]µYY‘'€‡]žµŽ!œt÷÷¼mÇ8`æ|ËW-EJ8/”’ "2HÎgÁŠ–$Œ/açµ'WÕ픇Ùf_ùöo«G5EÕ0D <d/f
+²ZÑfÛîÉÆ]
+Ðú[±ïé…bÀ %”)ÜžleÒîÓ//>eЪ\lhËÿ›ÚãAXi|l &Ú†~»ô7kë}ÃûT9/‡”¶Ø3Öý‘'R
+¸–­:ÍW=û*VŽ}ôZqì;ò±îûÅ€°ÍŽ4p®&¡jZÀð7ô“Nƒ¾ 5
+XÌÐc9;ü4k‡—Hö†xFrÒ‡$ß”MvïCÁ®nÚ¾SÅmHÐS­í©¶hZJ˜Ñ÷¦È¦ UÚa§û! ÷£QQ5ƒ',änLQ=Œ8T§Ø×z¨]G¸%owh˜þ Mƒ?KÞÓï¸)2O—Js˜«êjÊ$¸%\¥f·„»³Áð©þQ ¿ÜþBÀ¯øˆKÝj ÐQ÷*HÜ\W~SÀôû*¿ƒ„Ž úé]9hbG–;s‘œ'3jÜKzaŠ¨!:ѹêS…lØ­ìΊ©ÁiÝÒiƒ³¾ÿ˜4ìzÛi¾–»î!¹ð¯@½EM]8iL¨°×qñ ±æ/\‡å.Üþ¹aòm9hé¬^Ä[$Õeæ:¬ îF9~Ö ”³7îK Ÿˆ±#à —hßî߈0ŒëÑJÀܹN³óî¸ÑâÄ–¦è)G.ÑÄijéÖßÊœ—gO
+È{òÞ5ÖªèBsîŽ Ò§qo!ðoõ˜í³=‡
+endobj
+2509 0 obj <<
+/Type /Page
+/Contents 2510 0 R
+/Resources 2508 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2507 0 R
+>> endobj
+2511 0 obj <<
+/D [2509 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+2508 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2015 0 obj <<
-/Length 1499
+2514 0 obj <<
+/Length 2925
/Filter /FlateDecode
>>
stream
-xÚ½X[sÚ8~çWøfŠª»íÇ”Ð6Ý–dÙÝ™6.ˆÄ-Ø]Û$¥¿~,ÉØ `ÛÙÉLÆ–?sô+"†?Daó Œ9˜ˆ`¾îá྽é‹:аz5ë½|Í F±¤2˜-[²"„£ˆ³ÅÇþÅÍÍxryõ×`Hî¿Bƒ¡À¸ÿábrwñÞ¬Ý bÚ¿x3ž†$”Œ(Ô0‰û“‹ãËáèíxôÛèzòzp?{×ÏÃÚÆÌ´U÷>Þã`gx×Èőžá#Ç4X÷¸`HpÆÜʪ7íýÞl}­·úÈ,B"¢¡‡ JBP,íÐ!b$e5ÓñØœúâýôZŸvч8€¯H
-Êkø"+K5~UÛ•}ÂGð¼0YÜ&Ÿ ê@€Þ÷êjriôÄVÝbfiYI•féV-U1 Q_ese–>$Ù&YyÌ"2BTJiÅû à(Ž³€Û×##lbyœ ʱhdú†4(Še ™D!COw³·×·ç™»Ê*Udª2fL·e¥Ö¥yåY™UºYïôrĸ¤VXE46L¢âCÌfÉZ-†óG5ÿ:ϳ¥Þ«ÁL &Cž
-Ö’NqŒ(©m¬Ó)-Ô`k CG’6!i¥.Ó•ÒÆ8?îý¡*Š8]n/ÇÓÑíÕÍìêzÒìòÄ«ÿȇQQ-šZk¤ èê±/ÌËç þ,¯öqjdU:/-4·A˜üLú³ÖYÙaâº&azP¿mˆ0 ™®œŒ£6Ê•ÛÃ8jPZïðq_%”lÎù•äQÙvH#®ã¿£ò¦H³}º7eòà˜ß¬× ÄŸ¡;³,«ïi…Ž²†GŒa§…:ÁŽCÕ츌íC!BEèË—¶m„‡°äœ4®Ay¬ëtAQ̹ìš7z¬»S®£—á*š'k¹€f,C~w”‰¢°9Y™[¡‰ŸfóÕf¡Ì ª;ã¼JŸTiÒÏÜ.‹;H½è
-´~NŒóòÍh® ©/êþÁ‰¥æÊå—ؼNmZƒ¨¿±¹÷yÛIÕ2]§«¤Xm]pœ¹®sùhlј!"ä™Ìk£ŽÇVƒªcëé ó˜îægT:Ge'ó"ðe¸§Ò—yOª(›²åªœþzXa€„¬ÇnÄùÙzl}ûP$ëŸIn*AJÄÏ9 …:á
-ñ®Û¦Y%Õ¦ì#Ò qU˜z^Xسr\¿-T£k±M¥ÇV$„Añœ–ÿnBå^ &¥u°kõ†)“Ý'® ×…žðÿç¾
-endobj
-2014 0 obj <<
+xÚ­ZÝsã¶÷_¡·Ð3?Ú''q®—Kík¬›k›ä–h‹=‰tEÊ>ç¯ï.vA")·¹ŽgLp±Ø]ì.?€’3rfâ0ÎT6K²(4BšÙr{&fÐ÷öL2ÏÜ1Í}®ogo~ÐÉ, ³XųŽ'+ EšÊÙbõKðm˜†ç Aß_ßÞ^}7¿}÷öúŸ7×Wçs™&2 .?|¸ºþþÝßÏçÊ`f!‚¿^^¼ü‰hÎ3\¾½º=ÿmñãÙÕ¢3Ì7^
+Výûì—ßÄlsøñL„:KÍì^D(³LͶg‘Ñ¡‰´v”ÍÙíÙß:^¯:ê )B¥c5â ¥<o¤24Yff‰ÉÂX+m½ñi]T0)9>tð¹x¡÷²¡ç}½¯VØ΂²mˆ«-·eõ@ Û¢ÍWyËãÝ°âK,ÅŠÞÚšzWE[ìNäuýÌÊZêoÖõ~Ãcî˜ißN¾\Ö»s™«9ºæ?—2ÌŒQv2dȪÃ纠Æ}½ÙÔÏ]ÿî< ö›¢Øj)‚«|¹¦Žf¿\MS>=F––.j>îÊzW¶/ôV?»#…–{«¢ùÓq¦$)2U³DÆáD`#èùÑ »`Î=#!C“Š¬Ó‚Nzwf%2¨jzv¡„¶Jx[ç 5î
+›$Ðj
+ T‚Ýñp;ch`âH) U÷é¶Q²´ÇýݦlÖ65\ ú½®¸•W̃)À\luS>T6pf:6ýD耲Â)ßÇIj$Üù¾„)ï§=ûýLÿ|ã²
+=³ÌÛ²®ˆ
+’ªâ™(
+q]²Çr¦/ëí£Ý`«iˆ8Œ²W¶é„?˜Éºc?pGŠ,9­Ïñ õùÎH$î*}} Ej×·Wß½Áß“`¹Î-V€.®@Ðâåp(DÀ˜S/•§²Þ7›¢!Ÿ-ÀF°l«,øtn`¯h×ÄÔR9„•C,F©&±4Œ ‡q¿zt
+Ra "µpÔZæ5ìf+³yF<YO£èìÆhÄA’a.cêâ-,'ÔéQ}õÙ%ƪFª ð˪EVÓÓÉ…&+ƒÖ
+êøùž‹¦2’ó]¾Å #¼§1‘ì|Œ[I%7£v3í
+~NjØ9²à+m «ªiŠ¥¶ ÃqR%0H=⧊ƒ*ȸ3ÈÖ~ª0“i4Q½òŠË2ŠaQù…ÏeÞäºÔŒ‹dtzaú\Ó+³ã²Kói ïÉPGIÄÓßOÅ
+8„ô,»-ÚæU¯Š»ýÃCçPkØ´ËDª(Ó¯¸Ìã:á2Çe]öePÍ ½ N«tL#*{Åš‰–}•7•-=ÒðYCKEÔahÿü3 Ÿ×–´PÔ+mH€ZQ¼4íè äz[¶-y»§älHž‡%áß#¡ ‘p!¤Læè4…×#„{wYå¶Üä»á•ípgÎJõ×0<pvŸ›Ïµu)š?AC•|T†ÀŠC«ŒV†šc!‘®zTPV#ò5^zhW3B{ƒ3‘š
+¶68⼂;|®éÔì¸ljþ>•š'Uv©9T9–š=•ï: Jàøýí{lDp¡ó>0Ò§8tÀ¿ûÀ
+zó¹NDÆqÙÈ\¶ÈpÔ§U:¦•½ƒƒ
+¡êÆ}•ììL÷m¯¯‰îœ $wJ
+endobj
+2513 0 obj <<
/Type /Page
-/Contents 2015 0 R
-/Resources 2013 0 R
+/Contents 2514 0 R
+/Resources 2512 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2016 0 obj <<
-/D [2014 0 R /XYZ 85.0394 794.5015 null]
+2515 0 obj <<
+/D [2513 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2017 0 obj <<
-/D [2014 0 R /XYZ 85.0394 752.1815 null]
+2512 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R /F53 1303 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2018 0 obj <<
-/D [2014 0 R /XYZ 85.0394 689.7995 null]
+2518 0 obj <<
+/Length 1899
+/Filter /FlateDecode
+>>
+stream
+xÚ¥X[—Ó6~Ï¯È §Î ]më1ìX.Ë–¤ç´xð:ήKb§±³~}g,ɱAK{òYÍM3ߌÄÆ~lœ(B…–ãXK¢(Sãl3¢ã;X{1b–&tDaŸêÙbôô¹ˆÇšèˆGãŪÇ+!4IØx±üLonf×—W¿OB®hðŒLBEiðvzýÛô™»™hL_Ìæ“Å‘@¤‘,¢Áõôíì2¼x9»x}ñîúùäÓâÕh¶èë+Ϩ@­þ}øDÇK°áÕˆ¡5þ”0­ùx3’J%…p3ëÑ|ôkÇ°·Únõ9Cª„(.£qÄ’j¿Ç(¡
+<Æ’ªùÑcœù<æ¨ÐcŸóé¡Œ2ÉxÜçv&ÓydòžLF#ñD …ηyV¬p"Q|¹/²{3ej3ªï«ýziÆ·¹ùß×¹i*KUÜ•væÞ}«ÊÎS¨$¸Z™©²:åžî&, 쎕ùH)Ï—O`&¦È¬eÙZu‹õºÓ <7D°ÁÑJñÖÀükº)ÊV]AƒUµƒ×Áåõüõì3iTȪöY‚´1‹F. ¬\\Úæ_Ñ0*a0Tµ¥;Zó«j_ZÑ©
+²j³1N„5”_›!ÚÝ2•I?Ü!K9M$pwa°]ç˜x4ˆ"’HYZa\ÑÜáSêr>5L×vp——ùŽii(oOzÚDà’Dk+aYÖuž…À6{ô A¢©‡±ü‘*úºg yL©xÌb.cXbž<
+žåYºÇÃœ3TGN1«L8÷hÀ8‰-IµmŠªDŽ<(jó_VÜæí¡4 -!m4â2zó»Çä=Ž6ûºÛnù–!&(èÀéI>oÒºÉ15 *Ö¹+jào©â$Vw~¿%?„D(éÈ­S¥`”h7
+*ʇ*K?ð{]UŸífǹ
+ŒC½H˜ó厾ñˆ )´N4š†).¨MqíR\³“×ßIqÜZWnkÚX¿jD…ÊåÜ$ö9"¢¤åŠÍ¶Ú5*´ÄàP%vt<“aôʼn¹Š\üÝù‚$*ŠçpîÙA!U GS 8CénÉMÂ,·I†Ha2'A˜ù¯Ì?Ì®aˆ´s™C6±ø\ôáõ-A¥À{žü
+ë>‹ö¢+}—ëŽÊë!LÓáý'7zèFv#Û¦)ÑãΩ&œ©®†;‹MžÞSBÿÚ¤åº*Ö9*ãdl;iß>ùC6$‘T ½|9›_¼¿ºY\½»öÔù“Àõ„Ùyß«så«¥ÄF]0ÛÇ ØUb¥Ý7fÖÜt9ÜÒš"«-iµ2©GOèî Ã7•^ÙôµÆ’ð¤ëBN#™·Œ-Þ -Œ6¬ mÔÌÄ$øï§òØ
+&Ð «MüÌMͪv­É<ÒuÕÞˆ˜«°H•â­§lko>Š2[ï—NÜÍlƒ×µï ¸NŽ{-‘e1x59B ×Huû4o²§ÆÝÊ àýDïâú1ÛZˆ¹=ØÒmZ
+ò½×;@9|ród:íà¿ìß0%´VIÂýc‚Z ÍœRhSâTu%¼oÄÝÿ$_Éendstream
+endobj
+2517 0 obj <<
+/Type /Page
+/Contents 2518 0 R
+/Resources 2516 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2507 0 R
>> endobj
-678 0 obj <<
-/D [2014 0 R /XYZ 85.0394 651.2999 null]
+2519 0 obj <<
+/D [2517 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2019 0 obj <<
-/D [2014 0 R /XYZ 85.0394 618.4832 null]
+2520 0 obj <<
+/D [2517 0 R /XYZ 85.0394 672.6222 null]
>> endobj
-2020 0 obj <<
-/D [2014 0 R /XYZ 85.0394 583.1153 null]
+2521 0 obj <<
+/D [2517 0 R /XYZ 85.0394 403.8925 null]
>> endobj
-2021 0 obj <<
-/D [2014 0 R /XYZ 85.0394 517.8114 null]
+2522 0 obj <<
+/D [2517 0 R /XYZ 85.0394 340.9183 null]
>> endobj
-2022 0 obj <<
-/D [2014 0 R /XYZ 85.0394 458.3941 null]
+870 0 obj <<
+/D [2517 0 R /XYZ 85.0394 302.0073 null]
>> endobj
-2023 0 obj <<
-/D [2014 0 R /XYZ 85.0394 396.012 null]
+2523 0 obj <<
+/D [2517 0 R /XYZ 85.0394 269.01 null]
>> endobj
-2024 0 obj <<
-/D [2014 0 R /XYZ 85.0394 145.9047 null]
+2524 0 obj <<
+/D [2517 0 R /XYZ 85.0394 233.4614 null]
>> endobj
-2025 0 obj <<
-/D [2014 0 R /XYZ 85.0394 83.5226 null]
+2525 0 obj <<
+/D [2517 0 R /XYZ 85.0394 167.5653 null]
>> endobj
-2013 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F53 1029 0 R /F55 1037 0 R >>
+2526 0 obj <<
+/D [2517 0 R /XYZ 85.0394 107.556 null]
+>> endobj
+2516 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2028 0 obj <<
-/Length 2089
+2529 0 obj <<
+/Length 2010
/Filter /FlateDecode
>>
stream
-xÚÕY[sÛ¶~÷¯Ð#=¢¸À£ë¸­{N·v§¦y %ÚfB‘ŽHÙU}7Š¤H)N|δã –{ùv±ØÉ Ã™‰%šê™Ô LÄl¾<³;Xûþˆxš8Å]ªo¯¾ùŽÉ™F:¡Éìú¶ÃK!¬™]/ÞEß"…ŽŽ.NÞœ½ŽO8;ýÏïo/ÎŽc"J¢“Ë˳‹×ç¿ÇT` bŒ£7'¿œü×Í]k|vuüþúÇ£³ëV±®ò3£Õ§£wïñl6üx„ÓJÌžà#¢5-¸`HpÆÂLqtuôSË°³j_ƒ`DYBGРdFÒBÐB£„Qfá8ùåú‡·?C€œvÀó˜&ˆ
-Gv^6ÙªÌÀÕ¦n²eíN«²®VM¾^z. ”#ÆêÙpl0èÎ
-²“H&Ní]ëµ@”$a+;pAL¾Ì‹ÔZO ÷)@Q®?e0Ó\L«Tt³nœ¼¼q¢Òâ)Ýxë僺Єõ
-Îg Tc†EÛ3œ
-d
-q @6Öš…óÓ^=ÑèW›
-»„c¤ÙF¬ëô.„èz¹LWþÂÏ×8ÊþÌ›iD°¹ŽÕô
-#{¥Œâ„¨ÝMí¿^ïêþ7Ü°Mendstream
+xÚµYÛrÛ6}×WèQš‰\yé›ã¨­ÛÄvc¥í4ÍMBŠtI*Žûõ]
+)£‹ÍØžç!úÇíY™}{t&?Ú».Ó¼Ö ëÁ®ŠîÌ°Úm·Qù¨'Š?šüšÖè .´S_œ
+›´B“ƒpªƒ`C“¿mdÞAŸæwƒÀ(œíV£w Ûù(ðS±+s[6÷Ӻ妪®ƒ  sŸÈí¾Ô0­”Z™ö[Å{l:Ψü¸i+ä0MGÐóü¡íUƒ ó›tS£@ç3<Ñ Áƒ½}]½mÁæè
+6¦ÿendstream
endobj
-2027 0 obj <<
+2528 0 obj <<
/Type /Page
-/Contents 2028 0 R
-/Resources 2026 0 R
+/Contents 2529 0 R
+/Resources 2527 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2029 0 obj <<
-/D [2027 0 R /XYZ 56.6929 794.5015 null]
+2530 0 obj <<
+/D [2528 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2030 0 obj <<
-/D [2027 0 R /XYZ 56.6929 751.9898 null]
+2531 0 obj <<
+/D [2528 0 R /XYZ 56.6929 681.0754 null]
>> endobj
-682 0 obj <<
-/D [2027 0 R /XYZ 56.6929 712.1227 null]
+2532 0 obj <<
+/D [2528 0 R /XYZ 56.6929 404.8182 null]
>> endobj
-2031 0 obj <<
-/D [2027 0 R /XYZ 56.6929 678.7055 null]
+2533 0 obj <<
+/D [2528 0 R /XYZ 56.6929 344.3155 null]
>> endobj
-2032 0 obj <<
-/D [2027 0 R /XYZ 56.6929 642.737 null]
+2534 0 obj <<
+/D [2528 0 R /XYZ 56.6929 283.8129 null]
>> endobj
-2033 0 obj <<
-/D [2027 0 R /XYZ 56.6929 575.4649 null]
+874 0 obj <<
+/D [2528 0 R /XYZ 56.6929 246.6193 null]
>> endobj
-2034 0 obj <<
-/D [2027 0 R /XYZ 56.6929 435.4781 null]
+2535 0 obj <<
+/D [2528 0 R /XYZ 56.6929 214.3762 null]
>> endobj
-2035 0 obj <<
-/D [2027 0 R /XYZ 56.6929 292.5265 null]
+2536 0 obj <<
+/D [2528 0 R /XYZ 56.6929 179.5818 null]
>> endobj
-2026 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R /F55 1037 0 R >>
+2537 0 obj <<
+/D [2528 0 R /XYZ 56.6929 116.1573 null]
+>> endobj
+2527 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F55 1311 0 R /F39 1151 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2038 0 obj <<
-/Length 3060
+2540 0 obj <<
+/Length 2741
/Filter /FlateDecode
>>
stream
-xÚÝZKwã¶ÞûWhÑ…|ÎÅ“
- Eå€4(mHƒ`hód&…F £ÌJã¶Xef@K´T#"$…¢”òõq»5¿ž˜¶‰µæÄ/7Ùò×òrÁ¸˜W›´2->¿ýÉ.‰šgËÂþ®Êæà:;8ÚªpÃW®[|þ†&qT±ÀEµqù~ñßbŸ¹Nº÷4űZk÷–¢3Ë$l¶ i!¨]À¦(«}ºËJ˜’À¾3‚ÇĤ8l U 1m‹e:&'Æ4µØo¿8¼‰™ö­ÇeONfðy“/7ÍçVd¦kDf~ãºM'.¹Õ¢§qÅÉ$
-TK@E2_eÛìSZåÅÞ=¹»w¿ íÕ%~uÖ2˜ŸÂ;Tô'qc5*L¯!˜Ä¡ÂΨðpˆI,Úp€6¸fó÷•{–n˵¢@Ûë´>m~–tµrÌ–ž¨¯0˜ïà ö5:¯ÙØ¥•Á€{Z”qÚÏÙ¡ÊËle—ƒÃ:Ü?z´Ùéìòíê¾’\’á›LâÛíø+CÛu‹@ëá†çe±Ëê5’\lkkÝG~;æ®±ro¹}2­ì÷¼¬Ê7ÝióÈn¶ïÈÔ²“>¾iî Ó†è]Ó,Åý:K'1Dz£“‹2ÜæûO#;“pDçþ%ƒüþÄðm¢xo¯OͬÁDˆÀÎ*/ÓÇ­‘csÿ¢éÐ TŽh€ÑÇcåS·nô5;<ç¥Á ×LÂui9°€Q6™ëö&Ÿ6[`#Ô)Ñ0!ù2ó^ÑŸ²e•Î@%hª·ÅŠ"Î1?Û“& {
-˜À4XÇè°ƒ÷]Áúí ¯ÇËôXfAI¼Âgk#Ö5XjO}Üomˆf=¸quÜ=•£6`Yì«l_M˜UÌP¢‰:¡( ª E TVQ~V¥EP”÷,-5¡).¦ù
-D|µ”„
-H§’c²ƒïÀ.sX.¡MŸf÷xáìaIp™¤WnPdþœÛÜOÑ k¤©Sn`æÛcˆ4Ì€‘ˆQ7Ì[êæ”nº s-9RR‰f,_á|ÁA*€ÿ®ÎÔZ}Åͽ†¨¢­Åî)ßf#:¡AR´ÎMA£ß EøˆjÕÌðžÓÃ~<¬HtÒ·/æû¤&‹×Sž
-êDx2ÍX¤ଭ¥ðh¡Û¬Õ® “ؘÜt¨«Þá¡ËMq4™Œi?f™´µC˜ù§ùÚ?Ødþk1ö·:56% XKK5a§š.«S(áºïë+HÃßyê
-Ðâ‚×.eÀ|"ìëTç¼P¼ àü$ÀIb´ì„jRM
-¶‚7„ތٗ՗í€ç5›Mr©Xk°
-„¶S.´ô#å1¯Üq‰§u'+¢b ^ØŸ˜±ôX0S¾L·æTÍ =úßÔO–=¥‡´ò“•ËCþdPŠù{7XíKûŒÐ}ƒÐÞ
-Ñ\ÂØ$g‘¨ÏZ ŸRh.©ÉÛõƹ£½ ëá(• $T2Èl7¦4ñl\–½ìb&u\ •ï—Ûã*s•¿Ta½KO
-endobj
-2037 0 obj <<
+xÚÍZmsÛ6þî_¡ôLˆâ• >º‰Ósï⸵ïÚ¹\>Ð"e3¥HG¤â¸¿þo)‚’fæ®™©@`¹X<û`± š,0ü#‹T Ì_HÅ‘ÀD,–뼸ƒ±ŸNˆ“‰½P<”úñæ䇷L.R M7«®á4%‹›üCtvuu~ùæâ÷Ó˜
+ýˆNcqôîìòŸgÿ°}W§ŠFg?_ŸÆDJ@ˆ`-—àèòìÝù›øõßÎ_ÿýßï/ÏO?Þü|r~Ó[6´ž`¦Íú|òá#^ä°ˆŸO0b*‹GxÀˆ(Eë.œ1ßS\ŸüÒ+ŒšWChp™".1ã(M@C@†
+Щ½`˜7…Vžòèñ¾¨m«j²¼¬ïôƒ]Fj—¦sB£›û²µcëì"d‘@:BÒ¡IÇ —TyVmÛbµ­ì¼
+a"“c(1ÄSÞ.–l7™&œÕïczèÌb˜êJJùC‹5ïÍyu=)s\Á 0ƒÂŠŠÃUÅPÊT4TUôRzÞ8ߟ
+*Ñðð”^(0å(„)8;ÅÞ”çuv[9åÅíöî-š[9—‘DòÃ+Jͯ¼—2+¿Ÿ[ùÁ)û•O§ ­|4å)ÝŽ¦±m³;O×ízmžkÇÙâkÙͣà ll[G@g u
+˜6Ÿ@B8&cÛ®õQ¾zڃњ3¡ï]U]¸±ºé&‰Á+ç3(•..õÿ/ZŸU@T.òyg‰„:aB\á„Œ'Ê€'Ôs@ÊqÅ>òTX
+~Ш^hjÕÈ Pûc‘È‘YW¶*P9”¨MÛÅz+ØG—™òQá«l¥ª“ÉTEWMÛ–æô×’z­•Ê\}ÈÊdY©ò Ô.‚2°2®š†-
+M¹Æ»„šäU@=ç™(¶§=ÖVŸ™%|.‘¤/™¦j¡®N€ÆÉ^Ò«õUÍ2›3J"Á‰8 ˜#•>0ר;f/Ä1æ+Bº„BLÈ¡â<:g&…
+PIʦI0*¡ ø„•¶¬—
+˜6.e‰’cÛÂ¥¬³g¾–ß,›€º«¦v|Ý:_OAÅÃñhswÅ×î sU¸žÚ]¾BA,Tb˜ào²Ç¹I$‚Œ ˉ[¤DP ¹÷ÍsÅ ª¼ ÝzÄxÿÑwŽ+T_^ÒƒvõBSÃÆLQäZÖ…¥ÜÐ)뉢;5QtŸä»oL)Û}!JGk€;¢Ã Vxž; ƈzw`—°”ÌrÇLäN ÂxW7‘g“ˆî>^éò¶Ù„¶
+endobj
+2539 0 obj <<
/Type /Page
-/Contents 2038 0 R
-/Resources 2036 0 R
+/Contents 2540 0 R
+/Resources 2538 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2507 0 R
>> endobj
-2039 0 obj <<
-/D [2037 0 R /XYZ 85.0394 794.5015 null]
+2541 0 obj <<
+/D [2539 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2036 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F21 714 0 R /F55 1037 0 R /F41 939 0 R >>
+2542 0 obj <<
+/D [2539 0 R /XYZ 85.0394 677.5149 null]
+>> endobj
+2543 0 obj <<
+/D [2539 0 R /XYZ 85.0394 533.7824 null]
+>> endobj
+2538 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F53 1303 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2042 0 obj <<
-/Length 1827
+2546 0 obj <<
+/Length 2753
/Filter /FlateDecode
>>
stream
-xÚÝXKoÛF¾ëWÈEÌ;¹{tb'u‘(®%§Ò‰’‰ðáòaÇýõå.)RZÉŠ^
-8¤†3³ß¼I¦~d*$’šêi¨9˜ˆé*›àéþ{?!Ž'蘂!×›åäõ;N5Ò’Êér3¥VŠL—ë/³7H£3€gó‹W—gåœÉÙÅÍÍÕüòú¸˜€ãÙÇ‹ùÝÅûìæLÓÙÅû«ÅÙ×寓«eoÎÐd‚™±å¯É—¯xºË`Ä´Ó'¸ÁˆhM§Ù„ †g¬{’N“ßzƒÛW}p¡ \NÆ‘ý~ 
- ¦Ph$e=P”ø€ê¸ PÁïæ ¯ß 1à$…!V Ý°dÅ:ÞGCKÄBN¦CvuL»èP&ˆ Ádž-âU²y> ˜–³§û¸¾K{SöººWß Î6…û//ò ŽË,É£Ô½š¤ëUTž5[Wàð«Ùü4—}dïb« J³¢ª
-Ó€h
-¡€ H A[s£ô)z®LœÑ˜j +¡jÒÚÞ{ìe%iÓii_,ìµÉ×qYÕQ¾Þ84Ó>É¢zuŸä['8ÝeRßgööO,ðí»·ö‚–Ã0¬f7EU%ßÒÖ³à®ÑaŒÇ+›
-mŒÂ‰‡HÌ]üI)ŠÊÜ\óÐÇL@ìÉŽÌZÇ›p19EpØC%¡d $ÙæES£Ã@–ä°K”C61Á^Ȧ׉l긌ƿ‹<Σì ]
-µ/¿~Ù‰I ¥»(Ÿ}B!©8€·yQhSu·ï.*0}üj'h&M½R¤sÝÙ¾Ÿ{ÎÅ°/ÁŽG»H Ü t‹ÑN¿¯hSÇ¥áòjñööúfyýiþ“ Ú7†B°rÜådb
-.ÍÔo.—®vº-ˆ-eË®¥Mûºœ/ìll¸Ârè? ñì!‚Ðkÿ2MÜ\ÛAŶJÛËÚ4Ÿä[S'…Óº± Þi»^¼E–z×nQ@dÅnêoWÏö4£lJrع`ùh…¶­?ß›˜àç]]v ×V}³eç=ÉÏ÷Æ Ó‹Q¿™(Cƒí ¿ßÇ­ <ßmŸP°Õ÷ESÛìʲm²8¯«s‰Sa×SzöówA«Wjå[l"§ÚWÏÜFco ›9qÛ”=DÊMŽžp%!Fœõ5ãu\¯^·V!SÏ}s,Ê’©áPb>„ÝsÔÐZƒð³›öò¤N¢ÔµÓ¨Žö]BØÄΧ›nrù«‰Ë$®ÐOôØOm-Ž-Z"ŠÁ'›è€éøÑ1µ_3ø¾> Ó™&ꤾŽçPßs dÈÈHß]å"ûúæ‘wy:ˆ¡[æãѺÏ{ó1¡¥²È¬ïîqâ²c=Df5é B"_©f÷ »ÚøöbbR¸ïýª=BØEØͱ<*¦Ëˆh¸dM lô«´©’Çøø")wž^#{žK¤åÙ™ìsþ e½ï÷•ù\?P6ô¼üï=Ïÿžïf^ÌWO3p_NþõÇÕÝÇcnj½¢~ÇÒÔ@;£ÌáŇA‹e°ôÚþàEqendstream
+xÚÝZKw£FÞûWh1 tNT©'Uµtlw¦3ÝNOÛäL’¸Åi 8ž_?·^$@î´É-(.—ª[·¾ûDdáG"F±¦z!5G±XoÏðâ#<ûöŒxžU`Zõ¹¾¹=ûú“ tLãÅí}o.…°Rdq›þ}ƒFK˜G×ço¯.Wÿ¼ºø×¾¿¾Z®ˆ$”DçïÞ]]_¾þi¹¢?0c½=¿þpþÆÑÞ-5ο½ºYþzûÝÙÕm'Y_z‚™ë·³ŸÅ‹6ñÝFL+±x„ŒˆÖt±=ã‚!Á ”âìæìßÝ„½§öÕ1mp¡ <½ĤœÐA’`’L#By§2JÆT晌ÆVŸÌ6¿~%D‘¤´
+õ.«ï«zë$lc„ ^²_(åëM¶þ´*“mÖ˜[ÿN râ_±ìÍrʼnóvcF4j7™#5Ù:ÿcš¥ŽpŸäÅ®^y£ @Ä<zW5M~Wô4nºÄ¿p,?•)©ú0+LH¾â˜!¢([¬àH´Ô½…N³ûdW´² ¬‘µE 3ê—2JWëjûÙ«2YÏœ¥*‡ùjd^…¨Vª·ƒÇ¤.'vÀ@.ÞOø§å6Ç6!µÕà=&@j7{R¦c' ‰Eÿ
++Rô¦‡æ4m­$~ž¦88rÏ<f3iEØ—ÙÌ)d ¤äóÍO"[Àé«Xž@vkÙË"ûí²’«9dÇ9™—+0È5D6AL
+½áû|pMÜåæýRˆèwsÔp à± æþý®á" ÑU¦–w¦á›/ /Øp¡‚ñg7\$éæqÃÅ>Ýpa„‹ãzú%ê:(³ ¸<U×õ¹fи,:ÛÑÄ—P”æ5ø“ñÕu “XÏ ×qH7¬ë8ZÑ¡xOŒ CR<^Âq„Šã1y .Sì‰Pf4•ŸÔ&Ïf”—ëb—fî&rØ7Á£ñ àçËð–çÏgrˆ;ˆ`y基¬Â{MsÝYêcØ
+ݬ
endobj
-2041 0 obj <<
+2545 0 obj <<
/Type /Page
-/Contents 2042 0 R
-/Resources 2040 0 R
+/Contents 2546 0 R
+/Resources 2544 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2006 0 R
+/Parent 2549 0 R
>> endobj
-2043 0 obj <<
-/D [2041 0 R /XYZ 56.6929 794.5015 null]
+2547 0 obj <<
+/D [2545 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2044 0 obj <<
-/D [2041 0 R /XYZ 56.6929 627.8052 null]
+2548 0 obj <<
+/D [2545 0 R /XYZ 56.6929 85.6141 null]
>> endobj
-2045 0 obj <<
-/D [2041 0 R /XYZ 56.6929 562.9454 null]
+2544 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2046 0 obj <<
-/D [2041 0 R /XYZ 56.6929 498.0856 null]
+2552 0 obj <<
+/Length 2176
+/Filter /FlateDecode
+>>
+stream
+xÚÝY[oÛ¸~ϯ0Їã
+“«+»ÙóO“[½øŠvL‡G¡Rö"]g³oX` ÿÈ™ýÔ FÓe6}š–ż3mä1Õ‘G8AŒ€4läݼ°2À\"°<pS.ˆã äHIÂÇë›K+O¹]ÍÖy‘Wõ6­Ë­ºÏæÙö”ÈqVL3;ô9-štXžÄÑ8ŽxäXzf˜H¢€J€à±…×—‡_oï[ôº¨³m‘ÕV“ÉkUgëʾ\”EUnë¼Y¿­Ëã1ur8©‰´[lžFcwúÍÃ@9ιṉ=)$ãX¾±Õॉ¥újÎÊušo§o©*Û>ƒi6Â}ÛL^‹rSåÕÐbpHæ*FŠ%<„wzSÁŒ°
+é :I„ʯ%ßfSu¯!¡ÅT¼YÕœ"üJ
+ß»S$î›ÀRv×þìšÊûúðìh¼céç–ú£¥~–Pż çÓ’Ê>g²6RÝíì„fJ!7bFúáçòjrq}÷p}{Ó~u8ã‚&ŒrìýbYyœÚÇ¥‹š6A×P6¸[Z'ÉË›‰N“vÀÏ„C–mñx“ôÌT9·ÏzéÙ4§)e3âòǦÎK·êܤ¸Ò­v=¹@–ú¨Ó &Ö¥M‚ΙÝnz¾œór»N­PàýÓ(¢ ØÁ™ýn2zÕ¦tvÖ’Ü‘i1{ËøÈg)"Q‰ߟË̬£@çòÉæ"9~ÉëeÙÔv&5Ê/šuVÔÕYà‰H“‰ÏÜ{Oê«{½ä«••om“º¥Ý~ÄáyÚ¬œë¿aLͶ5‘ë‘ \I‚gmÌxŸÕÓ÷F+¤sF@5 UZÌd·ôwTW[máWK@åSçéÊ¥ì´N‡G°ØdîLç¾>ú»É¶yV¡ŸÈã·Æ‡&;e°KÂTa$ã‡3u—ËW­»™ºåÒëF|¸¤bˆ1I/é™Kv M#Jô—üR9|_ß=sï +ghÈËΊù|à!˲r5Ó‚d[Çç|dšnÒÇ•,çí1
+…V(4•L|·VV¬Ú‘ÛÌ¡O:
+-ù†‚%ƒ(è.ÙEAü¿Gÿ?B”`„C¤=Œ‚×x.£¸¯ÊEWqŒ(#"\”wÕ#1ÄSÊÙaýZ®€‚ýv1F‹¤¯¡M ˜ÂZ·½}COn ©@Bvç k %\9 øn"Ò³.:/ Îëô ¹M5ÑýÜ%µ³ÖHŒ¸PÉnÒò=
+cP±Ô•%´t£«~ªÜlÀVæv¨É,¡Õé>SûØ”U•?+ Ê0RÇá’¿gr(‚HÒ6åÆÁC+êž,PÍèAkƳ
+÷´Jíu%ˆ-ŒéÞxö»‘ã1N4ßé(‡”Z̳ì,ÖëD ‹»‹Ý7Ã_GØp2˜œ;X,,šß—k'É‘F #ú²ÝÛÐß¾›0ŸÿÇx Ú÷#HÿrØn[úüÕÛ/p\ß·H6Ú.H0N)m+"’¡êíOY»ºÿ%Ǧendstream
+endobj
+2551 0 obj <<
+/Type /Page
+/Contents 2552 0 R
+/Resources 2550 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2549 0 R
>> endobj
-686 0 obj <<
-/D [2041 0 R /XYZ 56.6929 457.8644 null]
+2553 0 obj <<
+/D [2551 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2047 0 obj <<
-/D [2041 0 R /XYZ 56.6929 424.2917 null]
+2554 0 obj <<
+/D [2551 0 R /XYZ 85.0394 752.0294 null]
>> endobj
-2048 0 obj <<
-/D [2041 0 R /XYZ 56.6929 388.1677 null]
+2555 0 obj <<
+/D [2551 0 R /XYZ 85.0394 688.0859 null]
>> endobj
-2049 0 obj <<
-/D [2041 0 R /XYZ 56.6929 320.386 null]
+878 0 obj <<
+/D [2551 0 R /XYZ 85.0394 648.5014 null]
>> endobj
-2050 0 obj <<
-/D [2041 0 R /XYZ 56.6929 234.5807 null]
+2556 0 obj <<
+/D [2551 0 R /XYZ 85.0394 615.2083 null]
>> endobj
-2051 0 obj <<
-/D [2041 0 R /XYZ 56.6929 126.8791 null]
+2557 0 obj <<
+/D [2551 0 R /XYZ 85.0394 579.3639 null]
>> endobj
-2040 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F39 899 0 R /F41 939 0 R /F53 1029 0 R >>
+2558 0 obj <<
+/D [2551 0 R /XYZ 85.0394 512.4986 null]
+>> endobj
+2559 0 obj <<
+/D [2551 0 R /XYZ 85.0394 427.6096 null]
+>> endobj
+2560 0 obj <<
+/D [2551 0 R /XYZ 85.0394 321.0146 null]
+>> endobj
+2550 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2054 0 obj <<
-/Length 2977
-/Filter /FlateDecode
->>
-stream
-xÚÅZmÛ8þ>¿"À}8¨]½ÛLÛÙbÛÙÞvŠ[`w?xeâ«_ÒØî´÷ëÔ‹c;N2@ \ Œe‰¢(Š|HÊ¡ ÿé"‘á©XÄ©ˆ$¡r±*¯ÈâÆÞ^QGz¢pHõêþêåO<^¤Qª˜ZÜo¼’ˆ$ ]ܯÿ®ß¿¿¹{sûû2d’¯¢e( Þ]ß}¼þÅö½_¦,¸~{ó^…à
-ˆR$S$¸»~wófù×ýÏW7÷½8C‘)á(Ëç«?þ"‹5Hþó‰xšÈżˆ¦)[”WBòH
-Î}Oqõáê_=ÃÁ¨™:§!“H2¡!'°ßY=‘ˆHØw ©XôÄ蜞<ê)\á>_þ¯JJ"ÆAÝĬêj“?†›¼ÐSPE#Â_ W>’¯§š —U*"DÆc ?6ډȴ )’x^Ä _•F*‘ÌÑfÍ2ä© Ú­Æ†ÀÉ»}ÖæueG±§Ð¶WM«³µ¥®7“ék½Éº¢}aC3ª"!S/åKÝ®^VY©×/B®X”$`!¥Q*AD¿™™]0¥hw–Xj¢DpF\/CÁe «¦Û/ihûÞn³["°½E­óêÑ:ª£Ýc§ß=N‚6¯:ݸ‰nµ§zÿÉd›Vï'\½ÿâ;· q³]¿·[먫mV=jT.Oƒ¼ml¹YñeÛ ¬ÚzÿÍuuÚ6Pœá3³]Ý4ùƒ·†ñ¡p¥„(§H`î«\ÆE3´”õΙ
-êžÖ
- qlDÐiÕøbÆ|C–
-³è2¤:.=•A—õºP Þ×ú¡{ ýEÇèÂÀq/É×SÍ8F—8R*•c ?h𖺓ÄÆ:Óe]ý½qo(žmZCq¬íøL©
-@@á1`SdG'I!F+
-ùæYÁzªÉFË {Me: rt{Œ‘‚&V
-”`Ó&ºC_×dÚ6×LD*ˆ¨<{l0O&ï}”7¤n̾d¶f2GE¢ãZ-صfÒ­R3ÀEK5ÃUDEÏÆ€õ)6És¹@*Rï×Íé"ŸÀád
-)†\ 0œzÈDì!¡«Ì„¸4â2ö ÊUûõ9‰*‚ØýVû¸[´‡Óìjïm=qáÛ¯§¶É!ÁÐ!/c©žQ±(5꟫¿Âža8àxlÅ,²„ Ö¯‹Ûzwón*ýI•ü8ùz†çåãàÖ@0–ïÍÍ«o‡>¢8ß°qºYíó½îáóçÀ˜P4oPÿÈ›ÕKpÑhûÏgd3§À, r ìTgÀÎS°«.¦™[íºæíÕ@~V²žjF´ÚA"‰h¯]îÓÎALˆ©ˆ§"gn„Ÿßae„SÞⸯõ¨°UdŸ´íÉÖ_²ªµp
-¦z…g k¾+Ñë÷wCrëL²cÍN¯r,dôúÅLö‰6J¹”}B¥ Ù·à“zç)7‘ðºEì7ÚÜÇ€‘BUYæ•vÝ[רºòÁ~awƒ´(¿íÙ9dÑUk;lȇÆêpfN}àì•èXxîÀ5²´·Û“;¦¹[­«2}Æf  †Ñ‡»Â[¿ h›]ÀwñÂ%$.ɸW¸þÜ-›È8–ûÆ‚‡Ý®Oº£ˆ^hœœwÇ!Õiwì©Œ;î.ºã®Þ·ÇÞH¢DÈóry¢¹Æ™‡Ä벉`¿äM««C
-hŸ;½ÏµƒÆÚzù¦ñ –|ñ@u9
-⮃É49À$´û¯ Ð6Ï®ªôJ7M†åˆÅ7èÝ Öä‚w«žX”Ë ”Â[™ý)
-ªð>
-{'„¾cæ<vTæþ‡Óà¡sr>èÍá,¼û{änÌ›
-¼B&bí]ûäg î2<&:õ'.#Ág „ôiÒwÿøéðã.8W0ÝSwÛ³Ô”z¡ps”Ñ©è*w™°xFöÿs ÿendstream
-endobj
-2053 0 obj <<
+2563 0 obj <<
+/Length 2873
+/Filter /FlateDecode
+>>
+stream
+xÚÅZëÛ6ÿ¾…ûpZ VøÒƒ¸Ã›d/Ø¢ÙË5[\¶´2½V#K®Ùäþú›á²dËv‹äЈ)r4Îã73Ôòƒÿù"ŠÃX ½H´
+#Æ£E¾½b‹'X{sÅÍÒ-ÇT/®^üS& êXÄ‹‡õˆW²4勇ÕOÁËóðX°àþæííëë¥ZÆÁÍ»w·÷¯ï~„çˆ0¼½¹ÿáæ;š{w­Epóæöýõ/ß^Ý> òŒeæL¢0¿]ýô [¬@ôo¯X(u-žá…\k±Ø^©H†‘’ÒÏ”Wï¯þ=0­ÚWçt ¢4Œ„ŠA ƒ4ç5ÅÄs J$è…ƒ^S‚ÏiÊS¡¦–O‡#KÇ‹1³£-=ÑÌ–b´eÂÂH²ƒ-¿ï+Òu·14hMóÑ44.×usÍÓÀ<ÙŸº¯V4Ÿù#È}V–4(맧¢zrìj<狪±FhŽÅQgBÁÚneš†è&ÇQ˜îÉÂ#×púOX
+™ª FQ1’§²FÚ’P ž’«0Ž•vB­ËìÈ’:
+E qV.O4#×Xœ±P(­¦‚=\kô ˜L*ÔöW[³­›Ï4×·Ù“¡áÊ<öÎ"Hõ3c2{j1É»ºm‹ÇÒ‘º5zÈÈþNrl¿X‡—±Óíul>¡Ã4M¼¦¾™a‡\ lº&ËO²I/—Æäu³ºèLù´Åg…‘PL¹
+2lâ"+¶YQ•ŸÝúÚ­U€Û¦íè‰
+Ô$xywÿšÞÑ4±2×’¯E˜²†Ìá¶qf¼‘à3½Dàœ@¿­¯yäÞ[Íå ‹N t¨›¬z²u<Ø>~3úY÷]ß7¦4ÔØÀõÈW„—Huº{×9˜ω5”ùËýMÄ—¹ÿÒw\ !`}¡DT
+’C zÁ*‹`ï/—ˆÛìÓ²­óG`Ç@ÆÂxã#ñªù&.
+T‘š
+xS–õóL…ŠIö­è© XªTù“øŽª÷mW¿›Âã$­A'$åÐ^NµpˆÔZÿx¸ý
+:r Y"êxïðÊ)|q « ø(µÈŠ¸ËK3ø á ù‹ŒßÛï-VÞ c¼9…˜‹ó$qˆÉ
+†²­q„¡’u4猋y×ã‘p à\li[šË€Ïdk˜¯7g%7–ý”Eו³AdÍjPÎgäjÛM«€¬ò#Cƒ‰*¨ÂÇ
+³ýp7ÚŠÝÖÉQoDÞ…p<v!
+½¥€T”b*šºõ/[L p……V×úŠ«£ž;°>…Sý¥*kœS¾0OýÙe–PP¥ìÂÇ¡Ê–YÝL™¥Cu¯³äªhLÞa/wXdq åi<b8[dyªé¦YMA’‡ä=ïݜԶ ñ|=„7ŸRè9y60•zÊlMÞ|éªÆ´Hß“„ÃOäõvK<”t9„ÑcßyêªìEäÁcï}4þ£=û änœ+¼LfjŠ=â3ß13'Ë7®ã0âè«”oÚ¨úD…ãTñ†®2á—š[žâ½¬Hÿ¿Å—”òšýâmÌùLñÆcª8M'ÅÛ¨áÕñ¨xK\ñ– œ¹™ÂQ§üÚW¹- ž‹nC#ô¦™O¢iB ÿ¥`ÙÏ`9W î/H¨oÎ9TƒÄ<ß4–ƒ? ÀD±wg÷aŠ.§w,z  ‡"”>ÂLæWjºÄÁª6mõ׎¦Mù,wâ­ÉûQ jïÈ+wG^·î *°Ú¿aIǼÓü3¦WúÍ(‰…Œ%þn‰Îú3‹˜€øŒÂ
+hMfdÿþ½¿Ïendstream
+endobj
+2562 0 obj <<
/Type /Page
-/Contents 2054 0 R
-/Resources 2052 0 R
+/Contents 2563 0 R
+/Resources 2561 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2055 0 obj <<
-/D [2053 0 R /XYZ 85.0394 794.5015 null]
+2564 0 obj <<
+/D [2562 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2052 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F62 1062 0 R /F63 1065 0 R >>
-/XObject << /Im2 1051 0 R /Im3 1185 0 R >>
+2561 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F53 1303 0 R /F62 1352 0 R /F63 1355 0 R >>
+/XObject << /Im2 1341 0 R /Im3 1500 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2059 0 obj <<
-/Length 2424
+2567 0 obj <<
+/Length 2383
/Filter /FlateDecode
>>
stream
-xÚµYÝsÛ6÷_¡·R3Šâkúä\œœ;‰“Kœ»›iû@KpÌF"]‘²ãÿ¾»XP"%J¹^’ñŒ‰Åb±ØÝßb%&þÄDf¼ôës¦¹Ð“ùêŒO>ÂÜË3‘hfѬOõìúì§ÊN<óFšÉõm—cÜ91¹^üš=cžMÏ®Î__<ŸÎdž+“¿}{qõüò¿Ð׈€„óìõùÕ‡óW4övêevþòâýô÷ë_Î.®·âôE\¡,žýú;Ÿ,@ò_Î8SÞéÉ#t8ÞËÉê,׊é\©ndyöþì_[†½Ù¸tL¹tÌ(c' S\‹ÿe[å¢"Üø¶|2óŠå.÷ÇyÑ:¼R³[1d5s‚iïõdf¬fVônHʉÌk-ñŠœeÒ:9±ȼ´ñŠþƒŽ”ži“ $„5ÚÂ<çÓ™‘Ù»øÿ
-þ‹ìrÛ–ÙËýr†y¸‰å–9í£®&‚¼€ËDýv<ýN+qà§Ë•š<¯áŒ“þ1ãYŸs<¦‘=CRÁew«$sÜÑ1¯ïÊLËÛ¬¾o˺¶ɚ»z³\ÐøM ï¦ i¤LTóºúcSÍ»e6{,Û;jµwôŠÛ‰ eΤ‡6)p¶!š¡˜9(A䉄„úq:S\dE’t~·®ë¶¬>âr°=å™äpþí•Â–•Ý¯ëyh꬧3¡³MUáÒ8Rt3À[2[Ô¡©~hi8TwE5ÔiÂ|CÊö‰†ðÜø]ÕMZÑ<5mX5?COñN hÔ$yÿã˜S xSgœ[™@gýk.áŸQx¾Î¹Hôñ6­Îá7Îe¯ ºÅrYã®qÚ zpx«ì¤Ûƒ©ƒèÄå2| iq[ÓdhæÅ=pfQ
-«.+Úå’í»Fnàw“¾£~ï+pjã!Îvñëë"˜sÎúì„´~À@ÌÑÀÅé3J1‚
-[ª¾?hÝ÷Áœ×*]/8áz_{^²Ü;3éïx WG4"Wߘ¼e¹õ{r½í¦Œ¾/ñîIFÕ[•KfûžŒ{¬¥aNø.x·-PE–ózu¿ ÑŸcÿ~Ì-mY߇ua ‰q@fÍf~GST6_O…ËBÑNE–ø€/ÖóOÚDÔÞ--[–à¥Uâ^‘;ÍòN>0à(
-ïÒLkkw¶ßkŒý±ñi*ym]gUXþ0;J4>‹›rIxýU˜à”Í
-»6ÆY^¬ë{jA§F ¨d· ®t€0aΑDœÏópßRŸ$4>ÛÉ€£õ& ¦¡ò”nÊjq
-’rÐÉÃã1€sAŸ¡l k:Ë1iµ FÚnU=£ ‡ÑF›¡§Œa½M½Y#jçÊ‚«¯J
-P4/ª.àè³Ë«çÔòôYÎOÕÃ…ÍXq…¢ˆuÙ*UXb'±à»«ùÄ%Qb’AuŠ¢úØ Æ"—u] ãvÓnÖ[&ËP4’ÊcHÝ7¨¯2Ñï€Ó=«çÌA0ìÊžÕw‘RB`•NP2óþòåÕù«÷#Ánù–Þ—¨? éx SxÞØ>ç1ì+©ÜǪÀ$ '·…G™Œ
-oÒÊT”©%c²¥ –´†bÌ`âÛ„5ÀÑÏIÒ>(ÆVº.K^W‹ùXÅÀ¢c"Ú‰v(ÚpÓ†bq¶Ö©ðÕr·úTÇkK•®ãŸÞÔ„,ã^ˆÓÛvD#Û¢—Œ[xîö}QGÅÏ$T¢:Ìr‹W˜Aw2µyv\U
-+š§UÕ£:¡ªŽ*©êòêA*e0p}ñîõžÃûÕ;›Ÿ–dK5"Ê@}b¶_Êr·IÀ¹¨«ÓJ‚›Ê~4§
-7øbSŽ,ã[.'D‚±¶®©A•ÈÏ4Û¦ÁEhæëò¦[Su£ð\Rõ‰7À°~Àô‘2•5CŸËýNÚ<ÇW'ƯTÜÀw 0CD{(]ý±ìYJ<>ÀEÏè5Ë1™§ã~"µ§ÏùbUVeÓ‚:êt­ïÂm’½êùuQmŠåˆr…q˜+šcoÔÎåH¡Ô˜Ëð­¥|õ¯“»__s ¯['Ç}œ†yüÁ) …‚ )#‡¤ÛÈÙÿŸäendstream
-endobj
-2058 0 obj <<
+xÚµY[sÛ¸~÷¯à[©™ˆÁý2}r'õN⤉Òvfwh²Ù•H­HÚοï9
+e'¿'4#ÂZ¨Fcoí³üÄëë KÞÖ`R2¶ªç<³öf)6Ê=*ÁBCL¢Ñ ŒË t5›s¡Òe5£$íž^;-*3\™hg•o\©Æ¸Ì¤Ô:RukëöÞ…Áo3FR·ÃœN+·þÓ R;Ò,óm~[®Ëö{x߸å}^•Í_uÚÖaºØÕÛ0Ê×ë0ØÕu‹ÊÀdB¢Gb(A-ˆ£2-ʵ»ó)“º'éÓÒmÛð4T6}Ögë`$ÄzäE®3Æ‹VÞ–Uñ ‘„Á?:á>¡´ÏopÎÃc_·"¨°­aV4ª–WE4®íWÕó`0‹µjßâ¥kÀLUb皺Û-¾ét]nʶ™@¨†Úô[µB?ôòº*oÝú;dI_Á”–à—² ‹7.¯"×ö>oû‘›ðS°+ˆQÑæy7áÜ „ÑHRoÛ²®Ϻ¼uLCÖQ¢{ëB±|Ä,­ƒã~Ãp2›>Þ»j"k¥Êµâå¬å†õ¹]F–A@‡›ƒ™´®ÂìA‡,c5
+“” ó ,0à™µóíÎñ`¹¥™!PhöÂêYºÏšè´)+Œ0¸2Ã'öCYwM >g‹² ªº 3°›jÌŒÇðz¼i`Ò'/,ºuá}çÚ¼¬|Ú"‡ªuœ dß
+Èâ®<»c Ñ@wä1ÙaVc“áɸ†ÿ`_àxZh“óçîöc}kŽÊÁÇ94@ ŸÆ š –m"°0‹çnD' Ã@å7Õá_,o(šŒ™Iì‰&DŽC
+»S 
+'oãJL«0òµ
+žËºjƒ€uX
+|Aܸ4¦?G]Ç­€3i6 ¯]U,',bp쀉žU;Ö³¸i]^œl`œßxf=ÝÀÆT§Ø@ò×oŸÊ „Î3ê¼ÜjBð^iàŽ€ö$¿«½ë—±%Äæäç`‡ömë¨u„¨Ì´HO; 2TùB·SqVOu}³À^ÑL,®¾|<r Æž×d šPeÏ}Ú‚Mµ¯Ë}ûgQ?Vç ê‰Æ"NM&ѱ8»±Ó›¡#÷No\U”Õ]´¾Ç¯ &â³ç͇Òëi-ü¸ŒD]U¸_a• É~X5  pAŸ
+ù/ŸnÞ]¿ÿö徸þts®rÈÁªã-K-ÔA;q7³Ç
+Ê.¡ª¿µ€ò€ªÞu¡àà Ž§8³ög;º̵uËz³]»§ðµ“…k–»ò¶_Sõ³p.\‡1ú#á}ÁÞ”YëÆ\¶ÏŠáO¡XÁâež éÁUÇCY¸¸ÊQ¦xó!ýF‡JØÏŠöe-ôP¤¶áqYlʪlZpGÃúÅ­¢îU¿‘?æU—¯'œK•AȨÆgÖƒ(A-ý™¶û‰z2\<“Dòƒ‚ñîÔ`'n]$ƒJ$zºMÞü6ůÈ
+2€S•^¯Â— ¶9‚ÉÒÛïS½ N]zîK™hÐòé¿
+É#
+àŠ8ïŸÑiÿôDÞ?ùîõ®«‚¢§¶eq¨cgÕˆŽô؇Ÿ>™`3™vÔ(ÑæeqÞO=.Bè7yaG†ýáŸÓž/:ƒcɉ”
+endstream
+endobj
+2566 0 obj <<
/Type /Page
-/Contents 2059 0 R
-/Resources 2057 0 R
+/Contents 2567 0 R
+/Resources 2565 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2060 0 obj <<
-/D [2058 0 R /XYZ 56.6929 794.5015 null]
+2568 0 obj <<
+/D [2566 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2061 0 obj <<
-/D [2058 0 R /XYZ 56.6929 243.4864 null]
+2569 0 obj <<
+/D [2566 0 R /XYZ 85.0394 388.8031 null]
>> endobj
-2062 0 obj <<
-/D [2058 0 R /XYZ 56.6929 96.2114 null]
+2570 0 obj <<
+/D [2566 0 R /XYZ 85.0394 246.2919 null]
>> endobj
-2057 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F62 1062 0 R /F41 939 0 R /F21 714 0 R /F55 1037 0 R /F53 1029 0 R /F63 1065 0 R /F39 899 0 R >>
-/XObject << /Im3 1185 0 R /Im2 1051 0 R >>
+2571 0 obj <<
+/D [2566 0 R /XYZ 85.0394 128.907 null]
+>> endobj
+2565 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R /F53 1303 0 R /F39 1151 0 R /F48 1228 0 R >>
+/XObject << /Im2 1341 0 R /Im3 1500 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2065 0 obj <<
-/Length 2296
+2574 0 obj <<
+/Length 1411
/Filter /FlateDecode
>>
stream
-xÚ­YKsܸ¾ëWÌ-£ª/‚äÞdKöjË–\•Š×Š¤4ŒfÈY>¤(•ŸºÁ!)JV*©9àÕh4úñuƒ#~bŒ«X/ÂX³€‹`‘îŽøâÖ> ¢Yy¢ÕêýõÑ»*\Ä,6Ò,®o¼"Æ£H,®³ïË“Ë˳‹Óó¿¯dÀ—ïÙñ*à|ùåäâÛÉgœ»<ŽåòäÓÙ†R+D‚[:×ëo—§'Ç¡^^Ÿÿ¸þýèìºk(ºàÊÊôçÑ÷|‘Á ~?âLÅQ°x„g"Žåbw¤Å­”ŸÙ­þÚ3¬º­sªTÄ‚H†3ºbNAÌŒ’Êé¢Lvyf¯Är@¬à\H8ÁRå&¯‹¶±Ú‘Ëv“ã=dH¦…iG·Kšû9¾.DõøœËmŽœÓúXDË<i‹ªÄ™]•ÑšeôG·Ž²Ú$‚ŽZîäP‹eKSH™æMTÂ,ÏoqžÜLŽu¸‰›'xIÅ UlHþµÇY+Oõ‹¥X¬t ¨Ô,VB°8
-–ÿ¨ººL¶8I2þ£X-ËÜIóm…Ä›ä!Ç™´kZ§èïózW4 hÑ™4’ÅÜÄ?7Z(¹7m³©º-‰q“£MÞâDþÏý¶H‹vû„ã¢D´L4i]ì[ÔˆŒfd8ÑH×  8^Ú¦Mê–¦ü=Ff ~fÅt¤Qü³ì帙¸a&ŒâÅJ(’îãùg€…iÜs°, ‹1‚£_€,"Z ©\˜êh&L{*{껼Mß¹{±´*o§ç‹P³«ŸÐS=—`¤'@D°:ácŒ/³ü6é¶dƺè]W÷AËÉiÙ‹ZR‚©
-"edqR¿.IOõ\”‘º¤ó+Àß‘,óê8ݪȞië¹êˆi‹ÿ#\ŸáÖ“Ï미Oʼn8°À $W?¯DÌ—‘ÔLXhÎŒ6Ѭ&ülVQ‚†ìôÿ—]ðv+É%Fø*Ýäé½ ›F"›ž/ÿ«*óér]fétnûˆøßd³Ì˜?&À•ç—Z úÚLÀìýùÅ)Ú*&“e»¢,š⥪qê*¿Í)m¥ä4_’²ƒð\ÂDLãSË ^ã‰F^sòíú·¯W3<Çîr^¶y]æä°ë§¦Íw >@>©ê¶èv‡c5SÚHb£/¢HãÍ¡Ër(­Ê¦ÛgYê™
-˜Œ$Âʨ÷™b¦8õ 0`¤ ±wúÖ)R\¬±3¤íÚb[´Osjâ“ z*«}S4S°0P˜)ˆn% ‹„Œç°B€à2ÐÐÒ†,Òæ곞j|sŠü¾Ê~øÞiß»Ãο±YUã!Ý=PC/ŠCpîSá÷Í.IýqŸ[uæ¿6yZçíL¹
-|0œž­?\_^Ÿ½˜)ÄÆP2Œû)¬ÃIkíß`÷¥Ÿ ÒÚ¦»Ù-öÑ.|´Cç›vè#ŠþÙåMKj³Ü¦ÙÒ³we)´}¤Pf|f‚Õ ‘×€Ððäc¶š!¹#N
-§>Ë ñ†Ä'`ÿPEJƶ.G•ï0;ã5i;œê=Bž¨“6»Á ­l«¦5–«±UϘû0;2;IV…ÞÁª0 Y1<”á>øìšS}Ï‚ÏN¸«Î}$€
-72úM&62ö¨oy'd…í mÈ ð4ÑPÕdk)Τ0jŒ@6ŒmèòªË>Ä´<\Zj®S¶8íT®ý‡X² þB{v Ô€5öGPhÙ;(tKØŠe‘Û‡)í>¥¸â.—_.N¾œa×Ñ9_‚êv$†ôbÌ€ÏúëÉ‚Úô~2SÍØnÿ‘f5÷Å@Ø>ÕV{|â*”Üû<>²½QÌÄaô&Ó+XçµÃOË» 3²ü¦»£ãªÌÚ3Ð1)ÜNÒcòN3ðªH¦#›ÛªÞѳ\Ipø—
-á†Ü’—½â$½€æM·ëɆwI–O»݌˜ì·…G
-ª\þº“ioF[Þû, 'z Oq¨)›$%lj'Š»2i;BYœs9ÝvFA‹µ›í9ô‚6éÀŠ
-L»SŒ»€2€3Pí[Ü m’ÅX´tÑ'Ø4
-kbgŸƒnÜâvÊ Ž’Ê Ç3'–¯¶½/«G⌞;÷O <fìç­™g3ïÝöþåðo‘™Š"9ÿ!ÏæmÎå…²ŠRMEïÿoy.û
+xÚÅW[oÛ6~÷¯Ð£ T/º>º‰Û%H,v€m‰¶ÕÉT&Éͼ_¿Ã›,ÅJ[l
+yÎáá¹~$‰‡áG¼0BQJS/NbzÙ~‚½-ðÞOˆ•ñß—z»žüòŽÅ^ŠÒˆFÞzÓÓ• œ$Ä[ç§o¡h*ðt9ÿ°¸ô¯oî—ó›»û«åzæ“0ŽÂéüîn±¼¼ú}æÓÃÇxúa¾|˜ßÚÝ,¥ÓùûÅjöy}=Y¬;ãúÌ”eN>~Æ^~\O0bizÏ0Áˆ¤)õö“ d( s”r²šüÖ)ìqõÒÑ€Œ(‹èHD(ñAiÒAHÂEŒ2’Õbaœšß¬n•?Ç´Gìù4BZ§Äïß]@œR<÷˜§´'`QË”ô›…ÊDF¬@_]ðÿª @O1J¾¹ŸíDöGVÉÍ'âþÈ9ûïJŠ—ìZæÙKZù\ÏH2M>ª ¹mBÃ9wÊ' £4ˆ"¹ü©ò½Z^šd¥6gù¾EÓÖ¼­jCºav—™0¤\x9%ˆF°‹‰²"ƒ¢ñ;!Ÿ%=iÙùÃú×Ûû/êåJ¶¢–¢5–¬ŽM+ö™\T²©ê¶8ìOûˆµz†â4Š»Î…ÔbèD“/Õ¡–¼|ª Ùªõj‹ÅI ,AjÜ<¦ÚóFtiÛ>Q›Q¨ÒoFv™Ò|w‡=—¾‰=Ïùci…7U½‹,v M#eõÔÍKLaÅIļ âC6†¤À¯
+±ièâmñUcPºÜ¨‰ËÃÞUoÅH½%dÄŒL‹8¼´VB²Ð ¬Š°,¤p­°-¤òdú\´–‡x
+)íendstream
endobj
-2064 0 obj <<
+2573 0 obj <<
/Type /Page
-/Contents 2065 0 R
-/Resources 2063 0 R
+/Contents 2574 0 R
+/Resources 2572 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2066 0 obj <<
-/D [2064 0 R /XYZ 85.0394 794.5015 null]
+2575 0 obj <<
+/D [2573 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2067 0 obj <<
-/D [2064 0 R /XYZ 85.0394 691.7632 null]
+2576 0 obj <<
+/D [2573 0 R /XYZ 56.6929 751.9132 null]
>> endobj
-2068 0 obj <<
-/D [2064 0 R /XYZ 85.0394 587.392 null]
+2577 0 obj <<
+/D [2573 0 R /XYZ 56.6929 674.8216 null]
>> endobj
-2069 0 obj <<
-/D [2064 0 R /XYZ 85.0394 513.3346 null]
+882 0 obj <<
+/D [2573 0 R /XYZ 56.6929 634.4081 null]
>> endobj
-690 0 obj <<
-/D [2064 0 R /XYZ 85.0394 475.0295 null]
+2578 0 obj <<
+/D [2573 0 R /XYZ 56.6929 597.1931 null]
>> endobj
-2070 0 obj <<
-/D [2064 0 R /XYZ 85.0394 438.8551 null]
+2579 0 obj <<
+/D [2573 0 R /XYZ 56.6929 564.5425 null]
>> endobj
-2071 0 obj <<
-/D [2064 0 R /XYZ 85.0394 407.0157 null]
+2580 0 obj <<
+/D [2573 0 R /XYZ 56.6929 496.4842 null]
>> endobj
-2072 0 obj <<
-/D [2064 0 R /XYZ 85.0394 341.9916 null]
+2581 0 obj <<
+/D [2573 0 R /XYZ 56.6929 434.3126 null]
>> endobj
-2073 0 obj <<
-/D [2064 0 R /XYZ 85.0394 270.8991 null]
+2582 0 obj <<
+/D [2573 0 R /XYZ 56.6929 259.4673 null]
>> endobj
-2063 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F48 953 0 R /F39 899 0 R /F53 1029 0 R >>
+2583 0 obj <<
+/D [2573 0 R /XYZ 56.6929 194.3308 null]
+>> endobj
+886 0 obj <<
+/D [2573 0 R /XYZ 56.6929 153.9173 null]
+>> endobj
+2584 0 obj <<
+/D [2573 0 R /XYZ 56.6929 116.8171 null]
+>> endobj
+2585 0 obj <<
+/D [2573 0 R /XYZ 56.6929 84.0518 null]
+>> endobj
+2572 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F39 1151 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2076 0 obj <<
-/Length 3928
+2588 0 obj <<
+/Length 3959
/Filter /FlateDecode
>>
stream
-xÚ¥ÙrÜ6ò]_¡·¥*š
-OðzÇaœF)l‚€E³ÃÇ&èo*4ÅžF:èªã‡êˆ\f™( ~8* ª¦ßÝ^(¥‚o2^nXà—O‡C{ì+A_5åñöÐ×mÃÏÅîº=ÖýÍž·í‘_»º|þ#OÕÿþýÅãVxŽó•#}¥T˜[«é/žX¢" >ÞÔå sy9 6ÕoQ¤¦" ê†_?ûZE1.~iÊŠ'[8Α‡žLÁWðù‘Ë2:÷LGq8ìêòB½ãÉõnÇM/ãÑ¢é™úÖ³¸ÖüŽY†|¾å•®ÚUeÏcæ~†»ÁNz¡=k”?Ϙÿ~¬ˆÀëf<¦÷¼ò´jä­¬6}]ÂQšk¡¯ †gŽg¬*±NƒgÀŒÉÁØFë¦ë `4°Ç
-ïøY¸Ýv¡rÆÑ@ߘsScu˜©4^"Ñe6ÌL<Kwò1-øRµ£å e2°Ý¥/‡+œ9H
-åL Ü™
-N¨†ÁHÈÖ[^¥8Ï(;òFÙ}š–e¡ÖÚ<L‹|Ý4|Ëk¾!¸ǵֿ¨K)^Úm/a,…Ü-2z*|N4!Ôiê(ŠDàTìu‹rû•KÒ㥜‹A©¯Ê)!5“"q¿yò
-)L@±á¯î0;V÷)<ë0LHÔ#Ü!!$ÍŽZz˳CÊŽÓm˳;q¯~žÑ„½¹ S¨L§Üe¯'¦ɉôÄDyºæ¢acäÉ«ä5iéiçr"§u&2÷™$©܇e~ÃÌ‚n³/ÞWÝ‚l&¹1_%[c’‘l'üðƒŠ½©JnÔ°£²I˜gY:ûWÞS±¶3~%ÍÜBÇq 椫h)žpÑw­¤?Xñ;M‚ñL“F.n_lª©¨bŠÎ\ò³êï‰)Q2Ï3@X ¡´¹qê ƒ}ñ©ÞŸö2[ïeº7ߟÌ &JÕƒ(y´®¶­Wrx®”klP¬©£.¡ãÊQ1TÂ6 8 YÀñÜÉÓÚfÓI«å?ÒOq±¦™JP‚Ÿ•è ¿j Âô 
-wjd{oŠ~7gŠ°(â‚¥uå&Óóˆ|××<ÄA•ù&Ð륚 j1¨£\φêúMµlB—ÏYmõ(ùëx¢ù–ëiºÔ‚gV -»4_ÉøSæ¡ÕNá
-¯ã>Ôt³˜«ˆ²‘þÀ+¦` ´e )RÉ/dÈë¶ð}zM7ˆ*8ˆ“›wuÆžÌ/‰seò<Lc«f^y"Kãê:ãó$“1É0SðO ÕlQödYÆñ€—ˆOfTÄ!xK5 ׸ƒóˆ å'•\&óÕOJ÷wØüç ¶*=¯Ã¥zP|ṅ,Ä=‚üNK¶“‚r$>#1l–Ò˜<̬ï¢AºLYÇ[q¥€ûÌ kuÃ…2zzÉæqz-TJúÆÑÂE†!úÄ’çxOª0ßÿV*ŸõïöÀ ú°9÷Ñ……Ü"û°cA⊯=ùêÍ¿óì—×/ã-×ÕBþ¯i nÙ¦_‘
-;åNß±ñ{Oï „”ç±Û/^þö |ƒLÜ®”ÝDÁS¾ZFcu½‡î >‘Pð
-ˆ¤70ZO°ý
-;² \HËÝaq µVî>Î/.+®Œ¸± ¨Û¢^n>…Ú»(éP4™4ž}Ç2ÄeRUøý\]HV×Ê‘÷¾œÂ——¨LܢÏÕ]<Éëq e'Y.áìvجY,vSí>w¡ƒšIqÃ
-endobj
-2075 0 obj <<
+xÚ¥ÙrÛFò]_¡·@Æ8&oŠå$ÞÄŽ×R*»ëø$ e`P
+“Í¿o÷t. eUm©J˜³§§ïî¡8àOœgq)£ÏS£Ã8ñùj{ßÁÜ÷g‚×,Ü¢ÅxÕ·7g/¿Sé¹ M"“ó›Û¬,Œ²LœßƒË÷ï_¿»z󯋅Œ£àÛðbGQðöòÝ/—?ÑØû #ƒËï__CWj•À"¡p]ï®yuy‘êàæõŧ›œ½¾éÑ£."…8ý~öñSt^À þq…Êdñùt¢P#Ï·g:Va¬•r#›³ë³ö
+"5‡ºT ð¾*Û“P³9Ô_„ºÏë¢Ù彨“(–s ÷Ls¥Sâ,ÓœÌÅGäŠÄ'‚8Uª…Ô¡‰’v' Á´åêõõ«oÞß¼ùù]¿gÀ"‚MÀ\·›È:­”c†Å¡:a|AI ’Á¡- leA×ÐH{Xn«ŽÆ®P|«M\½»¦Ñ_Xpp!² üýP¶]K³9C.ÊߢHÖ> ªš¦?|÷Š¤PÉô䜺HF¥Üß—{4! 2ßa"Ç7k{‘ùfÓ<p›k›ƒm¬Êñ誱߂—Úóá»´‹â /
+‹5 ÁÂѾmsï&níH³åƒéógSó9U·F ·m^
+j× c¿dÄ‘á%O.ôÊ1|U'é”ïo­Ìù@ëiÏaž‚p¨jÅÌF‘£VOžA@x;œê$ŸWç]>ƒ%Ïlš¶ó2ëÆJml|JÖŽ• ™«Ð¸
+Æ•Õ#‰zåƒ9KúžS>°W}ÌbAÈ’%úY,N¤qnfß36ÖÀwÉ}k´,ò<Тm"ûGb¨)ÛPQY£4ø0¨˜–Ã¥¥ :uGÖäø]óøŠ÷ló¶C ÃöØZðdõpŠ¾"¨
+
+¹Ù°g
+í¸LÚœSAìÚDD³ `C
+ˆÜðr&ø¹¶I 6™höh2¼Q0õ8ß!³wxAxä;ð€« Pk¼zKƒÕfC+ë²,|rjƒ³Ì
+žk“{»‹°Ö `#oÛfE\®Î…fÊCœì[bY(H,Û¸Œ]rÂÀoÞóÊ¢`“ßÒ
+^&šPƒ•w¨ýå¡Ód¨Øy2)ÆIê4Ê=°<ÅdÄj1NüŒíÌ$À´ÅÁQ€ ób¸9‚we튰‚ë‹l aàQ4³·ìÏB¦a¬Ò™{3¤+¶ƒé
+6úBƒ1“BƒÄT·ùaÓÑ<eزA Dz]Ä™Ërp†¨ÕRgÏ ³=tTüö8­òÕœÓ}éÍç~¥ ‡ËR!ÖÐ4âIÁСJú¼OŽû¢™´Ú÷bdôå4cœ.vãòÚ¨r½¾Ç40IŸœÛ7A–“—½O¾G©P‰4žþFoŠ\ äA Tš4Ó£wŸIA{>ÖiæB.-Ud´RW„ÆÈYËÔØÀç1Æà‚’Ø©Òøõs‚›}lŽ&¨Á‰„Ïk>}™·e¢é`H^«D81V8œ)’fÁ/-ãKP'„HF@ü4ý‚%éðà„(•=ÆEÕ® mÏï8X¨8 ÓLÅS¢.KWvÏ\M6“Ó›dbb:pÞ‚ãŒ
+щ˜£Þÿúú1îÿ´qãendstream
+endobj
+2587 0 obj <<
/Type /Page
-/Contents 2076 0 R
-/Resources 2074 0 R
+/Contents 2588 0 R
+/Resources 2586 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2549 0 R
>> endobj
-2077 0 obj <<
-/D [2075 0 R /XYZ 56.6929 794.5015 null]
+2589 0 obj <<
+/D [2587 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2078 0 obj <<
-/D [2075 0 R /XYZ 56.6929 258.0612 null]
+2590 0 obj <<
+/D [2587 0 R /XYZ 85.0394 749.2922 null]
>> endobj
-2074 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R >>
+2591 0 obj <<
+/D [2587 0 R /XYZ 85.0394 666.7399 null]
+>> endobj
+2586 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2081 0 obj <<
-/Length 3216
+2594 0 obj <<
+/Length 3279
/Filter /FlateDecode
>>
stream
-xÚ½]oÜ6òÝ¿Âo]Y–Ÿùè"iâšËÅ.z@šÙ+ÛBvWîJ¶ãþú›á׊ZJë4‡Â€E gÉá|ÏPì”Â;ÕŠPaäii$Q”©ÓëÍ =½…¹·'Ìã,ÒrˆõÓåÉ?‹òÔSðâôòf°–&Tkvz¹ú´8ÿðáÍû×ïþ{¶äŠ.~"gKEéâ×ó÷¿ÿËÁ>œ¾8ûæ^¹ 1Šx]¼¿øíÃëó³R..ßœ}¾üåäÍe$kH:£iúóäÓgzº‚ürB‰0Z>Á %Ì~º9‘J%…õÉÅÉ₃YûÓ+”ÐDi^fxÁù€ŒÂX§¥2¤\X^üÕnk8˜”Åâò®†ãšbñëûó_ßàP-þ ”×땃·7ØßU½ƒà¯èôâßç¸;czQ_·ö¹r“OÍzíf›U½í››ç°”ßsSu}½sÀ®Þ=ºq±¸iw¹M rþÇŸ•œž.#F)nOvßîz‡•pDJÈˆÓ í*û#ÉÅöase‰
-ͽօÓj§dDKÁ<j,ÿû]½uY}ŠûXP×K§\B€r+ôÄCåÚ€^ÂBLZÙ &÷ö4í#Ø?è–£"'’»ÜvžjaeLɺÜ aå6r¿ìØ3 ‡ÕÖÍ##,c».L¬ÜÀ)3â\ßµ]½uЫg³ ·[=ƒ«Úä<Ð’ñ’(S^°#ŽÈïqm‰£–¸¦oÚ-(dzƒ\ÕãF}랛ꋟKEP¹¸n7~îÆñ}ã×whç×îIÄ(PëF´m÷Sâ-ÇMç¤ï‘ˆ~Ƈ8ι±h—]×Ün½çð®=ç
-Q% €Ízˆ!Ö´‹ˆX!ºíq|xâ”"“rž†ˆ•!"ñ -Q:¥â"ò ½ˆ¯ÞU
-!çÍgˆ5m>Ë:¯u¢ªN*¥˜§"beÈ80 ¥Š”k@6±œÌ[,}¨°Œú|‰æ– AŒ ¶àNx¨-úJ­’dòåIÔ€oM—¥¡ %Ó/ÿî}†‚` Á§d/ $«\‘ý
-dÈYês`Õëu]í&NåS/àÂA^"™Ö
-JÇ|À
-ÙDR­m”ñÀÁ…¬mäç’õÖMH¯›Ê‘"Yb% B{¬¤—Yr%8x
-&z¸ ðE*„îå—¿ï-%è-]ûfÚJ†XÓV±pÇÛôæöÀ&XA(‡‚rv㈕Ù99$‡Ü€J–ný[çeðöâb‰Jí%Öz‘Æ <ÊÐÙÈÊGËË»¦K‹y¨7p|¶ÐK–rî­$#k£@JE¬ËÛ㲞Ð-Ôªi
-JÀbŽø¹!ÖŒ–¥f½š¢ÀTN6»wÄÊlžF:
-àÙ“Í ¥ô¼jñû™Rö­Ú§ÎÍpJ©›#îË<
-…¿Œµ!øˆÔaMê$~Z„}ÙNª…ùµ2*#ŽökZ-"R³««µ¯k?¹ñX;$d8…)Žµ†91’lcxW<B/“kR)Á’2Ý/ a”«y>E¬ÌÆiÿË¢:ÝØõ•„Ø·fÄP-ÝD.¬2ΉÆÞ6p|t
- ¼ÂØùiÍdŸz&ÚÈãPõ`¿uY/NM·Šè>+K~ÄŽX3v°lÒµ«wõŸþŒ_Wí¦j¼Ÿqãe®¶…˜ ²¶Î’±2t¥|Æsð› aÑáú¦ÀÙ’™Õâ…O?Ý>ØÁu=„îoc†á
-ü˜ ¯r$’BÈHFh¶½j¬'3i!B•â<<i™U%JYþ­ö_»iú>¶þÞ½wO4»fÛ×»mÝ£î§AÖØÌ<Î%áZ¹bÍDÀ:tŠßmŒ‚Hg‰XjÇA¡žOÉu…ˆ¤4^yíÍCÒ`8_ цֱ‡î­ŠsÖ"ppÄ"$pݨY„|EŒZùÿ˜IhHEeè9m:/~ë+æ,c‘Q/2â0ƒ¢ÐG dˆ5m ë{ ÄáU}EÈáÜ@Y&ÔÊ#V†ô„єɊí—ùþ$T:Ì߆äåK¡x@Ü!Ëröë;á×'½¡ñ ÀÝÃÕÑ8»ÆÝÄPzk¹iwŸ7È%&Ý]µs%"^vâÃÞko²_ãèKõ½æì¦úص7DëØ_=˜BemïÇiü\áˆ-‚ÝêØàˆ]i<=ûª±-hd‚ý
-endobj
-2080 0 obj <<
+xÚ¥Z_sÛ6÷§ÐÛÉ35C
+ÏÓ©êŠýd‘Lœó¼€c¿ ÑfNŸBé+rÉèE2C Ö
+Uk —<åS½®Ð”ó;KuþŸL”ïV)À4*…è5??VÏ«Žê­’8¡:˃ÜÑ”„LêżdÎeL”%
+ã–ìp¾Ñ&nW[ÝÄË»ÂÖǬ]ÓP¦CεÛÖS­Qð
+ªq-µl ¦úaó·;ìw]oó.hÝéD˾§‚Õ䲪q†Æ.[‘X°ð5!Ñ“Ø’^£Jwópù­îk»Txë§jý±'.T>mØÚI
+Š„S$èqOU_Ñt¸"¤{¿RYs­Ok³B…+øíNûñóÄ *A±kN ;M˜º¦zÙº-°þëøí[X‚HN­vü¥¦û|ß1­æO‹UO™æ‚J f¸„QNJÇNH ÏŒïÍ¡çeVÌÑTﵡ‰ê…c3Âþµ/ÿk£ŽjÃrÃÓb5<ûÃz]YÌJ”Y¾³Ÿ2 —70ZMVû/ÜËl͸Ã ž0¤»\89ïh8hcæ„›¢ÞÎÖ wpóƒ°UÙxiRY6=5NÂò=Ù§­«ÂókuÍU]Ç{z6þ:…ÏIÍ+Y|Až¯Õé:éd×òÁÈNsÃéÁ.²ÝvŸû9W.J©C=À½É<î
+×áSX­v4C‰œ)m/Â÷´“PÅéD$>
+·ãNÑ$H*ÉðÜ˹.¼Hò(ÁÞþ·[µ:R2v’Rú"!,LÃèàò¾ ,#)MÑ^Ø@pªôÌÈÐÇÈ­s½s)Õ4®t%®éfÒåëûÛ×wtA°@k/@·U‹Ñîîüúo=Q~½%âziÒåét *„Ä°yvKñžî\Hô
+êp
+˜&å‰#„*Xþ7úmFÖ«ü>–d±òÆ5ÁÅõñs ¤"! ê›@šË(æ»`TdÙEaFQ¡‰S‹–æQTÿõn¢¤¹4ò¬Ÿà–ÛuõL4¾:&Ü;œÃ!ÛÑ&†Ûy8Ë7+\l…³ pŽg¢¬*zR»
+G”R•ýñF§iwMU3Ì…«]Ÿ>Ú×ôŽ"b.H$µÝ8ÅŽs×®d´‡8Óï;A’±ëêÛÓ¶îêë­/%Ï„Èt”ƒo^†‰ë<Lx.— i{9$Ÿ@ƒÄÖ]~YÇ4# `$Vî&]ÒÔg=¸XP¤zôl|KWdîÂ˹¶MýpÆå`±‡A % <ñ?„Š8À,Êeœp¡9¥6ͬm"øÀKχƒNüïµ¾#ŒÉ5Nši\ÙÜwÕo! Ø\HºÜ<4Ê—ì °A1€0»^Ê
+ª•†¯sÆݭ̤ê²ö*äéèé±Æ«‚ÚϹ¡>_¸Ã¯cS*OSR$”üø?!\ÿ~6tdi°ÀåÈ™.3YÔÚ.£ÚáÙÈ‘™¹(‚g:•á$rb#'BØÀÙ<_ªY¬pü«ð+.PfU(¼
+endobj
+2593 0 obj <<
/Type /Page
-/Contents 2081 0 R
-/Resources 2079 0 R
+/Contents 2594 0 R
+/Resources 2592 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2597 0 R
>> endobj
-2082 0 obj <<
-/D [2080 0 R /XYZ 85.0394 794.5015 null]
+2595 0 obj <<
+/D [2593 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2079 0 obj <<
-/Font << /F37 802 0 R /F22 737 0 R /F53 1029 0 R /F21 714 0 R /F41 939 0 R >>
+2596 0 obj <<
+/D [2593 0 R /XYZ 56.6929 507.1706 null]
+>> endobj
+2592 0 obj <<
+/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2085 0 obj <<
-/Length 2191
+2600 0 obj <<
+/Length 2967
/Filter /FlateDecode
>>
stream
-xÚíY_oã8ï§p/ ¶ÑXÿlùå€ì43×ݶÛf=Ì΃+‰1‰Ý‰vzŸþ(QreÇMwïîñP –(š¤ÈŸHÊ¡£þèHÆ$NY:JRAdDåh¹;‹FkXûxFÏÔ3MC®gï>ðd”’4fñh±
-d))EG‹üóøGB#2Ñøæî·Û‹Ù$ãÅ|2eLðx<»½ß\\þs3pFÑøzvóÛì
-i·“”gçw“/‹ŸÎæ‹Ö¬ÐtqcÓ·³Ï_¢Q;øé,"<Urô“ˆÐ4e£Ý™œHÁ¹§lÏîÎ~m«öÕ!W©ˆd"M¹
-ô;Œ’„R`JdJbÎxë0F‡湌ÃyÖhÜ{–ç8È«]V”Ó2Û¹•¦Ùâàór›ÕõG}~pë ##„ô}ÆbE¸€Ð„†™ßr ØÏûY g©èn`–çõdÊ!Ì>Jýdr¼ŸP5Öuu°ƒ¥Æe¤.+ûÌ‘öT45ÇV?èeñG1›]½û yh
-‰P\ÀŒ Æ=–©c/MHÊ™r<çb¦‚Å„šðRJR)™å´.Çá
-yç´'®žð\6ƒéûÃúÈ€ŽD¤§µz¦­GDDȘuµ.&i4>ìKÜåžÖ–5€…à åœ$1Ôï)U„&˜k®
-ûšž€“ÁîSŠua)PÏv[»Å`?[ÈÜvÁæpKtɼJ**”¸
-SÖ®Ë8V-L[“ø¹¬ÛUÜkTp¨µ£Ø# ”¢¬õ¾Az¹Þêƽr\÷ G·î»=­ì¬Ú9 >÷R•!˜ìf_ç²´üÐ`ü«*mÆQñø¦j
-LáÄd9RQ>\•)J$él¹q#”‹WvjœeNÎ>+¶m%òé LzÂQ]õ•gȽÆ-ìÖ¢î–l-sxËÚ4ÛYÝæ̬öçÁw}ÏÐ!Kœ„¤/…ºî¥Û6§ì ’AN±ã—6ûè©«Ê ·;œ Ú/‡þšÅx
-ÔnŸ§v)Äæ‹‘†¶ñÐv©™ú[Í3 w;ü#’‘ âŽk^•þO¡ù°×{ýͱÇÛ˜›˯æ¼tÜøWa9$£Ë÷7³ë¹ƒ]µÓG¡ûÏQÊ‚"óJ÷ܦ¼h
-[ M"ÓM¿…w™Ã¤?Ÿ9Ìråü^~õo)¹Ín¦A'¥{q €´×É°€—Ì:«É܉œãÒ™ô¾-ãK›ÓŽð†³ÑÜKâ6…ª áª~ÂUãŒÚŠ•N¬‚7ñ¤¨6ãÂ>*íi•{U/êÆ)ËÐ Ã
-Î`ãž5>ýYõݸ2Ýv}pÎE‚‹ Œž6ÚÄYQ·AÕBðH¬½ ©Vå2+Ñv3®J¸Wñbé¥bÓ¥¼Û@<4\ëiÝ@µ3u`Oû øÖ”cš*[­išŒ?}x7fD´Ú3$ ? aw¨G«õ'ÒLš±¯´BeCmiý¼dÙ,fµX9{B¡uO*N­ÛŽM¾²' 53)o
-™¾á¬€ë„·<—±ögŒ"!#I“$vƒ•«®¡$AREýG,»…c!ø¥Ë[¿%…ü`œùÀ A‰œþYsö€^,’=9€KKù–AÞbòU?}TàºÉ$=Ž–ë8Ýo”Å¢û¬ÖÓXøo$Ë*oï±þÊðëÙûéõ…Ä™±oxH]ê0×`¸²†vi
-Œk]Ú>ªm›±Æb"é[ß°B®Xó\ÿÇÚ)¬=ì‹G×—vðƉ¸§CÒrǤ÷í9!U7(-ÞhâÍ̪>_ðffofÐÁ›!Ü»…xë× È¯ጧÝ/&wó9Bwvu÷ËÛŸML¤<>Çw`Æ£(y™1ÀF0SB¾ÌLk¬A1 f)§ç/y:o·rþ×Ε; °Aó›Ó@£Ö%ÿõO[/?á ¨MJ±×~Ðo§0vF/,ŽSBD‡{ñíÿT#æôendstream
-endobj
-2084 0 obj <<
+xÚÅZ[oÛ8~ϯÈÛ:@ÍáU¢3h§è St›3@'Š­$Bm)•ä¤Ù_¿çðfI¦ä´ì"@DQÇäá¹~‡$;¥ðÇNµ"Tdò4Í$Q”©ÓÕö„žÞ··'ÌÑ,=ѲOõëåÉ/¿‰ô4#Y“ÓË›ÞXšP­ÙéåúËâüãÇ7^¿ûëlÉ]üJΖŠÒÅç>Ÿ¿·}Ï2¾8ûæ^¹ 1t ]|¸øüñõùY*—oή.?ysØê³Î¨@ž¾|¹¢§kXÁï'”ˆL«ÓGx¡„e?ÝžH%ˆ’BøžÍÉÅɿÀ½¯æ§1QH¥‰â29]
+ItcDF U €eª2’.‚À8‹ ÌS¡À¾OV.U¾-l«-VMÑ×ÏTJ( ?Ç'ž( ïqÂNÓ#V.î‹Uù7¥¼hMÝ]ÞÙV¾ÙØÆî~wþ{Þœ1½(qmŸ×îýòâÝÛe[ÞVÅÚý´-«[?pËûå7%z\q¥ש†¥8É8™À/àe/–ñj(#œSæ~wŸ— šARP!ÍÀ<Á`–Œ‘L)nˆ.= ±Œ°$Íö Äfƒá2-ͪÞnójmW?MS®xà5¯œjƒŽÛ aÿ‹Ê>Q ¦1oSV®û¡Ì-+²Ï.× ,˜y^–Qv%‘`ÅŽ¤n"À\t¢¤åkl':KB|Ó9@ÊR" 5ï%=ª/ñT8ãmÛv`K>ÁB9×óªÈ̃ErF(•l8õçÖéàíÅÅÚi¬v* éÐúÈbš`àw¥³ÿ,¾íʇ|STÝh(´Ž›'ô’ˆ®3ZJ¯¥Û㺞°-´ªI &:%\=¯Á>Õ´•áf³žR¢ ðSXÙìÜ*2ù@B‘LêáäV‡R:YHµøóL©EY­ëÇÖ~á”Rû œ¸-ð »¾±=åã0µíuÊïÜS>Õ^ù@`Ÿj¨üþP¨ü¥ Yì•òaÀš´ E”†ˆïÌ¢ž4‹ìEf!A§*ÉŽ˜EjÆ,<rÓùfkùøbÛcë‚È$K,KüœdZëxÚ_†ðËdQ
+°mtbÆs?è‡ìˆ£‹ J´ÔWN^³)ãUdœ¥PÈp#bPÔ‘ñ ÷ŠTûZëÉ,ȈP©ø$RZdT ‰Rú:ÏŸ÷GŸÀêmÙt~eßÞ}°Ot»²êŠ¦*:´ýaÒƒñwÛ™„I›
+ Í:DŸjÚ!ÕaP|±C0
+*e6PE¸;…z~È®-D$õi­ï’z÷ÀïyŸ¬ïûÞ½wàOÑ#ð›ñlñ RÏÔ³<B>Ã#ØÿÉ%4@Qé÷œ¶»Ö©ßÄŠ9Á\”©g9Hò¿p¨rOTv}ªñT/uK—w9!Œó Ê2¡Žp¨"¬M‘,ñ~ߟ„J‡e>¶!{ñE(î‰nŒ£ÔXuÈ0ûê[Pí£0° ;î­gçlK³ËÚ'éŒ cÏMÝln€%&í]ÞØ1QèÏ"‘¦Ê¯«ÈªtŠ¥z©;‚¸i0Ø)³æ
+v,BE}œ;£iú<_¿Õaƒ#ìJãêaÙ×¥Ù‚F!àf öšžÜvX}@Ãú?}jÁ‰%mä´Â–|>ÉÚ˜u–Y`
+Ú}éE
+ ç-?fáöHËä*ɇ®EB1;åê áLˆcȈ%GSŸHöA ÔGÖòë‡rm‘‹€ [a0Ä&Úðö̊̌ʥ9‘„Ïײmýà6ߥ æ“GGö-Ä*cé
+Ê•¡“ƒSP.£RÿT±SÕµ»ûûMÙ;.ŠE¯ŒNiHÒÝ&&~¨ùPüÈømU»]ÁW~7a=„ˆNÊóÖ~É$ÃÁ=­ërSvOg "øt\a7p¯j>®ô¨f⊧Ç•|½ž*(˜Ÿ„”I&Õ<û*ÂÿR&©ÒÃœ¯ÑtEj!<ªâ*bõøy\iaŸÝVÄ–Ýä†Æ‘Z‹,ÓbÞnXJ2ës6Ø?]iMÄ“蜴9ž2’¦É‘¿O5msÊÂèúñइ"ÖD3;k ŠL;<V—Dà­’Á¼¯Ëö~“?¡w¦‰ÃÐXíkæè:¶EÛæ·ºµxÑ7Ø`
+_í•ÔÖƒ&j ó# ±¿ç/ÃS ì(«U±Õ&%Œ>£CËMîËb
+–†]
+¡ÞÞÞoì-5ËPc?˜ˆn:]h?8òç}.¬Z;§–x0 ëU½Û¬íöúdzx×c/Æq@¡mÑt¶Ï
+¡F‚Xñ'"ðH÷ûJfƒ™N¡$䣒Љƒ¬ = Ü5À°£“Ňº+m(Wþˆ$U>Uà9ùýÎeSôB—ÝÄ2-;®}q駵o¹§É4úŒäc|p7Û ÕÖãÉsK}k—¸»7K£CìáOÆÜÝ•6bemœyÀ¹âÅÂrÕ¿­Õ?Yÿ¶+ÚQÌ ae ­hol6¾7ÀæžØÉÔeVæ½ÊIƒG¼ø¢ëþB¯L–LEW(™ˆóL¡œY"Ƭ+¡‰Òàœ‡¼ÿ•³¥endstream
+endobj
+2599 0 obj <<
/Type /Page
-/Contents 2085 0 R
-/Resources 2083 0 R
+/Contents 2600 0 R
+/Resources 2598 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2056 0 R
+/Parent 2597 0 R
>> endobj
-2086 0 obj <<
-/D [2084 0 R /XYZ 56.6929 794.5015 null]
+2601 0 obj <<
+/D [2599 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2087 0 obj <<
-/D [2084 0 R /XYZ 56.6929 553.8035 null]
+2602 0 obj <<
+/D [2599 0 R /XYZ 85.0394 107.2827 null]
>> endobj
-2088 0 obj <<
-/D [2084 0 R /XYZ 56.6929 216.683 null]
+2598 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2089 0 obj <<
-/D [2084 0 R /XYZ 56.6929 83.2768 null]
+2605 0 obj <<
+/Length 1792
+/Filter /FlateDecode
+>>
+stream
+xÚíX_oÛ6÷§0°Rõçe€›8YÖ&ËjØÐöA‘èX¨,¹¦œ4ß~G¥H²ìtkæ‘<w?ÞɆ~l(<â…N8ôC—ÊÄ0^èðæ.ÌòL*¦I“ëíbpzÁýaHBÏñ†‹eCV@h°á"ù4zK˜KÆ ‚Ž>ÜœŸ'Ž„îhz{;»9¿ú ú‚pP:ºžÞ|œ¾Ç±Ûq茦—³ùøËâ÷ÁlQ«ÓT™Q®uù6øô…Ðü÷%< Äð:”°0t†ë+8.çÕH6˜þ¬6fͧ½&`”8Üszlà²>¸>ñ|mðËxâÁîrµÛ$Q)õ†@ê„1
+á–_‘Å2:‘™¬è"KV…*‰ü­7™$q±Æ‰i[;$,J«„|ì—x.¥•PÓ0ß!Ì#Œ°#+™'zúôÂqv
+Íš6[¹•ß,û÷¤XGin{iü5Ö²eÆÃø3,ûdtqyv3½žYØk¹çºŸE):È÷`¯Æ!øÿm—ª´43b¤m›–i‘#ã½,Reõ­Þò*¹}
+5ÂXÕ²+ÛÌ
+¸½ž›0‰wt'µ34… ӱܫb9ŒžßÌç³3¤SËi,¤ Gp”>ˆº²¬xDF-Õž^EÒÊø0¿º<©×x7ûÛ
+È­7zÙvÎ&ÑÙÆ 6¬·h‚ u‰.eôgWï{jF|Ƽ¡Ë)€¨QiÒäÂ%è)Qj.½ê©,ãÓ-Ä—ì¾ì*À„C ðãÔ\û*´â.>áLxmvªÊ‡&Zê,šÈ¼L—6ã%rí²ÒæP.hfXŒ‡!qXý¨Åš\‡-Vs‹=DÛÓí.?Õš$§
+JH ä«|êªâ0G»—×¥æÚW¦e;‡ù„†Ìmk£0‰:w̵
+…FØ#)}“ÌͽÆM‰úÝÂŒîf$½êª÷-ã|¾°%Nz·¶ÝJ(­Š¨xû´)‹ûm´Y¥±Íq ªC‰§Nì»Ln³Ùºz’‰WQ~ß©¥–»r÷|q®žz2 !N5çîzµãq<.ê÷Sa”§yW›‚hûlqS§Ÿ½Ç ¨®}7Ĭ ¿Æ#ÇñѸ"/šEf Ä2ÍÒòéÐC,¤ýzÚ“hÈŸ~¤}~„vácRw´UJïœyî~EaŸs÷uÿ¡©Ÿendstream
+endobj
+2604 0 obj <<
+/Type /Page
+/Contents 2605 0 R
+/Resources 2603 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2597 0 R
>> endobj
-2083 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F53 1029 0 R /F41 939 0 R /F48 953 0 R /F14 740 0 R >>
+2606 0 obj <<
+/D [2604 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2607 0 obj <<
+/D [2604 0 R /XYZ 56.6929 462.0323 null]
+>> endobj
+2608 0 obj <<
+/D [2604 0 R /XYZ 56.6929 288.682 null]
+>> endobj
+2609 0 obj <<
+/D [2604 0 R /XYZ 56.6929 209.4795 null]
+>> endobj
+890 0 obj <<
+/D [2604 0 R /XYZ 56.6929 155.6441 null]
+>> endobj
+2610 0 obj <<
+/D [2604 0 R /XYZ 56.6929 121.3428 null]
+>> endobj
+2611 0 obj <<
+/D [2604 0 R /XYZ 56.6929 84.4903 null]
+>> endobj
+2603 0 obj <<
+/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F14 956 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2092 0 obj <<
-/Length 2606
+2614 0 obj <<
+/Length 3314
/Filter /FlateDecode
>>
stream
-xÚ¥YKsÛF¾ëWðª*σ£ly½J­m$§¶ÊÉ"Ae`ЊþývÏÀ€ åªÌ4zzz¾~’Í(üØÌ(BE*gI*‰¢LÍ–»+:ÛÀÚ§+æih1¤zÿtõî_"™¥$Õ\ÏžÖ^†PcØìiõu~óððñþöî× ®èü=¹^(JçŸoî¿ÜüÇÍ=\§|~óéã#¼J“J b é4ÿvûáúϧ_®>>uâ EfT ,]}ý“ÎV ù/W”ˆÔ¨Ù ¼PÂÒ”ÏvWR ¢¤a¦¼z¼úoÇp°j?R†(Ó p6yS¥x¤•-¸°JxÿåÓ#ˆù@at
- išpKõ´ÍA Œ§k6¼ûä^¾å¯8`ó¢q‡kfæùêX­²ª-ýbÓÖ~Þ•{¶Àê¥vã&ßg‡¬õ›üA)/sXn@×R(Ø>ìàžlž¹×e]5ù_ǼZæn¾^»…ª9îWž!››¢Úø]á$p\< SÃÂíã“»ò²x>d‡W÷²Éí h7X^÷m½9dûm±tSõ>Ñ äg7‘U+7ØežÏr›U›Ü³ª<ïc{tzqïn\æY“ñÝÀõI"¤æþJ$'Z'Æ]@ñzÁ(@öP­–áPB‘„ä>Ûågî6%‰P–È~l%øƒóÄ*üÐŽšüð=÷J
-#u7¦eêÓ_\8©&Nc}ž¹ù¢i_KËÊŒU`çlR+t64½ÛÀ'6äÔMëy„•ŽÞƒ^'èÁÿÔ ¿oö˜™£üp›²Œ6j¦2ðÆÁͽË8;‡€ t•û´swl<åsp/€óà[ž}ιÇTì7 ¤šÍ„[¢&üãØ8.†,] Ù„”Ê´ßÙÇ~'jU¿øâ ­G
-†ËSÂèä²´rsx–4¤jî¾2猻W¶°Â*lsì‚9¬ùºÌ8 Å|•·ùaçB Loë7ïÖ-£6[¶~rëÉB!®™.ánüâB5.wVêLÙ#BQ\mjK7¯Ám},ýâ¡y©jq‰Ó¯6gz<©ò}ÉÁƒ™œ¹\— ©BQ~Z—tT¸oWŒ¨¡ŸdĤJœ-F†2Ø]sš^±£š1ΣѦ"!¿4ùDâÍ)$ Z](™"Ö`7¨P‡d6ê±]¹ýá¹ÌÝ2rîÅS:_–ðð 8OÏ«Œ, Õ
-#R'£Ê!ÿ»hڳdžCù†Á ©Î\Ge ®yÓûöºÈÜ# ªŽË¢uT§²Å&$4a,Ibá†=¸ŽhËÎâ\O# …\’B¹EÇ{»°}Óƾ>Ãá.k—ÛÜ”’B4oó/xSÿ—Ä€-`eá®]ƒú™Jã[ݾ0½ÛÆ%%§9ºaD'o”Ë ÄDô¶œP… $Ë[<¸Q×f0îo;uoYØÒÞœH!‹2ƒ®ÎbWû,41`n[ÛZÏp_ÛI¬£p*üa²`”&GïÉÑÿeÿÛÑå8Q/gx ƒÔèLËO@]&Å*„¢@‹¤7ùqCU ®jPJ¢«:kÏ©")wÝóæ< :oÍÈóþÍèzã‘)sl#ª‹BšS¡¢¨É¡zä:–ê1¯&»u!¿µ--›ÿv}ûØ7𔈤ëÚôTñ}i"iðÐ}ЀÁ6]í(ýÉ‹àAwæ_©¨W€Ûú¿å@›g/¬\ð7’äžæüµz{«¿7KÁYRp–6 $'›E×E!-6ép³Uß-;|®ƒý•õf¥9÷O5$ÌøÁ„,´+Œÿñ¿Øý¿ôë=çÏ% gfƒPx0Æ“±èÝÿݧ²ÿÌdòyendstream
+xÚ­]sã6î=¿ÂoufÖ\~K|Lw·½tn·{MÚ¹™^[Ž5kK®%'—
+#g™‘DQ¦fËÝ=ÂÜWÌã,Ò"Æúþþêí"›b4׳ûuD+'4ÏÙì~õûüæóçŸÞßþûzÁO®ŠÒùÇ›O¿ÞüÓÁ>_>¿ùñÃ<ÊÜH@bñ4ÿòéý»ë?îºúpß³³Ì¨@^þ¼úý:[ç?]Q"L®fÏð@ 3†ÏvWR ¢¤²½º»úWO0šµ¯N‰@‰œ¨œg2àlÆ1JñDÊ-¸°B¸{©›}[µã­hàG
+ä;÷ÂþPÐ㹟vƒæigÛ#¬rxñäÖN"™$\Pâî>§pÅÁ¡¢y[ÎU¯Ã­{ràG/žŠj[<lýãÀÿ»:xX¼2­ä,#Fðü¢ÈaŒ‰^Éw»c]-‹UQdÊ G–S‘i¯Ðò
+mÇM?*ÜÏý»Ï,§.—]uÍæM R—4ƒ7ëUU?:ÌA4öõ#¬Tw–‰•W=Ïd"è 
+r¾ª«®ØâðT=ÖEwtziURŠùmí0´ky<8Œºs3À}FùÛ8žkùªKªƒ@c¯Y©!AËQ˜« 2‚cz?huUö%ÈqûâF±–™Dxè¼áj"s-RÃ-¶ÍD¸ÒZXkÃß|¼y·øø^ኆ͟7ÕrãfŽméq
+÷ÓnœâÚö¹\ºçÎ=£?Äß²$ÊÚ¢Jë"àt
+AGšNLK3¿ßŽ"'eïj«ØÑFîïn\´ÝËÖ’ÊÇ"°°5z
+ѧVò¥„4XÈUHB
+{å±pµrû>ªç²tHÈùé`úWXä9=­f„0²$\Qy.SEúxÜvÕ>„UÝvE½,Û8Øðs{Ôÿ®l‚éÛ­³4Þ®³·»umkï¤{_ÇF~ûùIŽ"
+ ;“Ó&
+ª¡\ŠËüõX &
+ª5¡Ô(ápZA1#РógÒî„®Î
+«G–(Öwp¡¾Æ
+Éõˆ±»²ž,Ø…(×VµlÜ—îS™ÈúÂÍ€•žš&’?=\‘Jغ«™ï< ^õw}9z¢\€Ë¾ñ¯Ã­wöx5'
+«à—7ºp¼Ëïoã% 8N
+Žóâ’ibÉää(„ɹI—üPÅS°Ì‡&Xä¶y|„dä¼'Z õŠ"¬ BXV/Ó:.Ÿ7Q©aLÂÅœñ„¯o*ÕôO71b BªÓM¸&Mjƒ†äšñË‚ë±&$—œ¥ØP骿ÚÃӡǃ>K»•¤IÕ…ž…x‘ õ÷I³§8!Í$ƒè$£\L‰ó$ˆ'Êèo¯YïF8uí
+‡oš)‰Q`¬\X \­#_­æ;ˆïŠG¿âS±­Výu­üMƒMÁå²Ä»y!¸ ‹
+aÑD¿Ú(Â4çç[qȘEþ.Gmrñ͇ÝS\Ä$O[Á]§y¦†•Ï6i€›³Q“ÜF}‚§}¹¬PãËÕ›©#z¹¯è0Ê!\rÑÒF²R¼1š/.±tå6j+ëøcóK„ÇxüøëÂKʆ•&>ÚÆÇ€K܇ҵĀFeo|—1‡€BÂP—0H—廡2ŠùUóKŸ~„¦oÙöNOMß!ÈCÏ)mžõÙüÂeÛØM °ñ¹¿QQ¯jèÄzžSmdÔ¶ÅõüScsdjúžušífÂÂlâ:„®¨ì‚07©pv°c’(˜ªœ
+VÊÓ# ¢;\ƒnÔ{€l²¾øòUéÞOͱ›hè§zâvi{;~fSn÷¾3èî’Éö8ipá4O»<ÿ¼ýx{o¿¿Ã}ÇçÿýF&Ú¯"ÅjùRvÉç}¯`ÜíL $NŒGéP>™)kbxßá;óiŒÁÅèÓÆXè‹pð´&g,Õþû`wXX4΋ÂoômÅÈú`ø}.< ó€¨ƒ€àÌ`&ñNܤQ<;×̱¤3Q4W"L¥/…x‚ÀÕ«ðÛ0ûö
+endobj
+2613 0 obj <<
+/Type /Page
+/Contents 2614 0 R
+/Resources 2612 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2597 0 R
+>> endobj
+2615 0 obj <<
+/D [2613 0 R /XYZ 85.0394 794.5015 null]
+>> endobj
+2616 0 obj <<
+/D [2613 0 R /XYZ 85.0394 749.4437 null]
+>> endobj
+2617 0 obj <<
+/D [2613 0 R /XYZ 85.0394 680.7174 null]
+>> endobj
+2618 0 obj <<
+/D [2613 0 R /XYZ 85.0394 501.4297 null]
+>> endobj
+2619 0 obj <<
+/D [2613 0 R /XYZ 85.0394 100.9714 null]
+>> endobj
+2612 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F55 1311 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2622 0 obj <<
+/Length 2462
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y_sÛ8ϧðÌ=œ³[³ü#RdßÒ4ÝËÎnÚkÒ™›ÙÝÅVbÍÊRÎ’“Í·_€ eYfšÞÜt¦¦@ü
+;o·ô¹)»®¸/;úZ¶»zEÃÛ2ê²ð+ÊíižÍƒ¤˜ ÁœÖwå³…oiÚíâ‚Vžýrý)pUfp›T@Döm³Z²eÛÜýÎ5×ðŸxCËqb÷eƒsv4×›r•$&E¤3‡‡•Œsð%ÇûË«´Ð…“¬6USuý¶è£Ý¾”w%™¥YKýZ4;°òñ‰…±Lc‚ø¤ ™æÈäÈ”™s§_oþõéËëV¼lúrÛ”=irýÜõå&øô¼mºvÛW»Í~ߌ©ÌD×eŠI®ö@#¶ÌŽÙ2Ál–çáƒÏR‘w¡4s8À%Wàœ XLŽ_9—IÁ“ЖÖF
+{%Xn´æ̘̥`*@[©1ŒÒ† $ ºz/ÂCøÀ$Â× ?‚_<Á‡‹ëó/—Ÿo.?]½`ñüRÏ™t<ZLó~]â anœ æö w
+WBF/57‘Jù GÍnsëãep¨ßì&R"€4P†éùÚ°Áå]êÝ yéŠq3<œ}ÓÒ|â¦^JêÊð&êÊgêº#Ãaæð$Jà8º L!_¡¼¦ëË"|x‹Ç&Þï! ctŒ¿}«ùEáÝv¸¹î "ã°Q¾”`ÊâÏ’FDÑX¿¡j@ ÷¯4@@»ûm„ïoʘš»ÛWKˆÕ̉Á¤ñ òP$öÂC|W½àŠY=ÜÚ ðØ9¾4ÈܤÉ'•Cy–ö$ñï,ÁS£²wáI<…aHÕeüüª .Wd™Äˆæߨ#©?rA9Æ¿L%ž³ùðýÿlÿ§Á,gÊZ™þÛ–Ì5ÞÄLT
+­'Œ9R=þ©ìX÷¿òzWqendstream
endobj
-2091 0 obj <<
+2621 0 obj <<
/Type /Page
-/Contents 2092 0 R
-/Resources 2090 0 R
+/Contents 2622 0 R
+/Resources 2620 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2597 0 R
>> endobj
-2093 0 obj <<
-/D [2091 0 R /XYZ 85.0394 794.5015 null]
+2623 0 obj <<
+/D [2621 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2094 0 obj <<
-/D [2091 0 R /XYZ 85.0394 752.0715 null]
+2624 0 obj <<
+/D [2621 0 R /XYZ 56.6929 713.9465 null]
>> endobj
-694 0 obj <<
-/D [2091 0 R /XYZ 85.0394 700.8318 null]
+2625 0 obj <<
+/D [2621 0 R /XYZ 56.6929 649.6644 null]
>> endobj
-2095 0 obj <<
-/D [2091 0 R /XYZ 85.0394 667.6704 null]
+894 0 obj <<
+/D [2621 0 R /XYZ 56.6929 609.8446 null]
>> endobj
-2096 0 obj <<
-/D [2091 0 R /XYZ 85.0394 631.9578 null]
+2626 0 obj <<
+/D [2621 0 R /XYZ 56.6929 576.4481 null]
>> endobj
-2097 0 obj <<
-/D [2091 0 R /XYZ 85.0394 565.5242 null]
+2627 0 obj <<
+/D [2621 0 R /XYZ 56.6929 540.5004 null]
>> endobj
-2098 0 obj <<
-/D [2091 0 R /XYZ 85.0394 493.0222 null]
+2628 0 obj <<
+/D [2621 0 R /XYZ 56.6929 473.2964 null]
>> endobj
-2099 0 obj <<
-/D [2091 0 R /XYZ 85.0394 308.5213 null]
+2629 0 obj <<
+/D [2621 0 R /XYZ 56.6929 411.9792 null]
>> endobj
-2090 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F53 1029 0 R /F55 1037 0 R >>
+2620 0 obj <<
+/Font << /F37 1018 0 R /F53 1303 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F48 1228 0 R /F41 1208 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2103 0 obj <<
-/Length 2134
+2632 0 obj <<
+/Length 2068
/Filter /FlateDecode
>>
stream
-xÚ­Y_oÛ6ϧ0°e‹’"%±oišnÚ´k\`ÀºÅ–ca²”Yr2ûÝñHY²™fÅŠ5u<ïïwŠ˜pø'&:a‰‘f’Å4z2_ŸðÉ=ìý|"ÏÔ3M‡\¯g'çoãtb˜Id2™-²2ƳLLf‹?¢×LHvúçì×ó·:0K`\ÂÈõéæÍ%»üpó–8Gbeš²TÄƱ^|üxuóæú÷Ó©ÔÄŸN5çÑû‹›ÏïˆöñÔÈèâç«[vr5ë +xŒVü}òÇŸ|²
-`Jg&S¢w±!{.ôÈtçü«œB°XÁaä´¿ŠÝ¡3²„锧“á/yCg–…}1õM)–¦µIÆ&”‹Cõà-5ÖïÈm=WÀorè ž0e1>õs[@Æ$:êVnáüt«Z/¹~Þ—"5,N¾£/½À€/‡Š‰L²¼ræ¡ rMâ‹h¹9YԬ̟7õÎåýv“weS)Uªa!áxaÒçÇ)Ë Ò¾›c¼Àáb©Ù7;f½m;2ûΧDÝ<9OÜíð7‰ê|],ˆôTv«½Aúd*Ó˜¥™Á(
-f´–Vp ï <é(¯î› ¼¶võ‚m1·Q):÷ÜmÊúžÖ%j UÔXŽE±!ò²q \G!­ˆ°.Ú6¿w'>æU¹ð…ç®q'lçó¢X
-󜋧¾»~=³­8þ7»þps0rZjfæ_´Çƒê¢)ÚƒÄÜ>›)œ­UÕçu¨Dl. ·]Xa•…(Ntß>ª
-ƒÃO mWVe·;BD>ýk ^W.ÿ©˜g¾òàxiGáw¾Ý¸êª‘,
-ÃïSî#æ6åÂ
-ñp;#|’fÜjÀ33,r2H¬Ö†¥\'_ëòú¦“ î>n¾C—G§C‰öâi†Í i¶?øk]ž Ô˜¼m©ËBGzÃ?}ð¯:qÄÛâqŠEδ+ Öça¹w>5«ÂEisšª(XiÜ—XJç]]Ñ»ïn?¬Û–_¸æþgl`cŠ€ê¸— öl³$E¤3Móf˜M0²pÎ}}ì Î8KpH‡8
-¤=ŽÆ2Zté0\)Í‘ÉŒñêâóì—Ÿ^öâuÝ›ÚãÍí®…þÇEõZ
-¼r>nmiª´|UY¡ã?×å?Çâ~øÒŽ`¨éKÛ¡íþT­·vjTó†¡ ‘a`­§AKg½ŒoËêNŠ¯2ûAWÙ µ%j·¢º}V½¢×óšøö£øëŒ6}‘C>¨8Eî¿+èÑ' ÛÉ{çôC_†|칯ý8fÅqèšà=²ÿï¿ìÿF¢RˆB&Ãß¡ejïƒÄ+…V ™©.8¶«2 û¿’Zendstream
-endobj
-2102 0 obj <<
+xÚ­X[sÛ¶~ׯÐø¥ôœÅ•
+BÔ]eÕr³¿oóºÂ…ƒP?]Õ› }¨ÓŠ0Ù(~S¥Ë©3D˜Ú%‚ma¤e´Ün6§Ì€
+m±ÇźÂ¾º<{º¸|¦ÐQÜ*kÁÇžÊÁ.ã¨ÙÞß×›6Ká
+Ù‰*ól*ý¦‚‹#T¹Ë`æèºØ¢ë4í\ï:ø¸Ö“ÀÞ‡}laë+4±Ä•Î(æÕý¶%†ñXeãOò¥„q`LkW?äªnqïfß# o7Âu«6h¾mÑ!‚$°|ªŽAR&o“¼HúíÊ@™Tûëû.”&Ôƒ×Y`l»Âpþæìòú›óÀœ-¥Äg˜§&å}·KbGœy•5GÌY²\Ü׫¼r%C(Âö8ý»m'.,EL¬pÇð-Çó¯}‰ƒ½b@@xÇt¢GnI³U²-ÚE“mÞBIZ0üE½LŠuÝ´§*h÷‰Ë,(´³æÈ¿˜Üé¯^˜dÄjE„}ãá¶Ñšõø`Àÿok¨Óípþù½¹ õ;9)IÓMÖ4YSº GJ(ñ‡ýsK¼JñÐzp
+L»¼(P®‡[°UHN$"¶G´y¯Uà¥#ÿL¡¡àšPø1˜0äÂ6”…‰
+Ö ~6ÈG¢
+endobj
+2631 0 obj <<
/Type /Page
-/Contents 2103 0 R
-/Resources 2101 0 R
+/Contents 2632 0 R
+/Resources 2630 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2597 0 R
>> endobj
-2104 0 obj <<
-/D [2102 0 R /XYZ 56.6929 794.5015 null]
+2633 0 obj <<
+/D [2631 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2105 0 obj <<
-/D [2102 0 R /XYZ 56.6929 605.5421 null]
+2634 0 obj <<
+/D [2631 0 R /XYZ 85.0394 627.5418 null]
>> endobj
-2106 0 obj <<
-/D [2102 0 R /XYZ 56.6929 504.7499 null]
+2630 0 obj <<
+/Font << /F37 1018 0 R /F53 1303 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R >>
+/ProcSet [ /PDF /Text ]
>> endobj
-2107 0 obj <<
-/D [2102 0 R /XYZ 56.6929 441.2539 null]
+2637 0 obj <<
+/Length 2488
+/Filter /FlateDecode
+>>
+stream
+xÚ¥Y[oÛÆ~÷¯Ð£DÛ½_pžÜØÍqÑØ9¶sp€$2E[D%R)»î¯?³W‘ÒÊrQ×ËÑììÌì7ß,ÉÃ?2ICÍHŽ&bT¬Îðè Þ}:#Af…¦}©ŸïÏ~ú…©‘AFR9ºìéÒkMF÷óo㟑h*ðøöúâãôãÍõ/Ÿ.¯'Sb¸âãó/_.¯/®þ7™RA$1>¿þzþ›Ÿû21t|þéònòãþ׳ËûdVßt‚™µé³o?ðh;øõ #f´½ÀcèhuÆC‚3g–gwgÿI
+{oÝO³® Q&iÆ”ŒAF:p†0H2Êœ3®Ï?_ú]Ý]ÞN`ûÿ…‡ûÛºåêÓ×Ûs»Ûû«›k»[ÐI{þÅ#E˜3í”Ý/ÊÉ”9®g+7ã¶Ü<—?»Ú¶=„·ESǘ>m7¢ÇåÜ¿íÿœE¹î¼ä¦ž~~S—EW5uÄê¹—‰¿óÊŠæ©®þ
+u‹°âïå«Ÿi×eQÙÅãªUm7h·ä}æ“ÅþÐ훓޾! “„­Œµ YÓ Q4HÚõ–åXšñ¶­ê'»6‹æ1»¹Î™ß,[?Óv³®\•uçÿôV˜ù!tXÄ:~Ôƒ”J¢Üܘñ]YîÙÑö<ÌÆM½{Yü¥:ݬù‡‹O9HQª¢©ûEo‹6ñ`‹îéŒqgðêúÂŒœÏWU]µÝfÖ5?u[>–>îu~öyVogK?~Œró²›UËëBÏb ÄšuwNÆùow7§“ßfÁw,°†ÿÈÿK;7µ‘x*ëýw+ØqÑÌK;Oü¼[ƒ™¾o•BBÁØûöŸyâp DjD¥”)2^™2.f€Mÿ÷Ííi·\Õ]¹©ËÛ»×BÝ„k6]µ]íÖå°‚ŒÑàq#uBm€hŒ‡^g–q¸0Í¢OÞ0”&*Å+iqö|‡ÌÜÅÍ^ØH•à媉ÙÙ4Ë÷$Ñkݬ۪Ý/ ÎŒ–lÄÁW\é²0
+Àþ#°!œ´Óà@p6#æG¡ÃKpè·éìG=øMÁº½4kNx>i-²B'HsF‚\ÒYdt‚“´b§ò±Zþ •‹4ú=£\ÌÆwÊë”ïQ¾>iïò6£2@{Ìöõm2ú¦Ì@m§œ±pÕ¬Yñż“úö¤¹³ù|S¶íû=ÐTY,6MÓÍ«MÎN ?"¥KRº=©t t!çV(µS—)B)éáỸ¼ûx{õ¥G^H¨2xpˆ’!ŠiL©€¥E2mz<&"Lúb$l:4p†6´G$2KS€AÅz%›ªñUVž…Õ,¥²OpáÜfaéY²ñ¹¬+_fíôÒ3Øû~ié“}¾lªnêpu
+€ˆ˜ær˜£Ž¶P#ð‡ÀqÖ÷#Å©#¯Ùq:jD ÆÒ¾¯jíº©çÖ„Œ;ÁSTsš‰0ƒ¸T1ííjmiBèDrÔ ðJÔ“ˆLëmÎ’5 'Îhú²&)°¥'¯^ëÌE>>ÜÖKÃÍ0>ç»È._'@ÏÆ–rp°Ç†žó4\ø¤‰ÍD·aî¥ê~6…wè¡Ñ\«¦³œ[00B oÖáPpÏÑ­îÖ1˜Ø®ýÄ,ã*¥‘Á„ô3)aã¾Ç²½zŸHVÿsS̓ ‹°íº,Ôç‡GÌ
+e–œ,*({ƒ%/
+à”’’‘§ˆ“|Gê
+ìkÓ/
+¨Wu¹ôoÒ,œ± Cøà˜E΄ÃõŒ\.›—|•g8#7âd$61\®ì˶µ]² >jƨ{™Wås
+ÈHtŒÜ¬eL½MnûRÇÉm’r.·lbèrmRÀ{—l}Ó¤g„½m[’Ê7Œ20IBÕк»D·lºs> À õT`Ô<‚>¨ævÎlA&ª®µÔ€9~öƒìdŸÝKYI´ºdƒ Ô˜Sñ/ê”Ùc :uF†¼fÇHì7…vBõÑhK8º7c½“9é ãâ\äâl¿×‘ÌÍç ÎÐŒ) ¼ä «’ÌYÃ3Ëúv} µ_£ò8ýS \6û:ѱÔì÷*œãﯱÛM-©»¥èÑ¢Ý/ÓuÙðÔkh¬ÞÑöp «þWÜgZhsí=UƵ85ÆÿøîîS5·wiúHC
+W£¬áDêÃ\ {mÿ?»³· endstream
+endobj
+2636 0 obj <<
+/Type /Page
+/Contents 2637 0 R
+/Resources 2635 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2647 0 R
>> endobj
-698 0 obj <<
-/D [2102 0 R /XYZ 56.6929 401.9804 null]
+2638 0 obj <<
+/D [2636 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2108 0 obj <<
-/D [2102 0 R /XYZ 56.6929 368.8669 null]
+2639 0 obj <<
+/D [2636 0 R /XYZ 56.6929 752.3759 null]
>> endobj
-2109 0 obj <<
-/D [2102 0 R /XYZ 56.6929 333.1161 null]
+2640 0 obj <<
+/D [2636 0 R /XYZ 56.6929 668.0781 null]
>> endobj
-2110 0 obj <<
-/D [2102 0 R /XYZ 56.6929 266.6983 null]
+2641 0 obj <<
+/D [2636 0 R /XYZ 56.6929 607.6906 null]
>> endobj
-2111 0 obj <<
-/D [2102 0 R /XYZ 56.6929 206.1673 null]
+898 0 obj <<
+/D [2636 0 R /XYZ 56.6929 570.577 null]
>> endobj
-2101 0 obj <<
-/Font << /F37 802 0 R /F53 1029 0 R /F21 714 0 R /F55 1037 0 R /F22 737 0 R /F41 939 0 R /F39 899 0 R /F48 953 0 R >>
+2642 0 obj <<
+/D [2636 0 R /XYZ 56.6929 534.8112 null]
+>> endobj
+2643 0 obj <<
+/D [2636 0 R /XYZ 56.6929 503.6098 null]
+>> endobj
+2644 0 obj <<
+/D [2636 0 R /XYZ 56.6929 440.3004 null]
+>> endobj
+2645 0 obj <<
+/D [2636 0 R /XYZ 56.6929 370.9227 null]
+>> endobj
+2646 0 obj <<
+/D [2636 0 R /XYZ 56.6929 274.6697 null]
+>> endobj
+2635 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R /F55 1311 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2114 0 obj <<
-/Length 2593
+2650 0 obj <<
+/Length 2259
/Filter /FlateDecode
>>
stream
-xÚ¥]sÛ6òÝ¿B“—ÊsŠo‚—郓8©ÓÆqßM¦½>ÐeñB‘®HYãtúßo P¤LÛÉÜèÀØ]ì÷BbÂá'&Î0®R=IRÍ f2_ñÉ5¬½=aÏ,nšõw½¼<úþJ&)K­´“Ëe—cÜ91¹\ü>=¹¸8=}öéx& Ÿ¾dÇ3ÃùôýÉù¿N~&ØÅq*§'oO?ÂTêÄÂ&!Ùñ—ï¾cT¿JS–hƒl!æ_Ï_¿b¯>œ¿Á­G§—¿ý; ®Ù?~ÿƒOpµwGœ©Ô™É&œ‰4•“õ‘6Š­T„”G~éöVýÑ1å˜q2’”cB2)³J*•ËUN÷Õ¢·UÀu••áºõM[ÔUCû(µf)—q_Ófm¾Î«öx¦x2×U›pÎÏþù¼ÍÃJ™m›¼h'bÁjÆ5÷"_fÛ²5ùæ6ߌ°â,j(²BˆZ8XÖeYïòÍ®îèۮ¶*[{>&3% Óšƒh…`©¤^
-Ø'Å4[,6ÇÂMó¦!@½ ôñxüSÏn¢§h~RÁe‹plU7-vEYÒè*œÞam•W/ «ï“ðøý8"¾.nã™,€²8÷œ_oƒ’
-' Šq¤7Ez¾[óÕg±
-uR´ÖNÏq W©GˆË N¨=íb1B]AÜ0iôM›No¼þëÛliáo
-Àº¢/IÈz}{м^¯³jAನòç0LA¢U8;Ê¡ K¸IžåZêp³ô¼dŠŠ@M×Y;_a‚Ž˜³Â M¶¨®Çb
-dÙiä¡H¢ <'ƒ\] Ròü9í˜&d\ŽGgvÁ™]çÌ°ÖÖɶ k°·9 &ɶD‡†ˆñ] ”f$zØIA(HÁ$̺ä b57µ)Ì&É®iæ}àš7õ¦‘L¢Y’Ü÷MnCŒ5ƒkCŒ51ÆÚ©ÇëGmˆf0„<Qåó¯éˆ7JœÓQ®»®Û€*¸9Œ‚È|ŒõÂÊ2ÍÝн¼Oñ|JB®Ñ*¨n/Áñ w’"ጦs/ò-X‰;º,| @{ßâ{ß’rÚÁàT]Øý*V÷Šr½d¸tŠÀcF+Þ¹Æý3 ÞG.ù¤'¨GÆ< *±àI ïyÆ(²‘¤s%yW‚op¥$¸|ÉxÀ˜|ìÀì<U]×Uõv3Ïg˜Ò1ß¿PÊ2ýu3" g1 Ä2NdvkÇèÉ„5ÃpÒ‘`Õ!]ÉDMç˜È†A
-ÏJ Ü=ák…°wL˜Š«Û'S´Ý©èDZoÆPb-ÜÙ÷Wå ®˜3]P†ûÊñ êF¤&C:!'Q ¤gyP9{M™˜jqä;Þd—w¸
-ûBveÙp¤Ÿ]pËþ yäÌΡ—Òòñ^C2ÎSwÿ™Bs4ÍkÿHã]Ñ®°ÌçÞLBáòÎ'P²À&¦„RðÀªtKÈÝi–8Gq ØðÑí®Žm"K¬>0èørr_Xl9Í2+¯ë Üf=æ䜅Š¶Ók}1¿¨Š”’Ó¼šoîb {¤~ºŒÆ<x< ”L®ëŸz<€¾ßä«9åË™X×éé|»!˨ÚòŽëŠFrúãû“W³÷¯ ÉI¦ª/%‡²·õ.ž/¼o§áFê¤Û±ïYŠ= B3š6ùœøh Ü…DwµBÿ­ BÅ
-º ÁT“ð»—‚×=7Bë5£~ŸÓ”ªÍd_A}.uLò®+\¯½­åc¾/™t<Ñ=ñ:YÙ?Wõ®
-ì5c49Ø…ÒÕºx„¨bBuDŸÁ¸Ágë¾Û’èl¨º–!T¥}ÑÁz¶wfo{=¬/éŠkZ‰—òoJ7Û–\LZÃL—°—¥N»WòEM¥>ŠµD»Y7¢Ä‚#2Q\MçÛ6>;;ÆS)^²‚Ûf·YQfÆ0°Îª‘›;(¨ÖMˆóü QŸ~:yñóiØŒé6âðæ¡Ùú&èž'p‚ÏÍÁæj±½ø:–ýë1”H©£?"Ù‘„„Åöê2Æ࿆™å|ú—LD=Þ\‡BQHØ_Öó¬Ä.íÅXí¿;Cpàñ¾0:Ý!%²È¿;d5¾öºTÏfGö®EWž@ð4i9JÚÝ# qºíÏ‘µ1:ê(iß|c7¤GFõ‚†»=K¶/'oÑ+A4ª|µÎæ³õ¼k†0QäÄ)Ÿ>³oÞ/ÿ«Õ‡æ‹.ﮤþp–Ëâíé—´\Š²|÷áå—gß®Žé Õo¹}ørp¯¶g¿ªÏÜ…}ùÓ.ým÷iw®þýÛOÛ_~ø¸û\ ÿ<ù×wÌýßÿQîÿ¤Õ SÎÉñ¿!0¥R™Âû ™²Þý›yŸ÷ÿf¹Öendstream
-endobj
-2113 0 obj <<
+xÚ¥Y[oã¶~ϯð£Ô\ÞE>f»éž»ÙœM(ÐöA±äXXYr%yƒô×wx“%™¶{p ¢©19œù曚,0ü‘…3Í©æH`"«í^¼À»WÄË,ƒÐr,õþéêÝ/,]h¤%•‹§õh-…°Rdñ”ÿžÜ<<ÜÞ¸ûízINÞ£ë¥À8ù|sÿíæ“›{¸Ö4¹ùxûx½$Z
+B$5r'>Ü?.þrÿËÇÛûë?Ÿ~½º}Ô«N03:ýuõûŸx‘à ~½Âˆi%¯ð#¢5]l¯¸`HpÆÂLuõxõßaÁÑ[ûÕ˜)¸PHP.KN ‹Û #,àüË”c”*u°%1{)c¯åf~N8çœ,Æ‹m„"[ÒÑ–Z#NÅlˇ¶¬ûÎ9#snÓ´½î·Û¬}sšµ{ö›ÂOìú²©Ã—ëÜÚk¢’—ý¶îs®™(׈RšÂŒ"m¯–«¦^¿µ—+/Á/”Q/ŒŽðà­žbøŠÒò‚kFRg\¤¬k¾;¥„I‚”Ì+õ½x«³m1W0…Ò4Uçu¤"Êí@8@Oh2ÕîqW¬Ê?0¦…µ¸ >’F)7°ªÙ‘óãHƘ޲=LÖ}¹ÊŒg+BÀæKFUò´)ýÛ}׻ѳ_(sYUæn˜7Û¬¬XÇ-–Œ!E˜96A&ìí!ž®òbí+AØÍž]$)Š‹1tŒšÇ°á)RËK°‘2E”‰ °K†Í ea³»›‰¶9f(Fæ|gõ
+B½&ˆ¡l gŠMôGƒ¬ˆyÌL‹dµÉ꺨Ü«©½n
+åE,®1F0 Ç3^Ï#žai–©ªìú¢öª¬›6¨›¯<ÉuÖv×fÙ–0àuÌù‘]Ád|ØreqgQÉ1E˜>…åö î; &
+|¬N¥ÓL#©3`
+RLmLIņH
+ñ³Ì"^ÇÑT×»6Î/Ù¸§%³õ›û`øR¿”ÎY«¾iý›³ˆ‡N.#^§$4v¯eU¹¥Ûk•ì½V`y‹ã¦7,}¸Lnü«,_ú–‚0ˆbSºLؾ4gs¬Ì >voã„É&œf; M•ÒQh x{aHš áꕇe]JaÉk[ö×@×Eí>;cUP—üð. El¬˜D?33¼ì!Gû,)ý¶„õg»®›½¥3õvÈ„
+&u¡×KŽàAÊB}±×‚4מêµÎê5ôZÇzE{­‰b>v­»lìJ~*v9JSAÎÆ.X™=ÝJ<éŠþ
+$ðЗî^W!ÀkˆA,ɪ.œrÈϹ'
+endobj
+2649 0 obj <<
/Type /Page
-/Contents 2114 0 R
-/Resources 2112 0 R
+/Contents 2650 0 R
+/Resources 2648 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2115 0 obj <<
-/D [2113 0 R /XYZ 85.0394 794.5015 null]
+2651 0 obj <<
+/D [2649 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2116 0 obj <<
-/D [2113 0 R /XYZ 85.0394 420.6717 null]
+2652 0 obj <<
+/D [2649 0 R /XYZ 85.0394 390.6346 null]
>> endobj
-2112 0 obj <<
-/Font << /F37 802 0 R /F53 1029 0 R /F22 737 0 R /F41 939 0 R /F21 714 0 R >>
+2653 0 obj <<
+/D [2649 0 R /XYZ 85.0394 257.7108 null]
+>> endobj
+2654 0 obj <<
+/D [2649 0 R /XYZ 85.0394 193.2733 null]
+>> endobj
+902 0 obj <<
+/D [2649 0 R /XYZ 85.0394 153.3455 null]
+>> endobj
+2655 0 obj <<
+/D [2649 0 R /XYZ 85.0394 116.3439 null]
+>> endobj
+2656 0 obj <<
+/D [2649 0 R /XYZ 85.0394 83.9066 null]
+>> endobj
+2648 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2119 0 obj <<
-/Length 2226
+2659 0 obj <<
+/Length 3141
/Filter /FlateDecode
>>
stream
-xÚ¥Y_sÛ6÷§Ðô¥ôL„ÿàú¤ÚNêNí¤¶rÓ™$´[œP¤*Rvss÷Ýo)R¢-g:z ¸\,‹ÝßîBtÃNdBÃÌDAdLåd±:‰'ðíÝ <Ó–iÚçúe~òÓ[®&†˜„%“ù}O–&±Öt2Ï>E¿ÊÉ)ˆˆ£›ëó³éÙûë·ï.®O§Ô%¢Ù‡×ç—žN™Œ8ã8ºš]œýŽ´§†E³w·§_æ¿\Ì;µúªÓ˜;þ:ùô%žd°ƒßNb–“'x‰ 5†MV'Br"ç-¥8¹=ù£Øû꧎š‚Æ„ñ„ØBО- #Rj1QÒ„3îmñ¿ŸÝ~zËXsÊ%щ”0ˆ‰H˜ô¬—%ì^ÄQ³´0à&JïªG‹4ûwºZöM6XVE©
-ŒD:a
-äƒPÈÔÊ´0jßÓ!ã².úŒÈ1„KÕò8ÌÙTE=fWpÐ;0vZ£·ÝW›በPi´¡æÀ:{îØFX’´¬h­ÖÙ1ëÀh½ÉIBÐp¦¡úRô;ƒf ß5 ‘Z« ž;
-Yùßððﮎ½|÷ñfæ¬9¿|=ÄL¥e0¼÷wš„¤Ì©ìÐÓQ±Šp£»ðu—úý døÕ‡<ÓÅ®äÄäᨤ¡R¨[™!O;…-ª‡2ÿOP#x<;J½¶‹Ü-Þ®š—c92”1û!“Ãó,Nª°ˆ3ÓfNy«Çèsê»ô”^¥â^órTˆL©_dP­Cæk5¤ÆD·ÖîéQ÷,Ì}Úk?á%Š u@¦"oað2¬CzÅX¯ðÀ´éš¦Ëës|̲U^æuí¢Á‘nì½Ås/aÚUZnÓbNXÍX¨¨
-,aŽ„ÆíEˆŒÙï·ï;¿ó×h×¼ Ù¹—÷¿µAê[ ¤û5¸éÛV¹\ÆZPüg–8ÜM´Ãܤs‡«L¹€þ Êè¡uf翾¿yÉ,"ôyÝ”-¸Þ~«á¨CÆ8ƒÊ)ß®vë
-(‚’ö4ƒºBʮ͆ž:ŽãƒÊÂœ…>ÊcšCŸqÅ ‘ŒÔ'^ŸÏÐõìÎ GX²í 6(Î;«ªx}+«u×û½=‡˜Ñ ‡–0jä‘^³aÒåÛñFÝuÂ.”z"ûôö¡ã:Ü»KŸ¦é—vt‡û‚•{ž
-˸ƒ<0KíÀõ ue{ xÌňÌö^ yŸß!rÙ¾Ž‡rZÉ®òáe篾>ª¯/úå1€ó}y›yЛrðGÁ†pˆ%ý3¶@üÖûâë£ê¦Y¶±uýz 4GE.–›ªj²|¬îƒ>ŒÊÎ]:¡Û£B¡Ã“Ç
-佺’v¤c…:^ñ^Öf*ºlÂÊiXÍßÈhÓ6É0JÃÒi§ã£-sÌ´Ž\8l}ÃLßójìf `"áZì¥lìmMòLIÀ!ü=ãkê#%ºb¹»õ1¡¬cF†:À¸Êoƒ‰­^W¥oâFÌ –bÒ˜ãÅ7D$]eÖµFl¯5Ò”²[,à«Ð±®È$ãõZg4{eS¤X'þ¤.AÝÐ —2Ø»AœíN¶Ø]ê ÐÇ_3‰à4B¢Ó
+xÚ½ZÝoÛ8Ï_áGX³ü%Þ=u·i‘ÅnÚÝä€Ú>(– kK®%7›Åþñ7Ã!eI¦8©(j4g~ó!‹‡b–f¬´³Ôj–p‘Ì–› >{„g.„§Y¢ÅêÇ»‹7ïU:³Ìifw^ãY&fwÅçùL¤ìXðù»w7·‹Ÿ>Þ¼ÿpus¹6Iäüí§OW7ï®ÿ}¹ b ä|þëÛ›½ý…æ>]Z ûpu{ùõîç‹«»^¬¡è‚+”éÛÅç¯|VÀ~¾àLÙ,™=Á gÂZ9Û\èD±D+fÖ·¿õ OÝ«QUΤ22¢ )fB0ÜÕH‰eFIå”qû\7Û¶j§[Q‚¥™Q³TiÆ…6±¥(Z& Ü ¹X*„±,œXZÄŽ(P¡TEQ·‹eS?<–õå€þ?/rñÍ{Xïð²à‚‘YX_Ë×Í®êV"¯£˜Õ©ñ”_×U?ú#Âß$,M”ö/ýQ>×ù¦Œ0ׂeZ‰)ó]„¥JXf’Ä“îòºh6Õ:ÆÎ)M“lʵ}‘ë )¥eYØýMìE¸-”IØÙ9Î_Me šEkŸˆù-ŒPš¯ôÞØ :c™0àÅ
+Œ á‰cðîêö§ß¯?Ý]¼é_:,Ægà‚pæiÄPˆZŽÏO؉4å.ïÊÜ8Óó/
+O•îš ömIîŸ#‘±$ÕÁ’êv¿-€idu­Y–fA1pÒ1n–ÌÿppE„“âÌZ–HÒB̯;·­6Ûuõ…sI;SsPÞ>îa·USYó@׸Zâ* ËÔdpZö¬¬E¸«×]U?Ò}NRÞÃî`Í·»K‘Í›ïUÑÓv«2²sÉ%À‡¯Ðc¸â/ê1Ó:ê‘¡]DØâ¨, NÝ>×]þg4ïhôT­×^%]ë²,ÊÂÓ5¤=%ç35Ñ™ĉªûÁêåzïõ·yM×òÏN.¦! Ø„2’‘4³Ø6ëjù7óuÛñ¦¬;FR
++™Ð°áX®²„û×` J¦xŽJš9€P^Õ4åÐÃÍBXp3í¶\’ô ñ¤x²n°l6gøt]Õ%ì\iàÐÑé)ïý %O^™™^€ÔÙ,Îôë.èÍ÷ÈÇ'@’€#8Öp¥÷39oOi<3 ¬7}•ý¤LJ¥Fö.™òlþ!ôGûCìl!f ^GºÁ«°ú&²¸ˆÌ6 ýS³_û½ÕÐ]î-4Õ þ’±~Èk [¾^;£6Ùü‹”ÚIs)
+r+ð_%/c»bÆôØ^um¹~ð›Îë°û€çˆ­~Ñœ.둆˜ÍÒÈpæ7%<A~;0ˆâ*µS0v¯,Ö±S°¹Tô!阥aþe1;"˜ä:,¸ƒ 7õšü{¡á xªÕØŽ{LÎøüiUº@'(®óù¦éµwå:¿oÈ=ð6!- é½oûŠÅ?À¥Ò` HWÄÖKÄ8™eóê!²y%“Ff¯ËtŸN ĸµî½ÀÞÔaô@vCwÁÏ h›;Œè‡äß‚e·Ï-DËÅxH´{ó£Ë¿Ž ŸÓk8/n!5=›ø©B=rœø÷T¸nŸå'#Ä„Z¤‡¼Q’?N Ê3žž—®§Šˆ''!p,Þmñ˜TÀ¤¢ù†®äv*8âð»Ûë8Jh vÆÍü-–—ßó
+,víi—«¦Z†5s:V´J®ç«M¾\lŠQ ºõ>£XäÄ$ÚU.|VâHáÞãúp&1“•é»ã'P% Ü‚ÏïVÞÌŠò!߯;Ÿû´G¼ÙI³’’¥D>oVª3f¨œY­¦K‚¿p›¾°d Š,94•T
+l¶JíDãtî{Líü3JD§P®-$(2}%òJ–¨d„ã±£QDj ußÙ£R>šžÊÍ1‡zÚ&ê¸îù;àÝê¼l=UD¸‘¿‹„iZI7rx%´Ï$aàB¬IÈVUX#
+ÈH”ïa²îª¥7ƒwû„+rœïÝoª6Rq+¨v„Õ£ØêSái”†Â1}¶¸"
+>T,¨;ªXˆ©±çœÔë Ü̽,9±nËmî3q˜/×>JkÈŠEbÇ©èC³^7O®¤I\ÏÁ]Ij Ýžfœ IH5¸ÝÔÎKöÈ~ˆµixŠ}B;ÙÜ0Åg±CP¼Ö„üä.¬Iöoÿ0ÚìÛÎoTeÌ*51¯Uþ½œ „ÅMÞaУå÷|]yä Õ)Žq9œ
++qŒ„ÿM^…E ø‚#0Â=á:ŒpÎÙ$L´¥'¢oƒ²#|ÀçýW
+Ò
+þ¡BÒúãõÍ;zÓzÁŠ d˜m·Ã‘¦~/c±“M  S¿æõ>}l‚4’>cNv)Cq0üµT4x¯ÆÿùGY‡Ÿé”)¨Ýâð#SÀ c/
+.R~ŒÄþç[Dzÿ!ºãendstream
+endobj
+2658 0 obj <<
+/Type /Page
+/Contents 2659 0 R
+/Resources 2657 0 R
+/MediaBox [0 0 595.2756 841.8898]
+/Parent 2647 0 R
+>> endobj
+2660 0 obj <<
+/D [2658 0 R /XYZ 56.6929 794.5015 null]
+>> endobj
+2661 0 obj <<
+/D [2658 0 R /XYZ 56.6929 749.2278 null]
+>> endobj
+2662 0 obj <<
+/D [2658 0 R /XYZ 56.6929 677.9694 null]
+>> endobj
+2663 0 obj <<
+/D [2658 0 R /XYZ 56.6929 495.229 null]
+>> endobj
+2664 0 obj <<
+/D [2658 0 R /XYZ 56.6929 83.499 null]
+>> endobj
+2657 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F55 1311 0 R /F39 1151 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2667 0 obj <<
+/Length 971
+/Filter /FlateDecode
+>>
+stream
+xÚ½VMoã6½ûWèhË‘"ÎÚÝz±q\Û Èæ µäD€Ey-9Aúë;IYr”EŠÂIÃÇáðÍã3I€áGÉf*
+b!Ž vÅ0öyD&ô °‹ºÙŽ~ýÅBJPl÷\a)I°MïÇÓÕj¾œ-þœ„”ãñ š„ãñítùmúÕÆVEÇÓÏó |G
endobj
-2118 0 obj <<
+2666 0 obj <<
/Type /Page
-/Contents 2119 0 R
-/Resources 2117 0 R
+/Contents 2667 0 R
+/Resources 2665 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2120 0 obj <<
-/D [2118 0 R /XYZ 56.6929 794.5015 null]
+2668 0 obj <<
+/D [2666 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2121 0 obj <<
-/D [2118 0 R /XYZ 56.6929 513.8248 null]
+2669 0 obj <<
+/D [2666 0 R /XYZ 85.0394 751.5568 null]
>> endobj
-2122 0 obj <<
-/D [2118 0 R /XYZ 56.6929 427.0967 null]
+906 0 obj <<
+/D [2666 0 R /XYZ 85.0394 708.6012 null]
>> endobj
-2123 0 obj <<
-/D [2118 0 R /XYZ 56.6929 364.279 null]
+2670 0 obj <<
+/D [2666 0 R /XYZ 85.0394 670.3846 null]
>> endobj
-702 0 obj <<
-/D [2118 0 R /XYZ 56.6929 325.4767 null]
+2671 0 obj <<
+/D [2666 0 R /XYZ 85.0394 636.5029 null]
>> endobj
-2124 0 obj <<
-/D [2118 0 R /XYZ 56.6929 288.9693 null]
+2672 0 obj <<
+/D [2666 0 R /XYZ 85.0394 564.786 null]
>> endobj
-2125 0 obj <<
-/D [2118 0 R /XYZ 56.6929 257.0263 null]
+2673 0 obj <<
+/D [2666 0 R /XYZ 85.0394 498.9559 null]
>> endobj
-2126 0 obj <<
-/D [2118 0 R /XYZ 56.6929 191.2867 null]
+2674 0 obj <<
+/D [2666 0 R /XYZ 85.0394 418.2058 null]
>> endobj
-2127 0 obj <<
-/D [2118 0 R /XYZ 56.6929 119.4786 null]
+2675 0 obj <<
+/D [2666 0 R /XYZ 85.0394 349.4108 null]
>> endobj
-2117 0 obj <<
-/Font << /F37 802 0 R /F41 939 0 R /F22 737 0 R /F21 714 0 R /F48 953 0 R /F39 899 0 R /F53 1029 0 R >>
+910 0 obj <<
+/D [2666 0 R /XYZ 85.0394 306.4553 null]
+>> endobj
+2676 0 obj <<
+/D [2666 0 R /XYZ 85.0394 268.1239 null]
+>> endobj
+2677 0 obj <<
+/D [2666 0 R /XYZ 85.0394 234.3569 null]
+>> endobj
+2678 0 obj <<
+/D [2666 0 R /XYZ 85.0394 162.6401 null]
+>> endobj
+2679 0 obj <<
+/D [2666 0 R /XYZ 85.0394 96.81 null]
+>> endobj
+2665 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F39 1151 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2130 0 obj <<
-/Length 3036
+2682 0 obj <<
+/Length 2018
/Filter /FlateDecode
>>
stream
-xÚ¥Z[Û¶~ß_áG/pÌð.ç)iÒ E»ÙÓlm´– ±%×’³ÝþúÎð"KZÊNqàQÒˆÎ|s¥Ù‚Â-Œ"TX¹È¬$Š2µXïoèâ3¼{ÃÍ*­†Ton^}/²…%Vs½xØ æ2„ÃÅoË×÷÷ïîÞ~øõvÅ]¾!·+Eéò§×w¿¼þÑ?»¿µ|ùúý»O·+fe&ˆ ¤ÓtùóÝÛïVß}¼ûþý»»Û?~¸y÷г5dQ<ýyóÛtQÀ~¸¡DX£OpC ³–/ö7R ¢¤ñÉîæÓÍÿú oݧ)Q(aˆ2<KÈ‚³cÄ*ÅGÂP–hÁ…ÆÇû‡ï>½Ø %T¼2Îà#˜<©„@´RÅ…JˆT¸î*Ÿ.iÂðËKF¢Ä’|°$¨[0«ÆK¾m@»F/óS×ìó®Z#^5'&“Ã/Žu‰†³s`‚sˆÖMý;¥üóés65ÀD2³|ØV­_n}¼…û2ïÊð ÷ühWúéå&‘™æ&È—ò9Áˆ¢DgTªNMÆ
-¦Î÷e‘˜IpbÏâkÂ6Û.?v§€ˆƒ zئð²äzˆQ‚T e€}&ÍDÊiè0öL,®8•Ë¢Ä»Ú¡•*‡V÷t“Ÿv¿Y7û=îݬ·y]—;ÿ¦
-FvË– >°3gþ12ã w»æ©ª?'ä'˜"FZuUŠÚ¨®®9svªqÉ2ÈD+à™Š2ñ!à©Jc€ƒü¤¼¦9A¤‘b 9Œݶôƒ]³Îw~¸mÚÎÜ‚nT7þº9á“£¿yáCïJÎ 8vPµÜ³þó©®Ór“àëTï–Pl+4ÉÏ¥ã0 .w²™LLdLN+­'÷Ç•^Zÿ vLj¥®zL*ÀüÊ‚ K?ÿ©E»wK„µ gºÍaUÞ½)vùºÜ¦Zÿáƹ©¯ÙÒxÑq.!àë‰)ÌØ«%BeQŸé 0M”Ͳ@óŸ9¥¢-|v–ƒˆh&È(ÿªÚuçÀ3õ<Oýv\e½\ ª3Á-ðjdËB<Ëñ1„>lp]ëL2š}ã¥ë–»ü±9¢ý¸Û 2ýCpµçQçg˜•øYá_<>§ìKZ’Y!f jç!j²VÔóüç©òƒu¢y„ìã¯|ØE/
-yeÉH”XrTÆZ"¹š,y¬BD]G©o›c0„ö©ù1( ÙL2¯²øq‘;WùùÔgVNŸéðÍ9Ͼ1dQH¼¿¦™Ib3qÅ©æUÓS9Õ|ùŒ¡eÖ_äíìƒ_2—ôÁ#îF>sÙ #J$8ÖÜÈëq@ã3MÝrœóâÃvhEÀ‹ýÉ×#ºO½sùšïªÂ‹fŸWõ™rÁ?D\M}q¢h…rÍÈa™°ºdÑú*lð‘Q{6ª °‰T6‡«°9 µM1Ã)Áý]ä+%ø!†+¬ð'Œ£¶ hÀA_Ž ;(ÇñãÔž°ÖtY~®)¤p\‹ku/ÀWôuÒj™²¬¸¬Û³‹¯ƒ“Av6¾’Û§ê.A £}¹=W:R"ûEÑ™4±/r¤ó8ÆÆ«™¨oLl`7D]ÓjL=•Ó1&K´½%€âš}27P$¬1—¹ë©ì0¥ –ÊÆü1¥$ú¡Ô²mNNoëÒ?vÙ \=·ž¦È»Ü?õÚ‡A¨]‰‹$¡8-x©æXý;¤š W…â»@¤ 8Žn-QBN<Nû ¨ÛûR¯hœïÔ ÊïÎ?:x´}­ŠÒ?È“-QC„õÇ«¢üú*ì+Ä€T÷VW[¬Xv‚Ë¿ëׇ)ªué*аiÇ_C J_:—W¿r]¶­ß53£Å¤_8¸ÌÇƇë஫úpêHb—OÎíL· ð™®Ç„ÌúFîl`zBô
-Ò”GíŒÊùˆBLh„èåYøT-xÚ‰9; ¡]–©©^pGð¤ªyá{ÙÆ´ÇéÇi‚øRÃG-’U׫Ðç)ÕmåÒ@}9LäQEº/™îûuáÚ¢çFÉD‡ðÎé0ôk¬jÚˆ êCCýØc¹¸÷y‡Æе^Ëw‡TZ¤r­½ZêäEq pN•:YëK—¬%Ko㔊Gýs¶üpï k.¶âRTdï¨dÙõn03FO£"Îî{Q°þ¹_Îé _Îé8^ºoæã%dE„[ñïâ¥w¥\&õ7&oÓvvsxÌ×_B©0’ +¸¡Ø„›Å"×@aap‹Cªy,öT‹]2¸Böu¶Þ›¦ gR#0B–i5¤â™ë©Üc+'V‚|Gì…ÊÛÚXy[;WyCº'ŒºÒ®ã™–Óʧlüõ\y[ßÙµfÐkŽáÍEÄCŽ@™d×o3Æû^än秭N7É;7®ý¶’àæ_‡Wy±
-%(-3uE…{ó^Y€}ž‡SœE8Žvà6MömG¦Rô昇i}H˧c…WëHýÖò’¯Â!dÄÙ
-ú‰˜áeÛy·/–U¸Â’0ÿdÕMsrî=Ÿ#!@yr‚Ñ›åPÀ©öo†‡™W}%ÖŠ«µgÜǵh2¤º`Á‘ÊAýtµÖ‚0wœ«µ.òÕ×Z/ùJÖZ#Æ‚í:u9ÛÕr¾k–eŠ]éšYÎìÔv{(Ißiàvƒæ©vé7“õÇɬà/RûmÈèOO|a…þè$ÀÖ‡Mb£™"Šöuyô½ãv¼òá9 LžïÚ¸ËÁ)8›ÅŸNÒ½¦Þ=ObÐ9{¤ËjzÞz¶„a7« ­±m<¨bk+Š¶?®+H¿ÝÁ¿eVÊ]ª5VÄb„GæÞýúú§ûß}Jìžb˜ Ï]xÅÿ5±ºkžR'¶7…½þ—BÙèìtœÎFBÎqŠGÑ“s¼p‚9<’fx¬£!­¡ÜŒÇvšÒ4àéø«( A5hM8Ìý¥íé¦.!F¸ž?O2rŠk·‚ë‰P¬8Ž!k94–'OÏu.qþWOwlvmÊkj3./ÿ†LŠ†ô_0ôùŒ«íÀCyî‚ÄÃf¼2Ñ4ð®ªcå S»InN³‹¸
-+³ötfþ6'‘éf+í-óÿþKÝù¯ƒÝ cx:.*~,2…{`‚MYïÿ|÷’÷
-endobj
-2129 0 obj <<
+xÚ¥XÝ—·ç¯à­pOpý1Ÿd—$´Íf»°÷ôž4³ƒ9e†ú×W²ìa`g7͹‡‡‘eÙ’eé'Ñçðý0bQ*Ó~œ,ä"ìçÛï¯`î}O8™‘µ¥ÞÎ{?¾Sq?ei$£þ|ÙÚ+a<ID¾ø<xË$gCØ‚¦³›Ñ‡ã›Ñ»éo÷ÑH%ãûûÉÝíô·áH†ÄA–óÁÇñÝãøâÝS{?™ ¿ÌêMæamãWhÕŸ½Ï_xgø©Ç™J“°„g"MeÛ BÅÂ@)ÏÙôf½_› [³vi§3gRE²ÃRô…`iÊ w„)‹”TÖã‡÷'wóçg,"êÇR°(”É ºIhÔ–òª;.ÂK¡æ‘A•?¾ Ö$˜›¤!œ×Š˜ÃöIï¯-<`à˜äuÓ©Ûd[#OY BqiÜÔÀU'ñ`·Érd4(—ÄZi£÷Y]˜Kã~ç\nô¤‘—Ò2h»C$’…‰
+ŸòÊ4•00*qb¿ó/÷C‘ Ê-i–¤·.i˜‚„ ’L©œ-Ùn§Í î°EIÈ(ù>[@%ˆôG
+Öåa³ úÉ-?ֆ¹Ð¾
+!Ë•"—+™’Ë-'¥^7N`ÖâR€ˆÂ䛃­F× YDÄ:s¢‰<V4γCE ÌhöaüšÏ¦ïi‚â)B
+¿í
+uÔ63¢t°)ÍÊÐõ:3žrÓ‹b¥«Ú‰j³ª×DÛhk ®³ÊM¹KŠÞ r0ù ¦"C ÀnA.Ú_4CDœˆ§¢®Î«euÌíçÝ‚Ðï\\fY~7 u»ÎEK´¸ ßCe³fàÞÊ=¹-¯7'
+n‡‹–Æ­ÝêªÊVn£ì
+Q
+.ò+úÇ…ã»À
+ _ *|( iw®QÖõ…B;’ßf'"0žµßÕŸ¯ØõÉQ;ê!‰¹ÔqùFéÆã6.®u.šü†ÈãZšt)…LŒ¢0ŽÎµò RH(•±Ãž®Rq… QÂ’ ‘nÁ¶\(kAÔÔë²Òd†ÜØ…`< X«ê²ÉUs^Qÿ)
+™GDÛe8,6šA@EN«§AvIZT8¶õô¼1•dx—ž…¤õw”¾ù=[ƒ/ȹÓëgÉÅ5c#]¸å¦tšþóP4™L°Ü¡Ì›fC÷¦)jÑxúv¾ÛCïû9Dðòàd=4P}`ÿ²OžMn¦óÿ¹–÷ÓÝlz;yc‚cK3ûv=kN‘Æ•/EÖùiâQ5@ŠNMGÀ[=u
+.ÚÙ"_bgæt̤T*´×Ž3‹Òæ,±d…—¨v !æû3HCìïnhR
+4ëíÃX©
+endobj
+2681 0 obj <<
/Type /Page
-/Contents 2130 0 R
-/Resources 2128 0 R
+/Contents 2682 0 R
+/Resources 2680 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2131 0 obj <<
-/D [2129 0 R /XYZ 85.0394 794.5015 null]
+2683 0 obj <<
+/D [2681 0 R /XYZ 56.6929 794.5015 null]
>> endobj
-2132 0 obj <<
-/D [2129 0 R /XYZ 85.0394 751.8648 null]
+2684 0 obj <<
+/D [2681 0 R /XYZ 56.6929 752.0628 null]
>> endobj
-2133 0 obj <<
-/D [2129 0 R /XYZ 85.0394 153.4294 null]
+2685 0 obj <<
+/D [2681 0 R /XYZ 56.6929 603.3016 null]
>> endobj
-2128 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F41 939 0 R /F55 1037 0 R /F48 953 0 R >>
+2686 0 obj <<
+/D [2681 0 R /XYZ 56.6929 539.7009 null]
+>> endobj
+914 0 obj <<
+/D [2681 0 R /XYZ 56.6929 500.3546 null]
+>> endobj
+2687 0 obj <<
+/D [2681 0 R /XYZ 56.6929 463.723 null]
+>> endobj
+2688 0 obj <<
+/D [2681 0 R /XYZ 56.6929 431.4263 null]
+>> endobj
+2689 0 obj <<
+/D [2681 0 R /XYZ 56.6929 364.9038 null]
+>> endobj
+2690 0 obj <<
+/D [2681 0 R /XYZ 56.6929 304.268 null]
+>> endobj
+2691 0 obj <<
+/D [2681 0 R /XYZ 56.6929 107.6861 null]
+>> endobj
+2680 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-2136 0 obj <<
-/Length 438
+2694 0 obj <<
+/Length 1217
/Filter /FlateDecode
>>
stream
-xÚ¥SMo›@½ó+öR™îì»GbÇQ‚]C¤Ji–Á‘¥°V1QÕßlg£8Ê¡BBìÌ›·oÞ H¨{HÊ0C#@R”dÓ”<»Ü,À#&>buU߯yB Å)·—ª5’²z ¯
-h #M $)8?E^‚"øq&ô²CéE+ãŠ]ð‚!A#%{g†4 8ãƒE–M¥wÅ¢ïÇU1ÏAJb&À¼µÕæ•T»~+ûlövÛ'¤—°ë¦®<ôÀÎÇŽ‚j©Ý5Ãdæùt,5GQU³³»C×®»};†Võ¶n#Ôam7õº_Û×õËñ¨40¥Ô‘Žw®ÄÜù'$îK"U6}(o«¯ ™Û®nmÝJŠ¿‡®nãa²·‡}Ûí^›ÏöÄ]Ø÷ÂTéYâïÐÛ¿"àZ³·õðûb‰W¬N¢úæ³ÒOÛöQû?prÕ¿endstream
-endobj
-2135 0 obj <<
+xÚÕWKoÛ8¾ûWè(5˧D¢''q““`n²%[ÂZ’kÉ-Ò_¿C‘’%Ev{Ù…“"‡óøøÍ$†q¤@˜)îøŠ#‰pÖé;[˜»+3©…&m©«åèãgæ;
+)zÎrÓÒ%–’8Ëð›;}zšÍoîÿO¨ÀîOÆîÃtþ2ýjƞƊºÓÛÙ>‰ÏQ¢å<ìγkv7]Ü¿/¿ŒfËƧ¶ß3íÐÑ·ïØ Áý/#Œ˜’Âù¥¨“Ž¸`HpÆê‘Ýh1ú£QØš­–á ˜DBR
+yŒ²
+‰Ålfž~]<êx
+Å:¯ÚÐfR’™60M‘l³Êèÿγ]$®ÍççÛ—‡Ù|¹xS£-ï˜ç!åS~™œm©º¤¾%g#ÕP®g”`‚°¯Þ±ÚH ˜íMì!ìážÝel³Üp^÷öªùÏ$¬á«6P·µð©h4 ‚ÎBÆ|8B¹x²–ÔÈj)íú)7û¸Q…¤åeÓÔ€ínPX¥ ¤k|
+á+áfÇtéLqà_˜¬¡:d[3gЂ ‹ µÐšpÎÝëãÁžyåîµ·*Ïê¡â¸ßÃQíÆ°:ó¹|¨’JWì‘nRÙôaXº:gu»¸›NÈèSæþŠ“uܶi»úsõjÚÊCÝ©ƒ×}òi¬qt×P£Gžc…ý×UÞh1qêTŒÍqgúPŽQ}´™0Ì%lS_JSz4+ ·Ç¬ž¥!• Q §êE¶¥ÎÓ°‘ҵ΄7<”p=óß±ÝH ïò!âËžõ&&¶*fBÏàe KÒ¨8›ÊEœw6ãWvv
+Ïã
+—M¸e²wpmI]Àµ–Ò‘ÎÖ¦ú~€%¿l·‘0ÜÁ2EJåw-7˜Z ¾úJÕ©†«‚ 7·
+endobj
+2693 0 obj <<
/Type /Page
-/Contents 2136 0 R
-/Resources 2134 0 R
+/Contents 2694 0 R
+/Resources 2692 0 R
/MediaBox [0 0 595.2756 841.8898]
-/Parent 2100 0 R
+/Parent 2647 0 R
>> endobj
-2137 0 obj <<
-/D [2135 0 R /XYZ 56.6929 794.5015 null]
+2695 0 obj <<
+/D [2693 0 R /XYZ 85.0394 794.5015 null]
>> endobj
-2138 0 obj <<
-/D [2135 0 R /XYZ 56.6929 752.4085 null]
+2696 0 obj <<
+/D [2693 0 R /XYZ 85.0394 752.4085 null]
>> endobj
-2139 0 obj <<
-/D [2135 0 R /XYZ 56.6929 692.3565 null]
+2697 0 obj <<
+/D [2693 0 R /XYZ 85.0394 692.3565 null]
>> endobj
-2134 0 obj <<
-/Font << /F37 802 0 R /F21 714 0 R /F22 737 0 R /F39 899 0 R >>
+918 0 obj <<
+/D [2693 0 R /XYZ 85.0394 655.476 null]
+>> endobj
+2698 0 obj <<
+/D [2693 0 R /XYZ 85.0394 623.3704 null]
+>> endobj
+2699 0 obj <<
+/D [2693 0 R /XYZ 85.0394 588.7135 null]
+>> endobj
+2700 0 obj <<
+/D [2693 0 R /XYZ 85.0394 525.7396 null]
+>> endobj
+2701 0 obj <<
+/D [2693 0 R /XYZ 85.0394 468.6524 null]
+>> endobj
+2702 0 obj <<
+/D [2693 0 R /XYZ 85.0394 396.6452 null]
+>> endobj
+2703 0 obj <<
+/D [2693 0 R /XYZ 85.0394 211.0639 null]
+>> endobj
+2704 0 obj <<
+/D [2693 0 R /XYZ 85.0394 151.0119 null]
+>> endobj
+2692 0 obj <<
+/Font << /F37 1018 0 R /F21 930 0 R /F39 1151 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1604 0 obj
-[706 0 R /Fit]
+2034 0 obj
+[922 0 R /Fit]
endobj
-1472 0 obj
-[706 0 R /Fit]
+1880 0 obj
+[922 0 R /Fit]
endobj
-1212 0 obj
-[706 0 R /Fit]
+1579 0 obj
+[922 0 R /Fit]
endobj
-2140 0 obj <<
+2705 0 obj <<
/Type /Encoding
/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
>> endobj
-1641 0 obj <<
+2065 0 obj <<
/Length1 1628
/Length2 8040
/Length3 532
@@ -10479,7 +13098,7 @@ endobj
stream
xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü
¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢
-Äü{fXE
+Äü{fXE
0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"›
rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ
b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3
@@ -10502,35 +13121,35 @@ $OíœàÅ€DÈ
t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd
ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O
üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.<Sâ¢éX3p7«Á~ª"럽Ÿ“lË´ÍÔDQÿfŒ°Ì
-*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}
+*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}
endobj
-1642 0 obj <<
+2066 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 67
/LastChar 85
-/Widths 2141 0 R
-/BaseFont /QJGZXQ+URWPalladioL-Bold-Slant_167
-/FontDescriptor 1640 0 R
+/Widths 2706 0 R
+/BaseFont /LBYYIR+URWPalladioL-Bold-Slant_167
+/FontDescriptor 2064 0 R
>> endobj
-1640 0 obj <<
+2064 0 obj <<
/Ascent 708
/CapHeight 672
/Descent -266
-/FontName /QJGZXQ+URWPalladioL-Bold-Slant_167
+/FontName /LBYYIR+URWPalladioL-Bold-Slant_167
/ItalicAngle -9
/StemV 123
/XHeight 471
/FontBBox [-152 -301 1000 935]
/Flags 4
/CharSet (/C/D/E/H/I/O/R/S/T/U)
-/FontFile 1641 0 R
+/FontFile 2065 0 R
>> endobj
-2141 0 obj
+2706 0 obj
[722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ]
endobj
-1627 0 obj <<
+2047 0 obj <<
/Length1 1630
/Length2 6133
/Length3 532
@@ -10542,7 +13161,7 @@ xÚíVuTÔí¶VA!¤†n†n”.IéΆ˜f(‘N)én$†FJ Á!¤[:%•$.úÝï|g}÷üuÏùë®;kͬ߻Ÿ½Ÿýìø½
Òy¦§aáèha …«pJí•Ž H
±@Bá0Y $D¤±ÉB¬@¼¼ 
µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þq
-³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸
+³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸
ÿóü{é!Oˆ`zn%lŸš‘†¬"Ïéé—5úÐÁƒÑâ\\£ý:ß¿Þî—¾(Rf~QÂU;(zÕä5¾í|¹ªÌ¶ÖÛAæÈÜž ÙË£ò¡g}ŸO4ÏôNˆ}-lZŒŸöU/Ê{LeÓP[wm©_ó™iÑÅ=àà;>WìýSVz÷|R†g_«”·¯´ÖÞ"®*ØþÊ”°yzÂÜÕ÷±§»ýðîûUJöìW8Œbî˜øL‘þ.Ù”O uJåÊߪݎË;BbubÁï<_^Ë¿Å`i¢KÙÅy¨yc@–‰Ÿ'\;ø$·®Q;S-”âs/, 9D¦Ô#,9ƦïKv²±SÐúê¿»èçö‰%…÷²õ-âÁ]3ëãÝ“±Ñ][™CæºÊlëŠÑLü‹¦ëÀ¢€5‘ؽrô›ìç3üÜ°˜üDÑSjÛðôä)Wï8Ž*öÜŸèž“3@'}~+ÏÝ6‘žˆ•Ø\Žpµ<züuÚ>AbåPóبLbZ÷a3ÒYÍEœVÁ= ¾‹­{·^®2<¿}5aq€©ÿ_5¹Ûðòµ÷>›À¥´ê$C}ÀXŠ¹­œÕ÷ji—û­€G‡/§Œdû-!j¹;Ë6#ÔÜŠ.Oé­×ôÎc´¼$z¾I(ñØÇ/ Wj®½"¹ßKÒÿ¾ð{Lš¿ÞH¥hԻí:iÓFRF<g] Û39}—ÞÞF™8|à0­‰å
b݇a›yKÜ£%t×TcaÖËF˨?B:äÐ 3ÚZP ‚ÌÆŠ} fñφôˆƒTU‡J鉽žj:»«Ï‹ºôN)/ÂÕ äE½¬^gº‹ ^/«k¯&6Ö7%³"”-ήQËòÍ“ ñÆ‘r¾“'#
ñÀèHvo»Vüy½¼Òç³³”ÎjÁÕŸ,_Âh^§–p³/â#Ó„HÊÀç„»ûÄŒ[‡¤Ê»B8Ò¬’%PË ™#¹&}Ô7uo(à–îu•úµÒ95ÀŒ¾?ËêcÕ8—ÄñâθÑ,™ê:f”†.‡Ðà¡ÝõÁ41hÀ›3):«;Ícƒ·ú‘¶Þ,èðY½:Nç5u…QEð ‰rŸ–²ÌûŠ!&.ÜYâü×É ú;á$¤`×yme~b©@{•3*¹
@@ -10560,129 +13179,133 @@ d ¯òˆ¦:ôw
ÕB¾ª\h~8©$‰¼¼·ý˜7!g;É¥ƒ\®cf>}7›ùâžÐÙZسãÁÖ–Ü^-Už&(
ÖËÓ»ÜIFÙØS­˜õOV_ºhýÐn-®
X{$¢½‰¼û£@–rlZ™âɞˊ1o(­¶¨mèö¡Ðé»÷ÝõäIŒ]Œ_-ô‹ ¸Þû ò'zŸT¶n76Gت–·& úìIĆ‹7ÎÔ‰‰f¾<B‡›&ª½úŒ×ž´)„Æc+¤ œ?µÆ(_¹à™ñ0áNZ¬/ˆ_c24íŒË¢—'{.ö¥dÖî§Çz̓¯ÛKÃ{u`‡:s±¹ Á<º'—0— HMq±LåRnC@x›ôs̈W6ß>uä3¾õˆ;)EO4,Źk&l‰#õŽ¾„˜¬Ù¶³ ½höâiF] ‹œx'´ÅfÊb\ñê{Ý?¬¹¶=ê3¤XTÕW©*®§‰\Ee¶©x‘@†Dz:ƒ!¡X¾ÂK ”G½èß>c{BŒÍCŒ±¹0šUÕ¼ƒ¿ªÝ•5xfœéÉU“Nhèòã»Z–$8û훎·òБÞåú¸;ß¾2~%~QÍ÷*|6οÀ.©ó¶H&l]ážçµÐ[èù%¥κƬ!ÙrOxÆ!.B˜“zuW,Ôêr‹9å™ÊT°CHÖ‘_e‘‰ÿð:û5r€û3.ñ4v—W”ò]ª[)ïó–äÙÀ—݈H¾ÌûùSŽ¸+¹ºfS4çHõ¿ÞzyàÂ*/ç%Šâ׻͠Ï8ôæãmº'7…\ì°Å÷K)8ÐÁ@£bÅî\ç±ÄÝÊ‚×[g“©»5é«ÅÖ¡’'¯ÔíÌ¥ºégˆ<‚â¢Ï8TŠqùœ_U å=¢¦#fœÞ*ª6í¶²*æ›\oi›–•`ûlj[ÛW*ˆ»ºœ2Ž(ËtŒp{ˆ¥6Í]š†}„¯>{?'CÆà§5zíEëÝÚÓÞ&vø¾öŠ ÷dYcØL‰8àÇÉu°à•GËÝšÎñtûëV²­ˆ’eÓëû­&KÅàჃ‘oS*.m•»8ÕîŒWQì3ÊDÌûj OpHY²ï®f>×¼ù‰_ôŸö‘Ƥ‰´»ø|EÀ’=PzêîXDƒ%½+C£ˆ1_ù¶‡=AýYœ:&Aaú;æ¬U¾öÝ*“ÍXJ·=à²ùˆ1¦¬ý<ð»©,|# O'Cƒµë“M]í¼æf°ºÜS4‡AÇ÷Mj€“Ò·ÐökxõÊáž™ËG‡ÞÕéú,óÔ92‚¬ ߸gp0o9)ÁM£«&ChVF=Vv¯ñõ­Åž¡üÜÈT·Žïvä(Ê´ãé¿7jzä­ ¾¹Â6]E³ÚŸÉÞeIGOIùç…&˜+ÊZ Sl©
-Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀk yªendstream
+Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀ^CyÆendstream
endobj
-1628 0 obj <<
+2048 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 66
/LastChar 78
-/Widths 2142 0 R
-/BaseFont /ZEMYJB+URWPalladioL-BoldItal
-/FontDescriptor 1626 0 R
+/Widths 2707 0 R
+/BaseFont /ZMEPZW+URWPalladioL-BoldItal
+/FontDescriptor 2046 0 R
>> endobj
-1626 0 obj <<
+2046 0 obj <<
/Ascent 728
/CapHeight 669
/Descent -256
-/FontName /ZEMYJB+URWPalladioL-BoldItal
+/FontName /ZMEPZW+URWPalladioL-BoldItal
/ItalicAngle -9.9
/StemV 114
/XHeight 469
/FontBBox [-170 -300 1073 935]
/Flags 4
/CharSet (/B/D/I/N)
-/FontFile 1627 0 R
+/FontFile 2047 0 R
>> endobj
-2142 0 obj
+2707 0 obj
[667 0 778 0 0 0 0 389 0 0 0 0 778 ]
endobj
-1396 0 obj <<
+1441 0 obj <<
/Length1 771
/Length2 1151
/Length3 532
-/Length 1712
+/Length 1711
/Filter /FlateDecode
>>
stream
-xÚíRkTSW‘ª¡¬òRIÕzX%2yj   `,žò˜{CnIH@Ä•TeYÄF—<EE©°ªÔJ-±
-SÀiaËqªUð5¬««ôç̯YsΟ³¿ý½¿óMóˆ’1D¶ÅP‚Áar„ X*•pØ€<³Ù-‡å‚¡!rŽ@à"´jÀ]Ø|!o…ǧÐ@0–¡Ç‘4¼‚é“$>i`QÈQ •*XCÖPÈÕ@†)˜Ð3H­ë&od‚up&ŒgÁ“Âá
-9DdÄ@PÖXG*f1QŒ ¯
-¼]µ~´rÂÿn÷„6ßõÊHQç/gVH•Ò7‰²½©ó•Ùz]×¼ìæî²Nº`†×Ö3Ÿ¾ä~uÚØ´Ùf¾F}g«êØ~Ýõjx¬£†³%N ã>?ßY`÷~nQ•új\Z?¦Û_^fí?ºóRv̇…æ»^±îeâÒ׶ ±õC¶åI‡¹B—&ESƒqÏŪÇcÕÁxYt¢ývÊ–ˆai}ã‰Ý;8‡T9%Ýs [f-ܹùg·Ç˲d•_¯8Ï/ÈŠ=Êëœó½çâb¥äž*×L»'î ÏyøÃÐ{ö!£KžÄ5¾°ªúÎøV”H†¯t‰nµí¡Õu«›kÊ
-÷HçÖºlx/ÌépÇá5'ÿÝ%¼ÏÚǩˈ—¯O-wûVŸZÌ é1>
-k] ¡GZ±Ç5}M.íÌü|QYP÷]#ª”ÆÎëåù¿ 1²FêD{õþ9œ˜|V@û,|±ÀnÖý®&|þ]j p삸5ùZï—£kwò_Z’Yôäb†œXÕÛgÙø4;êpA5µn€ý.Êÿ üOP¨a9N`9žNù7pQŒ‘endstream
+xÚíRiTSבª¡¬2©¤j=,Œy5„„1 ó$1÷†Ü’ÜK/7”AÄJª²,b£KFQQ*¬*u@©%Váp"­"<ÂòY¤jUœzÁººJ¶¿Þzçü9ûÛßÙû;ßÙ4·Caà` %&G¥R ‡ È3›M¡ÑqXN $'`!à^`µV ¸+
+9
+¤rBkÈ
+¹È0z&©Õ`Ýä °΀ñLbR8
+l€S”šÔ$A•à¿!múÛT&Œg¢€Ç”L: EBªÖVRXáÙ &µü²¦ÖªÕárÍdù)§þ’—kµþw¦I×0¤ãètj üFœ†­fzVBÈÕˆB„¦ªaÀà¬d²W¾Á‘Œ`DC¡P¥\Oá0
+MWBú7¥ƒâùû×N%#äJDêÓaÀþƒ=sþˆI“pDØL6›CÉýö”4­™U`‚¦.Ï Èq\®§CDF<Í
+Á:
+-ŽÃ(15>¤Aoc%Bz
+Ã:XA1ßÀ>[>Þ{j[mž¸ºë¨-=c¡ñð–Žs[O}˜Ã}>N×ð¦"á~uÜêø1rÌ¡t$ì+¤äõSO‰rLÙ2ÖÖ^G“½ ½rŸlÖÅpbòŒKåímïil¿k^lIoò|ð£ûÓ;™çlë×Üãð«¨#E3koÞxù8/mcg¿ÙîKÈ}¨”’T~zÍ8ú¿wŠ¯LÜÁª1sÍ¥ù‰ûž:¿2SÛn÷¤Ý²7
+ åR›ëFßsØtr “ÂÙŸ¶Ø[&X-Î^èu-ºÂ¬Þ÷u3Æúµ4‡I™=ØM ºßí‘ä–†ÆH¢F­tRÔ.Pû†ÔP­á†¶øVz¡ÐÒ°¶À)­¡‹ë[ÂIoÚC[—2þ’öë’3Ÿ$=Þ÷ìµÚú@‘ífåz|FŒ§÷~ÿLÏaz›j{õ3“[œ\õÅ]BäÚg·ÊЮù·ÿ@N˘Ä
+®ç»Ü8ò™»™K¹'×ì­ø—4ÞóëfÓîD±ÎJwýp êáÏ[ û¹ÉÁ })g"oz^ªk<_ä\W83ÉÔ\½¤y6Ö;0ßÍÏy¡Ï\Q¢%¨vš/ôèŠï«Îæ8ñ&Æzèyá3ôCi”©iä°×¢<Û¡Í Òv2ïG.ÏöþÅæ\X]Š¾Ë»î„éûyËöB‘9Œµ{ÓŽÕ†ÕnÓè æì9*hxȱ©È9ûDÔü²/õaŸ.§·ÓÖ_®{D8G<¯JaâqþgZÛPµÏÎäžùh=Ï'1õUßáuk²wm|ðèæÊEÛ×S„v½ƒjºøÓÒ¼×[F{C´vŽâæŽ3z÷¨ñö÷ýˆ`póÙƒŽZwßد–úµRëÏÿglÕZ×Q™ÍVÇyYLР–*M r±\
+§z˜]MRço%O\QSKºa[0A;ôòDui4+Ïһꤗ±f¬JˆÊ–JN©—[͸=sìq©«å)¾éÀÕP~cÅNÈÿVeDühå„ïî m¾ó呢ΟN¯*¥¯d{Ræ+³ôº®yYÍÝe *t -§?ÊþœûÅ)CÓ&«yx¸$úÆZÕ±íšó•Ðh{ gsŒ@Ç}v$¶³ÀæÝÜ¢ÕTê'¨aiý˜n_}h™¥ÿÈŽ‹YQïšîxD»–‰K_YÇE×uX—'â
+šM †ÝªJì?ŒVâe‘Šö[É›WKëï²ÛÎ9¨Ê)éž[Ø2káŽM?º<Z–)«ü2Þï¿ 3úl0¯ßηU”œ{b¨X\s õ®¸74ç™ÿwïAïØ.ysÆXTøÜ¢ê;í]Q"¾Ü%ºÙ¶›V×­n®)+Ü-[ë´þ‡C—…W|wu”tð>i§.#^¼J8¹Üåk}J1'¨Çð0¤uM„nÅ‚ìÃûšœÚý™ùù¢²€îë;GTÉ×ÊóB£dÔ‰öê}s8Qù,¿öYøbͬ{\‰ûô›”þàØyqkÒÕÞÏG×îà¿0'±èIÅ 9±ª‡7ϼáIVÄ¡‚jjÝ
endobj
-1397 0 obj <<
+1442 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2143 0 R
+/Encoding 2708 0 R
/FirstChar 60
/LastChar 62
-/Widths 2144 0 R
-/BaseFont /UYGAJA+CMMI10
-/FontDescriptor 1395 0 R
+/Widths 2709 0 R
+/BaseFont /KPZHNG+CMMI10
+/FontDescriptor 1440 0 R
>> endobj
-1395 0 obj <<
+1440 0 obj <<
/Ascent 694
/CapHeight 683
/Descent -194
-/FontName /UYGAJA+CMMI10
+/FontName /KPZHNG+CMMI10
/ItalicAngle -14.04
/StemV 72
/XHeight 431
/FontBBox [-32 -250 1048 750]
/Flags 4
/CharSet (/less/greater)
-/FontFile 1396 0 R
+/FontFile 1441 0 R
>> endobj
-2144 0 obj
+2709 0 obj
[778 0 778 ]
endobj
-2143 0 obj <<
+2708 0 obj <<
/Type /Encoding
/Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef]
>> endobj
-1136 0 obj <<
+1430 0 obj <<
/Length1 1199
/Length2 2269
/Length3 544
-/Length 3057
+/Length 3056
/Filter /FlateDecode
>>
stream
-xÚíWi<”k2ed_â!˳ØMe['ŒÆNeÌ<3†1Ã,–¬ÅÉV–É’#[Ñž%ÑbJ¡Ñž’(EY¢SïC§zO¯oï·÷÷>χ羯ÿuý¯ëúß×ýáÑTÃô­ÉÌ@ОÉàèch,àB ä² DÆVým •ëÄ!Ò0&Â55Ýi:¸¬ Ú²@"‡ÆdàˆÈÇ=ˆ 8Y€À ±h3¬Z£ ¿;2YX
-Táò™[fX4‹F â
-'/úâ)D;2³Ø6€âp°(T…B6$›‚d€”T¬ƒlË ]$`ÃõÃÑX j,µœ†! f$#fYˆBc—Ú#sÃP Z8tÂý
-¶»(„œP2*6Ë+ÆáoYÔû­t^)š­d—abnÓ‚\-%"%蘦øyz“ víû5ˆžIt‡bÎ~…‚’׶Ñ×ß©ÕÌøhZØÞ–"¤2eÖÍù¾ w…)©Ô”× »Žè˜ËÍ'M¸:ÒãÝ°°{¼V:8ioÈ–Ëçî~ÒÞâ+rîͬt]‹T@ÿÀUQã„{©pNãû@%Ÿ¦ØÖÛ— 惪›(ó§xaåÆ[ ·‡=Ðë>í…Èx—Ôj£{Xæ÷Õ…dïÝ5êíqÕmUJoŸÕÑļÔR¹¿Ð¶·MTŠßÒ&$ ¨Ù×Oš+¼œ:RçlâpÆ›¬çm
-„‚“Çý+QùXP W±
-V+î²ïÌêÔ`_ðŒw8O /L(î³¼ªWÔûlÜ{óZÍiáË>™1u
-W»Gí'oÝ\%7rƾöö:¡ŠÊ¤©œ³?„b&TáüqD!Ï¡øtí).ÍñòÌû%
-wV¶šØÍú6‰” ÜÜkì¨0
-Ön»Úd(Ážú…XjwTêÝÙFÙçþÀùñ€L´²ÁEÙ¼f} ¹H=±î…žàÕ¥êŠc ûy:W|Ôf"yÕ=Û{ØÚ¸—£ôpæ IE´˜ýæ|vb.›ûÂ[Û÷c<îõµ3‹0™p2hàª×*?÷Z˜Í>Ó(yF:þúÖþCêãñtÿ
-)å?ÿTsr0ðõ—F›™VF×Ï9~Ðzèt#p¶¯‘ýEñ^Âjd0  |7•ˆ/®Îœø˜“ä+¶BÌ뼤:œVb61Ò’¬ühM÷®Âª0r<¾tþo/VŸ4,RtÈǘƒÇÓíéè[¾Y)Éy;àá„€C‰6{‡„ïÞzӌ؈èMWy° æ½/óÂ]†9Á+¤l¨ØŒÑûË$¯P2A>”šˆ‘˜l¶Ùår÷œuedÇhç%±¼`EP¼>8·E}Ç`Md@xº•hÌo#­<uÓ™SåG.ùU¥çË]Ÿ™£âÝæ_Z(_È!O/ ïð—(³Áöô¥Å(&×—0¤€wgzåaÂ×^ Ú˜³2’‹î Þ.ý¬îbyŽ?¡.Ýo´ý,“på rÂõ*©Í
-‡7ñT_;´K°V%Áh]§ï%Çùqú»†Ý--®u8õŠn½ØüX¿/Ò9­QjñXÔû¬°) ¡,LzÌÓ\`dîÐÆ_Ñ43ƒšnjSnq<#æ¢ »¼WƆ´†YÞX3?Ó>–eëÄ»7Tÿͯ=ƒ¿\,sÒÒäÉÎÁa° _ÂÒO`sÚÃÓÙ¶ÔÂ×+¿Rv|Ö\öù%dÓR„ƒì±ybîQlk«@¦ª9â³ð#ÇC\F?Ÿ=à"0‹ÍcÞ,Øåu0ÏBssz¿Æ®ÃWì|úøòupSЖkúÛCA›‡½olF‡ ž€g¸u~îìº$Ù÷Ž¯ëÙQíz­-=ÕcÁþ¬>—yÒÂ*¹ë(ù#/¾ÊWûöü»ÊP$á`ûPéŠVV²ùýÛÒ/Ÿìžg¥\)9Ä ¼\›¦¶æ×;µJg;gQ‰šëºÓ
-L[ô̸ iö±•b^=“¼täçÒRyéÍ}G®‹±a¥0á VšÚxGßûÇ[5DH›vlx®¡’qÂîM5·:{›Ví–Jì‚A[DùñÛ¨¦UˆeÞî,žÃý‚ÀȳÖcZÄ£*Márn“JVéÍ>œ£€|¼§øÄÒ »«âhÓ°¬ÚÛL­§ „c_Q®>³þ®âÆ"„B#0¯mWø"û¬úv>¼ë.@SÄP&v^îÌ52
-Ý5›õ‰·Çícüžf„„ËMÄö
-E¯ÙÚÉŠ{}$³OÔ¯—X@|Y}ÓÈdLÜ\9a,]ÊÒ5‘,!¸¡˜Ý)¼.Ñ^¦„%§º)¦ÿþþm‰­ x›|wrŸCóÅQ‚£ØÜšž{—ׇH˜²«q+!¾ïfO¤—”É $ártÌX±õù¹±Î…® )ýõ¾+ܪ‚m‡7|(KÐ/¶²d(å¾7*c¥ÉÝ’xPjrè±FžêÞ R*3S/·Ù]ûNÔªdÎX–-Ï2ejßP(Ù­BÐ/mò~ÓÑyA!/÷º/ˆSšB~|£—d—:ùR¹ßšõº±Ÿ=Ëï8Hàm³O=Q«ôPö¡é¹>?j¿Ö¹2Q‹µðjîšõÙUÂgñ7Õ2…úK»äÑÿåÿ?Áÿ‰Yf(‘alè‡rñß þ/h‘@²endstream
+xÚíWi<”k2e$²ÄC–ÆŒ²Ò £±S3ÏŒaÌ0‹}‹(N¶²”H–{¥Ý–h1!²†RQ*Z,Y¢SïC§zO¯oï·÷÷>χ羯ÿuý¯ëúß×ýáQ”ÃâÔ͈toЊNc©£‘(CÀŽâïÍfâð´½êû@2Û†…§ ƒ‡+*:RXTpM´`€x…NÃàY£°Å3
+T¬%hA÷_!`ÂWôÃP j,Tc- ýhô`Zøš‰B#®¶Gdh8Ñ(lÐów
+ „>ðp&>X 6þïÀ?wp4 R,À$CGò“2ƒ¤o{[<‹A <PH
+  VÞ«ýÐáé4jèOw;¼?hØ¹íµ±pQ]«ÿžæætˆV­§¨kêkh4Ô§ŽÖ¯¬?ôø®Åª‹§ü]+ê'¥ D ¾µiù½­ Á„f@¬Ž¶
+ðO~;:‹B
+béLÊʇBtп`Ž>‚ d2¡CY…@ñ—¤–4H¡‘ Q<ƒøðØ ¤ÓêIA±ß÷$
+T"†€ø`?°ó°oÍáúÅ fRÁê/hµè:ÍeËjÓ©\cHîf; ¿2)í‚9ýÌ< ¶ÍǸÚc½íz®„4)Ëd½`?óäF!áx!î݉’o‘—vÙnžÚ„èšFµH¦“ÈÎczw÷¹Šy7Ec‹!\]4zÛ¢û«×ö0)™Š¢*^û×ý*bK±ïíwS£ a½œF Ê7öH6ßž›W~RÞãÎwõí‚pUƒW_ÿms~èÞk8«fÊ[Ê­LÏ°±ã¦æ’Oyié' HgÖþ€aµÎK.ˆä±æª§D.°_½•ˆs=T!ß\Y^ü¾©ôIAÇEôK%™GËMGšø…šxD¡ÕÿúIq«„MK¢y$Fg—Ù’y6R—}þœç9‰Ó2³óa2¦¾ryíV­©­
+ÌëÎQÖ×pÄå÷’GMn«åv?ŸtÝf»YqŽ÷¦NdB@×fÁ¦£ŒmÐ}𻕪„@©-ñ%mã_•ñÖ¶dÝŒ¡KG`‰üDù¶šË§šZsÂf$áîOœtCUñWxò9ÍÇ97Ç¿{ä± þE*ËeÇÛͺÇ3S£Å†7«Ã¬koO «·jøðiUå¹ei4û‚ð ·›e±|zæ/#& õ§öm 9­aÐÆCîo`4Õñzx½;;k|¦󇮕R…SRö Ÿ Ó6ûaíJ¯Ž¦¿:4÷$ õÍ•ÁÜf¯Ð4Õé‰Ãžwßr˜CGƒòjëÛe#0—.n×ÜõÅËUÛõɵ¬bÓ(‰Û¯­¦ïåÞß 6~Ùª²cOqIìñÖ²þymÂßËÂ'9ƒ‡ŸòD%)Ïèrµ+N¥<Ê—x°¾Q×rÁ½Ž¯°ÿþ«³Ÿ@‰×`®ÃÞ<ÕK
+öÌÃÏD¹¥DíÁ>ÒQÇaÛ‘~‘PiÍYIÑÌzuc±`µ-Ë]¾ ä%'–qUn¹]”›æ”ÿõüÈ)3n–ÔãùË$Ñ ÿ›ímXÙb²aÆ We÷Qd¸Ë×>ôB÷½fZ£|³ô¨ËòBÚåš­—…ƒáo^ZÕÒ„>žKò,’îÿóO9Û!k},Û^ûz žnª}÷êîY•‰¡á›{Þ =5Ì/’½Ñ‘¾‚ôE@O0*¯<uàýǸðX÷-붸\Û*§äë¿oˆSó}r¬¢3,çÀp)ZŒ3(œõÛ‹çµr%­ÓÀ úÀ¹$+ª7ªÍ=5>.ó
+ÚÅQÿåÿ?Áÿ
+â,º?žág€Lè‡råß þ/uÔ@³endstream
endobj
-1137 0 obj <<
+1431 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 97
/LastChar 110
-/Widths 2145 0 R
-/BaseFont /DYYCRJ+NimbusSanL-ReguItal
-/FontDescriptor 1135 0 R
+/Widths 2710 0 R
+/BaseFont /NYLICW+NimbusSanL-ReguItal
+/FontDescriptor 1429 0 R
>> endobj
-1135 0 obj <<
+1429 0 obj <<
/Ascent 712
/CapHeight 712
/Descent -213
-/FontName /DYYCRJ+NimbusSanL-ReguItal
+/FontName /NYLICW+NimbusSanL-ReguItal
/ItalicAngle -12
/StemV 88
/XHeight 523
/FontBBox [-178 -284 1108 953]
/Flags 4
/CharSet (/a/c/n)
-/FontFile 1136 0 R
+/FontFile 1430 0 R
>> endobj
-2145 0 obj
+2710 0 obj
[556 0 500 0 0 0 0 0 0 0 0 0 0 556 ]
endobj
-1064 0 obj <<
+1354 0 obj <<
/Length1 1608
/Length2 7939
/Length3 532
@@ -10693,7 +13316,7 @@ stream
xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP
G8ÚCзÿãºP(
²BÂÑ€Û¬Z
-JñDÛ‚Ñ¿s£`·n
+JñDÛ‚Ñ¿s£`·n
uƒZ|™BX‰¼LLIB—Qdt (<okbu:æ}Ò{ŸíûÑ쓼,Vôâº4¯rèéMûäŽãÏõg\=-äpöæxèA­3gkö£¶Qî ~ó<¤]ÃpÏà µ%l“Ç+Ú:æ¹×w醄x‡ß9}™]²}IYΉ¼­*"ÉVb—åìì²Å|ý~ÎÞÑÛÝÕÙ|ŒÓºNÉÏ*î‚MÈæë”N#m¢_äa™ ŒéøÛÔªÏ!´0sL^µ$0ÙÂÿTh5ë¹[­Fúù{ª\™ÏíßÉúÐâ¦Ùé%üföC ~–fí*!Î:‰EvýÔzð­´÷Û6гßÕ•Ü 곺£Âgü«e‰;}ƒv©b]ùßÖÒï6”‡ùÚ}sø.Gj¢T«$Kñ£•I âQ–®‹Â~ÒìEÛ1w.ì*Çbr|¬½}$oÖ‡·Gs]> Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke
¸éÛR§ö
]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8
@@ -10725,361 +13348,356 @@ QH;ǘ¢&šùŸe“ô¿žUÙ|µ°Sc0R2YE]¨
‡á{__bçâ.°ßþ
LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a
<¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ 
-†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿ
+†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿ
endobj
-1065 0 obj <<
+1355 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 36
/LastChar 121
-/Widths 2146 0 R
-/BaseFont /FUNHRG+NimbusSanL-Bold
-/FontDescriptor 1063 0 R
+/Widths 2711 0 R
+/BaseFont /GAUYBT+NimbusSanL-Bold
+/FontDescriptor 1353 0 R
>> endobj
-1063 0 obj <<
+1353 0 obj <<
/Ascent 722
/CapHeight 722
/Descent -217
-/FontName /FUNHRG+NimbusSanL-Bold
+/FontName /GAUYBT+NimbusSanL-Bold
/ItalicAngle 0
/StemV 141
/XHeight 532
/FontBBox [-173 -307 1003 949]
/Flags 4
/CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y)
-/FontFile 1064 0 R
+/FontFile 1354 0 R
>> endobj
-2146 0 obj
+2711 0 obj
[556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ]
endobj
-1061 0 obj <<
+1351 0 obj <<
/Length1 1166
-/Length2 8686
+/Length2 8911
/Length3 544
-/Length 9500
-/Filter /FlateDecode
->>
-stream
-xÚízUX\[ÖmàÜ¡pww—à.…+ pªp‚— Á58„àN°àîî—
-ìhùgK–nÎì:Ž`7Ð[™ÿ ~Pþ…Yƒ\¼\‚\
-ò[^(>P3wÀâòõù߉ß¡pr,Á®
-{ 9Ø888Üÿ\¿¨¥“£½×¿ÂUÍ@
-òrÿ]ñŸ^üåߨºøêäø—ä[G+'€à?Úyññ¯–ÜAèËlþcFÀ¿ë«:¹‚-@
-ähù·”²ŽN–`Gk€–ëËTšA,ÿ üA[¸A /öüy@/ïþµ·¿y‚,Pçœ,„ƒmk‚[oª$I<XwƸ»ùt®žÝ(xP¢ía¶Ø`»T íJIxr $eɨÛˆU©ÀÁ„Æ‘ÈFó{Ø Jµ±!bã„`Ã*D³ÕŠ¨
-¡!1Lüâè&ŽÿH˜’s íÕ§pJYve@+&=Š­ê„çOvÜÛwQC !/Ë/GVÛŸcÄ¿ <QS°÷ÓB˜l—á° KAUìh˜¼¥W¢6_ã”·a›ÎÎõH¡óúÏ„Ê£¸Öœ™“”ò µvpÝÙ|ùfuW5èœÏ«Èmì¼ÌÒ›ˆj˜·Ù«ÿ¸ØÊl燅ð©·$Ú·ŒM”¼Õ8P!B ¸éXèC•ÔÑtÆ<ÛV¦Ò«³.ŸU¿"ïVtÇåþ´Q«¢ÓeYóŽbÒ¿ÙZƒxS›§ñZ§í\O2~«{E3
-\ßâ»Ü&âéy.ßSÇÊë<c×CÜw*⚤Kø0ݪ¥¾ÀU×”s—¯ÜŒÊr¯Øn g
-èØœvèkwyþÚ‘72çٛ斥‹ÚaGæ¬å`[B×Óà‰ññÓš goø$ÝöeßOáj@³pLñõ[>(™eÔ]Gþm!2¢ë!D
-[D« “-Á'u™¯nòŽ<'Xð"Yeð&­ øc‘#Ñô,åKXÈm®_l™Y¢o׃GÐoR:©‡;Ѧ¯êJ³Š÷ѧ‰mŠoâºë•Bå‚n‚‘7Cj¹sD¼˜<îcØGÌàwÛlÞ—q+Z/½²Í"^Ø|$Go-ÅlêØTåPÛû2oT cÚÝŠùýüÌ yÚô~8!4}"–öj6ä äkÝ8x>9"¡EVj› Y
-˜ñ)l¾ÍkU¾q¥DÚÌå¼S2³òOyÍR¥vHDShÛ!¤ÍÙaæÙþá¿U ¿ë-¿ku§zIúèçÝ ‰ŒPËi‹.7
-‹\÷+í°Zû²Æß5eEmüØyò£ ¿×Sewœ•õ‹k†­bטUÊA-”Šß »,ÎCz7†–#œ$%Ïɶ$¢Å*:ú8¬û¼!Ì·ì«%×ç[âÁÄeÂ[³6æÂîŠî×ÙšÀ³õðù‹Åôm›Ÿi8e>Hg33nlGº®3có€_ê0µihù¡gÊÀäxFnPê¤ëηk,4K§ͯ_MKíkû ß 6ÚÀx.a¾+íÌå”o·gKR™¥ Œ’H!ÚèE=é_–9ºã4? kûŒê‰Z*¬ wøŸOV#•3Ul# 2µÕ¾Aé£ßÚ¿d›K€–¤–g§$ýæªâ'ÚG÷nAüùuÊnûF¼‚›*ñƒ5_ /NŒšrþj{|í lÎC¤r è·Ív¢âr‡"¡þßù¦…µš6#qØFn²‹³9ôgåÉŠEg€+Á öÊL–¡ÀN,@‹%8]è:ÔÊñ»¤>$5o5Ò"“a£ø0ªÃ4v~Ý«¿~õðõ@÷܃3/qviùk'´-âzÞ<öë#n×
-yíó»Ñ€:+ÅIÄA=ÁÅqÇR&…{Åšý ÈÉô\‘Ñ›ll„%Ós@÷j¢¥”¾ì{P¡
-“þ¡•Æí‰÷@@P‡‘»‹©ÝeÓ¸­
-ÜÜŒ”9rƒéÔ˜OÓ[¬™ï!)-oB€û³}‡rñ.ïÞ%¸ÂÙõ@
-º" "†9ûˆÄ«@ŽŠê&z
-§/ÔÂŒV‚¦¢PŠ\Ký`a0Œ¸É0òç?æˆn8Ô&Òm†_Ž'{•ƒ
-ÈxìúYxU‚Äb/Ö[áNŒe­pŠÞŽéPS{Dí÷æØ*÷¤ë½þ[@ìŠô`ŒJ´ÝŒ I¢ömu:¶>ÿC˹@â!±S „Á‚Å5ä!4ˆ •ï¯ÞÄü65ûö£¢M#·Dž^ëgœÒ–óÖp|Ø.õw®òž‚ö§E¨=z¥åÆU²ƒ¬]!áß9Ø)'ª’,4в¨XûrYuPÖJÙ35S1CKX{ûºE†å™ªwïÃ(aÁÛè|êÍ tþ MLªe
-ÕS”Åzo¢É-Ê–¯‘®xg`ùÕ56b]¿¶Ù0-÷9§ä:Э4•/
-‹ÔÈN¨ÆÈ›ÚM„XÉåxÔʈ•xšê®c€‘˜ç$KÁT@üäÛk? ÎT˜þ‹[ìöÀØ”†©´ý²Û7Ç´c¿ÆäâÛê̈GŒŠÈ9ob»ÊŒ¡˜‚üDò÷à-:=N&”b¬Ö,áämŠJ-)¸‡0&Ù{Þ‹zîoHª¿^ûûqN:zá¹HÏâxFbq‡Ô›–wˆ­)ÔµîNØUOíãõ¿ÊwáõAKŒðÉõñL
-ˆ°S‘bð(b¬Ùj›_äá~5BWg<÷7©<Z;‹‰qfvèrBÙW†×KïIl¸)ý1·—$^‰ü“ªND ³(çiºVœV÷ù'±/ö³Æ”ù¸÷¦‰0‘1úµë4/‰[&W£„Xó<ÍÜ áÌzêMë"a
-ú¡ÖMz*xù³Ù™Mœ%˃­ÚUºîC<GëÀ/j °ïÐ’žSäsݹɑ²ò<;/Â& Ü#Í ÐfW8­U†¸ãCWÓV³Êô8½dmÏɭÇ{cÅ®]0­V’/|hÐþX×›fWÐó¢‹×ºö•­‘Î(ª
-!›Ý RŽ_hJK`*twé½Âð!……܇î[ ‹–4  ÚohëðåŽF(]F< Æ©—G©_
-Äê~¢)cGB‹/U¸sP8®mØÇúÒ¢¶`¶Tø`M»"²€œ<Tûh«¤×èÜN%’ŸÆ
-!èµí{8]$W.ú ±ŽRç@¢¨xÀ‰–äð-Aì®°° ˜¶VPPyéëÒ$ò±œpxÚ¯ JÌ‚vÔÀ¢æø“µ$ߣ6ÌK2´ÅŽfPiŒœ™åϪÆG:+-4!8`†©7¬þÀîºNíÑú‘m„~µ5I*0ÿ;¼aƒ°Ü“ÆŒœV:ò³iuxQ‘ÀëéÐ
-ó6-UNy"Œ‹4°™L;ù4±IKpVƒœÀÞ¤ºT ±ØâigÆ%^gÞg¢¹ÃXGÌs§v
-å-òý0òe [¿½Uey Z ŠÜƒ‚¢½šý~Îƹ©Íëw·ï ‡rø;)¶loXë[–ˆ;<ªœ‰¦u†¸,‹#ˆ¯ ±Ê4#Æ–LkžE{èä" Þ{WMÅoão~ªJ(â¼þíÈ?ÙíÛqLºdØmM¢1ö?kæQáo•d‰e ùbÓ
-mUm‡·Ã—ó»@}[ñ½óþw8u"n‰m´ýºß­>?¦ƒé\Wm ázCFàS©þ|í™1ú¦
-(ÿC–MsÕXAr^Ó17êLÙÌžlõ­$/xš®X;õi¢¥=bøŸ1_mb|L½dò¦Üw'>z²ò‹O¼#Ìÿ(€5¸ÒC¬Tpy½’kô:Fd‚yÛ¶±Þ4ÙÏi#¦ôâ^ÑpdѵˆÂú#¬áæË”CbëÁÃ%1“}`5^'\[v¬j ‰vý¿ÆÒ›Û'5\ë±IN"(Û D\ã 4˜Øa.O/;ç÷g™¥XêÄêÜŠ¡šWOWÈVå黤{ýg›ß¢‘ÕR÷w¶¦ô$Ÿ2Így0iƒCif0kgÓm0qÎS.Gp·Â‹' è§ûŒ”nÔ,=&‚,bœ”ËUƒ­üøèpß.Z®¨È À¼®¢O6àøŠÏtó¾I›¿Å˜ÑdGŒW ;VÞ`š#L†ÑšøòtÄ’Ö‰àŹ|Ì’ûÎëžµ¾H°gˆGEŒ²/l“9—w^e ™A]9|LÕX/öU)­;tT#é³/‹ñ«¨ƒ0\Í!ñO¼É|®Îiæ*¿ªV#”±Þ.g)óøá¬]Ú­Å„‹©(üŠý8zËÞ³e”R|6T…HP£l_›UÔbyv˜{²M6öJxEuÕ5½µlŸ!rl‘ĬïD+«<]á¶Z†«×ÇåmT 'j½‘3~jÇxݸç'3Úµ&ÒE…ˆ.š§.ÿ÷| Êu´Jë*‹Ä6·W,
-mCC$³%ɺ¿¾rš³övž]%ØZ™r˜äkЄäªUºN %U+þ÷Š¶[÷þå°GgÍýÉçà¸çaÿ¬Q9®èB€¨¢â&vÚSó
-­s3uÇ…u’Õõ ®]Ãý=rY˜NÊåGÔdÞi<Ô+ßoÆ‚’ôó"hßÇàÀ¿sUòrE© Ñ{zØÞkpO‰(b„ær >_e”iqÎÑ ipemë…¦Ôobæa-Ƹ±.Õ=ò’ó”èÐÅã?0Ábxºœ{ö¥]æÁèo‘êËä¯dŸt
-½Ä»¹MmÎG“¯ä7ñ“Z4š-W!ׂçØù{Öe–”7ÁRš5\ÀÜQ^jRòR©éLYÐ9)˜ÀUnoꃶ:6Јàn!_¾]‹¨'­B xÒƒÅv{FWÚ„3¡jì¨cn$“@¼y\ D,B@nš¬ôÇÈpiÍèïï°FÙ|w‡4D<=Ãa§w&ª
-,;.Q39œŸ£K÷Uʃ™/!Œ
-j6ïàѲËY[M'㣩ëÓ3ëK)ÎdâˆE~=‰ÓÐâZ1ŠY±SÍçw¿
-à¿(žÃÙÁY>P
- Ã{Q”(õ¦ú`í|ª[]˜’·.YMðÉÆ–™“ƒ]ZÜ•[NgN»Ã‹¨×ê-Tt×n9ÑB{^Ù¤â¡?Á’#]ü–KÝcôƒvÖoÚS)ãPß7cï·Ž
-_™v5Ìh­a6ÃŒmäs\mµ1;×Û,¤æ‚pVƒ?Qñ:7i‚ð,yK%Ô‰‚/²Þ4?à'…ÒpV¥ú®”ÊYøÖåw»:/û 0JpaäÒ´øm'v¼ÝŽ[#}é<‚ú$OY°ÒÃ^;W ‹ƒô <
-3M©VÞM` €o³z˜ ™Z`¦›E?É÷c¤«?\ejÆö>îÆø°Ü·M• BöºI@;xl¨Sã0¨ ûŸFTWIƒìg#YNßÙð~+\ @O,¨­ ¦ñåiA7Th¡†QüÅö«a¿8ý ¥Ù¨ó³8Œ±g±ÂC…ì/¿õNìññáß$d×.†”Ó‘µ¡DÅ$!Œ˜%eÜ''¶¢
-ïË»6ä½ã¬#Q2Ï EèÈMmaYEÞêÆ´¼F_wKßûLãqq‡ÿeO-âùgk=þIh®.íéÖ9ûr‹ÕÑÅ)­µ–aJ_Ü’ÁæG&Sb÷~ã‡gŽÝoûé ·ÃAAWQLÆ|C¦Ä,hèÓ×Ê›'jý1ÃʱåwôF5
+/Length 9724
+/Filter /FlateDecode
+>>
+stream
+xÚízU\\kö%‚»înA‚»»;PHî®!x 8 îîîîîÁƒ<$ýý¿ÝÓ·{žæm~Sõp¾o­}ÖÞ{}ûœz)
+U 1Kˆ9Pveá`e
+„8
+l)qøCÀùÏ$AÎ@‹×¦¼Øþî›âöùØ
+¶ü³%K7G6-0ÈÉ ('ù?Á¯ò¿0k +€‡“Ÿ
+qýñ$X8x8þÆiÚ€,ìÀ@—׳ø“‚-ÿ–R
+l±­®¯SiælùOàÚÂÍÙùÕž?èõÞ¿öV ×@O òÊ"ÄB0Ô¶6´ý¡ZŒØƒe’«Wëî·97rŒ=ô7V˜^e»bîÜÛwŸ³$UÇl„+ `•`¡Ã㉥bø<ìøÅ;X°°Ã°`d#‰NYë„”P/駯Øûˆ¢ R¾Kx Ê^P”ÝéÑKL`i„CpHôœTà‰ÉÊò+TŽøñž‚ÏUdíýÕàçG:%Ùmƒ#RPä»géäõQOï±+:°LûÅÑxæÃe]k/͉õJø:'º8ŸlJÛ¬žªGóy乌טòQK6‡ Ñ+íLvþ˜ð‰Å16(ÎñkX„Éßš†+…¨pœº–QÄ´Ôß^î)RêÔ[W,,¨Þ‘õÉ»ãp%n×)iuGYÖǚπñZ¬Õˆv4¹›îµ:®uľõ­«GZýÖ:„<=Ÿ@‡ª˜yÝ—l:GBÎÚOAs½À:rÁUuiw™ª¨,w‘ʽVç±ÌwZ6ç]ºš½žWßÆe ͹„縤h£öÙ8âØYWÑtÔ¸c}ü5æ?°5&Jt”ùËÞ¨—OÉËÛòÁHÌîZ‚pr_‘\OœÅ±„4šß²~òIÝbâí‡y"ûÊ“¬4òŽZ¦¿;‚Àždz™RÑ t[^cíÆ=ðàæ÷Ÿ‘øÜÏ•ä =X}§^ÍóâÓÌ:Ë;}ß %[µ, ýÉЛ>µÞܱ^4AXç%ä#¬wÛ±W:eÅNã¥S¶SÈ“H f÷ÖϦŠKuP ·}.óF!Ö§•"k¯“/ågö«ÉФÁ
+ ê2³Õ°"Ý ÝkÇÃñJ
+¬°PÙÜHyCOÍbñ¶ªß+óN)$Ñd®å]šU$浈—DÚ!΢ê퉆‘´dGGü4Éøp«lУ³LdÒîJ Ò-¹¢TÓÞœl-t=ª²ÃlÌš2iΊÚÞÝÿåOóáQDWX™ ¼ åßSͦ¶ ðå«xÂAÄ¢<ÄQ“IÔ/‚ŸÅe8XW…4XÞO¼ŒiÿÞä]óÓ̇ô+ö`dsaÄÝ´6âÄêÒú6këás‹ƒÉضÇÇ8–²"‹½ö6~r_¢¾;cç˜Oü$µytégÿ¬žñé¼ôˆøy! æ“_;ædx–Vªÿ`©«m%sÝ8Kçïˆ&êîvp§ ïfæZJÛãåªxfÉ°E#ƒb˜&Zazé{_¼ÚH☦τÎ{KÙu¤®€ë™IJSÆÊ=x4ÆŽ: äAºýá£,ñ‹iÃ01bT2l$qm®JþïiÏ`—Õü@;å³v{"•X”IAÖ¼Á~ر*ŠexATöxšÛX'ˆè.m;„E…ÛC·ù¦_ëÔmÆ㱠ݤV¾¨Ñ]V$Ë:\îøCت2™Gƒ»1­– dT4ûp+p˜®s,JÞÆG‹Lúí¢“¨.Ó¸¥-¯¡†“7Ã}‹?ñýˆ²K*Þ@P¿5ðä±Ýçr tWïËßSzy×SìX…»|Û;PRàFá/x˜ìbúðYM¤+#d!&»À¸&æ*I˶ ‘U‘ëQ2ÛañáË5Z#ЛÞöWLAjÔÙ¯é>@“"˜»põ‚Öã;$8¿†²NXæÜG°ìVFPüãï§3‹!ao|n›ôØ\–`Ä9Ù©¦Y"]°Ý1I`¡ØQ²¯ô9WfD$ë%bJ=ÓBM·–Еõ„|}GC¶;%ýkȃ_Â[]Õ¸QJ•)MÓ?¡×(ür ~é9[m;3l }“}Æp%gˤ¿!ríS-Q‡‰<=•]»Å©É¤LˆógψæÌþÍ)j‡Ÿm‹{¢R××ãÑQædÙœNæ<#C=$V㙃gú±rÃÜ+…>ºJäå28´(”ø±ºød•Ø²3/áUFIÏú€.Cw'S»Ռ۠ŽjXPK bæøÃ[HS>õ@‘z¾‡˜„Œ1>ÎYçÑ>ÅÊSÞ³Sh¥£#ʱ¸Ëú;!á· 0/xßydÉPPÜÞ_Àê$…´2¡V]Ò.)„îÅw™é "E2 øNÙ‡cO4 µ[àÖH¡¾ 
+Яªh 0/Dý-å€ÈŒcæ½]‡KºðÂý!¢½ž¿ ÎÐçê!ù‚nÝÇ
+Å øÓhaeÜ1ºÛôȇ>ì0x;J Û”†Ôáz©ò]É”çQÓ
+Ëlå6¹hèÏû©Ü)sýüµéð´ÊçzïüR|Gz”ñEß@«M†!»0µç‘“þ¢Â5Ï;©Ó÷›|3Òáž4!Âð…ßÄo+Õ{w¸Šý\Wá )rtÏŠ“¡÷FŸ¯3]¾ Лù ËŸ’n´3–? ,õŽzíFÞMÎ_6uÑ‘—‰òµRçW¾J
+}­ØüN²îé_ßDЄIxúÆfÛ´Âçš‚óX»ÊT¦
+cú»â«Ì;ìãàc B$æàO|‡féã«îèB¹·öÅÓ¶6›$Xu %áIEœŸ·ºÉò%F
+žP4a€ã¶VØ:!+¤»×¶×î‡ûl ´0j;¥÷oŽâVA[…Îá‰`‘Ú1dËíæ;Õ6áŸïÍ&6ò3ÅŽ Þí·³ÕíëJèþ:g×A6ÉÚ›Ò®œtјûSÓ­&‡£sO1Äõ7d% YIe*sÇ~ö]/ê¬nojÉw«ùèjh~í”®>ŒäXzÖ»Œ¼Q÷R©¬
+)XOAlþ莻ªÇÁCžòšvšÈÊ—\mKéÂáçÞ7Œƒ;vAʼnš„}¢ûŒ–4Yä-ÅŸ³×{#+Hm ~±s8Ì9µp/¾{Ô.Ï9m«ŸÅ%²2궩xWEGÖg=Ñaœ‡ý‘*þ3ì[ã¼"EÉ<˜÷ðê¥pÉJâ‹Zô¹X¤.«‹fÛk V–séGk´#¸ß=ìk×O+n¨A%¶ ¶b§èôÊÆ;Šü$\Ž°èêÂD˜‰Î¸.Jñâ<YÔï€A׌œË¹/?ÒÊÈ« brrG Â­ÐìZêÅæ˜Î92¹sJ3JÞ¿iÅŠ9|Œ@”‡Ê <‰Up‡Eˆ{’`®ÏY•åªØÊ£Œß±7­px|$ÚBg¤”l®¹Ñ…šÏý| !nâKÜQ $?õúŤ&ái²ç£×“4èÚ§´ø†ë|.­8† ׃ò¬WÍÏ,´dUÈJݦ‹04ÞP …M—âåÙ>¬ïFÍ]‘\Jdì?QÞàÒ!—ÇÚó‰
+eªYÜÕ›«<l Í㟮ùÀŸi÷yû\'-f"e¸ÌB‹4UtêïÔ&üú)ÀGML]§Åš¹c™©ÜÜ–e"I3S4››k`ÈçÕþÀaø•ïDáWʸ)ËüÈÐ¥°»&; ­º1­En âÇצWÎW_ŽÉs„¥vƒvžhâן2²g+•Ñ¯ú¢IÌÖ{¸æ®¾Õ©í.׊$9Ã]$ƒD3Icc §Ëþ4žZFW—C™×¯é•Ýƒ¹ÉóD¸_7Ú’ì9›/z¶§ìmZ›ƒñ“¨‘Ð)IOòMq×ð¡Ñ£Œ&Ùñ†*q]O[Å枯ÐÄ£4°Ž4LØO¦šåæm‹Ä
+n²&†°*¼j«€e2x£ŒM}-ZNòCMxOC½…ã¡¡—•¹äå£føæK²2?‚ÀÝo5Ð6CœgÄô,›¤ä’`p%oL¬9l'…•èa¥—4ïõ>Èâƒ[®Tþ{7†¨@×V@õî±9¥ú墑-7!¼çì«=pÕ0:Ý/s¼h 1(šïr’»&Çí4D
+òÊ¢rÈY*caVøõÈ€ØV¤®M'êÞ1V>?®#n>¿ƒñ—þ«ÉÒ£!SÆ€j–©Nj5J6Dä„oÔ¨µ8廿J¨‡Õ+QiÛz¯éØä-³Ö³Uéh±«û
+ÄU¼\4Èòá ÜÞ¯Jý¨»}
+ûIøR1\ÏKÌj‚MM ÔÖ[èÛ ã`R°tžLIþÀbÀrgÎˬ!ÔÆ{qÒrÖðú3<?€<ÓÞ»# tºI¥}Âþu5Pq'žT|Û9<}ù±„K|£ÂZìªB24ý½€·ùž+tEræ¬n¬[t8 šmœc/@=CD˜ùxVúKŒÑ"Õ¥júøý‰Àw j˜Òú¨`Uá›e|©¹…5F:ŠNÈïÁyLŽ»g[âM!2…òÚÞcÊ«˜+6Mx<Ò…ÓñI‚³[x$g¦°ÞŠ¬,³QVûÎëzGË\öí®jÝ«;Ç—“Ío°ˆÄg˶ü,æ0ûD$g7^çZf\‹ÐÛJhÖNžñJY%mÛñ‘”wó8E-7{‹BîRw~_ìZR£ßØu*ò¦§–a ç— ­Ž)
+ʤÕ"57Ié=J ÎüF¦2$hó®4A³¾H+²|Ç”£Ó ë-Ó/ëGÅ?¹¬ÌÏ=£tÀŒ/§¥ô‹RÆb³Æÿׄp1¤|ZÍ&6;CÌ¢ùC/²^úXI=!A]Ñç3ã´Uï/‹H˜-EΰÔ!OÛO˜}-ðùL,¸_`¥Ég­üT’gMtÊì¹8¦ßwb/17 ÷à .ÆHÊ
+E è3‹$-,¶Æ¾+:̆µÔeyø¡úSí™»‰È÷?ÎV›ßõw=€ý$ÿïk~²o™HŸƒIßÙÉŽX`
+‡UžSØ,áµàé|=
+g~nM"up^ÅÃÓíÓêè” ,{!5ÿ8¿UËn
+÷&w?Øú&aÅ/ê?1ê0Öù½úر6é÷&Üþ0†£,Æu;m· uÚä‚úí&º‘ï^C“u"Ëe_(w´#øÕd5J, ;çaÌ3EßÁ,EÕ–¸™zèBeò³ æ:-ÀåøJÜë¥Óbb½¿j‡%Úˆ!í«û0ê®.>h~÷ycLWÜØɱ¢n©.È£sr´nÕVÆöÍZŒˬ‚²ÔÂUŠÀö|¥¿Î¥åÚþ ‹Ç=É7÷N„ V—|¡°ƒw¤¢&닱¿•Èè ñ}¯ö㳂ÌÅïø^ŽOu” Ï™r•‘¿½Lyk¬«P9~gë(ïòZð틆GªDöž;Nþ¬œo™ÍI¥âÉl᧢åЪ!ÔÞ˜ìb‚uh*²Òˆ&úË'cÔns®~Af=çRhÈâ2,š9tX¥Üä]œË1Â&Û'©AX™»ãp …-ζmmˆ¢ðÔýa¨òó=“d£q !³“Nγ
+>Íýøee‘þ„1~ž¹Lèdéק‰˜§òUPG;K‰SH9÷µóO9)ÖÃdøì)Só̇”ùdؾh€vå× ?9kèd¢^—Û1ÊÖ¤Gœ¯¯¢Ö —ü2@vùÈ}˜ÞIæ,h~‰:ߺ$HÖìgù@ÃÔîO¹Óp*@û8¼ÏÙ©zF64¡Ësó"î@­,íþždb©d\‰œ=ãhŸ#§ˆ‘øíÍ-”Un`ÌÔg­ñ3“HR\»q=éí­pȸ¤Šø(âög=:À£³¦Ä'ƒ}ÞXºÝ^ýb©¯-øo¸óÁ‘
+ÌÄŠvu
+˜ȧ„P겄A• ]fv/‚Í–~H;ô„¾u oRùxoù}‰fí0æóÞÕj[+uñêN†Ã¶¤P!%8¼ÿH|›‘]@^Kl!@^) <8›Ž·n|,ÝyŠâOÉ6MýZîzq´:}1üä$?ÃÃJž<Žñ èix±ÿ«]×»+ é´ UÖzNYTm_ ~É­m.7,Db nuM±ŽÂϺaW! Ó‡gÒx 4*Hzé·<Ì04,%ÿ£ëzŠ¦ˆÕÔg”ó¹f÷é8¶Ñéî)¡¸<‚¤ðöù½ã™·t"ú_9ËÙ؉5|ó»9Ä ×Q§XÍþÔn{2θI™ÕŒg$=A.u‰÷›ÚjÁ†û…浉MO´÷ I~b $tdIî~AáB"Ð9ÍÙü97d'ŠÚ >Šªï7¡1 ¹Q\cHj?רQâX!ó¢KÌó= í Cä üë‡]¢U+(}µÌ}‚önB-ý²ä‡¥­pÖã‚–Ÿ8½5üÕ±]‚bɶ[Ò}ûs~3L±Xw’žrº_o=af—'œ=s‹¸à8Fag£Ð|ýæŸÛ†><¦¥ª˜œ:¨¡Ó”¦ iåSât)Ñ °¢$3ÕnÙþŠÞΖú•·_›GJí¤·Ž\ÑÂ¥T§h¯9´KÕª-ŸÝ²»ñu—©Óe¦IùFÆwòÅ'3½=Ê
+™œzŸŠôÍ‚í ÌN†ÊŒ»*ž;+[åñ­ŸB–{Œ~g+bò¡zü*É =x¯Îc9GØý}]e ìq§ZŸµ`)¡µ-MêìÒ¯x5«9Ù©s‡(‰žObõÝ@wk›«`må¹£x!WOŸ§LÐ[óÔ4"–:ëêô—ƒ[°‘»g10Å«š5íÂssÌv³ïÈÌ<S3[‘zÔPE+ é:ûåÁ«JùéüJøc‚u–¹©¦h½”l~þ·œž.â,>œ¤ObŽÐW½E´«iÚ^7êµÈA·ã,»ßô͘O”¥ÍœÓï[§9õÓf¶ô9°åÂ#Ÿ×–6l¦G“š˜Þ1ÊÓdQqÆÞË®sÀ¨„JÉøï}ˆ °Ü,€‘;`aÖ5!€bä¯àbÖl§ÍS*Köì„¢Gµ„ î’Ø̯üLXz¨ÈµÌAí!gßÚF÷¤Iè¢MnÞã?µ-§¹éÏʨNm*°ô²èîˆéE1ô+[çD•½Ì‰Ðö|® 
+ÕÛŸX%`z¼Lõƒ™±î¤Þ1{È‘HÓ#ýEENð=’ôGž»‡.>iîS ®Eò€R‰ÁÞâ–ì–.£aÍIÖÛ^š}²iø/ÕÈ䆪wÅL~4?O¤#V΂öOØ”%';Ãê!“Üd·p²…q!oceZ³sbØàß
+Ðú‡ä9¬PjK¢!zóÙ!ñHaŸ´Þãïÿ¼£êOß,?€úVÐz¾’¢Œ¤ñ¸gTW-Š«XÑèƒðN¨PÊ94X}chAc~‡^ÅûI8Y½-°Ji ¾á.˜<®¯ÇIâšo,¦ÙNì¥#ÊͽÊûÊàùk¤lùnýh2³ÒþÝu<Aíâ$FŒþ¦ÏD!þ:ƒêj%FDõŠ‚QúPÀ„´èÖ#מbG¡³°ï\ùe%mËf›‘g'CÕ䦨 Ñ)Ê$‰‡x`A%*›H«¶#Ì'å;…p‘ûÚ9ß/iÔ¤N…ï#‰yàE×Óz˜8ƒÄÛ¼êpXe€N®Ñ †µ§r%ç˜û7¯¼Çé&ï`Foùª’׬ó›}tW™ë',4Ó‘õÊ™‘8‘À`Z*\-šðú[Ü‚JåÕ®{i!Ux„T û•ˆ¼‘‡ômÙ85û)îÛ¼e¢ý¾KµÔÌ;¨žè{ÜÈ¡¾è{´Ñe¼Žò»~!–±l˜×R¡^n`žTG?ÂŽÎCMž—û[©s¬ ;ZWÀá¤ì`±3iSw-iUÉCW
+ÚVâ>xj„E‹ŒwêIo³}‚üH—ã
+Örú ãkÑnT‚e¿S< ¢x K»«- 1…‹54ËÆa«÷-ÕÜ@ÚUóªîÐsL/}8ÀѶ›Ñl¡ò‰ó9È+ß©O¹È¨qD‹£RKˆ7hëÀûÚë,l³Ž[‹x³#‹³ÆÒ4
+¶ÿÚ®½–ZJS•ñ~´õÓp+S!¨yWC6Æjy.Lä“X5­ ^g˜Â£˜ýÿòƒüÿþŸ°°š9»BÌœí}œ.®ç?þ€‡ü¿
endobj
-1062 0 obj <<
+1352 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 151
-/Widths 2147 0 R
-/BaseFont /SYOHHS+NimbusSanL-Regu
-/FontDescriptor 1060 0 R
+/Widths 2712 0 R
+/BaseFont /HNLRUX+NimbusSanL-Regu
+/FontDescriptor 1350 0 R
>> endobj
-1060 0 obj <<
+1350 0 obj <<
/Ascent 712
/CapHeight 712
/Descent -213
-/FontName /SYOHHS+NimbusSanL-Regu
+/FontName /HNLRUX+NimbusSanL-Regu
/ItalicAngle 0
/StemV 85
/XHeight 523
/FontBBox [-174 -285 1001 953]
/Flags 4
-/CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/H/I/L/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash)
-/FontFile 1061 0 R
+/CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash)
+/FontFile 1351 0 R
>> endobj
-2147 0 obj
-[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 0 722 278 0 0 556 0 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ]
+2712 0 obj
+[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ]
endobj
-1036 0 obj <<
+1310 0 obj <<
/Length1 1624
-/Length2 8579
+/Length2 9769
/Length3 532
-/Length 9445
-/Filter /FlateDecode
->>
-stream
-xÚíwePœë–.Npwkîî îNpo Fº¡iÜ‚ \Ü!Á îî4¸CȽï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕLôÚ¯¸dl¡Ö E(ÎÅÇÍ+лX{¸k@!ê\²Pg[-kg0à Âdb’ƒ€p0"„ƒÄ† [€<ÈÀÏàÃdÈA]}``{8€U_׃ƒóŸ’?*
-ÿ†‡;bÿÏ80=fë rw¢yâþSæ ø/Ù]]}þ²†þ¥õŸ1€áî g;nL>þ'Ÿ6ð'ßö`&ÏŸaQØA|¼Ëm=\ÿy‚`ˆõÏÌ°=´…Bœ}
-«_5Ücâ->³ß]¶UÙwºHY:Ó@'ÔÏÙ¾¬2·‰pì„òX”àdÆùΨ¯£˜óìlŽèèZ|ø…F3Ö&
-qh<ë/=íq|ÜÞ>“f¾WV “Ž]m(;Íe J[<ÃaÃlœùb\¾¡ æúžè×}#-#ÈÉq©¾çeÏ[9Já¼ù¢_¸ØWaøáÖß
-ié”ç-ÚX'ÕE1xãÕ^r%LSõ)çœ+眛 Ë
-<Hh–~H{ úýÖ¨¿®_#ø{Öq»†ŒRÞ}ËêàáõwuÈ­5/‘ùfXo0º²ÙȨ~qÑÔ2š^¿—•tËLg¶M–-‰—
-K1<›@T¨p\¤’‹¤«oë¤Á‰Ý3´Ž'öä÷6Ƶ"n^Þ#‘µÓ‰4Kל‘(_§.‹Ué¾°PµÏ9iil­\ «|¥Wñ¬=ò7>õÞÇÂ[&Zêy#ƒ0Xæ]&òCO#ÅÛ¤ø²¹2Eí úIlºgÌéÝ·akÃÎÇáòû¥Næ ´ÃöÚ™5ÍËÓV¾“/M,-±çDÇZÛ>Wk˜DCÏ7rRIÝŸ’¬ð1È‹diøÚ¿Sü€Ar%çÎ{*“AèÊôŽÙ.… ®mÏ«Í–ÐW®ýkD -ca¥ˆ:ÚŒás#ñ€îÀpolí›ò¾°ÍDŠNsíò2¸‚Ö#Œe
-·&üÖ!Bë}àBA¨ÛÀΡXÐm|¢]æpvKºXKõ‹•‚Eí3MâɤáÝìdtÉa~´K_\ â4HÎý**iœ·É\Ìe:ŸHÄ6]«W•}]¿­ÑêS%S´w< Ü‹åîOìkkQ^¸ù‹Kû`ïJí¦¼W&MÕ½%)–›D6Bc<\ë¿ï’+8H„
-uŸ1Í‹K
-|TúÁ.øó-x{dœñØZWäû¬eÙ—n¶R^v&ëgD& Ê&>2P&õ£±•_aG*Þëýï°`eNNAU{yßÅi\îÓÇê#‹0xðØï†×c¥•¾\ûõL$ü•ü¦ð·ÒæªØ,ªl'<]ÔLI½à†ž­Ñ¦°¥ú_Ûµtk2aÁŽ§ØÚC~4¶âµm1²¯I+ðí^a ¤Ft(†VP É Ç[è>C×ÿ:_!yà»uµ ÎVfVúôz–ÙÀOX¨{ëµW°{מQcVõª)ÝŠ…?÷dɱ8~EÎHo<O?µÉ1Q›? N7öÙ; ~­Î6Ä“´Õ"ݾ2.A;Á
-ùzòÖ€Ç'éö±i©Ým¼…Vk%ßÕ’·3ÉÄ궋åË+Üt ¢ 'ÙèÚßF¦TÓ'ß{öÛR?SƒÒÚ-búpVûȯ×Ó^D .P?ÎöMF,½Ö—BåIψWcâ·å}eâ²ÔèÙ7lÄŽÓ$•F/
-Wòí\Mߢ[œ¸ò³FŒ$¯áƒc9Iý|Ù—r d ž…C"ÝÛúÎmÌÔϧ>)3'ï÷*Ò]_™¾ÓÄÔ~Ÿ®vx¥ÞòÊ¡
-wøvÄü¸61vø'6çlò=n¡íˆc–¾Å[확;ýQ3Z¦Á„äô™Ò+~Yq"§÷p1_—Ï<!Õí;âæ§né© 6×ÞË!ôÝ*?Ö‚/Ø\ò`r*ËšúÑtØ´Yó&×NŸ·d0êë„«’k{%Ø!£ÖŒ¯ª=~ s‹úŒÍc|Ÿóç}¶wý>.pÔáò[ ¥`«Ë„‰ä9“2Cƒ‘i‡“žÆáWö.—6Æ™ÖE(}Ruã̱«˜10Ë _S0-ÏkH“¢JéG³ÂÌV³ßz/gѺÇ;Öö#ejö¨0Øt5¤^yE½mqÝ(X q(Ú2”*n#œ³tWtV¡èžã`Yõ±Á±º l/W¢Ù©kü:e·´\úö†K+=à7éë¥ý7§B´ÌYUÄØŒbTáœü"¡ o–ãú£ùwh rU ‡¾á%y›?qp©V«?e4¯Ue iPŽ—YFüF$Má…­s¥E>œŸ²G»ˆÏIÝ®6‰"t:Jí¿Sy“]Åá·IߠȼhåiÖ'«šÜÝ_Û¯Abí±šŒbuQç“:)õ
-ýL?ë´êpUn¿TöùVnEÁê?Ø×_¾´pãúâ`(ý”b z@¾‡ínüºSw©õÙ,"ÃeçÝ4b‹x™-R†ÁÊÚî™â “”„üKKëšÄ¶´Ÿ­äü”Fõ.Ÿ1´c~¯U¹¯M]p¤)ûIoΰ2$Z`8+B5®Óµ³ÎJ}ô²?ä\ –³[¢›.ü ¤Æ°Yd¶SêZDh»¹áYºœü€~IÒG>\ {áxÊ/õÉ®[ávÅË/¡‡')Ù®oº«;ùqÄuj 4Ö„bùàgÈ•ÝçOñsÆJŠwí^ùÏõ £†þè©ÿj/(xý¬Úñõôó//]ÈÝÅüæOë~Ó×ʶ•àt`e/ûïè ãûcOû) …WU/“Ñ‚¯Í–Þ´Gù­ÙïÜwTîÏW.¼)ð—«{žÿE4%ŽxôÕ×ñO‰Ö¡ìѱüBú®^?² Ò7Ú‡6i–”“´šü»;ÈÂœ{Ô¯6-®dó7
-DŽãlÀŸ_¶—s@“Mú§„ây¬ödæº/ŠP‡}øe(x¿ÔR^¾ŠÎæ
-5ËéZôO±N>%¨ˆ¹aâôOZ3)€å}íÖN¤§fQrÍ›d²~©d›Ã«°]µmä_—–õo‡öé´6š·§¯t`0ˆ'¬bXšz˜g­âA;Ìƺ‡:ÄŽ/0´ ³’YÍ“Ó^O¬œ.~èÿé“1 m«ð(¦Ìÿ#~+ÿÄ@è…†–1‡¬üþÖZš‡ÑÏMŽc…#ë,…põ «—½ ãQ›q„~ݶDwRÉ­±­ðç}ˆãêЀlqâÂmƒéN¡òºât»ÉÒy•qÝGŽó©6ƒïXd,7DýiF}/JáP*Z°ýƒ[ïÊñåx´NÞl¾d¯÷ÝêèïM‹Í¼:,ýdÅx#µÅøÇ—ÄæÂч7jèÜÛÓáöâ¡Ï˲¬¸x›·wê¾Â'_=Sz<Ï,NîË!É.öš«çY¢¬-j=-¨¦a”%m].'Û¦œ|ó+êçÞ Û!)Žoh\ð(~r£hc*o±q× q+fõ³ïóäÒå62†™·«ª vVij^×Lb‰—'ä¦ÜÌÖR8ˆ
-à–¨ÞÏÙCãr±`Í1º'Þ3©$.GæEHÇçʚʗrhüúŸ·Òb¥éuž!&¨qΉ6öQnªÒ$:ZC}˜i%¹Ê­»ßàÅË]¡;J¤ü¥íÄáÈ¡¥æê?^0ß-±9,ƒÖ?¾oŠ¯*4ë™XÏ¢ÔVúåœó5Ë%`*fÝÓ áõ €¹Jx¬ŸÁ«|ÉÜ-MW¸Æ1–Máù*ȼRé¹!;vúŽËE”¨Km
-ÓD‘ˆy“ìÆæQj})ó½¤dï=¿èèWh£‹q>9Öžc蛫w¿YøIoÇÑÛ>;V;Íúå¥~$»Ï¨AÒIK(¢Û³@Õ0¦Ô£20¸Ê )$çÔ*í> Lª×5z(Ro,ÙõÝ#ÿ}àQàÉçÙÛy\1°Èöºc.FÚËcuÉÎÎý D­P”0Çj XS;ióé,¶hqPÞQ×I®y² Y%Ó&tÅú­;ôþþ ¹„ÙsQdÐ+-\yª×¹L&¯Ÿc݇)ùÈ69ëzTê|øÚÞo–ÖÕwÙY\9C
-¹oú•ÿ™„WÀ ßóÇÓNV]UÅw¥Uf]F}å'Æ ~’Ò›Xœ#Ëçž¾cvB¯W/¤™iÐÂò:Èû°?¥Zï³ÚÜt!r¨±w(P¶¨^á ô Û}3e/¹N \J¡ñ¢ufý\˜‘ãLT(1 „™YÍdãºIé;o¤äú9oÒ>ÒçMªá8rCŒuÁÀ߉DL6¦ëÕŸ¦D¹í[v¿ 8½£ÉICxY'ž%¸)4ãl¤Ã!þ"2J)/E¼4²%º㉜Ɵ1gr P
-×¢<Ð;’A m
-b&c,±í™Ðò´6@ýMãÇlå‚¢Ý+§¤õþŠ´JX)Ò~Ú ®~_òŒ`|µ*ÊOw`à™]ÃtíÓ?³Ý…‰ÎZÖz¾xï¥<QFöè>ÝQøP&_DFáî?¸jÂÎóï¨Ùšø•À„¯çäHËlÅוäÀŸ/¢p«·ýj/
-¿¼I-*-]‚×X![0O²h¾µuí©±°njî¼Ùõˇix6·ÇüvàÁ~ó©O‘Àù‚˜lMT(Ûf™)Ea¡
-«f\‡Ð¦¡$ƒ±È=Ñ3{UvŽyo{VîÏë ù P`üñŒT¶Ve¤âZ­²<§EnÚâ)ÚQû´%¾ ¦¸7ïI¸tƒæ¹H)w)I¿¯r8Ú'‰uŠ‘VäaÊ^äZ¬Øy·ºÉ’ðô`ù³d^z¸)Æ6Â:F´lÙGNŒî;T“Aß<68açÛœ\Í„˜P&-‰*Tù–†‚û9n‰ƒMŠ.Ö _®¾˜ì»[tTç5u|e±ô(z¿‘1­ÄE¤m½9FGyü…Çݲýu %b«º&Ü“k®[“Jf—õvbè,úS0ëò£KvæOìÂT€l,Jc§wyÛezŠJ{ÍG¿+Ö¤²)¹¶Ú¯ã5ßõzÕ~^Ñ™,UËÜíj4¤fÒØÜÔ–Ÿ"^£Î|ÏvDÿpï2®ÀžDrng/ÿ¨F1}ël†±ùÝ/àíÀÈ/þ€%À!yjå—rG?v’ŠÁ÷ão¿1ÎÞVlJq§FÅã®|‰ú^òñ{¾°ì¤&>M†J|)§C'[¸@wÑ„¾»üë’N¨€‘ÇA,‰MÒ[PÊqu RÏëgì N™*>rˆÞÌþs“°Š¶ì×,¹v¸5½âz*¬Çsu€yÂ
-wñÈ6úà ”mÕé²ÂþYTñ0¶ŠŠn˜ÄVûÄ*ª¾“z<ÓËåoœÈ-ÜÌ€9ð®Éü̸˭ojÊÁª&ÁU/ðޭ목;íNˆ"ç}%éÁ´ä}£‹>òΰLžž4^ùÂí°Ä`üÃ\½[s!ªÝÎLð.ó¦ŠÜlµ ò"±Úu
-Ú匓$S¢’ 6CSûT ßé3çDIЩ49VTÑÞê_Eb:ÚÃæšúa,M[a¥1a=“Ûÿ³6]<·1Š\KŒŒjì…¹¯ònð /u Än锊ê&½7Sl x±*#Á ÆxpC‚yC[ >F=ÂT@Dæ©F ¨j`ŒT-Fbj ×t0ÿJ"Ã.c0@mY{PJ 5¤Ì'¶WŠô(æ
-w:©ÿrŠ®­|¢©Â¸¦z$:S÷5ýe!Óné³úÇÈ‚®¥kîciqç`“&"Œ»ñ¯[’¿ +Þ^aæ’W~Þ¸‡ï¼¾L¥ [þ¼RB ¶¸¦ÓP?¸O/Kch™iÆìɶ69eý«Æñ0C¯zÚV»\€3ÓF6F’×PK(Â}<….õñG¢7uª–íöx?Q:¢/³«¡ÝUf7ù0ýÖgß´—-hyŽéT¤ÂpÕ äX´Ùð!Gf“$~°Úù‡A—ñÃ0¦é!Áy[<mÒƒýÇ×?^Dtú¹Pi(‹Å¼¬ŒfB)…iã™Àòfr°.Á}ã4<åòXFj¨ž‰.<P?ó°-—RJF6Žr¤•ææ\’è¬ìÔô51^ßúkÔkÝ ¢ø²ÊáuÑ„ªE¿…û¾ ] +9Z@ÖñííwÍ®¸!Å4¢mee&®PÖªñÙÊ\;ÒAª{Ä-h'æ!z}²¨ª5)äZ呆π$‚~WÏOLŠSá+óÉ'½-±sꨙø˜\I¯m!÷²ïY½’똟“Ù¨*Bqä¡*¯¨ß$7”ïæç]J…î%~ÌNoÖûšÁþ•_6låÅùÝukA³ Ê–‚ŠBûþCñÑß‹?{šØ+/øxõš/c#MÎE ¢ˆ$YN?Œönˆy•»ndvúv¬í´4• à éºñt½~¸õ¦'dFX¼ü8a
-É]g¤ÌÒìÃ<¥)7‚Ñì¦aìnd0² ã‹ï»¡.{tm)«ÿÚ;ðÅû¥™¢ËÀOû&*‘8$nÎ ¢7ï A
-/TÍ®vi6Ð9¸Í>4â|ßï½@G_C )$œôÀÁ¡S霿<+sK…¦–s5KÃóøêÄ寶Pþ}JýHgëeC÷ÁUf2‹ïU ¦(^9g­5Þ’‡®?¯¸ËÎïPrtAFžÕŸþzo…‡“Œ:¾æ$žýf¾ ÙéÝ›S”¦]¾‘õÉŒ·‡¶3­×žÂBR­Ì]þ
-诮ñqÂmdàÔ`7nƒ¨RWºÓE[œ–™Ù6‘9¶?`ƒ=p®ç3Lã,oئDLß÷˜¯ÙTýŽ§Ý¯eW‘öîònQÆ—a)ähF%ö¤5ÙÍqXÒÜâDÍPá±S)ô|ÒÞôÔŽUYïÃÛ›ær¬f~0?rén#º«mH¼Ÿú„Âl#¦u¬…85ˆ#FìEeU§ ¼¹Ô_ k<ÿk¦°ÙbA%R7@"ÿÔ÷»Â2aë}ñó± Í„½![/©¬‡DpÙn/Éo ´=ý!"o×Ï¢ðœoâ}Nó’Ïúýk'´$ó ’;ŠTÅã8æWÌuTš+Èó
-^õ,mÝ>µsªÇÍóQ™“™:…&ÚÞ0Å(ÛHj…`ÌðSòèí$¬=Ý3UÊõú”ûµ̒yæMŸ"¦*lÊKÓã)¯ý¼ð^lØb$vÖˆH 0癥l{<
-ø_Ê'Œ.ÌGöª‹é–Q}é•.t(f2‰ûjéŲ¼[Õ
-§m#dì^Àz#ÎHc3ŒÕA›Þ@4ýÆaù ÃM¸gGs´+l®ºhXÉ¿N5ÙbHË5toï<Ÿ¶¤UxÑ£(½¶§b^j
-Ûó–ÊŠEVÛ*l‘(¯;Ä¢føqOóÊE½WÇçT(ÝkEfAó¼žýÂ
-rW²tˆjêÏé
-¼õ¥¦Ø[?°qI„Kõ⬟5~•)ž¢7StûŒ•_ÑባûŒÒOLû-ˆè•ÕóåÉú¹@¡dÉE’]_VJDù»ýõW……¿].²dt~ˆ˜ˆ ëM„í[z:ð1¼meãðÎW &If° ânË5èŒqJ ùHçq$?HÒàºN÷œ³ÄtÉÕ¶øhÎ=øi2Ó1\‡>ÆQºO€Iep3ó¡5_€lª§~—å6í×ðnþ4à ;h·M±VH½r4­ÊvV & ¯Ž¼ ml߇K€#×?xÇ”³îL3sÆ™¸Ö‹ô¥{Îcj+;ó÷ˆ™¢à#ÃZIü7£aÛG+ˆñøÝÔ›QEíÀ’¢#­ƒ™)­ìÕ¼`¤øÍíø´) ’J±4ŽL_$/Ö.,ÇÑYéácòwjÖlžvÉ[ÓáþhÉðþð‘æó|[×L.6y¾WLMèJÕ€¯ŒþØ;©>âÏ  ‘Y‰è4‚ïÓ+Å·®‚›m=Ø”°YXÓIp}å°ñ YÙ߉ŽqûN<Ëúæ=´ûÔg·>ÚܼŽq9ºT†¸ÃèGSyçm÷p0ðÞû[  ‡s‰³3 Éî%ø¥/ÝðúµnAi•wÖ,[é5SõˆcÜÕ°Öº×èÏÕÇFÍ,Œ;nòAï-´´€Ä߬ug¬À!ˆ <*’Ïã´ñ—Ü›£D•îÔO/ý-?*¹Ww×%sUc‚ö6a u¤´ƒ·¶ªVq«ù|4F;2¤¬«šßh1Î2éj˜ô÷8æºÚÀ¤¨Ä•½š:q‘— 8roBÎJìÞÉK<<æÓ?6tð4)=Oö¹nÝ úy33ç4ç«"s_ʯrXZœ´¿":¿y€Ø`eóúþèÇi™f*õÀdP[S Ú^D$24³ªSpÙçr«u +¯X£ð\½àá)™—Úùìû.¹ò‰¬vY·S‹È¸w´þÓÄœŸ£ãì/âìœb†Î#aÂ]ôG1ë-ñÒ8;iµ¡ø LÃ,c¥&]#¨£V¥¨wʈտ™f_ŒWi—²]Šã—â¬3—ÄGBßèòQB]Pö½!FUßs³Ó¨ú­™¼‘JÂÀFGíÂ
-†Þ[ÕñºòŽABjÙhaLMô\¸©·UÇ2lucJQ¹ô@!5@ç;*>ƒìïâ _\Hñà‹Ea{¢ê’7ÎV[ˆso'Ƈ.–¼{èãrœÇ<˜Ê¢©5û&/gý©~ò†…p´F7Û,‹™éÞ& ƒ–PvZœÆé<ÙX<Ç~ÚñDRx›±Î°mé¿,œÏxIÀBµüïgE/Hý£öÓçVB[1úüû¼×+,(ëÈj‘õ8¶DšÈ1éV%á*>ºÑÌÏ-ÉbW®V§…* ßcoÃÉ«Šx›B¶>GžÀ>­š-QFÜHÑÃâ•°8ð8—ÿTO¼VJ›Jfo!ŠËKÌ4,pB@<ɵŒhÛ*ô¬W¤ˆ¿™Ù³[¯6€œÚ§óªE:§…¼L¤åê•B¼¦aíe®7·víÀe™4U8Žm]èÝÜA±ÁYažr}‰Í#1ã™Ûµ*j”ÿ ÑŒáè+àu–L _#Ƶö»Ìñ˜S}­—qmm(›1öÑà kªuÊ}$ìL„_hH÷,½ÔtÚšw½álœADöâ‹Ctkôq¶ÁîV1)Òö" Ô»gFbØ_ p(xÿ—ÌÿOðÿ3ƒC]€0'Ìÿ
+/Length 10632
+/Filter /FlateDecode
+>>
+stream
+xÚíveP\í–.î xÒ¸»;ww4t5Æ5¸Á=×àÜÝ‚»k°>äûî™3uîüš9¿nÝ]Õ»ö»žµž¥ïª¦£ÒÐf“A-ÀrPG;§0@ â`áê¢
+uTa{µ©[ØC
+ÈÉú¬áðŒ=“i@]`.–Î'àÙ«†ŒÜßqÂl€°?¾] Ï0
+ÃÕâhýÏXÎ`k 3ÈìâòLóÌý§:ÿÌð_²:9Ù{þe ýKë?c€À\ÀöVì\ÜÏ>-aϾ­!Ž†EÑÑ
+
+àâü[ruúævþ«@Œf†é9 êhï
+ktòó* íþ)áëB¥æ÷•!ìµcÂMž3‡NÛJÌ;/íÚ“À'¹¾4Lyø+ô-,;¦…Ø©GúÑÞ§ßUÖŒø9õv6F4µL îQ(ÇZxœÑN¯™hÜòi¯œpü,“¿Æ}ë…{Qõùðˆ>aÿúŠ¡g°¿¯·ý¹s›œ%+NÄ ›>*à]¹„‘n©w­¸ìà0>¦I‚Ôõ’7¶_„›üë%^ÍœKüÉâWöIñ‘ë¨âx&CêŒm
+ä¿àh×ñ€F3>ÒaáÓ®GÀÇíí3IúYbɘ¨•šâÓ,&ÿ$ˆ)66ï7¿ï†%ër¾Ê_îoj_Yüíl§¾v‹w'J‘ñwÛàÎ}¾ÇÁú„l±•÷êµÂœé7ƧøêjܪŸl±Óä½
+™ç
+™zçFˆoxDÔŠ
+’ÆýŸ ò¸K`º•ü~O3¶Û•Äd2.›ïÈ"oÓª›+sÅ¡9&˜qèLÄä÷,Ä”U´Æ—ÀÃâÂ.©éÔ–ÉâEƒ€"~ j´ xÙ
+ÛrɱÐ×_[Ú)±£öô-bݸ= ñÍ —öˆÞXi†šÄʨ}— )Y§(ŽRìº0U²Î<©¨m.[*ÓÖ)EûšÆŽG±W_óâšîÅœ^sÆ•U*âCw-ib|Lñl±œt‚z•ìqz«ç£©•´:lÿ#Xæb¿ÈîmÍ«akÔÊÆ¥is¯Iq8?#33¬YÁ±æ–Ö
+U£p¨íùz槗÷7§DË\Ô2éª^ €4¹œ¢Ë0i΃@©”NtiôV øÑ-{î- ^ÒßúCŠQRæ—?S„›P·Öh ÷DUÅ•ôm| m«QR¬Û|Œ¾ÄCún§¯yè…Å>p>7ðÝÀoì#O!ÿë˜V©Ã¥ ÉBMb˹ ëgj„“ñ¹ü·]Ìį?y¿ZìtpKqtŸáçí¨84Îd‹Syþ¾¬Ÿtv­´‰ß®U—^òȧò ²®4-íÌ’ÏŸDáYÜ›wöjt¿Âî}Ä{µóÉŸü^9ƒ›‚'¦Ežbõè>ÝL»âï¹8j¯(¸¿Ò10#·ŸÞy¨”¯_Q˜qÊýªRM­¶#_ì<Ð'Þ:^ìö³¾#ý½¨¡&QZz±ÆÓnš
+0L_ÅÈ™a攣×w¾js¾ƒ¯kc‰ÓoÌòAoÔH”¾•Ým<ìè·WpÔ Ç>£E/óMæ¨
+¢Ãü)Ä‘‹™”!‚¬QMžZVçü£ÅÙ?f t˯f'+jÉ 2& Ÿí¬1~»3Ù]*¦eæPˆÁÃ
+´(®×áú7¾õu³°XDsÎФ-ßæ ‚ä< ]¤UO_CÑ÷ßC}Þ„©Õ7ã«$³$~©T)*üſתŒ?p3Q©}ÇéÉ“h†Ì ?‡'²½KµƒgòëÎA¸t,´ïG—½Æ2ÕqJv¶"ùÄÓ/$zÀ¨Âo>Óxùå„?æe“`µl˜&eo^äkbMšn«Ä6-ý…ù.Ìúo$KÅž =_Í@Ÿq¿úܳ}ïð¾) î†QZ}GN޾Ȁ"Ÿ× k¾Åš{7&H¢ñ©5ÞbTü®ãÔw6”ˆø×g¬F¼×ØNF´b¸ú ¢L¥p1–Eñ‹
+[=@{TÌÏ à¹ä„á£úVBØW
+e?«ïÀï9Ìüï†LßÓ;Rñ÷†yá ZEåÍ´% ¢ ÕÚeªÄ&Ù—dwàšÂ#ºŸ1X*Bè$XË5Qt*Ñ"ŽNÙ²”äÞÆx©º…”éÙ)Ÿà7,5Í<²wážÿð€¿($ò/ öý²ÉG
+©^0?J¹Þ%S0F½¹a[A3ª_NáÒŸ5VÿBÏ~
+þm!u‚±Ý.óû<¥X¸L-åÀ£~Næ;9äWh·¤ý/"Ù+‹bˆJú;ò®Ùf—ùMØÅÆ©ƒ’™Š”µÔ›ãÂYO±"X{6´¸8ÑO YÊd–`+…þµQ¦ÞáÍ–éŒÕae±ÁwmÚÉlSäæøFBîÕÛ‘GšR™Áëxù¯Ÿ<ýö‡é/ûR#¶*w ©"/@€P+JcÞ‹¯_¨L$¿mìS ©—áV瘛hòÈüÀÊ[†;{Øå\I±Ú>k¸ŸÍ6ò®LèWhÊÛ§d¨n%ôÛB%ÎK÷7­8äÇ© )ˆ¹S‘£ª/OjÛœSNÕ[7’•ªq®÷ç„ñ'Æ °88<ÉŽê Æóß>q`™“a Î*($}RÚTžPÐio £·f›oa?ÖxXž“`gôß%î;P»®ùÜ°R>)5Ë5)ÀÚPoX`¢ø`*7…ÛÄ»'´«®5ùÇ+Öúuïno¬ﮟ9`Ó<´»ÐÜëOÌÄpâ’ÞÀæO!&vœÝTéR~býî¤á’ŠWQ|Œ\!EÐ:¸ çB«eV>*EÔOþÂÁs º
+µ‚ˆVžÍ¼Jæs=Q‹•]28m*~)„2…ß<òY§ó‘˜
+D츜£/3à¹LÜZ‚(1±»wéµM ÓyKMØjY,XpjuG£äŠ3UMx9½gèOl´zÛ~‰ïß4û/}è´÷tUj»^É0Ô.½¤ÄÍ6fø¨·ÏÇ´ÉöH¯ƒÔ³˜-«Eƒµ™6y]Î(.öˆCŒú›
+þbXïýÖî——UçN âô7&#ú³yź)¤µ¤*›= A+Õ/µwªY|§î«Itô^¨œÞýøŠ kc!@Ìâ×Îoé–TÐÂKª¦ÅY&ÉŒåʹÃI
+“Z#ω,VÚ(œ”MÕÛ‚apa®šR虶¡#ÖqW3¹©aþHï«Û‹P>koQÙYvÓ}y»´7ˆP%¤o&Ê5ëÉFpJX¿šG™sÈè’ºñÑ Ìã‹AøÖzŽcøáC ô5slì‹vRuÆê=|aOLÙ!ePÇyL­Ÿ< ïíïaàŠ)æ¥:K,…_îãþ+t2†:Šu’&½ïë‰ÚxÀCÒÄüTœîS$°#géDèxúl+ÍãÌÍqä]‡çÏsº÷=5¸Ù³˜–ŸÎÕ{À¥pYqBx;µ Dj/YØ—ý–3¿¯&„¬¥d±ìTâ”qÙ+W{|°[TNôƒñ—SÿP¶§Äh™ïE?ÐC–Êt#½l
+Ëc$9h
+XGô.£Œ1Õ“MáX<´¼¢y¢ѽâ ÞÃÐÓò™wN7¾·ªûTÂW¤ .Î/ Dxh!Öw·%ãTÜHævŒMië„»t*‰‡Šm-õ'œ¨²Exz/s…‘e³Œ£ë›'>À&­.`Å:¡Äíy¶*9Âï¼s*q$x°ë®L˜L}ÍÏ3û„ýÆæ—Âo¼–N#Õ¨åc¸ „iÞY·S÷¡#ÕÎt@
+æ@à§ÃÍ[tW a¦Oc³%r"|”É åoxªn‡8àÅ•Ô6úÞwuÉ^ oG„$®Ðè{9³IÈêÊ£¦9]ÏÛ/FVÊ,‡2§Kv¥mLA†Ü`£ùvÒÞä«ß>ìÌTF”‡OhÏ‹#¬É}D¡j«Ä>ÔwLæEUý•œSm×òm Õ˜_©C=D4É"Û†,QVJ;2IÖ 'ËÆ°jW?EçÆpë«iœŸëÔÊ(ŒlÉ—km?\æ ]«ü+ô»¯òOõRÑÜhImV‚ÜÖvÞžÓJ–¬«i†˜’®ü9~.Åò?AEWðZQ†ú2Šo]’˧Ž¦¯F$PEy¸>¦ëD’à€q’_Ï•o[¤KƒægK+Óq¥õ{MÁŸÚyª¡WÎT°ÞW
+ÛÚy—ÚnvI]Íd¤L%úk(““¬Àj@bÙñó0µ§ÕŠ)'ýÇŒ³Rf•±åE*Ýç-å®}€)W ùR Wôœj»•ð±Cÿð81fôêôq®úø×'DÎßÃîÓ.©Â¹U´ûÅKmM™úŒÜÒ¹d¬âyd”„è™Y~¿ôÊ@=/jÉR½è¥ö.5SØGäšl‡e‘ÓŒm
+ÈOâÙ~Ù'V«™S0‡xÓ™8C‰œ†d£Çýsûž"¯¸±]¸ê´î>œ³æÐ|ñ‡™
+Jünqèèרô§Ty½šƒÊ¿¥I·Aq—õá‹Z%9?)¥§üŠp¢#^lÌáŒðÖ„„I’³ÑÉ!´ðKˆ«åWü–¾UÇCÛ¹†’º‹×®z*®éhíç&îÝÔˆ¦ÒpXNƒéÁc¾ù."”ôÃmPU›AJÒàäÝ
+Uf’å¤<k}Ì 8’„›åy1eª«‡¤7óÈu’p¬®¥s(OeTh—{ÀbÿýßS.…ˆKÞ”PJ=ËjgóÜê-Ô_h®*!Ô†—óXÒûìfÈ“7æÂ4{í]ùÉÚÒ‚oyâߟ0EY.Fœ ÍKŠô@ LUOŠi^w/Üê7¼C(˜ÞÚ÷‰éƒÛ~õ¨ºØØÕÔë’K‚qbHØÔX˜‡+…Ù¹=€ž£Zgk·„¹ž³gú²¹ÕpW-;ÏùzƒÎñ7°eO›âðy~⢾ï´m*Œê30V.o ¼/ƒ«ëŒF¨±L¡Ø65<_w¦âchĨGN Œ}tƒ®ÛzIXÈŽ«‡ü¦³ÅƒP†P^è2Õ(È—ÖÖL:u¹6—qéÍq‘Æ”7œ·Ö“íû“¢Œ—oŽ£å†më/û6ª9r~¼xtM—ÙlЮƳ ¤Ë4¯†‹30ËI(o³ÔIäÈ@¶Ô„Î<©´U'T9Eí”㦷™{²ÿ|Ð\¢ˆ÷4ÊNó> ÏÒê(HvÏÆ-nÂíÌìä`Þ0DEâÌ
+ð¥ªT Žºù&¡‰àëvHìÅÎø—â—¨|2#‹ÈûjàÍ­~ v ]_¤sË–¸÷£dLý¶‰¬óªl?@7~ÕìÁf/Ôý]ŒéB¾ˆúT-êS“H¾Zª[Ã,›ìÁD#wÛL­øÍ”PÀ68I…ûs—t5\œB¦Ïq G)fŠ…î ÇÂŒ}”ðª4,m¶Ï]ÍŒš£±éŽ@·Ç"4BËý˜ïÎ÷oŸ¿ˆ9uK…é‚V¨‹Q2dY’㇠•oÐXë\\ÁT7ôéL§ æ“Å=„«ßKì»×…ãåÞB^¼ïñ:e:ºûA¾ºÖˆ…Ø×%YäÜ´évJ÷\«æØYûùJV},6>Þšv½øÈÏi÷°6™’^¸OøM–!kÚ^Ù»<l‚'ƒvØCÜZ{óâË!3’î‚UDpì廚ŽgŒ}ÞLªzî…’b_V©ò-DÔ7™h~úÐcÅn»aV¼þŠäãôî´­Ô8Të/Añ^»»£öQÁ*I9ŒëMö|±s£[CËÈP¿Üù†«Ëeõ+tÐÍ ^‹$¾qobC!,cˆqÕÇ_ÎÌuMÔÌß`ÒÔ0Ù˜ú¦BÃညàŸJ}!éGs19lÏñ»Ö—³˜ZéGÓ*HËH"$o—¿Ub-;¶e;žÑœôGé?Õ¥AÉP§ãè}/¸½B °}¬<‰6Çz«ë=ƒS`ü¤4#\žÀÁhRoÜ;½¡ó”sTocíLÀä¤MøX÷ÓÃQ‰
+½å>V·.—
+ÒÜîªQè]‹*ðåVäIw8¶ñÂi›M‰œÌ¿$a| ÙòȱV¼ó i×6\…¼“Dýð¹¢\ý£¡J©ÔK•¹¡áXl¥ÝöVƒoÓÞ$âbÌegž#ñò¢ïF’pÌ ¯Úè‰Ñ^rÅ
+¥›S+YÊ;Ūìâ?¬_§IÅ>Ø7!ÒÇÏ£ûQ
+aÑF"$²¯Ö­|3ß!i#ÌT<ÆK[tô p;w»Ô.Š[°
+ £M~Ñg<ÇÿšâNÜ~¬Š$’
+œ\7±?·-ï¿ý÷¥“ MEo,ÖA„&±}â÷ÂE¥§Þ[:Ö¢•P’º‹qݼ¡©Ù¾u¾1b’0W—¦‡WG&Ù¼2ª¡t7· ,Îĸ—Áw¾Î”…uÑÎŽÕý9f8xºH]*ùY=ŤÔ\">_xÞä¾dB²a×/Ë—œ{íÓ›ã¾p‹Ä#åN³Œ„„×ÙZ¿5ð
+‹¢T4ƒ %ŠÑÔfj ÂÅ4L7¹ág¿«“qàïÖÈ@¨DDF‰šO`„®vÓ(…dE^€É0Þ±½ß­O{_õÌ¢„Îú‡Rô¤ê quâat¼ÉXe²Ì¾ÎKä£^´¹î¯é,’Ôªy–„ø<œ§c9\`9[B½‹º‰¬ÍDªc£ø,̅ò=åÃÄ3ª"&‚Œ™ž :XKdÓNBl|ÂX y‘|$F¿¼EcL;×Sü¾g*›EHç8’‰¾óűŸôûNYµ]¿FiS_q³;¾‚AiœôÂÑÅúÈÝÃNÞ‹Üwæ¬J¯@Ï“¡–ËG±M· 3% ÍÀ·°XÄ óv¦18+M“wÉâý÷8K‡ó–ŒÀ:ÉÉ/Œ-y$"£âµ°S]{:‘)EÜYíkN
+Ä¢ƒ7Ó*e¿§Ô¥Ä‚¦o‚¶n»éPà:m;Zd%«xc¥Nâ™aÔŸ?¥=€ýZuxçY+¤ó^¡Supã}ÏC£Õ,ô\r”xW)<çK qm’E+Ëç‘‘DÂó_ïŸÃñÆ@V7³îÒ³3›”a¤)dÚ?·Ý‰@xäÄÀc”´Ï0̓ºÏó"óâ½û™µrJóòZ˜JÅ›=2Ónñgkù"áz@éóa⵬å½µ?ÝæöP¤!}•-ҾфýG¨ÈVËs­Rñ²aTRïäËâ‚k\Ãb¿U¶.ÁãgößvQ¼h-aó•âœrfAÞ€ÊUÁèDZ$ù('€»¯LM£/hj¸ÒRöâfòg ¶ËŽ§ÝÞ»'ûêºn ³XÍw‡W×6>y~ëF—Æ”§üŽÓúÝ—HÒN•Ûë{Bk}ÒLþo†ô&‰¨¶ßgÎ~Á¼Ù„¨;¥rÁΑ½‚ãi?:±{Êc<ű26ÏÞSˆS¯ÉIy¸z/´Oœ*kYi‰ÙË6lRºQÜqà
+8¾÷z³ž“pTÞC»e1—´}FyèAò%Ó¼&Té³ ÌPæsî'éÄÕH]†ÌBøÓõöa"unáQaÝ,«N”:FÝÑû£i'Ñ£1»Ö[¤$ëêj€þFuÙ¡dò–MÏ~Ÿõ½bœ¶¹k½žØMƒGµ*‰ÃG”0õé ™ØЀBBVÅBZ_Âë /y LæBÀkˆß–œ2}Â)<ª2{2nUb^=èΗx¨oDÒš6ž_›ÊXÒÙÜêÚÐ×x¢–ÌnM¢É'¦WÍäŽî$ 9Jœ )o¥ÇH—ð“ q\£ÍÃ/Ïîí3
+†µËÏú蟥çf³ÖõÄ›M÷|!¶g#=êŒ.wtCìz¶u¥'}ò°˜_¦*›­PtÜaŽw’ëöR\v^ èTª(Õ:¢_ àT·Q¥´æd…úê’ƒŽCð×F³î>{ÄÉúÌÕ‰&Ž]bÑØ›Ë+jžÅýr¨gt2fÄêÚ+ÏÞ›í–j_€âY^
+ë1£äª .WÁPxjSÞI#Üʪ֊ çtûuiš!Çî½ÝSo·×íÓ8€+zqõSÈ¡,È!ë*T¶CÌ]ˆX­9v]&8S/¤ê`諺aÄcmHê–ELL.&Í·c_ƒ²ÍçˆSÈ<:~¦¹OÅ;E¥5Íq˜ÙŽà¶?ñv— nŽÓŽQ|oyèNÕïo磞YHºÜÈ÷”L¨·½ÛìC$?Màc¡"ÇN7ÎâbLnÙq:
+§¬ì:9§ËY×ûM¹6­È"Ù~ÝßïJ™uz¢ƒÏCz ©aÞÉ!âÚª8µs¨•<Ä× Òð쳯†²Å³XcÄ*3å²›Ëj†Gˆ4£j2Æ÷Q@\}’Tyž¸¢i¼á8t‚ê·ý†ó`gh‡M£ïBD¸ëÙ›0Âp^*•-ºkjÚ·Z»æãÜd¨ ÅüîÇ&n»$q‡˜,[ijK„½½­%¡“îe6eS. âú˜ˆfÄ®ý>e¾î–â ¹¶« ŠØ£>;–¢‚/MòI”¡øi1-ƒ
+¯‹3ÿ²]inÁàÞËDÒ>{ÓЈ dx—v³©lò9 ‰N‰+¶¦zöÍñÔ#é)ó\M£[s@Z›ÉR'õRÇ}ËAÕNQ¹IuÒ.8þÌÀˆ‚;a?ú“‡ö8ζÜ8ùx ÐxoAy橵"wðõçÆÛƒã)ï¼àì…ŒÞ Ί@ÌcKÚ_Ù¼Z‚{+ˆ•\£\hr‹v·ñjÉæǸ((%Õn¹ð· V•BòÃ{9y¦gN°œ fµv*Ûï›s**o™^þ(Ú‘r)`lV3°ð‘öTÇãèή hYmš´0”ÚÊ÷8K¯6ù€›§vóÉy“Æ 7D倷»ò§1 \eÌ}¯ø§5ˆòþ[%fvÄÕ'œbÛ©ö¦&©"ò­ƒõ4ìË*Ã5[Dô`1käý¶Õ•Ï ê`•rM<4{áôUC÷­øwݲðãT5cï¨ûët©„U0í ¶»©kµG#G”Ä~}±yôd¹üÄI!ß©¬ÐGÀEîn‡NOí¬PË$‰šÍµÃ‡WgÞú©é!q@¥{ß®ê7ö$¹UÔî¸ò¡Pšè¾Ð›ÍA©a•bg¿fD(s ¥ùv®gZÙZP€=NÕòä9èÕ&çýw…$H›Àì×Eg—ó¹-}>LÁ•Ó¦4üF¸pâX•*À¢„ƒ0¸LM­+ª[‹Àãco®OóbÖŽÓ% Hé.. Ê X;éôN~'R‘`&‹¤­óH–$Ѹ½¤[*¶–›< ZG„‹m8Blà ‚`•‰
+& ùf¾±<£>W†2<퀔ã*õˆ¦¸ïÞºÑbï)£(]|Ͳ7.ÅBêOo_™íí—I>Ĺ=à[väÍ$ø¸ºBÎk[œ y¸;ª$Ô¶VÔ¶¨ì+Qý †$·fø‰AÙu­õ€•ô퇚|ÄS)¬ß©ãb
+ÞëÇáØ(>§"´Ô?"¸ÔvÂj“øÓ‹©OïDkº§«wèKêfhÔu­ÐàÕ–®L~vsÜLðw~ùŽø›f÷ÀGY¯y²™)¿ÓbOú©ogɺeÁ]ñ¡—êÅÇêá0 ·H—c<ØÔrZ :ÁÀ]>Ùã‚!ååÅÈؤüð¹‘c›€ù«ð#®QÆÂùOsYŽ\$yÓ&ˆ³±Ò„} ÏK÷ØÈó¢ä(ä&&¶¬SÊŠ¡ÊÛË4öË(d®NÏpT¸ #;®±õæü_>ÿŸàÿ K{0Ðu
endobj
-1037 0 obj <<
+1311 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 35
/LastChar 122
-/Widths 2148 0 R
-/BaseFont /VVVFYL+NimbusMonL-BoldObli
-/FontDescriptor 1035 0 R
+/Widths 2713 0 R
+/BaseFont /PUDZPM+NimbusMonL-BoldObli
+/FontDescriptor 1309 0 R
>> endobj
-1035 0 obj <<
+1309 0 obj <<
/Ascent 624
/CapHeight 552
/Descent -126
-/FontName /VVVFYL+NimbusMonL-BoldObli
+/FontName /PUDZPM+NimbusMonL-BoldObli
/ItalicAngle -12
/StemV 103
/XHeight 439
/FontBBox [-61 -278 840 871]
/Flags 4
-/CharSet (/numbersign/hyphen/period/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z)
-/FontFile 1036 0 R
+/CharSet (/numbersign/hyphen/period/slash/A/C/D/I/P/R/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z)
+/FontFile 1310 0 R
>> endobj
-2148 0 obj
-[600 0 0 0 0 0 0 0 0 0 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ]
+2713 0 obj
+[600 0 0 0 0 0 0 0 0 0 600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 0 0 0 0 600 0 0 0 0 0 0 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ]
endobj
-1028 0 obj <<
+1302 0 obj <<
/Length1 1630
-/Length2 10814
+/Length2 10888
/Length3 532
-/Length 11687
-/Filter /FlateDecode
->>
-stream
-xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü
-  ­`fç°þÇ`bgk
-ú«5'–7.Q'€ÀÉhz º™
-k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–>#
-sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦
-Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâ<!˜ !†As¥»˜ö”ÌÔš(;¯3á‘7ÅÆÊ0]²Q|Â^ÿg×C´U´raáfùgzfÊeÑE=n«d?8!j¨¤WR-å…D¡œÊ¯mh$¦œa—C½Þæþ©ƒ®Cä¶wk!FËèIØßaNó4dý6x^z/ë„:Ž ºøÒÈQgæAÊN6æ ž›pP¬Š?¼û‰DÜÄÐ9Ó,4(E#´Íô;Õð¬ŸIaê‚«{Š‰ÏU–¦/ƒH»9ì’Újà(XW†ôí¦Ëø­Œ¶ù¸ä»Ü_Cþ[uë†LFq ­Æ!ü
-[ù^®bÓ7£‘“Äh'–y¥QT¼æ ÇÄÏy±a£üNåM ¾¦‰ÀUOE_Û±Õ©Ù÷œDS±&(Y¡ô{iàÇ¢r_žv¤Ñ«8¤Ab1è±M-„ïÞHHºrßÀb¿Oæ[‹h×èiy¯øÉƤ¢¶­„':çÄE·tzUÿbË–È.ØÖ;̶€ƒ¡</­DuR‘ZoOdNÔjFÂi/_ZŽ 2f€ÕõAц‡($k}ÍåcTsí1R»°$ˈR÷k»=ÍÈ~€íãÙ3¦èýÅ;ÂÝ'ÁP¦µ ƒ·ù]DS°3Ýø¢$;è›<£…!sÂÁé,ìÚ t4aê\D.ÐÒ/Ýöƒá4$ÌrQàK,T†õ˜zv"ÓÕ3(²Ö«ñ}Ìsjnv4ÛÏ÷†NÙPJý‡ÆT+Ëç@f4eËâ¹×pƒÏ˜—yUz„P•Í=ðˆñÚ
-5ú\¾“8¡E8¢ž/›ÿš{¡ ç³cƽžÃ ­þ©mÀeô¤]§¸ýÏTn)ª¥3½Ù¬Y gÁQ hñ}7Ú_»U;ü‚ h@Øùû3Â)Y#+³RÌ \pgùGÝq÷pÜAiµßBwànÊfµ„FGjœJnBáð걌¿YâYQì Wqò0ƒ¿ÉA–®îUH&@O ¾UÒé“̾„ï”®¦¤ö¨b×SHôôò¸Q™°‹É•è‰G|)¹½žqt绦_jF7øÝ¡Ôš×Ïi¨£ÿÉ@HRòÎjûioÎI­ÍëÖÄ°2…tZg¦¶à]Qˆ¢¦ž:µ.;›#ôªßt0±ÎlÌ{ÏàQüÛvü«¥´®å€
-ª/ªœ{Äøø>º$ÉvŽÏÊ~{ÞÏ>ÐQµßS°Ââ¡v»Út`{æÙ°¨ï•›( wJÝ$ÒTùœÖ’F™yˆç·é›Öõ¸ÇÐv‰øoµBï:>ï2ýôK-ó»}—®ÒÁ//Ä€fHÓªQÒBÉÈÏâÏñIW]1NúX˜ðCk“L2 Ö¸V2ûØ/‰.®#G`1¼6ü~fÔ R–|Imd¬²ôðh„{üÑš¤‚™Ë»äË´ÿeÓ.ÿ…Kµla°.
-‹jm“Ÿ˜=~ͼ”øh0IzÖ¦ú·O%_Ã% óa:¢hšP³
-S¹ÏÉÝÌŸÜü¾ØœQlq¸†=žà~pFÛÝÓ³0Ú=î,ùƒ272ï‘,n&£#:$Š¯JÚ0ˆ/ŠRžåe\ßoeEÄ`µ^×!Üæª-î¶ÿš¼îKÜ¥8ÈT?ß÷£G§
-÷glü2®® O!ÝèCÖ½93ìôÙÆ_*©a …õD¼3»–èâ/ˆ’Ö®¼à–tõÊC¼z]îú¾¢(ñÏ~½ŸM¹ã±ÿ.#à:ônÓJÆê|ošAb%¬Äiªê3 M°úá]@’œïjoj'õÙ{˜D—ÚëF*‹/‡?Éå'Å!\˜ˆeÄ£
-ëŽ,/µs¡*/m¥$±¸§Þ˜¾§Û›§pnBÌHé”S*û0uœd²Â©èyÁ„Sçx"ŽšÓð§ÍïB½þôÁü{Y‹ð"ÂÏ1·¾Ú½IRA®ÙÜà‘=$Aê[ž„ÍŸþ媓D¸“§B1·ø ¼•"Höû÷Åj·Â¡Tˆû\ÑiÀ´G¿åG»xÿtÊí|ú?Ã4fÓmƒŒŠ% 2ôÝLTW¦‹Å&wË…j•¯?CÈÆ6X™-ù» "zQ׶Ó6å[g#Yóñäúd[†’°‘ã‹’È®óÐË" 6Ç”wue# ¬ MË%òG¦ìü) T sbw^˜¯ž«TMZ‰âK_5¤÷ýÈ¿“ÕÌß/ëâ¸|cÐùò{ý†VðÌSÛ¯Ã9rFòâý±6„ëhˆ·u^òö´g?›õ¡çxu) ìEºéµ5B=]× ;¥Â’Ë0¶§s7ÁjèSƒè‰#Jws¬Á¦ôE`"¨€:¾2̯sû6Œ¹cÌy!¤¬èb‘߸¬ÉZæc¼`ãû”mÍ—áM*ÛM&½{Rù³®óL–/ìœËG¬¤Á‰ß/é0™'
-ϲiSÛz´­õ…¡I§ `~œm5é—ÀyyB‘Áƒ"[{ÁûqâoÓÐåºïªðRBøœ
-;Øw3øGæüõù¤…Þì€E
-ªõVÖ>ß"‰Ï
-žzÊ6âÄ:gÒ¬?yéM|â(¦‰RÕùr ði­æp2¤ˆp(â 1¤¸£œ¡æ1Rᨅ 59©ðÏ~J{ÖÜñÙôu³Y+ÂJàå)$Müà¹kMˆz,ª.hÚU ñ…1FÑÖÅ*§, /+CÅe+ÅàãïG›},{S&›1ê’™l8ÈÏ›òIø°°€¸¤•·©x€*Ú§wH™^kŽ6ìÔZ$Hq¼Æ!Ü Oý#$*%UˆÜGP õi±}&ÌKá6ºÙÍ(ô@€ØuzZ Ý^ˆà>ªR|­ fö*9 Ÿ}&R°ýgFÝ^å†áÞõ°(|õA~øo,"ÊŠöjes>@vôfK=²ŸßýÄý¥¹£ì“ã§.WòÞNBtÎáÂLå*B±Æ5“¢MÔ®øÙûè¡Cž)øð nßúB¦€×~µ_ƒ8c“Îãš(‚×'ÏÙ¿²6¬iÓкõ°T«¥‰;kÔ4¥ÒªÐÞ™bä® 5˜Ò´íEXŠC†q)6ôfWº‘d0¥àl‚$8ç<
-Ì“ ¦Nó”-ü¨(Û–7 .\2Q0¼[ã>ÞÞc¼9&‹+LÄ@¸J°aiÆ—23Äoâ+Åçu%•!·îÐ èä™G—!WùIŽ‰ó¢fÌŒp V[ºÁ);A Ž+Pc¹ÚY¨N7ÓfH¡RÜõªv¸¯Î_ÛüdE…Ð鼦‰ˆzèže.7-„ê½NϨ?iœ¢}U'ÓÁ¦çÿ
-Úóž¨e6[x5±IœG·6ünñ>ìlu ¬YØÐâBZ *7VU?Átr T1[¸™w¯ËÖj6Ó”äê#ŒSÔ\D¾y¶¢yÂw” k7ÏC¤Î‹ b‡døé’|7ÝÖè¯:9so³h2ûñ¸î–¾ÈUªû—rl’9å'sÙ°Q@ýBîå6Õ:íkX‹(­ió¼·õUðW¼ÕÂîcŠ˜-¹¤ƒ¾-Nyˆ®:RjQ4KàŒTÇc—ûÜœï¥&)ëdQb¼‘– ˜hïáœ#±»¬žS£`KXÓK5S°]Ħ~ WUðã?É g7ÚX¿~p™ÑðÎu=*•ÝGK;t·Ú›iC¢­Õc‘n6=‡˜ñtÄY9ÉæU¹¿«õ¸² êvæão?32y ÊÂEò^‚iYk»QD}ÔÓp>ÌÔ>¨[ÑeØØÙÎGuncáTçÊÅGP½L`.عjÝVͳ…U16–!]!•PN‘âñ³ª^{[T´^Þ•tBÅ.‘¿˜ç‡n\¾„a ªáàïëðõGn‡ ÜÌÂí?¨‘‘å²cýP'}¿ô51iå0¦Tz4½‹Úç=Á‹º£ë°½„ª&koMæ!ø\ß"g*ãÐu»r £6„ŽÑm­³šÞRAàÐ,H¶ëUõ@=ÒØೞTÄ2–‰ÆŽ÷ã3él~ éÅ»{ º;j•ÜvÓœ:Ý×I“ª]:³Í~ÿòYŒ“o4|l‘E½&$è0¼¾Mi4p˜òÈK]Pào½Ö§Y[5¯…ˆDEì¬h.«POýéµû’%
-‚¤=Úd!³ãdêÉ‚Îl4ls~…ŠÆAQŽŒr÷î XøT¼m­97bZâ¼é2œÄ‚M<µ/¬Àoþ´ùŸ“EF:oÏƵ¸rÎrs_€Ezùã\D¯Ð2ï]‚㓼BG­+¯£x»oÞ#‹MÞ¢•ÿiœD|!# R­þ ­1*׶àN ]püPÞ2'¥ò¦H˜f)–ó¦ŽWv§Ä…© :V"å‹G’v
-ÎÒOVYrX¢ïàwJŒSôm‡¯)&`WfXñï³’Ò‚‰oRâ­‘cƒ'ò­–c^ÎlïŽOF–õ×Ùgäëf>MÅ·+(çÑ£ø½fM•ÝiïJÍ+lÉÎ$›©Øȧi‹ Kº¢»»þYÆa´á+“Ðã)ÕÕ;{¶
-{郎£¼Ã/ô‰ï-˨–ÞëijNg°ÐMë"@þ0ƒ[ ®x<Ey3ºs ¸I=t¾0fÌдƒ
-Þk—Ç|¶=pÅ^„°·Õ`›óû ŸRy£!«#ª£þ²s`<5…µ1Î}¿äóè-É`Js_!ñ ®èë媌D›å(:>žd/mý€p @{ m·bÊ3ö£±™W€¯>š‰øç_ìŒïyž"ÿÜßXvܺ†FŽ• -+›5Æô™6ì{ˆñéŽzÔOBz>1%Α}}mBl*î Èà+’?îÍ6 ±3™þ™^\É;<·ør ø»(YËV¼5,{n½@Ø`2Ÿ<Þ#‡æé6~p/Ø t+—¢44bOT§UŸPʲÁ%Ï™Ý×êmŠ¿¶kš¹ÒÍ»¿^Q6R|Vœ=¡ÒÝ03ÉX­®/Õ¨îmˆÔ-gN
-^Á?g½Ç[eœ[T.¸;8Ëñ1S¢ÒŠs¹£ìãíÃ.õy‡¸MnÕ\v¡.Tü©Ä%ñõdaÑÉ•%úh¡æÍ".‰„%{O÷0+íøHæ
-7³”rÁ©£håIËC3L—ÏÝ| á`
-4T¨Tç
-ç!ÙYê‘éó`þiîcînÿ)£×„ø6RÜX†™éЩÉ^ÚŸnà×–,&ªn¢r‰þ¥»GB=àðÇïÄ‚†v|q”Z¾~½êÓ¾j¹ú–RýÇÕ? ô¨´xË™»ýñpŽ~Îe|E£PñÎPB´*Žm…ÃÂ9}zùµ‡ìDy?¹8h•))^Çj¹~žn+TêóÈ÷Ð=ƒ,¼¡a"란)¾®‰£¶:—J¿ŠúD4$ç›mÈXfjfÆ¡ñy%[¸"6¾ÒxB)•®ÅÿÊŠqÎ>¨×l´—틧¡{¥»¬ëe˜R™ÏJñ­j}Ú§ÝoìU¿ë à{™ä–\©†õ6Ü:ƒ·¬ct5I/« €,¸Eð=÷ Â8i¢+~[‰2ðL~¿%˽ΨEdµÄ3C}®éX…VÇÝ?àëV!CŽä‚à`D2Òé4Û%‘çÖ9¿×õH„)¥ð„ÁúO”P7tt1iU~½&=I¾òèÏF}=шû\XUêÅá[&¹î3=ûŠ†ž2¦8Š¼á"GĘ›À[pClC½ÆXÊÉÍÿQi¶Qk bºmj‹df$Àw =õ´åƒ‡”]·¨¼þÑØŸKƒ©ÄøÄ[¨žúÝðq*ø!y›%Å…øØLÏ?×-+Ù‚õ´RGÒX I†ÿI±`dìÚhZN¹Í"VÛ‡ûô2_®ËâÈ«Rßó!«r
-2¯å²vƒêõj:¨¿Q<¯%C/õ±c“I+úI~ŠøwØc`µÝµýƒ§¡þŽ¤ûJâ˜ô ]8 SÆ/¸÷E.ƒa©4Íî¢gb‹òéž7î;‹f"pçìÏðB]u±¿‘ßó‡èãb·4îžiÀ[.þB&Òva­¬7*l?TГ„ræÝÜnàœ`á'r¬Ó¦Ló1&9¿å8ƒÓG§~p…QxcÃÒ=´Z‘ðŽ±Ä5ä‡Ø×n™ù VbY§©àùÏ"§Ñœ}úþZ–§75’¿@-[Ë›œ1=u˜Oÿa"&¦u¶|Êê;ÏõåÅÆŸ'?Hl4ëE\³Üà#ï<Æ—
-¹`†\ÿ¥¨ª1¡Õ–£ªø«¤\Å'GË'²RSƒbzûÀ…´ãé‘!©¼?ôdFÕ±EÜ%üÝtk'õð‹äpNA‹Ûº†‘ã«óµýñÙyõ)¶'Þ¸$—( ºI‰fÞê¢*)
-£ÖöQðŠ,$ªõ@˜Ôáö%Õóø*(lŒl>9h¼à˜áxJ¹öÅþãn ˆï§šxíWE¦º²Úa2”b÷^+BBF¶-c¬>À‡ ïç ›Ô„üR¸²ý³áìKE±®èÕ'¥Åq5/ÃÊÛËÑ»ï-ï'{+Z‚"Ìô”{9…Öñ›‰ò¥YnY’8ùUú³­^dËÈæõqàÝÝÚJÌ7C)[yðîñïÆ^3>@–cÉã1ùé
-NaãLïñ˾œ[{Uy<-Þ€-§Žà@÷ÎG{|Ñâ'ú*&MËDß×°‚ÚKÆí¹W!¡ÏN¤µ‘ÖÅe<Ò}øÖÐÇÞfnÑ»…³µêmºŽ5Y ’8&€ù³js¬†]ea^å(Þ¦14üŒ`pË{B/{ã“ÜŘÊgþ6<ÔÆGE§Iwuy³¯<¡= 7…ýÉ̸¶ä3…}€ÉüR4{Ò^ø<zN‚‚!y™ÃÛíÃáxVRο0,¹V‡}’Op7A7!ÐTÑQP˜ùT™ÜÞl,P½ÙTE™>>™åÝ°^ûþR›„»¸8'n¤-ìJk®²QC
- ¦Ô"ZñwOòï™»ÏöP÷ê¨.ÐJî~&Ö>zm^B¦[s°'òYøš×Y­D˜¾
-¨ÿKuß!å"|ÐÙEÆVÌð}†ô¡¿ O'®ÖÎþ€å&-¸ùhì8ö²0ËüÀëèæy€ôõ«`o­$‡Rš´y?…|¨ç>K/µ^¸°«l/J¿í§öÙÄ¿Ñ׶ݶëÒ“<‰âïŒçî*O©ÍTK?5;º(›o³ÇUJN¤P3
-øÍæ6?ÅÖ%X<²˜6˜ü” èýÇÓ·55ιbÏ(L853ïáˆÕë¡›íÐêº/ÂÐ7q‹^¿_5
-r•ŽQ¾¹42"ÒQyܽ…8[E~*ï\ºÊYòÃå«&R½n<NÁŽ¨ÎŒóöÀ8mÈpf0 <«±Ìœ/Fµ{ —·î9ýöÝ„PœÒÄ@cÅÿ4¦; ™«×”¯ü¨K­ À$çdLÎð©»$?ÊCîYÇF¢á‰á&Ø,ØÏ<Ú#@Ë%® ]g‰hƦÌäÒ†F`{&(]ž·/iÇÕÜ\p±"Ëbö>¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ
-®ŽW_hi+yñ¸âÅ‹…†
-ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦v<x¬/ OKÁ5
+/Length 11760
+/Filter /FlateDecode
+>>
+stream
+xÚíteT\ë–mpw÷‚àÜÝÝ-@€
+(\
+www4Xp×àNp×à®yœs»ûö¸¯u÷¯7^±kìo͵撹öGC©¦É"nî`
+’q°‡°°³²
+°
+˜Î K ³¹-ÈÅåæû¯éü³OÀêèèhëùw´Ãß^ÿQâ²µ`EfçxËiyËm ¶GþðײÈÛ[8
+Œ»C]ø¶ti ÓRß÷ Ý…X«´m¼L»AŒJÑ2uc¼Ïf•ÖaõyØtv7GÕ5ŒJžáÉÆÛ8ÏîÞ»àRß:¢û™¥×Åãµc6¼Ãþöåè˜6ùàî–®oxp ¿ó®{‡„)7‰FÐ 6:À)—DT_»Â;’iºv—"®;)ˆmq*ó‚?˜1û5_ÝN[ë’ǯ=×ç³"/LIê}Ä£›k¼¶lBñ«¨¯¾-š|oRkÜó&[Þ&±ÝñreéòDQnßô?ª[K79Ð7/Ù/–_!ýmÛÑŸ ·¥Ê“žHÕ]Çy÷A8­\¼ÙŸ.¶h¬æèú†ô“­Bj£­Öè®{ŽúÈ£÷ öÖt=¿ !æ¢DÚ–¶bO„t8&óïû·ù#¿-L.Ii§¼µ\’îžhRºª® xïN
+®°V
+(Š0¢™PÁ´i—µ…½g` äÒWDWN=%&j c6–K…Á×M囑êæ>vEÂëÁ|Ž¹Eʯ#«îu€U•ý9å™x¼.­dávÈ!ý:8ò¾€Ù€;pñJ#WT ¢Âª^Ûà'áHðmAFr4”,=gK3M¨Ì(R
+ª¦S0†¶5§(ƒç•ÒÃòÙ#ÀÀîœj›Ó=âéÈmoßÐ
+¸wÛõeä7ÊüÈ‚Wª¤I„ÜGñaquÂŒ†!q”ŠÂÓúF›ºNÑvw=É€ˆ ø?©þ¤ÝÊCÌõ ýß{?~µCâ¤ÝXœì†q&ç1j;¯ãI¢™Ô§U$´ö2s«Q6·oÛ†±Œ•°ëãä'n¢ªÌ(" iÅ ÚPV Ý£BªÎµqt¸Ö•Ým™Y•d>Ã[¶‰’¿¦ÛV­¸‰õ»ë+WÓP¬Å`,kE}±_Ys™°
+ä’Þ›«+;Wœ‹ò,ïV‘äîIº9^Ü¡U½0~˜ðâÝ^ ^ñܤOgn}Â]^¿¡%K(îù˜§½ÉõUÙó˜×òÁ
+îÑâ§Ó/ÆÔ€P +°-¼ÝyתžVý(/}_#™mѱ¦€*¥f~[ópÏ8V†ÉÑ8ï„$gÿ" N:<3Uwñò›ðžÂp6­Ö‚ËI&Rü¬ÜŠÊ“‹pžÓo/8)Ô+~Û Js§\¢­öÊlöí»i{UŸÈ»Ã»4´½ÌM_˜š?Å]FÌ©•A·Ö_\"Óƒ‚’Þ}#FG ïK}g|ÿñÌàë":ŠEù×%ñ’õ.C!+6‹¼R±ˆà!Qê˜_};¼È#Ëö]¿?Ü~d'My*½{·8¿á+ínßû·/ŸuG«ø0¢ß§ÒÍéÌ–àb“'¥ÿî¤ûm>‚ÿ«?‚´Q õÞ([ºÁfMÛÿŠƒ´–?Â…?¬Žžš.Tùô+ª©ãJ¦eUq8jrÜ…Yp?Á ½Y~H…#úò=*Ïqí·Ï™‚T蓦ò¡E‡üA‚⫘Lm=ÏÊ72Ø÷]‹Õ™+eÉ¥½õ¦ ½=¾¼Eó@•3.¹w¹Gãd“•.Å/‹f\OFJ$Qó:Ñâ
+ýò­Ã)8ȉÅ)7è_£Œ·ÆT÷ô壌mMÌœ+¤
+G¦©J¨ç­$î}0ÿx¯R7ë&K.iËP6RÔ.<,ë㺥1~4XÛ¸¥>÷Æ ètž•>¢Â:Ñ#)á>æk[¾»ïÛ'Îåõž¬Ž"¥à P¼Ê!B5ÿi‹ÒÌÒ÷ÀI¯´æ6‰ïíÚK²j?uFéi‰W!Ü’½ NÒ.TEtmúÖF°tŽ¹.†}-¾ü%`úµÙVîC¢p?VúŽÎëÏ-jû-fÃrÅó$î‹Ï„¬\AËÇlä¡NÉWô˜,
+Ÿ`bêTèÖ6çCÅx+Äèô@›þ`ÙvªlÐTw»J·ô+²ùøp4Tâî]” ðâú>êóXÿfßdO¤Ï£\Ï”H:[PC‹Ä²¡-‰­Çó|—ÕÏñÊŸ0ï³iov%§Ž=Æ‘»ñfLu³$ŒX«Dm|BØxz’‘: ÍDï¾T–[&n'îóšZ) ¶L`z˜÷Î(1ܦ—Éc¥œ˜*`ï3Ÿ+F(ò¿gVà/_JcÄh‡ÛÑ|¢Üm:rGæ-Ãì]07‰±?×›­‡¶­0RK4åÀí+—‚`îŽDÕÐLºÎ’ùˆ9>ñ¯ëwe£¯ÓÑ©<Ôº:n;=]7¶cm$Ïjô¨âÉåx¸Õ8>Ãp:'`=2’¬~'¡·:é'î•üc|±#úvN<
+É‹|9
+PÙ·åI,™ËúP5—ã´"ªYžBRÒ!¿Ñ)ÑEï…ÅEUÁO»« Ñ ¾ 0Å)Û»9Q‡‚áT¥áååh°¹íeýè²bOäo¿*Þeº}N5à„M=*,".}º.ØÒ >Dï7¼¤O¯·Äštéþ"Ìs¾Á%ÞÌø-".#S„ÚOXõNèWÇl„Ò]8T‹0üPÔ}zZÝ^„ð!¦Jr½fî:5…€c6Z¸ãGvÝ~Õ¦ÉþÍOqøÛÃÂÈ5Bl’÷eÆT5ª–ü€ÜØ­Özä€üÛ W–ÎòÏÎBÝî”}]Äè»vµ}V­&–h Ô0;5#ÙB탟{ˆ>â‚ éñ¯/bú3 13„;6é:®ƒ"|sjü”;“ã´iK—‰Öcˆ­^#kJÚ•üMCG&³ Ú#©Áœ¶}äe-Yò
+iÓpn¥ISÖÎ.DŠkÞë‹eªñÔY’ªU
+{&p–è°ÌO@¤)ˆ
+á(ÉÐ'k‚ï¾}ZuqåÙaÕa àuß+•?®Ò ,ç<Ü¢p)Lå¶c§z7ƒÜÇc®{Öß°Uþ­ÝûÁÞ_)Pùîã0Nh_4SÌbÉ- Œ”²:ã%¹îL¯EÑ)ƒªÇ7D.÷{¸>ÈL¾¯“G‰óEZ:|ÇL÷
+ƒÉ/¡¤èïiÔò;ÌóêôÿLšUïÑ[læQÎaœ¦Ñ>ñ³G÷™=}!C‡áóoΤ…ÃTD^ê~÷Yñ5l{ž³×(᳓* ŠŸÏgé­?»ñ\²Àå'Ç…îñµþ@vǸŒ‡¨óÀ9šæ‚Ã?ŸŸ¾èxŠBœZ÷ö´köö†dqÏ‘"$!ˆ íxðÿ"` £þmÍÓK›ë.¿ôe|ê:Ÿ†›%u@éœo('_
+¸=Äõ¹Â¨ìW|ÝóúõyÆ壹Œ O<ã–H¦¾kû»TCT•3SQú˜8EŠ9·[Éi{ªðãá²Çäve=§ûïŸ$)e Ù(ïöyï6bU_>`R¨ÿ™2Qt˜çR?=ÝIêbĉ& ¦yÍèZ÷;Ø%U¼å͇⌌àÊ·«6ŠnËLJ˜S2tqŠç+ÚóKÄ0H ûÓ'­½ª~Ï”aLø˜±ºÙ‰l½,£ ;ˆ$ùubq¹ñÝ8cC¨.b /άKÌJáÖR7£¸§ôŵRì`çzËb“³Z'º½$ éëý€Õ÷ÒÞù¡À.(?ü<Óo' ÂX£¹
+½‚ü\Oãl}çÏ rÉ^Ü ëcërhÁÄ{£ x.;9¹ž³¸#ÛO}+ö H‡Gzøå% Æ®¼ð§AjS2kí;<)Ÿ@ZÍÆ»È`n#çPglv<C[HÀB
+ó>çxž–HhÑo°þ¦¯£mÉ،Ģo­»L£ÇQ“0íñÅùuâ#ø2†Nü®{Q[V¯Àj¿¢»þ?ƒNWô¨?ƒt›á%¦qGGö:¼®*x¼ÃÀÌžÙÍÙ^?£õgf‰•çûúpïîLÂTÅ7^\ý?0[ÅÃèQÄè$†À×}ÝŠIÃP±ªÇdYvgä‰e¦w©Þ$àŒ¢_™ ×¹Žéß™†Ø'DÂ9ËŒ?h2ó¸%¹ß̆Ó6UÖ¾—õ„¯m“±(ò¨øÈþ­ÉæD¥«‘÷§½ºwõ¦$MMó:2ž“ú©‘ƒ=‡3Ït]ÆF±°i\Çã“%N¥ŠaÿÝ£ÛEK¼ôÑ×îŒ6y.G­†(®AM†<ï¹Ö~Êyõ.‹ï—²À.õ8'_e#åBâ[7Q:¿žßämø"mƒbìS ƒŽÆZá 4¨YŒ•{t¿Op¡Æ¨à‹!| ‘õj—/™§ÐLve§eŸ(ú]<Žqž(Á¨ð칄…ÏÀßù¨;ïAJGZ0ý7ùˈ¾†[(-®P+Uìp¤ëñ|\—;ï<?ÿTlX8ÎíDò§ ê÷ç·ÐÄßÇð“QÛ¡ª›¾ž[,d‰É;´Š±¦IÄW
+² ðêwòoÀ
+=+Ñ ºEg¢ŠÖyé5,˜bQÚ¥x®Û:>ùÝ27r¤v¨x©t¯½ <¢íæVþ–(ù’]”Û­®ÂãBB²ßâ ïE›Üä ?•ïd
+ž¥ ̺”k®ÖPú-F3{^.|àƒM],¿Òck&Ïý"§^{9D_o·äË•ÄgDwŸÇ>B_6õ¦F§zJ­ïf¬E§9åGÆŠ(IK6na mü¹¢äßúta\‘±+O|oÛn™ÔĺàÙ_ $üÔ>­Šäkës±7¡{^´2ÐX úñ©ã³¼€¥=Š&I×}µîäØsU5u¨ÿ’àï"VB”—~²rön‰Ã/A“¯>k]苬’)ŽÄìÂèÌ?vYèäF8ìúš
+M,b?Sœ†è‚-\ ì‰ûdVwÑIôœúá~Ö7ŽÄkeAø€›ÂG9”¬™C:¶œ<_}9TïrTÒ^%M…íŒC,[E
+tÓÎ@½*¯g :_‹»o]Ÿ°’cü‰·ÑcM
+}­+^ÂÂí¯e‚³é)À+-[‚fß7 j5$‡=á›®bÖ;tZs<u%/é*¶Èø²EÌèÁþRå´6*Fõ0N纄Z Ä4÷€4rð¿_ÓktV{zd¨%Î`n »Ú3NrÁ'ÉHŠ¡Q1Â\®©9à
+$2ÊÓ‰Ÿ (¹
++ä—JEšÇ—éáJÝËÅGq­¥½oP—Z{@LŠõÈ_
+L„³”%$6$n”%  I1YÈcó³:Áì/÷HÅ
+uÎÂüÕÏÍ{1T¨—t+jªNìpC4ç@ÖîÅfÙä:)0ýôðt<P‹b¥7ŠÔÒ·š‚ù(23¬õÙMö+&c Ól.^85^Z£ Luü‰
+EªÊqÓëTéCòâ¯yÇõ•+«ûv©FZpÇZòU1ì´‚îâD¨4ùÓ£Bªg9Œ¤ÁÆ{¾Púé™S›vÑ$ ‡¾\ñxllË5çÍiéõ$éTlFÚ—}GÈØf<ü È -ü%ë2bh{açògôCÿ£ÜïW{e1¯éF¾'GŠ)Æa.¨³BG=(”ˆüªCÞÛjHk_×iêPtkºé7ïze›¶ý“tå9¬)U1M¯ž6¾¬ 4*k?¦‘<ꮢ±²àN|×P’.n¹||£ÜU+¶3F”MhÆœ ¡¦9Ÿ?hHû›ç—nr Þ-ä0±Å‡ÝÖà’U·¢PA7ÄÜFwæ°'ŽÁìÓÖ‘–º@çPú)B²àFpéœ=ç(®é…àÎÂL„N·Í-þÄYØÒ.ŽF¹ÏîÀ1­ÇN4.ì—{œH¶/ªB¥0¿N­æ%@»&ZëÑ»BhÙœæ¹áí„WèºÑ$Kí[Êit9œßë;*ø¢FÜíƒPk—×xøOyŒüøŠ¼ÂÛ/¯OwÙóp»B"6àl:ˆ›ŠÕ‚U‘eP
+Ç^; áµ³†˜¸ÔÕñXðÞŸÀ»b’¨®k€*G/·O3(|ýhÉ›ÐÅØ%§Yæ6ÈËM‘~OŽ¿Æñÿü ½}»—%Kƒï¦|º9W¼ø+[Xìè¤P˸—úòbhê~ƒÐT¥:J‹ìÛÔ
endobj
-1029 0 obj <<
+1303 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 34
/LastChar 122
-/Widths 2149 0 R
-/BaseFont /RRMWZR+NimbusMonL-ReguObli
-/FontDescriptor 1027 0 R
+/Widths 2714 0 R
+/BaseFont /KALSPG+NimbusMonL-ReguObli
+/FontDescriptor 1301 0 R
>> endobj
-1027 0 obj <<
+1301 0 obj <<
/Ascent 625
/CapHeight 557
/Descent -147
-/FontName /RRMWZR+NimbusMonL-ReguObli
+/FontName /KALSPG+NimbusMonL-ReguObli
/ItalicAngle -12
/StemV 43
/XHeight 426
/FontBBox [-61 -237 774 811]
/Flags 4
-/CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
-/FontFile 1028 0 R
+/CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/slash/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
+/FontFile 1302 0 R
>> endobj
-2149 0 obj
-[600 600 0 0 0 0 600 600 0 600 0 600 600 0 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
+2714 0 obj
+[600 600 0 0 0 0 600 600 0 600 0 600 600 600 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
endobj
-952 0 obj <<
+1227 0 obj <<
/Length1 1606
-/Length2 17112
+/Length2 17262
/Length3 532
-/Length 18022
-/Filter /FlateDecode
->>
-stream
-xÚ¬µct¦ÝÖ%ÛvîضY1+¶mÛ¶Y±mÛIŶm[õÕsNw¿=Î׿ºß×מ síµÉˆ”è„Œí MÄìlé˜è¹r6†.N²v¶2tÂvÖÆ€¿J622Gg ;[Qgn€š‰1@ÔÄÀÌ `âââ‚!ˆØÙ{8Z˜™;(U~ªQÑÐÐþ—怡Çÿ´ü=édaf ÿûãjbmgocbëüâÿú ’‰ ÀÙÜ`jam‘WДPŠË©
-.†ÖF
-¢bÿÎÓÙÜÀùŸØNÍ
-à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;
-FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF
-Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B
-pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m
-D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè
-ûÙ £)¨Ž&‹"º–Qª86Æ…‡â9xV6jƒxlˆÊù†º’2–^ù
-|Ò Ä;c g¯lt_´û•jP°– ¼ãT³mê=-ŽÙ
- ËÖ /¨é?&§ Ã­¤oø
-%Ñ]µÃ³V‹Éµ‡†#hižrX£2¾K±²Å?²©Ç‹t3V<«×üHl'}µ“œ7ÂnhJ권buKÉ)O^Œ Z5‰OßöÚÖ?ý<ÿs88z™l­; %ÔVæ ËŒõ”ððßEôÌH«íjÚ ~öÖ´Öb}ë­MùñÍê+GÝq’Yµ£[N¢+C1¸Ë¯ö
-RÚ8Ýw>SÓ¯S®A˜Ç©ó-×;%¾À˜úe
-ß$TAÂrü—ÇDUËx,¬mCFË„vh”V¬èæÝod%·Ýͼc‹ò¡R´©kð97Aa¸ö<ër Ñ¿5{ßîRÖÀª—Öì
-(ÙóŸAuÂ)¡¦HŸÞ OØV";M¸’…ܶRýd°2auÒ/3ߘ–¿AjqBGÎÓÙ1\æ›+>€y¥&0•²jmÚqý[„ìÑL6Qb~´+¹PÄ-sÙø¿µ$ÈÑ*ªï ¥ ðÈOÓ…¦JûèY[éýSækŒ¹©[üm}ÿ˜Ð6L÷èO³[²ò½¼ƒëÆÐNOp:„ùHïä7CĬ“ü]½yî´¶ïïÃ>Õ“·aý'×M½®qê äîbà_w– ž]4ðÚÀˆ²öÒøÞó¬n +: § Ìô 8û›cÑJR[2£mXÅw‹}y7ˆ×ÅLeD$ç,?Yh{³ÛÆBÅΙki¿ŽøК¿ Ø1ò°ºŸ;eó‚T›n|˜)94µ9uæÐ¥x´ ƒã½R
->ç³]æoM%„£¬ÎG)³‘4°ký‡ïbZ~ø ¼`_[hã»8ë<¾4²}$.îÁ³Ö
-Œ(iýŽà-º 7~õSLcüýkÅ!.0Yü:7— `hPêoˆÜä¦ójÂlƒG¥v‚j»8Ç«Á¨›ÕäÅÆ6nÂN'éú3ÑX®ÐH¨Ïü%›zl½ ýƒ©´
-)‡¿ ÕÖÏéÛNÄD]*¾ÔŸæ›õ· ­‡.kÙõ£a ü:ræ\e·ûá&ÈÉDŽ¿Œ™%_$$3}9šü• Š8$½¬€È¢þàÎg×™„¿ZuÎÚ8רË=~³a#›L]gŽyiðÎ+.ÐÇå‹6{™jšSksÀ›ø¥qéD¾ ~Èͯõ{Ó·Æm'¤v;?«A%qÐ7ú"úpM°!(ïx[„Ô]Ä,…u‹0~‘—Ý›°ùot…ÿ‘vm¸oŸÓÔ/˜àyÝSÝñ}Ó"‡ÍÿImñ@ü
-åÚ`qÈoa’:Üà}ÒË’àóI¡ Å¡H±`í ¾‹¢R¯u²Í3}›’«˜Œ(-ž ŒßD<Akº z³,¼u˜Kí mÇkûL”4iH!±¡wÅE•Ô›ß¶ÑËf½Ä¯Z8_‚vŸªÙÿMÞW'n%Õ‡óyï+ kpKx®˜XnÝÅçel\¶êaºÆ§#§ˆA³K ES÷éüT¶È
-Œ¾ˆeD;õ›‘ æB,º„5µ³äé
-IEVx[i©ó•û MCá–‚C÷=…ÐÈÏ ½~ÀÕõó)Þ7ƒNòw8>Çîwëôêé‚t­»Ìt«Ã<EÀ ‚†Å5#²üd ¡,º%¯BBç;¦é.lãWœ›ÜûÜÝ<’ÂÚ9a¨Äƒ.vKž
-q›ÅßZV¶¸Œ&®äò®Å©ði¬Ÿa•ÌF/wø†¤°•|ÒÎmyÒd`Í\º¯*ÚßDw§Ìw °)eG8ïÂ5´B¼Hc†µÙt¢ùš^¨3€6ŸoÈ:W¦ z´˜˜éÁéä’*ëÔ£Ÿ@îàâp¯_© ¥ì%Šcga>¯W¹4#UâRwXPƯY“4ìg·FRß vßû<ÔxP>†uÂËe&+
-Dì2Çüߢ¿¢‚IÔnèEYÒÒÇe)ü²:V ùUš>иɚúq:…mɲ¶þUñNžY±B§Ýêƒ&³Ã¼]Rý*ÃŽûý=*n…ѽKv„hf0ó;!ØÅ .&f«RÚ„ Ï‹ë&e¤ãe}|“x$Ó½ââ;£kgž=çyÅg©Þ+a…¶’û.Î)†Ú`NËiߜʼnW«Uäç*i¼/W 6æø>±§“ <?;dPy\Ÿêd汉ä»tóñ#+|þ­1qÕqVø‚¥Éh¢‹P³Á4>t6ó –p2/ÉõÚzî„øÑ=h>±`
-n5TÁšëÑ”’ÐX"GEÉ.4–ú&µ¼ ØØ…'Àú|€PÜLêar ¾0N1fo÷í¼Á¶Uå" ‹*0âù$]s¨>ÓΆ”'â¾ÞÑØèÝf6qì©)¡}mZ€šÍûIÄN§
-Îþ@PD # V{¿Ö%þVõ|3ùÈ”JE3)&Níð{_’ Ê m3™Î1 oåñ S“•/bì~O«¸8/*™Œ²éëíZφä(.Pÿ§žÏdÔö¤¾X<é§îrî9YJÛ)E抰z6Ø/v0 ¡ ªD °¾T㹋˜€7ýP“Ú¡ûµ¿^¶û°iDØF…ṳ̈9Ô\ðØDˆ“Ï%Ë;¥Ø—qëŒà2ß œNý.¶8bWÉI0Uy®ƒÎÈfPw³‘ Õ8ŒÌ" Çsäs
-ZmØFÐÃʶÞïPhzI÷™ð€*qaBrÒ·Ø^ðƒMâÝàí-Õ¨ô¡À˜å®™ÂÞžÑÉö>u¼ ‰ŠÏãonŒ{óæâ<ŠéU¿˜f);›Íp±OË,¾†ª™ŸÔL~‡(ÂJšW
-`þ* ÎŒÔÀh0±ì$(]J+?!uR[LGÓOÁ
->DGÓyØ}—(l ø &‰åSß}fÄ †ù©»7«ôÖÞ •ŸÑ;!)îüP_©cEìì_Ï“Á’TYj¥àê§ïS({ çÑd
-± éÇ¥µ¨ÿ‹0Ò±«ö¡`¢/³I Ph¦€ZhtDįcÅxBkô¹õ¾z힢Uˆ1áû-C^­î@\’ž¶Ê#f„†µ]òOÍÕ5 Ñôh‚˜CGÚc(hƼ<@žðŒe/ºˆ¾]úyèŸãgT —–B„W‹:ƒÅ‹"p+EŒŒûE|ë7p<*6~¾R—”{N f.]Æ&‡•è…MÀNsr'=d/UMzW¿¨8ûÎ=ªŽ´n¸ÚvDôÓM=×ArY8sœ‹ªf(ú²"’å®êvj×;¥ôŠË7/“æÖö¹]Ë\Ù”7Ùë•azgòá¶gÌ)RàÞ%H}!³¡i°Re<Ñ 7¡%ý¿¹a¢d:£gteµIˆ­¨*’
-‡–oü‘éO' °xd"뙂T¯·3z ^‡ø~LËÿ¡IÖBcP/giй.^ÿâ×úÔ¡/jƒX©ÛQÕ ­€ÒÆ-Ô¦4Ê{Ù·hïgZ¼'ªF§ó.²$2ÈÙB Æúž07êÅÌJFØ “|Àmv®å·Ìù´"Ëæn0jª8xB¯QÎïïˆþ”âÞþÐßÙ«À|˜­jiu›¡lQæ5ý%ßzÅŒãÎv¥ú…>GïÀ•Nv.óY‹=Šð ðô"¦k ¿E)û›™,$i{;vÓSë œ†œSW¿BPPúËj…+ýá{ÛÏáûg¬ššLœ/
-¹,6:üâƒ^ÔX'€å9U¿œ‹fkM6¼¿tî˜è^‚(Ò2g¡I›yÕ²˜RôÓ(.ãcÃÿBM¶SaÓv¨‚/uø¹!&jìdR¥ *ÿ!´BSJ‡ã !DË¢FT=B–žýÏm+›ä’…0Ñ
- ’¦ž~o8LÃć4»DÜ϶ÒlÊô‰'´:Y'ϵ:X–¹ȃKKÖr97…ü dé2
-{¡„Fuœ·3žÍÇoÕ‹Ü2C7§jy¸-Í@Šæ,dL//¢„KàôÌ°FYîÊ„³Ýþ9Å™
-*–÷oz ×PýÚúŽÇä–G”30¢ ò ¡€?Žê)^¿)’£Êw8:B-sìFDò±û¹Õ.¯ýaËmwñ¶ÀBUôz8sš3&¥JÎ|ñ$¡9ê
-¿’ƒ½[žBš´¾™Kåd H*ž±yÈ"ýƒß ýzêXê>ªµÌWÕŽ“Ѥi$&N“yu°BIsŒŒÓoLª¸IòD·»ñŸ’ÆãÇ•ÑlèE)÷—¡OŠÌ:˜¶O-h/_cÂ:u* ý ‚(ÖÛõî9ç}y}F)ß×]>9]¾¬šæù%†­Ž8[pµŠ Úˆììˆ4eAäÙoÀÄÜ# Ò¹äY¼I©[ˆˆu÷Ìp•)ÁæDÚøõ l¡ù})¼ºjoÌa %h1•l­õíP”Eöd¡‹#ò!Œí±Y‡q4NaB¢#@÷3ÁÜ´*ìåFÖ‡ù–[>¼üózëþ2‰ØMÌDn…Þ ÜwKØ¢Y(i£X‹ßüƒd¤ú9ò ¯L,ÿì“^^ñëàö­ÂóY%)µ4ÙZ\ÔötôÕW¯ù­i ¢7,qK“ñâ”-Ç?ÑúE@•àë#¼‰&+ƒÄ0¸Ø¡¸04ºœ5Ö–›ÿë“WåÔ/¶fLƉèß‹›¥0³<IíºÛ‹ÉÄ[t>Å¡u±yØ°Ðu:¯Û{®[’ĸ2Ï}’ cu¶Þ÷²' )¦Z`‡`\… c¬—ÖÙ±{OÑØD°Çré ám;€¸LÐl} JÜ„Ž6 ‘nþ‹‚>°§nºxŽPc=‰6pÊè)L[‡+»†%ª}'¿P°aŽ‘45¨lG½>(ÅûE&-#Èkií·jEüÅ×Ö "ŸûmUó˜SvL „„§=ªA2Ÿ¶_5J¶Ôø¿ÒU‹‡_O·V°mîl=
-æ7ÒÁÒq3‚`¦ t.Ó„c‰Nä•×wíÝZKGº¦Ô›.(ðÔà^æÕ—w[.,ÕZåŒ
-cGM}!;4šÍCnœ®2'ÖÊïìù®? Œå¯@9ÖË'Ñ®æp]CÖ-C¼Dû]QPÓ-}yhÎëzqã©Ýcô‚®ËÚ+›ß™A;tocšn’Éæ¤-O‹ÛÃWÓ•ºžÛóÛž:]‚é#Â_fbÈ°g‘øÌÇ õPŠ€Ú†ÑPÅŽO£ªõdU “ï6dÍpŒ‹bçÆ©\¦©Þ÷Œ­;£&{"ÿÚé,–ŒO_»ÔÇÐ9V¼47M=ÍaÍ]:mÎïGAã›P.4”ªþ3€ãd—&•É–è*HfÅ„÷‚¼M:ÞÌk(g
-4–·öÈZýjH sóG··»èV üY).üjcPÌ¥’»nÞÝtïw¼RÓTÔBÇ
-ŠéÑ:kÅÖ ›r}’õéŽVbbérªïHÎ7Õã³ßêí¥‹_©¼“×2[ëAõ°çô­JCRz!»‘<ùq3mÔ¢W[M0hÒ VÊíaL¦3zb¥ÿÐCNãú?O“lVŠšßÍÒ4Øë>Rj•·•ÛéD[÷87ž
-vÚÑKâåÅíÍÓ¿½Í~¬?קS§ÎªôÉžµè6.¤K±“H?R‡yþnv8Âax9™:¯¼&ýµêo<çßb%ðórÿDí;Ú%§1M–UΗUÈÁXÒ6G«NJ"€Ùíì£â%Àì”w¶ðtý—_7×¾`!—
-;ÜÆŠF¸*Cb&Znf]C¡ÈN‹×6Á.þÂÑ, èW91£ðà«iK;m+úbTèSpïGsÊuÊkÏ&ALH^Ö™FV{ð$ ÝkúÝMbxáñå6ÿa˜ƒØÅYå›a¹5°þ¦J0Ëšëö“©¾é™ý¡
-Ó†©"S—Ïz_¥¬Sþ@Î lÀ£ì†D/®¨÷þ¹B­c0ˆb( º
-ƒËsˆŸ.ÍÏxP£þþ\ næèJµõN*·ƒ7A—^…¯f£èïnò˜Øc#ï|<ÐŒ¹a=íÂèœL¹Çt}N9@œí2ò“º¬ð;ŒÔ’`Ÿš瘓gÛ–» “(kw“Hˆ«fz# ü«TU5aQW.;ì§øtÁTK!bñ6Û¨Ú±A2®Èü„è-£þ|âáŒMÍU5j2~áúˆ^]i‘åe-·¨^žÿWeoÙ~äèžÞÊ„×Cô®ïw= ý² {ì}Åï÷šNå)àÒ„½\Š*‹Jò|±WŽMí¡±Òøòo- kÈ“èZ±Õ6"Ù™þ\W7ϧGÂ}VÁc§Úª4ØXoM7ùwÂá›P«cþÕ’Ûl{lY B‰©Ù/šÌÝÖíü¾ì–­˜T¡ÁÜ?ï°êšš+‰¾Å’Ñs­êŠGô†äv5¶ÈÍÌ?ÈÖ§éBÄ<wsÕÆصŸ×ŒD¦¤9 ߥKòã_Ý»›’«á`Ž]} ‰µñnÃáhDÜÀÂ\É&*NNk…¤û0œ†»™¥ ›ýÔº˜Å9}­Q}lêœDª0ŸœÛj2wü“¯µJ÷‹¡œéÃvµvz¬,Æ}úè"öìijƒŠyñý›·î ’±¼cæOˆq¸Ìpãd:3ö¬Õ¹$c¿_W#ò4ºÑ1¬ç¥†Á z,8ÚÈÕD-æ h•’ö5Cº ͧáƒ_%wÒªu¿ â#¤Ç”g!]7¾ô/BŒ]eh©IKôŠ2¦WTŸuÊÊŒk84æÍ¥0Ç‚AÞÈ;b•1b°mÍH;í>nôÏ¢ÖR /#NìqHºà0gÚ…>tí°§Vûa¶ ˜/æöŸñü |¥sçYà¨q³Ý,ÙŽÆ™(®” ¿œ^õÏ‚~¢­Ö>ʧÐÃwHv«;ø´þâÎMÌÿ$ìe ™´´_ÚژтX–KµÆ
-Ú…W¨•fI•M@ï±–KÉ­7‹û)Cc¢ïS`…,8'Îl[stÂ<¡\nc<BU¿Q×ÓãäKüŸþ<¬ÍŽÙ»¯ÅƒúÉM€^ÆÃT»Ì«ÓË4 §¤Š1´\Ï"µÒˆÊ®ˆéâ]x µŒ'ƃÙIÏKXPõ}BÎè‚YÓÝ2Ä6å¶ a«í™TÙÀô&†’–Àiû‰Ÿº¾îpÆ4
-~[ØÝñ°Lå ¸ ¡©Ûa¨Ë=‘yÿn¬%YçYt½¿Ëú7R¬lN%mÄQ$: QŒ²›DµØ†È¨Ð¬)¦ÃºÊìH%Ûß ^>«¡T&8Ñew‹¹ƒã'}'ÅrW÷ ŸMì7#X1nfœ÷ ~¸ŒÓ2Û*¡U§ %›ˆÁÇ:èDMÂ|Ò.Ž«ªˆàc:š®)IËü*ŠÎ¿žê³Â:
-ºâreA5n!Ñ…êì]Œ¨ÁºØ»‚õOWìõHƒ:Ô…—‡uÀÏk2Q:ú†Édf¬š¢ µ‡$EÏÐï8f±æ™€âNØÔ@Gœ¹}\=ñõ°¨öˆ¨‹¼_W/nÀÄbÛíÿ¸¯ß0^8U¤>¾û=O?°g›¾U̧[aý;óþÓSX¦ä”gÚLÁ´·¹‹.võ@/Ò&ÿ”i:dÏk0G£u¨ð“rÏBž7gO‚w üúàü•–”À‰KY&j øœ7¼r 2–á°WNÎxëh“õÒ¿Í7§LŽ„×VC@]ÒÖóºÁ*óë-Å ÃA;}üvñïiCU…—.úZl¬ õå?²ŠcHÕ¸´Ôu½ö!» »†ó±œW‚Ñ/ðó\Hvq•bf€úOÕy3¹;¾Ð¤ ² ÜŒ°š'ÿˆêIܯE|Ÿ¹ š­p:ÔC9èc
-gŽ}“ú£qÍòÛ¨ù›ÂN•¥•îÉ/­„¼Ÿ¿¨ÎwýéN­ъ”⃞êöÉ(ú˜i.ŽJÓY{Ê…ë߃ˆêo&ãX
-Ë|åT¬N!{¶ L•„«a` K=ETBÔSEÐATMb§œ
-Q‡Æ~ËJlQ‹Rü¶×ZB§©{g¯ ^x™‡¾m€ï¨LŽ1p%õïø×ké\¤~}ôO½Ü8Ûu·×çqÏÜV»ì*æGj¸ÙÛ9ýèOâ÷Ž<M×mÆô|UíZ0¥—¶µ™r'·>û’VuûtñCv.¯ÉÞ¯²”ì U=Ú·rèöI3 Í¢¹ØO7( S~ãÈ”‡ «ÒÛšt”š®`½öÈl/ÅY¦37›„Û¦š ;ŠôÑ à<‹ÆN–T‘Z.!`ßêã…”´I¼M%0,(`Y³¡mm¡ §<!È’WÏX®l‘«oÎFž5Ô¥ÕÂYe%13ð}‡yBjú$·¢³-71 \4oà'!¿¾¡Þ­«’[É2@2´F´‚ø„ö€ñг…ǬÜÄ#ºÅ[i©R(|˜.Èm‚F x¼HÃ>&ymr¦-åɽ.§æo·œ¢ŒEŸ¼B91Œâƒ!ÈD4B\\ò.½ Ÿ†‡b.ô¾=ƒq™“s,|Ö?¼´~8£»»³­
-Ñÿž¶l ÷ö" •äjÓ`Zo…hbµÌ}åÏ0—ŸùoÎ*˯µŸÞµöñæ/~ úÕ'Kü@Tƒ¯k5{<‹i»ö—ROBz@-+µyÚª«1èûŒÂ·–µZë¿ÊnòEp7âPi«ú€pV¢;g.Oã­pÈTA3V.ÀÙòV…I’]UAÍÊ&¯æwú{¥,¿f
-ý’OP\h{†!Ë/:9*ÁþNª‘À„y†Ý¢›¼~¸®<rÍ¥Ø.k¹áR\ÄKÀõ=™Ê³ô¤µéšàš)É 
-Ìó¬¤^©êzX-Ta’•éÔUÚjLØ–‡ÁPϲ ‘ Ú €,j%‚‹Bè_|³yŒß]¶to7ɹ¿"Á¡ÒW¾7ÉÔ9NÙbdÌ÷Î2s—O‹D"—MêÓ†l›Ñc,Å=Æ/¿ÎWDk¿þ-ţø¬‰tF%ÿÐjwÕïS;ù^É£ ñšo?ñ
-ÆQ'?ßœ†*×3;ùQhþà“R¿«A±FÌb<\gÜÝ@ƒ×oìfg,ÙS¿´íw*0=a{ æŽ!Ù5"OBŃð4ûbü[ïR«r‰2Ó'VìÖĵv\PjÐÝh «»Œd ­ªÌ'3çÜŸ¬ô£uªü”.ø¡×cšÎO
-DSmÝ÷dU«TòȨr7)z¡mYÅÀX˜Ä5ê¦[Ø÷ËÅŸ"f ‰@êéqD„ç™Õ'~ñHA[€‹Vû¤“õ^C
-ݓ׀-xú€°šNce<Pdc–0`RôA˜‹¬ß”™…r8HXÞú§Ó•~ «÷®tOý08em_¦;nÒB0ÕüYÂð-'y©_‰ôÛº@Á=¬È*ÃE\ŽKδ¿ÅÿØÙ½/™‰HíMâÑÁ8g7m‘ÿ{<Q-u·´å´_;M;S1Dá[ñ7;žŒØ‚†ò”ÎD!m÷í¯`èhpÚh16jä¬Ö’ØŸ¸*¿v/¯`%–ëekáÍ?LhÎ=”v‹…}éƒíý8ÔµÑ89riL&òëcO ý‰„iŽý†àÁ¸¬Go›‹Í²fÂɘz(¸—¡3
-ßÜ}º^hîëgŒÛ·S~¢Y 
-ÄSä–5“˜{'Ë¡esøücl\î½gˆî*š1ŽšÈõ¼3ª¶è:ÃegMvc¦‚Ê癚ËÖ¢&§,€íIš®Ø1¤¯à
-©*É&;jDú`çsÞ#)„Ê4s‡oEcà &ßÙIÉ;qÝ#K¸n›å¯ý´Y|”àŒmãø•6ŒÊÑé>Ÿ[å˥ߺŽ1½é˜Ê®aYÝ«ÀF5PYåaÉ|3ãä¡ïbøM@©Nyav.åh­nî×ņ®ô²¡RŠÅ—ȬŒWyŸ¦Þtƒ7×ÔÀOkB¬œC@ƒž©êo´dÏ “I¿ü“Z©þä}\žÅ’gÎBT…bM+5êõHzJžìfy<p!uš/ÃúZÇÉ vc&Bãž³'˜3{âC"Ã^z| 8m§¥ØÛ#¦ÔjÞ¿øËú½:¡(Èn‡óÐ)˜âq—4Ù¶³dÑåÚ³;AúGòùVQ°!‡®´$ú>®âq
-C¸ÎÞ•¡‡›û/ìë aLãdU±Å,[g¯úWСÖX·V7~æQÈ¢%+ð?éצµ!ùUè³Êk5ãø&Z£Q‚É [äxŽ-b÷uP…#Ïñ¾†E@qIÀ$ä;®ŽVçæ$#ÜíkôëtJ€\¶p5žr„º‘¢€$|H{U¡øæòƒK]N}¬ò†Ÿ€E×D°
-FÏ-¶ 6© †Â ߸ŒçânVä^… ]šMg\Ô<C‰é>KÇ·ä 9·/£‡õü7o¼¾¾Ð¼­ÎÉSö'ž”Q®¬þ´òB†‡Òe|°ià”¸[‹_Ý‘†6ùŒë.'¸cä½M½åÕr\S>‚K䃔t§C稶h5uREæ‹LU§­Òƒ˜Oôz VÇ‹;¬¤'áS™ÇOXñË€¿®›¦™;µWEƒeÔ #:0츜BøUª,ØÞèb
-Òó…2pÈ^Ù†:0|&e¦Õ,?‚HFkJæU'ý!qÆYµwß³HžÿÔ«œ;…ª»ž–3ª[œé@—hžÏuãrnL‘;®ˆ=bªy7¥E>°áíîä=HøŠõzŒ³šâs|Ó߶ª`KA
-Œõ_P-ç'„HS
-Л¨'ÁÚæãy¿ˆ Re†êi[‘¯²2Ê2ýQ%™ÒZâû®žm-c¢‰LPe³o“=ÒÜi:èÑ'Ðr^ùÑ­ßÔ{?z$É&aM%*Æð®iÞ ïÚ‹š%4Üôí#6¼±
-´!;h¾þGáÁj2Á|O¸D ‡?ûµ“îw¹´`ªÓ¢¿¸‚’cçÅò¢†‰‡Î·¤ÌaŸŒÄÆ툗62A»wÆÕ(†“Øs/A'viÙ.Ü]Á‰µ‚7*‹4¥'O ¢ °vŒ÷øF34§¡Æág¢O¿u¬.t¼“®rõ–s}/¸šä”ôÛºö˜#=ÕdrõÔVL­WVŒªÙÄKã‰éS.“ (Õ;ãh"’€}R>•lÏs¯ì³²Ô!¶‹lAËE:ßy&ôœh»Æ2©×Äë2+Ù®HѳÁŸ¨0An´ë‡Lš@°ƒy‡ß[q8^:ZËÄc hjð-¦B _¦–¨ñº€ÛJT§ûš5j9È«>Ú)¢Û»nSÑj=³ÕXër÷Hl_—rß:¯0)]F: ”Ùtë,,pQ£î÷s²•õÒœúåx.Þ!ª±…» šMdÙŽ%󌥢À>­×בtÍýh;ÑN}ÅO™~ìx[ôÒ[ ô)Ò`Ç™[z€Ð¥Ç;ÿµbä¸ ý· ZÛ±ýW=mVùD×®9, «Ÿ³e,ëKj}Ü üï J¼,®bðýÂò3Þ2¼ ­h=Á‰U,jï%
-ìé×¾ Ä92¯kƒG`µÕÂKþ{|*Œ”)ÎêÒˆÁÄRéAîCêD´Ó®ïÒ‰svѬµ>cj
-6müÍpHr£\Ik[xi×$¼šÉH$S<ÂÐ]­H;"þÏ] …h!ÎK Ùç wœÙƒaƒ!Wo§têQ‘21¸¦e}œDó—ýªM¢Ê&ëÅ"þçÍÜ1IpÅQè—{ØAÛ»kJ‡³÷4°6ŒíîO«Ö*“YŒÝ*³A"Õ±«Ì Õ r¤eKãùŒ©$a^Hœ›Œ×ý‰ÞFïNûé)•7µ»‹i?¦: ¤®ý§"×ñ—á
-¦y¼5âéx Î?8€†,ÄÙ%š¼ø*%q$GÐ]È%\íðÀ¸¯±ÆLÆø¤z*­Ë"7›U0ž$¥¨ ×”€ïøq*櫸×\~ghL[ü ¢rñY{âkây9‘ä¹_­-¡„­“ߣ|ÒœZ¿€ë˜û.†zžÜbé><ZwúµžËtÄw/*‘ê}5Tö4[Ï*ùaÅ6y¡W;åRÊØŸ7¦½jJAºjæ”ÅhÜU–Fî¦|ð¥Ûê:]Ù+ärå’ß±¯µíju:Ûdí>1aNÓßø–à—ÒK!5hI¾?K3²< áŸ,ÞÅÁ¸²Ü$j:=úzåmÈ_N4ƒ˜Fäûq
-°’胱«T«þÃ5jíaƒ"¯‹¬Î×Эô'7kˆ]ú†A§òuSà‰epÀƒZ˜%ÆÅ…¹­Â¬¾=úð¤´~¸Pù*€üÕÝ+àŒVd˜¥ódqɈÎEX—dÓJHÁ+°:ƒÊ}Ð)#ôø@ײ!R»ÿ©€£ì–ù
-;\ùˆ¹¥e7ÍHÖx³¡l½ [sÉHù[êƒáëXôËUNÑõ¢i X–Ø«c4ë7û\Aº0«<{ Evg]8xp[lZщ5õè¹r÷ûGâÈm*Nêê:Q+|‡gµ}ÁÞ\d„äO¾>hžDä¡GXnöº +b¸¬óÇ;½<nõ ÄߺƶrEiO8võÞH•kö}aq²2ß5|LÇŽ´Fa
-ÐQk|/Û9¾ÑxÜÜúÙP7˜ªl©¼å© 敱<ý6œÍ¶Â=Ÿù …3ñTI‡@TƒÌ07ƒI`5¼áô‡lcoƒ|áþü]¤ãÏ(^¡¥µºÈÕ6ÿCÞŒ Ú롾—lšÒÚ´ë÷aµ1Óþÿ×Îœÿ3¡
-šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p
-øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸
-^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD
-­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A
+/Length 18167
+/Filter /FlateDecode
+>>
+stream
+xÚ¬µc”¦ÍÒ%\¶»Ì»ªË¶mÛ¶m]¶­.vÙ¶mÛ¶ñõsÎ̼³Î7¿fÞ×ZWFDîØ;2“„P^‰FÀØÎÐDÔÎÖ™†–ž kacèâ$cg+M#hgm økd!!r41p¶°³6p6ᨙ„MŒ
+Ú¹¼h˜™
+ÿß­tþFÄÖÈÎøŸ)Qr6°5þ;XÿËðÛÈÅÑñ¯žÿ:ë þŸë¸‰‰»‰Ìê’W°eZfºs FîЄ°V_èPˆ}I½rQ•]·_Ú¯Ž
+ýêÚ†)ίVÅ3ûÏIÊÑtk²î“«|\ŸŸ½È›¤ílT‡tº%ðéçjQ^× ÒÛ`š¬ôª‡»
+Šº¿? ð¦Ú™¡®Ÿ)üºø£?Ù#ø¥ÖÅ¢u 5
+p¼¹'M/&&ˆ”$PÆã`¡Ž’küˆÀ7:~†ù“EœGå¨ð@[&É—çZø±Hæ³mÇ•)û~õŽ/š§§{<V U—Ê®]¡Ϻ+ã>!¸£C}²§ªM‡×Žì ÀòYÞx°¤þQá¾ÒžX¸Éªi8M;:6ÂÂ~>egš1 âCP2ƒ÷M·]òþ2Mÿ½ Áø‡Œò!0‹v'¬tHèúøÁ“zQ<†ó3í²è½*샶_Z¬ÌòØ ƒ,bzLC âZˆ`R u„¦åý´ØMŒ23­øGt~æ§Æ[G˜bCŒ¦8¢:f˜8,Šðjze¨ÂÈ.ŠCFÿ9Xé°ÍÀ#Ãì¯?–@FÒ*^€ë¸§­áì•îŠv>S
+Vs£€·Ý‚ª M½§Ä0š!a9QÛáù5ýGdõ÷u8•ô _ Ä;+·¹V«18önQ±ù-Í“ªT†ã~í-oò„lèq#]Ïè5>ÙI]n'„ç ±š»-¡ØÃF޳ˑ#¨VFFàѶ|Â0§öN=Í}åÌ_$
+t•úÂ2"ÄB=Ž‡Ãýw=ÓS«;vbƒŸ¼5­µX@_»«“E¾˜}e)Û.B2*·µcÊ~êJ“õïðªÝ
+HÅ”7dv“Ÿ¼uAeR§Οµ~·" ‰š~(w·äpÍÂØV±Ð¹ÔškYòV¢¤‹|B>æ¾s²œ¿­m@e¼É¿ý†‰K¯ã+ aØFÁå0~¨¥?V· £f@;ÔK)”wrïÕ3“ÚîdܲDúP(ØÔÔøœ™ Ð]yžv8Pé¿]Ú½ýÚêPÖÀ¨Ôl6À·¿ÔÅ ÷.Îe‘š»¸‡³ÉˆÎà'Ãf9õ›e
+ÿÂøkÄ×\²)1]8ƒ‹h¥OmfÈßaÃé“ÆS“Vò ùëRç«W <³˜&ДÏÖád­y¡¹,˜÷r¢ógoº1Fî×ô ;Ë•˜,ÓÚ»W,¦j?úÑsvÕàÚž.fê"Sp/2²+hÁä.èö ú¤ õ´ÙUÏÕŠ<J@öÜGP`rèº)Ò¾7Ý#‚•ÐvN D!§-„d/ ¬tXzzÔót߆å~à(H5vèÐéA+ºË\ƒcù;0·ä8†RVµM+Ž“€=ªIÝJ´H«’ Yì‡ÿ3IS¼,µ‚úî@r—ÜMhŠ”žµ•ŽÑ·X˜2O}ôuͨõ0ÿL˜îáw£[’òœƒëúÀvWp„ù-H$÷Ä]øŒ“Üm­yïèúAêñë þ£ë†‡^Çe:rg1pæ­eg¼60¢Œ½ž÷s¸Ûü²èIü#-(öÞÆHTŸÒƒä¦ôp fñíBOÞµ âU1C)áÏ3&E&>êîì–‘PÑS~†þjêÏCÔÆ…O(Vô|:ÌΧ¶™¼ Õ†kFr6MmvY4I.m‚à8¯ä‚Yúl—¹SqÁH«³a²þìz$ ¬jÿÁÛè&”—
+]Ké<#
+ç©^–v©K}³ÆëY‡ŠA%E FÉ‹PßƲÍDäÖ›‹ÄÖ¤ÓMÕ"]™¾ÒÀ‘;Z H·Fh ÀÕQK-‡a³ýý¥¬ÝÒŸ%¥1”NTæ¹$Å#¤aîáÅ3Áë•F?Ê·ØcªjÇc_Y0Zì÷–PÒLÕÃ(
+-wã0!sž-,¼‹¦Ò—t]§Xü²Eùh€ˆ
+ñ~–Ä-®ŽÈ$`òôtMÐJS]âÁîâÙö,se, -+©ûцò½Šs`Ü&—lÁ8å²£âDÊVÜ´È”'ãÈŒžTFû"ìçÀp‡LÒýêÒÊl
+Ê^þ¾Œ* Ð,Ú!4\õËs¾‡Vn Ý ‘^gnaž](+P>—[¡õöã¹Z¾Áxš.¼—Gü3“Û\+\™~ó–F]µêß+IU½*7»àd#ØÖbãBî *m‹'g¹D²m)•SA‘X¬0Ñ<HX°‹aXtͤlýaIG™V~¼#) $IœÀÖŸôv"Sóy3¦³NUáÒ0鼯k‚%(jJ0g.3¦JR¿£°ø¡Z€®ûÆÔŠxI t¢J){CXí 9Í^<ß&p3Ü5’¬*|$õ/Š¤³†ÐXjšÁ
+¿ÑÙã]šÑI‹óC’(¸-E\ôHˆ.çÎoBŒT…ž®5:@¬PNkþùò§r¬‹G³ï%馒ü“8™¹/qî1ðBÅWXBÕ½¿ý¢†Ùј©µ?‚\Jík.ê}êS¥Ë€¶‡ÕØâÚL> $©Ärå`\í ww¤ƒ¢¶óŠŸÀe
+p‰ïå¬tpy(¶ÅŽ²Wå+\FEÝÔóG9 _AóÃDYß=N¿×€õÙ]EÒ8çÍŠ£…<M®Ó";\ÿÐæŸÜræ¹”ÏY`¸0oÜ{sêËXsïrìjƒx—d½+øh¯µ%â!\êR-±COÑà9ñ^
+n
+t^B… ’ y‰ÜD·@µ˜¾Ó ÷¡°_z¶2µ$㱘Jó¢a“ÖóƒTp;ÕTšeIM•t¾Õ5Šñº u4¦ù>†ð<î>Õj Úhá:â—À–Ü;Æ¤ß ïáî¶ô„¯²Óyú6±¯ê«¤­—e\>‹.Ò¼Ãz@Š=ü¹v³œ¬àr†¸/„:΂1“³r_ûÖ‰½^oa~sïªÌ(¸dœúvüa$ OÐU¯Õ’
+Œ:¡G=ñ›– æ@,º€5µ³äj²é49èC’Fˆ´d|cp¢ˆC«°'»M~”
+3¤î§Æ¦ÊgZÉSe–¤õÕo0§Œ"N%¢.ZV×¾(ÜÊ1*”ë´Z½Se´™·Jè¢]¦Ûq¾½EÆ.Ó»wÈ N÷§`|Å»x¡ÃEGoVH™à÷˜brÂ$µ=¯m ec¸—Ÿ¥wlÏÓ²æ<-û,ÖzÅ/SwCþĺuŠ¦4˜U…ÇtÚ3grâÖjR\!ŽóãâhÂÂÛ#²3ðtâ‡çe… *‹ÍãQÈ8òù)ñ&Õxô€Ä ŸcŒDTyÔ€ùkÞÒd8ÁE Ñ`Š:›±ŸS°J™ûçÕ
++fÃS뜊”]W¿œŸ_êÓj™#íþkËÏáK±7FMM:Ö—
+ß\ ~á^/r$ŒÀô”¢_ÆAµ¹*ó«·töˆðNœ0Â2g¾I›qŲ˜\øÃ(6ý}Ýÿ\M¦]~Ãv œ'eð©.&räxR¥*ÿ>´BSR‡í
+’†ž~÷/˜ºñwhVñTÞp8Åx–’lò´ñGÔ'ÏÕX¦ÙeÈý KæpRY7ùüsd©R2{øzuì×S®‡/Õß¹Ç$†nN×”rp›šdYÈ6^^„ñÀiaõ2œñ§;½³
+Ó”ͼ“¹hÕ®û\,´§É4.O65%FMuCC\ŸìO·­:›’Ï)_7><›[ü}e‹'\Jöè@Lˆ¨kÜóqY b½âõ~ÙM¹®¬e|IóÎj+”ÏÕcb8-šÎr`FžËÁ
+?“‚ø½›Cäãµ¾Kd¥¡~–?aÒs‘Dûó¿øuÕ0Õ¼ÿÑ2_QW#¡JÕHH˜"ñjc†"”â,à9¢]ŸúPq“à9Øjuã<!ŽÃ‹-¥Z׋Tî-E›šv0mœ×^ºÂ€ujWâ#¡€(ÖÛñî:ã~~y
+AÙF˜/¬³cv ¢
+°adÓ@µl¯b3@³õ5ÈqâÛZÐ…DÜöýø}`OÜtq¡FºlàÐ’6!–wÈ «ög¢ÈcÁ!ÅkjòQØ{½“‹õ
+MX†“VSÛoV ù‹­®áG<>ôÚªæ1&×m›NyüÉxÜz®×ø½©Æû™@ Z<ør²¹Œ‰HoskëQ0·ž–v€“3…¯»‘ê ðCx,§¼¶cïÖü»~¨cR½áœ W-îyN}i§éÜR­YÖ¨P!fØÔ²M£Ñ<äÚé2c|µìÉž7àòàÊXî4Ó±V.‘z%‡ã
+²f â9Êï’Œ’f1èÓCsî\׋Wí¦½tM.Ð^ÙüÖÌÚ¡xÃÃtƒD&'íÈx`iêHÌþM‰ë™=¯í‰Ó˜>"üEº4kÖOŸ¹Ø.r!PÛ0*J ˜± øj]YåȤ;uYÓlcÂX¹±*©§ªw]#kÎ?úÀ=‘3·;û %âÒV/ôÑuŽ. äLSN„󅆘sOó{QA~ÄòŒ+JþùîÃv²ÇM•Ì`Ipå'±b@{FÞ"kä6”5š Ë[{`þóbHsý­ÛÝÙJx£
+þ¤ûër½ŸÌ©‚³fÎÝtw4N©á*r¾‹m€ œ* í³3Íõ±(‘V[‹.[³ïäÙ“ÄƇGhÀÜF~pðmï­ÒÎ ŽCeG±üAÒó¤>ò(wnB#Ñ6±Ø#fV‰è·Ú¸ù0 e/ù:Ò!î^Í­A[£¸ ª ñmD04µ3NDԺɌ-~zÏ_ÔªçõIÈq#"u2íõªîð¸ç…¬Gûó„ZY5ÿs«^ÉpAþqêÆè§ÜÆ œÐÓxwwå£jåhZ3 5Q««Ü‰k«²Ÿ9O8²škVä™Úh˜R¯‹åã *LãBÊP³‘³]OA¡P†´¢ÖŒúK•»ù –É›ýøR ÒÍXäôõ*B ÅCòýÚbŸ.v[¥Þy#½0oÆo}5št+zÀ˜²³JA1-Z_{µè*DBC®O’>Íárt MΟ;#âø³ õ¸ì×Z{©â
+ï¤ÕŒæZP=¬Y}«’änzÈN$OÞzœ Ûyµ¨•f“ytªT¨å2û“©ô®©oZÈ)ß৩Ÿ›§ Âæ·3TuöºäZ¥T^--Ýú£ÛzµI8çu`##Pô9ðQ£¦‰*²J3ŒøoÙÛjûÜ÷øË ¹{ ¥ïÑómÕå}j*$ õž$Ó;¶£B
+·K=‚'h²@ßóh‹•ÊŒ7¯µŽà8X€› šÞÇvÐkÊ]àŸSü=Η]äÖ¥ajË+*¤¾o²ë”¤0K>ûÊV$öåÄgÞ·y[ФÈèYW5")JÍì!h¼¿di|!6]$ÄÕXT}|
+È›`”¸5² å!4/VqT,ù’ºÄ÷·Ýg¡»Ý?€¸Ò?FE£tK´²uÀü,…LÁ‹VoùÅöÔ©:Ë\ݯÓ&§¶*á—sÉB½hšYiÉÐlóƽ"΢N
+ióÜG4ƒ˜Y8åË
+²á²‰Š.²%§:‹™»‰A{okÂÏM›—ßçB/Èñé”ïÓ²fOk¬ù]ìŸá©Ú$UGÏ y›j‰Âx0NùSîg3V8BCúZqœh‘à­ÃÜ8#ìêLÂÃ-]ñ0OŠÕMærÏø¸MÉ“h Z&ÙÒ¬­¦Qõ5eJí"oëÙ¤è ]yƒ³ÏãRÒu?åþ>®Ó(žR‘²LŽA†»vÐnØz²)‰Ä "’xœìd‚W[f¸$àµF]ˆl,1 ‚Y_jžæ$Rå›:ˆGlå)^ÕÈÓ;3ò šã«ÔJ˜+͘ŸVlkˆšu‰ýÍA¼ fO""©íˆ&&L}sjÖü¢|åõI™m)ýïÃkDÒ…~@XpY>+À8cæ¾8©=<VMò­/<@Üš©í½éëõéØS1CöJEï5Öb“QÛ0o·e­árÀ¼ð6Ý)#/ ÎyMð„½%tFhSTD¸ €>_£Öý‘Dbws»÷³KøbíBw§ªi†#sXꇈz¶Óe¹M„[ÎûÑzjÇT¦o𨉱Wr§'Kýeö<¥„v³;¼(§ŠÝ™]
+Gzߦ@ª9L惣}r#f9£¬÷B/o´þç~B3l?9uB¢˜”ìÎé‡v’ëƒó¢²‚»ß02=·2IL./4í ²ã…±>…SùÇÕðý|žO`s}ëë ˆ“yúóŽzè7§@„¹‡ÊòÙ ntæÌYv‹\¡¸Î&Ê™º4¼XObæŽ{´N¢ý)­< ‡¨ï ûß‹TºA|夯¾Ø†ôak×J¥0 SPÆÐ>*®á7—æµTå`ƒ_j¿iþ <ßB
+,«ÁË&^“V—[*%
+LãDÉæú5š³YèûÜw'Dà†<ÖP²?iȯb2‘sÓ'Þ»ÈDcûˈ‹b˜\]ƒgLâ1Ú÷sâÖ³þé|Í+Gæxïô’RÉÝ8V³-ÑiÉJëÑbÄq5¸kr‡¾éÃø}$ªÎaunj”M*qœsÎàFi7pîßp¥ŠF2çØÀOªAŠv’/|(¹ï~ g$dß¼¡ïñâG*†ètÛ*»_xö«|l‡|¤¯<ÒQ’…µ·BÏÒbˆÈçSæ|UX¥¤³ƒö‡kmƒK.¢^>^XK¶Z“–—õ"Ùj‰\O__y¿U2N3•ÆúÁÝùæ²v3©aþêâVùóìM $EÆs^+îÉ%ºœ¶ÉP.LY…Ätï'FøHÜvq¡ÉoV'¬ûˆÇÕÝ3Òm¹Sì¾ÀÌÅEKð'í~Þ*žÓñžÒ­CȶvZÕJ^õA4m²\ƒKýa Ž³7_‰ˆþÚÁvdª®”ÄÇ0=£m"=®b."nÈ_§XŒH/zþóÕ›Uí MígOV,¤yU—.* ±™\QšcÀü˲²>^å„ ÀüÏvÁbÀ ï q[QFÐhXô.q±îõ_=B’¿Bƒ0qù™àú9Ã@ß\1É2Xü¡öaã4réZ¿¬î…ý`$Wü‡ž††˜ño§Iì¹÷ZŠfåmñÕwû‡òk%¥g©Á®j¢´ç¿¢Dù¥ÐÐÈáFyßÄOt‡á¾<1‹©Mq.Ú¼}-æöáA*zw*üË3{È%äè‘x¢¢ÒÉe)õµ–—òð€ÃŒÎ~£'ÜÜ$Ëÿ¾±†å‘?`âÕa+ºéòw¢äp¨3ÒÍVèe=å’vˆó\pSìy÷X²ud;oª7Ím²óù+÷góuÆ'â«‚â´d|ÇÕÝ S>ÿ>\í8âUö¼­´Œ¶G=Ù\ݘîÂqX¢¨
+œ_ðÀ,9°(öhgû¡o¯jÌÖ o4çþ‚‰f…]Ó좙žÅm)ÜUþµÞíQSßïקãW m‚dôåvqMàÙkN‹u¶üû‚‰L£R©i nAÝt]«¬9éT±fNûh}¼#ô ÃHNº *Tñ³WÅ.}*ZùöA0ô‡©Áše¶`v¢ °ªC <Î<š”¯Šì6-MÂÁr¹Èhݾ’ÎHR=­/«ƒ<öí€i"@[®/“pR¯óùwUëz¡••zÌÌ%»Æq
+ÁoP! ~}(™ü5ÌÅ9Æ;Õ±Û´[H.¯Ÿ³ìdÔÑ`“ ÍÙJ¦S1<šH ë¸ÙìÛ ¼°Å˺Ì}Fµó¢¨(*XÎò~¸‚„Ø€gؤqÀìSUhyxZœª.
+YwBæ­‘03ÐÞŒ}NÔ‚‹hÀWºœÌ+wßÑl“1Ë’CQС6]áÐw\‘’¦…Sqpi& â?sv«=ë¨zøÅ£ðí½;Ω\º c=EB/›´™ý‘“5eª~D§ãƒŽ&Þ)^LQézåÚÈ»„` ¼'8ÌçvŠ ÔPææV•Ìz(ÞjrHOZªî,ôÏz­Ã7í,₸ t!>Õ¸¢¯Ò»ûÄ&MÌ6ª!ÛaÏãJñ¼oÖ{aA¡
+XúoLaùÐÚt¦@a³Ð"—„S ½ÍϹÎóSß©×C¬ÞML[IÁÄL¢Jð>¥lg¼‚v›ddÆ0¬Åü!½ÈœKis÷ŽúÃ’bk\¿È†€ŒsF
+ˆ;övû.Õæzi”Áí¹œä`f “s(éA¶R¼¨2á^: Ä!=Žfý¾‰;ŽW§c~µÁïnS¿‡ï9âÉLšß<Úφ¹Rëä0Gc­vѽ I±¦€¥('§q 9õŒË
+ªþ® æ¶Â´]›†fŸÔd:šþ‡|B<ƒ?X2¾6ñIãpËxCCMS?ILÑE[¤Ÿï9 _ýïNòsª¿pÜÜ E²A™µ,¦/ŽAd-ÝÌ¥®T[c—[Œ”ƒAN‘í녻ͅOXUÅÑã¾3ýªõwåߣ ¨çïSR ™¶µTJ]íy©:­ˆÍsÆ[@¥*sÑÓSyKÃOhÏ»E'”ˆÛ?ˆf’‹¶2楄pL’
+»BÕ=Hv1eÛ¦š¤ÎûÂÊt Û>–¶,úÅÌÞ$¬Ü¸éì}-160ŠðÿàÏ“t¶û»i$¶ñ@]¥4‹µyñahïwn
+F×Ë0Gn‹ÄŽÕmâ믔õÜ“T^-ú 9]5pšzxë½!‘ PÊ Ü§`;¿¼TŽÌN®aÒŽà C›½/Qð
+¤}V£×ÑÈv®_`Î…,$ ò£3¶â[ Þ¦¶J,‰Ìߺ‡ÃFŸ°¾ÖÀªÄ‘˜qhíÖ Ö˜5/$æD*ÔU›Þ‹]áÙ´*Ìz6£¹©2Êõs+ÈÓ#'R”±(d…ã½ït"-HúGÏ\!j´çzóPêû7žœF´Áë¼&·æ›Á™\} 6tê¿ØÎ9Ðe4¨Í´ô• ±B’}¿O„,/±²X1Én·ñ8o'’¤¾5Ð-±„'j#^)\ ³¼ÃŠ–Ì?äNªŸ²$+ïц Žñê…‚Ýxš™C>b1¯):ÉÃÐ]|¾ÇÊìóÂý=(eѼmoL=Ë ÈŒžÙíÏÕ*9Jö–à7J’GKé/cLò L>[úHAÆÞª©µÄŒ'°‰i5b¸ «‚ݧß=ˆ†ÅïJŒ"J¥É±K¢>Úûˆ_1]@hünH%|Ñ:²¸ew·ý¸90ôBK&×åw5Bzh¦’æ¸YdÜóæg}D
+V;Ü#R™'Ž5ž%g|!@1žG½Gø†aU!Ðs…R÷+‰µ\[€gÙ]gÑŒ:)
+Ô‘LN¤@ÉÌh"OîD½’(ko]¬cúÔ=Òü¸…&TΨD´mÊE%JƒÉÞ›’~9Dªô˜21xBou×,ÚÔ ™Q
+Z®ËoÛ4ëŠ*s³°ütg†©NeÔú#‡ßìF¹¤¹K¸]C•f/ZЪ}¿@ôFêbM̼¦K´ØËJ®?L›^ëåɼo¬àÜ^Såõš¾qD¬E¨ÁOÙC¦ª†#¢HGd ·ó¡Æ‰APHöʬãÒ_I
+Þ°S, LqÎ*™C •–ëüðÓ¨Ájl>ækøƒó
+þ„ÑŸœ¥*´ƒÃÜ! Àr™27lÛNâøò,% @/üùjÇëf­„@´RÛÛ¹Õ:#Dô­N tAÊ_‹+fQ$'ß“_­9ËW„~cŒ“üŠ¶aÀ-Í<Õçxî~)Bfvd%¦Zýd4Â*Œ^ÓÐÎõ(“nÖ•Á7†Îr{S¦æ”‹ÏF/h8“¤s$ÁN…t´æzi›
+¡â¸0Çø$øÖ;¬šƒyëMŸžü tý LïXºªA- ø]·ö•9£ö˜À[æË#­oÏ}ô<°F—ŸA¤Ì Èúë…¾KUÇÅÎ}Žøv^¸úͺÛá´„W…Qo;,@o˜ùQ@&×_}=. š×Š˜c¯(¬t\™z±g¹8§Ú±ŽŽÞ¦LiR™‘KÇ>\
+
+“;·!iÍ1w4!Iõþˆ÷Ûû¼ïðy¤’2¶
+¼–I㊙•oh†ÿ9œ¡–Îí°Å`û>C¼]ûÖ ãP[iéº5o™òS·ÍÚ¦b¸ùP7xÊp]_x+Rl¥Ã×z/CUO² âRÀ¨lX ;²
+VÍ]êAy³XH±ÔŒèyÒLåýkoù"-Õ6_XŸs(GÕjØwOÎÃIÕÕ\‘›"NÚGvB<dÎ2æUøõÇͨa'nœ"dáõj›K†·…éÀaµ*»Üz^YCOs´’âUerÕ3“®©¿*̶^qèåSømÄ“—´¿Ìm+V#.MïäîuS³°¢º ½7Rz·Ú•DÊ£{ót§UYEzØ”Qù-t²y˜’…[ O[UÜW¨‡³!¨ï5ý ¹yK=n¸±u».5®°Rë¡fð¨,¸V2›è>ÓˆŽ…¤Yô·ØfàÄØ(ßÁx‰!´à‰%žM>¯Z)
+å"UØð;z¯Ãg«Ô«¼L’"¤Ú-Û‚ Ÿ‚xwÒ×~ e]bþL‚¸=V›Ïóð¨-ÁÅû”Cª³;ÓÖoä®Í ¨ÐÒ&CdÊÜÞ<_}9Ížsßú–M©’£ê˜Eä‡S+ø{ðåÅ1Kg¥V£2¾ÒÁ5«È–­eéýê õÏŠ½SÅöÁ…®ÙK¼TùГ®°zc†\wír,Ö™yÆTôfDÇãF^±–ýtÚ|¶«w]’ÂйP
+¿,:Fp\îŽr|0`Ï!ÛÍéy¾.Nïè^(%×½ñ>Ü0Ø]^ÒC ‘$®Çž5~<ðrpÊÃz>ŠPãuÍx{¿šècAÊûß·™ÍZÆ~œe·9^|Ø™ª´:öÛ9½0 *ÿ}ôõW'¼D>½³}=à -zžûcêÈ^‡õsa`ÔúþçBº&¿¯ÈÀ}Ü–#üÝ×õ,¶…ð€5nXœ`KÃ|Úªup´ëqª£¦Ws•³Fþ»‰ûë»ÕnË·+1§!NqM;Ú¦”+1Åôä@2Z œXÞ%ÉŠû:bj
+XãÙS9´½ AÄŠ›˜ì \¿j‹Gq‘ñ YÔ4Ûûª2x"…þ€¦Æ">5IåñOù¼Ðù)þþbZòZj÷Ö›ŒEŒ×©8Œ†–BY‡tç÷]Ü þ×™¢Ë€9£ýd%ut o¥tÃØ_‹Òs¼#Žp9Ä RsˆNóÊ Aα›‘my_êB[öéNU9Wɶ¿~›ê?
endobj
-953 0 obj <<
+1228 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 34
/LastChar 125
-/Widths 2150 0 R
-/BaseFont /BNCTYM+NimbusMonL-Bold
-/FontDescriptor 951 0 R
+/Widths 2715 0 R
+/BaseFont /TENLLE+NimbusMonL-Bold
+/FontDescriptor 1226 0 R
>> endobj
-951 0 obj <<
+1226 0 obj <<
/Ascent 624
/CapHeight 552
/Descent -126
-/FontName /BNCTYM+NimbusMonL-Bold
+/FontName /TENLLE+NimbusMonL-Bold
/ItalicAngle 0
/StemV 101
/XHeight 439
/FontBBox [-43 -278 681 871]
/Flags 4
-/CharSet (/quotedbl/numbersign/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
-/FontFile 952 0 R
+/CharSet (/quotedbl/numbersign/quoteright/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
+/FontFile 1227 0 R
>> endobj
-2150 0 obj
-[600 600 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
+2715 0 obj
+[600 600 0 0 0 600 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
endobj
-938 0 obj <<
+1207 0 obj <<
/Length1 1612
/Length2 18760
/Length3 532
@@ -11088,7 +13706,7 @@ endobj
>>
stream
xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd
-ŠšRò
+ŠšRò
üªm{|ÓÂv¸* Þk‚駹?ÛÜ—Ní>ö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPߧ;X`®ž¨üH\
üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ
쿵$ œÉ„®'~
@@ -11169,35 +13787,35 @@ i¿5xÑ@>,Ïu> w?tiÓ¶0ûôIÏä#%(ù‰ö
^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹
Žµrð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg
‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq
-oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦
+oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦
endobj
-939 0 obj <<
+1208 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 33
/LastChar 125
-/Widths 2151 0 R
-/BaseFont /KKBRQL+NimbusMonL-Regu
-/FontDescriptor 937 0 R
+/Widths 2716 0 R
+/BaseFont /WYLIPG+NimbusMonL-Regu
+/FontDescriptor 1206 0 R
>> endobj
-937 0 obj <<
+1206 0 obj <<
/Ascent 625
/CapHeight 557
/Descent -147
-/FontName /KKBRQL+NimbusMonL-Regu
+/FontName /WYLIPG+NimbusMonL-Regu
/ItalicAngle 0
/StemV 41
/XHeight 426
/FontBBox [-12 -237 650 811]
/Flags 4
/CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright)
-/FontFile 938 0 R
+/FontFile 1207 0 R
>> endobj
-2151 0 obj
+2716 0 obj
[600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]
endobj
-898 0 obj <<
+1150 0 obj <<
/Length1 1620
/Length2 20127
/Length3 532
@@ -11205,7 +13823,7 @@ endobj
/Filter /FlateDecode
>>
stream
-xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<
+xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<
šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\
ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶
¦éÂú”/é„ÐaF)¹ìÉT_Äü AÇDF@’_²– z¿IÂ>^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î
@@ -11279,136 +13897,130 @@ K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW
p
íSß»bò7+֘ߠáænÍwˆ'£#µE°nx‹¢PšL~|ö4KQ¦–!¯jn£ÕªîØãVBGE”}œœ Žý­Ð{ƒéV³”Vã0¾ô.¶Tv‚Ì|` °SU[¸U!&ýø7 >hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl
-¹ƒ%ÔÕÝÙêjý2öáýendstream
+¹ƒ%ÔÕÝÙêjý'óâ
endobj
-899 0 obj <<
+1151 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 151
-/Widths 2152 0 R
-/BaseFont /BGSVOO+URWPalladioL-Ital
-/FontDescriptor 897 0 R
+/Widths 2717 0 R
+/BaseFont /FITVGS+URWPalladioL-Ital
+/FontDescriptor 1149 0 R
>> endobj
-897 0 obj <<
+1149 0 obj <<
/Ascent 722
/CapHeight 693
/Descent -261
-/FontName /BGSVOO+URWPalladioL-Ital
+/FontName /FITVGS+URWPalladioL-Ital
/ItalicAngle -9.5
/StemV 78
/XHeight 482
/FontBBox [-170 -305 1010 941]
/Flags 4
/CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash)
-/FontFile 898 0 R
+/FontFile 1150 0 R
>> endobj
-2152 0 obj
+2717 0 obj
[528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ]
endobj
-801 0 obj <<
+1017 0 obj <<
/Length1 1630
-/Length2 15892
+/Length2 16214
/Length3 532
-/Length 16775
-/Filter /FlateDecode
->>
-stream
-xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå
- ùËAKOÏð_–\
-ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.
-`abû·Wÿ²kØ›mAöÀ¿šþ«
-™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖ
-úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ
-¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ
-Ga1Ã8‘¯YÛ«Ÿãн>½l•ê!¾™Ç”œ±Rš¶?àW'‡Ù_NÄåƒÆY4!aÔ„ø‰¥–
-/ÓLòFºVÕa¥¹òÞ+sTe˜1‘G·G]<ÖlI¯7E³±+’Ò=‚,Cš«OÒØor.¹kÕ /ÁÓŒ’ÍU±Hi~|ŒÖwÚkµqš‡~ƒ¸Ö£7ö³"ÄÇYæ…ÅO k_ã1fo4,ëIoböm5¹‹²O½k‚uÒ¥2ƒÞ¡úd‹j¨7W})“Þ‹¤ÐϾÑdT¥wÇ„{•ü¦ÒfËç«Ø™#K˜€Nƒh çuÏÏ%¢>ÞØXñÿàÛñÝ%rá§_&ωbksà£uÂÑj£«ÓEŸ
-ö:çkØ¥»ãÆðòvÏ5ÅΰÂÜ0p!.ZÍ2§.•`Õé;ûòÒŸ¾´E 'ôòL‹~­'"Bδ •RÛ…ê뚀ÄÌË1ú€Þ‚`0ýzл»-õ®‰ÑÆöø$·«|Â9˜ ühˆô`´6GÞ£h‹º¢:"ÎÙ;¾M¯_­µJ%îo%ÒÌnck—ý'y¾‘ýαšm¡‹¦ƒ”õíÞ*{ iwQ[™¤kžç Ë tîF!cö8äÞŠNßãÇx´ ’Ü!Ä’¥¼Ö¢¦¥Š—Î~_ó©àH¶ýÛ±1%Š–±Ú¹ Ͼº¦á¢Õ>ÝMÐAŸdZ˜Ê51Ýb1ܤɬUð/
-‡Ø
- օݧ{ÌæßÖRáï›I“¬ïØÃ4†ºéd`ðe'¢ò›KþÈé•ëÀ0 xö¯´ØQ¤Î]åhÓJ;ZL½"7Ò–ñà|êTñÌãço2R°×%‚¬Xs­üòc–>`pȸÔ¢D…Üo½I[«4uÉG ‡äÇ]F?bo÷ ¦"1I[#– x%‡x‹¹žÆɬ²×Á>Эs*´Ïühd&Cîx3Ôà9‹œkMŒ™"SàÈÕÍŠL€''ƒ™C¦eòœÿ@ËÞÀ4:%½BÔ‡?Ö´OH6c{h¦5/çÕ
-5’QÄ„Qƒœqó™0=l­\αç
-¥×$á_~Т:ò›l
-Û…úMÚ„m>ô‹'Á†ž§MýO³qÎCÄ]´5CXá*\•MN£dtWî
-BJ!•l!~X‡’Õ É•aó’1Ë"/°E©ø!Jü÷™oó§KDMk§Èéw“F±§Ûˆ{¹g,˜6Q4²«lía¤WÈw©4q’7_úU0"¾B` Ï"ø?(±*ë2­³G€ ¡fÓêQXŽŠJ5úºîÚ ñ%èÐäíb¡Ê¡ÓYÉ_c¸p'vÿЮ/]·mÐøD‘ /³îwòŸÙ|&æ>¡®GSÜ° ¯d9{¶£IóJŠK÷9fã¢éŠ ©þäÁõ@ñ¼9xŒi,P¾*=cùüà‰µNm6O—^ E› ªÖž©ÁôЮº
-M2tÉ»bqJCgª`AjI@vr]Ú@Ö *Ó ä½è¼‰_‰ä”/ú¼æ/
-¨á"R’´‰öÆ$ä ÚU W=ŽgY·'æýÕ ±M‘‚‡{}•ÜÿöA®ô5±ò½U<b´Iïqç·3Áì\³ù«çsÿ^«Qº×I?^s2XÉOzG÷6vïáæàæiðŠáãAûÍ6ü‘îav-œ2æ¯Krʃzs_4/“íBào[çç3r„¸)_&x†·¦3‘ÂÓeX’9iÏiëxêל-9ˆ‡sA\U Û=$˘¹¦G ÐñSÅ¿%ÂßR2õ«&öòôtÈZ¡EÇ£ÚùÌ.êòhnSm»Ä³=£Dý”Çõ6àÆœêk0¼îSF£4pºJÆßú „c¦…QØÉG‹Ìû,\…RXÒ<5µ[ŽwÂ×ó é ‰ªš Rš,¯þþ’\™mÄT0쪃ó‚×sõ`ÃO4â„W…¾lï‹Ãë"Z2µ0lÁ¬{¦'( zñ.9_ÄzÎãБ²þãbîÂÑëwS*ú[­FspÛúÛߤ_é~} ‹s\±š“fÿ{ô÷ÁÑ#ŽÊ‡/°² V LlQ9áŽ%Ã¥€T… h(£Œ"Îå
-Þ_#þÍ:ÑdŒ´r@SÓ^É2çQ›¨ô]´à8UY¦âq¿½Ÿžj_'åm~²˜O±ö òà –,®ùé‹‘c^·Úû…ç C)¾ Êt%E—fã$‘P9¼žˆã4yo(¢‘d9mšjW˜/¢qge>KмÎf6ÞÎ'2¦g¯,5ƒŽh­óçü¨6à«ÈÇ
-g!ò)#îLI•eÇO~,EbÛà ¢.ÈÁî=íõÙL(Bćơ=²a~¡Ž LÌjSȤk²5ž€ŸH½ºFŒ§WiWམXøwÖýï… \#A†%ñ³‘Ë2‘j Ç´½Û¡õ´„P2’åíC¶²‹’³o K,\QÛ²ÔŽ‹¼Ü3WÚ ‰SÁ™Û3èF#ëšlËñ°ÁºÌ¬§T{ô?êu5DZ—b!⺂Æn9Š#M‘y^Qi$ë\Êo#£ :“ÐÇÏq`{‹!ˆC%oÝË|°¢’N½`^¾VÄ:z´ßÂØÚ˜Å,Žž”\uyFÌOàø6ëÞÀ…?z†t+A×ÜéEî>VµÝ´çröt'ˇÅ<Ë9¶]ÄöýÞCðò—|fŒK¨ª£µ®ß( ­Â‹%SrÜ3ÀðYÙ%ŸT<RÎm*ˆæ“SÞÑ-ÏaŠC!)wȨÊ;ý&NÀêpêüôÈtöÅ;ÉÈ]¶ÇŒQÉŽ_@q²Óa–Û÷Ý n}ù‘Ûü¤ŸZù“íÓúY»hy5}îê]5P×*»a$G(®‹uý"»ÊÏc9‹z›”­
-Qm®­.
-_ Hf³ÚU;ì­^º~ÁÀÝ3µ5é øÚ¡ºø[\Ù¡&÷Ú;Mo9E*Ûí¬ E Õm¹lê·šÒqd‹¸þýà¡xZ¯ïvô£æQ¤䨟JêÅcFv£1Xc:bv´æQ43ÜËg¡ã6jÄK¸ú¡|R¹š“øÃ÷N7œô±°ÆDL³ ÒYTmN`ÄÔŠÓi
-öYˆ=~åÇk8¨ehúRZ^±V<£‘x–@#”"s•ýÇÚdÔIðP…®÷­•úz8*uÝKœdÕY…®Ùð.Ó©¬á.‚ºuÆTaˆVÇñŸC—nXЫç«j”«žŠçµS¹ Í[džN–üèÇæz ôÛ¶IµWV€A¶šéÝØNQõÆ6W
-ÿ·^]Ä“†[#"‡6]”ý¬…Xí=ïóñhé¼ÜmÄ%ýÖF¢WÛþª†Úû—tµdý
-á;¬/¨`>‘DÉF•X8)RŒ(êe+QBöìøYýú$ø𙨗wš4ÉAÑåFç[/Ìï(=Š|ú11ǹÌYfFã–s»Ø'ú[þµwù|¼ŽÇÛ,ë¢39i¯æ¼Žõšm!¸«uEÖê†î .>Pr˜áËóOªbeå£/Ï”£à?cÛ^0ô²³Ë«Lâ9}IÍv#VSgzºŽÙÑ‘ðîàê)˜¶©£p.´ÊI*ðwgÚË&)ƒâ²oUÌäšH€+ßÞÉ¥al‘BéiWŽÎG^ç˜ÀØl8„¬~ÇH/«æ5Àc/ý
-q,‘ô¡ÇúGåKco IÛ³ø©‚Ž Nv#j»£)Ÿ—“Ì·‘¶ý¤C±Œmm§
-ÄáÛì‡VJ@ÂyÜ4A“ß(9,”÷-mZË)é‹ò8ÕªÇ+“lvÕcÊž|:"Ú!ý XjñÕ,NÛO¤y|¯aëŸÚaƒ™z
-ùΦ*-Ír»b3‚Ë1<]#°Õ¤pX%'Lèw²ƒIýohZrI ®ìñõQ„è1šØ—×¾˜I×ì —UHð¢îq‡G[Y(|#8°ˆ ¾«ü Ì¡"@áBÔóѳ{¾¨'™†V æŒþžßˆ)Iª‡ýE«HÞË]~@wt<ª7çqÄEÔË̬´¥!yšj½7§ßÀÛ*«4øÑ?rê9ðgÅ£ŽÈKj…4HÍD}LÂà=™òâ1å7Ü4S¨r/êö,m@Í H΋pø^T*õg´ ²è‚V e™'&¯F€™ámyÛvîÃQŠ€X¿6~pl“È3ÍeôÆ`âå=õïÒ3(¬•éq7¥sšçWÐ)¿Ÿ•µ®K¬1¿!qÄI b^B,Ësb¬@¼ ‰ja¦•0?8ì@?N©¶ôÚo s¬y¡¸TF3ÎRer9IÎÊè7?°0x?Dtebv
-"q‚x”Ad€Äœˆ®wÒ4°ÈJÙ¼­Ì8ø¿Wöwm B\ëê ìáQïÞÌæºÙ2çŠ'=|J¸^Ö{~ %ÒffÞ2*„ÿ¹UU£î[œRnÖûÎ ç äà/︊»æÕµ±úøÖ[²@“¬½¡Í—5NCCOQ~Ù/N»ùÞq¾!ê ‚„ÙHÔÚä5Ôû3õíya÷UTE‡3BŒýóGN½Ü‡ÄlXþÔGõ“) Âå§aow;é5’-Vy3Å„§J%™èvsQ¾ó\¥Æ0wW˜jS4ÂÒlêWbØ9z%ò¶;,_*EéÃŒ¯ïw1wÙ=ò^D%IßïÿèÀ ‘´ÃΉ™ûÆk¸ß‰y(@ÞqH·DêÇÊQsfT+Û©Õ©s>ÁK@BªB¥¦¤¹já»AÙSg(c¯Ì^¹Ÿˆ<H|…vøuMgÌ[¸åßÎ e7wjrò2DüÛ6dlœ H.)=í:{˜;œ5vrUå(è
-«°;‡5Î9ø%ÏçL¿ôw_†hÝ¥‰’ 6°V…
-^”ØD>#û|ïzïÔ>Œ_ƈP‰ÌäFY„“ðÉQ[ÜȾo £zsT¸8ŽZv?=ªÅHAÓB[LÒÒâvl.èÆí“ÚGÆv‹7"E‰†O¥Ojn(`²¯—½Wb°¡vs÷;îù+®{¿ÈýÀX°«§º½[ŽÓì1˜'½Û6ˆUÊYø“÷dÌe`3ºæç³¼6àHÅ©ÜÁ­ ¾ØÅú(n°ƒù‹"uY»¦·[F’¼3  J
-ÓdŠ®ÂlÀZ(”ŸRO¹Œ»“69Û€Ìà†ûŽDQäìUJE5ý*rÍ@
-(§[$$Òè,ŠÕ%%yÔ »´Æ”V°ß{Ó(±3· Z„Ö= (0ÜHnƒ«%1œÍBz;¦ßŽÚsÌ9û=u›UÛþígàÑv±Ú9Ž{â’®0Ý
-ø%IÆãа¬"£H_|B
-DÈôZ¨K~¡ºy±'§«š—˜Â2ZSŸÄ*_Žs°¬¿áüy­•4á’DˆìG„V!3ÆÓä.¦ŸõÒÀ~Yx²ÚQ3æ0ËÉ*À‚äêJÛnïPýúúx ëW11u‚:Ow aA” ^†’ÃÆ„fÚÒRW—Ø(˜¾àBß|d9™eŸÇì x¹|nzç¥üí’]áÍOúåð;={É—êž/Ý„x_ ?à^ÊÃxVòWû‚¼%uÅ ºs+§iTO˜²ýôˆí^êÓqFÆï;ëá[1IÑÇ@ÑIÍEÃÎXq{tUå½ÊZ$ÊÈ/.·Ë3¨-Î ï_ßa?›@ñÅPlTÁLþŒ?iy1s•ÂyK°€[å>su ñ-UXr§m;¨:ª•Kó£*gò¤Åú‰᪠Y&–Ì1Z°ÏÚ¬½ÙQ‘~r"¬JÅÌ`\Š}‰rí&–¡[@²¦Ú»Eû($:¥ºøeÖÌÈ|½C¾Ö(ß~™„¡
-ö99'(ÜÛG(#?‚iÎä²q
-[(†ºÍ öt bÚ[·ö-
-HÉU
-’7ø“’ðüÅšŽ,<ëÀ¢ Ò½è ¥;KY±7¨n’7qÍþL3Œ8Œ@×SÿCŠtv‰jáY²Ž¶bb»¸iS
-ÕL;&ÜÚ社Q²;»UjNN{)òèÈù¥@Ã:è0>nOG"ýya,.ÉàÙ zi™TÄë:q!$*nK\Â)÷.¬’í8>‹ –Éîu¾J~&Õ†»M[oȳ©žJ´2Ëxy˜3Ÿ‰“ýÖ.¿”©tü.ó–5”Ï8Až «Z¦´´òÏn‘Kœ'‘[àõ•úV‡54›»Ü,eW~o§5X9mó‹jœkÑ$'<àYœ@ªùA-G-_ÚmVó ` «ú„£ù”Ó¹×”Šó“$È»²™©CÕr1¹"ÄÃ$AŠíŽ)й¦?¤Í0HÝÅŸàcËÉ&<j ©C@×Þ¶ÃtH.‰ŸkèA™ÎÿÎ!á
-u­WfH´‰6çÈPG
-.g4“Mâ'M¦ï(ŠMÑ|éÖˆð…õ²›ÓĘ#5Ç´=È•ò~u¦5Vê£R¯/®£­óHÄ®f§ŒŠN¿:¿lŒTmoú_ ˆ[O»1Â̤§ké&èIN†‹v@‹þH,€tŒt¦á>Õ'R¥•K.zgóJ˜ë(+Á5¯2ìkÚ Ý϶¨Â[ú3Änè^ þ^×ÌæQ¡T d`v+f<ñ'yжj~›q)ž\k,°ý”škQí—½`µ‰OÒ«cìÔ\,& šîJ
-íiW‡ fÈ“$#Ò±"÷qHÀŠJ\èWxZ'dô•ÿ
-'î»ìØ•Ë#>¼ºê£Z*¶ ?fôÑ1sm%$¥ž
-aþ2rž¯Y"`¿
-E¢Ì®_Q²HL‰@Zá~fNS^ÿœí^®<+9;ÚyÜúMtéÔtßæN9ïJAñÀئ{½ùMÌJXQ—DÎ+vûÔÕ†|bs”F-Ë•§EJ òó8}]ÕzÙeRéÀd.Ly’ö|ÿDl>Åõ]Ãh­W[®!ûÄT‡‡ÞuýÝ!"ƒgúˆ.’FHD•‘õÝÖÚšgì$Ð6MNâjpx#2ì,y]®“ê™ _ŽwrÀ% Oqp¶,Ô†´}–úy.Ì0ØÖ³pßãOS*³ã‡ïwâE †ó0m‘¨ü…YiEµ ‹X‚EiyÂ’“ F/ɪô¶­‚´J´ž—‡@%aHøèÕ?7ôÝŽ¨Â'’J‡ˆ2LäÍÝDœŒŸh¸Ì¢±·,Žh¶è„CYö]Ñß´­úgmkôfÆ#ÔíÈä¡J¸Umßý¶ªæö1ãïÕâ•Æ»Å†-eQCÕsoŸ½Ø‰ Í™ªLlmwÓšÞ—Jš¶9¾!&5#é»~kÃÓ•±9wX§Mk‘ŠHg¥éÌÐ6ÓÂx̱Ùõr>%Cçñ#ñ“(ž¢Rm|™$×B\µÉ AvV7Áû¯…00À(ä1˵ÕÝÝK¦Ü¹Ù~éo»T9z˜~Yã{òÑ=Mq0ûJA «ø}/£1Äí«e—Ѧn/*ómF¿Äxù q¬äyJS*\€d­-†:¯Ø]yÜÔåTƒ‡¿øƒØE@ÍfvTü6íÁ2~lW=_xãSeþ<ùBÐÊÒm"¿‹g|£žŽ/>¡„ïn‡œ0'OK_5b«F¾ìؽ°`‚ýÔš´ú&¯Ï¸?`;ãõð æzâŠ×=k-"c ª)k¡@2×Ül SÕs'tÜ«f€p!Ó«‡¢¤H|ö‘¾×Á[ú 4ô‹ê9_¹ªÒSGUPâI%¸5–
-qQ)[‡ŸäW=Òлe~ÙŒB‘»ëó´#âý mω;y»Š%üŽ@D$zfªéA%OÕtØ9ø»«óu 6’RáÞŠxƒ„ï”
-2:RÒ]š¡¸\•´²DÊ™º´^-;nðÇY~þ0Ÿ1Í»PÒø¤0«¬}¦“?f0­úÙq†cŒ¶[ú¾;¶96Ø/
-P„ é*Ë~fûiöðÐÁ± y;§‹¸Ãà’ßÐpù<3A,
-HG€BÊ!´q<6õûœp—-HM¶Ýu'¯ýôhË)
-Ûs'&ÞHË¥Á§õŒñ¾QNç—‰Ÿ8[/»'ÚýtÐMs¾Z!Å7ÃFjA¡;Pì;ÎÓ<Ø:ô‹hX[ÇñxWÓ·MéxWÕòћӼaç~ݯJürÎÇû®³`ù²ÏÉF™m¨1£áú§U, Å€ÎÌ÷;:ÖÇ9½èyÄÂ1žìPUºÝS‹QRUib3íWëA(W×â“ÙÅ€µ†„äõ6ú¡Q{I–àÆ/Š†#¿I¨
-RW¥Ï
-Òd<—ñ*õ/^›žˆu“ ”Ö†´06f¾Dx>É3ÓÐ6 $cºŽ~{V
-´.ÎlTÖ±ð`­çÐÖátžë¾±ÉŸÜÖR)z’ºª^ Å}bû»Îd7
-Á~‡+Ò«‡´¬©Bcá#šUQˆµ»ž2ßÓ5:a]C>+×­ 7ø×B
-lwÏÍ ¤Á;e£“/~Å©ô6€bDPö€Àì5 ßhàdÓ'±1ãŽÔH®—äI¯Ãz£íFR… R꿧ù‰´Ôö~ZB‹µü|†šïs>vŽ(B¯)ˆä<µ¢+þ‰>wÓ*>‰v»P°ÈÒÕìn݇32B‰;¾}0ñ\d3í•©Þlýöu>Ø5¹¿ å'Všµ«7ŽìòÂn@ÐŒ_÷ u,c!Üy&iÏ6I¿ÓpǾ
-I3qn»#q.¢+j¨lx¥šÏw$àmE8L/ëÄŸ4
-i}ü8c©+V\‚ØH}Hȧ¿`$¾³O4Waˆ©þ«ùůµbâbõê¿Þ™þz[›aó¬^QÅç¿o¹59ô>Ÿ%{q‡óx§òêÕ/ ìŸ)¨1£7i-ɉ<ô–Îy×`áÌ~)/B,ÔŒÄ ’$¯üÈà‡Š} Ðqƒq\­¸Ôä9XÇÊ&Y Ä~ÛÙ?FÑ«âÖ7AhnzräÍç$"wÅ:XÞ#uq^ß>\xb1Ò»Ïtá6J•ßOõ;‹ŽÉ–a¨Ûß„f {âe# zP$ü®)И'´³ýyòÓûÕn&såÚd´‘ôòh0×Qš>™ÒsA”>2Ì„8¹º—£q}ªé·Lm¯‚Ódx¯N›GQðLÚþ‡Yô2V÷«½ 1±ÅµXè*ýõ ÷q¦69+ÛÞ¥Ÿá0ë8õ¯Ü§Xî´ÏÚæs>Þ¡v5js+¹¢ˆ´Qaïe÷
-á°âÐÑÄÕ—bJŽãû—"oRc¸°€~:ƃKÚX^ªðTp—£™#›2¾&úÑj±7ÊLåzm-5?ø± %;7Ü'GÈav&³}.uƒîãÑ-ÏAmixûÞ ¢²c
-MIª\ÂuTØjGI-gýÂÓ–GâydføæÅxÃÃ,oÛ.رÌ*_ùSÕúƒóØCkëÚ™­¨·>]ÙrÿÅ:K¥ÓS%œx
-æ¨5-lçÖwŠ?v¹Í“!‰P£C´é¹2üÇ6$í.ªM¬—¿òÔöž8ü¨=Cî<:6¤Ò*À8€Ëi¾‚’¬ˆ§eœxÁ7gSL¥]ü÷MÁl϶É_LÎ[¯>7‘~KÔC¿ bÖ¡ùMÙDSG„l,Ô±ÿ…ô4¨·ÕõvOój˜ývXÚ‹>N]'#èØÌ×!óþÇ7îð*xîG™õñÌþÀ!%aóЦ_èõ\{¸®qf__ÌjävU“j3ùêEo/ž4 16ìž-AXðIŸsþã¹ßZI‚–>ÛýNA¸­s´Kp‹²ê˜"ÏGx ™?þ³Kl\jß»¬“aÒۗ샜+€uÊtC—hÇîá•
-¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë
-c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£
-cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …
-¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þK
+/Length 17112
+/Filter /FlateDecode
+>>
+stream
+xÚ¬¹eTœm“-Œ»kðÆÝ‚{pw×Æ¥qwwwBpwwwwn‚÷/Ïûž™9kÎùu¾ùÕ÷U»jW]µë®^½š’TI•QÄÌÁÄ\ÒÁÄÈÊÄÂPWÑT2¶µ56:È1ª8Øþš9()ÅœÍA@{qc9@ÓÜ nn
+`c°òòò"PÄ=–V
+R
+ššÛ»˜Ó,œ¶ÿ>
+üfîajîøÄ
+hjcÿOó9ÿ ™Û›ý÷úÿÊô¯ê™åU¤eµ5èÿ½Ê¨jûw¾ Y¹¸ÿ¡ôw@jžŽæ€ÿ•NSÞÁì?ÿð‰Š:x
+2¶7û;nÿiø6uuvþ«ò¿6ÀßëÿÇù_ƒonîanŠ°¾â`Êb‘ ªÃÍ™×èc… u,mT+* ¨qèõψØå­4z« ejšáûh÷\>s|?üFw4Ö‡cKÝ›f~ùЗœ¶¿ý'U'7ýQ³A)ræ¹fŒ÷Õ’Ü”‹ÆÑÞ”²ŠAÉ ÑL'»3ÜÕ#m
+‰ªV¶ý^]n?É÷oŠ üÐìæÇÕQÿÑŠ´Këñ¯0AÙ¬ŒÚ#Ûõ½ü¶Sz_“Ò¶Âæ°Â¯£Z¬4¦×âÚpj~¿H]c}jÇyŒ{ì|yz0Òä$·‘×ù³›'È úKåWµ0wïèåóä»÷ ¦¤†®ßëÓôäNg@«ÔËfR~7øX3X¯§º<†ž‡:;D݇Y‹’‡±ÇƲ ¾qv"©Î.嶱8Á[Ö†¸gÛyŽ
+‡Ø
+œQdÓžˆo¥j›*÷ú*yèõA®È›ŠØùÞ*9Ö¤û¸·ÂÃmÈŒ¿Åû ×táú9ÂÌ¿×jŒîuÊOà7¬ä'½£[»÷HsHs¢4xÅÈé ývÞh÷»&N™3ï²,ä¯òàÞ¼«»PøÛÖ……Ì\!nÊ—Iž‘Ýù™,dsa‹™2,ÉÜïéÏé›_Ôn8Zr烹ªv{ˆW1óLN¡¦‹JD¼¥"eéUMäãëj“µB‹ND·ó›^ÖåÓܦÙv‰çxD‹ú)MènÁ Œ;Õ×`xÞý¤ŒAhàI%Üú áG`¦‡SØÉň,ø,^‡QXÒ<5µ[OtÂ×{ù…Žö„F×Ï+N•W¾¤Tær U Œ€´q^¾tÆ^?Ø|%uÂŽ¯B_µ÷Åás-™^±`Ö¹Ðü|ñ.ù½„õœÏ¡-eýËÅÌ…£×ïO©èOÕRÁ]k¯þ)¿ÒÃú çøbU'þ÷˜ÀÁ±CŽÊ|Øo‹VÀ,÷QYáŽeƒTÅ€4ù`hõhÃÌ"ÎÕ
+¾•Qÿfí2FZ Ys“^É2ç1›èŒ}´x•oøLÅ~êú¼Sr6Ã,f“Å$ÖÁ~¸!’Åu£Ã¾¹fu[¨½$|8GŠ XP&k©:Ä0[gIJõ„ç)C‘ ŒÄ«é3TûÂü‘ë8‹( Ù‚.àu6s v>ñ±=ei™t„à cþ9
+ËžŸÜxªÄ®»~dÿ|°ƒÝ{ú볩P¤ˆC{TÃÂb ~3˜˜ Ô¶q-ÖTkþWBµRè1
+œ^Å}÷b"áŸÙ÷?'q ‰–Å/F?®ÊD¨%·ŽÐrm‡6ÓÃȈWw[ ØÊ.K.¼€–X¸¢¶ei—ùy¦ ÚI‰sÁÙÛ èFCëšˉ°Áº¬Âì§4{ô_ju5§qWb¡â:‚F®¹‘
+£MQùžÑéÄ›—\Jo£c ÚSAЧÏñ`K¡ˆC%oÝ«ü°¢’N½`ž¾VDÚº‘´^álmÌb'OŠ žQS‚sxCþíº7pážÄ!Jà wF‘›UíG7íoY{º³ÕãbžÕ\Û."{Š~ï!x¹Î+~SÆeT•±ZЯÆ7
+«ˆbÉ4‡\·L0<Vö†GÉ'e÷Ôß6ˆ'„ )©oè–¿aŠC!*uȨÈ9ý$JÄêpêütÏröýr–™·j«œ'“°ˆâd§Í,=~è»EÔúò#¯ùI/­r˜íÓúY«hu=}þú]%HÇ*»a4W(¾‹uó2§ÊÏ}5›z—”í»¹8NÒ7“;ðѨ
+›ˆu61j&všQÌ/‚·bénx;Á8G̾
+Xþ®qp…rÆm`‘ /Iï¨ë‚‘;ýR¨•å)’Ô`m ^f©>¬OÛÎ3[~½›ÍÄŠ
+x¯°&ù.±óh|-ö¤² K¶ÉÉ6 N¿È¿ð.·ÐøSýAH×ú¤ÅÌÞ°—‘,ŠeV®D’R¹ÏÎ_ƒ¢‡):?¨\)Ì/
+ásÆ#ûÝaØü¾C-(^Ÿ¼,•}3Ûð–VG¼:Žˆpöø ‡~fê"¡€«ËöDñqšû„\ãL={,Y6èsÓö&ÿRžéã ÎvøüÆ’ ©—2[<Â]*ŽUÍö~Fº*Äe¤A¬
+‰&$_׉<%@v©Ç1‰4~å¢få¶_±Eû´½ó*`,ÇÂÍ“)‡D7^[#¨eNÄî]›Ä|ccÌ.g‰æRuõ~êP„¨ö­þ²øwâ¯Ú ¬9ˆÆo Dà{éøk JPÔ箫¾<àØ¡{ÒŽƒ£H ˆš9Û¾>,v§ßÚˆ37ïegiZØÃÎ’~92ïc¾q`¼„¹WËmÞ/ŸªÈ"Ëùtþù¡Î T¼ 1¨3
+ŸáG®o4± ÖQÓo$øµì;ÑbV!ûykAžÔ^¶ª¡/©ƒÁ7ÙÈS÷ƒœÔdíMèSAˆ2xî^vΨÊXdºo{g@½ËZǃ¤ÃMp¦|€…¤}øí«š
+¹˜%AÇ©OOûØ+VÄ‹~{HŠ¹l…¥mß,+?(òÖÜþòHaöjZ<Dgº¢(ˆSN÷jÖI€µž„*m÷5eÉ ø;ë'{ª´äú\U·®¿nâ8¬÷Ó‘àfä
+,"õRbzR_'Ï4\ÎG-M
+ælSŒNÃ Ëù}ì3½ÿÚ»~¾-ÇÓ]–Í
+ÑÙÜôW3>Çz¶P\üõº"kw5·D
+(ÙüՅ'•±²ò±—gÊ1HðḶ Ýœœò*ãN_RÓýÈõ´Ùž®Svt¤/wpõL;AÔÑ8—šåÄx{K³íeS”Áñ9UMe›ŽˆÍ×ßÉ¥al‘Âèi×N~¾Î3±ÙpYbdÕŽðéa/å…8•H þÐeý%‚BÒØdÎö¬/~.¯mŒ“Óø5­ÝÑ„ßÓIÆk´í0ùX,ãHKKÙ©qä6ç¡•ø;~¿Éo Šœç”÷-mzË9é‹.òÕºû+Ó·œª7ÆÔ¹ D´!úÅA±´âë9œ¶a¤<Ïë­á_í°Á‚L=€@°ù¶NM¹•íô™gFNó®äìS!à{ù²gâA}*ßZ¬¾"L;¡!&{SºGÚõvÿáIt˜h<Êo`Ð W•˜÷¨º=áp¬ ]3#"ŒBŸtª”‚¥‡˜QðëÿDŸ°Xüù§—K`!6ïH©/ôyþËZ»ùc¥ÏÇÖ™„ÚÝ"ØÑ6Ølšä–ãNdn>‘W¨f4Ý…ÊðB÷=Iâ¹²ÞDŠ¡éóñL—eMåu/÷r5ÒÄØù?¶ßíž;> #ØŸ#J¬ïíýwÅ\á0NJ]þî\wL‰ËW) á«jû콪:‚ÄŒq˾t/eÖ’Ÿn…‡þàObë·¶tóÅ@Ý—†v9p%Z§ P4n¦khÛ%ý®äÇ=v±¯l8E45)ÂcŸfÕ‡³QùâïsÊ9 YbÜ„ƒlï^ë)ý—$ÕŽþ9%AÊf|(—À»‚††î^müu¹ƒŸŽC©¢p°°ð(3ïû{TªÓýᓘï,îÍÔ}»ŸÇ4¼ékv× Ð·5™\Å«ñNKå'®ÌhüMÁüúîVµü~¦@Œ1ÙYЯx¹éœI¶ä¹O¹˜ N‡6õqéà/ð¸7^–@€OÜslDåÓîjßËVS!V6U%áÇÔaDšò“£u»7Z3c‚8p€È3˜£Iº¾œˆ²#>‘¿ŒRý­Š˜–—œ-¤®ÐáZhOÑŒfuð4± wCóÀ:t²YÆ
+àé nرn¢YoIêŸ<vIS Y°ÆÒŽ5G­æå0Mö½Aˆß„«ÿ/kZâ üÂz×bAdð)9Å’6Îö‘Ðk¿Ý§Ä7#ÀjhD(ÅêùÒÓ|[Cªé¶w€áàrÏxéÈsCptE’÷$eŸ‘ƒcö2o¬ÝœSaTS¹/]v¶Ag`æÆ¡¦Á§GlÀ¢?væͶuŽ+¨Î_¸¤ k1¡v=œ°úš§¼›:ܵÍ2¯·^&,ˆ(:˜Kw²´.Ðf‚fr:=P]_ðµW2Vƒ4‹"úCñSðåÙâ­°¬Ø «õÏR ,{zvþÉ ûÕ™€”{uuVœ¬už‡ìNŸûâˆl,
+_… Q×G×züù²žxZ5„3&° S&áŠT›D«HÎÓMn@gl"º7÷qÔEÔÓÔ´´¥!e†j³7·_ßÛ*
+«4èÑ?jú9‘`¸âQ[è)µF¬j,>.¡ÿžByù˜únŸ‚)L©uwŽ6 f
+(ëI0r/*•6#ˆ,º¨YCYæɧàIfðcWζ{À`Œ" ίí+¸6¶qÔ…Æ*zcÑêZ ô,
+keFüŸÒù
+d§'¬ö ¬Âõ=¹»+¢Ûžß›-°6Ç´mQ@hbQîÀ@¾<˜õJšBHçJÑ#ëµmVi¸×0®*YEáœ
+ÒÇ™¼ïw±w9=rž„%É÷¿´á …ˆÛaçE„Ì|ÔÝîÄOÜå!ƒî8$á[¢ôbIe©93«•ìƒUëÔ8Ÿà% !U ÒRÓAšx®PöÔ™JØkóÇ×ng"¼Ð+7tF|…;þí|PvùçÆg/CD?Aæ`CFF9€”’Ò󮋇ùã9#H…Kà{p”¦§ó×XzƒÐhÃƧ ×´;{ØÉ…OÅY“óç"÷
+ãÊÅF_ÕXƒÖw_¡ØKèJVDËXcïEhÛ‹Ô— –ÙR¡pŠÔ€V§éêÆÎ~'%œjeö¯´!ç˜ö: cf f(æ’"äËèÁØ\ûÖôùiÁ<„îvÔÏ:¥•F²,ÎÒ$£ÞzvbsÓÚqÂQ V-/°í-2vŃäƒHì£ ß¬«&ÍÀµÓ©ê^; çÞÇóó~ì/ŒŸ ðþh¿ÂÞ Á†ž^tW÷´]þ¿À·Õw2tIW1‹*íàNk-ûÈȯÃîoÕ8çâ•<ÿfZÑÛu1¤u“&LÑßÂZ*4|Qdù ˆêó½ë½Sý0z'D%4•cŠHÆ#Gmqu ÜFu7â¨pq³ì~zS•>¦…¶˜¢¥‡EíØ^þ®Hj×-Þˆ-11e ±%ɾYö^‰Á†ÚÍÝïx௰éý"ûcÑ®žêön=F8^£GônW?&L1wñWþ“—¾Í؆ŸÏêÆ€#§R·¼ÚR룸þæ
+EÚªVMo·Œ$yg@;”¦ñ4] „逵PØWJ]¥0îNÚ”}0ý?ÜwüÄ
+"¯RÊ*×Qú(­À4ö³)FO›’ ‚äêàþ(ÇÀN-ÅBÁÚc·}2«Õëé¢~ÒR¯ÛûÇDã]ÛÁ›75ÑâÛ?}’^¸Ã/T89B"j':up·ýÁÀËuŠwX¨ôN,[œZÕz¡jð^[éÐÒÊB¬ ?ùéˆ&µ_8èè¯\¿T~+¯þzF¹­õ ã+¹6sÕétäïøë÷’ç6é¢MLqý/V‰{k˜ÖtᎭ 5Â3r;þªOé‹-ò°Yüeå‰4Š\uÔ®¾O½ÜlMÀ¢€rº%bABõ΢8ò1âGÝð+kLiyûƒ7õ;3»à%h#üï[)ÍápµÄsÙHObgÐô»ÑŽ¹?§Çe×ĵ{ ì«þ&ÄqKZÖ¦ ¿ðÒ;qÛª47·‘)<´ 2‰Ç-Ò¸6,éó}›‰Êá]Â?…®ù6Çœb„5ÂxÀ ž^èvíÙœþÉ ã…~È’Õ*Epב~솳ŸP§Í!ðœÚ ^*ŽÒ¹\ÝMÙàvu¸2ÈL].ÍàE´”NDJösö–êä*\Ðqeùšß±œ²ƒ¯êrýrxÍ!¸ï%ծΟÖòÄͱœ·qšZ%ªæé»V7äÌ¿%þ_ÿVš*Ý\„ÊÒ$ǬÇ™Va ÖÃVáÙàYú#gXõÜ¿Œ²ÕÞ·èêµÁ),|d œ¢Û¶†ñ;îìSJh"¬t§?ßyiKYLÚ´pØŠG?'â{âÁ:ì&~&¨*Ir‰OŽŠÜô«þaÀäOÀÝ 0ØÔ››Uñ@t°'Âÿ}û¨ÃšA0IùúL{—p.ðZ¦{xyYOÛ–©Äï´+Ü sHuOŒ¨ÎU G£–@¬Èo`ñý"qà‘±îø•¢†>MÅ€žQg¯¦ün(Nß_äz[ òô:ÕK œ­²S—|vîc50ð>rá*˜RLZr§±æ¨F÷ÓËÅRè¯%ùdÏÌnw°GAš¤’€\êÌp½{ë;îÿ©£1ö§¤Z…(Œ£ŸâÓlXzøÓ£g®éË7âE–$M@òŠŒ!‘ø„~!Óm¡.YAuõdOÉP)$0+17`´¦>‹Sºšà`Ù|ÃùõZ+iÌ%‰Õ-Ž­Lf„1®Á]L?ç©Žý²ødµ§jÄaš›ý ’«+}W¸½C…÷ .ìñHÖ¯b sú =l!î‚0Q­ %— ̤¥¥®.©Q0cÑ…2¡ùÄr*Û>ŸÙ8ðrõÜôÎGùÓ%'§Â5æ+)Éñ;wF$ö’/=Ô=†1Ñ¡*^À½”»ÑœäJû¢œ%uÅ,ºs+§ItO¸’ýôí^êÓqVÆ/õø­˜¸èc è¬æ²ao¼¸=¦ªò^y#et…Ëõêj‡sKÆÝ{%&é³ ˜P ÅFU1ÂäÿÈ8Lˇ™§”ÁW‚e¾Sî3_×ÐR…%«~Þ¶‡ª­R¹¼0Ö¡|!GZ¬7™D¡ÂmlÉ« û¬ÅÚ›å'û!ªXÌ Æ¥Ð‡Ÿ$Ûn¬ßi¶cNÖT{·d­ìD§Xw¿§ÄšU ~pÌßíÛ/“8
+—[«R^i52)úIí 8Ž?œðí•(Hù%‚¶§q‹©[&H…U½3È’PǃjÞX¡(ìÁõJ[Ú(y4\9{1¯€kÒ‰X)×'Ùʱiüƒ²{æxŠH.ž?–… Ý®CÚS‹|¦iŸÎ+—^Pcª(¿œ($&:W§||RÏä|ó­„Ñgx^­ˆI4¿,]…ѧ <‘å ãÜ5u@܉Ü Š4
+î~%³€8Áj·ÌÓ¥í©ªf‰¾„ö§Ï‰óçô$zƒ1Ž¤PP9*'+p9øx3T.Œh“öJ™¿Âõæbo¸ó¾4¯íò¯ý ~µbàÜÄÆÅëº
+ÅïBú¦·bF3‘¿Rm«v—¾NhŽµŸSs-©®Ø Vû$ß±:ÆMÏÇa£é¬¥Òžwu¸`†>I2"m)pŸ†¬)LJ-sE¤wBÆ\ûàx¼uÁ ìàà)†ý®?w-þÄÛóS*‡Û×wün>òîº佇1©úìIn\@Áû‚#–ÊI£óþmü€Êå^MåQ5Û†ì+fÌÉ)sm%$¥®2AÁ*r¾¯i`ƒÿë÷/Éf×(’eŽpý
+’EbŠøÒò÷³órrx¿Ùî…Ía"”æ$çÆ:O[½D—ÏMmî”ó¯åŽŒlº7›ßÔÁ¬„dp‰e=ãvÏA6ä“Ûc4ªÙ ž)ÊÏÓŒMëU—)Å#ãùp¥)~Ø߇gºte © wuÃ^-Ù†œ3m6vxÐ.ú»Cd&ÏÌ ]ˆ
+%"ë»­µ 4-ÎøYmº¬<ÄÕàÈVTøEʦl'‡U3ž,3îÔ€K6:á…Á ز0ÒöuXêçùpƒ$ó¶žÅûšR™=?ì¿3OZ0œ‡‹œ$%fÅ5•.," ÅÕIKfL&Ýd«ÒÛ¶
+Ò*Ñz>~|åÄ!á“;Tÿ¼°wc8Â
+Ÿ(*mBÊp‘77cq²¯„#eµˆ½eñ”æ¦KN84e
+þ&mÕõ­1Û™P·£SÓ<òÊVµ}÷Zê§@ÞMë€<€¬åË&ûqÝA_ÁXRz½–¬X;w3ª¹BË?#,d?¥®‹#{œhï1»D‰LÄшÔ]Lª0‹G€~8îK‹žo H]¤äë®ü²þ“’Bö¾w€Ö:8Y2Ÿo¸È£Ç}ÜÕV%$Á½ôK”t³ 15^@$N5k›¿W²àéîJXɺÝh‡ŒqÇ^èð ^—ÛÁîHú¸5<ºL~_ÜOùoÝ#ãP ÷C(oqZo~„Øq}·wy™søÈ
+Îs!V •ãrMLñ<'šP¾ÔŸ@¸WYÒ‘wçÿò¾Òç–Ö–V.wÚº7qËw ¾y2obW}ËÐë£ ~W·Àg¸sbj„ȳBMt èi(\­ùê“í&×ÙzzÁð4#C®­x@åHCK‚[ÐÚ¤[Þ#Ç©rÖ{°“ÈÕ84S’cmáË“áôÚ¤È*§6MM*sËY$:_Îñ¤C“Ø“›Ó¬ªc¾ìi'õs1z³vØhæ:¬—µ¼ÙùÆLå†Ò–³i]¨W@†–M˶ڧ‰I܉U¡€G‡•
+ª'>Ûf4C¸MvtrZnàyTÉZÕ$KËýaGåEìÝ¿krÀ‡~fµŽúî„ÙGé¦éåGa5ÜÓ1ƒÌZ[\ U¶…\Ðר·ü¥ÀæêÛ‚Rèmà>ñº4ëµ÷VyG~ü½m4ø0QÍÏ<5&6,Å*Ô" €öºàÏ`]M$¥¹¼$ûË«>Sîy
+i¢§£ !㺲”ÐÙmPžY1áÈU—¬h…øƒß'p¿X²0«Åû×N¿”UVÀzÔvƒÜšýâ„å®ðÕæjæ–Ä9Þr`òٷ…Zî¢ôÃ5†Q¯„ÿÖež&Zç:€âÜ3ùO7î•r+B«(ô]gþÒ¦ÈÑH=Fˆez u±!DÓÆQfl³C%q§Kõ¯ÏÖZ®^®¹Nˆ;–¤ßÀ¨ZÕS¡…ÄñÎ_\‘닼‹óDo®Fø>¦R°ÝÍj‘~É÷¯[÷oìÄæò n?[Œá)m’@©—‘Œ1´bÖ9Í­n8-MŠÝšá_jÂå­êÀ:BÝ{8J4 4q†ea: ý>F‘-¼ªø¬Oð…àŽóMA1bÒvBŽ0{«i~n"É(ãUeAqò`Z(سRl8ì|–½v:øŸ”‚'Š’^ÄÏlÇ7…·}¡…4íKœç:©ú,X…¥­­¡bt‡~Wî¥öÕcE«ÃÝS‹†=@å ´Ê×æåóÞ=hj3áRe*ý¸
+Cà ê8ÎÉ]Özá·}6ù\ø*ø1B%[3DŽG
+ŸH¡ó5q¤Ã·i±‚”p³×S“š¡¬p£“ ¿ EûÙc¡ó,ßlÁ5Á²È¬íŽÏl©-fͿ궘SOpø¼5Sy˃øú¶(û
+.3Ÿ– §ï¢Uí,?H-ýÖÒzÆ¥¨>#uQ4ŸÕÃJE,°NN•SONãó‚©;0ãb°^‰Uåª<& ²Nåð I[•Æ«çº´ÉQì\ïåºÞïñ8+ìNH‰\¶¥S‰)½0@ÌJ,yßÙ ?3FçÐi®“©
+X%Ž…¾‡¸ÝëÄìk|ßâðmbØ|¶®¶LïÄì†Ùû¸ä¡›¿å4žUt§Í-Ú'ÏxñwÓƒhÜ£¬N¦ú€·$:–©<©?æÌ"7{•åQιv – YRÀ¯Téœ'Ob­²)7_ùÖÊ$ùÐGDËky—Ý·¢ÉŠ†Ý¡í¸ sx¸ ìqŽ#cßê©Ê±•góf©õÏ)mé¼³_«´`—¦„j?ùÁ“³Û)„„)F'ÏÔJL%%›«Éw‚¦¤‰¡g¸ ¢̪Bé±¢W>"BYÉ:VS=e=X|ùÁ±¨Þw ö¼Ž”ò°=èäÚD¢z*•(J":“–ÝæÜ\ÒËâ¦òUàñ+º¡îîñ,XbAeL¼Ásg]ÔPŠûÕ!‘I´+SdDÞÀð®¼b–ŠÇêqüÆŽ·ß0º¯¬÷Y®M»®¡J±˜|‡à6RBÃðšÍØøæU÷¹¨E— 9Ò­êÿ„l™– ÅÚÎÔƒ™­GÝê™ "âX[zq3H³Üé[‹ãq»©¦-ÚÞ,ÈŒ3:I{r¼â:Ü?#©+²÷%g² X6F~“K0'Òöé½0r=ŸËH“¢“éÞiŒúR7a´Böj»å¸’CêOm‹FE „m&V”'TKõœ
+
+¿*,‰Hç[`öR{w…ÝƸ5¹¾ŠÇŸÉz¼ÃWDgãX°+>BÃ]‹BámƒéIÜ_<©œ+V§UžÌGT Æ‚(ø‡Þv9N{ Óü
+Óúš"ýSz×âת 2\Ö´ÝõØŽHhKÌ´¥sšùíio=¶ïÇ·‡¾Ü⪧–AL!¾ëø ãt¾tblkMÀé¹7AÑ|e·šáfa$|”?²Å0ËvœÁ×°(Õ‚î)=í†þ ±T1ß<” î³ PÔÚƒÞzçäu™»Óƶ»]÷so›w~ª°äƒ]ÛG…,¡ñó!XúÆ‘ŽÝo-*d~}áóÖö2 §Cv¿*ìiëÕÎøˆIXrg]é‡ ³Yèîã`"ùÞW×·sÔ¿A^nÒÕùIÖÇZˆ‹ÕúMºpnc1à€ôC…M¯³ùmlU”Ø—Xz ­ìS;ÒÁ’½yXžMÈð›’]h|¹ ˆü¬a^6ÕévH£ÊšÈØDuöGÑwdp7™õñàéÖd“ó?¢Ñ>;ô¥:žu ôÍáS>3ÞÒ÷“ÉU·ák&½þ½e|‘ÝÛZuFÒ0  ¬±üÕ¸¢
+iÑ$Œ.ÞoŠárò"~ÖùôÕ³zUF•=GÉÝ©‚~éRÜ×h4ÖÀeiâw±žRü/dRÁŒTkÍ#wƒ0&§šžh,Gë±Ãñ°`¿pLsî'úm¯=±çɱe—~–¯#\‡zó,ªÊÃã•ì9»^Bü¹“ÿC=u°cDk þD8œ/'V¶4¥? a¶d»Ø\ñQ­mÓõ:F,ÇÇÔ²\ñÎ<šr9oâ\è‰ñÓ­b]Å»¦f;Uˆ#e2S> xV¥˜ÃŽ­ˆ†ê§—jŠP™­¸¡.!‘#È÷©voÔ`ÒSº’ûþž}°S
+T S!õ\¶ZãÒJ)¡#¢:sÌæÀŽ_îR·è¢#Ô¦Bò
+êOqÚô¡9U¤ $Ö=6Ððü|Hò‹°s%nS,{¨üˆ&õÊ’—8$²cå’6¿p[Žx7íj£\k@?®ð¶ "Ü<4s=3Ña½BÚ_Z¼–âç0h^×IÓ¡gÀDFÌû"O,v}V%t ïæûüH¦¼¯¸Êi¹ò¢Œ
+Vº<3ÿiúü`+zв±ƒõ¤âBy¿e5m¨á^[ÄyaS©aŠ€()ÞŸíÆÜ=7w3ÔV³Md& ðÑÈå’½Teöä´þe¢QŽh¬õ äØîαÿ”øg´>»6¹”¼g´(>\PóÔkºßo†‘vÝ8‹¥‡HZR¯±˜(rÔs•Ì7R¶s×»LíªøŠæüz!ÁÈ U[–Õ²69§QŽƒ.[¿’6çÏhüS—Wse®÷±dßbfïyîI‡dÁFbNþ%ÕgÔÆGœ¢,bœrü(šÙÂ%+'‹ Òl£g"îuªrC`Wro¦1€5ÇCÈ…çpû¶šÍÄ]sG¹ÑOnäàrqœìZI=…M}…)äCQÊ~ ê!µŸ¾Dz9·%eÞ!­û©ÆÁ”,Ý,>׿¿âb‰lGûrs RøV0' uV·ƒÔ) É ²;^%!#úㆹå"à÷È“µ‚i4Í p#Öo·¤_Œä%±!¥Óæ`…(`¢ix¸ü={Pìr {[£3þÝɶ*\ÔvµvÈÆe~0{zŠJ"É®Ñc
+µÄÀ‹í_~ …U¢÷íýwõœÅ6o¸JÚè¨OÊÿ7E®Õ?ÿm]~»úàD¾?œñŽ¹,à¾$ôƒc2‹™‹ãé¸æß‹M|&ìšp{³×Ó\Ì «e •Œ¤·Æý:®s”CrªÞr±[G^…_x[´?ÒØæå'®Öܬž ¥Škv5‰GlŸ뽺>QÄè5ó†…¼~šÒÙŽÝ  ÙvnÂ|*ÑÐaòÝ¥ÉÿÞ^á=tønÚÖ•_ÎïxPðdòùCß•b­RæwWbgÖJ?~årοþC¬[BýädƯ{ñ h§úÍwÓ‰Ï'}2~Ñ]Ø6å°âÙŒ9û ²&ÜÔîNÖñûö¡î±`luî‹)G2O=ßùEßCùä”Õùù[
+¹ÓÏ™wŸ˜sìÇÆâ@•»¯M·åöMXvºóEÿÿu9~Û¤k²¹¶…ê¼ ª?yÉg“º”òÌÜ{ç;OÛ«YŸ$3iÕæ#ÛÏn•8²oväóŽ7¯ã}ËÏëÕýÜá?÷þ¹ësÿ„æÕäÈ©Ù÷pö.Õ`¹fýO©a›K<­ÛNîêè=|ˆuÖïD©â¹µßýÝ^Ú(šDªM?T¹CÂxÝ;)ñ´g¥ÙENÓ/Û¾}õ%×ÊÛJ®Q†…É9©‰E%ù¹‰EÙ\
endobj
-802 0 obj <<
+1018 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
-/FirstChar 40
+/Encoding 2705 0 R
+/FirstChar 35
/LastChar 90
-/Widths 2153 0 R
-/BaseFont /XYWDPB+URWPalladioL-Roma-Slant_167
-/FontDescriptor 800 0 R
+/Widths 2718 0 R
+/BaseFont /MRHKYV+URWPalladioL-Roma-Slant_167
+/FontDescriptor 1016 0 R
>> endobj
-800 0 obj <<
+1016 0 obj <<
/Ascent 715
/CapHeight 680
/Descent -282
-/FontName /XYWDPB+URWPalladioL-Roma-Slant_167
+/FontName /MRHKYV+URWPalladioL-Roma-Slant_167
/ItalicAngle -9
/StemV 84
/XHeight 469
/FontBBox [-166 -283 1021 943]
/Flags 4
-/CharSet (/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z)
-/FontFile 801 0 R
+/CharSet (/numbersign/parenleft/parenright/comma/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z)
+/FontFile 1017 0 R
>> endobj
-2153 0 obj
-[333 333 0 0 0 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 0 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ]
+2718 0 obj
+[500 0 0 0 0 333 333 0 0 250 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ]
endobj
-739 0 obj <<
+955 0 obj <<
/Length1 862
/Length2 1251
/Length3 532
@@ -11417,889 +14029,1331 @@ endobj
>>
stream
xÚíUkTgnõJÀ+Å€€¸
-æ2@ Š,Ë%€
-‚T†dBI& (—
-A@0¨P¹TZ)­`åb°¢àY#BAn¬\uÝôØ¥?wíÙ™?ó>Ïó½ß3Ïûó™™0½ Nl$vA„bHi€³›÷a €D2ÎÌÌ…!1îÄ0
-…•çˆSË=•ò˜>{~½Gz“¿ô©qªiŠÙóVïréLZ¬aôo·Â4ñwSÇ2Šg¾öÐÂ5ӯܑ'ÝP’2ã÷6»µ=²æ¾ÚÜfå.û$˜<h½êÒH­A{ÈヿT)oTš›Ëb_”C¡5¹Æ{žF…_¿sî >#†øeõéÃÏJëåÚÝõz î®{½Î™/ µÜ;4Ò(n’«³²Zî‰1~xܦ£ûÎÞÒGñ‚t ¾ûÚ3 —á¹¼ÖÈh<~=Œ¢e*ë²32ÿêÐ+Æêòµ¢‹M¢’Kñc‰´þc`ÕÍÎ.ðj<ãHN,c’‘¦—|-Æ‘ãí«,›7ÊêôzjÎÊä}:Æšýʬ(=…‰¬RÈãœÑžÍLÏ`¸{ú~©w¤9/)À#à¹ZÝ÷¢âYrvÇØ–„1u2ãDëËÁ «)Ѹ·6íRW©oŠ¡y$|©ÁÑf¦@Ó©üìzCä´ß¤û^<ÐÅ-LÎæFM¥žû‡é˸Áß'¿ßXBø)ÚrhB¹µ/{&nÄÍàd÷¹Ò£Î¡ºÌØ„Øk?n—ÔsDeIíÊ5Oñ7­;ýö= ‡Çe 3ajèz”Ë®8h'$Ô\×-”…ÌîЉМV*¦…­FÔO™àšÞ­;öL~¬}¹ÀkäÔŽŸÔKIëw5ئ«nz“yèy]?÷“пéÎúª_…çÍVWyÈúä—qæ7Jüþ—¡ÒÉðõù×nɯɉ.„Ö‰Öþ[E¶Tű‡“Êë•7Æ$ 7Ìe$åmÊÁ„3YlÿÒ<Ÿ‹?ª="YWT«š{êæSE aÐ=EÕ§´y”óÌe¼Âa²²ÔŸö¹÷¾_ã¨bÎI§?Ez“ØýB£®UjTæC¯J™š.Ñj}³•™Õ>ä1¨'›³²¤Sª×Hö5€4ûÝý†;öpæ.ü&µoY7î£HŒ¶×ñ
-ntÆY~¬óôç»Í»_sóŸ׈N‘Ññ‰ëüï«V©Ô§Âh÷åcĺ´ ¿ºï*T¦$ÏGlɺÞX±ëP£Ù»å¡Ýñ ³M¯-TßfV1MW÷-”TômÃÅê‚Hâíenáú„Qkâ󢄆ŽpæÀ\—$§!7!Ç]~%Šœù¤)ömµÑ)Ç÷D_uo€£ŒÚjîü5ÕñX׺™»÷àÔúBÙ˜«jU´fŸîÝN—²QÝÖ…Zöî–Û£Ž!CN×´$Aü6ÍŸd~M ÁÏ'/]sÆfC"b’“0Þ]°]ßp]¶Ñ^‡ïkšÇ?¡>œÝê9h;>•MsÊo:Â(žGŸ7ùñ›¨£ªÿµá£¿ôµè«êꎞîìJö‰u5k—¦œQNmÜÙÞM8±+Ûã1ãdß~ºëþ9¹Öê¤òXvGH½ wXÒ“í¥Ñ+㬠ìÍ­à| CþÜÿüO4À®n# Åý ¥]þjendstream
+æ2@ ŠMË© É„’ L P. (‚€`P¡r¨´RZ/ÀËÅÄŠ‚g¹iL@°rÕtÐc—þÜýµggþÌû<Ï÷~Ï<ïwÎgfâéCpb!Á° "@"HœÝ|d
+å†pD€…óg‹";À‰£\&$
+B
+Õ€PŠÂa'«¨@ p,XÀÌ1‰(@DØ
+¬Åez@.¯52[‡_§h™J»ìŒÌ¿ò}ÅX]±VXj±IXz)a,‰Ö ¬¾ÙÙ>PgÉcL2ÒõòB®%Â8r‚}µeËFi½^OíY©¬OÇX³_™­§0‘V‰‚¸ì3Ú³Y™žî^þ_jÄiÉOô|®V÷½¨|VŽœÝ1¶%qÌOÂ8!98a5%÷Ѧ]ê*óO54‚/5:ÚÌj:Uœ]¯b(Üö›tÿ‹º8E)9œè©´sÿ0}?øûä÷‹C ?ÅXMh ·öçÌĸœ,ç<WzÔ;Ô”›{íÇí’{B#qŽ¨4¹]¹æ)þ¦uPçáý(ÆñÙG#ÆL<5t=*¤W´ùjŽëÊBVwØDXî?«Ó¹õSÏLpMïÖ{&?Ö¾\è=rjÇOjŠ¥Xþ]íVЃ隃›Þdù>ï ëç}ö7ÝYõ«ˆüù£Ãêã*iŸì2îÂ&Éüßÿ2T6±¾àÚ-Ù5Ñ… Ÿ÷ß*¶¥*Ž=œT^¯º1&n¼é`.%)oS&žÉf”åû]üQíż¢²x\ÝÜÔS?Ÿ4(\‡î)ª?¥Í£ìg.ã•“Ue´Ï}öÿO±O:½øû)Ò›¤îõr‰Q¹½:ujºTKþf«gvûÇ žtÎÊ’N©Y#ÞßB
+§Ý—VŽë‹Ò/ü꾫H™š2¹¥`èzSå.ß|F‹OëC»ãf›_%Y¨¾Íªö4]m\Ò·PZз —¨ >"‰¶—¸EèFỉϋ;"<æºÄ¹y‰¹î²+Ñä¬'eH‰¿ÜF§_ÒsYؽŽ6j«m ¼ó×4Çc]ëfîÞƒÓŠ¤c®ªU1š}ºw;]ÊGuå u¬Ý­·GC‡œ®i‰ƒymš?/H7‚„Ã~ùš36’“ÜŒÀñîÂíú†ërŒö‘ؼ
endobj
-740 0 obj <<
+956 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2154 0 R
+/Encoding 2719 0 R
/FirstChar 13
/LastChar 110
-/Widths 2155 0 R
-/BaseFont /JMBPRZ+CMSY10
-/FontDescriptor 738 0 R
+/Widths 2720 0 R
+/BaseFont /VXRNEQ+CMSY10
+/FontDescriptor 954 0 R
>> endobj
-738 0 obj <<
+954 0 obj <<
/Ascent 750
/CapHeight 683
/Descent -194
-/FontName /JMBPRZ+CMSY10
+/FontName /VXRNEQ+CMSY10
/ItalicAngle -14.035
/StemV 85
/XHeight 431
/FontBBox [-29 -960 1116 775]
/Flags 4
/CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash)
-/FontFile 739 0 R
+/FontFile 955 0 R
>> endobj
-2155 0 obj
+2720 0 obj
[1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ]
endobj
-2154 0 obj <<
+2719 0 obj <<
/Type /Encoding
/Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef]
>> endobj
-736 0 obj <<
+952 0 obj <<
/Length1 1616
-/Length2 25334
+/Length2 25435
/Length3 532
-/Length 26225
-/Filter /FlateDecode
->>
-stream
-xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdU
-üPˆŸìá|ŒRbQ»š€ê
-ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””sÂ
-Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W
-€gÍý¬ÌV” C†û3æèºnMp»-˜…Z‘˜æj¤¯gÜ\}–ʈ}—}ÍšP«¤{}ò#U/ÉXÑ…€¼ðk¬¾ëÜV­Ð<´eÁºµýt.<Á0œ7Íw©~‹A“1²Ù°¢%îßD?âÝjÑä¤[,È4ý©
-ÔI™Èüíç‘,ª!Û^ó&I|ú,~C¼ð O¯JëŽs/)'UgL—æªöÛ'ŒŸKnõætÉËÁ!;ÙÜ\õýâÚõþ#ˆ%æÈMµB”j!ˆªÎŒ o¢†PU&ø’¿ß¹PÃ$Þ;Ž‘»w©*t!Šꌄ|Õj”1íw-¡LÕÙ—›ö‚ߎ…>ßË>#ÈQƒ›a"¦´Ú×5ù“97Û
-Ïþu¿^ù5cÔÃ[î˜4mô–CÌb^Ûe m¦Ýìž88ç}gõi.Ó 6Û²¡{ÇÙº[·:±’‚~s¼r^®µ{×y"j¾À`UŠ2f5?+ún ¸ ¼â@œî׿…@“%5£shàî‚Œš¶{++¬#ÂЙH¼GH–T l™!Ñ+PH­ÞPË9­«·Ä[ZYIçi\eyr*–¨Ö{Gnðx*yçK ’„èD2JG«L¸Vä±èG6<… †Žçð9‡X¹;‹X‡ã$]Hñ8ÇR™¿}t%بêŸZ¥
-´êÄÐÓ
-Þkvßèåà?`Hdò8Ÿáz„û%u•$õAºu™\<bxÂ0×í°–h¹ÚU\£ÑÈÖ{¥ß\«E²È²æx,3wר•Ù.$UÚr¸kÀrJ“»Ü$œ)»
-'Þõ¹TÒktÊ1 ÊYµœóý–,‚Å w†Åáù.Ûå•OسÐ-Ž^ö}ÃÊÔ§4¼°…ï¿•U;hŒIv@™È8Too?â.i¾NFNû²O *¿‹Ÿ9áäu7é8ã›
-|V뛚¢”ø±W’\úyëªb™=)ÎþWà öûI¢¥Í|ûBŸx§/i¾Úæ3“"¬ì!óYº&4«?©eL:ˆ˜¨^lHëž|´XÁSº)7x}:Z=n¸Ö‚žäQÊü˜‚>›+Gr*|wݨWÔÐæ>zuÚÐÜHq…ȃŠ0?‰Ù“]¢¨=+ûfUˆb9TV¶54ç,Te5®Åj
-–€íÖ—ݯUÛˆ¢¿ß$»Zµg-SÃ]‚.(#º™‡`¿ Ât´Üæ 6¿mà¯ò™9M}§’ˆù'WÃÙð´£ÜNæÜ‚é§$# ÁIÀq¯¹
-ýl…;œë‚$#¥Rј'ûBYâSö JLj N·—“\ð“ë¨zå0y¥~Сª{úë#Òsa¢¸²ÆfÙà´ñéöªðc~ßâ} ]˜ V42lï
-T ›+=Ý"N¸F{VwÜ«Ýê'O¼o3Mk¹‘)& Y)‘-ÍÇaÊgþÆ®
-˜r ]w9jr‡šØ[O§ÎéåMÍÏÞ@Í?éÀ0ÕíµDJF„rFhS[ͺ.ÆŠz¤9dR’XL
-fÎ$Ë\nÞq94e#q0r±MnJïù» 1ç5Gö>
-ª *Aº\Õ@^¿>V1Ö†ÑîçhµäÀɱ~°ìj-ýflâÉL8D¼ÈV©§p¤‡Ekc4²îþÝc=´BªÔ"–¹² + „›šíwp ‹ÚjOI­{4°ؘ…‹VxáOR¡®TÈGA ì³+ ®À©„”À3ã×ËbÀõøϬ¸»eéj .5ß?.4?‚w1¤ÉÙ,ðà_–yC Qöê¶9›«¾_¼­pJ-G¥™Ñx¨^ð5xŽ“L¼<k -Ÿ>ðh¼D°A€'áO¶0„0²8t³˜¡hÀ~AÛ{ˆ&î)'`Gï^¦‰m ½\‹HBõoW"Þ<y]7}rÈ“!Vý, U4.Ð"‹¹ Üw9… ÆžîôÀjìS›•ó™…)å’æøUOí›|XÚr
-j«ˆ•Úý¶”À´.u-EaAB´=?`Š)/ æúÂÆ=šöÌé×K¼xX¯·ÎŸÙ5½È}áÍŠ•ÛìŸZñf6nŸÛ2£‚õ¥­¥gÕv/ð^€ ax e¦÷Êcé…|Q*íÎÅ>t.Äñ˜êò[Ê&G>¬šX>­|¶F‹ÿF9ÈG:
-}ˆÀu‰‡FëOðѾÒ`g!ë˶’Si™Ûs„×dŒìΈ”’G‹ŒÒ÷¤úPXŸ‘ÊX*òp¾š£µô†;pšX ¯»Õ䄾ÐÐÅ·.ÊÆ™³õK· ó§r±çÌg<¢åûœs§0œRÁãýËdò3‹Lqø%$ØDë=+¶X—¥ˆÚHï´m%¾”+pÔg­2œÐSíÛ&ÛÆ’ú
-ˆ!Ýkk»†“×ÉÇ.¾á®ì6Ëq_6…áNÝ«—6™T¶Sµ–F¦›–‰0;4Kÿ½26aþ2+Ai};bŸÀ‰ŒIu)I£YÅï“y¨)õ‹—­VïEeõ–œ+e"ÑèËF ÏèwéV¹Õ> ^;"ZÀÌ}¯å®I„
-ÚŒW?ð9ÉšjgÄO¤¨Ê£%Oy-¨Ê¾ÆÃt­ŠÉ2¶”êy (6eÅF~!²×9ÞÕ=¨NdÔ_Èí]Þ[‰+£øþþ>»`.‡`ÔŠk™½¼CæêU¬ùôÃÅN²3Ë
-Ú¬wî‘ê"¹¼|=’4v§Ù:¬)ÈÝ%¿Ÿë°yÔÅ)aÆÃ=Ax•qÊ8úçUûƒòM[iñÊŽBËE7ø·džŒ¿_SMé)7ç \=aY„2Ǹ,DôÝØÌ¿ðÿtöÒãž¿â K‚7Ö–ªëÏ«wV÷ž®a@¡ §¶¦Û£;4É™ÕÖYYøuzD×/e£*)£‘ò9fS$ 6úÀ÷ÒlE;ûrðã`Û¸ËCë*‰{•mÖƒºàÊ–Mx¥PJÇn7ß7Á±^m©Þ®;±ùM6ÂqN;Me.”·k–ü¸¿mF²jkÁÒ⥠êv„,Î8½Õ­Mþk´«Á5­ ÜªUô æ^NÁ&ºg3w‘²X4YeWn)•#~…¼qòõh¯jH¨Åö¤Tpû÷ؾö|]–öÎ…¸GxÖÀ´K<$L
-ÔUñ`•5Þ
-¶¾¨1&µwÉù|ì9UÛ39TQ÷䆹í| ¡Ã(=̨º; GLâ§6ÿãì¸Ì¡"¾Ž•w…B|(iïˆ'Å'º¬ú[7ô ¹r+£²*iÌÆä;¹E}—ûOþÊF\]¦l{YåAF=AD
-»÷I¦aôIãÔ'§»ÞÄû✨œùZzñ
-´afÓ´s!(ˆ)§é‡¸˜Š  Mí0Âß<_°7;3s]˜(ª¬Þ)JÁsTæû°€½F’§Ò“_íç#¹ÏïЉ¯"#(àÖ!È¢‹ù£áõDóòöÔfÆë"S§ÔtN'Þf~¥ê:#Ï¡Ú®“×5¬'9/ŠŲ
-1«¬Ù]͊¼аŽÎžl_ø)J%r˜#sŽ-Àë÷­Ýà,Ó’µÿV¨ðyºoèLLe·rÝLû—‚ f{ûc†lî %Gä·Ú÷<{­ëk†¯¹­ey4X«Þ>¹×¢ìØÀª"¬‰åLóp å4I»{lî5<o„îÌû4%s‹_?Y sP[ϱ0Êh5è²ÀEÎÀ—B] X´sd«3*8w†çñOSDŸkâHÅkd/t$æÕû9ÃÝpš®²èwm·Ù`×E¦mSû™ªf.þÝ‘¤ÐjõmïòïË`m•œyò§oURl»î*8
-©~ó lP}EH¦à%ÄM¼·¾t›t‡¥âÐ{cöÞBÑP ,Ì6@–0®ª7ëSB¢sÐãiÃ]î“
-á¹×»­còh¹ÂY!Ä÷­Kο™x¤õbVÑÄŠéw‘q¢†BŸíú·\¦å!ÎïÖt–N´AGsƒaÃ6ö¥¬0%˜Y—½ãX*íUϼ.;ÆëÚBØåŸÕ$’a’ÉÅ/KáKv2zQü ÜIDîÔ”´Ö# ­w±Bl*sA™vœFûô¹êH¨ËWŠeÍ6«T¬GK¨´gÙ¯Æ#&¤'E¶ÞèÛƒbmAФMÞùpþÀx¼(³L½†^PÅ”‡¤•ã°Ò'_ÊsGÈxh4ÒçÝ06‰½`}‡­¹Gî‡)U¦5u†=¹‰€®qäXZ`”…*ƒ}^­Ý›ZÆËYÝ…Ô ÀüF0j ÉؽoÑuo·àd¶lŠôæ¦|•À|ÒM ÒÐ$<tÒ;¹–®ö¿¾Þ~<€·j4uuþe»ñW¥”ñƒ£D9ovˆ<Õ¹çp¶Ö\g‡=–ã;`×_LtZ±É'òãó2MiBE‹À¿×jö
-rÂWf¯(¾ Ê.Tsûœ$rG~‡ÌR)G…-ú²O2cl?ÂBüX CÇäd"iXćÏà÷ÈÏ:ŽDN
-ä¶Ôñ{mƸM¯ýœîdßË
-‹¬)Ì Ÿž6Ö=jÖdÃ;í¡Ô¶„µ¼n:_>;y""¸ü,߸藵’ðȲd Ëd¨Q TÇëìÙÚÏÜ­•ïØ`.ø|Mõíº$õ´#É*šö7 ´¢Z•—Ã^SúëVa=žBžk#UõuƒKVQVQJÕÞL§Q¶Å¡ïºÜöÞÖøMØ¥b]k®Ûý7>ݳd«,B?.ÿ@uÏD®3uçæM ‰0).WòòÉÈhW' Vws˜‡×ˆ¢ƒ•\
-=;3؇ZÑíx§fÇu1{©‚qnˆé%Ñ)(Û+Ë*jóºpd±NãÎH¶›áóú E‹´Ø*ë_ªŒ®MuL¡Q°­èlq±ô¦‡³ý4ýCÂ4Š
-õgðeµ™ ýÙabÎbg›iÏRZkaPC+ˆrÖƒŒF&õ*4¥vè°½4ü`o²O¹Û•{6oŽ;ǧ5M²*ËË»mýæAd/œvH&TvןŠ•×èë§fè"W"Ô ˜_©§D´ß-ê{IU#\Ôw€18_1mGwÃI&Ùj™6j%µΑ4»o»R.*Z¼Ê…jº…i7“—n+2{'oœnó„É^*½mp`6id¢ýU•DoPþO z¯@@W7Q!˜ã¯º| —qu ËNƒò,ÖÆ8þÉòê’xÅ“œ-LÂæ“š¤Ö,Q‘ݾŠY]ò:ú©s¸÷8UsÞ ð„Œ)ü<²oD¹B2Â
-Q9ÁïÕ@[E£©ë|å»Þ¡–åq¡¢ pȫУá'¨h æl¥ËˆxKw,Š–Z=S÷z ë‹TgÔèŸ)¸ yXɶÚj"С~Ù·©y¾Wjǵ­
-)˜Y?þÄô‰H;§#ËaY‹zv,„krÇ)Æ-¼›è™«Ÿg\VÆAÜ®ô ×f-²”x éH9ØM±·‘úÕ¿)ÇDEðHÅ#Àë-WΈbe8Ôç˜y•ÛaÈÓ¶#„ŠB€s¨Ô[¿Ñ¬å=%*žÞ$ŠÞµmu|6$)!¨z°ŸøǸô†áîÊMÌ]Ê„hf⃕ðH!
-Z_!ÎØÏ™P°‚ž§TÙ s§ÌÛ ˆo{V®!(H”4o|ؤvIÒ†¹./ÔPÒùä³L6ŠH±ÞNÛ¯9s=N­ âkûrë¡¡ #Ž™.|eìÀ‡Ú½ìðâ+}(|ô’‹Ñ<w–ãÇûpÌ'ä çEFeÆZ
-O>´?ˆw]°÷¨Ãæ'²€n]*¼½ZX6ÏvJgv’‚¶Á =£;–ðO ½‘*-ŸâÝx>G( †Væ3ÀamÔ­{b|¥ %D~!Ù;'½Xï×>Å{2\ôsA¢›åÖOUiCYxm]¦ý,+“+ÎLïûôcK”¿´ãOn¶Ó†2pÖh¿EßµWê¼Ý†a#’Á°ImǨÐ5<,”ç'—ÇI$º¬ªêßbŒ>"1^ÓZ-âáÛÝ-ƺ%·£¹¤“—Í¥’IÙ ÕÛzbÑéš}¶~Ä©âLÄ6 ãaÕÁqðP2´6GðâPx,ro½sayjñ¥\Mó8Ë49öÑ~q|¾^þZ:@MSAÜÓÕ}$\æý¸ú†
-ÔSßõ}FÆúcþ„"Ã\|¯*)ÕI ÓÔ–,õ†˜¥I"
-n½ü.ñø*ì AÆtþØãR‰øæåUçÙ +KùMg”m{·Hn-dðƒ­
-'´ ‡úÃi©šTâ¦a4ÛÀór4C{$ÐI™}ø¢Ù>a‘Z(žxSomgìY/àOêÛ–·Go<Ü;œö£~NCbŸPT{ŸíþBÎÞ×pR½P¤ä¹ÃV‹»MÿpžíÜ*¨‚]”Yè=¡zéêÛCœ£LŸ3t7_>&IZoômG‘f~•¤Ôóþ{àMßq;:Š»Åu ¦€©ÓZOk˜ˆ<´XmümŸãT`»u6J+kŽ¦‡+Ö3ê~ªdô›™Ò]þAO†ðq†Â…“”ÈH®è$#c*ÿ1^ïÉ’^‹ÍR¹aéc‚ç'JžÂF°úÝŽH18LVÙë`¨çòö«;nQRGí\vß]"zÊ°¼~Ë *¬‰@ÔàÀ°··¹K
-ª`Ί‹šXN”ÀU?Ž¢®ºëÈ5ËXrB0n9½âà!§æ®»u*PSçoiyµÚÒLNöolU®/'²ºNl¾+
-z·ô̇oŠ%ž}Áwiô[ªÙ׶K¸pWâ^­níåÛiíèf.\«™CÐ f¤: l©N}Vâk¿3 Ê[‹æ+>C²W97û&Î_lûnú6±pÎÈè?9+Ì^?…ö z×û±·ÝIÉ*ð¸ãEu…nÄsA´Ç×ñ^dŒ–kC2^FvBñ§ Ó¬Yƒ¸†|óIÔµ%y$¥Í•Èƒ’¬¿BPÞƒúuÓ?fÒrJZÔø¯e¢ú
-WL©,ãõ®<ò ¼z8ØAÚBeåŽýAf!Òç.P£MX“mtŠž¼ßZ‰^`«-Þè|‘ ª<:´N†„¥,ûP£—ærÌö)ìÆFSuê‘Ù-Qà‘×®
-õó"KŒŸIF€¥%(³–_@k°„
-j-éù•_"R§‡7D.àúœµÁK`RŠcàÅRÓ¶µËê‘V¡€Â‚¾±Ð ‡‰ŸV':–ðê$íôÃDgènº¾Í·ìM‡k/‡&ŽNYúÞVÆ3‚tӾݭæ;["Û‰`Ëk•¬‡~bŒók-<ÓLÄHsH‡X®¡Ê%¨};É„ÞÌ“Äo·ç™HV²[]û:ûýã÷ön±Út‹©¯¼€ x-0å­ ¤ò3(×|–¤á#¸Úª$xœ£“µ[=~©øwBˆ¢ÞЦîx´-«’Â@iaéLß
-–qÇÙ¶â(ŽÇwû',»_eßùÈvôÕÝU]wùd}ðy0=˜$IyO›ÍÈ€œ=»U9e~5ÉŒœ¼uo{´Ñä¬nEhÕkPía˺OoÑQ2úˆ9Ôì&\`}ÕGÈÔ³ktð´bÖ¬5‰\5 °ÀÃbC“
-8×Ù¾]“’h·À¯6æâYn%«çŒò2Ã>¾õúŒP?$8uŽÁp
- ™ðˆfd;®"¤¹dA¾£B·KµAPùsF_óuª†. áŠD*Aü¨ÊiðÔ•Çð—3+¥]ª„kyÕ£dfÕp¥ß†ÜŒ&è tÝøgXÕ€Š¢ ãŸ6MªE×ôR¦™–/œÅOtÞÖôÝýÙbE€(àºè±GÑ@…¸A¦½¹ûÆŽJÉìÁÚ ˜‘êæ§p„¼a¦ÎïbH—@$ÕflÕ?îTù×7íÛ|¯œ1¿T({i•ò¡Òj[T b>J°ÿ܃>Ž.èh‹æ
-v¡=å ze׶)ö\à˜¯y€Š|É) Àµêú<`I@Nw¦éŠHræ­Ôóºƒuy.)ø·Û‰Ýê‚í\üèG®øÜè 8tÏ»ôanퟒJRo╨,ëE…cc!U!ž¤ºõN±“¤×[zçQ¤QC"5ä ã‚Ê|7ù9s0˜L½I½\ðî §¼õq·aø‹_®sÅ$Ö꩜Ė]dyé=t°P‚Ö¦—3YoÝçÒ2Ëp•ç]Lò2†ÎïOñfÊäNªQJUfî‰8¶÷$ý›°‰¯öOv¢8ÉæòLvViÊZã¬à¥Wf¥
-<”â׭Ҫܹçò3¼+çÓ2> $´‰G£éœ'¹’Ž¼ˆÔ
-ªwQå\T1‡`ï–*!7Ñb¬§¤ƒÌ%©©Â+¨÷|¸M·äv×·vã„z²Žç§ñN4És÷ôq€ÔüY ÐW<o9tƦ7°6UL¡y¶s-ýsŒ,ÓÁDHHZiÝwà¾8›5‘ÊK×>8­-²¼
-!STlÕȇ=f¿lOtÀGF­FTØÌ]¾Žr»j€¨7mÞ±Ï[Üû)ѢÈõ|ÿ`yzŠöÒé±<‡‡a^!½Ì=UÆø×ÈÂúa¤Î†¯=Æ%L€®"¿ý%âwQ˜H_éwõ#"ÜH„-»Ö0PõºÞ¥@°lÛt´+Ã=¼~•¬Z>ñ~)E‚®8¿’…@ Å²!tiv6diü•â¨n© J@u˜$íoá}ÝÉ–i3Áñ§EÊ®äK„o«9 ‘9Px¶:lrÔpÊÕ²²`¸uÓ/µo­î’h±†™º¤Õá¤Üôƒa30 ?GÝf× k!{h¢Ræ×;ì]OËÄ(«‹ž<üÓÎÃijW$Ä,= B‘Å)HS†b@‚ÕIw´«–¨;¬Ùlͨn³]]CþÃzÃÅH4¯9¦d˜«çï¡~¬ˆÊ \ES ·Â>VjPÈ7³ßtë™LËYýUå€(ÉxpЋØÁß`›¿ÃTdߢ}éøO Éñ¬1°y°‰¼wx;l¦"–SH{ïÚË“°ØéÆÛ'µ‚ ‰œõO
-‘xÑ6@·î“ü <SË~m!¾áº™Àƒøu’°ag¥Þ¼ÃæÚ ñŠw­“ë•Î2z­B•CÜ.7 `˜Uy̨²Bzx’qê/›ä?º—d¾¨¢ ѧcŠA×<38æª"<ž ‚õÆ—½
-;i÷¤ð =¨?³F‰%dr,¯Ô=wxŽ$Ì„½‹eÐQ˜ } èax>,¢RÔ÷ÕüMoÖ+&Dù ={ùfs9 µ¨<|ó\¡Ð’0së·§!Æì¡K^j1®!çóã7ƒÂF!2ùš/ÞQ ýW…!dHc±g±Ä{«£Pa,†S™"GÂd¯Íçe䶬ÍöáÇþ°ËV¼Èˆ€CaDÜøçf:*ºXþÉÁŽ)2Å·áV׫ÂPHLVz륚íä«Ÿ96? Í2åÈÕZrÍ­Í »È»Tn¢"Öhd T3‡½:¬&™t0M ;Éà¡?„R„ùHÌ÷ŽlߪeÌ—cN^Žaî[¦|©"ÏP%]Éúí9F{ ,R˜,wÃy'kÊ?Ázï×J#ů§¼¶7èÑf[ØÖ¸Ü8m>é,Õ£ñgsöèîǼ–Ÿ >¢’mƒ»šz¶‡–œµýdïŽf[¹öEódd@â?õ–ûn±áH¬‘YÄ.·äÈ"R½¨³® ®c41V8;MmàZË¢ò·ÝHu0”`QMĦ‹Â‘.;¢¯|í/âcbÇóŽ—GÛR>BŒÛb}7krê«<Hú€·Ïg†Îq¯Kîý \—|XY¿k˜ôÆñÚ.ŠÖ§ rõy£çu‚dàlríÝ‚KWe >À¡꓃ BÓwè‰)YXP›Ålè•1«€KDà©)ÎýâÌ2~eœM=¤®%Õ3– Cu^yQ ä7ô£¿˜ e*²»ž¬js»¯ù‘1'¡Û~POœÓü T™æ·UFaØ­ŸsA?Áè¼³Þïê/Ã×›Ý/ˆ' xû:ï+#™>ãàiýƒžþˆ¶ âh1CJi•ÅĨ 0+íˆ ªä›Ò¼fÓjæ®3„":b^¿’ž¾>œ ÒGßzHűI ŠÍ2‚W<—ø­î±aj4Dµ“ 5«\6†3Ÿ‚ c½Fbá¯8çÒIzTp…!‡ˆ­W@Ö…•Le2ˆm¿MߨC8Žžç¾|à̤ÞBÂîÞÄx˜1=WUTw.ÒB²è¾Ôç+Sïj©zx¡Ê-iSŒÌ¥ŠvÔ¼+ù$zÁÏ™FK0&}–ã㪼¬Y‡~9M+Ã¥SÐ%Ì.äÛ¼­=éšâÒá™>uMÎWÐ_Jú±Å("3²8Bwú÷7Ôm´pJ°B4¥”Nƒk[‰urÙÍù¤†sH÷Ö°aÍúFŒÆ]bføÓy<;X†4Ò²RÖ:’êa“‘qXL¢e9G膥`ÓC®%…›ëTÕ“PnòDXup­<§Û­Èž¤ODZ‹ø5­¦/»#øí>¹Ý¨€º ~'–®y×âSï2ˆÊ²„´` l—Ú-|Us¡o(ШUó4¶ƒ¼&‘níüÅçcè¯7Lçdk~Üæî…MTx€iÊL1ĺŠœŽõ‰4Ábͯ†Á¬R=ÐFÿ‡ hC(íú6IÙÇ0”¬ aúÊBJiÞþv£¬zh7ùp¢wÉ×é–WŠ|WXva,qkOæê¸ü¢AÂLR¿i9ßv«!Uno¿¾Ó7…­EýØé2CGÊHß soo¹°®âîç´ÃÓ.·ü‰XÝ[ä
-sŽ[ò¯ÆºŽÏ ZªT˜Fu醭aw;ôfI´ª|fÜÚâñ‚ÑîB5ç:ô›C]Åt)´¨ [³')Öá(Ö²Xý” ©A8çŒFŠƒ9'™ûkóm Áh%žºË!]Çqf°pPŠpÛh T€[LœPv?çM4™£nÓMZw ×Ð]ÚUå)nÆ<DíÃÐ0ŸJç!pº­µB‡#_JÔ&bƒfç×M2ÇjH@§ùåAßÄt
-Ópd½Ô[`çCDîãY`=O¨ã<IÅÿò‹I‡ªF< óPZä„N|£Ñkÿh!Jž¾”Ú§x¼¬ÃÇ`3´üµj¥mÛ*õ·ÒÝ“$Á³a†£òÑ*ààw¥+}ü[=5êÔ;ºžiþÜÉzÇS^ dSuœÏóÿüÿ,.Ä2lsŽ¸@î³ñÀH²Ç¦¸c;däýHŽˆEpcæ2®ªÉ'ýœ²( HñíÀfº6¢~ãÍè’6yÏØlêÖ¿Œ·ð‘®ª_0°—j†BƒLgxN†N¼¸4tãr&ð$Òá“×⳦\׬#RdBÚsdz/¬Ôü(Lš]ÓÄ>º
-Á¸ç‡ÂúIo>¢ž Y†¬ƒ;¢+A²neçΚ[czýMµm/p5@?¶~t€pð’ºF°‹[Ç
- }W—ÔÖ¤í®dÏê3Æ­­Ò‡¿$ºÕVP› øÅVc%3¥@¡íä&žH˜.ÀýÁ6vÀáõ£…z…BqÛNÉš›2•TûD:½õ®àxü\Æ/(tùDѦ$C‹%Ð}B–ÌCÀèçQÅÞ §ŠµHËÅL9Ú~[[f︙¼mZŒ=6% Ù]NÐu¤s0E‚ÿYð»\I'T‹p>̵†ƒ"H= ‘ª-ùQLO*I!P9RÖ° ´
-tE$ úoÜK‚†¥ocÙÙ E/¥ïµ
-žž3¬ªA9^éH_ˆÊ3ìšæدÙnà‹)áâm>À}ÐhàÄšŒ åø3ÓÝŸ•Tw²•ä!l}òrû´žMßÁž}µe¤Ä¨(ÔvÇ µþ«Š ÉpÝ8})Z¯ìfä8»8Iƒ~±žH.<³»k—Ã¥ÌdÕ¹<™Xð’hɤbÕs!÷Müÿ´/$¥nŒñIpƒR{Ä„'âcêRIÙ=\XÌDçl„ñÙ7<²´-œà SæÞ’ÇVûñâ¸bå#É^e‚ÏÙþ*Y¥µ
-÷5bóWŸüÕôt³C9D$š)I®«K$j tR(PPÀ"“‰ìXjÄrÍq=L7Dã`f*n^˜ÑééÍz˜`ÕîÊ_Òºn°u|ù5Öe3Œ?Ä‚! ×J„·LR8“*'²¸¢hŽ•ˆã€AŒe~ô"ž^'Ô®qiÙ&­´fˆÄãow^xvÁoóÏRvÎ?îè†÷ÖlùÑ2ú«4Nc|mOdòpÝ.#8£²#îK²nd¹!6Hßçw¿Mï;ž†‚ìÞ BUuו€‚CTl®´ÔZ¡ØlAi!Lëö.¨N«¬œÏÂðNÕ ÷?õaØÞ&.8ï †‹Gq2x4Sâ@ò~ê–œ%´Æ­j¤«¦³úN‚Ó˜N SˆWVµêYkÇ°¬5²¥áŽ¥ôbûz\séeñ½kQZy¤h*Z–E(ÚRˆ3 Fè~˜;ã|$ªÓÃ[®ÍÖ-˜N]ˆÉáÙP<|Å:³èôFÎõSº6¾Ï,)£Tÿ¨²š
-ÑåêB:­ÃÖŠ Êx$To9@H¸%±.¨Ì~jô&+A 7—ê³Óê®ãO ºQœß ÝÓ¼UëªðKŒGf´Â8Jý?âá~«¦°,i´KRQFÈ:çZÔ²öhÚO>Oɽfx‡2ȪA™`dµjg ÞqÚþæb[{e=?_)ºüDÁêÊl[TÌ37Æ8)Ñn+àAíMõ­¨Š"z´CE'h˜¹BÅQqzïªö0|#aÄ—loàÊ—v’³XfŒ´xè@—zÁÄJ/Ÿa‰¹­2ŸÝ¥1%~¬uÂ…ÚÐ63íè4(ÖOHv´Éã‡6ø‚æ *ñ;yŸÄp+íKÈG?üþúI‹À7 \sNw%Ø’‰î;J¸To•Ö!NÉSenéN†£²p¬î“‹
-4­úWM‹~©¡CÏßÊÿU-Ÿ}ìŽY¾†¢á_±@Yh€íu›øbÔnW,ø”=ízt<îKfp¥]“ŸqæÅÞ-3Æn’aZ|ìŠï|=AW?~†ŠŠ¬‘-šë\ïb;üšsî¶j÷Žmùé4§xßîh&ô¥ü"{kƒ³é|‡l#g nl+Ï7#R±´Ö>õŒ™Y©âeë:@³Í¿xçc…/}RÖ¸g´µõIßârÎëýM•4yþ^Ú'ȇ·ø§–ýͬ&‘^×Á7È:6'ó'r2!LÇ1¤Abw>ñg²*¯Ž¾O‚Gk(9ïu
-%¶íV,ÜQòQÛÆtäf‡ÅuZý~J´A{3’ÀJ™‰&Ð0M\ý\¶XÀö1S¤³ô;5¯EaÏôJ0·/›Í4j³}
-eOLÌq3©¶Ô}ÅÂù„×
-³ÝMB®Oá÷£…ˆ¾b4Ûm5Ðo{\ˆciÿ™ÇWáÿ3Î%üg©çŽŒ¸Û¹J…QÒ‚Q ]¢À›ÿБ:™¾††4§VõÏ_$2}Y뤩ØÝððÙ ÿ¶cÚ¨"yog2ÃŽ‘} º8SJ)ì"Ko™†øžJ/ Æ´“+b<7H @,U¸)‹}ȼŒë§ü`J†g¹÷ûŠ¡tm
-…™¡é*®ïÏZžx;À-Ïåìƒ"ïÚ†ùòù·)*¤¥3ËÚ^ý=äÜúP~Ø.†ÜT Ë ‹ùæ(Õ¯ ^þkΛ±¢é ¤TrÌ°íåZãÒm5Xî3·#xæÓÄ·¼+»b{ÿÃ0œ}-å1˜Ë¾•áQÎÁz‰Â¬ÊÞ¹tEpyIêY`à7¢K KÀ½1«Òâ
-+aëØ “)¯[L’ïµ' ò+Ÿ°Ÿl‘\ñ™ÛtôÍ<ÌÖëwÊ¢bð59Ð*ßCdŠã•Q¦T¹/®¬“¯}%%§º/»ï³t.fÌ fMÚ˜Õ]Õ4}/ ÃÆѾ9ÿ5$ÉýÓ\úP/eë1WÞ³…Óv`ÓHT»Š@NùÛèjÔø«Â2¬ËXì^â{ËÆmô«—Ä 3¥è)Ç UGø:ÿ‚|…o?W6Á~ÇÈ!]ØâgÆ®±ê3_áoxFP²¾Nµ¢CŸs|’u(ÙR«ãòâü)ÞNcZöÒ¼°nPF›‘úâP‰6úÓ(1êv¾o*ï›”|QÐù#$!4SzâS#Ž·uþI6Då%3פx{ˆé´¯KKÁçÌ®CÌ|HuæË‚Þ
-mèLj¿I¼Äyê4¢“xC‹´¾}í_dšÈb‡a¼Ð˜,ÇÁ”jÿ»¡|
-ôÏ™¶ôúû¿
-h?IOø¿{EÁk–X4~Ôåqp „DuNLi’ã¨L’¸œKŒ}ƒ—Öxåp·UÚ¡e=.L,¾uêÀ±Ó>Ø6¶Ëh ¾­I ©¥2ÈæýkæYל2oíˆ6KîØà|ž °
-4£|í 4öî #a`ãåƱÂcJN¿$DÁäÊ:ß÷”¶Sù¿š0'x\n)|”"<jÈàlZñL|ìó “ ¨EëhÈ`TdÈægòㄲ'{°›ö…`*ÌñN¦ÈKìí111—Q'ÁX¢‡^¡8fŽ$°}d+xÑW_Ìñ÷õ•Â  Rö>ü?ëáˆò$ƒ‚EÍ›z`…Ó.´ïîÞ9C˜Lö*¸`b@åMlå½/O‹EW9
-¦?Ä›Q‰ìó
-€u“¶o-ռζÈFE£ð.åƒÊŠë>{‰*¨òwµš°s÷ãÁ±A
-Ä¡gK°–jྤvÖ?”lMöV([®™4úÊáD3p½$V¶Å,t‰#”ò·k¼Í_y´©¡4A{;D9"š;ó;ée$X|9T7N®åüok½µÏÝ3äñ= àŠŸœó ,çPzìýªk,AUóÚd¢`VX¬@a!G»¸¬³^„žÍdSïÄâzy’_W}T kÓˆ}¯µj,BMðî´¥{¦XS~§aN·¶®žc“£Ô‘«8³s&ëÊ‹·Å &èñÜ”?äý«>ÀÞ×]Q´®óP™Øk`ßäÕÝf û®‹Y×Z«ruì=È3€1\&ÀHCNXùlu[80ëFÝŨïØìNÄ]©
-˜%0œÒAJ^ý´¼%¤w}/ ö‡î²òAæìQæãžûnúéùÎÕŽÙPÒòçÌÃzÈ/Z;ž)\x‘ÚìëÖÞ9”U.‰Ó_>ò_øá5Uûc-­@6 QEæ*D}X2a/GúGc1§OMc-Œ¾2å\¶ý„ÆP¶ó2¥‡`1”{݆àYšU!²TQŒywµÄB´¶BSÒhឤ2šA1±3_oyPüTIŠ¼û«õ[»TW”—¡6ŠÅ~u‘#·ëõpmðI„#³ZÕY$Øóyø2XõþÇ0†¸-{ñÍ·¾ªå¼2ñåÐèœ/ûY-T !ÓXÈ`lgÀðß‹Ù§¦ß
-_ÃýS‡µ )1ŒÊOesLQ²
-Ôqµwˆlød {ŽÞ‹t¢ Þâ+ïí[^.\1} )ÃÌÚtú¢à›%×ùRO|cÇŠˆ?ô€L]£µúem˜m…pRn7+o“Þ«¶›4s·Í –çë:yÊtôÒ² ê+ã\æ—‹HöɈD#|q™eѺTÀ?È6@å¦}Òú”¶¢§†ñ®ÐJÛ?ûÝ(
-!N™<‘cÞšó¬1¬
-Jµ¸Q
-¸* ÞNK
-Ä'Εo äNïçÊòHª,—üw*»ú.|¶0ÚIÐ ž4[Vƒç›-Gy2½ û{(b'óXèŽïÝÕˆYzåeø’ºkSoðÕzN
-…Ï\{¥?!݈¿Q 圲,é“Ó{Ü™Óó½%·‡ƒR™ØKY,áëÎú¤ÌLŠšàßÎÐc+t_5ñ‡^€ ¨aà¹3n<‰¨ t6.ôÌö›Šûƒì-w\£ÐZÆ.ž(¯íôúDÀëôèT!þYÑPêÒ•m‘Q•ôƒMƒhØ›‹Öš– Z¿,ÃCó
-ËÝ@Á¢gßqìöD€¶þ¸µÿO™ë&Ñsu€r“·NŽ¸¬¸Ü/½à=Nº&F¼«F_ L-C§ˆ}yï=]Ií˵¦² †¤Ä,Õmza­®4@Aĺ@q‘s “†D(7–Øuç´qçGªw=cP Ïú#ÆÅ·¹ªËPl²Uø¾d¤GË^ôë/mŠ¯,¾RÁ
-¶Èãé©t²„4å¼н”n_0gþZXßåì…×bKÀ!È*Š¢Só±[¸ùq]²Q¨ù
-R㻯ÙQôÏŽ}Ô Z—7“Á ¬¤jžé ñ"FOiŠ>?ÎyÛ!änQT)Æd§ Õ©Jü[—p1}àn‹߯¶ñˆ#ªU{¹SV}¿W†yT¼"~,*0W‰™ý.ÜXxäݾw‚”ÕÏ#hïyª ?N8,¬Ÿ¢Ò‚÷†—ó]ÅŒPpFÅKÕ~G‹kýj Ý¿þKIÕ$õºÁÞº©‰uVé¡OýC±ÉåMìi ž2C´gyƒ?’ËvH4åËÌŠJ ÂCéØK!ÄÕãþIêf|ÐÝþs/ô³@Ä:÷8=]׆ËlÙím1qGoi{tÒ-3î.¡¡¡)òË“–š1®”9c¿X;È:Œ5ð4‘t# `bK)qA¢ ©˜æš ›c´­5ÁzZ1ŠÞÖª)\“²1ì×±u27Õ@}}·f RÙáÝoW9Ç\P¦0»EÆ}UB%×/y×—¶¤^â¡26ýù,bÍŽóPI2ƒM<¦éË:ª‚ »û­h¡1¢Yâl8.ì4„ãGóqj#ÊÑY
-bJÁœ>ZÔ¶X-wJÂp²u©âÆ0S§±sª3KÅæóì“#‹yžÇ­¶÷ âÙØn¼ú}åÔ\C"…}ñõkRO‘"ÆÉصCŸ°Ç&î—»ýl#˜LV¢n÷‘¡ÈÀ)5~ÁrioΟeÓH²ƒ'¨ŠÒc~1GÙÏVÛÔ&¶b®Æz†­(óÞçy]µu9Û³·ºSß<ñ‘¨¥ÔÆúµ•†Š·ý]n>+`½÷£¯´¢w¬lŤŸÊPh;w#7Ž®vUs Ë0 ÒÕ1©HÖW¦Bü0%Ï x4î/ƤúEGû ¤y+Ë(§ÛH·ïv²x¹1= ›uBCpƒÉŒ5¾ÂÇ™Ò{A•0žÑ5'†:]+³ lYô9²Ÿo Û;O%í§æe½;ió]…J.Å*¸½ÚWféë]šÆ¨’IFD>’!(š 9$˜Õ{è{W»‰êå|rg,fi©†Yœž›V™êkS3ððŠ³Œê£s(h"ñÞJÚ¹‚ërG×ȃ®Ÿ¦Ô\ãûö! ]aX
-=ÄWDe1ˆ¦H”L9ʳ‹Šâ(ÉLU~f 3Š^ùž©DÃUBAB´m0Ap ÿØÁ÷4@-ð³ÅÌO­‰D^¯-;<BÖ6÷¨qs LâãÔ#½×ÄoQ ,Lñ¹½
-A™âõ2ѶŠŸÓ¶Äøí÷w6Ê+–IºÓœnµq×oúWïkN)ï‡mÖ8/1aÀÈ[­ø'! ´ŒÄPxÉ¢rB<–ðœØEÔ?Pr|7°™2­²3Dá ÄWUOš9¬hÓÄ5@)NI´°›s0ÇÖnŸ[fö½U¹fHɸ>›»|¾¸¬{ü*ÄØ*X‰À¤ø‹Ã’mdñ„]8Î̱r¯éúë$Ÿ5îyôÅ 1™ú&àv(WØáñªLŽe½pò‰õTàb{´ŠÄB!ð¸YRE!ɾdä\ÁÔ|
-Äôò} 0á·Ï<ðx­×³5(©²ÓÇXõ̼‰h8L©m¢Í°]ºÓŒx$“
-­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬
-g¤£Ê¾2f~mû„m}…i
-'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿
-ä&oH[œ¯A•9f
-endobj
-737 0 obj <<
+/Length 26323
+/Filter /FlateDecode
+>>
+stream
+xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶»lW—mÛúú}ïܹ³î̯ùæG®õœˆ8;vÄ>'Öz2“„@^‰FÀØÎÐDÔÎÖ‰†–ž ¢¨&o`mm`la'M£hgc
+áàUûZ­RR Ž_&½þ’ÞŸfx¯%Ê3® ôEþsÈC®” ô“‘Bå0²TU’?…šÜ¡ˆhÍÒVùòýåm»T úÃ8Z§ä‚Û°ý ³:I?Ôöz"6›Èbœ^%
+yá×h}×¹­Z  ypÓ‚u=jëé 3\xœa(74nŠïRýƒ&cx£aYKÜ¿‰~ػբÉI·XiêS¨“2ø ú›G²¨†lkÕ›$ñé³øI ñƒ<½*­;:̽¤PœT1]š«ÚowŽ0~,A¸ÕO˜Ó%/‡ìdccÅ÷‹k×{GKÌ‘›j™(+ÔBUÞD# ¡6ª:Mð%¿s¾†I¼;v #wïRUèB&%Ô øªÕ(cÊïZB™ª³/7í¿ '|8¾—}Z£6Ã*DLi´¯kâ'/rn¶èXÐ60µ!~Èaïގا*\Dxc(uè³?^NWù ±CVØñ Áá´ÅÚQ[´¬5üŠvȈ0Kïø^•vµÚ*V¦°cœ (p3“¸µMÖiÒ|#Óƒ}5ãByE¦Ç•yÖÌÞ¢º<^×<;>3ý
+ÎÈ;V<g5j‡ùôIH›C„ÿæaTÓ€
+úÍòÊix¹Öî]牨ùƒU)ʘÕü¬è»à&ðŠqº_Eþ>Mv–ԌΡ» :0jÚê­¬°ŽCgþ!ñ!YBRÕ¿i†D¯@!µrC!,ç´¦Üoieq$wj¤q•M4räMÈ©X¢Z_ì¹Îãi¨ä/JF y Ètp(¬2îZ‘Ç¢Ùð‚:–ÃOxäb=ê:äH@,bŽ“t!ÅãKMdþöÑ•`£ªj•*ЪC[L+x¯Ù}£C”‚ÿ€!‘Éã|†ëuî—ÔU’ÔézÔerðˆá Ã\·ÍZ åjWqFW [ï•~s­É"Ëšã±ÄÜ]£Vf;ŸTiËá®
+X z‚G)gàcúl¶É©ðÝu½^QC˜ûèÕi]s]°?Å"*Âü$fOv‘¢ö¬ì› T!ŠåPXÙÖÐœ³P•Õ¸« "è ƒ7käþkÂ[ŸŠÐâÓn¥% „¸rñƒ‹3!ö†¿wqŠ+÷-×}ñ¨C}3X¶[G\v¿Vl=Šþ~ƒìBjÅžµ@L wº Œèf‚ý.ÓÐr›'<Òü¶Ž¿Âfæ4ùJ äŸt^ gÃÓŒr;‘s ¦ŸVhŒ@€'ǽêdòÉ,·œ
+lô³î@p® ’Œ”JEcžì e‰;LÙƒ*#.P8Ý^NrÁO®w¢êåÃPäåú‡ªî©¯HÏùñâÊ›%ƒÓÆ{¤Û«Â¹}‹÷þta2XÑ`È°½W(Pl®ôt‹8áníÝ1¯v«Ÿ<ñ¾Í4­åF¦˜4d¤Dr´4J„)Ÿùë¸L²µ% ç?·ëÚUA§tkݱxèL ë…3kà N,ˆÛ3«QÉĸǹ‰–B´‚7’ûÄL³_ËgƒÕ ñŽ1Ü
+˜šæ}›Û}}<‘3°2èRÍp´$ðʧFu(#6A<x•)Ÿö·QÜ´Ç
+å,´,œ6ˆå|ëÒtлå$3ÊŽ¢¨'‚±×ÄŠé›v#c5ÉÇâÔǤwÐÛµ0ÁoãiÙíà°Añòœ¥µ¢Ã® DSêá ©ó,zé6A²”VèFšxzGˆâJæls¬>ìFÏÊ2/ÕÐ:C
+Ífg4ÎS" >ˆö—H¨äµ>8h¡Š¡3lÒ
+{%ྼ¿#‡«BÈ,>‚^@Ò¬Ç0nÓCížU½šÂZ ^u»éên®p% À#d_Ðby¾ÅéZDzl€÷„R%ìS¢Ù+L}êPS«‰$1Ád8Ç2cæÃJœ¸Lx™ Š¬3µ”êR'1ãø
+ø—I›&ÃX9!«<O |è¥5©ÓÑ
+ÕMêÔž5…ÅÉmW¶Ä!ßCXéží´*m¤ÈjÏCB€5BŒÏ)Õ‡d"ZÕጼ B^moJ ¡ì‘×Y±øRAD%HX—«Èë·ÀÇ*ÆÚ0Úýé –ì?9Ö–]©e¢ßÄŒB<ÙÁ„CdÀ‹l•z
+GzX°ö0F!ëþ½{¬‡VH•ZÄ2[t”€pS³õ.aQ[í)©u3Ñ
+/üI*Ô•ª"ù(T€}vÄ8™xfüzY X¥û™w·$]-aÁ¥æ»ãBó!xCšœÍþe‰7Ä…`¯n‹³¹êûÅÛ
+§ÔrDš‡ê_ƒç8ÉÈ˳f^‘±Ðòé£ÆK$xþdC#‹C7‹Úˆì´½‡hâžrvôîešxÐÖðà˵ˆ$Ôï­JÄ›'¯ë¡¦¯Cy2äÀªŸå‚¡ŠÆZd1”ûÎçÐ"ÁØSX}j3r>“¢0¥\Ò;QõԾɇ¥-§ ¶ŠX©Ýo‹ LëèR×R$A[sã¦ø—òÂ`®/lÜ#ùhŸÁœŽq½Ä 'õzkü™]sÑ ÜÞ¬(Q¹Íþ©iv`cöù¸-Óz X_ÑZzVm÷ïȆ·ÐQfúq¯<–^È¥Òî\èƒçB©.ô lräê‰åÓÊgj´øod‘ƒ|¤ˆ¡Ð \yh´v‚öµ:ãY_¶”œJË”(Øž#¼&bd·‡¥”<Xd”¾×!}ÔÃúŒT†‰ÀR‘‡òÕ­¥×Ý“ÐÄJxÝ­&Æõ…/¾uQ~4NŸ­]º›?•‹=gæ8ã +ßçœ;…!à<
+>î]&“ŸYdŠÃ/"Á&ZïY±Åº,nGÔ®Gz§õk+ñ¥\£>k•á„žjß6Ù6–Ô8tµÄO§&¢„œ´bú‰|uTè@ ê^[Û5œ¼N<vñ•we·!XŽù²) uê^½´É¤²ªµ42Ý´Œç€Ù¡Yú ó—Y Jë Ø ûŽgL¨KqHÍ(~ŸÌAMª_¼lkµz/(«·ä´X)‰F_6JxF¿K·Ê­ôñÚѦï{-wM"TШ`¼~Ÿ“¬ªvFüÔAŠª<Zô”ׂªìk<Lתø˜(cK©ž³€bSVlä"{å]Ùó€ZïDFý…ÜÐå½™¸<‚ïïï³{
+„,Î8½Õ­Mþk¤«Á5­ ÜªUô æ^NÁ&ºg#w²X4YeWn1•#~™¼qâõh¯jP¨Åö¤TpëÏè¾ö\]–öö<…¸GxVÿ”K<$L
+ÔUñ@•5Þ"
+¶¾¨1&µwÉù\ì9UÛ39TQ÷亹í\ ¡Ã=̈º; GLâ§6ÿãì˜Ì¡"¾Ž•w…B|(iïˆ'Å'º¬ú[7ô ¹r+£²*iÌÆÄ;¹E}—ûOþÊF\]¦l{YåF=AD
+»÷ ¦!ô ãÔ'§»ÞÄû✨œ¹Zzñ
+‡™r@ŸZo_ß±¼AÚ
+êú<V{VIÚÝLná_ïÞ‡¾’õ™”÷Õ.
+óBÂ:2s²uá§(•ÈaŽÌ9:¯Ü·2tƒ³DKÖ<ôG¡Âç龡31•ÝÊt#íg\
+.˜íu6îi²ÙJŽÈoµïxöZ×× _s ZËòh°V5¼}r¯ÙÑþ3DXÿ8Ëé6æQàÊ)’v÷ØÜkxÞÝé÷)Jæ¿ßd%ÌAm=ÇÂ(#Õ KY8ý_
+u1`ÑΑI¬ÎP¨@àÜžÇ?M}®‰# ¯‘½Ð‘˜W–íg wÃ!hºÊ¢ßµÝf‚]\@˜¶Lyìodªš¹øw‡“>B«Õ·¼Ë¿/K€µUræÈŸ¾UI±íº«à
+g…ß·.:ÿaâ5’Ö‹AZiD+¦ßuFƉ }¶û½é2™¸ (ùp~·ª³x¢ :’3 ¶¾/e…)ÁÌ
+¼äÇRi¯z>ïuÙ1VÏм ÿ¬&‘ 3ŸL.~Y
+_²©Ð‹âOàvH"r§¦$ µé
+º'7$c²ÐˆÐ!•ÎݧC½¬ç$Ê?bï¨þìl"OâŽK±¾'˜w
+bx—‰Üêüj¹£O@ÿÙ,s[»6ýªícávÑY¹hd_æ“,VŒ œb¨
+‰ð#"^ÆÃg¶µ¸!ÿÉ#i/“ªñd—ÁÐRD4ìŒ-%…·#àrþvf"I(&!QƒÑCG¨swEe`Ff÷Ëڌ札RC†×Ëîï+ZsÃãØHz–Xf--¦¼…”N)±;±shs{£•aVXAת]¾b9ï"Áúpœä•Ôm90$j®„ÎxLYxCÀ8ÏB¿Ãí¼ìùìéÒeEá…i˜U ê#‘ÕA¤’¯ÍŒ’a
+«Ç­´©¾T#$5? éŸè¯¡³präZè<§ ÑM{å«¡x¦¯¡É! ‚)±6¿Up‚Ó¼ÌÑÜŒ0+ü9r×óÕ>ÞYãÃô d3–Ò_`gbת}û
+rÂWf¯(¾ Ê.T³ûœ$rG~‡ÌR)G…-ú²O2£l?ÂBüX CÇäd"iXćÎà÷ÈÏ:ŽçEN
+} ö&Õ>­o´×ã®æ¬Ñ@z-Ã=é÷îÛƒîø»^]bÄËŠ¬N -IýJ€°ÀjDM;©ËœU×ô™Ã|ÁÊȳ5Ã
+¶!yJ6Ü#½ºø5ÒÇ-u ´–Otÿ‹Ê‡ßk§]Ã3¤¬„0¥`áÊ“êí~©/^Cë÷•µp­Éü7scË Oó‹¿£hˆ-Þ€îi î¸[jÄ'Õƒ´§!¶—7žÝÔY¿EΜީÊËi`µêm£¢>TÓñ1Z`NŸ‡ ¤'ü±i“’Jbÿ€‰9XêÊÚ—µp,½ÓW¥ÂÔr×!KšÂÎèü`‡ž„Õà@l®/­Øúæ.z”ÈÙä+ö<7›ƒ\i0zlý£b©UÐ{S›|€h•Yƒ‘æ>…mL0 ‹¾¾„,qÊdnï#çK{êºýÂI_r(®¬µ׉Òõv/ˆÏñó÷†ÙÈBDßÑÑ#…iâ·d‡W¸ˆ½÷šЛ­ðƒ‹_
+ä¶Ôñ{uÚ¸M¯ýœîdßË
+‹¬)Ì Ÿž6Ö=jÆdÝ;í¡Ô¶„µ¼n*_>;y<"¸ü,߸藵’ðð’d ËD¨Q TÇëÌÙêÏÜÍåïØ`.ø|Mõ­ºí$õ´ÃÉ*šö7 ´¢Z•—C^“úkVa=žBž«ÃUõu‹VQVQJÕÞL§Q¶Å¡ïºÜöÞÖøMØ¥b]«®[¿o:}ºûg<$ÈVX„~\î@uOG®1uçæM ‰0). UòòÉÈhW' Vws˜‡×ˆ¢ƒ•\
+=;3؇ZÑm{§fÇu1{©‚q®‹é%Ñ)(Û+Ë*jóºpd±NáNK¶›áóú E‹´Ø*ë_ªŒ®NvL¢Q°-ëlr±ô¦‡³ý4Ý!aA…ÚxYGmfBv_C…³ØÞbšÅ³”ÖšÐÐ
+¢œñ £‘I½…
+M©:l/ ?Xå›èSîvåžÉ›åÎÁñiM„ED“¬Êòòn[»yÙ §” •Ýõ§âCå5úú©:‰È•5
+.¨CAV²­¶šH't¨_ömjAžï•Úqm«B
+fÖ˜>içtd9,kQÏŽùpMî8Åx¢Ew=sõóŒ«ÓjÀ˜#ˆÛ•¾€áꌳE–o!)»)öÒoõoÊQQ<RñðzËå3¢XõYf^åvò´­¡b†à*õÖo4kyO‰Š§7É_#¢wm›Ÿ IJªì'þq .½aø°+rã³—2!š™ø`%<Rˆ‚ÖWˆÓö³&¬ ç)UvCÜ)s6(âÃÂ[ž•«
+%Íë6©]’´a®Kó5”t>ù,bR¬÷„Sö«NÁ\S_+Ç‚øÚ¾‡Üzh(èˆÃA¦ó_Ûð¡v/Û¤¼øAÇJ
+½dcb4Çåøñ¾
+™1ü˜|Þ_"UZ¤l€¹y%N
+ENc­wî ¬ O-¾”+ÉagÙ€ÆAÇ>Ú/ŽÏ×Ë_‹¨i*ˆ{ºº„˼WÐPºb껾ÏÈXÌP@d˜‹ïU%¥:©a:ƒÚ’¥Þ³4IDÁ­•ß%_…=!ȘÎa\*ß¼¼ê<»áae)£éŒð"0£míÉ­¦€ |°Uá„6ÁâPx0-öQ“ŠCÜ4Œdx^Ždh:)³]4Û',P Åoè­noƒ=ë줾mz{ôÆøÃi?ê—á4ô!ö åðA5±÷ÙîÏçì} %Õ EJž;l¶¸Ûü
+³]AQ°ë±€2 ½'T/]y{ˆs”és†îæëqÀÇ$Ië¾í(Ò̯³’”šeÞ¼é4nGGq·¸Ä0uZí‰b óÑ£€‡« ²``ƒ¿ísœ l·ÎF)peÍÑôpÅzFÝO•Œ~3SºË?¨àÉ>î#À€B8 p’Ù)À`¤cLå?Æë'DÒk±G*7,}LðüDÉSXV¿;Â)‡É*{õ\Úz5pÇ-Jêè Íî»KDO²‘×oyAƒ5ȃèòö6w  Q¼RxÜ^ÏGçÊÕÛ·Ì9Ö=øÕ!ކ˶±€ü©¦âù)X“`I:qSŒÄ¸Œ)>]K!@ÌYqQ Á‰¸âÇQÔUw¹jKNFÀ-§W<¬
+<òÚU¡~^d‰ñÓÉ°´eÖòóh –PB­åÃ=¿ò‹BDêôðÉ\Ÿ³Öy LJq ¼X*`Ú6wY=Ò*PØC2À×ç»á0ñÓ
+òDG^d£~‚ÈâÌ
+øZŠ.V«‡§G¯Kb)¤ž†¤Œ,]1ccQ­ÎO2œ…á´ÒåÇh‚ TÓ÷ã φ»™¼u‹gÂö<†¤|d±‚Z5Úd¥ÇøG?fIiÿÑPU=Ý <G þ`GCp”vö©.W¯Ò*³À}%)ÒÓ/“çÀy:P‚N§ÓX&O2ÌœÂ6ç
+êh»c±ƒI%+¸3“-_†éqí¢BfÑ?X¢=¦ú<=U¶ 8hÎA/*Ï ÌI¥ÍÝHÑÐ[ælÄ•éînx™60ª_{tžõš“KFÏ)`¶Ïß*‚Ó±¹‹ë.V˜o—“ñ,C±±7'Š´Œã"œKýóG:ÃJ‹¶;êF'þ-­Ö×RñI±+Æ·êûVÍb|‰(Ñþ£`wœa+ŽâX|G°Â’ûUölG_ÝQÕu—OÖŸ‡Óƒy@’”÷TÀ±Ù´ ÈÙ³[•ãqPæW“ÌðÉ[çñ–GMÎÊf„V½Õ¶¬ûÔ&`¥?£˜CÍnÜÖW}˜L=»FO+fÕZsÈUÉ
+qÎèÁ(/3ìã[¯ÏõC‚Sçü°b¤
+BšKä;*t»Tåà™Ÿ1gô5_§jè’®H¤²Ī<‘&
+:þÙiÓ„ZtM/e*iùüYüxçmMßÝÎú +D×Åo{ TˆdÚ[»o쨔̬u‚i9¡n~p
+GÈfêìð.†t DRmfÀ&Qý3áv•}Ó¾}À÷òóK…²×™V)*­¹Eµ é£ûÏ=è㨡‚€¶h®`ÚS΀Wvm›bÏŽù2‘¨È—œR?\«®Ï–äTgš®ˆ$gÞr=¯;˜QW碂»Øí¡.ØöÅßÈŸë}‡îy—>Ì­}¢à“RIêM¼•e½¨pl,¤3*ÄT·þÑ)0v’ôz‹ïü1Š4jH¤†¼a\P™ï&?§’©7¨—
+Þ=á”7?îÖ ñËu.›ÄZ=•“ز‹,-~ ‡JÐÚôr&ëm û\Zæâo®ð¼‹I^†ÀÐùío¤Ll‡ ¥TeæN"‘ˆc{Oп ›Xñjÿd'ÚŽ“La.Ï4ag•¦¬5ÎÁ
+^|eV
+ ó8BгMðöŽ5·krÌ¡¦É‰†Î*óî˜E”
+}Åó–CglxkSÅšg;×rÑ?ÇÈ8Œ‡„¤•Ö}Y©¼tíƒÓÚ",É«2EÅV€|ÈÑcþ–í‰øȨՈ
+›¾Ë×±BnWMèõ¦Í;öy‹{?%Zp¶þï,OOÑ^:5šçð0Ä+¤‚¹§jÀøÿ™BX?„ÔÙðµÇ¸ˆ ÐUä·¿Dü.
+é+ý®ÞfDäƒ[䉰eתG×»–m»Ñ€Žve¸‡×o òƒUËG#Þ¯3¥HÐçW²Ðh´XÖ….ÍÎ-€¿BÕ 2µA ¨“¤ý­"¼¯;Ùò mf"8vzP¤ìúH¾Iø6[‘#aЙ…gªÃ&F ']-+ †Z7üRûVë^ ‰j˜©KZNÊýA?6~ç¨Û욃áqÍgŽWÊüzǃ½+àIcauÑ“‡Úþ`öŠ„˜¡‡€ A(¡8ÅiÊP H°:)âŽvÕu‡5›„­™±Àíc¶«kèÑXËa¸Žæ5Ç” sõü3øE +¢2WÑÅÈ­°•òÍ,äÃZ&ÓRÖïªr@”ä4¼ 8è ‹EìÀ°?a*²oѾtü§ ÐäxÖØ<ØDÞÛ<Ž6“K)¤½wíåIXìtcíZÁGPŽDÎú'…H¼hë ›ý÷I~žŽ©e¿6ßpÝLàAü:IØ°³ƒŒRoÞasmÐxÅ»ÖÈõJg½V Ê!n—ú1̃*<¦UY!=<É8õ—LòÝK2_TÑéÓ1Å kžsÕ
+OÁúFbáË^€ á–ßô¶Ø<ˆ’*¦®ôÚÚ[ªO@/iMô—±™µÈÕò ¶¹j‡ƒ9GMzOUõ~<m€ÄÊ“ÅÚŸF—ë*ú·¿…¶ˆç%cíЬòré!’½œÎ-'š!ÈJ¥¾±MFÿÕ“úå: ¦©at4g$©\-ið1¤r§å}êëŠëC¡ˆ
+.“Ÿ²l8mdÇÄ×ÕB„¾É•‰ ¿eI¹Q!b'ìž´ô§W)±„LŽå•ºgÏ‘„™°w‘£ :
+3¡= ϧ‘¥QTŠú¾šèÍzÅ„(¿¡gÎ"ßl®3‡ ”‡îoÞƒ+Z¦oáöà4Ę=tÉK-Æ4ä|~üaPX/D&_õÅ;*¡ÿªð!„ i,ö,–xou*Œ…Â0c*SäH˜èµù¼ŒÜ’µÙ:üØr9Њ6p(ŒˆÿÔLGEË?9Ø6E¦ø Cø6ÜìzU ‰ÉJo½TÓ xõ3ÇÂæ´Yæ ¹ZK®ºµdy—ªÀWÄ ÷—Jbæ°W‡Õ$“¤)!`'<ü¡a¾ó=¤#Û·jõ嘕Wqo˜ý–)_¬HÅ3ÔAIW²~{ŽÑÇî/‹&Ëß]wÞÎZƒòO°^åûµÁHñë)¯­ÿ z¤ÙÖ¶5.7N`‹O:KõhìÙœ=ºû1¯å'ˆ¨d[àÀ®¦ží¡¥gío²wG³Í\û¢922 ñŸzK}·Øp$ÖÈ,b—›rd)^ÔYW† ×1š Ëœ¦6p-eÑù[n$„:J°¨&bSEa‡H—‚ÑW¾öqŽ11ÀcyÇK#m)!Æm±¾59õU$}À[çÓƒç¸×‚%÷‚~H®‹>¬¬ß5LzcxíEk“ˆ¹ú¼Ñs:A²óp6¹önÁ¥+²àP õÉA¡‚éÛôÄ”,,¨Íb6ôʘŽUÀ%"ðÔ”ç~qf?2ÎƉRW‹êKС:¯¼(Pò~£¿˜ e*²»ž¬hq»¯ù‘1'¡Û~PŸÓìªLqŒÙ*£0ìÔϺ Ÿ`tÞYïwý.Ã×›Ù/ˆ' xû:ï+#™:ãàiÝAÏDÛ
+ÛÁ@^“H·vîâó1ôצs²5?ns÷ü*<À´eºbME„NÇúDš`¡æWÃ@V©h£ÿÃ8´¡ ”v}‰¤ìcJVÐ}e!¥´ï »QV=´›|8Ñ»äëTË+E¾+,»0–¸µ'su\~Ñ
+ò$7c ¢öázh˜O¥ó 8Ýúæj¡Ã‹‘/%j±A³Àóë™c5$ Óür’ o|*…i(²^j”-°ó!"÷ñ,°ž'Ôqˆ¤âùŤCU#‰†y0-Hr\'¾Ñè5‡¤%O_JíS<^ÖácP°ZþZ5‚Ò¶m…ú[éîI’àÙ0ÃQùÎÇhpð§Ò•>þ‰­žuê]O‰´öd­ã)/P2‚©:Îçùþ– b ¶9G\ 
+,IŒ¿&˜^ý¾"Ï ¦¢Øqr,Íß®Ê>î&x콋Ád@ÜhìÒZtES·Úå«\¹ž@mú
+eî$Âjp¥dJºlw Äì³j
+Ü5Ç+Iö*|Îü®’UZ­p_%6opõÉ_IO7;”Cô@¢™”人D@2¡B'…õ,0™ânN-ÖkƒS[7p,sÍ >­ëÝ]àÚt¶Ÿ¾ÿòM5nڛē ìhT?]ÙÅ+e@Ch@JH$ êÏ&>2ýã°£­ YúDXQÕ¾ŠÈ‰Õ ŠÃÒâ¦Æ\x+¿`2eÉ µ^´ôB|iCEÊ·\=Ùü*7CRLžÜt›x,3¶J%A ~†Ó`®*w‡Zý.¨#WÈáˆêS‹“É*&ÖLL~'Ñ;¶M'&% ê"×[*moº¿ôH^ú‚ nM6)•U«¬¢WVg§Ä&x Kí{Ç¿]zÉ
+¹º˜X£fÜ<#}ôÞœl:\ ö%\á·Ñ–Ôõ<Eña›ýE>WYŠd÷ŒÂ[‹¡Þ äº\œÚ9IxúIÞpÌšäµBÔ:¶—³ìôxÅÚQn¸ÌÄ/„ÂœõÞwŠëÂ\Ó ùÐÈ/ç:køTqjNÅë“j…㜸\—³†g›d8¤¤ŽšÚ’ãLZ¾Ã¸]âì´¶Ï T&¬ï66ªÌ½*|¥0w« vî&‹®l5fÙšEÉÿô̹ñ$\wñ£O*9ÑÔ
+MpÂœ(i¹p—ÂMœ;Uk>$×,>c§ˆa&¼(öBŽ“,Ÿe£Ü
+ýG±ýN;ã8ñsø¨ï牑1 \°Q“âæZbgxÁqÚŸ¦)1â­Ûw!hK{…Ñh­¯\¾ò–§¢,ˆOÀ°h|ÎÞØéjn‰‘£#ÍúÅ4|ÑÓ²qÔÑÁ¹õ1³Gï¶&dðb<àËVOÇW­R‰<­¦*›¸!ôøP_1[,±Œv÷~Î Š¾rŠ€¹³¶fúÎÒ6Ð…i„ €ƒC#ÂuÃè÷Ê­¢‘i˜=ÒL\™¼æÕÙ¢'¯Æ’•Â835PòîL±ÇSÌÍQýí–Ór& €cÛ¶9±&¶mÛ¶mÛ¶&úbÛ¶mÛÉþï°w[ÛÐ7]§ê´sÐç eˆ%Ó29§b²øǦ+îäò3ÎøÅ/åÚ¬¿ÛŒS¾\æDéH¶ÎÇhyvÿ9ž^¹þS”s9õsꔜ\ÊP[ ãÇcƺîÄJ¡Cr‰ŠÂéå»N,à] 5ý…–
+ý¿'¾-ØGŸs¶Ö¶
+48§4î²Gá0>¾Wlx{O..ʼn6mD¸—ÚµQ¤]ä]Ž.†Ø0k–:3ê‘M}úf¸âH]*Ñ|ïâ |@…Òï‡H ™ÂÖ„ Æ;¾晜åâÈÑ¥¹Ìx0»°WäîÎ{Þ~
+ƒÐ ñ2×"ËOÿi"4§^¦"ˆËoå<ð­áÏ'¸ä[ÓÄõ* wX¼ê `؆ ÅuŒÕ×´$¦0o±ƒ¢ã ÿnlkÄ=³÷0ú@TÓ~"Ó,àçÜñOÞ\à}ü½ mxTÀÈ ²?+Ÿðwíxª¬ò“ÞcÄ1¨+EâyT;°O
+”¼´„Ì•4YHU†Ûî: À’´6c§ŸL<ôwÐvbif”” èAÆ1`Ï”yþ–b“àÂ…–WƒÌà.šžîý˜ìãObéFv©rüh€ÕÌ} §¾ FUStŽüõ¥¶£ŽÆÝAï¥i’h Õj=úè@ÂÅðÂÅþ°•¼Sá"ŸÎîÓb¸®"úáÀT°îJƒôúïë&n‹™Ë‚'ÊøOIµé„o„œrÃîä8й+óu¯é¬¦ÎuܬȔ
+ AˆÄÒŒS€w¢3"cöèF‘þH™ÿU¬þ›€ªb;6ý@>œãžÊß7)Sz'Ìä­Cs"Oõ«—$Ö‡Xž|ê#ϳ݀¸®3Éþ¸x0±Ý¾Æ@ÁJ&íæ×jJ¨µjÃ[ä-ÙL˜N`žFšxóMCÜÞ ›³R_Óf·âéÛßVç v¡>  $àdã<#OG1Û¢F7û™m@`ƒ“rº”®½C><ªˆF[·ŽI<.f$#Ðüõ‰F¼ úóÓZ—zð}‚4JÚ‡©‚­oI†yjø[xWûêJ¢rédªM.<T¬¬š–âà˜.LVÙÓÔ¸û‘P·ïëÂ1ÌfŸ@@¯1yO~CnÅŸædçn$»2âç
+J’8±ûüÙM’æ”[¼®Á'Á„SbS
+¸âÆ°ŸË_¯h jŸ*5Îþ¤.D#gÃQ‡wÏEœ l,›^BŠLg<$¼]àÂñõøzGÖÀùš>£ é¤+ÿÖÁHc4àÎ’» KA(‰ÔÎH$<!%È…ë5 ªÇ„÷ØÑ
+ü}«Ò@ÕAšêïÚX²aÒ
+˜=–ú™ˆ©hi$BnÛÕYoÊcFTNŸûìèÍ2õë”™Ûøà§{¢Ið§!U/M眼ԴŒÈRgªÛOCº2Èz –æÅ/ñŠvqü0kZÎ$‘T.R©fÇ­Ðêƒ
+MhÚÿ„¤BMsß{€ðÕí,UtËm YÅk¦X—|Žª…Ò/M½l=¸0Ó-R1ˆ¯
+f_iz,©”›6]% ¼5¦D–Së:I™›&ziŠ…D¦>ƆÑåϨÓ})mŒ=TmñyDÊö7©ÏîEx×$Ž¾—6êñUÙªû®'.•ÁÛ|uKuË 5y¢¼qžYàΈf'«|~ÁÅ Þ°Mœ6Qï¥ùTú‹­K¸«ÿ*èžø’ªq7
+ìÎ[ ¶ ÿøVfÄX#Û;Á7å‰
+SCsìtLÑp|† _VçuÞEª¡ôx7?Ž ëDäMvŽCÛp—àŒCˆ~xeÇè ñ„E ©Vš‡Ûé¥ÀÜpŒc1C xnÏÛppÔnÆÀŒ:ݨ¬}tS4ÎÕº´ÐûKÜ^ÅÝbh6˜,•áNfÊm×A˜ªŠ ·×鶠™‚mƒpÞÄÄ%å˜swÃÕö)
+5n V¨~vu²H§<mUv€[A„!‘#%2‹ä
+Lø9Ñ{ýœË å¦ÑMj]3þ
+ƒÄ(}®™˜/—BÅeUx
+Sêò Uµ°W¦+­¨SÒÇp§-ÿDjë3Ž sneé6O¾ÍlY¡¸;ãß¿Ç5ú˜Lý:àÑ0Š[5´q!‹:Ms<”ýñÊ’º?ú„
+›Ü«¨Ö5"sVÚGZò×gkïá.W
+ÈMBU7{:ãKIÐ
+ˆ—ˆw›&(8Ü“æ½Ì±ñ1ÑÔ^Ú¯Ãàrð£0ë[kf÷Õ*}¹ß@„Æäö}7YÃê¨Æz'·KeªÛ$Ó²bI EÙ#ßï{†,’æÕ~ExT.!Ì.ѸqGhý9p2À@Êp_Œ^Šòû»âÑ@Æëøæn ^ãÂÍ’ºñjQ‘ãj韹ԤíÌw/®xáúÄ3@ŽKÑå=µ…T¯à™ªFãõÏ'‹J.ô'¤w£1’ñú8ŠCå#ðóÔ†,éx‘ï6ÓÆ/Hi4’&ÕM~ÿh/ˆGðvâ2•øÃ:jp} ¤gIp;pƒRM1¸ÄÜo¡\
+rGþ@Lrêjhx%8ŸÚ>l«Ý^=é⪲ F+©d€†µ‰¼½¾B`o%冴ržÊ7.Õ…þÓ”.ÓÃOçkÀîöHÐ?šnü\ûÊ—–ò¦þIØcl6_å?2aZòEô‡C8žF~Ôè,KzŒoŒ‡JO*·ÒÄh^–R…{Q '!²·¤äõì‰
+ás(;Í9r£aC¶Ê`:ðY;ÛQ™!¾4Ê——rÌ|¸’¢Î_”àvî‰ÐRëX.üfvÜd¢9=‚Ð]·b>ùÆÿÌÎë'Ãè¢9"¶•†³¡Õ—lS-†ÜZAqªïÙØÕèúD žÓ”5Š•sAŽª¤{ žç?˜X{.ú:„bíò·ëÕÊÝEhâ.ÍúB_ƲÁæSË<hS†–èð¦‚ÅóX0áJ÷¤æoHÖ^'‹¹.W‚…¶‡{¶Éxl‹¶gœJ„fž²Díâ*ÔpÞõ‚Þ3¢3ÿ7v¸œ=¡kÖè6zø+òᶑþhóf …Y>vçô]þŸê7Xà…ÕÒ— Î  UÕD”7¥OªˆÆr#\¿»õe]©ôwÞ#Ê q°ŸuMÙþ›Šü$ÔÍÈͨ­ÎÜ°é´=•qð#çgþÕPäŒÏ´áÏûójb2Žû‡¤S°RY«Ã€…rSðûÁ2ïü‘lãïPi5v\?%•–ì|]‡?jßSšaõæ…à ·ŸâK‹âS7§xÐhît²­ííXÌ÷»øñ½QYM·õÉÛ*02÷—'(~@÷*cx.ag$Ì.6ÊÎ0~zGóÓþZ²¿o­xä²&ËN‰U]œPÄZ/ú~Q¶Îö\[Ö$ñãR[öé–’t—/)$¯h´<¤ŽcéýÃÄð±9>Z|É ˆÞ¨¬ghH€ñj~…îç °QÏšd"ÄÙdž>É×¥‚–ÉsJ¿öãô5BíìÀ½Ã¾DÑYÁß9TFÛiô…H¿=~!µ”_£ÿÕhz Ûé³RÇ=@QXÚ›$ùQŸ2laŽ(ðvºQ„ ]jŠÖ-`ëÇ8öJ•§ä.?N*êh âÚ2T
+êÙ©ï•×`±–¼ì«í‚ú{}Xíl\ER«êb{E,ìêlÁ¨ž¶`Ë eFõÌÔøÜ ¤ó¼ Ú˜Â_‹Ú}L݇yûCö=z´©Å¯ž.ÉÔQ;¨iœ„ 6J†b<YÔþKKv”x–•L@ªžZþä&$'
+ûÛÎ ´*5R]‹ŽÅ^ØÕB¹*ú[wD„¶ù×Wàaͳ®nNo<cÂQÝ~;ž™>j ‘ýÎn¤‘M©l"cÊ9Ѷ›|îÄó¯”ííU}]íbÐn ܮфôK¤‰þ䯸¡§ÚŠ±[ÂãÏ.åð¢X Øm‘yLpÅì•\’ho;¶ÓèïÙ±Zظ¿‘+ÿ¼÷£Ì®Î2é€_zñÌ·^ioůW'<ßf(àÂÏ›¡‹"Ç™·Åô%O™Îr(ÊQzΩDP±pH*u`ب#_çß!×Vê´P2âý/ˆ|ð ‹„oçš>“ÇCü±ð+5ëã(w8ëÉ,4ë1Ù|†U_5Y}6bïü§a…«JhÛà’;îdÁq¤Ÿr(ÂkVU˜U”UH3~Ì cs_lŽ+ä¨<L¦Oy§ÞŸZ6Œ"ès~fûQ6ƒ›™J÷WãIø²ó`ø9„Q3¼j9p¬ð<еó¥ËbÖm–à%»Ã p¸«C’ø|' yܹ·ñyYð'µ
+»°fp¾bDºi7n©•7¶·tišy‚‹Å„ïÕ­i-šyç<á‹™ãžG”2š$M…8†]æœxÝ™+ì—ƒIÂ48
+PÔ3)lmŒ;œ¸—ü“5|—î”+ÀTÅv‰¼Ô_òF^›b QãLT?yÇ¥ðb²èewïA© !ÅdYò]mÝ ÏÈÍ[ŸC9Év%?Ó8|
+\°l{ˆ<­û$\Û5•/—»ì…ñVT~B
+‡)Í1p’}l‹ÈÙ¤û¨¯šð1ônQ“Öü:”ƒ‘96êì(…+õƒ<“4Ã7Q|ÿF1°²¨üñ#\õl1ï,äÝ?7Âeì7®Œ½nØ<É„3ÄÓ›rhNBRòÂÑC
+^[ÜÀ!ÄŠxMcOÝ—ÙPFt>l¿‹JF¢‡ßÂöð1’£†°åïxDÑv hÇÚ
+¥åã—r¢fY—òU·zifÁUÆz*JfU¤ËÞ ½ ýä|ÿ:Ð(Pk<’¥WÝìo*Á]ö…gP³Šþ,ÚFjî¶%™;ɘ¹á9L9.DœÇǦÝ@sOµhòÚ³BãtÑsÒ~ˆ®›×)-ÉA
+ÇГöÞVMýͲ:“®³m›ÓWBÖþü/ùÁÿ ±©¡“‹½­¡“5Ìÿ
+endobj
+953 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 216
-/Widths 2156 0 R
-/BaseFont /GEHCPQ+URWPalladioL-Roma
-/FontDescriptor 735 0 R
+/Widths 2721 0 R
+/BaseFont /NGRKNU+URWPalladioL-Roma
+/FontDescriptor 951 0 R
>> endobj
-735 0 obj <<
+951 0 obj <<
/Ascent 715
/CapHeight 680
/Descent -282
-/FontName /GEHCPQ+URWPalladioL-Roma
+/FontName /NGRKNU+URWPalladioL-Roma
/ItalicAngle 0
/StemV 84
/XHeight 469
/FontBBox [-166 -283 1021 943]
/Flags 4
-/CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblright/endash/emdash/Oslash)
-/FontFile 736 0 R
+/CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblleft/quotedblright/endash/emdash/Oslash)
+/FontFile 952 0 R
>> endobj
-2156 0 obj
-[605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ]
+2721 0 obj
+[605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 500 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ]
endobj
-713 0 obj <<
+929 0 obj <<
/Length1 1614
-/Length2 24766
+/Length2 24903
/Length3 532
-/Length 25647
-/Filter /FlateDecode
->>
-stream
-xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:95uEYªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS
-Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»š
-ÿ\%ý}þ54>:2Ü{Ú„M•IÊå
-KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó<M`IÍÍÍLÕ‘˜‡‰ŠŒDa_gÁ¡Ãœá½]é–§ 9ç8sêÓšÆô e¬bô:miØ*N±«z|+hytHOÛV77Ùa‰
-×Nä&ýâ3­çï²E@\æYzm¾~D9šru] ƒR¢á×0u+»Y}Îî+\·¤èƒ˜`Ixï|P>½«D¡;MMM¬:NNIˆ0þŒÞû+âÝzzÜðà\
-Š—€’»qt‰ÿß)âxô0EBå)¦d4Ôà,Y=2€Ä„ÖÈ=ðK86iÓ·½µS(ç óQôx;”ˆwMÒÝ\]°Ň„ŒŒÄŽ¸¼'Ž‚ŒHè¬|Ûd@I¹²‘E —çê‰xERµÆ[ºª–ØÞ÷6µt×Ûô”Uâ£ÀíÇÏcí—‡²áŠù¥t/ëE½N r…5õƒ‡À}[ÖvÞbO¿öxî3–^üX³~ݱÚtX”·úbÛ»Ze¦B}Dþ¡¥±{dyÉÞâþÝbæZR4ŠR`s§Ú1w p˜aºÃVÒ}ŽÔŠ'X7zÉ(S†Å£À¥AKÝÁÆçr&ì椫û\šì‘F­ÆLu×c¶X‡YÈnT<)—l%WªzÈ
-Ì0Lo”2´“4c×±¢»ò“÷é·%¶œìÔr÷«rOxRæ@oÑ[#OóÐY„ý‹UՈʼn%?¼H»@yÖÞãLùbùÛq÷›c}DNCýŸoì sÑr?áƒÔÝÛóŠJx>æ?¤å‘]ò;ÔHbÓ‘¾tTï¨)Âm"È|Ó\¹¢óCÁ†e`ç'(Ël-zÝÇ.æf ì„©ƒ5 /Â/‘˜ÅÓSþÃEÞW;mdu‘ýêØ®=)À6li»ÙæüÖEÍX»Æn–ç]6
-Ȇ§yð»Ô™6üÏ2Röv•ŽQvvåôTÂ*¦(?ç)m¶5”OVÀ#8”¦Ú•4áîPñ"!Ýa¶é]\yc™··sãAZPU6gbß+:*(¥Þ'V­PÜ…¥Û)+#®¦.ráýô[yÞ]²ÅÕ¦<×µAÅÊ|…ø Ý&Û¦ÖŒß,`ÄÆ
-\w­wñ0‹²R§ËJ†H®oQSÓâ(b½,íµ‚9¹/#Ýýo ¹|Êq3d›p+¯º>2£~ìîšzµ´[=1#„ãW*Ža†Æ4õ
-|\4YÍùô\VŽAò¡iÙœÐV
-'Œ†Ý¥ýrˆøœ]E ‚ˆó(‚ƒ+c[€Éj‹®¦Qíä¼_Þâgˆí44U÷“É;2–×LC
-JOÉÒ4WÑœž:óû\™Ñ™ïÞ! ×yÖ\3Ûø=«/Τ€çÞ¸ ¯æŸ/8ˆÇîc+Š GI1(yBª5ŠÝ
-ˆÐ÷™êq¥@ûÏ|åRøíçÒ¨Zqé1#.²[Â^%â”(:^ŒD”ÚPØ•/ð
-ÐJºN$†¦ædœÆak¯n¡mk5¼{n
-©.׬nà'' 2‘î3ˆ2?g‚Ó<ûeZ‘™a÷­6™'zOÁt­:ñÕBzÚFÑ£AjÅ6©²}Ôq”‹ðü¬fŠ™ðaNõRäm€É€e‰aS—š=ø„PD‹ Å©?Κ-Év“Ü*.ºå„í_óÄpçÂ’EJ-Mn’†´#Îó¿?JýjÌàUàTƒ*
- dªÑ‹ï­M1–7°¤*’±¹+DÞÄZ·íøjâ?å
-”;çÙßëÀÓùÙ—8Ç!‚Kùz.Áøò¯Xñ€¯ÈHêKŠ\M(€Á½µBO8 çXE_æsÃYZ·èp6aaLÞ5f(wS;áKéªOÙÓzôx
-Õ§µ÷YÍÛž—™®Î燸-f: sôqó957ì>\Ç´¶ ¬C½}8$;DPì…eªì¢V¼'­ØíÄ<È“½Ü¾NO(߈]øé¦ÛÅr_[Þ*ʇ¡ÆËÆ<Òx ç˜î®l
-Ä’£×¬÷°zJmp¤0ZgôìuáÜí™ô!F…ªä Œb“Ð.ƒ ‰¢9wØhQÝ+âGùTjx­~wtñ».^jËð‘g&rÖ̹V§#KÚý®Œ¿çqÑHºö”Å~àlsLÓfH9áNjn£W4`oÑ£:»Øš^ÀÅK¥ŽÒúƒòL9ôlÊ0Û‰B˜ÚÔ#k|yË¢\Ÿ=*XˆÕ<d0 ¢‰úJkáÜ«mµuˆ„‘¯H`Ž6彋EÖùñïùBÅ«/hüî#Ô^†§ö¬i(]‘×Z]°&ÈC˜ìö¶ãíöù{Ùj+à€Ú‘ZQ[){¤iZ_Âì“à=Fº(s!:T KØ;XžZÆ#›DÂ,vÌ4ÐüQD~ô¡²ôå *×BêbŠµÊ´è˜:³pu þ§þ9rK28]±„»]Êö]– ÌiŽ rÆf§>Ä óRi× à¦H~&¸·—ϲSz…€ÕhßÝ0Ö/äH—Ì-Z‘m®Ûû <€úQ³Õ0zÒבß8r¨tIÏ'Õ`™@*ØÆ®@fÃ&€IѪ¥v%QÏ:®Á:.s&ŸëF­¤ƒQüʸúW ›_!Ò0sI"A4ªØ¼D×Ä÷¨C!n†Ñðú;+‘Öº{ýŠ÷ÊdÒ”üÝz/176ßÆÊê0l®«ßCヤb£s0 N­÷ä?‰ X! ¦œ´Î`ÿ¾‰$ý:Š¾]‘µß«kw#+‡üåj$P®¶½¬6>žæØñ^70•öKú€ø$ˆ]ïï­óÝo¸@g\³°G
-9ÅùbW<-—Ô9âEjRœáÖÚîö©ÝRËâG^ì sJ¬¾bíÇAÂxÙýeØ­ÒæÊ>•¸jÀ ,WÐs
-ñÝ‹¼I2ˆô|ß{1¦[y#²š‹9ö_ÀSƒæŸ’™fyf+(ý
-K#Îø/÷2ž;¼£§Zç$Êò^Mú½0)íN(ïó‘µ<‘Š6lþ;9ÅуŸ)Ðæ¦óF}»ºÐ=À¸¶V Û˜Å/éGŽIÌYW¯µ=·ŒìŶÑ;˜vìbs¯+YÈý/âwåáNV­&Þ÷¥0óŸ7¯Â$6/ ÈÉa…Ø藺¢ z|£>†²ª
-«Mˆí&/·}Î I Ø%΄%0W¦É·¤¬´{âI\5d§1ÖÙA)£7½¡TDƒÖcÆãM~ÉÛ0l4ÚÔÕÝ„ùäˆ÷)—h7¿d~aùruÖ[l¡F÷è\)ãƒ|<kz?D \]ò7ï2¤ÎÐdåÛTª³ WdDmI!÷Ï€S‚'#Q~ On )vE6ün¡Öi¢ Ó€(IIŠ?´ëôWÞbÚ¼%­ÂbAP­`6D
-–fçÚïC%ÇÎbl·Å$ûÄÒéæÅÇDÙdÿ
-Ÿýpô¯°0TO@,{i`·Î¶ÍÆ¢ãÚâ×Kܬ ¾yOàï–<ÀQ–
-ðÕ Ž£èÈp¬­°"M¸p‘)š!(´Æ[É⯻¹ÑòsŸûùWÅʨBP¨h Ù'“¨¿ ÞÞÀOԫøŠ½â{Ë eÊdëô¹Kx5QªÎ™6!â–­a˦½ë}2 ¨Ýˆð+0ö|3k³Ÿr™eÈ[A˜ýl\ÊŠ}óÃ\&Ñ[Ããóqt“´ú8ûy :µlõUñ®¥"„KЯ¬’Cpeªb•^¶¨¦oÀªs'ª¹þ¯cÙKñ]ùw+VuN|äáù s.…¸¦Ÿn ª4—&Ðøš{«î‹½±é
-uW–ÿðžZ—â9«ÞËÛråŠi~Û0¿<€G<æÀ›3¦?›(íPÒá“~šGÁqFëÝŽíƽHšJ+3"Ê«F…@™'›ñ‡îIŸŒ‰õ‰ZêÀ7Y
-gìзt@Š™+[Ñ3²/*;œ÷Q¿.ønÐDâ]ñê “R£Þ?*ã]£_×êCék~Á3A¬
-$1üf¡
-‰¾É%|¾Uůx¯¸;%ÒŠƒ}5]åD„¢J›œ)h#?yºâþ-^ø*#G„ Ú”¢‘üÀÄi;IÑÉ2çŽÌ/~é)Ñu 죯ã3noዯ78]P³]nÃ|¾g
-6ψ6o‘PBšP'̧AFæêdf?P0dGC×´rW›çB¼¼6&³SÊr¥Ü •¬SS‰ÓòñÞõT9Žú¼K)Œ\û)°bç¶Õ†3´$ZÞ#&†×ææjsmÂCf‰àS4XäHF Z”ÔzϘ(Pt
-|ÿÖc2›#á¦$'j‡ß|c›xß3ÃlÞ“”3Bm€Ü9ºš?¨
-LÈJ„5(µ
-S|ØHˆGð—Ã=>ôԑʇÞw1®V®Áç€R=äŽK‚uW—e“ 4¤µZ^ öçý†Ï#ÃÎDžâØmwp#ŸT-Œä{Mô§SqêßÑZ!¯È¥û;Åcï¤ág´SƒqÑq/V1aŶõrR€ñùòdfN51©é‹å=túúöp›˜Ùøfqû— áoœ
-#‘%‘Ï+0{—¹Vx³½û³IÏßç@ ›AÖå]d˜± ÜšfÓ 3.ˆ•Lçû^«ªwkFOpªÍm“é éâKL§.ã¬f0æµ2x‘$âGÈÛ~Í…†ÙgpèÙzœlŸTêŸß'Ah7‹#m¢(´â'Z %åÝa&˜P[&W)íýyÝaHÄrÇxg+Ešê»ÎÑû ^äŽ(úÖß `–ºr¶jºù7Yþsß›ûPDS"äÊ"pqšQ¦Mê´šsËÚ‰ÉöR'  )Ú0çöÌzlšºð•`^•¼ßÖ ——úq2‹ãqÙ•ÚüŒmÄàðr²ÉEh
-¤á¾}˜D'N+nš~¯Ðß0’ƒo™¬WOÜs:¡ðwaz;A³cJ©ÚäA çÖûÈ<’+UȯÉCvL¥ºøPô‚Û²sùô* ze-£Šü;2 «ù«#_š¤£s¾þ vêÄ‹úñe‡Î‡CØ“¨Ï>¼»,æñ’peàùhôm2’ÏÝ°MÍ[®¼¬Ý’‹÷ €"_o UÅôh£ ÖB57„ý^æÛT'kiWCEÏr§ó•
-©ØWÚ¿\N[Ž”ÀöŒÍ&nâáµ9vdµÍ¢–£¡!Šã5iAÅ@ñ/*w.¸Ã(:³›Åå×Î6îu1Ü3î᪾ûõW¤®48ð“ã‹KÓ^¥3Tòte:ëù`Ë"‰‹º‚p­,»iAX/†HÛ˜?äµÞ)RR«Y?êxjÒ/½)‚P8ñ“—»C>Är–BŒ!†¬gÝ@¯kîÚ“èNü½?DÆF¹U<þ5”I.:´s¾Ÿj-p“Ã䊰"ŸªcÂ#Œ:B +?/P— wég&åoï²û×!æ9œa pñ|Š®¥Þ²K5lïøŠÑ9„CF †ºž/õ¬;¿G@!íxc|ȹD¤.׎n^H$ßÄÛÂÓq]Èõ+É{¸i™’
-“*ÅûÖ€H-eëpg,eƒ|ÍaJtžŒ/dŒú*Λ¢ 6ºK2;”‹x'.QŸ[å ÌñÚ:ŸÄTß $$¯µ“Í¥¤·4UA
-~:Š0NÇŽŸÂy¨r“Ñ$85¿Aš«`!¨WÄF'*nNÁbt*Ú*¼ëëÂæ;ŠEôû”ÕaÇòõT~ÔÖ“S4Ÿò3<5×Ø\ÛJ´Æß&æ–“O=P©[¨P$“Óµãñ€ èiªš_`Ž.Šó{h/"•"v¥¯CŸ)-FßE¶ÛA<Ýï KF‡é9 ‚'ýøa¢4*$'=ÝèO áequGf0[éÒ´ò¢ïÑÞ7™Ë©4€ÐóØxâ%%Ì:¼ã/º.@ªã#)NˆÈÌaÀSt–k ’»´jˆ5b;¦¿J;÷Ò±C°7·ä°ƒÂKŒwA¹5S‚é%8.nN`ºê9_Žû¡ôÓ;Sæüê\g|¢Häae#§û×çÛu¦;¯ºÖÈÊXšŠäo+7×m4”°‹ª0Ýë#4åâ8hù‚˜RË9«»åì{°S©ã£›ªˆ¿z rª“ÊûýÎœ•VØÖi!z_)õ¸¨VS[i²sõq£Ë%®µe?åw«ìbØ-…97Á |Êš aü’Þ[
-4%Å5k£½02ƒÁw¿b¶8y<•«ápÁÒ*Á–Èp«¯,”&«‚rÃæG€Tëƒç¦£¤å¿”X{Š”ùH;_ÕZ ¼ë/i)ï1Èû£.5n仯ðå9 =)ÂéÌW%^}@|Ѧ{P`Áíea°,pS L§Ü”üÚ®Û7CÖÄbÀtÝzÏ3$rX§5Ø¢Pü–„˜jW~\\{ 7NìySE¼9 ]ºž½"„i5¿ÓúÅXôxBää\„“y”\á¼¼!‡k(MÂÖL]*/öðéžä§FJ{Y<Á&eš¯lõ‰Ïƒï…Ì‚+üŽŠ<Ù@9vOŽ’¤ä[RY·ZßUMZûp4–DagPcZ‚%V_©Þ\;=MåWÛ¾ÖG
-›¶ƒ¯ñ¦¯<¢—h¸E“;Ukê ñ
-J±&éù雈‹˜9›âÆæZue)äG $ LË#[|íÕϬ4ÈÝÕbO
-€£AÚ¤x8mw›þÖµÔ„±ßxèÍ#ºaýªU!˜ù´TßN.ÓÙÇ-É™Q‚«iy@ŒWc²8qá/øç ‹ïåqYw'`:ÓN·ˆ=
-*¥6©!bÆ¥$ž)ÈFå¨3Çx=H3/xR ÎWGzÊt¡Dc€Ê'ÒHD´öXM-®ÁöpáØîÐÌ’!#ŠÅø*ÒÕ Íè/<Ô¢8>§Ð†ó÷‰rŠeÀìåtѦ’ ¾Lñp m… U?ˆ+
-½ŽîÏ>¿ÇrøKKíùƒrÍAfjxy‘ ^W_ª^ø‘UŠäNGReÈ\®v/ÖVö†¶Rú׌hÉýy3˜Œßc¼b'óÑl«ð‘Ä›k,¢°§ƒ.ˆkx„Kªý( 9×^ÅÈ
-…d«…œ#£}þÂÀÑÜÂG( ÑhQ/Um+‹|“·^±OI$ѸÙ0ãÆVèþ )ÆJ3ÍLJ_ñ·ÿÑLÖ÷¥Ÿn­Þo”vÒJáØêqmìíçâ%Á­Ãcœ~ªzVÈ‘søqÕ g%ŽQÌ4³æ`£E–/T““?§púyÂå[uïлJ÷ödhºHÐÈÜlM
-Å s?Òr&Fd¿Ä6ë&>N´.Š ¦¾1:¹rP1ûØ——k¡f)ØdQmŸèÄI BÐä5Mþ¦1T¿`m[;­z!î_µ±=ñp)ä5^Išõ@ÑðÈ š¢žAò'tG<ÞÊÁæa¯šm-mn(Ø
-‰|¿"]ˆnŸ†GhS”C£ãžä.%^=‰Â žš| È%ÿÅ%Ÿ/†5¥ntnt I-¿ÊÍÈ.-ÚŠ
-˜4ƒ¿à†tæ-ws(›¢ü À.}!Ë•™ª^‘ 805D|~ØfÌWŸ½æ°›ã‰Å9ãqÀy[eN ù~TÒ€J…gD›¼à%HõŽN´W¤Vê Ü©&QXS²;^Æ#~o ÄSÙÄòQ¯¹Omº¿kÊ–»{.
-àé%.@”ØÀÄZPÑ}ú¥ÄÝØÇ<†,2xˆá+„P À:І¢€XH‚9É2¯!I‰¥“–mõ놀)ÓLvÒÀªÊŠ‘¤®­‰ŠI¾ž´ÀJ€-um~5SµÏ?¼‘ÞËxXkDZÎS§ꊿʥ'ÿâA“EÈz©Ltª=ø½¿ˆÀ¯’ëÊ›2{@?ï5ºûšõ¨N …&øºòȨŽ3HKãGš‹6hXle¡ïÿ–kMžÍMxßqhìàV…Ú¤ki1IƒË‹ë°ª¶ƒÊ9UFmwY¥YññW>èYM Ð7u
-Ç:êhפ­ߛ֙C9߇¬o“‚/¶z>‡”8Õ"¬pÔ"8f@xk©óí…f¸®söšË‚ý(†'ï »Úƒ½pLjt:1[ɘú‚ËHâûŠK¥Q¹ÞAH)†3W.‡å¬ÉüÖÀU7¹þ"ݨ²_mz$(®$åÔ^ÕìÊÆŸ‡EÄÆvPºÄ¤7/' ìl\du#vتç¾½ììÄ“QP‹qH{Ä$5ƒlíÛóyïd? 2$yá9MLºG%[!/J™Í2an¶ÁœÞOz~ØŠ9@5ꎥ;V7ÎF FsÕàd—ûãת?siÜ5$$éD_j(¯Ü‡ËOÒðBO¿šq€îôN»#.Æ/8ZëùkVŒè‚¹ép›ÆjÕGpéÎØzÇöÛI9´HÓ®"!ÕJˆá«OY¢Úîµ5¤=.J×ø2yØPK0úÍÙÃPI¼ ÌIñ$GÈ^˜ÆºÌ‚cý%úE˜òï„cijñ¼•9‹ž9Ñ’l{ˆ‰$ 0¢w¯¡&jjia>’4\¸ KDÃ{pÊŒ#?ÓA þ0›9 °ñ-D>"ª:c?ܺÚ~†‡^e55¸l
-:kb¾ÉLQÒcèâåSŠÛ€ …l±Ã{Y14¯ŸË#Y‘·IUHš6‰·'&:,q[ÞÀÑçºËÔg+ñA¼dÖ/LŒn”•ÿRÔ
-ˇ—ÕøêMCEýŒw·òÞPðÃ]ï-¼5L-§Ô²%\ðd*]®K¬qtmpMó¹{Â6Dm1Ð[2m¢ºûw*QÝd‹Q“÷\ÒBq¶˜™2<ôÜå `ve¹¿*9GiÐÍ
- .ÓÐ']ÒÀ^Od°â®D—üå„,?#ÞWÖ³bRªv×èSž¼˜Î§ÁØ$ôÊ`mñ 2D=ón“þ´ÁžD㔹=õk½IPïÅvƒJ<¨±ÏÞtݘÍZ´G U^W0äõ¬’”¤¡ÌšÙ=JéSQŠT#’åOµŸ>]žAß÷åʇȆ³Z!“Œ®Íïå>÷Ô‹fÜ.å¾Ó;ö§h gXUãÿ‚yXÛ%…6,˜Ä™T¸«úÊ*1²ö°Ò”"‚ï3Y¶m"ˆ†s¸µÌ· Rþ;ÕõµU§é±8fŠ•ì0A¾Ç¤‘oxZ¼ÒÀá¸+ÊNVkú÷#$ Ë£6\4Štó V·‘D^2'lRw‚ fÈ2Ñ[£Ø߇`Ÿk5Ñs kÜË·g¤Ãs© ÛÂÍÝÍŸ¬B?1 |k6*yf¡3ñÚP‘|Büu+ÁËNõ8XÄôÈä‘¡ù EUQÊFÿµð¥¸ËôiÔ2¼ð`Næ}ïT´?AËÒiÎâ ú[¼5¿«-ŠCLÓÇUY$ÐÀéëh¤®WNÉJB-þ¾ÜaìÚvvÚT¤‡dŽò[µ>Æ–ø|sÔrèCd `¦Ÿü^†ÕÁÊãDÃ*ã%­ã»òýÏŸ‚«ˆ›óñÚ àfX¡6øvçŽÒ]©Â—ñV¤M"BÝèù£=&w>8Kºä*¯+– ¡ oèKᣵ4æx( =¾$h%H
-£VâRÑ
-ï82Ö&)°"¶E;Ü´”ŤUYvƒÜìVZ9M*­µjQSJ­)‡Ÿï@LH§Ò5Èþ¥
-½~ÒoÍdW)(Ö€çÜÀæP»€Zø¦ÂP³¢½OU®æ’mèß´¨§raäÓw@„&7ìVÛÌyå\çøiÃH47+ù׉L
-µQu-W€»×4~Q.£ÎÐ)ÅÈLHQ-Û(èÖü¥> ø|kúÜ„X`Ž×¾®º] #.ëwx+«;.ñml3ÁѪ۰çµs
-:Ê(׸B®Ó'=êû’ýeÅ9,†`óÙ‡{ß%€ª ¢0<ý}õ¬YâÁ}‹
-ˆ¬BÙp:©Ñx”Mî§?ó}¢Ø×4¹„“ùïüGßßaWGÄð«à
-«1,u6AS£áx\|czíR¢€oÀbÐ.P³¦‹Ý=Öö+<µU ZäÍ&zÐÑÅReu–
-[5ÖðÆê_ka‘¢Þ÷£ø‘*q¥=¡R4Ð/@™jÂHµ0M’$Ùþz„
-˜É¦p8çˆC¡·š•òÏq0ÞSGD¼ÆSâT2J¹Ôi­¸É½°½äA iÎáDµ9)î“>oâÚàЂ,®DOͺ؀¢À¨&¯¬±ßŸ“ãùí„í½O Ä[¢:&ßQC—Ýåy˜1ŸÜ¨^Nò`ϯȌ)†¬!îÍÓ¤~»,˜7Õ$á/°Ûº¤zé5"™4¾bø–ˆÛM]üè»o~E®5p‰ñðJÌs¨{•moœäÜ%Ö¡A;›<Ñíô¦óñÜý¦¦@=®Ð@ZR¸ôGv Ö}¬ÇàƒO³þ›§—ÙA´|:÷©‡ž™Ï @pmðïÑçñ€R Àw<—a°Ý½7#øSBG8-(v> Û žq<]ùÞÚÖÁPdöÙò @JÞâõ•WÑ2|¥ —Ê„s’¨Ê‘i% Ìî3² °6“NP&0ž>>ÀI2åOø®¾Ój¬ŠÛ¯)ÒÀŠÜÚJ8¯Öß*fzU;.ÏZÜ$Úùd
-×D½í¤»a £ªâ*¶‰ÂÀÜÙš*û(Œõ¤qÁÃåäÌ°[¨.xÔŒHhý {§ú·–æýy澡:ÔuÓçg¦¨÷œ4k ÜÀ=ñïElD+Ž9Ó{û¤Î=£n„ÉÐE:xª»n½†í·ô
-é4NÈŠóv É.Õƒ_Þn$`¬ÓÖ)<ËEŠþê°õç@‘q6I„òÝäŽO¦ù¬R²Ôg-£d–‚îAúô>l¿ 3)VÐñ,ÿ²8Änd2€ø»Ì@צÍ*€]ÉãhsÀž”nä¦(ºÎõ§ÕŸW‘ÉÒî#ÐósD–&ôؤžm<[ã Xp.7ôâ(5%ö‘ì>B8‘'ÇÏÉÄ-ŽM%f+ùo0à8}¤{+Ãþ/®ò ¡‹pp… ‚óìô½ÙW¬ÒCF8fÎÞßòä6ŽÓ‘æBVÎÒP,-{DÞBЪðß“úé,¢îN`:¹ ¾ÔŒ/™t>¯‘¾ÀýÝ«9Ñ>á…‡]`5TæÑ’zûvyWX2FüºþbfO–f§>}al÷¨\ÔMê—´ìù¥ìâVPÇsp¥²oøâÇШ›x¨³N O_Ž»N=𣳧ND˜ÿ«ýzZ¯@(5Ic{Çv³cÛ¶mÛ¶m۶ƶm»Ñ™w8wóÍz€ÿ~eŸYçÞ*D+_—‚#ioÛçT¢{?Ø Ï|Xž!ÃS)Ëb×ß[ñ_ˆ
-ï%,3”1•äœJñÙwG¯üûñšøoeüªyDhéNÁÁϹݎÓRþ ~¯›GßB‚\ÌŽ™;؆r•R-ŸEGT±ùø°ãѶ÷Žz ‡¤/z”Þ‰…3 ¿µf!KÜt[¢áqQ‰(¤Õþˆg§þ¬EÒudV;~_€dr‡çI;17 a £ƒžq”„)b±¿²‡s(…0
-IfLt´&
-¸Õ‰]ª¼ÖÀ·ü´¨ˆúWÓž•N€ÓáÚ îËè ¥·I­Ñ—Øü:k b-F”ÛÈØyŒÔLúcÙY># S·ÿý¢žæãþx5
-ŽsU ? ë{x[òq=4£øŠÉTññbEK'òmç±v§9ˆçì‘È$“CXcþ©\“±>ÊG˜m@>¥¼lX1 ©ô¸dwO AþŠEÒÖ’±Sc¸I/cK+–5>¶V‘+"zg
-*»åMì•¡p_ÐV—+}¤ªÞTžY!æĹ(K§i"üÇ(*wOzŒF®¯’«X`Ž¡ÿ­Š¢É
-™*r[¶Â—n³î+ˆm•€Î êËÜun2qÄi"P6h£.ü·T”•OdÉ_ùüånµ~ ‡q#$i5’2ÍçšuÛOÖL[˱ÙE¶IkQñßå:¢_é²w«®º!É·Õ7ˬÞýóÌlÒλª> ^ØH•€ þfuĶgŽÍÆm4N}Ò
-žº²Üà9UwgÒBkÙãƒËÚž½Gr˜u)Ôë
-èòÔAé›ðöÖ_ß5Xuïwo%~’KG`4÷B9MXÄ—›Ý*¬â=cÉwú¦¶­r±¼§˜½ïÙ ÌèÀXmgsÌ{ná>³.ëÀS±¾ü¾ºÈÙ”¦ŠQ®Ÿ6È4ȤÍzÚ9Ú—¦Å÷K\ ìkCì«›!ê;àú¸èy¢Å
-
-"¿‘©ÜŒ˜%(–PL•„àà}çô—ìd¸A4HVs_™c‚Ò„µÜÅ‘nÜŠ¡Vz*-‰To­”â 7*úï #{y‚íl¤â:n\Æ>‡áos.ø¨ŠsýE×õ©É¡Ã<äm¶ E±¸@ˆx²îkrŸËÁ}G=1ôƒNl.&·´Mf‰2À4îۯ0ö€6Ñð G¥í¤B§R“Bt•¯º%õĪÜ~ç$`XÞ(ÿ¶ˆphíÒ[, ²·wÄ.„ˆØeæÒ$HÃù”±åá<€;]vÛàr Öù›–ÞpuU“J¯ÐœA£½<ÚÓ¤ïõV1r¿Â¥“e8Õè7Þ)h(²¼Eð¥GðЖ„ñ˜WÒMæ _Y£õ‡æÒËfcØŠ¡ÌõCÒ0—£Û²u—§§äùp3¦~ùÌ[yÔ5!Áy˜Ý Ð-¹9¨ÉŠ%Q-} /DšC¦—jn¦%>HLgùh:âî…¶Bldš½üuô݈°½‹IÖ#o½¿ùði9žìtå‰ò2¯̉ê³æÖ®Ê2VÂ^­.îÔ
-ëÿ8±²
-òo·Ä‰è8²{ãqÍED§G×æë±ÆöåÜbùÜß°”\&Ü‘ù­òÏ2qsÈÆ°Ûy¾>bò´ÌOX(oÁYÓ‹Þ"4Ù†w7 «~Lé'ƒ]‰v }Oä8ÝMª)Ž–X’EÀ,3bQ*ÞWAš 0 N5<_8%)FľJVßr”[‰=Wÿ:¯&,o/ÑQƒ+"%N†êémü‡*VtŸ_-’È°”´sPàkX‹'ÙÊ‘FâbMüzyixûŸGG1SÝ(&¦F›Å8'Ç
-mÁR!/¤ïmYz'Úò”¦ÀÀh'¨1I ÌѨõéI¹;b ’@\Öq×Ü[¤µ*ýôF£½™ÃØ»ÚRqõ¶›0ý×nD%ŒãßÉ€¦ ]:bĨvÿŽ“U®ïqî{Ĥ
-Èù#†ð÷†(£ÃÐw¾áR¼­ñ¿ø; h@À‘Ä8~©Lp©™¦¿RÒtª3ª5/0Ò¡S0±nÍ&9=Ó ÷-Áz;¢IrH©3©Òpdl²l[‹}B¿p“šÌN2ùòw Д˜…¥UhpO· 
-FÖ—bowÖç'<{†Ëe/>w¤ìºO Óyf4,%[n‹¦ó<ÑȲ’Dø¯7XQ`õì¹;ðkgýÑt{D¯VC|n$è_
-5±)Ä;À†íkPAs~6wD¦l¹Y²˜'À&>)Ž:•„ΊÙtAʘxñI…Å©Ñ’"Vï·´—Á}“Ôl—Üœ2Ê?«RÙª¦» Ñ2ø¡†LŠ¶Ð*¥ÕùÏ•Õz¢W¯íPO!Zñšâ:¡••3ìv{´3:9¨;8 ~†»Gcã–XÇ*ؾƔrõFÉ×<ͤŸ”WSs¤ù€ûñúóRXÙlN|PLò4ŠÒñ£l8¯´Àøî[ë†4 Àñɽ.zšcF­{ý†ÄT¢¸ˆŽ¾‘Ð[™()ä ‡¦f¾ÆF£ðÝ´Z"gº…´>Ôæ5âµlÏâ,¥÷y”¦Ä“1Êe]#¾{Gš!ÓK±¾„OÍ÷¢ü¤ïï!Œ^{ßðÉ‘F'U0BBo÷LÉ7„ob¨AÏqØ5ƒ£&ÜçîYd5K­ÜeíO%:Ó 6™zD-߹̫\šM0
-¯'l­Õ_‡2›.vèKâÔ€fïø¯âˆÚ\ŸÙÊ¡òËà.¶¸iAìU„‹Åss*’ñªÛ
-ó Ë.ºÞJy'k<¬¾T¨u®rï p¦±2Äéyš˜¾Á0^øÓí ›H v,¥wó!éùž1ÄVûr#Âp_JI´¿4ŽÎ¸6ú˘ì{2{ã• <[—)¾Íj°xÔo~y‘S¿mäó¼—¯ùh§NWp¡Q2¬ð‚‰>÷ËgCX ÀõVUé³½æ·ÝbM†Ðñù6 kh*†4¬† ·ÚTã’#­Ò<÷òwHÜ2ÈAœS¼WR¬v"«¡™Ô1í2•¢¨¡;ŽÞuE@L ±Âà‘Œ”ª^4þÕŒl«áÇü̺-€¾¨“\Z™Òçtä %p´§”î–©ÚËjKûr¦ä¦¥Æ¢[~ÕÇÆ
-eÁ½õiÐGÓ8¿ÙñCÊI´‚¥º]u¯˜Ôjù -JtáBÊk(WI)Í’ˆÇ ¨kFîÈJi…Õ FS„Éãâ…—¹l;£—¬(¯cgHÖ5§ýUj®¦›¤ÞNX*1a"˜…J[å?x¯5Mï@ 7‰íɳ't"Mrmc §Õnœ€rÍÖÔ<.ïo°öÝヲk¶åÎM¾×ÅŸ“p40¶Y¤ÉçŠÀ^s ëµ¬d>Rõ~YîZ_Ä둹v0§Gm‡‡N®3çï7G$*›½th•ëùý¹¡Òg)ˆ, &ƒM€¶ïÎ3«yÔ&o¹Ù›ïu–ž4«ô,öZÎOkÜ÷ªÔD%«†Déz¡v?ò‡/óÀ; Š'?§îºËcšý‹Üè
-µ(à\èaª
-E‰7jŨi¥oòƒŒ:½úþ·cêSJo*>»u+Æ#@Ä«áb\[k!s&D “‹Ãd`È<HØò†T¦EÚdò:±CíkE
-j!H·îà3ÁE.
- ø!{mž/ƒòZú+p%Œ«u–}Fcí¿ èýˆ/ì…Ƶ1>§ÌM)ÔÐ O%Sýù8½î×Ç
-dˆür4îŠ$#œ™/à·Ñw $–+3¸]Ì„5¼T87Å]ý—‰Ø¥–…ZPŽü¢ X¥Ì[šÿ8™XpÉþCi€ó`KpmMƒ*­y¨À&ÕÇ*é\—l¹ïˆü° xr#L?)¨ù¹kvü¯â|V{þ–aÀB$ÇÉÎàj`ñh›Îëæîõ­QUdj5Ë$k>7¦|©™¬âÃöõÚ¾¤,ˆÇSÎbÎ=¯ 6¢ŽIÛž‚2üúð?÷ò)CÎ|æ¡î0)ukt ùþîo#‘Æ$÷s‡³Wgª~„ŸÙñôÀԥ;ºaâlèQÌãæƒhË›ƒÌð`
-Z®§Ñœ8Îeä¾ÏFþ±Ã,ô\5ˆI.èÑaM 4Ž´mÇÕ‹èqWM‘±•î·egcØøí «\[þT
-¿Á…æËU¨—xÙLDÞsäÓš
-Iö×~pºóE¦f}^!˜tQ°Ù’‹ƒEäì>‰ n|'ÆV²5D9_äå‹7â̬FJvõ˜2È­ÛŒ’ý;Û£K¿>Z&ú‰Àš¤þØɉ,-¯,Yت–=–ÏÞáÆX8?¸#…m èÓð¥žçßèðž–u¤<5åÑwÒ6¨´ÍÔ™­×#0±q“²Qý‰±ÀåÙëã=¥—;1Â&<
-| f Ég¬,=‘¥vp‘·xMŒé‰_b¬5
-µœóû¿ µ§öÈ4¿À#è¸?§ß7LíXʳŒ”ñkÌ€Zî»vSLR‡û 4 ƒ?&4 =cwÓ™7mÿ­8 ‡L¡ž~šËmé0Rƒù]N9ÄO:;e0vÈ(©6‘÷ôŒ÷ÃæÓ=ÔèÖ‡7œŠ?­)Í'á ž àÇ38ƬpYBà³Â|ƾC¬D?ÖD‡§-QÊ(6ò˜¤>Œö)€*#£˜òDUdùªé³ÓvU
-[`÷QìÿY¨OÖØJæÒ2‹„a¤.‡yMÙB.½T›.¡
-¥í’bWWž^¿§M?¼ªßªéë;ëš<™áh ±Kñŵž¢¨ÚÆóV1îcÖOÏ "ž³x4tÅ:l¼t@i×uÅ«»‡‹Á0“öë]RϺM'Ü>Á™?#ÉABlž=fÌì…ïé ÚiózõÔ¨¿!…+°2Ô’Ýzôµ¥Îb—B
-y‘üP'càÜ^M#R°·ñÃ4 {LJ B«œ»×ën¾HïŸMc–9|þ*S5ïV®ñKãÁ“üvÚJ¦‰‡’à°áR‹ÁPKw©ä;ÉͳðåH-ºOÖ²ÉâØÉ*Wü—¼éýšö•p…+èó®a7AÔºº;˜âR·~4ÿÕ|S®‘mƒ®W•~ ©Ãâ‡}DL×WF5J‰åéØ|¨i÷>#\2®˜
-šÒ30D”€`Ÿ†§¾ç4}&1xÒ¤Ö¥ ÎdP•Ý‹$ȾCO‡Ù’jÛvëö?`C&W'aÔCJ•I'sŠFðìM˼k©¡¨»°+X ŠcAÐÀ«á¥£ùr!<s%!ÈbˆÀNÑ* d3³Ê6†Ø0´+3ïÍNYÀ8îj•ÛP³7Þ¨VäÎc=$0€Ž9€òõ «£…WCÒ¸1å Ô²9L±ž±~óŸ –äWÚyüInÐäöÀ'¼I3 ú]`+ò7vÃÝ!’ÔËö—k«Zœ–(&4¨j„¸`é+àpôxÿÅë«SüWâ$åM7ƒ[IZÒýš®ê~‚VƒÍ:Ø\é«…Œ€Øy_à£öý
-.ÈëÃ6‹û¯™ÅSßcŽ¾Q&É5 fd
-ön’“,6"”@K;\ÿŸÁüø¯
+/Length 25789
+/Filter /FlateDecode
+>>
+stream
+xÚ¬zcteß³mlÛN:¶“ŽmÛö‰mÛN:¶mÛ¶ŽÙq^ÿþWoÜ÷>½w?ì1öªª5kVÍZkœ3Æ&'VP¦4™Šìœé˜è¹‰T•Ô ml M,2tB
+Ѫ&ðëöÜ(ÞÃÇ‘œåRMyû©i¯MH>c¸¤bq›‹bgÜë㤸>· +Zµ‹¥{ü‹q=v¾ ­™«O¼—«Ñ)X!íÁ/$ä±)$§ÁØ^‘w?í¦‘ù]€§“X.2)§©Êer[¤ .©»¹™ ;þÄýI‰ŽBà A¦¸¯»àÐaÁôÞ®|û³ 5ï8sêÓ†
+"ŸÍëã-ö .TÞ;”Ïè*Yp§«© ‹ÕÀKÀk" !œÑE¾[OžKA3æTv7‰.ѧü™"Ç S"V™bIÆ@Ζӧ
+
+áê¡טÞO¿UæÝ¥šÑ<ÑmËs]T­+¤O˜¶1¸¶ðææ#¶V0BøkÅø‹‡ÙÔ•º]Ö²$ò}‹ZZ–$ëe1¯¥P¬É}éîjÀ(RŽ›¡ÛDZù4 P™ bw×4ªeÜêI™A ¿RñŒ24§iÒƒo•æ7…j,;Ù:Œq«úÑNèHåÊÓBuNí|ÚÌ
+6q!#z~`i# VEô yA ã
+5?Ä…J‰¡?‘–x°Š:p´xî@ŸË*£WƒõNQŠÃómƒË@bÙ‚ÄÛ6=_ïc¨Å¨üÐIûVs/D–)h=[¿°J›ÔðV]èB¨öK6J‰ôÍî=®µ5ðç"YAr1äc¶Ð ô¢.é1ÄéÀy²†_Õ-ÿ)¥º*™ïH €Ò°@¿¿ßå|Ç1SsüîóFXF¢ÙB¤þŽ0¶m粿R‚žPï[#@U4K£»åí8c¨tÜÙÇUmÌ ƒz‘HÌkËKÙœ¨ÈÏC—ÝœÏÈcí¤šö‹›ê
+Ú 1ËÔå
+Éqž— êhËÏFÇ=êO”ù+Š<cÁ·.üIƒF&Tfj%v}Hæ®»º/Þ‹:€…tq>ÆSþRL|žíl}„¨IVâMˆ³¹¬|övW£UEqݲ–^`)d_„¯×aå0áï'
+µãJc 0Οó•wê(á·ŸK£êÅ¥Ç<ÌDø¨n {AVÈSb˜1’Qêg aW¾ ¿á¨À+:Q˜šš“ñ‡m¼º…·mÔ îy©¤»\pºAŸœ,)üE»Ï Êüœ‰Nó í—éEgB†Ý·ÚdŸu5C
+<…:0µo$V éÅŽi•Ú¤ËöÑÇÑ.f ó³X©f‡¹5JQ·&– %CDÌ\jö˜B‘u/‚§~;kµ$&yU]ôʉۿæIÎE¤Š”[šÜ¤ŒèGœç³>JýjˆÌUÔ‚*
+ e«1‹ïmÍ°–7p¤+’qy+EßÄ[·ü5ñŸòÀ^îF „}fá•Iû~c”sÄŸ[&ž¼‚Ÿ?/žaÑvãEÎY\T{‚ëv<ŠtcûpÚ¥AgÒg ]`ÃʉJÛv§ltê- \5©1&딠丯¡¨Mٰ݈?T™ðï.™mëßýߘVý4ÄK/Ññ“ê4„ T²(óìï@
+ŠuüìKœã!¥}=—à|ÖÀ¬B®ÈJH‰^M(B ¼µÂN8`æXG_æó"XÙ´èr6á`MÞ5f¨tÓ:JëiLÙÓ{ôx
+קµ÷YÏÛP–™­Î›ä‡¸-f: ƒrõñò;57ì>\ǵ¶ ®Ã¼}8&;DPí…eªî¢W¼'­
+aèqÁr1t˜9f»+ (*‘³-ÃòèRö£½gè–ß~n)véâlOŠeøÝܨë?PÃ-L¿Ol‚€qäµê=¬ŸR©Ì…×9°­zGB¸w{&=GHÑa*ù£8uÊBâŸèÎ6ZÔöŠ¸ÇÑ>Õ‡žC«ß]ü®A‹—Ú!2|XIœµr®5è (’v¿+ãïùF\4“®=åpß¹ÛÓt8RÎÀàx“š›„ÇÕL9[ôiÎ.¶¦ð Ri£´c=S‚<›1ÍÆv¢§6õÈ™\Þ²©Ôÿª
+Æi2ÐÓB¥·åÒ îÕ±Þ:D!€ÊW"²À˜òÞÅ¡èüxÈ÷|¡á3 2y÷n/D #PÖ2’©Èk­.؇Hd†£Lv{ÛñöûüŠ½lµt@ïH­¨­”;áBÑ2«C¬aCõIð#_”½ª†'î,ÏG¯ û)—DÆ*~Ì2ÐüQDyô¡ºôå &ßBêf†³Ê²è˜:³ tu ñ»þ9rK*8]©„·]ÆîCŽÜiŽJÆf§Ô 0ëRi× ð¦h a&¤·—ϲSz… õhßÝ0ÎÔH—Ì-zÑmžÛû S úQóÕFòב,<yt†¤ç“jˆLU\WóaSà¤hµR$@IÔ³®kð†®ËÅœéçºq+¹¤å`”
+þƒÁUÂæWˆÌ#Ü\Ò€h®&ŸÉ5é=úPȆ›Q4¢ÁÎJG¤Þ^¿Ò½
+…Œµ@w‡þKLàí÷‰ŠÆŸ
+çÈz%ÿjv꡼½ŸY/fyŸ&ž<tj«öÒlò?ÖŸÑqÕMêÕA•Ž—ÅïƼQa¸á; d:…­Ö`‡-^uI&¯,ªÆ‘ÜÏÆ¢VÚ57Ç´Ú¬3W'¿/ ÊŒ£Œ¤Ðyû°n~œ?xÿ棄ïr6ßÛS+#ÆB£Ï=¯Ui ƒ¢‰w5ô,·
+Cà—qžàî´Ô›‘õÔÛ÷5ÇPÍrÃ#Ä^ÄïŒå—“¢¡“ôâm‡{£ÊÛìF^¿¬¥V
+ÖY¢ï㸂çõ(‚Ê7º¦šßaYY®ƒµ‘î¯
+Z[Ä…‘ÇÌ® g{S”v
+…€˜!0"ªó:¤¢¯“‘
+£{t¯TÁ>žµÁ½¢¯.šIw™Rçè²óm+5؆+2¢¶¤Qûg ©!“Q¨¿E&·„•º"²Zhu‚è (4¡JRE†âþ [,›·äbU8ì`Hj¬F(Á2"Lã<û}蔸ÙÌívØ_ƒ8Z¢Ý|„Àh›œ_á³bŽ¾–F Èe/í‚œ6¿ì~á0€l è'oÖßN‹¾'tKà©H øêÇQud8ÖVX“'K \¸ÈÍ€‘•Û¬d Ô‹ßÜhû¹ÏýýWÅάJT¨dÝ'›h° ÙÞ @Ò«û3pw+Ä÷–ÆŒÅÎés—øj¢:\ƒ;mBÔí—¦‡Î®÷É€’N#ÒÀØóÍìÍ~êe¶!oEγqi{ÎÍ ÙDoM¬ÏÇEðMFðêã_Ïã8°©ý«¯Jw-!<À~e•\B+SÝP3èŒ"ð= 5}Ö;QÍõË^ŠïÊ¿[qªsâ#Ï·ÈXs© Å!µüôÕdx´@Æ×<8[õ^ìMÌVhx²ýç@÷Ô»¤‘ÏÙõCYÝ–«<PµÈØ…„ùå=°Üœ±üÞ¤Bk‡‘ ŸôÓ:
+Ž3^ïîtl7éEÐR^™UY5.ÔÉ<ÙŒ?tLúdN¬OÔÖ
+Ô>Ä*â-æ6Ò}É›@CÌ=ÒžæPÛÏÓUmeX†0>¥Š;qA0hºxôÌ%šæ¡îËÀ÷·]³c^þå˜[¶Iî4÷,_#5é¡ñ;X“g+É1¨ê#=µmuþm^G˲K‹c¦éÆ3 =U_²Ÿ}{óÉɶ=éÜ~Ã*Ly¾•µ1hÌâÇ„'Šƒ{ŸôHrHOðŸûû“7„æ ¿Z6ÐL4Ó÷€»Qª4™Ö®ÍåY»s¿¥¤Ò'w²¸q;F¸5ûfå9$X†/ñ‘2—¹nl¡-'jU¦wíû E¿•¡¥\H[‰Úû¦ËÞSŒâ¼ @¹8>Üp¼îf©óXŠ+6§Ú ¡¥0”j9Ímp\`Y¥¢«§
+–0@JèÝõ5@9>ÐmçæsS£pð\OÏJðôEXŠ±É¬Uâ”Û͆B¨Ç—ùYʦ˜nà^`nn$ÛLÆ®¬ÂÇýã?µòÔ5™ŒQË™Jƒ­×C‰½Ñ=´³q™»môûrlîÆ"HµÕÿý·”TÑ Ð)§^nL¾”¦–ãiõ@¨­Î~†+ÆÂÆkinuyÄMò.-ÛŃ«×åÝ,>áa•¬
+…>èc‹ÿµï"¨ÈIÓè ÛÝÔÆ./>À"¸x»øÙ^ªç-RR¨¥ñR-Åå\-‡´¤DoÞå±($ú&—øôV°â½âî”Ä`(f þQ̤Ön•W†&mr¦ òäéŠ7K¢ðUVž¼)(E3ô9€…Ûn’ª“mÎU@âÒS²ëÔÇ@×gÜÞÒ—Ppþ
+¶¨f»Ü–õ|Ï bžcÞ2¡„<¡N„_“‚ÂÕÉÜ~ `$@ÇдvW›çBº¼6&»SÊv¥Ü “¬[S‰×òñÞõT9Žþ¼K”)‚Zû)¸pÛjCŽÚN+ï'hssµ½6ýIa…äS4XäHA
+^”Ô~Ïœ(Xt
+zÿÖc:›#é¦,‹  l¾1M¼ï™áŒ ¶èIÊ¡5Díœ ]ÍT%f'Á”^…+>l$& úÃåú[úHõCÿ»_»ßðsÀG¹zÇ%Á¦«ËªIš ÚF=/÷ó~Ãç‘iç*Oéâ¶;¸‘_ºNê½&úÓ©8õÏh­°WäÒýÒ±wÒð3Æ©á¸X‰„»¸ˆRÛz99Ðø|y2+·º¸ôôÅò‹>&cc{¸mÜl|³„ýˆÈ7^€§;{í:`ØÏÓpÏ>ø0#Çù^|V”ñÚÀUéé,±[ý&¸¤h«¸YÊArÇó×J{D†:ðëÒÚ&ˆßæée¼ü×+[ŠÔ;¾ Ç-áTWQßmtÖUüÇ^ÒlÆ‘jpnå) Vi²+b¨¤ïëìl÷ØéØaK´x4èD0ž}Ó$Óï<¯l<>~ÚXvŒ‘¶5ÙüF;¼RåÅ-NSÎÖÏ)P¶’ maKËîf×èËÀÊX4ø®ó·œè—ôÑ–`9dfÍ·µÄÉmbc°k›íŽ¾¶‘nªºtw³­ ¢íÛŠ­²ÞY®%ÈBV¥*(<=Èn®±ˆ¢8w#Ðù÷–ºÒÑ$1wBú,1AjÕÅ#)K¼kòãùmË¥4ÚHkÛM\áfyÉ7ϽfšWp…ŸDÇÛ8ªÝYqRyœ:+äóÞ™? HÔošÃ»ÎJÅi5ÍERP†\¤äbchÚJé
+n‡¤˜o|YÇœ! ¾ÿ|`VÓsÕ'6¾ZÃ:‘ˆ†XµX–Oß•vnwspÙDbE:Þ]Õ–
+ÊлwB…È1ƒþ”¯úäUoà.ó+i‘ =ÈÕýŠN¬m·þÃxí.=Œ­5®óš®H¿><ǤíÅ6‰W¢óÕ³NPùg›ÊXtItàó
+ÂÞeî£Ñ|ïÁþlÒ3ë«a3È2À¦¼‹¢;œWË|ºaƹ’å|ßkõ@Rín-Àø A­©mr#<]b‰åô÷eœõ,ÖœvŠdüeÛ¹0ð0û .};“Íá“Jƒóû$(f ”-b4ÅVÂDk᤼;àSZR«ä*å½ß¯;l@‰8îXïLÁa¥(S}×9ú´‹¼EYaý ‚Æ©+g«¡f›"P>ç =pyEµ$C®,s§™eÛ¤O«¹·lœXì.ÅðÚP¢rnÏlƦi _‰æÕ(ûíÌñùh'³¹Ž‘Q]i-> 8F /'›\„@Hù½Ü{\dß—§S"Ç i8<hÀîÛÇAÉtã´¦÷
+m 3¡¹ø—)zõ%<§
+ÓÛ‰šSNÕ— =·ÞGæQ\iB~Lrb+×ŇbÄÐÙ•+¤Wi2ªhWä.
+oÉ1Ê0웘àÍk.sD•}?*åVMVÇp%:h¦·ˆú]9RG®å3/¥ñÛ@f 3öÁª®‘ÙµÿxTº‡W†×qNë#èô‡F0ôxƒO =­E:5½´è.Ü&>Sï$§ØrY§r–¹qJ
+i8WÚ¿\N[Ž”!öL,Œ'nâu¸våtÌ¢–£a¡ŠãµèÁ%œÀ /*w.ˆxé:”~5K(¬mg}îu1Ý3ï㫽ûõW¤®48P‚JÈÐ_¥3UþìÊtÖ÷Á•C3s-ãYYvÓ‚²Y ±µxÈk½S¢¦U·yÔ5ôÔb\z34V£r ,w‡~ˆå.…CYϾ5„]×Úµ'Ó›øs+qˆ)‚‹v«tüc(“Rlh
+ï|?ÕFð &‡Åi%DáWª®)slŒAè-¾Â¼`]‚þ¥Ÿ¹´¿½Úçp¦ÀÅó)†–z«.µ°½ã+fç.Ye8ÚzF‚ô³îüAÅ´ãñ!GÔ~0Ѻ<|
+#æk›\B23/°|‚ÖN—’ÞÒXtEiÄé(â8]€
+\J®=EÊ~¤¯€k/Pßõ—´”÷æýÖ7öÝ× øòœ†eô毒¨> ¾hÓ;(°äõ²4\–¸©? ePiJ~m×뛇£hb3d¹n½gŠŠ=¬ÓˆlQ,~KBN”†WÅ^"Œ“zÞT‘nNÖ®ÿZƶžßiýb.z<!qr.ÂË<J®p^ÞG5’!ãh¦- UøŠ‡vOòÓI#§¿,žà6ËW±þ$ä‹!ôBeÃyGGl »§ÄMIRö-©¬[­ïª¦Œ@¯}8K¢ÖĘ•àˆ×Gj4×NOÓøÕ¶¯õ‘†Â§íj¾¨Œ(Æ%mÑåÎDÕš9h> þ$®…Î\“©ªm´‚ŠÆ¨Îò&aa.òä^çšàu~{ •q¯2 ]}‘G@åŠä×aÑU®ó:`’PX@h&õx†HˆâóÒf†Bz˨¨_ïI@B&f4Mš¬.aƒ¢KBzê«!ªÿ3NP‰É¥9*š1zÆ\–|wQS…59f¶Øinµ¼IîË
+ýÑ ×òÈ_ûAówVäïjq'!1 mS<œ¶»Í² À­ "áì7zóÇHnØ¿jU‰f~-Õ·SÊvöñÀJqg”`ÇjYÔ˜.N\ø ý>èây\ÖÛ ˜ÎôAЫXÀþPË#-Ęéý†õ¾ð¥20ÄÙß‹„i=óYÃ$¢5Â'5D̸”ijÙªu昬iåOjãa!øêÊL™-ƒ c ÐøD‹ŠÕ««Ç•c#Ù=
+n®±ˆÊž¶ ®áJ<©ö; €îÜ x+ø÷­µ –'IטáŸoŒY™(±¦¬óÓE_3µ#d1š‘jsÅû³Rñüä~
+«…ÛÁ0|ØÛ¨rž[ñÅ
+n£Œˆàwƒm5†‰u“ Ž°‘£óq
+/U¼;Ö}â$X…ÚÓ´Kç«fàÓ*MM‘9Œ}ì‹À@ÄèßSš³« <Gëw²¾×+TR­–òŽÌöQ„ g@Gs ¡ÀÆ£E½4µ­l
+MÞúÅ>Hd‘$ã^ÃÌ[¡û/äX+Ít~ÅßþS$3Ùß—~z]ôúYhí²ä!Ô"'ðÕã:t¸ÛÏÅK`ƒ[‡Çxý4õìÐ!#çˆ/jÎpÊ\£ØiæÍÁÆ‹‚- ^è‚…''¿O òD¹Ê·êÞaw•ïí)0 õP`Q?x9š ü°šhx‰?·Ø c~ûZ6ÒQ@
+keG
+
+Ÿ‚„¨Õ/k‡ ]Ñ º/ÍxÂp¬\>™Lê}û(ù'™y ^d1] ÀGò¤­K\ÙL·(Û×9Ʀ i‹cÝ›õN ™¹n,:m$øçhÚV‡.¬
+ÈÙ!z»[úœD¸¡\™V\aü<I'bÜšÄÎgw—ì£;ÞüÒÙ ¤#~™6HùYS’‡•å蓳6Ò9f|Ðl}çšß‚¥/d¥Þ…vXËpd&—H~T §ÅÔ—s¬:×÷öÚèžnžŠÕ¥á¢ý\ñóÖr4íô+³»¥XÐvel›¢žŠEJ&vÚw·ðÌ:˜6WG'K9¯ j—‚l¦xÃ逖LÖ^Žqþƒ='\ŽAï é/*‹`~&Ë}UïV…ÆMlƒÙ÷‰x^³CI“=_k<S_óØÝîDÍæªê.úõ ®3[ù;ìÛ. $šÓžæSá2ZЯ
+ß¼'ýPb€XÑFM¿ÊœJ» '“ˆ¸Î„J‡ÄÜg*Ÿµ¤õµ§C*•ñ
+¦Çƒç†«4 yãöæšã§>Κüè¯>šbºØýúÅP¬
+ælî tV¸û‘–3qû%ŽY7‰‰p’u1$q…ˆÑÙÈ  ƒŠÙǾ¼\‹uûK¡&˺hûD'n"Q¢&¯iÊ7Í¡ú»šØiµ ÿҨ퉇Ka¯Ñðò(`hò쪆G6XðMÈ ²ß±à;ñÖ¶{õ°”H$3isCÁ†`Ã#: ^üëäçÔ{T\žCÙì¥öD.íðbU'çMPä Î“&.A0(œ”ûéò ût?…7Ÿ4;î¹ÁîRâUÀ0cQ¨œi)‚\ò_\òùÁ±§Ôí"‘Ïn¡¨çW¹@
+4mbA‘., +ù3ÞräÉ7zz¸xº„vFà5Åï÷`>ƒ¿ Ê3¢jÐ1 _òÿMšÎQ1Y©à$SÁÎꨄó‘ð,?/øŒ#q¹,•Mþ@š7Èlf§¯•1NK¨æ×$£`ÈxEŠÕ 6èr%ò1+Éà÷ †Cp³pÜo†WiÎë*$•FxO.†@Mñ¹™å«i;Lg{ã v
+„,˜›"óšœT&iÙÎà±n”:Èt' ¢ª¬õA©AúÚ†ô ˜ìëI¢ÔJÏöG)MûüÅÁù½¬‡f¤Õ<mÊ¡žÄ«|d‚ÉŸr¨Ù/•‰NµÇYû‹Hª¹®|)³Œó^£»¯Ù¤0B¯+Ìxƒôt~乃FÅÖ–þo¹6”¿x‰ï;MܪðXB“ô¬,‡C#)bðùðVÕwЙ"§Êh—UZ‚žÕë}S§ðl¢@vM 9Jà½é¹Tò}(ú¶±©Øb«çsÈIS-(
+G-ƒcD¶–:ß^è†ëÚ8¹g¯y,9b~¦œáV{pî“O'þ’G1¡½à1–ü¾"ÃQíFV©wVŽ¡ÂΕÏa;k²„¼5tÕK®¿ÈÄ´
+&{b¾é\QÊcèâåKŠ¡Û€•\±"Ó{E),ŸŸË#E‘·iUHš™·'6 &<i[ÞÀÑçºËÔg+éA¼Töl¬n´•ÿRÔ—œÄù²4ˆ/åÖƒ ZÓoíضSG‡EŸÃqÉÛ³í±FÁéÛn´!19÷÷. ý¥+õh¨Üíïs´q×0 2|—…ÃtBƧ´ä ¾œJ3›n`m$Ä;Pž=Ì!·þö»$Q¯I cQÞò>u¯_«÷–¤ËÜ‘ÛàÐðÔKÛ?¼ û©)ÑQTóQUm`¦iø<uè¿>:Ñ[—§sø®á›)% ¤ç7 óD¨×K×F´XÖŒAHØú¸a—/« 5:›†Šú™ïn¼#`‡+»Þ[øjXZNiåJx)T»\—ØãÚšæs÷DlIÚb`·:eÛÄôöïT£º)£&ïyd„ãì°3e2ò–/@
+ .Ó0']Ó _Odqâ®Ä–üå…­>#ÞWÖ³cRªv×Sž¼XΧ!8$õËàí 3D=ón“~·ÁŸD㕹=’ô™h¿IÒîÇvƒK>A¨sÎÞtݘÏZ¶G U^W0åõ®’•¤¡Íš’
+/<˜“}ß;ëOжrš³<ˆþ–hMèj‹â×òų@W 4tú:©ë•×`±–T¿/à#]ÛÍN›‰öÍQ«ÕÇØÑ£ƒžoŽzB}ˆŒ¢ÁõSÞ˲ÛA!YÛahZg¼¤u|W¾qþ~âWt`us2yX‚
+¨El* Å3/ZÑÿTãi.)ÑÍ¢G÷8•{ðp œ¾!î4½á´ÞfÍ+ç9'LF¡»^É¿Nd*¹ÆhÇŽ g¥n)ZR¾œ2/@KŒµK¨øXI6ÇRÉ ëaµ$ÅîN»-¢'¼%+iâ?h%Fbs„òj\¥­¡uËøÄ âÂêáÄí(- ¯!Ö0\÷è|žÀ
+¶ ƒ ¢E2Ltãæâè¾I;Æ|ˆ»µ]0ÊÈ!çÛJ¢b^ûÙ­&×à}»'0qT[}yë&P½1ÞAæá^™0qŒk7Ù¥±ßbª0Äüh«N±D3Gˆ¾_²ßý&±UG·b`üÂO|=ÇÎYדnj‡üG tÆδ/Œ±§ÚÖ%t}šøhPÀgz͆ª©d•î2^G¡¥o¯¡Óü‘UC‹)Ö”ÖSˆ*Ñ’È:k@o‹ý})f°+LXnÅ@ê_ ß2Åiâ(ªt…Þ¨¶–+ÈÛk¿(ŸQg䔈Šfl.¬¤þË8èÖâ¥> ø|gúÜ”
+TpŽ‰ß¾®º]+.;+¼•ÝŸô6¶èhÕmØóÚ¹ ˆÿwkÍn‹ØÖæaðÙFu—k\!Ïé“>í}Éþ²ÒS°ÅìC½ïPUÈÉÁ¾Fö,éà¾eö4°Gñeá ºÑ¢Å"w)œçzO§$#g^†¾I†b¡lì4e—8&áâÄ«ðÔc‰þo˜iw¨ ={€õôI=wlº·(n'˜}ü;h|-Pn%Xª²ˆ~~»'›ò!é@Õ]͹à*îªDÝ*õæO͵˜ý¨¡Ò-s‡˜ÐIò3)‘™{¦_ÇWu†ùµ°\°%ßï7iåÜG¥DÞ ñ?’|%ÆüiG—lGê¾L‹`1îDx,½‹ŒÊp—š‚D~e'K™…V,u¤>ŸâìçF» nLFäè”.1°FÖˆ-oË”pÊøcó;6³ùFma7A­CÕW'éÞ¼<«1„6œ&³ƒF5Ì7Òo`¥dº%<‡|W¹[õTú'ÿX'3§ ]…±åvR§ó(›ÜOæÿD³¯ir §ðßù¾¿¡Â¯ŽˆV!"ñ/Ô­‚VcYén‚§ F#ütñé¤DÞ@Ä`] gO»{¬íWxj+.ª¶(XNô`bŠ§Êé.WQT2³Ù‡y©X¦Ž(÷|Α‘Ýv*¤†Õ¤D˜Ï‹ÏâM[E Ó
+ëá0íá3õFt;ÉÁš¼‘Þ<ÅyÕê©–ze¢lÒft£?ÿF%݇¤G[dÊ°ó2¯|?s‡·‚ÁÆ9—¸,k/KÁØÖI_ GÂ+Š$ý v$¡G|7FiÃoÑLØS‰µ¶‰V6bBš×F¬zÓä·Wè߆Û#¢š»°žq"® ¦<I6Ãèýñ4
+Û–åÃ{>;³Ä¬²ÔÙþSXqå§%Œo… Š¥]ôêûæ‰ÁyP;Bi)Omq”©{‡+™ Y=Ëv—0ÒË+AŸ´ë Ó&5Š÷ÓP„R'ë-â+ „ÛƵq›Ý“<–áC“Þ®›8ÔÁhîÏ#íÞ^tG†°QbŲ)N#†·î ?±°ù¦„•›£æˆa$(H쵄…PZsÑ&†®é¶àb’ã°¤Œ0‹§§ï»§óD‡~3:+éØÕä}÷ 8ñ`î©?ßÓo›wºFWÐéO´© 0Èò¹½¶BÄÛp =d²ÿP-âëÅèTÊÏÞg~®ýú=£g­l´þC}—&³¯ÁŒÊ÷ššIîä™é9©±ùÉ•àõ+#ž¢˜£ºþ\Öƒ#ÞkÝŒë&t0ÊÝá¦7Ö¶¡ä”5jÌÔ²ÉwvxÙ–î›à`¬ç÷ì¡"a¡f*í`–zL©b¤5Þ+6=jô{zÌ9ùŠ÷´zû¤dI7ý¢éaùgÌ]rä–ºúhl=M(jtn˜3à ¯L2èféòÞ¹’IPË—~/+$c ª‰Á½ˆã+Z ºù­
+Ï{ªsåšU#ô½V¼oØ6‚ž€‚êƒ37•(S¸nÛ\+5ˆððr~ÉžLO5Ÿ?žUaÂCs`~I®úb®E»IÏZ0<LPÛ~²|gUkìFÒ`×0ÖþÈÙ [Â3䀳ýÜ;ߢšìµèÓxƒÊ 'ÉÇWõ©>¸y‡(.Uôë ´ŸG}µ‚wëN<heÕn']D³C‹u„̯ä?O V†w9àÊHýžt;ƒÀv7vŸT¸[xNø%²OfpIø_$§é5.¾‰ìZÌ
+çßQ-<F_¾Aºtï=Wxi¿'SŸ{Ç4 ¡†[PǦØÊv±­o*SÚ®²2WÿWûæ°À(ÐضÕØnÒÆnl6lc[íL&ÎÄæÄFcÛžØNcÜ»¹Opwÿ÷Ÿ8«³=ÝÃR.ÅE…E‹UöÁÎtZ‹¸»4Àâ)³SdÖÑ´S p@E‹iɳ×aBk®$^‘½ùèVŒ× µæv1’qpVnªra\KJÃ02øÏQ?”KñµyTˆ"\ºg‘K®™Ö„Ê›Tc/¾-ª«1ïkÄó çôç%E ׿ÖÃŒ±Læ‹ØÞ¨€áýf¡g·/7Å¢¼R[õâ7ï™Æz’ø/Nzoàû¬åäckƒÇ›˜Äù˜Võð:)ÿýãµüþéJ
+ 3n
+ÿýûAL”2àC¼IÑ2VÃ$:9Ûö¹o„rcl¼Î]üÉ%ä[&=ë6…ï¾ëiÈ¥øOŒ‚ã$K¿h«•uÕ6Iå/8dÉwMNNX’ÔZ1(Ö¥ô¤`ÑkÙ°Ô‚7U%bŸMWž•:+úa™šíù´Ïè΄Ÿ,^Ç0Š!qù«N6@ñË«µ°¤”¯S©iÝÆ{ÝÇ>_À
+ÿ?!Cçcæ^‘O}ÿƒ5 “Cü!ØÉ»®?í|”+¨4ÂöªlØå½û$†,øá¾/ùt£ËzÒ~ج¡1ш—~DÕ1ˆ%ÀlÑ„A·ïª©þ5c ŽŒ·(ˆèß…®tÞ6ž«¨ý+>ù¤" µÕØ®¦?¤Fn®¤ðÂÀ¯BˆCÍoä ÛV ü¾‘«`$¸+°"¤u¡%f ?ýãŽVãüZékK ²}_î™ééË@©éŸ­z™xzWáQ&gvL®ÎØÕÏƉÈP¨î¬/uâ¤á£ §XdýÿÖ•fB]
+:À€•áŽ±¿X8Ñj‡Œ˜>Ág{ZÐ×Ø°i«‡ºyDj"Å jµK–D¥«œ.¯üç”äàd7X‘7æ<¶’Û*¢†ED6 
+” ]´±1Ü?“¹FÁ&¦¡l—FJÐs²!½‹Dãpù!/dÔˆOÄŽ]{TÖƒ:_IîÖáíŒãH%#ˆ1`@®Ö|Èuåñ¢O¾.$YP'jŸ?¿5×^Ü‚îY%’ >É,MŒ20 HÒV ™H³ÊÎÒ—àýŽ³Ñ]E}Tyƒ¿Õ´9•&ÝÝ
+¾²Sî¹”s¬ ¨Ë¶´óEñźA/Me‘Å
+é >Ÿ¼Ã<»ê
+8‚ã*[KEUè)ùa$¿N¢µ øïÍÇ>:Ç4Ø-,¾Ÿò>Þ¤¹µÀžSƒ…n5É¡è7»~²§bí–L
+•¡–¸CŒ#¶ž©Þ.ίè¿·zÆQè}ÛÌŒ6™Äò"ò¼h÷üõ2ÿ²,›û}‹0~77_J¼­SÕdj 1ø7nÅëH‘óx>/'7ÅWWâ7'Žú yÒ>;Fç:ä{g'àÉ.C»4H%ì²õ8ÃñÒj MæúmÒ“<ïPѤ}RÐQ­}Gý.\Ìûþïã Ú/X…$Ѧ{ЗÝØMÉaúèÜch¨$D
+‹ÁcB
+AàÃÐ> 4.Ðt’ÁýŽ`¡ õ1uĬS‰aÏ çF^V-š>¡ýØN ñ‡0åT¯Ù
+·è‡7ëéBñ(9™ÀcY+k$þŶ«Œ=ðµ¢QwL ä<(ró`,XeG÷¦ÝY–‚®ùÕKé÷ÈÞHC°£ää$=üæ…q
+_Ñ=d´)î`Åœ¬~sÙ:Uµ ´§ÞV¶_K!Ô¦`‘EùcTñYŽdÊæÎx¹ÓÀÏÕ7s,|äºS†ííRN]exÀq”›ý-Ë`ë`‰¨ÖÄc±¸.u¹g9ºBµfœ:îïæ2HV1ÒÎ<lš”¶Øµ±HiœQ‘5ü»ž¹Rª»ôB€î.VÂ˵ävŽí®)üfÄ?æˆ,ÞÄoà¤È Íæ
+ôéeÉþ&‡2"$8¬íÛãO˜ˆ7SÆ,é
+±õñ¨E'Oƒ¦ò¸Žœ­²„Œ¨ISŽ§ìº2!²³’D‡H¶ê;”|‹!¶jè²_rDꀩžÖ¸Øã}ˆ8——T²|+Å׋8¾ûW÷šo
+†?Å, Ô±™x¬ç¥\3*Ï©C¶q0ëß½«™Ž>­jâÄ>Kt¤)¦k>(ªK·#:›xMµ–Ð2²ßñ®ÄýRò¡ì‘wz!î,±•ÁÌõ
+DŒ–¯ØØ®0o´×\Ú²{löjâ­°C¨õ3Lu3¤RLyz§ 1ÛÁÂË6».} À|?ò{,j¢:µæû#-ÝÑ"åHbˆGžaæÀ~À_tݶÛàE•
+ócÆ
+ݲ+‡S?èoJ£K¤
+ÓþL5ºÐ$p•ü›yBÃ|5»w^þl23(ËÛô€åµm‘ï7ì·5v°“’._ô]ÕDO¸XR6ö}ÇÉÉ
+Û7Ñ8úŠßî7;°”—\&›ˆÏæÄeâê.s¤ÆÑŽ…Y0´ÊéÞÀ âžì ‹x4ÜÁw\•fèöê°¼Ÿ3pÇOy³Í4ù”-†¢£À ÂN¿ËþÙP³z[´‹üò®¯˜ Æ®-×I£+”–öH34PçM÷|´wÁ°Qv@2vºŒR¶f¼Ÿ4È,²,BÓœ“Uêä~ó‚ù·•6oáéA+K?ó FC¤h¼ÍRÚ_±L²"çªÒÍ“÷û³ÔBKŒÃ(¼shEŽmä_ÞÙSI f8¢lEúKAfð²ÜeM¥ ÐŽ™Ü*ÝS‰§d#…$3u}!jÌïƨCaô‚”¿•Ú Q,Ü4ŒT=AÅ?AUJ” e –×S<)UÇ‘¡„cc lÛ mvØsÖË(?ú¸D˺¯xì/Pç/·‡ðbÞ
+ËÚ."dšñãí·<ÈAmMãsåýëà½Æ™ûÓKæPú iìЇÖó!œi "
+RY,ÀrÚ° ݧ-¦£<@$•N\×:6EwFàC´Y«Uvvµ×çên¿ò\Vê6â~òT¥•½IýA<_½µ™íb+ö@ö­xž>o´x(°‹àšƒû‹ÿ'õeÓloZK’8´†á'ÔpøºÔfžni(|"¨,ÿ°®u ¨‹êûÔˆ,Фè¾9 {+¸$°w/ž‰’&3RÀ¯„„cÁ šOmÏHµ] Ú!ÝÕJ$Žá
+V‘<}6j]'»EVîhû‚}6¡ÝÀ6àÛ·o÷CfÀ¿ièﬕò1e·)(+‚§l¦…ãƒÖˆç\àíÈìk}/y»—ìǸoÕóÑ#Žuo'i”FG œpÖCfïÌŸ¢7j½W¨évôœ­FaÇ¢~®|Z][pÔÖù(Ž¥å –pÖ– œL®€î2Ÿd#FñD§ðïƳK“UðIó‘½ØÒ^¿ºýO4Jh%9rCØ\\ú+Þüæ8[…}Ú ôu¨›ÔV¤J»ˆ¢<#¡%ÁtÇ2å 7ÙIŸÔ®O™oßpÙêÈ—µ9 §.†*iTáŠNG‚÷Yk(ÅiJÌÇgÖ'gOZU\òo®\9F®hÛŽ²v@›”PN•ªþ|z¥»"^‘—ËN§³$Ë'‡kWØœ.Þe#ÄÚä/ª«:I!îò@F.Ù§N,X!Ϫ%µpºDÖEÐ’6å5eFÙ™ÂôÛ’EöqäœØ+R²Ÿ]C~=ëÿÖxP„»w(ŠÉTn ý£êöÅëGÏ!_/Ä!„ûݸЩîçCs›äJ §±üð@ÔÖfË4á ü%å/«‚ÎüTï;MKð"3¢Îæc7 
+Ú–þb$ˆF›š×4ÌGÂw6 JBÊA©­R"±#ªvw>!*3ûLß´ÖaxqUR±™^3îjÕƪ®vOÍ+ê] N nìþù‡Õ¨¸®âƒÑ±ÕÉíÍU
+`õØ i:ey/ÓT“îüÃg{qª}ŽTr 3ý\:×îY6Ò°’Ù<eÚCÈ_üiš–Qm–›#öïÎTº9\œëyíŽ&$ÞñeÞ I4ðúl#ÿ¿{ 2/ô)™®#0„ÇB_ò l•û©¥×ë¥ê:&T‡í¨9WÚ!’q¨ÿÁTˆÛ¥â«×™a9¦ˆRPÕ½¤Ô_i&U—M“X<ÜôYÈ«¶ª&v@¤àÆ2˜1j 9
+ƒÖù9üÞë%CßšAÛ±·ÁÿxHí´ËúD®Ãn6j­°øc„-± ‘F®mð€äÓz#ìA;L {&a0%­j8ÊÔó£{Gµ¢=4‰¤)Ú[ôÐÓ°ÏOw¥Ç÷MªºA:X¹Í¶Âv4ihìä×s¾ø,‚ÆP’㉖ Õù™\†@¯Á±ÆÎßC —èœFì§M¹"â“Êonn_Ö³ÿLBfFÄ  >;xŒoù3‡ý%¤àö.ÜÍ‘8iòzÍ´ÎÈéÕCùÔîÉ(ŒŒ«ªû-äd˜6í‹(ÇJT*L_4¥öÍü…°í¡M¶¤íâ‹1Ö`×xÜe²lÜá†Ö/®;Gæ+àÆÛÔÜÞ釾{å
+2K(¾àÈrG€éI^ݯ§ËœE;ÉëZ$„)½J%† * ÷%„.Jr–&*¹Ü¯Ms¶°_k„îš ¿NÆS»‚wX*ÿï­fƒ=ºðW=›±7Zx‰’d­#ó’1ãZ˜5'`N @­@Ótq¶¥ÙƉ›–îà—%Š7ûÙ¹%.Ìx¤D—ãðÁ³b‰C5ø Idõk/ÅQŠ?èxãê5³¯ÄÖ>Òðuowõ=–è9­Y'àã« Õ‚zɦ±¶Ô‚>N ;}`÷*Ž¿ÃÞƒ$“ƒ†Ï|£ã·Ä#@ºêÊͪ²Æ.ˆX³¤ ¾àŽG¿¯ö„«‡w‚MšZögsÎÙQ1ª¡ï±ª;_þSì?“áx´ Ÿ‚^¯I«˜E2•“§–κÛw!l¾:‡_¼sªÔNÿ˜~ù™Û݃[²3ùULiµeižÀìe%¥½˜¨üß’O¬/°”:¿èx>D@þ¦ùòá=9'»|»Ä½Œ©L²Ä/–ê-‚½ÎìÃsœ” ~(áà,åpƒ¡ËRs,Õ:Ž±ÿÃ6hÆËÔDÞï^ÑêI¬'k𽠱ĞÙþ÷ŸøŸ…ÜÈ Æ› ;™l+ä­ñy̼Ú(g`ý s}ÔÖ’×åù$Ï–c†ƒvjlHM»kœÄ^ý08ùqS}ã!<¢¥mPYm¼ÑјÃs:öhª6¯!Û(sD¹16äÑ?«r.o™Éûòˆ ¾SšÉí³•õP1K²EreS‘(§AðÖ?žÔo§G,C<òΔ½kuló µkX“ÁñÓ—WOGˆ‹v$ÔÃÁ×a¶D´­ƒæé<xç x÷DÉ ºBõoÙòQ3ª‘GÞŠgMyÎëæ:ç èWƒ’¥oáµ=£öb2ð»±K<6ö%J{
+‹ÅK0}´zc?¹ L£Z^ FªËï;—þ d%CºŸüÂ¥ü¨)0óšâ5µû|#ñÊ1¤Šµ– Pgm _R„®z1ÙïO,îSò[³ÃY[Z…-¶2
+{å]­è«X• ²ßæF]T%9FáTâþ¥}qÚxo‚{w;w+h|ŠÏíaq ˆíX7ŒÒz¡î±vñ¨ˆæK܉bs6Ÿ±™"‚¬|;¯mš®u˜4bƼý¦þ 7õ™•»Ð¯l(hõ)&I—¼¸óÝ ô#Fê%yDôêWÖëÏäôD‡߂ù‘|}Å99Q}â> uôÒ§«h†:úVLãÖzBžÅŒå’F'üÕÆQÓ/9ÎFÝҰɵ#6snœjGöXã~ÃéPóLpJýœ&wB˽óÂób17aªÓHj;è•ßÐðS½]þÅÝpÌÚò“ ­ªAë8Kžpªä¦<ëñ-ùS¢äëÊõ&}9c­àÒo˜òt3aëc` StŒÔDr3œ–ic#Ñ‘x"£ž7ý³–þl­ÊêIF)^ˆ×LÌŠ[h£IµA _#ƒc«¬LÔ'PŒ ö–Tñ™»,Š x´År
+‹;dTx¢CŠÚµ'x^3$|ÀȽ¬4ì^ᜥ$0ý'©´s ác@ÓAÙouÖŒÎ@@‹Ù[¨ñÄ#rµì‘ö9s¤Nè2êš>8*û@‹hËçESæIh’V\ºw+›øYET Žë楋ÆEêæcfCoŠåÚM¬·Ôþáéw„IiD¤^‹J­÷T¹J†a±kãÂú ôꟶÊçÆck€-T ÿŠ×Ý¥èÝû
+¥`M/\oõÛþJXSù6”¿ü'ŽOØLaà¨oÍZNõµáø÷P³¬æ#À«-’·^=èCp§“´ñ»wÓ^»±òž,àìÎ-3à rg‡lÖ:G>
+‡û$Ëú*Ï[¾'е5Ø̽þ^¿‚@rG{XÎN3?Ü&Óvj½ìÖfl3O­ˆÐ¥\á" ÝJ)P\°7À«J&zgT‘š|†ñhÝh^r×X&âhŒç]CŠÒ÷ˆÂú%#ÅŸß’ïçUUÒÙ$ïRDäü¾Rk¤zwŒñ­ã—Z
+UßD„j%‘{7¹’&LoÅLó´T0‰*
+Ë—ÌF+uå| ã_ìŽ'¬gk"¸qáD]²
endobj
-714 0 obj <<
+930 0 obj <<
/Type /Font
/Subtype /Type1
-/Encoding 2140 0 R
+/Encoding 2705 0 R
/FirstChar 2
/LastChar 151
-/Widths 2157 0 R
-/BaseFont /QOWXRN+URWPalladioL-Bold
-/FontDescriptor 712 0 R
+/Widths 2722 0 R
+/BaseFont /NSYDKZ+URWPalladioL-Bold
+/FontDescriptor 928 0 R
>> endobj
-712 0 obj <<
+928 0 obj <<
/Ascent 708
/CapHeight 672
/Descent -266
-/FontName /QOWXRN+URWPalladioL-Bold
+/FontName /NSYDKZ+URWPalladioL-Bold
/ItalicAngle 0
/StemV 123
/XHeight 471
/FontBBox [-152 -301 1000 935]
/Flags 4
-/CharSet (/fi/fl/exclam/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash)
-/FontFile 713 0 R
+/CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash)
+/FontFile 929 0 R
>> endobj
-2157 0 obj
-[611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ]
+2722 0 obj
+[611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ]
endobj
-715 0 obj <<
+931 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [706 0 R 732 0 R 742 0 R 797 0 R 861 0 R 923 0 R]
+/Parent 2723 0 R
+/Kids [922 0 R 948 0 R 958 0 R 1013 0 R 1077 0 R 1140 0 R]
>> endobj
-954 0 obj <<
+1216 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [943 0 R 956 0 R 969 0 R 980 0 R 987 0 R 999 0 R]
+/Parent 2723 0 R
+/Kids [1202 0 R 1218 0 R 1230 0 R 1243 0 R 1254 0 R 1261 0 R]
>> endobj
-1011 0 obj <<
+1277 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1004 0 R 1013 0 R 1024 0 R 1032 0 R 1039 0 R 1045 0 R]
+/Parent 2723 0 R
+/Kids [1273 0 R 1279 0 R 1287 0 R 1296 0 R 1306 0 R 1320 0 R]
>> endobj
-1068 0 obj <<
+1328 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1053 0 R 1075 0 R 1085 0 R 1090 0 R 1094 0 R 1101 0 R]
+/Parent 2723 0 R
+/Kids [1324 0 R 1331 0 R 1338 0 R 1343 0 R 1364 0 R 1374 0 R]
>> endobj
-1117 0 obj <<
+1383 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1109 0 R 1120 0 R 1127 0 R 1132 0 R 1142 0 R 1148 0 R]
+/Parent 2723 0 R
+/Kids [1380 0 R 1385 0 R 1390 0 R 1399 0 R 1408 0 R 1415 0 R]
>> endobj
-1158 0 obj <<
+1424 0 obj <<
/Type /Pages
/Count 6
-/Parent 2158 0 R
-/Kids [1152 0 R 1160 0 R 1164 0 R 1174 0 R 1179 0 R 1187 0 R]
+/Parent 2723 0 R
+/Kids [1421 0 R 1426 0 R 1436 0 R 1449 0 R 1457 0 R 1470 0 R]
>> endobj
-1203 0 obj <<
+1480 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1195 0 R 1205 0 R 1214 0 R 1225 0 R 1230 0 R 1236 0 R]
+/Parent 2724 0 R
+/Kids [1476 0 R 1482 0 R 1488 0 R 1496 0 R 1502 0 R 1508 0 R]
>> endobj
-1245 0 obj <<
+1520 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1242 0 R 1247 0 R 1255 0 R 1265 0 R 1269 0 R 1273 0 R]
+/Parent 2724 0 R
+/Kids [1517 0 R 1522 0 R 1529 0 R 1533 0 R 1543 0 R 1548 0 R]
>> endobj
-1282 0 obj <<
+1562 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1278 0 R 1285 0 R 1289 0 R 1295 0 R 1306 0 R 1310 0 R]
+/Parent 2724 0 R
+/Kids [1555 0 R 1564 0 R 1573 0 R 1581 0 R 1592 0 R 1598 0 R]
>> endobj
-1322 0 obj <<
+1609 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1314 0 R 1325 0 R 1332 0 R 1337 0 R 1342 0 R 1346 0 R]
+/Parent 2724 0 R
+/Kids [1604 0 R 1611 0 R 1615 0 R 1622 0 R 1627 0 R 1637 0 R]
>> endobj
-1356 0 obj <<
+1644 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1350 0 R 1358 0 R 1365 0 R 1371 0 R 1378 0 R 1385 0 R]
+/Parent 2724 0 R
+/Kids [1641 0 R 1646 0 R 1650 0 R 1654 0 R 1660 0 R 1665 0 R]
>> endobj
-1398 0 obj <<
+1675 0 obj <<
/Type /Pages
/Count 6
-/Parent 2159 0 R
-/Kids [1391 0 R 1401 0 R 1409 0 R 1413 0 R 1418 0 R 1424 0 R]
+/Parent 2724 0 R
+/Kids [1670 0 R 1677 0 R 1682 0 R 1692 0 R 1696 0 R 1700 0 R]
>> endobj
-1437 0 obj <<
+1712 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1433 0 R 1439 0 R 1443 0 R 1447 0 R 1454 0 R 1459 0 R]
+/Parent 2725 0 R
+/Kids [1705 0 R 1715 0 R 1723 0 R 1728 0 R 1732 0 R 1736 0 R]
>> endobj
-1486 0 obj <<
+1747 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1474 0 R 1488 0 R 1512 0 R 1522 0 R 1528 0 R 1538 0 R]
+/Parent 2725 0 R
+/Kids [1740 0 R 1749 0 R 1756 0 R 1761 0 R 1768 0 R 1776 0 R]
>> endobj
-1552 0 obj <<
+1787 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1544 0 R 1554 0 R 1564 0 R 1574 0 R 1583 0 R 1590 0 R]
+/Parent 2725 0 R
+/Kids [1781 0 R 1791 0 R 1796 0 R 1800 0 R 1806 0 R 1811 0 R]
>> endobj
-1603 0 obj <<
+1820 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1596 0 R 1606 0 R 1616 0 R 1623 0 R 1631 0 R 1637 0 R]
+/Parent 2725 0 R
+/Kids [1816 0 R 1822 0 R 1830 0 R 1837 0 R 1842 0 R 1846 0 R]
>> endobj
-1651 0 obj <<
+1853 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1648 0 R 1653 0 R 1657 0 R 1668 0 R 1672 0 R 1679 0 R]
+/Parent 2725 0 R
+/Kids [1850 0 R 1855 0 R 1863 0 R 1867 0 R 1882 0 R 1896 0 R]
>> endobj
-1747 0 obj <<
+1927 0 obj <<
/Type /Pages
/Count 6
-/Parent 2160 0 R
-/Kids [1689 0 R 1749 0 R 1805 0 R 1859 0 R 1893 0 R 1902 0 R]
+/Parent 2725 0 R
+/Kids [1908 0 R 1929 0 R 1936 0 R 1942 0 R 1952 0 R 1958 0 R]
>> endobj
-1912 0 obj <<
+1973 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [1908 0 R 1914 0 R 1918 0 R 1923 0 R 1934 0 R 1939 0 R]
+/Parent 2726 0 R
+/Kids [1964 0 R 1975 0 R 1987 0 R 1995 0 R 2003 0 R 2007 0 R]
>> endobj
-1961 0 obj <<
+2022 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [1951 0 R 1963 0 R 1970 0 R 1982 0 R 1986 0 R 1997 0 R]
+/Parent 2726 0 R
+/Kids [2015 0 R 2024 0 R 2036 0 R 2043 0 R 2051 0 R 2055 0 R]
>> endobj
-2006 0 obj <<
+2071 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [2003 0 R 2008 0 R 2014 0 R 2027 0 R 2037 0 R 2041 0 R]
+/Parent 2726 0 R
+/Kids [2061 0 R 2073 0 R 2077 0 R 2081 0 R 2092 0 R 2096 0 R]
>> endobj
-2056 0 obj <<
+2112 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [2053 0 R 2058 0 R 2064 0 R 2075 0 R 2080 0 R 2084 0 R]
+/Parent 2726 0 R
+/Kids [2103 0 R 2114 0 R 2173 0 R 2229 0 R 2283 0 R 2318 0 R]
>> endobj
-2100 0 obj <<
+2333 0 obj <<
/Type /Pages
/Count 6
-/Parent 2161 0 R
-/Kids [2091 0 R 2102 0 R 2113 0 R 2118 0 R 2129 0 R 2135 0 R]
+/Parent 2726 0 R
+/Kids [2326 0 R 2335 0 R 2342 0 R 2347 0 R 2353 0 R 2357 0 R]
>> endobj
-2158 0 obj <<
+2371 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2726 0 R
+/Kids [2366 0 R 2373 0 R 2378 0 R 2382 0 R 2387 0 R 2398 0 R]
+>> endobj
+2414 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2403 0 R 2416 0 R 2425 0 R 2434 0 R 2439 0 R 2448 0 R]
+>> endobj
+2457 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2454 0 R 2459 0 R 2465 0 R 2476 0 R 2486 0 R 2492 0 R]
+>> endobj
+2507 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2503 0 R 2509 0 R 2513 0 R 2517 0 R 2528 0 R 2539 0 R]
+>> endobj
+2549 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2545 0 R 2551 0 R 2562 0 R 2566 0 R 2573 0 R 2587 0 R]
+>> endobj
+2597 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2593 0 R 2599 0 R 2604 0 R 2613 0 R 2621 0 R 2631 0 R]
+>> endobj
+2647 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2727 0 R
+/Kids [2636 0 R 2649 0 R 2658 0 R 2666 0 R 2681 0 R 2693 0 R]
+>> endobj
+2723 0 obj <<
/Type /Pages
/Count 36
-/Parent 2162 0 R
-/Kids [715 0 R 954 0 R 1011 0 R 1068 0 R 1117 0 R 1158 0 R]
+/Parent 2728 0 R
+/Kids [931 0 R 1216 0 R 1277 0 R 1328 0 R 1383 0 R 1424 0 R]
>> endobj
-2159 0 obj <<
+2724 0 obj <<
/Type /Pages
/Count 36
-/Parent 2162 0 R
-/Kids [1203 0 R 1245 0 R 1282 0 R 1322 0 R 1356 0 R 1398 0 R]
+/Parent 2728 0 R
+/Kids [1480 0 R 1520 0 R 1562 0 R 1609 0 R 1644 0 R 1675 0 R]
>> endobj
-2160 0 obj <<
+2725 0 obj <<
/Type /Pages
/Count 36
-/Parent 2162 0 R
-/Kids [1437 0 R 1486 0 R 1552 0 R 1603 0 R 1651 0 R 1747 0 R]
+/Parent 2728 0 R
+/Kids [1712 0 R 1747 0 R 1787 0 R 1820 0 R 1853 0 R 1927 0 R]
>> endobj
-2161 0 obj <<
+2726 0 obj <<
/Type /Pages
-/Count 30
-/Parent 2162 0 R
-/Kids [1912 0 R 1961 0 R 2006 0 R 2056 0 R 2100 0 R]
+/Count 36
+/Parent 2728 0 R
+/Kids [1973 0 R 2022 0 R 2071 0 R 2112 0 R 2333 0 R 2371 0 R]
>> endobj
-2162 0 obj <<
+2727 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2728 0 R
+/Kids [2414 0 R 2457 0 R 2507 0 R 2549 0 R 2597 0 R 2647 0 R]
+>> endobj
+2728 0 obj <<
/Type /Pages
-/Count 138
-/Kids [2158 0 R 2159 0 R 2160 0 R 2161 0 R]
+/Count 180
+/Kids [2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R]
>> endobj
-2163 0 obj <<
+2729 0 obj <<
/Type /Outlines
/First 7 0 R
-/Last 651 0 R
+/Last 835 0 R
/Count 10
>> endobj
+919 0 obj <<
+/Title 920 0 R
+/A 917 0 R
+/Parent 835 0 R
+/Prev 915 0 R
+>> endobj
+915 0 obj <<
+/Title 916 0 R
+/A 913 0 R
+/Parent 835 0 R
+/Prev 911 0 R
+/Next 919 0 R
+>> endobj
+911 0 obj <<
+/Title 912 0 R
+/A 909 0 R
+/Parent 835 0 R
+/Prev 907 0 R
+/Next 915 0 R
+>> endobj
+907 0 obj <<
+/Title 908 0 R
+/A 905 0 R
+/Parent 835 0 R
+/Prev 903 0 R
+/Next 911 0 R
+>> endobj
+903 0 obj <<
+/Title 904 0 R
+/A 901 0 R
+/Parent 835 0 R
+/Prev 899 0 R
+/Next 907 0 R
+>> endobj
+899 0 obj <<
+/Title 900 0 R
+/A 897 0 R
+/Parent 835 0 R
+/Prev 895 0 R
+/Next 903 0 R
+>> endobj
+895 0 obj <<
+/Title 896 0 R
+/A 893 0 R
+/Parent 835 0 R
+/Prev 891 0 R
+/Next 899 0 R
+>> endobj
+891 0 obj <<
+/Title 892 0 R
+/A 889 0 R
+/Parent 835 0 R
+/Prev 887 0 R
+/Next 895 0 R
+>> endobj
+887 0 obj <<
+/Title 888 0 R
+/A 885 0 R
+/Parent 835 0 R
+/Prev 883 0 R
+/Next 891 0 R
+>> endobj
+883 0 obj <<
+/Title 884 0 R
+/A 881 0 R
+/Parent 835 0 R
+/Prev 879 0 R
+/Next 887 0 R
+>> endobj
+879 0 obj <<
+/Title 880 0 R
+/A 877 0 R
+/Parent 835 0 R
+/Prev 875 0 R
+/Next 883 0 R
+>> endobj
+875 0 obj <<
+/Title 876 0 R
+/A 873 0 R
+/Parent 835 0 R
+/Prev 871 0 R
+/Next 879 0 R
+>> endobj
+871 0 obj <<
+/Title 872 0 R
+/A 869 0 R
+/Parent 835 0 R
+/Prev 867 0 R
+/Next 875 0 R
+>> endobj
+867 0 obj <<
+/Title 868 0 R
+/A 865 0 R
+/Parent 835 0 R
+/Prev 863 0 R
+/Next 871 0 R
+>> endobj
+863 0 obj <<
+/Title 864 0 R
+/A 861 0 R
+/Parent 835 0 R
+/Prev 859 0 R
+/Next 867 0 R
+>> endobj
+859 0 obj <<
+/Title 860 0 R
+/A 857 0 R
+/Parent 835 0 R
+/Prev 855 0 R
+/Next 863 0 R
+>> endobj
+855 0 obj <<
+/Title 856 0 R
+/A 853 0 R
+/Parent 835 0 R
+/Prev 851 0 R
+/Next 859 0 R
+>> endobj
+851 0 obj <<
+/Title 852 0 R
+/A 849 0 R
+/Parent 835 0 R
+/Prev 847 0 R
+/Next 855 0 R
+>> endobj
+847 0 obj <<
+/Title 848 0 R
+/A 845 0 R
+/Parent 835 0 R
+/Prev 843 0 R
+/Next 851 0 R
+>> endobj
+843 0 obj <<
+/Title 844 0 R
+/A 841 0 R
+/Parent 835 0 R
+/Prev 839 0 R
+/Next 847 0 R
+>> endobj
+839 0 obj <<
+/Title 840 0 R
+/A 837 0 R
+/Parent 835 0 R
+/Next 843 0 R
+>> endobj
+835 0 obj <<
+/Title 836 0 R
+/A 833 0 R
+/Parent 2729 0 R
+/Prev 743 0 R
+/First 839 0 R
+/Last 919 0 R
+/Count -21
+>> endobj
+831 0 obj <<
+/Title 832 0 R
+/A 829 0 R
+/Parent 779 0 R
+/Prev 803 0 R
+>> endobj
+827 0 obj <<
+/Title 828 0 R
+/A 825 0 R
+/Parent 803 0 R
+/Prev 823 0 R
+>> endobj
+823 0 obj <<
+/Title 824 0 R
+/A 821 0 R
+/Parent 803 0 R
+/Prev 819 0 R
+/Next 827 0 R
+>> endobj
+819 0 obj <<
+/Title 820 0 R
+/A 817 0 R
+/Parent 803 0 R
+/Prev 815 0 R
+/Next 823 0 R
+>> endobj
+815 0 obj <<
+/Title 816 0 R
+/A 813 0 R
+/Parent 803 0 R
+/Prev 811 0 R
+/Next 819 0 R
+>> endobj
+811 0 obj <<
+/Title 812 0 R
+/A 809 0 R
+/Parent 803 0 R
+/Prev 807 0 R
+/Next 815 0 R
+>> endobj
+807 0 obj <<
+/Title 808 0 R
+/A 805 0 R
+/Parent 803 0 R
+/Next 811 0 R
+>> endobj
+803 0 obj <<
+/Title 804 0 R
+/A 801 0 R
+/Parent 779 0 R
+/Prev 799 0 R
+/Next 831 0 R
+/First 807 0 R
+/Last 827 0 R
+/Count -6
+>> endobj
+799 0 obj <<
+/Title 800 0 R
+/A 797 0 R
+/Parent 779 0 R
+/Prev 795 0 R
+/Next 803 0 R
+>> endobj
+795 0 obj <<
+/Title 796 0 R
+/A 793 0 R
+/Parent 779 0 R
+/Prev 791 0 R
+/Next 799 0 R
+>> endobj
+791 0 obj <<
+/Title 792 0 R
+/A 789 0 R
+/Parent 779 0 R
+/Prev 787 0 R
+/Next 795 0 R
+>> endobj
+787 0 obj <<
+/Title 788 0 R
+/A 785 0 R
+/Parent 779 0 R
+/Prev 783 0 R
+/Next 791 0 R
+>> endobj
+783 0 obj <<
+/Title 784 0 R
+/A 781 0 R
+/Parent 779 0 R
+/Next 787 0 R
+>> endobj
+779 0 obj <<
+/Title 780 0 R
+/A 777 0 R
+/Parent 743 0 R
+/Prev 763 0 R
+/First 783 0 R
+/Last 831 0 R
+/Count -7
+>> endobj
+775 0 obj <<
+/Title 776 0 R
+/A 773 0 R
+/Parent 763 0 R
+/Prev 771 0 R
+>> endobj
+771 0 obj <<
+/Title 772 0 R
+/A 769 0 R
+/Parent 763 0 R
+/Prev 767 0 R
+/Next 775 0 R
+>> endobj
+767 0 obj <<
+/Title 768 0 R
+/A 765 0 R
+/Parent 763 0 R
+/Next 771 0 R
+>> endobj
+763 0 obj <<
+/Title 764 0 R
+/A 761 0 R
+/Parent 743 0 R
+/Prev 755 0 R
+/Next 779 0 R
+/First 767 0 R
+/Last 775 0 R
+/Count -3
+>> endobj
+759 0 obj <<
+/Title 760 0 R
+/A 757 0 R
+/Parent 755 0 R
+>> endobj
+755 0 obj <<
+/Title 756 0 R
+/A 753 0 R
+/Parent 743 0 R
+/Prev 747 0 R
+/Next 763 0 R
+/First 759 0 R
+/Last 759 0 R
+/Count -1
+>> endobj
+751 0 obj <<
+/Title 752 0 R
+/A 749 0 R
+/Parent 747 0 R
+>> endobj
+747 0 obj <<
+/Title 748 0 R
+/A 745 0 R
+/Parent 743 0 R
+/Next 755 0 R
+/First 751 0 R
+/Last 751 0 R
+/Count -1
+>> endobj
+743 0 obj <<
+/Title 744 0 R
+/A 741 0 R
+/Parent 2729 0 R
+/Prev 723 0 R
+/Next 835 0 R
+/First 747 0 R
+/Last 779 0 R
+/Count -4
+>> endobj
+739 0 obj <<
+/Title 740 0 R
+/A 737 0 R
+/Parent 723 0 R
+/Prev 735 0 R
+>> endobj
+735 0 obj <<
+/Title 736 0 R
+/A 733 0 R
+/Parent 723 0 R
+/Prev 727 0 R
+/Next 739 0 R
+>> endobj
+731 0 obj <<
+/Title 732 0 R
+/A 729 0 R
+/Parent 727 0 R
+>> endobj
+727 0 obj <<
+/Title 728 0 R
+/A 725 0 R
+/Parent 723 0 R
+/Next 735 0 R
+/First 731 0 R
+/Last 731 0 R
+/Count -1
+>> endobj
+723 0 obj <<
+/Title 724 0 R
+/A 721 0 R
+/Parent 2729 0 R
+/Prev 699 0 R
+/Next 743 0 R
+/First 727 0 R
+/Last 739 0 R
+/Count -3
+>> endobj
+719 0 obj <<
+/Title 720 0 R
+/A 717 0 R
+/Parent 699 0 R
+/Prev 707 0 R
+>> endobj
+715 0 obj <<
+/Title 716 0 R
+/A 713 0 R
+/Parent 707 0 R
+/Prev 711 0 R
+>> endobj
+711 0 obj <<
+/Title 712 0 R
+/A 709 0 R
+/Parent 707 0 R
+/Next 715 0 R
+>> endobj
+707 0 obj <<
+/Title 708 0 R
+/A 705 0 R
+/Parent 699 0 R
+/Prev 703 0 R
+/Next 719 0 R
+/First 711 0 R
+/Last 715 0 R
+/Count -2
+>> endobj
703 0 obj <<
/Title 704 0 R
/A 701 0 R
-/Parent 651 0 R
-/Prev 699 0 R
+/Parent 699 0 R
+/Next 707 0 R
>> endobj
699 0 obj <<
/Title 700 0 R
/A 697 0 R
-/Parent 651 0 R
-/Prev 695 0 R
-/Next 703 0 R
+/Parent 2729 0 R
+/Prev 355 0 R
+/Next 723 0 R
+/First 703 0 R
+/Last 719 0 R
+/Count -3
>> endobj
695 0 obj <<
/Title 696 0 R
/A 693 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 691 0 R
-/Next 699 0 R
>> endobj
691 0 obj <<
/Title 692 0 R
/A 689 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 687 0 R
/Next 695 0 R
>> endobj
687 0 obj <<
/Title 688 0 R
/A 685 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 683 0 R
/Next 691 0 R
>> endobj
683 0 obj <<
/Title 684 0 R
/A 681 0 R
-/Parent 651 0 R
+/Parent 675 0 R
/Prev 679 0 R
/Next 687 0 R
>> endobj
679 0 obj <<
/Title 680 0 R
/A 677 0 R
-/Parent 651 0 R
-/Prev 675 0 R
+/Parent 675 0 R
/Next 683 0 R
>> endobj
675 0 obj <<
/Title 676 0 R
/A 673 0 R
-/Parent 651 0 R
+/Parent 667 0 R
/Prev 671 0 R
-/Next 679 0 R
+/First 679 0 R
+/Last 695 0 R
+/Count -5
>> endobj
671 0 obj <<
/Title 672 0 R
/A 669 0 R
-/Parent 651 0 R
-/Prev 667 0 R
+/Parent 667 0 R
/Next 675 0 R
>> endobj
667 0 obj <<
/Title 668 0 R
/A 665 0 R
-/Parent 651 0 R
-/Prev 663 0 R
-/Next 671 0 R
+/Parent 355 0 R
+/Prev 611 0 R
+/First 671 0 R
+/Last 675 0 R
+/Count -2
>> endobj
663 0 obj <<
/Title 664 0 R
/A 661 0 R
-/Parent 651 0 R
+/Parent 611 0 R
/Prev 659 0 R
-/Next 667 0 R
>> endobj
659 0 obj <<
/Title 660 0 R
/A 657 0 R
-/Parent 651 0 R
-/Prev 655 0 R
+/Parent 611 0 R
+/Prev 639 0 R
/Next 663 0 R
>> endobj
655 0 obj <<
/Title 656 0 R
/A 653 0 R
-/Parent 651 0 R
-/Next 659 0 R
+/Parent 639 0 R
+/Prev 651 0 R
>> endobj
651 0 obj <<
/Title 652 0 R
/A 649 0 R
-/Parent 2163 0 R
-/Prev 615 0 R
-/First 655 0 R
-/Last 703 0 R
-/Count -13
+/Parent 639 0 R
+/Prev 647 0 R
+/Next 655 0 R
>> endobj
647 0 obj <<
/Title 648 0 R
/A 645 0 R
-/Parent 635 0 R
+/Parent 639 0 R
/Prev 643 0 R
+/Next 651 0 R
>> endobj
643 0 obj <<
/Title 644 0 R
/A 641 0 R
-/Parent 635 0 R
-/Prev 639 0 R
+/Parent 639 0 R
/Next 647 0 R
>> endobj
639 0 obj <<
/Title 640 0 R
/A 637 0 R
-/Parent 635 0 R
-/Next 643 0 R
+/Parent 611 0 R
+/Prev 635 0 R
+/Next 659 0 R
+/First 643 0 R
+/Last 655 0 R
+/Count -4
>> endobj
635 0 obj <<
/Title 636 0 R
/A 633 0 R
-/Parent 615 0 R
-/Prev 627 0 R
-/First 639 0 R
-/Last 647 0 R
-/Count -3
+/Parent 611 0 R
+/Prev 631 0 R
+/Next 639 0 R
>> endobj
631 0 obj <<
/Title 632 0 R
/A 629 0 R
-/Parent 627 0 R
+/Parent 611 0 R
+/Prev 627 0 R
+/Next 635 0 R
>> endobj
627 0 obj <<
/Title 628 0 R
/A 625 0 R
-/Parent 615 0 R
-/Prev 619 0 R
-/Next 635 0 R
-/First 631 0 R
-/Last 631 0 R
-/Count -1
+/Parent 611 0 R
+/Prev 615 0 R
+/Next 631 0 R
>> endobj
623 0 obj <<
/Title 624 0 R
/A 621 0 R
-/Parent 619 0 R
+/Parent 615 0 R
+/Prev 619 0 R
>> endobj
619 0 obj <<
/Title 620 0 R
/A 617 0 R
/Parent 615 0 R
-/Next 627 0 R
-/First 623 0 R
-/Last 623 0 R
-/Count -1
+/Next 623 0 R
>> endobj
615 0 obj <<
/Title 616 0 R
/A 613 0 R
-/Parent 2163 0 R
-/Prev 595 0 R
-/Next 651 0 R
+/Parent 611 0 R
+/Next 627 0 R
/First 619 0 R
-/Last 635 0 R
-/Count -3
+/Last 623 0 R
+/Count -2
>> endobj
611 0 obj <<
/Title 612 0 R
/A 609 0 R
-/Parent 595 0 R
-/Prev 607 0 R
+/Parent 355 0 R
+/Prev 387 0 R
+/Next 667 0 R
+/First 615 0 R
+/Last 663 0 R
+/Count -7
>> endobj
607 0 obj <<
/Title 608 0 R
/A 605 0 R
-/Parent 595 0 R
-/Prev 599 0 R
-/Next 611 0 R
+/Parent 591 0 R
+/Prev 603 0 R
>> endobj
603 0 obj <<
/Title 604 0 R
/A 601 0 R
-/Parent 599 0 R
+/Parent 591 0 R
+/Prev 599 0 R
+/Next 607 0 R
>> endobj
599 0 obj <<
/Title 600 0 R
/A 597 0 R
-/Parent 595 0 R
-/Next 607 0 R
-/First 603 0 R
-/Last 603 0 R
-/Count -1
+/Parent 591 0 R
+/Prev 595 0 R
+/Next 603 0 R
>> endobj
595 0 obj <<
/Title 596 0 R
/A 593 0 R
-/Parent 2163 0 R
-/Prev 571 0 R
-/Next 615 0 R
-/First 599 0 R
-/Last 611 0 R
-/Count -3
+/Parent 591 0 R
+/Next 599 0 R
>> endobj
591 0 obj <<
/Title 592 0 R
/A 589 0 R
-/Parent 571 0 R
-/Prev 579 0 R
+/Parent 387 0 R
+/Prev 587 0 R
+/First 595 0 R
+/Last 607 0 R
+/Count -4
>> endobj
587 0 obj <<
/Title 588 0 R
/A 585 0 R
-/Parent 579 0 R
+/Parent 387 0 R
/Prev 583 0 R
+/Next 591 0 R
>> endobj
583 0 obj <<
/Title 584 0 R
/A 581 0 R
-/Parent 579 0 R
+/Parent 387 0 R
+/Prev 579 0 R
/Next 587 0 R
>> endobj
579 0 obj <<
/Title 580 0 R
/A 577 0 R
-/Parent 571 0 R
+/Parent 387 0 R
/Prev 575 0 R
-/Next 591 0 R
-/First 583 0 R
-/Last 587 0 R
-/Count -2
+/Next 583 0 R
>> endobj
575 0 obj <<
/Title 576 0 R
/A 573 0 R
-/Parent 571 0 R
+/Parent 387 0 R
+/Prev 571 0 R
/Next 579 0 R
>> endobj
571 0 obj <<
/Title 572 0 R
/A 569 0 R
-/Parent 2163 0 R
-/Prev 243 0 R
-/Next 595 0 R
-/First 575 0 R
-/Last 591 0 R
-/Count -3
+/Parent 387 0 R
+/Prev 567 0 R
+/Next 575 0 R
>> endobj
567 0 obj <<
/Title 568 0 R
/A 565 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 563 0 R
+/Next 571 0 R
>> endobj
563 0 obj <<
/Title 564 0 R
/A 561 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 559 0 R
/Next 567 0 R
>> endobj
559 0 obj <<
/Title 560 0 R
/A 557 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 555 0 R
/Next 563 0 R
>> endobj
555 0 obj <<
/Title 556 0 R
/A 553 0 R
-/Parent 547 0 R
+/Parent 387 0 R
/Prev 551 0 R
/Next 559 0 R
>> endobj
551 0 obj <<
/Title 552 0 R
/A 549 0 R
-/Parent 547 0 R
+/Parent 387 0 R
+/Prev 547 0 R
/Next 555 0 R
>> endobj
547 0 obj <<
/Title 548 0 R
/A 545 0 R
-/Parent 539 0 R
-/Prev 543 0 R
-/First 551 0 R
-/Last 567 0 R
-/Count -5
+/Parent 387 0 R
+/Prev 463 0 R
+/Next 551 0 R
>> endobj
543 0 obj <<
/Title 544 0 R
/A 541 0 R
-/Parent 539 0 R
-/Next 547 0 R
+/Parent 463 0 R
+/Prev 539 0 R
>> endobj
539 0 obj <<
/Title 540 0 R
/A 537 0 R
-/Parent 243 0 R
-/Prev 483 0 R
-/First 543 0 R
-/Last 547 0 R
-/Count -2
+/Parent 463 0 R
+/Prev 535 0 R
+/Next 543 0 R
>> endobj
535 0 obj <<
/Title 536 0 R
/A 533 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 531 0 R
+/Next 539 0 R
>> endobj
531 0 obj <<
/Title 532 0 R
/A 529 0 R
-/Parent 483 0 R
-/Prev 511 0 R
+/Parent 463 0 R
+/Prev 527 0 R
/Next 535 0 R
>> endobj
527 0 obj <<
/Title 528 0 R
/A 525 0 R
-/Parent 511 0 R
+/Parent 463 0 R
/Prev 523 0 R
+/Next 531 0 R
>> endobj
523 0 obj <<
/Title 524 0 R
/A 521 0 R
-/Parent 511 0 R
+/Parent 463 0 R
/Prev 519 0 R
/Next 527 0 R
>> endobj
519 0 obj <<
/Title 520 0 R
/A 517 0 R
-/Parent 511 0 R
+/Parent 463 0 R
/Prev 515 0 R
/Next 523 0 R
>> endobj
515 0 obj <<
/Title 516 0 R
/A 513 0 R
-/Parent 511 0 R
+/Parent 463 0 R
+/Prev 511 0 R
/Next 519 0 R
>> endobj
511 0 obj <<
/Title 512 0 R
/A 509 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 507 0 R
-/Next 531 0 R
-/First 515 0 R
-/Last 527 0 R
-/Count -4
+/Next 515 0 R
>> endobj
507 0 obj <<
/Title 508 0 R
/A 505 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 503 0 R
/Next 511 0 R
>> endobj
503 0 obj <<
/Title 504 0 R
/A 501 0 R
-/Parent 483 0 R
+/Parent 463 0 R
/Prev 499 0 R
/Next 507 0 R
>> endobj
499 0 obj <<
/Title 500 0 R
/A 497 0 R
-/Parent 483 0 R
-/Prev 487 0 R
+/Parent 463 0 R
+/Prev 495 0 R
/Next 503 0 R
>> endobj
495 0 obj <<
/Title 496 0 R
/A 493 0 R
-/Parent 487 0 R
+/Parent 463 0 R
/Prev 491 0 R
+/Next 499 0 R
>> endobj
491 0 obj <<
/Title 492 0 R
/A 489 0 R
-/Parent 487 0 R
+/Parent 463 0 R
+/Prev 487 0 R
/Next 495 0 R
>> endobj
487 0 obj <<
/Title 488 0 R
/A 485 0 R
-/Parent 483 0 R
-/Next 499 0 R
-/First 491 0 R
-/Last 495 0 R
-/Count -2
+/Parent 463 0 R
+/Prev 483 0 R
+/Next 491 0 R
>> endobj
483 0 obj <<
/Title 484 0 R
/A 481 0 R
-/Parent 243 0 R
-/Prev 275 0 R
-/Next 539 0 R
-/First 487 0 R
-/Last 535 0 R
-/Count -7
+/Parent 463 0 R
+/Prev 479 0 R
+/Next 487 0 R
>> endobj
479 0 obj <<
/Title 480 0 R
/A 477 0 R
/Parent 463 0 R
/Prev 475 0 R
+/Next 483 0 R
>> endobj
475 0 obj <<
/Title 476 0 R
@@ -12324,328 +15378,338 @@ endobj
463 0 obj <<
/Title 464 0 R
/A 461 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 459 0 R
+/Next 547 0 R
/First 467 0 R
-/Last 479 0 R
-/Count -4
+/Last 543 0 R
+/Count -20
>> endobj
459 0 obj <<
/Title 460 0 R
/A 457 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 455 0 R
/Next 463 0 R
>> endobj
455 0 obj <<
/Title 456 0 R
/A 453 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 451 0 R
/Next 459 0 R
>> endobj
451 0 obj <<
/Title 452 0 R
/A 449 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 447 0 R
/Next 455 0 R
>> endobj
447 0 obj <<
/Title 448 0 R
/A 445 0 R
-/Parent 275 0 R
+/Parent 387 0 R
/Prev 443 0 R
/Next 451 0 R
>> endobj
443 0 obj <<
/Title 444 0 R
/A 441 0 R
-/Parent 275 0 R
-/Prev 439 0 R
+/Parent 387 0 R
+/Prev 427 0 R
/Next 447 0 R
>> endobj
439 0 obj <<
/Title 440 0 R
/A 437 0 R
-/Parent 275 0 R
+/Parent 427 0 R
/Prev 435 0 R
-/Next 443 0 R
>> endobj
435 0 obj <<
/Title 436 0 R
/A 433 0 R
-/Parent 275 0 R
+/Parent 427 0 R
/Prev 431 0 R
/Next 439 0 R
>> endobj
431 0 obj <<
/Title 432 0 R
/A 429 0 R
-/Parent 275 0 R
-/Prev 427 0 R
+/Parent 427 0 R
/Next 435 0 R
>> endobj
427 0 obj <<
/Title 428 0 R
/A 425 0 R
-/Parent 275 0 R
-/Prev 351 0 R
-/Next 431 0 R
+/Parent 387 0 R
+/Prev 423 0 R
+/Next 443 0 R
+/First 431 0 R
+/Last 439 0 R
+/Count -3
>> endobj
423 0 obj <<
/Title 424 0 R
/A 421 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 419 0 R
+/Next 427 0 R
>> endobj
419 0 obj <<
/Title 420 0 R
/A 417 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 415 0 R
/Next 423 0 R
>> endobj
415 0 obj <<
/Title 416 0 R
/A 413 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 411 0 R
/Next 419 0 R
>> endobj
411 0 obj <<
/Title 412 0 R
/A 409 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 407 0 R
/Next 415 0 R
>> endobj
407 0 obj <<
/Title 408 0 R
/A 405 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 403 0 R
/Next 411 0 R
>> endobj
403 0 obj <<
/Title 404 0 R
/A 401 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 399 0 R
/Next 407 0 R
>> endobj
399 0 obj <<
/Title 400 0 R
/A 397 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 395 0 R
/Next 403 0 R
>> endobj
395 0 obj <<
/Title 396 0 R
/A 393 0 R
-/Parent 351 0 R
+/Parent 387 0 R
/Prev 391 0 R
/Next 399 0 R
>> endobj
391 0 obj <<
/Title 392 0 R
/A 389 0 R
-/Parent 351 0 R
-/Prev 387 0 R
+/Parent 387 0 R
/Next 395 0 R
>> endobj
387 0 obj <<
/Title 388 0 R
/A 385 0 R
-/Parent 351 0 R
-/Prev 383 0 R
-/Next 391 0 R
+/Parent 355 0 R
+/Prev 359 0 R
+/Next 611 0 R
+/First 391 0 R
+/Last 591 0 R
+/Count -28
>> endobj
383 0 obj <<
/Title 384 0 R
/A 381 0 R
-/Parent 351 0 R
+/Parent 375 0 R
/Prev 379 0 R
-/Next 387 0 R
>> endobj
379 0 obj <<
/Title 380 0 R
/A 377 0 R
-/Parent 351 0 R
-/Prev 375 0 R
+/Parent 375 0 R
/Next 383 0 R
>> endobj
375 0 obj <<
/Title 376 0 R
/A 373 0 R
-/Parent 351 0 R
-/Prev 371 0 R
-/Next 379 0 R
+/Parent 359 0 R
+/Prev 363 0 R
+/First 379 0 R
+/Last 383 0 R
+/Count -2
>> endobj
371 0 obj <<
/Title 372 0 R
/A 369 0 R
-/Parent 351 0 R
+/Parent 363 0 R
/Prev 367 0 R
-/Next 375 0 R
>> endobj
367 0 obj <<
/Title 368 0 R
/A 365 0 R
-/Parent 351 0 R
-/Prev 363 0 R
+/Parent 363 0 R
/Next 371 0 R
>> endobj
363 0 obj <<
/Title 364 0 R
/A 361 0 R
-/Parent 351 0 R
-/Prev 359 0 R
-/Next 367 0 R
+/Parent 359 0 R
+/Next 375 0 R
+/First 367 0 R
+/Last 371 0 R
+/Count -2
>> endobj
359 0 obj <<
/Title 360 0 R
/A 357 0 R
-/Parent 351 0 R
-/Prev 355 0 R
-/Next 363 0 R
+/Parent 355 0 R
+/Next 387 0 R
+/First 363 0 R
+/Last 375 0 R
+/Count -2
>> endobj
355 0 obj <<
/Title 356 0 R
/A 353 0 R
-/Parent 351 0 R
-/Next 359 0 R
+/Parent 2729 0 R
+/Prev 343 0 R
+/Next 699 0 R
+/First 359 0 R
+/Last 667 0 R
+/Count -4
>> endobj
351 0 obj <<
/Title 352 0 R
/A 349 0 R
-/Parent 275 0 R
+/Parent 343 0 R
/Prev 347 0 R
-/Next 427 0 R
-/First 355 0 R
-/Last 423 0 R
-/Count -18
>> endobj
347 0 obj <<
/Title 348 0 R
/A 345 0 R
-/Parent 275 0 R
-/Prev 343 0 R
+/Parent 343 0 R
/Next 351 0 R
>> endobj
343 0 obj <<
/Title 344 0 R
/A 341 0 R
-/Parent 275 0 R
-/Prev 339 0 R
-/Next 347 0 R
+/Parent 2729 0 R
+/Prev 131 0 R
+/Next 355 0 R
+/First 347 0 R
+/Last 351 0 R
+/Count -2
>> endobj
339 0 obj <<
/Title 340 0 R
/A 337 0 R
-/Parent 275 0 R
+/Parent 331 0 R
/Prev 335 0 R
-/Next 343 0 R
>> endobj
335 0 obj <<
/Title 336 0 R
/A 333 0 R
-/Parent 275 0 R
-/Prev 331 0 R
+/Parent 331 0 R
/Next 339 0 R
>> endobj
331 0 obj <<
/Title 332 0 R
/A 329 0 R
-/Parent 275 0 R
-/Prev 315 0 R
-/Next 335 0 R
+/Parent 131 0 R
+/Prev 287 0 R
+/First 335 0 R
+/Last 339 0 R
+/Count -2
>> endobj
327 0 obj <<
/Title 328 0 R
/A 325 0 R
-/Parent 315 0 R
+/Parent 287 0 R
/Prev 323 0 R
>> endobj
323 0 obj <<
/Title 324 0 R
/A 321 0 R
-/Parent 315 0 R
+/Parent 287 0 R
/Prev 319 0 R
/Next 327 0 R
>> endobj
319 0 obj <<
/Title 320 0 R
/A 317 0 R
-/Parent 315 0 R
+/Parent 287 0 R
+/Prev 315 0 R
/Next 323 0 R
>> endobj
315 0 obj <<
/Title 316 0 R
/A 313 0 R
-/Parent 275 0 R
-/Prev 311 0 R
-/Next 331 0 R
-/First 319 0 R
-/Last 327 0 R
-/Count -3
+/Parent 287 0 R
+/Prev 303 0 R
+/Next 319 0 R
>> endobj
311 0 obj <<
/Title 312 0 R
/A 309 0 R
-/Parent 275 0 R
+/Parent 303 0 R
/Prev 307 0 R
-/Next 315 0 R
>> endobj
307 0 obj <<
/Title 308 0 R
/A 305 0 R
-/Parent 275 0 R
-/Prev 303 0 R
+/Parent 303 0 R
/Next 311 0 R
>> endobj
303 0 obj <<
/Title 304 0 R
/A 301 0 R
-/Parent 275 0 R
-/Prev 299 0 R
-/Next 307 0 R
+/Parent 287 0 R
+/Prev 291 0 R
+/Next 315 0 R
+/First 307 0 R
+/Last 311 0 R
+/Count -2
>> endobj
299 0 obj <<
/Title 300 0 R
/A 297 0 R
-/Parent 275 0 R
+/Parent 291 0 R
/Prev 295 0 R
-/Next 303 0 R
>> endobj
295 0 obj <<
/Title 296 0 R
/A 293 0 R
-/Parent 275 0 R
-/Prev 291 0 R
+/Parent 291 0 R
/Next 299 0 R
>> endobj
291 0 obj <<
/Title 292 0 R
/A 289 0 R
-/Parent 275 0 R
-/Prev 287 0 R
-/Next 295 0 R
+/Parent 287 0 R
+/Next 303 0 R
+/First 295 0 R
+/Last 299 0 R
+/Count -2
>> endobj
287 0 obj <<
/Title 288 0 R
/A 285 0 R
-/Parent 275 0 R
-/Prev 283 0 R
-/Next 291 0 R
+/Parent 131 0 R
+/Prev 275 0 R
+/Next 331 0 R
+/First 291 0 R
+/Last 327 0 R
+/Count -6
>> endobj
283 0 obj <<
/Title 284 0 R
/A 281 0 R
/Parent 275 0 R
/Prev 279 0 R
-/Next 287 0 R
>> endobj
279 0 obj <<
/Title 280 0 R
@@ -12656,101 +15720,95 @@ endobj
275 0 obj <<
/Title 276 0 R
/A 273 0 R
-/Parent 243 0 R
-/Prev 247 0 R
-/Next 483 0 R
+/Parent 131 0 R
+/Prev 219 0 R
+/Next 287 0 R
/First 279 0 R
-/Last 463 0 R
-/Count -26
+/Last 283 0 R
+/Count -2
>> endobj
271 0 obj <<
/Title 272 0 R
/A 269 0 R
-/Parent 263 0 R
+/Parent 219 0 R
/Prev 267 0 R
>> endobj
267 0 obj <<
/Title 268 0 R
/A 265 0 R
-/Parent 263 0 R
+/Parent 219 0 R
+/Prev 263 0 R
/Next 271 0 R
>> endobj
263 0 obj <<
/Title 264 0 R
/A 261 0 R
-/Parent 247 0 R
-/Prev 251 0 R
-/First 267 0 R
-/Last 271 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 259 0 R
+/Next 267 0 R
>> endobj
259 0 obj <<
/Title 260 0 R
/A 257 0 R
-/Parent 251 0 R
+/Parent 219 0 R
/Prev 255 0 R
+/Next 263 0 R
>> endobj
255 0 obj <<
/Title 256 0 R
/A 253 0 R
-/Parent 251 0 R
+/Parent 219 0 R
+/Prev 251 0 R
/Next 259 0 R
>> endobj
251 0 obj <<
/Title 252 0 R
/A 249 0 R
-/Parent 247 0 R
-/Next 263 0 R
-/First 255 0 R
-/Last 259 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 247 0 R
+/Next 255 0 R
>> endobj
247 0 obj <<
/Title 248 0 R
/A 245 0 R
-/Parent 243 0 R
-/Next 275 0 R
-/First 251 0 R
-/Last 263 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 243 0 R
+/Next 251 0 R
>> endobj
243 0 obj <<
/Title 244 0 R
/A 241 0 R
-/Parent 2163 0 R
-/Prev 231 0 R
-/Next 571 0 R
-/First 247 0 R
-/Last 539 0 R
-/Count -4
+/Parent 219 0 R
+/Prev 239 0 R
+/Next 247 0 R
>> endobj
239 0 obj <<
/Title 240 0 R
/A 237 0 R
-/Parent 231 0 R
+/Parent 219 0 R
/Prev 235 0 R
+/Next 243 0 R
>> endobj
235 0 obj <<
/Title 236 0 R
/A 233 0 R
-/Parent 231 0 R
+/Parent 219 0 R
+/Prev 231 0 R
/Next 239 0 R
>> endobj
231 0 obj <<
/Title 232 0 R
/A 229 0 R
-/Parent 2163 0 R
-/Prev 131 0 R
-/Next 243 0 R
-/First 235 0 R
-/Last 239 0 R
-/Count -2
+/Parent 219 0 R
+/Prev 227 0 R
+/Next 235 0 R
>> endobj
227 0 obj <<
/Title 228 0 R
/A 225 0 R
/Parent 219 0 R
/Prev 223 0 R
+/Next 231 0 R
>> endobj
223 0 obj <<
/Title 224 0 R
@@ -12763,9 +15821,10 @@ endobj
/A 217 0 R
/Parent 131 0 R
/Prev 203 0 R
+/Next 275 0 R
/First 223 0 R
-/Last 227 0 R
-/Count -2
+/Last 271 0 R
+/Count -13
>> endobj
215 0 obj <<
/Title 216 0 R
@@ -12921,12 +15980,12 @@ endobj
131 0 obj <<
/Title 132 0 R
/A 129 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Prev 91 0 R
-/Next 231 0 R
+/Next 343 0 R
/First 135 0 R
-/Last 219 0 R
-/Count -9
+/Last 331 0 R
+/Count -12
>> endobj
127 0 obj <<
/Title 128 0 R
@@ -12995,7 +16054,7 @@ endobj
91 0 obj <<
/Title 92 0 R
/A 89 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Prev 67 0 R
/Next 131 0 R
/First 95 0 R
@@ -13038,7 +16097,7 @@ endobj
67 0 obj <<
/Title 68 0 R
/A 65 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Prev 7 0 R
/Next 91 0 R
/First 71 0 R
@@ -13147,2213 +16206,2779 @@ endobj
7 0 obj <<
/Title 8 0 R
/A 5 0 R
-/Parent 2163 0 R
+/Parent 2729 0 R
/Next 67 0 R
/First 11 0 R
/Last 23 0 R
/Count -4
>> endobj
-2164 0 obj <<
-/Names [(Access_Control_Lists) 1635 0 R (Bv9ARM.ch01) 945 0 R (Bv9ARM.ch02) 990 0 R (Bv9ARM.ch03) 1007 0 R (Bv9ARM.ch04) 1056 0 R (Bv9ARM.ch05) 1155 0 R (Bv9ARM.ch06) 1167 0 R (Bv9ARM.ch07) 1634 0 R (Bv9ARM.ch08) 1660 0 R (Bv9ARM.ch09) 1675 0 R (Bv9ARM.ch10) 1896 0 R (Configuration_File_Grammar) 1191 0 R (DNSSEC) 1123 0 R (Doc-Start) 711 0 R (Setting_TTLs) 1560 0 R (acache) 997 0 R (access_control) 1320 0 R (acl) 1199 0 R (address_match_lists) 1172 0 R (admin_tools) 1030 0 R (appendix.A) 614 0 R (appendix.B) 650 0 R (bibliography) 1683 0 R (boolean_options) 1072 0 R (builtin) 1404 0 R (chapter*.1) 745 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 570 0 R (chapter.8) 594 0 R (cite.RFC1033) 1811 0 R (cite.RFC1034) 1695 0 R (cite.RFC1035) 1697 0 R (cite.RFC1101) 1793 0 R (cite.RFC1123) 1795 0 R (cite.RFC1183) 1755 0 R (cite.RFC1464) 1833 0 R (cite.RFC1535) 1740 0 R (cite.RFC1536) 1742 0 R (cite.RFC1537) 1813 0 R (cite.RFC1591) 1797 0 R (cite.RFC1706) 1757 0 R (cite.RFC1712) 1853 0 R (cite.RFC1713) 1835 0 R (cite.RFC1794) 1837 0 R (cite.RFC1876) 1759 0 R (cite.RFC1912) 1815 0 R (cite.RFC1982) 1744 0 R (cite.RFC1995) 1702 0 R (cite.RFC1996) 1704 0 R (cite.RFC2010) 1817 0 R (cite.RFC2052) 1761 0 R (cite.RFC2065) 1865 0 R (cite.RFC2136) 1706 0 R (cite.RFC2137) 1867 0 R (cite.RFC2163) 1763 0 R (cite.RFC2168) 1765 0 R (cite.RFC2181) 1708 0 R (cite.RFC2219) 1819 0 R (cite.RFC2230) 1767 0 R (cite.RFC2240) 1839 0 R (cite.RFC2308) 1710 0 R (cite.RFC2317) 1799 0 R (cite.RFC2345) 1841 0 R (cite.RFC2352) 1843 0 R (cite.RFC2535) 1869 0 R (cite.RFC2536) 1769 0 R (cite.RFC2537) 1771 0 R (cite.RFC2538) 1773 0 R (cite.RFC2539) 1775 0 R (cite.RFC2540) 1777 0 R (cite.RFC2671) 1712 0 R (cite.RFC2672) 1714 0 R (cite.RFC2673) 1855 0 R (cite.RFC2782) 1779 0 R (cite.RFC2825) 1823 0 R (cite.RFC2826) 1801 0 R (cite.RFC2845) 1716 0 R (cite.RFC2874) 1857 0 R (cite.RFC2915) 1781 0 R (cite.RFC2929) 1803 0 R (cite.RFC2930) 1718 0 R (cite.RFC2931) 1720 0 R (cite.RFC3007) 1722 0 R (cite.RFC3008) 1871 0 R (cite.RFC3071) 1845 0 R (cite.RFC3090) 1873 0 R (cite.RFC3110) 1783 0 R (cite.RFC3123) 1785 0 R (cite.RFC3225) 1728 0 R (cite.RFC3258) 1847 0 R (cite.RFC3445) 1875 0 R (cite.RFC3490) 1825 0 R (cite.RFC3491) 1827 0 R (cite.RFC3492) 1829 0 R (cite.RFC3596) 1787 0 R (cite.RFC3597) 1789 0 R (cite.RFC3645) 1724 0 R (cite.RFC3655) 1877 0 R (cite.RFC3658) 1879 0 R (cite.RFC3755) 1881 0 R (cite.RFC3757) 1883 0 R (cite.RFC3833) 1730 0 R (cite.RFC3845) 1885 0 R (cite.RFC3901) 1849 0 R (cite.RFC4033) 1732 0 R (cite.RFC4034) 1734 0 R (cite.RFC4035) 1736 0 R (cite.RFC4074) 1746 0 R (cite.RFC974) 1699 0 R (cite.id2506284) 1890 0 R (clients-per-query) 1604 0 R (configuration_file_elements) 1168 0 R (controls_statement_definition_and_usage) 1043 0 R (diagnostic_tools) 978 0 R (dynamic_update) 1066 0 R (dynamic_update_policies) 1118 0 R (dynamic_update_security) 1330 0 R (empty) 1406 0 R (historical_dns_information) 1677 0 R (id2466560) 946 0 R (id2466583) 947 0 R (id2467290) 1081 0 R (id2467308) 1082 0 R (id2467474) 948 0 R (id2467483) 949 0 R (id2467723) 960 0 R (id2467745) 961 0 R (id2467779) 962 0 R (id2467863) 965 0 R (id2467956) 958 0 R (id2470261) 972 0 R (id2470284) 975 0 R (id2470382) 976 0 R (id2470404) 977 0 R (id2470502) 983 0 R (id2470537) 984 0 R (id2470564) 985 0 R (id2470598) 991 0 R (id2470625) 992 0 R (id2470637) 993 0 R (id2470731) 996 0 R (id2470742) 1002 0 R (id2470774) 1009 0 R (id2470790) 1010 0 R (id2470812) 1016 0 R (id2470829) 1017 0 R (id2471235) 1020 0 R (id2471240) 1021 0 R (id2473016) 1048 0 R (id2473028) 1049 0 R (id2473683) 1098 0 R (id2473700) 1099 0 R (id2474421) 1104 0 R (id2474439) 1105 0 R (id2474450) 1106 0 R (id2474554) 1107 0 R (id2474680) 1112 0 R (id2474728) 1114 0 R (id2474742) 1115 0 R (id2474791) 1116 0 R (id2474859) 1124 0 R (id2475006) 1125 0 R (id2475156) 1130 0 R (id2475394) 1138 0 R (id2475524) 1145 0 R (id2475545) 1146 0 R (id2475578) 1156 0 R (id2475862) 1169 0 R (id2476724) 1177 0 R (id2476752) 1182 0 R (id2476957) 1183 0 R (id2476972) 1184 0 R (id2477070) 1190 0 R (id2477213) 1192 0 R (id2477656) 1198 0 R (id2477699) 1200 0 R (id2477846) 1202 0 R (id2478275) 1210 0 R (id2478292) 1211 0 R (id2478315) 1217 0 R (id2478339) 1218 0 R (id2478498) 1222 0 R (id2478624) 1223 0 R (id2478676) 1228 0 R (id2479437) 1239 0 R (id2480103) 1250 0 R (id2480163) 1251 0 R (id2480548) 1253 0 R (id2480621) 1258 0 R (id2480685) 1261 0 R (id2480729) 1262 0 R (id2480744) 1263 0 R (id2483230) 1292 0 R (id2485002) 1317 0 R (id2485061) 1319 0 R (id2485635) 1335 0 R (id2486906) 1353 0 R (id2486966) 1355 0 R (id2487320) 1368 0 R (id2487822) 1382 0 R (id2489986) 1428 0 R (id2490140) 1429 0 R (id2490192) 1430 0 R (id2490410) 1436 0 R (id2491952) 1450 0 R (id2491959) 1451 0 R (id2491964) 1452 0 R (id2492318) 1463 0 R (id2492352) 1464 0 R (id2494048) 1519 0 R (id2494430) 1525 0 R (id2494449) 1526 0 R (id2494537) 1533 0 R (id2494706) 1535 0 R (id2495944) 1541 0 R (id2496072) 1547 0 R (id2496093) 1548 0 R (id2496388) 1550 0 R (id2496524) 1557 0 R (id2496542) 1558 0 R (id2497015) 1561 0 R (id2497140) 1567 0 R (id2497155) 1568 0 R (id2497267) 1570 0 R (id2497289) 1571 0 R (id2497305) 1572 0 R (id2497434) 1577 0 R (id2497504) 1578 0 R (id2497676) 1579 0 R (id2497738) 1580 0 R (id2498169) 1587 0 R (id2498604) 1599 0 R (id2498610) 1600 0 R (id2500077) 1609 0 R (id2500084) 1610 0 R (id2500529) 1612 0 R (id2500534) 1613 0 R (id2501479) 1619 0 R (id2501648) 1620 0 R (id2501989) 1629 0 R (id2502163) 1644 0 R (id2502312) 1645 0 R (id2502440) 1646 0 R (id2502588) 1661 0 R (id2502594) 1662 0 R (id2502605) 1663 0 R (id2502622) 1664 0 R (id2502753) 1676 0 R (id2502993) 1682 0 R (id2503180) 1687 0 R (id2503182) 1693 0 R (id2503191) 1698 0 R (id2503214) 1694 0 R (id2503238) 1696 0 R (id2503274) 1707 0 R (id2503301) 1709 0 R (id2503326) 1701 0 R (id2503351) 1703 0 R (id2503374) 1705 0 R (id2503430) 1711 0 R (id2503457) 1713 0 R (id2503483) 1715 0 R (id2503545) 1717 0 R (id2503575) 1719 0 R (id2503605) 1721 0 R (id2503632) 1723 0 R (id2503706) 1726 0 R (id2503714) 1727 0 R (id2503740) 1729 0 R (id2503845) 1731 0 R (id2503910) 1733 0 R (id2503975) 1735 0 R (id2504040) 1738 0 R (id2504049) 1739 0 R (id2504074) 1741 0 R (id2504142) 1743 0 R (id2504178) 1745 0 R (id2504218) 1753 0 R (id2504224) 1754 0 R (id2504281) 1756 0 R (id2504318) 1764 0 R (id2504354) 1758 0 R (id2504408) 1760 0 R (id2504446) 1762 0 R (id2504472) 1766 0 R (id2504498) 1768 0 R (id2504524) 1770 0 R (id2504551) 1772 0 R (id2504590) 1774 0 R (id2504620) 1776 0 R (id2504650) 1778 0 R (id2504693) 1780 0 R (id2504726) 1782 0 R (id2504753) 1784 0 R (id2504844) 1786 0 R (id2504902) 1788 0 R (id2504926) 1791 0 R (id2504934) 1792 0 R (id2504960) 1794 0 R (id2504982) 1796 0 R (id2505005) 1798 0 R (id2505051) 1800 0 R (id2505075) 1802 0 R (id2505125) 1809 0 R (id2505132) 1810 0 R (id2505156) 1812 0 R (id2505182) 1814 0 R (id2505209) 1816 0 R (id2505245) 1818 0 R (id2505286) 1821 0 R (id2505291) 1822 0 R (id2505323) 1824 0 R (id2505369) 1826 0 R (id2505404) 1828 0 R (id2505431) 1831 0 R (id2505449) 1832 0 R (id2505472) 1834 0 R (id2505497) 1836 0 R (id2505523) 1838 0 R (id2505546) 1840 0 R (id2505592) 1842 0 R (id2505616) 1844 0 R (id2505642) 1846 0 R (id2505668) 1848 0 R (id2505705) 1851 0 R (id2505712) 1852 0 R (id2505769) 1854 0 R (id2505796) 1856 0 R (id2505832) 1863 0 R (id2505844) 1864 0 R (id2505883) 1866 0 R (id2505910) 1868 0 R (id2505940) 1870 0 R (id2505965) 1872 0 R (id2505992) 1874 0 R (id2506028) 1876 0 R (id2506065) 1878 0 R (id2506091) 1880 0 R (id2506118) 1882 0 R (id2506163) 1884 0 R (id2506204) 1887 0 R (id2506282) 1889 0 R (id2506284) 1891 0 R (incremental_zone_transfers) 1078 0 R (internet_drafts) 1886 0 R (ipv6addresses) 1140 0 R (journal) 1067 0 R (lwresd) 1157 0 R (man.dig) 1897 0 R (man.dnssec-dsfromkey) 1945 0 R (man.dnssec-keyfromlabel) 1959 0 R (man.dnssec-keygen) 1976 0 R (man.dnssec-signzone) 1993 0 R (man.host) 1930 0 R (man.named) 2047 0 R (man.named-checkconf) 2019 0 R (man.named-checkzone) 2031 0 R (man.nsupdate) 2070 0 R (man.rndc) 2095 0 R (man.rndc-confgen) 2124 0 R (man.rndc.conf) 2108 0 R (notify) 1057 0 R (options) 1276 0 R (page.1) 710 0 R (page.10) 1034 0 R (page.100) 1861 0 R (page.101) 1895 0 R (page.102) 1904 0 R (page.103) 1910 0 R (page.104) 1916 0 R (page.105) 1920 0 R (page.106) 1925 0 R (page.107) 1936 0 R (page.108) 1941 0 R (page.109) 1953 0 R (page.11) 1041 0 R (page.110) 1965 0 R (page.111) 1972 0 R (page.112) 1984 0 R (page.113) 1988 0 R (page.114) 1999 0 R (page.115) 2005 0 R (page.116) 2010 0 R (page.117) 2016 0 R (page.118) 2029 0 R (page.119) 2039 0 R (page.12) 1047 0 R (page.120) 2043 0 R (page.121) 2055 0 R (page.122) 2060 0 R (page.123) 2066 0 R (page.124) 2077 0 R (page.125) 2082 0 R (page.126) 2086 0 R (page.127) 2093 0 R (page.128) 2104 0 R (page.129) 2115 0 R (page.13) 1055 0 R (page.130) 2120 0 R (page.131) 2131 0 R (page.132) 2137 0 R (page.14) 1077 0 R (page.15) 1087 0 R (page.16) 1092 0 R (page.17) 1096 0 R (page.18) 1103 0 R (page.19) 1111 0 R (page.2) 734 0 R (page.20) 1122 0 R (page.21) 1129 0 R (page.22) 1134 0 R (page.23) 1144 0 R (page.24) 1150 0 R (page.25) 1154 0 R (page.26) 1162 0 R (page.27) 1166 0 R (page.28) 1176 0 R (page.29) 1181 0 R (page.3) 971 0 R (page.30) 1189 0 R (page.31) 1197 0 R (page.32) 1207 0 R (page.33) 1216 0 R (page.34) 1227 0 R (page.35) 1232 0 R (page.36) 1238 0 R (page.37) 1244 0 R (page.38) 1249 0 R (page.39) 1257 0 R (page.4) 982 0 R (page.40) 1267 0 R (page.41) 1271 0 R (page.42) 1275 0 R (page.43) 1280 0 R (page.44) 1287 0 R (page.45) 1291 0 R (page.46) 1297 0 R (page.47) 1308 0 R (page.48) 1312 0 R (page.49) 1316 0 R (page.5) 989 0 R (page.50) 1327 0 R (page.51) 1334 0 R (page.52) 1339 0 R (page.53) 1344 0 R (page.54) 1348 0 R (page.55) 1352 0 R (page.56) 1360 0 R (page.57) 1367 0 R (page.58) 1373 0 R (page.59) 1380 0 R (page.6) 1001 0 R (page.60) 1387 0 R (page.61) 1393 0 R (page.62) 1403 0 R (page.63) 1411 0 R (page.64) 1415 0 R (page.65) 1420 0 R (page.66) 1426 0 R (page.67) 1435 0 R (page.68) 1441 0 R (page.69) 1445 0 R (page.7) 1006 0 R (page.70) 1449 0 R (page.71) 1456 0 R (page.72) 1461 0 R (page.73) 1476 0 R (page.74) 1490 0 R (page.75) 1514 0 R (page.76) 1524 0 R (page.77) 1530 0 R (page.78) 1540 0 R (page.79) 1546 0 R (page.8) 1015 0 R (page.80) 1556 0 R (page.81) 1566 0 R (page.82) 1576 0 R (page.83) 1585 0 R (page.84) 1592 0 R (page.85) 1598 0 R (page.86) 1608 0 R (page.87) 1618 0 R (page.88) 1625 0 R (page.89) 1633 0 R (page.9) 1026 0 R (page.90) 1639 0 R (page.91) 1650 0 R (page.92) 1655 0 R (page.93) 1659 0 R (page.94) 1670 0 R (page.95) 1674 0 R (page.96) 1681 0 R (page.97) 1691 0 R (page.98) 1751 0 R (page.99) 1807 0 R (page.i) 744 0 R (page.ii) 799 0 R (page.iii) 863 0 R (page.iv) 925 0 R (proposed_standards) 1083 0 R (query_address) 1340 0 R (rfcs) 967 0 R (rndc) 1212 0 R (root_delegation_only) 1472 0 R (rrset_ordering) 1022 0 R (sample_configuration) 1008 0 R (section*.10) 1820 0 R (section*.100) 2106 0 R (section*.101) 2107 0 R (section*.102) 2109 0 R (section*.103) 2110 0 R (section*.104) 2111 0 R (section*.105) 2116 0 R (section*.106) 2121 0 R (section*.107) 2122 0 R (section*.108) 2123 0 R (section*.109) 2125 0 R (section*.11) 1830 0 R (section*.110) 2126 0 R (section*.111) 2127 0 R (section*.112) 2132 0 R (section*.113) 2133 0 R (section*.114) 2138 0 R (section*.115) 2139 0 R (section*.12) 1850 0 R (section*.13) 1862 0 R (section*.14) 1888 0 R (section*.15) 1898 0 R (section*.16) 1899 0 R (section*.17) 1900 0 R (section*.18) 1905 0 R (section*.19) 1906 0 R (section*.2) 1686 0 R (section*.20) 1911 0 R (section*.21) 1921 0 R (section*.22) 1926 0 R (section*.23) 1927 0 R (section*.24) 1928 0 R (section*.25) 1929 0 R (section*.26) 1931 0 R (section*.27) 1932 0 R (section*.28) 1937 0 R (section*.29) 1942 0 R (section*.3) 1692 0 R (section*.30) 1943 0 R (section*.31) 1944 0 R (section*.32) 1946 0 R (section*.33) 1947 0 R (section*.34) 1948 0 R (section*.35) 1949 0 R (section*.36) 1954 0 R (section*.37) 1955 0 R (section*.38) 1956 0 R (section*.39) 1957 0 R (section*.4) 1700 0 R (section*.40) 1958 0 R (section*.41) 1960 0 R (section*.42) 1966 0 R (section*.43) 1967 0 R (section*.44) 1968 0 R (section*.45) 1973 0 R (section*.46) 1974 0 R (section*.47) 1975 0 R (section*.48) 1977 0 R (section*.49) 1978 0 R (section*.5) 1725 0 R (section*.50) 1979 0 R (section*.51) 1980 0 R (section*.52) 1989 0 R (section*.53) 1990 0 R (section*.54) 1991 0 R (section*.55) 1992 0 R (section*.56) 1994 0 R (section*.57) 1995 0 R (section*.58) 2000 0 R (section*.59) 2001 0 R (section*.6) 1737 0 R (section*.60) 2011 0 R (section*.61) 2012 0 R (section*.62) 2017 0 R (section*.63) 2018 0 R (section*.64) 2020 0 R (section*.65) 2021 0 R (section*.66) 2022 0 R (section*.67) 2023 0 R (section*.68) 2024 0 R (section*.69) 2025 0 R (section*.7) 1752 0 R (section*.70) 2030 0 R (section*.71) 2032 0 R (section*.72) 2033 0 R (section*.73) 2034 0 R (section*.74) 2035 0 R (section*.75) 2044 0 R (section*.76) 2045 0 R (section*.77) 2046 0 R (section*.78) 2048 0 R (section*.79) 2049 0 R (section*.8) 1790 0 R (section*.80) 2050 0 R (section*.81) 2051 0 R (section*.82) 2061 0 R (section*.83) 2062 0 R (section*.84) 2067 0 R (section*.85) 2068 0 R (section*.86) 2069 0 R (section*.87) 2071 0 R (section*.88) 2072 0 R (section*.89) 2073 0 R (section*.9) 1808 0 R (section*.90) 2078 0 R (section*.91) 2087 0 R (section*.92) 2088 0 R (section*.93) 2089 0 R (section*.94) 2094 0 R (section*.95) 2096 0 R (section*.96) 2097 0 R (section*.97) 2098 0 R (section*.98) 2099 0 R (section*.99) 2105 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 538 0 R (section.7.1) 574 0 R (section.7.2) 578 0 R (section.7.3) 590 0 R (section.8.1) 598 0 R (section.8.2) 606 0 R (section.8.3) 610 0 R (section.A.1) 618 0 R (section.A.2) 626 0 R (section.A.3) 634 0 R (section.B.1) 654 0 R (section.B.10) 690 0 R (section.B.11) 694 0 R (section.B.12) 698 0 R (section.B.13) 702 0 R (section.B.2) 658 0 R (section.B.3) 662 0 R (section.B.4) 666 0 R (section.B.5) 670 0 R (section.B.6) 674 0 R (section.B.7) 678 0 R (section.B.8) 682 0 R (section.B.9) 686 0 R (server_resource_limits) 1362 0 R (server_statement_definition_and_usage) 1304 0 R (server_statement_grammar) 1416 0 R (statistics) 1586 0 R (statistics_counters) 1594 0 R (statschannels) 1427 0 R (statsfile) 1283 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 530 0 R (subsection.6.3.7) 534 0 R (subsection.6.4.1) 546 0 R (subsection.7.2.1) 582 0 R (subsection.7.2.2) 586 0 R (subsection.8.1.1) 602 0 R (subsection.A.1.1) 622 0 R (subsection.A.2.1) 630 0 R (subsection.A.3.1) 638 0 R (subsection.A.3.2) 642 0 R (subsection.A.3.3) 646 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.3.5.4) 526 0 R (subsubsection.6.4.0.1) 542 0 R (subsubsection.6.4.1.1) 550 0 R (subsubsection.6.4.1.2) 554 0 R (subsubsection.6.4.1.3) 558 0 R (subsubsection.6.4.1.4) 562 0 R (subsubsection.6.4.1.5) 566 0 R (table.1.1) 950 0 R (table.1.2) 959 0 R (table.3.1) 1018 0 R (table.3.2) 1050 0 R (table.6.1) 1170 0 R (table.6.10) 1534 0 R (table.6.11) 1536 0 R (table.6.12) 1542 0 R (table.6.13) 1549 0 R (table.6.14) 1551 0 R (table.6.15) 1559 0 R (table.6.16) 1562 0 R (table.6.17) 1569 0 R (table.6.18) 1581 0 R (table.6.19) 1588 0 R (table.6.2) 1193 0 R (table.6.20) 1601 0 R (table.6.21) 1611 0 R (table.6.22) 1614 0 R (table.6.23) 1621 0 R (table.6.3) 1201 0 R (table.6.4) 1240 0 R (table.6.5) 1252 0 R (table.6.6) 1293 0 R (table.6.7) 1383 0 R (table.6.8) 1457 0 R (table.6.9) 1520 0 R (the_category_phrase) 1234 0 R (the_sortlist_statement) 1374 0 R (topology) 1369 0 R (tsig) 1097 0 R (tuning) 1388 0 R (types_of_resource_records_and_when_to_use_them) 966 0 R (view_statement_grammar) 1407 0 R (zone_statement_grammar) 1323 0 R (zone_transfers) 1073 0 R (zonefile_format) 1399 0 R]
+2730 0 obj <<
+/Names [(Access_Control_Lists) 2059 0 R (Bv9ARM.ch01) 1220 0 R (Bv9ARM.ch02) 1264 0 R (Bv9ARM.ch03) 1282 0 R (Bv9ARM.ch04) 1346 0 R (Bv9ARM.ch05) 1525 0 R (Bv9ARM.ch06) 1536 0 R (Bv9ARM.ch07) 2058 0 R (Bv9ARM.ch08) 2084 0 R (Bv9ARM.ch09) 2099 0 R (Bv9ARM.ch10) 2360 0 R (Configuration_File_Grammar) 1559 0 R (DNSSEC) 1412 0 R (Doc-Start) 927 0 R (Setting_TTLs) 1980 0 R (acache) 1271 0 R (access_control) 1710 0 R (acl) 1568 0 R (address_match_lists) 1541 0 R (admin_tools) 1304 0 R (appendix.A) 742 0 R (appendix.B) 834 0 R (bibliography) 2107 0 R (bind9.library) 2316 0 R (boolean_options) 1361 0 R (builtin) 1785 0 R (chapter*.1) 961 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 342 0 R (chapter.6) 354 0 R (chapter.7) 698 0 R (chapter.8) 722 0 R (cite.RFC1033) 2235 0 R (cite.RFC1034) 2120 0 R (cite.RFC1035) 2122 0 R (cite.RFC1101) 2217 0 R (cite.RFC1123) 2219 0 R (cite.RFC1183) 2179 0 R (cite.RFC1464) 2257 0 R (cite.RFC1535) 2165 0 R (cite.RFC1536) 2167 0 R (cite.RFC1537) 2237 0 R (cite.RFC1591) 2221 0 R (cite.RFC1706) 2181 0 R (cite.RFC1712) 2277 0 R (cite.RFC1713) 2259 0 R (cite.RFC1794) 2261 0 R (cite.RFC1876) 2183 0 R (cite.RFC1912) 2239 0 R (cite.RFC1982) 2169 0 R (cite.RFC1995) 2127 0 R (cite.RFC1996) 2129 0 R (cite.RFC2010) 2241 0 R (cite.RFC2052) 2185 0 R (cite.RFC2065) 2289 0 R (cite.RFC2136) 2131 0 R (cite.RFC2137) 2291 0 R (cite.RFC2163) 2187 0 R (cite.RFC2168) 2189 0 R (cite.RFC2181) 2133 0 R (cite.RFC2219) 2243 0 R (cite.RFC2230) 2191 0 R (cite.RFC2240) 2263 0 R (cite.RFC2308) 2135 0 R (cite.RFC2317) 2223 0 R (cite.RFC2345) 2265 0 R (cite.RFC2352) 2267 0 R (cite.RFC2535) 2293 0 R (cite.RFC2536) 2193 0 R (cite.RFC2537) 2195 0 R (cite.RFC2538) 2197 0 R (cite.RFC2539) 2199 0 R (cite.RFC2540) 2201 0 R (cite.RFC2671) 2137 0 R (cite.RFC2672) 2139 0 R (cite.RFC2673) 2279 0 R (cite.RFC2782) 2203 0 R (cite.RFC2825) 2247 0 R (cite.RFC2826) 2225 0 R (cite.RFC2845) 2141 0 R (cite.RFC2874) 2281 0 R (cite.RFC2915) 2205 0 R (cite.RFC2929) 2227 0 R (cite.RFC2930) 2143 0 R (cite.RFC2931) 2145 0 R (cite.RFC3007) 2147 0 R (cite.RFC3008) 2295 0 R (cite.RFC3071) 2269 0 R (cite.RFC3090) 2297 0 R (cite.RFC3110) 2207 0 R (cite.RFC3123) 2209 0 R (cite.RFC3225) 2153 0 R (cite.RFC3258) 2271 0 R (cite.RFC3445) 2299 0 R (cite.RFC3490) 2249 0 R (cite.RFC3491) 2251 0 R (cite.RFC3492) 2253 0 R (cite.RFC3596) 2211 0 R (cite.RFC3597) 2213 0 R (cite.RFC3645) 2149 0 R (cite.RFC3655) 2301 0 R (cite.RFC3658) 2303 0 R (cite.RFC3755) 2305 0 R (cite.RFC3757) 2307 0 R (cite.RFC3833) 2155 0 R (cite.RFC3845) 2309 0 R (cite.RFC3901) 2273 0 R (cite.RFC4033) 2157 0 R (cite.RFC4034) 2159 0 R (cite.RFC4035) 2161 0 R (cite.RFC4074) 2171 0 R (cite.RFC974) 2124 0 R (cite.id2511436) 2314 0 R (clients-per-query) 2034 0 R (configuration_file_elements) 1537 0 R (controls_statement_definition_and_usage) 1329 0 R (diagnostic_tools) 1252 0 R (dnssec.dynamic.zones) 1432 0 R (dynamic_update) 1356 0 R (dynamic_update_policies) 1318 0 R (dynamic_update_security) 1721 0 R (empty) 1794 0 R (historical_dns_information) 2101 0 R (id2466563) 1221 0 R (id2466586) 1222 0 R (id2467270) 1411 0 R (id2467406) 1413 0 R (id2467477) 1223 0 R (id2467486) 1224 0 R (id2467726) 1234 0 R (id2467748) 1235 0 R (id2467782) 1236 0 R (id2467866) 1239 0 R (id2467959) 1232 0 R (id2470264) 1246 0 R (id2470288) 1249 0 R (id2470386) 1250 0 R (id2470407) 1251 0 R (id2470505) 1257 0 R (id2470540) 1258 0 R (id2470567) 1259 0 R (id2470601) 1265 0 R (id2470628) 1266 0 R (id2470709) 1267 0 R (id2470734) 1270 0 R (id2470745) 1276 0 R (id2470777) 1284 0 R (id2470793) 1285 0 R (id2470816) 1290 0 R (id2470833) 1291 0 R (id2471238) 1299 0 R (id2471243) 1300 0 R (id2473326) 1334 0 R (id2473338) 1335 0 R (id2473765) 1371 0 R (id2473851) 1377 0 R (id2474284) 1393 0 R (id2474301) 1394 0 R (id2474340) 1395 0 R (id2474358) 1396 0 R (id2474369) 1397 0 R (id2474405) 1402 0 R (id2474531) 1403 0 R (id2474580) 1405 0 R (id2474594) 1406 0 R (id2475200) 1418 0 R (id2475281) 1419 0 R (id2475706) 1433 0 R (id2475744) 1434 0 R (id2475780) 1439 0 R (id2475862) 1445 0 R (id2475899) 1452 0 R (id2475912) 1453 0 R (id2475945) 1454 0 R (id2476040) 1455 0 R (id2476050) 1460 0 R (id2476059) 1461 0 R (id2476072) 1462 0 R (id2476178) 1463 0 R (id2476187) 1464 0 R (id2476224) 1466 0 R (id2476314) 1473 0 R (id2476484) 1479 0 R (id2476648) 1485 0 R (id2476786) 1486 0 R (id2476891) 1491 0 R (id2476900) 1492 0 R (id2476931) 1493 0 R (id2476986) 1494 0 R (id2477085) 1499 0 R (id2477420) 1505 0 R (id2477466) 1506 0 R (id2477521) 1511 0 R (id2477651) 1513 0 R (id2477672) 1514 0 R (id2477705) 1526 0 R (id2477921) 1538 0 R (id2478882) 1546 0 R (id2478909) 1551 0 R (id2479115) 1552 0 R (id2479130) 1553 0 R (id2479160) 1558 0 R (id2479303) 1560 0 R (id2479837) 1567 0 R (id2479880) 1569 0 R (id2480027) 1571 0 R (id2480455) 1578 0 R (id2480472) 1584 0 R (id2480496) 1585 0 R (id2480519) 1586 0 R (id2480678) 1590 0 R (id2480804) 1595 0 R (id2480856) 1596 0 R (id2481481) 1607 0 R (id2482215) 1618 0 R (id2482345) 1619 0 R (id2482666) 1625 0 R (id2482808) 1630 0 R (id2482872) 1633 0 R (id2482916) 1634 0 R (id2482931) 1635 0 R (id2486190) 1673 0 R (id2488442) 1703 0 R (id2488501) 1709 0 R (id2489121) 1720 0 R (id2490256) 1743 0 R (id2490452) 1745 0 R (id2490806) 1754 0 R (id2491308) 1772 0 R (id2492919) 1803 0 R (id2493178) 1809 0 R (id2494065) 1827 0 R (id2494273) 1833 0 R (id2494320) 1835 0 R (id2494745) 1840 0 R (id2496290) 1858 0 R (id2496297) 1859 0 R (id2496302) 1860 0 R (id2496774) 1871 0 R (id2496875) 1872 0 R (id2499008) 1939 0 R (id2499554) 1945 0 R (id2499572) 1946 0 R (id2499660) 1949 0 R (id2499829) 1955 0 R (id2500999) 1961 0 R (id2501195) 1967 0 R (id2501217) 1968 0 R (id2501579) 1970 0 R (id2501716) 1972 0 R (id2501734) 1978 0 R (id2502206) 1981 0 R (id2502331) 1983 0 R (id2502346) 1984 0 R (id2502458) 1990 0 R (id2502481) 1991 0 R (id2502497) 1992 0 R (id2502694) 1993 0 R (id2502763) 1998 0 R (id2502800) 1999 0 R (id2502875) 2000 0 R (id2503386) 2011 0 R (id2503821) 2019 0 R (id2503827) 2020 0 R (id2505363) 2028 0 R (id2505369) 2029 0 R (id2505814) 2031 0 R (id2505819) 2032 0 R (id2506768) 2039 0 R (id2506800) 2040 0 R (id2507209) 2049 0 R (id2507520) 2068 0 R (id2507601) 2069 0 R (id2507660) 2070 0 R (id2507740) 2085 0 R (id2507746) 2086 0 R (id2507757) 2087 0 R (id2507774) 2088 0 R (id2507973) 2100 0 R (id2508213) 2106 0 R (id2508401) 2111 0 R (id2508403) 2118 0 R (id2508411) 2123 0 R (id2508435) 2119 0 R (id2508458) 2121 0 R (id2508494) 2132 0 R (id2508521) 2134 0 R (id2508547) 2126 0 R (id2508571) 2128 0 R (id2508595) 2130 0 R (id2508650) 2136 0 R (id2508677) 2138 0 R (id2508704) 2140 0 R (id2508765) 2142 0 R (id2508795) 2144 0 R (id2508825) 2146 0 R (id2508852) 2148 0 R (id2508926) 2151 0 R (id2508934) 2152 0 R (id2508961) 2154 0 R (id2508997) 2156 0 R (id2509062) 2158 0 R (id2509127) 2160 0 R (id2509192) 2163 0 R (id2509201) 2164 0 R (id2509226) 2166 0 R (id2509294) 2168 0 R (id2509330) 2170 0 R (id2509438) 2177 0 R (id2509444) 2178 0 R (id2509501) 2180 0 R (id2509539) 2188 0 R (id2509574) 2182 0 R (id2509628) 2184 0 R (id2509667) 2186 0 R (id2509692) 2190 0 R (id2509718) 2192 0 R (id2509745) 2194 0 R (id2509840) 2196 0 R (id2509879) 2198 0 R (id2509909) 2200 0 R (id2509939) 2202 0 R (id2509981) 2204 0 R (id2510014) 2206 0 R (id2510041) 2208 0 R (id2510065) 2210 0 R (id2510122) 2212 0 R (id2510147) 2215 0 R (id2510154) 2216 0 R (id2510180) 2218 0 R (id2510202) 2220 0 R (id2510226) 2222 0 R (id2510272) 2224 0 R (id2510295) 2226 0 R (id2510345) 2233 0 R (id2510353) 2234 0 R (id2510376) 2236 0 R (id2510403) 2238 0 R (id2510429) 2240 0 R (id2510466) 2242 0 R (id2510506) 2245 0 R (id2510512) 2246 0 R (id2510544) 2248 0 R (id2510589) 2250 0 R (id2510625) 2252 0 R (id2510651) 2255 0 R (id2510669) 2256 0 R (id2510692) 2258 0 R (id2510717) 2260 0 R (id2510743) 2262 0 R (id2510766) 2264 0 R (id2510812) 2266 0 R (id2510836) 2268 0 R (id2510862) 2270 0 R (id2510888) 2272 0 R (id2510925) 2275 0 R (id2510932) 2276 0 R (id2510989) 2278 0 R (id2511016) 2280 0 R (id2511052) 2287 0 R (id2511064) 2288 0 R (id2511104) 2290 0 R (id2511130) 2292 0 R (id2511160) 2294 0 R (id2511186) 2296 0 R (id2511212) 2298 0 R (id2511249) 2300 0 R (id2511285) 2302 0 R (id2511312) 2304 0 R (id2511338) 2306 0 R (id2511383) 2308 0 R (id2511425) 2311 0 R (id2511434) 2313 0 R (id2511436) 2315 0 R (id2511524) 2321 0 R (id2511533) 2322 0 R (id2511558) 2323 0 R (id2511589) 2324 0 R (id2511734) 2329 0 R (id2511829) 2331 0 R (id2511837) 2332 0 R (id2511928) 2338 0 R (id2511981) 2339 0 R (id2512045) 2340 0 R (id2512060) 2345 0 R (id2512260) 2350 0 R (id2512392) 2351 0 R (incremental_zone_transfers) 1368 0 R (internet_drafts) 2310 0 R (ipv6addresses) 1515 0 R (journal) 1367 0 R (lwresd) 1527 0 R (man.arpaname) 2670 0 R (man.ddns-confgen) 2655 0 R (man.dig) 2361 0 R (man.dnssec-dsfromkey) 2409 0 R (man.dnssec-keyfromlabel) 2428 0 R (man.dnssec-keygen) 1446 0 R (man.dnssec-revoke) 2471 0 R (man.dnssec-settime) 1447 0 R (man.dnssec-signzone) 2498 0 R (man.genrandom) 2676 0 R (man.host) 2394 0 R (man.isc-hmac-fixup) 2687 0 R (man.named) 2556 0 R (man.named-checkconf) 2523 0 R (man.named-checkzone) 2535 0 R (man.named-journalprint) 2578 0 R (man.nsec3hash) 2698 0 R (man.nsupdate) 2584 0 R (man.rndc) 2610 0 R (man.rndc-confgen) 2642 0 R (man.rndc.conf) 2626 0 R (managed-keys) 1468 0 R (notify) 1347 0 R (options) 1317 0 R (page.1) 926 0 R (page.10) 1308 0 R (page.100) 1954 0 R (page.101) 1960 0 R (page.102) 1966 0 R (page.103) 1977 0 R (page.104) 1989 0 R (page.105) 1997 0 R (page.106) 2005 0 R (page.107) 2009 0 R (page.108) 2017 0 R (page.109) 2026 0 R (page.11) 1322 0 R (page.110) 2038 0 R (page.111) 2045 0 R (page.112) 2053 0 R (page.113) 2057 0 R (page.114) 2063 0 R (page.115) 2075 0 R (page.116) 2079 0 R (page.117) 2083 0 R (page.118) 2094 0 R (page.119) 2098 0 R (page.12) 1326 0 R (page.120) 2105 0 R (page.121) 2116 0 R (page.122) 2175 0 R (page.123) 2231 0 R (page.124) 2285 0 R (page.125) 2320 0 R (page.126) 2328 0 R (page.127) 2337 0 R (page.128) 2344 0 R (page.129) 2349 0 R (page.13) 1333 0 R (page.130) 2355 0 R (page.131) 2359 0 R (page.132) 2368 0 R (page.133) 2375 0 R (page.134) 2380 0 R (page.135) 2384 0 R (page.136) 2389 0 R (page.137) 2400 0 R (page.138) 2405 0 R (page.139) 2418 0 R (page.14) 1340 0 R (page.140) 2427 0 R (page.141) 2436 0 R (page.142) 2441 0 R (page.143) 2450 0 R (page.144) 2456 0 R (page.145) 2461 0 R (page.146) 2467 0 R (page.147) 2478 0 R (page.148) 2488 0 R (page.149) 2494 0 R (page.15) 1345 0 R (page.150) 2505 0 R (page.151) 2511 0 R (page.152) 2515 0 R (page.153) 2519 0 R (page.154) 2530 0 R (page.155) 2541 0 R (page.156) 2547 0 R (page.157) 2553 0 R (page.158) 2564 0 R (page.159) 2568 0 R (page.16) 1366 0 R (page.160) 2575 0 R (page.161) 2589 0 R (page.162) 2595 0 R (page.163) 2601 0 R (page.164) 2606 0 R (page.165) 2615 0 R (page.166) 2623 0 R (page.167) 2633 0 R (page.168) 2638 0 R (page.169) 2651 0 R (page.17) 1376 0 R (page.170) 2660 0 R (page.171) 2668 0 R (page.172) 2683 0 R (page.173) 2695 0 R (page.18) 1382 0 R (page.19) 1387 0 R (page.2) 950 0 R (page.20) 1392 0 R (page.21) 1401 0 R (page.22) 1410 0 R (page.23) 1417 0 R (page.24) 1423 0 R (page.25) 1428 0 R (page.26) 1438 0 R (page.27) 1451 0 R (page.28) 1459 0 R (page.29) 1472 0 R (page.3) 1245 0 R (page.30) 1478 0 R (page.31) 1484 0 R (page.32) 1490 0 R (page.33) 1498 0 R (page.34) 1504 0 R (page.35) 1510 0 R (page.36) 1519 0 R (page.37) 1524 0 R (page.38) 1531 0 R (page.39) 1535 0 R (page.4) 1256 0 R (page.40) 1545 0 R (page.41) 1550 0 R (page.42) 1557 0 R (page.43) 1566 0 R (page.44) 1575 0 R (page.45) 1583 0 R (page.46) 1594 0 R (page.47) 1600 0 R (page.48) 1606 0 R (page.49) 1613 0 R (page.5) 1263 0 R (page.50) 1617 0 R (page.51) 1624 0 R (page.52) 1629 0 R (page.53) 1639 0 R (page.54) 1643 0 R (page.55) 1648 0 R (page.56) 1652 0 R (page.57) 1656 0 R (page.58) 1662 0 R (page.59) 1667 0 R (page.6) 1275 0 R (page.60) 1672 0 R (page.61) 1679 0 R (page.62) 1684 0 R (page.63) 1694 0 R (page.64) 1698 0 R (page.65) 1702 0 R (page.66) 1707 0 R (page.67) 1717 0 R (page.68) 1725 0 R (page.69) 1730 0 R (page.7) 1281 0 R (page.70) 1734 0 R (page.71) 1738 0 R (page.72) 1742 0 R (page.73) 1751 0 R (page.74) 1758 0 R (page.75) 1763 0 R (page.76) 1770 0 R (page.77) 1778 0 R (page.78) 1783 0 R (page.79) 1793 0 R (page.8) 1289 0 R (page.80) 1798 0 R (page.81) 1802 0 R (page.82) 1808 0 R (page.83) 1813 0 R (page.84) 1818 0 R (page.85) 1824 0 R (page.86) 1832 0 R (page.87) 1839 0 R (page.88) 1844 0 R (page.89) 1848 0 R (page.9) 1298 0 R (page.90) 1852 0 R (page.91) 1857 0 R (page.92) 1865 0 R (page.93) 1869 0 R (page.94) 1884 0 R (page.95) 1898 0 R (page.96) 1910 0 R (page.97) 1931 0 R (page.98) 1938 0 R (page.99) 1944 0 R (page.i) 960 0 R (page.ii) 1015 0 R (page.iii) 1079 0 R (page.iv) 1142 0 R (page.v) 1204 0 R (pkcs11) 1474 0 R (proposed_standards) 1372 0 R (query_address) 1726 0 R (rfc5011.support) 1465 0 R (rfcs) 1241 0 R (rndc) 1579 0 R (root_delegation_only) 1880 0 R (rrset_ordering) 1294 0 R (sample_configuration) 1283 0 R (section*.10) 2244 0 R (section*.100) 2576 0 R (section*.101) 2577 0 R (section*.102) 2579 0 R (section*.103) 2580 0 R (section*.104) 2581 0 R (section*.105) 2582 0 R (section*.106) 2583 0 R (section*.107) 2585 0 R (section*.108) 2590 0 R (section*.109) 2591 0 R (section*.11) 2254 0 R (section*.110) 2596 0 R (section*.111) 2602 0 R (section*.112) 2607 0 R (section*.113) 2608 0 R (section*.114) 2609 0 R (section*.115) 2611 0 R (section*.116) 2616 0 R (section*.117) 2617 0 R (section*.118) 2618 0 R (section*.119) 2619 0 R (section*.12) 2274 0 R (section*.120) 2624 0 R (section*.121) 2625 0 R (section*.122) 2627 0 R (section*.123) 2628 0 R (section*.124) 2629 0 R (section*.125) 2634 0 R (section*.126) 2639 0 R (section*.127) 2640 0 R (section*.128) 2641 0 R (section*.129) 2643 0 R (section*.13) 2286 0 R (section*.130) 2644 0 R (section*.131) 2645 0 R (section*.132) 2646 0 R (section*.133) 2652 0 R (section*.134) 2653 0 R (section*.135) 2654 0 R (section*.136) 2656 0 R (section*.137) 2661 0 R (section*.138) 2662 0 R (section*.139) 2663 0 R (section*.14) 2312 0 R (section*.140) 2664 0 R (section*.141) 2669 0 R (section*.142) 2671 0 R (section*.143) 2672 0 R (section*.144) 2673 0 R (section*.145) 2674 0 R (section*.146) 2675 0 R (section*.147) 2677 0 R (section*.148) 2678 0 R (section*.149) 2679 0 R (section*.15) 2362 0 R (section*.150) 2684 0 R (section*.151) 2685 0 R (section*.152) 2686 0 R (section*.153) 2688 0 R (section*.154) 2689 0 R (section*.155) 2690 0 R (section*.156) 2691 0 R (section*.157) 2696 0 R (section*.158) 2697 0 R (section*.159) 2699 0 R (section*.16) 2363 0 R (section*.160) 2700 0 R (section*.161) 2701 0 R (section*.162) 2702 0 R (section*.163) 2703 0 R (section*.164) 2704 0 R (section*.17) 2364 0 R (section*.18) 2369 0 R (section*.19) 2370 0 R (section*.2) 2110 0 R (section*.20) 2376 0 R (section*.21) 2385 0 R (section*.22) 2390 0 R (section*.23) 2391 0 R (section*.24) 2392 0 R (section*.25) 2393 0 R (section*.26) 2395 0 R (section*.27) 2396 0 R (section*.28) 2401 0 R (section*.29) 2406 0 R (section*.3) 2117 0 R (section*.30) 2407 0 R (section*.31) 2408 0 R (section*.32) 2410 0 R (section*.33) 2411 0 R (section*.34) 2412 0 R (section*.35) 2413 0 R (section*.36) 2419 0 R (section*.37) 2420 0 R (section*.38) 2421 0 R (section*.39) 2422 0 R (section*.4) 2125 0 R (section*.40) 2423 0 R (section*.41) 2429 0 R (section*.42) 2430 0 R (section*.43) 2431 0 R (section*.44) 2432 0 R (section*.45) 2437 0 R (section*.46) 2442 0 R (section*.47) 2443 0 R (section*.48) 2444 0 R (section*.49) 2445 0 R (section*.5) 2150 0 R (section*.50) 2446 0 R (section*.51) 2451 0 R (section*.52) 2452 0 R (section*.53) 2462 0 R (section*.54) 2463 0 R (section*.55) 2468 0 R (section*.56) 2469 0 R (section*.57) 2470 0 R (section*.58) 2472 0 R (section*.59) 2473 0 R (section*.6) 2162 0 R (section*.60) 2474 0 R (section*.61) 2479 0 R (section*.62) 2480 0 R (section*.63) 2481 0 R (section*.64) 2482 0 R (section*.65) 2483 0 R (section*.66) 2484 0 R (section*.67) 2489 0 R (section*.68) 2490 0 R (section*.69) 2495 0 R (section*.7) 2176 0 R (section*.70) 2496 0 R (section*.71) 2497 0 R (section*.72) 2499 0 R (section*.73) 2500 0 R (section*.74) 2501 0 R (section*.75) 2506 0 R (section*.76) 2520 0 R (section*.77) 2521 0 R (section*.78) 2522 0 R (section*.79) 2524 0 R (section*.8) 2214 0 R (section*.80) 2525 0 R (section*.81) 2526 0 R (section*.82) 2531 0 R (section*.83) 2532 0 R (section*.84) 2533 0 R (section*.85) 2534 0 R (section*.86) 2536 0 R (section*.87) 2537 0 R (section*.88) 2542 0 R (section*.89) 2543 0 R (section*.9) 2232 0 R (section*.90) 2548 0 R (section*.91) 2554 0 R (section*.92) 2555 0 R (section*.93) 2557 0 R (section*.94) 2558 0 R (section*.95) 2559 0 R (section*.96) 2560 0 R (section*.97) 2569 0 R (section*.98) 2570 0 R (section*.99) 2571 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.10) 274 0 R (section.4.11) 286 0 R (section.4.12) 330 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 346 0 R (section.5.2) 350 0 R (section.6.1) 358 0 R (section.6.2) 386 0 R (section.6.3) 610 0 R (section.6.4) 666 0 R (section.7.1) 702 0 R (section.7.2) 706 0 R (section.7.3) 718 0 R (section.8.1) 726 0 R (section.8.2) 734 0 R (section.8.3) 738 0 R (section.A.1) 746 0 R (section.A.2) 754 0 R (section.A.3) 762 0 R (section.A.4) 778 0 R (section.B.1) 838 0 R (section.B.10) 874 0 R (section.B.11) 878 0 R (section.B.12) 882 0 R (section.B.13) 886 0 R (section.B.14) 890 0 R (section.B.15) 894 0 R (section.B.16) 898 0 R (section.B.17) 902 0 R (section.B.18) 906 0 R (section.B.19) 910 0 R (section.B.2) 842 0 R (section.B.20) 914 0 R (section.B.21) 918 0 R (section.B.3) 846 0 R (section.B.4) 850 0 R (section.B.5) 854 0 R (section.B.6) 858 0 R (section.B.7) 862 0 R (section.B.8) 866 0 R (section.B.9) 870 0 R (server_resource_limits) 1752 0 R (server_statement_definition_and_usage) 1690 0 R (server_statement_grammar) 1814 0 R (statistics) 2010 0 R (statistics_counters) 2018 0 R (statschannels) 1826 0 R (statsfile) 1658 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.10.1) 278 0 R (subsection.4.10.2) 282 0 R (subsection.4.11.1) 290 0 R (subsection.4.11.2) 302 0 R (subsection.4.11.3) 314 0 R (subsection.4.11.4) 318 0 R (subsection.4.11.5) 322 0 R (subsection.4.11.6) 326 0 R (subsection.4.12.1) 334 0 R (subsection.4.12.2) 338 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.10) 258 0 R (subsection.4.9.11) 262 0 R (subsection.4.9.12) 266 0 R (subsection.4.9.13) 270 0 R (subsection.4.9.2) 226 0 R (subsection.4.9.3) 230 0 R (subsection.4.9.4) 234 0 R (subsection.4.9.5) 238 0 R (subsection.4.9.6) 242 0 R (subsection.4.9.7) 246 0 R (subsection.4.9.8) 250 0 R (subsection.4.9.9) 254 0 R (subsection.6.1.1) 362 0 R (subsection.6.1.2) 374 0 R (subsection.6.2.1) 390 0 R (subsection.6.2.10) 426 0 R (subsection.6.2.11) 442 0 R (subsection.6.2.12) 446 0 R (subsection.6.2.13) 450 0 R (subsection.6.2.14) 454 0 R (subsection.6.2.15) 458 0 R (subsection.6.2.16) 462 0 R (subsection.6.2.17) 546 0 R (subsection.6.2.18) 550 0 R (subsection.6.2.19) 554 0 R (subsection.6.2.2) 394 0 R (subsection.6.2.20) 558 0 R (subsection.6.2.21) 562 0 R (subsection.6.2.22) 566 0 R (subsection.6.2.23) 570 0 R (subsection.6.2.24) 574 0 R (subsection.6.2.25) 578 0 R (subsection.6.2.26) 582 0 R (subsection.6.2.27) 586 0 R (subsection.6.2.28) 590 0 R (subsection.6.2.3) 398 0 R (subsection.6.2.4) 402 0 R (subsection.6.2.5) 406 0 R (subsection.6.2.6) 410 0 R (subsection.6.2.7) 414 0 R (subsection.6.2.8) 418 0 R (subsection.6.2.9) 422 0 R (subsection.6.3.1) 614 0 R (subsection.6.3.2) 626 0 R (subsection.6.3.3) 630 0 R (subsection.6.3.4) 634 0 R (subsection.6.3.5) 638 0 R (subsection.6.3.6) 658 0 R (subsection.6.3.7) 662 0 R (subsection.6.4.1) 674 0 R (subsection.7.2.1) 710 0 R (subsection.7.2.2) 714 0 R (subsection.8.1.1) 730 0 R (subsection.A.1.1) 750 0 R (subsection.A.2.1) 758 0 R (subsection.A.3.1) 766 0 R (subsection.A.3.2) 770 0 R (subsection.A.3.3) 774 0 R (subsection.A.4.1) 782 0 R (subsection.A.4.2) 786 0 R (subsection.A.4.3) 790 0 R (subsection.A.4.4) 794 0 R (subsection.A.4.5) 798 0 R (subsection.A.4.6) 802 0 R (subsection.A.4.7) 830 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.11.1.1) 294 0 R (subsubsection.4.11.1.2) 298 0 R (subsubsection.4.11.2.1) 306 0 R (subsubsection.4.11.2.2) 310 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 366 0 R (subsubsection.6.1.1.2) 370 0 R (subsubsection.6.1.2.1) 378 0 R (subsubsection.6.1.2.2) 382 0 R (subsubsection.6.2.10.1) 430 0 R (subsubsection.6.2.10.2) 434 0 R (subsubsection.6.2.10.3) 438 0 R (subsubsection.6.2.16.1) 466 0 R (subsubsection.6.2.16.10) 502 0 R (subsubsection.6.2.16.11) 506 0 R (subsubsection.6.2.16.12) 510 0 R (subsubsection.6.2.16.13) 514 0 R (subsubsection.6.2.16.14) 518 0 R (subsubsection.6.2.16.15) 522 0 R (subsubsection.6.2.16.16) 526 0 R (subsubsection.6.2.16.17) 530 0 R (subsubsection.6.2.16.18) 534 0 R (subsubsection.6.2.16.19) 538 0 R (subsubsection.6.2.16.2) 470 0 R (subsubsection.6.2.16.20) 542 0 R (subsubsection.6.2.16.3) 474 0 R (subsubsection.6.2.16.4) 478 0 R (subsubsection.6.2.16.5) 482 0 R (subsubsection.6.2.16.6) 486 0 R (subsubsection.6.2.16.7) 490 0 R (subsubsection.6.2.16.8) 494 0 R (subsubsection.6.2.16.9) 498 0 R (subsubsection.6.2.28.1) 594 0 R (subsubsection.6.2.28.2) 598 0 R (subsubsection.6.2.28.3) 602 0 R (subsubsection.6.2.28.4) 606 0 R (subsubsection.6.3.1.1) 618 0 R (subsubsection.6.3.1.2) 622 0 R (subsubsection.6.3.5.1) 642 0 R (subsubsection.6.3.5.2) 646 0 R (subsubsection.6.3.5.3) 650 0 R (subsubsection.6.3.5.4) 654 0 R (subsubsection.6.4.0.1) 670 0 R (subsubsection.6.4.1.1) 678 0 R (subsubsection.6.4.1.2) 682 0 R (subsubsection.6.4.1.3) 686 0 R (subsubsection.6.4.1.4) 690 0 R (subsubsection.6.4.1.5) 694 0 R (subsubsection.A.4.6.1) 806 0 R (subsubsection.A.4.6.2) 810 0 R (subsubsection.A.4.6.3) 814 0 R (subsubsection.A.4.6.4) 818 0 R (subsubsection.A.4.6.5) 822 0 R (subsubsection.A.4.6.6) 826 0 R (table.1.1) 1225 0 R (table.1.2) 1233 0 R (table.3.1) 1292 0 R (table.3.2) 1336 0 R (table.6.1) 1539 0 R (table.6.10) 1950 0 R (table.6.11) 1956 0 R (table.6.12) 1962 0 R (table.6.13) 1969 0 R (table.6.14) 1971 0 R (table.6.15) 1979 0 R (table.6.16) 1982 0 R (table.6.17) 1985 0 R (table.6.18) 2001 0 R (table.6.19) 2012 0 R (table.6.2) 1561 0 R (table.6.20) 2021 0 R (table.6.21) 2030 0 R (table.6.22) 2033 0 R (table.6.23) 2041 0 R (table.6.3) 1570 0 R (table.6.4) 1608 0 R (table.6.5) 1620 0 R (table.6.6) 1674 0 R (table.6.7) 1773 0 R (table.6.8) 1861 0 R (table.6.9) 1940 0 R (the_category_phrase) 1602 0 R (the_sortlist_statement) 1764 0 R (topology) 1759 0 R (trusted-keys) 1828 0 R (tsig) 1388 0 R (tuning) 1774 0 R (types_of_resource_records_and_when_to_use_them) 1240 0 R (view_statement_grammar) 1789 0 R (zone_statement_grammar) 1713 0 R (zone_transfers) 1362 0 R (zonefile_format) 1788 0 R]
/Limits [(Access_Control_Lists) (zonefile_format)]
>> endobj
-2165 0 obj <<
-/Kids [2164 0 R]
+2731 0 obj <<
+/Kids [2730 0 R]
>> endobj
-2166 0 obj <<
-/Dests 2165 0 R
+2732 0 obj <<
+/Dests 2731 0 R
>> endobj
-2167 0 obj <<
+2733 0 obj <<
/Type /Catalog
-/Pages 2162 0 R
-/Outlines 2163 0 R
-/Names 2166 0 R
+/Pages 2728 0 R
+/Outlines 2729 0 R
+/Names 2732 0 R
/PageMode /UseOutlines
-/OpenAction 705 0 R
+/OpenAction 921 0 R
>> endobj
-2168 0 obj <<
+2734 0 obj <<
/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords()
-/CreationDate (D:20100910020422Z)
+/CreationDate (D:20110609034043Z)
/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4)
>> endobj
xref
-0 2169
+0 2735
0000000001 65535 f
0000000002 00000 f
0000000003 00000 f
0000000004 00000 f
0000000000 00000 f
0000000009 00000 n
-0000328752 00000 n
-0001011409 00000 n
+0000347882 00000 n
+0001171649 00000 n
0000000054 00000 n
0000000086 00000 n
-0000328876 00000 n
-0001011337 00000 n
+0000348009 00000 n
+0001171577 00000 n
0000000133 00000 n
0000000173 00000 n
-0000329001 00000 n
-0001011251 00000 n
+0000348137 00000 n
+0001171491 00000 n
0000000221 00000 n
0000000273 00000 n
-0000329126 00000 n
-0001011165 00000 n
+0000348265 00000 n
+0001171405 00000 n
0000000321 00000 n
0000000377 00000 n
-0000333388 00000 n
-0001011055 00000 n
+0000352551 00000 n
+0001171295 00000 n
0000000425 00000 n
0000000478 00000 n
-0000333512 00000 n
-0001010981 00000 n
+0000352678 00000 n
+0001171221 00000 n
0000000531 00000 n
0000000572 00000 n
-0000333637 00000 n
-0001010894 00000 n
+0000352806 00000 n
+0001171134 00000 n
0000000625 00000 n
0000000674 00000 n
-0000333761 00000 n
-0001010807 00000 n
+0000352933 00000 n
+0001171047 00000 n
0000000727 00000 n
0000000757 00000 n
-0000338040 00000 n
-0001010683 00000 n
+0000357230 00000 n
+0001170923 00000 n
0000000810 00000 n
0000000861 00000 n
-0000338165 00000 n
-0001010609 00000 n
+0000357358 00000 n
+0001170849 00000 n
0000000919 00000 n
0000000964 00000 n
-0000338290 00000 n
-0001010522 00000 n
+0000357486 00000 n
+0001170762 00000 n
0000001022 00000 n
0000001062 00000 n
-0000338415 00000 n
-0001010448 00000 n
+0000357614 00000 n
+0001170688 00000 n
0000001120 00000 n
0000001162 00000 n
-0000341386 00000 n
-0001010324 00000 n
+0000360599 00000 n
+0001170564 00000 n
0000001215 00000 n
0000001260 00000 n
-0000341511 00000 n
-0001010263 00000 n
+0000360727 00000 n
+0001170503 00000 n
0000001318 00000 n
0000001355 00000 n
-0000341636 00000 n
-0001010189 00000 n
+0000360855 00000 n
+0001170429 00000 n
0000001408 00000 n
0000001463 00000 n
-0000344566 00000 n
-0001010064 00000 n
+0000363802 00000 n
+0001170304 00000 n
0000001509 00000 n
0000001556 00000 n
-0000344691 00000 n
-0001009990 00000 n
+0000363930 00000 n
+0001170230 00000 n
0000001604 00000 n
0000001648 00000 n
-0000344816 00000 n
-0001009903 00000 n
+0000364058 00000 n
+0001170143 00000 n
0000001696 00000 n
0000001735 00000 n
-0000344941 00000 n
-0001009816 00000 n
+0000364186 00000 n
+0001170056 00000 n
0000001783 00000 n
0000001825 00000 n
-0000345065 00000 n
-0001009729 00000 n
+0000364313 00000 n
+0001169969 00000 n
0000001873 00000 n
0000001936 00000 n
-0000346148 00000 n
-0001009655 00000 n
+0000365390 00000 n
+0001169895 00000 n
0000001984 00000 n
0000002034 00000 n
-0000347859 00000 n
-0001009527 00000 n
+0000367049 00000 n
+0001169767 00000 n
0000002080 00000 n
0000002126 00000 n
-0000347986 00000 n
-0001009414 00000 n
+0000367176 00000 n
+0001169654 00000 n
0000002174 00000 n
0000002218 00000 n
-0000348114 00000 n
-0001009338 00000 n
+0000367304 00000 n
+0001169578 00000 n
0000002271 00000 n
0000002323 00000 n
-0000348242 00000 n
-0001009261 00000 n
+0000367432 00000 n
+0001169501 00000 n
0000002377 00000 n
0000002436 00000 n
-0000350787 00000 n
-0001009170 00000 n
+0000369881 00000 n
+0001169410 00000 n
0000002485 00000 n
0000002523 00000 n
-0000351046 00000 n
-0001009053 00000 n
+0000373219 00000 n
+0001169293 00000 n
0000002572 00000 n
0000002618 00000 n
-0000351175 00000 n
-0001008935 00000 n
+0000373347 00000 n
+0001169175 00000 n
0000002672 00000 n
0000002739 00000 n
-0000354406 00000 n
-0001008856 00000 n
+0000373475 00000 n
+0001169096 00000 n
0000002798 00000 n
0000002842 00000 n
-0000354534 00000 n
-0001008777 00000 n
+0000373604 00000 n
+0001169017 00000 n
0000002901 00000 n
0000002949 00000 n
-0000365183 00000 n
-0001008698 00000 n
+0000388343 00000 n
+0001168938 00000 n
0000003003 00000 n
0000003036 00000 n
-0000370204 00000 n
-0001008566 00000 n
+0000393969 00000 n
+0001168805 00000 n
0000003083 00000 n
0000003126 00000 n
-0000370333 00000 n
-0001008487 00000 n
+0000394098 00000 n
+0001168726 00000 n
0000003175 00000 n
0000003205 00000 n
-0000370462 00000 n
-0001008355 00000 n
+0000394227 00000 n
+0001168594 00000 n
0000003254 00000 n
0000003292 00000 n
-0000370591 00000 n
-0001008290 00000 n
+0000398736 00000 n
+0001168529 00000 n
0000003346 00000 n
0000003388 00000 n
-0000374998 00000 n
-0001008197 00000 n
+0000398865 00000 n
+0001168436 00000 n
0000003437 00000 n
0000003496 00000 n
-0000375127 00000 n
-0001008065 00000 n
+0000398994 00000 n
+0001168304 00000 n
0000003545 00000 n
0000003578 00000 n
-0000375256 00000 n
-0001008000 00000 n
+0000402912 00000 n
+0001168239 00000 n
0000003632 00000 n
0000003681 00000 n
-0000382582 00000 n
-0001007868 00000 n
+0000405926 00000 n
+0001168107 00000 n
0000003730 00000 n
0000003758 00000 n
-0000382711 00000 n
-0001007750 00000 n
+0000408706 00000 n
+0001167989 00000 n
0000003812 00000 n
0000003881 00000 n
-0000382840 00000 n
-0001007671 00000 n
+0000408835 00000 n
+0001167910 00000 n
0000003940 00000 n
0000003988 00000 n
-0000385631 00000 n
-0001007592 00000 n
+0000408963 00000 n
+0001167831 00000 n
0000004047 00000 n
0000004092 00000 n
-0000385760 00000 n
-0001007499 00000 n
+0000409092 00000 n
+0001167738 00000 n
0000004146 00000 n
0000004214 00000 n
-0000385889 00000 n
-0001007406 00000 n
+0000409221 00000 n
+0001167645 00000 n
0000004268 00000 n
0000004338 00000 n
-0000386018 00000 n
-0001007313 00000 n
+0000412890 00000 n
+0001167552 00000 n
0000004392 00000 n
0000004455 00000 n
-0000389940 00000 n
-0001007220 00000 n
+0000413019 00000 n
+0001167459 00000 n
0000004509 00000 n
0000004564 00000 n
-0000390069 00000 n
-0001007141 00000 n
+0000413147 00000 n
+0001167380 00000 n
0000004618 00000 n
0000004650 00000 n
-0000390198 00000 n
-0001007048 00000 n
+0000413275 00000 n
+0001167287 00000 n
0000004699 00000 n
0000004727 00000 n
-0000390327 00000 n
-0001006955 00000 n
+0000417044 00000 n
+0001167194 00000 n
0000004776 00000 n
0000004808 00000 n
-0000394104 00000 n
-0001006823 00000 n
+0000417173 00000 n
+0001167062 00000 n
0000004857 00000 n
0000004887 00000 n
-0000394233 00000 n
-0001006744 00000 n
+0000417302 00000 n
+0001166983 00000 n
0000004941 00000 n
0000004982 00000 n
-0000394362 00000 n
-0001006651 00000 n
+0000421100 00000 n
+0001166890 00000 n
0000005036 00000 n
0000005078 00000 n
-0000397957 00000 n
-0001006572 00000 n
+0000421229 00000 n
+0001166811 00000 n
0000005132 00000 n
0000005177 00000 n
-0000401403 00000 n
-0001006454 00000 n
+0000426552 00000 n
+0001166678 00000 n
0000005226 00000 n
-0000005272 00000 n
-0000403004 00000 n
-0001006375 00000 n
-0000005326 00000 n
-0000005386 00000 n
-0000403133 00000 n
-0001006296 00000 n
-0000005440 00000 n
-0000005509 00000 n
-0000405940 00000 n
-0001006163 00000 n
-0000005556 00000 n
-0000005609 00000 n
-0000406069 00000 n
-0001006084 00000 n
-0000005658 00000 n
-0000005714 00000 n
-0000406198 00000 n
-0001006005 00000 n
-0000005763 00000 n
-0000005812 00000 n
-0000410382 00000 n
-0001005872 00000 n
-0000005859 00000 n
-0000005911 00000 n
-0000410511 00000 n
-0001005754 00000 n
-0000005960 00000 n
-0000006011 00000 n
-0000415203 00000 n
-0001005636 00000 n
-0000006065 00000 n
-0000006110 00000 n
-0000415331 00000 n
-0001005557 00000 n
-0000006169 00000 n
-0000006203 00000 n
-0000418952 00000 n
-0001005478 00000 n
-0000006262 00000 n
-0000006310 00000 n
-0000419080 00000 n
-0001005360 00000 n
-0000006364 00000 n
-0000006404 00000 n
-0000419209 00000 n
-0001005281 00000 n
-0000006463 00000 n
-0000006497 00000 n
-0000423146 00000 n
-0001005202 00000 n
-0000006556 00000 n
-0000006604 00000 n
-0000423275 00000 n
-0001005069 00000 n
-0000006653 00000 n
-0000006703 00000 n
-0000426095 00000 n
-0001004990 00000 n
-0000006757 00000 n
-0000006804 00000 n
-0000426223 00000 n
-0001004897 00000 n
-0000006858 00000 n
-0000006918 00000 n
-0000426482 00000 n
-0001004804 00000 n
-0000006972 00000 n
-0000007024 00000 n
-0000431831 00000 n
-0001004711 00000 n
-0000007078 00000 n
-0000007143 00000 n
-0000431960 00000 n
-0001004618 00000 n
-0000007197 00000 n
-0000007248 00000 n
-0000432089 00000 n
-0001004525 00000 n
-0000007302 00000 n
-0000007366 00000 n
-0000435541 00000 n
-0001004432 00000 n
-0000007420 00000 n
-0000007467 00000 n
-0000435670 00000 n
-0001004339 00000 n
-0000007521 00000 n
-0000007581 00000 n
-0000435799 00000 n
-0001004246 00000 n
-0000007635 00000 n
-0000007686 00000 n
-0000435928 00000 n
-0001004114 00000 n
-0000007741 00000 n
-0000007806 00000 n
-0000440159 00000 n
-0001004035 00000 n
-0000007866 00000 n
-0000007913 00000 n
-0000446716 00000 n
-0001003942 00000 n
-0000007973 00000 n
-0000008021 00000 n
-0000454268 00000 n
-0001003863 00000 n
-0000008081 00000 n
-0000008135 00000 n
-0000454527 00000 n
-0001003770 00000 n
-0000008190 00000 n
+0000005294 00000 n
+0000426681 00000 n
+0001166599 00000 n
+0000005348 00000 n
+0000005408 00000 n
+0000426810 00000 n
+0001166506 00000 n
+0000005462 00000 n
+0000005513 00000 n
+0000430749 00000 n
+0001166413 00000 n
+0000005567 00000 n
+0000005621 00000 n
+0000430877 00000 n
+0001166320 00000 n
+0000005675 00000 n
+0000005721 00000 n
+0000434027 00000 n
+0001166227 00000 n
+0000005775 00000 n
+0000005817 00000 n
+0000434156 00000 n
+0001166134 00000 n
+0000005871 00000 n
+0000005922 00000 n
+0000434285 00000 n
+0001166041 00000 n
+0000005976 00000 n
+0000006025 00000 n
+0000434414 00000 n
+0001165948 00000 n
+0000006079 00000 n
+0000006136 00000 n
+0000437328 00000 n
+0001165855 00000 n
+0000006190 00000 n
+0000006245 00000 n
+0000437457 00000 n
+0001165762 00000 n
+0000006300 00000 n
+0000006356 00000 n
+0000437586 00000 n
+0001165669 00000 n
+0000006411 00000 n
+0000006472 00000 n
+0000437715 00000 n
+0001165576 00000 n
+0000006527 00000 n
+0000006573 00000 n
+0000437844 00000 n
+0001165497 00000 n
+0000006628 00000 n
+0000006671 00000 n
+0000437973 00000 n
+0001165365 00000 n
+0000006721 00000 n
+0000006777 00000 n
+0000438102 00000 n
+0001165286 00000 n
+0000006832 00000 n
+0000006878 00000 n
+0000441694 00000 n
+0001165207 00000 n
+0000006933 00000 n
+0000006980 00000 n
+0000441823 00000 n
+0001165075 00000 n
+0000007030 00000 n
+0000007087 00000 n
+0000444830 00000 n
+0001164957 00000 n
+0000007142 00000 n
+0000007182 00000 n
+0000447718 00000 n
+0001164878 00000 n
+0000007242 00000 n
+0000007315 00000 n
+0000447847 00000 n
+0001164799 00000 n
+0000007375 00000 n
+0000007448 00000 n
+0000450309 00000 n
+0001164667 00000 n
+0000007503 00000 n
+0000007561 00000 n
+0000450438 00000 n
+0001164588 00000 n
+0000007621 00000 n
+0000007678 00000 n
+0000450567 00000 n
+0001164509 00000 n
+0000007738 00000 n
+0000007797 00000 n
+0000450696 00000 n
+0001164416 00000 n
+0000007852 00000 n
+0000007896 00000 n
+0000453505 00000 n
+0001164323 00000 n
+0000007951 00000 n
+0000007991 00000 n
+0000456304 00000 n
+0001164230 00000 n
+0000008046 00000 n
+0000008114 00000 n
+0000456433 00000 n
+0001164151 00000 n
+0000008169 00000 n
0000008240 00000 n
-0000457350 00000 n
-0001003677 00000 n
-0000008295 00000 n
-0000008358 00000 n
-0000457479 00000 n
-0001003584 00000 n
-0000008413 00000 n
-0000008465 00000 n
-0000457608 00000 n
-0001003491 00000 n
-0000008520 00000 n
-0000008585 00000 n
-0000457737 00000 n
-0001003398 00000 n
-0000008640 00000 n
-0000008692 00000 n
-0000463748 00000 n
-0001003265 00000 n
-0000008747 00000 n
-0000008812 00000 n
-0000472151 00000 n
-0001003186 00000 n
-0000008872 00000 n
-0000008916 00000 n
-0000493407 00000 n
-0001003093 00000 n
-0000008976 00000 n
-0000009015 00000 n
-0000493536 00000 n
-0001003000 00000 n
-0000009075 00000 n
-0000009122 00000 n
-0000493665 00000 n
-0001002907 00000 n
-0000009182 00000 n
-0000009225 00000 n
-0000500581 00000 n
-0001002814 00000 n
-0000009285 00000 n
-0000009324 00000 n
-0000504097 00000 n
-0001002721 00000 n
-0000009384 00000 n
-0000009426 00000 n
-0000507277 00000 n
-0001002628 00000 n
-0000009486 00000 n
-0000009529 00000 n
-0000514841 00000 n
-0001002535 00000 n
-0000009589 00000 n
-0000009632 00000 n
-0000514970 00000 n
-0001002442 00000 n
-0000009692 00000 n
-0000009753 00000 n
-0000519163 00000 n
-0001002349 00000 n
-0000009814 00000 n
-0000009866 00000 n
-0000523056 00000 n
-0001002256 00000 n
+0000460499 00000 n
+0001164033 00000 n
+0000008290 00000 n
+0000008337 00000 n
+0000460628 00000 n
+0001163954 00000 n
+0000008392 00000 n
+0000008453 00000 n
+0000460757 00000 n
+0001163875 00000 n
+0000008508 00000 n
+0000008578 00000 n
+0000463625 00000 n
+0001163742 00000 n
+0000008625 00000 n
+0000008678 00000 n
+0000463754 00000 n
+0001163663 00000 n
+0000008727 00000 n
+0000008783 00000 n
+0000463883 00000 n
+0001163584 00000 n
+0000008832 00000 n
+0000008881 00000 n
+0000468153 00000 n
+0001163451 00000 n
+0000008928 00000 n
+0000008980 00000 n
+0000468282 00000 n
+0001163333 00000 n
+0000009029 00000 n
+0000009080 00000 n
+0000472974 00000 n
+0001163215 00000 n
+0000009134 00000 n
+0000009179 00000 n
+0000473102 00000 n
+0001163136 00000 n
+0000009238 00000 n
+0000009272 00000 n
+0000476695 00000 n
+0001163057 00000 n
+0000009331 00000 n
+0000009379 00000 n
+0000476824 00000 n
+0001162939 00000 n
+0000009433 00000 n
+0000009473 00000 n
+0000476953 00000 n
+0001162860 00000 n
+0000009532 00000 n
+0000009566 00000 n
+0000479805 00000 n
+0001162781 00000 n
+0000009625 00000 n
+0000009673 00000 n
+0000479934 00000 n
+0001162648 00000 n
+0000009722 00000 n
+0000009772 00000 n
+0000483004 00000 n
+0001162569 00000 n
+0000009826 00000 n
+0000009873 00000 n
+0000483132 00000 n
+0001162476 00000 n
0000009927 00000 n
-0000009980 00000 n
-0000523185 00000 n
-0001002163 00000 n
+0000009987 00000 n
+0000483391 00000 n
+0001162383 00000 n
0000010041 00000 n
-0000010079 00000 n
-0000527219 00000 n
-0001002070 00000 n
-0000010140 00000 n
-0000010192 00000 n
-0000530375 00000 n
-0001001977 00000 n
-0000010253 00000 n
-0000010297 00000 n
-0000534314 00000 n
-0001001884 00000 n
-0000010358 00000 n
-0000010394 00000 n
-0000542730 00000 n
-0001001791 00000 n
-0000010455 00000 n
-0000010518 00000 n
-0000542859 00000 n
-0001001698 00000 n
-0000010579 00000 n
-0000010629 00000 n
-0000546041 00000 n
-0001001619 00000 n
-0000010690 00000 n
-0000010746 00000 n
-0000549267 00000 n
-0001001526 00000 n
-0000010801 00000 n
-0000010852 00000 n
-0000554329 00000 n
-0001001433 00000 n
-0000010907 00000 n
-0000010971 00000 n
-0000558052 00000 n
-0001001340 00000 n
-0000011026 00000 n
+0000010093 00000 n
+0000488573 00000 n
+0001162290 00000 n
+0000010147 00000 n
+0000010212 00000 n
+0000488702 00000 n
+0001162197 00000 n
+0000010266 00000 n
+0000010317 00000 n
+0000492179 00000 n
+0001162104 00000 n
+0000010371 00000 n
+0000010435 00000 n
+0000492308 00000 n
+0001162011 00000 n
+0000010489 00000 n
+0000010536 00000 n
+0000492437 00000 n
+0001161918 00000 n
+0000010590 00000 n
+0000010650 00000 n
+0000492566 00000 n
+0001161825 00000 n
+0000010704 00000 n
+0000010755 00000 n
+0000496584 00000 n
+0001161693 00000 n
+0000010810 00000 n
+0000010875 00000 n
+0000496713 00000 n
+0001161614 00000 n
+0000010935 00000 n
+0000010982 00000 n
+0000503534 00000 n
+0001161521 00000 n
+0000011042 00000 n
0000011090 00000 n
-0000558180 00000 n
-0001001247 00000 n
-0000011145 00000 n
-0000011222 00000 n
-0000558309 00000 n
-0001001154 00000 n
-0000011277 00000 n
-0000011334 00000 n
-0000558437 00000 n
-0001001061 00000 n
-0000011389 00000 n
-0000011459 00000 n
-0000562254 00000 n
-0001000968 00000 n
-0000011514 00000 n
-0000011563 00000 n
-0000562383 00000 n
-0001000875 00000 n
-0000011618 00000 n
-0000011680 00000 n
-0000564065 00000 n
-0001000782 00000 n
-0000011735 00000 n
-0000011784 00000 n
-0000567156 00000 n
-0001000664 00000 n
-0000011839 00000 n
-0000011901 00000 n
-0000567284 00000 n
-0001000585 00000 n
-0000011961 00000 n
-0000012000 00000 n
-0000576166 00000 n
-0001000492 00000 n
-0000012060 00000 n
-0000012094 00000 n
-0000576295 00000 n
-0001000399 00000 n
-0000012154 00000 n
-0000012195 00000 n
-0000592451 00000 n
-0001000320 00000 n
-0000012255 00000 n
-0000012307 00000 n
-0000595699 00000 n
-0001000188 00000 n
-0000012356 00000 n
-0000012389 00000 n
-0000595827 00000 n
-0001000070 00000 n
-0000012443 00000 n
-0000012515 00000 n
-0000595955 00000 n
-0000999991 00000 n
-0000012574 00000 n
-0000012618 00000 n
-0000607186 00000 n
-0000999912 00000 n
-0000012677 00000 n
-0000012730 00000 n
-0000610897 00000 n
-0000999819 00000 n
-0000012784 00000 n
-0000012834 00000 n
-0000611156 00000 n
-0000999726 00000 n
-0000012888 00000 n
-0000012926 00000 n
-0000614299 00000 n
-0000999633 00000 n
-0000012980 00000 n
-0000013029 00000 n
-0000614558 00000 n
-0000999501 00000 n
-0000013083 00000 n
-0000013135 00000 n
-0000614687 00000 n
-0000999422 00000 n
-0000013194 00000 n
-0000013239 00000 n
-0000614816 00000 n
-0000999329 00000 n
-0000013298 00000 n
-0000013350 00000 n
-0000617602 00000 n
-0000999236 00000 n
-0000013409 00000 n
-0000013462 00000 n
-0000617730 00000 n
-0000999157 00000 n
-0000013521 00000 n
-0000013570 00000 n
-0000617859 00000 n
-0000999064 00000 n
-0000013624 00000 n
-0000013704 00000 n
-0000622193 00000 n
-0000998985 00000 n
-0000013758 00000 n
-0000013807 00000 n
-0000622322 00000 n
-0000998867 00000 n
-0000013856 00000 n
-0000013896 00000 n
-0000625918 00000 n
-0000998788 00000 n
-0000013955 00000 n
-0000014002 00000 n
-0000626047 00000 n
-0000998670 00000 n
-0000014056 00000 n
-0000014101 00000 n
-0000629692 00000 n
-0000998591 00000 n
-0000014160 00000 n
-0000014219 00000 n
-0000632705 00000 n
-0000998498 00000 n
-0000014278 00000 n
-0000014342 00000 n
-0000632963 00000 n
-0000998405 00000 n
-0000014401 00000 n
-0000014457 00000 n
-0000636831 00000 n
-0000998312 00000 n
-0000014516 00000 n
-0000014574 00000 n
-0000638438 00000 n
-0000998233 00000 n
-0000014633 00000 n
+0000509939 00000 n
+0001161442 00000 n
+0000011150 00000 n
+0000011204 00000 n
+0000513027 00000 n
+0001161349 00000 n
+0000011259 00000 n
+0000011309 00000 n
+0000515884 00000 n
+0001161256 00000 n
+0000011364 00000 n
+0000011427 00000 n
+0000516013 00000 n
+0001161163 00000 n
+0000011482 00000 n
+0000011534 00000 n
+0000516141 00000 n
+0001161070 00000 n
+0000011589 00000 n
+0000011654 00000 n
+0000516269 00000 n
+0001160977 00000 n
+0000011709 00000 n
+0000011761 00000 n
+0000521189 00000 n
+0001160844 00000 n
+0000011816 00000 n
+0000011881 00000 n
+0000541024 00000 n
+0001160765 00000 n
+0000011941 00000 n
+0000011985 00000 n
+0000562621 00000 n
+0001160672 00000 n
+0000012045 00000 n
+0000012084 00000 n
+0000566256 00000 n
+0001160579 00000 n
+0000012144 00000 n
+0000012191 00000 n
+0000566385 00000 n
+0001160486 00000 n
+0000012251 00000 n
+0000012294 00000 n
+0000570803 00000 n
+0001160393 00000 n
+0000012354 00000 n
+0000012393 00000 n
+0000574151 00000 n
+0001160300 00000 n
+0000012453 00000 n
+0000012495 00000 n
+0000580978 00000 n
+0001160207 00000 n
+0000012555 00000 n
+0000012598 00000 n
+0000588866 00000 n
+0001160114 00000 n
+0000012658 00000 n
+0000012701 00000 n
+0000588995 00000 n
+0001160021 00000 n
+0000012761 00000 n
+0000012822 00000 n
+0000593028 00000 n
+0001159928 00000 n
+0000012883 00000 n
+0000012935 00000 n
+0000593157 00000 n
+0001159835 00000 n
+0000012996 00000 n
+0000013049 00000 n
+0000596321 00000 n
+0001159742 00000 n
+0000013110 00000 n
+0000013148 00000 n
+0000600259 00000 n
+0001159649 00000 n
+0000013209 00000 n
+0000013261 00000 n
+0000603551 00000 n
+0001159556 00000 n
+0000013322 00000 n
+0000013366 00000 n
+0000603809 00000 n
+0001159463 00000 n
+0000013427 00000 n
+0000013463 00000 n
+0000612635 00000 n
+0001159370 00000 n
+0000013524 00000 n
+0000013587 00000 n
+0000615981 00000 n
+0001159277 00000 n
+0000013648 00000 n
+0000013698 00000 n
+0000619742 00000 n
+0001159184 00000 n
+0000013759 00000 n
+0000013815 00000 n
+0000624070 00000 n
+0001159091 00000 n
+0000013876 00000 n
+0000013923 00000 n
+0000628370 00000 n
+0001159012 00000 n
+0000013984 00000 n
+0000014052 00000 n
+0000630938 00000 n
+0001158919 00000 n
+0000014107 00000 n
+0000014158 00000 n
+0000635461 00000 n
+0001158826 00000 n
+0000014213 00000 n
+0000014277 00000 n
+0000639146 00000 n
+0001158733 00000 n
+0000014332 00000 n
+0000014396 00000 n
+0000639275 00000 n
+0001158640 00000 n
+0000014451 00000 n
+0000014528 00000 n
+0000639403 00000 n
+0001158547 00000 n
+0000014583 00000 n
+0000014640 00000 n
+0000643560 00000 n
+0001158454 00000 n
0000014695 00000 n
-0000640286 00000 n
-0000998100 00000 n
-0000014742 00000 n
-0000014794 00000 n
-0000640415 00000 n
-0000998021 00000 n
-0000014843 00000 n
-0000014887 00000 n
-0000644614 00000 n
-0000997889 00000 n
-0000014936 00000 n
-0000014977 00000 n
-0000644743 00000 n
-0000997810 00000 n
-0000015031 00000 n
-0000015079 00000 n
-0000644871 00000 n
-0000997731 00000 n
-0000015133 00000 n
-0000015184 00000 n
-0000645000 00000 n
-0000997652 00000 n
-0000015233 00000 n
-0000015280 00000 n
-0000649267 00000 n
-0000997519 00000 n
+0000014765 00000 n
+0000643688 00000 n
+0001158361 00000 n
+0000014820 00000 n
+0000014877 00000 n
+0000643817 00000 n
+0001158268 00000 n
+0000014932 00000 n
+0000015002 00000 n
+0000648072 00000 n
+0001158175 00000 n
+0000015057 00000 n
+0000015106 00000 n
+0000648201 00000 n
+0001158082 00000 n
+0000015161 00000 n
+0000015223 00000 n
+0000650348 00000 n
+0001157989 00000 n
+0000015278 00000 n
0000015327 00000 n
-0000015364 00000 n
-0000649396 00000 n
-0000997401 00000 n
-0000015413 00000 n
-0000015452 00000 n
-0000649525 00000 n
-0000997336 00000 n
-0000015506 00000 n
-0000015584 00000 n
-0000649654 00000 n
-0000997243 00000 n
-0000015633 00000 n
-0000015700 00000 n
-0000649783 00000 n
-0000997164 00000 n
-0000015749 00000 n
-0000015794 00000 n
-0000653222 00000 n
-0000997031 00000 n
-0000015842 00000 n
-0000015874 00000 n
-0000653351 00000 n
-0000996913 00000 n
-0000015923 00000 n
-0000015962 00000 n
-0000653480 00000 n
-0000996848 00000 n
-0000016016 00000 n
-0000016077 00000 n
-0000657161 00000 n
-0000996716 00000 n
-0000016126 00000 n
-0000016183 00000 n
-0000657290 00000 n
-0000996651 00000 n
-0000016237 00000 n
-0000016286 00000 n
-0000657419 00000 n
-0000996533 00000 n
-0000016335 00000 n
-0000016397 00000 n
-0000657548 00000 n
-0000996454 00000 n
-0000016451 00000 n
-0000016506 00000 n
-0000681573 00000 n
-0000996361 00000 n
-0000016560 00000 n
-0000016601 00000 n
-0000681702 00000 n
-0000996282 00000 n
-0000016655 00000 n
-0000016707 00000 n
-0000684433 00000 n
-0000996162 00000 n
-0000016755 00000 n
-0000016789 00000 n
-0000684562 00000 n
-0000996083 00000 n
-0000016838 00000 n
-0000016865 00000 n
-0000702386 00000 n
-0000995990 00000 n
-0000016914 00000 n
-0000016942 00000 n
-0000709874 00000 n
-0000995897 00000 n
-0000016991 00000 n
-0000017031 00000 n
-0000712670 00000 n
-0000995804 00000 n
-0000017080 00000 n
-0000017123 00000 n
-0000718853 00000 n
-0000995711 00000 n
-0000017172 00000 n
-0000017209 00000 n
-0000725478 00000 n
-0000995618 00000 n
-0000017258 00000 n
-0000017297 00000 n
-0000737861 00000 n
-0000995525 00000 n
-0000017346 00000 n
-0000017385 00000 n
-0000740957 00000 n
-0000995432 00000 n
-0000017434 00000 n
-0000017473 00000 n
-0000747237 00000 n
-0000995339 00000 n
-0000017522 00000 n
-0000017551 00000 n
-0000757049 00000 n
-0000995246 00000 n
-0000017601 00000 n
-0000017634 00000 n
-0000771281 00000 n
-0000995153 00000 n
-0000017684 00000 n
-0000017713 00000 n
-0000774411 00000 n
-0000995060 00000 n
-0000017763 00000 n
-0000017797 00000 n
-0000780649 00000 n
-0000994981 00000 n
-0000017847 00000 n
-0000017884 00000 n
-0000018257 00000 n
-0000018379 00000 n
-0000283180 00000 n
-0000017937 00000 n
-0000283054 00000 n
-0000283117 00000 n
-0000990433 00000 n
-0000964490 00000 n
-0000990259 00000 n
-0000991458 00000 n
-0000019688 00000 n
-0000019881 00000 n
-0000019961 00000 n
-0000019998 00000 n
-0000020079 00000 n
-0000020203 00000 n
-0000020462 00000 n
-0000020821 00000 n
-0000020853 00000 n
-0000020947 00000 n
-0000021980 00000 n
-0000033116 00000 n
-0000098706 00000 n
-0000164296 00000 n
-0000229886 00000 n
-0000284604 00000 n
-0000284419 00000 n
-0000283280 00000 n
-0000284541 00000 n
-0000963269 00000 n
-0000936748 00000 n
-0000963095 00000 n
-0000936063 00000 n
-0000933918 00000 n
-0000935899 00000 n
-0000296307 00000 n
-0000287653 00000 n
-0000284689 00000 n
-0000296181 00000 n
-0000296244 00000 n
-0000288187 00000 n
-0000288341 00000 n
-0000288498 00000 n
-0000288655 00000 n
-0000288812 00000 n
-0000288969 00000 n
-0000289131 00000 n
-0000289293 00000 n
-0000289454 00000 n
-0000289616 00000 n
-0000289783 00000 n
-0000289950 00000 n
-0000290115 00000 n
-0000290277 00000 n
-0000290443 00000 n
-0000290605 00000 n
-0000290759 00000 n
-0000290916 00000 n
-0000291073 00000 n
-0000291229 00000 n
-0000291385 00000 n
-0000291542 00000 n
-0000291697 00000 n
-0000291854 00000 n
-0000292016 00000 n
-0000292178 00000 n
-0000292335 00000 n
-0000292490 00000 n
-0000292651 00000 n
-0000292818 00000 n
-0000292985 00000 n
-0000293147 00000 n
-0000293302 00000 n
-0000293459 00000 n
-0000293616 00000 n
-0000293778 00000 n
-0000293935 00000 n
-0000294092 00000 n
-0000294253 00000 n
-0000294410 00000 n
-0000294572 00000 n
-0000294739 00000 n
-0000294906 00000 n
-0000295068 00000 n
-0000295230 00000 n
-0000295392 00000 n
-0000295554 00000 n
-0000295716 00000 n
-0000295871 00000 n
-0000296026 00000 n
-0000309682 00000 n
-0000299635 00000 n
-0000296392 00000 n
-0000309619 00000 n
-0000933367 00000 n
-0000916286 00000 n
-0000933183 00000 n
-0000300225 00000 n
-0000300388 00000 n
-0000300550 00000 n
-0000300712 00000 n
-0000300870 00000 n
-0000301033 00000 n
-0000301196 00000 n
-0000301351 00000 n
-0000301509 00000 n
-0000301667 00000 n
-0000301823 00000 n
-0000301981 00000 n
-0000302144 00000 n
-0000302312 00000 n
-0000302480 00000 n
-0000302643 00000 n
-0000302811 00000 n
-0000302979 00000 n
-0000303136 00000 n
-0000303299 00000 n
-0000303462 00000 n
-0000303625 00000 n
-0000303787 00000 n
-0000303950 00000 n
-0000304112 00000 n
-0000304274 00000 n
-0000304437 00000 n
-0000304600 00000 n
-0000304763 00000 n
-0000304931 00000 n
-0000305100 00000 n
-0000305269 00000 n
-0000305433 00000 n
-0000305597 00000 n
-0000305761 00000 n
-0000305925 00000 n
-0000306089 00000 n
-0000306253 00000 n
-0000306421 00000 n
-0000306590 00000 n
-0000306759 00000 n
-0000306928 00000 n
-0000307097 00000 n
-0000307266 00000 n
-0000307435 00000 n
-0000307604 00000 n
-0000307773 00000 n
-0000307943 00000 n
-0000308113 00000 n
-0000308282 00000 n
-0000308452 00000 n
-0000308622 00000 n
-0000308790 00000 n
-0000308959 00000 n
-0000309129 00000 n
-0000309296 00000 n
-0000309457 00000 n
-0000322857 00000 n
-0000313314 00000 n
-0000309780 00000 n
-0000322794 00000 n
-0000313888 00000 n
-0000314051 00000 n
-0000314214 00000 n
-0000314377 00000 n
-0000314540 00000 n
-0000314703 00000 n
-0000314866 00000 n
-0000315029 00000 n
-0000315192 00000 n
-0000315360 00000 n
-0000315528 00000 n
-0000315696 00000 n
-0000315864 00000 n
-0000316021 00000 n
-0000316181 00000 n
-0000316347 00000 n
-0000316514 00000 n
-0000316676 00000 n
-0000316838 00000 n
-0000317000 00000 n
-0000317162 00000 n
-0000317329 00000 n
-0000317496 00000 n
-0000317663 00000 n
-0000317830 00000 n
-0000317992 00000 n
-0000318154 00000 n
-0000318311 00000 n
-0000318478 00000 n
-0000318639 00000 n
-0000318806 00000 n
-0000318973 00000 n
-0000319140 00000 n
-0000915397 00000 n
-0000894066 00000 n
-0000915223 00000 n
-0000319307 00000 n
-0000319473 00000 n
-0000319628 00000 n
-0000319784 00000 n
-0000319940 00000 n
-0000320102 00000 n
-0000320264 00000 n
-0000320421 00000 n
-0000320576 00000 n
-0000320733 00000 n
-0000320895 00000 n
-0000321052 00000 n
-0000321209 00000 n
-0000321365 00000 n
-0000321522 00000 n
-0000321684 00000 n
-0000321841 00000 n
-0000322002 00000 n
-0000322157 00000 n
-0000322319 00000 n
-0000322480 00000 n
-0000322640 00000 n
-0000326277 00000 n
-0000323933 00000 n
-0000322968 00000 n
-0000326214 00000 n
-0000324171 00000 n
-0000324328 00000 n
-0000324485 00000 n
-0000324641 00000 n
-0000324798 00000 n
-0000324955 00000 n
-0000325112 00000 n
-0000325269 00000 n
-0000325426 00000 n
-0000325582 00000 n
-0000325740 00000 n
-0000893100 00000 n
-0000873133 00000 n
-0000892927 00000 n
-0000325898 00000 n
-0000326056 00000 n
-0000329377 00000 n
-0000328630 00000 n
-0000326375 00000 n
-0000328813 00000 n
-0000328938 00000 n
-0000329063 00000 n
-0000329188 00000 n
-0000329251 00000 n
-0000329314 00000 n
-0000872339 00000 n
-0000854022 00000 n
-0000872166 00000 n
-0000991576 00000 n
-0000333885 00000 n
-0000332768 00000 n
-0000329501 00000 n
-0000333262 00000 n
-0000333325 00000 n
-0000333449 00000 n
-0000333574 00000 n
-0000333699 00000 n
-0000332918 00000 n
-0000333111 00000 n
-0000333822 00000 n
-0000595891 00000 n
-0000657612 00000 n
-0000338540 00000 n
-0000337504 00000 n
-0000334009 00000 n
-0000337977 00000 n
-0000338102 00000 n
-0000337654 00000 n
-0000337816 00000 n
-0000338227 00000 n
-0000338352 00000 n
-0000338477 00000 n
-0000354470 00000 n
-0000341761 00000 n
-0000341201 00000 n
-0000338664 00000 n
-0000341323 00000 n
-0000341448 00000 n
-0000341573 00000 n
-0000341698 00000 n
-0000345190 00000 n
-0000344049 00000 n
-0000341872 00000 n
-0000344503 00000 n
-0000344628 00000 n
-0000344753 00000 n
-0000344878 00000 n
-0000345003 00000 n
-0000344199 00000 n
-0000344351 00000 n
-0000345127 00000 n
-0000546105 00000 n
-0000346274 00000 n
-0000345961 00000 n
-0000345275 00000 n
-0000346084 00000 n
-0000346210 00000 n
-0000348371 00000 n
-0000347668 00000 n
-0000346372 00000 n
-0000347794 00000 n
-0000347922 00000 n
-0000348049 00000 n
-0000348177 00000 n
-0000348306 00000 n
-0000991694 00000 n
-0000351303 00000 n
-0000350414 00000 n
-0000348470 00000 n
-0000350722 00000 n
-0000350851 00000 n
-0000350916 00000 n
-0000350981 00000 n
-0000350561 00000 n
-0000351110 00000 n
-0000351239 00000 n
-0000530439 00000 n
-0000354663 00000 n
-0000354215 00000 n
-0000351415 00000 n
-0000354341 00000 n
-0000853347 00000 n
-0000841358 00000 n
-0000853168 00000 n
-0000354598 00000 n
-0000358487 00000 n
-0000358296 00000 n
-0000354789 00000 n
-0000358422 00000 n
-0000840817 00000 n
-0000831071 00000 n
-0000840638 00000 n
-0000363097 00000 n
-0000362698 00000 n
-0000358653 00000 n
-0000363032 00000 n
-0000362845 00000 n
-0000431895 00000 n
-0000365442 00000 n
-0000364992 00000 n
-0000363236 00000 n
-0000365118 00000 n
-0000365247 00000 n
-0000365312 00000 n
-0000365377 00000 n
-0000368173 00000 n
-0000370720 00000 n
-0000368017 00000 n
-0000365567 00000 n
-0000370139 00000 n
-0000370268 00000 n
-0000370397 00000 n
+0000655852 00000 n
+0001157871 00000 n
+0000015382 00000 n
+0000015444 00000 n
+0000655980 00000 n
+0001157792 00000 n
+0000015504 00000 n
+0000015543 00000 n
+0000664901 00000 n
+0001157699 00000 n
+0000015603 00000 n
+0000015637 00000 n
+0000665030 00000 n
+0001157606 00000 n
+0000015697 00000 n
+0000015738 00000 n
+0000685657 00000 n
+0001157527 00000 n
+0000015798 00000 n
+0000015850 00000 n
+0000692639 00000 n
+0001157395 00000 n
+0000015899 00000 n
+0000015932 00000 n
+0000692768 00000 n
+0001157277 00000 n
+0000015986 00000 n
+0000016058 00000 n
+0000692897 00000 n
+0001157198 00000 n
+0000016117 00000 n
+0000016161 00000 n
+0000703499 00000 n
+0001157119 00000 n
+0000016220 00000 n
+0000016273 00000 n
+0000703888 00000 n
+0001157026 00000 n
+0000016327 00000 n
+0000016377 00000 n
+0000707742 00000 n
+0001156933 00000 n
+0000016431 00000 n
+0000016469 00000 n
+0000708001 00000 n
+0001156840 00000 n
+0000016523 00000 n
+0000016572 00000 n
+0000710774 00000 n
+0001156708 00000 n
+0000016626 00000 n
+0000016678 00000 n
+0000710899 00000 n
+0001156629 00000 n
+0000016737 00000 n
+0000016782 00000 n
+0000711028 00000 n
+0001156536 00000 n
+0000016841 00000 n
+0000016893 00000 n
+0000711157 00000 n
+0001156443 00000 n
+0000016952 00000 n
+0000017005 00000 n
+0000713609 00000 n
+0001156364 00000 n
+0000017064 00000 n
+0000017113 00000 n
+0000713738 00000 n
+0001156271 00000 n
+0000017167 00000 n
+0000017247 00000 n
+0000718053 00000 n
+0001156192 00000 n
+0000017301 00000 n
+0000017350 00000 n
+0000721558 00000 n
+0001156074 00000 n
+0000017399 00000 n
+0000017439 00000 n
+0000721817 00000 n
+0001155995 00000 n
+0000017498 00000 n
+0000017545 00000 n
+0000725249 00000 n
+0001155877 00000 n
+0000017599 00000 n
+0000017644 00000 n
+0000725378 00000 n
+0001155798 00000 n
+0000017703 00000 n
+0000017762 00000 n
+0000728733 00000 n
+0001155705 00000 n
+0000017821 00000 n
+0000017885 00000 n
+0000728992 00000 n
+0001155612 00000 n
+0000017944 00000 n
+0000018000 00000 n
+0000733149 00000 n
+0001155519 00000 n
+0000018059 00000 n
+0000018117 00000 n
+0000735170 00000 n
+0001155440 00000 n
+0000018176 00000 n
+0000018238 00000 n
+0000737334 00000 n
+0001155307 00000 n
+0000018285 00000 n
+0000018337 00000 n
+0000737463 00000 n
+0001155228 00000 n
+0000018386 00000 n
+0000018430 00000 n
+0000741498 00000 n
+0001155096 00000 n
+0000018479 00000 n
+0000018520 00000 n
+0000741627 00000 n
+0001155017 00000 n
+0000018574 00000 n
+0000018622 00000 n
+0000741755 00000 n
+0001154938 00000 n
+0000018676 00000 n
+0000018727 00000 n
+0000741884 00000 n
+0001154859 00000 n
+0000018776 00000 n
+0000018823 00000 n
+0000746483 00000 n
+0001154726 00000 n
+0000018870 00000 n
+0000018907 00000 n
+0000746612 00000 n
+0001154608 00000 n
+0000018956 00000 n
+0000018995 00000 n
+0000746741 00000 n
+0001154543 00000 n
+0000019049 00000 n
+0000019127 00000 n
+0000746870 00000 n
+0001154450 00000 n
+0000019176 00000 n
+0000019243 00000 n
+0000746999 00000 n
+0001154371 00000 n
+0000019292 00000 n
+0000019337 00000 n
+0000750440 00000 n
+0001154238 00000 n
+0000019385 00000 n
+0000019417 00000 n
+0000750569 00000 n
+0001154120 00000 n
+0000019466 00000 n
+0000019505 00000 n
+0000750698 00000 n
+0001154055 00000 n
+0000019559 00000 n
+0000019620 00000 n
+0000754380 00000 n
+0001153923 00000 n
+0000019669 00000 n
+0000019726 00000 n
+0000754509 00000 n
+0001153858 00000 n
+0000019780 00000 n
+0000019829 00000 n
+0000754638 00000 n
+0001153726 00000 n
+0000019878 00000 n
+0000019940 00000 n
+0000754767 00000 n
+0001153647 00000 n
+0000019994 00000 n
+0000020049 00000 n
+0000779610 00000 n
+0001153554 00000 n
+0000020103 00000 n
+0000020144 00000 n
+0000779739 00000 n
+0001153475 00000 n
+0000020198 00000 n
+0000020250 00000 n
+0000780128 00000 n
+0001153357 00000 n
+0000020299 00000 n
+0000020349 00000 n
+0000782950 00000 n
+0001153278 00000 n
+0000020403 00000 n
+0000020441 00000 n
+0000783079 00000 n
+0001153185 00000 n
+0000020495 00000 n
+0000020532 00000 n
+0000783208 00000 n
+0001153092 00000 n
+0000020586 00000 n
+0000020624 00000 n
+0000783337 00000 n
+0001152999 00000 n
+0000020678 00000 n
+0000020730 00000 n
+0000786573 00000 n
+0001152906 00000 n
+0000020784 00000 n
+0000020827 00000 n
+0000786701 00000 n
+0001152774 00000 n
+0000020881 00000 n
+0000020926 00000 n
+0000786829 00000 n
+0001152695 00000 n
+0000020985 00000 n
+0000021051 00000 n
+0000789815 00000 n
+0001152602 00000 n
+0000021110 00000 n
+0000021198 00000 n
+0000789944 00000 n
+0001152509 00000 n
+0000021257 00000 n
+0000021332 00000 n
+0000790073 00000 n
+0001152416 00000 n
+0000021391 00000 n
+0000021476 00000 n
+0000792981 00000 n
+0001152323 00000 n
+0000021535 00000 n
+0000021616 00000 n
+0000795442 00000 n
+0001152244 00000 n
+0000021675 00000 n
+0000021759 00000 n
+0000795571 00000 n
+0001152165 00000 n
+0000021813 00000 n
+0000021857 00000 n
+0000798400 00000 n
+0001152045 00000 n
+0000021905 00000 n
+0000021939 00000 n
+0000798529 00000 n
+0001151966 00000 n
+0000021988 00000 n
+0000022015 00000 n
+0000816495 00000 n
+0001151873 00000 n
+0000022064 00000 n
+0000022092 00000 n
+0000824044 00000 n
+0001151780 00000 n
+0000022141 00000 n
+0000022181 00000 n
+0000830319 00000 n
+0001151687 00000 n
+0000022230 00000 n
+0000022273 00000 n
+0000836854 00000 n
+0001151594 00000 n
+0000022322 00000 n
+0000022359 00000 n
+0000850093 00000 n
+0001151501 00000 n
+0000022408 00000 n
+0000022445 00000 n
+0000853117 00000 n
+0001151408 00000 n
+0000022494 00000 n
+0000022532 00000 n
+0000859767 00000 n
+0001151315 00000 n
+0000022581 00000 n
+0000022620 00000 n
+0000873231 00000 n
+0001151222 00000 n
+0000022669 00000 n
+0000022708 00000 n
+0000876250 00000 n
+0001151129 00000 n
+0000022758 00000 n
+0000022798 00000 n
+0000885745 00000 n
+0001151036 00000 n
+0000022848 00000 n
+0000022878 00000 n
+0000894551 00000 n
+0001150943 00000 n
+0000022928 00000 n
+0000022971 00000 n
+0000895005 00000 n
+0001150850 00000 n
+0000023021 00000 n
+0000023054 00000 n
+0000909263 00000 n
+0001150757 00000 n
+0000023104 00000 n
+0000023133 00000 n
+0000916463 00000 n
+0001150664 00000 n
+0000023183 00000 n
+0000023217 00000 n
+0000922445 00000 n
+0001150571 00000 n
+0000023267 00000 n
+0000023304 00000 n
+0000925715 00000 n
+0001150478 00000 n
+0000023354 00000 n
+0000023391 00000 n
+0000931198 00000 n
+0001150385 00000 n
+0000023441 00000 n
+0000023474 00000 n
+0000931651 00000 n
+0001150292 00000 n
+0000023524 00000 n
+0000023558 00000 n
+0000934599 00000 n
+0001150199 00000 n
+0000023608 00000 n
+0000023647 00000 n
+0000936747 00000 n
+0001150120 00000 n
+0000023697 00000 n
+0000023731 00000 n
+0000024104 00000 n
+0000024226 00000 n
+0000289027 00000 n
+0000023784 00000 n
+0000288901 00000 n
+0000288964 00000 n
+0001144529 00000 n
+0001118444 00000 n
+0001144355 00000 n
+0001145567 00000 n
+0000025535 00000 n
+0000025728 00000 n
+0000025808 00000 n
+0000025845 00000 n
+0000025926 00000 n
+0000026050 00000 n
+0000026309 00000 n
+0000026668 00000 n
+0000026700 00000 n
+0000026794 00000 n
+0000027827 00000 n
+0000038963 00000 n
+0000104553 00000 n
+0000170143 00000 n
+0000235733 00000 n
+0000290455 00000 n
+0000290270 00000 n
+0000289127 00000 n
+0000290392 00000 n
+0001117208 00000 n
+0001090589 00000 n
+0001117034 00000 n
+0001089904 00000 n
+0001087759 00000 n
+0001089740 00000 n
+0000302181 00000 n
+0000293506 00000 n
+0000290540 00000 n
+0000302055 00000 n
+0000302118 00000 n
+0000294052 00000 n
+0000294206 00000 n
+0000294363 00000 n
+0000294520 00000 n
+0000294677 00000 n
+0000294834 00000 n
+0000294996 00000 n
+0000295158 00000 n
+0000295319 00000 n
+0000295481 00000 n
+0000295648 00000 n
+0000295815 00000 n
+0000295980 00000 n
+0000296142 00000 n
+0000296308 00000 n
+0000296470 00000 n
+0000296624 00000 n
+0000296781 00000 n
+0000296938 00000 n
+0000297094 00000 n
+0000297250 00000 n
+0000297407 00000 n
+0000297562 00000 n
+0000297719 00000 n
+0000297881 00000 n
+0000298043 00000 n
+0000298200 00000 n
+0000298355 00000 n
+0000298516 00000 n
+0000298683 00000 n
+0000298850 00000 n
+0000299011 00000 n
+0000299166 00000 n
+0000299323 00000 n
+0000299480 00000 n
+0000299642 00000 n
+0000299799 00000 n
+0000299956 00000 n
+0000300117 00000 n
+0000300275 00000 n
+0000300438 00000 n
+0000300606 00000 n
+0000300774 00000 n
+0000300937 00000 n
+0000301100 00000 n
+0000301263 00000 n
+0000301425 00000 n
+0000301588 00000 n
+0000301744 00000 n
+0000301900 00000 n
+0000315699 00000 n
+0000305636 00000 n
+0000302266 00000 n
+0000315634 00000 n
+0001087171 00000 n
+0001069750 00000 n
+0001086985 00000 n
+0000306286 00000 n
+0000306450 00000 n
+0000306613 00000 n
+0000306777 00000 n
+0000306936 00000 n
+0000307100 00000 n
+0000307264 00000 n
+0000307428 00000 n
+0000307592 00000 n
+0000307756 00000 n
+0000307920 00000 n
+0000308084 00000 n
+0000308248 00000 n
+0000308412 00000 n
+0000308577 00000 n
+0000308742 00000 n
+0000308907 00000 n
+0000309072 00000 n
+0000309232 00000 n
+0000309397 00000 n
+0000309561 00000 n
+0000309721 00000 n
+0000309886 00000 n
+0000310056 00000 n
+0000310226 00000 n
+0000310391 00000 n
+0000310560 00000 n
+0000310729 00000 n
+0000310894 00000 n
+0000311059 00000 n
+0000311223 00000 n
+0000311388 00000 n
+0000311548 00000 n
+0000311713 00000 n
+0000311878 00000 n
+0000312034 00000 n
+0000312193 00000 n
+0000312352 00000 n
+0000312509 00000 n
+0000312668 00000 n
+0000312832 00000 n
+0000313001 00000 n
+0000313170 00000 n
+0000313334 00000 n
+0000313503 00000 n
+0000313672 00000 n
+0000313831 00000 n
+0000313995 00000 n
+0000314159 00000 n
+0000314323 00000 n
+0000314487 00000 n
+0000314651 00000 n
+0000314815 00000 n
+0000314978 00000 n
+0000315142 00000 n
+0000315304 00000 n
+0000315466 00000 n
+0000329835 00000 n
+0000319302 00000 n
+0000315799 00000 n
+0000329770 00000 n
+0000319970 00000 n
+0000320139 00000 n
+0000320307 00000 n
+0000320471 00000 n
+0000320634 00000 n
+0000320798 00000 n
+0000320962 00000 n
+0000321126 00000 n
+0000321290 00000 n
+0000321459 00000 n
+0000321627 00000 n
+0000321796 00000 n
+0000321965 00000 n
+0000322133 00000 n
+0000322302 00000 n
+0000322471 00000 n
+0000322639 00000 n
+0000322808 00000 n
+0000322978 00000 n
+0000323147 00000 n
+0000323317 00000 n
+0000323487 00000 n
+0000323657 00000 n
+0000323827 00000 n
+0000323997 00000 n
+0000324167 00000 n
+0000324337 00000 n
+0000324507 00000 n
+0000324676 00000 n
+0000324840 00000 n
+0000325003 00000 n
+0000325167 00000 n
+0000325331 00000 n
+0000325495 00000 n
+0000325659 00000 n
+0000325823 00000 n
+0000325986 00000 n
+0000326150 00000 n
+0000326314 00000 n
+0000326477 00000 n
+0000326641 00000 n
+0000326809 00000 n
+0000326978 00000 n
+0000327147 00000 n
+0000327316 00000 n
+0000327473 00000 n
+0000327636 00000 n
+0000327804 00000 n
+0000327971 00000 n
+0000328134 00000 n
+0000328296 00000 n
+0000328459 00000 n
+0000328622 00000 n
+0000328790 00000 n
+0000328958 00000 n
+0000329126 00000 n
+0000329293 00000 n
+0000329454 00000 n
+0000329614 00000 n
+0000342999 00000 n
+0000333429 00000 n
+0000329935 00000 n
+0000342934 00000 n
+0000334061 00000 n
+0000334229 00000 n
+0000334392 00000 n
+0000334560 00000 n
+0000334728 00000 n
+0000334896 00000 n
+0001068859 00000 n
+0001047525 00000 n
+0001068683 00000 n
+0000335064 00000 n
+0000335231 00000 n
+0000335387 00000 n
+0000335545 00000 n
+0000335703 00000 n
+0000335866 00000 n
+0000336029 00000 n
+0000336187 00000 n
+0000336343 00000 n
+0000336501 00000 n
+0000336664 00000 n
+0000336822 00000 n
+0000336980 00000 n
+0000337136 00000 n
+0000337294 00000 n
+0000337457 00000 n
+0000337615 00000 n
+0000337778 00000 n
+0000337935 00000 n
+0000338097 00000 n
+0000338260 00000 n
+0000338423 00000 n
+0000338581 00000 n
+0000338744 00000 n
+0000338907 00000 n
+0000339070 00000 n
+0000339233 00000 n
+0000339396 00000 n
+0000339559 00000 n
+0000339727 00000 n
+0000339895 00000 n
+0000340062 00000 n
+0000340228 00000 n
+0000340395 00000 n
+0000340562 00000 n
+0000340725 00000 n
+0000340882 00000 n
+0000341040 00000 n
+0000341198 00000 n
+0000341356 00000 n
+0000341514 00000 n
+0000341672 00000 n
+0000341830 00000 n
+0000341988 00000 n
+0000342146 00000 n
+0000342304 00000 n
+0000342463 00000 n
+0000342620 00000 n
+0000342777 00000 n
+0000345400 00000 n
+0000343854 00000 n
+0000343113 00000 n
+0000345335 00000 n
+0000344064 00000 n
+0001046557 00000 n
+0001026587 00000 n
+0001046382 00000 n
+0000344223 00000 n
+0000344382 00000 n
+0000344540 00000 n
+0000344699 00000 n
+0000344858 00000 n
+0000345017 00000 n
+0000345176 00000 n
+0001145688 00000 n
+0000348523 00000 n
+0000347756 00000 n
+0000345501 00000 n
+0000347944 00000 n
+0000348072 00000 n
+0000348200 00000 n
+0000348328 00000 n
+0000348393 00000 n
+0000348458 00000 n
+0001025770 00000 n
+0001007305 00000 n
+0001025595 00000 n
+0000353060 00000 n
+0000351919 00000 n
+0000348651 00000 n
+0000352421 00000 n
+0000352486 00000 n
+0000352613 00000 n
+0000352741 00000 n
+0000352869 00000 n
+0000352075 00000 n
+0000352269 00000 n
+0000352995 00000 n
+0000692832 00000 n
+0000754831 00000 n
+0000357742 00000 n
+0000356684 00000 n
+0000353188 00000 n
+0000357165 00000 n
+0000357293 00000 n
+0000356840 00000 n
+0000357003 00000 n
+0000357421 00000 n
+0000357549 00000 n
+0000357677 00000 n
+0000373539 00000 n
+0000360983 00000 n
+0000360408 00000 n
+0000357870 00000 n
+0000360534 00000 n
+0000360662 00000 n
+0000360790 00000 n
+0000360918 00000 n
+0000364441 00000 n
+0000363275 00000 n
+0000361097 00000 n
+0000363737 00000 n
+0000363865 00000 n
+0000363993 00000 n
+0000364121 00000 n
+0000364249 00000 n
+0000363431 00000 n
+0000363584 00000 n
+0000364376 00000 n
+0000619806 00000 n
+0000365518 00000 n
+0000365199 00000 n
+0000364527 00000 n
+0000365325 00000 n
+0000365453 00000 n
+0001145813 00000 n
+0000367561 00000 n
+0000366858 00000 n
+0000365618 00000 n
+0000366984 00000 n
+0000367112 00000 n
+0000367239 00000 n
+0000367367 00000 n
+0000367496 00000 n
+0000370140 00000 n
+0000369510 00000 n
+0000367661 00000 n
0000369816 00000 n
-0000369978 00000 n
-0000830173 00000 n
-0000820377 00000 n
-0000829999 00000 n
-0000819813 00000 n
-0000810727 00000 n
-0000819638 00000 n
-0000370526 00000 n
-0000370655 00000 n
-0000991819 00000 n
-0000369645 00000 n
-0000369703 00000 n
-0000369793 00000 n
-0000472215 00000 n
-0000507341 00000 n
-0000375384 00000 n
-0000374449 00000 n
-0000370876 00000 n
-0000374933 00000 n
-0000375062 00000 n
-0000374605 00000 n
-0000374771 00000 n
-0000375191 00000 n
-0000375320 00000 n
-0000661639 00000 n
-0000379043 00000 n
-0000378663 00000 n
-0000375536 00000 n
-0000378978 00000 n
-0000378810 00000 n
-0000380266 00000 n
-0000380075 00000 n
-0000379168 00000 n
-0000380201 00000 n
-0000382969 00000 n
-0000382391 00000 n
-0000380365 00000 n
-0000382517 00000 n
-0000382646 00000 n
-0000382775 00000 n
-0000382904 00000 n
-0000386147 00000 n
-0000385440 00000 n
-0000383107 00000 n
-0000385566 00000 n
-0000385695 00000 n
-0000385824 00000 n
-0000385953 00000 n
-0000386082 00000 n
-0000390455 00000 n
-0000389557 00000 n
-0000386272 00000 n
-0000389875 00000 n
-0000390004 00000 n
-0000389704 00000 n
-0000390133 00000 n
-0000390262 00000 n
-0000390390 00000 n
-0000991944 00000 n
-0000592515 00000 n
-0000394491 00000 n
-0000393913 00000 n
-0000390580 00000 n
-0000394039 00000 n
-0000394168 00000 n
-0000394297 00000 n
-0000394426 00000 n
-0000398086 00000 n
-0000397766 00000 n
-0000394629 00000 n
-0000397892 00000 n
-0000398021 00000 n
-0000401532 00000 n
-0000401032 00000 n
-0000398198 00000 n
-0000401338 00000 n
-0000810452 00000 n
-0000807094 00000 n
-0000810273 00000 n
-0000401467 00000 n
-0000401179 00000 n
-0000657354 00000 n
-0000403260 00000 n
-0000402813 00000 n
-0000401714 00000 n
-0000402939 00000 n
-0000403068 00000 n
-0000403195 00000 n
-0000403713 00000 n
-0000403522 00000 n
-0000403372 00000 n
-0000403648 00000 n
-0000406327 00000 n
-0000405749 00000 n
-0000403755 00000 n
-0000405875 00000 n
-0000406004 00000 n
-0000406133 00000 n
-0000406262 00000 n
-0000992069 00000 n
-0000406767 00000 n
-0000406576 00000 n
-0000406426 00000 n
-0000406702 00000 n
-0000410769 00000 n
-0000410003 00000 n
-0000406809 00000 n
-0000410317 00000 n
-0000410446 00000 n
-0000410574 00000 n
-0000410639 00000 n
-0000410704 00000 n
-0000410150 00000 n
-0000415267 00000 n
-0000415459 00000 n
-0000415012 00000 n
-0000410868 00000 n
-0000415138 00000 n
-0000415394 00000 n
-0000419338 00000 n
-0000418761 00000 n
-0000415584 00000 n
-0000418887 00000 n
-0000419015 00000 n
-0000419144 00000 n
-0000419273 00000 n
-0000422155 00000 n
-0000423534 00000 n
-0000422029 00000 n
-0000419476 00000 n
-0000423081 00000 n
-0000423210 00000 n
-0000423339 00000 n
-0000423404 00000 n
-0000423469 00000 n
-0000426611 00000 n
-0000425904 00000 n
-0000423689 00000 n
-0000426030 00000 n
-0000426159 00000 n
-0000426287 00000 n
-0000426352 00000 n
-0000426417 00000 n
-0000426546 00000 n
-0000992194 00000 n
-0000432218 00000 n
-0000431300 00000 n
-0000426723 00000 n
-0000431766 00000 n
-0000431456 00000 n
-0000431607 00000 n
-0000432024 00000 n
-0000432153 00000 n
-0000785720 00000 n
-0000436057 00000 n
-0000434786 00000 n
-0000432356 00000 n
-0000435476 00000 n
-0000435605 00000 n
-0000435734 00000 n
-0000434951 00000 n
-0000435103 00000 n
-0000435289 00000 n
-0000435863 00000 n
-0000435992 00000 n
-0000440288 00000 n
-0000439968 00000 n
-0000436183 00000 n
-0000440094 00000 n
-0000440223 00000 n
-0000443763 00000 n
-0000443384 00000 n
-0000440413 00000 n
-0000443698 00000 n
-0000443531 00000 n
-0000446780 00000 n
-0000446975 00000 n
-0000446525 00000 n
-0000443875 00000 n
-0000446651 00000 n
-0000446845 00000 n
-0000446910 00000 n
-0000450344 00000 n
-0000450153 00000 n
-0000447087 00000 n
-0000450279 00000 n
-0000992319 00000 n
-0000454655 00000 n
-0000454077 00000 n
-0000450456 00000 n
-0000454203 00000 n
-0000454332 00000 n
-0000454397 00000 n
-0000454462 00000 n
-0000454591 00000 n
-0000457866 00000 n
-0000456824 00000 n
-0000454767 00000 n
-0000457285 00000 n
-0000457414 00000 n
-0000456980 00000 n
-0000457132 00000 n
-0000457543 00000 n
-0000457672 00000 n
-0000457801 00000 n
-0000459418 00000 n
-0000459227 00000 n
-0000457978 00000 n
-0000459353 00000 n
-0000460953 00000 n
-0000460762 00000 n
-0000459517 00000 n
-0000460888 00000 n
-0000463877 00000 n
-0000463557 00000 n
-0000461052 00000 n
-0000463683 00000 n
-0000463812 00000 n
-0000468308 00000 n
-0000467939 00000 n
-0000464015 00000 n
-0000468243 00000 n
-0000468086 00000 n
-0000992444 00000 n
-0000625982 00000 n
-0000472280 00000 n
-0000471960 00000 n
-0000468420 00000 n
-0000472086 00000 n
-0000476118 00000 n
-0000475798 00000 n
-0000472405 00000 n
-0000475924 00000 n
-0000475989 00000 n
-0000476053 00000 n
-0000481414 00000 n
-0000480122 00000 n
-0000476243 00000 n
-0000481349 00000 n
-0000480314 00000 n
-0000480468 00000 n
-0000480623 00000 n
-0000480808 00000 n
-0000480982 00000 n
-0000481167 00000 n
-0000554393 00000 n
-0000485716 00000 n
-0000485525 00000 n
-0000481595 00000 n
-0000485651 00000 n
-0000489480 00000 n
-0000489289 00000 n
-0000485841 00000 n
-0000489415 00000 n
-0000493794 00000 n
-0000492851 00000 n
-0000489592 00000 n
-0000493342 00000 n
-0000493471 00000 n
-0000493007 00000 n
-0000493600 00000 n
-0000493729 00000 n
-0000493176 00000 n
-0000992569 00000 n
-0000564129 00000 n
-0000497456 00000 n
-0000496894 00000 n
-0000493906 00000 n
-0000497391 00000 n
-0000497050 00000 n
-0000497221 00000 n
-0000645064 00000 n
-0000500710 00000 n
-0000500390 00000 n
-0000497625 00000 n
+0000369945 00000 n
+0000370010 00000 n
+0000370075 00000 n
+0000369657 00000 n
+0000603615 00000 n
+0000373733 00000 n
+0000373028 00000 n
+0000370254 00000 n
+0000373154 00000 n
+0000373283 00000 n
+0000373410 00000 n
+0001006622 00000 n
+0000994560 00000 n
+0001006443 00000 n
+0000373668 00000 n
+0000378400 00000 n
+0000377330 00000 n
+0000373861 00000 n
+0000378335 00000 n
+0000993987 00000 n
+0000983054 00000 n
+0000993808 00000 n
+0000377513 00000 n
+0000377668 00000 n
+0000377839 00000 n
+0000378010 00000 n
+0000378165 00000 n
+0000521253 00000 n
+0000685721 00000 n
+0000381927 00000 n
+0000381736 00000 n
+0000378569 00000 n
+0000381862 00000 n
+0000386399 00000 n
+0000386002 00000 n
+0000382069 00000 n
+0000386334 00000 n
+0000386149 00000 n
+0001145938 00000 n
+0000488637 00000 n
+0000388602 00000 n
+0000388152 00000 n
+0000386555 00000 n
+0000388278 00000 n
+0000388407 00000 n
+0000388472 00000 n
+0000388537 00000 n
+0000389071 00000 n
+0000388880 00000 n
+0000388730 00000 n
+0000389006 00000 n
+0000391766 00000 n
+0000394356 00000 n
+0000391601 00000 n
+0000389113 00000 n
+0000393904 00000 n
+0000394033 00000 n
+0000394162 00000 n
+0000393409 00000 n
+0000393571 00000 n
+0000982148 00000 n
+0000972128 00000 n
+0000981974 00000 n
+0000971564 00000 n
+0000962478 00000 n
+0000971389 00000 n
+0000394291 00000 n
+0000393733 00000 n
+0000393238 00000 n
+0000393296 00000 n
+0000393386 00000 n
+0000541088 00000 n
+0000581042 00000 n
+0000399123 00000 n
+0000398187 00000 n
+0000394527 00000 n
+0000398671 00000 n
+0000398800 00000 n
+0000398929 00000 n
+0000398343 00000 n
+0000398509 00000 n
+0000399058 00000 n
+0000758863 00000 n
+0000403041 00000 n
+0000402532 00000 n
+0000399279 00000 n
+0000402847 00000 n
+0000402976 00000 n
+0000402679 00000 n
+0000404189 00000 n
+0000403998 00000 n
+0000403182 00000 n
+0000404124 00000 n
+0001146063 00000 n
+0000406055 00000 n
+0000405735 00000 n
+0000404290 00000 n
+0000405861 00000 n
+0000405990 00000 n
+0000409350 00000 n
+0000408515 00000 n
+0000406169 00000 n
+0000408641 00000 n
+0000408770 00000 n
+0000408899 00000 n
+0000409027 00000 n
+0000409156 00000 n
+0000409285 00000 n
+0000413404 00000 n
+0000412508 00000 n
+0000409492 00000 n
+0000412825 00000 n
+0000412954 00000 n
+0000413082 00000 n
+0000412655 00000 n
+0000413210 00000 n
+0000413339 00000 n
+0000417431 00000 n
+0000416853 00000 n
+0000413545 00000 n
+0000416979 00000 n
+0000417108 00000 n
+0000417237 00000 n
+0000417366 00000 n
+0000421358 00000 n
+0000420909 00000 n
+0000417573 00000 n
+0000421035 00000 n
+0000421164 00000 n
+0000421293 00000 n
+0000423671 00000 n
+0000423480 00000 n
+0000421486 00000 n
+0000423606 00000 n
+0001146188 00000 n
+0000426939 00000 n
+0000426361 00000 n
+0000423815 00000 n
+0000426487 00000 n
+0000962203 00000 n
+0000958846 00000 n
+0000962024 00000 n
+0000426616 00000 n
+0000426745 00000 n
+0000426874 00000 n
+0000431006 00000 n
+0000430199 00000 n
+0000427110 00000 n
+0000430684 00000 n
+0000430813 00000 n
+0000958491 00000 n
+0000956494 00000 n
+0000958326 00000 n
+0000430355 00000 n
+0000430519 00000 n
+0000430941 00000 n
+0000836918 00000 n
+0000853181 00000 n
+0000434543 00000 n
+0000433836 00000 n
+0000431134 00000 n
+0000433962 00000 n
+0000434091 00000 n
+0000434220 00000 n
+0000434349 00000 n
+0000434478 00000 n
+0000438230 00000 n
+0000436960 00000 n
+0000434657 00000 n
+0000437263 00000 n
+0000437392 00000 n
+0000437521 00000 n
+0000437650 00000 n
+0000437779 00000 n
+0000437908 00000 n
+0000438037 00000 n
+0000438166 00000 n
+0000437107 00000 n
+0000643881 00000 n
+0000441952 00000 n
+0000441503 00000 n
+0000438358 00000 n
+0000441629 00000 n
+0000441758 00000 n
+0000441887 00000 n
+0000444959 00000 n
+0000444639 00000 n
+0000442066 00000 n
+0000444765 00000 n
+0000444894 00000 n
+0001146313 00000 n
+0000447976 00000 n
+0000447527 00000 n
+0000445129 00000 n
+0000447653 00000 n
+0000447782 00000 n
+0000447911 00000 n
+0000450825 00000 n
+0000450118 00000 n
+0000448133 00000 n
+0000450244 00000 n
+0000450373 00000 n
+0000450502 00000 n
+0000450631 00000 n
+0000450760 00000 n
+0000453634 00000 n
+0000453314 00000 n
+0000450939 00000 n
+0000453440 00000 n
+0000453569 00000 n
+0000459347 00000 n
+0000456562 00000 n
+0000456113 00000 n
+0000453748 00000 n
+0000456239 00000 n
+0000456368 00000 n
+0000456497 00000 n
+0000460886 00000 n
+0000459200 00000 n
+0000456690 00000 n
+0000460434 00000 n
+0000460563 00000 n
+0000460273 00000 n
+0000460692 00000 n
+0000460821 00000 n
+0000754573 00000 n
+0000461398 00000 n
+0000461207 00000 n
+0000461057 00000 n
+0000461333 00000 n
+0001146438 00000 n
+0000464012 00000 n
+0000463434 00000 n
+0000461440 00000 n
+0000463560 00000 n
+0000463689 00000 n
+0000463818 00000 n
+0000463947 00000 n
+0000464453 00000 n
+0000464262 00000 n
+0000464112 00000 n
+0000464388 00000 n
+0000468540 00000 n
+0000467774 00000 n
+0000464495 00000 n
+0000468088 00000 n
+0000468217 00000 n
+0000468345 00000 n
+0000468410 00000 n
+0000468475 00000 n
+0000467921 00000 n
+0000473038 00000 n
+0000473230 00000 n
+0000472783 00000 n
+0000468640 00000 n
+0000472909 00000 n
+0000473165 00000 n
+0000477082 00000 n
+0000476504 00000 n
+0000473358 00000 n
+0000476630 00000 n
+0000476759 00000 n
+0000476888 00000 n
+0000477017 00000 n
+0000480192 00000 n
+0000479614 00000 n
+0000477223 00000 n
+0000479740 00000 n
+0000479869 00000 n
+0000479998 00000 n
+0000480063 00000 n
+0000480127 00000 n
+0001146563 00000 n
+0000483517 00000 n
+0000482813 00000 n
+0000480349 00000 n
+0000482939 00000 n
+0000483068 00000 n
+0000483196 00000 n
+0000483261 00000 n
+0000483326 00000 n
+0000483452 00000 n
+0000488830 00000 n
+0000488042 00000 n
+0000483631 00000 n
+0000488508 00000 n
+0000488198 00000 n
+0000488349 00000 n
+0000488766 00000 n
+0000937473 00000 n
+0000492695 00000 n
+0000491424 00000 n
+0000488971 00000 n
+0000492114 00000 n
+0000492243 00000 n
+0000492372 00000 n
+0000492501 00000 n
+0000491589 00000 n
+0000491741 00000 n
+0000491927 00000 n
+0000492630 00000 n
+0000496842 00000 n
+0000496393 00000 n
+0000492823 00000 n
+0000496519 00000 n
+0000496648 00000 n
+0000496777 00000 n
+0000500748 00000 n
+0000500369 00000 n
+0000496970 00000 n
+0000500683 00000 n
0000500516 00000 n
-0000500645 00000 n
-0000504226 00000 n
-0000503906 00000 n
-0000500835 00000 n
-0000504032 00000 n
-0000504161 00000 n
-0000507406 00000 n
-0000507086 00000 n
-0000504338 00000 n
-0000507212 00000 n
-0000511216 00000 n
-0000511025 00000 n
-0000507562 00000 n
-0000511151 00000 n
-0000515098 00000 n
-0000514469 00000 n
-0000511371 00000 n
-0000514776 00000 n
-0000514905 00000 n
-0000514616 00000 n
-0000515034 00000 n
-0000992694 00000 n
-0000519292 00000 n
-0000518613 00000 n
-0000515267 00000 n
-0000519098 00000 n
-0000518769 00000 n
-0000519227 00000 n
-0000518943 00000 n
-0000523314 00000 n
-0000522865 00000 n
-0000519404 00000 n
-0000522991 00000 n
-0000523120 00000 n
-0000523249 00000 n
-0000527347 00000 n
-0000526681 00000 n
-0000523469 00000 n
-0000527154 00000 n
-0000527283 00000 n
-0000526837 00000 n
-0000526999 00000 n
-0000530634 00000 n
-0000529995 00000 n
-0000527516 00000 n
-0000530310 00000 n
-0000530142 00000 n
-0000530504 00000 n
-0000530569 00000 n
-0000534443 00000 n
-0000533940 00000 n
-0000530760 00000 n
-0000534249 00000 n
-0000534378 00000 n
-0000534087 00000 n
-0000539058 00000 n
-0000538684 00000 n
-0000534625 00000 n
-0000538993 00000 n
-0000538831 00000 n
-0000806739 00000 n
-0000804741 00000 n
-0000806574 00000 n
-0000992819 00000 n
-0000622257 00000 n
-0000542988 00000 n
-0000542351 00000 n
-0000539184 00000 n
-0000542665 00000 n
-0000542794 00000 n
-0000542498 00000 n
-0000542923 00000 n
-0000562318 00000 n
-0000546169 00000 n
-0000545850 00000 n
-0000543113 00000 n
-0000545976 00000 n
-0000549396 00000 n
-0000549076 00000 n
-0000546337 00000 n
-0000549202 00000 n
-0000549331 00000 n
-0000554458 00000 n
-0000553796 00000 n
-0000549508 00000 n
-0000554264 00000 n
-0000553952 00000 n
-0000554104 00000 n
-0000558566 00000 n
-0000557687 00000 n
-0000554570 00000 n
-0000557987 00000 n
-0000558116 00000 n
-0000558244 00000 n
-0000558373 00000 n
-0000558501 00000 n
-0000557834 00000 n
-0000562512 00000 n
-0000562063 00000 n
-0000558678 00000 n
-0000562189 00000 n
-0000562447 00000 n
-0000992944 00000 n
-0000564194 00000 n
-0000563874 00000 n
-0000562624 00000 n
-0000564000 00000 n
-0000565754 00000 n
-0000565563 00000 n
-0000564306 00000 n
-0000565689 00000 n
-0000567473 00000 n
-0000566965 00000 n
-0000565853 00000 n
-0000567091 00000 n
-0000567220 00000 n
-0000567347 00000 n
-0000567410 00000 n
-0000571388 00000 n
-0000571132 00000 n
-0000567585 00000 n
-0000571258 00000 n
-0000571323 00000 n
-0000576424 00000 n
-0000574584 00000 n
-0000571500 00000 n
-0000576101 00000 n
-0000574794 00000 n
-0000576230 00000 n
-0000576359 00000 n
-0000574961 00000 n
-0000575122 00000 n
-0000575284 00000 n
-0000575446 00000 n
-0000575607 00000 n
-0000575768 00000 n
-0000575939 00000 n
-0000785687 00000 n
-0000581569 00000 n
-0000579821 00000 n
-0000576536 00000 n
-0000581504 00000 n
-0000580040 00000 n
-0000580203 00000 n
-0000580364 00000 n
-0000580524 00000 n
-0000580687 00000 n
-0000580849 00000 n
-0000581012 00000 n
-0000581174 00000 n
-0000581337 00000 n
-0000993069 00000 n
-0000587912 00000 n
-0000584338 00000 n
-0000581694 00000 n
-0000587847 00000 n
-0000584656 00000 n
-0000584825 00000 n
-0000584987 00000 n
-0000585149 00000 n
-0000585311 00000 n
-0000585473 00000 n
-0000585636 00000 n
-0000585789 00000 n
-0000585952 00000 n
-0000586105 00000 n
-0000586258 00000 n
-0000586409 00000 n
-0000586563 00000 n
-0000586725 00000 n
-0000586887 00000 n
-0000587049 00000 n
-0000587210 00000 n
-0000587372 00000 n
-0000587534 00000 n
-0000587695 00000 n
-0000592710 00000 n
-0000591581 00000 n
-0000588024 00000 n
-0000592386 00000 n
-0000591755 00000 n
-0000591918 00000 n
-0000592069 00000 n
-0000592232 00000 n
-0000592580 00000 n
-0000592645 00000 n
-0000596083 00000 n
-0000595508 00000 n
-0000592849 00000 n
-0000595634 00000 n
-0000595762 00000 n
-0000596019 00000 n
-0000600404 00000 n
-0000599591 00000 n
-0000596252 00000 n
-0000600079 00000 n
-0000599747 00000 n
-0000599917 00000 n
-0000600144 00000 n
-0000600209 00000 n
-0000600274 00000 n
-0000600339 00000 n
-0000603670 00000 n
-0000603349 00000 n
-0000600503 00000 n
-0000603475 00000 n
-0000603540 00000 n
-0000603605 00000 n
-0000607574 00000 n
-0000606995 00000 n
-0000603782 00000 n
-0000607121 00000 n
-0000607250 00000 n
-0000607315 00000 n
-0000607380 00000 n
-0000607444 00000 n
-0000607509 00000 n
-0000993194 00000 n
-0000611415 00000 n
-0000610706 00000 n
+0000503598 00000 n
+0000503793 00000 n
+0000503343 00000 n
+0000500862 00000 n
+0000503469 00000 n
+0000503663 00000 n
+0000503728 00000 n
+0001146688 00000 n
+0000506597 00000 n
+0000506406 00000 n
+0000503907 00000 n
+0000506532 00000 n
+0000510197 00000 n
+0000509748 00000 n
+0000506711 00000 n
+0000509874 00000 n
+0000510003 00000 n
+0000510068 00000 n
+0000510132 00000 n
+0000513155 00000 n
+0000512836 00000 n
+0000510311 00000 n
+0000512962 00000 n
+0000513090 00000 n
+0000516398 00000 n
+0000515358 00000 n
+0000513269 00000 n
+0000515819 00000 n
+0000515948 00000 n
+0000515514 00000 n
+0000515668 00000 n
+0000516076 00000 n
+0000516204 00000 n
+0000516333 00000 n
+0000517919 00000 n
+0000517728 00000 n
+0000516512 00000 n
+0000517854 00000 n
+0000519479 00000 n
+0000519288 00000 n
+0000518020 00000 n
+0000519414 00000 n
+0001146813 00000 n
+0000521317 00000 n
+0000520998 00000 n
+0000519580 00000 n
+0000521124 00000 n
+0000524735 00000 n
+0000524544 00000 n
+0000521431 00000 n
+0000524670 00000 n
+0000529206 00000 n
+0000528838 00000 n
+0000524863 00000 n
+0000529141 00000 n
+0000528985 00000 n
+0000721881 00000 n
+0000533299 00000 n
+0000532918 00000 n
+0000529348 00000 n
+0000533234 00000 n
+0000533065 00000 n
+0000537534 00000 n
+0000537169 00000 n
+0000533427 00000 n
+0000537469 00000 n
+0000537316 00000 n
+0000541282 00000 n
+0000540833 00000 n
+0000537676 00000 n
+0000540959 00000 n
+0000541153 00000 n
+0000541217 00000 n
+0001146938 00000 n
+0000545583 00000 n
+0000545217 00000 n
+0000541410 00000 n
+0000545518 00000 n
+0000545364 00000 n
+0000550667 00000 n
+0000549534 00000 n
+0000545711 00000 n
+0000550602 00000 n
+0000549717 00000 n
+0000549873 00000 n
+0000550058 00000 n
+0000550232 00000 n
+0000550417 00000 n
+0000635525 00000 n
+0000554943 00000 n
+0000554752 00000 n
+0000550865 00000 n
+0000554878 00000 n
+0000558896 00000 n
+0000558705 00000 n
+0000555057 00000 n
+0000558831 00000 n
+0000562750 00000 n
+0000562430 00000 n
+0000559010 00000 n
+0000562556 00000 n
+0000562685 00000 n
+0000566514 00000 n
+0000565698 00000 n
+0000562864 00000 n
+0000566191 00000 n
+0000565854 00000 n
+0000566320 00000 n
+0000566449 00000 n
+0000566024 00000 n
+0001147063 00000 n
+0000650412 00000 n
+0000570932 00000 n
+0000570241 00000 n
+0000566671 00000 n
+0000570738 00000 n
+0000570397 00000 n
+0000570567 00000 n
+0000570867 00000 n
+0000741948 00000 n
+0000574280 00000 n
+0000573960 00000 n
+0000571060 00000 n
+0000574086 00000 n
+0000574215 00000 n
+0000577233 00000 n
+0000577042 00000 n
+0000574394 00000 n
+0000577168 00000 n
+0000581107 00000 n
+0000580787 00000 n
+0000577404 00000 n
+0000580913 00000 n
+0000584762 00000 n
+0000584571 00000 n
+0000581264 00000 n
+0000584697 00000 n
+0000589124 00000 n
+0000588312 00000 n
+0000584933 00000 n
+0000588801 00000 n
+0000588930 00000 n
+0000588468 00000 n
+0000589059 00000 n
+0000588628 00000 n
+0001147188 00000 n
+0000593286 00000 n
+0000592661 00000 n
+0000589281 00000 n
+0000592963 00000 n
+0000593092 00000 n
+0000592808 00000 n
+0000593221 00000 n
+0000596450 00000 n
+0000596130 00000 n
+0000593414 00000 n
+0000596256 00000 n
+0000596385 00000 n
+0000600387 00000 n
+0000599720 00000 n
+0000596621 00000 n
+0000600194 00000 n
+0000600323 00000 n
+0000599876 00000 n
+0000600038 00000 n
+0000603938 00000 n
+0000603169 00000 n
+0000600501 00000 n
+0000603486 00000 n
+0000603316 00000 n
+0000603680 00000 n
+0000603745 00000 n
+0000603873 00000 n
+0000607913 00000 n
+0000607539 00000 n
+0000604123 00000 n
+0000607848 00000 n
0000607686 00000 n
-0000610832 00000 n
-0000610961 00000 n
-0000611026 00000 n
-0000611091 00000 n
-0000611220 00000 n
-0000611285 00000 n
-0000611350 00000 n
-0000614945 00000 n
-0000614108 00000 n
-0000611540 00000 n
-0000614234 00000 n
-0000614363 00000 n
-0000614428 00000 n
-0000614493 00000 n
-0000614622 00000 n
-0000614751 00000 n
-0000614880 00000 n
-0000618118 00000 n
-0000617411 00000 n
-0000615155 00000 n
-0000617537 00000 n
-0000617666 00000 n
-0000617794 00000 n
-0000617923 00000 n
-0000617988 00000 n
-0000618053 00000 n
-0000622579 00000 n
-0000622002 00000 n
-0000618301 00000 n
-0000622128 00000 n
-0000622386 00000 n
-0000622451 00000 n
-0000622515 00000 n
-0000626176 00000 n
-0000625546 00000 n
-0000622704 00000 n
-0000625853 00000 n
-0000625693 00000 n
-0000626111 00000 n
-0000629951 00000 n
-0000629317 00000 n
-0000626288 00000 n
-0000629627 00000 n
-0000629756 00000 n
-0000629821 00000 n
-0000629886 00000 n
-0000629464 00000 n
-0000993319 00000 n
-0000785654 00000 n
-0000633220 00000 n
-0000632514 00000 n
-0000630063 00000 n
-0000632640 00000 n
-0000632769 00000 n
-0000632834 00000 n
-0000632899 00000 n
-0000633027 00000 n
-0000633091 00000 n
-0000633155 00000 n
-0000637089 00000 n
-0000636640 00000 n
-0000633332 00000 n
-0000636766 00000 n
-0000636895 00000 n
-0000636959 00000 n
-0000637024 00000 n
-0000638567 00000 n
-0000638247 00000 n
-0000637215 00000 n
-0000638373 00000 n
-0000804460 00000 n
-0000797176 00000 n
-0000804280 00000 n
-0000638502 00000 n
-0000640543 00000 n
-0000640095 00000 n
-0000638693 00000 n
-0000640221 00000 n
-0000640350 00000 n
-0000640479 00000 n
-0000645129 00000 n
-0000644186 00000 n
-0000640655 00000 n
-0000644549 00000 n
-0000796855 00000 n
-0000787642 00000 n
-0000796669 00000 n
-0000644333 00000 n
-0000644678 00000 n
-0000644806 00000 n
-0000644935 00000 n
-0000646171 00000 n
-0000645980 00000 n
-0000645366 00000 n
-0000646106 00000 n
-0000993444 00000 n
-0000646598 00000 n
-0000646407 00000 n
-0000646257 00000 n
-0000646533 00000 n
-0000649911 00000 n
-0000648685 00000 n
-0000646640 00000 n
-0000649202 00000 n
-0000649331 00000 n
-0000649460 00000 n
-0000649589 00000 n
-0000649718 00000 n
-0000649847 00000 n
-0000648841 00000 n
-0000649013 00000 n
-0000650365 00000 n
-0000650174 00000 n
-0000650024 00000 n
-0000650300 00000 n
-0000653609 00000 n
-0000653031 00000 n
-0000650407 00000 n
-0000653157 00000 n
-0000653286 00000 n
-0000653415 00000 n
-0000653544 00000 n
-0000657804 00000 n
-0000656586 00000 n
-0000653695 00000 n
-0000657096 00000 n
-0000657225 00000 n
-0000657483 00000 n
-0000656742 00000 n
-0000656921 00000 n
-0000657676 00000 n
-0000657740 00000 n
-0000664691 00000 n
-0000660863 00000 n
-0000657957 00000 n
-0000660989 00000 n
-0000661054 00000 n
-0000661119 00000 n
-0000661184 00000 n
-0000661249 00000 n
-0000661314 00000 n
-0000661379 00000 n
-0000661444 00000 n
-0000661509 00000 n
-0000661574 00000 n
-0000661704 00000 n
-0000661769 00000 n
-0000661834 00000 n
-0000661899 00000 n
-0000661964 00000 n
-0000662029 00000 n
-0000662094 00000 n
-0000662159 00000 n
-0000662224 00000 n
-0000662289 00000 n
-0000662354 00000 n
-0000662419 00000 n
-0000662484 00000 n
-0000662549 00000 n
-0000662614 00000 n
-0000662679 00000 n
-0000662744 00000 n
-0000662809 00000 n
-0000662874 00000 n
-0000662939 00000 n
-0000663004 00000 n
-0000663069 00000 n
-0000663134 00000 n
-0000663199 00000 n
-0000663263 00000 n
-0000663328 00000 n
-0000663393 00000 n
-0000663458 00000 n
-0000663523 00000 n
-0000663588 00000 n
-0000663653 00000 n
-0000663718 00000 n
-0000663783 00000 n
-0000663848 00000 n
-0000663913 00000 n
-0000663978 00000 n
-0000664043 00000 n
-0000664108 00000 n
-0000664173 00000 n
-0000664238 00000 n
-0000664303 00000 n
-0000664368 00000 n
-0000664433 00000 n
-0000664498 00000 n
-0000664563 00000 n
-0000664627 00000 n
-0000993569 00000 n
-0000671337 00000 n
-0000667773 00000 n
-0000664803 00000 n
-0000667899 00000 n
-0000667964 00000 n
-0000668029 00000 n
-0000668094 00000 n
-0000668159 00000 n
-0000668224 00000 n
-0000668289 00000 n
-0000668354 00000 n
-0000668419 00000 n
-0000668484 00000 n
-0000668549 00000 n
-0000668614 00000 n
-0000668678 00000 n
-0000668743 00000 n
-0000668808 00000 n
-0000668873 00000 n
-0000668938 00000 n
-0000669003 00000 n
-0000669068 00000 n
-0000669133 00000 n
-0000669198 00000 n
-0000669263 00000 n
-0000669328 00000 n
-0000669393 00000 n
-0000669457 00000 n
-0000669522 00000 n
-0000669587 00000 n
-0000669652 00000 n
-0000669717 00000 n
-0000669782 00000 n
-0000669847 00000 n
-0000669912 00000 n
-0000669977 00000 n
-0000670042 00000 n
-0000670107 00000 n
-0000670172 00000 n
-0000670237 00000 n
-0000670302 00000 n
-0000670367 00000 n
-0000670432 00000 n
-0000670496 00000 n
-0000670560 00000 n
-0000670624 00000 n
-0000670689 00000 n
-0000670754 00000 n
-0000670819 00000 n
-0000670884 00000 n
-0000670949 00000 n
-0000671014 00000 n
-0000671079 00000 n
-0000671144 00000 n
-0000671209 00000 n
-0000671273 00000 n
-0000677513 00000 n
-0000674075 00000 n
-0000671449 00000 n
-0000674201 00000 n
-0000674266 00000 n
-0000674331 00000 n
-0000674396 00000 n
-0000674461 00000 n
-0000674526 00000 n
-0000674591 00000 n
-0000674656 00000 n
-0000674721 00000 n
-0000674786 00000 n
-0000674851 00000 n
-0000674916 00000 n
-0000674981 00000 n
-0000675046 00000 n
-0000675111 00000 n
-0000675176 00000 n
-0000675241 00000 n
-0000675306 00000 n
-0000675371 00000 n
-0000675436 00000 n
-0000675501 00000 n
-0000675566 00000 n
-0000675631 00000 n
-0000675696 00000 n
-0000675761 00000 n
-0000675826 00000 n
-0000675891 00000 n
-0000675956 00000 n
-0000676021 00000 n
-0000676086 00000 n
-0000676151 00000 n
-0000676216 00000 n
-0000676281 00000 n
-0000676346 00000 n
-0000676410 00000 n
-0000676475 00000 n
-0000676540 00000 n
-0000676605 00000 n
-0000676670 00000 n
-0000676735 00000 n
-0000676800 00000 n
-0000676865 00000 n
-0000676930 00000 n
-0000676995 00000 n
-0000677060 00000 n
-0000677125 00000 n
-0000677190 00000 n
-0000677255 00000 n
-0000677320 00000 n
-0000677385 00000 n
-0000677449 00000 n
-0000682091 00000 n
-0000679827 00000 n
-0000677625 00000 n
-0000679953 00000 n
-0000680018 00000 n
-0000680083 00000 n
-0000680148 00000 n
-0000680213 00000 n
-0000680278 00000 n
-0000680343 00000 n
-0000680408 00000 n
-0000680473 00000 n
-0000680538 00000 n
-0000680603 00000 n
-0000680668 00000 n
-0000680733 00000 n
-0000680798 00000 n
-0000680860 00000 n
-0000680924 00000 n
-0000680989 00000 n
-0000681053 00000 n
-0000681118 00000 n
-0000681183 00000 n
-0000681248 00000 n
-0000681313 00000 n
-0000681378 00000 n
-0000681443 00000 n
-0000681508 00000 n
-0000681637 00000 n
-0000681766 00000 n
-0000681831 00000 n
-0000681896 00000 n
-0000681961 00000 n
-0000682026 00000 n
-0000684886 00000 n
-0000684242 00000 n
-0000682216 00000 n
-0000684368 00000 n
-0000684497 00000 n
-0000684626 00000 n
-0000684691 00000 n
-0000684756 00000 n
-0000684821 00000 n
-0000689225 00000 n
-0000688905 00000 n
-0000684999 00000 n
-0000689031 00000 n
-0000689096 00000 n
-0000689161 00000 n
-0000692825 00000 n
-0000692570 00000 n
-0000689378 00000 n
-0000692696 00000 n
-0000692761 00000 n
-0000993694 00000 n
-0000696073 00000 n
-0000695882 00000 n
-0000692964 00000 n
-0000696008 00000 n
-0000699802 00000 n
-0000699546 00000 n
-0000696199 00000 n
-0000699672 00000 n
-0000699737 00000 n
-0000702643 00000 n
-0000701935 00000 n
-0000699941 00000 n
-0000702061 00000 n
-0000702126 00000 n
-0000702191 00000 n
-0000702256 00000 n
-0000702321 00000 n
-0000702450 00000 n
-0000702515 00000 n
-0000702579 00000 n
-0000707309 00000 n
-0000707053 00000 n
-0000702782 00000 n
-0000707179 00000 n
-0000707244 00000 n
-0000710261 00000 n
-0000709488 00000 n
-0000707435 00000 n
-0000709614 00000 n
-0000709679 00000 n
-0000709744 00000 n
-0000709809 00000 n
-0000709938 00000 n
-0000710003 00000 n
-0000710066 00000 n
-0000710131 00000 n
-0000710196 00000 n
-0000712863 00000 n
-0000712154 00000 n
-0000710414 00000 n
-0000712280 00000 n
-0000712345 00000 n
-0000712410 00000 n
-0000712475 00000 n
-0000712540 00000 n
-0000712605 00000 n
-0000712734 00000 n
-0000712799 00000 n
-0000993819 00000 n
-0000716107 00000 n
-0000715721 00000 n
-0000713015 00000 n
-0000715847 00000 n
-0000715912 00000 n
-0000715977 00000 n
-0000716042 00000 n
-0000719241 00000 n
-0000718468 00000 n
-0000716247 00000 n
-0000718594 00000 n
-0000718659 00000 n
-0000718724 00000 n
-0000718788 00000 n
-0000718916 00000 n
-0000718981 00000 n
-0000719046 00000 n
-0000719111 00000 n
-0000719176 00000 n
-0000722628 00000 n
-0000722437 00000 n
-0000719407 00000 n
-0000722563 00000 n
-0000725737 00000 n
-0000725027 00000 n
-0000722754 00000 n
-0000725153 00000 n
-0000725218 00000 n
-0000725283 00000 n
-0000725348 00000 n
-0000725413 00000 n
-0000725542 00000 n
-0000725607 00000 n
-0000725672 00000 n
-0000729289 00000 n
-0000728968 00000 n
-0000725902 00000 n
-0000729094 00000 n
-0000729159 00000 n
-0000729224 00000 n
-0000732735 00000 n
-0000732544 00000 n
-0000729415 00000 n
-0000732670 00000 n
-0000993944 00000 n
-0000735807 00000 n
-0000735488 00000 n
-0000732861 00000 n
-0000735614 00000 n
-0000735679 00000 n
-0000735743 00000 n
-0000738378 00000 n
-0000737540 00000 n
-0000735960 00000 n
-0000737666 00000 n
-0000737731 00000 n
-0000737796 00000 n
-0000737925 00000 n
-0000737990 00000 n
-0000738055 00000 n
-0000738120 00000 n
-0000738185 00000 n
-0000738249 00000 n
-0000738314 00000 n
-0000741345 00000 n
-0000740701 00000 n
-0000738531 00000 n
-0000740827 00000 n
-0000740892 00000 n
-0000741021 00000 n
-0000741086 00000 n
-0000741150 00000 n
-0000741215 00000 n
-0000741280 00000 n
-0000744817 00000 n
-0000744626 00000 n
-0000741485 00000 n
-0000744752 00000 n
-0000747625 00000 n
-0000746851 00000 n
-0000744943 00000 n
-0000746977 00000 n
-0000747042 00000 n
-0000747107 00000 n
-0000747172 00000 n
-0000747301 00000 n
-0000747366 00000 n
-0000747431 00000 n
-0000747495 00000 n
-0000747560 00000 n
-0000751027 00000 n
-0000750836 00000 n
-0000747778 00000 n
-0000750962 00000 n
-0000994069 00000 n
-0000754063 00000 n
-0000753743 00000 n
-0000751238 00000 n
-0000753869 00000 n
-0000753934 00000 n
-0000753999 00000 n
-0000757373 00000 n
-0000756664 00000 n
-0000754287 00000 n
-0000756790 00000 n
-0000756855 00000 n
-0000756920 00000 n
-0000756984 00000 n
-0000757113 00000 n
-0000757178 00000 n
-0000757243 00000 n
-0000757308 00000 n
-0000761790 00000 n
-0000761534 00000 n
-0000757525 00000 n
-0000761660 00000 n
-0000761725 00000 n
-0000765404 00000 n
-0000765213 00000 n
-0000761916 00000 n
-0000765339 00000 n
-0000768186 00000 n
-0000767802 00000 n
-0000765530 00000 n
-0000767928 00000 n
-0000767993 00000 n
-0000768058 00000 n
-0000768122 00000 n
-0000771670 00000 n
-0000771025 00000 n
-0000768338 00000 n
-0000771151 00000 n
-0000771216 00000 n
-0000771345 00000 n
-0000771410 00000 n
-0000771475 00000 n
-0000771540 00000 n
-0000771605 00000 n
-0000994194 00000 n
-0000774735 00000 n
+0000612763 00000 n
+0000612086 00000 n
+0000608084 00000 n
+0000612570 00000 n
+0000612242 00000 n
+0000612699 00000 n
+0000612405 00000 n
+0001147313 00000 n
+0000718117 00000 n
+0000648136 00000 n
+0000616110 00000 n
+0000615790 00000 n
+0000612891 00000 n
+0000615916 00000 n
+0000616045 00000 n
+0000619871 00000 n
+0000619551 00000 n
+0000616237 00000 n
+0000619677 00000 n
+0000624199 00000 n
+0000623707 00000 n
+0000620028 00000 n
+0000624005 00000 n
+0000624134 00000 n
+0000623854 00000 n
+0000628499 00000 n
+0000628179 00000 n
+0000624327 00000 n
+0000628305 00000 n
+0000628434 00000 n
+0000631067 00000 n
+0000630747 00000 n
+0000628640 00000 n
+0000630873 00000 n
+0000631002 00000 n
+0000635590 00000 n
+0000635100 00000 n
+0000631181 00000 n
+0000635396 00000 n
+0000635247 00000 n
+0001147438 00000 n
+0000639531 00000 n
+0000638772 00000 n
+0000635704 00000 n
+0000639081 00000 n
+0000638919 00000 n
+0000639210 00000 n
+0000639339 00000 n
+0000639467 00000 n
+0000643946 00000 n
+0000643194 00000 n
+0000639645 00000 n
+0000643495 00000 n
+0000643624 00000 n
+0000643341 00000 n
+0000643752 00000 n
+0000648330 00000 n
+0000647881 00000 n
+0000644074 00000 n
+0000648007 00000 n
+0000648265 00000 n
+0000650477 00000 n
+0000650157 00000 n
+0000648472 00000 n
+0000650283 00000 n
+0000651970 00000 n
+0000651779 00000 n
+0000650591 00000 n
+0000651905 00000 n
+0000653427 00000 n
+0000653236 00000 n
+0000652071 00000 n
+0000653362 00000 n
+0001147563 00000 n
+0000656238 00000 n
+0000655661 00000 n
+0000653528 00000 n
+0000655787 00000 n
+0000655916 00000 n
+0000656043 00000 n
+0000656108 00000 n
+0000656173 00000 n
+0000659903 00000 n
+0000659712 00000 n
+0000656352 00000 n
+0000659838 00000 n
+0000665159 00000 n
+0000663316 00000 n
+0000660017 00000 n
+0000664836 00000 n
+0000663526 00000 n
+0000664965 00000 n
+0000665094 00000 n
+0000663694 00000 n
+0000663856 00000 n
+0000664018 00000 n
+0000664180 00000 n
+0000664342 00000 n
+0000664504 00000 n
+0000664675 00000 n
+0000937440 00000 n
+0000670438 00000 n
+0000668518 00000 n
+0000665273 00000 n
+0000670373 00000 n
+0000668746 00000 n
+0000668909 00000 n
+0000669072 00000 n
+0000669235 00000 n
+0000669397 00000 n
+0000669560 00000 n
+0000669722 00000 n
+0000669885 00000 n
+0000670044 00000 n
+0000670205 00000 n
+0000675059 00000 n
+0000673487 00000 n
+0000670566 00000 n
+0000674994 00000 n
+0000673697 00000 n
+0000673866 00000 n
+0000674028 00000 n
+0000674190 00000 n
+0000674352 00000 n
+0000674514 00000 n
+0000674677 00000 n
+0000674831 00000 n
+0000681361 00000 n
+0000678470 00000 n
+0000675187 00000 n
+0000681296 00000 n
+0000678752 00000 n
+0000678904 00000 n
+0000679058 00000 n
+0000679209 00000 n
+0000679363 00000 n
+0000679525 00000 n
+0000679687 00000 n
+0000679848 00000 n
+0000680010 00000 n
+0000680172 00000 n
+0000680334 00000 n
+0000680496 00000 n
+0000680649 00000 n
+0000680812 00000 n
+0000680967 00000 n
+0000681131 00000 n
+0001147688 00000 n
+0000685786 00000 n
+0000684948 00000 n
+0000681489 00000 n
+0000685592 00000 n
+0000685113 00000 n
+0000685276 00000 n
+0000685430 00000 n
+0000688940 00000 n
+0000688620 00000 n
+0000685928 00000 n
+0000688746 00000 n
+0000688811 00000 n
+0000688875 00000 n
+0000693156 00000 n
+0000692086 00000 n
+0000689111 00000 n
+0000692574 00000 n
+0000692703 00000 n
+0000692961 00000 n
+0000692242 00000 n
+0000692412 00000 n
+0000693026 00000 n
+0000693091 00000 n
+0000696607 00000 n
+0000696287 00000 n
+0000693284 00000 n
+0000696413 00000 n
+0000696478 00000 n
+0000696542 00000 n
+0000700096 00000 n
+0000699775 00000 n
+0000696708 00000 n
+0000699901 00000 n
+0000699966 00000 n
+0000700031 00000 n
+0000704017 00000 n
+0000703308 00000 n
+0000700211 00000 n
+0000703434 00000 n
+0000703563 00000 n
+0000703628 00000 n
+0000703693 00000 n
+0000703758 00000 n
+0000703823 00000 n
+0000703952 00000 n
+0001147813 00000 n
+0000708258 00000 n
+0000707421 00000 n
+0000704131 00000 n
+0000707547 00000 n
+0000707612 00000 n
+0000707677 00000 n
+0000707806 00000 n
+0000707871 00000 n
+0000707936 00000 n
+0000708065 00000 n
+0000708130 00000 n
+0000708194 00000 n
+0000711285 00000 n
+0000710583 00000 n
+0000708386 00000 n
+0000710709 00000 n
+0000710836 00000 n
+0000710963 00000 n
+0000711092 00000 n
+0000711220 00000 n
+0000713995 00000 n
+0000713418 00000 n
+0000711484 00000 n
+0000713544 00000 n
+0000713673 00000 n
+0000713802 00000 n
+0000713867 00000 n
+0000713931 00000 n
+0000718182 00000 n
+0000717862 00000 n
+0000714180 00000 n
+0000717988 00000 n
+0000721946 00000 n
+0000721186 00000 n
+0000718309 00000 n
+0000721493 00000 n
+0000721622 00000 n
+0000721687 00000 n
+0000721752 00000 n
+0000721333 00000 n
+0000725637 00000 n
+0000725058 00000 n
+0000722060 00000 n
+0000725184 00000 n
+0000725313 00000 n
+0000725442 00000 n
+0000725507 00000 n
+0000725572 00000 n
+0001147938 00000 n
+0000729251 00000 n
+0000728356 00000 n
+0000725751 00000 n
+0000728668 00000 n
+0000728503 00000 n
+0000728797 00000 n
+0000728862 00000 n
+0000728927 00000 n
+0000729056 00000 n
+0000729121 00000 n
+0000729186 00000 n
+0000937407 00000 n
+0000733408 00000 n
+0000732958 00000 n
+0000729365 00000 n
+0000733084 00000 n
+0000733213 00000 n
+0000733278 00000 n
+0000733343 00000 n
+0000735299 00000 n
+0000734979 00000 n
+0000733536 00000 n
+0000735105 00000 n
+0000956213 00000 n
+0000948929 00000 n
+0000956033 00000 n
+0000735234 00000 n
+0000735782 00000 n
+0000735591 00000 n
+0000735441 00000 n
+0000735717 00000 n
+0000737592 00000 n
+0000737143 00000 n
+0000735824 00000 n
+0000737269 00000 n
+0000737398 00000 n
+0000737527 00000 n
+0000742013 00000 n
+0000741070 00000 n
+0000737706 00000 n
+0000741433 00000 n
+0000948608 00000 n
+0000939395 00000 n
+0000948422 00000 n
+0000741217 00000 n
+0000741562 00000 n
+0000741690 00000 n
+0000741819 00000 n
+0001148063 00000 n
+0000743372 00000 n
+0000743181 00000 n
+0000742254 00000 n
+0000743307 00000 n
+0000743813 00000 n
+0000743622 00000 n
+0000743472 00000 n
+0000743748 00000 n
+0000747127 00000 n
+0000745901 00000 n
+0000743855 00000 n
+0000746418 00000 n
+0000746547 00000 n
+0000746676 00000 n
+0000746805 00000 n
+0000746934 00000 n
+0000747063 00000 n
+0000746057 00000 n
+0000746229 00000 n
+0000747582 00000 n
+0000747391 00000 n
+0000747241 00000 n
+0000747517 00000 n
+0000750827 00000 n
+0000750249 00000 n
+0000747624 00000 n
+0000750375 00000 n
+0000750504 00000 n
+0000750633 00000 n
+0000750762 00000 n
+0000755024 00000 n
+0000753805 00000 n
+0000750913 00000 n
+0000754315 00000 n
+0000754444 00000 n
+0000754702 00000 n
+0000753961 00000 n
+0000754140 00000 n
+0000754896 00000 n
+0000754960 00000 n
+0001148188 00000 n
+0000761915 00000 n
+0000758087 00000 n
+0000755180 00000 n
+0000758213 00000 n
+0000758278 00000 n
+0000758343 00000 n
+0000758408 00000 n
+0000758473 00000 n
+0000758538 00000 n
+0000758603 00000 n
+0000758668 00000 n
+0000758733 00000 n
+0000758798 00000 n
+0000758928 00000 n
+0000758993 00000 n
+0000759058 00000 n
+0000759123 00000 n
+0000759188 00000 n
+0000759253 00000 n
+0000759318 00000 n
+0000759383 00000 n
+0000759448 00000 n
+0000759513 00000 n
+0000759578 00000 n
+0000759643 00000 n
+0000759708 00000 n
+0000759773 00000 n
+0000759838 00000 n
+0000759903 00000 n
+0000759968 00000 n
+0000760033 00000 n
+0000760098 00000 n
+0000760163 00000 n
+0000760228 00000 n
+0000760293 00000 n
+0000760358 00000 n
+0000760423 00000 n
+0000760487 00000 n
+0000760552 00000 n
+0000760617 00000 n
+0000760682 00000 n
+0000760747 00000 n
+0000760812 00000 n
+0000760877 00000 n
+0000760942 00000 n
+0000761007 00000 n
+0000761072 00000 n
+0000761137 00000 n
+0000761202 00000 n
+0000761267 00000 n
+0000761332 00000 n
+0000761397 00000 n
+0000761462 00000 n
+0000761527 00000 n
+0000761592 00000 n
+0000761657 00000 n
+0000761722 00000 n
+0000761787 00000 n
+0000761851 00000 n
+0000768563 00000 n
+0000764999 00000 n
+0000762029 00000 n
+0000765125 00000 n
+0000765190 00000 n
+0000765255 00000 n
+0000765320 00000 n
+0000765385 00000 n
+0000765450 00000 n
+0000765515 00000 n
+0000765580 00000 n
+0000765645 00000 n
+0000765710 00000 n
+0000765775 00000 n
+0000765840 00000 n
+0000765904 00000 n
+0000765969 00000 n
+0000766034 00000 n
+0000766099 00000 n
+0000766164 00000 n
+0000766229 00000 n
+0000766294 00000 n
+0000766359 00000 n
+0000766424 00000 n
+0000766489 00000 n
+0000766554 00000 n
+0000766619 00000 n
+0000766683 00000 n
+0000766748 00000 n
+0000766813 00000 n
+0000766878 00000 n
+0000766943 00000 n
+0000767008 00000 n
+0000767073 00000 n
+0000767138 00000 n
+0000767203 00000 n
+0000767268 00000 n
+0000767333 00000 n
+0000767398 00000 n
+0000767463 00000 n
+0000767528 00000 n
+0000767593 00000 n
+0000767658 00000 n
+0000767722 00000 n
+0000767786 00000 n
+0000767850 00000 n
+0000767915 00000 n
+0000767980 00000 n
+0000768045 00000 n
+0000768110 00000 n
+0000768175 00000 n
+0000768240 00000 n
+0000768305 00000 n
+0000768370 00000 n
+0000768435 00000 n
+0000768499 00000 n
+0000774738 00000 n
+0000771300 00000 n
+0000768677 00000 n
+0000771426 00000 n
+0000771491 00000 n
+0000771556 00000 n
+0000771621 00000 n
+0000771686 00000 n
+0000771751 00000 n
+0000771816 00000 n
+0000771881 00000 n
+0000771946 00000 n
+0000772011 00000 n
+0000772076 00000 n
+0000772141 00000 n
+0000772206 00000 n
+0000772271 00000 n
+0000772336 00000 n
+0000772401 00000 n
+0000772466 00000 n
+0000772531 00000 n
+0000772596 00000 n
+0000772661 00000 n
+0000772726 00000 n
+0000772791 00000 n
+0000772856 00000 n
+0000772921 00000 n
+0000772986 00000 n
+0000773051 00000 n
+0000773116 00000 n
+0000773181 00000 n
+0000773246 00000 n
+0000773311 00000 n
+0000773376 00000 n
+0000773441 00000 n
+0000773506 00000 n
+0000773571 00000 n
+0000773635 00000 n
+0000773700 00000 n
+0000773765 00000 n
+0000773830 00000 n
+0000773895 00000 n
+0000773960 00000 n
0000774025 00000 n
-0000771810 00000 n
-0000774151 00000 n
-0000774216 00000 n
-0000774281 00000 n
-0000774346 00000 n
-0000774475 00000 n
-0000774540 00000 n
-0000774605 00000 n
-0000774670 00000 n
-0000777831 00000 n
-0000777575 00000 n
-0000774901 00000 n
-0000777701 00000 n
-0000777766 00000 n
-0000780973 00000 n
-0000780264 00000 n
-0000777957 00000 n
-0000780390 00000 n
-0000780455 00000 n
-0000780520 00000 n
-0000780585 00000 n
-0000780713 00000 n
-0000780778 00000 n
-0000780843 00000 n
-0000780908 00000 n
-0000784563 00000 n
-0000784242 00000 n
-0000781125 00000 n
-0000784368 00000 n
-0000784433 00000 n
-0000784498 00000 n
-0000785542 00000 n
-0000785221 00000 n
-0000784702 00000 n
-0000785347 00000 n
-0000785412 00000 n
-0000785477 00000 n
-0000785753 00000 n
-0000797097 00000 n
-0000804686 00000 n
-0000806986 00000 n
-0000806955 00000 n
-0000810672 00000 n
-0000820112 00000 n
-0000830619 00000 n
-0000841105 00000 n
-0000853729 00000 n
-0000872794 00000 n
-0000893681 00000 n
-0000915824 00000 n
-0000933719 00000 n
-0000936550 00000 n
-0000936320 00000 n
-0000963857 00000 n
-0000990968 00000 n
-0000994319 00000 n
-0000994443 00000 n
-0000994569 00000 n
-0000994695 00000 n
-0000994812 00000 n
-0000994904 00000 n
-0001011519 00000 n
-0001030788 00000 n
-0001030829 00000 n
-0001030869 00000 n
-0001031003 00000 n
+0000774090 00000 n
+0000774155 00000 n
+0000774220 00000 n
+0000774285 00000 n
+0000774350 00000 n
+0000774415 00000 n
+0000774480 00000 n
+0000774545 00000 n
+0000774610 00000 n
+0000774674 00000 n
+0000780257 00000 n
+0000777861 00000 n
+0000774852 00000 n
+0000777987 00000 n
+0000778052 00000 n
+0000778117 00000 n
+0000778182 00000 n
+0000778247 00000 n
+0000778312 00000 n
+0000778377 00000 n
+0000778442 00000 n
+0000778507 00000 n
+0000778572 00000 n
+0000778637 00000 n
+0000778702 00000 n
+0000778767 00000 n
+0000778831 00000 n
+0000778896 00000 n
+0000778961 00000 n
+0000779026 00000 n
+0000779091 00000 n
+0000779156 00000 n
+0000779221 00000 n
+0000779286 00000 n
+0000779351 00000 n
+0000779416 00000 n
+0000779481 00000 n
+0000779546 00000 n
+0000779674 00000 n
+0000779803 00000 n
+0000779868 00000 n
+0000779933 00000 n
+0000779998 00000 n
+0000780063 00000 n
+0000780192 00000 n
+0000783466 00000 n
+0000782759 00000 n
+0000780384 00000 n
+0000782885 00000 n
+0000783014 00000 n
+0000783143 00000 n
+0000783272 00000 n
+0000783401 00000 n
+0000786958 00000 n
+0000786201 00000 n
+0000783593 00000 n
+0000786508 00000 n
+0000786637 00000 n
+0000786348 00000 n
+0000786765 00000 n
+0000786893 00000 n
+0001148313 00000 n
+0000790202 00000 n
+0000789624 00000 n
+0000787085 00000 n
+0000789750 00000 n
+0000789879 00000 n
+0000790008 00000 n
+0000790137 00000 n
+0000793110 00000 n
+0000792790 00000 n
+0000790316 00000 n
+0000792916 00000 n
+0000793045 00000 n
+0000795700 00000 n
+0000795251 00000 n
+0000793280 00000 n
+0000795377 00000 n
+0000795506 00000 n
+0000795635 00000 n
+0000796141 00000 n
+0000795950 00000 n
+0000795800 00000 n
+0000796076 00000 n
+0000798853 00000 n
+0000798209 00000 n
+0000796183 00000 n
+0000798335 00000 n
+0000798464 00000 n
+0000798593 00000 n
+0000798658 00000 n
+0000798723 00000 n
+0000798788 00000 n
+0000803193 00000 n
+0000802873 00000 n
+0000798967 00000 n
+0000802999 00000 n
+0000803064 00000 n
+0000803129 00000 n
+0001148438 00000 n
+0000806796 00000 n
+0000806541 00000 n
+0000803349 00000 n
+0000806667 00000 n
+0000806732 00000 n
+0000810047 00000 n
+0000809856 00000 n
+0000806938 00000 n
+0000809982 00000 n
+0000813767 00000 n
+0000813511 00000 n
+0000810175 00000 n
+0000813637 00000 n
+0000813702 00000 n
+0000816752 00000 n
+0000816044 00000 n
+0000813909 00000 n
+0000816170 00000 n
+0000816235 00000 n
+0000816300 00000 n
+0000816365 00000 n
+0000816430 00000 n
+0000816559 00000 n
+0000816624 00000 n
+0000816688 00000 n
+0000821421 00000 n
+0000821165 00000 n
+0000816894 00000 n
+0000821291 00000 n
+0000821356 00000 n
+0000824431 00000 n
+0000823658 00000 n
+0000821549 00000 n
+0000823784 00000 n
+0000823849 00000 n
+0000823914 00000 n
+0000823979 00000 n
+0000824108 00000 n
+0000824173 00000 n
+0000824236 00000 n
+0000824301 00000 n
+0000824366 00000 n
+0001148563 00000 n
+0000827345 00000 n
+0000826830 00000 n
+0000824587 00000 n
+0000826956 00000 n
+0000827021 00000 n
+0000827086 00000 n
+0000827151 00000 n
+0000827216 00000 n
+0000827281 00000 n
+0000830708 00000 n
+0000830128 00000 n
+0000827501 00000 n
+0000830254 00000 n
+0000830383 00000 n
+0000830448 00000 n
+0000830513 00000 n
+0000830578 00000 n
+0000830643 00000 n
+0000834160 00000 n
+0000833904 00000 n
+0000830850 00000 n
+0000834030 00000 n
+0000834095 00000 n
+0000837112 00000 n
+0000836468 00000 n
+0000834288 00000 n
+0000836594 00000 n
+0000836659 00000 n
+0000836724 00000 n
+0000836789 00000 n
+0000836983 00000 n
+0000837048 00000 n
+0000840705 00000 n
+0000840384 00000 n
+0000837281 00000 n
+0000840510 00000 n
+0000840575 00000 n
+0000840640 00000 n
+0000844296 00000 n
+0000844105 00000 n
+0000840833 00000 n
+0000844231 00000 n
+0001148688 00000 n
+0000847762 00000 n
+0000847441 00000 n
+0000844424 00000 n
+0000847567 00000 n
+0000847632 00000 n
+0000847697 00000 n
+0000850416 00000 n
+0000849707 00000 n
+0000847903 00000 n
+0000849833 00000 n
+0000849898 00000 n
+0000849963 00000 n
+0000850028 00000 n
+0000850157 00000 n
+0000850222 00000 n
+0000850287 00000 n
+0000850352 00000 n
+0000853441 00000 n
+0000852732 00000 n
+0000850572 00000 n
+0000852858 00000 n
+0000852923 00000 n
+0000852987 00000 n
+0000853052 00000 n
+0000853246 00000 n
+0000853311 00000 n
+0000853376 00000 n
+0000856922 00000 n
+0000856601 00000 n
+0000853597 00000 n
+0000856727 00000 n
+0000856792 00000 n
+0000856857 00000 n
+0000860091 00000 n
+0000859381 00000 n
+0000857036 00000 n
+0000859507 00000 n
+0000859572 00000 n
+0000859637 00000 n
+0000859702 00000 n
+0000859831 00000 n
+0000859896 00000 n
+0000859961 00000 n
+0000860026 00000 n
+0000863741 00000 n
+0000863485 00000 n
+0000860247 00000 n
+0000863611 00000 n
+0000863676 00000 n
+0001148813 00000 n
+0000867398 00000 n
+0000867207 00000 n
+0000863883 00000 n
+0000867333 00000 n
+0000870723 00000 n
+0000870532 00000 n
+0000867526 00000 n
+0000870658 00000 n
+0000873552 00000 n
+0000872845 00000 n
+0000870865 00000 n
+0000872971 00000 n
+0000873036 00000 n
+0000873101 00000 n
+0000873166 00000 n
+0000873295 00000 n
+0000873358 00000 n
+0000873423 00000 n
+0000873488 00000 n
+0000876509 00000 n
+0000875799 00000 n
+0000873708 00000 n
+0000875925 00000 n
+0000875990 00000 n
+0000876055 00000 n
+0000876120 00000 n
+0000876185 00000 n
+0000876314 00000 n
+0000876379 00000 n
+0000876444 00000 n
+0000879808 00000 n
+0000879487 00000 n
+0000876665 00000 n
+0000879613 00000 n
+0000879678 00000 n
+0000879743 00000 n
+0000883039 00000 n
+0000882784 00000 n
+0000879950 00000 n
+0000882910 00000 n
+0000882975 00000 n
+0001148938 00000 n
+0000886134 00000 n
+0000885424 00000 n
+0000883167 00000 n
+0000885550 00000 n
+0000885615 00000 n
+0000885680 00000 n
+0000885809 00000 n
+0000885874 00000 n
+0000885939 00000 n
+0000886004 00000 n
+0000886069 00000 n
+0000889435 00000 n
+0000889244 00000 n
+0000886290 00000 n
+0000889370 00000 n
+0000892497 00000 n
+0000892112 00000 n
+0000889648 00000 n
+0000892238 00000 n
+0000892303 00000 n
+0000892368 00000 n
+0000892433 00000 n
+0000895198 00000 n
+0000894230 00000 n
+0000892738 00000 n
+0000894356 00000 n
+0000894421 00000 n
+0000894486 00000 n
+0000894615 00000 n
+0000894680 00000 n
+0000894745 00000 n
+0000894810 00000 n
+0000894875 00000 n
+0000894940 00000 n
+0000895069 00000 n
+0000895134 00000 n
+0000899701 00000 n
+0000899380 00000 n
+0000895340 00000 n
+0000899506 00000 n
+0000899571 00000 n
+0000899636 00000 n
+0000903445 00000 n
+0000903189 00000 n
+0000899829 00000 n
+0000903315 00000 n
+0000903380 00000 n
+0001149063 00000 n
+0000906877 00000 n
+0000906621 00000 n
+0000903573 00000 n
+0000906747 00000 n
+0000906812 00000 n
+0000909456 00000 n
+0000908878 00000 n
+0000907005 00000 n
+0000909004 00000 n
+0000909069 00000 n
+0000909134 00000 n
+0000909198 00000 n
+0000909327 00000 n
+0000909392 00000 n
+0000913457 00000 n
+0000913006 00000 n
+0000909611 00000 n
+0000913132 00000 n
+0000913197 00000 n
+0000913262 00000 n
+0000913327 00000 n
+0000913392 00000 n
+0000916787 00000 n
+0000916142 00000 n
+0000913599 00000 n
+0000916268 00000 n
+0000916333 00000 n
+0000916398 00000 n
+0000916527 00000 n
+0000916592 00000 n
+0000916657 00000 n
+0000916722 00000 n
+0000919348 00000 n
+0000919092 00000 n
+0000916943 00000 n
+0000919218 00000 n
+0000919283 00000 n
+0000922833 00000 n
+0000922059 00000 n
+0000919490 00000 n
+0000922185 00000 n
+0000922250 00000 n
+0000922315 00000 n
+0000922380 00000 n
+0000922508 00000 n
+0000922573 00000 n
+0000922638 00000 n
+0000922703 00000 n
+0000922768 00000 n
+0001149188 00000 n
+0000925908 00000 n
+0000925329 00000 n
+0000922989 00000 n
+0000925455 00000 n
+0000925520 00000 n
+0000925585 00000 n
+0000925650 00000 n
+0000925779 00000 n
+0000925844 00000 n
+0000929734 00000 n
+0000929286 00000 n
+0000926064 00000 n
+0000929412 00000 n
+0000929477 00000 n
+0000929542 00000 n
+0000929607 00000 n
+0000929671 00000 n
+0000931972 00000 n
+0000930942 00000 n
+0000929890 00000 n
+0000931068 00000 n
+0000931133 00000 n
+0000931262 00000 n
+0000931327 00000 n
+0000931392 00000 n
+0000931456 00000 n
+0000931521 00000 n
+0000931586 00000 n
+0000931715 00000 n
+0000931780 00000 n
+0000931845 00000 n
+0000931910 00000 n
+0000934986 00000 n
+0000934213 00000 n
+0000932114 00000 n
+0000934339 00000 n
+0000934404 00000 n
+0000934469 00000 n
+0000934534 00000 n
+0000934663 00000 n
+0000934727 00000 n
+0000934792 00000 n
+0000934857 00000 n
+0000934921 00000 n
+0000937265 00000 n
+0000936426 00000 n
+0000935128 00000 n
+0000936552 00000 n
+0000936617 00000 n
+0000936682 00000 n
+0000936810 00000 n
+0000936875 00000 n
+0000936940 00000 n
+0000937005 00000 n
+0000937070 00000 n
+0000937135 00000 n
+0000937200 00000 n
+0000937506 00000 n
+0000948850 00000 n
+0000956439 00000 n
+0000958738 00000 n
+0000958707 00000 n
+0000962423 00000 n
+0000971863 00000 n
+0000982598 00000 n
+0000994293 00000 n
+0001007010 00000 n
+0001026244 00000 n
+0001047140 00000 n
+0001069288 00000 n
+0001087544 00000 n
+0001090391 00000 n
+0001090161 00000 n
+0001117809 00000 n
+0001145075 00000 n
+0001149313 00000 n
+0001149438 00000 n
+0001149564 00000 n
+0001149690 00000 n
+0001149816 00000 n
+0001149942 00000 n
+0001150043 00000 n
+0001171759 00000 n
+0001195784 00000 n
+0001195825 00000 n
+0001195865 00000 n
+0001195999 00000 n
trailer
<<
-/Size 2169
-/Root 2167 0 R
-/Info 2168 0 R
-/ID [<0C97D45D411E72A60BD825BAD36788D6> <0C97D45D411E72A60BD825BAD36788D6>]
+/Size 2735
+/Root 2733 0 R
+/Info 2734 0 R
+/ID [<1DE9D6805D55864A9314F6997A97E945> <1DE9D6805D55864A9314F6997A97E945>]
>>
startxref
-1031261
+1196257
%%EOF
diff --git a/contrib/bind9/doc/arm/Makefile.in b/contrib/bind9/doc/arm/Makefile.in
index 5098528..d9eb8fe 100644
--- a/contrib/bind9/doc/arm/Makefile.in
+++ b/contrib/bind9/doc/arm/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.20.332.2 2009-02-12 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.22 2009-02-12 23:47:56 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/doc/arm/dnssec.xml b/contrib/bind9/doc/arm/dnssec.xml
new file mode 100644
index 0000000..a678b8c
--- /dev/null
+++ b/contrib/bind9/doc/arm/dnssec.xml
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: dnssec.xml,v 1.4 2010-08-16 22:21:06 marka Exp $ -->
+
+<sect1 id="dnssec.dynamic.zones">
+ <title>DNSSEC, Dynamic Zones, and Automatic Signing</title>
+ <para>As of BIND 9.7.0 it is possible to change a dynamic zone
+ from insecure to signed and back again. A secure zone can use
+ either NSEC or NSEC3 chains.</para>
+ <sect2>
+ <title>Converting from insecure to secure</title>
+ </sect2>
+ <para>Changing a zone from insecure to secure can be done in two
+ ways: using a dynamic DNS update, or the
+ <command>auto-dnssec</command> zone option.</para>
+ <para>For either method, you need to configure
+ <command>named</command> so that it can see the
+ <filename>K*</filename> files which contain the public and private
+ parts of the keys that will be used to sign the zone. These files
+ will have been generated by
+ <command>dnssec-keygen</command>. You can do this by placing them
+ in the key-directory, as specified in
+ <filename>named.conf</filename>:</para>
+ <programlisting>
+ zone example.net {
+ type master;
+ update-policy local;
+ file "dynamic/example.net/example.net";
+ key-directory "dynamic/example.net";
+ };
+</programlisting>
+ <para>If one KSK and one ZSK DNSKEY key have been generated, this
+ configuration will cause all records in the zone to be signed
+ with the ZSK, and the DNSKEY RRset to be signed with the KSK as
+ well. An NSEC chain will be generated as part of the initial
+ signing process.</para>
+ <sect2>
+ <title>Dynamic DNS update method</title>
+ </sect2>
+ <para>To insert the keys via dynamic update:</para>
+ <screen>
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; send
+</screen>
+ <para>While the update request will complete almost immediately,
+ the zone will not be completely signed until
+ <command>named</command> has had time to walk the zone and
+ generate the NSEC and RRSIG records. The NSEC record at the apex
+ will be added last, to signal that there is a complete NSEC
+ chain.</para>
+ <para>If you wish to sign using NSEC3 instead of NSEC, you should
+ add an NSEC3PARAM record to the initial update request. If you
+ wish the NSEC3 chain to have the OPTOUT bit set, set it in the
+ flags field of the NSEC3PARAM record.</para>
+ <screen>
+ % nsupdate
+ &gt; ttl 3600
+ &gt; update add example.net DNSKEY 256 3 7 AwEAAZn17pUF0KpbPA2c7Gz76Vb18v0teKT3EyAGfBfL8eQ8al35zz3Y I1m/SAQBxIqMfLtIwqWPdgthsu36azGQAX8=
+ &gt; update add example.net DNSKEY 257 3 7 AwEAAd/7odU/64o2LGsifbLtQmtO8dFDtTAZXSX2+X3e/UNlq9IHq3Y0 XtC0Iuawl/qkaKVxXe2lo8Ct+dM6UehyCqk=
+ &gt; update add example.net NSEC3PARAM 1 1 100 1234567890
+ &gt; send
+</screen>
+ <para>Again, this update request will complete almost
+ immediately; however, the record won't show up until
+ <command>named</command> has had a chance to build/remove the
+ relevant chain. A private type record will be created to record
+ the state of the operation (see below for more details), and will
+ be removed once the operation completes.</para>
+ <para>While the initial signing and NSEC/NSEC3 chain generation
+ is happening, other updates are possible as well.</para>
+ <sect2>
+ <title>Fully automatic zone signing</title>
+ </sect2>
+ <para>To enable automatic signing, add the
+ <command>auto-dnssec</command> option to the zone statement in
+ <filename>named.conf</filename>.
+ <command>auto-dnssec</command> has two possible arguments:
+ <constant>allow</constant> or
+ <constant>maintain</constant>.</para>
+ <para>With
+ <command>auto-dnssec allow</command>,
+ <command>named</command> can search the key directory for keys
+ matching the zone, insert them into the zone, and use them to
+ sign the zone. It will do so only when it receives an
+ <command>rndc sign &lt;zonename&gt;</command> or
+ <command>rndc loadkeys &lt;zonename&gt;</command> command.</para>
+ <para>
+ <!-- TODO: this is repeated in the ARM -->
+ <command>auto-dnssec maintain</command> includes the above
+ functionality, but will also automatically adjust the zone's
+ DNSKEY records on schedule according to the keys' timing metadata.
+ (See <xref linkend="man.dnssec-keygen"/> and
+ <xref linkend="man.dnssec-settime"/> for more information.)
+ If keys are present in the key directory the first time the zone
+ is loaded, it will be signed immediately, without waiting for an
+ <command>rndc sign</command> or <command>rndc loadkeys</command>
+ command. (Those commands can still be used when there are unscheduled
+ key changes, however.)
+ </para>
+ <para>Using the
+ <command>auto-dnssec</command> option requires the zone to be
+ configured to allow dynamic updates, by adding an
+ <command>allow-update</command> or
+ <command>update-policy</command> statement to the zone
+ configuration. If this has not been done, the configuration will
+ fail.</para>
+ <sect2>
+ <title>Private-type records</title>
+ </sect2>
+ <para>The state of the signing process is signaled by
+ private-type records (with a default type value of 65534). When
+ signing is complete, these records will have a nonzero value for
+ the final octet (for those records which have a nonzero initial
+ octet).</para>
+ <para>The private type record format: If the first octet is
+ non-zero then the record indicates that the zone needs to be
+ signed with the key matching the record, or that all signatures
+ that match the record should be removed.</para>
+ <para>
+ <literallayout>
+<!-- TODO: how to format this? -->
+ algorithm (octet 1)
+ key id in network order (octet 2 and 3)
+ removal flag (octet 4)
+ complete flag (octet 5)
+</literallayout>
+ </para>
+ <para>Only records flagged as "complete" can be removed via
+ dynamic update. Attempts to remove other private type records
+ will be silently ignored.</para>
+ <para>If the first octet is zero (this is a reserved algorithm
+ number that should never appear in a DNSKEY record) then the
+ record indicates changes to the NSEC3 chains are in progress. The
+ rest of the record contains an NSEC3PARAM record. The flag field
+ tells what operation to perform based on the flag bits.</para>
+ <para>
+ <literallayout>
+<!-- TODO: how to format this? -->
+ 0x01 OPTOUT
+ 0x80 CREATE
+ 0x40 REMOVE
+ 0x20 NONSEC
+</literallayout>
+ </para>
+ <sect2>
+ <title>DNSKEY rollovers</title>
+ </sect2>
+ <para>As with insecure-to-secure conversions, rolling DNSSEC
+ keys can be done in two ways: using a dynamic DNS update, or the
+ <command>auto-dnssec</command> zone option.</para>
+ <sect2>
+ <title>Dynamic DNS update method</title>
+ </sect2>
+ <para> To perform key rollovers via dynamic update, you need to add
+ the <filename>K*</filename> files for the new keys so that
+ <command>named</command> can find them. You can then add the new
+ DNSKEY RRs via dynamic update.
+ <command>named</command> will then cause the zone to be signed
+ with the new keys. When the signing is complete the private type
+ records will be updated so that the last octet is non
+ zero.</para>
+ <para>If this is for a KSK you need to inform the parent and any
+ trust anchor repositories of the new KSK.</para>
+ <para>You should then wait for the maximum TTL in the zone before
+ removing the old DNSKEY. If it is a KSK that is being updated,
+ you also need to wait for the DS RRset in the parent to be
+ updated and its TTL to expire. This ensures that all clients will
+ be able to verify at least one signature when you remove the old
+ DNSKEY.</para>
+ <para>The old DNSKEY can be removed via UPDATE. Take care to
+ specify the correct key.
+ <command>named</command> will clean out any signatures generated
+ by the old key after the update completes.</para>
+ <sect2>
+ <title>Automatic key rollovers</title>
+ </sect2>
+ <para>When a new key reaches its activation date (as set by
+ <command>dnssec-keygen</command> or <command>dnssec-settime</command>),
+ if the <command>auto-dnssec</command> zone option is set to
+ <constant>maintain</constant>, <command>named</command> will
+ automatically carry out the key rollover. If the key's algorithm
+ has not previously been used to sign the zone, then the zone will
+ be fully signed as quickly as possible. However, if the new key
+ is replacing an existing key of the same algorithm, then the
+ zone will be re-signed incrementally, with signatures from the
+ old key being replaced with signatures from the new key as their
+ signature validity periods expire. By default, this rollover
+ completes in 30 days, after which it will be safe to remove the
+ old key from the DNSKEY RRset.</para>
+ <sect2>
+ <title>NSEC3PARAM rollovers via UPDATE</title>
+ </sect2>
+ <para>Add the new NSEC3PARAM record via dynamic update. When the
+ new NSEC3 chain has been generated, the NSEC3PARAM flag field
+ will be zero. At this point you can remove the old NSEC3PARAM
+ record. The old chain will be removed after the update request
+ completes.</para>
+ <sect2>
+ <title>Converting from NSEC to NSEC3</title>
+ </sect2>
+ <para>To do this, you just need to add an NSEC3PARAM record. When
+ the conversion is complete, the NSEC chain will have been removed
+ and the NSEC3PARAM record will have a zero flag field. The NSEC3
+ chain will be generated before the NSEC chain is
+ destroyed.</para>
+ <sect2>
+ <title>Converting from NSEC3 to NSEC</title>
+ </sect2>
+ <para>To do this, use <command>nsupdate</command> to
+ remove all NSEC3PARAM records with a zero flag
+ field. The NSEC chain will be generated before the NSEC3 chain is
+ removed.</para>
+ <sect2>
+ <title>Converting from secure to insecure</title>
+ </sect2>
+ <para>To convert a signed zone to unsigned using dynamic DNS,
+ delete all the DNSKEY records from the zone apex using
+ <command>nsupdate</command>. All signatures, NSEC or NSEC3 chains,
+ and associated NSEC3PARAM records will be removed automatically.
+ This will take place after the update request completes.</para>
+ <para> This requires the
+ <command>dnssec-secure-to-insecure</command> option to be set to
+ <userinput>yes</userinput> in
+ <filename>named.conf</filename>.</para>
+ <para>In addition, if the <command>auto-dnssec maintain</command>
+ zone statement is used, it should be removed or changed to
+ <command>allow</command> instead (or it will re-sign).
+ </para>
+ <sect2>
+ <title>Periodic re-signing</title>
+ </sect2>
+ <para>In any secure zone which supports dynamic updates, named
+ will periodically re-sign RRsets which have not been re-signed as
+ a result of some update action. The signature lifetimes will be
+ adjusted so as to spread the re-sign load over time rather than
+ all at once.</para>
+ <sect2>
+ <title>NSEC3 and OPTOUT</title>
+ </sect2>
+ <para>
+ <command>named</command> only supports creating new NSEC3 chains
+ where all the NSEC3 records in the zone have the same OPTOUT
+ state.
+ <command>named</command> supports UPDATES to zones where the NSEC3
+ records in the chain have mixed OPTOUT state.
+ <command>named</command> does not support changing the OPTOUT
+ state of an individual NSEC3 record, the entire chain needs to be
+ changed if the OPTOUT state of an individual NSEC3 needs to be
+ changed.</para>
+</sect1>
diff --git a/contrib/bind9/doc/arm/libdns.xml b/contrib/bind9/doc/arm/libdns.xml
new file mode 100644
index 0000000..8861f2c
--- /dev/null
+++ b/contrib/bind9/doc/arm/libdns.xml
@@ -0,0 +1,530 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<sect1 id="bind9.library">
+ <title>BIND 9 DNS Library Support</title>
+ <para>This version of BIND 9 "exports" its internal libraries so
+ that they can be used by third-party applications more easily (we
+ call them "export" libraries in this document). In addition to
+ all major DNS-related APIs BIND 9 is currently using, the export
+ libraries provide the following features:</para>
+ <itemizedlist>
+ <listitem>
+ <para>The newly created "DNS client" module. This is a higher
+ level API that provides an interface to name resolution,
+ single DNS transaction with a particular server, and dynamic
+ update. Regarding name resolution, it supports advanced
+ features such as DNSSEC validation and caching. This module
+ supports both synchronous and asynchronous mode.</para>
+ </listitem>
+ <listitem>
+ <para>The new "IRS" (Information Retrieval System) library.
+ It provides an interface to parse the traditional resolv.conf
+ file and more advanced, DNS-specific configuration file for
+ the rest of this package (see the description for the
+ dns.conf file below).</para>
+ </listitem>
+ <listitem>
+ <para>As part of the IRS library, newly implemented standard
+ address-name mapping functions, getaddrinfo() and
+ getnameinfo(), are provided. They use the DNSSEC-aware
+ validating resolver backend, and could use other advanced
+ features of the BIND 9 libraries such as caching. The
+ getaddrinfo() function resolves both A and AAAA RRs
+ concurrently (when the address family is unspecified).</para>
+ </listitem>
+ <listitem>
+ <para>An experimental framework to support other event
+ libraries than BIND 9's internal event task system.</para>
+ </listitem>
+ </itemizedlist>
+ <sect2>
+ <title>Prerequisite</title>
+ <para>GNU make is required to build the export libraries (other
+ part of BIND 9 can still be built with other types of make). In
+ the reminder of this document, "make" means GNU make. Note that
+ in some platforms you may need to invoke a different command name
+ than "make" (e.g. "gmake") to indicate it's GNU make.</para>
+ </sect2>
+ <sect2>
+ <title>Compilation</title>
+ <screen>
+$ <userinput>./configure --enable-exportlib <replaceable>[other flags]</replaceable></userinput>
+$ <userinput>make</userinput>
+</screen>
+ <para>
+ This will create (in addition to usual BIND 9 programs) and a
+ separate set of libraries under the lib/export directory. For
+ example, <filename>lib/export/dns/libdns.a</filename> is the archive file of the
+ export version of the BIND 9 DNS library. Sample application
+ programs using the libraries will also be built under the
+ lib/export/samples directory (see below).</para>
+ </sect2>
+ <sect2>
+ <title>Installation</title>
+ <screen>
+$ <userinput>cd lib/export</userinput>
+$ <userinput>make install</userinput>
+</screen>
+ <para>
+ This will install library object files under the directory
+ specified by the --with-export-libdir configure option (default:
+ EPREFIX/lib/bind9), and header files under the directory
+ specified by the --with-export-includedir configure option
+ (default: PREFIX/include/bind9).
+ Root privilege is normally required.
+ "<command>make install</command>" at the top directory will do the
+ same.
+ </para>
+ <para>
+ To see how to build your own
+ application after the installation, see
+ <filename>lib/export/samples/Makefile-postinstall.in</filename>.</para>
+ </sect2>
+ <sect2>
+ <title>Known Defects/Restrictions</title>
+ <itemizedlist>
+ <listitem>
+<!-- TODO: what about AIX? -->
+ <para>Currently, win32 is not supported for the export
+ library. (Normal BIND 9 application can be built as
+ before).</para>
+ </listitem>
+ <listitem>
+ <para>The "fixed" RRset order is not (currently) supported in
+ the export library. If you want to use "fixed" RRset order
+ for, e.g. <command>named</command> while still building the
+ export library even without the fixed order support, build
+ them separately:
+ <screen>
+$ <userinput>./configure --enable-fixed-rrset <replaceable>[other flags, but not --enable-exportlib]</replaceable></userinput>
+$ <userinput>make</userinput>
+$ <userinput>./configure --enable-exportlib <replaceable>[other flags, but not --enable-fixed-rrset]</replaceable></userinput>
+$ <userinput>cd lib/export</userinput>
+$ <userinput>make</userinput>
+</screen>
+ </para>
+ </listitem>
+ <listitem>
+ <para>The client module and the IRS library currently do not
+ support DNSSEC validation using DLV (the underlying modules
+ can handle it, but there is no tunable interface to enable
+ the feature).</para>
+ </listitem>
+ <listitem>
+ <para>RFC 5011 is not supported in the validating stub
+ resolver of the export library. In fact, it is not clear
+ whether it should: trust anchors would be a system-wide
+ configuration which would be managed by an administrator,
+ while the stub resolver will be used by ordinary applications
+ run by a normal user.</para>
+ </listitem>
+ <listitem>
+ <para>Not all common <filename>/etc/resolv.conf</filename>
+ options are supported
+ in the IRS library. The only available options in this
+ version are "debug" and "ndots".</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <sect2>
+ <title>The dns.conf File</title>
+ <para>The IRS library supports an "advanced" configuration file
+ related to the DNS library for configuration parameters that
+ would be beyond the capability of the
+ <filename>resolv.conf</filename> file.
+ Specifically, it is intended to provide DNSSEC related
+ configuration parameters. By default the path to this
+ configuration file is <filename>/etc/dns.conf</filename>.
+ This module is very
+ experimental and the configuration syntax or library interfaces
+ may change in future versions. Currently, only the
+ <command>trusted-keys</command>
+ statement is supported, whose syntax is the same as the same name
+ of statement for <filename>named.conf</filename>. (See
+ <xref linkend="trusted-keys" /> for details.)</para>
+ </sect2>
+ <sect2>
+ <title>Sample Applications</title>
+ <para>Some sample application programs using this API are
+ provided for reference. The following is a brief description of
+ these applications.
+ </para>
+ <sect3>
+ <title>sample: a simple stub resolver utility</title>
+ <para>
+ It sends a query of a given name (of a given optional RR type) to a
+ specified recursive server, and prints the result as a list of
+ RRs. It can also act as a validating stub resolver if a trust
+ anchor is given via a set of command line options.</para>
+ <para>
+ Usage: sample [options] server_address hostname
+ </para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -t RRtype
+ </term>
+ <listitem><para>
+ specify the RR type of the query. The default is the A RR.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ [-a algorithm] [-e] -k keyname -K keystring
+ </term>
+ <listitem><para>
+ specify a command-line DNS key to validate the answer. For
+ example, to specify the following DNSKEY of example.com:
+<literallayout>
+ example.com. 3600 IN DNSKEY 257 3 5 xxx
+</literallayout>
+ specify the options as follows:
+<screen>
+<userinput>
+ -e -k example.com -K "xxx"
+</userinput>
+</screen>
+ -e means that this key is a zone's "key signing key" (as known
+ as "secure Entry point").
+ When -a is omitted rsasha1 will be used by default.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -s domain:alt_server_address
+ </term>
+ <listitem><para>
+ specify a separate recursive server address for the specific
+ "domain". Example: -s example.com:2001:db8::1234
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>server_address</term>
+ <listitem><para>
+ an IP(v4/v6) address of the recursive server to which queries
+ are sent.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>hostname</term>
+ <listitem><para>
+ the domain name for the query
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ <sect3>
+ <title>sample-async: a simple stub resolver, working asynchronously</title>
+ <para>
+ Similar to "sample", but accepts a list
+ of (query) domain names as a separate file and resolves the names
+ asynchronously.</para>
+ <para>
+ Usage: sample-async [-s server_address] [-t RR_type] input_file</para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -s server_address
+ </term>
+ <listitem>
+ an IPv4 address of the recursive server to which queries are sent.
+ (IPv6 addresses are not supported in this implementation)
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -t RR_type
+ </term>
+ <listitem>
+ specify the RR type of the queries. The default is the A
+ RR.
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ input_file
+ </term>
+ <listitem>
+ a list of domain names to be resolved. each line
+ consists of a single domain name. Example:
+ <literallayout>
+ www.example.com
+ mx.examle.net
+ ns.xxx.example
+</literallayout>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ <sect3>
+ <title>sample-request: a simple DNS transaction client</title>
+ <para>
+ It sends a query to a specified server, and
+ prints the response with minimal processing. It doesn't act as a
+ "stub resolver": it stops the processing once it gets any
+ response from the server, whether it's a referral or an alias
+ (CNAME or DNAME) that would require further queries to get the
+ ultimate answer. In other words, this utility acts as a very
+ simplified <command>dig</command>.
+ </para>
+ <para>
+ Usage: sample-request [-t RRtype] server_address hostname
+ </para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -t RRtype
+ </term>
+ <listitem>
+ <para>
+ specify the RR type of
+ the queries. The default is the A RR.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ server_address
+ </term>
+ <listitem>
+ <para>
+ an IP(v4/v6)
+ address of the recursive server to which the query is sent.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ hostname
+ </term>
+ <listitem>
+ <para>
+ the domain name for the query
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ <sect3>
+ <title>sample-gai: getaddrinfo() and getnameinfo() test code</title>
+ <para>
+ This is a test program
+ to check getaddrinfo() and getnameinfo() behavior. It takes a
+ host name as an argument, calls getaddrinfo() with the given host
+ name, and calls getnameinfo() with the resulting IP addresses
+ returned by getaddrinfo(). If the dns.conf file exists and
+ defines a trust anchor, the underlying resolver will act as a
+ validating resolver, and getaddrinfo()/getnameinfo() will fail
+ with an EAI_INSECUREDATA error when DNSSEC validation fails.
+ </para>
+ <para>
+ Usage: sample-gai hostname
+ </para>
+ </sect3>
+ <sect3>
+ <title>sample-update: a simple dynamic update client program</title>
+ <para>
+ It accepts a single update command as a
+ command-line argument, sends an update request message to the
+ authoritative server, and shows the response from the server. In
+ other words, this is a simplified <command>nsupdate</command>.
+ </para>
+ <para>
+ Usage: sample-update [options] (add|delete) "update data"
+ </para>
+ <para>
+ Options and Arguments:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>
+ -a auth_server
+ </term>
+ <listitem><para>
+ An IP address of the authoritative server that has authority
+ for the zone containing the update name. This should normally
+ be the primary authoritative server that accepts dynamic
+ updates. It can also be a secondary server that is configured
+ to forward update requests to the primary server.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -k keyfile
+ </term>
+ <listitem><para>
+ A TSIG key file to secure the update transaction. The keyfile
+ format is the same as that for the nsupdate utility.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -p prerequisite
+ </term>
+ <listitem><para>
+ A prerequisite for the update (only one prerequisite can be
+ specified). The prerequisite format is the same as that is
+ accepted by the nsupdate utility.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -r recursive_server
+ </term>
+ <listitem><para>
+ An IP address of a recursive server that this utility will
+ use. A recursive server may be necessary to identify the
+ authoritative server address to which the update request is
+ sent.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -z zonename
+ </term>
+ <listitem><para>
+ The domain name of the zone that contains
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ (add|delete)
+ </term>
+ <listitem><para>
+ Specify the type of update operation. Either "add" or "delete"
+ must be specified.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ "update data"
+ </term>
+ <listitem><para>
+ Specify the data to be updated. A typical example of the data
+ would look like "name TTL RRtype RDATA".
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ <note>In practice, either -a or -r must be specified. Others can
+ be optional; the underlying library routine tries to identify the
+ appropriate server and the zone name for the update.</note>
+
+ <para>
+ Examples: assuming the primary authoritative server of the
+ dynamic.example.com zone has an IPv6 address 2001:db8::1234,
+ </para>
+ <screen>
+$ <userinput>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key add "foo.dynamic.example.com 30 IN A 192.168.2.1"</userinput></screen>
+ <para>
+ adds an A RR for foo.dynamic.example.com using the given key.
+ </para>
+ <screen>
+$ <userinput>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com 30 IN A"</userinput></screen>
+ <para>
+ removes all A RRs for foo.dynamic.example.com using the given key.
+ </para>
+ <screen>
+$ <userinput>sample-update -a sample-update -k Kxxx.+nnn+mmmm.key delete "foo.dynamic.example.com"</userinput></screen>
+ <para>
+ removes all RRs for foo.dynamic.example.com using the given key.
+ </para>
+ </sect3>
+ <sect3>
+ <title>nsprobe: domain/name server checker in terms of RFC 4074</title>
+ <para>
+ It checks a set
+ of domains to see the name servers of the domains behave
+ correctly in terms of RFC 4074. This is included in the set of
+ sample programs to show how the export library can be used in a
+ DNS-related application.
+ </para>
+ <para>
+ Usage: nsprobe [-d] [-v [-v...]] [-c cache_address] [input_file]
+ </para>
+ <para>
+ Options
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ -d
+ </term>
+ <listitem><para>
+ run in the "debug" mode. with this option nsprobe will dump
+ every RRs it receives.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -v
+ </term>
+ <listitem><para>
+ increase verbosity of other normal log messages. This can be
+ specified multiple times
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ -c cache_address
+ </term>
+ <listitem><para>
+ specify an IP address of a recursive (caching) name server.
+ nsprobe uses this server to get the NS RRset of each domain and
+ the A and/or AAAA RRsets for the name servers. The default
+ value is 127.0.0.1.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ input_file
+ </term>
+ <listitem><para>
+ a file name containing a list of domain (zone) names to be
+ probed. when omitted the standard input will be used. Each
+ line of the input file specifies a single domain name such as
+ "example.com". In general this domain name must be the apex
+ name of some DNS zone (unlike normal "host names" such as
+ "www.example.com"). nsprobe first identifies the NS RRsets for
+ the given domain name, and sends A and AAAA queries to these
+ servers for some "widely used" names under the zone;
+ specifically, adding "www" and "ftp" to the zone name.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+ <sect2>
+ <title>Library References</title>
+ <para>As of this writing, there is no formal "manual" of the
+ libraries, except this document, header files (some of them
+ provide pretty detailed explanations), and sample application
+ programs.</para>
+ </sect2>
+</sect1>
+<!-- $Id: libdns.xml,v 1.3 2010-02-03 23:49:07 tbox Exp $ -->
diff --git a/contrib/bind9/doc/arm/man.arpaname.html b/contrib/bind9/doc/arm/man.arpaname.html
new file mode 100644
index 0000000..8f0d98c
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.arpaname.html
@@ -0,0 +1,91 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.arpaname.html,v 1.33.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>arpaname</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.ddns-confgen.html" title="ddns-confgen">
+<link rel="next" href="man.genrandom.html" title="genrandom">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">arpaname</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.ddns-confgen.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.genrandom.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.arpaname"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">arpaname</span> &#8212; translate IP addresses to the corresponding ARPA names</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">arpaname</code> {<em class="replaceable"><code>ipaddress </code></em>...}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2616630"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">arpaname</strong></span> translates IP addresses (IPv4 and
+ IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2616645"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2616659"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.ddns-confgen.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.genrandom.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">ddns-confgen</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">genrandom</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.ddns-confgen.html b/contrib/bind9/doc/arm/man.ddns-confgen.html
new file mode 100644
index 0000000..0155dbf
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.ddns-confgen.html
@@ -0,0 +1,180 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.ddns-confgen.html,v 1.69.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>ddns-confgen</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.rndc-confgen.html" title="rndc-confgen">
+<link rel="next" href="man.arpaname.html" title="arpaname">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">ddns-confgen</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.rndc-confgen.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.arpaname.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.ddns-confgen"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">ddns-confgen</span> &#8212; ddns key generation tool</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">ddns-confgen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [ -s <em class="replaceable"><code>name</code></em> | -z <em class="replaceable"><code>zone</code></em> ] [<code class="option">-q</code>] [name]</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2645803"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">ddns-confgen</strong></span>
+ generates a key for use by <span><strong class="command">nsupdate</strong></span>
+ and <span><strong class="command">named</strong></span>. It simplifies configuration
+ of dynamic zones by generating a key and providing the
+ <span><strong class="command">nsupdate</strong></span> and <span><strong class="command">named.conf</strong></span>
+ syntax that will be needed to use it, including an example
+ <span><strong class="command">update-policy</strong></span> statement.
+ </p>
+<p>
+ If a domain name is specified on the command line, it will
+ be used in the name of the generated key and in the sample
+ <span><strong class="command">named.conf</strong></span> syntax. For example,
+ <span><strong class="command">ddns-confgen example.com</strong></span> would
+ generate a key called "ddns-key.example.com", and sample
+ <span><strong class="command">named.conf</strong></span> command that could be used
+ in the zone definition for "example.com".
+ </p>
+<p>
+ Note that <span><strong class="command">named</strong></span> itself can configure a
+ local DDNS key for use with <span><strong class="command">nsupdate -l</strong></span>.
+ <span><strong class="command">ddns-confgen</strong></span> is only needed when a
+ more elaborate configuration is required: for instance, if
+ <span><strong class="command">nsupdate</strong></span> is to be used from a remote system.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2645959"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
+<dd><p>
+ Specifies the algorithm to use for the TSIG key. Available
+ choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256,
+ hmac-sha384 and hmac-sha512. The default is hmac-sha256.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Prints a short summary of the options and arguments to
+ <span><strong class="command">ddns-confgen</strong></span>.
+ </p></dd>
+<dt><span class="term">-k <em class="replaceable"><code>keyname</code></em></span></dt>
+<dd><p>
+ Specifies the key name of the DDNS authentication key.
+ The default is <code class="constant">ddns-key</code> when neither
+ the <code class="option">-s</code> nor <code class="option">-z</code> option is
+ specified; otherwise, the default
+ is <code class="constant">ddns-key</code> as a separate label
+ followed by the argument of the option, e.g.,
+ <code class="constant">ddns-key.example.com.</code>
+ The key name must have the format of a valid domain name,
+ consisting of letters, digits, hyphens and periods.
+ </p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Print only the key, with no explanatory text or
+ usage examples.
+ </p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>randomfile</code></em></span></dt>
+<dd><p>
+ Specifies a source of random data for generating the
+ authorization. If the operating system does not provide a
+ <code class="filename">/dev/random</code> or equivalent device, the
+ default source of randomness is keyboard input.
+ <code class="filename">randomdev</code> specifies the name of a
+ character device or file containing random data to be used
+ instead of the default. The special value
+ <code class="filename">keyboard</code> indicates that keyboard input
+ should be used.
+ </p></dd>
+<dt><span class="term">-s <em class="replaceable"><code>name</code></em></span></dt>
+<dd><p>
+ Single host mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>name</code></em>
+ using the "name" nametype.
+ The default key name is
+ ddns-key.<em class="replaceable"><code>name</code></em>.
+ Note that the "self" nametype cannot be used, since
+ the name to be updated may differ from the key name.
+ This option cannot be used with the <code class="option">-z</code> option.
+ </p></dd>
+<dt><span class="term">-z <em class="replaceable"><code>zone</code></em></span></dt>
+<dd><p>
+ zone mode: The example <span><strong class="command">named.conf</strong></span> text
+ shows how to set an update policy for the specified
+ <em class="replaceable"><code>zone</code></em>
+ using the "zonesub" nametype, allowing updates to all subdomain
+ names within
+ that <em class="replaceable"><code>zone</code></em>.
+ This option cannot be used with the <code class="option">-s</code> option.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2646569"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">nsupdate</span>(1)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named.conf</span>(5)</span>,
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2646608"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.rndc-confgen.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.arpaname.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">rndc-confgen</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">arpaname</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.dig.html b/contrib/bind9/doc/arm/man.dig.html
index 6afc34b..73b2b88 100644
--- a/contrib/bind9/doc/arm/man.dig.html
+++ b/contrib/bind9/doc/arm/man.dig.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dig.html,v 1.93.14.17 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: man.dig.html,v 1.162.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -52,7 +52,7 @@
<div class="cmdsynopsis"><p><code class="command">dig</code> [global-queryopt...] [query...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2575940"></a><h2>DESCRIPTION</h2>
+<a name="id2609278"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dig</strong></span>
(domain information groper) is a flexible tool
for interrogating DNS name servers. It performs DNS lookups and
@@ -98,7 +98,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2576035"></a><h2>SIMPLE USAGE</h2>
+<a name="id2609373"></a><h2>SIMPLE USAGE</h2>
<p>
A typical invocation of <span><strong class="command">dig</strong></span> looks like:
</p>
@@ -144,7 +144,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2576146"></a><h2>OPTIONS</h2>
+<a name="id2610167"></a><h2>OPTIONS</h2>
<p>
The <code class="option">-b</code> option sets the source IP address of the query
to <em class="parameter"><code>address</code></em>. This must be a valid
@@ -248,7 +248,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2630214"></a><h2>QUERY OPTIONS</h2>
+<a name="id2662324"></a><h2>QUERY OPTIONS</h2>
<p><span><strong class="command">dig</strong></span>
provides a number of query options which affect
the way in which lookups are made and the results displayed. Some of
@@ -517,6 +517,12 @@
each record on a single line, to facilitate machine parsing
of the <span><strong class="command">dig</strong></span> output.
</p></dd>
+<dt><span class="term"><code class="option">+[no]onesoa</code></span></dt>
+<dd><p>
+ Print only one (starting) SOA record when performing
+ an AXFR. The default is to print both the starting and
+ ending SOA records.
+ </p></dd>
<dt><span class="term"><code class="option">+[no]fail</code></span></dt>
<dd><p>
Do not try the next server if you receive a SERVFAIL. The
@@ -573,7 +579,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631283"></a><h2>MULTIPLE QUERIES</h2>
+<a name="id2663338"></a><h2>MULTIPLE QUERIES</h2>
<p>
The BIND 9 implementation of <span><strong class="command">dig </strong></span>
supports
@@ -619,7 +625,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631436"></a><h2>IDN SUPPORT</h2>
+<a name="id2663424"></a><h2>IDN SUPPORT</h2>
<p>
If <span><strong class="command">dig</strong></span> has been built with IDN (internationalized
domain name) support, it can accept and display non-ASCII domain names.
@@ -633,14 +639,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631465"></a><h2>FILES</h2>
+<a name="id2663452"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
<p><code class="filename">${HOME}/.digrc</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631486"></a><h2>SEE ALSO</h2>
+<a name="id2663474"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">host</span>(1)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
@@ -648,7 +654,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2631524"></a><h2>BUGS</h2>
+<a name="id2663579"></a><h2>BUGS</h2>
<p>
There are probably too many query options.
</p>
diff --git a/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html b/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html
index 245d387..133bfbc 100644
--- a/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html
+++ b/contrib/bind9/doc/arm/man.dnssec-dsfromkey.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-dsfromkey.html,v 1.6.14.16 2010-08-20 02:05:40 tbox Exp $ -->
+<!-- $Id: man.dnssec-dsfromkey.html,v 1.74.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,18 +47,18 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] {keyfile}</p></div>
-<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>dir</code></em></code>] {dnsname}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] {keyfile}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-dsfromkey</code> {-s} [<code class="option">-1</code>] [<code class="option">-2</code>] [<code class="option">-a <em class="replaceable"><code>alg</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-s</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>file</code></em></code>] [<code class="option">-A</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {dnsname}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2604158"></a><h2>DESCRIPTION</h2>
+<a name="id2611192"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-dsfromkey</strong></span>
outputs the Delegation Signer (DS) resource record (RR), as defined in
RFC 3658 and RFC 4509, for the given key(s).
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604172"></a><h2>OPTIONS</h2>
+<a name="id2611411"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-1</span></dt>
<dd><p>
@@ -72,34 +72,54 @@
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd><p>
Select the digest algorithm. The value of
- <code class="option">algorithm</code> must be one of SHA-1 (SHA1) or
- SHA-256 (SHA256). These values are case insensitive.
+ <code class="option">algorithm</code> must be one of SHA-1 (SHA1),
+ SHA-256 (SHA256) or GOST. These values are case insensitive.
</p></dd>
-<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Sets the debugging level.
+ Look for key files (or, in keyset mode,
+ <code class="filename">keyset-</code> files) in
+ <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-f <em class="replaceable"><code>file</code></em></span></dt>
+<dd><p>
+ Zone file mode: in place of the keyfile name, the argument is
+ the DNS domain name of a zone master file, which can be read
+ from <code class="option">file</code>. If the zone name is the same as
+ <code class="option">file</code>, then it may be omitted.
+ </p></dd>
+<dt><span class="term">-A</span></dt>
+<dd><p>
+ Include ZSK's when generating DS records. Without this option,
+ only keys which have the KSK flag set will be converted to DS
+ records and printed. Useful only in zone file mode.
+ </p></dd>
+<dt><span class="term">-l <em class="replaceable"><code>domain</code></em></span></dt>
+<dd><p>
+ Generate a DLV set instead of a DS set. The specified
+ <code class="option">domain</code> is appended to the name for each
+ record in the set.
+ The DNSSEC Lookaside Validation (DLV) RR is described
+ in RFC 4431.
</p></dd>
<dt><span class="term">-s</span></dt>
<dd><p>
Keyset mode: in place of the keyfile name, the argument is
- the DNS domain name of a keyset file. Following options make sense
- only in this mode.
+ the DNS domain name of a keyset file.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
- Specifies the DNS class (default is IN), useful only
- in the keyset mode.
+ Specifies the DNS class (default is IN). Useful only
+ in keyset or zone file mode.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory, ignored when
- not in the keyset mode.
+ Sets the debugging level.
</p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2604302"></a><h2>EXAMPLE</h2>
+<a name="id2611600"></a><h2>EXAMPLE</h2>
<p>
To build the SHA-256 DS RR from the
<strong class="userinput"><code>Kexample.com.+003+26160</code></strong>
@@ -114,7 +134,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604407"></a><h2>FILES</h2>
+<a name="id2612114"></a><h2>FILES</h2>
<p>
The keyfile can be designed by the key identification
<code class="filename">Knnnn.+aaa+iiiii</code> or the full file name
@@ -128,22 +148,23 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604449"></a><h2>CAVEAT</h2>
+<a name="id2612155"></a><h2>CAVEAT</h2>
<p>
A keyfile error can give a "file not found" even if the file exists.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604458"></a><h2>SEE ALSO</h2>
+<a name="id2612165"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 3658</em>,
+ <em class="citetitle">RFC 4431</em>.
<em class="citetitle">RFC 4509</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604494"></a><h2>AUTHOR</h2>
+<a name="id2612204"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html b/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html
index 4a28c5e..670c85a 100644
--- a/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html
+++ b/contrib/bind9/doc/arm/man.dnssec-keyfromlabel.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-keyfromlabel.html,v 1.31.14.19 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.dnssec-keyfromlabel.html,v 1.110.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,26 +47,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-k</code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keyfromlabel</code> {-l <em class="replaceable"><code>label</code></em>} [<code class="option">-3</code>] [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-k</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-y</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2604823"></a><h2>DESCRIPTION</h2>
+<a name="id2612785"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keyfromlabel</strong></span>
gets keys with the given label from a crypto hardware and builds
key files for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034.
</p>
+<p>
+ The <code class="option">name</code> of the key is specified on the command
+ line. This must match the name of the zone for which the key is
+ being generated.
+ </p>
</div>
<div class="refsect1" lang="en">
-<a name="id2604837"></a><h2>OPTIONS</h2>
+<a name="id2612805"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. The value of
- <code class="option">algorithm</code> must be one of RSAMD5,
- RSASHA1, DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256,
- RSASHA512 or DH (Diffie Hellman).
+ <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
These values are case insensitive.
</p>
<p>
@@ -84,10 +88,23 @@
Note 2: DH automatically sets the -k flag.
</p>
</dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Specifies the name of the crypto hardware (OpenSSL engine).
+ When compiled with PKCS#11 support it defaults to "pkcs11".
+ </p></dd>
<dt><span class="term">-l <em class="replaceable"><code>label</code></em></span></dt>
<dd><p>
- Specifies the label of keys in the crypto hardware
- (PKCS#11 device).
+ Specifies the label of the key pair in the crypto hardware.
+ The label may be preceded by an optional OpenSSL engine name,
+ separated by a colon, as in "pkcs11:keylabel".
</p></dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
@@ -96,8 +113,17 @@
zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with
a host (KEY)),
USER (for a key associated with a user(KEY)) or OTHER (DNSKEY).
- These values are
- case insensitive.
+ These values are case insensitive.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keyfromlabel</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
</p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
@@ -107,12 +133,21 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-h</span></dt>
<dd><p>
Prints a short summary of the options and arguments to
- <span><strong class="command">dnssec-keygen</strong></span>.
+ <span><strong class="command">dnssec-keyfromlabel</strong></span>.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
</p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
@@ -120,7 +155,7 @@
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
- Sets the protocol value for the generated key. The protocol
+ Sets the protocol value for the key. The protocol
is a number between 0 and 255. The default is 3 (DNSSEC).
Other possible values for this argument are listed in
RFC 2535 and its successors.
@@ -136,10 +171,65 @@
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-y</span></dt>
+<dd><p>
+ Allows DNSSEC key files to be generated even if the key ID
+ would collide with that of an existing key, in the event of
+ either key being revoked. (This is only safe to use if you
+ are sure you won't be using RFC 5011 trust anchor maintenance
+ with either of the keys involved.)
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2613241"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2605316"></a><h2>GENERATED KEY FILES</h2>
+<a name="id2615114"></a><h2>GENERATED KEY FILES</h2>
<p>
When <span><strong class="command">dnssec-keyfromlabel</strong></span> completes
successfully,
@@ -151,8 +241,7 @@
<li><p><code class="filename">nnnn</code> is the key name.
</p></li>
<li><p><code class="filename">aaa</code> is the numeric representation
- of the
- algorithm.
+ of the algorithm.
</p></li>
<li><p><code class="filename">iiiii</code> is the key identifier (or
footprint).
@@ -163,8 +252,7 @@
on the printed string. <code class="filename">Knnnn.+aaa+iiiii.key</code>
contains the public key, and
<code class="filename">Knnnn.+aaa+iiiii.private</code> contains the
- private
- key.
+ private key.
</p>
<p>
The <code class="filename">.key</code> file contains a DNS KEY record
@@ -173,14 +261,14 @@
statement).
</p>
<p>
- The <code class="filename">.private</code> file contains algorithm
- specific
+ The <code class="filename">.private</code> file contains
+ algorithm-specific
fields. For obvious security reasons, this file does not have
general read permission.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2605410"></a><h2>SEE ALSO</h2>
+<a name="id2666203"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
@@ -188,7 +276,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2605443"></a><h2>AUTHOR</h2>
+<a name="id2666236"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.dnssec-keygen.html b/contrib/bind9/doc/arm/man.dnssec-keygen.html
index d775f56..3d63f8e 100644
--- a/contrib/bind9/doc/arm/man.dnssec-keygen.html
+++ b/contrib/bind9/doc/arm/man.dnssec-keygen.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-keygen.html,v 1.97.14.19 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.dnssec-keygen.html,v 1.179.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -23,7 +23,7 @@
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
<link rel="prev" href="man.dnssec-keyfromlabel.html" title="dnssec-keyfromlabel">
-<link rel="next" href="man.dnssec-signzone.html" title="dnssec-signzone">
+<link rel="next" href="man.dnssec-revoke.html" title="dnssec-revoke">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
@@ -33,7 +33,7 @@
<td width="20%" align="left">
<a accesskey="p" href="man.dnssec-keyfromlabel.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
-<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-revoke.html">Next</a>
</td>
</tr>
</table>
@@ -47,14 +47,15 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> {-a <em class="replaceable"><code>algorithm</code></em>} {-b <em class="replaceable"><code>keysize</code></em>} {-n <em class="replaceable"><code>nametype</code></em>} [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k</code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] {name}</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-keygen</code> [<code class="option">-a <em class="replaceable"><code>algorithm</code></em></code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-n <em class="replaceable"><code>nametype</code></em></code>] [<code class="option">-3</code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-C</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e</code>] [<code class="option">-f <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-G</code>] [<code class="option">-g <em class="replaceable"><code>generator</code></em></code>] [<code class="option">-h</code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k</code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-p <em class="replaceable"><code>protocol</code></em></code>] [<code class="option">-q</code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S <em class="replaceable"><code>key</code></em></code>] [<code class="option">-s <em class="replaceable"><code>strength</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] {name}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2605897"></a><h2>DESCRIPTION</h2>
+<a name="id2614215"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-keygen</strong></span>
generates keys for DNSSEC (Secure DNS), as defined in RFC 2535
and RFC 4034. It can also generate keys for use with
- TSIG (Transaction Signatures), as defined in RFC 2845.
+ TSIG (Transaction Signatures) as defined in RFC 2845, or TKEY
+ (Transaction Key) as defined in RFC 2930.
</p>
<p>
The <code class="option">name</code> of the key is specified on the command
@@ -63,37 +64,56 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2605917"></a><h2>OPTIONS</h2>
+<a name="id2614235"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a <em class="replaceable"><code>algorithm</code></em></span></dt>
<dd>
<p>
Selects the cryptographic algorithm. For DNSSEC keys, the value
of <code class="option">algorithm</code> must be one of RSAMD5, RSASHA1,
- DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256 or RSASHA512.
- For TSIG/TKEY, the value must
+ DSA, NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512 or ECCGOST.
+ For TSIG/TKEY, the value must
be DH (Diffie Hellman), HMAC-MD5, HMAC-SHA1, HMAC-SHA224,
HMAC-SHA256, HMAC-SHA384, or HMAC-SHA512. These values are
case insensitive.
</p>
<p>
+ If no algorithm is specified, then RSASHA1 will be used by
+ default, unless the <code class="option">-3</code> option is specified,
+ in which case NSEC3RSASHA1 will be used instead. (If
+ <code class="option">-3</code> is used and an algorithm is specified,
+ that algorithm will be checked for compatibility with NSEC3.)
+ </p>
+<p>
Note 1: that for DNSSEC, RSASHA1 is a mandatory to implement
algorithm, and DSA is recommended. For TSIG, HMAC-MD5 is
mandatory.
</p>
<p>
- Note 2: HMAC-MD5 and DH automatically set the -k flag.
+ Note 2: DH, HMAC-MD5, and HMAC-SHA1 through HMAC-SHA512
+ automatically set the -T KEY option.
</p>
</dd>
<dt><span class="term">-b <em class="replaceable"><code>keysize</code></em></span></dt>
-<dd><p>
+<dd>
+<p>
Specifies the number of bits in the key. The choice of key
size depends on the algorithm used. RSA keys must be
between 512 and 2048 bits. Diffie Hellman keys must be between
128 and 4096 bits. DSA keys must be between 512 and 1024
bits and an exact multiple of 64. HMAC keys must be
between 1 and 512 bits.
- </p></dd>
+ </p>
+<p>
+ The key size does not need to be specified if using a default
+ algorithm. The default key size is 1024 bits for zone signing
+ keys (ZSK's) and 2048 bits for key signing keys (KSK's,
+ generated with <code class="option">-f KSK</code>). However, if an
+ algorithm is explicitly specified with the <code class="option">-a</code>,
+ then there is no default key size, and the <code class="option">-b</code>
+ must be used.
+ </p>
+</dd>
<dt><span class="term">-n <em class="replaceable"><code>nametype</code></em></span></dt>
<dd><p>
Specifies the owner type of the key. The value of
@@ -104,11 +124,36 @@
These values are case insensitive. Defaults to ZONE for DNSKEY
generation.
</p></dd>
+<dt><span class="term">-3</span></dt>
+<dd><p>
+ Use an NSEC3-capable algorithm to generate a DNSSEC key.
+ If this option is used and no algorithm is explicitly
+ set on the command line, NSEC3RSASHA1 will be used by
+ default. Note that RSASHA256, RSASHA512 and ECCGOST algorithms
+ are NSEC3-capable.
+ </p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: generates an old-style key, without
+ any metadata. By default, <span><strong class="command">dnssec-keygen</strong></span>
+ will include the key's creation date in the metadata stored
+ with the private key, and other dates may be set there as well
+ (publication date, activation date, etc). Keys that include
+ this data may be incompatible with older versions of BIND; the
+ <code class="option">-C</code> option suppresses them.
+ </p></dd>
<dt><span class="term">-c <em class="replaceable"><code>class</code></em></span></dt>
<dd><p>
Indicates that the DNS record containing the key should have
the specified class. If not specified, class IN is used.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for random number
+ and, when supported, key generation. When compiled with PKCS#11
+ support it defaults to pkcs11; the empty name resets it to
+ no engine.
+ </p></dd>
<dt><span class="term">-e</span></dt>
<dd><p>
If generating an RSAMD5/RSASHA1 key, use a large exponent.
@@ -116,7 +161,12 @@
<dt><span class="term">-f <em class="replaceable"><code>flag</code></em></span></dt>
<dd><p>
Set the specified flag in the flag field of the KEY/DNSKEY record.
- The only recognized flag is KSK (Key Signing Key) DNSKEY.
+ The only recognized flags are KSK (Key Signing Key) and REVOKE.
+ </p></dd>
+<dt><span class="term">-G</span></dt>
+<dd><p>
+ Generate a key, but do not publish it or sign with it. This
+ option is incompatible with -P and -A.
</p></dd>
<dt><span class="term">-g <em class="replaceable"><code>generator</code></em></span></dt>
<dd><p>
@@ -130,9 +180,13 @@
Prints a short summary of the options and arguments to
<span><strong class="command">dnssec-keygen</strong></span>.
</p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to be written.
+ </p></dd>
<dt><span class="term">-k</span></dt>
<dd><p>
- Generate KEY records rather than DNSKEY records.
+ Deprecated in favor of -T KEY.
</p></dd>
<dt><span class="term">-p <em class="replaceable"><code>protocol</code></em></span></dt>
<dd><p>
@@ -141,6 +195,20 @@
Other possible values for this argument are listed in
RFC 2535 and its successors.
</p></dd>
+<dt><span class="term">-q</span></dt>
+<dd><p>
+ Quiet mode: Suppresses unnecessary output, including
+ progress indication. Without this option, when
+ <span><strong class="command">dnssec-keygen</strong></span> is run interactively
+ to generate an RSA or DSA key pair, it will print a string
+ of symbols to <code class="filename">stderr</code> indicating the
+ progress of the key generation. A '.' indicates that a
+ random number has been found which passed an initial
+ sieve test; '+' means a number has passed a single
+ round of the Miller-Rabin primality test; a space
+ means that the number has passed all the tests and is
+ a satisfactory key.
+ </p></dd>
<dt><span class="term">-r <em class="replaceable"><code>randomdev</code></em></span></dt>
<dd><p>
Specifies the source of randomness. If the operating
@@ -153,12 +221,37 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>key</code></em></span></dt>
+<dd><p>
+ Create a new key which is an explicit successor to an
+ existing key. The name, algorithm, size, and type of the
+ key will be set to match the existing key. The activation
+ date of the new key will be set to the inactivation date of
+ the existing one. The publication date will be set to the
+ activation date minus the prepublication interval, which
+ defaults to 30 days.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>strength</code></em></span></dt>
<dd><p>
Specifies the strength value of the key. The strength is
a number between 0 and 15, and currently has no defined
purpose in DNSSEC.
</p></dd>
+<dt><span class="term">-T <em class="replaceable"><code>rrtype</code></em></span></dt>
+<dd>
+<p>
+ Specifies the resource record type to use for the key.
+ <code class="option">rrtype</code> must be either DNSKEY or KEY. The
+ default is DNSKEY when using a DNSSEC algorithm, but it can be
+ overridden to KEY for use with SIG(0).
+ </p>
+<p>
+ </p>
+<p>
+ Using any TSIG algorithm (HMAC-* or DH) forces this option
+ to KEY.
+ </p>
+</dd>
<dt><span class="term">-t <em class="replaceable"><code>type</code></em></span></dt>
<dd><p>
Indicates the use of the key. <code class="option">type</code> must be
@@ -173,7 +266,78 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2606397"></a><h2>GENERATED KEYS</h2>
+<a name="id2667657"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it. If not set, and if the -G option has
+ not been used, the default is "now".
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it. If not set, and if the -G option has not been used, the
+ default is "now".
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being created as an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2667847"></a><h2>GENERATED KEYS</h2>
<p>
When <span><strong class="command">dnssec-keygen</strong></span> completes
successfully,
@@ -219,7 +383,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2606505"></a><h2>EXAMPLE</h2>
+<a name="id2667955"></a><h2>EXAMPLE</h2>
<p>
To generate a 768-bit DSA key for the domain
<strong class="userinput"><code>example.com</code></strong>, the following command would be
@@ -240,7 +404,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608814"></a><h2>SEE ALSO</h2>
+<a name="id2668080"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 2539</em>,
@@ -249,7 +413,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608845"></a><h2>AUTHOR</h2>
+<a name="id2668110"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -261,14 +425,14 @@
<td width="40%" align="left">
<a accesskey="p" href="man.dnssec-keyfromlabel.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
-<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-revoke.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
<span class="application">dnssec-keyfromlabel</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
-<td width="40%" align="right" valign="top"> <span class="application">dnssec-signzone</span>
+<td width="40%" align="right" valign="top"> <span class="application">dnssec-revoke</span>
</td>
</tr>
</table>
diff --git a/contrib/bind9/doc/arm/man.dnssec-revoke.html b/contrib/bind9/doc/arm/man.dnssec-revoke.html
new file mode 100644
index 0000000..1c9ba5a
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.dnssec-revoke.html
@@ -0,0 +1,126 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.dnssec-revoke.html,v 1.62.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-revoke</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.dnssec-keygen.html" title="dnssec-keygen">
+<link rel="next" href="man.dnssec-settime.html" title="dnssec-settime">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">dnssec-revoke</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-settime.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.dnssec-revoke"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-revoke</span> &#8212; Set the REVOKED bit on a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-revoke</code> [<code class="option">-hr</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-f</code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614277"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-revoke</strong></span>
+ reads a DNSSEC key file, sets the REVOKED bit on the key as defined
+ in RFC 5011, and creates a new pair of key files containing the
+ now-revoked key.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614291"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-r</span></dt>
+<dd><p>
+ After writing the new keyset files remove the original keyset
+ files.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force overwrite: Causes <span><strong class="command">dnssec-revoke</strong></span> to
+ write the new key pair even if a file already exists matching
+ the algorithm and key ID of the revoked key.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614398"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614423"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-settime.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">dnssec-keygen</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">dnssec-settime</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.dnssec-settime.html b/contrib/bind9/doc/arm/man.dnssec-settime.html
new file mode 100644
index 0000000..19e467e
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.dnssec-settime.html
@@ -0,0 +1,247 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.dnssec-settime.html,v 1.58.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>dnssec-settime</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.dnssec-revoke.html" title="dnssec-revoke">
+<link rel="next" href="man.dnssec-signzone.html" title="dnssec-signzone">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">dnssec-settime</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.dnssec-revoke.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.dnssec-settime"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">dnssec-settime</span> &#8212; Set the key timing metadata for a DNSSEC key</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">dnssec-settime</code> [<code class="option">-f</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-P <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-A <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-R <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-I <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-D <em class="replaceable"><code>date/offset</code></em></code>] [<code class="option">-h</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] {keyfile}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614556"></a><h2>DESCRIPTION</h2>
+<p><span><strong class="command">dnssec-settime</strong></span>
+ reads a DNSSEC private key file and sets the key timing metadata
+ as specified by the <code class="option">-P</code>, <code class="option">-A</code>,
+ <code class="option">-R</code>, <code class="option">-I</code>, and <code class="option">-D</code>
+ options. The metadata can then be used by
+ <span><strong class="command">dnssec-signzone</strong></span> or other signing software to
+ determine when a key is to be published, whether it should be
+ used for signing a zone, etc.
+ </p>
+<p>
+ If none of these options is set on the command line,
+ then <span><strong class="command">dnssec-settime</strong></span> simply prints the key timing
+ metadata already stored in the key.
+ </p>
+<p>
+ When key metadata fields are changed, both files of a key
+ pair (<code class="filename">Knnnn.+aaa+iiiii.key</code> and
+ <code class="filename">Knnnn.+aaa+iiiii.private</code>) are regenerated.
+ Metadata fields are stored in the private file. A human-readable
+ description of the metadata is also placed in comments in the key
+ file.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2614615"></a><h2>OPTIONS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-f</span></dt>
+<dd><p>
+ Force an update of an old-format key with no metadata fields.
+ Without this option, <span><strong class="command">dnssec-settime</strong></span> will
+ fail when attempting to update a legacy key. With this option,
+ the key will be recreated in the new format, but with the
+ original key data retained. The key's creation date will be
+ set to the present time.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Sets the directory in which the key files are to reside.
+ </p></dd>
+<dt><span class="term">-h</span></dt>
+<dd><p>
+ Emit usage message and exit.
+ </p></dd>
+<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
+<dd><p>
+ Sets the debugging level.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Use the given OpenSSL engine. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615323"></a><h2>TIMING OPTIONS</h2>
+<p>
+ Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS.
+ If the argument begins with a '+' or '-', it is interpreted as
+ an offset from the present time. For convenience, if such an offset
+ is followed by one of the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi',
+ then the offset is computed in years (defined as 365 24-hour days,
+ ignoring leap years), months (defined as 30 24-hour days), weeks,
+ days, hours, or minutes, respectively. Without a suffix, the offset
+ is computed in seconds. To unset a date, use 'none'.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-P <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which a key is to be published to the zone.
+ After that date, the key will be included in the zone but will
+ not be used to sign it.
+ </p></dd>
+<dt><span class="term">-A <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be activated. After that
+ date, the key will be included in the zone and used to sign
+ it.
+ </p></dd>
+<dt><span class="term">-R <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be revoked. After that
+ date, the key will be flagged as revoked. It will be included
+ in the zone and will be used to sign it.
+ </p></dd>
+<dt><span class="term">-I <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be retired. After that
+ date, the key will still be included in the zone, but it
+ will not be used to sign it.
+ </p></dd>
+<dt><span class="term">-D <em class="replaceable"><code>date/offset</code></em></span></dt>
+<dd><p>
+ Sets the date on which the key is to be deleted. After that
+ date, the key will no longer be included in the zone. (It
+ may remain in the key repository, however.)
+ </p></dd>
+<dt><span class="term">-S <em class="replaceable"><code>predecessor key</code></em></span></dt>
+<dd><p>
+ Select a key for which the key being modified will be an
+ explicit successor. The name, algorithm, size, and type of the
+ predecessor key must exactly match those of the key being
+ modified. The activation date of the successor key will be set
+ to the inactivation date of the predecessor. The publication
+ date will be set to the activation date minus the prepublication
+ interval, which defaults to 30 days.
+ </p></dd>
+<dt><span class="term">-i <em class="replaceable"><code>interval</code></em></span></dt>
+<dd>
+<p>
+ Sets the prepublication interval for a key. If set, then
+ the publication and activation dates must be separated by at least
+ this much time. If the activation date is specified but the
+ publication date isn't, then the publication date will default
+ to this much time before the activation date; conversely, if
+ the publication date is specified but activation date isn't,
+ then activation will be set to this much time after publication.
+ </p>
+<p>
+ If the key is being set to be an explicit successor to another
+ key, then the default prepublication interval is 30 days;
+ otherwise it is zero.
+ </p>
+<p>
+ As with date offsets, if the argument is followed by one of
+ the suffixes 'y', 'mo', 'w', 'd', 'h', or 'mi', then the
+ interval is measured in years, months, weeks, days, hours,
+ or minutes, respectively. Without a suffix, the interval is
+ measured in seconds.
+ </p>
+</dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615598"></a><h2>PRINTING OPTIONS</h2>
+<p>
+ <span><strong class="command">dnssec-settime</strong></span> can also be used to print the
+ timing metadata associated with a key.
+ </p>
+<div class="variablelist"><dl>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Print times in UNIX epoch format.
+ </p></dd>
+<dt><span class="term">-p <em class="replaceable"><code>C/P/A/R/I/D/all</code></em></span></dt>
+<dd><p>
+ Print a specific metadata value or set of metadata values.
+ The <code class="option">-p</code> option may be followed by one or more
+ of the following letters to indicate which value or values to print:
+ <code class="option">C</code> for the creation date,
+ <code class="option">P</code> for the publication date,
+ <code class="option">A</code> for the activation date,
+ <code class="option">R</code> for the revocation date,
+ <code class="option">I</code> for the inactivation date, or
+ <code class="option">D</code> for the deletion date.
+ To print all of the metadata, use <code class="option">-p all</code>.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615678"></a><h2>SEE ALSO</h2>
+<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">dnssec-signzone</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5011</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2615712"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.dnssec-revoke.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.dnssec-signzone.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">dnssec-revoke</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">dnssec-signzone</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.dnssec-signzone.html b/contrib/bind9/doc/arm/man.dnssec-signzone.html
index 42bf068..05cea6e 100644
--- a/contrib/bind9/doc/arm/man.dnssec-signzone.html
+++ b/contrib/bind9/doc/arm/man.dnssec-signzone.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.dnssec-signzone.html,v 1.94.14.25 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: man.dnssec-signzone.html,v 1.179.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
-<link rel="prev" href="man.dnssec-keygen.html" title="dnssec-keygen">
+<link rel="prev" href="man.dnssec-settime.html" title="dnssec-settime">
<link rel="next" href="man.named-checkconf.html" title="named-checkconf">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -31,7 +31,7 @@
<tr><th colspan="3" align="center"><span class="application">dnssec-signzone</span></th></tr>
<tr>
<td width="20%" align="left">
-<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<a accesskey="p" href="man.dnssec-settime.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
<td width="20%" align="right"> <a accesskey="n" href="man.named-checkconf.html">Next</a>
</td>
@@ -47,21 +47,21 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-t</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
+<div class="cmdsynopsis"><p><code class="command">dnssec-signzone</code> [<code class="option">-a</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-d <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine</code></em></code>] [<code class="option">-e <em class="replaceable"><code>end-time</code></em></code>] [<code class="option">-f <em class="replaceable"><code>output-file</code></em></code>] [<code class="option">-g</code>] [<code class="option">-h</code>] [<code class="option">-K <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key</code></em></code>] [<code class="option">-l <em class="replaceable"><code>domain</code></em></code>] [<code class="option">-i <em class="replaceable"><code>interval</code></em></code>] [<code class="option">-I <em class="replaceable"><code>input-format</code></em></code>] [<code class="option">-j <em class="replaceable"><code>jitter</code></em></code>] [<code class="option">-N <em class="replaceable"><code>soa-serial-format</code></em></code>] [<code class="option">-o <em class="replaceable"><code>origin</code></em></code>] [<code class="option">-O <em class="replaceable"><code>output-format</code></em></code>] [<code class="option">-p</code>] [<code class="option">-P</code>] [<code class="option">-r <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-S</code>] [<code class="option">-s <em class="replaceable"><code>start-time</code></em></code>] [<code class="option">-T <em class="replaceable"><code>ttl</code></em></code>] [<code class="option">-t</code>] [<code class="option">-u</code>] [<code class="option">-v <em class="replaceable"><code>level</code></em></code>] [<code class="option">-x</code>] [<code class="option">-z</code>] [<code class="option">-3 <em class="replaceable"><code>salt</code></em></code>] [<code class="option">-H <em class="replaceable"><code>iterations</code></em></code>] [<code class="option">-A</code>] {zonefile} [key...]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2607637"></a><h2>DESCRIPTION</h2>
+<a name="id2616507"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">dnssec-signzone</strong></span>
signs a zone. It generates
NSEC and RRSIG records and produces a signed version of the
- zone. It also generates a <code class="filename">keyset-</code> file containing
- the key-signing keys for the zone, and if signing a zone which
- contains delegations, it can optionally generate DS records for
- the child zones from their <code class="filename">keyset-</code> files.
+ zone. The security status of delegations from the signed zone
+ (that is, whether the child zones are secure or not) is
+ determined by the presence or absence of a
+ <code class="filename">keyset</code> file for each child zone.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2607661"></a><h2>OPTIONS</h2>
+<a name="id2617346"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd><p>
@@ -71,6 +71,38 @@
<dd><p>
Specifies the DNS class of the zone.
</p></dd>
+<dt><span class="term">-C</span></dt>
+<dd><p>
+ Compatibility mode: Generate a
+ <code class="filename">keyset-<em class="replaceable"><code>zonename</code></em></code>
+ file in addition to
+ <code class="filename">dsset-<em class="replaceable"><code>zonename</code></em></code>
+ when signing a zone, for use by older versions of
+ <span><strong class="command">dnssec-signzone</strong></span>.
+ </p></dd>
+<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Look for <code class="filename">dsset-</code> or
+ <code class="filename">keyset-</code> files in <code class="option">directory</code>.
+ </p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine</code></em></span></dt>
+<dd><p>
+ Uses a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ it defaults to pkcs11; the empty name resets it to no engine.
+ </p></dd>
+<dt><span class="term">-g</span></dt>
+<dd><p>
+ Generate DS records for child zones from
+ <code class="filename">dsset-</code> or <code class="filename">keyset-</code>
+ file. Existing DS records will be removed.
+ </p></dd>
+<dt><span class="term">-K <em class="replaceable"><code>directory</code></em></span></dt>
+<dd><p>
+ Key repository: Specify a directory to search for DNSSEC keys.
+ If not specified, defaults to the current directory.
+ </p></dd>
<dt><span class="term">-k <em class="replaceable"><code>key</code></em></span></dt>
<dd><p>
Treat specified key as a key signing key ignoring any
@@ -81,18 +113,6 @@
Generate a DLV set in addition to the key (DNSKEY) and DS sets.
The domain is appended to the name of the records.
</p></dd>
-<dt><span class="term">-d <em class="replaceable"><code>directory</code></em></span></dt>
-<dd><p>
- Look for <code class="filename">keyset</code> files in
- <code class="option">directory</code> as the directory
- </p></dd>
-<dt><span class="term">-g</span></dt>
-<dd><p>
- If the zone contains any delegations, and there are
- <code class="filename">keyset-</code> files for any of the child zones,
- then DS records for the child zones will be generated from the
- keys in those files. Existing DS records will be removed.
- </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>start-time</code></em></span></dt>
<dd><p>
Specify the date and time when the generated RRSIG records
@@ -113,6 +133,8 @@
the start time. A time relative to the current time is
indicated with now+N. If no <code class="option">end-time</code> is
specified, 30 days from the start time is used as a default.
+ <code class="option">end-time</code> must be later than
+ <code class="option">start-time</code>.
</p></dd>
<dt><span class="term">-f <em class="replaceable"><code>output-file</code></em></span></dt>
<dd><p>
@@ -247,35 +269,119 @@
<code class="filename">keyboard</code> indicates that keyboard
input should be used.
</p></dd>
+<dt><span class="term">-S</span></dt>
+<dd>
+<p>
+ Smart signing: Instructs <span><strong class="command">dnssec-signzone</strong></span> to
+ search the key repository for keys that match the zone being
+ signed, and to include them in the zone if appropriate.
+ </p>
+<p>
+ When a key is found, its timing metadata is examined to
+ determine how it should be used, according to the following
+ rules. Each successive rule takes priority over the prior
+ ones:
+ </p>
+<div class="variablelist"><dl>
+<dt></dt>
+<dd><p>
+ If no timing metadata has been set for the key, the key is
+ published in the zone and used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's publication date is set and is in the past, the
+ key is published in the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's activation date is set and in the past, the
+ key is published (regardless of publication date) and
+ used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If the key's revocation date is set and in the past, and the
+ key is published, then the key is revoked, and the revoked key
+ is used to sign the zone.
+ </p></dd>
+<dt></dt>
+<dd><p>
+ If either of the key's unpublication or deletion dates are set
+ and in the past, the key is NOT published or used to sign the
+ zone, regardless of any other metadata.
+ </p></dd>
+</dl></div>
+</dd>
+<dt><span class="term">-T <em class="replaceable"><code>ttl</code></em></span></dt>
+<dd><p>
+ Specifies the TTL to be used for new DNSKEY records imported
+ into the zone from the key repository. If not specified,
+ the default is the minimum TTL value from the zone's SOA
+ record. This option is ignored when signing without
+ <code class="option">-S</code>, since DNSKEY records are not imported
+ from the key repository in that case. It is also ignored if
+ there are any pre-existing DNSKEY records at the zone apex,
+ in which case new records' TTL values will be set to match
+ them.
+ </p></dd>
<dt><span class="term">-t</span></dt>
<dd><p>
Print statistics at completion.
</p></dd>
+<dt><span class="term">-u</span></dt>
+<dd><p>
+ Update NSEC/NSEC3 chain when re-signing a previously signed
+ zone. With this option, a zone signed with NSEC can be
+ switched to NSEC3, or a zone signed with NSEC3 can
+ be switch to NSEC or to NSEC3 with different parameters.
+ Without this option, <span><strong class="command">dnssec-signzone</strong></span> will
+ retain the existing chain when re-signing.
+ </p></dd>
<dt><span class="term">-v <em class="replaceable"><code>level</code></em></span></dt>
<dd><p>
Sets the debugging level.
</p></dd>
+<dt><span class="term">-x</span></dt>
+<dd><p>
+ Only sign the DNSKEY RRset with key-signing keys, and omit
+ signatures from zone-signing keys. (This is similar to the
+ <span><strong class="command">dnssec-dnskey-kskonly yes;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
- Ignore KSK flag on key when determining what to sign.
+ Ignore KSK flag on key when determining what to sign. This
+ causes KSK-flagged keys to sign all records, not just the
+ DNSKEY RRset. (This is similar to the
+ <span><strong class="command">update-check-ksk no;</strong></span> zone option in
+ <span><strong class="command">named</strong></span>.)
</p></dd>
<dt><span class="term">-3 <em class="replaceable"><code>salt</code></em></span></dt>
<dd><p>
- Generate a NSEC3 chain with the given hex encoded salt.
+ Generate an NSEC3 chain with the given hex encoded salt.
A dash (<em class="replaceable"><code>salt</code></em>) can
be used to indicate that no salt is to be used when generating the NSEC3 chain.
</p></dd>
<dt><span class="term">-H <em class="replaceable"><code>iterations</code></em></span></dt>
<dd><p>
- When generating a NSEC3 chain use this many interations. The
- default is 100.
+ When generating an NSEC3 chain, use this many interations. The
+ default is 10.
</p></dd>
<dt><span class="term">-A</span></dt>
-<dd><p>
- When generating a NSEC3 chain set the OPTOUT flag on all
+<dd>
+<p>
+ When generating an NSEC3 chain set the OPTOUT flag on all
NSEC3 records and do not generate NSEC3 records for insecure
delegations.
- </p></dd>
+ </p>
+<p>
+ Using this option twice (i.e., <code class="option">-AA</code>)
+ turns the OPTOUT flag off for all records. This is useful
+ when using the <code class="option">-u</code> option to modify an NSEC3
+ chain which previously had OPTOUT set.
+ </p>
+</dd>
<dt><span class="term">zonefile</span></dt>
<dd><p>
The file containing the zone to be signed.
@@ -291,14 +397,15 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2659554"></a><h2>EXAMPLE</h2>
+<a name="id2671803"></a><h2>EXAMPLE</h2>
<p>
The following command signs the <strong class="userinput"><code>example.com</code></strong>
zone with the DSA key generated by <span><strong class="command">dnssec-keygen</strong></span>
- (Kexample.com.+003+17247). The zone's keys must be in the master
- file (<code class="filename">db.example.com</code>). This invocation looks
- for <code class="filename">keyset</code> files, in the current directory,
- so that DS records can be generated from them (<span><strong class="command">-g</strong></span>).
+ (Kexample.com.+003+17247). Because the <span><strong class="command">-S</strong></span> option
+ is not being used, the zone's keys must be in the master file
+ (<code class="filename">db.example.com</code>). This invocation looks
+ for <code class="filename">dsset</code> files, in the current directory,
+ so that DS records can be imported from them (<span><strong class="command">-g</strong></span>).
</p>
<pre class="programlisting">% dnssec-signzone -g -o example.com db.example.com \
Kexample.com.+003+17247
@@ -320,39 +427,14 @@ db.example.com.signed
%</pre>
</div>
<div class="refsect1" lang="en">
-<a name="id2659694"></a><h2>KNOWN BUGS</h2>
-<p>
- <span><strong class="command">dnssec-signzone</strong></span> was designed so that it could
- sign a zone partially, using only a subset of the DNSSEC keys
- needed to produce a fully-signed zone. This permits a zone
- administrator, for example, to sign a zone with one key on one
- machine, move the resulting partially-signed zone to a second
- machine, and sign it again with a second key.
- </p>
-<p>
- An unfortunate side-effect of this flexibility is that
- <span><strong class="command">dnssec-signzone</strong></span> does not check to make sure
- it's signing a zone with any valid keys at all. An attempt to
- sign a zone without any keys will appear to succeed, producing
- a "signed" zone with no signatures. There is no warning issued
- when a zone is not fully signed.
- </p>
-<p>
- This will be corrected in a future release. In the meantime, ISC
- recommends examining the output of <span><strong class="command">dnssec-signzone</strong></span>
- to confirm that the zone is properly signed by all keys before
- using it.
- </p>
-</div>
-<div class="refsect1" lang="en">
-<a name="id2659726"></a><h2>SEE ALSO</h2>
+<a name="id2671882"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>,
<em class="citetitle">RFC 4033</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2659751"></a><h2>AUTHOR</h2>
+<a name="id2671907"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -362,14 +444,14 @@ db.example.com.signed
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
-<a accesskey="p" href="man.dnssec-keygen.html">Prev</a> </td>
+<a accesskey="p" href="man.dnssec-settime.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="man.named-checkconf.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
-<span class="application">dnssec-keygen</span> </td>
+<span class="application">dnssec-settime</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
<td width="40%" align="right" valign="top"> <span class="application">named-checkconf</span>
</td>
diff --git a/contrib/bind9/doc/arm/man.genrandom.html b/contrib/bind9/doc/arm/man.genrandom.html
new file mode 100644
index 0000000..c9ecc8e
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.genrandom.html
@@ -0,0 +1,112 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.genrandom.html,v 1.34.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>genrandom</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.arpaname.html" title="arpaname">
+<link rel="next" href="man.isc-hmac-fixup.html" title="isc-hmac-fixup">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">genrandom</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.arpaname.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.isc-hmac-fixup.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.genrandom"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">genrandom</span> &#8212; generate a file containing random data</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">genrandom</code> [<code class="option">-n <em class="replaceable"><code>number</code></em></code>] {<em class="replaceable"><code>size</code></em>} {<em class="replaceable"><code>filename</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649447"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">genrandom</strong></span>
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649462"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">-n <em class="replaceable"><code>number</code></em></span></dt>
+<dd><p>
+ In place of generating one file, generates <code class="option">number</code>
+ (from 2 to 9) files, appending <code class="option">number</code> to the name.
+ </p></dd>
+<dt><span class="term">size</span></dt>
+<dd><p>
+ The size of the file, in kilobytes, to generate.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The file name into which random data should be written.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649523"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">rand</span>(3)</span>,
+ <span class="citerefentry"><span class="refentrytitle">arc4random</span>(3)</span>
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2649549"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.arpaname.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.isc-hmac-fixup.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">arpaname</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">isc-hmac-fixup</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.host.html b/contrib/bind9/doc/arm/man.host.html
index 990d67e..7322353 100644
--- a/contrib/bind9/doc/arm/man.host.html
+++ b/contrib/bind9/doc/arm/man.host.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.host.html,v 1.93.14.17 2010-08-20 02:05:40 tbox Exp $ -->
+<!-- $Id: man.host.html,v 1.160.8.1.2.1 2011-06-09 03:41:09 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -50,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">host</code> [<code class="option">-aCdlnrsTwv</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-N <em class="replaceable"><code>ndots</code></em></code>] [<code class="option">-R <em class="replaceable"><code>number</code></em></code>] [<code class="option">-t <em class="replaceable"><code>type</code></em></code>] [<code class="option">-W <em class="replaceable"><code>wait</code></em></code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-4</code>] [<code class="option">-6</code>] {name} [server]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2603383"></a><h2>DESCRIPTION</h2>
+<a name="id2610368"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">host</strong></span>
is a simple utility for performing DNS lookups.
It is normally used to convert names to IP addresses and vice versa.
@@ -202,7 +202,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2603897"></a><h2>IDN SUPPORT</h2>
+<a name="id2610882"></a><h2>IDN SUPPORT</h2>
<p>
If <span><strong class="command">host</strong></span> has been built with IDN (internationalized
domain name) support, it can accept and display non-ASCII domain names.
@@ -216,12 +216,12 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2603926"></a><h2>FILES</h2>
+<a name="id2610910"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2603940"></a><h2>SEE ALSO</h2>
+<a name="id2610924"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">dig</span>(1)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>.
</p>
diff --git a/contrib/bind9/doc/arm/man.isc-hmac-fixup.html b/contrib/bind9/doc/arm/man.isc-hmac-fixup.html
new file mode 100644
index 0000000..bff6e91
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.isc-hmac-fixup.html
@@ -0,0 +1,122 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.isc-hmac-fixup.html,v 1.31.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>isc-hmac-fixup</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.genrandom.html" title="genrandom">
+<link rel="next" href="man.nsec3hash.html" title="nsec3hash">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">isc-hmac-fixup</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.genrandom.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.nsec3hash.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.isc-hmac-fixup"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">isc-hmac-fixup</span> &#8212; fixes HMAC keys generated by older versions of BIND</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">isc-hmac-fixup</code> {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>secret</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650556"></a><h2>DESCRIPTION</h2>
+<p>
+ Versions of BIND 9 up to and including BIND 9.6 had a bug causing
+ HMAC-SHA* TSIG keys which were longer than the digest length of the
+ hash algorithm (i.e., SHA1 keys longer than 160 bits, SHA256 keys
+ longer than 256 bits, etc) to be used incorrectly, generating a
+ message authentication code that was incompatible with other DNS
+ implementations.
+ </p>
+<p>
+ This bug has been fixed in BIND 9.7. However, the fix may
+ cause incompatibility between older and newer versions of
+ BIND, when using long keys. <span><strong class="command">isc-hmac-fixup</strong></span>
+ modifies those keys to restore compatibility.
+ </p>
+<p>
+ To modify a key, run <span><strong class="command">isc-hmac-fixup</strong></span> and
+ specify the key's algorithm and secret on the command line. If the
+ secret is longer than the digest length of the algorithm (64 bytes
+ for SHA1 through SHA256, or 128 bytes for SHA384 and SHA512), then a
+ new secret will be generated consisting of a hash digest of the old
+ secret. (If the secret did not require conversion, then it will be
+ printed without modification.)
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650584"></a><h2>SECURITY CONSIDERATIONS</h2>
+<p>
+ Secrets that have been converted by <span><strong class="command">isc-hmac-fixup</strong></span>
+ are shortened, but as this is how the HMAC protocol works in
+ operation anyway, it does not affect security. RFC 2104 notes,
+ "Keys longer than [the digest length] are acceptable but the
+ extra length would not significantly increase the function
+ strength."
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650600"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 2104</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2650617"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.genrandom.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.nsec3hash.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">genrandom</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">nsec3hash</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.named-checkconf.html b/contrib/bind9/doc/arm/man.named-checkconf.html
index 8bf240b..d6eff94 100644
--- a/contrib/bind9/doc/arm/man.named-checkconf.html
+++ b/contrib/bind9/doc/arm/man.named-checkconf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.named-checkconf.html,v 1.92.14.22 2010-08-20 02:05:39 tbox Exp $ -->
+<!-- $Id: man.named-checkconf.html,v 1.174.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,17 +47,30 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-z</code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkconf</code> [<code class="option">-h</code>] [<code class="option">-v</code>] [<code class="option">-j</code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] {filename} [<code class="option">-p</code>] [<code class="option">-z</code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2608468"></a><h2>DESCRIPTION</h2>
+<a name="id2617782"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkconf</strong></span>
- checks the syntax, but not the semantics, of a named
- configuration file.
+ checks the syntax, but not the semantics, of a
+ <span><strong class="command">named</strong></span> configuration file. The file is parsed
+ and checked for syntax errors, along with all files included by it.
+ If no file is specified, <code class="filename">/etc/named.conf</code> is read
+ by default.
+ </p>
+<p>
+ Note: files that <span><strong class="command">named</strong></span> reads in separate
+ parser contexts, such as <code class="filename">rndc.key</code> and
+ <code class="filename">bind.keys</code>, are not automatically read
+ by <span><strong class="command">named-checkconf</strong></span>. Configuration
+ errors in these files may cause <span><strong class="command">named</strong></span> to
+ fail to run, even if <span><strong class="command">named-checkconf</strong></span> was
+ successful. <span><strong class="command">named-checkconf</strong></span> can be run
+ on these files explicitly, however.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608482"></a><h2>OPTIONS</h2>
+<a name="id2617852"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-h</span></dt>
<dd><p>
@@ -65,8 +78,7 @@
</p></dd>
<dt><span class="term">-t <em class="replaceable"><code>directory</code></em></span></dt>
<dd><p>
- Chroot to <code class="filename">directory</code> so that
- include
+ Chroot to <code class="filename">directory</code> so that include
directives in the configuration file are processed as if
run by a similarly chrooted named.
</p></dd>
@@ -75,6 +87,11 @@
Print the version of the <span><strong class="command">named-checkconf</strong></span>
program and exit.
</p></dd>
+<dt><span class="term">-p</span></dt>
+<dd><p>
+ Print out the <code class="filename">named.conf</code> and included files
+ in canonical form if no errors were detected.
+ </p></dd>
<dt><span class="term">-z</span></dt>
<dd><p>
Perform a test load of all master zones found in
@@ -92,21 +109,21 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2608598"></a><h2>RETURN VALUES</h2>
+<a name="id2617987"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkconf</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608885"></a><h2>SEE ALSO</h2>
+<a name="id2618001"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkzone</span>(8)</span>,
<em class="citetitle">BIND 9 Administrator Reference Manual</em>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2608915"></a><h2>AUTHOR</h2>
+<a name="id2618030"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.named-checkzone.html b/contrib/bind9/doc/arm/man.named-checkzone.html
index aeaf7d3..e7d9dc1 100644
--- a/contrib/bind9/doc/arm/man.named-checkzone.html
+++ b/contrib/bind9/doc/arm/man.named-checkzone.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.named-checkzone.html,v 1.98.14.22 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.named-checkzone.html,v 1.183.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -47,11 +47,11 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
-<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-checkzone</code> [<code class="option">-d</code>] [<code class="option">-h</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-M <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-o <em class="replaceable"><code>filename</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-S <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {zonename} {filename}</p></div>
+<div class="cmdsynopsis"><p><code class="command">named-compilezone</code> [<code class="option">-d</code>] [<code class="option">-j</code>] [<code class="option">-q</code>] [<code class="option">-v</code>] [<code class="option">-c <em class="replaceable"><code>class</code></em></code>] [<code class="option">-C <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-f <em class="replaceable"><code>format</code></em></code>] [<code class="option">-F <em class="replaceable"><code>format</code></em></code>] [<code class="option">-i <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-k <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-m <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-n <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-r <em class="replaceable"><code>mode</code></em></code>] [<code class="option">-s <em class="replaceable"><code>style</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-w <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-D</code>] [<code class="option">-W <em class="replaceable"><code>mode</code></em></code>] {<code class="option">-o <em class="replaceable"><code>filename</code></em></code>} {zonename} {filename}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2609661"></a><h2>DESCRIPTION</h2>
+<a name="id2619464"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named-checkzone</strong></span>
checks the syntax and integrity of a zone file. It performs the
same checks as <span><strong class="command">named</strong></span> does when loading a
@@ -71,7 +71,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2609712"></a><h2>OPTIONS</h2>
+<a name="id2619514"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-d</span></dt>
<dd><p>
@@ -195,6 +195,14 @@
write to standard out.
This is mandatory for <span><strong class="command">named-compilezone</strong></span>.
</p></dd>
+<dt><span class="term">-r <em class="replaceable"><code>mode</code></em></span></dt>
+<dd><p>
+ Check for records that are treated as different by DNSSEC but
+ are semantically equal in plain DNS.
+ Possible modes are <span><strong class="command">"fail"</strong></span>,
+ <span><strong class="command">"warn"</strong></span> (default) and
+ <span><strong class="command">"ignore"</strong></span>.
+ </p></dd>
<dt><span class="term">-s <em class="replaceable"><code>style</code></em></span></dt>
<dd><p>
Specify the style of the dumped zone file.
@@ -257,14 +265,14 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2660557"></a><h2>RETURN VALUES</h2>
+<a name="id2672646"></a><h2>RETURN VALUES</h2>
<p><span><strong class="command">named-checkzone</strong></span>
returns an exit status of 1 if
errors were detected and 0 otherwise.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2660571"></a><h2>SEE ALSO</h2>
+<a name="id2672660"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named-checkconf</span>(8)</span>,
<em class="citetitle">RFC 1035</em>,
@@ -272,7 +280,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2660604"></a><h2>AUTHOR</h2>
+<a name="id2672693"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.named-journalprint.html b/contrib/bind9/doc/arm/man.named-journalprint.html
new file mode 100644
index 0000000..11d98a1
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.named-journalprint.html
@@ -0,0 +1,112 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.named-journalprint.html,v 1.33.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>named-journalprint</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.named.html" title="named">
+<link rel="next" href="man.nsupdate.html" title="nsupdate">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">named-journalprint</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.named.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+</td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.named-journalprint"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">named-journalprint</span> &#8212; print zone journal in human-readable form</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">named-journalprint</code> {<em class="replaceable"><code>journal</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2613314"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">named-journalprint</strong></span>
+ prints the contents of a zone journal file in a human-readable
+ form.
+ </p>
+<p>
+ Journal files are automatically created by <span><strong class="command">named</strong></span>
+ when changes are made to dynamic zones (e.g., by
+ <span><strong class="command">nsupdate</strong></span>). They record each addition
+ or deletion of a resource record, in binary format, allowing the
+ changes to be re-applied to the zone when the server is
+ restarted after a shutdown or crash. By default, the name of
+ the journal file is formed by appending the extension
+ <code class="filename">.jnl</code> to the name of the corresponding
+ zone file.
+ </p>
+<p>
+ <span><strong class="command">named-journalprint</strong></span> converts the contents of a given
+ journal file into a human-readable text format. Each line begins
+ with "add" or "del", to indicate whether the record was added or
+ deleted, and continues with the resource record in master-file
+ format.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2638550"></a><h2>SEE ALSO</h2>
+<p>
+ <span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">nsupdate</span>(8)</span>,
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2638581"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.named.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+</td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">named</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> <span class="application">nsupdate</span>
+</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.named.html b/contrib/bind9/doc/arm/man.named.html
index 9a5617f..ac45d41 100644
--- a/contrib/bind9/doc/arm/man.named.html
+++ b/contrib/bind9/doc/arm/man.named.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.named.html,v 1.99.14.22 2010-08-20 02:05:37 tbox Exp $ -->
+<!-- $Id: man.named.html,v 1.185.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -23,7 +23,7 @@
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
<link rel="prev" href="man.named-checkzone.html" title="named-checkzone">
-<link rel="next" href="man.nsupdate.html" title="nsupdate">
+<link rel="next" href="man.named-journalprint.html" title="named-journalprint">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
@@ -33,7 +33,7 @@
<td width="20%" align="left">
<a accesskey="p" href="man.named-checkzone.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
-<td width="20%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+<td width="20%" align="right"> <a accesskey="n" href="man.named-journalprint.html">Next</a>
</td>
</tr>
</table>
@@ -47,10 +47,10 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
+<div class="cmdsynopsis"><p><code class="command">named</code> [<code class="option">-4</code>] [<code class="option">-6</code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-d <em class="replaceable"><code>debug-level</code></em></code>] [<code class="option">-E <em class="replaceable"><code>engine-name</code></em></code>] [<code class="option">-f</code>] [<code class="option">-g</code>] [<code class="option">-m <em class="replaceable"><code>flag</code></em></code>] [<code class="option">-n <em class="replaceable"><code>#cpus</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-s</code>] [<code class="option">-S <em class="replaceable"><code>#max-socks</code></em></code>] [<code class="option">-t <em class="replaceable"><code>directory</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>] [<code class="option">-v</code>] [<code class="option">-V</code>] [<code class="option">-x <em class="replaceable"><code>cache-file</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2610009"></a><h2>DESCRIPTION</h2>
+<a name="id2638058"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">named</strong></span>
is a Domain Name System (DNS) server,
part of the BIND 9 distribution from ISC. For more
@@ -65,7 +65,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2610040"></a><h2>OPTIONS</h2>
+<a name="id2638089"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-4</span></dt>
<dd><p>
@@ -97,6 +97,14 @@
Debugging traces from <span><strong class="command">named</strong></span> become
more verbose as the debug level increases.
</p></dd>
+<dt><span class="term">-E <em class="replaceable"><code>engine-name</code></em></span></dt>
+<dd><p>
+ Use a crypto hardware (OpenSSL engine) for the crypto operations
+ it supports, for instance re-signing with private keys from
+ a secure key store. When compiled with PKCS#11 support
+ <em class="replaceable"><code>engine-name</code></em>
+ defaults to pkcs11, the empty name resets it to no engine.
+ </p></dd>
<dt><span class="term">-f</span></dt>
<dd><p>
Run the server in the foreground (i.e. do not daemonize).
@@ -238,7 +246,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2612619"></a><h2>SIGNALS</h2>
+<a name="id2640076"></a><h2>SIGNALS</h2>
<p>
In routine operation, signals should not be used to control
the nameserver; <span><strong class="command">rndc</strong></span> should be used
@@ -259,7 +267,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2652264"></a><h2>CONFIGURATION</h2>
+<a name="id2640126"></a><h2>CONFIGURATION</h2>
<p>
The <span><strong class="command">named</strong></span> configuration file is too complex
to describe in detail here. A complete description is provided
@@ -276,7 +284,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2652313"></a><h2>FILES</h2>
+<a name="id2674514"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="filename">/etc/named.conf</code></span></dt>
<dd><p>
@@ -289,7 +297,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2652357"></a><h2>SEE ALSO</h2>
+<a name="id2674694"></a><h2>SEE ALSO</h2>
<p><em class="citetitle">RFC 1033</em>,
<em class="citetitle">RFC 1034</em>,
<em class="citetitle">RFC 1035</em>,
@@ -302,7 +310,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2652427"></a><h2>AUTHOR</h2>
+<a name="id2674764"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -314,14 +322,14 @@
<td width="40%" align="left">
<a accesskey="p" href="man.named-checkzone.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
-<td width="40%" align="right"> <a accesskey="n" href="man.nsupdate.html">Next</a>
+<td width="40%" align="right"> <a accesskey="n" href="man.named-journalprint.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
<span class="application">named-checkzone</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
-<td width="40%" align="right" valign="top"> <span class="application">nsupdate</span>
+<td width="40%" align="right" valign="top"> <span class="application">named-journalprint</span>
</td>
</tr>
</table>
diff --git a/contrib/bind9/doc/arm/man.nsec3hash.html b/contrib/bind9/doc/arm/man.nsec3hash.html
new file mode 100644
index 0000000..9f1fa6c
--- /dev/null
+++ b/contrib/bind9/doc/arm/man.nsec3hash.html
@@ -0,0 +1,113 @@
+<!--
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2000-2003 Internet Software Consortium.
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+<!-- $Id: man.nsec3hash.html,v 1.34.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>nsec3hash</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
+<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
+<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
+<link rel="prev" href="man.isc-hmac-fixup.html" title="isc-hmac-fixup">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="navheader">
+<table width="100%" summary="Navigation header">
+<tr><th colspan="3" align="center"><span class="application">nsec3hash</span></th></tr>
+<tr>
+<td width="20%" align="left">
+<a accesskey="p" href="man.isc-hmac-fixup.html">Prev</a> </td>
+<th width="60%" align="center">Manual pages</th>
+<td width="20%" align="right"> </td>
+</tr>
+</table>
+<hr>
+</div>
+<div class="refentry" lang="en">
+<a name="man.nsec3hash"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2>Name</h2>
+<p><span class="application">nsec3hash</span> &#8212; generate NSEC3 hash</p>
+</div>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="cmdsynopsis"><p><code class="command">nsec3hash</code> {<em class="replaceable"><code>salt</code></em>} {<em class="replaceable"><code>algorithm</code></em>} {<em class="replaceable"><code>iterations</code></em>} {<em class="replaceable"><code>domain</code></em>}</p></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651073"></a><h2>DESCRIPTION</h2>
+<p>
+ <span><strong class="command">nsec3hash</strong></span> generates an NSEC3 hash based on
+ a set of NSEC3 parameters. This can be used to check the validity
+ of NSEC3 records in a signed zone.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651088"></a><h2>ARGUMENTS</h2>
+<div class="variablelist"><dl>
+<dt><span class="term">salt</span></dt>
+<dd><p>
+ The salt provided to the hash algorithm.
+ </p></dd>
+<dt><span class="term">algorithm</span></dt>
+<dd><p>
+ A number indicating the hash algorithm. Currently the
+ only supported hash algorithm for NSEC3 is SHA-1, which is
+ indicated by the number 1; consequently "1" is the only
+ useful value for this argument.
+ </p></dd>
+<dt><span class="term">iterations</span></dt>
+<dd><p>
+ The number of additional times the hash should be performed.
+ </p></dd>
+<dt><span class="term">domain</span></dt>
+<dd><p>
+ The domain name to be hashed.
+ </p></dd>
+</dl></div>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651149"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">BIND 9 Administrator Reference Manual</em>,
+ <em class="citetitle">RFC 5155</em>.
+ </p>
+</div>
+<div class="refsect1" lang="en">
+<a name="id2651166"></a><h2>AUTHOR</h2>
+<p><span class="corpauthor">Internet Systems Consortium</span>
+ </p>
+</div>
+</div>
+<div class="navfooter">
+<hr>
+<table width="100%" summary="Navigation footer">
+<tr>
+<td width="40%" align="left">
+<a accesskey="p" href="man.isc-hmac-fixup.html">Prev</a> </td>
+<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
+<td width="40%" align="right"> </td>
+</tr>
+<tr>
+<td width="40%" align="left" valign="top">
+<span class="application">isc-hmac-fixup</span> </td>
+<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
+<td width="40%" align="right" valign="top"> </td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/contrib/bind9/doc/arm/man.nsupdate.html b/contrib/bind9/doc/arm/man.nsupdate.html
index 597b2f1..c5d983a 100644
--- a/contrib/bind9/doc/arm/man.nsupdate.html
+++ b/contrib/bind9/doc/arm/man.nsupdate.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.nsupdate.html,v 1.22.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.nsupdate.html,v 1.110.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
-<link rel="prev" href="man.named.html" title="named">
+<link rel="prev" href="man.named-journalprint.html" title="named-journalprint">
<link rel="next" href="man.rndc.html" title="rndc">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -31,7 +31,7 @@
<tr><th colspan="3" align="center"><span class="application">nsupdate</span></th></tr>
<tr>
<td width="20%" align="left">
-<a accesskey="p" href="man.named.html">Prev</a> </td>
+<a accesskey="p" href="man.named-journalprint.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
<td width="20%" align="right"> <a accesskey="n" href="man.rndc.html">Next</a>
</td>
@@ -47,12 +47,12 @@
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
-<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
+<div class="cmdsynopsis"><p><code class="command">nsupdate</code> [<code class="option">-d</code>] [<code class="option">-D</code>] [[<code class="option">-g</code>] | [<code class="option">-o</code>] | [<code class="option">-l</code>] | [<code class="option">-y <em class="replaceable"><code>[<span class="optional">hmac:</span>]keyname:secret</code></em></code>] | [<code class="option">-k <em class="replaceable"><code>keyfile</code></em></code>]] [<code class="option">-t <em class="replaceable"><code>timeout</code></em></code>] [<code class="option">-u <em class="replaceable"><code>udptimeout</code></em></code>] [<code class="option">-r <em class="replaceable"><code>udpretries</code></em></code>] [<code class="option">-R <em class="replaceable"><code>randomdev</code></em></code>] [<code class="option">-v</code>] [filename]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2610983"></a><h2>DESCRIPTION</h2>
+<a name="id2638810"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">nsupdate</strong></span>
- is used to submit Dynamic DNS Update requests as defined in RFC2136
+ is used to submit Dynamic DNS Update requests as defined in RFC 2136
to a name server.
This allows resource records to be added or removed from a zone
without manually editing the zone file.
@@ -88,10 +88,14 @@
report additional debugging information to <code class="option">-d</code>.
</p>
<p>
+ The <code class="option">-L</code> option with an integer argument of zero or
+ higher sets the logging debug level. If zero, logging is disabled.
+ </p>
+<p>
Transaction signatures can be used to authenticate the Dynamic
DNS updates. These use the TSIG resource record type described
- in RFC2845 or the SIG(0) record described in RFC3535 and
- RFC2931 or GSS-TSIG as described in RFC3645. TSIG relies on
+ in RFC 2845 or the SIG(0) record described in RFC 2535 and
+ RFC 2931 or GSS-TSIG as described in RFC 3645. TSIG relies on
a shared secret that should only be known to
<span><strong class="command">nsupdate</strong></span> and the name server. Currently,
the only supported encryption algorithm for TSIG is HMAC-MD5,
@@ -108,44 +112,59 @@
record in a zone served by the name server.
<span><strong class="command">nsupdate</strong></span> does not read
<code class="filename">/etc/named.conf</code>.
- GSS-TSIG uses Kerberos credentials.
+ </p>
+<p>
+ GSS-TSIG uses Kerberos credentials. Standard GSS-TSIG mode
+ is switched on with the <code class="option">-g</code> flag. A
+ non-standards-compliant variant of GSS-TSIG used by Windows
+ 2000 can be switched on with the <code class="option">-o</code> flag.
</p>
<p><span><strong class="command">nsupdate</strong></span>
uses the <code class="option">-y</code> or <code class="option">-k</code> option
to provide the shared secret needed to generate a TSIG record
for authenticating Dynamic DNS update requests, default type
- HMAC-MD5. These options are mutually exclusive. With the
- <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
- the shared secret from the file <em class="parameter"><code>keyfile</code></em>,
- whose name is of the form
- <code class="filename">K{name}.+157.+{random}.private</code>. For
- historical reasons, the file
- <code class="filename">K{name}.+157.+{random}.key</code> must also be
- present. When the <code class="option">-y</code> option is used, a
- signature is generated from
+ HMAC-MD5. These options are mutually exclusive.
+ </p>
+<p>
+ When the <code class="option">-y</code> option is used, a signature is
+ generated from
[<span class="optional"><em class="parameter"><code>hmac:</code></em></span>]<em class="parameter"><code>keyname:secret.</code></em>
<em class="parameter"><code>keyname</code></em> is the name of the key, and
- <em class="parameter"><code>secret</code></em> is the base64 encoded shared
- secret. Use of the <code class="option">-y</code> option is discouraged
- because the shared secret is supplied as a command line
- argument in clear text. This may be visible in the output
- from
- <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span> or in a history file maintained by the user's
- shell.
+ <em class="parameter"><code>secret</code></em> is the base64 encoded shared secret.
+ Use of the <code class="option">-y</code> option is discouraged because the
+ shared secret is supplied as a command line argument in clear text.
+ This may be visible in the output from
+ <span class="citerefentry"><span class="refentrytitle">ps</span>(1)</span>
+ or in a history file maintained by the user's shell.
</p>
<p>
+ With the
+ <code class="option">-k</code> option, <span><strong class="command">nsupdate</strong></span> reads
+ the shared secret from the file <em class="parameter"><code>keyfile</code></em>.
+ Keyfiles may be in two formats: a single file containing
+ a <code class="filename">named.conf</code>-format <span><strong class="command">key</strong></span>
+ statement, which may be generated automatically by
+ <span><strong class="command">ddns-confgen</strong></span>, or a pair of files whose names are
+ of the format <code class="filename">K{name}.+157.+{random}.key</code> and
+ <code class="filename">K{name}.+157.+{random}.private</code>, which can be
+ generated by <span><strong class="command">dnssec-keygen</strong></span>.
The <code class="option">-k</code> may also be used to specify a SIG(0) key used
to authenticate Dynamic DNS update requests. In this case, the key
specified is not an HMAC-MD5 key.
</p>
<p>
- The <code class="option">-g</code> and <code class="option">-o</code> specify that
- GSS-TSIG is to be used. The <code class="option">-o</code> should only
- be used with old Microsoft Windows 2000 servers.
+ <span><strong class="command">nsupdate</strong></span> can be run in a local-host only mode
+ using the <code class="option">-l</code> flag. This sets the server address to
+ localhost (disabling the <span><strong class="command">server</strong></span> so that the server
+ address cannot be overridden). Connections to the local server will
+ use a TSIG key found in <code class="filename">/var/run/named/session.key</code>,
+ which is automatically generated by <span><strong class="command">named</strong></span> if any
+ local master zone has set <span><strong class="command">update-policy</strong></span> to
+ <span><strong class="command">local</strong></span>. The location of this key file can be
+ overridden with the <code class="option">-k</code> option.
</p>
<p>
- By default,
- <span><strong class="command">nsupdate</strong></span>
+ By default, <span><strong class="command">nsupdate</strong></span>
uses UDP to send update requests to the name server unless they are too
large to fit in a UDP request in which case TCP will be used.
The
@@ -156,6 +175,10 @@
This may be preferable when a batch of update requests is made.
</p>
<p>
+ The <code class="option">-p</code> sets the default port number to use for
+ connections to a name server. The default is 53.
+ </p>
+<p>
The <code class="option">-t</code> option sets the maximum time an update request
can
take before it is aborted. The default is 300 seconds. Zero can be
@@ -187,7 +210,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2611378"></a><h2>INPUT FORMAT</h2>
+<a name="id2639349"></a><h2>INPUT FORMAT</h2>
<p><span><strong class="command">nsupdate</strong></span>
reads input from
<em class="parameter"><code>filename</code></em>
@@ -475,7 +498,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2667517"></a><h2>EXAMPLES</h2>
+<a name="id2677944"></a><h2>EXAMPLES</h2>
<p>
The examples below show how
<span><strong class="command">nsupdate</strong></span>
@@ -522,19 +545,23 @@
If there are, the update request fails.
If this name does not exist, a CNAME for it is added.
This ensures that when the CNAME is added, it cannot conflict with the
- long-standing rule in RFC1034 that a name must not exist as any other
+ long-standing rule in RFC 1034 that a name must not exist as any other
record type if it exists as a CNAME.
- (The rule has been updated for DNSSEC in RFC2535 to allow CNAMEs to have
+ (The rule has been updated for DNSSEC in RFC 2535 to allow CNAMEs to have
RRSIG, DNSKEY and NSEC records.)
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2667568"></a><h2>FILES</h2>
+<a name="id2678062"></a><h2>FILES</h2>
<div class="variablelist"><dl>
<dt><span class="term"><code class="constant">/etc/resolv.conf</code></span></dt>
<dd><p>
used to identify default name server
</p></dd>
+<dt><span class="term"><code class="constant">/var/run/named/session.key</code></span></dt>
+<dd><p>
+ sets the default TSIG key for use in local-only mode
+ </p></dd>
<dt><span class="term"><code class="constant">K{name}.+157.+{random}.key</code></span></dt>
<dd><p>
base-64 encoding of HMAC-MD5 key created by
@@ -548,20 +575,22 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2667637"></a><h2>SEE ALSO</h2>
-<p><span class="citerefentry"><span class="refentrytitle">RFC2136</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC3007</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2104</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2845</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC1034</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2535</span></span>,
- <span class="citerefentry"><span class="refentrytitle">RFC2931</span></span>,
+<a name="id2678146"></a><h2>SEE ALSO</h2>
+<p>
+ <em class="citetitle">RFC 2136</em>,
+ <em class="citetitle">RFC 3007</em>,
+ <em class="citetitle">RFC 2104</em>,
+ <em class="citetitle">RFC 2845</em>,
+ <em class="citetitle">RFC 1034</em>,
+ <em class="citetitle">RFC 2535</em>,
+ <em class="citetitle">RFC 2931</em>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
+ <span class="citerefentry"><span class="refentrytitle">ddns-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">dnssec-keygen</span>(8)</span>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2667776"></a><h2>BUGS</h2>
+<a name="id2678203"></a><h2>BUGS</h2>
<p>
The TSIG key is redundantly stored in two separate files.
This is a consequence of nsupdate using the DST library
@@ -575,14 +604,14 @@
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
-<a accesskey="p" href="man.named.html">Prev</a> </td>
+<a accesskey="p" href="man.named-journalprint.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="man.rndc.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
-<span class="application">named</span> </td>
+<span class="application">named-journalprint</span> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
<td width="40%" align="right" valign="top"> <span class="application">rndc</span>
</td>
diff --git a/contrib/bind9/doc/arm/man.rndc-confgen.html b/contrib/bind9/doc/arm/man.rndc-confgen.html
index 523ad92..f441b93 100644
--- a/contrib/bind9/doc/arm/man.rndc-confgen.html
+++ b/contrib/bind9/doc/arm/man.rndc-confgen.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.rndc-confgen.html,v 1.102.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.rndc-confgen.html,v 1.189.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -23,6 +23,7 @@
<link rel="start" href="Bv9ARM.html" title="BIND 9 Administrator Reference Manual">
<link rel="up" href="Bv9ARM.ch10.html" title="Manual pages">
<link rel="prev" href="man.rndc.conf.html" title="rndc.conf">
+<link rel="next" href="man.ddns-confgen.html" title="ddns-confgen">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
@@ -32,7 +33,8 @@
<td width="20%" align="left">
<a accesskey="p" href="man.rndc.conf.html">Prev</a> </td>
<th width="60%" align="center">Manual pages</th>
-<td width="20%" align="right"> </td>
+<td width="20%" align="right"> <a accesskey="n" href="man.ddns-confgen.html">Next</a>
+</td>
</tr>
</table>
<hr>
@@ -48,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc-confgen</code> [<code class="option">-a</code>] [<code class="option">-b <em class="replaceable"><code>keysize</code></em></code>] [<code class="option">-c <em class="replaceable"><code>keyfile</code></em></code>] [<code class="option">-h</code>] [<code class="option">-k <em class="replaceable"><code>keyname</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-r <em class="replaceable"><code>randomfile</code></em></code>] [<code class="option">-s <em class="replaceable"><code>address</code></em></code>] [<code class="option">-t <em class="replaceable"><code>chrootdir</code></em></code>] [<code class="option">-u <em class="replaceable"><code>user</code></em></code>]</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2613082"></a><h2>DESCRIPTION</h2>
+<a name="id2641044"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">rndc-confgen</strong></span>
generates configuration files
for <span><strong class="command">rndc</strong></span>. It can be used as a
@@ -64,7 +66,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2613148"></a><h2>OPTIONS</h2>
+<a name="id2641110"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-a</span></dt>
<dd>
@@ -171,7 +173,7 @@
</dl></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2624525"></a><h2>EXAMPLES</h2>
+<a name="id2642384"></a><h2>EXAMPLES</h2>
<p>
To allow <span><strong class="command">rndc</strong></span> to be used with
no manual configuration, run
@@ -188,7 +190,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2628541"></a><h2>SEE ALSO</h2>
+<a name="id2642440"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
@@ -196,7 +198,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2628580"></a><h2>AUTHOR</h2>
+<a name="id2649715"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
@@ -208,13 +210,15 @@
<td width="40%" align="left">
<a accesskey="p" href="man.rndc.conf.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="Bv9ARM.ch10.html">Up</a></td>
-<td width="40%" align="right"> </td>
+<td width="40%" align="right"> <a accesskey="n" href="man.ddns-confgen.html">Next</a>
+</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">
<code class="filename">rndc.conf</code> </td>
<td width="20%" align="center"><a accesskey="h" href="Bv9ARM.html">Home</a></td>
-<td width="40%" align="right" valign="top"> </td>
+<td width="40%" align="right" valign="top"> <span class="application">ddns-confgen</span>
+</td>
</tr>
</table>
</div>
diff --git a/contrib/bind9/doc/arm/man.rndc.conf.html b/contrib/bind9/doc/arm/man.rndc.conf.html
index f454cf4..456ac38 100644
--- a/contrib/bind9/doc/arm/man.rndc.conf.html
+++ b/contrib/bind9/doc/arm/man.rndc.conf.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.rndc.conf.html,v 1.103.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.rndc.conf.html,v 1.190.8.1.2.1 2011-06-09 03:41:11 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -50,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc.conf</code> </p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2608299"></a><h2>DESCRIPTION</h2>
+<a name="id2640419"></a><h2>DESCRIPTION</h2>
<p><code class="filename">rndc.conf</code> is the configuration file
for <span><strong class="command">rndc</strong></span>, the BIND 9 name server control
utility. This file has a similar structure and syntax to
@@ -135,7 +135,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612294"></a><h2>EXAMPLE</h2>
+<a name="id2640590"></a><h2>EXAMPLE</h2>
<pre class="programlisting">
options {
default-server localhost;
@@ -209,7 +209,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612416"></a><h2>NAME SERVER CONFIGURATION</h2>
+<a name="id2640780"></a><h2>NAME SERVER CONFIGURATION</h2>
<p>
The name server must be configured to accept rndc connections and
to recognize the key specified in the <code class="filename">rndc.conf</code>
@@ -219,7 +219,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612714"></a><h2>SEE ALSO</h2>
+<a name="id2640806"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">mmencode</span>(1)</span>,
@@ -227,7 +227,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612753"></a><h2>AUTHOR</h2>
+<a name="id2640844"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/man.rndc.html b/contrib/bind9/doc/arm/man.rndc.html
index 0a6c65c..58fa67e 100644
--- a/contrib/bind9/doc/arm/man.rndc.html
+++ b/contrib/bind9/doc/arm/man.rndc.html
@@ -1,5 +1,5 @@
<!--
- - Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ - Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
- Copyright (C) 2000-2003 Internet Software Consortium.
-
- Permission to use, copy, modify, and/or distribute this software for any
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: man.rndc.html,v 1.101.14.24 2010-08-20 02:05:38 tbox Exp $ -->
+<!-- $Id: man.rndc.html,v 1.188.8.1.2.1 2011-06-09 03:41:10 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -50,7 +50,7 @@
<div class="cmdsynopsis"><p><code class="command">rndc</code> [<code class="option">-b <em class="replaceable"><code>source-address</code></em></code>] [<code class="option">-c <em class="replaceable"><code>config-file</code></em></code>] [<code class="option">-k <em class="replaceable"><code>key-file</code></em></code>] [<code class="option">-s <em class="replaceable"><code>server</code></em></code>] [<code class="option">-p <em class="replaceable"><code>port</code></em></code>] [<code class="option">-V</code>] [<code class="option">-y <em class="replaceable"><code>key_id</code></em></code>] {command}</p></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2611614"></a><h2>DESCRIPTION</h2>
+<a name="id2639501"></a><h2>DESCRIPTION</h2>
<p><span><strong class="command">rndc</strong></span>
controls the operation of a name
server. It supersedes the <span><strong class="command">ndc</strong></span> utility
@@ -79,7 +79,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2611665"></a><h2>OPTIONS</h2>
+<a name="id2639552"></a><h2>OPTIONS</h2>
<div class="variablelist"><dl>
<dt><span class="term">-b <em class="replaceable"><code>source-address</code></em></span></dt>
<dd><p>
@@ -151,7 +151,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612026"></a><h2>LIMITATIONS</h2>
+<a name="id2640254"></a><h2>LIMITATIONS</h2>
<p><span><strong class="command">rndc</strong></span>
does not yet support all the commands of
the BIND 8 <span><strong class="command">ndc</strong></span> utility.
@@ -165,7 +165,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612057"></a><h2>SEE ALSO</h2>
+<a name="id2640285"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">rndc.conf</span>(5)</span>,
<span class="citerefentry"><span class="refentrytitle">rndc-confgen</span>(8)</span>,
<span class="citerefentry"><span class="refentrytitle">named</span>(8)</span>,
@@ -175,7 +175,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2612113"></a><h2>AUTHOR</h2>
+<a name="id2640341"></a><h2>AUTHOR</h2>
<p><span class="corpauthor">Internet Systems Consortium</span>
</p>
</div>
diff --git a/contrib/bind9/doc/arm/managed-keys.xml b/contrib/bind9/doc/arm/managed-keys.xml
new file mode 100644
index 0000000..f1e06f3
--- /dev/null
+++ b/contrib/bind9/doc/arm/managed-keys.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: managed-keys.xml,v 1.3 2010-02-03 23:49:07 tbox Exp $ -->
+
+<sect1 id="rfc5011.support">
+ <title>Dynamic Trust Anchor Management</title>
+ <para>BIND 9.7.0 introduces support for RFC 5011, dynamic trust
+ anchor management. Using this feature allows
+ <command>named</command> to keep track of changes to critical
+ DNSSEC keys without any need for the operator to make changes to
+ configuration files.</para>
+ <sect2>
+ <title>Validating Resolver</title>
+ <!-- TODO: command tag is overloaded for configuration and executables -->
+ <para>To configure a validating resolver to use RFC 5011 to
+ maintain a trust anchor, configure the trust anchor using a
+ <command>managed-keys</command> statement. Information about
+ this can be found in
+ <xref linkend="managed-keys" />.</para>
+ <!-- TODO: managed-keys examples
+also in DNSSEC section above here in ARM -->
+ </sect2>
+ <sect2>
+ <title>Authoritative Server</title>
+ <para>To set up an authoritative zone for RFC 5011 trust anchor
+ maintenance, generate two (or more) key signing keys (KSKs) for
+ the zone. Sign the zone with one of them; this is the "active"
+ KSK. All KSK's which do not sign the zone are "stand-by"
+ keys.</para>
+ <para>Any validating resolver which is configured to use the
+ active KSK as an RFC 5011-managed trust anchor will take note
+ of the stand-by KSKs in the zone's DNSKEY RRset, and store them
+ for future reference. The resolver will recheck the zone
+ periodically, and after 30 days, if the new key is still there,
+ then the key will be accepted by the resolver as a valid trust
+ anchor for the zone. Any time after this 30-day acceptance
+ timer has completed, the active KSK can be revoked, and the
+ zone can be "rolled over" to the newly accepted key.</para>
+ <para>The easiest way to place a stand-by key in a zone is to
+ use the "smart signing" features of
+ <command>dnssec-keygen</command> and
+ <command>dnssec-signzone</command>. If a key with a publication
+ date in the past, but an activation date which is unset or in
+ the future, "
+ <command>dnssec-signzone -S</command>" will include the DNSKEY
+ record in the zone, but will not sign with it:</para>
+ <screen>
+$ <userinput>dnssec-keygen -K keys -f KSK -P now -A now+2y example.net</userinput>
+$ <userinput>dnssec-signzone -S -K keys example.net</userinput>
+</screen>
+ <para>To revoke a key, the new command
+ <command>dnssec-revoke</command> has been added. This adds the
+ REVOKED bit to the key flags and re-generates the
+ <filename>K*.key</filename> and
+ <filename>K*.private</filename> files.</para>
+ <para>After revoking the active key, the zone must be signed
+ with both the revoked KSK and the new active KSK. (Smart
+ signing takes care of this automatically.)</para>
+ <para>Once a key has been revoked and used to sign the DNSKEY
+ RRset in which it appears, that key will never again be
+ accepted as a valid trust anchor by the resolver. However,
+ validation can proceed using the new active key (which had been
+ accepted by the resolver when it was a stand-by key).</para>
+ <para>See RFC 5011 for more details on key rollover
+ scenarios.</para>
+ <para>When a key has been revoked, its key ID changes,
+ increasing by 128, and wrapping around at 65535. So, for
+ example, the key "<filename>Kexample.com.+005+10000</filename>" becomes
+ "<filename>Kexample.com.+005+10128</filename>".</para>
+ <para>If two keys have ID's exactly 128 apart, and one is
+ revoked, then the two key ID's will collide, causing several
+ problems. To prevent this,
+ <command>dnssec-keygen</command> will not generate a new key if
+ another key is present which may collide. This checking will
+ only occur if the new keys are written to the same directory
+ which holds all other keys in use for that zone.</para>
+ <para>Older versions of BIND 9 did not have this precaution.
+ Exercise caution if using key revocation on keys that were
+ generated by previous releases, or if using keys stored in
+ multiple directories or on multiple machines.</para>
+ <para>It is expected that a future release of BIND 9 will
+ address this problem in a different way, by storing revoked
+ keys with their original unrevoked key ID's.</para>
+ </sect2>
+</sect1>
diff --git a/contrib/bind9/doc/arm/pkcs11.xml b/contrib/bind9/doc/arm/pkcs11.xml
new file mode 100644
index 0000000..23bf5fd
--- /dev/null
+++ b/contrib/bind9/doc/arm/pkcs11.xml
@@ -0,0 +1,390 @@
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
+ [<!ENTITY mdash "&#8212;">]>
+<!--
+ - Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ -
+ - Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ - AND FITNESS. IN NO EVENT SHALL ISC 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.
+-->
+
+<!-- $Id: pkcs11.xml,v 1.3 2010-02-06 07:42:02 marka Exp $ -->
+
+<sect1 id="pkcs11">
+ <title>PKCS #11 (Cryptoki) support</title>
+ <para>PKCS #11 (Public Key Cryptography Standard #11) defines a
+ platform- independent API for the control of hardware security
+ modules (HSMs) and other cryptographic support devices.</para>
+ <para>BIND 9 is known to work with two HSMs: The Sun SCA 6000
+ cryptographic acceleration board, tested under Solaris x86, and
+ the AEP Keyper network-attached key storage device, tested with
+ Debian Linux, Solaris x86 and Windows Server 2003.</para>
+ <sect2>
+ <title>Prerequisites</title>
+ <para>See the HSM vendor documentation for information about
+ installing, initializing, testing and troubleshooting the
+ HSM.</para>
+ <para>BIND 9 uses OpenSSL for cryptography, but stock OpenSSL
+ does not yet fully support PKCS #11. However, a PKCS #11 engine
+ for OpenSSL is available from the OpenSolaris project. It has
+ been modified by ISC to work with with BIND 9, and to provide
+ new features such as PIN management and key by
+ reference.</para>
+ <para>The patched OpenSSL depends on a "PKCS #11 provider".
+ This is a shared library object, providing a low-level PKCS #11
+ interface to the HSM hardware. It is dynamically loaded by
+ OpenSSL at runtime. The PKCS #11 provider comes from the HSM
+ vendor, and and is specific to the HSM to be controlled.</para>
+ <para>There are two "flavors" of PKCS #11 support provided by
+ the patched OpenSSL, one of which must be chosen at
+ configuration time. The correct choice depends on the HSM
+ hardware:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Use 'crypto-accelerator' with HSMs that have hardware
+ cryptographic acceleration features, such as the SCA 6000
+ board. This causes OpenSSL to run all supported
+ cryptographic operations in the HSM.</para>
+ </listitem>
+ <listitem>
+ <para>Use 'sign-only' with HSMs that are designed to
+ function primarily as secure key storage devices, but lack
+ hardware acceleration. These devices are highly secure, but
+ are not necessarily any faster at cryptography than the
+ system CPU &mdash; often, they are slower. It is therefore
+ most efficient to use them only for those cryptographic
+ functions that require access to the secured private key,
+ such as zone signing, and to use the system CPU for all
+ other computationally-intensive operations. The AEP Keyper
+ is an example of such a device.</para>
+ </listitem>
+ </itemizedlist>
+ <para>The modified OpenSSL code is included in the BIND 9.7.0
+ release, in the form of a context diff against the latest OpenSSL.
+ </para>
+ <note>
+ The latest OpenSSL version at the time of the BIND release
+ is 0.9.8l.
+ ISC will provide an updated patch as new versions of OpenSSL
+ are released. The version number in the following examples
+ is expected to change.</note>
+ <para>
+ Before building BIND 9 with PKCS #11 support, it will be
+ necessary to build OpenSSL with this patch in place and inform
+ it of the path to the HSM-specific PKCS #11 provider
+ library.</para>
+ <para>Obtain OpenSSL 0.9.8l:</para>
+ <screen>
+$ <userinput>wget <ulink>http://www.openssl.org/source/openssl-0.9.8l.tar.gz</ulink></userinput>
+</screen>
+ <para>Extract the tarball:</para>
+ <screen>
+$ <userinput>tar zxf openssl-0.9.8l.tar.gz</userinput>
+</screen>
+ <para>Apply the patch from the BIND 9 release:</para>
+ <screen>
+$ <userinput>patch -p1 -d openssl-0.9.8l \
+ &lt; bind-9.7.0/bin/pkcs11/openssl-0.9.8l-patch</userinput>
+</screen>
+ <note>(Note that the patch file may not be compatible with the
+ "patch" utility on all operating systems. You may need to
+ install GNU patch.)</note>
+ <para>When building OpenSSL, place it in a non-standard
+ location so that it does not interfere with OpenSSL libraries
+ elsewhere on the system. In the following examples, we choose
+ to install into "/opt/pkcs11/usr". We will use this location
+ when we configure BIND 9.</para>
+ <sect3>
+ <!-- Example 1 -->
+ <title>Building OpenSSL for the AEP Keyper on Linux</title>
+ <para>The AEP Keyper is a highly secure key storage device,
+ but does not provide hardware cryptographic acceleration. It
+ can carry out cryptographic operations, but it is probably
+ slower than your system's CPU. Therefore, we choose the
+ 'sign-only' flavor when building OpenSSL.</para>
+ <para>The Keyper-specific PKCS #11 provider library is
+ delivered with the Keyper software. In this example, we place
+ it /opt/pkcs11/usr/lib:</para>
+ <screen>
+$ <userinput>cp pkcs11.GCC4.0.2.so.4.05 /opt/pkcs11/usr/lib/libpkcs11.so</userinput>
+</screen>
+ <para>This library is only available for Linux as a 32-bit
+ binary. If we are compiling on a 64-bit Linux system, it is
+ necessary to force a 32-bit build, by specifying -m32 in the
+ build options.</para>
+ <para>Finally, the Keyper library requires threads, so we
+ must specify -pthread.</para>
+ <screen>
+$ <userinput>cd openssl-0.9.8l</userinput>
+$ <userinput>./Configure linux-generic32 -m32 -pthread \
+ --pk11-libname=/opt/pkcs11/usr/lib/libpkcs11.so \
+ --pk11-flavor=sign-only \
+ --prefix=/opt/pkcs11/usr</userinput>
+</screen>
+ <para>After configuring, run "<command>make</command>"
+ and "<command>make test</command>". If "<command>make
+ test</command>" fails with "pthread_atfork() not found", you forgot to
+ add the -pthread above.</para>
+ </sect3>
+ <sect3>
+ <!-- Example 2 -->
+ <title>Building OpenSSL for the SCA 6000 on Solaris</title>
+ <para>The SCA-6000 PKCS #11 provider is installed as a system
+ library, libpkcs11. It is a true crypto accelerator, up to 4
+ times faster than any CPU, so the flavor shall be
+ 'crypto-accelerator'.</para>
+ <para>In this example, we are building on Solaris x86 on an
+ AMD64 system.</para>
+ <screen>
+$ <userinput>cd openssl-0.9.8l</userinput>
+$ <userinput>./Configure solaris64-x86_64-cc \
+ --pk11-libname=/usr/lib/64/libpkcs11.so \
+ --pk11-flavor=crypto-accelerator \
+ --prefix=/opt/pkcs11/usr</userinput>
+</screen>
+ <para>(For a 32-bit build, use "solaris-x86-cc" and
+ /usr/lib/libpkcs11.so.)</para>
+ <para>After configuring, run
+ <command>make</command> and
+ <command>make test</command>.</para>
+ <para>Once you have built OpenSSL, run
+ "<command>apps/openssl engine pkcs11</command>" to confirm
+ that PKCS #11 support was compiled in correctly. The output
+ should be one of the following lines, depending on the flavor
+ selected:</para>
+ <screen>
+ (pkcs11) PKCS #11 engine support (sign only)
+</screen>
+ <para>Or:</para>
+ <screen>
+ (pkcs11) PKCS #11 engine support (crypto accelerator)
+</screen>
+ <para>Next, run
+ "<command>apps/openssl engine pkcs11 -t</command>". This will
+ attempt to initialize the PKCS #11 engine. If it is able to
+ do so successfully, it will report
+ <quote><literal>[ available ]</literal></quote>.</para>
+ <para>If the output is correct, run
+ "<command>make install</command>" which will install the
+ modified OpenSSL suite to
+ <filename>/opt/pkcs11/usr</filename>.</para>
+ </sect3>
+ </sect2>
+ <sect2>
+ <title>Building BIND 9 with PKCS#11</title>
+ <para>When building BIND 9, the location of the custom-built
+ OpenSSL library must be specified via configure.</para>
+ <sect3>
+ <!-- Example 3 -->
+ <title>Configuring BIND 9 for Linux</title>
+ <para>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</para>
+ <para>The PKCS #11 library for the AEP Keyper is currently
+ only available as a 32-bit binary. If we are building on a
+ 64-bit host, we must force a 32-bit build by adding "-m32" to
+ the CC options on the "configure" command line.</para>
+ <screen>
+$ <userinput>cd ../bind-9.7.0</userinput>
+$ <userinput>./configure CC="gcc -m32" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/opt/pkcs11/usr/lib/libpkcs11.so</userinput>
+</screen>
+ </sect3>
+ <sect3>
+ <!-- Example 4 -->
+ <title>Configuring BIND 9 for Solaris</title>
+ <para>To link with the PKCS #11 provider, threads must be
+ enabled in the BIND 9 build.</para>
+ <screen>
+$ <userinput>cd ../bind-9.7.0</userinput>
+$ <userinput>./configure CC="cc -xarch=amd64" --enable-threads \
+ --with-openssl=/opt/pkcs11/usr \
+ --with-pkcs11=/usr/lib/64/libpkcs11.so</userinput>
+</screen>
+ <para>(For a 32-bit build, omit CC="cc -xarch=amd64".)</para>
+ <para>If configure complains about OpenSSL not working, you
+ may have a 32/64-bit architecture mismatch. Or, you may have
+ incorrectly specified the path to OpenSSL (it should be the
+ same as the --prefix argument to the OpenSSL
+ Configure).</para>
+ </sect3>
+ <para>After configuring, run
+ "<command>make</command>",
+ "<command>make test</command>" and
+ "<command>make install</command>".</para>
+ </sect2>
+ <sect2>
+ <title>PKCS #11 Tools</title>
+ <para>BIND 9 includes a minimal set of tools to operate the
+ HSM, including
+ <command>pkcs11-keygen</command> to generate a new key pair
+ within the HSM,
+ <command>pkcs11-list</command> to list objects currently
+ available, and
+ <command>pkcs11-destroy</command> to remove objects.</para>
+ <para>In UNIX/Linux builds, these tools are built only if BIND
+ 9 is configured with the --with-pkcs11 option. (NOTE: If
+ --with-pkcs11 is set to "yes", rather than to the path of the
+ PKCS #11 provider, then the tools will be built but the
+ provider will be left undefined. Use the -m option or the
+ PKCS11_PROVIDER environment variable to specify the path to the
+ provider.)</para>
+ </sect2>
+ <sect2>
+ <title>Using the HSM</title>
+ <para>First, we must set up the runtime environment so the
+ OpenSSL and PKCS #11 libraries can be loaded:</para>
+ <screen>
+$ <userinput>export LD_LIBRARY_PATH=/opt/pkcs11/usr/lib:${LD_LIBRARY_PATH}</userinput>
+</screen>
+ <para>When operating an AEP Keyper, it is also necessary to
+ specify the location of the "machine" file, which stores
+ information about the Keyper for use by PKCS #11 provider
+ library. If the machine file is in
+ <filename>/opt/Keyper/PKCS11Provider/machine</filename>,
+ use:</para>
+ <screen>
+$ <userinput>export KEYPER_LIBRARY_PATH=/opt/Keyper/PKCS11Provider</userinput>
+</screen>
+ <!-- TODO: why not defined at compile time? -->
+ <para>These environment variables must be set whenever running
+ any tool that uses the HSM, including
+ <command>pkcs11-keygen</command>,
+ <command>pkcs11-list</command>,
+ <command>pkcs11-destroy</command>,
+ <command>dnssec-keyfromlabel</command>,
+ <command>dnssec-signzone</command>,
+ <command>dnssec-keygen</command>(which will use the HSM for
+ random number generation), and
+ <command>named</command>.</para>
+ <para>We can now create and use keys in the HSM. In this case,
+ we will create a 2048 bit key and give it the label
+ "sample-ksk":</para>
+ <screen>
+$ <userinput>pkcs11-keygen -b 2048 -l sample-ksk</userinput>
+</screen>
+ <para>To confirm that the key exists:</para>
+ <screen>
+$ <userinput>pkcs11-list</userinput>
+Enter PIN:
+object[0]: handle 2147483658 class 3 label[8] 'sample-ksk' id[0]
+object[1]: handle 2147483657 class 2 label[8] 'sample-ksk' id[0]
+</screen>
+ <para>Before using this key to sign a zone, we must create a
+ pair of BIND 9 key files. The "dnssec-keyfromlabel" utility
+ does this. In this case, we will be using the HSM key
+ "sample-ksk" as the key-signing key for "example.net":</para>
+ <screen>
+$ <userinput>dnssec-keyfromlabel -l sample-ksk -f KSK example.net</userinput>
+</screen>
+ <para>The resulting K*.key and K*.private files can now be used
+ to sign the zone. Unlike normal K* files, which contain both
+ public and private key data, these files will contain only the
+ public key data, plus an identifier for the private key which
+ remains stored within the HSM. The HSM handles signing with the
+ private key.</para>
+ <para>If you wish to generate a second key in the HSM for use
+ as a zone-signing key, follow the same procedure above, using a
+ different keylabel, a smaller key size, and omitting "-f KSK"
+ from the dnssec-keyfromlabel arguments:</para>
+ <screen>
+$ <userinput>pkcs11-keygen -b 1024 -l sample-zsk</userinput>
+$ <userinput>dnssec-keyfromlabel -l sample-zsk example.net</userinput>
+</screen>
+ <para>Alternatively, you may prefer to generate a conventional
+ on-disk key, using dnssec-keygen:</para>
+ <screen>
+$ <userinput>dnssec-keygen example.net</userinput>
+</screen>
+ <para>This provides less security than an HSM key, but since
+ HSMs can be slow or cumbersome to use for security reasons, it
+ may be more efficient to reserve HSM keys for use in the less
+ frequent key-signing operation. The zone-signing key can be
+ rolled more frequently, if you wish, to compensate for a
+ reduction in key security.</para>
+ <para>Now you can sign the zone. (Note: If not using the -S
+ option to
+ <command>dnssec-signzone</command>, it will be necessary to add
+ the contents of both
+ <filename>K*.key</filename> files to the zone master file before
+ signing it.)</para>
+ <screen>
+$ <userinput>dnssec-signzone -S example.net</userinput>
+Enter PIN:
+Verifying the zone using the following algorithms:
+NSEC3RSASHA1.
+Zone signing complete:
+Algorithm: NSEC3RSASHA1: ZSKs: 1, KSKs: 1 active, 0 revoked, 0 stand-by
+example.net.signed
+</screen>
+ </sect2>
+ <sect2>
+ <title>Specifying the engine on the command line</title>
+ <para>The OpenSSL engine can be specified in
+ <command>named</command> and all of the BIND
+ <command>dnssec-*</command> tools by using the "-E
+ &lt;engine&gt;" command line option. If BIND 9 is built with
+ the --with-pkcs11 option, this option defaults to "pkcs11".
+ Specifying the engine will generally not be necessary unless
+ for some reason you wish to use a different OpenSSL
+ engine.</para>
+ <para>If you wish to disable use of the "pkcs11" engine &mdash;
+ for troubleshooting purposes, or because the HSM is unavailable
+ &mdash; set the engine to the empty string. For example:</para>
+ <screen>
+$ <userinput>dnssec-signzone -E '' -S example.net</userinput>
+</screen>
+ <para>This causes
+ <command>dnssec-signzone</command> to run as if it were compiled
+ without the --with-pkcs11 option.</para>
+ </sect2>
+ <sect2>
+ <title>Running named with automatic zone re-signing</title>
+ <para>If you want
+ <command>named</command> to dynamically re-sign zones using HSM
+ keys, and/or to to sign new records inserted via nsupdate, then
+ named must have access to the HSM PIN. This can be accomplished
+ by placing the PIN into the openssl.cnf file (in the above
+ examples,
+ <filename>/opt/pkcs11/usr/ssl/openssl.cnf</filename>).</para>
+ <para>The location of the openssl.cnf file can be overridden by
+ setting the OPENSSL_CONF environment variable before running
+ named.</para>
+ <para>Sample openssl.cnf:</para>
+ <programlisting>
+ openssl_conf = openssl_def
+ [ openssl_def ]
+ engines = engine_section
+ [ engine_section ]
+ pkcs11 = pkcs11_section
+ [ pkcs11_section ]
+ PIN = <replaceable>&lt;PLACE PIN HERE&gt;</replaceable>
+</programlisting>
+ <para>This will also allow the dnssec-* tools to access the HSM
+ without PIN entry. (The pkcs11-* tools access the HSM directly,
+ not via OpenSSL, so a PIN will still be required to use
+ them.)</para>
+<!--
+If the PIN is not known, I believe the first time named needs the
+PIN to open a key, it'll ask you to type in the PIN, which will be
+a problem because it probably won't be running on a terminal
+-->
+ <warning>
+ <para>Placing the HSM's PIN in a text file in
+ this manner may reduce the security advantage of using an
+ HSM. Be sure this is what you want to do before configuring
+ OpenSSL in this way.</para>
+ </warning>
+ </sect2>
+ <!-- TODO: what is alternative then for named dynamic re-signing? -->
+ <!-- TODO: what happens if PIN is not known? named will log about it? -->
+</sect1>
diff --git a/contrib/bind9/doc/misc/Makefile.in b/contrib/bind9/doc/misc/Makefile.in
index 5a671b8..6468176 100644
--- a/contrib/bind9/doc/misc/Makefile.in
+++ b/contrib/bind9/doc/misc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.7.252.2 2009-07-11 23:47:17 tbox Exp $
+# $Id: Makefile.in,v 1.9 2009-07-10 23:47:58 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/doc/misc/options b/contrib/bind9/doc/misc/options
index a6b2dcd..673abf7 100644
--- a/contrib/bind9/doc/misc/options
+++ b/contrib/bind9/doc/misc/options
@@ -44,6 +44,9 @@ lwres {
view <string> <optional_class>;
};
+managed-keys { <string> <string> <integer> <integer> <integer>
+ <quoted_string>; ... };
+
masters <string> [ port <integer> ] { ( <masters> | <ipv4_address> [ port
<integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ]; ... };
@@ -52,6 +55,7 @@ options {
acache-enable <boolean>;
additional-from-auth <boolean>;
additional-from-cache <boolean>;
+ allow-new-zones <boolean>;
allow-notify { <address_match_element>; ... };
allow-query { <address_match_element>; ... };
allow-query-cache { <address_match_element>; ... };
@@ -68,11 +72,14 @@ options {
alt-transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> |
* ) ];
+ attach-cache <string>;
auth-nxdomain <boolean>; // default changed
avoid-v4-udp-ports { <portrange>; ... };
avoid-v6-udp-ports { <portrange>; ... };
+ bindkeys-file <quoted_string>;
blackhole { <address_match_element>; ... };
cache-file <quoted_string>;
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -85,15 +92,31 @@ options {
coresize <size>;
datasize <size>;
deallocate-on-exit <boolean>; // obsolete
+ deny-answer-addresses { <address_match_element>; ... } [
+ except-from { <quoted_string>; ... } ];
+ deny-answer-aliases { <quoted_string>; ... } [ except-from {
+ <quoted_string>; ... } ];
dialup <dialuptype>;
directory <quoted_string>;
disable-algorithms <string> { <string>; ... };
disable-empty-zone <string>;
+ dns64 <netprefix> {
+ break-dnssec <boolean>;
+ clients { <address_match_element>; ... };
+ exclude { <address_match_element>; ... };
+ mapped { <address_match_element>; ... };
+ recursive-only <boolean>;
+ suffix <ipv6_address>;
+ };
+ dns64-contact <string>;
+ dns64-server <string>;
dnssec-accept-expired <boolean>;
+ dnssec-dnskey-kskonly <boolean>;
dnssec-enable <boolean>;
dnssec-lookaside <string> trust-anchor <string>;
dnssec-must-be-secure <string> <boolean>;
- dnssec-validation <boolean>;
+ dnssec-secure-to-insecure <boolean>;
+ dnssec-validation ( yes | no | auto );
dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port
<integer> ] | <ipv4_address> [ port <integer> ] |
<ipv6_address> [ port <integer> ] ); ... };
@@ -105,6 +128,8 @@ options {
fake-iquery <boolean>; // obsolete
fetch-glue <boolean>; // obsolete
files <size>;
+ filter-aaaa { <address_match_element>; ... }; // not configured
+ filter-aaaa-on-v4 <v4_aaaa>; // not configured
flush-zones-on-shutdown <boolean>;
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> )
@@ -121,6 +146,7 @@ options {
listen-on [ port <integer> ] { <address_match_element>; ... };
listen-on-v6 [ port <integer> ] { <address_match_element>; ... };
maintain-ixfr-base <boolean>; // obsolete
+ managed-keys-directory <quoted_string>;
masterfile-format ( text | raw );
match-mapped-addresses <boolean>;
max-acache-size <size_no_default>;
@@ -168,13 +194,22 @@ options {
request-ixfr <boolean>;
request-nsid <boolean>;
reserved-sockets <integer>;
+ resolver-query-timeout <integer>;
+ response-policy {
+ zone <string> [ policy ( given | no-op | nxdomain | nodata
+ | cname <domain> ) ];
+ };
rfc2308-type1 <boolean>; // not yet implemented
root-delegation-only [ exclude { <quoted_string>; ... } ];
rrset-order { [ class <string> ] [ type <string> ] [ name
<quoted_string> ] <string> <string>; ... };
+ secroots-file <quoted_string>;
serial-queries <integer>; // obsolete
serial-query-rate <integer>;
server-id ( <quoted_string> | none | hostname );
+ session-keyalg <string>;
+ session-keyfile ( <quoted_string> | none );
+ session-keyname <string>;
sig-signing-nodes <integer>;
sig-signing-signatures <integer>;
sig-signing-type <integer>;
@@ -189,6 +224,7 @@ options {
tkey-dhkey <quoted_string> <integer>;
tkey-domain <quoted_string>;
tkey-gssapi-credential <quoted_string>;
+ tkey-gssapi-keytab <quoted_string>;
topology { <address_match_element>; ... }; // not implemented
transfer-format ( many-answers | one-answer );
transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
@@ -242,6 +278,7 @@ view <string> <optional_class> {
acache-enable <boolean>;
additional-from-auth <boolean>;
additional-from-cache <boolean>;
+ allow-new-zones <boolean>;
allow-notify { <address_match_element>; ... };
allow-query { <address_match_element>; ... };
allow-query-cache { <address_match_element>; ... };
@@ -258,8 +295,10 @@ view <string> <optional_class> {
alt-transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> |
* ) ];
+ attach-cache <string>;
auth-nxdomain <boolean>; // default changed
cache-file <quoted_string>;
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -270,17 +309,33 @@ view <string> <optional_class> {
cleaning-interval <integer>;
clients-per-query <integer>;
database <string>;
+ deny-answer-addresses { <address_match_element>; ... } [
+ except-from { <quoted_string>; ... } ];
+ deny-answer-aliases { <quoted_string>; ... } [ except-from {
+ <quoted_string>; ... } ];
dialup <dialuptype>;
disable-algorithms <string> { <string>; ... };
disable-empty-zone <string>;
dlz <string> {
database <string>;
};
+ dns64 <netprefix> {
+ break-dnssec <boolean>;
+ clients { <address_match_element>; ... };
+ exclude { <address_match_element>; ... };
+ mapped { <address_match_element>; ... };
+ recursive-only <boolean>;
+ suffix <ipv6_address>;
+ };
+ dns64-contact <string>;
+ dns64-server <string>;
dnssec-accept-expired <boolean>;
+ dnssec-dnskey-kskonly <boolean>;
dnssec-enable <boolean>;
dnssec-lookaside <string> trust-anchor <string>;
dnssec-must-be-secure <string> <boolean>;
- dnssec-validation <boolean>;
+ dnssec-secure-to-insecure <boolean>;
+ dnssec-validation ( yes | no | auto );
dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port
<integer> ] | <ipv4_address> [ port <integer> ] |
<ipv6_address> [ port <integer> ] ); ... };
@@ -289,6 +344,8 @@ view <string> <optional_class> {
empty-server <string>;
empty-zones-enable <boolean>;
fetch-glue <boolean>; // obsolete
+ filter-aaaa { <address_match_element>; ... }; // not configured
+ filter-aaaa-on-v4 <v4_aaaa>; // not configured
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> )
[ port <integer> ]; ... };
@@ -300,6 +357,8 @@ view <string> <optional_class> {
key-directory <quoted_string>;
lame-ttl <integer>;
maintain-ixfr-base <boolean>; // obsolete
+ managed-keys { <string> <string> <integer> <integer> <integer>
+ <quoted_string>; ... };
masterfile-format ( text | raw );
match-clients { <address_match_element>; ... };
match-destinations { <address_match_element>; ... };
@@ -338,6 +397,11 @@ view <string> <optional_class> {
recursion <boolean>;
request-ixfr <boolean>;
request-nsid <boolean>;
+ resolver-query-timeout <integer>;
+ response-policy {
+ zone <string> [ policy ( given | no-op | nxdomain | nodata
+ | cname <domain> ) ];
+ };
rfc2308-type1 <boolean>; // not yet implemented
root-delegation-only [ exclude { <quoted_string>; ... } ];
rrset-order { [ class <string> ] [ type <string> ] [ name
@@ -395,6 +459,8 @@ view <string> <optional_class> {
<integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port (
<integer> | * ) ];
+ auto-dnssec ( allow | maintain | create | off );
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -405,6 +471,8 @@ view <string> <optional_class> {
database <string>;
delegation-only <boolean>;
dialup <dialuptype>;
+ dnssec-dnskey-kskonly <boolean>;
+ dnssec-secure-to-insecure <boolean>;
file <quoted_string>;
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> |
@@ -440,6 +508,9 @@ view <string> <optional_class> {
nsec3-test-zone <boolean>; // test only
pubkey <integer> <integer> <integer>
<quoted_string>; // obsolete
+ server-addresses { ( <ipv4_address> | <ipv6_address> ) [
+ port <integer> ]; ... };
+ server-names { <quoted_string>; ... };
sig-signing-nodes <integer>;
sig-signing-signatures <integer>;
sig-signing-type <integer>;
@@ -449,13 +520,14 @@ view <string> <optional_class> {
transfer-source-v6 ( <ipv6_address> | * ) [ port (
<integer> | * ) ];
try-tcp-refresh <boolean>;
- type ( master | slave | stub | hint | forward |
- delegation-only );
+ type ( master | slave | stub | static-stub | hint | forward
+ | delegation-only );
update-check-ksk <boolean>;
- update-policy { ( grant | deny ) <string> ( name |
- subdomain | wildcard | self | selfsub | selfwild |
+ update-policy ( local | { ( grant | deny ) <string> ( name
+ | subdomain | wildcard | self | selfsub | selfwild |
krb5-self | ms-self | krb5-subdomain | ms-subdomain |
- tcp-self | 6to4-self ) <string> <rrtypelist>; ... };
+ tcp-self | 6to4-self | zonesub | external ) [ <string>
+ ] <rrtypelist>; ... };
use-alt-transfer-source <boolean>;
zero-no-soa-ttl <boolean>;
zone-statistics <boolean>;
@@ -475,6 +547,8 @@ zone <string> <optional_class> {
alt-transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
alt-transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> |
* ) ];
+ auto-dnssec ( allow | maintain | create | off );
+ check-dup-records ( fail | warn | ignore );
check-integrity <boolean>;
check-mx ( fail | warn | ignore );
check-mx-cname ( fail | warn | ignore );
@@ -485,6 +559,8 @@ zone <string> <optional_class> {
database <string>;
delegation-only <boolean>;
dialup <dialuptype>;
+ dnssec-dnskey-kskonly <boolean>;
+ dnssec-secure-to-insecure <boolean>;
file <quoted_string>;
forward ( first | only );
forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> )
@@ -517,6 +593,9 @@ zone <string> <optional_class> {
notify-to-soa <boolean>;
nsec3-test-zone <boolean>; // test only
pubkey <integer> <integer> <integer> <quoted_string>; // obsolete
+ server-addresses { ( <ipv4_address> | <ipv6_address> ) [ port
+ <integer> ]; ... };
+ server-names { <quoted_string>; ... };
sig-signing-nodes <integer>;
sig-signing-signatures <integer>;
sig-signing-type <integer>;
@@ -524,12 +603,13 @@ zone <string> <optional_class> {
transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ];
transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ];
try-tcp-refresh <boolean>;
- type ( master | slave | stub | hint | forward | delegation-only );
+ type ( master | slave | stub | static-stub | hint | forward |
+ delegation-only );
update-check-ksk <boolean>;
- update-policy { ( grant | deny ) <string> ( name | subdomain |
- wildcard | self | selfsub | selfwild | krb5-self | ms-self |
- krb5-subdomain | ms-subdomain | tcp-self | 6to4-self ) <string>
- <rrtypelist>; ... };
+ update-policy ( local | { ( grant | deny ) <string> ( name |
+ subdomain | wildcard | self | selfsub | selfwild | krb5-self |
+ ms-self | krb5-subdomain | ms-subdomain | tcp-self | 6to4-self
+ | zonesub | external ) [ <string> ] <rrtypelist>; ... };
use-alt-transfer-source <boolean>;
zero-no-soa-ttl <boolean>;
zone-statistics <boolean>;
diff --git a/contrib/bind9/lib/bind9/Makefile.in b/contrib/bind9/lib/bind9/Makefile.in
index e37d524..ffc2ad9 100644
--- a/contrib/bind9/lib/bind9/Makefile.in
+++ b/contrib/bind9/lib/bind9/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.11 2007-06-19 23:47:16 tbox Exp $
+# $Id: Makefile.in,v 1.14 2009-12-05 23:31:40 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/bind9/api b/contrib/bind9/lib/bind9/api
index f3b0f9f..78dd0b4 100644
--- a/contrib/bind9/lib/bind9/api
+++ b/contrib/bind9/lib/bind9/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 4
+LIBINTERFACE = 80
+LIBREVISION = 1
LIBAGE = 0
diff --git a/contrib/bind9/lib/bind9/check.c b/contrib/bind9/lib/bind9/check.c
index 76ca510..6fa9aa9 100644
--- a/contrib/bind9/lib/bind9/check.c
+++ b/contrib/bind9/lib/bind9/check.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: check.c,v 1.95.12.6 2010-03-04 23:47:53 tbox Exp $ */
+/* $Id: check.c,v 1.125 2011-01-07 23:47:07 tbox Exp $ */
/*! \file */
@@ -103,7 +103,7 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"rrset-order: invalid name '%s'", str);
@@ -202,7 +202,7 @@ check_dual_stack(const cfg_obj_t *options, isc_log_t *logctx) {
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
tresult = dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad name '%s'", str);
@@ -265,7 +265,7 @@ disabled_algorithms(const cfg_obj_t *disabled, isc_log_t *logctx) {
str = cfg_obj_asstring(obj);
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ tresult = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'", str);
@@ -352,7 +352,7 @@ mustbesecure(const cfg_obj_t *secure, isc_symtab_t *symtab, isc_log_t *logctx,
str = cfg_obj_asstring(obj);
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
- result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'", str);
@@ -407,7 +407,7 @@ check_viewacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
static const char *acls[] = { "allow-query", "allow-query-on",
"allow-query-cache", "allow-query-cache-on",
"blackhole", "match-clients", "match-destinations",
- "sortlist", NULL };
+ "sortlist", "filter-aaaa", NULL };
while (acls[i] != NULL) {
tresult = checkacl(acls[i++], actx, NULL, voptions, config,
@@ -418,6 +418,106 @@ check_viewacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
return (result);
}
+static const unsigned char zeros[16];
+
+static isc_result_t
+check_dns64(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
+ const cfg_obj_t *config, isc_log_t *logctx, isc_mem_t *mctx)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ const cfg_obj_t *dns64 = NULL;
+ const cfg_obj_t *options;
+ const cfg_listelt_t *element;
+ const cfg_obj_t *map, *obj;
+ isc_netaddr_t na, sa;
+ unsigned int prefixlen;
+ int nbytes;
+ int i;
+
+ static const char *acls[] = { "client", "exclude", "mapped", NULL};
+
+ if (voptions != NULL)
+ cfg_map_get(voptions, "dns64", &dns64);
+ if (config != NULL && dns64 == NULL) {
+ options = NULL;
+ cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ cfg_map_get(options, "dns64", &dns64);
+ }
+ if (dns64 == NULL)
+ return (ISC_R_SUCCESS);
+
+ for (element = cfg_list_first(dns64);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ map = cfg_listelt_value(element);
+ obj = cfg_map_getname(map);
+
+ cfg_obj_asnetprefix(obj, &na, &prefixlen);
+ if (na.family != AF_INET6) {
+ cfg_obj_log(map, logctx, ISC_LOG_ERROR,
+ "dns64 requires a IPv6 prefix");
+ result = ISC_R_FAILURE;
+ continue;
+ }
+
+ if (prefixlen != 32 && prefixlen != 40 && prefixlen != 48 &&
+ prefixlen != 56 && prefixlen != 64 && prefixlen != 96) {
+ cfg_obj_log(map, logctx, ISC_LOG_ERROR,
+ "bad prefix length %u [32/40/48/56/64/96]",
+ prefixlen);
+ result = ISC_R_FAILURE;
+ continue;
+ }
+
+ for (i = 0; acls[i] != NULL; i++) {
+ obj = NULL;
+ (void)cfg_map_get(map, acls[i], &obj);
+ if (obj != NULL) {
+ dns_acl_t *acl = NULL;
+ isc_result_t tresult;
+
+ tresult = cfg_acl_fromconfig(obj, config,
+ logctx, actx,
+ mctx, 0, &acl);
+ if (acl != NULL)
+ dns_acl_detach(&acl);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+ }
+ }
+
+ obj = NULL;
+ (void)cfg_map_get(map, "suffix", &obj);
+ if (obj != NULL) {
+ isc_netaddr_fromsockaddr(&sa, cfg_obj_assockaddr(obj));
+ if (sa.family != AF_INET6) {
+ cfg_obj_log(map, logctx, ISC_LOG_ERROR,
+ "dns64 requires a IPv6 suffix");
+ result = ISC_R_FAILURE;
+ continue;
+ }
+ nbytes = prefixlen / 8 + 4;
+ if (prefixlen >= 32 && prefixlen <= 64)
+ nbytes++;
+ if (memcmp(sa.type.in6.s6_addr, zeros, nbytes) != 0) {
+ char netaddrbuf[ISC_NETADDR_FORMATSIZE];
+ isc_netaddr_format(&sa, netaddrbuf,
+ sizeof(netaddrbuf));
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "bad suffix '%s' leading "
+ "%u octets not zeros",
+ netaddrbuf, nbytes);
+ result = ISC_R_FAILURE;
+ }
+ }
+ }
+
+ return (result);
+}
+
+
/*
* Check allow-recursion and allow-recursion-on acls, and also log a
* warning if they're inconsistent with the "recursion" option.
@@ -493,6 +593,78 @@ check_recursionacls(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
return (result);
}
+static isc_result_t
+check_filteraaaa(cfg_aclconfctx_t *actx, const cfg_obj_t *voptions,
+ const char *viewname, const cfg_obj_t *config,
+ isc_log_t *logctx, isc_mem_t *mctx)
+{
+ const cfg_obj_t *options, *aclobj, *obj = NULL;
+ dns_acl_t *acl = NULL;
+ isc_result_t result = ISC_R_SUCCESS, tresult;
+ dns_v4_aaaa_t filter;
+ const char *forview = " for view ";
+
+ if (voptions != NULL)
+ cfg_map_get(voptions, "filter-aaaa-on-v4", &obj);
+ if (obj == NULL && config != NULL) {
+ options = NULL;
+ cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ cfg_map_get(options, "filter-aaaa-on-v4", &obj);
+ }
+
+ if (obj == NULL)
+ filter = dns_v4_aaaa_ok; /* default */
+ else if (cfg_obj_isboolean(obj))
+ filter = cfg_obj_asboolean(obj) ? dns_v4_aaaa_filter :
+ dns_v4_aaaa_ok;
+ else
+ filter = dns_v4_aaaa_break_dnssec; /* break-dnssec */
+
+ if (viewname == NULL) {
+ viewname = "";
+ forview = "";
+ }
+
+ aclobj = options = NULL;
+ acl = NULL;
+
+ if (voptions != NULL)
+ cfg_map_get(voptions, "filter-aaaa", &aclobj);
+ if (config != NULL && aclobj == NULL) {
+ options = NULL;
+ cfg_map_get(config, "options", &options);
+ if (options != NULL)
+ cfg_map_get(options, "filter-aaaa", &aclobj);
+ }
+ if (aclobj == NULL)
+ return (result);
+
+ tresult = cfg_acl_fromconfig(aclobj, config, logctx,
+ actx, mctx, 0, &acl);
+
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ } else if (filter != dns_v4_aaaa_ok && dns_acl_isnone(acl)) {
+ cfg_obj_log(aclobj, logctx, ISC_LOG_WARNING,
+ "both \"filter-aaaa-on-v4 %s;\" and "
+ "\"filter-aaaa\" is 'none;'%s%s",
+ filter == dns_v4_aaaa_break_dnssec ?
+ "break-dnssec" : "yes", forview, viewname);
+ result = ISC_R_FAILURE;
+ } else if (filter == dns_v4_aaaa_ok && !dns_acl_isnone(acl)) {
+ cfg_obj_log(aclobj, logctx, ISC_LOG_WARNING,
+ "both \"filter-aaaa-on-v4 no;\" and "
+ "\"filter-aaaa\" is set%s%s", forview, viewname);
+ result = ISC_R_FAILURE;
+ }
+
+ if (acl != NULL)
+ dns_acl_detach(&acl);
+
+ return (result);
+}
+
typedef struct {
const char *name;
unsigned int scale;
@@ -524,6 +696,12 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
{ "statistics-interval", 60, 28 * 24 * 60 }, /* 28 days */
};
+ static const char *server_contact[] = {
+ "empty-server", "empty-contact",
+ "dns64-server", "dns64-contact",
+ NULL
+ };
+
/*
* Check that fields specified in units of time other than seconds
* have reasonable values.
@@ -620,7 +798,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(name, &b,
dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'",
@@ -666,14 +844,24 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
element = cfg_list_next(element))
{
const char *dlv;
+ const cfg_obj_t *anchor;
obj = cfg_listelt_value(element);
dlv = cfg_obj_asstring(cfg_tuple_get(obj, "domain"));
+ anchor = cfg_tuple_get(obj, "trust-anchor");
+
+ /*
+ * If domain is "auto" and trust anchor is missing,
+ * skip remaining tests
+ */
+ if (!strcmp(dlv, "auto") && cfg_obj_isvoid(anchor))
+ continue;
+
isc_buffer_init(&b, dlv, strlen(dlv));
isc_buffer_add(&b, strlen(dlv));
tresult = dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"bad domain name '%s'", dlv);
@@ -701,19 +889,32 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
if (result == ISC_R_SUCCESS)
result = ISC_R_FAILURE;
}
- dlv = cfg_obj_asstring(cfg_tuple_get(obj,
- "trust-anchor"));
- isc_buffer_init(&b, dlv, strlen(dlv));
- isc_buffer_add(&b, strlen(dlv));
- tresult = dns_name_fromtext(name, &b, dns_rootname,
- ISC_TRUE, NULL);
- if (tresult != ISC_R_SUCCESS) {
+
+ if (!cfg_obj_isvoid(anchor)) {
+ dlv = cfg_obj_asstring(anchor);
+ isc_buffer_init(&b, dlv, strlen(dlv));
+ isc_buffer_add(&b, strlen(dlv));
+ tresult = dns_name_fromtext(name, &b,
+ dns_rootname,
+ DNS_NAME_DOWNCASE,
+ NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "bad domain name '%s'",
+ dlv);
+ if (result == ISC_R_SUCCESS)
+ result = tresult;
+ }
+ } else {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
- "bad domain name '%s'", dlv);
+ "dnssec-lookaside requires "
+ "either 'auto' or a domain and "
+ "trust anchor");
if (result == ISC_R_SUCCESS)
- result = tresult;
+ result = ISC_R_FAILURE;
}
}
+
if (symtab != NULL)
isc_symtab_destroy(&symtab);
}
@@ -743,38 +944,29 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
}
/*
- * Check empty zone configuration.
+ * Check server/contacts for syntactic validity.
*/
- obj = NULL;
- (void)cfg_map_get(options, "empty-server", &obj);
- if (obj != NULL) {
- str = cfg_obj_asstring(obj);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (tresult != ISC_R_SUCCESS) {
- cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
- "empty-server: invalid name '%s'", str);
- result = ISC_R_FAILURE;
- }
- }
-
- obj = NULL;
- (void)cfg_map_get(options, "empty-contact", &obj);
- if (obj != NULL) {
- str = cfg_obj_asstring(obj);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (tresult != ISC_R_SUCCESS) {
- cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
- "empty-contact: invalid name '%s'", str);
- result = ISC_R_FAILURE;
+ for (i= 0; server_contact[i] != NULL; i++) {
+ obj = NULL;
+ (void)cfg_map_get(options, server_contact[i], &obj);
+ if (obj != NULL) {
+ str = cfg_obj_asstring(obj);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ tresult = dns_name_fromtext(dns_fixedname_name(&fixed),
+ &b, dns_rootname, 0, NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "%s: invalid name '%s'",
+ server_contact[i], str);
+ result = ISC_R_FAILURE;
+ }
}
}
+ /*
+ * Check empty zone configuration.
+ */
obj = NULL;
(void)cfg_map_get(options, "disable-empty-zone", &obj);
for (element = cfg_list_first(obj);
@@ -786,7 +978,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"disable-empty-zone: invalid name '%s'",
@@ -950,6 +1142,12 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {
const char *str;
isc_buffer_t b;
+ /* Check for "update-policy local;" */
+ if (cfg_obj_isstring(policy) &&
+ strcmp("local", cfg_obj_asstring(policy)) == 0)
+ return (ISC_R_SUCCESS);
+
+ /* Now check the grant policy */
for (element = cfg_list_first(policy);
element != NULL;
element = cfg_list_next(element))
@@ -965,24 +1163,28 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {
isc_buffer_init(&b, str, strlen(str));
isc_buffer_add(&b, strlen(str));
tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(identity, logctx, ISC_LOG_ERROR,
"'%s' is not a valid name", str);
result = tresult;
}
- dns_fixedname_init(&fixed);
- str = cfg_obj_asstring(dname);
- isc_buffer_init(&b, str, strlen(str));
- isc_buffer_add(&b, strlen(str));
- tresult = dns_name_fromtext(dns_fixedname_name(&fixed), &b,
- dns_rootname, ISC_FALSE, NULL);
- if (tresult != ISC_R_SUCCESS) {
- cfg_obj_log(dname, logctx, ISC_LOG_ERROR,
- "'%s' is not a valid name", str);
- result = tresult;
+ if (tresult == ISC_R_SUCCESS &&
+ strcasecmp(cfg_obj_asstring(matchtype), "zonesub") != 0) {
+ dns_fixedname_init(&fixed);
+ str = cfg_obj_asstring(dname);
+ isc_buffer_init(&b, str, strlen(str));
+ isc_buffer_add(&b, strlen(str));
+ tresult = dns_name_fromtext(dns_fixedname_name(&fixed),
+ &b, dns_rootname, 0, NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(dname, logctx, ISC_LOG_ERROR,
+ "'%s' is not a valid name", str);
+ result = tresult;
+ }
}
+
if (tresult == ISC_R_SUCCESS &&
strcasecmp(cfg_obj_asstring(matchtype), "wildcard") == 0 &&
!dns_name_iswildcard(dns_fixedname_name(&fixed))) {
@@ -1020,7 +1222,8 @@ check_update_policy(const cfg_obj_t *policy, isc_log_t *logctx) {
#define HINTZONE 8
#define FORWARDZONE 16
#define DELEGATIONZONE 32
-#define CHECKACL 64
+#define STATICSTUBZONE 64
+#define CHECKACL 128
typedef struct {
const char *name;
@@ -1033,7 +1236,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
dns_rdataclass_t defclass, cfg_aclconfctx_t *actx,
isc_log_t *logctx, isc_mem_t *mctx)
{
- const char *zname;
+ const char *znamestr;
const char *typestr;
unsigned int ztype;
const cfg_obj_t *zoptions;
@@ -1043,11 +1246,14 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
unsigned int i;
dns_rdataclass_t zclass;
dns_fixedname_t fixedname;
+ dns_name_t *zname = NULL;
isc_buffer_t b;
isc_boolean_t root = ISC_FALSE;
+ const cfg_listelt_t *element;
static optionstable options[] = {
- { "allow-query", MASTERZONE | SLAVEZONE | STUBZONE | CHECKACL },
+ { "allow-query", MASTERZONE | SLAVEZONE | STUBZONE | CHECKACL |
+ STATICSTUBZONE },
{ "allow-notify", SLAVEZONE | CHECKACL },
{ "allow-transfer", MASTERZONE | SLAVEZONE | CHECKACL },
{ "notify", MASTERZONE | SLAVEZONE },
@@ -1070,12 +1276,14 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
{ "min-retry-time", SLAVEZONE | STUBZONE },
{ "max-refresh-time", SLAVEZONE | STUBZONE },
{ "min-refresh-time", SLAVEZONE | STUBZONE },
+ { "dnssec-secure-to-insecure", MASTERZONE },
{ "sig-validity-interval", MASTERZONE },
{ "sig-re-signing-interval", MASTERZONE },
{ "sig-signing-nodes", MASTERZONE },
{ "sig-signing-type", MASTERZONE },
{ "sig-signing-signatures", MASTERZONE },
- { "zone-statistics", MASTERZONE | SLAVEZONE | STUBZONE },
+ { "zone-statistics", MASTERZONE | SLAVEZONE | STUBZONE |
+ STATICSTUBZONE},
{ "allow-update", MASTERZONE | CHECKACL },
{ "allow-update-forwarding", SLAVEZONE | CHECKACL },
{ "file", MASTERZONE | SLAVEZONE | STUBZONE | HINTZONE },
@@ -1089,12 +1297,17 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
{ "key-directory", MASTERZONE },
{ "check-wildcard", MASTERZONE },
{ "check-mx", MASTERZONE },
+ { "check-dup-records", MASTERZONE },
{ "integrity-check", MASTERZONE },
{ "check-mx-cname", MASTERZONE },
{ "check-srv-cname", MASTERZONE },
{ "masterfile-format", MASTERZONE | SLAVEZONE | STUBZONE | HINTZONE },
{ "update-check-ksk", MASTERZONE },
+ { "dnssec-dnskey-kskonly", MASTERZONE },
+ { "auto-dnssec", MASTERZONE },
{ "try-tcp-refresh", SLAVEZONE },
+ { "server-addresses", STATICSTUBZONE },
+ { "server-names", STATICSTUBZONE },
};
static optionstable dialups[] = {
@@ -1104,7 +1317,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
{ "passive", SLAVEZONE | STUBZONE },
};
- zname = cfg_obj_asstring(cfg_tuple_get(zconfig, "name"));
+ znamestr = cfg_obj_asstring(cfg_tuple_get(zconfig, "name"));
zoptions = cfg_tuple_get(zconfig, "options");
@@ -1112,7 +1325,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
(void)cfg_map_get(zoptions, "type", &obj);
if (obj == NULL) {
cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
- "zone '%s': type not present", zname);
+ "zone '%s': type not present", znamestr);
return (ISC_R_FAILURE);
}
@@ -1123,6 +1336,8 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
ztype = SLAVEZONE;
else if (strcasecmp(typestr, "stub") == 0)
ztype = STUBZONE;
+ else if (strcasecmp(typestr, "static-stub") == 0)
+ ztype = STATICSTUBZONE;
else if (strcasecmp(typestr, "forward") == 0)
ztype = FORWARDZONE;
else if (strcasecmp(typestr, "hint") == 0)
@@ -1132,7 +1347,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
else {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': invalid type %s",
- zname, typestr);
+ znamestr, typestr);
return (ISC_R_FAILURE);
}
@@ -1146,14 +1361,14 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (result != ISC_R_SUCCESS) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': invalid class %s",
- zname, r.base);
+ znamestr, r.base);
return (ISC_R_FAILURE);
}
if (zclass != defclass) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': class '%s' does not "
"match view/default class",
- zname, r.base);
+ znamestr, r.base);
return (ISC_R_FAILURE);
}
}
@@ -1164,26 +1379,25 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
* deals with strings.
*/
dns_fixedname_init(&fixedname);
- isc_buffer_init(&b, zname, strlen(zname));
- isc_buffer_add(&b, strlen(zname));
+ isc_buffer_init(&b, znamestr, strlen(znamestr));
+ isc_buffer_add(&b, strlen(znamestr));
tresult = dns_name_fromtext(dns_fixedname_name(&fixedname), &b,
- dns_rootname, ISC_TRUE, NULL);
+ dns_rootname, DNS_NAME_DOWNCASE, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
- "zone '%s': is not a valid name", zname);
+ "zone '%s': is not a valid name", znamestr);
result = ISC_R_FAILURE;
} else {
char namebuf[DNS_NAME_FORMATSIZE];
- dns_name_format(dns_fixedname_name(&fixedname),
- namebuf, sizeof(namebuf));
+ zname = dns_fixedname_name(&fixedname);
+ dns_name_format(zname, namebuf, sizeof(namebuf));
tresult = nameexist(zconfig, namebuf, ztype == HINTZONE ? 1 : 2,
symtab, "zone '%s': already exists "
"previous definition: %s:%u", logctx, mctx);
if (tresult != ISC_R_SUCCESS)
result = tresult;
- if (dns_name_equal(dns_fixedname_name(&fixedname),
- dns_rootname))
+ if (dns_name_equal(zname, dns_rootname))
root = ISC_TRUE;
}
@@ -1202,13 +1416,15 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"option '%s' is not allowed "
"in '%s' zone '%s'",
- options[i].name, typestr, zname);
+ options[i].name, typestr,
+ znamestr);
result = ISC_R_FAILURE;
} else
cfg_obj_log(obj, logctx, ISC_LOG_WARNING,
"option '%s' is not allowed "
"in '%s' zone '%s'",
- options[i].name, typestr, zname);
+ options[i].name, typestr,
+ znamestr);
}
obj = NULL;
if ((options[i].allowed & ztype) != 0 &&
@@ -1230,7 +1446,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (cfg_map_get(zoptions, "masters", &obj) != ISC_R_SUCCESS) {
cfg_obj_log(zoptions, logctx, ISC_LOG_ERROR,
"zone '%s': missing 'masters' entry",
- zname);
+ znamestr);
result = ISC_R_FAILURE;
} else {
isc_uint32_t count;
@@ -1241,7 +1457,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (tresult == ISC_R_SUCCESS && count == 0) {
cfg_obj_log(zoptions, logctx, ISC_LOG_ERROR,
"zone '%s': empty 'masters' entry",
- zname);
+ znamestr);
result = ISC_R_FAILURE;
}
}
@@ -1251,7 +1467,10 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
* Master zones can't have both "allow-update" and "update-policy".
*/
if (ztype == MASTERZONE) {
- isc_result_t res1, res2;
+ isc_result_t res1, res2, res3;
+ const char *arg;
+ isc_boolean_t ddns;
+
obj = NULL;
res1 = cfg_map_get(zoptions, "allow-update", &obj);
obj = NULL;
@@ -1260,11 +1479,32 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"zone '%s': 'allow-update' is ignored "
"when 'update-policy' is present",
- zname);
+ znamestr);
result = ISC_R_FAILURE;
} else if (res2 == ISC_R_SUCCESS &&
check_update_policy(obj, logctx) != ISC_R_SUCCESS)
result = ISC_R_FAILURE;
+ ddns = ISC_TF(res1 == ISC_R_SUCCESS || res2 == ISC_R_SUCCESS);
+
+ obj = NULL;
+ arg = "off";
+ res3 = cfg_map_get(zoptions, "auto-dnssec", &obj);
+ if (res3 == ISC_R_SUCCESS)
+ arg = cfg_obj_asstring(obj);
+ if (strcasecmp(arg, "off") != 0 && !ddns) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "'auto-dnssec %s;' requires "
+ "dynamic DNS to be configured in the zone",
+ arg);
+ result = ISC_R_FAILURE;
+ }
+ if (strcasecmp(arg, "create") == 0) {
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "'auto-dnssec create;' is not "
+ "yet implemented");
+ result = ISC_R_FAILURE;
+ }
+
obj = NULL;
res1 = cfg_map_get(zoptions, "sig-signing-type", &obj);
if (res1 == ISC_R_SUCCESS) {
@@ -1298,7 +1538,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
"dialup type '%s' is not "
"allowed in '%s' "
"zone '%s'",
- str, typestr, zname);
+ str, typestr, znamestr);
result = ISC_R_FAILURE;
}
break;
@@ -1306,7 +1546,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
if (i == sizeof(dialups) / sizeof(dialups[0])) {
cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
"invalid dialup type '%s' in zone "
- "'%s'", str, zname);
+ "'%s'", str, znamestr);
result = ISC_R_FAILURE;
}
}
@@ -1330,6 +1570,78 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
result = ISC_R_FAILURE;
/*
+ * Check validity of static stub server addresses.
+ */
+ obj = NULL;
+ (void)cfg_map_get(zoptions, "server-addresses", &obj);
+ if (ztype == STATICSTUBZONE && obj != NULL) {
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ isc_sockaddr_t sa;
+ isc_netaddr_t na;
+ obj = cfg_listelt_value(element);
+ sa = *cfg_obj_assockaddr(obj);
+
+ if (isc_sockaddr_getport(&sa) != 0) {
+ result = ISC_R_FAILURE;
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "port is not configurable for "
+ "static stub server-addresses");
+ }
+
+ isc_netaddr_fromsockaddr(&na, &sa);
+ if (isc_netaddr_getzone(&na) != 0) {
+ result = ISC_R_FAILURE;
+ cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+ "scoped address is not allowed "
+ "for static stub "
+ "server-addresses");
+ }
+ }
+ }
+
+ /*
+ * Check validity of static stub server names.
+ */
+ obj = NULL;
+ (void)cfg_map_get(zoptions, "server-names", &obj);
+ if (zname != NULL && ztype == STATICSTUBZONE && obj != NULL) {
+ for (element = cfg_list_first(obj);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const char *snamestr;
+ dns_fixedname_t fixed_sname;
+ isc_buffer_t b2;
+ dns_name_t *sname;
+
+ obj = cfg_listelt_value(element);
+ snamestr = cfg_obj_asstring(obj);
+
+ dns_fixedname_init(&fixed_sname);
+ isc_buffer_init(&b2, snamestr, strlen(snamestr));
+ isc_buffer_add(&b2, strlen(snamestr));
+ sname = dns_fixedname_name(&fixed_sname);
+ tresult = dns_name_fromtext(sname, &b2, dns_rootname,
+ 0, NULL);
+ if (tresult != ISC_R_SUCCESS) {
+ cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
+ "server-name '%s' is not a valid "
+ "name", snamestr);
+ result = ISC_R_FAILURE;
+ } else if (dns_name_issubdomain(sname, zname)) {
+ cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
+ "server-name '%s' must not be a "
+ "subdomain of zone name '%s'",
+ snamestr, znamestr);
+ result = ISC_R_FAILURE;
+ }
+ }
+ }
+
+ /*
* Check various options.
*/
tresult = check_options(zoptions, logctx, mctx);
@@ -1352,7 +1664,7 @@ check_zoneconf(const cfg_obj_t *zconfig, const cfg_obj_t *voptions,
(ztype == MASTERZONE || ztype == HINTZONE)) {
cfg_obj_log(zconfig, logctx, ISC_LOG_ERROR,
"zone '%s': missing 'file' entry",
- zname);
+ znamestr);
result = tresult;
}
}
@@ -1374,6 +1686,9 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) {
const char *algorithm;
int i;
size_t len = 0;
+ isc_result_t result;
+ isc_buffer_t buf;
+ unsigned char secretbuf[1024];
static const algorithmtable algorithms[] = {
{ "hmac-md5", 128 },
{ "hmac-md5.sig-alg.reg.int", 0 },
@@ -1396,6 +1711,14 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) {
return (ISC_R_FAILURE);
}
+ isc_buffer_init(&buf, secretbuf, sizeof(secretbuf));
+ result = isc_base64_decodestring(cfg_obj_asstring(secretobj), &buf);
+ if (result != ISC_R_SUCCESS) {
+ cfg_obj_log(secretobj, logctx, ISC_LOG_ERROR,
+ "bad secret '%s'", isc_result_totext(result));
+ return (result);
+ }
+
algorithm = cfg_obj_asstring(algobj);
for (i = 0; algorithms[i].name != NULL; i++) {
len = strlen(algorithms[i].name);
@@ -1480,7 +1803,7 @@ check_keylist(const cfg_obj_t *keys, isc_symtab_t *symtab,
isc_buffer_init(&b, keyid, strlen(keyid));
isc_buffer_add(&b, strlen(keyid));
tresult = dns_name_fromtext(name, &b, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(key, logctx, ISC_LOG_ERROR,
"key '%s': bad key name", keyid);
@@ -1650,7 +1973,7 @@ check_servers(const cfg_obj_t *config, const cfg_obj_t *voptions,
isc_buffer_add(&b, strlen(keyval));
keyname = dns_fixedname_name(&fname);
tresult = dns_name_fromtext(keyname, &b, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (tresult != ISC_R_SUCCESS) {
cfg_obj_log(keys, logctx, ISC_LOG_ERROR,
"bad key name '%s'", keyval);
@@ -1670,7 +1993,8 @@ check_servers(const cfg_obj_t *config, const cfg_obj_t *voptions,
}
static isc_result_t
-check_trusted_key(const cfg_obj_t *key, isc_log_t *logctx)
+check_trusted_key(const cfg_obj_t *key, isc_boolean_t managed,
+ isc_log_t *logctx)
{
const char *keystr, *keynamestr;
dns_fixedname_t fkeyname;
@@ -1704,6 +2028,19 @@ check_trusted_key(const cfg_obj_t *key, isc_log_t *logctx)
result = ISC_R_FAILURE;
}
+ if (managed) {
+ const char *initmethod;
+ initmethod = cfg_obj_asstring(cfg_tuple_get(key, "init"));
+
+ if (strcasecmp(initmethod, "initial-key") != 0) {
+ cfg_obj_log(key, logctx, ISC_LOG_ERROR,
+ "managed key '%s': "
+ "invalid initialization method '%s'",
+ keynamestr, initmethod);
+ result = ISC_R_FAILURE;
+ }
+ }
+
isc_buffer_init(&keydatabuf, keydata, sizeof(keydata));
keystr = cfg_obj_asstring(cfg_tuple_get(key, "key"));
@@ -1719,7 +2056,8 @@ check_trusted_key(const cfg_obj_t *key, isc_log_t *logctx)
if ((alg == DST_ALG_RSASHA1 || alg == DST_ALG_RSAMD5) &&
r.length > 1 && r.base[0] == 1 && r.base[1] == 3)
cfg_obj_log(key, logctx, ISC_LOG_WARNING,
- "trusted key '%s' has a weak exponent",
+ "%s key '%s' has a weak exponent",
+ managed ? "managed" : "trusted",
keynamestr);
}
@@ -1892,12 +2230,32 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions,
element2 != NULL;
element2 = cfg_list_next(element2)) {
obj = cfg_listelt_value(element2);
- tresult = check_trusted_key(obj, logctx);
+ tresult = check_trusted_key(obj, ISC_FALSE, logctx);
if (tresult != ISC_R_SUCCESS)
result = tresult;
}
}
+ keys = NULL;
+ if (voptions != NULL)
+ (void)cfg_map_get(voptions, "managed-keys", &keys);
+ if (keys == NULL)
+ (void)cfg_map_get(config, "managed-keys", &keys);
+
+ for (element = cfg_list_first(keys);
+ element != NULL;
+ element = cfg_list_next(element))
+ {
+ const cfg_obj_t *keylist = cfg_listelt_value(element);
+ for (element2 = cfg_list_first(keylist);
+ element2 != NULL;
+ element2 = cfg_list_next(element2)) {
+ obj = cfg_listelt_value(element2);
+ tresult = check_trusted_key(obj, ISC_TRUE, logctx);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+ }
+ }
/*
* Check options.
*/
@@ -1917,7 +2275,16 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions,
if (tresult != ISC_R_SUCCESS)
result = tresult;
- cfg_aclconfctx_destroy(&actx);
+ tresult = check_filteraaaa(&actx, voptions, viewname, config,
+ logctx, mctx);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+
+ tresult = check_dns64(&actx, voptions, config, logctx, mctx);
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+
+ cfg_aclconfctx_clear(&actx);
return (result);
}
@@ -2162,7 +2529,7 @@ bind9_check_controls(const cfg_obj_t *config, isc_log_t *logctx,
result = tresult;
}
}
- cfg_aclconfctx_destroy(&actx);
+ cfg_aclconfctx_clear(&actx);
return (result);
}
diff --git a/contrib/bind9/lib/bind9/include/bind9/getaddresses.h b/contrib/bind9/lib/bind9/include/bind9/getaddresses.h
index 677ced2..9ad8045 100644
--- a/contrib/bind9/lib/bind9/include/bind9/getaddresses.h
+++ b/contrib/bind9/lib/bind9/include/bind9/getaddresses.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: getaddresses.h,v 1.9.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: getaddresses.h,v 1.11 2009-01-17 23:47:42 tbox Exp $ */
#ifndef BIND9_GETADDRESSES_H
#define BIND9_GETADDRESSES_H 1
diff --git a/contrib/bind9/lib/dns/Makefile.in b/contrib/bind9/lib/dns/Makefile.in
index dfb8d7f..45c5c2a 100644
--- a/contrib/bind9/lib/dns/Makefile.in
+++ b/contrib/bind9/lib/dns/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.163.50.2 2010-06-09 23:48:16 tbox Exp $
+# $Id: Makefile.in,v 1.176 2011-01-13 01:59:27 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -34,8 +34,7 @@ USE_ISC_SPNEGO = @USE_ISC_SPNEGO@
CINCLUDES = -I. -Iinclude ${DNS_INCLUDES} \
${ISC_INCLUDES} @DST_OPENSSL_INC@ @DST_GSSAPI_INC@
-CDEFINES = -DUSE_MD5 @USE_OPENSSL@ @USE_PKCS11@ @USE_GSSAPI@ \
- ${USE_ISC_SPNEGO}
+CDEFINES = -DUSE_MD5 @USE_OPENSSL@ @USE_GSSAPI@ ${USE_ISC_SPNEGO}
CWARNINGS =
@@ -48,7 +47,7 @@ LIBS = @LIBS@
# Alphabetically
OPENSSLLINKOBJS = openssl_link.@O@ openssldh_link.@O@ openssldsa_link.@O@ \
- opensslrsa_link.@O@
+ opensslgost_link.@O@ opensslrsa_link.@O@
DSTOBJS = @DST_EXTRA_OBJS@ @OPENSSLLINKOBJS@ \
dst_api.@O@ dst_lib.@O@ dst_parse.@O@ dst_result.@O@ \
@@ -58,24 +57,26 @@ DSTOBJS = @DST_EXTRA_OBJS@ @OPENSSLLINKOBJS@ \
DNSOBJS = acache.@O@ acl.@O@ adb.@O@ byaddr.@O@ \
cache.@O@ callbacks.@O@ compress.@O@ \
db.@O@ dbiterator.@O@ dbtable.@O@ diff.@O@ dispatch.@O@ \
- dlz.@O@ dnssec.@O@ ds.@O@ forward.@O@ iptable.@O@ journal.@O@ \
- keytable.@O@ lib.@O@ log.@O@ lookup.@O@ \
+ dlz.@O@ dns64.@O@ dnssec.@O@ ds.@O@ forward.@O@ iptable.@O@ \
+ journal.@O@ keydata.@O@ keytable.@O@ \
+ lib.@O@ log.@O@ lookup.@O@ \
master.@O@ masterdump.@O@ message.@O@ \
- name.@O@ ncache.@O@ nsec.@O@ nsec3.@O@ order.@O@ peer.@O@ portlist.@O@ \
+ name.@O@ ncache.@O@ nsec.@O@ nsec3.@O@ order.@O@ peer.@O@ \
+ portlist.@O@ private.@O@ \
rbt.@O@ rbtdb.@O@ rbtdb64.@O@ rcode.@O@ rdata.@O@ \
- rdatalist.@O@ \
- rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ request.@O@ \
- resolver.@O@ result.@O@ rootns.@O@ sdb.@O@ sdlz.@O@ \
- soa.@O@ ssu.@O@ \
+ rdatalist.@O@ rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ \
+ request.@O@ resolver.@O@ result.@O@ rootns.@O@ rpz.@O@ \
+ rriterator.@O@ sdb.@O@ \
+ sdlz.@O@ soa.@O@ ssu.@O@ ssu_external.@O@ \
stats.@O@ tcpmsg.@O@ time.@O@ timer.@O@ tkey.@O@ \
- tsig.@O@ ttl.@O@ validator.@O@ \
+ tsec.@O@ tsig.@O@ ttl.@O@ validator.@O@ \
version.@O@ view.@O@ xfrin.@O@ zone.@O@ zonekey.@O@ zt.@O@
OBJS= ${DNSOBJS} ${OTHEROBJS} ${DSTOBJS}
# Alphabetically
-OPENSSLLINKSRCS = openssl_link.c openssldh_link.c \
- openssldsa_link.c opensslrsa_link.c
+OPENSSLLINKSRCS = openssl_link.c openssldh_link.c openssldsa_link.c \
+ opensslgost_link.c opensslrsa_link.c
DSTSRCS = @DST_EXTRA_SRCS@ @OPENSSLLINKSRCS@ \
dst_api.c dst_lib.c dst_parse.c \
@@ -85,17 +86,16 @@ DSTSRCS = @DST_EXTRA_SRCS@ @OPENSSLLINKSRCS@ \
DNSSRCS = acache.c acl.c adb.c byaddr.c \
cache.c callbacks.c compress.c \
db.c dbiterator.c dbtable.c diff.c dispatch.c \
- dlz.c dnssec.c ds.c forward.c iptable.c journal.c \
- keytable.c lib.c log.c lookup.c \
+ dlz.c dns64.c dnssec.c ds.c forward.c iptable.c journal.c \
+ keydata.c keytable.c lib.c log.c lookup.c \
master.c masterdump.c message.c \
name.c ncache.c nsec.c nsec3.c order.c peer.c portlist.c \
- rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c \
- rdatalist.c \
+ rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c rdatalist.c \
rdataset.c rdatasetiter.c rdataslab.c request.c \
- resolver.c result.c rootns.c sdb.c sdlz.c \
- soa.c ssu.c \
+ resolver.c result.c rootns.c rpz.c rriterator.c \
+ sdb.c sdlz.c soa.c ssu.c ssu_external.c \
stats.c tcpmsg.c time.c timer.c tkey.c \
- tsig.c ttl.c validator.c \
+ tsec.c tsig.c ttl.c validator.c \
version.c view.c xfrin.c zone.c zonekey.c zt.c ${OTHERSRCS}
SRCS = ${DSTSRCS} ${DNSSRCS}
diff --git a/contrib/bind9/lib/dns/acl.c b/contrib/bind9/lib/dns/acl.c
index cfb7fd8..118e394 100644
--- a/contrib/bind9/lib/dns/acl.c
+++ b/contrib/bind9/lib/dns/acl.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acl.c,v 1.50.44.3 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: acl.c,v 1.53 2009-01-17 23:47:42 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/adb.c b/contrib/bind9/lib/dns/adb.c
index cd9cadf..fcc2dd8 100644
--- a/contrib/bind9/lib/dns/adb.c
+++ b/contrib/bind9/lib/dns/adb.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: adb.c,v 1.243.42.6 2010-08-11 23:45:49 tbox Exp $ */
+/* $Id: adb.c,v 1.254 2010-12-21 23:47:08 tbox Exp $ */
/*! \file
*
@@ -66,13 +66,6 @@
#define DNS_ADBFETCH6_VALID(x) ISC_MAGIC_VALID(x, DNS_ADBFETCH6_MAGIC)
/*!
- * The number of buckets needs to be a prime (for good hashing).
- *
- * XXXRTH How many buckets do we need?
- */
-#define NBUCKETS 1009 /*%< how many buckets for names/addrs */
-
-/*!
* For type 3 negative cache entries, we will remember that the address is
* broken for this long. XXXMLG This is also used for actual addresses, too.
* The intent is to keep us from constantly asking about A/AAAA records
@@ -139,30 +132,37 @@ struct dns_adb {
*
* XXXRTH Have a per-bucket structure that contains all of these?
*/
- dns_adbnamelist_t names[NBUCKETS];
- dns_adbnamelist_t deadnames[NBUCKETS];
- /*% See dns_adbnamelist_t */
- isc_mutex_t namelocks[NBUCKETS];
- /*% See dns_adbnamelist_t */
- isc_boolean_t name_sd[NBUCKETS];
- /*% See dns_adbnamelist_t */
- unsigned int name_refcnt[NBUCKETS];
+ unsigned int nnames;
+ isc_mutex_t namescntlock;
+ unsigned int namescnt;
+ dns_adbnamelist_t *names;
+ dns_adbnamelist_t *deadnames;
+ isc_mutex_t *namelocks;
+ isc_boolean_t *name_sd;
+ unsigned int *name_refcnt;
/*!
- * Bucketized locks for entries.
+ * Bucketized locks and lists for entries.
*
* XXXRTH Have a per-bucket structure that contains all of these?
*/
- dns_adbentrylist_t entries[NBUCKETS];
- dns_adbentrylist_t deadentries[NBUCKETS];
- isc_mutex_t entrylocks[NBUCKETS];
- isc_boolean_t entry_sd[NBUCKETS]; /*%< shutting down */
- unsigned int entry_refcnt[NBUCKETS];
+ unsigned int nentries;
+ isc_mutex_t entriescntlock;
+ unsigned int entriescnt;
+ dns_adbentrylist_t *entries;
+ dns_adbentrylist_t *deadentries;
+ isc_mutex_t *entrylocks;
+ isc_boolean_t *entry_sd; /*%< shutting down */
+ unsigned int *entry_refcnt;
isc_event_t cevent;
isc_boolean_t cevent_sent;
isc_boolean_t shutting_down;
isc_eventlist_t whenshutdown;
+ isc_event_t growentries;
+ isc_boolean_t growentries_sent;
+ isc_event_t grownames;
+ isc_boolean_t grownames_sent;
};
/*
@@ -484,6 +484,322 @@ ttlclamp(dns_ttl_t ttl) {
}
/*
+ * Hashing is most efficient if the number of buckets is prime.
+ * The sequence below is the closest previous primes to 2^n and
+ * 1.5 * 2^n, for values of n from 10 to 28. (The tables will
+ * no longer grow beyond 2^28 entries.)
+ */
+static const unsigned nbuckets[] = { 1021, 1531, 2039, 3067, 4093, 6143,
+ 8191, 12281, 16381, 24571, 32749,
+ 49193, 65521, 98299, 131071, 199603,
+ 262139, 393209, 524287, 768431, 1048573,
+ 1572853, 2097143, 3145721, 4194301,
+ 6291449, 8388593, 12582893, 16777213,
+ 25165813, 33554393, 50331599, 67108859,
+ 100663291, 134217689, 201326557,
+ 268535431, 0 };
+
+static void
+grow_entries(isc_task_t *task, isc_event_t *ev) {
+ dns_adb_t *adb;
+ dns_adbentry_t *e;
+ dns_adbentrylist_t *newdeadentries = NULL;
+ dns_adbentrylist_t *newentries = NULL;
+ isc_boolean_t *newentry_sd = NULL;
+ isc_mutex_t *newentrylocks = NULL;
+ isc_result_t result;
+ unsigned int *newentry_refcnt = NULL;
+ unsigned int i, n, bucket;
+
+ adb = ev->ev_arg;
+ INSIST(DNS_ADB_VALID(adb));
+
+ isc_event_free(&ev);
+
+ isc_task_beginexclusive(task);
+
+ i = 0;
+ while (nbuckets[i] != 0 && adb->nentries >= nbuckets[i])
+ i++;
+ if (nbuckets[i] != 0)
+ n = nbuckets[i];
+ else
+ goto done;
+
+ DP(ISC_LOG_INFO, "adb: grow_entries to %u starting", n);
+
+ /*
+ * Are we shutting down?
+ */
+ for (i = 0; i < adb->nentries; i++)
+ if (adb->entry_sd[i])
+ goto cleanup;
+
+ /*
+ * Grab all the resources we need.
+ */
+ newentries = isc_mem_get(adb->mctx, sizeof(*newentries) * n);
+ newdeadentries = isc_mem_get(adb->mctx, sizeof(*newdeadentries) * n);
+ newentrylocks = isc_mem_get(adb->mctx, sizeof(*newentrylocks) * n);
+ newentry_sd = isc_mem_get(adb->mctx, sizeof(*newentry_sd) * n);
+ newentry_refcnt = isc_mem_get(adb->mctx, sizeof(*newentry_refcnt) * n);
+ if (newentries == NULL || newdeadentries == NULL ||
+ newentrylocks == NULL || newentry_sd == NULL ||
+ newentry_refcnt == NULL)
+ goto cleanup;
+
+ /*
+ * Initialise the new resources.
+ */
+ result = isc_mutexblock_init(newentrylocks, n);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ for (i = 0; i < n; i++) {
+ ISC_LIST_INIT(newentries[i]);
+ ISC_LIST_INIT(newdeadentries[i]);
+ newentry_sd[i] = ISC_FALSE;
+ newentry_refcnt[i] = 0;
+ adb->irefcnt++;
+ }
+
+ /*
+ * Move entries to new arrays.
+ */
+ for (i = 0; i < adb->nentries; i++) {
+ e = ISC_LIST_HEAD(adb->entries[i]);
+ while (e != NULL) {
+ ISC_LIST_UNLINK(adb->entries[i], e, plink);
+ bucket = isc_sockaddr_hash(&e->sockaddr, ISC_TRUE) % n;
+ e->lock_bucket = bucket;
+ ISC_LIST_APPEND(newentries[bucket], e, plink);
+ INSIST(adb->entry_refcnt[i] > 0);
+ adb->entry_refcnt[i]--;
+ newentry_refcnt[bucket]++;
+ e = ISC_LIST_HEAD(adb->entries[i]);
+ }
+ e = ISC_LIST_HEAD(adb->deadentries[i]);
+ while (e != NULL) {
+ ISC_LIST_UNLINK(adb->deadentries[i], e, plink);
+ bucket = isc_sockaddr_hash(&e->sockaddr, ISC_TRUE) % n;
+ e->lock_bucket = bucket;
+ ISC_LIST_APPEND(newdeadentries[bucket], e, plink);
+ INSIST(adb->entry_refcnt[i] > 0);
+ adb->entry_refcnt[i]--;
+ newentry_refcnt[bucket]++;
+ e = ISC_LIST_HEAD(adb->deadentries[i]);
+ }
+ INSIST(adb->entry_refcnt[i] == 0);
+ adb->irefcnt--;
+ }
+
+ /*
+ * Cleanup old resources.
+ */
+ DESTROYMUTEXBLOCK(adb->entrylocks, adb->nentries);
+ isc_mem_put(adb->mctx, adb->entries,
+ sizeof(*adb->entries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->deadentries,
+ sizeof(*adb->deadentries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entrylocks,
+ sizeof(*adb->entrylocks) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_sd,
+ sizeof(*adb->entry_sd) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_refcnt,
+ sizeof(*adb->entry_refcnt) * adb->nentries);
+
+ /*
+ * Install new resources.
+ */
+ adb->entries = newentries;
+ adb->deadentries = newdeadentries;
+ adb->entrylocks = newentrylocks;
+ adb->entry_sd = newentry_sd;
+ adb->entry_refcnt = newentry_refcnt;
+ adb->nentries = n;
+
+ /*
+ * Only on success do we set adb->growentries_sent to ISC_FALSE.
+ * This will prevent us being continuously being called on error.
+ */
+ adb->growentries_sent = ISC_FALSE;
+ goto done;
+
+ cleanup:
+ if (newentries != NULL)
+ isc_mem_put(adb->mctx, newentries,
+ sizeof(*newentries) * n);
+ if (newdeadentries != NULL)
+ isc_mem_put(adb->mctx, newdeadentries,
+ sizeof(*newdeadentries) * n);
+ if (newentrylocks != NULL)
+ isc_mem_put(adb->mctx, newentrylocks,
+ sizeof(*newentrylocks) * n);
+ if (newentry_sd != NULL)
+ isc_mem_put(adb->mctx, newentry_sd,
+ sizeof(*newentry_sd) * n);
+ if (newentry_refcnt != NULL)
+ isc_mem_put(adb->mctx, newentry_refcnt,
+ sizeof(*newentry_refcnt) * n);
+ done:
+ isc_task_endexclusive(task);
+
+ LOCK(&adb->lock);
+ if (dec_adb_irefcnt(adb))
+ check_exit(adb);
+ UNLOCK(&adb->lock);
+ DP(ISC_LOG_INFO, "adb: grow_entries finished");
+}
+
+static void
+grow_names(isc_task_t *task, isc_event_t *ev) {
+ dns_adb_t *adb;
+ dns_adbname_t *name;
+ dns_adbnamelist_t *newdeadnames = NULL;
+ dns_adbnamelist_t *newnames = NULL;
+ isc_boolean_t *newname_sd = NULL;
+ isc_mutex_t *newnamelocks = NULL;
+ isc_result_t result;
+ unsigned int *newname_refcnt = NULL;
+ unsigned int i, n, bucket;
+
+ adb = ev->ev_arg;
+ INSIST(DNS_ADB_VALID(adb));
+
+ isc_event_free(&ev);
+
+ isc_task_beginexclusive(task);
+
+ i = 0;
+ while (nbuckets[i] != 0 && adb->nnames >= nbuckets[i])
+ i++;
+ if (nbuckets[i] != 0)
+ n = nbuckets[i];
+ else
+ goto done;
+
+ DP(ISC_LOG_INFO, "adb: grow_names to %u starting", n);
+
+ /*
+ * Are we shutting down?
+ */
+ for (i = 0; i < adb->nnames; i++)
+ if (adb->name_sd[i])
+ goto cleanup;
+
+ /*
+ * Grab all the resources we need.
+ */
+ newnames = isc_mem_get(adb->mctx, sizeof(*newnames) * n);
+ newdeadnames = isc_mem_get(adb->mctx, sizeof(*newdeadnames) * n);
+ newnamelocks = isc_mem_get(adb->mctx, sizeof(*newnamelocks) * n);
+ newname_sd = isc_mem_get(adb->mctx, sizeof(*newname_sd) * n);
+ newname_refcnt = isc_mem_get(adb->mctx, sizeof(*newname_refcnt) * n);
+ if (newnames == NULL || newdeadnames == NULL ||
+ newnamelocks == NULL || newname_sd == NULL ||
+ newname_refcnt == NULL)
+ goto cleanup;
+
+ /*
+ * Initialise the new resources.
+ */
+ result = isc_mutexblock_init(newnamelocks, n);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ for (i = 0; i < n; i++) {
+ ISC_LIST_INIT(newnames[i]);
+ ISC_LIST_INIT(newdeadnames[i]);
+ newname_sd[i] = ISC_FALSE;
+ newname_refcnt[i] = 0;
+ adb->irefcnt++;
+ }
+
+ /*
+ * Move names to new arrays.
+ */
+ for (i = 0; i < adb->nnames; i++) {
+ name = ISC_LIST_HEAD(adb->names[i]);
+ while (name != NULL) {
+ ISC_LIST_UNLINK(adb->names[i], name, plink);
+ bucket = dns_name_fullhash(&name->name, ISC_TRUE) % n;
+ name->lock_bucket = bucket;
+ ISC_LIST_APPEND(newnames[bucket], name, plink);
+ INSIST(adb->name_refcnt[i] > 0);
+ adb->name_refcnt[i]--;
+ newname_refcnt[bucket]++;
+ name = ISC_LIST_HEAD(adb->names[i]);
+ }
+ name = ISC_LIST_HEAD(adb->deadnames[i]);
+ while (name != NULL) {
+ ISC_LIST_UNLINK(adb->deadnames[i], name, plink);
+ bucket = dns_name_fullhash(&name->name, ISC_TRUE) % n;
+ name->lock_bucket = bucket;
+ ISC_LIST_APPEND(newdeadnames[bucket], name, plink);
+ INSIST(adb->name_refcnt[i] > 0);
+ adb->name_refcnt[i]--;
+ newname_refcnt[bucket]++;
+ name = ISC_LIST_HEAD(adb->deadnames[i]);
+ }
+ INSIST(adb->name_refcnt[i] == 0);
+ adb->irefcnt--;
+ }
+
+ /*
+ * Cleanup old resources.
+ */
+ DESTROYMUTEXBLOCK(adb->namelocks, adb->nnames);
+ isc_mem_put(adb->mctx, adb->names,
+ sizeof(*adb->names) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->deadnames,
+ sizeof(*adb->deadnames) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->namelocks,
+ sizeof(*adb->namelocks) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_sd,
+ sizeof(*adb->name_sd) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_refcnt,
+ sizeof(*adb->name_refcnt) * adb->nnames);
+
+ /*
+ * Install new resources.
+ */
+ adb->names = newnames;
+ adb->deadnames = newdeadnames;
+ adb->namelocks = newnamelocks;
+ adb->name_sd = newname_sd;
+ adb->name_refcnt = newname_refcnt;
+ adb->nnames = n;
+
+ /*
+ * Only on success do we set adb->grownames_sent to ISC_FALSE.
+ * This will prevent us being continuously being called on error.
+ */
+ adb->grownames_sent = ISC_FALSE;
+ goto done;
+
+ cleanup:
+ if (newnames != NULL)
+ isc_mem_put(adb->mctx, newnames, sizeof(*newnames) * n);
+ if (newdeadnames != NULL)
+ isc_mem_put(adb->mctx, newdeadnames, sizeof(*newdeadnames) * n);
+ if (newnamelocks != NULL)
+ isc_mem_put(adb->mctx, newnamelocks, sizeof(*newnamelocks) * n);
+ if (newname_sd != NULL)
+ isc_mem_put(adb->mctx, newname_sd, sizeof(*newname_sd) * n);
+ if (newname_refcnt != NULL)
+ isc_mem_put(adb->mctx, newname_refcnt,
+ sizeof(*newname_refcnt) * n);
+ done:
+ isc_task_endexclusive(task);
+
+ LOCK(&adb->lock);
+ if (dec_adb_irefcnt(adb))
+ check_exit(adb);
+ UNLOCK(&adb->lock);
+ DP(ISC_LOG_INFO, "adb: grow_names finished");
+}
+
+/*
* Requires the adbname bucket be locked and that no entry buckets be locked.
*
* This code handles A and AAAA rdatasets only.
@@ -836,12 +1152,12 @@ violate_locking_hierarchy(isc_mutex_t *have, isc_mutex_t *want) {
*/
static isc_boolean_t
shutdown_names(dns_adb_t *adb) {
- int bucket;
+ unsigned int bucket;
isc_boolean_t result = ISC_FALSE;
dns_adbname_t *name;
dns_adbname_t *next_name;
- for (bucket = 0; bucket < NBUCKETS; bucket++) {
+ for (bucket = 0; bucket < adb->nnames; bucket++) {
LOCK(&adb->namelocks[bucket]);
adb->name_sd[bucket] = ISC_TRUE;
@@ -881,12 +1197,12 @@ shutdown_names(dns_adb_t *adb) {
*/
static isc_boolean_t
shutdown_entries(dns_adb_t *adb) {
- int bucket;
+ unsigned int bucket;
isc_boolean_t result = ISC_FALSE;
dns_adbentry_t *entry;
dns_adbentry_t *next_entry;
- for (bucket = 0; bucket < NBUCKETS; bucket++) {
+ for (bucket = 0; bucket < adb->nentries; bucket++) {
LOCK(&adb->entrylocks[bucket]);
adb->entry_sd[bucket] = ISC_TRUE;
@@ -1306,6 +1622,16 @@ new_adbname(dns_adb_t *adb, dns_name_t *dnsname) {
ISC_LIST_INIT(name->finds);
ISC_LINK_INIT(name, plink);
+ LOCK(&adb->namescntlock);
+ adb->namescnt++;
+ if (!adb->grownames_sent && adb->namescnt > (adb->nnames * 8)) {
+ isc_event_t *event = &adb->grownames;
+ inc_adb_irefcnt(adb);
+ isc_task_send(adb->task, &event);
+ adb->grownames_sent = ISC_TRUE;
+ }
+ UNLOCK(&adb->namescntlock);
+
return (name);
}
@@ -1329,6 +1655,9 @@ free_adbname(dns_adb_t *adb, dns_adbname_t **name) {
dns_name_free(&n->name, adb->mctx);
isc_mempool_put(adb->nmp, n);
+ LOCK(&adb->namescntlock);
+ adb->namescnt--;
+ UNLOCK(&adb->namescntlock);
}
static inline dns_adbnamehook_t *
@@ -1417,6 +1746,16 @@ new_adbentry(dns_adb_t *adb) {
e->expires = 0;
ISC_LIST_INIT(e->lameinfo);
ISC_LINK_INIT(e, plink);
+ LOCK(&adb->entriescntlock);
+ adb->entriescnt++;
+ if (!adb->growentries_sent &&
+ adb->entriescnt > (adb->nentries * 8)) {
+ isc_event_t *event = &adb->growentries;
+ inc_adb_irefcnt(adb);
+ isc_task_send(adb->task, &event);
+ adb->growentries_sent = ISC_TRUE;
+ }
+ UNLOCK(&adb->entriescntlock);
return (e);
}
@@ -1444,6 +1783,9 @@ free_adbentry(dns_adb_t *adb, dns_adbentry_t **entry) {
}
isc_mempool_put(adb->emp, e);
+ LOCK(&adb->entriescntlock);
+ adb->entriescnt--;
+ UNLOCK(&adb->entriescntlock);
}
static inline dns_adbfind_t *
@@ -1597,7 +1939,7 @@ find_name_and_lock(dns_adb_t *adb, dns_name_t *name,
dns_adbname_t *adbname;
int bucket;
- bucket = dns_name_fullhash(name, ISC_FALSE) % NBUCKETS;
+ bucket = dns_name_fullhash(name, ISC_FALSE) % adb->nnames;
if (*bucketp == DNS_ADB_INVALIDBUCKET) {
LOCK(&adb->namelocks[bucket]);
@@ -1639,7 +1981,7 @@ find_entry_and_lock(dns_adb_t *adb, isc_sockaddr_t *addr, int *bucketp,
dns_adbentry_t *entry, *entry_next;
int bucket;
- bucket = isc_sockaddr_hash(addr, ISC_TRUE) % NBUCKETS;
+ bucket = isc_sockaddr_hash(addr, ISC_TRUE) % adb->nentries;
if (*bucketp == DNS_ADB_INVALIDBUCKET) {
LOCK(&adb->entrylocks[bucket]);
@@ -1992,13 +2334,36 @@ destroy(dns_adb_t *adb) {
isc_mempool_destroy(&adb->aimp);
isc_mempool_destroy(&adb->afmp);
- DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS);
- DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS);
+ DESTROYMUTEXBLOCK(adb->entrylocks, adb->nentries);
+ isc_mem_put(adb->mctx, adb->entries,
+ sizeof(*adb->entries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->deadentries,
+ sizeof(*adb->deadentries) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entrylocks,
+ sizeof(*adb->entrylocks) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_sd,
+ sizeof(*adb->entry_sd) * adb->nentries);
+ isc_mem_put(adb->mctx, adb->entry_refcnt,
+ sizeof(*adb->entry_refcnt) * adb->nentries);
+
+ DESTROYMUTEXBLOCK(adb->namelocks, adb->nnames);
+ isc_mem_put(adb->mctx, adb->names,
+ sizeof(*adb->names) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->deadnames,
+ sizeof(*adb->deadnames) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->namelocks,
+ sizeof(*adb->namelocks) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_sd,
+ sizeof(*adb->name_sd) * adb->nnames);
+ isc_mem_put(adb->mctx, adb->name_refcnt,
+ sizeof(*adb->name_refcnt) * adb->nnames);
DESTROYLOCK(&adb->reflock);
DESTROYLOCK(&adb->lock);
DESTROYLOCK(&adb->mplock);
DESTROYLOCK(&adb->overmemlock);
+ DESTROYLOCK(&adb->entriescntlock);
+ DESTROYLOCK(&adb->namescntlock);
isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t));
}
@@ -2014,7 +2379,7 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
{
dns_adb_t *adb;
isc_result_t result;
- int i;
+ unsigned int i;
REQUIRE(mem != NULL);
REQUIRE(view != NULL);
@@ -2054,6 +2419,30 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
adb->shutting_down = ISC_FALSE;
ISC_LIST_INIT(adb->whenshutdown);
+ adb->nentries = nbuckets[0];
+ adb->entriescnt = 0;
+ adb->entries = NULL;
+ adb->deadentries = NULL;
+ adb->entry_sd = NULL;
+ adb->entry_refcnt = NULL;
+ adb->entrylocks = NULL;
+ ISC_EVENT_INIT(&adb->growentries, sizeof(adb->growentries), 0, NULL,
+ DNS_EVENT_ADBGROWENTRIES, grow_entries, adb,
+ adb, NULL, NULL);
+ adb->growentries_sent = ISC_FALSE;
+
+ adb->nnames = nbuckets[0];
+ adb->namescnt = 0;
+ adb->names = NULL;
+ adb->deadnames = NULL;
+ adb->name_sd = NULL;
+ adb->name_refcnt = NULL;
+ adb->namelocks = NULL;
+ ISC_EVENT_INIT(&adb->grownames, sizeof(adb->grownames), 0, NULL,
+ DNS_EVENT_ADBGROWNAMES, grow_names, adb,
+ adb, NULL, NULL);
+ adb->grownames_sent = ISC_FALSE;
+
isc_mem_attach(mem, &adb->mctx);
result = isc_mutex_init(&adb->lock);
@@ -2072,28 +2461,68 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
if (result != ISC_R_SUCCESS)
goto fail0e;
+ result = isc_mutex_init(&adb->entriescntlock);
+ if (result != ISC_R_SUCCESS)
+ goto fail0f;
+
+ result = isc_mutex_init(&adb->namescntlock);
+ if (result != ISC_R_SUCCESS)
+ goto fail0g;
+
+#define ALLOCENTRY(adb, el) \
+ do { \
+ (adb)->el = isc_mem_get((adb)->mctx, \
+ sizeof(*(adb)->el) * (adb)->nentries); \
+ if ((adb)->el == NULL) { \
+ result = ISC_R_NOMEMORY; \
+ goto fail1; \
+ }\
+ } while (0)
+ ALLOCENTRY(adb, entries);
+ ALLOCENTRY(adb, deadentries);
+ ALLOCENTRY(adb, entrylocks);
+ ALLOCENTRY(adb, entry_sd);
+ ALLOCENTRY(adb, entry_refcnt);
+#undef ALLOCENTRY
+
+#define ALLOCNAME(adb, el) \
+ do { \
+ (adb)->el = isc_mem_get((adb)->mctx, \
+ sizeof(*(adb)->el) * (adb)->nnames); \
+ if ((adb)->el == NULL) { \
+ result = ISC_R_NOMEMORY; \
+ goto fail1; \
+ }\
+ } while (0)
+ ALLOCNAME(adb, names);
+ ALLOCNAME(adb, deadnames);
+ ALLOCNAME(adb, namelocks);
+ ALLOCNAME(adb, name_sd);
+ ALLOCNAME(adb, name_refcnt);
+#undef ALLOCNAME
+
/*
* Initialize the bucket locks for names and elements.
* May as well initialize the list heads, too.
*/
- result = isc_mutexblock_init(adb->namelocks, NBUCKETS);
+ result = isc_mutexblock_init(adb->namelocks, adb->nnames);
if (result != ISC_R_SUCCESS)
goto fail1;
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nnames; i++) {
ISC_LIST_INIT(adb->names[i]);
ISC_LIST_INIT(adb->deadnames[i]);
adb->name_sd[i] = ISC_FALSE;
adb->name_refcnt[i] = 0;
adb->irefcnt++;
}
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nentries; i++) {
ISC_LIST_INIT(adb->entries[i]);
ISC_LIST_INIT(adb->deadentries[i]);
adb->entry_sd[i] = ISC_FALSE;
adb->entry_refcnt[i] = 0;
adb->irefcnt++;
}
- result = isc_mutexblock_init(adb->entrylocks, NBUCKETS);
+ result = isc_mutexblock_init(adb->entrylocks, adb->nentries);
if (result != ISC_R_SUCCESS)
goto fail2;
@@ -2140,12 +2569,42 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
isc_task_detach(&adb->task);
/* clean up entrylocks */
- DESTROYMUTEXBLOCK(adb->entrylocks, NBUCKETS);
+ DESTROYMUTEXBLOCK(adb->entrylocks, adb->nentries);
fail2: /* clean up namelocks */
- DESTROYMUTEXBLOCK(adb->namelocks, NBUCKETS);
+ DESTROYMUTEXBLOCK(adb->namelocks, adb->nnames);
fail1: /* clean up only allocated memory */
+ if (adb->entries != NULL)
+ isc_mem_put(adb->mctx, adb->entries,
+ sizeof(*adb->entries) * adb->nentries);
+ if (adb->deadentries != NULL)
+ isc_mem_put(adb->mctx, adb->deadentries,
+ sizeof(*adb->deadentries) * adb->nentries);
+ if (adb->entrylocks != NULL)
+ isc_mem_put(adb->mctx, adb->entrylocks,
+ sizeof(*adb->entrylocks) * adb->nentries);
+ if (adb->entry_sd != NULL)
+ isc_mem_put(adb->mctx, adb->entry_sd,
+ sizeof(*adb->entry_sd) * adb->nentries);
+ if (adb->entry_refcnt != NULL)
+ isc_mem_put(adb->mctx, adb->entry_refcnt,
+ sizeof(*adb->entry_refcnt) * adb->nentries);
+ if (adb->names != NULL)
+ isc_mem_put(adb->mctx, adb->names,
+ sizeof(*adb->names) * adb->nnames);
+ if (adb->deadnames != NULL)
+ isc_mem_put(adb->mctx, adb->deadnames,
+ sizeof(*adb->deadnames) * adb->nnames);
+ if (adb->namelocks != NULL)
+ isc_mem_put(adb->mctx, adb->namelocks,
+ sizeof(*adb->namelocks) * adb->nnames);
+ if (adb->name_sd != NULL)
+ isc_mem_put(adb->mctx, adb->name_sd,
+ sizeof(*adb->name_sd) * adb->nnames);
+ if (adb->name_refcnt != NULL)
+ isc_mem_put(adb->mctx, adb->name_refcnt,
+ sizeof(*adb->name_refcnt) * adb->nnames);
if (adb->nmp != NULL)
isc_mempool_destroy(&adb->nmp);
if (adb->nhmp != NULL)
@@ -2161,6 +2620,10 @@ dns_adb_create(isc_mem_t *mem, dns_view_t *view, isc_timermgr_t *timermgr,
if (adb->afmp != NULL)
isc_mempool_destroy(&adb->afmp);
+ DESTROYLOCK(&adb->namescntlock);
+ fail0g:
+ DESTROYLOCK(&adb->entriescntlock);
+ fail0f:
DESTROYLOCK(&adb->overmemlock);
fail0e:
DESTROYLOCK(&adb->reflock);
@@ -2728,7 +3191,7 @@ dns_adb_cancelfind(dns_adbfind_t *find) {
void
dns_adb_dump(dns_adb_t *adb, FILE *f) {
- int i;
+ unsigned int i;
isc_stdtime_t now;
REQUIRE(DNS_ADB_VALID(adb));
@@ -2744,9 +3207,9 @@ dns_adb_dump(dns_adb_t *adb, FILE *f) {
LOCK(&adb->lock);
isc_stdtime_get(&now);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
RUNTIME_CHECK(cleanup_names(adb, i, now) == ISC_FALSE);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
RUNTIME_CHECK(cleanup_entries(adb, i, now) == ISC_FALSE);
dump_adb(adb, f, ISC_FALSE, now);
@@ -2762,7 +3225,7 @@ dump_ttl(FILE *f, const char *legend, isc_stdtime_t value, isc_stdtime_t now) {
static void
dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
- int i;
+ unsigned int i;
dns_adbname_t *name;
dns_adbentry_t *entry;
@@ -2772,15 +3235,15 @@ dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
adb, adb->erefcnt, adb->irefcnt,
isc_mempool_getallocated(adb->nhmp));
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
LOCK(&adb->namelocks[i]);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
LOCK(&adb->entrylocks[i]);
/*
* Dump the names
*/
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nnames; i++) {
name = ISC_LIST_HEAD(adb->names[i]);
if (name == NULL)
continue;
@@ -2824,7 +3287,7 @@ dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
fprintf(f, ";\n; Unassociated entries\n;\n");
- for (i = 0; i < NBUCKETS; i++) {
+ for (i = 0; i < adb->nentries; i++) {
entry = ISC_LIST_HEAD(adb->entries[i]);
while (entry != NULL) {
if (entry->refcnt == 0)
@@ -2836,9 +3299,9 @@ dump_adb(dns_adb_t *adb, FILE *f, isc_boolean_t debug, isc_stdtime_t now) {
/*
* Unlock everything
*/
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
UNLOCK(&adb->entrylocks[i]);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
UNLOCK(&adb->namelocks[i]);
}
@@ -2999,10 +3462,20 @@ dbfind_name(dns_adbname_t *adbname, isc_stdtime_t now, dns_rdatatype_t rdtype)
else
adbname->fetch6_err = FIND_ERR_UNEXPECTED;
- result = dns_view_find(adb->view, &adbname->name, rdtype, now,
- NAME_GLUEOK(adbname) ? DNS_DBFIND_GLUEOK : 0,
- ISC_TF(NAME_HINTOK(adbname)),
- NULL, NULL, fname, &rdataset, NULL);
+ /*
+ * We need to specify whether to search static-stub zones (if
+ * configured) depending on whether this is a "start at zone" lookup,
+ * i.e., whether it's a "bailiwick" glue. If it's bailiwick (in which
+ * case NAME_STARTATZONE is set) we need to stop the search at any
+ * matching static-stub zone without looking into the cache to honor
+ * the configuration on which server we should send queries to.
+ */
+ result = dns_view_find2(adb->view, &adbname->name, rdtype, now,
+ NAME_GLUEOK(adbname) ? DNS_DBFIND_GLUEOK : 0,
+ ISC_TF(NAME_HINTOK(adbname)),
+ (adbname->flags & NAME_STARTATZONE) != 0 ?
+ ISC_TRUE : ISC_FALSE,
+ NULL, NULL, fname, &rdataset, NULL);
/* XXXVIX this switch statement is too sparse to gen a jump table. */
switch (result) {
@@ -3557,9 +4030,9 @@ dns_adb_flush(dns_adb_t *adb) {
/*
* Call our cleanup routines.
*/
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nnames; i++)
RUNTIME_CHECK(cleanup_names(adb, i, INT_MAX) == ISC_FALSE);
- for (i = 0; i < NBUCKETS; i++)
+ for (i = 0; i < adb->nentries; i++)
RUNTIME_CHECK(cleanup_entries(adb, i, INT_MAX) == ISC_FALSE);
#ifdef DUMP_ADB_AFTER_CLEANING
@@ -3578,7 +4051,7 @@ dns_adb_flushname(dns_adb_t *adb, dns_name_t *name) {
INSIST(DNS_ADB_VALID(adb));
LOCK(&adb->lock);
- bucket = dns_name_hash(name, ISC_FALSE) % NBUCKETS;
+ bucket = dns_name_hash(name, ISC_FALSE) % adb->nnames;
LOCK(&adb->namelocks[bucket]);
adbname = ISC_LIST_HEAD(adb->names[bucket]);
while (adbname != NULL) {
diff --git a/contrib/bind9/lib/dns/api b/contrib/bind9/lib/dns/api
index a04d4bc..9bac060 100644
--- a/contrib/bind9/lib/dns/api
+++ b/contrib/bind9/lib/dns/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 59
-LIBREVISION = 4
+LIBINTERFACE = 82
+LIBREVISION = 3
LIBAGE = 1
diff --git a/contrib/bind9/lib/dns/byaddr.c b/contrib/bind9/lib/dns/byaddr.c
index 96b9f38..2fd61a2 100644
--- a/contrib/bind9/lib/dns/byaddr.c
+++ b/contrib/bind9/lib/dns/byaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: byaddr.c,v 1.39 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: byaddr.c,v 1.41 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -43,25 +43,6 @@
* XXXRTH We could use a static event...
*/
-struct dns_byaddr {
- /* Unlocked. */
- unsigned int magic;
- isc_mem_t * mctx;
- isc_mutex_t lock;
- dns_fixedname_t name;
- /* Locked by lock. */
- unsigned int options;
- dns_lookup_t * lookup;
- isc_task_t * task;
- dns_byaddrevent_t * event;
- isc_boolean_t canceled;
-};
-
-#define BYADDR_MAGIC ISC_MAGIC('B', 'y', 'A', 'd')
-#define VALID_BYADDR(b) ISC_MAGIC_VALID(b, BYADDR_MAGIC)
-
-#define MAX_RESTARTS 16
-
static char hex_digits[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
@@ -125,10 +106,29 @@ dns_byaddr_createptrname2(isc_netaddr_t *address, unsigned int options,
len = (unsigned int)strlen(textname);
isc_buffer_init(&buffer, textname, len);
isc_buffer_add(&buffer, len);
- return (dns_name_fromtext(name, &buffer, dns_rootname,
- ISC_FALSE, NULL));
+ return (dns_name_fromtext(name, &buffer, dns_rootname, 0, NULL));
}
+#ifdef BIND9
+struct dns_byaddr {
+ /* Unlocked. */
+ unsigned int magic;
+ isc_mem_t * mctx;
+ isc_mutex_t lock;
+ dns_fixedname_t name;
+ /* Locked by lock. */
+ unsigned int options;
+ dns_lookup_t * lookup;
+ isc_task_t * task;
+ dns_byaddrevent_t * event;
+ isc_boolean_t canceled;
+};
+
+#define BYADDR_MAGIC ISC_MAGIC('B', 'y', 'A', 'd')
+#define VALID_BYADDR(b) ISC_MAGIC_VALID(b, BYADDR_MAGIC)
+
+#define MAX_RESTARTS 16
+
static inline isc_result_t
copy_ptr_targets(dns_byaddr_t *byaddr, dns_rdataset_t *rdataset) {
isc_result_t result;
@@ -314,3 +314,4 @@ dns_byaddr_destroy(dns_byaddr_t **byaddrp) {
*byaddrp = NULL;
}
+#endif /* BIND9 */
diff --git a/contrib/bind9/lib/dns/cache.c b/contrib/bind9/lib/dns/cache.c
index 28ead66..bf93da2 100644
--- a/contrib/bind9/lib/dns/cache.c
+++ b/contrib/bind9/lib/dns/cache.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cache.c,v 1.80.50.3 2009-05-06 23:34:30 jinmei Exp $ */
+/* $Id: cache.c,v 1.87 2009-11-12 23:43:02 each Exp $ */
/*! \file */
@@ -122,6 +122,7 @@ struct dns_cache {
isc_mutex_t lock;
isc_mutex_t filelock;
isc_mem_t *mctx;
+ char *name;
/* Locked by 'lock'. */
int references;
@@ -132,6 +133,7 @@ struct dns_cache {
char *db_type;
int db_argc;
char **db_argv;
+ isc_uint32_t size;
/* Locked by 'filelock'. */
char *filename;
@@ -171,6 +173,16 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
const char *db_type, unsigned int db_argc, char **db_argv,
dns_cache_t **cachep)
{
+ return (dns_cache_create2(mctx, taskmgr, timermgr, rdclass, "",
+ db_type, db_argc, db_argv, cachep));
+}
+
+isc_result_t
+dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
+ isc_timermgr_t *timermgr, dns_rdataclass_t rdclass,
+ const char *cachename, const char *db_type,
+ unsigned int db_argc, char **db_argv, dns_cache_t **cachep)
+{
isc_result_t result;
dns_cache_t *cache;
int i;
@@ -179,6 +191,7 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
REQUIRE(cachep != NULL);
REQUIRE(*cachep == NULL);
REQUIRE(mctx != NULL);
+ REQUIRE(cachename != NULL);
cache = isc_mem_get(mctx, sizeof(*cache));
if (cache == NULL)
@@ -187,6 +200,15 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
cache->mctx = NULL;
isc_mem_attach(mctx, &cache->mctx);
+ cache->name = NULL;
+ if (cachename != NULL) {
+ cache->name = isc_mem_strdup(mctx, cachename);
+ if (cache->name == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup_mem;
+ }
+ }
+
result = isc_mutex_init(&cache->lock);
if (result != ISC_R_SUCCESS)
goto cleanup_mem;
@@ -275,6 +297,8 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
cleanup_lock:
DESTROYLOCK(&cache->lock);
cleanup_mem:
+ if (cache->name != NULL)
+ isc_mem_free(mctx, cache->name);
isc_mem_put(mctx, cache, sizeof(*cache));
isc_mem_detach(&mctx);
return (result);
@@ -323,6 +347,9 @@ cache_free(dns_cache_t *cache) {
if (cache->db_type != NULL)
isc_mem_free(cache->mctx, cache->db_type);
+ if (cache->name != NULL)
+ isc_mem_free(cache->mctx, cache->name);
+
DESTROYLOCK(&cache->lock);
DESTROYLOCK(&cache->filelock);
cache->magic = 0;
@@ -423,6 +450,7 @@ dns_cache_setfilename(dns_cache_t *cache, const char *filename) {
return (ISC_R_SUCCESS);
}
+#ifdef BIND9
isc_result_t
dns_cache_load(dns_cache_t *cache) {
isc_result_t result;
@@ -438,22 +466,29 @@ dns_cache_load(dns_cache_t *cache) {
return (result);
}
+#endif /* BIND9 */
isc_result_t
dns_cache_dump(dns_cache_t *cache) {
+#ifdef BIND9
isc_result_t result;
+#endif
REQUIRE(VALID_CACHE(cache));
if (cache->filename == NULL)
return (ISC_R_SUCCESS);
+#ifdef BIND9
LOCK(&cache->filelock);
result = dns_master_dump(cache->mctx, cache->db, NULL,
&dns_master_style_cache, cache->filename);
UNLOCK(&cache->filelock);
-
return (result);
+#else
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
+
}
void
@@ -493,6 +528,26 @@ dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int t) {
UNLOCK(&cache->lock);
}
+unsigned int
+dns_cache_getcleaninginterval(dns_cache_t *cache) {
+ unsigned int t;
+
+ REQUIRE(VALID_CACHE(cache));
+
+ LOCK(&cache->lock);
+ t = cache->cleaner.cleaning_interval;
+ UNLOCK(&cache->lock);
+
+ return (t);
+}
+
+const char *
+dns_cache_getname(dns_cache_t *cache) {
+ REQUIRE(VALID_CACHE(cache));
+
+ return (cache->name);
+}
+
/*
* Initialize the cache cleaner object at *cleaner.
* Space for the object must be allocated by the caller.
@@ -519,6 +574,7 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
cleaner->cleaning_timer = NULL;
cleaner->resched_event = NULL;
cleaner->overmem_event = NULL;
+ cleaner->cleaning_interval = 0; /* Initially turned off. */
result = dns_db_createiterator(cleaner->cache->db, ISC_FALSE,
&cleaner->iterator);
@@ -547,7 +603,6 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
goto cleanup;
}
- cleaner->cleaning_interval = 0; /* Initially turned off. */
result = isc_timer_create(timermgr, isc_timertype_inactive,
NULL, NULL, cleaner->task,
cleaning_timer_action, cleaner,
@@ -949,6 +1004,10 @@ dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
if (size != 0 && size < DNS_CACHE_MINSIZE)
size = DNS_CACHE_MINSIZE;
+ LOCK(&cache->lock);
+ cache->size = size;
+ UNLOCK(&cache->lock);
+
hiwater = size - (size >> 3); /* Approximately 7/8ths. */
lowater = size - (size >> 2); /* Approximately 3/4ths. */
@@ -972,6 +1031,19 @@ dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater);
}
+isc_uint32_t
+dns_cache_getcachesize(dns_cache_t *cache) {
+ isc_uint32_t size;
+
+ REQUIRE(VALID_CACHE(cache));
+
+ LOCK(&cache->lock);
+ size = cache->size;
+ UNLOCK(&cache->lock);
+
+ return (size);
+}
+
/*
* The cleaner task is shutting down; do the necessary cleanup.
*/
diff --git a/contrib/bind9/lib/dns/client.c b/contrib/bind9/lib/dns/client.c
new file mode 100644
index 0000000..e55ea1f
--- /dev/null
+++ b/contrib/bind9/lib/dns/client.c
@@ -0,0 +1,3019 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: client.c,v 1.12 2010-12-03 12:03:22 marka Exp $ */
+
+#include <config.h>
+
+#include <stddef.h>
+
+#include <isc/app.h>
+#include <isc/mem.h>
+#include <isc/mutex.h>
+#include <isc/sockaddr.h>
+#include <isc/socket.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/adb.h>
+#include <dns/client.h>
+#include <dns/db.h>
+#include <dns/dispatch.h>
+#include <dns/events.h>
+#include <dns/forward.h>
+#include <dns/keytable.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdatalist.h>
+#include <dns/rdataset.h>
+#include <dns/rdatatype.h>
+#include <dns/rdatasetiter.h>
+#include <dns/rdatastruct.h>
+#include <dns/request.h>
+#include <dns/resolver.h>
+#include <dns/result.h>
+#include <dns/tsec.h>
+#include <dns/tsig.h>
+#include <dns/view.h>
+
+#include <dst/dst.h>
+
+#define DNS_CLIENT_MAGIC ISC_MAGIC('D', 'N', 'S', 'c')
+#define DNS_CLIENT_VALID(c) ISC_MAGIC_VALID(c, DNS_CLIENT_MAGIC)
+
+#define RCTX_MAGIC ISC_MAGIC('R', 'c', 't', 'x')
+#define RCTX_VALID(c) ISC_MAGIC_VALID(c, RCTX_MAGIC)
+
+#define REQCTX_MAGIC ISC_MAGIC('R', 'q', 'c', 'x')
+#define REQCTX_VALID(c) ISC_MAGIC_VALID(c, REQCTX_MAGIC)
+
+#define UCTX_MAGIC ISC_MAGIC('U', 'c', 't', 'x')
+#define UCTX_VALID(c) ISC_MAGIC_VALID(c, UCTX_MAGIC)
+
+#define MAX_RESTARTS 16
+
+/*%
+ * DNS client object
+ */
+struct dns_client {
+ /* Unlocked */
+ unsigned int magic;
+ unsigned int attributes;
+ isc_mutex_t lock;
+ isc_mem_t *mctx;
+ isc_appctx_t *actx;
+ isc_taskmgr_t *taskmgr;
+ isc_task_t *task;
+ isc_socketmgr_t *socketmgr;
+ isc_timermgr_t *timermgr;
+ dns_dispatchmgr_t *dispatchmgr;
+ dns_dispatch_t *dispatchv4;
+ dns_dispatch_t *dispatchv6;
+
+ unsigned int update_timeout;
+ unsigned int update_udptimeout;
+ unsigned int update_udpretries;
+ unsigned int find_timeout;
+ unsigned int find_udpretries;
+
+ /* Locked */
+ unsigned int references;
+ dns_viewlist_t viewlist;
+ ISC_LIST(struct resctx) resctxs;
+ ISC_LIST(struct reqctx) reqctxs;
+ ISC_LIST(struct updatectx) updatectxs;
+};
+
+/*%
+ * Timeout/retry constants for dynamic update borrowed from nsupdate
+ */
+#define DEF_UPDATE_TIMEOUT 300
+#define MIN_UPDATE_TIMEOUT 30
+#define DEF_UPDATE_UDPTIMEOUT 3
+#define DEF_UPDATE_UDPRETRIES 3
+
+#define DEF_FIND_TIMEOUT 5
+#define DEF_FIND_UDPRETRIES 3
+
+#define DNS_CLIENTATTR_OWNCTX 0x01
+
+#define DNS_CLIENTVIEW_NAME "dnsclient"
+
+/*%
+ * Internal state for a single name resolution procedure
+ */
+typedef struct resctx {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_client_t *client;
+ isc_boolean_t want_dnssec;
+
+ /* Locked */
+ ISC_LINK(struct resctx) link;
+ isc_task_t *task;
+ dns_view_t *view;
+ unsigned int restarts;
+ dns_fixedname_t name;
+ dns_rdatatype_t type;
+ dns_fetch_t *fetch;
+ dns_namelist_t namelist;
+ isc_result_t result;
+ dns_clientresevent_t *event;
+ isc_boolean_t canceled;
+ dns_rdataset_t *rdataset;
+ dns_rdataset_t *sigrdataset;
+} resctx_t;
+
+/*%
+ * Argument of an internal event for synchronous name resolution.
+ */
+typedef struct resarg {
+ /* Unlocked */
+ isc_appctx_t *actx;
+ dns_client_t *client;
+ isc_mutex_t lock;
+
+ /* Locked */
+ isc_result_t result;
+ isc_result_t vresult;
+ dns_namelist_t *namelist;
+ dns_clientrestrans_t *trans;
+ isc_boolean_t canceled;
+} resarg_t;
+
+/*%
+ * Internal state for a single DNS request
+ */
+typedef struct reqctx {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_client_t *client;
+ unsigned int parseoptions;
+
+ /* Locked */
+ ISC_LINK(struct reqctx) link;
+ isc_boolean_t canceled;
+ dns_tsigkey_t *tsigkey;
+ dns_request_t *request;
+ dns_clientreqevent_t *event;
+} reqctx_t;
+
+/*%
+ * Argument of an internal event for synchronous DNS request.
+ */
+typedef struct reqarg {
+ /* Unlocked */
+ isc_appctx_t *actx;
+ dns_client_t *client;
+ isc_mutex_t lock;
+
+ /* Locked */
+ isc_result_t result;
+ dns_clientreqtrans_t *trans;
+ isc_boolean_t canceled;
+} reqarg_t;
+
+/*%
+ * Argument of an internal event for synchronous name resolution.
+ */
+typedef struct updatearg {
+ /* Unlocked */
+ isc_appctx_t *actx;
+ dns_client_t *client;
+ isc_mutex_t lock;
+
+ /* Locked */
+ isc_result_t result;
+ dns_clientupdatetrans_t *trans;
+ isc_boolean_t canceled;
+} updatearg_t;
+
+/*%
+ * Internal state for a single dynamic update procedure
+ */
+typedef struct updatectx {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_client_t *client;
+
+ /* Locked */
+ dns_request_t *updatereq;
+ dns_request_t *soareq;
+ dns_clientrestrans_t *restrans;
+ dns_clientrestrans_t *restrans2;
+ isc_boolean_t canceled;
+
+ /* Task Locked */
+ ISC_LINK(struct updatectx) link;
+ dns_clientupdatestate_t state;
+ dns_rdataclass_t rdclass;
+ dns_view_t *view;
+ dns_message_t *updatemsg;
+ dns_message_t *soaquery;
+ dns_clientupdateevent_t *event;
+ dns_tsigkey_t *tsigkey;
+ dst_key_t *sig0key;
+ dns_name_t *firstname;
+ dns_name_t soaqname;
+ dns_fixedname_t zonefname;
+ dns_name_t *zonename;
+ isc_sockaddrlist_t servers;
+ unsigned int nservers;
+ isc_sockaddr_t *currentserver;
+ struct updatectx *bp4;
+ struct updatectx *bp6;
+} updatectx_t;
+
+static isc_result_t request_soa(updatectx_t *uctx);
+static void client_resfind(resctx_t *rctx, dns_fetchevent_t *event);
+static isc_result_t send_update(updatectx_t *uctx);
+
+static isc_result_t
+getudpdispatch(int family, dns_dispatchmgr_t *dispatchmgr,
+ isc_socketmgr_t *socketmgr, isc_taskmgr_t *taskmgr,
+ isc_boolean_t is_shared, dns_dispatch_t **dispp)
+{
+ unsigned int attrs, attrmask;
+ isc_sockaddr_t sa;
+ dns_dispatch_t *disp;
+ unsigned buffersize, maxbuffers, maxrequests, buckets, increment;
+ isc_result_t result;
+
+ attrs = 0;
+ attrs |= DNS_DISPATCHATTR_UDP;
+ switch (family) {
+ case AF_INET:
+ attrs |= DNS_DISPATCHATTR_IPV4;
+ break;
+ case AF_INET6:
+ attrs |= DNS_DISPATCHATTR_IPV6;
+ break;
+ default:
+ INSIST(0);
+ }
+ attrmask = 0;
+ attrmask |= DNS_DISPATCHATTR_UDP;
+ attrmask |= DNS_DISPATCHATTR_TCP;
+ attrmask |= DNS_DISPATCHATTR_IPV4;
+ attrmask |= DNS_DISPATCHATTR_IPV6;
+
+ isc_sockaddr_anyofpf(&sa, family);
+
+ buffersize = 4096;
+ maxbuffers = is_shared ? 1000 : 8;
+ maxrequests = 32768;
+ buckets = is_shared ? 16411 : 3;
+ increment = is_shared ? 16433 : 5;
+
+ disp = NULL;
+ result = dns_dispatch_getudp(dispatchmgr, socketmgr,
+ taskmgr, &sa,
+ buffersize, maxbuffers, maxrequests,
+ buckets, increment,
+ attrs, attrmask, &disp);
+ if (result == ISC_R_SUCCESS)
+ *dispp = disp;
+
+ return (result);
+}
+
+static isc_result_t
+dns_client_createview(isc_mem_t *mctx, dns_rdataclass_t rdclass,
+ unsigned int options, isc_taskmgr_t *taskmgr,
+ unsigned int ntasks, isc_socketmgr_t *socketmgr,
+ isc_timermgr_t *timermgr, dns_dispatchmgr_t *dispatchmgr,
+ dns_dispatch_t *dispatchv4, dns_dispatch_t *dispatchv6,
+ dns_view_t **viewp)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+ const char *dbtype;
+
+ result = dns_view_create(mctx, rdclass, DNS_CLIENTVIEW_NAME, &view);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /* Initialize view security roots */
+ result = dns_view_initsecroots(view, mctx);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ return (result);
+ }
+
+ result = dns_view_createresolver(view, taskmgr, ntasks, socketmgr,
+ timermgr, 0, dispatchmgr,
+ dispatchv4, dispatchv6);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ return (result);
+ }
+
+ /*
+ * Set cache DB.
+ * XXX: it may be better if specific DB implementations can be
+ * specified via some configuration knob.
+ */
+ if ((options & DNS_CLIENTCREATEOPT_USECACHE) != 0)
+ dbtype = "rbt";
+ else
+ dbtype = "ecdb";
+ result = dns_db_create(mctx, dbtype, dns_rootname, dns_dbtype_cache,
+ rdclass, 0, NULL, &view->cachedb);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ return (result);
+ }
+
+ *viewp = view;
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_client_create(dns_client_t **clientp, unsigned int options) {
+ isc_result_t result;
+ isc_mem_t *mctx = NULL;
+ isc_appctx_t *actx = NULL;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_appctx_create(mctx, &actx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_app_ctxstart(actx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_taskmgr_createinctx(mctx, actx, 1, 0, &taskmgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_socketmgr_createinctx(mctx, actx, &socketmgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = isc_timermgr_createinctx(mctx, actx, &timermgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr,
+ options, clientp);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ (*clientp)->attributes |= DNS_CLIENTATTR_OWNCTX;
+
+ /* client has its own reference to mctx, so we can detach it here */
+ isc_mem_detach(&mctx);
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (taskmgr != NULL)
+ isc_taskmgr_destroy(&taskmgr);
+ if (timermgr != NULL)
+ isc_timermgr_destroy(&timermgr);
+ if (socketmgr != NULL)
+ isc_socketmgr_destroy(&socketmgr);
+ if (actx != NULL)
+ isc_appctx_destroy(&actx);
+ isc_mem_detach(&mctx);
+
+ return (result);
+}
+
+isc_result_t
+dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
+ isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
+ unsigned int options, dns_client_t **clientp)
+{
+ dns_client_t *client;
+ isc_result_t result;
+ dns_dispatchmgr_t *dispatchmgr = NULL;
+ dns_dispatch_t *dispatchv4 = NULL;
+ dns_dispatch_t *dispatchv6 = NULL;
+ dns_view_t *view = NULL;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(taskmgr != NULL);
+ REQUIRE(timermgr != NULL);
+ REQUIRE(socketmgr != NULL);
+ REQUIRE(clientp != NULL && *clientp == NULL);
+
+ client = isc_mem_get(mctx, sizeof(*client));
+ if (client == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&client->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, client, sizeof(*client));
+ return (result);
+ }
+
+ client->actx = actx;
+ client->taskmgr = taskmgr;
+ client->socketmgr = socketmgr;
+ client->timermgr = timermgr;
+
+ client->task = NULL;
+ result = isc_task_create(client->taskmgr, 0, &client->task);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_dispatchmgr_create(mctx, NULL, &dispatchmgr);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ client->dispatchmgr = dispatchmgr;
+
+ /* TODO: whether to use dispatch v4 or v6 should be configurable */
+ client->dispatchv4 = NULL;
+ client->dispatchv6 = NULL;
+ result = getudpdispatch(AF_INET, dispatchmgr, socketmgr,
+ taskmgr, ISC_TRUE, &dispatchv4);
+ if (result == ISC_R_SUCCESS)
+ client->dispatchv4 = dispatchv4;
+ result = getudpdispatch(AF_INET6, dispatchmgr, socketmgr,
+ taskmgr, ISC_TRUE, &dispatchv6);
+ if (result == ISC_R_SUCCESS)
+ client->dispatchv6 = dispatchv6;
+
+ /* We need at least one of the dispatchers */
+ if (dispatchv4 == NULL && dispatchv6 == NULL) {
+ INSIST(result != ISC_R_SUCCESS);
+ goto cleanup;
+ }
+
+ /* Create the default view for class IN */
+ result = dns_client_createview(mctx, dns_rdataclass_in, options,
+ taskmgr, 31, socketmgr, timermgr,
+ dispatchmgr, dispatchv4, dispatchv6,
+ &view);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ ISC_LIST_INIT(client->viewlist);
+ ISC_LIST_APPEND(client->viewlist, view, link);
+
+ dns_view_freeze(view); /* too early? */
+
+ ISC_LIST_INIT(client->resctxs);
+ ISC_LIST_INIT(client->reqctxs);
+ ISC_LIST_INIT(client->updatectxs);
+
+ client->mctx = NULL;
+ isc_mem_attach(mctx, &client->mctx);
+
+ client->update_timeout = DEF_UPDATE_TIMEOUT;
+ client->update_udptimeout = DEF_UPDATE_UDPTIMEOUT;
+ client->update_udpretries = DEF_UPDATE_UDPRETRIES;
+ client->find_timeout = DEF_FIND_TIMEOUT;
+ client->find_udpretries = DEF_FIND_UDPRETRIES;
+
+ client->references = 1;
+ client->magic = DNS_CLIENT_MAGIC;
+
+ *clientp = client;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (dispatchv4 != NULL)
+ dns_dispatch_detach(&dispatchv4);
+ if (dispatchv6 != NULL)
+ dns_dispatch_detach(&dispatchv6);
+ if (dispatchmgr != NULL)
+ dns_dispatchmgr_destroy(&dispatchmgr);
+ if (client->task != NULL)
+ isc_task_detach(&client->task);
+ isc_mem_put(mctx, client, sizeof(*client));
+
+ return (result);
+}
+
+static void
+destroyclient(dns_client_t **clientp) {
+ dns_client_t *client = *clientp;
+ dns_view_t *view;
+
+ while ((view = ISC_LIST_HEAD(client->viewlist)) != NULL) {
+ ISC_LIST_UNLINK(client->viewlist, view, link);
+ dns_view_detach(&view);
+ }
+
+ if (client->dispatchv4 != NULL)
+ dns_dispatch_detach(&client->dispatchv4);
+ if (client->dispatchv6 != NULL)
+ dns_dispatch_detach(&client->dispatchv6);
+
+ dns_dispatchmgr_destroy(&client->dispatchmgr);
+
+ isc_task_detach(&client->task);
+
+ /*
+ * If the client has created its own running environments,
+ * destroy them.
+ */
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) != 0) {
+ isc_taskmgr_destroy(&client->taskmgr);
+ isc_timermgr_destroy(&client->timermgr);
+ isc_socketmgr_destroy(&client->socketmgr);
+
+ isc_app_ctxfinish(client->actx);
+ isc_appctx_destroy(&client->actx);
+ }
+
+ DESTROYLOCK(&client->lock);
+ client->magic = 0;
+
+ isc_mem_putanddetach(&client->mctx, client, sizeof(*client));
+
+ *clientp = NULL;
+}
+
+void
+dns_client_destroy(dns_client_t **clientp) {
+ dns_client_t *client;
+ isc_boolean_t destroyok = ISC_FALSE;
+
+ REQUIRE(clientp != NULL);
+ client = *clientp;
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ LOCK(&client->lock);
+ client->references--;
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs)) {
+ destroyok = ISC_TRUE;
+ }
+ UNLOCK(&client->lock);
+
+ if (destroyok)
+ destroyclient(&client);
+
+ *clientp = NULL;
+}
+
+isc_result_t
+dns_client_setservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace, isc_sockaddrlist_t *addrs)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(addrs != NULL);
+
+ if (namespace == NULL)
+ namespace = dns_rootname;
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ if (result != ISC_R_SUCCESS) {
+ UNLOCK(&client->lock);
+ return (result);
+ }
+ UNLOCK(&client->lock);
+
+ result = dns_fwdtable_add(view->fwdtable, namespace, addrs,
+ dns_fwdpolicy_only);
+
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+isc_result_t
+dns_client_clearservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ if (namespace == NULL)
+ namespace = dns_rootname;
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ if (result != ISC_R_SUCCESS) {
+ UNLOCK(&client->lock);
+ return (result);
+ }
+ UNLOCK(&client->lock);
+
+ result = dns_fwdtable_delete(view->fwdtable, namespace);
+
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+static isc_result_t
+getrdataset(isc_mem_t *mctx, dns_rdataset_t **rdatasetp) {
+ dns_rdataset_t *rdataset;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(rdatasetp != NULL && *rdatasetp == NULL);
+
+ rdataset = isc_mem_get(mctx, sizeof(*rdataset));
+ if (rdataset == NULL)
+ return (ISC_R_NOMEMORY);
+
+ dns_rdataset_init(rdataset);
+
+ *rdatasetp = rdataset;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+putrdataset(isc_mem_t *mctx, dns_rdataset_t **rdatasetp) {
+ dns_rdataset_t *rdataset;
+
+ REQUIRE(rdatasetp != NULL);
+ rdataset = *rdatasetp;
+ REQUIRE(rdataset != NULL);
+
+ if (dns_rdataset_isassociated(rdataset))
+ dns_rdataset_disassociate(rdataset);
+
+ isc_mem_put(mctx, rdataset, sizeof(*rdataset));
+
+ *rdatasetp = NULL;
+}
+
+static void
+fetch_done(isc_task_t *task, isc_event_t *event) {
+ resctx_t *rctx = event->ev_arg;
+ dns_fetchevent_t *fevent;
+
+ REQUIRE(event->ev_type == DNS_EVENT_FETCHDONE);
+ REQUIRE(RCTX_VALID(rctx));
+ REQUIRE(rctx->task == task);
+ fevent = (dns_fetchevent_t *)event;
+
+ client_resfind(rctx, fevent);
+}
+
+static inline isc_result_t
+start_fetch(resctx_t *rctx) {
+ isc_result_t result;
+
+ /*
+ * The caller must be holding the rctx's lock.
+ */
+
+ REQUIRE(rctx->fetch == NULL);
+
+ result = dns_resolver_createfetch(rctx->view->resolver,
+ dns_fixedname_name(&rctx->name),
+ rctx->type,
+ NULL, NULL, NULL, 0,
+ rctx->task, fetch_done, rctx,
+ rctx->rdataset,
+ rctx->sigrdataset,
+ &rctx->fetch);
+
+ return (result);
+}
+
+static isc_result_t
+view_find(resctx_t *rctx, dns_db_t **dbp, dns_dbnode_t **nodep,
+ dns_name_t *foundname)
+{
+ isc_result_t result;
+ dns_name_t *name = dns_fixedname_name(&rctx->name);
+ dns_rdatatype_t type;
+
+ if (rctx->type == dns_rdatatype_rrsig)
+ type = dns_rdatatype_any;
+ else
+ type = rctx->type;
+
+ result = dns_view_find(rctx->view, name, type, 0, 0, ISC_FALSE,
+ dbp, nodep, foundname, rctx->rdataset,
+ rctx->sigrdataset);
+
+ return (result);
+}
+
+static void
+client_resfind(resctx_t *rctx, dns_fetchevent_t *event) {
+ isc_mem_t *mctx;
+ isc_result_t result, tresult;
+ isc_result_t vresult = ISC_R_SUCCESS;
+ isc_boolean_t want_restart;
+ isc_boolean_t send_event = ISC_FALSE;
+ dns_name_t *name, *prefix;
+ dns_fixedname_t foundname, fixed;
+ dns_rdataset_t *trdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned int nlabels;
+ int order;
+ dns_namereln_t namereln;
+ dns_rdata_cname_t cname;
+ dns_rdata_dname_t dname;
+
+ REQUIRE(RCTX_VALID(rctx));
+
+ LOCK(&rctx->lock);
+
+ mctx = rctx->view->mctx;
+
+ result = ISC_R_SUCCESS;
+ name = dns_fixedname_name(&rctx->name);
+
+ do {
+ dns_name_t *fname = NULL;
+ dns_name_t *ansname = NULL;
+ dns_db_t *db = NULL;
+ dns_dbnode_t *node = NULL;
+
+ rctx->restarts++;
+ want_restart = ISC_FALSE;
+
+ if (event == NULL && !rctx->canceled) {
+ dns_fixedname_init(&foundname);
+ fname = dns_fixedname_name(&foundname);
+ INSIST(!dns_rdataset_isassociated(rctx->rdataset));
+ INSIST(rctx->sigrdataset == NULL ||
+ !dns_rdataset_isassociated(rctx->sigrdataset));
+ result = view_find(rctx, &db, &node, fname);
+ if (result == ISC_R_NOTFOUND) {
+ /*
+ * We don't know anything about the name.
+ * Launch a fetch.
+ */
+ if (node != NULL) {
+ INSIST(db != NULL);
+ dns_db_detachnode(db, &node);
+ }
+ if (db != NULL)
+ dns_db_detach(&db);
+ result = start_fetch(rctx);
+ if (result != ISC_R_SUCCESS) {
+ putrdataset(mctx, &rctx->rdataset);
+ if (rctx->sigrdataset != NULL)
+ putrdataset(mctx,
+ &rctx->sigrdataset);
+ send_event = ISC_TRUE;
+ }
+ goto done;
+ }
+ } else {
+ INSIST(event->fetch == rctx->fetch);
+ dns_resolver_destroyfetch(&rctx->fetch);
+ db = event->db;
+ node = event->node;
+ result = event->result;
+ vresult = event->vresult;
+ fname = dns_fixedname_name(&event->foundname);
+ INSIST(event->rdataset == rctx->rdataset);
+ INSIST(event->sigrdataset == rctx->sigrdataset);
+ }
+
+ /*
+ * If we've been canceled, forget about the result.
+ */
+ if (rctx->canceled)
+ result = ISC_R_CANCELED;
+ else {
+ /*
+ * Otherwise, get some resource for copying the
+ * result.
+ */
+ ansname = isc_mem_get(mctx, sizeof(*ansname));
+ if (ansname == NULL)
+ tresult = ISC_R_NOMEMORY;
+ else {
+ dns_name_t *aname;
+
+ aname = dns_fixedname_name(&rctx->name);
+ dns_name_init(ansname, NULL);
+ tresult = dns_name_dup(aname, mctx, ansname);
+ if (tresult != ISC_R_SUCCESS)
+ isc_mem_put(mctx, ansname,
+ sizeof(*ansname));
+ }
+ if (tresult != ISC_R_SUCCESS)
+ result = tresult;
+ }
+
+ switch (result) {
+ case ISC_R_SUCCESS:
+ send_event = ISC_TRUE;
+ /*
+ * This case is handled in the main line below.
+ */
+ break;
+ case DNS_R_CNAME:
+ /*
+ * Add the CNAME to the answer list.
+ */
+ trdataset = rctx->rdataset;
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ rctx->rdataset = NULL;
+ if (rctx->sigrdataset != NULL) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->sigrdataset, link);
+ rctx->sigrdataset = NULL;
+ }
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+
+ /*
+ * Copy the CNAME's target into the lookup's
+ * query name and start over.
+ */
+ tresult = dns_rdataset_first(trdataset);
+ if (tresult != ISC_R_SUCCESS)
+ goto done;
+ dns_rdataset_current(trdataset, &rdata);
+ tresult = dns_rdata_tostruct(&rdata, &cname, NULL);
+ dns_rdata_reset(&rdata);
+ if (tresult != ISC_R_SUCCESS)
+ goto done;
+ tresult = dns_name_copy(&cname.cname, name, NULL);
+ dns_rdata_freestruct(&cname);
+ if (tresult == ISC_R_SUCCESS)
+ want_restart = ISC_TRUE;
+ else
+ result = tresult;
+ goto done;
+ case DNS_R_DNAME:
+ /*
+ * Add the DNAME to the answer list.
+ */
+ trdataset = rctx->rdataset;
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ rctx->rdataset = NULL;
+ if (rctx->sigrdataset != NULL) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->sigrdataset, link);
+ rctx->sigrdataset = NULL;
+ }
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+
+ namereln = dns_name_fullcompare(name, fname, &order,
+ &nlabels);
+ INSIST(namereln == dns_namereln_subdomain);
+ /*
+ * Get the target name of the DNAME.
+ */
+ tresult = dns_rdataset_first(trdataset);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ goto done;
+ }
+ dns_rdataset_current(trdataset, &rdata);
+ tresult = dns_rdata_tostruct(&rdata, &dname, NULL);
+ dns_rdata_reset(&rdata);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ goto done;
+ }
+ /*
+ * Construct the new query name and start over.
+ */
+ dns_fixedname_init(&fixed);
+ prefix = dns_fixedname_name(&fixed);
+ dns_name_split(name, nlabels, prefix, NULL);
+ tresult = dns_name_concatenate(prefix, &dname.dname,
+ name, NULL);
+ dns_rdata_freestruct(&dname);
+ if (tresult == ISC_R_SUCCESS)
+ want_restart = ISC_TRUE;
+ else
+ result = tresult;
+ goto done;
+ case DNS_R_NCACHENXDOMAIN:
+ case DNS_R_NCACHENXRRSET:
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+ rctx->rdataset = NULL;
+ /* What about sigrdataset? */
+ if (rctx->sigrdataset != NULL)
+ putrdataset(mctx, &rctx->sigrdataset);
+ send_event = ISC_TRUE;
+ goto done;
+ default:
+ if (rctx->rdataset != NULL)
+ putrdataset(mctx, &rctx->rdataset);
+ if (rctx->sigrdataset != NULL)
+ putrdataset(mctx, &rctx->sigrdataset);
+ send_event = ISC_TRUE;
+ goto done;
+ }
+
+ if (rctx->type == dns_rdatatype_any) {
+ int n = 0;
+ dns_rdatasetiter_t *rdsiter = NULL;
+
+ tresult = dns_db_allrdatasets(db, node, NULL, 0,
+ &rdsiter);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ goto done;
+ }
+
+ tresult = dns_rdatasetiter_first(rdsiter);
+ while (tresult == ISC_R_SUCCESS) {
+ dns_rdatasetiter_current(rdsiter,
+ rctx->rdataset);
+ if (rctx->rdataset->type != 0) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->rdataset,
+ link);
+ n++;
+ rctx->rdataset = NULL;
+ } else {
+ /*
+ * We're not interested in this
+ * rdataset.
+ */
+ dns_rdataset_disassociate(
+ rctx->rdataset);
+ }
+ tresult = dns_rdatasetiter_next(rdsiter);
+
+ if (tresult == ISC_R_SUCCESS &&
+ rctx->rdataset == NULL) {
+ tresult = getrdataset(mctx,
+ &rctx->rdataset);
+ if (tresult != ISC_R_SUCCESS) {
+ result = tresult;
+ break;
+ }
+ }
+ }
+ if (n == 0) {
+ /*
+ * We didn't match any rdatasets (which means
+ * something went wrong in this
+ * implementation).
+ */
+ result = DNS_R_SERVFAIL; /* better code? */
+ } else {
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+ }
+ dns_rdatasetiter_destroy(&rdsiter);
+ if (tresult != ISC_R_NOMORE)
+ result = DNS_R_SERVFAIL; /* ditto */
+ else
+ result = ISC_R_SUCCESS;
+ goto done;
+ } else {
+ /*
+ * This is the "normal" case -- an ordinary question
+ * to which we've got the answer.
+ */
+ ISC_LIST_APPEND(ansname->list, rctx->rdataset, link);
+ rctx->rdataset = NULL;
+ if (rctx->sigrdataset != NULL) {
+ ISC_LIST_APPEND(ansname->list,
+ rctx->sigrdataset, link);
+ rctx->sigrdataset = NULL;
+ }
+ ISC_LIST_APPEND(rctx->namelist, ansname, link);
+ ansname = NULL;
+ }
+
+ done:
+ /*
+ * Free temporary resources
+ */
+ if (ansname != NULL) {
+ dns_rdataset_t *rdataset;
+
+ while ((rdataset = ISC_LIST_HEAD(ansname->list))
+ != NULL) {
+ ISC_LIST_UNLINK(ansname->list, rdataset, link);
+ putrdataset(mctx, &rdataset);
+ }
+ dns_name_free(ansname, mctx);
+ isc_mem_put(mctx, ansname, sizeof(*ansname));
+ }
+
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ if (db != NULL)
+ dns_db_detach(&db);
+ if (event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&event));
+
+ /*
+ * Limit the number of restarts.
+ */
+ if (want_restart && rctx->restarts == MAX_RESTARTS) {
+ want_restart = ISC_FALSE;
+ result = ISC_R_QUOTA;
+ send_event = ISC_TRUE;
+ }
+
+ /*
+ * Prepare further find with new resources
+ */
+ if (want_restart) {
+ INSIST(rctx->rdataset == NULL &&
+ rctx->sigrdataset == NULL);
+
+ result = getrdataset(mctx, &rctx->rdataset);
+ if (result == ISC_R_SUCCESS && rctx->want_dnssec) {
+ result = getrdataset(mctx, &rctx->sigrdataset);
+ if (result != ISC_R_SUCCESS) {
+ putrdataset(mctx, &rctx->rdataset);
+ }
+ }
+
+ if (result != ISC_R_SUCCESS) {
+ want_restart = ISC_FALSE;
+ send_event = ISC_TRUE;
+ }
+ }
+ } while (want_restart);
+
+ if (send_event) {
+ isc_task_t *task;
+
+ while ((name = ISC_LIST_HEAD(rctx->namelist)) != NULL) {
+ ISC_LIST_UNLINK(rctx->namelist, name, link);
+ ISC_LIST_APPEND(rctx->event->answerlist, name, link);
+ }
+
+ rctx->event->result = result;
+ rctx->event->vresult = vresult;
+ task = rctx->event->ev_sender;
+ rctx->event->ev_sender = rctx;
+ isc_task_sendanddetach(&task, ISC_EVENT_PTR(&rctx->event));
+ }
+
+ UNLOCK(&rctx->lock);
+}
+
+static void
+resolve_done(isc_task_t *task, isc_event_t *event) {
+ resarg_t *resarg = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+
+ UNUSED(task);
+
+ LOCK(&resarg->lock);
+
+ resarg->result = rev->result;
+ resarg->vresult = rev->vresult;
+ while ((name = ISC_LIST_HEAD(rev->answerlist)) != NULL) {
+ ISC_LIST_UNLINK(rev->answerlist, name, link);
+ ISC_LIST_APPEND(*resarg->namelist, name, link);
+ }
+
+ dns_client_destroyrestrans(&resarg->trans);
+ isc_event_free(&event);
+
+ if (!resarg->canceled) {
+ UNLOCK(&resarg->lock);
+
+ /* Exit from the internal event loop */
+ isc_app_ctxsuspend(resarg->actx);
+ } else {
+ /*
+ * We have already exited from the loop (due to some
+ * unexpected event). Just clean the arg up.
+ */
+ UNLOCK(&resarg->lock);
+ DESTROYLOCK(&resarg->lock);
+ isc_mem_put(resarg->client->mctx, resarg, sizeof(*resarg));
+ }
+}
+
+isc_result_t
+dns_client_resolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, dns_namelist_t *namelist)
+{
+ isc_result_t result;
+ isc_appctx_t *actx;
+ resarg_t *resarg;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(namelist != NULL && ISC_LIST_EMPTY(*namelist));
+
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 &&
+ (options & DNS_CLIENTRESOPT_ALLOWRUN) == 0) {
+ /*
+ * If the client is run under application's control, we need
+ * to create a new running (sub)environment for this
+ * particular resolution.
+ */
+ return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */
+ } else
+ actx = client->actx;
+
+ resarg = isc_mem_get(client->mctx, sizeof(*resarg));
+ if (resarg == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&resarg->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, resarg, sizeof(*resarg));
+ return (result);
+ }
+
+ resarg->actx = actx;
+ resarg->client = client;
+ resarg->result = DNS_R_SERVFAIL;
+ resarg->namelist = namelist;
+ resarg->trans = NULL;
+ resarg->canceled = ISC_FALSE;
+ result = dns_client_startresolve(client, name, rdclass, type, options,
+ client->task, resolve_done, resarg,
+ &resarg->trans);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&resarg->lock);
+ isc_mem_put(client->mctx, resarg, sizeof(*resarg));
+ return (result);
+ }
+
+ /*
+ * Start internal event loop. It blocks until the entire process
+ * is completed.
+ */
+ result = isc_app_ctxrun(actx);
+
+ LOCK(&resarg->lock);
+ if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND)
+ result = resarg->result;
+ if (result != ISC_R_SUCCESS && resarg->vresult != ISC_R_SUCCESS) {
+ /*
+ * If this lookup failed due to some error in DNSSEC
+ * validation, return the validation error code.
+ * XXX: or should we pass the validation result separately?
+ */
+ result = resarg->vresult;
+ }
+ if (resarg->trans != NULL) {
+ /*
+ * Unusual termination (perhaps due to signal). We need some
+ * tricky cleanup process.
+ */
+ resarg->canceled = ISC_TRUE;
+ dns_client_cancelresolve(resarg->trans);
+
+ UNLOCK(&resarg->lock);
+
+ /* resarg will be freed in the event handler. */
+ } else {
+ UNLOCK(&resarg->lock);
+
+ DESTROYLOCK(&resarg->lock);
+ isc_mem_put(client->mctx, resarg, sizeof(*resarg));
+ }
+
+ return (result);
+}
+
+isc_result_t
+dns_client_startresolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, isc_task_t *task,
+ isc_taskaction_t action, void *arg,
+ dns_clientrestrans_t **transp)
+{
+ dns_view_t *view = NULL;
+ dns_clientresevent_t *event = NULL;
+ resctx_t *rctx = NULL;
+ isc_task_t *clone = NULL;
+ isc_mem_t *mctx;
+ isc_result_t result;
+ dns_rdataset_t *rdataset, *sigrdataset;
+ isc_boolean_t want_dnssec;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(transp != NULL && *transp == NULL);
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ mctx = client->mctx;
+ rdataset = NULL;
+ sigrdataset = NULL;
+ want_dnssec = ISC_TF((options & DNS_CLIENTRESOPT_NODNSSEC) == 0);
+
+ /*
+ * Prepare some intermediate resources
+ */
+ clone = NULL;
+ isc_task_attach(task, &clone);
+ event = (dns_clientresevent_t *)
+ isc_event_allocate(mctx, clone, DNS_EVENT_CLIENTRESDONE,
+ action, arg, sizeof(*event));
+ if (event == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ event->result = DNS_R_SERVFAIL;
+ ISC_LIST_INIT(event->answerlist);
+
+ rctx = isc_mem_get(mctx, sizeof(*rctx));
+ if (rctx == NULL)
+ result = ISC_R_NOMEMORY;
+ else {
+ result = isc_mutex_init(&rctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, rctx, sizeof(*rctx));
+ rctx = NULL;
+ }
+ }
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = getrdataset(mctx, &rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ rctx->rdataset = rdataset;
+
+ if (want_dnssec) {
+ result = getrdataset(mctx, &sigrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ rctx->sigrdataset = sigrdataset;
+
+ dns_fixedname_init(&rctx->name);
+ result = dns_name_copy(name, dns_fixedname_name(&rctx->name), NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ rctx->client = client;
+ ISC_LINK_INIT(rctx, link);
+ rctx->canceled = ISC_FALSE;
+ rctx->task = client->task;
+ rctx->type = type;
+ rctx->view = view;
+ rctx->restarts = 0;
+ rctx->fetch = NULL;
+ rctx->want_dnssec = want_dnssec;
+ ISC_LIST_INIT(rctx->namelist);
+ rctx->event = event;
+
+ rctx->magic = RCTX_MAGIC;
+
+ LOCK(&client->lock);
+ ISC_LIST_APPEND(client->resctxs, rctx, link);
+ UNLOCK(&client->lock);
+
+ client_resfind(rctx, NULL);
+
+ *transp = (dns_clientrestrans_t *)rctx;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (rdataset != NULL)
+ putrdataset(client->mctx, &rdataset);
+ if (sigrdataset != NULL)
+ putrdataset(client->mctx, &sigrdataset);
+ if (rctx != NULL) {
+ DESTROYLOCK(&rctx->lock);
+ isc_mem_put(mctx, rctx, sizeof(*rctx));
+ }
+ if (event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&event));
+ isc_task_detach(&clone);
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+void
+dns_client_cancelresolve(dns_clientrestrans_t *trans) {
+ resctx_t *rctx;
+
+ REQUIRE(trans != NULL);
+ rctx = (resctx_t *)trans;
+ REQUIRE(RCTX_VALID(rctx));
+
+ LOCK(&rctx->lock);
+
+ if (!rctx->canceled) {
+ rctx->canceled = ISC_TRUE;
+ if (rctx->fetch != NULL)
+ dns_resolver_cancelfetch(rctx->fetch);
+ }
+
+ UNLOCK(&rctx->lock);
+}
+
+void
+dns_client_freeresanswer(dns_client_t *client, dns_namelist_t *namelist) {
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(namelist != NULL);
+
+ while ((name = ISC_LIST_HEAD(*namelist)) != NULL) {
+ ISC_LIST_UNLINK(*namelist, name, link);
+ while ((rdataset = ISC_LIST_HEAD(name->list)) != NULL) {
+ ISC_LIST_UNLINK(name->list, rdataset, link);
+ putrdataset(client->mctx, &rdataset);
+ }
+ dns_name_free(name, client->mctx);
+ isc_mem_put(client->mctx, name, sizeof(*name));
+ }
+}
+
+void
+dns_client_destroyrestrans(dns_clientrestrans_t **transp) {
+ resctx_t *rctx;
+ isc_mem_t *mctx;
+ dns_client_t *client;
+ isc_boolean_t need_destroyclient = ISC_FALSE;
+
+ REQUIRE(transp != NULL);
+ rctx = (resctx_t *)*transp;
+ REQUIRE(RCTX_VALID(rctx));
+ REQUIRE(rctx->fetch == NULL);
+ REQUIRE(rctx->event == NULL);
+ client = rctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ mctx = client->mctx;
+ dns_view_detach(&rctx->view);
+
+ LOCK(&client->lock);
+
+ INSIST(ISC_LINK_LINKED(rctx, link));
+ ISC_LIST_UNLINK(client->resctxs, rctx, link);
+
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs))
+ need_destroyclient = ISC_TRUE;
+
+ UNLOCK(&client->lock);
+
+ INSIST(ISC_LIST_EMPTY(rctx->namelist));
+
+ DESTROYLOCK(&rctx->lock);
+ rctx->magic = 0;
+
+ isc_mem_put(mctx, rctx, sizeof(*rctx));
+
+ if (need_destroyclient)
+ destroyclient(&client);
+
+ *transp = NULL;
+}
+
+isc_result_t
+dns_client_addtrustedkey(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *keyname, isc_buffer_t *keydatabuf)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+ dst_key_t *dstkey = NULL;
+ dns_keytable_t *secroots = NULL;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_view_getsecroots(view, &secroots);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dst_key_fromdns(keyname, rdclass, keydatabuf, client->mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_keytable_add(secroots, ISC_FALSE, &dstkey);
+
+ cleanup:
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ if (view != NULL)
+ dns_view_detach(&view);
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+ return (result);
+}
+
+/*%
+ * Simple request routines
+ */
+static void
+request_done(isc_task_t *task, isc_event_t *event) {
+ dns_requestevent_t *reqev = NULL;
+ dns_request_t *request;
+ isc_result_t result, eresult;
+ reqctx_t *ctx;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
+ reqev = (dns_requestevent_t *)event;
+ request = reqev->request;
+ result = eresult = reqev->result;
+ ctx = reqev->ev_arg;
+ REQUIRE(REQCTX_VALID(ctx));
+
+ isc_event_free(&event);
+
+ LOCK(&ctx->lock);
+
+ if (eresult == ISC_R_SUCCESS) {
+ result = dns_request_getresponse(request, ctx->event->rmessage,
+ ctx->parseoptions);
+ }
+
+ if (ctx->tsigkey != NULL)
+ dns_tsigkey_detach(&ctx->tsigkey);
+
+ if (ctx->canceled)
+ ctx->event->result = ISC_R_CANCELED;
+ else
+ ctx->event->result = result;
+ task = ctx->event->ev_sender;
+ ctx->event->ev_sender = ctx;
+ isc_task_sendanddetach(&task, ISC_EVENT_PTR(&ctx->event));
+
+ UNLOCK(&ctx->lock);
+}
+
+static void
+localrequest_done(isc_task_t *task, isc_event_t *event) {
+ reqarg_t *reqarg = event->ev_arg;
+ dns_clientreqevent_t *rev =(dns_clientreqevent_t *)event;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_CLIENTREQDONE);
+
+ LOCK(&reqarg->lock);
+
+ reqarg->result = rev->result;
+ dns_client_destroyreqtrans(&reqarg->trans);
+ isc_event_free(&event);
+
+ if (!reqarg->canceled) {
+ UNLOCK(&reqarg->lock);
+
+ /* Exit from the internal event loop */
+ isc_app_ctxsuspend(reqarg->actx);
+ } else {
+ /*
+ * We have already exited from the loop (due to some
+ * unexpected event). Just clean the arg up.
+ */
+ UNLOCK(&reqarg->lock);
+ DESTROYLOCK(&reqarg->lock);
+ isc_mem_put(reqarg->client->mctx, reqarg, sizeof(*reqarg));
+ }
+}
+
+isc_result_t
+dns_client_request(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries)
+{
+ isc_appctx_t *actx;
+ reqarg_t *reqarg;
+ isc_result_t result;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(qmessage != NULL);
+ REQUIRE(rmessage != NULL);
+
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 &&
+ (options & DNS_CLIENTREQOPT_ALLOWRUN) == 0) {
+ /*
+ * If the client is run under application's control, we need
+ * to create a new running (sub)environment for this
+ * particular resolution.
+ */
+ return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */
+ } else
+ actx = client->actx;
+
+ reqarg = isc_mem_get(client->mctx, sizeof(*reqarg));
+ if (reqarg == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&reqarg->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, reqarg, sizeof(*reqarg));
+ return (result);
+ }
+
+ reqarg->actx = actx;
+ reqarg->client = client;
+ reqarg->trans = NULL;
+ reqarg->canceled = ISC_FALSE;
+
+ result = dns_client_startrequest(client, qmessage, rmessage, server,
+ options, parseoptions, tsec, timeout,
+ udptimeout, udpretries,
+ client->task, localrequest_done,
+ reqarg, &reqarg->trans);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&reqarg->lock);
+ isc_mem_put(client->mctx, reqarg, sizeof(*reqarg));
+ return (result);
+ }
+
+ /*
+ * Start internal event loop. It blocks until the entire process
+ * is completed.
+ */
+ result = isc_app_ctxrun(actx);
+
+ LOCK(&reqarg->lock);
+ if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND)
+ result = reqarg->result;
+ if (reqarg->trans != NULL) {
+ /*
+ * Unusual termination (perhaps due to signal). We need some
+ * tricky cleanup process.
+ */
+ reqarg->canceled = ISC_TRUE;
+ dns_client_cancelresolve(reqarg->trans);
+
+ UNLOCK(&reqarg->lock);
+
+ /* reqarg will be freed in the event handler. */
+ } else {
+ UNLOCK(&reqarg->lock);
+
+ DESTROYLOCK(&reqarg->lock);
+ isc_mem_put(client->mctx, reqarg, sizeof(*reqarg));
+ }
+
+ return (result);
+}
+
+isc_result_t
+dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientreqtrans_t **transp)
+{
+ isc_result_t result;
+ dns_view_t *view = NULL;
+ isc_task_t *clone = NULL;
+ dns_clientreqevent_t *event = NULL;
+ reqctx_t *ctx = NULL;
+ dns_tsectype_t tsectype = dns_tsectype_none;
+
+ UNUSED(options);
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(qmessage != NULL);
+ REQUIRE(rmessage != NULL);
+ REQUIRE(transp != NULL && *transp == NULL);
+
+ if (tsec != NULL) {
+ tsectype = dns_tsec_gettype(tsec);
+ if (tsectype != dns_tsectype_tsig)
+ return (ISC_R_NOTIMPLEMENTED); /* XXX */
+ }
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ qmessage->rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ clone = NULL;
+ isc_task_attach(task, &clone);
+ event = (dns_clientreqevent_t *)
+ isc_event_allocate(client->mctx, clone,
+ DNS_EVENT_CLIENTREQDONE,
+ action, arg, sizeof(*event));
+ if (event == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+
+ ctx = isc_mem_get(client->mctx, sizeof(*ctx));
+ if (ctx == NULL)
+ result = ISC_R_NOMEMORY;
+ else {
+ result = isc_mutex_init(&ctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, ctx, sizeof(*ctx));
+ ctx = NULL;
+ }
+ }
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ ctx->client = client;
+ ISC_LINK_INIT(ctx, link);
+ ctx->parseoptions = parseoptions;
+ ctx->canceled = ISC_FALSE;
+ ctx->event = event;
+ ctx->event->rmessage = rmessage;
+ ctx->tsigkey = NULL;
+ if (tsec != NULL)
+ dns_tsec_getkey(tsec, &ctx->tsigkey);
+
+ ctx->magic = REQCTX_MAGIC;
+
+ LOCK(&client->lock);
+ ISC_LIST_APPEND(client->reqctxs, ctx, link);
+ UNLOCK(&client->lock);
+
+ ctx->request = NULL;
+ result = dns_request_createvia3(view->requestmgr, qmessage, NULL,
+ server, options, ctx->tsigkey,
+ timeout, udptimeout, udpretries,
+ client->task, request_done, ctx,
+ &ctx->request);
+ if (result == ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ *transp = (dns_clientreqtrans_t *)ctx;
+ return (ISC_R_SUCCESS);
+ }
+
+ cleanup:
+ if (ctx != NULL) {
+ LOCK(&client->lock);
+ ISC_LIST_UNLINK(client->reqctxs, ctx, link);
+ UNLOCK(&client->lock);
+ DESTROYLOCK(&ctx->lock);
+ isc_mem_put(client->mctx, ctx, sizeof(*ctx));
+ }
+ if (event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&event));
+ isc_task_detach(&clone);
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+void
+dns_client_cancelrequest(dns_clientreqtrans_t *trans) {
+ reqctx_t *ctx;
+
+ REQUIRE(trans != NULL);
+ ctx = (reqctx_t *)trans;
+ REQUIRE(REQCTX_VALID(ctx));
+
+ LOCK(&ctx->lock);
+
+ if (!ctx->canceled) {
+ ctx->canceled = ISC_TRUE;
+ if (ctx->request != NULL)
+ dns_request_cancel(ctx->request);
+ }
+
+ UNLOCK(&ctx->lock);
+}
+
+void
+dns_client_destroyreqtrans(dns_clientreqtrans_t **transp) {
+ reqctx_t *ctx;
+ isc_mem_t *mctx;
+ dns_client_t *client;
+ isc_boolean_t need_destroyclient = ISC_FALSE;
+
+ REQUIRE(transp != NULL);
+ ctx = (reqctx_t *)*transp;
+ REQUIRE(REQCTX_VALID(ctx));
+ client = ctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(ctx->event == NULL);
+ REQUIRE(ctx->request != NULL);
+
+ dns_request_destroy(&ctx->request);
+ mctx = client->mctx;
+
+ LOCK(&client->lock);
+
+ INSIST(ISC_LINK_LINKED(ctx, link));
+ ISC_LIST_UNLINK(client->reqctxs, ctx, link);
+
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs)) {
+ need_destroyclient = ISC_TRUE;
+ }
+
+ UNLOCK(&client->lock);
+
+ DESTROYLOCK(&ctx->lock);
+ ctx->magic = 0;
+
+ isc_mem_put(mctx, ctx, sizeof(*ctx));
+
+ if (need_destroyclient)
+ destroyclient(&client);
+
+ *transp = NULL;
+}
+
+/*%
+ * Dynamic update routines
+ */
+static isc_result_t
+rcode2result(dns_rcode_t rcode) {
+ /* XXX: isn't there a similar function? */
+ switch (rcode) {
+ case dns_rcode_formerr:
+ return (DNS_R_FORMERR);
+ case dns_rcode_servfail:
+ return (DNS_R_SERVFAIL);
+ case dns_rcode_nxdomain:
+ return (DNS_R_NXDOMAIN);
+ case dns_rcode_notimp:
+ return (DNS_R_NOTIMP);
+ case dns_rcode_refused:
+ return (DNS_R_REFUSED);
+ case dns_rcode_yxdomain:
+ return (DNS_R_YXDOMAIN);
+ case dns_rcode_yxrrset:
+ return (DNS_R_YXRRSET);
+ case dns_rcode_nxrrset:
+ return (DNS_R_NXRRSET);
+ case dns_rcode_notauth:
+ return (DNS_R_NOTAUTH);
+ case dns_rcode_notzone:
+ return (DNS_R_NOTZONE);
+ case dns_rcode_badvers:
+ return (DNS_R_BADVERS);
+ }
+
+ return (ISC_R_FAILURE);
+}
+
+static void
+update_sendevent(updatectx_t *uctx, isc_result_t result) {
+ isc_task_t *task;
+
+ dns_message_destroy(&uctx->updatemsg);
+ if (uctx->tsigkey != NULL)
+ dns_tsigkey_detach(&uctx->tsigkey);
+ if (uctx->sig0key != NULL)
+ dst_key_free(&uctx->sig0key);
+
+ if (uctx->canceled)
+ uctx->event->result = ISC_R_CANCELED;
+ else
+ uctx->event->result = result;
+ uctx->event->state = uctx->state;
+ task = uctx->event->ev_sender;
+ uctx->event->ev_sender = uctx;
+ isc_task_sendanddetach(&task, ISC_EVENT_PTR(&uctx->event));
+}
+
+static void
+update_done(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ dns_requestevent_t *reqev = NULL;
+ dns_request_t *request;
+ dns_message_t *answer = NULL;
+ updatectx_t *uctx = event->ev_arg;
+ dns_client_t *client;
+ unsigned int timeout;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
+ reqev = (dns_requestevent_t *)event;
+ request = reqev->request;
+ REQUIRE(UCTX_VALID(uctx));
+ client = uctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ result = reqev->result;
+ if (result != ISC_R_SUCCESS)
+ goto out;
+
+ result = dns_message_create(client->mctx, DNS_MESSAGE_INTENTPARSE,
+ &answer);
+ if (result != ISC_R_SUCCESS)
+ goto out;
+ uctx->state = dns_clientupdatestate_done;
+ result = dns_request_getresponse(request, answer,
+ DNS_MESSAGEPARSE_PRESERVEORDER);
+ if (result == ISC_R_SUCCESS && answer->rcode != dns_rcode_noerror)
+ result = rcode2result(answer->rcode);
+
+ out:
+ if (answer != NULL)
+ dns_message_destroy(&answer);
+ isc_event_free(&event);
+
+ LOCK(&uctx->lock);
+ uctx->currentserver = ISC_LIST_NEXT(uctx->currentserver, link);
+ dns_request_destroy(&uctx->updatereq);
+ if (result != ISC_R_SUCCESS && !uctx->canceled &&
+ uctx->currentserver != NULL) {
+ dns_message_renderreset(uctx->updatemsg);
+ dns_message_settsigkey(uctx->updatemsg, NULL);
+
+ timeout = client->update_timeout / uctx->nservers;
+ if (timeout < MIN_UPDATE_TIMEOUT)
+ timeout = MIN_UPDATE_TIMEOUT;
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ uctx->updatemsg,
+ NULL,
+ uctx->currentserver, 0,
+ uctx->tsigkey,
+ timeout,
+ client->update_udptimeout,
+ client->update_udpretries,
+ client->task,
+ update_done, uctx,
+ &uctx->updatereq);
+ UNLOCK(&uctx->lock);
+
+ if (result == ISC_R_SUCCESS) {
+ /* XXX: should we keep the 'done' state here? */
+ uctx->state = dns_clientupdatestate_sent;
+ return;
+ }
+ } else
+ UNLOCK(&uctx->lock);
+
+ update_sendevent(uctx, result);
+}
+
+static isc_result_t
+send_update(updatectx_t *uctx) {
+ isc_result_t result;
+ dns_name_t *name = NULL;
+ dns_rdataset_t *rdataset = NULL;
+ dns_client_t *client = uctx->client;
+ unsigned int timeout;
+
+ REQUIRE(uctx->zonename != NULL && uctx->currentserver != NULL);
+
+ result = dns_message_gettempname(uctx->updatemsg, &name);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ dns_name_init(name, NULL);
+ dns_name_clone(uctx->zonename, name);
+ result = dns_message_gettemprdataset(uctx->updatemsg, &rdataset);
+ if (result != ISC_R_SUCCESS) {
+ dns_message_puttempname(uctx->updatemsg, &name);
+ return (result);
+ }
+ dns_rdataset_makequestion(rdataset, uctx->rdclass, dns_rdatatype_soa);
+ ISC_LIST_INIT(name->list);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+ dns_message_addname(uctx->updatemsg, name, DNS_SECTION_ZONE);
+ if (uctx->tsigkey == NULL && uctx->sig0key != NULL) {
+ result = dns_message_setsig0key(uctx->updatemsg,
+ uctx->sig0key);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ timeout = client->update_timeout / uctx->nservers;
+ if (timeout < MIN_UPDATE_TIMEOUT)
+ timeout = MIN_UPDATE_TIMEOUT;
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ uctx->updatemsg,
+ NULL, uctx->currentserver, 0,
+ uctx->tsigkey, timeout,
+ client->update_udptimeout,
+ client->update_udpretries,
+ client->task, update_done, uctx,
+ &uctx->updatereq);
+ if (result == ISC_R_SUCCESS &&
+ uctx->state == dns_clientupdatestate_prepare) {
+ uctx->state = dns_clientupdatestate_sent;
+ }
+
+ return (result);
+}
+
+static void
+resolveaddr_done(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ int family;
+ dns_rdatatype_t qtype;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ updatectx_t *uctx;
+ isc_boolean_t completed = ISC_FALSE;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_arg != NULL);
+ uctx = *(updatectx_t **)event->ev_arg;
+ REQUIRE(UCTX_VALID(uctx));
+
+ if (event->ev_arg == &uctx->bp4) {
+ family = AF_INET;
+ qtype = dns_rdatatype_a;
+ LOCK(&uctx->lock);
+ dns_client_destroyrestrans(&uctx->restrans);
+ UNLOCK(&uctx->lock);
+ } else {
+ INSIST(event->ev_arg == &uctx->bp6);
+ family = AF_INET6;
+ qtype = dns_rdatatype_aaaa;
+ LOCK(&uctx->lock);
+ dns_client_destroyrestrans(&uctx->restrans2);
+ UNLOCK(&uctx->lock);
+ }
+
+ result = rev->result;
+ if (result != ISC_R_SUCCESS)
+ goto done;
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (!dns_rdataset_isassociated(rdataset))
+ continue;
+ if (rdataset->type != qtype)
+ continue;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata;
+ dns_rdata_in_a_t rdata_a;
+ dns_rdata_in_aaaa_t rdata_aaaa;
+ isc_sockaddr_t *sa;
+
+ sa = isc_mem_get(uctx->client->mctx,
+ sizeof(*sa));
+ if (sa == NULL) {
+ /*
+ * If we fail to get a sockaddr,
+ we simply move forward with the
+ * addresses we've got so far.
+ */
+ goto done;
+ }
+
+ dns_rdata_init(&rdata);
+ switch (family) {
+ case AF_INET:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_a,
+ NULL);
+ isc_sockaddr_fromin(sa,
+ &rdata_a.in_addr,
+ 53);
+ dns_rdata_freestruct(&rdata_a);
+ break;
+ case AF_INET6:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_aaaa,
+ NULL);
+ isc_sockaddr_fromin6(sa,
+ &rdata_aaaa.in6_addr,
+ 53);
+ dns_rdata_freestruct(&rdata_aaaa);
+ break;
+ }
+
+ ISC_LINK_INIT(sa, link);
+ ISC_LIST_APPEND(uctx->servers, sa, link);
+ uctx->nservers++;
+ }
+ }
+ }
+
+ done:
+ dns_client_freeresanswer(uctx->client, &rev->answerlist);
+ isc_event_free(&event);
+
+ LOCK(&uctx->lock);
+ if (uctx->restrans == NULL && uctx->restrans2 == NULL)
+ completed = ISC_TRUE;
+ UNLOCK(&uctx->lock);
+
+ if (completed) {
+ INSIST(uctx->currentserver == NULL);
+ uctx->currentserver = ISC_LIST_HEAD(uctx->servers);
+ if (uctx->currentserver != NULL && !uctx->canceled)
+ send_update(uctx);
+ else {
+ if (result == ISC_R_SUCCESS)
+ result = ISC_R_NOTFOUND;
+ update_sendevent(uctx, result);
+ }
+ }
+}
+
+static isc_result_t
+process_soa(updatectx_t *uctx, dns_rdataset_t *soaset, dns_name_t *soaname) {
+ isc_result_t result;
+ dns_rdata_t soarr = DNS_RDATA_INIT;
+ dns_rdata_soa_t soa;
+ dns_name_t primary;
+
+ result = dns_rdataset_first(soaset);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ dns_rdata_init(&soarr);
+ dns_rdataset_current(soaset, &soarr);
+ result = dns_rdata_tostruct(&soarr, &soa, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_name_init(&primary, NULL);
+ dns_name_clone(&soa.origin, &primary);
+
+ if (uctx->zonename == NULL) {
+ uctx->zonename = dns_fixedname_name(&uctx->zonefname);
+ result = dns_name_copy(soaname, uctx->zonename, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto out;
+ }
+
+ if (uctx->currentserver != NULL)
+ result = send_update(uctx);
+ else {
+ /*
+ * Get addresses of the primary server. We don't use the ADB
+ * feature so that we could avoid caching data.
+ */
+ LOCK(&uctx->lock);
+ uctx->bp4 = uctx;
+ result = dns_client_startresolve(uctx->client, &primary,
+ uctx->rdclass,
+ dns_rdatatype_a,
+ 0, uctx->client->task,
+ resolveaddr_done, &uctx->bp4,
+ &uctx->restrans);
+ if (result == ISC_R_SUCCESS) {
+ uctx->bp6 = uctx;
+ result = dns_client_startresolve(uctx->client,
+ &primary,
+ uctx->rdclass,
+ dns_rdatatype_aaaa,
+ 0, uctx->client->task,
+ resolveaddr_done,
+ &uctx->bp6,
+ &uctx->restrans2);
+ }
+ UNLOCK(&uctx->lock);
+ }
+
+ out:
+ dns_rdata_freestruct(&soa);
+
+ return (result);
+}
+
+static void
+receive_soa(isc_task_t *task, isc_event_t *event) {
+ dns_requestevent_t *reqev = NULL;
+ updatectx_t *uctx;
+ dns_client_t *client;
+ isc_result_t result, eresult;
+ dns_request_t *request;
+ dns_message_t *rcvmsg = NULL;
+ dns_section_t section;
+ dns_rdataset_t *soaset = NULL;
+ int pass = 0;
+ dns_name_t *name;
+ dns_message_t *soaquery = NULL;
+ isc_sockaddr_t *addr;
+ isc_boolean_t seencname = ISC_FALSE;
+ isc_boolean_t droplabel = ISC_FALSE;
+ dns_name_t tname;
+ unsigned int nlabels;
+
+ UNUSED(task);
+
+ REQUIRE(event->ev_type == DNS_EVENT_REQUESTDONE);
+ reqev = (dns_requestevent_t *)event;
+ request = reqev->request;
+ result = eresult = reqev->result;
+ uctx = reqev->ev_arg;
+ client = uctx->client;
+ soaquery = uctx->soaquery;
+ addr = uctx->currentserver;
+ INSIST(addr != NULL);
+
+ isc_event_free(&event);
+
+ if (eresult != ISC_R_SUCCESS) {
+ result = eresult;
+ goto out;
+ }
+
+ result = dns_message_create(uctx->client->mctx,
+ DNS_MESSAGE_INTENTPARSE, &rcvmsg);
+ if (result != ISC_R_SUCCESS)
+ goto out;
+ result = dns_request_getresponse(request, rcvmsg,
+ DNS_MESSAGEPARSE_PRESERVEORDER);
+
+ if (result == DNS_R_TSIGERRORSET) {
+ dns_request_t *newrequest = NULL;
+
+ /* Retry SOA request without TSIG */
+ dns_message_destroy(&rcvmsg);
+ dns_message_renderreset(uctx->soaquery);
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ uctx->soaquery, NULL, addr, 0,
+ NULL,
+ client->find_timeout * 20,
+ client->find_timeout, 3,
+ uctx->client->task,
+ receive_soa, uctx,
+ &newrequest);
+ if (result == ISC_R_SUCCESS) {
+ LOCK(&uctx->lock);
+ dns_request_destroy(&uctx->soareq);
+ uctx->soareq = newrequest;
+ UNLOCK(&uctx->lock);
+
+ return;
+ }
+ goto out;
+ }
+
+ section = DNS_SECTION_ANSWER;
+
+ if (rcvmsg->rcode != dns_rcode_noerror &&
+ rcvmsg->rcode != dns_rcode_nxdomain) {
+ result = rcode2result(rcvmsg->rcode);
+ goto out;
+ }
+
+ lookforsoa:
+ if (pass == 0)
+ section = DNS_SECTION_ANSWER;
+ else if (pass == 1)
+ section = DNS_SECTION_AUTHORITY;
+ else {
+ droplabel = ISC_TRUE;
+ goto out;
+ }
+
+ result = dns_message_firstname(rcvmsg, section);
+ if (result != ISC_R_SUCCESS) {
+ pass++;
+ goto lookforsoa;
+ }
+ while (result == ISC_R_SUCCESS) {
+ name = NULL;
+ dns_message_currentname(rcvmsg, section, &name);
+ soaset = NULL;
+ result = dns_message_findtype(name, dns_rdatatype_soa, 0,
+ &soaset);
+ if (result == ISC_R_SUCCESS)
+ break;
+ if (section == DNS_SECTION_ANSWER) {
+ dns_rdataset_t *tset = NULL;
+ if (dns_message_findtype(name, dns_rdatatype_cname, 0,
+ &tset) == ISC_R_SUCCESS
+ ||
+ dns_message_findtype(name, dns_rdatatype_dname, 0,
+ &tset) == ISC_R_SUCCESS
+ )
+ {
+ seencname = ISC_TRUE;
+ break;
+ }
+ }
+
+ result = dns_message_nextname(rcvmsg, section);
+ }
+
+ if (soaset == NULL && !seencname) {
+ pass++;
+ goto lookforsoa;
+ }
+
+ if (seencname) {
+ droplabel = ISC_TRUE;
+ goto out;
+ }
+
+ result = process_soa(uctx, soaset, name);
+
+ out:
+ if (droplabel) {
+ result = dns_message_firstname(soaquery, DNS_SECTION_QUESTION);
+ INSIST(result == ISC_R_SUCCESS);
+ name = NULL;
+ dns_message_currentname(soaquery, DNS_SECTION_QUESTION, &name);
+ nlabels = dns_name_countlabels(name);
+ if (nlabels == 1)
+ result = DNS_R_SERVFAIL; /* is there a better error? */
+ else {
+ dns_name_init(&tname, NULL);
+ dns_name_getlabelsequence(name, 1, nlabels - 1,
+ &tname);
+ dns_name_clone(&tname, name);
+ dns_request_destroy(&request);
+ LOCK(&uctx->lock);
+ uctx->soareq = NULL;
+ UNLOCK(&uctx->lock);
+ dns_message_renderreset(soaquery);
+ dns_message_settsigkey(soaquery, NULL);
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ soaquery, NULL,
+ uctx->currentserver, 0,
+ uctx->tsigkey,
+ client->find_timeout *
+ 20,
+ client->find_timeout,
+ 3, client->task,
+ receive_soa, uctx,
+ &uctx->soareq);
+ }
+ }
+
+ if (!droplabel || result != ISC_R_SUCCESS) {
+ dns_message_destroy(&uctx->soaquery);
+ LOCK(&uctx->lock);
+ dns_request_destroy(&uctx->soareq);
+ UNLOCK(&uctx->lock);
+ }
+
+ if (rcvmsg != NULL)
+ dns_message_destroy(&rcvmsg);
+
+ if (result != ISC_R_SUCCESS)
+ update_sendevent(uctx, result);
+}
+
+static isc_result_t
+request_soa(updatectx_t *uctx) {
+ isc_result_t result;
+ dns_message_t *soaquery = uctx->soaquery;
+ dns_name_t *name = NULL;
+ dns_rdataset_t *rdataset = NULL;
+
+ if (soaquery == NULL) {
+ result = dns_message_create(uctx->client->mctx,
+ DNS_MESSAGE_INTENTRENDER,
+ &soaquery);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ soaquery->flags |= DNS_MESSAGEFLAG_RD;
+ result = dns_message_gettempname(soaquery, &name);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ result = dns_message_gettemprdataset(soaquery, &rdataset);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdataset_makequestion(rdataset, uctx->rdclass, dns_rdatatype_soa);
+ dns_name_clone(uctx->firstname, name);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+ dns_message_addname(soaquery, name, DNS_SECTION_QUESTION);
+ rdataset = NULL;
+ name = NULL;
+
+ result = dns_request_createvia3(uctx->view->requestmgr,
+ soaquery, NULL, uctx->currentserver, 0,
+ uctx->tsigkey,
+ uctx->client->find_timeout * 20,
+ uctx->client->find_timeout, 3,
+ uctx->client->task, receive_soa, uctx,
+ &uctx->soareq);
+ if (result == ISC_R_SUCCESS) {
+ uctx->soaquery = soaquery;
+ return (ISC_R_SUCCESS);
+ }
+
+ fail:
+ if (rdataset != NULL) {
+ ISC_LIST_UNLINK(name->list, rdataset, link); /* for safety */
+ dns_message_puttemprdataset(soaquery, &rdataset);
+ }
+ if (name != NULL)
+ dns_message_puttempname(soaquery, &name);
+ dns_message_destroy(&soaquery);
+
+ return (result);
+}
+
+static void
+resolvesoa_done(isc_task_t *task, isc_event_t *event) {
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ updatectx_t *uctx;
+ dns_name_t *name, tname;
+ dns_rdataset_t *rdataset = NULL;
+ isc_result_t result = rev->result;
+ unsigned int nlabels;
+
+ UNUSED(task);
+
+ uctx = event->ev_arg;
+ REQUIRE(UCTX_VALID(uctx));
+
+ LOCK(&uctx->lock);
+ dns_client_destroyrestrans(&uctx->restrans);
+ UNLOCK(&uctx->lock);
+
+ uctx = event->ev_arg;
+ if (result != ISC_R_SUCCESS &&
+ result != DNS_R_NCACHENXDOMAIN &&
+ result != DNS_R_NCACHENXRRSET) {
+ /* XXX: what about DNSSEC failure? */
+ goto out;
+ }
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (dns_rdataset_isassociated(rdataset) &&
+ rdataset->type == dns_rdatatype_soa)
+ break;
+ }
+ }
+
+ if (rdataset == NULL) {
+ /* Drop one label and retry resolution. */
+ nlabels = dns_name_countlabels(&uctx->soaqname);
+ if (nlabels == 1) {
+ result = DNS_R_SERVFAIL; /* is there a better error? */
+ goto out;
+ }
+ dns_name_init(&tname, NULL);
+ dns_name_getlabelsequence(&uctx->soaqname, 1, nlabels - 1,
+ &tname);
+ dns_name_clone(&tname, &uctx->soaqname);
+
+ result = dns_client_startresolve(uctx->client, &uctx->soaqname,
+ uctx->rdclass,
+ dns_rdatatype_soa, 0,
+ uctx->client->task,
+ resolvesoa_done, uctx,
+ &uctx->restrans);
+ } else
+ result = process_soa(uctx, rdataset, &uctx->soaqname);
+
+ out:
+ dns_client_freeresanswer(uctx->client, &rev->answerlist);
+ isc_event_free(&event);
+
+ if (result != ISC_R_SUCCESS)
+ update_sendevent(uctx, result);
+}
+
+static isc_result_t
+copy_name(isc_mem_t *mctx, dns_message_t *msg, dns_name_t *name,
+ dns_name_t **newnamep)
+{
+ isc_result_t result;
+ dns_name_t *newname = NULL;
+ isc_region_t r;
+ isc_buffer_t *namebuf = NULL, *rdatabuf = NULL;
+ dns_rdatalist_t *rdatalist;
+ dns_rdataset_t *rdataset, *newrdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT, *newrdata;
+
+ result = dns_message_gettempname(msg, &newname);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_buffer_allocate(mctx, &namebuf, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_name_init(newname, NULL);
+ dns_name_setbuffer(newname, namebuf);
+ dns_message_takebuffer(msg, &namebuf);
+ result = dns_name_copy(name, newname, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ for (rdataset = ISC_LIST_HEAD(name->list); rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ rdatalist = NULL;
+ result = dns_message_gettemprdatalist(msg, &rdatalist);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdatalist_init(rdatalist);
+ rdatalist->type = rdataset->type;
+ rdatalist->rdclass = rdataset->rdclass;
+ rdatalist->covers = rdataset->covers;
+ rdatalist->ttl = rdataset->ttl;
+
+ result = dns_rdataset_first(rdataset);
+ while (result == ISC_R_SUCCESS) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+
+ newrdata = NULL;
+ result = dns_message_gettemprdata(msg, &newrdata);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdata_toregion(&rdata, &r);
+ rdatabuf = NULL;
+ result = isc_buffer_allocate(mctx, &rdatabuf,
+ r.length);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ isc_buffer_putmem(rdatabuf, r.base, r.length);
+ isc_buffer_usedregion(rdatabuf, &r);
+ dns_rdata_init(newrdata);
+ dns_rdata_fromregion(newrdata, rdata.rdclass,
+ rdata.type, &r);
+ newrdata->flags = rdata.flags;
+
+ ISC_LIST_APPEND(rdatalist->rdata, newrdata, link);
+ dns_message_takebuffer(msg, &rdatabuf);
+
+ result = dns_rdataset_next(rdataset);
+ }
+
+ newrdataset = NULL;
+ result = dns_message_gettemprdataset(msg, &newrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_rdataset_init(newrdataset);
+ dns_rdatalist_tordataset(rdatalist, newrdataset);
+
+ ISC_LIST_APPEND(newname->list, newrdataset, link);
+ }
+
+ *newnamep = newname;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ dns_message_puttempname(msg, &newname);
+
+ return (result);
+
+}
+
+static void
+internal_update_callback(isc_task_t *task, isc_event_t *event) {
+ updatearg_t *uarg = event->ev_arg;
+ dns_clientupdateevent_t *uev = (dns_clientupdateevent_t *)event;
+
+ UNUSED(task);
+
+ LOCK(&uarg->lock);
+
+ uarg->result = uev->result;
+
+ dns_client_destroyupdatetrans(&uarg->trans);
+ isc_event_free(&event);
+
+ if (!uarg->canceled) {
+ UNLOCK(&uarg->lock);
+
+ /* Exit from the internal event loop */
+ isc_app_ctxsuspend(uarg->actx);
+ } else {
+ /*
+ * We have already exited from the loop (due to some
+ * unexpected event). Just clean the arg up.
+ */
+ UNLOCK(&uarg->lock);
+ DESTROYLOCK(&uarg->lock);
+ isc_mem_put(uarg->client->mctx, uarg, sizeof(*uarg));
+ }
+}
+
+isc_result_t
+dns_client_update(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options)
+{
+ isc_result_t result;
+ isc_appctx_t *actx;
+ updatearg_t *uarg;
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+
+ if ((client->attributes & DNS_CLIENTATTR_OWNCTX) == 0 &&
+ (options & DNS_CLIENTRESOPT_ALLOWRUN) == 0) {
+ /*
+ * If the client is run under application's control, we need
+ * to create a new running (sub)environment for this
+ * particular resolution.
+ */
+ return (ISC_R_NOTIMPLEMENTED); /* XXXTBD */
+ } else
+ actx = client->actx;
+
+ uarg = isc_mem_get(client->mctx, sizeof(*uarg));
+ if (uarg == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&uarg->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(client->mctx, uarg, sizeof(*uarg));
+ return (result);
+ }
+
+ uarg->actx = actx;
+ uarg->client = client;
+ uarg->result = ISC_R_FAILURE;
+ uarg->trans = NULL;
+ uarg->canceled = ISC_FALSE;
+
+ result = dns_client_startupdate(client, rdclass, zonename,
+ prerequisites, updates, servers,
+ tsec, options, client->task,
+ internal_update_callback, uarg,
+ &uarg->trans);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&uarg->lock);
+ isc_mem_put(client->mctx, uarg, sizeof(*uarg));
+ return (result);
+ }
+
+ /*
+ * Start internal event loop. It blocks until the entire process
+ * is completed.
+ */
+ result = isc_app_ctxrun(actx);
+
+ LOCK(&uarg->lock);
+ if (result == ISC_R_SUCCESS || result == ISC_R_SUSPEND)
+ result = uarg->result;
+
+ if (uarg->trans != NULL) {
+ /*
+ * Unusual termination (perhaps due to signal). We need some
+ * tricky cleanup process.
+ */
+ uarg->canceled = ISC_TRUE;
+ dns_client_cancelupdate(uarg->trans);
+
+ UNLOCK(&uarg->lock);
+
+ /* uarg will be freed in the event handler. */
+ } else {
+ UNLOCK(&uarg->lock);
+
+ DESTROYLOCK(&uarg->lock);
+ isc_mem_put(client->mctx, uarg, sizeof(*uarg));
+ }
+
+ return (result);
+}
+
+isc_result_t
+dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientupdatetrans_t **transp)
+{
+ dns_view_t *view = NULL;
+ isc_result_t result;
+ dns_name_t *name, *newname;
+ updatectx_t *uctx;
+ isc_task_t *clone = NULL;
+ dns_section_t section = DNS_SECTION_UPDATE;
+ isc_sockaddr_t *server, *sa = NULL;
+ dns_tsectype_t tsectype = dns_tsectype_none;
+
+ UNUSED(options);
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(transp != NULL && *transp == NULL);
+ REQUIRE(updates != NULL);
+ REQUIRE(task != NULL);
+
+ if (tsec != NULL) {
+ tsectype = dns_tsec_gettype(tsec);
+ if (tsectype != dns_tsectype_tsig)
+ return (ISC_R_NOTIMPLEMENTED); /* XXX */
+ }
+
+ LOCK(&client->lock);
+ result = dns_viewlist_find(&client->viewlist, DNS_CLIENTVIEW_NAME,
+ rdclass, &view);
+ UNLOCK(&client->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /* Create a context and prepare some resources */
+ uctx = isc_mem_get(client->mctx, sizeof(*uctx));
+ if (uctx == NULL) {
+ dns_view_detach(&view);
+ return (ISC_R_NOMEMORY);
+ }
+ result = isc_mutex_init(&uctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ dns_view_detach(&view);
+ isc_mem_put(client->mctx, uctx, sizeof(*uctx));
+ return (ISC_R_NOMEMORY);
+ }
+ clone = NULL;
+ isc_task_attach(task, &clone);
+ uctx->client = client;
+ ISC_LINK_INIT(uctx, link);
+ uctx->state = dns_clientupdatestate_prepare;
+ uctx->view = view;
+ uctx->rdclass = rdclass;
+ uctx->canceled = ISC_FALSE;
+ uctx->updatemsg = NULL;
+ uctx->soaquery = NULL;
+ uctx->updatereq = NULL;
+ uctx->restrans = NULL;
+ uctx->restrans2 = NULL;
+ uctx->bp4 = NULL;
+ uctx->bp6 = NULL;
+ uctx->soareq = NULL;
+ uctx->event = NULL;
+ uctx->tsigkey = NULL;
+ uctx->sig0key = NULL;
+ uctx->zonename = NULL;
+ dns_name_init(&uctx->soaqname, NULL);
+ ISC_LIST_INIT(uctx->servers);
+ uctx->nservers = 0;
+ uctx->currentserver = NULL;
+ dns_fixedname_init(&uctx->zonefname);
+ if (tsec != NULL)
+ dns_tsec_getkey(tsec, &uctx->tsigkey);
+ uctx->event = (dns_clientupdateevent_t *)
+ isc_event_allocate(client->mctx, clone, DNS_EVENT_UPDATEDONE,
+ action, arg, sizeof(*uctx->event));
+ if (uctx->event == NULL)
+ goto fail;
+ if (zonename != NULL) {
+ uctx->zonename = dns_fixedname_name(&uctx->zonefname);
+ result = dns_name_copy(zonename, uctx->zonename, NULL);
+ }
+ if (servers != NULL) {
+ for (server = ISC_LIST_HEAD(*servers);
+ server != NULL;
+ server = ISC_LIST_NEXT(server, link)) {
+ sa = isc_mem_get(client->mctx, sizeof(*sa));
+ if (sa == NULL)
+ goto fail;
+ sa->type = server->type;
+ sa->length = server->length;
+ ISC_LINK_INIT(sa, link);
+ ISC_LIST_APPEND(uctx->servers, sa, link);
+ if (uctx->currentserver == NULL)
+ uctx->currentserver = sa;
+ uctx->nservers++;
+ }
+ }
+
+ /* Make update message */
+ result = dns_message_create(client->mctx, DNS_MESSAGE_INTENTRENDER,
+ &uctx->updatemsg);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ uctx->updatemsg->opcode = dns_opcode_update;
+
+ if (prerequisites != NULL) {
+ for (name = ISC_LIST_HEAD(*prerequisites); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ newname = NULL;
+ result = copy_name(client->mctx, uctx->updatemsg,
+ name, &newname);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_message_addname(uctx->updatemsg, newname,
+ DNS_SECTION_PREREQUISITE);
+ }
+ }
+
+ for (name = ISC_LIST_HEAD(*updates); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ newname = NULL;
+ result = copy_name(client->mctx, uctx->updatemsg, name,
+ &newname);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_message_addname(uctx->updatemsg, newname,
+ DNS_SECTION_UPDATE);
+ }
+
+ uctx->firstname = NULL;
+ result = dns_message_firstname(uctx->updatemsg, section);
+ if (result == ISC_R_NOMORE) {
+ section = DNS_SECTION_PREREQUISITE;
+ result = dns_message_firstname(uctx->updatemsg, section);
+ }
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ dns_message_currentname(uctx->updatemsg, section, &uctx->firstname);
+
+ uctx->magic = UCTX_MAGIC;
+
+ LOCK(&client->lock);
+ ISC_LIST_APPEND(client->updatectxs, uctx, link);
+ UNLOCK(&client->lock);
+
+ if (uctx->zonename != NULL && uctx->currentserver != NULL) {
+ result = send_update(uctx);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ } else if (uctx->currentserver != NULL) {
+ result = request_soa(uctx);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ } else {
+ dns_name_clone(uctx->firstname, &uctx->soaqname);
+ result = dns_client_startresolve(uctx->client, &uctx->soaqname,
+ uctx->rdclass,
+ dns_rdatatype_soa, 0,
+ client->task, resolvesoa_done,
+ uctx, &uctx->restrans);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ }
+
+ *transp = (dns_clientupdatetrans_t *)uctx;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ if (ISC_LINK_LINKED(uctx, link)) {
+ LOCK(&client->lock);
+ ISC_LIST_UNLINK(client->updatectxs, uctx, link);
+ UNLOCK(&client->lock);
+ }
+ if (uctx->updatemsg != NULL)
+ dns_message_destroy(&uctx->updatemsg);
+ while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) {
+ ISC_LIST_UNLINK(uctx->servers, sa, link);
+ isc_mem_put(client->mctx, sa, sizeof(*sa));
+ }
+ if (uctx->event != NULL)
+ isc_event_free(ISC_EVENT_PTR(&uctx->event));
+ if (uctx->tsigkey != NULL)
+ dns_tsigkey_detach(&uctx->tsigkey);
+ isc_task_detach(&clone);
+ DESTROYLOCK(&uctx->lock);
+ uctx->magic = 0;
+ isc_mem_put(client->mctx, uctx, sizeof(*uctx));
+ dns_view_detach(&view);
+
+ return (result);
+}
+
+void
+dns_client_cancelupdate(dns_clientupdatetrans_t *trans) {
+ updatectx_t *uctx;
+
+ REQUIRE(trans != NULL);
+ uctx = (updatectx_t *)trans;
+ REQUIRE(UCTX_VALID(uctx));
+
+ LOCK(&uctx->lock);
+
+ if (!uctx->canceled) {
+ uctx->canceled = ISC_TRUE;
+ if (uctx->updatereq != NULL)
+ dns_request_cancel(uctx->updatereq);
+ if (uctx->soareq != NULL)
+ dns_request_cancel(uctx->soareq);
+ if (uctx->restrans != NULL)
+ dns_client_cancelresolve(uctx->restrans);
+ if (uctx->restrans2 != NULL)
+ dns_client_cancelresolve(uctx->restrans2);
+ }
+
+ UNLOCK(&uctx->lock);
+}
+
+void
+dns_client_destroyupdatetrans(dns_clientupdatetrans_t **transp) {
+ updatectx_t *uctx;
+ isc_mem_t *mctx;
+ dns_client_t *client;
+ isc_boolean_t need_destroyclient = ISC_FALSE;
+ isc_sockaddr_t *sa;
+
+ REQUIRE(transp != NULL);
+ uctx = (updatectx_t *)*transp;
+ REQUIRE(UCTX_VALID(uctx));
+ client = uctx->client;
+ REQUIRE(DNS_CLIENT_VALID(client));
+ REQUIRE(uctx->updatereq == NULL && uctx->updatemsg == NULL &&
+ uctx->soareq == NULL && uctx->soaquery == NULL &&
+ uctx->event == NULL && uctx->tsigkey == NULL &&
+ uctx->sig0key == NULL);
+
+ mctx = client->mctx;
+ dns_view_detach(&uctx->view);
+ while ((sa = ISC_LIST_HEAD(uctx->servers)) != NULL) {
+ ISC_LIST_UNLINK(uctx->servers, sa, link);
+ isc_mem_put(mctx, sa, sizeof(*sa));
+ }
+
+ LOCK(&client->lock);
+
+ INSIST(ISC_LINK_LINKED(uctx, link));
+ ISC_LIST_UNLINK(client->updatectxs, uctx, link);
+
+ if (client->references == 0 && ISC_LIST_EMPTY(client->resctxs) &&
+ ISC_LIST_EMPTY(client->reqctxs) &&
+ ISC_LIST_EMPTY(client->updatectxs))
+ need_destroyclient = ISC_TRUE;
+
+ UNLOCK(&client->lock);
+
+ DESTROYLOCK(&uctx->lock);
+ uctx->magic = 0;
+
+ isc_mem_put(mctx, uctx, sizeof(*uctx));
+
+ if (need_destroyclient)
+ destroyclient(&client);
+
+ *transp = NULL;
+}
+
+isc_mem_t *
+dns_client_mctx(dns_client_t *client) {
+
+ REQUIRE(DNS_CLIENT_VALID(client));
+ return (client->mctx);
+}
+
+typedef struct {
+ isc_buffer_t buffer;
+ dns_rdataset_t rdataset;
+ dns_rdatalist_t rdatalist;
+ dns_rdata_t rdata;
+ size_t size;
+ isc_mem_t * mctx;
+ unsigned char data[FLEXIBLE_ARRAY_MEMBER];
+} dns_client_updaterec_t;
+
+isc_result_t
+dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
+ dns_rdatatype_t type, dns_rdata_t *source,
+ dns_ttl_t ttl, dns_name_t *target,
+ dns_rdataset_t *rdataset, dns_rdatalist_t *rdatalist,
+ dns_rdata_t *rdata, isc_mem_t *mctx)
+{
+ dns_client_updaterec_t *updaterec = NULL;
+ size_t size = offsetof(dns_client_updaterec_t, data);
+
+ REQUIRE(op < updateop_max);
+ REQUIRE(owner != NULL);
+ REQUIRE((rdataset != NULL && rdatalist != NULL && rdata != NULL) ||
+ (rdataset == NULL && rdatalist == NULL && rdata == NULL &&
+ mctx != NULL));
+ if (op == updateop_add)
+ REQUIRE(source != NULL);
+ if (source != NULL) {
+ REQUIRE(source->type == type);
+ REQUIRE(op == updateop_add || op == updateop_delete ||
+ op == updateop_exist);
+ }
+
+ size += owner->length;
+ if (source != NULL)
+ size += source->length;
+
+ if (rdataset == NULL) {
+ updaterec = isc_mem_get(mctx, size);
+ if (updaterec == NULL)
+ return (ISC_R_NOMEMORY);
+ rdataset = &updaterec->rdataset;
+ rdatalist = &updaterec->rdatalist;
+ rdata = &updaterec->rdata;
+ dns_rdataset_init(rdataset);
+ dns_rdatalist_init(&updaterec->rdatalist);
+ dns_rdata_init(&updaterec->rdata);
+ isc_buffer_init(&updaterec->buffer, updaterec->data,
+ size - offsetof(dns_client_updaterec_t, data));
+ dns_name_copy(owner, target, &updaterec->buffer);
+ if (source != NULL) {
+ isc_region_t r;
+ dns_rdata_clone(source, rdata);
+ dns_rdata_toregion(rdata, &r);
+ rdata->data = isc_buffer_used(&updaterec->buffer);
+ isc_buffer_copyregion(&updaterec->buffer, &r);
+ }
+ updaterec->mctx = NULL;
+ isc_mem_attach(mctx, &updaterec->mctx);
+ } else if (source != NULL)
+ dns_rdata_clone(source, rdata);
+
+ switch (op) {
+ case updateop_add:
+ break;
+ case updateop_delete:
+ if (source != NULL) {
+ ttl = 0;
+ dns_rdata_makedelete(rdata);
+ } else
+ dns_rdata_deleterrset(rdata, type);
+ break;
+ case updateop_notexist:
+ dns_rdata_notexist(rdata, type);
+ break;
+ case updateop_exist:
+ if (source == NULL) {
+ ttl = 0;
+ dns_rdata_exists(rdata, type);
+ }
+ case updateop_none:
+ break;
+ default:
+ INSIST(0);
+ }
+
+ rdatalist->type = rdata->type;
+ rdatalist->rdclass = rdata->rdclass;
+ if (source != NULL) {
+ rdatalist->covers = dns_rdata_covers(rdata);
+ rdatalist->ttl = ttl;
+ }
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ dns_rdatalist_tordataset(rdatalist, rdataset);
+ ISC_LIST_APPEND(target->list, rdataset, link);
+ if (updaterec != NULL) {
+ target->attributes |= DNS_NAMEATTR_HASUPDATEREC;
+ dns_name_setbuffer(target, &updaterec->buffer);
+ }
+ if (op == updateop_add || op == updateop_delete)
+ target->attributes |= DNS_NAMEATTR_UPDATE;
+ else
+ target->attributes |= DNS_NAMEATTR_PREREQUISITE;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_client_freeupdate(dns_name_t **namep) {
+ dns_client_updaterec_t *updaterec;
+ dns_rdatalist_t *rdatalist;
+ dns_rdataset_t *rdataset;
+ dns_rdata_t *rdata;
+ dns_name_t *name;
+
+ REQUIRE(namep != NULL && *namep != NULL);
+
+ name = *namep;
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_HEAD(name->list)) {
+ ISC_LIST_UNLINK(name->list, rdataset, link);
+ rdatalist = NULL;
+ dns_rdatalist_fromrdataset(rdataset, &rdatalist);
+ if (rdatalist == NULL) {
+ dns_rdataset_disassociate(rdataset);
+ continue;
+ }
+ for (rdata = ISC_LIST_HEAD(rdatalist->rdata);
+ rdata != NULL;
+ rdata = ISC_LIST_HEAD(rdatalist->rdata))
+ ISC_LIST_UNLINK(rdatalist->rdata, rdata, link);
+ dns_rdataset_disassociate(rdataset);
+ }
+
+ if ((name->attributes & DNS_NAMEATTR_HASUPDATEREC) != 0) {
+ updaterec = (dns_client_updaterec_t *)name->buffer;
+ INSIST(updaterec != NULL);
+ isc_mem_putanddetach(&updaterec->mctx, updaterec,
+ updaterec->size);
+ *namep = NULL;
+ }
+}
diff --git a/contrib/bind9/lib/dns/db.c b/contrib/bind9/lib/dns/db.c
index f52f674..c74d24d 100644
--- a/contrib/bind9/lib/dns/db.c
+++ b/contrib/bind9/lib/dns/db.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: db.c,v 1.88.50.2 2009-06-23 00:19:34 tbox Exp $ */
+/* $Id: db.c,v 1.97 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -34,10 +34,12 @@
#include <dns/callbacks.h>
#include <dns/db.h>
+#include <dns/dbiterator.h>
#include <dns/log.h>
#include <dns/master.h>
#include <dns/rdata.h>
#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
#include <dns/result.h>
/***
@@ -61,14 +63,18 @@ struct dns_dbimplementation {
*/
#include "rbtdb.h"
+#ifdef BIND9
#include "rbtdb64.h"
+#endif
static ISC_LIST(dns_dbimplementation_t) implementations;
static isc_rwlock_t implock;
static isc_once_t once = ISC_ONCE_INIT;
static dns_dbimplementation_t rbtimp;
+#ifdef BIND9
static dns_dbimplementation_t rbt64imp;
+#endif
static void
initialize(void) {
@@ -80,15 +86,19 @@ initialize(void) {
rbtimp.driverarg = NULL;
ISC_LINK_INIT(&rbtimp, link);
+#ifdef BIND9
rbt64imp.name = "rbt64";
rbt64imp.create = dns_rbtdb64_create;
rbt64imp.mctx = NULL;
rbt64imp.driverarg = NULL;
ISC_LINK_INIT(&rbt64imp, link);
+#endif
ISC_LIST_INIT(implementations);
ISC_LIST_APPEND(implementations, &rbtimp, link);
+#ifdef BIND9
ISC_LIST_APPEND(implementations, &rbt64imp, link);
+#endif
}
static inline dns_dbimplementation_t *
@@ -290,6 +300,7 @@ dns_db_class(dns_db_t *db) {
return (db->rdclass);
}
+#ifdef BIND9
isc_result_t
dns_db_beginload(dns_db_t *db, dns_addrdatasetfunc_t *addp,
dns_dbload_t **dbloadp) {
@@ -318,14 +329,19 @@ dns_db_endload(dns_db_t *db, dns_dbload_t **dbloadp) {
isc_result_t
dns_db_load(dns_db_t *db, const char *filename) {
- return (dns_db_load2(db, filename, dns_masterformat_text));
+ return (dns_db_load3(db, filename, dns_masterformat_text, 0));
}
isc_result_t
dns_db_load2(dns_db_t *db, const char *filename, dns_masterformat_t format) {
+ return (dns_db_load3(db, filename, format, 0));
+}
+
+isc_result_t
+dns_db_load3(dns_db_t *db, const char *filename, dns_masterformat_t format,
+ unsigned int options) {
isc_result_t result, eresult;
dns_rdatacallbacks_t callbacks;
- unsigned int options = 0;
/*
* Load master file 'filename' into 'db'.
@@ -376,6 +392,7 @@ dns_db_dump2(dns_db_t *db, dns_dbversion_t *version, const char *filename,
return ((db->methods->dump)(db, version, filename, masterformat));
}
+#endif /* BIND9 */
/***
*** Version Methods
@@ -921,8 +938,27 @@ dns_db_getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, dns_name_t *name)
}
void
-dns_db_resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
+dns_db_resigned(dns_db_t *db, dns_rdataset_t *rdataset,
+ dns_dbversion_t *version)
{
if (db->methods->resigned != NULL)
(db->methods->resigned)(db, rdataset, version);
}
+
+void
+dns_db_rpz_enabled(dns_db_t *db, dns_rpz_st_t *st)
+{
+ if (db->methods->rpz_enabled != NULL)
+ (db->methods->rpz_enabled)(db, st);
+}
+
+isc_result_t
+dns_db_rpz_findips(dns_rpz_zone_t *rpz, dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_rdataset_t *ardataset, dns_rpz_st_t *st)
+{
+ if (db->methods->rpz_findips == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+ return ((db->methods->rpz_findips)(rpz, rpz_type, zone, db, version,
+ ardataset, st));
+}
diff --git a/contrib/bind9/lib/dns/diff.c b/contrib/bind9/lib/dns/diff.c
index a92a496..3dbb5cf 100644
--- a/contrib/bind9/lib/dns/diff.c
+++ b/contrib/bind9/lib/dns/diff.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: diff.c,v 1.18.50.2 2009-01-05 23:47:22 tbox Exp $ */
+/* $Id: diff.c,v 1.23 2009-12-01 00:47:09 each Exp $ */
/*! \file */
@@ -387,10 +387,22 @@ diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver,
* from a server that is not as careful.
* Issue a warning and continue.
*/
- if (warn)
+ if (warn) {
+ char classbuf[DNS_RDATATYPE_FORMATSIZE];
+ char namebuf[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(dns_db_origin(db),
+ namebuf,
+ sizeof(namebuf));
+ dns_rdataclass_format(dns_db_class(db),
+ classbuf,
+ sizeof(classbuf));
isc_log_write(DIFF_COMMON_LOGARGS,
ISC_LOG_WARNING,
- "update with no effect");
+ "%s/%s: dns_diff_apply: "
+ "update with no effect",
+ namebuf, classbuf);
+ }
} else if (result == DNS_R_NXRRSET) {
/*
* OK.
@@ -478,6 +490,7 @@ dns_diff_load(dns_diff_t *diff, dns_addrdatasetfunc_t addfunc,
if (result == DNS_R_UNCHANGED) {
isc_log_write(DIFF_COMMON_LOGARGS,
ISC_LOG_WARNING,
+ "dns_diff_load: "
"update with no effect");
} else if (result == ISC_R_SUCCESS ||
result == DNS_R_NXRRSET) {
diff --git a/contrib/bind9/lib/dns/dispatch.c b/contrib/bind9/lib/dns/dispatch.c
index 632d349..c074911 100644
--- a/contrib/bind9/lib/dns/dispatch.c
+++ b/contrib/bind9/lib/dns/dispatch.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dispatch.c,v 1.155.12.11 2009-12-02 23:26:28 marka Exp $ */
+/* $Id: dispatch.c,v 1.168.248.1.2.1 2011-06-02 23:47:34 tbox Exp $ */
/*! \file */
@@ -417,7 +417,7 @@ request_log(dns_dispatch_t *disp, dns_dispentry_t *resp,
/*%
* ARC4 random number generator derived from OpenBSD.
- * Only dispatch_arc4random() and dispatch_arc4uniformrandom() are expected
+ * Only dispatch_random() and dispatch_uniformrandom() are expected
* to be called from general dispatch routines; the rest of them are subroutines
* for these two.
*
@@ -437,8 +437,11 @@ request_log(dns_dispatch_t *disp, dns_dispentry_t *resp,
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef BIND9
static void
-dispatch_arc4init(arc4ctx_t *actx, isc_entropy_t *entropy, isc_mutex_t *lock) {
+dispatch_initrandom(arc4ctx_t *actx, isc_entropy_t *entropy,
+ isc_mutex_t *lock)
+{
int n;
for (n = 0; n < 256; n++)
actx->s[n] = n;
@@ -527,7 +530,7 @@ dispatch_arc4stir(arc4ctx_t *actx) {
}
static isc_uint16_t
-dispatch_arc4random(arc4ctx_t *actx) {
+dispatch_random(arc4ctx_t *actx) {
isc_uint16_t result;
if (actx->lock != NULL)
@@ -543,9 +546,38 @@ dispatch_arc4random(arc4ctx_t *actx) {
return (result);
}
+#else
+/*
+ * For general purpose library, we don't have to be too strict about the
+ * quality of random values. Performance doesn't matter much, either.
+ * So we simply use the isc_random module to keep the library as small as
+ * possible.
+ */
+
+static void
+dispatch_initrandom(arc4ctx_t *actx, isc_entropy_t *entropy,
+ isc_mutex_t *lock)
+{
+ UNUSED(actx);
+ UNUSED(entropy);
+ UNUSED(lock);
+
+ return;
+}
static isc_uint16_t
-dispatch_arc4uniformrandom(arc4ctx_t *actx, isc_uint16_t upper_bound) {
+dispatch_random(arc4ctx_t *actx) {
+ isc_uint32_t r;
+
+ UNUSED(actx);
+
+ isc_random_get(&r);
+ return (r & 0xffff);
+}
+#endif /* BIND9 */
+
+static isc_uint16_t
+dispatch_uniformrandom(arc4ctx_t *actx, isc_uint16_t upper_bound) {
isc_uint16_t min, r;
if (upper_bound < 2)
@@ -568,7 +600,7 @@ dispatch_arc4uniformrandom(arc4ctx_t *actx, isc_uint16_t upper_bound) {
* to re-roll.
*/
for (;;) {
- r = dispatch_arc4random(actx);
+ r = dispatch_random(actx);
if (r >= min)
break;
}
@@ -859,7 +891,7 @@ get_dispsocket(dns_dispatch_t *disp, isc_sockaddr_t *dest,
*/
localaddr = disp->local;
for (i = 0; i < 64; i++) {
- port = ports[dispatch_arc4uniformrandom(DISP_ARC4CTX(disp),
+ port = ports[dispatch_uniformrandom(DISP_ARC4CTX(disp),
nports)];
isc_sockaddr_setport(&localaddr, port);
@@ -964,6 +996,7 @@ deactivate_dispsocket(dns_dispatch_t *disp, dispsocket_t *dispsock) {
INSIST(dispsock->portentry != NULL);
deref_portentry(disp, &dispsock->portentry);
+#ifdef BIND9
if (disp->nsockets > DNS_DISPATCH_POOLSOCKS)
destroy_dispsocket(disp, &dispsock);
else {
@@ -987,6 +1020,13 @@ deactivate_dispsocket(dns_dispatch_t *disp, dispsocket_t *dispsock) {
destroy_dispsocket(disp, &dispsock);
}
}
+#else
+ /* This kind of optimization isn't necessary for normal use */
+ UNUSED(qid);
+ UNUSED(result);
+
+ destroy_dispsocket(disp, &dispsock);
+#endif
}
/*
@@ -1707,13 +1747,17 @@ destroy_mgr(dns_dispatchmgr_t **mgrp) {
isc_mempool_destroy(&mgr->epool);
isc_mempool_destroy(&mgr->rpool);
isc_mempool_destroy(&mgr->dpool);
- isc_mempool_destroy(&mgr->bpool);
- isc_mempool_destroy(&mgr->spool);
+ if (mgr->bpool != NULL)
+ isc_mempool_destroy(&mgr->bpool);
+ if (mgr->spool != NULL)
+ isc_mempool_destroy(&mgr->spool);
DESTROYLOCK(&mgr->pool_lock);
+#ifdef BIND9
if (mgr->entropy != NULL)
isc_entropy_detach(&mgr->entropy);
+#endif /* BIND9 */
if (mgr->qid != NULL)
qid_destroy(mctx, &mgr->qid);
@@ -1752,9 +1796,13 @@ open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
return (result);
isc_socket_setname(sock, "dispatcher", NULL);
} else {
+#ifdef BIND9
result = isc_socket_open(sock);
if (result != ISC_R_SUCCESS)
return (result);
+#else
+ INSIST(0);
+#endif
}
#ifndef ISC_ALLOW_MAPPED
@@ -1764,8 +1812,13 @@ open_socket(isc_socketmgr_t *mgr, isc_sockaddr_t *local,
if (result != ISC_R_SUCCESS) {
if (*sockp == NULL)
isc_socket_detach(&sock);
- else
+ else {
+#ifdef BIND9
isc_socket_close(sock);
+#else
+ INSIST(0);
+#endif
+ }
return (result);
}
@@ -1897,10 +1950,14 @@ dns_dispatchmgr_create(isc_mem_t *mctx, isc_entropy_t *entropy,
if (result != ISC_R_SUCCESS)
goto kill_dpool;
+#ifdef BIND9
if (entropy != NULL)
isc_entropy_attach(entropy, &mgr->entropy);
+#else
+ UNUSED(entropy);
+#endif
- dispatch_arc4init(&mgr->arc4ctx, mgr->entropy, &mgr->arc4_lock);
+ dispatch_initrandom(&mgr->arc4ctx, mgr->entropy, &mgr->arc4_lock);
*mgrp = mgr;
return (ISC_R_SUCCESS);
@@ -2411,7 +2468,7 @@ dispatch_allocate(dns_dispatchmgr_t *mgr, unsigned int maxrequests,
ISC_LIST_INIT(disp->activesockets);
ISC_LIST_INIT(disp->inactivesockets);
disp->nsockets = 0;
- dispatch_arc4init(&disp->arc4ctx, mgr->entropy, NULL);
+ dispatch_initrandom(&disp->arc4ctx, mgr->entropy, NULL);
disp->port_table = NULL;
disp->portpool = NULL;
@@ -2708,7 +2765,7 @@ get_udpsocket(dns_dispatchmgr_t *mgr, dns_dispatch_t *disp,
for (i = 0; i < 1024; i++) {
in_port_t prt;
- prt = ports[dispatch_arc4uniformrandom(
+ prt = ports[dispatch_uniformrandom(
DISP_ARC4CTX(disp),
nports)];
isc_sockaddr_setport(&localaddr_bound, prt);
@@ -2844,8 +2901,10 @@ dispatch_createudp(dns_dispatchmgr_t *mgr, isc_socketmgr_t *sockmgr,
disp->task[i] = NULL;
result = isc_task_create(taskmgr, 0, &disp->task[i]);
if (result != ISC_R_SUCCESS) {
- while (--i >= 0)
- isc_task_destroy(&disp->task[i]);
+ while (--i >= 0) {
+ isc_task_shutdown(disp->task[i]);
+ isc_task_detach(&disp->task[i]);
+ }
goto kill_socket;
}
isc_task_setname(disp->task[i], "udpdispatch", disp);
@@ -3045,7 +3104,7 @@ dns_dispatch_addresponse2(dns_dispatch_t *disp, isc_sockaddr_t *dest,
/*
* Try somewhat hard to find an unique ID.
*/
- id = (dns_messageid_t)dispatch_arc4random(DISP_ARC4CTX(disp));
+ id = (dns_messageid_t)dispatch_random(DISP_ARC4CTX(disp));
bucket = dns_hash(qid, dest, id, localport);
ok = ISC_FALSE;
for (i = 0; i < 64; i++) {
diff --git a/contrib/bind9/lib/dns/dlz.c b/contrib/bind9/lib/dns/dlz.c
index f848230..5a508e9 100644
--- a/contrib/bind9/lib/dns/dlz.c
+++ b/contrib/bind9/lib/dns/dlz.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlz.c,v 1.5.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: dlz.c,v 1.10 2010-12-20 23:47:20 tbox Exp $ */
/*! \file */
@@ -64,6 +64,8 @@
#include <dns/log.h>
#include <dns/master.h>
#include <dns/dlz.h>
+#include <dns/ssu.h>
+#include <dns/zone.h>
#include <isc/buffer.h>
@@ -230,6 +232,12 @@ dns_dlzdestroy(dns_dlzdb_t **dbp) {
*/
REQUIRE(dbp != NULL && DNS_DLZ_VALID(*dbp));
+#ifdef BIND9
+ if ((*dbp)->ssutable != NULL) {
+ dns_ssutable_detach(&(*dbp)->ssutable);
+ }
+#endif
+
/* call the drivers destroy method */
if ((*dbp) != NULL) {
mctx = (*dbp)->mctx;
@@ -499,7 +507,7 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp) {
mctx = dlz_imp->mctx;
/*
- * return the memory back to the available memory pool and
+ * Return the memory back to the available memory pool and
* remove it from the memory context.
*/
isc_mem_put(mctx, dlz_imp, sizeof(dns_dlzimplementation_t));
@@ -508,3 +516,143 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp) {
/* Unlock the dlz_implementations list. */
RWUNLOCK(&dlz_implock, isc_rwlocktype_write);
}
+
+#ifdef BIND9
+/*
+ * Create a writeable DLZ zone. This can be called by DLZ drivers
+ * during configure() to create a zone that can be updated. The zone
+ * type is set to dns_zone_dlz, which is equivalent to a master zone
+ *
+ * This function uses a callback setup in dns_dlzconfigure() to call
+ * into the server zone code to setup the remaining pieces of server
+ * specific functionality on the zone
+ */
+isc_result_t
+dns_dlz_writeablezone(dns_view_t *view, const char *zone_name) {
+ dns_zone_t *zone = NULL;
+ dns_zone_t *dupzone = NULL;
+ isc_result_t result;
+ isc_buffer_t buffer;
+ dns_fixedname_t fixorigin;
+ dns_name_t *origin;
+ dns_rdataclass_t zclass;
+ dns_dlzdb_t *dlzdatabase;
+
+ REQUIRE(DNS_DLZ_VALID(view->dlzdatabase));
+
+ dlzdatabase = view->dlzdatabase;
+
+ REQUIRE(dlzdatabase->configure_callback != NULL);
+
+ isc_buffer_init(&buffer, zone_name, strlen(zone_name));
+ isc_buffer_add(&buffer, strlen(zone_name));
+ dns_fixedname_init(&fixorigin);
+ result = dns_name_fromtext(dns_fixedname_name(&fixorigin),
+ &buffer, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ origin = dns_fixedname_name(&fixorigin);
+
+ zclass = view->rdclass;
+
+ /* See if the zone already exists */
+ result = dns_view_findzone(view, origin, &dupzone);
+ if (result == ISC_R_SUCCESS) {
+ dns_zone_detach(&dupzone);
+ result = ISC_R_EXISTS;
+ goto cleanup;
+ }
+ INSIST(dupzone == NULL);
+
+ /* Create it */
+ result = dns_zone_create(&zone, view->mctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_zone_setorigin(zone, origin);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ dns_zone_setview(zone, view);
+
+ dns_zone_setadded(zone, ISC_TRUE);
+
+ if (dlzdatabase->ssutable == NULL) {
+ result = dns_ssutable_createdlz(dlzdatabase->mctx,
+ &dlzdatabase->ssutable,
+ view->dlzdatabase);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+ dns_zone_setssutable(zone, dlzdatabase->ssutable);
+
+ result = dlzdatabase->configure_callback(view, zone);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /*
+ * Add the zone to its view in the new view list.
+ */
+ result = dns_view_addzone(view, zone);
+
+ result = ISC_R_SUCCESS;
+
+ cleanup:
+ if (zone != NULL)
+ dns_zone_detach(&zone);
+
+ return (result);
+}
+#endif
+
+/*%
+ * Configure a DLZ driver. This is optional, and if supplied gives
+ * the backend an opportunity to configure parameters related to DLZ.
+ */
+isc_result_t
+dns_dlzconfigure(dns_view_t *view, isc_result_t (*callback)(dns_view_t *,
+ dns_zone_t *))
+{
+ dns_dlzimplementation_t *impl;
+ dns_dlzdb_t *dlzdatabase;
+ isc_result_t result;
+
+ REQUIRE(view != NULL);
+ REQUIRE(DNS_DLZ_VALID(view->dlzdatabase));
+ REQUIRE(view->dlzdatabase->implementation != NULL);
+
+ dlzdatabase = view->dlzdatabase;
+ impl = dlzdatabase->implementation;
+
+ if (impl->methods->configure == NULL)
+ return (ISC_R_SUCCESS);
+
+ dlzdatabase->configure_callback = callback;
+
+ result = impl->methods->configure(impl->driverarg,
+ dlzdatabase->dbdata, view);
+ return (result);
+}
+
+isc_boolean_t
+dns_dlz_ssumatch(dns_dlzdb_t *dlzdatabase,
+ dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key)
+{
+ dns_dlzimplementation_t *impl;
+ isc_boolean_t r;
+
+ REQUIRE(dlzdatabase != NULL);
+ REQUIRE(dlzdatabase->implementation != NULL);
+ REQUIRE(dlzdatabase->implementation->methods != NULL);
+ impl = dlzdatabase->implementation;
+
+ if (impl->methods->ssumatch == NULL) {
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_DLZ, ISC_LOG_INFO,
+ "No ssumatch method for DLZ database");
+ return (ISC_FALSE);
+ }
+
+ r = impl->methods->ssumatch(signer, name, tcpaddr, type, key,
+ impl->driverarg, dlzdatabase->dbdata);
+ return (r);
+}
diff --git a/contrib/bind9/lib/dns/dns64.c b/contrib/bind9/lib/dns/dns64.c
new file mode 100644
index 0000000..180c0a9
--- /dev/null
+++ b/contrib/bind9/lib/dns/dns64.c
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dns64.c,v 1.6 2010-12-09 04:59:09 marka Exp $ */
+
+#include <config.h>
+
+#include <isc/list.h>
+#include <isc/mem.h>
+#include <isc/netaddr.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/acl.h>
+#include <dns/dns64.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/result.h>
+
+struct dns_dns64 {
+ unsigned char bits[16]; /*
+ * Prefix + suffix bits.
+ */
+ dns_acl_t * clients; /*
+ * Which clients get mapped
+ * addresses.
+ */
+ dns_acl_t * mapped; /*
+ * IPv4 addresses to be mapped.
+ */
+ dns_acl_t * excluded; /*
+ * IPv6 addresses that are
+ * treated as not existing.
+ */
+ unsigned int prefixlen; /*
+ * Start of mapped address.
+ */
+ unsigned int flags;
+ isc_mem_t * mctx;
+ ISC_LINK(dns_dns64_t) link;
+};
+
+isc_result_t
+dns_dns64_create(isc_mem_t *mctx, isc_netaddr_t *prefix,
+ unsigned int prefixlen, isc_netaddr_t *suffix,
+ dns_acl_t *clients, dns_acl_t *mapped, dns_acl_t *excluded,
+ unsigned int flags, dns_dns64_t **dns64)
+{
+ dns_dns64_t *new;
+ unsigned int nbytes = 16;
+
+ REQUIRE(prefix != NULL && prefix->family == AF_INET6);
+ /* Legal prefix lengths from draft-ietf-behave-address-format-04. */
+ REQUIRE(prefixlen == 32 || prefixlen == 40 || prefixlen == 48 ||
+ prefixlen == 56 || prefixlen == 64 || prefixlen == 96);
+ REQUIRE(isc_netaddr_prefixok(prefix, prefixlen) == ISC_R_SUCCESS);
+ REQUIRE(dns64 != NULL && *dns64 == NULL);
+
+ if (suffix != NULL) {
+ static const unsigned char zeros[16];
+ REQUIRE(prefix->family == AF_INET6);
+ nbytes = prefixlen / 8 + 4;
+ /* Bits 64-71 are zeros. draft-ietf-behave-address-format-04 */
+ if (prefixlen >= 32 && prefixlen <= 64)
+ nbytes++;
+ REQUIRE(memcmp(suffix->type.in6.s6_addr, zeros, nbytes) == 0);
+ }
+
+ new = isc_mem_get(mctx, sizeof(dns_dns64_t));
+ if (new == NULL)
+ return (ISC_R_NOMEMORY);
+ memset(new->bits, 0, sizeof(new->bits));
+ memcpy(new->bits, prefix->type.in6.s6_addr, prefixlen / 8);
+ if (suffix != NULL)
+ memcpy(new->bits + nbytes, suffix->type.in6.s6_addr + nbytes,
+ 16 - nbytes);
+ new->clients = NULL;
+ if (clients != NULL)
+ dns_acl_attach(clients, &new->clients);
+ new->mapped = NULL;
+ if (mapped != NULL)
+ dns_acl_attach(mapped, &new->mapped);
+ new->excluded = NULL;
+ if (excluded != NULL)
+ dns_acl_attach(excluded, &new->excluded);
+ new->prefixlen = prefixlen;
+ new->flags = flags;
+ ISC_LINK_INIT(new, link);
+ new->mctx = NULL;
+ isc_mem_attach(mctx, &new->mctx);
+ *dns64 = new;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_dns64_destroy(dns_dns64_t **dns64p) {
+ dns_dns64_t *dns64;
+
+ REQUIRE(dns64p != NULL && *dns64p != NULL);
+
+ dns64 = *dns64p;
+ *dns64p = NULL;
+
+ REQUIRE(!ISC_LINK_LINKED(dns64, link));
+
+ if (dns64->clients != NULL)
+ dns_acl_detach(&dns64->clients);
+ if (dns64->mapped != NULL)
+ dns_acl_detach(&dns64->mapped);
+ if (dns64->excluded != NULL)
+ dns_acl_detach(&dns64->excluded);
+ isc_mem_putanddetach(&dns64->mctx, dns64, sizeof(*dns64));
+}
+
+isc_result_t
+dns_dns64_aaaafroma(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, unsigned char *a, unsigned char *aaaa)
+{
+ unsigned int nbytes, i;
+ isc_result_t result;
+ int match;
+
+ if ((dns64->flags & DNS_DNS64_RECURSIVE_ONLY) != 0 &&
+ (flags & DNS_DNS64_RECURSIVE) == 0)
+ return (DNS_R_DISALLOWED);
+
+ if ((dns64->flags & DNS_DNS64_BREAK_DNSSEC) == 0 &&
+ (flags & DNS_DNS64_DNSSEC) != 0)
+ return (DNS_R_DISALLOWED);
+
+ if (dns64->clients != NULL) {
+ result = dns_acl_match(reqaddr, reqsigner, dns64->clients, env,
+ &match, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (match <= 0)
+ return (DNS_R_DISALLOWED);
+ }
+
+ if (dns64->mapped != NULL) {
+ struct in_addr ina;
+ isc_netaddr_t netaddr;
+
+ memcpy(&ina.s_addr, a, 4);
+ isc_netaddr_fromin(&netaddr, &ina);
+ result = dns_acl_match(&netaddr, NULL, dns64->mapped, env,
+ &match, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ if (match <= 0)
+ return (DNS_R_DISALLOWED);
+ }
+
+ nbytes = dns64->prefixlen / 8;
+ INSIST(nbytes <= 12);
+ /* Copy prefix. */
+ memcpy(aaaa, dns64->bits, nbytes);
+ /* Bits 64-71 are zeros. draft-ietf-behave-address-format-04 */
+ if (nbytes == 8)
+ aaaa[nbytes++] = 0;
+ /* Copy mapped address. */
+ for (i = 0; i < 4U; i++) {
+ aaaa[nbytes++] = a[i];
+ /* Bits 64-71 are zeros. draft-ietf-behave-address-format-04 */
+ if (nbytes == 8)
+ aaaa[nbytes++] = 0;
+ }
+ /* Copy suffix. */
+ memcpy(aaaa + nbytes, dns64->bits + nbytes, 16 - nbytes);
+ return (ISC_R_SUCCESS);
+}
+
+dns_dns64_t *
+dns_dns64_next(dns_dns64_t *dns64) {
+ dns64 = ISC_LIST_NEXT(dns64, link);
+ return (dns64);
+}
+
+void
+dns_dns64_append(dns_dns64list_t *list, dns_dns64_t *dns64) {
+ ISC_LIST_APPEND(*list, dns64, link);
+}
+
+void
+dns_dns64_unlink(dns_dns64list_t *list, dns_dns64_t *dns64) {
+ ISC_LIST_UNLINK(*list, dns64, link);
+}
+
+isc_boolean_t
+dns_dns64_aaaaok(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, dns_rdataset_t *rdataset,
+ isc_boolean_t *aaaaok, size_t aaaaoklen)
+{
+ struct in6_addr in6;
+ isc_netaddr_t netaddr;
+ isc_result_t result;
+ int match;
+ isc_boolean_t answer = ISC_FALSE;
+ isc_boolean_t found = ISC_FALSE;
+ unsigned int i, ok;
+
+ REQUIRE(rdataset != NULL);
+ REQUIRE(rdataset->type == dns_rdatatype_aaaa);
+ REQUIRE(rdataset->rdclass == dns_rdataclass_in);
+ if (aaaaok != NULL)
+ REQUIRE(aaaaoklen == dns_rdataset_count(rdataset));
+
+ for (;dns64 != NULL; dns64 = ISC_LIST_NEXT(dns64, link)) {
+ if ((dns64->flags & DNS_DNS64_RECURSIVE_ONLY) != 0 &&
+ (flags & DNS_DNS64_RECURSIVE) == 0)
+ continue;
+
+ if ((dns64->flags & DNS_DNS64_BREAK_DNSSEC) == 0 &&
+ (flags & DNS_DNS64_DNSSEC) != 0)
+ continue;
+ /*
+ * Work out if this dns64 structure applies to this client.
+ */
+ if (dns64->clients != NULL) {
+ result = dns_acl_match(reqaddr, reqsigner,
+ dns64->clients, env,
+ &match, NULL);
+ if (result != ISC_R_SUCCESS)
+ continue;
+ if (match <= 0)
+ continue;
+ }
+
+ if (!found && aaaaok != NULL) {
+ for (i = 0; i < aaaaoklen; i++)
+ aaaaok[i] = ISC_FALSE;
+ }
+ found = ISC_TRUE;
+
+ /*
+ * If we are not excluding any addresses then any AAAA
+ * will do.
+ */
+ if (dns64->excluded == NULL) {
+ answer = ISC_TRUE;
+ for (i = 0; i < aaaaoklen; i++)
+ aaaaok[i] = ISC_TRUE;
+ goto done;
+ }
+
+ i = 0; ok = 0;
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ if (aaaaok == NULL || !aaaaok[i]) {
+
+ dns_rdataset_current(rdataset, &rdata);
+ memcpy(&in6.s6_addr, rdata.data, 16);
+ isc_netaddr_fromin6(&netaddr, &in6);
+
+ result = dns_acl_match(&netaddr, NULL,
+ dns64->excluded,
+ env, &match, NULL);
+ if (result == ISC_R_SUCCESS && match <= 0) {
+ answer = ISC_TRUE;
+ if (aaaaok == NULL)
+ goto done;
+ aaaaok[i] = ISC_TRUE;
+ ok++;
+ }
+ } else
+ ok++;
+ i++;
+ }
+ /*
+ * Are all addresses ok?
+ */
+ if (aaaaok != NULL && ok == aaaaoklen)
+ goto done;
+ }
+
+ done:
+ if (!found && aaaaok != NULL) {
+ for (i = 0; i < aaaaoklen; i++)
+ aaaaok[i] = ISC_TRUE;
+ }
+ return (found ? answer : ISC_TRUE);
+}
diff --git a/contrib/bind9/lib/dns/dnssec.c b/contrib/bind9/lib/dns/dnssec.c
index 67a2c67..dc249b7 100644
--- a/contrib/bind9/lib/dns/dnssec.c
+++ b/contrib/bind9/lib/dns/dnssec.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: dnssec.c,v 1.93.12.6 2009-06-22 23:47:18 tbox Exp $
+ * $Id: dnssec.c,v 1.119 2010-01-13 23:48:59 tbox Exp $
*/
/*! \file */
@@ -26,15 +26,18 @@
#include <stdlib.h>
#include <isc/buffer.h>
+#include <isc/dir.h>
#include <isc/mem.h>
#include <isc/serial.h>
#include <isc/string.h>
#include <isc/util.h>
#include <dns/db.h>
+#include <dns/diff.h>
#include <dns/dnssec.h>
#include <dns/fixedname.h>
#include <dns/keyvalues.h>
+#include <dns/log.h>
#include <dns/message.h>
#include <dns/rdata.h>
#include <dns/rdatalist.h>
@@ -539,6 +542,59 @@ dns_dnssec_verify(dns_name_t *name, dns_rdataset_t *set, dst_key_t *key,
return (result);
}
+static isc_boolean_t
+key_active(dst_key_t *key) {
+ isc_result_t result;
+ isc_stdtime_t now, publish, active, revoke, inactive, delete;
+ isc_boolean_t pubset = ISC_FALSE, actset = ISC_FALSE;
+ isc_boolean_t revset = ISC_FALSE, inactset = ISC_FALSE;
+ isc_boolean_t delset = ISC_FALSE;
+ int major, minor;
+
+ /* Is this an old-style key? */
+ result = dst_key_getprivateformat(key, &major, &minor);
+
+ /*
+ * Smart signing started with key format 1.3; prior to that, all
+ * keys are assumed active
+ */
+ if (major == 1 && minor <= 2)
+ return (ISC_TRUE);
+
+ isc_stdtime_get(&now);
+
+ result = dst_key_gettime(key, DST_TIME_PUBLISH, &publish);
+ if (result == ISC_R_SUCCESS)
+ pubset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_ACTIVATE, &active);
+ if (result == ISC_R_SUCCESS)
+ actset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_REVOKE, &revoke);
+ if (result == ISC_R_SUCCESS)
+ revset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_INACTIVE, &inactive);
+ if (result == ISC_R_SUCCESS)
+ inactset = ISC_TRUE;
+
+ result = dst_key_gettime(key, DST_TIME_DELETE, &delete);
+ if (result == ISC_R_SUCCESS)
+ delset = ISC_TRUE;
+
+ if ((inactset && inactive <= now) || (delset && delete <= now))
+ return (ISC_FALSE);
+
+ if (revset && revoke <= now && pubset && publish <= now)
+ return (ISC_TRUE);
+
+ if (actset && active <= now)
+ return (ISC_TRUE);
+
+ return (ISC_FALSE);
+}
+
#define is_zone_key(key) ((dst_key_flags(key) & DNS_KEYFLAG_OWNERMASK) \
== DNS_KEYOWNER_ZONE)
@@ -580,14 +636,70 @@ dns_dnssec_findzonekeys2(dns_db_t *db, dns_dbversion_t *ver,
DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
directory,
mctx, &keys[count]);
+
+ /*
+ * If the key was revoked and the private file
+ * doesn't exist, maybe it was revoked internally
+ * by named. Try loading the unrevoked version.
+ */
if (result == ISC_R_FILENOTFOUND) {
+ isc_uint32_t flags;
+ flags = dst_key_flags(pubkey);
+ if ((flags & DNS_KEYFLAG_REVOKE) != 0) {
+ dst_key_setflags(pubkey,
+ flags & ~DNS_KEYFLAG_REVOKE);
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|
+ DST_TYPE_PRIVATE,
+ directory,
+ mctx, &keys[count]);
+ if (result == ISC_R_SUCCESS &&
+ dst_key_pubcompare(pubkey, keys[count],
+ ISC_FALSE)) {
+ dst_key_setflags(keys[count], flags);
+ }
+ dst_key_setflags(pubkey, flags);
+ }
+ }
+
+ if (result != ISC_R_SUCCESS) {
+ char keybuf[DNS_NAME_FORMATSIZE];
+ char algbuf[DNS_SECALG_FORMATSIZE];
+ dns_name_format(dst_key_name(pubkey), keybuf,
+ sizeof(keybuf));
+ dns_secalg_format(dst_key_alg(pubkey), algbuf,
+ sizeof(algbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_DNSSEC, ISC_LOG_WARNING,
+ "dns_dnssec_findzonekeys2: error "
+ "reading private key file %s/%s/%d: %s",
+ keybuf, algbuf, dst_key_id(pubkey),
+ isc_result_totext(result));
+ }
+
+ if (result == ISC_R_FILENOTFOUND || result == ISC_R_NOPERM) {
keys[count] = pubkey;
pubkey = NULL;
count++;
goto next;
}
+
if (result != ISC_R_SUCCESS)
goto failure;
+
+ /*
+ * If a key is marked inactive, skip it
+ */
+ if (!key_active(keys[count])) {
+ dst_key_free(&keys[count]);
+ keys[count] = pubkey;
+ pubkey = NULL;
+ count++;
+ goto next;
+ }
+
if ((dst_key_flags(keys[count]) & DNS_KEYTYPE_NOAUTH) != 0) {
/* We should never get here. */
dst_key_free(&keys[count]);
@@ -951,3 +1063,691 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name,
dst_key_free(&dstkey);
return (ISC_FALSE);
}
+
+isc_result_t
+dns_dnsseckey_create(isc_mem_t *mctx, dst_key_t **dstkey,
+ dns_dnsseckey_t **dkp)
+{
+ isc_result_t result;
+ dns_dnsseckey_t *dk;
+ int major, minor;
+
+ REQUIRE(dkp != NULL && *dkp == NULL);
+ dk = isc_mem_get(mctx, sizeof(dns_dnsseckey_t));
+ if (dk == NULL)
+ return (ISC_R_NOMEMORY);
+
+ dk->key = *dstkey;
+ *dstkey = NULL;
+ dk->force_publish = ISC_FALSE;
+ dk->force_sign = ISC_FALSE;
+ dk->hint_publish = ISC_FALSE;
+ dk->hint_sign = ISC_FALSE;
+ dk->hint_remove = ISC_FALSE;
+ dk->first_sign = ISC_FALSE;
+ dk->is_active = ISC_FALSE;
+ dk->prepublish = 0;
+ dk->source = dns_keysource_unknown;
+ dk->index = 0;
+
+ /* KSK or ZSK? */
+ dk->ksk = ISC_TF((dst_key_flags(dk->key) & DNS_KEYFLAG_KSK) != 0);
+
+ /* Is this an old-style key? */
+ result = dst_key_getprivateformat(dk->key, &major, &minor);
+
+ /* Smart signing started with key format 1.3 */
+ dk->legacy = ISC_TF(major == 1 && minor <= 2);
+
+ ISC_LINK_INIT(dk, link);
+ *dkp = dk;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_dnsseckey_destroy(isc_mem_t *mctx, dns_dnsseckey_t **dkp) {
+ dns_dnsseckey_t *dk;
+
+ REQUIRE(dkp != NULL && *dkp != NULL);
+ dk = *dkp;
+ if (dk->key != NULL)
+ dst_key_free(&dk->key);
+ isc_mem_put(mctx, dk, sizeof(dns_dnsseckey_t));
+ *dkp = NULL;
+}
+
+static void
+get_hints(dns_dnsseckey_t *key) {
+ isc_result_t result;
+ isc_stdtime_t now, publish, active, revoke, inactive, delete;
+ isc_boolean_t pubset = ISC_FALSE, actset = ISC_FALSE;
+ isc_boolean_t revset = ISC_FALSE, inactset = ISC_FALSE;
+ isc_boolean_t delset = ISC_FALSE;
+
+ REQUIRE(key != NULL && key->key != NULL);
+
+ isc_stdtime_get(&now);
+
+ result = dst_key_gettime(key->key, DST_TIME_PUBLISH, &publish);
+ if (result == ISC_R_SUCCESS)
+ pubset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_ACTIVATE, &active);
+ if (result == ISC_R_SUCCESS)
+ actset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_REVOKE, &revoke);
+ if (result == ISC_R_SUCCESS)
+ revset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_INACTIVE, &inactive);
+ if (result == ISC_R_SUCCESS)
+ inactset = ISC_TRUE;
+
+ result = dst_key_gettime(key->key, DST_TIME_DELETE, &delete);
+ if (result == ISC_R_SUCCESS)
+ delset = ISC_TRUE;
+
+ /* Metadata says publish (but possibly not activate) */
+ if (pubset && publish <= now)
+ key->hint_publish = ISC_TRUE;
+
+ /* Metadata says activate (so we must also publish) */
+ if (actset && active <= now) {
+ key->hint_sign = ISC_TRUE;
+ key->hint_publish = ISC_TRUE;
+ }
+
+ /*
+ * Activation date is set (maybe in the future), but
+ * publication date isn't. Most likely the user wants to
+ * publish now and activate later.
+ */
+ if (actset && !pubset)
+ key->hint_publish = ISC_TRUE;
+
+ /*
+ * If activation date is in the future, make note of how far off
+ */
+ if (key->hint_publish && actset && active > now) {
+ key->prepublish = active - now;
+ }
+
+ /*
+ * Key has been marked inactive: we can continue publishing,
+ * but don't sign.
+ */
+ if (key->hint_publish && inactset && inactive <= now) {
+ key->hint_sign = ISC_FALSE;
+ }
+
+ /*
+ * Metadata says revoke. If the key is published,
+ * we *have to* sign with it per RFC5011--even if it was
+ * not active before.
+ *
+ * If it hasn't already been done, we should also revoke it now.
+ */
+ if (key->hint_publish && (revset && revoke <= now)) {
+ isc_uint32_t flags;
+ key->hint_sign = ISC_TRUE;
+ flags = dst_key_flags(key->key);
+ if ((flags & DNS_KEYFLAG_REVOKE) == 0) {
+ flags |= DNS_KEYFLAG_REVOKE;
+ dst_key_setflags(key->key, flags);
+ }
+ }
+
+ /*
+ * Metadata says delete, so don't publish this key or sign with it.
+ */
+ if (delset && delete <= now) {
+ key->hint_publish = ISC_FALSE;
+ key->hint_sign = ISC_FALSE;
+ key->hint_remove = ISC_TRUE;
+ }
+}
+
+/*%
+ * Get a list of DNSSEC keys from the key repository
+ */
+isc_result_t
+dns_dnssec_findmatchingkeys(dns_name_t *origin, const char *directory,
+ isc_mem_t *mctx, dns_dnsseckeylist_t *keylist)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_boolean_t dir_open = ISC_FALSE;
+ dns_dnsseckeylist_t list;
+ isc_dir_t dir;
+ dns_dnsseckey_t *key = NULL;
+ dst_key_t *dstkey = NULL;
+ char namebuf[DNS_NAME_FORMATSIZE], *p;
+ isc_buffer_t b;
+ unsigned int len;
+
+ REQUIRE(keylist != NULL);
+ ISC_LIST_INIT(list);
+ isc_dir_init(&dir);
+
+ isc_buffer_init(&b, namebuf, sizeof(namebuf) - 1);
+ RETERR(dns_name_totext(origin, ISC_FALSE, &b));
+ len = isc_buffer_usedlength(&b);
+ namebuf[len] = '\0';
+
+ if (directory == NULL)
+ directory = ".";
+ RETERR(isc_dir_open(&dir, directory));
+ dir_open = ISC_TRUE;
+
+ while (isc_dir_read(&dir) == ISC_R_SUCCESS) {
+ if (dir.entry.name[0] == 'K' &&
+ dir.entry.length > len + 1 &&
+ dir.entry.name[len + 1] == '+' &&
+ strncasecmp(dir.entry.name + 1, namebuf, len) == 0) {
+ p = strrchr(dir.entry.name, '.');
+ if (p != NULL && strcmp(p, ".private") != 0)
+ continue;
+
+ dstkey = NULL;
+ result = dst_key_fromnamedfile(dir.entry.name,
+ directory,
+ DST_TYPE_PUBLIC |
+ DST_TYPE_PRIVATE,
+ mctx, &dstkey);
+
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_DNSSEC,
+ ISC_LOG_WARNING,
+ "dns_dnssec_findmatchingkeys: "
+ "error reading key file %s: %s",
+ dir.entry.name,
+ isc_result_totext(result));
+ continue;
+ }
+
+ RETERR(dns_dnsseckey_create(mctx, &dstkey, &key));
+ key->source = dns_keysource_repository;
+ get_hints(key);
+
+ if (key->legacy) {
+ dns_dnsseckey_destroy(mctx, &key);
+ } else {
+ ISC_LIST_APPEND(list, key, link);
+ key = NULL;
+ }
+ }
+ }
+
+ if (!ISC_LIST_EMPTY(list))
+ ISC_LIST_APPENDLIST(*keylist, list, link);
+ else
+ result = ISC_R_NOTFOUND;
+
+ failure:
+ if (dir_open)
+ isc_dir_close(&dir);
+ INSIST(key == NULL);
+ while ((key = ISC_LIST_HEAD(list)) != NULL) {
+ ISC_LIST_UNLINK(list, key, link);
+ INSIST(key->key != NULL);
+ dst_key_free(&key->key);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ return (result);
+}
+
+/*%
+ * Add 'newkey' to 'keylist' if it's not already there.
+ *
+ * If 'savekeys' is ISC_TRUE, then we need to preserve all
+ * the keys in the keyset, regardless of whether they have
+ * metadata indicating they should be deactivated or removed.
+ */
+static void
+addkey(dns_dnsseckeylist_t *keylist, dst_key_t **newkey,
+ isc_boolean_t savekeys, isc_mem_t *mctx)
+{
+ dns_dnsseckey_t *key;
+
+ /* Skip duplicates */
+ for (key = ISC_LIST_HEAD(*keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (dst_key_id(key->key) == dst_key_id(*newkey) &&
+ dst_key_alg(key->key) == dst_key_alg(*newkey) &&
+ dns_name_equal(dst_key_name(key->key),
+ dst_key_name(*newkey)))
+ break;
+ }
+
+ if (key != NULL) {
+ /*
+ * Found a match. If the old key was only public and the
+ * new key is private, replace the old one; otherwise
+ * leave it. But either way, mark the key as having
+ * been found in the zone.
+ */
+ if (dst_key_isprivate(key->key)) {
+ dst_key_free(newkey);
+ } else if (dst_key_isprivate(*newkey)) {
+ dst_key_free(&key->key);
+ key->key = *newkey;
+ }
+
+ key->source = dns_keysource_zoneapex;
+ return;
+ }
+
+ dns_dnsseckey_create(mctx, newkey, &key);
+ if (key->legacy || savekeys) {
+ key->force_publish = ISC_TRUE;
+ key->force_sign = dst_key_isprivate(key->key);
+ }
+ key->source = dns_keysource_zoneapex;
+ ISC_LIST_APPEND(*keylist, key, link);
+ *newkey = NULL;
+}
+
+
+/*%
+ * Mark all keys which signed the DNSKEY/SOA RRsets as "active",
+ * for future reference.
+ */
+static isc_result_t
+mark_active_keys(dns_dnsseckeylist_t *keylist, dns_rdataset_t *rrsigs) {
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_t sigs;
+ dns_dnsseckey_t *key;
+
+ REQUIRE(rrsigs != NULL && dns_rdataset_isassociated(rrsigs));
+
+ dns_rdataset_init(&sigs);
+ dns_rdataset_clone(rrsigs, &sigs);
+ for (key = ISC_LIST_HEAD(*keylist);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ isc_uint16_t keyid, sigid;
+ dns_secalg_t keyalg, sigalg;
+ keyid = dst_key_id(key->key);
+ keyalg = dst_key_alg(key->key);
+
+ for (result = dns_rdataset_first(&sigs);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&sigs)) {
+ dns_rdata_rrsig_t sig;
+
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(&sigs, &rdata);
+ result = dns_rdata_tostruct(&rdata, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ sigalg = sig.algorithm;
+ sigid = sig.keyid;
+ if (keyid == sigid && keyalg == sigalg) {
+ key->is_active = ISC_TRUE;
+ break;
+ }
+ }
+ }
+
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+
+ if (dns_rdataset_isassociated(&sigs))
+ dns_rdataset_disassociate(&sigs);
+ return (result);
+}
+
+/*%
+ * Add the contents of a DNSKEY rdataset 'keyset' to 'keylist'.
+ */
+isc_result_t
+dns_dnssec_keylistfromrdataset(dns_name_t *origin,
+ const char *directory, isc_mem_t *mctx,
+ dns_rdataset_t *keyset, dns_rdataset_t *keysigs,
+ dns_rdataset_t *soasigs, isc_boolean_t savekeys,
+ isc_boolean_t public,
+ dns_dnsseckeylist_t *keylist)
+{
+ dns_rdataset_t keys;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dst_key_t *pubkey = NULL, *privkey = NULL;
+ isc_result_t result;
+
+ REQUIRE(keyset != NULL && dns_rdataset_isassociated(keyset));
+
+ dns_rdataset_init(&keys);
+
+ dns_rdataset_clone(keyset, &keys);
+ for (result = dns_rdataset_first(&keys);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&keys)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(&keys, &rdata);
+ RETERR(dns_dnssec_keyfromrdata(origin, &rdata, mctx, &pubkey));
+
+ if (!is_zone_key(pubkey) ||
+ (dst_key_flags(pubkey) & DNS_KEYTYPE_NOAUTH) != 0)
+ goto skip;
+
+ /* Corrupted .key file? */
+ if (!dns_name_equal(origin, dst_key_name(pubkey)))
+ goto skip;
+
+ if (public) {
+ addkey(keylist, &pubkey, savekeys, mctx);
+ goto skip;
+ }
+
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
+ directory, mctx, &privkey);
+
+ /*
+ * If the key was revoked and the private file
+ * doesn't exist, maybe it was revoked internally
+ * by named. Try loading the unrevoked version.
+ */
+ if (result == ISC_R_FILENOTFOUND) {
+ isc_uint32_t flags;
+ flags = dst_key_flags(pubkey);
+ if ((flags & DNS_KEYFLAG_REVOKE) != 0) {
+ dst_key_setflags(pubkey,
+ flags & ~DNS_KEYFLAG_REVOKE);
+ result = dst_key_fromfile(dst_key_name(pubkey),
+ dst_key_id(pubkey),
+ dst_key_alg(pubkey),
+ DST_TYPE_PUBLIC|
+ DST_TYPE_PRIVATE,
+ directory,
+ mctx, &privkey);
+ if (result == ISC_R_SUCCESS &&
+ dst_key_pubcompare(pubkey, privkey,
+ ISC_FALSE)) {
+ dst_key_setflags(privkey, flags);
+ }
+ dst_key_setflags(pubkey, flags);
+ }
+ }
+
+ if (result != ISC_R_SUCCESS) {
+ char keybuf[DNS_NAME_FORMATSIZE];
+ char algbuf[DNS_SECALG_FORMATSIZE];
+ dns_name_format(dst_key_name(pubkey), keybuf,
+ sizeof(keybuf));
+ dns_secalg_format(dst_key_alg(pubkey), algbuf,
+ sizeof(algbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_DNSSEC, ISC_LOG_WARNING,
+ "dns_dnssec_keylistfromrdataset: error "
+ "reading private key file %s/%s/%d: %s",
+ keybuf, algbuf, dst_key_id(pubkey),
+ isc_result_totext(result));
+ }
+
+ if (result == ISC_R_FILENOTFOUND || result == ISC_R_NOPERM) {
+ addkey(keylist, &pubkey, savekeys, mctx);
+ goto skip;
+ }
+ RETERR(result);
+
+ /* This should never happen. */
+ if ((dst_key_flags(privkey) & DNS_KEYTYPE_NOAUTH) != 0)
+ goto skip;
+
+ addkey(keylist, &privkey, savekeys, mctx);
+ skip:
+ if (pubkey != NULL)
+ dst_key_free(&pubkey);
+ if (privkey != NULL)
+ dst_key_free(&privkey);
+ }
+
+ if (result != ISC_R_NOMORE)
+ RETERR(result);
+
+ if (keysigs != NULL && dns_rdataset_isassociated(keysigs))
+ RETERR(mark_active_keys(keylist, keysigs));
+
+ if (soasigs != NULL && dns_rdataset_isassociated(soasigs))
+ RETERR(mark_active_keys(keylist, soasigs));
+
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (dns_rdataset_isassociated(&keys))
+ dns_rdataset_disassociate(&keys);
+ if (pubkey != NULL)
+ dst_key_free(&pubkey);
+ if (privkey != NULL)
+ dst_key_free(&privkey);
+ return (result);
+}
+
+static isc_result_t
+make_dnskey(dst_key_t *key, unsigned char *buf, int bufsize,
+ dns_rdata_t *target)
+{
+ isc_result_t result;
+ isc_buffer_t b;
+ isc_region_t r;
+
+ isc_buffer_init(&b, buf, bufsize);
+ result = dst_key_todns(key, &b);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_rdata_reset(target);
+ isc_buffer_usedregion(&b, &r);
+ dns_rdata_fromregion(target, dst_key_class(key),
+ dns_rdatatype_dnskey, &r);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+publish_key(dns_diff_t *diff, dns_dnsseckey_t *key, dns_name_t *origin,
+ dns_ttl_t ttl, isc_mem_t *mctx, isc_boolean_t allzsk,
+ void (*report)(const char *, ...))
+{
+ isc_result_t result;
+ dns_difftuple_t *tuple = NULL;
+ unsigned char buf[DST_KEY_MAXSIZE];
+ dns_rdata_t dnskey = DNS_RDATA_INIT;
+ char alg[80];
+
+ dns_rdata_reset(&dnskey);
+ RETERR(make_dnskey(key->key, buf, sizeof(buf), &dnskey));
+
+ dns_secalg_format(dst_key_alg(key->key), alg, sizeof(alg));
+ report("Fetching %s %d/%s from key %s.",
+ key->ksk ? (allzsk ? "KSK/ZSK" : "KSK") : "ZSK",
+ dst_key_id(key->key), alg,
+ key->source == dns_keysource_user ? "file" : "repository");
+
+ if (key->prepublish && ttl > key->prepublish) {
+ char keystr[DST_KEY_FORMATSIZE];
+ isc_stdtime_t now;
+
+ dst_key_format(key->key, keystr, sizeof(keystr));
+ report("Key %s: Delaying activation to match the DNSKEY TTL.\n",
+ keystr, ttl);
+
+ isc_stdtime_get(&now);
+ dst_key_settime(key->key, DST_TIME_ACTIVATE, now + ttl);
+ }
+
+ /* publish key */
+ RETERR(dns_difftuple_create(mctx, DNS_DIFFOP_ADD, origin, ttl,
+ &dnskey, &tuple));
+ dns_diff_appendminimal(diff, &tuple);
+ result = ISC_R_SUCCESS;
+
+ failure:
+ return (result);
+}
+
+static isc_result_t
+remove_key(dns_diff_t *diff, dns_dnsseckey_t *key, dns_name_t *origin,
+ dns_ttl_t ttl, isc_mem_t *mctx, const char *reason,
+ void (*report)(const char *, ...))
+{
+ isc_result_t result;
+ dns_difftuple_t *tuple = NULL;
+ unsigned char buf[DST_KEY_MAXSIZE];
+ dns_rdata_t dnskey = DNS_RDATA_INIT;
+ char alg[80];
+
+ dns_secalg_format(dst_key_alg(key->key), alg, sizeof(alg));
+ report("Removing %s key %d/%s from DNSKEY RRset.",
+ reason, dst_key_id(key->key), alg);
+
+ RETERR(make_dnskey(key->key, buf, sizeof(buf), &dnskey));
+ RETERR(dns_difftuple_create(mctx, DNS_DIFFOP_DEL, origin, ttl, &dnskey,
+ &tuple));
+ dns_diff_appendminimal(diff, &tuple);
+ result = ISC_R_SUCCESS;
+
+ failure:
+ return (result);
+}
+
+/*
+ * Update 'keys' with information from 'newkeys'.
+ *
+ * If 'removed' is not NULL, any keys that are being removed from
+ * the zone will be added to the list for post-removal processing.
+ */
+isc_result_t
+dns_dnssec_updatekeys(dns_dnsseckeylist_t *keys, dns_dnsseckeylist_t *newkeys,
+ dns_dnsseckeylist_t *removed, dns_name_t *origin,
+ dns_ttl_t ttl, dns_diff_t *diff, isc_boolean_t allzsk,
+ isc_mem_t *mctx, void (*report)(const char *, ...))
+{
+ isc_result_t result;
+ dns_dnsseckey_t *key, *key1, *key2, *next;
+
+ /*
+ * First, look through the existing key list to find keys
+ * supplied from the command line which are not in the zone.
+ * Update the zone to include them.
+ */
+ for (key = ISC_LIST_HEAD(*keys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (key->source == dns_keysource_user &&
+ (key->hint_publish || key->force_publish)) {
+ RETERR(publish_key(diff, key, origin, ttl,
+ mctx, allzsk, report));
+ }
+ }
+
+ /*
+ * Second, scan the list of newly found keys looking for matches
+ * with known keys, and update accordingly.
+ */
+ for (key1 = ISC_LIST_HEAD(*newkeys); key1 != NULL; key1 = next) {
+ isc_boolean_t key_revoked = ISC_FALSE;
+
+ next = ISC_LIST_NEXT(key1, link);
+
+ for (key2 = ISC_LIST_HEAD(*keys);
+ key2 != NULL;
+ key2 = ISC_LIST_NEXT(key2, link)) {
+ if (dst_key_pubcompare(key1->key, key2->key,
+ ISC_TRUE)) {
+ int r1, r2;
+ r1 = dst_key_flags(key1->key) &
+ DNS_KEYFLAG_REVOKE;
+ r2 = dst_key_flags(key2->key) &
+ DNS_KEYFLAG_REVOKE;
+ key_revoked = ISC_TF(r1 != r2);
+ break;
+ }
+ }
+
+ /* No match found in keys; add the new key. */
+ if (key2 == NULL) {
+ dns_dnsseckey_t *next;
+
+ next = ISC_LIST_NEXT(key1, link);
+ ISC_LIST_UNLINK(*newkeys, key1, link);
+ ISC_LIST_APPEND(*keys, key1, link);
+
+ if (key1->source != dns_keysource_zoneapex &&
+ (key1->hint_publish || key1->force_publish)) {
+ RETERR(publish_key(diff, key1, origin, ttl,
+ mctx, allzsk, report));
+ if (key1->hint_sign || key1->force_sign)
+ key1->first_sign = ISC_TRUE;
+ }
+
+ continue;
+ }
+
+ /* Match found: remove or update it as needed */
+ if (key1->hint_remove) {
+ RETERR(remove_key(diff, key2, origin, ttl, mctx,
+ "expired", report));
+ ISC_LIST_UNLINK(*keys, key2, link);
+ if (removed != NULL)
+ ISC_LIST_APPEND(*removed, key2, link);
+ else
+ dns_dnsseckey_destroy(mctx, &key2);
+ } else if (key_revoked &&
+ (dst_key_flags(key1->key) & DNS_KEYFLAG_REVOKE) != 0) {
+
+ /*
+ * A previously valid key has been revoked.
+ * We need to remove the old version and pull
+ * in the new one.
+ */
+ RETERR(remove_key(diff, key2, origin, ttl, mctx,
+ "revoked", report));
+ ISC_LIST_UNLINK(*keys, key2, link);
+ if (removed != NULL)
+ ISC_LIST_APPEND(*removed, key2, link);
+ else
+ dns_dnsseckey_destroy(mctx, &key2);
+
+ RETERR(publish_key(diff, key1, origin, ttl,
+ mctx, allzsk, report));
+ ISC_LIST_UNLINK(*newkeys, key1, link);
+ ISC_LIST_APPEND(*keys, key1, link);
+
+ /*
+ * XXX: The revoke flag is only defined for trust
+ * anchors. Setting the flag on a non-KSK is legal,
+ * but not defined in any RFC. It seems reasonable
+ * to treat it the same as a KSK: keep it in the
+ * zone, sign the DNSKEY set with it, but not
+ * sign other records with it.
+ */
+ key1->ksk = ISC_TRUE;
+ continue;
+ } else {
+ if (!key2->is_active &&
+ (key1->hint_sign || key1->force_sign))
+ key2->first_sign = ISC_TRUE;
+ key2->hint_sign = key1->hint_sign;
+ key2->hint_publish = key1->hint_publish;
+ }
+ }
+
+ /* Free any leftover keys in newkeys */
+ while (!ISC_LIST_EMPTY(*newkeys)) {
+ key1 = ISC_LIST_HEAD(*newkeys);
+ ISC_LIST_UNLINK(*newkeys, key1, link);
+ dns_dnsseckey_destroy(mctx, &key1);
+ }
+
+ result = ISC_R_SUCCESS;
+
+ failure:
+ return (result);
+}
diff --git a/contrib/bind9/lib/dns/ds.c b/contrib/bind9/lib/dns/ds.c
index 9cf5659..80e1503 100644
--- a/contrib/bind9/lib/dns/ds.c
+++ b/contrib/bind9/lib/dns/ds.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds.c,v 1.11 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: ds.c,v 1.13 2010-12-23 23:47:08 tbox Exp $ */
/*! \file */
@@ -38,6 +38,13 @@
#include <dst/dst.h>
+#ifdef HAVE_OPENSSL_GOST
+#include <dst/result.h>
+#include <openssl/evp.h>
+
+extern const EVP_MD * EVP_gost(void);
+#endif
+
isc_result_t
dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
unsigned int digest_type, unsigned char *buffer,
@@ -49,6 +56,12 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
isc_region_t r;
isc_buffer_t b;
dns_rdata_ds_t ds;
+ isc_sha1_t sha1;
+ isc_sha256_t sha256;
+#ifdef HAVE_OPENSSL_GOST
+ EVP_MD_CTX ctx;
+ const EVP_MD *md;
+#endif
REQUIRE(key != NULL);
REQUIRE(key->type == dns_rdatatype_dnskey);
@@ -63,8 +76,8 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
memset(buffer, 0, DNS_DS_BUFFERSIZE);
isc_buffer_init(&b, buffer, DNS_DS_BUFFERSIZE);
- if (digest_type == DNS_DSDIGEST_SHA1) {
- isc_sha1_t sha1;
+ switch (digest_type) {
+ case DNS_DSDIGEST_SHA1:
isc_sha1_init(&sha1);
dns_name_toregion(name, &r);
isc_sha1_update(&sha1, r.base, r.length);
@@ -72,8 +85,33 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
INSIST(r.length >= 4);
isc_sha1_update(&sha1, r.base, r.length);
isc_sha1_final(&sha1, digest);
- } else {
- isc_sha256_t sha256;
+ break;
+#ifdef HAVE_OPENSSL_GOST
+#define CHECK(x) \
+ if ((x) != 1) { \
+ EVP_MD_CTX_cleanup(&ctx); \
+ return (DST_R_OPENSSLFAILURE); \
+ }
+
+ case DNS_DSDIGEST_GOST:
+ md = EVP_gost();
+ if (md == NULL)
+ return (DST_R_OPENSSLFAILURE);
+ EVP_MD_CTX_init(&ctx);
+ CHECK(EVP_DigestInit(&ctx, md));
+ dns_name_toregion(name, &r);
+ CHECK(EVP_DigestUpdate(&ctx,
+ (const void *) r.base,
+ (size_t) r.length));
+ dns_rdata_toregion(key, &r);
+ INSIST(r.length >= 4);
+ CHECK(EVP_DigestUpdate(&ctx,
+ (const void *) r.base,
+ (size_t) r.length));
+ CHECK(EVP_DigestFinal(&ctx, digest, NULL));
+ break;
+#endif
+ default:
isc_sha256_init(&sha256);
dns_name_toregion(name, &r);
isc_sha256_update(&sha256, r.base, r.length);
@@ -81,6 +119,7 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
INSIST(r.length >= 4);
isc_sha256_update(&sha256, r.base, r.length);
isc_sha256_final(digest, &sha256);
+ break;
}
ds.mctx = NULL;
@@ -89,8 +128,19 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
ds.algorithm = r.base[3];
ds.key_tag = dst_region_computeid(&r, ds.algorithm);
ds.digest_type = digest_type;
- ds.length = (digest_type == DNS_DSDIGEST_SHA1) ?
- ISC_SHA1_DIGESTLENGTH : ISC_SHA256_DIGESTLENGTH;
+ switch (digest_type) {
+ case DNS_DSDIGEST_SHA1:
+ ds.length = ISC_SHA1_DIGESTLENGTH;
+ break;
+#ifdef HAVE_OPENSSL_GOST
+ case DNS_DSDIGEST_GOST:
+ ds.length = ISC_GOST_DIGESTLENGTH;
+ break;
+#endif
+ default:
+ ds.length = ISC_SHA256_DIGESTLENGTH;
+ break;
+ }
ds.digest = digest;
return (dns_rdata_fromstruct(rdata, key->rdclass, dns_rdatatype_ds,
@@ -99,6 +149,12 @@ dns_ds_buildrdata(dns_name_t *owner, dns_rdata_t *key,
isc_boolean_t
dns_ds_digest_supported(unsigned int digest_type) {
+#ifdef HAVE_OPENSSL_GOST
+ return (ISC_TF(digest_type == DNS_DSDIGEST_SHA1 ||
+ digest_type == DNS_DSDIGEST_SHA256 ||
+ digest_type == DNS_DSDIGEST_GOST));
+#else
return (ISC_TF(digest_type == DNS_DSDIGEST_SHA1 ||
digest_type == DNS_DSDIGEST_SHA256));
+#endif
}
diff --git a/contrib/bind9/lib/dns/dst_api.c b/contrib/bind9/lib/dns/dst_api.c
index 97d2657..1ece312 100644
--- a/contrib/bind9/lib/dns/dst_api.c
+++ b/contrib/bind9/lib/dns/dst_api.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: dst_api.c,v 1.16.12.12 2010-12-09 01:12:55 marka Exp $
+ * $Id: dst_api.c,v 1.57 2011-01-11 23:47:13 tbox Exp $
*/
/*! \file */
@@ -39,6 +39,7 @@
#include <config.h>
#include <stdlib.h>
+#include <time.h>
#include <isc/buffer.h>
#include <isc/dir.h>
@@ -48,6 +49,7 @@
#include <isc/lex.h>
#include <isc/mem.h>
#include <isc/once.h>
+#include <isc/platform.h>
#include <isc/print.h>
#include <isc/refcount.h>
#include <isc/random.h>
@@ -70,7 +72,9 @@
#define DST_AS_STR(t) ((t).value.as_textregion.base)
static dst_func_t *dst_t_func[DST_MAX_ALGS];
+#ifdef BIND9
static isc_entropy_t *dst_entropy_pool = NULL;
+#endif
static unsigned int dst_entropy_flags = 0;
static isc_boolean_t dst_initialized = ISC_FALSE;
@@ -108,10 +112,11 @@ static isc_result_t frombuffer(dns_name_t *name,
static isc_result_t algorithm_status(unsigned int alg);
-static isc_result_t addsuffix(char *filename, unsigned int len,
- const char *ofilename, const char *suffix);
+static isc_result_t addsuffix(char *filename, int len,
+ const char *dirname, const char *ofilename,
+ const char *suffix);
-#define RETERR(x) \
+#define RETERR(x) \
do { \
result = (x); \
if (result != ISC_R_SUCCESS) \
@@ -126,7 +131,7 @@ static isc_result_t addsuffix(char *filename, unsigned int len,
return (_r); \
} while (0); \
-#ifdef OPENSSL
+#if defined(OPENSSL) && defined(BIND9)
static void *
default_memalloc(void *arg, size_t size) {
UNUSED(arg);
@@ -144,14 +149,29 @@ default_memfree(void *arg, void *ptr) {
isc_result_t
dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
+ return (dst_lib_init2(mctx, ectx, NULL, eflags));
+}
+
+isc_result_t
+dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx,
+ const char *engine, unsigned int eflags) {
isc_result_t result;
- REQUIRE(mctx != NULL && ectx != NULL);
+ REQUIRE(mctx != NULL);
+#ifdef BIND9
+ REQUIRE(ectx != NULL);
+#else
+ UNUSED(ectx);
+#endif
REQUIRE(dst_initialized == ISC_FALSE);
+#ifndef OPENSSL
+ UNUSED(engine);
+#endif
+
dst__memory_pool = NULL;
-#ifdef OPENSSL
+#if defined(OPENSSL) && defined(BIND9)
UNUSED(mctx);
/*
* When using --with-openssl, there seems to be no good way of not
@@ -166,11 +186,15 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
if (result != ISC_R_SUCCESS)
return (result);
isc_mem_setname(dst__memory_pool, "dst", NULL);
+#ifndef OPENSSL_LEAKS
isc_mem_setdestroycheck(dst__memory_pool, ISC_FALSE);
+#endif
#else
isc_mem_attach(mctx, &dst__memory_pool);
#endif
+#ifdef BIND9
isc_entropy_attach(ectx, &dst_entropy_pool);
+#endif
dst_entropy_flags = eflags;
dst_result_register();
@@ -183,7 +207,7 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
RETERR(dst__hmacsha384_init(&dst_t_func[DST_ALG_HMACSHA384]));
RETERR(dst__hmacsha512_init(&dst_t_func[DST_ALG_HMACSHA512]));
#ifdef OPENSSL
- RETERR(dst__openssl_init());
+ RETERR(dst__openssl_init(engine));
RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSAMD5],
DST_ALG_RSAMD5));
RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSASHA1],
@@ -199,6 +223,9 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
RETERR(dst__openssldsa_init(&dst_t_func[DST_ALG_NSEC3DSA]));
#endif
RETERR(dst__openssldh_init(&dst_t_func[DST_ALG_DH]));
+#ifdef HAVE_OPENSSL_GOST
+ RETERR(dst__opensslgost_init(&dst_t_func[DST_ALG_ECCGOST]));
+#endif
#endif /* OPENSSL */
#ifdef GSSAPI
RETERR(dst__gssapi_init(&dst_t_func[DST_ALG_GSSAPI]));
@@ -207,6 +234,8 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags) {
return (ISC_R_SUCCESS);
out:
+ /* avoid immediate crash! */
+ dst_initialized = ISC_TRUE;
dst_lib_destroy();
return (result);
}
@@ -225,9 +254,10 @@ dst_lib_destroy(void) {
#endif
if (dst__memory_pool != NULL)
isc_mem_detach(&dst__memory_pool);
+#ifdef BIND9
if (dst_entropy_pool != NULL)
isc_entropy_detach(&dst_entropy_pool);
-
+#endif
}
isc_boolean_t
@@ -402,7 +432,7 @@ dst_key_fromfile(dns_name_t *name, dns_keytag_t id,
return (result);
key = NULL;
- result = dst_key_fromnamedfile(filename, type, mctx, &key);
+ result = dst_key_fromnamedfile(filename, NULL, type, mctx, &key);
if (result != ISC_R_SUCCESS)
return (result);
@@ -424,12 +454,11 @@ dst_key_fromfile(dns_name_t *name, dns_keytag_t id,
}
isc_result_t
-dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
- dst_key_t **keyp)
+dst_key_fromnamedfile(const char *filename, const char *dirname,
+ int type, isc_mem_t *mctx, dst_key_t **keyp)
{
isc_result_t result;
dst_key_t *pubkey = NULL, *key = NULL;
- dns_keytag_t id;
char *newfilename = NULL;
int newfilenamelen = 0;
isc_lex_t *lex = NULL;
@@ -440,11 +469,23 @@ dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
REQUIRE(mctx != NULL);
REQUIRE(keyp != NULL && *keyp == NULL);
+ /* If an absolute path is specified, don't use the key directory */
+#ifndef WIN32
+ if (filename[0] == '/')
+ dirname = NULL;
+#else /* WIN32 */
+ if (filename[0] == '/' || filename[0] == '\\')
+ dirname = NULL;
+#endif
+
newfilenamelen = strlen(filename) + 5;
+ if (dirname != NULL)
+ newfilenamelen += strlen(dirname) + 1;
newfilename = isc_mem_get(mctx, newfilenamelen);
if (newfilename == NULL)
return (ISC_R_NOMEMORY);
- result = addsuffix(newfilename, newfilenamelen, filename, ".key");
+ result = addsuffix(newfilename, newfilenamelen,
+ dirname, filename, ".key");
INSIST(result == ISC_R_SUCCESS);
result = dst_key_read_public(newfilename, type, mctx, &pubkey);
@@ -474,38 +515,43 @@ dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
key = get_key_struct(pubkey->key_name, pubkey->key_alg,
pubkey->key_flags, pubkey->key_proto, 0,
pubkey->key_class, mctx);
- id = pubkey->key_id;
- dst_key_free(&pubkey);
-
- if (key == NULL)
+ if (key == NULL) {
+ dst_key_free(&pubkey);
return (ISC_R_NOMEMORY);
+ }
if (key->func->parse == NULL)
RETERR(DST_R_UNSUPPORTEDALG);
newfilenamelen = strlen(filename) + 9;
+ if (dirname != NULL)
+ newfilenamelen += strlen(dirname) + 1;
newfilename = isc_mem_get(mctx, newfilenamelen);
if (newfilename == NULL)
RETERR(ISC_R_NOMEMORY);
- result = addsuffix(newfilename, newfilenamelen, filename, ".private");
+ result = addsuffix(newfilename, newfilenamelen,
+ dirname, filename, ".private");
INSIST(result == ISC_R_SUCCESS);
RETERR(isc_lex_create(mctx, 1500, &lex));
RETERR(isc_lex_openfile(lex, newfilename));
isc_mem_put(mctx, newfilename, newfilenamelen);
- RETERR(key->func->parse(key, lex));
+ RETERR(key->func->parse(key, lex, pubkey));
isc_lex_destroy(&lex);
RETERR(computeid(key));
- if (id != key->key_id)
+ if (pubkey->key_id != key->key_id)
RETERR(DST_R_INVALIDPRIVATEKEY);
+ dst_key_free(&pubkey);
*keyp = key;
return (ISC_R_SUCCESS);
out:
+ if (pubkey != NULL)
+ dst_key_free(&pubkey);
if (newfilename != NULL)
isc_mem_put(mctx, newfilename, newfilenamelen);
if (lex != NULL)
@@ -640,7 +686,7 @@ dst_key_privatefrombuffer(dst_key_t *key, isc_buffer_t *buffer) {
RETERR(isc_lex_create(key->mctx, 1500, &lex));
RETERR(isc_lex_openbuffer(lex, buffer));
- RETERR(key->func->parse(key, lex));
+ RETERR(key->func->parse(key, lex, NULL));
out:
if (lex != NULL)
isc_lex_destroy(&lex);
@@ -657,9 +703,10 @@ dst_key_getgssctx(const dst_key_t *key)
isc_result_t
dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
- dst_key_t **keyp)
+ dst_key_t **keyp, isc_region_t *intoken)
{
dst_key_t *key;
+ isc_result_t result;
REQUIRE(gssctx != NULL);
REQUIRE(keyp != NULL && *keyp == NULL);
@@ -669,9 +716,21 @@ dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
if (key == NULL)
return (ISC_R_NOMEMORY);
+ if (intoken != NULL) {
+ /*
+ * Keep the token for use by external ssu rules. They may need
+ * to examine the PAC in the kerberos ticket.
+ */
+ RETERR(isc_buffer_allocate(key->mctx, &key->key_tkeytoken,
+ intoken->length));
+ RETERR(isc_buffer_copyregion(key->key_tkeytoken, intoken));
+ }
+
key->keydata.gssctx = gssctx;
*keyp = key;
- return (ISC_R_SUCCESS);
+ result = ISC_R_SUCCESS;
+out:
+ return result;
}
isc_result_t
@@ -723,6 +782,18 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
dns_rdataclass_t rdclass,
isc_mem_t *mctx, dst_key_t **keyp)
{
+ return (dst_key_generate2(name, alg, bits, param, flags, protocol,
+ rdclass, mctx, keyp, NULL));
+}
+
+isc_result_t
+dst_key_generate2(dns_name_t *name, unsigned int alg,
+ unsigned int bits, unsigned int param,
+ unsigned int flags, unsigned int protocol,
+ dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, dst_key_t **keyp,
+ void (*callback)(int))
+{
dst_key_t *key;
isc_result_t ret;
@@ -748,7 +819,7 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
return (DST_R_UNSUPPORTEDALG);
}
- ret = key->func->generate(key, param);
+ ret = key->func->generate(key, param, callback);
if (ret != ISC_R_SUCCESS) {
dst_key_free(&key);
return (ret);
@@ -764,25 +835,185 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
return (ISC_R_SUCCESS);
}
-isc_boolean_t
-dst_key_compare(const dst_key_t *key1, const dst_key_t *key2) {
+isc_result_t
+dst_key_getnum(const dst_key_t *key, int type, isc_uint32_t *valuep)
+{
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(valuep != NULL);
+ REQUIRE(type <= DST_MAX_NUMERIC);
+ if (!key->numset[type])
+ return (ISC_R_NOTFOUND);
+ *valuep = key->nums[type];
+ return (ISC_R_SUCCESS);
+}
+
+void
+dst_key_setnum(dst_key_t *key, int type, isc_uint32_t value)
+{
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_NUMERIC);
+ key->nums[type] = value;
+ key->numset[type] = ISC_TRUE;
+}
+
+void
+dst_key_unsetnum(dst_key_t *key, int type)
+{
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_NUMERIC);
+ key->numset[type] = ISC_FALSE;
+}
+
+isc_result_t
+dst_key_gettime(const dst_key_t *key, int type, isc_stdtime_t *timep) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(timep != NULL);
+ REQUIRE(type <= DST_MAX_TIMES);
+ if (!key->timeset[type])
+ return (ISC_R_NOTFOUND);
+ *timep = key->times[type];
+ return (ISC_R_SUCCESS);
+}
+
+void
+dst_key_settime(dst_key_t *key, int type, isc_stdtime_t when) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_TIMES);
+ key->times[type] = when;
+ key->timeset[type] = ISC_TRUE;
+}
+
+void
+dst_key_unsettime(dst_key_t *key, int type) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(type <= DST_MAX_TIMES);
+ key->timeset[type] = ISC_FALSE;
+}
+
+isc_result_t
+dst_key_getprivateformat(const dst_key_t *key, int *majorp, int *minorp) {
+ REQUIRE(VALID_KEY(key));
+ REQUIRE(majorp != NULL);
+ REQUIRE(minorp != NULL);
+ *majorp = key->fmt_major;
+ *minorp = key->fmt_minor;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dst_key_setprivateformat(dst_key_t *key, int major, int minor) {
+ REQUIRE(VALID_KEY(key));
+ key->fmt_major = major;
+ key->fmt_minor = minor;
+}
+
+static isc_boolean_t
+comparekeys(const dst_key_t *key1, const dst_key_t *key2,
+ isc_boolean_t match_revoked_key,
+ isc_boolean_t (*compare)(const dst_key_t *key1,
+ const dst_key_t *key2))
+{
REQUIRE(dst_initialized == ISC_TRUE);
REQUIRE(VALID_KEY(key1));
REQUIRE(VALID_KEY(key2));
if (key1 == key2)
return (ISC_TRUE);
+
if (key1 == NULL || key2 == NULL)
return (ISC_FALSE);
- if (key1->key_alg == key2->key_alg &&
- key1->key_id == key2->key_id &&
- key1->func->compare != NULL &&
- key1->func->compare(key1, key2) == ISC_TRUE)
- return (ISC_TRUE);
+
+ if (key1->key_alg != key2->key_alg)
+ return (ISC_FALSE);
+
+ /*
+ * For all algorithms except RSAMD5, revoking the key
+ * changes the key ID, increasing it by 128. If we want to
+ * be able to find matching keys even if one of them is the
+ * revoked version of the other one, then we need to check
+ * for that possibility.
+ */
+ if (key1->key_id != key2->key_id) {
+ if (!match_revoked_key)
+ return (ISC_FALSE);
+ if (key1->key_alg == DST_ALG_RSAMD5)
+ return (ISC_FALSE);
+ if ((key1->key_flags & DNS_KEYFLAG_REVOKE) ==
+ (key2->key_flags & DNS_KEYFLAG_REVOKE))
+ return (ISC_FALSE);
+ if ((key1->key_flags & DNS_KEYFLAG_REVOKE) != 0 &&
+ key1->key_id != ((key2->key_id + 128) & 0xffff))
+ return (ISC_FALSE);
+ if ((key2->key_flags & DNS_KEYFLAG_REVOKE) != 0 &&
+ key2->key_id != ((key1->key_id + 128) & 0xffff))
+ return (ISC_FALSE);
+ }
+
+ if (compare != NULL)
+ return (compare(key1, key2));
else
return (ISC_FALSE);
}
+
+/*
+ * Compares only the public portion of two keys, by converting them
+ * both to wire format and comparing the results.
+ */
+static isc_boolean_t
+pub_compare(const dst_key_t *key1, const dst_key_t *key2) {
+ isc_result_t result;
+ unsigned char buf1[DST_KEY_MAXSIZE], buf2[DST_KEY_MAXSIZE];
+ isc_buffer_t b1, b2;
+ isc_region_t r1, r2;
+
+ isc_buffer_init(&b1, buf1, sizeof(buf1));
+ result = dst_key_todns(key1, &b1);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_FALSE);
+ /* Zero out flags. */
+ buf1[0] = buf1[1] = 0;
+ if ((key1->key_flags & DNS_KEYFLAG_EXTENDED) != 0)
+ isc_buffer_subtract(&b1, 2);
+
+ isc_buffer_init(&b2, buf2, sizeof(buf2));
+ result = dst_key_todns(key2, &b2);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_FALSE);
+ /* Zero out flags. */
+ buf2[0] = buf2[1] = 0;
+ if ((key2->key_flags & DNS_KEYFLAG_EXTENDED) != 0)
+ isc_buffer_subtract(&b2, 2);
+
+ isc_buffer_usedregion(&b1, &r1);
+ /* Remove extended flags. */
+ if ((key1->key_flags & DNS_KEYFLAG_EXTENDED) != 0) {
+ memmove(&buf1[4], &buf1[6], r1.length - 6);
+ r1.length -= 2;
+ }
+
+ isc_buffer_usedregion(&b2, &r2);
+ /* Remove extended flags. */
+ if ((key2->key_flags & DNS_KEYFLAG_EXTENDED) != 0) {
+ memmove(&buf2[4], &buf2[6], r2.length - 6);
+ r2.length -= 2;
+ }
+ return (ISC_TF(isc_region_compare(&r1, &r2) == 0));
+}
+
+isc_boolean_t
+dst_key_compare(const dst_key_t *key1, const dst_key_t *key2) {
+ return (comparekeys(key1, key2, ISC_FALSE, key1->func->compare));
+}
+
+isc_boolean_t
+dst_key_pubcompare(const dst_key_t *key1, const dst_key_t *key2,
+ isc_boolean_t match_revoked_key)
+{
+ return (comparekeys(key1, key2, match_revoked_key, pub_compare));
+}
+
+
isc_boolean_t
dst_key_paramcompare(const dst_key_t *key1, const dst_key_t *key2) {
REQUIRE(dst_initialized == ISC_TRUE);
@@ -839,6 +1070,9 @@ dst_key_free(dst_key_t **keyp) {
isc_mem_free(mctx, key->label);
dns_name_free(key->key_name, mctx);
isc_mem_put(mctx, key->key_name, sizeof(dns_name_t));
+ if (key->key_tkeytoken) {
+ isc_buffer_free(&key->key_tkeytoken);
+ }
memset(key, 0, sizeof(dst_key_t));
isc_mem_put(mctx, key, sizeof(dst_key_t));
*keyp = NULL;
@@ -882,6 +1116,9 @@ dst_key_sigsize(const dst_key_t *key, unsigned int *n) {
case DST_ALG_NSEC3DSA:
*n = DNS_SIG_DSASIGSIZE;
break;
+ case DST_ALG_ECCGOST:
+ *n = DNS_SIG_GOSTSIGSIZE;
+ break;
case DST_ALG_HMACMD5:
*n = 16;
break;
@@ -923,6 +1160,69 @@ dst_key_secretsize(const dst_key_t *key, unsigned int *n) {
return (ISC_R_SUCCESS);
}
+/*%
+ * Set the flags on a key, then recompute the key ID
+ */
+isc_result_t
+dst_key_setflags(dst_key_t *key, isc_uint32_t flags) {
+ REQUIRE(VALID_KEY(key));
+ key->key_flags = flags;
+ return (computeid(key));
+}
+
+void
+dst_key_format(const dst_key_t *key, char *cp, unsigned int size) {
+ char namestr[DNS_NAME_FORMATSIZE];
+ char algstr[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(dst_key_name(key), namestr, sizeof(namestr));
+ dns_secalg_format((dns_secalg_t) dst_key_alg(key), algstr,
+ sizeof(algstr));
+ snprintf(cp, size, "%s/%s/%d", namestr, algstr, dst_key_id(key));
+}
+
+isc_result_t
+dst_key_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length) {
+
+ REQUIRE(buffer != NULL && *buffer == NULL);
+ REQUIRE(length != NULL && *length == 0);
+ REQUIRE(VALID_KEY(key));
+
+ if (key->func->isprivate == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+ return (key->func->dump(key, mctx, buffer, length));
+}
+
+isc_result_t
+dst_key_restore(dns_name_t *name, unsigned int alg, unsigned int flags,
+ unsigned int protocol, dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, const char *keystr, dst_key_t **keyp)
+{
+ isc_result_t result;
+ dst_key_t *key;
+
+ REQUIRE(dst_initialized == ISC_TRUE);
+ REQUIRE(keyp != NULL && *keyp == NULL);
+
+ if (alg >= DST_MAX_ALGS || dst_t_func[alg] == NULL)
+ return (DST_R_UNSUPPORTEDALG);
+
+ if (dst_t_func[alg]->restore == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ key = get_key_struct(name, alg, flags, protocol, 0, rdclass, mctx);
+ if (key == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = (dst_t_func[alg]->restore)(key, keystr);
+ if (result == ISC_R_SUCCESS)
+ *keyp = key;
+ else
+ dst_key_free(&key);
+
+ return (result);
+}
+
/***
*** Static methods
***/
@@ -938,6 +1238,7 @@ get_key_struct(dns_name_t *name, unsigned int alg,
{
dst_key_t *key;
isc_result_t result;
+ int i;
key = (dst_key_t *) isc_mem_get(mctx, sizeof(dst_key_t));
if (key == NULL)
@@ -974,6 +1275,12 @@ get_key_struct(dns_name_t *name, unsigned int alg,
key->key_size = bits;
key->key_class = rdclass;
key->func = dst_t_func[alg];
+ key->fmt_major = 0;
+ key->fmt_minor = 0;
+ for (i = 0; i < (DST_MAX_TIMES + 1); i++) {
+ key->times[i] = 0;
+ key->timeset[i] = ISC_FALSE;
+ }
return (key);
}
@@ -1046,7 +1353,7 @@ dst_key_read_public(const char *filename, int type,
isc_buffer_init(&b, DST_AS_STR(token), strlen(DST_AS_STR(token)));
isc_buffer_add(&b, strlen(DST_AS_STR(token)));
ret = dns_name_fromtext(dns_fixedname_name(&name), &b, dns_rootname,
- ISC_FALSE, NULL);
+ 0, NULL);
if (ret != ISC_R_SUCCESS)
goto cleanup;
@@ -1116,6 +1423,7 @@ issymmetric(const dst_key_t *key) {
case DST_ALG_DSA:
case DST_ALG_NSEC3DSA:
case DST_ALG_DH:
+ case DST_ALG_ECCGOST:
return (ISC_FALSE);
case DST_ALG_HMACMD5:
case DST_ALG_GSSAPI:
@@ -1126,6 +1434,55 @@ issymmetric(const dst_key_t *key) {
}
/*%
+ * Write key timing metadata to a file pointer, preceded by 'tag'
+ */
+static void
+printtime(const dst_key_t *key, int type, const char *tag, FILE *stream) {
+ isc_result_t result;
+#ifdef ISC_PLATFORM_USETHREADS
+ char output[26]; /* Minimum buffer as per ctime_r() specification. */
+#else
+ const char *output;
+#endif
+ isc_stdtime_t when;
+ time_t t;
+ char utc[sizeof("YYYYMMDDHHSSMM")];
+ isc_buffer_t b;
+ isc_region_t r;
+
+ result = dst_key_gettime(key, type, &when);
+ if (result == ISC_R_NOTFOUND)
+ return;
+
+ /* time_t and isc_stdtime_t might be different sizes */
+ t = when;
+#ifdef ISC_PLATFORM_USETHREADS
+#ifdef WIN32
+ if (ctime_s(output, sizeof(output), &t) != 0)
+ goto error;
+#else
+ if (ctime_r(&t, output) == NULL)
+ goto error;
+#endif
+#else
+ output = ctime(&t);
+#endif
+
+ isc_buffer_init(&b, utc, sizeof(utc));
+ result = dns_time32_totext(when, &b);
+ if (result != ISC_R_SUCCESS)
+ goto error;
+
+ isc_buffer_usedregion(&b, &r);
+ fprintf(stream, "%s: %.*s (%.*s)\n", tag, (int)r.length, r.base,
+ (int)strlen(output) - 1, output);
+ return;
+
+ error:
+ fprintf(stream, "%s: (set, unable to display)\n", tag);
+}
+
+/*%
* Writes a public key to disk in DNS format.
*/
static isc_result_t
@@ -1184,12 +1541,34 @@ write_public_key(const dst_key_t *key, int type, const char *directory) {
(void)isc_fsaccess_set(filename, access);
}
- ret = dns_name_print(key->key_name, fp);
- if (ret != ISC_R_SUCCESS) {
- fclose(fp);
- return (ret);
+ /* Write key information in comments */
+ if ((type & DST_TYPE_KEY) == 0) {
+ fprintf(fp, "; This is a %s%s-signing key, keyid %d, for ",
+ (key->key_flags & DNS_KEYFLAG_REVOKE) != 0 ?
+ "revoked " :
+ "",
+ (key->key_flags & DNS_KEYFLAG_KSK) != 0 ?
+ "key" :
+ "zone",
+ key->key_id);
+ ret = dns_name_print(key->key_name, fp);
+ if (ret != ISC_R_SUCCESS) {
+ fclose(fp);
+ return (ret);
+ }
+ fputc('\n', fp);
+
+ printtime(key, DST_TIME_CREATED, "; Created", fp);
+ printtime(key, DST_TIME_PUBLISH, "; Publish", fp);
+ printtime(key, DST_TIME_ACTIVATE, "; Activate", fp);
+ printtime(key, DST_TIME_REVOKE, "; Revoke", fp);
+ printtime(key, DST_TIME_INACTIVE, "; Inactive", fp);
+ printtime(key, DST_TIME_DELETE, "; Delete", fp);
}
+ /* Now print the actual key */
+ ret = dns_name_print(key->key_name, fp);
+
fprintf(fp, " ");
isc_buffer_usedregion(&classb, &r);
@@ -1317,15 +1696,16 @@ algorithm_status(unsigned int alg) {
alg == DST_ALG_DSA || alg == DST_ALG_DH ||
alg == DST_ALG_HMACMD5 || alg == DST_ALG_NSEC3DSA ||
alg == DST_ALG_NSEC3RSASHA1 ||
- alg == DST_ALG_RSASHA256 || alg == DST_ALG_RSASHA512)
+ alg == DST_ALG_RSASHA256 || alg == DST_ALG_RSASHA512 ||
+ alg == DST_ALG_ECCGOST)
return (DST_R_NOCRYPTO);
#endif
return (DST_R_UNSUPPORTEDALG);
}
static isc_result_t
-addsuffix(char *filename, unsigned int len, const char *ofilename,
- const char *suffix)
+addsuffix(char *filename, int len, const char *odirname,
+ const char *ofilename, const char *suffix)
{
int olen = strlen(ofilename);
int n;
@@ -1337,27 +1717,42 @@ addsuffix(char *filename, unsigned int len, const char *ofilename,
else if (olen > 4 && strcmp(ofilename + olen - 4, ".key") == 0)
olen -= 4;
- n = snprintf(filename, len, "%.*s%s", olen, ofilename, suffix);
+ if (odirname == NULL)
+ n = snprintf(filename, len, "%.*s%s", olen, ofilename, suffix);
+ else
+ n = snprintf(filename, len, "%s/%.*s%s",
+ odirname, olen, ofilename, suffix);
if (n < 0)
return (ISC_R_FAILURE);
- if ((unsigned int)n >= len)
+ if (n >= len)
return (ISC_R_NOSPACE);
return (ISC_R_SUCCESS);
}
isc_result_t
dst__entropy_getdata(void *buf, unsigned int len, isc_boolean_t pseudo) {
+#ifdef BIND9
unsigned int flags = dst_entropy_flags;
if (len == 0)
return (ISC_R_SUCCESS);
if (pseudo)
flags &= ~ISC_ENTROPY_GOODONLY;
+ else
+ flags |= ISC_ENTROPY_BLOCKING;
return (isc_entropy_getdata(dst_entropy_pool, buf, len, NULL, flags));
+#else
+ UNUSED(buf);
+ UNUSED(len);
+ UNUSED(pseudo);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
}
unsigned int
dst__entropy_status(void) {
+#ifdef BIND9
#ifdef GSSAPI
unsigned int flags = dst_entropy_flags;
isc_result_t ret;
@@ -1376,4 +1771,12 @@ dst__entropy_status(void) {
}
#endif
return (isc_entropy_status(dst_entropy_pool));
+#else
+ return (0);
+#endif
+}
+
+isc_buffer_t *
+dst_key_tkeytoken(const dst_key_t *key) {
+ return (key->key_tkeytoken);
}
diff --git a/contrib/bind9/lib/dns/dst_internal.h b/contrib/bind9/lib/dns/dst_internal.h
index 01bf1f2..220b3da 100644
--- a/contrib/bind9/lib/dns/dst_internal.h
+++ b/contrib/bind9/lib/dns/dst_internal.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst_internal.h,v 1.11.120.3 2010-12-09 01:12:55 marka Exp $ */
+/* $Id: dst_internal.h,v 1.29 2011-01-11 23:47:13 tbox Exp $ */
#ifndef DST_DST_INTERNAL_H
#define DST_DST_INTERNAL_H 1
@@ -44,9 +44,12 @@
#include <isc/refcount.h>
#include <isc/sha1.h>
#include <isc/sha2.h>
+#include <isc/stdtime.h>
#include <isc/hmacmd5.h>
#include <isc/hmacsha.h>
+#include <dns/time.h>
+
#include <dst/dst.h>
#ifdef OPENSSL
@@ -60,8 +63,8 @@
ISC_LANG_BEGINDECLS
-#define KEY_MAGIC ISC_MAGIC('D','S','T','K')
-#define CTX_MAGIC ISC_MAGIC('D','S','T','C')
+#define KEY_MAGIC ISC_MAGIC('D','S','T','K')
+#define CTX_MAGIC ISC_MAGIC('D','S','T','C')
#define VALID_KEY(x) ISC_MAGIC_VALID(x, KEY_MAGIC)
#define VALID_CTX(x) ISC_MAGIC_VALID(x, CTX_MAGIC)
@@ -74,7 +77,7 @@ extern isc_mem_t *dst__memory_pool;
typedef struct dst_func dst_func_t;
-typedef struct dst_hmacmd5_key dst_hmacmd5_key_t;
+typedef struct dst_hmacmd5_key dst_hmacmd5_key_t;
typedef struct dst_hmacsha1_key dst_hmacsha1_key_t;
typedef struct dst_hmacsha224_key dst_hmacsha224_key_t;
typedef struct dst_hmacsha256_key dst_hmacsha256_key_t;
@@ -115,7 +118,17 @@ struct dst_key {
dst_hmacsha512_key_t *hmacsha512;
} keydata; /*%< pointer to key in crypto pkg fmt */
- dst_func_t * func; /*%< crypto package specific functions */
+
+ isc_stdtime_t times[DST_MAX_TIMES + 1]; /*%< timing metadata */
+ isc_boolean_t timeset[DST_MAX_TIMES + 1]; /*%< data set? */
+ isc_stdtime_t nums[DST_MAX_NUMERIC + 1]; /*%< numeric metadata */
+ isc_boolean_t numset[DST_MAX_NUMERIC + 1]; /*%< data set? */
+
+ int fmt_major; /*%< private key format, major version */
+ int fmt_minor; /*%< private key format, minor version */
+
+ dst_func_t * func; /*%< crypto package specific functions */
+ isc_buffer_t *key_tkeytoken; /*%< TKEY token data */
};
struct dst_context {
@@ -160,7 +173,8 @@ struct dst_func {
isc_boolean_t (*compare)(const dst_key_t *key1, const dst_key_t *key2);
isc_boolean_t (*paramcompare)(const dst_key_t *key1,
const dst_key_t *key2);
- isc_result_t (*generate)(dst_key_t *key, int parms);
+ isc_result_t (*generate)(dst_key_t *key, int parms,
+ void (*callback)(int));
isc_boolean_t (*isprivate)(const dst_key_t *key);
void (*destroy)(dst_key_t *key);
@@ -168,19 +182,24 @@ struct dst_func {
isc_result_t (*todns)(const dst_key_t *key, isc_buffer_t *data);
isc_result_t (*fromdns)(dst_key_t *key, isc_buffer_t *data);
isc_result_t (*tofile)(const dst_key_t *key, const char *directory);
- isc_result_t (*parse)(dst_key_t *key, isc_lex_t *lexer);
+ isc_result_t (*parse)(dst_key_t *key,
+ isc_lex_t *lexer,
+ dst_key_t *pub);
/* cleanup */
void (*cleanup)(void);
isc_result_t (*fromlabel)(dst_key_t *key, const char *engine,
const char *label, const char *pin);
+ isc_result_t (*dump)(dst_key_t *key, isc_mem_t *mctx, char **buffer,
+ int *length);
+ isc_result_t (*restore)(dst_key_t *key, const char *keystr);
};
/*%
* Initializers
*/
-isc_result_t dst__openssl_init(void);
+isc_result_t dst__openssl_init(const char *engine);
isc_result_t dst__hmacmd5_init(struct dst_func **funcp);
isc_result_t dst__hmacsha1_init(struct dst_func **funcp);
@@ -193,6 +212,9 @@ isc_result_t dst__opensslrsa_init(struct dst_func **funcp,
isc_result_t dst__openssldsa_init(struct dst_func **funcp);
isc_result_t dst__openssldh_init(struct dst_func **funcp);
isc_result_t dst__gssapi_init(struct dst_func **funcp);
+#ifdef HAVE_OPENSSL_GOST
+isc_result_t dst__opensslgost_init(struct dst_func **funcp);
+#endif
/*%
* Destructors
diff --git a/contrib/bind9/lib/dns/dst_openssl.h b/contrib/bind9/lib/dns/dst_openssl.h
index a095d45..781085b 100644
--- a/contrib/bind9/lib/dns/dst_openssl.h
+++ b/contrib/bind9/lib/dns/dst_openssl.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst_openssl.h,v 1.7 2008-04-01 23:47:10 tbox Exp $ */
+/* $Id: dst_openssl.h,v 1.9 2009-10-06 04:40:14 tbox Exp $ */
#ifndef DST_OPENSSL_H
#define DST_OPENSSL_H 1
@@ -29,10 +29,7 @@ isc_result_t
dst__openssl_toresult(isc_result_t fallback);
ENGINE *
-dst__openssl_getengine(const char *name);
-
-isc_result_t
-dst__openssl_setdefault(const char *name);
+dst__openssl_getengine(const char *engine);
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/dns/dst_parse.c b/contrib/bind9/lib/dns/dst_parse.c
index 37264be..4d7d784 100644
--- a/contrib/bind9/lib/dns/dst_parse.c
+++ b/contrib/bind9/lib/dns/dst_parse.c
@@ -31,7 +31,7 @@
/*%
* Principal Author: Brian Wellington
- * $Id: dst_parse.c,v 1.14.120.6 2010-01-15 19:38:53 each Exp $
+ * $Id: dst_parse.c,v 1.27 2010-12-23 04:07:58 marka Exp $
*/
#include <config.h>
@@ -41,9 +41,12 @@
#include <isc/fsaccess.h>
#include <isc/lex.h>
#include <isc/mem.h>
+#include <isc/stdtime.h>
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/time.h>
+
#include "dst_internal.h"
#include "dst_parse.h"
#include "dst/result.h"
@@ -53,6 +56,25 @@
#define PRIVATE_KEY_STR "Private-key-format:"
#define ALGORITHM_STR "Algorithm:"
+#define TIMING_NTAGS (DST_MAX_TIMES + 1)
+static const char *timetags[TIMING_NTAGS] = {
+ "Created:",
+ "Publish:",
+ "Activate:",
+ "Revoke:",
+ "Inactive:",
+ "Delete:",
+ "DSPublish:"
+};
+
+#define NUMERIC_NTAGS (DST_MAX_NUMERIC + 1)
+static const char *numerictags[NUMERIC_NTAGS] = {
+ "Predecessor:",
+ "Successor:",
+ "MaxTTL:",
+ "RollPeriod:"
+};
+
struct parse_map {
const int value;
const char *tag;
@@ -82,6 +104,8 @@ static struct parse_map map[] = {
{TAG_DSA_PRIVATE, "Private_value(x):"},
{TAG_DSA_PUBLIC, "Public_value(y):"},
+ {TAG_GOST_PRIVASN1, "GostAsn1:"},
+
{TAG_HMACMD5_KEY, "Key:"},
{TAG_HMACMD5_BITS, "Bits:"},
@@ -107,13 +131,12 @@ static int
find_value(const char *s, const unsigned int alg) {
int i;
- for (i = 0; ; i++) {
- if (map[i].tag == NULL)
- return (-1);
- else if (strcasecmp(s, map[i].tag) == 0 &&
- TAG_ALG(map[i].value) == alg)
+ for (i = 0; map[i].tag != NULL; i++) {
+ if (strcasecmp(s, map[i].tag) == 0 &&
+ (TAG_ALG(map[i].value) == alg))
return (map[i].value);
}
+ return (-1);
}
static const char *
@@ -129,6 +152,28 @@ find_tag(const int value) {
}
static int
+find_metadata(const char *s, const char *tags[], int ntags) {
+ int i;
+
+ for (i = 0; i < ntags; i++) {
+ if (strcasecmp(s, tags[i]) == 0)
+ return (i);
+ }
+
+ return (-1);
+}
+
+static int
+find_timedata(const char *s) {
+ return (find_metadata(s, timetags, TIMING_NTAGS));
+}
+
+static int
+find_numericdata(const char *s) {
+ return (find_metadata(s, numerictags, NUMERIC_NTAGS));
+}
+
+static int
check_rsa(const dst_private_t *priv) {
int i, j;
isc_boolean_t have[RSA_NTAGS];
@@ -197,6 +242,15 @@ check_dsa(const dst_private_t *priv) {
}
static int
+check_gost(const dst_private_t *priv) {
+ if (priv->nelements != GOST_NTAGS)
+ return (-1);
+ if (priv->elements[0].tag != TAG(DST_ALG_ECCGOST, 0))
+ return (-1);
+ return (0);
+}
+
+static int
check_hmac_md5(const dst_private_t *priv, isc_boolean_t old) {
int i, j;
@@ -253,6 +307,8 @@ check_data(const dst_private_t *priv, const unsigned int alg,
return (check_dh(priv));
case DST_ALG_DSA:
return (check_dsa(priv));
+ case DST_ALG_ECCGOST:
+ return (check_gost(priv));
case DST_ALG_HMACMD5:
return (check_hmac_md5(priv, old));
case DST_ALG_HMACSHA1:
@@ -285,7 +341,7 @@ dst__privstruct_free(dst_private_t *priv, isc_mem_t *mctx) {
priv->nelements = 0;
}
-int
+isc_result_t
dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
isc_mem_t *mctx, dst_private_t *priv)
{
@@ -294,6 +350,7 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
isc_token_t token;
unsigned char *data = NULL;
unsigned int opt = ISC_LEXOPT_EOL;
+ isc_stdtime_t when;
isc_result_t ret;
REQUIRE(priv != NULL);
@@ -341,13 +398,16 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
goto fail;
}
- if (major > MAJOR_VERSION ||
- (major == MAJOR_VERSION && minor > MINOR_VERSION))
- {
+ if (major > DST_MAJOR_VERSION) {
ret = DST_R_INVALIDPRIVATEKEY;
goto fail;
}
+ /*
+ * Store the private key format version number
+ */
+ dst_key_setprivateformat(key, major, minor);
+
READLINE(lex, opt, &token);
/*
@@ -377,7 +437,6 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
for (n = 0; n < MAXFIELDS; n++) {
int tag;
isc_region_t r;
-
do {
ret = isc_lex_gettoken(lex, opt, &token);
if (ret == ISC_R_EOF)
@@ -391,11 +450,50 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
goto fail;
}
+ /* Numeric metadata */
+ tag = find_numericdata(DST_AS_STR(token));
+ if (tag >= 0) {
+ INSIST(tag < NUMERIC_NTAGS);
+
+ NEXTTOKEN(lex, opt | ISC_LEXOPT_NUMBER, &token);
+ if (token.type != isc_tokentype_number) {
+ ret = DST_R_INVALIDPRIVATEKEY;
+ goto fail;
+ }
+
+ dst_key_setnum(key, tag, token.value.as_ulong);
+ goto next;
+ }
+
+ /* Timing metadata */
+ tag = find_timedata(DST_AS_STR(token));
+ if (tag >= 0) {
+ INSIST(tag < TIMING_NTAGS);
+
+ NEXTTOKEN(lex, opt, &token);
+ if (token.type != isc_tokentype_string) {
+ ret = DST_R_INVALIDPRIVATEKEY;
+ goto fail;
+ }
+
+ ret = dns_time32_fromtext(DST_AS_STR(token), &when);
+ if (ret != ISC_R_SUCCESS)
+ goto fail;
+
+ dst_key_settime(key, tag, when);
+
+ goto next;
+ }
+
+ /* Key data */
tag = find_value(DST_AS_STR(token), alg);
- if (tag < 0 || TAG_ALG(tag) != alg) {
+ if (tag < 0 && minor > DST_MINOR_VERSION)
+ goto next;
+ else if (tag < 0) {
ret = DST_R_INVALIDPRIVATEKEY;
goto fail;
}
+
priv->elements[n].tag = tag;
data = (unsigned char *) isc_mem_get(mctx, MAXFIELDSIZE);
@@ -406,23 +504,23 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
ret = isc_base64_tobuffer(lex, &b, -1);
if (ret != ISC_R_SUCCESS)
goto fail;
+
isc_buffer_usedregion(&b, &r);
priv->elements[n].length = r.length;
priv->elements[n].data = r.base;
+ priv->nelements++;
+ next:
READLINE(lex, opt, &token);
data = NULL;
}
done:
- priv->nelements = n;
-
if (check_data(priv, alg, ISC_TRUE) < 0)
goto fail;
return (ISC_R_SUCCESS);
fail:
- priv->nelements = n;
dst__privstruct_free(priv, mctx);
if (data != NULL)
isc_mem_put(mctx, data, MAXFIELDSIZE);
@@ -430,17 +528,21 @@ fail:
return (ret);
}
-int
+isc_result_t
dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
const char *directory)
{
FILE *fp;
int ret, i;
- isc_result_t iret;
+ isc_result_t result;
char filename[ISC_DIR_NAMEMAX];
char buffer[MAXFIELDSIZE * 2];
- isc_buffer_t b;
isc_fsaccess_t access;
+ isc_stdtime_t when;
+ isc_uint32_t value;
+ isc_buffer_t b;
+ isc_region_t r;
+ int major, minor;
REQUIRE(priv != NULL);
@@ -461,11 +563,17 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
&access);
(void)isc_fsaccess_set(filename, access);
+ dst_key_getprivateformat(key, &major, &minor);
+ if (major == 0 && minor == 0) {
+ major = DST_MAJOR_VERSION;
+ minor = DST_MINOR_VERSION;
+ }
+
/* XXXDCL return value should be checked for full filesystem */
- fprintf(fp, "%s v%d.%d\n", PRIVATE_KEY_STR, MAJOR_VERSION,
- MINOR_VERSION);
+ fprintf(fp, "%s v%d.%d\n", PRIVATE_KEY_STR, major, minor);
fprintf(fp, "%s %d ", ALGORITHM_STR, dst_key_alg(key));
+
/* XXXVIX this switch statement is too sparse to gen a jump table. */
switch (dst_key_alg(key)) {
case DST_ALG_RSAMD5:
@@ -480,18 +588,21 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
case DST_ALG_RSASHA1:
fprintf(fp, "(RSASHA1)\n");
break;
- case DST_ALG_NSEC3DSA:
- fprintf(fp, "(NSEC3DSA)\n");
- break;
case DST_ALG_NSEC3RSASHA1:
fprintf(fp, "(NSEC3RSASHA1)\n");
break;
+ case DST_ALG_NSEC3DSA:
+ fprintf(fp, "(NSEC3DSA)\n");
+ break;
case DST_ALG_RSASHA256:
fprintf(fp, "(RSASHA256)\n");
break;
case DST_ALG_RSASHA512:
fprintf(fp, "(RSASHA512)\n");
break;
+ case DST_ALG_ECCGOST:
+ fprintf(fp, "(ECC-GOST)\n");
+ break;
case DST_ALG_HMACMD5:
fprintf(fp, "(HMAC_MD5)\n");
break;
@@ -516,8 +627,6 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
}
for (i = 0; i < priv->nelements; i++) {
- isc_buffer_t b;
- isc_region_t r;
const char *s;
s = find_tag(priv->elements[i].tag);
@@ -525,8 +634,8 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
r.base = priv->elements[i].data;
r.length = priv->elements[i].length;
isc_buffer_init(&b, buffer, sizeof(buffer));
- iret = isc_base64_totext(&r, sizeof(buffer), "", &b);
- if (iret != ISC_R_SUCCESS) {
+ result = isc_base64_totext(&r, sizeof(buffer), "", &b);
+ if (result != ISC_R_SUCCESS) {
fclose(fp);
return (DST_R_INVALIDPRIVATEKEY);
}
@@ -537,10 +646,36 @@ dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
fprintf(fp, "\n");
}
+ /* Add the metadata tags */
+ if (major > 1 || (major == 1 && minor >= 3)) {
+ for (i = 0; i < NUMERIC_NTAGS; i++) {
+ result = dst_key_getnum(key, i, &value);
+ if (result != ISC_R_SUCCESS)
+ continue;
+ fprintf(fp, "%s %u\n", numerictags[i], value);
+ }
+ for (i = 0; i < TIMING_NTAGS; i++) {
+ result = dst_key_gettime(key, i, &when);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ isc_buffer_init(&b, buffer, sizeof(buffer));
+ result = dns_time32_totext(when, &b);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ isc_buffer_usedregion(&b, &r);
+
+ fprintf(fp, "%s ", timetags[i]);
+ isc_util_fwrite(r.base, 1, r.length, fp);
+ fprintf(fp, "\n");
+ }
+ }
+
fflush(fp);
- iret = ferror(fp) ? DST_R_WRITEERROR : ISC_R_SUCCESS;
+ result = ferror(fp) ? DST_R_WRITEERROR : ISC_R_SUCCESS;
fclose(fp);
- return (iret);
+ return (result);
}
/*! \file */
diff --git a/contrib/bind9/lib/dns/dst_parse.h b/contrib/bind9/lib/dns/dst_parse.h
index 11e2b33..d1034ce 100644
--- a/contrib/bind9/lib/dns/dst_parse.h
+++ b/contrib/bind9/lib/dns/dst_parse.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst_parse.h,v 1.11 2008-05-15 00:50:26 each Exp $ */
+/* $Id: dst_parse.h,v 1.17 2010-12-23 23:47:08 tbox Exp $ */
/*! \file */
#ifndef DST_DST_PARSE_H
@@ -39,11 +39,13 @@
#include <dst/dst.h>
-#define MAJOR_VERSION 1
-#define MINOR_VERSION 2
-
#define MAXFIELDSIZE 512
-#define MAXFIELDS 12
+
+/*
+ * Maximum number of fields in a private file is 18 (12 algorithm-
+ * specific fields for RSA, plus 6 generic fields).
+ */
+#define MAXFIELDS 12+6
#define TAG_SHIFT 4
#define TAG_ALG(tag) ((unsigned int)(tag) >> TAG_SHIFT)
@@ -76,6 +78,9 @@
#define TAG_DSA_PRIVATE ((DST_ALG_DSA << TAG_SHIFT) + 3)
#define TAG_DSA_PUBLIC ((DST_ALG_DSA << TAG_SHIFT) + 4)
+#define GOST_NTAGS 1
+#define TAG_GOST_PRIVASN1 ((DST_ALG_ECCGOST << TAG_SHIFT) + 0)
+
#define OLD_HMACMD5_NTAGS 1
#define HMACMD5_NTAGS 2
#define TAG_HMACMD5_KEY ((DST_ALG_HMACMD5 << TAG_SHIFT) + 0)
@@ -121,11 +126,11 @@ ISC_LANG_BEGINDECLS
void
dst__privstruct_free(dst_private_t *priv, isc_mem_t *mctx);
-int
+isc_result_t
dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex,
isc_mem_t *mctx, dst_private_t *priv);
-int
+isc_result_t
dst__privstruct_writefile(const dst_key_t *key, const dst_private_t *priv,
const char *directory);
diff --git a/contrib/bind9/lib/dns/ecdb.c b/contrib/bind9/lib/dns/ecdb.c
new file mode 100644
index 0000000..d98a3eb
--- /dev/null
+++ b/contrib/bind9/lib/dns/ecdb.c
@@ -0,0 +1,810 @@
+/*
+ * Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ecdb.c,v 1.8 2011-01-14 00:51:43 tbox Exp $ */
+
+#include "config.h"
+
+#include <isc/result.h>
+#include <isc/util.h>
+#include <isc/mutex.h>
+#include <isc/mem.h>
+
+#include <dns/db.h>
+#include <dns/ecdb.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
+#include <dns/rdataslab.h>
+
+#define ECDB_MAGIC ISC_MAGIC('E', 'C', 'D', 'B')
+#define VALID_ECDB(db) ((db) != NULL && \
+ (db)->common.impmagic == ECDB_MAGIC)
+
+#define ECDBNODE_MAGIC ISC_MAGIC('E', 'C', 'D', 'N')
+#define VALID_ECDBNODE(ecdbn) ISC_MAGIC_VALID(ecdbn, ECDBNODE_MAGIC)
+
+#if DNS_RDATASET_FIXED
+#error "Fixed rdataset isn't supported in this implementation"
+#endif
+
+/*%
+ * The 'ephemeral' cache DB (ecdb) implementation. An ecdb just provides
+ * temporary storage for ongoing name resolution with the common DB interfaces.
+ * It actually doesn't cache anything. The implementation expects any stored
+ * data is released within a short period, and does not care about the
+ * scalability in terms of the number of nodes.
+ */
+
+typedef struct dns_ecdb {
+ /* Unlocked */
+ dns_db_t common;
+ isc_mutex_t lock;
+
+ /* Locked */
+ unsigned int references;
+ ISC_LIST(struct dns_ecdbnode) nodes;
+} dns_ecdb_t;
+
+typedef struct dns_ecdbnode {
+ /* Unlocked */
+ unsigned int magic;
+ isc_mutex_t lock;
+ dns_ecdb_t *ecdb;
+ dns_name_t name;
+ ISC_LINK(struct dns_ecdbnode) link;
+
+ /* Locked */
+ ISC_LIST(struct rdatasetheader) rdatasets;
+ unsigned int references;
+} dns_ecdbnode_t;
+
+typedef struct rdatasetheader {
+ dns_rdatatype_t type;
+ dns_ttl_t ttl;
+ dns_trust_t trust;
+ dns_rdatatype_t covers;
+ unsigned int attributes;
+
+ ISC_LINK(struct rdatasetheader) link;
+} rdatasetheader_t;
+
+/* Copied from rbtdb.c */
+#define RDATASET_ATTR_NXDOMAIN 0x0010
+#define NXDOMAIN(header) \
+ (((header)->attributes & RDATASET_ATTR_NXDOMAIN) != 0)
+
+static isc_result_t dns_ecdb_create(isc_mem_t *mctx, dns_name_t *origin,
+ dns_dbtype_t type,
+ dns_rdataclass_t rdclass,
+ unsigned int argc, char *argv[],
+ void *driverarg, dns_db_t **dbp);
+
+static void rdataset_disassociate(dns_rdataset_t *rdataset);
+static isc_result_t rdataset_first(dns_rdataset_t *rdataset);
+static isc_result_t rdataset_next(dns_rdataset_t *rdataset);
+static void rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata);
+static void rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target);
+static unsigned int rdataset_count(dns_rdataset_t *rdataset);
+static void rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust);
+
+static dns_rdatasetmethods_t rdataset_methods = {
+ rdataset_disassociate,
+ rdataset_first,
+ rdataset_next,
+ rdataset_current,
+ rdataset_clone,
+ rdataset_count,
+ NULL, /* addnoqname */
+ NULL, /* getnoqname */
+ NULL, /* addclosest */
+ NULL, /* getclosest */
+ NULL, /* getadditional */
+ NULL, /* setadditional */
+ NULL, /* putadditional */
+ rdataset_settrust, /* settrust */
+ NULL /* expire */
+};
+
+typedef struct ecdb_rdatasetiter {
+ dns_rdatasetiter_t common;
+ rdatasetheader_t *current;
+} ecdb_rdatasetiter_t;
+
+static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
+static isc_result_t rdatasetiter_first(dns_rdatasetiter_t *iterator);
+static isc_result_t rdatasetiter_next(dns_rdatasetiter_t *iterator);
+static void rdatasetiter_current(dns_rdatasetiter_t *iterator,
+ dns_rdataset_t *rdataset);
+
+static dns_rdatasetitermethods_t rdatasetiter_methods = {
+ rdatasetiter_destroy,
+ rdatasetiter_first,
+ rdatasetiter_next,
+ rdatasetiter_current
+};
+
+isc_result_t
+dns_ecdb_register(isc_mem_t *mctx, dns_dbimplementation_t **dbimp) {
+ REQUIRE(mctx != NULL);
+ REQUIRE(dbimp != NULL && *dbimp == NULL);
+
+ return (dns_db_register("ecdb", dns_ecdb_create, NULL, mctx, dbimp));
+}
+
+void
+dns_ecdb_unregister(dns_dbimplementation_t **dbimp) {
+ REQUIRE(dbimp != NULL && *dbimp != NULL);
+
+ dns_db_unregister(dbimp);
+}
+
+/*%
+ * DB routines
+ */
+
+static void
+attach(dns_db_t *source, dns_db_t **targetp) {
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)source;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ LOCK(&ecdb->lock);
+ ecdb->references++;
+ UNLOCK(&ecdb->lock);
+
+ *targetp = source;
+}
+
+static void
+destroy_ecdb(dns_ecdb_t **ecdbp) {
+ dns_ecdb_t *ecdb = *ecdbp;
+ isc_mem_t *mctx = ecdb->common.mctx;
+
+ if (dns_name_dynamic(&ecdb->common.origin))
+ dns_name_free(&ecdb->common.origin, mctx);
+
+ DESTROYLOCK(&ecdb->lock);
+
+ ecdb->common.impmagic = 0;
+ ecdb->common.magic = 0;
+
+ isc_mem_putanddetach(&mctx, ecdb, sizeof(*ecdb));
+
+ *ecdbp = NULL;
+}
+
+static void
+detach(dns_db_t **dbp) {
+ dns_ecdb_t *ecdb;
+ isc_boolean_t need_destroy = ISC_FALSE;
+
+ REQUIRE(dbp != NULL);
+ ecdb = (dns_ecdb_t *)*dbp;
+ REQUIRE(VALID_ECDB(ecdb));
+
+ LOCK(&ecdb->lock);
+ ecdb->references--;
+ if (ecdb->references == 0 && ISC_LIST_EMPTY(ecdb->nodes))
+ need_destroy = ISC_TRUE;
+ UNLOCK(&ecdb->lock);
+
+ if (need_destroy)
+ destroy_ecdb(&ecdb);
+
+ *dbp = NULL;
+}
+
+static void
+attachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ dns_ecdbnode_t *node = (dns_ecdbnode_t *)source;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(VALID_ECDBNODE(node));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ LOCK(&node->lock);
+ INSIST(node->references > 0);
+ node->references++;
+ INSIST(node->references != 0); /* Catch overflow. */
+ UNLOCK(&node->lock);
+
+ *targetp = node;
+}
+
+static void
+destroynode(dns_ecdbnode_t *node) {
+ isc_mem_t *mctx;
+ dns_ecdb_t *ecdb = node->ecdb;
+ isc_boolean_t need_destroydb = ISC_FALSE;
+ rdatasetheader_t *header;
+
+ mctx = ecdb->common.mctx;
+
+ LOCK(&ecdb->lock);
+ ISC_LIST_UNLINK(ecdb->nodes, node, link);
+ if (ecdb->references == 0 && ISC_LIST_EMPTY(ecdb->nodes))
+ need_destroydb = ISC_TRUE;
+ UNLOCK(&ecdb->lock);
+
+ dns_name_free(&node->name, mctx);
+
+ while ((header = ISC_LIST_HEAD(node->rdatasets)) != NULL) {
+ unsigned int headersize;
+
+ ISC_LIST_UNLINK(node->rdatasets, header, link);
+ headersize =
+ dns_rdataslab_size((unsigned char *)header,
+ sizeof(*header));
+ isc_mem_put(mctx, header, headersize);
+ }
+
+ DESTROYLOCK(&node->lock);
+
+ node->magic = 0;
+ isc_mem_put(mctx, node, sizeof(*node));
+
+ if (need_destroydb)
+ destroy_ecdb(&ecdb);
+}
+
+static void
+detachnode(dns_db_t *db, dns_dbnode_t **nodep) {
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ dns_ecdbnode_t *node;
+ isc_boolean_t need_destroy = ISC_FALSE;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(nodep != NULL);
+ node = (dns_ecdbnode_t *)*nodep;
+ REQUIRE(VALID_ECDBNODE(node));
+
+ UNUSED(ecdb); /* in case REQUIRE() is empty */
+
+ LOCK(&node->lock);
+ INSIST(node->references > 0);
+ node->references--;
+ if (node->references == 0)
+ need_destroy = ISC_TRUE;
+ UNLOCK(&node->lock);
+
+ if (need_destroy)
+ destroynode(node);
+
+ *nodep = NULL;
+}
+
+static isc_result_t
+find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
+ dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
+ dns_dbnode_t **nodep, dns_name_t *foundname, dns_rdataset_t *rdataset,
+ dns_rdataset_t *sigrdataset)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+
+ REQUIRE(VALID_ECDB(ecdb));
+
+ UNUSED(name);
+ UNUSED(version);
+ UNUSED(type);
+ UNUSED(options);
+ UNUSED(now);
+ UNUSED(nodep);
+ UNUSED(foundname);
+ UNUSED(rdataset);
+ UNUSED(sigrdataset);
+
+ return (ISC_R_NOTFOUND);
+}
+
+static isc_result_t
+findzonecut(dns_db_t *db, dns_name_t *name,
+ unsigned int options, isc_stdtime_t now,
+ dns_dbnode_t **nodep, dns_name_t *foundname,
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+
+ REQUIRE(VALID_ECDB(ecdb));
+
+ UNUSED(name);
+ UNUSED(options);
+ UNUSED(now);
+ UNUSED(nodep);
+ UNUSED(foundname);
+ UNUSED(rdataset);
+ UNUSED(sigrdataset);
+
+ return (ISC_R_NOTFOUND);
+}
+
+static isc_result_t
+findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
+ dns_dbnode_t **nodep)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ isc_mem_t *mctx;
+ dns_ecdbnode_t *node;
+ isc_result_t result;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(nodep != NULL && *nodep == NULL);
+
+ UNUSED(name);
+
+ if (create != ISC_TRUE) {
+ /* an 'ephemeral' node is never reused. */
+ return (ISC_R_NOTFOUND);
+ }
+
+ mctx = ecdb->common.mctx;
+ node = isc_mem_get(mctx, sizeof(*node));
+ if (node == NULL)
+ return (ISC_R_NOMEMORY);
+
+ result = isc_mutex_init(&node->lock);
+ if (result != ISC_R_SUCCESS) {
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_mutex_init() failed: %s",
+ isc_result_totext(result));
+ isc_mem_put(mctx, node, sizeof(*node));
+ return (ISC_R_UNEXPECTED);
+ }
+
+ dns_name_init(&node->name, NULL);
+ result = dns_name_dup(name, mctx, &node->name);
+ if (result != ISC_R_SUCCESS) {
+ DESTROYLOCK(&node->lock);
+ isc_mem_put(mctx, node, sizeof(*node));
+ return (result);
+ }
+ node->ecdb= ecdb;
+ node->references = 1;
+ ISC_LIST_INIT(node->rdatasets);
+
+ ISC_LINK_INIT(node, link);
+
+ LOCK(&ecdb->lock);
+ ISC_LIST_APPEND(ecdb->nodes, node, link);
+ UNLOCK(&ecdb->lock);
+
+ node->magic = ECDBNODE_MAGIC;
+
+ *nodep = node;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+bind_rdataset(dns_ecdb_t *ecdb, dns_ecdbnode_t *node,
+ rdatasetheader_t *header, dns_rdataset_t *rdataset)
+{
+ unsigned char *raw;
+
+ /*
+ * Caller must be holding the node lock.
+ */
+
+ REQUIRE(!dns_rdataset_isassociated(rdataset));
+
+ rdataset->methods = &rdataset_methods;
+ rdataset->rdclass = ecdb->common.rdclass;
+ rdataset->type = header->type;
+ rdataset->covers = header->covers;
+ rdataset->ttl = header->ttl;
+ rdataset->trust = header->trust;
+ if (NXDOMAIN(header))
+ rdataset->attributes |= DNS_RDATASETATTR_NXDOMAIN;
+
+ rdataset->private1 = ecdb;
+ rdataset->private2 = node;
+ raw = (unsigned char *)header + sizeof(*header);
+ rdataset->private3 = raw;
+ rdataset->count = 0;
+
+ /*
+ * Reset iterator state.
+ */
+ rdataset->privateuint4 = 0;
+ rdataset->private5 = NULL;
+
+ INSIST(node->references > 0);
+ node->references++;
+}
+
+static isc_result_t
+addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
+ dns_rdataset_t *addedrdataset)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ isc_region_t r;
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_mem_t *mctx;
+ dns_ecdbnode_t *ecdbnode = (dns_ecdbnode_t *)node;
+ rdatasetheader_t *header;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(VALID_ECDBNODE(ecdbnode));
+
+ UNUSED(version);
+ UNUSED(now);
+ UNUSED(options);
+
+ mctx = ecdb->common.mctx;
+
+ LOCK(&ecdbnode->lock);
+
+ /*
+ * Sanity check: this implementation does not allow overriding an
+ * existing rdataset of the same type.
+ */
+ for (header = ISC_LIST_HEAD(ecdbnode->rdatasets); header != NULL;
+ header = ISC_LIST_NEXT(header, link)) {
+ INSIST(header->type != rdataset->type ||
+ header->covers != rdataset->covers);
+ }
+
+ result = dns_rdataslab_fromrdataset(rdataset, mctx,
+ &r, sizeof(rdatasetheader_t));
+ if (result != ISC_R_SUCCESS)
+ goto unlock;
+
+ header = (rdatasetheader_t *)r.base;
+ header->type = rdataset->type;
+ header->ttl = rdataset->ttl;
+ header->trust = rdataset->trust;
+ header->covers = rdataset->covers;
+ header->attributes = 0;
+ if ((rdataset->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
+ header->attributes |= RDATASET_ATTR_NXDOMAIN;
+ ISC_LINK_INIT(header, link);
+ ISC_LIST_APPEND(ecdbnode->rdatasets, header, link);
+
+ if (addedrdataset == NULL)
+ goto unlock;
+
+ bind_rdataset(ecdb, ecdbnode, header, addedrdataset);
+
+ unlock:
+ UNLOCK(&ecdbnode->lock);
+
+ return (result);
+}
+
+static isc_result_t
+deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ dns_rdatatype_t type, dns_rdatatype_t covers)
+{
+ UNUSED(db);
+ UNUSED(node);
+ UNUSED(version);
+ UNUSED(type);
+ UNUSED(covers);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+
+static isc_result_t
+createiterator(dns_db_t *db, unsigned int options,
+ dns_dbiterator_t **iteratorp)
+{
+ UNUSED(db);
+ UNUSED(options);
+ UNUSED(iteratorp);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+
+static isc_result_t
+allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
+{
+ dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
+ dns_ecdbnode_t *ecdbnode = (dns_ecdbnode_t *)node;
+ isc_mem_t *mctx;
+ ecdb_rdatasetiter_t *iterator;
+
+ REQUIRE(VALID_ECDB(ecdb));
+ REQUIRE(VALID_ECDBNODE(ecdbnode));
+
+ mctx = ecdb->common.mctx;
+
+ iterator = isc_mem_get(mctx, sizeof(ecdb_rdatasetiter_t));
+ if (iterator == NULL)
+ return (ISC_R_NOMEMORY);
+
+ iterator->common.magic = DNS_RDATASETITER_MAGIC;
+ iterator->common.methods = &rdatasetiter_methods;
+ iterator->common.db = db;
+ iterator->common.node = NULL;
+ attachnode(db, node, &iterator->common.node);
+ iterator->common.version = version;
+ iterator->common.now = now;
+
+ *iteratorp = (dns_rdatasetiter_t *)iterator;
+
+ return (ISC_R_SUCCESS);
+}
+
+static dns_dbmethods_t ecdb_methods = {
+ attach,
+ detach,
+ NULL, /* beginload */
+ NULL, /* endload */
+ NULL, /* dump */
+ NULL, /* currentversion */
+ NULL, /* newversion */
+ NULL, /* attachversion */
+ NULL, /* closeversion */
+ findnode,
+ find,
+ findzonecut,
+ attachnode,
+ detachnode,
+ NULL, /* expirenode */
+ NULL, /* printnode */
+ createiterator, /* createiterator */
+ NULL, /* findrdataset */
+ allrdatasets,
+ addrdataset,
+ NULL, /* subtractrdataset */
+ deleterdataset,
+ NULL, /* issecure */
+ NULL, /* nodecount */
+ NULL, /* ispersistent */
+ NULL, /* overmem */
+ NULL, /* settask */
+ NULL, /* getoriginnode */
+ NULL, /* transfernode */
+ NULL, /* getnsec3parameters */
+ NULL, /* findnsec3node */
+ NULL, /* setsigningtime */
+ NULL, /* getsigningtime */
+ NULL, /* resigned */
+ NULL, /* isdnssec */
+ NULL, /* getrrsetstats */
+ NULL, /* rpz_enabled */
+ NULL /* rpz_findips */
+};
+
+static isc_result_t
+dns_ecdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,
+ dns_rdataclass_t rdclass, unsigned int argc, char *argv[],
+ void *driverarg, dns_db_t **dbp)
+{
+ dns_ecdb_t *ecdb;
+ isc_result_t result;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(origin == dns_rootname);
+ REQUIRE(type == dns_dbtype_cache);
+ REQUIRE(dbp != NULL && *dbp == NULL);
+
+ UNUSED(argc);
+ UNUSED(argv);
+ UNUSED(driverarg);
+
+ ecdb = isc_mem_get(mctx, sizeof(*ecdb));
+ if (ecdb == NULL)
+ return (ISC_R_NOMEMORY);
+
+ ecdb->common.attributes = DNS_DBATTR_CACHE;
+ ecdb->common.rdclass = rdclass;
+ ecdb->common.methods = &ecdb_methods;
+ dns_name_init(&ecdb->common.origin, NULL);
+ result = dns_name_dupwithoffsets(origin, mctx, &ecdb->common.origin);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, ecdb, sizeof(*ecdb));
+ return (result);
+ }
+
+ result = isc_mutex_init(&ecdb->lock);
+ if (result != ISC_R_SUCCESS) {
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_mutex_init() failed: %s",
+ isc_result_totext(result));
+ if (dns_name_dynamic(&ecdb->common.origin))
+ dns_name_free(&ecdb->common.origin, mctx);
+ isc_mem_put(mctx, ecdb, sizeof(*ecdb));
+ return (ISC_R_UNEXPECTED);
+ }
+
+ ecdb->references = 1;
+ ISC_LIST_INIT(ecdb->nodes);
+
+ ecdb->common.mctx = NULL;
+ isc_mem_attach(mctx, &ecdb->common.mctx);
+ ecdb->common.impmagic = ECDB_MAGIC;
+ ecdb->common.magic = DNS_DB_MAGIC;
+
+ *dbp = (dns_db_t *)ecdb;
+
+ return (ISC_R_SUCCESS);
+}
+
+/*%
+ * Rdataset Methods
+ */
+
+static void
+rdataset_disassociate(dns_rdataset_t *rdataset) {
+ dns_db_t *db = rdataset->private1;
+ dns_dbnode_t *node = rdataset->private2;
+
+ dns_db_detachnode(db, &node);
+}
+
+static isc_result_t
+rdataset_first(dns_rdataset_t *rdataset) {
+ unsigned char *raw = rdataset->private3;
+ unsigned int count;
+
+ count = raw[0] * 256 + raw[1];
+ if (count == 0) {
+ rdataset->private5 = NULL;
+ return (ISC_R_NOMORE);
+ }
+ raw += 2;
+ /*
+ * The privateuint4 field is the number of rdata beyond the cursor
+ * position, so we decrement the total count by one before storing
+ * it.
+ */
+ count--;
+ rdataset->privateuint4 = count;
+ rdataset->private5 = raw;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+rdataset_next(dns_rdataset_t *rdataset) {
+ unsigned int count;
+ unsigned int length;
+ unsigned char *raw;
+
+ count = rdataset->privateuint4;
+ if (count == 0)
+ return (ISC_R_NOMORE);
+ count--;
+ rdataset->privateuint4 = count;
+ raw = rdataset->private5;
+ length = raw[0] * 256 + raw[1];
+ raw += length + 2;
+ rdataset->private5 = raw;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
+ unsigned char *raw = rdataset->private5;
+ isc_region_t r;
+ unsigned int length;
+ unsigned int flags = 0;
+
+ REQUIRE(raw != NULL);
+
+ length = raw[0] * 256 + raw[1];
+ raw += 2;
+ if (rdataset->type == dns_rdatatype_rrsig) {
+ if (*raw & DNS_RDATASLAB_OFFLINE)
+ flags |= DNS_RDATA_OFFLINE;
+ length--;
+ raw++;
+ }
+ r.length = length;
+ r.base = raw;
+ dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r);
+ rdata->flags |= flags;
+}
+
+static void
+rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
+ dns_db_t *db = source->private1;
+ dns_dbnode_t *node = source->private2;
+ dns_dbnode_t *cloned_node = NULL;
+
+ attachnode(db, node, &cloned_node);
+ *target = *source;
+
+ /*
+ * Reset iterator state.
+ */
+ target->privateuint4 = 0;
+ target->private5 = NULL;
+}
+
+static unsigned int
+rdataset_count(dns_rdataset_t *rdataset) {
+ unsigned char *raw = rdataset->private3;
+ unsigned int count;
+
+ count = raw[0] * 256 + raw[1];
+
+ return (count);
+}
+
+static void
+rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust) {
+ rdatasetheader_t *header = rdataset->private3;
+
+ header--;
+ header->trust = rdataset->trust = trust;
+}
+
+/*
+ * Rdataset Iterator Methods
+ */
+
+static void
+rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp) {
+ ecdb_rdatasetiter_t *ecdbiterator;
+ isc_mem_t *mctx;
+
+ REQUIRE(iteratorp != NULL);
+ ecdbiterator = (ecdb_rdatasetiter_t *)*iteratorp;
+ REQUIRE(DNS_RDATASETITER_VALID(&ecdbiterator->common));
+
+ mctx = ecdbiterator->common.db->mctx;
+
+ ecdbiterator->common.magic = 0;
+
+ dns_db_detachnode(ecdbiterator->common.db, &ecdbiterator->common.node);
+ isc_mem_put(mctx, ecdbiterator, sizeof(ecdb_rdatasetiter_t));
+
+ *iteratorp = NULL;
+}
+
+static isc_result_t
+rdatasetiter_first(dns_rdatasetiter_t *iterator) {
+ ecdb_rdatasetiter_t *ecdbiterator = (ecdb_rdatasetiter_t *)iterator;
+ dns_ecdbnode_t *ecdbnode = (dns_ecdbnode_t *)iterator->node;
+
+ REQUIRE(DNS_RDATASETITER_VALID(iterator));
+
+ if (ISC_LIST_EMPTY(ecdbnode->rdatasets))
+ return (ISC_R_NOMORE);
+ ecdbiterator->current = ISC_LIST_HEAD(ecdbnode->rdatasets);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+rdatasetiter_next(dns_rdatasetiter_t *iterator) {
+ ecdb_rdatasetiter_t *ecdbiterator = (ecdb_rdatasetiter_t *)iterator;
+
+ REQUIRE(DNS_RDATASETITER_VALID(iterator));
+
+ ecdbiterator->current = ISC_LIST_NEXT(ecdbiterator->current, link);
+ if (ecdbiterator->current == NULL)
+ return (ISC_R_NOMORE);
+ else
+ return (ISC_R_SUCCESS);
+}
+
+static void
+rdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) {
+ ecdb_rdatasetiter_t *ecdbiterator = (ecdb_rdatasetiter_t *)iterator;
+ dns_ecdb_t *ecdb;
+
+ ecdb = (dns_ecdb_t *)iterator->db;
+ REQUIRE(VALID_ECDB(ecdb));
+
+ bind_rdataset(ecdb, iterator->node, ecdbiterator->current, rdataset);
+}
diff --git a/contrib/bind9/lib/dns/forward.c b/contrib/bind9/lib/dns/forward.c
index 1406b46..1f9c41a 100644
--- a/contrib/bind9/lib/dns/forward.c
+++ b/contrib/bind9/lib/dns/forward.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: forward.c,v 1.12 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: forward.c,v 1.14 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -133,11 +133,27 @@ dns_fwdtable_add(dns_fwdtable_t *fwdtable, dns_name_t *name,
}
isc_result_t
+dns_fwdtable_delete(dns_fwdtable_t *fwdtable, dns_name_t *name) {
+ isc_result_t result;
+
+ REQUIRE(VALID_FWDTABLE(fwdtable));
+
+ RWLOCK(&fwdtable->rwlock, isc_rwlocktype_write);
+ result = dns_rbt_deletename(fwdtable->table, name, ISC_FALSE);
+ RWUNLOCK(&fwdtable->rwlock, isc_rwlocktype_write);
+
+ if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+
+ return (result);
+}
+
+isc_result_t
dns_fwdtable_find(dns_fwdtable_t *fwdtable, dns_name_t *name,
dns_forwarders_t **forwardersp)
{
return (dns_fwdtable_find2(fwdtable, name, NULL, forwardersp));
-}
+}
isc_result_t
dns_fwdtable_find2(dns_fwdtable_t *fwdtable, dns_name_t *name,
diff --git a/contrib/bind9/lib/dns/gen-unix.h b/contrib/bind9/lib/dns/gen-unix.h
index 91cd4d5..47a343d 100644
--- a/contrib/bind9/lib/dns/gen-unix.h
+++ b/contrib/bind9/lib/dns/gen-unix.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gen-unix.h,v 1.19.332.2 2009-01-18 23:47:35 tbox Exp $ */
+/* $Id: gen-unix.h,v 1.21 2009-01-17 23:47:42 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/dns/gen.c b/contrib/bind9/lib/dns/gen.c
index 6f8ce7d..f1d46ea 100644
--- a/contrib/bind9/lib/dns/gen.c
+++ b/contrib/bind9/lib/dns/gen.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gen.c,v 1.83 2008-09-25 04:02:38 tbox Exp $ */
+/* $Id: gen.c,v 1.85 2009-12-04 22:06:37 tbox Exp $ */
/*! \file */
@@ -631,6 +631,8 @@ main(int argc, char **argv) {
TOWIRETYPE, TOWIRECLASS, TOWIREDEF);
doswitch("COMPARESWITCH", "compare", COMPAREARGS,
COMPARETYPE, COMPARECLASS, COMPAREDEF);
+ doswitch("CASECOMPARESWITCH", "casecompare", COMPAREARGS,
+ COMPARETYPE, COMPARECLASS, COMPAREDEF);
doswitch("FROMSTRUCTSWITCH", "fromstruct", FROMSTRUCTARGS,
FROMSTRUCTTYPE, FROMSTRUCTCLASS, FROMSTRUCTDEF);
doswitch("TOSTRUCTSWITCH", "tostruct", TOSTRUCTARGS,
diff --git a/contrib/bind9/lib/dns/gssapi_link.c b/contrib/bind9/lib/dns/gssapi_link.c
index a7af67f..e14d0eb 100644
--- a/contrib/bind9/lib/dns/gssapi_link.c
+++ b/contrib/bind9/lib/dns/gssapi_link.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,13 +16,14 @@
*/
/*
- * $Id: gssapi_link.c,v 1.12 2008-11-11 03:55:01 marka Exp $
+ * $Id: gssapi_link.c,v 1.16 2011-01-11 23:47:13 tbox Exp $
*/
#include <config.h>
#ifdef GSSAPI
+#include <isc/base64.h>
#include <isc/buffer.h>
#include <isc/mem.h>
#include <isc/string.h>
@@ -44,6 +45,12 @@
(gb).value = (r).base; \
} while (0)
+#define GBUFFER_TO_REGION(gb, r) \
+ do { \
+ (r).length = (gb).length; \
+ (r).base = (gb).value; \
+ } while (0)
+
struct dst_gssapi_signverifyctx {
isc_buffer_t *buffer;
@@ -254,9 +261,10 @@ gssapi_compare(const dst_key_t *key1, const dst_key_t *key2) {
}
static isc_result_t
-gssapi_generate(dst_key_t *key, int unused) {
+gssapi_generate(dst_key_t *key, int unused, void (*callback)(int)) {
UNUSED(key);
UNUSED(unused);
+ UNUSED(callback);
/* No idea */
return (ISC_R_FAILURE);
@@ -275,6 +283,79 @@ gssapi_destroy(dst_key_t *key) {
key->keydata.gssctx = NULL;
}
+static isc_result_t
+gssapi_restore(dst_key_t *key, const char *keystr) {
+ OM_uint32 major, minor;
+ size_t len;
+ isc_buffer_t *b = NULL;
+ isc_region_t r;
+ gss_buffer_desc gssbuffer;
+ isc_result_t result;
+
+ len = strlen(keystr);
+ if ((len % 4) != 0)
+ return (ISC_R_BADBASE64);
+
+ len = (len / 4) * 3;
+
+ result = isc_buffer_allocate(key->mctx, &b, len);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = isc_base64_decodestring(keystr, b);
+ if (result != ISC_R_SUCCESS) {
+ isc_buffer_free(&b);
+ return (result);
+ }
+
+ isc_buffer_remainingregion(b, &r);
+ REGION_TO_GBUFFER(r, gssbuffer);
+ major = gss_import_sec_context(&minor, &gssbuffer,
+ &key->keydata.gssctx);
+ if (major != GSS_S_COMPLETE) {
+ isc_buffer_free(&b);
+ return (ISC_R_FAILURE);
+ }
+
+ isc_buffer_free(&b);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+gssapi_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length) {
+ OM_uint32 major, minor;
+ gss_buffer_desc gssbuffer;
+ size_t len;
+ char *buf;
+ isc_buffer_t b;
+ isc_region_t r;
+ isc_result_t result;
+
+ major = gss_export_sec_context(&minor, &key->keydata.gssctx,
+ &gssbuffer);
+ if (major != GSS_S_COMPLETE) {
+ fprintf(stderr, "gss_export_sec_context -> %d, %d\n",
+ major, minor);
+ return (ISC_R_FAILURE);
+ }
+ if (gssbuffer.length == 0)
+ return (ISC_R_FAILURE);
+ len = ((gssbuffer.length + 2)/3) * 4;
+ buf = isc_mem_get(mctx, len);
+ if (buf == NULL) {
+ gss_release_buffer(&minor, &gssbuffer);
+ return (ISC_R_NOMEMORY);
+ }
+ isc_buffer_init(&b, buf, len);
+ GBUFFER_TO_REGION(gssbuffer, r);
+ result = isc_base64_totext(&r, 0, "", &b);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ gss_release_buffer(&minor, &gssbuffer);
+ *buffer = buf;
+ *length = len;
+ return (ISC_R_SUCCESS);
+}
+
static dst_func_t gssapi_functions = {
gssapi_create_signverify_ctx,
gssapi_destroy_signverify_ctx,
@@ -292,7 +373,9 @@ static dst_func_t gssapi_functions = {
NULL, /*%< tofile */
NULL, /*%< parse */
NULL, /*%< cleanup */
- NULL /*%< fromlabel */
+ NULL, /*%< fromlabel */
+ gssapi_dump,
+ gssapi_restore,
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/gssapictx.c b/contrib/bind9/lib/dns/gssapictx.c
index f365a64..707745c 100644
--- a/contrib/bind9/lib/dns/gssapictx.c
+++ b/contrib/bind9/lib/dns/gssapictx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,16 +15,18 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gssapictx.c,v 1.12.118.5 2010-12-22 02:37:55 marka Exp $ */
+/* $Id: gssapictx.c,v 1.26 2011-01-10 03:49:49 marka Exp $ */
#include <config.h>
+#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <isc/buffer.h>
#include <isc/dir.h>
#include <isc/entropy.h>
+#include <isc/file.h>
#include <isc/lex.h>
#include <isc/mem.h>
#include <isc/once.h>
@@ -201,9 +203,12 @@ log_cred(const gss_cred_id_t cred) {
* - tkey-gssapi-credential doesn't start with DNS/
* - the default realm in /etc/krb5.conf and the
* tkey-gssapi-credential bind config option don't match
+ *
+ * Note that if tkey-gssapi-keytab is set then these configure checks
+ * are not performed, and runtime errors from gssapi are used instead
*/
static void
-dst_gssapi_check_config(const char *gss_name) {
+check_config(const char *gss_name) {
const char *p;
krb5_context krb5_ctx;
char *krb5_realm = NULL;
@@ -263,7 +268,7 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
* here when we're in the acceptor role, which would let us
* default the hostname and use a compiled in default service
* name of "DNS", giving one less thing to configure in
- * named.conf. Unfortunately, this creates a circular
+ * named.conf. Unfortunately, this creates a circular
* dependency due to DNS-based realm lookup in at least one
* GSSAPI implementation (Heimdal). Oh well.
*/
@@ -273,7 +278,7 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
gret = gss_import_name(&minor, &gnamebuf,
GSS_C_NO_OID, &gname);
if (gret != GSS_S_COMPLETE) {
- dst_gssapi_check_config((char *)array);
+ check_config((char *)array);
gss_log(3, "failed gss_import_name: %s",
gss_error_tostring(gret, minor, buf,
@@ -306,7 +311,7 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
initiate ? "initiate" : "accept",
(char *)gnamebuf.value,
gss_error_tostring(gret, minor, buf, sizeof(buf)));
- dst_gssapi_check_config((char *)array);
+ check_config((char *)array);
return (ISC_R_FAILURE);
}
@@ -361,7 +366,7 @@ dst_gssapi_identitymatchesrealmkrb5(dns_name_t *signer, dns_name_t *name,
rname++;
/*
- * Find the host portion of the signer's name. We do this by
+ * Find the host portion of the signer's name. We do this by
* searching for the first / character. We then check to make
* certain the instance name is "host"
*
@@ -440,7 +445,7 @@ dst_gssapi_identitymatchesrealmms(dns_name_t *signer, dns_name_t *name,
return (isc_boolean_false);
/*
- * Find the host portion of the signer's name. Zero out the $ so
+ * Find the host portion of the signer's name. Zero out the $ so
* it terminates the signer's name, and skip past the @ for
* the realm.
*
@@ -454,7 +459,7 @@ dst_gssapi_identitymatchesrealmms(dns_name_t *signer, dns_name_t *name,
/*
* Find the first . in the target name, and make it the end of
- * the string. The rest of the name has to match the realm.
+ * the string. The rest of the name has to match the realm.
*/
if (name != NULL) {
nname = strchr(nbuf, '.');
@@ -510,9 +515,34 @@ dst_gssapi_releasecred(gss_cred_id_t *cred) {
#endif
}
+#ifdef GSSAPI
+/*
+ * Format a gssapi error message info into a char ** on the given memory
+ * context. This is used to return gssapi error messages back up the
+ * call chain for reporting to the user.
+ */
+static void
+gss_err_message(isc_mem_t *mctx, isc_uint32_t major, isc_uint32_t minor,
+ char **err_message)
+{
+ char buf[1024];
+ char *estr;
+
+ if (err_message == NULL || mctx == NULL) {
+ /* the caller doesn't want any error messages */
+ return;
+ }
+
+ estr = gss_error_tostring(major, minor, buf, sizeof(buf));
+ if (estr)
+ (*err_message) = isc_mem_strdup(mctx, estr);
+}
+#endif
+
isc_result_t
dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
- isc_buffer_t *outtoken, gss_ctx_id_t *gssctx)
+ isc_buffer_t *outtoken, gss_ctx_id_t *gssctx,
+ isc_mem_t *mctx, char **err_message)
{
#ifdef GSSAPI
isc_region_t r;
@@ -523,10 +553,10 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
isc_result_t result;
gss_buffer_desc gnamebuf;
unsigned char array[DNS_NAME_MAXTEXT + 1];
- char buf[1024];
/* Client must pass us a valid gss_ctx_id_t here */
REQUIRE(gssctx != NULL);
+ REQUIRE(mctx != NULL);
isc_buffer_init(&namebuf, array, sizeof(array));
name_to_gbuffer(name, &namebuf, &gnamebuf);
@@ -534,6 +564,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
/* Get the name as a GSS name */
gret = gss_import_name(&minor, &gnamebuf, GSS_C_NO_OID, &gname);
if (gret != GSS_S_COMPLETE) {
+ gss_err_message(mctx, gret, minor, err_message);
result = ISC_R_FAILURE;
goto out;
}
@@ -550,8 +581,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
* Note that we don't set GSS_C_SEQUENCE_FLAG as Windows DNS
* servers don't like it.
*/
- flags = GSS_C_REPLAY_FLAG | GSS_C_MUTUAL_FLAG | GSS_C_DELEG_FLAG |
- GSS_C_INTEG_FLAG;
+ flags = GSS_C_REPLAY_FLAG | GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG;
gret = gss_init_sec_context(&minor, GSS_C_NO_CREDENTIAL, gssctx,
gname, GSS_SPNEGO_MECHANISM, flags,
@@ -559,9 +589,9 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
NULL, &gouttoken, &ret_flags, NULL);
if (gret != GSS_S_COMPLETE && gret != GSS_S_CONTINUE_NEEDED) {
- gss_log(3, "Failure initiating security context");
- gss_log(3, "%s", gss_error_tostring(gret, minor,
- buf, sizeof(buf)));
+ gss_err_message(mctx, gret, minor, err_message);
+ gss_log(3, "Failure initiating security context: %s",
+ *err_message);
result = ISC_R_FAILURE;
goto out;
}
@@ -593,6 +623,8 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
UNUSED(intoken);
UNUSED(outtoken);
UNUSED(gssctx);
+ UNUSED(mctx);
+ UNUSED(err_message);
return (ISC_R_NOTIMPLEMENTED);
#endif
@@ -600,6 +632,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
isc_result_t
dst_gssapi_acceptctx(gss_cred_id_t cred,
+ const char *gssapi_keytab,
isc_region_t *intoken, isc_buffer_t **outtoken,
gss_ctx_id_t *ctxout, dns_name_t *principal,
isc_mem_t *mctx)
@@ -626,6 +659,34 @@ dst_gssapi_acceptctx(gss_cred_id_t cred,
else
context = *ctxout;
+ if (gssapi_keytab != NULL) {
+#ifdef ISC_PLATFORM_GSSAPI_KRB5_HEADER
+ gret = gsskrb5_register_acceptor_identity(gssapi_keytab);
+ if (gret != GSS_S_COMPLETE) {
+ gss_log(3, "failed "
+ "gsskrb5_register_acceptor_identity(%s): %s",
+ gssapi_keytab,
+ gss_error_tostring(gret, minor,
+ buf, sizeof(buf)));
+ return (DNS_R_INVALIDTKEY);
+ }
+#else
+ /*
+ * Minimize memory leakage by only setting KRB5_KTNAME
+ * if it needs to change.
+ */
+ const char *old = getenv("KRB5_KTNAME");
+ if (old == NULL || strcmp(old, gssapi_keytab) != 0) {
+ char *kt = malloc(strlen(gssapi_keytab) + 13);
+ if (kt == NULL)
+ return (ISC_R_NOMEMORY);
+ sprintf(kt, "KRB5_KTNAME=%s", gssapi_keytab);
+ if (putenv(kt) != 0)
+ return (ISC_R_NOMEMORY);
+ }
+#endif
+ }
+
gret = gss_accept_sec_context(&minor, &context, cred, &gintoken,
GSS_C_NO_CHANNEL_BINDINGS, &gname,
NULL, &gouttoken, NULL, NULL, NULL);
@@ -692,7 +753,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred,
isc_buffer_add(&namebuf, r.length);
RETERR(dns_name_fromtext(principal, &namebuf, dns_rootname,
- ISC_FALSE, NULL));
+ 0, NULL));
if (gnamebuf.length != 0) {
gret = gss_release_buffer(&minor, &gnamebuf);
@@ -717,6 +778,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred,
return (result);
#else
UNUSED(cred);
+ UNUSED(gssapi_keytab);
UNUSED(intoken);
UNUSED(outtoken);
UNUSED(ctxout);
diff --git a/contrib/bind9/lib/dns/hmac_link.c b/contrib/bind9/lib/dns/hmac_link.c
index 5d6dce7..ecc4089 100644
--- a/contrib/bind9/lib/dns/hmac_link.c
+++ b/contrib/bind9/lib/dns/hmac_link.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: hmac_link.c,v 1.11 2008-04-01 23:47:10 tbox Exp $
+ * $Id: hmac_link.c,v 1.19 2011-01-11 23:47:13 tbox Exp $
*/
#include <config.h>
@@ -50,14 +50,10 @@
#include "dst_internal.h"
#include "dst_parse.h"
-#define HMAC_LEN 64
-#define HMAC_IPAD 0x36
-#define HMAC_OPAD 0x5c
-
static isc_result_t hmacmd5_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacmd5_key {
- unsigned char key[HMAC_LEN];
+ unsigned char key[ISC_MD5_BLOCK_LENGTH];
};
static isc_result_t
@@ -79,7 +75,7 @@ hmacmd5_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacmd5ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacmd5_t));
if (hmacmd5ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacmd5_init(hmacmd5ctx, hkey->key, HMAC_LEN);
+ isc_hmacmd5_init(hmacmd5ctx, hkey->key, ISC_SHA1_BLOCK_LENGTH);
dctx->ctxdata.hmacmd5ctx = hmacmd5ctx;
return (ISC_R_SUCCESS);
}
@@ -142,26 +138,28 @@ hmacmd5_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, HMAC_LEN) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacmd5_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacmd5_generate(dst_key_t *key, int pseudorandom_ok, void (*callback)(int)) {
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA1_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA1_BLOCK_LENGTH) {
+ bytes = ISC_SHA1_BLOCK_LENGTH;
+ key->key_size = ISC_SHA1_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -170,7 +168,7 @@ hmacmd5_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacmd5_fromdns(key, &b);
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
return (ret);
}
@@ -184,6 +182,7 @@ hmacmd5_isprivate(const dst_key_t *key) {
static void
hmacmd5_destroy(dst_key_t *key) {
dst_hmacmd5_key_t *hkey = key->keydata.hmacmd5;
+
memset(hkey, 0, sizeof(dst_hmacmd5_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacmd5_key_t));
key->keydata.hmacmd5 = NULL;
@@ -223,7 +222,7 @@ hmacmd5_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > HMAC_LEN) {
+ if (r.length > ISC_SHA1_BLOCK_LENGTH) {
isc_md5_init(&md5ctx);
isc_md5_update(&md5ctx, r.base, r.length);
isc_md5_final(&md5ctx, hkey->key);
@@ -268,15 +267,17 @@ hmacmd5_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacmd5_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacmd5_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
- result = dst__privstruct_parse(key, DST_ALG_HMACMD5, lexer, mctx, &priv);
+ result = dst__privstruct_parse(key, DST_ALG_HMACMD5, lexer, mctx,
+ &priv);
if (result != ISC_R_SUCCESS)
return (result);
@@ -324,6 +325,8 @@ static dst_func_t hmacmd5_functions = {
hmacmd5_parse,
NULL, /*%< cleanup */
NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
@@ -337,7 +340,7 @@ dst__hmacmd5_init(dst_func_t **funcp) {
static isc_result_t hmacsha1_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha1_key {
- unsigned char key[ISC_SHA1_DIGESTLENGTH];
+ unsigned char key[ISC_SHA1_BLOCK_LENGTH];
};
static isc_result_t
@@ -348,7 +351,7 @@ hmacsha1_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha1ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha1_t));
if (hmacsha1ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha1_init(hmacsha1ctx, hkey->key, ISC_SHA1_DIGESTLENGTH);
+ isc_hmacsha1_init(hmacsha1ctx, hkey->key, ISC_SHA1_BLOCK_LENGTH);
dctx->ctxdata.hmacsha1ctx = hmacsha1ctx;
return (ISC_R_SUCCESS);
}
@@ -411,26 +414,28 @@ hmacsha1_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA1_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha1_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha1_generate(dst_key_t *key, int pseudorandom_ok, void (*callback)(int)) {
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA1_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA1_BLOCK_LENGTH) {
+ bytes = ISC_SHA1_BLOCK_LENGTH;
+ key->key_size = ISC_SHA1_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -439,7 +444,7 @@ hmacsha1_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha1_fromdns(key, &b);
- memset(data, 0, ISC_SHA1_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA1_BLOCK_LENGTH);
return (ret);
}
@@ -453,6 +458,7 @@ hmacsha1_isprivate(const dst_key_t *key) {
static void
hmacsha1_destroy(dst_key_t *key) {
dst_hmacsha1_key_t *hkey = key->keydata.hmacsha1;
+
memset(hkey, 0, sizeof(dst_hmacsha1_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha1_key_t));
key->keydata.hmacsha1 = NULL;
@@ -492,7 +498,7 @@ hmacsha1_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA1_DIGESTLENGTH) {
+ if (r.length > ISC_SHA1_BLOCK_LENGTH) {
isc_sha1_init(&sha1ctx);
isc_sha1_update(&sha1ctx, r.base, r.length);
isc_sha1_final(&sha1ctx, hkey->key);
@@ -537,13 +543,14 @@ hmacsha1_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha1_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha1_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA1, lexer, mctx,
&priv);
@@ -594,6 +601,8 @@ static dst_func_t hmacsha1_functions = {
hmacsha1_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -607,7 +616,7 @@ dst__hmacsha1_init(dst_func_t **funcp) {
static isc_result_t hmacsha224_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha224_key {
- unsigned char key[ISC_SHA224_DIGESTLENGTH];
+ unsigned char key[ISC_SHA224_BLOCK_LENGTH];
};
static isc_result_t
@@ -618,7 +627,7 @@ hmacsha224_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha224ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha224_t));
if (hmacsha224ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha224_init(hmacsha224ctx, hkey->key, ISC_SHA224_DIGESTLENGTH);
+ isc_hmacsha224_init(hmacsha224ctx, hkey->key, ISC_SHA224_BLOCK_LENGTH);
dctx->ctxdata.hmacsha224ctx = hmacsha224ctx;
return (ISC_R_SUCCESS);
}
@@ -681,26 +690,30 @@ hmacsha224_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA224_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA224_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha224_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha224_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA224_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA224_BLOCK_LENGTH) {
+ bytes = ISC_SHA224_BLOCK_LENGTH;
+ key->key_size = ISC_SHA224_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA224_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -709,7 +722,7 @@ hmacsha224_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha224_fromdns(key, &b);
- memset(data, 0, ISC_SHA224_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA224_BLOCK_LENGTH);
return (ret);
}
@@ -723,6 +736,7 @@ hmacsha224_isprivate(const dst_key_t *key) {
static void
hmacsha224_destroy(dst_key_t *key) {
dst_hmacsha224_key_t *hkey = key->keydata.hmacsha224;
+
memset(hkey, 0, sizeof(dst_hmacsha224_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha224_key_t));
key->keydata.hmacsha224 = NULL;
@@ -762,7 +776,7 @@ hmacsha224_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA224_DIGESTLENGTH) {
+ if (r.length > ISC_SHA224_BLOCK_LENGTH) {
isc_sha224_init(&sha224ctx);
isc_sha224_update(&sha224ctx, r.base, r.length);
isc_sha224_final(hkey->key, &sha224ctx);
@@ -807,13 +821,14 @@ hmacsha224_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha224_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha224_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA224, lexer, mctx,
&priv);
@@ -864,6 +879,8 @@ static dst_func_t hmacsha224_functions = {
hmacsha224_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -877,7 +894,7 @@ dst__hmacsha224_init(dst_func_t **funcp) {
static isc_result_t hmacsha256_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha256_key {
- unsigned char key[ISC_SHA256_DIGESTLENGTH];
+ unsigned char key[ISC_SHA256_BLOCK_LENGTH];
};
static isc_result_t
@@ -888,7 +905,7 @@ hmacsha256_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha256ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha256_t));
if (hmacsha256ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha256_init(hmacsha256ctx, hkey->key, ISC_SHA256_DIGESTLENGTH);
+ isc_hmacsha256_init(hmacsha256ctx, hkey->key, ISC_SHA256_BLOCK_LENGTH);
dctx->ctxdata.hmacsha256ctx = hmacsha256ctx;
return (ISC_R_SUCCESS);
}
@@ -951,26 +968,30 @@ hmacsha256_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA256_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA256_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha256_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha256_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA256_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA256_BLOCK_LENGTH) {
+ bytes = ISC_SHA256_BLOCK_LENGTH;
+ key->key_size = ISC_SHA256_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA256_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -979,7 +1000,7 @@ hmacsha256_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha256_fromdns(key, &b);
- memset(data, 0, ISC_SHA256_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA256_BLOCK_LENGTH);
return (ret);
}
@@ -993,6 +1014,7 @@ hmacsha256_isprivate(const dst_key_t *key) {
static void
hmacsha256_destroy(dst_key_t *key) {
dst_hmacsha256_key_t *hkey = key->keydata.hmacsha256;
+
memset(hkey, 0, sizeof(dst_hmacsha256_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha256_key_t));
key->keydata.hmacsha256 = NULL;
@@ -1032,7 +1054,7 @@ hmacsha256_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA256_DIGESTLENGTH) {
+ if (r.length > ISC_SHA256_BLOCK_LENGTH) {
isc_sha256_init(&sha256ctx);
isc_sha256_update(&sha256ctx, r.base, r.length);
isc_sha256_final(hkey->key, &sha256ctx);
@@ -1077,13 +1099,14 @@ hmacsha256_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha256_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha256_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA256, lexer, mctx,
&priv);
@@ -1134,6 +1157,8 @@ static dst_func_t hmacsha256_functions = {
hmacsha256_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -1147,7 +1172,7 @@ dst__hmacsha256_init(dst_func_t **funcp) {
static isc_result_t hmacsha384_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha384_key {
- unsigned char key[ISC_SHA384_DIGESTLENGTH];
+ unsigned char key[ISC_SHA384_BLOCK_LENGTH];
};
static isc_result_t
@@ -1158,7 +1183,7 @@ hmacsha384_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha384ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha384_t));
if (hmacsha384ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha384_init(hmacsha384ctx, hkey->key, ISC_SHA384_DIGESTLENGTH);
+ isc_hmacsha384_init(hmacsha384ctx, hkey->key, ISC_SHA384_BLOCK_LENGTH);
dctx->ctxdata.hmacsha384ctx = hmacsha384ctx;
return (ISC_R_SUCCESS);
}
@@ -1221,26 +1246,30 @@ hmacsha384_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA384_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA384_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha384_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha384_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA384_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA384_BLOCK_LENGTH) {
+ bytes = ISC_SHA384_BLOCK_LENGTH;
+ key->key_size = ISC_SHA384_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA384_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -1249,7 +1278,7 @@ hmacsha384_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha384_fromdns(key, &b);
- memset(data, 0, ISC_SHA384_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA384_BLOCK_LENGTH);
return (ret);
}
@@ -1263,6 +1292,7 @@ hmacsha384_isprivate(const dst_key_t *key) {
static void
hmacsha384_destroy(dst_key_t *key) {
dst_hmacsha384_key_t *hkey = key->keydata.hmacsha384;
+
memset(hkey, 0, sizeof(dst_hmacsha384_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha384_key_t));
key->keydata.hmacsha384 = NULL;
@@ -1302,7 +1332,7 @@ hmacsha384_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA384_DIGESTLENGTH) {
+ if (r.length > ISC_SHA384_BLOCK_LENGTH) {
isc_sha384_init(&sha384ctx);
isc_sha384_update(&sha384ctx, r.base, r.length);
isc_sha384_final(hkey->key, &sha384ctx);
@@ -1347,13 +1377,14 @@ hmacsha384_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha384_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha384_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA384, lexer, mctx,
&priv);
@@ -1404,6 +1435,8 @@ static dst_func_t hmacsha384_functions = {
hmacsha384_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
@@ -1417,7 +1450,7 @@ dst__hmacsha384_init(dst_func_t **funcp) {
static isc_result_t hmacsha512_fromdns(dst_key_t *key, isc_buffer_t *data);
struct dst_hmacsha512_key {
- unsigned char key[ISC_SHA512_DIGESTLENGTH];
+ unsigned char key[ISC_SHA512_BLOCK_LENGTH];
};
static isc_result_t
@@ -1428,7 +1461,7 @@ hmacsha512_createctx(dst_key_t *key, dst_context_t *dctx) {
hmacsha512ctx = isc_mem_get(dctx->mctx, sizeof(isc_hmacsha512_t));
if (hmacsha512ctx == NULL)
return (ISC_R_NOMEMORY);
- isc_hmacsha512_init(hmacsha512ctx, hkey->key, ISC_SHA512_DIGESTLENGTH);
+ isc_hmacsha512_init(hmacsha512ctx, hkey->key, ISC_SHA512_BLOCK_LENGTH);
dctx->ctxdata.hmacsha512ctx = hmacsha512ctx;
return (ISC_R_SUCCESS);
}
@@ -1491,26 +1524,30 @@ hmacsha512_compare(const dst_key_t *key1, const dst_key_t *key2) {
else if (hkey1 == NULL || hkey2 == NULL)
return (ISC_FALSE);
- if (memcmp(hkey1->key, hkey2->key, ISC_SHA512_DIGESTLENGTH) == 0)
+ if (memcmp(hkey1->key, hkey2->key, ISC_SHA512_BLOCK_LENGTH) == 0)
return (ISC_TRUE);
else
return (ISC_FALSE);
}
static isc_result_t
-hmacsha512_generate(dst_key_t *key, int pseudorandom_ok) {
+hmacsha512_generate(dst_key_t *key, int pseudorandom_ok,
+ void (*callback)(int))
+{
isc_buffer_t b;
isc_result_t ret;
- int bytes;
- unsigned char data[HMAC_LEN];
+ unsigned int bytes;
+ unsigned char data[ISC_SHA512_BLOCK_LENGTH];
+
+ UNUSED(callback);
bytes = (key->key_size + 7) / 8;
- if (bytes > HMAC_LEN) {
- bytes = HMAC_LEN;
- key->key_size = HMAC_LEN * 8;
+ if (bytes > ISC_SHA512_BLOCK_LENGTH) {
+ bytes = ISC_SHA512_BLOCK_LENGTH;
+ key->key_size = ISC_SHA512_BLOCK_LENGTH * 8;
}
- memset(data, 0, HMAC_LEN);
+ memset(data, 0, ISC_SHA512_BLOCK_LENGTH);
ret = dst__entropy_getdata(data, bytes, ISC_TF(pseudorandom_ok != 0));
if (ret != ISC_R_SUCCESS)
@@ -1519,7 +1556,7 @@ hmacsha512_generate(dst_key_t *key, int pseudorandom_ok) {
isc_buffer_init(&b, data, bytes);
isc_buffer_add(&b, bytes);
ret = hmacsha512_fromdns(key, &b);
- memset(data, 0, ISC_SHA512_DIGESTLENGTH);
+ memset(data, 0, ISC_SHA512_BLOCK_LENGTH);
return (ret);
}
@@ -1533,6 +1570,7 @@ hmacsha512_isprivate(const dst_key_t *key) {
static void
hmacsha512_destroy(dst_key_t *key) {
dst_hmacsha512_key_t *hkey = key->keydata.hmacsha512;
+
memset(hkey, 0, sizeof(dst_hmacsha512_key_t));
isc_mem_put(key->mctx, hkey, sizeof(dst_hmacsha512_key_t));
key->keydata.hmacsha512 = NULL;
@@ -1572,7 +1610,7 @@ hmacsha512_fromdns(dst_key_t *key, isc_buffer_t *data) {
memset(hkey->key, 0, sizeof(hkey->key));
- if (r.length > ISC_SHA512_DIGESTLENGTH) {
+ if (r.length > ISC_SHA512_BLOCK_LENGTH) {
isc_sha512_init(&sha512ctx);
isc_sha512_update(&sha512ctx, r.base, r.length);
isc_sha512_final(hkey->key, &sha512ctx);
@@ -1617,13 +1655,14 @@ hmacsha512_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-hmacsha512_parse(dst_key_t *key, isc_lex_t *lexer) {
+hmacsha512_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t result, tresult;
isc_buffer_t b;
isc_mem_t *mctx = key->mctx;
unsigned int i;
+ UNUSED(pub);
/* read private key file */
result = dst__privstruct_parse(key, DST_ALG_HMACSHA512, lexer, mctx,
&priv);
@@ -1674,6 +1713,8 @@ static dst_func_t hmacsha512_functions = {
hmacsha512_parse,
NULL, /* cleanup */
NULL, /* fromlabel */
+ NULL, /* dump */
+ NULL, /* restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/include/dns/Makefile.in b/contrib/bind9/lib/dns/include/dns/Makefile.in
index a4cd810..e13d084 100644
--- a/contrib/bind9/lib/dns/include/dns/Makefile.in
+++ b/contrib/bind9/lib/dns/include/dns/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.55 2008-11-14 23:47:33 tbox Exp $
+# $Id: Makefile.in,v 1.57 2009-10-08 23:48:10 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -21,19 +21,17 @@ top_srcdir = @top_srcdir@
@BIND9_VERSION@
-HEADERS = acl.h adb.h byaddr.h cache.h callbacks.h \
- cert.h compress.h \
+HEADERS = acl.h adb.h byaddr.h cache.h callbacks.h cert.h compress.h \
db.h dbiterator.h dbtable.h diff.h dispatch.h dlz.h \
- dnssec.h ds.h events.h fixedname.h iptable.h journal.h keyflags.h \
- keytable.h keyvalues.h lib.h log.h master.h masterdump.h \
- message.h name.h ncache.h \
- nsec.h peer.h portlist.h rbt.h rcode.h \
+ dnssec.h ds.h events.h fixedname.h iptable.h journal.h \
+ keyflags.h keytable.h keyvalues.h lib.h log.h \
+ master.h masterdump.h message.h name.h ncache.h nsec.h \
+ peer.h portlist.h private.h rbt.h rcode.h \
rdata.h rdataclass.h rdatalist.h rdataset.h rdatasetiter.h \
rdataslab.h rdatatype.h request.h resolver.h result.h \
rootns.h sdb.h sdlz.h secalg.h secproto.h soa.h ssu.h \
- tcpmsg.h time.h tkey.h \
- tsig.h ttl.h types.h validator.h version.h view.h xfrin.h \
- zone.h zonekey.h zt.h
+ tcpmsg.h time.h tkey.h tsig.h ttl.h types.h \
+ validator.h version.h view.h xfrin.h zone.h zonekey.h zt.h
GENHEADERS = enumclass.h enumtype.h rdatastruct.h
diff --git a/contrib/bind9/lib/dns/include/dns/acl.h b/contrib/bind9/lib/dns/include/dns/acl.h
index 1045cd2..04f5577 100644
--- a/contrib/bind9/lib/dns/include/dns/acl.h
+++ b/contrib/bind9/lib/dns/include/dns/acl.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acl.h,v 1.31.206.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: acl.h,v 1.33 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_ACL_H
#define DNS_ACL_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/cache.h b/contrib/bind9/lib/dns/include/dns/cache.h
index 94077d6..e4ea5f4 100644
--- a/contrib/bind9/lib/dns/include/dns/cache.h
+++ b/contrib/bind9/lib/dns/include/dns/cache.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cache.h,v 1.26 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: cache.h,v 1.28 2009-01-09 23:47:46 tbox Exp $ */
#ifndef DNS_CACHE_H
#define DNS_CACHE_H 1
@@ -65,8 +65,15 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
isc_timermgr_t *timermgr, dns_rdataclass_t rdclass,
const char *db_type, unsigned int db_argc, char **db_argv,
dns_cache_t **cachep);
+isc_result_t
+dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
+ isc_timermgr_t *timermgr, dns_rdataclass_t rdclass,
+ const char *cachename, const char *db_type,
+ unsigned int db_argc, char **db_argv, dns_cache_t **cachep);
/*%<
- * Create a new DNS cache.
+ * Create a new DNS cache. dns_cache_create2() will create a named cache.
+ * dns_cache_create() is a backward compatible version that internally specifies
+ * an empty name.
*
* Requires:
*
@@ -76,6 +83,8 @@ dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
* manager, or both are NULL. If NULL, no periodic cleaning of the
* cache will take place.
*
+ *\li 'cachename' is a valid string. This must not be NULL.
+ *
*\li 'cachep' is a valid pointer, and *cachep == NULL
*
* Ensures:
@@ -217,12 +226,36 @@ dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int interval);
* Set the periodic cache cleaning interval to 'interval' seconds.
*/
+unsigned int
+dns_cache_getcleaninginterval(dns_cache_t *cache);
+/*%<
+ * Get the periodic cache cleaning interval to 'interval' seconds.
+ */
+
+isc_uint32_t
+dns_cache_getcachesize(dns_cache_t *cache);
+/*%<
+ * Get the maximum cache size.
+ */
+
+const char *
+dns_cache_getname(dns_cache_t *cache);
+/*%<
+ * Get the cache name.
+ */
+
void
dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size);
/*%<
* Set the maximum cache size. 0 means unlimited.
*/
+isc_uint32_t
+dns_cache_getcachesize(dns_cache_t *cache);
+/*%<
+ * Get the maximum cache size.
+ */
+
isc_result_t
dns_cache_flush(dns_cache_t *cache);
/*%<
diff --git a/contrib/bind9/lib/dns/include/dns/client.h b/contrib/bind9/lib/dns/include/dns/client.h
new file mode 100644
index 0000000..13cdf8f
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/client.h
@@ -0,0 +1,621 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: client.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef DNS_CLIENT_H
+#define DNS_CLIENT_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file
+ *
+ * \brief
+ * The DNS client module provides convenient programming interfaces to various
+ * DNS services, such as name resolution with or without DNSSEC validation or
+ * dynamic DNS update. This module is primarily expected to be used by other
+ * applications than BIND9-related ones that need such advanced DNS features.
+ *
+ * MP:
+ *\li In the typical usage of this module, application threads will not share
+ * the same data structures created and manipulated in this module.
+ * However, the module still ensures appropriate synchronization of such
+ * data structures.
+ *
+ * Resources:
+ *\li TBS
+ *
+ * Security:
+ *\li This module does not handle any low-level data directly, and so no
+ * security issue specific to this module is anticipated.
+ */
+
+#include <isc/event.h>
+#include <isc/sockaddr.h>
+
+#include <dns/tsig.h>
+#include <dns/types.h>
+
+#include <dst/dst.h>
+
+typedef enum {
+ updateop_none = 0,
+ updateop_add = 1,
+ updateop_delete = 2,
+ updateop_exist = 3,
+ updateop_notexist = 4,
+ updateop_max = 5
+} dns_client_updateop_t;
+
+ISC_LANG_BEGINDECLS
+
+/***
+ *** Types
+ ***/
+
+/*%
+ * Optional flags for dns_client_create(x).
+ */
+/*%< Enable caching resolution results (experimental). */
+#define DNS_CLIENTCREATEOPT_USECACHE 0x8000
+
+/*%
+ * Optional flags for dns_client_(start)resolve.
+ */
+/*%< Disable DNSSEC validation. */
+#define DNS_CLIENTRESOPT_NODNSSEC 0x01
+/*%< Allow running external context. */
+#define DNS_CLIENTRESOPT_ALLOWRUN 0x02
+
+/*%
+ * Optional flags for dns_client_(start)request.
+ */
+/*%< Allow running external context. */
+#define DNS_CLIENTREQOPT_ALLOWRUN 0x01
+
+/*%
+ * A dns_clientresevent_t is sent when name resolution performed by a client
+ * completes. 'result' stores the result code of the entire resolution
+ * procedure. 'vresult' specifically stores the result code of DNSSEC
+ * validation if it is performed. When name resolution successfully completes,
+ * 'answerlist' is typically non empty, containing answer names along with
+ * RRsets. It is the receiver's responsibility to free this list by calling
+ * dns_client_freeresanswer() before freeing the event structure.
+ */
+typedef struct dns_clientresevent {
+ ISC_EVENT_COMMON(struct dns_clientresevent);
+ isc_result_t result;
+ isc_result_t vresult;
+ dns_namelist_t answerlist;
+} dns_clientresevent_t; /* too long? */
+
+/*%
+ * Status of a dynamic update procedure.
+ */
+typedef enum {
+ dns_clientupdatestate_prepare, /*%< no updates have been sent */
+ dns_clientupdatestate_sent, /*%< updates were sent, no response */
+ dns_clientupdatestate_done /*%< update was sent and succeeded */
+} dns_clientupdatestate_t;
+
+/*%
+ * A dns_clientreqevent_t is sent when a DNS request is completed by a client.
+ * 'result' stores the result code of the entire transaction.
+ * If the transaction is successfully completed but the response packet cannot
+ * be parsed, 'result' will store the result code of dns_message_parse().
+ * If the response packet is received, 'rmessage' will contain the response
+ * message, whether it is successfully parsed or not.
+ */
+typedef struct dns_clientreqevent {
+ ISC_EVENT_COMMON(struct dns_clientreqevent);
+ isc_result_t result;
+ dns_message_t *rmessage;
+} dns_clientreqevent_t; /* too long? */
+
+/*%
+ * A dns_clientupdateevent_t is sent when dynamic update performed by a client
+ * completes. 'result' stores the result code of the entire update procedure.
+ * 'state' specifies the status of the update procedure when this event is
+ * sent. This can be used as a hint by the receiver to determine whether
+ * the update attempt was ever made. In particular, if the state is
+ * dns_clientupdatestate_prepare, the receiver can be sure that the requested
+ * update was not applied.
+ */
+typedef struct dns_clientupdateevent {
+ ISC_EVENT_COMMON(struct dns_clientupdateevent);
+ isc_result_t result;
+ dns_clientupdatestate_t state;
+} dns_clientupdateevent_t; /* too long? */
+
+isc_result_t
+dns_client_create(dns_client_t **clientp, unsigned int options);
+
+isc_result_t
+dns_client_createx(isc_mem_t *mctx, isc_appctx_t *actx, isc_taskmgr_t *taskmgr,
+ isc_socketmgr_t *socketmgr, isc_timermgr_t *timermgr,
+ unsigned int options, dns_client_t **clientp);
+/*%<
+ * Create a DNS client. These functions create a new client object with
+ * minimal internal resources such as the default 'view' for the IN class and
+ * IPv4/IPv6 dispatches for the view.
+ *
+ * dns_client_createx() takes 'manager' arguments so that the caller can
+ * control the behavior of the client through the underlying event framework.
+ * On the other hand, dns_client_create() simplifies the interface and creates
+ * the managers internally. A DNS client object created via
+ * dns_client_create() is expected to be used by an application that only needs
+ * simple synchronous services or by a thread-based application.
+ *
+ * If the DNS_CLIENTCREATEOPT_USECACHE flag is set in 'options',
+ * dns_client_create(x) will create a cache database with the view.
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'actx' is a valid application context.
+ *
+ *\li 'taskmgr' is a valid task manager.
+ *
+ *\li 'socketmgr' is a valid socket manager.
+ *
+ *\li 'timermgr' is a valid timer manager.
+ *
+ *\li clientp != NULL && *clientp == NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_client_destroy(dns_client_t **clientp);
+/*%<
+ * Destroy 'client'.
+ *
+ * Requires:
+ *
+ *\li '*clientp' is a valid client.
+ *
+ * Ensures:
+ *
+ *\li *clientp == NULL.
+ */
+
+isc_result_t
+dns_client_setservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace, isc_sockaddrlist_t *addrs);
+/*%<
+ * Specify a list of addresses of recursive name servers that the client will
+ * use for name resolution. A view for the 'rdclass' class must be created
+ * beforehand. If 'namespace' is non NULL, the specified server will be used
+ * if and only if the query name is a subdomain of 'namespace'. When servers
+ * for multiple 'namespace's are provided, and a query name is covered by
+ * more than one 'namespace', the servers for the best (longest) matching
+ * namespace will be used. If 'namespace' is NULL, it works as if
+ * dns_rootname (.) were specified.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'namespace' is NULL or a valid name.
+ *
+ *\li 'addrs' != NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+isc_result_t
+dns_client_clearservers(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *namespace);
+/*%<
+ * Remove configured recursive name servers for the 'rdclass' and 'namespace'
+ * from the client. See the description of dns_client_setservers() for
+ * the requirements about 'rdclass' and 'namespace'.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'namespace' is NULL or a valid name.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+isc_result_t
+dns_client_resolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, dns_namelist_t *namelist);
+
+isc_result_t
+dns_client_startresolve(dns_client_t *client, dns_name_t *name,
+ dns_rdataclass_t rdclass, dns_rdatatype_t type,
+ unsigned int options, isc_task_t *task,
+ isc_taskaction_t action, void *arg,
+ dns_clientrestrans_t **transp);
+/*%<
+ * Perform name resolution for 'name', 'rdclass', and 'type'.
+ *
+ * If any trusted keys are configured and the query name is considered to
+ * belong to a secure zone, these functions also validate the responses
+ * using DNSSEC by default. If the DNS_CLIENTRESOPT_NODNSSEC flag is set
+ * in 'options', DNSSEC validation is disabled regardless of the configured
+ * trusted keys or the query name.
+ *
+ * dns_client_resolve() provides a synchronous service. This function starts
+ * name resolution internally and blocks until it completes. On success,
+ * 'namelist' will contain a list of answer names, each of which has
+ * corresponding RRsets. The caller must provide a valid empty list, and
+ * is responsible for freeing the list content via dns_client_freeresanswer().
+ * If the name resolution fails due to an error in DNSSEC validation,
+ * dns_client_resolve() returns the result code indicating the validation
+ * error. Otherwise, it returns the result code of the entire resolution
+ * process, either success or failure.
+ *
+ * It is typically expected that the client object passed to
+ * dns_client_resolve() was created via dns_client_create() and has its own
+ * managers and contexts. However, if the DNS_CLIENTRESOPT_ALLOWRUN flag is
+ * set in 'options', this function performs the synchronous service even if
+ * it does not have its own manager and context structures.
+ *
+ * dns_client_startresolve() is an asynchronous version of dns_client_resolve()
+ * and does not block. When name resolution is completed, 'action' will be
+ * called with the argument of a 'dns_clientresevent_t' object, which contains
+ * the resulting list of answer names (on success). On return, '*transp' is
+ * set to an opaque transaction ID so that the caller can cancel this
+ * resolution process.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'addrs' != NULL.
+ *
+ *\li 'name' is a valid name.
+ *
+ *\li 'namelist' != NULL and is not empty.
+ *
+ *\li 'task' is a valid task.
+ *
+ *\li 'transp' != NULL && *transp == NULL;
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_client_cancelresolve(dns_clientrestrans_t *trans);
+/*%<
+ * Cancel an ongoing resolution procedure started via
+ * dns_client_startresolve().
+ *
+ * Notes:
+ *
+ *\li If the resolution procedure has not completed, post its CLIENTRESDONE
+ * event with a result code of #ISC_R_CANCELED.
+ *
+ * Requires:
+ *
+ *\li 'trans' is a valid transaction ID.
+ */
+
+void
+dns_client_destroyrestrans(dns_clientrestrans_t **transp);
+/*%<
+ * Destroy name resolution transaction state identified by '*transp'.
+ *
+ * Requires:
+ *
+ *\li '*transp' is a valid transaction ID.
+ *
+ *\li The caller has received the CLIENTRESDONE event (either because the
+ * resolution completed or because dns_client_cancelresolve() was called).
+ *
+ * Ensures:
+ *
+ *\li *transp == NULL.
+ */
+
+void
+dns_client_freeresanswer(dns_client_t *client, dns_namelist_t *namelist);
+/*%<
+ * Free resources allocated for the content of 'namelist'.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'namelist' != NULL.
+ */
+
+isc_result_t
+dns_client_addtrustedkey(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *keyname, isc_buffer_t *keydatabuf);
+/*%<
+ * Add a DNSSEC trusted key for the 'rdclass' class. A view for the 'rdclass'
+ * class must be created beforehand. 'keyname' is the DNS name of the key,
+ * and 'keydatabuf' stores the resource data of the key.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'keyname' is a valid name.
+ *
+ *\li 'keydatabuf' is a valid buffer.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+isc_result_t
+dns_client_request(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries);
+
+isc_result_t
+dns_client_startrequest(dns_client_t *client, dns_message_t *qmessage,
+ dns_message_t *rmessage, isc_sockaddr_t *server,
+ unsigned int options, unsigned int parseoptions,
+ dns_tsec_t *tsec, unsigned int timeout,
+ unsigned int udptimeout, unsigned int udpretries,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientreqtrans_t **transp);
+
+/*%<
+ * Send a DNS request containig a query message 'query' to 'server'.
+ *
+ * 'parseoptions' will be used when the response packet is parsed, and will be
+ * passed to dns_message_parse() via dns_request_getresponse(). See
+ * dns_message_parse() for more details.
+ *
+ * 'tsec' is a transaction security object containing, e.g. a TSIG key for
+ * authenticating the request/response transaction. This is optional and can
+ * be NULL, in which case this library performs the transaction without any
+ * transaction authentication.
+ *
+ * 'timeout', 'udptimeout', and 'udpretries' are passed to
+ * dns_request_createvia3(). See dns_request_createvia3() for more details.
+ *
+ * dns_client_request() provides a synchronous service. This function sends
+ * the request and blocks until a response is received. On success,
+ * 'rmessage' will contain the response message. The caller must provide a
+ * valid initialized message.
+ *
+ * It is usually expected that the client object passed to
+ * dns_client_request() was created via dns_client_create() and has its own
+ * managers and contexts. However, if the DNS_CLIENTREQOPT_ALLOWRUN flag is
+ * set in 'options', this function performs the synchronous service even if
+ * it does not have its own manager and context structures.
+ *
+ * dns_client_startrequest() is an asynchronous version of dns_client_request()
+ * and does not block. When the transaction is completed, 'action' will be
+ * called with the argument of a 'dns_clientreqevent_t' object, which contains
+ * the response message (on success). On return, '*transp' is set to an opaque
+ * transaction ID so that the caller can cancel this request.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'qmessage' and 'rmessage' are valid initialized message.
+ *
+ *\li 'server' is a valid socket address structure.
+ *
+ *\li 'task' is a valid task.
+ *
+ *\li 'transp' != NULL && *transp == NULL;
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ *
+ *\li Any result that dns_message_parse() can return.
+ */
+
+void
+dns_client_cancelrequest(dns_clientreqtrans_t *transp);
+/*%<
+ * Cancel an ongoing DNS request procedure started via
+ * dns_client_startrequest().
+ *
+ * Notes:
+ *
+ *\li If the request procedure has not completed, post its CLIENTREQDONE
+ * event with a result code of #ISC_R_CANCELED.
+ *
+ * Requires:
+ *
+ *\li 'trans' is a valid transaction ID.
+ */
+
+void
+dns_client_destroyreqtrans(dns_clientreqtrans_t **transp);
+/*%
+ * Destroy DNS request transaction state identified by '*transp'.
+ *
+ * Requires:
+ *
+ *\li '*transp' is a valid transaction ID.
+ *
+ *\li The caller has received the CLIENTREQDONE event (either because the
+ * request completed or because dns_client_cancelrequest() was called).
+ *
+ * Ensures:
+ *
+ *\li *transp == NULL.
+ */
+
+isc_result_t
+dns_client_update(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options);
+
+isc_result_t
+dns_client_startupdate(dns_client_t *client, dns_rdataclass_t rdclass,
+ dns_name_t *zonename, dns_namelist_t *prerequisites,
+ dns_namelist_t *updates, isc_sockaddrlist_t *servers,
+ dns_tsec_t *tsec, unsigned int options,
+ isc_task_t *task, isc_taskaction_t action, void *arg,
+ dns_clientupdatetrans_t **transp);
+/*%<
+ * Perform DNS dynamic update for 'updates' of the 'rdclass' class with
+ * optional 'prerequisites'.
+ *
+ * 'updates' are a list of names with associated RRsets to be updated.
+ *
+ * 'prerequisites' are a list of names with associated RRsets corresponding to
+ * the prerequisites of the updates. This is optional and can be NULL, in
+ * which case the prerequisite section of the update message will be empty.
+ *
+ * Both 'updates' and 'prerequisites' must be constructed as specified in
+ * RFC2136.
+ *
+ * 'zonename' is the name of the zone in which the updated names exist.
+ * This is optional and can be NULL. In this case, these functions internally
+ * identify the appropriate zone through some queries for the SOA RR starting
+ * with the first name in prerequisites or updates.
+ *
+ * 'servers' is a list of authoritative servers to which the update message
+ * should be sent. This is optional and can be NULL. In this case, these
+ * functions internally identify the appropriate primary server name and its
+ * addresses through some queries for the SOA RR (like the case of zonename)
+ * and supplemental A/AAAA queries for the server name.
+ * Note: The client module generally assumes the given addresses are of the
+ * primary server of the corresponding zone. It will work even if a secondary
+ * server address is specified as long as the server allows update forwarding,
+ * it is generally discouraged to include secondary server addresses unless
+ * there's strong reason to do so.
+ *
+ * 'tsec' is a transaction security object containing, e.g. a TSIG key for
+ * authenticating the update transaction (and the supplemental query/response
+ * transactions if the server is specified). This is optional and can be
+ * NULL, in which case the library tries the update without any transaction
+ * authentication.
+ *
+ * dns_client_update() provides a synchronous service. This function blocks
+ * until the entire update procedure completes, including the additional
+ * queries when necessary.
+ *
+ * dns_client_startupdate() is an asynchronous version of dns_client_update().
+ * It immediately returns (typically with *transp being set to a non-NULL
+ * pointer), and performs the update procedure through a set of internal
+ * events. All transactions including the additional query exchanges are
+ * performed as a separate event, so none of these events cause blocking
+ * operation. When the update procedure completes, the specified function
+ * 'action' will be called with the argument of a 'dns_clientupdateevent_t'
+ * structure. On return, '*transp' is set to an opaque transaction ID so that
+ * the caller can cancel this update process.
+ *
+ * Notes:
+ *\li No options are currently defined.
+ *
+ * Requires:
+ *
+ *\li 'client' is a valid client.
+ *
+ *\li 'updates' != NULL.
+ *
+ *\li 'task' is a valid task.
+ *
+ *\li 'transp' != NULL && *transp == NULL;
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_client_cancelupdate(dns_clientupdatetrans_t *trans);
+/*%<
+ * Cancel an ongoing dynamic update procedure started via
+ * dns_client_startupdate().
+ *
+ * Notes:
+ *
+ *\li If the update procedure has not completed, post its UPDATEDONE
+ * event with a result code of #ISC_R_CANCELED.
+ *
+ * Requires:
+ *
+ *\li 'trans' is a valid transaction ID.
+ */
+
+void
+dns_client_destroyupdatetrans(dns_clientupdatetrans_t **transp);
+/*%<
+ * Destroy dynamic update transaction identified by '*transp'.
+ *
+ * Requires:
+ *
+ *\li '*transp' is a valid transaction ID.
+ *
+ *\li The caller has received the UPDATEDONE event (either because the
+ * update completed or because dns_client_cancelupdate() was called).
+ *
+ * Ensures:
+ *
+ *\li *transp == NULL.
+ */
+
+isc_result_t
+dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
+ dns_rdatatype_t type, dns_rdata_t *source,
+ dns_ttl_t ttl, dns_name_t *target,
+ dns_rdataset_t *rdataset, dns_rdatalist_t *rdatalist,
+ dns_rdata_t *rdata, isc_mem_t *mctx);
+/*%<
+ * TBD
+ */
+
+void
+dns_client_freeupdate(dns_name_t **namep);
+/*%<
+ * TBD
+ */
+
+isc_mem_t *
+dns_client_mctx(dns_client_t *client);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_CLIENT_H */
diff --git a/contrib/bind9/lib/dns/include/dns/compress.h b/contrib/bind9/lib/dns/include/dns/compress.h
index 4181c77..ebe543b 100644
--- a/contrib/bind9/lib/dns/include/dns/compress.h
+++ b/contrib/bind9/lib/dns/include/dns/compress.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: compress.h,v 1.40.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: compress.h,v 1.42 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_COMPRESS_H
#define DNS_COMPRESS_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/db.h b/contrib/bind9/lib/dns/include/dns/db.h
index f622834..edb1263 100644
--- a/contrib/bind9/lib/dns/include/dns/db.h
+++ b/contrib/bind9/lib/dns/include/dns/db.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: db.h,v 1.93.50.5 2009-11-25 23:48:42 tbox Exp $ */
+/* $Id: db.h,v 1.104 2011-01-13 04:59:25 tbox Exp $ */
#ifndef DNS_DB_H
#define DNS_DB_H 1
@@ -59,7 +59,11 @@
#include <isc/ondestroy.h>
#include <isc/stdtime.h>
+#include <dns/fixedname.h>
#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rpz.h>
#include <dns/types.h>
ISC_LANG_BEGINDECLS
@@ -167,6 +171,13 @@ typedef struct dns_dbmethods {
dns_dbversion_t *version);
isc_boolean_t (*isdnssec)(dns_db_t *db);
dns_stats_t *(*getrrsetstats)(dns_db_t *db);
+ void (*rpz_enabled)(dns_db_t *db, dns_rpz_st_t *st);
+ isc_result_t (*rpz_findips)(dns_rpz_zone_t *rpz,
+ dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db,
+ dns_dbversion_t *version,
+ dns_rdataset_t *ardataset,
+ dns_rpz_st_t *st);
} dns_dbmethods_t;
typedef isc_result_t
@@ -491,6 +502,10 @@ dns_db_load(dns_db_t *db, const char *filename);
isc_result_t
dns_db_load2(dns_db_t *db, const char *filename, dns_masterformat_t format);
+
+isc_result_t
+dns_db_load3(dns_db_t *db, const char *filename, dns_masterformat_t format,
+ unsigned int options);
/*%<
* Load master file 'filename' into 'db'.
*
@@ -614,7 +629,7 @@ dns_db_closeversion(dns_db_t *db, dns_dbversion_t **versionp,
*
* Note: if '*versionp' is a read-write version and 'commit' is ISC_TRUE,
* then all changes made in the version will take effect, otherwise they
- * will be rolled back. The value if 'commit' is ignored for read-only
+ * will be rolled back. The value of 'commit' is ignored for read-only
* versions.
*
* Requires:
@@ -841,6 +856,9 @@ dns_db_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
* \li #DNS_R_COVERINGNSEC The returned data is a NSEC
* that potentially covers 'name'.
*
+ * \li #DNS_R_EMPTYWILD The name is a wildcard without
+ * resource records.
+ *
* Error results:
*
* \li #ISC_R_NOMEMORY
@@ -1477,6 +1495,31 @@ dns_db_getrrsetstats(dns_db_t *db);
* dns_rdatasetstats_create(); otherwise NULL.
*/
+void
+dns_db_rpz_enabled(dns_db_t *db, dns_rpz_st_t *st);
+/*%<
+ * See if a policy database has DNS_RPZ_TYPE_IP, DNS_RPZ_TYPE_NSIP, or
+ * DNS_RPZ_TYPE_NSDNAME records.
+ */
+
+isc_result_t
+dns_db_rpz_findips(dns_rpz_zone_t *rpz, dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_rdataset_t *ardataset, dns_rpz_st_t *st);
+/*%<
+ * Search the CDIR block tree of a response policy tree of trees for the best
+ * match to any of the IP addresses in an A or AAAA rdataset.
+ *
+ * Requires:
+ * \li search in policy zone 'rpz' for a match of 'rpz_type' either
+ * DNS_RPZ_TYPE_IP or DNS_RPZ_TYPE_NSIP
+ * \li 'zone' and 'db' are the database corresponding to 'rpz'
+ * \li 'version' is the required version of the database
+ * \li 'ardataset' is an A or AAAA rdataset of addresses to check
+ * \li 'found' specifies the previous best match if any or
+ * or NULL, an empty name, 0, DNS_RPZ_POLICY_MISS, and 0
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_DB_H */
diff --git a/contrib/bind9/lib/dns/include/dns/diff.h b/contrib/bind9/lib/dns/include/dns/diff.h
index f5e25ee..b6c929f 100644
--- a/contrib/bind9/lib/dns/include/dns/diff.h
+++ b/contrib/bind9/lib/dns/include/dns/diff.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: diff.h,v 1.15.120.4 2010-06-04 23:48:25 tbox Exp $ */
+/* $Id: diff.h,v 1.19 2010-06-04 23:51:14 tbox Exp $ */
#ifndef DNS_DIFF_H
#define DNS_DIFF_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/dispatch.h b/contrib/bind9/lib/dns/include/dns/dispatch.h
index 6e2f3e1..3d252a1 100644
--- a/contrib/bind9/lib/dns/include/dns/dispatch.h
+++ b/contrib/bind9/lib/dns/include/dns/dispatch.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dispatch.h,v 1.60.82.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: dispatch.h,v 1.62 2009-01-27 23:47:54 tbox Exp $ */
#ifndef DNS_DISPATCH_H
#define DNS_DISPATCH_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/dlz.h b/contrib/bind9/lib/dns/include/dns/dlz.h
index 28a24a9..e04b1b1 100644
--- a/contrib/bind9/lib/dns/include/dns/dlz.h
+++ b/contrib/bind9/lib/dns/include/dns/dlz.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlz.h,v 1.7.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: dlz.h,v 1.12 2010-12-20 23:47:21 tbox Exp $ */
/*! \file dns/dlz.h */
@@ -87,6 +87,7 @@
#include <dns/name.h>
#include <dns/types.h>
#include <dns/view.h>
+#include <dst/dst.h>
#include <isc/lang.h>
@@ -166,12 +167,37 @@ typedef isc_result_t
* return a result code indicating the type of error.
*/
+
+typedef isc_result_t
+(*dns_dlzconfigure_t)(void *driverarg, void *dbdata, dns_view_t *view);
+/*%<
+ * Method prototype. Drivers implementing the DLZ interface may
+ * optionally supply a configure method. If supplied, this will be
+ * called immediately after the create method is called. The driver
+ * may call configuration functions during the configure call
+ */
+
+
+typedef isc_boolean_t (*dns_dlzssumatch_t)(dns_name_t *signer,
+ dns_name_t *name,
+ isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type,
+ const dst_key_t *key,
+ void *driverarg, void *dbdata);
+/*%<
+ * Method prototype. Drivers implementing the DLZ interface may
+ * optionally supply a ssumatch method. If supplied, this will be
+ * called to authorize update requests
+ */
+
/*% the methods supplied by a DLZ driver */
typedef struct dns_dlzmethods {
dns_dlzcreate_t create;
dns_dlzdestroy_t destroy;
dns_dlzfindzone_t findzone;
dns_dlzallowzonexfr_t allowzonexfr;
+ dns_dlzconfigure_t configure;
+ dns_dlzssumatch_t ssumatch;
} dns_dlzmethods_t;
/*% information about a DLZ driver */
@@ -183,12 +209,18 @@ struct dns_dlzimplementation {
ISC_LINK(dns_dlzimplementation_t) link;
};
-/*% an instance of a DLZ driver */
+typedef isc_result_t (*dlzconfigure_callback_t)(dns_view_t *, dns_zone_t *);
+
+/*% An instance of a DLZ driver */
struct dns_dlzdb {
unsigned int magic;
isc_mem_t *mctx;
dns_dlzimplementation_t *implementation;
void *dbdata;
+ dlzconfigure_callback_t configure_callback;
+#ifdef BIND9
+ dns_ssutable_t *ssutable;
+#endif
};
@@ -285,6 +317,30 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp);
* is called.
*/
+
+isc_result_t
+dns_dlz_writeablezone(dns_view_t *view, const char *zone_name);
+
+/*%<
+ * creates a writeable DLZ zone. Must be called from within the
+ * configure() method of a DLZ driver.
+ */
+
+
+isc_result_t
+dns_dlzconfigure(dns_view_t *view, dlzconfigure_callback_t callback);
+/*%<
+ * call a DLZ drivers configure method, if supplied
+ */
+
+isc_boolean_t
+dns_dlz_ssumatch(dns_dlzdb_t *dlzdatabase,
+ dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key);
+/*%<
+ * call a DLZ drivers ssumatch method, if supplied. Otherwise return ISC_FALSE
+ */
+
ISC_LANG_ENDDECLS
#endif /* DLZ_H */
diff --git a/contrib/bind9/lib/dns/include/dns/dns64.h b/contrib/bind9/lib/dns/include/dns/dns64.h
new file mode 100644
index 0000000..5fd32e8
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/dns64.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dns64.h,v 1.3 2010-12-08 23:51:56 tbox Exp $ */
+
+#ifndef DNS_DNS64_H
+#define DNS_DNS64_H 1
+
+#include <isc/lang.h>
+
+#include <dns/types.h>
+
+ISC_LANG_BEGINDECLS
+
+/*
+ * dns_dns64_create() flags.
+ */
+#define DNS_DNS64_RECURSIVE_ONLY 0x01 /* If set then this record
+ * only applies to recursive
+ * queries.
+ */
+#define DNS_DNS64_BREAK_DNSSEC 0x02 /* If set then still perform
+ * DNSSEC synthesis even
+ * though the result would
+ * fail validation.
+ */
+
+/*
+ * dns_dns64_aaaaok() and dns_dns64_aaaafroma() flags.
+ */
+#define DNS_DNS64_RECURSIVE 0x01 /* Recursive query. */
+#define DNS_DNS64_DNSSEC 0x02 /* DNSSEC sensitive query. */
+
+isc_result_t
+dns_dns64_create(isc_mem_t *mctx, isc_netaddr_t *prefix,
+ unsigned int prefixlen, isc_netaddr_t *suffix,
+ dns_acl_t *client, dns_acl_t *mapped, dns_acl_t *excluded,
+ unsigned int flags, dns_dns64_t **dns64);
+/*
+ * Create a dns64 record which is used to identify the set of clients
+ * it applies to and how to perform the DNS64 synthesis.
+ *
+ * 'prefix' and 'prefixlen' defined the leading bits of the AAAA records
+ * to be synthesised. 'suffix' defines the bits after the A records bits.
+ * If suffix is NULL zeros will be used for these bits. 'client' defines
+ * for which clients this record applies. If 'client' is NULL then all
+ * clients apply. 'mapped' defines which A records are candidated for
+ * mapping. If 'mapped' is NULL then all A records will be mapped.
+ * 'excluded' defines which AAAA are to be treated as non-existent for the
+ * purposed of determining whether to perform syntesis. If 'excluded' is
+ * NULL then no AAAA records prevent synthesis.
+ *
+ * If DNS_DNS64_RECURSIVE_ONLY is set then the record will only match if
+ * DNS_DNS64_RECURSIVE is set when calling dns_dns64_aaaaok() and
+ * dns_dns64_aaaafroma().
+ *
+ * If DNS_DNS64_BREAK_DNSSEC is set then the record will still apply if
+ * DNS_DNS64_DNSSEC is set when calling dns_dns64_aaaaok() and
+ * dns_dns64_aaaafroma() otherwise the record will be ignored.
+ *
+ * Requires:
+ * 'mctx' to be valid.
+ * 'prefix' to be valid and the address family to AF_INET6.
+ * 'prefixlen' to be one of 32, 40, 48, 56, 72 and 96.
+ * the bits not covered by prefixlen in prefix to
+ * be zero.
+ * 'suffix' to be NULL or the address family be set to AF_INET6
+ * and the leading 'prefixlen' + 32 bits of the 'suffix'
+ * to be zero. If 'prefixlen' is 40, 48 or 56 then the
+ * the leading 'prefixlen' + 40 bits of 'suffix' must be
+ * zero.
+ * 'client' to be NULL or a valid acl.
+ * 'mapped' to be NULL or a valid acl.
+ * 'exculded' to be NULL or a valid acl.
+ *
+ * Returns:
+ * ISC_R_SUCCESS
+ * ISC_R_NOMEMORY
+ */
+
+void
+dns_dns64_destroy(dns_dns64_t **dns64p);
+/*
+ * Destroys a dns64 record.
+ *
+ * Requires the record to not be linked.
+ */
+
+isc_result_t
+dns_dns64_aaaafroma(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, unsigned char *a, unsigned char *aaaa);
+/*
+ * dns_dns64_aaaafroma() determines whether to perform a DNS64 address
+ * synthesis from 'a' based on 'dns64', 'reqaddr', 'reqsigner', 'env',
+ * 'flags' and 'aaaa'. If synthesis is performed then the result is
+ * written to '*aaaa'.
+ *
+ * The synthesised address will be of the form:
+ *
+ * <prefix bits><a bits><suffix bits>
+ *
+ * If <a bits> straddle bits 64-71 of the AAAA record, then 8 zero bits will
+ * be inserted at bits 64-71.
+ *
+ * Requires:
+ * 'dns64' to be valid.
+ * 'reqaddr' to be valid.
+ * 'reqsigner' to be NULL or valid.
+ * 'env' to be valid.
+ * 'a' to point to a IPv4 address in network order.
+ * 'aaaa' to point to a IPv6 address buffer in network order.
+ *
+ * Returns:
+ * ISC_R_SUCCESS if synthesis was performed.
+ * DNS_R_DISALLOWED if there is no match.
+ */
+
+dns_dns64_t *
+dns_dns64_next(dns_dns64_t *dns64);
+/*
+ * Return the next dns64 record in the list.
+ */
+
+void
+dns_dns64_append(dns_dns64list_t *list, dns_dns64_t *dns64);
+/*
+ * Append the dns64 record to the list.
+ */
+
+void
+dns_dns64_unlink(dns_dns64list_t *list, dns_dns64_t *dns64);
+/*
+ * Unlink the dns64 record from the list.
+ */
+
+isc_boolean_t
+dns_dns64_aaaaok(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr,
+ const dns_name_t *reqsigner, const dns_aclenv_t *env,
+ unsigned int flags, dns_rdataset_t *rdataset,
+ isc_boolean_t *aaaaok, size_t aaaaoklen);
+/*
+ * Determine if there are any non-excluded AAAA records in from the
+ * matching dns64 records in the list starting at 'dns64'. If there
+ * is a non-exluded address return ISC_TRUE. If all addresses are
+ * excluded in the matched records return ISC_FALSE. If no records
+ * match then return ISC_TRUE.
+ *
+ * If aaaaok is defined then dns_dns64_aaaaok() return a array of which
+ * addresses in 'rdataset' were deemed to not be exclude by any matching
+ * record. If there are no matching records then all entries are set
+ * to ISC_TRUE.
+ *
+ * Requires
+ * 'rdataset' to be valid and to be for type AAAA and class IN.
+ * 'aaaaoklen' must match the number of records in 'rdataset'
+ * if 'aaaaok' in non NULL.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_DNS64_H */
diff --git a/contrib/bind9/lib/dns/include/dns/dnssec.h b/contrib/bind9/lib/dns/include/dns/dnssec.h
index 5a1468a..c6d910b 100644
--- a/contrib/bind9/lib/dns/include/dns/dnssec.h
+++ b/contrib/bind9/lib/dns/include/dns/dnssec.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnssec.h,v 1.32.332.6 2009-06-22 23:47:18 tbox Exp $ */
+/* $Id: dnssec.h,v 1.42 2010-01-09 23:48:45 tbox Exp $ */
#ifndef DNS_DNSSEC_H
#define DNS_DNSSEC_H 1
@@ -25,12 +25,48 @@
#include <isc/lang.h>
#include <isc/stdtime.h>
+#include <dns/diff.h>
#include <dns/types.h>
#include <dst/dst.h>
ISC_LANG_BEGINDECLS
+/*
+ * Indicates how the signer found this key: in the key repository, at the
+ * zone apex, or specified by the user.
+ */
+typedef enum {
+ dns_keysource_unknown,
+ dns_keysource_repository,
+ dns_keysource_zoneapex,
+ dns_keysource_user
+} dns_keysource_t;
+
+/*
+ * A DNSSEC key and hints about its intended use gleaned from metadata
+ */
+struct dns_dnsseckey {
+ dst_key_t *key;
+ isc_boolean_t hint_publish; /*% metadata says to publish */
+ isc_boolean_t force_publish; /*% publish regardless of metadata */
+ isc_boolean_t hint_sign; /*% metadata says to sign with this key */
+ isc_boolean_t force_sign; /*% sign with key regardless of metadata */
+ isc_boolean_t hint_remove; /*% metadata says *don't* publish */
+ isc_boolean_t is_active; /*% key is already active */
+ isc_boolean_t first_sign; /*% key is newly becoming active */
+ unsigned int prepublish; /*% how long until active? */
+ dns_keysource_t source; /*% how the key was found */
+ isc_boolean_t ksk; /*% this is a key-signing key */
+ isc_boolean_t legacy; /*% this is old-style key with no
+ metadata (possibly generated by
+ an older version of BIND9) and
+ should be ignored when searching
+ for keys to import into the zone */
+ unsigned int index; /*% position in list */
+ ISC_LINK(dns_dnsseckey_t) link;
+};
+
isc_result_t
dns_dnssec_keyfromrdata(dns_name_t *name, dns_rdata_t *rdata, isc_mem_t *mctx,
dst_key_t **key);
@@ -184,6 +220,103 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name,
isc_boolean_t ignoretime, isc_mem_t *mctx);
+isc_result_t
+dns_dnsseckey_create(isc_mem_t *mctx, dst_key_t **dstkey,
+ dns_dnsseckey_t **dkp);
+/*%<
+ * Create and initialize a dns_dnsseckey_t structure.
+ *
+ * Requires:
+ *\li 'dkp' is not NULL and '*dkp' is NULL.
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ */
+
+void
+dns_dnsseckey_destroy(isc_mem_t *mctx, dns_dnsseckey_t **dkp);
+/*%<
+ * Reclaim a dns_dnsseckey_t structure.
+ *
+ * Requires:
+ *\li 'dkp' is not NULL and '*dkp' is not NULL.
+ *
+ * Ensures:
+ *\li '*dkp' is NULL.
+ */
+
+isc_result_t
+dns_dnssec_findmatchingkeys(dns_name_t *origin, const char *directory,
+ isc_mem_t *mctx, dns_dnsseckeylist_t *keylist);
+/*%<
+ * Search 'directory' for K* key files matching the name in 'origin'.
+ * Append all such keys, along with use hints gleaned from their
+ * metadata, onto 'keylist'.
+ *
+ * Requires:
+ *\li 'keylist' is not NULL
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOTFOUND
+ *\li #ISC_R_NOMEMORY
+ *\li any error returned by dns_name_totext(), isc_dir_open(), or
+ * dst_key_fromnamedfile()
+ *
+ * Ensures:
+ *\li On error, keylist is unchanged
+ */
+
+isc_result_t
+dns_dnssec_keylistfromrdataset(dns_name_t *origin,
+ const char *directory, isc_mem_t *mctx,
+ dns_rdataset_t *keyset, dns_rdataset_t *keysigs,
+ dns_rdataset_t *soasigs, isc_boolean_t savekeys,
+ isc_boolean_t public,
+ dns_dnsseckeylist_t *keylist);
+/*%<
+ * Append the contents of a DNSKEY rdataset 'keyset' to 'keylist'.
+ * Omit duplicates. If 'public' is ISC_FALSE, search 'directory' for
+ * matching key files, and load the private keys that go with
+ * the public ones. If 'savekeys' is ISC_TRUE, mark the keys so
+ * they will not be deleted or inactivated regardless of metadata.
+ *
+ * 'keysigs' and 'soasigs', if not NULL and associated, contain the
+ * RRSIGS for the DNSKEY and SOA records respectively and are used to mark
+ * whether a key is already active in the zone.
+ */
+
+isc_result_t
+dns_dnssec_updatekeys(dns_dnsseckeylist_t *keys, dns_dnsseckeylist_t *newkeys,
+ dns_dnsseckeylist_t *removed, dns_name_t *origin,
+ dns_ttl_t ttl, dns_diff_t *diff, isc_boolean_t allzsk,
+ isc_mem_t *mctx, void (*report)(const char *, ...));
+/*%<
+ * Update the list of keys in 'keys' with new key information in 'newkeys'.
+ *
+ * For each key in 'newkeys', see if it has a match in 'keys'.
+ * - If not, and if the metadata says the key should be published:
+ * add it to 'keys', and place a dns_difftuple into 'diff' so
+ * the key can be added to the DNSKEY set. If the metadata says it
+ * should be active, set the first_sign flag.
+ * - If so, and if the metadata says it should be removed:
+ * remove it from 'keys', and place a dns_difftuple into 'diff' so
+ * the key can be removed from the DNSKEY set. if 'removed' is non-NULL,
+ * copy the key into that list; otherwise destroy it.
+ * - Otherwise, make sure keys has current metadata.
+ *
+ * If 'allzsk' is true, we are allowing KSK-flagged keys to be used as
+ * ZSKs.
+ *
+ * 'ttl' is the TTL of the DNSKEY RRset; if it is longer than the
+ * time until a new key will be activated, then we have to delay the
+ * key's activation.
+ *
+ * 'report' points to a function for reporting status.
+ *
+ * On completion, any remaining keys in 'newkeys' are freed.
+ */
ISC_LANG_ENDDECLS
#endif /* DNS_DNSSEC_H */
diff --git a/contrib/bind9/lib/dns/include/dns/ds.h b/contrib/bind9/lib/dns/include/dns/ds.h
index 77a2cb8..04e4bab 100644
--- a/contrib/bind9/lib/dns/include/dns/ds.h
+++ b/contrib/bind9/lib/dns/include/dns/ds.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds.h,v 1.10 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: ds.h,v 1.12 2010-12-23 23:47:08 tbox Exp $ */
#ifndef DNS_DS_H
#define DNS_DS_H 1
@@ -26,6 +26,11 @@
#define DNS_DSDIGEST_SHA1 (1)
#define DNS_DSDIGEST_SHA256 (2)
+#define DNS_DSDIGEST_GOST (3)
+
+/* should not be here... */
+
+#define ISC_GOST_DIGESTLENGTH 32U
/*
* Assuming SHA-256 digest type.
diff --git a/contrib/bind9/lib/dns/include/dns/ecdb.h b/contrib/bind9/lib/dns/include/dns/ecdb.h
new file mode 100644
index 0000000..be71a52
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/ecdb.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ecdb.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef DNS_ECDB_H
+#define DNS_ECDB_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/* TBD */
+
+/***
+ *** Imports
+ ***/
+
+#include <dns/types.h>
+
+/***
+ *** Types
+ ***/
+
+/***
+ *** Functions
+ ***/
+
+/* TBD: describe those */
+
+isc_result_t
+dns_ecdb_register(isc_mem_t *mctx, dns_dbimplementation_t **dbimp);
+
+void
+dns_ecdb_unregister(dns_dbimplementation_t **dbimp);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_ECDB_H */
diff --git a/contrib/bind9/lib/dns/include/dns/events.h b/contrib/bind9/lib/dns/include/dns/events.h
index 689566b..d985833 100644
--- a/contrib/bind9/lib/dns/include/dns/events.h
+++ b/contrib/bind9/lib/dns/include/dns/events.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: events.h,v 1.49.332.4 2010-05-10 23:48:14 tbox Exp $ */
+/* $Id: events.h,v 1.56 2010-12-21 03:11:42 marka Exp $ */
#ifndef DNS_EVENTS_H
#define DNS_EVENTS_H 1
@@ -69,6 +69,11 @@
#define DNS_EVENT_ACACHECLEAN (ISC_EVENTCLASS_DNS + 39)
#define DNS_EVENT_ACACHEOVERMEM (ISC_EVENTCLASS_DNS + 40)
#define DNS_EVENT_RBTPRUNE (ISC_EVENTCLASS_DNS + 41)
+#define DNS_EVENT_MANAGEKEYS (ISC_EVENTCLASS_DNS + 42)
+#define DNS_EVENT_CLIENTRESDONE (ISC_EVENTCLASS_DNS + 43)
+#define DNS_EVENT_CLIENTREQDONE (ISC_EVENTCLASS_DNS + 44)
+#define DNS_EVENT_ADBGROWENTRIES (ISC_EVENTCLASS_DNS + 45)
+#define DNS_EVENT_ADBGROWNAMES (ISC_EVENTCLASS_DNS + 46)
#define DNS_EVENT_FIRSTEVENT (ISC_EVENTCLASS_DNS + 0)
#define DNS_EVENT_LASTEVENT (ISC_EVENTCLASS_DNS + 65535)
diff --git a/contrib/bind9/lib/dns/include/dns/forward.h b/contrib/bind9/lib/dns/include/dns/forward.h
index 5fbe898..683969d 100644
--- a/contrib/bind9/lib/dns/include/dns/forward.h
+++ b/contrib/bind9/lib/dns/include/dns/forward.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: forward.h,v 1.11 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: forward.h,v 1.13 2009-09-02 23:48:02 tbox Exp $ */
#ifndef DNS_FORWARD_H
#define DNS_FORWARD_H 1
@@ -67,6 +67,21 @@ dns_fwdtable_add(dns_fwdtable_t *fwdtable, dns_name_t *name,
*/
isc_result_t
+dns_fwdtable_delete(dns_fwdtable_t *fwdtable, dns_name_t *name);
+/*%<
+ * Removes an entry for 'name' from the forwarding table. If an entry
+ * that exactly matches 'name' does not exist, ISC_R_NOTFOUND will be returned.
+ *
+ * Requires:
+ * \li fwdtable is a valid forwarding table.
+ * \li name is a valid name
+ *
+ * Returns:
+ * \li #ISC_R_SUCCESS
+ * \li #ISC_R_NOTFOUND
+ */
+
+isc_result_t
dns_fwdtable_find(dns_fwdtable_t *fwdtable, dns_name_t *name,
dns_forwarders_t **forwardersp);
/*%<
diff --git a/contrib/bind9/lib/dns/include/dns/journal.h b/contrib/bind9/lib/dns/include/dns/journal.h
index 9e56c19..28a7dbe 100644
--- a/contrib/bind9/lib/dns/include/dns/journal.h
+++ b/contrib/bind9/lib/dns/include/dns/journal.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: journal.h,v 1.33.120.4 2009-11-04 23:47:25 tbox Exp $ */
+/* $Id: journal.h,v 1.37 2009-11-04 23:48:18 tbox Exp $ */
#ifndef DNS_JOURNAL_H
#define DNS_JOURNAL_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/keydata.h b/contrib/bind9/lib/dns/include/dns/keydata.h
new file mode 100644
index 0000000..36bf590
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/keydata.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keydata.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+#ifndef DNS_KEYDATA_H
+#define DNS_KEYDATA_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file dns/keydata.h
+ * \brief
+ * KEYDATA utilities.
+ */
+
+/***
+ *** Imports
+ ***/
+
+#include <isc/lang.h>
+#include <isc/types.h>
+
+#include <dns/types.h>
+#include <dns/rdatastruct.h>
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+dns_keydata_todnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx);
+
+isc_result_t
+dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey,
+ isc_uint32_t refresh, isc_uint32_t addhd,
+ isc_uint32_t removehd, isc_mem_t *mctx);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_KEYDATA_H */
diff --git a/contrib/bind9/lib/dns/include/dns/keytable.h b/contrib/bind9/lib/dns/include/dns/keytable.h
index 40c4b16..a53ec08 100644
--- a/contrib/bind9/lib/dns/include/dns/keytable.h
+++ b/contrib/bind9/lib/dns/include/dns/keytable.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keytable.h,v 1.16 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: keytable.h,v 1.23 2010-06-25 03:24:05 marka Exp $ */
#ifndef DNS_KEYTABLE_H
#define DNS_KEYTABLE_H 1
@@ -42,6 +42,10 @@
*/
#include <isc/lang.h>
+#include <isc/magic.h>
+#include <isc/refcount.h>
+#include <isc/rwlock.h>
+#include <isc/stdtime.h>
#include <dns/types.h>
@@ -49,6 +53,33 @@
ISC_LANG_BEGINDECLS
+struct dns_keytable {
+ /* Unlocked. */
+ unsigned int magic;
+ isc_mem_t *mctx;
+ isc_mutex_t lock;
+ isc_rwlock_t rwlock;
+ /* Locked by lock. */
+ isc_uint32_t active_nodes;
+ /* Locked by rwlock. */
+ isc_uint32_t references;
+ dns_rbt_t *table;
+};
+
+#define KEYTABLE_MAGIC ISC_MAGIC('K', 'T', 'b', 'l')
+#define VALID_KEYTABLE(kt) ISC_MAGIC_VALID(kt, KEYTABLE_MAGIC)
+
+struct dns_keynode {
+ unsigned int magic;
+ isc_refcount_t refcount;
+ dst_key_t * key;
+ isc_boolean_t managed;
+ struct dns_keynode * next;
+};
+
+#define KEYNODE_MAGIC ISC_MAGIC('K', 'N', 'o', 'd')
+#define VALID_KEYNODE(kn) ISC_MAGIC_VALID(kn, KEYNODE_MAGIC)
+
isc_result_t
dns_keytable_create(isc_mem_t *mctx, dns_keytable_t **keytablep);
/*%<
@@ -106,16 +137,22 @@ dns_keytable_detach(dns_keytable_t **keytablep);
*/
isc_result_t
-dns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp);
+dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed,
+ dst_key_t **keyp);
/*%<
- * Add '*keyp' to 'keytable'.
+ * Add '*keyp' to 'keytable' (using the name in '*keyp').
+ * The value of keynode->managed is set to 'managed'
*
* Notes:
*
*\li Ownership of *keyp is transferred to the keytable.
+ *\li If the key already exists in the table, ISC_R_EXISTS is
+ * returned and the new key is freed.
*
* Requires:
*
+ *\li 'keytable' points to a valid keytable.
+ *
*\li keyp != NULL && *keyp is a valid dst_key_t *.
*
* Ensures:
@@ -125,11 +162,124 @@ dns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp);
* Returns:
*
*\li ISC_R_SUCCESS
+ *\li ISC_R_EXISTS
+ *
+ *\li Any other result indicates failure.
+ */
+
+isc_result_t
+dns_keytable_marksecure(dns_keytable_t *keytable, dns_name_t *name);
+/*%<
+ * Add a null key to 'keytable' for name 'name'. This marks the
+ * name as a secure domain, but doesn't supply any key data to allow the
+ * domain to be validated. (Used when automated trust anchor management
+ * has gotten broken by a zone misconfiguration; for example, when the
+ * active key has been revoked but the stand-by key was still in its 30-day
+ * waiting period for validity.)
+ *
+ * Notes:
+ *
+ *\li If a key already exists in the table, ISC_R_EXISTS is
+ * returned and nothing is done.
+ *
+ * Requires:
+ *
+ *\li 'keytable' points to a valid keytable.
+ *
+ *\li keyp != NULL && *keyp is a valid dst_key_t *.
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_EXISTS
+ *
+ *\li Any other result indicates failure.
+ */
+
+isc_result_t
+dns_keytable_delete(dns_keytable_t *keytable, dns_name_t *keyname);
+/*%<
+ * Delete node(s) from 'keytable' matching name 'keyname'
+ *
+ * Requires:
+ *
+ *\li 'keytable' points to a valid keytable.
+ *
+ *\li 'name' is not NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *
+ *\li Any other result indicates failure.
+ */
+
+isc_result_t
+dns_keytable_deletekeynode(dns_keytable_t *keytable, dst_key_t *dstkey);
+/*%<
+ * Delete node(s) from 'keytable' containing copies of the key pointed
+ * to by 'dstkey'
+ *
+ * Requires:
+ *
+ *\li 'keytable' points to a valid keytable.
+ *\li 'dstkey' is not NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
*
*\li Any other result indicates failure.
*/
isc_result_t
+dns_keytable_find(dns_keytable_t *keytable, dns_name_t *keyname,
+ dns_keynode_t **keynodep);
+/*%<
+ * Search for the first instance of a key named 'name' in 'keytable',
+ * without regard to keyid and algorithm. Use dns_keytable_nextkeynode()
+ * to find subsequent instances.
+ *
+ * Requires:
+ *
+ *\li 'keytable' is a valid keytable.
+ *
+ *\li 'name' is a valid absolute name.
+ *
+ *\li keynodep != NULL && *keynodep == NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOTFOUND
+ *
+ *\li Any other result indicates an error.
+ */
+
+isc_result_t
+dns_keytable_nextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
+ dns_keynode_t **nextnodep);
+/*%<
+ * Return for the next key after 'keynode' in 'keytable', without regard to
+ * keyid and algorithm.
+ *
+ * Requires:
+ *
+ *\li 'keytable' is a valid keytable.
+ *
+ *\li 'keynode' is a valid keynode.
+ *
+ *\li nextnodep != NULL && *nextnodep == NULL
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOTFOUND
+ *
+ *\li Any other result indicates an error.
+ */
+
+isc_result_t
dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
dns_secalg_t algorithm, dns_keytag_t tag,
dns_keynode_t **keynodep);
@@ -157,7 +307,7 @@ dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
isc_result_t
dns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
- dns_keynode_t **nextnodep);
+ dns_keynode_t **nextnodep);
/*%<
* Search for the next key with the same properties as 'keynode' in
* 'keytable' as found by dns_keytable_findkeynode().
@@ -201,6 +351,22 @@ dns_keytable_finddeepestmatch(dns_keytable_t *keytable, dns_name_t *name,
*/
void
+dns_keytable_attachkeynode(dns_keytable_t *keytable, dns_keynode_t *source,
+ dns_keynode_t **target);
+/*%<
+ * Attach a keynode and and increment the active_nodes counter in a
+ * corresponding keytable.
+ *
+ * Requires:
+ *
+ *\li 'keytable' is a valid keytable.
+ *
+ *\li 'source' is a valid keynode.
+ *
+ *\li 'target' is not null and '*target' is null.
+ */
+
+void
dns_keytable_detachkeynode(dns_keytable_t *keytable,
dns_keynode_t **keynodep);
/*%<
@@ -244,12 +410,48 @@ dns_keytable_issecuredomain(dns_keytable_t *keytable, dns_name_t *name,
*\li Any other result is an error.
*/
+isc_result_t
+dns_keytable_dump(dns_keytable_t *keytable, FILE *fp);
+/*%<
+ * Dump the keytable on fp.
+ */
+
dst_key_t *
dns_keynode_key(dns_keynode_t *keynode);
/*%<
* Get the DST key associated with keynode.
*/
+isc_boolean_t
+dns_keynode_managed(dns_keynode_t *keynode);
+/*%<
+ * Is this flagged as a managed key?
+ */
+
+isc_result_t
+dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target);
+/*%<
+ * Allocate space for a keynode
+ */
+
+void
+dns_keynode_attach(dns_keynode_t *source, dns_keynode_t **target);
+/*%<
+ * Attach keynode 'source' to '*target'
+ */
+
+void
+dns_keynode_detach(isc_mem_t *mctx, dns_keynode_t **target);
+/*%<
+ * Detach a single keynode, without touching any keynodes that
+ * may be pointed to by its 'next' pointer
+ */
+
+void
+dns_keynode_detachall(isc_mem_t *mctx, dns_keynode_t **target);
+/*%<
+ * Detach a keynode and all its succesors.
+ */
ISC_LANG_ENDDECLS
#endif /* DNS_KEYTABLE_H */
diff --git a/contrib/bind9/lib/dns/include/dns/keyvalues.h b/contrib/bind9/lib/dns/include/dns/keyvalues.h
index 70ca3fa..2107657 100644
--- a/contrib/bind9/lib/dns/include/dns/keyvalues.h
+++ b/contrib/bind9/lib/dns/include/dns/keyvalues.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keyvalues.h,v 1.23.48.4 2010-01-15 23:47:33 tbox Exp $ */
+/* $Id: keyvalues.h,v 1.29 2010-12-23 23:47:08 tbox Exp $ */
#ifndef DNS_KEYVALUES_H
#define DNS_KEYVALUES_H 1
@@ -42,7 +42,7 @@
#define DNS_KEYOWNER_ENTITY 0x0200 /*%< key is assoc. with entity eg host */
#define DNS_KEYOWNER_ZONE 0x0100 /*%< key is zone key */
#define DNS_KEYOWNER_RESERVED 0x0300 /*%< reserved meaning */
-#define DNS_KEYFLAG_REVOKE 0x0080 /*%< key revoked (per rfc5001) */
+#define DNS_KEYFLAG_REVOKE 0x0080 /*%< key revoked (per rfc5011) */
#define DNS_KEYFLAG_RESERVED9 0x0040 /*%< reserved - must be zero */
#define DNS_KEYFLAG_RESERVED10 0x0020 /*%< reserved - must be zero */
#define DNS_KEYFLAG_RESERVED11 0x0010 /*%< reserved - must be zero */
@@ -51,7 +51,6 @@
#define DNS_KEYFLAG_RESERVEDMASK (DNS_KEYFLAG_RESERVED2 | \
DNS_KEYFLAG_RESERVED4 | \
DNS_KEYFLAG_RESERVED5 | \
- DNS_KEYFLAG_RESERVED8 | \
DNS_KEYFLAG_RESERVED9 | \
DNS_KEYFLAG_RESERVED10 | \
DNS_KEYFLAG_RESERVED11 )
@@ -71,6 +70,7 @@
#define DNS_KEYALG_NSEC3RSASHA1 7
#define DNS_KEYALG_RSASHA256 8
#define DNS_KEYALG_RSASHA512 10
+#define DNS_KEYALG_ECCGOST 12
#define DNS_KEYALG_INDIRECT 252
#define DNS_KEYALG_PRIVATEDNS 253
#define DNS_KEYALG_PRIVATEOID 254 /*%< Key begins with OID giving alg */
@@ -99,4 +99,6 @@
#define DNS_SIG_DSAMINBYTES 213
#define DNS_SIG_DSAMAXBYTES 405
+#define DNS_SIG_GOSTSIGSIZE 64
+
#endif /* DNS_KEYVALUES_H */
diff --git a/contrib/bind9/lib/dns/include/dns/lib.h b/contrib/bind9/lib/dns/include/dns/lib.h
index 361ef8f..70874b7 100644
--- a/contrib/bind9/lib/dns/include/dns/lib.h
+++ b/contrib/bind9/lib/dns/include/dns/lib.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.h,v 1.16 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: lib.h,v 1.18 2009-09-02 23:48:02 tbox Exp $ */
#ifndef DNS_LIB_H
#define DNS_LIB_H 1
@@ -40,6 +40,20 @@ dns_lib_initmsgcat(void);
* has not already been initialized.
*/
+isc_result_t
+dns_lib_init(void);
+/*%<
+ * A set of initialization procedure used in the DNS library. This function
+ * is provided for an application that is not aware of the underlying ISC or
+ * DNS libraries much.
+ */
+
+void
+dns_lib_shutdown(void);
+/*%<
+ * Free temporary resources allocated in dns_lib_init().
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_LIB_H */
diff --git a/contrib/bind9/lib/dns/include/dns/log.h b/contrib/bind9/lib/dns/include/dns/log.h
index 4b648ff..a5650ed 100644
--- a/contrib/bind9/lib/dns/include/dns/log.h
+++ b/contrib/bind9/lib/dns/include/dns/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.42.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: log.h,v 1.45 2009-12-18 22:16:49 each Exp $ */
/*! \file dns/log.h
* \author Principal Authors: DCL */
@@ -73,6 +73,7 @@ LIBDNS_EXTERNAL_DATA extern isc_logmodule_t dns_modules[];
#define DNS_LOGMODULE_HINTS (&dns_modules[24])
#define DNS_LOGMODULE_ACACHE (&dns_modules[25])
#define DNS_LOGMODULE_DLZ (&dns_modules[26])
+#define DNS_LOGMODULE_DNSSEC (&dns_modules[27])
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/dns/include/dns/lookup.h b/contrib/bind9/lib/dns/include/dns/lookup.h
index 81bb9b9..7e6a566 100644
--- a/contrib/bind9/lib/dns/include/dns/lookup.h
+++ b/contrib/bind9/lib/dns/include/dns/lookup.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lookup.h,v 1.12.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: lookup.h,v 1.14 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_LOOKUP_H
#define DNS_LOOKUP_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/master.h b/contrib/bind9/lib/dns/include/dns/master.h
index 3f3a4de..2ee6374 100644
--- a/contrib/bind9/lib/dns/include/dns/master.h
+++ b/contrib/bind9/lib/dns/include/dns/master.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: master.h,v 1.51 2008-04-02 02:37:42 marka Exp $ */
+/* $Id: master.h,v 1.53 2009-07-01 23:47:36 tbox Exp $ */
#ifndef DNS_MASTER_H
#define DNS_MASTER_H 1
@@ -56,6 +56,7 @@
#define DNS_MASTER_CHECKMXFAIL 0x00001000
#define DNS_MASTER_RESIGN 0x00002000
+#define DNS_MASTER_KEY 0x00004000 /*%< Loading a key zone master file. */
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/dns/include/dns/masterdump.h b/contrib/bind9/lib/dns/include/dns/masterdump.h
index 651d0d0..684dd82 100644
--- a/contrib/bind9/lib/dns/include/dns/masterdump.h
+++ b/contrib/bind9/lib/dns/include/dns/masterdump.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: masterdump.h,v 1.42.602.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: masterdump.h,v 1.42.596.2 2011-06-02 23:47:35 tbox Exp $ */
#ifndef DNS_MASTERDUMP_H
#define DNS_MASTERDUMP_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/message.h b/contrib/bind9/lib/dns/include/dns/message.h
index 98fb321..438de1e 100644
--- a/contrib/bind9/lib/dns/include/dns/message.h
+++ b/contrib/bind9/lib/dns/include/dns/message.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: message.h,v 1.125.118.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: message.h,v 1.132 2010-03-04 23:50:34 tbox Exp $ */
#ifndef DNS_MESSAGE_H
#define DNS_MESSAGE_H 1
@@ -81,8 +81,7 @@
* name = NULL;
* name = dns_message_gettempname(message, &name);
* dns_name_init(name, NULL);
- * result = dns_name_fromtext(name, &source, dns_rootname, ISC_FALSE,
- * buffer);
+ * result = dns_name_fromtext(name, &source, dns_rootname, 0, buffer);
* dns_message_takebuffer(message, &buffer);
* \endcode
*
@@ -137,6 +136,8 @@ typedef int dns_pseudosection_t;
typedef int dns_messagetextflag_t;
#define DNS_MESSAGETEXTFLAG_NOCOMMENTS 0x0001
#define DNS_MESSAGETEXTFLAG_NOHEADERS 0x0002
+#define DNS_MESSAGETEXTFLAG_ONESOA 0x0004
+#define DNS_MESSAGETEXTFLAG_OMITSOA 0x0008
/*
* Dynamic update names for these sections.
@@ -174,6 +175,9 @@ typedef int dns_messagetextflag_t;
additional section. */
#define DNS_MESSAGERENDER_PREFER_AAAA 0x0010 /*%< prefer AAAA records in
additional section. */
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+#define DNS_MESSAGERENDER_FILTER_AAAA 0x0020 /*%< filter AAAA records */
+#endif
typedef struct dns_msgblock dns_msgblock_t;
@@ -369,6 +373,14 @@ dns_message_totext(dns_message_t *msg, const dns_master_style_t *style,
* #DNS_MESSAGETEXTFLAG_NOHEADERS is cleared, header lines will
* be emitted.
*
+ * If #DNS_MESSAGETEXTFLAG_ONESOA is set then only print the
+ * first SOA record in the answer section. If
+ * #DNS_MESSAGETEXTFLAG_OMITSOA is set don't print any SOA records
+ * in the answer section. These are useful for suppressing the
+ * display of the second SOA record in a AXFR by setting
+ * #DNS_MESSAGETEXTFLAG_ONESOA on the first message in a AXFR stream
+ * and #DNS_MESSAGETEXTFLAG_OMITSOA on subsequent messages.
+ *
* Requires:
*
*\li 'msg' is a valid message.
diff --git a/contrib/bind9/lib/dns/include/dns/name.h b/contrib/bind9/lib/dns/include/dns/name.h
index 801c9ac..c13a85d 100644
--- a/contrib/bind9/lib/dns/include/dns/name.h
+++ b/contrib/bind9/lib/dns/include/dns/name.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: name.h,v 1.126.332.5 2010-07-09 23:45:55 tbox Exp $ */
+/* $Id: name.h,v 1.137 2011-01-13 04:59:26 tbox Exp $ */
#ifndef DNS_NAME_H
#define DNS_NAME_H 1
@@ -121,21 +121,27 @@ struct dns_name {
#define DNS_NAME_MAGIC ISC_MAGIC('D','N','S','n')
-#define DNS_NAMEATTR_ABSOLUTE 0x0001
-#define DNS_NAMEATTR_READONLY 0x0002
-#define DNS_NAMEATTR_DYNAMIC 0x0004
-#define DNS_NAMEATTR_DYNOFFSETS 0x0008
-#define DNS_NAMEATTR_NOCOMPRESS 0x0010
+#define DNS_NAMEATTR_ABSOLUTE 0x00000001
+#define DNS_NAMEATTR_READONLY 0x00000002
+#define DNS_NAMEATTR_DYNAMIC 0x00000004
+#define DNS_NAMEATTR_DYNOFFSETS 0x00000008
+#define DNS_NAMEATTR_NOCOMPRESS 0x00000010
/*
* Attributes below 0x0100 reserved for name.c usage.
*/
-#define DNS_NAMEATTR_CACHE 0x0100 /*%< Used by resolver. */
-#define DNS_NAMEATTR_ANSWER 0x0200 /*%< Used by resolver. */
-#define DNS_NAMEATTR_NCACHE 0x0400 /*%< Used by resolver. */
-#define DNS_NAMEATTR_CHAINING 0x0800 /*%< Used by resolver. */
-#define DNS_NAMEATTR_CHASE 0x1000 /*%< Used by resolver. */
-#define DNS_NAMEATTR_WILDCARD 0x2000 /*%< Used by server. */
+#define DNS_NAMEATTR_CACHE 0x00000100 /*%< Used by resolver. */
+#define DNS_NAMEATTR_ANSWER 0x00000200 /*%< Used by resolver. */
+#define DNS_NAMEATTR_NCACHE 0x00000400 /*%< Used by resolver. */
+#define DNS_NAMEATTR_CHAINING 0x00000800 /*%< Used by resolver. */
+#define DNS_NAMEATTR_CHASE 0x00001000 /*%< Used by resolver. */
+#define DNS_NAMEATTR_WILDCARD 0x00002000 /*%< Used by server. */
+#define DNS_NAMEATTR_PREREQUISITE 0x00004000 /*%< Used by client. */
+#define DNS_NAMEATTR_UPDATE 0x00008000 /*%< Used by client. */
+#define DNS_NAMEATTR_HASUPDATEREC 0x00010000 /*%< Used by client. */
+/*
+ * Various flags.
+ */
#define DNS_NAME_DOWNCASE 0x0001
#define DNS_NAME_CHECKNAMES 0x0002 /*%< Used by rdata. */
#define DNS_NAME_CHECKNAMESFAIL 0x0004 /*%< Used by rdata. */
@@ -750,7 +756,7 @@ dns_name_towire(const dns_name_t *name, dns_compress_t *cctx,
isc_result_t
dns_name_fromtext(dns_name_t *name, isc_buffer_t *source,
- dns_name_t *origin, unsigned int options,
+ const dns_name_t *origin, unsigned int options,
isc_buffer_t *target);
/*%<
* Convert the textual representation of a DNS name at source
@@ -1139,6 +1145,56 @@ dns_name_format(dns_name_t *name, char *cp, unsigned int size);
*/
isc_result_t
+dns_name_tostring(dns_name_t *source, char **target, isc_mem_t *mctx);
+/*%<
+ * Convert 'name' to string format, allocating sufficient memory to
+ * hold it (free with isc_mem_free()).
+ *
+ * Differs from dns_name_format in that it allocates its own memory.
+ *
+ * Requires:
+ *
+ *\li 'name' is a valid name.
+ *\li 'target' is not NULL.
+ *\li '*target' is NULL.
+ *
+ * Returns:
+ *
+ *\li ISC_R_SUCCESS
+ *
+ *\li Any error that dns_name_totext() can return.
+ */
+
+isc_result_t
+dns_name_fromstring(dns_name_t *target, const char *src, unsigned int options,
+ isc_mem_t *mctx);
+isc_result_t
+dns_name_fromstring2(dns_name_t *target, const char *src,
+ const dns_name_t *origin, unsigned int options,
+ isc_mem_t *mctx);
+/*%<
+ * Convert a string to a name and place it in target, allocating memory
+ * as necessary. 'options' has the same semantics as that of
+ * dns_name_fromtext().
+ *
+ * If 'target' has a buffer then the name will be copied into it rather than
+ * memory being allocated.
+ *
+ * Requires:
+ *
+ * \li 'target' is a valid name that is not read-only.
+ * \li 'src' is not NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *
+ *\li Any error that dns_name_fromtext() can return.
+ *
+ *\li Any error that dns_name_dup() can return.
+ */
+
+isc_result_t
dns_name_settotextfilter(dns_name_totextfilter_t proc);
/*%<
* Set / clear a thread specific function 'proc' to be called at the
diff --git a/contrib/bind9/lib/dns/include/dns/ncache.h b/contrib/bind9/lib/dns/include/dns/ncache.h
index 0c1d950..32345cf 100644
--- a/contrib/bind9/lib/dns/include/dns/ncache.h
+++ b/contrib/bind9/lib/dns/include/dns/ncache.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ncache.h,v 1.25.48.4 2010-05-14 23:47:50 tbox Exp $ */
+/* $Id: ncache.h,v 1.29 2010-05-14 23:50:40 tbox Exp $ */
#ifndef DNS_NCACHE_H
#define DNS_NCACHE_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/nsec3.h b/contrib/bind9/lib/dns/include/dns/nsec3.h
index ba808e4..ac0c8f2 100644
--- a/contrib/bind9/lib/dns/include/dns/nsec3.h
+++ b/contrib/bind9/lib/dns/include/dns/nsec3.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3.h,v 1.5.48.3 2009-10-06 21:20:18 each Exp $ */
+/* $Id: nsec3.h,v 1.12 2010-05-18 02:38:10 tbox Exp $ */
#ifndef DNS_NSEC3_H
#define DNS_NSEC3_H 1
@@ -110,6 +110,12 @@ isc_result_t
dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
dns_name_t *name, dns_ttl_t nsecttl,
isc_boolean_t unsecure, dns_diff_t *diff);
+
+isc_result_t
+dns_nsec3_addnsec3sx(dns_db_t *db, dns_dbversion_t *version,
+ dns_name_t *name, dns_ttl_t nsecttl,
+ isc_boolean_t unsecure, dns_rdatatype_t private,
+ dns_diff_t *diff);
/*%<
* Add NSEC3 records for 'name', recording the change in 'diff'.
* Adjust previous NSEC3 records, if any, to reflect the addition.
@@ -130,6 +136,10 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
* NSEC3PARAM record otherwise OPTOUT will be inherited from the previous
* record in the chain.
*
+ * dns_nsec3_addnsec3sx() is similar to dns_nsec3_addnsec3s() but 'private'
+ * specifies the type of the private rdataset to be checked in addition to
+ * the nsec3param rdataset at the zone apex.
+ *
* Requires:
* 'db' to be valid.
* 'version' to be valid or NULL.
@@ -145,6 +155,10 @@ dns_nsec3_delnsec3(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
isc_result_t
dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
dns_diff_t *diff);
+
+isc_result_t
+dns_nsec3_delnsec3sx(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
+ dns_rdatatype_t private, dns_diff_t *diff);
/*%<
* Remove NSEC3 records for 'name', recording the change in 'diff'.
* Adjust previous NSEC3 records, if any, to reflect the removal.
@@ -156,6 +170,10 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
* to dns_nsec3_addnsec3s(). Unlike dns_nsec3_addnsec3s() updated NSEC3
* records have the OPTOUT flag preserved.
*
+ * dns_nsec3_delnsec3sx() is similar to dns_nsec3_delnsec3s() but 'private'
+ * specifies the type of the private rdataset to be checked in addition to
+ * the nsec3param rdataset at the zone apex.
+ *
* Requires:
* 'db' to be valid.
* 'version' to be valid or NULL.
@@ -167,10 +185,19 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
isc_result_t
dns_nsec3_active(dns_db_t *db, dns_dbversion_t *version,
isc_boolean_t complete, isc_boolean_t *answer);
+
+isc_result_t
+dns_nsec3_activex(dns_db_t *db, dns_dbversion_t *version,
+ isc_boolean_t complete, dns_rdatatype_t private,
+ isc_boolean_t *answer);
/*%<
* Check if there are any complete/to be built NSEC3 chains.
* If 'complete' is ISC_TRUE only complete chains will be recognized.
*
+ * dns_nsec3_activex() is similar to dns_nsec3_active() but 'private'
+ * specifies the type of the private rdataset to be checked in addition to
+ * the nsec3param rdataset at the zone apex.
+ *
* Requires:
* 'db' to be valid.
* 'version' to be valid or NULL.
@@ -191,6 +218,36 @@ dns_nsec3_maxiterations(dns_db_t *db, dns_dbversion_t *version,
* 'iterationsp' to be non NULL.
*/
+isc_boolean_t
+dns_nsec3param_fromprivate(dns_rdata_t *src, dns_rdata_t *target,
+ unsigned char *buf, size_t buflen);
+/*%<
+ * Convert a private rdata to a nsec3param rdata.
+ *
+ * Return ISC_TRUE if 'src' could be successfully converted.
+ *
+ * 'buf' should be at least DNS_NSEC3PARAM_BUFFERSIZE in size.
+ */
+
+void
+dns_nsec3param_toprivate(dns_rdata_t *src, dns_rdata_t *target,
+ dns_rdatatype_t privatetype,
+ unsigned char *buf, size_t buflen);
+/*%<
+ * Convert a nsec3param rdata to a private rdata.
+ *
+ * 'buf' should be at least src->length + 1 in size.
+ */
+
+isc_result_t
+dns_nsec3param_deletechains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_zone_t *zone, dns_diff_t *diff);
+
+/*%<
+ * Mark NSEC3PARAM for deletion.
+ */
+
+
ISC_LANG_ENDDECLS
#endif /* DNS_NSEC3_H */
diff --git a/contrib/bind9/lib/dns/include/dns/peer.h b/contrib/bind9/lib/dns/include/dns/peer.h
index 1f8a42e..a1a3e34 100644
--- a/contrib/bind9/lib/dns/include/dns/peer.h
+++ b/contrib/bind9/lib/dns/include/dns/peer.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: peer.h,v 1.33.118.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: peer.h,v 1.35 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_PEER_H
#define DNS_PEER_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/private.h b/contrib/bind9/lib/dns/include/dns/private.h
new file mode 100644
index 0000000..ffedb5f
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/private.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: private.h,v 1.3 2009-10-09 23:48:09 tbox Exp $ */
+
+#include <isc/lang.h>
+#include <isc/types.h>
+
+#include <dns/types.h>
+#include <dns/db.h>
+
+#ifndef DNS_PRIVATE_H
+#define DNS_PRIVATE_H
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+dns_private_chains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_rdatatype_t privatetype,
+ isc_boolean_t *build_nsec, isc_boolean_t *build_nsec3);
+/*%<
+ * Examine the NSEC, NSEC3PARAM and privatetype RRsets at the apex of the
+ * database to determine which of NSEC or NSEC3 chains we are currently
+ * maintaining. In normal operations only one of NSEC or NSEC3 is being
+ * maintained but when we are transitiong between NSEC and NSEC3 we need
+ * to update both sets of chains. If 'privatetype' is zero then the
+ * privatetype RRset will not be examined.
+ *
+ * Requires:
+ * \li 'db' is valid.
+ * \li 'version' is valid or NULL.
+ * \li 'build_nsec' is a pointer to a isc_boolean_t or NULL.
+ * \li 'build_nsec3' is a pointer to a isc_boolean_t or NULL.
+ *
+ * Returns:
+ * \li ISC_R_SUCCESS, 'build_nsec' and 'build_nsec3' will be valid.
+ * \li other on error
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif
diff --git a/contrib/bind9/lib/dns/include/dns/rbt.h b/contrib/bind9/lib/dns/include/dns/rbt.h
index 72ef2f1..6149e8d 100644
--- a/contrib/bind9/lib/dns/include/dns/rbt.h
+++ b/contrib/bind9/lib/dns/include/dns/rbt.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbt.h,v 1.71.48.3 2009-10-20 05:06:04 marka Exp $ */
+/* $Id: rbt.h,v 1.77 2009-11-04 01:18:19 marka Exp $ */
#ifndef DNS_RBT_H
#define DNS_RBT_H 1
@@ -70,6 +70,12 @@ ISC_LANG_BEGINDECLS
* multiple dns_rbtnode structures will not work.
*/
typedef struct dns_rbtnode dns_rbtnode_t;
+enum {
+ DNS_RBT_NSEC_NORMAL=0, /* in main tree */
+ DNS_RBT_NSEC_HAS_NSEC=1, /* also has node in nsec tree */
+ DNS_RBT_NSEC_NSEC=2, /* in nsec tree */
+ DNS_RBT_NSEC_NSEC3=3 /* in nsec3 tree */
+};
struct dns_rbtnode {
#if DNS_RBT_USEMAGIC
unsigned int magic;
@@ -94,10 +100,7 @@ struct dns_rbtnode {
* The following bitfields add up to a total bitwidth of 32.
* The range of values necessary for each item is indicated,
* but in the case of "attributes" the field is wider to accommodate
- * possible future expansion. "offsetlen" could be one bit
- * narrower by always adjusting its value by 1 to find the real
- * offsetlen, but doing so does not gain anything (except perhaps
- * another bit for "attributes", which doesn't yet need any more).
+ * possible future expansion.
*
* In each case below the "range" indicated is what's _necessary_ for
* the bitfield to hold, not what it actually _can_ hold.
@@ -105,8 +108,8 @@ struct dns_rbtnode {
unsigned int is_root : 1; /*%< range is 0..1 */
unsigned int color : 1; /*%< range is 0..1 */
unsigned int find_callback : 1; /*%< range is 0..1 */
- unsigned int attributes : 4; /*%< range is 0..2 */
- unsigned int nsec3 : 1; /*%< range is 0..1 */
+ unsigned int attributes : 3; /*%< range is 0..2 */
+ unsigned int nsec : 2; /*%< range is 0..3 */
unsigned int namelen : 8; /*%< range is 1..255 */
unsigned int offsetlen : 8; /*%< range is 1..128 */
unsigned int oldnamelen : 8; /*%< range is 1..255 */
@@ -909,7 +912,7 @@ dns_rbtnodechain_nextflat(dns_rbtnodechain_t *chain, dns_name_t *name);
} while (0)
#else /* DNS_RBT_USEISCREFCOUNT */
#define dns_rbtnode_refinit(node, n) ((node)->references = (n))
-#define dns_rbtnode_refdestroy(node) (REQUIRE((node)->references == 0))
+#define dns_rbtnode_refdestroy(node) REQUIRE((node)->references == 0)
#define dns_rbtnode_refcurrent(node) ((node)->references)
#define dns_rbtnode_refincrement0(node, refs) \
do { \
diff --git a/contrib/bind9/lib/dns/include/dns/rdata.h b/contrib/bind9/lib/dns/include/dns/rdata.h
index 1674b0c..b70a353 100644
--- a/contrib/bind9/lib/dns/include/dns/rdata.h
+++ b/contrib/bind9/lib/dns/include/dns/rdata.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdata.h,v 1.70.120.3 2009-02-16 00:29:27 marka Exp $ */
+/* $Id: rdata.h,v 1.77 2009-12-04 21:09:33 marka Exp $ */
#ifndef DNS_RDATA_H
#define DNS_RDATA_H 1
@@ -95,6 +95,7 @@
#include <dns/types.h>
#include <dns/name.h>
+#include <dns/message.h>
ISC_LANG_BEGINDECLS
@@ -124,9 +125,27 @@ struct dns_rdata {
#define DNS_RDATA_INIT { NULL, 0, 0, 0, 0, {(void*)(-1), (void *)(-1)}}
+#define DNS_RDATA_CHECKINITIALIZED
+#ifdef DNS_RDATA_CHECKINITIALIZED
+#define DNS_RDATA_INITIALIZED(rdata) \
+ ((rdata)->data == NULL && (rdata)->length == 0 && \
+ (rdata)->rdclass == 0 && (rdata)->type == 0 && (rdata)->flags == 0 && \
+ !ISC_LINK_LINKED((rdata), link))
+#else
+#ifdef ISC_LIST_CHECKINIT
+#define DNS_RDATA_INITIALIZED(rdata) \
+ (!ISC_LINK_LINKED((rdata), link))
+#else
+#define DNS_RDATA_INITIALIZED(rdata) ISC_TRUE
+#endif
+#endif
+
#define DNS_RDATA_UPDATE 0x0001 /*%< update pseudo record. */
#define DNS_RDATA_OFFLINE 0x0002 /*%< RRSIG has a offline key. */
+#define DNS_RDATA_VALIDFLAGS(rdata) \
+ (((rdata)->flags & ~(DNS_RDATA_UPDATE|DNS_RDATA_OFFLINE)) == 0)
+
/*
* Flags affecting rdata formatting style. Flags 0xFFFF0000
* are used by masterfile-level formatting and defined elsewhere.
@@ -201,6 +220,25 @@ dns_rdata_compare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2);
*\li > 0 'rdata1' is greater than 'rdata2'
*/
+int
+dns_rdata_casecompare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2);
+/*%<
+ * dns_rdata_casecompare() is similar to dns_rdata_compare() but also
+ * compares domain names case insensitively in known rdata types that
+ * are treated as opaque data by dns_rdata_compare().
+ *
+ * Requires:
+ *
+ *\li 'rdata1' is a valid, non-empty rdata
+ *
+ *\li 'rdata2' is a valid, non-empty rdata
+ *
+ * Returns:
+ *\li < 0 'rdata1' is less than 'rdata2'
+ *\li 0 'rdata1' is equal to 'rdata2'
+ *\li > 0 'rdata1' is greater than 'rdata2'
+ */
+
/***
*** Conversions
***/
@@ -698,6 +736,21 @@ dns_rdata_checknames(dns_rdata_t *rdata, dns_name_t *owner, dns_name_t *bad);
* 'bad' to be NULL or valid.
*/
+void
+dns_rdata_exists(dns_rdata_t *rdata, dns_rdatatype_t type);
+
+void
+dns_rdata_notexist(dns_rdata_t *rdata, dns_rdatatype_t type);
+
+void
+dns_rdata_deleterrset(dns_rdata_t *rdata, dns_rdatatype_t type);
+
+void
+dns_rdata_makedelete(dns_rdata_t *rdata);
+
+const char *
+dns_rdata_updateop(dns_rdata_t *rdata, dns_section_t section);
+
ISC_LANG_ENDDECLS
#endif /* DNS_RDATA_H */
diff --git a/contrib/bind9/lib/dns/include/dns/rdataset.h b/contrib/bind9/lib/dns/include/dns/rdataset.h
index 9b48209..7f50c12 100644
--- a/contrib/bind9/lib/dns/include/dns/rdataset.h
+++ b/contrib/bind9/lib/dns/include/dns/rdataset.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdataset.h,v 1.65.50.4.6.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: rdataset.h,v 1.69.270.3 2011-06-21 20:15:54 each Exp $ */
#ifndef DNS_RDATASET_H
#define DNS_RDATASET_H 1
@@ -203,6 +203,7 @@ struct dns_rdataset {
#define DNS_RDATASETATTR_RESIGN 0x00040000
#define DNS_RDATASETATTR_CLOSEST 0x00080000
#define DNS_RDATASETATTR_OPTOUT 0x00100000 /*%< OPTOUT proof */
+#define DNS_RDATASETATTR_NEGATIVE 0x00200000
/*%
* _OMITDNSSEC:
diff --git a/contrib/bind9/lib/dns/include/dns/request.h b/contrib/bind9/lib/dns/include/dns/request.h
index 8808c0a..f2db1031b 100644
--- a/contrib/bind9/lib/dns/include/dns/request.h
+++ b/contrib/bind9/lib/dns/include/dns/request.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: request.h,v 1.27.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: request.h,v 1.31 2010-03-04 23:50:34 tbox Exp $ */
#ifndef DNS_REQUEST_H
#define DNS_REQUEST_H 1
@@ -47,6 +47,7 @@
#include <dns/types.h>
#define DNS_REQUESTOPT_TCP 0x00000001U
+#define DNS_REQUESTOPT_CASE 0x00000002U
typedef struct dns_requestevent {
ISC_EVENT_COMMON(struct dns_requestevent);
@@ -175,6 +176,9 @@ dns_request_create(dns_requestmgr_t *requestmgr, dns_message_t *message,
* #DNS_REQUESTOPT_TCP option is set, TCP will be used. The request
* will timeout after 'timeout' seconds.
*
+ *\li If the #DNS_REQUESTOPT_CASE option is set, use case sensitive
+ * compression.
+ *
*\li When the request completes, successfully, due to a timeout, or
* because it was canceled, a completion event will be sent to 'task'.
*
@@ -227,6 +231,9 @@ dns_request_createvia3(dns_requestmgr_t *requestmgr, dns_message_t *message,
* will timeout after 'timeout' seconds. UDP requests will be resent
* at 'udptimeout' intervals if non-zero or 'udpretries' is non-zero.
*
+ *\li If the #DNS_REQUESTOPT_CASE option is set, use case sensitive
+ * compression.
+ *
*\li When the request completes, successfully, due to a timeout, or
* because it was canceled, a completion event will be sent to 'task'.
*
diff --git a/contrib/bind9/lib/dns/include/dns/resolver.h b/contrib/bind9/lib/dns/include/dns/resolver.h
index c9034bf..2db1770 100644
--- a/contrib/bind9/lib/dns/include/dns/resolver.h
+++ b/contrib/bind9/lib/dns/include/dns/resolver.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resolver.h,v 1.60.56.5 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: resolver.h,v 1.67.86.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
#ifndef DNS_RESOLVER_H
#define DNS_RESOLVER_H 1
@@ -81,6 +81,7 @@ typedef struct dns_fetchevent {
dns_fixedname_t foundname;
isc_sockaddr_t * client;
dns_messageid_t id;
+ isc_result_t vresult;
} dns_fetchevent_t;
/*
@@ -179,7 +180,7 @@ dns_resolver_freeze(dns_resolver_t *res);
*
* Requires:
*
- *\li 'res' is a valid, unfrozen resolver.
+ *\li 'res' is a valid resolver.
*
* Ensures:
*
@@ -491,6 +492,27 @@ dns_resolver_setmustbesecure(dns_resolver_t *resolver, dns_name_t *name,
isc_boolean_t
dns_resolver_getmustbesecure(dns_resolver_t *resolver, dns_name_t *name);
+
+void
+dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds);
+/*%<
+ * Set the length of time the resolver will work on a query, in seconds.
+ *
+ * If timeout is 0, the default timeout will be applied.
+ *
+ * Requires:
+ * \li resolver to be valid.
+ */
+
+unsigned int
+dns_resolver_gettimeout(dns_resolver_t *resolver);
+/*%<
+ * Get the current length of time the resolver will work on a query, in seconds.
+ *
+ * Requires:
+ * \li resolver to be valid.
+ */
+
void
dns_resolver_setclientsperquery(dns_resolver_t *resolver,
isc_uint32_t min, isc_uint32_t max);
diff --git a/contrib/bind9/lib/dns/include/dns/result.h b/contrib/bind9/lib/dns/include/dns/result.h
index 74b84d6..adc1215 100644
--- a/contrib/bind9/lib/dns/include/dns/result.h
+++ b/contrib/bind9/lib/dns/include/dns/result.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.h,v 1.116.48.2 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: result.h,v 1.122 2011-01-11 23:47:13 tbox Exp $ */
#ifndef DNS_RESULT_H
#define DNS_RESULT_H 1
@@ -148,10 +148,11 @@
#define DNS_R_MXISADDRESS (ISC_RESULTCLASS_DNS + 102)
#define DNS_R_DUPLICATE (ISC_RESULTCLASS_DNS + 103)
#define DNS_R_INVALIDNSEC3 (ISC_RESULTCLASS_DNS + 104)
-#define DNS_R_NOTMASTER (ISC_RESULTCLASS_DNS + 105)
+#define DNS_R_NOTMASTER (ISC_RESULTCLASS_DNS + 105)
#define DNS_R_BROKENCHAIN (ISC_RESULTCLASS_DNS + 106)
+#define DNS_R_EXPIRED (ISC_RESULTCLASS_DNS + 107)
-#define DNS_R_NRESULTS 107 /*%< Number of results */
+#define DNS_R_NRESULTS 108 /*%< Number of results */
/*
* DNS wire format rcodes.
diff --git a/contrib/bind9/lib/dns/include/dns/rpz.h b/contrib/bind9/lib/dns/include/dns/rpz.h
new file mode 100644
index 0000000..404f517
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/rpz.h
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rpz.h,v 1.3 2011-01-13 04:59:26 tbox Exp $ */
+
+#ifndef DNS_RPZ_H
+#define DNS_RPZ_H 1
+
+#include <isc/lang.h>
+
+#include <dns/fixedname.h>
+#include <dns/rdata.h>
+#include <dns/types.h>
+
+ISC_LANG_BEGINDECLS
+
+#define DNS_RPZ_IP_ZONE "rpz-ip"
+#define DNS_RPZ_NSIP_ZONE "rpz-nsip"
+#define DNS_RPZ_NSDNAME_ZONE "rpz-nsdname"
+
+typedef isc_uint8_t dns_rpz_cidr_bits_t;
+
+typedef enum {
+ DNS_RPZ_TYPE_BAD,
+ DNS_RPZ_TYPE_QNAME,
+ DNS_RPZ_TYPE_IP,
+ DNS_RPZ_TYPE_NSIP,
+ DNS_RPZ_TYPE_NSDNAME
+} dns_rpz_type_t;
+
+/*
+ * Require DNS_RPZ_POLICY_NO_OP < DNS_RPZ_POLICY_NXDOMAIN <
+ * DNS_RPZ_POLICY_NODATA < DNS_RPZ_POLICY_CNAME.
+ */
+typedef enum {
+ DNS_RPZ_POLICY_GIVEN = 0, /* 'given': what something else says */
+ DNS_RPZ_POLICY_NO_OP = 1, /* 'no-op': do not rewrite */
+ DNS_RPZ_POLICY_NXDOMAIN = 2, /* 'nxdomain': answer with NXDOMAIN */
+ DNS_RPZ_POLICY_NODATA = 3, /* 'nodata': answer with ANCOUNT=0 */
+ DNS_RPZ_POLICY_CNAME = 4, /* 'cname x': answer with x's rrsets */
+ DNS_RPZ_POLICY_RECORD = 5,
+ DNS_RPZ_POLICY_MISS,
+ DNS_RPZ_POLICY_ERROR
+} dns_rpz_policy_t;
+
+/*
+ * Specify a response policy zone.
+ */
+typedef struct dns_rpz_zone dns_rpz_zone_t;
+
+struct dns_rpz_zone {
+ ISC_LINK(dns_rpz_zone_t) link;
+ int num;
+ dns_name_t origin; /* Policy zone name */
+ dns_name_t nsdname; /* RPZ_NSDNAME_ZONE.origin */
+ dns_rpz_policy_t policy; /* RPZ_POLICY_GIVEN or override */
+ dns_name_t cname; /* override name for
+ RPZ_POLICY_CNAME */
+};
+
+/*
+ * Radix trees for response policy IP addresses.
+ */
+typedef struct dns_rpz_cidr dns_rpz_cidr_t;
+
+/*
+ * context for finding the best policy
+ */
+typedef struct {
+ unsigned int state;
+# define DNS_RPZ_REWRITTEN 0x0001
+# define DNS_RPZ_DONE_QNAME 0x0002
+# define DNS_RPZ_DONE_A 0x0004
+# define DNS_RPZ_RECURSING 0x0008
+# define DNS_RPZ_HAVE_IP 0x0010
+# define DNS_RPZ_HAVE_NSIPv4 0x0020
+# define DNS_RPZ_HAVE_NSIPv6 0x0040
+# define DNS_RPZ_HAD_NSDNAME 0x0080
+ /*
+ * Best match so far.
+ */
+ struct {
+ dns_rpz_type_t type;
+ dns_rpz_zone_t *rpz;
+ dns_rpz_cidr_bits_t prefix;
+ dns_rpz_policy_t policy;
+ dns_ttl_t ttl;
+ isc_result_t result;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_dbnode_t *node;
+ dns_rdataset_t *rdataset;
+ } m;
+ /*
+ * State for chasing NS names and addresses including recursion.
+ */
+ struct {
+ unsigned int label;
+ dns_db_t *db;
+ dns_rdataset_t *ns_rdataset;
+ dns_rdatatype_t r_type;
+ isc_result_t r_result;
+ dns_rdataset_t *r_rdataset;
+ } ns;
+ /*
+ * State of real query while recursing for NSIP or NSDNAME.
+ */
+ struct {
+ isc_result_t result;
+ isc_boolean_t is_zone;
+ isc_boolean_t authoritative;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_dbnode_t *node;
+ dns_rdataset_t *rdataset;
+ dns_rdataset_t *sigrdataset;
+ dns_rdatatype_t qtype;
+ } q;
+ dns_name_t *qname;
+ dns_name_t *r_name;
+ dns_name_t *fname;
+ dns_fixedname_t _qnamef;
+ dns_fixedname_t _r_namef;
+ dns_fixedname_t _fnamef;
+} dns_rpz_st_t;
+
+#define DNS_RPZ_TTL_DEFAULT 5
+
+/*
+ * So various response policy zone messages can be turned up or down.
+ */
+#define DNS_RPZ_ERROR_LEVEL ISC_LOG_WARNING
+#define DNS_RPZ_INFO_LEVEL ISC_LOG_INFO
+#define DNS_RPZ_DEBUG_LEVEL1 ISC_LOG_DEBUG(1)
+#define DNS_RPZ_DEBUG_LEVEL2 ISC_LOG_DEBUG(2)
+
+const char *
+dns_rpz_type2str(dns_rpz_type_t type);
+
+dns_rpz_policy_t
+dns_rpz_str2policy(const char *str);
+
+void
+dns_rpz_set_need(isc_boolean_t need);
+
+isc_boolean_t
+dns_rpz_needed(void);
+
+void
+dns_rpz_cidr_free(dns_rpz_cidr_t **cidr);
+
+void
+dns_rpz_view_destroy(dns_view_t *view);
+
+isc_result_t
+dns_rpz_new_cidr(isc_mem_t *mctx, dns_name_t *origin,
+ dns_rpz_cidr_t **rbtdb_cidr);
+void
+dns_rpz_enabled(dns_rpz_cidr_t *cidr, dns_rpz_st_t *st);
+
+void
+dns_rpz_cidr_deleteip(dns_rpz_cidr_t *cidr, dns_name_t *name);
+
+void
+dns_rpz_cidr_addip(dns_rpz_cidr_t *cidr, dns_name_t *name);
+
+isc_result_t
+dns_rpz_cidr_find(dns_rpz_cidr_t *cidr, const isc_netaddr_t *netaddr,
+ dns_rpz_type_t type, dns_name_t *canon_name,
+ dns_name_t *search_name, dns_rpz_cidr_bits_t *prefix);
+
+dns_rpz_policy_t
+dns_rpz_decode_cname(dns_rdataset_t *, dns_name_t *selfname);
+
+#endif /* DNS_RPZ_H */
+
diff --git a/contrib/bind9/lib/dns/include/dns/rriterator.h b/contrib/bind9/lib/dns/include/dns/rriterator.h
new file mode 100644
index 0000000..0087349
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/rriterator.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rriterator.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+#ifndef DNS_RRITERATOR_H
+#define DNS_RRITERATOR_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file dns/rriterator.h
+ * \brief
+ * Functions for "walking" a zone database, visiting each RR or RRset in turn.
+ */
+
+/*****
+ ***** Imports
+ *****/
+
+#include <isc/lang.h>
+#include <isc/magic.h>
+#include <isc/ondestroy.h>
+#include <isc/stdtime.h>
+
+#include <dns/db.h>
+#include <dns/dbiterator.h>
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
+#include <dns/types.h>
+
+ISC_LANG_BEGINDECLS
+
+/*****
+ ***** Types
+ *****/
+
+/*%
+ * A dns_rriterator_t is an iterator that iterates over an entire database,
+ * returning one RR at a time, in some arbitrary order.
+ */
+
+typedef struct dns_rriterator {
+ unsigned int magic;
+ isc_result_t result;
+ dns_db_t *db;
+ dns_dbiterator_t *dbit;
+ dns_dbversion_t *ver;
+ isc_stdtime_t now;
+ dns_dbnode_t *node;
+ dns_fixedname_t fixedname;
+ dns_rdatasetiter_t *rdatasetit;
+ dns_rdataset_t rdataset;
+ dns_rdata_t rdata;
+} dns_rriterator_t;
+
+#define RRITERATOR_MAGIC ISC_MAGIC('R', 'R', 'I', 't')
+#define VALID_RRITERATOR(m) ISC_MAGIC_VALID(m, RRITERATOR_MAGIC)
+
+isc_result_t
+dns_rriterator_init(dns_rriterator_t *it, dns_db_t *db,
+ dns_dbversion_t *ver, isc_stdtime_t now);
+
+isc_result_t
+dns_rriterator_first(dns_rriterator_t *it);
+
+isc_result_t
+dns_rriterator_nextrrset(dns_rriterator_t *it);
+
+isc_result_t
+dns_rriterator_next(dns_rriterator_t *it);
+
+void
+dns_rriterator_current(dns_rriterator_t *it, dns_name_t **name,
+ isc_uint32_t *ttl, dns_rdataset_t **rdataset,
+ dns_rdata_t **rdata);
+
+void
+dns_rriterator_pause(dns_rriterator_t *it);
+
+void
+dns_rriterator_destroy(dns_rriterator_t *it);
+
+ISC_LANG_ENDDECLS
+
+#endif /* DNS_RRITERATOR_H */
diff --git a/contrib/bind9/lib/dns/include/dns/sdb.h b/contrib/bind9/lib/dns/include/dns/sdb.h
index 18995ed..5744837 100644
--- a/contrib/bind9/lib/dns/include/dns/sdb.h
+++ b/contrib/bind9/lib/dns/include/dns/sdb.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdb.h,v 1.21.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: sdb.h,v 1.23 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_SDB_H
#define DNS_SDB_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/sdlz.h b/contrib/bind9/lib/dns/include/dns/sdlz.h
index 9d2a0ed..b917cc0 100644
--- a/contrib/bind9/lib/dns/include/dns/sdlz.h
+++ b/contrib/bind9/lib/dns/include/dns/sdlz.h
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdlz.h,v 1.7.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: sdlz.h,v 1.14 2011-01-13 08:50:29 tbox Exp $ */
/*! \file dns/sdlz.h */
@@ -74,11 +74,10 @@ typedef struct dns_sdlzlookup dns_sdlzlookup_t;
/* A simple DLZ database traversal in progress. */
typedef struct dns_sdlzallnodes dns_sdlzallnodes_t;
-
-typedef isc_result_t
-(*dns_sdlzallnodesfunc_t)(const char *zone, void *driverarg, void *dbdata,
- dns_sdlzallnodes_t *allnodes);
-
+typedef isc_result_t (*dns_sdlzallnodesfunc_t)(const char *zone,
+ void *driverarg,
+ void *dbdata,
+ dns_sdlzallnodes_t *allnodes);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
* supply an all nodes method. This method is called when the DNS
@@ -92,9 +91,9 @@ typedef isc_result_t
* does not have to implement an all nodes method.
*/
-typedef isc_result_t
-(*dns_sdlzallowzonexfr_t)(void *driverarg, void *dbdata, const char *name,
- const char *client);
+typedef isc_result_t (*dns_sdlzallowzonexfr_t)(void *driverarg,
+ void *dbdata, const char *name,
+ const char *client);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -117,9 +116,9 @@ typedef isc_result_t
* error.
*/
-typedef isc_result_t
-(*dns_sdlzauthorityfunc_t)(const char *zone, void *driverarg, void *dbdata,
- dns_sdlzlookup_t *lookup);
+typedef isc_result_t (*dns_sdlzauthorityfunc_t)(const char *zone,
+ void *driverarg, void *dbdata,
+ dns_sdlzlookup_t *lookup);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -131,9 +130,9 @@ typedef isc_result_t
* method.
*/
-typedef isc_result_t
-(*dns_sdlzcreate_t)(const char *dlzname, unsigned int argc, char *argv[],
- void *driverarg, void **dbdata);
+typedef isc_result_t (*dns_sdlzcreate_t)(const char *dlzname,
+ unsigned int argc, char *argv[],
+ void *driverarg, void **dbdata);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -142,8 +141,7 @@ typedef isc_result_t
* does not have to implement a create method.
*/
-typedef void
-(*dns_sdlzdestroy_t)(void *driverarg, void *dbdata);
+typedef void (*dns_sdlzdestroy_t)(void *driverarg, void *dbdata);
/*%<
* Method prototype. Drivers implementing the SDLZ interface may
@@ -198,6 +196,87 @@ typedef isc_result_t
* lookup method.
*/
+typedef isc_result_t (*dns_sdlznewversion_t)(const char *zone,
+ void *driverarg, void *dbdata,
+ void **versionp);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a newversion method. This method is called to start a
+ * write transaction on a zone and should only be implemented by
+ * writeable backends.
+ * When implemented, the driver should create a new transaction, and
+ * fill *versionp with a pointer to the transaction state. The
+ * closeversion function will be called to close the transaction.
+ */
+
+typedef void (*dns_sdlzcloseversion_t)(const char *zone, isc_boolean_t commit,
+ void *driverarg, void *dbdata,
+ void **versionp);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface must
+ * supply a closeversion method if they supply a newversion method.
+ * When implemented, the driver should close the given transaction,
+ * committing changes if 'commit' is ISC_TRUE. If 'commit' is not true
+ * then all changes should be discarded and the database rolled back.
+ * If the call is successful then *versionp should be set to NULL
+ */
+
+typedef isc_result_t (*dns_sdlzconfigure_t)(dns_view_t *view, void *driverarg,
+ void *dbdata);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a configure method. When supplied, it will be called
+ * immediately after the create method to give the driver a chance
+ * to configure writeable zones
+ */
+
+
+typedef isc_boolean_t (*dns_sdlzssumatch_t)(const char *signer,
+ const char *name,
+ const char *tcpaddr,
+ const char *type,
+ const char *key,
+ isc_uint32_t keydatalen,
+ unsigned char *keydata,
+ void *driverarg,
+ void *dbdata);
+
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a ssumatch method. If supplied, then ssumatch will be
+ * called to authorize any zone updates. The driver should return
+ * ISC_TRUE to allow the update, and ISC_FALSE to deny it. For a DLZ
+ * controlled zone, this is the only access control on updates.
+ */
+
+
+typedef isc_result_t (*dns_sdlzmodrdataset_t)(const char *name,
+ const char *rdatastr,
+ void *driverarg, void *dbdata,
+ void *version);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply addrdataset and subtractrdataset methods. If supplied, then these
+ * will be called when rdatasets are added/subtracted during
+ * updates. The version parameter comes from a call to the sdlz
+ * newversion() method from the driver. The rdataset parameter is a
+ * linearise string representation of the rdataset change. The format
+ * is the same as used by dig when displaying records. The fields are
+ * tab delimited.
+ */
+
+typedef isc_result_t (*dns_sdlzdelrdataset_t)(const char *name,
+ const char *type,
+ void *driverarg, void *dbdata,
+ void *version);
+/*%<
+ * Method prototype. Drivers implementing the SDLZ interface may
+ * supply a delrdataset method. If supplied, then this
+ * function will be called when rdatasets are deleted during
+ * updates. The call should remove all rdatasets of the given type for
+ * the specified name.
+ */
+
typedef struct dns_sdlzmethods {
dns_sdlzcreate_t create;
dns_sdlzdestroy_t destroy;
@@ -206,6 +285,13 @@ typedef struct dns_sdlzmethods {
dns_sdlzauthorityfunc_t authority;
dns_sdlzallnodesfunc_t allnodes;
dns_sdlzallowzonexfr_t allowzonexfr;
+ dns_sdlznewversion_t newversion;
+ dns_sdlzcloseversion_t closeversion;
+ dns_sdlzconfigure_t configure;
+ dns_sdlzssumatch_t ssumatch;
+ dns_sdlzmodrdataset_t addrdataset;
+ dns_sdlzmodrdataset_t subtractrdataset;
+ dns_sdlzdelrdataset_t delrdataset;
} dns_sdlzmethods_t;
isc_result_t
@@ -261,6 +347,14 @@ dns_sdlz_putsoa(dns_sdlzlookup_t *lookup, const char *mname, const char *rname,
*/
+isc_result_t
+dns_sdlz_setdb(dns_dlzdb_t *dlzdatabase, dns_rdataclass_t rdclass,
+ dns_name_t *name, dns_db_t **dbp);
+/*%<
+ * Create the database pointers for a writeable SDLZ zone
+ */
+
+
ISC_LANG_ENDDECLS
#endif /* SDLZ_H */
diff --git a/contrib/bind9/lib/dns/include/dns/secalg.h b/contrib/bind9/lib/dns/include/dns/secalg.h
index 0eb0333..49613d5 100644
--- a/contrib/bind9/lib/dns/include/dns/secalg.h
+++ b/contrib/bind9/lib/dns/include/dns/secalg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: secalg.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: secalg.h,v 1.21 2009-10-12 23:48:02 tbox Exp $ */
#ifndef DNS_SECALG_H
#define DNS_SECALG_H 1
@@ -66,6 +66,13 @@ dns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target);
*\li ISC_R_NOSPACE target buffer is too small
*/
+#define DNS_SECALG_FORMATSIZE 20
+void
+dns_secalg_format(dns_secalg_t alg, char *cp, unsigned int size);
+/*%<
+ * Wrapper for dns_secalg_totext(), writing text into 'cp'
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_SECALG_H */
diff --git a/contrib/bind9/lib/dns/include/dns/soa.h b/contrib/bind9/lib/dns/include/dns/soa.h
index c1ad706..6ebf61d 100644
--- a/contrib/bind9/lib/dns/include/dns/soa.h
+++ b/contrib/bind9/lib/dns/include/dns/soa.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: soa.h,v 1.9 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: soa.h,v 1.12 2009-09-10 01:47:09 each Exp $ */
#ifndef DNS_SOA_H
#define DNS_SOA_H 1
@@ -40,6 +40,28 @@
ISC_LANG_BEGINDECLS
+#define DNS_SOA_BUFFERSIZE ((2 * DNS_NAME_MAXWIRE) + (4 * 5))
+
+isc_result_t
+dns_soa_buildrdata(dns_name_t *origin, dns_name_t *contact,
+ dns_rdataclass_t rdclass,
+ isc_uint32_t serial, isc_uint32_t refresh,
+ isc_uint32_t retry, isc_uint32_t expire,
+ isc_uint32_t minimum, unsigned char *buffer,
+ dns_rdata_t *rdata);
+/*%<
+ * Build the rdata of an SOA record.
+ *
+ * Requires:
+ *\li buffer Points to a temporary buffer of at least
+ * DNS_SOA_BUFFERSIZE bytes.
+ *\li rdata Points to an initialized dns_rdata_t.
+ *
+ * Ensures:
+ * \li *rdata Contains a valid SOA rdata. The 'data' member
+ * refers to 'buffer'.
+ */
+
isc_uint32_t
dns_soa_getserial(dns_rdata_t *rdata);
isc_uint32_t
diff --git a/contrib/bind9/lib/dns/include/dns/ssu.h b/contrib/bind9/lib/dns/include/dns/ssu.h
index 686928b..5d6c178 100644
--- a/contrib/bind9/lib/dns/include/dns/ssu.h
+++ b/contrib/bind9/lib/dns/include/dns/ssu.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ssu.h,v 1.24 2008-01-18 23:46:58 tbox Exp $ */
+/* $Id: ssu.h,v 1.28 2011-01-06 23:47:00 tbox Exp $ */
#ifndef DNS_SSU_H
#define DNS_SSU_H 1
@@ -25,6 +25,7 @@
#include <isc/lang.h>
#include <dns/types.h>
+#include <dst/dst.h>
ISC_LANG_BEGINDECLS
@@ -40,7 +41,9 @@ ISC_LANG_BEGINDECLS
#define DNS_SSUMATCHTYPE_SUBDOMAINKRB5 9
#define DNS_SSUMATCHTYPE_TCPSELF 10
#define DNS_SSUMATCHTYPE_6TO4SELF 11
-#define DNS_SSUMATCHTYPE_MAX 11 /* max value */
+#define DNS_SSUMATCHTYPE_EXTERNAL 12
+#define DNS_SSUMATCHTYPE_DLZ 13
+#define DNS_SSUMATCHTYPE_MAX 12 /* max value */
isc_result_t
dns_ssutable_create(isc_mem_t *mctx, dns_ssutable_t **table);
@@ -57,6 +60,16 @@ dns_ssutable_create(isc_mem_t *mctx, dns_ssutable_t **table);
*\li ISC_R_NOMEMORY
*/
+isc_result_t
+dns_ssutable_createdlz(isc_mem_t *mctx, dns_ssutable_t **tablep,
+ dns_dlzdb_t *dlzdatabase);
+/*%<
+ * Create an SSU table that contains a dlzdatabase pointer, and a
+ * single rule with matchtype DNS_SSUMATCHTYPE_DLZ. This type of SSU
+ * table is used by writeable DLZ drivers to offload authorization for
+ * updates to the driver.
+ */
+
void
dns_ssutable_attach(dns_ssutable_t *source, dns_ssutable_t **targetp);
/*%<
@@ -120,7 +133,7 @@ dns_ssutable_addrule(dns_ssutable_t *table, isc_boolean_t grant,
isc_boolean_t
dns_ssutable_checkrules(dns_ssutable_t *table, dns_name_t *signer,
dns_name_t *name, isc_netaddr_t *tcpaddr,
- dns_rdatatype_t type);
+ dns_rdatatype_t type, const dst_key_t *key);
/*%<
* Checks that the attempted update of (name, type) is allowed according
* to the rules specified in the simple-secure-update rule table. If
@@ -184,6 +197,16 @@ isc_result_t dns_ssutable_nextrule(dns_ssurule_t *rule,
*\li #ISC_R_NOMORE
*/
+
+/*%<
+ * Check a policy rule via an external application
+ */
+isc_boolean_t
+dns_ssu_external_match(dns_name_t *identity, dns_name_t *signer,
+ dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key,
+ isc_mem_t *mctx);
+
ISC_LANG_ENDDECLS
#endif /* DNS_SSU_H */
diff --git a/contrib/bind9/lib/dns/include/dns/stats.h b/contrib/bind9/lib/dns/include/dns/stats.h
index 853c1e9..c19b0c7 100644
--- a/contrib/bind9/lib/dns/include/dns/stats.h
+++ b/contrib/bind9/lib/dns/include/dns/stats.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.h,v 1.18.56.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.h,v 1.20 2009-01-27 23:47:54 tbox Exp $ */
#ifndef DNS_STATS_H
#define DNS_STATS_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/tkey.h b/contrib/bind9/lib/dns/include/dns/tkey.h
index cb1fe0e..f9e34f8 100644
--- a/contrib/bind9/lib/dns/include/dns/tkey.h
+++ b/contrib/bind9/lib/dns/include/dns/tkey.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tkey.h,v 1.26.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: tkey.h,v 1.32 2011-01-08 23:47:01 tbox Exp $ */
#ifndef DNS_TKEY_H
#define DNS_TKEY_H 1
@@ -44,6 +44,7 @@ struct dns_tkeyctx {
gss_cred_id_t gsscred;
isc_mem_t *mctx;
isc_entropy_t *ectx;
+ char *gssapi_keytab;
};
isc_result_t
@@ -123,7 +124,8 @@ dns_tkey_builddhquery(dns_message_t *msg, dst_key_t *key, dns_name_t *name,
isc_result_t
dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
isc_buffer_t *intoken, isc_uint32_t lifetime,
- gss_ctx_id_t *context, isc_boolean_t win2k);
+ gss_ctx_id_t *context, isc_boolean_t win2k,
+ isc_mem_t *mctx, char **err_message);
/*%<
* Builds a query containing a TKEY that will generate a GSSAPI context.
* The key is requested to have the specified lifetime (in seconds).
@@ -141,6 +143,7 @@ dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
*\li ISC_R_SUCCESS msg was successfully updated to include the
* query to be sent
*\li other an error occurred while building the message
+ *\li *err_message optional error message
*/
@@ -187,7 +190,7 @@ isc_result_t
dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *gname, gss_ctx_id_t *context,
isc_buffer_t *outtoken, dns_tsigkey_t **outkey,
- dns_tsig_keyring_t *ring);
+ dns_tsig_keyring_t *ring, char **err_message);
/*%<
* XXX
*/
@@ -211,12 +214,11 @@ dns_tkey_processdeleteresponse(dns_message_t *qmsg, dns_message_t *rmsg,
* component of the query or response
*/
-
isc_result_t
dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *server, gss_ctx_id_t *context,
dns_tsigkey_t **outkey, dns_tsig_keyring_t *ring,
- isc_boolean_t win2k);
+ isc_boolean_t win2k, char **err_message);
/*
* Client side negotiation of GSS-TSIG. Process the response
diff --git a/contrib/bind9/lib/dns/include/dns/tsec.h b/contrib/bind9/lib/dns/include/dns/tsec.h
new file mode 100644
index 0000000..698634e
--- /dev/null
+++ b/contrib/bind9/lib/dns/include/dns/tsec.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: tsec.h,v 1.6 2010-12-09 00:54:34 marka Exp $ */
+
+#ifndef DNS_TSEC_H
+#define DNS_TSEC_H 1
+
+/*****
+ ***** Module Info
+ *****/
+
+/*! \file
+ *
+ * \brief
+ * The TSEC (Transaction Security) module is an abstraction layer for managing
+ * DNS transaction mechanisms such as TSIG or SIG(0). A TSEC structure is a
+ * mechanism-independent object containing key information specific to the
+ * mechanism, and is expected to be used as an argument to other modules
+ * that use transaction security in a mechanism-independent manner.
+ *
+ * MP:
+ *\li A TSEC structure is expected to be thread-specific. No inter-thread
+ * synchronization is ensured in multiple access to a single TSEC
+ * structure.
+ *
+ * Resources:
+ *\li TBS
+ *
+ * Security:
+ *\li This module does not handle any low-level data directly, and so no
+ * security issue specific to this module is anticipated.
+ */
+
+#include <dns/types.h>
+
+#include <dst/dst.h>
+
+ISC_LANG_BEGINDECLS
+
+/***
+ *** Types
+ ***/
+
+/*%
+ * Transaction security types.
+ */
+typedef enum {
+ dns_tsectype_none,
+ dns_tsectype_tsig,
+ dns_tsectype_sig0
+} dns_tsectype_t;
+
+isc_result_t
+dns_tsec_create(isc_mem_t *mctx, dns_tsectype_t type, dst_key_t *key,
+ dns_tsec_t **tsecp);
+/*%<
+ * Create a TSEC structure and stores a type-dependent key structure in it.
+ * For a TSIG key (type is dns_tsectype_tsig), dns_tsec_create() creates a
+ * TSIG key structure from '*key' and keeps it in the structure. For other
+ * types, this function simply retains '*key' in the structure. In either
+ * case, the ownership of '*key' is transferred to the TSEC module; the caller
+ * must not modify or destroy it after the call to dns_tsec_create().
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'type' is a valid value of dns_tsectype_t (see above).
+ *
+ *\li 'key' is a valid key.
+ *
+ *\li tsecp != NULL && *tsecp == NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS On success.
+ *
+ *\li Anything else Failure.
+ */
+
+void
+dns_tsec_destroy(dns_tsec_t **tsecp);
+/*%<
+ * Destroy the TSEC structure. The stored key is also detached or destroyed.
+ *
+ * Requires
+ *
+ *\li '*tsecp' is a valid TSEC structure.
+ *
+ * Ensures
+ *
+ *\li *tsecp == NULL.
+ *
+ */
+
+dns_tsectype_t
+dns_tsec_gettype(dns_tsec_t *tsec);
+/*%<
+ * Return the TSEC type of '*tsec'.
+ *
+ * Requires
+ *
+ *\li 'tsec' is a valid TSEC structure.
+ *
+ */
+
+void
+dns_tsec_getkey(dns_tsec_t *tsec, void *keyp);
+/*%<
+ * Return the TSEC key of '*tsec' in '*keyp'.
+ *
+ * Requires
+ *
+ *\li keyp != NULL
+ *
+ * Ensures
+ *
+ *\li *tsecp points to a valid key structure depending on the TSEC type.
+ */
+
+#endif /* DNS_TSEC_H */
diff --git a/contrib/bind9/lib/dns/include/dns/tsig.h b/contrib/bind9/lib/dns/include/dns/tsig.h
index 5161fb3..ef9423b 100644
--- a/contrib/bind9/lib/dns/include/dns/tsig.h
+++ b/contrib/bind9/lib/dns/include/dns/tsig.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsig.h,v 1.51.332.4 2010-12-09 01:12:55 marka Exp $ */
+/* $Id: tsig.h,v 1.59 2011-01-11 23:47:13 tbox Exp $ */
#ifndef DNS_TSIG_H
#define DNS_TSIG_H 1
@@ -25,6 +25,7 @@
#include <isc/lang.h>
#include <isc/refcount.h>
#include <isc/rwlock.h>
+#include <isc/stdio.h>
#include <isc/stdtime.h>
#include <dns/types.h>
@@ -69,6 +70,7 @@ struct dns_tsig_keyring {
unsigned int generated;
unsigned int maxgenerated;
ISC_LIST(dns_tsigkey_t) lru;
+ unsigned int references;
};
struct dns_tsigkey {
@@ -253,9 +255,30 @@ dns_tsigkeyring_create(isc_mem_t *mctx, dns_tsig_keyring_t **ringp);
*\li #ISC_R_NOMEMORY
*/
+isc_result_t
+dns_tsigkeyring_add(dns_tsig_keyring_t *ring, dns_name_t *name,
+ dns_tsigkey_t *tkey);
+/*%<
+ * Place a TSIG key onto a key ring.
+ *
+ * Requires:
+ *\li 'ring', 'name' and 'tkey' are not NULL
+ *
+ * Returns:
+ *\li #ISC_R_SUCCESS
+ *\li Any other value indicates failure.
+ */
+
+
+void
+dns_tsigkeyring_attach(dns_tsig_keyring_t *source, dns_tsig_keyring_t **target);
void
-dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp);
+dns_tsigkeyring_detach(dns_tsig_keyring_t **ringp);
+
+isc_result_t
+dns_tsigkeyring_dumpanddetach(dns_tsig_keyring_t **ringp, FILE *fp);
+
/*%<
* Destroy a TSIG key ring.
*
@@ -263,6 +286,9 @@ dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp);
*\li 'ringp' is not NULL
*/
+void
+dns_keyring_restore(dns_tsig_keyring_t *ring, FILE *fp);
+
ISC_LANG_ENDDECLS
#endif /* DNS_TSIG_H */
diff --git a/contrib/bind9/lib/dns/include/dns/types.h b/contrib/bind9/lib/dns/include/dns/types.h
index 4e4c195..dc02c86 100644
--- a/contrib/bind9/lib/dns/include/dns/types.h
+++ b/contrib/bind9/lib/dns/include/dns/types.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.130.50.7 2010-05-14 23:47:50 tbox Exp $ */
+/* $Id: types.h,v 1.143 2010-12-08 02:46:16 marka Exp $ */
#ifndef DNS_TYPES_H
#define DNS_TYPES_H 1
@@ -44,6 +44,10 @@ typedef struct dns_adbentry dns_adbentry_t;
typedef struct dns_adbfind dns_adbfind_t;
typedef ISC_LIST(dns_adbfind_t) dns_adbfindlist_t;
typedef struct dns_byaddr dns_byaddr_t;
+typedef struct dns_client dns_client_t;
+typedef void dns_clientrestrans_t;
+typedef void dns_clientreqtrans_t;
+typedef void dns_clientupdatetrans_t;
typedef struct dns_cache dns_cache_t;
typedef isc_uint16_t dns_cert_t;
typedef struct dns_compress dns_compress_t;
@@ -63,6 +67,10 @@ typedef struct dns_dispatchevent dns_dispatchevent_t;
typedef struct dns_dispatchlist dns_dispatchlist_t;
typedef struct dns_dispatchmgr dns_dispatchmgr_t;
typedef struct dns_dispentry dns_dispentry_t;
+typedef struct dns_dns64 dns_dns64_t;
+typedef ISC_LIST(dns_dns64_t) dns_dns64list_t;
+typedef struct dns_dnsseckey dns_dnsseckey_t;
+typedef ISC_LIST(dns_dnsseckey_t) dns_dnsseckeylist_t;
typedef struct dns_dumpctx dns_dumpctx_t;
typedef struct dns_fetch dns_fetch_t;
typedef struct dns_fixedname dns_fixedname_t;
@@ -72,6 +80,7 @@ typedef struct dns_iptable dns_iptable_t;
typedef isc_uint32_t dns_iterations_t;
typedef isc_uint16_t dns_keyflags_t;
typedef struct dns_keynode dns_keynode_t;
+typedef ISC_LIST(dns_keynode_t) dns_keynodelist_t;
typedef struct dns_keytable dns_keytable_t;
typedef isc_uint16_t dns_keytag_t;
typedef struct dns_loadctx dns_loadctx_t;
@@ -111,6 +120,7 @@ typedef struct dns_stats dns_stats_t;
typedef isc_uint32_t dns_rdatastatstype_t;
typedef struct dns_tkeyctx dns_tkeyctx_t;
typedef isc_uint16_t dns_trust_t;
+typedef struct dns_tsec dns_tsec_t;
typedef struct dns_tsig_keyring dns_tsig_keyring_t;
typedef struct dns_tsigkey dns_tsigkey_t;
typedef isc_uint32_t dns_ttl_t;
@@ -179,6 +189,12 @@ typedef enum {
dns_masterformat_raw = 2
} dns_masterformat_t;
+typedef enum {
+ dns_v4_aaaa_ok = 0,
+ dns_v4_aaaa_filter = 1,
+ dns_v4_aaaa_break_dnssec = 2
+} dns_v4_aaaa_t;
+
/*
* These are generated by gen.c.
*/
diff --git a/contrib/bind9/lib/dns/include/dns/validator.h b/contrib/bind9/lib/dns/include/dns/validator.h
index fb5b834..5fec135 100644
--- a/contrib/bind9/lib/dns/include/dns/validator.h
+++ b/contrib/bind9/lib/dns/include/dns/validator.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: validator.h,v 1.41.48.5 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: validator.h,v 1.46 2010-02-25 05:08:01 tbox Exp $ */
#ifndef DNS_VALIDATOR_H
#define DNS_VALIDATOR_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/view.h b/contrib/bind9/lib/dns/include/dns/view.h
index ec96d4c..4b24023 100644
--- a/contrib/bind9/lib/dns/include/dns/view.h
+++ b/contrib/bind9/lib/dns/include/dns/view.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: view.h,v 1.111.88.6 2010-09-24 08:30:28 tbox Exp $ */
+/* $Id: view.h,v 1.132 2011-01-13 01:59:28 marka Exp $ */
#ifndef DNS_VIEW_H
#define DNS_VIEW_H 1
@@ -73,6 +73,8 @@
#include <dns/acl.h>
#include <dns/fixedname.h>
+#include <dns/rdatastruct.h>
+#include <dns/rpz.h>
#include <dns/types.h>
ISC_LANG_BEGINDECLS
@@ -92,8 +94,13 @@ struct dns_view {
dns_cache_t * cache;
dns_db_t * cachedb;
dns_db_t * hints;
- dns_keytable_t * secroots;
- dns_keytable_t * trustedkeys;
+
+ /*
+ * security roots.
+ * internal use only; access via * dns_view_getsecroots()
+ */
+ dns_keytable_t * secroots_priv;
+
isc_mutex_t lock;
isc_boolean_t frozen;
isc_task_t * task;
@@ -102,6 +109,7 @@ struct dns_view {
isc_event_t reqevent;
isc_stats_t * resstats;
dns_stats_t * resquerystats;
+ isc_boolean_t cacheshared;
/* Configurable data. */
dns_tsig_keyring_t * statickeys;
@@ -129,6 +137,10 @@ struct dns_view {
dns_acl_t * transferacl;
dns_acl_t * updateacl;
dns_acl_t * upfwdacl;
+ dns_acl_t * denyansweracl;
+ dns_rbt_t * answeracl_exclude;
+ dns_rbt_t * denyanswernames;
+ dns_rbt_t * answernames_exclude;
isc_boolean_t requestixfr;
isc_boolean_t provideixfr;
isc_boolean_t requestnsid;
@@ -145,6 +157,11 @@ struct dns_view {
dns_name_t * dlv;
dns_fixedname_t dlv_fixed;
isc_uint16_t maxudp;
+ dns_v4_aaaa_t v4_aaaa;
+ dns_acl_t * v4_aaaa_acl;
+ dns_dns64list_t dns64;
+ unsigned int dns64cnt;
+ ISC_LIST(dns_rpz_zone_t) rpz_zones;
/*
* Configurable data for server use only,
@@ -162,6 +179,17 @@ struct dns_view {
unsigned int attributes;
/* Under owner's locking control. */
ISC_LINK(struct dns_view) link;
+ dns_viewlist_t * viewlist;
+
+ dns_zone_t * managed_keys;
+
+#ifdef BIND9
+ /* File in which to store configuration for newly added zones */
+ char * new_zone_file;
+
+ void * new_zone_config;
+ void (*cfg_destroy)(void **);
+#endif
};
#define DNS_VIEW_MAGIC ISC_MAGIC('V','i','e','w')
@@ -310,8 +338,12 @@ dns_view_createresolver(dns_view_t *view,
void
dns_view_setcache(dns_view_t *view, dns_cache_t *cache);
+void
+dns_view_setcache2(dns_view_t *view, dns_cache_t *cache, isc_boolean_t shared);
/*%<
- * Set the view's cache database.
+ * Set the view's cache database. If 'shared' is true, this means the cache
+ * is created by another view and is shared with that view. dns_view_setcache()
+ * is a backward compatible version equivalent to setcache2(..., ISC_FALSE).
*
* Requires:
*
@@ -346,6 +378,8 @@ dns_view_sethints(dns_view_t *view, dns_db_t *hints);
void
dns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring);
+void
+dns_view_setdynamickeyring(dns_view_t *view, dns_tsig_keyring_t *ring);
/*%<
* Set the view's static TSIG keys
*
@@ -362,6 +396,15 @@ dns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring);
*/
void
+dns_view_getdynamickeyring(dns_view_t *view, dns_tsig_keyring_t **ringp);
+/*%<
+ * Return the views dynamic keys.
+ *
+ * \li 'view' is a valid, unfrozen view.
+ * \li 'ringp' != NULL && ringp == NULL.
+ */
+
+void
dns_view_setdstport(dns_view_t *view, in_port_t dstport);
/*%<
* Set the view's destination port. This is the port to
@@ -398,7 +441,7 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone);
void
dns_view_freeze(dns_view_t *view);
/*%<
- * Freeze view.
+ * Freeze view. No changes can be made to view configuration while frozen.
*
* Requires:
*
@@ -409,14 +452,44 @@ dns_view_freeze(dns_view_t *view);
*\li 'view' is frozen.
*/
+void
+dns_view_thaw(dns_view_t *view);
+/*%<
+ * Thaw view. This allows zones to be added or removed at runtime. This is
+ * NOT thread-safe; the caller MUST have run isc_task_exclusive() prior to
+ * thawing the view.
+ *
+ * Requires:
+ *
+ *\li 'view' is a valid, frozen view.
+ *
+ * Ensures:
+ *
+ *\li 'view' is no longer frozen.
+ */
isc_result_t
dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
isc_stdtime_t now, unsigned int options, isc_boolean_t use_hints,
dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset);
+isc_result_t
+dns_view_find2(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
+ isc_stdtime_t now, unsigned int options,
+ isc_boolean_t use_hints, isc_boolean_t use_static_stub,
+ dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset);
/*%<
* Find an rdataset whose owner name is 'name', and whose type is
* 'type'.
+ * In general, this function first searches view's zone and cache DBs for the
+ * best match data against 'name'. If nothing found there, and if 'use_hints'
+ * is ISC_TRUE, the view's hint DB (if configured) is searched.
+ * If the view is configured with a static-stub zone which gives the longest
+ * match for 'name' among the zones, however, the cache DB is not consulted
+ * unless 'use_static_stub' is ISC_FALSE (see below about this argument).
+ *
+ * dns_view_find() is a backward compatible version equivalent to
+ * dns_view_find2() with use_static_stub argument being ISC_FALSE.
*
* Notes:
*
@@ -432,6 +505,23 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
* in the hints database but not the type, the result code will be
* #DNS_R_HINTNXRRSET.
*
+ *\li If 'use_static_stub' is ISC_FALSE and the longest match zone for 'name'
+ * is a static-stub zone, it's ignored and the cache and/or hints will be
+ * searched. In the majority of the cases this argument should be
+ * ISC_FALSE. The only known usage of this argument being ISC_TRUE is
+ * if this search is for a "bailiwick" glue A or AAAA RRset that may
+ * best match a static-stub zone. Consider the following example:
+ * this view is configured with a static-stub zone "example.com",
+ * and an attempt of recursive resolution needs to send a query for the
+ * zone. In this case it's quite likely that the resolver is trying to
+ * find A/AAAA RRs for the apex name "example.com". And, to honor the
+ * static-stub configuration it needs to return the glue RRs in the
+ * static-stub zone even if that exact RRs coming from the authoritative
+ * zone has been cached.
+ * In other general cases, the requested data is better to be
+ * authoritative, either locally configured or retrieved from an external
+ * server, and the data in the static-stub zone should better be ignored.
+ *
*\li 'foundname' must meet the requirements of dns_db_find().
*
*\li If 'sigrdataset' is not NULL, and there is a SIG rdataset which
@@ -728,8 +818,14 @@ dns_view_dumpdbtostream(dns_view_t *view, FILE *fp);
isc_result_t
dns_view_flushcache(dns_view_t *view);
+isc_result_t
+dns_view_flushcache2(dns_view_t *view, isc_boolean_t fixuponly);
/*%<
- * Flush the view's cache (and ADB).
+ * Flush the view's cache (and ADB). If 'fixuponly' is true, it only updates
+ * the internal reference to the cache DB with omitting actual flush operation.
+ * 'fixuponly' is intended to be used for a view that shares a cache with
+ * a different view. dns_view_flushcache() is a backward compatible version
+ * that always sets fixuponly to false.
*
* Requires:
* 'view' is valid.
@@ -878,4 +974,105 @@ dns_view_getresquerystats(dns_view_t *view, dns_stats_t **statsp);
*\li 'statsp' != NULL && '*statsp' != NULL
*/
+isc_boolean_t
+dns_view_iscacheshared(dns_view_t *view);
+/*%<
+ * Check if the view shares the cache created by another view.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ *
+ * Returns:
+ *\li #ISC_TRUE if the cache is shared.
+ *\li #ISC_FALSE otherwise.
+ */
+
+isc_result_t
+dns_view_initsecroots(dns_view_t *view, isc_mem_t *mctx);
+/*%<
+ * Initialize security roots for the view. (Note that secroots is
+ * NULL until this function is called, so any function using
+ * secroots must check its validity first. One way to do this is
+ * use dns_view_getsecroots() and check its return value.)
+ *
+ * Requires:
+ * \li 'view' is valid.
+ * \li 'view->secroots' is NULL.
+ *
+ * Returns:
+ *\li ISC_R_SUCCESS
+ *\li Any other result indicates failure
+ */
+
+isc_result_t
+dns_view_getsecroots(dns_view_t *view, dns_keytable_t **ktp);
+/*%<
+ * Get the security roots for this view. Returns ISC_R_NOTFOUND if
+ * the security roots keytable has not been initialized for the view.
+ *
+ * '*ktp' is attached on success; the caller is responsible for
+ * detaching it with dns_keytable_detach().
+ *
+ * Requires:
+ * \li 'view' is valid.
+ * \li 'ktp' is not NULL and '*ktp' is NULL.
+ *
+ * Returns:
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOTFOUND
+ */
+
+isc_result_t
+dns_view_issecuredomain(dns_view_t *view, dns_name_t *name,
+ isc_boolean_t *secure_domain);
+/*%<
+ * Is 'name' at or beneath a trusted key? Put answer in
+ * '*secure_domain'.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ *
+ * Returns:
+ *\li ISC_R_SUCCESS
+ *\li Any other value indicates failure
+ */
+
+void
+dns_view_untrust(dns_view_t *view, dns_name_t *keyname,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx);
+/*%<
+ * Remove keys that match 'keyname' and 'dnskey' from the views trust
+ * anchors.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ * \li 'keyname' is valid.
+ * \li 'mctx' is valid.
+ * \li 'dnskey' is valid.
+ */
+
+void
+dns_view_setnewzones(dns_view_t *view, isc_boolean_t allow, void *cfgctx,
+ void (*cfg_destroy)(void **));
+/*%<
+ * Set whether or not to allow zones to be created or deleted at runtime.
+ *
+ * If 'allow' is ISC_TRUE, determines the filename into which new zone
+ * configuration will be written. Preserves the configuration context
+ * (a pointer to which is passed in 'cfgctx') for use when parsing new
+ * zone configuration. 'cfg_destroy' points to a callback routine to
+ * destroy the configuration context when the view is destroyed. (This
+ * roundabout method is used in order to avoid libdns having a dependency
+ * on libisccfg and libbind9.)
+ *
+ * If 'allow' is ISC_FALSE, removes any existing references to
+ * configuration context and frees any memory.
+ *
+ * Requires:
+ * \li 'view' is valid.
+ */
+
+void
+dns_view_restorekeyring(dns_view_t *view);
+
#endif /* DNS_VIEW_H */
diff --git a/contrib/bind9/lib/dns/include/dns/xfrin.h b/contrib/bind9/lib/dns/include/dns/xfrin.h
index b957e25..58910d2 100644
--- a/contrib/bind9/lib/dns/include/dns/xfrin.h
+++ b/contrib/bind9/lib/dns/include/dns/xfrin.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrin.h,v 1.28.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: xfrin.h,v 1.30 2009-01-17 23:47:43 tbox Exp $ */
#ifndef DNS_XFRIN_H
#define DNS_XFRIN_H 1
diff --git a/contrib/bind9/lib/dns/include/dns/zone.h b/contrib/bind9/lib/dns/include/dns/zone.h
index 96cb998..67756d9 100644
--- a/contrib/bind9/lib/dns/include/dns/zone.h
+++ b/contrib/bind9/lib/dns/include/dns/zone.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zone.h,v 1.160.50.8 2010-12-14 23:46:09 tbox Exp $ */
+/* $Id: zone.h,v 1.182 2010-12-18 01:56:22 each Exp $ */
#ifndef DNS_ZONE_H
#define DNS_ZONE_H 1
@@ -40,7 +40,10 @@ typedef enum {
dns_zone_none,
dns_zone_master,
dns_zone_slave,
- dns_zone_stub
+ dns_zone_stub,
+ dns_zone_staticstub,
+ dns_zone_key,
+ dns_zone_dlz
} dns_zonetype_t;
#define DNS_ZONEOPT_SERVERS 0x00000001U /*%< perform server checks */
@@ -70,6 +73,10 @@ typedef enum {
#define DNS_ZONEOPT_TRYTCPREFRESH 0x01000000U /*%< try tcp refresh on udp failure */
#define DNS_ZONEOPT_NOTIFYTOSOA 0x02000000U /*%< Notify the SOA MNAME */
#define DNS_ZONEOPT_NSEC3TESTZONE 0x04000000U /*%< nsec3-test-zone */
+#define DNS_ZONEOPT_SECURETOINSECURE 0x08000000U /*%< dnssec-secure-to-insecure */
+#define DNS_ZONEOPT_DNSKEYKSKONLY 0x10000000U /*%< dnssec-dnskey-kskonly */
+#define DNS_ZONEOPT_CHECKDUPRR 0x20000000U /*%< check-dup-records */
+#define DNS_ZONEOPT_CHECKDUPRRFAIL 0x40000000U /*%< fatal check-dup-records failures */
#ifndef NOMINUM_PUBLIC
/*
@@ -78,6 +85,14 @@ typedef enum {
#define DNS_ZONEOPT_NOTIFYFORWARD 0x80000000U /* forward notify to master */
#endif /* NOMINUM_PUBLIC */
+/*
+ * Zone key maintenance options
+ */
+#define DNS_ZONEKEY_ALLOW 0x00000001U /*%< fetch keys on command */
+#define DNS_ZONEKEY_MAINTAIN 0x00000002U /*%< publish/sign on schedule */
+#define DNS_ZONEKEY_CREATE 0x00000004U /*%< make keys when needed */
+#define DNS_ZONEKEY_FULLSIGN 0x00000008U /*%< roll to new keys immediately */
+
#ifndef DNS_ZONE_MINREFRESH
#define DNS_ZONE_MINREFRESH 300 /*%< 5 minutes */
#endif
@@ -367,6 +382,22 @@ dns_zone_getdb(dns_zone_t *zone, dns_db_t **dbp);
*\li DNS_R_NOTLOADED
*/
+void
+dns_zone_setdb(dns_zone_t *zone, dns_db_t *db);
+/*%<
+ * Sets the zone database to 'db'.
+ *
+ * This function is expected to be used to configure a zone with a
+ * database which is not loaded from a file or zone transfer.
+ * It can be used for a general purpose zone, but right now its use
+ * is limited to static-stub zones to avoid possible undiscovered
+ * problems in the general cases.
+ *
+ * Require:
+ *\li 'zone' to be a valid zone of static-stub.
+ *\li zone doesn't have a database.
+ */
+
isc_result_t
dns_zone_setdbtype(dns_zone_t *zone,
unsigned int dbargc, const char * const *dbargv);
@@ -568,6 +599,25 @@ dns_zone_getoptions(dns_zone_t *zone);
*/
void
+dns_zone_setkeyopt(dns_zone_t *zone, unsigned int option, isc_boolean_t value);
+/*%<
+ * Set key options on ('value' == ISC_TRUE) or off ('value' ==
+ * #ISC_FALSE).
+ *
+ * Require:
+ *\li 'zone' to be a valid zone.
+ */
+
+unsigned int
+dns_zone_getkeyopts(dns_zone_t *zone);
+/*%<
+ * Returns the current zone key options.
+ *
+ * Require:
+ *\li 'zone' to be a valid zone.
+ */
+
+void
dns_zone_setminrefreshtime(dns_zone_t *zone, isc_uint32_t val);
/*%<
* Set the minimum refresh time.
@@ -1747,6 +1797,61 @@ dns_zone_getprivatetype(dns_zone_t *zone);
* will not be permanent.
*/
+void
+dns_zone_rekey(dns_zone_t *zone, isc_boolean_t fullsign);
+/*%<
+ * Update the zone's DNSKEY set from the key repository.
+ *
+ * If 'fullsign' is true, trigger an immediate full signing of
+ * the zone with the new key. Otherwise, if there are no keys or
+ * if the new keys are for algorithms that have already signed the
+ * zone, then the zone can be re-signed incrementally.
+ */
+
+isc_result_t
+dns_zone_nscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ unsigned int *errors);
+/*%
+ * Check if the name servers for the zone are sane (have address, don't
+ * refer to CNAMEs/DNAMEs. The number of constiancy errors detected in
+ * returned in '*errors'
+ *
+ * Requires:
+ * \li 'zone' to be valid.
+ * \li 'db' to be valid.
+ * \li 'version' to be valid or NULL.
+ * \li 'errors' to be non NULL.
+ *
+ * Returns:
+ * ISC_R_SUCCESS if there were no errors examining the zone contents.
+ */
+
+void
+dns_zone_setadded(dns_zone_t *zone, isc_boolean_t added);
+/*%
+ * Sets the value of zone->added, which should be ISC_TRUE for
+ * zones that were originally added by "rndc addzone".
+ *
+ * Requires:
+ * \li 'zone' to be valid.
+ */
+
+isc_boolean_t
+dns_zone_getadded(dns_zone_t *zone);
+/*%
+ * Returns ISC_TRUE if the zone was originally added at runtime
+ * using "rndc addzone".
+ *
+ * Requires:
+ * \li 'zone' to be valid.
+ */
+
+isc_result_t
+dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db);
+/*%
+ * Load the origin names for a writeable DLZ database.
+ */
+
ISC_LANG_ENDDECLS
#endif /* DNS_ZONE_H */
diff --git a/contrib/bind9/lib/dns/include/dst/dst.h b/contrib/bind9/lib/dns/include/dst/dst.h
index 1a30d2b..3c999f6 100644
--- a/contrib/bind9/lib/dns/include/dst/dst.h
+++ b/contrib/bind9/lib/dns/include/dst/dst.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dst.h,v 1.12.50.3 2010-12-09 01:12:55 marka Exp $ */
+/* $Id: dst.h,v 1.31 2011-01-11 23:47:14 tbox Exp $ */
#ifndef DST_DST_H
#define DST_DST_H 1
@@ -23,8 +23,11 @@
/*! \file dst/dst.h */
#include <isc/lang.h>
+#include <isc/stdtime.h>
#include <dns/types.h>
+#include <dns/name.h>
+#include <dns/secalg.h>
#include <dst/gssapi.h>
@@ -55,6 +58,7 @@ typedef struct dst_context dst_context_t;
#define DST_ALG_NSEC3RSASHA1 7
#define DST_ALG_RSASHA256 8
#define DST_ALG_RSASHA512 10
+#define DST_ALG_ECCGOST 12
#define DST_ALG_HMACMD5 157
#define DST_ALG_GSSAPI 160
#define DST_ALG_HMACSHA1 161 /* XXXMPA */
@@ -80,12 +84,55 @@ typedef struct dst_context dst_context_t;
#define DST_TYPE_PRIVATE 0x2000000
#define DST_TYPE_PUBLIC 0x4000000
+/* Key timing metadata definitions */
+#define DST_TIME_CREATED 0
+#define DST_TIME_PUBLISH 1
+#define DST_TIME_ACTIVATE 2
+#define DST_TIME_REVOKE 3
+#define DST_TIME_INACTIVE 4
+#define DST_TIME_DELETE 5
+#define DST_TIME_DSPUBLISH 6
+#define DST_MAX_TIMES 6
+
+/* Numeric metadata definitions */
+#define DST_NUM_PREDECESSOR 0
+#define DST_NUM_SUCCESSOR 1
+#define DST_NUM_MAXTTL 2
+#define DST_NUM_ROLLPERIOD 3
+#define DST_MAX_NUMERIC 3
+
+/*
+ * Current format version number of the private key parser.
+ *
+ * When parsing a key file with the same major number but a higher minor
+ * number, the key parser will ignore any fields it does not recognize.
+ * Thus, DST_MINOR_VERSION should be incremented whenever new
+ * fields are added to the private key file (such as new metadata).
+ *
+ * When rewriting these keys, those fields will be dropped, and the
+ * format version set back to the current one..
+ *
+ * When a key is seen with a higher major number, the key parser will
+ * reject it as invalid. Thus, DST_MAJOR_VERSION should be incremented
+ * and DST_MINOR_VERSION set to zero whenever there is a format change
+ * which is not backward compatible to previous versions of the dst_key
+ * parser, such as change in the syntax of an existing field, the removal
+ * of a currently mandatory field, or a new field added which would
+ * alter the functioning of the key if it were absent.
+ */
+#define DST_MAJOR_VERSION 1
+#define DST_MINOR_VERSION 3
+
/***
*** Functions
***/
isc_result_t
dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags);
+
+isc_result_t
+dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx,
+ const char *engine, unsigned int eflags);
/*%<
* Initializes the DST subsystem.
*
@@ -96,6 +143,7 @@ dst_lib_init(isc_mem_t *mctx, isc_entropy_t *ectx, unsigned int eflags);
* Returns:
* \li ISC_R_SUCCESS
* \li ISC_R_NOMEMORY
+ * \li DST_R_NOENGINE
*
* Ensures:
* \li DST is properly initialized.
@@ -244,13 +292,17 @@ dst_key_fromfile(dns_name_t *name, dns_keytag_t id, unsigned int alg, int type,
*/
isc_result_t
-dst_key_fromnamedfile(const char *filename, int type, isc_mem_t *mctx,
- dst_key_t **keyp);
+dst_key_fromnamedfile(const char *filename, const char *dirname,
+ int type, isc_mem_t *mctx, dst_key_t **keyp);
/*%<
* Reads a key from permanent storage. The key can either be a public or
* key, and is specified by filename. If a private key is specified, the
* public key must also be present.
*
+ * If 'dirname' is not NULL, and 'filename' is a relative path,
+ * then the file is looked up relative to the given directory.
+ * If 'filename' is an absolute path, 'dirname' is ignored.
+ *
* Requires:
* \li "filename" is not NULL
* \li "type" is DST_TYPE_PUBLIC, DST_TYPE_PRIVATE, or the bitwise union
@@ -419,7 +471,7 @@ dst_key_getgssctx(const dst_key_t *key);
isc_result_t
dst_key_fromgssapi(dns_name_t *name, gss_ctx_id_t gssctx, isc_mem_t *mctx,
- dst_key_t **keyp);
+ dst_key_t **keyp, isc_region_t *intoken);
/*%<
* Converts a GSSAPI opaque context id into a DST key.
*
@@ -450,6 +502,14 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
unsigned int flags, unsigned int protocol,
dns_rdataclass_t rdclass,
isc_mem_t *mctx, dst_key_t **keyp);
+
+isc_result_t
+dst_key_generate2(dns_name_t *name, unsigned int alg,
+ unsigned int bits, unsigned int param,
+ unsigned int flags, unsigned int protocol,
+ dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, dst_key_t **keyp,
+ void (*callback)(int));
/*%<
* Generate a DST key (or keypair) with the supplied parameters. The
* interpretation of the "param" field depends on the algorithm:
@@ -482,7 +542,31 @@ dst_key_generate(dns_name_t *name, unsigned int alg,
isc_boolean_t
dst_key_compare(const dst_key_t *key1, const dst_key_t *key2);
/*%<
- * Compares two DST keys.
+ * Compares two DST keys. Returns true if they match, false otherwise.
+ *
+ * Keys ARE NOT considered to match if one of them is the revoked version
+ * of the other.
+ *
+ * Requires:
+ *\li "key1" is a valid key.
+ *\li "key2" is a valid key.
+ *
+ * Returns:
+ *\li ISC_TRUE
+ * \li ISC_FALSE
+ */
+
+isc_boolean_t
+dst_key_pubcompare(const dst_key_t *key1, const dst_key_t *key2,
+ isc_boolean_t match_revoked_key);
+/*%<
+ * Compares only the public portions of two DST keys. Returns true
+ * if they match, false otherwise. This allows us, for example, to
+ * determine whether a public key found in a zone matches up with a
+ * key pair found on disk.
+ *
+ * If match_revoked_key is TRUE, then keys ARE considered to match if one
+ * of them is the revoked version of the other. Otherwise, they are not.
*
* Requires:
*\li "key1" is a valid key.
@@ -521,10 +605,12 @@ dst_key_attach(dst_key_t *source, dst_key_t **target);
void
dst_key_free(dst_key_t **keyp);
/*%<
- * Release all memory associated with the key.
+ * Decrement the key's reference counter and, when it reaches zero,
+ * release all memory associated with the key.
*
* Requires:
*\li "keyp" is not NULL and "*keyp" is a valid key.
+ *\li reference counter greater than zero.
*
* Ensures:
*\li All memory associated with "*keyp" will be freed.
@@ -633,7 +719,7 @@ dst_region_computeid(const isc_region_t *source, unsigned int alg);
isc_uint16_t
dst_key_getbits(const dst_key_t *key);
-/*
+/*%<
* Get the number of digest bits required (0 == MAX).
*
* Requires:
@@ -642,13 +728,150 @@ dst_key_getbits(const dst_key_t *key);
void
dst_key_setbits(dst_key_t *key, isc_uint16_t bits);
-/*
+/*%<
* Set the number of digest bits required (0 == MAX).
*
* Requires:
* "key" is a valid key.
*/
+isc_result_t
+dst_key_setflags(dst_key_t *key, isc_uint32_t flags);
+/*
+ * Set the key flags, and recompute the key ID.
+ *
+ * Requires:
+ * "key" is a valid key.
+ */
+
+isc_result_t
+dst_key_getnum(const dst_key_t *key, int type, isc_uint32_t *valuep);
+/*%<
+ * Get a member of the numeric metadata array and place it in '*valuep'.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_NUMERIC
+ * "timep" is not null.
+ */
+
+void
+dst_key_setnum(dst_key_t *key, int type, isc_uint32_t value);
+/*%<
+ * Set a member of the numeric metadata array.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_NUMERIC
+ */
+
+void
+dst_key_unsetnum(dst_key_t *key, int type);
+/*%<
+ * Flag a member of the numeric metadata array as "not set".
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_NUMERIC
+ */
+
+isc_result_t
+dst_key_gettime(const dst_key_t *key, int type, isc_stdtime_t *timep);
+/*%<
+ * Get a member of the timing metadata array and place it in '*timep'.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_TIMES
+ * "timep" is not null.
+ */
+
+void
+dst_key_settime(dst_key_t *key, int type, isc_stdtime_t when);
+/*%<
+ * Set a member of the timing metadata array.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_TIMES
+ */
+
+void
+dst_key_unsettime(dst_key_t *key, int type);
+/*%<
+ * Flag a member of the timing metadata array as "not set".
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "type" is no larger than DST_MAX_TIMES
+ */
+
+isc_result_t
+dst_key_getprivateformat(const dst_key_t *key, int *majorp, int *minorp);
+/*%<
+ * Get the private key format version number. (If the key does not have
+ * a private key associated with it, the version will be 0.0.) The major
+ * version number is placed in '*majorp', and the minor version number in
+ * '*minorp'.
+ *
+ * Requires:
+ * "key" is a valid key.
+ * "majorp" is not NULL.
+ * "minorp" is not NULL.
+ */
+
+void
+dst_key_setprivateformat(dst_key_t *key, int major, int minor);
+/*%<
+ * Set the private key format version number.
+ *
+ * Requires:
+ * "key" is a valid key.
+ */
+
+#define DST_KEY_FORMATSIZE (DNS_NAME_FORMATSIZE + DNS_SECALG_FORMATSIZE + 7)
+
+void
+dst_key_format(const dst_key_t *key, char *cp, unsigned int size);
+/*%<
+ * Write the uniquely identifying information about the key (name,
+ * algorithm, key ID) into a string 'cp' of size 'size'.
+ */
+
+
+isc_buffer_t *
+dst_key_tkeytoken(const dst_key_t *key);
+/*%<
+ * Return the token from the TKEY request, if any. If this key was
+ * not negotiated via TKEY, return NULL.
+ */
+
+
+isc_result_t
+dst_key_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length);
+/*%<
+ * Allocate 'buffer' and dump the key into it in base64 format. The buffer
+ * is not NUL terminated. The length of the buffer is returned in *length.
+ *
+ * 'buffer' needs to be freed using isc_mem_put(mctx, buffer, length);
+ *
+ * Requires:
+ * 'buffer' to be non NULL and *buffer to be NULL.
+ * 'length' to be non NULL and *length to be zero.
+ *
+ * Returns:
+ * ISC_R_SUCCESS
+ * ISC_R_NOMEMORY
+ * ISC_R_NOTIMPLEMENTED
+ * others.
+ */
+
+isc_result_t
+dst_key_restore(dns_name_t *name, unsigned int alg, unsigned int flags,
+ unsigned int protocol, dns_rdataclass_t rdclass,
+ isc_mem_t *mctx, const char *keystr, dst_key_t **keyp);
+
+
ISC_LANG_ENDDECLS
#endif /* DST_DST_H */
diff --git a/contrib/bind9/lib/dns/include/dst/gssapi.h b/contrib/bind9/lib/dns/include/dst/gssapi.h
index 0a468d3..189e6b5 100644
--- a/contrib/bind9/lib/dns/include/dst/gssapi.h
+++ b/contrib/bind9/lib/dns/include/dst/gssapi.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gssapi.h,v 1.9.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: gssapi.h,v 1.16 2011-01-08 23:47:01 tbox Exp $ */
#ifndef DST_GSSAPI_H
#define DST_GSSAPI_H 1
@@ -34,8 +34,12 @@
* MSVC does not like macros in #include lines.
*/
#include <gssapi/gssapi.h>
+#include <gssapi/gssapi_krb5.h>
#else
#include ISC_PLATFORM_GSSAPIHEADER
+#ifdef ISC_PLATFORM_GSSAPI_KRB5_HEADER
+#include ISC_PLATFORM_GSSAPI_KRB5_HEADER
+#endif
#endif
#ifndef GSS_SPNEGO_MECHANISM
#define GSS_SPNEGO_MECHANISM ((void*)0)
@@ -90,7 +94,8 @@ dst_gssapi_releasecred(gss_cred_id_t *cred);
isc_result_t
dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
- isc_buffer_t *outtoken, gss_ctx_id_t *gssctx);
+ isc_buffer_t *outtoken, gss_ctx_id_t *gssctx,
+ isc_mem_t *mctx, char **err_message);
/*
* Initiates a GSS context.
*
@@ -108,10 +113,12 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
* ISC_R_SUCCESS msg was successfully updated to include the
* query to be sent
* other an error occurred while building the message
+ * *err_message optional error message
*/
isc_result_t
dst_gssapi_acceptctx(gss_cred_id_t cred,
+ const char *gssapi_keytab,
isc_region_t *intoken, isc_buffer_t **outtoken,
gss_ctx_id_t *context, dns_name_t *principal,
isc_mem_t *mctx);
diff --git a/contrib/bind9/lib/dns/iptable.c b/contrib/bind9/lib/dns/iptable.c
index 071f9a6..7c334dd 100644
--- a/contrib/bind9/lib/dns/iptable.c
+++ b/contrib/bind9/lib/dns/iptable.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: iptable.c,v 1.12.44.3 2009-02-18 23:47:12 tbox Exp $ */
+/* $Id: iptable.c,v 1.15 2009-02-18 23:47:48 tbox Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/dns/journal.c b/contrib/bind9/lib/dns/journal.c
index 520083e..a6d630e 100644
--- a/contrib/bind9/lib/dns/journal.c
+++ b/contrib/bind9/lib/dns/journal.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: journal.c,v 1.103.48.8 2010-11-17 23:45:45 tbox Exp $ */
+/* $Id: journal.c,v 1.112 2010-11-17 23:47:08 tbox Exp $ */
#include <config.h>
@@ -562,11 +562,9 @@ journal_open(isc_mem_t *mctx, const char *filename, isc_boolean_t write,
if (result == ISC_R_FILENOTFOUND) {
if (create) {
- isc_log_write(JOURNAL_COMMON_LOGARGS,
- ISC_LOG_INFO,
+ isc_log_write(JOURNAL_COMMON_LOGARGS, ISC_LOG_DEBUG(1),
"journal file %s does not exist, "
- "creating it",
- j->filename);
+ "creating it", j->filename);
CHECK(journal_file_create(mctx, filename));
/*
* Retry.
diff --git a/contrib/bind9/lib/dns/keydata.c b/contrib/bind9/lib/dns/keydata.c
new file mode 100644
index 0000000..c2f82c8
--- /dev/null
+++ b/contrib/bind9/lib/dns/keydata.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keydata.c,v 1.3 2009-07-01 23:47:36 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+
+#include <isc/buffer.h>
+#include <isc/mem.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/rdata.h>
+#include <dns/rdatastruct.h>
+#include <dns/keydata.h>
+
+isc_result_t
+dns_keydata_todnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx)
+{
+ REQUIRE(keydata != NULL && dnskey != NULL);
+
+ dnskey->common.rdtype = dns_rdatatype_dnskey;
+ dnskey->common.rdclass = keydata->common.rdclass;
+ dnskey->mctx = mctx;
+ dnskey->flags = keydata->flags;
+ dnskey->protocol = keydata->protocol;
+ dnskey->algorithm = keydata->algorithm;
+
+ dnskey->datalen = keydata->datalen;
+
+ if (mctx == NULL)
+ dnskey->data = keydata->data;
+ else {
+ dnskey->data = isc_mem_allocate(mctx, dnskey->datalen);
+ if (dnskey->data == NULL)
+ return (ISC_R_NOMEMORY);
+ memcpy(dnskey->data, keydata->data, dnskey->datalen);
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_keydata_fromdnskey(dns_rdata_keydata_t *keydata,
+ dns_rdata_dnskey_t *dnskey,
+ isc_uint32_t refresh, isc_uint32_t addhd,
+ isc_uint32_t removehd, isc_mem_t *mctx)
+{
+ REQUIRE(keydata != NULL && dnskey != NULL);
+
+ keydata->common.rdtype = dns_rdatatype_keydata;
+ keydata->common.rdclass = dnskey->common.rdclass;
+ keydata->mctx = mctx;
+ keydata->refresh = refresh;
+ keydata->addhd = addhd;
+ keydata->removehd = removehd;
+ keydata->flags = dnskey->flags;
+ keydata->protocol = dnskey->protocol;
+ keydata->algorithm = dnskey->algorithm;
+
+ keydata->datalen = dnskey->datalen;
+ if (mctx == NULL)
+ keydata->data = dnskey->data;
+ else {
+ keydata->data = isc_mem_allocate(mctx, keydata->datalen);
+ if (keydata->data == NULL)
+ return (ISC_R_NOMEMORY);
+ memcpy(keydata->data, dnskey->data, keydata->datalen);
+ }
+
+ return (ISC_R_SUCCESS);
+}
diff --git a/contrib/bind9/lib/dns/keytable.c b/contrib/bind9/lib/dns/keytable.c
index 874868d..3edc3d6 100644
--- a/contrib/bind9/lib/dns/keytable.c
+++ b/contrib/bind9/lib/dns/keytable.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keytable.c,v 1.34 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: keytable.c,v 1.41 2010-06-25 23:46:51 tbox Exp $ */
/*! \file */
@@ -31,41 +31,12 @@
#include <dns/rbt.h>
#include <dns/result.h>
-struct dns_keytable {
- /* Unlocked. */
- unsigned int magic;
- isc_mem_t *mctx;
- isc_mutex_t lock;
- isc_rwlock_t rwlock;
- /* Locked by lock. */
- isc_uint32_t active_nodes;
- /* Locked by rwlock. */
- isc_uint32_t references;
- dns_rbt_t *table;
-};
-
-#define KEYTABLE_MAGIC ISC_MAGIC('K', 'T', 'b', 'l')
-#define VALID_KEYTABLE(kt) ISC_MAGIC_VALID(kt, KEYTABLE_MAGIC)
-
-struct dns_keynode {
- unsigned int magic;
- dst_key_t * key;
- struct dns_keynode * next;
-};
-
-#define KEYNODE_MAGIC ISC_MAGIC('K', 'N', 'o', 'd')
-#define VALID_KEYNODE(kn) ISC_MAGIC_VALID(kn, KEYNODE_MAGIC)
-
static void
free_keynode(void *node, void *arg) {
dns_keynode_t *keynode = node;
isc_mem_t *mctx = arg;
- REQUIRE(VALID_KEYNODE(keynode));
- dst_key_free(&keynode->key);
- if (keynode->next != NULL)
- free_keynode(keynode->next, mctx);
- isc_mem_put(mctx, keynode, sizeof(dns_keynode_t));
+ dns_keynode_detachall(mctx, &keynode);
}
isc_result_t
@@ -116,7 +87,6 @@ dns_keytable_create(isc_mem_t *mctx, dns_keytable_t **keytablep) {
return (result);
}
-
void
dns_keytable_attach(dns_keytable_t *source, dns_keytable_t **targetp) {
@@ -173,50 +143,224 @@ dns_keytable_detach(dns_keytable_t **keytablep) {
*keytablep = NULL;
}
-isc_result_t
-dns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp) {
+static isc_result_t
+insert(dns_keytable_t *keytable, isc_boolean_t managed,
+ dns_name_t *keyname, dst_key_t **keyp)
+{
isc_result_t result;
- dns_keynode_t *knode;
+ dns_keynode_t *knode = NULL;
dns_rbtnode_t *node;
- dns_name_t *keyname;
-
- /*
- * Add '*keyp' to 'keytable'.
- */
+ REQUIRE(keyp == NULL || *keyp != NULL);
REQUIRE(VALID_KEYTABLE(keytable));
- REQUIRE(keyp != NULL);
- keyname = dst_key_name(*keyp);
+ result = dns_keynode_create(keytable->mctx, &knode);
+ if (result != ISC_R_SUCCESS)
+ return (result);
- knode = isc_mem_get(keytable->mctx, sizeof(*knode));
- if (knode == NULL)
- return (ISC_R_NOMEMORY);
+ knode->managed = managed;
RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
node = NULL;
result = dns_rbt_addnode(keytable->table, keyname, &node);
- if (result == ISC_R_SUCCESS || result == ISC_R_EXISTS) {
- knode->magic = KEYNODE_MAGIC;
- knode->key = *keyp;
- knode->next = node->data;
+ if (keyp != NULL) {
+ if (result == ISC_R_EXISTS) {
+ /* Key already in table? */
+ dns_keynode_t *k;
+ for (k = node->data; k != NULL; k = k->next) {
+ if (k->key == NULL) {
+ k->key = *keyp;
+ break;
+ }
+ if (dst_key_compare(k->key, *keyp) == ISC_TRUE)
+ break;
+ }
+
+ if (k == NULL)
+ result = ISC_R_SUCCESS;
+ else
+ dst_key_free(keyp);
+ }
+
+ if (result == ISC_R_SUCCESS) {
+ knode->key = *keyp;
+ knode->next = node->data;
+ *keyp = NULL;
+ }
+ }
+
+ if (result == ISC_R_SUCCESS) {
node->data = knode;
- *keyp = NULL;
knode = NULL;
- result = ISC_R_SUCCESS;
}
+ /* Key was already there? That's the same as a success */
+ if (result == ISC_R_EXISTS)
+ result = ISC_R_SUCCESS;
+
RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
if (knode != NULL)
- isc_mem_put(keytable->mctx, knode, sizeof(*knode));
+ dns_keynode_detach(keytable->mctx, &knode);
+
+ return (result);
+}
+
+isc_result_t
+dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed,
+ dst_key_t **keyp)
+{
+ REQUIRE(keyp != NULL && *keyp != NULL);
+ return (insert(keytable, managed, dst_key_name(*keyp), keyp));
+}
+
+isc_result_t
+dns_keytable_marksecure(dns_keytable_t *keytable, dns_name_t *name) {
+ return (insert(keytable, ISC_TRUE, name, NULL));
+}
+
+isc_result_t
+dns_keytable_delete(dns_keytable_t *keytable, dns_name_t *keyname) {
+ isc_result_t result;
+ dns_rbtnode_t *node = NULL;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(keyname != NULL);
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
+ result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+ if (result == ISC_R_SUCCESS) {
+ if (node->data != NULL)
+ result = dns_rbt_deletenode(keytable->table,
+ node, ISC_FALSE);
+ else
+ result = ISC_R_NOTFOUND;
+ } else if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
return (result);
}
isc_result_t
+dns_keytable_deletekeynode(dns_keytable_t *keytable, dst_key_t *dstkey) {
+ isc_result_t result;
+ dns_name_t *keyname;
+ dns_rbtnode_t *node = NULL;
+ dns_keynode_t *knode = NULL, **kprev = NULL;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(dstkey != NULL);
+
+ keyname = dst_key_name(dstkey);
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
+ result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+
+ if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+ if (result != ISC_R_SUCCESS)
+ goto finish;
+
+ if (node->data == NULL) {
+ result = ISC_R_NOTFOUND;
+ goto finish;
+ }
+
+ knode = node->data;
+ if (knode->next == NULL &&
+ (knode->key == NULL ||
+ dst_key_compare(knode->key, dstkey) == ISC_TRUE)) {
+ result = dns_rbt_deletenode(keytable->table, node, ISC_FALSE);
+ goto finish;
+ }
+
+ kprev = (dns_keynode_t **) &node->data;
+ while (knode != NULL) {
+ if (dst_key_compare(knode->key, dstkey) == ISC_TRUE)
+ break;
+ kprev = &knode->next;
+ knode = knode->next;
+ }
+
+ if (knode != NULL) {
+ if (knode->key != NULL)
+ dst_key_free(&knode->key);
+ /*
+ * This is equivalent to:
+ * dns_keynode_attach(knode->next, &tmp);
+ * dns_keynode_detach(kprev);
+ * dns_keynode_attach(tmp, &kprev);
+ * dns_keynode_detach(&tmp);
+ */
+ *kprev = knode->next;
+ knode->next = NULL;
+ dns_keynode_detach(keytable->mctx, &knode);
+ } else
+ result = DNS_R_PARTIALMATCH;
+ finish:
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
+ return (result);
+}
+
+isc_result_t
+dns_keytable_find(dns_keytable_t *keytable, dns_name_t *keyname,
+ dns_keynode_t **keynodep)
+{
+ isc_result_t result;
+ dns_rbtnode_t *node = NULL;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(keyname != NULL);
+ REQUIRE(keynodep != NULL && *keynodep == NULL);
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_read);
+ result = dns_rbt_findnode(keytable->table, keyname, NULL, &node, NULL,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+ if (result == ISC_R_SUCCESS) {
+ if (node->data != NULL) {
+ LOCK(&keytable->lock);
+ keytable->active_nodes++;
+ UNLOCK(&keytable->lock);
+ dns_keynode_attach(node->data, keynodep);
+ } else
+ result = ISC_R_NOTFOUND;
+ } else if (result == DNS_R_PARTIALMATCH)
+ result = ISC_R_NOTFOUND;
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_read);
+
+ return (result);
+}
+
+isc_result_t
+dns_keytable_nextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
+ dns_keynode_t **nextnodep)
+{
+ /*
+ * Return the next key after 'keynode', regardless of
+ * properties.
+ */
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(VALID_KEYNODE(keynode));
+ REQUIRE(nextnodep != NULL && *nextnodep == NULL);
+
+ if (keynode->next == NULL)
+ return (ISC_R_NOTFOUND);
+
+ dns_keynode_attach(keynode->next, nextnodep);
+ LOCK(&keytable->lock);
+ keytable->active_nodes++;
+ UNLOCK(&keytable->lock);
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
dns_secalg_t algorithm, dns_keytag_t tag,
dns_keynode_t **keynodep)
@@ -250,6 +394,10 @@ dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
if (result == ISC_R_SUCCESS) {
INSIST(data != NULL);
for (knode = data; knode != NULL; knode = knode->next) {
+ if (knode->key == NULL) {
+ knode = NULL;
+ break;
+ }
if (algorithm == dst_key_alg(knode->key)
&& tag == dst_key_id(knode->key))
break;
@@ -258,7 +406,7 @@ dns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
LOCK(&keytable->lock);
keytable->active_nodes++;
UNLOCK(&keytable->lock);
- *keynodep = knode;
+ dns_keynode_attach(knode, keynodep);
} else
result = DNS_R_PARTIALMATCH;
} else if (result == DNS_R_PARTIALMATCH)
@@ -286,6 +434,10 @@ dns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
REQUIRE(nextnodep != NULL && *nextnodep == NULL);
for (knode = keynode->next; knode != NULL; knode = knode->next) {
+ if (knode->key == NULL) {
+ knode = NULL;
+ break;
+ }
if (dst_key_alg(keynode->key) == dst_key_alg(knode->key) &&
dst_key_id(keynode->key) == dst_key_id(knode->key))
break;
@@ -295,7 +447,7 @@ dns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
keytable->active_nodes++;
UNLOCK(&keytable->lock);
result = ISC_R_SUCCESS;
- *nextnodep = knode;
+ dns_keynode_attach(knode, nextnodep);
} else
result = ISC_R_NOTFOUND;
@@ -331,6 +483,25 @@ dns_keytable_finddeepestmatch(dns_keytable_t *keytable, dns_name_t *name,
}
void
+dns_keytable_attachkeynode(dns_keytable_t *keytable, dns_keynode_t *source,
+ dns_keynode_t **target)
+{
+ /*
+ * Give back a keynode found via dns_keytable_findkeynode().
+ */
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+ REQUIRE(VALID_KEYNODE(source));
+ REQUIRE(target != NULL && *target == NULL);
+
+ LOCK(&keytable->lock);
+ keytable->active_nodes++;
+ UNLOCK(&keytable->lock);
+
+ dns_keynode_attach(source, target);
+}
+
+void
dns_keytable_detachkeynode(dns_keytable_t *keytable, dns_keynode_t **keynodep)
{
/*
@@ -345,7 +516,7 @@ dns_keytable_detachkeynode(dns_keytable_t *keytable, dns_keynode_t **keynodep)
keytable->active_nodes--;
UNLOCK(&keytable->lock);
- *keynodep = NULL;
+ dns_keynode_detach(keytable->mctx, keynodep);
}
isc_result_t
@@ -382,6 +553,44 @@ dns_keytable_issecuredomain(dns_keytable_t *keytable, dns_name_t *name,
return (result);
}
+isc_result_t
+dns_keytable_dump(dns_keytable_t *keytable, FILE *fp)
+{
+ isc_result_t result;
+ dns_keynode_t *knode;
+ dns_rbtnode_t *node;
+ dns_rbtnodechain_t chain;
+
+ REQUIRE(VALID_KEYTABLE(keytable));
+
+ RWLOCK(&keytable->rwlock, isc_rwlocktype_read);
+ dns_rbtnodechain_init(&chain, keytable->mctx);
+ result = dns_rbtnodechain_first(&chain, keytable->table, NULL, NULL);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN)
+ goto cleanup;
+ for (;;) {
+ char pbuf[DST_KEY_FORMATSIZE];
+
+ dns_rbtnodechain_current(&chain, NULL, NULL, &node);
+ for (knode = node->data; knode != NULL; knode = knode->next) {
+ dst_key_format(knode->key, pbuf, sizeof(pbuf));
+ fprintf(fp, "%s ; %s\n", pbuf,
+ knode->managed ? "managed" : "trusted");
+ }
+ result = dns_rbtnodechain_next(&chain, NULL, NULL);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ break;
+ }
+ }
+
+ cleanup:
+ dns_rbtnodechain_invalidate(&chain);
+ RWUNLOCK(&keytable->rwlock, isc_rwlocktype_read);
+ return (result);
+}
+
dst_key_t *
dns_keynode_key(dns_keynode_t *keynode) {
@@ -393,3 +602,71 @@ dns_keynode_key(dns_keynode_t *keynode) {
return (keynode->key);
}
+
+isc_boolean_t
+dns_keynode_managed(dns_keynode_t *keynode) {
+ /*
+ * Is this a managed key?
+ */
+ REQUIRE(VALID_KEYNODE(keynode));
+
+ return (keynode->managed);
+}
+
+isc_result_t
+dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target) {
+ isc_result_t result;
+ dns_keynode_t *knode = NULL;
+
+ REQUIRE(target != NULL && *target == NULL);
+
+ knode = isc_mem_get(mctx, sizeof(dns_keynode_t));
+ if (knode == NULL)
+ return (ISC_R_NOMEMORY);
+
+ knode->magic = KEYNODE_MAGIC;
+ knode->managed = ISC_FALSE;
+ knode->key = NULL;
+ knode->next = NULL;
+
+ result = isc_refcount_init(&knode->refcount, 1);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ *target = knode;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_keynode_attach(dns_keynode_t *source, dns_keynode_t **target) {
+ REQUIRE(VALID_KEYNODE(source));
+ isc_refcount_increment(&source->refcount, NULL);
+ *target = source;
+}
+
+void
+dns_keynode_detach(isc_mem_t *mctx, dns_keynode_t **keynode) {
+ unsigned int refs;
+ dns_keynode_t *node = *keynode;
+ REQUIRE(VALID_KEYNODE(node));
+ isc_refcount_decrement(&node->refcount, &refs);
+ if (refs == 0) {
+ if (node->key != NULL)
+ dst_key_free(&node->key);
+ isc_refcount_destroy(&node->refcount);
+ isc_mem_put(mctx, node, sizeof(dns_keynode_t));
+ }
+ *keynode = NULL;
+}
+
+void
+dns_keynode_detachall(isc_mem_t *mctx, dns_keynode_t **keynode) {
+ dns_keynode_t *next = NULL, *node = *keynode;
+ REQUIRE(VALID_KEYNODE(node));
+ while (node != NULL) {
+ next = node->next;
+ dns_keynode_detach(mctx, &node);
+ node = next;
+ }
+ *keynode = NULL;
+}
diff --git a/contrib/bind9/lib/dns/lib.c b/contrib/bind9/lib/dns/lib.c
index 761be56..6953c88 100644
--- a/contrib/bind9/lib/dns/lib.c
+++ b/contrib/bind9/lib/dns/lib.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.c,v 1.16 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: lib.c,v 1.19 2009-09-03 00:12:23 each Exp $ */
/*! \file */
@@ -23,11 +23,20 @@
#include <stddef.h>
-#include <isc/once.h>
+#include <isc/hash.h>
+#include <isc/mem.h>
#include <isc/msgcat.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
#include <isc/util.h>
+#include <dns/db.h>
+#include <dns/ecdb.h>
#include <dns/lib.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
/***
*** Globals
@@ -63,3 +72,97 @@ dns_lib_initmsgcat(void) {
RUNTIME_CHECK(isc_once_do(&msgcat_once, open_msgcat) == ISC_R_SUCCESS);
}
+
+static isc_once_t init_once = ISC_ONCE_INIT;
+static isc_mem_t *dns_g_mctx = NULL;
+#ifndef BIND9
+static dns_dbimplementation_t *dbimp = NULL;
+#endif
+static isc_boolean_t initialize_done = ISC_FALSE;
+static isc_mutex_t reflock;
+static unsigned int references = 0;
+
+static void
+initialize(void) {
+ isc_result_t result;
+
+ REQUIRE(initialize_done == ISC_FALSE);
+
+ result = isc_mem_create(0, 0, &dns_g_mctx);
+ if (result != ISC_R_SUCCESS)
+ return;
+ dns_result_register();
+#ifndef BIND9
+ result = dns_ecdb_register(dns_g_mctx, &dbimp);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_mctx;
+#endif
+ result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_db;
+
+ result = dst_lib_init(dns_g_mctx, NULL, 0);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_hash;
+
+ result = isc_mutex_init(&reflock);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_dst;
+
+ initialize_done = ISC_TRUE;
+ return;
+
+ cleanup_dst:
+ dst_lib_destroy();
+ cleanup_hash:
+ isc_hash_destroy();
+ cleanup_db:
+#ifndef BIND9
+ dns_ecdb_unregister(&dbimp);
+ cleanup_mctx:
+#endif
+ isc_mem_detach(&dns_g_mctx);
+}
+
+isc_result_t
+dns_lib_init(void) {
+ isc_result_t result;
+
+ /*
+ * Since this routine is expected to be used by a normal application,
+ * it should be better to return an error, instead of an emergency
+ * abort, on any failure.
+ */
+ result = isc_once_do(&init_once, initialize);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (!initialize_done)
+ return (ISC_R_FAILURE);
+
+ LOCK(&reflock);
+ references++;
+ UNLOCK(&reflock);
+
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_lib_shutdown(void) {
+ isc_boolean_t cleanup_ok = ISC_FALSE;
+
+ LOCK(&reflock);
+ if (--references == 0)
+ cleanup_ok = ISC_TRUE;
+ UNLOCK(&reflock);
+
+ if (!cleanup_ok)
+ return;
+
+ dst_lib_destroy();
+ isc_hash_destroy();
+#ifndef BIND9
+ dns_ecdb_unregister(&dbimp);
+#endif
+ isc_mem_detach(&dns_g_mctx);
+}
diff --git a/contrib/bind9/lib/dns/log.c b/contrib/bind9/lib/dns/log.c
index 5b3ee32..9de5976 100644
--- a/contrib/bind9/lib/dns/log.c
+++ b/contrib/bind9/lib/dns/log.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.45 2007-06-18 23:47:40 tbox Exp $ */
+/* $Id: log.c,v 1.47 2009-12-18 23:49:03 tbox Exp $ */
/*! \file */
@@ -79,6 +79,7 @@ LIBDNS_EXTERNAL_DATA isc_logmodule_t dns_modules[] = {
{ "dns/hints", 0 },
{ "dns/acache", 0 },
{ "dns/dlz", 0 },
+ { "dns/dnssec", 0 },
{ NULL, 0 }
};
diff --git a/contrib/bind9/lib/dns/master.c b/contrib/bind9/lib/dns/master.c
index 9c6d3b8..e90a74c 100644
--- a/contrib/bind9/lib/dns/master.c
+++ b/contrib/bind9/lib/dns/master.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: master.c,v 1.171.120.2 2009-01-18 23:47:40 tbox Exp $ */
+/* $Id: master.c,v 1.178 2009-09-01 00:22:26 jinmei Exp $ */
/*! \file */
@@ -85,7 +85,11 @@
*/
#define TOKENSIZ (8*1024)
-#define DNS_MASTER_BUFSZ 2048
+/*%
+ * Buffers sizes for $GENERATE.
+ */
+#define DNS_MASTER_LHS 2048
+#define DNS_MASTER_RHS MINTSIZ
typedef ISC_LIST(dns_rdatalist_t) rdatalist_head_t;
@@ -614,6 +618,57 @@ loadctx_create(dns_masterformat_t format, isc_mem_t *mctx,
return (result);
}
+static const char *hex = "0123456789abcdef0123456789ABCDEF";
+
+/*%
+ * Convert value into a nibble sequence from least significant to most
+ * significant nibble. Zero fill upper most significant nibbles if
+ * required to make the width.
+ *
+ * Returns the number of characters that should have been written without
+ * counting the terminating NUL.
+ */
+static unsigned int
+nibbles(char *numbuf, size_t length, unsigned int width, char mode, int value) {
+ unsigned int count = 0;
+
+ /*
+ * This reserve space for the NUL string terminator.
+ */
+ if (length > 0U) {
+ *numbuf = '\0';
+ length--;
+ }
+ do {
+ char val = hex[(value & 0x0f) + ((mode == 'n') ? 0 : 16)];
+ value >>= 4;
+ if (length > 0U) {
+ *numbuf++ = val;
+ *numbuf = '\0';
+ length--;
+ }
+ if (width > 0)
+ width--;
+ count++;
+ /*
+ * If width is non zero then we need to add a label seperator.
+ * If value is non zero then we need to add another label and
+ * that requires a label seperator.
+ */
+ if (width > 0 || value != 0) {
+ if (length > 0U) {
+ *numbuf++ = '.';
+ *numbuf = '\0';
+ length--;
+ }
+ if (width > 0)
+ width--;
+ count++;
+ }
+ } while (value != 0 || width > 0);
+ return (count);
+}
+
static isc_result_t
genname(char *name, int it, char *buffer, size_t length) {
char fmt[sizeof("%04000000000d")];
@@ -624,6 +679,7 @@ genname(char *name, int it, char *buffer, size_t length) {
isc_textregion_t r;
unsigned int n;
unsigned int width;
+ isc_boolean_t nibblemode;
r.base = buffer;
r.length = length;
@@ -638,10 +694,11 @@ genname(char *name, int it, char *buffer, size_t length) {
isc_textregion_consume(&r, 1);
continue;
}
+ nibblemode = ISC_FALSE;
strcpy(fmt, "%d");
/* Get format specifier. */
if (*name == '{' ) {
- n = sscanf(name, "{%d,%u,%1[doxX]}",
+ n = sscanf(name, "{%d,%u,%1[doxXnN]}",
&delta, &width, mode);
switch (n) {
case 1:
@@ -651,6 +708,8 @@ genname(char *name, int it, char *buffer, size_t length) {
"%%0%ud", width);
break;
case 3:
+ if (mode[0] == 'n' || mode[0] == 'N')
+ nibblemode = ISC_TRUE;
n = snprintf(fmt, sizeof(fmt),
"%%0%u%c", width, mode[0]);
break;
@@ -663,7 +722,12 @@ genname(char *name, int it, char *buffer, size_t length) {
while (*name != '\0' && *name++ != '}')
continue;
}
- n = snprintf(numbuf, sizeof(numbuf), fmt, it + delta);
+ if (nibblemode)
+ n = nibbles(numbuf, sizeof(numbuf), width,
+ mode[0], it + delta);
+ else
+ n = snprintf(numbuf, sizeof(numbuf), fmt,
+ it + delta);
if (n >= sizeof(numbuf))
return (ISC_R_NOSPACE);
cp = numbuf;
@@ -746,8 +810,8 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
ISC_LIST_INIT(head);
target_mem = isc_mem_get(lctx->mctx, target_size);
- rhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_BUFSZ);
- lhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_BUFSZ);
+ rhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_RHS);
+ lhsbuf = isc_mem_get(lctx->mctx, DNS_MASTER_LHS);
if (target_mem == NULL || rhsbuf == NULL || lhsbuf == NULL) {
result = ISC_R_NOMEMORY;
goto error_cleanup;
@@ -778,35 +842,13 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
goto insist_cleanup;
}
- switch (type) {
- case dns_rdatatype_ns:
- case dns_rdatatype_ptr:
- case dns_rdatatype_cname:
- case dns_rdatatype_dname:
- break;
-
- case dns_rdatatype_a:
- case dns_rdatatype_aaaa:
- if (lctx->zclass == dns_rdataclass_in ||
- lctx->zclass == dns_rdataclass_ch ||
- lctx->zclass == dns_rdataclass_hs)
- break;
- /* FALLTHROUGH */
- default:
- (*callbacks->error)(callbacks,
- "%s: %s:%lu: unsupported type '%s'",
- "$GENERATE", source, line, gtype);
- result = ISC_R_NOTIMPLEMENTED;
- goto error_cleanup;
- }
-
ISC_LIST_INIT(rdatalist.rdata);
ISC_LINK_INIT(&rdatalist, link);
for (i = start; i <= stop; i += step) {
- result = genname(lhs, i, lhsbuf, DNS_MASTER_BUFSZ);
+ result = genname(lhs, i, lhsbuf, DNS_MASTER_LHS);
if (result != ISC_R_SUCCESS)
goto error_cleanup;
- result = genname(rhs, i, rhsbuf, DNS_MASTER_BUFSZ);
+ result = genname(rhs, i, rhsbuf, DNS_MASTER_RHS);
if (result != ISC_R_SUCCESS)
goto error_cleanup;
@@ -820,6 +862,7 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
if ((lctx->options & DNS_MASTER_ZONE) != 0 &&
(lctx->options & DNS_MASTER_SLAVE) == 0 &&
+ (lctx->options & DNS_MASTER_KEY) == 0 &&
!dns_name_issubdomain(owner, lctx->top))
{
char namebuf[DNS_NAME_FORMATSIZE];
@@ -880,9 +923,9 @@ generate(dns_loadctx_t *lctx, char *range, char *lhs, char *gtype, char *rhs,
if (target_mem != NULL)
isc_mem_put(lctx->mctx, target_mem, target_size);
if (lhsbuf != NULL)
- isc_mem_put(lctx->mctx, lhsbuf, DNS_MASTER_BUFSZ);
+ isc_mem_put(lctx->mctx, lhsbuf, DNS_MASTER_LHS);
if (rhsbuf != NULL)
- isc_mem_put(lctx->mctx, rhsbuf, DNS_MASTER_BUFSZ);
+ isc_mem_put(lctx->mctx, rhsbuf, DNS_MASTER_RHS);
return (result);
}
@@ -1270,7 +1313,8 @@ load_text(dns_loadctx_t *lctx) {
goto log_and_cleanup;
}
/* RHS */
- GETTOKEN(lctx->lex, 0, &token, ISC_FALSE);
+ GETTOKEN(lctx->lex, ISC_LEXOPT_QSTRING,
+ &token, ISC_FALSE);
rhs = isc_mem_strdup(mctx, DNS_AS_STR(token));
if (rhs == NULL) {
result = ISC_R_NOMEMORY;
@@ -1338,7 +1382,7 @@ load_text(dns_loadctx_t *lctx) {
isc_buffer_setactive(&buffer,
token.value.as_region.length);
result = dns_name_fromtext(new_name, &buffer,
- ictx->origin, ISC_FALSE, NULL);
+ ictx->origin, 0, NULL);
if (MANYERRS(lctx, result)) {
SETRESULT(lctx, result);
LOGIT(result);
@@ -1459,6 +1503,7 @@ load_text(dns_loadctx_t *lctx) {
}
if ((lctx->options & DNS_MASTER_ZONE) != 0 &&
(lctx->options & DNS_MASTER_SLAVE) == 0 &&
+ (lctx->options & DNS_MASTER_KEY) == 0 &&
!dns_name_issubdomain(new_name, lctx->top))
{
char namebuf[DNS_NAME_FORMATSIZE];
diff --git a/contrib/bind9/lib/dns/masterdump.c b/contrib/bind9/lib/dns/masterdump.c
index 34c984b..e2adf9b 100644
--- a/contrib/bind9/lib/dns/masterdump.c
+++ b/contrib/bind9/lib/dns/masterdump.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: masterdump.c,v 1.94.50.3.18.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: masterdump.c,v 1.99.328.3 2011-06-21 20:15:47 each Exp $ */
/*! \file */
@@ -42,6 +42,7 @@
#include <dns/log.h>
#include <dns/master.h>
#include <dns/masterdump.h>
+#include <dns/ncache.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
#include <dns/rdataset.h>
@@ -60,6 +61,11 @@
return (_r); \
} while (0)
+#define CHECK(x) do { \
+ if ((x) != ISC_R_SUCCESS) \
+ goto cleanup; \
+ } while (0)
+
struct dns_master_style {
unsigned int flags; /* DNS_STYLEFLAG_* */
unsigned int ttl_column;
@@ -156,6 +162,7 @@ static char spaces[N_SPACES+1] = " ";
#define N_TABS 10
static char tabs[N_TABS+1] = "\t\t\t\t\t\t\t\t\t\t";
+#ifdef BIND9
struct dns_dumpctx {
unsigned int magic;
isc_mem_t *mctx;
@@ -183,6 +190,7 @@ struct dns_dumpctx {
dns_totext_ctx_t *ctx,
isc_buffer_t *buffer, FILE *f);
};
+#endif /* BIND9 */
#define NXDOMAIN(x) (((x)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
@@ -336,6 +344,52 @@ str_totext(const char *source, isc_buffer_t *target) {
return (ISC_R_SUCCESS);
}
+static isc_result_t
+ncache_summary(dns_rdataset_t *rdataset, isc_boolean_t omit_final_dot,
+ isc_buffer_t *target)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_rdataset_t rds;
+ dns_name_t name;
+
+ dns_rdataset_init(&rds);
+ dns_name_init(&name, NULL);
+
+ do {
+ dns_ncache_current(rdataset, &name, &rds);
+ for (result = dns_rdataset_first(&rds);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rds)) {
+ CHECK(str_totext("; ", target));
+ CHECK(dns_name_totext(&name, omit_final_dot, target));
+ CHECK(str_totext(" ", target));
+ CHECK(dns_rdatatype_totext(rds.type, target));
+ if (rds.type == dns_rdatatype_rrsig) {
+ CHECK(str_totext(" ", target));
+ CHECK(dns_rdatatype_totext(rds.covers, target));
+ CHECK(str_totext(" ...\n", target));
+ } else {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rds, &rdata);
+ CHECK(str_totext(" ", target));
+ CHECK(dns_rdata_tofmttext(&rdata, dns_rootname,
+ 0, 0, " ", target));
+ CHECK(str_totext("\n", target));
+ }
+ }
+ dns_rdataset_disassociate(&rds);
+ result = dns_rdataset_next(rdataset);
+ } while (result == ISC_R_SUCCESS);
+
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ cleanup:
+ if (dns_rdataset_isassociated(&rds))
+ dns_rdataset_disassociate(&rds);
+
+ return (result);
+}
+
/*
* Convert 'rdataset' to master file text format according to 'ctx',
* storing the result in 'target'. If 'owner_name' is NULL, it
@@ -356,6 +410,7 @@ rdataset_totext(dns_rdataset_t *rdataset,
isc_uint32_t current_ttl;
isc_boolean_t current_ttl_valid;
dns_rdatatype_t type;
+ unsigned int type_start;
REQUIRE(DNS_RDATASET_VALID(rdataset));
@@ -437,33 +492,37 @@ rdataset_totext(dns_rdataset_t *rdataset,
* Type.
*/
- if (rdataset->type == 0) {
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) {
type = rdataset->covers;
} else {
type = rdataset->type;
}
- {
- unsigned int type_start;
- INDENT_TO(type_column);
- type_start = target->used;
- if (rdataset->type == 0)
- RETERR(str_totext("\\-", target));
- result = dns_rdatatype_totext(type, target);
- if (result != ISC_R_SUCCESS)
- return (result);
- column += (target->used - type_start);
- }
+ INDENT_TO(type_column);
+ type_start = target->used;
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
+ RETERR(str_totext("\\-", target));
+ result = dns_rdatatype_totext(type, target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ column += (target->used - type_start);
/*
* Rdata.
*/
INDENT_TO(rdata_column);
- if (rdataset->type == 0) {
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) {
if (NXDOMAIN(rdataset))
RETERR(str_totext(";-$NXDOMAIN\n", target));
else
RETERR(str_totext(";-$NXRRSET\n", target));
+ /*
+ * Print a summary of the cached records which make
+ * up the negative response.
+ */
+ RETERR(ncache_summary(rdataset, omit_final_dot,
+ target));
+ break;
} else {
dns_rdata_t rdata = DNS_RDATA_INIT;
isc_region_t r;
@@ -639,6 +698,7 @@ dns_master_questiontotext(dns_name_t *owner_name,
ISC_FALSE, target));
}
+#ifdef BIND9
/*
* Print an rdataset. 'buffer' is a scratch buffer, which must have been
* dynamically allocated by the caller. It must be large enough to
@@ -814,7 +874,7 @@ dump_rdatasets_text(isc_mem_t *mctx, dns_name_t *name,
if (ctx->style.flags & DNS_STYLEFLAG_TRUST) {
fprintf(f, "; %s\n", dns_trust_totext(rds->trust));
}
- if (rds->type == 0 &&
+ if (((rds->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) &&
(ctx->style.flags & DNS_STYLEFLAG_NCACHE) == 0) {
/* Omit negative cache entries */
} else {
@@ -979,7 +1039,7 @@ dump_rdatasets_raw(isc_mem_t *mctx, dns_name_t *name,
dns_rdataset_init(&rdataset);
dns_rdatasetiter_current(rdsiter, &rdataset);
- if (rdataset.type == 0 &&
+ if (((rdataset.attributes & DNS_RDATASETATTR_NEGATIVE) != 0) &&
(ctx->style.flags & DNS_STYLEFLAG_NCACHE) == 0) {
/* Omit negative cache entries */
} else {
@@ -1694,6 +1754,7 @@ dns_master_dumpnode(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version,
return (result);
}
+#endif /* BIND9 */
isc_result_t
dns_master_stylecreate(dns_master_style_t **stylep, unsigned int flags,
diff --git a/contrib/bind9/lib/dns/message.c b/contrib/bind9/lib/dns/message.c
index 4a01178e..b58c139 100644
--- a/contrib/bind9/lib/dns/message.c
+++ b/contrib/bind9/lib/dns/message.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: message.c,v 1.245.50.7 2010-06-03 05:29:03 marka Exp $ */
+/* $Id: message.c,v 1.254.186.3 2011-06-21 20:15:47 each Exp $ */
/*! \file */
@@ -1804,6 +1804,36 @@ wrong_priority(dns_rdataset_t *rds, int pass, dns_rdatatype_t preferred_glue) {
return (ISC_TRUE);
}
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+/*
+ * Decide whether to not answer with an AAAA record and its RRSIG
+ */
+static inline isc_boolean_t
+norender_rdataset(const dns_rdataset_t *rdataset, unsigned int options)
+{
+ switch (rdataset->type) {
+ case dns_rdatatype_aaaa:
+ if ((options & DNS_MESSAGERENDER_FILTER_AAAA) == 0)
+ return (ISC_FALSE);
+ break;
+
+ case dns_rdatatype_rrsig:
+ if ((options & DNS_MESSAGERENDER_FILTER_AAAA) == 0 ||
+ rdataset->covers != dns_rdatatype_aaaa)
+ return (ISC_FALSE);
+ break;
+
+ default:
+ return (ISC_FALSE);
+ }
+
+ if (rdataset->rdclass != dns_rdataclass_in)
+ return (ISC_FALSE);
+
+ return (ISC_TRUE);
+}
+
+#endif
isc_result_t
dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
unsigned int options)
@@ -1931,6 +1961,23 @@ dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
preferred_glue))
goto next;
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ /*
+ * Suppress AAAAs if asked and we are
+ * not doing DNSSEC or are breaking DNSSEC.
+ * Say so in the AD bit if we break DNSSEC.
+ */
+ if (norender_rdataset(rdataset, options) &&
+ sectionid != DNS_SECTION_QUESTION) {
+ if (sectionid == DNS_SECTION_ANSWER ||
+ sectionid == DNS_SECTION_AUTHORITY)
+ msg->flags &= ~DNS_MESSAGEFLAG_AD;
+ if (OPTOUT(rdataset))
+ msg->flags &= ~DNS_MESSAGEFLAG_AD;
+ goto next;
+ }
+
+#endif
st = *(msg->buffer);
count = 0;
@@ -2469,7 +2516,7 @@ dns_message_peekheader(isc_buffer_t *source, dns_messageid_t *idp,
isc_result_t
dns_message_reply(dns_message_t *msg, isc_boolean_t want_question_section) {
- unsigned int first_section;
+ unsigned int clear_after;
isc_result_t result;
REQUIRE(DNS_MESSAGE_VALID(msg));
@@ -2481,15 +2528,15 @@ dns_message_reply(dns_message_t *msg, isc_boolean_t want_question_section) {
msg->opcode != dns_opcode_notify)
want_question_section = ISC_FALSE;
if (msg->opcode == dns_opcode_update)
- first_section = DNS_SECTION_ADDITIONAL;
+ clear_after = DNS_SECTION_PREREQUISITE;
else if (want_question_section) {
if (!msg->question_ok)
return (DNS_R_FORMERR);
- first_section = DNS_SECTION_ANSWER;
+ clear_after = DNS_SECTION_ANSWER;
} else
- first_section = DNS_SECTION_QUESTION;
+ clear_after = DNS_SECTION_QUESTION;
msg->from_to_wire = DNS_MESSAGE_INTENTRENDER;
- msgresetnames(msg, first_section);
+ msgresetnames(msg, clear_after);
msgresetopt(msg);
msgresetsigs(msg, ISC_TRUE);
msginitprivate(msg);
@@ -3071,6 +3118,7 @@ dns_message_sectiontotext(dns_message_t *msg, dns_section_t section,
dns_name_t *name, empty_name;
dns_rdataset_t *rdataset;
isc_result_t result;
+ isc_boolean_t seensoa = ISC_FALSE;
REQUIRE(DNS_MESSAGE_VALID(msg));
REQUIRE(target != NULL);
@@ -3100,6 +3148,15 @@ dns_message_sectiontotext(dns_message_t *msg, dns_section_t section,
for (rdataset = ISC_LIST_HEAD(name->list);
rdataset != NULL;
rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (section == DNS_SECTION_ANSWER &&
+ rdataset->type == dns_rdatatype_soa) {
+ if ((flags & DNS_MESSAGETEXTFLAG_OMITSOA) != 0)
+ continue;
+ if (seensoa &&
+ (flags & DNS_MESSAGETEXTFLAG_ONESOA) != 0)
+ continue;
+ seensoa = ISC_TRUE;
+ }
if (section == DNS_SECTION_QUESTION) {
ADD_STRING(target, ";");
result = dns_master_questiontotext(name,
diff --git a/contrib/bind9/lib/dns/name.c b/contrib/bind9/lib/dns/name.c
index 80864b8..f88f281 100644
--- a/contrib/bind9/lib/dns/name.c
+++ b/contrib/bind9/lib/dns/name.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: name.c,v 1.165.120.3 2010-07-09 05:15:05 each Exp $ */
+/* $Id: name.c,v 1.174 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -34,6 +34,7 @@
#include <isc/util.h>
#include <dns/compress.h>
+#include <dns/fixedname.h>
#include <dns/name.h>
#include <dns/result.h>
@@ -1018,10 +1019,9 @@ dns_name_toregion(dns_name_t *name, isc_region_t *r) {
DNS_NAME_TOREGION(name, r);
}
-
isc_result_t
dns_name_fromtext(dns_name_t *name, isc_buffer_t *source,
- dns_name_t *origin, unsigned int options,
+ const dns_name_t *origin, unsigned int options,
isc_buffer_t *target)
{
unsigned char *ndata, *label;
@@ -2360,6 +2360,75 @@ dns_name_format(dns_name_t *name, char *cp, unsigned int size) {
snprintf(cp, size, "<unknown>");
}
+/*
+ * dns_name_tostring() -- similar to dns_name_format() but allocates its own
+ * memory.
+ */
+isc_result_t
+dns_name_tostring(dns_name_t *name, char **target, isc_mem_t *mctx) {
+ isc_result_t result;
+ isc_buffer_t buf;
+ isc_region_t reg;
+ char *p, txt[DNS_NAME_FORMATSIZE];
+
+ REQUIRE(VALID_NAME(name));
+ REQUIRE(target != NULL && *target == NULL);
+
+ isc_buffer_init(&buf, txt, sizeof(txt));
+ result = dns_name_totext(name, ISC_FALSE, &buf);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ isc_buffer_usedregion(&buf, &reg);
+ p = isc_mem_allocate(mctx, reg.length + 1);
+ memcpy(p, (char *) reg.base, (int) reg.length);
+ p[reg.length] = '\0';
+
+ *target = p;
+ return (ISC_R_SUCCESS);
+}
+
+/*
+ * dns_name_fromstring() -- convert directly from a string to a name,
+ * allocating memory as needed
+ */
+isc_result_t
+dns_name_fromstring(dns_name_t *target, const char *src, unsigned int options,
+ isc_mem_t *mctx)
+{
+ return (dns_name_fromstring2(target, src, dns_rootname, options, mctx));
+}
+
+isc_result_t
+dns_name_fromstring2(dns_name_t *target, const char *src,
+ const dns_name_t *origin, unsigned int options,
+ isc_mem_t *mctx)
+{
+ isc_result_t result;
+ isc_buffer_t buf;
+ dns_fixedname_t fn;
+ dns_name_t *name;
+
+ REQUIRE(src != NULL);
+
+ isc_buffer_init(&buf, src, strlen(src));
+ isc_buffer_add(&buf, strlen(src));
+ if (BINDABLE(target) && target->buffer != NULL)
+ name = target;
+ else {
+ dns_fixedname_init(&fn);
+ name = dns_fixedname_name(&fn);
+ }
+
+ result = dns_name_fromtext(name, &buf, origin, options, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (name != target)
+ result = dns_name_dupwithoffsets(name, mctx, target);
+ return (result);
+}
+
isc_result_t
dns_name_copy(dns_name_t *source, dns_name_t *dest, isc_buffer_t *target) {
unsigned char *ndata;
diff --git a/contrib/bind9/lib/dns/ncache.c b/contrib/bind9/lib/dns/ncache.c
index cfa4783..420a118 100644
--- a/contrib/bind9/lib/dns/ncache.c
+++ b/contrib/bind9/lib/dns/ncache.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ncache.c,v 1.43.48.7.6.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: ncache.c,v 1.50.124.1.2.3 2011-06-21 20:15:47 each Exp $ */
/*! \file */
@@ -35,7 +35,7 @@
#define DNS_NCACHE_RDATA 20U
/*
- * The format of an ncache rdata is a sequence of one or more records of
+ * The format of an ncache rdata is a sequence of zero or more records of
* the following format:
*
* owner name
@@ -223,42 +223,6 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache,
return (result);
if (trust == 0xffff) {
- /*
- * We didn't find any authority data from which to create a
- * negative cache rdataset. In particular, we have no SOA.
- *
- * We trust that the caller wants negative caching, so this
- * means we have a "type 3 nxdomain" or "type 3 nodata"
- * response (see RFC2308 for details).
- *
- * We will now build a suitable negative cache rdataset that
- * will cause zero bytes to be emitted when converted to
- * wire format.
- */
-
- /*
- * The ownername must exist, but it doesn't matter what value
- * it has. We use the root name.
- */
- dns_name_toregion(dns_rootname, &r);
- result = isc_buffer_copyregion(&buffer, &r);
- if (result != ISC_R_SUCCESS)
- return (result);
- /*
- * Copy the type and a zero rdata count to the buffer.
- */
- isc_buffer_availableregion(&buffer, &r);
- if (r.length < 5)
- return (ISC_R_NOSPACE);
- isc_buffer_putuint16(&buffer, 0); /* type */
- /*
- * RFC2308, section 5, says that negative answers without
- * SOAs should not be cached.
- */
- ttl = 0;
- /*
- * Set trust.
- */
if ((message->flags & DNS_MESSAGEFLAG_AA) != 0 &&
message->counts[DNS_SECTION_ANSWER] == 0) {
/*
@@ -268,22 +232,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache,
trust = dns_trust_authauthority;
} else
trust = dns_trust_additional;
- isc_buffer_putuint8(&buffer, (unsigned char)trust); /* trust */
- isc_buffer_putuint16(&buffer, 0); /* count */
-
- /*
- * Now add it to the cache.
- */
- if (next >= DNS_NCACHE_RDATA)
- return (ISC_R_NOSPACE);
- dns_rdata_init(&rdata[next]);
- isc_buffer_remainingregion(&buffer, &r);
- rdata[next].data = r.base;
- rdata[next].length = r.length;
- rdata[next].rdclass = ncrdatalist.rdclass;
- rdata[next].type = 0;
- rdata[next].flags = 0;
- ISC_LIST_APPEND(ncrdatalist.rdata, &rdata[next], link);
+ ttl = 0;
}
INSIST(trust != 0xffff);
@@ -294,6 +243,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache,
RUNTIME_CHECK(dns_rdatalist_tordataset(&ncrdatalist, &ncrdataset)
== ISC_R_SUCCESS);
ncrdataset.trust = trust;
+ ncrdataset.attributes |= DNS_RDATASETATTR_NEGATIVE;
if (message->rcode == dns_rcode_nxdomain)
ncrdataset.attributes |= DNS_RDATASETATTR_NXDOMAIN;
if (optout)
@@ -324,6 +274,7 @@ dns_ncache_towire(dns_rdataset_t *rdataset, dns_compress_t *cctx,
REQUIRE(rdataset != NULL);
REQUIRE(rdataset->type == 0);
+ REQUIRE((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
savedbuffer = *target;
count = 0;
@@ -552,6 +503,7 @@ dns_ncache_getrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name,
REQUIRE(ncacherdataset != NULL);
REQUIRE(ncacherdataset->type == 0);
+ REQUIRE((ncacherdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
REQUIRE(name != NULL);
REQUIRE(!dns_rdataset_isassociated(rdataset));
REQUIRE(type != dns_rdatatype_rrsig);
@@ -628,6 +580,7 @@ dns_ncache_getsigrdataset(dns_rdataset_t *ncacherdataset, dns_name_t *name,
REQUIRE(ncacherdataset != NULL);
REQUIRE(ncacherdataset->type == 0);
+ REQUIRE((ncacherdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
REQUIRE(name != NULL);
REQUIRE(!dns_rdataset_isassociated(rdataset));
@@ -727,6 +680,7 @@ dns_ncache_current(dns_rdataset_t *ncacherdataset, dns_name_t *found,
REQUIRE(ncacherdataset != NULL);
REQUIRE(ncacherdataset->type == 0);
+ REQUIRE((ncacherdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0);
REQUIRE(found != NULL);
REQUIRE(!dns_rdataset_isassociated(rdataset));
diff --git a/contrib/bind9/lib/dns/nsec.c b/contrib/bind9/lib/dns/nsec.c
index 7d93ecc..94c5163 100644
--- a/contrib/bind9/lib/dns/nsec.c
+++ b/contrib/bind9/lib/dns/nsec.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec.c,v 1.11.48.2 2009-01-06 23:47:26 tbox Exp $ */
+/* $Id: nsec.c,v 1.13 2009-01-06 23:47:57 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/nsec3.c b/contrib/bind9/lib/dns/nsec3.c
index 9c85781..e75e744 100644
--- a/contrib/bind9/lib/dns/nsec3.c
+++ b/contrib/bind9/lib/dns/nsec3.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2008, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2006, 2008-2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3.c,v 1.6.12.4 2009-11-03 23:47:46 tbox Exp $ */
+/* $Id: nsec3.c,v 1.19.96.1 2011-06-21 20:15:48 each Exp $ */
#include <config.h>
@@ -28,6 +28,8 @@
#include <dst/dst.h>
#include <dns/db.h>
+#include <dns/zone.h>
+#include <dns/compress.h>
#include <dns/dbiterator.h>
#include <dns/diff.h>
#include <dns/fixedname.h>
@@ -472,7 +474,6 @@ delete(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
return (result);
}
-#ifndef RFC5155_STRICT
static isc_boolean_t
better_param(dns_rdataset_t *nsec3paramset, dns_rdata_t *param) {
dns_rdataset_t rdataset;
@@ -487,7 +488,17 @@ better_param(dns_rdataset_t *nsec3paramset, dns_rdata_t *param) {
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdataset_current(&rdataset, &rdata);
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ if (rdataset.type != dns_rdatatype_nsec3param) {
+ dns_rdata_t tmprdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &tmprdata);
+ if (!dns_nsec3param_fromprivate(&tmprdata, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ } else
+ dns_rdataset_current(&rdataset, &rdata);
+
if (rdata.length != param->length)
continue;
if (rdata.data[0] != param->data[0] ||
@@ -505,7 +516,6 @@ better_param(dns_rdataset_t *nsec3paramset, dns_rdata_t *param) {
dns_rdataset_disassociate(&rdataset);
return (ISC_FALSE);
}
-#endif
static isc_result_t
find_nsec3(dns_rdata_nsec3_t *nsec3, dns_rdataset_t *rdataset,
@@ -548,7 +558,7 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
dns_rdataset_t rdataset;
int pass;
isc_boolean_t exists;
- isc_boolean_t remove_unsecure = ISC_FALSE;
+ isc_boolean_t maybe_remove_unsecure = ISC_FALSE;
isc_uint8_t flags;
isc_buffer_t buffer;
isc_result_t result;
@@ -629,8 +639,12 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
*/
if (!unsecure)
goto addnsec3;
- else
- remove_unsecure = ISC_TRUE;
+ else if (CREATE(nsec3param->flags) && OPTOUT(flags)) {
+ result = dns_nsec3_delnsec3(db, version, name,
+ nsec3param, diff);
+ goto failure;
+ } else
+ maybe_remove_unsecure = ISC_TRUE;
} else {
dns_rdataset_disassociate(&rdataset);
if (result != ISC_R_NOMORE)
@@ -666,26 +680,19 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version,
if (result != ISC_R_SUCCESS)
goto failure;
- if (remove_unsecure) {
+ if (maybe_remove_unsecure) {
dns_rdataset_disassociate(&rdataset);
/*
- * We have found the previous NSEC3 record and can now
- * see if the existing NSEC3 record needs to be
- * updated or deleted.
+ * If we have OPTOUT set in the previous NSEC3 record
+ * we actually need to delete the NSEC3 record.
+ * Otherwise we just need to replace the NSEC3 record.
*/
- if (!OPTOUT(nsec3.flags)) {
- /*
- * Just update the NSEC3 record.
- */
- goto addnsec3;
- } else {
- /*
- * This is actually a deletion not a add.
- */
+ if (OPTOUT(nsec3.flags)) {
result = dns_nsec3_delnsec3(db, version, name,
nsec3param, diff);
goto failure;
}
+ goto addnsec3;
} else {
/*
* Is this is a unsecure delegation we are adding?
@@ -928,17 +935,323 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_current(&rdataset, &rdata);
- dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
+
+ if (nsec3param.flags != 0)
+ continue;
+ /*
+ * We have a active chain. Update it.
+ */
+ CHECK(dns_nsec3_addnsec3(db, version, name, &nsec3param,
+ nsecttl, unsecure, diff));
+ }
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+
+ return (result);
+}
+
+isc_boolean_t
+dns_nsec3param_fromprivate(dns_rdata_t *src, dns_rdata_t *target,
+ unsigned char *buf, size_t buflen)
+{
+ dns_decompress_t dctx;
+ isc_result_t result;
+ isc_buffer_t buf1;
+ isc_buffer_t buf2;
+
+ /*
+ * Algorithm 0 (reserved by RFC 4034) is used to identify
+ * NSEC3PARAM records from DNSKEY pointers.
+ */
+ if (src->length < 1 || src->data[0] != 0)
+ return (ISC_FALSE);
+
+ isc_buffer_init(&buf1, src->data + 1, src->length - 1);
+ isc_buffer_add(&buf1, src->length - 1);
+ isc_buffer_setactive(&buf1, src->length - 1);
+ isc_buffer_init(&buf2, buf, buflen);
+ dns_decompress_init(&dctx, -1, DNS_DECOMPRESS_NONE);
+ result = dns_rdata_fromwire(target, src->rdclass,
+ dns_rdatatype_nsec3param,
+ &buf1, &dctx, 0, &buf2);
+ dns_decompress_invalidate(&dctx);
+
+ return (ISC_TF(result == ISC_R_SUCCESS));
+}
+
+void
+dns_nsec3param_toprivate(dns_rdata_t *src, dns_rdata_t *target,
+ dns_rdatatype_t privatetype,
+ unsigned char *buf, size_t buflen)
+{
+ REQUIRE(buflen >= src->length + 1);
+
+ REQUIRE(DNS_RDATA_INITIALIZED(target));
+
+ memcpy(buf + 1, src->data, src->length);
+ buf[0] = 0;
+ target->data = buf;
+ target->length = src->length + 1;
+ target->type = privatetype;
+ target->rdclass = src->rdclass;
+ target->flags = 0;
+ ISC_LINK_INIT(target, link);
+}
+
+#ifdef BIND9
+static isc_result_t
+rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
+ const dns_rdata_t *rdata, isc_boolean_t *flag)
+{
+ dns_rdataset_t rdataset;
+ dns_dbnode_t *node = NULL;
+ isc_result_t result;
+
+ dns_rdataset_init(&rdataset);
+ if (rdata->type == dns_rdatatype_nsec3)
+ CHECK(dns_db_findnsec3node(db, name, ISC_FALSE, &node));
+ else
+ CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
+ result = dns_db_findrdataset(db, node, ver, rdata->type, 0,
+ (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ goto failure;
+ }
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t myrdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &myrdata);
+ if (!dns_rdata_casecompare(&myrdata, rdata))
+ break;
+ }
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_SUCCESS) {
+ *flag = ISC_TRUE;
+ } else if (result == ISC_R_NOMORE) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ }
+
+ failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+#endif
+
+#ifdef BIND9
+isc_result_t
+dns_nsec3param_deletechains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_zone_t *zone, dns_diff_t *diff)
+{
+ dns_dbnode_t *node = NULL;
+ dns_difftuple_t *tuple = NULL;
+ dns_name_t next;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_t rdataset;
+ isc_boolean_t flag;
+ isc_result_t result = ISC_R_SUCCESS;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE + 1];
+ dns_name_t *origin = dns_zone_getorigin(zone);
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
+
+ dns_name_init(&next, NULL);
+ dns_rdataset_init(&rdataset);
+
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * Cause all NSEC3 chains to be deleted.
+ */
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
+ 0, (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t private = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &rdata);
+
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL, origin,
+ rdataset.ttl, &rdata, &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+
+ dns_nsec3param_toprivate(&rdata, &private, privatetype,
+ buf, sizeof(buf));
+ buf[2] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
+
+ CHECK(rr_exists(db, ver, origin, &private, &flag));
+
+ if (!flag) {
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
+ origin, 0, &private,
+ &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+ }
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (privatetype == 0)
+ goto success;
+ result = dns_db_findrdataset(db, node, ver, privatetype, 0,
+ (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto success;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdataset_current(&rdataset, &rdata);
+ INSIST(rdata.length <= sizeof(buf));
+ memcpy(buf, rdata.data, rdata.length);
+
+ if (buf[0] != 0 ||
+ buf[2] == (DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC)) {
+ dns_rdata_reset(&rdata);
+ continue;
+ }
+
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL, origin,
+ 0, &rdata, &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+
+ rdata.data = buf;
+ buf[2] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
+
+ CHECK(rr_exists(db, ver, origin, &rdata, &flag));
+
+ if (!flag) {
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
+ origin, 0, &rdata, &tuple));
+ CHECK(do_one_tuple(&tuple, db, ver, diff));
+ INSIST(tuple == NULL);
+ }
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+ success:
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+#endif
+
+isc_result_t
+dns_nsec3_addnsec3sx(dns_db_t *db, dns_dbversion_t *version,
+ dns_name_t *name, dns_ttl_t nsecttl,
+ isc_boolean_t unsecure, dns_rdatatype_t type,
+ dns_diff_t *diff)
+{
+ dns_dbnode_t *node = NULL;
+ dns_rdata_nsec3param_t nsec3param;
+ dns_rdataset_t rdataset;
+ dns_rdataset_t prdataset;
+ isc_result_t result;
+
+ dns_rdataset_init(&rdataset);
+ dns_rdataset_init(&prdataset);
+
+ /*
+ * Find the NSEC3 parameters for this zone.
+ */
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = dns_db_findrdataset(db, node, version, type, 0, 0,
+ &prdataset, NULL);
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_nsec3param, 0, 0,
+ &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ /*
+ * Update each active NSEC3 chain.
+ */
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &rdata);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
-#ifdef RFC5155_STRICT
if (nsec3param.flags != 0)
continue;
-#else
+
+ /*
+ * We have a active chain. Update it.
+ */
+ CHECK(dns_nsec3_addnsec3(db, version, name, &nsec3param,
+ nsecttl, unsecure, diff));
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (!dns_rdataset_isassociated(&prdataset))
+ goto success;
+ /*
+ * Update each active NSEC3 chain.
+ */
+ for (result = dns_rdataset_first(&prdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&prdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ dns_rdataset_current(&prdataset, &rdata1);
+ if (!dns_nsec3param_fromprivate(&rdata1, &rdata2,
+ buf, sizeof(buf)))
+ continue;
+ CHECK(dns_rdata_tostruct(&rdata2, &nsec3param, NULL));
+
if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
continue;
- if (better_param(&rdataset, &rdata))
+ if (better_param(&prdataset, &rdata2))
continue;
-#endif
/*
* We have a active chain. Update it.
@@ -947,11 +1260,13 @@ dns_nsec3_addnsec3s(dns_db_t *db, dns_dbversion_t *version,
nsecttl, unsecure, diff));
}
if (result == ISC_R_NOMORE)
+ success:
result = ISC_R_SUCCESS;
-
failure:
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
+ if (dns_rdataset_isassociated(&prdataset))
+ dns_rdataset_disassociate(&prdataset);
if (node != NULL)
dns_db_detachnode(db, &node);
@@ -1120,6 +1435,8 @@ dns_nsec3_delnsec3(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
*/
nsec3.next = nexthash;
nsec3.next_length = next_length;
+ if (CREATE(nsec3param->flags))
+ nsec3.flags = nsec3param->flags & DNS_NSEC3FLAG_OPTOUT;
isc_buffer_init(&buffer, nsec3buf, sizeof(nsec3buf));
CHECK(dns_rdata_fromstruct(&rdata, rdataset.rdclass,
dns_rdatatype_nsec3, &nsec3,
@@ -1257,6 +1574,13 @@ isc_result_t
dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
dns_diff_t *diff)
{
+ return (dns_nsec3_delnsec3sx(db, version, name, 0, diff));
+}
+
+isc_result_t
+dns_nsec3_delnsec3sx(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
+ dns_rdatatype_t privatetype, dns_diff_t *diff)
+{
dns_dbnode_t *node = NULL;
dns_rdata_nsec3param_t nsec3param;
dns_rdataset_t rdataset;
@@ -1274,11 +1598,10 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3param, 0, 0,
&rdataset, NULL);
- dns_db_detachnode(db, &node);
if (result == ISC_R_NOTFOUND)
- return (ISC_R_SUCCESS);
+ goto try_private;
if (result != ISC_R_SUCCESS)
- return (result);
+ goto failure;
/*
* Update each active NSEC3 chain.
@@ -1289,17 +1612,47 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_current(&rdataset, &rdata);
- dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
-#ifdef RFC5155_STRICT
if (nsec3param.flags != 0)
continue;
-#else
+ /*
+ * We have a active chain. Update it.
+ */
+ CHECK(dns_nsec3_delnsec3(db, version, name, &nsec3param, diff));
+ }
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+ if (privatetype == 0)
+ goto success;
+ result = dns_db_findrdataset(db, node, version, privatetype, 0, 0,
+ &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto success;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ /*
+ * Update each NSEC3 chain being built.
+ */
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ dns_rdataset_current(&rdataset, &rdata1);
+ if (!dns_nsec3param_fromprivate(&rdata1, &rdata2,
+ buf, sizeof(buf)))
+ continue;
+ CHECK(dns_rdata_tostruct(&rdata2, &nsec3param, NULL));
+
if ((nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0)
continue;
- if (better_param(&rdataset, &rdata))
+ if (better_param(&rdataset, &rdata2))
continue;
-#endif
/*
* We have a active chain. Update it.
@@ -1307,6 +1660,7 @@ dns_nsec3_delnsec3s(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
CHECK(dns_nsec3_delnsec3(db, version, name, &nsec3param, diff));
}
if (result == ISC_R_NOMORE)
+ success:
result = ISC_R_SUCCESS;
failure:
@@ -1322,6 +1676,14 @@ isc_result_t
dns_nsec3_active(dns_db_t *db, dns_dbversion_t *version,
isc_boolean_t complete, isc_boolean_t *answer)
{
+ return (dns_nsec3_activex(db, version, complete, 0, answer));
+}
+
+isc_result_t
+dns_nsec3_activex(dns_db_t *db, dns_dbversion_t *version,
+ isc_boolean_t complete, dns_rdatatype_t privatetype,
+ isc_boolean_t *answer)
+{
dns_dbnode_t *node = NULL;
dns_rdataset_t rdataset;
dns_rdata_nsec3param_t nsec3param;
@@ -1338,34 +1700,78 @@ dns_nsec3_active(dns_db_t *db, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version,
dns_rdatatype_nsec3param, 0, 0,
&rdataset, NULL);
- dns_db_detachnode(db, &node);
+ if (result == ISC_R_NOTFOUND)
+ goto try_private;
+
+ if (result != ISC_R_SUCCESS) {
+ dns_db_detachnode(db, &node);
+ return (result);
+ }
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ if (nsec3param.flags == 0)
+ break;
+ }
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_SUCCESS) {
+ dns_db_detachnode(db, &node);
+ *answer = ISC_TRUE;
+ return (ISC_R_SUCCESS);
+ }
+ if (result == ISC_R_NOMORE)
+ *answer = ISC_FALSE;
+
+ try_private:
+ if (privatetype == 0 || complete) {
+ *answer = ISC_FALSE;
+ return (ISC_R_SUCCESS);
+ }
+ result = dns_db_findrdataset(db, node, version, privatetype, 0, 0,
+ &rdataset, NULL);
+
+ dns_db_detachnode(db, &node);
if (result == ISC_R_NOTFOUND) {
*answer = ISC_FALSE;
return (ISC_R_SUCCESS);
}
if (result != ISC_R_SUCCESS)
return (result);
+
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
- dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
- dns_rdataset_current(&rdataset, &rdata);
- result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ dns_rdataset_current(&rdataset, &rdata1);
+ if (!dns_nsec3param_fromprivate(&rdata1, &rdata2,
+ buf, sizeof(buf)))
+ continue;
+ result = dns_rdata_tostruct(&rdata2, &nsec3param, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if ((nsec3param.flags) == 0 ||
- (!complete && CREATE(nsec3param.flags)))
+ if (!complete && CREATE(nsec3param.flags))
break;
}
dns_rdataset_disassociate(&rdataset);
- if (result == ISC_R_SUCCESS)
+ if (result == ISC_R_SUCCESS) {
*answer = ISC_TRUE;
+ result = ISC_R_SUCCESS;
+ }
if (result == ISC_R_NOMORE) {
*answer = ISC_FALSE;
result = ISC_R_SUCCESS;
}
+
return (result);
}
diff --git a/contrib/bind9/lib/dns/openssl_link.c b/contrib/bind9/lib/dns/openssl_link.c
index 081e3c6..8c733f6 100644
--- a/contrib/bind9/lib/dns/openssl_link.c
+++ b/contrib/bind9/lib/dns/openssl_link.c
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: openssl_link.c,v 1.22.112.5 2010-09-15 12:37:35 tbox Exp $
+ * $Id: openssl_link.c,v 1.29 2010-09-15 12:38:36 tbox Exp $
*/
#ifdef OPENSSL
@@ -45,6 +45,8 @@
#include <isc/thread.h>
#include <isc/util.h>
+#include <dst/result.h>
+
#include "dst_internal.h"
#include "dst_openssl.h"
@@ -60,12 +62,6 @@
#ifdef USE_ENGINE
#include <openssl/engine.h>
-
-#ifdef ENGINE_ID
-const char *engine_id = ENGINE_ID;
-#else
-const char *engine_id;
-#endif
#endif
static RAND_METHOD *rm = NULL;
@@ -74,15 +70,7 @@ static isc_mutex_t *locks = NULL;
static int nlocks;
#ifdef USE_ENGINE
-static ENGINE *e;
-static ENGINE *he;
-#endif
-
-#ifdef USE_PKCS11
-static isc_result_t
-dst__openssl_load_engine(const char *name, const char *engine_id,
- const char **pre_cmds, int pre_num,
- const char **post_cmds, int post_num);
+static ENGINE *e = NULL;
#endif
static int
@@ -135,8 +123,16 @@ id_callback(void) {
static void *
mem_alloc(size_t size) {
+#ifdef OPENSSL_LEAKS
+ void *ptr;
+
+ INSIST(dst__memory_pool != NULL);
+ ptr = isc_mem_allocate(dst__memory_pool, size);
+ return (ptr);
+#else
INSIST(dst__memory_pool != NULL);
return (isc_mem_allocate(dst__memory_pool, size));
+#endif
}
static void
@@ -148,16 +144,26 @@ mem_free(void *ptr) {
static void *
mem_realloc(void *ptr, size_t size) {
+#ifdef OPENSSL_LEAKS
+ void *rptr;
+
+ INSIST(dst__memory_pool != NULL);
+ rptr = isc_mem_reallocate(dst__memory_pool, ptr, size);
+ return (rptr);
+#else
INSIST(dst__memory_pool != NULL);
return (isc_mem_reallocate(dst__memory_pool, ptr, size));
+#endif
}
isc_result_t
-dst__openssl_init() {
+dst__openssl_init(const char *engine) {
isc_result_t result;
#ifdef USE_ENGINE
- /* const char *name; */
ENGINE *re;
+#else
+
+ UNUSED(engine);
#endif
#ifdef DNS_CRYPTO_LEAKS
@@ -187,70 +193,26 @@ dst__openssl_init() {
rm->add = entropy_add;
rm->pseudorand = entropy_getpseudo;
rm->status = entropy_status;
+
#ifdef USE_ENGINE
OPENSSL_config(NULL);
-#ifdef USE_PKCS11
-#ifndef PKCS11_SO_PATH
-#define PKCS11_SO_PATH "/usr/local/lib/engines/engine_pkcs11.so"
-#endif
-#ifndef PKCS11_MODULE_PATH
-#define PKCS11_MODULE_PATH "/usr/lib/libpkcs11.so"
-#endif
- {
- /*
- * to use this to config the PIN, add in openssl.cnf:
- * - at the beginning: "openssl_conf = openssl_def"
- * - at any place these sections:
- * [ openssl_def ]
- * engines = engine_section
- * [ engine_section ]
- * pkcs11 = pkcs11_section
- * [ pkcs11_section ]
- * PIN = my___pin
- */
-
- const char *pre_cmds[] = {
- "SO_PATH", PKCS11_SO_PATH,
- "LOAD", NULL,
- "MODULE_PATH", PKCS11_MODULE_PATH
- };
- const char *post_cmds[] = {
- /* "PIN", "my___pin" */
- };
- result = dst__openssl_load_engine("pkcs11", "pkcs11",
- pre_cmds, 0,
- post_cmds, /*1*/ 0);
- if (result != ISC_R_SUCCESS)
- goto cleanup_rm;
- }
-#endif /* USE_PKCS11 */
- if (engine_id != NULL) {
- e = ENGINE_by_id(engine_id);
+
+ if (engine != NULL && *engine == '\0')
+ engine = NULL;
+
+ if (engine != NULL) {
+ e = ENGINE_by_id(engine);
if (e == NULL) {
- result = ISC_R_NOTFOUND;
+ result = DST_R_NOENGINE;
goto cleanup_rm;
}
- if (!ENGINE_init(e)) {
- result = ISC_R_FAILURE;
- ENGINE_free(e);
+ /* This will init the engine. */
+ if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
+ result = DST_R_NOENGINE;
goto cleanup_rm;
}
- ENGINE_set_default(e, ENGINE_METHOD_ALL);
- ENGINE_free(e);
- } else {
- ENGINE_register_all_complete();
- for (e = ENGINE_get_first(); e != NULL; e = ENGINE_get_next(e)) {
-
- /*
- * Something weird here. If we call ENGINE_finish()
- * ENGINE_get_default_RAND() will fail.
- */
- if (ENGINE_init(e)) {
- if (he == NULL)
- he = e;
- }
- }
}
+
re = ENGINE_get_default_RAND();
if (re == NULL) {
re = ENGINE_new();
@@ -263,7 +225,6 @@ dst__openssl_init() {
ENGINE_free(re);
} else
ENGINE_finish(re);
-
#else
RAND_set_rand_method(rm);
#endif /* USE_ENGINE */
@@ -271,13 +232,18 @@ dst__openssl_init() {
#ifdef USE_ENGINE
cleanup_rm:
+ if (e != NULL)
+ ENGINE_free(e);
+ e = NULL;
mem_free(rm);
+ rm = NULL;
#endif
cleanup_mutexinit:
CRYPTO_set_locking_callback(NULL);
DESTROYMUTEXBLOCK(locks, nlocks);
cleanup_mutexalloc:
mem_free(locks);
+ locks = NULL;
return (result);
}
@@ -287,15 +253,22 @@ dst__openssl_destroy() {
/*
* Sequence taken from apps_shutdown() in <apps/apps.h>.
*/
+ if (rm != NULL) {
+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
+ RAND_cleanup();
+#endif
+ mem_free(rm);
+ rm = NULL;
+ }
#if (OPENSSL_VERSION_NUMBER >= 0x00907000L)
- CONF_modules_unload(1);
+ CONF_modules_free();
#endif
+ OBJ_cleanup();
EVP_cleanup();
#if defined(USE_ENGINE)
- if (e != NULL) {
- ENGINE_finish(e);
- e = NULL;
- }
+ if (e != NULL)
+ ENGINE_free(e);
+ e = NULL;
#if defined(USE_ENGINE) && OPENSSL_VERSION_NUMBER >= 0x00907000L
ENGINE_cleanup();
#endif
@@ -304,23 +277,18 @@ dst__openssl_destroy() {
CRYPTO_cleanup_all_ex_data();
#endif
ERR_clear_error();
- ERR_free_strings();
ERR_remove_state(0);
+ ERR_free_strings();
#ifdef DNS_CRYPTO_LEAKS
CRYPTO_mem_leaks_fp(stderr);
#endif
- if (rm != NULL) {
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
- RAND_cleanup();
-#endif
- mem_free(rm);
- }
if (locks != NULL) {
CRYPTO_set_locking_callback(NULL);
DESTROYMUTEXBLOCK(locks, nlocks);
mem_free(locks);
+ locks = NULL;
}
}
@@ -341,91 +309,18 @@ dst__openssl_toresult(isc_result_t fallback) {
}
ENGINE *
-dst__openssl_getengine(const char *name) {
-
- UNUSED(name);
-
+dst__openssl_getengine(const char *engine) {
+ if (engine == NULL)
+ return (NULL);
#if defined(USE_ENGINE)
- return (he);
-#else
- return (NULL);
-#endif
-}
-
-isc_result_t
-dst__openssl_setdefault(const char *name) {
-
- UNUSED(name);
-
-#if defined(USE_ENGINE)
- ENGINE_set_default(e, ENGINE_METHOD_ALL);
-#endif
- /*
- * XXXMPA If the engine does not have a default RAND method
- * restore our method.
- */
- return (ISC_R_SUCCESS);
-}
-
-#ifdef USE_PKCS11
-/*
- * 'name' is the name the engine is known by to the dst library.
- * This may or may not match the name the engine is known by to
- * openssl. It is the name that is stored in the private key file.
- *
- * 'engine_id' is the openssl engine name.
- *
- * pre_cmds and post_cmds a sequence if command argument pairs
- * pre_num and post_num are a count of those pairs.
- *
- * "SO_PATH", PKCS11_SO_PATH ("/usr/local/lib/engines/engine_pkcs11.so")
- * "LOAD", NULL
- * "MODULE_PATH", PKCS11_MODULE_PATH ("/usr/lib/libpkcs11.so")
- */
-static isc_result_t
-dst__openssl_load_engine(const char *name, const char *engine_id,
- const char **pre_cmds, int pre_num,
- const char **post_cmds, int post_num)
-{
- ENGINE *e;
-
- UNUSED(name);
-
- if (!strcasecmp(engine_id, "dynamic"))
- ENGINE_load_dynamic();
- e = ENGINE_by_id(engine_id);
if (e == NULL)
- return (ISC_R_NOTFOUND);
- while (pre_num--) {
- if (!ENGINE_ctrl_cmd_string(e, pre_cmds[0], pre_cmds[1], 0)) {
- ENGINE_free(e);
- return (ISC_R_FAILURE);
- }
- pre_cmds += 2;
- }
- if (!ENGINE_init(e)) {
- ENGINE_free(e);
- return (ISC_R_FAILURE);
- }
- /*
- * ENGINE_init() returned a functional reference, so free the
- * structural reference from ENGINE_by_id().
- */
- ENGINE_free(e);
- while (post_num--) {
- if (!ENGINE_ctrl_cmd_string(e, post_cmds[0], post_cmds[1], 0)) {
- ENGINE_free(e);
- return (ISC_R_FAILURE);
- }
- post_cmds += 2;
- }
- if (he != NULL)
- ENGINE_finish(he);
- he = e;
- return (ISC_R_SUCCESS);
+ return (NULL);
+ if (strcmp(engine, ENGINE_get_id(e)) == 0)
+ return (e);
+#endif
+ return (NULL);
}
-#endif /* USE_PKCS11 */
#else /* OPENSSL */
diff --git a/contrib/bind9/lib/dns/openssldh_link.c b/contrib/bind9/lib/dns/openssldh_link.c
index e31137f..9deda6b 100644
--- a/contrib/bind9/lib/dns/openssldh_link.c
+++ b/contrib/bind9/lib/dns/openssldh_link.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -31,7 +31,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: openssldh_link.c,v 1.14 2008-04-01 23:47:10 tbox Exp $
+ * $Id: openssldh_link.c,v 1.20 2011-01-11 23:47:13 tbox Exp $
*/
#ifdef OPENSSL
@@ -149,12 +149,37 @@ openssldh_paramcompare(const dst_key_t *key1, const dst_key_t *key2) {
return (ISC_TRUE);
}
+#if OPENSSL_VERSION_NUMBER > 0x00908000L
+static int
+progress_cb(int p, int n, BN_GENCB *cb)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+ UNUSED(n);
+
+ u.dptr = cb->arg;
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
+#endif
+
static isc_result_t
-openssldh_generate(dst_key_t *key, int generator) {
+openssldh_generate(dst_key_t *key, int generator, void (*callback)(int)) {
+ DH *dh = NULL;
#if OPENSSL_VERSION_NUMBER > 0x00908000L
BN_GENCB cb;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+#else
+
+ UNUSED(callback);
#endif
- DH *dh = NULL;
if (generator == 0) {
if (key->key_size == 768 ||
@@ -181,7 +206,12 @@ openssldh_generate(dst_key_t *key, int generator) {
if (dh == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
- BN_GENCB_set_old(&cb, NULL, NULL);
+ if (callback == NULL) {
+ BN_GENCB_set_old(&cb, NULL, NULL);
+ } else {
+ u.fptr = callback;
+ BN_GENCB_set(&cb, &progress_cb, u.dptr);
+ }
if (!DH_generate_parameters_ex(dh, key->key_size, generator,
&cb)) {
@@ -476,7 +506,7 @@ openssldh_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-openssldh_parse(dst_key_t *key, isc_lex_t *lexer) {
+openssldh_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t ret;
int i;
@@ -484,6 +514,7 @@ openssldh_parse(dst_key_t *key, isc_lex_t *lexer) {
isc_mem_t *mctx;
#define DST_RET(a) {ret = a; goto err;}
+ UNUSED(pub);
mctx = key->mctx;
/* read private key file */
@@ -609,6 +640,8 @@ static dst_func_t openssldh_functions = {
openssldh_parse,
openssldh_cleanup,
NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/openssldsa_link.c b/contrib/bind9/lib/dns/openssldsa_link.c
index c563d9b..ae88d4c 100644
--- a/contrib/bind9/lib/dns/openssldsa_link.c
+++ b/contrib/bind9/lib/dns/openssldsa_link.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -29,7 +29,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: openssldsa_link.c,v 1.13.120.2 2009-01-14 23:47:26 tbox Exp $ */
+/* $Id: openssldsa_link.c,v 1.20 2011-01-11 23:47:13 tbox Exp $ */
#ifdef OPENSSL
#ifndef USE_EVP
@@ -313,15 +313,40 @@ openssldsa_compare(const dst_key_t *key1, const dst_key_t *key2) {
return (ISC_TRUE);
}
-static isc_result_t
-openssldsa_generate(dst_key_t *key, int unused) {
#if OPENSSL_VERSION_NUMBER > 0x00908000L
- BN_GENCB cb;
+static int
+progress_cb(int p, int n, BN_GENCB *cb)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+ UNUSED(n);
+
+ u.dptr = cb->arg;
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
#endif
+
+static isc_result_t
+openssldsa_generate(dst_key_t *key, int unused, void (*callback)(int)) {
DSA *dsa;
unsigned char rand_array[ISC_SHA1_DIGESTLENGTH];
isc_result_t result;
+#if OPENSSL_VERSION_NUMBER > 0x00908000L
+ BN_GENCB cb;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+#else
+ UNUSED(callback);
+#endif
UNUSED(unused);
result = dst__entropy_getdata(rand_array, sizeof(rand_array),
@@ -334,7 +359,12 @@ openssldsa_generate(dst_key_t *key, int unused) {
if (dsa == NULL)
return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
- BN_GENCB_set_old(&cb, NULL, NULL);
+ if (callback == NULL) {
+ BN_GENCB_set_old(&cb, NULL, NULL);
+ } else {
+ u.fptr = callback;
+ BN_GENCB_set(&cb, &progress_cb, u.dptr);
+ }
if (!DSA_generate_parameters_ex(dsa, key->key_size, rand_array,
ISC_SHA1_DIGESTLENGTH, NULL, NULL,
@@ -512,7 +542,7 @@ openssldsa_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-openssldsa_parse(dst_key_t *key, isc_lex_t *lexer) {
+openssldsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t ret;
int i;
@@ -520,6 +550,7 @@ openssldsa_parse(dst_key_t *key, isc_lex_t *lexer) {
isc_mem_t *mctx = key->mctx;
#define DST_RET(a) {ret = a; goto err;}
+ UNUSED(pub);
/* read private key file */
ret = dst__privstruct_parse(key, DST_ALG_DSA, lexer, mctx, &priv);
if (ret != ISC_R_SUCCESS)
@@ -587,6 +618,8 @@ static dst_func_t openssldsa_functions = {
openssldsa_parse,
NULL, /*%< cleanup */
NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/opensslgost_link.c b/contrib/bind9/lib/dns/opensslgost_link.c
new file mode 100644
index 0000000..1b029db
--- /dev/null
+++ b/contrib/bind9/lib/dns/opensslgost_link.c
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: opensslgost_link.c,v 1.5 2011-01-19 23:47:12 tbox Exp $ */
+
+#include <config.h>
+
+#ifdef HAVE_OPENSSL_GOST
+
+#include <isc/entropy.h>
+#include <isc/mem.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dst/result.h>
+
+#include "dst_internal.h"
+#include "dst_openssl.h"
+#include "dst_parse.h"
+
+#include <openssl/err.h>
+#include <openssl/objects.h>
+#include <openssl/rsa.h>
+#include <openssl/engine.h>
+
+static ENGINE *e = NULL;
+static const EVP_MD *opensslgost_digest;
+extern const EVP_MD *EVP_gost(void);
+
+const EVP_MD *EVP_gost(void) {
+ return (opensslgost_digest);
+}
+
+#define DST_RET(a) {ret = a; goto err;}
+
+static isc_result_t opensslgost_todns(const dst_key_t *key,
+ isc_buffer_t *data);
+
+static isc_result_t
+opensslgost_createctx(dst_key_t *key, dst_context_t *dctx) {
+ EVP_MD_CTX *evp_md_ctx;
+ const EVP_MD *md = EVP_gost();
+
+ UNUSED(key);
+
+ if (md == NULL)
+ return (DST_R_OPENSSLFAILURE);
+
+ evp_md_ctx = EVP_MD_CTX_create();
+ if (evp_md_ctx == NULL)
+ return (ISC_R_NOMEMORY);
+
+ if (!EVP_DigestInit_ex(evp_md_ctx, md, NULL)) {
+ EVP_MD_CTX_destroy(evp_md_ctx);
+ return (ISC_R_FAILURE);
+ }
+ dctx->ctxdata.evp_md_ctx = evp_md_ctx;
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+opensslgost_destroyctx(dst_context_t *dctx) {
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+
+ if (evp_md_ctx != NULL) {
+ EVP_MD_CTX_destroy(evp_md_ctx);
+ dctx->ctxdata.evp_md_ctx = NULL;
+ }
+}
+
+static isc_result_t
+opensslgost_adddata(dst_context_t *dctx, const isc_region_t *data) {
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+
+ if (!EVP_DigestUpdate(evp_md_ctx, data->base, data->length))
+ return (ISC_R_FAILURE);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_sign(dst_context_t *dctx, isc_buffer_t *sig) {
+ dst_key_t *key = dctx->key;
+ isc_region_t r;
+ unsigned int siglen = 0;
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+ EVP_PKEY *pkey = key->keydata.pkey;
+
+ isc_buffer_availableregion(sig, &r);
+
+ if (r.length < (unsigned int) EVP_PKEY_size(pkey))
+ return (ISC_R_NOSPACE);
+
+ if (!EVP_SignFinal(evp_md_ctx, r.base, &siglen, pkey))
+ return (ISC_R_FAILURE);
+
+ isc_buffer_add(sig, siglen);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_verify(dst_context_t *dctx, const isc_region_t *sig) {
+ dst_key_t *key = dctx->key;
+ int status = 0;
+ EVP_MD_CTX *evp_md_ctx = dctx->ctxdata.evp_md_ctx;
+ EVP_PKEY *pkey = key->keydata.pkey;
+
+ status = EVP_VerifyFinal(evp_md_ctx, sig->base, sig->length, pkey);
+ if (status != 1)
+ return (dst__openssl_toresult(DST_R_VERIFYFAILURE));
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_boolean_t
+opensslgost_compare(const dst_key_t *key1, const dst_key_t *key2) {
+ EVP_PKEY *pkey1, *pkey2;
+
+ pkey1 = key1->keydata.pkey;
+ pkey2 = key2->keydata.pkey;
+
+ if (pkey1 == NULL && pkey2 == NULL)
+ return (ISC_TRUE);
+ else if (pkey1 == NULL || pkey2 == NULL)
+ return (ISC_FALSE);
+
+ if (EVP_PKEY_cmp(pkey1, pkey2) != 1)
+ return (ISC_FALSE);
+ return (ISC_TRUE);
+}
+
+static int
+progress_cb(EVP_PKEY_CTX *ctx)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+ int p;
+
+ u.dptr = EVP_PKEY_CTX_get_app_data(ctx);
+ p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
+
+static isc_result_t
+opensslgost_generate(dst_key_t *key, int unused, void (*callback)(int)) {
+ EVP_PKEY_CTX *ctx;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+ EVP_PKEY *pkey = NULL;
+
+ UNUSED(unused);
+ ctx = EVP_PKEY_CTX_new_id(NID_id_GostR3410_2001, NULL);
+ if (ctx == NULL)
+ goto err;
+ if (callback != NULL) {
+ u.fptr = callback;
+ EVP_PKEY_CTX_set_app_data(ctx, u.dptr);
+ EVP_PKEY_CTX_set_cb(ctx, &progress_cb);
+ }
+ if (EVP_PKEY_keygen_init(ctx) <= 0)
+ goto err;
+ if (EVP_PKEY_CTX_ctrl_str(ctx, "paramset", "A") <= 0)
+ goto err;
+ if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
+ goto err;
+ key->keydata.pkey = pkey;
+ EVP_PKEY_CTX_free(ctx);
+ return (ISC_R_SUCCESS);
+
+err:
+ if (pkey != NULL)
+ EVP_PKEY_free(pkey);
+ if (ctx != NULL)
+ EVP_PKEY_CTX_free(ctx);
+ return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+}
+
+static isc_boolean_t
+opensslgost_isprivate(const dst_key_t *key) {
+ EVP_PKEY *pkey = key->keydata.pkey;
+ EC_KEY *ec;
+
+ INSIST(pkey != NULL);
+
+ ec = EVP_PKEY_get0(pkey);
+ return (ISC_TF(ec != NULL && EC_KEY_get0_private_key(ec) != NULL));
+}
+
+static void
+opensslgost_destroy(dst_key_t *key) {
+ EVP_PKEY *pkey = key->keydata.pkey;
+
+ EVP_PKEY_free(pkey);
+ key->keydata.pkey = NULL;
+}
+
+unsigned char gost_prefix[37] = {
+ 0x30, 0x63, 0x30, 0x1c, 0x06, 0x06, 0x2a, 0x85,
+ 0x03, 0x02, 0x02, 0x13, 0x30, 0x12, 0x06, 0x07,
+ 0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01, 0x06,
+ 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01,
+ 0x03, 0x43, 0x00, 0x04, 0x40
+};
+
+static isc_result_t
+opensslgost_todns(const dst_key_t *key, isc_buffer_t *data) {
+ EVP_PKEY *pkey;
+ isc_region_t r;
+ unsigned char der[37 + 64], *p;
+ int len;
+
+ REQUIRE(key->keydata.pkey != NULL);
+
+ pkey = key->keydata.pkey;
+
+ isc_buffer_availableregion(data, &r);
+ if (r.length < 64)
+ return (ISC_R_NOSPACE);
+
+ p = der;
+ len = i2d_PUBKEY(pkey, &p);
+ INSIST(len == sizeof(der));
+ INSIST(memcmp(gost_prefix, der, 37) == 0);
+ memcpy(r.base, der + 37, 64);
+ isc_buffer_add(data, 64);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_fromdns(dst_key_t *key, isc_buffer_t *data) {
+ isc_region_t r;
+ EVP_PKEY *pkey = NULL;
+ unsigned char der[37 + 64];
+ const unsigned char *p;
+
+ isc_buffer_remainingregion(data, &r);
+ if (r.length == 0)
+ return (ISC_R_SUCCESS);
+
+ if (r.length != 64)
+ return (DST_R_INVALIDPUBLICKEY);
+ memcpy(der, gost_prefix, 37);
+ memcpy(der + 37, r.base, 64);
+ isc_buffer_forward(data, 64);
+
+ p = der;
+ if (d2i_PUBKEY(&pkey, &p, (long) sizeof(der)) == NULL)
+ return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ key->keydata.pkey = pkey;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslgost_tofile(const dst_key_t *key, const char *directory) {
+ EVP_PKEY *pkey;
+ dst_private_t priv;
+ isc_result_t result;
+ unsigned char *der, *p;
+ int len;
+
+ if (key->keydata.pkey == NULL)
+ return (DST_R_NULLKEY);
+
+ pkey = key->keydata.pkey;
+
+ len = i2d_PrivateKey(pkey, NULL);
+ der = isc_mem_get(key->mctx, (size_t) len);
+ if (der == NULL)
+ return (ISC_R_NOMEMORY);
+
+ p = der;
+ if (i2d_PrivateKey(pkey, &p) != len) {
+ result = dst__openssl_toresult(DST_R_OPENSSLFAILURE);
+ goto fail;
+ }
+
+ priv.elements[0].tag = TAG_GOST_PRIVASN1;
+ priv.elements[0].length = len;
+ priv.elements[0].data = der;
+ priv.nelements = GOST_NTAGS;
+
+ result = dst__privstruct_writefile(key, &priv, directory);
+ fail:
+ if (der != NULL)
+ isc_mem_put(key->mctx, der, (size_t) len);
+ return (result);
+}
+
+static isc_result_t
+opensslgost_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
+ dst_private_t priv;
+ isc_result_t ret;
+ isc_mem_t *mctx = key->mctx;
+ EVP_PKEY *pkey = NULL;
+ const unsigned char *p;
+
+ UNUSED(pub);
+
+ /* read private key file */
+ ret = dst__privstruct_parse(key, DST_ALG_ECCGOST, lexer, mctx, &priv);
+ if (ret != ISC_R_SUCCESS)
+ return (ret);
+
+ INSIST(priv.elements[0].tag == TAG_GOST_PRIVASN1);
+ p = priv.elements[0].data;
+ if (d2i_PrivateKey(NID_id_GostR3410_2001, &pkey, &p,
+ (long) priv.elements[0].length) == NULL)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
+ key->keydata.pkey = pkey;
+ key->key_size = EVP_PKEY_bits(pkey);
+ dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
+ return (ISC_R_SUCCESS);
+
+ err:
+ if (pkey != NULL)
+ EVP_PKEY_free(pkey);
+ opensslgost_destroy(key);
+ dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
+ return (ret);
+}
+
+static void
+opensslgost_cleanup(void) {
+ if (e != NULL) {
+ ENGINE_finish(e);
+ ENGINE_free(e);
+ e = NULL;
+ }
+}
+
+static dst_func_t opensslgost_functions = {
+ opensslgost_createctx,
+ opensslgost_destroyctx,
+ opensslgost_adddata,
+ opensslgost_sign,
+ opensslgost_verify,
+ NULL, /*%< computesecret */
+ opensslgost_compare,
+ NULL, /*%< paramcompare */
+ opensslgost_generate,
+ opensslgost_isprivate,
+ opensslgost_destroy,
+ opensslgost_todns,
+ opensslgost_fromdns,
+ opensslgost_tofile,
+ opensslgost_parse,
+ opensslgost_cleanup,
+ NULL, /*%< fromlabel */
+ NULL, /*%< dump */
+ NULL /*%< restore */
+};
+
+isc_result_t
+dst__opensslgost_init(dst_func_t **funcp) {
+ REQUIRE(funcp != NULL);
+
+ /* check if the gost engine works properly */
+ e = ENGINE_by_id("gost");
+ if (e == NULL)
+ return (DST_R_OPENSSLFAILURE);
+ if (ENGINE_init(e) <= 0) {
+ ENGINE_free(e);
+ e = NULL;
+ return (DST_R_OPENSSLFAILURE);
+ }
+ /* better than to rely on digest_gost symbol */
+ opensslgost_digest = ENGINE_get_digest(e, NID_id_GostR3411_94);
+ /* from openssl.cnf */
+ if ((opensslgost_digest == NULL) ||
+ (ENGINE_register_pkey_asn1_meths(e) <= 0) ||
+ (ENGINE_ctrl_cmd_string(e,
+ "CRYPT_PARAMS",
+ "id-Gost28147-89-CryptoPro-A-ParamSet",
+ 0) <= 0)) {
+ ENGINE_finish(e);
+ ENGINE_free(e);
+ e = NULL;
+ return (DST_R_OPENSSLFAILURE);
+ }
+
+ if (*funcp == NULL)
+ *funcp = &opensslgost_functions;
+ return (ISC_R_SUCCESS);
+}
+
+#else /* HAVE_OPENSSL_GOST */
+
+#include <isc/util.h>
+
+EMPTY_TRANSLATION_UNIT
+
+#endif /* HAVE_OPENSSL_GOST */
+/*! \file */
diff --git a/contrib/bind9/lib/dns/opensslrsa_link.c b/contrib/bind9/lib/dns/opensslrsa_link.c
index 1e3c5c2..fcdc9f0 100644
--- a/contrib/bind9/lib/dns/opensslrsa_link.c
+++ b/contrib/bind9/lib/dns/opensslrsa_link.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -17,7 +17,7 @@
/*
* Principal Author: Brian Wellington
- * $Id: opensslrsa_link.c,v 1.20.50.8 2010-01-22 02:36:49 marka Exp $
+ * $Id: opensslrsa_link.c,v 1.39 2011-01-11 23:47:13 tbox Exp $
*/
#ifdef OPENSSL
#include <config.h>
@@ -30,6 +30,7 @@
#endif
#endif
+
#include <isc/entropy.h>
#include <isc/md5.h>
#include <isc/sha1.h>
@@ -368,7 +369,7 @@ opensslrsa_sign(dst_context_t *dctx, isc_buffer_t *sig) {
RSA *rsa = key->keydata.rsa;
/* note: ISC_SHA512_DIGESTLENGTH >= ISC_*_DIGESTLENGTH */
unsigned char digest[PREFIXLEN + ISC_SHA512_DIGESTLENGTH];
- int status = 0;
+ int status;
int type = 0;
unsigned int digestlen = 0;
char *message;
@@ -703,10 +704,32 @@ opensslrsa_compare(const dst_key_t *key1, const dst_key_t *key2) {
return (ISC_TRUE);
}
+#if OPENSSL_VERSION_NUMBER > 0x00908000L
+static int
+progress_cb(int p, int n, BN_GENCB *cb)
+{
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
+
+ UNUSED(n);
+
+ u.dptr = cb->arg;
+ if (u.fptr != NULL)
+ u.fptr(p);
+ return (1);
+}
+#endif
+
static isc_result_t
-opensslrsa_generate(dst_key_t *key, int exp) {
+opensslrsa_generate(dst_key_t *key, int exp, void (*callback)(int)) {
#if OPENSSL_VERSION_NUMBER > 0x00908000L
BN_GENCB cb;
+ union {
+ void *dptr;
+ void (*fptr)(int);
+ } u;
RSA *rsa = RSA_new();
BIGNUM *e = BN_new();
#if USE_EVP
@@ -732,7 +755,12 @@ opensslrsa_generate(dst_key_t *key, int exp) {
BN_set_bit(e, 32);
}
- BN_GENCB_set_old(&cb, NULL, NULL);
+ if (callback == NULL) {
+ BN_GENCB_set_old(&cb, NULL, NULL);
+ } else {
+ u.fptr = callback;
+ BN_GENCB_set(&cb, &progress_cb, u.dptr);
+ }
if (RSA_generate_key_ex(rsa, key->key_size, e, &cb)) {
BN_free(e);
@@ -763,8 +791,12 @@ err:
#if USE_EVP
EVP_PKEY *pkey = EVP_PKEY_new();
+ UNUSED(callback);
+
if (pkey == NULL)
return (ISC_R_NOMEMORY);
+#else
+ UNUSED(callback);
#endif
if (exp == 0)
@@ -1059,8 +1091,9 @@ opensslrsa_tofile(const dst_key_t *key, const char *directory) {
i++;
}
+
priv.nelements = i;
- result = dst__privstruct_writefile(key, &priv, directory);
+ result = dst__privstruct_writefile(key, &priv, directory);
fail:
#if USE_EVP
RSA_free(rsa);
@@ -1074,16 +1107,52 @@ opensslrsa_tofile(const dst_key_t *key, const char *directory) {
}
static isc_result_t
-opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
+rsa_check(RSA *rsa, RSA *pub)
+{
+ /* Public parameters should be the same but if they are not set
+ * copy them from the public key. */
+ if (pub != NULL) {
+ if (rsa->n != NULL) {
+ if (BN_cmp(rsa->n, pub->n) != 0)
+ return (DST_R_INVALIDPRIVATEKEY);
+ } else {
+ rsa->n = pub->n;
+ pub->n = NULL;
+ }
+ if (rsa->e != NULL) {
+ if (BN_cmp(rsa->e, pub->e) != 0)
+ return (DST_R_INVALIDPRIVATEKEY);
+ } else {
+ rsa->e = pub->e;
+ pub->e = NULL;
+ }
+ }
+ if (rsa->n == NULL || rsa->e == NULL)
+ return (DST_R_INVALIDPRIVATEKEY);
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) {
dst_private_t priv;
isc_result_t ret;
int i;
- RSA *rsa = NULL;
+ RSA *rsa = NULL, *pubrsa = NULL;
ENGINE *e = NULL;
isc_mem_t *mctx = key->mctx;
- const char *name = NULL, *label = NULL;
+ const char *engine = NULL, *label = NULL;
EVP_PKEY *pkey = NULL;
+#if USE_EVP
+ if (pub != NULL && pub->keydata.pkey != NULL)
+ pubrsa = EVP_PKEY_get1_RSA(pub->keydata.pkey);
+#else
+ if (pub != NULL && pub->keydata.rsa != NULL) {
+ pubrsa = pub->keydata.rsa;
+ pub->keydata.rsa = NULL;
+ }
+#endif
+
/* read private key file */
ret = dst__privstruct_parse(key, DST_ALG_RSA, lexer, mctx, &priv);
if (ret != ISC_R_SUCCESS)
@@ -1092,7 +1161,7 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
for (i = 0; i < priv.nelements; i++) {
switch (priv.elements[i].tag) {
case TAG_RSA_ENGINE:
- name = (char *)priv.elements[i].data;
+ engine = (char *)priv.elements[i].data;
break;
case TAG_RSA_LABEL:
label = (char *)priv.elements[i].data;
@@ -1105,10 +1174,10 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
* Is this key is stored in a HSM?
* See if we can fetch it.
*/
- if (name != NULL || label != NULL) {
- INSIST(name != NULL);
- INSIST(label != NULL);
- e = dst__openssl_getengine(name);
+ if (label != NULL) {
+ if (engine == NULL)
+ DST_RET(DST_R_NOENGINE);
+ e = dst__openssl_getengine(engine);
if (e == NULL)
DST_RET(DST_R_NOENGINE);
pkey = ENGINE_load_private_key(e, label, NULL, NULL);
@@ -1116,22 +1185,29 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
/* ERR_print_errors_fp(stderr); */
DST_RET(ISC_R_NOTFOUND);
}
- key->engine = isc_mem_strdup(key->mctx, name);
+ key->engine = isc_mem_strdup(key->mctx, engine);
if (key->engine == NULL)
DST_RET(ISC_R_NOMEMORY);
key->label = isc_mem_strdup(key->mctx, label);
if (key->label == NULL)
DST_RET(ISC_R_NOMEMORY);
+ rsa = EVP_PKEY_get1_RSA(pkey);
+ if (rsa == NULL)
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ if (rsa_check(rsa, pubrsa) != ISC_R_SUCCESS)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
key->key_size = EVP_PKEY_bits(pkey);
#if USE_EVP
key->keydata.pkey = pkey;
+ RSA_free(rsa);
#else
- key->keydata.rsa = EVP_PKEY_get1_RSA(pkey);
- if (rsa == NULL)
- DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ key->keydata.rsa = rsa;
EVP_PKEY_free(pkey);
#endif
dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
return (ISC_R_SUCCESS);
}
@@ -1144,9 +1220,8 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
pkey = EVP_PKEY_new();
if (pkey == NULL)
DST_RET(ISC_R_NOMEMORY);
- if (!EVP_PKEY_set1_RSA(pkey, rsa)) {
+ if (!EVP_PKEY_set1_RSA(pkey, rsa))
DST_RET(ISC_R_FAILURE);
- }
key->keydata.pkey = pkey;
#else
key->keydata.rsa = rsa;
@@ -1196,8 +1271,13 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
}
}
dst__privstruct_free(&priv, mctx);
+ memset(&priv, 0, sizeof(priv));
+ if (rsa_check(rsa, pubrsa) != ISC_R_SUCCESS)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
key->key_size = BN_num_bits(rsa->n);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
#if USE_EVP
RSA_free(rsa);
#endif
@@ -1211,6 +1291,8 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer) {
#endif
if (rsa != NULL)
RSA_free(rsa);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
opensslrsa_destroy(key);
dst__privstruct_free(&priv, mctx);
memset(&priv, 0, sizeof(priv));
@@ -1224,33 +1306,63 @@ opensslrsa_fromlabel(dst_key_t *key, const char *engine, const char *label,
ENGINE *e = NULL;
isc_result_t ret;
EVP_PKEY *pkey = NULL;
+ RSA *rsa = NULL, *pubrsa = NULL;
+ char *colon;
UNUSED(pin);
+ if (engine == NULL)
+ DST_RET(DST_R_NOENGINE);
e = dst__openssl_getengine(engine);
if (e == NULL)
DST_RET(DST_R_NOENGINE);
+ pkey = ENGINE_load_public_key(e, label, NULL, NULL);
+ if (pkey != NULL) {
+ pubrsa = EVP_PKEY_get1_RSA(pkey);
+ EVP_PKEY_free(pkey);
+ if (pubrsa == NULL)
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ }
pkey = ENGINE_load_private_key(e, label, NULL, NULL);
if (pkey == NULL)
DST_RET(ISC_R_NOTFOUND);
- key->engine = isc_mem_strdup(key->mctx, label);
- if (key->engine == NULL)
- DST_RET(ISC_R_NOMEMORY);
+ if (engine != NULL) {
+ key->engine = isc_mem_strdup(key->mctx, engine);
+ if (key->engine == NULL)
+ DST_RET(ISC_R_NOMEMORY);
+ } else {
+ key->engine = isc_mem_strdup(key->mctx, label);
+ if (key->engine == NULL)
+ DST_RET(ISC_R_NOMEMORY);
+ colon = strchr(key->engine, ':');
+ if (colon != NULL)
+ *colon = '\0';
+ }
key->label = isc_mem_strdup(key->mctx, label);
if (key->label == NULL)
DST_RET(ISC_R_NOMEMORY);
+ rsa = EVP_PKEY_get1_RSA(pkey);
+ if (rsa == NULL)
+ DST_RET(dst__openssl_toresult(DST_R_OPENSSLFAILURE));
+ if (rsa_check(rsa, pubrsa) != ISC_R_SUCCESS)
+ DST_RET(DST_R_INVALIDPRIVATEKEY);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
key->key_size = EVP_PKEY_bits(pkey);
#if USE_EVP
key->keydata.pkey = pkey;
+ RSA_free(rsa);
#else
- key->keydata.rsa = EVP_PKEY_get1_RSA(pkey);
+ key->keydata.rsa = rsa;
EVP_PKEY_free(pkey);
- if (key->keydata.rsa == NULL)
- return (dst__openssl_toresult(DST_R_OPENSSLFAILURE));
#endif
return (ISC_R_SUCCESS);
err:
+ if (rsa != NULL)
+ RSA_free(rsa);
+ if (pubrsa != NULL)
+ RSA_free(pubrsa);
if (pkey != NULL)
EVP_PKEY_free(pkey);
return (ret);
@@ -1274,6 +1386,8 @@ static dst_func_t opensslrsa_functions = {
opensslrsa_parse,
NULL, /*%< cleanup */
opensslrsa_fromlabel,
+ NULL, /*%< dump */
+ NULL, /*%< restore */
};
isc_result_t
diff --git a/contrib/bind9/lib/dns/peer.c b/contrib/bind9/lib/dns/peer.c
index 1e81023..3851c3e 100644
--- a/contrib/bind9/lib/dns/peer.c
+++ b/contrib/bind9/lib/dns/peer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: peer.c,v 1.31 2008-04-03 06:09:04 tbox Exp $ */
+/* $Id: peer.c,v 1.33 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -536,7 +536,7 @@ dns_peer_setkeybycharp(dns_peer_t *peer, const char *keyval) {
isc_buffer_init(&b, keyval, strlen(keyval));
isc_buffer_add(&b, strlen(keyval));
result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
diff --git a/contrib/bind9/lib/dns/private.c b/contrib/bind9/lib/dns/private.c
new file mode 100644
index 0000000..ba3e8ed
--- /dev/null
+++ b/contrib/bind9/lib/dns/private.c
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: private.c,v 1.3 2009-10-09 23:48:09 tbox Exp $ */
+
+#include "config.h"
+
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/types.h>
+#include <isc/base64.h>
+
+#include <dns/nsec3.h>
+#include <dns/private.h>
+
+/*
+ * We need to build the relevant chain if there exists a NSEC/NSEC3PARAM
+ * at the apex; normally only one or the other of NSEC/NSEC3PARAM will exist.
+ *
+ * If a NSEC3PARAM RRset exists then we will need to build a NSEC chain
+ * if all the NSEC3PARAM records (and associated chains) are slated for
+ * destruction and we have not been told to NOT build the NSEC chain.
+ *
+ * If the NSEC set exist then check to see if there is a request to create
+ * a NSEC3 chain.
+ *
+ * If neither NSEC/NSEC3PARAM RRsets exist at the origin and the private
+ * type exists then we need to examine it to determine if NSEC3 chain has
+ * been requested to be built otherwise a NSEC chain needs to be built.
+ */
+
+#define REMOVE(x) (((x) & DNS_NSEC3FLAG_REMOVE) != 0)
+#define CREATE(x) (((x) & DNS_NSEC3FLAG_CREATE) != 0)
+#define NONSEC(x) (((x) & DNS_NSEC3FLAG_NONSEC) != 0)
+
+#define CHECK(x) do { \
+ result = (x); \
+ if (result != ISC_R_SUCCESS) \
+ goto failure; \
+ } while (0)
+
+/*
+ * Work out if 'param' should be ignored or not (i.e. it is in the process
+ * of being removed).
+ *
+ * Note: we 'belt-and-braces' here by also checking for a CREATE private
+ * record and keep the param record in this case.
+ */
+
+static isc_boolean_t
+ignore(dns_rdata_t *param, dns_rdataset_t *privateset) {
+ isc_result_t result;
+
+ for (result = dns_rdataset_first(privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(privateset)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t private = DNS_RDATA_INIT;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ /*
+ * We are going to create a new NSEC3 chain so it
+ * doesn't matter if we are removing this one.
+ */
+ if (CREATE(rdata.data[1]))
+ return (ISC_FALSE);
+ if (rdata.data[0] != param->data[0] ||
+ rdata.data[2] != param->data[2] ||
+ rdata.data[3] != param->data[3] ||
+ rdata.data[4] != param->data[4] ||
+ memcmp(&rdata.data[5], &param->data[5], param->data[4]))
+ continue;
+ /*
+ * The removal of this NSEC3 chain does NOT cause a
+ * NSEC chain to be created so we don't need to tell
+ * the caller that it will be removed.
+ */
+ if (NONSEC(rdata.data[1]))
+ return (ISC_FALSE);
+ return (ISC_TRUE);
+ }
+ return (ISC_FALSE);
+}
+
+isc_result_t
+dns_private_chains(dns_db_t *db, dns_dbversion_t *ver,
+ dns_rdatatype_t privatetype,
+ isc_boolean_t *build_nsec, isc_boolean_t *build_nsec3)
+{
+ dns_dbnode_t *node;
+ dns_rdataset_t nsecset, nsec3paramset, privateset;
+ isc_boolean_t nsec3chain;
+ isc_boolean_t signing;
+ isc_result_t result;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ unsigned int count;
+
+ node = NULL;
+ dns_rdataset_init(&nsecset);
+ dns_rdataset_init(&nsec3paramset);
+ dns_rdataset_init(&privateset);
+
+ CHECK(dns_db_getoriginnode(db, &node));
+
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec,
+ 0, (isc_stdtime_t) 0, &nsecset, NULL);
+
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
+ 0, (isc_stdtime_t) 0, &nsec3paramset,
+ NULL);
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+
+ if (dns_rdataset_isassociated(&nsecset) &&
+ dns_rdataset_isassociated(&nsec3paramset)) {
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ goto success;
+ }
+
+ if (privatetype != (dns_rdatatype_t)0) {
+ result = dns_db_findrdataset(db, node, ver, privatetype,
+ 0, (isc_stdtime_t) 0,
+ &privateset, NULL);
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
+ goto failure;
+ }
+
+ /*
+ * Look to see if we also need to be creating a NSEC3 chains.
+ */
+ if (dns_rdataset_isassociated(&nsecset)) {
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_FALSE;
+ if (!dns_rdataset_isassociated(&privateset))
+ goto success;
+ for (result = dns_rdataset_first(&privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&privateset)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t private = DNS_RDATA_INIT;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ if (REMOVE(rdata.data[1]))
+ continue;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ break;
+ }
+ goto success;
+ }
+
+ if (dns_rdataset_isassociated(&nsec3paramset)) {
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ if (build_nsec != NULL)
+ *build_nsec = ISC_FALSE;
+ if (!dns_rdataset_isassociated(&privateset))
+ goto success;
+ /*
+ * If we are in the process of building a new NSEC3 chain
+ * then we don't need to build a NSEC chain.
+ */
+ for (result = dns_rdataset_first(&privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&privateset)) {
+ dns_rdata_t private = DNS_RDATA_INIT;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ if (CREATE(rdata.data[1]))
+ goto success;
+ }
+
+ /*
+ * Check to see if there will be a active NSEC3CHAIN once
+ * the changes queued complete.
+ */
+ count = 0;
+ for (result = dns_rdataset_first(&nsec3paramset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&nsec3paramset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ /*
+ * If there is more that one NSEC3 chain present then
+ * we don't need to construct a NSEC chain.
+ */
+ if (++count > 1)
+ goto success;
+ dns_rdataset_current(&nsec3paramset, &rdata);
+ if (ignore(&rdata, &privateset))
+ continue;
+ /*
+ * We still have a good NSEC3 chain or we are
+ * not creating a NSEC chain as NONSEC is set.
+ */
+ goto success;
+ }
+
+ /*
+ * The last NSEC3 chain is being removed and does not have
+ * have NONSEC set.
+ */
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ goto success;
+ }
+
+ if (build_nsec != NULL)
+ *build_nsec = ISC_FALSE;
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_FALSE;
+ if (!dns_rdataset_isassociated(&privateset))
+ goto success;
+
+ signing = ISC_FALSE;
+ nsec3chain = ISC_FALSE;
+
+ for (result = dns_rdataset_first(&privateset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&privateset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_t private = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&privateset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf))) {
+ /*
+ * Look for record that says we are signing the
+ * zone with a key.
+ */
+ if (private.length == 5 && private.data[0] != 0 &&
+ private.data[3] == 0 && private.data[4] == 0)
+ signing = ISC_TRUE;
+ } else {
+ if (CREATE(rdata.data[1]))
+ nsec3chain = ISC_TRUE;
+ }
+ }
+
+ if (signing) {
+ if (nsec3chain) {
+ if (build_nsec3 != NULL)
+ *build_nsec3 = ISC_TRUE;
+ } else {
+ if (build_nsec != NULL)
+ *build_nsec = ISC_TRUE;
+ }
+ }
+
+ success:
+ result = ISC_R_SUCCESS;
+ failure:
+ if (dns_rdataset_isassociated(&nsecset))
+ dns_rdataset_disassociate(&nsecset);
+ if (dns_rdataset_isassociated(&nsec3paramset))
+ dns_rdataset_disassociate(&nsec3paramset);
+ if (dns_rdataset_isassociated(&privateset))
+ dns_rdataset_disassociate(&privateset);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
diff --git a/contrib/bind9/lib/dns/rbt.c b/contrib/bind9/lib/dns/rbt.c
index 5e09db3..6c14e8e 100644
--- a/contrib/bind9/lib/dns/rbt.c
+++ b/contrib/bind9/lib/dns/rbt.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbt.c,v 1.142.50.3 2009-10-20 05:06:04 marka Exp $ */
+/* $Id: rbt.c,v 1.146 2009-10-27 04:46:58 marka Exp $ */
/*! \file */
@@ -537,7 +537,10 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) {
* current node.
*/
new_current->is_root = current->is_root;
- new_current->nsec3 = current->nsec3;
+ if (current->nsec == DNS_RBT_NSEC_HAS_NSEC)
+ new_current->nsec = DNS_RBT_NSEC_NORMAL;
+ else
+ new_current->nsec = current->nsec;
PARENT(new_current) = PARENT(current);
LEFT(new_current) = LEFT(current);
RIGHT(new_current) = RIGHT(current);
@@ -1451,7 +1454,7 @@ create_node(isc_mem_t *mctx, dns_name_t *name, dns_rbtnode_t **nodep) {
DIRTY(node) = 0;
dns_rbtnode_refinit(node, 0);
node->find_callback = 0;
- node->nsec3 = 0;
+ node->nsec = DNS_RBT_NSEC_NORMAL;
MAKE_BLACK(node);
diff --git a/contrib/bind9/lib/dns/rbtdb.c b/contrib/bind9/lib/dns/rbtdb.c
index 8932a17..d4415d8 100644
--- a/contrib/bind9/lib/dns/rbtdb.c
+++ b/contrib/bind9/lib/dns/rbtdb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbtdb.c,v 1.270.12.26 2010-12-02 05:09:58 marka Exp $ */
+/* $Id: rbtdb.c,v 1.310.8.1.2.1 2011-06-21 20:15:48 each Exp $ */
/*! \file */
@@ -53,6 +53,7 @@
#include <dns/nsec.h>
#include <dns/nsec3.h>
#include <dns/rbt.h>
+#include <dns/rpz.h>
#include <dns/rdata.h>
#include <dns/rdataset.h>
#include <dns/rdatasetiter.h>
@@ -278,6 +279,7 @@ typedef ISC_LIST(dns_rbtnode_t) rbtnodelist_t;
#define RDATASET_ATTR_RESIGN 0x0020
#define RDATASET_ATTR_STATCOUNT 0x0040
#define RDATASET_ATTR_OPTOUT 0x0080
+#define RDATASET_ATTR_NEGATIVE 0x0100
typedef struct acache_cbarg {
dns_rdatasetadditional_t type;
@@ -316,6 +318,8 @@ struct acachectl {
(((header)->attributes & RDATASET_ATTR_RESIGN) != 0)
#define OPTOUT(header) \
(((header)->attributes & RDATASET_ATTR_OPTOUT) != 0)
+#define NEGATIVE(header) \
+ (((header)->attributes & RDATASET_ATTR_NEGATIVE) != 0)
#define DEFAULT_NODE_LOCK_COUNT 7 /*%< Should be prime. */
@@ -391,12 +395,15 @@ typedef ISC_LIST(rbtdb_version_t) rbtdb_versionlist_t;
typedef struct {
/* Unlocked. */
dns_db_t common;
+ /* Locks the data in this struct */
#if DNS_RBTDB_USERWLOCK
isc_rwlock_t lock;
#else
isc_mutex_t lock;
#endif
+ /* Locks the tree structure (prevents nodes appearing/disappearing) */
isc_rwlock_t tree_lock;
+ /* Locks for individual tree nodes */
unsigned int node_lock_count;
rbtdb_nodelock_t * node_locks;
dns_rbtnode_t * origin_node;
@@ -435,7 +442,9 @@ typedef struct {
/* Locked by tree_lock. */
dns_rbt_t * tree;
+ dns_rbt_t * nsec;
dns_rbt_t * nsec3;
+ dns_rpz_cidr_t * rpz_cidr;
/* Unlocked */
unsigned int quantum;
@@ -615,8 +624,9 @@ typedef struct rbtdb_dbiterator {
static void free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log,
isc_event_t *event);
static void overmem(dns_db_t *db, isc_boolean_t overmem);
-static void setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
- isc_boolean_t *nsec3createflag);
+#ifdef BIND9
+static void setnsec3parameters(dns_db_t *db, rbtdb_version_t *version);
+#endif
/*%
* 'init_count' is used to initialize 'newheader->count' which inturn
@@ -689,11 +699,13 @@ update_rrsetstats(dns_rbtdb_t *rbtdb, rdatasetheader_t *header,
/* At the moment we count statistics only for cache DB */
INSIST(IS_CACHE(rbtdb));
- if (NXDOMAIN(header))
- statattributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN;
- else if (RBTDB_RDATATYPE_BASE(header->type) == 0) {
- statattributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET;
- base = RBTDB_RDATATYPE_EXT(header->type);
+ if (NEGATIVE(header)) {
+ if (NXDOMAIN(header))
+ statattributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN;
+ else {
+ statattributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET;
+ base = RBTDB_RDATATYPE_EXT(header->type);
+ }
} else
base = RBTDB_RDATATYPE_BASE(header->type);
@@ -822,6 +834,7 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
isc_ondestroy_t ondest;
isc_result_t result;
char buf[DNS_NAME_FORMATSIZE];
+ dns_rbt_t **treep;
isc_time_t start;
if (IS_CACHE(rbtdb) && rbtdb->common.rdclass == dns_rdataclass_in)
@@ -858,33 +871,26 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
if (event == NULL)
rbtdb->quantum = (rbtdb->task != NULL) ? 100 : 0;
- again:
- if (rbtdb->tree != NULL) {
- isc_time_now(&start);
- result = dns_rbt_destroy2(&rbtdb->tree, rbtdb->quantum);
- if (result == ISC_R_QUOTA) {
- INSIST(rbtdb->task != NULL);
- if (rbtdb->quantum != 0)
- rbtdb->quantum = adjust_quantum(rbtdb->quantum,
- &start);
- if (event == NULL)
- event = isc_event_allocate(rbtdb->common.mctx,
- NULL,
- DNS_EVENT_FREESTORAGE,
- free_rbtdb_callback,
- rbtdb,
- sizeof(isc_event_t));
- if (event == NULL)
- goto again;
- isc_task_send(rbtdb->task, &event);
- return;
+
+ for (;;) {
+ /*
+ * pick the next tree to (start to) destroy
+ */
+ treep = &rbtdb->tree;
+ if (*treep == NULL) {
+ treep = &rbtdb->nsec;
+ if (*treep == NULL) {
+ treep = &rbtdb->nsec3;
+ /*
+ * we're finished after clear cutting
+ */
+ if (*treep == NULL)
+ break;
+ }
}
- INSIST(result == ISC_R_SUCCESS && rbtdb->tree == NULL);
- }
- if (rbtdb->nsec3 != NULL) {
isc_time_now(&start);
- result = dns_rbt_destroy2(&rbtdb->nsec3, rbtdb->quantum);
+ result = dns_rbt_destroy2(treep, rbtdb->quantum);
if (result == ISC_R_QUOTA) {
INSIST(rbtdb->task != NULL);
if (rbtdb->quantum != 0)
@@ -898,11 +904,11 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
rbtdb,
sizeof(isc_event_t));
if (event == NULL)
- goto again;
+ continue;
isc_task_send(rbtdb->task, &event);
return;
}
- INSIST(result == ISC_R_SUCCESS && rbtdb->nsec3 == NULL);
+ INSIST(result == ISC_R_SUCCESS && *treep == NULL);
}
if (event != NULL)
@@ -957,6 +963,11 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) {
if (rbtdb->rrsetstats != NULL)
dns_stats_detach(&rbtdb->rrsetstats);
+#ifdef BIND9
+ if (rbtdb->rpz_cidr != NULL)
+ dns_rpz_cidr_free(&rbtdb->rpz_cidr);
+#endif
+
isc_mem_put(rbtdb->common.mctx, rbtdb->node_locks,
rbtdb->node_lock_count * sizeof(rbtdb_nodelock_t));
isc_rwlock_destroy(&rbtdb->tree_lock);
@@ -1480,6 +1491,82 @@ clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
node->dirty = 0;
}
+static void
+delete_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node)
+{
+ dns_rbtnode_t *nsecnode;
+ dns_fixedname_t fname;
+ dns_name_t *name;
+ isc_result_t result = ISC_R_UNEXPECTED;
+
+ INSIST(!ISC_LINK_LINKED(node, deadlink));
+
+ switch (node->nsec) {
+ case DNS_RBT_NSEC_NORMAL:
+#ifdef BIND9
+ if (rbtdb->rpz_cidr != NULL) {
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rbt_fullnamefromnode(node, name);
+ dns_rpz_cidr_deleteip(rbtdb->rpz_cidr, name);
+ }
+#endif
+ result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE);
+ break;
+ case DNS_RBT_NSEC_HAS_NSEC:
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rbt_fullnamefromnode(node, name);
+ /*
+ * Delete the corresponding node from the auxiliary NSEC
+ * tree before deleting from the main tree.
+ */
+ nsecnode = NULL;
+ result = dns_rbt_findnode(rbtdb->nsec, name, NULL, &nsecnode,
+ NULL, DNS_RBTFIND_EMPTYDATA,
+ NULL, NULL);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
+ "delete_node: "
+ "dns_rbt_findnode(nsec): %s",
+ isc_result_totext(result));
+ } else {
+ result = dns_rbt_deletenode(rbtdb->nsec, nsecnode,
+ ISC_FALSE);
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "delete_nsecnode(): "
+ "dns_rbt_deletenode(nsecnode): %s",
+ isc_result_totext(result));
+ }
+ }
+ result = dns_rbt_deletenode(rbtdb->tree, node, ISC_FALSE);
+#ifdef BIND9
+ dns_rpz_cidr_deleteip(rbtdb->rpz_cidr, name);
+#endif
+ break;
+ case DNS_RBT_NSEC_NSEC:
+ result = dns_rbt_deletenode(rbtdb->nsec, node, ISC_FALSE);
+ break;
+ case DNS_RBT_NSEC_NSEC3:
+ result = dns_rbt_deletenode(rbtdb->nsec3, node, ISC_FALSE);
+ break;
+ }
+ if (result != ISC_R_SUCCESS) {
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "delete_nsecnode(): "
+ "dns_rbt_deletenode: %s",
+ isc_result_totext(result));
+ }
+}
+
/*%
* Clean up dead nodes. These are nodes which have no references, and
* have no data. They are dead but we could not or chose not to delete
@@ -1491,7 +1578,6 @@ clean_zone_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
static void
cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
dns_rbtnode_t *node;
- isc_result_t result;
int count = 10; /* XXXJT: should be adjustable */
node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]);
@@ -1505,19 +1591,8 @@ cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
INSIST(dns_rbtnode_refcurrent(node) == 0 &&
node->data == NULL);
- INSIST(!ISC_LINK_LINKED(node, deadlink));
- if (node->nsec3)
- result = dns_rbt_deletenode(rbtdb->nsec3, node,
- ISC_FALSE);
- else
- result = dns_rbt_deletenode(rbtdb->tree, node,
- ISC_FALSE);
- if (result != ISC_R_SUCCESS)
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_CACHE, ISC_LOG_WARNING,
- "cleanup_dead_nodes: "
- "dns_rbt_deletenode: %s",
- isc_result_totext(result));
+ delete_node(rbtdb, node);
+
node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]);
count--;
}
@@ -1766,22 +1841,7 @@ decrement_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
sizeof(printname)));
}
- INSIST(!ISC_LINK_LINKED(node, deadlink));
- if (node->nsec3)
- result = dns_rbt_deletenode(rbtdb->nsec3, node,
- ISC_FALSE);
- else
- result = dns_rbt_deletenode(rbtdb->tree, node,
- ISC_FALSE);
- if (result != ISC_R_SUCCESS) {
- isc_log_write(dns_lctx,
- DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_CACHE,
- ISC_LOG_WARNING,
- "decrement_reference: "
- "dns_rbt_deletenode: %s",
- isc_result_totext(result));
- }
+ delete_node(rbtdb, node);
}
} else if (dns_rbtnode_refcurrent(node) == 0) {
INSIST(!ISC_LINK_LINKED(node, deadlink));
@@ -1917,13 +1977,17 @@ cleanup_nondirty(rbtdb_version_t *version, rbtdb_changedlist_t *cleanup_list) {
static void
iszonesecure(dns_db_t *db, rbtdb_version_t *version, dns_dbnode_t *origin) {
+#ifndef BIND9
+ UNUSED(db);
+ UNUSED(version);
+ UNUSED(origin);
+
+ return;
+#else
dns_rdataset_t keyset;
dns_rdataset_t nsecset, signsecset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
isc_boolean_t haszonekey = ISC_FALSE;
isc_boolean_t hasnsec = ISC_FALSE;
- isc_boolean_t hasoptbit = ISC_FALSE;
- isc_boolean_t nsec3createflag = ISC_FALSE;
isc_result_t result;
dns_rdataset_init(&keyset);
@@ -1955,41 +2019,30 @@ iszonesecure(dns_db_t *db, rbtdb_version_t *version, dns_dbnode_t *origin) {
if (result == ISC_R_SUCCESS) {
if (dns_rdataset_isassociated(&signsecset)) {
hasnsec = ISC_TRUE;
- result = dns_rdataset_first(&nsecset);
- if (result == ISC_R_SUCCESS) {
- dns_rdataset_current(&nsecset, &rdata);
- hasoptbit = dns_nsec_typepresent(&rdata,
- dns_rdatatype_opt);
- }
dns_rdataset_disassociate(&signsecset);
}
dns_rdataset_disassociate(&nsecset);
}
- setnsec3parameters(db, version, &nsec3createflag);
+ setnsec3parameters(db, version);
/*
* Do we have a valid NSEC/NSEC3 chain?
*/
- if (version->havensec3 || (hasnsec && !hasoptbit))
+ if (version->havensec3 || hasnsec)
version->secure = dns_db_secure;
- /*
- * Do we have a NSEC/NSEC3 chain under creation?
- */
- else if (hasoptbit || nsec3createflag)
- version->secure = dns_db_partial;
else
version->secure = dns_db_insecure;
+#endif
}
/*%<
* Walk the origin node looking for NSEC3PARAM records.
* Cache the nsec3 parameters.
*/
+#ifdef BIND9
static void
-setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
- isc_boolean_t *nsec3createflag)
-{
+setnsec3parameters(dns_db_t *db, rbtdb_version_t *version) {
dns_rbtnode_t *node;
dns_rdata_nsec3param_t nsec3param;
dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -2020,7 +2073,7 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
} while (header != NULL);
if (header != NULL &&
- header->type == dns_rdatatype_nsec3param) {
+ (header->type == dns_rdatatype_nsec3param)) {
/*
* Find A NSEC3PARAM with a supported algorithm.
*/
@@ -2055,17 +2108,8 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
!dns_nsec3_supportedhash(nsec3param.hash))
continue;
-#ifdef RFC5155_STRICT
if (nsec3param.flags != 0)
continue;
-#else
- if ((nsec3param.flags & DNS_NSEC3FLAG_CREATE)
- != 0)
- *nsec3createflag = ISC_TRUE;
- if ((nsec3param.flags & ~DNS_NSEC3FLAG_OPTOUT)
- != 0)
- continue;
-#endif
memcpy(version->salt, nsec3param.salt,
nsec3param.salt_length);
@@ -2088,6 +2132,7 @@ setnsec3parameters(dns_db_t *db, rbtdb_version_t *version,
isc_rwlocktype_read);
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
}
+#endif
static void
cleanup_dead_nodes_callback(isc_task_t *task, isc_event_t *event) {
@@ -2407,7 +2452,8 @@ add_wildcard_magic(dns_rbtdb_t *rbtdb, dns_name_t *name) {
result = dns_rbt_addnode(rbtdb->tree, &foundname, &node);
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS)
return (result);
- node->nsec3 = 0;
+ if (result == ISC_R_SUCCESS)
+ node->nsec = DNS_RBT_NSEC_NORMAL;
node->find_callback = 1;
node->wild = 1;
return (ISC_R_SUCCESS);
@@ -2435,7 +2481,8 @@ add_empty_wildcards(dns_rbtdb_t *rbtdb, dns_name_t *name) {
&node);
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS)
return (result);
- node->nsec3 = 0;
+ if (result == ISC_R_SUCCESS)
+ node->nsec = DNS_RBT_NSEC_NORMAL;
}
i++;
}
@@ -2474,6 +2521,17 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node = NULL;
result = dns_rbt_addnode(rbtdb->tree, name, &node);
if (result == ISC_R_SUCCESS) {
+#ifdef BIND9
+ if (rbtdb->rpz_cidr != NULL) {
+ dns_fixedname_t fnamef;
+ dns_name_t *fname;
+
+ dns_fixedname_init(&fnamef);
+ fname = dns_fixedname_name(&fnamef);
+ dns_rbt_fullnamefromnode(node, fname);
+ dns_rpz_cidr_addip(rbtdb->rpz_cidr, fname);
+ }
+#endif
dns_rbt_namefromnode(node, &nodename);
#ifdef DNS_RBT_USEHASH
node->locknum = node->hashval % rbtdb->node_lock_count;
@@ -2481,7 +2539,6 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node->locknum = dns_name_hash(&nodename, ISC_TRUE) %
rbtdb->node_lock_count;
#endif
- node->nsec3 = 0;
add_empty_wildcards(rbtdb, name);
if (dns_name_iswildcard(name)) {
@@ -2543,13 +2600,14 @@ findnsec3node(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node->locknum = dns_name_hash(&nodename, ISC_TRUE) %
rbtdb->node_lock_count;
#endif
- node->nsec3 = 1U;
+ node->nsec = DNS_RBT_NSEC_NSEC3;
} else if (result != ISC_R_EXISTS) {
RWUNLOCK(&rbtdb->tree_lock, locktype);
return (result);
}
- } else
- INSIST(node->nsec3);
+ } else {
+ INSIST(node->nsec == DNS_RBT_NSEC_NSEC3);
+ }
NODE_STRONGLOCK(&rbtdb->node_locks[node->locknum].lock);
new_reference(rbtdb, node);
NODE_STRONGUNLOCK(&rbtdb->node_locks[node->locknum].lock);
@@ -2727,6 +2785,8 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
rdataset->covers = RBTDB_RDATATYPE_EXT(header->type);
rdataset->ttl = header->rdh_ttl - now;
rdataset->trust = header->trust;
+ if (NEGATIVE(header))
+ rdataset->attributes |= DNS_RDATASETATTR_NEGATIVE;
if (NXDOMAIN(header))
rdataset->attributes |= DNS_RDATASETATTR_NXDOMAIN;
if (OPTOUT(header))
@@ -3258,13 +3318,125 @@ matchparams(rdatasetheader_t *header, rbtdb_search_t *search)
* Find node of the NSEC/NSEC3 record that is 'name'.
*/
static inline isc_result_t
+previous_closest_nsec(dns_rdatatype_t type, rbtdb_search_t *search,
+ dns_name_t *name, dns_name_t *origin,
+ dns_rbtnode_t **nodep, dns_rbtnodechain_t *nsecchain,
+ isc_boolean_t *firstp)
+{
+ dns_fixedname_t ftarget;
+ dns_name_t *target;
+ dns_rbtnode_t *nsecnode;
+ isc_result_t result;
+
+ REQUIRE(nodep != NULL && *nodep == NULL);
+
+ if (type == dns_rdatatype_nsec3) {
+ result = dns_rbtnodechain_prev(&search->chain, NULL, NULL);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN)
+ return (result);
+ result = dns_rbtnodechain_current(&search->chain, name, origin,
+ nodep);
+ return (result);
+ }
+
+ dns_fixedname_init(&ftarget);
+ target = dns_fixedname_name(&ftarget);
+
+ for (;;) {
+ if (*firstp) {
+ /*
+ * Construct the name of the second node to check.
+ * It is the first node sought in the NSEC tree.
+ */
+ *firstp = ISC_FALSE;
+ dns_rbtnodechain_init(nsecchain, NULL);
+ result = dns_name_concatenate(name, origin,
+ target, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ nsecnode = NULL;
+ result = dns_rbt_findnode(search->rbtdb->nsec,
+ target, NULL,
+ &nsecnode, nsecchain,
+ DNS_RBTFIND_NOOPTIONS,
+ NULL, NULL);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * Since this was the first loop, finding the
+ * name in the NSEC tree implies that the first
+ * node checked in the main tree had an
+ * unacceptable NSEC record.
+ * Try the previous node in the NSEC tree.
+ */
+ result = dns_rbtnodechain_prev(nsecchain,
+ name, origin);
+ if (result == DNS_R_NEWORIGIN)
+ result = ISC_R_SUCCESS;
+ } else if (result == ISC_R_NOTFOUND ||
+ result == DNS_R_PARTIALMATCH) {
+ result = dns_rbtnodechain_current(nsecchain,
+ name, origin, NULL);
+ if (result == ISC_R_NOTFOUND)
+ result = ISC_R_NOMORE;
+ }
+ } else {
+ /*
+ * This is a second or later trip through the auxiliary
+ * tree for the name of a third or earlier NSEC node in
+ * the main tree. Previous trips through the NSEC tree
+ * must have found nodes in the main tree with NSEC
+ * records. Perhaps they lacked signature records.
+ */
+ result = dns_rbtnodechain_prev(nsecchain, name, origin);
+ if (result == DNS_R_NEWORIGIN)
+ result = ISC_R_SUCCESS;
+ }
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * Construct the name to seek in the main tree.
+ */
+ result = dns_name_concatenate(name, origin, target, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ *nodep = NULL;
+ result = dns_rbt_findnode(search->rbtdb->tree, target, NULL,
+ nodep, &search->chain,
+ DNS_RBTFIND_NOOPTIONS, NULL, NULL);
+ if (result == ISC_R_SUCCESS)
+ return (result);
+
+ /*
+ * There should always be a node in the main tree with the
+ * same name as the node in the auxiliary NSEC tree, except for
+ * nodes in the auxiliary tree that are awaiting deletion.
+ */
+ if (result != DNS_R_PARTIALMATCH && result != ISC_R_NOTFOUND) {
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE, ISC_LOG_ERROR,
+ "previous_closest_nsec(): %s",
+ isc_result_totext(result));
+ return (DNS_R_BADDB);
+ }
+ }
+}
+
+/*
+ * Find the NSEC/NSEC3 which is or before the current point on the
+ * search chain. For NSEC3 records only NSEC3 records that match the
+ * current NSEC3PARAM record are considered.
+ */
+static inline isc_result_t
find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
dns_name_t *foundname, dns_rdataset_t *rdataset,
dns_rdataset_t *sigrdataset, dns_rbt_t *tree,
dns_db_secure_t secure)
{
- dns_rbtnode_t *node;
+ dns_rbtnode_t *node, *prevnode;
rdatasetheader_t *header, *header_next, *found, *foundsig;
+ dns_rbtnodechain_t nsecchain;
isc_boolean_t empty_node;
isc_result_t result;
dns_fixedname_t fname, forigin;
@@ -3272,6 +3444,7 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
dns_rdatatype_t type;
rbtdb_rdatatype_t sigtype;
isc_boolean_t wraps;
+ isc_boolean_t first = ISC_TRUE;
isc_boolean_t need_sig = ISC_TF(secure == dns_db_secure);
if (tree == search->rbtdb->nsec3) {
@@ -3284,17 +3457,21 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
wraps = ISC_FALSE;
}
+ /*
+ * Use the auxiliary tree only starting with the second node in the
+ * hope that the original node will be right much of the time.
+ */
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_fixedname_init(&forigin);
+ origin = dns_fixedname_name(&forigin);
again:
+ node = NULL;
+ prevnode = NULL;
+ result = dns_rbtnodechain_current(&search->chain, name, origin, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
do {
- node = NULL;
- dns_fixedname_init(&fname);
- name = dns_fixedname_name(&fname);
- dns_fixedname_init(&forigin);
- origin = dns_fixedname_name(&forigin);
- result = dns_rbtnodechain_current(&search->chain, name,
- origin, &node);
- if (result != ISC_R_SUCCESS)
- return (result);
NODE_LOCK(&(search->rbtdb->node_locks[node->locknum].lock),
isc_rwlocktype_read);
found = NULL;
@@ -3344,11 +3521,12 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
empty_node = ISC_TRUE;
found = NULL;
foundsig = NULL;
- result = dns_rbtnodechain_prev(&search->chain,
- NULL, NULL);
+ result = previous_closest_nsec(type, search,
+ name, origin,
+ &prevnode, NULL,
+ NULL);
} else if (found != NULL &&
- (foundsig != NULL || !need_sig))
- {
+ (foundsig != NULL || !need_sig)) {
/*
* We've found the right NSEC/NSEC3 record.
*
@@ -3385,8 +3563,11 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
* node as if it were empty and keep looking.
*/
empty_node = ISC_TRUE;
- result = dns_rbtnodechain_prev(&search->chain,
- NULL, NULL);
+ result = previous_closest_nsec(type, search,
+ name, origin,
+ &prevnode,
+ &nsecchain,
+ &first);
} else {
/*
* We found an active node, but either the
@@ -3400,13 +3581,19 @@ find_closest_nsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
* This node isn't active. We've got to keep
* looking.
*/
- result = dns_rbtnodechain_prev(&search->chain, NULL,
- NULL);
+ result = previous_closest_nsec(type, search,
+ name, origin, &prevnode,
+ &nsecchain, &first);
}
NODE_UNLOCK(&(search->rbtdb->node_locks[node->locknum].lock),
isc_rwlocktype_read);
+ node = prevnode;
+ prevnode = NULL;
} while (empty_node && result == ISC_R_SUCCESS);
+ if (!first)
+ dns_rbtnodechain_invalidate(&nsecchain);
+
if (result == ISC_R_NOMORE && wraps) {
result = dns_rbtnodechain_last(&search->chain, tree,
NULL, NULL);
@@ -3950,6 +4137,7 @@ zone_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options,
FATAL_ERROR(__FILE__, __LINE__, "zone_findzonecut() called!");
+ /* NOTREACHED */
return (ISC_R_NOTIMPLEMENTED);
}
@@ -4361,6 +4549,200 @@ find_coveringnsec(rbtdb_search_t *search, dns_dbnode_t **nodep,
return (result);
}
+/*
+ * Mark a database for response policy rewriting.
+ */
+#ifdef BIND9
+static void
+get_rpz_enabled(dns_db_t *db, dns_rpz_st_t *st)
+{
+ dns_rbtdb_t *rbtdb;
+
+ rbtdb = (dns_rbtdb_t *)db;
+ REQUIRE(VALID_RBTDB(rbtdb));
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ dns_rpz_enabled(rbtdb->rpz_cidr, st);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+}
+
+/*
+ * Search the CDIR block tree of a response policy tree of trees for all of
+ * the IP addresses in an A or AAAA rdataset.
+ * Among the policies for all IPv4 and IPv6 addresses for a name, choose
+ * the longest prefix. Among those with the longest prefix, the first
+ * configured policy. Among answers for with the longest prefixes for
+ * two or more IP addresses in the A and AAAA rdatasets the lexically
+ * smallest address.
+ */
+static isc_result_t
+rpz_findips(dns_rpz_zone_t *rpz, dns_rpz_type_t rpz_type,
+ dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_rdataset_t *ardataset, dns_rpz_st_t *st)
+{
+ dns_rbtdb_t *rbtdb;
+ struct in_addr ina;
+ struct in6_addr in6a;
+ isc_netaddr_t netaddr;
+ dns_fixedname_t selfnamef, qnamef;
+ dns_name_t *selfname, *qname;
+ dns_rbtnode_t *node;
+ dns_rdataset_t zrdataset;
+ dns_rpz_cidr_bits_t prefix;
+ isc_result_t result;
+ dns_rpz_policy_t rpz_policy;
+ dns_ttl_t ttl;
+
+ rbtdb = (dns_rbtdb_t *)db;
+ REQUIRE(VALID_RBTDB(rbtdb));
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+
+ if (rbtdb->rpz_cidr == NULL) {
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ dns_db_detach(&db);
+ dns_zone_detach(&zone);
+ return (ISC_R_UNEXPECTED);
+ }
+
+ dns_fixedname_init(&selfnamef);
+ dns_fixedname_init(&qnamef);
+ selfname = dns_fixedname_name(&selfnamef);
+ qname = dns_fixedname_name(&qnamef);
+
+ for (result = dns_rdataset_first(ardataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(ardataset)) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdataset_current(ardataset, &rdata);
+ switch (rdata.type) {
+ case dns_rdatatype_a:
+ INSIST(rdata.length == 4);
+ memcpy(&ina.s_addr, rdata.data, 4);
+ isc_netaddr_fromin(&netaddr, &ina);
+ break;
+ case dns_rdatatype_aaaa:
+ INSIST(rdata.length == 16);
+ memcpy(in6a.s6_addr, rdata.data, 16);
+ isc_netaddr_fromin6(&netaddr, &in6a);
+ break;
+ default:
+ continue;
+ }
+
+ result = dns_rpz_cidr_find(rbtdb->rpz_cidr, &netaddr, rpz_type,
+ selfname, qname, &prefix);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ /*
+ * Choose the policy with the longest matching prefix.
+ * Between policies with the same prefix, choose the first
+ * configured.
+ */
+ if (st->m.policy != DNS_RPZ_POLICY_MISS) {
+ if (prefix < st->m.prefix)
+ continue;
+ if (prefix == st->m.prefix &&
+ rpz->num > st->m.rpz->num)
+ continue;
+ }
+
+ /*
+ * We have rpz_st an entry with a prefix at least as long as
+ * the prefix of the entry we had before. Find the node
+ * corresponding to CDIR tree entry.
+ */
+ node = NULL;
+ result = dns_rbt_findnode(rbtdb->tree, qname, NULL,
+ &node, NULL, 0, NULL, NULL);
+ if (result != ISC_R_SUCCESS) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(qname, namebuf, sizeof(namebuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE, DNS_RPZ_ERROR_LEVEL,
+ "rpz_findips findnode(%s): %s",
+ namebuf, isc_result_totext(result));
+ continue;
+ }
+ /*
+ * First look for a simple rewrite of the IP address.
+ * If that fails, look for a CNAME. If we cannot find
+ * a CNAME or the CNAME is neither of the special forms
+ * "*" or ".", treat it like a real CNAME.
+ */
+ dns_rdataset_init(&zrdataset);
+ result = dns_db_findrdataset(db, node, version, ardataset->type,
+ 0, 0, &zrdataset, NULL);
+ if (result != ISC_R_SUCCESS)
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_cname,
+ 0, 0, &zrdataset, NULL);
+ if (result == ISC_R_SUCCESS) {
+ if (zrdataset.type != dns_rdatatype_cname) {
+ rpz_policy = DNS_RPZ_POLICY_RECORD;
+ } else {
+ rpz_policy = dns_rpz_decode_cname(&zrdataset,
+ selfname);
+ if (rpz_policy == DNS_RPZ_POLICY_RECORD)
+ result = DNS_R_CNAME;
+ }
+ ttl = zrdataset.ttl;
+ } else {
+ rpz_policy = DNS_RPZ_POLICY_RECORD;
+ result = DNS_R_NXRRSET;
+ ttl = DNS_RPZ_TTL_DEFAULT;
+ }
+
+ /*
+ * Use an overriding action specified in the configuration file
+ */
+ if (rpz->policy != DNS_RPZ_POLICY_GIVEN &&
+ rpz_policy != DNS_RPZ_POLICY_NO_OP)
+ rpz_policy = rpz->policy;
+
+ /*
+ * We know the new prefix is at least as long as the current.
+ * Prefer the new answer if the new prefix is longer.
+ * Prefer the zone configured first if the prefixes are equal.
+ * With two actions from the same zone, prefer the action
+ * on the "smallest" name.
+ */
+ if (st->m.policy == DNS_RPZ_POLICY_MISS ||
+ prefix > st->m.prefix ||
+ rpz->num <= st->m.rpz->num ||
+ 0 > dns_name_compare(qname, st->qname)) {
+ if (dns_rdataset_isassociated(st->m.rdataset))
+ dns_rdataset_disassociate(st->m.rdataset);
+ if (st->m.node != NULL)
+ dns_db_detachnode(st->m.db, &st->m.node);
+ if (st->m.db != NULL)
+ dns_db_detach(&st->m.db);
+ if (st->m.zone != NULL)
+ dns_zone_detach(&st->m.zone);
+ st->m.rpz = rpz;
+ st->m.type = rpz_type;
+ st->m.prefix = prefix;
+ st->m.policy = rpz_policy;
+ st->m.ttl = ttl;
+ st->m.result = result;
+ dns_name_copy(qname, st->qname, NULL);
+ if (rpz_policy == DNS_RPZ_POLICY_RECORD &&
+ result != DNS_R_NXRRSET) {
+ dns_rdataset_clone(&zrdataset,st->m.rdataset);
+ dns_db_attachnode(db, node, &st->m.node);
+ }
+ dns_db_attach(db, &st->m.db);
+ dns_zone_attach(zone, &st->m.zone);
+ }
+ if (dns_rdataset_isassociated(&zrdataset))
+ dns_rdataset_disassociate(&zrdataset);
+ }
+
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ return (ISC_R_SUCCESS);
+}
+#endif
+
static isc_result_t
cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,
@@ -4636,7 +5018,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
*nodep = node;
}
- if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
+ if (NEGATIVE(found)) {
/*
* We found a negative cache entry.
*/
@@ -5305,7 +5687,7 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
if (found == NULL)
return (ISC_R_NOTFOUND);
- if (RBTDB_RDATATYPE_BASE(found->type) == 0) {
+ if (NEGATIVE(found)) {
/*
* We found a negative cache entry.
*/
@@ -5516,7 +5898,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
negtype = 0;
if (rbtversion == NULL && !newheader_nx) {
rdtype = RBTDB_RDATATYPE_BASE(newheader->type);
- if (rdtype == 0) {
+ if (NEGATIVE(newheader)) {
/*
* We're adding a negative cache entry.
*/
@@ -5683,6 +6065,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
free_rdataset(rbtdb, rbtdb->common.mctx,
newheader);
newheader = (rdatasetheader_t *)merged;
+ init_rdataset(rbtdb, newheader);
if (loading && RESIGN(newheader) &&
RESIGN(header) &&
header->resign < newheader->resign)
@@ -6005,16 +6388,17 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
rdatasetheader_t *header;
isc_result_t result;
isc_boolean_t delegating;
+ isc_boolean_t newnsec;
isc_boolean_t tree_locked = ISC_FALSE;
isc_boolean_t cache_is_overmem = ISC_FALSE;
REQUIRE(VALID_RBTDB(rbtdb));
if (rbtdb->common.methods == &zone_methods)
- REQUIRE(((rbtnode->nsec3 &&
+ REQUIRE(((rbtnode->nsec == DNS_RBT_NSEC_NSEC3 &&
(rdataset->type == dns_rdatatype_nsec3 ||
rdataset->covers == dns_rdatatype_nsec3)) ||
- (!rbtnode->nsec3 &&
+ (rbtnode->nsec != DNS_RBT_NSEC_NSEC3 &&
rdataset->type != dns_rdatatype_nsec3 &&
rdataset->covers != dns_rdatatype_nsec3)));
@@ -6056,6 +6440,8 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
} else {
newheader->serial = 1;
newheader->resign = 0;
+ if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
+ newheader->attributes |= RDATASET_ATTR_NEGATIVE;
if ((rdataset->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
newheader->attributes |= RDATASET_ATTR_NXDOMAIN;
if ((rdataset->attributes & DNS_RDATASETATTR_OPTOUT) != 0)
@@ -6089,14 +6475,23 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
delegating = ISC_FALSE;
/*
- * If we're adding a delegation type or the DB is a cache in an overmem
- * state, hold an exclusive lock on the tree. In the latter case
- * the lock does not necessarily have to be acquired but it will help
- * purge stale entries more effectively.
+ * Add to the auxiliary NSEC tree if we're adding an NSEC record.
+ */
+ if (rbtnode->nsec != DNS_RBT_NSEC_HAS_NSEC &&
+ rdataset->type == dns_rdatatype_nsec)
+ newnsec = ISC_TRUE;
+ else
+ newnsec = ISC_FALSE;
+
+ /*
+ * If we're adding a delegation type, adding to the auxiliary NSEC tree,
+ * or the DB is a cache in an overmem state, hold an exclusive lock on
+ * the tree. In the latter case the lock does not necessarily have to
+ * be acquired but it will help purge stale entries more effectively.
*/
if (IS_CACHE(rbtdb) && isc_mem_isovermem(rbtdb->common.mctx))
cache_is_overmem = ISC_TRUE;
- if (delegating || cache_is_overmem) {
+ if (delegating || newnsec || cache_is_overmem) {
tree_locked = ISC_TRUE;
RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
}
@@ -6125,14 +6520,35 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
* cleaning, we can release it now. However, we still need the
* node lock.
*/
- if (tree_locked && !delegating) {
+ if (tree_locked && !delegating && !newnsec) {
RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
tree_locked = ISC_FALSE;
}
}
- result = add(rbtdb, rbtnode, rbtversion, newheader, options, ISC_FALSE,
- addedrdataset, now);
+ result = ISC_R_SUCCESS;
+ if (newnsec) {
+ dns_fixedname_t fname;
+ dns_name_t *name;
+ dns_rbtnode_t *nsecnode;
+
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_rbt_fullnamefromnode(rbtnode, name);
+ nsecnode = NULL;
+ result = dns_rbt_addnode(rbtdb->nsec, name, &nsecnode);
+ if (result == ISC_R_SUCCESS) {
+ nsecnode->nsec = DNS_RBT_NSEC_NSEC;
+ rbtnode->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ } else if (result == ISC_R_EXISTS) {
+ rbtnode->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ result = ISC_R_SUCCESS;
+ }
+ }
+
+ if (result == ISC_R_SUCCESS)
+ result = add(rbtdb, rbtnode, rbtversion, newheader, options,
+ ISC_FALSE, addedrdataset, now);
if (result == ISC_R_SUCCESS && delegating)
rbtnode->find_callback = 1;
@@ -6169,10 +6585,10 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
REQUIRE(VALID_RBTDB(rbtdb));
if (rbtdb->common.methods == &zone_methods)
- REQUIRE(((rbtnode->nsec3 &&
+ REQUIRE(((rbtnode->nsec == DNS_RBT_NSEC_NSEC3 &&
(rdataset->type == dns_rdatatype_nsec3 ||
rdataset->covers == dns_rdatatype_nsec3)) ||
- (!rbtnode->nsec3 &&
+ (rbtnode->nsec != DNS_RBT_NSEC_NSEC3 &&
rdataset->type != dns_rdatatype_nsec3 &&
rdataset->covers != dns_rdatatype_nsec3)));
@@ -6391,6 +6807,78 @@ deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
return (result);
}
+/*
+ * load a non-NSEC3 node in the main tree and optionally to the auxiliary NSEC
+ */
+static isc_result_t
+loadnode(dns_rbtdb_t *rbtdb, dns_name_t *name, dns_rbtnode_t **nodep,
+ isc_boolean_t hasnsec)
+{
+ isc_result_t noderesult, nsecresult;
+ dns_rbtnode_t *nsecnode;
+
+ noderesult = dns_rbt_addnode(rbtdb->tree, name, nodep);
+
+#ifdef BIND9
+ if (noderesult == ISC_R_SUCCESS)
+ dns_rpz_cidr_addip(rbtdb->rpz_cidr, name);
+#endif
+
+ if (!hasnsec)
+ return (noderesult);
+ if (noderesult == ISC_R_EXISTS) {
+ /*
+ * Add a node to the auxiliary NSEC tree for an old node
+ * just now getting an NSEC record.
+ */
+ if ((*nodep)->nsec == DNS_RBT_NSEC_HAS_NSEC)
+ return (noderesult);
+ } else if (noderesult != ISC_R_SUCCESS) {
+ return (noderesult);
+ }
+
+ /*
+ * Build the auxiliary tree for NSECs as we go.
+ * This tree speeds searches for closest NSECs that would otherwise
+ * need to examine many irrelevant nodes in large TLDs.
+ *
+ * Add nodes to the auxiliary tree after corresponding nodes have
+ * been added to the main tree.
+ */
+ nsecnode = NULL;
+ nsecresult = dns_rbt_addnode(rbtdb->nsec, name, &nsecnode);
+ if (nsecresult == ISC_R_SUCCESS) {
+ nsecnode->nsec = DNS_RBT_NSEC_NSEC;
+ (*nodep)->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ return (noderesult);
+ }
+
+ if (nsecresult == ISC_R_EXISTS) {
+#if 1 /* 0 */
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "addnode: NSEC node already exists");
+#endif
+ (*nodep)->nsec = DNS_RBT_NSEC_HAS_NSEC;
+ return (noderesult);
+ }
+
+ nsecresult = dns_rbt_deletenode(rbtdb->tree, *nodep, ISC_FALSE);
+ if (nsecresult != ISC_R_SUCCESS)
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_CACHE,
+ ISC_LOG_WARNING,
+ "loading_addrdataset: "
+ "dns_rbt_deletenode: %s after "
+ "dns_rbt_addnode(NSEC): %s",
+ isc_result_totext(nsecresult),
+ isc_result_totext(noderesult));
+ return (noderesult);
+}
+
static isc_result_t
loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
rbtdb_load_t *loadctx = arg;
@@ -6439,15 +6927,15 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
rdataset->covers == dns_rdatatype_nsec3) {
result = dns_rbt_addnode(rbtdb->nsec3, name, &node);
if (result == ISC_R_SUCCESS)
- node->nsec3 = 1;
+ node->nsec = DNS_RBT_NSEC_NSEC3;
+ } else if (rdataset->type == dns_rdatatype_nsec) {
+ result = loadnode(rbtdb, name, &node, ISC_TRUE);
} else {
- result = dns_rbt_addnode(rbtdb->tree, name, &node);
- if (result == ISC_R_SUCCESS)
- node->nsec3 = 0;
+ result = loadnode(rbtdb, name, &node, ISC_FALSE);
}
if (result != ISC_R_SUCCESS && result != ISC_R_EXISTS)
return (result);
- if (result != ISC_R_EXISTS) {
+ if (result == ISC_R_SUCCESS) {
dns_name_t foundname;
dns_name_init(&foundname, NULL);
dns_rbt_namefromnode(node, &foundname);
@@ -6573,9 +7061,17 @@ dump(dns_db_t *db, dns_dbversion_t *version, const char *filename,
REQUIRE(VALID_RBTDB(rbtdb));
+#ifdef BIND9
return (dns_master_dump2(rbtdb->common.mctx, db, version,
&dns_master_style_default,
filename, masterformat));
+#else
+ UNUSED(version);
+ UNUSED(filename);
+ UNUSED(masterformat);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#endif /* BIND9 */
}
static void
@@ -6756,7 +7252,7 @@ setsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, isc_stdtime_t resign) {
} else if (resign < oldresign)
isc_heap_increased(rbtdb->heaps[header->node->locknum],
header->heap_index);
- else
+ else if (resign > oldresign)
isc_heap_decreased(rbtdb->heaps[header->node->locknum],
header->heap_index);
} else if (resign && header->heap_index == 0) {
@@ -6780,7 +7276,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
REQUIRE(VALID_RBTDB(rbtdb));
- RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read);
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
for (i = 0; i < rbtdb->node_lock_count; i++) {
NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_read);
@@ -6816,7 +7312,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
result = ISC_R_SUCCESS;
unlock:
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
return (result);
}
@@ -6838,7 +7334,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
header = rdataset->private3;
header--;
- RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write);
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
NODE_LOCK(&rbtdb->node_locks[node->locknum].lock,
isc_rwlocktype_write);
/*
@@ -6852,7 +7348,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock,
isc_rwlocktype_write);
- RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
}
static dns_stats_t *
@@ -6901,7 +7397,14 @@ static dns_dbmethods_t zone_methods = {
getsigningtime,
resigned,
isdnssec,
+ NULL,
+#ifdef BIND9
+ get_rpz_enabled,
+ rpz_findips
+#else
+ NULL,
NULL
+#endif
};
static dns_dbmethods_t cache_methods = {
@@ -6940,7 +7443,9 @@ static dns_dbmethods_t cache_methods = {
NULL,
NULL,
isdnssec,
- getrrsetstats
+ getrrsetstats,
+ NULL,
+ NULL
};
isc_result_t
@@ -7110,12 +7615,36 @@ dns_rbtdb_create
return (result);
}
+ result = dns_rbt_create(mctx, delete_callback, rbtdb, &rbtdb->nsec);
+ if (result != ISC_R_SUCCESS) {
+ free_rbtdb(rbtdb, ISC_FALSE, NULL);
+ return (result);
+ }
+
result = dns_rbt_create(mctx, delete_callback, rbtdb, &rbtdb->nsec3);
if (result != ISC_R_SUCCESS) {
free_rbtdb(rbtdb, ISC_FALSE, NULL);
return (result);
}
+#ifdef BIND9
+ /*
+ * Get ready for response policy IP address searching if at least one
+ * zone has been configured as a response policy zone and this
+ * is not a cache zone.
+ * It would be better to know that this database is for a policy
+ * zone named for a view, but that would require knowledge from
+ * above such as an argv[] set from data in the zone.
+ */
+ if (type == dns_dbtype_zone && !dns_name_equal(origin, dns_rootname)) {
+ result = dns_rpz_new_cidr(mctx, origin, &rbtdb->rpz_cidr);
+ if (result != ISC_R_SUCCESS) {
+ free_rbtdb(rbtdb, ISC_FALSE, NULL);
+ return (result);
+ }
+ }
+#endif
+
/*
* In order to set the node callback bit correctly in zone databases,
* we need to know if the node has the origin name of the zone.
@@ -7140,7 +7669,7 @@ dns_rbtdb_create
free_rbtdb(rbtdb, ISC_FALSE, NULL);
return (result);
}
- rbtdb->origin_node->nsec3 = 0;
+ rbtdb->origin_node->nsec = DNS_RBT_NSEC_NORMAL;
/*
* We need to give the origin node the right locknum.
*/
@@ -7168,7 +7697,7 @@ dns_rbtdb_create
free_rbtdb(rbtdb, ISC_FALSE, NULL);
return (result);
}
- nsec3node->nsec3 = 1;
+ nsec3node->nsec = DNS_RBT_NSEC_NSEC3;
/*
* We need to give the nsec3 origin node the right locknum.
*/
@@ -7638,7 +8167,7 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) {
type = header->type;
rdtype = RBTDB_RDATATYPE_BASE(header->type);
- if (rdtype == 0) {
+ if (NEGATIVE(header)) {
covers = RBTDB_RDATATYPE_EXT(header->type);
negtype = RBTDB_RDATATYPE_VALUE(covers, 0);
} else
@@ -8226,6 +8755,21 @@ rdataset_getadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
dns_name_t *fname, dns_message_t *msg,
isc_stdtime_t now)
{
+#ifndef BIND9
+ UNUSED(rdataset);
+ UNUSED(type);
+ UNUSED(qtype);
+ UNUSED(acache);
+ UNUSED(zonep);
+ UNUSED(dbp);
+ UNUSED(versionp);
+ UNUSED(nodep);
+ UNUSED(fname);
+ UNUSED(msg);
+ UNUSED(now);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#else
dns_rbtdb_t *rbtdb = rdataset->private1;
dns_rbtnode_t *rbtnode = rdataset->private2;
unsigned char *raw = rdataset->private3; /* RDATASLAB */
@@ -8342,8 +8886,10 @@ acache_callback(dns_acacheentry_t *entry, void **arg) {
dns_db_detach((dns_db_t **)(void*)&rbtdb);
*arg = NULL;
+#endif /* BIND9 */
}
+#ifdef BIND9
static void
acache_cancelentry(isc_mem_t *mctx, dns_acacheentry_t *entry,
acache_cbarg_t **cbargp)
@@ -8364,6 +8910,7 @@ acache_cancelentry(isc_mem_t *mctx, dns_acacheentry_t *entry,
*cbargp = NULL;
}
+#endif /* BIND9 */
static isc_result_t
rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
@@ -8372,6 +8919,19 @@ rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
dns_dbversion_t *version, dns_dbnode_t *node,
dns_name_t *fname)
{
+#ifndef BIND9
+ UNUSED(rdataset);
+ UNUSED(type);
+ UNUSED(qtype);
+ UNUSED(acache);
+ UNUSED(zone);
+ UNUSED(db);
+ UNUSED(version);
+ UNUSED(node);
+ UNUSED(fname);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#else
dns_rbtdb_t *rbtdb = rdataset->private1;
dns_rbtnode_t *rbtnode = rdataset->private2;
unsigned char *raw = rdataset->private3; /* RDATASLAB */
@@ -8495,12 +9055,21 @@ rdataset_setadditional(dns_rdataset_t *rdataset, dns_rdatasetadditional_t type,
}
return (result);
+#endif
}
static isc_result_t
rdataset_putadditional(dns_acache_t *acache, dns_rdataset_t *rdataset,
dns_rdatasetadditional_t type, dns_rdatatype_t qtype)
{
+#ifndef BIND9
+ UNUSED(acache);
+ UNUSED(rdataset);
+ UNUSED(type);
+ UNUSED(qtype);
+
+ return (ISC_R_NOTIMPLEMENTED);
+#else
dns_rbtdb_t *rbtdb = rdataset->private1;
dns_rbtnode_t *rbtnode = rdataset->private2;
unsigned char *raw = rdataset->private3; /* RDATASLAB */
@@ -8565,6 +9134,7 @@ rdataset_putadditional(dns_acache_t *acache, dns_rdataset_t *rdataset,
}
return (ISC_R_SUCCESS);
+#endif
}
/*%
diff --git a/contrib/bind9/lib/dns/rcode.c b/contrib/bind9/lib/dns/rcode.c
index 2dc0a29..18fedcd 100644
--- a/contrib/bind9/lib/dns/rcode.c
+++ b/contrib/bind9/lib/dns/rcode.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rcode.c,v 1.8.48.2 2010-01-15 23:47:33 tbox Exp $ */
+/* $Id: rcode.c,v 1.16 2010-12-23 04:07:58 marka Exp $ */
#include <config.h>
#include <ctype.h>
@@ -79,12 +79,17 @@
{ dns_tsigerror_badtrunc, "BADTRUNC", 0}, \
{ 0, NULL, 0 }
-/* RFC2538 section 2.1 */
+/* RFC4398 section 2.1 */
#define CERTNAMES \
{ 1, "PKIX", 0}, \
{ 2, "SPKI", 0}, \
{ 3, "PGP", 0}, \
+ { 4, "IPKIX", 0}, \
+ { 5, "ISPKI", 0}, \
+ { 6, "IPGP", 0}, \
+ { 7, "ACPKIX", 0}, \
+ { 8, "IACPKIX", 0}, \
{ 253, "URI", 0}, \
{ 254, "OID", 0}, \
{ 0, NULL, 0}
@@ -102,6 +107,7 @@
{ DNS_KEYALG_NSEC3RSASHA1, "NSEC3RSASHA1", 0 }, \
{ DNS_KEYALG_RSASHA256, "RSASHA256", 0 }, \
{ DNS_KEYALG_RSASHA512, "RSASHA512", 0 }, \
+ { DNS_KEYALG_ECCGOST, "ECCGOST", 0 }, \
{ DNS_KEYALG_INDIRECT, "INDIRECT", 0 }, \
{ DNS_KEYALG_PRIVATEDNS, "PRIVATEDNS", 0 }, \
{ DNS_KEYALG_PRIVATEOID, "PRIVATEOID", 0 }, \
@@ -313,6 +319,21 @@ dns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target) {
return (dns_mnemonic_totext(secalg, target, secalgs));
}
+void
+dns_secalg_format(dns_secalg_t alg, char *cp, unsigned int size) {
+ isc_buffer_t b;
+ isc_region_t r;
+ isc_result_t result;
+
+ REQUIRE(cp != NULL && size > 0);
+ isc_buffer_init(&b, cp, size - 1);
+ result = dns_secalg_totext(alg, &b);
+ isc_buffer_usedregion(&b, &r);
+ r.base[r.length] = 0;
+ if (result != ISC_R_SUCCESS)
+ r.base[0] = 0;
+}
+
isc_result_t
dns_secproto_fromtext(dns_secproto_t *secprotop, isc_textregion_t *source) {
unsigned int value;
diff --git a/contrib/bind9/lib/dns/rdata.c b/contrib/bind9/lib/dns/rdata.c
index daaa83a..c282b03 100644
--- a/contrib/bind9/lib/dns/rdata.c
+++ b/contrib/bind9/lib/dns/rdata.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdata.c,v 1.199.50.4 2011-01-13 04:48:21 tbox Exp $ */
+/* $Id: rdata.c,v 1.209 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -38,6 +38,7 @@
#include <dns/enumtype.h>
#include <dns/keyflags.h>
#include <dns/keyvalues.h>
+#include <dns/message.h>
#include <dns/rcode.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
@@ -275,23 +276,6 @@ dns_rdata_init(dns_rdata_t *rdata) {
/* ISC_LIST_INIT(rdata->list); */
}
-#if 1
-#define DNS_RDATA_INITIALIZED(rdata) \
- ((rdata)->data == NULL && (rdata)->length == 0 && \
- (rdata)->rdclass == 0 && (rdata)->type == 0 && (rdata)->flags == 0 && \
- !ISC_LINK_LINKED((rdata), link))
-#else
-#ifdef ISC_LIST_CHECKINIT
-#define DNS_RDATA_INITIALIZED(rdata) \
- (!ISC_LINK_LINKED((rdata), link))
-#else
-#define DNS_RDATA_INITIALIZED(rdata) ISC_TRUE
-#endif
-#endif
-
-#define DNS_RDATA_VALIDFLAGS(rdata) \
- (((rdata)->flags & ~(DNS_RDATA_UPDATE|DNS_RDATA_OFFLINE)) == 0)
-
void
dns_rdata_reset(dns_rdata_t *rdata) {
@@ -365,6 +349,37 @@ dns_rdata_compare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2) {
return (result);
}
+int
+dns_rdata_casecompare(const dns_rdata_t *rdata1, const dns_rdata_t *rdata2) {
+ int result = 0;
+ isc_boolean_t use_default = ISC_FALSE;
+
+ REQUIRE(rdata1 != NULL);
+ REQUIRE(rdata2 != NULL);
+ REQUIRE(rdata1->data != NULL);
+ REQUIRE(rdata2->data != NULL);
+ REQUIRE(DNS_RDATA_VALIDFLAGS(rdata1));
+ REQUIRE(DNS_RDATA_VALIDFLAGS(rdata2));
+
+ if (rdata1->rdclass != rdata2->rdclass)
+ return (rdata1->rdclass < rdata2->rdclass ? -1 : 1);
+
+ if (rdata1->type != rdata2->type)
+ return (rdata1->type < rdata2->type ? -1 : 1);
+
+ CASECOMPARESWITCH
+
+ if (use_default) {
+ isc_region_t r1;
+ isc_region_t r2;
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ result = isc_region_compare(&r1, &r2);
+ }
+ return (result);
+}
+
/***
*** Conversions
***/
@@ -1772,3 +1787,93 @@ dns_rdatatype_isknown(dns_rdatatype_t type) {
return (ISC_TRUE);
return (ISC_FALSE);
}
+
+void
+dns_rdata_exists(dns_rdata_t *rdata, dns_rdatatype_t type) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ rdata->data = NULL;
+ rdata->length = 0;
+ rdata->flags = DNS_RDATA_UPDATE;
+ rdata->type = type;
+ rdata->rdclass = dns_rdataclass_any;
+}
+
+void
+dns_rdata_notexist(dns_rdata_t *rdata, dns_rdatatype_t type) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ rdata->data = NULL;
+ rdata->length = 0;
+ rdata->flags = DNS_RDATA_UPDATE;
+ rdata->type = type;
+ rdata->rdclass = dns_rdataclass_none;
+}
+
+void
+dns_rdata_deleterrset(dns_rdata_t *rdata, dns_rdatatype_t type) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ rdata->data = NULL;
+ rdata->length = 0;
+ rdata->flags = DNS_RDATA_UPDATE;
+ rdata->type = type;
+ rdata->rdclass = dns_rdataclass_any;
+}
+
+void
+dns_rdata_makedelete(dns_rdata_t *rdata) {
+ REQUIRE(rdata != NULL);
+
+ rdata->rdclass = dns_rdataclass_none;
+}
+
+const char *
+dns_rdata_updateop(dns_rdata_t *rdata, dns_section_t section) {
+
+ REQUIRE(rdata != NULL);
+ REQUIRE(DNS_RDATA_INITIALIZED(rdata));
+
+ switch (section) {
+ case DNS_SECTION_PREREQUISITE:
+ switch (rdata->rdclass) {
+ case dns_rdataclass_none:
+ switch (rdata->type) {
+ case dns_rdatatype_any:
+ return ("domain doesn't exist");
+ default:
+ return ("rrset doesn't exist");
+ }
+ case dns_rdataclass_any:
+ switch (rdata->type) {
+ case dns_rdatatype_any:
+ return ("domain exists");
+ default:
+ return ("rrset exists (value independent)");
+ }
+ default:
+ return ("rrset exists (value dependent)");
+ }
+ case DNS_SECTION_UPDATE:
+ switch (rdata->rdclass) {
+ case dns_rdataclass_none:
+ return ("delete");
+ case dns_rdataclass_any:
+ switch (rdata->type) {
+ case dns_rdatatype_any:
+ return ("delete all rrsets");
+ default:
+ return ("delete rrset");
+ }
+ default:
+ return ("add");
+ }
+ }
+ return ("invalid");
+}
diff --git a/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c b/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c
index e698239..9763f6d 100644
--- a/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c
+++ b/contrib/bind9/lib/dns/rdata/any_255/tsig_250.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsig_250.c,v 1.63 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: tsig_250.c,v 1.65 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 13:39:43 PST 2000 by gson */
@@ -594,4 +594,9 @@ checknames_any_tsig(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_any_tsig(ARGS_COMPARE) {
+ return (compare_any_tsig(rdata1, rdata2));
+}
+
#endif /* RDATA_ANY_255_TSIG_250_C */
diff --git a/contrib/bind9/lib/dns/rdata/ch_3/a_1.c b/contrib/bind9/lib/dns/rdata/ch_3/a_1.c
index 156caac..2623f76 100644
--- a/contrib/bind9/lib/dns/rdata/ch_3/a_1.c
+++ b/contrib/bind9/lib/dns/rdata/ch_3/a_1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.c,v 1.6 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a_1.c,v 1.8 2009-12-04 22:06:37 tbox Exp $ */
/* by Bjorn.Victor@it.uu.se, 2005-05-07 */
/* Based on generic/soa_6.c and generic/mx_15.c */
@@ -107,7 +107,7 @@ fromwire_ch_a(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
dns_name_init(&name, NULL);
-
+
RETERR(dns_name_fromwire(&name, source, dctx, options, target));
isc_buffer_activeregion(source, &sregion);
@@ -205,7 +205,7 @@ fromstruct_ch_a(ARGS_FROMSTRUCT) {
dns_name_toregion(&a->ch_addr_dom, &region);
RETERR(isc_buffer_copyregion(target, &region));
-
+
return (uint16_tobuffer(ntohs(a->ch_addr), target));
}
@@ -313,4 +313,8 @@ checknames_ch_a(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ch_a(ARGS_COMPARE) {
+ return (compare_ch_a(rdata1, rdata2));
+}
#endif /* RDATA_CH_3_A_1_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c b/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c
index f82167be..bd1d1e0 100644
--- a/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c
+++ b/contrib/bind9/lib/dns/rdata/generic/afsdb_18.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: afsdb_18.c,v 1.47 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: afsdb_18.c,v 1.49 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 14:59:00 PST 2000 by explorer */
@@ -306,4 +306,8 @@ checknames_afsdb(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_afsdb(ARGS_COMPARE) {
+ return (compare_afsdb(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_AFSDB_18_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/cert_37.c b/contrib/bind9/lib/dns/rdata/generic/cert_37.c
index e0398d2..d06b4e6 100644
--- a/contrib/bind9/lib/dns/rdata/generic/cert_37.c
+++ b/contrib/bind9/lib/dns/rdata/generic/cert_37.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cert_37.c,v 1.50 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: cert_37.c,v 1.52 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 21:14:32 EST 2000 by tale */
@@ -276,5 +276,9 @@ checknames_cert(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
-#endif /* RDATA_GENERIC_CERT_37_C */
+static inline int
+casecompare_cert(ARGS_COMPARE) {
+ return (compare_cert(rdata1, rdata2));
+}
+#endif /* RDATA_GENERIC_CERT_37_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/cname_5.c b/contrib/bind9/lib/dns/rdata/generic/cname_5.c
index f44d8c5..508bb20 100644
--- a/contrib/bind9/lib/dns/rdata/generic/cname_5.c
+++ b/contrib/bind9/lib/dns/rdata/generic/cname_5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cname_5.c,v 1.47 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: cname_5.c,v 1.49 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 16:48:45 PST 2000 by brister */
@@ -229,4 +229,9 @@ checknames_cname(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_cname(ARGS_COMPARE) {
+ return (compare_cname(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_CNAME_5_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c b/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c
index 21d7abbb4..0f87433c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c
+++ b/contrib/bind9/lib/dns/rdata/generic/dlv_32769.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2006, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlv_32769.c,v 1.6 2007-06-18 23:47:43 tbox Exp $ */
+/* $Id: dlv_32769.c,v 1.10 2010-12-23 23:47:08 tbox Exp $ */
/* draft-ietf-dnsext-delegation-signer-05.txt */
@@ -74,12 +74,20 @@ fromtext_dlv(ARGS_FROMTEXT) {
/*
* Digest.
*/
- if (c == DNS_DSDIGEST_SHA1)
+ switch (c) {
+ case DNS_DSDIGEST_SHA1:
length = ISC_SHA1_DIGESTLENGTH;
- else if (c == DNS_DSDIGEST_SHA256)
+ break;
+ case DNS_DSDIGEST_SHA256:
length = ISC_SHA256_DIGESTLENGTH;
- else
+ break;
+ case DNS_DSDIGEST_GOST:
+ length = ISC_GOST_DIGESTLENGTH;
+ break;
+ default:
length = -1;
+ break;
+ }
return (isc_hex_tobuffer(lexer, target, -1));
}
@@ -144,7 +152,7 @@ fromwire_dlv(ARGS_FROMWIRE) {
UNUSED(options);
isc_buffer_activeregion(source, &sr);
-
+
/*
* Check digest lengths if we know them.
*/
@@ -152,7 +160,9 @@ fromwire_dlv(ARGS_FROMWIRE) {
(sr.base[3] == DNS_DSDIGEST_SHA1 &&
sr.length < 4 + ISC_SHA1_DIGESTLENGTH) ||
(sr.base[3] == DNS_DSDIGEST_SHA256 &&
- sr.length < 4 + ISC_SHA256_DIGESTLENGTH))
+ sr.length < 4 + ISC_SHA256_DIGESTLENGTH) ||
+ (sr.base[3] == DNS_DSDIGEST_GOST &&
+ sr.length < 4 + ISC_GOST_DIGESTLENGTH))
return (ISC_R_UNEXPECTEDEND);
/*
@@ -164,7 +174,9 @@ fromwire_dlv(ARGS_FROMWIRE) {
sr.length = 4 + ISC_SHA1_DIGESTLENGTH;
else if (sr.base[3] == DNS_DSDIGEST_SHA256)
sr.length = 4 + ISC_SHA256_DIGESTLENGTH;
-
+ else if (sr.base[3] == DNS_DSDIGEST_GOST)
+ sr.length = 4 + ISC_GOST_DIGESTLENGTH;
+
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
}
@@ -213,6 +225,9 @@ fromstruct_dlv(ARGS_FROMSTRUCT) {
case DNS_DSDIGEST_SHA256:
REQUIRE(dlv->length == ISC_SHA256_DIGESTLENGTH);
break;
+ case DNS_DSDIGEST_GOST:
+ REQUIRE(dlv->length == ISC_GOST_DIGESTLENGTH);
+ break;
}
UNUSED(type);
@@ -318,4 +333,9 @@ checknames_dlv(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_dlv(ARGS_COMPARE) {
+ return (compare_dlv(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_DLV_32769_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/dname_39.c b/contrib/bind9/lib/dns/rdata/generic/dname_39.c
index e36702d..61356bf 100644
--- a/contrib/bind9/lib/dns/rdata/generic/dname_39.c
+++ b/contrib/bind9/lib/dns/rdata/generic/dname_39.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dname_39.c,v 1.38 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: dname_39.c,v 1.40 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 16:52:38 PST 2000 by explorer */
@@ -230,4 +230,8 @@ checknames_dname(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_dname(ARGS_COMPARE) {
+ return (compare_dname(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_DNAME_39_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c b/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c
index d526ca0..91fe9f8 100644
--- a/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c
+++ b/contrib/bind9/lib/dns/rdata/generic/dnskey_48.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dnskey_48.c,v 1.8 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: dnskey_48.c,v 1.10 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Wed Mar 15 16:47:10 PST 2000 by halley.
@@ -76,6 +76,7 @@ totext_dnskey(ARGS_TOTEXT) {
char buf[sizeof("64000")];
unsigned int flags;
unsigned char algorithm;
+ char namebuf[DNS_NAME_FORMATSIZE];
REQUIRE(rdata->type == 48);
REQUIRE(rdata->length != 0);
@@ -105,6 +106,15 @@ totext_dnskey(ARGS_TOTEXT) {
if ((flags & 0xc000) == 0xc000)
return (ISC_R_SUCCESS);
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0 &&
+ algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_name_init(&name, NULL);
+ dns_name_fromregion(&name, &sr);
+ dns_name_format(&name, namebuf, sizeof(namebuf));
+ } else
+ namebuf[0] = 0;
+
/* key */
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
RETERR(str_totext(" (", target));
@@ -127,12 +137,18 @@ totext_dnskey(ARGS_TOTEXT) {
dns_rdata_toregion(rdata, &tmpr);
sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
RETERR(str_totext(buf, target));
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ RETERR(str_totext(tctx->linebreak, target));
+ RETERR(str_totext("; alg = ", target));
+ RETERR(str_totext(namebuf, target));
+ }
}
return (ISC_R_SUCCESS);
}
static inline isc_result_t
fromwire_dnskey(ARGS_FROMWIRE) {
+ unsigned char algorithm;
isc_region_t sr;
REQUIRE(type == 48);
@@ -146,6 +162,18 @@ fromwire_dnskey(ARGS_FROMWIRE) {
if (sr.length < 4)
return (ISC_R_UNEXPECTEDEND);
+ algorithm = sr.base[3];
+ RETERR(mem_tobuffer(target, sr.base, 4));
+ isc_region_consume(&sr, 4);
+ isc_buffer_forward(source, 4);
+
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
+ dns_name_init(&name, NULL);
+ RETERR(dns_name_fromwire(&name, source, dctx, options, target));
+ }
+ isc_buffer_activeregion(source, &sr);
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
}
@@ -309,4 +337,13 @@ checknames_dnskey(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_dnskey(ARGS_COMPARE) {
+
+ /*
+ * Treat ALG 253 (private DNS) subtype name case sensistively.
+ */
+ return (compare_dnskey(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_DNSKEY_48_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ds_43.c b/contrib/bind9/lib/dns/rdata/generic/ds_43.c
index fcaa69b..ee74ab67 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ds_43.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ds_43.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds_43.c,v 1.12 2007-06-18 23:47:43 tbox Exp $ */
+/* $Id: ds_43.c,v 1.16 2010-12-23 23:47:08 tbox Exp $ */
/* draft-ietf-dnsext-delegation-signer-05.txt */
@@ -74,12 +74,20 @@ fromtext_ds(ARGS_FROMTEXT) {
/*
* Digest.
*/
- if (c == DNS_DSDIGEST_SHA1)
+ switch (c) {
+ case DNS_DSDIGEST_SHA1:
length = ISC_SHA1_DIGESTLENGTH;
- else if (c == DNS_DSDIGEST_SHA256)
+ break;
+ case DNS_DSDIGEST_SHA256:
length = ISC_SHA256_DIGESTLENGTH;
- else
+ break;
+ case DNS_DSDIGEST_GOST:
+ length = ISC_GOST_DIGESTLENGTH;
+ break;
+ default:
length = -1;
+ break;
+ }
return (isc_hex_tobuffer(lexer, target, length));
}
@@ -152,7 +160,9 @@ fromwire_ds(ARGS_FROMWIRE) {
(sr.base[3] == DNS_DSDIGEST_SHA1 &&
sr.length < 4 + ISC_SHA1_DIGESTLENGTH) ||
(sr.base[3] == DNS_DSDIGEST_SHA256 &&
- sr.length < 4 + ISC_SHA256_DIGESTLENGTH))
+ sr.length < 4 + ISC_SHA256_DIGESTLENGTH) ||
+ (sr.base[3] == DNS_DSDIGEST_GOST &&
+ sr.length < 4 + ISC_GOST_DIGESTLENGTH))
return (ISC_R_UNEXPECTEDEND);
/*
@@ -164,6 +174,8 @@ fromwire_ds(ARGS_FROMWIRE) {
sr.length = 4 + ISC_SHA1_DIGESTLENGTH;
else if (sr.base[3] == DNS_DSDIGEST_SHA256)
sr.length = 4 + ISC_SHA256_DIGESTLENGTH;
+ else if (sr.base[3] == DNS_DSDIGEST_GOST)
+ sr.length = 4 + ISC_GOST_DIGESTLENGTH;
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
@@ -213,6 +225,9 @@ fromstruct_ds(ARGS_FROMSTRUCT) {
case DNS_DSDIGEST_SHA256:
REQUIRE(ds->length == ISC_SHA256_DIGESTLENGTH);
break;
+ case DNS_DSDIGEST_GOST:
+ REQUIRE(ds->length == ISC_GOST_DIGESTLENGTH);
+ break;
}
UNUSED(type);
@@ -318,4 +333,9 @@ checknames_ds(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ds(ARGS_COMPARE) {
+ return (compare_ds(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_DS_43_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/gpos_27.c b/contrib/bind9/lib/dns/rdata/generic/gpos_27.c
index 35fcc50..7a3992a 100644
--- a/contrib/bind9/lib/dns/rdata/generic/gpos_27.c
+++ b/contrib/bind9/lib/dns/rdata/generic/gpos_27.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: gpos_27.c,v 1.41 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: gpos_27.c,v 1.43 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 16:48:45 PST 2000 by brister */
@@ -249,4 +249,9 @@ checknames_gpos(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_gpos(ARGS_COMPARE) {
+ return (compare_gpos(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_GPOS_27_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c b/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c
index 7f31ab0..6b301e6 100644
--- a/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c
+++ b/contrib/bind9/lib/dns/rdata/generic/hinfo_13.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hinfo_13.c,v 1.44 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: hinfo_13.c,v 1.46 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Wed Mar 15 16:47:10 PST 2000 by halley.
@@ -221,4 +221,8 @@ checknames_hinfo(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_hinfo(ARGS_COMPARE) {
+ return (compare_hinfo(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_HINFO_13_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/hip_55.c b/contrib/bind9/lib/dns/rdata/generic/hip_55.c
new file mode 100644
index 0000000..4cda9c6
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/hip_55.c
@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: hip_55.c,v 1.8 2011-01-13 04:59:26 tbox Exp $ */
+
+/* reviewed: TBC */
+
+/* RFC 5205 */
+
+#ifndef RDATA_GENERIC_HIP_5_C
+#define RDATA_GENERIC_HIP_5_C
+
+#define RRTYPE_HIP_ATTRIBUTES (0)
+
+static inline isc_result_t
+fromtext_hip(ARGS_FROMTEXT) {
+ isc_token_t token;
+ dns_name_t name;
+ isc_buffer_t buffer;
+ isc_buffer_t hit_len;
+ isc_buffer_t key_len;
+ unsigned char *start;
+ size_t len;
+
+ REQUIRE(type == 55);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(callbacks);
+
+ /*
+ * Dummy HIT len.
+ */
+ hit_len = *target;
+ RETERR(uint8_tobuffer(0, target));
+
+ /*
+ * Algorithm.
+ */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
+ ISC_FALSE));
+ if (token.value.as_ulong > 0xffU)
+ RETTOK(ISC_R_RANGE);
+ RETERR(uint8_tobuffer(token.value.as_ulong, target));
+
+ /*
+ * Dummy KEY len.
+ */
+ key_len = *target;
+ RETERR(uint16_tobuffer(0, target));
+
+ /*
+ * HIT (base16).
+ */
+ start = isc_buffer_used(target);
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(isc_hex_decodestring(DNS_AS_STR(token), target));
+
+ /*
+ * Fill in HIT len.
+ */
+ len = (unsigned char *)isc_buffer_used(target) - start;
+ if (len > 0xffU)
+ RETTOK(ISC_R_RANGE);
+ RETERR(uint8_tobuffer(len, &hit_len));
+
+ /*
+ * Public key (base64).
+ */
+ start = isc_buffer_used(target);
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(isc_base64_decodestring(DNS_AS_STR(token), target));
+
+ /*
+ * Fill in KEY len.
+ */
+ len = (unsigned char *)isc_buffer_used(target) - start;
+ if (len > 0xffffU)
+ RETTOK(ISC_R_RANGE);
+ RETERR(uint16_tobuffer(len, &key_len));
+
+ /*
+ * Rendezvous Servers.
+ */
+ dns_name_init(&name, NULL);
+ do {
+ RETERR(isc_lex_getmastertoken(lexer, &token,
+ isc_tokentype_string,
+ ISC_TRUE));
+ if (token.type != isc_tokentype_string)
+ break;
+ buffer_fromregion(&buffer, &token.value.as_region);
+ origin = (origin != NULL) ? origin : dns_rootname;
+ RETTOK(dns_name_fromtext(&name, &buffer, origin, options,
+ target));
+ } while (1);
+
+ /*
+ * Let upper layer handle eol/eof.
+ */
+ isc_lex_ungettoken(lexer, &token);
+
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+totext_hip(ARGS_TOTEXT) {
+ isc_region_t region;
+ dns_name_t name;
+ size_t length, key_len, hit_len;
+ unsigned char algorithm;
+ char buf[sizeof("225 ")];
+
+ REQUIRE(rdata->type == 55);
+ REQUIRE(rdata->length != 0);
+
+ dns_rdata_toregion(rdata, &region);
+
+ hit_len = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ algorithm = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ key_len = uint16_fromregion(&region);
+ isc_region_consume(&region, 2);
+
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext("( ", target));
+
+ /*
+ * Algorithm
+ */
+ sprintf(buf, "%u ", algorithm);
+ RETERR(str_totext(buf, target));
+
+ /*
+ * HIT.
+ */
+ INSIST(hit_len < region.length);
+ length = region.length;
+ region.length = hit_len;
+ RETERR(isc_hex_totext(&region, 1, "", target));
+ region.length = length - hit_len;
+ RETERR(str_totext(tctx->linebreak, target));
+
+ /*
+ * Public KEY.
+ */
+ INSIST(key_len <= region.length);
+ length = region.length;
+ region.length = key_len;
+ RETERR(isc_base64_totext(&region, 1, "", target));
+ region.length = length - key_len;
+ RETERR(str_totext(tctx->linebreak, target));
+
+ /*
+ * Rendezvous Servers.
+ */
+ dns_name_init(&name, NULL);
+ while (region.length > 0) {
+ dns_name_fromregion(&name, &region);
+
+ RETERR(dns_name_totext(&name, ISC_FALSE, target));
+ isc_region_consume(&region, name.length);
+ if (region.length > 0)
+ RETERR(str_totext(tctx->linebreak, target));
+ }
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(" )", target));
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_hip(ARGS_FROMWIRE) {
+ isc_region_t region, rr;
+ dns_name_t name;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+
+ REQUIRE(type == 55);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+
+ isc_buffer_activeregion(source, &region);
+ if (region.length < 4U)
+ RETERR(DNS_R_FORMERR);
+
+ rr = region;
+ hit_len = uint8_fromregion(&region);
+ if (hit_len == 0)
+ RETERR(DNS_R_FORMERR);
+ isc_region_consume(&region, 2); /* hit length + algorithm */
+ key_len = uint16_fromregion(&region);
+ if (key_len == 0)
+ RETERR(DNS_R_FORMERR);
+ isc_region_consume(&region, 2);
+ if (region.length < (unsigned) (hit_len + key_len))
+ RETERR(DNS_R_FORMERR);
+
+ RETERR(mem_tobuffer(target, rr.base, 4 + hit_len + key_len));
+ isc_buffer_forward(source, 4 + hit_len + key_len);
+
+ dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
+ while (isc_buffer_activelength(source) > 0) {
+ dns_name_init(&name, NULL);
+ RETERR(dns_name_fromwire(&name, source, dctx, options, target));
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+towire_hip(ARGS_TOWIRE) {
+ isc_region_t region;
+
+ REQUIRE(rdata->type == 55);
+ REQUIRE(rdata->length != 0);
+
+ UNUSED(cctx);
+
+ dns_rdata_toregion(rdata, &region);
+ return (mem_tobuffer(target, region.base, region.length));
+}
+
+static inline int
+compare_hip(ARGS_COMPARE) {
+ isc_region_t region1;
+ isc_region_t region2;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 55);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &region1);
+ dns_rdata_toregion(rdata2, &region2);
+ return (isc_region_compare(&region1, &region2));
+}
+
+static inline isc_result_t
+fromstruct_hip(ARGS_FROMSTRUCT) {
+ dns_rdata_hip_t *hip = source;
+ dns_rdata_hip_t myhip;
+ isc_result_t result;
+
+ REQUIRE(type == 55);
+ REQUIRE(source != NULL);
+ REQUIRE(hip->common.rdtype == type);
+ REQUIRE(hip->common.rdclass == rdclass);
+ REQUIRE(hip->hit_len > 0 && hip->hit != NULL);
+ REQUIRE(hip->key_len > 0 && hip->key != NULL);
+ REQUIRE((hip->servers == NULL && hip->servers_len == 0) ||
+ (hip->servers != NULL && hip->servers_len != 0));
+
+ UNUSED(type);
+ UNUSED(rdclass);
+
+ RETERR(uint8_tobuffer(hip->hit_len, target));
+ RETERR(uint8_tobuffer(hip->algorithm, target));
+ RETERR(uint16_tobuffer(hip->key_len, target));
+ RETERR(mem_tobuffer(target, hip->hit, hip->hit_len));
+ RETERR(mem_tobuffer(target, hip->key, hip->key_len));
+
+ myhip = *hip;
+ for (result = dns_rdata_hip_first(&myhip);
+ result == ISC_R_SUCCESS;
+ result = dns_rdata_hip_next(&myhip))
+ /* empty */;
+
+ return(mem_tobuffer(target, hip->servers, hip->servers_len));
+}
+
+static inline isc_result_t
+tostruct_hip(ARGS_TOSTRUCT) {
+ isc_region_t region;
+ dns_rdata_hip_t *hip = target;
+
+ REQUIRE(rdata->type == 55);
+ REQUIRE(target != NULL);
+ REQUIRE(rdata->length != 0);
+
+ hip->common.rdclass = rdata->rdclass;
+ hip->common.rdtype = rdata->type;
+ ISC_LINK_INIT(&hip->common, link);
+
+ dns_rdata_toregion(rdata, &region);
+
+ hip->hit_len = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ hip->algorithm = uint8_fromregion(&region);
+ isc_region_consume(&region, 1);
+
+ hip->key_len = uint16_fromregion(&region);
+ isc_region_consume(&region, 2);
+
+ hip->hit = hip->key = hip->servers = NULL;
+
+ hip->hit = mem_maybedup(mctx, region.base, hip->hit_len);
+ if (hip->hit == NULL)
+ goto cleanup;
+ isc_region_consume(&region, hip->hit_len);
+
+ hip->key = mem_maybedup(mctx, region.base, hip->key_len);
+ if (hip->key == NULL)
+ goto cleanup;
+ isc_region_consume(&region, hip->key_len);
+
+ hip->servers_len = region.length;
+ if (hip->servers_len != 0) {
+ hip->servers = mem_maybedup(mctx, region.base, region.length);
+ if (hip->servers == NULL)
+ goto cleanup;
+ }
+
+ hip->offset = hip->servers_len;
+ hip->mctx = mctx;
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (hip->hit != NULL)
+ isc_mem_free(mctx, hip->hit);
+ if (hip->key != NULL)
+ isc_mem_free(mctx, hip->key);
+ if (hip->servers != NULL)
+ isc_mem_free(mctx, hip->servers);
+ return (ISC_R_NOMEMORY);
+
+}
+
+static inline void
+freestruct_hip(ARGS_FREESTRUCT) {
+ dns_rdata_hip_t *hip = source;
+
+ REQUIRE(source != NULL);
+
+ if (hip->mctx == NULL)
+ return;
+
+ isc_mem_free(hip->mctx, hip->hit);
+ isc_mem_free(hip->mctx, hip->key);
+ if (hip->servers != NULL)
+ isc_mem_free(hip->mctx, hip->servers);
+ hip->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_hip(ARGS_ADDLDATA) {
+ UNUSED(rdata);
+ UNUSED(add);
+ UNUSED(arg);
+
+ REQUIRE(rdata->type == 55);
+
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_hip(ARGS_DIGEST) {
+ isc_region_t r;
+
+ REQUIRE(rdata->type == 55);
+
+ dns_rdata_toregion(rdata, &r);
+ return ((digest)(arg, &r));
+}
+
+static inline isc_boolean_t
+checkowner_hip(ARGS_CHECKOWNER) {
+
+ REQUIRE(type == 55);
+
+ UNUSED(name);
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(wildcard);
+
+ return (ISC_TRUE);
+}
+
+static inline isc_boolean_t
+checknames_hip(ARGS_CHECKNAMES) {
+
+ REQUIRE(rdata->type == 55);
+
+ UNUSED(rdata);
+ UNUSED(owner);
+ UNUSED(bad);
+
+ return (ISC_TRUE);
+}
+
+isc_result_t
+dns_rdata_hip_first(dns_rdata_hip_t *hip) {
+ if (hip->servers_len == 0)
+ return (ISC_R_NOMORE);
+ hip->offset = 0;
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_rdata_hip_next(dns_rdata_hip_t *hip) {
+ isc_region_t region;
+ dns_name_t name;
+
+ if (hip->offset >= hip->servers_len)
+ return (ISC_R_NOMORE);
+
+ region.base = hip->servers + hip->offset;
+ region.length = hip->servers_len - hip->offset;
+ dns_name_init(&name, NULL);
+ dns_name_fromregion(&name, &region);
+ hip->offset += name.length;
+ INSIST(hip->offset <= hip->servers_len);
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_rdata_hip_current(dns_rdata_hip_t *hip, dns_name_t *name) {
+ isc_region_t region;
+
+ REQUIRE(hip->offset < hip->servers_len);
+
+ region.base = hip->servers + hip->offset;
+ region.length = hip->servers_len - hip->offset;
+ dns_name_fromregion(name, &region);
+
+ INSIST(name->length + hip->offset <= hip->servers_len);
+}
+
+static inline int
+casecompare_hip(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 55);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+
+ INSIST(r1.length > 4);
+ INSIST(r2.length > 4);
+ r1.length = 4;
+ r2.length = 4;
+ order = isc_region_compare(&r1, &r2);
+ if (order != 0)
+ return (order);
+
+ hit_len = uint8_fromregion(&r1);
+ isc_region_consume(&r1, 2); /* hit length + algorithm */
+ key_len = uint16_fromregion(&r1);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ isc_region_consume(&r1, 4);
+ isc_region_consume(&r2, 4);
+ INSIST(r1.length >= (unsigned) (hit_len + key_len));
+ INSIST(r2.length >= (unsigned) (hit_len + key_len));
+ order = isc_region_compare(&r1, &r2);
+ if (order != 0)
+ return (order);
+ isc_region_consume(&r1, hit_len + key_len);
+ isc_region_consume(&r2, hit_len + key_len);
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+ while (r1.length != 0 && r2.length != 0) {
+ dns_name_fromregion(&name1, &r1);
+ dns_name_fromregion(&name2, &r2);
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&r1, name_length(&name1));
+ isc_region_consume(&r2, name_length(&name2));
+ }
+ return (isc_region_compare(&r1, &r2));
+}
+
+#endif /* RDATA_GENERIC_HIP_5_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/hip_55.h b/contrib/bind9/lib/dns/rdata/generic/hip_55.h
new file mode 100644
index 0000000..79828ad
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/hip_55.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: hip_55.h,v 1.2 2009-02-26 06:09:19 marka Exp $ */
+
+#ifndef GENERIC_HIP_5_H
+#define GENERIC_HIP_5_H 1
+
+/* RFC 5205 */
+
+typedef struct dns_rdata_hip {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ unsigned char * hit;
+ unsigned char * key;
+ unsigned char * servers;
+ isc_uint8_t algorithm;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+ isc_uint16_t servers_len;
+ /* Private */
+ isc_uint16_t offset;
+} dns_rdata_hip_t;
+
+isc_result_t
+dns_rdata_hip_first(dns_rdata_hip_t *);
+
+isc_result_t
+dns_rdata_hip_next(dns_rdata_hip_t *);
+
+void
+dns_rdata_hip_current(dns_rdata_hip_t *, dns_name_t *);
+
+#endif /* GENERIC_HIP_5_H */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c b/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c
index f971d49..995a135 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ipseckey_45.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ipseckey_45.c,v 1.4.332.5 2011-01-13 04:48:23 tbox Exp $ */
+/* $Id: ipseckey_45.c,v 1.11 2011-01-13 04:59:26 tbox Exp $ */
#ifndef RDATA_GENERIC_IPSECKEY_45_C
#define RDATA_GENERIC_IPSECKEY_45_C
@@ -456,4 +456,43 @@ checknames_ipseckey(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ipseckey(ARGS_COMPARE) {
+ isc_region_t region1;
+ isc_region_t region2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 45);
+ REQUIRE(rdata1->length >= 3);
+ REQUIRE(rdata2->length >= 3);
+
+ dns_rdata_toregion(rdata1, &region1);
+ dns_rdata_toregion(rdata2, &region2);
+
+ if (memcmp(region1.base, region2.base, 3) != 0 || region1.base[1] != 3)
+ return (isc_region_compare(&region1, &region2));
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+
+ isc_region_consume(&region1, 3);
+ isc_region_consume(&region2, 3);
+
+ dns_name_fromregion(&name1, &region1);
+ dns_name_fromregion(&name2, &region2);
+
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&region1, name_length(&name1));
+ isc_region_consume(&region2, name_length(&name2));
+
+ return (isc_region_compare(&region1, &region2));
+}
+
#endif /* RDATA_GENERIC_IPSECKEY_45_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/isdn_20.c b/contrib/bind9/lib/dns/rdata/generic/isdn_20.c
index a9e03b2c..b58776c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/isdn_20.c
+++ b/contrib/bind9/lib/dns/rdata/generic/isdn_20.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: isdn_20.c,v 1.38 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: isdn_20.c,v 1.40 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 16:53:11 PST 2000 by bwelling */
@@ -231,4 +231,9 @@ checknames_isdn(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_isdn(ARGS_COMPARE) {
+ return (compare_isdn(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_ISDN_20_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/key_25.c b/contrib/bind9/lib/dns/rdata/generic/key_25.c
index acd314c..6fe27cb 100644
--- a/contrib/bind9/lib/dns/rdata/generic/key_25.c
+++ b/contrib/bind9/lib/dns/rdata/generic/key_25.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: key_25.c,v 1.51 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: key_25.c,v 1.53 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Wed Mar 15 16:47:10 PST 2000 by halley.
@@ -76,6 +76,7 @@ totext_key(ARGS_TOTEXT) {
char buf[sizeof("64000")];
unsigned int flags;
unsigned char algorithm;
+ char namebuf[DNS_NAME_FORMATSIZE];
REQUIRE(rdata->type == 25);
REQUIRE(rdata->length != 0);
@@ -105,6 +106,15 @@ totext_key(ARGS_TOTEXT) {
if ((flags & 0xc000) == 0xc000)
return (ISC_R_SUCCESS);
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0 &&
+ algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_name_init(&name, NULL);
+ dns_name_fromregion(&name, &sr);
+ dns_name_format(&name, namebuf, sizeof(namebuf));
+ } else
+ namebuf[0] = 0;
+
/* key */
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
RETERR(str_totext(" (", target));
@@ -127,12 +137,18 @@ totext_key(ARGS_TOTEXT) {
dns_rdata_toregion(rdata, &tmpr);
sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
RETERR(str_totext(buf, target));
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ RETERR(str_totext(tctx->linebreak, target));
+ RETERR(str_totext("; alg = ", target));
+ RETERR(str_totext(namebuf, target));
+ }
}
return (ISC_R_SUCCESS);
}
static inline isc_result_t
fromwire_key(ARGS_FROMWIRE) {
+ unsigned char algorithm;
isc_region_t sr;
REQUIRE(type == 25);
@@ -146,6 +162,18 @@ fromwire_key(ARGS_FROMWIRE) {
if (sr.length < 4)
return (ISC_R_UNEXPECTEDEND);
+ algorithm = sr.base[3];
+ RETERR(mem_tobuffer(target, sr.base, 4));
+ isc_region_consume(&sr, 4);
+ isc_buffer_forward(source, 4);
+
+ if (algorithm == DNS_KEYALG_PRIVATEDNS) {
+ dns_name_t name;
+ dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
+ dns_name_init(&name, NULL);
+ RETERR(dns_name_fromwire(&name, source, dctx, options, target));
+ }
+ isc_buffer_activeregion(source, &sr);
isc_buffer_forward(source, sr.length);
return (mem_tobuffer(target, sr.base, sr.length));
}
@@ -309,4 +337,9 @@ checknames_key(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_key(ARGS_COMPARE) {
+ return (compare_key(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_KEY_25_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/keydata_65533.c b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.c
new file mode 100644
index 0000000..3636209
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.c
@@ -0,0 +1,377 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: keydata_65533.c,v 1.3 2009-12-04 21:09:33 marka Exp $ */
+
+#ifndef GENERIC_KEYDATA_65533_C
+#define GENERIC_KEYDATA_65533_C 1
+
+#include <dst/dst.h>
+
+#define RRTYPE_KEYDATA_ATTRIBUTES (DNS_RDATATYPEATTR_DNSSEC)
+
+static inline isc_result_t
+fromtext_keydata(ARGS_FROMTEXT) {
+ isc_token_t token;
+ dns_secalg_t alg;
+ dns_secproto_t proto;
+ dns_keyflags_t flags;
+ isc_uint32_t refresh, addhd, removehd;
+
+ REQUIRE(type == 65533);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(origin);
+ UNUSED(options);
+ UNUSED(callbacks);
+
+ /* refresh timer */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &refresh));
+ RETERR(uint32_tobuffer(refresh, target));
+
+ /* add hold-down */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &addhd));
+ RETERR(uint32_tobuffer(addhd, target));
+
+ /* remove hold-down */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &removehd));
+ RETERR(uint32_tobuffer(removehd, target));
+
+ /* flags */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_keyflags_fromtext(&flags, &token.value.as_textregion));
+ RETERR(uint16_tobuffer(flags, target));
+
+ /* protocol */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_secproto_fromtext(&proto, &token.value.as_textregion));
+ RETERR(mem_tobuffer(target, &proto, 1));
+
+ /* algorithm */
+ RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
+ ISC_FALSE));
+ RETTOK(dns_secalg_fromtext(&alg, &token.value.as_textregion));
+ RETERR(mem_tobuffer(target, &alg, 1));
+
+ /* No Key? */
+ if ((flags & 0xc000) == 0xc000)
+ return (ISC_R_SUCCESS);
+
+ return (isc_base64_tobuffer(lexer, target, -1));
+}
+
+static inline isc_result_t
+totext_keydata(ARGS_TOTEXT) {
+ isc_region_t sr;
+ char buf[sizeof("64000")];
+ unsigned int flags;
+ unsigned char algorithm;
+ unsigned long when;
+
+ REQUIRE(rdata->type == 65533);
+ REQUIRE(rdata->length != 0);
+
+ dns_rdata_toregion(rdata, &sr);
+
+ /* refresh timer */
+ when = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+ RETERR(dns_time32_totext(when, target));
+ RETERR(str_totext(" ", target));
+
+ /* add hold-down */
+ when = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+ RETERR(dns_time32_totext(when, target));
+ RETERR(str_totext(" ", target));
+
+ /* remove hold-down */
+ when = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+ RETERR(dns_time32_totext(when, target));
+ RETERR(str_totext(" ", target));
+
+ /* flags */
+ flags = uint16_fromregion(&sr);
+ isc_region_consume(&sr, 2);
+ sprintf(buf, "%u", flags);
+ RETERR(str_totext(buf, target));
+ RETERR(str_totext(" ", target));
+
+ /* protocol */
+ sprintf(buf, "%u", sr.base[0]);
+ isc_region_consume(&sr, 1);
+ RETERR(str_totext(buf, target));
+ RETERR(str_totext(" ", target));
+
+ /* algorithm */
+ algorithm = sr.base[0];
+ sprintf(buf, "%u", algorithm);
+ isc_region_consume(&sr, 1);
+ RETERR(str_totext(buf, target));
+
+ /* No Key? */
+ if ((flags & 0xc000) == 0xc000)
+ return (ISC_R_SUCCESS);
+
+ /* key */
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(" (", target));
+ RETERR(str_totext(tctx->linebreak, target));
+ RETERR(isc_base64_totext(&sr, tctx->width - 2,
+ tctx->linebreak, target));
+
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0)
+ RETERR(str_totext(tctx->linebreak, target));
+ else if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(" ", target));
+
+ if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+ RETERR(str_totext(")", target));
+
+ if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0) {
+ isc_region_t tmpr;
+
+ RETERR(str_totext(" ; key id = ", target));
+ dns_rdata_toregion(rdata, &tmpr);
+ /* Skip over refresh, addhd, and removehd */
+ isc_region_consume(&tmpr, 12);
+ sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
+ RETERR(str_totext(buf, target));
+ }
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_keydata(ARGS_FROMWIRE) {
+ isc_region_t sr;
+
+ REQUIRE(type == 65533);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(dctx);
+ UNUSED(options);
+
+ isc_buffer_activeregion(source, &sr);
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+
+ isc_buffer_forward(source, sr.length);
+ return (mem_tobuffer(target, sr.base, sr.length));
+}
+
+static inline isc_result_t
+towire_keydata(ARGS_TOWIRE) {
+ isc_region_t sr;
+
+ REQUIRE(rdata->type == 65533);
+ REQUIRE(rdata->length != 0);
+
+ UNUSED(cctx);
+
+ dns_rdata_toregion(rdata, &sr);
+ return (mem_tobuffer(target, sr.base, sr.length));
+}
+
+static inline int
+compare_keydata(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 65533);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ return (isc_region_compare(&r1, &r2));
+}
+
+static inline isc_result_t
+fromstruct_keydata(ARGS_FROMSTRUCT) {
+ dns_rdata_keydata_t *keydata = source;
+
+ REQUIRE(type == 65533);
+ REQUIRE(source != NULL);
+ REQUIRE(keydata->common.rdtype == type);
+ REQUIRE(keydata->common.rdclass == rdclass);
+
+ UNUSED(type);
+ UNUSED(rdclass);
+
+ /* Refresh timer */
+ RETERR(uint32_tobuffer(keydata->refresh, target));
+
+ /* Add hold-down */
+ RETERR(uint32_tobuffer(keydata->addhd, target));
+
+ /* Remove hold-down */
+ RETERR(uint32_tobuffer(keydata->removehd, target));
+
+ /* Flags */
+ RETERR(uint16_tobuffer(keydata->flags, target));
+
+ /* Protocol */
+ RETERR(uint8_tobuffer(keydata->protocol, target));
+
+ /* Algorithm */
+ RETERR(uint8_tobuffer(keydata->algorithm, target));
+
+ /* Data */
+ return (mem_tobuffer(target, keydata->data, keydata->datalen));
+}
+
+static inline isc_result_t
+tostruct_keydata(ARGS_TOSTRUCT) {
+ dns_rdata_keydata_t *keydata = target;
+ isc_region_t sr;
+
+ REQUIRE(rdata->type == 65533);
+ REQUIRE(target != NULL);
+ REQUIRE(rdata->length != 0);
+
+ keydata->common.rdclass = rdata->rdclass;
+ keydata->common.rdtype = rdata->type;
+ ISC_LINK_INIT(&keydata->common, link);
+
+ dns_rdata_toregion(rdata, &sr);
+
+ /* Refresh timer */
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->refresh = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+
+ /* Add hold-down */
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->addhd = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+
+ /* Remove hold-down */
+ if (sr.length < 4)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->removehd = uint32_fromregion(&sr);
+ isc_region_consume(&sr, 4);
+
+ /* Flags */
+ if (sr.length < 2)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->flags = uint16_fromregion(&sr);
+ isc_region_consume(&sr, 2);
+
+ /* Protocol */
+ if (sr.length < 1)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->protocol = uint8_fromregion(&sr);
+ isc_region_consume(&sr, 1);
+
+ /* Algorithm */
+ if (sr.length < 1)
+ return (ISC_R_UNEXPECTEDEND);
+ keydata->algorithm = uint8_fromregion(&sr);
+ isc_region_consume(&sr, 1);
+
+ /* Data */
+ keydata->datalen = sr.length;
+ keydata->data = mem_maybedup(mctx, sr.base, keydata->datalen);
+ if (keydata->data == NULL)
+ return (ISC_R_NOMEMORY);
+
+ keydata->mctx = mctx;
+ return (ISC_R_SUCCESS);
+}
+
+static inline void
+freestruct_keydata(ARGS_FREESTRUCT) {
+ dns_rdata_keydata_t *keydata = (dns_rdata_keydata_t *) source;
+
+ REQUIRE(source != NULL);
+ REQUIRE(keydata->common.rdtype == 65533);
+
+ if (keydata->mctx == NULL)
+ return;
+
+ if (keydata->data != NULL)
+ isc_mem_free(keydata->mctx, keydata->data);
+ keydata->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_keydata(ARGS_ADDLDATA) {
+ REQUIRE(rdata->type == 65533);
+
+ UNUSED(rdata);
+ UNUSED(add);
+ UNUSED(arg);
+
+ return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_keydata(ARGS_DIGEST) {
+ isc_region_t r;
+
+ REQUIRE(rdata->type == 65533);
+
+ dns_rdata_toregion(rdata, &r);
+
+ return ((digest)(arg, &r));
+}
+
+static inline isc_boolean_t
+checkowner_keydata(ARGS_CHECKOWNER) {
+
+ REQUIRE(type == 65533);
+
+ UNUSED(name);
+ UNUSED(type);
+ UNUSED(rdclass);
+ UNUSED(wildcard);
+
+ return (ISC_TRUE);
+}
+
+static inline isc_boolean_t
+checknames_keydata(ARGS_CHECKNAMES) {
+
+ REQUIRE(rdata->type == 65533);
+
+ UNUSED(rdata);
+ UNUSED(owner);
+ UNUSED(bad);
+
+ return (ISC_TRUE);
+}
+
+static inline int
+casecompare_keydata(ARGS_COMPARE) {
+ return (compare_keydata(rdata1, rdata2));
+}
+
+#endif /* GENERIC_KEYDATA_65533_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/keydata_65533.h b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.h
new file mode 100644
index 0000000..21cb1ba
--- /dev/null
+++ b/contrib/bind9/lib/dns/rdata/generic/keydata_65533.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+#ifndef GENERIC_KEYDATA_65533_H
+#define GENERIC_KEYDATA_65533_H 1
+
+/* $Id: keydata_65533.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+typedef struct dns_rdata_keydata {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ isc_uint32_t refresh; /* Timer for refreshing data */
+ isc_uint32_t addhd; /* Hold-down timer for adding */
+ isc_uint32_t removehd; /* Hold-down timer for removing */
+ isc_uint16_t flags; /* Copy of DNSKEY_48 */
+ isc_uint8_t protocol;
+ isc_uint8_t algorithm;
+ isc_uint16_t datalen;
+ unsigned char * data;
+} dns_rdata_keydata_t;
+
+#endif /* GENERIC_KEYDATA_65533_H */
diff --git a/contrib/bind9/lib/dns/rdata/generic/loc_29.c b/contrib/bind9/lib/dns/rdata/generic/loc_29.c
index a5efb01..62d5cd0 100644
--- a/contrib/bind9/lib/dns/rdata/generic/loc_29.c
+++ b/contrib/bind9/lib/dns/rdata/generic/loc_29.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: loc_29.c,v 1.45.332.4 2009-02-17 05:54:12 marka Exp $ */
+/* $Id: loc_29.c,v 1.50 2009-12-04 21:09:33 marka Exp $ */
/* Reviewed: Wed Mar 15 18:13:09 PST 2000 by explorer */
@@ -796,4 +796,9 @@ checknames_loc(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_loc(ARGS_COMPARE) {
+ return (compare_loc(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_LOC_29_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mb_7.c b/contrib/bind9/lib/dns/rdata/generic/mb_7.c
index c47365a..7a4af1c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mb_7.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mb_7.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mb_7.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mb_7.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 17:31:26 PST 2000 by bwelling */
@@ -69,7 +69,7 @@ totext_mb(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mb(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 7);
@@ -78,8 +78,8 @@ fromwire_mb(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -231,4 +231,9 @@ checknames_mb(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mb(ARGS_COMPARE) {
+ return (compare_mb(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MB_7_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/md_3.c b/contrib/bind9/lib/dns/rdata/generic/md_3.c
index 269f9be..ee06274 100644
--- a/contrib/bind9/lib/dns/rdata/generic/md_3.c
+++ b/contrib/bind9/lib/dns/rdata/generic/md_3.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md_3.c,v 1.47 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: md_3.c,v 1.49 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 17:48:20 PST 2000 by bwelling */
@@ -69,7 +69,7 @@ totext_md(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_md(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 3);
@@ -78,8 +78,8 @@ fromwire_md(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -233,4 +233,9 @@ checknames_md(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_md(ARGS_COMPARE) {
+ return (compare_md(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MD_3_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mf_4.c b/contrib/bind9/lib/dns/rdata/generic/mf_4.c
index 9223384..d14bf6c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mf_4.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mf_4.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mf_4.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mf_4.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 17:47:33 PST 2000 by brister */
@@ -69,7 +69,7 @@ totext_mf(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mf(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 4);
@@ -78,8 +78,8 @@ fromwire_mf(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -232,4 +232,9 @@ checknames_mf(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mf(ARGS_COMPARE) {
+ return (compare_mf(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MF_4_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mg_8.c b/contrib/bind9/lib/dns/rdata/generic/mg_8.c
index ba7630c..c1d553a 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mg_8.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mg_8.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mg_8.c,v 1.43 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mg_8.c,v 1.45 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 17:49:21 PST 2000 by brister */
@@ -69,7 +69,7 @@ totext_mg(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mg(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 8);
@@ -78,8 +78,8 @@ fromwire_mg(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -227,4 +227,9 @@ checknames_mg(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mg(ARGS_COMPARE) {
+ return (compare_mg(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MG_8_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/minfo_14.c b/contrib/bind9/lib/dns/rdata/generic/minfo_14.c
index 6848a4e..881e624 100644
--- a/contrib/bind9/lib/dns/rdata/generic/minfo_14.c
+++ b/contrib/bind9/lib/dns/rdata/generic/minfo_14.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: minfo_14.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: minfo_14.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 17:45:32 PST 2000 by brister */
@@ -93,8 +93,8 @@ totext_minfo(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_minfo(ARGS_FROMWIRE) {
- dns_name_t rmail;
- dns_name_t email;
+ dns_name_t rmail;
+ dns_name_t email;
REQUIRE(type == 14);
@@ -103,11 +103,11 @@ fromwire_minfo(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&rmail, NULL);
- dns_name_init(&email, NULL);
+ dns_name_init(&rmail, NULL);
+ dns_name_init(&email, NULL);
- RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
- return (dns_name_fromwire(&email, source, dctx, options, target));
+ RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
+ return (dns_name_fromwire(&email, source, dctx, options, target));
}
static inline isc_result_t
@@ -321,4 +321,9 @@ checknames_minfo(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_minfo(ARGS_COMPARE) {
+ return (compare_minfo(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MINFO_14_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mr_9.c b/contrib/bind9/lib/dns/rdata/generic/mr_9.c
index a480bd4..6c02108 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mr_9.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mr_9.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mr_9.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mr_9.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 21:30:35 EST 2000 by tale */
@@ -69,7 +69,7 @@ totext_mr(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mr(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 9);
@@ -78,8 +78,8 @@ fromwire_mr(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -228,4 +228,9 @@ checknames_mr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mr(ARGS_COMPARE) {
+ return (compare_mr(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MR_9_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/mx_15.c b/contrib/bind9/lib/dns/rdata/generic/mx_15.c
index b7b43f3..0d8e6cd 100644
--- a/contrib/bind9/lib/dns/rdata/generic/mx_15.c
+++ b/contrib/bind9/lib/dns/rdata/generic/mx_15.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mx_15.c,v 1.56 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: mx_15.c,v 1.58 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 18:05:46 PST 2000 by brister */
@@ -120,7 +120,7 @@ totext_mx(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_mx(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
REQUIRE(type == 15);
@@ -130,7 +130,7 @@ fromwire_mx(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
isc_buffer_activeregion(source, &sregion);
if (sregion.length < 2)
@@ -316,4 +316,9 @@ checknames_mx(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_mx(ARGS_COMPARE) {
+ return (compare_mx(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_MX_15_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ns_2.c b/contrib/bind9/lib/dns/rdata/generic/ns_2.c
index 14e0c9d..f3df004 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ns_2.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ns_2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ns_2.c,v 1.46 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: ns_2.c,v 1.48 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Wed Mar 15 18:15:00 PST 2000 by bwelling */
@@ -77,7 +77,7 @@ totext_ns(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_ns(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 2);
@@ -86,8 +86,8 @@ fromwire_ns(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -248,4 +248,9 @@ checknames_ns(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ns(ARGS_COMPARE) {
+ return (compare_ns(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NS_2_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c b/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c
index 890af1a..d21b009 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nsec3_50.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3_50.c,v 1.4.48.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: nsec3_50.c,v 1.7 2009-12-04 21:09:34 marka Exp $ */
/*
* Copyright (C) 2004 Nominet, Ltd.
@@ -478,4 +478,9 @@ checknames_nsec3(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nsec3(ARGS_COMPARE) {
+ return (compare_nsec3(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NSEC3_50_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c b/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c
index 1457015..01beb3c 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nsec3param_51.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec3param_51.c,v 1.4.48.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: nsec3param_51.c,v 1.7 2009-12-04 21:09:34 marka Exp $ */
/*
* Copyright (C) 2004 Nominet, Ltd.
@@ -311,4 +311,9 @@ checknames_nsec3param(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nsec3param(ARGS_COMPARE) {
+ return (compare_nsec3param(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NSEC3PARAM_51_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nsec_47.c b/contrib/bind9/lib/dns/rdata/generic/nsec_47.c
index ace1035..5807d5f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nsec_47.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nsec_47.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007, 2008, 2011 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsec_47.c,v 1.11.82.2 2011-01-13 04:48:23 tbox Exp $ */
+/* $Id: nsec_47.c,v 1.15 2011-01-13 04:59:26 tbox Exp $ */
/* reviewed: Wed Mar 15 18:21:15 PST 2000 by brister */
@@ -361,4 +361,36 @@ checknames_nsec(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nsec(ARGS_COMPARE) {
+ isc_region_t region1;
+ isc_region_t region2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 47);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+
+ dns_rdata_toregion(rdata1, &region1);
+ dns_rdata_toregion(rdata2, &region2);
+
+ dns_name_fromregion(&name1, &region1);
+ dns_name_fromregion(&name2, &region2);
+
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&region1, name_length(&name1));
+ isc_region_consume(&region2, name_length(&name2));
+
+ return (isc_region_compare(&region1, &region2));
+}
#endif /* RDATA_GENERIC_NSEC_47_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/null_10.c b/contrib/bind9/lib/dns/rdata/generic/null_10.c
index 06a8877..e6d9b9a 100644
--- a/contrib/bind9/lib/dns/rdata/generic/null_10.c
+++ b/contrib/bind9/lib/dns/rdata/generic/null_10.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: null_10.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: null_10.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 13:57:50 PST 2000 by explorer */
@@ -189,4 +189,9 @@ checknames_null(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_null(ARGS_COMPARE) {
+ return (compare_null(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_NULL_10_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/nxt_30.c b/contrib/bind9/lib/dns/rdata/generic/nxt_30.c
index 362e6fc..44ded55 100644
--- a/contrib/bind9/lib/dns/rdata/generic/nxt_30.c
+++ b/contrib/bind9/lib/dns/rdata/generic/nxt_30.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nxt_30.c,v 1.63 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: nxt_30.c,v 1.65 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Wed Mar 15 18:21:15 PST 2000 by brister */
@@ -326,4 +326,8 @@ checknames_nxt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_nxt(ARGS_COMPARE) {
+ return (compare_nxt(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_NXT_30_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/opt_41.c b/contrib/bind9/lib/dns/rdata/generic/opt_41.c
index 506f4a3..695057d 100644
--- a/contrib/bind9/lib/dns/rdata/generic/opt_41.c
+++ b/contrib/bind9/lib/dns/rdata/generic/opt_41.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: opt_41.c,v 1.33 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: opt_41.c,v 1.35 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 14:06:44 PST 2000 by gson */
@@ -277,4 +277,9 @@ checknames_opt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_opt(ARGS_COMPARE) {
+ return (compare_opt(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_OPT_41_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/proforma.c b/contrib/bind9/lib/dns/rdata/generic/proforma.c
index c3db196..0efc197 100644
--- a/contrib/bind9/lib/dns/rdata/generic/proforma.c
+++ b/contrib/bind9/lib/dns/rdata/generic/proforma.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: proforma.c,v 1.36 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: proforma.c,v 1.38 2009-12-04 22:06:37 tbox Exp $ */
#ifndef RDATA_GENERIC_#_#_C
#define RDATA_GENERIC_#_#_C
@@ -170,4 +170,21 @@ checknames_#(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_#(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == #);
+ REQUIRE(rdata1->rdclass == #);
+ REQUIRE(rdata1->length != 0); /* XXX */
+ REQUIRE(rdata2->length != 0); /* XXX */
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ return (isc_region_compare(&r1, &r2));
+}
+
#endif /* RDATA_GENERIC_#_#_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/ptr_12.c b/contrib/bind9/lib/dns/rdata/generic/ptr_12.c
index 8e718cd..0ed648f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/ptr_12.c
+++ b/contrib/bind9/lib/dns/rdata/generic/ptr_12.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ptr_12.c,v 1.43 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: ptr_12.c,v 1.45 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 14:05:12 PST 2000 by explorer */
@@ -79,7 +79,7 @@ totext_ptr(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_ptr(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 12);
@@ -88,8 +88,8 @@ fromwire_ptr(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -288,4 +288,8 @@ checknames_ptr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_ptr(ARGS_COMPARE) {
+ return (compare_ptr(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_PTR_12_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/rp_17.c b/contrib/bind9/lib/dns/rdata/generic/rp_17.c
index 19d7b35..2865e2f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/rp_17.c
+++ b/contrib/bind9/lib/dns/rdata/generic/rp_17.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rp_17.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: rp_17.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* RFC1183 */
@@ -93,8 +93,8 @@ totext_rp(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_rp(ARGS_FROMWIRE) {
- dns_name_t rmail;
- dns_name_t email;
+ dns_name_t rmail;
+ dns_name_t email;
REQUIRE(type == 17);
@@ -103,11 +103,11 @@ fromwire_rp(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&rmail, NULL);
- dns_name_init(&email, NULL);
+ dns_name_init(&rmail, NULL);
+ dns_name_init(&email, NULL);
- RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
- return (dns_name_fromwire(&email, source, dctx, options, target));
+ RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
+ return (dns_name_fromwire(&email, source, dctx, options, target));
}
static inline isc_result_t
@@ -311,4 +311,8 @@ checknames_rp(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_rp(ARGS_COMPARE) {
+ return (compare_rp(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_RP_17_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c b/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c
index bcbb05b..1fa7d07 100644
--- a/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c
+++ b/contrib/bind9/lib/dns/rdata/generic/rrsig_46.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rrsig_46.c,v 1.10.332.2 2011-01-13 04:48:23 tbox Exp $ */
+/* $Id: rrsig_46.c,v 1.14 2011-01-13 04:59:26 tbox Exp $ */
/* Reviewed: Fri Mar 17 09:05:02 PST 2000 by gson */
@@ -544,4 +544,47 @@ checknames_rrsig(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_rrsig(ARGS_COMPARE) {
+ isc_region_t r1;
+ isc_region_t r2;
+ dns_name_t name1;
+ dns_name_t name2;
+ int order;
+
+ REQUIRE(rdata1->type == rdata2->type);
+ REQUIRE(rdata1->rdclass == rdata2->rdclass);
+ REQUIRE(rdata1->type == 46);
+ REQUIRE(rdata1->length != 0);
+ REQUIRE(rdata2->length != 0);
+
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+
+ INSIST(r1.length > 18);
+ INSIST(r2.length > 18);
+ r1.length = 18;
+ r2.length = 18;
+ order = isc_region_compare(&r1, &r2);
+ if (order != 0)
+ return (order);
+
+ dns_name_init(&name1, NULL);
+ dns_name_init(&name2, NULL);
+ dns_rdata_toregion(rdata1, &r1);
+ dns_rdata_toregion(rdata2, &r2);
+ isc_region_consume(&r1, 18);
+ isc_region_consume(&r2, 18);
+ dns_name_fromregion(&name1, &r1);
+ dns_name_fromregion(&name2, &r2);
+ order = dns_name_rdatacompare(&name1, &name2);
+ if (order != 0)
+ return (order);
+
+ isc_region_consume(&r1, name_length(&name1));
+ isc_region_consume(&r2, name_length(&name2));
+
+ return (isc_region_compare(&r1, &r2));
+}
+
#endif /* RDATA_GENERIC_RRSIG_46_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/rt_21.c b/contrib/bind9/lib/dns/rdata/generic/rt_21.c
index 48323c7..efd51e2 100644
--- a/contrib/bind9/lib/dns/rdata/generic/rt_21.c
+++ b/contrib/bind9/lib/dns/rdata/generic/rt_21.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rt_21.c,v 1.46 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: rt_21.c,v 1.48 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Thu Mar 16 15:02:31 PST 2000 by brister */
@@ -90,7 +90,7 @@ totext_rt(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_rt(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
isc_region_t tregion;
@@ -101,7 +101,7 @@ fromwire_rt(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
isc_buffer_activeregion(source, &sregion);
isc_buffer_availableregion(target, &tregion);
@@ -308,4 +308,9 @@ checknames_rt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_rt(ARGS_COMPARE) {
+ return (compare_rt(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_RT_21_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/sig_24.c b/contrib/bind9/lib/dns/rdata/generic/sig_24.c
index 3010b8e..6366309 100644
--- a/contrib/bind9/lib/dns/rdata/generic/sig_24.c
+++ b/contrib/bind9/lib/dns/rdata/generic/sig_24.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sig_24.c,v 1.66 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sig_24.c,v 1.68 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 09:05:02 PST 2000 by gson */
@@ -575,4 +575,8 @@ checknames_sig(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_sig(ARGS_COMPARE) {
+ return (compare_sig(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_SIG_24_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/soa_6.c b/contrib/bind9/lib/dns/rdata/generic/soa_6.c
index d3fdf41..34361a8 100644
--- a/contrib/bind9/lib/dns/rdata/generic/soa_6.c
+++ b/contrib/bind9/lib/dns/rdata/generic/soa_6.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: soa_6.c,v 1.61.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: soa_6.c,v 1.64 2009-12-04 21:09:34 marka Exp $ */
/* Reviewed: Thu Mar 16 15:18:32 PST 2000 by explorer */
@@ -441,4 +441,9 @@ checknames_soa(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_soa(ARGS_COMPARE) {
+ return (compare_soa(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_SOA_6_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/spf_99.c b/contrib/bind9/lib/dns/rdata/generic/spf_99.c
index b1ad062..0f8ba5f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/spf_99.c
+++ b/contrib/bind9/lib/dns/rdata/generic/spf_99.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: spf_99.c,v 1.4 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: spf_99.c,v 1.6 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 15:40:00 PST 2000 by bwelling */
@@ -235,4 +235,8 @@ checknames_spf(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_spf(ARGS_COMPARE) {
+ return (compare_spf(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_SPF_99_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c b/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c
index 892c1ec..7b34451 100644
--- a/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c
+++ b/contrib/bind9/lib/dns/rdata/generic/sshfp_44.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2006, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sshfp_44.c,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sshfp_44.c,v 1.9 2009-12-04 22:06:37 tbox Exp $ */
/* RFC 4255 */
@@ -259,4 +259,9 @@ checknames_sshfp(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_sshfp(ARGS_COMPARE) {
+ return (compare_sshfp(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_SSHFP_44_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/tkey_249.c b/contrib/bind9/lib/dns/rdata/generic/tkey_249.c
index 6927c8d..64acc0f 100644
--- a/contrib/bind9/lib/dns/rdata/generic/tkey_249.c
+++ b/contrib/bind9/lib/dns/rdata/generic/tkey_249.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tkey_249.c,v 1.57 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: tkey_249.c,v 1.59 2009-12-04 22:06:37 tbox Exp $ */
/*
* Reviewed: Thu Mar 16 17:35:30 PST 2000 by halley.
@@ -552,4 +552,8 @@ checknames_tkey(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline isc_result_t
+casecompare_tkey(ARGS_COMPARE) {
+ return (compare_tkey(rdata1, rdata2));
+}
#endif /* RDATA_GENERIC_TKEY_249_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/txt_16.c b/contrib/bind9/lib/dns/rdata/generic/txt_16.c
index fa14b86..e04e0f0 100644
--- a/contrib/bind9/lib/dns/rdata/generic/txt_16.c
+++ b/contrib/bind9/lib/dns/rdata/generic/txt_16.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: txt_16.c,v 1.45 2008-02-15 23:46:51 tbox Exp $ */
+/* $Id: txt_16.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 15:40:00 PST 2000 by bwelling */
@@ -235,4 +235,9 @@ checknames_txt(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline isc_result_t
+casecompare_txt(ARGS_COMPARE) {
+ return (compare_txt(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_TXT_16_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/unspec_103.c b/contrib/bind9/lib/dns/rdata/generic/unspec_103.c
index ffd14d9..0ce9a90 100644
--- a/contrib/bind9/lib/dns/rdata/generic/unspec_103.c
+++ b/contrib/bind9/lib/dns/rdata/generic/unspec_103.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: unspec_103.c,v 1.35 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: unspec_103.c,v 1.37 2009-12-04 22:06:37 tbox Exp $ */
#ifndef RDATA_GENERIC_UNSPEC_103_C
#define RDATA_GENERIC_UNSPEC_103_C
@@ -186,4 +186,9 @@ checknames_unspec(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_unspec(ARGS_COMPARE) {
+ return (compare_unspec(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_UNSPEC_103_C */
diff --git a/contrib/bind9/lib/dns/rdata/generic/x25_19.c b/contrib/bind9/lib/dns/rdata/generic/x25_19.c
index 47aeb7f..f315b89 100644
--- a/contrib/bind9/lib/dns/rdata/generic/x25_19.c
+++ b/contrib/bind9/lib/dns/rdata/generic/x25_19.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: x25_19.c,v 1.39 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: x25_19.c,v 1.41 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 16:15:57 PST 2000 by bwelling */
@@ -216,4 +216,9 @@ checknames_x25(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_x25(ARGS_COMPARE) {
+ return (compare_x25(rdata1, rdata2));
+}
+
#endif /* RDATA_GENERIC_X25_19_C */
diff --git a/contrib/bind9/lib/dns/rdata/hs_4/a_1.c b/contrib/bind9/lib/dns/rdata/hs_4/a_1.c
index ae30719..6d02b79 100644
--- a/contrib/bind9/lib/dns/rdata/hs_4/a_1.c
+++ b/contrib/bind9/lib/dns/rdata/hs_4/a_1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.c,v 1.31 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a_1.c,v 1.33 2009-12-04 22:06:37 tbox Exp $ */
/* reviewed: Thu Mar 16 15:58:36 PST 2000 by brister */
@@ -229,4 +229,9 @@ checknames_hs_a(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_hs_a(ARGS_COMPARE) {
+ return (compare_hs_a(rdata1, rdata2));
+}
+
#endif /* RDATA_HS_4_A_1_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/a6_38.c b/contrib/bind9/lib/dns/rdata/in_1/a6_38.c
index 450b74c..ec453b1 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/a6_38.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/a6_38.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a6_38.c,v 1.54 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a6_38.c,v 1.56 2009-12-04 22:06:37 tbox Exp $ */
/* RFC2874 */
@@ -458,4 +458,9 @@ checknames_in_a6(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_a6(ARGS_COMPARE) {
+ return (compare_in_a6(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_A6_38_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/a_1.c b/contrib/bind9/lib/dns/rdata/in_1/a_1.c
index 1181e44..b4c1e94 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/a_1.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/a_1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.c,v 1.53 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: a_1.c,v 1.55 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
@@ -233,4 +233,9 @@ checknames_in_a(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_a(ARGS_COMPARE) {
+ return (compare_in_a(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_A_1_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c b/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c
index 119131c..fe3954e 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/aaaa_28.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: aaaa_28.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: aaaa_28.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
@@ -230,4 +230,8 @@ checknames_in_aaaa(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_aaaa(ARGS_COMPARE) {
+ return (compare_in_aaaa(rdata1, rdata2));
+}
#endif /* RDATA_IN_1_AAAA_28_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/apl_42.c b/contrib/bind9/lib/dns/rdata/in_1/apl_42.c
index 70f6880..3f37880 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/apl_42.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/apl_42.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: apl_42.c,v 1.14 2008-01-22 23:28:04 tbox Exp $ */
+/* $Id: apl_42.c,v 1.16 2009-12-04 22:06:37 tbox Exp $ */
/* RFC3123 */
@@ -450,4 +450,9 @@ checknames_in_apl(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_apl(ARGS_COMPARE) {
+ return (compare_in_apl(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_APL_42_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c b/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c
index 5759a76d..9eca46f 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/dhcid_49.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2006, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dhcid_49.c,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: dhcid_49.c,v 1.7 2009-12-04 22:06:37 tbox Exp $ */
/* RFC 4701 */
@@ -51,7 +51,7 @@ totext_in_dhcid(ARGS_TOTEXT) {
dns_rdata_toregion(rdata, &sr);
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
- RETERR(str_totext("( " /*)*/, target));
+ RETERR(str_totext("( " /*)*/, target));
RETERR(isc_base64_totext(&sr, tctx->width - 2, tctx->linebreak,
target));
if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) {
@@ -226,4 +226,9 @@ checknames_in_dhcid(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_dhcid(ARGS_COMPARE) {
+ return (compare_in_dhcid(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_DHCID_49_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/kx_36.c b/contrib/bind9/lib/dns/rdata/in_1/kx_36.c
index 795844d..dfc103b 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/kx_36.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/kx_36.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: kx_36.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: kx_36.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Thu Mar 16 17:24:54 PST 2000 by explorer */
@@ -85,7 +85,7 @@ totext_in_kx(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_kx(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
REQUIRE(type == 36);
@@ -96,7 +96,7 @@ fromwire_in_kx(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
isc_buffer_activeregion(source, &sregion);
if (sregion.length < 2)
@@ -285,4 +285,9 @@ checknames_in_kx(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_kx(ARGS_COMPARE) {
+ return (compare_in_kx(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_KX_36_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c b/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c
index 51aadf7..3d09757 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/naptr_35.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: naptr_35.c,v 1.53 2008-02-15 23:46:51 tbox Exp $ */
+/* $Id: naptr_35.c,v 1.56 2009-12-04 21:09:34 marka Exp $ */
/* Reviewed: Thu Mar 16 16:52:50 PST 2000 by bwelling */
@@ -25,12 +25,134 @@
#define RDATA_IN_1_NAPTR_35_C
#define RRTYPE_NAPTR_ATTRIBUTES (0)
+#ifdef HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+/*
+ * Check the wire format of the Regexp field.
+ * Don't allow embeded NUL's.
+ */
+static inline isc_result_t
+txt_valid_regex(const unsigned char *txt) {
+#ifdef HAVE_REGEX_H
+ regex_t preg;
+ unsigned int regflags = REG_EXTENDED;
+ unsigned int nsub = 0;
+ char regex[256];
+ char *cp;
+#endif
+ isc_boolean_t flags = ISC_FALSE;
+ isc_boolean_t replace = ISC_FALSE;
+ unsigned char c;
+ unsigned char delim;
+ unsigned int len;
+
+ len = *txt++;
+ if (len == 0U)
+ return (ISC_R_SUCCESS);
+
+ delim = *txt++;
+ len--;
+
+ /*
+ * Digits, backslash and flags can't be delimiters.
+ */
+ switch (delim) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '\\': case 'i': case 0:
+ return (DNS_R_SYNTAX);
+ }
+
+#ifdef HAVE_REGEX_H
+ memset(&preg, 0, sizeof(preg));
+ cp = regex;
+#endif
+
+ while (len-- > 0) {
+ c = *txt++;
+ if (c == 0)
+ return (DNS_R_SYNTAX);
+ if (c == delim && !replace) {
+ replace = ISC_TRUE;
+ continue;
+ } else if (c == delim && !flags) {
+ flags = ISC_TRUE;
+ continue;
+ } else if (c == delim)
+ return (DNS_R_SYNTAX);
+ /*
+ * Flags are not escaped.
+ */
+ if (flags) {
+ switch (c) {
+ case 'i':
+#ifdef HAVE_REGEX_H
+ regflags |= REG_ICASE;
+#endif
+ continue;
+ default:
+ return (DNS_R_SYNTAX);
+ }
+ }
+#ifdef HAVE_REGEX_H
+ if (!replace)
+ *cp++ = c;
+#endif
+ if (c == '\\') {
+ if (len == 0)
+ return (DNS_R_SYNTAX);
+ c = *txt++;
+ if (c == 0)
+ return (DNS_R_SYNTAX);
+ len--;
+ if (replace)
+ switch (c) {
+ case '0': return (DNS_R_SYNTAX);
+#ifdef HAVE_REGEX_H
+ case '1': if (nsub < 1) nsub = 1; break;
+ case '2': if (nsub < 2) nsub = 2; break;
+ case '3': if (nsub < 3) nsub = 3; break;
+ case '4': if (nsub < 4) nsub = 4; break;
+ case '5': if (nsub < 5) nsub = 5; break;
+ case '6': if (nsub < 6) nsub = 6; break;
+ case '7': if (nsub < 7) nsub = 7; break;
+ case '8': if (nsub < 8) nsub = 8; break;
+ case '9': if (nsub < 9) nsub = 9; break;
+#endif
+ }
+#ifdef HAVE_REGEX_H
+ if (!replace)
+ *cp++ = c;
+#endif
+ }
+ }
+ if (!flags)
+ return (DNS_R_SYNTAX);
+#ifdef HAVE_REGEX_H
+ *cp = '\0';
+ if (regcomp(&preg, regex, regflags))
+ return (DNS_R_SYNTAX);
+ /*
+ * Check that substitutions in the replacement string are consistant
+ * with the regular expression.
+ */
+ if (preg.re_nsub < nsub) {
+ regfree(&preg);
+ return (DNS_R_SYNTAX);
+ }
+ regfree(&preg);
+#endif
+ return (ISC_R_SUCCESS);
+}
static inline isc_result_t
fromtext_in_naptr(ARGS_FROMTEXT) {
isc_token_t token;
dns_name_t name;
isc_buffer_t buffer;
+ unsigned char *regex;
REQUIRE(type == 35);
REQUIRE(rdclass == 1);
@@ -74,9 +196,11 @@ fromtext_in_naptr(ARGS_FROMTEXT) {
/*
* Regexp.
*/
+ regex = isc_buffer_used(target);
RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring,
ISC_FALSE));
RETTOK(txt_fromtext(&token.value.as_textregion, target));
+ RETTOK(txt_valid_regex(regex));
/*
* Replacement.
@@ -156,6 +280,7 @@ static inline isc_result_t
fromwire_in_naptr(ARGS_FROMWIRE) {
dns_name_t name;
isc_region_t sr;
+ unsigned char *regex;
REQUIRE(type == 35);
REQUIRE(rdclass == 1);
@@ -189,7 +314,9 @@ fromwire_in_naptr(ARGS_FROMWIRE) {
/*
* Regexp.
*/
+ regex = isc_buffer_used(target);
RETERR(txt_fromwire(source, target));
+ RETERR(txt_valid_regex(regex));
/*
* Replacement.
@@ -575,4 +702,9 @@ checknames_in_naptr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_naptr(ARGS_COMPARE) {
+ return (compare_in_naptr(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_NAPTR_35_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c b/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c
index 615d24a..2554b07 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/nsap-ptr_23.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsap-ptr_23.c,v 1.38 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: nsap-ptr_23.c,v 1.40 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 10:16:02 PST 2000 by gson */
@@ -73,7 +73,7 @@ totext_in_nsap_ptr(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_nsap_ptr(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
REQUIRE(type == 23);
REQUIRE(rdclass == 1);
@@ -83,8 +83,8 @@ fromwire_in_nsap_ptr(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
- return (dns_name_fromwire(&name, source, dctx, options, target));
+ dns_name_init(&name, NULL);
+ return (dns_name_fromwire(&name, source, dctx, options, target));
}
static inline isc_result_t
@@ -242,4 +242,9 @@ checknames_in_nsap_ptr(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_nsap_ptr(ARGS_COMPARE) {
+ return (compare_in_nsap_ptr(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_NSAP_PTR_23_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c b/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c
index 1aaf13f..4a56c75 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/nsap_22.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: nsap_22.c,v 1.42 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: nsap_22.c,v 1.44 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 10:41:07 PST 2000 by gson */
@@ -252,4 +252,9 @@ checknames_in_nsap(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_nsap(ARGS_COMPARE) {
+ return (compare_in_nsap(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_NSAP_22_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/px_26.c b/contrib/bind9/lib/dns/rdata/in_1/px_26.c
index 517b87c..50f68cd 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/px_26.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/px_26.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: px_26.c,v 1.43 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: px_26.c,v 1.45 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Mon Mar 20 10:44:27 PST 2000 */
@@ -115,7 +115,7 @@ totext_in_px(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_px(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sregion;
REQUIRE(type == 26);
@@ -126,7 +126,7 @@ fromwire_in_px(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
/*
* Preference.
@@ -371,4 +371,9 @@ checknames_in_px(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_px(ARGS_COMPARE) {
+ return (compare_in_px(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_PX_26_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/srv_33.c b/contrib/bind9/lib/dns/rdata/in_1/srv_33.c
index ac9e577..3dfd13e 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/srv_33.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/srv_33.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: srv_33.c,v 1.45 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: srv_33.c,v 1.47 2009-12-04 22:06:37 tbox Exp $ */
/* Reviewed: Fri Mar 17 13:01:00 PST 2000 by bwelling */
@@ -140,7 +140,7 @@ totext_in_srv(ARGS_TOTEXT) {
static inline isc_result_t
fromwire_in_srv(ARGS_FROMWIRE) {
- dns_name_t name;
+ dns_name_t name;
isc_region_t sr;
REQUIRE(type == 33);
@@ -151,7 +151,7 @@ fromwire_in_srv(ARGS_FROMWIRE) {
dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
- dns_name_init(&name, NULL);
+ dns_name_init(&name, NULL);
/*
* Priority, weight, port.
@@ -370,4 +370,9 @@ checknames_in_srv(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_srv(ARGS_COMPARE) {
+ return (compare_in_srv(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_SRV_33_C */
diff --git a/contrib/bind9/lib/dns/rdata/in_1/wks_11.c b/contrib/bind9/lib/dns/rdata/in_1/wks_11.c
index b7d5057..29983ec 100644
--- a/contrib/bind9/lib/dns/rdata/in_1/wks_11.c
+++ b/contrib/bind9/lib/dns/rdata/in_1/wks_11.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: wks_11.c,v 1.54.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: wks_11.c,v 1.57 2009-12-04 21:09:34 marka Exp $ */
/* Reviewed: Fri Mar 17 15:01:49 PST 2000 by explorer */
@@ -348,4 +348,9 @@ checknames_in_wks(ARGS_CHECKNAMES) {
return (ISC_TRUE);
}
+static inline int
+casecompare_in_wks(ARGS_COMPARE) {
+ return (compare_in_wks(rdata1, rdata2));
+}
+
#endif /* RDATA_IN_1_WKS_11_C */
diff --git a/contrib/bind9/lib/dns/rdatalist.c b/contrib/bind9/lib/dns/rdatalist.c
index e8178a7..d30aff9 100644
--- a/contrib/bind9/lib/dns/rdatalist.c
+++ b/contrib/bind9/lib/dns/rdatalist.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdatalist.c,v 1.36.50.2 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: rdatalist.c,v 1.40 2010-11-16 05:38:31 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/rdataset.c b/contrib/bind9/lib/dns/rdataset.c
index 44b3a5e..fdd7669 100644
--- a/contrib/bind9/lib/dns/rdataset.c
+++ b/contrib/bind9/lib/dns/rdataset.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdataset.c,v 1.82.50.4.6.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: rdataset.c,v 1.86.220.3 2011-06-21 20:15:53 each Exp $ */
/*! \file */
@@ -345,7 +345,7 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name,
count = 1;
result = dns_rdataset_first(rdataset);
INSIST(result == ISC_R_NOMORE);
- } else if (rdataset->type == 0) {
+ } else if ((rdataset->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) {
/*
* This is a negative caching rdataset.
*/
diff --git a/contrib/bind9/lib/dns/rdataslab.c b/contrib/bind9/lib/dns/rdataslab.c
index d1a02a0..932f8de 100644
--- a/contrib/bind9/lib/dns/rdataslab.c
+++ b/contrib/bind9/lib/dns/rdataslab.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdataslab.c,v 1.48.50.4 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: rdataslab.c,v 1.52.148.1.2.1 2011-06-02 23:47:35 tbox Exp $ */
/*! \file */
@@ -144,21 +144,25 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
nalloc = dns_rdataset_count(rdataset);
nitems = nalloc;
- if (nitems == 0)
+ if (nitems == 0 && rdataset->type != 0)
return (ISC_R_FAILURE);
if (nalloc > 0xffff)
return (ISC_R_NOSPACE);
- x = isc_mem_get(mctx, nalloc * sizeof(struct xrdata));
- if (x == NULL)
- return (ISC_R_NOMEMORY);
+
+ if (nalloc != 0) {
+ x = isc_mem_get(mctx, nalloc * sizeof(struct xrdata));
+ if (x == NULL)
+ return (ISC_R_NOMEMORY);
+ } else
+ x = NULL;
/*
* Save all of the rdata members into an array.
*/
result = dns_rdataset_first(rdataset);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS && result != ISC_R_NOMORE)
goto free_rdatas;
for (i = 0; i < nalloc && result == ISC_R_SUCCESS; i++) {
INSIST(result == ISC_R_SUCCESS);
@@ -223,11 +227,14 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
/*
* Don't forget the last item!
*/
+ if (nalloc != 0) {
#if DNS_RDATASET_FIXED
- buflen += (8 + x[i-1].rdata.length);
+ buflen += (8 + x[i-1].rdata.length);
#else
- buflen += (2 + x[i-1].rdata.length);
+ buflen += (2 + x[i-1].rdata.length);
#endif
+ }
+
/*
* Provide space to store the per RR meta data.
*/
@@ -316,7 +323,8 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
result = ISC_R_SUCCESS;
free_rdatas:
- isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata));
+ if (x != NULL)
+ isc_mem_put(mctx, x, nalloc * sizeof(struct xrdata));
return (result);
}
diff --git a/contrib/bind9/lib/dns/request.c b/contrib/bind9/lib/dns/request.c
index c1cd235..b5d6248 100644
--- a/contrib/bind9/lib/dns/request.c
+++ b/contrib/bind9/lib/dns/request.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: request.c,v 1.82.72.2 2009-01-18 23:47:40 tbox Exp $ */
+/* $Id: request.c,v 1.87 2010-03-04 23:50:34 tbox Exp $ */
/*! \file */
@@ -449,7 +449,8 @@ req_send(dns_request_t *request, isc_task_t *task, isc_sockaddr_t *address) {
}
static isc_result_t
-new_request(isc_mem_t *mctx, dns_request_t **requestp) {
+new_request(isc_mem_t *mctx, dns_request_t **requestp)
+{
dns_request_t *request;
request = isc_mem_get(mctx, sizeof(*request));
@@ -1058,6 +1059,9 @@ req_render(dns_message_t *message, isc_buffer_t **bufferp,
return (result);
cleanup_cctx = ISC_TRUE;
+ if ((options & DNS_REQUESTOPT_CASE) != 0)
+ dns_compress_setsensitive(&cctx, ISC_TRUE);
+
/*
* Render message.
*/
diff --git a/contrib/bind9/lib/dns/resolver.c b/contrib/bind9/lib/dns/resolver.c
index 290bb0f..6d9ab70 100644
--- a/contrib/bind9/lib/dns/resolver.c
+++ b/contrib/bind9/lib/dns/resolver.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resolver.c,v 1.384.14.30 2011-01-27 23:45:47 tbox Exp $ */
+/* $Id: resolver.c,v 1.428.6.5.2.1 2011-06-21 20:15:53 each Exp $ */
/*! \file */
@@ -105,6 +105,14 @@
#define QTRACE(m)
#endif
+#ifndef DEFAULT_QUERY_TIMEOUT
+#define DEFAULT_QUERY_TIMEOUT 30 /* The default time in seconds for the whole query to live. */
+#endif
+
+#ifndef MAXIMUM_QUERY_TIMEOUT
+#define MAXIMUM_QUERY_TIMEOUT 30 /* The maximum time in seconds for the whole query to live. */
+#endif
+
/*%
* Maximum EDNS0 input packet size.
*/
@@ -273,6 +281,8 @@ struct fetchctx {
unsigned int findfail;
unsigned int valfail;
isc_boolean_t timeout;
+ dns_adbaddrinfo_t *addrinfo;
+ isc_sockaddr_t *client;
};
#define FCTX_MAGIC ISC_MAGIC('F', '!', '!', '!')
@@ -384,6 +394,7 @@ struct dns_resolver {
unsigned int spillatmin;
isc_timer_t * spillattimer;
isc_boolean_t zero_no_soa_ttl;
+ unsigned int query_timeout;
/* Locked by lock. */
unsigned int references;
@@ -424,6 +435,7 @@ struct dns_resolver {
FCTX_ADDRINFO_TRIED) != 0)
#define NXDOMAIN(r) (((r)->attributes & DNS_RDATASETATTR_NXDOMAIN) != 0)
+#define NEGATIVE(r) (((r)->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
static void destroy(dns_resolver_t *res);
static void empty_bucket(dns_resolver_t *res);
@@ -1034,6 +1046,7 @@ fctx_sendevents(fetchctx_t *fctx, isc_result_t result, int line) {
ISC_LIST_UNLINK(fctx->events, event, ev_link);
task = event->ev_sender;
event->ev_sender = fctx;
+ event->vresult = fctx->vresult;
if (!HAVE_ANSWER(fctx))
event->result = result;
@@ -1047,7 +1060,7 @@ fctx_sendevents(fetchctx_t *fctx, isc_result_t result, int line) {
* Negative results must be indicated in event->result.
*/
if (dns_rdataset_isassociated(event->rdataset) &&
- event->rdataset->type == dns_rdatatype_none) {
+ NEGATIVE(event->rdataset)) {
INSIST(event->result == DNS_R_NCACHENXDOMAIN ||
event->result == DNS_R_NCACHENXRRSET);
}
@@ -1741,9 +1754,8 @@ resquery_send(resquery_t *query) {
if ((query->options & DNS_FETCHOPT_NOVALIDATE) != 0) {
fctx->qmessage->flags |= DNS_MESSAGEFLAG_CD;
} else if (res->view->enablevalidation) {
- result = dns_keytable_issecuredomain(res->view->secroots,
- &fctx->name,
- &secure_domain);
+ result = dns_view_issecuredomain(res->view, &fctx->name,
+ &secure_domain);
if (result != ISC_R_SUCCESS)
secure_domain = ISC_FALSE;
if (res->view->dlv != NULL)
@@ -2284,7 +2296,7 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason,
char code[64];
isc_buffer_t b;
isc_sockaddr_t *sa;
- const char *sep1, *sep2;
+ const char *spc = "";
isc_sockaddr_t *address = &addrinfo->sockaddr;
if (reason == DNS_R_LAME)
@@ -2330,18 +2342,14 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason,
isc_buffer_init(&b, code, sizeof(code) - 1);
dns_rcode_totext(fctx->rmessage->rcode, &b);
code[isc_buffer_usedlength(&b)] = '\0';
- sep1 = "(";
- sep2 = ") ";
+ spc = " ";
} else if (reason == DNS_R_UNEXPECTEDOPCODE) {
isc_buffer_init(&b, code, sizeof(code) - 1);
dns_opcode_totext((dns_opcode_t)fctx->rmessage->opcode, &b);
code[isc_buffer_usedlength(&b)] = '\0';
- sep1 = "(";
- sep2 = ") ";
+ spc = " ";
} else {
code[0] = '\0';
- sep1 = "";
- sep2 = "";
}
dns_name_format(&fctx->name, namebuf, sizeof(namebuf));
dns_rdatatype_format(fctx->type, typebuf, sizeof(typebuf));
@@ -2349,83 +2357,19 @@ add_bad(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, isc_result_t reason,
isc_sockaddr_format(address, addrbuf, sizeof(addrbuf));
isc_log_write(dns_lctx, DNS_LOGCATEGORY_LAME_SERVERS,
DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO,
- "%s %s%s%sresolving '%s/%s/%s': %s",
- dns_result_totext(reason), sep1, code, sep2,
+ "error (%s%s%s) resolving '%s/%s/%s': %s",
+ dns_result_totext(reason), spc, code,
namebuf, typebuf, classbuf, addrbuf);
}
/*
- * Return 'bits' bits of random entropy from fctx->rand_buf,
- * refreshing it by calling isc_random_get() whenever the requested
- * number of bits is greater than the number in the buffer.
- */
-static inline isc_uint32_t
-random_bits(fetchctx_t *fctx, isc_uint32_t bits) {
- isc_uint32_t ret = 0;
-
- REQUIRE(VALID_FCTX(fctx));
- REQUIRE(bits <= 32);
- if (bits == 0)
- return (0);
-
- if (bits >= fctx->rand_bits) {
- /* if rand_bits == 0, this is unnecessary but harmless */
- bits -= fctx->rand_bits;
- ret = fctx->rand_buf << bits;
-
- /* refresh random buffer now */
- isc_random_get(&fctx->rand_buf);
- fctx->rand_bits = sizeof(fctx->rand_buf) * CHAR_BIT;
- }
-
- if (bits > 0) {
- isc_uint32_t mask = 0xffffffff;
- if (bits < 32) {
- mask = (1 << bits) - 1;
- }
-
- ret |= fctx->rand_buf & mask;
- fctx->rand_buf >>= bits;
- fctx->rand_bits -= bits;
- }
-
- return (ret);
-}
-
-/*
- * Add some random jitter to a server's RTT value so that the
- * order of queries will be unpredictable.
- *
- * RTT values of servers which have been tried are fuzzed by 128 ms.
- * Servers that haven't been tried yet have their RTT set to a random
- * value between 0 ms and 7 ms; they should get to go first, but in
- * unpredictable order.
- */
-static inline void
-randomize_srtt(fetchctx_t *fctx, dns_adbaddrinfo_t *ai) {
- if (TRIED(ai)) {
- ai->srtt >>= 10; /* convert to milliseconds, near enough */
- ai->srtt |= (ai->srtt & 0x80) | random_bits(fctx, 7);
- ai->srtt <<= 10; /* now back to microseconds */
- } else
- ai->srtt = random_bits(fctx, 3) << 10;
-}
-
-/*
- * Sort addrinfo list by RTT (with random jitter)
+ * Sort addrinfo list by RTT.
*/
static void
-sort_adbfind(fetchctx_t *fctx, dns_adbfind_t *find) {
+sort_adbfind(dns_adbfind_t *find) {
dns_adbaddrinfo_t *best, *curr;
dns_adbaddrinfolist_t sorted;
- /* Add jitter to SRTT values */
- curr = ISC_LIST_HEAD(find->list);
- while (curr != NULL) {
- randomize_srtt(fctx, curr);
- curr = ISC_LIST_NEXT(curr, publink);
- }
-
/* Lame N^2 bubble sort. */
ISC_LIST_INIT(sorted);
while (!ISC_LIST_EMPTY(find->list)) {
@@ -2443,19 +2387,19 @@ sort_adbfind(fetchctx_t *fctx, dns_adbfind_t *find) {
}
/*
- * Sort a list of finds by server RTT (with random jitter)
+ * Sort a list of finds by server RTT.
*/
static void
-sort_finds(fetchctx_t *fctx, dns_adbfindlist_t *findlist) {
+sort_finds(dns_adbfindlist_t *findlist) {
dns_adbfind_t *best, *curr;
dns_adbfindlist_t sorted;
dns_adbaddrinfo_t *addrinfo, *bestaddrinfo;
- /* Sort each find's addrinfo list by SRTT (after adding jitter) */
+ /* Sort each find's addrinfo list by SRTT. */
for (curr = ISC_LIST_HEAD(*findlist);
curr != NULL;
curr = ISC_LIST_NEXT(curr, publink))
- sort_adbfind(fctx, curr);
+ sort_adbfind(curr);
/* Lame N^2 bubble sort. */
ISC_LIST_INIT(sorted);
@@ -2840,8 +2784,8 @@ fctx_getaddresses(fetchctx_t *fctx, isc_boolean_t badcache) {
* We've found some addresses. We might still be looking
* for more addresses.
*/
- sort_finds(fctx, &fctx->finds);
- sort_finds(fctx, &fctx->altfinds);
+ sort_finds(&fctx->finds);
+ sort_finds(&fctx->altfinds);
result = ISC_R_SUCCESS;
}
@@ -3470,6 +3414,7 @@ fctx_join(fetchctx_t *fctx, isc_task_t *task, isc_sockaddr_t *client,
else
ISC_LIST_APPEND(fctx->events, event, ev_link);
fctx->references++;
+ fctx->client = client;
fetch->magic = DNS_FETCH_MAGIC;
fetch->private = fctx;
@@ -3568,6 +3513,8 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type,
fctx->rand_buf = 0;
fctx->rand_bits = 0;
fctx->timeout = ISC_FALSE;
+ fctx->addrinfo = NULL;
+ fctx->client = NULL;
dns_name_init(&fctx->nsname, NULL);
fctx->nsfetch = NULL;
@@ -3657,7 +3604,7 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type,
/*
* Compute an expiration time for the entire fetch.
*/
- isc_interval_set(&interval, 30, 0); /* XXXRTH constant */
+ isc_interval_set(&interval, res->query_timeout, 0);
iresult = isc_time_nowplusinterval(&fctx->expires, &interval);
if (iresult != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -3799,6 +3746,33 @@ log_lame(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo) {
namebuf, domainbuf, addrbuf);
}
+static inline void
+log_formerr(fetchctx_t *fctx, const char *format, ...) {
+ char nsbuf[ISC_SOCKADDR_FORMATSIZE];
+ char clbuf[ISC_SOCKADDR_FORMATSIZE];
+ const char *clmsg = "";
+ char msgbuf[2048];
+ va_list args;
+
+ va_start(args, format);
+ vsnprintf(msgbuf, sizeof(msgbuf), format, args);
+ va_end(args);
+
+ isc_sockaddr_format(&fctx->addrinfo->sockaddr, nsbuf, sizeof(nsbuf));
+
+ if (fctx->client != NULL) {
+ clmsg = " for client ";
+ isc_sockaddr_format(fctx->client, clbuf, sizeof(clbuf));
+ } else {
+ clbuf[0] = '\0';
+ }
+
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+ DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE,
+ "DNS format error from %s resolving %s%s%s: %s",
+ nsbuf, fctx->info, clmsg, clbuf, msgbuf);
+}
+
static inline isc_result_t
same_question(fetchctx_t *fctx) {
isc_result_t result;
@@ -3813,8 +3787,10 @@ same_question(fetchctx_t *fctx) {
/*
* XXXRTH Currently we support only one question.
*/
- if (message->counts[DNS_SECTION_QUESTION] != 1)
+ if (message->counts[DNS_SECTION_QUESTION] != 1) {
+ log_formerr(fctx, "too many questions");
return (DNS_R_FORMERR);
+ }
result = dns_message_firstname(message, DNS_SECTION_QUESTION);
if (result != ISC_R_SUCCESS)
@@ -3824,10 +3800,21 @@ same_question(fetchctx_t *fctx) {
rdataset = ISC_LIST_HEAD(name->list);
INSIST(rdataset != NULL);
INSIST(ISC_LIST_NEXT(rdataset, link) == NULL);
+
if (fctx->type != rdataset->type ||
fctx->res->rdclass != rdataset->rdclass ||
- !dns_name_equal(&fctx->name, name))
+ !dns_name_equal(&fctx->name, name)) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char class[DNS_RDATACLASS_FORMATSIZE];
+ char type[DNS_RDATATYPE_FORMATSIZE];
+
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ dns_rdataclass_format(rdataset->rdclass, class, sizeof(class));
+ dns_rdatatype_format(rdataset->type, type, sizeof(type));
+ log_formerr(fctx, "question section mismatch: got %s/%s/%s",
+ namebuf, class, type);
return (DNS_R_FORMERR);
+ }
return (ISC_R_SUCCESS);
}
@@ -3957,6 +3944,7 @@ validated(isc_task_t *task, isc_event_t *event) {
REQUIRE(!ISC_LIST_EMPTY(fctx->validators));
vevent = (dns_validatorevent_t *)event;
+ fctx->vresult = vevent->result;
FCTXTRACE("received validation completion event");
@@ -4177,7 +4165,7 @@ validated(isc_task_t *task, isc_event_t *event) {
if (result != ISC_R_SUCCESS &&
result != DNS_R_UNCHANGED)
goto noanswer_response;
- if (ardataset != NULL && ardataset->type == 0) {
+ if (ardataset != NULL && NEGATIVE(ardataset)) {
if (NXDOMAIN(ardataset))
eresult = DNS_R_NCACHENXDOMAIN;
else
@@ -4330,8 +4318,8 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
* Is DNSSEC validation required for this name?
*/
if (res->view->enablevalidation) {
- result = dns_keytable_issecuredomain(res->view->secroots, name,
- &secure_domain);
+ result = dns_view_issecuredomain(res->view, name,
+ &secure_domain);
if (result != ISC_R_SUCCESS)
return (result);
@@ -4498,7 +4486,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
result = ISC_R_SUCCESS;
if (!need_validation &&
ardataset != NULL &&
- ardataset->type == 0) {
+ NEGATIVE(ardataset)) {
/*
* The answer in the cache is
* better than the answer we
@@ -4628,7 +4616,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
if (result == DNS_R_UNCHANGED) {
if (ANSWER(rdataset) &&
ardataset != NULL &&
- ardataset->type == 0) {
+ NEGATIVE(ardataset)) {
/*
* The answer in the cache is better
* than the answer we found, and is
@@ -4658,7 +4646,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo,
* Negative results must be indicated in event->result.
*/
if (dns_rdataset_isassociated(event->rdataset) &&
- event->rdataset->type == dns_rdatatype_none) {
+ NEGATIVE(event->rdataset)) {
INSIST(eresult == DNS_R_NCACHENXDOMAIN ||
eresult == DNS_R_NCACHENXRRSET);
}
@@ -4738,7 +4726,7 @@ ncache_adderesult(dns_message_t *message, dns_db_t *cache, dns_dbnode_t *node,
* care about whether it is DNS_R_NCACHENXDOMAIN or
* DNS_R_NCACHENXRRSET then extract it.
*/
- if (ardataset->type == 0) {
+ if (NEGATIVE(ardataset)) {
/*
* The cache data is a negative cache entry.
*/
@@ -4803,8 +4791,8 @@ ncache_message(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
* Is DNSSEC validation required for this name?
*/
if (fctx->res->view->enablevalidation) {
- result = dns_keytable_issecuredomain(res->view->secroots, name,
- &secure_domain);
+ result = dns_view_issecuredomain(res->view, name,
+ &secure_domain);
if (result != ISC_R_SUCCESS)
return (result);
@@ -4948,7 +4936,9 @@ mark_related(dns_name_t *name, dns_rdataset_t *rdataset,
}
static isc_result_t
-check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
+check_section(void *arg, dns_name_t *addname, dns_rdatatype_t type,
+ dns_section_t section)
+{
fetchctx_t *fctx = arg;
isc_result_t result;
dns_name_t *name;
@@ -4959,15 +4949,19 @@ check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
REQUIRE(VALID_FCTX(fctx));
+#if CHECK_FOR_GLUE_IN_ANSWER
+ if (section == DNS_SECTION_ANSWER && type != dns_rdatatype_a)
+ return (ISC_R_SUCCESS);
+#endif
+
if (GLUING(fctx))
gluing = ISC_TRUE;
else
gluing = ISC_FALSE;
name = NULL;
rdataset = NULL;
- result = dns_message_findname(fctx->rmessage, DNS_SECTION_ADDITIONAL,
- addname, dns_rdatatype_any, 0, &name,
- NULL);
+ result = dns_message_findname(fctx->rmessage, section, addname,
+ dns_rdatatype_any, 0, &name, NULL);
if (result == ISC_R_SUCCESS) {
external = ISC_TF(!dns_name_issubdomain(name, &fctx->domain));
if (type == dns_rdatatype_a) {
@@ -5005,6 +4999,21 @@ check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
return (ISC_R_SUCCESS);
}
+static isc_result_t
+check_related(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
+ return (check_section(arg, addname, type, DNS_SECTION_ADDITIONAL));
+}
+
+#ifndef CHECK_FOR_GLUE_IN_ANSWER
+#define CHECK_FOR_GLUE_IN_ANSWER 0
+#endif
+#if CHECK_FOR_GLUE_IN_ANSWER
+static isc_result_t
+check_answer(void *arg, dns_name_t *addname, dns_rdatatype_t type) {
+ return (check_section(arg, addname, type, DNS_SECTION_ANSWER));
+}
+#endif
+
static void
chase_additional(fetchctx_t *fctx) {
isc_boolean_t rescan;
@@ -5061,8 +5070,8 @@ cname_target(dns_rdataset_t *rdataset, dns_name_t *tname) {
}
static inline isc_result_t
-dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
- dns_fixedname_t *fixeddname)
+dname_target(fetchctx_t *fctx, dns_rdataset_t *rdataset, dns_name_t *qname,
+ dns_name_t *oname, dns_fixedname_t *fixeddname)
{
isc_result_t result;
dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -5075,7 +5084,6 @@ dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
/*
* Get the target name of the DNAME.
*/
-
result = dns_rdataset_first(rdataset);
if (result != ISC_R_SUCCESS)
return (result);
@@ -5089,7 +5097,14 @@ dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
*/
namereln = dns_name_fullcompare(qname, oname, &order, &nlabels);
if (namereln != dns_namereln_subdomain) {
+ char qbuf[DNS_NAME_FORMATSIZE];
+ char obuf[DNS_NAME_FORMATSIZE];
+
dns_rdata_freestruct(&dname);
+ dns_name_format(qname, qbuf, sizeof(qbuf));
+ dns_name_format(oname, obuf, sizeof(obuf));
+ log_formerr(fctx, "unrelated DNAME in answer: "
+ "%s is not in %s", qbuf, obuf);
return (DNS_R_FORMERR);
}
dns_fixedname_init(&prefix);
@@ -5102,16 +5117,147 @@ dname_target(dns_rdataset_t *rdataset, dns_name_t *qname, dns_name_t *oname,
return (result);
}
+static isc_boolean_t
+is_answeraddress_allowed(dns_view_t *view, dns_name_t *name,
+ dns_rdataset_t *rdataset)
+{
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ struct in_addr ina;
+ struct in6_addr in6a;
+ isc_netaddr_t netaddr;
+ char addrbuf[ISC_NETADDR_FORMATSIZE];
+ char namebuf[DNS_NAME_FORMATSIZE];
+ char classbuf[64];
+ char typebuf[64];
+ int match;
+
+ /* By default, we allow any addresses. */
+ if (view->denyansweracl == NULL)
+ return (ISC_TRUE);
+
+ /*
+ * If the owner name matches one in the exclusion list, either exactly
+ * or partially, allow it.
+ */
+ if (view->answeracl_exclude != NULL) {
+ dns_rbtnode_t *node = NULL;
+
+ result = dns_rbt_findnode(view->answeracl_exclude, name, NULL,
+ &node, NULL, 0, NULL, NULL);
+
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
+ return (ISC_TRUE);
+ }
+
+ /*
+ * Otherwise, search the filter list for a match for each address
+ * record. If a match is found, the address should be filtered,
+ * so should the entire answer.
+ */
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+ if (rdataset->type == dns_rdatatype_a) {
+ INSIST(rdata.length == sizeof(ina.s_addr));
+ memcpy(&ina.s_addr, rdata.data, sizeof(ina.s_addr));
+ isc_netaddr_fromin(&netaddr, &ina);
+ } else {
+ INSIST(rdata.length == sizeof(in6a.s6_addr));
+ memcpy(in6a.s6_addr, rdata.data, sizeof(in6a.s6_addr));
+ isc_netaddr_fromin6(&netaddr, &in6a);
+ }
+
+ result = dns_acl_match(&netaddr, NULL, view->denyansweracl,
+ &view->aclenv, &match, NULL);
+
+ if (result == ISC_R_SUCCESS && match > 0) {
+ isc_netaddr_format(&netaddr, addrbuf, sizeof(addrbuf));
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ dns_rdatatype_format(rdataset->type, typebuf,
+ sizeof(typebuf));
+ dns_rdataclass_format(rdataset->rdclass, classbuf,
+ sizeof(classbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+ DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE,
+ "answer address %s denied for %s/%s/%s",
+ addrbuf, namebuf, typebuf, classbuf);
+ return (ISC_FALSE);
+ }
+ }
+
+ return (ISC_TRUE);
+}
+
+static isc_boolean_t
+is_answertarget_allowed(dns_view_t *view, dns_name_t *name,
+ dns_rdatatype_t type, dns_name_t *tname,
+ dns_name_t *domain)
+{
+ isc_result_t result;
+ dns_rbtnode_t *node = NULL;
+ char qnamebuf[DNS_NAME_FORMATSIZE];
+ char tnamebuf[DNS_NAME_FORMATSIZE];
+ char classbuf[64];
+ char typebuf[64];
+
+ /* By default, we allow any target name. */
+ if (view->denyanswernames == NULL)
+ return (ISC_TRUE);
+
+ /*
+ * If the owner name matches one in the exclusion list, either exactly
+ * or partially, allow it.
+ */
+ if (view->answernames_exclude != NULL) {
+ result = dns_rbt_findnode(view->answernames_exclude, name, NULL,
+ &node, NULL, 0, NULL, NULL);
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
+ return (ISC_TRUE);
+ }
+
+ /*
+ * If the target name is a subdomain of the search domain, allow it.
+ */
+ if (dns_name_issubdomain(tname, domain))
+ return (ISC_TRUE);
+
+ /*
+ * Otherwise, apply filters.
+ */
+ result = dns_rbt_findnode(view->denyanswernames, tname, NULL, &node,
+ NULL, 0, NULL, NULL);
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
+ dns_name_format(name, qnamebuf, sizeof(qnamebuf));
+ dns_name_format(tname, tnamebuf, sizeof(tnamebuf));
+ dns_rdatatype_format(type, typebuf, sizeof(typebuf));
+ dns_rdataclass_format(view->rdclass, classbuf,
+ sizeof(classbuf));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER,
+ DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE,
+ "%s target %s denied for %s/%s",
+ typebuf, tnamebuf, qnamebuf, classbuf);
+ return (ISC_FALSE);
+ }
+
+ return (ISC_TRUE);
+}
+
/*
* Handle a no-answer response (NXDOMAIN, NXRRSET, or referral).
- * If bind8_ns_resp is ISC_TRUE, this is a suspected BIND 8
- * response to an NS query that should be treated as a referral
- * even though the NS records occur in the answer section
- * rather than the authority section.
+ * If look_in_options has LOOK_FOR_NS_IN_ANSWER then we look in the answer
+ * section for the NS RRset if the query type is NS; if it has
+ * LOOK_FOR_GLUE_IN_ANSWER we look for glue incorrectly returned in the answer
+ * section for A and AAAA queries.
*/
+#define LOOK_FOR_NS_IN_ANSWER 0x1
+#define LOOK_FOR_GLUE_IN_ANSWER 0x2
+
static isc_result_t
noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
- isc_boolean_t bind8_ns_resp)
+ unsigned int look_in_options)
{
isc_result_t result;
dns_message_t *message;
@@ -5119,11 +5265,16 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
dns_rdataset_t *rdataset, *ns_rdataset;
isc_boolean_t aa, negative_response;
dns_rdatatype_t type;
- dns_section_t section =
- bind8_ns_resp ? DNS_SECTION_ANSWER : DNS_SECTION_AUTHORITY;
+ dns_section_t section;
FCTXTRACE("noanswer_response");
+ if ((look_in_options & LOOK_FOR_NS_IN_ANSWER) != 0) {
+ INSIST(fctx->type == dns_rdatatype_ns);
+ section = DNS_SECTION_ANSWER;
+ } else
+ section = DNS_SECTION_AUTHORITY;
+
message = fctx->rmessage;
/*
@@ -5196,8 +5347,22 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
type = rdataset->covers;
if (((type == dns_rdatatype_ns ||
type == dns_rdatatype_soa) &&
- !dns_name_issubdomain(qname, name)))
+ !dns_name_issubdomain(qname, name))) {
+ char qbuf[DNS_NAME_FORMATSIZE];
+ char nbuf[DNS_NAME_FORMATSIZE];
+ char tbuf[DNS_RDATATYPE_FORMATSIZE];
+ dns_rdatatype_format(fctx->type, tbuf,
+ sizeof(tbuf));
+ dns_name_format(name, nbuf,
+ sizeof(nbuf));
+ dns_name_format(qname, qbuf,
+ sizeof(qbuf));
+ log_formerr(fctx,
+ "unrelated %s %s in "
+ "%s authority section",
+ tbuf, qbuf, nbuf);
return (DNS_R_FORMERR);
+ }
if (type == dns_rdatatype_ns) {
/*
* NS or RRSIG NS.
@@ -5207,8 +5372,14 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
if (rdataset->type ==
dns_rdatatype_ns) {
if (ns_name != NULL &&
- name != ns_name)
+ name != ns_name) {
+ log_formerr(fctx,
+ "multiple NS "
+ "RRsets in "
+ "authority "
+ "section");
return (DNS_R_FORMERR);
+ }
ns_name = name;
ns_rdataset = rdataset;
}
@@ -5227,8 +5398,14 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
if (rdataset->type ==
dns_rdatatype_soa) {
if (soa_name != NULL &&
- name != soa_name)
+ name != soa_name) {
+ log_formerr(fctx,
+ "multiple SOA "
+ "RRs in "
+ "authority "
+ "section");
return (DNS_R_FORMERR);
+ }
soa_name = name;
}
name->attributes |=
@@ -5304,15 +5481,25 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
*
* These should only be here if
* this is a referral, and there
- * should only be one DS.
+ * should only be one DS RRset.
*/
- if (ns_name == NULL)
+ if (ns_name == NULL) {
+ log_formerr(fctx,
+ "DS with no "
+ "referral");
return (DNS_R_FORMERR);
+ }
if (rdataset->type ==
dns_rdatatype_ds) {
if (ds_name != NULL &&
- name != ds_name)
+ name != ds_name) {
+ log_formerr(fctx,
+ "DS doesn't "
+ "match "
+ "referral "
+ "(NS)");
return (DNS_R_FORMERR);
+ }
ds_name = name;
}
name->attributes |=
@@ -5362,6 +5549,7 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
/*
* The responder is insane.
*/
+ log_formerr(fctx, "invalid response");
return (DNS_R_FORMERR);
}
}
@@ -5369,8 +5557,10 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
/*
* If we found both NS and SOA, they should be the same name.
*/
- if (ns_name != NULL && soa_name != NULL && ns_name != soa_name)
+ if (ns_name != NULL && soa_name != NULL && ns_name != soa_name) {
+ log_formerr(fctx, "NS/SOA mismatch");
return (DNS_R_FORMERR);
+ }
/*
* Do we have a referral? (We only want to follow a referral if
@@ -5383,14 +5573,18 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
* progress. We return DNS_R_FORMERR so that we'll keep
* trying other servers.
*/
- if (dns_name_equal(ns_name, &fctx->domain))
+ if (dns_name_equal(ns_name, &fctx->domain)) {
+ log_formerr(fctx, "non-improving referral");
return (DNS_R_FORMERR);
+ }
/*
* If the referral name is not a parent of the query
* name, consider the responder insane.
*/
if (! dns_name_issubdomain(&fctx->name, ns_name)) {
+ /* Logged twice */
+ log_formerr(fctx, "referral to non-parent");
FCTXTRACE("referral to non-parent");
return (DNS_R_FORMERR);
}
@@ -5404,6 +5598,20 @@ noanswer_response(fetchctx_t *fctx, dns_name_t *oqname,
fctx->attributes |= FCTX_ATTR_GLUING;
(void)dns_rdataset_additionaldata(ns_rdataset, check_related,
fctx);
+#if CHECK_FOR_GLUE_IN_ANSWER
+ /*
+ * Look in the answer section for "glue" that is incorrectly
+ * returned as a answer. This is needed if the server also
+ * minimizes the response size by not adding records to the
+ * additional section that are in the answer section or if
+ * the record gets dropped due to message size constraints.
+ */
+ if ((look_in_options & LOOK_FOR_GLUE_IN_ANSWER) != 0 &&
+ (fctx->type == dns_rdatatype_aaaa ||
+ fctx->type == dns_rdatatype_a))
+ (void)dns_rdataset_additionaldata(ns_rdataset,
+ check_answer, fctx);
+#endif
fctx->attributes &= ~FCTX_ATTR_GLUING;
/*
* NS rdatasets with 0 TTL cause problems.
@@ -5459,6 +5667,7 @@ answer_response(fetchctx_t *fctx) {
unsigned int aflag;
dns_rdatatype_t type;
dns_fixedname_t dname, fqname;
+ dns_view_t *view;
FCTXTRACE("answer_response");
@@ -5481,6 +5690,7 @@ answer_response(fetchctx_t *fctx) {
aa = ISC_FALSE;
qname = &fctx->name;
type = fctx->type;
+ view = fctx->res->view;
result = dns_message_firstname(message, DNS_SECTION_ANSWER);
while (!done && result == ISC_R_SUCCESS) {
name = NULL;
@@ -5499,8 +5709,21 @@ answer_response(fetchctx_t *fctx) {
* NSEC3 records are not allowed to
* appear in the answer section.
*/
+ log_formerr(fctx, "NSEC3 in answer");
return (DNS_R_FORMERR);
}
+
+ /*
+ * Apply filters, if given, on answers to reject
+ * a malicious attempt of rebinding.
+ */
+ if ((rdataset->type == dns_rdatatype_a ||
+ rdataset->type == dns_rdatatype_aaaa) &&
+ !is_answeraddress_allowed(view, name,
+ rdataset)) {
+ return (DNS_R_SERVFAIL);
+ }
+
if (rdataset->type == type && !found_cname) {
/*
* We've found an ordinary answer.
@@ -5539,8 +5762,16 @@ answer_response(fetchctx_t *fctx) {
*/
if (type == dns_rdatatype_rrsig ||
type == dns_rdatatype_dnskey ||
- type == dns_rdatatype_nsec)
+ type == dns_rdatatype_nsec ||
+ type == dns_rdatatype_nsec3) {
+ char buf[DNS_RDATATYPE_FORMATSIZE];
+ dns_rdatatype_format(fctx->type,
+ buf, sizeof(buf));
+ log_formerr(fctx,
+ "CNAME response "
+ "for %s RR", buf);
return (DNS_R_FORMERR);
+ }
found = ISC_TRUE;
found_cname = ISC_TRUE;
want_chaining = ISC_TRUE;
@@ -5549,6 +5780,14 @@ answer_response(fetchctx_t *fctx) {
&tname);
if (result != ISC_R_SUCCESS)
return (result);
+ /* Apply filters on the target name. */
+ if (!is_answertarget_allowed(view,
+ name,
+ rdataset->type,
+ &tname,
+ &fctx->domain)) {
+ return (DNS_R_SERVFAIL);
+ }
} else if (rdataset->type == dns_rdatatype_rrsig
&& rdataset->covers ==
dns_rdatatype_cname
@@ -5649,6 +5888,8 @@ answer_response(fetchctx_t *fctx) {
rdataset != NULL;
rdataset = ISC_LIST_NEXT(rdataset, link)) {
isc_boolean_t found_dname = ISC_FALSE;
+ dns_name_t *dname_name;
+
found = ISC_FALSE;
aflag = 0;
if (rdataset->type == dns_rdatatype_dname) {
@@ -5659,12 +5900,15 @@ answer_response(fetchctx_t *fctx) {
* If we're not chaining, then the
* DNAME should not be external.
*/
- if (!chaining && external)
+ if (!chaining && external) {
+ log_formerr(fctx,
+ "external DNAME");
return (DNS_R_FORMERR);
+ }
found = ISC_TRUE;
want_chaining = ISC_TRUE;
aflag = DNS_RDATASETATTR_ANSWER;
- result = dname_target(rdataset,
+ result = dname_target(fctx, rdataset,
qname, name,
&dname);
if (result == ISC_R_NOSPACE) {
@@ -5678,6 +5922,15 @@ answer_response(fetchctx_t *fctx) {
return (result);
else
found_dname = ISC_TRUE;
+
+ dname_name = dns_fixedname_name(&dname);
+ if (!is_answertarget_allowed(view,
+ qname,
+ rdataset->type,
+ dname_name,
+ &fctx->domain)) {
+ return (DNS_R_SERVFAIL);
+ }
} else if (rdataset->type == dns_rdatatype_rrsig
&& rdataset->covers ==
dns_rdatatype_dname) {
@@ -5765,8 +6018,10 @@ answer_response(fetchctx_t *fctx) {
/*
* We should have found an answer.
*/
- if (!have_answer)
+ if (!have_answer) {
+ log_formerr(fctx, "reply has no answer");
return (DNS_R_FORMERR);
+ }
/*
* This response is now potentially cacheable.
@@ -5783,15 +6038,18 @@ answer_response(fetchctx_t *fctx) {
* If it isn't a noanswer response, no harm will be
* done.
*/
- return (noanswer_response(fctx, qname, ISC_FALSE));
+ return (noanswer_response(fctx, qname, 0));
}
/*
* We didn't end with an incomplete chain, so the rcode should be
* "no error".
*/
- if (message->rcode != dns_rcode_noerror)
+ if (message->rcode != dns_rcode_noerror) {
+ log_formerr(fctx, "CNAME/DNAME chain complete, but RCODE "
+ "indicates error");
return (DNS_R_FORMERR);
+ }
/*
* Examine the authority section (if there is one).
@@ -6128,6 +6386,39 @@ log_packet(dns_message_t *message, int level, isc_mem_t *mctx) {
isc_mem_put(mctx, buf, len);
}
+static isc_boolean_t
+iscname(fetchctx_t *fctx) {
+ isc_result_t result;
+
+ result = dns_message_findname(fctx->rmessage, DNS_SECTION_ANSWER,
+ &fctx->name, dns_rdatatype_cname, 0,
+ NULL, NULL);
+ return (result == ISC_R_SUCCESS ? ISC_TRUE : ISC_FALSE);
+}
+
+static isc_boolean_t
+betterreferral(fetchctx_t *fctx) {
+ isc_result_t result;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ dns_message_t *message = fctx->rmessage;
+
+ for (result = dns_message_firstname(message, DNS_SECTION_AUTHORITY);
+ result == ISC_R_SUCCESS;
+ result = dns_message_nextname(message, DNS_SECTION_AUTHORITY)) {
+ name = NULL;
+ dns_message_currentname(message, DNS_SECTION_AUTHORITY, &name);
+ if (!isstrictsubdomain(name, &fctx->domain))
+ continue;
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link))
+ if (rdataset->type == dns_rdatatype_ns)
+ return (ISC_TRUE);
+ }
+ return (ISC_FALSE);
+}
+
static void
resquery_response(isc_task_t *task, isc_event_t *event) {
isc_result_t result = ISC_R_SUCCESS;
@@ -6179,6 +6470,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
fctx->timeouts = 0;
fctx->timeout = ISC_FALSE;
+ fctx->addrinfo = query->addrinfo;
/*
* XXXRTH We should really get the current time just once. We
@@ -6475,6 +6767,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
* cannot make any more progress with this
* fetch.
*/
+ log_formerr(fctx, "server sent FORMERR");
result = DNS_R_FORMERR;
}
} else if (message->rcode == dns_rcode_yxdomain) {
@@ -6589,27 +6882,62 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
(message->rcode == dns_rcode_noerror ||
message->rcode == dns_rcode_nxdomain)) {
/*
- * We've got answers. However, if we sent
- * a BIND 8 server an NS query, it may have
- * incorrectly responded with a non-authoritative
- * answer instead of a referral. Since this
- * answer lacks the SIGs necessary to do DNSSEC
- * validation, we must invoke the following special
- * kludge to treat it as a referral.
+ * [normal case]
+ * We've got answers. If it has an authoritative answer or an
+ * answer from a forwarder, we're done.
*/
- if (fctx->type == dns_rdatatype_ns &&
- (message->flags & DNS_MESSAGEFLAG_AA) == 0 &&
- !ISFORWARDER(query->addrinfo))
- {
- result = noanswer_response(fctx, NULL, ISC_TRUE);
+ if ((message->flags & DNS_MESSAGEFLAG_AA) != 0 ||
+ ISFORWARDER(query->addrinfo))
+ result = answer_response(fctx);
+ else if (iscname(fctx) &&
+ fctx->type != dns_rdatatype_any &&
+ fctx->type != dns_rdatatype_cname) {
+ /*
+ * A BIND8 server could return a non-authoritative
+ * answer when a CNAME is followed. We should treat
+ * it as a valid answer.
+ */
+ result = answer_response(fctx);
+ } else if (fctx->type != dns_rdatatype_ns &&
+ !betterreferral(fctx)) {
+ /*
+ * Lame response !!!.
+ */
+ result = answer_response(fctx);
+ } else {
+ if (fctx->type == dns_rdatatype_ns) {
+ /*
+ * A BIND 8 server could incorrectly return a
+ * non-authoritative answer to an NS query
+ * instead of a referral. Since this answer
+ * lacks the SIGs necessary to do DNSSEC
+ * validation, we must invoke the following
+ * special kludge to treat it as a referral.
+ */
+ result = noanswer_response(fctx, NULL,
+ LOOK_FOR_NS_IN_ANSWER);
+ } else {
+ /*
+ * Some other servers may still somehow include
+ * an answer when it should return a referral
+ * with an empty answer. Check to see if we can
+ * treat this as a referral by ignoring the
+ * answer. Further more, there may be an
+ * implementation that moves A/AAAA glue records
+ * to the answer section for that type of
+ * delegation when the query is for that glue
+ * record. LOOK_FOR_GLUE_IN_ANSWER will handle
+ * such a corner case.
+ */
+ result = noanswer_response(fctx, NULL,
+ LOOK_FOR_GLUE_IN_ANSWER);
+ }
if (result != DNS_R_DELEGATION) {
/*
- * The answer section must have contained
- * something other than the NS records
- * we asked for. Since AA is not set
- * and the server is not a forwarder,
- * it is technically lame and it's easier
- * to treat it as such than to figure out
+ * At this point, AA is not set, the response
+ * is not a referral, and the server is not a
+ * forwarder. It is technically lame and it's
+ * easier to treat it as such than to figure out
* some more elaborate course of action.
*/
broken_server = DNS_R_LAME;
@@ -6618,7 +6946,6 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
}
goto force_referral;
}
- result = answer_response(fctx);
if (result != ISC_R_SUCCESS) {
if (result == DNS_R_FORMERR)
keep_trying = ISC_TRUE;
@@ -6630,7 +6957,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
/*
* NXDOMAIN, NXRDATASET, or referral.
*/
- result = noanswer_response(fctx, NULL, ISC_FALSE);
+ result = noanswer_response(fctx, NULL, 0);
if (result == DNS_R_CHASEDSSERVERS) {
} else if (result == DNS_R_DELEGATION) {
force_referral:
@@ -7042,6 +7369,7 @@ dns_resolver_create(dns_view_t *view,
res->spillatmax = 100;
res->spillattimer = NULL;
res->zero_no_soa_ttl = ISC_FALSE;
+ res->query_timeout = DEFAULT_QUERY_TIMEOUT;
res->ndisps = 0;
res->nextdisp = 0; /* meaningless at this point, but init it */
res->nbuckets = ntasks;
@@ -7193,6 +7521,7 @@ dns_resolver_create(dns_view_t *view,
return (result);
}
+#ifdef BIND9
static void
prime_done(isc_task_t *task, isc_event_t *event) {
dns_resolver_t *res;
@@ -7298,16 +7627,15 @@ dns_resolver_prime(dns_resolver_t *res) {
}
}
}
+#endif /* BIND9 */
void
dns_resolver_freeze(dns_resolver_t *res) {
-
/*
* Freeze resolver.
*/
REQUIRE(VALID_RESOLVER(res));
- REQUIRE(!res->frozen);
res->frozen = ISC_TRUE;
}
@@ -8340,3 +8668,22 @@ dns_resolver_getoptions(dns_resolver_t *resolver) {
return (resolver->options);
}
+
+unsigned int
+dns_resolver_gettimeout(dns_resolver_t *resolver) {
+ REQUIRE(VALID_RESOLVER(resolver));
+
+ return (resolver->query_timeout);
+}
+
+void
+dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds) {
+ REQUIRE(VALID_RESOLVER(resolver));
+
+ if (seconds == 0)
+ seconds = DEFAULT_QUERY_TIMEOUT;
+ if (seconds > MAXIMUM_QUERY_TIMEOUT)
+ seconds = MAXIMUM_QUERY_TIMEOUT;
+
+ resolver->query_timeout = seconds;
+}
diff --git a/contrib/bind9/lib/dns/result.c b/contrib/bind9/lib/dns/result.c
index 2b0457c..4cc194d 100644
--- a/contrib/bind9/lib/dns/result.c
+++ b/contrib/bind9/lib/dns/result.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.c,v 1.125.48.2 2010-02-25 10:56:41 tbox Exp $ */
+/* $Id: result.c,v 1.132 2011-01-11 23:47:13 tbox Exp $ */
/*! \file */
@@ -105,7 +105,7 @@ static const char *text[DNS_R_NRESULTS] = {
"no valid RRSIG", /*%< 59 DNS_R_NOVALIDSIG */
"no valid NSEC", /*%< 60 DNS_R_NOVALIDNSEC */
- "not insecure", /*%< 61 DNS_R_NOTINSECURE */
+ "insecurity proof failed", /*%< 61 DNS_R_NOTINSECURE */
"unknown service", /*%< 62 DNS_R_UNKNOWNSERVICE */
"recoverable error occurred", /*%< 63 DNS_R_RECOVERABLE */
"unknown opt attribute record", /*%< 64 DNS_R_UNKNOWNOPT */
@@ -160,6 +160,7 @@ static const char *text[DNS_R_NRESULTS] = {
"not master", /*%< 105 DNS_R_NOTMASTER */
"broken trust chain", /*%< 106 DNS_R_BROKENCHAIN */
+ "expired", /*%< 106 DNS_R_EXPIRED */
};
static const char *rcode_text[DNS_R_NRCODERESULTS] = {
diff --git a/contrib/bind9/lib/dns/rootns.c b/contrib/bind9/lib/dns/rootns.c
index d51a0d6..40e2244 100644
--- a/contrib/bind9/lib/dns/rootns.c
+++ b/contrib/bind9/lib/dns/rootns.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rootns.c,v 1.36.50.4 2010-06-18 05:37:50 marka Exp $ */
+/* $Id: rootns.c,v 1.40 2010-06-18 05:36:24 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/rpz.c b/contrib/bind9/lib/dns/rpz.c
new file mode 100644
index 0000000..f809e7b
--- /dev/null
+++ b/contrib/bind9/lib/dns/rpz.c
@@ -0,0 +1,1168 @@
+/*
+ * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rpz.c,v 1.7 2011-01-17 04:27:23 marka Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <isc/buffer.h>
+#include <isc/mem.h>
+#include <isc/net.h>
+#include <isc/netaddr.h>
+#include <isc/print.h>
+#include <isc/stdlib.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/db.h>
+#include <dns/fixedname.h>
+#include <dns/log.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/result.h>
+#include <dns/rpz.h>
+#include <dns/view.h>
+
+
+/*
+ * Parallel radix trees for databases of response policy IP addresses
+ *
+ * The radix or Patricia trees are somewhat specialized to handle response
+ * policy addresses by representing the two test of IP IP addresses and name
+ * server IP addresses in a single tree.
+ *
+ * Each leaf indicates that an IP address is listed in the IP address or the
+ * name server IP address policy sub-zone (or both) of the corresponding
+ * response response zone. The policy data such as a CNAME or an A record
+ * is kept in the policy zone. After an IP address has been found in a radix
+ * tree, the node in the policy zone's database is found by converting
+ * the IP address to a domain name in a canonical form.
+ *
+ * The response policy zone canonical form of IPv6 addresses is one of:
+ * prefix.W.W.W.W.W.W.W.W
+ * prefix.WORDS.zz
+ * prefix.WORDS.zz.WORDS
+ * prefix.zz.WORDS
+ * where
+ * prefix is the prefix length of the IPv6 address between 1 and 128
+ * W is a number between 0 and 65535
+ * WORDS is one or more numbers W separated with "."
+ * zz corresponds to :: in the standard IPv6 text representation
+ *
+ * The canonical form of IPv4 addresses is:
+ * prefix.B.B.B.B
+ * where
+ * prefix is the prefix length of the address between 1 and 32
+ * B is a number between 0 and 255
+ *
+ * IPv4 addresses are distinguished from IPv6 addresses by having
+ * 5 labels all of which are numbers, and a prefix between 1 and 32.
+ */
+
+
+/*
+ * Use a private definition of IPv6 addresses because s6_addr32 is not
+ * always defined and our IPv6 addresses are in non-standard byte order
+ */
+typedef isc_uint32_t dns_rpz_cidr_word_t;
+#define DNS_RPZ_CIDR_WORD_BITS ((int)sizeof(dns_rpz_cidr_word_t)*8)
+#define DNS_RPZ_CIDR_KEY_BITS ((int)sizeof(dns_rpz_cidr_key_t)*8)
+#define DNS_RPZ_CIDR_WORDS (128/DNS_RPZ_CIDR_WORD_BITS)
+typedef struct {
+ dns_rpz_cidr_word_t w[DNS_RPZ_CIDR_WORDS];
+} dns_rpz_cidr_key_t;
+
+#define ADDR_V4MAPPED 0xffff
+
+#define DNS_RPZ_WORD_MASK(b) \
+ ((b) == 0 ? (dns_rpz_cidr_word_t)(-1) \
+ : ((dns_rpz_cidr_word_t)(-1) \
+ << (DNS_RPZ_CIDR_WORD_BITS - (b))))
+
+#define DNS_RPZ_IP_BIT(ip, bitno) \
+ (1 & ((ip)->w[(bitno)/DNS_RPZ_CIDR_WORD_BITS] >> \
+ (DNS_RPZ_CIDR_WORD_BITS - 1 - ((bitno) % DNS_RPZ_CIDR_WORD_BITS))))
+
+typedef struct dns_rpz_cidr_node dns_rpz_cidr_node_t;
+typedef isc_uint8_t dns_rpz_cidr_flags_t;
+struct dns_rpz_cidr_node {
+ dns_rpz_cidr_node_t *parent;
+ dns_rpz_cidr_node_t *child[2];
+ dns_rpz_cidr_key_t ip;
+ dns_rpz_cidr_bits_t bits;
+ dns_rpz_cidr_flags_t flags;
+#define DNS_RPZ_CIDR_FG_IP 0x01 /* has IP data or is parent of IP */
+#define DNS_RPZ_CIDR_FG_IP_DATA 0x02 /* has IP data */
+#define DNS_RPZ_CIDR_FG_NSIPv4 0x04 /* has or is parent of NSIPv4 data */
+#define DNS_RPZ_CIDR_FG_NSIPv6 0x08 /* has or is parent of NSIPv6 data */
+#define DNS_RPZ_CIDR_FG_NSIP_DATA 0x10 /* has NSIP data */
+};
+
+struct dns_rpz_cidr {
+ isc_mem_t *mctx;
+ isc_boolean_t had_nsdname;
+ dns_rpz_cidr_node_t *root;
+ dns_name_t ip_name; /* RPZ_IP_ZONE.LOCALHOST. */
+ dns_name_t nsip_name; /* RPZ_NSIP_ZONE.LOCALHOST. */
+ dns_name_t nsdname_name; /* RPZ_NSDNAME_ZONE.LOCALHOST */
+};
+
+
+static isc_boolean_t have_rpz_zones = ISC_FALSE;
+
+
+const char *
+dns_rpz_type2str(dns_rpz_type_t type)
+{
+ switch (type) {
+ case DNS_RPZ_TYPE_QNAME:
+ return ("QNAME");
+ case DNS_RPZ_TYPE_IP:
+ return ("IP");
+ case DNS_RPZ_TYPE_NSIP:
+ return ("NSIP");
+ case DNS_RPZ_TYPE_NSDNAME:
+ return ("NSDNAME");
+ case DNS_RPZ_TYPE_BAD:
+ break;
+ }
+ FATAL_ERROR(__FILE__, __LINE__,
+ "impossible response policy zone type %d", type);
+ return ("impossible");
+}
+
+
+
+dns_rpz_policy_t
+dns_rpz_str2policy(const char *str)
+{
+ if (str == NULL)
+ return (DNS_RPZ_POLICY_ERROR);
+ if (!strcasecmp(str, "given"))
+ return (DNS_RPZ_POLICY_GIVEN);
+ if (!strcasecmp(str, "no-op"))
+ return (DNS_RPZ_POLICY_NO_OP);
+ if (!strcasecmp(str, "nxdomain"))
+ return (DNS_RPZ_POLICY_NXDOMAIN);
+ if (!strcasecmp(str, "nodata"))
+ return (DNS_RPZ_POLICY_NODATA);
+ if (!strcasecmp(str, "cname"))
+ return (DNS_RPZ_POLICY_CNAME);
+ return (DNS_RPZ_POLICY_ERROR);
+}
+
+
+
+/*
+ * Free the radix tree of a response policy database.
+ */
+void
+dns_rpz_cidr_free(dns_rpz_cidr_t **cidrp) {
+ dns_rpz_cidr_node_t *cur, *child, *parent;
+ dns_rpz_cidr_t *cidr;
+
+ REQUIRE(cidrp != NULL);
+
+ cidr = *cidrp;
+ if (cidr == NULL)
+ return;
+
+ cur = cidr->root;
+ while (cur != NULL) {
+ /* Depth first. */
+ child = cur->child[0];
+ if (child != NULL) {
+ cur = child;
+ continue;
+ }
+ child = cur->child[1];
+ if (child != NULL) {
+ cur = child;
+ continue;
+ }
+
+ /* Delete this leaf and go up. */
+ parent = cur->parent;
+ if (parent == NULL)
+ cidr->root = NULL;
+ else
+ parent->child[parent->child[1] == cur] = NULL;
+ isc_mem_put(cidr->mctx, cur, sizeof(*cur));
+ cur = parent;
+ }
+
+ dns_name_free(&cidr->ip_name, cidr->mctx);
+ dns_name_free(&cidr->nsip_name, cidr->mctx);
+ dns_name_free(&cidr->nsdname_name, cidr->mctx);
+ isc_mem_put(cidr->mctx, cidr, sizeof(*cidr));
+ *cidrp = NULL;
+}
+
+
+
+/*
+ * Forget a view's list of policy zones.
+ */
+void
+dns_rpz_view_destroy(dns_view_t *view) {
+ dns_rpz_zone_t *zone;
+
+ REQUIRE(view != NULL);
+
+ while (!ISC_LIST_EMPTY(view->rpz_zones)) {
+ zone = ISC_LIST_HEAD(view->rpz_zones);
+ ISC_LIST_UNLINK(view->rpz_zones, zone, link);
+ if (dns_name_dynamic(&zone->origin))
+ dns_name_free(&zone->origin, view->mctx);
+ if (dns_name_dynamic(&zone->nsdname))
+ dns_name_free(&zone->nsdname, view->mctx);
+ if (dns_name_dynamic(&zone->cname))
+ dns_name_free(&zone->cname, view->mctx);
+ isc_mem_put(view->mctx, zone, sizeof(*zone));
+ }
+}
+
+/*
+ * Note that we have at least one response policy zone.
+ * It would be better for something to tell the rbtdb code that the
+ * zone is in at least one view's list of policy zones.
+ */
+void
+dns_rpz_set_need(isc_boolean_t need)
+{
+ have_rpz_zones = need;
+}
+
+
+isc_boolean_t
+dns_rpz_needed(void)
+{
+ return (have_rpz_zones);
+}
+
+
+
+/*
+ * Start a new radix tree for a response policy zone.
+ */
+isc_result_t
+dns_rpz_new_cidr(isc_mem_t *mctx, dns_name_t *origin,
+ dns_rpz_cidr_t **rbtdb_cidr)
+{
+ isc_result_t result;
+ dns_rpz_cidr_t *cidr;
+
+ REQUIRE(rbtdb_cidr != NULL && *rbtdb_cidr == NULL);
+
+ /*
+ * Only if there is at least one response policy zone.
+ */
+ if (!have_rpz_zones)
+ return (ISC_R_SUCCESS);
+
+ cidr = isc_mem_get(mctx, sizeof(*cidr));
+ if (cidr == NULL)
+ return (ISC_R_NOMEMORY);
+ memset(cidr, 0, sizeof(*cidr));
+ cidr->mctx = mctx;
+
+ dns_name_init(&cidr->ip_name, NULL);
+ result = dns_name_fromstring2(&cidr->ip_name, DNS_RPZ_IP_ZONE, origin,
+ DNS_NAME_DOWNCASE, mctx);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, cidr, sizeof(*cidr));
+ return (result);
+ }
+
+ dns_name_init(&cidr->nsip_name, NULL);
+ result = dns_name_fromstring2(&cidr->nsip_name, DNS_RPZ_NSIP_ZONE,
+ origin, DNS_NAME_DOWNCASE, mctx);
+ if (result != ISC_R_SUCCESS) {
+ dns_name_free(&cidr->ip_name, mctx);
+ isc_mem_put(mctx, cidr, sizeof(*cidr));
+ return (result);
+ }
+
+ dns_name_init(&cidr->nsdname_name, NULL);
+ result = dns_name_fromstring2(&cidr->nsdname_name, DNS_RPZ_NSDNAME_ZONE,
+ origin, DNS_NAME_DOWNCASE, mctx);
+ if (result != ISC_R_SUCCESS) {
+ dns_name_free(&cidr->nsip_name, mctx);
+ dns_name_free(&cidr->ip_name, mctx);
+ isc_mem_put(mctx, cidr, sizeof(*cidr));
+ return (result);
+ }
+
+ *rbtdb_cidr = cidr;
+ return (ISC_R_SUCCESS);
+}
+
+
+/*
+ * See if a policy zone has IP, NSIP, or NSDNAME rules or records.
+ */
+void
+dns_rpz_enabled(dns_rpz_cidr_t *cidr, dns_rpz_st_t *st) {
+ if (cidr->root != NULL &&
+ (cidr->root->flags & DNS_RPZ_CIDR_FG_IP) != 0)
+ st->state |= DNS_RPZ_HAVE_IP;
+ if (cidr->root != NULL &&
+ (cidr->root->flags & DNS_RPZ_CIDR_FG_NSIPv4) != 0)
+ st->state |= DNS_RPZ_HAVE_NSIPv4;
+ if (cidr->root != NULL &&
+ (cidr->root->flags & DNS_RPZ_CIDR_FG_NSIPv6) != 0)
+ st->state |= DNS_RPZ_HAVE_NSIPv6;
+ if (cidr->had_nsdname)
+ st->state |= DNS_RPZ_HAD_NSDNAME;
+}
+
+static inline dns_rpz_cidr_flags_t
+get_flags(const dns_rpz_cidr_key_t *ip, dns_rpz_cidr_bits_t prefix,
+ dns_rpz_type_t rpz_type)
+{
+ if (rpz_type == DNS_RPZ_TYPE_NSIP) {
+ if (prefix >= 96 &&
+ ip->w[0] == 0 && ip->w[1] == 0 &&
+ ip->w[2] == ADDR_V4MAPPED)
+ return (DNS_RPZ_CIDR_FG_NSIP_DATA |
+ DNS_RPZ_CIDR_FG_NSIPv4);
+ else
+ return (DNS_RPZ_CIDR_FG_NSIP_DATA |
+ DNS_RPZ_CIDR_FG_NSIPv6);
+ } else {
+ return (DNS_RPZ_CIDR_FG_IP | DNS_RPZ_CIDR_FG_IP_DATA);
+ }
+}
+
+
+
+/*
+ * Mark a node as having IP or NSIP data and all of its parents
+ * as members of the IP or NSIP tree.
+ */
+static void
+set_node_flags(dns_rpz_cidr_node_t *node, dns_rpz_type_t rpz_type) {
+ dns_rpz_cidr_flags_t flags;
+
+ flags = get_flags(&node->ip, node->bits, rpz_type);
+ node->flags |= flags;
+ flags &= ~(DNS_RPZ_CIDR_FG_NSIP_DATA | DNS_RPZ_CIDR_FG_IP_DATA);
+ for (;;) {
+ node = node->parent;
+ if (node == NULL)
+ return;
+ node->flags |= flags;
+ }
+}
+
+
+
+/*
+ * Make a radix tree node.
+ */
+static dns_rpz_cidr_node_t *
+new_node(dns_rpz_cidr_t *cidr, const dns_rpz_cidr_key_t *ip,
+ dns_rpz_cidr_bits_t bits, dns_rpz_cidr_flags_t flags)
+{
+ dns_rpz_cidr_node_t *node;
+ int i, words, wlen;
+
+ node = isc_mem_get(cidr->mctx, sizeof(*node));
+ if (node == NULL)
+ return (NULL);
+ memset(node, 0, sizeof(*node));
+
+ node->flags = flags & ~(DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA);
+
+ node->bits = bits;
+ words = bits / DNS_RPZ_CIDR_WORD_BITS;
+ wlen = bits % DNS_RPZ_CIDR_WORD_BITS;
+ i = 0;
+ while (i < words) {
+ node->ip.w[i] = ip->w[i];
+ ++i;
+ }
+ if (wlen != 0) {
+ node->ip.w[i] = ip->w[i] & DNS_RPZ_WORD_MASK(wlen);
+ ++i;
+ }
+ while (i < DNS_RPZ_CIDR_WORDS)
+ node->ip.w[i++] = 0;
+
+ return (node);
+}
+
+
+
+static void
+badname(int level, dns_name_t *name, const char *comment)
+{
+ char printname[DNS_NAME_FORMATSIZE];
+
+ if (isc_log_wouldlog(dns_lctx, level)) {
+ dns_name_format(name, printname, sizeof(printname));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_RBTDB, level,
+ "invalid response policy name \"%s\"%s",
+ printname, comment);
+ }
+}
+
+
+
+/*
+ * Convert an IP address from radix tree binary (host byte order) to
+ * to its canonical response policy domain name and its name in the
+ * policy zone.
+ */
+static isc_result_t
+ip2name(dns_rpz_cidr_t *cidr, const dns_rpz_cidr_key_t *tgt_ip,
+ dns_rpz_cidr_bits_t tgt_prefix, dns_rpz_type_t type,
+ dns_name_t *canon_name, dns_name_t *search_name)
+{
+#ifndef INET6_ADDRSTRLEN
+#define INET6_ADDRSTRLEN 46
+#endif
+ int w[DNS_RPZ_CIDR_WORDS*2];
+ char str[1+8+1+INET6_ADDRSTRLEN+1];
+ isc_buffer_t buffer;
+ dns_name_t *name;
+ isc_result_t result;
+ isc_boolean_t zeros;
+ int i, n, len;
+
+ if (tgt_prefix > 96 &&
+ tgt_ip->w[0] == 0 &&
+ tgt_ip->w[1] == 0 &&
+ tgt_ip->w[2] == ADDR_V4MAPPED) {
+ len = snprintf(str, sizeof(str), "%d.%d.%d.%d.%d",
+ tgt_prefix - 96,
+ tgt_ip->w[3] & 0xff,
+ (tgt_ip->w[3]>>8) & 0xff,
+ (tgt_ip->w[3]>>16) & 0xff,
+ (tgt_ip->w[3]>>24) & 0xff);
+ if (len == -1 || len > (int)sizeof(str))
+ return (ISC_R_FAILURE);
+ } else {
+ for (i = 0; i < DNS_RPZ_CIDR_WORDS; i++) {
+ w[i*2+1] = ((tgt_ip->w[DNS_RPZ_CIDR_WORDS-1-i] >> 16)
+ & 0xffff);
+ w[i*2] = tgt_ip->w[DNS_RPZ_CIDR_WORDS-1-i] & 0xffff;
+ }
+ zeros = ISC_FALSE;
+ len = snprintf(str, sizeof(str), "%d", tgt_prefix);
+ if (len == -1)
+ return (ISC_R_FAILURE);
+ i = 0;
+ while (i < DNS_RPZ_CIDR_WORDS * 2) {
+ if (w[i] != 0 || zeros
+ || i >= DNS_RPZ_CIDR_WORDS * 2 - 1
+ || w[i+1] != 0) {
+ INSIST((size_t)len <= sizeof(str));
+ n = snprintf(&str[len], sizeof(str) - len,
+ ".%x", w[i++]);
+ if (n < 0)
+ return (ISC_R_FAILURE);
+ len += n;
+ } else {
+ zeros = ISC_TRUE;
+ INSIST((size_t)len <= sizeof(str));
+ n = snprintf(&str[len], sizeof(str) - len,
+ ".zz");
+ if (n < 0)
+ return (ISC_R_FAILURE);
+ len += n;
+ i += 2;
+ while (i < DNS_RPZ_CIDR_WORDS * 2 && w[i] == 0)
+ ++i;
+ }
+ if (len > (int)sizeof(str))
+ return (ISC_R_FAILURE);
+ }
+ }
+
+ if (canon_name != NULL) {
+ isc__buffer_init(&buffer, str, sizeof(str));
+ isc__buffer_add(&buffer, len);
+ result = dns_name_fromtext(canon_name, &buffer,
+ dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ if (search_name != NULL) {
+ isc__buffer_init(&buffer, str, sizeof(str));
+ isc__buffer_add(&buffer, len);
+ if (type == DNS_RPZ_TYPE_NSIP)
+ name = &cidr->nsip_name;
+ else
+ name = &cidr->ip_name;
+ result = dns_name_fromtext(search_name, &buffer, name, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+ return (ISC_R_SUCCESS);
+}
+
+
+
+/*
+ * Decide which kind of IP address response policy zone a name is in.
+ */
+static dns_rpz_type_t
+set_type(dns_rpz_cidr_t *cidr, dns_name_t *name) {
+
+ if (dns_name_issubdomain(name, &cidr->ip_name))
+ return (DNS_RPZ_TYPE_IP);
+
+ /*
+ * Require `./configure --enable-rpz-nsip` and nsdname
+ * until consistency problems are resolved.
+ */
+#ifdef ENABLE_RPZ_NSIP
+ if (dns_name_issubdomain(name, &cidr->nsip_name))
+ return (DNS_RPZ_TYPE_NSIP);
+#endif
+
+#ifdef ENABLE_RPZ_NSDNAME
+ if (dns_name_issubdomain(name, &cidr->nsdname_name))
+ return (DNS_RPZ_TYPE_NSDNAME);
+#endif
+
+ return (DNS_RPZ_TYPE_QNAME);
+}
+
+
+
+/*
+ * Convert an IP address from canonical response policy domain name form
+ * to radix tree binary (host byte order).
+ */
+static isc_result_t
+name2ipkey(dns_rpz_cidr_t *cidr, int level, dns_name_t *src_name,
+ dns_rpz_type_t type, dns_rpz_cidr_key_t *tgt_ip,
+ dns_rpz_cidr_bits_t *tgt_prefix)
+{
+ isc_buffer_t buffer;
+ unsigned char data[DNS_NAME_MAXWIRE+1];
+ dns_fixedname_t fname;
+ dns_name_t *name;
+ const char *cp, *end;
+ char *cp2;
+ int ip_labels;
+ dns_rpz_cidr_bits_t bits;
+ unsigned long prefix, l;
+ int i;
+
+ /*
+ * Need at least enough labels for the shortest name,
+ * :: or 128.*.RPZ_x_ZONE.rpz.LOCALHOST.
+ */
+ ip_labels = dns_name_countlabels(src_name);
+ ip_labels -= dns_name_countlabels(&cidr->ip_name);
+ ip_labels--;
+ if (ip_labels < 1) {
+ badname(level, src_name, ", too short");
+ return (ISC_R_FAILURE);
+ }
+
+ /*
+ * Get text for the IP address without RPZ_x_ZONE.rpz.LOCALHOST.
+ */
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ dns_name_split(src_name, dns_name_countlabels(&cidr->ip_name),
+ name, NULL);
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_name_totext(name, ISC_TRUE, &buffer);
+ isc_buffer_putuint8(&buffer, '\0');
+ cp = isc_buffer_base(&buffer);
+
+ prefix = strtoul(cp, &cp2, 10);
+ if (prefix < 1U || prefix > 128U || *cp2 != '.') {
+ badname(level, src_name, ", bad prefix length");
+ return (ISC_R_FAILURE);
+ }
+ cp = cp2+1;
+
+ end = isc_buffer_used(&buffer);
+ if (ip_labels == 4 && !strchr(cp, 'z')) {
+ /*
+ * Convert an IPv4 address
+ * from the form "prefix.w.z.y.x"
+ */
+ if (prefix > 32U) {
+ badname(level, src_name, "; bad IPv4 prefix length");
+ return (ISC_R_FAILURE);
+ }
+ prefix += 96;
+ *tgt_prefix = (dns_rpz_cidr_bits_t)prefix;
+ tgt_ip->w[0] = 0;
+ tgt_ip->w[1] = 0;
+ tgt_ip->w[2] = ADDR_V4MAPPED;
+ tgt_ip->w[3] = 0;
+ for (i = 0; i < 32; i += 8) {
+ l = strtoul(cp, &cp2, 10);
+ if (l > 255U || (*cp2 != '.' && *cp2 != '\0')) {
+ badname(level, src_name, "; bad IPv4 address");
+ return (ISC_R_FAILURE);
+ }
+ tgt_ip->w[3] |= l << i;
+ cp = cp2 + 1;
+ }
+ } else {
+ /*
+ * Convert a text IPv6 address.
+ */
+ *tgt_prefix = (dns_rpz_cidr_bits_t)prefix;
+ for (i = 0;
+ ip_labels > 0 && i < DNS_RPZ_CIDR_WORDS * 2;
+ ip_labels--) {
+ if (cp[0] == 'z' && cp[1] == 'z' &&
+ (cp[2] == '.' || cp[2] == '\0') &&
+ i <= 6) {
+ do {
+ if ((i & 1) == 0)
+ tgt_ip->w[3-i/2] = 0;
+ ++i;
+ } while (ip_labels + i <= 8);
+ cp += 3;
+ } else {
+ l = strtoul(cp, &cp2, 16);
+ if (l > 0xffffu ||
+ (*cp2 != '.' && *cp2 != '\0')) {
+ badname(level, src_name, "");
+ return (ISC_R_FAILURE);
+ }
+ if ((i & 1) == 0)
+ tgt_ip->w[3-i/2] = l;
+ else
+ tgt_ip->w[3-i/2] |= l << 16;
+ i++;
+ cp = cp2 + 1;
+ }
+ }
+ }
+ if (cp != end) {
+ badname(level, src_name, "");
+ return (ISC_R_FAILURE);
+ }
+
+ /*
+ * Check for 1s after the prefix length.
+ */
+ bits = (dns_rpz_cidr_bits_t)prefix;
+ while (bits < DNS_RPZ_CIDR_KEY_BITS) {
+ dns_rpz_cidr_word_t aword;
+
+ i = bits % DNS_RPZ_CIDR_WORD_BITS;
+ aword = tgt_ip->w[bits / DNS_RPZ_CIDR_WORD_BITS];
+ if ((aword & ~DNS_RPZ_WORD_MASK(i)) != 0) {
+ badname(level, src_name, "; wrong prefix length");
+ return (ISC_R_FAILURE);
+ }
+ bits -= i;
+ bits += DNS_RPZ_CIDR_WORD_BITS;
+ }
+
+ /*
+ * Convert the IPv6 address back to a canonical policy domain name
+ * to ensure that it is in canonical form.
+ */
+ if (ISC_R_SUCCESS != ip2name(cidr, tgt_ip, (dns_rpz_cidr_bits_t)prefix,
+ type, NULL, name) ||
+ !dns_name_equal(src_name, name)) {
+ badname(level, src_name, "; not canonical");
+ return (ISC_R_FAILURE);
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+
+
+/*
+ * find first differing bit
+ */
+static int
+ffbit(dns_rpz_cidr_word_t w) {
+ int bit;
+
+ if (w == 0)
+ return (DNS_RPZ_CIDR_WORD_BITS);
+ for (bit = 0; (w & (1U << (DNS_RPZ_CIDR_WORD_BITS-1))) == 0; bit++)
+ w <<= 1;
+ return (bit);
+}
+
+
+
+/*
+ * find the first differing bit in two keys
+ */
+static int
+diff_keys(const dns_rpz_cidr_key_t *key1, dns_rpz_cidr_bits_t bits1,
+ const dns_rpz_cidr_key_t *key2, dns_rpz_cidr_bits_t bits2)
+{
+ dns_rpz_cidr_word_t delta;
+ dns_rpz_cidr_bits_t maxbit, bit;
+ int i;
+
+ maxbit = ISC_MIN(bits1, bits2);
+
+ /*
+ * find the first differing words
+ */
+ for (i = 0, bit = 0;
+ bit <= maxbit;
+ i++, bit += DNS_RPZ_CIDR_WORD_BITS) {
+ delta = key1->w[i] ^ key2->w[i];
+ if (delta != 0) {
+ bit += ffbit(delta);
+ break;
+ }
+ }
+ return (ISC_MIN(bit, maxbit));
+}
+
+
+
+/*
+ * Search a radix tree for an IP address for ordinary lookup
+ * or for a CIDR block adding or deleting an entry
+ * The tree read (for simple search) or write lock must be held by the caller.
+ *
+ * return ISC_R_SUCCESS, ISC_R_NOTFOUND, DNS_R_PARTIALMATCH, ISC_R_EXISTS,
+ * ISC_R_NOMEMORY
+ */
+static isc_result_t
+search(dns_rpz_cidr_t *cidr, const dns_rpz_cidr_key_t *tgt_ip,
+ dns_rpz_cidr_bits_t tgt_prefix, dns_rpz_type_t type,
+ isc_boolean_t create,
+ dns_rpz_cidr_node_t **found) /* NULL or longest match node */
+{
+ dns_rpz_cidr_node_t *cur, *parent, *child, *new_parent, *sibling;
+ int cur_num, child_num;
+ dns_rpz_cidr_bits_t dbit;
+ dns_rpz_cidr_flags_t flags, data_flag;
+ isc_result_t find_result;
+
+ flags = get_flags(tgt_ip, tgt_prefix, type);
+ data_flag = flags & (DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA);
+
+ find_result = ISC_R_NOTFOUND;
+ if (found != NULL)
+ *found = NULL;
+ cur = cidr->root;
+ parent = NULL;
+ cur_num = 0;
+ for (;;) {
+ if (cur == NULL) {
+ /*
+ * No child so we cannot go down. Fail or
+ * add the target as a child of the current parent.
+ */
+ if (!create)
+ return (find_result);
+ child = new_node(cidr, tgt_ip, tgt_prefix, 0);
+ if (child == NULL)
+ return (ISC_R_NOMEMORY);
+ if (parent == NULL)
+ cidr->root = child;
+ else
+ parent->child[cur_num] = child;
+ child->parent = parent;
+ set_node_flags(child, type);
+ if (found != NULL)
+ *found = cur;
+ return (ISC_R_SUCCESS);
+ }
+
+ /*
+ * Pretend a node not in the correct tree does not exist
+ * if we are not adding to the tree,
+ * If we are adding, then continue down to eventually
+ * add a node and mark/put this node in the correct tree.
+ */
+ if ((cur->flags & flags) == 0 && !create)
+ return (find_result);
+
+ dbit = diff_keys(tgt_ip, tgt_prefix, &cur->ip, cur->bits);
+ /*
+ * dbit <= tgt_prefix and dbit <= cur->bits always.
+ * We are finished searching if we matched all of the target.
+ */
+ if (dbit == tgt_prefix) {
+ if (tgt_prefix == cur->bits) {
+ /*
+ * The current node matches the target exactly.
+ * It is the answer if it has data.
+ */
+ if ((cur->flags & data_flag) != 0) {
+ if (create)
+ return (ISC_R_EXISTS);
+ if (found != NULL)
+ *found = cur;
+ return (ISC_R_SUCCESS);
+ } else if (create) {
+ /*
+ * The node had no data but does now.
+ */
+ set_node_flags(cur, type);
+ if (found != NULL)
+ *found = cur;
+ return (ISC_R_SUCCESS);
+ }
+ return (find_result);
+ }
+
+ /*
+ * We know tgt_prefix < cur_bits which means that
+ * the target is shorter than the current node.
+ * Add the target as the current node's parent.
+ */
+ if (!create)
+ return (find_result);
+
+ new_parent = new_node(cidr, tgt_ip, tgt_prefix,
+ cur->flags);
+ if (new_parent == NULL)
+ return (ISC_R_NOMEMORY);
+ new_parent->parent = parent;
+ if (parent == NULL)
+ cidr->root = new_parent;
+ else
+ parent->child[cur_num] = new_parent;
+ child_num = DNS_RPZ_IP_BIT(&cur->ip, tgt_prefix+1);
+ new_parent->child[child_num] = cur;
+ cur->parent = new_parent;
+ set_node_flags(new_parent, type);
+ if (found != NULL)
+ *found = new_parent;
+ return (ISC_R_SUCCESS);
+ }
+
+ if (dbit == cur->bits) {
+ /*
+ * We have a partial match by matching of all of the
+ * current node but only part of the target.
+ * Try to go down.
+ */
+ if ((cur->flags & data_flag) != 0) {
+ find_result = DNS_R_PARTIALMATCH;
+ if (found != NULL)
+ *found = cur;
+ }
+
+ parent = cur;
+ cur_num = DNS_RPZ_IP_BIT(tgt_ip, dbit);
+ cur = cur->child[cur_num];
+ continue;
+ }
+
+
+ /*
+ * dbit < tgt_prefix and dbit < cur->bits,
+ * so we failed to match both the target and the current node.
+ * Insert a fork of a parent above the current node and
+ * add the target as a sibling of the current node
+ */
+ if (!create)
+ return (find_result);
+
+ sibling = new_node(cidr, tgt_ip, tgt_prefix, 0);
+ if (sibling == NULL)
+ return (ISC_R_NOMEMORY);
+ new_parent = new_node(cidr, tgt_ip, dbit, cur->flags);
+ if (new_parent == NULL) {
+ isc_mem_put(cidr->mctx, sibling, sizeof(*sibling));
+ return (ISC_R_NOMEMORY);
+ }
+ new_parent->parent = parent;
+ if (parent == NULL)
+ cidr->root = new_parent;
+ else
+ parent->child[cur_num] = new_parent;
+ child_num = DNS_RPZ_IP_BIT(tgt_ip, dbit);
+ new_parent->child[child_num] = sibling;
+ new_parent->child[1-child_num] = cur;
+ cur->parent = new_parent;
+ sibling->parent = new_parent;
+ set_node_flags(sibling, type);
+ if (found != NULL)
+ *found = sibling;
+ return (ISC_R_SUCCESS);
+ }
+}
+
+
+
+/*
+ * Add an IP address to the radix tree of a response policy database.
+ * The tree write lock must be held by the caller.
+ */
+void
+dns_rpz_cidr_addip(dns_rpz_cidr_t *cidr, dns_name_t *name)
+{
+ dns_rpz_cidr_key_t tgt_ip;
+ dns_rpz_cidr_bits_t tgt_prefix;
+ dns_rpz_type_t type;
+
+ if (cidr == NULL)
+ return;
+
+ /*
+ * no worries if the new name is not an IP address
+ */
+ type = set_type(cidr, name);
+ switch (type) {
+ case DNS_RPZ_TYPE_IP:
+ case DNS_RPZ_TYPE_NSIP:
+ break;
+ case DNS_RPZ_TYPE_NSDNAME:
+ cidr->had_nsdname = ISC_TRUE;
+ return;
+ case DNS_RPZ_TYPE_QNAME:
+ case DNS_RPZ_TYPE_BAD:
+ return;
+ }
+ if (ISC_R_SUCCESS != name2ipkey(cidr, DNS_RPZ_ERROR_LEVEL, name,
+ type, &tgt_ip, &tgt_prefix))
+ return;
+
+ if (ISC_R_EXISTS == search(cidr, &tgt_ip, tgt_prefix, type,
+ ISC_TRUE, NULL) &&
+ isc_log_wouldlog(dns_lctx, DNS_RPZ_ERROR_LEVEL)) {
+ char printname[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(name, printname, sizeof(printname));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_RBTDB, DNS_RPZ_ERROR_LEVEL,
+ "duplicate response policy name \"%s\"",
+ printname);
+ }
+}
+
+
+
+/*
+ * Delete an IP address from the radix tree of a response policy database.
+ * The tree write lock must be held by the caller.
+ */
+void
+dns_rpz_cidr_deleteip(dns_rpz_cidr_t *cidr, dns_name_t *name) {
+ dns_rpz_cidr_key_t tgt_ip;
+ dns_rpz_cidr_bits_t tgt_prefix;
+ dns_rpz_type_t type;
+ dns_rpz_cidr_node_t *tgt = NULL, *parent, *child;
+ dns_rpz_cidr_flags_t flags, data_flag;
+
+ if (cidr == NULL)
+ return;
+
+ /*
+ * Decide which kind of policy zone IP address it is, if either
+ * and then find its node.
+ */
+ type = set_type(cidr, name);
+ switch (type) {
+ case DNS_RPZ_TYPE_IP:
+ case DNS_RPZ_TYPE_NSIP:
+ break;
+ case DNS_RPZ_TYPE_NSDNAME:
+ /*
+ * We cannot easily count nsdnames because
+ * internal rbt nodes get deleted.
+ */
+ return;
+ case DNS_RPZ_TYPE_QNAME:
+ case DNS_RPZ_TYPE_BAD:
+ return;
+ }
+
+ /*
+ * Do not get excited about the deletion of interior rbt nodes.
+ */
+ if (ISC_R_SUCCESS != name2ipkey(cidr, DNS_RPZ_DEBUG_LEVEL2, name,
+ type, &tgt_ip, &tgt_prefix))
+ return;
+ if (ISC_R_SUCCESS != search(cidr, &tgt_ip, tgt_prefix, type,
+ ISC_FALSE, &tgt)) {
+ if (isc_log_wouldlog(dns_lctx, DNS_RPZ_ERROR_LEVEL)) {
+ char printname[DNS_NAME_FORMATSIZE];
+
+ dns_name_format(name, printname, sizeof(printname));
+ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_RBTDB, DNS_RPZ_ERROR_LEVEL,
+ "missing response policy node \"%s\"",
+ printname);
+ }
+ return;
+ }
+
+ /*
+ * Mark the node and its parents to reflect the deleted IP address.
+ */
+ flags = get_flags(&tgt_ip, tgt_prefix, type);
+ data_flag = flags & (DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA);
+ tgt->flags &= ~data_flag;
+ for (parent = tgt; parent != NULL; parent = parent->parent) {
+ if ((parent->flags & data_flag) != 0 ||
+ (parent->child[0] != NULL &&
+ (parent->child[0]->flags & flags) != 0) ||
+ (parent->child[1] != NULL &&
+ (parent->child[1]->flags & flags) != 0))
+ break;
+ parent->flags &= ~flags;
+ }
+
+ /*
+ * We might need to delete 2 nodes.
+ */
+ do {
+ /*
+ * The node is now useless if it has no data of its own
+ * and 0 or 1 children. We are finished if it is not useless.
+ */
+ if ((child = tgt->child[0]) != NULL) {
+ if (tgt->child[1] != NULL)
+ return;
+ } else {
+ child = tgt->child[1];
+ }
+ if ((tgt->flags & (DNS_RPZ_CIDR_FG_IP_DATA |
+ DNS_RPZ_CIDR_FG_NSIP_DATA)) != 0)
+ return;
+
+ /*
+ * Replace the pointer to this node in the parent with
+ * the remaining child or NULL.
+ */
+ parent = tgt->parent;
+ if (parent == NULL) {
+ cidr->root = child;
+ } else {
+ parent->child[parent->child[1] == tgt] = child;
+ }
+ /*
+ * If the child exists fix up its parent pointer.
+ */
+ if (child != NULL)
+ child->parent = parent;
+ isc_mem_put(cidr->mctx, tgt, sizeof(*tgt));
+
+ tgt = parent;
+ } while (tgt != NULL);
+}
+
+
+
+/*
+ * Caller must hold tree lock.
+ * Return ISC_R_NOTFOUND
+ * or ISC_R_SUCCESS and the found entry's canonical and search names
+ * and its prefix length
+ */
+isc_result_t
+dns_rpz_cidr_find(dns_rpz_cidr_t *cidr, const isc_netaddr_t *netaddr,
+ dns_rpz_type_t type, dns_name_t *canon_name,
+ dns_name_t *search_name, dns_rpz_cidr_bits_t *prefix)
+{
+ dns_rpz_cidr_key_t tgt_ip;
+ isc_result_t result;
+ dns_rpz_cidr_node_t *found;
+ int i;
+
+ /*
+ * Convert IP address to CIDR tree key.
+ */
+ if (netaddr->family == AF_INET) {
+ tgt_ip.w[0] = 0;
+ tgt_ip.w[1] = 0;
+ tgt_ip.w[2] = ADDR_V4MAPPED;
+ tgt_ip.w[3] = ntohl(netaddr->type.in.s_addr);
+ } else if (netaddr->family == AF_INET6) {
+ dns_rpz_cidr_key_t src_ip6;
+
+ /*
+ * Given the int aligned struct in_addr member of netaddr->type
+ * one could cast netaddr->type.in6 to dns_rpz_cidr_key_t *,
+ * but there are objections.
+ */
+ memcpy(src_ip6.w, &netaddr->type.in6, sizeof(src_ip6.w));
+ for (i = 0; i < 4; i++) {
+ tgt_ip.w[i] = ntohl(src_ip6.w[i]);
+ }
+ } else {
+ return (ISC_R_NOTFOUND);
+ }
+
+ result = search(cidr, &tgt_ip, 128, type, ISC_FALSE, &found);
+ if (result != ISC_R_SUCCESS && result != DNS_R_PARTIALMATCH)
+ return (result);
+
+ *prefix = found->bits;
+ return (ip2name(cidr, &found->ip, found->bits, type,
+ canon_name, search_name));
+}
+
+
+
+/*
+ * Translate CNAME rdata to a QNAME response policy action.
+ */
+dns_rpz_policy_t
+dns_rpz_decode_cname(dns_rdataset_t *rdataset, dns_name_t *selfname) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_cname_t cname;
+ isc_result_t result;
+
+ result = dns_rdataset_first(rdataset);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &cname, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdata_reset(&rdata);
+
+ /*
+ * CNAME . means NXDOMAIN
+ */
+ if (dns_name_equal(&cname.cname, dns_rootname))
+ return (DNS_RPZ_POLICY_NXDOMAIN);
+
+ /*
+ * CNAME *. means NODATA
+ */
+ if (dns_name_countlabels(&cname.cname) == 2
+ && dns_name_iswildcard(&cname.cname))
+ return (DNS_RPZ_POLICY_NODATA);
+
+ /*
+ * 128.1.0.127.rpz-ip CNAME 128.1.0.0.127. means "do not rewrite"
+ */
+ if (selfname != NULL && dns_name_equal(&cname.cname, selfname))
+ return (DNS_RPZ_POLICY_NO_OP);
+
+ /*
+ * evil.com CNAME garden.net rewrites www.evil.com to www.garden.net.
+ */
+ return (DNS_RPZ_POLICY_RECORD);
+}
diff --git a/contrib/bind9/lib/dns/rriterator.c b/contrib/bind9/lib/dns/rriterator.c
new file mode 100644
index 0000000..31d67af
--- /dev/null
+++ b/contrib/bind9/lib/dns/rriterator.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: rriterator.c,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+/*! \file */
+
+/***
+ *** Imports
+ ***/
+
+#include <config.h>
+
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/db.h>
+#include <dns/dbiterator.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatasetiter.h>
+#include <dns/result.h>
+#include <dns/rriterator.h>
+
+/***
+ *** RRiterator methods
+ ***/
+
+isc_result_t
+dns_rriterator_init(dns_rriterator_t *it, dns_db_t *db, dns_dbversion_t *ver,
+ isc_stdtime_t now)
+{
+ isc_result_t result;
+ it->magic = RRITERATOR_MAGIC;
+ it->db = db;
+ it->dbit = NULL;
+ it->ver = ver;
+ it->now = now;
+ it->node = NULL;
+ result = dns_db_createiterator(it->db, 0, &it->dbit);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ it->rdatasetit = NULL;
+ dns_rdata_init(&it->rdata);
+ dns_rdataset_init(&it->rdataset);
+ dns_fixedname_init(&it->fixedname);
+ INSIST(! dns_rdataset_isassociated(&it->rdataset));
+ it->result = ISC_R_SUCCESS;
+ return (it->result);
+}
+
+isc_result_t
+dns_rriterator_first(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ /* Reset state */
+ if (dns_rdataset_isassociated(&it->rdataset))
+ dns_rdataset_disassociate(&it->rdataset);
+ if (it->rdatasetit != NULL)
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ if (it->node != NULL)
+ dns_db_detachnode(it->db, &it->node);
+ it->result = dns_dbiterator_first(it->dbit);
+
+ /*
+ * The top node may be empty when out of zone glue exists.
+ * Walk the tree to find the first node with data.
+ */
+ while (it->result == ISC_R_SUCCESS) {
+ it->result = dns_dbiterator_current(it->dbit, &it->node,
+ dns_fixedname_name(&it->fixedname));
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+
+ it->result = dns_db_allrdatasets(it->db, it->node, it->ver,
+ it->now, &it->rdatasetit);
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+
+ it->result = dns_rdatasetiter_first(it->rdatasetit);
+ if (it->result != ISC_R_SUCCESS) {
+ /*
+ * This node is empty. Try next node.
+ */
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ dns_db_detachnode(it->db, &it->node);
+ it->result = dns_dbiterator_next(it->dbit);
+ continue;
+ }
+ dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
+ it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
+ it->result = dns_rdataset_first(&it->rdataset);
+ return (it->result);
+ }
+ return (it->result);
+}
+
+isc_result_t
+dns_rriterator_nextrrset(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ if (dns_rdataset_isassociated(&it->rdataset))
+ dns_rdataset_disassociate(&it->rdataset);
+ it->result = dns_rdatasetiter_next(it->rdatasetit);
+ /*
+ * The while loop body is executed more than once
+ * only when an empty dbnode needs to be skipped.
+ */
+ while (it->result == ISC_R_NOMORE) {
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ dns_db_detachnode(it->db, &it->node);
+ it->result = dns_dbiterator_next(it->dbit);
+ if (it->result == ISC_R_NOMORE) {
+ /* We are at the end of the entire database. */
+ return (it->result);
+ }
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ it->result = dns_dbiterator_current(it->dbit, &it->node,
+ dns_fixedname_name(&it->fixedname));
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ it->result = dns_db_allrdatasets(it->db, it->node, it->ver,
+ it->now, &it->rdatasetit);
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ it->result = dns_rdatasetiter_first(it->rdatasetit);
+ }
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+ dns_rdatasetiter_current(it->rdatasetit, &it->rdataset);
+ it->rdataset.attributes |= DNS_RDATASETATTR_LOADORDER;
+ it->result = dns_rdataset_first(&it->rdataset);
+ return (it->result);
+}
+
+isc_result_t
+dns_rriterator_next(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ if (it->result != ISC_R_SUCCESS)
+ return (it->result);
+
+ INSIST(it->dbit != NULL);
+ INSIST(it->node != NULL);
+ INSIST(it->rdatasetit != NULL);
+
+ it->result = dns_rdataset_next(&it->rdataset);
+ if (it->result == ISC_R_NOMORE)
+ return (dns_rriterator_nextrrset(it));
+ return (it->result);
+}
+
+void
+dns_rriterator_pause(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ RUNTIME_CHECK(dns_dbiterator_pause(it->dbit) == ISC_R_SUCCESS);
+}
+
+void
+dns_rriterator_destroy(dns_rriterator_t *it) {
+ REQUIRE(VALID_RRITERATOR(it));
+ if (dns_rdataset_isassociated(&it->rdataset))
+ dns_rdataset_disassociate(&it->rdataset);
+ if (it->rdatasetit != NULL)
+ dns_rdatasetiter_destroy(&it->rdatasetit);
+ if (it->node != NULL)
+ dns_db_detachnode(it->db, &it->node);
+ dns_dbiterator_destroy(&it->dbit);
+}
+
+void
+dns_rriterator_current(dns_rriterator_t *it, dns_name_t **name,
+ isc_uint32_t *ttl, dns_rdataset_t **rdataset,
+ dns_rdata_t **rdata)
+{
+ REQUIRE(name != NULL && *name == NULL);
+ REQUIRE(VALID_RRITERATOR(it));
+ REQUIRE(it->result == ISC_R_SUCCESS);
+
+ *name = dns_fixedname_name(&it->fixedname);
+ *ttl = it->rdataset.ttl;
+
+ dns_rdata_reset(&it->rdata);
+ dns_rdataset_current(&it->rdataset, &it->rdata);
+
+ if (rdataset)
+ *rdataset = &it->rdataset;
+
+ if (rdata)
+ *rdata = &it->rdata;
+}
diff --git a/contrib/bind9/lib/dns/sdb.c b/contrib/bind9/lib/dns/sdb.c
index 49c6430..d27007d 100644
--- a/contrib/bind9/lib/dns/sdb.c
+++ b/contrib/bind9/lib/dns/sdb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdb.c,v 1.66.48.6 2010-08-16 05:21:42 marka Exp $ */
+/* $Id: sdb.c,v 1.76 2011-01-13 04:59:25 tbox Exp $ */
/*! \file */
@@ -450,7 +450,7 @@ getnode(dns_sdballnodes_t *allnodes, const char *name, dns_sdbnode_t **nodep) {
isc_buffer_init(&b, name, strlen(name));
isc_buffer_add(&b, strlen(name));
- result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
+ result = dns_name_fromtext(newname, &b, origin, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -1253,6 +1253,8 @@ static dns_dbmethods_t sdb_methods = {
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
NULL
};
diff --git a/contrib/bind9/lib/dns/sdlz.c b/contrib/bind9/lib/dns/sdlz.c
index 6be315a..e684e1d 100644
--- a/contrib/bind9/lib/dns/sdlz.c
+++ b/contrib/bind9/lib/dns/sdlz.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2005-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2005-2011 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -50,7 +50,7 @@
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdlz.c,v 1.18.50.6 2010-08-16 05:21:42 marka Exp $ */
+/* $Id: sdlz.c,v 1.31 2011-01-13 06:29:16 marka Exp $ */
/*! \file */
@@ -108,6 +108,8 @@ struct dns_sdlz_db {
isc_mutex_t refcnt_lock;
/* Locked */
unsigned int references;
+ dns_dbversion_t *future_version;
+ int dummy_version;
};
struct dns_sdlzlookup {
@@ -164,8 +166,6 @@ typedef struct sdlz_rdatasetiter {
/* This is a reasonable value */
#define SDLZ_DEFAULT_TTL (60 * 60 * 24)
-static int dummy;
-
#ifdef __COVERITY__
#define MAYBE_LOCK(imp) LOCK(&imp->driverlock)
#define MAYBE_UNLOCK(imp) UNLOCK(&imp->driverlock)
@@ -225,11 +225,22 @@ static dns_dbiteratormethods_t dbiterator_methods = {
* Utility functions
*/
-/*% Converts the input string to lowercase, in place. */
+/*
+ * Log a message at the given level
+ */
+static void
+sdlz_log(int level, const char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE,
+ DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(level),
+ fmt, ap);
+ va_end(ap);
+}
+/*% Converts the input string to lowercase, in place. */
static void
dns_sdlz_tolower(char *str) {
-
unsigned int len = strlen(str);
unsigned int i;
@@ -237,7 +248,6 @@ dns_sdlz_tolower(char *str) {
if (str[i] >= 'A' && str[i] <= 'Z')
str[i] += 32;
}
-
}
static inline unsigned int
@@ -381,43 +391,79 @@ dump(dns_db_t *db, dns_dbversion_t *version, const char *filename,
static void
currentversion(dns_db_t *db, dns_dbversion_t **versionp) {
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ REQUIRE(VALID_SDLZDB(sdlz));
REQUIRE(versionp != NULL && *versionp == NULL);
- UNUSED(db);
-
- *versionp = (void *) &dummy;
+ *versionp = (void *) &sdlz->dummy_version;
return;
}
static isc_result_t
newversion(dns_db_t *db, dns_dbversion_t **versionp) {
- UNUSED(db);
- UNUSED(versionp);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ char origin[DNS_NAME_MAXTEXT + 1];
+ isc_result_t result;
- return (ISC_R_NOTIMPLEMENTED);
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ if (sdlz->dlzimp->methods->newversion == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ dns_name_format(&sdlz->common.origin, origin, sizeof(origin));
+
+ result = sdlz->dlzimp->methods->newversion(origin,
+ sdlz->dlzimp->driverarg,
+ sdlz->dbdata, versionp);
+ if (result != ISC_R_SUCCESS) {
+ sdlz_log(ISC_LOG_ERROR,
+ "sdlz newversion on origin %s failed : %s",
+ origin, isc_result_totext(result));
+ return (result);
+ }
+
+ sdlz->future_version = *versionp;
+ return (ISC_R_SUCCESS);
}
static void
attachversion(dns_db_t *db, dns_dbversion_t *source,
dns_dbversion_t **targetp)
{
- REQUIRE(source != NULL && source == (void *) &dummy);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+
+ REQUIRE(VALID_SDLZDB(sdlz));
+ REQUIRE(source != NULL && source == (void *)&sdlz->dummy_version);
- UNUSED(db);
- UNUSED(source);
- UNUSED(targetp);
*targetp = source;
}
static void
closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
- REQUIRE(versionp != NULL && *versionp == (void *) &dummy);
- REQUIRE(commit == ISC_FALSE);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ char origin[DNS_NAME_MAXTEXT + 1];
- UNUSED(db);
- UNUSED(commit);
+ REQUIRE(VALID_SDLZDB(sdlz));
+ REQUIRE(versionp != NULL);
+
+ if (*versionp == (void *)&sdlz->dummy_version) {
+ *versionp = NULL;
+ return;
+ }
+
+ REQUIRE(*versionp == sdlz->future_version);
+ REQUIRE(sdlz->dlzimp->methods->closeversion != NULL);
+
+ dns_name_format(&sdlz->common.origin, origin, sizeof(origin));
- *versionp = NULL;
+ sdlz->dlzimp->methods->closeversion(origin, commit,
+ sdlz->dlzimp->driverarg,
+ sdlz->dbdata, versionp);
+ if (*versionp != NULL)
+ sdlz_log(ISC_LOG_ERROR,
+ "sdlz closeversion on origin %s failed", origin);
+
+ sdlz->future_version = NULL;
}
static isc_result_t
@@ -506,11 +552,11 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
dns_sdlzauthorityfunc_t authority;
REQUIRE(VALID_SDLZDB(sdlz));
- REQUIRE(create == ISC_FALSE);
REQUIRE(nodep != NULL && *nodep == NULL);
- UNUSED(name);
- UNUSED(create);
+ if (sdlz->dlzimp->methods->newversion == NULL) {
+ REQUIRE(create == ISC_FALSE);
+ }
isc_buffer_init(&b, namestr, sizeof(namestr));
if ((sdlz->dlzimp->flags & DNS_SDLZFLAG_RELATIVEOWNER) != 0) {
@@ -558,7 +604,7 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
* if the host (namestr) was not found, try to lookup a
* "wildcard" host.
*/
- if (result != ISC_R_SUCCESS) {
+ if (result != ISC_R_SUCCESS && !create) {
result = sdlz->dlzimp->methods->lookup(zonestr, "*",
sdlz->dlzimp->driverarg,
sdlz->dbdata, node);
@@ -566,7 +612,7 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
MAYBE_UNLOCK(sdlz->dlzimp);
- if (result != ISC_R_SUCCESS && !isorigin) {
+ if (result != ISC_R_SUCCESS && !isorigin && !create) {
destroynode(node);
return (result);
}
@@ -584,6 +630,23 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
}
}
+ if (node->name == NULL) {
+ node->name = isc_mem_get(sdlz->common.mctx,
+ sizeof(dns_name_t));
+ if (node->name == NULL) {
+ destroynode(node);
+ return (ISC_R_NOMEMORY);
+ }
+ dns_name_init(node->name, NULL);
+ result = dns_name_dup(name, sdlz->common.mctx, node->name);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(sdlz->common.mctx, node->name,
+ sizeof(dns_name_t));
+ destroynode(node);
+ return (result);
+ }
+ }
+
*nodep = node;
return (ISC_R_SUCCESS);
}
@@ -778,7 +841,7 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
REQUIRE(VALID_SDLZDB(sdlz));
REQUIRE(nodep == NULL || *nodep == NULL);
- REQUIRE(version == NULL || version == (void *) &dummy);
+ REQUIRE(version == NULL || version == (void*)&sdlz->dummy_version);
UNUSED(options);
UNUSED(sdlz);
@@ -920,9 +983,14 @@ static isc_result_t
allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
isc_stdtime_t now, dns_rdatasetiter_t **iteratorp)
{
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *) db;
sdlz_rdatasetiter_t *iterator;
- REQUIRE(version == NULL || version == &dummy);
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ REQUIRE(version == NULL ||
+ version == (void*)&sdlz->dummy_version ||
+ version == sdlz->future_version);
UNUSED(version);
UNUSED(now);
@@ -945,47 +1013,139 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
}
static isc_result_t
+modrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+ dns_rdataset_t *rdataset, unsigned int options,
+ dns_sdlzmodrdataset_t mod_function)
+{
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ dns_master_style_t *style = NULL;
+ isc_result_t result;
+ isc_buffer_t *buffer = NULL;
+ isc_mem_t *mctx;
+ dns_sdlznode_t *sdlznode;
+ char *rdatastr = NULL;
+ char name[DNS_NAME_MAXTEXT + 1];
+
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ if (mod_function == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ sdlznode = (dns_sdlznode_t *)node;
+
+ UNUSED(options);
+
+ dns_name_format(sdlznode->name, name, sizeof(name));
+
+ mctx = sdlz->common.mctx;
+
+ result = isc_buffer_allocate(mctx, &buffer, 1024);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = dns_master_stylecreate(&style, 0, 0, 0, 0, 0, 0, 1, mctx);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_master_rdatasettotext(sdlznode->name, rdataset,
+ style, buffer);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ if (isc_buffer_usedlength(buffer) < 1) {
+ result = ISC_R_BADADDRESSFORM;
+ goto cleanup;
+ }
+
+ rdatastr = isc_buffer_base(buffer);
+ if (rdatastr == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ rdatastr[isc_buffer_usedlength(buffer) - 1] = 0;
+
+ MAYBE_LOCK(sdlz->dlzimp);
+ result = mod_function(name, rdatastr, sdlz->dlzimp->driverarg,
+ sdlz->dbdata, version);
+ MAYBE_UNLOCK(sdlz->dlzimp);
+
+cleanup:
+ isc_buffer_free(&buffer);
+ if (style != NULL)
+ dns_master_styledestroy(&style, mctx);
+
+ return (result);
+}
+
+static isc_result_t
addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
dns_rdataset_t *addedrdataset)
{
- UNUSED(db);
- UNUSED(node);
- UNUSED(version);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ isc_result_t result;
+
UNUSED(now);
- UNUSED(rdataset);
- UNUSED(options);
UNUSED(addedrdataset);
+ REQUIRE(VALID_SDLZDB(sdlz));
- return (ISC_R_NOTIMPLEMENTED);
+ if (sdlz->dlzimp->methods->addrdataset == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ result = modrdataset(db, node, version, rdataset, options,
+ sdlz->dlzimp->methods->addrdataset);
+ return (result);
}
+
static isc_result_t
subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_t *rdataset, unsigned int options,
dns_rdataset_t *newrdataset)
{
- UNUSED(db);
- UNUSED(node);
- UNUSED(version);
- UNUSED(rdataset);
- UNUSED(options);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ isc_result_t result;
+
UNUSED(newrdataset);
+ REQUIRE(VALID_SDLZDB(sdlz));
- return (ISC_R_NOTIMPLEMENTED);
+ if (sdlz->dlzimp->methods->subtractrdataset == NULL) {
+ return (ISC_R_NOTIMPLEMENTED);
+ }
+
+ result = modrdataset(db, node, version, rdataset, options,
+ sdlz->dlzimp->methods->subtractrdataset);
+ return (result);
}
static isc_result_t
deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdatatype_t type, dns_rdatatype_t covers)
{
- UNUSED(db);
- UNUSED(node);
- UNUSED(version);
- UNUSED(type);
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ char name[DNS_NAME_MAXTEXT + 1];
+ char b_type[DNS_RDATATYPE_FORMATSIZE];
+ dns_sdlznode_t *sdlznode;
+ isc_result_t result;
+
UNUSED(covers);
- return (ISC_R_NOTIMPLEMENTED);
+ REQUIRE(VALID_SDLZDB(sdlz));
+
+ if (sdlz->dlzimp->methods->delrdataset == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ sdlznode = (dns_sdlznode_t *)node;
+ dns_name_format(sdlznode->name, name, sizeof(name));
+ dns_rdatatype_format(type, b_type, sizeof(b_type));
+
+ MAYBE_LOCK(sdlz->dlzimp);
+ result = sdlz->dlzimp->methods->delrdataset(name, b_type,
+ sdlz->dlzimp->driverarg,
+ sdlz->dbdata, version);
+ MAYBE_UNLOCK(sdlz->dlzimp);
+
+ return (result);
}
static isc_boolean_t
@@ -1021,6 +1181,26 @@ settask(dns_db_t *db, isc_task_t *task) {
}
+/*
+ * getoriginnode() is used by the update code to find the
+ * dns_rdatatype_dnskey record for a zone
+ */
+static isc_result_t
+getoriginnode(dns_db_t *db, dns_dbnode_t **nodep) {
+ dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;
+ isc_result_t result;
+
+ REQUIRE(VALID_SDLZDB(sdlz));
+ if (sdlz->dlzimp->methods->newversion == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+
+ result = findnode(db, &sdlz->common.origin, ISC_FALSE, nodep);
+ if (result != ISC_R_SUCCESS)
+ sdlz_log(ISC_LOG_ERROR, "sdlz getoriginnode failed : %s",
+ isc_result_totext(result));
+ return (result);
+}
+
static dns_dbmethods_t sdlzdb_methods = {
attach,
detach,
@@ -1049,6 +1229,8 @@ static dns_dbmethods_t sdlzdb_methods = {
ispersistent,
overmem,
settask,
+ getoriginnode,
+ NULL,
NULL,
NULL,
NULL,
@@ -1371,9 +1553,7 @@ dns_sdlzcreate(isc_mem_t *mctx, const char *dlzname, unsigned int argc,
isc_result_t result = ISC_R_NOTFOUND;
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Loading SDLZ driver.");
+ sdlz_log(ISC_LOG_DEBUG(2), "Loading SDLZ driver.");
/*
* Performs checks to make sure data is as we expect it to be.
@@ -1395,13 +1575,9 @@ dns_sdlzcreate(isc_mem_t *mctx, const char *dlzname, unsigned int argc,
/* Write debugging message to log */
if (result == ISC_R_SUCCESS) {
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "SDLZ driver loaded successfully.");
+ sdlz_log(ISC_LOG_DEBUG(2), "SDLZ driver loaded successfully.");
} else {
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_ERROR,
- "SDLZ driver failed to load.");
+ sdlz_log(ISC_LOG_ERROR, "SDLZ driver failed to load.");
}
return (result);
@@ -1414,9 +1590,7 @@ dns_sdlzdestroy(void *driverdata, void **dbdata)
dns_sdlzimplementation_t *imp;
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Unloading SDLZ driver.");
+ sdlz_log(ISC_LOG_DEBUG(2), "Unloading SDLZ driver.");
imp = driverdata;
@@ -1472,11 +1646,97 @@ dns_sdlzfindzone(void *driverarg, void *dbdata, isc_mem_t *mctx,
return (result);
}
+
+static isc_result_t
+dns_sdlzconfigure(void *driverarg, void *dbdata, dns_view_t *view)
+{
+ isc_result_t result;
+ dns_sdlzimplementation_t *imp;
+
+ REQUIRE(driverarg != NULL);
+
+ imp = (dns_sdlzimplementation_t *) driverarg;
+
+ /* Call SDLZ driver's configure method */
+ if (imp->methods->configure != NULL) {
+ MAYBE_LOCK(imp);
+ result = imp->methods->configure(view, imp->driverarg, dbdata);
+ MAYBE_UNLOCK(imp);
+ } else {
+ result = ISC_R_SUCCESS;
+ }
+
+ return (result);
+}
+
+static isc_boolean_t
+dns_sdlzssumatch(dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr,
+ dns_rdatatype_t type, const dst_key_t *key, void *driverarg,
+ void *dbdata)
+{
+ dns_sdlzimplementation_t *imp;
+ char b_signer[DNS_NAME_FORMATSIZE];
+ char b_name[DNS_NAME_FORMATSIZE];
+ char b_addr[ISC_NETADDR_FORMATSIZE];
+ char b_type[DNS_RDATATYPE_FORMATSIZE];
+ char b_key[DST_KEY_FORMATSIZE];
+ isc_buffer_t *tkey_token;
+ isc_region_t token_region;
+ isc_uint32_t token_len = 0;
+ isc_boolean_t ret;
+
+ REQUIRE(driverarg != NULL);
+
+ imp = (dns_sdlzimplementation_t *) driverarg;
+ if (imp->methods->ssumatch == NULL)
+ return (ISC_FALSE);
+
+ /*
+ * Format the request elements. sdlz operates on strings, not
+ * structures
+ */
+ if (signer)
+ dns_name_format(signer, b_signer, sizeof(b_signer));
+ else
+ b_signer[0] = 0;
+
+ dns_name_format(name, b_name, sizeof(b_name));
+
+ if (tcpaddr)
+ isc_netaddr_format(tcpaddr, b_addr, sizeof(b_addr));
+ else
+ b_addr[0] = 0;
+
+ dns_rdatatype_format(type, b_type, sizeof(b_type));
+
+ if (key)
+ dst_key_format(key, b_key, sizeof(b_key));
+ else
+ b_key[0] = 0;
+
+ tkey_token = dst_key_tkeytoken(key);
+
+ if (tkey_token) {
+ isc_buffer_region(tkey_token, &token_region);
+ token_len = token_region.length;
+ }
+
+ MAYBE_LOCK(imp);
+ ret = imp->methods->ssumatch(b_signer, b_name, b_addr, b_type, b_key,
+ token_len,
+ token_len ? token_region.base : NULL,
+ imp->driverarg, dbdata);
+ MAYBE_UNLOCK(imp);
+ return (ret);
+}
+
static dns_dlzmethods_t sdlzmethods = {
dns_sdlzcreate,
dns_sdlzdestroy,
dns_sdlzfindzone,
- dns_sdlzallowzonexfr
+ dns_sdlzallowzonexfr,
+ dns_sdlzconfigure,
+ dns_sdlzssumatch
};
/*
@@ -1530,8 +1790,16 @@ dns_sdlz_putrr(dns_sdlzlookup_t *lookup, const char *type, dns_ttl_t ttl,
ISC_LINK_INIT(rdatalist, link);
ISC_LIST_APPEND(lookup->lists, rdatalist, link);
} else
- if (rdatalist->ttl != ttl)
- return (DNS_R_BADTTL);
+ if (rdatalist->ttl > ttl) {
+ /*
+ * BIND9 doesn't enforce all RRs in an RRset
+ * having the same TTL, as per RFC 2136,
+ * section 7.12. If a DLZ backend has
+ * different TTLs, then the best
+ * we can do is return the lowest.
+ */
+ rdatalist->ttl = ttl;
+ }
rdata = isc_mem_get(mctx, sizeof(dns_rdata_t));
if (rdata == NULL)
@@ -1615,7 +1883,7 @@ dns_sdlz_putnamedrr(dns_sdlzallnodes_t *allnodes, const char *name,
isc_buffer_init(&b, name, strlen(name));
isc_buffer_add(&b, strlen(name));
- result = dns_name_fromtext(newname, &b, origin, ISC_FALSE, NULL);
+ result = dns_name_fromtext(newname, &b, origin, 0, NULL);
if (result != ISC_R_SUCCESS)
return (result);
@@ -1694,9 +1962,7 @@ dns_sdlzregister(const char *drivername, const dns_sdlzmethods_t *methods,
DNS_SDLZFLAG_THREADSAFE)) == 0);
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Registering SDLZ driver '%s'", drivername);
+ sdlz_log(ISC_LOG_DEBUG(2), "Registering SDLZ driver '%s'", drivername);
/*
* Allocate memory for a sdlz_implementation object. Error if
@@ -1769,9 +2035,7 @@ dns_sdlzunregister(dns_sdlzimplementation_t **sdlzimp) {
isc_mem_t *mctx;
/* Write debugging message to log */
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE,
- DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2),
- "Unregistering SDLZ driver.");
+ sdlz_log(ISC_LOG_DEBUG(2), "Unregistering SDLZ driver.");
/*
* Performs checks to make sure data is as we expect it to be.
@@ -1797,3 +2061,16 @@ dns_sdlzunregister(dns_sdlzimplementation_t **sdlzimp) {
*sdlzimp = NULL;
}
+
+
+isc_result_t
+dns_sdlz_setdb(dns_dlzdb_t *dlzdatabase, dns_rdataclass_t rdclass,
+ dns_name_t *name, dns_db_t **dbp)
+{
+ isc_result_t result;
+
+ result = dns_sdlzcreateDBP(dlzdatabase->mctx,
+ dlzdatabase->implementation->driverarg,
+ dlzdatabase->dbdata, name, rdclass, dbp);
+ return (result);
+}
diff --git a/contrib/bind9/lib/dns/soa.c b/contrib/bind9/lib/dns/soa.c
index f338586..bd0d185 100644
--- a/contrib/bind9/lib/dns/soa.c
+++ b/contrib/bind9/lib/dns/soa.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,15 +15,18 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: soa.c,v 1.8 2007-06-19 23:47:16 tbox Exp $ */
+/* $Id: soa.c,v 1.12 2009-09-10 02:18:40 each Exp $ */
/*! \file */
#include <config.h>
+#include <string.h>
+#include <isc/buffer.h>
#include <isc/util.h>
#include <dns/rdata.h>
+#include <dns/rdatastruct.h>
#include <dns/soa.h>
static inline isc_uint32_t
@@ -60,6 +63,39 @@ soa_get(dns_rdata_t *rdata, int offset) {
return (decode_uint32(rdata->data + rdata->length - 20 + offset));
}
+isc_result_t
+dns_soa_buildrdata(dns_name_t *origin, dns_name_t *contact,
+ dns_rdataclass_t rdclass,
+ isc_uint32_t serial, isc_uint32_t refresh,
+ isc_uint32_t retry, isc_uint32_t expire,
+ isc_uint32_t minimum, unsigned char *buffer,
+ dns_rdata_t *rdata) {
+ dns_rdata_soa_t soa;
+ isc_buffer_t rdatabuf;
+
+ REQUIRE(origin != NULL);
+ REQUIRE(contact != NULL);
+
+ memset(buffer, 0, DNS_SOA_BUFFERSIZE);
+ isc_buffer_init(&rdatabuf, buffer, DNS_SOA_BUFFERSIZE);
+
+ soa.common.rdtype = dns_rdatatype_soa;
+ soa.common.rdclass = rdclass;
+ soa.mctx = NULL;
+ soa.serial = serial;
+ soa.refresh = refresh;
+ soa.retry = retry;
+ soa.expire = expire;
+ soa.minimum = minimum;
+ dns_name_init(&soa.origin, NULL);
+ dns_name_clone(origin, &soa.origin);
+ dns_name_init(&soa.contact, NULL);
+ dns_name_clone(contact, &soa.contact);
+
+ return (dns_rdata_fromstruct(rdata, rdclass, dns_rdatatype_soa,
+ &soa, &rdatabuf));
+}
+
isc_uint32_t
dns_soa_getserial(dns_rdata_t *rdata) {
return soa_get(rdata, 0);
diff --git a/contrib/bind9/lib/dns/spnego.c b/contrib/bind9/lib/dns/spnego.c
index ad15331..5ad492c 100644
--- a/contrib/bind9/lib/dns/spnego.c
+++ b/contrib/bind9/lib/dns/spnego.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2006-2011 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: spnego.c,v 1.8.118.4 2009-07-21 07:27:13 marka Exp $ */
+/* $Id: spnego.c,v 1.16 2011-01-11 23:47:13 tbox Exp $ */
/*! \file
* \brief
@@ -172,6 +172,8 @@
/* asn1_err.h */
/* Generated from ../../../lib/asn1/asn1_err.et */
+#ifndef ERROR_TABLE_BASE_asn1
+/* these may be brought in already via gssapi_krb5.h */
typedef enum asn1_error_number {
ASN1_BAD_TIMEFORMAT = 1859794432,
ASN1_MISSING_FIELD = 1859794433,
@@ -186,6 +188,7 @@ typedef enum asn1_error_number {
} asn1_error_number;
#define ERROR_TABLE_BASE_asn1 1859794432
+#endif
#define __asn1_common_definitions__
@@ -409,7 +412,7 @@ code_NegTokenArg(OM_uint32 * minor_status,
{
OM_uint32 ret;
u_char *buf;
- size_t buf_size, buf_len;
+ size_t buf_size, buf_len = 0;
buf_size = 1024;
buf = malloc(buf_size);
diff --git a/contrib/bind9/lib/dns/ssu.c b/contrib/bind9/lib/dns/ssu.c
index 128071c..eb13551 100644
--- a/contrib/bind9/lib/dns/ssu.c
+++ b/contrib/bind9/lib/dns/ssu.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -17,7 +17,7 @@
/*! \file */
/*
- * $Id: ssu.c,v 1.34 2008-01-18 23:46:58 tbox Exp $
+ * $Id: ssu.c,v 1.38 2011-01-06 23:47:00 tbox Exp $
* Principal Author: Brian Wellington
*/
@@ -30,11 +30,13 @@
#include <isc/string.h>
#include <isc/util.h>
+#include <dns/dlz.h>
#include <dns/fixedname.h>
#include <dns/name.h>
#include <dns/ssu.h>
#include <dst/gssapi.h>
+#include <dst/dst.h>
#define SSUTABLEMAGIC ISC_MAGIC('S', 'S', 'U', 'T')
#define VALID_SSUTABLE(table) ISC_MAGIC_VALID(table, SSUTABLEMAGIC)
@@ -59,6 +61,7 @@ struct dns_ssutable {
isc_mem_t *mctx;
unsigned int references;
isc_mutex_t lock;
+ dns_dlzdb_t *dlzdatabase;
ISC_LIST(dns_ssurule_t) rules;
};
@@ -345,7 +348,8 @@ stf_from_address(dns_name_t *stfself, isc_netaddr_t *tcpaddr) {
isc_boolean_t
dns_ssutable_checkrules(dns_ssutable_t *table, dns_name_t *signer,
dns_name_t *name, isc_netaddr_t *tcpaddr,
- dns_rdatatype_t type)
+ dns_rdatatype_t type,
+ const dst_key_t *key)
{
dns_ssurule_t *rule;
unsigned int i;
@@ -483,10 +487,27 @@ dns_ssutable_checkrules(dns_ssutable_t *table, dns_name_t *signer,
if (!dns_name_equal(stfself, name))
continue;
break;
+ case DNS_SSUMATCHTYPE_EXTERNAL:
+ if (!dns_ssu_external_match(rule->identity, signer,
+ name, tcpaddr, type, key,
+ table->mctx))
+ continue;
+ break;
+ case DNS_SSUMATCHTYPE_DLZ:
+ if (!dns_dlz_ssumatch(table->dlzdatabase, signer,
+ name, tcpaddr, type, key))
+ continue;
+ break;
}
if (rule->ntypes == 0) {
- if (!isusertype(type))
+ /*
+ * If this is a DLZ rule, then the DLZ ssu
+ * checks will have already checked
+ * the type.
+ */
+ if (rule->matchtype != DNS_SSUMATCHTYPE_DLZ &&
+ !isusertype(type))
continue;
} else {
for (i = 0; i < rule->ntypes; i++) {
@@ -550,3 +571,42 @@ dns_ssutable_nextrule(dns_ssurule_t *rule, dns_ssurule_t **nextrule) {
*nextrule = ISC_LIST_NEXT(rule, link);
return (*nextrule != NULL ? ISC_R_SUCCESS : ISC_R_NOMORE);
}
+
+/*
+ * Create a specialised SSU table that points at an external DLZ database
+ */
+isc_result_t
+dns_ssutable_createdlz(isc_mem_t *mctx, dns_ssutable_t **tablep,
+ dns_dlzdb_t *dlzdatabase)
+{
+ isc_result_t result;
+ dns_ssurule_t *rule;
+ dns_ssutable_t *table = NULL;
+
+ REQUIRE(tablep != NULL && *tablep == NULL);
+
+ result = dns_ssutable_create(mctx, &table);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ table->dlzdatabase = dlzdatabase;
+
+ rule = isc_mem_get(table->mctx, sizeof(dns_ssurule_t));
+ if (rule == NULL) {
+ dns_ssutable_detach(&table);
+ return (ISC_R_NOMEMORY);
+ }
+
+ rule->identity = NULL;
+ rule->name = NULL;
+ rule->types = NULL;
+ rule->grant = ISC_TRUE;
+ rule->matchtype = DNS_SSUMATCHTYPE_DLZ;
+ rule->ntypes = 0;
+ rule->types = NULL;
+ rule->magic = SSURULEMAGIC;
+
+ ISC_LIST_INITANDAPPEND(table->rules, rule, link);
+ *tablep = table;
+ return (ISC_R_SUCCESS);
+}
diff --git a/contrib/bind9/lib/dns/ssu_external.c b/contrib/bind9/lib/dns/ssu_external.c
new file mode 100644
index 0000000..ac72a1f
--- /dev/null
+++ b/contrib/bind9/lib/dns/ssu_external.c
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: ssu_external.c,v 1.7 2011-01-13 07:05:57 marka Exp $ */
+
+/*
+ * This implements external update-policy rules. This allows permission
+ * to update a zone to be checked by consulting an external daemon (e.g.,
+ * kerberos).
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <unistd.h>
+
+#ifdef ISC_PLATFORM_HAVESYSUNH
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif
+
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/netaddr.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/util.h>
+#include <isc/strerror.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/ssu.h>
+#include <dns/log.h>
+#include <dns/rdatatype.h>
+
+#include <dst/dst.h>
+
+
+static void
+ssu_e_log(int level, const char *fmt, ...) {
+ va_list ap;
+
+ va_start(ap, fmt);
+ isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_SECURITY,
+ DNS_LOGMODULE_ZONE, ISC_LOG_DEBUG(level), fmt, ap);
+ va_end(ap);
+}
+
+
+/*
+ * Connect to a UNIX domain socket.
+ */
+static int
+ux_socket_connect(const char *path) {
+ int fd = -1;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ struct sockaddr_un addr;
+
+ REQUIRE(path != NULL);
+
+ if (strlen(path) > sizeof(addr.sun_path)) {
+ ssu_e_log(3, "ssu_external: socket path '%s' "
+ "longer than system maximum %u",
+ path, sizeof(addr.sun_path));
+ return (-1);
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, path, sizeof(addr.sun_path));
+
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd == -1) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to create socket - %s",
+ strbuf);
+ return (-1);
+ }
+
+ if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to connect to "
+ "socket '%s' - %s",
+ path, strbuf);
+ close(fd);
+ return (-1);
+ }
+#endif
+ return (fd);
+}
+
+/* Change this version if you update the format of the request */
+#define SSU_EXTERNAL_VERSION 1
+
+/*
+ * Perform an update-policy rule check against an external application
+ * over a socket.
+ *
+ * This currently only supports local: for unix domain datagram sockets.
+ *
+ * Note that by using a datagram socket and creating a new socket each
+ * time we avoid the need for locking and allow for parallel access to
+ * the authorization server.
+ */
+isc_boolean_t
+dns_ssu_external_match(dns_name_t *identity,
+ dns_name_t *signer, dns_name_t *name,
+ isc_netaddr_t *tcpaddr, dns_rdatatype_t type,
+ const dst_key_t *key, isc_mem_t *mctx)
+{
+ char b_identity[DNS_NAME_FORMATSIZE];
+ char b_signer[DNS_NAME_FORMATSIZE];
+ char b_name[DNS_NAME_FORMATSIZE];
+ char b_addr[ISC_NETADDR_FORMATSIZE];
+ char b_type[DNS_RDATATYPE_FORMATSIZE];
+ char b_key[DST_KEY_FORMATSIZE];
+ isc_buffer_t *tkey_token;
+ int fd;
+ const char *sock_path;
+ size_t req_len;
+ isc_region_t token_region;
+ unsigned char *data;
+ isc_buffer_t buf;
+ isc_uint32_t token_len = 0;
+ isc_uint32_t reply;
+ ssize_t ret;
+
+ /* The identity contains local:/path/to/socket */
+ dns_name_format(identity, b_identity, sizeof(b_identity));
+
+ /* For now only local: is supported */
+ if (strncmp(b_identity, "local:", 6) != 0) {
+ ssu_e_log(3, "ssu_external: invalid socket path '%s'",
+ b_identity);
+ return (ISC_FALSE);
+ }
+ sock_path = &b_identity[6];
+
+ fd = ux_socket_connect(sock_path);
+ if (fd == -1)
+ return (ISC_FALSE);
+
+ tkey_token = dst_key_tkeytoken(key);
+
+ /* Format the request elements */
+ if (signer)
+ dns_name_format(signer, b_signer, sizeof(b_signer));
+ else
+ b_signer[0] = 0;
+
+ dns_name_format(name, b_name, sizeof(b_name));
+
+ if (tcpaddr)
+ isc_netaddr_format(tcpaddr, b_addr, sizeof(b_addr));
+ else
+ b_addr[0] = 0;
+
+ dns_rdatatype_format(type, b_type, sizeof(b_type));
+
+ if (key)
+ dst_key_format(key, b_key, sizeof(b_key));
+ else
+ b_key[0] = 0;
+
+ if (tkey_token) {
+ isc_buffer_region(tkey_token, &token_region);
+ token_len = token_region.length;
+ }
+
+ /* Work out how big the request will be */
+ req_len = sizeof(isc_uint32_t) + /* Format version */
+ sizeof(isc_uint32_t) + /* Length */
+ strlen(b_signer) + 1 + /* Signer */
+ strlen(b_name) + 1 + /* Name */
+ strlen(b_addr) + 1 + /* Address */
+ strlen(b_type) + 1 + /* Type */
+ strlen(b_key) + 1 + /* Key */
+ sizeof(isc_uint32_t) + /* tkey_token length */
+ token_len; /* tkey_token */
+
+
+ /* format the buffer */
+ data = isc_mem_allocate(mctx, req_len);
+ if (data == NULL) {
+ close(fd);
+ return (ISC_FALSE);
+ }
+
+ isc_buffer_init(&buf, data, req_len);
+ isc_buffer_putuint32(&buf, SSU_EXTERNAL_VERSION);
+ isc_buffer_putuint32(&buf, req_len);
+
+ /* Strings must be null-terminated */
+ isc_buffer_putstr(&buf, b_signer);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_name);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_addr);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_type);
+ isc_buffer_putuint8(&buf, 0);
+ isc_buffer_putstr(&buf, b_key);
+ isc_buffer_putuint8(&buf, 0);
+
+ isc_buffer_putuint32(&buf, token_len);
+ if (tkey_token && token_len != 0)
+ isc_buffer_putmem(&buf, token_region.base, token_len);
+
+ ENSURE(isc_buffer_availablelength(&buf) == 0);
+
+ /* Send the request */
+ ret = write(fd, data, req_len);
+ isc_mem_free(mctx, data);
+ if (ret != (ssize_t) req_len) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to send request - %s",
+ strbuf);
+ close(fd);
+ return (ISC_FALSE);
+ }
+
+ /* Receive the reply */
+ ret = read(fd, &reply, sizeof(isc_uint32_t));
+ if (ret != (ssize_t) sizeof(isc_uint32_t)) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ ssu_e_log(3, "ssu_external: unable to receive reply - %s",
+ strbuf);
+ close(fd);
+ return (ISC_FALSE);
+ }
+
+ close(fd);
+
+ reply = ntohl(reply);
+
+ if (reply == 0) {
+ ssu_e_log(3, "ssu_external: denied external auth for '%s'",
+ b_name);
+ return (ISC_FALSE);
+ } else if (reply == 1) {
+ ssu_e_log(3, "ssu_external: allowed external auth for '%s'",
+ b_name);
+ return (ISC_TRUE);
+ }
+
+ ssu_e_log(3, "ssu_external: invalid reply 0x%08x", reply);
+
+ return (ISC_FALSE);
+}
diff --git a/contrib/bind9/lib/dns/stats.c b/contrib/bind9/lib/dns/stats.c
index b73a3b3..cb46bf5 100644
--- a/contrib/bind9/lib/dns/stats.c
+++ b/contrib/bind9/lib/dns/stats.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.c,v 1.16.118.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.c,v 1.18 2009-01-27 23:47:54 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/time.c b/contrib/bind9/lib/dns/time.c
index bd8cdc3..3f55f19 100644
--- a/contrib/bind9/lib/dns/time.c
+++ b/contrib/bind9/lib/dns/time.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: time.c,v 1.31.332.4 2010-04-21 23:48:05 tbox Exp $ */
+/* $Id: time.c,v 1.35 2010-04-21 23:51:22 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/dns/tkey.c b/contrib/bind9/lib/dns/tkey.c
index 7107dd5..a861ee3 100644
--- a/contrib/bind9/lib/dns/tkey.c
+++ b/contrib/bind9/lib/dns/tkey.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: tkey.c,v 1.90.118.4 2010-12-09 01:12:55 marka Exp $
+ * $Id: tkey.c,v 1.100 2011-01-08 23:47:01 tbox Exp $
*/
/*! \file */
#include <config.h>
@@ -99,6 +99,7 @@ dns_tkeyctx_create(isc_mem_t *mctx, isc_entropy_t *ectx, dns_tkeyctx_t **tctxp)
tctx->dhkey = NULL;
tctx->domain = NULL;
tctx->gsscred = NULL;
+ tctx->gssapi_keytab = NULL;
*tctxp = tctx;
return (ISC_R_SUCCESS);
@@ -121,6 +122,9 @@ dns_tkeyctx_destroy(dns_tkeyctx_t **tctxp) {
dns_name_free(tctx->domain, mctx);
isc_mem_put(mctx, tctx->domain, sizeof(dns_name_t));
}
+ if (tctx->gssapi_keytab != NULL) {
+ isc_mem_free(mctx, tctx->gssapi_keytab);
+ }
if (tctx->gsscred != NULL)
dst_gssapi_releasecred(&tctx->gsscred);
isc_entropy_detach(&tctx->ectx);
@@ -430,8 +434,17 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin,
isc_buffer_t *outtoken = NULL;
gss_ctx_id_t gss_ctx = NULL;
- if (tctx->gsscred == NULL)
+ /*
+ * You have to define either a gss credential (principal) to
+ * accept with tkey-gssapi-credential, or you have to
+ * configure a specific keytab (with tkey-gssapi-keytab) in
+ * order to use gsstkey
+ */
+ if (tctx->gsscred == NULL && tctx->gssapi_keytab == NULL) {
+ tkey_log("process_gsstkey(): no tkey-gssapi-credential "
+ "or tkey-gssapi-keytab configured");
return (ISC_R_NOPERM);
+ }
if (!dns_name_equal(&tkeyin->algorithm, DNS_TSIG_GSSAPI_NAME) &&
!dns_name_equal(&tkeyin->algorithm, DNS_TSIG_GSSAPIMS_NAME)) {
@@ -454,7 +467,11 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin,
dns_fixedname_init(&principal);
- result = dst_gssapi_acceptctx(tctx->gsscred, &intoken,
+ /*
+ * Note that tctx->gsscred may be NULL if tctx->gssapi_keytab is set
+ */
+ result = dst_gssapi_acceptctx(tctx->gsscred, tctx->gssapi_keytab,
+ &intoken,
&outtoken, &gss_ctx,
dns_fixedname_name(&principal),
tctx->mctx);
@@ -479,7 +496,8 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin,
#endif
isc_uint32_t expire;
- RETERR(dst_key_fromgssapi(name, gss_ctx, ring->mctx, &dstkey));
+ RETERR(dst_key_fromgssapi(name, gss_ctx, ring->mctx,
+ &dstkey, &intoken));
/*
* Limit keys to 1 hour or the context's lifetime whichever
* is smaller.
@@ -734,8 +752,7 @@ dns_tkey_processquery(dns_message_t *msg, dns_tkeyctx_t *tctx,
}
isc_buffer_init(&b, randomtext, sizeof(randomtext));
isc_buffer_add(&b, sizeof(randomtext));
- result = dns_name_fromtext(keyname, &b, NULL,
- ISC_FALSE, NULL);
+ result = dns_name_fromtext(keyname, &b, NULL, 0, NULL);
if (result != ISC_R_SUCCESS)
goto failure;
}
@@ -985,7 +1002,8 @@ dns_tkey_builddhquery(dns_message_t *msg, dst_key_t *key, dns_name_t *name,
isc_result_t
dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
isc_buffer_t *intoken, isc_uint32_t lifetime,
- gss_ctx_id_t *context, isc_boolean_t win2k)
+ gss_ctx_id_t *context, isc_boolean_t win2k,
+ isc_mem_t *mctx, char **err_message)
{
dns_rdata_tkey_t tkey;
isc_result_t result;
@@ -999,9 +1017,11 @@ dns_tkey_buildgssquery(dns_message_t *msg, dns_name_t *name, dns_name_t *gname,
REQUIRE(name != NULL);
REQUIRE(gname != NULL);
REQUIRE(context != NULL);
+ REQUIRE(mctx != NULL);
isc_buffer_init(&token, array, sizeof(array));
- result = dst_gssapi_initctx(gname, NULL, &token, context);
+ result = dst_gssapi_initctx(gname, NULL, &token, context,
+ mctx, err_message);
if (result != DNS_R_CONTINUE && result != ISC_R_SUCCESS)
return (result);
@@ -1218,7 +1238,7 @@ isc_result_t
dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *gname, gss_ctx_id_t *context,
isc_buffer_t *outtoken, dns_tsigkey_t **outkey,
- dns_tsig_keyring_t *ring)
+ dns_tsig_keyring_t *ring, char **err_message)
{
dns_rdata_t rtkeyrdata = DNS_RDATA_INIT, qtkeyrdata = DNS_RDATA_INIT;
dns_name_t *tkeyname;
@@ -1232,6 +1252,7 @@ dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
REQUIRE(qmsg != NULL);
REQUIRE(rmsg != NULL);
REQUIRE(gname != NULL);
+ REQUIRE(ring != NULL);
if (outkey != NULL)
REQUIRE(*outkey == NULL);
@@ -1268,10 +1289,11 @@ dns_tkey_processgssresponse(dns_message_t *qmsg, dns_message_t *rmsg,
isc_buffer_init(outtoken, array, sizeof(array));
isc_buffer_init(&intoken, rtkey.key, rtkey.keylen);
- RETERR(dst_gssapi_initctx(gname, &intoken, outtoken, context));
+ RETERR(dst_gssapi_initctx(gname, &intoken, outtoken, context,
+ ring->mctx, err_message));
RETERR(dst_key_fromgssapi(dns_rootname, *context, rmsg->mctx,
- &dstkey));
+ &dstkey, NULL));
RETERR(dns_tsigkey_createfromkey(tkeyname, DNS_TSIG_GSSAPI_NAME,
dstkey, ISC_FALSE, NULL,
@@ -1349,7 +1371,7 @@ isc_result_t
dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
dns_name_t *server, gss_ctx_id_t *context,
dns_tsigkey_t **outkey, dns_tsig_keyring_t *ring,
- isc_boolean_t win2k)
+ isc_boolean_t win2k, char **err_message)
{
dns_rdata_t rtkeyrdata = DNS_RDATA_INIT, qtkeyrdata = DNS_RDATA_INIT;
dns_name_t *tkeyname;
@@ -1393,12 +1415,13 @@ dns_tkey_gssnegotiate(dns_message_t *qmsg, dns_message_t *rmsg,
isc_buffer_init(&intoken, rtkey.key, rtkey.keylen);
isc_buffer_init(&outtoken, array, sizeof(array));
- result = dst_gssapi_initctx(server, &intoken, &outtoken, context);
+ result = dst_gssapi_initctx(server, &intoken, &outtoken, context,
+ ring->mctx, err_message);
if (result != DNS_R_CONTINUE && result != ISC_R_SUCCESS)
return (result);
RETERR(dst_key_fromgssapi(dns_rootname, *context, rmsg->mctx,
- &dstkey));
+ &dstkey, NULL));
/*
* XXXSRA This seems confused. If we got CONTINUE from initctx,
diff --git a/contrib/bind9/lib/dns/tsec.c b/contrib/bind9/lib/dns/tsec.c
new file mode 100644
index 0000000..b7ed777
--- /dev/null
+++ b/contrib/bind9/lib/dns/tsec.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: tsec.c,v 1.7 2010-12-09 00:54:34 marka Exp $ */
+
+#include <config.h>
+
+#include <isc/mem.h>
+
+#include <dns/tsec.h>
+#include <dns/tsig.h>
+#include <dns/result.h>
+
+#include <dst/dst.h>
+
+#define DNS_TSEC_MAGIC ISC_MAGIC('T', 's', 'e', 'c')
+#define DNS_TSEC_VALID(t) ISC_MAGIC_VALID(t, DNS_TSEC_MAGIC)
+
+/*%
+ * DNS Transaction Security object. We assume this is not shared by
+ * multiple threads, and so the structure does not contain a lock.
+ */
+struct dns_tsec {
+ unsigned int magic;
+ dns_tsectype_t type;
+ isc_mem_t *mctx;
+ union {
+ dns_tsigkey_t *tsigkey;
+ dst_key_t *key;
+ } ukey;
+};
+
+isc_result_t
+dns_tsec_create(isc_mem_t *mctx, dns_tsectype_t type, dst_key_t *key,
+ dns_tsec_t **tsecp)
+{
+ isc_result_t result;
+ dns_tsec_t *tsec;
+ dns_tsigkey_t *tsigkey = NULL;
+ dns_name_t *algname;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(tsecp != NULL && *tsecp == NULL);
+
+ tsec = isc_mem_get(mctx, sizeof(*tsec));
+ if (tsec == NULL)
+ return (ISC_R_NOMEMORY);
+
+ tsec->type = type;
+ tsec->mctx = mctx;
+
+ switch (type) {
+ case dns_tsectype_tsig:
+ switch (dst_key_alg(key)) {
+ case DST_ALG_HMACMD5:
+ algname = dns_tsig_hmacmd5_name;
+ break;
+ case DST_ALG_HMACSHA1:
+ algname = dns_tsig_hmacsha1_name;
+ break;
+ case DST_ALG_HMACSHA224:
+ algname = dns_tsig_hmacsha224_name;
+ break;
+ case DST_ALG_HMACSHA256:
+ algname = dns_tsig_hmacsha256_name;
+ break;
+ case DST_ALG_HMACSHA384:
+ algname = dns_tsig_hmacsha384_name;
+ break;
+ case DST_ALG_HMACSHA512:
+ algname = dns_tsig_hmacsha512_name;
+ break;
+ default:
+ isc_mem_put(mctx, tsec, sizeof(*tsec));
+ return (DNS_R_BADALG);
+ }
+ result = dns_tsigkey_createfromkey(dst_key_name(key),
+ algname, key, ISC_FALSE,
+ NULL, 0, 0, mctx, NULL,
+ &tsigkey);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, tsec, sizeof(*tsec));
+ return (result);
+ }
+ tsec->ukey.tsigkey = tsigkey;
+ break;
+ case dns_tsectype_sig0:
+ tsec->ukey.key = key;
+ break;
+ default:
+ INSIST(0);
+ }
+
+ tsec->magic = DNS_TSEC_MAGIC;
+
+ *tsecp = tsec;
+ return (ISC_R_SUCCESS);
+}
+
+void
+dns_tsec_destroy(dns_tsec_t **tsecp) {
+ dns_tsec_t *tsec;
+
+ REQUIRE(tsecp != NULL && *tsecp != NULL);
+ tsec = *tsecp;
+ REQUIRE(DNS_TSEC_VALID(tsec));
+
+ switch (tsec->type) {
+ case dns_tsectype_tsig:
+ dns_tsigkey_detach(&tsec->ukey.tsigkey);
+ break;
+ case dns_tsectype_sig0:
+ dst_key_free(&tsec->ukey.key);
+ break;
+ default:
+ INSIST(0);
+ }
+
+ tsec->magic = 0;
+ isc_mem_put(tsec->mctx, tsec, sizeof(*tsec));
+
+ *tsecp = NULL;
+}
+
+dns_tsectype_t
+dns_tsec_gettype(dns_tsec_t *tsec) {
+ REQUIRE(DNS_TSEC_VALID(tsec));
+
+ return (tsec->type);
+}
+
+void
+dns_tsec_getkey(dns_tsec_t *tsec, void *keyp) {
+ REQUIRE(DNS_TSEC_VALID(tsec));
+ REQUIRE(keyp != NULL);
+
+ switch (tsec->type) {
+ case dns_tsectype_tsig:
+ dns_tsigkey_attach(tsec->ukey.tsigkey, (dns_tsigkey_t **)keyp);
+ break;
+ case dns_tsectype_sig0:
+ *(dst_key_t **)keyp = tsec->ukey.key;
+ break;
+ default:
+ INSIST(0);
+ }
+}
diff --git a/contrib/bind9/lib/dns/tsig.c b/contrib/bind9/lib/dns/tsig.c
index 65d32dc..cec5222 100644
--- a/contrib/bind9/lib/dns/tsig.c
+++ b/contrib/bind9/lib/dns/tsig.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: tsig.c,v 1.136.18.5 2010-12-09 01:12:55 marka Exp $
+ * $Id: tsig.c,v 1.147 2011-01-11 23:47:13 tbox Exp $
*/
/*! \file */
#include <config.h>
@@ -91,31 +91,6 @@ static dns_name_t gsstsig = {
};
LIBDNS_EXTERNAL_DATA dns_name_t *dns_tsig_gssapi_name = &gsstsig;
-static void
-remove_fromring(dns_tsigkey_t *tkey) {
- if (tkey->generated) {
- ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
- tkey->ring->generated--;
- }
- (void)dns_rbt_deletename(tkey->ring->keys, &tkey->name, ISC_FALSE);
-}
-
-static void
-adjust_lru(dns_tsigkey_t *tkey) {
- if (tkey->generated) {
- RWLOCK(&tkey->ring->lock, isc_rwlocktype_write);
- /*
- * We may have been removed from the LRU list between
- * removing the read lock and aquiring the write lock.
- */
- if (ISC_LINK_LINKED(tkey, link)) {
- ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
- ISC_LIST_APPEND(tkey->ring->lru, tkey, link);
- }
- RWUNLOCK(&tkey->ring->lock, isc_rwlocktype_write);
- }
-}
-
/*
* Since Microsoft doesn't follow its own standard, we will use this
* alternate name as a second guess.
@@ -228,8 +203,10 @@ tsig_log(dns_tsigkey_t *key, int level, const char *fmt, ...) {
else
strcpy(namestr, "<null>");
- if (key != NULL && key->generated)
+ if (key != NULL && key->generated && key->creator)
dns_name_format(key->creator, creatorstr, sizeof(creatorstr));
+ else
+ strcpy(creatorstr, "<null>");
va_start(ap, fmt);
vsnprintf(message, sizeof(message), fmt, ap);
@@ -245,6 +222,71 @@ tsig_log(dns_tsigkey_t *key, int level, const char *fmt, ...) {
level, "tsig key '%s': %s", namestr, message);
}
+static void
+remove_fromring(dns_tsigkey_t *tkey) {
+ if (tkey->generated) {
+ ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
+ tkey->ring->generated--;
+ }
+ (void)dns_rbt_deletename(tkey->ring->keys, &tkey->name, ISC_FALSE);
+}
+
+static void
+adjust_lru(dns_tsigkey_t *tkey) {
+ if (tkey->generated) {
+ RWLOCK(&tkey->ring->lock, isc_rwlocktype_write);
+ /*
+ * We may have been removed from the LRU list between
+ * removing the read lock and aquiring the write lock.
+ */
+ if (ISC_LINK_LINKED(tkey, link)) {
+ ISC_LIST_UNLINK(tkey->ring->lru, tkey, link);
+ ISC_LIST_APPEND(tkey->ring->lru, tkey, link);
+ }
+ RWUNLOCK(&tkey->ring->lock, isc_rwlocktype_write);
+ }
+}
+
+/*
+ * A supplemental routine just to add a key to ring. Note that reference
+ * counter should be counted separately because we may be adding the key
+ * as part of creation of the key, in which case the reference counter was
+ * already initialized. Also note we don't need RWLOCK for the reference
+ * counter: it's protected by a separate lock.
+ */
+static isc_result_t
+keyring_add(dns_tsig_keyring_t *ring, dns_name_t *name,
+ dns_tsigkey_t *tkey)
+{
+ isc_result_t result;
+
+ RWLOCK(&ring->lock, isc_rwlocktype_write);
+ ring->writecount++;
+
+ /*
+ * Do on the fly cleaning. Find some nodes we might not
+ * want around any more.
+ */
+ if (ring->writecount > 10) {
+ cleanup_ring(ring);
+ ring->writecount = 0;
+ }
+
+ result = dns_rbt_addname(ring->keys, name, tkey);
+ if (tkey->generated) {
+ /*
+ * Add the new key to the LRU list and remove the least
+ * recently used key if there are too many keys on the list.
+ */
+ ISC_LIST_INITANDAPPEND(ring->lru, tkey, link);
+ if (ring->generated++ > ring->maxgenerated)
+ remove_fromring(ISC_LIST_HEAD(ring->lru));
+ }
+ RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+
+ return (result);
+}
+
isc_result_t
dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
dst_key_t *dstkey, isc_boolean_t generated,
@@ -363,7 +405,7 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
tkey->ring = ring;
if (key != NULL)
- refs++;
+ refs = 1;
if (ring != NULL)
refs++;
ret = isc_refcount_init(&tkey->refs, refs);
@@ -379,36 +421,9 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
tkey->magic = TSIG_MAGIC;
if (ring != NULL) {
- RWLOCK(&ring->lock, isc_rwlocktype_write);
- ring->writecount++;
-
- /*
- * Do on the fly cleaning. Find some nodes we might not
- * want around any more.
- */
- if (ring->writecount > 10) {
- cleanup_ring(ring);
- ring->writecount = 0;
- }
-
- ret = dns_rbt_addname(ring->keys, name, tkey);
- if (ret != ISC_R_SUCCESS) {
- RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+ ret = keyring_add(ring, name, tkey);
+ if (ret != ISC_R_SUCCESS)
goto cleanup_refs;
- }
-
- if (tkey->generated) {
- /*
- * Add the new key to the LRU list and remove the
- * least recently used key if there are too many
- * keys on the list.
- */
- ISC_LIST_INITANDAPPEND(ring->lru, tkey, link);
- if (ring->generated++ > ring->maxgenerated)
- remove_fromring(ISC_LIST_HEAD(ring->lru));
- }
-
- RWUNLOCK(&ring->lock, isc_rwlocktype_write);
}
/*
@@ -424,6 +439,7 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm,
"the key '%s' is too short to be secure",
namestr);
}
+
if (key != NULL)
*key = tkey;
@@ -512,6 +528,184 @@ cleanup_ring(dns_tsig_keyring_t *ring)
}
}
+static void
+destroyring(dns_tsig_keyring_t *ring) {
+ dns_rbt_destroy(&ring->keys);
+ isc_rwlock_destroy(&ring->lock);
+ isc_mem_putanddetach(&ring->mctx, ring, sizeof(dns_tsig_keyring_t));
+}
+
+static unsigned int
+dst_alg_fromname(dns_name_t *algorithm) {
+ if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME)) {
+ return (DST_ALG_HMACMD5);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA1_NAME)) {
+ return (DST_ALG_HMACSHA1);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA224_NAME)) {
+ return (DST_ALG_HMACSHA224);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA256_NAME)) {
+ return (DST_ALG_HMACSHA256);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA384_NAME)) {
+ return (DST_ALG_HMACSHA384);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_HMACSHA512_NAME)) {
+ return (DST_ALG_HMACSHA512);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_GSSAPI_NAME)) {
+ return (DST_ALG_GSSAPI);
+ } else if (dns_name_equal(algorithm, DNS_TSIG_GSSAPIMS_NAME)) {
+ return (DST_ALG_GSSAPI);
+ } else
+ return (0);
+}
+
+static isc_result_t
+restore_key(dns_tsig_keyring_t *ring, isc_stdtime_t now, FILE *fp) {
+ dst_key_t *dstkey = NULL;
+ char namestr[1024];
+ char creatorstr[1024];
+ char algorithmstr[1024];
+ char keystr[4096];
+ unsigned int inception, expire;
+ int n;
+ isc_buffer_t b;
+ dns_name_t *name, *creator, *algorithm;
+ dns_fixedname_t fname, fcreator, falgorithm;
+ isc_result_t result;
+ unsigned int dstalg;
+
+ n = fscanf(fp, "%1023s %1023s %u %u %1023s %4095s\n", namestr,
+ creatorstr, &inception, &expire, algorithmstr, keystr);
+ if (n == EOF)
+ return (ISC_R_NOMORE);
+ if (n != 6)
+ return (ISC_R_FAILURE);
+
+ if (isc_serial_lt(expire, now))
+ return (DNS_R_EXPIRED);
+
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ isc_buffer_init(&b, namestr, strlen(namestr));
+ isc_buffer_add(&b, strlen(namestr));
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_fixedname_init(&fcreator);
+ creator = dns_fixedname_name(&fcreator);
+ isc_buffer_init(&b, creatorstr, strlen(creatorstr));
+ isc_buffer_add(&b, strlen(creatorstr));
+ result = dns_name_fromtext(creator, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dns_fixedname_init(&falgorithm);
+ algorithm = dns_fixedname_name(&falgorithm);
+ isc_buffer_init(&b, algorithmstr, strlen(algorithmstr));
+ isc_buffer_add(&b, strlen(algorithmstr));
+ result = dns_name_fromtext(algorithm, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ dstalg = dst_alg_fromname(algorithm);
+ if (dstalg == 0)
+ return (DNS_R_BADALG);
+
+ result = dst_key_restore(name, dstalg, DNS_KEYOWNER_ENTITY,
+ DNS_KEYPROTO_DNSSEC, dns_rdataclass_in,
+ ring->mctx, keystr, &dstkey);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = dns_tsigkey_createfromkey(name, algorithm, dstkey,
+ ISC_TRUE, creator, inception,
+ expire, ring->mctx, ring, NULL);
+ if (result != ISC_R_SUCCESS && dstkey != NULL)
+ dst_key_free(&dstkey);
+ return (result);
+}
+
+static void
+dump_key(dns_tsigkey_t *tkey, FILE *fp)
+{
+ char *buffer = NULL;
+ int length = 0;
+ char namestr[DNS_NAME_FORMATSIZE];
+ char creatorstr[DNS_NAME_FORMATSIZE];
+ char algorithmstr[DNS_NAME_FORMATSIZE];
+ isc_result_t result;
+
+ dns_name_format(&tkey->name, namestr, sizeof(namestr));
+ dns_name_format(tkey->creator, creatorstr, sizeof(creatorstr));
+ dns_name_format(tkey->algorithm, algorithmstr, sizeof(algorithmstr));
+ result = dst_key_dump(tkey->key, tkey->mctx, &buffer, &length);
+ if (result == ISC_R_SUCCESS)
+ fprintf(fp, "%s %s %u %u %s %.*s\n", namestr, creatorstr,
+ tkey->inception, tkey->expire, algorithmstr,
+ length, buffer);
+ if (buffer != NULL)
+ isc_mem_put(tkey->mctx, buffer, length);
+}
+
+isc_result_t
+dns_tsigkeyring_dumpanddetach(dns_tsig_keyring_t **ringp, FILE *fp) {
+ isc_result_t result;
+ dns_rbtnodechain_t chain;
+ dns_name_t foundname;
+ dns_fixedname_t fixedorigin;
+ dns_name_t *origin;
+ isc_stdtime_t now;
+ dns_rbtnode_t *node;
+ dns_tsigkey_t *tkey;
+ dns_tsig_keyring_t *ring;
+ unsigned int references;
+
+ REQUIRE(ringp != NULL && *ringp != NULL);
+
+ ring = *ringp;
+ *ringp = NULL;
+
+ RWLOCK(&ring->lock, isc_rwlocktype_write);
+ INSIST(ring->references > 0);
+ ring->references--;
+ references = ring->references;
+ RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+
+ if (references != 0)
+ return (DNS_R_CONTINUE);
+
+ isc_stdtime_get(&now);
+ dns_name_init(&foundname, NULL);
+ dns_fixedname_init(&fixedorigin);
+ origin = dns_fixedname_name(&fixedorigin);
+ dns_rbtnodechain_init(&chain, ring->mctx);
+ result = dns_rbtnodechain_first(&chain, ring->keys, &foundname,
+ origin);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
+ dns_rbtnodechain_invalidate(&chain);
+ goto destroy;
+ }
+
+ for (;;) {
+ node = NULL;
+ dns_rbtnodechain_current(&chain, &foundname, origin, &node);
+ tkey = node->data;
+ if (tkey != NULL && tkey->generated && tkey->expire >= now)
+ dump_key(tkey, fp);
+ result = dns_rbtnodechain_next(&chain, &foundname,
+ origin);
+ if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
+ dns_rbtnodechain_invalidate(&chain);
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ goto destroy;
+ }
+ }
+
+ destroy:
+ destroyring(ring);
+ return (result);
+}
+
isc_result_t
dns_tsigkey_create(dns_name_t *name, dns_name_t *algorithm,
unsigned char *secret, int length, isc_boolean_t generated,
@@ -1589,14 +1783,43 @@ dns_tsigkeyring_create(isc_mem_t *mctx, dns_tsig_keyring_t **ringp) {
ring->maxgenerated = DNS_TSIG_MAXGENERATEDKEYS;
ISC_LIST_INIT(ring->lru);
isc_mem_attach(mctx, &ring->mctx);
+ ring->references = 1;
*ringp = ring;
return (ISC_R_SUCCESS);
}
+isc_result_t
+dns_tsigkeyring_add(dns_tsig_keyring_t *ring, dns_name_t *name,
+ dns_tsigkey_t *tkey)
+{
+ isc_result_t result;
+
+ result = keyring_add(ring, name, tkey);
+ if (result == ISC_R_SUCCESS)
+ isc_refcount_increment(&tkey->refs, NULL);
+
+ return (result);
+}
+
void
-dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp) {
+dns_tsigkeyring_attach(dns_tsig_keyring_t *source, dns_tsig_keyring_t **target)
+{
+ REQUIRE(source != NULL);
+ REQUIRE(target != NULL && *target == NULL);
+
+ RWLOCK(&source->lock, isc_rwlocktype_write);
+ INSIST(source->references > 0);
+ source->references++;
+ INSIST(source->references > 0);
+ *target = source;
+ RWUNLOCK(&source->lock, isc_rwlocktype_write);
+}
+
+void
+dns_tsigkeyring_detach(dns_tsig_keyring_t **ringp) {
dns_tsig_keyring_t *ring;
+ unsigned int references;
REQUIRE(ringp != NULL);
REQUIRE(*ringp != NULL);
@@ -1604,7 +1827,27 @@ dns_tsigkeyring_destroy(dns_tsig_keyring_t **ringp) {
ring = *ringp;
*ringp = NULL;
- dns_rbt_destroy(&ring->keys);
- isc_rwlock_destroy(&ring->lock);
- isc_mem_putanddetach(&ring->mctx, ring, sizeof(dns_tsig_keyring_t));
+ RWLOCK(&ring->lock, isc_rwlocktype_write);
+ INSIST(ring->references > 0);
+ ring->references--;
+ references = ring->references;
+ RWUNLOCK(&ring->lock, isc_rwlocktype_write);
+
+ if (references == 0)
+ destroyring(ring);
+}
+
+void
+dns_keyring_restore(dns_tsig_keyring_t *ring, FILE *fp) {
+ isc_stdtime_t now;
+ isc_result_t result;
+
+ isc_stdtime_get(&now);
+ do {
+ result = restore_key(ring, now, fp);
+ if (result == ISC_R_NOMORE)
+ return;
+ if (result == DNS_R_BADALG || result == DNS_R_EXPIRED)
+ result = ISC_R_SUCCESS;
+ } while (result == ISC_R_SUCCESS);
}
diff --git a/contrib/bind9/lib/dns/validator.c b/contrib/bind9/lib/dns/validator.c
index 4ecec8d..6c0d38d 100644
--- a/contrib/bind9/lib/dns/validator.c
+++ b/contrib/bind9/lib/dns/validator.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: validator.c,v 1.164.12.23.4.1 2011-05-27 00:19:19 each Exp $ */
+/* $Id: validator.c,v 1.197.40.3 2011-06-21 20:15:54 each Exp $ */
#include <config.h>
@@ -28,17 +28,17 @@
#include <isc/util.h>
#include <dns/db.h>
-#include <dns/ds.h>
#include <dns/dnssec.h>
+#include <dns/ds.h>
#include <dns/events.h>
#include <dns/keytable.h>
+#include <dns/keyvalues.h>
#include <dns/log.h>
#include <dns/message.h>
#include <dns/ncache.h>
#include <dns/nsec.h>
#include <dns/nsec3.h>
#include <dns/rdata.h>
-#include <dns/rdatastruct.h>
#include <dns/rdataset.h>
#include <dns/rdatatype.h>
#include <dns/resolver.h>
@@ -129,6 +129,8 @@
#define SHUTDOWN(v) (((v)->attributes & VALATTR_SHUTDOWN) != 0)
#define CANCELED(v) (((v)->attributes & VALATTR_CANCELED) != 0)
+#define NEGATIVE(r) (((r)->attributes & DNS_RDATASETATTR_NEGATIVE) != 0)
+
static void
destroy(dns_validator_t *val);
@@ -253,9 +255,17 @@ dlv_algorithm_supported(dns_validator_t *val) {
dlv.algorithm))
continue;
+#ifdef HAVE_OPENSSL_GOST
+ if (dlv.digest_type != DNS_DSDIGEST_SHA256 &&
+ dlv.digest_type != DNS_DSDIGEST_SHA1 &&
+ dlv.digest_type != DNS_DSDIGEST_GOST)
+ continue;
+#else
if (dlv.digest_type != DNS_DSDIGEST_SHA256 &&
dlv.digest_type != DNS_DSDIGEST_SHA1)
continue;
+#endif
+
return (ISC_TRUE);
}
@@ -381,7 +391,7 @@ isdelegation(dns_name_t *name, dns_rdataset_t *rdataset,
}
/*%
- * We have been asked to to look for a key.
+ * We have been asked to look for a key.
* If found resume the validation process.
* If not found fail the validation process.
*/
@@ -580,7 +590,8 @@ dsfetched2(isc_task_t *task, isc_event_t *event) {
if (isdelegation(tname, &val->frdataset, eresult)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, no DS"
+ " and this is a delegation");
validator_done(val, DNS_R_MUSTBESECURE);
} else if (val->view->dlv == NULL || DLVTRIED(val)) {
markanswer(val, "dsfetched2");
@@ -733,7 +744,7 @@ dsvalidated(isc_task_t *task, isc_event_t *event) {
name = dns_fixedname_name(&val->fname);
if ((val->attributes & VALATTR_INSECURITY) != 0 &&
val->frdataset.covers == dns_rdatatype_ds &&
- val->frdataset.type == 0 &&
+ NEGATIVE(&val->frdataset) &&
isdelegation(name, &val->frdataset, DNS_R_NCACHENXRRSET)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
@@ -1087,7 +1098,7 @@ nsec3noexistnodata(dns_validator_t *val, dns_name_t* name,
if (ns && !soa) {
if (!atparent) {
/*
- * This NSEC record is from somewhere
+ * This NSEC3 record is from somewhere
* higher in the DNS, and at the
* parent of a delegation. It can not
* be legitimately used here.
@@ -1098,7 +1109,7 @@ nsec3noexistnodata(dns_validator_t *val, dns_name_t* name,
}
} else if (atparent && ns && soa) {
/*
- * This NSEC record is from the child.
+ * This NSEC3 record is from the child.
* It can not be legitimately used here.
*/
validator_log(val, ISC_LOG_DEBUG(3),
@@ -1503,8 +1514,11 @@ create_fetch(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type,
if (dns_rdataset_isassociated(&val->fsigrdataset))
dns_rdataset_disassociate(&val->fsigrdataset);
- if (check_deadlock(val, name, type, NULL, NULL))
+ if (check_deadlock(val, name, type, NULL, NULL)) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "deadlock found (create_fetch)");
return (DNS_R_NOVALIDSIG);
+ }
validator_logcreate(val, name, type, caller, "fetch");
return (dns_resolver_createfetch(val->view->resolver, name, type,
@@ -1526,8 +1540,11 @@ create_validator(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type,
{
isc_result_t result;
- if (check_deadlock(val, name, type, rdataset, sigrdataset))
+ if (check_deadlock(val, name, type, rdataset, sigrdataset)) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "deadlock found (create_validator)");
return (DNS_R_NOVALIDSIG);
+ }
validator_logcreate(val, name, type, caller, "validator");
result = dns_validator_create(val->view, name, type,
@@ -1766,16 +1783,23 @@ compute_keytag(dns_rdata_t *rdata, dns_rdata_dnskey_t *key) {
*/
static isc_boolean_t
isselfsigned(dns_validator_t *val) {
+ dns_fixedname_t fixed;
dns_rdataset_t *rdataset, *sigrdataset;
dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdata_t sigrdata = DNS_RDATA_INIT;
dns_rdata_dnskey_t key;
dns_rdata_rrsig_t sig;
dns_keytag_t keytag;
+ dns_name_t *name;
isc_result_t result;
+ dst_key_t *dstkey;
+ isc_mem_t *mctx;
+ isc_boolean_t answer = ISC_FALSE;
rdataset = val->event->rdataset;
sigrdataset = val->event->sigrdataset;
+ name = val->event->name;
+ mctx = val->view->mctx;
INSIST(rdataset->type == dns_rdatatype_dnskey);
@@ -1797,12 +1821,31 @@ isselfsigned(dns_validator_t *val) {
result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (sig.algorithm == key.algorithm &&
- sig.keyid == keytag)
- return (ISC_TRUE);
+ if (sig.algorithm != key.algorithm ||
+ sig.keyid != keytag ||
+ !dns_name_equal(name, &sig.signer))
+ continue;
+
+ dstkey = NULL;
+ result = dns_dnssec_keyfromrdata(name, &rdata, mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ result = dns_dnssec_verify2(name, rdataset, dstkey,
+ ISC_TRUE, mctx, &sigrdata,
+ dns_fixedname_name(&fixed));
+ dst_key_free(&dstkey);
+ if (result != ISC_R_SUCCESS)
+ continue;
+ if ((key.flags & DNS_KEYFLAG_REVOKE) == 0) {
+ answer = ISC_TRUE;
+ continue;
+ }
+ dns_view_untrust(val->view, name, &key, mctx);
}
}
- return (ISC_FALSE);
+ return (answer);
}
/*%
@@ -1944,6 +1987,8 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
break;
}
val->key = dns_keynode_key(val->keynode);
+ if (val->key == NULL)
+ break;
} else {
if (get_dst_key(val, val->siginfo, val->keyset)
!= ISC_R_SUCCESS)
@@ -1960,8 +2005,6 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
isc_stdtime_get(&now);
ttl = ISC_MIN(event->rdataset->ttl,
val->siginfo->timeexpire - now);
- if (val->keyset != NULL)
- ttl = ISC_MIN(ttl, val->keyset->ttl);
event->rdataset->ttl = ttl;
event->sigrdataset->ttl = ttl;
}
@@ -1990,7 +2033,8 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
} else if (result == ISC_R_SUCCESS) {
marksecure(event);
validator_log(val, ISC_LOG_DEBUG(3),
- "marking as secure");
+ "marking as secure, "
+ "noqname proof not needed");
return (result);
} else {
validator_log(val, ISC_LOG_DEBUG(3),
@@ -2011,25 +2055,102 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
}
/*%
+ * Check whether this DNSKEY (keyrdata) signed the DNSKEY RRset
+ * (val->event->rdataset).
+ */
+static isc_result_t
+checkkey(dns_validator_t *val, dns_rdata_t *keyrdata, isc_uint16_t keyid,
+ dns_secalg_t algorithm)
+{
+ dns_rdata_rrsig_t sig;
+ dst_key_t *dstkey = NULL;
+ isc_result_t result;
+
+ for (result = dns_rdataset_first(val->event->sigrdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(val->event->sigrdataset))
+ {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+
+ dns_rdataset_current(val->event->sigrdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if (keyid != sig.keyid || algorithm != sig.algorithm)
+ continue;
+ if (dstkey == NULL) {
+ result = dns_dnssec_keyfromrdata(val->event->name,
+ keyrdata,
+ val->view->mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS)
+ /*
+ * This really shouldn't happen, but...
+ */
+ continue;
+ }
+ result = verify(val, dstkey, &rdata, sig.keyid);
+ if (result == ISC_R_SUCCESS)
+ break;
+ }
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ return (result);
+}
+
+/*%
+ * Find the DNSKEY that corresponds to the DS.
+ */
+static isc_result_t
+keyfromds(dns_validator_t *val, dns_rdataset_t *rdataset, dns_rdata_t *dsrdata,
+ isc_uint8_t digest, isc_uint16_t keyid, dns_secalg_t algorithm,
+ dns_rdata_t *keyrdata)
+{
+ dns_keytag_t keytag;
+ dns_rdata_dnskey_t key;
+ isc_result_t result;
+ unsigned char dsbuf[DNS_DS_BUFFERSIZE];
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset))
+ {
+ dns_rdata_t newdsrdata = DNS_RDATA_INIT;
+
+ dns_rdata_reset(keyrdata);
+ dns_rdataset_current(rdataset, keyrdata);
+ result = dns_rdata_tostruct(keyrdata, &key, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ keytag = compute_keytag(keyrdata, &key);
+ if (keyid != keytag || algorithm != key.algorithm)
+ continue;
+ dns_rdata_reset(&newdsrdata);
+ result = dns_ds_buildrdata(val->event->name, keyrdata, digest,
+ dsbuf, &newdsrdata);
+ if (result != ISC_R_SUCCESS) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "dns_ds_buildrdata() -> %s",
+ dns_result_totext(result));
+ continue;
+ }
+ if (dns_rdata_compare(dsrdata, &newdsrdata) == 0)
+ break;
+ }
+ return (result);
+}
+
+/*%
* Validate the DNSKEY RRset by looking for a DNSKEY that matches a
* DLV record and that also verifies the DNSKEY RRset.
*/
static isc_result_t
dlv_validatezonekey(dns_validator_t *val) {
- dns_keytag_t keytag;
dns_rdata_dlv_t dlv;
- dns_rdata_dnskey_t key;
- dns_rdata_rrsig_t sig;
dns_rdata_t dlvrdata = DNS_RDATA_INIT;
dns_rdata_t keyrdata = DNS_RDATA_INIT;
- dns_rdata_t newdsrdata = DNS_RDATA_INIT;
- dns_rdata_t sigrdata = DNS_RDATA_INIT;
dns_rdataset_t trdataset;
- dst_key_t *dstkey;
isc_boolean_t supported_algorithm;
isc_result_t result;
- unsigned char dsbuf[DNS_DS_BUFFERSIZE];
- isc_uint8_t digest_type;
+ char digest_types[256];
validator_log(val, ISC_LOG_DEBUG(3), "dlv_validatezonekey");
@@ -2046,7 +2167,7 @@ dlv_validatezonekey(dns_validator_t *val) {
* need to ignore DNS_DSDIGEST_SHA1 if a DNS_DSDIGEST_SHA256
* is present.
*/
- digest_type = DNS_DSDIGEST_SHA1;
+ memset(digest_types, 1, sizeof(digest_types));
for (result = dns_rdataset_first(&val->dlv);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&val->dlv)) {
@@ -2062,7 +2183,7 @@ dlv_validatezonekey(dns_validator_t *val) {
if (dlv.digest_type == DNS_DSDIGEST_SHA256 &&
dlv.length == ISC_SHA256_DIGESTLENGTH) {
- digest_type = DNS_DSDIGEST_SHA256;
+ digest_types[DNS_DSDIGEST_SHA1] = 0;
break;
}
}
@@ -2080,7 +2201,7 @@ dlv_validatezonekey(dns_validator_t *val) {
dlv.digest_type))
continue;
- if (dlv.digest_type != digest_type)
+ if (digest_types[dlv.digest_type] == 0)
continue;
if (!dns_resolver_algorithm_supported(val->view->resolver,
@@ -2093,70 +2214,27 @@ dlv_validatezonekey(dns_validator_t *val) {
dns_rdataset_init(&trdataset);
dns_rdataset_clone(val->event->rdataset, &trdataset);
- for (result = dns_rdataset_first(&trdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&trdataset))
- {
- dns_rdata_reset(&keyrdata);
- dns_rdataset_current(&trdataset, &keyrdata);
- result = dns_rdata_tostruct(&keyrdata, &key, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- keytag = compute_keytag(&keyrdata, &key);
- if (dlv.key_tag != keytag ||
- dlv.algorithm != key.algorithm)
- continue;
- dns_rdata_reset(&newdsrdata);
- result = dns_ds_buildrdata(val->event->name,
- &keyrdata, dlv.digest_type,
- dsbuf, &newdsrdata);
- if (result != ISC_R_SUCCESS) {
- validator_log(val, ISC_LOG_DEBUG(3),
- "dns_ds_buildrdata() -> %s",
- dns_result_totext(result));
- continue;
- }
- /* Covert to DLV */
- newdsrdata.type = dns_rdatatype_dlv;
- if (dns_rdata_compare(&dlvrdata, &newdsrdata) == 0)
- break;
- }
+ /*
+ * Convert to DLV to DS and find matching DNSKEY.
+ */
+ dlvrdata.type = dns_rdatatype_ds;
+ result = keyfromds(val, &trdataset, &dlvrdata,
+ dlv.digest_type, dlv.key_tag,
+ dlv.algorithm, &keyrdata);
if (result != ISC_R_SUCCESS) {
dns_rdataset_disassociate(&trdataset);
validator_log(val, ISC_LOG_DEBUG(3),
"no DNSKEY matching DLV");
continue;
}
+
validator_log(val, ISC_LOG_DEBUG(3),
"Found matching DLV record: checking for signature");
+ /*
+ * Check that this DNSKEY signed the DNSKEY rrset.
+ */
+ result = checkkey(val, &keyrdata, dlv.key_tag, dlv.algorithm);
- for (result = dns_rdataset_first(val->event->sigrdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(val->event->sigrdataset))
- {
- dns_rdata_reset(&sigrdata);
- dns_rdataset_current(val->event->sigrdataset,
- &sigrdata);
- result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (dlv.key_tag != sig.keyid ||
- dlv.algorithm != sig.algorithm)
- continue;
- dstkey = NULL;
- result = dns_dnssec_keyfromrdata(val->event->name,
- &keyrdata,
- val->view->mctx,
- &dstkey);
- if (result != ISC_R_SUCCESS)
- /*
- * This really shouldn't happen, but...
- */
- continue;
-
- result = verify(val, dstkey, &sigrdata, sig.keyid);
- dst_key_free(&dstkey);
- if (result == ISC_R_SUCCESS)
- break;
- }
dns_rdataset_disassociate(&trdataset);
if (result == ISC_R_SUCCESS)
break;
@@ -2165,12 +2243,13 @@ dlv_validatezonekey(dns_validator_t *val) {
}
if (result == ISC_R_SUCCESS) {
marksecure(val->event);
- validator_log(val, ISC_LOG_DEBUG(3), "marking as secure");
+ validator_log(val, ISC_LOG_DEBUG(3), "marking as secure (dlv)");
return (result);
} else if (result == ISC_R_NOMORE && !supported_algorithm) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure,"
+ "no supported algorithm/digest (dlv)");
return (DNS_R_MUSTBESECURE);
}
validator_log(val, ISC_LOG_DEBUG(3),
@@ -2182,7 +2261,8 @@ dlv_validatezonekey(dns_validator_t *val) {
}
/*%
- * Attempts positive response validation of an RRset containing zone keys.
+ * Attempts positive response validation of an RRset containing zone keys
+ * (i.e. a DNSKEY rrset).
*
* Returns:
* \li ISC_R_SUCCESS Validation completed successfully
@@ -2196,19 +2276,15 @@ validatezonekey(dns_validator_t *val) {
dns_validatorevent_t *event;
dns_rdataset_t trdataset;
dns_rdata_t dsrdata = DNS_RDATA_INIT;
- dns_rdata_t newdsrdata = DNS_RDATA_INIT;
dns_rdata_t keyrdata = DNS_RDATA_INIT;
dns_rdata_t sigrdata = DNS_RDATA_INIT;
- unsigned char dsbuf[DNS_DS_BUFFERSIZE];
char namebuf[DNS_NAME_FORMATSIZE];
- dns_keytag_t keytag;
dns_rdata_ds_t ds;
- dns_rdata_dnskey_t key;
dns_rdata_rrsig_t sig;
dst_key_t *dstkey;
isc_boolean_t supported_algorithm;
isc_boolean_t atsep = ISC_FALSE;
- isc_uint8_t digest_type;
+ char digest_types[256];
/*
* Caller must be holding the validator lock.
@@ -2257,8 +2333,7 @@ validatezonekey(dns_validator_t *val) {
result = dns_keytable_findkeynode(val->keytable,
val->event->name,
sig.algorithm,
- sig.keyid,
- &keynode);
+ sig.keyid, &keynode);
if (result == ISC_R_NOTFOUND &&
dns_keytable_finddeepestmatch(val->keytable,
val->event->name, found) != ISC_R_SUCCESS) {
@@ -2282,11 +2357,18 @@ validatezonekey(dns_validator_t *val) {
while (result == ISC_R_SUCCESS) {
dns_keynode_t *nextnode = NULL;
dstkey = dns_keynode_key(keynode);
+ if (dstkey == NULL) {
+ dns_keytable_detachkeynode(
+ val->keytable,
+ &keynode);
+ break;
+ }
result = verify(val, dstkey, &sigrdata,
sig.keyid);
if (result == ISC_R_SUCCESS) {
- dns_keytable_detachkeynode(val->keytable,
- &keynode);
+ dns_keytable_detachkeynode(
+ val->keytable,
+ &keynode);
break;
}
result = dns_keytable_findnextkeynode(
@@ -2316,8 +2398,8 @@ validatezonekey(dns_validator_t *val) {
sizeof(namebuf));
validator_log(val, ISC_LOG_NOTICE,
"unable to find a DNSKEY which verifies "
- "the DNSKEY RRset and also matches one "
- "of specified trusted-keys for '%s'",
+ "the DNSKEY RRset and also matches a "
+ "trusted key for '%s'",
namebuf);
validator_log(val, ISC_LOG_NOTICE,
"please check the 'trusted-keys' for "
@@ -2411,7 +2493,8 @@ validatezonekey(dns_validator_t *val) {
if (val->dsset->trust < dns_trust_secure) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure,"
+ " insecure DS");
return (DNS_R_MUSTBESECURE);
}
if (val->view->dlv == NULL || DLVTRIED(val)) {
@@ -2435,7 +2518,7 @@ validatezonekey(dns_validator_t *val) {
* need to ignore DNS_DSDIGEST_SHA1 if a DNS_DSDIGEST_SHA256
* is present.
*/
- digest_type = DNS_DSDIGEST_SHA1;
+ memset(digest_types, 1, sizeof(digest_types));
for (result = dns_rdataset_first(val->dsset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(val->dsset)) {
@@ -2451,7 +2534,7 @@ validatezonekey(dns_validator_t *val) {
if (ds.digest_type == DNS_DSDIGEST_SHA256 &&
ds.length == ISC_SHA256_DIGESTLENGTH) {
- digest_type = DNS_DSDIGEST_SHA256;
+ digest_types[DNS_DSDIGEST_SHA1] = 0;
break;
}
}
@@ -2469,7 +2552,7 @@ validatezonekey(dns_validator_t *val) {
ds.digest_type))
continue;
- if (ds.digest_type != digest_type)
+ if (digest_types[ds.digest_type] == 0)
continue;
if (!dns_resolver_algorithm_supported(val->view->resolver,
@@ -2483,29 +2566,10 @@ validatezonekey(dns_validator_t *val) {
dns_rdataset_clone(val->event->rdataset, &trdataset);
/*
- * Look for the KEY that matches the DS record.
+ * Find matching DNSKEY from DS.
*/
- for (result = dns_rdataset_first(&trdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(&trdataset))
- {
- dns_rdata_reset(&keyrdata);
- dns_rdataset_current(&trdataset, &keyrdata);
- result = dns_rdata_tostruct(&keyrdata, &key, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- keytag = compute_keytag(&keyrdata, &key);
- if (ds.key_tag != keytag ||
- ds.algorithm != key.algorithm)
- continue;
- dns_rdata_reset(&newdsrdata);
- result = dns_ds_buildrdata(val->event->name,
- &keyrdata, ds.digest_type,
- dsbuf, &newdsrdata);
- if (result != ISC_R_SUCCESS)
- continue;
- if (dns_rdata_compare(&dsrdata, &newdsrdata) == 0)
- break;
- }
+ result = keyfromds(val, &trdataset, &dsrdata, ds.digest_type,
+ ds.key_tag, ds.algorithm, &keyrdata);
if (result != ISC_R_SUCCESS) {
dns_rdataset_disassociate(&trdataset);
validator_log(val, ISC_LOG_DEBUG(3),
@@ -2513,38 +2577,11 @@ validatezonekey(dns_validator_t *val) {
continue;
}
- for (result = dns_rdataset_first(val->event->sigrdataset);
- result == ISC_R_SUCCESS;
- result = dns_rdataset_next(val->event->sigrdataset))
- {
- dns_rdata_reset(&sigrdata);
- dns_rdataset_current(val->event->sigrdataset,
- &sigrdata);
- result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- if (ds.key_tag != sig.keyid ||
- ds.algorithm != sig.algorithm)
- continue;
- if (!dns_name_equal(val->event->name, &sig.signer)) {
- validator_log(val, ISC_LOG_DEBUG(3),
- "DNSKEY signer mismatch");
- continue;
- }
- dstkey = NULL;
- result = dns_dnssec_keyfromrdata(val->event->name,
- &keyrdata,
- val->view->mctx,
- &dstkey);
- if (result != ISC_R_SUCCESS)
- /*
- * This really shouldn't happen, but...
- */
- continue;
- result = verify(val, dstkey, &sigrdata, sig.keyid);
- dst_key_free(&dstkey);
- if (result == ISC_R_SUCCESS)
- break;
- }
+ /*
+ * Check that this DNSKEY signed the DNSKEY rrset.
+ */
+ result = checkkey(val, &keyrdata, ds.key_tag, ds.algorithm);
+
dns_rdataset_disassociate(&trdataset);
if (result == ISC_R_SUCCESS)
break;
@@ -2553,20 +2590,24 @@ validatezonekey(dns_validator_t *val) {
}
if (result == ISC_R_SUCCESS) {
marksecure(event);
- validator_log(val, ISC_LOG_DEBUG(3), "marking as secure");
+ validator_log(val, ISC_LOG_DEBUG(3), "marking as secure (DS)");
return (result);
} else if (result == ISC_R_NOMORE && !supported_algorithm) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "no supported algorithm/digest (DS)");
return (DNS_R_MUSTBESECURE);
}
validator_log(val, ISC_LOG_DEBUG(3),
"no supported algorithm/digest (DS)");
markanswer(val, "validatezonekey (3)");
return (ISC_R_SUCCESS);
- } else
+ } else {
+ validator_log(val, ISC_LOG_INFO,
+ "no valid signature found (DS)");
return (DNS_R_NOVALIDSIG);
+ }
}
/*%
@@ -3092,9 +3133,7 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) {
findnsec3proofs(val);
if (FOUNDNOQNAME(val) && FOUNDCLOSEST(val)) {
validator_log(val, ISC_LOG_DEBUG(3),
- "noqname proof found");
- validator_log(val, ISC_LOG_DEBUG(3),
- "marking as secure");
+ "marking as secure, noqname proof found");
marksecure(val->event);
return (ISC_R_SUCCESS);
} else if (FOUNDOPTOUT(val) &&
@@ -3141,7 +3180,6 @@ nsecvalidate(dns_validator_t *val, isc_boolean_t resume) {
marksecure(val->event);
return (ISC_R_SUCCESS);
}
- findnsec3proofs(val);
if (val->authfail != 0 && val->authcount == val->authfail)
return (DNS_R_BROKENCHAIN);
@@ -3343,7 +3381,8 @@ startfinddlvsep(dns_validator_t *val, dns_name_t *unsecure) {
namebuf);
if (dns_name_issubdomain(val->event->name, val->view->dlv)) {
- validator_log(val, ISC_LOG_WARNING, "must be secure failure");
+ validator_log(val, ISC_LOG_WARNING, "must be secure failure, "
+ " %s is under DLV (startfinddlvsep)", namebuf);
return (DNS_R_MUSTBESECURE);
}
@@ -3395,10 +3434,12 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) {
INSIST(val->view->dlv != NULL);
if (!resume) {
-
if (dns_name_issubdomain(val->event->name, val->view->dlv)) {
+ dns_name_format(val->event->name, namebuf,
+ sizeof(namebuf));
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "%s is under DLV (finddlvsep)", namebuf);
return (DNS_R_MUSTBESECURE);
}
@@ -3466,8 +3507,11 @@ finddlvsep(dns_validator_t *val, isc_boolean_t resume) {
return (result);
return (DNS_R_WAIT);
}
- if (val->frdataset.trust < dns_trust_secure)
+ if (val->frdataset.trust < dns_trust_secure) {
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "DLV not validated");
return (DNS_R_NOVALIDSIG);
+ }
val->havedlvsep = ISC_TRUE;
dns_rdataset_clone(&val->frdataset, &val->dlv);
return (ISC_R_SUCCESS);
@@ -3552,10 +3596,13 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (result == ISC_R_NOTFOUND) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "not beneath secure root");
result = DNS_R_MUSTBESECURE;
goto out;
- }
+ } else
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "not beneath secure root");
if (val->view->dlv == NULL || DLVTRIED(val)) {
markanswer(val, "proveunsecure (1)");
return (ISC_R_SUCCESS);
@@ -3575,7 +3622,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
/*
* If we have a DS rdataset and it is secure then check if
* the DS rdataset has a supported algorithm combination.
- * If not this is a insecure delegation as far as this
+ * If not this is an insecure delegation as far as this
* resolver is concerned. Fall back to DLV if available.
*/
if (have_ds && val->frdataset.trust >= dns_trust_secure &&
@@ -3586,7 +3633,8 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if ((val->view->dlv == NULL || DLVTRIED(val)) &&
val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure at '%s'",
+ "must be secure failure at '%s', "
+ "can't fall back to DLV",
namebuf);
result = DNS_R_MUSTBESECURE;
goto out;
@@ -3628,7 +3676,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (result == DNS_R_NXRRSET || result == DNS_R_NCACHENXRRSET) {
/*
* There is no DS. If this is a delegation,
- * we maybe done.
+ * we may be done.
*/
/*
* If we have "trust == answer" then this namespace
@@ -3641,7 +3689,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
&val->frdataset,
NULL, dsvalidated,
"proveunsecure");
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS)
goto out;
return (DNS_R_WAIT);
}
@@ -3653,12 +3701,13 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (result == DNS_R_NXRRSET &&
!dns_rdataset_isassociated(&val->frdataset) &&
dns_view_findzonecut2(val->view, tname, found,
- 0, 0, ISC_FALSE, ISC_FALSE,
- NULL, NULL) == ISC_R_SUCCESS &&
+ 0, 0, ISC_FALSE, ISC_FALSE,
+ NULL, NULL) == ISC_R_SUCCESS &&
dns_name_equal(tname, found)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "no DS at zone cut");
return (DNS_R_MUSTBESECURE);
}
if (val->view->dlv == NULL || DLVTRIED(val)) {
@@ -3674,13 +3723,18 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
* there's no way of validating existing
* negative response blobs, give up.
*/
+ validator_log(val, ISC_LOG_WARNING,
+ "can't validate existing "
+ "negative responses (no DS)");
result = DNS_R_NOVALIDSIG;
goto out;
}
if (isdelegation(tname, &val->frdataset, result)) {
if (val->mustbesecure) {
validator_log(val, ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "%s is a delegation",
+ namebuf);
return (DNS_R_MUSTBESECURE);
}
if (val->view->dlv == NULL || DLVTRIED(val)) {
@@ -3703,7 +3757,10 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
if (val->mustbesecure) {
validator_log(val,
ISC_LOG_WARNING,
- "must be secure failure");
+ "must be secure failure, "
+ "no supported algorithm/"
+ "digest (%s/DS)",
+ namebuf);
result = DNS_R_MUSTBESECURE;
goto out;
}
@@ -3721,6 +3778,8 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
}
else if (!dns_rdataset_isassociated(&val->fsigrdataset))
{
+ validator_log(val, ISC_LOG_DEBUG(3),
+ "DS is unsigned");
result = DNS_R_NOVALIDSIG;
goto out;
}
@@ -3769,6 +3828,10 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
* there's no way of validating existing
* negative response blobs, give up.
*/
+ validator_log(val, ISC_LOG_WARNING,
+ "can't validate existing "
+ "negative responses "
+ "(not a zone cut)");
result = DNS_R_NOVALIDSIG;
goto out;
}
@@ -3788,7 +3851,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume)
/* Couldn't complete insecurity proof */
validator_log(val, ISC_LOG_DEBUG(3), "insecurity proof failed");
- return (DNS_R_NOTINSECURE); /* Couldn't complete insecurity proof */
+ return (DNS_R_NOTINSECURE);
out:
if (dns_rdataset_isassociated(&val->frdataset))
@@ -3827,7 +3890,7 @@ dlv_validator_start(dns_validator_t *val) {
* \li 3. a negative answer (secure or unsecure).
*
* Note a answer that appears to be a secure positive answer may actually
- * be a unsecure positive answer.
+ * be an unsecure positive answer.
*/
static void
validator_start(isc_task_t *task, isc_event_t *event) {
@@ -3893,6 +3956,10 @@ validator_start(isc_task_t *task, isc_event_t *event) {
val->attributes |= VALATTR_INSECURITY;
result = proveunsecure(val, ISC_FALSE, ISC_FALSE);
+ if (result == DNS_R_NOTINSECURE)
+ validator_log(val, ISC_LOG_INFO,
+ "got insecure response; "
+ "parent indicates it should be secure");
} else if (val->event->rdataset == NULL &&
val->event->sigrdataset == NULL)
{
@@ -3909,7 +3976,7 @@ validator_start(isc_task_t *task, isc_event_t *event) {
val->attributes |= VALATTR_NEEDNODATA;
result = nsecvalidate(val, ISC_FALSE);
} else if (val->event->rdataset != NULL &&
- val->event->rdataset->type == 0)
+ NEGATIVE(val->event->rdataset))
{
/*
* This is a nonexistence validation.
@@ -3965,6 +4032,7 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
return (ISC_R_NOMEMORY);
val->view = NULL;
dns_view_weakattach(view, &val->view);
+
event = (dns_validatorevent_t *)
isc_event_allocate(view->mctx, task,
DNS_EVENT_VALIDATORSTART,
@@ -3993,8 +4061,12 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
val->fetch = NULL;
val->subvalidator = NULL;
val->parent = NULL;
+
val->keytable = NULL;
- dns_keytable_attach(val->view->secroots, &val->keytable);
+ result = dns_view_getsecroots(val->view, &val->keytable);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
val->keynode = NULL;
val->key = NULL;
val->siginfo = NULL;
diff --git a/contrib/bind9/lib/dns/view.c b/contrib/bind9/lib/dns/view.c
index 809cc15..24f925a 100644
--- a/contrib/bind9/lib/dns/view.c
+++ b/contrib/bind9/lib/dns/view.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,13 +15,16 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: view.c,v 1.150.84.6 2010-09-24 08:09:08 marka Exp $ */
+/* $Id: view.c,v 1.178 2011-01-13 09:53:04 marka Exp $ */
/*! \file */
#include <config.h>
+#include <isc/file.h>
#include <isc/hash.h>
+#include <isc/print.h>
+#include <isc/sha2.h>
#include <isc/stats.h>
#include <isc/string.h> /* Required for HP/UX (and others?) */
#include <isc/task.h>
@@ -33,17 +36,24 @@
#include <dns/cache.h>
#include <dns/db.h>
#include <dns/dlz.h>
+#ifdef BIND9
+#include <dns/dns64.h>
+#endif
+#include <dns/dnssec.h>
#include <dns/events.h>
#include <dns/forward.h>
#include <dns/keytable.h>
+#include <dns/keyvalues.h>
#include <dns/master.h>
#include <dns/masterdump.h>
#include <dns/order.h>
#include <dns/peer.h>
+#include <dns/rbt.h>
#include <dns/rdataset.h>
#include <dns/request.h>
#include <dns/resolver.h>
#include <dns/result.h>
+#include <dns/rpz.h>
#include <dns/stats.h>
#include <dns/tsig.h>
#include <dns/zone.h>
@@ -85,6 +95,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
if (result != ISC_R_SUCCESS)
goto cleanup_name;
+#ifdef BIND9
view->zonetable = NULL;
result = dns_zt_create(mctx, rdclass, &view->zonetable);
if (result != ISC_R_SUCCESS) {
@@ -94,24 +105,8 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
result = ISC_R_UNEXPECTED;
goto cleanup_mutex;
}
- view->secroots = NULL;
- result = dns_keytable_create(mctx, &view->secroots);
- if (result != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "dns_keytable_create() failed: %s",
- isc_result_totext(result));
- result = ISC_R_UNEXPECTED;
- goto cleanup_zt;
- }
- view->trustedkeys = NULL;
- result = dns_keytable_create(mctx, &view->trustedkeys);
- if (result != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "dns_keytable_create() failed: %s",
- isc_result_totext(result));
- result = ISC_R_UNEXPECTED;
- goto cleanup_secroots;
- }
+#endif
+ view->secroots_priv = NULL;
view->fwdtable = NULL;
result = dns_fwdtable_create(mctx, &view->fwdtable);
if (result != ISC_R_SUCCESS) {
@@ -119,7 +114,7 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
"dns_fwdtable_create() failed: %s",
isc_result_totext(result));
result = ISC_R_UNEXPECTED;
- goto cleanup_trustedkeys;
+ goto cleanup_zt;
}
view->acache = NULL;
@@ -155,6 +150,9 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
view->rootexclude = NULL;
view->resstats = NULL;
view->resquerystats = NULL;
+ view->cacheshared = ISC_FALSE;
+ ISC_LIST_INIT(view->dns64);
+ view->dns64cnt = 0;
/*
* Initialize configuration data with default values.
@@ -179,6 +177,10 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
view->notifyacl = NULL;
view->updateacl = NULL;
view->upfwdacl = NULL;
+ view->denyansweracl = NULL;
+ view->answeracl_exclude = NULL;
+ view->denyanswernames = NULL;
+ view->answernames_exclude = NULL;
view->requestixfr = ISC_TRUE;
view->provideixfr = ISC_TRUE;
view->maxcachettl = 7 * 24 * 3600;
@@ -188,11 +190,20 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
view->flush = ISC_FALSE;
view->dlv = NULL;
view->maxudp = 0;
+ view->v4_aaaa = dns_v4_aaaa_ok;
+ view->v4_aaaa_acl = NULL;
+ ISC_LIST_INIT(view->rpz_zones);
dns_fixedname_init(&view->dlv_fixed);
+ view->managed_keys = NULL;
+#ifdef BIND9
+ view->new_zone_file = NULL;
+ view->new_zone_config = NULL;
+ view->cfg_destroy = NULL;
result = dns_order_create(view->mctx, &view->order);
if (result != ISC_R_SUCCESS)
goto cleanup_dynkeys;
+#endif
result = dns_peerlist_new(view->mctx, &view->peers);
if (result != ISC_R_SUCCESS)
@@ -222,10 +233,12 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
dns_peerlist_detach(&view->peers);
cleanup_order:
+#ifdef BIND9
dns_order_detach(&view->order);
cleanup_dynkeys:
- dns_tsigkeyring_destroy(&view->dynamickeys);
+#endif
+ dns_tsigkeyring_detach(&view->dynamickeys);
cleanup_references:
isc_refcount_destroy(&view->references);
@@ -233,16 +246,12 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
cleanup_fwdtable:
dns_fwdtable_destroy(&view->fwdtable);
- cleanup_trustedkeys:
- dns_keytable_detach(&view->trustedkeys);
-
- cleanup_secroots:
- dns_keytable_detach(&view->secroots);
-
cleanup_zt:
+#ifdef BIND9
dns_zt_detach(&view->zonetable);
cleanup_mutex:
+#endif
DESTROYLOCK(&view->lock);
cleanup_name:
@@ -256,6 +265,10 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
static inline void
destroy(dns_view_t *view) {
+#ifdef BIND9
+ dns_dns64_t *dns64;
+#endif
+
REQUIRE(!ISC_LINK_LINKED(view, link));
REQUIRE(isc_refcount_current(&view->references) == 0);
REQUIRE(view->weakrefs == 0);
@@ -263,23 +276,62 @@ destroy(dns_view_t *view) {
REQUIRE(ADBSHUTDOWN(view));
REQUIRE(REQSHUTDOWN(view));
+#ifdef BIND9
if (view->order != NULL)
dns_order_detach(&view->order);
+#endif
if (view->peers != NULL)
dns_peerlist_detach(&view->peers);
- if (view->dynamickeys != NULL)
- dns_tsigkeyring_destroy(&view->dynamickeys);
+
+ if (view->dynamickeys != NULL) {
+ isc_result_t result;
+ char template[20];
+ char keyfile[20];
+ FILE *fp = NULL;
+ int n;
+
+ n = snprintf(keyfile, sizeof(keyfile), "%s.tsigkeys",
+ view->name);
+ if (n > 0 && (size_t)n < sizeof(keyfile)) {
+ result = isc_file_mktemplate(keyfile, template,
+ sizeof(template));
+ if (result == ISC_R_SUCCESS)
+ (void)isc_file_openuniqueprivate(template, &fp);
+ }
+ if (fp == NULL)
+ dns_tsigkeyring_detach(&view->dynamickeys);
+ else {
+ result = dns_tsigkeyring_dumpanddetach(
+ &view->dynamickeys, fp);
+ if (result == ISC_R_SUCCESS) {
+ if (fclose(fp) == 0)
+ result = isc_file_rename(template,
+ keyfile);
+ if (result != ISC_R_SUCCESS)
+ (void)remove(template);
+ } else {
+ (void)fclose(fp);
+ (void)remove(template);
+ }
+ }
+ }
if (view->statickeys != NULL)
- dns_tsigkeyring_destroy(&view->statickeys);
+ dns_tsigkeyring_detach(&view->statickeys);
if (view->adb != NULL)
dns_adb_detach(&view->adb);
if (view->resolver != NULL)
dns_resolver_detach(&view->resolver);
+#ifdef BIND9
if (view->acache != NULL) {
if (view->cachedb != NULL)
dns_acache_putdb(view->acache, view->cachedb);
dns_acache_detach(&view->acache);
}
+ dns_rpz_view_destroy(view);
+#else
+ INSIST(view->acache == NULL);
+ INSIST(ISC_LIST_EMPTY(view->rpz_zones));
+#endif
if (view->requestmgr != NULL)
dns_requestmgr_detach(&view->requestmgr);
if (view->task != NULL)
@@ -318,6 +370,16 @@ destroy(dns_view_t *view) {
dns_acl_detach(&view->updateacl);
if (view->upfwdacl != NULL)
dns_acl_detach(&view->upfwdacl);
+ if (view->denyansweracl != NULL)
+ dns_acl_detach(&view->denyansweracl);
+ if (view->v4_aaaa_acl != NULL)
+ dns_acl_detach(&view->v4_aaaa_acl);
+ if (view->answeracl_exclude != NULL)
+ dns_rbt_destroy(&view->answeracl_exclude);
+ if (view->denyanswernames != NULL)
+ dns_rbt_destroy(&view->denyanswernames);
+ if (view->answernames_exclude != NULL)
+ dns_rbt_destroy(&view->answernames_exclude);
if (view->delonly != NULL) {
dns_name_t *name;
int i;
@@ -357,8 +419,19 @@ destroy(dns_view_t *view) {
isc_stats_detach(&view->resstats);
if (view->resquerystats != NULL)
dns_stats_detach(&view->resquerystats);
- dns_keytable_detach(&view->trustedkeys);
- dns_keytable_detach(&view->secroots);
+ if (view->secroots_priv != NULL)
+ dns_keytable_detach(&view->secroots_priv);
+#ifdef BIND9
+ for (dns64 = ISC_LIST_HEAD(view->dns64);
+ dns64 != NULL;
+ dns64 = ISC_LIST_HEAD(view->dns64)) {
+ dns_dns64_unlink(&view->dns64, dns64);
+ dns_dns64_destroy(&dns64);
+ }
+ if (view->managed_keys != NULL)
+ dns_zone_detach(&view->managed_keys);
+ dns_view_setnewzones(view, ISC_FALSE, NULL, NULL);
+#endif
dns_fwdtable_destroy(&view->fwdtable);
dns_aclenv_destroy(&view->aclenv);
DESTROYLOCK(&view->lock);
@@ -414,12 +487,19 @@ view_flushanddetach(dns_view_t **viewp, isc_boolean_t flush) {
dns_adb_shutdown(view->adb);
if (!REQSHUTDOWN(view))
dns_requestmgr_shutdown(view->requestmgr);
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_shutdown(view->acache);
if (view->flush)
dns_zt_flushanddetach(&view->zonetable);
else
dns_zt_detach(&view->zonetable);
+ if (view->managed_keys != NULL) {
+ if (view->flush)
+ dns_zone_flush(view->managed_keys);
+ dns_zone_detach(&view->managed_keys);
+ }
+#endif
done = all_done(view);
UNLOCK(&view->lock);
}
@@ -440,6 +520,7 @@ dns_view_detach(dns_view_t **viewp) {
view_flushanddetach(viewp, ISC_FALSE);
}
+#ifdef BIND9
static isc_result_t
dialup(dns_zone_t *zone, void *dummy) {
UNUSED(dummy);
@@ -452,6 +533,7 @@ dns_view_dialup(dns_view_t *view) {
REQUIRE(DNS_VIEW_VALID(view));
(void)dns_zt_apply(view->zonetable, ISC_FALSE, dialup, NULL);
}
+#endif
void
dns_view_weakattach(dns_view_t *source, dns_view_t **targetp) {
@@ -633,12 +715,20 @@ dns_view_createresolver(dns_view_t *view,
void
dns_view_setcache(dns_view_t *view, dns_cache_t *cache) {
+ dns_view_setcache2(view, cache, ISC_FALSE);
+}
+
+void
+dns_view_setcache2(dns_view_t *view, dns_cache_t *cache, isc_boolean_t shared) {
REQUIRE(DNS_VIEW_VALID(view));
REQUIRE(!view->frozen);
+ view->cacheshared = shared;
if (view->cache != NULL) {
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_putdb(view->acache, view->cachedb);
+#endif
dns_db_detach(&view->cachedb);
dns_cache_detach(&view->cache);
}
@@ -646,8 +736,17 @@ dns_view_setcache(dns_view_t *view, dns_cache_t *cache) {
dns_cache_attachdb(cache, &view->cachedb);
INSIST(DNS_DB_VALID(view->cachedb));
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_setdb(view->acache, view->cachedb);
+#endif
+}
+
+isc_boolean_t
+dns_view_iscacheshared(dns_view_t *view) {
+ REQUIRE(DNS_VIEW_VALID(view));
+
+ return (view->cacheshared);
}
void
@@ -665,26 +764,52 @@ dns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring) {
REQUIRE(DNS_VIEW_VALID(view));
REQUIRE(ring != NULL);
if (view->statickeys != NULL)
- dns_tsigkeyring_destroy(&view->statickeys);
- view->statickeys = ring;
+ dns_tsigkeyring_detach(&view->statickeys);
+ dns_tsigkeyring_attach(ring, &view->statickeys);
}
void
-dns_view_setdstport(dns_view_t *view, in_port_t dstport) {
+dns_view_setdynamickeyring(dns_view_t *view, dns_tsig_keyring_t *ring) {
REQUIRE(DNS_VIEW_VALID(view));
- view->dstport = dstport;
+ REQUIRE(ring != NULL);
+ if (view->dynamickeys != NULL)
+ dns_tsigkeyring_detach(&view->dynamickeys);
+ dns_tsigkeyring_attach(ring, &view->dynamickeys);
}
-isc_result_t
-dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
- isc_result_t result;
+void
+dns_view_getdynamickeyring(dns_view_t *view, dns_tsig_keyring_t **ringp) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(ringp != NULL && *ringp == NULL);
+ if (view->dynamickeys != NULL)
+ dns_tsigkeyring_attach(view->dynamickeys, ringp);
+}
+
+void
+dns_view_restorekeyring(dns_view_t *view) {
+ FILE *fp;
+ char keyfile[20];
+ int n;
REQUIRE(DNS_VIEW_VALID(view));
- REQUIRE(!view->frozen);
- result = dns_zt_mount(view->zonetable, zone);
+ if (view->dynamickeys != NULL) {
+ n = snprintf(keyfile, sizeof(keyfile), "%s.tsigkeys",
+ view->name);
+ if (n > 0 && (size_t)n < sizeof(keyfile)) {
+ fp = fopen(keyfile, "r");
+ if (fp != NULL) {
+ dns_keyring_restore(view->dynamickeys, fp);
+ (void)fclose(fp);
+ }
+ }
+ }
+}
- return (result);
+void
+dns_view_setdstport(dns_view_t *view, in_port_t dstport) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ view->dstport = dstport;
}
void
@@ -699,6 +824,29 @@ dns_view_freeze(dns_view_t *view) {
view->frozen = ISC_TRUE;
}
+#ifdef BIND9
+void
+dns_view_thaw(dns_view_t *view) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(view->frozen);
+
+ view->frozen = ISC_FALSE;
+}
+
+isc_result_t
+dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
+ isc_result_t result;
+
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(!view->frozen);
+
+ result = dns_zt_mount(view->zonetable, zone);
+
+ return (result);
+}
+#endif
+
+#ifdef BIND9
isc_result_t
dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
isc_result_t result;
@@ -713,20 +861,37 @@ dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
return (result);
}
+#endif
isc_result_t
dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
isc_stdtime_t now, unsigned int options, isc_boolean_t use_hints,
dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
- dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) {
+ return (dns_view_find2(view, name, type, now, options, use_hints,
+ ISC_FALSE, dbp, nodep, foundname, rdataset,
+ sigrdataset));
+}
+
+isc_result_t
+dns_view_find2(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
+ isc_stdtime_t now, unsigned int options,
+ isc_boolean_t use_hints, isc_boolean_t use_static_stub,
+ dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,
+ dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
{
isc_result_t result;
dns_db_t *db, *zdb;
dns_dbnode_t *node, *znode;
- isc_boolean_t is_cache;
+ isc_boolean_t is_cache, is_staticstub_zone;
dns_rdataset_t zrdataset, zsigrdataset;
dns_zone_t *zone;
+#ifndef BIND9
+ UNUSED(use_hints);
+ UNUSED(use_static_stub);
+#endif
+
/*
* Find an rdataset whose owner name is 'name', and whose type is
* 'type'.
@@ -752,15 +917,30 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
zone = NULL;
db = NULL;
node = NULL;
+ is_staticstub_zone = ISC_FALSE;
+#ifdef BIND9
result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
+ if (zone != NULL && dns_zone_gettype(zone) == dns_zone_staticstub &&
+ !use_static_stub) {
+ result = ISC_R_NOTFOUND;
+ }
if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
result = dns_zone_getdb(zone, &db);
if (result != ISC_R_SUCCESS && view->cachedb != NULL)
dns_db_attach(view->cachedb, &db);
else if (result != ISC_R_SUCCESS)
goto cleanup;
+ if (dns_zone_gettype(zone) == dns_zone_staticstub &&
+ dns_name_equal(name, dns_zone_getorigin(zone))) {
+ is_staticstub_zone = ISC_TRUE;
+ }
} else if (result == ISC_R_NOTFOUND && view->cachedb != NULL)
dns_db_attach(view->cachedb, &db);
+#else
+ result = ISC_R_NOTFOUND;
+ if (view->cachedb != NULL)
+ dns_db_attach(view->cachedb, &db);
+#endif /* BIND9 */
else
goto cleanup;
@@ -773,8 +953,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
result = dns_db_find(db, name, NULL, type, options,
now, &node, foundname, rdataset, sigrdataset);
- if (result == DNS_R_DELEGATION ||
- result == ISC_R_NOTFOUND) {
+ if (result == DNS_R_DELEGATION || result == ISC_R_NOTFOUND) {
if (dns_rdataset_isassociated(rdataset))
dns_rdataset_disassociate(rdataset);
if (sigrdataset != NULL &&
@@ -784,10 +963,13 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
dns_db_detachnode(db, &node);
if (!is_cache) {
dns_db_detach(&db);
- if (view->cachedb != NULL) {
+ if (view->cachedb != NULL && !is_staticstub_zone) {
/*
* Either the answer is in the cache, or we
* don't know it.
+ * Note that if the result comes from a
+ * static-stub zone we stop the search here
+ * (see the function description in view.h).
*/
is_cache = ISC_TRUE;
dns_db_attach(view->cachedb, &db);
@@ -817,7 +999,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
*/
result = ISC_R_NOTFOUND;
} else if (result == DNS_R_GLUE) {
- if (view->cachedb != NULL) {
+ if (view->cachedb != NULL && !is_staticstub_zone) {
/*
* We found an answer, but the cache may be better.
* Remember what we've got and go look in the cache.
@@ -843,6 +1025,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
result = ISC_R_SUCCESS;
}
+#ifdef BIND9
if (result == ISC_R_NOTFOUND && use_hints && view->hints != NULL) {
if (dns_rdataset_isassociated(rdataset))
dns_rdataset_disassociate(rdataset);
@@ -877,6 +1060,7 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
if (db == NULL && node != NULL)
dns_db_detachnode(view->hints, &node);
}
+#endif /* BIND9 */
cleanup:
if (dns_rdataset_isassociated(&zrdataset)) {
@@ -905,8 +1089,10 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
} else
INSIST(node == NULL);
+#ifdef BIND9
if (zone != NULL)
dns_zone_detach(&zone);
+#endif
return (result);
}
@@ -969,12 +1155,12 @@ dns_view_findzonecut(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
isc_result_t
dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
isc_stdtime_t now, unsigned int options,
- isc_boolean_t use_hints, isc_boolean_t use_cache,
+ isc_boolean_t use_hints, isc_boolean_t use_cache,
dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset)
{
isc_result_t result;
dns_db_t *db;
- isc_boolean_t is_cache, use_zone, try_hints;
+ isc_boolean_t is_cache, use_zone, try_hints, is_staticstub_zone;
dns_zone_t *zone;
dns_name_t *zfname;
dns_rdataset_t zrdataset, zsigrdataset;
@@ -986,6 +1172,7 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
db = NULL;
zone = NULL;
use_zone = ISC_FALSE;
+ is_staticstub_zone = ISC_FALSE;
try_hints = ISC_FALSE;
zfname = NULL;
@@ -999,9 +1186,16 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
/*
* Find the right database.
*/
+#ifdef BIND9
result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
- if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
+ if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
result = dns_zone_getdb(zone, &db);
+ if (dns_zone_gettype(zone) == dns_zone_staticstub)
+ is_staticstub_zone = ISC_TRUE;
+ }
+#else
+ result = ISC_R_NOTFOUND;
+#endif
if (result == ISC_R_NOTFOUND) {
/*
* We're not directly authoritative for this query name, nor
@@ -1064,7 +1258,9 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
fname, rdataset, sigrdataset);
if (result == ISC_R_SUCCESS) {
if (zfname != NULL &&
- !dns_name_issubdomain(fname, zfname)) {
+ (!dns_name_issubdomain(fname, zfname) ||
+ (dns_zone_staticstub &&
+ dns_name_equal(fname, zfname)))) {
/*
* We found a zonecut in the cache, but our
* zone delegation is better.
@@ -1133,8 +1329,10 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
}
if (db != NULL)
dns_db_detach(&db);
+#ifdef BIND9
if (zone != NULL)
dns_zone_detach(&zone);
+#endif
return (result);
}
@@ -1161,6 +1359,7 @@ dns_viewlist_find(dns_viewlist_t *list, const char *name,
return (ISC_R_SUCCESS);
}
+#ifdef BIND9
isc_result_t
dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name,
isc_boolean_t allclasses, dns_rdataclass_t rdclass,
@@ -1225,6 +1424,7 @@ dns_view_loadnew(dns_view_t *view, isc_boolean_t stop) {
return (dns_zt_loadnew(view->zonetable, stop));
}
+#endif /* BIND9 */
isc_result_t
dns_view_gettsig(dns_view_t *view, dns_name_t *keyname, dns_tsigkey_t **keyp)
@@ -1269,6 +1469,7 @@ dns_view_checksig(dns_view_t *view, isc_buffer_t *source, dns_message_t *msg) {
view->dynamickeys));
}
+#ifdef BIND9
isc_result_t
dns_view_dumpdbtostream(dns_view_t *view, FILE *fp) {
isc_result_t result;
@@ -1284,26 +1485,38 @@ dns_view_dumpdbtostream(dns_view_t *view, FILE *fp) {
dns_resolver_printbadcache(view->resolver, fp);
return (ISC_R_SUCCESS);
}
+#endif
isc_result_t
dns_view_flushcache(dns_view_t *view) {
+ return (dns_view_flushcache2(view, ISC_FALSE));
+}
+
+isc_result_t
+dns_view_flushcache2(dns_view_t *view, isc_boolean_t fixuponly) {
isc_result_t result;
REQUIRE(DNS_VIEW_VALID(view));
if (view->cachedb == NULL)
return (ISC_R_SUCCESS);
- result = dns_cache_flush(view->cache);
- if (result != ISC_R_SUCCESS)
- return (result);
+ if (!fixuponly) {
+ result = dns_cache_flush(view->cache);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_putdb(view->acache, view->cachedb);
+#endif
dns_db_detach(&view->cachedb);
dns_cache_attachdb(view->cache, &view->cachedb);
+#ifdef BIND9
if (view->acache != NULL)
dns_acache_setdb(view->acache, view->cachedb);
if (view->resolver != NULL)
dns_resolver_flushbadcache(view->resolver, NULL);
+#endif
dns_adb_flush(view->adb);
return (ISC_R_SUCCESS);
@@ -1437,11 +1650,13 @@ dns_view_getrootdelonly(dns_view_t *view) {
return (view->rootdelonly);
}
+#ifdef BIND9
isc_result_t
dns_view_freezezones(dns_view_t *view, isc_boolean_t value) {
REQUIRE(DNS_VIEW_VALID(view));
return (dns_zt_freezezones(view->zonetable, value));
}
+#endif
void
dns_view_setresstats(dns_view_t *view, isc_stats_t *stats) {
@@ -1478,3 +1693,97 @@ dns_view_getresquerystats(dns_view_t *view, dns_stats_t **statsp) {
if (view->resquerystats != NULL)
dns_stats_attach(view->resquerystats, statsp);
}
+
+isc_result_t
+dns_view_initsecroots(dns_view_t *view, isc_mem_t *mctx) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ if (view->secroots_priv != NULL)
+ dns_keytable_detach(&view->secroots_priv);
+ return (dns_keytable_create(mctx, &view->secroots_priv));
+}
+
+isc_result_t
+dns_view_getsecroots(dns_view_t *view, dns_keytable_t **ktp) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE(ktp != NULL && *ktp == NULL);
+ if (view->secroots_priv == NULL)
+ return (ISC_R_NOTFOUND);
+ dns_keytable_attach(view->secroots_priv, ktp);
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+dns_view_issecuredomain(dns_view_t *view, dns_name_t *name,
+ isc_boolean_t *secure_domain) {
+ REQUIRE(DNS_VIEW_VALID(view));
+ return (dns_keytable_issecuredomain(view->secroots_priv, name,
+ secure_domain));
+}
+
+void
+dns_view_untrust(dns_view_t *view, dns_name_t *keyname,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx)
+{
+ isc_result_t result;
+ unsigned char data[4096];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ isc_buffer_t buffer;
+ dst_key_t *key = NULL;
+ dns_keytable_t *sr = NULL;
+
+ /*
+ * Clear the revoke bit, if set, so that the key will match what's
+ * in secroots now.
+ */
+ dnskey->flags &= ~DNS_KEYFLAG_REVOKE;
+
+ /* Convert dnskey to DST key. */
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+ dns_rdatatype_dnskey, dnskey, &buffer);
+ result = dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &key);
+ if (result != ISC_R_SUCCESS)
+ return;
+ result = dns_view_getsecroots(view, &sr);
+ if (result == ISC_R_SUCCESS) {
+ dns_keytable_deletekeynode(sr, key);
+ dns_keytable_detach(&sr);
+ }
+ dst_key_free(&key);
+}
+
+#define NZF ".nzf"
+
+void
+dns_view_setnewzones(dns_view_t *view, isc_boolean_t allow, void *cfgctx,
+ void (*cfg_destroy)(void **))
+{
+ REQUIRE(DNS_VIEW_VALID(view));
+ REQUIRE((cfgctx != NULL && cfg_destroy != NULL) || !allow);
+
+#ifdef BIND9
+ if (view->new_zone_file != NULL) {
+ isc_mem_free(view->mctx, view->new_zone_file);
+ view->new_zone_file = NULL;
+ }
+
+ if (view->new_zone_config != NULL) {
+ view->cfg_destroy(&view->new_zone_config);
+ view->cfg_destroy = NULL;
+ }
+
+ if (allow) {
+ char buffer[ISC_SHA256_DIGESTSTRINGLENGTH + sizeof(NZF)];
+ isc_sha256_data((void *)view->name, strlen(view->name), buffer);
+ /* Truncate the hash at 16 chars; full length is overkill */
+ isc_string_printf(buffer + 16, sizeof(NZF), "%s", NZF);
+ view->new_zone_file = isc_mem_strdup(view->mctx, buffer);
+ view->new_zone_config = cfgctx;
+ view->cfg_destroy = cfg_destroy;
+ }
+#else
+ UNUSED(allow);
+ UNUSED(cfgctx);
+ UNUSED(cfg_destroy);
+#endif
+}
diff --git a/contrib/bind9/lib/dns/xfrin.c b/contrib/bind9/lib/dns/xfrin.c
index b3f2e95..210bca9 100644
--- a/contrib/bind9/lib/dns/xfrin.c
+++ b/contrib/bind9/lib/dns/xfrin.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrin.c,v 1.166 2008-09-25 04:12:39 marka Exp $ */
+/* $Id: xfrin.c,v 1.166.522.2.2.1 2011-06-02 23:47:35 tbox Exp $ */
/*! \file */
@@ -83,8 +83,9 @@ typedef enum {
XFRST_IXFR_DEL,
XFRST_IXFR_ADDSOA,
XFRST_IXFR_ADD,
+ XFRST_IXFR_END,
XFRST_AXFR,
- XFRST_END
+ XFRST_AXFR_END
} xfrin_state_t;
/*%
@@ -203,6 +204,7 @@ static isc_result_t axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op,
dns_rdata_t *rdata);
static isc_result_t axfr_apply(dns_xfrin_ctx_t *xfr);
static isc_result_t axfr_commit(dns_xfrin_ctx_t *xfr);
+static isc_result_t axfr_finalize(dns_xfrin_ctx_t *xfr);
static isc_result_t ixfr_init(dns_xfrin_ctx_t *xfr);
static isc_result_t ixfr_apply(dns_xfrin_ctx_t *xfr);
@@ -318,6 +320,16 @@ axfr_commit(dns_xfrin_ctx_t *xfr) {
CHECK(axfr_apply(xfr));
CHECK(dns_db_endload(xfr->db, &xfr->axfr.add_private));
+
+ result = ISC_R_SUCCESS;
+ failure:
+ return (result);
+}
+
+static isc_result_t
+axfr_finalize(dns_xfrin_ctx_t *xfr) {
+ isc_result_t result;
+
CHECK(dns_zone_replacedb(xfr->zone, xfr->db, ISC_TRUE));
result = ISC_R_SUCCESS;
@@ -541,7 +553,7 @@ xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, isc_uint32_t ttl,
isc_uint32_t soa_serial = dns_soa_getserial(rdata);
if (soa_serial == xfr->end_serial) {
CHECK(ixfr_commit(xfr));
- xfr->state = XFRST_END;
+ xfr->state = XFRST_IXFR_END;
break;
} else if (soa_serial != xfr->ixfr.current_serial) {
xfrin_log(xfr, ISC_LOG_ERROR,
@@ -572,11 +584,12 @@ xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, isc_uint32_t ttl,
CHECK(axfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
if (rdata->type == dns_rdatatype_soa) {
CHECK(axfr_commit(xfr));
- xfr->state = XFRST_END;
+ xfr->state = XFRST_AXFR_END;
break;
}
break;
- case XFRST_END:
+ case XFRST_AXFR_END:
+ case XFRST_IXFR_END:
FAIL(DNS_R_EXTRADATA);
default:
INSIST(0);
@@ -1318,8 +1331,9 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
} else if (dns_message_gettsigkey(msg) != NULL) {
xfr->sincetsig++;
- if (xfr->sincetsig > 100 ||
- xfr->nmsg == 0 || xfr->state == XFRST_END)
+ if (xfr->sincetsig > 100 || xfr->nmsg == 0 ||
+ xfr->state == XFRST_AXFR_END ||
+ xfr->state == XFRST_IXFR_END)
{
result = DNS_R_EXPECTEDTSIG;
goto failure;
@@ -1345,16 +1359,22 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
dns_message_destroy(&msg);
- if (xfr->state == XFRST_GOTSOA) {
+ switch (xfr->state) {
+ case XFRST_GOTSOA:
xfr->reqtype = dns_rdatatype_axfr;
xfr->state = XFRST_INITIALSOA;
CHECK(xfrin_send_request(xfr));
- } else if (xfr->state == XFRST_END) {
+ break;
+ case XFRST_AXFR_END:
+ CHECK(axfr_finalize(xfr));
+ /* FALLTHROUGH */
+ case XFRST_IXFR_END:
/*
* Close the journal.
*/
if (xfr->ixfr.journal != NULL)
dns_journal_destroy(&xfr->ixfr.journal);
+
/*
* Inform the caller we succeeded.
*/
@@ -1368,7 +1388,8 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
*/
xfr->shuttingdown = ISC_TRUE;
maybe_free(xfr);
- } else {
+ break;
+ default:
/*
* Read the next message.
*/
diff --git a/contrib/bind9/lib/dns/zone.c b/contrib/bind9/lib/dns/zone.c
index 108aefb..c727c2e 100644
--- a/contrib/bind9/lib/dns/zone.c
+++ b/contrib/bind9/lib/dns/zone.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zone.c,v 1.483.36.23 2010-12-14 00:48:22 marka Exp $ */
+/* $Id: zone.c,v 1.582.8.7 2011-02-18 23:23:08 each Exp $ */
/*! \file */
@@ -47,6 +47,8 @@
#include <dns/dnssec.h>
#include <dns/events.h>
#include <dns/journal.h>
+#include <dns/keydata.h>
+#include <dns/keytable.h>
#include <dns/keyvalues.h>
#include <dns/log.h>
#include <dns/master.h>
@@ -56,6 +58,8 @@
#include <dns/nsec.h>
#include <dns/nsec3.h>
#include <dns/peer.h>
+#include <dns/private.h>
+#include <dns/rbt.h>
#include <dns/rcode.h>
#include <dns/rdataclass.h>
#include <dns/rdatalist.h>
@@ -66,6 +70,7 @@
#include <dns/request.h>
#include <dns/resolver.h>
#include <dns/result.h>
+#include <dns/rriterator.h>
#include <dns/soa.h>
#include <dns/ssu.h>
#include <dns/stats.h>
@@ -129,6 +134,7 @@ typedef struct dns_signing dns_signing_t;
typedef ISC_LIST(dns_signing_t) dns_signinglist_t;
typedef struct dns_nsec3chain dns_nsec3chain_t;
typedef ISC_LIST(dns_nsec3chain_t) dns_nsec3chainlist_t;
+typedef struct dns_keyfetch dns_keyfetch_t;
#define DNS_ZONE_CHECKLOCK
#ifdef DNS_ZONE_CHECKLOCK
@@ -200,6 +206,8 @@ struct dns_zone {
isc_time_t keywarntime;
isc_time_t signingtime;
isc_time_t nsec3chaintime;
+ isc_time_t refreshkeytime;
+ isc_uint32_t refreshkeycount;
isc_uint32_t refresh;
isc_uint32_t retry;
isc_uint32_t expire;
@@ -273,13 +281,13 @@ struct dns_zone {
/*%
* Statistics counters about zone management.
*/
- isc_stats_t *stats;
+ isc_stats_t *stats;
/*%
* Optional per-zone statistics counters. Counted outside of this
* module.
*/
- isc_boolean_t requeststats_on;
- isc_stats_t *requeststats;
+ isc_boolean_t requeststats_on;
+ isc_stats_t *requeststats;
isc_uint32_t notifydelay;
dns_isselffunc_t isself;
void *isselfarg;
@@ -304,6 +312,21 @@ struct dns_zone {
isc_uint32_t signatures;
isc_uint32_t nodes;
dns_rdatatype_t privatetype;
+
+ /*%
+ * Autosigning/key-maintenance options
+ */
+ isc_uint32_t keyopts;
+
+ /*%
+ * True if added by "rndc addzone"
+ */
+ isc_boolean_t added;
+
+ /*%
+ * whether a rpz radix was needed when last loaded
+ */
+ isc_boolean_t rpz_zone;
};
#define DNS_ZONE_FLAG(z,f) (ISC_TF(((z)->flags & (f)) != 0))
@@ -339,7 +362,7 @@ struct dns_zone {
* from SOA (if not set, we
* are still using
* default timer values) */
-#define DNS_ZONEFLG_FORCEXFER 0x00008000U /*%< Force a zone xfer */
+#define DNS_ZONEFLG_FORCEXFER 0x00008000U /*%< Force a zone xfer */
#define DNS_ZONEFLG_NOREFRESH 0x00010000U
#define DNS_ZONEFLG_DIALNOTIFY 0x00020000U
#define DNS_ZONEFLG_DIALREFRESH 0x00040000U
@@ -352,8 +375,11 @@ struct dns_zone {
#define DNS_ZONEFLG_NEEDCOMPACT 0x02000000U
#define DNS_ZONEFLG_REFRESHING 0x04000000U /*%< Refreshing keydata */
#define DNS_ZONEFLG_THAW 0x08000000U
+/* #define DNS_ZONEFLG_XXXXX 0x10000000U XXXMPA unused. */
+#define DNS_ZONEFLG_NODELAY 0x20000000U
#define DNS_ZONE_OPTION(z,o) (((z)->options & (o)) != 0)
+#define DNS_ZONEKEY_OPTION(z,o) (((z)->keyopts & (o)) != 0)
/* Flags for zone_load() */
#define DNS_ZONELOADFLAG_NOSTAT 0x00000001U /* Do not stat() master files */
@@ -484,7 +510,7 @@ struct dns_io {
* DNSKEY as result of an update.
*/
struct dns_signing {
- unsigned int magic;
+ unsigned int magic;
dns_db_t *db;
dns_dbiterator_t *dbiterator;
dns_secalg_t algorithm;
@@ -495,15 +521,15 @@ struct dns_signing {
};
struct dns_nsec3chain {
- unsigned int magic;
+ unsigned int magic;
dns_db_t *db;
dns_dbiterator_t *dbiterator;
dns_rdata_nsec3param_t nsec3param;
unsigned char salt[255];
isc_boolean_t done;
- isc_boolean_t seen_nsec;
- isc_boolean_t delete_nsec;
- isc_boolean_t save_delete_nsec;
+ isc_boolean_t seen_nsec;
+ isc_boolean_t delete_nsec;
+ isc_boolean_t save_delete_nsec;
ISC_LINK(dns_nsec3chain_t) link;
};
/*%<
@@ -528,6 +554,19 @@ struct dns_nsec3chain {
* so it can be recovered in the event of a error.
*/
+struct dns_keyfetch {
+ dns_fixedname_t name;
+ dns_rdataset_t keydataset;
+ dns_rdataset_t dnskeyset;
+ dns_rdataset_t dnskeysigset;
+ dns_zone_t *zone;
+ dns_db_t *db;
+ dns_fetch_t *fetch;
+};
+
+#define HOUR 3600
+#define DAY (24*HOUR)
+#define MONTH (30*DAY)
#define SEND_BUFFER_SIZE 2048
@@ -538,6 +577,10 @@ static void zone_debuglog(dns_zone_t *zone, const char *, int debuglevel,
static void notify_log(dns_zone_t *zone, int level, const char *fmt, ...)
ISC_FORMAT_PRINTF(3, 4);
static void queue_xfrin(dns_zone_t *zone);
+static isc_result_t update_one_rr(dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, dns_diffop_t op,
+ dns_name_t *name, dns_ttl_t ttl,
+ dns_rdata_t *rdata);
static void zone_unload(dns_zone_t *zone);
static void zone_expire(dns_zone_t *zone);
static void zone_iattach(dns_zone_t *source, dns_zone_t **target);
@@ -613,6 +656,10 @@ static isc_boolean_t dns_zonemgr_unreachable(dns_zonemgr_t *zmgr,
isc_time_t *now);
static isc_result_t zone_signwithkey(dns_zone_t *zone, dns_secalg_t algorithm,
isc_uint16_t keyid, isc_boolean_t delete);
+static isc_result_t delete_nsec(dns_db_t *db, dns_dbversion_t *ver,
+ dns_dbnode_t *node, dns_name_t *name,
+ dns_diff_t *diff);
+static void zone_rekey(dns_zone_t *zone);
#define ENTER zone_debuglog(zone, me, 1, "enter")
@@ -710,6 +757,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
zone->type = dns_zone_none;
zone->flags = 0;
zone->options = 0;
+ zone->keyopts = 0;
zone->db_argc = 0;
zone->db_argv = NULL;
isc_time_settoepoch(&zone->expiretime);
@@ -721,6 +769,8 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
isc_time_settoepoch(&zone->keywarntime);
isc_time_settoepoch(&zone->signingtime);
isc_time_settoepoch(&zone->nsec3chaintime);
+ isc_time_settoepoch(&zone->refreshkeytime);
+ zone->refreshkeycount = 0;
zone->refresh = DNS_ZONE_DEFAULTREFRESH;
zone->retry = DNS_ZONE_DEFAULTRETRY;
zone->expire = 0;
@@ -787,6 +837,8 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
zone->signatures = 10;
zone->nodes = 100;
zone->privatetype = (dns_rdatatype_t)0xffffU;
+ zone->added = ISC_FALSE;
+ zone->rpz_zone = ISC_FALSE;
zone->magic = ZONE_MAGIC;
@@ -1304,8 +1356,8 @@ dns_zone_getjournal(dns_zone_t *zone) {
* master file (if any) is written by the server, rather than being
* updated manually and read by the server.
*
- * This is true for slave zones, stub zones, and zones that allow
- * dynamic updates either by having an update policy ("ssutable")
+ * This is true for slave zones, stub zones, key zones, and zones that
+ * allow dynamic updates either by having an update policy ("ssutable")
* or an "allow-update" ACL with a value other than exactly "{ none; }".
*/
static isc_boolean_t
@@ -1314,6 +1366,7 @@ zone_isdynamic(dns_zone_t *zone) {
return (ISC_TF(zone->type == dns_zone_slave ||
zone->type == dns_zone_stub ||
+ zone->type == dns_zone_key ||
(!zone->update_disabled && zone->ssutable != NULL) ||
(!zone->update_disabled && zone->update_acl != NULL &&
!dns_acl_isnone(zone->update_acl))));
@@ -1383,11 +1436,12 @@ zone_load(dns_zone_t *zone, unsigned int flags) {
*/
if (zone->masterfile != NULL) {
/*
- * The file is already loaded. If we are just doing a
+ * The file is already loaded. If we are just doing a
* "rndc reconfig", we are done.
*/
if (!isc_time_isepoch(&zone->loadtime) &&
- (flags & DNS_ZONELOADFLAG_NOSTAT) != 0) {
+ (flags & DNS_ZONELOADFLAG_NOSTAT) != 0 &&
+ zone->rpz_zone == dns_rpz_needed()) {
result = ISC_R_SUCCESS;
goto cleanup;
}
@@ -1396,7 +1450,8 @@ zone_load(dns_zone_t *zone, unsigned int flags) {
if (result == ISC_R_SUCCESS) {
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) &&
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_HASINCLUDE) &&
- isc_time_compare(&filetime, &zone->loadtime) <= 0) {
+ isc_time_compare(&filetime, &zone->loadtime) <= 0 &&
+ zone->rpz_zone == dns_rpz_needed()) {
dns_zone_log(zone, ISC_LOG_DEBUG(1),
"skipping load: master file "
"older than last load");
@@ -1404,6 +1459,7 @@ zone_load(dns_zone_t *zone, unsigned int flags) {
goto cleanup;
}
loadtime = filetime;
+ zone->rpz_zone = dns_rpz_needed();
}
}
@@ -1526,6 +1582,8 @@ get_master_options(dns_zone_t *zone) {
options = DNS_MASTER_ZONE;
if (zone->type == dns_zone_slave)
options |= DNS_MASTER_SLAVE;
+ if (zone->type == dns_zone_key)
+ options |= DNS_MASTER_KEY;
if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKNS))
options |= DNS_MASTER_CHECKNS;
if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_FATALNS))
@@ -1541,7 +1599,8 @@ get_master_options(dns_zone_t *zone) {
if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKWILDCARD))
options |= DNS_MASTER_CHECKWILDCARD;
if (zone->type == dns_zone_master &&
- (zone->update_acl != NULL || zone->ssutable != NULL))
+ ((zone->update_acl != NULL && !dns_acl_isnone(zone->update_acl)) ||
+ zone->ssutable != NULL))
options |= DNS_MASTER_RESIGN;
return (options);
}
@@ -1740,11 +1799,12 @@ zone_check_mx(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,
dns_name_format(name, namebuf, sizeof namebuf);
if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||
result == DNS_R_EMPTYNAME) {
+ if (!DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKMXFAIL))
+ level = ISC_LOG_WARNING;
dns_zone_log(zone, level,
"%s/MX '%s' has no address records (A or AAAA)",
ownerbuf, namebuf);
- /* XXX950 make fatal for 9.5.0. */
- return (ISC_TRUE);
+ return ((level == ISC_LOG_WARNING) ? ISC_TRUE : ISC_FALSE);
}
if (result == DNS_R_CNAME) {
@@ -1986,6 +2046,113 @@ zone_check_glue(dns_zone_t *zone, dns_db_t *db, dns_name_t *name,
}
static isc_boolean_t
+zone_rrset_check_dup(dns_zone_t *zone, dns_name_t *owner,
+ dns_rdataset_t *rdataset)
+{
+ dns_rdataset_t tmprdataset;
+ isc_result_t result;
+ isc_boolean_t answer = ISC_TRUE;
+ isc_boolean_t format = ISC_TRUE;
+ int level = ISC_LOG_WARNING;
+ char ownerbuf[DNS_NAME_FORMATSIZE];
+ char typebuf[DNS_RDATATYPE_FORMATSIZE];
+ unsigned int count1 = 0;
+
+ if (DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKDUPRRFAIL))
+ level = ISC_LOG_ERROR;
+
+ dns_rdataset_init(&tmprdataset);
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ unsigned int count2 = 0;
+
+ count1++;
+ dns_rdataset_current(rdataset, &rdata1);
+ dns_rdataset_clone(rdataset, &tmprdataset);
+ for (result = dns_rdataset_first(&tmprdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&tmprdataset)) {
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+ count2++;
+ if (count1 >= count2)
+ continue;
+ dns_rdataset_current(&tmprdataset, &rdata2);
+ if (dns_rdata_casecompare(&rdata1, &rdata2) == 0) {
+ if (format) {
+ dns_name_format(owner, ownerbuf,
+ sizeof ownerbuf);
+ dns_rdatatype_format(rdata1.type,
+ typebuf,
+ sizeof(typebuf));
+ format = ISC_FALSE;
+ }
+ dns_zone_log(zone, level, "%s/%s has "
+ "semantically identical records",
+ ownerbuf, typebuf);
+ if (level == ISC_LOG_ERROR)
+ answer = ISC_FALSE;
+ break;
+ }
+ }
+ dns_rdataset_disassociate(&tmprdataset);
+ if (!format)
+ break;
+ }
+ return (answer);
+}
+
+static isc_boolean_t
+zone_check_dup(dns_zone_t *zone, dns_db_t *db) {
+ dns_dbiterator_t *dbiterator = NULL;
+ dns_dbnode_t *node = NULL;
+ dns_fixedname_t fixed;
+ dns_name_t *name;
+ dns_rdataset_t rdataset;
+ dns_rdatasetiter_t *rdsit = NULL;
+ isc_boolean_t ok = ISC_TRUE;
+ isc_result_t result;
+
+ dns_fixedname_init(&fixed);
+ name = dns_fixedname_name(&fixed);
+ dns_rdataset_init(&rdataset);
+
+ result = dns_db_createiterator(db, 0, &dbiterator);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_TRUE);
+
+ for (result = dns_dbiterator_first(dbiterator);
+ result == ISC_R_SUCCESS;
+ result = dns_dbiterator_next(dbiterator)) {
+ result = dns_dbiterator_current(dbiterator, &node, name);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ result = dns_db_allrdatasets(db, node, NULL, 0, &rdsit);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ for (result = dns_rdatasetiter_first(rdsit);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(rdsit)) {
+ dns_rdatasetiter_current(rdsit, &rdataset);
+ if (!zone_rrset_check_dup(zone, name, &rdataset))
+ ok = ISC_FALSE;
+ dns_rdataset_disassociate(&rdataset);
+ }
+ dns_rdatasetiter_destroy(&rdsit);
+ dns_db_detachnode(db, &node);
+ }
+
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ dns_dbiterator_destroy(&dbiterator);
+
+ return (ok);
+}
+
+static isc_boolean_t
integrity_checks(dns_zone_t *zone, dns_db_t *db) {
dns_dbiterator_t *dbiterator = NULL;
dns_dbnode_t *node = NULL;
@@ -2052,6 +2219,7 @@ integrity_checks(dns_zone_t *zone, dns_db_t *db) {
result = dns_rdataset_next(&rdataset);
}
dns_rdataset_disassociate(&rdataset);
+ goto next;
checkmx:
result = dns_db_findrdataset(db, node, NULL, dns_rdatatype_mx,
@@ -2104,7 +2272,7 @@ integrity_checks(dns_zone_t *zone, dns_db_t *db) {
/*
* OpenSSL verification of RSA keys with exponent 3 is known to be
- * broken prior OpenSSL 0.9.8c/0.9.7k. Look for such keys and warn
+ * broken prior OpenSSL 0.9.8c/0.9.7k. Look for such keys and warn
* if they are in use.
*/
static void
@@ -2168,7 +2336,6 @@ zone_check_dnskeys(dns_zone_t *zone, dns_db_t *db) {
dns_db_detachnode(db, &node);
if (version != NULL)
dns_db_closeversion(db, &version, ISC_FALSE);
-
}
static void
@@ -2189,15 +2356,18 @@ resume_signingwithkey(dns_zone_t *zone) {
zone->privatetype,
dns_rdatatype_none, 0,
&rdataset, NULL);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto cleanup;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset))
{
dns_rdataset_current(&rdataset, &rdata);
- if (rdata.length != 5 || rdata.data[4] != 0) {
+ if (rdata.length != 5 ||
+ rdata.data[0] == 0 || rdata.data[4] != 0) {
dns_rdata_reset(&rdata);
continue;
}
@@ -2219,7 +2389,6 @@ resume_signingwithkey(dns_zone_t *zone) {
dns_db_detachnode(zone->db, &node);
if (version != NULL)
dns_db_closeversion(zone->db, &version, ISC_FALSE);
-
}
static isc_result_t
@@ -2228,6 +2397,9 @@ zone_addnsec3chain(dns_zone_t *zone, dns_rdata_nsec3param_t *nsec3param) {
isc_result_t result;
isc_time_t now;
unsigned int options = 0;
+ char saltbuf[255*2+1];
+ char flags[sizeof("REMOVE|CREATE|NONSEC|OPTOUT")];
+ int i;
nsec3chain = isc_mem_get(zone->mctx, sizeof *nsec3chain);
if (nsec3chain == NULL)
@@ -2249,6 +2421,40 @@ zone_addnsec3chain(dns_zone_t *zone, dns_rdata_nsec3param_t *nsec3param) {
nsec3chain->delete_nsec = ISC_FALSE;
nsec3chain->save_delete_nsec = ISC_FALSE;
+ if (nsec3param->flags == 0)
+ strlcpy(flags, "NONE", sizeof(flags));
+ else {
+ flags[0] = '\0';
+ if (nsec3param->flags & DNS_NSEC3FLAG_REMOVE)
+ strlcat(flags, "REMOVE", sizeof(flags));
+ if (nsec3param->flags & DNS_NSEC3FLAG_CREATE) {
+ if (flags[0] == '\0')
+ strlcpy(flags, "CREATE", sizeof(flags));
+ else
+ strlcat(flags, "|CREATE", sizeof(flags));
+ }
+ if (nsec3param->flags & DNS_NSEC3FLAG_NONSEC) {
+ if (flags[0] == '\0')
+ strlcpy(flags, "NONSEC", sizeof(flags));
+ else
+ strlcat(flags, "|NONSEC", sizeof(flags));
+ }
+ if (nsec3param->flags & DNS_NSEC3FLAG_OPTOUT) {
+ if (flags[0] == '\0')
+ strlcpy(flags, "OPTOUT", sizeof(flags));
+ else
+ strlcat(flags, "|OPTOUT", sizeof(flags));
+ }
+ }
+ if (nsec3param->salt_length == 0)
+ strlcpy(saltbuf, "-", sizeof(saltbuf));
+ else
+ for (i = 0; i < nsec3param->salt_length; i++)
+ sprintf(&saltbuf[i*2], "%02X", nsec3chain->salt[i]);
+ dns_zone_log(zone, ISC_LOG_INFO,
+ "zone_addnsec3chain(%u,%s,%u,%s)",
+ nsec3param->hash, flags, nsec3param->iterations,
+ saltbuf);
for (current = ISC_LIST_HEAD(zone->nsec3chain);
current != NULL;
current = ISC_LIST_NEXT(current, link)) {
@@ -2298,11 +2504,13 @@ static void
resume_addnsec3chain(dns_zone_t *zone) {
dns_dbnode_t *node = NULL;
dns_dbversion_t *version = NULL;
- dns_rdata_t rdata = DNS_RDATA_INIT;
dns_rdataset_t rdataset;
isc_result_t result;
dns_rdata_nsec3param_t nsec3param;
+ if (zone->privatetype == 0)
+ return;
+
result = dns_db_findnode(zone->db, &zone->origin, ISC_FALSE, &node);
if (result != ISC_R_SUCCESS)
goto cleanup;
@@ -2310,17 +2518,25 @@ resume_addnsec3chain(dns_zone_t *zone) {
dns_db_currentversion(zone->db, &version);
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(zone->db, node, version,
- dns_rdatatype_nsec3param,
- dns_rdatatype_none, 0,
- &rdataset, NULL);
- if (result != ISC_R_SUCCESS)
+ zone->privatetype, dns_rdatatype_none,
+ 0, &rdataset, NULL);
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto cleanup;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset))
{
- dns_rdataset_current(&rdataset, &rdata);
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_t private = DNS_RDATA_INIT;
+
+ dns_rdataset_current(&rdataset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata, buf,
+ sizeof(buf)))
+ continue;
result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if ((nsec3param.flags & DNS_NSEC3FLAG_CREATE) != 0 ||
@@ -2332,10 +2548,8 @@ resume_addnsec3chain(dns_zone_t *zone) {
dns_result_totext(result));
}
}
- dns_rdata_reset(&rdata);
}
dns_rdataset_disassociate(&rdataset);
-
cleanup:
if (node != NULL)
dns_db_detachnode(zone->db, &node);
@@ -2353,8 +2567,8 @@ set_resigntime(dns_zone_t *zone) {
dns_rdataset_init(&rdataset);
dns_fixedname_init(&fixed);
- result = dns_db_getsigningtime(zone->db, &rdataset,
- dns_fixedname_name(&fixed));
+ result = dns_db_getsigningtime(zone->db, &rdataset,
+ dns_fixedname_name(&fixed));
if (result != ISC_R_SUCCESS) {
isc_time_settoepoch(&zone->resigntime);
return;
@@ -2392,10 +2606,12 @@ check_nsec3param(dns_zone_t *zone, dns_db_t *db) {
dns_rdatatype_nsec3param,
dns_rdatatype_none, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
result = ISC_R_SUCCESS;
goto cleanup;
}
if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
dns_zone_log(zone, ISC_LOG_ERROR,
"nsec3param lookup failure: %s",
dns_result_totext(result));
@@ -2456,6 +2672,642 @@ check_nsec3param(dns_zone_t *zone, dns_db_t *db) {
return (result);
}
+/*
+ * Set the timer for refreshing the key zone to the soonest future time
+ * of the set (current timer, keydata->refresh, keydata->addhd,
+ * keydata->removehd).
+ */
+static void
+set_refreshkeytimer(dns_zone_t *zone, dns_rdata_keydata_t *key,
+ isc_stdtime_t now) {
+ const char me[] = "set_refreshkeytimer";
+ isc_stdtime_t then;
+ isc_time_t timenow, timethen;
+ char timebuf[80];
+
+ ENTER;
+ then = key->refresh;
+ if (key->addhd > now && key->addhd < then)
+ then = key->addhd;
+ if (key->removehd > now && key->removehd < then)
+ then = key->removehd;
+
+ TIME_NOW(&timenow);
+ if (then > now)
+ DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen);
+ else
+ timethen = timenow;
+ if (isc_time_compare(&zone->refreshkeytime, &timenow) < 0 ||
+ isc_time_compare(&timethen, &zone->refreshkeytime) < 0)
+ zone->refreshkeytime = timethen;
+
+ isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
+ dns_zone_log(zone, ISC_LOG_DEBUG(1), "next key refresh: %s", timebuf);
+ zone_settimer(zone, &timenow);
+}
+
+/*
+ * Convert key(s) linked from 'keynode' to KEYDATA and add to the key zone.
+ * If the key zone is changed, set '*changed' to ISC_TRUE.
+ */
+static isc_result_t
+create_keydata(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, dns_keytable_t *keytable,
+ dns_keynode_t **keynodep, isc_boolean_t *changed)
+{
+ const char me[] = "create_keydata";
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_buffer_t keyb, dstb;
+ unsigned char key_buf[4096], dst_buf[DST_KEY_MAXSIZE];
+ dns_rdata_keydata_t keydata;
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_keynode_t *keynode;
+ isc_stdtime_t now;
+ isc_region_t r;
+ dst_key_t *key;
+
+ REQUIRE(keynodep != NULL);
+ keynode = *keynodep;
+
+ ENTER;
+ isc_stdtime_get(&now);
+
+ /* Loop in case there's more than one key. */
+ while (result == ISC_R_SUCCESS) {
+ dns_keynode_t *nextnode = NULL;
+
+ key = dns_keynode_key(keynode);
+ if (key == NULL)
+ goto skip;
+
+ isc_buffer_init(&dstb, dst_buf, sizeof(dst_buf));
+ CHECK(dst_key_todns(key, &dstb));
+
+ /* Convert DST key to DNSKEY. */
+ dns_rdata_reset(&rdata);
+ isc_buffer_usedregion(&dstb, &r);
+ dns_rdata_fromregion(&rdata, dst_key_class(key),
+ dns_rdatatype_dnskey, &r);
+
+ /* DSTKEY to KEYDATA. */
+ CHECK(dns_rdata_tostruct(&rdata, &dnskey, NULL));
+ CHECK(dns_keydata_fromdnskey(&keydata, &dnskey, now, 0, 0,
+ NULL));
+
+ /* KEYDATA to rdata. */
+ dns_rdata_reset(&rdata);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ CHECK(dns_rdata_fromstruct(&rdata,
+ zone->rdclass, dns_rdatatype_keydata,
+ &keydata, &keyb));
+
+ /* Add rdata to zone. */
+ CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_ADD,
+ dst_key_name(key), 0, &rdata));
+ *changed = ISC_TRUE;
+
+ skip:
+ result = dns_keytable_nextkeynode(keytable, keynode, &nextnode);
+ if (result != ISC_R_NOTFOUND) {
+ dns_keytable_detachkeynode(keytable, &keynode);
+ keynode = nextnode;
+ }
+ }
+
+ /* Refresh new keys from the zone apex as soon as possible. */
+ if (*changed)
+ set_refreshkeytimer(zone, &keydata, now);
+
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(keytable, &keynode);
+ *keynodep = NULL;
+
+ return (ISC_R_SUCCESS);
+
+ failure:
+ return (result);
+}
+
+/*
+ * Remove from the key zone all the KEYDATA records found in rdataset.
+ */
+static isc_result_t
+delete_keydata(dns_db_t *db, dns_dbversion_t *ver, dns_diff_t *diff,
+ dns_name_t *name, dns_rdataset_t *rdataset)
+{
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ isc_result_t result, uresult;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+ uresult = update_one_rr(db, ver, diff, DNS_DIFFOP_DEL,
+ name, 0, &rdata);
+ if (uresult != ISC_R_SUCCESS)
+ return (uresult);
+ }
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+ return (result);
+}
+
+/*
+ * Compute the DNSSEC key ID for a DNSKEY record.
+ */
+static isc_result_t
+compute_tag(dns_name_t *name, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx,
+ dns_keytag_t *tag)
+{
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned char data[4096];
+ isc_buffer_t buffer;
+ dst_key_t *dstkey = NULL;
+
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+ dns_rdatatype_dnskey, dnskey, &buffer);
+
+ result = dns_dnssec_keyfromrdata(name, &rdata, mctx, &dstkey);
+ if (result == ISC_R_SUCCESS)
+ *tag = dst_key_id(dstkey);
+ dst_key_free(&dstkey);
+
+ return (result);
+}
+
+/*
+ * Add key to the security roots for all views.
+ */
+static void
+trust_key(dns_viewlist_t *viewlist, dns_name_t *keyname,
+ dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx) {
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned char data[4096];
+ isc_buffer_t buffer;
+ dns_view_t *view;
+ dns_keytable_t *sr = NULL;
+ dst_key_t *dstkey = NULL;
+
+ /* Convert dnskey to DST key. */
+ isc_buffer_init(&buffer, data, sizeof(data));
+ dns_rdata_fromstruct(&rdata, dnskey->common.rdclass,
+ dns_rdatatype_dnskey, dnskey, &buffer);
+
+ for (view = ISC_LIST_HEAD(*viewlist); view != NULL;
+ view = ISC_LIST_NEXT(view, link)) {
+
+ result = dns_view_getsecroots(view, &sr);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ CHECK(dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &dstkey));
+ CHECK(dns_keytable_add(sr, ISC_TRUE, &dstkey));
+ dns_keytable_detach(&sr);
+ }
+
+ failure:
+ if (dstkey != NULL)
+ dst_key_free(&dstkey);
+ if (sr != NULL)
+ dns_keytable_detach(&sr);
+ return;
+}
+
+/*
+ * Remove key from the security roots for all views.
+ */
+static void
+untrust_key(dns_viewlist_t *viewlist, dns_name_t *keyname, isc_mem_t *mctx,
+ dns_rdata_dnskey_t *dnskey)
+{
+ dns_view_t *view;
+
+ for (view = ISC_LIST_HEAD(*viewlist); view != NULL;
+ view = ISC_LIST_NEXT(view, link))
+ dns_view_untrust(view, keyname, dnskey, mctx);
+}
+
+/*
+ * Add a null key to the security roots for all views, so that all queries
+ * to the zone will fail.
+ */
+static void
+fail_secure(dns_viewlist_t *viewlist, dns_name_t *keyname) {
+ isc_result_t result;
+ dns_view_t *view;
+
+ for (view = ISC_LIST_HEAD(*viewlist);
+ view != NULL;
+ view = ISC_LIST_NEXT(view, link)) {
+ dns_keytable_t *sr = NULL;
+
+ result = dns_view_getsecroots(view, &sr);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ dns_keytable_marksecure(sr, keyname);
+ dns_keytable_detach(&sr);
+ }
+}
+
+/*
+ * Scan a set of KEYDATA records from the key zone. The ones that are
+ * valid (i.e., the add holddown timer has expired) become trusted keys for
+ * all views.
+ */
+static void
+load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) {
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_keydata_t keydata;
+ dns_rdata_dnskey_t dnskey;
+ isc_mem_t *mctx = zone->mctx;
+ dns_view_t *view = zone->view;
+ dns_viewlist_t *viewlist = view->viewlist;
+ int trusted = 0, revoked = 0, pending = 0;
+ isc_stdtime_t now;
+
+ isc_stdtime_get(&now);
+
+ /* For each view, delete references to this key from secroots. */
+ for (view = ISC_LIST_HEAD(*viewlist); view != NULL;
+ view = ISC_LIST_NEXT(view, link)) {
+ dns_keytable_t *sr = NULL;
+
+ result = dns_view_getsecroots(view, &sr);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ dns_keytable_delete(sr, name);
+ dns_keytable_detach(&sr);
+ }
+
+ /* Now insert all the accepted trust anchors from this keydata set. */
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+
+ /* Convert rdata to keydata. */
+ dns_rdata_tostruct(&rdata, &keydata, NULL);
+
+ /* Set the key refresh timer. */
+ set_refreshkeytimer(zone, &keydata, now);
+
+ /* If the removal timer is nonzero, this key was revoked. */
+ if (keydata.removehd != 0) {
+ revoked++;
+ continue;
+ }
+
+ /*
+ * If the add timer is still pending, this key is not
+ * trusted yet.
+ */
+ if (now < keydata.addhd) {
+ pending++;
+ continue;
+ }
+
+ /* Convert keydata to dnskey. */
+ dns_keydata_todnskey(&keydata, &dnskey, NULL);
+
+ /* Add to keytables. */
+ trusted++;
+ trust_key(viewlist, name, &dnskey, mctx);
+ }
+
+ if (trusted == 0 && pending != 0) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "No valid trust anchors for '%s'!", namebuf);
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "%d key(s) revoked, %d still pending",
+ revoked, pending);
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "All queries to '%s' will fail", namebuf);
+ fail_secure(viewlist, name);
+ }
+}
+
+static isc_result_t
+do_one_tuple(dns_difftuple_t **tuple, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ dns_diff_t temp_diff;
+ isc_result_t result;
+
+ /*
+ * Create a singleton diff.
+ */
+ dns_diff_init(diff->mctx, &temp_diff);
+ temp_diff.resign = diff->resign;
+ ISC_LIST_APPEND(temp_diff.tuples, *tuple, link);
+
+ /*
+ * Apply it to the database.
+ */
+ result = dns_diff_apply(&temp_diff, db, ver);
+ ISC_LIST_UNLINK(temp_diff.tuples, *tuple, link);
+ if (result != ISC_R_SUCCESS) {
+ dns_difftuple_free(tuple);
+ return (result);
+ }
+
+ /*
+ * Merge it into the current pending journal entry.
+ */
+ dns_diff_appendminimal(diff, tuple);
+
+ /*
+ * Do not clear temp_diff.
+ */
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+update_one_rr(dns_db_t *db, dns_dbversion_t *ver, dns_diff_t *diff,
+ dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
+ dns_rdata_t *rdata)
+{
+ dns_difftuple_t *tuple = NULL;
+ isc_result_t result;
+ result = dns_difftuple_create(diff->mctx, op,
+ name, ttl, rdata, &tuple);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ return (do_one_tuple(&tuple, db, ver, diff));
+}
+
+static isc_result_t
+increment_soa_serial(dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, isc_mem_t *mctx) {
+ dns_difftuple_t *deltuple = NULL;
+ dns_difftuple_t *addtuple = NULL;
+ isc_uint32_t serial;
+ isc_result_t result;
+
+ CHECK(dns_db_createsoatuple(db, ver, mctx, DNS_DIFFOP_DEL, &deltuple));
+ CHECK(dns_difftuple_copy(deltuple, &addtuple));
+ addtuple->op = DNS_DIFFOP_ADD;
+
+ serial = dns_soa_getserial(&addtuple->rdata);
+
+ /* RFC1982 */
+ serial = (serial + 1) & 0xFFFFFFFF;
+ if (serial == 0)
+ serial = 1;
+
+ dns_soa_setserial(serial, &addtuple->rdata);
+ CHECK(do_one_tuple(&deltuple, db, ver, diff));
+ CHECK(do_one_tuple(&addtuple, db, ver, diff));
+ result = ISC_R_SUCCESS;
+
+ failure:
+ if (addtuple != NULL)
+ dns_difftuple_free(&addtuple);
+ if (deltuple != NULL)
+ dns_difftuple_free(&deltuple);
+ return (result);
+}
+
+/*
+ * Write all transactions in 'diff' to the zone journal file.
+ */
+static isc_result_t
+zone_journal(dns_zone_t *zone, dns_diff_t *diff, const char *caller) {
+ const char me[] = "zone_journal";
+ const char *journalfile;
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_journal_t *journal = NULL;
+
+ ENTER;
+ journalfile = dns_zone_getjournal(zone);
+ if (journalfile != NULL) {
+ result = dns_journal_open(zone->mctx, journalfile,
+ ISC_TRUE, &journal);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "%s:dns_journal_open -> %s\n",
+ caller, dns_result_totext(result));
+ return (result);
+ }
+
+ result = dns_journal_write_transaction(journal, diff);
+ dns_journal_destroy(&journal);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "%s:dns_journal_write_transaction -> %s\n",
+ caller, dns_result_totext(result));
+ return (result);
+ }
+ }
+ return (result);
+}
+
+/*
+ * Create an SOA record for a newly-created zone
+ */
+static isc_result_t
+add_soa(dns_zone_t *zone, dns_db_t *db) {
+ isc_result_t result;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ unsigned char buf[DNS_SOA_BUFFERSIZE];
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+
+ dns_zone_log(zone, ISC_LOG_DEBUG(1), "creating SOA");
+
+ dns_diff_init(zone->mctx, &diff);
+ result = dns_db_newversion(db, &ver);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "add_soa:dns_db_newversion -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ /* Build SOA record */
+ result = dns_soa_buildrdata(&zone->origin, dns_rootname, zone->rdclass,
+ 0, 0, 0, 0, 0, buf, &rdata);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "add_soa:dns_soa_buildrdata -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ result = update_one_rr(db, ver, &diff, DNS_DIFFOP_ADD,
+ &zone->origin, 0, &rdata);
+
+failure:
+ dns_diff_clear(&diff);
+ if (ver != NULL)
+ dns_db_closeversion(db, &ver, ISC_TF(result == ISC_R_SUCCESS));
+
+ return (result);
+}
+
+/*
+ * Synchronize the set of initializing keys found in managed-keys {}
+ * statements with the set of trust anchors found in the managed-keys.bind
+ * zone. If a domain is no longer named in managed-keys, delete all keys
+ * from that domain from the key zone. If a domain is mentioned in in
+ * managed-keys but there are no references to it in the key zone, load
+ * the key zone with the initializing key(s) for that domain.
+ */
+static isc_result_t
+sync_keyzone(dns_zone_t *zone, dns_db_t *db) {
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_boolean_t changed = ISC_FALSE;
+ dns_rbtnodechain_t chain;
+ dns_fixedname_t fn;
+ dns_name_t foundname, *origin;
+ dns_keynode_t *keynode = NULL;
+ dns_view_t *view = zone->view;
+ dns_keytable_t *sr = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ dns_rriterator_t rrit;
+
+ dns_zone_log(zone, ISC_LOG_DEBUG(1), "synchronizing trusted keys");
+
+ dns_name_init(&foundname, NULL);
+ dns_fixedname_init(&fn);
+ origin = dns_fixedname_name(&fn);
+
+ dns_diff_init(zone->mctx, &diff);
+
+ CHECK(dns_view_getsecroots(view, &sr));
+
+ result = dns_db_newversion(db, &ver);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sync_keyzone:dns_db_newversion -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ /*
+ * Walk the zone DB. If we find any keys whose names are no longer
+ * in managed-keys (or *are* in trusted-keys, meaning they are
+ * permanent and not RFC5011-maintained), delete them from the
+ * zone. Otherwise call load_secroots(), which loads keys into
+ * secroots as appropriate.
+ */
+ dns_rriterator_init(&rrit, db, ver, 0);
+ for (result = dns_rriterator_first(&rrit);
+ result == ISC_R_SUCCESS;
+ result = dns_rriterator_nextrrset(&rrit)) {
+ dns_rdataset_t *rdataset;
+ dns_name_t *rrname = NULL;
+ isc_uint32_t ttl;
+
+ dns_rriterator_current(&rrit, &rrname, &ttl,
+ &rdataset, NULL);
+ if (!dns_rdataset_isassociated(rdataset)) {
+ dns_rriterator_destroy(&rrit);
+ goto failure;
+ }
+
+ if (rdataset->type != dns_rdatatype_keydata)
+ continue;
+
+ result = dns_keytable_find(sr, rrname, &keynode);
+ if ((result != ISC_R_SUCCESS &&
+ result != DNS_R_PARTIALMATCH) ||
+ dns_keynode_managed(keynode) == ISC_FALSE) {
+ CHECK(delete_keydata(db, ver, &diff,
+ rrname, rdataset));
+ changed = ISC_TRUE;
+ } else {
+ load_secroots(zone, rrname, rdataset);
+ }
+
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(sr, &keynode);
+ }
+ dns_rriterator_destroy(&rrit);
+
+ /*
+ * Now walk secroots to find any managed keys that aren't
+ * in the zone. If we find any, we add them to the zone.
+ */
+ RWLOCK(&sr->rwlock, isc_rwlocktype_write);
+ dns_rbtnodechain_init(&chain, zone->mctx);
+ result = dns_rbtnodechain_first(&chain, sr->table, &foundname, origin);
+ if (result == ISC_R_NOTFOUND)
+ result = ISC_R_NOMORE;
+ while (result == DNS_R_NEWORIGIN || result == ISC_R_SUCCESS) {
+ dns_rbtnode_t *rbtnode = NULL;
+
+ dns_rbtnodechain_current(&chain, &foundname, origin, &rbtnode);
+ if (rbtnode->data == NULL)
+ goto skip;
+
+ dns_keytable_attachkeynode(sr, rbtnode->data, &keynode);
+ if (dns_keynode_managed(keynode)) {
+ dns_fixedname_t fname;
+ dns_name_t *keyname;
+ dst_key_t *key;
+
+ key = dns_keynode_key(keynode);
+ dns_fixedname_init(&fname);
+
+ if (key == NULL) /* fail_secure() was called. */
+ goto skip;
+
+ keyname = dst_key_name(key);
+ result = dns_db_find(db, keyname, ver,
+ dns_rdatatype_keydata,
+ DNS_DBFIND_NOWILD, 0, NULL,
+ dns_fixedname_name(&fname),
+ NULL, NULL);
+ if (result != ISC_R_SUCCESS)
+ result = create_keydata(zone, db, ver, &diff,
+ sr, &keynode, &changed);
+ if (result != ISC_R_SUCCESS)
+ break;
+ }
+ skip:
+ result = dns_rbtnodechain_next(&chain, &foundname, origin);
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(sr, &keynode);
+ }
+ RWUNLOCK(&sr->rwlock, isc_rwlocktype_write);
+
+ if (result == ISC_R_NOMORE)
+ result = ISC_R_SUCCESS;
+
+ if (changed) {
+ /* Write changes to journal file. */
+ result = increment_soa_serial(db, ver, &diff, zone->mctx);
+ if (result == ISC_R_SUCCESS)
+ zone_journal(zone, &diff, "sync_keyzone");
+
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+ zone_needdump(zone, 30);
+ }
+
+ failure:
+ if (keynode != NULL)
+ dns_keytable_detachkeynode(sr, &keynode);
+ if (sr != NULL)
+ dns_keytable_detach(&sr);
+ if (ver != NULL)
+ dns_db_closeversion(db, &ver, changed);
+ dns_diff_clear(&diff);
+
+ return (result);
+}
+
static isc_result_t
zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
isc_result_t result)
@@ -2467,6 +3319,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
isc_time_t now;
isc_boolean_t needdump = ISC_FALSE;
isc_boolean_t hasinclude = DNS_ZONE_FLAG(zone, DNS_ZONEFLG_HASINCLUDE);
+ isc_boolean_t nomaster = ISC_FALSE;
unsigned int options;
TIME_NOW(&now);
@@ -2488,12 +3341,16 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
"failed: %s",
zone->masterfile,
dns_result_totext(result));
- } else
+ } else {
dns_zone_log(zone, ISC_LOG_ERROR,
"loading from master file %s failed: %s",
zone->masterfile,
dns_result_totext(result));
- goto cleanup;
+ nomaster = ISC_TRUE;
+ }
+
+ if (zone->type != dns_zone_key)
+ goto cleanup;
}
dns_zone_log(zone, ISC_LOG_DEBUG(2),
@@ -2506,6 +3363,18 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_HASINCLUDE);
/*
+ * If there's no master file for a key zone, then the zone is new:
+ * create an SOA record. (We do this now, instead of later, so that
+ * if there happens to be a journal file, we can roll forward from
+ * a sane starting point.)
+ */
+ if (nomaster && zone->type == dns_zone_key) {
+ result = add_soa(zone, db);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ }
+
+ /*
* Apply update log, if any, on initial load.
*/
if (zone->journal != NULL &&
@@ -2552,7 +3421,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
result = zone_get_from_db(zone, db, &nscount, &soacount, &serial,
&refresh, &retry, &expire, &minimum,
&errors);
- if (result != ISC_R_SUCCESS) {
+ if (result != ISC_R_SUCCESS && zone->type != dns_zone_key) {
dns_zone_log(zone, ISC_LOG_ERROR,
"could not find NS and/or SOA records");
}
@@ -2563,6 +3432,7 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
*/
switch (zone->type) {
+ case dns_zone_dlz:
case dns_zone_master:
case dns_zone_slave:
case dns_zone_stub:
@@ -2594,6 +3464,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
goto cleanup;
}
+ if (zone->type == dns_zone_master &&
+ DNS_ZONE_OPTION(zone, DNS_ZONEOPT_CHECKDUPRR) &&
+ !zone_check_dup(zone, db)) {
+ result = DNS_R_BADZONE;
+ goto cleanup;
+ }
+
if (zone->db != NULL) {
/*
* This is checked in zone_replacedb() for slave zones
@@ -2621,12 +3498,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
goto cleanup;
} else if (!isc_serial_ge(serial, oldserial))
dns_zone_log(zone, ISC_LOG_ERROR,
- "zone serial has gone backwards");
+ "zone serial (%u/%u) has gone "
+ "backwards", serial, oldserial);
else if (serial == oldserial && !hasinclude)
dns_zone_log(zone, ISC_LOG_ERROR,
- "zone serial unchanged. "
+ "zone serial (%u) unchanged. "
"zone may fail to transfer "
- "to slaves.");
+ "to slaves.", serial);
}
if (zone->type == dns_zone_master &&
@@ -2672,6 +3550,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
zone->refreshtime = now;
}
break;
+
+ case dns_zone_key:
+ result = sync_keyzone(zone, db);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ break;
+
default:
UNEXPECTED_ERROR(__FILE__, __LINE__,
"unexpected zone type %d", zone->type);
@@ -2685,6 +3570,13 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
if (zone->type == dns_zone_master)
zone_check_dnskeys(zone, db);
+ /*
+ * Schedule DNSSEC key refresh.
+ */
+ if (zone->type == dns_zone_master &&
+ DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN))
+ zone->refreshkeytime = now;
+
#if 0
/* destroy notification example. */
{
@@ -2709,9 +3601,16 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
DNS_ZONE_SETFLAG(zone,
DNS_ZONEFLG_LOADED|DNS_ZONEFLG_NEEDNOTIFY);
}
+
result = ISC_R_SUCCESS;
- if (needdump)
- zone_needdump(zone, DNS_DUMP_DELAY);
+
+ if (needdump) {
+ if (zone->type == dns_zone_key)
+ zone_needdump(zone, 30);
+ else
+ zone_needdump(zone, DNS_DUMP_DELAY);
+ }
+
if (zone->task != NULL) {
if (zone->type == dns_zone_master) {
set_resigntime(zone);
@@ -2723,13 +3622,14 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
if (! dns_db_ispersistent(db))
dns_zone_log(zone, ISC_LOG_INFO, "loaded serial %u%s", serial,
- dns_db_issecure(db) ? " (signed)" : "");
+ dns_db_issecure(db) ? " (DNSSEC signed)" : "");
return (result);
cleanup:
if (zone->type == dns_zone_slave ||
- zone->type == dns_zone_stub) {
+ zone->type == dns_zone_stub ||
+ zone->type == dns_zone_key) {
if (zone->journal != NULL)
zone_saveunique(zone, zone->journal, "jn-XXXXXXXX");
if (zone->masterfile != NULL)
@@ -2763,7 +3663,9 @@ exit_check(dns_zone_t *zone) {
}
static isc_boolean_t
-zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_name_t *name) {
+zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ dns_name_t *name, isc_boolean_t logit)
+{
isc_result_t result;
char namebuf[DNS_NAME_FORMATSIZE];
char altbuf[DNS_NAME_FORMATSIZE];
@@ -2782,42 +3684,45 @@ zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_name_t *name) {
dns_fixedname_init(&fixed);
foundname = dns_fixedname_name(&fixed);
- result = dns_db_find(db, name, NULL, dns_rdatatype_a,
+ result = dns_db_find(db, name, version, dns_rdatatype_a,
0, 0, NULL, foundname, NULL, NULL);
if (result == ISC_R_SUCCESS)
return (ISC_TRUE);
if (result == DNS_R_NXRRSET) {
- result = dns_db_find(db, name, NULL, dns_rdatatype_aaaa,
+ result = dns_db_find(db, name, version, dns_rdatatype_aaaa,
0, 0, NULL, foundname, NULL, NULL);
if (result == ISC_R_SUCCESS)
return (ISC_TRUE);
}
- dns_name_format(name, namebuf, sizeof namebuf);
if (result == DNS_R_NXRRSET || result == DNS_R_NXDOMAIN ||
result == DNS_R_EMPTYNAME) {
- dns_zone_log(zone, level,
- "NS '%s' has no address records (A or AAAA)",
- namebuf);
- /* XXX950 Make fatal ISC_FALSE for 9.5.0. */
- return (ISC_TRUE);
+ if (logit) {
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_zone_log(zone, level, "NS '%s' has no address "
+ "records (A or AAAA)", namebuf);
+ }
+ return (ISC_FALSE);
}
if (result == DNS_R_CNAME) {
- dns_zone_log(zone, level, "NS '%s' is a CNAME (illegal)",
- namebuf);
- /* XXX950 Make fatal ISC_FALSE for 9.5.0. */
- return (ISC_TRUE);
+ if (logit) {
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_zone_log(zone, level, "NS '%s' is a CNAME "
+ "(illegal)", namebuf);
+ }
+ return (ISC_FALSE);
}
if (result == DNS_R_DNAME) {
- dns_name_format(foundname, altbuf, sizeof altbuf);
- dns_zone_log(zone, level,
- "NS '%s' is below a DNAME '%s' (illegal)",
- namebuf, altbuf);
- /* XXX950 Make fatal ISC_FALSE for 9.5.0. */
- return (ISC_TRUE);
+ if (logit) {
+ dns_name_format(name, namebuf, sizeof namebuf);
+ dns_name_format(foundname, altbuf, sizeof altbuf);
+ dns_zone_log(zone, level, "NS '%s' is below a DNAME "
+ "'%s' (illegal)", namebuf, altbuf);
+ }
+ return (ISC_FALSE);
}
return (ISC_TRUE);
@@ -2826,7 +3731,7 @@ zone_check_ns(dns_zone_t *zone, dns_db_t *db, dns_name_t *name) {
static isc_result_t
zone_count_ns_rr(dns_zone_t *zone, dns_db_t *db, dns_dbnode_t *node,
dns_dbversion_t *version, unsigned int *nscount,
- unsigned int *errors)
+ unsigned int *errors, isc_boolean_t logit)
{
isc_result_t result;
unsigned int count = 0;
@@ -2838,10 +3743,14 @@ zone_count_ns_rr(dns_zone_t *zone, dns_db_t *db, dns_dbnode_t *node,
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(db, node, version, dns_rdatatype_ns,
dns_rdatatype_none, 0, &rdataset, NULL);
- if (result == ISC_R_NOTFOUND)
+ if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto success;
- if (result != ISC_R_SUCCESS)
+ }
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto invalidate_rdataset;
+ }
result = dns_rdataset_first(&rdataset);
while (result == ISC_R_SUCCESS) {
@@ -2853,7 +3762,7 @@ zone_count_ns_rr(dns_zone_t *zone, dns_db_t *db, dns_dbnode_t *node,
result = dns_rdata_tostruct(&rdata, &ns, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (dns_name_issubdomain(&ns.name, &zone->origin) &&
- !zone_check_ns(zone, db, &ns.name))
+ !zone_check_ns(zone, db, version, &ns.name, logit))
ecount++;
}
count++;
@@ -2892,6 +3801,7 @@ zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa,
dns_rdatatype_none, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
if (soacount != NULL)
*soacount = 0;
if (serial != NULL)
@@ -2907,8 +3817,10 @@ zone_load_soa_rr(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
result = ISC_R_SUCCESS;
goto invalidate_rdataset;
}
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto invalidate_rdataset;
+ }
count = 0;
result = dns_rdataset_first(&rdataset);
@@ -2960,15 +3872,14 @@ zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
isc_uint32_t *expire, isc_uint32_t *minimum,
unsigned int *errors)
{
- dns_dbversion_t *version;
isc_result_t result;
isc_result_t answer = ISC_R_SUCCESS;
+ dns_dbversion_t *version = NULL;
dns_dbnode_t *node;
REQUIRE(db != NULL);
REQUIRE(zone != NULL);
- version = NULL;
dns_db_currentversion(db, &version);
node = NULL;
@@ -2980,7 +3891,7 @@ zone_get_from_db(dns_zone_t *zone, dns_db_t *db, unsigned int *nscount,
if (nscount != NULL || errors != NULL) {
result = zone_count_ns_rr(zone, db, node, version,
- nscount, errors);
+ nscount, errors, ISC_TRUE);
if (result != ISC_R_SUCCESS)
answer = result;
}
@@ -3028,7 +3939,7 @@ dns_zone_detach(dns_zone_t **zonep) {
*/
if (zone->task != NULL) {
/*
- * This zone is being managed. Post
+ * This zone is being managed. Post
* its control event and let it clean
* up synchronously in the context of
* its task.
@@ -3163,6 +4074,27 @@ dns_zone_getoptions(dns_zone_t *zone) {
return (zone->options);
}
+void
+dns_zone_setkeyopt(dns_zone_t *zone, unsigned int keyopt, isc_boolean_t value)
+{
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ LOCK_ZONE(zone);
+ if (value)
+ zone->keyopts |= keyopt;
+ else
+ zone->keyopts &= ~keyopt;
+ UNLOCK_ZONE(zone);
+}
+
+unsigned int
+dns_zone_getkeyopts(dns_zone_t *zone) {
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ return (zone->keyopts);
+}
+
isc_result_t
dns_zone_setxfrsource4(dns_zone_t *zone, const isc_sockaddr_t *xfrsource) {
REQUIRE(DNS_ZONE_VALID(zone));
@@ -3499,6 +4431,17 @@ dns_zone_getdb(dns_zone_t *zone, dns_db_t **dpb) {
return (result);
}
+void
+dns_zone_setdb(dns_zone_t *zone, dns_db_t *db) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(zone->type == dns_zone_staticstub);
+
+ ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_write);
+ REQUIRE(zone->db == NULL);
+ dns_db_attach(db, &zone->db);
+ ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write);
+}
+
/*
* Co-ordinates the starting of routine jobs.
*/
@@ -3535,126 +4478,6 @@ was_dumping(dns_zone_t *zone) {
#define MAXZONEKEYS 10
static isc_result_t
-do_one_tuple(dns_difftuple_t **tuple, dns_db_t *db, dns_dbversion_t *ver,
- dns_diff_t *diff)
-{
- dns_diff_t temp_diff;
- isc_result_t result;
-
- /*
- * Create a singleton diff.
- */
- dns_diff_init(diff->mctx, &temp_diff);
- temp_diff.resign = diff->resign;
- ISC_LIST_APPEND(temp_diff.tuples, *tuple, link);
-
- /*
- * Apply it to the database.
- */
- result = dns_diff_apply(&temp_diff, db, ver);
- ISC_LIST_UNLINK(temp_diff.tuples, *tuple, link);
- if (result != ISC_R_SUCCESS) {
- dns_difftuple_free(tuple);
- return (result);
- }
-
- /*
- * Merge it into the current pending journal entry.
- */
- dns_diff_appendminimal(diff, tuple);
-
- /*
- * Do not clear temp_diff.
- */
- return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-increment_soa_serial(dns_db_t *db, dns_dbversion_t *ver,
- dns_diff_t *diff, isc_mem_t *mctx)
-{
- dns_difftuple_t *deltuple = NULL;
- dns_difftuple_t *addtuple = NULL;
- isc_uint32_t serial;
- isc_result_t result;
-
- CHECK(dns_db_createsoatuple(db, ver, mctx, DNS_DIFFOP_DEL, &deltuple));
- CHECK(dns_difftuple_copy(deltuple, &addtuple));
- addtuple->op = DNS_DIFFOP_ADD;
-
- serial = dns_soa_getserial(&addtuple->rdata);
-
- /* RFC1982 */
- serial = (serial + 1) & 0xFFFFFFFF;
- if (serial == 0)
- serial = 1;
-
- dns_soa_setserial(serial, &addtuple->rdata);
- CHECK(do_one_tuple(&deltuple, db, ver, diff));
- CHECK(do_one_tuple(&addtuple, db, ver, diff));
- result = ISC_R_SUCCESS;
-
- failure:
- if (addtuple != NULL)
- dns_difftuple_free(&addtuple);
- if (deltuple != NULL)
- dns_difftuple_free(&deltuple);
- return (result);
-}
-
-static isc_result_t
-update_one_rr(dns_db_t *db, dns_dbversion_t *ver, dns_diff_t *diff,
- dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
- dns_rdata_t *rdata)
-{
- dns_difftuple_t *tuple = NULL;
- isc_result_t result;
- result = dns_difftuple_create(diff->mctx, op,
- name, ttl, rdata, &tuple);
- if (result != ISC_R_SUCCESS)
- return (result);
- return (do_one_tuple(&tuple, db, ver, diff));
-}
-
-static isc_boolean_t
-ksk_sanity(dns_db_t *db, dns_dbversion_t *ver) {
- isc_boolean_t ret = ISC_FALSE;
- isc_boolean_t have_ksk = ISC_FALSE, have_nonksk = ISC_FALSE;
- isc_result_t result;
- dns_dbnode_t *node = NULL;
- dns_rdataset_t rdataset;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- dns_rdata_dnskey_t dnskey;
-
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findnode(db, dns_db_origin(db), ISC_FALSE, &node));
- CHECK(dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey, 0, 0,
- &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- while (result == ISC_R_SUCCESS && (!have_ksk || !have_nonksk)) {
- dns_rdataset_current(&rdataset, &rdata);
- CHECK(dns_rdata_tostruct(&rdata, &dnskey, NULL));
- if ((dnskey.flags & (DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
- == DNS_KEYOWNER_ZONE) {
- if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0)
- have_ksk = ISC_TRUE;
- else
- have_nonksk = ISC_TRUE;
- }
- dns_rdata_reset(&rdata);
- result = dns_rdataset_next(&rdataset);
- }
- if (have_ksk && have_nonksk)
- ret = ISC_TRUE;
- failure:
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
- if (node != NULL)
- dns_db_detachnode(db, &node);
- return (ret);
-}
-
-static isc_result_t
find_zone_keys(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
isc_mem_t *mctx, unsigned int maxkeys,
dst_key_t **keys, unsigned int *nkeys)
@@ -3752,10 +4575,14 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
(isc_stdtime_t) 0, &rdataset, NULL);
dns_db_detachnode(db, &node);
- if (result == ISC_R_NOTFOUND)
+ if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
return (ISC_R_SUCCESS);
- if (result != ISC_R_SUCCESS)
+ }
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto failure;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
@@ -3841,7 +4668,8 @@ static isc_result_t
add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_rdatatype_t type, dns_diff_t *diff, dst_key_t **keys,
unsigned int nkeys, isc_mem_t *mctx, isc_stdtime_t inception,
- isc_stdtime_t expire, isc_boolean_t check_ksk)
+ isc_stdtime_t expire, isc_boolean_t check_ksk,
+ isc_boolean_t keyset_kskonly)
{
isc_result_t result;
dns_dbnode_t *node = NULL;
@@ -3849,7 +4677,7 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
dns_rdata_t sig_rdata = DNS_RDATA_INIT;
unsigned char data[1024]; /* XXX */
isc_buffer_t buffer;
- unsigned int i;
+ unsigned int i, j;
dns_rdataset_init(&rdataset);
isc_buffer_init(&buffer, data, sizeof(data));
@@ -3865,18 +4693,59 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
result = dns_db_findrdataset(db, node, ver, type, 0,
(isc_stdtime_t) 0, &rdataset, NULL);
dns_db_detachnode(db, &node);
- if (result == ISC_R_NOTFOUND)
+ if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
return (ISC_R_SUCCESS);
- if (result != ISC_R_SUCCESS)
+ }
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto failure;
+ }
+
+#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0)
+#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0)
+#define ALG(x) dst_key_alg(x)
for (i = 0; i < nkeys; i++) {
- if (check_ksk && type != dns_rdatatype_dnskey &&
- (dst_key_flags(keys[i]) & DNS_KEYFLAG_KSK) != 0)
- continue;
+ isc_boolean_t both = ISC_FALSE;
+
if (!dst_key_isprivate(keys[i]))
continue;
+
+ if (check_ksk && !REVOKE(keys[i])) {
+ isc_boolean_t have_ksk, have_nonksk;
+ if (KSK(keys[i])) {
+ have_ksk = ISC_TRUE;
+ have_nonksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_nonksk = ISC_TRUE;
+ }
+ for (j = 0; j < nkeys; j++) {
+ if (j == i || ALG(keys[i]) != ALG(keys[j]))
+ continue;
+ if (REVOKE(keys[j]))
+ continue;
+ if (KSK(keys[j]))
+ have_ksk = ISC_TRUE;
+ else
+ have_nonksk = ISC_TRUE;
+ both = have_ksk && have_nonksk;
+ if (both)
+ break;
+ }
+ }
+ if (both) {
+ if (type == dns_rdatatype_dnskey) {
+ if (!KSK(keys[i]) && keyset_kskonly)
+ continue;
+ } else if (KSK(keys[i]))
+ continue;
+ } else if (REVOKE(keys[i]) && type != dns_rdatatype_dnskey)
+ continue;
+
/* Calculate the signature, creating a RRSIG RDATA. */
+ isc_buffer_clear(&buffer);
CHECK(dns_dnssec_sign(name, &rdataset, keys[i],
&inception, &expire,
mctx, &buffer, &sig_rdata));
@@ -3898,7 +4767,6 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
static void
zone_resigninc(dns_zone_t *zone) {
- const char *journalfile;
dns_db_t *db = NULL;
dns_dbversion_t *version = NULL;
dns_diff_t sig_diff;
@@ -3907,7 +4775,7 @@ zone_resigninc(dns_zone_t *zone) {
dns_rdataset_t rdataset;
dns_rdatatype_t covers;
dst_key_t *zone_keys[MAXZONEKEYS];
- isc_boolean_t check_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly = ISC_FALSE;
isc_result_t result;
isc_stdtime_t now, inception, soaexpire, expire, stop;
isc_uint32_t jitter;
@@ -3962,8 +4830,7 @@ zone_resigninc(dns_zone_t *zone) {
stop = now + 5;
check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- if (check_ksk)
- check_ksk = ksk_sanity(db, version);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
name = dns_fixedname_name(&fixed);
result = dns_db_getsigningtime(db, &rdataset, name);
@@ -4007,14 +4874,14 @@ zone_resigninc(dns_zone_t *zone) {
}
result = add_sigs(db, version, name, covers, &sig_diff,
zone_keys, nkeys, zone->mctx, inception,
- expire, check_ksk);
+ expire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"zone_resigninc:add_sigs -> %s\n",
dns_result_totext(result));
break;
}
- result = dns_db_getsigningtime(db, &rdataset,
+ result = dns_db_getsigningtime(db, &rdataset,
dns_fixedname_name(&fixed));
if (nkeys == 0 && result == ISC_R_NOTFOUND) {
result = ISC_R_SUCCESS;
@@ -4052,7 +4919,7 @@ zone_resigninc(dns_zone_t *zone) {
*/
result = add_sigs(db, version, &zone->origin, dns_rdatatype_soa,
&sig_diff, zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ soaexpire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"zone_resigninc:add_sigs -> %s\n",
@@ -4060,31 +4927,10 @@ zone_resigninc(dns_zone_t *zone) {
goto failure;
}
- journalfile = dns_zone_getjournal(zone);
- if (journalfile != NULL) {
- dns_journal_t *journal = NULL;
- result = dns_journal_open(zone->mctx, journalfile,
- ISC_TRUE, &journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_resigninc:dns_journal_open -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
-
- result = dns_journal_write_transaction(journal, &sig_diff);
- dns_journal_destroy(&journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_resigninc:dns_journal_write_transaction -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
+ /* Write changes to journal file. */
+ zone_journal(zone, &sig_diff, "zone_resigninc");
- /*
- * Everything has succeeded. Commit the changes.
- */
+ /* Everything has succeeded. Commit the changes. */
dns_db_closeversion(db, &version, ISC_TRUE);
failure:
@@ -4151,16 +4997,6 @@ next_active(dns_db_t *db, dns_dbversion_t *version, dns_name_t *oldname,
return (result);
}
-static void
-set_bit(unsigned char *array, unsigned int index) {
- unsigned int shift, mask;
-
- shift = 7 - (index % 8);
- mask = 1 << shift;
-
- array[index / 8] |= mask;
-}
-
static isc_boolean_t
signed_with_key(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdatatype_t type, dst_key_t *key)
@@ -4173,8 +5009,10 @@ signed_with_key(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_init(&rdataset);
result = dns_db_findrdataset(db, node, version, dns_rdatatype_rrsig,
type, 0, &rdataset, NULL);
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
return (ISC_FALSE);
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
@@ -4209,21 +5047,6 @@ add_nsec(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
CHECK(next_active(db, version, name, next, bottom));
CHECK(dns_nsec_buildrdata(db, version, node, next, nsecbuffer,
&rdata));
- if (dns_name_equal(dns_db_origin(db), name)) {
- /*
- * Set the OPT bit to indicate that this is a
- * partially secure zone.
- */
- isc_region_t region;
-
- dns_rdata_toregion(&rdata, &region);
- dns_name_fromregion(next, &region);
- isc_region_consume(&region, next->length);
- INSIST(region.length > (2 + dns_rdatatype_opt / 8) &&
- region.base[0] == 0 &&
- region.base[1] > dns_rdatatype_opt / 8);
- set_bit(region.base + 2, dns_rdatatype_opt);
- }
CHECK(update_one_rr(db, version, diff, DNS_DIFFOP_ADD, name, ttl,
&rdata));
failure:
@@ -4236,8 +5059,8 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
isc_boolean_t build_nsec, dst_key_t *key,
isc_stdtime_t inception, isc_stdtime_t expire,
unsigned int minimum, isc_boolean_t is_ksk,
- isc_boolean_t *delegation, dns_diff_t *diff,
- isc_int32_t *signatures, isc_mem_t *mctx)
+ isc_boolean_t keyset_kskonly, isc_boolean_t *delegation,
+ dns_diff_t *diff, isc_int32_t *signatures, isc_mem_t *mctx)
{
isc_result_t result;
dns_rdatasetiter_t *iterator = NULL;
@@ -4255,6 +5078,7 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
result = ISC_R_SUCCESS;
return (result);
}
+
dns_rdataset_init(&rdataset);
isc_buffer_init(&buffer, data, sizeof(data));
seen_rr = seen_soa = seen_ns = seen_dname = seen_nsec =
@@ -4275,7 +5099,8 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
seen_nsec = ISC_TRUE;
else if (rdataset.type == dns_rdatatype_nsec3)
seen_nsec3 = ISC_TRUE;
- seen_rr = ISC_TRUE;
+ if (rdataset.type != dns_rdatatype_rrsig)
+ seen_rr = ISC_TRUE;
dns_rdataset_disassociate(&rdataset);
}
if (result != ISC_R_NOMORE)
@@ -4299,9 +5124,15 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
if (build_nsec && !seen_nsec3 && !seen_nsec && seen_rr) {
/* Build and add NSEC. */
bottom = (seen_ns && !seen_soa) || seen_dname;
- CHECK(add_nsec(db, version, name, node, minimum, bottom, diff));
- /* Count a NSEC generation as a signature generation. */
- (*signatures)--;
+ /*
+ * Build a NSEC record except at the origin.
+ */
+ if (!dns_name_equal(name, dns_db_origin(db))) {
+ CHECK(add_nsec(db, version, name, node, minimum,
+ bottom, diff));
+ /* Count a NSEC generation as a signature generation. */
+ (*signatures)--;
+ }
}
result = dns_rdatasetiter_first(iterator);
while (result == ISC_R_SUCCESS) {
@@ -4309,7 +5140,10 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
if (rdataset.type == dns_rdatatype_soa ||
rdataset.type == dns_rdatatype_rrsig)
goto next_rdataset;
- if (is_ksk && rdataset.type != dns_rdatatype_dnskey)
+ if (rdataset.type == dns_rdatatype_dnskey) {
+ if (!is_ksk && keyset_kskonly)
+ goto next_rdataset;
+ } else if (is_ksk)
goto next_rdataset;
if (*delegation &&
rdataset.type != dns_rdatatype_ds &&
@@ -4318,6 +5152,7 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
if (signed_with_key(db, node, version, rdataset.type, key))
goto next_rdataset;
/* Calculate the signature, creating a RRSIG RDATA. */
+ isc_buffer_clear(&buffer);
CHECK(dns_dnssec_sign(name, &rdataset, key, &inception,
&expire, mctx, &buffer, &rdata));
/* Update the database and journal with the RRSIG. */
@@ -4334,7 +5169,7 @@ sign_a_node(dns_db_t *db, dns_name_t *name, dns_dbnode_t *node,
result = ISC_R_SUCCESS;
if (seen_dname)
*delegation = ISC_TRUE;
-failure:
+ failure:
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
if (iterator != NULL)
@@ -4342,63 +5177,45 @@ failure:
return (result);
}
+/*
+ * If 'update_only' is set then don't create a NSEC RRset if it doesn't exist.
+ */
static isc_result_t
updatesecure(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
- dns_ttl_t minimum, isc_boolean_t *secureupdated, dns_diff_t *diff)
+ dns_ttl_t minimum, isc_boolean_t update_only, dns_diff_t *diff)
{
isc_result_t result;
- dns_rdata_t rdata = DNS_RDATA_INIT;
- unsigned char nsecbuffer[DNS_NSEC_BUFFERSIZE];
dns_rdataset_t rdataset;
- dns_rdata_nsec_t nsec;
dns_dbnode_t *node = NULL;
- /*
- * Check to see if the OPT bit has already been cleared.
- */
CHECK(dns_db_getoriginnode(db, &node));
- dns_rdataset_init(&rdataset);
- CHECK(dns_db_findrdataset(db, node, version, dns_rdatatype_nsec,
- dns_rdatatype_none, 0, &rdataset, NULL));
- CHECK(dns_rdataset_first(&rdataset));
- dns_rdataset_current(&rdataset, &rdata);
-
- /*
- * Find the NEXT name for building the new record.
- */
- CHECK(dns_rdata_tostruct(&rdata, &nsec, NULL));
-
- /*
- * Delete the old NSEC record.
- */
- CHECK(update_one_rr(db, version, diff, DNS_DIFFOP_DEL, name, minimum,
- &rdata));
- dns_rdata_reset(&rdata);
-
- /*
- * Add the new NSEC record.
- */
- CHECK(dns_nsec_buildrdata(db, version, node, &nsec.next, nsecbuffer,
- &rdata));
- CHECK(update_one_rr(db, version, diff, DNS_DIFFOP_ADD, name, minimum,
- &rdata));
- dns_rdata_reset(&rdata);
-
- if (secureupdated != NULL)
- *secureupdated = ISC_TRUE;
-
+ if (update_only) {
+ dns_rdataset_init(&rdataset);
+ result = dns_db_findrdataset(db, node, version,
+ dns_rdatatype_nsec,
+ dns_rdatatype_none,
+ 0, &rdataset, NULL);
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_NOTFOUND)
+ goto success;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+ }
+ CHECK(delete_nsec(db, version, node, name, diff));
+ CHECK(add_nsec(db, version, name, node, minimum, ISC_FALSE, diff));
+ success:
+ result = ISC_R_SUCCESS;
failure:
if (node != NULL)
dns_db_detachnode(db, &node);
- if (dns_rdataset_isassociated(&rdataset))
- dns_rdataset_disassociate(&rdataset);
return (result);
}
static isc_result_t
-updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
- dns_name_t *name, dns_rdatatype_t privatetype,
- dns_diff_t *diff)
+updatesignwithkey(dns_zone_t *zone, dns_signing_t *signing,
+ dns_dbversion_t *version, isc_boolean_t build_nsec3,
+ dns_ttl_t minimum, dns_diff_t *diff)
{
isc_result_t result;
dns_dbnode_t *node = NULL;
@@ -4406,43 +5223,68 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
dns_rdata_t rdata = DNS_RDATA_INIT;
unsigned char data[5];
isc_boolean_t seen_done = ISC_FALSE;
+ isc_boolean_t have_rr = ISC_FALSE;
dns_rdataset_init(&rdataset);
result = dns_db_getoriginnode(signing->db, &node);
if (result != ISC_R_SUCCESS)
goto failure;
- result = dns_db_findrdataset(signing->db, node, version, privatetype,
- dns_rdatatype_none, 0, &rdataset, NULL);
+ result = dns_db_findrdataset(signing->db, node, version,
+ zone->privatetype, dns_rdatatype_none,
+ 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
result = ISC_R_SUCCESS;
goto failure;
}
- if (result != ISC_R_SUCCESS)
+ if (result != ISC_R_SUCCESS) {
+ INSIST(!dns_rdataset_isassociated(&rdataset));
goto failure;
+ }
for (result = dns_rdataset_first(&rdataset);
result == ISC_R_SUCCESS;
result = dns_rdataset_next(&rdataset)) {
dns_rdataset_current(&rdataset, &rdata);
+ /*
+ * If we don't match the algorithm or keyid skip the record.
+ */
if (rdata.length != 5 ||
rdata.data[0] != signing->algorithm ||
rdata.data[1] != ((signing->keyid >> 8) & 0xff) ||
rdata.data[2] != (signing->keyid & 0xff)) {
+ have_rr = ISC_TRUE;
dns_rdata_reset(&rdata);
continue;
}
- if (!signing->delete && rdata.data[4] != 0)
+ /*
+ * We have a match. If we were signing (!signing->delete)
+ * and we already have a record indicating that we have
+ * finished signing (rdata.data[4] != 0) then keep it.
+ * Otherwise it needs to be deleted as we have removed all
+ * the signatures (signing->delete), so any record indicating
+ * completion is now out of date, or we have finished signing
+ * with the new record so we no longer need to remember that
+ * we need to sign the zone with the matching key across a
+ * nameserver re-start.
+ */
+ if (!signing->delete && rdata.data[4] != 0) {
seen_done = ISC_TRUE;
- else
+ have_rr = ISC_TRUE;
+ } else
CHECK(update_one_rr(signing->db, version, diff,
- DNS_DIFFOP_DEL, name,
+ DNS_DIFFOP_DEL, &zone->origin,
rdataset.ttl, &rdata));
dns_rdata_reset(&rdata);
}
if (result == ISC_R_NOMORE)
result = ISC_R_SUCCESS;
if (!signing->delete && !seen_done) {
-
+ /*
+ * If we were signing then we need to indicate that we have
+ * finished signing the zone with this key. If it is already
+ * there we don't need to add it a second time.
+ */
data[0] = signing->algorithm;
data[1] = (signing->keyid >> 8) & 0xff;
data[2] = signing->keyid & 0xff;
@@ -4450,11 +5292,23 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
data[4] = 1;
rdata.length = sizeof(data);
rdata.data = data;
- rdata.type = privatetype;
+ rdata.type = zone->privatetype;
rdata.rdclass = dns_db_class(signing->db);
CHECK(update_one_rr(signing->db, version, diff, DNS_DIFFOP_ADD,
- name, rdataset.ttl, &rdata));
+ &zone->origin, rdataset.ttl, &rdata));
+ } else if (!have_rr) {
+ dns_name_t *origin = dns_db_origin(signing->db);
+ /*
+ * Rebuild the NSEC/NSEC3 record for the origin as we no
+ * longer have any private records.
+ */
+ if (build_nsec3)
+ CHECK(dns_nsec3_addnsec3s(signing->db, version, origin,
+ minimum, ISC_FALSE, diff));
+ CHECK(updatesecure(signing->db, version, origin, minimum,
+ ISC_TRUE, diff));
}
+
failure:
if (dns_rdataset_isassociated(&rdataset))
dns_rdataset_disassociate(&rdataset);
@@ -4463,9 +5317,15 @@ updatesignwithkey(dns_signing_t *signing, dns_dbversion_t *version,
return (result);
}
+/*
+ * If 'active' is set then we are not done with the chain yet so only
+ * delete the nsec3param record which indicates a full chain exists
+ * (flags == 0).
+ */
static isc_result_t
fixup_nsec3param(dns_db_t *db, dns_dbversion_t *ver, dns_nsec3chain_t *chain,
- isc_boolean_t active, dns_diff_t *diff)
+ isc_boolean_t active, dns_rdatatype_t privatetype,
+ dns_diff_t *diff)
{
dns_dbnode_t *node = NULL;
dns_name_t *name = dns_db_origin(db);
@@ -4484,7 +5344,7 @@ fixup_nsec3param(dns_db_t *db, dns_dbversion_t *ver, dns_nsec3chain_t *chain,
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
0, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND)
- goto add;
+ goto try_private;
if (result != ISC_R_SUCCESS)
goto failure;
@@ -4520,6 +5380,50 @@ fixup_nsec3param(dns_db_t *db, dns_dbversion_t *ver, dns_nsec3chain_t *chain,
if (result != ISC_R_NOMORE)
goto failure;
+ dns_rdataset_disassociate(&rdataset);
+
+ try_private:
+
+ if (active)
+ goto add;
+ /*
+ * Delete all private records which match that in nsec3chain.
+ */
+ result = dns_db_findrdataset(db, node, ver, privatetype,
+ 0, 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND)
+ goto add;
+ if (result != ISC_R_SUCCESS)
+ goto failure;
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t private = DNS_RDATA_INIT;
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+
+ dns_rdataset_current(&rdataset, &private);
+ if (!dns_nsec3param_fromprivate(&private, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ CHECK(dns_rdata_tostruct(&rdata, &nsec3param, NULL));
+
+ if (nsec3param.hash != chain->nsec3param.hash ||
+ nsec3param.iterations != chain->nsec3param.iterations ||
+ nsec3param.salt_length != chain->nsec3param.salt_length ||
+ memcmp(nsec3param.salt, chain->nsec3param.salt,
+ nsec3param.salt_length)) {
+ dns_rdata_reset(&rdata);
+ continue;
+ }
+
+ CHECK(update_one_rr(db, ver, diff, DNS_DIFFOP_DEL,
+ name, rdataset.ttl, &private));
+ dns_rdata_reset(&rdata);
+ }
+ if (result != ISC_R_NOMORE)
+ goto failure;
+
add:
if ((chain->nsec3param.flags & DNS_NSEC3FLAG_REMOVE) != 0) {
result = ISC_R_SUCCESS;
@@ -4620,7 +5524,7 @@ deletematchingnsec3(dns_db_t *db, dns_dbversion_t *ver, dns_dbnode_t *node,
static isc_result_t
need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
const dns_rdata_nsec3param_t *param,
- isc_boolean_t *answer, isc_boolean_t *updatensec)
+ isc_boolean_t *answer)
{
dns_dbnode_t *node = NULL;
dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -4634,29 +5538,19 @@ need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
RUNTIME_CHECK(result == ISC_R_SUCCESS);
dns_rdataset_init(&rdataset);
+
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec,
0, 0, &rdataset, NULL);
- if (result == ISC_R_NOTFOUND)
- goto check_nsec3param;
-
- if (result != ISC_R_SUCCESS)
- goto failure;
-
- CHECK(dns_rdataset_first(&rdataset));
- dns_rdataset_current(&rdataset, &rdata);
-
- if (!dns_nsec_typepresent(&rdata, dns_rdatatype_opt)) {
- /*
- * We have a complete NSEC chain. Signal to update
- * the apex NSEC record.
- */
- *updatensec = ISC_TRUE;
- goto failure;
+ if (result == ISC_R_SUCCESS) {
+ dns_rdataset_disassociate(&rdataset);
+ dns_db_detachnode(db, &node);
+ return (result);
+ }
+ if (result != ISC_R_NOTFOUND) {
+ dns_db_detachnode(db, &node);
+ return (result);
}
- dns_rdataset_disassociate(&rdataset);
- dns_rdata_reset(&rdata);
- check_nsec3param:
result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
0, 0, &rdataset, NULL);
if (result == ISC_R_NOTFOUND) {
@@ -4705,13 +5599,60 @@ need_nsec_chain(dns_db_t *db, dns_dbversion_t *ver,
return (result);
}
+static isc_result_t
+update_sigs(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *version,
+ dst_key_t *zone_keys[], unsigned int nkeys, dns_zone_t *zone,
+ isc_stdtime_t inception, isc_stdtime_t expire, isc_stdtime_t now,
+ isc_boolean_t check_ksk, isc_boolean_t keyset_kskonly,
+ dns_diff_t *sig_diff)
+{
+ dns_difftuple_t *tuple;
+ isc_result_t result;
+
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_HEAD(diff->tuples)) {
+ result = del_sigs(zone, db, version, &tuple->name,
+ tuple->rdata.type, sig_diff,
+ zone_keys, nkeys, now);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "update_sigs:del_sigs -> %s\n",
+ dns_result_totext(result));
+ return (result);
+ }
+ result = add_sigs(db, version, &tuple->name,
+ tuple->rdata.type, sig_diff,
+ zone_keys, nkeys, zone->mctx, inception,
+ expire, check_ksk, keyset_kskonly);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "update_sigs:add_sigs -> %s\n",
+ dns_result_totext(result));
+ return (result);
+ }
+
+ do {
+ dns_difftuple_t *next = ISC_LIST_NEXT(tuple, link);
+ while (next != NULL &&
+ (tuple->rdata.type != next->rdata.type ||
+ !dns_name_equal(&tuple->name, &next->name)))
+ next = ISC_LIST_NEXT(next, link);
+ ISC_LIST_UNLINK(diff->tuples, tuple, link);
+ dns_diff_appendminimal(sig_diff, &tuple);
+ INSIST(tuple == NULL);
+ tuple = next;
+ } while (tuple != NULL);
+ }
+ return (ISC_R_SUCCESS);
+}
+
/*
* Incrementally build and sign a new NSEC3 chain using the parameters
* requested.
*/
static void
zone_nsec3chain(dns_zone_t *zone) {
- const char *journalfile;
dns_db_t *db = NULL;
dns_dbnode_t *node = NULL;
dns_dbversion_t *version = NULL;
@@ -4727,7 +5668,7 @@ zone_nsec3chain(dns_zone_t *zone) {
dns_nsec3chainlist_t cleanup;
dst_key_t *zone_keys[MAXZONEKEYS];
isc_int32_t signatures;
- isc_boolean_t check_ksk, is_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly, is_ksk;
isc_boolean_t delegation;
isc_boolean_t first;
isc_result_t result;
@@ -4740,9 +5681,9 @@ zone_nsec3chain(dns_zone_t *zone) {
isc_boolean_t seen_soa, seen_ns, seen_dname, seen_ds;
isc_boolean_t seen_nsec, seen_nsec3, seen_rr;
dns_rdatasetiter_t *iterator = NULL;
- dns_difftuple_t *tuple;
isc_boolean_t buildnsecchain;
isc_boolean_t updatensec = ISC_FALSE;
+ dns_rdatatype_t privatetype = zone->privatetype;
dns_rdataset_init(&rdataset);
dns_fixedname_init(&fixed);
@@ -4799,8 +5740,7 @@ zone_nsec3chain(dns_zone_t *zone) {
stop = now + 5;
check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- if (check_ksk)
- check_ksk = ksk_sanity(db, version);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
/*
* We keep pulling nodes off each iterator in turn until
@@ -4924,9 +5864,17 @@ zone_nsec3chain(dns_zone_t *zone) {
* Process one node.
*/
dns_dbiterator_pause(nsec3chain->dbiterator);
- CHECK(dns_nsec3_addnsec3(db, version, name,
- &nsec3chain->nsec3param,
- zone->minimum, unsecure, &nsec3_diff));
+ result = dns_nsec3_addnsec3(db, version, name,
+ &nsec3chain->nsec3param,
+ zone->minimum, unsecure,
+ &nsec3_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "dns_nsec3_addnsec3 -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
/*
* Treat each call to dns_nsec3_addnsec3() as if it's cost is
* two signatures. Additionally there will, in general, be
@@ -4948,7 +5896,8 @@ zone_nsec3chain(dns_zone_t *zone) {
if (result == ISC_R_NOMORE && nsec3chain->delete_nsec) {
CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_FALSE, &param_diff));
+ ISC_FALSE, privatetype,
+ &param_diff));
LOCK_ZONE(zone);
ISC_LIST_UNLINK(zone->nsec3chain, nsec3chain,
link);
@@ -4962,12 +5911,14 @@ zone_nsec3chain(dns_zone_t *zone) {
CHECK(fixup_nsec3param(db, version,
nsec3chain,
ISC_TRUE,
+ privatetype,
&param_diff));
nsec3chain->delete_nsec = ISC_TRUE;
goto same_addchain;
}
CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_FALSE, &param_diff));
+ ISC_FALSE, privatetype,
+ &param_diff));
LOCK_ZONE(zone);
ISC_LIST_UNLINK(zone->nsec3chain, nsec3chain,
link);
@@ -5028,10 +5979,22 @@ zone_nsec3chain(dns_zone_t *zone) {
* of removing this NSEC3 chain.
*/
if (first && !updatensec &&
- (nsec3chain->nsec3param.flags & DNS_NSEC3FLAG_NONSEC) == 0)
- CHECK(need_nsec_chain(db, version,
- &nsec3chain->nsec3param,
- &buildnsecchain, &updatensec));
+ (nsec3chain->nsec3param.flags & DNS_NSEC3FLAG_NONSEC) == 0) {
+ result = need_nsec_chain(db, version,
+ &nsec3chain->nsec3param,
+ &buildnsecchain);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "need_nsec_chain -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ }
+
+ if (first)
+ dns_zone_log(zone, ISC_LOG_DEBUG(3), "zone_nsec3chain:"
+ "buildnsecchain = %u\n", buildnsecchain);
dns_dbiterator_current(nsec3chain->dbiterator, &node, name);
delegation = ISC_FALSE;
@@ -5040,16 +6003,33 @@ zone_nsec3chain(dns_zone_t *zone) {
/*
* Delete the NSECPARAM record that matches this chain.
*/
- if (first)
- CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_TRUE, &param_diff));
+ if (first) {
+ result = fixup_nsec3param(db, version,
+ nsec3chain,
+ ISC_TRUE, privatetype,
+ &param_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "fixup_nsec3param -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ }
/*
* Delete the NSEC3 records.
*/
- CHECK(deletematchingnsec3(db, version, node, name,
- &nsec3chain->nsec3param,
- &nsec3_diff));
+ result = deletematchingnsec3(db, version, node, name,
+ &nsec3chain->nsec3param,
+ &nsec3_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "deletematchingnsec3 -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
goto next_removenode;
}
@@ -5100,7 +6080,8 @@ zone_nsec3chain(dns_zone_t *zone) {
seen_nsec = ISC_TRUE;
else if (rdataset.type == dns_rdatatype_nsec3)
seen_nsec3 = ISC_TRUE;
- seen_rr = ISC_TRUE;
+ if (rdataset.type != dns_rdatatype_rrsig)
+ seen_rr = ISC_TRUE;
dns_rdataset_disassociate(&rdataset);
}
dns_rdatasetiter_destroy(&iterator);
@@ -5110,8 +6091,14 @@ zone_nsec3chain(dns_zone_t *zone) {
if ((seen_ns && !seen_soa) || seen_dname)
delegation = ISC_TRUE;
- CHECK(add_nsec(db, version, name, node, zone->minimum,
- delegation, &nsec_diff));
+ /*
+ * Add a NSEC record except at the origin.
+ */
+ if (!dns_name_equal(name, dns_db_origin(db))) {
+ dns_dbiterator_pause(nsec3chain->dbiterator);
+ CHECK(add_nsec(db, version, name, node, zone->minimum,
+ delegation, &nsec_diff));
+ }
next_removenode:
first = ISC_FALSE;
@@ -5133,8 +6120,17 @@ zone_nsec3chain(dns_zone_t *zone) {
UNLOCK_ZONE(zone);
ISC_LIST_APPEND(cleanup, nsec3chain, link);
dns_dbiterator_pause(nsec3chain->dbiterator);
- CHECK(fixup_nsec3param(db, version, nsec3chain,
- ISC_FALSE, &param_diff));
+ result = fixup_nsec3param(db, version,
+ nsec3chain, ISC_FALSE,
+ privatetype,
+ &param_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "fixup_nsec3param -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
goto next_removechain;
} else if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
@@ -5166,107 +6162,101 @@ zone_nsec3chain(dns_zone_t *zone) {
}
/*
- * Add / update signatures for the NSEC3 records.
+ * We may need to update the NSEC/NSEC3 records for the zone apex.
*/
- for (tuple = ISC_LIST_HEAD(nsec3_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(nsec3_diff.tuples)) {
- /*
- * We have changed the NSEC3 RRset above so we need to update
- * the signatures.
- */
- result = del_sigs(zone, db, version, &tuple->name,
- dns_rdatatype_nsec3, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &tuple->name,
- dns_rdatatype_nsec3, &sig_diff, zone_keys,
- nkeys, zone->mctx, inception, expire,
- check_ksk);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:add_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
+ if (!ISC_LIST_EMPTY(param_diff.tuples)) {
+ isc_boolean_t rebuild_nsec = ISC_FALSE,
+ rebuild_nsec3 = ISC_FALSE;
+ result = dns_db_getoriginnode(db, &node);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ result = dns_db_allrdatasets(db, node, version, 0, &iterator);
+ for (result = dns_rdatasetiter_first(iterator);
+ result == ISC_R_SUCCESS;
+ result = dns_rdatasetiter_next(iterator)) {
+ dns_rdatasetiter_current(iterator, &rdataset);
+ if (rdataset.type == dns_rdatatype_nsec)
+ rebuild_nsec = ISC_TRUE;
+ if (rdataset.type == dns_rdatatype_nsec3param)
+ rebuild_nsec3 = ISC_TRUE;
+ dns_rdataset_disassociate(&rdataset);
}
+ dns_rdatasetiter_destroy(&iterator);
+ dns_db_detachnode(db, &node);
- do {
- dns_difftuple_t *next = ISC_LIST_NEXT(tuple, link);
- while (next != NULL &&
- !dns_name_equal(&tuple->name, &next->name))
- next = ISC_LIST_NEXT(next, link);
- ISC_LIST_UNLINK(nsec3_diff.tuples, tuple, link);
- dns_diff_appendminimal(&sig_diff, &tuple);
- INSIST(tuple == NULL);
- tuple = next;
- } while (tuple != NULL);
- }
-
- for (tuple = ISC_LIST_HEAD(param_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(param_diff.tuples)) {
- /*
- * We have changed the NSEC3PARAM RRset above so we need to
- * update the signatures.
- */
- result = del_sigs(zone, db, version, &tuple->name,
- dns_rdatatype_nsec3param, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
+ if (rebuild_nsec) {
+ if (nsec3chain != NULL)
+ dns_dbiterator_pause(nsec3chain->dbiterator);
+ result = updatesecure(db, version, &zone->origin,
+ zone->minimum, ISC_TRUE,
+ &nsec_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "updatesecure -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
}
- result = add_sigs(db, version, &tuple->name,
- dns_rdatatype_nsec3param, &sig_diff,
- zone_keys, nkeys, zone->mctx, inception,
- expire, check_ksk);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:add_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
+ if (rebuild_nsec3) {
+ result = dns_nsec3_addnsec3s(db, version,
+ dns_db_origin(db),
+ zone->minimum, ISC_FALSE,
+ &nsec3_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_nsec3chain:"
+ "dns_nsec3_addnsec3s -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
}
- ISC_LIST_UNLINK(param_diff.tuples, tuple, link);
- dns_diff_appendminimal(&sig_diff, &tuple);
- INSIST(tuple == NULL);
}
- if (updatensec)
- CHECK(updatesecure(db, version, &zone->origin, zone->minimum,
- NULL, &nsec_diff));
+ /*
+ * Add / update signatures for the NSEC3 records.
+ */
+ result = update_sigs(&nsec3_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "update_sigs -> %s\n", dns_result_totext(result));
+ goto failure;
+ }
- for (tuple = ISC_LIST_HEAD(nsec_diff.tuples);
- tuple != NULL;
- tuple = ISC_LIST_HEAD(nsec_diff.tuples)) {
- result = del_sigs(zone, db, version, &tuple->name,
- dns_rdatatype_nsec, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &tuple->name,
- dns_rdatatype_nsec, &sig_diff,
- zone_keys, nkeys, zone->mctx, inception,
- expire, check_ksk);
+ /*
+ * We have changed the NSEC3PARAM or private RRsets
+ * above so we need to update the signatures.
+ */
+ result = update_sigs(&param_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "update_sigs -> %s\n", dns_result_totext(result));
+ goto failure;
+ }
+
+ if (updatensec) {
+ if (nsec3chain != NULL)
+ dns_dbiterator_pause(nsec3chain->dbiterator);
+ result = updatesecure(db, version, &zone->origin,
+ zone->minimum, ISC_FALSE, &nsec_diff);
if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_nsec3chain:add_sigs -> %s\n",
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "updatesecure -> %s\n",
dns_result_totext(result));
goto failure;
}
- ISC_LIST_UNLINK(nsec_diff.tuples, tuple, link);
- dns_diff_appendminimal(&sig_diff, &tuple);
- INSIST(tuple == NULL);
+ }
+
+ result = update_sigs(&nsec_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
+ "update_sigs -> %s\n", dns_result_totext(result));
+ goto failure;
}
/*
@@ -5294,34 +6284,15 @@ zone_nsec3chain(dns_zone_t *zone) {
result = add_sigs(db, version, &zone->origin, dns_rdatatype_soa,
&sig_diff, zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ soaexpire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
"add_sigs -> %s\n", dns_result_totext(result));
goto failure;
}
- journalfile = dns_zone_getjournal(zone);
- if (journalfile != NULL) {
- dns_journal_t *journal = NULL;
- result = dns_journal_open(zone->mctx, journalfile,
- ISC_TRUE, &journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
- "dns_journal_open -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
-
- result = dns_journal_write_transaction(journal, &sig_diff);
- dns_journal_destroy(&journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
- "dns_journal_write_transaction -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
+ /* Write changes to journal file. */
+ zone_journal(zone, &sig_diff, "zone_nsec3chain");
LOCK_ZONE(zone);
zone_needdump(zone, DNS_DUMP_DELAY);
@@ -5358,6 +6329,9 @@ zone_nsec3chain(dns_zone_t *zone) {
set_resigntime(zone);
failure:
+ if (result != ISC_R_SUCCESS)
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain: %s\n",
+ dns_result_totext(result));
/*
* On error roll back the current nsec3chain.
*/
@@ -5414,6 +6388,8 @@ zone_nsec3chain(dns_zone_t *zone) {
for (i = 0; i < nkeys; i++)
dst_key_free(&zone_keys[i]);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
if (version != NULL) {
dns_db_closeversion(db, &version, ISC_FALSE);
dns_db_detach(&db);
@@ -5506,11 +6482,11 @@ del_sig(dns_db_t *db, dns_dbversion_t *version, dns_name_t *name,
*/
static void
zone_sign(dns_zone_t *zone) {
- const char *journalfile;
dns_db_t *db = NULL;
dns_dbnode_t *node = NULL;
dns_dbversion_t *version = NULL;
dns_diff_t sig_diff;
+ dns_diff_t post_diff;
dns_fixedname_t fixed;
dns_fixedname_t nextfixed;
dns_name_t *name, *nextname;
@@ -5519,19 +6495,19 @@ zone_sign(dns_zone_t *zone) {
dns_signinglist_t cleanup;
dst_key_t *zone_keys[MAXZONEKEYS];
isc_int32_t signatures;
- isc_boolean_t check_ksk, is_ksk;
+ isc_boolean_t check_ksk, keyset_kskonly, is_ksk;
isc_boolean_t commit = ISC_FALSE;
isc_boolean_t delegation;
- isc_boolean_t finishedakey = ISC_FALSE;
- isc_boolean_t secureupdated = ISC_FALSE;
- isc_boolean_t build_nsec3 = ISC_FALSE, build_nsec = ISC_FALSE;
+ isc_boolean_t build_nsec = ISC_FALSE;
+ isc_boolean_t build_nsec3 = ISC_FALSE;
isc_boolean_t first;
isc_result_t result;
isc_stdtime_t now, inception, soaexpire, expire, stop;
isc_uint32_t jitter;
- unsigned int i;
+ unsigned int i, j;
unsigned int nkeys = 0;
isc_uint32_t nodes;
+ isc_boolean_t was_ksk;
dns_rdataset_init(&rdataset);
dns_fixedname_init(&fixed);
@@ -5540,6 +6516,7 @@ zone_sign(dns_zone_t *zone) {
nextname = dns_fixedname_name(&nextfixed);
dns_diff_init(zone->mctx, &sig_diff);
sig_diff.resign = zone->sigresigninginterval;
+ dns_diff_init(zone->mctx, &post_diff);
ISC_LIST_INIT(cleanup);
/*
@@ -5584,10 +6561,6 @@ zone_sign(dns_zone_t *zone) {
expire = soaexpire - jitter % 3600;
stop = now + 5;
- check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
- if (check_ksk)
- check_ksk = ksk_sanity(db, version);
-
/*
* We keep pulling nodes off each iterator in turn until
* we have no more nodes to pull off or we reach the limits
@@ -5597,39 +6570,17 @@ zone_sign(dns_zone_t *zone) {
signatures = zone->signatures;
signing = ISC_LIST_HEAD(zone->signing);
first = ISC_TRUE;
- /*
- * See if we have a NSEC chain.
- */
- result = dns_db_getoriginnode(db, &node);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = dns_db_findrdataset(db, node, version, dns_rdatatype_nsec,
- dns_rdatatype_none, 0, &rdataset, NULL);
- dns_db_detachnode(db, &node);
- if (result == ISC_R_SUCCESS) {
+
+ check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
+
+ /* Determine which type of chain to build */
+ CHECK(dns_private_chains(db, version, zone->privatetype,
+ &build_nsec, &build_nsec3));
+
+ /* If neither chain is found, default to NSEC */
+ if (!build_nsec && !build_nsec3)
build_nsec = ISC_TRUE;
- dns_rdataset_disassociate(&rdataset);
- } else if (result != ISC_R_NOTFOUND) {
- goto failure;
- } else {
- /*
- * No NSEC chain present.
- * See if we need to build a NSEC3 chain?
- */
- result = dns_nsec3_active(db, version, ISC_TRUE, &build_nsec3);
- if (result == ISC_R_SUCCESS) {
- if (build_nsec3)
- build_nsec3 = ISC_FALSE;
- else {
- result = dns_nsec3_active(db, version,
- ISC_FALSE,
- &build_nsec3);
- if (build_nsec3)
- secureupdated = ISC_TRUE;
- else
- build_nsec = ISC_TRUE;
- }
- }
- }
while (signing != NULL && nodes-- > 0 && signatures > 0) {
nextsigning = ISC_LIST_NEXT(signing, link);
@@ -5637,7 +6588,7 @@ zone_sign(dns_zone_t *zone) {
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
if (signing->done || signing->db != zone->db) {
/*
- * The zone has been reloaded. We will have
+ * The zone has been reloaded. We will have
* created new signings as part of the reload
* process so we can destroy this one.
*/
@@ -5651,9 +6602,31 @@ zone_sign(dns_zone_t *zone) {
if (signing->db != db)
goto next_signing;
- is_ksk = ISC_FALSE;
delegation = ISC_FALSE;
+ was_ksk = ISC_FALSE;
+
+ if (first && signing->delete) {
+ /*
+ * Remove the key we are deleting from consideration.
+ */
+ for (i = 0, j = 0; i < nkeys; i++) {
+ /*
+ * Find the key we want to remove.
+ */
+ if (ALG(zone_keys[i]) == signing->algorithm &&
+ dst_key_id(zone_keys[i]) == signing->keyid)
+ {
+ if (KSK(zone_keys[i]))
+ dst_key_free(&zone_keys[i]);
+ continue;
+ }
+ zone_keys[j] = zone_keys[i];
+ j++;
+ }
+ nkeys = j;
+ }
+
dns_dbiterator_current(signing->dbiterator, &node, name);
if (signing->delete) {
@@ -5661,8 +6634,8 @@ zone_sign(dns_zone_t *zone) {
CHECK(del_sig(db, version, name, node, nkeys,
signing->algorithm, signing->keyid,
&sig_diff));
- goto next_node;
}
+
/*
* On the first pass we need to check if the current node
* has not been obscured.
@@ -5694,26 +6667,77 @@ zone_sign(dns_zone_t *zone) {
*/
dns_dbiterator_pause(signing->dbiterator);
for (i = 0; i < nkeys; i++) {
+ isc_boolean_t both = ISC_FALSE;
+
+ /*
+ * Find the keys we want to sign with.
+ */
+ if (!dst_key_isprivate(zone_keys[i]))
+ continue;
+
+ /*
+ * When adding look for the specific key.
+ */
+ if (!signing->delete &&
+ (dst_key_alg(zone_keys[i]) != signing->algorithm ||
+ dst_key_id(zone_keys[i]) != signing->keyid))
+ continue;
+
/*
- * Find the key we want to sign with.
+ * When deleting make sure we are properly signed
+ * with the algorithm that was being removed.
*/
- if (dst_key_alg(zone_keys[i]) != signing->algorithm ||
- dst_key_id(zone_keys[i]) != signing->keyid ||
- !dst_key_isprivate(zone_keys[i]))
+ if (signing->delete &&
+ ALG(zone_keys[i]) != signing->algorithm)
continue;
+
/*
* Do we do KSK processing?
*/
- if (check_ksk &&
- (dst_key_flags(zone_keys[i]) & DNS_KEYFLAG_KSK) != 0)
- is_ksk = ISC_TRUE;
+ if (check_ksk && !REVOKE(zone_keys[i])) {
+ isc_boolean_t have_ksk, have_nonksk;
+ if (KSK(zone_keys[i])) {
+ have_ksk = ISC_TRUE;
+ have_nonksk = ISC_FALSE;
+ } else {
+ have_ksk = ISC_FALSE;
+ have_nonksk = ISC_TRUE;
+ }
+ for (j = 0; j < nkeys; j++) {
+ if (j == i ||
+ ALG(zone_keys[i]) !=
+ ALG(zone_keys[j]))
+ continue;
+ if (REVOKE(zone_keys[j]))
+ continue;
+ if (KSK(zone_keys[j]))
+ have_ksk = ISC_TRUE;
+ else
+ have_nonksk = ISC_TRUE;
+ both = have_ksk && have_nonksk;
+ if (both)
+ break;
+ }
+ }
+ if (both || REVOKE(zone_keys[i]))
+ is_ksk = KSK(zone_keys[i]);
+ else
+ is_ksk = ISC_FALSE;
+
CHECK(sign_a_node(db, name, node, version, build_nsec3,
build_nsec, zone_keys[i], inception,
expire, zone->minimum, is_ksk,
- &delegation, &sig_diff, &signatures,
- zone->mctx));
- break;
+ ISC_TF(both && keyset_kskonly),
+ &delegation, &sig_diff,
+ &signatures, zone->mctx));
+ /*
+ * If we are adding we are done. Look for other keys
+ * of the same algorithm if deleting.
+ */
+ if (!signing->delete)
+ break;
}
+
/*
* Go onto next node.
*/
@@ -5726,9 +6750,7 @@ zone_sign(dns_zone_t *zone) {
ISC_LIST_UNLINK(zone->signing, signing, link);
ISC_LIST_APPEND(cleanup, signing, link);
dns_dbiterator_pause(signing->dbiterator);
- finishedakey = ISC_TRUE;
- if (!is_ksk && !secureupdated && nkeys != 0 &&
- build_nsec) {
+ if (nkeys != 0 && build_nsec) {
/*
* We have finished regenerating the
* zone with a zone signing key.
@@ -5740,8 +6762,8 @@ zone_sign(dns_zone_t *zone) {
result = updatesecure(db, version,
&zone->origin,
zone->minimum,
- &secureupdated,
- &sig_diff);
+ ISC_FALSE,
+ &post_diff);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone,
ISC_LOG_ERROR,
@@ -5750,16 +6772,19 @@ zone_sign(dns_zone_t *zone) {
goto failure;
}
}
- result = updatesignwithkey(signing, version,
- &zone->origin,
- zone->privatetype,
- &sig_diff);
+ result = updatesignwithkey(zone, signing,
+ version,
+ build_nsec3,
+ zone->minimum,
+ &post_diff);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
- "updatesignwithkey -> %s\n",
+ "updatesignwithkey "
+ "-> %s\n",
dns_result_totext(result));
goto failure;
}
+ build_nsec = ISC_FALSE;
goto next_signing;
} else if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
@@ -5783,53 +6808,13 @@ zone_sign(dns_zone_t *zone) {
first = ISC_TRUE;
}
- if (secureupdated) {
- /*
- * We have changed the NSEC RRset above so we need to update
- * the signatures.
- */
- result = del_sigs(zone, db, version, &zone->origin,
- dns_rdatatype_nsec, &sig_diff, zone_keys,
- nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &zone->origin,
- dns_rdatatype_nsec, &sig_diff, zone_keys,
- nkeys, zone->mctx, inception, soaexpire,
- check_ksk);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:add_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
-
- if (finishedakey) {
- /*
- * We have changed the RRset above so we need to update
- * the signatures.
- */
- result = del_sigs(zone, db, version, &zone->origin,
- zone->privatetype, &sig_diff,
- zone_keys, nkeys, now);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:del_sigs -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- result = add_sigs(db, version, &zone->origin,
- zone->privatetype, &sig_diff,
- zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ if (ISC_LIST_HEAD(post_diff.tuples) != NULL) {
+ result = update_sigs(&post_diff, db, version, zone_keys,
+ nkeys, zone, inception, expire, now,
+ check_ksk, keyset_kskonly, &sig_diff);
if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:add_sigs -> %s\n",
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_sign:"
+ "update_sigs -> %s\n",
dns_result_totext(result));
goto failure;
}
@@ -5838,8 +6823,10 @@ zone_sign(dns_zone_t *zone) {
/*
* Have we changed anything?
*/
- if (ISC_LIST_HEAD(sig_diff.tuples) == NULL)
+ if (ISC_LIST_HEAD(sig_diff.tuples) == NULL) {
+ result = ISC_R_SUCCESS;
goto pauseall;
+ }
commit = ISC_TRUE;
@@ -5866,7 +6853,7 @@ zone_sign(dns_zone_t *zone) {
*/
result = add_sigs(db, version, &zone->origin, dns_rdatatype_soa,
&sig_diff, zone_keys, nkeys, zone->mctx, inception,
- soaexpire, check_ksk);
+ soaexpire, check_ksk, keyset_kskonly);
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"zone_sign:add_sigs -> %s\n",
@@ -5877,27 +6864,9 @@ zone_sign(dns_zone_t *zone) {
/*
* Write changes to journal file.
*/
- journalfile = dns_zone_getjournal(zone);
- if (journalfile != NULL) {
- dns_journal_t *journal = NULL;
- result = dns_journal_open(zone->mctx, journalfile,
- ISC_TRUE, &journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:dns_journal_open -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
-
- result = dns_journal_write_transaction(journal, &sig_diff);
- dns_journal_destroy(&journal);
- if (result != ISC_R_SUCCESS) {
- dns_zone_log(zone, ISC_LOG_ERROR,
- "zone_sign:dns_journal_write_transaction -> %s\n",
- dns_result_totext(result));
- goto failure;
- }
- }
+ result = zone_journal(zone, &sig_diff, "zone_sign");
+ if (result != ISC_R_SUCCESS)
+ goto failure;
pauseall:
/*
@@ -5934,6 +6903,7 @@ zone_sign(dns_zone_t *zone) {
if (commit) {
LOCK_ZONE(zone);
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY);
zone_needdump(zone, DNS_DUMP_DELAY);
UNLOCK_ZONE(zone);
}
@@ -5945,7 +6915,7 @@ zone_sign(dns_zone_t *zone) {
signing = ISC_LIST_HEAD(cleanup);
while (signing != NULL) {
ISC_LIST_UNLINK(cleanup, signing, link);
- ISC_LIST_APPEND(zone->signing, signing, link);
+ ISC_LIST_PREPEND(zone->signing, signing, link);
dns_dbiterator_first(signing->dbiterator);
dns_dbiterator_pause(signing->dbiterator);
signing = ISC_LIST_HEAD(cleanup);
@@ -5961,6 +6931,9 @@ zone_sign(dns_zone_t *zone) {
for (i = 0; i < nkeys; i++)
dst_key_free(&zone_keys[i]);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+
if (version != NULL) {
dns_db_closeversion(db, &version, ISC_FALSE);
dns_db_detach(&db);
@@ -5979,6 +6952,832 @@ zone_sign(dns_zone_t *zone) {
}
static void
+normalize_key(dns_rdata_t *rr, dns_rdata_t *target,
+ unsigned char *data, int size) {
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_keydata_t keydata;
+ isc_buffer_t buf;
+
+ dns_rdata_reset(target);
+ isc_buffer_init(&buf, data, size);
+
+ switch (rr->type) {
+ case dns_rdatatype_dnskey:
+ dns_rdata_tostruct(rr, &dnskey, NULL);
+ dnskey.flags &= ~DNS_KEYFLAG_REVOKE;
+ dns_rdata_fromstruct(target, rr->rdclass, dns_rdatatype_dnskey,
+ &dnskey, &buf);
+ break;
+ case dns_rdatatype_keydata:
+ dns_rdata_tostruct(rr, &keydata, NULL);
+ dns_keydata_todnskey(&keydata, &dnskey, NULL);
+ dns_rdata_fromstruct(target, rr->rdclass, dns_rdatatype_dnskey,
+ &dnskey, &buf);
+ break;
+ default:
+ INSIST(0);
+ }
+}
+
+/*
+ * 'rdset' contains either a DNSKEY rdataset from the zone apex, or
+ * a KEYDATA rdataset from the key zone.
+ *
+ * 'rr' contains either a DNSKEY record, or a KEYDATA record
+ *
+ * After normalizing keys to the same format (DNSKEY, with revoke bit
+ * cleared), return ISC_TRUE if a key that matches 'rr' is found in
+ * 'rdset', or ISC_FALSE if not.
+ */
+
+static isc_boolean_t
+matchkey(dns_rdataset_t *rdset, dns_rdata_t *rr) {
+ unsigned char data1[4096], data2[4096];
+ dns_rdata_t rdata, rdata1, rdata2;
+ isc_result_t result;
+
+ dns_rdata_init(&rdata);
+ dns_rdata_init(&rdata1);
+ dns_rdata_init(&rdata2);
+
+ normalize_key(rr, &rdata1, data1, sizeof(data1));
+
+ for (result = dns_rdataset_first(rdset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(rdset, &rdata);
+ normalize_key(&rdata, &rdata2, data2, sizeof(data2));
+ if (dns_rdata_compare(&rdata1, &rdata2) == 0)
+ return (ISC_TRUE);
+ }
+
+ return (ISC_FALSE);
+}
+
+/*
+ * Calculate the refresh interval for a keydata zone, per
+ * RFC5011: MAX(1 hr,
+ * MIN(15 days,
+ * 1/2 * OrigTTL,
+ * 1/2 * RRSigExpirationInterval))
+ * or for retries: MAX(1 hr,
+ * MIN(1 day,
+ * 1/10 * OrigTTL,
+ * 1/10 * RRSigExpirationInterval))
+ */
+static inline isc_stdtime_t
+refresh_time(dns_keyfetch_t *kfetch, isc_boolean_t retry) {
+ isc_result_t result;
+ isc_uint32_t t;
+ dns_rdataset_t *rdset;
+ dns_rdata_t sigrr = DNS_RDATA_INIT;
+ dns_rdata_sig_t sig;
+ isc_stdtime_t now;
+
+ isc_stdtime_get(&now);
+
+ if (dns_rdataset_isassociated(&kfetch->dnskeysigset))
+ rdset = &kfetch->dnskeysigset;
+ else
+ return (now + HOUR);
+
+ result = dns_rdataset_first(rdset);
+ if (result != ISC_R_SUCCESS)
+ return (now + HOUR);
+
+ dns_rdataset_current(rdset, &sigrr);
+ result = dns_rdata_tostruct(&sigrr, &sig, NULL);
+
+ if (!retry) {
+ t = sig.originalttl / 2;
+
+ if (isc_serial_gt(sig.timeexpire, now)) {
+ isc_uint32_t exp = (sig.timeexpire - now) / 2;
+ if (t > exp)
+ t = exp;
+ }
+
+ if (t > (15*DAY))
+ t = (15*DAY);
+
+ if (t < HOUR)
+ t = HOUR;
+ } else {
+ t = sig.originalttl / 10;
+
+ if (isc_serial_gt(sig.timeexpire, now)) {
+ isc_uint32_t exp = (sig.timeexpire - now) / 10;
+ if (t > exp)
+ t = exp;
+ }
+
+ if (t > DAY)
+ t = DAY;
+
+ if (t < HOUR)
+ t = HOUR;
+ }
+
+ return (now + t);
+}
+
+/*
+ * This routine is called when no changes are needed in a KEYDATA
+ * record except to simply update the refresh timer. Caller should
+ * hold zone lock.
+ */
+static isc_result_t
+minimal_update(dns_keyfetch_t *kfetch, dns_dbversion_t *ver, dns_diff_t *diff)
+{
+ isc_result_t result;
+ isc_buffer_t keyb;
+ unsigned char key_buf[4096];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_keydata_t keydata;
+ dns_name_t *name;
+ dns_zone_t *zone = kfetch->zone;
+ isc_stdtime_t now;
+
+ name = dns_fixedname_name(&kfetch->name);
+ isc_stdtime_get(&now);
+
+ for (result = dns_rdataset_first(&kfetch->keydataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->keydataset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(&kfetch->keydataset, &rdata);
+
+ /* Delete old version */
+ CHECK(update_one_rr(kfetch->db, ver, diff, DNS_DIFFOP_DEL,
+ name, 0, &rdata));
+
+ /* Update refresh timer */
+ CHECK(dns_rdata_tostruct(&rdata, &keydata, NULL));
+ keydata.refresh = refresh_time(kfetch, ISC_TRUE);
+ set_refreshkeytimer(zone, &keydata, now);
+
+ dns_rdata_reset(&rdata);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ CHECK(dns_rdata_fromstruct(&rdata,
+ zone->rdclass, dns_rdatatype_keydata,
+ &keydata, &keyb));
+
+ /* Insert updated version */
+ CHECK(update_one_rr(kfetch->db, ver, diff, DNS_DIFFOP_ADD,
+ name, 0, &rdata));
+ }
+ result = ISC_R_SUCCESS;
+ failure:
+ return (result);
+}
+
+/*
+ * Verify that DNSKEY set is signed by the key specified in 'keydata'.
+ */
+static isc_boolean_t
+revocable(dns_keyfetch_t *kfetch, dns_rdata_keydata_t *keydata) {
+ isc_result_t result;
+ dns_name_t *keyname;
+ isc_mem_t *mctx;
+ dns_rdata_t sigrr = DNS_RDATA_INIT;
+ dns_rdata_t rr = DNS_RDATA_INIT;
+ dns_rdata_rrsig_t sig;
+ dns_rdata_dnskey_t dnskey;
+ dst_key_t *dstkey = NULL;
+ unsigned char key_buf[4096];
+ isc_buffer_t keyb;
+ isc_boolean_t answer = ISC_FALSE;
+
+ REQUIRE(kfetch != NULL && keydata != NULL);
+ REQUIRE(dns_rdataset_isassociated(&kfetch->dnskeysigset));
+
+ keyname = dns_fixedname_name(&kfetch->name);
+ mctx = kfetch->zone->view->mctx;
+
+ /* Generate a key from keydata */
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_keydata_todnskey(keydata, &dnskey, NULL);
+ dns_rdata_fromstruct(&rr, keydata->common.rdclass, dns_rdatatype_dnskey,
+ &dnskey, &keyb);
+ result = dns_dnssec_keyfromrdata(keyname, &rr, mctx, &dstkey);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_FALSE);
+
+ /* See if that key generated any of the signatures */
+ for (result = dns_rdataset_first(&kfetch->dnskeysigset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->dnskeysigset)) {
+ dns_fixedname_t fixed;
+ dns_fixedname_init(&fixed);
+
+ dns_rdata_reset(&sigrr);
+ dns_rdataset_current(&kfetch->dnskeysigset, &sigrr);
+ result = dns_rdata_tostruct(&sigrr, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ if (dst_key_alg(dstkey) == sig.algorithm &&
+ (dst_key_id(dstkey) == sig.keyid ||
+ (sig.algorithm != 1 && sig.keyid ==
+ ((dst_key_id(dstkey) + 128) & 0xffff)))) {
+ result = dns_dnssec_verify2(keyname,
+ &kfetch->dnskeyset,
+ dstkey, ISC_FALSE, mctx, &sigrr,
+ dns_fixedname_name(&fixed));
+
+ dns_zone_log(kfetch->zone, ISC_LOG_DEBUG(3),
+ "Confirm revoked DNSKEY is self-signed: "
+ "%s", dns_result_totext(result));
+
+ if (result == ISC_R_SUCCESS) {
+ answer = ISC_TRUE;
+ break;
+ }
+ }
+ }
+
+ dst_key_free(&dstkey);
+ return (answer);
+}
+
+/*
+ * A DNSKEY set has been fetched from the zone apex of a zone whose trust
+ * anchors are being managed; scan the keyset, and update the key zone and the
+ * local trust anchors according to RFC5011.
+ */
+static void
+keyfetch_done(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result, eresult;
+ dns_fetchevent_t *devent;
+ dns_keyfetch_t *kfetch;
+ dns_zone_t *zone;
+ isc_mem_t *mctx = NULL;
+ dns_keytable_t *secroots = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ isc_boolean_t changed = ISC_FALSE;
+ isc_boolean_t alldone = ISC_FALSE;
+ dns_name_t *keyname;
+ dns_rdata_t sigrr = DNS_RDATA_INIT;
+ dns_rdata_t dnskeyrr = DNS_RDATA_INIT;
+ dns_rdata_t keydatarr = DNS_RDATA_INIT;
+ dns_rdata_rrsig_t sig;
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_keydata_t keydata;
+ isc_boolean_t initializing;
+ char namebuf[DNS_NAME_FORMATSIZE];
+ unsigned char key_buf[4096];
+ isc_buffer_t keyb;
+ dst_key_t *dstkey;
+ isc_stdtime_t now;
+ int pending = 0;
+ isc_boolean_t secure;
+
+ UNUSED(task);
+ INSIST(event != NULL && event->ev_type == DNS_EVENT_FETCHDONE);
+ INSIST(event->ev_arg != NULL);
+
+ kfetch = event->ev_arg;
+ zone = kfetch->zone;
+ isc_mem_attach(zone->mctx, &mctx);
+ keyname = dns_fixedname_name(&kfetch->name);
+
+ devent = (dns_fetchevent_t *) event;
+ eresult = devent->result;
+
+ /* Free resources which are not of interest */
+ if (devent->node != NULL)
+ dns_db_detachnode(devent->db, &devent->node);
+ if (devent->db != NULL)
+ dns_db_detach(&devent->db);
+ isc_event_free(&event);
+ dns_resolver_destroyfetch(&kfetch->fetch);
+
+ isc_stdtime_get(&now);
+ dns_name_format(keyname, namebuf, sizeof(namebuf));
+
+ result = dns_view_getsecroots(zone->view, &secroots);
+ INSIST(result == ISC_R_SUCCESS);
+
+ LOCK_ZONE(zone);
+ dns_db_newversion(kfetch->db, &ver);
+ dns_diff_init(mctx, &diff);
+
+ zone->refreshkeycount--;
+ alldone = ISC_TF(zone->refreshkeycount == 0);
+
+ if (alldone)
+ DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESHING);
+
+ /* Fetch failed */
+ if (eresult != ISC_R_SUCCESS ||
+ !dns_rdataset_isassociated(&kfetch->dnskeyset)) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Unable to fetch DNSKEY set "
+ "'%s': %s", namebuf, dns_result_totext(eresult));
+ CHECK(minimal_update(kfetch, ver, &diff));
+ changed = ISC_TRUE;
+ goto failure;
+ }
+
+ /* No RRSIGs found */
+ if (!dns_rdataset_isassociated(&kfetch->dnskeysigset)) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "No DNSKEY RRSIGs found for "
+ "'%s': %s", namebuf, dns_result_totext(eresult));
+ CHECK(minimal_update(kfetch, ver, &diff));
+ changed = ISC_TRUE;
+ goto failure;
+ }
+
+ /*
+ * Validate the dnskeyset against the current trusted keys.
+ */
+ for (result = dns_rdataset_first(&kfetch->dnskeysigset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->dnskeysigset)) {
+ dns_keynode_t *keynode = NULL;
+
+ dns_rdata_reset(&sigrr);
+ dns_rdataset_current(&kfetch->dnskeysigset, &sigrr);
+ result = dns_rdata_tostruct(&sigrr, &sig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ result = dns_keytable_find(secroots, keyname, &keynode);
+ while (result == ISC_R_SUCCESS) {
+ dns_keynode_t *nextnode = NULL;
+ dns_fixedname_t fixed;
+ dns_fixedname_init(&fixed);
+
+ dstkey = dns_keynode_key(keynode);
+ if (dstkey == NULL) /* fail_secure() was called */
+ break;
+
+ if (dst_key_alg(dstkey) == sig.algorithm &&
+ dst_key_id(dstkey) == sig.keyid) {
+ result = dns_dnssec_verify2(keyname,
+ &kfetch->dnskeyset,
+ dstkey, ISC_FALSE,
+ zone->view->mctx, &sigrr,
+ dns_fixedname_name(&fixed));
+
+ dns_zone_log(zone, ISC_LOG_DEBUG(3),
+ "Verifying DNSKEY set for zone "
+ "'%s': %s", namebuf,
+ dns_result_totext(result));
+
+ if (result == ISC_R_SUCCESS) {
+ kfetch->dnskeyset.trust =
+ dns_trust_secure;
+ kfetch->dnskeysigset.trust =
+ dns_trust_secure;
+ dns_keytable_detachkeynode(secroots,
+ &keynode);
+ break;
+ }
+ }
+
+ result = dns_keytable_nextkeynode(secroots,
+ keynode, &nextnode);
+ dns_keytable_detachkeynode(secroots, &keynode);
+ keynode = nextnode;
+ }
+
+ if (kfetch->dnskeyset.trust == dns_trust_secure)
+ break;
+ }
+
+ /*
+ * If we were not able to verify the answer using the current
+ * trusted keys then all we can do is look at any revoked keys.
+ */
+ secure = ISC_TF(kfetch->dnskeyset.trust == dns_trust_secure);
+
+ /*
+ * First scan keydataset to find keys that are not in dnskeyset
+ * - Missing keys which are not scheduled for removal,
+ * log a warning
+ * - Missing keys which are scheduled for removal and
+ * the remove hold-down timer has completed should
+ * be removed from the key zone
+ * - Missing keys whose acceptance timers have not yet
+ * completed, log a warning and reset the acceptance
+ * timer to 30 days in the future
+ * - All keys not being removed have their refresh timers
+ * updated
+ */
+ initializing = ISC_TRUE;
+ for (result = dns_rdataset_first(&kfetch->keydataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->keydataset)) {
+ dns_rdata_reset(&keydatarr);
+ dns_rdataset_current(&kfetch->keydataset, &keydatarr);
+ dns_rdata_tostruct(&keydatarr, &keydata, NULL);
+
+ /*
+ * If any keydata record has a nonzero add holddown, then
+ * there was a pre-existing trust anchor for this domain;
+ * that means we are *not* initializing it and shouldn't
+ * automatically trust all the keys we find at the zone apex.
+ */
+ initializing = initializing && ISC_TF(keydata.addhd == 0);
+
+ if (! matchkey(&kfetch->dnskeyset, &keydatarr)) {
+ isc_boolean_t deletekey = ISC_FALSE;
+
+ if (!secure) {
+ if (now > keydata.removehd)
+ deletekey = ISC_TRUE;
+ } else if (now < keydata.addhd) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Pending key unexpectedly missing "
+ "from %s; restarting acceptance "
+ "timer", namebuf);
+ keydata.addhd = now + MONTH;
+ keydata.refresh = refresh_time(kfetch,
+ ISC_FALSE);
+ } else if (keydata.addhd == 0) {
+ keydata.addhd = now;
+ } else if (keydata.removehd == 0) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Active key unexpectedly missing "
+ "from %s", namebuf);
+ keydata.refresh = now + HOUR;
+ } else if (now > keydata.removehd) {
+ deletekey = ISC_TRUE;
+ } else {
+ keydata.refresh = refresh_time(kfetch,
+ ISC_FALSE);
+ }
+
+ if (secure || deletekey) {
+ /* Delete old version */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_DEL, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ }
+
+ if (!secure || deletekey)
+ continue;
+
+ dns_rdata_reset(&keydatarr);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_rdata_fromstruct(&keydatarr, zone->rdclass,
+ dns_rdatatype_keydata,
+ &keydata, &keyb);
+
+ /* Insert updated version */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_ADD, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+
+ set_refreshkeytimer(zone, &keydata, now);
+ }
+ }
+
+ /*
+ * Next scan dnskeyset:
+ * - If new keys are found (i.e., lacking a match in keydataset)
+ * add them to the key zone and set the acceptance timer
+ * to 30 days in the future (or to immediately if we've
+ * determined that we're initializing the zone for the
+ * first time)
+ * - Previously-known keys that have been revoked
+ * must be scheduled for removal from the key zone (or,
+ * if they hadn't been accepted as trust anchors yet
+ * anyway, removed at once)
+ * - Previously-known unrevoked keys whose acceptance timers
+ * have completed are promoted to trust anchors
+ * - All keys not being removed have their refresh
+ * timers updated
+ */
+ for (result = dns_rdataset_first(&kfetch->dnskeyset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&kfetch->dnskeyset)) {
+ isc_boolean_t revoked = ISC_FALSE;
+ isc_boolean_t newkey = ISC_FALSE;
+ isc_boolean_t updatekey = ISC_FALSE;
+ isc_boolean_t deletekey = ISC_FALSE;
+ isc_boolean_t trustkey = ISC_FALSE;
+
+ dns_rdata_reset(&dnskeyrr);
+ dns_rdataset_current(&kfetch->dnskeyset, &dnskeyrr);
+ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
+
+ /* Skip ZSK's */
+ if (!ISC_TF(dnskey.flags & DNS_KEYFLAG_KSK))
+ continue;
+
+ revoked = ISC_TF(dnskey.flags & DNS_KEYFLAG_REVOKE);
+
+ if (matchkey(&kfetch->keydataset, &dnskeyrr)) {
+ dns_rdata_reset(&keydatarr);
+ dns_rdataset_current(&kfetch->keydataset, &keydatarr);
+ dns_rdata_tostruct(&keydatarr, &keydata, NULL);
+
+ if (revoked && revocable(kfetch, &keydata)) {
+ if (keydata.addhd > now) {
+ /*
+ * Key wasn't trusted yet, and now
+ * it's been revoked? Just remove it
+ */
+ deletekey = ISC_TRUE;
+ } else if (keydata.removehd == 0) {
+ /* Remove from secroots */
+ untrust_key(zone->view->viewlist,
+ keyname, mctx, &dnskey);
+
+ /* If initializing, delete now */
+ if (keydata.addhd == 0)
+ deletekey = ISC_TRUE;
+ else
+ keydata.removehd = now + MONTH;
+ } else if (keydata.removehd < now) {
+ /* Scheduled for removal */
+ deletekey = ISC_TRUE;
+ }
+ } else if (revoked) {
+ if (secure && keydata.removehd == 0) {
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Active key for zone "
+ "'%s' is revoked but "
+ "did not self-sign; "
+ "ignoring.", namebuf);
+ continue;
+ }
+ } else if (secure) {
+ if (keydata.removehd != 0) {
+ /*
+ * Key isn't revoked--but it
+ * seems it used to be.
+ * Remove it now and add it
+ * back as if it were a fresh key.
+ */
+ deletekey = ISC_TRUE;
+ newkey = ISC_TRUE;
+ } else if (keydata.addhd > now)
+ pending++;
+ else if (keydata.addhd == 0)
+ keydata.addhd = now;
+
+ if (keydata.addhd <= now)
+ trustkey = ISC_TRUE;
+ }
+
+ if (!deletekey && !newkey)
+ updatekey = ISC_TRUE;
+ } else if (secure) {
+ /*
+ * Key wasn't in the key zone but it's
+ * revoked now anyway, so just skip it
+ */
+ if (revoked)
+ continue;
+
+ /* Key wasn't in the key zone: add it */
+ newkey = ISC_TRUE;
+
+ if (initializing) {
+ dns_keytag_t tag = 0;
+ CHECK(compute_tag(keyname, &dnskey,
+ mctx, &tag));
+ dns_zone_log(zone, ISC_LOG_WARNING,
+ "Initializing automatic trust "
+ "anchor management for zone '%s'; "
+ "DNSKEY ID %d is now trusted, "
+ "waiving the normal 30-day "
+ "waiting period.",
+ namebuf, tag);
+ trustkey = ISC_TRUE;
+ }
+ }
+
+ /* Delete old version */
+ if (deletekey || !newkey) {
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_DEL, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ }
+
+ if (updatekey) {
+ /* Set refresh timer */
+ keydata.refresh = refresh_time(kfetch, ISC_FALSE);
+ dns_rdata_reset(&keydatarr);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_rdata_fromstruct(&keydatarr, zone->rdclass,
+ dns_rdatatype_keydata,
+ &keydata, &keyb);
+
+ /* Insert updated version */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_ADD, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ } else if (newkey) {
+ /* Convert DNSKEY to KEYDATA */
+ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
+ dns_keydata_fromdnskey(&keydata, &dnskey, 0, 0, 0,
+ NULL);
+ keydata.addhd = initializing ? now : now + MONTH;
+ keydata.refresh = refresh_time(kfetch, ISC_FALSE);
+ dns_rdata_reset(&keydatarr);
+ isc_buffer_init(&keyb, key_buf, sizeof(key_buf));
+ dns_rdata_fromstruct(&keydatarr, zone->rdclass,
+ dns_rdatatype_keydata,
+ &keydata, &keyb);
+
+ /* Insert into key zone */
+ CHECK(update_one_rr(kfetch->db, ver, &diff,
+ DNS_DIFFOP_ADD, keyname, 0,
+ &keydatarr));
+ changed = ISC_TRUE;
+ }
+
+ if (trustkey) {
+ /* Trust this key in all views */
+ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
+ trust_key(zone->view->viewlist, keyname, &dnskey,
+ mctx);
+ }
+
+ if (!deletekey)
+ set_refreshkeytimer(zone, &keydata, now);
+ }
+
+ /*
+ * RFC5011 says, "A trust point that has all of its trust anchors
+ * revoked is considered deleted and is treated as if the trust
+ * point was never configured." But if someone revoked their
+ * active key before the standby was trusted, that would mean the
+ * zone would suddenly be nonsecured. We avoid this by checking to
+ * see if there's pending keydata. If so, we put a null key in
+ * the security roots; then all queries to the zone will fail.
+ */
+ if (pending != 0)
+ fail_secure(zone->view->viewlist, keyname);
+
+ failure:
+ if (changed) {
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+ zone_needdump(zone, 30);
+ }
+
+ UNLOCK_ZONE(zone);
+
+ /* Write changes to journal file. */
+ if (alldone) {
+ result = increment_soa_serial(kfetch->db, ver, &diff, mctx);
+ if (result == ISC_R_SUCCESS)
+ result = zone_journal(zone, &diff, "keyfetch_done");
+ }
+
+ dns_diff_clear(&diff);
+ dns_db_closeversion(kfetch->db, &ver, changed);
+ dns_db_detach(&kfetch->db);
+ dns_zone_detach(&kfetch->zone);
+
+ if (dns_rdataset_isassociated(&kfetch->keydataset))
+ dns_rdataset_disassociate(&kfetch->keydataset);
+ if (dns_rdataset_isassociated(&kfetch->dnskeyset))
+ dns_rdataset_disassociate(&kfetch->dnskeyset);
+ if (dns_rdataset_isassociated(&kfetch->dnskeysigset))
+ dns_rdataset_disassociate(&kfetch->dnskeysigset);
+
+ dns_name_free(keyname, mctx);
+ isc_mem_put(mctx, kfetch, sizeof(dns_keyfetch_t));
+ isc_mem_detach(&mctx);
+
+ if (secroots != NULL)
+ dns_keytable_detach(&secroots);
+}
+
+/*
+ * Refresh the data in the key zone. Initiate a fetch to get new DNSKEY
+ * records from the zone apex.
+ */
+static void
+zone_refreshkeys(dns_zone_t *zone) {
+ const char me[] = "zone_refreshkeys";
+ isc_result_t result;
+ dns_rriterator_t rrit;
+ dns_db_t *db = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_diff_t diff;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_keydata_t kd;
+ isc_stdtime_t now;
+ isc_boolean_t commit = ISC_FALSE;
+
+ ENTER;
+ REQUIRE(zone->db != NULL);
+
+ isc_stdtime_get(&now);
+
+ ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
+ dns_db_attach(zone->db, &db);
+ ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read);
+
+ LOCK_ZONE(zone);
+ dns_db_newversion(db, &ver);
+ dns_diff_init(zone->mctx, &diff);
+
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_REFRESHING);
+
+ dns_rriterator_init(&rrit, db, ver, 0);
+ for (result = dns_rriterator_first(&rrit);
+ result == ISC_R_SUCCESS;
+ result = dns_rriterator_nextrrset(&rrit)) {
+ isc_stdtime_t timer = 0xffffffff;
+ dns_keyfetch_t *kfetch;
+ dns_rdataset_t *kdset;
+ dns_name_t *name = NULL;
+ isc_uint32_t ttl;
+
+ dns_rriterator_current(&rrit, &name, &ttl, &kdset, NULL);
+ if (!dns_rdataset_isassociated(kdset))
+ continue;
+
+ if (kdset->type != dns_rdatatype_keydata)
+ continue;
+
+ /*
+ * Scan the stored keys looking for ones that need
+ * removal or refreshing
+ */
+ for (result = dns_rdataset_first(kdset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(kdset)) {
+ dns_rdata_reset(&rdata);
+ dns_rdataset_current(kdset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &kd, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ /* Removal timer expired? */
+ if (kd.removehd != 0 && kd.removehd < now) {
+ CHECK(update_one_rr(db, ver, &diff,
+ DNS_DIFFOP_DEL, name, ttl,
+ &rdata));
+ continue;
+ }
+
+ /* Acceptance timer expired? */
+ if (kd.addhd != 0 && kd.addhd < now)
+ timer = kd.addhd;
+
+ /* Or do we just need to refresh the keyset? */
+ if (timer > kd.refresh)
+ timer = kd.refresh;
+ }
+
+ if (timer > now)
+ continue;
+
+ zone->refreshkeycount++;
+
+ kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t));
+ kfetch->zone = NULL;
+ dns_zone_attach(zone, &kfetch->zone);
+ dns_fixedname_init(&kfetch->name);
+ dns_name_dup(name, zone->mctx,
+ dns_fixedname_name(&kfetch->name));
+ dns_rdataset_init(&kfetch->dnskeyset);
+ dns_rdataset_init(&kfetch->dnskeysigset);
+ dns_rdataset_init(&kfetch->keydataset);
+ dns_rdataset_clone(kdset, &kfetch->keydataset);
+ kfetch->db = NULL;
+ dns_db_attach(db, &kfetch->db);
+ kfetch->fetch = NULL;
+
+ dns_resolver_createfetch(zone->view->resolver,
+ dns_fixedname_name(&kfetch->name),
+ dns_rdatatype_dnskey,
+ NULL, NULL, NULL,
+ DNS_FETCHOPT_NOVALIDATE,
+ zone->task, keyfetch_done, kfetch,
+ &kfetch->dnskeyset,
+ &kfetch->dnskeysigset,
+ &kfetch->fetch);
+ }
+ if (!ISC_LIST_EMPTY(diff.tuples)) {
+ CHECK(increment_soa_serial(db, ver, &diff, zone->mctx));
+ commit = ISC_TRUE;
+ zone_journal(zone, &diff, "sync_keyzone");
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+ zone_needdump(zone, 30);
+ }
+ failure:
+ UNLOCK_ZONE(zone);
+
+ dns_rriterator_destroy(&rrit);
+ dns_diff_clear(&diff);
+ dns_db_closeversion(db, &ver, commit);
+ dns_db_detach(&db);
+}
+
+static void
zone_maintenance(dns_zone_t *zone) {
const char me[] = "zone_maintenance";
isc_time_t now;
@@ -5991,7 +7790,7 @@ zone_maintenance(dns_zone_t *zone) {
/*
* Configuring the view of this zone may have
* failed, for example because the config file
- * had a syntax error. In that case, the view
+ * had a syntax error. In that case, the view
* adb or resolver, and we had better not try
* to do maintenance on it.
*/
@@ -6038,6 +7837,7 @@ zone_maintenance(dns_zone_t *zone) {
switch (zone->type) {
case dns_zone_master:
case dns_zone_slave:
+ case dns_zone_key:
LOCK_ZONE(zone);
if (zone->masterfile != NULL &&
isc_time_compare(&now, &zone->dumptime) >= 0 &&
@@ -6059,6 +7859,24 @@ zone_maintenance(dns_zone_t *zone) {
break;
}
+ /*
+ * Do we need to refresh keys?
+ */
+ switch (zone->type) {
+ case dns_zone_key:
+ if (isc_time_compare(&now, &zone->refreshkeytime) >= 0 &&
+ DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) &&
+ !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING))
+ zone_refreshkeys(zone);
+ break;
+ case dns_zone_master:
+ if (!isc_time_isepoch(&zone->refreshkeytime) &&
+ isc_time_compare(&now, &zone->refreshkeytime) >= 0)
+ zone_rekey(zone);
+ default:
+ break;
+ }
+
switch (zone->type) {
case dns_zone_master:
case dns_zone_slave:
@@ -6098,7 +7916,8 @@ void
dns_zone_markdirty(dns_zone_t *zone) {
LOCK_ZONE(zone);
- set_resigntime(zone); /* XXXMPA make separate call back */
+ if (zone->type == dns_zone_master)
+ set_resigntime(zone); /* XXXMPA make separate call back */
zone_needdump(zone, DNS_DUMP_DELAY);
UNLOCK_ZONE(zone);
}
@@ -8474,7 +10293,7 @@ zone_shutdown(isc_task_t *task, isc_event_t *event) {
/*
* We have now canceled everything set the flag to allow exit_check()
- * to succeed. We must not unlock between setting this flag and
+ * to succeed. We must not unlock between setting this flag and
* calling exit_check().
*/
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_SHUTDOWN);
@@ -8505,6 +10324,7 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
isc_time_t next;
isc_result_t result;
+ ENTER;
REQUIRE(DNS_ZONE_VALID(zone));
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING))
return;
@@ -8522,6 +10342,12 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
isc_time_compare(&zone->dumptime, &next) < 0)
next = zone->dumptime;
}
+ if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING) &&
+ !isc_time_isepoch(&zone->refreshkeytime)) {
+ if (isc_time_isepoch(&next) ||
+ isc_time_compare(&zone->refreshkeytime, &next) < 0)
+ next = zone->refreshkeytime;
+ }
if (!isc_time_isepoch(&zone->resigntime)) {
if (isc_time_isepoch(&next) ||
isc_time_compare(&zone->resigntime, &next) < 0)
@@ -8574,6 +10400,22 @@ zone_settimer(dns_zone_t *zone, isc_time_t *now) {
}
break;
+ case dns_zone_key:
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NEEDDUMP) &&
+ !DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING)) {
+ INSIST(!isc_time_isepoch(&zone->dumptime));
+ if (isc_time_isepoch(&next) ||
+ isc_time_compare(&zone->dumptime, &next) < 0)
+ next = zone->dumptime;
+ }
+ if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESHING)) {
+ if (isc_time_isepoch(&next) ||
+ (!isc_time_isepoch(&zone->refreshkeytime) &&
+ isc_time_compare(&zone->refreshkeytime, &next) < 0))
+ next = zone->refreshkeytime;
+ }
+ break;
+
default:
break;
}
@@ -8786,7 +10628,7 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
REQUIRE(DNS_ZONE_VALID(zone));
/*
- * If type != T_SOA return DNS_R_REFUSED. We don't yet support
+ * If type != T_SOA return DNS_R_NOTIMP. We don't yet support
* ROLLOVER.
*
* SOA: RFC1996
@@ -8905,7 +10747,8 @@ dns_zone_notifyreceive(dns_zone_t *zone, isc_sockaddr_t *from,
NULL, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (isc_serial_le(serial, oldserial)) {
- dns_zone_log(zone, ISC_LOG_INFO,
+ dns_zone_log(zone,
+ ISC_LOG_INFO,
"notify from %s: "
"zone is up to date",
fromtext);
@@ -9309,7 +11152,8 @@ dns_zone_logc(dns_zone_t *zone, isc_logcategory_t *category,
vsnprintf(message, sizeof(message), fmt, ap);
va_end(ap);
isc_log_write(dns_lctx, category, DNS_LOGMODULE_ZONE,
- level, "zone %s: %s", zone->strnamerd, message);
+ level, "%s %s: %s", (zone->type == dns_zone_key) ?
+ "managed-keys-zone" : "zone", zone->strnamerd, message);
}
void
@@ -9324,7 +11168,8 @@ dns_zone_log(dns_zone_t *zone, int level, const char *fmt, ...) {
vsnprintf(message, sizeof(message), fmt, ap);
va_end(ap);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
- level, "zone %s: %s", zone->strnamerd, message);
+ level, "%s %s: %s", (zone->type == dns_zone_key) ?
+ "managed-keys-zone" : "zone", zone->strnamerd, message);
}
static void
@@ -9342,7 +11187,8 @@ zone_debuglog(dns_zone_t *zone, const char *me, int debuglevel,
vsnprintf(message, sizeof(message), fmt, ap);
va_end(ap);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
- level, "%s: zone %s: %s", me, zone->strnamerd, message);
+ level, "%s: %s %s: %s", me, zone->type != dns_zone_key ?
+ "zone" : "managed-keys-zone", zone->strnamerd, message);
}
static int
@@ -9499,7 +11345,7 @@ notify_done(isc_task_t *task, isc_event_t *event) {
dns_result_totext(result));
/*
- * Old bind's return formerr if they see a soa record. Retry w/o
+ * Old bind's return formerr if they see a soa record. Retry w/o
* the soa if we see a formerr and had sent a SOA.
*/
isc_event_free(&event);
@@ -9554,7 +11400,7 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
"has %d SOA records", soacount);
result = DNS_R_BADZONE;
}
- if (nscount == 0) {
+ if (nscount == 0 && zone->type != dns_zone_key) {
dns_zone_log(zone, ISC_LOG_ERROR, "has no NS records");
result = DNS_R_BADZONE;
}
@@ -9640,24 +11486,27 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
}
} else {
if (dump && zone->masterfile != NULL) {
- isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
- DNS_LOGMODULE_ZONE, ISC_LOG_DEBUG(3),
- "dumping new zone version");
- result = dns_db_dump2(db, ver, zone->masterfile,
- zone->masterformat);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
/*
- * Update the time the zone was updated, so
- * dns_zone_load can avoid loading it when
- * the server is reloaded. If isc_time_now
- * fails for some reason, all that happens is
- * the timestamp is not updated.
+ * If DNS_ZONEFLG_FORCEXFER was set we don't want
+ * to keep the old masterfile.
*/
- TIME_NOW(&zone->loadtime);
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCEXFER) &&
+ remove(zone->masterfile) < 0 && errno != ENOENT) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(dns_lctx,
+ DNS_LOGCATEGORY_GENERAL,
+ DNS_LOGMODULE_ZONE,
+ ISC_LOG_WARNING,
+ "unable to remove masterfile "
+ "'%s': '%s'",
+ zone->masterfile, strbuf);
+ }
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) == 0)
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NODELAY);
+ else
+ zone_needdump(zone, 0);
}
-
if (dump && zone->journal != NULL) {
/*
* The in-memory database just changed, and
@@ -9665,7 +11514,7 @@ zone_replacedb(dns_zone_t *zone, dns_db_t *db, isc_boolean_t dump) {
* being loaded from disk. Also, we have not
* journaled diffs for this change.
* Therefore, the on-disk journal is missing
- * the deltas for this change. Since it can
+ * the deltas for this change. Since it can
* no longer be used to bring the zone
* up-to-date, it is useless and should be
* removed.
@@ -9853,16 +11702,19 @@ zone_xfrdone(dns_zone_t *zone, isc_result_t result) {
&now);
/* Someone removed the file from underneath us! */
if (result == ISC_R_FILENOTFOUND &&
- zone->masterfile != NULL)
- zone_needdump(zone, DNS_DUMP_DELAY);
- else if (result != ISC_R_SUCCESS)
+ zone->masterfile != NULL) {
+ unsigned int delay = DNS_DUMP_DELAY;
+ if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NODELAY))
+ delay = 0;
+ zone_needdump(zone, delay);
+ } else if (result != ISC_R_SUCCESS)
dns_zone_log(zone, ISC_LOG_ERROR,
"transfer: could not set file "
"modification time of '%s': %s",
zone->masterfile,
dns_result_totext(result));
}
-
+ DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_NODELAY);
inc_stats(zone, dns_zonestatscounter_xfrsuccess);
break;
@@ -11313,7 +13165,7 @@ dns_zone_setdialup(dns_zone_t *zone, dns_dialuptype_t dialup) {
case dns_dialuptype_no:
break;
case dns_dialuptype_yes:
- DNS_ZONE_SETFLAG(zone, (DNS_ZONEFLG_DIALNOTIFY |
+ DNS_ZONE_SETFLAG(zone, (DNS_ZONEFLG_DIALNOTIFY |
DNS_ZONEFLG_DIALREFRESH |
DNS_ZONEFLG_NOREFRESH));
break;
@@ -11642,3 +13494,778 @@ zone_signwithkey(dns_zone_t *zone, dns_secalg_t algorithm, isc_uint16_t keyid,
}
return (result);
}
+
+static void
+logmsg(const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_ZONE,
+ ISC_LOG_DEBUG(1), format, args);
+ va_end(args);
+}
+
+static void
+clear_keylist(dns_dnsseckeylist_t *list, isc_mem_t *mctx) {
+ dns_dnsseckey_t *key;
+ while (!ISC_LIST_EMPTY(*list)) {
+ key = ISC_LIST_HEAD(*list);
+ ISC_LIST_UNLINK(*list, key, link);
+ dns_dnsseckey_destroy(mctx, &key);
+ }
+}
+
+/* Called once; *timep should be set to the current time. */
+static isc_result_t
+next_keyevent(dst_key_t *key, isc_stdtime_t *timep) {
+ isc_result_t result;
+ isc_stdtime_t now, then = 0, event;
+ int i;
+
+ now = *timep;
+
+ for (i = 0; i <= DST_MAX_TIMES; i++) {
+ result = dst_key_gettime(key, i, &event);
+ if (result == ISC_R_SUCCESS && event > now &&
+ (then == 0 || event < then))
+ then = event;
+ }
+
+ if (then != 0) {
+ *timep = then;
+ return (ISC_R_SUCCESS);
+ }
+
+ return (ISC_R_NOTFOUND);
+}
+
+static isc_result_t
+rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
+ const dns_rdata_t *rdata, isc_boolean_t *flag)
+{
+ dns_rdataset_t rdataset;
+ dns_dbnode_t *node = NULL;
+ isc_result_t result;
+
+ dns_rdataset_init(&rdataset);
+ if (rdata->type == dns_rdatatype_nsec3)
+ CHECK(dns_db_findnsec3node(db, name, ISC_FALSE, &node));
+ else
+ CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
+ result = dns_db_findrdataset(db, node, ver, rdata->type, 0,
+ (isc_stdtime_t) 0, &rdataset, NULL);
+ if (result == ISC_R_NOTFOUND) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ goto failure;
+ }
+
+ for (result = dns_rdataset_first(&rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(&rdataset)) {
+ dns_rdata_t myrdata = DNS_RDATA_INIT;
+ dns_rdataset_current(&rdataset, &myrdata);
+ if (!dns_rdata_compare(&myrdata, rdata))
+ break;
+ }
+ dns_rdataset_disassociate(&rdataset);
+ if (result == ISC_R_SUCCESS) {
+ *flag = ISC_TRUE;
+ } else if (result == ISC_R_NOMORE) {
+ *flag = ISC_FALSE;
+ result = ISC_R_SUCCESS;
+ }
+
+ failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+
+/*
+ * Add records to signal the state of signing or of key removal.
+ */
+static isc_result_t
+add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype,
+ dns_dbversion_t *ver, dns_diff_t *diff)
+{
+ dns_difftuple_t *tuple, *newtuple = NULL;
+ dns_rdata_dnskey_t dnskey;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ isc_boolean_t flag;
+ isc_region_t r;
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_uint16_t keyid;
+ unsigned char buf[5];
+ dns_name_t *name = dns_db_origin(db);
+
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ if (tuple->rdata.type != dns_rdatatype_dnskey)
+ continue;
+
+ result = dns_rdata_tostruct(&tuple->rdata, &dnskey, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if ((dnskey.flags &
+ (DNS_KEYFLAG_OWNERMASK|DNS_KEYTYPE_NOAUTH))
+ != DNS_KEYOWNER_ZONE)
+ continue;
+
+ dns_rdata_toregion(&tuple->rdata, &r);
+
+ keyid = dst_region_computeid(&r, dnskey.algorithm);
+
+ buf[0] = dnskey.algorithm;
+ buf[1] = (keyid & 0xff00) >> 8;
+ buf[2] = (keyid & 0xff);
+ buf[3] = (tuple->op == DNS_DIFFOP_ADD) ? 0 : 1;
+ buf[4] = 0;
+ rdata.data = buf;
+ rdata.length = sizeof(buf);
+ rdata.type = privatetype;
+ rdata.rdclass = tuple->rdata.rdclass;
+
+ CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ if (flag)
+ continue;
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
+ name, 0, &rdata, &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, diff));
+ INSIST(newtuple == NULL);
+ /*
+ * Remove any record which says this operation has already
+ * completed.
+ */
+ buf[4] = 1;
+ CHECK(rr_exists(db, ver, name, &rdata, &flag));
+ if (flag) {
+ CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL,
+ name, 0, &rdata, &newtuple));
+ CHECK(do_one_tuple(&newtuple, db, ver, diff));
+ INSIST(newtuple == NULL);
+ }
+ }
+ failure:
+ return (result);
+}
+
+static isc_result_t
+sign_apex(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff, dns_diff_t *sig_diff)
+{
+ isc_result_t result;
+ isc_stdtime_t now, inception, soaexpire;
+ isc_boolean_t check_ksk, keyset_kskonly;
+ dst_key_t *zone_keys[MAXZONEKEYS];
+ unsigned int nkeys = 0, i;
+ dns_difftuple_t *tuple;
+
+ result = find_zone_keys(zone, db, ver, zone->mctx, MAXZONEKEYS,
+ zone_keys, &nkeys);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:find_zone_keys -> %s\n",
+ dns_result_totext(result));
+ return (result);
+ }
+
+ isc_stdtime_get(&now);
+ inception = now - 3600; /* Allow for clock skew. */
+ soaexpire = now + dns_zone_getsigvalidityinterval(zone);
+
+ check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
+ keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY);
+
+ /*
+ * See if update_sigs will update DNSKEY signature and if not
+ * cause them to sign so that so that newly activated keys
+ * are used.
+ */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ if (tuple->rdata.type == dns_rdatatype_dnskey &&
+ dns_name_equal(&tuple->name, &zone->origin))
+ break;
+ }
+
+ if (tuple == NULL) {
+ result = del_sigs(zone, db, ver, &zone->origin,
+ dns_rdatatype_dnskey, sig_diff,
+ zone_keys, nkeys, now);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:del_sigs -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ result = add_sigs(db, ver, &zone->origin, dns_rdatatype_dnskey,
+ sig_diff, zone_keys, nkeys, zone->mctx,
+ inception, soaexpire, check_ksk,
+ keyset_kskonly);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:add_sigs -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+ }
+
+ result = update_sigs(diff, db, ver, zone_keys, nkeys, zone,
+ inception, soaexpire, now, check_ksk,
+ keyset_kskonly, sig_diff);
+
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "sign_apex:update_sigs -> %s\n",
+ dns_result_totext(result));
+ goto failure;
+ }
+
+ failure:
+ for (i = 0; i < nkeys; i++)
+ dst_key_free(&zone_keys[i]);
+ return (result);
+}
+
+/*
+ * Prevent the zone entering a inconsistent state where
+ * NSEC only DNSKEYs are present with NSEC3 chains.
+ * See update.c:check_dnssec()
+ */
+static isc_boolean_t
+dnskey_sane(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ isc_result_t result;
+ dns_difftuple_t *tuple;
+ isc_boolean_t nseconly = ISC_FALSE, nsec3 = ISC_FALSE;
+ dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
+
+ /* Scan the tuples for an NSEC-only DNSKEY */
+ for (tuple = ISC_LIST_HEAD(diff->tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ isc_uint8_t alg;
+ if (tuple->rdata.type != dns_rdatatype_dnskey ||
+ tuple->op != DNS_DIFFOP_ADD)
+ continue;
+
+ alg = tuple->rdata.data[3];
+ if (alg == DST_ALG_RSAMD5 || alg == DST_ALG_RSASHA1 ||
+ alg == DST_ALG_DSA || alg == DST_ALG_ECC) {
+ nseconly = ISC_TRUE;
+ break;
+ }
+ }
+
+ /* Check existing DB for NSEC-only DNSKEY */
+ if (!nseconly)
+ CHECK(dns_nsec_nseconly(db, ver, &nseconly));
+
+ /* Check existing DB for NSEC3 */
+ if (!nsec3)
+ CHECK(dns_nsec3_activex(db, ver, ISC_FALSE,
+ privatetype, &nsec3));
+
+ /* Refuse to allow NSEC3 with NSEC-only keys */
+ if (nseconly && nsec3) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "NSEC only DNSKEYs and NSEC3 chains not allowed");
+ goto failure;
+ }
+
+ return (ISC_TRUE);
+
+ failure:
+ return (ISC_FALSE);
+}
+
+static isc_result_t
+clean_nsec3param(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ isc_result_t result;
+ dns_dbnode_t *node = NULL;
+ dns_rdataset_t rdataset;
+
+ dns_rdataset_init(&rdataset);
+ CHECK(dns_db_getoriginnode(db, &node));
+
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey,
+ dns_rdatatype_none, 0, &rdataset, NULL);
+ if (dns_rdataset_isassociated(&rdataset))
+ dns_rdataset_disassociate(&rdataset);
+ if (result != ISC_R_NOTFOUND)
+ goto failure;
+
+ result = dns_nsec3param_deletechains(db, ver, zone, diff);
+
+ failure:
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+
+/*
+ * Given an RRSIG rdataset and an algorithm, determine whether there
+ * are any signatures using that algorithm.
+ */
+static isc_boolean_t
+signed_with_alg(dns_rdataset_t *rdataset, dns_secalg_t alg) {
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_rrsig_t rrsig;
+ isc_result_t result;
+
+ REQUIRE(rdataset == NULL || rdataset->type == dns_rdatatype_rrsig);
+ if (rdataset == NULL || !dns_rdataset_isassociated(rdataset)) {
+ return (ISC_FALSE);
+ }
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset))
+ {
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &rrsig, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdata_reset(&rdata);
+ if (rrsig.algorithm == alg)
+ return (ISC_TRUE);
+ }
+
+ return (ISC_FALSE);
+}
+
+static isc_result_t
+add_chains(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver,
+ dns_diff_t *diff)
+{
+ dns_name_t *origin;
+ isc_boolean_t build_nsec3;
+ isc_result_t result;
+
+ origin = dns_db_origin(db);
+ CHECK(dns_private_chains(db, ver, zone->privatetype, NULL,
+ &build_nsec3));
+ if (build_nsec3)
+ CHECK(dns_nsec3_addnsec3sx(db, ver, origin, zone->minimum,
+ ISC_FALSE, zone->privatetype, diff));
+ CHECK(updatesecure(db, ver, origin, zone->minimum, ISC_TRUE, diff));
+
+ failure:
+ return (result);
+}
+
+static void
+zone_rekey(dns_zone_t *zone) {
+ isc_result_t result;
+ dns_db_t *db = NULL;
+ dns_dbnode_t *node = NULL;
+ dns_dbversion_t *ver = NULL;
+ dns_rdataset_t soaset, soasigs, keyset, keysigs;
+ dns_dnsseckeylist_t dnskeys, keys, rmkeys;
+ dns_dnsseckey_t *key;
+ dns_diff_t diff, sig_diff;
+ isc_boolean_t commit = ISC_FALSE, newactive = ISC_FALSE;
+ isc_boolean_t fullsign;
+ dns_ttl_t ttl = 3600;
+ const char *dir;
+ isc_mem_t *mctx;
+ isc_stdtime_t now;
+ isc_time_t timenow;
+ isc_interval_t ival;
+ char timebuf[80];
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ ISC_LIST_INIT(dnskeys);
+ ISC_LIST_INIT(keys);
+ ISC_LIST_INIT(rmkeys);
+ dns_rdataset_init(&soaset);
+ dns_rdataset_init(&soasigs);
+ dns_rdataset_init(&keyset);
+ dns_rdataset_init(&keysigs);
+ dir = dns_zone_getkeydirectory(zone);
+ mctx = zone->mctx;
+ dns_diff_init(mctx, &diff);
+ dns_diff_init(mctx, &sig_diff);
+
+ CHECK(dns_zone_getdb(zone, &db));
+ CHECK(dns_db_newversion(db, &ver));
+ CHECK(dns_db_getoriginnode(db, &node));
+
+ dns_zone_log(zone, ISC_LOG_INFO, "reconfiguring zone keys");
+
+ /* Get the SOA record's TTL */
+ CHECK(dns_db_findrdataset(db, node, ver, dns_rdatatype_soa,
+ dns_rdatatype_none, 0, &soaset, &soasigs));
+ ttl = soaset.ttl;
+ dns_rdataset_disassociate(&soaset);
+
+ /* Get the DNSKEY rdataset */
+ result = dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey,
+ dns_rdatatype_none, 0, &keyset, &keysigs);
+ if (result == ISC_R_SUCCESS) {
+ ttl = keyset.ttl;
+ result = dns_dnssec_keylistfromrdataset(&zone->origin, dir,
+ mctx, &keyset,
+ &keysigs, &soasigs,
+ ISC_FALSE, ISC_FALSE,
+ &dnskeys);
+ /* Can't get keys for some reason; try again later. */
+ if (result != ISC_R_SUCCESS)
+ goto trylater;
+ } else if (result != ISC_R_NOTFOUND)
+ goto failure;
+
+ /*
+ * True when called from "rndc sign". Indicates the zone should be
+ * fully signed now.
+ */
+ fullsign = ISC_TF(DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_FULLSIGN) != 0);
+
+ result = dns_dnssec_findmatchingkeys(&zone->origin, dir, mctx, &keys);
+ if (result == ISC_R_SUCCESS) {
+ isc_boolean_t check_ksk;
+ check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK);
+
+ result = dns_dnssec_updatekeys(&dnskeys, &keys, &rmkeys,
+ &zone->origin, ttl, &diff,
+ ISC_TF(!check_ksk),
+ mctx, logmsg);
+
+ /* Keys couldn't be updated for some reason;
+ * try again later. */
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR, "zone_rekey:"
+ "couldn't update zone keys: %s",
+ isc_result_totext(result));
+ goto trylater;
+ }
+
+ /* See if any pre-existing keys have newly become active */
+ for (key = ISC_LIST_HEAD(dnskeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (key->first_sign) {
+ newactive = ISC_TRUE;
+ break;
+ }
+ }
+
+ if ((newactive || fullsign || !ISC_LIST_EMPTY(diff.tuples)) &&
+ dnskey_sane(zone, db, ver, &diff)) {
+ CHECK(dns_diff_apply(&diff, db, ver));
+ CHECK(clean_nsec3param(zone, db, ver, &diff));
+ CHECK(add_signing_records(db, zone->privatetype, ver,
+ &diff));
+ CHECK(increment_soa_serial(db, ver, &diff, mctx));
+ CHECK(add_chains(zone, db, ver, &diff));
+ CHECK(sign_apex(zone, db, ver, &diff, &sig_diff));
+ CHECK(zone_journal(zone, &sig_diff, "zone_rekey"));
+ commit = ISC_TRUE;
+ }
+ }
+
+ dns_db_closeversion(db, &ver, commit);
+
+ if (commit) {
+ isc_time_t timenow;
+ dns_difftuple_t *tuple;
+ isc_boolean_t newkey = ISC_FALSE;
+ isc_boolean_t newalg = ISC_FALSE;
+
+ LOCK_ZONE(zone);
+ DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY);
+
+ zone_needdump(zone, DNS_DUMP_DELAY);
+
+ TIME_NOW(&timenow);
+ zone_settimer(zone, &timenow);
+
+ /*
+ * Has a new key become active? If so, is it for
+ * a new algorithm?
+ */
+ for (tuple = ISC_LIST_HEAD(sig_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ dns_rdata_dnskey_t dnskey;
+
+ if (tuple->rdata.type != dns_rdatatype_dnskey)
+ continue;
+
+ newkey = ISC_TRUE;
+ if (!dns_rdataset_isassociated(&keysigs)) {
+ newalg = ISC_TRUE;
+ break;
+ }
+
+ result = dns_rdata_tostruct(&tuple->rdata,
+ &dnskey, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if (!signed_with_alg(&keysigs,
+ dnskey.algorithm)) {
+ newalg = ISC_TRUE;
+ break;
+ }
+ }
+
+ /*
+ * If we found a new algorithm, we need to sign the
+ * zone fully. If there's a new key, but it's for an
+ * already-existing algorithm, then the zone signing
+ * can be handled incrementally.
+ */
+ if (newkey && !newalg)
+ set_resigntime(zone);
+
+ /* Remove any signatures from removed keys. */
+ if (!ISC_LIST_EMPTY(rmkeys)) {
+ for (key = ISC_LIST_HEAD(rmkeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ result = zone_signwithkey(zone,
+ dst_key_alg(key->key),
+ dst_key_id(key->key),
+ ISC_TRUE);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_signwithkey failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ }
+
+
+ if (fullsign) {
+ /*
+ * "rndc sign" was called, so we now sign the zone
+ * with all active keys, whether they're new or not.
+ */
+ for (key = ISC_LIST_HEAD(dnskeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ if (!key->force_sign && !key->hint_sign)
+ continue;
+
+ result = zone_signwithkey(zone,
+ dst_key_alg(key->key),
+ dst_key_id(key->key),
+ ISC_FALSE);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_signwithkey failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ } else if (newalg) {
+ /*
+ * We haven't been told to sign fully, but a new
+ * algorithm was added to the DNSKEY. We sign
+ * the full zone, but only with the newly-added
+ * keys.
+ */
+ for (tuple = ISC_LIST_HEAD(sig_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ dns_rdata_dnskey_t dnskey;
+ dns_secalg_t algorithm;
+ isc_region_t r;
+ isc_uint16_t keyid;
+
+ if (tuple->rdata.type != dns_rdatatype_dnskey ||
+ tuple->op == DNS_DIFFOP_DEL)
+ continue;
+
+ result = dns_rdata_tostruct(&tuple->rdata,
+ &dnskey, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ dns_rdata_toregion(&tuple->rdata, &r);
+ algorithm = dnskey.algorithm;
+ keyid = dst_region_computeid(&r, algorithm);
+
+ result = zone_signwithkey(zone, algorithm,
+ keyid, ISC_FALSE);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_signwithkey failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ }
+
+ /*
+ * Clear fullsign flag, if it was set, so we don't do
+ * another full signing next time
+ */
+ zone->keyopts &= ~DNS_ZONEKEY_FULLSIGN;
+
+ /*
+ * Cause the zone to add/delete NSEC3 chains for the
+ * deferred NSEC3PARAM changes.
+ */
+ for (tuple = ISC_LIST_HEAD(sig_diff.tuples);
+ tuple != NULL;
+ tuple = ISC_LIST_NEXT(tuple, link)) {
+ unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE];
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_rdata_nsec3param_t nsec3param;
+
+ if (tuple->rdata.type != zone->privatetype ||
+ tuple->op != DNS_DIFFOP_ADD)
+ continue;
+
+ if (!dns_nsec3param_fromprivate(&tuple->rdata, &rdata,
+ buf, sizeof(buf)))
+ continue;
+ result = dns_rdata_tostruct(&rdata, &nsec3param, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ if (nsec3param.flags == 0)
+ continue;
+
+ result = zone_addnsec3chain(zone, &nsec3param);
+ if (result != ISC_R_SUCCESS) {
+ dns_zone_log(zone, ISC_LOG_ERROR,
+ "zone_addnsec3chain failed: %s",
+ dns_result_totext(result));
+ }
+ }
+ UNLOCK_ZONE(zone);
+ }
+
+ isc_stdtime_get(&now);
+ TIME_NOW(&timenow);
+ isc_time_settoepoch(&zone->refreshkeytime);
+ for (key = ISC_LIST_HEAD(dnskeys);
+ key != NULL;
+ key = ISC_LIST_NEXT(key, link)) {
+ isc_stdtime_t then;
+ isc_time_t timethen;
+
+ /*
+ * If we are doing automatic key maintenance and the
+ * key metadata indicates there is a key change event
+ * scheduled in the future, set the key refresh timer.
+ */
+ if (!DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN))
+ break;
+
+ then = now;
+ result = next_keyevent(key->key, &then);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen);
+ LOCK_ZONE(zone);
+ if (isc_time_isepoch(&zone->refreshkeytime) ||
+ isc_time_compare(&timethen, &zone->refreshkeytime) < 0) {
+ zone->refreshkeytime = timethen;
+ zone_settimer(zone, &timenow);
+ }
+ UNLOCK_ZONE(zone);
+ }
+
+ /*
+ * If no key event is scheduled, we should still check the key
+ * repository for updates every so often. (Currently this is
+ * hard-coded to 12 hours, but it could be configurable.)
+ */
+ if (isc_time_isepoch(&zone->refreshkeytime))
+ DNS_ZONE_TIME_ADD(&timenow, (3600 * 12), &zone->refreshkeytime);
+
+ isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
+ dns_zone_log(zone, ISC_LOG_INFO, "next key event: %s", timebuf);
+
+ failure:
+ dns_diff_clear(&diff);
+ dns_diff_clear(&sig_diff);
+
+ clear_keylist(&dnskeys, mctx);
+ clear_keylist(&keys, mctx);
+ clear_keylist(&rmkeys, mctx);
+
+ if (ver != NULL)
+ dns_db_closeversion(db, &ver, ISC_FALSE);
+ if (dns_rdataset_isassociated(&keyset))
+ dns_rdataset_disassociate(&keyset);
+ if (dns_rdataset_isassociated(&keysigs))
+ dns_rdataset_disassociate(&keysigs);
+ if (dns_rdataset_isassociated(&soasigs))
+ dns_rdataset_disassociate(&soasigs);
+ if (node != NULL)
+ dns_db_detachnode(db, &node);
+ if (db != NULL)
+ dns_db_detach(&db);
+ return;
+
+ trylater:
+ isc_interval_set(&ival, HOUR, 0);
+ isc_time_nowplusinterval(&zone->refreshkeytime, &ival);
+ goto failure;
+}
+
+void
+dns_zone_rekey(dns_zone_t *zone, isc_boolean_t fullsign) {
+ isc_time_t now;
+
+ if (zone->type == dns_zone_master && zone->task != NULL) {
+ LOCK_ZONE(zone);
+
+ if (fullsign)
+ zone->keyopts |= DNS_ZONEKEY_FULLSIGN;
+
+ TIME_NOW(&now);
+ zone->refreshkeytime = now;
+ zone_settimer(zone, &now);
+
+ UNLOCK_ZONE(zone);
+ }
+}
+
+isc_result_t
+dns_zone_nscheck(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
+ unsigned int *errors)
+{
+ isc_result_t result;
+ dns_dbnode_t *node = NULL;
+
+ REQUIRE(DNS_ZONE_VALID(zone));
+ REQUIRE(errors != NULL);
+
+ result = dns_db_getoriginnode(db, &node);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = zone_count_ns_rr(zone, db, node, version, NULL, errors,
+ ISC_FALSE);
+ dns_db_detachnode(db, &node);
+ return (result);
+}
+
+void
+dns_zone_setadded(dns_zone_t *zone, isc_boolean_t added) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ LOCK_ZONE(zone);
+ zone->added = added;
+ UNLOCK_ZONE(zone);
+}
+
+isc_boolean_t
+dns_zone_getadded(dns_zone_t *zone) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+ return (zone->added);
+}
+
+isc_result_t
+dns_zone_dlzpostload(dns_zone_t *zone, dns_db_t *db)
+{
+ isc_time_t loadtime;
+ isc_result_t result;
+ TIME_NOW(&loadtime);
+
+ LOCK_ZONE(zone);
+ result = zone_postload(zone, db, loadtime, ISC_R_SUCCESS);
+ UNLOCK_ZONE(zone);
+ return result;
+}
diff --git a/contrib/bind9/lib/export/Makefile.in b/contrib/bind9/lib/export/Makefile.in
new file mode 100644
index 0000000..5a9e633
--- /dev/null
+++ b/contrib/bind9/lib/export/Makefile.in
@@ -0,0 +1,27 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+# Note: the order of SUBDIRS is important.
+# Attempt to disable parallel processing.
+.NOTPARALLEL:
+.NO_PARALLEL:
+SUBDIRS = isc dns isccfg irs samples
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/dns/Makefile.in b/contrib/bind9/lib/export/dns/Makefile.in
new file mode 100644
index 0000000..15b0d3f
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/Makefile.in
@@ -0,0 +1,179 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.8 2010-12-23 04:07:59 marka Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/dns
+export_srcdir = @top_srcdir@/lib/export
+
+# Attempt to disable parallel processing.
+.NOTPARALLEL:
+.NO_PARALLEL:
+
+@BIND9_VERSION@
+
+@LIBDNS_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. -Iinclude ${DNS_INCLUDES} -I${export_srcdir}/isc/include \
+ ${ISC_INCLUDES} @DST_OPENSSL_INC@ @DST_GSSAPI_INC@
+
+CDEFINES = -DUSE_MD5 @USE_OPENSSL@ @USE_GSSAPI@
+
+CWARNINGS =
+
+ISCLIBS = ../isc/libisc.@A@
+
+ISCDEPLIBS = ../isc/libisc.@A@
+
+LIBS = @LIBS@
+
+# Alphabetically
+
+OPENSSLLINKOBJS = openssl_link.@O@ openssldh_link.@O@ openssldsa_link.@O@ \
+ opensslgost_link.@O@ opensslrsa_link.@O@
+
+DSTOBJS = @OPENSSLLINKOBJS@ \
+ dst_api.@O@ dst_lib.@O@ dst_parse.@O@ dst_result.@O@ \
+ gssapi_link.@O@ gssapictx.@O@ hmac_link.@O@ key.@O@
+
+DNSOBJS = acl.@O@ adb.@O@ byaddr.@O@ \
+ cache.@O@ callbacks.@O@ client.@O@ compress.@O@ \
+ db.@O@ dbiterator.@O@ diff.@O@ dispatch.@O@ dlz.@O@ dnssec.@O@ \
+ ds.@O@ \
+ forward.@O@ iptable.@O@ \
+ keytable.@O@ \
+ lib.@O@ log.@O@ \
+ master.@O@ masterdump.@O@ message.@O@ \
+ name.@O@ ncache.@O@ nsec.@O@ nsec3.@O@ \
+ peer.@O@ portlist.@O@ \
+ rbt.@O@ rbtdb.@O@ rcode.@O@ rdata.@O@ \
+ rdatalist.@O@ rdataset.@O@ rdatasetiter.@O@ rdataslab.@O@ \
+ request.@O@ resolver.@O@ result.@O@ soa.@O@ stats.@O@ \
+ tcpmsg.@O@ time.@O@ tsec.@O@ tsig.@O@ ttl.@O@ \
+ validator.@O@ version.@O@ view.@O@
+PORTDNSOBJS = ecdb.@O@
+
+OBJS= ${DNSOBJS} ${OTHEROBJS} ${DSTOBJS} ${PORTDNSOBJS}
+
+# Alphabetically
+
+OPENSSLLINKSRCS = openssl_link.c openssldh_link.c openssldsa_link.c \
+ opensslgost_link.c opensslrsa_link.c
+
+DSTSRCS = @OPENSSLLINKSRCS@ \
+ dst_api.c dst_lib.c dst_parse.c \
+ dst_result.c gssapi_link.c gssapictx.c \
+ hmac_link.c key.c
+
+DNSSRCS = acl.c adb.c byaddr.c \
+ cache.c callbacks.c client.c compress.c \
+ db.c dbiterator.c diff.c dispatch.c dlz.c dnssec.c ds.c \
+ forward.c iptable.c \
+ keytable.c \
+ lib.c log.c \
+ master.c masterdump.c message.c \
+ name.c ncache.c nsec.c nsec3.c \
+ peer.c portlist.c \
+ rbt.c rbtdb.c rcode.c rdata.c \
+ rdatalist.c rdataset.c rdatasetiter.c rdataslab.c \
+ request.c res.c resolver.c result.c soa.c stats.c \
+ tcpmsg.c time.c tsec.c tsig.c ttl.c \
+ validator.c version.c view.c
+PORTDNSSRCS = ecdb.c
+
+SRCS = ${DSTSRCS} ${DNSSRCS} ${PORTDNSSRCS}
+
+SUBDIRS = include
+TARGETS = include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h timestamp
+
+DEPENDEXTRA = ./gen -F include/dns/rdatastruct.h \
+ -s ${srcdir} -d >> Makefile ;
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libdns.@SA@: ${OBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS}
+ ${RANLIB} $@
+
+libdns.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libdns.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${ISCLIBS} @DNS_CRYPTO_LIBS@ ${LIBS}
+
+timestamp: libdns.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libdns.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libdns.@A@ timestamp
+ rm -f gen code.h include/dns/enumtype.h include/dns/enumclass.h
+ rm -f include/dns/rdatastruct.h
+
+newrr::
+ rm -f code.h include/dns/enumtype.h include/dns/enumclass.h
+ rm -f include/dns/rdatastruct.h
+
+include: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h
+
+rdata.@O@: code.h
+
+include/dns/enumtype.h: gen
+ ./gen -s ${srcdir} -t > $@
+
+include/dns/enumclass.h: gen
+ ./gen -s ${srcdir} -c > $@
+
+include/dns/rdatastruct.h: gen \
+ ${srcdir}/rdata/rdatastructpre.h \
+ ${srcdir}/rdata/rdatastructsuf.h
+ ./gen -s ${srcdir} -i \
+ -P ${srcdir}/rdata/rdatastructpre.h \
+ -S ${srcdir}/rdata/rdatastructsuf.h > $@
+
+code.h: gen
+ ./gen -s ${srcdir} > code.h
+
+gen: ${srcdir}/gen.c
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
+
+#We don't need rbtdb64 for this library
+#rbtdb64.@O@: rbtdb.c
+
+depend: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h code.h
+subdirs: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h code.h
+${OBJS}: include/dns/enumtype.h include/dns/enumclass.h \
+ include/dns/rdatastruct.h
diff --git a/contrib/bind9/lib/export/dns/include/Makefile.in b/contrib/bind9/lib/export/dns/include/Makefile.in
new file mode 100644
index 0000000..ecd9c8a
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/include/Makefile.in
@@ -0,0 +1,23 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+SUBDIRS = dns dst
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/dns/include/dns/Makefile.in b/contrib/bind9/lib/export/dns/include/dns/Makefile.in
new file mode 100644
index 0000000..ccaae41
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/include/dns/Makefile.in
@@ -0,0 +1,56 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-09-18 07:18:04 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = acl.h adb.h byaddr.h \
+ cache.h callbacks.h cert.h client.h compress.h \
+ db.h dbiterator.h diff.h dispatch.h dlz.h dnssec.h \
+ ds.h events.h fixedname.h ecdb.h \
+ forward.h iptable.h \
+ keytable.h keyvalues.h \
+ lib.h log.h \
+ master.h masterdump.h message.h \
+ name.h ncache.h nsec.h nsec3.h \
+ peer.h portlist.h \
+ rbt.h rcode.h rdata.h rdataclass.h \
+ rdatalist.h rdataset.h rdatasetiter.h rdataslab.h rdatatype.h \
+ request.h resolver.h result.h \
+ secalg.h secproto.h soa.h stats.h \
+ tcpmsg.h time.h tsec.h tsig.h ttl.h types.h \
+ validator.h version.h view.h
+
+GENHEADERS = enumclass.h enumtype.h rdatastruct.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/dns
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/dns/include/dns/$$i \
+ ${DESTDIR}${export_includedir}/dns ; \
+ done
+ for i in ${GENHEADERS}; do \
+ ${INSTALL_DATA} $$i ${DESTDIR}${export_includedir}/dns ; \
+ done
diff --git a/contrib/bind9/lib/export/dns/include/dst/Makefile.in b/contrib/bind9/lib/export/dns/include/dst/Makefile.in
new file mode 100644
index 0000000..cebc726
--- /dev/null
+++ b/contrib/bind9/lib/export/dns/include/dst/Makefile.in
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = dst.h gssapi.h lib.h result.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/dst
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/dns/include/dst/$$i \
+ ${DESTDIR}${export_includedir}/dst ; \
+ done
diff --git a/contrib/bind9/lib/export/irs/Makefile.in b/contrib/bind9/lib/export/irs/Makefile.in
new file mode 100644
index 0000000..aad9400
--- /dev/null
+++ b/contrib/bind9/lib/export/irs/Makefile.in
@@ -0,0 +1,86 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-12-05 23:31:40 each Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/irs
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@LIBIRS_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. -I./include -I${srcdir}/include \
+ ${ISCCFG_INCLUDES} -I../dns/include ${DNS_INCLUDES} \
+ -I${export_srcdir}/isc/include ${ISC_INCLUDES}
+CDEFINES =
+CWARNINGS =
+
+# Alphabetically
+OBJS = context.@O@ \
+ dnsconf.@O@ \
+ gai_strerror.@O@ getaddrinfo.@O@ getnameinfo.@O@ \
+ resconf.@O@
+
+# Alphabetically
+SRCS = context.c \
+ dnsconf.c \
+ gai_sterror.c getaddrinfo.c getnameinfo.c \
+ resconf.c
+
+ISCLIBS = ../isc/libisc.@A@
+DNSLIBS = ../dns/libdns.@A@
+ISCCFGLIBS = ../isccfg/libisccfg.@A@
+
+LIBS = @LIBS@
+
+SUBDIRS = include
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libirs.@SA@: ${OBJS} version.@O@
+ ${AR} ${ARFLAGS} $@ ${OBJS} version.@O@
+ ${RANLIB} $@
+
+libirs.la: ${OBJS} version.@O@
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libirs.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} version.@O@ ${LIBS} ${ISCCFGLIBS} ${DNSLIBS} ${ISCLIBS}
+
+timestamp: libirs.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libirs.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libirs.@A@ libirs.la timestamp
diff --git a/contrib/bind9/lib/export/irs/include/Makefile.in b/contrib/bind9/lib/export/irs/include/Makefile.in
new file mode 100644
index 0000000..e6d4eae
--- /dev/null
+++ b/contrib/bind9/lib/export/irs/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = irs
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/irs/include/irs/Makefile.in b/contrib/bind9/lib/export/irs/include/irs/Makefile.in
new file mode 100644
index 0000000..93f4200
--- /dev/null
+++ b/contrib/bind9/lib/export/irs/include/irs/Makefile.in
@@ -0,0 +1,46 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = context.h dnsconf.h resconf.h types.h version.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/irs
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/irs/include/irs/$$i \
+ ${DESTDIR}${export_includedir}/irs ; \
+ done
+ ${INSTALL_DATA} ${top_srcdir}/lib/irs/include/irs/netdb.h \
+ ${DESTDIR}${export_includedir}/irs
+ ${INSTALL_DATA} ${top_srcdir}/lib/irs/include/irs/platform.h \
+ ${DESTDIR}${export_includedir}/irs
+
+distclean::
+ rm -f netdb.h platform.h
diff --git a/contrib/bind9/lib/export/isc/Makefile.in b/contrib/bind9/lib/export/isc/Makefile.in
new file mode 100644
index 0000000..fa1c367
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/Makefile.in
@@ -0,0 +1,139 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.8 2010-06-09 23:50:58 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@LIBISC_API@
+
+CINCLUDES = -I${srcdir}/unix/include \
+ -I${srcdir}/@ISC_THREAD_DIR@/include \
+ -I${srcdir}/@ISC_ARCH_DIR@/include \
+ -I${export_srcdir}/isc/include -I${srcdir}/include \
+ @ISC_OPENSSL_INC@
+CDEFINES = @USE_OPENSSL@ -DUSE_APPIMPREGISTER -DUSE_MEMIMPREGISTER \
+ -DUSE_SOCKETIMPREGISTER -DUSE_TASKIMPREGISTER \
+ -DUSE_TIMERIMPREGISTER
+CWARNINGS =
+
+# Alphabetically
+# {file,dir}.c is necessary for isclog
+# symtab.c is necessary for isccfg
+APIOBJS = app_api.@O@ mem_api.@O@ socket_api.@O@ \
+ task_api.@O@ timer_api.@O@
+
+ISCDRIVEROBJS = mem.@O@ unix/socket.@O@ task.@O@ timer.@O@ lib.@O@ \
+ heap.@O@ #timer module depends on this
+
+UNIXOBJS = @ISC_ISCIPV6_O@ \
+ unix/app.@O@ \
+ unix/dir.@O@ \
+ unix/errno2result.@O@ \
+ unix/file.@O@ \
+ unix/fsaccess.@O@ \
+ unix/stdio.@O@ \
+ unix/stdtime.@O@ unix/strerror.@O@ unix/time.@O@
+
+NLSOBJS = nls/msgcat.@O@
+
+THREADOPTOBJS = @ISC_THREAD_DIR@/condition.@O@ @ISC_THREAD_DIR@/mutex.@O@
+
+THREADOBJS = @THREADOPTOBJS@ @ISC_THREAD_DIR@/thread.@O@
+
+WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/file.@O@ \
+ win32/fsaccess.@O@ win32/once.@O@ win32/stdtime.@O@ \
+ win32/thread.@O@ win32/time.@O@
+
+# Alphabetically
+OBJS = @ISC_EXTRA_OBJS@ \
+ assertions.@O@ backtrace.@O@ backtrace-emptytbl.@O@ base32.@O@ \
+ base64.@O@ buffer.@O@ bufferlist.@O@ \
+ error.@O@ event.@O@ \
+ hash.@O@ hex.@O@ hmacmd5.@O@ hmacsha.@O@ \
+ inet_aton.@O@ iterated_hash.@O@ lex.@O@ lfsr.@O@ log.@O@ \
+ md5.@O@ mutexblock.@O@ \
+ netaddr.@O@ netscope.@O@ \
+ ondestroy.@O@ \
+ parseint.@O@ portset.@O@ radix.@O@ \
+ random.@O@ refcount.@O@ region.@O@ result.@O@ rwlock.@O@ \
+ serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ string.@O@ \
+ symtab.@O@ \
+ version.@O@ \
+ ${APIOBJS} ${ISCDRIVEROBJS} \
+ ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
+
+# Alphabetically
+APISRCS = app_api.c mem_api.c socket_api.c \
+ task_api.c timer_api.c
+
+ISCDRIVERSRCS = mem.c task.c lib.c timer.c heap.c
+
+SRCS = @ISC_EXTRA_SRCS@ \
+ assertions.c backtrace.c backtrace-emptytbl.c base32.c \
+ base64.c buffer.c bufferlist.c \
+ error.c event.c \
+ hash.c hex.c hmacmd5.c hmacsha.c \
+ inet_aton.c iterated_hash.c lex.c log.c lfsr.c \
+ md5.c mutexblock.c \
+ netaddr.c netscope.c \
+ ondestroy.c \
+ parseint.c portset.c radix.c \
+ random.c refcount.c region.c result.c rwlock.c \
+ serial.c sha1.c sha2.c sockaddr.c stats.c string.c symtab.c \
+ version.c \
+ ${APISRCS} ${ISCDRIVERSRCS}
+
+LIBS = @LIBS@
+
+SUBDIRS = include unix nls @ISC_THREAD_DIR@
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libisc.@SA@: ${OBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS}
+ ${RANLIB} $@
+
+libisc.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${LIBS}
+
+timestamp: libisc.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisc.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libisc.@A@ libisc.la timestamp
diff --git a/contrib/bind9/lib/export/isc/include/Makefile.in b/contrib/bind9/lib/export/isc/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/include/isc/Makefile.in
new file mode 100644
index 0000000..0336ba2
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/include/isc/Makefile.in
@@ -0,0 +1,66 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-12-05 23:31:41 each Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = app.h assertions.h base64.h bitstring.h boolean.h \
+ buffer.h bufferlist.h commandline.h entropy.h error.h event.h \
+ eventclass.h file.h formatcheck.h fsaccess.h \
+ hash.h heap.h hex.h hmacmd5.h \
+ httpd.h \
+ interfaceiter.h @ISC_IPV6_H@ iterated_hash.h lang.h lex.h \
+ lfsr.h lib.h list.h log.h \
+ magic.h md5.h mem.h msgcat.h msgs.h \
+ mutexblock.h namespace.h netaddr.h ondestroy.h os.h parseint.h \
+ print.h quota.h radix.h random.h ratelimiter.h \
+ refcount.h region.h resource.h \
+ result.h resultclass.h rwlock.h serial.h sha1.h sha2.h \
+ sockaddr.h socket.h stdio.h stdlib.h string.h \
+ symtab.h \
+ task.h taskpool.h timer.h types.h util.h version.h \
+ xml.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/isc/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
+ ${INSTALL_DATA} ${top_srcdir}/lib/isc/include/isc/platform.h \
+ ${DESTDIR}${export_includedir}/isc
+ ${INSTALL_DATA} ${top_srcdir}/lib/isc/@ISC_ARCH_DIR@/include/isc/atomic.h \
+ ${DESTDIR}${export_includedir}/isc
+ ${INSTALL_DATA} ${export_srcdir}/isc/include/isc/bind9.h \
+ ${DESTDIR}${export_includedir}/isc
+
+distclean::
+ rm -f platform.h
diff --git a/contrib/bind9/lib/export/isc/include/isc/bind9.h b/contrib/bind9/lib/export/isc/include/isc/bind9.h
new file mode 100644
index 0000000..380ca85
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/include/isc/bind9.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: bind9.h,v 1.2 2009-12-05 23:31:41 each Exp $ */
+
+#ifndef ISC_BIND9_H
+#define ISC_BIND9_H 1
+
+/*
+ * This determines whether we are building BIND9 or using the exported
+ * libisc/libdns libraries. The version of this file included in the
+ * standard BIND9 build defines BIND9; the version included with the
+ * exportable libraries does not.
+ */
+#undef BIND9
+
+#endif /* ISC_BIND9_H */
diff --git a/contrib/bind9/lib/export/isc/nls/Makefile.in b/contrib/bind9/lib/export/isc/nls/Makefile.in
new file mode 100644
index 0000000..da2513f
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nls/Makefile.in
@@ -0,0 +1,35 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/nls
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/unix/include \
+ ${ISC_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+OBJS = msgcat.@O@
+
+SRCS = msgcat.c
+
+SUBDIRS =
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/nothreads/Makefile.in b/contrib/bind9/lib/export/isc/nothreads/Makefile.in
new file mode 100644
index 0000000..3bffb4e
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nothreads/Makefile.in
@@ -0,0 +1,40 @@
+# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.5 2010-06-09 23:50:58 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/nothreads
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include \
+ -I${srcdir}/../unix/include \
+ -I../include \
+ -I${srcdir}/../include \
+ -I${srcdir}/..
+
+CDEFINES =
+CWARNINGS =
+
+THREADOPTOBJS = condition.@O@ mutex.@O@
+OBJS = @THREADOPTOBJS@ thread.@O@
+
+THREADOPTSRCS = condition.c mutex.c
+SRCS = @THREADOPTSRCS@ thread.c
+
+SUBDIRS = include
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/nothreads/include/Makefile.in b/contrib/bind9/lib/export/isc/nothreads/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nothreads/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in
new file mode 100644
index 0000000..423f10a
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/nothreads/include/isc/Makefile.in
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = condition.h mutex.h once.h thread.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} $(top_srcdir)/lib/isc/nothreads/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
diff --git a/contrib/bind9/lib/export/isc/pthreads/Makefile.in b/contrib/bind9/lib/export/isc/pthreads/Makefile.in
new file mode 100644
index 0000000..5fac018
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/pthreads/Makefile.in
@@ -0,0 +1,38 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/pthreads
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include \
+ -I${srcdir}/../unix/include \
+ -I../include \
+ -I${srcdir}/../include \
+ -I${srcdir}/..
+
+CDEFINES =
+CWARNINGS =
+
+OBJS = condition.@O@ mutex.@O@ thread.@O@
+
+SRCS = condition.c mutex.c thread.c
+
+SUBDIRS = include
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/pthreads/include/Makefile.in b/contrib/bind9/lib/export/isc/pthreads/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/pthreads/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in
new file mode 100644
index 0000000..807de94
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/pthreads/include/isc/Makefile.in
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = condition.h mutex.h once.h thread.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} $(top_srcdir)/lib/isc/pthreads/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
diff --git a/contrib/bind9/lib/export/isc/unix/Makefile.in b/contrib/bind9/lib/export/isc/unix/Makefile.in
new file mode 100644
index 0000000..81746a4
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/unix/Makefile.in
@@ -0,0 +1,57 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/unix
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include \
+ -I${srcdir}/../@ISC_THREAD_DIR@/include \
+ -I../include \
+ -I${srcdir}/../include \
+ -I${srcdir}/..
+
+CDEFINES = -DUSE_SOCKETIMPREGISTER -DUSE_APPIMPREGISTER
+
+CWARNINGS =
+
+# Alphabetically
+ISCDRIVEROBJS = app.@O@ socket.@O@
+
+OBJS = @ISC_IPV6_O@ \
+ dir.@O@ \
+ errno2result.@O@ \
+ file.@O@ fsaccess.@O@ \
+ stdio.@O@ stdtime.@O@ strerror.@O@ \
+ time.@O@ \
+ ${ISCDRIVEROBJS}
+
+# Alphabetically
+ISCDRIVERSRCS = app.c socket.c
+
+SRCS = @ISC_IPV6_C@ \
+ dir.c \
+ errno2result.c \
+ file.c fsaccess.c \
+ stdio.c stdtime.c strerror.c \
+ time.c \
+ ${ISCDRIVERSRCS}
+
+SUBDIRS = include
+TARGETS = ${OBJS}
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/unix/include/Makefile.in b/contrib/bind9/lib/export/isc/unix/include/Makefile.in
new file mode 100644
index 0000000..f89628b
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/unix/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isc
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in b/contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in
new file mode 100644
index 0000000..21ce049
--- /dev/null
+++ b/contrib/bind9/lib/export/isc/unix/include/isc/Makefile.in
@@ -0,0 +1,37 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+HEADERS = dir.h int.h net.h netdb.h offset.h stdtime.h \
+ syslog.h time.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_includedir}/isc
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} $(top_srcdir)/lib/isc/unix/include/isc/$$i \
+ ${DESTDIR}${export_includedir}/isc ; \
+ done
diff --git a/contrib/bind9/lib/export/isccfg/Makefile.in b/contrib/bind9/lib/export/isccfg/Makefile.in
new file mode 100644
index 0000000..ed2b2cf
--- /dev/null
+++ b/contrib/bind9/lib/export/isccfg/Makefile.in
@@ -0,0 +1,83 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-12-05 23:31:41 each Exp $
+
+top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isccfg
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@LIBISCCFG_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. ${DNS_INCLUDES} -I${export_srcdir}/isc/include \
+ ${ISC_INCLUDES} ${ISCCFG_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+ISCLIBS = ../isc/libisc.@A@
+DNSLIBS = ../dns/libdns.@A@
+
+ISCDEPLIBS = ../../lib/isc/libisc.@A@
+ISCCFGDEPLIBS = libisccfg.@A@
+
+LIBS = @LIBS@
+
+SUBDIRS = include
+
+# Alphabetically
+OBJS = dnsconf.@O@ log.@O@ parser.@O@ version.@O@
+
+# Alphabetically
+SRCS = dnsconf.c log.c parser.c version.c
+
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: ${srcdir}/version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libisccfg.@SA@: ${OBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS}
+ ${RANLIB} $@
+
+libisccfg.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisccfg.la \
+ -rpath ${export_libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${LIBS} ${DNSLIBS} ${ISCLIBS}
+
+timestamp: libisccfg.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${export_libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisccfg.@A@ \
+ ${DESTDIR}${export_libdir}
+
+clean distclean::
+ rm -f libisccfg.@A@ timestamp
diff --git a/contrib/bind9/lib/export/isccfg/include/Makefile.in b/contrib/bind9/lib/export/isccfg/include/Makefile.in
new file mode 100644
index 0000000..896c467
--- /dev/null
+++ b/contrib/bind9/lib/export/isccfg/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.2 2009-09-01 00:22:27 jinmei Exp $
+
+srcdir = @srdir@
+top_srcdir = @top_srcdir@
+
+
+SUBDIRS = isccfg
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in b/contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in
new file mode 100644
index 0000000..3f97894
--- /dev/null
+++ b/contrib/bind9/lib/export/isccfg/include/isccfg/Makefile.in
@@ -0,0 +1,42 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = cfg.h grammar.h log.h dnsconf.h version.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs \
+ ${DESTDIR}${export_includedir}/isccfg
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${top_srcdir}/lib/isccfg/include/isccfg/$$i \
+ ${DESTDIR}${export_includedir}/isccfg ; \
+ done
diff --git a/contrib/bind9/lib/export/samples/Makefile-postinstall.in b/contrib/bind9/lib/export/samples/Makefile-postinstall.in
new file mode 100644
index 0000000..10a26f4
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/Makefile-postinstall.in
@@ -0,0 +1,78 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile-postinstall.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+#prefix = @prefix@
+#exec_prefix = @exec_prefix@
+
+CDEFINES =
+CWARNINGS =
+
+DNSLIBS = -ldns @DNS_CRYPTO_LIBS@
+ISCLIBS = -lisc
+ISCCFGLIBS = -lisccfg
+IRSLIBS = -lirs
+
+LIBS = ${DNSLIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
+
+SUBDIRS =
+
+TARGETS = sample@EXEEXT@ sample-async@EXEEXT@ sample-gai@EXEEXT@ \
+ sample-update@EXEEXT@ sample-request@EXEEXT@ nsprobe@EXEEXT@ \
+ dlvchecks@EXEEXT@
+
+OBJS = sample.@O@ sample-async.@O@ sample-gai.@O@ sample-update.@O@ \
+ sample-request.@O@ nsprobe.@O@ dlvchecks.@O@
+
+SRCS = sample.c sample-async.c sample-gai.c sample-update.c \
+ sample-request.c nsprobe.c dlvchecks..c
+
+@BIND9_MAKE_RULES@
+
+# The following two may depend on BIND9_MAKE_RULES
+CINCLUDES = -I@export_includedir@
+LDFLAGS = -L@export_libdir@
+
+sample@EXEEXT@: sample.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample.@O@ ${LIBS}
+
+sample-async@EXEEXT@: sample-async.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-async.@O@ ${LIBS}
+
+sample-gai@EXEEXT@: sample-gai.@O@ ${IRSDEPLIBS} ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-gai.@O@ ${IRSLIBS} ${LIBS}
+
+sample-update@EXEEXT@: sample-update.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-update.@O@ ${LIBS}
+
+sample-request@EXEEXT@: sample-request.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-request.@O@ ${LIBS}
+
+nsprobe@EXEEXT@: nsprobe.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ nsprobe.@O@ ${LIBS}
+
+dlvchecks@EXEEXT@: dlvchecks.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dlvchecks.@O@ ${LIBS}
+
+clean distclean maintainer-clean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/lib/export/samples/Makefile.in b/contrib/bind9/lib/export/samples/Makefile.in
new file mode 100644
index 0000000..ff8e916
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/Makefile.in
@@ -0,0 +1,98 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.4 2009-12-05 23:31:41 each Exp $
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+export_srcdir = @top_srcdir@/lib/export
+
+@BIND9_VERSION@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I${srcdir}/include -I../dns/include \
+ -I${export_srcdir}/isc/include \
+ ${DNS_INCLUDES} ${ISC_INCLUDES} \
+ -I${top_srcdir}/lib/irs/include
+
+CDEFINES =
+CWARNINGS =
+
+DNSLIBS = ../dns/libdns.@A@ @DNS_CRYPTO_LIBS@
+ISCLIBS = ../isc/libisc.@A@
+ISCCFGLIBS = ../isccfg/libisccfg.@A@
+IRSLIBS = ../irs/libirs.@A@
+
+DNSDEPLIBS = ../dns/libdns.@A@
+ISCDEPLIBS = ../isc/libisc.@A@
+ISCCFGDEPLIBS = ../isccfg/libisccfg.@A@
+IRSDEPLIBS = ../irs/libirs.@A@
+
+DEPLIBS = ${DNSDEPLIBS} ${ISCCFGDEPLIBS} ${ISCDEPLIBS}
+
+LIBS = ${DNSLIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@
+
+SUBDIRS =
+
+TARGETS = sample@EXEEXT@ sample-async@EXEEXT@ sample-gai@EXEEXT@ \
+ sample-update@EXEEXT@ sample-request@EXEEXT@ nsprobe@EXEEXT@
+
+OBJS = sample.@O@ sample-async.@O@ sample-gai.@O@ sample-update.@O@ \
+ sample-request.@O@ nsprobe.@O@
+
+UOBJS =
+
+SRCS = sample.c sample-async.c sample-gai.c sample-update.c \
+ sample-request.c nsprobe.c
+
+MANPAGES =
+
+HTMLPAGES =
+
+MANOBJS = ${MANPAGES} ${HTMLPAGES}
+
+@BIND9_MAKE_RULES@
+
+sample@EXEEXT@: sample.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample.@O@ ${LIBS}
+
+sample-async@EXEEXT@: sample-async.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-async.@O@ ${LIBS}
+
+sample-gai@EXEEXT@: sample-gai.@O@ ${IRSDEPLIBS} ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-gai.@O@ ${IRSLIBS} ${LIBS}
+
+sample-update@EXEEXT@: sample-update.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-update.@O@ ${LIBS}
+
+sample-request@EXEEXT@: sample-request.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ sample-request.@O@ ${LIBS}
+
+nsprobe@EXEEXT@: nsprobe.@O@ ${DEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ nsprobe.@O@ ${LIBS}
+
+doc man:: ${MANOBJS}
+
+docclean manclean maintainer-clean::
+ rm -f ${MANOBJS}
+
+clean distclean maintainer-clean::
+ rm -f ${TARGETS}
diff --git a/contrib/bind9/lib/export/samples/nsprobe.c b/contrib/bind9/lib/export/samples/nsprobe.c
new file mode 100644
index 0000000..85c572d
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/nsprobe.c
@@ -0,0 +1,1220 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: nsprobe.c,v 1.7 2010-01-07 23:48:54 tbox Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <netdb.h>
+
+#include <isc/app.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/socket.h>
+#include <isc/sockaddr.h>
+#include <isc/string.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/lib.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#define MAX_PROBES 1000
+
+static dns_client_t *client = NULL;
+static isc_task_t *probe_task = NULL;
+static isc_appctx_t *actx = NULL;
+static isc_mem_t *mctx = NULL;
+static unsigned int outstanding_probes = 0;
+const char *cacheserver = "127.0.0.1";
+static FILE *fp;
+
+typedef enum {
+ none,
+ exist,
+ nxdomain,
+ othererr,
+ multiplesoa,
+ multiplecname,
+ brokenanswer,
+ lame,
+ timedout,
+ notype,
+ unexpected
+} query_result_t;
+
+struct server {
+ ISC_LINK(struct server) link;
+
+ isc_sockaddr_t address;
+ query_result_t result_a;
+ query_result_t result_aaaa;
+};
+
+struct probe_ns {
+ ISC_LINK(struct probe_ns) link;
+
+ dns_fixedname_t fixedname;
+ dns_name_t *name;
+ struct server *current_server;
+ ISC_LIST(struct server) servers;
+};
+
+struct probe_trans {
+ isc_boolean_t inuse;
+ char *domain;
+ dns_fixedname_t fixedname;
+ dns_name_t *qname;
+ const char **qlabel;
+ isc_boolean_t qname_found;
+ dns_clientrestrans_t *resid;
+ dns_message_t *qmessage;
+ dns_message_t *rmessage;
+ dns_clientreqtrans_t *reqid;
+
+ /* NS list */
+ struct probe_ns *current_ns;
+ ISC_LIST(struct probe_ns) nslist;
+};
+
+struct lcl_stat {
+ unsigned long valid;
+ unsigned long ignore;
+ unsigned long nxdomain;
+ unsigned long othererr;
+ unsigned long multiplesoa;
+ unsigned long multiplecname;
+ unsigned long brokenanswer;
+ unsigned long lame;
+ unsigned long unknown;
+} server_stat, domain_stat;
+
+static unsigned long number_of_domains = 0;
+static unsigned long number_of_servers = 0;
+static unsigned long multiple_error_domains = 0;
+static isc_boolean_t debug_mode = ISC_FALSE;
+static int verbose_level = 0;
+static const char *qlabels[] = {"www.", "ftp.", NULL};
+static struct probe_trans probes[MAX_PROBES];
+
+static isc_result_t probe_domain(struct probe_trans *trans);
+static void reset_probe(struct probe_trans *trans);
+static isc_result_t fetch_nsaddress(struct probe_trans *trans);
+static isc_result_t probe_name(struct probe_trans *trans,
+ dns_rdatatype_t type);
+
+/* Dump an rdataset for debug */
+static isc_result_t
+print_rdataset(dns_rdataset_t *rdataset, dns_name_t *owner) {
+ isc_buffer_t target;
+ isc_result_t result;
+ isc_region_t r;
+ char t[4096];
+
+ if (!debug_mode)
+ return (ISC_R_SUCCESS);
+
+ isc_buffer_init(&target, t, sizeof(t));
+
+ if (!dns_rdataset_isassociated(rdataset))
+ return (ISC_R_SUCCESS);
+ result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
+ &target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&target, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+print_name(dns_name_t *name) {
+ isc_result_t result;
+ isc_buffer_t target;
+ isc_region_t r;
+ char t[4096];
+
+ isc_buffer_init(&target, t, sizeof(t));
+ result = dns_name_totext(name, ISC_TRUE, &target);
+ if (result == ISC_R_SUCCESS) {
+ isc_buffer_usedregion(&target, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+ } else
+ printf("(invalid name)");
+
+ return (result);
+}
+
+static isc_result_t
+print_address(FILE *fp, isc_sockaddr_t *addr) {
+ char buf[NI_MAXHOST];
+
+ if (getnameinfo(&addr->type.sa, addr->length, buf, sizeof(buf),
+ NULL, 0, NI_NUMERICHOST) == 0) {
+ fprintf(fp, "%s", buf);
+ } else {
+ fprintf(fp, "(invalid address)");
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ if (*taskmgrp != NULL)
+ isc_taskmgr_destroy(taskmgrp);
+
+ if (*timermgrp != NULL)
+ isc_timermgr_destroy(timermgrp);
+
+ if (*socketmgrp != NULL)
+ isc_socketmgr_destroy(socketmgrp);
+
+ if (*actxp != NULL)
+ isc_appctx_destroy(actxp);
+
+ if (*mctxp != NULL)
+ isc_mem_destroy(mctxp);
+}
+
+static isc_result_t
+ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ isc_result_t result;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_appctx_create(*mctxp, actxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
+
+ return (result);
+}
+
+/*
+ * Common routine to make query data
+ */
+static isc_result_t
+make_querymessage(dns_message_t *message, dns_name_t *qname0,
+ dns_rdatatype_t rdtype)
+{
+ dns_name_t *qname = NULL;
+ dns_rdataset_t *qrdataset = NULL;
+ isc_result_t result;
+
+ message->opcode = dns_opcode_query;
+ message->rdclass = dns_rdataclass_in;
+
+ result = dns_message_gettempname(message, &qname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_message_gettemprdataset(message, &qrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_name_init(qname, NULL);
+ dns_name_clone(qname0, qname);
+ dns_rdataset_init(qrdataset);
+ dns_rdataset_makequestion(qrdataset, message->rdclass, rdtype);
+ ISC_LIST_APPEND(qname->list, qrdataset, link);
+ dns_message_addname(message, qname, DNS_SECTION_QUESTION);
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (qname != NULL)
+ dns_message_puttempname(message, &qname);
+ if (qrdataset != NULL)
+ dns_message_puttemprdataset(message, &qrdataset);
+ if (message != NULL)
+ dns_message_destroy(&message);
+ return (result);
+}
+
+/*
+ * Update statistics
+ */
+static inline void
+increment_entry(unsigned long *entryp) {
+ (*entryp)++;
+ INSIST(*entryp != 0); /* check overflow */
+}
+
+static void
+update_stat(struct probe_trans *trans) {
+ struct probe_ns *pns;
+ struct server *server;
+ struct lcl_stat local_stat;
+ unsigned int err_count = 0;
+ const char *stattype;
+
+ increment_entry(&number_of_domains);
+ memset(&local_stat, 0, sizeof(local_stat));
+
+ /* Update per sever statistics */
+ for (pns = ISC_LIST_HEAD(trans->nslist); pns != NULL;
+ pns = ISC_LIST_NEXT(pns, link)) {
+ for (server = ISC_LIST_HEAD(pns->servers); server != NULL;
+ server = ISC_LIST_NEXT(server, link)) {
+ increment_entry(&number_of_servers);
+
+ if (server->result_aaaa == exist ||
+ server->result_aaaa == notype) {
+ /*
+ * Don't care about the result of A query if
+ * the answer to AAAA query was expected.
+ */
+ stattype = "valid";
+ increment_entry(&server_stat.valid);
+ increment_entry(&local_stat.valid);
+ } else if (server->result_a == exist) {
+ switch (server->result_aaaa) {
+ case exist:
+ case notype:
+ stattype = "valid";
+ increment_entry(&server_stat.valid);
+ increment_entry(&local_stat.valid);
+ break;
+ case timedout:
+ stattype = "ignore";
+ increment_entry(&server_stat.ignore);
+ increment_entry(&local_stat.ignore);
+ break;
+ case nxdomain:
+ stattype = "nxdomain";
+ increment_entry(&server_stat.nxdomain);
+ increment_entry(&local_stat.nxdomain);
+ break;
+ case othererr:
+ stattype = "othererr";
+ increment_entry(&server_stat.othererr);
+ increment_entry(&local_stat.othererr);
+ break;
+ case multiplesoa:
+ stattype = "multiplesoa";
+ increment_entry(&server_stat.multiplesoa);
+ increment_entry(&local_stat.multiplesoa);
+ break;
+ case multiplecname:
+ stattype = "multiplecname";
+ increment_entry(&server_stat.multiplecname);
+ increment_entry(&local_stat.multiplecname);
+ break;
+ case brokenanswer:
+ stattype = "brokenanswer";
+ increment_entry(&server_stat.brokenanswer);
+ increment_entry(&local_stat.brokenanswer);
+ break;
+ case lame:
+ stattype = "lame";
+ increment_entry(&server_stat.lame);
+ increment_entry(&local_stat.lame);
+ break;
+ default:
+ stattype = "unknown";
+ increment_entry(&server_stat.unknown);
+ increment_entry(&local_stat.unknown);
+ break;
+ }
+ } else {
+ stattype = "unknown";
+ increment_entry(&server_stat.unknown);
+ increment_entry(&local_stat.unknown);
+ }
+
+ if (verbose_level > 1 ||
+ (verbose_level == 1 &&
+ strcmp(stattype, "valid") != 0 &&
+ strcmp(stattype, "unknown") != 0)) {
+ print_name(pns->name);
+ putchar('(');
+ print_address(stdout, &server->address);
+ printf(") for %s:%s\n", trans->domain,
+ stattype);
+ }
+ }
+ }
+
+ /* Update per domain statistics */
+ if (local_stat.ignore > 0) {
+ if (verbose_level > 0)
+ printf("%s:ignore\n", trans->domain);
+ increment_entry(&domain_stat.ignore);
+ err_count++;
+ }
+ if (local_stat.nxdomain > 0) {
+ if (verbose_level > 0)
+ printf("%s:nxdomain\n", trans->domain);
+ increment_entry(&domain_stat.nxdomain);
+ err_count++;
+ }
+ if (local_stat.othererr > 0) {
+ if (verbose_level > 0)
+ printf("%s:othererr\n", trans->domain);
+ increment_entry(&domain_stat.othererr);
+ err_count++;
+ }
+ if (local_stat.multiplesoa > 0) {
+ if (verbose_level > 0)
+ printf("%s:multiplesoa\n", trans->domain);
+ increment_entry(&domain_stat.multiplesoa);
+ err_count++;
+ }
+ if (local_stat.multiplecname > 0) {
+ if (verbose_level > 0)
+ printf("%s:multiplecname\n", trans->domain);
+ increment_entry(&domain_stat.multiplecname);
+ err_count++;
+ }
+ if (local_stat.brokenanswer > 0) {
+ if (verbose_level > 0)
+ printf("%s:brokenanswer\n", trans->domain);
+ increment_entry(&domain_stat.brokenanswer);
+ err_count++;
+ }
+ if (local_stat.lame > 0) {
+ if (verbose_level > 0)
+ printf("%s:lame\n", trans->domain);
+ increment_entry(&domain_stat.lame);
+ err_count++;
+ }
+
+ if (err_count > 1)
+ increment_entry(&multiple_error_domains);
+
+ /*
+ * We regard the domain as valid if and only if no authoritative server
+ * has a problem and at least one server is known to be valid.
+ */
+ if (local_stat.valid > 0 && err_count == 0) {
+ if (verbose_level > 1)
+ printf("%s:valid\n", trans->domain);
+ increment_entry(&domain_stat.valid);
+ }
+
+ /*
+ * If the domain has no available server or all servers have the
+ * 'unknown' result, the domain's result is also regarded as unknown.
+ */
+ if (local_stat.valid == 0 && err_count == 0) {
+ if (verbose_level > 1)
+ printf("%s:unknown\n", trans->domain);
+ increment_entry(&domain_stat.unknown);
+ }
+}
+
+/*
+ * Search for an existent name with an A RR
+ */
+
+static isc_result_t
+set_nextqname(struct probe_trans *trans) {
+ isc_result_t result;
+ size_t domainlen;
+ isc_buffer_t b;
+ char buf[4096]; /* XXX ad-hoc constant, but should be enough */
+
+ if (*trans->qlabel == NULL)
+ return (ISC_R_NOMORE);
+
+ result = isc_string_copy(buf, sizeof(buf), *trans->qlabel);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_string_append(buf, sizeof(buf), trans->domain);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ domainlen = strlen(buf);
+ isc_buffer_init(&b, buf, domainlen);
+ isc_buffer_add(&b, domainlen);
+ dns_fixedname_init(&trans->fixedname);
+ trans->qname = dns_fixedname_name(&trans->fixedname);
+ result = dns_name_fromtext(trans->qname, &b, dns_rootname,
+ 0, NULL);
+
+ trans->qlabel++;
+
+ return (result);
+}
+
+static void
+request_done(isc_task_t *task, isc_event_t *event) {
+ struct probe_trans *trans = event->ev_arg;
+ dns_clientreqevent_t *rev = (dns_clientreqevent_t *)event;
+ dns_message_t *rmessage;
+ struct probe_ns *pns;
+ struct server *server;
+ isc_result_t result;
+ query_result_t *resultp;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ dns_rdatatype_t type;
+
+ REQUIRE(task == probe_task);
+ REQUIRE(trans != NULL && trans->inuse == ISC_TRUE);
+ rmessage = rev->rmessage;
+ REQUIRE(rmessage == trans->rmessage);
+ INSIST(outstanding_probes > 0);
+
+ server = trans->current_ns->current_server;
+ INSIST(server != NULL);
+
+ if (server->result_a == none) {
+ type = dns_rdatatype_a;
+ resultp = &server->result_a;
+ } else {
+ resultp = &server->result_aaaa;
+ type = dns_rdatatype_aaaa;
+ }
+
+ if (rev->result == ISC_R_SUCCESS) {
+ if ((rmessage->flags & DNS_MESSAGEFLAG_AA) == 0)
+ *resultp = lame;
+ else if (rmessage->rcode == dns_rcode_nxdomain)
+ *resultp = nxdomain;
+ else if (rmessage->rcode != dns_rcode_noerror)
+ *resultp = othererr;
+ else if (rmessage->counts[DNS_SECTION_ANSWER] == 0) {
+ /* no error but empty answer */
+ *resultp = notype;
+ } else {
+ result = dns_message_firstname(rmessage,
+ DNS_SECTION_ANSWER);
+ while (result == ISC_R_SUCCESS) {
+ name = NULL;
+ dns_message_currentname(rmessage,
+ DNS_SECTION_ANSWER,
+ &name);
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset,
+ link)) {
+ (void)print_rdataset(rdataset, name);
+
+ if (rdataset->type ==
+ dns_rdatatype_cname ||
+ rdataset->type ==
+ dns_rdatatype_dname) {
+ /* Should chase the chain? */
+ *resultp = exist;
+ goto found;
+ } else if (rdataset->type == type) {
+ *resultp = exist;
+ goto found;
+ }
+ }
+ result = dns_message_nextname(rmessage,
+ DNS_SECTION_ANSWER);
+ }
+
+ /*
+ * Something unexpected happened: the response
+ * contained a non-empty authoritative answer, but we
+ * could not find an expected result.
+ */
+ *resultp = unexpected;
+ }
+ } else if (rev->result == DNS_R_RECOVERABLE ||
+ rev->result == DNS_R_BADLABELTYPE) {
+ /* Broken response. Try identifying known cases. */
+ *resultp = brokenanswer;
+
+ if (rmessage->counts[DNS_SECTION_ANSWER] > 0) {
+ result = dns_message_firstname(rmessage,
+ DNS_SECTION_ANSWER);
+ while (result == ISC_R_SUCCESS) {
+ /*
+ * Check to see if the response has multiple
+ * CNAME RRs. Update the result code if so.
+ */
+ name = NULL;
+ dns_message_currentname(rmessage,
+ DNS_SECTION_ANSWER,
+ &name);
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset,
+ link)) {
+ if (rdataset->type ==
+ dns_rdatatype_cname &&
+ dns_rdataset_count(rdataset) > 1) {
+ *resultp = multiplecname;
+ goto found;
+ }
+ }
+ result = dns_message_nextname(rmessage,
+ DNS_SECTION_ANSWER);
+ }
+ }
+
+ if (rmessage->counts[DNS_SECTION_AUTHORITY] > 0) {
+ result = dns_message_firstname(rmessage,
+ DNS_SECTION_AUTHORITY);
+ while (result == ISC_R_SUCCESS) {
+ /*
+ * Check to see if the response has multiple
+ * SOA RRs. Update the result code if so.
+ */
+ name = NULL;
+ dns_message_currentname(rmessage,
+ DNS_SECTION_AUTHORITY,
+ &name);
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset,
+ link)) {
+ if (rdataset->type ==
+ dns_rdatatype_soa &&
+ dns_rdataset_count(rdataset) > 1) {
+ *resultp = multiplesoa;
+ goto found;
+ }
+ }
+ result = dns_message_nextname(rmessage,
+ DNS_SECTION_AUTHORITY);
+ }
+ }
+ } else if (rev->result == ISC_R_TIMEDOUT)
+ *resultp = timedout;
+ else {
+ fprintf(stderr, "unexpected result: %d (domain=%s, server=",
+ rev->result, trans->domain);
+ print_address(stderr, &server->address);
+ fputc('\n', stderr);
+ *resultp = unexpected;
+ }
+
+ found:
+ INSIST(*resultp != none);
+ if (type == dns_rdatatype_a && *resultp == exist)
+ trans->qname_found = ISC_TRUE;
+
+ dns_client_destroyreqtrans(&trans->reqid);
+ isc_event_free(&event);
+ dns_message_reset(trans->rmessage, DNS_MESSAGE_INTENTPARSE);
+
+ result = probe_name(trans, type);
+ if (result == ISC_R_NOMORE) {
+ /* We've tried all addresses of all servers. */
+ if (type == dns_rdatatype_a && trans->qname_found) {
+ /*
+ * If we've explored A RRs and found an existent
+ * record, we can move to AAAA.
+ */
+ trans->current_ns = ISC_LIST_HEAD(trans->nslist);
+ probe_name(trans, dns_rdatatype_aaaa);
+ result = ISC_R_SUCCESS;
+ } else if (type == dns_rdatatype_a) {
+ /*
+ * No server provided an existent A RR of this name.
+ * Try next label.
+ */
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ result = set_nextqname(trans);
+ if (result == ISC_R_SUCCESS) {
+ trans->current_ns =
+ ISC_LIST_HEAD(trans->nslist);
+ for (pns = trans->current_ns; pns != NULL;
+ pns = ISC_LIST_NEXT(pns, link)) {
+ for (server = ISC_LIST_HEAD(pns->servers);
+ server != NULL;
+ server = ISC_LIST_NEXT(server,
+ link)) {
+ INSIST(server->result_aaaa ==
+ none);
+ server->result_a = none;
+ }
+ }
+ result = probe_name(trans, dns_rdatatype_a);
+ }
+ }
+ if (result != ISC_R_SUCCESS) {
+ /*
+ * We've explored AAAA RRs or failed to find a valid
+ * query label. Wrap up the result and move to the
+ * next domain.
+ */
+ reset_probe(trans);
+ }
+ } else if (result != ISC_R_SUCCESS)
+ reset_probe(trans); /* XXX */
+}
+
+static isc_result_t
+probe_name(struct probe_trans *trans, dns_rdatatype_t type) {
+ isc_result_t result;
+ struct probe_ns *pns;
+ struct server *server;
+
+ REQUIRE(trans->reqid == NULL);
+ REQUIRE(type == dns_rdatatype_a || type == dns_rdatatype_aaaa);
+
+ for (pns = trans->current_ns; pns != NULL;
+ pns = ISC_LIST_NEXT(pns, link)) {
+ for (server = ISC_LIST_HEAD(pns->servers); server != NULL;
+ server = ISC_LIST_NEXT(server, link)) {
+ if ((type == dns_rdatatype_a &&
+ server->result_a == none) ||
+ (type == dns_rdatatype_aaaa &&
+ server->result_aaaa == none)) {
+ pns->current_server = server;
+ goto found;
+ }
+ }
+ }
+
+ found:
+ trans->current_ns = pns;
+ if (pns == NULL)
+ return (ISC_R_NOMORE);
+
+ INSIST(pns->current_server != NULL);
+ dns_message_reset(trans->qmessage, DNS_MESSAGE_INTENTRENDER);
+ result = make_querymessage(trans->qmessage, trans->qname, type);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = dns_client_startrequest(client, trans->qmessage,
+ trans->rmessage,
+ &pns->current_server->address,
+ 0, DNS_MESSAGEPARSE_BESTEFFORT,
+ NULL, 120, 0, 4,
+ probe_task, request_done, trans,
+ &trans->reqid);
+
+ return (result);
+}
+
+/*
+ * Get IP addresses of NSes
+ */
+
+static void
+resolve_nsaddress(isc_task_t *task, isc_event_t *event) {
+ struct probe_trans *trans = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ struct probe_ns *pns = trans->current_ns;
+ isc_result_t result;
+
+ REQUIRE(task == probe_task);
+ REQUIRE(trans->inuse == ISC_TRUE);
+ REQUIRE(pns != NULL);
+ INSIST(outstanding_probes > 0);
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ (void)print_rdataset(rdataset, name);
+
+ if (rdataset->type != dns_rdatatype_a)
+ continue;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_in_a_t rdata_a;
+ struct server *server;
+
+ dns_rdataset_current(rdataset, &rdata);
+ result = dns_rdata_tostruct(&rdata, &rdata_a,
+ NULL);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ server = isc_mem_get(mctx, sizeof(*server));
+ if (server == NULL) {
+ fprintf(stderr, "resolve_nsaddress: "
+ "mem_get failed");
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ isc_sockaddr_fromin(&server->address,
+ &rdata_a.in_addr, 53);
+ ISC_LINK_INIT(server, link);
+ server->result_a = none;
+ server->result_aaaa = none;
+ ISC_LIST_APPEND(pns->servers, server, link);
+ }
+ }
+ }
+
+ cleanup:
+ dns_client_freeresanswer(client, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->resid);
+ isc_event_free(&event);
+
+ next_ns:
+ trans->current_ns = ISC_LIST_NEXT(pns, link);
+ if (trans->current_ns == NULL) {
+ trans->current_ns = ISC_LIST_HEAD(trans->nslist);
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ result = set_nextqname(trans);
+ if (result == ISC_R_SUCCESS)
+ result = probe_name(trans, dns_rdatatype_a);
+ } else {
+ result = fetch_nsaddress(trans);
+ if (result != ISC_R_SUCCESS)
+ goto next_ns; /* XXX: this is unlikely to succeed */
+ }
+
+ if (result != ISC_R_SUCCESS)
+ reset_probe(trans);
+}
+
+static isc_result_t
+fetch_nsaddress(struct probe_trans *trans) {
+ struct probe_ns *pns;
+
+ pns = trans->current_ns;
+ REQUIRE(pns != NULL);
+
+ return (dns_client_startresolve(client, pns->name, dns_rdataclass_in,
+ dns_rdatatype_a, 0, probe_task,
+ resolve_nsaddress, trans,
+ &trans->resid));
+}
+
+/*
+ * Get NS RRset for a given domain
+ */
+
+static void
+reset_probe(struct probe_trans *trans) {
+ struct probe_ns *pns;
+ struct server *server;
+ isc_result_t result;
+
+ REQUIRE(trans->resid == NULL);
+ REQUIRE(trans->reqid == NULL);
+
+ update_stat(trans);
+
+ dns_message_reset(trans->qmessage, DNS_MESSAGE_INTENTRENDER);
+ dns_message_reset(trans->rmessage, DNS_MESSAGE_INTENTPARSE);
+
+ trans->inuse = ISC_FALSE;
+ if (trans->domain != NULL)
+ isc_mem_free(mctx, trans->domain);
+ trans->domain = NULL;
+ if (trans->qname != NULL)
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ trans->qlabel = qlabels;
+ trans->qname_found = ISC_FALSE;
+ trans->current_ns = NULL;
+
+ while ((pns = ISC_LIST_HEAD(trans->nslist)) != NULL) {
+ ISC_LIST_UNLINK(trans->nslist, pns, link);
+ while ((server = ISC_LIST_HEAD(pns->servers)) != NULL) {
+ ISC_LIST_UNLINK(pns->servers, server, link);
+ isc_mem_put(mctx, server, sizeof(*server));
+ }
+ isc_mem_put(mctx, pns, sizeof(*pns));
+ }
+
+ outstanding_probes--;
+
+ result = probe_domain(trans);
+ if (result == ISC_R_NOMORE && outstanding_probes == 0)
+ isc_app_ctxshutdown(actx);
+}
+
+static void
+resolve_ns(isc_task_t *task, isc_event_t *event) {
+ struct probe_trans *trans = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ isc_result_t result = ISC_R_SUCCESS;
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ struct probe_ns *pns;
+
+ REQUIRE(task == probe_task);
+ REQUIRE(trans->inuse == ISC_TRUE);
+ INSIST(outstanding_probes > 0);
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ (void)print_rdataset(rdataset, name);
+
+ if (rdataset->type != dns_rdatatype_ns)
+ continue;
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ dns_rdata_ns_t ns;
+
+ dns_rdataset_current(rdataset, &rdata);
+ /*
+ * Extract the name from the NS record.
+ */
+ result = dns_rdata_tostruct(&rdata, &ns, NULL);
+ if (result != ISC_R_SUCCESS)
+ continue;
+
+ pns = isc_mem_get(mctx, sizeof(*pns));
+ if (pns == NULL) {
+ fprintf(stderr,
+ "resolve_ns: mem_get failed");
+ result = ISC_R_NOMEMORY;
+ /*
+ * XXX: should we continue with the
+ * available servers anyway?
+ */
+ goto cleanup;
+ }
+
+ dns_fixedname_init(&pns->fixedname);
+ pns->name =
+ dns_fixedname_name(&pns->fixedname);
+ ISC_LINK_INIT(pns, link);
+ ISC_LIST_APPEND(trans->nslist, pns, link);
+ ISC_LIST_INIT(pns->servers);
+
+ dns_name_copy(&ns.name, pns->name, NULL);
+ dns_rdata_reset(&rdata);
+ dns_rdata_freestruct(&ns);
+ }
+ }
+ }
+
+ cleanup:
+ dns_client_freeresanswer(client, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->resid);
+ isc_event_free(&event);
+
+ if (!ISC_LIST_EMPTY(trans->nslist)) {
+ /* Go get addresses of NSes */
+ trans->current_ns = ISC_LIST_HEAD(trans->nslist);
+ result = fetch_nsaddress(trans);
+ } else
+ result = ISC_R_FAILURE;
+
+ if (result == ISC_R_SUCCESS)
+ return;
+
+ reset_probe(trans);
+}
+
+static isc_result_t
+probe_domain(struct probe_trans *trans) {
+ isc_result_t result;
+ size_t domainlen;
+ isc_buffer_t b;
+ char buf[4096]; /* XXX ad hoc constant, but should be enough */
+ char *cp;
+
+ REQUIRE(trans != NULL);
+ REQUIRE(trans->inuse == ISC_FALSE);
+ REQUIRE(outstanding_probes < MAX_PROBES);
+
+ /* Construct domain */
+ cp = fgets(buf, sizeof(buf), fp);
+ if (cp == NULL)
+ return (ISC_R_NOMORE);
+ if ((cp = strchr(buf, '\n')) != NULL) /* zap NL if any */
+ *cp = '\0';
+ trans->domain = isc_mem_strdup(mctx, buf);
+ if (trans->domain == NULL) {
+ fprintf(stderr,
+ "failed to allocate memory for domain: %s", cp);
+ return (ISC_R_NOMEMORY);
+ }
+
+ /* Start getting NS for the domain */
+ domainlen = strlen(buf);
+ isc_buffer_init(&b, buf, domainlen);
+ isc_buffer_add(&b, domainlen);
+ dns_fixedname_init(&trans->fixedname);
+ trans->qname = dns_fixedname_name(&trans->fixedname);
+ result = dns_name_fromtext(trans->qname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+ result = dns_client_startresolve(client, trans->qname,
+ dns_rdataclass_in, dns_rdatatype_ns,
+ 0, probe_task, resolve_ns, trans,
+ &trans->resid);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ trans->inuse = ISC_TRUE;
+ outstanding_probes++;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ isc_mem_free(mctx, trans->domain);
+ dns_fixedname_invalidate(&trans->fixedname);
+
+ return (result);
+}
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "usage: nsprobe [-d] [-v [-v...]] [-c cache_address] "
+ "[input_file]\n");
+
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int i, ch, error;
+ struct addrinfo hints, *res;
+ isc_result_t result;
+ isc_sockaddr_t sa;
+ isc_sockaddrlist_t servers;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+
+ while ((ch = getopt(argc, argv, "c:dhv")) != -1) {
+ switch (ch) {
+ case 'c':
+ cacheserver = optarg;
+ break;
+ case 'd':
+ debug_mode = ISC_TRUE;
+ break;
+ case 'h':
+ usage();
+ break;
+ case 'v':
+ verbose_level++;
+ break;
+ default:
+ usage();
+ break;
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ /* Common set up */
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr,
+ &timermgr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "ctx create failed: %d\n", result);
+ exit(1);
+ }
+
+ isc_app_ctxstart(actx);
+
+ result = dns_client_createx(mctx, actx, taskmgr, socketmgr,
+ timermgr, 0, &client);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_createx failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set local cache server */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ error = getaddrinfo(cacheserver, "53", &hints, &res);
+ if (error != 0) {
+ fprintf(stderr, "failed to convert server name (%s): %s\n",
+ cacheserver, gai_strerror(error));
+ exit(1);
+ }
+
+ if (res->ai_addrlen > sizeof(sa.type)) {
+ fprintf(stderr,
+ "assumption failure: addrlen is too long: %d\n",
+ res->ai_addrlen);
+ exit(1);
+ }
+ memcpy(&sa.type.sa, res->ai_addr, res->ai_addrlen);
+ sa.length = res->ai_addrlen;
+ freeaddrinfo(res);
+ ISC_LINK_INIT(&sa, link);
+ ISC_LIST_INIT(servers);
+ ISC_LIST_APPEND(servers, &sa, link);
+ result = dns_client_setservers(client, dns_rdataclass_in, NULL,
+ &servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to set server: %d\n", result);
+ exit(1);
+ }
+
+ /* Create the main task */
+ probe_task = NULL;
+ result = isc_task_create(taskmgr, 0, &probe_task);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create task: %d\n", result);
+ exit(1);
+ }
+
+ /* Open input file */
+ if (argc == 0)
+ fp = stdin;
+ else {
+ fp = fopen(argv[0], "r");
+ if (fp == NULL) {
+ fprintf(stderr, "failed to open input file: %s\n",
+ argv[0]);
+ exit(1);
+ }
+ }
+
+ /* Set up and start probe */
+ for (i = 0; i < MAX_PROBES; i++) {
+ probes[i].inuse = ISC_FALSE;
+ probes[i].domain = NULL;
+ dns_fixedname_init(&probes[i].fixedname);
+ probes[i].qname = NULL;
+ probes[i].qlabel = qlabels;
+ probes[i].qname_found = ISC_FALSE;
+ probes[i].resid = NULL;
+ ISC_LIST_INIT(probes[i].nslist);
+ probes[i].reqid = NULL;
+
+ probes[i].qmessage = NULL;
+ result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER,
+ &probes[i].qmessage);
+ if (result == ISC_R_SUCCESS) {
+ result = dns_message_create(mctx,
+ DNS_MESSAGE_INTENTPARSE,
+ &probes[i].rmessage);
+ }
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "initialization failure\n");
+ exit(1);
+ }
+ }
+ for (i = 0; i < MAX_PROBES; i++) {
+ result = probe_domain(&probes[i]);
+ if (result == ISC_R_NOMORE)
+ break;
+ else if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to issue an initial probe\n");
+ exit(1);
+ }
+ }
+
+ /* Start event loop */
+ isc_app_ctxrun(actx);
+
+ /* Dump results */
+ printf("Per domain results (out of %lu domains):\n",
+ number_of_domains);
+ printf(" valid: %lu\n"
+ " ignore: %lu\n"
+ " nxdomain: %lu\n"
+ " othererr: %lu\n"
+ " multiplesoa: %lu\n"
+ " multiplecname: %lu\n"
+ " brokenanswer: %lu\n"
+ " lame: %lu\n"
+ " unknown: %lu\n"
+ " multiple errors: %lu\n",
+ domain_stat.valid, domain_stat.ignore, domain_stat.nxdomain,
+ domain_stat.othererr, domain_stat.multiplesoa,
+ domain_stat.multiplecname, domain_stat.brokenanswer,
+ domain_stat.lame, domain_stat.unknown, multiple_error_domains);
+ printf("Per server results (out of %lu servers):\n",
+ number_of_servers);
+ printf(" valid: %lu\n"
+ " ignore: %lu\n"
+ " nxdomain: %lu\n"
+ " othererr: %lu\n"
+ " multiplesoa: %lu\n"
+ " multiplecname: %lu\n"
+ " brokenanswer: %lu\n"
+ " lame: %lu\n"
+ " unknown: %lu\n",
+ server_stat.valid, server_stat.ignore, server_stat.nxdomain,
+ server_stat.othererr, server_stat.multiplesoa,
+ server_stat.multiplecname, server_stat.brokenanswer,
+ server_stat.lame, server_stat.unknown);
+
+ /* Cleanup */
+ for (i = 0; i < MAX_PROBES; i++) {
+ dns_message_destroy(&probes[i].qmessage);
+ dns_message_destroy(&probes[i].rmessage);
+ }
+ isc_task_detach(&probe_task);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+ isc_app_ctxfinish(actx);
+ ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-async.c b/contrib/bind9/lib/export/samples/sample-async.c
new file mode 100644
index 0000000..19c0bba
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-async.c
@@ -0,0 +1,402 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-async.c,v 1.5 2009-09-29 15:06:07 fdupont Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <isc/app.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/socket.h>
+#include <isc/sockaddr.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/lib.h>
+#include <dns/name.h>
+#include <dns/rdataset.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#define MAX_SERVERS 10
+#define MAX_QUERIES 100
+
+static dns_client_t *client = NULL;
+static isc_task_t *query_task = NULL;
+static isc_appctx_t *query_actx = NULL;
+static unsigned int outstanding_queries = 0;
+static const char *def_server = "127.0.0.1";
+static FILE *fp;
+
+struct query_trans {
+ int id;
+ isc_boolean_t inuse;
+ dns_rdatatype_t type;
+ dns_fixedname_t fixedname;
+ dns_name_t *qname;
+ dns_namelist_t answerlist;
+ dns_clientrestrans_t *xid;
+};
+
+static struct query_trans query_array[MAX_QUERIES];
+
+static isc_result_t dispatch_query(struct query_trans *trans);
+
+static void
+ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ if (*taskmgrp != NULL)
+ isc_taskmgr_destroy(taskmgrp);
+
+ if (*timermgrp != NULL)
+ isc_timermgr_destroy(timermgrp);
+
+ if (*socketmgrp != NULL)
+ isc_socketmgr_destroy(socketmgrp);
+
+ if (*actxp != NULL)
+ isc_appctx_destroy(actxp);
+
+ if (*mctxp != NULL)
+ isc_mem_destroy(mctxp);
+}
+
+static isc_result_t
+ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ isc_result_t result;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_appctx_create(*mctxp, actxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
+
+ return (result);
+}
+
+static isc_result_t
+printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
+ isc_buffer_t target;
+ isc_result_t result;
+ isc_region_t r;
+ char t[4096];
+
+ isc_buffer_init(&target, t, sizeof(t));
+
+ if (!dns_rdataset_isassociated(rdataset))
+ return (ISC_R_SUCCESS);
+ result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
+ &target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&target, &r);
+ printf(" %.*s", (int)r.length, (char *)r.base);
+
+ return (ISC_R_SUCCESS);
+}
+
+static void
+process_answer(isc_task_t *task, isc_event_t *event) {
+ struct query_trans *trans = event->ev_arg;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_name_t *name;
+ dns_rdataset_t *rdataset;
+ isc_result_t result;
+
+ REQUIRE(task == query_task);
+ REQUIRE(trans->inuse == ISC_TRUE);
+ REQUIRE(outstanding_queries > 0);
+
+ printf("answer[%2d]\n", trans->id);
+
+ if (rev->result != ISC_R_SUCCESS)
+ printf(" failed: %d(%s)\n", rev->result,
+ dns_result_totext(rev->result));
+
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ (void)printdata(rdataset, name);
+ }
+ }
+
+ dns_client_freeresanswer(client, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->xid);
+
+ isc_event_free(&event);
+
+ trans->inuse = ISC_FALSE;
+ dns_fixedname_invalidate(&trans->fixedname);
+ trans->qname = NULL;
+ outstanding_queries--;
+
+ result = dispatch_query(trans);
+#if 0 /* for cancel test */
+ if (result == ISC_R_SUCCESS) {
+ static int count = 0;
+
+ if ((++count) % 10 == 0)
+ dns_client_cancelresolve(trans->xid);
+ }
+#endif
+ if (result == ISC_R_NOMORE && outstanding_queries == 0)
+ isc_app_ctxshutdown(query_actx);
+}
+
+static isc_result_t
+dispatch_query(struct query_trans *trans) {
+ isc_result_t result;
+ size_t namelen;
+ isc_buffer_t b;
+ char buf[4096]; /* XXX ad hoc constant, but should be enough */
+ char *cp;
+
+ REQUIRE(trans != NULL);
+ REQUIRE(trans->inuse == ISC_FALSE);
+ REQUIRE(ISC_LIST_EMPTY(trans->answerlist));
+ REQUIRE(outstanding_queries < MAX_QUERIES);
+
+ /* Construct qname */
+ cp = fgets(buf, sizeof(buf), fp);
+ if (cp == NULL)
+ return (ISC_R_NOMORE);
+ /* zap NL if any */
+ if ((cp = strchr(buf, '\n')) != NULL)
+ *cp = '\0';
+ namelen = strlen(buf);
+ isc_buffer_init(&b, buf, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&trans->fixedname);
+ trans->qname = dns_fixedname_name(&trans->fixedname);
+ result = dns_name_fromtext(trans->qname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Start resolution */
+ result = dns_client_startresolve(client, trans->qname,
+ dns_rdataclass_in, trans->type, 0,
+ query_task, process_answer, trans,
+ &trans->xid);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ trans->inuse = ISC_TRUE;
+ outstanding_queries++;
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ dns_fixedname_invalidate(&trans->fixedname);
+
+ return (result);
+}
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "usage: sample-async [-s server_address] [-t RR type] "
+ "input_file\n");
+
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch;
+ isc_textregion_t tr;
+ isc_mem_t *mctx = NULL;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+ int nservers = 0;
+ const char *serveraddr[MAX_SERVERS];
+ isc_sockaddr_t sa[MAX_SERVERS];
+ isc_sockaddrlist_t servers;
+ dns_rdatatype_t type = dns_rdatatype_a;
+ struct in_addr inaddr;
+ isc_result_t result;
+ int i;
+
+ while ((ch = getopt(argc, argv, "s:t:")) != -1) {
+ switch (ch) {
+ case 't':
+ tr.base = optarg;
+ tr.length = strlen(optarg);
+ result = dns_rdatatype_fromtext(&type, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "invalid RRtype: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 's':
+ if (nservers == MAX_SERVERS) {
+ fprintf(stderr,
+ "too many servers (up to %d)\n",
+ MAX_SERVERS);
+ exit(1);
+ }
+ serveraddr[nservers++] = (const char *)optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 1)
+ usage();
+
+ if (nservers == 0) {
+ nservers = 1;
+ serveraddr[0] = def_server;
+ }
+
+ for (i = 0; i < MAX_QUERIES; i++) {
+ query_array[i].id = i;
+ query_array[i].inuse = ISC_FALSE;
+ query_array[i].type = type;
+ dns_fixedname_init(&query_array[i].fixedname);
+ query_array[i].qname = NULL;
+ ISC_LIST_INIT(query_array[i].answerlist);
+ query_array[i].xid = NULL;
+ }
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ result = ctxs_init(&mctx, &query_actx, &taskmgr, &socketmgr,
+ &timermgr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "ctx create failed: %d\n", result);
+ exit(1);
+ }
+
+ isc_app_ctxstart(query_actx);
+
+ result = dns_client_createx(mctx, query_actx, taskmgr, socketmgr,
+ timermgr, 0, &client);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_createx failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set nameservers */
+ ISC_LIST_INIT(servers);
+ for (i = 0; i < nservers; i++) {
+ if (inet_pton(AF_INET, serveraddr[i], &inaddr) != 1) {
+ fprintf(stderr, "failed to parse IPv4 address %s\n",
+ serveraddr[i]);
+ exit(1);
+ }
+ isc_sockaddr_fromin(&sa[i], &inaddr, 53);
+ ISC_LIST_APPEND(servers, &sa[i], link);
+ }
+ result = dns_client_setservers(client, dns_rdataclass_in, NULL,
+ &servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "set server failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Create the main task */
+ query_task = NULL;
+ result = isc_task_create(taskmgr, 0, &query_task);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create task: %d\n", result);
+ exit(1);
+ }
+
+ /* Open input file */
+ fp = fopen(argv[0], "r");
+ if (fp == NULL) {
+ fprintf(stderr, "failed to open input file: %s\n", argv[1]);
+ exit(1);
+ }
+
+ /* Dispatch initial queries */
+ for (i = 0; i < MAX_QUERIES; i++) {
+ result = dispatch_query(&query_array[i]);
+ if (result == ISC_R_NOMORE)
+ break;
+ }
+
+ /* Start event loop */
+ isc_app_ctxrun(query_actx);
+
+ /* Sanity check */
+ for (i = 0; i < MAX_QUERIES; i++)
+ INSIST(query_array[i].inuse == ISC_FALSE);
+
+ /* Cleanup */
+ isc_task_detach(&query_task);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+ isc_app_ctxfinish(query_actx);
+ ctxs_destroy(&mctx, &query_actx, &taskmgr, &socketmgr, &timermgr);
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-gai.c b/contrib/bind9/lib/export/samples/sample-gai.c
new file mode 100644
index 0000000..7c07f1b
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-gai.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-gai.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <irs/netdb.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static void
+do_gai(int family, char *hostname) {
+ struct addrinfo hints, *res, *res0;
+ int error;
+ char namebuf[1024], addrbuf[1024], servbuf[1024];
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_CANONNAME;
+ error = getaddrinfo(hostname, "http", &hints, &res0);
+ if (error) {
+ fprintf(stderr, "getaddrinfo failed for %s,family=%d: %s\n",
+ hostname, family, gai_strerror(error));
+ return;
+ }
+
+ for (res = res0; res; res = res->ai_next) {
+ error = getnameinfo(res->ai_addr, res->ai_addrlen,
+ addrbuf, sizeof(addrbuf),
+ NULL, 0, NI_NUMERICHOST);
+ if (error == 0)
+ error = getnameinfo(res->ai_addr, res->ai_addrlen,
+ namebuf, sizeof(namebuf),
+ servbuf, sizeof(servbuf), 0);
+ if (error != 0) {
+ fprintf(stderr, "getnameinfo failed: %s\n",
+ gai_strerror(error));
+ } else {
+ printf("%s(%s/%s)=%s:%s\n", hostname,
+ res->ai_canonname, addrbuf, namebuf, servbuf);
+ }
+ }
+
+ freeaddrinfo(res);
+}
+
+int
+main(int argc, char *argv[]) {
+ if (argc < 2)
+ exit(1);
+
+ do_gai(AF_INET, argv[1]);
+ do_gai(AF_INET6, argv[1]);
+ do_gai(AF_UNSPEC, argv[1]);
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-request.c b/contrib/bind9/lib/export/samples/sample-request.c
new file mode 100644
index 0000000..4331498
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-request.c
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-request.c,v 1.5 2009-09-29 15:06:07 fdupont Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/keyvalues.h>
+#include <dns/lib.h>
+#include <dns/masterdump.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+#include <dns/secalg.h>
+
+#include <dst/dst.h>
+
+static isc_mem_t *mctx;
+static dns_fixedname_t fixedqname;
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "sample-request [-t RRtype] server_address hostname\n");
+
+ exit(1);
+}
+
+static isc_result_t
+make_querymessage(dns_message_t *message, const char *namestr,
+ dns_rdatatype_t rdtype)
+{
+ dns_name_t *qname = NULL, *qname0;
+ dns_rdataset_t *qrdataset = NULL;
+ isc_result_t result;
+ isc_buffer_t b;
+ size_t namelen;
+
+ /* Construct qname */
+ namelen = strlen(namestr);
+ isc_buffer_init(&b, namestr, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fixedqname);
+ qname0 = dns_fixedname_name(&fixedqname);
+ result = dns_name_fromtext(qname0, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to convert qname: %d\n", result);
+ return (result);
+ }
+
+ /* Construct query message */
+ message->opcode = dns_opcode_query;
+ message->rdclass = dns_rdataclass_in;
+
+ result = dns_message_gettempname(message, &qname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = dns_message_gettemprdataset(message, &qrdataset);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ dns_name_init(qname, NULL);
+ dns_name_clone(qname0, qname);
+ dns_rdataset_init(qrdataset);
+ dns_rdataset_makequestion(qrdataset, message->rdclass, rdtype);
+ ISC_LIST_APPEND(qname->list, qrdataset, link);
+ dns_message_addname(message, qname, DNS_SECTION_QUESTION);
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (qname != NULL)
+ dns_message_puttempname(message, &qname);
+ if (qrdataset != NULL)
+ dns_message_puttemprdataset(message, &qrdataset);
+ if (message != NULL)
+ dns_message_destroy(&message);
+ return (result);
+}
+
+static void
+print_section(dns_message_t *message, int section, isc_buffer_t *buf) {
+ isc_result_t result;
+ isc_region_t r;
+
+ result = dns_message_sectiontotext(message, section,
+ &dns_master_style_full, 0, buf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ isc_buffer_usedregion(buf, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+
+ return;
+
+ fail:
+ fprintf(stderr, "failed to convert a section\n");
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch, i, gai_error;
+ struct addrinfo hints, *res;
+ isc_textregion_t tr;
+ dns_client_t *client = NULL;
+ isc_result_t result;
+ isc_sockaddr_t sa;
+ dns_message_t *qmessage, *rmessage;
+ dns_rdatatype_t type = dns_rdatatype_a;
+ isc_buffer_t *outputbuf;
+
+ while ((ch = getopt(argc, argv, "t:")) != -1) {
+ switch (ch) {
+ case 't':
+ tr.base = optarg;
+ tr.length = strlen(optarg);
+ result = dns_rdatatype_fromtext(&type, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "invalid RRtype: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage();
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ result = dns_client_create(&client, 0);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_create failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Prepare message structures */
+ mctx = NULL;
+ qmessage = NULL;
+ rmessage = NULL;
+
+ result = isc_mem_create(0, 0, &mctx);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create a memory context\n");
+ exit(1);
+ }
+ result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &qmessage);
+ if (result == ISC_R_SUCCESS) {
+ result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE,
+ &rmessage);
+ }
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create messages\n");
+ exit(1);
+ }
+
+ /* Initialize the nameserver address */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(argv[0], "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa.type));
+ memcpy(&sa.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa, link);
+
+ /* Construct qname */
+ result = make_querymessage(qmessage, argv[1], type);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to create a query\n");
+ exit(1);
+ }
+
+ /* Send request and wait for a response */
+ result = dns_client_request(client, qmessage, rmessage, &sa, 0, 0,
+ NULL, 60, 0, 3);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to get a response: %s\n",
+ dns_result_totext(result));
+ }
+
+ /* Dump the response */
+ outputbuf = NULL;
+ result = isc_buffer_allocate(mctx, &outputbuf, 65535);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to allocate a result buffer\n");
+ exit(1);
+ }
+ for (i = 0; i < DNS_SECTION_MAX; i++) {
+ print_section(rmessage, i, outputbuf);
+ isc_buffer_clear(outputbuf);
+ }
+ isc_buffer_free(&outputbuf);
+
+ /* Cleanup */
+ dns_message_destroy(&qmessage);
+ dns_message_destroy(&rmessage);
+ isc_mem_destroy(&mctx);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/export/samples/sample-update.c b/contrib/bind9/lib/export/samples/sample-update.c
new file mode 100644
index 0000000..eef0a58
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample-update.c
@@ -0,0 +1,755 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample-update.c,v 1.10 2010-12-09 00:54:34 marka Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+
+#include <isc/buffer.h>
+#include <isc/lex.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/parseint.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/callbacks.h>
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/lib.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataclass.h>
+#include <dns/rdatalist.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+#include <dns/secalg.h>
+#include <dns/tsec.h>
+
+#include <dst/dst.h>
+
+static dns_tsec_t *tsec = NULL;
+static const dns_rdataclass_t default_rdataclass = dns_rdataclass_in;
+static isc_bufferlist_t usedbuffers;
+static ISC_LIST(dns_rdatalist_t) usedrdatalists;
+
+static void setup_tsec(char *keyfile, isc_mem_t *mctx);
+static void update_addordelete(isc_mem_t *mctx, char *cmdline,
+ isc_boolean_t isdelete, dns_name_t *name);
+static void evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name);
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "sample-update "
+ "[-a auth_server] "
+ "[-k keyfile] "
+ "[-p prerequisite] "
+ "[-r recursive_server] "
+ "[-z zonename] "
+ "(add|delete) \"name TTL RRtype RDATA\"\n");
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch;
+ struct addrinfo hints, *res;
+ int gai_error;
+ dns_client_t *client = NULL;
+ char *zonenamestr = NULL;
+ char *keyfilename = NULL;
+ char *prereqstr = NULL;
+ isc_sockaddrlist_t auth_servers;
+ char *auth_server = NULL;
+ char *recursive_server = NULL;
+ isc_sockaddr_t sa_auth, sa_recursive;
+ isc_sockaddrlist_t rec_servers;
+ isc_result_t result;
+ isc_boolean_t isdelete;
+ isc_buffer_t b, *buf;
+ dns_fixedname_t zname0, pname0, uname0;
+ size_t namelen;
+ dns_name_t *zname = NULL, *uname, *pname;
+ dns_rdataset_t *rdataset;
+ dns_rdatalist_t *rdatalist;
+ dns_rdata_t *rdata;
+ dns_namelist_t updatelist, prereqlist, *prereqlistp = NULL;
+ isc_mem_t *umctx = NULL;
+
+ while ((ch = getopt(argc, argv, "a:k:p:r:z:")) != -1) {
+ switch (ch) {
+ case 'k':
+ keyfilename = optarg;
+ break;
+ case 'a':
+ auth_server = optarg;
+ break;
+ case 'p':
+ prereqstr = optarg;
+ break;
+ case 'r':
+ recursive_server = optarg;
+ break;
+ case 'z':
+ zonenamestr = optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage();
+
+ /* command line argument validation */
+ if (strcmp(argv[0], "delete") == 0)
+ isdelete = ISC_TRUE;
+ else if (strcmp(argv[0], "add") == 0)
+ isdelete = ISC_FALSE;
+ else {
+ fprintf(stderr, "invalid update command: %s\n", argv[0]);
+ exit(1);
+ }
+
+ if (auth_server == NULL && recursive_server == NULL) {
+ fprintf(stderr, "authoritative or recursive server "
+ "must be specified\n");
+ usage();
+ }
+
+ /* Initialization */
+ ISC_LIST_INIT(usedbuffers);
+ ISC_LIST_INIT(usedrdatalists);
+ ISC_LIST_INIT(prereqlist);
+ ISC_LIST_INIT(auth_servers);
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+ result = isc_mem_create(0, 0, &umctx);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to crate mctx\n");
+ exit(1);
+ }
+
+ result = dns_client_create(&client, 0);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_create failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set the authoritative server */
+ if (auth_server != NULL) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(auth_server, "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa_auth.type));
+ memcpy(&sa_auth.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa_auth.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa_auth, link);
+
+ ISC_LIST_APPEND(auth_servers, &sa_auth, link);
+ }
+
+ /* Set the recursive server */
+ if (recursive_server != NULL) {
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(recursive_server, "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa_recursive.type));
+ memcpy(&sa_recursive.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa_recursive.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa_recursive, link);
+ ISC_LIST_INIT(rec_servers);
+ ISC_LIST_APPEND(rec_servers, &sa_recursive, link);
+ result = dns_client_setservers(client, dns_rdataclass_in,
+ NULL, &rec_servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "set server failed: %d\n", result);
+ exit(1);
+ }
+ }
+
+ /* Construct zone name */
+ zname = NULL;
+ if (zonenamestr != NULL) {
+ namelen = strlen(zonenamestr);
+ isc_buffer_init(&b, zonenamestr, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&zname0);
+ zname = dns_fixedname_name(&zname0);
+ result = dns_name_fromtext(zname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ fprintf(stderr, "failed to convert zone name: %d\n",
+ result);
+ }
+
+ /* Construct prerequisite name (if given) */
+ if (prereqstr != NULL) {
+ dns_fixedname_init(&pname0);
+ pname = dns_fixedname_name(&pname0);
+ evaluate_prereq(umctx, prereqstr, pname);
+ ISC_LIST_APPEND(prereqlist, pname, link);
+ prereqlistp = &prereqlist;
+ }
+
+ /* Construct update name */
+ ISC_LIST_INIT(updatelist);
+ dns_fixedname_init(&uname0);
+ uname = dns_fixedname_name(&uname0);
+ update_addordelete(umctx, argv[1], isdelete, uname);
+ ISC_LIST_APPEND(updatelist, uname, link);
+
+ /* Set up TSIG/SIG(0) key (if given) */
+ if (keyfilename != NULL)
+ setup_tsec(keyfilename, umctx);
+
+ /* Perform update */
+ result = dns_client_update(client,
+ default_rdataclass, /* XXX: fixed */
+ zname, prereqlistp, &updatelist,
+ (auth_server == NULL) ? NULL :
+ &auth_servers, tsec, 0);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "update failed: %s\n", dns_result_totext(result));
+ } else
+ fprintf(stderr, "update succeeded\n");
+
+ /* Cleanup */
+ while ((pname = ISC_LIST_HEAD(prereqlist)) != NULL) {
+ while ((rdataset = ISC_LIST_HEAD(pname->list)) != NULL) {
+ ISC_LIST_UNLINK(pname->list, rdataset, link);
+ dns_rdataset_disassociate(rdataset);
+ isc_mem_put(umctx, rdataset, sizeof(*rdataset));
+ }
+ ISC_LIST_UNLINK(prereqlist, pname, link);
+ }
+ while ((uname = ISC_LIST_HEAD(updatelist)) != NULL) {
+ while ((rdataset = ISC_LIST_HEAD(uname->list)) != NULL) {
+ ISC_LIST_UNLINK(uname->list, rdataset, link);
+ dns_rdataset_disassociate(rdataset);
+ isc_mem_put(umctx, rdataset, sizeof(*rdataset));
+ }
+ ISC_LIST_UNLINK(updatelist, uname, link);
+ }
+ while ((rdatalist = ISC_LIST_HEAD(usedrdatalists)) != NULL) {
+ while ((rdata = ISC_LIST_HEAD(rdatalist->rdata)) != NULL) {
+ ISC_LIST_UNLINK(rdatalist->rdata, rdata, link);
+ isc_mem_put(umctx, rdata, sizeof(*rdata));
+ }
+ ISC_LIST_UNLINK(usedrdatalists, rdatalist, link);
+ isc_mem_put(umctx, rdatalist, sizeof(*rdatalist));
+ }
+ while ((buf = ISC_LIST_HEAD(usedbuffers)) != NULL) {
+ ISC_LIST_UNLINK(usedbuffers, buf, link);
+ isc_buffer_free(&buf);
+ }
+ if (tsec != NULL)
+ dns_tsec_destroy(&tsec);
+ isc_mem_destroy(&umctx);
+ dns_client_destroy(&client);
+ dns_lib_shutdown();
+
+ exit(0);
+}
+
+/*
+ * Subroutines borrowed from nsupdate.c
+ */
+#define MAXWIRE (64 * 1024)
+#define TTL_MAX 2147483647U /* Maximum signed 32 bit integer. */
+
+static char *
+nsu_strsep(char **stringp, const char *delim) {
+ char *string = *stringp;
+ char *s;
+ const char *d;
+ char sc, dc;
+
+ if (string == NULL)
+ return (NULL);
+
+ for (; *string != '\0'; string++) {
+ sc = *string;
+ for (d = delim; (dc = *d) != '\0'; d++) {
+ if (sc == dc)
+ break;
+ }
+ if (dc == 0)
+ break;
+ }
+
+ for (s = string; *s != '\0'; s++) {
+ sc = *s;
+ for (d = delim; (dc = *d) != '\0'; d++) {
+ if (sc == dc) {
+ *s++ = '\0';
+ *stringp = s;
+ return (string);
+ }
+ }
+ }
+ *stringp = NULL;
+ return (string);
+}
+
+static void
+fatal(const char *format, ...) {
+ va_list args;
+
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+static inline void
+check_result(isc_result_t result, const char *msg) {
+ if (result != ISC_R_SUCCESS)
+ fatal("%s: %s", msg, isc_result_totext(result));
+}
+
+static void
+parse_name(char **cmdlinep, dns_name_t *name) {
+ isc_result_t result;
+ char *word;
+ isc_buffer_t source;
+
+ word = nsu_strsep(cmdlinep, " \t\r\n");
+ if (*word == 0) {
+ fprintf(stderr, "could not read owner name\n");
+ exit(1);
+ }
+
+ isc_buffer_init(&source, word, strlen(word));
+ isc_buffer_add(&source, strlen(word));
+ result = dns_name_fromtext(name, &source, dns_rootname, 0, NULL);
+ check_result(result, "dns_name_fromtext");
+ isc_buffer_invalidate(&source);
+}
+
+static void
+parse_rdata(isc_mem_t *mctx, char **cmdlinep, dns_rdataclass_t rdataclass,
+ dns_rdatatype_t rdatatype, dns_rdata_t *rdata)
+{
+ char *cmdline = *cmdlinep;
+ isc_buffer_t source, *buf = NULL, *newbuf = NULL;
+ isc_region_t r;
+ isc_lex_t *lex = NULL;
+ dns_rdatacallbacks_t callbacks;
+ isc_result_t result;
+
+ while (cmdline != NULL && *cmdline != 0 &&
+ isspace((unsigned char)*cmdline))
+ cmdline++;
+
+ if (cmdline != NULL && *cmdline != 0) {
+ dns_rdatacallbacks_init(&callbacks);
+ result = isc_lex_create(mctx, strlen(cmdline), &lex);
+ check_result(result, "isc_lex_create");
+ isc_buffer_init(&source, cmdline, strlen(cmdline));
+ isc_buffer_add(&source, strlen(cmdline));
+ result = isc_lex_openbuffer(lex, &source);
+ check_result(result, "isc_lex_openbuffer");
+ result = isc_buffer_allocate(mctx, &buf, MAXWIRE);
+ check_result(result, "isc_buffer_allocate");
+ result = dns_rdata_fromtext(rdata, rdataclass, rdatatype, lex,
+ dns_rootname, 0, mctx, buf,
+ &callbacks);
+ isc_lex_destroy(&lex);
+ if (result == ISC_R_SUCCESS) {
+ isc_buffer_usedregion(buf, &r);
+ result = isc_buffer_allocate(mctx, &newbuf, r.length);
+ check_result(result, "isc_buffer_allocate");
+ isc_buffer_putmem(newbuf, r.base, r.length);
+ isc_buffer_usedregion(newbuf, &r);
+ dns_rdata_reset(rdata);
+ dns_rdata_fromregion(rdata, rdataclass, rdatatype, &r);
+ isc_buffer_free(&buf);
+ ISC_LIST_APPEND(usedbuffers, newbuf, link);
+ } else {
+ fprintf(stderr, "invalid rdata format: %s\n",
+ isc_result_totext(result));
+ isc_buffer_free(&buf);
+ exit(1);
+ }
+ } else {
+ rdata->flags = DNS_RDATA_UPDATE;
+ }
+ *cmdlinep = cmdline;
+}
+
+static void
+update_addordelete(isc_mem_t *mctx, char *cmdline, isc_boolean_t isdelete,
+ dns_name_t *name)
+{
+ isc_result_t result;
+ isc_uint32_t ttl;
+ char *word;
+ dns_rdataclass_t rdataclass;
+ dns_rdatatype_t rdatatype;
+ dns_rdata_t *rdata = NULL;
+ dns_rdatalist_t *rdatalist = NULL;
+ dns_rdataset_t *rdataset = NULL;
+ isc_textregion_t region;
+
+ /*
+ * Read the owner name.
+ */
+ parse_name(&cmdline, name);
+
+ rdata = isc_mem_get(mctx, sizeof(*rdata));
+ if (rdata == NULL) {
+ fprintf(stderr, "memory allocation for rdata failed\n");
+ exit(1);
+ }
+ dns_rdata_init(rdata);
+
+ /*
+ * If this is an add, read the TTL and verify that it's in range.
+ * If it's a delete, ignore a TTL if present (for compatibility).
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ if (!isdelete) {
+ fprintf(stderr, "could not read owner ttl\n");
+ exit(1);
+ }
+ else {
+ ttl = 0;
+ rdataclass = dns_rdataclass_any;
+ rdatatype = dns_rdatatype_any;
+ rdata->flags = DNS_RDATA_UPDATE;
+ goto doneparsing;
+ }
+ }
+ result = isc_parse_uint32(&ttl, word, 10);
+ if (result != ISC_R_SUCCESS) {
+ if (isdelete) {
+ ttl = 0;
+ goto parseclass;
+ } else {
+ fprintf(stderr, "ttl '%s': %s\n", word,
+ isc_result_totext(result));
+ exit(1);
+ }
+ }
+
+ if (isdelete)
+ ttl = 0;
+ else if (ttl > TTL_MAX) {
+ fprintf(stderr, "ttl '%s' is out of range (0 to %u)\n",
+ word, TTL_MAX);
+ exit(1);
+ }
+
+ /*
+ * Read the class or type.
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ parseclass:
+ if (word == NULL || *word == 0) {
+ if (isdelete) {
+ rdataclass = dns_rdataclass_any;
+ rdatatype = dns_rdatatype_any;
+ rdata->flags = DNS_RDATA_UPDATE;
+ goto doneparsing;
+ } else {
+ fprintf(stderr, "could not read class or type\n");
+ exit(1);
+ }
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdataclass_fromtext(&rdataclass, &region);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * Now read the type.
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ if (isdelete) {
+ rdataclass = dns_rdataclass_any;
+ rdatatype = dns_rdatatype_any;
+ rdata->flags = DNS_RDATA_UPDATE;
+ goto doneparsing;
+ } else {
+ fprintf(stderr, "could not read type\n");
+ exit(1);
+ }
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "'%s' is not a valid type: %s\n",
+ word, isc_result_totext(result));
+ exit(1);
+ }
+ } else {
+ rdataclass = default_rdataclass;
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "'%s' is not a valid class or type: "
+ "%s\n", word, isc_result_totext(result));
+ exit(1);
+ }
+ }
+
+ parse_rdata(mctx, &cmdline, rdataclass, rdatatype, rdata);
+
+ if (isdelete) {
+ if ((rdata->flags & DNS_RDATA_UPDATE) != 0)
+ rdataclass = dns_rdataclass_any;
+ else
+ rdataclass = dns_rdataclass_none;
+ } else {
+ if ((rdata->flags & DNS_RDATA_UPDATE) != 0) {
+ fprintf(stderr, "could not read rdata\n");
+ exit(1);
+ }
+ }
+
+ doneparsing:
+
+ rdatalist = isc_mem_get(mctx, sizeof(*rdatalist));
+ if (rdatalist == NULL) {
+ fprintf(stderr, "memory allocation for rdatalist failed\n");
+ exit(1);
+ }
+ dns_rdatalist_init(rdatalist);
+ rdatalist->type = rdatatype;
+ rdatalist->rdclass = rdataclass;
+ rdatalist->covers = rdatatype;
+ rdatalist->ttl = (dns_ttl_t)ttl;
+ ISC_LIST_INIT(rdatalist->rdata);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ ISC_LIST_APPEND(usedrdatalists, rdatalist, link);
+
+ rdataset = isc_mem_get(mctx, sizeof(*rdataset));
+ if (rdataset == NULL) {
+ fprintf(stderr, "memory allocation for rdataset failed\n");
+ exit(1);
+ }
+ dns_rdataset_init(rdataset);
+ dns_rdatalist_tordataset(rdatalist, rdataset);
+ ISC_LIST_INIT(name->list);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+}
+
+static void
+make_prereq(isc_mem_t *mctx, char *cmdline, isc_boolean_t ispositive,
+ isc_boolean_t isrrset, dns_name_t *name)
+{
+ isc_result_t result;
+ char *word;
+ isc_textregion_t region;
+ dns_rdataset_t *rdataset = NULL;
+ dns_rdatalist_t *rdatalist = NULL;
+ dns_rdataclass_t rdataclass;
+ dns_rdatatype_t rdatatype;
+ dns_rdata_t *rdata = NULL;
+
+ /*
+ * Read the owner name
+ */
+ parse_name(&cmdline, name);
+
+ /*
+ * If this is an rrset prereq, read the class or type.
+ */
+ if (isrrset) {
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ fprintf(stderr, "could not read class or type\n");
+ exit(1);
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdataclass_fromtext(&rdataclass, &region);
+ if (result == ISC_R_SUCCESS) {
+ /*
+ * Now read the type.
+ */
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ fprintf(stderr, "could not read type\n");
+ exit(1);
+ }
+ region.base = word;
+ region.length = strlen(word);
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "invalid type: %s\n", word);
+ exit(1);
+ }
+ } else {
+ rdataclass = default_rdataclass;
+ result = dns_rdatatype_fromtext(&rdatatype, &region);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "invalid type: %s\n", word);
+ exit(1);
+ }
+ }
+ } else
+ rdatatype = dns_rdatatype_any;
+
+ rdata = isc_mem_get(mctx, sizeof(*rdata));
+ if (rdata == NULL) {
+ fprintf(stderr, "memory allocation for rdata failed\n");
+ exit(1);
+ }
+ dns_rdata_init(rdata);
+
+ if (isrrset && ispositive)
+ parse_rdata(mctx, &cmdline, rdataclass, rdatatype, rdata);
+ else
+ rdata->flags = DNS_RDATA_UPDATE;
+
+ rdatalist = isc_mem_get(mctx, sizeof(*rdatalist));
+ if (rdatalist == NULL) {
+ fprintf(stderr, "memory allocation for rdatalist failed\n");
+ exit(1);
+ }
+ dns_rdatalist_init(rdatalist);
+ rdatalist->type = rdatatype;
+ if (ispositive) {
+ if (isrrset && rdata->data != NULL)
+ rdatalist->rdclass = rdataclass;
+ else
+ rdatalist->rdclass = dns_rdataclass_any;
+ } else
+ rdatalist->rdclass = dns_rdataclass_none;
+ rdatalist->covers = 0;
+ rdatalist->ttl = 0;
+ rdata->rdclass = rdatalist->rdclass;
+ rdata->type = rdatatype;
+ ISC_LIST_INIT(rdatalist->rdata);
+ ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
+ ISC_LIST_APPEND(usedrdatalists, rdatalist, link);
+
+ rdataset = isc_mem_get(mctx, sizeof(*rdataset));
+ if (rdataset == NULL) {
+ fprintf(stderr, "memory allocation for rdataset failed\n");
+ exit(1);
+ }
+ dns_rdataset_init(rdataset);
+ dns_rdatalist_tordataset(rdatalist, rdataset);
+ ISC_LIST_INIT(name->list);
+ ISC_LIST_APPEND(name->list, rdataset, link);
+}
+
+static void
+evaluate_prereq(isc_mem_t *mctx, char *cmdline, dns_name_t *name) {
+ char *word;
+ isc_boolean_t ispositive, isrrset;
+
+ word = nsu_strsep(&cmdline, " \t\r\n");
+ if (word == NULL || *word == 0) {
+ fprintf(stderr, "could not read operation code\n");
+ exit(1);
+ }
+ if (strcasecmp(word, "nxdomain") == 0) {
+ ispositive = ISC_FALSE;
+ isrrset = ISC_FALSE;
+ } else if (strcasecmp(word, "yxdomain") == 0) {
+ ispositive = ISC_TRUE;
+ isrrset = ISC_FALSE;
+ } else if (strcasecmp(word, "nxrrset") == 0) {
+ ispositive = ISC_FALSE;
+ isrrset = ISC_TRUE;
+ } else if (strcasecmp(word, "yxrrset") == 0) {
+ ispositive = ISC_TRUE;
+ isrrset = ISC_TRUE;
+ } else {
+ fprintf(stderr, "incorrect operation code: %s\n", word);
+ exit(1);
+ }
+
+ make_prereq(mctx, cmdline, ispositive, isrrset, name);
+}
+
+static void
+setup_tsec(char *keyfile, isc_mem_t *mctx) {
+ dst_key_t *dstkey = NULL;
+ isc_result_t result;
+ dns_tsectype_t tsectype;
+
+ result = dst_key_fromnamedfile(keyfile, NULL,
+ DST_TYPE_PRIVATE | DST_TYPE_KEY, mctx,
+ &dstkey);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "could not read key from %s: %s\n",
+ keyfile, isc_result_totext(result));
+ exit(1);
+ }
+
+ if (dst_key_alg(dstkey) == DST_ALG_HMACMD5)
+ tsectype = dns_tsectype_tsig;
+ else
+ tsectype = dns_tsectype_sig0;
+
+ result = dns_tsec_create(mctx, tsectype, dstkey, &tsec);
+ dst_key_free(&dstkey);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "could not create tsec: %s\n",
+ isc_result_totext(result));
+ exit(1);
+ }
+}
diff --git a/contrib/bind9/lib/export/samples/sample.c b/contrib/bind9/lib/export/samples/sample.c
new file mode 100644
index 0000000..6564f0e
--- /dev/null
+++ b/contrib/bind9/lib/export/samples/sample.c
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: sample.c,v 1.5 2009-09-29 15:06:07 fdupont Exp $ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <arpa/inet.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/keyvalues.h>
+#include <dns/lib.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+#include <dns/secalg.h>
+
+#include <dst/dst.h>
+
+static char *algname;
+
+static isc_result_t
+printdata(dns_rdataset_t *rdataset, dns_name_t *owner) {
+ isc_buffer_t target;
+ isc_result_t result;
+ isc_region_t r;
+ char t[4096];
+
+ if (!dns_rdataset_isassociated(rdataset)) {
+ printf("[WARN: empty]\n");
+ return (ISC_R_SUCCESS);
+ }
+
+ isc_buffer_init(&target, t, sizeof(t));
+
+ result = dns_rdataset_totext(rdataset, owner, ISC_FALSE, ISC_FALSE,
+ &target);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&target, &r);
+ printf("%.*s", (int)r.length, (char *)r.base);
+
+ return (ISC_R_SUCCESS);
+}
+
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
+
+static void
+usage(void) {
+ fprintf(stderr, "sample [-t RRtype] "
+ "[[-a algorithm] [-e] -k keyname -K keystring] "
+ "[-s domain:serveraddr_for_domain ] "
+ "server_address hostname\n");
+
+ exit(1);
+}
+
+static void
+set_key(dns_client_t *client, char *keynamestr, char *keystr,
+ isc_boolean_t is_sep, isc_mem_t **mctxp)
+{
+ isc_result_t result;
+ dns_fixedname_t fkeyname;
+ size_t namelen;
+ dns_name_t *keyname;
+ dns_rdata_dnskey_t keystruct;
+ unsigned char keydata[4096];
+ isc_buffer_t keydatabuf;
+ unsigned char rrdata[4096];
+ isc_buffer_t rrdatabuf;
+ isc_buffer_t b;
+ isc_textregion_t tr;
+ isc_region_t r;
+ dns_secalg_t alg;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to crate mctx\n");
+ exit(1);
+ }
+
+ if (algname != NULL) {
+ tr.base = algname;
+ tr.length = strlen(algname);
+ result = dns_secalg_fromtext(&alg, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to identify the algorithm\n");
+ exit(1);
+ }
+ } else
+ alg = DNS_KEYALG_RSASHA1;
+
+ keystruct.common.rdclass = dns_rdataclass_in;
+ keystruct.common.rdtype = dns_rdatatype_dnskey;
+ keystruct.flags = DNS_KEYOWNER_ZONE; /* fixed */
+ if (is_sep)
+ keystruct.flags |= DNS_KEYFLAG_KSK;
+ keystruct.protocol = DNS_KEYPROTO_DNSSEC; /* fixed */
+ keystruct.algorithm = alg;
+
+ isc_buffer_init(&keydatabuf, keydata, sizeof(keydata));
+ isc_buffer_init(&rrdatabuf, rrdata, sizeof(rrdata));
+ result = isc_base64_decodestring(keystr, &keydatabuf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "base64 decode failed\n");
+ exit(1);
+ }
+ isc_buffer_usedregion(&keydatabuf, &r);
+ keystruct.datalen = r.length;
+ keystruct.data = r.base;
+
+ result = dns_rdata_fromstruct(NULL, keystruct.common.rdclass,
+ keystruct.common.rdtype,
+ &keystruct, &rrdatabuf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to construct key rdata\n");
+ exit(1);
+ }
+ namelen = strlen(keynamestr);
+ isc_buffer_init(&b, keynamestr, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fkeyname);
+ keyname = dns_fixedname_name(&fkeyname);
+ result = dns_name_fromtext(keyname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to construct key name\n");
+ exit(1);
+ }
+ result = dns_client_addtrustedkey(client, dns_rdataclass_in,
+ keyname, &rrdatabuf);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to add key for %s\n",
+ keynamestr);
+ exit(1);
+ }
+}
+
+static void
+addserver(dns_client_t *client, const char *addrstr, const char *namespace) {
+ struct addrinfo hints, *res;
+ int gai_error;
+ isc_sockaddr_t sa;
+ isc_sockaddrlist_t servers;
+ isc_result_t result;
+ size_t namelen;
+ isc_buffer_t b;
+ dns_fixedname_t fname;
+ dns_name_t *name = NULL;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ gai_error = getaddrinfo(addrstr, "53", &hints, &res);
+ if (gai_error != 0) {
+ fprintf(stderr, "getaddrinfo failed: %s\n",
+ gai_strerror(gai_error));
+ exit(1);
+ }
+ INSIST(res->ai_addrlen <= sizeof(sa.type));
+ memcpy(&sa.type, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ sa.length = res->ai_addrlen;
+ ISC_LINK_INIT(&sa, link);
+ ISC_LIST_INIT(servers);
+ ISC_LIST_APPEND(servers, &sa, link);
+
+ if (namespace != NULL) {
+ namelen = strlen(namespace);
+ isc_buffer_init(&b, namespace, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fname);
+ name = dns_fixedname_name(&fname);
+ result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "failed to convert qname: %d\n",
+ result);
+ exit(1);
+ }
+ }
+
+ result = dns_client_setservers(client, dns_rdataclass_in, name,
+ &servers);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "set server failed: %d\n", result);
+ exit(1);
+ }
+}
+
+int
+main(int argc, char *argv[]) {
+ int ch;
+ isc_textregion_t tr;
+ char *altserver = NULL;
+ char *altserveraddr = NULL;
+ char *altservername = NULL;
+ dns_client_t *client = NULL;
+ char *keynamestr = NULL;
+ char *keystr = NULL;
+ isc_result_t result;
+ isc_buffer_t b;
+ dns_fixedname_t qname0;
+ size_t namelen;
+ dns_name_t *qname, *name;
+ dns_rdatatype_t type = dns_rdatatype_a;
+ dns_rdataset_t *rdataset;
+ dns_namelist_t namelist;
+ isc_mem_t *keymctx = NULL;
+ unsigned int clientopt, resopt;
+ isc_boolean_t is_sep = ISC_FALSE;
+
+ while ((ch = getopt(argc, argv, "a:es:t:k:K:")) != -1) {
+ switch (ch) {
+ case 't':
+ tr.base = optarg;
+ tr.length = strlen(optarg);
+ result = dns_rdatatype_fromtext(&type, &tr);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "invalid RRtype: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 'a':
+ algname = optarg;
+ break;
+ case 'e':
+ is_sep = ISC_TRUE;
+ break;
+ case 's':
+ if (altserver != NULL) {
+ fprintf(stderr, "alternate server "
+ "already defined: %s\n",
+ altserver);
+ exit(1);
+ }
+ altserver = optarg;
+ break;
+ case 'k':
+ keynamestr = optarg;
+ break;
+ case 'K':
+ keystr = optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage();
+
+ if (altserver != NULL) {
+ char *cp;
+
+ cp = strchr(altserver, ':');
+ if (cp == NULL) {
+ fprintf(stderr, "invalid alternate server: %s\n",
+ altserver);
+ exit(1);
+ }
+ *cp = '\0';
+ altservername = altserver;
+ altserveraddr = cp + 1;
+ }
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_lib_init failed: %d\n", result);
+ exit(1);
+ }
+
+ clientopt = 0;
+ result = dns_client_create(&client, clientopt);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_client_create failed: %d\n", result);
+ exit(1);
+ }
+
+ /* Set the nameserver */
+ addserver(client, argv[0], NULL);
+
+ /* Set the alternate nameserver (when specified) */
+ if (altserver != NULL)
+ addserver(client, altserveraddr, altservername);
+
+ /* Install DNSSEC key (if given) */
+ if (keynamestr != NULL) {
+ if (keystr == NULL) {
+ fprintf(stderr,
+ "key string is missing "
+ "while key name is provided\n");
+ exit(1);
+ }
+ set_key(client, keynamestr, keystr, is_sep, &keymctx);
+ }
+
+ /* Construct qname */
+ namelen = strlen(argv[1]);
+ isc_buffer_init(&b, argv[1], namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&qname0);
+ qname = dns_fixedname_name(&qname0);
+ result = dns_name_fromtext(qname, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ fprintf(stderr, "failed to convert qname: %d\n", result);
+
+ /* Perform resolution */
+ resopt = 0;
+ if (keynamestr == NULL)
+ resopt |= DNS_CLIENTRESOPT_NODNSSEC;
+ ISC_LIST_INIT(namelist);
+ result = dns_client_resolve(client, qname, dns_rdataclass_in, type,
+ resopt, &namelist);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr,
+ "resolution failed: %s\n", dns_result_totext(result));
+ }
+ for (name = ISC_LIST_HEAD(namelist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (printdata(rdataset, name) != ISC_R_SUCCESS)
+ fprintf(stderr, "print data failed\n");
+ }
+ }
+
+ dns_client_freeresanswer(client, &namelist);
+
+ /* Cleanup */
+ dns_client_destroy(&client);
+ if (keynamestr != NULL)
+ isc_mem_destroy(&keymctx);
+ dns_lib_shutdown();
+
+ exit(0);
+}
diff --git a/contrib/bind9/lib/irs/Makefile.in b/contrib/bind9/lib/irs/Makefile.in
new file mode 100644
index 0000000..3f9bfb3
--- /dev/null
+++ b/contrib/bind9/lib/irs/Makefile.in
@@ -0,0 +1,80 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+@BIND9_VERSION@
+
+@LIBIRS_API@
+
+@BIND9_MAKE_INCLUDES@
+
+CINCLUDES = -I. -I./include -I${srcdir}/include \
+ ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES}
+
+CDEFINES =
+CWARNINGS =
+
+# Alphabetically
+OBJS = context.@O@ \
+ dnsconf.@O@ \
+ gai_strerror.@O@ getaddrinfo.@O@ getnameinfo.@O@ \
+ resconf.@O@
+
+# Alphabetically
+SRCS = context.c \
+ dnsconf.c \
+ gai_sterror.c getaddrinfo.c getnameinfo.c \
+ resconf.c
+
+LIBS = @LIBS@
+
+SUBDIRS = include
+TARGETS = timestamp
+
+@BIND9_MAKE_RULES@
+
+version.@O@: version.c
+ ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \
+ -DVERSION=\"${VERSION}\" \
+ -DLIBINTERFACE=${LIBINTERFACE} \
+ -DLIBREVISION=${LIBREVISION} \
+ -DLIBAGE=${LIBAGE} \
+ -c ${srcdir}/version.c
+
+libirs.@SA@: ${OBJS} version.@O@
+ ${AR} ${ARFLAGS} $@ ${OBJS} version.@O@
+ ${RANLIB} $@
+
+libirs.la: ${OBJS} version.@O@
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libirs.la -rpath ${libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} version.@O@ ${LIBS}
+
+timestamp: libirs.@A@
+ touch timestamp
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir}
+
+install:: timestamp installdirs
+ ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libirs.@A@ ${DESTDIR}${libdir}
+
+clean distclean::
+ rm -f libirs.@A@ libirs.la timestamp
diff --git a/contrib/bind9/lib/irs/api b/contrib/bind9/lib/irs/api
new file mode 100644
index 0000000..94575eb
--- /dev/null
+++ b/contrib/bind9/lib/irs/api
@@ -0,0 +1,3 @@
+LIBINTERFACE = 80
+LIBREVISION = 0
+LIBAGE = 0
diff --git a/contrib/bind9/lib/irs/context.c b/contrib/bind9/lib/irs/context.c
new file mode 100644
index 0000000..0c6d856
--- /dev/null
+++ b/contrib/bind9/lib/irs/context.c
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: context.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <isc/app.h>
+#include <isc/lib.h>
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/once.h>
+#include <isc/socket.h>
+#include <isc/task.h>
+#include <isc/thread.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/lib.h>
+
+#include <irs/context.h>
+#include <irs/dnsconf.h>
+#include <irs/resconf.h>
+
+#define IRS_CONTEXT_MAGIC ISC_MAGIC('I', 'R', 'S', 'c')
+#define IRS_CONTEXT_VALID(c) ISC_MAGIC_VALID(c, IRS_CONTEXT_MAGIC)
+
+#ifndef RESOLV_CONF
+/*% location of resolve.conf */
+#define RESOLV_CONF "/etc/resolv.conf"
+#endif
+
+#ifndef DNS_CONF
+/*% location of dns.conf */
+#define DNS_CONF "/etc/dns.conf"
+#endif
+
+#ifndef ISC_PLATFORM_USETHREADS
+irs_context_t *irs_g_context = NULL;
+#else
+static isc_boolean_t thread_key_initialized = ISC_FALSE;
+static isc_mutex_t thread_key_mutex;
+static isc_thread_key_t irs_context_key;
+static isc_once_t once = ISC_ONCE_INIT;
+#endif
+
+
+struct irs_context {
+ /*
+ * An IRS context is a thread-specific object, and does not need to
+ * be locked.
+ */
+ unsigned int magic;
+ isc_mem_t *mctx;
+ isc_appctx_t *actx;
+ isc_taskmgr_t *taskmgr;
+ isc_task_t *task;
+ isc_socketmgr_t *socketmgr;
+ isc_timermgr_t *timermgr;
+ dns_client_t *dnsclient;
+ irs_resconf_t *resconf;
+ irs_dnsconf_t *dnsconf;
+};
+
+static void
+ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ if (taskmgrp != NULL)
+ isc_taskmgr_destroy(taskmgrp);
+
+ if (timermgrp != NULL)
+ isc_timermgr_destroy(timermgrp);
+
+ if (socketmgrp != NULL)
+ isc_socketmgr_destroy(socketmgrp);
+
+ if (actxp != NULL)
+ isc_appctx_destroy(actxp);
+
+ if (mctxp != NULL)
+ isc_mem_destroy(mctxp);
+}
+
+static isc_result_t
+ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
+ isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
+ isc_timermgr_t **timermgrp)
+{
+ isc_result_t result;
+
+ result = isc_mem_create(0, 0, mctxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_appctx_create(*mctxp, actxp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
+
+ return (result);
+}
+
+#ifdef ISC_PLATFORM_USETHREADS
+static void
+free_specific_context(void *arg) {
+ irs_context_t *context = arg;
+
+ irs_context_destroy(&context);
+
+ isc_thread_key_setspecific(irs_context_key, NULL);
+}
+
+static void
+thread_key_mutex_init(void) {
+ RUNTIME_CHECK(isc_mutex_init(&thread_key_mutex) == ISC_R_SUCCESS);
+}
+
+static isc_result_t
+thread_key_init() {
+ isc_result_t result;
+
+ result = isc_once_do(&once, thread_key_mutex_init);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (!thread_key_initialized) {
+ LOCK(&thread_key_mutex);
+
+ if (!thread_key_initialized &&
+ isc_thread_key_create(&irs_context_key,
+ free_specific_context) != 0) {
+ result = ISC_R_FAILURE;
+ } else
+ thread_key_initialized = ISC_TRUE;
+
+ UNLOCK(&thread_key_mutex);
+ }
+
+ return (result);
+}
+#endif /* ISC_PLATFORM_USETHREADS */
+
+isc_result_t
+irs_context_get(irs_context_t **contextp) {
+ irs_context_t *context;
+ isc_result_t result;
+
+ REQUIRE(contextp != NULL && *contextp == NULL);
+
+#ifndef ISC_PLATFORM_USETHREADS
+ if (irs_g_context == NULL) {
+ result = irs_context_create(&irs_g_context);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ }
+
+ context = irs_g_context;
+#else
+ result = thread_key_init();
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ context = isc_thread_key_getspecific(irs_context_key);
+ if (context == NULL) {
+ result = irs_context_create(&context);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_thread_key_setspecific(irs_context_key, context);
+ if (result != ISC_R_SUCCESS) {
+ irs_context_destroy(&context);
+ return (result);
+ }
+ }
+#endif /* ISC_PLATFORM_USETHREADS */
+
+ *contextp = context;
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+irs_context_create(irs_context_t **contextp) {
+ isc_result_t result;
+ irs_context_t *context;
+ isc_appctx_t *actx = NULL;
+ isc_mem_t *mctx = NULL;
+ isc_taskmgr_t *taskmgr = NULL;
+ isc_socketmgr_t *socketmgr = NULL;
+ isc_timermgr_t *timermgr = NULL;
+ dns_client_t *client = NULL;
+ isc_sockaddrlist_t *nameservers;
+ irs_dnsconf_dnskeylist_t *trustedkeys;
+ irs_dnsconf_dnskey_t *trustedkey;
+
+ isc_lib_register();
+ result = dns_lib_init();
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ result = isc_app_ctxstart(actx);
+ if (result != ISC_R_SUCCESS) {
+ ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+ return (result);
+ }
+
+ context = isc_mem_get(mctx, sizeof(*context));
+ if (context == NULL) {
+ ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
+ return (ISC_R_NOMEMORY);
+ }
+
+ context->mctx = mctx;
+ context->actx = actx;
+ context->taskmgr = taskmgr;
+ context->socketmgr = socketmgr;
+ context->timermgr = timermgr;
+ context->resconf = NULL;
+ context->dnsconf = NULL;
+ context->task = NULL;
+ result = isc_task_create(taskmgr, 0, &context->task);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ /* Create a DNS client object */
+ result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr,
+ 0, &client);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ context->dnsclient = client;
+
+ /* Read resolver configuration file */
+ result = irs_resconf_load(mctx, RESOLV_CONF, &context->resconf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ /* Set nameservers */
+ nameservers = irs_resconf_getnameservers(context->resconf);
+ result = dns_client_setservers(client, dns_rdataclass_in, NULL,
+ nameservers);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+
+ /* Read advanced DNS configuration (if any) */
+ result = irs_dnsconf_load(mctx, DNS_CONF, &context->dnsconf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ trustedkeys = irs_dnsconf_gettrustedkeys(context->dnsconf);
+ for (trustedkey = ISC_LIST_HEAD(*trustedkeys);
+ trustedkey != NULL;
+ trustedkey = ISC_LIST_NEXT(trustedkey, link)) {
+ result = dns_client_addtrustedkey(client, dns_rdataclass_in,
+ trustedkey->keyname,
+ trustedkey->keydatabuf);
+ if (result != ISC_R_SUCCESS)
+ goto fail;
+ }
+
+ context->magic = IRS_CONTEXT_MAGIC;
+ *contextp = context;
+
+ return (ISC_R_SUCCESS);
+
+ fail:
+ if (context->task != NULL)
+ isc_task_detach(&context->task);
+ if (context->resconf != NULL)
+ irs_resconf_destroy(&context->resconf);
+ if (context->dnsconf != NULL)
+ irs_dnsconf_destroy(&context->dnsconf);
+ if (client != NULL)
+ dns_client_destroy(&client);
+ ctxs_destroy(NULL, &actx, &taskmgr, &socketmgr, &timermgr);
+ isc_mem_putanddetach(&mctx, context, sizeof(*context));
+
+ return (result);
+}
+
+void
+irs_context_destroy(irs_context_t **contextp) {
+ irs_context_t *context;
+
+ REQUIRE(contextp != NULL);
+ context = *contextp;
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ isc_task_detach(&context->task);
+ irs_dnsconf_destroy(&context->dnsconf);
+ irs_resconf_destroy(&context->resconf);
+ dns_client_destroy(&context->dnsclient);
+
+ ctxs_destroy(NULL, &context->actx, &context->taskmgr,
+ &context->socketmgr, &context->timermgr);
+
+ context->magic = 0;
+
+ isc_mem_putanddetach(&context->mctx, context, sizeof(*context));
+
+ *contextp = NULL;
+
+#ifndef ISC_PLATFORM_USETHREADS
+ irs_g_context = NULL;
+#else
+ (void)isc_thread_key_setspecific(irs_context_key, NULL);
+#endif
+}
+
+isc_mem_t *
+irs_context_getmctx(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->mctx);
+}
+
+isc_appctx_t *
+irs_context_getappctx(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->actx);
+}
+
+isc_taskmgr_t *
+irs_context_gettaskmgr(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->taskmgr);
+}
+
+isc_timermgr_t *
+irs_context_gettimermgr(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->timermgr);
+}
+
+isc_task_t *
+irs_context_gettask(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->task);
+}
+
+dns_client_t *
+irs_context_getdnsclient(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->dnsclient);
+}
+
+irs_resconf_t *
+irs_context_getresconf(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->resconf);
+}
+
+irs_dnsconf_t *
+irs_context_getdnsconf(irs_context_t *context) {
+ REQUIRE(IRS_CONTEXT_VALID(context));
+
+ return (context->dnsconf);
+}
diff --git a/contrib/bind9/lib/irs/dnsconf.c b/contrib/bind9/lib/irs/dnsconf.c
new file mode 100644
index 0000000..8464d6d
--- /dev/null
+++ b/contrib/bind9/lib/irs/dnsconf.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <isc/base64.h>
+#include <isc/buffer.h>
+#include <isc/file.h>
+#include <isc/mem.h>
+#include <isc/util.h>
+
+#include <isccfg/dnsconf.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdatastruct.h>
+
+#include <irs/dnsconf.h>
+
+#define IRS_DNSCONF_MAGIC ISC_MAGIC('D', 'c', 'f', 'g')
+#define IRS_DNSCONF_VALID(c) ISC_MAGIC_VALID(c, IRS_DNSCONF_MAGIC)
+
+/*!
+ * configuration data structure
+ */
+
+struct irs_dnsconf {
+ unsigned int magic;
+ isc_mem_t *mctx;
+ irs_dnsconf_dnskeylist_t trusted_keylist;
+};
+
+static isc_result_t
+configure_dnsseckeys(irs_dnsconf_t *conf, cfg_obj_t *cfgobj,
+ dns_rdataclass_t rdclass)
+{
+ isc_mem_t *mctx = conf->mctx;
+ const cfg_obj_t *keys = NULL;
+ const cfg_obj_t *key, *keylist;
+ dns_fixedname_t fkeyname;
+ dns_name_t *keyname_base, *keyname;
+ const cfg_listelt_t *element, *element2;
+ isc_result_t result;
+ isc_uint32_t flags, proto, alg;
+ const char *keystr, *keynamestr;
+ unsigned char keydata[4096];
+ isc_buffer_t keydatabuf_base, *keydatabuf;
+ dns_rdata_dnskey_t keystruct;
+ unsigned char rrdata[4096];
+ isc_buffer_t rrdatabuf;
+ isc_region_t r;
+ isc_buffer_t namebuf;
+ irs_dnsconf_dnskey_t *keyent;
+
+ cfg_map_get(cfgobj, "trusted-keys", &keys);
+ if (keys == NULL)
+ return (ISC_R_SUCCESS);
+
+ for (element = cfg_list_first(keys);
+ element != NULL;
+ element = cfg_list_next(element)) {
+ keylist = cfg_listelt_value(element);
+ for (element2 = cfg_list_first(keylist);
+ element2 != NULL;
+ element2 = cfg_list_next(element2))
+ {
+ keydatabuf = NULL;
+ keyname = NULL;
+
+ key = cfg_listelt_value(element2);
+
+ flags = cfg_obj_asuint32(cfg_tuple_get(key, "flags"));
+ proto = cfg_obj_asuint32(cfg_tuple_get(key,
+ "protocol"));
+ alg = cfg_obj_asuint32(cfg_tuple_get(key,
+ "algorithm"));
+ keynamestr = cfg_obj_asstring(cfg_tuple_get(key,
+ "name"));
+
+ keystruct.common.rdclass = rdclass;
+ keystruct.common.rdtype = dns_rdatatype_dnskey;
+ keystruct.mctx = NULL;
+ ISC_LINK_INIT(&keystruct.common, link);
+
+ if (flags > 0xffff)
+ return (ISC_R_RANGE);
+ if (proto > 0xff)
+ return (ISC_R_RANGE);
+ if (alg > 0xff)
+ return (ISC_R_RANGE);
+ keystruct.flags = (isc_uint16_t)flags;
+ keystruct.protocol = (isc_uint8_t)proto;
+ keystruct.algorithm = (isc_uint8_t)alg;
+
+ isc_buffer_init(&keydatabuf_base, keydata,
+ sizeof(keydata));
+ isc_buffer_init(&rrdatabuf, rrdata, sizeof(rrdata));
+
+ /* Configure key value */
+ keystr = cfg_obj_asstring(cfg_tuple_get(key, "key"));
+ result = isc_base64_decodestring(keystr,
+ &keydatabuf_base);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&keydatabuf_base, &r);
+ keystruct.datalen = r.length;
+ keystruct.data = r.base;
+
+ result = dns_rdata_fromstruct(NULL,
+ keystruct.common.rdclass,
+ keystruct.common.rdtype,
+ &keystruct, &rrdatabuf);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ isc_buffer_usedregion(&rrdatabuf, &r);
+ result = isc_buffer_allocate(mctx, &keydatabuf,
+ r.length);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ result = isc_buffer_copyregion(keydatabuf, &r);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Configure key name */
+ dns_fixedname_init(&fkeyname);
+ keyname_base = dns_fixedname_name(&fkeyname);
+ isc_buffer_init(&namebuf, keynamestr,
+ strlen(keynamestr));
+ isc_buffer_add(&namebuf, strlen(keynamestr));
+ result = dns_name_fromtext(keyname_base, &namebuf,
+ dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ keyname = isc_mem_get(mctx, sizeof(*keyname));
+ if (keyname == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ dns_name_init(keyname, NULL);
+ result = dns_name_dup(keyname_base, mctx, keyname);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ /* Add the key data to the list */
+ keyent = isc_mem_get(mctx, sizeof(*keyent));
+ if (keyent == NULL) {
+ dns_name_free(keyname, mctx);
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ keyent->keyname = keyname;
+ keyent->keydatabuf = keydatabuf;
+
+ ISC_LIST_APPEND(conf->trusted_keylist, keyent, link);
+ }
+ }
+
+ return (ISC_R_SUCCESS);
+
+ cleanup:
+ if (keydatabuf != NULL)
+ isc_buffer_free(&keydatabuf);
+ if (keyname != NULL)
+ isc_mem_put(mctx, keyname, sizeof(*keyname));
+
+ return (result);
+}
+
+isc_result_t
+irs_dnsconf_load(isc_mem_t *mctx, const char *filename, irs_dnsconf_t **confp)
+{
+ irs_dnsconf_t *conf;
+ cfg_parser_t *parser = NULL;
+ cfg_obj_t *cfgobj = NULL;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ REQUIRE(confp != NULL && *confp == NULL);
+
+ conf = isc_mem_get(mctx, sizeof(*conf));
+ if (conf == NULL)
+ return (ISC_R_NOMEMORY);
+
+ conf->mctx = mctx;
+ ISC_LIST_INIT(conf->trusted_keylist);
+
+ /*
+ * If the specified file does not exist, we'll simply with an empty
+ * configuration.
+ */
+ if (!isc_file_exists(filename))
+ goto cleanup;
+
+ result = cfg_parser_create(mctx, NULL, &parser);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = cfg_parse_file(parser, filename, &cfg_type_dnsconf,
+ &cfgobj);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup;
+
+ result = configure_dnsseckeys(conf, cfgobj, dns_rdataclass_in);
+
+ cleanup:
+ if (parser != NULL) {
+ if (cfgobj != NULL)
+ cfg_obj_destroy(parser, &cfgobj);
+ cfg_parser_destroy(&parser);
+ }
+
+ conf->magic = IRS_DNSCONF_MAGIC;
+
+ if (result == ISC_R_SUCCESS)
+ *confp = conf;
+ else
+ irs_dnsconf_destroy(&conf);
+
+ return (result);
+}
+
+void
+irs_dnsconf_destroy(irs_dnsconf_t **confp) {
+ irs_dnsconf_t *conf;
+ irs_dnsconf_dnskey_t *keyent;
+
+ REQUIRE(confp != NULL);
+ conf = *confp;
+ REQUIRE(IRS_DNSCONF_VALID(conf));
+
+ while ((keyent = ISC_LIST_HEAD(conf->trusted_keylist)) != NULL) {
+ ISC_LIST_UNLINK(conf->trusted_keylist, keyent, link);
+
+ isc_buffer_free(&keyent->keydatabuf);
+ dns_name_free(keyent->keyname, conf->mctx);
+ isc_mem_put(conf->mctx, keyent->keyname, sizeof(dns_name_t));
+ isc_mem_put(conf->mctx, keyent, sizeof(*keyent));
+ }
+
+ isc_mem_put(conf->mctx, conf, sizeof(*conf));
+
+ *confp = NULL;
+}
+
+irs_dnsconf_dnskeylist_t *
+irs_dnsconf_gettrustedkeys(irs_dnsconf_t *conf) {
+ REQUIRE(IRS_DNSCONF_VALID(conf));
+
+ return (&conf->trusted_keylist);
+}
diff --git a/contrib/bind9/lib/irs/gai_strerror.c b/contrib/bind9/lib/irs/gai_strerror.c
new file mode 100644
index 0000000..aa021ef
--- /dev/null
+++ b/contrib/bind9/lib/irs/gai_strerror.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: gai_strerror.c,v 1.5 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file gai_strerror.c
+ * gai_strerror() returns an error message corresponding to an
+ * error code returned by getaddrinfo() and getnameinfo(). The following error
+ * codes and their meaning are defined in
+ * \link netdb.h include/irs/netdb.h.\endlink
+ * This implementation is almost an exact copy of lwres/gai_sterror.c except
+ * that it catches up the latest API standard, RFC3493.
+ *
+ * \li #EAI_ADDRFAMILY address family for hostname not supported
+ * \li #EAI_AGAIN temporary failure in name resolution
+ * \li #EAI_BADFLAGS invalid value for ai_flags
+ * \li #EAI_FAIL non-recoverable failure in name resolution
+ * \li #EAI_FAMILY ai_family not supported
+ * \li #EAI_MEMORY memory allocation failure
+ * \li #EAI_NODATA no address associated with hostname (obsoleted in RFC3493)
+ * \li #EAI_NONAME hostname nor servname provided, or not known
+ * \li #EAI_SERVICE servname not supported for ai_socktype
+ * \li #EAI_SOCKTYPE ai_socktype not supported
+ * \li #EAI_SYSTEM system error returned in errno
+ * \li #EAI_BADHINTS Invalid value for hints (non-standard)
+ * \li #EAI_PROTOCOL Resolved protocol is unknown (non-standard)
+ * \li #EAI_OVERFLOW Argument buffer overflow
+ * \li #EAI_INSECUREDATA Insecure Data (experimental)
+ *
+ * The message invalid error code is returned if ecode is out of range.
+ *
+ * ai_flags, ai_family and ai_socktype are elements of the struct
+ * addrinfo used by lwres_getaddrinfo().
+ *
+ * \section gai_strerror_see See Also
+ *
+ * strerror(), getaddrinfo(), getnameinfo(), RFC3493.
+ */
+#include <config.h>
+
+#include <irs/netdb.h>
+
+/*% Text of error messages. */
+static const char *gai_messages[] = {
+ "no error",
+ "address family for hostname not supported",
+ "temporary failure in name resolution",
+ "invalid value for ai_flags",
+ "non-recoverable failure in name resolution",
+ "ai_family not supported",
+ "memory allocation failure",
+ "no address associated with hostname",
+ "hostname nor servname provided, or not known",
+ "servname not supported for ai_socktype",
+ "ai_socktype not supported",
+ "system error returned in errno",
+ "bad hints",
+ "bad protocol",
+ "argument buffer overflow",
+ "insecure data provided"
+};
+
+/*%
+ * Returns an error message corresponding to an error code returned by
+ * getaddrinfo() and getnameinfo()
+ */
+IRS_GAISTRERROR_RETURN_T
+gai_strerror(int ecode) {
+ union {
+ const char *const_ptr;
+ char *deconst_ptr;
+ } ptr;
+
+ if ((ecode < 0) ||
+ (ecode >= (int)(sizeof(gai_messages)/sizeof(*gai_messages))))
+ ptr.const_ptr = "invalid error code";
+ else
+ ptr.const_ptr = gai_messages[ecode];
+ return (ptr.deconst_ptr);
+}
diff --git a/contrib/bind9/lib/irs/getaddrinfo.c b/contrib/bind9/lib/irs/getaddrinfo.c
new file mode 100644
index 0000000..e7075da
--- /dev/null
+++ b/contrib/bind9/lib/irs/getaddrinfo.c
@@ -0,0 +1,1295 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: getaddrinfo.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+/**
+ * getaddrinfo() is used to get a list of IP addresses and port
+ * numbers for host hostname and service servname as defined in RFC3493.
+ * hostname and servname are pointers to null-terminated strings
+ * or NULL. hostname is either a host name or a numeric host address
+ * string: a dotted decimal IPv4 address or an IPv6 address. servname is
+ * either a decimal port number or a service name as listed in
+ * /etc/services.
+ *
+ * If the operating system does not provide a struct addrinfo, the
+ * following structure is used:
+ *
+ * \code
+ * struct addrinfo {
+ * int ai_flags; // AI_PASSIVE, AI_CANONNAME
+ * int ai_family; // PF_xxx
+ * int ai_socktype; // SOCK_xxx
+ * int ai_protocol; // 0 or IPPROTO_xxx for IPv4 and IPv6
+ * size_t ai_addrlen; // length of ai_addr
+ * char *ai_canonname; // canonical name for hostname
+ * struct sockaddr *ai_addr; // binary address
+ * struct addrinfo *ai_next; // next structure in linked list
+ * };
+ * \endcode
+ *
+ *
+ * hints is an optional pointer to a struct addrinfo. This structure can
+ * be used to provide hints concerning the type of socket that the caller
+ * supports or wishes to use. The caller can supply the following
+ * structure elements in *hints:
+ *
+ * <ul>
+ * <li>ai_family:
+ * The protocol family that should be used. When ai_family is set
+ * to PF_UNSPEC, it means the caller will accept any protocol
+ * family supported by the operating system.</li>
+ *
+ * <li>ai_socktype:
+ * denotes the type of socket -- SOCK_STREAM, SOCK_DGRAM or
+ * SOCK_RAW -- that is wanted. When ai_socktype is zero the caller
+ * will accept any socket type.</li>
+ *
+ * <li>ai_protocol:
+ * indicates which transport protocol is wanted: IPPROTO_UDP or
+ * IPPROTO_TCP. If ai_protocol is zero the caller will accept any
+ * protocol.</li>
+ *
+ * <li>ai_flags:
+ * Flag bits. If the AI_CANONNAME bit is set, a successful call to
+ * getaddrinfo() will return a null-terminated string
+ * containing the canonical name of the specified hostname in
+ * ai_canonname of the first addrinfo structure returned. Setting
+ * the AI_PASSIVE bit indicates that the returned socket address
+ * structure is intended for used in a call to bind(2). In this
+ * case, if the hostname argument is a NULL pointer, then the IP
+ * address portion of the socket address structure will be set to
+ * INADDR_ANY for an IPv4 address or IN6ADDR_ANY_INIT for an IPv6
+ * address.<br /><br />
+ *
+ * When ai_flags does not set the AI_PASSIVE bit, the returned
+ * socket address structure will be ready for use in a call to
+ * connect(2) for a connection-oriented protocol or connect(2),
+ * sendto(2), or sendmsg(2) if a connectionless protocol was
+ * chosen. The IP address portion of the socket address structure
+ * will be set to the loopback address if hostname is a NULL
+ * pointer and AI_PASSIVE is not set in ai_flags.<br /><br />
+ *
+ * If ai_flags is set to AI_NUMERICHOST it indicates that hostname
+ * should be treated as a numeric string defining an IPv4 or IPv6
+ * address and no name resolution should be attempted.
+ * </li></ul>
+ *
+ * All other elements of the struct addrinfo passed via hints must be
+ * zero.
+ *
+ * A hints of NULL is treated as if the caller provided a struct addrinfo
+ * initialized to zero with ai_familyset to PF_UNSPEC.
+ *
+ * After a successful call to getaddrinfo(), *res is a pointer to a
+ * linked list of one or more addrinfo structures. Each struct addrinfo
+ * in this list cn be processed by following the ai_next pointer, until a
+ * NULL pointer is encountered. The three members ai_family, ai_socktype,
+ * and ai_protocol in each returned addrinfo structure contain the
+ * corresponding arguments for a call to socket(2). For each addrinfo
+ * structure in the list, the ai_addr member points to a filled-in socket
+ * address structure of length ai_addrlen.
+ *
+ * All of the information returned by getaddrinfo() is dynamically
+ * allocated: the addrinfo structures, and the socket address structures
+ * and canonical host name strings pointed to by the addrinfostructures.
+ * Memory allocated for the dynamically allocated structures created by a
+ * successful call to getaddrinfo() is released by freeaddrinfo().
+ * ai is a pointer to a struct addrinfo created by a call to getaddrinfo().
+ *
+ * \section irsreturn RETURN VALUES
+ *
+ * getaddrinfo() returns zero on success or one of the error codes
+ * listed in gai_strerror() if an error occurs. If both hostname and
+ * servname are NULL getaddrinfo() returns #EAI_NONAME.
+ *
+ * \section irssee SEE ALSO
+ *
+ * getaddrinfo(), freeaddrinfo(),
+ * gai_strerror(), RFC3493, getservbyname(3), connect(2),
+ * sendto(2), sendmsg(2), socket(2).
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <isc/app.h>
+#include <isc/buffer.h>
+#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#include <irs/context.h>
+#include <irs/netdb.h>
+#include <irs/resconf.h>
+
+#define SA(addr) ((struct sockaddr *)(addr))
+#define SIN(addr) ((struct sockaddr_in *)(addr))
+#define SIN6(addr) ((struct sockaddr_in6 *)(addr))
+#define SLOCAL(addr) ((struct sockaddr_un *)(addr))
+
+/*! \struct addrinfo
+ */
+static struct addrinfo
+ *ai_concat(struct addrinfo *ai1, struct addrinfo *ai2),
+ *ai_reverse(struct addrinfo *oai),
+ *ai_clone(struct addrinfo *oai, int family),
+ *ai_alloc(int family, int addrlen);
+#ifdef AF_LOCAL
+static int get_local(const char *name, int socktype, struct addrinfo **res);
+#endif
+
+static int
+resolve_name(int family, const char *hostname, int flags,
+ struct addrinfo **aip, int socktype, int port);
+
+static int add_ipv4(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port);
+static int add_ipv6(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port);
+static void set_order(int, int (**)(const char *, int, struct addrinfo **,
+ int, int));
+
+#define FOUND_IPV4 0x1
+#define FOUND_IPV6 0x2
+#define FOUND_MAX 2
+
+#define ISC_AI_MASK (AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST)
+/*%
+ * Get a list of IP addresses and port numbers for host hostname and
+ * service servname.
+ */
+int
+getaddrinfo(const char *hostname, const char *servname,
+ const struct addrinfo *hints, struct addrinfo **res)
+{
+ struct servent *sp;
+ const char *proto;
+ int family, socktype, flags, protocol;
+ struct addrinfo *ai, *ai_list;
+ int err = 0;
+ int port, i;
+ int (*net_order[FOUND_MAX+1])(const char *, int, struct addrinfo **,
+ int, int);
+
+ if (hostname == NULL && servname == NULL)
+ return (EAI_NONAME);
+
+ proto = NULL;
+ if (hints != NULL) {
+ if ((hints->ai_flags & ~(ISC_AI_MASK)) != 0)
+ return (EAI_BADFLAGS);
+ if (hints->ai_addrlen || hints->ai_canonname ||
+ hints->ai_addr || hints->ai_next) {
+ errno = EINVAL;
+ return (EAI_SYSTEM);
+ }
+ family = hints->ai_family;
+ socktype = hints->ai_socktype;
+ protocol = hints->ai_protocol;
+ flags = hints->ai_flags;
+ switch (family) {
+ case AF_UNSPEC:
+ switch (hints->ai_socktype) {
+ case SOCK_STREAM:
+ proto = "tcp";
+ break;
+ case SOCK_DGRAM:
+ proto = "udp";
+ break;
+ }
+ break;
+ case AF_INET:
+ case AF_INET6:
+ switch (hints->ai_socktype) {
+ case 0:
+ break;
+ case SOCK_STREAM:
+ proto = "tcp";
+ break;
+ case SOCK_DGRAM:
+ proto = "udp";
+ break;
+ case SOCK_RAW:
+ break;
+ default:
+ return (EAI_SOCKTYPE);
+ }
+ break;
+#ifdef AF_LOCAL
+ case AF_LOCAL:
+ switch (hints->ai_socktype) {
+ case 0:
+ break;
+ case SOCK_STREAM:
+ break;
+ case SOCK_DGRAM:
+ break;
+ default:
+ return (EAI_SOCKTYPE);
+ }
+ break;
+#endif
+ default:
+ return (EAI_FAMILY);
+ }
+ } else {
+ protocol = 0;
+ family = 0;
+ socktype = 0;
+ flags = 0;
+ }
+
+#ifdef AF_LOCAL
+ /*!
+ * First, deal with AF_LOCAL. If the family was not set,
+ * then assume AF_LOCAL if the first character of the
+ * hostname/servname is '/'.
+ */
+
+ if (hostname != NULL &&
+ (family == AF_LOCAL || (family == 0 && *hostname == '/')))
+ return (get_local(hostname, socktype, res));
+
+ if (servname != NULL &&
+ (family == AF_LOCAL || (family == 0 && *servname == '/')))
+ return (get_local(servname, socktype, res));
+#endif
+
+ /*
+ * Ok, only AF_INET and AF_INET6 left.
+ */
+ ai_list = NULL;
+
+ /*
+ * First, look up the service name (port) if it was
+ * requested. If the socket type wasn't specified, then
+ * try and figure it out.
+ */
+ if (servname != NULL) {
+ char *e;
+
+ port = strtol(servname, &e, 10);
+ if (*e == '\0') {
+ if (socktype == 0)
+ return (EAI_SOCKTYPE);
+ if (port < 0 || port > 65535)
+ return (EAI_SERVICE);
+ port = htons((unsigned short) port);
+ } else {
+ sp = getservbyname(servname, proto);
+ if (sp == NULL)
+ return (EAI_SERVICE);
+ port = sp->s_port;
+ if (socktype == 0) {
+ if (strcmp(sp->s_proto, "tcp") == 0)
+ socktype = SOCK_STREAM;
+ else if (strcmp(sp->s_proto, "udp") == 0)
+ socktype = SOCK_DGRAM;
+ }
+ }
+ } else
+ port = 0;
+
+ /*
+ * Next, deal with just a service name, and no hostname.
+ * (we verified that one of them was non-null up above).
+ */
+ if (hostname == NULL && (flags & AI_PASSIVE) != 0) {
+ if (family == AF_INET || family == 0) {
+ ai = ai_alloc(AF_INET, sizeof(struct sockaddr_in));
+ if (ai == NULL)
+ return (EAI_MEMORY);
+ ai->ai_socktype = socktype;
+ ai->ai_protocol = protocol;
+ SIN(ai->ai_addr)->sin_port = port;
+ ai->ai_next = ai_list;
+ ai_list = ai;
+ }
+
+ if (family == AF_INET6 || family == 0) {
+ ai = ai_alloc(AF_INET6, sizeof(struct sockaddr_in6));
+ if (ai == NULL) {
+ freeaddrinfo(ai_list);
+ return (EAI_MEMORY);
+ }
+ ai->ai_socktype = socktype;
+ ai->ai_protocol = protocol;
+ SIN6(ai->ai_addr)->sin6_port = port;
+ ai->ai_next = ai_list;
+ ai_list = ai;
+ }
+
+ *res = ai_list;
+ return (0);
+ }
+
+ /*
+ * If the family isn't specified or AI_NUMERICHOST specified, check
+ * first to see if it is a numeric address.
+ * Though the gethostbyname2() routine will recognize numeric addresses,
+ * it will only recognize the format that it is being called for. Thus,
+ * a numeric AF_INET address will be treated by the AF_INET6 call as
+ * a domain name, and vice versa. Checking for both numerics here
+ * avoids that.
+ */
+ if (hostname != NULL &&
+ (family == 0 || (flags & AI_NUMERICHOST) != 0)) {
+ char abuf[sizeof(struct in6_addr)];
+ char nbuf[NI_MAXHOST];
+ int addrsize, addroff;
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ char *p, *ep;
+ char ntmp[NI_MAXHOST];
+ isc_uint32_t scopeid;
+#endif
+
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ /*
+ * Scope identifier portion.
+ */
+ ntmp[0] = '\0';
+ if (strchr(hostname, '%') != NULL) {
+ strncpy(ntmp, hostname, sizeof(ntmp) - 1);
+ ntmp[sizeof(ntmp) - 1] = '\0';
+ p = strchr(ntmp, '%');
+ ep = NULL;
+
+ /*
+ * Vendors may want to support non-numeric
+ * scopeid around here.
+ */
+
+ if (p != NULL)
+ scopeid = (isc_uint32_t)strtoul(p + 1,
+ &ep, 10);
+ if (p != NULL && ep != NULL && ep[0] == '\0')
+ *p = '\0';
+ else {
+ ntmp[0] = '\0';
+ scopeid = 0;
+ }
+ } else
+ scopeid = 0;
+#endif
+
+ if (inet_pton(AF_INET, hostname, (struct in_addr *)abuf)
+ == 1) {
+ if (family == AF_INET6) {
+ /*
+ * Convert to a V4 mapped address.
+ */
+ struct in6_addr *a6 = (struct in6_addr *)abuf;
+ memcpy(&a6->s6_addr[12], &a6->s6_addr[0], 4);
+ memset(&a6->s6_addr[10], 0xff, 2);
+ memset(&a6->s6_addr[0], 0, 10);
+ goto inet6_addr;
+ }
+ addrsize = sizeof(struct in_addr);
+ addroff = (char *)(&SIN(0)->sin_addr) - (char *)0;
+ family = AF_INET;
+ goto common;
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ } else if (ntmp[0] != '\0' &&
+ inet_pton(AF_INET6, ntmp, abuf) == 1) {
+ if (family && family != AF_INET6)
+ return (EAI_NONAME);
+ addrsize = sizeof(struct in6_addr);
+ addroff = (char *)(&SIN6(0)->sin6_addr) - (char *)0;
+ family = AF_INET6;
+ goto common;
+#endif
+ } else if (inet_pton(AF_INET6, hostname, abuf) == 1) {
+ if (family != 0 && family != AF_INET6)
+ return (EAI_NONAME);
+ inet6_addr:
+ addrsize = sizeof(struct in6_addr);
+ addroff = (char *)(&SIN6(0)->sin6_addr) - (char *)0;
+ family = AF_INET6;
+
+ common:
+ ai = ai_alloc(family,
+ ((family == AF_INET6) ?
+ sizeof(struct sockaddr_in6) :
+ sizeof(struct sockaddr_in)));
+ if (ai == NULL)
+ return (EAI_MEMORY);
+ ai_list = ai;
+ ai->ai_socktype = socktype;
+ SIN(ai->ai_addr)->sin_port = port;
+ memcpy((char *)ai->ai_addr + addroff, abuf, addrsize);
+ if ((flags & AI_CANONNAME) != 0) {
+#ifdef IRS_HAVE_SIN6_SCOPE_ID
+ if (ai->ai_family == AF_INET6)
+ SIN6(ai->ai_addr)->sin6_scope_id =
+ scopeid;
+#endif
+ if (getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ nbuf, sizeof(nbuf), NULL, 0,
+ NI_NUMERICHOST) == 0) {
+ ai->ai_canonname = strdup(nbuf);
+ if (ai->ai_canonname == NULL) {
+ freeaddrinfo(ai);
+ return (EAI_MEMORY);
+ }
+ } else {
+ /* XXX raise error? */
+ ai->ai_canonname = NULL;
+ }
+ }
+ goto done;
+ } else if ((flags & AI_NUMERICHOST) != 0) {
+ return (EAI_NONAME);
+ }
+ }
+
+ if (hostname == NULL && (flags & AI_PASSIVE) == 0) {
+ set_order(family, net_order);
+ for (i = 0; i < FOUND_MAX; i++) {
+ if (net_order[i] == NULL)
+ break;
+ err = (net_order[i])(hostname, flags, &ai_list,
+ socktype, port);
+ if (err != 0) {
+ if (ai_list != NULL)
+ freeaddrinfo(ai_list);
+ break;
+ }
+ }
+ } else
+ err = resolve_name(family, hostname, flags, &ai_list,
+ socktype, port);
+
+ if (ai_list == NULL) {
+ if (err == 0)
+ err = EAI_NONAME;
+ return (err);
+ }
+
+done:
+ ai_list = ai_reverse(ai_list);
+
+ *res = ai_list;
+ return (0);
+}
+
+typedef struct gai_restrans {
+ dns_clientrestrans_t *xid;
+ isc_boolean_t is_inprogress;
+ int error;
+ struct addrinfo ai_sentinel;
+ struct gai_resstate *resstate;
+} gai_restrans_t;
+
+typedef struct gai_resstate {
+ isc_mem_t *mctx;
+ struct gai_statehead *head;
+ dns_fixedname_t fixedname;
+ dns_name_t *qname;
+ gai_restrans_t *trans4;
+ gai_restrans_t *trans6;
+ ISC_LINK(struct gai_resstate) link;
+} gai_resstate_t;
+
+typedef struct gai_statehead {
+ int ai_family;
+ int ai_flags;
+ int ai_socktype;
+ int ai_port;
+ isc_appctx_t *actx;
+ dns_client_t *dnsclient;
+ ISC_LIST(struct gai_resstate) resstates;
+ unsigned int activestates;
+} gai_statehead_t;
+
+static isc_result_t
+make_resstate(isc_mem_t *mctx, gai_statehead_t *head, const char *hostname,
+ const char *domain, gai_resstate_t **statep)
+{
+ isc_result_t result;
+ gai_resstate_t *state;
+ dns_fixedname_t fixeddomain;
+ dns_name_t *qdomain;
+ size_t namelen;
+ isc_buffer_t b;
+ isc_boolean_t need_v4 = ISC_FALSE;
+ isc_boolean_t need_v6 = ISC_FALSE;
+
+ state = isc_mem_get(mctx, sizeof(*state));
+ if (state == NULL)
+ return (ISC_R_NOMEMORY);
+
+ /* Construct base domain name */
+ namelen = strlen(domain);
+ isc_buffer_init(&b, domain, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&fixeddomain);
+ qdomain = dns_fixedname_name(&fixeddomain);
+ result = dns_name_fromtext(qdomain, &b, dns_rootname, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (result);
+ }
+
+ /* Construct query name */
+ namelen = strlen(hostname);
+ isc_buffer_init(&b, hostname, namelen);
+ isc_buffer_add(&b, namelen);
+ dns_fixedname_init(&state->fixedname);
+ state->qname = dns_fixedname_name(&state->fixedname);
+ result = dns_name_fromtext(state->qname, &b, qdomain, 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (result);
+ }
+
+ if (head->ai_family == AF_UNSPEC || head->ai_family == AF_INET)
+ need_v4 = ISC_TRUE;
+ if (head->ai_family == AF_UNSPEC || head->ai_family == AF_INET6)
+ need_v6 = ISC_TRUE;
+
+ state->trans6 = NULL;
+ state->trans4 = NULL;
+ if (need_v4) {
+ state->trans4 = isc_mem_get(mctx, sizeof(gai_restrans_t));
+ if (state->trans4 == NULL) {
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (ISC_R_NOMEMORY);
+ }
+ state->trans4->error = 0;
+ state->trans4->xid = NULL;
+ state->trans4->resstate = state;
+ state->trans4->is_inprogress = ISC_TRUE;
+ state->trans4->ai_sentinel.ai_next = NULL;
+ }
+ if (need_v6) {
+ state->trans6 = isc_mem_get(mctx, sizeof(gai_restrans_t));
+ if (state->trans6 == NULL) {
+ if (state->trans4 != NULL)
+ isc_mem_put(mctx, state->trans4,
+ sizeof(*state->trans4));
+ isc_mem_put(mctx, state, sizeof(*state));
+ return (ISC_R_NOMEMORY);
+ }
+ state->trans6->error = 0;
+ state->trans6->xid = NULL;
+ state->trans6->resstate = state;
+ state->trans6->is_inprogress = ISC_TRUE;
+ state->trans6->ai_sentinel.ai_next = NULL;
+ }
+
+ state->mctx = mctx;
+ state->head = head;
+ ISC_LINK_INIT(state, link);
+
+ *statep = state;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+make_resstates(isc_mem_t *mctx, const char *hostname, gai_statehead_t *head,
+ irs_resconf_t *resconf)
+{
+ isc_result_t result;
+ irs_resconf_searchlist_t *searchlist;
+ irs_resconf_search_t *searchent;
+ gai_resstate_t *resstate, *resstate0;
+
+ resstate0 = NULL;
+ result = make_resstate(mctx, head, hostname, ".", &resstate0);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ searchlist = irs_resconf_getsearchlist(resconf);
+ for (searchent = ISC_LIST_HEAD(*searchlist); searchent != NULL;
+ searchent = ISC_LIST_NEXT(searchent, link)) {
+ resstate = NULL;
+ result = make_resstate(mctx, head, hostname,
+ (const char *)searchent->domain,
+ &resstate);
+ if (result != ISC_R_SUCCESS)
+ break;
+
+ ISC_LIST_APPEND(head->resstates, resstate, link);
+ head->activestates++;
+ }
+
+ /*
+ * Insert the original hostname either at the head or the tail of the
+ * state list, depending on the number of labels contained in the
+ * original name and the 'ndots' configuration parameter.
+ */
+ if (dns_name_countlabels(resstate0->qname) >
+ irs_resconf_getndots(resconf) + 1) {
+ ISC_LIST_PREPEND(head->resstates, resstate0, link);
+ } else
+ ISC_LIST_APPEND(head->resstates, resstate0, link);
+ head->activestates++;
+
+ if (result != ISC_R_SUCCESS) {
+ while ((resstate = ISC_LIST_HEAD(head->resstates)) != NULL) {
+ ISC_LIST_UNLINK(head->resstates, resstate, link);
+ if (resstate->trans4 != NULL) {
+ isc_mem_put(mctx, resstate->trans4,
+ sizeof(*resstate->trans4));
+ }
+ if (resstate->trans6 != NULL) {
+ isc_mem_put(mctx, resstate->trans6,
+ sizeof(*resstate->trans6));
+ }
+
+ isc_mem_put(mctx, resstate, sizeof(*resstate));
+ }
+ }
+
+ return (result);
+}
+
+static void
+process_answer(isc_task_t *task, isc_event_t *event) {
+ int error = 0, family;
+ gai_restrans_t *trans = event->ev_arg;
+ gai_resstate_t *resstate;
+ dns_clientresevent_t *rev = (dns_clientresevent_t *)event;
+ dns_rdatatype_t qtype;
+ dns_name_t *name;
+
+ REQUIRE(trans != NULL);
+ resstate = trans->resstate;
+ REQUIRE(resstate != NULL);
+ REQUIRE(task != NULL);
+
+ if (trans == resstate->trans4) {
+ family = AF_INET;
+ qtype = dns_rdatatype_a;
+ } else {
+ INSIST(trans == resstate->trans6);
+ family = AF_INET6;
+ qtype = dns_rdatatype_aaaa;
+ }
+
+ INSIST(trans->is_inprogress);
+ trans->is_inprogress = ISC_FALSE;
+
+ switch (rev->result) {
+ case ISC_R_SUCCESS:
+ case DNS_R_NCACHENXDOMAIN: /* treat this as a fatal error? */
+ case DNS_R_NCACHENXRRSET:
+ break;
+ default:
+ switch (rev->vresult) {
+ case DNS_R_SIGINVALID:
+ case DNS_R_SIGEXPIRED:
+ case DNS_R_SIGFUTURE:
+ case DNS_R_KEYUNAUTHORIZED:
+ case DNS_R_MUSTBESECURE:
+ case DNS_R_COVERINGNSEC:
+ case DNS_R_NOTAUTHORITATIVE:
+ case DNS_R_NOVALIDKEY:
+ case DNS_R_NOVALIDDS:
+ case DNS_R_NOVALIDSIG:
+ error = EAI_INSECUREDATA;
+ break;
+ default:
+ error = EAI_FAIL;
+ }
+ goto done;
+ }
+
+ /* Parse the response and construct the addrinfo chain */
+ for (name = ISC_LIST_HEAD(rev->answerlist); name != NULL;
+ name = ISC_LIST_NEXT(name, link)) {
+ isc_result_t result;
+ dns_rdataset_t *rdataset;
+ isc_buffer_t b;
+ isc_region_t r;
+ char t[1024];
+
+ for (rdataset = ISC_LIST_HEAD(name->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (!dns_rdataset_isassociated(rdataset))
+ continue;
+ if (rdataset->type != qtype)
+ continue;
+
+ if ((resstate->head->ai_flags & AI_CANONNAME) != 0) {
+ isc_buffer_init(&b, t, sizeof(t));
+ result = dns_name_totext(name, ISC_TRUE, &b);
+ if (result != ISC_R_SUCCESS) {
+ error = EAI_FAIL;
+ goto done;
+ }
+ isc_buffer_putuint8(&b, '\0');
+ isc_buffer_usedregion(&b, &r);
+ }
+
+ for (result = dns_rdataset_first(rdataset);
+ result == ISC_R_SUCCESS;
+ result = dns_rdataset_next(rdataset)) {
+ struct addrinfo *ai;
+ dns_rdata_t rdata;
+ dns_rdata_in_a_t rdata_a;
+ dns_rdata_in_aaaa_t rdata_aaaa;
+
+ ai = ai_alloc(family,
+ ((family == AF_INET6) ?
+ sizeof(struct sockaddr_in6) :
+ sizeof(struct sockaddr_in)));
+ if (ai == NULL) {
+ error = EAI_MEMORY;
+ goto done;
+ }
+ ai->ai_socktype = resstate->head->ai_socktype;
+ ai->ai_next = trans->ai_sentinel.ai_next;
+ trans->ai_sentinel.ai_next = ai;
+
+ /*
+ * Set AF-specific parameters
+ * (IPv4/v6 address/port)
+ */
+ dns_rdata_init(&rdata);
+ switch (family) {
+ case AF_INET:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_a,
+ NULL);
+
+ SIN(ai->ai_addr)->sin_port =
+ resstate->head->ai_port;
+ memcpy(&SIN(ai->ai_addr)->sin_addr,
+ &rdata_a.in_addr, 4);
+ dns_rdata_freestruct(&rdata_a);
+ break;
+ case AF_INET6:
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_aaaa,
+ NULL);
+ SIN6(ai->ai_addr)->sin6_port =
+ resstate->head->ai_port;
+ memcpy(&SIN6(ai->ai_addr)->sin6_addr,
+ &rdata_aaaa.in6_addr, 16);
+ dns_rdata_freestruct(&rdata_aaaa);
+ break;
+ }
+
+ if ((resstate->head->ai_flags & AI_CANONNAME)
+ != 0) {
+ ai->ai_canonname =
+ strdup((const char *)r.base);
+ if (ai->ai_canonname == NULL) {
+ error = EAI_MEMORY;
+ goto done;
+ }
+ }
+ }
+ }
+ }
+
+ done:
+ dns_client_freeresanswer(resstate->head->dnsclient, &rev->answerlist);
+ dns_client_destroyrestrans(&trans->xid);
+
+ isc_event_free(&event);
+
+ /* Make sure that error == 0 iff we have a non-empty list */
+ if (error == 0) {
+ if (trans->ai_sentinel.ai_next == NULL)
+ error = EAI_NONAME;
+ } else {
+ if (trans->ai_sentinel.ai_next != NULL) {
+ freeaddrinfo(trans->ai_sentinel.ai_next);
+ trans->ai_sentinel.ai_next = NULL;
+ }
+ }
+ trans->error = error;
+
+ /* Check whether we are done */
+ if ((resstate->trans4 == NULL || !resstate->trans4->is_inprogress) &&
+ (resstate->trans6 == NULL || !resstate->trans6->is_inprogress)) {
+ /*
+ * We're done for this state. If there is no other outstanding
+ * state, we can exit.
+ */
+ resstate->head->activestates--;
+ if (resstate->head->activestates == 0) {
+ isc_app_ctxsuspend(resstate->head->actx);
+ return;
+ }
+
+ /*
+ * There are outstanding states, but if we are at the head
+ * of the state list (i.e., at the highest search priority)
+ * and have any answer, we can stop now by canceling the
+ * others.
+ */
+ if (resstate == ISC_LIST_HEAD(resstate->head->resstates)) {
+ if ((resstate->trans4 != NULL &&
+ resstate->trans4->ai_sentinel.ai_next != NULL) ||
+ (resstate->trans6 != NULL &&
+ resstate->trans6->ai_sentinel.ai_next != NULL)) {
+ gai_resstate_t *rest;
+
+ for (rest = ISC_LIST_NEXT(resstate, link);
+ rest != NULL;
+ rest = ISC_LIST_NEXT(rest, link)) {
+ if (rest->trans4 != NULL &&
+ rest->trans4->xid != NULL)
+ dns_client_cancelresolve(
+ rest->trans4->xid);
+ if (rest->trans6 != NULL &&
+ rest->trans6->xid != NULL)
+ dns_client_cancelresolve(
+ rest->trans6->xid);
+ }
+ } else {
+ /*
+ * This search fails, so we move to the tail
+ * of the list so that the next entry will
+ * have the highest priority.
+ */
+ ISC_LIST_UNLINK(resstate->head->resstates,
+ resstate, link);
+ ISC_LIST_APPEND(resstate->head->resstates,
+ resstate, link);
+ }
+ }
+ }
+}
+
+static int
+resolve_name(int family, const char *hostname, int flags,
+ struct addrinfo **aip, int socktype, int port)
+{
+ isc_result_t result;
+ irs_context_t *irsctx;
+ irs_resconf_t *conf;
+ isc_mem_t *mctx;
+ isc_appctx_t *actx;
+ isc_task_t *task;
+ int terror = 0;
+ int error = 0;
+ dns_client_t *client;
+ gai_resstate_t *resstate;
+ gai_statehead_t head;
+ isc_boolean_t all_fail = ISC_TRUE;
+
+ /* get IRS context and the associated parameters */
+ irsctx = NULL;
+ result = irs_context_get(&irsctx);
+ if (result != ISC_R_SUCCESS)
+ return (EAI_FAIL);
+ actx = irs_context_getappctx(irsctx);
+
+ mctx = irs_context_getmctx(irsctx);
+ task = irs_context_gettask(irsctx);
+ conf = irs_context_getresconf(irsctx);
+ client = irs_context_getdnsclient(irsctx);
+
+ /* construct resolution states */
+ head.activestates = 0;
+ head.ai_family = family;
+ head.ai_socktype = socktype;
+ head.ai_flags = flags;
+ head.ai_port = port;
+ head.actx = actx;
+ head.dnsclient = client;
+ ISC_LIST_INIT(head.resstates);
+ result = make_resstates(mctx, hostname, &head, conf);
+ if (result != ISC_R_SUCCESS)
+ return (EAI_FAIL);
+
+ for (resstate = ISC_LIST_HEAD(head.resstates);
+ resstate != NULL; resstate = ISC_LIST_NEXT(resstate, link)) {
+ if (resstate->trans4 != NULL) {
+ result = dns_client_startresolve(client,
+ resstate->qname,
+ dns_rdataclass_in,
+ dns_rdatatype_a,
+ 0, task,
+ process_answer,
+ resstate->trans4,
+ &resstate->trans4->xid);
+ if (result == ISC_R_SUCCESS) {
+ resstate->trans4->is_inprogress = ISC_TRUE;
+ all_fail = ISC_FALSE;
+ } else
+ resstate->trans4->is_inprogress = ISC_FALSE;
+ }
+ if (resstate->trans6 != NULL) {
+ result = dns_client_startresolve(client,
+ resstate->qname,
+ dns_rdataclass_in,
+ dns_rdatatype_aaaa,
+ 0, task,
+ process_answer,
+ resstate->trans6,
+ &resstate->trans6->xid);
+ if (result == ISC_R_SUCCESS) {
+ resstate->trans6->is_inprogress = ISC_TRUE;
+ all_fail = ISC_FALSE;
+ } else
+ resstate->trans6->is_inprogress= ISC_FALSE;
+ }
+ }
+ if (!all_fail) {
+ /* Start all the events */
+ isc_app_ctxrun(actx);
+ } else
+ error = EAI_FAIL;
+
+ /* Cleanup */
+ while ((resstate = ISC_LIST_HEAD(head.resstates)) != NULL) {
+ int terror4 = 0, terror6 = 0;
+
+ ISC_LIST_UNLINK(head.resstates, resstate, link);
+
+ if (*aip == NULL) {
+ struct addrinfo *sentinel4 = NULL;
+ struct addrinfo *sentinel6 = NULL;
+
+ if (resstate->trans4 != NULL) {
+ sentinel4 =
+ resstate->trans4->ai_sentinel.ai_next;
+ resstate->trans4->ai_sentinel.ai_next = NULL;
+ }
+ if (resstate->trans6 != NULL) {
+ sentinel6 =
+ resstate->trans6->ai_sentinel.ai_next;
+ resstate->trans6->ai_sentinel.ai_next = NULL;
+ }
+ *aip = ai_concat(sentinel4, sentinel6);
+ }
+
+ if (resstate->trans4 != NULL) {
+ INSIST(resstate->trans4->xid == NULL);
+ terror4 = resstate->trans4->error;
+ isc_mem_put(mctx, resstate->trans4,
+ sizeof(*resstate->trans4));
+ }
+ if (resstate->trans6 != NULL) {
+ INSIST(resstate->trans6->xid == NULL);
+ terror6 = resstate->trans6->error;
+ isc_mem_put(mctx, resstate->trans6,
+ sizeof(*resstate->trans6));
+ }
+
+ /*
+ * If the entire lookup fails, we need to choose an appropriate
+ * error code from individual codes. We'll try to provide as
+ * specific a code as possible. In general, we are going to
+ * find an error code other than EAI_NONAME (which is too
+ * generic and may actually not be problematic in some cases).
+ * EAI_NONAME will be set below if no better code is found.
+ */
+ if (terror == 0 || terror == EAI_NONAME) {
+ if (terror4 != 0 && terror4 != EAI_NONAME)
+ terror = terror4;
+ else if (terror6 != 0 && terror6 != EAI_NONAME)
+ terror = terror6;
+ }
+
+ isc_mem_put(mctx, resstate, sizeof(*resstate));
+ }
+
+ if (*aip == NULL) {
+ error = terror;
+ if (error == 0)
+ error = EAI_NONAME;
+ }
+
+#if 1 /* XXX: enabled for finding leaks. should be cleaned up later. */
+ isc_app_ctxfinish(actx);
+ irs_context_destroy(&irsctx);
+#endif
+
+ return (error);
+}
+
+static char *
+irs_strsep(char **stringp, const char *delim) {
+ char *string = *stringp;
+ char *s;
+ const char *d;
+ char sc, dc;
+
+ if (string == NULL)
+ return (NULL);
+
+ for (s = string; *s != '\0'; s++) {
+ sc = *s;
+ for (d = delim; (dc = *d) != '\0'; d++)
+ if (sc == dc) {
+ *s++ = '\0';
+ *stringp = s;
+ return (string);
+ }
+ }
+ *stringp = NULL;
+ return (string);
+}
+
+static void
+set_order(int family, int (**net_order)(const char *, int, struct addrinfo **,
+ int, int))
+{
+ char *order, *tok;
+ int found;
+
+ if (family) {
+ switch (family) {
+ case AF_INET:
+ *net_order++ = add_ipv4;
+ break;
+ case AF_INET6:
+ *net_order++ = add_ipv6;
+ break;
+ }
+ } else {
+ order = getenv("NET_ORDER");
+ found = 0;
+ while (order != NULL) {
+ /*
+ * We ignore any unknown names.
+ */
+ tok = irs_strsep(&order, ":");
+ if (strcasecmp(tok, "inet6") == 0) {
+ if ((found & FOUND_IPV6) == 0)
+ *net_order++ = add_ipv6;
+ found |= FOUND_IPV6;
+ } else if (strcasecmp(tok, "inet") == 0 ||
+ strcasecmp(tok, "inet4") == 0) {
+ if ((found & FOUND_IPV4) == 0)
+ *net_order++ = add_ipv4;
+ found |= FOUND_IPV4;
+ }
+ }
+
+ /*
+ * Add in anything that we didn't find.
+ */
+ if ((found & FOUND_IPV4) == 0)
+ *net_order++ = add_ipv4;
+ if ((found & FOUND_IPV6) == 0)
+ *net_order++ = add_ipv6;
+ }
+ *net_order = NULL;
+ return;
+}
+
+static char v4_loop[4] = { 127, 0, 0, 1 };
+
+static int
+add_ipv4(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port)
+{
+ struct addrinfo *ai;
+
+ UNUSED(hostname);
+ UNUSED(flags);
+
+ ai = ai_clone(*aip, AF_INET); /* don't use ai_clone() */
+ if (ai == NULL) {
+ freeaddrinfo(*aip);
+ return (EAI_MEMORY);
+ }
+
+ *aip = ai;
+ ai->ai_socktype = socktype;
+ SIN(ai->ai_addr)->sin_port = port;
+ memcpy(&SIN(ai->ai_addr)->sin_addr, v4_loop, 4);
+
+ return (0);
+}
+
+static char v6_loop[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
+
+static int
+add_ipv6(const char *hostname, int flags, struct addrinfo **aip,
+ int socktype, int port)
+{
+ struct addrinfo *ai;
+
+ UNUSED(hostname);
+ UNUSED(flags);
+
+ ai = ai_clone(*aip, AF_INET6); /* don't use ai_clone() */
+ if (ai == NULL) {
+ freeaddrinfo(*aip);
+ return (EAI_MEMORY);
+ }
+
+ *aip = ai;
+ ai->ai_socktype = socktype;
+ SIN6(ai->ai_addr)->sin6_port = port;
+ memcpy(&SIN6(ai->ai_addr)->sin6_addr, v6_loop, 16);
+
+ return (0);
+}
+
+/*% Free address info. */
+void
+freeaddrinfo(struct addrinfo *ai) {
+ struct addrinfo *ai_next;
+
+ while (ai != NULL) {
+ ai_next = ai->ai_next;
+ if (ai->ai_addr != NULL)
+ free(ai->ai_addr);
+ if (ai->ai_canonname)
+ free(ai->ai_canonname);
+ free(ai);
+ ai = ai_next;
+ }
+}
+
+#ifdef AF_LOCAL
+static int
+get_local(const char *name, int socktype, struct addrinfo **res) {
+ struct addrinfo *ai;
+ struct sockaddr_un *slocal;
+
+ if (socktype == 0)
+ return (EAI_SOCKTYPE);
+
+ ai = ai_alloc(AF_LOCAL, sizeof(*slocal));
+ if (ai == NULL)
+ return (EAI_MEMORY);
+
+ slocal = SLOCAL(ai->ai_addr);
+ strncpy(slocal->sun_path, name, sizeof(slocal->sun_path));
+
+ ai->ai_socktype = socktype;
+ /*
+ * ai->ai_flags, ai->ai_protocol, ai->ai_canonname,
+ * and ai->ai_next were initialized to zero.
+ */
+
+ *res = ai;
+ return (0);
+}
+#endif
+
+/*!
+ * Allocate an addrinfo structure, and a sockaddr structure
+ * of the specificed length. We initialize:
+ * ai_addrlen
+ * ai_family
+ * ai_addr
+ * ai_addr->sa_family
+ * ai_addr->sa_len (IRS_PLATFORM_HAVESALEN)
+ * and everything else is initialized to zero.
+ */
+static struct addrinfo *
+ai_alloc(int family, int addrlen) {
+ struct addrinfo *ai;
+
+ ai = (struct addrinfo *)calloc(1, sizeof(*ai));
+ if (ai == NULL)
+ return (NULL);
+
+ ai->ai_addr = SA(calloc(1, addrlen));
+ if (ai->ai_addr == NULL) {
+ free(ai);
+ return (NULL);
+ }
+ ai->ai_addrlen = addrlen;
+ ai->ai_family = family;
+ ai->ai_addr->sa_family = family;
+#ifdef IRS_PLATFORM_HAVESALEN
+ ai->ai_addr->sa_len = addrlen;
+#endif
+ return (ai);
+}
+
+static struct addrinfo *
+ai_clone(struct addrinfo *oai, int family) {
+ struct addrinfo *ai;
+
+ ai = ai_alloc(family, ((family == AF_INET6) ?
+ sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)));
+
+ if (ai == NULL) {
+ if (oai != NULL)
+ freeaddrinfo(oai);
+ return (NULL);
+ }
+ if (oai == NULL)
+ return (ai);
+
+ ai->ai_flags = oai->ai_flags;
+ ai->ai_socktype = oai->ai_socktype;
+ ai->ai_protocol = oai->ai_protocol;
+ ai->ai_canonname = NULL;
+ ai->ai_next = oai;
+ return (ai);
+}
+
+static struct addrinfo *
+ai_reverse(struct addrinfo *oai) {
+ struct addrinfo *nai, *tai;
+
+ nai = NULL;
+
+ while (oai != NULL) {
+ /*
+ * Grab one off the old list.
+ */
+ tai = oai;
+ oai = oai->ai_next;
+ /*
+ * Put it on the front of the new list.
+ */
+ tai->ai_next = nai;
+ nai = tai;
+ }
+ return (nai);
+}
+
+
+static struct addrinfo *
+ai_concat(struct addrinfo *ai1, struct addrinfo *ai2) {
+ struct addrinfo *ai_tmp;
+
+ if (ai1 == NULL)
+ return (ai2);
+ else if (ai2 == NULL)
+ return (ai1);
+
+ for (ai_tmp = ai1; ai_tmp != NULL && ai_tmp->ai_next != NULL;
+ ai_tmp = ai_tmp->ai_next)
+ ;
+
+ ai_tmp->ai_next = ai2;
+
+ return (ai1);
+}
diff --git a/contrib/bind9/lib/irs/getnameinfo.c b/contrib/bind9/lib/irs/getnameinfo.c
new file mode 100644
index 0000000..fadd8d8
--- /dev/null
+++ b/contrib/bind9/lib/irs/getnameinfo.c
@@ -0,0 +1,410 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: getnameinfo.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/**
+ * getnameinfo() returns the hostname for the struct sockaddr sa which is
+ * salen bytes long. The hostname is of length hostlen and is returned via
+ * *host. The maximum length of the hostname is 1025 bytes: #NI_MAXHOST.
+ *
+ * The name of the service associated with the port number in sa is
+ * returned in *serv. It is servlen bytes long. The maximum length of the
+ * service name is #NI_MAXSERV - 32 bytes.
+ *
+ * The flags argument sets the following bits:
+ *
+ * \li #NI_NOFQDN:
+ * A fully qualified domain name is not required for local hosts.
+ * The local part of the fully qualified domain name is returned
+ * instead.
+ *
+ * \li #NI_NUMERICHOST
+ * Return the address in numeric form, as if calling inet_ntop(),
+ * instead of a host name.
+ *
+ * \li #NI_NAMEREQD
+ * A name is required. If the hostname cannot be found in the DNS
+ * and this flag is set, a non-zero error code is returned. If the
+ * hostname is not found and the flag is not set, the address is
+ * returned in numeric form.
+ *
+ * \li #NI_NUMERICSERV
+ * The service name is returned as a digit string representing the
+ * port number.
+ *
+ * \li #NI_DGRAM
+ * Specifies that the service being looked up is a datagram
+ * service, and causes getservbyport() to be called with a second
+ * argument of "udp" instead of its default of "tcp". This is
+ * required for the few ports (512-514) that have different
+ * services for UDP and TCP.
+ *
+ * \section getnameinfo_return Return Values
+ *
+ * getnameinfo() returns 0 on success or a non-zero error code if
+ * an error occurs.
+ *
+ * \section getname_see See Also
+ *
+ * RFC3493, getservbyport(),
+ * getnamebyaddr(). inet_ntop().
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include <isc/netaddr.h>
+#include <isc/print.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <dns/byaddr.h>
+#include <dns/client.h>
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataset.h>
+#include <dns/rdatastruct.h>
+#include <dns/result.h>
+
+#include <irs/context.h>
+#include <irs/netdb.h>
+
+#define SUCCESS 0
+
+/*% afd structure definition */
+static struct afd {
+ int a_af;
+ size_t a_addrlen;
+ size_t a_socklen;
+} afdl [] = {
+ /*!
+ * First entry is linked last...
+ */
+ { AF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in) },
+ { AF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6) },
+ {0, 0, 0},
+};
+
+/*!
+ * The test against 0 is there to keep the Solaris compiler
+ * from complaining about "end-of-loop code not reached".
+ */
+#define ERR(code) \
+ do { result = (code); \
+ if (result != 0) goto cleanup; \
+ } while (0)
+
+int
+getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host,
+ IRS_GETNAMEINFO_BUFLEN_T hostlen, char *serv,
+ IRS_GETNAMEINFO_BUFLEN_T servlen, IRS_GETNAMEINFO_FLAGS_T flags)
+{
+ struct afd *afd;
+ struct servent *sp;
+ unsigned short port;
+#ifdef IRS_PLATFORM_HAVESALEN
+ size_t len;
+#endif
+ int family, i;
+ const void *addr;
+ char *p;
+#if 0
+ unsigned long v4a;
+ unsigned char pfx;
+#endif
+ char numserv[sizeof("65000")];
+ char numaddr[sizeof("abcd:abcd:abcd:abcd:abcd:abcd:255.255.255.255")
+ + 1 + sizeof("4294967295")];
+ const char *proto;
+ int result = SUCCESS;
+
+ if (sa == NULL)
+ ERR(EAI_FAIL);
+
+#ifdef IRS_PLATFORM_HAVESALEN
+ len = sa->sa_len;
+ if (len != salen)
+ ERR(EAI_FAIL);
+#endif
+
+ family = sa->sa_family;
+ for (i = 0; afdl[i].a_af; i++)
+ if (afdl[i].a_af == family) {
+ afd = &afdl[i];
+ goto found;
+ }
+ ERR(EAI_FAMILY);
+
+ found:
+ if (salen != afd->a_socklen)
+ ERR(EAI_FAIL);
+
+ switch (family) {
+ case AF_INET:
+ port = ((const struct sockaddr_in *)sa)->sin_port;
+ addr = &((const struct sockaddr_in *)sa)->sin_addr.s_addr;
+ break;
+
+ case AF_INET6:
+ port = ((const struct sockaddr_in6 *)sa)->sin6_port;
+ addr = ((const struct sockaddr_in6 *)sa)->sin6_addr.s6_addr;
+ break;
+
+ default:
+ port = 0;
+ addr = NULL;
+ INSIST(0);
+ }
+ proto = (flags & NI_DGRAM) ? "udp" : "tcp";
+
+ if (serv == NULL || servlen == 0U) {
+ /*
+ * Caller does not want service.
+ */
+ } else if ((flags & NI_NUMERICSERV) != 0 ||
+ (sp = getservbyport(port, proto)) == NULL) {
+ snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
+ if ((strlen(numserv) + 1) > servlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(serv, numserv);
+ } else {
+ if ((strlen(sp->s_name) + 1) > servlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(serv, sp->s_name);
+ }
+
+#if 0
+ switch (sa->sa_family) {
+ case AF_INET:
+ v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
+ if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
+ flags |= NI_NUMERICHOST;
+ v4a >>= IN_CLASSA_NSHIFT;
+ if (v4a == 0 || v4a == IN_LOOPBACKNET)
+ flags |= NI_NUMERICHOST;
+ break;
+
+ case AF_INET6:
+ pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0];
+ if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
+ flags |= NI_NUMERICHOST;
+ break;
+ }
+#endif
+
+ if (host == NULL || hostlen == 0U) {
+ /*
+ * do nothing in this case.
+ * in case you are wondering if "&&" is more correct than
+ * "||" here: RFC3493 says that host == NULL or hostlen == 0
+ * means that the caller does not want the result.
+ */
+ } else if ((flags & NI_NUMERICHOST) != 0) {
+ if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
+ == NULL)
+ ERR(EAI_SYSTEM);
+#if defined(IRS_HAVE_SIN6_SCOPE_ID)
+ if (afd->a_af == AF_INET6 &&
+ ((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
+ char *p = numaddr + strlen(numaddr);
+ const char *stringscope = NULL;
+#ifdef VENDOR_SPECIFIC
+ /*
+ * Vendors may want to add support for
+ * non-numeric scope identifier.
+ */
+ stringscope = foo;
+#endif
+ if (stringscope == NULL) {
+ snprintf(p, sizeof(numaddr) - (p - numaddr),
+ "%%%u",
+ ((const struct sockaddr_in6 *)sa)->sin6_scope_id);
+ } else {
+ snprintf(p, sizeof(numaddr) - (p - numaddr),
+ "%%%s", stringscope);
+ }
+ }
+#endif
+ if (strlen(numaddr) + 1 > hostlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(host, numaddr);
+ } else {
+ isc_netaddr_t netaddr;
+ dns_fixedname_t ptrfname;
+ dns_name_t *ptrname;
+ irs_context_t *irsctx = NULL;
+ dns_client_t *client;
+ isc_boolean_t found = ISC_FALSE;
+ dns_namelist_t answerlist;
+ dns_rdataset_t *rdataset;
+ isc_region_t hostregion;
+ char hoststr[1024]; /* is this enough? */
+ isc_result_t iresult;
+
+ /* Get IRS context and the associated DNS client object */
+ iresult = irs_context_get(&irsctx);
+ if (iresult != ISC_R_SUCCESS)
+ ERR(EAI_FAIL);
+ client = irs_context_getdnsclient(irsctx);
+
+ /* Make query name */
+ isc_netaddr_fromsockaddr(&netaddr, (const isc_sockaddr_t *)sa);
+ dns_fixedname_init(&ptrfname);
+ ptrname = dns_fixedname_name(&ptrfname);
+ iresult = dns_byaddr_createptrname2(&netaddr, 0, ptrname);
+ if (iresult != ISC_R_SUCCESS)
+ ERR(EAI_FAIL);
+
+ /* Get the PTR RRset */
+ ISC_LIST_INIT(answerlist);
+ iresult = dns_client_resolve(client, ptrname,
+ dns_rdataclass_in,
+ dns_rdatatype_ptr,
+ DNS_CLIENTRESOPT_ALLOWRUN,
+ &answerlist);
+ switch (iresult) {
+ case ISC_R_SUCCESS:
+ /*
+ * a 'non-existent' error is not necessarily fatal for
+ * getnameinfo().
+ */
+ case DNS_R_NCACHENXDOMAIN:
+ case DNS_R_NCACHENXRRSET:
+ break;
+ case DNS_R_SIGINVALID:
+ case DNS_R_SIGEXPIRED:
+ case DNS_R_SIGFUTURE:
+ case DNS_R_KEYUNAUTHORIZED:
+ case DNS_R_MUSTBESECURE:
+ case DNS_R_COVERINGNSEC:
+ case DNS_R_NOTAUTHORITATIVE:
+ case DNS_R_NOVALIDKEY:
+ case DNS_R_NOVALIDDS:
+ case DNS_R_NOVALIDSIG:
+ ERR(EAI_INSECUREDATA);
+ default:
+ ERR(EAI_FAIL);
+ }
+
+ /* Parse the answer for the hostname */
+ for (ptrname = ISC_LIST_HEAD(answerlist); ptrname != NULL;
+ ptrname = ISC_LIST_NEXT(ptrname, link)) {
+ for (rdataset = ISC_LIST_HEAD(ptrname->list);
+ rdataset != NULL;
+ rdataset = ISC_LIST_NEXT(rdataset, link)) {
+ if (!dns_rdataset_isassociated(rdataset))
+ continue;
+ if (rdataset->type != dns_rdatatype_ptr)
+ continue;
+
+ for (iresult = dns_rdataset_first(rdataset);
+ iresult == ISC_R_SUCCESS;
+ iresult = dns_rdataset_next(rdataset)) {
+ dns_rdata_t rdata;
+ dns_rdata_ptr_t rdata_ptr;
+ isc_buffer_t b;
+
+ dns_rdata_init(&rdata);
+ dns_rdataset_current(rdataset, &rdata);
+ dns_rdata_tostruct(&rdata, &rdata_ptr,
+ NULL);
+
+ isc_buffer_init(&b, hoststr,
+ sizeof(hoststr));
+ iresult =
+ dns_name_totext(&rdata_ptr.ptr,
+ ISC_TRUE, &b);
+ dns_rdata_freestruct(&rdata_ptr);
+ if (iresult == ISC_R_SUCCESS) {
+ /*
+ * We ignore the rest of the
+ * answer. After all,
+ * getnameinfo() can return
+ * at most one hostname.
+ */
+ found = ISC_TRUE;
+ isc_buffer_usedregion(
+ &b, &hostregion);
+ goto ptrfound;
+ }
+
+ }
+ }
+ }
+ ptrfound:
+ dns_client_freeresanswer(client, &answerlist);
+ if (found) {
+ if ((flags & NI_NOFQDN) != 0) {
+ p = strchr(hoststr, '.');
+ if (p)
+ *p = '\0';
+ }
+ if (hostregion.length + 1 > hostlen)
+ ERR(EAI_OVERFLOW);
+ snprintf(host, hostlen, "%.*s",
+ (int)hostregion.length,
+ (char *)hostregion.base);
+ } else {
+ if ((flags & NI_NAMEREQD) != 0)
+ ERR(EAI_NONAME);
+ if (inet_ntop(afd->a_af, addr, numaddr,
+ sizeof(numaddr)) == NULL)
+ ERR(EAI_SYSTEM);
+ if ((strlen(numaddr) + 1) > hostlen)
+ ERR(EAI_OVERFLOW);
+ strcpy(host, numaddr);
+ }
+ }
+ result = SUCCESS;
+
+ cleanup:
+ return (result);
+}
diff --git a/contrib/bind9/lib/irs/include/Makefile.in b/contrib/bind9/lib/irs/include/Makefile.in
new file mode 100644
index 0000000..22a63ee
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/Makefile.in
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+SUBDIRS = irs
+TARGETS =
+
+@BIND9_MAKE_RULES@
diff --git a/contrib/bind9/lib/irs/include/irs/Makefile.in b/contrib/bind9/lib/irs/include/irs/Makefile.in
new file mode 100644
index 0000000..7d50995
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/Makefile.in
@@ -0,0 +1,44 @@
+# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC 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.
+
+# $Id: Makefile.in,v 1.3 2009-09-02 23:48:02 tbox Exp $
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+top_srcdir = @top_srcdir@
+
+#
+# Only list headers that are to be installed and are not
+# machine generated. The latter are handled specially in the
+# install target below.
+#
+HEADERS = version.h
+
+SUBDIRS =
+TARGETS =
+
+@BIND9_MAKE_RULES@
+
+installdirs:
+ $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir}/irs
+
+install:: installdirs
+ for i in ${HEADERS}; do \
+ ${INSTALL_DATA} ${srcdir}/$$i ${DESTDIR}${includedir}/irs ; \
+ done
+ ${INSTALL_DATA} netdb.h ${DESTDIR}${includedir}/irs
+ ${INSTALL_DATA} platform.h ${DESTDIR}${includedir}/irs
+
+distclean::
+ rm -f netdb.h platform.h
diff --git a/contrib/bind9/lib/irs/include/irs/context.h b/contrib/bind9/lib/irs/include/irs/context.h
new file mode 100644
index 0000000..c49cfcf
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/context.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: context.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_CONTEXT_H
+#define IRS_CONTEXT_H 1
+
+/*! \file
+ *
+ * \brief
+ * The IRS context module provides an abstract interface to the DNS library
+ * with an application. An IRS context object initializes and holds various
+ * resources used in the DNS library.
+ */
+
+#include <dns/types.h>
+#include <irs/types.h>
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+irs_context_create(irs_context_t **contextp);
+/*%<
+ * Create an IRS context. It internally initializes the ISC and DNS libraries
+ * (if not yet), creates a DNS client object and initializes the client using
+ * the configuration files parsed via the 'resconf' and 'dnsconf' IRS modules.
+ * Some of the internally initialized objects can be used by the application
+ * via irs_context_getxxx() functions (see below).
+ *
+ * Requires:
+ *
+ *\li contextp != NULL && *contextp == NULL.
+ */
+
+isc_result_t
+irs_context_get(irs_context_t **contextp);
+/*%<
+ * Return an IRS context for the calling thread. If no IRS context is
+ * associated to the thread, this function creates a new one by calling
+ * irs_context_create(), and associates it with the thread as a thread specific
+ * data value. This function is provided for standard libraries that are
+ * expected to be thread-safe but do not accept an appropriate IRS context
+ * as a library parameter, e.g., getaddrinfo().
+ *
+ * Requires:
+ *
+ *\li contextp != NULL && *contextp == NULL.
+ */
+
+void
+irs_context_destroy(irs_context_t **contextp);
+/*%<
+ * Destroy an IRS context.
+ *
+ * Requires:
+ *
+ *\li '*contextp' is a valid IRS context.
+ *
+ * Ensures:
+ *\li '*contextp' == NULL.
+ */
+
+isc_mem_t *
+irs_context_getmctx(irs_context_t *context);
+/*%<
+ * Return the memory context held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_appctx_t *
+irs_context_getappctx(irs_context_t *context);
+/*%<
+ * Return the application context held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_taskmgr_t *
+irs_context_gettaskmgr(irs_context_t *context);
+/*%<
+ * Return the task manager held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_timermgr_t *
+irs_context_gettimermgr(irs_context_t *context);
+/*%<
+ * Return the timer manager held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+isc_task_t *
+irs_context_gettask(irs_context_t *context);
+/*%<
+ * Return the task object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+dns_client_t *
+irs_context_getdnsclient(irs_context_t *context);
+/*%<
+ * Return the DNS client object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+irs_resconf_t *
+irs_context_getresconf(irs_context_t *context);
+/*%<
+ * Return the resolver configuration object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+irs_dnsconf_t *
+irs_context_getdnsconf(irs_context_t *context);
+/*%<
+ * Return the advanced DNS configuration object held in the context.
+ *
+ * Requires:
+ *
+ *\li 'context' is a valid IRS context.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* IRS_CONTEXT_H */
diff --git a/contrib/bind9/lib/irs/include/irs/dnsconf.h b/contrib/bind9/lib/irs/include/irs/dnsconf.h
new file mode 100644
index 0000000..0041c16
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/dnsconf.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_DNSCONF_H
+#define IRS_DNSCONF_H 1
+
+/*! \file
+ *
+ * \brief
+ * The IRS dnsconf module parses an "advanced" configuration file related to
+ * the DNS library, such as trusted keys for DNSSEC validation, and creates
+ * the corresponding configuration objects for the DNS library modules.
+ *
+ * Notes:
+ * This module is very experimental and the configuration syntax or library
+ * interfaces may change in future versions. Currently, only the
+ * 'trusted-keys' statement is supported, whose syntax is the same as the
+ * same name of statement for named.conf.
+ */
+
+#include <irs/types.h>
+
+/*%
+ * A compound structure storing DNS key information mainly for DNSSEC
+ * validation. A dns_key_t object will be created using the 'keyname' and
+ * 'keydatabuf' members with the dst_key_fromdns() function.
+ */
+typedef struct irs_dnsconf_dnskey {
+ dns_name_t *keyname;
+ isc_buffer_t *keydatabuf;
+ ISC_LINK(struct irs_dnsconf_dnskey) link;
+} irs_dnsconf_dnskey_t;
+
+typedef ISC_LIST(irs_dnsconf_dnskey_t) irs_dnsconf_dnskeylist_t;
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+irs_dnsconf_load(isc_mem_t *mctx, const char *filename, irs_dnsconf_t **confp);
+/*%<
+ * Load the "advanced" DNS configuration file 'filename' in the "dns.conf"
+ * format, and create a new irs_dnsconf_t object from the configuration.
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'filename' != NULL
+ *
+ *\li 'confp' != NULL && '*confp' == NULL
+ */
+
+void
+irs_dnsconf_destroy(irs_dnsconf_t **confp);
+/*%<
+ * Destroy the dnsconf object.
+ *
+ * Requires:
+ *
+ *\li '*confp' is a valid dnsconf object.
+ *
+ * Ensures:
+ *
+ *\li *confp == NULL
+ */
+
+irs_dnsconf_dnskeylist_t *
+irs_dnsconf_gettrustedkeys(irs_dnsconf_t *conf);
+/*%<
+ * Return a list of key information stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid dnsconf object.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* IRS_DNSCONF_H */
diff --git a/contrib/bind9/lib/irs/include/irs/netdb.h.in b/contrib/bind9/lib/irs/include/irs/netdb.h.in
new file mode 100644
index 0000000..9dda413
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/netdb.h.in
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: netdb.h.in,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#ifndef IRS_NETDB_H
+#define IRS_NETDB_H 1
+
+#include <stddef.h> /* Required on FreeBSD (and others?) for size_t. */
+#include <netdb.h> /* Contractual provision. */
+
+/*
+ * Define if <netdb.h> does not declare struct addrinfo.
+ */
+@ISC_IRS_NEEDADDRINFO@
+
+#ifdef ISC_IRS_NEEDADDRINFO
+struct addrinfo {
+ int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
+ int ai_family; /* PF_xxx */
+ int ai_socktype; /* SOCK_xxx */
+ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+ size_t ai_addrlen; /* Length of ai_addr */
+ char *ai_canonname; /* Canonical name for hostname */
+ struct sockaddr *ai_addr; /* Binary address */
+ struct addrinfo *ai_next; /* Next structure in linked list */
+};
+#endif
+
+/*
+ * Undefine all #defines we are interested in as <netdb.h> may or may not have
+ * defined them.
+ */
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (left in extern int h_errno).
+ */
+
+#undef NETDB_INTERNAL
+#undef NETDB_SUCCESS
+#undef HOST_NOT_FOUND
+#undef TRY_AGAIN
+#undef NO_RECOVERY
+#undef NO_DATA
+#undef NO_ADDRESS
+
+#define NETDB_INTERNAL -1 /* see errno */
+#define NETDB_SUCCESS 0 /* no problem */
+#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */
+#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */
+#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
+#define NO_DATA 4 /* Valid name, no data record of requested type */
+#define NO_ADDRESS NO_DATA /* no address, look for MX record */
+
+/*
+ * Error return codes from getaddrinfo(). EAI_INSECUREDATA is our own extension
+ * and it's very unlikely to be already defined, but undef it just in case; it
+ * at least doesn't do any harm.
+ */
+
+#undef EAI_ADDRFAMILY
+#undef EAI_AGAIN
+#undef EAI_BADFLAGS
+#undef EAI_FAIL
+#undef EAI_FAMILY
+#undef EAI_MEMORY
+#undef EAI_NODATA
+#undef EAI_NONAME
+#undef EAI_SERVICE
+#undef EAI_SOCKTYPE
+#undef EAI_SYSTEM
+#undef EAI_BADHINTS
+#undef EAI_PROTOCOL
+#undef EAI_OVERFLOW
+#undef EAI_INSECUREDATA
+#undef EAI_MAX
+
+#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */
+#define EAI_AGAIN 2 /* temporary failure in name resolution */
+#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
+#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
+#define EAI_FAMILY 5 /* ai_family not supported */
+#define EAI_MEMORY 6 /* memory allocation failure */
+#define EAI_NODATA 7 /* no address associated with hostname */
+#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
+#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
+#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
+#define EAI_SYSTEM 11 /* system error returned in errno */
+#define EAI_BADHINTS 12
+#define EAI_PROTOCOL 13
+#define EAI_OVERFLOW 14
+#define EAI_INSECUREDATA 15
+#define EAI_MAX 16
+
+/*
+ * Flag values for getaddrinfo()
+ */
+#undef AI_PASSIVE
+#undef AI_CANONNAME
+#undef AI_NUMERICHOST
+
+#define AI_PASSIVE 0x00000001
+#define AI_CANONNAME 0x00000002
+#define AI_NUMERICHOST 0x00000004
+
+/*
+ * Flag values for getipnodebyname()
+ */
+#undef AI_V4MAPPED
+#undef AI_ALL
+#undef AI_ADDRCONFIG
+#undef AI_DEFAULT
+
+#define AI_V4MAPPED 0x00000008
+#define AI_ALL 0x00000010
+#define AI_ADDRCONFIG 0x00000020
+#define AI_DEFAULT (AI_V4MAPPED|AI_ADDRCONFIG)
+
+/*
+ * Constants for lwres_getnameinfo()
+ */
+#undef NI_MAXHOST
+#undef NI_MAXSERV
+
+#define NI_MAXHOST 1025
+#define NI_MAXSERV 32
+
+/*
+ * Flag values for lwres_getnameinfo()
+ */
+#undef NI_NOFQDN
+#undef NI_NUMERICHOST
+#undef NI_NAMEREQD
+#undef NI_NUMERICSERV
+#undef NI_DGRAM
+#undef NI_NUMERICSCOPE
+
+#define NI_NOFQDN 0x00000001
+#define NI_NUMERICHOST 0x00000002
+#define NI_NAMEREQD 0x00000004
+#define NI_NUMERICSERV 0x00000008
+#define NI_DGRAM 0x00000010
+
+/*
+ * Tell Emacs to use C mode on this file.
+ * Local variables:
+ * mode: c
+ * End:
+ */
+
+#endif /* IRS_NETDB_H */
diff --git a/contrib/bind9/lib/irs/include/irs/platform.h.in b/contrib/bind9/lib/irs/include/irs/platform.h.in
new file mode 100644
index 0000000..f61f671
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/platform.h.in
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: platform.h.in,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#ifndef IRS_PLATFORM_H
+#define IRS_PLATFORM_H 1
+
+/*****
+ ***** Platform-dependent defines.
+ *****/
+
+#ifndef IRS_PLATFORM_USEDECLSPEC
+#define LIBIRS_EXTERNAL_DATA
+#else
+#ifdef LIBIRS_EXPORTS
+#define LIBIRS_EXTERNAL_DATA __declspec(dllexport)
+#else
+#define LIBIRS_EXTERNAL_DATA __declspec(dllimport)
+#endif
+#endif
+
+/*
+ * Tell Emacs to use C mode on this file.
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+
+#endif /* IRS_PLATFORM_H */
diff --git a/contrib/bind9/lib/irs/include/irs/resconf.h b/contrib/bind9/lib/irs/include/irs/resconf.h
new file mode 100644
index 0000000..8249c7b
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/resconf.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: resconf.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_RESCONF_H
+#define IRS_RESCONF_H 1
+
+/*! \file
+ *
+ * \brief
+ * The IRS resconf module parses the legacy "/etc/resolv.conf" file and
+ * creates the corresponding configuration objects for the DNS library
+ * modules.
+ */
+
+#include <irs/types.h>
+
+/*%
+ * A DNS search list specified in the 'domain' or 'search' statements
+ * in the "resolv.conf" file.
+ */
+typedef struct irs_resconf_search {
+ char *domain;
+ ISC_LINK(struct irs_resconf_search) link;
+} irs_resconf_search_t;
+
+typedef ISC_LIST(irs_resconf_search_t) irs_resconf_searchlist_t;
+
+ISC_LANG_BEGINDECLS
+
+isc_result_t
+irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp);
+/*%<
+ * Load the resolver configuration file 'filename' in the "resolv.conf" format,
+ * and create a new irs_resconf_t object from the configuration.
+ *
+ * Notes:
+ *
+ *\li Currently, only the following options are supported:
+ * nameserver, domain, search, sortlist, ndots, and options.
+ * In addition, 'sortlist' is not actually effective; it's parsed, but
+ * the application cannot use the configuration.
+ *
+ * Requires:
+ *
+ *\li 'mctx' is a valid memory context.
+ *
+ *\li 'filename' != NULL
+ *
+ *\li 'confp' != NULL && '*confp' == NULL
+ */
+
+void
+irs_resconf_destroy(irs_resconf_t **confp);
+/*%<
+ * Destroy the resconf object.
+ *
+ * Requires:
+ *
+ *\li '*confp' is a valid resconf object.
+ *
+ * Ensures:
+ *
+ *\li *confp == NULL
+ */
+
+isc_sockaddrlist_t *
+irs_resconf_getnameservers(irs_resconf_t *conf);
+/*%<
+ * Return a list of name server addresses stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid resconf object.
+ */
+
+irs_resconf_searchlist_t *
+irs_resconf_getsearchlist(irs_resconf_t *conf);
+/*%<
+ * Return the search list stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid resconf object.
+ */
+
+unsigned int
+irs_resconf_getndots(irs_resconf_t *conf);
+/*%<
+ * Return the 'ndots' value stored in 'conf'.
+ *
+ * Requires:
+ *
+ *\li 'conf' is a valid resconf object.
+ */
+
+ISC_LANG_ENDDECLS
+
+#endif /* IRS_RESCONF_H */
diff --git a/contrib/bind9/lib/irs/include/irs/types.h b/contrib/bind9/lib/irs/include/irs/types.h
new file mode 100644
index 0000000..4b8a804
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/types.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: types.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+#ifndef IRS_TYPES_H
+#define IRS_TYPES_H 1
+
+/* Core Types. Alphabetized by defined type. */
+
+/*%< per-thread IRS context */
+typedef struct irs_context irs_context_t;
+/*%< resolv.conf configuration information */
+typedef struct irs_resconf irs_resconf_t;
+/*%< advanced DNS-related configuration information */
+typedef struct irs_dnsconf irs_dnsconf_t;
+
+#endif /* IRS_TYPES_H */
diff --git a/contrib/bind9/lib/irs/include/irs/version.h b/contrib/bind9/lib/irs/include/irs/version.h
new file mode 100644
index 0000000..f43aa14
--- /dev/null
+++ b/contrib/bind9/lib/irs/include/irs/version.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: version.h,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include <irs/platform.h>
+
+LIBIRS_EXTERNAL_DATA extern const char irs_version[];
+
+LIBIRS_EXTERNAL_DATA extern const unsigned int irs_libinterface;
+LIBIRS_EXTERNAL_DATA extern const unsigned int irs_librevision;
+LIBIRS_EXTERNAL_DATA extern const unsigned int irs_libage;
diff --git a/contrib/bind9/lib/irs/resconf.c b/contrib/bind9/lib/irs/resconf.c
new file mode 100644
index 0000000..af1413b
--- /dev/null
+++ b/contrib/bind9/lib/irs/resconf.c
@@ -0,0 +1,636 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: resconf.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file resconf.c */
+
+/**
+ * Module for parsing resolv.conf files (largely derived from lwconfig.c).
+ *
+ * irs_resconf_load() opens the file filename and parses it to initialize
+ * the configuration structure.
+ *
+ * \section lwconfig_return Return Values
+ *
+ * irs_resconf_load() returns #IRS_R_SUCCESS if it successfully read and
+ * parsed filename. It returns a non-0 error code if filename could not be
+ * opened or contained incorrect resolver statements.
+ *
+ * \section lwconfig_see See Also
+ *
+ * stdio(3), \link resolver resolver \endlink
+ *
+ * \section files Files
+ *
+ * /etc/resolv.conf
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/netaddr.h>
+#include <isc/sockaddr.h>
+#include <isc/util.h>
+
+#include <irs/resconf.h>
+
+#define IRS_RESCONF_MAGIC ISC_MAGIC('R', 'E', 'S', 'c')
+#define IRS_RESCONF_VALID(c) ISC_MAGIC_VALID(c, IRS_RESCONF_MAGIC)
+
+/*!
+ * protocol constants
+ */
+
+#if ! defined(NS_INADDRSZ)
+#define NS_INADDRSZ 4
+#endif
+
+#if ! defined(NS_IN6ADDRSZ)
+#define NS_IN6ADDRSZ 16
+#endif
+
+/*!
+ * resolv.conf parameters
+ */
+
+#define RESCONFMAXNAMESERVERS 3 /*%< max 3 "nameserver" entries */
+#define RESCONFMAXSEARCH 8 /*%< max 8 domains in "search" entry */
+#define RESCONFMAXLINELEN 256 /*%< max size of a line */
+#define RESCONFMAXSORTLIST 10 /*%< max 10 */
+
+/*!
+ * configuration data structure
+ */
+
+struct irs_resconf {
+ /*
+ * The configuration data is a thread-specific object, and does not
+ * need to be locked.
+ */
+ unsigned int magic;
+ isc_mem_t *mctx;
+
+ isc_sockaddrlist_t nameservers;
+ unsigned int numns; /*%< number of configured servers */
+
+ char *domainname;
+ char *search[RESCONFMAXSEARCH];
+ isc_uint8_t searchnxt; /*%< index for next free slot */
+
+ irs_resconf_searchlist_t searchlist;
+
+ struct {
+ isc_netaddr_t addr;
+ /*% mask has a non-zero 'family' if set */
+ isc_netaddr_t mask;
+ } sortlist[RESCONFMAXSORTLIST];
+ isc_uint8_t sortlistnxt;
+
+ /*%< non-zero if 'options debug' set */
+ isc_uint8_t resdebug;
+ /*%< set to n in 'options ndots:n' */
+ isc_uint8_t ndots;
+};
+
+static isc_result_t
+resconf_parsenameserver(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parsedomain(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parsesearch(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parsesortlist(irs_resconf_t *conf, FILE *fp);
+static isc_result_t
+resconf_parseoption(irs_resconf_t *ctx, FILE *fp);
+
+/*!
+ * Eat characters from FP until EOL or EOF. Returns EOF or '\n'
+ */
+static int
+eatline(FILE *fp) {
+ int ch;
+
+ ch = fgetc(fp);
+ while (ch != '\n' && ch != EOF)
+ ch = fgetc(fp);
+
+ return (ch);
+}
+
+/*!
+ * Eats white space up to next newline or non-whitespace character (of
+ * EOF). Returns the last character read. Comments are considered white
+ * space.
+ */
+static int
+eatwhite(FILE *fp) {
+ int ch;
+
+ ch = fgetc(fp);
+ while (ch != '\n' && ch != EOF && isspace((unsigned char)ch))
+ ch = fgetc(fp);
+
+ if (ch == ';' || ch == '#')
+ ch = eatline(fp);
+
+ return (ch);
+}
+
+/*!
+ * Skip over any leading whitespace and then read in the next sequence of
+ * non-whitespace characters. In this context newline is not considered
+ * whitespace. Returns EOF on end-of-file, or the character
+ * that caused the reading to stop.
+ */
+static int
+getword(FILE *fp, char *buffer, size_t size) {
+ int ch;
+ char *p = buffer;
+
+ REQUIRE(buffer != NULL);
+ REQUIRE(size > 0U);
+
+ *p = '\0';
+
+ ch = eatwhite(fp);
+
+ if (ch == EOF)
+ return (EOF);
+
+ do {
+ *p = '\0';
+
+ if (ch == EOF || isspace((unsigned char)ch))
+ break;
+ else if ((size_t) (p - buffer) == size - 1)
+ return (EOF); /* Not enough space. */
+
+ *p++ = (char)ch;
+ ch = fgetc(fp);
+ } while (1);
+
+ return (ch);
+}
+
+static isc_result_t
+add_server(isc_mem_t *mctx, const char *address_str,
+ isc_sockaddrlist_t *nameservers)
+{
+ int error;
+ isc_sockaddr_t *address = NULL;
+ struct addrinfo hints, *res;
+ isc_result_t result = ISC_R_SUCCESS;
+
+ res = NULL;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_protocol = IPPROTO_UDP;
+ hints.ai_flags = AI_NUMERICHOST;
+ error = getaddrinfo(address_str, "53", &hints, &res);
+ if (error != 0)
+ return (ISC_R_BADADDRESSFORM);
+
+ /* XXX: special case: treat all-0 IPv4 address as loopback */
+ if (res->ai_family == AF_INET) {
+ struct in_addr *v4;
+ unsigned char zeroaddress[] = {0, 0, 0, 0};
+ unsigned char loopaddress[] = {127, 0, 0, 1};
+
+ v4 = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
+ if (memcmp(v4, zeroaddress, 4) == 0)
+ memcpy(v4, loopaddress, 4);
+ }
+
+ address = isc_mem_get(mctx, sizeof(*address));
+ if (address == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto cleanup;
+ }
+ if (res->ai_addrlen > sizeof(address->type)) {
+ isc_mem_put(mctx, address, sizeof(*address));
+ result = ISC_R_RANGE;
+ goto cleanup;
+ }
+ address->length = res->ai_addrlen;
+ memcpy(&address->type.sa, res->ai_addr, res->ai_addrlen);
+ ISC_LINK_INIT(address, link);
+ ISC_LIST_APPEND(*nameservers, address, link);
+
+ cleanup:
+ freeaddrinfo(res);
+
+ return (result);
+}
+
+static isc_result_t
+create_addr(const char *buffer, isc_netaddr_t *addr, int convert_zero) {
+ struct in_addr v4;
+ struct in6_addr v6;
+
+ if (inet_aton(buffer, &v4) == 1) {
+ if (convert_zero) {
+ unsigned char zeroaddress[] = {0, 0, 0, 0};
+ unsigned char loopaddress[] = {127, 0, 0, 1};
+ if (memcmp(&v4, zeroaddress, 4) == 0)
+ memcpy(&v4, loopaddress, 4);
+ }
+ addr->family = AF_INET;
+ memcpy(&addr->type.in, &v4, NS_INADDRSZ);
+ addr->zone = 0;
+ } else if (inet_pton(AF_INET6, buffer, &v6) == 1) {
+ addr->family = AF_INET6;
+ memcpy(&addr->type.in6, &v6, NS_IN6ADDRSZ);
+ addr->zone = 0;
+ } else
+ return (ISC_R_BADADDRESSFORM); /* Unrecognised format. */
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsenameserver(irs_resconf_t *conf, FILE *fp) {
+ char word[RESCONFMAXLINELEN];
+ int cp;
+ isc_result_t result;
+
+ if (conf->numns == RESCONFMAXNAMESERVERS)
+ return (ISC_R_SUCCESS);
+
+ cp = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Nothing on line. */
+ else if (cp == ' ' || cp == '\t')
+ cp = eatwhite(fp);
+
+ if (cp != EOF && cp != '\n')
+ return (ISC_R_UNEXPECTEDTOKEN); /* Extra junk on line. */
+
+ result = add_server(conf->mctx, word, &conf->nameservers);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+ conf->numns++;
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsedomain(irs_resconf_t *conf, FILE *fp) {
+ char word[RESCONFMAXLINELEN];
+ int res, i;
+
+ res = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Nothing else on line. */
+ else if (res == ' ' || res == '\t')
+ res = eatwhite(fp);
+
+ if (res != EOF && res != '\n')
+ return (ISC_R_UNEXPECTEDTOKEN); /* Extra junk on line. */
+
+ if (conf->domainname != NULL)
+ isc_mem_free(conf->mctx, conf->domainname);
+
+ /*
+ * Search and domain are mutually exclusive.
+ */
+ for (i = 0; i < RESCONFMAXSEARCH; i++) {
+ if (conf->search[i] != NULL) {
+ isc_mem_free(conf->mctx, conf->search[i]);
+ conf->search[i] = NULL;
+ }
+ }
+ conf->searchnxt = 0;
+
+ conf->domainname = isc_mem_strdup(conf->mctx, word);
+ if (conf->domainname == NULL)
+ return (ISC_R_NOMEMORY);
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsesearch(irs_resconf_t *conf, FILE *fp) {
+ int idx, delim;
+ char word[RESCONFMAXLINELEN];
+
+ if (conf->domainname != NULL) {
+ /*
+ * Search and domain are mutually exclusive.
+ */
+ isc_mem_free(conf->mctx, conf->domainname);
+ conf->domainname = NULL;
+ }
+
+ /*
+ * Remove any previous search definitions.
+ */
+ for (idx = 0; idx < RESCONFMAXSEARCH; idx++) {
+ if (conf->search[idx] != NULL) {
+ isc_mem_free(conf->mctx, conf->search[idx]);
+ conf->search[idx] = NULL;
+ }
+ }
+ conf->searchnxt = 0;
+
+ delim = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Nothing else on line. */
+
+ idx = 0;
+ while (strlen(word) > 0U) {
+ if (conf->searchnxt == RESCONFMAXSEARCH)
+ goto ignore; /* Too many domains. */
+
+ conf->search[idx] = isc_mem_strdup(conf->mctx, word);
+ if (conf->search[idx] == NULL)
+ return (ISC_R_NOMEMORY);
+ idx++;
+ conf->searchnxt++;
+
+ ignore:
+ if (delim == EOF || delim == '\n')
+ break;
+ else
+ delim = getword(fp, word, sizeof(word));
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parsesortlist(irs_resconf_t *conf, FILE *fp) {
+ int delim, res, idx;
+ char word[RESCONFMAXLINELEN];
+ char *p;
+
+ delim = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Empty line after keyword. */
+
+ while (strlen(word) > 0U) {
+ if (conf->sortlistnxt == RESCONFMAXSORTLIST)
+ return (ISC_R_QUOTA); /* Too many values. */
+
+ p = strchr(word, '/');
+ if (p != NULL)
+ *p++ = '\0';
+
+ idx = conf->sortlistnxt;
+ res = create_addr(word, &conf->sortlist[idx].addr, 1);
+ if (res != ISC_R_SUCCESS)
+ return (res);
+
+ if (p != NULL) {
+ res = create_addr(p, &conf->sortlist[idx].mask, 0);
+ if (res != ISC_R_SUCCESS)
+ return (res);
+ } else {
+ /*
+ * Make up a mask. (XXX: is this correct?)
+ */
+ conf->sortlist[idx].mask = conf->sortlist[idx].addr;
+ memset(&conf->sortlist[idx].mask.type, 0xff,
+ sizeof(conf->sortlist[idx].mask.type));
+ }
+
+ conf->sortlistnxt++;
+
+ if (delim == EOF || delim == '\n')
+ break;
+ else
+ delim = getword(fp, word, sizeof(word));
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+resconf_parseoption(irs_resconf_t *conf, FILE *fp) {
+ int delim;
+ long ndots;
+ char *p;
+ char word[RESCONFMAXLINELEN];
+
+ delim = getword(fp, word, sizeof(word));
+ if (strlen(word) == 0U)
+ return (ISC_R_UNEXPECTEDEND); /* Empty line after keyword. */
+
+ while (strlen(word) > 0U) {
+ if (strcmp("debug", word) == 0) {
+ conf->resdebug = 1;
+ } else if (strncmp("ndots:", word, 6) == 0) {
+ ndots = strtol(word + 6, &p, 10);
+ if (*p != '\0') /* Bad string. */
+ return (ISC_R_UNEXPECTEDTOKEN);
+ if (ndots < 0 || ndots > 0xff) /* Out of range. */
+ return (ISC_R_RANGE);
+ conf->ndots = (isc_uint8_t)ndots;
+ }
+
+ if (delim == EOF || delim == '\n')
+ break;
+ else
+ delim = getword(fp, word, sizeof(word));
+ }
+
+ return (ISC_R_SUCCESS);
+}
+
+static isc_result_t
+add_search(irs_resconf_t *conf, char *domain) {
+ irs_resconf_search_t *entry;
+
+ entry = isc_mem_get(conf->mctx, sizeof(*entry));
+ if (entry == NULL)
+ return (ISC_R_NOMEMORY);
+
+ entry->domain = domain;
+ ISC_LINK_INIT(entry, link);
+ ISC_LIST_APPEND(conf->searchlist, entry, link);
+
+ return (ISC_R_SUCCESS);
+}
+
+/*% parses a file and fills in the data structure. */
+isc_result_t
+irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp)
+{
+ FILE *fp = NULL;
+ char word[256];
+ isc_result_t rval, ret;
+ irs_resconf_t *conf;
+ int i, stopchar;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(filename != NULL);
+ REQUIRE(strlen(filename) > 0U);
+ REQUIRE(confp != NULL && *confp == NULL);
+
+ conf = isc_mem_get(mctx, sizeof(*conf));
+ if (conf == NULL)
+ return (ISC_R_NOMEMORY);
+
+ conf->mctx = mctx;
+ ISC_LIST_INIT(conf->nameservers);
+ conf->numns = 0;
+ conf->domainname = NULL;
+ conf->searchnxt = 0;
+ conf->resdebug = 0;
+ conf->ndots = 1;
+ for (i = 0; i < RESCONFMAXSEARCH; i++)
+ conf->search[i] = NULL;
+
+ errno = 0;
+ if ((fp = fopen(filename, "r")) == NULL) {
+ isc_mem_put(mctx, conf, sizeof(*conf));
+ return (ISC_R_INVALIDFILE);
+ }
+
+ ret = ISC_R_SUCCESS;
+ do {
+ stopchar = getword(fp, word, sizeof(word));
+ if (stopchar == EOF) {
+ rval = ISC_R_SUCCESS;
+ break;
+ }
+
+ if (strlen(word) == 0U)
+ rval = ISC_R_SUCCESS;
+ else if (strcmp(word, "nameserver") == 0)
+ rval = resconf_parsenameserver(conf, fp);
+ else if (strcmp(word, "domain") == 0)
+ rval = resconf_parsedomain(conf, fp);
+ else if (strcmp(word, "search") == 0)
+ rval = resconf_parsesearch(conf, fp);
+ else if (strcmp(word, "sortlist") == 0)
+ rval = resconf_parsesortlist(conf, fp);
+ else if (strcmp(word, "options") == 0)
+ rval = resconf_parseoption(conf, fp);
+ else {
+ /* unrecognised word. Ignore entire line */
+ rval = ISC_R_SUCCESS;
+ stopchar = eatline(fp);
+ if (stopchar == EOF) {
+ break;
+ }
+ }
+ if (ret == ISC_R_SUCCESS && rval != ISC_R_SUCCESS)
+ ret = rval;
+ } while (1);
+
+ fclose(fp);
+
+ /* If we don't find a nameserver fall back to localhost */
+ if (conf->numns == 0) {
+ INSIST(ISC_LIST_EMPTY(conf->nameservers));
+
+ /* XXX: should we catch errors? */
+ (void)add_server(conf->mctx, "127.0.0.1", &conf->nameservers);
+ (void)add_server(conf->mctx, "::1", &conf->nameservers);
+ }
+
+ /*
+ * Construct unified search list from domain or configured
+ * search list
+ */
+ ISC_LIST_INIT(conf->searchlist);
+ if (conf->domainname != NULL) {
+ ret = add_search(conf, conf->domainname);
+ } else if (conf->searchnxt > 0) {
+ for (i = 0; i < conf->searchnxt; i++) {
+ ret = add_search(conf, conf->search[i]);
+ if (ret != ISC_R_SUCCESS)
+ break;
+ }
+ }
+
+ conf->magic = IRS_RESCONF_MAGIC;
+
+ if (ret != ISC_R_SUCCESS)
+ irs_resconf_destroy(&conf);
+ else
+ *confp = conf;
+
+ return (ret);
+}
+
+void
+irs_resconf_destroy(irs_resconf_t **confp) {
+ irs_resconf_t *conf;
+ isc_sockaddr_t *address;
+ irs_resconf_search_t *searchentry;
+ int i;
+
+ REQUIRE(confp != NULL);
+ conf = *confp;
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ while ((searchentry = ISC_LIST_HEAD(conf->searchlist)) != NULL) {
+ ISC_LIST_UNLINK(conf->searchlist, searchentry, link);
+ isc_mem_put(conf->mctx, searchentry, sizeof(*searchentry));
+ }
+
+ while ((address = ISC_LIST_HEAD(conf->nameservers)) != NULL) {
+ ISC_LIST_UNLINK(conf->nameservers, address, link);
+ isc_mem_put(conf->mctx, address, sizeof(*address));
+ }
+
+ if (conf->domainname != NULL)
+ isc_mem_free(conf->mctx, conf->domainname);
+
+ for (i = 0; i < RESCONFMAXSEARCH; i++) {
+ if (conf->search[i] != NULL)
+ isc_mem_free(conf->mctx, conf->search[i]);
+ }
+
+ isc_mem_put(conf->mctx, conf, sizeof(*conf));
+
+ *confp = NULL;
+}
+
+isc_sockaddrlist_t *
+irs_resconf_getnameservers(irs_resconf_t *conf) {
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ return (&conf->nameservers);
+}
+
+irs_resconf_searchlist_t *
+irs_resconf_getsearchlist(irs_resconf_t *conf) {
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ return (&conf->searchlist);
+}
+
+unsigned int
+irs_resconf_getndots(irs_resconf_t *conf) {
+ REQUIRE(IRS_RESCONF_VALID(conf));
+
+ return ((unsigned int)conf->ndots);
+}
diff --git a/contrib/bind9/lib/irs/version.c b/contrib/bind9/lib/irs/version.c
new file mode 100644
index 0000000..b27de99
--- /dev/null
+++ b/contrib/bind9/lib/irs/version.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: version.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include <irs/version.h>
+
+const char irs_version[] = VERSION;
+
+const unsigned int irs_libinterface = LIBINTERFACE;
+const unsigned int irs_librevision = LIBREVISION;
+const unsigned int irs_libage = LIBAGE;
diff --git a/contrib/bind9/lib/isc/Makefile.in b/contrib/bind9/lib/isc/Makefile.in
index d831fcf..d92c0b8 100644
--- a/contrib/bind9/lib/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.96.50.6 2010-06-09 01:52:54 marka Exp $
+# $Id: Makefile.in,v 1.109 2010-06-09 01:43:09 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -27,8 +27,8 @@ CINCLUDES = -I${srcdir}/unix/include \
-I${srcdir}/@ISC_THREAD_DIR@/include \
-I${srcdir}/@ISC_ARCH_DIR@/include \
-I./include \
- -I${srcdir}/include
-CDEFINES =
+ -I${srcdir}/include @ISC_OPENSSL_INC@
+CDEFINES = @USE_OPENSSL@
CWARNINGS =
# Alphabetically
@@ -39,7 +39,6 @@ UNIXOBJS = @ISC_ISCIPV6_O@ \
unix/os.@O@ unix/resource.@O@ unix/socket.@O@ unix/stdio.@O@ \
unix/stdtime.@O@ unix/strerror.@O@ unix/syslog.@O@ unix/time.@O@
-
NLSOBJS = nls/msgcat.@O@
THREADOPTOBJS = @ISC_THREAD_DIR@/condition.@O@ @ISC_THREAD_DIR@/mutex.@O@
@@ -52,8 +51,9 @@ WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/file.@O@ \
# Alphabetically
OBJS = @ISC_EXTRA_OBJS@ \
- assertions.@O@ base32.@O@ base64.@O@ bitstring.@O@ buffer.@O@ \
- bufferlist.@O@ commandline.@O@ error.@O@ event.@O@ \
+ assertions.@O@ backtrace.@O@ base32.@O@ base64.@O@ \
+ bitstring.@O@ buffer.@O@ bufferlist.@O@ commandline.@O@ \
+ error.@O@ event.@O@ \
hash.@O@ heap.@O@ hex.@O@ hmacmd5.@O@ hmacsha.@O@ \
httpd.@O@ inet_aton.@O@ iterated_hash.@O@ \
lex.@O@ lfsr.@O@ lib.@O@ log.@O@ \
@@ -64,11 +64,12 @@ OBJS = @ISC_EXTRA_OBJS@ \
serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ \
string.@O@ strtoul.@O@ symtab.@O@ task.@O@ taskpool.@O@ \
timer.@O@ version.@O@ ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
+SYMTBLOBJS = backtrace-emptytbl.@O@
# Alphabetically
SRCS = @ISC_EXTRA_SRCS@ \
- assertions.c base32.c base64.c bitstring.c buffer.c \
- bufferlist.c commandline.c error.c event.c \
+ assertions.c backtrace.c base32.c base64.c bitstring.c \
+ buffer.c bufferlist.c commandline.c error.c event.c \
heap.c hex.c hmacmd5.c hmacsha.c \
httpd.c inet_aton.c iterated_hash.c \
lex.c lfsr.c lib.c log.c \
@@ -77,7 +78,7 @@ SRCS = @ISC_EXTRA_SRCS@ \
parseint.c portset.c quota.c radix.c random.c \
ratelimiter.c refcount.c region.c result.c rwlock.c \
serial.c sha1.c sha2.c sockaddr.c stats.c string.c strtoul.c \
- symtab.c task.c taskpool.c timer.c version.c
+ symtab.c symtbl-empty.c task.c taskpool.c timer.c version.c
LIBS = @LIBS@
@@ -98,17 +99,27 @@ version.@O@: version.c
-DLIBAGE=${LIBAGE} \
-c ${srcdir}/version.c
-libisc.@SA@: ${OBJS}
+libisc.@SA@: ${OBJS} ${SYMTBLOBJS}
+ ${AR} ${ARFLAGS} $@ ${OBJS} ${SYMTBLOBJS}
+ ${RANLIB} $@
+
+libisc-nosymtbl.@SA@: ${OBJS}
${AR} ${ARFLAGS} $@ ${OBJS}
${RANLIB} $@
-libisc.la: ${OBJS}
+libisc.la: ${OBJS} ${SYMTBLOBJS}
${LIBTOOL_MODE_LINK} \
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc.la -rpath ${libdir} \
-version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
+ ${OBJS} ${SYMTBLOBJS} ${LIBS}
+
+libisc-nosymtbl.la: ${OBJS}
+ ${LIBTOOL_MODE_LINK} \
+ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc-nosymtbl.la -rpath ${libdir} \
+ -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
${OBJS} ${LIBS}
-timestamp: libisc.@A@
+timestamp: libisc.@A@ libisc-nosymtbl.@A@
touch timestamp
installdirs:
@@ -118,4 +129,5 @@ install:: timestamp installdirs
${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisc.@A@ ${DESTDIR}${libdir}
clean distclean::
- rm -f libisc.@A@ libisc.la timestamp
+ rm -f libisc.@A@ libisc-nosymtbl.@A@ libisc.la \
+ libisc-nosymtbl.la timestamp
diff --git a/contrib/bind9/lib/isc/alpha/include/isc/atomic.h b/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
index bb4f1ad..012c955 100644
--- a/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: atomic.h,v 1.5.332.2 2009-04-08 06:47:32 tbox Exp $ */
+/* $Id: atomic.h,v 1.7 2009-04-08 06:48:23 tbox Exp $ */
/*
* This code was written based on FreeBSD's kernel source whose copyright
diff --git a/contrib/bind9/lib/isc/api b/contrib/bind9/lib/isc/api
index e1f7b71..b91b130 100644
--- a/contrib/bind9/lib/isc/api
+++ b/contrib/bind9/lib/isc/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 54
-LIBREVISION = 1
-LIBAGE = 4
+LIBINTERFACE = 81
+LIBREVISION = 2
+LIBAGE = 0
diff --git a/contrib/bind9/lib/isc/app_api.c b/contrib/bind9/lib/isc/app_api.c
new file mode 100644
index 0000000..b2a2f14
--- /dev/null
+++ b/contrib/bind9/lib/isc/app_api.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: app_api.c,v 1.5 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_appctxcreatefunc_t appctx_createfunc = NULL;
+
+#define ISCAPI_APPMETHODS_VALID(m) ISC_MAGIC_VALID(m, ISCAPI_APPMETHODS_MAGIC)
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_app_register(isc_appctxcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (appctx_createfunc == NULL)
+ appctx_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(appctx_createfunc != NULL);
+ result = (*appctx_createfunc)(mctx, ctxp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_appctx_destroy(isc_appctx_t **ctxp) {
+ REQUIRE(ctxp != NULL && ISCAPI_APPCTX_VALID(*ctxp));
+
+ (*ctxp)->methods->ctxdestroy(ctxp);
+
+ ENSURE(*ctxp == NULL);
+}
+
+isc_result_t
+isc_app_ctxstart(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxstart(ctx));
+}
+
+isc_result_t
+isc_app_ctxrun(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxrun(ctx));
+}
+
+isc_result_t
+isc_app_ctxsuspend(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxsuspend(ctx));
+}
+
+isc_result_t
+isc_app_ctxshutdown(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ return (ctx->methods->ctxshutdown(ctx));
+}
+
+void
+isc_app_ctxfinish(isc_appctx_t *ctx) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+
+ ctx->methods->ctxfinish(ctx);
+}
+
+void
+isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+ REQUIRE(taskmgr != NULL);
+
+ ctx->methods->settaskmgr(ctx, taskmgr);
+}
+
+void
+isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+ REQUIRE(socketmgr != NULL);
+
+ ctx->methods->setsocketmgr(ctx, socketmgr);
+}
+
+void
+isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr) {
+ REQUIRE(ISCAPI_APPCTX_VALID(ctx));
+ REQUIRE(timermgr != NULL);
+
+ ctx->methods->settimermgr(ctx, timermgr);
+}
diff --git a/contrib/bind9/lib/isc/assertions.c b/contrib/bind9/lib/isc/assertions.c
index b98d61d..fe082b7 100644
--- a/contrib/bind9/lib/isc/assertions.c
+++ b/contrib/bind9/lib/isc/assertions.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: assertions.c,v 1.23 2008-10-15 23:47:31 tbox Exp $ */
+/* $Id: assertions.c,v 1.26 2009-09-29 15:06:07 fdupont Exp $ */
/*! \file */
@@ -25,29 +25,47 @@
#include <stdlib.h>
#include <isc/assertions.h>
+#include <isc/backtrace.h>
#include <isc/msgs.h>
+#include <isc/result.h>
+
+/*
+ * The maximum number of stack frames to dump on assertion failure.
+ */
+#ifndef BACKTRACE_MAXFRAME
+#define BACKTRACE_MAXFRAME 128
+#endif
/*%
* Forward.
*/
-/* coverity[+kill] */
static void
default_callback(const char *, int, isc_assertiontype_t, const char *);
+static isc_assertioncallback_t isc_assertion_failed_cb = default_callback;
+
/*%
* Public.
*/
-LIBISC_EXTERNAL_DATA isc_assertioncallback_t isc_assertion_failed =
- default_callback;
+/*% assertion failed handler */
+/* coverity[+kill] */
+void
+isc_assertion_failed(const char *file, int line, isc_assertiontype_t type,
+ const char *cond)
+{
+ isc_assertion_failed_cb(file, line, type, cond);
+ abort();
+ /* NOTREACHED */
+}
/*% Set callback. */
void
isc_assertion_setcallback(isc_assertioncallback_t cb) {
if (cb == NULL)
- isc_assertion_failed = default_callback;
+ isc_assertion_failed_cb = default_callback;
else
- isc_assertion_failed = cb;
+ isc_assertion_failed_cb = cb;
}
/*% Type to Text */
@@ -87,11 +105,35 @@ static void
default_callback(const char *file, int line, isc_assertiontype_t type,
const char *cond)
{
- fprintf(stderr, "%s:%d: %s(%s) %s.\n",
+ void *tracebuf[BACKTRACE_MAXFRAME];
+ int i, nframes;
+ const char *logsuffix = ".";
+ const char *fname;
+ isc_result_t result;
+
+ result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME, &nframes);
+ if (result == ISC_R_SUCCESS && nframes > 0)
+ logsuffix = ", back trace";
+
+ fprintf(stderr, "%s:%d: %s(%s) %s%s\n",
file, line, isc_assertion_typetotext(type), cond,
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
+ ISC_MSG_FAILED, "failed"), logsuffix);
+ if (result == ISC_R_SUCCESS) {
+ for (i = 0; i < nframes; i++) {
+ unsigned long offset;
+
+ fname = NULL;
+ result = isc_backtrace_getsymbol(tracebuf[i], &fname,
+ &offset);
+ if (result == ISC_R_SUCCESS) {
+ fprintf(stderr, "#%d %p in %s()+0x%lx\n", i,
+ tracebuf[i], fname, offset);
+ } else {
+ fprintf(stderr, "#%d %p in ??\n", i,
+ tracebuf[i]);
+ }
+ }
+ }
fflush(stderr);
- abort();
- /* NOTREACHED */
}
diff --git a/contrib/bind9/lib/isc/backtrace-emptytbl.c b/contrib/bind9/lib/isc/backtrace-emptytbl.c
new file mode 100644
index 0000000..2743030
--- /dev/null
+++ b/contrib/bind9/lib/isc/backtrace-emptytbl.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace-emptytbl.c,v 1.3 2009-09-01 20:13:44 each Exp $ */
+
+/*! \file */
+
+/*
+ * This file defines an empty (default) symbol table used in backtrace.c
+ * If the application wants to have a complete symbol table, it should redefine
+ * isc__backtrace_symtable with the complete table in some way, and link the
+ * version of the library not including this definition
+ * (e.g. libisc-nosymbol.a).
+ */
+
+#include <config.h>
+
+#include <isc/backtrace.h>
+
+const int isc__backtrace_nsymbols = 0;
+const isc_backtrace_symmap_t isc__backtrace_symtable[] = { { NULL, "" } };
diff --git a/contrib/bind9/lib/isc/backtrace.c b/contrib/bind9/lib/isc/backtrace.c
new file mode 100644
index 0000000..7b5ddfe
--- /dev/null
+++ b/contrib/bind9/lib/isc/backtrace.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */
+
+/*! \file */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+#ifdef HAVE_LIBCTRACE
+#include <execinfo.h>
+#endif
+
+#include <isc/backtrace.h>
+#include <isc/result.h>
+#include <isc/util.h>
+
+#ifdef ISC_PLATFORM_USEBACKTRACE
+/*
+ * Getting a back trace of a running process is tricky and highly platform
+ * dependent. Our current approach is as follows:
+ * 1. If the system library supports the "backtrace()" function, use it.
+ * 2. Otherwise, if the compiler is gcc and the architecture is x86_64 or IA64,
+ * then use gcc's (hidden) Unwind_Backtrace() function. Note that this
+ * function doesn't work for C programs on many other architectures.
+ * 3. Otherwise, if the architecture x86 or x86_64, try to unwind the stack
+ * frame following frame pointers. This assumes the executable binary
+ * compiled with frame pointers; this is not always true for x86_64 (rather,
+ * compiler optimizations often disable frame pointers). The validation
+ * checks in getnextframeptr() hopefully rejects bogus values stored in
+ * the RBP register in such a case. If the backtrace function itself crashes
+ * due to this problem, the whole package should be rebuilt with
+ * --disable-backtrace.
+ */
+#ifdef HAVE_LIBCTRACE
+#define BACKTRACE_LIBC
+#elif defined(__GNUC__) && (defined(__x86_64__) || defined(__ia64__))
+#define BACKTRACE_GCC
+#elif defined(__x86_64__) || defined(__i386__)
+#define BACKTRACE_X86STACK
+#else
+#define BACKTRACE_DISABLED
+#endif /* HAVE_LIBCTRACE */
+#else /* !ISC_PLATFORM_USEBACKTRACE */
+#define BACKTRACE_DISABLED
+#endif /* ISC_PLATFORM_USEBACKTRACE */
+
+#ifdef BACKTRACE_LIBC
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ int n;
+
+ /*
+ * Validate the arguments: intentionally avoid using REQUIRE().
+ * See notes in backtrace.h.
+ */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+ /*
+ * backtrace(3) includes this function itself in the address array,
+ * which should be eliminated from the returned sequence.
+ */
+ n = backtrace(addrs, maxaddrs);
+ if (n < 2)
+ return (ISC_R_NOTFOUND);
+ n--;
+ memmove(addrs, &addrs[1], sizeof(void *) * n);
+ *nframes = n;
+ return (ISC_R_SUCCESS);
+}
+#elif defined(BACKTRACE_GCC)
+extern int _Unwind_Backtrace(void* fn, void* a);
+extern void* _Unwind_GetIP(void* ctx);
+
+typedef struct {
+ void **result;
+ int max_depth;
+ int skip_count;
+ int count;
+} trace_arg_t;
+
+static int
+btcallback(void *uc, void *opq) {
+ trace_arg_t *arg = (trace_arg_t *)opq;
+
+ if (arg->skip_count > 0)
+ arg->skip_count--;
+ else
+ arg->result[arg->count++] = (void *)_Unwind_GetIP(uc);
+ if (arg->count == arg->max_depth)
+ return (5); /* _URC_END_OF_STACK */
+
+ return (0); /* _URC_NO_REASON */
+}
+
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ trace_arg_t arg;
+
+ /* Argument validation: see above. */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+ arg.skip_count = 1;
+ arg.result = addrs;
+ arg.max_depth = maxaddrs;
+ arg.count = 0;
+ _Unwind_Backtrace(btcallback, &arg);
+
+ *nframes = arg.count;
+
+ return (ISC_R_SUCCESS);
+}
+#elif defined(BACKTRACE_X86STACK)
+#ifdef __x86_64__
+static unsigned long
+getrbp() {
+ __asm("movq %rbp, %rax\n");
+}
+#endif
+
+static void **
+getnextframeptr(void **sp) {
+ void **newsp = (void **)*sp;
+
+ /*
+ * Perform sanity check for the new frame pointer, derived from
+ * google glog. This can actually be bogus depending on compiler.
+ */
+
+ /* prohibit the stack frames from growing downwards */
+ if (newsp <= sp)
+ return (NULL);
+
+ /* A heuristics to reject "too large" frame: this actually happened. */
+ if ((char *)newsp - (char *)sp > 100000)
+ return (NULL);
+
+ /*
+ * Not sure if other checks used in glog are needed at this moment.
+ * For our purposes we don't have to consider non-contiguous frames,
+ * for example.
+ */
+
+ return (newsp);
+}
+
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ int i = 0;
+ void **sp;
+
+ /* Argument validation: see above. */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+#ifdef __x86_64__
+ sp = (void **)getrbp();
+ if (sp == NULL)
+ return (ISC_R_NOTFOUND);
+ /*
+ * sp is the frame ptr of this function itself due to the call to
+ * getrbp(), so need to unwind one frame for consistency.
+ */
+ sp = getnextframeptr(sp);
+#else
+ /*
+ * i386: the frame pointer is stored 2 words below the address for the
+ * first argument. Note that the body of this function cannot be
+ * inlined since it depends on the address of the function argument.
+ */
+ sp = (void **)&addrs - 2;
+#endif
+
+ while (sp != NULL && i < maxaddrs) {
+ addrs[i++] = *(sp + 1);
+ sp = getnextframeptr(sp);
+ }
+
+ *nframes = i;
+
+ return (ISC_R_SUCCESS);
+}
+#elif defined(BACKTRACE_DISABLED)
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes) {
+ /* Argument validation: see above. */
+ if (addrs == NULL || nframes == NULL)
+ return (ISC_R_FAILURE);
+
+ UNUSED(maxaddrs);
+
+ return (ISC_R_NOTIMPLEMENTED);
+}
+#endif
+
+isc_result_t
+isc_backtrace_getsymbolfromindex(int index, const void **addrp,
+ const char **symbolp)
+{
+ REQUIRE(addrp != NULL && *addrp == NULL);
+ REQUIRE(symbolp != NULL && *symbolp == NULL);
+
+ if (index < 0 || index >= isc__backtrace_nsymbols)
+ return (ISC_R_RANGE);
+
+ *addrp = isc__backtrace_symtable[index].addr;
+ *symbolp = isc__backtrace_symtable[index].symbol;
+ return (ISC_R_SUCCESS);
+}
+
+static int
+symtbl_compare(const void *addr, const void *entryarg) {
+ const isc_backtrace_symmap_t *entry = entryarg;
+ const isc_backtrace_symmap_t *end =
+ &isc__backtrace_symtable[isc__backtrace_nsymbols - 1];
+
+ if (isc__backtrace_nsymbols == 1 || entry == end) {
+ if (addr >= entry->addr) {
+ /*
+ * If addr is equal to or larger than that of the last
+ * entry of the table, we cannot be sure if this is
+ * within a valid range so we consider it valid.
+ */
+ return (0);
+ }
+ return (-1);
+ }
+
+ /* entry + 1 is a valid entry from now on. */
+ if (addr < entry->addr)
+ return (-1);
+ else if (addr >= (entry + 1)->addr)
+ return (1);
+ return (0);
+}
+
+isc_result_t
+isc_backtrace_getsymbol(const void *addr, const char **symbolp,
+ unsigned long *offsetp)
+{
+ isc_result_t result = ISC_R_SUCCESS;
+ isc_backtrace_symmap_t *found;
+
+ /*
+ * Validate the arguments: intentionally avoid using REQUIRE().
+ * See notes in backtrace.h.
+ */
+ if (symbolp == NULL || *symbolp != NULL || offsetp == NULL)
+ return (ISC_R_FAILURE);
+
+ if (isc__backtrace_nsymbols < 1)
+ return (ISC_R_NOTFOUND);
+
+ /*
+ * Search the table for the entry that meets:
+ * entry.addr <= addr < next_entry.addr.
+ */
+ found = bsearch(addr, isc__backtrace_symtable, isc__backtrace_nsymbols,
+ sizeof(isc__backtrace_symtable[0]), symtbl_compare);
+ if (found == NULL)
+ result = ISC_R_NOTFOUND;
+ else {
+ *symbolp = found->symbol;
+ *offsetp = (const char *)addr - (char *)found->addr;
+ }
+
+ return (result);
+}
diff --git a/contrib/bind9/lib/isc/base32.c b/contrib/bind9/lib/isc/base32.c
index 5e5cbd9..7621920 100644
--- a/contrib/bind9/lib/isc/base32.c
+++ b/contrib/bind9/lib/isc/base32.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: base32.c,v 1.3.116.3 2009-10-21 01:22:47 each Exp $ */
+/* $Id: base32.c,v 1.6 2009-10-21 01:22:29 each Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/base64.c b/contrib/bind9/lib/isc/base64.c
index 858525f..ee34c3c 100644
--- a/contrib/bind9/lib/isc/base64.c
+++ b/contrib/bind9/lib/isc/base64.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: base64.c,v 1.32.332.2 2009-10-21 23:47:20 tbox Exp $ */
+/* $Id: base64.c,v 1.34 2009-10-21 23:48:05 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/entropy.c b/contrib/bind9/lib/isc/entropy.c
index af8757f..8d273d2 100644
--- a/contrib/bind9/lib/isc/entropy.c
+++ b/contrib/bind9/lib/isc/entropy.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.c,v 1.18.332.4 2010-08-10 23:46:54 tbox Exp $ */
+/* $Id: entropy.c,v 1.22 2010-08-10 23:48:19 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/isc/hash.c b/contrib/bind9/lib/isc/hash.c
index 7c0fcea..44975e7 100644
--- a/contrib/bind9/lib/isc/hash.c
+++ b/contrib/bind9/lib/isc/hash.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hash.c,v 1.13.332.3 2009-05-07 23:47:12 tbox Exp $ */
+/* $Id: hash.c,v 1.16 2009-09-01 00:22:28 jinmei Exp $ */
/*! \file
* Some portion of this code was derived from universal hash function
@@ -194,8 +194,12 @@ isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy,
hctx->vectorlen = vlen;
hctx->rndvector = rv;
+#ifdef BIND9
if (entropy != NULL)
isc_entropy_attach(entropy, &hctx->entropy);
+#else
+ UNUSED(entropy);
+#endif
*hctxp = hctx;
return (ISC_R_SUCCESS);
@@ -236,18 +240,22 @@ isc_hash_create(isc_mem_t *mctx, isc_entropy_t *entropy, size_t limit) {
void
isc_hash_ctxinit(isc_hash_t *hctx) {
- isc_result_t result;
-
LOCK(&hctx->lock);
if (hctx->initialized == ISC_TRUE)
goto out;
if (hctx->entropy) {
+#ifdef BIND9
+ isc_result_t result;
+
result = isc_entropy_getdata(hctx->entropy,
hctx->rndvector, hctx->vectorlen,
NULL, 0);
INSIST(result == ISC_R_SUCCESS);
+#else
+ INSIST(0);
+#endif
} else {
isc_uint32_t pr;
unsigned int i, copylen;
@@ -293,6 +301,7 @@ static void
destroy(isc_hash_t **hctxp) {
isc_hash_t *hctx;
isc_mem_t *mctx;
+ unsigned char canary0[4], canary1[4];
REQUIRE(hctxp != NULL && *hctxp != NULL);
hctx = *hctxp;
@@ -303,8 +312,10 @@ destroy(isc_hash_t **hctxp) {
isc_refcount_destroy(&hctx->refcnt);
mctx = hctx->mctx;
+#ifdef BIND9
if (hctx->entropy != NULL)
isc_entropy_detach(&hctx->entropy);
+#endif
if (hctx->rndvector != NULL)
isc_mem_put(mctx, hctx->rndvector, hctx->vectorlen);
@@ -312,7 +323,10 @@ destroy(isc_hash_t **hctxp) {
DESTROYLOCK(&hctx->lock);
+ memcpy(canary0, hctx + 1, sizeof(canary0));
memset(hctx, 0, sizeof(isc_hash_t));
+ memcpy(canary1, hctx + 1, sizeof(canary1));
+ INSIST(memcmp(canary0, canary1, sizeof(canary0)) == 0);
isc_mem_put(mctx, hctx, sizeof(isc_hash_t));
isc_mem_detach(&mctx);
}
diff --git a/contrib/bind9/lib/isc/heap.c b/contrib/bind9/lib/isc/heap.c
index 68f8ba8..4dead3f 100644
--- a/contrib/bind9/lib/isc/heap.c
+++ b/contrib/bind9/lib/isc/heap.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.c,v 1.37.240.3 2010-02-04 23:47:46 tbox Exp $ */
+/* $Id: heap.c,v 1.39 2010-02-04 23:49:13 tbox Exp $ */
/*! \file
* Heap implementation of priority queues adapted from the following:
diff --git a/contrib/bind9/lib/isc/hmacmd5.c b/contrib/bind9/lib/isc/hmacmd5.c
index b1d5906..10e87c9 100644
--- a/contrib/bind9/lib/isc/hmacmd5.c
+++ b/contrib/bind9/lib/isc/hmacmd5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacmd5.c,v 1.14 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: hmacmd5.c,v 1.16 2009-02-06 23:47:42 tbox Exp $ */
/*! \file
* This code implements the HMAC-MD5 keyed hash algorithm
@@ -27,10 +27,40 @@
#include <isc/assertions.h>
#include <isc/hmacmd5.h>
#include <isc/md5.h>
+#include <isc/platform.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_hmacmd5_init(isc_hmacmd5_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_md5());
+}
+
+void
+isc_hmacmd5_invalidate(isc_hmacmd5_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacmd5_update(isc_hmacmd5_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest) {
+ HMAC_Final(ctx, digest, NULL);
+ HMAC_CTX_cleanup(ctx);
+}
+
+#else
+
#define PADLEN 64
#define IPAD 0x36
#define OPAD 0x5C
@@ -98,6 +128,7 @@ isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest) {
isc_md5_final(&ctx->md5ctx, digest);
isc_hmacmd5_invalidate(ctx);
}
+#endif /* !ISC_PLATFORM_OPENSSLHASH */
/*!
* Verify signature - finalize MD5 operation and reapply MD5, then
diff --git a/contrib/bind9/lib/isc/hmacsha.c b/contrib/bind9/lib/isc/hmacsha.c
index 9f27163..125672d 100644
--- a/contrib/bind9/lib/isc/hmacsha.c
+++ b/contrib/bind9/lib/isc/hmacsha.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacsha.c,v 1.8 2007-08-27 03:27:53 marka Exp $ */
+/* $Id: hmacsha.c,v 1.10 2009-02-06 23:47:42 tbox Exp $ */
/*
* This code implements the HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384
@@ -26,12 +26,172 @@
#include <isc/assertions.h>
#include <isc/hmacsha.h>
+#include <isc/platform.h>
#include <isc/sha1.h>
#include <isc/sha2.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_hmacsha1_init(isc_hmacsha1_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha1());
+}
+
+void
+isc_hmacsha1_invalidate(isc_hmacsha1_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha1_update(isc_hmacsha1_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha1_sign(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha224_init(isc_hmacsha224_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha224());
+}
+
+void
+isc_hmacsha224_invalidate(isc_hmacsha224_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha224_update(isc_hmacsha224_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha224_sign(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha256_init(isc_hmacsha256_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha256());
+}
+
+void
+isc_hmacsha256_invalidate(isc_hmacsha256_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha256_update(isc_hmacsha256_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha256_sign(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha384_init(isc_hmacsha384_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha384());
+}
+
+void
+isc_hmacsha384_invalidate(isc_hmacsha384_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha384_update(isc_hmacsha384_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha384_sign(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+void
+isc_hmacsha512_init(isc_hmacsha512_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ HMAC_Init(ctx, (const void *) key, (int) len, EVP_sha512());
+}
+
+void
+isc_hmacsha512_invalidate(isc_hmacsha512_t *ctx) {
+ HMAC_CTX_cleanup(ctx);
+}
+
+void
+isc_hmacsha512_update(isc_hmacsha512_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ HMAC_Update(ctx, buf, (int) len);
+}
+
+void
+isc_hmacsha512_sign(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA512_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA512_DIGESTLENGTH);
+
+ HMAC_Final(ctx, newdigest, NULL);
+ HMAC_CTX_cleanup(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+#else
+
#define IPAD 0x36
#define OPAD 0x5C
@@ -105,19 +265,6 @@ isc_hmacsha1_sign(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA1 operation and reapply SHA1, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
- isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA224 process. Initialize an sha224 context and digest the key.
*/
void
@@ -185,19 +332,6 @@ isc_hmacsha224_sign(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA224 operation and reapply SHA224, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
- isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA256 process. Initialize an sha256 context and digest the key.
*/
void
@@ -265,19 +399,6 @@ isc_hmacsha256_sign(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA256 operation and reapply SHA256, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
- isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA384 process. Initialize an sha384 context and digest the key.
*/
void
@@ -345,19 +466,6 @@ isc_hmacsha384_sign(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
}
/*
- * Verify signature - finalize SHA384 operation and reapply SHA384, then
- * compare to the supplied digest.
- */
-isc_boolean_t
-isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
- unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
-
- REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
- isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
- return (ISC_TF(memcmp(digest, newdigest, len) == 0));
-}
-
-/*
* Start HMAC-SHA512 process. Initialize an sha512 context and digest the key.
*/
void
@@ -423,6 +531,59 @@ isc_hmacsha512_sign(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len) {
memcpy(digest, newdigest, len);
memset(newdigest, 0, sizeof(newdigest));
}
+#endif /* !ISC_PLATFORM_OPENSSLHASH */
+
+/*
+ * Verify signature - finalize SHA1 operation and reapply SHA1, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
+ isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Verify signature - finalize SHA224 operation and reapply SHA224, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
+ isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Verify signature - finalize SHA256 operation and reapply SHA256, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
+ isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Verify signature - finalize SHA384 operation and reapply SHA384, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
+ isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
/*
* Verify signature - finalize SHA512 operation and reapply SHA512, then
diff --git a/contrib/bind9/lib/isc/httpd.c b/contrib/bind9/lib/isc/httpd.c
index b653f79..81f118e 100644
--- a/contrib/bind9/lib/isc/httpd.c
+++ b/contrib/bind9/lib/isc/httpd.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: httpd.c,v 1.16.64.2 2010-02-04 23:47:46 tbox Exp $ */
+/* $Id: httpd.c,v 1.20 2010-11-16 05:38:31 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
index b2d355e..fffb0e3 100644
--- a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: atomic.h,v 1.4.326.3 2009-06-24 02:21:28 marka Exp $ */
+/* $Id: atomic.h,v 1.7 2009-06-24 02:22:50 marka Exp $ */
#ifndef ISC_ATOMIC_H
#define ISC_ATOMIC_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/Makefile.in b/contrib/bind9/lib/isc/include/isc/Makefile.in
index c1d71f4..12c09cd 100644
--- a/contrib/bind9/lib/isc/include/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/include/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.64.12.2 2009-02-12 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.68 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -26,15 +26,15 @@ top_srcdir = @top_srcdir@
# machine generated. The latter are handled specially in the
# install target below.
#
-HEADERS = app.h assertions.h base64.h bitstring.h boolean.h buffer.h \
- bufferlist.h commandline.h entropy.h error.h event.h \
+HEADERS = app.h assertions.h base64.h bind9.h bitstring.h boolean.h \
+ buffer.h bufferlist.h commandline.h entropy.h error.h event.h \
eventclass.h file.h formatcheck.h fsaccess.h \
hash.h heap.h hex.h hmacmd5.h \
httpd.h \
interfaceiter.h @ISC_IPV6_H@ iterated_hash.h lang.h lex.h \
lfsr.h lib.h list.h log.h \
- magic.h md5.h mem.h msgcat.h msgs.h \
- mutexblock.h netaddr.h ondestroy.h os.h parseint.h \
+ magic.h md5.h mem.h msgcat.h msgs.h mutexblock.h \
+ namespace.h netaddr.h ondestroy.h os.h parseint.h \
print.h quota.h radix.h random.h ratelimiter.h \
refcount.h region.h resource.h \
result.h resultclass.h rwlock.h serial.h sha1.h sha2.h \
diff --git a/contrib/bind9/lib/isc/include/isc/app.h b/contrib/bind9/lib/isc/include/isc/app.h
index 0552758..ac8669f 100644
--- a/contrib/bind9/lib/isc/include/isc/app.h
+++ b/contrib/bind9/lib/isc/include/isc/app.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: app.h,v 1.8 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: app.h,v 1.11 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_APP_H
#define ISC_APP_H 1
@@ -54,12 +54,23 @@
* Use of this module is not required. In particular, isc_app_start() is
* NOT an ISC library initialization routine.
*
+ * This module also supports per-thread 'application contexts'. With this
+ * mode, a thread-based application will have a separate context, in which
+ * it uses other ISC library services such as tasks or timers. Signals are
+ * not caught in this mode, so that the application can handle the signals
+ * in its preferred way.
+ *
* \li MP:
* Clients must ensure that isc_app_start(), isc_app_run(), and
* isc_app_finish() are called at most once. isc_app_shutdown()
* is safe to use by any thread (provided isc_app_start() has been
* called previously).
*
+ * The same note applies to isc_app_ctxXXX() functions, but in this case
+ * it's a per-thread restriction. For example, a thread with an
+ * application context must ensure that isc_app_ctxstart() with the
+ * context is called at most once.
+ *
* \li Reliability:
* No anticipated impact.
*
@@ -75,17 +86,64 @@
#include <isc/eventclass.h>
#include <isc/lang.h>
+#include <isc/magic.h>
#include <isc/result.h>
+/***
+ *** Types
+ ***/
+
typedef isc_event_t isc_appevent_t;
#define ISC_APPEVENT_FIRSTEVENT (ISC_EVENTCLASS_APP + 0)
#define ISC_APPEVENT_SHUTDOWN (ISC_EVENTCLASS_APP + 1)
#define ISC_APPEVENT_LASTEVENT (ISC_EVENTCLASS_APP + 65535)
+/*%
+ * app module methods. Only app driver implementations use this structure.
+ * Other clients should use the top-level interfaces (i.e., isc_app_xxx
+ * functions). magic must be ISCAPI_APPMETHODS_MAGIC.
+ */
+typedef struct isc_appmethods {
+ void (*ctxdestroy)(isc_appctx_t **ctxp);
+ isc_result_t (*ctxstart)(isc_appctx_t *ctx);
+ isc_result_t (*ctxrun)(isc_appctx_t *ctx);
+ isc_result_t (*ctxsuspend)(isc_appctx_t *ctx);
+ isc_result_t (*ctxshutdown)(isc_appctx_t *ctx);
+ void (*ctxfinish)(isc_appctx_t *ctx);
+ void (*settaskmgr)(isc_appctx_t *ctx,
+ isc_taskmgr_t *timermgr);
+ void (*setsocketmgr)(isc_appctx_t *ctx,
+ isc_socketmgr_t *timermgr);
+ void (*settimermgr)(isc_appctx_t *ctx,
+ isc_timermgr_t *timermgr);
+} isc_appmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of an application context
+ * implementation's version of an isc_appctx_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. app implementations
+ * may change the structure. 'magic' must be ISCAPI_APPCTX_MAGIC for any
+ * of the isc_app_ routines to work. app implementations must maintain
+ * all app context invariants.
+ */
+struct isc_appctx {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_appmethods_t *methods;
+};
+
+#define ISCAPI_APPCTX_MAGIC ISC_MAGIC('A','a','p','c')
+#define ISCAPI_APPCTX_VALID(c) ((c) != NULL && \
+ (c)->magic == ISCAPI_APPCTX_MAGIC)
+
ISC_LANG_BEGINDECLS
isc_result_t
+isc_app_ctxstart(isc_appctx_t *ctx);
+
+isc_result_t
isc_app_start(void);
/*!<
* \brief Start an ISC library application.
@@ -93,6 +151,9 @@ isc_app_start(void);
* Notes:
* This call should be made before any other ISC library call, and as
* close to the beginning of the application as possible.
+ *
+ * Requires:
+ * 'ctx' is a valid application context (for app_ctxstart()).
*/
isc_result_t
@@ -102,7 +163,7 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
* \brief Request delivery of an event when the application is run.
*
* Requires:
- * isc_app_start() has been called.
+ *\li isc_app_start() has been called.
*
* Returns:
* ISC_R_SUCCESS
@@ -110,6 +171,9 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
*/
isc_result_t
+isc_app_ctxrun(isc_appctx_t *ctx);
+
+isc_result_t
isc_app_run(void);
/*!<
* \brief Run an ISC library application.
@@ -120,11 +184,12 @@ isc_app_run(void);
* caller should start shutting down the application.
*
* Requires:
- *\li isc_app_start() has been called.
+ *\li isc_app_[ctx]start() has been called.
*
* Ensures:
*\li Any events requested via isc_app_onrun() will have been posted (in
* FIFO order) before isc_app_run() blocks.
+ *\li 'ctx' is a valid application context (for app_ctxrun()).
*
* Returns:
*\li ISC_R_SUCCESS Shutdown has been requested.
@@ -132,6 +197,9 @@ isc_app_run(void);
*/
isc_result_t
+isc_app_ctxshutdown(isc_appctx_t *ctx);
+
+isc_result_t
isc_app_shutdown(void);
/*!<
* \brief Request application shutdown.
@@ -141,7 +209,8 @@ isc_app_shutdown(void);
* only be triggered once.
*
* Requires:
- *\li isc_app_run() has been called.
+ *\li isc_app_[ctx]run() has been called.
+ *\li 'ctx' is a valid application context (for app_ctxshutdown()).
*
* Returns:
*\li ISC_R_SUCCESS
@@ -149,6 +218,12 @@ isc_app_shutdown(void);
*/
isc_result_t
+isc_app_ctxsuspend(isc_appctx_t *ctx);
+/*!<
+ * \brief This has the same behavior as isc_app_ctxsuspend().
+ */
+
+isc_result_t
isc_app_reload(void);
/*!<
* \brief Request application reload.
@@ -162,6 +237,9 @@ isc_app_reload(void);
*/
void
+isc_app_ctxfinish(isc_appctx_t *ctx);
+
+void
isc_app_finish(void);
/*!<
* \brief Finish an ISC library application.
@@ -171,6 +249,7 @@ isc_app_finish(void);
*
* Requires:
*\li isc_app_start() has been called.
+ *\li 'ctx' is a valid application context (for app_ctxfinish()).
*
* Ensures:
*\li Any resources allocated by isc_app_start() have been released.
@@ -206,6 +285,90 @@ isc_app_unblock(void);
* \li isc_app_block() has been called by the same thread.
*/
+isc_result_t
+isc_appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp);
+/*!<
+ * \brief Create an application context.
+ *
+ * Requires:
+ *\li 'mctx' is a valid memory context.
+ *\li 'ctxp' != NULL && *ctxp == NULL.
+ */
+
+void
+isc_appctx_destroy(isc_appctx_t **ctxp);
+/*!<
+ * \brief Destroy an application context.
+ *
+ * Requires:
+ *\li '*ctxp' is a valid application context.
+ *
+ * Ensures:
+ *\li *ctxp == NULL.
+ */
+
+void
+isc_appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr);
+/*!<
+ * \brief Associate a task manager with an application context.
+ *
+ * This must be done before running tasks within the application context.
+ *
+ * Requires:
+ *\li 'ctx' is a valid application context.
+ *\li 'taskmgr' is a valid task manager.
+ */
+
+void
+isc_appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr);
+/*!<
+ * \brief Associate a socket manager with an application context.
+ *
+ * This must be done before handling socket events within the application
+ * context.
+ *
+ * Requires:
+ *\li 'ctx' is a valid application context.
+ *\li 'socketmgr' is a valid socket manager.
+ */
+
+void
+isc_appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr);
+/*!<
+ * \brief Associate a socket timer with an application context.
+ *
+ * This must be done before handling timer events within the application
+ * context.
+ *
+ * Requires:
+ *\li 'ctx' is a valid application context.
+ *\li 'timermgr' is a valid timer manager.
+ */
+
+#ifdef USE_APPIMPREGISTER
+/*%<
+ * See isc_appctx_create() above.
+ */
+typedef isc_result_t
+(*isc_appctxcreatefunc_t)(isc_mem_t *mctx, isc_appctx_t **ctxp);
+
+isc_result_t
+isc_app_register(isc_appctxcreatefunc_t createfunc);
+/*%<
+ * Register a new application implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__app_register(void);
+/*%<
+ * A short cut function that specifies the application module in the ISC
+ * library for isc_app_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_APPIMPREGISTER */
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/assertions.h b/contrib/bind9/lib/isc/include/isc/assertions.h
index 8a2ba7e..91217b8 100644
--- a/contrib/bind9/lib/isc/include/isc/assertions.h
+++ b/contrib/bind9/lib/isc/include/isc/assertions.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -16,7 +16,7 @@
*/
/*
- * $Id: assertions.h,v 1.26 2008-10-15 23:47:31 tbox Exp $
+ * $Id: assertions.h,v 1.28 2009-09-29 23:48:04 tbox Exp $
*/
/*! \file isc/assertions.h
*/
@@ -41,7 +41,9 @@ typedef void (*isc_assertioncallback_t)(const char *, int, isc_assertiontype_t,
const char *);
/* coverity[+kill] */
-LIBISC_EXTERNAL_DATA extern isc_assertioncallback_t isc_assertion_failed;
+ISC_PLATFORM_NORETURN_PRE
+void isc_assertion_failed(const char *, int, isc_assertiontype_t,
+ const char *) ISC_PLATFORM_NORETURN_POST;
void
isc_assertion_setcallback(isc_assertioncallback_t);
diff --git a/contrib/bind9/lib/isc/include/isc/backtrace.h b/contrib/bind9/lib/isc/include/isc/backtrace.h
new file mode 100644
index 0000000..94fee61
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/backtrace.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace.h,v 1.2 2009-09-01 18:40:25 jinmei Exp $ */
+
+/*! \file isc/backtrace.h
+ * \brief provide a back trace of the running process to help debug problems.
+ *
+ * This module tries to get a back trace of the process using some platform
+ * dependent way when available. It also manages an internal symbol table
+ * that maps function addresses used in the process to their textual symbols.
+ * This module is expected to be used to help debug when some fatal error
+ * happens.
+ *
+ * IMPORTANT NOTE: since the (major) intended use case of this module is
+ * dumping a back trace on a fatal error, normally followed by self termination,
+ * functions defined in this module generally doesn't employ assertion checks
+ * (if it did, a program bug could cause infinite recursive calls to a
+ * backtrace function). These functions still perform minimal checks and return
+ * ISC_R_FAILURE if they detect an error, but the caller should therefore be
+ * very careful about the use of these functions, and generally discouraged to
+ * use them except in an exit path. The exception is
+ * isc_backtrace_getsymbolfromindex(), which is expected to be used in a
+ * non-error-handling context and validates arguments with assertion checks.
+ */
+
+#ifndef ISC_BACKTRACE_H
+#define ISC_BACKTRACE_H 1
+
+/***
+ *** Imports
+ ***/
+
+#include <isc/types.h>
+
+/***
+ *** Types
+ ***/
+struct isc_backtrace_symmap {
+ void *addr;
+ const char *symbol;
+};
+
+extern const int isc__backtrace_nsymbols;
+extern const isc_backtrace_symmap_t isc__backtrace_symtable[];
+
+/***
+ *** Functions
+ ***/
+
+ISC_LANG_BEGINDECLS
+isc_result_t
+isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes);
+/*%<
+ * Get a back trace of the running process above this function itself. On
+ * success, addrs[i] will store the address of the call point of the i-th
+ * stack frame (addrs[0] is the caller of this function). *nframes will store
+ * the total number of frames.
+ *
+ * Requires (note that these are not ensured by assertion checks, see above):
+ *
+ *\li 'addrs' is a valid array containing at least 'maxaddrs' void * entries.
+ *
+ *\li 'nframes' must be non NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_FAILURE
+ *\li #ISC_R_NOTFOUND
+ *\li #ISC_R_NOTIMPLEMENTED
+ */
+
+isc_result_t
+isc_backtrace_getsymbolfromindex(int index, const void **addrp,
+ const char **symbolp);
+/*%<
+ * Returns the content of the internal symbol table of the given index.
+ * On success, *addrsp and *symbolp point to the address and the symbol of
+ * the 'index'th entry of the table, respectively. If 'index' is not in the
+ * range of the symbol table, ISC_R_RANGE will be returned.
+ *
+ * Requires
+ *
+ *\li 'addrp' must be non NULL && '*addrp' == NULL.
+ *
+ *\li 'symbolp' must be non NULL && '*symbolp' == NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_RANGE
+ */
+
+isc_result_t
+isc_backtrace_getsymbol(const void *addr, const char **symbolp,
+ unsigned long *offsetp);
+/*%<
+ * Searches the internal symbol table for the symbol that most matches the
+ * given 'addr'. On success, '*symbolp' will point to the name of function
+ * to which the address 'addr' belong, and '*offsetp' will store the offset
+ * from the function's entry address to 'addr'.
+ *
+ * Requires (note that these are not ensured by assertion checks, see above):
+ *
+ *\li 'symbolp' must be non NULL && '*symbolp' == NULL.
+ *
+ *\li 'offsetp' must be non NULL.
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_FAILURE
+ *\li #ISC_R_NOTFOUND
+ */
+ISC_LANG_ENDDECLS
+
+#endif /* ISC_BACKTRACE_H */
diff --git a/contrib/bind9/lib/isc/include/isc/bind9.h b/contrib/bind9/lib/isc/include/isc/bind9.h
new file mode 100644
index 0000000..dd75e91
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/bind9.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: bind9.h,v 1.2 2009-12-05 23:31:41 each Exp $ */
+
+#ifndef ISC_BIND9_H
+#define ISC_BIND9_H 1
+
+/*
+ * This determines whether we are building BIND9 or using the exported
+ * libisc/libdns libraries. The version of this file included in the
+ * standard BIND9 build defines BIND9; the version included with the
+ * exportable libraries does not.
+ */
+#define BIND9 1
+
+#endif /* ISC_BIND9_H */
diff --git a/contrib/bind9/lib/isc/include/isc/buffer.h b/contrib/bind9/lib/isc/include/isc/buffer.h
index e55c5b0..30a6e39 100644
--- a/contrib/bind9/lib/isc/include/isc/buffer.h
+++ b/contrib/bind9/lib/isc/include/isc/buffer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: buffer.h,v 1.53 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: buffer.h,v 1.55 2010-12-20 23:47:21 tbox Exp $ */
#ifndef ISC_BUFFER_H
#define ISC_BUFFER_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/entropy.h b/contrib/bind9/lib/isc/include/isc/entropy.h
index 1eb8fd1..e115906 100644
--- a/contrib/bind9/lib/isc/include/isc/entropy.h
+++ b/contrib/bind9/lib/isc/include/isc/entropy.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.h,v 1.32.332.3 2009-10-19 02:46:07 marka Exp $ */
+/* $Id: entropy.h,v 1.35 2009-10-19 02:37:08 marka Exp $ */
#ifndef ISC_ENTROPY_H
#define ISC_ENTROPY_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/error.h b/contrib/bind9/lib/isc/include/isc/error.h
index a0025e0..d3dcc8b 100644
--- a/contrib/bind9/lib/isc/include/isc/error.h
+++ b/contrib/bind9/lib/isc/include/isc/error.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: error.h,v 1.20 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: error.h,v 1.22 2009-09-29 23:48:04 tbox Exp $ */
#ifndef ISC_ERROR_H
#define ISC_ERROR_H 1
@@ -26,6 +26,7 @@
#include <isc/formatcheck.h>
#include <isc/lang.h>
+#include <isc/platform.h>
ISC_LANG_BEGINDECLS
@@ -45,9 +46,9 @@ isc_error_unexpected(const char *, int, const char *, ...)
ISC_FORMAT_PRINTF(3, 4);
/*% fatal error */
-void
+ISC_PLATFORM_NORETURN_PRE void
isc_error_fatal(const char *, int, const char *, ...)
- ISC_FORMAT_PRINTF(3, 4);
+ISC_FORMAT_PRINTF(3, 4) ISC_PLATFORM_NORETURN_POST;
/*% runtimecheck error */
void
diff --git a/contrib/bind9/lib/isc/include/isc/file.h b/contrib/bind9/lib/isc/include/isc/file.h
index 6629a3e..be40825 100644
--- a/contrib/bind9/lib/isc/include/isc/file.h
+++ b/contrib/bind9/lib/isc/include/isc/file.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: file.h,v 1.33.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: file.h,v 1.39 2011-01-11 23:47:14 tbox Exp $ */
#ifndef ISC_FILE_H
#define ISC_FILE_H 1
@@ -100,6 +100,10 @@ isc_file_mktemplate(const char *path, char *buf, size_t buflen);
isc_result_t
isc_file_openunique(char *templet, FILE **fp);
+isc_result_t
+isc_file_openuniqueprivate(char *templet, FILE **fp);
+isc_result_t
+isc_file_openuniquemode(char *templet, int mode, FILE **fp);
/*!<
* \brief Create and open a file with a unique name based on 'templet'.
*
@@ -251,6 +255,29 @@ isc_file_truncate(const char *filename, isc_offset_t size);
* Truncate/extend the file specified to 'size' bytes.
*/
+isc_result_t
+isc_file_safecreate(const char *filename, FILE **fp);
+/*%<
+ * Open 'filename' for writing, truncating if necessary. Ensure that
+ * if it existed it was a normal file. If creating the file, ensure
+ * that only the owner can read/write it.
+ */
+
+isc_result_t
+isc_file_splitpath(isc_mem_t *mctx, char *path,
+ char **dirname, char **basename);
+/*%<
+ * Split a path into dirname and basename. If 'path' contains no slash
+ * (or, on windows, backslash), then '*dirname' is set to ".".
+ *
+ * Allocates memory for '*dirname', which can be freed with isc_mem_free().
+ *
+ * Returns:
+ * - ISC_R_SUCCESS on success
+ * - ISC_R_INVALIDFILE if 'path' is empty or ends with '/'
+ * - ISC_R_NOMEMORY if unable to allocate memory
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_FILE_H */
diff --git a/contrib/bind9/lib/isc/include/isc/fsaccess.h b/contrib/bind9/lib/isc/include/isc/fsaccess.h
index 88469dd..9758242 100644
--- a/contrib/bind9/lib/isc/include/isc/fsaccess.h
+++ b/contrib/bind9/lib/isc/include/isc/fsaccess.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: fsaccess.h,v 1.14.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: fsaccess.h,v 1.16 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_FSACCESS_H
#define ISC_FSACCESS_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/hash.h b/contrib/bind9/lib/isc/include/isc/hash.h
index 9bfb709..543e5fd 100644
--- a/contrib/bind9/lib/isc/include/isc/hash.h
+++ b/contrib/bind9/lib/isc/include/isc/hash.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hash.h,v 1.10.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: hash.h,v 1.12 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_HASH_H
#define ISC_HASH_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/heap.h b/contrib/bind9/lib/isc/include/isc/heap.h
index ae346c1..943ace3 100644
--- a/contrib/bind9/lib/isc/include/isc/heap.h
+++ b/contrib/bind9/lib/isc/include/isc/heap.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.h,v 1.24.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: heap.h,v 1.26 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_HEAP_H
#define ISC_HEAP_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/hmacmd5.h b/contrib/bind9/lib/isc/include/isc/hmacmd5.h
index 68074ae..c7d7fff 100644
--- a/contrib/bind9/lib/isc/include/isc/hmacmd5.h
+++ b/contrib/bind9/lib/isc/include/isc/hmacmd5.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacmd5.h,v 1.12 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: hmacmd5.h,v 1.14 2009-02-06 23:47:42 tbox Exp $ */
/*! \file isc/hmacmd5.h
* \brief This is the header file for the HMAC-MD5 keyed hash algorithm
@@ -27,14 +27,23 @@
#include <isc/lang.h>
#include <isc/md5.h>
+#include <isc/platform.h>
#include <isc/types.h>
#define ISC_HMACMD5_KEYLENGTH 64
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/hmac.h>
+
+typedef HMAC_CTX isc_hmacmd5_t;
+
+#else
+
typedef struct {
isc_md5_t md5ctx;
unsigned char key[ISC_HMACMD5_KEYLENGTH];
} isc_hmacmd5_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/hmacsha.h b/contrib/bind9/lib/isc/include/isc/hmacsha.h
index c439883..286cafc 100644
--- a/contrib/bind9/lib/isc/include/isc/hmacsha.h
+++ b/contrib/bind9/lib/isc/include/isc/hmacsha.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacsha.h,v 1.7 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: hmacsha.h,v 1.9 2009-02-06 23:47:42 tbox Exp $ */
/*! \file isc/hmacsha.h
* This is the header file for the HMAC-SHA1, HMAC-SHA224, HMAC-SHA256,
@@ -25,6 +25,7 @@
#define ISC_HMACSHA_H 1
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/sha1.h>
#include <isc/sha2.h>
#include <isc/types.h>
@@ -35,6 +36,17 @@
#define ISC_HMACSHA384_KEYLENGTH ISC_SHA384_BLOCK_LENGTH
#define ISC_HMACSHA512_KEYLENGTH ISC_SHA512_BLOCK_LENGTH
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/hmac.h>
+
+typedef HMAC_CTX isc_hmacsha1_t;
+typedef HMAC_CTX isc_hmacsha224_t;
+typedef HMAC_CTX isc_hmacsha256_t;
+typedef HMAC_CTX isc_hmacsha384_t;
+typedef HMAC_CTX isc_hmacsha512_t;
+
+#else
+
typedef struct {
isc_sha1_t sha1ctx;
unsigned char key[ISC_HMACSHA1_KEYLENGTH];
@@ -59,6 +71,7 @@ typedef struct {
isc_sha512_t sha512ctx;
unsigned char key[ISC_HMACSHA512_KEYLENGTH];
} isc_hmacsha512_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/lib.h b/contrib/bind9/lib/isc/include/isc/lib.h
index 3804a07..c8bdbc6 100644
--- a/contrib/bind9/lib/isc/include/isc/lib.h
+++ b/contrib/bind9/lib/isc/include/isc/lib.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.h,v 1.14 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: lib.h,v 1.16 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_LIB_H
#define ISC_LIB_H 1
@@ -36,6 +36,15 @@ isc_lib_initmsgcat(void);
* has not already been initialized.
*/
+void
+isc_lib_register(void);
+/*!<
+ * \brief Register the ISC library implementations for some base services
+ * such as memory or event management and handling socket or timer events.
+ * An external application that wants to use the ISC library must call this
+ * function very early in main().
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_LIB_H */
diff --git a/contrib/bind9/lib/isc/include/isc/log.h b/contrib/bind9/lib/isc/include/isc/log.h
index fec3d9d..eac5755 100644
--- a/contrib/bind9/lib/isc/include/isc/log.h
+++ b/contrib/bind9/lib/isc/include/isc/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.54.332.5 2009-02-16 02:04:05 marka Exp $ */
+/* $Id: log.h,v 1.59 2009-02-16 02:01:16 marka Exp $ */
#ifndef ISC_LOG_H
#define ISC_LOG_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/md5.h b/contrib/bind9/lib/isc/include/isc/md5.h
index 9d5b1ec..9017115 100644
--- a/contrib/bind9/lib/isc/include/isc/md5.h
+++ b/contrib/bind9/lib/isc/include/isc/md5.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md5.h,v 1.16 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: md5.h,v 1.20 2010-01-07 23:48:54 tbox Exp $ */
/*! \file isc/md5.h
* \brief This is the header file for the MD5 message-digest algorithm.
@@ -44,15 +44,25 @@
#define ISC_MD5_H 1
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/types.h>
#define ISC_MD5_DIGESTLENGTH 16U
+#define ISC_MD5_BLOCK_LENGTH 64U
+
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/evp.h>
+
+typedef EVP_MD_CTX isc_md5_t;
+
+#else
typedef struct {
isc_uint32_t buf[4];
isc_uint32_t bytes[2];
isc_uint32_t in[16];
} isc_md5_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/mem.h b/contrib/bind9/lib/isc/include/isc/mem.h
index d13d912..e0a7fe5 100644
--- a/contrib/bind9/lib/isc/include/isc/mem.h
+++ b/contrib/bind9/lib/isc/include/isc/mem.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.h,v 1.78.120.6 2010-08-11 23:04:21 jinmei Exp $ */
+/* $Id: mem.h,v 1.89 2010-08-11 22:54:58 jinmei Exp $ */
#ifndef ISC_MEM_H
#define ISC_MEM_H 1
@@ -152,11 +152,29 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
#endif
-#define isc_mem_get(c, s) isc__mem_get((c), (s) _ISC_MEM_FILELINE)
-#define isc_mem_allocate(c, s) isc__mem_allocate((c), (s) _ISC_MEM_FILELINE)
-#define isc_mem_reallocate(c, p, s) isc__mem_reallocate((c), (p), (s) _ISC_MEM_FILELINE)
-#define isc_mem_strdup(c, p) isc__mem_strdup((c), (p) _ISC_MEM_FILELINE)
-#define isc_mempool_get(c) isc__mempool_get((c) _ISC_MEM_FILELINE)
+/*%<
+ * We use either isc___mem (three underscores) or isc__mem (two) depending on
+ * whether it's for BIND9's internal purpose (with -DBIND9) or generic export
+ * library. This condition is generally handled in isc/namespace.h, but for
+ * Windows it doesn't work if it involves multiple times of macro expansion
+ * (such as isc_mem to isc__mem then to isc___mem). The following definitions
+ * are used to work around this portability issue. Right now, we don't support
+ * the export library for Windows, so we always use the three-underscore
+ * version.
+ */
+#ifdef WIN32
+#define ISCMEMFUNC(sfx) isc___mem_ ## sfx
+#define ISCMEMPOOLFUNC(sfx) isc___mempool_ ## sfx
+#else
+#define ISCMEMFUNC(sfx) isc__mem_ ## sfx
+#define ISCMEMPOOLFUNC(sfx) isc__mempool_ ## sfx
+#endif
+
+#define isc_mem_get(c, s) ISCMEMFUNC(get)((c), (s) _ISC_MEM_FILELINE)
+#define isc_mem_allocate(c, s) ISCMEMFUNC(allocate)((c), (s) _ISC_MEM_FILELINE)
+#define isc_mem_reallocate(c, p, s) ISCMEMFUNC(reallocate)((c), (p), (s) _ISC_MEM_FILELINE)
+#define isc_mem_strdup(c, p) ISCMEMFUNC(strdup)((c), (p) _ISC_MEM_FILELINE)
+#define isc_mempool_get(c) ISCMEMPOOLFUNC(get)((c) _ISC_MEM_FILELINE)
/*%
* isc_mem_putanddetach() is a convenience function for use where you
@@ -187,33 +205,102 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
* \endcode
*/
+/*% memory and memory pool methods */
+typedef struct isc_memmethods {
+ void (*attach)(isc_mem_t *source, isc_mem_t **targetp);
+ void (*detach)(isc_mem_t **mctxp);
+ void (*destroy)(isc_mem_t **mctxp);
+ void *(*memget)(isc_mem_t *mctx, size_t size _ISC_MEM_FLARG);
+ void (*memput)(isc_mem_t *mctx, void *ptr, size_t size _ISC_MEM_FLARG);
+ void (*memputanddetach)(isc_mem_t **mctxp, void *ptr,
+ size_t size _ISC_MEM_FLARG);
+ void *(*memallocate)(isc_mem_t *mctx, size_t size _ISC_MEM_FLARG);
+ void *(*memreallocate)(isc_mem_t *mctx, void *ptr,
+ size_t size _ISC_MEM_FLARG);
+ char *(*memstrdup)(isc_mem_t *mctx, const char *s _ISC_MEM_FLARG);
+ void (*memfree)(isc_mem_t *mctx, void *ptr _ISC_MEM_FLARG);
+ void (*setdestroycheck)(isc_mem_t *mctx, isc_boolean_t flag);
+ void (*setwater)(isc_mem_t *ctx, isc_mem_water_t water,
+ void *water_arg, size_t hiwater, size_t lowater);
+ void (*waterack)(isc_mem_t *ctx, int flag);
+ size_t (*inuse)(isc_mem_t *mctx);
+ isc_boolean_t (*isovermem)(isc_mem_t *mctx);
+ isc_result_t (*mpcreate)(isc_mem_t *mctx, size_t size,
+ isc_mempool_t **mpctxp);
+} isc_memmethods_t;
+
+typedef struct isc_mempoolmethods {
+ void (*destroy)(isc_mempool_t **mpctxp);
+ void *(*get)(isc_mempool_t *mpctx _ISC_MEM_FLARG);
+ void (*put)(isc_mempool_t *mpctx, void *mem _ISC_MEM_FLARG);
+ unsigned int (*getallocated)(isc_mempool_t *mpctx);
+ void (*setmaxalloc)(isc_mempool_t *mpctx, unsigned int limit);
+ void (*setfreemax)(isc_mempool_t *mpctx, unsigned int limit);
+ void (*setname)(isc_mempool_t *mpctx, const char *name);
+ void (*associatelock)(isc_mempool_t *mpctx, isc_mutex_t *lock);
+ void (*setfillcount)(isc_mempool_t *mpctx, unsigned int limit);
+} isc_mempoolmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a memory context
+ * implementation's version of an isc_mem_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. mctx implementations
+ * may change the structure. 'magic' must be ISCAPI_MCTX_MAGIC for any of the
+ * isc_mem_ routines to work. mctx implementations must maintain all mctx
+ * invariants.
+ */
+struct isc_mem {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_memmethods_t *methods;
+};
+
+#define ISCAPI_MCTX_MAGIC ISC_MAGIC('A','m','c','x')
+#define ISCAPI_MCTX_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_MCTX_MAGIC)
+
+/*%
+ * This is the common prefix of a memory pool context. The same note as
+ * that for the mem structure applies.
+ */
+struct isc_mempool {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_mempoolmethods_t *methods;
+};
+
+#define ISCAPI_MPOOL_MAGIC ISC_MAGIC('A','m','p','l')
+#define ISCAPI_MPOOL_VALID(mp) ((mp) != NULL && \
+ (mp)->magic == ISCAPI_MPOOL_MAGIC)
+
#if ISC_MEM_DEBUG
#define isc_mem_put(c, p, s) \
do { \
- isc__mem_put((c), (p), (s) _ISC_MEM_FILELINE); \
+ ISCMEMFUNC(put)((c), (p), (s) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#define isc_mem_putanddetach(c, p, s) \
do { \
- isc__mem_putanddetach((c), (p), (s) _ISC_MEM_FILELINE); \
+ ISCMEMFUNC(putanddetach)((c), (p), (s) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#define isc_mem_free(c, p) \
do { \
- isc__mem_free((c), (p) _ISC_MEM_FILELINE); \
+ ISCMEMFUNC(free)((c), (p) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#define isc_mempool_put(c, p) \
do { \
- isc__mempool_put((c), (p) _ISC_MEM_FILELINE); \
+ ISCMEMPOOLFUNC(put)((c), (p) _ISC_MEM_FILELINE); \
(p) = NULL; \
} while (0)
#else
-#define isc_mem_put(c, p, s) isc__mem_put((c), (p), (s) _ISC_MEM_FILELINE)
+#define isc_mem_put(c, p, s) ISCMEMFUNC(put)((c), (p), (s) _ISC_MEM_FILELINE)
#define isc_mem_putanddetach(c, p, s) \
- isc__mem_putanddetach((c), (p), (s) _ISC_MEM_FILELINE)
-#define isc_mem_free(c, p) isc__mem_free((c), (p) _ISC_MEM_FILELINE)
-#define isc_mempool_put(c, p) isc__mempool_put((c), (p) _ISC_MEM_FILELINE)
+ ISCMEMFUNC(putanddetach)((c), (p), (s) _ISC_MEM_FILELINE)
+#define isc_mem_free(c, p) ISCMEMFUNC(free)((c), (p) _ISC_MEM_FILELINE)
+#define isc_mempool_put(c, p) ISCMEMPOOLFUNC(put)((c), (p) _ISC_MEM_FILELINE)
#endif
/*@{*/
@@ -613,24 +700,50 @@ isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit);
* Pseudo-private functions for use via macros. Do not call directly.
*/
void *
-isc__mem_get(isc_mem_t *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(get)(isc_mem_t *, size_t _ISC_MEM_FLARG);
void
-isc__mem_putanddetach(isc_mem_t **, void *,
- size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(putanddetach)(isc_mem_t **, void *, size_t _ISC_MEM_FLARG);
void
-isc__mem_put(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(put)(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
void *
-isc__mem_allocate(isc_mem_t *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(allocate)(isc_mem_t *, size_t _ISC_MEM_FLARG);
void *
-isc__mem_reallocate(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
+ISCMEMFUNC(reallocate)(isc_mem_t *, void *, size_t _ISC_MEM_FLARG);
void
-isc__mem_free(isc_mem_t *, void * _ISC_MEM_FLARG);
+ISCMEMFUNC(free)(isc_mem_t *, void * _ISC_MEM_FLARG);
char *
-isc__mem_strdup(isc_mem_t *, const char *_ISC_MEM_FLARG);
+ISCMEMFUNC(strdup)(isc_mem_t *, const char *_ISC_MEM_FLARG);
void *
-isc__mempool_get(isc_mempool_t * _ISC_MEM_FLARG);
+ISCMEMPOOLFUNC(get)(isc_mempool_t * _ISC_MEM_FLARG);
void
-isc__mempool_put(isc_mempool_t *, void * _ISC_MEM_FLARG);
+ISCMEMPOOLFUNC(put)(isc_mempool_t *, void * _ISC_MEM_FLARG);
+
+#ifdef USE_MEMIMPREGISTER
+
+/*%<
+ * See isc_mem_create2() above.
+ */
+typedef isc_result_t
+(*isc_memcreatefunc_t)(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags);
+
+isc_result_t
+isc_mem_register(isc_memcreatefunc_t createfunc);
+/*%<
+ * Register a new memory management implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * memory management library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__mem_register(void);
+/*%<
+ * A short cut function that specifies the memory management module in the ISC
+ * library for isc_mem_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_MEMIMPREGISTER */
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/msgs.h b/contrib/bind9/lib/isc/include/isc/msgs.h
index 674371f5..22dfde2 100644
--- a/contrib/bind9/lib/isc/include/isc/msgs.h
+++ b/contrib/bind9/lib/isc/include/isc/msgs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: msgs.h,v 1.17 2008-08-08 06:28:59 tbox Exp $ */
+/* $Id: msgs.h,v 1.19 2009-10-01 23:48:08 tbox Exp $ */
#ifndef ISC_MSGS_H
#define ISC_MSGS_H 1
@@ -156,7 +156,7 @@
#define ISC_MSG_FILTER 1421 /*%< setsockopt(SO_ACCEPTFILTER): %s */
#define ISC_MSG_TOOMANYHANDLES 1422 /*%< %s: too many open WSA event handles: %s */
-
+#define ISC_MSG_POKED 1423 /*%< "poked flags: %d" */
#define ISC_MSG_AWAKE 1502 /*%< "awake" */
#define ISC_MSG_WORKING 1503 /*%< "working" */
diff --git a/contrib/bind9/lib/isc/include/isc/namespace.h b/contrib/bind9/lib/isc/include/isc/namespace.h
new file mode 100644
index 0000000..05a8b2c
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/namespace.h
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: namespace.h,v 1.9 2010-12-04 13:25:59 marka Exp $ */
+
+#ifndef ISCAPI_NAMESPACE_H
+#define ISCAPI_NAMESPACE_H 1
+
+/*%
+ * name space conversions
+ */
+
+#ifdef BIND9
+
+#define isc_app_start isc__app_start
+#define isc_app_ctxstart isc__app_ctxstart
+#define isc_app_onrun isc__app_onrun
+#define isc_app_run isc__app_run
+#define isc_app_ctxrun isc__app_ctxrun
+#define isc_app_shutdown isc__app_shutdown
+#define isc_app_ctxshutdown isc__app_ctxshutdown
+#define isc_app_ctxsuspend isc__app_ctxsuspend
+#define isc_app_reload isc__app_reload
+#define isc_app_finish isc__app_finish
+#define isc_app_block isc__app_block
+#define isc_app_unblock isc__app_unblock
+#define isc_appctx_create isc__appctx_create
+#define isc_appctx_destroy isc__appctx_destroy
+#define isc_appctx_settaskmgr isc__appctx_settaskmgr
+#define isc_appctx_setsocketmgr isc__appctx_setsocketmgr
+#define isc_appctx_settimermgr isc__appctx_settimermgr
+
+#define isc_mem_checkdestroyed isc__mem_checkdestroyed
+#define isc_mem_createx isc__mem_createx
+#define isc_mem_createx2 isc__mem_createx2
+#define isc_mem_create isc__mem_create
+#define isc_mem_create2 isc__mem_create2
+#define isc_mem_attach isc__mem_attach
+#define isc_mem_detach isc__mem_detach
+#define isc__mem_putanddetach isc___mem_putanddetach
+#define isc_mem_destroy isc__mem_destroy
+#define isc_mem_ondestroy isc__mem_ondestroy
+#define isc__mem_get isc___mem_get
+#define isc__mem_put isc___mem_put
+#define isc_mem_stats isc__mem_stats
+#define isc__mem_allocate isc___mem_allocate
+#define isc__mem_free isc___mem_free
+#define isc__mem_strdup isc___mem_strdup
+#define isc__mem_reallocate isc___mem_reallocate
+#define isc_mem_references isc__mem_references
+#define isc_mem_setdestroycheck isc__mem_setdestroycheck
+#define isc_mem_setquota isc__mem_setquota
+#define isc_mem_getname isc__mem_getname
+#define isc_mem_getquota isc__mem_getquota
+#define isc_mem_gettag isc__mem_gettag
+#define isc_mem_inuse isc__mem_inuse
+#define isc_mem_isovermem isc__mem_isovermem
+#define isc_mem_setname isc__mem_setname
+#define isc_mem_setwater isc__mem_setwater
+#define isc_mem_printallactive isc__mem_printallactive
+#define isc_mem_waterack isc__mem_waterack
+#define isc_mempool_create isc__mempool_create
+#define isc_mempool_setname isc__mempool_setname
+#define isc_mempool_destroy isc__mempool_destroy
+#define isc_mempool_associatelock isc__mempool_associatelock
+#define isc__mempool_get isc___mempool_get
+#define isc__mempool_put isc___mempool_put
+#define isc_mempool_setfreemax isc__mempool_setfreemax
+#define isc_mempool_getfreemax isc__mempool_getfreemax
+#define isc_mempool_getfreecount isc__mempool_getfreecount
+#define isc_mempool_setmaxalloc isc__mempool_setmaxalloc
+#define isc_mempool_getmaxalloc isc__mempool_getmaxalloc
+#define isc_mempool_getallocated isc__mempool_getallocated
+#define isc_mempool_setfillcount isc__mempool_setfillcount
+#define isc_mempool_getfillcount isc__mempool_getfillcount
+
+#define isc_socket_create isc__socket_create
+#define isc_socket_attach isc__socket_attach
+#define isc_socket_detach isc__socket_detach
+#define isc_socketmgr_create isc__socketmgr_create
+#define isc_socketmgr_create2 isc__socketmgr_create2
+#define isc_socketmgr_destroy isc__socketmgr_destroy
+#define isc_socket_open isc__socket_open
+#define isc_socket_close isc__socket_close
+#define isc_socket_recvv isc__socket_recvv
+#define isc_socket_recv isc__socket_recv
+#define isc_socket_recv2 isc__socket_recv2
+#define isc_socket_send isc__socket_send
+#define isc_socket_sendto isc__socket_sendto
+#define isc_socket_sendv isc__socket_sendv
+#define isc_socket_sendtov isc__socket_sendtov
+#define isc_socket_sendto2 isc__socket_sendto2
+#define isc_socket_cleanunix isc__socket_cleanunix
+#define isc_socket_permunix isc__socket_permunix
+#define isc_socket_bind isc__socket_bind
+#define isc_socket_filter isc__socket_filter
+#define isc_socket_listen isc__socket_listen
+#define isc_socket_accept isc__socket_accept
+#define isc_socket_connect isc__socket_connect
+#define isc_socket_getname isc__socket_getname
+#define isc_socket_gettag isc__socket_gettag
+#define isc_socket_getpeername isc__socket_getpeername
+#define isc_socket_getsockname isc__socket_getsockname
+#define isc_socket_cancel isc__socket_cancel
+#define isc_socket_gettype isc__socket_gettype
+#define isc_socket_isbound isc__socket_isbound
+#define isc_socket_ipv6only isc__socket_ipv6only
+#define isc_socket_setname isc__socket_setname
+#define isc_socketmgr_getmaxsockets isc__socketmgr_getmaxsockets
+#define isc_socketmgr_setstats isc__socketmgr_setstats
+#define isc_socketmgr_setreserved isc__socketmgr_setreserved
+#define isc__socketmgr_maxudp isc___socketmgr_maxudp
+#define isc_socket_fdwatchcreate isc__socket_fdwatchcreate
+#define isc_socket_fdwatchpoke isc__socket_fdwatchpoke
+
+#define isc_task_create isc__task_create
+#define isc_task_attach isc__task_attach
+#define isc_task_detach isc__task_detach
+/* #define isc_task_exiting isc__task_exiting XXXMPA */
+#define isc_task_send isc__task_send
+#define isc_task_sendanddetach isc__task_sendanddetach
+#define isc_task_purgerange isc__task_purgerange
+#define isc_task_purge isc__task_purge
+#define isc_task_purgeevent isc__task_purgeevent
+#define isc_task_unsendrange isc__task_unsendrange
+#define isc_task_unsend isc__task_unsend
+#define isc_task_onshutdown isc__task_onshutdown
+#define isc_task_shutdown isc__task_shutdown
+#define isc_task_destroy isc__task_destroy
+#define isc_task_setname isc__task_setname
+#define isc_task_getname isc__task_getname
+#define isc_task_gettag isc__task_gettag
+#define isc_task_getcurrenttime isc__task_getcurrenttime
+#define isc_taskmgr_create isc__taskmgr_create
+#define isc_taskmgr_destroy isc__taskmgr_destroy
+#define isc_task_beginexclusive isc__task_beginexclusive
+#define isc_task_endexclusive isc__task_endexclusive
+
+#define isc_timer_create isc__timer_create
+#define isc_timer_reset isc__timer_reset
+#define isc_timer_gettype isc__timer_gettype
+#define isc_timer_touch isc__timer_touch
+#define isc_timer_attach isc__timer_attach
+#define isc_timer_detach isc__timer_detach
+#define isc_timermgr_create isc__timermgr_create
+#define isc_timermgr_poke isc__timermgr_poke
+#define isc_timermgr_destroy isc__timermgr_destroy
+
+#endif /* BIND9 */
+
+#endif /* ISCAPI_NAMESPACE_H */
diff --git a/contrib/bind9/lib/isc/include/isc/netaddr.h b/contrib/bind9/lib/isc/include/isc/netaddr.h
index 52418ec..04b7ec1 100644
--- a/contrib/bind9/lib/isc/include/isc/netaddr.h
+++ b/contrib/bind9/lib/isc/include/isc/netaddr.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netaddr.h,v 1.35.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: netaddr.h,v 1.37 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_NETADDR_H
#define ISC_NETADDR_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/netscope.h b/contrib/bind9/lib/isc/include/isc/netscope.h
index 7b2c13c..1a50816 100644
--- a/contrib/bind9/lib/isc/include/isc/netscope.h
+++ b/contrib/bind9/lib/isc/include/isc/netscope.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netscope.h,v 1.11.332.2 2009-06-25 23:47:24 tbox Exp $ */
+/* $Id: netscope.h,v 1.13 2009-06-25 23:48:02 tbox Exp $ */
#ifndef ISC_NETSCOPE_H
#define ISC_NETSCOPE_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/platform.h.in b/contrib/bind9/lib/isc/include/isc/platform.h.in
index 99c887b..2491274 100644
--- a/contrib/bind9/lib/isc/include/isc/platform.h.in
+++ b/contrib/bind9/lib/isc/include/isc/platform.h.in
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.48.84.4 2010-06-03 23:47:49 tbox Exp $ */
+/* $Id: platform.h.in,v 1.56 2010-12-18 01:56:23 each Exp $ */
#ifndef ISC_PLATFORM_H
#define ISC_PLATFORM_H 1
@@ -146,6 +146,11 @@
*/
@ISC_PLATFORM_HAVEDEVPOLL@
+/*! \brief
+ * Define if we want to log backtrace
+ */
+@ISC_PLATFORM_USEBACKTRACE@
+
/*
*** Printing.
***/
@@ -215,6 +220,12 @@
@ISC_PLATFORM_GSSAPIHEADER@
/*
+ * Defined to <gssapi_krb5.h> or <gssapi/gssapi_krb5.h> for how to
+ * include the GSSAPI KRB5 header.
+ */
+@ISC_PLATFORM_GSSAPI_KRB5_HEADER@
+
+/*
* Defined to <krb5.h> or <krb5/krb5.h> for how to include
* the KRB5 header.
*/
@@ -290,6 +301,17 @@
*/
@ISC_PLATFORM_HAVESTRINGSH@
+/*
+ * Define if the hash functions must be provided by OpenSSL.
+ */
+@ISC_PLATFORM_OPENSSLHASH@
+
+/*
+ * Defines for the noreturn attribute.
+ */
+@ISC_PLATFORM_NORETURN_PRE@
+@ISC_PLATFORM_NORETURN_POST@
+
/***
*** Windows dll support.
***/
diff --git a/contrib/bind9/lib/isc/include/isc/portset.h b/contrib/bind9/lib/isc/include/isc/portset.h
index a257322..2e27467 100644
--- a/contrib/bind9/lib/isc/include/isc/portset.h
+++ b/contrib/bind9/lib/isc/include/isc/portset.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: portset.h,v 1.3.90.3 2009-06-25 05:31:51 marka Exp $ */
+/* $Id: portset.h,v 1.6 2009-06-25 05:28:34 marka Exp $ */
/*! \file isc/portset.h
* \brief Transport Protocol Port Manipulation Module
diff --git a/contrib/bind9/lib/isc/include/isc/radix.h b/contrib/bind9/lib/isc/include/isc/radix.h
index fa5e294..ed8aaf2 100644
--- a/contrib/bind9/lib/isc/include/isc/radix.h
+++ b/contrib/bind9/lib/isc/include/isc/radix.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: radix.h,v 1.11.44.2 2008-12-24 23:47:02 tbox Exp $ */
+/* $Id: radix.h,v 1.13 2008-12-01 23:47:45 tbox Exp $ */
/*
* This source was adapted from MRT's RCS Ids:
diff --git a/contrib/bind9/lib/isc/include/isc/random.h b/contrib/bind9/lib/isc/include/isc/random.h
index 9743cb4..e05b204 100644
--- a/contrib/bind9/lib/isc/include/isc/random.h
+++ b/contrib/bind9/lib/isc/include/isc/random.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: random.h,v 1.18.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: random.h,v 1.20 2009-01-17 23:47:43 tbox Exp $ */
#ifndef ISC_RANDOM_H
#define ISC_RANDOM_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/ratelimiter.h b/contrib/bind9/lib/isc/include/isc/ratelimiter.h
index 7ed312a..f8a9819 100644
--- a/contrib/bind9/lib/isc/include/isc/ratelimiter.h
+++ b/contrib/bind9/lib/isc/include/isc/ratelimiter.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ratelimiter.h,v 1.21.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: ratelimiter.h,v 1.23 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_RATELIMITER_H
#define ISC_RATELIMITER_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/refcount.h b/contrib/bind9/lib/isc/include/isc/refcount.h
index 8e83a13..71f35f1 100644
--- a/contrib/bind9/lib/isc/include/isc/refcount.h
+++ b/contrib/bind9/lib/isc/include/isc/refcount.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: refcount.h,v 1.15 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: refcount.h,v 1.17 2009-09-29 23:48:04 tbox Exp $ */
#ifndef ISC_REFCOUNT_H
#define ISC_REFCOUNT_H 1
@@ -28,7 +28,7 @@
#include <isc/util.h>
/*! \file isc/refcount.h
- * \brief Implements a locked reference counter.
+ * \brief Implements a locked reference counter.
*
* These functions may actually be
* implemented using macros, and implementations of these macros are below.
@@ -42,7 +42,7 @@ ISC_LANG_BEGINDECLS
* Function prototypes
*/
-/*
+/*
* isc_result_t
* isc_refcount_init(isc_refcount_t *ref, unsigned int n);
*
@@ -103,7 +103,7 @@ typedef struct isc_refcount {
isc_int32_t refs;
} isc_refcount_t;
-#define isc_refcount_destroy(rp) (REQUIRE((rp)->refs == 0))
+#define isc_refcount_destroy(rp) REQUIRE((rp)->refs == 0)
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
#define isc_refcount_increment0(rp, tp) \
@@ -192,7 +192,7 @@ typedef struct isc_refcount {
int refs;
} isc_refcount_t;
-#define isc_refcount_destroy(rp) (REQUIRE((rp)->refs == 0))
+#define isc_refcount_destroy(rp) REQUIRE((rp)->refs == 0)
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
#define isc_refcount_increment0(rp, tp) \
diff --git a/contrib/bind9/lib/isc/include/isc/result.h b/contrib/bind9/lib/isc/include/isc/result.h
index 804ab5e..cc591dc 100644
--- a/contrib/bind9/lib/isc/include/isc/result.h
+++ b/contrib/bind9/lib/isc/include/isc/result.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.h,v 1.71 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: result.h,v 1.73 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_RESULT_H
#define ISC_RESULT_H 1
@@ -42,6 +42,7 @@
#define ISC_R_EOF 14 /*%< end of file */
#define ISC_R_BOUND 15 /*%< socket already bound */
#define ISC_R_RELOAD 16 /*%< reload */
+#define ISC_R_SUSPEND ISC_R_RELOAD /*%< alias of 'reload' */
#define ISC_R_LOCKBUSY 17 /*%< lock busy */
#define ISC_R_EXISTS 18 /*%< already exists */
#define ISC_R_NOSPACE 19 /*%< ran out of space */
diff --git a/contrib/bind9/lib/isc/include/isc/resultclass.h b/contrib/bind9/lib/isc/include/isc/resultclass.h
index 86c55b6..84f6c64 100644
--- a/contrib/bind9/lib/isc/include/isc/resultclass.h
+++ b/contrib/bind9/lib/isc/include/isc/resultclass.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resultclass.h,v 1.18 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: resultclass.h,v 1.20 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_RESULTCLASS_H
#define ISC_RESULTCLASS_H 1
@@ -45,6 +45,7 @@
#define ISC_RESULTCLASS_DNSRCODE ISC_RESULTCLASS_FROMNUM(3)
#define ISC_RESULTCLASS_OMAPI ISC_RESULTCLASS_FROMNUM(4)
#define ISC_RESULTCLASS_ISCCC ISC_RESULTCLASS_FROMNUM(5)
+#define ISC_RESULTCLASS_DHCP ISC_RESULTCLASS_FROMNUM(6)
#endif /* ISC_RESULTCLASS_H */
diff --git a/contrib/bind9/lib/isc/include/isc/serial.h b/contrib/bind9/lib/isc/include/isc/serial.h
index 97d5fe1..332709d 100644
--- a/contrib/bind9/lib/isc/include/isc/serial.h
+++ b/contrib/bind9/lib/isc/include/isc/serial.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: serial.h,v 1.16.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: serial.h,v 1.18 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_SERIAL_H
#define ISC_SERIAL_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/sha1.h b/contrib/bind9/lib/isc/include/isc/sha1.h
index 4da682a..a9d08b9 100644
--- a/contrib/bind9/lib/isc/include/isc/sha1.h
+++ b/contrib/bind9/lib/isc/include/isc/sha1.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -18,7 +18,7 @@
#ifndef ISC_SHA1_H
#define ISC_SHA1_H 1
-/* $Id: sha1.h,v 1.17 2007-06-19 23:47:18 tbox Exp $ */
+/* $Id: sha1.h,v 1.19 2009-02-06 23:47:42 tbox Exp $ */
/* $NetBSD: sha1.h,v 1.2 1998/05/29 22:55:44 thorpej Exp $ */
@@ -29,16 +29,25 @@
*/
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/types.h>
#define ISC_SHA1_DIGESTLENGTH 20U
#define ISC_SHA1_BLOCK_LENGTH 64U
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/evp.h>
+
+typedef EVP_MD_CTX isc_sha1_t;
+
+#else
+
typedef struct {
isc_uint32_t state[5];
isc_uint32_t count[2];
unsigned char buffer[ISC_SHA1_BLOCK_LENGTH];
} isc_sha1_t;
+#endif
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/sha2.h b/contrib/bind9/lib/isc/include/isc/sha2.h
index c3130a8..8d4ffa6 100644
--- a/contrib/bind9/lib/isc/include/isc/sha2.h
+++ b/contrib/bind9/lib/isc/include/isc/sha2.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha2.h,v 1.9.332.2 2010-01-15 23:47:34 tbox Exp $ */
+/* $Id: sha2.h,v 1.12 2009-10-22 02:21:31 each Exp $ */
/* $FreeBSD$ */
/* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */
@@ -58,6 +58,7 @@
#define ISC_SHA2_H
#include <isc/lang.h>
+#include <isc/platform.h>
#include <isc/types.h>
/*** SHA-224/256/384/512 Various Length Definitions ***********************/
@@ -75,10 +76,15 @@
#define ISC_SHA512_DIGESTLENGTH 64U
#define ISC_SHA512_DIGESTSTRINGLENGTH (ISC_SHA512_DIGESTLENGTH * 2 + 1)
+/*** SHA-256/384/512 Context Structures *******************************/
-ISC_LANG_BEGINDECLS
+#ifdef ISC_PLATFORM_OPENSSLHASH
+#include <openssl/evp.h>
-/*** SHA-256/384/512 Context Structures *******************************/
+typedef EVP_MD_CTX isc_sha256_t;
+typedef EVP_MD_CTX isc_sha512_t;
+
+#else
/*
* Keep buffer immediately after bitcount to preserve alignment.
@@ -97,10 +103,13 @@ typedef struct {
isc_uint64_t bitcount[2];
isc_uint8_t buffer[ISC_SHA512_BLOCK_LENGTH];
} isc_sha512_t;
+#endif
typedef isc_sha256_t isc_sha224_t;
typedef isc_sha512_t isc_sha384_t;
+ISC_LANG_BEGINDECLS
+
/*** SHA-224/256/384/512 Function Prototypes ******************************/
void isc_sha224_init (isc_sha224_t *);
diff --git a/contrib/bind9/lib/isc/include/isc/sockaddr.h b/contrib/bind9/lib/isc/include/isc/sockaddr.h
index 758cef7..c83655e 100644
--- a/contrib/bind9/lib/isc/include/isc/sockaddr.h
+++ b/contrib/bind9/lib/isc/include/isc/sockaddr.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sockaddr.h,v 1.55.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: sockaddr.h,v 1.57 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_SOCKADDR_H
#define ISC_SOCKADDR_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/socket.h b/contrib/bind9/lib/isc/include/isc/socket.h
index 749ee52..0aa71da 100644
--- a/contrib/bind9/lib/isc/include/isc/socket.h
+++ b/contrib/bind9/lib/isc/include/isc/socket.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.h,v 1.85.58.3 2009-01-29 22:40:35 jinmei Exp $ */
+/* $Id: socket.h,v 1.94 2009-10-01 01:30:01 sar Exp $ */
#ifndef ISC_SOCKET_H
#define ISC_SOCKET_H 1
@@ -260,6 +260,85 @@ typedef enum {
#define ISC_SOCKFDWATCH_WRITE 0x00000002 /*%< watch for writable */
/*@}*/
+/*% Socket and socket manager methods */
+typedef struct isc_socketmgrmethods {
+ void (*destroy)(isc_socketmgr_t **managerp);
+ isc_result_t (*socketcreate)(isc_socketmgr_t *manager, int pf,
+ isc_sockettype_t type,
+ isc_socket_t **socketp);
+ isc_result_t (*fdwatchcreate)(isc_socketmgr_t *manager, int fd,
+ int flags,
+ isc_sockfdwatch_t callback,
+ void *cbarg, isc_task_t *task,
+ isc_socket_t **socketp);
+} isc_socketmgrmethods_t;
+
+typedef struct isc_socketmethods {
+ void (*attach)(isc_socket_t *socket,
+ isc_socket_t **socketp);
+ void (*detach)(isc_socket_t **socketp);
+ isc_result_t (*bind)(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+ unsigned int options);
+ isc_result_t (*sendto)(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action,
+ const void *arg, isc_sockaddr_t *address,
+ struct in6_pktinfo *pktinfo);
+ isc_result_t (*connect)(isc_socket_t *sock, isc_sockaddr_t *addr,
+ isc_task_t *task, isc_taskaction_t action,
+ const void *arg);
+ isc_result_t (*recv)(isc_socket_t *sock, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg);
+ void (*cancel)(isc_socket_t *sock, isc_task_t *task,
+ unsigned int how);
+ isc_result_t (*getsockname)(isc_socket_t *sock,
+ isc_sockaddr_t *addressp);
+ isc_sockettype_t (*gettype)(isc_socket_t *sock);
+ void (*ipv6only)(isc_socket_t *sock, isc_boolean_t yes);
+ isc_result_t (*fdwatchpoke)(isc_socket_t *sock, int flags);
+} isc_socketmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a socket manager
+ * object implementation's version of an isc_socketmgr_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. socket implementations
+ * may change the structure. 'magic' must be ISCAPI_SOCKETMGR_MAGIC for any
+ * of the isc_socket_ routines to work. socket implementations must maintain
+ * all socket invariants.
+ * In effect, this definition is used only for non-BIND9 version ("export")
+ * of the library, and the export version does not work for win32. So, to avoid
+ * the definition conflict with win32/socket.c, we enable this definition only
+ * for non-Win32 (i.e. Unix) platforms.
+ */
+#ifndef WIN32
+struct isc_socketmgr {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_socketmgrmethods_t *methods;
+};
+#endif
+
+#define ISCAPI_SOCKETMGR_MAGIC ISC_MAGIC('A','s','m','g')
+#define ISCAPI_SOCKETMGR_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_SOCKETMGR_MAGIC)
+
+/*%
+ * This is the common prefix of a socket object. The same note as
+ * that for the socketmgr structure applies.
+ */
+#ifndef WIN32
+struct isc_socket {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_socketmethods_t *methods;
+};
+#endif
+
+#define ISCAPI_SOCKET_MAGIC ISC_MAGIC('A','s','c','t')
+#define ISCAPI_SOCKET_VALID(s) ((s) != NULL && \
+ (s)->magic == ISCAPI_SOCKET_MAGIC)
+
/***
*** Socket and Socket Manager Functions
***
@@ -307,6 +386,35 @@ isc_socket_fdwatchcreate(isc_socketmgr_t *manager,
*/
isc_result_t
+isc_socket_fdwatchpoke(isc_socket_t *sock,
+ int flags);
+/*%<
+ * Poke a file descriptor watch socket informing the manager that it
+ * should restart watching the socket
+ *
+ * Note:
+ *
+ *\li 'sock' is the socket returned by isc_socket_fdwatchcreate
+ *
+ *\li 'flags' indicates what the manager should watch for on the socket
+ * in addition to what it may already be watching. It can be one or
+ * both of ISC_SOCKFDWATCH_READ and ISC_SOCKFDWATCH_WRITE. To
+ * temporarily disable watching on a socket the value indicating
+ * no more data should be returned from the call back routine.
+ *
+ *\li This function is not available on Windows.
+ *
+ * Requires:
+ *
+ *\li 'sock' is a valid isc socket
+ *
+ *
+ * Returns:
+ *
+ *\li #ISC_R_SUCCESS
+ */
+
+isc_result_t
isc_socket_create(isc_socketmgr_t *manager,
int pf,
isc_sockettype_t type,
@@ -821,6 +929,10 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
/*@}*/
isc_result_t
+isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_socketmgr_t **managerp);
+
+isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
isc_result_t
@@ -831,6 +943,8 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
* maximum number of sockets that the created manager should handle.
* isc_socketmgr_create() is equivalent of isc_socketmgr_create2() with
* "maxsocks" being zero.
+ * isc_socketmgr_createinctx() also associates the new manager with the
+ * specified application context.
*
* Notes:
*
@@ -842,6 +956,8 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
*
*\li 'managerp' points to a NULL isc_socketmgr_t.
*
+ *\li 'actx' is a valid application context (for createinctx()).
+ *
* Ensures:
*
*\li '*managerp' is a valid isc_socketmgr_t.
@@ -992,6 +1108,12 @@ isc__socketmgr_setreserved(isc_socketmgr_t *mgr, isc_uint32_t);
* Temporary. For use by named only.
*/
+void
+isc__socketmgr_maxudp(isc_socketmgr_t *mgr, int maxudp);
+/*%<
+ * Test interface. Drop UDP packet > 'maxudp'.
+ */
+
#ifdef HAVE_LIBXML2
void
@@ -1002,6 +1124,31 @@ isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer);
#endif /* HAVE_LIBXML2 */
+#ifdef USE_SOCKETIMPREGISTER
+/*%<
+ * See isc_socketmgr_create() above.
+ */
+typedef isc_result_t
+(*isc_socketmgrcreatefunc_t)(isc_mem_t *mctx, isc_socketmgr_t **managerp);
+
+isc_result_t
+isc_socket_register(isc_socketmgrcreatefunc_t createfunc);
+/*%<
+ * Register a new socket I/O implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__socket_register(void);
+/*%<
+ * A short cut function that specifies the socket I/O module in the ISC
+ * library for isc_socket_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_SOCKETIMPREGISTER */
+
ISC_LANG_ENDDECLS
#endif /* ISC_SOCKET_H */
diff --git a/contrib/bind9/lib/isc/include/isc/stats.h b/contrib/bind9/lib/isc/include/isc/stats.h
index 1148a16..226bc08 100644
--- a/contrib/bind9/lib/isc/include/isc/stats.h
+++ b/contrib/bind9/lib/isc/include/isc/stats.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.h,v 1.4.2.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.h,v 1.4 2009-01-29 01:03:56 jinmei Exp $ */
#ifndef ISC_STATS_H
#define ISC_STATS_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/symtab.h b/contrib/bind9/lib/isc/include/isc/symtab.h
index a1d7102..c61d0ea 100644
--- a/contrib/bind9/lib/isc/include/isc/symtab.h
+++ b/contrib/bind9/lib/isc/include/isc/symtab.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: symtab.h,v 1.24.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: symtab.h,v 1.26 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISC_SYMTAB_H
#define ISC_SYMTAB_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/task.h b/contrib/bind9/lib/isc/include/isc/task.h
index a8c7569..a2a1bbe 100644
--- a/contrib/bind9/lib/isc/include/isc/task.h
+++ b/contrib/bind9/lib/isc/include/isc/task.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.h,v 1.61.332.4 2010-12-03 23:45:47 tbox Exp $ */
+/* $Id: task.h,v 1.69.14.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
#ifndef ISC_TASK_H
#define ISC_TASK_H 1
@@ -96,6 +96,72 @@
ISC_LANG_BEGINDECLS
+/***
+ *** Types
+ ***/
+
+/*% Task and task manager methods */
+typedef struct isc_taskmgrmethods {
+ void (*destroy)(isc_taskmgr_t **managerp);
+ isc_result_t (*taskcreate)(isc_taskmgr_t *manager,
+ unsigned int quantum,
+ isc_task_t **taskp);
+} isc_taskmgrmethods_t;
+
+typedef struct isc_taskmethods {
+ void (*attach)(isc_task_t *source, isc_task_t **targetp);
+ void (*detach)(isc_task_t **taskp);
+ void (*destroy)(isc_task_t **taskp);
+ void (*send)(isc_task_t *task, isc_event_t **eventp);
+ void (*sendanddetach)(isc_task_t **taskp, isc_event_t **eventp);
+ unsigned int (*unsend)(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events);
+ isc_result_t (*onshutdown)(isc_task_t *task, isc_taskaction_t action,
+ const void *arg);
+ void (*shutdown)(isc_task_t *task);
+ void (*setname)(isc_task_t *task, const char *name, void *tag);
+ unsigned int (*purgeevents)(isc_task_t *task, void *sender,
+ isc_eventtype_t type, void *tag);
+ unsigned int (*purgerange)(isc_task_t *task, void *sender,
+ isc_eventtype_t first, isc_eventtype_t last,
+ void *tag);
+ isc_result_t (*beginexclusive)(isc_task_t *task);
+ void (*endexclusive)(isc_task_t *task);
+} isc_taskmethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a task manager
+ * object implementation's version of an isc_taskmgr_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. task implementations
+ * may change the structure. 'magic' must be ISCAPI_TASKMGR_MAGIC for any
+ * of the isc_task_ routines to work. task implementations must maintain
+ * all task invariants.
+ */
+struct isc_taskmgr {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_taskmgrmethods_t *methods;
+};
+
+#define ISCAPI_TASKMGR_MAGIC ISC_MAGIC('A','t','m','g')
+#define ISCAPI_TASKMGR_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_TASKMGR_MAGIC)
+
+/*%
+ * This is the common prefix of a task object. The same note as
+ * that for the taskmgr structure applies.
+ */
+struct isc_task {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_taskmethods_t *methods;
+};
+
+#define ISCAPI_TASK_MAGIC ISC_MAGIC('A','t','s','t')
+#define ISCAPI_TASK_VALID(s) ((s) != NULL && \
+ (s)->magic == ISCAPI_TASK_MAGIC)
+
isc_result_t
isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp);
@@ -550,10 +616,15 @@ isc_task_exiting(isc_task_t *t);
*****/
isc_result_t
+isc_taskmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ unsigned int workers, unsigned int default_quantum,
+ isc_taskmgr_t **managerp);
+isc_result_t
isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
unsigned int default_quantum, isc_taskmgr_t **managerp);
/*%<
- * Create a new task manager.
+ * Create a new task manager. isc_taskmgr_createinctx() also associates
+ * the new manager with the specified application context.
*
* Notes:
*
@@ -575,6 +646,8 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
*
*\li managerp != NULL && *managerp == NULL
*
+ *\li 'actx' is a valid application context (for createinctx()).
+ *
* Ensures:
*
*\li On success, '*managerp' will be attached to the newly created task
@@ -584,8 +657,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
*
*\li #ISC_R_SUCCESS
*\li #ISC_R_NOMEMORY
- *\li #ISC_R_NOTHREADS No threads could be created.
+ *\li #ISC_R_NOTHREADS No threads could be created.
*\li #ISC_R_UNEXPECTED An unexpected error occurred.
+ *\li #ISC_R_SHUTTINGDOWN The non-threaded, shared, task
+ * manager shutting down.
*/
void
@@ -629,6 +704,31 @@ isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer);
#endif
+/*%<
+ * See isc_taskmgr_create() above.
+ */
+typedef isc_result_t
+(*isc_taskmgrcreatefunc_t)(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum,
+ isc_taskmgr_t **managerp);
+
+isc_result_t
+isc_task_register(isc_taskmgrcreatefunc_t createfunc);
+/*%<
+ * Register a new task management implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc__task_register(void);
+/*%<
+ * A short cut function that specifies the task management module in the ISC
+ * library for isc_task_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+
ISC_LANG_ENDDECLS
#endif /* ISC_TASK_H */
diff --git a/contrib/bind9/lib/isc/include/isc/timer.h b/contrib/bind9/lib/isc/include/isc/timer.h
index 052e25b..a54e73b 100644
--- a/contrib/bind9/lib/isc/include/isc/timer.h
+++ b/contrib/bind9/lib/isc/include/isc/timer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer.h,v 1.40 2008-06-23 23:47:11 tbox Exp $ */
+/* $Id: timer.h,v 1.43 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_TIMER_H
#define ISC_TIMER_H 1
@@ -103,6 +103,61 @@ typedef struct isc_timerevent {
#define ISC_TIMEREVENT_LIFE (ISC_EVENTCLASS_TIMER + 3)
#define ISC_TIMEREVENT_LASTEVENT (ISC_EVENTCLASS_TIMER + 65535)
+/*% Timer and timer manager methods */
+typedef struct {
+ void (*destroy)(isc_timermgr_t **managerp);
+ isc_result_t (*timercreate)(isc_timermgr_t *manager,
+ isc_timertype_t type,
+ isc_time_t *expires,
+ isc_interval_t *interval,
+ isc_task_t *task,
+ isc_taskaction_t action,
+ const void *arg,
+ isc_timer_t **timerp);
+} isc_timermgrmethods_t;
+
+typedef struct {
+ void (*attach)(isc_timer_t *timer, isc_timer_t **timerp);
+ void (*detach)(isc_timer_t **timerp);
+ isc_result_t (*reset)(isc_timer_t *timer, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge);
+ isc_result_t (*touch)(isc_timer_t *timer);
+} isc_timermethods_t;
+
+/*%
+ * This structure is actually just the common prefix of a timer manager
+ * object implementation's version of an isc_timermgr_t.
+ * \brief
+ * Direct use of this structure by clients is forbidden. timer implementations
+ * may change the structure. 'magic' must be ISCAPI_TIMERMGR_MAGIC for any
+ * of the isc_timer_ routines to work. timer implementations must maintain
+ * all timer invariants.
+ */
+struct isc_timermgr {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_timermgrmethods_t *methods;
+};
+
+#define ISCAPI_TIMERMGR_MAGIC ISC_MAGIC('A','t','m','g')
+#define ISCAPI_TIMERMGR_VALID(m) ((m) != NULL && \
+ (m)->magic == ISCAPI_TIMERMGR_MAGIC)
+
+/*%
+ * This is the common prefix of a timer object. The same note as
+ * that for the timermgr structure applies.
+ */
+struct isc_timer {
+ unsigned int impmagic;
+ unsigned int magic;
+ isc_timermethods_t *methods;
+};
+
+#define ISCAPI_TIMER_MAGIC ISC_MAGIC('A','t','m','r')
+#define ISCAPI_TIMER_VALID(s) ((s) != NULL && \
+ (s)->magic == ISCAPI_TIMER_MAGIC)
+
/***
*** Timer and Timer Manager Functions
***
@@ -289,9 +344,14 @@ isc_timer_gettype(isc_timer_t *timer);
*/
isc_result_t
+isc_timermgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_timermgr_t **managerp);
+
+isc_result_t
isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
/*%<
- * Create a timer manager.
+ * Create a timer manager. isc_timermgr_createinctx() also associates
+ * the new manager with the specified application context.
*
* Notes:
*
@@ -303,6 +363,8 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
*
*\li 'managerp' points to a NULL isc_timermgr_t.
*
+ *\li 'actx' is a valid application context (for createinctx()).
+ *
* Ensures:
*
*\li '*managerp' is a valid isc_timermgr_t.
@@ -339,6 +401,31 @@ isc_timermgr_destroy(isc_timermgr_t **managerp);
void isc_timermgr_poke(isc_timermgr_t *m);
+#ifdef USE_TIMERIMPREGISTER
+/*%<
+ * See isc_timermgr_create() above.
+ */
+typedef isc_result_t
+(*isc_timermgrcreatefunc_t)(isc_mem_t *mctx, isc_timermgr_t **managerp);
+
+isc_result_t
+isc__timer_register(void);
+/*%<
+ * Register a new timer management implementation and add it to the list of
+ * supported implementations. This function must be called when a different
+ * event library is used than the one contained in the ISC library.
+ */
+
+isc_result_t
+isc_timer_register(isc_timermgrcreatefunc_t createfunc);
+/*%<
+ * A short cut function that specifies the timer management module in the ISC
+ * library for isc_timer_register(). An application that uses the ISC library
+ * usually do not have to care about this function: it would call
+ * isc_lib_register(), which internally calls this function.
+ */
+#endif /* USE_TIMERIMPREGISTER */
+
ISC_LANG_ENDDECLS
#endif /* ISC_TIMER_H */
diff --git a/contrib/bind9/lib/isc/include/isc/types.h b/contrib/bind9/lib/isc/include/isc/types.h
index 01362b8..10da62b 100644
--- a/contrib/bind9/lib/isc/include/isc/types.h
+++ b/contrib/bind9/lib/isc/include/isc/types.h
@@ -15,11 +15,14 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.46.84.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: types.h,v 1.52 2009-12-05 23:31:41 each Exp $ */
#ifndef ISC_TYPES_H
#define ISC_TYPES_H 1
+#include <isc/bind9.h>
+#include <isc/namespace.h>
+
/*! \file isc/types.h
* \brief
* OS-specific types, from the OS-specific include directories.
@@ -40,6 +43,8 @@
/* Core Types. Alphabetized by defined type. */
+typedef struct isc_appctx isc_appctx_t; /*%< Application context */
+typedef struct isc_backtrace_symmap isc_backtrace_symmap_t; /*%< Symbol Table Entry */
typedef struct isc_bitstring isc_bitstring_t; /*%< Bitstring */
typedef struct isc_buffer isc_buffer_t; /*%< Buffer */
typedef ISC_LIST(isc_buffer_t) isc_bufferlist_t; /*%< Buffer List */
@@ -94,7 +99,7 @@ typedef struct isc_timer isc_timer_t; /*%< Timer */
typedef struct isc_timermgr isc_timermgr_t; /*%< Timer Manager */
typedef void (*isc_taskaction_t)(isc_task_t *, isc_event_t *);
-typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *);
+typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *, int);
/* The following cannot be listed alphabetically due to forward reference */
typedef isc_result_t (isc_httpdaction_t)(const char *url,
diff --git a/contrib/bind9/lib/isc/include/isc/util.h b/contrib/bind9/lib/isc/include/isc/util.h
index 8ccad8d..11d0044 100644
--- a/contrib/bind9/lib/isc/include/isc/util.h
+++ b/contrib/bind9/lib/isc/include/isc/util.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: util.h,v 1.30.332.2 2010-01-11 23:47:22 tbox Exp $ */
+/* $Id: util.h,v 1.32 2010-01-11 23:48:37 tbox Exp $ */
#ifndef ISC_UTIL_H
#define ISC_UTIL_H 1
diff --git a/contrib/bind9/lib/isc/inet_aton.c b/contrib/bind9/lib/isc/inet_aton.c
index 3c25ca3..9e35a36 100644
--- a/contrib/bind9/lib/isc/inet_aton.c
+++ b/contrib/bind9/lib/isc/inet_aton.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -71,7 +71,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
-static char rcsid[] = "$Id: inet_aton.c,v 1.21.332.2 2009-03-05 23:47:03 tbox Exp $";
+static char rcsid[] = "$Id: inet_aton.c,v 1.23 2008-12-01 23:47:45 tbox Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/inet_ntop.c b/contrib/bind9/lib/isc/inet_ntop.c
index 22930f3..581ebe8 100644
--- a/contrib/bind9/lib/isc/inet_ntop.c
+++ b/contrib/bind9/lib/isc/inet_ntop.c
@@ -19,7 +19,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] =
- "$Id: inet_ntop.c,v 1.19.332.2 2009-07-18 23:47:25 tbox Exp $";
+ "$Id: inet_ntop.c,v 1.21 2009-07-17 23:47:41 tbox Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/iterated_hash.c b/contrib/bind9/lib/isc/iterated_hash.c
index ebc5076..7185075 100644
--- a/contrib/bind9/lib/isc/iterated_hash.c
+++ b/contrib/bind9/lib/isc/iterated_hash.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: iterated_hash.c,v 1.4.48.2 2009-02-18 23:47:12 tbox Exp $ */
+/* $Id: iterated_hash.c,v 1.6 2009-02-18 23:47:48 tbox Exp $ */
#include "config.h"
diff --git a/contrib/bind9/lib/isc/lib.c b/contrib/bind9/lib/isc/lib.c
index 99b0178..1b6ccc0 100644
--- a/contrib/bind9/lib/isc/lib.c
+++ b/contrib/bind9/lib/isc/lib.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.c,v 1.14 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: lib.c,v 1.16 2009-09-02 23:48:02 tbox Exp $ */
/*! \file */
@@ -24,9 +24,15 @@
#include <stdio.h>
#include <stdlib.h>
-#include <isc/once.h>
-#include <isc/msgs.h>
+#include <isc/app.h>
#include <isc/lib.h>
+#include <isc/mem.h>
+#include <isc/msgs.h>
+#include <isc/once.h>
+#include <isc/socket.h>
+#include <isc/task.h>
+#include <isc/timer.h>
+#include <isc/util.h>
/***
*** Globals
@@ -41,7 +47,6 @@ LIBISC_EXTERNAL_DATA isc_msgcat_t * isc_msgcat = NULL;
static isc_once_t msgcat_once = ISC_ONCE_INIT;
-
/***
*** Functions
***/
@@ -77,3 +82,22 @@ isc_lib_initmsgcat(void) {
abort();
}
}
+
+#ifndef BIND9
+static isc_once_t register_once = ISC_ONCE_INIT;
+
+static void
+do_register(void) {
+ RUNTIME_CHECK(isc__mem_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__app_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__task_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__socket_register() == ISC_R_SUCCESS);
+ RUNTIME_CHECK(isc__timer_register() == ISC_R_SUCCESS);
+}
+
+void
+isc_lib_register() {
+ RUNTIME_CHECK(isc_once_do(&register_once, do_register)
+ == ISC_R_SUCCESS);
+}
+#endif
diff --git a/contrib/bind9/lib/isc/log.c b/contrib/bind9/lib/isc/log.c
index 121bd25..7ef6692 100644
--- a/contrib/bind9/lib/isc/log.c
+++ b/contrib/bind9/lib/isc/log.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.94.332.5 2009-02-16 02:04:05 marka Exp $ */
+/* $Id: log.c,v 1.99 2009-02-16 02:01:16 marka Exp $ */
/*! \file
* \author Principal Authors: DCL */
diff --git a/contrib/bind9/lib/isc/md5.c b/contrib/bind9/lib/isc/md5.c
index b9ec42c..b778177 100644
--- a/contrib/bind9/lib/isc/md5.c
+++ b/contrib/bind9/lib/isc/md5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md5.c,v 1.14 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: md5.c,v 1.16 2009-02-06 23:47:42 tbox Exp $ */
/*! \file
* This code implements the MD5 message-digest algorithm.
@@ -38,10 +38,35 @@
#include <isc/assertions.h>
#include <isc/md5.h>
+#include <isc/platform.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_md5_init(isc_md5_t *ctx) {
+ EVP_DigestInit(ctx, EVP_md5());
+}
+
+void
+isc_md5_invalidate(isc_md5_t *ctx) {
+ EVP_MD_CTX_cleanup(ctx);
+}
+
+void
+isc_md5_update(isc_md5_t *ctx, const unsigned char *buf, unsigned int len) {
+ EVP_DigestUpdate(ctx, (const void *) buf, (size_t) len);
+}
+
+void
+isc_md5_final(isc_md5_t *ctx, unsigned char *digest) {
+ EVP_DigestFinal(ctx, digest, NULL);
+}
+
+#else
+
static void
byteSwap(isc_uint32_t *buf, unsigned words)
{
@@ -249,3 +274,4 @@ isc_md5_final(isc_md5_t *ctx, unsigned char *digest) {
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(isc_md5_t)); /* In case it's sensitive */
}
+#endif
diff --git a/contrib/bind9/lib/isc/mem.c b/contrib/bind9/lib/isc/mem.c
index aeacfc0..8311569 100644
--- a/contrib/bind9/lib/isc/mem.c
+++ b/contrib/bind9/lib/isc/mem.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.c,v 1.145.120.9 2010-08-11 23:45:49 tbox Exp $ */
+/* $Id: mem.c,v 1.160 2010-12-08 02:46:16 marka Exp $ */
/*! \file */
@@ -60,6 +60,9 @@ LIBISC_EXTERNAL_DATA unsigned int isc_mem_debugging = ISC_MEM_DEBUGGING;
/*
* Types.
*/
+typedef struct isc__mem isc__mem_t;
+typedef struct isc__mempool isc__mempool_t;
+
#if ISC_MEM_TRACKLINES
typedef struct debuglink debuglink_t;
struct debuglink {
@@ -89,7 +92,7 @@ typedef struct {
*/
union {
size_t size;
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
char bytes[ALIGNMENT_SIZE];
} u;
} size_info;
@@ -110,7 +113,7 @@ typedef ISC_LIST(debuglink_t) debuglist_t;
/* List of all active memory contexts. */
-static ISC_LIST(isc_mem_t) contexts;
+static ISC_LIST(isc__mem_t) contexts;
static isc_once_t once = ISC_ONCE_INIT;
static isc_mutex_t lock;
@@ -120,8 +123,8 @@ static isc_mutex_t lock;
*/
static isc_uint64_t totallost;
-struct isc_mem {
- unsigned int magic;
+struct isc__mem {
+ isc_mem_t common;
isc_ondestroy_t ondestroy;
unsigned int flags;
isc_mutex_t lock;
@@ -144,7 +147,7 @@ struct isc_mem {
isc_boolean_t is_overmem;
isc_mem_water_t water;
void * water_arg;
- ISC_LIST(isc_mempool_t) pools;
+ ISC_LIST(isc__mempool_t) pools;
unsigned int poolcnt;
/* ISC_MEMFLAG_INTERNAL */
@@ -163,19 +166,19 @@ struct isc_mem {
#endif
unsigned int memalloc_failures;
- ISC_LINK(isc_mem_t) link;
+ ISC_LINK(isc__mem_t) link;
};
#define MEMPOOL_MAGIC ISC_MAGIC('M', 'E', 'M', 'p')
#define VALID_MEMPOOL(c) ISC_MAGIC_VALID(c, MEMPOOL_MAGIC)
-struct isc_mempool {
+struct isc__mempool {
/* always unlocked */
- unsigned int magic; /*%< magic number */
+ isc_mempool_t common; /*%< common header of mempool's */
isc_mutex_t *lock; /*%< optional lock */
- isc_mem_t *mctx; /*%< our memory context */
+ isc__mem_t *mctx; /*%< our memory context */
/*%< locked via the memory context's lock */
- ISC_LINK(isc_mempool_t) link; /*%< next pool in this mem context */
+ ISC_LINK(isc__mempool_t) link; /*%< next pool in this mem context */
/*%< optionally locked from here down */
element *items; /*%< low water item list */
size_t size; /*%< size of each item on this pool */
@@ -210,13 +213,187 @@ struct isc_mempool {
#define DELETE_TRACE(a, b, c, d, e) delete_trace_entry(a, b, c, d, e)
static void
-print_active(isc_mem_t *ctx, FILE *out);
+print_active(isc__mem_t *ctx, FILE *out);
+
+/*%
+ * The following can be either static or public, depending on build environment.
+ */
+
+#ifdef BIND9
+#define ISC_MEMFUNC_SCOPE
+#else
+#define ISC_MEMFUNC_SCOPE static
+#endif
+
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx2(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp, unsigned int flags);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create(size_t init_max_size, size_t target_size, isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create2(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags);
+ISC_MEMFUNC_SCOPE void
+isc__mem_attach(isc_mem_t *source, isc_mem_t **targetp);
+ISC_MEMFUNC_SCOPE void
+isc__mem_detach(isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE void
+isc___mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mem_destroy(isc_mem_t **ctxp);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event);
+ISC_MEMFUNC_SCOPE void *
+isc___mem_get(isc_mem_t *ctx, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc___mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mem_stats(isc_mem_t *ctx, FILE *out);
+ISC_MEMFUNC_SCOPE void *
+isc___mem_allocate(isc_mem_t *ctx, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void *
+isc___mem_reallocate(isc_mem_t *ctx, void *ptr, size_t size FLARG);
+ISC_MEMFUNC_SCOPE void
+isc___mem_free(isc_mem_t *ctx, void *ptr FLARG);
+ISC_MEMFUNC_SCOPE char *
+isc___mem_strdup(isc_mem_t *mctx, const char *s FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setquota(isc_mem_t *ctx, size_t quota);
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_getquota(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_inuse(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE isc_boolean_t
+isc__mem_isovermem(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
+ size_t hiwater, size_t lowater);
+ISC_MEMFUNC_SCOPE void
+isc__mem_waterack(isc_mem_t *ctx0, int flag);
+ISC_MEMFUNC_SCOPE void
+isc__mem_setname(isc_mem_t *ctx, const char *name, void *tag);
+ISC_MEMFUNC_SCOPE const char *
+isc__mem_getname(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE void *
+isc__mem_gettag(isc_mem_t *ctx);
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setname(isc_mempool_t *mpctx, const char *name);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_destroy(isc_mempool_t **mpctxp);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock);
+ISC_MEMFUNC_SCOPE void *
+isc___mempool_get(isc_mempool_t *mpctx FLARG);
+ISC_MEMFUNC_SCOPE void
+isc___mempool_put(isc_mempool_t *mpctx, void *mem FLARG);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreemax(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreecount(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getmaxalloc(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getallocated(isc_mempool_t *mpctx);
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfillcount(isc_mempool_t *mpctx);
+#ifdef BIND9
+ISC_MEMFUNC_SCOPE void
+isc__mem_printactive(isc_mem_t *ctx0, FILE *file);
+ISC_MEMFUNC_SCOPE void
+isc__mem_printallactive(FILE *file);
+ISC_MEMFUNC_SCOPE void
+isc__mem_checkdestroyed(FILE *file);
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mem_references(isc_mem_t *ctx0);
+#endif
+
+static struct isc__memmethods {
+ isc_memmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *createx, *create, *create2, *ondestroy, *stats,
+ *setquota, *getquota, *setname, *getname, *gettag;
+#endif
+} memmethods = {
+ {
+ isc__mem_attach,
+ isc__mem_detach,
+ isc__mem_destroy,
+ isc___mem_get,
+ isc___mem_put,
+ isc___mem_putanddetach,
+ isc___mem_allocate,
+ isc___mem_reallocate,
+ isc___mem_strdup,
+ isc___mem_free,
+ isc__mem_setdestroycheck,
+ isc__mem_setwater,
+ isc__mem_waterack,
+ isc__mem_inuse,
+ isc__mem_isovermem,
+ isc__mempool_create
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__mem_createx, (void *)isc__mem_create,
+ (void *)isc__mem_create2, (void *)isc__mem_ondestroy,
+ (void *)isc__mem_stats, (void *)isc__mem_setquota,
+ (void *)isc__mem_getquota, (void *)isc__mem_setname,
+ (void *)isc__mem_getname, (void *)isc__mem_gettag
+#endif
+};
+
+static struct isc__mempoolmethods {
+ isc_mempoolmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *getfreemax, *getfreecount, *getmaxalloc, *getfillcount;
+#endif
+} mempoolmethods = {
+ {
+ isc__mempool_destroy,
+ isc___mempool_get,
+ isc___mempool_put,
+ isc__mempool_getallocated,
+ isc__mempool_setmaxalloc,
+ isc__mempool_setfreemax,
+ isc__mempool_setname,
+ isc__mempool_associatelock,
+ isc__mempool_setfillcount
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__mempool_getfreemax, (void *)isc__mempool_getfreecount,
+ (void *)isc__mempool_getmaxalloc, (void *)isc__mempool_getfillcount
+#endif
+};
/*!
* mctx must be locked.
*/
static inline void
-add_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size
+add_trace_entry(isc__mem_t *mctx, const void *ptr, unsigned int size
FLARG)
{
debuglink_t *dl;
@@ -276,7 +453,7 @@ add_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size
}
static inline void
-delete_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size,
+delete_trace_entry(isc__mem_t *mctx, const void *ptr, unsigned int size,
const char *file, unsigned int line)
{
debuglink_t *dl;
@@ -347,7 +524,7 @@ quantize(size_t size) {
}
static inline isc_boolean_t
-more_basic_blocks(isc_mem_t *ctx) {
+more_basic_blocks(isc__mem_t *ctx) {
void *new;
unsigned char *curr, *next;
unsigned char *first, *last;
@@ -417,7 +594,7 @@ more_basic_blocks(isc_mem_t *ctx) {
}
static inline isc_boolean_t
-more_frags(isc_mem_t *ctx, size_t new_size) {
+more_frags(isc__mem_t *ctx, size_t new_size) {
int i, frags;
size_t total_size;
void *new;
@@ -479,7 +656,7 @@ more_frags(isc_mem_t *ctx, size_t new_size) {
}
static inline void *
-mem_getunlocked(isc_mem_t *ctx, size_t size) {
+mem_getunlocked(isc__mem_t *ctx, size_t size) {
size_t new_size = quantize(size);
void *ret;
@@ -560,7 +737,7 @@ check_overrun(void *mem, size_t size, size_t new_size) {
#endif
static inline void
-mem_putunlocked(isc_mem_t *ctx, void *mem, size_t size) {
+mem_putunlocked(isc__mem_t *ctx, void *mem, size_t size) {
size_t new_size = quantize(size);
if (size == ctx->max_size || new_size >= ctx->max_size) {
@@ -608,7 +785,7 @@ mem_putunlocked(isc_mem_t *ctx, void *mem, size_t size) {
* Perform a malloc, doing memory filling and overrun detection as necessary.
*/
static inline void *
-mem_get(isc_mem_t *ctx, size_t size) {
+mem_get(isc__mem_t *ctx, size_t size) {
char *ret;
#if ISC_MEM_CHECKOVERRUN
@@ -636,7 +813,7 @@ mem_get(isc_mem_t *ctx, size_t size) {
* Perform a free, doing memory filling and overrun detection as necessary.
*/
static inline void
-mem_put(isc_mem_t *ctx, void *mem, size_t size) {
+mem_put(isc__mem_t *ctx, void *mem, size_t size) {
#if ISC_MEM_CHECKOVERRUN
INSIST(((unsigned char *)mem)[size] == 0xbe);
#endif
@@ -652,7 +829,7 @@ mem_put(isc_mem_t *ctx, void *mem, size_t size) {
* Update internal counters after a memory get.
*/
static inline void
-mem_getstats(isc_mem_t *ctx, size_t size) {
+mem_getstats(isc__mem_t *ctx, size_t size) {
ctx->total += size;
ctx->inuse += size;
@@ -669,7 +846,7 @@ mem_getstats(isc_mem_t *ctx, size_t size) {
* Update internal counters after a memory put.
*/
static inline void
-mem_putstats(isc_mem_t *ctx, void *ptr, size_t size) {
+mem_putstats(isc__mem_t *ctx, void *ptr, size_t size) {
UNUSED(ptr);
INSIST(ctx->inuse >= size);
@@ -713,22 +890,22 @@ initialize_action(void) {
* Public.
*/
-isc_result_t
-isc_mem_createx(size_t init_max_size, size_t target_size,
- isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
- isc_mem_t **ctxp)
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp)
{
- return (isc_mem_createx2(init_max_size, target_size, memalloc, memfree,
- arg, ctxp, ISC_MEMFLAG_DEFAULT));
+ return (isc__mem_createx2(init_max_size, target_size, memalloc, memfree,
+ arg, ctxp, ISC_MEMFLAG_DEFAULT));
}
-isc_result_t
-isc_mem_createx2(size_t init_max_size, size_t target_size,
- isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
- isc_mem_t **ctxp, unsigned int flags)
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_createx2(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp, unsigned int flags)
{
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
isc_result_t result;
REQUIRE(ctxp != NULL && *ctxp == NULL);
@@ -769,7 +946,9 @@ isc_mem_createx2(size_t init_max_size, size_t target_size,
ctx->is_overmem = ISC_FALSE;
ctx->water = NULL;
ctx->water_arg = NULL;
- ctx->magic = MEM_MAGIC;
+ ctx->common.impmagic = MEM_MAGIC;
+ ctx->common.magic = ISCAPI_MCTX_MAGIC;
+ ctx->common.methods = (isc_memmethods_t *)&memmethods;
isc_ondestroy_init(&ctx->ondestroy);
ctx->memalloc = memalloc;
ctx->memfree = memfree;
@@ -834,7 +1013,7 @@ isc_mem_createx2(size_t init_max_size, size_t target_size,
ISC_LIST_INITANDAPPEND(contexts, ctx, link);
UNLOCK(&lock);
- *ctxp = ctx;
+ *ctxp = (isc_mem_t *)ctx;
return (ISC_R_SUCCESS);
error:
@@ -855,26 +1034,24 @@ isc_mem_createx2(size_t init_max_size, size_t target_size,
return (result);
}
-isc_result_t
-isc_mem_create(size_t init_max_size, size_t target_size,
- isc_mem_t **ctxp)
-{
- return (isc_mem_createx2(init_max_size, target_size,
- default_memalloc, default_memfree, NULL,
- ctxp, ISC_MEMFLAG_DEFAULT));
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create(size_t init_max_size, size_t target_size, isc_mem_t **ctxp) {
+ return (isc__mem_createx2(init_max_size, target_size,
+ default_memalloc, default_memfree, NULL,
+ ctxp, ISC_MEMFLAG_DEFAULT));
}
-isc_result_t
-isc_mem_create2(size_t init_max_size, size_t target_size,
- isc_mem_t **ctxp, unsigned int flags)
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_create2(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags)
{
- return (isc_mem_createx2(init_max_size, target_size,
- default_memalloc, default_memfree, NULL,
- ctxp, flags));
+ return (isc__mem_createx2(init_max_size, target_size,
+ default_memalloc, default_memfree, NULL,
+ ctxp, flags));
}
static void
-destroy(isc_mem_t *ctx) {
+destroy(isc__mem_t *ctx) {
unsigned int i;
isc_ondestroy_t ondest;
@@ -883,7 +1060,8 @@ destroy(isc_mem_t *ctx) {
totallost += ctx->inuse;
UNLOCK(&lock);
- ctx->magic = 0;
+ ctx->common.impmagic = 0;
+ ctx->common.magic = 0;
INSIST(ISC_LIST_EMPTY(ctx->pools));
@@ -941,8 +1119,10 @@ destroy(isc_mem_t *ctx) {
isc_ondestroy_notify(&ondest, ctx);
}
-void
-isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_attach(isc_mem_t *source0, isc_mem_t **targetp) {
+ isc__mem_t *source = (isc__mem_t *)source0;
+
REQUIRE(VALID_CONTEXT(source));
REQUIRE(targetp != NULL && *targetp == NULL);
@@ -950,16 +1130,16 @@ isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
source->references++;
MCTXUNLOCK(source, &source->lock);
- *targetp = source;
+ *targetp = (isc_mem_t *)source;
}
-void
-isc_mem_detach(isc_mem_t **ctxp) {
- isc_mem_t *ctx;
+ISC_MEMFUNC_SCOPE void
+isc__mem_detach(isc_mem_t **ctxp) {
+ isc__mem_t *ctx;
isc_boolean_t want_destroy = ISC_FALSE;
REQUIRE(ctxp != NULL);
- ctx = *ctxp;
+ ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -985,15 +1165,15 @@ isc_mem_detach(isc_mem_t **ctxp) {
* isc_mem_detach(&mctx);
*/
-void
-isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
- isc_mem_t *ctx;
+ISC_MEMFUNC_SCOPE void
+isc___mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
+ isc__mem_t *ctx;
isc_boolean_t want_destroy = ISC_FALSE;
size_info *si;
size_t oldsize;
REQUIRE(ctxp != NULL);
- ctx = *ctxp;
+ ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(ptr != NULL);
@@ -1011,7 +1191,7 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
oldsize -= ALIGNMENT_SIZE;
INSIST(oldsize == size);
}
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc_mem_free((isc_mem_t *)ctx, ptr);
MCTXLOCK(ctx, &ctx->lock);
ctx->references--;
@@ -1045,9 +1225,9 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
destroy(ctx);
}
-void
-isc_mem_destroy(isc_mem_t **ctxp) {
- isc_mem_t *ctx;
+ISC_MEMFUNC_SCOPE void
+isc__mem_destroy(isc_mem_t **ctxp) {
+ isc__mem_t *ctx;
/*
* This routine provides legacy support for callers who use mctxs
@@ -1055,7 +1235,7 @@ isc_mem_destroy(isc_mem_t **ctxp) {
*/
REQUIRE(ctxp != NULL);
- ctx = *ctxp;
+ ctx = (isc__mem_t *)*ctxp;
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1072,8 +1252,9 @@ isc_mem_destroy(isc_mem_t **ctxp) {
*ctxp = NULL;
}
-isc_result_t
-isc_mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event) {
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mem_ondestroy(isc_mem_t *ctx0, isc_task_t *task, isc_event_t **event) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
isc_result_t res;
MCTXLOCK(ctx, &ctx->lock);
@@ -1083,16 +1264,16 @@ isc_mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event) {
return (res);
}
-
-void *
-isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mem_get(isc_mem_t *ctx0, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
void *ptr;
isc_boolean_t call_water = ISC_FALSE;
REQUIRE(VALID_CONTEXT(ctx));
if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0)
- return (isc__mem_allocate(ctx, size FLARG_PASS));
+ return (isc__mem_allocate(ctx0, size FLARG_PASS));
if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
MCTXLOCK(ctx, &ctx->lock);
@@ -1128,9 +1309,9 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
return (ptr);
}
-void
-isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
-{
+ISC_MEMFUNC_SCOPE void
+isc___mem_put(isc_mem_t *ctx0, void *ptr, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
isc_boolean_t call_water = ISC_FALSE;
size_info *si;
size_t oldsize;
@@ -1146,7 +1327,7 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
oldsize -= ALIGNMENT_SIZE;
INSIST(oldsize == size);
}
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc_mem_free((isc_mem_t *)ctx, ptr);
return;
}
@@ -1181,8 +1362,10 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
(ctx->water)(ctx->water_arg, ISC_MEM_LOWATER);
}
-void
-isc_mem_waterack(isc_mem_t *ctx, int flag) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_waterack(isc_mem_t *ctx0, int flag) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1195,7 +1378,7 @@ isc_mem_waterack(isc_mem_t *ctx, int flag) {
#if ISC_MEM_TRACKLINES
static void
-print_active(isc_mem_t *mctx, FILE *out) {
+print_active(isc__mem_t *mctx, FILE *out) {
if (mctx->debuglist != NULL) {
debuglink_t *dl;
unsigned int i, j;
@@ -1237,11 +1420,12 @@ print_active(isc_mem_t *mctx, FILE *out) {
/*
* Print the stats[] on the stream "out" with suitable formatting.
*/
-void
-isc_mem_stats(isc_mem_t *ctx, FILE *out) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_stats(isc_mem_t *ctx0, FILE *out) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_t i;
const struct stats *s;
- const isc_mempool_t *pool;
+ const isc__mempool_t *pool;
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1314,7 +1498,8 @@ isc_mem_stats(isc_mem_t *ctx, FILE *out) {
*/
static void *
-isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
+isc__mem_allocateunlocked(isc_mem_t *ctx0, size_t size) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_info *si;
size += ALIGNMENT_SIZE;
@@ -1336,8 +1521,9 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
return (&si[1]);
}
-void *
-isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mem_allocate(isc_mem_t *ctx0, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_info *si;
isc_boolean_t call_water = ISC_FALSE;
@@ -1345,9 +1531,9 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
MCTXLOCK(ctx, &ctx->lock);
- si = isc__mem_allocateunlocked(ctx, size);
+ si = isc__mem_allocateunlocked((isc_mem_t *)ctx, size);
} else {
- si = isc__mem_allocateunlocked(ctx, size);
+ si = isc__mem_allocateunlocked((isc_mem_t *)ctx, size);
MCTXLOCK(ctx, &ctx->lock);
if (si != NULL)
mem_getstats(ctx, si[-1].u.size);
@@ -1381,8 +1567,9 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
return (si);
}
-void *
-isc__mem_reallocate(isc_mem_t *ctx, void *ptr, size_t size FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mem_reallocate(isc_mem_t *ctx0, void *ptr, size_t size FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
void *new_ptr = NULL;
size_t oldsize, copysize;
@@ -1400,23 +1587,24 @@ isc__mem_reallocate(isc_mem_t *ctx, void *ptr, size_t size FLARG) {
* NULL if allocation fails or doesn't happen.
*/
if (size > 0U) {
- new_ptr = isc__mem_allocate(ctx, size FLARG_PASS);
+ new_ptr = isc__mem_allocate(ctx0, size FLARG_PASS);
if (new_ptr != NULL && ptr != NULL) {
oldsize = (((size_info *)ptr)[-1]).u.size;
INSIST(oldsize >= ALIGNMENT_SIZE);
oldsize -= ALIGNMENT_SIZE;
copysize = oldsize > size ? size : oldsize;
memcpy(new_ptr, ptr, copysize);
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc__mem_free(ctx0, ptr FLARG_PASS);
}
} else if (ptr != NULL)
- isc__mem_free(ctx, ptr FLARG_PASS);
+ isc__mem_free(ctx0, ptr FLARG_PASS);
return (new_ptr);
}
-void
-isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
+ISC_MEMFUNC_SCOPE void
+isc___mem_free(isc_mem_t *ctx0, void *ptr FLARG) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_info *si;
size_t size;
isc_boolean_t call_water= ISC_FALSE;
@@ -1472,8 +1660,9 @@ isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
* Other useful things.
*/
-char *
-isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
+ISC_MEMFUNC_SCOPE char *
+isc___mem_strdup(isc_mem_t *mctx0, const char *s FLARG) {
+ isc__mem_t *mctx = (isc__mem_t *)mctx0;
size_t len;
char *ns;
@@ -1482,7 +1671,7 @@ isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
len = strlen(s);
- ns = isc__mem_allocate(mctx, len + 1 FLARG_PASS);
+ ns = isc___mem_allocate((isc_mem_t *)mctx, len + 1 FLARG_PASS);
if (ns != NULL)
strncpy(ns, s, len + 1);
@@ -1490,8 +1679,10 @@ isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
return (ns);
}
-void
-isc_mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_setdestroycheck(isc_mem_t *ctx0, isc_boolean_t flag) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1504,8 +1695,10 @@ isc_mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag) {
* Quotas
*/
-void
-isc_mem_setquota(isc_mem_t *ctx, size_t quota) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_setquota(isc_mem_t *ctx0, size_t quota) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -1514,8 +1707,9 @@ isc_mem_setquota(isc_mem_t *ctx, size_t quota) {
MCTXUNLOCK(ctx, &ctx->lock);
}
-size_t
-isc_mem_getquota(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_getquota(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_t quota;
REQUIRE(VALID_CONTEXT(ctx));
@@ -1528,8 +1722,9 @@ isc_mem_getquota(isc_mem_t *ctx) {
return (quota);
}
-size_t
-isc_mem_inuse(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE size_t
+isc__mem_inuse(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
size_t inuse;
REQUIRE(VALID_CONTEXT(ctx));
@@ -1542,10 +1737,11 @@ isc_mem_inuse(isc_mem_t *ctx) {
return (inuse);
}
-void
-isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
+ISC_MEMFUNC_SCOPE void
+isc__mem_setwater(isc_mem_t *ctx0, isc_mem_water_t water, void *water_arg,
size_t hiwater, size_t lowater)
{
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
isc_boolean_t callwater = ISC_FALSE;
isc_mem_water_t oldwater;
void *oldwater_arg;
@@ -1580,8 +1776,10 @@ isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
(oldwater)(oldwater_arg, ISC_MEM_LOWATER);
}
-isc_boolean_t
-isc_mem_isovermem(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE isc_boolean_t
+isc__mem_isovermem(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
/*
@@ -1592,8 +1790,10 @@ isc_mem_isovermem(isc_mem_t *ctx) {
return (ctx->is_overmem);
}
-void
-isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_setname(isc_mem_t *ctx0, const char *name, void *tag) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
LOCK(&ctx->lock);
@@ -1603,15 +1803,19 @@ isc_mem_setname(isc_mem_t *ctx, const char *name, void *tag) {
UNLOCK(&ctx->lock);
}
-const char *
-isc_mem_getname(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE const char *
+isc__mem_getname(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
return (ctx->name);
}
-void *
-isc_mem_gettag(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE void *
+isc__mem_gettag(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
+
REQUIRE(VALID_CONTEXT(ctx));
return (ctx->tag);
@@ -1621,9 +1825,10 @@ isc_mem_gettag(isc_mem_t *ctx) {
* Memory pool stuff
*/
-isc_result_t
-isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
- isc_mempool_t *mpctx;
+ISC_MEMFUNC_SCOPE isc_result_t
+isc__mempool_create(isc_mem_t *mctx0, size_t size, isc_mempool_t **mpctxp) {
+ isc__mem_t *mctx = (isc__mem_t *)mctx0;
+ isc__mempool_t *mpctx;
REQUIRE(VALID_CONTEXT(mctx));
REQUIRE(size > 0U);
@@ -1633,11 +1838,13 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
* Allocate space for this pool, initialize values, and if all works
* well, attach to the memory context.
*/
- mpctx = isc_mem_get(mctx, sizeof(isc_mempool_t));
+ mpctx = isc_mem_get((isc_mem_t *)mctx, sizeof(isc__mempool_t));
if (mpctx == NULL)
return (ISC_R_NOMEMORY);
- mpctx->magic = MEMPOOL_MAGIC;
+ mpctx->common.methods = (isc_mempoolmethods_t *)&mempoolmethods;
+ mpctx->common.impmagic = MEMPOOL_MAGIC;
+ mpctx->common.magic = ISCAPI_MPOOL_MAGIC;
mpctx->lock = NULL;
mpctx->mctx = mctx;
mpctx->size = size;
@@ -1652,7 +1859,7 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
#endif
mpctx->items = NULL;
- *mpctxp = mpctx;
+ *mpctxp = (isc_mempool_t *)mpctx;
MCTXLOCK(mctx, &mctx->lock);
ISC_LIST_INITANDAPPEND(mctx->pools, mpctx, link);
@@ -1662,9 +1869,12 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
return (ISC_R_SUCCESS);
}
-void
-isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setname(isc_mempool_t *mpctx0, const char *name) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(name != NULL);
+ REQUIRE(VALID_MEMPOOL(mpctx));
#if ISC_MEMPOOL_NAMES
if (mpctx->lock != NULL)
@@ -1681,20 +1891,20 @@ isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
#endif
}
-void
-isc_mempool_destroy(isc_mempool_t **mpctxp) {
- isc_mempool_t *mpctx;
- isc_mem_t *mctx;
+ISC_MEMFUNC_SCOPE void
+isc__mempool_destroy(isc_mempool_t **mpctxp) {
+ isc__mempool_t *mpctx;
+ isc__mem_t *mctx;
isc_mutex_t *lock;
element *item;
REQUIRE(mpctxp != NULL);
- mpctx = *mpctxp;
+ mpctx = (isc__mempool_t *)*mpctxp;
REQUIRE(VALID_MEMPOOL(mpctx));
#if ISC_MEMPOOL_NAMES
if (mpctx->allocated > 0)
UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mempool_destroy(): mempool %s "
+ "isc__mempool_destroy(): mempool %s "
"leaked memory",
mpctx->name);
#endif
@@ -1734,9 +1944,10 @@ isc_mempool_destroy(isc_mempool_t **mpctxp) {
mctx->poolcnt--;
MCTXUNLOCK(mctx, &mctx->lock);
- mpctx->magic = 0;
+ mpctx->common.impmagic = 0;
+ mpctx->common.magic = 0;
- isc_mem_put(mpctx->mctx, mpctx, sizeof(isc_mempool_t));
+ isc_mem_put((isc_mem_t *)mpctx->mctx, mpctx, sizeof(isc__mempool_t));
if (lock != NULL)
UNLOCK(lock);
@@ -1744,8 +1955,10 @@ isc_mempool_destroy(isc_mempool_t **mpctxp) {
*mpctxp = NULL;
}
-void
-isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_associatelock(isc_mempool_t *mpctx0, isc_mutex_t *lock) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(VALID_MEMPOOL(mpctx));
REQUIRE(mpctx->lock == NULL);
REQUIRE(lock != NULL);
@@ -1753,10 +1966,11 @@ isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
mpctx->lock = lock;
}
-void *
-isc__mempool_get(isc_mempool_t *mpctx FLARG) {
+ISC_MEMFUNC_SCOPE void *
+isc___mempool_get(isc_mempool_t *mpctx0 FLARG) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
element *item;
- isc_mem_t *mctx;
+ isc__mem_t *mctx;
unsigned int i;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1835,9 +2049,10 @@ isc__mempool_get(isc_mempool_t *mpctx FLARG) {
return (item);
}
-void
-isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
- isc_mem_t *mctx;
+ISC_MEMFUNC_SCOPE void
+isc___mempool_put(isc_mempool_t *mpctx0, void *mem FLARG) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+ isc__mem_t *mctx;
element *item;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1892,8 +2107,10 @@ isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
* Quotas
*/
-void
-isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfreemax(isc_mempool_t *mpctx0, unsigned int limit) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(VALID_MEMPOOL(mpctx));
if (mpctx->lock != NULL)
@@ -1905,8 +2122,9 @@ isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
UNLOCK(mpctx->lock);
}
-unsigned int
-isc_mempool_getfreemax(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreemax(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int freemax;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1922,8 +2140,9 @@ isc_mempool_getfreemax(isc_mempool_t *mpctx) {
return (freemax);
}
-unsigned int
-isc_mempool_getfreecount(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfreecount(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int freecount;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1939,8 +2158,10 @@ isc_mempool_getfreecount(isc_mempool_t *mpctx) {
return (freecount);
}
-void
-isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setmaxalloc(isc_mempool_t *mpctx0, unsigned int limit) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(limit > 0);
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1954,8 +2175,9 @@ isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
UNLOCK(mpctx->lock);
}
-unsigned int
-isc_mempool_getmaxalloc(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getmaxalloc(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int maxalloc;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1971,8 +2193,9 @@ isc_mempool_getmaxalloc(isc_mempool_t *mpctx) {
return (maxalloc);
}
-unsigned int
-isc_mempool_getallocated(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getallocated(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
unsigned int allocated;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -1988,8 +2211,10 @@ isc_mempool_getallocated(isc_mempool_t *mpctx) {
return (allocated);
}
-void
-isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
+ISC_MEMFUNC_SCOPE void
+isc__mempool_setfillcount(isc_mempool_t *mpctx0, unsigned int limit) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
REQUIRE(limit > 0);
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -2002,8 +2227,10 @@ isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
UNLOCK(mpctx->lock);
}
-unsigned int
-isc_mempool_getfillcount(isc_mempool_t *mpctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc__mempool_getfillcount(isc_mempool_t *mpctx0) {
+ isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
+
unsigned int fillcount;
REQUIRE(VALID_MEMPOOL(mpctx));
@@ -2019,8 +2246,17 @@ isc_mempool_getfillcount(isc_mempool_t *mpctx) {
return (fillcount);
}
-void
-isc_mem_printactive(isc_mem_t *ctx, FILE *file) {
+#ifdef USE_MEMIMPREGISTER
+isc_result_t
+isc__mem_register() {
+ return (isc_mem_register(isc__mem_create2));
+}
+#endif
+
+#ifdef BIND9
+ISC_MEMFUNC_SCOPE void
+isc__mem_printactive(isc_mem_t *ctx0, FILE *file) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(file != NULL);
@@ -2033,12 +2269,12 @@ isc_mem_printactive(isc_mem_t *ctx, FILE *file) {
#endif
}
-void
-isc_mem_printallactive(FILE *file) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_printallactive(FILE *file) {
#if !ISC_MEM_TRACKLINES
UNUSED(file);
#else
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
@@ -2053,15 +2289,15 @@ isc_mem_printallactive(FILE *file) {
#endif
}
-void
-isc_mem_checkdestroyed(FILE *file) {
+ISC_MEMFUNC_SCOPE void
+isc__mem_checkdestroyed(FILE *file) {
RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
LOCK(&lock);
if (!ISC_LIST_EMPTY(contexts)) {
#if ISC_MEM_TRACKLINES
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
for (ctx = ISC_LIST_HEAD(contexts);
ctx != NULL;
@@ -2076,9 +2312,11 @@ isc_mem_checkdestroyed(FILE *file) {
UNLOCK(&lock);
}
-unsigned int
-isc_mem_references(isc_mem_t *ctx) {
+ISC_MEMFUNC_SCOPE unsigned int
+isc_mem_references(isc_mem_t *ctx0) {
+ isc__mem_t *ctx = (isc__mem_t *)ctx0;
unsigned int references;
+
REQUIRE(VALID_CONTEXT(ctx));
MCTXLOCK(ctx, &ctx->lock);
@@ -2098,7 +2336,7 @@ typedef struct summarystat {
} summarystat_t;
static void
-renderctx(isc_mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
+renderctx(isc__mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
REQUIRE(VALID_CONTEXT(ctx));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "context");
@@ -2184,7 +2422,7 @@ renderctx(isc_mem_t *ctx, summarystat_t *summary, xmlTextWriterPtr writer) {
void
isc_mem_renderxml(xmlTextWriterPtr writer) {
- isc_mem_t *ctx;
+ isc__mem_t *ctx;
summarystat_t summary;
isc_uint64_t lost;
@@ -2236,3 +2474,4 @@ isc_mem_renderxml(xmlTextWriterPtr writer) {
}
#endif /* HAVE_LIBXML2 */
+#endif /* BIND9 */
diff --git a/contrib/bind9/lib/isc/mem_api.c b/contrib/bind9/lib/isc/mem_api.c
new file mode 100644
index 0000000..638efcd
--- /dev/null
+++ b/contrib/bind9/lib/isc/mem_api.c
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: mem_api.c,v 1.8 2010-08-12 21:30:26 jinmei Exp $ */
+
+#include <config.h>
+
+#include <isc/magic.h>
+#include <isc/mem.h>
+#include <isc/once.h>
+#include <isc/util.h>
+
+#if ISC_MEM_TRACKLINES
+#define FLARG_PASS , file, line
+#define FLARG , const char *file, unsigned int line
+#else
+#define FLARG_PASS
+#define FLARG
+#endif
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_memcreatefunc_t mem_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_mem_register(isc_memcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (mem_createfunc == NULL)
+ mem_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_mem_create(size_t init_max_size, size_t target_size, isc_mem_t **mctxp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(mem_createfunc != NULL);
+ result = (*mem_createfunc)(init_max_size, target_size, mctxp,
+ ISC_MEMFLAG_DEFAULT);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_mem_create2(size_t init_max_size, size_t target_size, isc_mem_t **mctxp,
+ unsigned int flags)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(mem_createfunc != NULL);
+ result = (*mem_createfunc)(init_max_size, target_size, mctxp, flags);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
+ REQUIRE(ISCAPI_MCTX_VALID(source));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ source->methods->attach(source, targetp);
+
+ ENSURE(*targetp == source);
+}
+
+void
+isc_mem_detach(isc_mem_t **mctxp) {
+ REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
+
+ (*mctxp)->methods->detach(mctxp);
+
+ ENSURE(*mctxp == NULL);
+}
+
+void
+isc_mem_destroy(isc_mem_t **mctxp) {
+ REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
+
+ (*mctxp)->methods->destroy(mctxp);
+
+ ENSURE(*mctxp == NULL);
+}
+
+void *
+isc__mem_get(isc_mem_t *mctx, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memget(mctx, size FLARG_PASS));
+}
+
+void
+isc__mem_put(isc_mem_t *mctx, void *ptr, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ mctx->methods->memput(mctx, ptr, size FLARG_PASS);
+}
+
+void
+isc__mem_putanddetach(isc_mem_t **mctxp, void *ptr, size_t size FLARG) {
+ REQUIRE(mctxp != NULL && ISCAPI_MCTX_VALID(*mctxp));
+
+ (*mctxp)->methods->memputanddetach(mctxp, ptr, size FLARG_PASS);
+
+ /*
+ * XXX: We cannot always ensure *mctxp == NULL here
+ * (see lib/isc/mem.c).
+ */
+}
+
+void *
+isc__mem_allocate(isc_mem_t *mctx, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memallocate(mctx, size FLARG_PASS));
+}
+
+void *
+isc__mem_reallocate(isc_mem_t *mctx, void *ptr, size_t size FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memreallocate(mctx, ptr, size FLARG_PASS));
+}
+
+char *
+isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->memstrdup(mctx, s FLARG_PASS));
+}
+
+void
+isc__mem_free(isc_mem_t *mctx, void *ptr FLARG) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ mctx->methods->memfree(mctx, ptr FLARG_PASS);
+}
+
+void
+isc_mem_setdestroycheck(isc_mem_t *mctx, isc_boolean_t flag) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ mctx->methods->setdestroycheck(mctx, flag);
+}
+
+void
+isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
+ size_t hiwater, size_t lowater)
+{
+ REQUIRE(ISCAPI_MCTX_VALID(ctx));
+
+ ctx->methods->setwater(ctx, water, water_arg, hiwater, lowater);
+}
+
+void
+isc_mem_waterack(isc_mem_t *ctx, int flag) {
+ REQUIRE(ISCAPI_MCTX_VALID(ctx));
+
+ ctx->methods->waterack(ctx, flag);
+}
+
+size_t
+isc_mem_inuse(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->inuse(mctx));
+}
+
+isc_boolean_t
+isc_mem_isovermem(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->isovermem(mctx));
+}
+
+void
+isc_mem_setname(isc_mem_t *mctx, const char *name, void *tag) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ UNUSED(name);
+ UNUSED(tag);
+
+ return;
+}
+
+const char *
+isc_mem_getname(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return ("");
+}
+
+void *
+isc_mem_gettag(isc_mem_t *mctx) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (NULL);
+}
+
+isc_result_t
+isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
+ REQUIRE(ISCAPI_MCTX_VALID(mctx));
+
+ return (mctx->methods->mpcreate(mctx, size, mpctxp));
+}
+
+void
+isc_mempool_destroy(isc_mempool_t **mpctxp) {
+ REQUIRE(mpctxp != NULL && ISCAPI_MPOOL_VALID(*mpctxp));
+
+ (*mpctxp)->methods->destroy(mpctxp);
+
+ ENSURE(*mpctxp == NULL);
+}
+
+void *
+isc__mempool_get(isc_mempool_t *mpctx FLARG) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ return (mpctx->methods->get(mpctx FLARG_PASS));
+}
+
+void
+isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->put(mpctx, mem FLARG_PASS);
+}
+
+unsigned int
+isc_mempool_getallocated(isc_mempool_t *mpctx) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ return (mpctx->methods->getallocated(mpctx));
+}
+
+void
+isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setmaxalloc(mpctx, limit);
+}
+
+void
+isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setfreemax(mpctx, limit);
+}
+
+void
+isc_mempool_setname(isc_mempool_t *mpctx, const char *name) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setname(mpctx, name);
+}
+
+void
+isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->associatelock(mpctx, lock);
+}
+
+void
+isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit) {
+ REQUIRE(ISCAPI_MPOOL_VALID(mpctx));
+
+ mpctx->methods->setfillcount(mpctx, limit);
+}
diff --git a/contrib/bind9/lib/isc/netaddr.c b/contrib/bind9/lib/isc/netaddr.c
index 92c4fe5..33dddb8 100644
--- a/contrib/bind9/lib/isc/netaddr.c
+++ b/contrib/bind9/lib/isc/netaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netaddr.c,v 1.38 2007-06-18 23:47:44 tbox Exp $ */
+/* $Id: netaddr.c,v 1.41 2010-11-17 23:47:08 tbox Exp $ */
/*! \file */
@@ -303,18 +303,18 @@ isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6) {
isc_result_t
isc_netaddr_frompath(isc_netaddr_t *netaddr, const char *path) {
#ifdef ISC_PLATFORM_HAVESYSUNH
- if (strlen(path) > sizeof(netaddr->type.un) - 1)
- return (ISC_R_NOSPACE);
-
- memset(netaddr, 0, sizeof(*netaddr));
- netaddr->family = AF_UNIX;
- strcpy(netaddr->type.un, path);
- netaddr->zone = 0;
- return (ISC_R_SUCCESS);
-#else
+ if (strlen(path) > sizeof(netaddr->type.un) - 1)
+ return (ISC_R_NOSPACE);
+
+ memset(netaddr, 0, sizeof(*netaddr));
+ netaddr->family = AF_UNIX;
+ strcpy(netaddr->type.un, path);
+ netaddr->zone = 0;
+ return (ISC_R_SUCCESS);
+#else
UNUSED(netaddr);
UNUSED(path);
- return (ISC_R_NOTIMPLEMENTED);
+ return (ISC_R_NOTIMPLEMENTED);
#endif
}
diff --git a/contrib/bind9/lib/isc/nls/Makefile.in b/contrib/bind9/lib/isc/nls/Makefile.in
index c4ec7a1..bfd8dd0 100644
--- a/contrib/bind9/lib/isc/nls/Makefile.in
+++ b/contrib/bind9/lib/isc/nls/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1999-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.14 2007-06-19 23:47:18 tbox Exp $
+# $Id: Makefile.in,v 1.17 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/nothreads/Makefile.in b/contrib/bind9/lib/isc/nothreads/Makefile.in
index 042cfce..29bacd6 100644
--- a/contrib/bind9/lib/isc/nothreads/Makefile.in
+++ b/contrib/bind9/lib/isc/nothreads/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007, 2010 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2000, 2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,11 +13,11 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.7.332.2 2010-06-09 23:48:16 tbox Exp $
+# $Id: Makefile.in,v 1.12 2010-06-09 23:50:58 tbox Exp $
-srcdir = @srcdir@
-VPATH = @srcdir@
top_srcdir = @top_srcdir@
+srcdir = @top_srcdir@/lib/isc/nothreads
+VPATH = @top_srcdir@/lib/isc/nothreads
CINCLUDES = -I${srcdir}/include \
-I${srcdir}/../unix/include \
diff --git a/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h b/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
index 074fea1..2e11e39 100644
--- a/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: atomic.h,v 1.6.332.2 2009-10-14 23:47:14 tbox Exp $ */
+/* $Id: atomic.h,v 1.8 2009-10-14 23:47:51 tbox Exp $ */
#ifndef ISC_ATOMIC_H
#define ISC_ATOMIC_H 1
diff --git a/contrib/bind9/lib/isc/print.c b/contrib/bind9/lib/isc/print.c
index 5d800f3..bd7b580 100644
--- a/contrib/bind9/lib/isc/print.c
+++ b/contrib/bind9/lib/isc/print.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: print.c,v 1.35.130.2 2010-10-18 23:46:17 tbox Exp $ */
+/* $Id: print.c,v 1.37 2010-10-18 23:47:08 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/pthreads/Makefile.in b/contrib/bind9/lib/isc/pthreads/Makefile.in
index 572d76c..7aae93d 100644
--- a/contrib/bind9/lib/isc/pthreads/Makefile.in
+++ b/contrib/bind9/lib/isc/pthreads/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.19 2007-06-19 23:47:18 tbox Exp $
+# $Id: Makefile.in,v 1.22 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/pthreads/mutex.c b/contrib/bind9/lib/isc/pthreads/mutex.c
index efe38db..fa5a701 100644
--- a/contrib/bind9/lib/isc/pthreads/mutex.c
+++ b/contrib/bind9/lib/isc/pthreads/mutex.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutex.c,v 1.16.112.2 2011-01-04 23:45:43 tbox Exp $ */
+/* $Id: mutex.c,v 1.18 2011-01-04 23:47:14 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/radix.c b/contrib/bind9/lib/isc/radix.c
index d72ed33..be2e841 100644
--- a/contrib/bind9/lib/isc/radix.c
+++ b/contrib/bind9/lib/isc/radix.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: radix.c,v 1.20.36.3 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: radix.c,v 1.23 2009-01-18 23:48:14 tbox Exp $ */
/*
* This source was adapted from MRT's RCS Ids:
diff --git a/contrib/bind9/lib/isc/random.c b/contrib/bind9/lib/isc/random.c
index 09145f4..f082fe6 100644
--- a/contrib/bind9/lib/isc/random.c
+++ b/contrib/bind9/lib/isc/random.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: random.c,v 1.25.332.2 2009-07-16 23:47:17 tbox Exp $ */
+/* $Id: random.c,v 1.28 2009-07-16 05:52:46 marka Exp $ */
/*! \file */
@@ -103,7 +103,7 @@ isc_uint32_t
isc_random_jitter(isc_uint32_t max, isc_uint32_t jitter) {
isc_uint32_t rnd;
- REQUIRE(jitter < max);
+ REQUIRE(jitter < max || (jitter == 0 && max == 0));
if (jitter == 0)
return (max);
diff --git a/contrib/bind9/lib/isc/rwlock.c b/contrib/bind9/lib/isc/rwlock.c
index 39b90d7..fce7516 100644
--- a/contrib/bind9/lib/isc/rwlock.c
+++ b/contrib/bind9/lib/isc/rwlock.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rwlock.c,v 1.44.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: rwlock.c,v 1.46 2009-01-18 23:48:14 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/sha1.c b/contrib/bind9/lib/isc/sha1.c
index 20ee28d..d72eb9c 100644
--- a/contrib/bind9/lib/isc/sha1.c
+++ b/contrib/bind9/lib/isc/sha1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha1.c,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sha1.c,v 1.20 2009-02-06 23:47:42 tbox Exp $ */
/* $NetBSD: sha1.c,v 1.5 2000/01/22 22:19:14 mycroft Exp $ */
/* $OpenBSD: sha1.c,v 1.9 1997/07/23 21:12:32 kstailey Exp $ */
@@ -38,11 +38,47 @@
#include "config.h"
#include <isc/assertions.h>
+#include <isc/platform.h>
#include <isc/sha1.h>
#include <isc/string.h>
#include <isc/types.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_sha1_init(isc_sha1_t *context)
+{
+ INSIST(context != NULL);
+
+ EVP_DigestInit(context, EVP_sha1());
+}
+
+void
+isc_sha1_invalidate(isc_sha1_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha1_update(isc_sha1_t *context, const unsigned char *data,
+ unsigned int len)
+{
+ INSIST(context != 0);
+ INSIST(data != 0);
+
+ EVP_DigestUpdate(context, (const void *) data, (size_t) len);
+}
+
+void
+isc_sha1_final(isc_sha1_t *context, unsigned char *digest) {
+ INSIST(digest != 0);
+ INSIST(context != 0);
+
+ EVP_DigestFinal(context, digest, NULL);
+}
+
+#else
+
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/*@{*/
@@ -313,3 +349,4 @@ isc_sha1_final(isc_sha1_t *context, unsigned char *digest) {
memset(context, 0, sizeof(isc_sha1_t));
}
+#endif
diff --git a/contrib/bind9/lib/isc/sha2.c b/contrib/bind9/lib/isc/sha2.c
index 22f1d47..1dc05a70 100644
--- a/contrib/bind9/lib/isc/sha2.c
+++ b/contrib/bind9/lib/isc/sha2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha2.c,v 1.13.332.4 2010-01-15 23:47:34 tbox Exp $ */
+/* $Id: sha2.c,v 1.18 2009-10-22 02:21:31 each Exp $ */
/* $FreeBSD$ */
/* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */
@@ -58,10 +58,169 @@
#include <config.h>
#include <isc/assertions.h>
+#include <isc/platform.h>
#include <isc/sha2.h>
#include <isc/string.h>
#include <isc/util.h>
+#ifdef ISC_PLATFORM_OPENSSLHASH
+
+void
+isc_sha224_init(isc_sha224_t *context) {
+ if (context == (isc_sha224_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha224());
+}
+
+void
+isc_sha224_invalidate(isc_sha224_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha224_update(isc_sha224_t *context, const isc_uint8_t* data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void
+isc_sha224_final(isc_uint8_t digest[], isc_sha224_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+void
+isc_sha256_init(isc_sha256_t *context) {
+ if (context == (isc_sha256_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha256());
+}
+
+void
+isc_sha256_invalidate(isc_sha256_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void
+isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+void
+isc_sha512_init(isc_sha512_t *context) {
+ if (context == (isc_sha512_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha512());
+}
+
+void
+isc_sha512_invalidate(isc_sha512_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void isc_sha512_final(isc_uint8_t digest[], isc_sha512_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+void
+isc_sha384_init(isc_sha384_t *context) {
+ if (context == (isc_sha384_t *)0) {
+ return;
+ }
+ EVP_DigestInit(context, EVP_sha384());
+}
+
+void
+isc_sha384_invalidate(isc_sha384_t *context) {
+ EVP_MD_CTX_cleanup(context);
+}
+
+void
+isc_sha384_update(isc_sha384_t *context, const isc_uint8_t* data, size_t len) {
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0 && data != (isc_uint8_t*)0);
+
+ EVP_DigestUpdate(context, (const void *) data, len);
+}
+
+void
+isc_sha384_final(isc_uint8_t digest[], isc_sha384_t *context) {
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha384_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ EVP_DigestFinal(context, digest, NULL);
+ } else {
+ EVP_MD_CTX_cleanup(context);
+ }
+}
+
+#else
+
/*
* UNROLLED TRANSFORM LOOP NOTE:
* You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
@@ -394,13 +553,6 @@ static const isc_uint64_t sha512_initial_hash_value[8] = {
};
#endif
-/*
- * Constant used by SHA256/384/512_End() functions for converting the
- * digest to a readable hexadecimal character string:
- */
-static const char *sha2_hex_digits = "0123456789abcdef";
-
-
/*** SHA-224: *********************************************************/
void
@@ -432,41 +584,6 @@ isc_sha224_final(isc_uint8_t digest[], isc_sha224_t *context) {
memset(sha256_digest, 0, ISC_SHA256_DIGESTLENGTH);
}
-char *
-isc_sha224_end(isc_sha224_t *context, char buffer[]) {
- isc_uint8_t digest[ISC_SHA224_DIGESTLENGTH], *d = digest;
- unsigned int i;
-
- /* Sanity check: */
- REQUIRE(context != (isc_sha224_t *)0);
-
- if (buffer != (char*)0) {
- isc_sha224_final(digest, context);
-
- for (i = 0; i < ISC_SHA224_DIGESTLENGTH; i++) {
- *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
- *buffer++ = sha2_hex_digits[*d & 0x0f];
- d++;
- }
- *buffer = (char)0;
- } else {
- memset(context, 0, sizeof(context));
- }
- memset(digest, 0, ISC_SHA224_DIGESTLENGTH);
- return buffer;
-}
-
-char*
-isc_sha224_data(const isc_uint8_t *data, size_t len,
- char digest[ISC_SHA224_DIGESTSTRINGLENGTH])
-{
- isc_sha224_t context;
-
- isc_sha224_init(&context);
- isc_sha224_update(&context, data, len);
- return (isc_sha224_end(&context, digest));
-}
-
/*** SHA-256: *********************************************************/
void
isc_sha256_init(isc_sha256_t *context) {
@@ -479,6 +596,11 @@ isc_sha256_init(isc_sha256_t *context) {
context->bitcount = 0;
}
+void
+isc_sha256_invalidate(isc_sha256_t *context) {
+ memset(context, 0, sizeof(isc_sha256_t));
+}
+
#ifdef ISC_SHA2_UNROLL_TRANSFORM
/* Unrolled SHA-256 round macros: */
@@ -656,11 +778,6 @@ isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) {
#endif /* ISC_SHA2_UNROLL_TRANSFORM */
void
-isc_sha256_invalidate(isc_sha256_t *context) {
- memset(context, 0, sizeof(isc_sha256_t));
-}
-
-void
isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) {
unsigned int freespace, usedspace;
@@ -782,42 +899,6 @@ isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) {
usedspace = 0;
}
-char *
-isc_sha256_end(isc_sha256_t *context, char buffer[]) {
- isc_uint8_t digest[ISC_SHA256_DIGESTLENGTH], *d = digest;
- unsigned int i;
-
- /* Sanity check: */
- REQUIRE(context != (isc_sha256_t *)0);
-
- if (buffer != (char*)0) {
- isc_sha256_final(digest, context);
-
- for (i = 0; i < ISC_SHA256_DIGESTLENGTH; i++) {
- *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
- *buffer++ = sha2_hex_digits[*d & 0x0f];
- d++;
- }
- *buffer = (char)0;
- } else {
- memset(context, 0, sizeof(context));
- }
- memset(digest, 0, ISC_SHA256_DIGESTLENGTH);
- return buffer;
-}
-
-char *
-isc_sha256_data(const isc_uint8_t* data, size_t len,
- char digest[ISC_SHA256_DIGESTSTRINGLENGTH])
-{
- isc_sha256_t context;
-
- isc_sha256_init(&context);
- isc_sha256_update(&context, data, len);
- return (isc_sha256_end(&context, digest));
-}
-
-
/*** SHA-512: *********************************************************/
void
isc_sha512_init(isc_sha512_t *context) {
@@ -830,6 +911,11 @@ isc_sha512_init(isc_sha512_t *context) {
context->bitcount[0] = context->bitcount[1] = 0;
}
+void
+isc_sha512_invalidate(isc_sha512_t *context) {
+ memset(context, 0, sizeof(isc_sha512_t));
+}
+
#ifdef ISC_SHA2_UNROLL_TRANSFORM
/* Unrolled SHA-512 round macros: */
@@ -1000,13 +1086,7 @@ isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) {
#endif /* ISC_SHA2_UNROLL_TRANSFORM */
-void
-isc_sha512_invalidate(isc_sha512_t *context) {
- memset(context, 0, sizeof(isc_sha512_t));
-}
-
-void
-isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
+void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
unsigned int freespace, usedspace;
if (len == 0U) {
@@ -1131,41 +1211,6 @@ void isc_sha512_final(isc_uint8_t digest[], isc_sha512_t *context) {
memset(context, 0, sizeof(context));
}
-char *
-isc_sha512_end(isc_sha512_t *context, char buffer[]) {
- isc_uint8_t digest[ISC_SHA512_DIGESTLENGTH], *d = digest;
- unsigned int i;
-
- /* Sanity check: */
- REQUIRE(context != (isc_sha512_t *)0);
-
- if (buffer != (char*)0) {
- isc_sha512_final(digest, context);
-
- for (i = 0; i < ISC_SHA512_DIGESTLENGTH; i++) {
- *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
- *buffer++ = sha2_hex_digits[*d & 0x0f];
- d++;
- }
- *buffer = (char)0;
- } else {
- memset(context, 0, sizeof(context));
- }
- memset(digest, 0, ISC_SHA512_DIGESTLENGTH);
- return buffer;
-}
-
-char *
-isc_sha512_data(const isc_uint8_t *data, size_t len,
- char digest[ISC_SHA512_DIGESTSTRINGLENGTH])
-{
- isc_sha512_t context;
-
- isc_sha512_init(&context);
- isc_sha512_update(&context, data, len);
- return (isc_sha512_end(&context, digest));
-}
-
/*** SHA-384: *********************************************************/
void
@@ -1218,6 +1263,130 @@ isc_sha384_final(isc_uint8_t digest[], isc_sha384_t *context) {
/* Zero out state data */
memset(context, 0, sizeof(context));
}
+#endif /* !ISC_PLATFORM_OPENSSLHASH */
+
+/*
+ * Constant used by SHA256/384/512_End() functions for converting the
+ * digest to a readable hexadecimal character string:
+ */
+static const char *sha2_hex_digits = "0123456789abcdef";
+
+char *
+isc_sha224_end(isc_sha224_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA224_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha224_final(digest, context);
+
+ for (i = 0; i < ISC_SHA224_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
+ memset(context, 0, sizeof(context));
+#endif
+ }
+ memset(digest, 0, ISC_SHA224_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha224_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA224_DIGESTSTRINGLENGTH])
+{
+ isc_sha224_t context;
+
+ isc_sha224_init(&context);
+ isc_sha224_update(&context, data, len);
+ return (isc_sha224_end(&context, digest));
+}
+
+char *
+isc_sha256_end(isc_sha256_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA256_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha256_final(digest, context);
+
+ for (i = 0; i < ISC_SHA256_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
+ memset(context, 0, sizeof(context));
+#endif
+ }
+ memset(digest, 0, ISC_SHA256_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha256_data(const isc_uint8_t* data, size_t len,
+ char digest[ISC_SHA256_DIGESTSTRINGLENGTH])
+{
+ isc_sha256_t context;
+
+ isc_sha256_init(&context);
+ isc_sha256_update(&context, data, len);
+ return (isc_sha256_end(&context, digest));
+}
+
+char *
+isc_sha512_end(isc_sha512_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA512_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha512_final(digest, context);
+
+ for (i = 0; i < ISC_SHA512_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
+ memset(context, 0, sizeof(context));
+#endif
+ }
+ memset(digest, 0, ISC_SHA512_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha512_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA512_DIGESTSTRINGLENGTH])
+{
+ isc_sha512_t context;
+
+ isc_sha512_init(&context);
+ isc_sha512_update(&context, data, len);
+ return (isc_sha512_end(&context, digest));
+}
char *
isc_sha384_end(isc_sha384_t *context, char buffer[]) {
@@ -1237,13 +1406,17 @@ isc_sha384_end(isc_sha384_t *context, char buffer[]) {
}
*buffer = (char)0;
} else {
+#ifdef ISC_PLATFORM_OPENSSLHASH
+ EVP_MD_CTX_cleanup(context);
+#else
memset(context, 0, sizeof(context));
+#endif
}
memset(digest, 0, ISC_SHA384_DIGESTLENGTH);
return buffer;
}
-char*
+char *
isc_sha384_data(const isc_uint8_t *data, size_t len,
char digest[ISC_SHA384_DIGESTSTRINGLENGTH])
{
diff --git a/contrib/bind9/lib/isc/sockaddr.c b/contrib/bind9/lib/isc/sockaddr.c
index 19833e4..9661ee4 100644
--- a/contrib/bind9/lib/isc/sockaddr.c
+++ b/contrib/bind9/lib/isc/sockaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sockaddr.c,v 1.70 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: sockaddr.c,v 1.73 2010-11-17 23:47:09 tbox Exp $ */
/*! \file */
@@ -390,8 +390,8 @@ isc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
#endif
sockaddr->type.sin6.sin6_port = htons(port);
break;
- default:
- INSIST(0);
+ default:
+ INSIST(0);
}
ISC_LINK_INIT(sockaddr, link);
}
diff --git a/contrib/bind9/lib/isc/socket_api.c b/contrib/bind9/lib/isc/socket_api.c
new file mode 100644
index 0000000..c1e5fd4
--- /dev/null
+++ b/contrib/bind9/lib/isc/socket_api.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: socket_api.c,v 1.5 2009-10-01 01:30:01 sar Exp $ */
+
+#include <config.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/socket.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_socketmgrcreatefunc_t socketmgr_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_socket_register(isc_socketmgrcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (socketmgr_createfunc == NULL)
+ socketmgr_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_socketmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_socketmgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(socketmgr_createfunc != NULL);
+ result = (*socketmgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ if (result == ISC_R_SUCCESS)
+ isc_appctx_setsocketmgr(actx, *managerp);
+
+ return (result);
+}
+
+isc_result_t
+isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(socketmgr_createfunc != NULL);
+ result = (*socketmgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
+ REQUIRE(managerp != NULL && ISCAPI_SOCKETMGR_VALID(*managerp));
+
+ (*managerp)->methods->destroy(managerp);
+
+ ENSURE(*managerp == NULL);
+}
+
+isc_result_t
+isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
+ isc_socket_t **socketp)
+{
+ REQUIRE(ISCAPI_SOCKETMGR_VALID(manager));
+
+ return (manager->methods->socketcreate(manager, pf, type, socketp));
+}
+
+void
+isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+ REQUIRE(socketp != NULL && *socketp == NULL);
+
+ sock->methods->attach(sock, socketp);
+
+ ENSURE(*socketp == sock);
+}
+
+void
+isc_socket_detach(isc_socket_t **socketp) {
+ REQUIRE(socketp != NULL && ISCAPI_SOCKET_VALID(*socketp));
+
+ (*socketp)->methods->detach(socketp);
+
+ ENSURE(*socketp == NULL);
+}
+
+isc_result_t
+isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+ unsigned int options)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->bind(sock, sockaddr, options));
+}
+
+isc_result_t
+isc_socket_sendto(isc_socket_t *sock, isc_region_t *region, isc_task_t *task,
+ isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->sendto(sock, region, task, action, arg, address,
+ pktinfo));
+}
+
+isc_result_t
+isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr, isc_task_t *task,
+ isc_taskaction_t action, const void *arg)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->connect(sock, addr, task, action, arg));
+}
+
+isc_result_t
+isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
+ isc_task_t *task, isc_taskaction_t action, const void *arg)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->recv(sock, region, minimum, task, action, arg));
+}
+
+void
+isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ sock->methods->cancel(sock, task, how);
+}
+
+isc_result_t
+isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->getsockname(sock, addressp));
+}
+
+void
+isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ sock->methods->ipv6only(sock, yes);
+}
+
+isc_sockettype_t
+isc_socket_gettype(isc_socket_t *sock) {
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return (sock->methods->gettype(sock));
+}
+
+void
+isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
+ REQUIRE(ISCAPI_SOCKET_VALID(socket));
+
+ UNUSED(socket); /* in case REQUIRE() is empty */
+ UNUSED(name);
+ UNUSED(tag);
+}
+
+isc_result_t
+isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
+ isc_sockfdwatch_t callback, void *cbarg,
+ isc_task_t *task, isc_socket_t **socketp)
+{
+ REQUIRE(ISCAPI_SOCKETMGR_VALID(manager));
+
+ return (manager->methods->fdwatchcreate(manager, fd, flags,
+ callback, cbarg, task,
+ socketp));
+}
+
+isc_result_t
+isc_socket_fdwatchpoke(isc_socket_t *sock, int flags)
+{
+ REQUIRE(ISCAPI_SOCKET_VALID(sock));
+
+ return(sock->methods->fdwatchpoke(sock, flags));
+}
diff --git a/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h b/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
index 9ee3c0b..89eaec5 100644
--- a/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
+++ b/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
@@ -72,9 +72,9 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
swapped = prev + val;
__asm__ volatile(
- "casa [%1] %2, %3, %0"
- : "+r"(swapped)
- : "r"(p), "n"(ASI_P), "r"(prev));
+ "casa [%2] %3, %4, %0"
+ : "+r"(swapped), "=m"(*p)
+ : "r"(p), "n"(ASI_P), "r"(prev), "m"(*p));
if (swapped == prev)
break;
}
@@ -92,10 +92,9 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
swapped = val;
__asm__ volatile(
- "casa [%1] %2, %3, %0"
- : "+r"(swapped)
- : "r"(p), "n"(ASI_P), "r"(prev)
- : "memory");
+ "casa [%2] %3, %4, %0"
+ : "+r"(swapped), "=m"(*p)
+ : "r"(p), "n"(ASI_P), "r"(prev), "m"(*p));
if (swapped == prev)
break;
}
@@ -111,9 +110,9 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
isc_int32_t temp = val;
__asm__ volatile(
- "casa [%1] %2, %3, %0"
- : "+r"(temp)
- : "r"(p), "n"(ASI_P), "r"(cmpval));
+ "casa [%2] %3, %4, %0"
+ : "+r"(temp), "=m"(*p)
+ : "r"(p), "n"(ASI_P), "r"(cmpval), "m"(*p));
return (temp);
}
diff --git a/contrib/bind9/lib/isc/stats.c b/contrib/bind9/lib/isc/stats.c
index ac66bcf..e72fb54 100644
--- a/contrib/bind9/lib/isc/stats.c
+++ b/contrib/bind9/lib/isc/stats.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stats.c,v 1.3.6.2 2009-01-29 23:47:44 tbox Exp $ */
+/* $Id: stats.c,v 1.3 2009-01-27 23:47:54 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/task.c b/contrib/bind9/lib/isc/task.c
index 5d87f21..a9dfd1f 100644
--- a/contrib/bind9/lib/isc/task.c
+++ b/contrib/bind9/lib/isc/task.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.c,v 1.107.120.2 2010-12-03 23:45:47 tbox Exp $ */
+/* $Id: task.c,v 1.115.14.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
/*! \file
* \author Principal Author: Bob Halley
@@ -40,9 +40,33 @@
#include <isc/util.h>
#include <isc/xml.h>
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef OPENSSL_LEAKS
+#include <openssl/err.h>
+#endif
+
+/*%
+ * For BIND9 internal applications:
+ * when built with threads we use multiple worker threads shared by the whole
+ * application.
+ * when built without threads we share a single global task manager and use
+ * an integrated event loop for socket, timer, and other generic task events.
+ * For generic library:
+ * we don't use either of them: an application can have multiple task managers
+ * whether or not it's threaded, and if the application is threaded each thread
+ * is expected to have a separate manager; no "worker threads" are shared by
+ * the application threads.
+ */
+#ifdef BIND9
+#ifdef ISC_PLATFORM_USETHREADS
+#define USE_WORKER_THREADS
+#else
+#define USE_SHARED_MANAGER
+#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* BIND9 */
+
+#ifndef USE_WORKER_THREADS
#include "task_p.h"
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
#ifdef ISC_TASK_TRACE
#define XTRACE(m) fprintf(stderr, "task %p thread %lu: %s\n", \
@@ -66,7 +90,7 @@ typedef enum {
task_state_done
} task_state_t;
-#ifdef HAVE_LIBXML2
+#if defined(HAVE_LIBXML2) && defined(BIND9)
static const char *statenames[] = {
"idle", "ready", "running", "done",
};
@@ -75,10 +99,13 @@ static const char *statenames[] = {
#define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K')
#define VALID_TASK(t) ISC_MAGIC_VALID(t, TASK_MAGIC)
-struct isc_task {
+typedef struct isc__task isc__task_t;
+typedef struct isc__taskmgr isc__taskmgr_t;
+
+struct isc__task {
/* Not locked. */
- unsigned int magic;
- isc_taskmgr_t * manager;
+ isc_task_t common;
+ isc__taskmgr_t * manager;
isc_mutex_t lock;
/* Locked by task lock. */
task_state_t state;
@@ -91,8 +118,8 @@ struct isc_task {
char name[16];
void * tag;
/* Locked by task manager lock. */
- LINK(isc_task_t) link;
- LINK(isc_task_t) ready_link;
+ LINK(isc__task_t) link;
+ LINK(isc__task_t) ready_link;
};
#define TASK_F_SHUTTINGDOWN 0x01
@@ -103,9 +130,11 @@ struct isc_task {
#define TASK_MANAGER_MAGIC ISC_MAGIC('T', 'S', 'K', 'M')
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, TASK_MANAGER_MAGIC)
-struct isc_taskmgr {
+typedef ISC_LIST(isc__task_t) isc__tasklist_t;
+
+struct isc__taskmgr {
/* Not locked. */
- unsigned int magic;
+ isc_taskmgr_t common;
isc_mem_t * mctx;
isc_mutex_t lock;
#ifdef ISC_PLATFORM_USETHREADS
@@ -114,8 +143,8 @@ struct isc_taskmgr {
#endif /* ISC_PLATFORM_USETHREADS */
/* Locked by task manager lock. */
unsigned int default_quantum;
- LIST(isc_task_t) tasks;
- isc_tasklist_t ready_tasks;
+ LIST(isc__task_t) tasks;
+ isc__tasklist_t ready_tasks;
#ifdef ISC_PLATFORM_USETHREADS
isc_condition_t work_available;
isc_condition_t exclusive_granted;
@@ -123,7 +152,7 @@ struct isc_taskmgr {
unsigned int tasks_running;
isc_boolean_t exclusive_requested;
isc_boolean_t exiting;
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
unsigned int refs;
#endif /* ISC_PLATFORM_USETHREADS */
};
@@ -132,17 +161,116 @@ struct isc_taskmgr {
#define DEFAULT_DEFAULT_QUANTUM 5
#define FINISHED(m) ((m)->exiting && EMPTY((m)->tasks))
-#ifndef ISC_PLATFORM_USETHREADS
-static isc_taskmgr_t *taskmgr = NULL;
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifdef USE_SHARED_MANAGER
+static isc__taskmgr_t *taskmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
+
+/*%
+ * The following can be either static or public, depending on build environment.
+ */
+
+#ifdef BIND9
+#define ISC_TASKFUNC_SCOPE
+#else
+#define ISC_TASKFUNC_SCOPE static
+#endif
+
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_create(isc_taskmgr_t *manager0, unsigned int quantum,
+ isc_task_t **taskp);
+ISC_TASKFUNC_SCOPE void
+isc__task_attach(isc_task_t *source0, isc_task_t **targetp);
+ISC_TASKFUNC_SCOPE void
+isc__task_detach(isc_task_t **taskp);
+ISC_TASKFUNC_SCOPE void
+isc__task_send(isc_task_t *task0, isc_event_t **eventp);
+ISC_TASKFUNC_SCOPE void
+isc__task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purgerange(isc_task_t *task0, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag);
+ISC_TASKFUNC_SCOPE isc_boolean_t
+isc__task_purgeevent(isc_task_t *task0, isc_event_t *event);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag,
+ isc_eventlist_t *events);
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events);
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_onshutdown(isc_task_t *task0, isc_taskaction_t action,
+ const void *arg);
+ISC_TASKFUNC_SCOPE void
+isc__task_shutdown(isc_task_t *task0);
+ISC_TASKFUNC_SCOPE void
+isc__task_destroy(isc_task_t **taskp);
+ISC_TASKFUNC_SCOPE void
+isc__task_setname(isc_task_t *task0, const char *name, void *tag);
+ISC_TASKFUNC_SCOPE const char *
+isc__task_getname(isc_task_t *task0);
+ISC_TASKFUNC_SCOPE void *
+isc__task_gettag(isc_task_t *task0);
+ISC_TASKFUNC_SCOPE void
+isc__task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t);
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum, isc_taskmgr_t **managerp);
+ISC_TASKFUNC_SCOPE void
+isc__taskmgr_destroy(isc_taskmgr_t **managerp);
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_beginexclusive(isc_task_t *task);
+ISC_TASKFUNC_SCOPE void
+isc__task_endexclusive(isc_task_t *task0);
+
+static struct isc__taskmethods {
+ isc_taskmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *purgeevent, *unsendrange, *getname, *gettag, *getcurrenttime;
+#endif
+} taskmethods = {
+ {
+ isc__task_attach,
+ isc__task_detach,
+ isc__task_destroy,
+ isc__task_send,
+ isc__task_sendanddetach,
+ isc__task_unsend,
+ isc__task_onshutdown,
+ isc__task_shutdown,
+ isc__task_setname,
+ isc__task_purge,
+ isc__task_purgerange,
+ isc__task_beginexclusive,
+ isc__task_endexclusive
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__task_purgeevent, (void *)isc__task_unsendrange,
+ (void *)isc__task_getname, (void *)isc__task_gettag,
+ (void *)isc__task_getcurrenttime
+#endif
+};
+
+static isc_taskmgrmethods_t taskmgrmethods = {
+ isc__taskmgr_destroy,
+ isc__task_create
+};
/***
*** Tasks.
***/
static void
-task_finished(isc_task_t *task) {
- isc_taskmgr_t *manager = task->manager;
+task_finished(isc__task_t *task) {
+ isc__taskmgr_t *manager = task->manager;
REQUIRE(EMPTY(task->events));
REQUIRE(EMPTY(task->on_shutdown));
@@ -153,7 +281,7 @@ task_finished(isc_task_t *task) {
LOCK(&manager->lock);
UNLINK(manager->tasks, task, link);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
if (FINISHED(manager)) {
/*
* All tasks have completed and the
@@ -163,19 +291,21 @@ task_finished(isc_task_t *task) {
*/
BROADCAST(&manager->work_available);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
UNLOCK(&manager->lock);
DESTROYLOCK(&task->lock);
- task->magic = 0;
+ task->common.impmagic = 0;
+ task->common.magic = 0;
isc_mem_put(manager->mctx, task, sizeof(*task));
}
-isc_result_t
-isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
- isc_task_t **taskp)
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_create(isc_taskmgr_t *manager0, unsigned int quantum,
+ isc_task_t **taskp)
{
- isc_task_t *task;
+ isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
+ isc__task_t *task;
isc_boolean_t exiting;
isc_result_t result;
@@ -220,14 +350,17 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
return (ISC_R_SHUTTINGDOWN);
}
- task->magic = TASK_MAGIC;
- *taskp = task;
+ task->common.methods = (isc_taskmethods_t *)&taskmethods;
+ task->common.magic = ISCAPI_TASK_MAGIC;
+ task->common.impmagic = TASK_MAGIC;
+ *taskp = (isc_task_t *)task;
return (ISC_R_SUCCESS);
}
-void
-isc_task_attach(isc_task_t *source, isc_task_t **targetp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_attach(isc_task_t *source0, isc_task_t **targetp) {
+ isc__task_t *source = (isc__task_t *)source0;
/*
* Attach *targetp to source.
@@ -242,11 +375,11 @@ isc_task_attach(isc_task_t *source, isc_task_t **targetp) {
source->references++;
UNLOCK(&source->lock);
- *targetp = source;
+ *targetp = (isc_task_t *)source;
}
static inline isc_boolean_t
-task_shutdown(isc_task_t *task) {
+task_shutdown(isc__task_t *task) {
isc_boolean_t was_idle = ISC_FALSE;
isc_event_t *event, *prev;
@@ -283,8 +416,8 @@ task_shutdown(isc_task_t *task) {
}
static inline void
-task_ready(isc_task_t *task) {
- isc_taskmgr_t *manager = task->manager;
+task_ready(isc__task_t *task) {
+ isc__taskmgr_t *manager = task->manager;
REQUIRE(VALID_MANAGER(manager));
REQUIRE(task->state == task_state_ready);
@@ -294,15 +427,15 @@ task_ready(isc_task_t *task) {
LOCK(&manager->lock);
ENQUEUE(manager->ready_tasks, task, ready_link);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
SIGNAL(&manager->work_available);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
UNLOCK(&manager->lock);
}
static inline isc_boolean_t
-task_detach(isc_task_t *task) {
+task_detach(isc__task_t *task) {
/*
* Caller must be holding the task lock.
@@ -330,9 +463,9 @@ task_detach(isc_task_t *task) {
return (ISC_FALSE);
}
-void
-isc_task_detach(isc_task_t **taskp) {
- isc_task_t *task;
+ISC_TASKFUNC_SCOPE void
+isc__task_detach(isc_task_t **taskp) {
+ isc__task_t *task;
isc_boolean_t was_idle;
/*
@@ -340,7 +473,7 @@ isc_task_detach(isc_task_t **taskp) {
*/
REQUIRE(taskp != NULL);
- task = *taskp;
+ task = (isc__task_t *)*taskp;
REQUIRE(VALID_TASK(task));
XTRACE("isc_task_detach");
@@ -356,7 +489,7 @@ isc_task_detach(isc_task_t **taskp) {
}
static inline isc_boolean_t
-task_send(isc_task_t *task, isc_event_t **eventp) {
+task_send(isc__task_t *task, isc_event_t **eventp) {
isc_boolean_t was_idle = ISC_FALSE;
isc_event_t *event;
@@ -385,8 +518,9 @@ task_send(isc_task_t *task, isc_event_t **eventp) {
return (was_idle);
}
-void
-isc_task_send(isc_task_t *task, isc_event_t **eventp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_send(isc_task_t *task0, isc_event_t **eventp) {
+ isc__task_t *task = (isc__task_t *)task0;
isc_boolean_t was_idle;
/*
@@ -426,10 +560,10 @@ isc_task_send(isc_task_t *task, isc_event_t **eventp) {
}
}
-void
-isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
isc_boolean_t idle1, idle2;
- isc_task_t *task;
+ isc__task_t *task;
/*
* Send '*event' to '*taskp' and then detach '*taskp' from its
@@ -437,7 +571,7 @@ isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
*/
REQUIRE(taskp != NULL);
- task = *taskp;
+ task = (isc__task_t *)*taskp;
REQUIRE(VALID_TASK(task));
XTRACE("isc_task_sendanddetach");
@@ -463,7 +597,7 @@ isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
#define PURGE_OK(event) (((event)->ev_attributes & ISC_EVENTATTR_NOPURGE) == 0)
static unsigned int
-dequeue_events(isc_task_t *task, void *sender, isc_eventtype_t first,
+dequeue_events(isc__task_t *task, void *sender, isc_eventtype_t first,
isc_eventtype_t last, void *tag,
isc_eventlist_t *events, isc_boolean_t purging)
{
@@ -502,10 +636,11 @@ dequeue_events(isc_task_t *task, void *sender, isc_eventtype_t first,
return (count);
}
-unsigned int
-isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
- isc_eventtype_t last, void *tag)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purgerange(isc_task_t *task0, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag)
{
+ isc__task_t *task = (isc__task_t *)task0;
unsigned int count;
isc_eventlist_t events;
isc_event_t *event, *next_event;
@@ -533,9 +668,9 @@ isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
return (count);
}
-unsigned int
-isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
- void *tag)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag)
{
/*
* Purge events from a task's event queue.
@@ -543,11 +678,12 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
XTRACE("isc_task_purge");
- return (isc_task_purgerange(task, sender, type, type, tag));
+ return (isc__task_purgerange(task, sender, type, type, tag));
}
-isc_boolean_t
-isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
+ISC_TASKFUNC_SCOPE isc_boolean_t
+isc__task_purgeevent(isc_task_t *task0, isc_event_t *event) {
+ isc__task_t *task = (isc__task_t *)task0;
isc_event_t *curr_event, *next_event;
/*
@@ -588,10 +724,10 @@ isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
return (ISC_TRUE);
}
-unsigned int
-isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
- isc_eventtype_t last, void *tag,
- isc_eventlist_t *events)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag,
+ isc_eventlist_t *events)
{
/*
* Remove events from a task's event queue.
@@ -599,13 +735,13 @@ isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
XTRACE("isc_task_unsendrange");
- return (dequeue_events(task, sender, first, last, tag, events,
- ISC_FALSE));
+ return (dequeue_events((isc__task_t *)task, sender, first,
+ last, tag, events, ISC_FALSE));
}
-unsigned int
-isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
- void *tag, isc_eventlist_t *events)
+ISC_TASKFUNC_SCOPE unsigned int
+isc__task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events)
{
/*
* Remove events from a task's event queue.
@@ -613,13 +749,15 @@ isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
XTRACE("isc_task_unsend");
- return (dequeue_events(task, sender, type, type, tag, events,
- ISC_FALSE));
+ return (dequeue_events((isc__task_t *)task, sender, type,
+ type, tag, events, ISC_FALSE));
}
-isc_result_t
-isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_onshutdown(isc_task_t *task0, isc_taskaction_t action,
+ const void *arg)
{
+ isc__task_t *task = (isc__task_t *)task0;
isc_boolean_t disallowed = ISC_FALSE;
isc_result_t result = ISC_R_SUCCESS;
isc_event_t *event;
@@ -655,8 +793,9 @@ isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, const void *arg)
return (result);
}
-void
-isc_task_shutdown(isc_task_t *task) {
+ISC_TASKFUNC_SCOPE void
+isc__task_shutdown(isc_task_t *task0) {
+ isc__task_t *task = (isc__task_t *)task0;
isc_boolean_t was_idle;
/*
@@ -673,8 +812,8 @@ isc_task_shutdown(isc_task_t *task) {
task_ready(task);
}
-void
-isc_task_destroy(isc_task_t **taskp) {
+ISC_TASKFUNC_SCOPE void
+isc__task_destroy(isc_task_t **taskp) {
/*
* Destroy '*taskp'.
@@ -686,8 +825,9 @@ isc_task_destroy(isc_task_t **taskp) {
isc_task_detach(taskp);
}
-void
-isc_task_setname(isc_task_t *task, const char *name, void *tag) {
+ISC_TASKFUNC_SCOPE void
+isc__task_setname(isc_task_t *task0, const char *name, void *tag) {
+ isc__task_t *task = (isc__task_t *)task0;
/*
* Name 'task'.
@@ -702,18 +842,28 @@ isc_task_setname(isc_task_t *task, const char *name, void *tag) {
UNLOCK(&task->lock);
}
-const char *
-isc_task_getname(isc_task_t *task) {
+ISC_TASKFUNC_SCOPE const char *
+isc__task_getname(isc_task_t *task0) {
+ isc__task_t *task = (isc__task_t *)task0;
+
+ REQUIRE(VALID_TASK(task));
+
return (task->name);
}
-void *
-isc_task_gettag(isc_task_t *task) {
+ISC_TASKFUNC_SCOPE void *
+isc__task_gettag(isc_task_t *task0) {
+ isc__task_t *task = (isc__task_t *)task0;
+
+ REQUIRE(VALID_TASK(task));
+
return (task->tag);
}
-void
-isc_task_getcurrenttime(isc_task_t *task, isc_stdtime_t *t) {
+ISC_TASKFUNC_SCOPE void
+isc__task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t) {
+ isc__task_t *task = (isc__task_t *)task0;
+
REQUIRE(VALID_TASK(task));
REQUIRE(t != NULL);
@@ -728,12 +878,12 @@ isc_task_getcurrenttime(isc_task_t *task, isc_stdtime_t *t) {
*** Task Manager.
***/
static void
-dispatch(isc_taskmgr_t *manager) {
- isc_task_t *task;
-#ifndef ISC_PLATFORM_USETHREADS
+dispatch(isc__taskmgr_t *manager) {
+ isc__task_t *task;
+#ifndef USE_WORKER_THREADS
unsigned int total_dispatch_count = 0;
- isc_tasklist_t ready_tasks;
-#endif /* ISC_PLATFORM_USETHREADS */
+ isc__tasklist_t ready_tasks;
+#endif /* USE_WORKER_THREADS */
REQUIRE(VALID_MANAGER(manager));
@@ -787,12 +937,12 @@ dispatch(isc_taskmgr_t *manager) {
* unlocks. The while expression is always protected by the lock.
*/
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
ISC_LIST_INIT(ready_tasks);
#endif
LOCK(&manager->lock);
while (!FINISHED(manager)) {
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
/*
* For reasons similar to those given in the comment in
* isc_task_send() above, it is safe for us to dequeue
@@ -812,11 +962,11 @@ dispatch(isc_taskmgr_t *manager) {
ISC_MSGSET_TASK,
ISC_MSG_AWAKE, "awake"));
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WORKER_THREADS */
if (total_dispatch_count >= DEFAULT_TASKMGR_QUANTUM ||
EMPTY(manager->ready_tasks))
break;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TASK,
ISC_MSG_WORKING, "working"));
@@ -859,13 +1009,15 @@ dispatch(isc_taskmgr_t *manager) {
"execute action"));
if (event->ev_action != NULL) {
UNLOCK(&task->lock);
- (event->ev_action)(task,event);
+ (event->ev_action)(
+ (isc_task_t *)task,
+ event);
LOCK(&task->lock);
}
dispatch_count++;
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
total_dispatch_count++;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
}
if (task->references == 0 &&
@@ -950,12 +1102,12 @@ dispatch(isc_taskmgr_t *manager) {
LOCK(&manager->lock);
manager->tasks_running--;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
if (manager->exclusive_requested &&
manager->tasks_running == 1) {
SIGNAL(&manager->exclusive_granted);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
if (requeue) {
/*
* We know we're awake, so we don't have
@@ -976,7 +1128,7 @@ dispatch(isc_taskmgr_t *manager) {
* were usually nonempty, the 'optimization'
* might even hurt rather than help.
*/
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
ENQUEUE(manager->ready_tasks, task,
ready_link);
#else
@@ -985,19 +1137,19 @@ dispatch(isc_taskmgr_t *manager) {
}
}
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
ISC_LIST_APPENDLIST(manager->ready_tasks, ready_tasks, ready_link);
#endif
UNLOCK(&manager->lock);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
static isc_threadresult_t
#ifdef _WIN32
WINAPI
#endif
run(void *uap) {
- isc_taskmgr_t *manager = uap;
+ isc__taskmgr_t *manager = uap;
XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_STARTING, "starting"));
@@ -1007,33 +1159,42 @@ run(void *uap) {
XTHREADTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_EXITING, "exiting"));
+#ifdef OPENSSL_LEAKS
+ ERR_remove_state(0);
+#endif
+
return ((isc_threadresult_t)0);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
static void
-manager_free(isc_taskmgr_t *manager) {
+manager_free(isc__taskmgr_t *manager) {
isc_mem_t *mctx;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
(void)isc_condition_destroy(&manager->exclusive_granted);
(void)isc_condition_destroy(&manager->work_available);
isc_mem_free(manager->mctx, manager->threads);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
DESTROYLOCK(&manager->lock);
- manager->magic = 0;
+ manager->common.impmagic = 0;
+ manager->common.magic = 0;
mctx = manager->mctx;
isc_mem_put(mctx, manager, sizeof(*manager));
isc_mem_detach(&mctx);
+
+#ifdef USE_SHARED_MANAGER
+ taskmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
}
-isc_result_t
-isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
- unsigned int default_quantum, isc_taskmgr_t **managerp)
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__taskmgr_create(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum, isc_taskmgr_t **managerp)
{
isc_result_t result;
unsigned int i, started = 0;
- isc_taskmgr_t *manager;
+ isc__taskmgr_t *manager;
/*
* Create a new task manager.
@@ -1042,28 +1203,33 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
REQUIRE(workers > 0);
REQUIRE(managerp != NULL && *managerp == NULL);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
UNUSED(i);
UNUSED(started);
- UNUSED(workers);
+#endif
+#ifdef USE_SHARED_MANAGER
if (taskmgr != NULL) {
+ if (taskmgr->refs == 0)
+ return (ISC_R_SHUTTINGDOWN);
taskmgr->refs++;
- *managerp = taskmgr;
+ *managerp = (isc_taskmgr_t *)taskmgr;
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
- manager->magic = TASK_MANAGER_MAGIC;
+ manager->common.methods = &taskmgrmethods;
+ manager->common.impmagic = TASK_MANAGER_MAGIC;
+ manager->common.magic = ISCAPI_TASKMGR_MAGIC;
manager->mctx = NULL;
result = isc_mutex_init(&manager->lock);
if (result != ISC_R_SUCCESS)
goto cleanup_mgr;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
manager->workers = 0;
manager->threads = isc_mem_allocate(mctx,
workers * sizeof(isc_thread_t));
@@ -1087,7 +1253,7 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
result = ISC_R_UNEXPECTED;
goto cleanup_workavailable;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
if (default_quantum == 0)
default_quantum = DEFAULT_DEFAULT_QUANTUM;
manager->default_quantum = default_quantum;
@@ -1099,7 +1265,7 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
isc_mem_attach(mctx, &manager->mctx);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
LOCK(&manager->lock);
/*
* Start workers.
@@ -1119,16 +1285,17 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
return (ISC_R_NOTHREADS);
}
isc_thread_setconcurrency(workers);
-#else /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
+#ifdef USE_SHARED_MANAGER
manager->refs = 1;
taskmgr = manager;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
- *managerp = manager;
+ *managerp = (isc_taskmgr_t *)manager;
return (ISC_R_SUCCESS);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
cleanup_workavailable:
(void)isc_condition_destroy(&manager->work_available);
cleanup_threads:
@@ -1141,10 +1308,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
return (result);
}
-void
-isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
- isc_taskmgr_t *manager;
- isc_task_t *task;
+ISC_TASKFUNC_SCOPE void
+isc__taskmgr_destroy(isc_taskmgr_t **managerp) {
+ isc__taskmgr_t *manager;
+ isc__task_t *task;
unsigned int i;
/*
@@ -1152,18 +1319,20 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
*/
REQUIRE(managerp != NULL);
- manager = *managerp;
+ manager = (isc__taskmgr_t *)*managerp;
REQUIRE(VALID_MANAGER(manager));
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
UNUSED(i);
+#endif /* USE_WORKER_THREADS */
- if (manager->refs > 1) {
- manager->refs--;
+#ifdef USE_SHARED_MANAGER
+ manager->refs--;
+ if (manager->refs > 0) {
*managerp = NULL;
return;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif
XTHREADTRACE("isc_taskmgr_destroy");
/*
@@ -1203,7 +1372,7 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
ENQUEUE(manager->ready_tasks, task, ready_link);
UNLOCK(&task->lock);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WORKER_THREADS
/*
* Wake up any sleeping workers. This ensures we get work done if
* there's work left to do, and if there are already no tasks left
@@ -1217,36 +1386,51 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
*/
for (i = 0; i < manager->workers; i++)
(void)isc_thread_join(manager->threads[i], NULL);
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WORKER_THREADS */
/*
* Dispatch the shutdown events.
*/
UNLOCK(&manager->lock);
- while (isc__taskmgr_ready())
- (void)isc__taskmgr_dispatch();
+ while (isc__taskmgr_ready((isc_taskmgr_t *)manager))
+ (void)isc__taskmgr_dispatch((isc_taskmgr_t *)manager);
+#ifdef BIND9
if (!ISC_LIST_EMPTY(manager->tasks))
isc_mem_printallactive(stderr);
+#endif
INSIST(ISC_LIST_EMPTY(manager->tasks));
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifdef USE_SHARED_MANAGER
+ taskmgr = NULL;
+#endif
+#endif /* USE_WORKER_THREADS */
manager_free(manager);
*managerp = NULL;
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WORKER_THREADS
isc_boolean_t
-isc__taskmgr_ready(void) {
- if (taskmgr == NULL)
+isc__taskmgr_ready(isc_taskmgr_t *manager0) {
+ isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
+
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = taskmgr;
+#endif
+ if (manager == NULL)
return (ISC_FALSE);
- return (ISC_TF(!ISC_LIST_EMPTY(taskmgr->ready_tasks)));
+ return (ISC_TF(!ISC_LIST_EMPTY(manager->ready_tasks)));
}
isc_result_t
-isc__taskmgr_dispatch(void) {
- isc_taskmgr_t *manager = taskmgr;
+isc__taskmgr_dispatch(isc_taskmgr_t *manager0) {
+ isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
- if (taskmgr == NULL)
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = taskmgr;
+#endif
+ if (manager == NULL)
return (ISC_R_NOTFOUND);
dispatch(manager);
@@ -1254,12 +1438,13 @@ isc__taskmgr_dispatch(void) {
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WORKER_THREADS */
-isc_result_t
-isc_task_beginexclusive(isc_task_t *task) {
-#ifdef ISC_PLATFORM_USETHREADS
- isc_taskmgr_t *manager = task->manager;
+ISC_TASKFUNC_SCOPE isc_result_t
+isc__task_beginexclusive(isc_task_t *task0) {
+#ifdef USE_WORKER_THREADS
+ isc__task_t *task = (isc__task_t *)task0;
+ isc__taskmgr_t *manager = task->manager;
REQUIRE(task->state == task_state_running);
LOCK(&manager->lock);
if (manager->exclusive_requested) {
@@ -1272,15 +1457,17 @@ isc_task_beginexclusive(isc_task_t *task) {
}
UNLOCK(&manager->lock);
#else
- UNUSED(task);
+ UNUSED(task0);
#endif
return (ISC_R_SUCCESS);
}
-void
-isc_task_endexclusive(isc_task_t *task) {
-#ifdef ISC_PLATFORM_USETHREADS
- isc_taskmgr_t *manager = task->manager;
+ISC_TASKFUNC_SCOPE void
+isc__task_endexclusive(isc_task_t *task0) {
+#ifdef USE_WORKER_THREADS
+ isc__task_t *task = (isc__task_t *)task0;
+ isc__taskmgr_t *manager = task->manager;
+
REQUIRE(task->state == task_state_running);
LOCK(&manager->lock);
REQUIRE(manager->exclusive_requested);
@@ -1288,23 +1475,31 @@ isc_task_endexclusive(isc_task_t *task) {
BROADCAST(&manager->work_available);
UNLOCK(&manager->lock);
#else
- UNUSED(task);
+ UNUSED(task0);
#endif
}
+#ifdef USE_SOCKETIMPREGISTER
+isc_result_t
+isc__task_register() {
+ return (isc_task_register(isc__taskmgr_create));
+}
+#endif
+
isc_boolean_t
isc_task_exiting(isc_task_t *t) {
- isc_task_t *task = (isc_task_t *)t;
+ isc__task_t *task = (isc__task_t *)t;
REQUIRE(VALID_TASK(task));
return (TASK_SHUTTINGDOWN(task));
}
-#ifdef HAVE_LIBXML2
+
+#if defined(HAVE_LIBXML2) && defined(BIND9)
void
-isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer)
-{
- isc_task_t *task;
+isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, xmlTextWriterPtr writer) {
+ isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
+ isc__task_t *task;
LOCK(&mgr->lock);
@@ -1380,4 +1575,4 @@ isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer)
UNLOCK(&mgr->lock);
}
-#endif /* HAVE_LIBXML2 */
+#endif /* HAVE_LIBXML2 && BIND9 */
diff --git a/contrib/bind9/lib/isc/task_api.c b/contrib/bind9/lib/isc/task_api.c
new file mode 100644
index 0000000..4e03db2
--- /dev/null
+++ b/contrib/bind9/lib/isc/task_api.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: task_api.c,v 1.7 2010-12-22 23:46:59 tbox Exp $ */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/task.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_taskmgrcreatefunc_t taskmgr_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_task_register(isc_taskmgrcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (taskmgr_createfunc == NULL)
+ taskmgr_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_taskmgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ unsigned int workers, unsigned int default_quantum,
+ isc_taskmgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(taskmgr_createfunc != NULL);
+ result = (*taskmgr_createfunc)(mctx, workers, default_quantum,
+ managerp);
+
+ UNLOCK(&createlock);
+
+ if (result == ISC_R_SUCCESS)
+ isc_appctx_settaskmgr(actx, *managerp);
+
+ return (result);
+}
+
+isc_result_t
+isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
+ unsigned int default_quantum, isc_taskmgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(taskmgr_createfunc != NULL);
+ result = (*taskmgr_createfunc)(mctx, workers, default_quantum,
+ managerp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
+ REQUIRE(managerp != NULL && ISCAPI_TASKMGR_VALID(*managerp));
+
+ (*managerp)->methods->destroy(managerp);
+
+ ENSURE(*managerp == NULL);
+}
+
+isc_result_t
+isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
+ isc_task_t **taskp)
+{
+ REQUIRE(ISCAPI_TASKMGR_VALID(manager));
+ REQUIRE(taskp != NULL && *taskp == NULL);
+
+ return (manager->methods->taskcreate(manager, quantum, taskp));
+}
+
+void
+isc_task_attach(isc_task_t *source, isc_task_t **targetp) {
+ REQUIRE(ISCAPI_TASK_VALID(source));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+
+ source->methods->attach(source, targetp);
+
+ ENSURE(*targetp == source);
+}
+
+void
+isc_task_detach(isc_task_t **taskp) {
+ REQUIRE(taskp != NULL && ISCAPI_TASK_VALID(*taskp));
+
+ (*taskp)->methods->detach(taskp);
+
+ ENSURE(*taskp == NULL);
+}
+
+void
+isc_task_send(isc_task_t *task, isc_event_t **eventp) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+ REQUIRE(eventp != NULL && *eventp != NULL);
+
+ task->methods->send(task, eventp);
+
+ ENSURE(*eventp == NULL);
+}
+
+void
+isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
+ REQUIRE(taskp != NULL && ISCAPI_TASK_VALID(*taskp));
+ REQUIRE(eventp != NULL && *eventp != NULL);
+
+ (*taskp)->methods->sendanddetach(taskp, eventp);
+
+ ENSURE(*taskp == NULL && *eventp == NULL);
+}
+
+unsigned int
+isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
+ void *tag, isc_eventlist_t *events)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->unsend(task, sender, type, tag, events));
+}
+
+isc_result_t
+isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, const void *arg)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->onshutdown(task, action, arg));
+}
+
+void
+isc_task_shutdown(isc_task_t *task) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ task->methods->shutdown(task);
+}
+
+void
+isc_task_setname(isc_task_t *task, const char *name, void *tag) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ task->methods->setname(task, name, tag);
+}
+
+unsigned int
+isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->purgeevents(task, sender, type, tag));
+}
+
+isc_result_t
+isc_task_beginexclusive(isc_task_t *task) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->beginexclusive(task));
+}
+
+void
+isc_task_endexclusive(isc_task_t *task) {
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ task->methods->endexclusive(task);
+}
+
+
+/*%
+ * This is necessary for libisc's internal timer implementation. Other
+ * implementation might skip implementing this.
+ */
+unsigned int
+isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
+ isc_eventtype_t last, void *tag)
+{
+ REQUIRE(ISCAPI_TASK_VALID(task));
+
+ return (task->methods->purgerange(task, sender, first, last, tag));
+}
diff --git a/contrib/bind9/lib/isc/task_p.h b/contrib/bind9/lib/isc/task_p.h
index 7bf208a..1bcdca6 100644
--- a/contrib/bind9/lib/isc/task_p.h
+++ b/contrib/bind9/lib/isc/task_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task_p.h,v 1.11 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: task_p.h,v 1.13 2009-09-02 23:48:02 tbox Exp $ */
#ifndef ISC_TASK_P_H
#define ISC_TASK_P_H
@@ -23,9 +23,9 @@
/*! \file */
isc_boolean_t
-isc__taskmgr_ready(void);
+isc__taskmgr_ready(isc_taskmgr_t *taskmgr);
isc_result_t
-isc__taskmgr_dispatch(void);
+isc__taskmgr_dispatch(isc_taskmgr_t *taskmgr);
#endif /* ISC_TASK_P_H */
diff --git a/contrib/bind9/lib/isc/timer.c b/contrib/bind9/lib/isc/timer.c
index 6342688..ab89cdd 100644
--- a/contrib/bind9/lib/isc/timer.c
+++ b/contrib/bind9/lib/isc/timer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer.c,v 1.84.58.4 2009-01-23 23:47:21 tbox Exp $ */
+/* $Id: timer.c,v 1.95.302.1.2.1 2011-06-02 23:47:36 tbox Exp $ */
/*! \file */
@@ -34,9 +34,22 @@
#include <isc/timer.h>
#include <isc/util.h>
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef OPENSSL_LEAKS
+#include <openssl/err.h>
+#endif
+
+/* See task.c about the following definition: */
+#ifdef BIND9
+#ifdef ISC_PLATFORM_USETHREADS
+#define USE_TIMER_THREAD
+#else
+#define USE_SHARED_MANAGER
+#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* BIND9 */
+
+#ifndef USE_TIMER_THREAD
#include "timer_p.h"
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
#ifdef ISC_TIMER_TRACE
#define XTRACE(s) fprintf(stderr, "%s\n", (s))
@@ -58,10 +71,13 @@
#define TIMER_MAGIC ISC_MAGIC('T', 'I', 'M', 'R')
#define VALID_TIMER(t) ISC_MAGIC_VALID(t, TIMER_MAGIC)
-struct isc_timer {
+typedef struct isc__timer isc__timer_t;
+typedef struct isc__timermgr isc__timermgr_t;
+
+struct isc__timer {
/*! Not locked. */
- unsigned int magic;
- isc_timermgr_t * manager;
+ isc_timer_t common;
+ isc__timermgr_t * manager;
isc_mutex_t lock;
/*! Locked by timer lock. */
unsigned int references;
@@ -75,45 +91,119 @@ struct isc_timer {
void * arg;
unsigned int index;
isc_time_t due;
- LINK(isc_timer_t) link;
+ LINK(isc__timer_t) link;
};
#define TIMER_MANAGER_MAGIC ISC_MAGIC('T', 'I', 'M', 'M')
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, TIMER_MANAGER_MAGIC)
-struct isc_timermgr {
+struct isc__timermgr {
/* Not locked. */
- unsigned int magic;
+ isc_timermgr_t common;
isc_mem_t * mctx;
isc_mutex_t lock;
/* Locked by manager lock. */
isc_boolean_t done;
- LIST(isc_timer_t) timers;
+ LIST(isc__timer_t) timers;
unsigned int nscheduled;
isc_time_t due;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
isc_condition_t wakeup;
isc_thread_t thread;
-#else /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
+#ifdef USE_SHARED_MANAGER
unsigned int refs;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
isc_heap_t * heap;
};
-#ifndef ISC_PLATFORM_USETHREADS
+/*%
+ * The followings can be either static or public, depending on build
+ * environment.
+ */
+
+#ifdef BIND9
+#define ISC_TIMERFUNC_SCOPE
+#else
+#define ISC_TIMERFUNC_SCOPE static
+#endif
+
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_create(isc_timermgr_t *manager, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_timer_t **timerp);
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_reset(isc_timer_t *timer, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge);
+ISC_TIMERFUNC_SCOPE isc_timertype_t
+isc__timer_gettype(isc_timer_t *timer);
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_touch(isc_timer_t *timer);
+ISC_TIMERFUNC_SCOPE void
+isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp);
+ISC_TIMERFUNC_SCOPE void
+isc__timer_detach(isc_timer_t **timerp);
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_poke(isc_timermgr_t *manager0);
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_destroy(isc_timermgr_t **managerp);
+
+static struct isc__timermethods {
+ isc_timermethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *gettype;
+#endif
+} timermethods = {
+ {
+ isc__timer_attach,
+ isc__timer_detach,
+ isc__timer_reset,
+ isc__timer_touch
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__timer_gettype
+#endif
+};
+
+static struct isc__timermgrmethods {
+ isc_timermgrmethods_t methods;
+#ifndef BIND9
+ void *poke; /* see above */
+#endif
+} timermgrmethods = {
+ {
+ isc__timermgr_destroy,
+ isc__timer_create
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__timermgr_poke
+#endif
+};
+
+#ifdef USE_SHARED_MANAGER
/*!
- * If threads are not in use, there can be only one.
+ * If the manager is supposed to be shared, there can be only one.
*/
-static isc_timermgr_t *timermgr = NULL;
-#endif /* ISC_PLATFORM_USETHREADS */
+static isc__timermgr_t *timermgr = NULL;
+#endif /* USE_SHARED_MANAGER */
static inline isc_result_t
-schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
+schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
isc_result_t result;
- isc_timermgr_t *manager;
+ isc__timermgr_t *manager;
isc_time_t due;
int cmp;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
isc_boolean_t timedwait;
#endif
@@ -123,13 +213,13 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
REQUIRE(timer->type != isc_timertype_inactive);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_TIMER_THREAD
UNUSED(signal_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
manager = timer->manager;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
/*!
* If the manager was timed wait, we may need to signal the
* manager to force a wakeup.
@@ -199,7 +289,7 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
* the current "next" timer. We do this either by waking up the
* run thread, or explicitly setting the value in the manager.
*/
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
/*
* This is a temporary (probably) hack to fix a bug on tru64 5.1
@@ -232,19 +322,19 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
"signal (schedule)"));
SIGNAL(&manager->wakeup);
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_TIMER_THREAD */
if (timer->index == 1 &&
isc_time_compare(&timer->due, &manager->due) < 0)
manager->due = timer->due;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
return (ISC_R_SUCCESS);
}
static inline void
-deschedule(isc_timer_t *timer) {
+deschedule(isc__timer_t *timer) {
isc_boolean_t need_wakeup = ISC_FALSE;
- isc_timermgr_t *manager;
+ isc__timermgr_t *manager;
/*
* The caller must ensure locking.
@@ -258,20 +348,20 @@ deschedule(isc_timer_t *timer) {
timer->index = 0;
INSIST(manager->nscheduled > 0);
manager->nscheduled--;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
if (need_wakeup) {
XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER,
ISC_MSG_SIGNALDESCHED,
"signal (deschedule)"));
SIGNAL(&manager->wakeup);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
}
}
static void
-destroy(isc_timer_t *timer) {
- isc_timermgr_t *manager = timer->manager;
+destroy(isc__timer_t *timer) {
+ isc__timermgr_t *manager = timer->manager;
/*
* The caller must ensure it is safe to destroy the timer.
@@ -291,17 +381,19 @@ destroy(isc_timer_t *timer) {
isc_task_detach(&timer->task);
DESTROYLOCK(&timer->lock);
- timer->magic = 0;
+ timer->common.impmagic = 0;
+ timer->common.magic = 0;
isc_mem_put(manager->mctx, timer, sizeof(*timer));
}
-isc_result_t
-isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
- isc_time_t *expires, isc_interval_t *interval,
- isc_task_t *task, isc_taskaction_t action, const void *arg,
- isc_timer_t **timerp)
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_create(isc_timermgr_t *manager0, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_timer_t **timerp)
{
- isc_timer_t *timer;
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
+ isc__timer_t *timer;
isc_result_t result;
isc_time_t now;
@@ -382,7 +474,9 @@ isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
return (result);
}
ISC_LINK_INIT(timer, link);
- timer->magic = TIMER_MAGIC;
+ timer->common.impmagic = TIMER_MAGIC;
+ timer->common.magic = ISCAPI_TIMER_MAGIC;
+ timer->common.methods = (isc_timermethods_t *)&timermethods;
LOCK(&manager->lock);
@@ -401,25 +495,27 @@ isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
UNLOCK(&manager->lock);
if (result != ISC_R_SUCCESS) {
- timer->magic = 0;
+ timer->common.impmagic = 0;
+ timer->common.magic = 0;
DESTROYLOCK(&timer->lock);
isc_task_detach(&timer->task);
isc_mem_put(manager->mctx, timer, sizeof(*timer));
return (result);
}
- *timerp = timer;
+ *timerp = (isc_timer_t *)timer;
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
- isc_time_t *expires, isc_interval_t *interval,
- isc_boolean_t purge)
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_reset(isc_timer_t *timer0, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge)
{
+ isc__timer_t *timer = (isc__timer_t *)timer0;
isc_time_t now;
- isc_timermgr_t *manager;
+ isc__timermgr_t *manager;
isc_result_t result;
/*
@@ -489,8 +585,9 @@ isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
return (result);
}
-isc_timertype_t
-isc_timer_gettype(isc_timer_t *timer) {
+ISC_TIMERFUNC_SCOPE isc_timertype_t
+isc__timer_gettype(isc_timer_t *timer0) {
+ isc__timer_t *timer = (isc__timer_t *)timer0;
isc_timertype_t t;
REQUIRE(VALID_TIMER(timer));
@@ -502,8 +599,9 @@ isc_timer_gettype(isc_timer_t *timer) {
return (t);
}
-isc_result_t
-isc_timer_touch(isc_timer_t *timer) {
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timer_touch(isc_timer_t *timer0) {
+ isc__timer_t *timer = (isc__timer_t *)timer0;
isc_result_t result;
isc_time_t now;
@@ -532,8 +630,10 @@ isc_timer_touch(isc_timer_t *timer) {
return (result);
}
-void
-isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
+ISC_TIMERFUNC_SCOPE void
+isc__timer_attach(isc_timer_t *timer0, isc_timer_t **timerp) {
+ isc__timer_t *timer = (isc__timer_t *)timer0;
+
/*
* Attach *timerp to timer.
*/
@@ -545,12 +645,12 @@ isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
timer->references++;
UNLOCK(&timer->lock);
- *timerp = timer;
+ *timerp = (isc_timer_t *)timer;
}
-void
-isc_timer_detach(isc_timer_t **timerp) {
- isc_timer_t *timer;
+ISC_TIMERFUNC_SCOPE void
+isc__timer_detach(isc_timer_t **timerp) {
+ isc__timer_t *timer;
isc_boolean_t free_timer = ISC_FALSE;
/*
@@ -558,7 +658,7 @@ isc_timer_detach(isc_timer_t **timerp) {
*/
REQUIRE(timerp != NULL);
- timer = *timerp;
+ timer = (isc__timer_t *)*timerp;
REQUIRE(VALID_TIMER(timer));
LOCK(&timer->lock);
@@ -575,11 +675,11 @@ isc_timer_detach(isc_timer_t **timerp) {
}
static void
-dispatch(isc_timermgr_t *manager, isc_time_t *now) {
+dispatch(isc__timermgr_t *manager, isc_time_t *now) {
isc_boolean_t done = ISC_FALSE, post_event, need_schedule;
isc_timerevent_t *event;
isc_eventtype_t type = 0;
- isc_timer_t *timer;
+ isc__timer_t *timer;
isc_result_t result;
isc_boolean_t idle;
@@ -693,13 +793,13 @@ dispatch(isc_timermgr_t *manager, isc_time_t *now) {
}
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
static isc_threadresult_t
#ifdef _WIN32 /* XXXDCL */
WINAPI
#endif
run(void *uap) {
- isc_timermgr_t *manager = uap;
+ isc__timermgr_t *manager = uap;
isc_time_t now;
isc_result_t result;
@@ -732,13 +832,17 @@ run(void *uap) {
}
UNLOCK(&manager->lock);
+#ifdef OPENSSL_LEAKS
+ ERR_remove_state(0);
+#endif
+
return ((isc_threadresult_t)0);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
static isc_boolean_t
sooner(void *v1, void *v2) {
- isc_timer_t *t1, *t2;
+ isc__timer_t *t1, *t2;
t1 = v1;
t2 = v2;
@@ -752,7 +856,7 @@ sooner(void *v1, void *v2) {
static void
set_index(void *what, unsigned int index) {
- isc_timer_t *timer;
+ isc__timer_t *timer;
timer = what;
REQUIRE(VALID_TIMER(timer));
@@ -760,9 +864,9 @@ set_index(void *what, unsigned int index) {
timer->index = index;
}
-isc_result_t
-isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
- isc_timermgr_t *manager;
+ISC_TIMERFUNC_SCOPE isc_result_t
+isc__timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
+ isc__timermgr_t *manager;
isc_result_t result;
/*
@@ -771,19 +875,21 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
REQUIRE(managerp != NULL && *managerp == NULL);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
if (timermgr != NULL) {
timermgr->refs++;
- *managerp = timermgr;
+ *managerp = (isc_timermgr_t *)timermgr;
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
manager = isc_mem_get(mctx, sizeof(*manager));
if (manager == NULL)
return (ISC_R_NOMEMORY);
- manager->magic = TIMER_MANAGER_MAGIC;
+ manager->common.impmagic = TIMER_MANAGER_MAGIC;
+ manager->common.magic = ISCAPI_TIMERMGR_MAGIC;
+ manager->common.methods = (isc_timermgrmethods_t *)&timermgrmethods;
manager->mctx = NULL;
manager->done = ISC_FALSE;
INIT_LIST(manager->timers);
@@ -803,7 +909,7 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
return (result);
}
isc_mem_attach(mctx, &manager->mctx);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
if (isc_condition_init(&manager->wakeup) != ISC_R_SUCCESS) {
isc_mem_detach(&manager->mctx);
DESTROYLOCK(&manager->lock);
@@ -828,30 +934,33 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
ISC_MSG_FAILED, "failed"));
return (ISC_R_UNEXPECTED);
}
-#else /* ISC_PLATFORM_USETHREADS */
+#endif
+#ifdef USE_SHARED_MANAGER
manager->refs = 1;
timermgr = manager;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
- *managerp = manager;
+ *managerp = (isc_timermgr_t *)manager;
return (ISC_R_SUCCESS);
}
-void
-isc_timermgr_poke(isc_timermgr_t *manager) {
-#ifdef ISC_PLATFORM_USETHREADS
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_poke(isc_timermgr_t *manager0) {
+#ifdef USE_TIMER_THREAD
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
+
REQUIRE(VALID_MANAGER(manager));
SIGNAL(&manager->wakeup);
#else
- UNUSED(manager);
+ UNUSED(manager0);
#endif
}
-void
-isc_timermgr_destroy(isc_timermgr_t **managerp) {
- isc_timermgr_t *manager;
+ISC_TIMERFUNC_SCOPE void
+isc__timermgr_destroy(isc_timermgr_t **managerp) {
+ isc__timermgr_t *manager;
isc_mem_t *mctx;
/*
@@ -859,34 +968,37 @@ isc_timermgr_destroy(isc_timermgr_t **managerp) {
*/
REQUIRE(managerp != NULL);
- manager = *managerp;
+ manager = (isc__timermgr_t *)*managerp;
REQUIRE(VALID_MANAGER(manager));
LOCK(&manager->lock);
-#ifndef ISC_PLATFORM_USETHREADS
- if (manager->refs > 1) {
- manager->refs--;
+#ifdef USE_SHARED_MANAGER
+ manager->refs--;
+ if (manager->refs > 0) {
UNLOCK(&manager->lock);
*managerp = NULL;
return;
}
+ timermgr = NULL;
+#endif /* USE_SHARED_MANAGER */
- isc__timermgr_dispatch();
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifndef USE_TIMER_THREAD
+ isc__timermgr_dispatch((isc_timermgr_t *)manager);
+#endif
REQUIRE(EMPTY(manager->timers));
manager->done = ISC_TRUE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
XTRACE(isc_msgcat_get(isc_msgcat, ISC_MSGSET_TIMER,
ISC_MSG_SIGNALDESTROY, "signal (destroy)"));
SIGNAL(&manager->wakeup);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
UNLOCK(&manager->lock);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
/*
* Wait for thread to exit.
*/
@@ -895,39 +1007,63 @@ isc_timermgr_destroy(isc_timermgr_t **managerp) {
"isc_thread_join() %s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed"));
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
/*
* Clean up.
*/
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_TIMER_THREAD
(void)isc_condition_destroy(&manager->wakeup);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
DESTROYLOCK(&manager->lock);
isc_heap_destroy(&manager->heap);
- manager->magic = 0;
+ manager->common.impmagic = 0;
+ manager->common.magic = 0;
mctx = manager->mctx;
isc_mem_put(mctx, manager, sizeof(*manager));
isc_mem_detach(&mctx);
*managerp = NULL;
+
+#ifdef USE_SHARED_MANAGER
+ timermgr = NULL;
+#endif
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_TIMER_THREAD
isc_result_t
-isc__timermgr_nextevent(isc_time_t *when) {
- if (timermgr == NULL || timermgr->nscheduled == 0)
+isc__timermgr_nextevent(isc_timermgr_t *manager0, isc_time_t *when) {
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
+
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = timermgr;
+#endif
+ if (manager == NULL || manager->nscheduled == 0)
return (ISC_R_NOTFOUND);
- *when = timermgr->due;
+ *when = manager->due;
return (ISC_R_SUCCESS);
}
void
-isc__timermgr_dispatch(void) {
+isc__timermgr_dispatch(isc_timermgr_t *manager0) {
+ isc__timermgr_t *manager = (isc__timermgr_t *)manager0;
isc_time_t now;
- if (timermgr == NULL)
+
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = timermgr;
+#endif
+ if (manager == NULL)
return;
TIME_NOW(&now);
- dispatch(timermgr, &now);
+ dispatch(manager, &now);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_TIMER_THREAD */
+
+#ifdef USE_TIMERIMPREGISTER
+isc_result_t
+isc__timer_register() {
+ return (isc_timer_register(isc__timermgr_create));
+}
+#endif
diff --git a/contrib/bind9/lib/isc/timer_api.c b/contrib/bind9/lib/isc/timer_api.c
new file mode 100644
index 0000000..5a9bf9d
--- /dev/null
+++ b/contrib/bind9/lib/isc/timer_api.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: timer_api.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <isc/app.h>
+#include <isc/magic.h>
+#include <isc/mutex.h>
+#include <isc/once.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+
+static isc_mutex_t createlock;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_timermgrcreatefunc_t timermgr_createfunc = NULL;
+
+static void
+initialize(void) {
+ RUNTIME_CHECK(isc_mutex_init(&createlock) == ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_timer_register(isc_timermgrcreatefunc_t createfunc) {
+ isc_result_t result = ISC_R_SUCCESS;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize) == ISC_R_SUCCESS);
+
+ LOCK(&createlock);
+ if (timermgr_createfunc == NULL)
+ timermgr_createfunc = createfunc;
+ else
+ result = ISC_R_EXISTS;
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+isc_result_t
+isc_timermgr_createinctx(isc_mem_t *mctx, isc_appctx_t *actx,
+ isc_timermgr_t **managerp)
+{
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(timermgr_createfunc != NULL);
+ result = (*timermgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ if (result == ISC_R_SUCCESS)
+ isc_appctx_settimermgr(actx, *managerp);
+
+ return (result);
+}
+
+isc_result_t
+isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
+ isc_result_t result;
+
+ LOCK(&createlock);
+
+ REQUIRE(timermgr_createfunc != NULL);
+ result = (*timermgr_createfunc)(mctx, managerp);
+
+ UNLOCK(&createlock);
+
+ return (result);
+}
+
+void
+isc_timermgr_destroy(isc_timermgr_t **managerp) {
+ REQUIRE(*managerp != NULL && ISCAPI_TIMERMGR_VALID(*managerp));
+
+ (*managerp)->methods->destroy(managerp);
+
+ ENSURE(*managerp == NULL);
+}
+
+isc_result_t
+isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_timer_t **timerp)
+{
+ REQUIRE(ISCAPI_TIMERMGR_VALID(manager));
+
+ return (manager->methods->timercreate(manager, type, expires,
+ interval, task, action, arg,
+ timerp));
+}
+
+void
+isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp) {
+ REQUIRE(ISCAPI_TIMER_VALID(timer));
+ REQUIRE(timerp != NULL && *timerp == NULL);
+
+ timer->methods->attach(timer, timerp);
+
+ ENSURE(*timerp == timer);
+}
+
+void
+isc_timer_detach(isc_timer_t **timerp) {
+ REQUIRE(timerp != NULL && ISCAPI_TIMER_VALID(*timerp));
+
+ (*timerp)->methods->detach(timerp);
+
+ ENSURE(*timerp == NULL);
+}
+
+isc_result_t
+isc_timer_reset(isc_timer_t *timer, isc_timertype_t type,
+ isc_time_t *expires, isc_interval_t *interval,
+ isc_boolean_t purge)
+{
+ REQUIRE(ISCAPI_TIMER_VALID(timer));
+
+ return (timer->methods->reset(timer, type, expires, interval, purge));
+}
+
+isc_result_t
+isc_timer_touch(isc_timer_t *timer) {
+ REQUIRE(ISCAPI_TIMER_VALID(timer));
+
+ return (timer->methods->touch(timer));
+}
diff --git a/contrib/bind9/lib/isc/timer_p.h b/contrib/bind9/lib/isc/timer_p.h
index b41f922..657b695 100644
--- a/contrib/bind9/lib/isc/timer_p.h
+++ b/contrib/bind9/lib/isc/timer_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer_p.h,v 1.10 2007-06-19 23:47:17 tbox Exp $ */
+/* $Id: timer_p.h,v 1.12 2009-09-02 23:48:02 tbox Exp $ */
#ifndef ISC_TIMER_P_H
#define ISC_TIMER_P_H
@@ -23,9 +23,9 @@
/*! \file */
isc_result_t
-isc__timermgr_nextevent(isc_time_t *when);
+isc__timermgr_nextevent(isc_timermgr_t *timermgr, isc_time_t *when);
void
-isc__timermgr_dispatch(void);
+isc__timermgr_dispatch(isc_timermgr_t *timermgr);
#endif /* ISC_TIMER_P_H */
diff --git a/contrib/bind9/lib/isc/unix/Makefile.in b/contrib/bind9/lib/isc/unix/Makefile.in
index 7d23b96..2c91756 100644
--- a/contrib/bind9/lib/isc/unix/Makefile.in
+++ b/contrib/bind9/lib/isc/unix/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.41 2007-06-19 23:47:18 tbox Exp $
+# $Id: Makefile.in,v 1.44 2009-12-05 23:31:41 each Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/unix/app.c b/contrib/bind9/lib/isc/unix/app.c
index 6bd1660..4dc5130 100644
--- a/contrib/bind9/lib/isc/unix/app.c
+++ b/contrib/bind9/lib/isc/unix/app.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: app.c,v 1.60 2008-10-15 03:41:17 marka Exp $ */
+/* $Id: app.c,v 1.64 2009-11-04 05:58:46 marka Exp $ */
/*! \file */
@@ -37,6 +37,7 @@
#include <isc/app.h>
#include <isc/boolean.h>
#include <isc/condition.h>
+#include <isc/mem.h>
#include <isc/msgs.h>
#include <isc/mutex.h>
#include <isc/event.h>
@@ -47,31 +48,129 @@
#include <isc/time.h>
#include <isc/util.h>
+/*%
+ * For BIND9 internal applications built with threads, we use a single app
+ * context and let multiple worker, I/O, timer threads do actual jobs.
+ * For other cases (including BIND9 built without threads) an app context acts
+ * as an event loop dispatching various events.
+ */
+#if defined(ISC_PLATFORM_USETHREADS) && defined(BIND9)
+#define USE_THREADS_SINGLECTX
+#endif
+
#ifdef ISC_PLATFORM_USETHREADS
#include <pthread.h>
-#else /* ISC_PLATFORM_USETHREADS */
+#endif
+
+#ifndef USE_THREADS_SINGLECTX
#include "../timer_p.h"
#include "../task_p.h"
#include "socket_p.h"
+#endif /* USE_THREADS_SINGLECTX */
+
+#ifdef ISC_PLATFORM_USETHREADS
+static pthread_t blockedthread;
#endif /* ISC_PLATFORM_USETHREADS */
-static isc_eventlist_t on_run;
-static isc_mutex_t lock;
-static isc_boolean_t shutdown_requested = ISC_FALSE;
-static isc_boolean_t running = ISC_FALSE;
-/*!
- * We assume that 'want_shutdown' can be read and written atomically.
+/*%
+ * The following can be either static or public, depending on build environment.
*/
-static volatile isc_boolean_t want_shutdown = ISC_FALSE;
+
+#ifdef BIND9
+#define ISC_APPFUNC_SCOPE
+#else
+#define ISC_APPFUNC_SCOPE static
+#endif
+
+ISC_APPFUNC_SCOPE isc_result_t isc__app_start(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxstart(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_onrun(isc_mem_t *mctx,
+ isc_task_t *task,
+ isc_taskaction_t action,
+ void *arg);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxrun(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_run(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_shutdown(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_reload(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE void isc__app_ctxfinish(isc_appctx_t *ctx);
+ISC_APPFUNC_SCOPE void isc__app_finish(void);
+ISC_APPFUNC_SCOPE void isc__app_block(void);
+ISC_APPFUNC_SCOPE void isc__app_unblock(void);
+ISC_APPFUNC_SCOPE isc_result_t isc__appctx_create(isc_mem_t *mctx,
+ isc_appctx_t **ctxp);
+ISC_APPFUNC_SCOPE void isc__appctx_destroy(isc_appctx_t **ctxp);
+ISC_APPFUNC_SCOPE void isc__appctx_settaskmgr(isc_appctx_t *ctx,
+ isc_taskmgr_t *taskmgr);
+ISC_APPFUNC_SCOPE void isc__appctx_setsocketmgr(isc_appctx_t *ctx,
+ isc_socketmgr_t *socketmgr);
+ISC_APPFUNC_SCOPE void isc__appctx_settimermgr(isc_appctx_t *ctx,
+ isc_timermgr_t *timermgr);
+
/*
- * We assume that 'want_reload' can be read and written atomically.
+ * The application context of this module. This implementation actually
+ * doesn't use it. (This may change in the future).
*/
-static volatile isc_boolean_t want_reload = ISC_FALSE;
+#define APPCTX_MAGIC ISC_MAGIC('A', 'p', 'c', 'x')
+#define VALID_APPCTX(c) ISC_MAGIC_VALID(c, APPCTX_MAGIC)
+
+typedef struct isc__appctx {
+ isc_appctx_t common;
+ isc_mem_t *mctx;
+ isc_mutex_t lock;
+ isc_eventlist_t on_run;
+ isc_boolean_t shutdown_requested;
+ isc_boolean_t running;
+
+ /*!
+ * We assume that 'want_shutdown' can be read and written atomically.
+ */
+ isc_boolean_t want_shutdown;
+ /*
+ * We assume that 'want_reload' can be read and written atomically.
+ */
+ isc_boolean_t want_reload;
-static isc_boolean_t blocked = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
-static pthread_t blockedthread;
-#endif /* ISC_PLATFORM_USETHREADS */
+ isc_boolean_t blocked;
+
+ isc_taskmgr_t *taskmgr;
+ isc_socketmgr_t *socketmgr;
+ isc_timermgr_t *timermgr;
+} isc__appctx_t;
+
+static isc__appctx_t isc_g_appctx;
+
+static struct {
+ isc_appmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *run, *shutdown, *start, *onrun, *reload, *finish,
+ *block, *unblock;
+#endif
+} appmethods = {
+ {
+ isc__appctx_destroy,
+ isc__app_ctxstart,
+ isc__app_ctxrun,
+ isc__app_ctxsuspend,
+ isc__app_ctxshutdown,
+ isc__app_ctxfinish,
+ isc__appctx_settaskmgr,
+ isc__appctx_setsocketmgr,
+ isc__appctx_settimermgr
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__app_run, (void *)isc__app_shutdown,
+ (void *)isc__app_start, (void *)isc__app_onrun, (void *)isc__app_reload,
+ (void *)isc__app_finish, (void *)isc__app_block,
+ (void *)isc__app_unblock
+#endif
+};
#ifdef HAVE_LINUXTHREADS
/*!
@@ -91,13 +190,13 @@ static pthread_t main_thread;
static void
exit_action(int arg) {
UNUSED(arg);
- want_shutdown = ISC_TRUE;
+ isc_g_appctx.want_shutdown = ISC_TRUE;
}
static void
reload_action(int arg) {
UNUSED(arg);
- want_reload = ISC_TRUE;
+ isc_g_appctx.want_reload = ISC_TRUE;
}
#endif
@@ -123,12 +222,12 @@ handle_signal(int sig, void (*handler)(int)) {
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_start(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxstart(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_result_t result;
- int presult;
- sigset_t sset;
- char strbuf[ISC_STRERRORSIZE];
+
+ REQUIRE(VALID_APPCTX(ctx));
/*
* Start an ISC library application.
@@ -151,7 +250,35 @@ isc_app_start(void) {
main_thread = pthread_self();
#endif
- result = isc_mutex_init(&lock);
+ result = isc_mutex_init(&ctx->lock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ ISC_LIST_INIT(ctx->on_run);
+
+ ctx->shutdown_requested = ISC_FALSE;
+ ctx->running = ISC_FALSE;
+ ctx->want_shutdown = ISC_FALSE;
+ ctx->want_reload = ISC_FALSE;
+ ctx->blocked = ISC_FALSE;
+
+ return (ISC_R_SUCCESS);
+}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_start(void) {
+ isc_result_t result;
+ int presult;
+ sigset_t sset;
+ char strbuf[ISC_STRERRORSIZE];
+
+ isc_g_appctx.common.impmagic = APPCTX_MAGIC;
+ isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC;
+ isc_g_appctx.common.methods = &appmethods.methods;
+ isc_g_appctx.mctx = NULL;
+ /* The remaining members will be initialized in ctxstart() */
+
+ result = isc__app_ctxstart((isc_appctx_t *)&isc_g_appctx);
if (result != ISC_R_SUCCESS)
return (result);
@@ -253,22 +380,20 @@ isc_app_start(void) {
}
#endif /* ISC_PLATFORM_USETHREADS */
- ISC_LIST_INIT(on_run);
-
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
void *arg)
{
isc_event_t *event;
isc_task_t *cloned_task = NULL;
isc_result_t result;
- LOCK(&lock);
+ LOCK(&isc_g_appctx.lock);
- if (running) {
+ if (isc_g_appctx.running) {
result = ISC_R_ALREADYRUNNING;
goto unlock;
}
@@ -285,24 +410,25 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
goto unlock;
}
- ISC_LIST_APPEND(on_run, event, ev_link);
+ ISC_LIST_APPEND(isc_g_appctx.on_run, event, ev_link);
result = ISC_R_SUCCESS;
unlock:
- UNLOCK(&lock);
+ UNLOCK(&isc_g_appctx.lock);
return (result);
}
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_THREADS_SINGLECTX
/*!
* Event loop for nonthreaded programs.
*/
static isc_result_t
-evloop(void) {
+evloop(isc__appctx_t *ctx) {
isc_result_t result;
- while (!want_shutdown) {
+
+ while (!ctx->want_shutdown) {
int n;
isc_time_t when, now;
struct timeval tv, *tvp;
@@ -310,14 +436,27 @@ evloop(void) {
isc_boolean_t readytasks;
isc_boolean_t call_timer_dispatch = ISC_FALSE;
- readytasks = isc__taskmgr_ready();
+ /*
+ * Check the reload (or suspend) case first for exiting the
+ * loop as fast as possible in case:
+ * - the direct call to isc__taskmgr_dispatch() in
+ * isc__app_ctxrun() completes all the tasks so far,
+ * - there is thus currently no active task, and
+ * - there is a timer event
+ */
+ if (ctx->want_reload) {
+ ctx->want_reload = ISC_FALSE;
+ return (ISC_R_RELOAD);
+ }
+
+ readytasks = isc__taskmgr_ready(ctx->taskmgr);
if (readytasks) {
tv.tv_sec = 0;
tv.tv_usec = 0;
tvp = &tv;
call_timer_dispatch = ISC_TRUE;
} else {
- result = isc__timermgr_nextevent(&when);
+ result = isc__timermgr_nextevent(ctx->timermgr, &when);
if (result != ISC_R_SUCCESS)
tvp = NULL;
else {
@@ -334,7 +473,7 @@ evloop(void) {
}
swait = NULL;
- n = isc__socketmgr_waitevents(tvp, &swait);
+ n = isc__socketmgr_waitevents(ctx->socketmgr, tvp, &swait);
if (n == 0 || call_timer_dispatch) {
/*
@@ -351,20 +490,17 @@ evloop(void) {
* call, since this loop only runs in the non-thread
* mode.
*/
- isc__timermgr_dispatch();
+ isc__timermgr_dispatch(ctx->timermgr);
}
if (n > 0)
- (void)isc__socketmgr_dispatch(swait);
- (void)isc__taskmgr_dispatch();
-
- if (want_reload) {
- want_reload = ISC_FALSE;
- return (ISC_R_RELOAD);
- }
+ (void)isc__socketmgr_dispatch(ctx->socketmgr, swait);
+ (void)isc__taskmgr_dispatch(ctx->taskmgr);
}
return (ISC_R_SUCCESS);
}
+#endif /* USE_THREADS_SINGLECTX */
+#ifndef ISC_PLATFORM_USETHREADS
/*
* This is a gross hack to support waiting for condition
* variables in nonthreaded programs in a limited way;
@@ -400,11 +536,11 @@ isc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp) {
INSIST(*mp == 1); /* Mutex must be locked on entry. */
--*mp;
- result = evloop();
+ result = evloop(&isc_g_appctx);
if (result == ISC_R_RELOAD)
- want_reload = ISC_TRUE;
+ isc_g_appctx.want_reload = ISC_TRUE;
if (signalled) {
- want_shutdown = ISC_FALSE;
+ isc_g_appctx.want_shutdown = ISC_FALSE;
signalled = ISC_FALSE;
}
@@ -420,43 +556,46 @@ isc__nothread_signal_hack(isc_condition_t *cp) {
INSIST(in_recursive_evloop);
- want_shutdown = ISC_TRUE;
+ isc_g_appctx.want_shutdown = ISC_TRUE;
signalled = ISC_TRUE;
return (ISC_R_SUCCESS);
}
#endif /* ISC_PLATFORM_USETHREADS */
-isc_result_t
-isc_app_run(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxrun(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
int result;
isc_event_t *event, *next_event;
isc_task_t *task;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_THREADS_SINGLECTX
sigset_t sset;
char strbuf[ISC_STRERRORSIZE];
#ifdef HAVE_SIGWAIT
int sig;
#endif
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_THREADS_SINGLECTX */
+
+ REQUIRE(VALID_APPCTX(ctx));
#ifdef HAVE_LINUXTHREADS
REQUIRE(main_thread == pthread_self());
#endif
- LOCK(&lock);
+ LOCK(&ctx->lock);
- if (!running) {
- running = ISC_TRUE;
+ if (!ctx->running) {
+ ctx->running = ISC_TRUE;
/*
* Post any on-run events (in FIFO order).
*/
- for (event = ISC_LIST_HEAD(on_run);
+ for (event = ISC_LIST_HEAD(ctx->on_run);
event != NULL;
event = next_event) {
next_event = ISC_LIST_NEXT(event, ev_link);
- ISC_LIST_UNLINK(on_run, event, ev_link);
+ ISC_LIST_UNLINK(ctx->on_run, event, ev_link);
task = event->ev_sender;
event->ev_sender = NULL;
isc_task_sendanddetach(&task, &event);
@@ -464,7 +603,7 @@ isc_app_run(void) {
}
- UNLOCK(&lock);
+ UNLOCK(&ctx->lock);
#ifndef HAVE_SIGWAIT
/*
@@ -473,19 +612,27 @@ isc_app_run(void) {
* We do this here to ensure that the signal handler is installed
* (i.e. that it wasn't a "one-shot" handler).
*/
- result = handle_signal(SIGHUP, reload_action);
- if (result != ISC_R_SUCCESS)
- return (ISC_R_SUCCESS);
+ if (ctx == &isc_g_appctx) {
+ result = handle_signal(SIGHUP, reload_action);
+ if (result != ISC_R_SUCCESS)
+ return (ISC_R_SUCCESS);
+ }
#endif
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_THREADS_SINGLECTX
+ /*
+ * When we are using multiple contexts, we don't rely on signals.
+ */
+ if (ctx != &isc_g_appctx)
+ return (ISC_R_SUCCESS);
+
/*
* There is no danger if isc_app_shutdown() is called before we wait
* for signals. Signals are blocked, so any such signal will simply
* be made pending and we will get it when we call sigwait().
*/
- while (!want_shutdown) {
+ while (!ctx->want_shutdown) {
#ifdef HAVE_SIGWAIT
/*
* Wait for SIGHUP, SIGINT, or SIGTERM.
@@ -503,21 +650,19 @@ isc_app_run(void) {
#ifndef HAVE_UNIXWARE_SIGWAIT
result = sigwait(&sset, &sig);
if (result == 0) {
- if (sig == SIGINT ||
- sig == SIGTERM)
- want_shutdown = ISC_TRUE;
+ if (sig == SIGINT || sig == SIGTERM)
+ ctx->want_shutdown = ISC_TRUE;
else if (sig == SIGHUP)
- want_reload = ISC_TRUE;
+ ctx->want_reload = ISC_TRUE;
}
#else /* Using UnixWare sigwait semantics. */
sig = sigwait(&sset);
if (sig >= 0) {
- if (sig == SIGINT ||
- sig == SIGTERM)
- want_shutdown = ISC_TRUE;
+ if (sig == SIGINT || sig == SIGTERM)
+ ctx->want_shutdown = ISC_TRUE;
else if (sig == SIGHUP)
- want_reload = ISC_TRUE;
+ ctx->want_reload = ISC_TRUE;
}
#endif /* HAVE_UNIXWARE_SIGWAIT */
@@ -528,131 +673,174 @@ isc_app_run(void) {
if (sigemptyset(&sset) != 0) {
isc__strerror(errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_run() sigsetops: %s", strbuf);
+ "isc_app_run() sigsetops: %s",
+ strbuf);
return (ISC_R_UNEXPECTED);
}
result = sigsuspend(&sset);
#endif /* HAVE_SIGWAIT */
- if (want_reload) {
- want_reload = ISC_FALSE;
+ if (ctx->want_reload) {
+ ctx->want_reload = ISC_FALSE;
return (ISC_R_RELOAD);
}
- if (want_shutdown && blocked)
+ if (ctx->want_shutdown && ctx->blocked)
exit(1);
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_THREADS_SINGLECTX */
- (void)isc__taskmgr_dispatch();
+ (void)isc__taskmgr_dispatch(ctx->taskmgr);
- result = evloop();
+ result = evloop(ctx);
if (result != ISC_R_SUCCESS)
return (result);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_THREADS_SINGLECTX */
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_shutdown(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_run() {
+ return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx));
+}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxshutdown(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE;
char strbuf[ISC_STRERRORSIZE];
- LOCK(&lock);
+ REQUIRE(VALID_APPCTX(ctx));
- REQUIRE(running);
+ LOCK(&ctx->lock);
- if (shutdown_requested)
+ REQUIRE(ctx->running);
+
+ if (ctx->shutdown_requested)
want_kill = ISC_FALSE;
else
- shutdown_requested = ISC_TRUE;
+ ctx->shutdown_requested = ISC_TRUE;
- UNLOCK(&lock);
+ UNLOCK(&ctx->lock);
if (want_kill) {
+ if (ctx != &isc_g_appctx)
+ ctx->want_shutdown = ISC_TRUE;
+ else {
#ifdef HAVE_LINUXTHREADS
- int result;
-
- result = pthread_kill(main_thread, SIGTERM);
- if (result != 0) {
- isc__strerror(result, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_shutdown() pthread_kill: %s",
- strbuf);
- return (ISC_R_UNEXPECTED);
- }
+ int result;
+
+ result = pthread_kill(main_thread, SIGTERM);
+ if (result != 0) {
+ isc__strerror(result, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_shutdown() "
+ "pthread_kill: %s",
+ strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
#else
- if (kill(getpid(), SIGTERM) < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_shutdown() kill: %s", strbuf);
- return (ISC_R_UNEXPECTED);
+ if (kill(getpid(), SIGTERM) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_shutdown() "
+ "kill: %s", strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
+#endif /* HAVE_LINUXTHREADS */
}
-#endif
}
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_app_reload(void) {
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_shutdown() {
+ return (isc__app_ctxshutdown((isc_appctx_t *)&isc_g_appctx));
+}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_ctxsuspend(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
isc_boolean_t want_kill = ISC_TRUE;
char strbuf[ISC_STRERRORSIZE];
- LOCK(&lock);
+ REQUIRE(VALID_APPCTX(ctx));
+
+ LOCK(&ctx->lock);
- REQUIRE(running);
+ REQUIRE(ctx->running);
/*
* Don't send the reload signal if we're shutting down.
*/
- if (shutdown_requested)
+ if (ctx->shutdown_requested)
want_kill = ISC_FALSE;
- UNLOCK(&lock);
+ UNLOCK(&ctx->lock);
if (want_kill) {
+ if (ctx != &isc_g_appctx)
+ ctx->want_reload = ISC_TRUE;
+ else {
#ifdef HAVE_LINUXTHREADS
- int result;
-
- result = pthread_kill(main_thread, SIGHUP);
- if (result != 0) {
- isc__strerror(result, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_reload() pthread_kill: %s",
- strbuf);
- return (ISC_R_UNEXPECTED);
- }
+ int result;
+
+ result = pthread_kill(main_thread, SIGHUP);
+ if (result != 0) {
+ isc__strerror(result, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_reload() "
+ "pthread_kill: %s",
+ strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
#else
- if (kill(getpid(), SIGHUP) < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_app_reload() kill: %s", strbuf);
- return (ISC_R_UNEXPECTED);
- }
+ if (kill(getpid(), SIGHUP) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "isc_app_reload() "
+ "kill: %s", strbuf);
+ return (ISC_R_UNEXPECTED);
+ }
#endif
+ }
}
return (ISC_R_SUCCESS);
}
-void
-isc_app_finish(void) {
- DESTROYLOCK(&lock);
+ISC_APPFUNC_SCOPE isc_result_t
+isc__app_reload(void) {
+ return (isc__app_ctxsuspend((isc_appctx_t *)&isc_g_appctx));
+}
+
+ISC_APPFUNC_SCOPE void
+isc__app_ctxfinish(isc_appctx_t *ctx0) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ DESTROYLOCK(&ctx->lock);
+}
+
+ISC_APPFUNC_SCOPE void
+isc__app_finish(void) {
+ isc__app_ctxfinish((isc_appctx_t *)&isc_g_appctx);
}
-void
-isc_app_block(void) {
+ISC_APPFUNC_SCOPE void
+isc__app_block(void) {
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset;
#endif /* ISC_PLATFORM_USETHREADS */
- REQUIRE(running);
- REQUIRE(!blocked);
+ REQUIRE(isc_g_appctx.running);
+ REQUIRE(!isc_g_appctx.blocked);
- blocked = ISC_TRUE;
+ isc_g_appctx.blocked = ISC_TRUE;
#ifdef ISC_PLATFORM_USETHREADS
blockedthread = pthread_self();
RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
@@ -662,16 +850,16 @@ isc_app_block(void) {
#endif /* ISC_PLATFORM_USETHREADS */
}
-void
-isc_app_unblock(void) {
+ISC_APPFUNC_SCOPE void
+isc__app_unblock(void) {
#ifdef ISC_PLATFORM_USETHREADS
sigset_t sset;
#endif /* ISC_PLATFORM_USETHREADS */
- REQUIRE(running);
- REQUIRE(blocked);
+ REQUIRE(isc_g_appctx.running);
+ REQUIRE(isc_g_appctx.blocked);
- blocked = ISC_FALSE;
+ isc_g_appctx.blocked = ISC_FALSE;
#ifdef ISC_PLATFORM_USETHREADS
REQUIRE(blockedthread == pthread_self());
@@ -682,3 +870,77 @@ isc_app_unblock(void) {
RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0);
#endif /* ISC_PLATFORM_USETHREADS */
}
+
+ISC_APPFUNC_SCOPE isc_result_t
+isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
+ isc__appctx_t *ctx;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(ctxp != NULL && *ctxp == NULL);
+
+ ctx = isc_mem_get(mctx, sizeof(*ctx));
+ if (ctx == NULL)
+ return (ISC_R_NOMEMORY);
+
+ ctx->common.impmagic = APPCTX_MAGIC;
+ ctx->common.magic = ISCAPI_APPCTX_MAGIC;
+ ctx->common.methods = &appmethods.methods;
+
+ ctx->mctx = NULL;
+ isc_mem_attach(mctx, &ctx->mctx);
+
+ ctx->taskmgr = NULL;
+ ctx->socketmgr = NULL;
+ ctx->timermgr = NULL;
+
+ *ctxp = (isc_appctx_t *)ctx;
+
+ return (ISC_R_SUCCESS);
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_destroy(isc_appctx_t **ctxp) {
+ isc__appctx_t *ctx;
+
+ REQUIRE(ctxp != NULL);
+ ctx = (isc__appctx_t *)*ctxp;
+ REQUIRE(VALID_APPCTX(ctx));
+
+ isc_mem_putanddetach(&ctx->mctx, ctx, sizeof(*ctx));
+
+ *ctxp = NULL;
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ ctx->taskmgr = taskmgr;
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ ctx->socketmgr = socketmgr;
+}
+
+ISC_APPFUNC_SCOPE void
+isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
+ isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
+
+ REQUIRE(VALID_APPCTX(ctx));
+
+ ctx->timermgr = timermgr;
+}
+
+#ifdef USE_APPIMPREGISTER
+isc_result_t
+isc__app_register() {
+ return (isc_app_register(isc__appctx_create));
+}
+#endif
diff --git a/contrib/bind9/lib/isc/unix/dir.c b/contrib/bind9/lib/isc/unix/dir.c
index 8053c42..0caf882 100644
--- a/contrib/bind9/lib/isc/unix/dir.c
+++ b/contrib/bind9/lib/isc/unix/dir.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dir.c,v 1.25.332.3 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: dir.c,v 1.29 2009-02-16 23:48:04 tbox Exp $ */
/*! \file
* \author Principal Authors: DCL */
diff --git a/contrib/bind9/lib/isc/unix/entropy.c b/contrib/bind9/lib/isc/unix/entropy.c
index bdff8d9..9044632 100644
--- a/contrib/bind9/lib/isc/unix/entropy.c
+++ b/contrib/bind9/lib/isc/unix/entropy.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.c,v 1.80.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: entropy.c,v 1.82 2008-12-01 23:47:45 tbox Exp $ */
/* \file unix/entropy.c
* \brief
diff --git a/contrib/bind9/lib/isc/unix/file.c b/contrib/bind9/lib/isc/unix/file.c
index ae737b8..25d856c 100644
--- a/contrib/bind9/lib/isc/unix/file.c
+++ b/contrib/bind9/lib/isc/unix/file.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -48,7 +48,7 @@
* SUCH DAMAGE.
*/
-/* $Id: file.c,v 1.51.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: file.c,v 1.57 2011-01-11 23:47:14 tbox Exp $ */
/*! \file */
@@ -68,6 +68,7 @@
#include <isc/dir.h>
#include <isc/file.h>
#include <isc/log.h>
+#include <isc/mem.h>
#include <isc/random.h>
#include <isc/string.h>
#include <isc/time.h>
@@ -242,16 +243,26 @@ isc_file_renameunique(const char *file, char *templet) {
return (ISC_R_SUCCESS);
}
-
isc_result_t
isc_file_openunique(char *templet, FILE **fp) {
+ int mode = S_IWUSR|S_IRUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
+ return (isc_file_openuniquemode(templet, mode, fp));
+}
+
+isc_result_t
+isc_file_openuniqueprivate(char *templet, FILE **fp) {
+ int mode = S_IWUSR|S_IRUSR;
+ return (isc_file_openuniquemode(templet, mode, fp));
+}
+
+isc_result_t
+isc_file_openuniquemode(char *templet, int mode, FILE **fp) {
int fd;
FILE *f;
isc_result_t result = ISC_R_SUCCESS;
char *x;
char *cp;
isc_uint32_t which;
- int mode;
REQUIRE(templet != NULL);
REQUIRE(fp != NULL && *fp == NULL);
@@ -269,7 +280,6 @@ isc_file_openunique(char *templet, FILE **fp) {
x = cp--;
}
- mode = S_IWUSR|S_IRUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
while ((fd = open(templet, O_RDWR|O_CREAT|O_EXCL, mode)) == -1) {
if (errno != EEXIST)
@@ -442,3 +452,73 @@ isc_file_truncate(const char *filename, isc_offset_t size) {
result = isc__errno2result(errno);
return (result);
}
+
+isc_result_t
+isc_file_safecreate(const char *filename, FILE **fp) {
+ isc_result_t result;
+ int flags;
+ struct stat sb;
+ FILE *f;
+ int fd;
+
+ REQUIRE(filename != NULL);
+ REQUIRE(fp != NULL && *fp == NULL);
+
+ result = file_stats(filename, &sb);
+ if (result == ISC_R_SUCCESS) {
+ if ((sb.st_mode & S_IFREG) == 0)
+ return (ISC_R_INVALIDFILE);
+ flags = O_WRONLY | O_TRUNC;
+ } else if (result == ISC_R_FILENOTFOUND) {
+ flags = O_WRONLY | O_CREAT | O_EXCL;
+ } else
+ return (result);
+
+ fd = open(filename, flags, S_IRUSR | S_IWUSR);
+ if (fd == -1)
+ return (isc__errno2result(errno));
+
+ f = fdopen(fd, "w");
+ if (f == NULL) {
+ result = isc__errno2result(errno);
+ close(fd);
+ return (result);
+ }
+
+ *fp = f;
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_file_splitpath(isc_mem_t *mctx, char *path, char **dirname, char **basename)
+{
+ char *dir, *file, *slash;
+
+ slash = strrchr(path, '/');
+
+ if (slash == path) {
+ file = ++slash;
+ dir = isc_mem_strdup(mctx, "/");
+ } else if (slash != NULL) {
+ file = ++slash;
+ dir = isc_mem_allocate(mctx, slash - path);
+ if (dir != NULL)
+ strlcpy(dir, path, slash - path);
+ } else {
+ file = path;
+ dir = isc_mem_strdup(mctx, ".");
+ }
+
+ if (dir == NULL)
+ return (ISC_R_NOMEMORY);
+
+ if (*file == '\0') {
+ isc_mem_free(mctx, dir);
+ return (ISC_R_INVALIDFILE);
+ }
+
+ *dirname = dir;
+ *basename = file;
+
+ return (ISC_R_SUCCESS);
+}
diff --git a/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c b/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
index 1e9c814..90a3faf 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_getifaddrs.c,v 1.11.120.2 2009-09-24 23:47:34 tbox Exp $ */
+/* $Id: ifiter_getifaddrs.c,v 1.13 2009-09-24 23:48:13 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/isc/unix/ifiter_ioctl.c b/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
index c004f61..010b365 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_ioctl.c,v 1.60.120.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: ifiter_ioctl.c,v 1.62 2009-01-18 23:48:14 tbox Exp $ */
/*! \file
* \brief
diff --git a/contrib/bind9/lib/isc/unix/include/isc/net.h b/contrib/bind9/lib/isc/unix/include/isc/net.h
index 5fad793..112f1d7 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/net.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/net.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: net.h,v 1.48.84.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: net.h,v 1.50 2008-12-01 04:14:54 marka Exp $ */
#ifndef ISC_NET_H
#define ISC_NET_H 1
diff --git a/contrib/bind9/lib/isc/unix/include/isc/offset.h b/contrib/bind9/lib/isc/unix/include/isc/offset.h
index 91f43c37..2920899 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/offset.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/offset.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: offset.h,v 1.15.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: offset.h,v 1.17 2008-12-01 23:47:45 tbox Exp $ */
#ifndef ISC_OFFSET_H
#define ISC_OFFSET_H 1
diff --git a/contrib/bind9/lib/isc/unix/include/isc/strerror.h b/contrib/bind9/lib/isc/unix/include/isc/strerror.h
index e094e96..ac8d496 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/strerror.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/strerror.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: strerror.h,v 1.8.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: strerror.h,v 1.10 2008-12-01 23:47:45 tbox Exp $ */
#ifndef ISC_STRERROR_H
#define ISC_STRERROR_H
diff --git a/contrib/bind9/lib/isc/unix/include/isc/time.h b/contrib/bind9/lib/isc/unix/include/isc/time.h
index 2149011..19f0810 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/time.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/time.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: time.h,v 1.38.56.2 2009-01-05 23:47:23 tbox Exp $ */
+/* $Id: time.h,v 1.40 2009-01-05 23:47:54 tbox Exp $ */
#ifndef ISC_TIME_H
#define ISC_TIME_H 1
diff --git a/contrib/bind9/lib/isc/unix/interfaceiter.c b/contrib/bind9/lib/isc/unix/interfaceiter.c
index 2d60a33..37fc3b1 100644
--- a/contrib/bind9/lib/isc/unix/interfaceiter.c
+++ b/contrib/bind9/lib/isc/unix/interfaceiter.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: interfaceiter.c,v 1.44.120.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: interfaceiter.c,v 1.45 2008-12-01 03:51:47 marka Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/unix/resource.c b/contrib/bind9/lib/isc/unix/resource.c
index 1061282..99a4b8c 100644
--- a/contrib/bind9/lib/isc/unix/resource.c
+++ b/contrib/bind9/lib/isc/unix/resource.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.c,v 1.21.66.2 2009-02-13 23:47:39 tbox Exp $ */
+/* $Id: resource.c,v 1.23 2009-02-13 23:48:14 tbox Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/socket.c b/contrib/bind9/lib/isc/unix/socket.c
index 055e883..ec7487e 100644
--- a/contrib/bind9/lib/isc/unix/socket.c
+++ b/contrib/bind9/lib/isc/unix/socket.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.c,v 1.308.12.17 2010-12-22 03:28:13 marka Exp $ */
+/* $Id: socket.c,v 1.333.14.2.2.1 2011-06-02 23:47:36 tbox Exp $ */
/*! \file */
@@ -76,9 +76,19 @@
#include "errno2result.h"
-#ifndef ISC_PLATFORM_USETHREADS
+/* See task.c about the following definition: */
+#ifdef BIND9
+#ifdef ISC_PLATFORM_USETHREADS
+#define USE_WATCHER_THREAD
+#else
+#define USE_SHARED_MANAGER
+#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* BIND9 */
+
+#ifndef USE_WATCHER_THREAD
#include "socket_p.h"
-#endif /* ISC_PLATFORM_USETHREADS */
+#include "../task_p.h"
+#endif /* USE_WATCHER_THREAD */
#if defined(SO_BSDCOMPAT) && defined(__linux__)
#include <sys/utsname.h>
@@ -101,7 +111,7 @@ typedef struct {
#define USE_SELECT
#endif /* ISC_PLATFORM_HAVEKQUEUE */
-#ifndef ISC_PLATFORM_USETHREADS
+#ifndef USE_WATCHER_THREAD
#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL)
struct isc_socketwait {
int nevents;
@@ -114,7 +124,7 @@ struct isc_socketwait {
int maxfd;
};
#endif /* USE_KQUEUE */
-#endif /* !ISC_PLATFORM_USETHREADS */
+#endif /* !USE_WATCHER_THREAD */
/*%
* Maximum number of allowable open sockets. This is also the maximum
@@ -248,7 +258,7 @@ typedef enum { poll_idle, poll_active, poll_checking } pollstate_t;
typedef isc_event_t intev_t;
#define SOCKET_MAGIC ISC_MAGIC('I', 'O', 'i', 'o')
-#define VALID_SOCKET(t) ISC_MAGIC_VALID(t, SOCKET_MAGIC)
+#define VALID_SOCKET(s) ISC_MAGIC_VALID(s, SOCKET_MAGIC)
/*!
* IPv6 control information. If the socket is an IPv6 socket we want
@@ -282,16 +292,21 @@ typedef isc_event_t intev_t;
*/
#define NRETRIES 10
-struct isc_socket {
+typedef struct isc__socket isc__socket_t;
+typedef struct isc__socketmgr isc__socketmgr_t;
+
+#define NEWCONNSOCK(ev) ((isc__socket_t *)(ev)->newsocket)
+
+struct isc__socket {
/* Not locked. */
- unsigned int magic;
- isc_socketmgr_t *manager;
+ isc_socket_t common;
+ isc__socketmgr_t *manager;
isc_mutex_t lock;
isc_sockettype_t type;
const isc_statscounter_t *statsindex;
/* Locked by socket lock. */
- ISC_LINK(isc_socket_t) link;
+ ISC_LINK(isc__socket_t) link;
unsigned int references;
int fd;
int pf;
@@ -339,9 +354,9 @@ struct isc_socket {
#define SOCKET_MANAGER_MAGIC ISC_MAGIC('I', 'O', 'm', 'g')
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, SOCKET_MANAGER_MAGIC)
-struct isc_socketmgr {
+struct isc__socketmgr {
/* Not locked. */
- unsigned int magic;
+ isc_socketmgr_t common;
isc_mem_t *mctx;
isc_mutex_t lock;
isc_mutex_t *fdlock;
@@ -370,14 +385,14 @@ struct isc_socketmgr {
#endif
/* Locked by fdlock. */
- isc_socket_t **fds;
+ isc__socket_t **fds;
int *fdstate;
#ifdef USE_DEVPOLL
pollinfo_t *fdpollinfo;
#endif
/* Locked by manager lock. */
- ISC_LIST(isc_socket_t) socklist;
+ ISC_LIST(isc__socket_t) socklist;
#ifdef USE_SELECT
fd_set *read_fds;
fd_set *read_fds_copy;
@@ -386,17 +401,18 @@ struct isc_socketmgr {
int maxfd;
#endif /* USE_SELECT */
int reserved; /* unlocked */
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_thread_t watcher;
isc_condition_t shutdown_ok;
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WATCHER_THREAD */
unsigned int refs;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
+ int maxudp;
};
-#ifndef ISC_PLATFORM_USETHREADS
-static isc_socketmgr_t *socketmgr = NULL;
-#endif /* ISC_PLATFORM_USETHREADS */
+#ifdef USE_SHARED_MANAGER
+static isc__socketmgr_t *socketmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
#define CLOSED 0 /* this one must be zero */
#define MANAGED 1
@@ -412,26 +428,165 @@ static isc_socketmgr_t *socketmgr = NULL;
# define MAXSCATTERGATHER_RECV (ISC_SOCKET_MAXSCATTERGATHER)
#endif
-static void send_recvdone_event(isc_socket_t *, isc_socketevent_t **);
-static void send_senddone_event(isc_socket_t *, isc_socketevent_t **);
-static void free_socket(isc_socket_t **);
-static isc_result_t allocate_socket(isc_socketmgr_t *, isc_sockettype_t,
- isc_socket_t **);
-static void destroy(isc_socket_t **);
+static void send_recvdone_event(isc__socket_t *, isc_socketevent_t **);
+static void send_senddone_event(isc__socket_t *, isc_socketevent_t **);
+static void free_socket(isc__socket_t **);
+static isc_result_t allocate_socket(isc__socketmgr_t *, isc_sockettype_t,
+ isc__socket_t **);
+static void destroy(isc__socket_t **);
static void internal_accept(isc_task_t *, isc_event_t *);
static void internal_connect(isc_task_t *, isc_event_t *);
static void internal_recv(isc_task_t *, isc_event_t *);
static void internal_send(isc_task_t *, isc_event_t *);
static void internal_fdwatch_write(isc_task_t *, isc_event_t *);
static void internal_fdwatch_read(isc_task_t *, isc_event_t *);
-static void process_cmsg(isc_socket_t *, struct msghdr *, isc_socketevent_t *);
-static void build_msghdr_send(isc_socket_t *, isc_socketevent_t *,
+static void process_cmsg(isc__socket_t *, struct msghdr *, isc_socketevent_t *);
+static void build_msghdr_send(isc__socket_t *, isc_socketevent_t *,
struct msghdr *, struct iovec *, size_t *);
-static void build_msghdr_recv(isc_socket_t *, isc_socketevent_t *,
+static void build_msghdr_recv(isc__socket_t *, isc_socketevent_t *,
struct msghdr *, struct iovec *, size_t *);
-#ifdef ISC_PLATFORM_USETHREADS
-static isc_boolean_t process_ctlfd(isc_socketmgr_t *manager);
+#ifdef USE_WATCHER_THREAD
+static isc_boolean_t process_ctlfd(isc__socketmgr_t *manager);
+#endif
+
+/*%
+ * The following can be either static or public, depending on build environment.
+ */
+
+#ifdef BIND9
+#define ISC_SOCKETFUNC_SCOPE
+#else
+#define ISC_SOCKETFUNC_SCOPE static
+#endif
+
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
+ isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_attach(isc_socket_t *sock, isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_detach(isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
+ unsigned int maxsocks);
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_destroy(isc_socketmgr_t **managerp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv(isc_socket_t *sock, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv2(isc_socket_t *sock, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_socketevent_t *event, unsigned int flags);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_send(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto2(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
+ isc_socketevent_t *event, unsigned int flags);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
+ isc_uint32_t owner, isc_uint32_t group);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
+ unsigned int options);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_filter(isc_socket_t *sock, const char *filter);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_listen(isc_socket_t *sock, unsigned int backlog);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_accept(isc_socket_t *sock,
+ isc_task_t *task, isc_taskaction_t action, const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
+ isc_task_t *task, isc_taskaction_t action,
+ const void *arg);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how);
+ISC_SOCKETFUNC_SCOPE isc_sockettype_t
+isc__socket_gettype(isc_socket_t *sock);
+ISC_SOCKETFUNC_SCOPE isc_boolean_t
+isc__socket_isbound(isc_socket_t *sock);
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes);
+#if defined(HAVE_LIBXML2) && defined(BIND9)
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer);
+#endif
+
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
+ isc_sockfdwatch_t callback, void *cbarg,
+ isc_task_t *task, isc_socket_t **socketp);
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchpoke(isc_socket_t *sock, int flags);
+
+static struct {
+ isc_socketmethods_t methods;
+
+ /*%
+ * The following are defined just for avoiding unused static functions.
+ */
+#ifndef BIND9
+ void *recvv, *send, *sendv, *sendto2, *cleanunix, *permunix, *filter,
+ *listen, *accept, *getpeername, *isbound;
+#endif
+} socketmethods = {
+ {
+ isc__socket_attach,
+ isc__socket_detach,
+ isc__socket_bind,
+ isc__socket_sendto,
+ isc__socket_connect,
+ isc__socket_recv,
+ isc__socket_cancel,
+ isc__socket_getsockname,
+ isc__socket_gettype,
+ isc__socket_ipv6only,
+ isc__socket_fdwatchpoke
+ }
+#ifndef BIND9
+ ,
+ (void *)isc__socket_recvv, (void *)isc__socket_send,
+ (void *)isc__socket_sendv, (void *)isc__socket_sendto2,
+ (void *)isc__socket_cleanunix, (void *)isc__socket_permunix,
+ (void *)isc__socket_filter, (void *)isc__socket_listen,
+ (void *)isc__socket_accept, (void *)isc__socket_getpeername,
+ (void *)isc__socket_isbound
#endif
+};
+
+static isc_socketmgrmethods_t socketmgrmethods = {
+ isc__socketmgr_destroy,
+ isc__socket_create,
+ isc__socket_fdwatchcreate
+};
#define SELECT_POKE_SHUTDOWN (-1)
#define SELECT_POKE_NOTHING (-2)
@@ -531,12 +686,14 @@ static const isc_statscounter_t fdwatchstatsindex[] = {
isc_sockstatscounter_fdwatchrecvfail
};
+#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL) || \
+ defined(USE_WATCHER_THREAD)
static void
-manager_log(isc_socketmgr_t *sockmgr,
+manager_log(isc__socketmgr_t *sockmgr,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
const char *fmt, ...) ISC_FORMAT_PRINTF(5, 6);
static void
-manager_log(isc_socketmgr_t *sockmgr,
+manager_log(isc__socketmgr_t *sockmgr,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
const char *fmt, ...)
{
@@ -553,14 +710,15 @@ manager_log(isc_socketmgr_t *sockmgr,
isc_log_write(isc_lctx, category, module, level,
"sockmgr %p: %s", sockmgr, msgbuf);
}
+#endif
static void
-socket_log(isc_socket_t *sock, isc_sockaddr_t *address,
+socket_log(isc__socket_t *sock, isc_sockaddr_t *address,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
isc_msgcat_t *msgcat, int msgset, int message,
const char *fmt, ...) ISC_FORMAT_PRINTF(9, 10);
static void
-socket_log(isc_socket_t *sock, isc_sockaddr_t *address,
+socket_log(isc__socket_t *sock, isc_sockaddr_t *address,
isc_logcategory_t *category, isc_logmodule_t *module, int level,
isc_msgcat_t *msgcat, int msgset, int message,
const char *fmt, ...)
@@ -595,7 +753,7 @@ socket_log(isc_socket_t *sock, isc_sockaddr_t *address,
* setting IPV6_V6ONLY.
*/
static void
-FIX_IPV6_RECVPKTINFO(isc_socket_t *sock)
+FIX_IPV6_RECVPKTINFO(isc__socket_t *sock)
{
char strbuf[ISC_STRERRORSIZE];
int on = 1;
@@ -632,7 +790,7 @@ inc_stats(isc_stats_t *stats, isc_statscounter_t counterid) {
}
static inline isc_result_t
-watch_fd(isc_socketmgr_t *manager, int fd, int msg) {
+watch_fd(isc__socketmgr_t *manager, int fd, int msg) {
isc_result_t result = ISC_R_SUCCESS;
#ifdef USE_KQUEUE
@@ -700,7 +858,7 @@ watch_fd(isc_socketmgr_t *manager, int fd, int msg) {
}
static inline isc_result_t
-unwatch_fd(isc_socketmgr_t *manager, int fd, int msg) {
+unwatch_fd(isc__socketmgr_t *manager, int fd, int msg) {
isc_result_t result = ISC_R_SUCCESS;
#ifdef USE_KQUEUE
@@ -787,7 +945,7 @@ unwatch_fd(isc_socketmgr_t *manager, int fd, int msg) {
}
static void
-wakeup_socket(isc_socketmgr_t *manager, int fd, int msg) {
+wakeup_socket(isc__socketmgr_t *manager, int fd, int msg) {
isc_result_t result;
int lockid = FDLOCK_ID(fd);
@@ -848,14 +1006,14 @@ wakeup_socket(isc_socketmgr_t *manager, int fd, int msg) {
}
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
/*
* Poke the select loop when there is something for us to do.
* The write is required (by POSIX) to complete. That is, we
* will not get partial writes.
*/
static void
-select_poke(isc_socketmgr_t *mgr, int fd, int msg) {
+select_poke(isc__socketmgr_t *mgr, int fd, int msg) {
int cc;
int buf[2];
char strbuf[ISC_STRERRORSIZE];
@@ -894,7 +1052,7 @@ select_poke(isc_socketmgr_t *mgr, int fd, int msg) {
* Read a message on the internal fd.
*/
static void
-select_readmsg(isc_socketmgr_t *mgr, int *fd, int *msg) {
+select_readmsg(isc__socketmgr_t *mgr, int *fd, int *msg) {
int buf[2];
int cc;
char strbuf[ISC_STRERRORSIZE];
@@ -921,19 +1079,19 @@ select_readmsg(isc_socketmgr_t *mgr, int *fd, int *msg) {
*fd = buf[0];
*msg = buf[1];
}
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WATCHER_THREAD */
/*
* Update the state of the socketmgr when something changes.
*/
static void
-select_poke(isc_socketmgr_t *manager, int fd, int msg) {
+select_poke(isc__socketmgr_t *manager, int fd, int msg) {
if (msg == SELECT_POKE_SHUTDOWN)
return;
else if (fd >= 0)
wakeup_socket(manager, fd, msg);
return;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
/*
* Make a fd non-blocking.
@@ -1026,7 +1184,7 @@ cmsg_space(ISC_SOCKADDR_LEN_T len) {
* Process control messages received on a socket.
*/
static void
-process_cmsg(isc_socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
+process_cmsg(isc__socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
#ifdef USE_CMSG
struct cmsghdr *cmsgp;
#ifdef ISC_PLATFORM_HAVEIN6PKTINFO
@@ -1129,7 +1287,7 @@ process_cmsg(isc_socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
* this transaction can send.
*/
static void
-build_msghdr_send(isc_socket_t *sock, isc_socketevent_t *dev,
+build_msghdr_send(isc__socket_t *sock, isc_socketevent_t *dev,
struct msghdr *msg, struct iovec *iov, size_t *write_countp)
{
unsigned int iovcount;
@@ -1248,7 +1406,7 @@ build_msghdr_send(isc_socket_t *sock, isc_socketevent_t *dev,
* this transaction can receive.
*/
static void
-build_msghdr_recv(isc_socket_t *sock, isc_socketevent_t *dev,
+build_msghdr_recv(isc__socket_t *sock, isc_socketevent_t *dev,
struct msghdr *msg, struct iovec *iov, size_t *read_countp)
{
unsigned int iovcount;
@@ -1369,7 +1527,7 @@ build_msghdr_recv(isc_socket_t *sock, isc_socketevent_t *dev,
}
static void
-set_dev_address(isc_sockaddr_t *address, isc_socket_t *sock,
+set_dev_address(isc_sockaddr_t *address, isc__socket_t *sock,
isc_socketevent_t *dev)
{
if (sock->type == isc_sockettype_udp) {
@@ -1393,7 +1551,7 @@ destroy_socketevent(isc_event_t *event) {
}
static isc_socketevent_t *
-allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
+allocate_socketevent(isc__socket_t *sock, isc_eventtype_t eventtype,
isc_taskaction_t action, const void *arg)
{
isc_socketevent_t *ev;
@@ -1446,7 +1604,7 @@ dump_msg(struct msghdr *msg) {
#define DOIO_EOF 3 /* EOF, no event sent */
static int
-doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) {
+doio_recv(isc__socket_t *sock, isc_socketevent_t *dev) {
int cc;
struct iovec iov[MAXSCATTERGATHER_RECV];
size_t read_count;
@@ -1554,6 +1712,12 @@ doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) {
}
return (DOIO_SOFT);
}
+ /*
+ * Simulate a firewall blocking UDP responses bigger than
+ * 512 bytes.
+ */
+ if (sock->manager->maxudp != 0 && cc > sock->manager->maxudp)
+ return (DOIO_SOFT);
}
socket_log(sock, &dev->address, IOEVENT,
@@ -1630,7 +1794,7 @@ doio_recv(isc_socket_t *sock, isc_socketevent_t *dev) {
* No other return values are possible.
*/
static int
-doio_send(isc_socket_t *sock, isc_socketevent_t *dev) {
+doio_send(isc__socket_t *sock, isc_socketevent_t *dev) {
int cc;
struct iovec iov[MAXSCATTERGATHER_SEND];
size_t write_count;
@@ -1741,7 +1905,7 @@ doio_send(isc_socket_t *sock, isc_socketevent_t *dev) {
* references exist.
*/
static void
-closesocket(isc_socketmgr_t *manager, isc_socket_t *sock, int fd) {
+closesocket(isc__socketmgr_t *manager, isc__socket_t *sock, int fd) {
isc_sockettype_t type = sock->type;
int lockid = FDLOCK_ID(fd);
@@ -1804,10 +1968,10 @@ closesocket(isc_socketmgr_t *manager, isc_socket_t *sock, int fd) {
}
static void
-destroy(isc_socket_t **sockp) {
+destroy(isc__socket_t **sockp) {
int fd;
- isc_socket_t *sock = *sockp;
- isc_socketmgr_t *manager = sock->manager;
+ isc__socket_t *sock = *sockp;
+ isc__socketmgr_t *manager = sock->manager;
socket_log(sock, NULL, CREATION, isc_msgcat, ISC_MSGSET_SOCKET,
ISC_MSG_DESTROYING, "destroying");
@@ -1828,10 +1992,10 @@ destroy(isc_socket_t **sockp) {
ISC_LIST_UNLINK(manager->socklist, sock, link);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (ISC_LIST_EMPTY(manager->socklist))
SIGNAL(&manager->shutdown_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
UNLOCK(&manager->lock);
@@ -1839,10 +2003,10 @@ destroy(isc_socket_t **sockp) {
}
static isc_result_t
-allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
- isc_socket_t **socketp)
+allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type,
+ isc__socket_t **socketp)
{
- isc_socket_t *sock;
+ isc__socket_t *sock;
isc_result_t result;
ISC_SOCKADDR_LEN_T cmsgbuflen;
@@ -1853,7 +2017,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
result = ISC_R_UNEXPECTED;
- sock->magic = 0;
+ sock->common.magic = 0;
+ sock->common.impmagic = 0;
sock->references = 0;
sock->manager = manager;
@@ -1917,7 +2082,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
*/
result = isc_mutex_init(&sock->lock);
if (result != ISC_R_SUCCESS) {
- sock->magic = 0;
+ sock->common.magic = 0;
+ sock->common.impmagic = 0;
goto error;
}
@@ -1931,7 +2097,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
ISC_EVENTATTR_NOPURGE, NULL, ISC_SOCKEVENT_INTW,
NULL, sock, sock, NULL, NULL);
- sock->magic = SOCKET_MAGIC;
+ sock->common.magic = ISCAPI_SOCKET_MAGIC;
+ sock->common.impmagic = SOCKET_MAGIC;
*socketp = sock;
return (ISC_R_SUCCESS);
@@ -1956,8 +2123,8 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
* also close the socket.
*/
static void
-free_socket(isc_socket_t **socketp) {
- isc_socket_t *sock = *socketp;
+free_socket(isc__socket_t **socketp) {
+ isc__socket_t *sock = *socketp;
INSIST(sock->references == 0);
INSIST(VALID_SOCKET(sock));
@@ -1977,7 +2144,8 @@ free_socket(isc_socket_t **socketp) {
isc_mem_put(sock->manager->mctx, sock->sendcmsgbuf,
sock->sendcmsgbuflen);
- sock->magic = 0;
+ sock->common.magic = 0;
+ sock->common.impmagic = 0;
DESTROYLOCK(&sock->lock);
@@ -2025,7 +2193,7 @@ clear_bsdcompat(void) {
#endif
static isc_result_t
-opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) {
+opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) {
char strbuf[ISC_STRERRORSIZE];
const char *err = "socket";
int tries = 0;
@@ -2316,11 +2484,12 @@ opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) {
* called with 'arg' as the arg value. The new socket is returned
* in 'socketp'.
*/
-isc_result_t
-isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
- isc_socket_t **socketp)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_create(isc_socketmgr_t *manager0, int pf, isc_sockettype_t type,
+ isc_socket_t **socketp)
{
- isc_socket_t *sock = NULL;
+ isc__socket_t *sock = NULL;
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
isc_result_t result;
int lockid;
@@ -2356,8 +2525,9 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
return (result);
}
+ sock->common.methods = (isc_socketmethods_t *)&socketmethods;
sock->references = 1;
- *socketp = sock;
+ *socketp = (isc_socket_t *)sock;
/*
* Note we don't have to lock the socket like we normally would because
@@ -2388,9 +2558,11 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_socket_open(isc_socket_t *sock) {
+#ifdef BIND9
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_open(isc_socket_t *sock0) {
isc_result_t result;
+ isc__socket_t *sock = (isc__socket_t *)sock0;
REQUIRE(VALID_SOCKET(sock));
@@ -2430,6 +2602,7 @@ isc_socket_open(isc_socket_t *sock) {
return (result);
}
+#endif /* BIND9 */
/*
* Create a new 'type' socket managed by 'manager'. Events
@@ -2437,12 +2610,13 @@ isc_socket_open(isc_socket_t *sock) {
* called with 'arg' as the arg value. The new socket is returned
* in 'socketp'.
*/
-isc_result_t
-isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
- isc_sockfdwatch_t callback, void *cbarg,
- isc_task_t *task, isc_socket_t **socketp)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchcreate(isc_socketmgr_t *manager0, int fd, int flags,
+ isc_sockfdwatch_t callback, void *cbarg,
+ isc_task_t *task, isc_socket_t **socketp)
{
- isc_socket_t *sock = NULL;
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+ isc__socket_t *sock = NULL;
isc_result_t result;
int lockid;
@@ -2460,8 +2634,9 @@ isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
sock->fdwatchtask = task;
sock->statsindex = fdwatchstatsindex;
+ sock->common.methods = (isc_socketmethods_t *)&socketmethods;
sock->references = 1;
- *socketp = sock;
+ *socketp = (isc_socket_t *)sock;
/*
* Note we don't have to lock the socket like we normally would because
@@ -2494,10 +2669,50 @@ isc_socket_fdwatchcreate(isc_socketmgr_t *manager, int fd, int flags,
}
/*
+ * Indicate to the manager that it should watch the socket again.
+ * This can be used to restart watching if the previous event handler
+ * didn't indicate there was more data to be processed. Primarily
+ * it is for writing but could be used for reading if desired
+ */
+
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_fdwatchpoke(isc_socket_t *sock0, int flags)
+{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
+ REQUIRE(VALID_SOCKET(sock));
+
+ /*
+ * We check both flags first to allow us to get the lock
+ * once but only if we need it.
+ */
+
+ if ((flags & (ISC_SOCKFDWATCH_READ | ISC_SOCKFDWATCH_WRITE)) != 0) {
+ LOCK(&sock->lock);
+ if (((flags & ISC_SOCKFDWATCH_READ) != 0) &&
+ !sock->pending_recv)
+ select_poke(sock->manager, sock->fd,
+ SELECT_POKE_READ);
+ if (((flags & ISC_SOCKFDWATCH_WRITE) != 0) &&
+ !sock->pending_send)
+ select_poke(sock->manager, sock->fd,
+ SELECT_POKE_WRITE);
+ UNLOCK(&sock->lock);
+ }
+
+ socket_log(sock, NULL, TRACE, isc_msgcat, ISC_MSGSET_SOCKET,
+ ISC_MSG_POKED, "fdwatch-poked flags: %d", flags);
+
+ return (ISC_R_SUCCESS);
+}
+
+/*
* Attach to a socket. Caller must explicitly detach when it is done.
*/
-void
-isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_attach(isc_socket_t *sock0, isc_socket_t **socketp) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
REQUIRE(VALID_SOCKET(sock));
REQUIRE(socketp != NULL && *socketp == NULL);
@@ -2505,20 +2720,20 @@ isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp) {
sock->references++;
UNLOCK(&sock->lock);
- *socketp = sock;
+ *socketp = (isc_socket_t *)sock;
}
/*
* Dereference a socket. If this is the last reference to it, clean things
* up by destroying the socket.
*/
-void
-isc_socket_detach(isc_socket_t **socketp) {
- isc_socket_t *sock;
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_detach(isc_socket_t **socketp) {
+ isc__socket_t *sock;
isc_boolean_t kill_socket = ISC_FALSE;
REQUIRE(socketp != NULL);
- sock = *socketp;
+ sock = (isc__socket_t *)*socketp;
REQUIRE(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -2534,10 +2749,12 @@ isc_socket_detach(isc_socket_t **socketp) {
*socketp = NULL;
}
-isc_result_t
-isc_socket_close(isc_socket_t *sock) {
+#ifdef BIND9
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_close(isc_socket_t *sock0) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
int fd;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
isc_sockettype_t type;
REQUIRE(VALID_SOCKET(sock));
@@ -2575,6 +2792,7 @@ isc_socket_close(isc_socket_t *sock) {
return (ISC_R_SUCCESS);
}
+#endif /* BIND9 */
/*
* I/O is possible on a given socket. Schedule an event to this task that
@@ -2585,7 +2803,7 @@ isc_socket_close(isc_socket_t *sock) {
* The socket and manager must be locked before calling this function.
*/
static void
-dispatch_recv(isc_socket_t *sock) {
+dispatch_recv(isc__socket_t *sock) {
intev_t *iev;
isc_socketevent_t *ev;
isc_task_t *sender;
@@ -2619,7 +2837,7 @@ dispatch_recv(isc_socket_t *sock) {
}
static void
-dispatch_send(isc_socket_t *sock) {
+dispatch_send(isc__socket_t *sock) {
intev_t *iev;
isc_socketevent_t *ev;
isc_task_t *sender;
@@ -2656,7 +2874,7 @@ dispatch_send(isc_socket_t *sock) {
* Dispatch an internal accept event.
*/
static void
-dispatch_accept(isc_socket_t *sock) {
+dispatch_accept(isc__socket_t *sock) {
intev_t *iev;
isc_socket_newconnev_t *ev;
@@ -2682,7 +2900,7 @@ dispatch_accept(isc_socket_t *sock) {
}
static void
-dispatch_connect(isc_socket_t *sock) {
+dispatch_connect(isc__socket_t *sock) {
intev_t *iev;
isc_socket_connev_t *ev;
@@ -2712,7 +2930,7 @@ dispatch_connect(isc_socket_t *sock) {
* Caller must have the socket locked if the event is attached to the socket.
*/
static void
-send_recvdone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
+send_recvdone_event(isc__socket_t *sock, isc_socketevent_t **dev) {
isc_task_t *task;
task = (*dev)->ev_sender;
@@ -2735,7 +2953,7 @@ send_recvdone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
* Caller must have the socket locked if the event is attached to the socket.
*/
static void
-send_senddone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
+send_senddone_event(isc__socket_t *sock, isc_socketevent_t **dev) {
isc_task_t *task;
INSIST(dev != NULL && *dev != NULL);
@@ -2766,8 +2984,8 @@ send_senddone_event(isc_socket_t *sock, isc_socketevent_t **dev) {
*/
static void
internal_accept(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
- isc_socketmgr_t *manager;
+ isc__socket_t *sock;
+ isc__socketmgr_t *manager;
isc_socket_newconnev_t *dev;
isc_task_t *task;
ISC_SOCKADDR_LEN_T addrlen;
@@ -2822,9 +3040,9 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
* daemons such as BIND 8 and Apache.
*/
- addrlen = sizeof(dev->newsocket->peer_address.type);
- memset(&dev->newsocket->peer_address.type, 0, addrlen);
- fd = accept(sock->fd, &dev->newsocket->peer_address.type.sa,
+ addrlen = sizeof(NEWCONNSOCK(dev)->peer_address.type);
+ memset(&NEWCONNSOCK(dev)->peer_address.type, 0, addrlen);
+ fd = accept(sock->fd, &NEWCONNSOCK(dev)->peer_address.type.sa,
(void *)&addrlen);
#ifdef F_DUPFD
@@ -2894,14 +3112,14 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
(void)close(fd);
goto soft_error;
- } else if (dev->newsocket->peer_address.type.sa.sa_family !=
+ } else if (NEWCONNSOCK(dev)->peer_address.type.sa.sa_family !=
sock->pf)
{
UNEXPECTED_ERROR(__FILE__, __LINE__,
"internal_accept(): "
"accept() returned peer address "
"family %u (expected %u)",
- dev->newsocket->peer_address.
+ NEWCONNSOCK(dev)->peer_address.
type.sa.sa_family,
sock->pf);
(void)close(fd);
@@ -2920,8 +3138,8 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
}
if (fd != -1) {
- dev->newsocket->peer_address.length = addrlen;
- dev->newsocket->pf = sock->pf;
+ NEWCONNSOCK(dev)->peer_address.length = addrlen;
+ NEWCONNSOCK(dev)->pf = sock->pf;
}
/*
@@ -2950,28 +3168,28 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
int lockid = FDLOCK_ID(fd);
LOCK(&manager->fdlock[lockid]);
- manager->fds[fd] = dev->newsocket;
+ manager->fds[fd] = NEWCONNSOCK(dev);
manager->fdstate[fd] = MANAGED;
UNLOCK(&manager->fdlock[lockid]);
LOCK(&manager->lock);
- ISC_LIST_APPEND(manager->socklist, dev->newsocket, link);
+ ISC_LIST_APPEND(manager->socklist, NEWCONNSOCK(dev), link);
- dev->newsocket->fd = fd;
- dev->newsocket->bound = 1;
- dev->newsocket->connected = 1;
+ NEWCONNSOCK(dev)->fd = fd;
+ NEWCONNSOCK(dev)->bound = 1;
+ NEWCONNSOCK(dev)->connected = 1;
/*
* Save away the remote address
*/
- dev->address = dev->newsocket->peer_address;
+ dev->address = NEWCONNSOCK(dev)->peer_address;
#ifdef USE_SELECT
if (manager->maxfd < fd)
manager->maxfd = fd;
#endif
- socket_log(sock, &dev->newsocket->peer_address, CREATION,
+ socket_log(sock, &NEWCONNSOCK(dev)->peer_address, CREATION,
isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_ACCEPTEDCXN,
"accepted connection, new socket %p",
dev->newsocket);
@@ -2981,8 +3199,8 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
inc_stats(manager->stats, sock->statsindex[STATID_ACCEPT]);
} else {
inc_stats(manager->stats, sock->statsindex[STATID_ACCEPTFAIL]);
- dev->newsocket->references--;
- free_socket(&dev->newsocket);
+ NEWCONNSOCK(dev)->references--;
+ free_socket((isc__socket_t **)&dev->newsocket);
}
/*
@@ -3006,7 +3224,7 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
static void
internal_recv(isc_task_t *me, isc_event_t *ev) {
isc_socketevent_t *dev;
- isc_socket_t *sock;
+ isc__socket_t *sock;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTR);
@@ -3071,14 +3289,14 @@ internal_recv(isc_task_t *me, isc_event_t *ev) {
static void
internal_send(isc_task_t *me, isc_event_t *ev) {
isc_socketevent_t *dev;
- isc_socket_t *sock;
+ isc__socket_t *sock;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTW);
/*
* Find out what socket this is and lock it.
*/
- sock = (isc_socket_t *)ev->ev_sender;
+ sock = (isc__socket_t *)ev->ev_sender;
INSIST(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -3125,7 +3343,7 @@ internal_send(isc_task_t *me, isc_event_t *ev) {
static void
internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
+ isc__socket_t *sock;
int more_data;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTW);
@@ -3133,7 +3351,7 @@ internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
/*
* Find out what socket this is and lock it.
*/
- sock = (isc_socket_t *)ev->ev_sender;
+ sock = (isc__socket_t *)ev->ev_sender;
INSIST(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -3144,7 +3362,8 @@ internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
INSIST(sock->pending_send == 1);
UNLOCK(&sock->lock);
- more_data = (sock->fdwatchcb)(me, sock, sock->fdwatcharg);
+ more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock,
+ sock->fdwatcharg, ISC_SOCKFDWATCH_WRITE);
LOCK(&sock->lock);
sock->pending_send = 0;
@@ -3165,7 +3384,7 @@ internal_fdwatch_write(isc_task_t *me, isc_event_t *ev) {
static void
internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
+ isc__socket_t *sock;
int more_data;
INSIST(ev->ev_type == ISC_SOCKEVENT_INTR);
@@ -3173,7 +3392,7 @@ internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
/*
* Find out what socket this is and lock it.
*/
- sock = (isc_socket_t *)ev->ev_sender;
+ sock = (isc__socket_t *)ev->ev_sender;
INSIST(VALID_SOCKET(sock));
LOCK(&sock->lock);
@@ -3184,7 +3403,8 @@ internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
INSIST(sock->pending_recv == 1);
UNLOCK(&sock->lock);
- more_data = (sock->fdwatchcb)(me, sock, sock->fdwatcharg);
+ more_data = (sock->fdwatchcb)(me, (isc_socket_t *)sock,
+ sock->fdwatcharg, ISC_SOCKFDWATCH_READ);
LOCK(&sock->lock);
sock->pending_recv = 0;
@@ -3208,10 +3428,10 @@ internal_fdwatch_read(isc_task_t *me, isc_event_t *ev) {
* and unlocking twice if both reads and writes are possible.
*/
static void
-process_fd(isc_socketmgr_t *manager, int fd, isc_boolean_t readable,
+process_fd(isc__socketmgr_t *manager, int fd, isc_boolean_t readable,
isc_boolean_t writeable)
{
- isc_socket_t *sock;
+ isc__socket_t *sock;
isc_boolean_t unlock_sock;
isc_boolean_t unwatch_read = ISC_FALSE, unwatch_write = ISC_FALSE;
int lockid = FDLOCK_ID(fd);
@@ -3277,11 +3497,11 @@ check_write:
#ifdef USE_KQUEUE
static isc_boolean_t
-process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
+process_fds(isc__socketmgr_t *manager, struct kevent *events, int nevents) {
int i;
isc_boolean_t readable, writable;
isc_boolean_t done = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_boolean_t have_ctlevent = ISC_FALSE;
#endif
@@ -3299,7 +3519,7 @@ process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
for (i = 0; i < nevents; i++) {
REQUIRE(events[i].ident < manager->maxsocks);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (events[i].ident == (uintptr_t)manager->pipe_fds[0]) {
have_ctlevent = ISC_TRUE;
continue;
@@ -3310,7 +3530,7 @@ process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
process_fd(manager, events[i].ident, readable, writable);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (have_ctlevent)
done = process_ctlfd(manager);
#endif
@@ -3319,10 +3539,11 @@ process_fds(isc_socketmgr_t *manager, struct kevent *events, int nevents) {
}
#elif defined(USE_EPOLL)
static isc_boolean_t
-process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
+process_fds(isc__socketmgr_t *manager, struct epoll_event *events, int nevents)
+{
int i;
isc_boolean_t done = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_boolean_t have_ctlevent = ISC_FALSE;
#endif
@@ -3335,7 +3556,7 @@ process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
for (i = 0; i < nevents; i++) {
REQUIRE(events[i].data.fd < (int)manager->maxsocks);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (events[i].data.fd == manager->pipe_fds[0]) {
have_ctlevent = ISC_TRUE;
continue;
@@ -3357,7 +3578,7 @@ process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
(events[i].events & EPOLLOUT) != 0);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (have_ctlevent)
done = process_ctlfd(manager);
#endif
@@ -3366,10 +3587,10 @@ process_fds(isc_socketmgr_t *manager, struct epoll_event *events, int nevents) {
}
#elif defined(USE_DEVPOLL)
static isc_boolean_t
-process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
+process_fds(isc__socketmgr_t *manager, struct pollfd *events, int nevents) {
int i;
isc_boolean_t done = ISC_FALSE;
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
isc_boolean_t have_ctlevent = ISC_FALSE;
#endif
@@ -3382,7 +3603,7 @@ process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
for (i = 0; i < nevents; i++) {
REQUIRE(events[i].fd < (int)manager->maxsocks);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (events[i].fd == manager->pipe_fds[0]) {
have_ctlevent = ISC_TRUE;
continue;
@@ -3393,7 +3614,7 @@ process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
(events[i].events & POLLOUT) != 0);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (have_ctlevent)
done = process_ctlfd(manager);
#endif
@@ -3402,27 +3623,27 @@ process_fds(isc_socketmgr_t *manager, struct pollfd *events, int nevents) {
}
#elif defined(USE_SELECT)
static void
-process_fds(isc_socketmgr_t *manager, int maxfd,
- fd_set *readfds, fd_set *writefds)
+process_fds(isc__socketmgr_t *manager, int maxfd, fd_set *readfds,
+ fd_set *writefds)
{
int i;
REQUIRE(maxfd <= (int)manager->maxsocks);
for (i = 0; i < maxfd; i++) {
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (i == manager->pipe_fds[0] || i == manager->pipe_fds[1])
continue;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
process_fd(manager, i, FD_ISSET(i, readfds),
FD_ISSET(i, writefds));
}
}
#endif
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
static isc_boolean_t
-process_ctlfd(isc_socketmgr_t *manager) {
+process_ctlfd(isc__socketmgr_t *manager) {
int msg, fd;
for (;;) {
@@ -3470,7 +3691,7 @@ process_ctlfd(isc_socketmgr_t *manager) {
*/
static isc_threadresult_t
watcher(void *uap) {
- isc_socketmgr_t *manager = uap;
+ isc__socketmgr_t *manager = uap;
isc_boolean_t done;
int ctlfd;
int cc;
@@ -3585,22 +3806,34 @@ watcher(void *uap) {
return ((isc_threadresult_t)0);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
-void
-isc__socketmgr_setreserved(isc_socketmgr_t *manager, isc_uint32_t reserved) {
+#ifdef BIND9
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_setreserved(isc_socketmgr_t *manager0, isc_uint32_t reserved) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
REQUIRE(VALID_MANAGER(manager));
manager->reserved = reserved;
}
+ISC_SOCKETFUNC_SCOPE void
+isc___socketmgr_maxudp(isc_socketmgr_t *manager0, int maxudp) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
+ REQUIRE(VALID_MANAGER(manager));
+
+ manager->maxudp = maxudp;
+}
+#endif /* BIND9 */
+
/*
* Create a new socket manager.
*/
static isc_result_t
-setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
+setup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) {
isc_result_t result;
#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL)
char strbuf[ISC_STRERRORSIZE];
@@ -3626,7 +3859,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
return (result);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
if (result != ISC_R_SUCCESS) {
close(manager->kqueue_fd);
@@ -3634,7 +3867,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(struct kevent) * manager->nevents);
return (result);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#elif defined(USE_EPOLL)
manager->nevents = ISC_SOCKET_MAXEVENTS;
manager->events = isc_mem_get(mctx, sizeof(struct epoll_event) *
@@ -3654,7 +3887,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(struct epoll_event) * manager->nevents);
return (result);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
if (result != ISC_R_SUCCESS) {
close(manager->epoll_fd);
@@ -3662,7 +3895,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(struct epoll_event) * manager->nevents);
return (result);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#elif defined(USE_DEVPOLL)
/*
* XXXJT: /dev/poll seems to reject large numbers of events,
@@ -3700,7 +3933,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(pollinfo_t) * manager->maxsocks);
return (result);
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
result = watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
if (result != ISC_R_SUCCESS) {
close(manager->devpoll_fd);
@@ -3710,7 +3943,7 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
sizeof(pollinfo_t) * manager->maxsocks);
return (result);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#elif defined(USE_SELECT)
UNUSED(result);
@@ -3758,20 +3991,20 @@ setup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
memset(manager->read_fds, 0, manager->fd_bufsize);
memset(manager->write_fds, 0, manager->fd_bufsize);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
(void)watch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
manager->maxfd = manager->pipe_fds[0];
-#else /* ISC_PLATFORM_USETHREADS */
+#else /* USE_WATCHER_THREAD */
manager->maxfd = 0;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#endif /* USE_KQUEUE */
return (ISC_R_SUCCESS);
}
static void
-cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
-#ifdef ISC_PLATFORM_USETHREADS
+cleanup_watcher(isc_mem_t *mctx, isc__socketmgr_t *manager) {
+#ifdef USE_WATCHER_THREAD
isc_result_t result;
result = unwatch_fd(manager, manager->pipe_fds[0], SELECT_POKE_READ);
@@ -3781,7 +4014,7 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed"));
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
#ifdef USE_KQUEUE
close(manager->kqueue_fd);
@@ -3809,35 +4042,35 @@ cleanup_watcher(isc_mem_t *mctx, isc_socketmgr_t *manager) {
#endif /* USE_KQUEUE */
}
-isc_result_t
-isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
- return (isc_socketmgr_create2(mctx, managerp, 0));
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
+ return (isc__socketmgr_create2(mctx, managerp, 0));
}
-isc_result_t
-isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
- unsigned int maxsocks)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
+ unsigned int maxsocks)
{
int i;
- isc_socketmgr_t *manager;
-#ifdef ISC_PLATFORM_USETHREADS
+ isc__socketmgr_t *manager;
+#ifdef USE_WATCHER_THREAD
char strbuf[ISC_STRERRORSIZE];
#endif
isc_result_t result;
REQUIRE(managerp != NULL && *managerp == NULL);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
if (socketmgr != NULL) {
/* Don't allow maxsocks to be updated */
if (maxsocks > 0 && socketmgr->maxsocks != maxsocks)
return (ISC_R_EXISTS);
socketmgr->refs++;
- *managerp = socketmgr;
+ *managerp = (isc_socketmgr_t *)socketmgr;
return (ISC_R_SUCCESS);
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
if (maxsocks == 0)
maxsocks = ISC_SOCKET_MAXSOCKETS;
@@ -3850,8 +4083,9 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
memset(manager, 0, sizeof(*manager));
manager->maxsocks = maxsocks;
manager->reserved = 0;
+ manager->maxudp = 0;
manager->fds = isc_mem_get(mctx,
- manager->maxsocks * sizeof(isc_socket_t *));
+ manager->maxsocks * sizeof(isc__socket_t *));
if (manager->fds == NULL) {
result = ISC_R_NOMEMORY;
goto free_manager;
@@ -3863,7 +4097,9 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
}
manager->stats = NULL;
- manager->magic = SOCKET_MANAGER_MAGIC;
+ manager->common.methods = &socketmgrmethods;
+ manager->common.magic = ISCAPI_SOCKETMGR_MAGIC;
+ manager->common.impmagic = SOCKET_MANAGER_MAGIC;
manager->mctx = NULL;
memset(manager->fds, 0, manager->maxsocks * sizeof(isc_socket_t *));
ISC_LIST_INIT(manager->socklist);
@@ -3887,7 +4123,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
}
}
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
if (isc_condition_init(&manager->shutdown_ok) != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
"isc_condition_init() %s",
@@ -3916,9 +4152,11 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
#if 0
RUNTIME_CHECK(make_nonblock(manager->pipe_fds[1]) == ISC_R_SUCCESS);
#endif
-#else /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
+
+#ifdef USE_SHARED_MANAGER
manager->refs = 1;
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_SHARED_MANAGER */
/*
* Set up initial state for the select loop
@@ -3927,7 +4165,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
if (result != ISC_R_SUCCESS)
goto cleanup;
memset(manager->fdstate, 0, manager->maxsocks * sizeof(int));
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
/*
* Start up the select/poll thread.
*/
@@ -3941,26 +4179,26 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp,
result = ISC_R_UNEXPECTED;
goto cleanup;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
isc_mem_attach(mctx, &manager->mctx);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
socketmgr = manager;
-#endif /* ISC_PLATFORM_USETHREADS */
- *managerp = manager;
+#endif /* USE_SHARED_MANAGER */
+ *managerp = (isc_socketmgr_t *)manager;
return (ISC_R_SUCCESS);
cleanup:
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
(void)close(manager->pipe_fds[0]);
(void)close(manager->pipe_fds[1]);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
cleanup_condition:
(void)isc_condition_destroy(&manager->shutdown_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
cleanup_lock:
@@ -3988,8 +4226,10 @@ free_manager:
return (result);
}
+#ifdef BIND9
isc_result_t
-isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
+isc__socketmgr_getmaxsockets(isc_socketmgr_t *manager0, unsigned int *nsockp) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
REQUIRE(VALID_MANAGER(manager));
REQUIRE(nsockp != NULL);
@@ -3999,7 +4239,9 @@ isc_socketmgr_getmaxsockets(isc_socketmgr_t *manager, unsigned int *nsockp) {
}
void
-isc_socketmgr_setstats(isc_socketmgr_t *manager, isc_stats_t *stats) {
+isc__socketmgr_setstats(isc_socketmgr_t *manager0, isc_stats_t *stats) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
REQUIRE(VALID_MANAGER(manager));
REQUIRE(ISC_LIST_EMPTY(manager->socklist));
REQUIRE(manager->stats == NULL);
@@ -4007,10 +4249,11 @@ isc_socketmgr_setstats(isc_socketmgr_t *manager, isc_stats_t *stats) {
isc_stats_attach(stats, &manager->stats);
}
+#endif
-void
-isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
- isc_socketmgr_t *manager;
+ISC_SOCKETFUNC_SCOPE void
+isc__socketmgr_destroy(isc_socketmgr_t **managerp) {
+ isc__socketmgr_t *manager;
int i;
isc_mem_t *mctx;
@@ -4019,42 +4262,36 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
*/
REQUIRE(managerp != NULL);
- manager = *managerp;
+ manager = (isc__socketmgr_t *)*managerp;
REQUIRE(VALID_MANAGER(manager));
-#ifndef ISC_PLATFORM_USETHREADS
- if (manager->refs > 1) {
- manager->refs--;
+#ifdef USE_SHARED_MANAGER
+ manager->refs--;
+ if (manager->refs > 0) {
*managerp = NULL;
return;
}
-#endif /* ISC_PLATFORM_USETHREADS */
+ socketmgr = NULL;
+#endif /* USE_SHARED_MANAGER */
LOCK(&manager->lock);
-#ifdef ISC_PLATFORM_USETHREADS
/*
* Wait for all sockets to be destroyed.
*/
while (!ISC_LIST_EMPTY(manager->socklist)) {
+#ifdef USE_WATCHER_THREAD
manager_log(manager, CREATION, "%s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKET,
ISC_MSG_SOCKETSREMAIN,
"sockets exist"));
WAIT(&manager->shutdown_ok, &manager->lock);
+#else /* USE_WATCHER_THREAD */
+ UNLOCK(&manager->lock);
+ isc__taskmgr_dispatch(NULL);
+ LOCK(&manager->lock);
+#endif /* USE_WATCHER_THREAD */
}
-#else /* ISC_PLATFORM_USETHREADS */
- /*
- * Hope all sockets have been destroyed.
- */
- if (!ISC_LIST_EMPTY(manager->socklist)) {
- manager_log(manager, CREATION, "%s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKET,
- ISC_MSG_SOCKETSREMAIN,
- "sockets exist"));
- INSIST(0);
- }
-#endif /* ISC_PLATFORM_USETHREADS */
UNLOCK(&manager->lock);
@@ -4065,7 +4302,7 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
*/
select_poke(manager, 0, SELECT_POKE_SHUTDOWN);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
/*
* Wait for thread to exit.
*/
@@ -4074,25 +4311,25 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
"isc_thread_join() %s",
isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
ISC_MSG_FAILED, "failed"));
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
/*
* Clean up.
*/
cleanup_watcher(manager->mctx, manager);
-#ifdef ISC_PLATFORM_USETHREADS
+#ifdef USE_WATCHER_THREAD
(void)close(manager->pipe_fds[0]);
(void)close(manager->pipe_fds[1]);
(void)isc_condition_destroy(&manager->shutdown_ok);
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
for (i = 0; i < (int)manager->maxsocks; i++)
if (manager->fdstate[i] == CLOSE_PENDING) /* no need to lock */
(void)close(i);
isc_mem_put(manager->mctx, manager->fds,
- manager->maxsocks * sizeof(isc_socket_t *));
+ manager->maxsocks * sizeof(isc__socket_t *));
isc_mem_put(manager->mctx, manager->fdstate,
manager->maxsocks * sizeof(int));
@@ -4106,17 +4343,22 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp) {
FDLOCK_COUNT * sizeof(isc_mutex_t));
}
DESTROYLOCK(&manager->lock);
- manager->magic = 0;
+ manager->common.magic = 0;
+ manager->common.impmagic = 0;
mctx= manager->mctx;
isc_mem_put(mctx, manager, sizeof(*manager));
isc_mem_detach(&mctx);
*managerp = NULL;
+
+#ifdef USE_SHARED_MANAGER
+ socketmgr = NULL;
+#endif
}
static isc_result_t
-socket_recv(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
+socket_recv(isc__socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
unsigned int flags)
{
int io_state;
@@ -4187,13 +4429,14 @@ socket_recv(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
return (result);
}
-isc_result_t
-isc_socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
- unsigned int minimum, isc_task_t *task,
- isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recvv(isc_socket_t *sock0, isc_bufferlist_t *buflist,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
unsigned int iocount;
isc_buffer_t *buffer;
@@ -4241,12 +4484,14 @@ isc_socket_recvv(isc_socket_t *sock, isc_bufferlist_t *buflist,
return (socket_recv(sock, dev, task, 0));
}
-isc_result_t
-isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
- isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv(isc_socket_t *sock0, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
REQUIRE(VALID_SOCKET(sock));
REQUIRE(action != NULL);
@@ -4260,14 +4505,16 @@ isc_socket_recv(isc_socket_t *sock, isc_region_t *region, unsigned int minimum,
if (dev == NULL)
return (ISC_R_NOMEMORY);
- return (isc_socket_recv2(sock, region, minimum, task, dev, 0));
+ return (isc__socket_recv2(sock0, region, minimum, task, dev, 0));
}
-isc_result_t
-isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
- unsigned int minimum, isc_task_t *task,
- isc_socketevent_t *event, unsigned int flags)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_recv2(isc_socket_t *sock0, isc_region_t *region,
+ unsigned int minimum, isc_task_t *task,
+ isc_socketevent_t *event, unsigned int flags)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
event->ev_sender = sock;
event->result = ISC_R_UNEXPECTED;
ISC_LIST_INIT(event->bufferlist);
@@ -4292,7 +4539,7 @@ isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
}
static isc_result_t
-socket_send(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
+socket_send(isc__socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
unsigned int flags)
{
@@ -4383,24 +4630,25 @@ socket_send(isc_socket_t *sock, isc_socketevent_t *dev, isc_task_t *task,
return (result);
}
-isc_result_t
-isc_socket_send(isc_socket_t *sock, isc_region_t *region,
- isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_send(isc_socket_t *sock, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg)
{
/*
* REQUIRE() checking is performed in isc_socket_sendto().
*/
- return (isc_socket_sendto(sock, region, task, action, arg, NULL,
- NULL));
+ return (isc__socket_sendto(sock, region, task, action, arg, NULL,
+ NULL));
}
-isc_result_t
-isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
- isc_task_t *task, isc_taskaction_t action, const void *arg,
- isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto(isc_socket_t *sock0, isc_region_t *region,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
REQUIRE(VALID_SOCKET(sock));
REQUIRE(region != NULL);
@@ -4422,21 +4670,22 @@ isc_socket_sendto(isc_socket_t *sock, isc_region_t *region,
return (socket_send(sock, dev, task, address, pktinfo, 0));
}
-isc_result_t
-isc_socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
- isc_task_t *task, isc_taskaction_t action, const void *arg)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendv(isc_socket_t *sock, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg)
{
- return (isc_socket_sendtov(sock, buflist, task, action, arg, NULL,
- NULL));
+ return (isc__socket_sendtov(sock, buflist, task, action, arg, NULL,
+ NULL));
}
-isc_result_t
-isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
- isc_task_t *task, isc_taskaction_t action, const void *arg,
- isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendtov(isc_socket_t *sock0, isc_bufferlist_t *buflist,
+ isc_task_t *task, isc_taskaction_t action, const void *arg,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socketevent_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
unsigned int iocount;
isc_buffer_t *buffer;
@@ -4470,12 +4719,15 @@ isc_socket_sendtov(isc_socket_t *sock, isc_bufferlist_t *buflist,
return (socket_send(sock, dev, task, address, pktinfo, 0));
}
-isc_result_t
-isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
- isc_task_t *task,
- isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
- isc_socketevent_t *event, unsigned int flags)
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_sendto2(isc_socket_t *sock0, isc_region_t *region,
+ isc_task_t *task,
+ isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
+ isc_socketevent_t *event, unsigned int flags)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
+ REQUIRE(VALID_SOCKET(sock));
REQUIRE((flags & ~(ISC_SOCKFLAG_IMMEDIATE|ISC_SOCKFLAG_NORETRY)) == 0);
if ((flags & ISC_SOCKFLAG_NORETRY) != 0)
REQUIRE(sock->type == isc_sockettype_udp);
@@ -4490,8 +4742,8 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
return (socket_send(sock, event, task, address, pktinfo, flags));
}
-void
-isc_socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
#ifdef ISC_PLATFORM_HAVESYSUNH
int s;
struct stat sb;
@@ -4620,8 +4872,8 @@ isc_socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
#endif
}
-isc_result_t
-isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
isc_uint32_t owner, isc_uint32_t group)
{
#ifdef ISC_PLATFORM_HAVESYSUNH
@@ -4674,12 +4926,15 @@ isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
#endif
}
-isc_result_t
-isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
- unsigned int options) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_bind(isc_socket_t *sock0, isc_sockaddr_t *sockaddr,
+ unsigned int options) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
char strbuf[ISC_STRERRORSIZE];
int on = 1;
+ REQUIRE(VALID_SOCKET(sock));
+
LOCK(&sock->lock);
INSIST(!sock->bound);
@@ -4745,8 +5000,9 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr,
*/
#undef ENABLE_ACCEPTFILTER
-isc_result_t
-isc_socket_filter(isc_socket_t *sock, const char *filter) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_filter(isc_socket_t *sock0, const char *filter) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
#if defined(SO_ACCEPTFILTER) && defined(ENABLE_ACCEPTFILTER)
char strbuf[ISC_STRERRORSIZE];
struct accept_filter_arg afa;
@@ -4784,8 +5040,9 @@ isc_socket_filter(isc_socket_t *sock, const char *filter) {
* is a new connection we'll have to allocate a new one anyway, so we might
* as well keep things simple rather than having to track them.
*/
-isc_result_t
-isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_listen(isc_socket_t *sock0, unsigned int backlog) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
char strbuf[ISC_STRERRORSIZE];
REQUIRE(VALID_SOCKET(sock));
@@ -4818,14 +5075,15 @@ isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
/*
* This should try to do aggressive accept() XXXMLG
*/
-isc_result_t
-isc_socket_accept(isc_socket_t *sock,
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_accept(isc_socket_t *sock0,
isc_task_t *task, isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socket_newconnev_t *dev;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
isc_task_t *ntask = NULL;
- isc_socket_t *nsock;
+ isc__socket_t *nsock;
isc_result_t result;
isc_boolean_t do_poke = ISC_FALSE;
@@ -4872,7 +5130,7 @@ isc_socket_accept(isc_socket_t *sock,
nsock->statsindex = sock->statsindex;
dev->ev_sender = ntask;
- dev->newsocket = nsock;
+ dev->newsocket = (isc_socket_t *)nsock;
/*
* Poke watcher here. We still have the socket locked, so there
@@ -4891,13 +5149,14 @@ isc_socket_accept(isc_socket_t *sock,
return (ISC_R_SUCCESS);
}
-isc_result_t
-isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_connect(isc_socket_t *sock0, isc_sockaddr_t *addr,
isc_task_t *task, isc_taskaction_t action, const void *arg)
{
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_socket_connev_t *dev;
isc_task_t *ntask = NULL;
- isc_socketmgr_t *manager;
+ isc__socketmgr_t *manager;
int cc;
char strbuf[ISC_STRERRORSIZE];
char addrbuf[ISC_SOCKADDR_FORMATSIZE];
@@ -5037,7 +5296,7 @@ isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addr,
*/
static void
internal_connect(isc_task_t *me, isc_event_t *ev) {
- isc_socket_t *sock;
+ isc__socket_t *sock;
isc_socket_connev_t *dev;
isc_task_t *task;
int cc;
@@ -5151,8 +5410,9 @@ internal_connect(isc_task_t *me, isc_event_t *ev) {
isc_task_sendanddetach(&task, ISC_EVENT_PTR(&dev));
}
-isc_result_t
-isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getpeername(isc_socket_t *sock0, isc_sockaddr_t *addressp) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_result_t result;
REQUIRE(VALID_SOCKET(sock));
@@ -5172,8 +5432,9 @@ isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
return (result);
}
-isc_result_t
-isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
+ISC_SOCKETFUNC_SCOPE isc_result_t
+isc__socket_getsockname(isc_socket_t *sock0, isc_sockaddr_t *addressp) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
ISC_SOCKADDR_LEN_T len;
isc_result_t result;
char strbuf[ISC_STRERRORSIZE];
@@ -5210,8 +5471,9 @@ isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
* Run through the list of events on this socket, and cancel the ones
* queued for task "task" of type "how". "how" is a bitmask.
*/
-void
-isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_cancel(isc_socket_t *sock0, isc_task_t *task, unsigned int how) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
REQUIRE(VALID_SOCKET(sock));
@@ -5290,8 +5552,8 @@ isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
ISC_LIST_UNLINK(sock->accept_list, dev,
ev_link);
- dev->newsocket->references--;
- free_socket(&dev->newsocket);
+ NEWCONNSOCK(dev)->references--;
+ free_socket((isc__socket_t **)&dev->newsocket);
dev->result = ISC_R_CANCELED;
dev->ev_sender = sock;
@@ -5330,17 +5592,22 @@ isc_socket_cancel(isc_socket_t *sock, isc_task_t *task, unsigned int how) {
UNLOCK(&sock->lock);
}
-isc_sockettype_t
-isc_socket_gettype(isc_socket_t *sock) {
+ISC_SOCKETFUNC_SCOPE isc_sockettype_t
+isc__socket_gettype(isc_socket_t *sock0) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
+
REQUIRE(VALID_SOCKET(sock));
return (sock->type);
}
-isc_boolean_t
-isc_socket_isbound(isc_socket_t *sock) {
+ISC_SOCKETFUNC_SCOPE isc_boolean_t
+isc__socket_isbound(isc_socket_t *sock0) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
isc_boolean_t val;
+ REQUIRE(VALID_SOCKET(sock));
+
LOCK(&sock->lock);
val = ((sock->bound) ? ISC_TRUE : ISC_FALSE);
UNLOCK(&sock->lock);
@@ -5348,8 +5615,9 @@ isc_socket_isbound(isc_socket_t *sock) {
return (val);
}
-void
-isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
+ISC_SOCKETFUNC_SCOPE void
+isc__socket_ipv6only(isc_socket_t *sock0, isc_boolean_t yes) {
+ isc__socket_t *sock = (isc__socket_t *)sock0;
#if defined(IPV6_V6ONLY)
int onoff = yes ? 1 : 0;
#else
@@ -5379,12 +5647,21 @@ isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes) {
#endif
}
-#ifndef ISC_PLATFORM_USETHREADS
-/* In our assumed scenario, we can simply use a single static object. */
+#ifndef USE_WATCHER_THREAD
+/*
+ * In our assumed scenario, we can simply use a single static object.
+ * XXX: this is not true if the application uses multiple threads with
+ * 'multi-context' mode. Fixing this is a future TODO item.
+ */
static isc_socketwait_t swait_private;
int
-isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
+isc__socketmgr_waitevents(isc_socketmgr_t *manager0, struct timeval *tvp,
+ isc_socketwait_t **swaitp)
+{
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
+
int n;
#ifdef USE_KQUEUE
struct timespec ts, *tsp;
@@ -5398,7 +5675,11 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
REQUIRE(swaitp != NULL && *swaitp == NULL);
- if (socketmgr == NULL)
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = socketmgr;
+#endif
+ if (manager == NULL)
return (0);
#ifdef USE_KQUEUE
@@ -5408,8 +5689,8 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
tsp = &ts;
} else
tsp = NULL;
- swait_private.nevents = kevent(socketmgr->kqueue_fd, NULL, 0,
- socketmgr->events, socketmgr->nevents,
+ swait_private.nevents = kevent(manager->kqueue_fd, NULL, 0,
+ manager->events, manager->nevents,
tsp);
n = swait_private.nevents;
#elif defined(USE_EPOLL)
@@ -5417,29 +5698,28 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
timeout = tvp->tv_sec * 1000 + (tvp->tv_usec + 999) / 1000;
else
timeout = -1;
- swait_private.nevents = epoll_wait(socketmgr->epoll_fd,
- socketmgr->events,
- socketmgr->nevents, timeout);
+ swait_private.nevents = epoll_wait(manager->epoll_fd,
+ manager->events,
+ manager->nevents, timeout);
n = swait_private.nevents;
#elif defined(USE_DEVPOLL)
- dvp.dp_fds = socketmgr->events;
- dvp.dp_nfds = socketmgr->nevents;
+ dvp.dp_fds = manager->events;
+ dvp.dp_nfds = manager->nevents;
if (tvp != NULL) {
dvp.dp_timeout = tvp->tv_sec * 1000 +
(tvp->tv_usec + 999) / 1000;
} else
dvp.dp_timeout = -1;
- swait_private.nevents = ioctl(socketmgr->devpoll_fd, DP_POLL, &dvp);
+ swait_private.nevents = ioctl(manager->devpoll_fd, DP_POLL, &dvp);
n = swait_private.nevents;
#elif defined(USE_SELECT)
- memcpy(socketmgr->read_fds_copy, socketmgr->read_fds,
- socketmgr->fd_bufsize);
- memcpy(socketmgr->write_fds_copy, socketmgr->write_fds,
- socketmgr->fd_bufsize);
+ memcpy(manager->read_fds_copy, manager->read_fds, manager->fd_bufsize);
+ memcpy(manager->write_fds_copy, manager->write_fds,
+ manager->fd_bufsize);
- swait_private.readset = socketmgr->read_fds_copy;
- swait_private.writeset = socketmgr->write_fds_copy;
- swait_private.maxfd = socketmgr->maxfd + 1;
+ swait_private.readset = manager->read_fds_copy;
+ swait_private.writeset = manager->write_fds_copy;
+ swait_private.maxfd = manager->maxfd + 1;
n = select(swait_private.maxfd, swait_private.readset,
swait_private.writeset, NULL, tvp);
@@ -5450,24 +5730,32 @@ isc__socketmgr_waitevents(struct timeval *tvp, isc_socketwait_t **swaitp) {
}
isc_result_t
-isc__socketmgr_dispatch(isc_socketwait_t *swait) {
+isc__socketmgr_dispatch(isc_socketmgr_t *manager0, isc_socketwait_t *swait) {
+ isc__socketmgr_t *manager = (isc__socketmgr_t *)manager0;
+
REQUIRE(swait == &swait_private);
- if (socketmgr == NULL)
+#ifdef USE_SHARED_MANAGER
+ if (manager == NULL)
+ manager = socketmgr;
+#endif
+ if (manager == NULL)
return (ISC_R_NOTFOUND);
#if defined(USE_KQUEUE) || defined(USE_EPOLL) || defined(USE_DEVPOLL)
- (void)process_fds(socketmgr, socketmgr->events, swait->nevents);
+ (void)process_fds(manager, manager->events, swait->nevents);
return (ISC_R_SUCCESS);
#elif defined(USE_SELECT)
- process_fds(socketmgr, swait->maxfd, swait->readset, swait->writeset);
+ process_fds(manager, swait->maxfd, swait->readset, swait->writeset);
return (ISC_R_SUCCESS);
#endif
}
-#endif /* ISC_PLATFORM_USETHREADS */
+#endif /* USE_WATCHER_THREAD */
+#ifdef BIND9
void
-isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
+isc__socket_setname(isc_socket_t *socket0, const char *name, void *tag) {
+ isc__socket_t *socket = (isc__socket_t *)socket0;
/*
* Name 'socket'.
@@ -5482,17 +5770,29 @@ isc_socket_setname(isc_socket_t *socket, const char *name, void *tag) {
UNLOCK(&socket->lock);
}
-const char *
-isc_socket_getname(isc_socket_t *socket) {
+ISC_SOCKETFUNC_SCOPE const char *
+isc__socket_getname(isc_socket_t *socket0) {
+ isc__socket_t *socket = (isc__socket_t *)socket0;
+
return (socket->name);
}
void *
-isc_socket_gettag(isc_socket_t *socket) {
+isc__socket_gettag(isc_socket_t *socket0) {
+ isc__socket_t *socket = (isc__socket_t *)socket0;
+
return (socket->tag);
}
+#endif /* BIND9 */
-#ifdef HAVE_LIBXML2
+#ifdef USE_SOCKETIMPREGISTER
+isc_result_t
+isc__socket_register() {
+ return (isc_socket_register(isc__socketmgr_create));
+}
+#endif
+
+#if defined(HAVE_LIBXML2) && defined(BIND9)
static const char *
_socktype(isc_sockettype_t type)
@@ -5509,21 +5809,21 @@ _socktype(isc_sockettype_t type)
return ("not-initialized");
}
-void
-isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer)
-{
- isc_socket_t *sock;
+ISC_SOCKETFUNC_SCOPE void
+isc_socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer) {
+ isc__socketmgr_t *mgr = (isc__socketmgr_t *)mgr0;
+ isc__socket_t *sock;
char peerbuf[ISC_SOCKADDR_FORMATSIZE];
isc_sockaddr_t addr;
ISC_SOCKADDR_LEN_T len;
LOCK(&mgr->lock);
-#ifndef ISC_PLATFORM_USETHREADS
+#ifdef USE_SHARED_MANAGER
xmlTextWriterStartElement(writer, ISC_XMLCHAR "references");
xmlTextWriterWriteFormatString(writer, "%d", mgr->refs);
xmlTextWriterEndElement(writer);
-#endif
+#endif /* USE_SHARED_MANAGER */
xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets");
sock = ISC_LIST_HEAD(mgr->socklist);
diff --git a/contrib/bind9/lib/isc/unix/socket_p.h b/contrib/bind9/lib/isc/unix/socket_p.h
index b9a2347..b6c4b6a 100644
--- a/contrib/bind9/lib/isc/unix/socket_p.h
+++ b/contrib/bind9/lib/isc/unix/socket_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket_p.h,v 1.13 2008-06-23 23:47:11 tbox Exp $ */
+/* $Id: socket_p.h,v 1.15 2009-09-02 23:48:03 tbox Exp $ */
#ifndef ISC_SOCKET_P_H
#define ISC_SOCKET_P_H
@@ -27,6 +27,7 @@
#endif
typedef struct isc_socketwait isc_socketwait_t;
-int isc__socketmgr_waitevents(struct timeval *, isc_socketwait_t **);
-isc_result_t isc__socketmgr_dispatch(isc_socketwait_t *);
+int isc__socketmgr_waitevents(isc_socketmgr_t *, struct timeval *,
+ isc_socketwait_t **);
+isc_result_t isc__socketmgr_dispatch(isc_socketmgr_t *, isc_socketwait_t *);
#endif /* ISC_SOCKET_P_H */
diff --git a/contrib/bind9/lib/isc/unix/strerror.c b/contrib/bind9/lib/isc/unix/strerror.c
index 08ea52d..4a61a97 100644
--- a/contrib/bind9/lib/isc/unix/strerror.c
+++ b/contrib/bind9/lib/isc/unix/strerror.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: strerror.c,v 1.8.332.2 2009-02-16 23:47:15 tbox Exp $ */
+/* $Id: strerror.c,v 1.10 2009-02-16 23:48:04 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isccc/Makefile.in b/contrib/bind9/lib/isccc/Makefile.in
index fb08fcd..1417172 100644
--- a/contrib/bind9/lib/isccc/Makefile.in
+++ b/contrib/bind9/lib/isccc/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2001, 2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.9 2007-06-19 23:47:21 tbox Exp $
+# $Id: Makefile.in,v 1.12.244.1.2.1 2011-06-02 23:47:37 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -71,7 +71,7 @@ libisccc.la: ${OBJS}
${LIBTOOL_MODE_LINK} \
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisccc.la -rpath ${libdir} \
-version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
- ${OBJS} ${LIBS} ${ISCLIBS}
+ ${OBJS} ${ISCLIBS} ${LIBS}
timestamp: libisccc.@A@
touch timestamp
diff --git a/contrib/bind9/lib/isccc/api b/contrib/bind9/lib/isccc/api
index 2240cdd..94575eb 100644
--- a/contrib/bind9/lib/isccc/api
+++ b/contrib/bind9/lib/isccc/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 1
+LIBINTERFACE = 80
+LIBREVISION = 0
LIBAGE = 0
diff --git a/contrib/bind9/lib/isccfg/Makefile.in b/contrib/bind9/lib/isccfg/Makefile.in
index 4c55a16..37b0a26 100644
--- a/contrib/bind9/lib/isccfg/Makefile.in
+++ b/contrib/bind9/lib/isccfg/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2001-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.18 2007-06-19 23:47:22 tbox Exp $
+# $Id: Makefile.in,v 1.21.244.1.2.1 2011-06-02 23:47:37 tbox Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -27,7 +27,7 @@ top_srcdir = @top_srcdir@
CINCLUDES = -I. ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES}
-CDEFINES = @USE_DLZ@
+CDEFINES = @USE_DLZ@
CWARNINGS =
ISCLIBS = ../../lib/isc/libisc.@A@
@@ -68,7 +68,7 @@ libisccfg.la: ${OBJS}
${LIBTOOL_MODE_LINK} \
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisccfg.la -rpath ${libdir} \
-version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \
- ${OBJS} ${LIBS} ${DNSLIBS} ${ISCCCLIBS} ${ISCLIBS}
+ ${OBJS} ${DNSLIBS} ${ISCCCLIBS} ${ISCLIBS} ${LIBS}
timestamp: libisccfg.@A@
touch timestamp
diff --git a/contrib/bind9/lib/isccfg/aclconf.c b/contrib/bind9/lib/isccfg/aclconf.c
index 6bf0ad8..44d436a4 100644
--- a/contrib/bind9/lib/isccfg/aclconf.c
+++ b/contrib/bind9/lib/isccfg/aclconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: aclconf.c,v 1.22.34.4 2009-10-01 23:47:17 tbox Exp $ */
+/* $Id: aclconf.c,v 1.29 2010-08-13 23:47:03 tbox Exp $ */
#include <config.h>
@@ -39,7 +39,7 @@ cfg_aclconfctx_init(cfg_aclconfctx_t *ctx) {
}
void
-cfg_aclconfctx_destroy(cfg_aclconfctx_t *ctx) {
+cfg_aclconfctx_clear(cfg_aclconfctx_t *ctx) {
dns_acl_t *dacl, *next;
for (dacl = ISC_LIST_HEAD(ctx->named_acl_cache);
@@ -51,6 +51,23 @@ cfg_aclconfctx_destroy(cfg_aclconfctx_t *ctx) {
}
}
+void
+cfg_aclconfctx_clone(cfg_aclconfctx_t *src, cfg_aclconfctx_t *dest) {
+ dns_acl_t *dacl, *next;
+ REQUIRE(src != NULL && dest != NULL);
+
+ cfg_aclconfctx_init(dest);
+ for (dacl = ISC_LIST_HEAD(src->named_acl_cache);
+ dacl != NULL;
+ dacl = next)
+ {
+ dns_acl_t *copy;
+ next = ISC_LIST_NEXT(dacl, nextincache);
+ dns_acl_attach(dacl, &copy);
+ ISC_LIST_APPEND(dest->named_acl_cache, copy, nextincache);
+ }
+}
+
/*
* Find the definition of the named acl whose name is "name".
*/
@@ -150,7 +167,7 @@ convert_keyname(const cfg_obj_t *keyobj, isc_log_t *lctx, isc_mem_t *mctx,
isc_buffer_add(&buf, keylen);
dns_fixedname_init(&fixname);
result = dns_name_fromtext(dns_fixedname_name(&fixname), &buf,
- dns_rootname, ISC_FALSE, NULL);
+ dns_rootname, 0, NULL);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(keyobj, lctx, ISC_LOG_WARNING,
"key name '%s' is not a valid domain name",
diff --git a/contrib/bind9/lib/isccfg/api b/contrib/bind9/lib/isccfg/api
index fbbf923..7821c32 100644
--- a/contrib/bind9/lib/isccfg/api
+++ b/contrib/bind9/lib/isccfg/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 3
-LIBAGE = 0
+LIBINTERFACE = 81
+LIBREVISION = 1
+LIBAGE = 1
diff --git a/contrib/bind9/lib/isccfg/dnsconf.c b/contrib/bind9/lib/isccfg/dnsconf.c
new file mode 100644
index 0000000..7091d63
--- /dev/null
+++ b/contrib/bind9/lib/isccfg/dnsconf.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.c,v 1.4 2009-09-02 23:48:03 tbox Exp $ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <isccfg/cfg.h>
+#include <isccfg/grammar.h>
+
+/*%
+ * A trusted key, as used in the "trusted-keys" statement.
+ */
+static cfg_tuplefielddef_t trustedkey_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "flags", &cfg_type_uint32, 0 },
+ { "protocol", &cfg_type_uint32, 0 },
+ { "algorithm", &cfg_type_uint32, 0 },
+ { "key", &cfg_type_qstring, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_type_t cfg_type_trustedkey = {
+ "trustedkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, trustedkey_fields
+};
+
+static cfg_type_t cfg_type_trustedkeys = {
+ "trusted-keys", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_trustedkey
+};
+
+/*%
+ * Clauses that can be found within the top level of the dns.conf
+ * file only.
+ */
+static cfg_clausedef_t
+dnsconf_clauses[] = {
+ { "trusted-keys", &cfg_type_trustedkeys, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+
+/*% The top-level dns.conf syntax. */
+
+static cfg_clausedef_t *
+dnsconf_clausesets[] = {
+ dnsconf_clauses,
+ NULL
+};
+
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_dnsconf = {
+ "dnsconf", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, dnsconf_clausesets
+};
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h b/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h
index f2ab70f..49aef03 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/aclconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: aclconf.h,v 1.10 2007-10-12 04:17:18 each Exp $ */
+/* $Id: aclconf.h,v 1.12 2010-08-13 23:47:04 tbox Exp $ */
#ifndef ISCCFG_ACLCONF_H
#define ISCCFG_ACLCONF_H 1
@@ -44,9 +44,15 @@ cfg_aclconfctx_init(cfg_aclconfctx_t *ctx);
*/
void
-cfg_aclconfctx_destroy(cfg_aclconfctx_t *ctx);
+cfg_aclconfctx_clone(cfg_aclconfctx_t *src, cfg_aclconfctx_t *dest);
/*
- * Destroy an ACL configuration context.
+ * Copy the contents of one ACL configuration context into another.
+ */
+
+void
+cfg_aclconfctx_clear(cfg_aclconfctx_t *ctx);
+/*
+ * Clear the contents of an ACL configuration context.
*/
isc_result_t
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/cfg.h b/contrib/bind9/lib/isccfg/include/isccfg/cfg.h
index 06efa35..82900d6 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/cfg.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cfg.h,v 1.44 2007-10-12 04:17:18 each Exp $ */
+/* $Id: cfg.h,v 1.46 2010-08-13 23:47:04 tbox Exp $ */
#ifndef ISCCFG_CFG_H
#define ISCCFG_CFG_H 1
@@ -35,6 +35,7 @@
#include <isc/formatcheck.h>
#include <isc/lang.h>
+#include <isc/refcount.h>
#include <isc/types.h>
#include <isc/list.h>
@@ -70,7 +71,7 @@ typedef struct cfg_obj cfg_obj_t;
typedef struct cfg_listelt cfg_listelt_t;
/*%
- * A callback function to be called when parsing an option
+ * A callback function to be called when parsing an option
* that needs to be interpreted at parsing time, like
* "directory".
*/
@@ -83,6 +84,12 @@ typedef isc_result_t
ISC_LANG_BEGINDECLS
+void
+cfg_parser_attach(cfg_parser_t *src, cfg_parser_t **dest);
+/*%<
+ * Reference a parser object.
+ */
+
isc_result_t
cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret);
/*%<
@@ -123,7 +130,7 @@ cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
* (isc_parse_buffer()).
*
* Returns an error if the file does not parse correctly.
- *
+ *
* Requires:
*\li "filename" is valid.
*\li "mem" is valid.
@@ -140,13 +147,14 @@ cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
void
cfg_parser_destroy(cfg_parser_t **pctxp);
/*%<
- * Destroy a configuration parser.
+ * Remove a reference to a configuration parser; destroy it if there are no
+ * more references.
*/
isc_boolean_t
cfg_obj_isvoid(const cfg_obj_t *obj);
/*%<
- * Return true iff 'obj' is of void type (e.g., an optional
+ * Return true iff 'obj' is of void type (e.g., an optional
* value not specified).
*/
@@ -355,7 +363,7 @@ cfg_list_length(const cfg_obj_t *obj, isc_boolean_t recurse);
* all contained lists.
*/
-const cfg_obj_t *
+cfg_obj_t *
cfg_listelt_value(const cfg_listelt_t *elt);
/*%<
* Returns the configuration object associated with cfg_listelt_t.
@@ -389,17 +397,25 @@ cfg_print_grammar(const cfg_type_t *type,
isc_boolean_t
cfg_obj_istype(const cfg_obj_t *obj, const cfg_type_t *type);
/*%<
- * Return true iff 'obj' is of type 'type'.
+ * Return true iff 'obj' is of type 'type'.
*/
-void cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **obj);
+void
+cfg_obj_attach(cfg_obj_t *src, cfg_obj_t **dest);
+/*%<
+ * Reference a configuration object.
+ */
+
+void
+cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **obj);
/*%<
- * Destroy a configuration object.
+ * Delete a reference to a configuration object; destroy the object if
+ * there are no more references.
*/
void
cfg_obj_log(const cfg_obj_t *obj, isc_log_t *lctx, int level,
- const char *fmt, ...)
+ const char *fmt, ...)
ISC_FORMAT_PRINTF(4, 5);
/*%<
* Log a message concerning configuration object 'obj' to the logging
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h b/contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h
new file mode 100644
index 0000000..bb71338
--- /dev/null
+++ b/contrib/bind9/lib/isccfg/include/isccfg/dnsconf.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: dnsconf.h,v 1.3 2009-09-02 23:48:03 tbox Exp $ */
+
+#ifndef ISCCFG_NAMEDCONF_H
+#define ISCCFG_NAMEDCONF_H 1
+
+/*! \file
+ * \brief
+ * This module defines the named.conf, rndc.conf, and rndc.key grammars.
+ */
+
+#include <isccfg/cfg.h>
+
+/*
+ * Configuration object types.
+ */
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_dnsconf;
+/*%< A complete dns.conf file. */
+
+#endif /* ISCCFG_CFG_H */
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/grammar.h b/contrib/bind9/lib/isccfg/include/isccfg/grammar.h
index b8b845b..afc95bc 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/grammar.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/grammar.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: grammar.h,v 1.17 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: grammar.h,v 1.24 2011-01-04 23:47:14 tbox Exp $ */
#ifndef ISCCFG_GRAMMAR_H
#define ISCCFG_GRAMMAR_H 1
@@ -53,6 +53,8 @@
#define CFG_CLAUSEFLAG_CALLBACK 0x00000020
/*% A option that is only used in testing. */
#define CFG_CLAUSEFLAG_TESTONLY 0x00000040
+/*% A configuration option that was not configured at compile time. */
+#define CFG_CLAUSEFLAG_NOTCONFIGURED 0x00000080
typedef struct cfg_clausedef cfg_clausedef_t;
typedef struct cfg_tuplefielddef cfg_tuplefielddef_t;
@@ -157,6 +159,7 @@ struct cfg_obj {
isc_sockaddr_t sockaddr;
cfg_netprefix_t netprefix;
} value;
+ isc_refcount_t references; /*%< reference counter */
const char * file;
unsigned int line;
};
@@ -210,10 +213,21 @@ struct cfg_parser {
*/
unsigned int line;
+ /*%
+ * Parser context flags, used for maintaining state
+ * from one token to the next.
+ */
+ unsigned int flags;
+
+ /*%< Reference counter */
+ isc_refcount_t references;
+
cfg_parsecallback_t callback;
void *callbackarg;
};
+/* Parser context flags */
+#define CFG_PCTX_SKIP 0x1
/*@{*/
/*%
@@ -314,10 +328,16 @@ cfg_parse_rawport(cfg_parser_t *pctx, unsigned int flags, in_port_t *port);
isc_result_t
cfg_parse_sockaddr(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
+isc_result_t
+cfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
+
void
cfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj);
void
+cfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj);
+
+void
cfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type);
isc_result_t
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/log.h b/contrib/bind9/lib/isccfg/include/isccfg/log.h
index f45e4c2..2c9dc12 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/log.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/log.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.12.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: log.h,v 1.14 2009-01-18 23:48:14 tbox Exp $ */
#ifndef ISCCFG_LOG_H
#define ISCCFG_LOG_H 1
diff --git a/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h b/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h
index 34aa3e8..9242cf3 100644
--- a/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h
+++ b/contrib/bind9/lib/isccfg/include/isccfg/namedconf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: namedconf.h,v 1.9.332.2 2009-06-25 23:47:28 tbox Exp $ */
+/* $Id: namedconf.h,v 1.18 2010-08-11 18:14:20 each Exp $ */
#ifndef ISCCFG_NAMEDCONF_H
#define ISCCFG_NAMEDCONF_H 1
@@ -33,12 +33,24 @@
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_namedconf;
/*%< A complete named.conf file. */
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_bindkeys;
+/*%< A bind.keys file. */
+
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_newzones;
+/*%< A new-zones file (for zones added by 'rndc addzone'). */
+
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_addzoneconf;
+/*%< A single zone passed via the addzone rndc command. */
+
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_rndcconf;
/*%< A complete rndc.conf file. */
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_rndckey;
/*%< A complete rndc.key file. */
+LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_sessionkey;
+/*%< A complete session.key file. */
+
LIBISCCFG_EXTERNAL_DATA extern cfg_type_t cfg_type_keyref;
/*%< A key reference, used as an ACL element */
diff --git a/contrib/bind9/lib/isccfg/namedconf.c b/contrib/bind9/lib/isccfg/namedconf.c
index f291507..f80d34b 100644
--- a/contrib/bind9/lib/isccfg/namedconf.c
+++ b/contrib/bind9/lib/isccfg/namedconf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008, 2010 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: namedconf.c,v 1.92.44.2 2010-05-13 23:47:49 tbox Exp $ */
+/* $Id: namedconf.c,v 1.131.8.1 2011-02-03 05:50:08 marka Exp $ */
/*! \file */
@@ -24,6 +24,7 @@
#include <string.h>
#include <isc/lex.h>
+#include <isc/mem.h>
#include <isc/result.h>
#include <isc/string.h>
#include <isc/util.h>
@@ -35,9 +36,9 @@
#define TOKEN_STRING(pctx) (pctx->token.value.as_textregion.base)
/*% Check a return value. */
-#define CHECK(op) \
- do { result = (op); \
- if (result != ISC_R_SUCCESS) goto cleanup; \
+#define CHECK(op) \
+ do { result = (op); \
+ if (result != ISC_R_SUCCESS) goto cleanup; \
} while (0)
/*% Clean up a configuration object if non-NULL. */
@@ -57,7 +58,17 @@ static isc_result_t
parse_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
static isc_result_t
-parse_optional_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret);
+parse_optional_keyvalue(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret);
+
+static isc_result_t
+parse_updatepolicy(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret);
+static void
+print_updatepolicy(cfg_printer_t *pctx, const cfg_obj_t *obj);
+
+static void
+doc_updatepolicy(cfg_printer_t *pctx, const cfg_type_t *type);
static void
print_keyvalue(cfg_printer_t *pctx, const cfg_obj_t *obj);
@@ -111,6 +122,7 @@ static cfg_type_t cfg_type_zone;
static cfg_type_t cfg_type_zoneopts;
static cfg_type_t cfg_type_dynamically_loadable_zones;
static cfg_type_t cfg_type_dynamically_loadable_zones_opts;
+static cfg_type_t cfg_type_v4_aaaa;
/*
* Clauses that can be found in a 'dynamically loadable zones' statement
@@ -241,30 +253,76 @@ static cfg_tuplefielddef_t pubkey_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_pubkey = {
- "pubkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, pubkey_fields };
+ "pubkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, pubkey_fields };
/*%
* A list of RR types, used in grant statements.
* Note that the old parser allows quotes around the RR type names.
*/
static cfg_type_t cfg_type_rrtypelist = {
- "rrtypelist", cfg_parse_spacelist, cfg_print_spacelist, cfg_doc_terminal,
- &cfg_rep_list, &cfg_type_astring
+ "rrtypelist", cfg_parse_spacelist, cfg_print_spacelist,
+ cfg_doc_terminal, &cfg_rep_list, &cfg_type_astring
};
static const char *mode_enums[] = { "grant", "deny", NULL };
static cfg_type_t cfg_type_mode = {
- "mode", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum, &cfg_rep_string,
- &mode_enums
+ "mode", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
+ &cfg_rep_string, &mode_enums
};
+static isc_result_t
+parse_matchtype(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret) {
+ isc_result_t result;
+
+ CHECK(cfg_peektoken(pctx, 0));
+ if (pctx->token.type == isc_tokentype_string &&
+ strcasecmp(TOKEN_STRING(pctx), "zonesub") == 0) {
+ pctx->flags |= CFG_PCTX_SKIP;
+ }
+ return (cfg_parse_enum(pctx, type, ret));
+
+ cleanup:
+ return (result);
+}
+
+static isc_result_t
+parse_matchname(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+ isc_result_t result;
+ cfg_obj_t *obj = NULL;
+
+ if ((pctx->flags & CFG_PCTX_SKIP) != 0) {
+ pctx->flags &= ~CFG_PCTX_SKIP;
+ CHECK(cfg_parse_void(pctx, NULL, &obj));
+ } else
+ result = cfg_parse_astring(pctx, type, &obj);
+
+ *ret = obj;
+ cleanup:
+ return (result);
+}
+
+static void
+doc_matchname(cfg_printer_t *pctx, const cfg_type_t *type) {
+ cfg_print_chars(pctx, "[ ", 2);
+ cfg_doc_obj(pctx, type->of);
+ cfg_print_chars(pctx, " ]", 2);
+}
+
static const char *matchtype_enums[] = {
"name", "subdomain", "wildcard", "self", "selfsub", "selfwild",
"krb5-self", "ms-self", "krb5-subdomain", "ms-subdomain",
- "tcp-self", "6to4-self", NULL };
+ "tcp-self", "6to4-self", "zonesub", "external", NULL };
+
static cfg_type_t cfg_type_matchtype = {
- "matchtype", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum, &cfg_rep_string,
- &matchtype_enums
+ "matchtype", parse_matchtype, cfg_print_ustring,
+ cfg_doc_enum, &cfg_rep_string, &matchtype_enums
+};
+
+static cfg_type_t cfg_type_matchname = {
+ "optional_matchname", parse_matchname, cfg_print_ustring,
+ &doc_matchname, &cfg_rep_tuple, &cfg_type_ustring
};
/*%
@@ -274,18 +332,70 @@ static cfg_tuplefielddef_t grant_fields[] = {
{ "mode", &cfg_type_mode, 0 },
{ "identity", &cfg_type_astring, 0 }, /* domain name */
{ "matchtype", &cfg_type_matchtype, 0 },
- { "name", &cfg_type_astring, 0 }, /* domain name */
+ { "name", &cfg_type_matchname, 0 }, /* domain name */
{ "types", &cfg_type_rrtypelist, 0 },
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_grant = {
- "grant", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, grant_fields };
+ "grant", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, grant_fields
+};
static cfg_type_t cfg_type_updatepolicy = {
- "update_policy", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list,
- &cfg_rep_list, &cfg_type_grant
+ "update_policy", parse_updatepolicy, print_updatepolicy,
+ doc_updatepolicy, &cfg_rep_list, &cfg_type_grant
};
+static isc_result_t
+parse_updatepolicy(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret) {
+ isc_result_t result;
+ CHECK(cfg_gettoken(pctx, 0));
+ if (pctx->token.type == isc_tokentype_special &&
+ pctx->token.value.as_char == '{') {
+ cfg_ungettoken(pctx);
+ return (cfg_parse_bracketed_list(pctx, type, ret));
+ }
+
+ if (pctx->token.type == isc_tokentype_string &&
+ strcasecmp(TOKEN_STRING(pctx), "local") == 0) {
+ cfg_obj_t *obj = NULL;
+ CHECK(cfg_create_obj(pctx, &cfg_type_ustring, &obj));
+ obj->value.string.length = strlen("local");
+ obj->value.string.base = isc_mem_get(pctx->mctx,
+ obj->value.string.length + 1);
+ if (obj->value.string.base == NULL) {
+ isc_mem_put(pctx->mctx, obj, sizeof(*obj));
+ return (ISC_R_NOMEMORY);
+ }
+ memcpy(obj->value.string.base, "local", 5);
+ obj->value.string.base[5] = '\0';
+ *ret = obj;
+ return (ISC_R_SUCCESS);
+ }
+
+ cfg_ungettoken(pctx);
+ return (ISC_R_UNEXPECTEDTOKEN);
+
+ cleanup:
+ return (result);
+}
+
+static void
+print_updatepolicy(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ if (cfg_obj_isstring(obj))
+ cfg_print_ustring(pctx, obj);
+ else
+ cfg_print_bracketed_list(pctx, obj);
+}
+
+static void
+doc_updatepolicy(cfg_printer_t *pctx, const cfg_type_t *type) {
+ cfg_print_cstr(pctx, "( local | { ");
+ cfg_doc_obj(pctx, type->of);
+ cfg_print_cstr(pctx, "; ... }");
+}
+
/*%
* A view statement.
*/
@@ -296,7 +406,9 @@ static cfg_tuplefielddef_t view_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_view = {
- "view", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, view_fields };
+ "view", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, view_fields
+};
/*%
* A zone statement.
@@ -308,7 +420,9 @@ static cfg_tuplefielddef_t zone_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_zone = {
- "zone", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, zone_fields };
+ "zone", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, zone_fields
+};
/*%
* A "category" clause in the "logging" statement.
@@ -319,13 +433,15 @@ static cfg_tuplefielddef_t category_fields[] = {
{ NULL, NULL, 0 }
};
static cfg_type_t cfg_type_category = {
- "category", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, category_fields };
+ "category", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, category_fields
+};
/*%
- * A trusted key, as used in the "trusted-keys" statement.
+ * A dnssec key, as used in the "trusted-keys" statement.
*/
-static cfg_tuplefielddef_t trustedkey_fields[] = {
+static cfg_tuplefielddef_t dnsseckey_fields[] = {
{ "name", &cfg_type_astring, 0 },
{ "flags", &cfg_type_uint32, 0 },
{ "protocol", &cfg_type_uint32, 0 },
@@ -333,9 +449,27 @@ static cfg_tuplefielddef_t trustedkey_fields[] = {
{ "key", &cfg_type_qstring, 0 },
{ NULL, NULL, 0 }
};
-static cfg_type_t cfg_type_trustedkey = {
- "trustedkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple,
- trustedkey_fields
+static cfg_type_t cfg_type_dnsseckey = {
+ "dnsseckey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, dnsseckey_fields
+};
+
+/*%
+ * A managed key initialization specifier, as used in the
+ * "managed-keys" statement.
+ */
+static cfg_tuplefielddef_t managedkey_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "init", &cfg_type_ustring, 0 }, /* must be literal "initial-key" */
+ { "flags", &cfg_type_uint32, 0 },
+ { "protocol", &cfg_type_uint32, 0 },
+ { "algorithm", &cfg_type_uint32, 0 },
+ { "key", &cfg_type_qstring, 0 },
+ { NULL, NULL, 0 }
+};
+static cfg_type_t cfg_type_managedkey = {
+ "managedkey", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, managedkey_fields
};
static keyword_type_t wild_class_kw = { "class", &cfg_type_ustring };
@@ -397,6 +531,7 @@ static cfg_tuplefielddef_t checknames_fields[] = {
{ "mode", &cfg_type_checkmode, 0 },
{ NULL, NULL, 0 }
};
+
static cfg_type_t cfg_type_checknames = {
"checknames", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple,
checknames_fields
@@ -407,6 +542,13 @@ static cfg_type_t cfg_type_bracketed_sockaddrlist = {
&cfg_rep_list, &cfg_type_sockaddr
};
+static const char *autodnssec_enums[] = { "allow", "maintain", "create",
+ "off", NULL };
+static cfg_type_t cfg_type_autodnssec = {
+ "autodnssec", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
+ &cfg_rep_string, &autodnssec_enums
+};
+
static cfg_type_t cfg_type_rrsetorder = {
"rrsetorder", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list,
&cfg_rep_list, &cfg_type_rrsetorderingelement
@@ -421,13 +563,27 @@ static cfg_type_t cfg_type_optional_port = {
/*% A list of keys, as in the "key" clause of the controls statement. */
static cfg_type_t cfg_type_keylist = {
- "keylist", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list, &cfg_rep_list,
- &cfg_type_astring
+ "keylist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_astring
+};
+
+/*% A list of dnssec keys, as in "trusted-keys" */
+static cfg_type_t cfg_type_dnsseckeys = {
+ "dnsseckeys", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_dnsseckey
};
-static cfg_type_t cfg_type_trustedkeys = {
- "trusted-keys", cfg_parse_bracketed_list, cfg_print_bracketed_list, cfg_doc_bracketed_list, &cfg_rep_list,
- &cfg_type_trustedkey
+/*%
+ * A list of managed key entries, as in "trusted-keys". Currently
+ * (9.7.0) this has a format similar to dnssec keys, except the keyname
+ * is followed by the keyword "initial-key". In future releases, this
+ * keyword may take other values indicating different methods for the
+ * key to be initialized.
+ */
+
+static cfg_type_t cfg_type_managedkeys = {
+ "managedkeys", cfg_parse_bracketed_list, cfg_print_bracketed_list,
+ cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_managedkey
};
static const char *forwardtype_enums[] = { "first", "only", NULL };
@@ -437,7 +593,8 @@ static cfg_type_t cfg_type_forwardtype = {
};
static const char *zonetype_enums[] = {
- "master", "slave", "stub", "hint", "forward", "delegation-only", NULL };
+ "master", "slave", "stub", "static-stub", "hint", "forward",
+ "delegation-only", NULL };
static cfg_type_t cfg_type_zonetype = {
"zonetype", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
&cfg_rep_string, &zonetype_enums
@@ -479,6 +636,7 @@ parse_qstringornone(cfg_parser_t *pctx, const cfg_type_t *type,
cfg_obj_t **ret)
{
isc_result_t result;
+
CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
if (pctx->token.type == isc_tokentype_string &&
strcasecmp(TOKEN_STRING(pctx), "none") == 0)
@@ -496,13 +654,65 @@ doc_qstringornone(cfg_printer_t *pctx, const cfg_type_t *type) {
}
static cfg_type_t cfg_type_qstringornone = {
- "qstringornone", parse_qstringornone, NULL, doc_qstringornone, NULL, NULL };
+ "qstringornone", parse_qstringornone, NULL, doc_qstringornone,
+ NULL, NULL
+};
/*%
- * keyword hostname
+ * A boolean ("yes" or "no"), or the special keyword "auto".
+ * Used in the dnssec-validation option.
*/
+static void
+print_auto(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ UNUSED(obj);
+ cfg_print_cstr(pctx, "auto");
+}
+
+static cfg_type_t cfg_type_auto = {
+ "auto", NULL, print_auto, NULL, &cfg_rep_void, NULL
+};
+
+static isc_result_t
+parse_boolorauto(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret)
+{
+ isc_result_t result;
+
+ CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
+ if (pctx->token.type == isc_tokentype_string &&
+ strcasecmp(TOKEN_STRING(pctx), "auto") == 0)
+ return (cfg_create_obj(pctx, &cfg_type_auto, ret));
+ cfg_ungettoken(pctx);
+ return (cfg_parse_boolean(pctx, type, ret));
+ cleanup:
+ return (result);
+}
static void
+print_boolorauto(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+ if (obj->type->rep == &cfg_rep_void)
+ cfg_print_chars(pctx, "auto", 4);
+ else if (obj->value.boolean)
+ cfg_print_chars(pctx, "yes", 3);
+ else
+ cfg_print_chars(pctx, "no", 2);
+}
+
+static void
+doc_boolorauto(cfg_printer_t *pctx, const cfg_type_t *type) {
+ UNUSED(type);
+ cfg_print_cstr(pctx, "( yes | no | auto )");
+}
+
+static cfg_type_t cfg_type_boolorauto = {
+ "boolorauto", parse_boolorauto, print_boolorauto,
+ doc_boolorauto, NULL, NULL
+};
+
+/*%
+ * keyword hostname
+ */
+static void
print_hostname(cfg_printer_t *pctx, const cfg_obj_t *obj) {
UNUSED(obj);
cfg_print_cstr(pctx, "hostname");
@@ -652,7 +862,18 @@ namedconf_or_view_clauses[] = {
/* only 1 DLZ per view allowed */
{ "dlz", &cfg_type_dynamically_loadable_zones, 0 },
{ "server", &cfg_type_server, CFG_CLAUSEFLAG_MULTI },
- { "trusted-keys", &cfg_type_trustedkeys, CFG_CLAUSEFLAG_MULTI },
+ { "trusted-keys", &cfg_type_dnsseckeys, CFG_CLAUSEFLAG_MULTI },
+ { "managed-keys", &cfg_type_managedkeys, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+
+/*%
+ * Clauses that can occur in the bind.keys file.
+ */
+static cfg_clausedef_t
+bindkeys_clauses[] = {
+ { "trusted-keys", &cfg_type_dnsseckeys, CFG_CLAUSEFLAG_MULTI },
+ { "managed-keys", &cfg_type_managedkeys, CFG_CLAUSEFLAG_MULTI },
{ NULL, NULL, 0 }
};
@@ -661,18 +882,21 @@ namedconf_or_view_clauses[] = {
*/
static cfg_clausedef_t
options_clauses[] = {
- { "use-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
- { "use-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "avoid-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "avoid-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
+ { "bindkeys-file", &cfg_type_qstring, 0 },
{ "blackhole", &cfg_type_bracketed_aml, 0 },
{ "coresize", &cfg_type_size, 0 },
{ "datasize", &cfg_type_size, 0 },
+ { "session-keyfile", &cfg_type_qstringornone, 0 },
+ { "session-keyname", &cfg_type_astring, 0 },
+ { "session-keyalg", &cfg_type_astring, 0 },
{ "deallocate-on-exit", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "directory", &cfg_type_qstring, CFG_CLAUSEFLAG_CALLBACK },
{ "dump-file", &cfg_type_qstring, 0 },
{ "fake-iquery", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "files", &cfg_type_size, 0 },
+ { "flush-zones-on-shutdown", &cfg_type_boolean, 0 },
{ "has-old-clients", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "heartbeat-interval", &cfg_type_uint32, 0 },
{ "host-statistics", &cfg_type_boolean, CFG_CLAUSEFLAG_NOTIMP },
@@ -681,6 +905,7 @@ options_clauses[] = {
{ "interface-interval", &cfg_type_uint32, 0 },
{ "listen-on", &cfg_type_listenon, CFG_CLAUSEFLAG_MULTI },
{ "listen-on-v6", &cfg_type_listenon, CFG_CLAUSEFLAG_MULTI },
+ { "managed-keys-directory", &cfg_type_qstring, 0 },
{ "match-mapped-addresses", &cfg_type_boolean, 0 },
{ "memstatistics-file", &cfg_type_qstring, 0 },
{ "memstatistics", &cfg_type_boolean, 0 },
@@ -693,6 +918,7 @@ options_clauses[] = {
{ "random-device", &cfg_type_qstring, 0 },
{ "recursive-clients", &cfg_type_uint32, 0 },
{ "reserved-sockets", &cfg_type_uint32, 0 },
+ { "secroots-file", &cfg_type_qstring, 0 },
{ "serial-queries", &cfg_type_uint32, CFG_CLAUSEFLAG_OBSOLETE },
{ "serial-query-rate", &cfg_type_uint32, 0 },
{ "server-id", &cfg_type_serverid, 0 },
@@ -703,6 +929,7 @@ options_clauses[] = {
{ "tcp-listen-queue", &cfg_type_uint32, 0 },
{ "tkey-dhkey", &cfg_type_tkey_dhkey, 0 },
{ "tkey-gssapi-credential", &cfg_type_qstring, 0 },
+ { "tkey-gssapi-keytab", &cfg_type_qstring, 0 },
{ "tkey-domain", &cfg_type_qstring, 0 },
{ "transfers-per-ns", &cfg_type_uint32, 0 },
{ "transfers-in", &cfg_type_uint32, 0 },
@@ -710,12 +937,12 @@ options_clauses[] = {
{ "treat-cr-as-space", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "use-id-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "use-ixfr", &cfg_type_boolean, 0 },
+ { "use-v4-udp-ports", &cfg_type_bracketed_portlist, 0 },
+ { "use-v6-udp-ports", &cfg_type_bracketed_portlist, 0 },
{ "version", &cfg_type_qstringornone, 0 },
- { "flush-zones-on-shutdown", &cfg_type_boolean, 0 },
{ NULL, NULL, 0 }
};
-
static cfg_type_t cfg_type_namelist = {
"namelist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_qstring };
@@ -726,6 +953,34 @@ static cfg_type_t cfg_type_optional_exclude = {
"optional_exclude", parse_optional_keyvalue, print_keyvalue,
doc_optional_keyvalue, &cfg_rep_list, &exclude_kw };
+static keyword_type_t exceptionnames_kw = { "except-from", &cfg_type_namelist };
+
+static cfg_type_t cfg_type_optional_exceptionnames = {
+ "optional_allow", parse_optional_keyvalue, print_keyvalue,
+ doc_optional_keyvalue, &cfg_rep_list, &exceptionnames_kw };
+
+static cfg_tuplefielddef_t denyaddresses_fields[] = {
+ { "acl", &cfg_type_bracketed_aml, 0 },
+ { "except-from", &cfg_type_optional_exceptionnames, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_type_t cfg_type_denyaddresses = {
+ "denyaddresses", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, denyaddresses_fields
+};
+
+static cfg_tuplefielddef_t denyaliases_fields[] = {
+ { "name", &cfg_type_namelist, 0 },
+ { "except-from", &cfg_type_optional_exceptionnames, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_type_t cfg_type_denyaliases = {
+ "denyaliases", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, denyaliases_fields
+};
+
static cfg_type_t cfg_type_algorithmlist = {
"algorithmlist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_astring };
@@ -758,20 +1013,134 @@ static cfg_type_t cfg_type_masterformat = {
&cfg_rep_string, &masterformat_enums
};
+
+
+/*
+ * response-policy {
+ * zone <string> [ policy (given|no-op|nxdomain|nodata|cname <domain> ) ];
+ * };
+ *
+ * this is a chimera of doc_optional_keyvalue() and cfg_doc_enum()
+ */
+static void
+doc_rpz_policies(cfg_printer_t *pctx, const cfg_type_t *type) {
+ const keyword_type_t *kw;
+ const char * const *p;
+
+ kw = type->of;
+ cfg_print_chars(pctx, "[ ", 2);
+ cfg_print_cstr(pctx, kw->name);
+ cfg_print_chars(pctx, " ", 1);
+
+ cfg_print_chars(pctx, "( ", 2);
+ for (p = kw->type->of; *p != NULL; p++) {
+ cfg_print_cstr(pctx, *p);
+ if (p[1] != NULL)
+ cfg_print_chars(pctx, " | ", 3);
+ }
+}
+
+/*
+ * print_qstring() from parser.c
+ */
+static void
+print_rpz_cname(cfg_printer_t *pctx, const cfg_obj_t *obj)
+{
+ cfg_print_chars(pctx, "\"", 1);
+ cfg_print_ustring(pctx, obj);
+ cfg_print_chars(pctx, "\"", 1);
+}
+
+static void
+doc_rpz_cname(cfg_printer_t *pctx, const cfg_type_t *type) {
+ cfg_doc_terminal(pctx, type);
+ cfg_print_chars(pctx, " ) ]", 4);
+}
+
+static isc_result_t
+parse_rpz(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+ isc_result_t result;
+ cfg_obj_t *obj = NULL;
+ const cfg_tuplefielddef_t *fields = type->of;
+
+ CHECK(cfg_create_tuple(pctx, type, &obj));
+ CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
+ CHECK(cfg_parse_obj(pctx, fields[1].type, &obj->value.tuple[1]));
+ /*
+ * parse cname domain only after "policy cname"
+ */
+ if (cfg_obj_isvoid(obj->value.tuple[1]) ||
+ strcasecmp("cname", cfg_obj_asstring(obj->value.tuple[1]))) {
+ CHECK(cfg_parse_void(pctx, NULL, &obj->value.tuple[2]));
+ } else {
+ CHECK(cfg_parse_obj(pctx, fields[2].type, &obj->value.tuple[2]));
+ }
+
+ *ret = obj;
+ return (ISC_R_SUCCESS);
+
+cleanup:
+ CLEANUP_OBJ(obj);
+ return (result);
+}
+
+static const char *rpz_policies[] = {
+ "given", "no-op", "nxdomain", "nodata", "cname", NULL
+};
+static cfg_type_t cfg_type_rpz_policylist = {
+ "policies", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum,
+ &cfg_rep_string, &rpz_policies
+};
+static keyword_type_t rpz_policies_kw = {
+ "policy", &cfg_type_rpz_policylist
+};
+static cfg_type_t cfg_type_rpz_policy = {
+ "optional_policy", parse_optional_keyvalue, print_keyvalue,
+ doc_rpz_policies, &cfg_rep_string, &rpz_policies_kw
+};
+static cfg_type_t cfg_type_cname = {
+ "domain", cfg_parse_astring, print_rpz_cname, doc_rpz_cname,
+ &cfg_rep_string, NULL
+};
+static cfg_tuplefielddef_t rpzone_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "policy", &cfg_type_rpz_policy, 0 },
+ { "cname", &cfg_type_cname, 0 },
+ { NULL, NULL, 0 }
+};
+static cfg_type_t cfg_type_rpzone = {
+ "rpzone", parse_rpz, cfg_print_tuple, cfg_doc_tuple,
+ &cfg_rep_tuple, rpzone_fields
+};
+static cfg_clausedef_t rpz_clauses[] = {
+ { "zone", &cfg_type_rpzone, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+static cfg_clausedef_t *rpz_clausesets[] = {
+ rpz_clauses,
+ NULL
+};
+static cfg_type_t cfg_type_rpz = {
+ "rpz", cfg_parse_map, cfg_print_map, cfg_doc_map,
+ &cfg_rep_map, rpz_clausesets
+};
+
+
+
/*%
* dnssec-lookaside
*/
static keyword_type_t trustanchor_kw = { "trust-anchor", &cfg_type_astring };
-static cfg_type_t cfg_type_trustanchor = {
- "trust-anchor", parse_keyvalue, print_keyvalue, doc_keyvalue,
- &cfg_rep_string, &trustanchor_kw
+static cfg_type_t cfg_type_optional_trustanchor = {
+ "optional_trustanchor", parse_optional_keyvalue, print_keyvalue,
+ doc_keyvalue, &cfg_rep_string, &trustanchor_kw
};
static cfg_tuplefielddef_t lookaside_fields[] = {
{ "domain", &cfg_type_astring, 0 },
- { "trust-anchor", &cfg_type_trustanchor, 0 },
+ { "trust-anchor", &cfg_type_optional_trustanchor, 0 },
{ NULL, NULL, 0 }
};
@@ -780,6 +1149,31 @@ static cfg_type_t cfg_type_lookaside = {
&cfg_rep_tuple, lookaside_fields
};
+/*
+ * DNS64.
+ */
+static cfg_clausedef_t
+dns64_clauses[] = {
+ { "clients", &cfg_type_bracketed_aml, 0 },
+ { "mapped", &cfg_type_bracketed_aml, 0 },
+ { "exclude", &cfg_type_bracketed_aml, 0 },
+ { "suffix", &cfg_type_netaddr6, 0 },
+ { "recursive-only", &cfg_type_boolean, 0 },
+ { "break-dnssec", &cfg_type_boolean, 0 },
+ { NULL, NULL, 0 },
+};
+
+static cfg_clausedef_t *
+dns64_clausesets[] = {
+ dns64_clauses,
+ NULL
+};
+
+static cfg_type_t cfg_type_dns64 = {
+ "dns64", cfg_parse_netprefix_map, cfg_print_map, cfg_doc_map,
+ &cfg_rep_map, dns64_clausesets
+};
+
/*%
* Clauses that can be found within the 'view' statement,
* with defaults in the 'options' statement.
@@ -791,26 +1185,33 @@ view_clauses[] = {
{ "acache-enable", &cfg_type_boolean, 0 },
{ "additional-from-auth", &cfg_type_boolean, 0 },
{ "additional-from-cache", &cfg_type_boolean, 0 },
+ { "allow-new-zones", &cfg_type_boolean, 0 },
{ "allow-query-cache", &cfg_type_bracketed_aml, 0 },
{ "allow-query-cache-on", &cfg_type_bracketed_aml, 0 },
{ "allow-recursion", &cfg_type_bracketed_aml, 0 },
{ "allow-recursion-on", &cfg_type_bracketed_aml, 0 },
{ "allow-v6-synthesis", &cfg_type_bracketed_aml,
CFG_CLAUSEFLAG_OBSOLETE },
+ { "attach-cache", &cfg_type_astring, 0 },
{ "auth-nxdomain", &cfg_type_boolean, CFG_CLAUSEFLAG_NEWDEFAULT },
{ "cache-file", &cfg_type_qstring, 0 },
{ "check-names", &cfg_type_checknames, CFG_CLAUSEFLAG_MULTI },
{ "cleaning-interval", &cfg_type_uint32, 0 },
{ "clients-per-query", &cfg_type_uint32, 0 },
+ { "deny-answer-addresses", &cfg_type_denyaddresses, 0 },
+ { "deny-answer-aliases", &cfg_type_denyaliases, 0 },
{ "disable-algorithms", &cfg_type_disablealgorithm,
CFG_CLAUSEFLAG_MULTI },
{ "disable-empty-zone", &cfg_type_astring, CFG_CLAUSEFLAG_MULTI },
+ { "dns64", &cfg_type_dns64, CFG_CLAUSEFLAG_MULTI },
+ { "dns64-server", &cfg_type_astring, 0 },
+ { "dns64-contact", &cfg_type_astring, 0 },
{ "dnssec-accept-expired", &cfg_type_boolean, 0 },
{ "dnssec-enable", &cfg_type_boolean, 0 },
{ "dnssec-lookaside", &cfg_type_lookaside, CFG_CLAUSEFLAG_MULTI },
{ "dnssec-must-be-secure", &cfg_type_mustbesecure,
CFG_CLAUSEFLAG_MULTI },
- { "dnssec-validation", &cfg_type_boolean, 0 },
+ { "dnssec-validation", &cfg_type_boolorauto, 0 },
{ "dual-stack-servers", &cfg_type_nameportiplist, 0 },
{ "edns-udp-size", &cfg_type_uint32, 0 },
{ "empty-contact", &cfg_type_astring, 0 },
@@ -841,6 +1242,7 @@ view_clauses[] = {
{ "recursion", &cfg_type_boolean, 0 },
{ "request-ixfr", &cfg_type_boolean, 0 },
{ "request-nsid", &cfg_type_boolean, 0 },
+ { "resolver-query-timeout", &cfg_type_uint32, 0 },
{ "rfc2308-type1", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI },
{ "root-delegation-only", &cfg_type_optional_exclude, 0 },
{ "rrset-order", &cfg_type_rrsetorder, 0 },
@@ -850,6 +1252,16 @@ view_clauses[] = {
{ "transfer-format", &cfg_type_transferformat, 0 },
{ "use-queryport-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 },
+#ifdef ALLOW_FILTER_AAAA_ON_V4
+ { "filter-aaaa", &cfg_type_bracketed_aml, 0 },
+ { "filter-aaaa-on-v4", &cfg_type_v4_aaaa, 0 },
+#else
+ { "filter-aaaa", &cfg_type_bracketed_aml,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+ { "filter-aaaa-on-v4", &cfg_type_v4_aaaa,
+ CFG_CLAUSEFLAG_NOTCONFIGURED },
+#endif
+ { "response-policy", &cfg_type_rpz, 0 },
{ NULL, NULL, 0 }
};
@@ -920,6 +1332,7 @@ zone_clauses[] = {
{ "also-notify", &cfg_type_portiplist, 0 },
{ "alt-transfer-source", &cfg_type_sockaddr4wild, 0 },
{ "alt-transfer-source-v6", &cfg_type_sockaddr6wild, 0 },
+ { "check-dup-records", &cfg_type_checkmode, 0 },
{ "check-integrity", &cfg_type_boolean, 0 },
{ "check-mx", &cfg_type_checkmode, 0 },
{ "check-mx-cname", &cfg_type_checkmode, 0 },
@@ -927,6 +1340,8 @@ zone_clauses[] = {
{ "check-srv-cname", &cfg_type_checkmode, 0 },
{ "check-wildcard", &cfg_type_boolean, 0 },
{ "dialup", &cfg_type_dialuptype, 0 },
+ { "dnssec-dnskey-kskonly", &cfg_type_boolean, 0 },
+ { "dnssec-secure-to-insecure", &cfg_type_boolean, 0 },
{ "forward", &cfg_type_forwardtype, 0 },
{ "forwarders", &cfg_type_portiplist, 0 },
{ "key-directory", &cfg_type_qstring, 0 },
@@ -986,6 +1401,9 @@ zone_only_clauses[] = {
*/
{ "check-names", &cfg_type_checkmode, 0 },
{ "ixfr-from-differences", &cfg_type_boolean, 0 },
+ { "auto-dnssec", &cfg_type_autodnssec, 0 },
+ { "server-addresses", &cfg_type_bracketed_sockaddrlist, 0 },
+ { "server-names", &cfg_type_namelist, 0 },
{ NULL, NULL, 0 }
};
@@ -998,12 +1416,40 @@ namedconf_clausesets[] = {
namedconf_or_view_clauses,
NULL
};
-
LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_namedconf = {
"namedconf", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
&cfg_rep_map, namedconf_clausesets
};
+/*% The bind.keys syntax (trusted-keys/managed-keys only). */
+static cfg_clausedef_t *
+bindkeys_clausesets[] = {
+ bindkeys_clauses,
+ NULL
+};
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_bindkeys = {
+ "bindkeys", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, bindkeys_clausesets
+};
+
+/*% The new-zone-file syntax (for zones added by 'rndc addzone') */
+static cfg_clausedef_t
+newzones_clauses[] = {
+ { "zone", &cfg_type_zone, CFG_CLAUSEFLAG_MULTI },
+ { NULL, NULL, 0 }
+};
+
+static cfg_clausedef_t *
+newzones_clausesets[] = {
+ newzones_clauses,
+ NULL
+};
+
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_newzones = {
+ "newzones", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, newzones_clausesets
+};
+
/*% The "options" statement syntax. */
static cfg_clausedef_t *
@@ -1166,6 +1612,38 @@ static cfg_type_t cfg_type_logging = {
"logging", cfg_parse_map, cfg_print_map, cfg_doc_map, &cfg_rep_map, logging_clausesets };
+/*%
+ * For parsing an 'addzone' statement
+ */
+
+static cfg_tuplefielddef_t addzone_fields[] = {
+ { "name", &cfg_type_astring, 0 },
+ { "class", &cfg_type_optional_class, 0 },
+ { "view", &cfg_type_optional_class, 0 },
+ { "options", &cfg_type_zoneopts, 0 },
+ { NULL, NULL, 0 }
+};
+static cfg_type_t cfg_type_addzone = {
+ "addzone", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, &cfg_rep_tuple, addzone_fields };
+
+static cfg_clausedef_t
+addzoneconf_clauses[] = {
+ { "addzone", &cfg_type_addzone, 0 },
+ { NULL, NULL, 0 }
+};
+
+static cfg_clausedef_t *
+addzoneconf_clausesets[] = {
+ addzoneconf_clauses,
+ NULL
+};
+
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_addzoneconf = {
+ "addzoneconf", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, addzoneconf_clausesets
+};
+
+
static isc_result_t
parse_unitstring(char *str, isc_resourcevalue_t *valuep) {
char *endp;
@@ -1385,6 +1863,17 @@ static cfg_type_t cfg_type_ixfrdifftype = {
&cfg_rep_string, ixfrdiff_enums,
};
+static const char *v4_aaaa_enums[] = { "break-dnssec", NULL };
+static isc_result_t
+parse_v4_aaaa(cfg_parser_t *pctx, const cfg_type_t *type,
+ cfg_obj_t **ret) {
+ return (parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
+}
+static cfg_type_t cfg_type_v4_aaaa = {
+ "v4_aaaa", parse_v4_aaaa, cfg_print_ustring,
+ doc_enum_or_other, &cfg_rep_string, v4_aaaa_enums,
+};
+
static keyword_type_t key_kw = { "key", &cfg_type_astring };
LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_keyref = {
@@ -2082,6 +2571,15 @@ LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_rndckey = {
&cfg_rep_map, rndckey_clausesets
};
+/*
+ * session.key has exactly the same syntax as rndc.key, but it's defined
+ * separately for clarity (and so we can extend it someday, if needed).
+ */
+LIBISCCFG_EXTERNAL_DATA cfg_type_t cfg_type_sessionkey = {
+ "sessionkey", cfg_parse_mapbody, cfg_print_mapbody, cfg_doc_mapbody,
+ &cfg_rep_map, rndckey_clausesets
+};
+
static cfg_tuplefielddef_t nameport_fields[] = {
{ "name", &cfg_type_astring, 0 },
{ "port", &cfg_type_optional_port, 0 },
diff --git a/contrib/bind9/lib/isccfg/parser.c b/contrib/bind9/lib/isccfg/parser.c
index 2f64a09..87ad391 100644
--- a/contrib/bind9/lib/isccfg/parser.c
+++ b/contrib/bind9/lib/isccfg/parser.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: parser.c,v 1.129 2008-09-25 04:02:39 tbox Exp $ */
+/* $Id: parser.c,v 1.139 2011-01-04 23:47:14 tbox Exp $ */
/*! \file */
@@ -29,12 +29,12 @@
#include <isc/mem.h>
#include <isc/net.h>
#include <isc/netaddr.h>
+#include <isc/netscope.h>
#include <isc/print.h>
#include <isc/string.h>
#include <isc/sockaddr.h>
-#include <isc/netscope.h>
-#include <isc/util.h>
#include <isc/symtab.h>
+#include <isc/util.h>
#include <isccfg/cfg.h>
#include <isccfg/grammar.h>
@@ -387,6 +387,12 @@ cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
if (pctx == NULL)
return (ISC_R_NOMEMORY);
+ result = isc_refcount_init(&pctx->references, 1);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, pctx, sizeof(*pctx));
+ return (result);
+ }
+
pctx->mctx = mctx;
pctx->lctx = lctx;
pctx->lexer = NULL;
@@ -400,6 +406,7 @@ cfg_parser_create(isc_mem_t *mctx, isc_log_t *lctx, cfg_parser_t **ret) {
pctx->callback = NULL;
pctx->callbackarg = NULL;
pctx->token.type = isc_tokentype_unknown;
+ pctx->flags = 0;
memset(specials, 0, sizeof(specials));
specials['{'] = 1;
@@ -526,17 +533,30 @@ cfg_parse_buffer(cfg_parser_t *pctx, isc_buffer_t *buffer,
}
void
+cfg_parser_attach(cfg_parser_t *src, cfg_parser_t **dest) {
+ REQUIRE(src != NULL);
+ REQUIRE(dest != NULL && *dest == NULL);
+ isc_refcount_increment(&src->references, NULL);
+ *dest = src;
+}
+
+void
cfg_parser_destroy(cfg_parser_t **pctxp) {
cfg_parser_t *pctx = *pctxp;
- isc_lex_destroy(&pctx->lexer);
- /*
- * Cleaning up open_files does not
- * close the files; that was already done
- * by closing the lexer.
- */
- CLEANUP_OBJ(pctx->open_files);
- CLEANUP_OBJ(pctx->closed_files);
- isc_mem_put(pctx->mctx, pctx, sizeof(*pctx));
+ unsigned int refs;
+
+ isc_refcount_decrement(&pctx->references, &refs);
+ if (refs == 0) {
+ isc_lex_destroy(&pctx->lexer);
+ /*
+ * Cleaning up open_files does not
+ * close the files; that was already done
+ * by closing the lexer.
+ */
+ CLEANUP_OBJ(pctx->open_files);
+ CLEANUP_OBJ(pctx->closed_files);
+ isc_mem_put(pctx->mctx, pctx, sizeof(*pctx));
+ }
*pctxp = NULL;
}
@@ -848,8 +868,8 @@ cfg_obj_asboolean(const cfg_obj_t *obj) {
return (obj->value.boolean);
}
-static isc_result_t
-parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
+isc_result_t
+cfg_parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
{
isc_result_t result;
isc_boolean_t value;
@@ -888,8 +908,8 @@ parse_boolean(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
return (result);
}
-static void
-print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
+void
+cfg_print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
if (obj->value.boolean)
cfg_print_chars(pctx, "yes", 3);
else
@@ -897,7 +917,7 @@ print_boolean(cfg_printer_t *pctx, const cfg_obj_t *obj) {
}
cfg_type_t cfg_type_boolean = {
- "boolean", parse_boolean, print_boolean, cfg_doc_terminal,
+ "boolean", cfg_parse_boolean, cfg_print_boolean, cfg_doc_terminal,
&cfg_rep_boolean, NULL
};
@@ -1132,7 +1152,7 @@ cfg_list_length(const cfg_obj_t *obj, isc_boolean_t recurse) {
return (count);
}
-const cfg_obj_t *
+cfg_obj_t *
cfg_listelt_value(const cfg_listelt_t *elt) {
REQUIRE(elt != NULL);
return (elt->obj);
@@ -1237,6 +1257,14 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
if ((clause->flags & CFG_CLAUSEFLAG_NYI) != 0)
cfg_parser_warning(pctx, 0, "option '%s' is "
"not implemented", clause->name);
+
+ if ((clause->flags & CFG_CLAUSEFLAG_NOTCONFIGURED) != 0) {
+ cfg_parser_warning(pctx, 0, "option '%s' is not "
+ "configured", clause->name);
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
/*
* Don't log options with CFG_CLAUSEFLAG_NEWDEFAULT
* set here - we need to log the *lack* of such an option,
@@ -1478,6 +1506,7 @@ static struct flagtext {
{ CFG_CLAUSEFLAG_OBSOLETE, "obsolete" },
{ CFG_CLAUSEFLAG_NEWDEFAULT, "default changed" },
{ CFG_CLAUSEFLAG_TESTONLY, "test only" },
+ { CFG_CLAUSEFLAG_NOTCONFIGURED, "not configured" },
{ 0, NULL }
};
@@ -2305,6 +2334,7 @@ cfg_obj_line(const cfg_obj_t *obj) {
isc_result_t
cfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
+ isc_result_t result;
cfg_obj_t *obj;
obj = isc_mem_get(pctx->mctx, sizeof(cfg_obj_t));
@@ -2313,10 +2343,16 @@ cfg_create_obj(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
obj->type = type;
obj->file = current_file(pctx);
obj->line = pctx->line;
+ result = isc_refcount_init(&obj->references, 1);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
+ return (result);
+ }
*ret = obj;
return (ISC_R_SUCCESS);
}
+
static void
map_symtabitem_destroy(char *key, unsigned int type,
isc_symvalue_t symval, void *userarg)
@@ -2370,11 +2406,25 @@ cfg_obj_istype(const cfg_obj_t *obj, const cfg_type_t *type) {
void
cfg_obj_destroy(cfg_parser_t *pctx, cfg_obj_t **objp) {
cfg_obj_t *obj = *objp;
- obj->type->rep->free(pctx, obj);
- isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
+ unsigned int refs;
+
+ isc_refcount_decrement(&obj->references, &refs);
+ if (refs == 0) {
+ obj->type->rep->free(pctx, obj);
+ isc_refcount_destroy(&obj->references);
+ isc_mem_put(pctx->mctx, obj, sizeof(cfg_obj_t));
+ }
*objp = NULL;
}
+void
+cfg_obj_attach(cfg_obj_t *src, cfg_obj_t **dest) {
+ REQUIRE(src != NULL);
+ REQUIRE(dest != NULL && *dest == NULL);
+ isc_refcount_increment(&src->references, NULL);
+ *dest = src;
+}
+
static void
free_noop(cfg_parser_t *pctx, cfg_obj_t *obj) {
UNUSED(pctx);
diff --git a/contrib/bind9/lib/lwres/api b/contrib/bind9/lib/lwres/api
index fbbf923..94575eb 100644
--- a/contrib/bind9/lib/lwres/api
+++ b/contrib/bind9/lib/lwres/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 50
-LIBREVISION = 3
+LIBINTERFACE = 80
+LIBREVISION = 0
LIBAGE = 0
diff --git a/contrib/bind9/lib/lwres/context.c b/contrib/bind9/lib/lwres/context.c
index 1310022..e8f0eda 100644
--- a/contrib/bind9/lib/lwres/context.c
+++ b/contrib/bind9/lib/lwres/context.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: context.c,v 1.50.332.5 2009-09-01 23:47:05 tbox Exp $ */
+/* $Id: context.c,v 1.55 2009-09-02 23:48:03 tbox Exp $ */
/*! \file context.c
lwres_context_create() creates a #lwres_context_t structure for use in
diff --git a/contrib/bind9/lib/lwres/context_p.h b/contrib/bind9/lib/lwres/context_p.h
index 663b1da..0976951 100644
--- a/contrib/bind9/lib/lwres/context_p.h
+++ b/contrib/bind9/lib/lwres/context_p.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: context_p.h,v 1.17.332.2 2008-12-30 23:46:49 tbox Exp $ */
+/* $Id: context_p.h,v 1.19 2008-12-17 23:47:58 tbox Exp $ */
#ifndef LWRES_CONTEXT_P_H
#define LWRES_CONTEXT_P_H 1
diff --git a/contrib/bind9/lib/lwres/getaddrinfo.c b/contrib/bind9/lib/lwres/getaddrinfo.c
index 665205a..81534fc 100644
--- a/contrib/bind9/lib/lwres/getaddrinfo.c
+++ b/contrib/bind9/lib/lwres/getaddrinfo.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* This code is derived from software contributed to ISC by
@@ -18,7 +18,7 @@
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: getaddrinfo.c,v 1.52.254.2 2009-03-31 23:47:16 tbox Exp $ */
+/* $Id: getaddrinfo.c,v 1.54 2008-11-25 23:47:23 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/getipnode.c b/contrib/bind9/lib/lwres/getipnode.c
index b9eadee..bc90c74 100644
--- a/contrib/bind9/lib/lwres/getipnode.c
+++ b/contrib/bind9/lib/lwres/getipnode.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: getipnode.c,v 1.42.332.5 2009-09-01 23:47:05 tbox Exp $ */
+/* $Id: getipnode.c,v 1.47 2009-09-01 23:47:45 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/include/lwres/context.h b/contrib/bind9/lib/lwres/include/lwres/context.h
index 46be27a..2421b57 100644
--- a/contrib/bind9/lib/lwres/include/lwres/context.h
+++ b/contrib/bind9/lib/lwres/include/lwres/context.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: context.h,v 1.21.332.2 2008-12-30 23:46:49 tbox Exp $ */
+/* $Id: context.h,v 1.23 2008-12-17 23:47:58 tbox Exp $ */
#ifndef LWRES_CONTEXT_H
#define LWRES_CONTEXT_H 1
diff --git a/contrib/bind9/lib/lwres/include/lwres/netdb.h.in b/contrib/bind9/lib/lwres/include/lwres/netdb.h.in
index 7531ca3..8eedd27 100644
--- a/contrib/bind9/lib/lwres/include/lwres/netdb.h.in
+++ b/contrib/bind9/lib/lwres/include/lwres/netdb.h.in
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netdb.h.in,v 1.39.332.2 2009-01-18 23:47:41 tbox Exp $ */
+/* $Id: netdb.h.in,v 1.41 2009-01-18 23:48:14 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/lwconfig.c b/contrib/bind9/lib/lwres/lwconfig.c
index 356c106..764ff2a 100644
--- a/contrib/bind9/lib/lwres/lwconfig.c
+++ b/contrib/bind9/lib/lwres/lwconfig.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwconfig.c,v 1.46.332.2 2008-12-30 23:46:49 tbox Exp $ */
+/* $Id: lwconfig.c,v 1.48 2008-12-17 23:47:58 tbox Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/lwres/man/lwres.3 b/contrib/bind9/lib/lwres/man/lwres.3
index 77f96b6..c2c0bb6 100644
--- a/contrib/bind9/lib/lwres/man/lwres.3
+++ b/contrib/bind9/lib/lwres/man/lwres.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres.html b/contrib/bind9/lib/lwres/man/lwres.html
index 3844c01..6cfb750 100644
--- a/contrib/bind9/lib/lwres/man/lwres.html
+++ b/contrib/bind9/lib/lwres/man/lwres.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres.html,v 1.24.484.1 2011-06-09 03:41:05 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres &#8212; introduction to the lightweight resolver library</p>
@@ -32,7 +32,7 @@
<div class="funcsynopsis"><pre class="funcsynopsisinfo">#include &lt;lwres/lwres.h&gt;</pre></div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543348"></a><h2>DESCRIPTION</h2>
+<a name="id2543346"></a><h2>DESCRIPTION</h2>
<p>
The BIND 9 lightweight resolver library is a simple, name service
independent stub resolver library. It provides hostname-to-address
@@ -47,7 +47,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543361"></a><h2>OVERVIEW</h2>
+<a name="id2543358"></a><h2>OVERVIEW</h2>
<p>
The lwresd library implements multiple name service APIs.
The standard
@@ -101,7 +101,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543425"></a><h2>CLIENT-SIDE LOW-LEVEL API CALL FLOW</h2>
+<a name="id2543422"></a><h2>CLIENT-SIDE LOW-LEVEL API CALL FLOW</h2>
<p>
When a client program wishes to make an lwres request using the
native low-level API, it typically performs the following
@@ -149,7 +149,7 @@
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543573"></a><h2>SERVER-SIDE LOW-LEVEL API CALL FLOW</h2>
+<a name="id2543571"></a><h2>SERVER-SIDE LOW-LEVEL API CALL FLOW</h2>
<p>
When implementing the server side of the lightweight resolver
protocol using the lwres library, a sequence of actions like the
@@ -191,7 +191,7 @@
<p></p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543656"></a><h2>SEE ALSO</h2>
+<a name="id2543654"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_gethostent</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getipnode</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_buffer.3 b/contrib/bind9/lib/lwres/man/lwres_buffer.3
index 89b9b65..0fc5225 100644
--- a/contrib/bind9/lib/lwres/man/lwres_buffer.3
+++ b/contrib/bind9/lib/lwres/man/lwres_buffer.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_buffer.3,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_buffer.3,v 1.27 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_buffer.html b/contrib/bind9/lib/lwres/man/lwres_buffer.html
index 7f3934a..b7e034f 100644
--- a/contrib/bind9/lib/lwres/man/lwres_buffer.html
+++ b/contrib/bind9/lib/lwres/man/lwres_buffer.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_buffer.html,v 1.21.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_buffer.html,v 1.22.484.1 2011-06-09 03:41:05 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem &#8212; lightweight resolver buffer management</p>
@@ -262,7 +262,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543892"></a><h2>DESCRIPTION</h2>
+<a name="id2543890"></a><h2>DESCRIPTION</h2>
<p>
These functions provide bounds checked access to a region of memory
where data is being read or written.
diff --git a/contrib/bind9/lib/lwres/man/lwres_config.3 b/contrib/bind9/lib/lwres/man/lwres_config.3
index 5b8a728..0ea1320 100644
--- a/contrib/bind9/lib/lwres/man/lwres_config.3
+++ b/contrib/bind9/lib/lwres/man/lwres_config.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_config.3,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_config.3,v 1.27 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_config.html b/contrib/bind9/lib/lwres/man/lwres_config.html
index 2cee5ef..8c330a3 100644
--- a/contrib/bind9/lib/lwres/man/lwres_config.html
+++ b/contrib/bind9/lib/lwres/man/lwres_config.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_config.html,v 1.22.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_config.html,v 1.23.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get &#8212; lightweight resolver configuration</p>
@@ -90,7 +90,7 @@ lwres_conf_t *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543441"></a><h2>DESCRIPTION</h2>
+<a name="id2543438"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_conf_init()</code>
creates an empty
<span class="type">lwres_conf_t</span>
@@ -123,7 +123,7 @@ lwres_conf_t *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543508"></a><h2>RETURN VALUES</h2>
+<a name="id2543506"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_conf_parse()</code>
returns <span class="errorcode">LWRES_R_SUCCESS</span>
if it successfully read and parsed
@@ -142,13 +142,13 @@ lwres_conf_t *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543545"></a><h2>SEE ALSO</h2>
+<a name="id2543543"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">stdio</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">resolver</span>(5)</span>.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543571"></a><h2>FILES</h2>
+<a name="id2543569"></a><h2>FILES</h2>
<p><code class="filename">/etc/resolv.conf</code>
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_context.3 b/contrib/bind9/lib/lwres/man/lwres_context.3
index a96a075..fdcaf55 100644
--- a/contrib/bind9/lib/lwres/man/lwres_context.3
+++ b/contrib/bind9/lib/lwres/man/lwres_context.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_context.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_context.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_context.html b/contrib/bind9/lib/lwres/man/lwres_context.html
index d525a4b..50d5d9f 100644
--- a/contrib/bind9/lib/lwres/man/lwres_context.html
+++ b/contrib/bind9/lib/lwres/man/lwres_context.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_context.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_context.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv &#8212; lightweight resolver context management</p>
@@ -172,7 +172,7 @@ void *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543531"></a><h2>DESCRIPTION</h2>
+<a name="id2543529"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_context_create()</code>
creates a <span class="type">lwres_context_t</span> structure for use in
lightweight resolver operations. It holds a socket and other
@@ -258,7 +258,7 @@ void *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543719"></a><h2>RETURN VALUES</h2>
+<a name="id2543717"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_context_create()</code>
returns <span class="errorcode">LWRES_R_NOMEMORY</span> if memory for
the <span class="type">struct lwres_context</span> could not be allocated,
@@ -283,7 +283,7 @@ void *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543769"></a><h2>SEE ALSO</h2>
+<a name="id2543767"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_conf_init</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">malloc</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_gabn.3 b/contrib/bind9/lib/lwres/man/lwres_gabn.3
index 28ea7e1..769c952 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gabn.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gabn.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gabn.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gabn.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gabn.html b/contrib/bind9/lib/lwres/man/lwres_gabn.html
index b69f432..32b5f21 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gabn.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gabn.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gabn.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gabn.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free &#8212; lightweight resolver getaddrbyname message handling</p>
@@ -178,7 +178,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543522"></a><h2>DESCRIPTION</h2>
+<a name="id2543520"></a><h2>DESCRIPTION</h2>
<p>
These are low-level routines for creating and parsing
lightweight resolver name-to-address lookup request and
@@ -278,7 +278,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543667"></a><h2>RETURN VALUES</h2>
+<a name="id2543665"></a><h2>RETURN VALUES</h2>
<p>
The getaddrbyname opcode functions
<code class="function">lwres_gabnrequest_render()</code>,
@@ -316,7 +316,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543733"></a><h2>SEE ALSO</h2>
+<a name="id2543731"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_packet</span>(3)</span>
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3 b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3
index 3d80727..2527896 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gai_strerror.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gai_strerror.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html
index 616eebe..9ff330b 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gai_strerror.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gai_strerror.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gai_strerror &#8212; print suitable error string</p>
@@ -42,7 +42,7 @@ char *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543361"></a><h2>DESCRIPTION</h2>
+<a name="id2543358"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_gai_strerror()</code>
returns an error message corresponding to an error code returned by
<code class="function">getaddrinfo()</code>.
@@ -110,7 +110,7 @@ char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543576"></a><h2>SEE ALSO</h2>
+<a name="id2543574"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">strerror</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getaddrinfo</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3 b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3
index 2953f3b..cfc4aec 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getaddrinfo.3,v 1.31.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getaddrinfo.3,v 1.32 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html
index 013e878..d367f51 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getaddrinfo.html,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getaddrinfo.html,v 1.28.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getaddrinfo, lwres_freeaddrinfo &#8212; socket address structure to host and service name</p>
@@ -89,7 +89,7 @@ struct addrinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543412"></a><h2>DESCRIPTION</h2>
+<a name="id2543410"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_getaddrinfo()</code>
is used to get a list of IP addresses and port numbers for host
<em class="parameter"><code>hostname</code></em> and service
@@ -283,7 +283,7 @@ struct addrinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543789"></a><h2>RETURN VALUES</h2>
+<a name="id2543787"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_getaddrinfo()</code>
returns zero on success or one of the error codes listed in
<span class="citerefentry"><span class="refentrytitle">gai_strerror</span>(3)</span>
@@ -294,7 +294,7 @@ struct addrinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543827"></a><h2>SEE ALSO</h2>
+<a name="id2542118"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getaddrinfo</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_gethostent.3 b/contrib/bind9/lib/lwres/man/lwres_gethostent.3
index 35ea1c2..7acc506 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gethostent.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gethostent.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gethostent.3,v 1.29.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gethostent.3,v 1.30 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gethostent.html b/contrib/bind9/lib/lwres/man/lwres_gethostent.html
index fd27dcf..fdaa062 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gethostent.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gethostent.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gethostent.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gethostent.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r &#8212; lightweight resolver get network host entry</p>
@@ -228,7 +228,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543608"></a><h2>DESCRIPTION</h2>
+<a name="id2543606"></a><h2>DESCRIPTION</h2>
<p>
These functions provide hostname-to-address and
address-to-hostname lookups by means of the lightweight resolver.
@@ -366,7 +366,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543959"></a><h2>RETURN VALUES</h2>
+<a name="id2543957"></a><h2>RETURN VALUES</h2>
<p>
The functions
<code class="function">lwres_gethostbyname()</code>,
@@ -430,7 +430,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544193"></a><h2>SEE ALSO</h2>
+<a name="id2544190"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">gethostent</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_getipnode</span>(3)</span>,
@@ -439,7 +439,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2544227"></a><h2>BUGS</h2>
+<a name="id2544225"></a><h2>BUGS</h2>
<p><code class="function">lwres_gethostbyname()</code>,
<code class="function">lwres_gethostbyname2()</code>,
<code class="function">lwres_gethostbyaddr()</code>
diff --git a/contrib/bind9/lib/lwres/man/lwres_getipnode.3 b/contrib/bind9/lib/lwres/man/lwres_getipnode.3
index b46e78f..40ba59c 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getipnode.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getipnode.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getipnode.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getipnode.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getipnode.html b/contrib/bind9/lib/lwres/man/lwres_getipnode.html
index 20c6d30..9f54cb6 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getipnode.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getipnode.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getipnode.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getipnode.html,v 1.26.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent &#8212; lightweight resolver nodename / address translation API</p>
@@ -98,7 +98,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543431"></a><h2>DESCRIPTION</h2>
+<a name="id2543429"></a><h2>DESCRIPTION</h2>
<p>
These functions perform thread safe, protocol independent
nodename-to-address and address-to-nodename
@@ -217,7 +217,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543689"></a><h2>RETURN VALUES</h2>
+<a name="id2543687"></a><h2>RETURN VALUES</h2>
<p>
If an error occurs,
<code class="function">lwres_getipnodebyname()</code>
@@ -261,7 +261,7 @@ struct hostent {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543786"></a><h2>SEE ALSO</h2>
+<a name="id2543784"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">RFC2553</span></span>,
<span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>,
diff --git a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3 b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3
index 3a75efb..5674fb2 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getnameinfo.3,v 1.29.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getnameinfo.3,v 1.30 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html
index fb7837f..1048543 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getnameinfo.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getnameinfo.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getnameinfo &#8212; lightweight resolver socket address structure to hostname and
@@ -82,7 +82,7 @@ int
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543393"></a><h2>DESCRIPTION</h2>
+<a name="id2543390"></a><h2>DESCRIPTION</h2>
<p>
This function is equivalent to the
<span class="citerefentry"><span class="refentrytitle">getnameinfo</span>(3)</span> function defined in RFC2133.
@@ -149,13 +149,13 @@ int
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543534"></a><h2>RETURN VALUES</h2>
+<a name="id2543532"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_getnameinfo()</code>
returns 0 on success or a non-zero error code if an error occurs.
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543546"></a><h2>SEE ALSO</h2>
+<a name="id2543544"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">RFC2133</span></span>,
<span class="citerefentry"><span class="refentrytitle">getservbyport</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>,
@@ -165,7 +165,7 @@ int
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543604"></a><h2>BUGS</h2>
+<a name="id2543602"></a><h2>BUGS</h2>
<p>
RFC2133 fails to define what the nonzero return values of
<span class="citerefentry"><span class="refentrytitle">getnameinfo</span>(3)</span>
diff --git a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3 b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3
index c804e11..2aa1a9c 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3
+++ b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_getrrsetbyname.3,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_getrrsetbyname.3,v 1.26 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html
index 9d9dc04..3a7fb9f 100644
--- a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html
+++ b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_getrrsetbyname.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_getrrsetbyname.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_getrrsetbyname, lwres_freerrset &#8212; retrieve DNS records</p>
@@ -102,7 +102,7 @@ struct rrsetinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543414"></a><h2>DESCRIPTION</h2>
+<a name="id2543412"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_getrrsetbyname()</code>
gets a set of resource records associated with a
<em class="parameter"><code>hostname</code></em>, <em class="parameter"><code>class</code></em>,
@@ -150,7 +150,7 @@ struct rrsetinfo {
<p></p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543526"></a><h2>RETURN VALUES</h2>
+<a name="id2543524"></a><h2>RETURN VALUES</h2>
<p><code class="function">lwres_getrrsetbyname()</code>
returns zero on success, and one of the following error codes if
an error occurred:
@@ -184,7 +184,7 @@ struct rrsetinfo {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543626"></a><h2>SEE ALSO</h2>
+<a name="id2543624"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres</span>(3)</span>.
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_gnba.3 b/contrib/bind9/lib/lwres/man/lwres_gnba.3
index b34fc05..ad9d627 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gnba.3
+++ b/contrib/bind9/lib/lwres/man/lwres_gnba.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_gnba.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_gnba.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_gnba.html b/contrib/bind9/lib/lwres/man/lwres_gnba.html
index 158f4d0..8c7691e 100644
--- a/contrib/bind9/lib/lwres/man/lwres_gnba.html
+++ b/contrib/bind9/lib/lwres/man/lwres_gnba.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_gnba.html,v 1.24.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_gnba.html,v 1.25.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free &#8212; lightweight resolver getnamebyaddress message handling</p>
@@ -183,7 +183,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543525"></a><h2>DESCRIPTION</h2>
+<a name="id2543523"></a><h2>DESCRIPTION</h2>
<p>
These are low-level routines for creating and parsing
lightweight resolver address-to-name lookup request and
@@ -270,7 +270,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543665"></a><h2>RETURN VALUES</h2>
+<a name="id2543662"></a><h2>RETURN VALUES</h2>
<p>
The getnamebyaddr opcode functions
<code class="function">lwres_gnbarequest_render()</code>,
@@ -308,7 +308,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543731"></a><h2>SEE ALSO</h2>
+<a name="id2543729"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_packet</span>(3)</span>.
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_hstrerror.3 b/contrib/bind9/lib/lwres/man/lwres_hstrerror.3
index f65ba54..b9d5316 100644
--- a/contrib/bind9/lib/lwres/man/lwres_hstrerror.3
+++ b/contrib/bind9/lib/lwres/man/lwres_hstrerror.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_hstrerror.3,v 1.27.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_hstrerror.3,v 1.28 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_hstrerror.html b/contrib/bind9/lib/lwres/man/lwres_hstrerror.html
index d5d25ec..df1c425 100644
--- a/contrib/bind9/lib/lwres/man/lwres_hstrerror.html
+++ b/contrib/bind9/lib/lwres/man/lwres_hstrerror.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_hstrerror.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_hstrerror.html,v 1.24.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_herror, lwres_hstrerror &#8212; lightweight resolver error message generation</p>
@@ -50,7 +50,7 @@ const char *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543379"></a><h2>DESCRIPTION</h2>
+<a name="id2543377"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_herror()</code>
prints the string <em class="parameter"><code>s</code></em> on
<span class="type">stderr</span> followed by the string generated by
@@ -84,7 +84,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543497"></a><h2>RETURN VALUES</h2>
+<a name="id2543495"></a><h2>RETURN VALUES</h2>
<p>
The string <span class="errorname">Unknown resolver error</span> is returned by
<code class="function">lwres_hstrerror()</code>
@@ -94,7 +94,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543517"></a><h2>SEE ALSO</h2>
+<a name="id2543515"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">herror</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_hstrerror</span>(3)</span>.
diff --git a/contrib/bind9/lib/lwres/man/lwres_inetntop.3 b/contrib/bind9/lib/lwres/man/lwres_inetntop.3
index 6bd063a..be85906 100644
--- a/contrib/bind9/lib/lwres/man/lwres_inetntop.3
+++ b/contrib/bind9/lib/lwres/man/lwres_inetntop.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_inetntop.3,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_inetntop.3,v 1.27 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_inetntop.html b/contrib/bind9/lib/lwres/man/lwres_inetntop.html
index 8467e4b..f0ea41a 100644
--- a/contrib/bind9/lib/lwres/man/lwres_inetntop.html
+++ b/contrib/bind9/lib/lwres/man/lwres_inetntop.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_inetntop.html,v 1.23.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_inetntop.html,v 1.24.484.1 2011-06-09 03:41:06 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_net_ntop &#8212; lightweight resolver IP address presentation</p>
@@ -62,7 +62,7 @@ const char *
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543379"></a><h2>DESCRIPTION</h2>
+<a name="id2543377"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_net_ntop()</code>
converts an IP address of protocol family
<em class="parameter"><code>af</code></em> &#8212; IPv4 or IPv6 &#8212; at
@@ -80,7 +80,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543411"></a><h2>RETURN VALUES</h2>
+<a name="id2543409"></a><h2>RETURN VALUES</h2>
<p>
If successful, the function returns <em class="parameter"><code>dst</code></em>:
a pointer to a string containing the presentation format of the
@@ -93,7 +93,7 @@ const char *
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543444"></a><h2>SEE ALSO</h2>
+<a name="id2543442"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">RFC1884</span></span>,
<span class="citerefentry"><span class="refentrytitle">inet_ntop</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">errno</span>(3)</span>.
diff --git a/contrib/bind9/lib/lwres/man/lwres_noop.3 b/contrib/bind9/lib/lwres/man/lwres_noop.3
index fd05e7e..3be40b2 100644
--- a/contrib/bind9/lib/lwres/man/lwres_noop.3
+++ b/contrib/bind9/lib/lwres/man/lwres_noop.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_noop.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_noop.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_noop.html b/contrib/bind9/lib/lwres/man/lwres_noop.html
index 4a94836..8f9d402 100644
--- a/contrib/bind9/lib/lwres/man/lwres_noop.html
+++ b/contrib/bind9/lib/lwres/man/lwres_noop.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_noop.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_noop.html,v 1.26.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free &#8212; lightweight resolver no-op message handling</p>
@@ -179,7 +179,7 @@ void
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543522"></a><h2>DESCRIPTION</h2>
+<a name="id2543520"></a><h2>DESCRIPTION</h2>
<p>
These are low-level routines for creating and parsing
lightweight resolver no-op request and response messages.
@@ -270,7 +270,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543672"></a><h2>RETURN VALUES</h2>
+<a name="id2543670"></a><h2>RETURN VALUES</h2>
<p>
The no-op opcode functions
<code class="function">lwres_nooprequest_render()</code>,
@@ -309,7 +309,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543738"></a><h2>SEE ALSO</h2>
+<a name="id2543736"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_packet</span>(3)</span>
</p>
</div>
diff --git a/contrib/bind9/lib/lwres/man/lwres_packet.3 b/contrib/bind9/lib/lwres/man/lwres_packet.3
index 5c096b5..ad4a82c 100644
--- a/contrib/bind9/lib/lwres/man/lwres_packet.3
+++ b/contrib/bind9/lib/lwres/man/lwres_packet.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_packet.3,v 1.29.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_packet.3,v 1.30 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_packet.html b/contrib/bind9/lib/lwres/man/lwres_packet.html
index 096b4bb..84eafc1 100644
--- a/contrib/bind9/lib/lwres/man/lwres_packet.html
+++ b/contrib/bind9/lib/lwres/man/lwres_packet.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_packet.html,v 1.26.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_packet.html,v 1.27.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_lwpacket_renderheader, lwres_lwpacket_parseheader &#8212; lightweight resolver packet handling functions</p>
@@ -66,7 +66,7 @@ lwres_result_t
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543389"></a><h2>DESCRIPTION</h2>
+<a name="id2543387"></a><h2>DESCRIPTION</h2>
<p>
These functions rely on a
<span class="type">struct lwres_lwpacket</span>
@@ -219,7 +219,7 @@ struct lwres_lwpacket {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543706"></a><h2>RETURN VALUES</h2>
+<a name="id2543704"></a><h2>RETURN VALUES</h2>
<p>
Successful calls to
<code class="function">lwres_lwpacket_renderheader()</code> and
diff --git a/contrib/bind9/lib/lwres/man/lwres_resutil.3 b/contrib/bind9/lib/lwres/man/lwres_resutil.3
index 6e17797..04cad4e 100644
--- a/contrib/bind9/lib/lwres/man/lwres_resutil.3
+++ b/contrib/bind9/lib/lwres/man/lwres_resutil.3
@@ -13,7 +13,7 @@
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
.\" PERFORMANCE OF THIS SOFTWARE.
.\"
-.\" $Id: lwres_resutil.3,v 1.28.418.1 2009-07-11 01:55:21 tbox Exp $
+.\" $Id: lwres_resutil.3,v 1.29 2009-07-11 01:12:46 tbox Exp $
.\"
.hy 0
.ad l
diff --git a/contrib/bind9/lib/lwres/man/lwres_resutil.html b/contrib/bind9/lib/lwres/man/lwres_resutil.html
index 1d2aa76..b4de764 100644
--- a/contrib/bind9/lib/lwres/man/lwres_resutil.html
+++ b/contrib/bind9/lib/lwres/man/lwres_resutil.html
@@ -14,7 +14,7 @@
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: lwres_resutil.html,v 1.25.418.1 2009-07-11 01:55:21 tbox Exp $ -->
+<!-- $Id: lwres_resutil.html,v 1.26.484.1 2011-06-09 03:41:07 tbox Exp $ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
@@ -22,7 +22,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.71.1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="refentry" lang="en">
-<a name="id2476275"></a><div class="titlepage"></div>
+<a name="id2476267"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2>Name</h2>
<p>lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr &#8212; lightweight resolver utility functions</p>
@@ -134,7 +134,7 @@ lwres_result_t
</div>
</div>
<div class="refsect1" lang="en">
-<a name="id2543466"></a><h2>DESCRIPTION</h2>
+<a name="id2543464"></a><h2>DESCRIPTION</h2>
<p><code class="function">lwres_string_parse()</code>
retrieves a DNS-encoded string starting the current pointer of
lightweight resolver buffer <em class="parameter"><code>b</code></em>: i.e.
@@ -210,7 +210,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543605"></a><h2>RETURN VALUES</h2>
+<a name="id2543603"></a><h2>RETURN VALUES</h2>
<p>
Successful calls to
<code class="function">lwres_string_parse()</code>
@@ -248,7 +248,7 @@ typedef struct {
</p>
</div>
<div class="refsect1" lang="en">
-<a name="id2543676"></a><h2>SEE ALSO</h2>
+<a name="id2543674"></a><h2>SEE ALSO</h2>
<p><span class="citerefentry"><span class="refentrytitle">lwres_buffer</span>(3)</span>,
<span class="citerefentry"><span class="refentrytitle">lwres_gabn</span>(3)</span>.
diff --git a/contrib/bind9/lib/lwres/print_p.h b/contrib/bind9/lib/lwres/print_p.h
index e2f6ad6..ed71535 100644
--- a/contrib/bind9/lib/lwres/print_p.h
+++ b/contrib/bind9/lib/lwres/print_p.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: print_p.h,v 1.4.332.2 2010-08-16 23:45:48 tbox Exp $ */
+/* $Id: print_p.h,v 1.6 2010-08-16 23:46:52 tbox Exp $ */
#ifndef LWRES_PRINT_P_H
#define LWRES_PRINT_P_H 1
diff --git a/contrib/bind9/make/rules.in b/contrib/bind9/make/rules.in
index d848480..12c9d5f 100644
--- a/contrib/bind9/make/rules.in
+++ b/contrib/bind9/make/rules.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: rules.in,v 1.64.130.2 2009-01-10 23:46:57 tbox Exp $
+# $Id: rules.in,v 1.68 2009-09-01 18:40:25 jinmei Exp $
###
### Common Makefile rules for BIND 9.
@@ -35,6 +35,8 @@ sysconfdir = @sysconfdir@
localstatedir = @localstatedir@
mandir = @mandir@
datarootdir = @datarootdir@
+export_libdir = @export_libdir@
+export_includedir = @export_includedir@
DESTDIR =
@@ -122,7 +124,7 @@ ALL_CPPFLAGS = \
ALL_CFLAGS = ${EXT_CFLAGS} ${ALL_CPPFLAGS} ${CFLAGS} \
${ALWAYS_WARNINGS} ${STD_CWARNINGS} ${CWARNINGS}
-.c.@O@:
+@BIND9_CO_RULE@
${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c $<
SHELL = @SHELL@
@@ -134,12 +136,83 @@ PURIFY = @PURIFY@
MKDEP = ${SHELL} ${top_builddir}/make/mkdep
+###
+### This is a template compound command to build an executable binary with
+### an internal symbol table.
+### This process is tricky. We first link all objects including a tentative
+### empty symbol table, then get a tentative list of symbols from the resulting
+### binary ($@tmp0). Next, we re-link all objects, but this time with the
+### symbol table just created ($tmp@1). The set of symbols should be the same,
+### but the corresponding addresses would be changed due to the difference on
+### the size of symbol tables. So we create the symbol table and re-create the
+### objects once again. Finally, we check the symbol table embedded in the
+### final binaryis consistent with the binary itself; otherwise the process is
+### terminated.
+###
+### To minimize the overhead of creating symbol tables, the autoconf switch
+### --enable-symtable takes an argument so that the symbol table can be created
+### on a per application basis: unless the argument is set to "all", the symbol
+### table is created only when a shell (environment) variable "MAKE_SYMTABLE" is
+### set to a non-null value in the rule to build the executable binary.
+###
+### Each Makefile.in that uses this macro is expected to define "LIBS" and
+### "NOSYMLIBS"; the former includes libisc with an empty symbol table, and
+### the latter includes libisc without the definition of a symbol table.
+### The rule to make the executable binary will look like this
+### binary@EXEEXT@: ${OBJS}
+### #export MAKE_SYMTABLE="yes"; \ <- enable if symtable is always needed
+### export BASEOBJS="${OBJS}"; \
+### ${FINALBUILDCMD}
+###
+### Normally, ${LIBS} includes all necessary libraries to build the binary;
+### there are some exceptions however, where the rule lists some of the
+### necessary libraries explicitly in addition to (or instead of) ${LIBS},
+### like this:
+### binary@EXEEXT@: ${OBJS}
+### cc -o $@ ${OBJS} ${OTHERLIB1} ${OTHERLIB2} ${lIBS}
+### in order to modify such a rule to use this compound command, a separate
+### variable "LIBS0" should be deinfed for the explicitly listed libraries,
+### while making sure ${LIBS} still includes libisc. So the above rule would
+### be modified as follows:
+### binary@EXEEXT@: ${OBJS}
+### export BASEOBJS="${OBJS}"; \
+### export LIBS0="${OTHERLIB1} ${OTHERLIB2}"; \
+### ${FINALBUILDCMD}
+### See bin/check/Makefile.in for a complete example of the use of LIBS0.
+###
+FINALBUILDCMD = if [ X"${MKSYMTBL_PROGRAM}" = X -o X"$${MAKE_SYMTABLE:-${ALWAYS_MAKE_SYMTABLE}}" = X ] ; then \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@ $${BASEOBJS} $${LIBS0} ${LIBS}; \
+ else \
+ rm -f $@tmp0; \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@tmp0 $${BASEOBJS} $${LIBS0} ${LIBS} || exit 1; \
+ rm -f $@-symtbl.c $@-symtbl.@O@; \
+ ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+ -o $@-symtbl.c $@tmp0 || exit 1; \
+ $(MAKE) $@-symtbl.@O@ || exit 1; \
+ rm -f $@tmp1; \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@tmp1 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS} || exit 1; \
+ rm -f $@-symtbl.c $@-symtbl.@O@; \
+ ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+ -o $@-symtbl.c $@tmp1 || exit 1; \
+ $(MAKE) $@-symtbl.@O@ || exit 1; \
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
+ -o $@tmp2 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS}; \
+ ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
+ -o $@-symtbl2.c $@tmp2; \
+ diff $@-symtbl.c $@-symtbl2.c || exit 1;\
+ mv $@tmp2 $@; \
+ rm -f $@tmp0 $@tmp1 $@tmp2 $@-symtbl2.c; \
+ fi
+
cleandir: distclean
superclean: maintainer-clean
clean distclean maintainer-clean::
- rm -f *.@O@ *.o *.lo *.la core *.core .depend
- rm -rf .libs
+ rm -f *.@O@ *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2
+ rm -rf .depend .libs
distclean maintainer-clean::
rm -f Makefile
@@ -217,6 +290,16 @@ PDFLATEX = @PDFLATEX@
W3M = @W3M@
###
+### Script language program used to create internal symbol tables
+###
+MKSYMTBL_PROGRAM = @MKSYMTBL_PROGRAM@
+
+###
+### Switch to create internal symbol table selectively
+###
+ALWAYS_MAKE_SYMTABLE = @ALWAYS_MAKE_SYMTABLE@
+
+###
### DocBook -> HTML
### DocBook -> man page
###
diff --git a/contrib/bind9/version b/contrib/bind9/version
index f03c983..1d9fbd2 100644
--- a/contrib/bind9/version
+++ b/contrib/bind9/version
@@ -1,10 +1,10 @@
-# $Id: version,v 1.43.12.11.2.2.2.1 2011-05-27 00:19:16 each Exp $
+# $Id: version,v 1.53.8.2.2.4 2011-06-21 20:44:01 each Exp $
#
# This file must follow /bin/sh rules. It is imported directly via
# configure.
#
MAJORVER=9
-MINORVER=6
-PATCHVER=
-RELEASETYPE=-ESV
-RELEASEVER=-R4-P1
+MINORVER=8
+PATCHVER=0
+RELEASETYPE=-P
+RELEASEVER=4
diff --git a/contrib/binutils/bfd/coffcode.h b/contrib/binutils/bfd/coffcode.h
index a2aac5f..e654148 100644
--- a/contrib/binutils/bfd/coffcode.h
+++ b/contrib/binutils/bfd/coffcode.h
@@ -3240,7 +3240,7 @@ coff_compute_section_file_positions (bfd * abfd)
incremented in coff_set_section_contents. This is right for
SVR3.2. */
if (strcmp (current->name, _LIB) == 0)
- bfd_set_section_vma (abfd, current, 0);
+ (void) bfd_set_section_vma (abfd, current, 0);
#endif
previous = current;
diff --git a/contrib/binutils/bfd/opncls.c b/contrib/binutils/bfd/opncls.c
index 9e0cc26..ad22db5 100644
--- a/contrib/binutils/bfd/opncls.c
+++ b/contrib/binutils/bfd/opncls.c
@@ -231,7 +231,7 @@ bfd_fopen (const char *filename, const char *target, const char *mode, int fd)
then it may have been opened with special flags that make it
unsafe to close and reopen the file. */
if (fd == -1)
- bfd_set_cacheable (nbfd, TRUE);
+ (void) bfd_set_cacheable (nbfd, TRUE);
return nbfd;
}
diff --git a/contrib/binutils/bfd/peicode.h b/contrib/binutils/bfd/peicode.h
index 0f4858f..4ae10db 100644
--- a/contrib/binutils/bfd/peicode.h
+++ b/contrib/binutils/bfd/peicode.h
@@ -607,7 +607,7 @@ pe_ILF_make_a_section (pe_ILF_vars * vars,
bfd_set_section_flags (vars->abfd, sec, flags | extra_flags);
- bfd_set_section_alignment (vars->abfd, sec, 2);
+ (void) bfd_set_section_alignment (vars->abfd, sec, 2);
/* Check that we will not run out of space. */
BFD_ASSERT (vars->data + size < vars->bim->buffer + vars->bim->size);
diff --git a/contrib/binutils/gas/config/obj-elf.c b/contrib/binutils/gas/config/obj-elf.c
index 2f93990..12ca242 100644
--- a/contrib/binutils/gas/config/obj-elf.c
+++ b/contrib/binutils/gas/config/obj-elf.c
@@ -1636,7 +1636,7 @@ obj_elf_init_stab_section (segT seg)
/* Force the section to align to a longword boundary. Without this,
UnixWare ar crashes. */
- bfd_set_section_alignment (stdoutput, seg, 2);
+ (void) bfd_set_section_alignment (stdoutput, seg, 2);
/* Make space for this first symbol. */
p = frag_more (12);
diff --git a/contrib/binutils/gas/config/tc-arm.c b/contrib/binutils/gas/config/tc-arm.c
index 683e6ee..c48a758 100644
--- a/contrib/binutils/gas/config/tc-arm.c
+++ b/contrib/binutils/gas/config/tc-arm.c
@@ -9974,6 +9974,13 @@ do_t_rbit (void)
}
static void
+do_t_rd_rm (void)
+{
+ inst.instruction |= inst.operands[0].reg << 8;
+ inst.instruction |= inst.operands[1].reg;
+}
+
+static void
do_t_rev (void)
{
if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
@@ -14901,6 +14908,9 @@ static const struct asm_opcode insns[] =
TCE(rsb, 0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
TC3(rsbs, 0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
+ TCE(rrx, 1a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rd_rm),
+ TCE(rrxs, 1b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rd_rm),
+
#undef THUMB_VARIANT
#define THUMB_VARIANT &arm_ext_v6
TCE(cpy, 1a00000, 4600, 2, (RR, RR), rd_rm, t_cpy),
diff --git a/contrib/binutils/gas/frags.c b/contrib/binutils/gas/frags.c
index adb9b19..98ac536 100644
--- a/contrib/binutils/gas/frags.c
+++ b/contrib/binutils/gas/frags.c
@@ -146,7 +146,7 @@ frag_new (int old_frags_var_max_size
/* This will align the obstack so the next struct we allocate on it
will begin at a correct boundary. */
- obstack_finish (&frchain_now->frch_obstack);
+ (void) obstack_finish (&frchain_now->frch_obstack);
frchP = frchain_now;
know (frchP);
former_last_fragP = frchP->frch_last;
diff --git a/contrib/binutils/gas/subsegs.c b/contrib/binutils/gas/subsegs.c
index 0094764..066a2fd 100644
--- a/contrib/binutils/gas/subsegs.c
+++ b/contrib/binutils/gas/subsegs.c
@@ -67,7 +67,7 @@ subseg_change (register segT seg, register int subseg)
{
seginfo = xcalloc (1, sizeof (*seginfo));
seginfo->bfd_section = seg;
- bfd_set_section_userdata (stdoutput, seg, seginfo);
+ (void) bfd_set_section_userdata (stdoutput, seg, seginfo);
}
}
@@ -169,7 +169,7 @@ subseg_get (const char *segname, int force_new)
secptr->output_section = secptr;
seginfo = xcalloc (1, sizeof (*seginfo));
seginfo->bfd_section = secptr;
- bfd_set_section_userdata (stdoutput, secptr, seginfo);
+ (void) bfd_set_section_userdata (stdoutput, secptr, seginfo);
}
return secptr;
}
diff --git a/contrib/binutils/ld/ldexp.c b/contrib/binutils/ld/ldexp.c
index 4f1d61d..809b958 100644
--- a/contrib/binutils/ld/ldexp.c
+++ b/contrib/binutils/ld/ldexp.c
@@ -1112,9 +1112,9 @@ exp_get_fill (etree_type *tree, fill_type *def, char *name)
fill = xmalloc (4 + sizeof (*fill) - 1);
val = expld.result.value;
fill->data[0] = (val >> 24) & 0xff;
- fill->data[1] = (val >> 16) & 0xff;
- fill->data[2] = (val >> 8) & 0xff;
- fill->data[3] = (val >> 0) & 0xff;
+ __PAST_END(fill->data, 1) = (val >> 16) & 0xff;
+ __PAST_END(fill->data, 2) = (val >> 8) & 0xff;
+ __PAST_END(fill->data, 3) = (val >> 0) & 0xff;
fill->size = 4;
}
return fill;
diff --git a/contrib/binutils/ld/sysdep.h b/contrib/binutils/ld/sysdep.h
index 4c5e994..2ee2047 100644
--- a/contrib/binutils/ld/sysdep.h
+++ b/contrib/binutils/ld/sysdep.h
@@ -54,6 +54,9 @@ extern char *strrchr ();
/* for MAXPATHLEN */
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
+#ifndef __PAST_END
+# define __PAST_END(array, offset) (((typeof(*(array)) *)(array))[offset])
+#endif
#endif
#ifdef PATH_MAX
# define LD_PATHMAX PATH_MAX
diff --git a/contrib/binutils/opcodes/i386-dis.c b/contrib/binutils/opcodes/i386-dis.c
index e84d314..10de45b 100644
--- a/contrib/binutils/opcodes/i386-dis.c
+++ b/contrib/binutils/opcodes/i386-dis.c
@@ -3203,7 +3203,7 @@ ckprefix (void)
rex_used = 0;
while (1)
{
- FETCH_DATA (the_info, codep + 1);
+ (void) FETCH_DATA (the_info, codep + 1);
newrex = 0;
switch (*codep)
{
@@ -3606,7 +3606,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
insn_codep = codep;
sizeflag = priv.orig_sizeflag;
- FETCH_DATA (info, codep + 1);
+ (void) FETCH_DATA (info, codep + 1);
two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
if (((prefixes & PREFIX_FWAIT)
@@ -3628,7 +3628,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
if (*codep == 0x0f)
{
unsigned char threebyte;
- FETCH_DATA (info, codep + 2);
+ (void) FETCH_DATA (info, codep + 2);
threebyte = *++codep;
dp = &dis386_twobyte[threebyte];
need_modrm = twobyte_has_modrm[*codep];
@@ -3639,7 +3639,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
codep++;
if (dp->name == NULL && dp->op[0].bytemode == IS_3BYTE_OPCODE)
{
- FETCH_DATA (info, codep + 2);
+ (void) FETCH_DATA (info, codep + 2);
op = *codep++;
switch (threebyte)
{
@@ -3724,7 +3724,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
}
else if (need_modrm)
{
- FETCH_DATA (info, codep + 1);
+ (void) FETCH_DATA (info, codep + 1);
modrm.mod = (*codep >> 6) & 3;
modrm.reg = (*codep >> 3) & 7;
modrm.rm = *codep & 7;
@@ -4890,7 +4890,7 @@ OP_E (int bytemode, int sizeflag)
if (base == 4)
{
havesib = 1;
- FETCH_DATA (the_info, codep + 1);
+ (void) FETCH_DATA (the_info, codep + 1);
index = (*codep >> 3) & 7;
if (address_mode == mode_64bit || index != 0x4)
/* When INDEX == 0x4 in 32 bit mode, SCALE is ignored. */
@@ -5147,7 +5147,7 @@ get64 (void)
unsigned int a;
unsigned int b;
- FETCH_DATA (the_info, codep + 8);
+ (void) FETCH_DATA (the_info, codep + 8);
a = *codep++ & 0xff;
a |= (*codep++ & 0xff) << 8;
a |= (*codep++ & 0xff) << 16;
@@ -5169,7 +5169,7 @@ get32 (void)
{
bfd_signed_vma x = 0;
- FETCH_DATA (the_info, codep + 4);
+ (void) FETCH_DATA (the_info, codep + 4);
x = *codep++ & (bfd_signed_vma) 0xff;
x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
@@ -5182,7 +5182,7 @@ get32s (void)
{
bfd_signed_vma x = 0;
- FETCH_DATA (the_info, codep + 4);
+ (void) FETCH_DATA (the_info, codep + 4);
x = *codep++ & (bfd_signed_vma) 0xff;
x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
@@ -5198,7 +5198,7 @@ get16 (void)
{
int x = 0;
- FETCH_DATA (the_info, codep + 2);
+ (void) FETCH_DATA (the_info, codep + 2);
x = *codep++ & 0xff;
x |= (*codep++ & 0xff) << 8;
return x;
@@ -6018,7 +6018,7 @@ OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
{
const char *mnemonic;
- FETCH_DATA (the_info, codep + 1);
+ (void) FETCH_DATA (the_info, codep + 1);
/* AMD 3DNow! instructions are specified by an opcode suffix in the
place where an 8-bit immediate would normally go. ie. the last
byte of the instruction. */
@@ -6054,7 +6054,7 @@ OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
{
unsigned int cmp_type;
- FETCH_DATA (the_info, codep + 1);
+ (void) FETCH_DATA (the_info, codep + 1);
obufp = obuf + strlen (obuf);
cmp_type = *codep++ & 0xff;
if (cmp_type < 8)
diff --git a/contrib/dialog/CHANGES b/contrib/dialog/CHANGES
index f35790b..b839088 100644
--- a/contrib/dialog/CHANGES
+++ b/contrib/dialog/CHANGES
@@ -1,9 +1,94 @@
--- $Id: CHANGES,v 1.333 2011/03/02 10:06:37 tom Exp $
+-- $Id: CHANGES,v 1.360 2011/07/07 23:35:10 tom Exp $
-- Thomas E. Dickey <dickey@invisible-island.net>
This version of dialog was originally from a Debian snapshot. I've done this
to it:
+2011/07/07
+ + modify util.c to work better with old versions of ncurses:
+ + suppress use of wchgat() before fix in 20060715 which is needed
+ for simple shadow manipulation used here in 2011/06/30 (report
+ by xDog Walker).
+ + add a null-pointer check in dlg_print_scrolled()
+ + fix a regression in dlg_getc() introduced by changes to intercept
+ F1 for help-popup (report by xDog Walker).
+
+2011/06/30
+ + correct license statement for prgbox.c (Debian #632198).
+ + correct layout when "--colors" is used, by discounting characters in
+ the escape sequences from the column counts (report by xDog Walker).
+ + modify dlg_checklist() so that only one item in the list can
+ initially be selected (report by xDog Walker).
+ + add/use macro dlg_enter_buttoncode() to improve implementation of
+ "--nook" option (report by xDog Walker).
+ + add option "--no-nl-expand" to suppress the conversion of "\n"
+ strings into newlines (request by xDog Walker).
+ + modify LIB_CREATE symbol in makefile.in to include the library
+ dependencies such as ncurses. This is needed when dynamically
+ loading the library (report/analysis by xDog Walker).
+ + modify dlg_exit_label() to suppress the Cancel button, for
+ consistency.
+ + modify dlg_exit_label() to honor the --nook option, except when there
+ is no other button, e.g., the help-button.
+ + modify dlg_exit_buttoncode() so that it returns the proper code for
+ help-button (report by xDog Walker).
+ + correct loop limit when processing "--column-separator" (report by
+ xDog Walker).
+ + modify handling of "--version" and "--help" to ensure that they are
+ processed, and exit before widgets. Separate "--print-version"
+ from "--version", allowing its output to be interspersed with
+ widget output (report by xDog Walker).
+ + correct a few places where "--version" or "--help" options went
+ always to stdout rather than allowing redirection with the "--stderr"
+ option (report by xDog Walker).
+ + improve repainting after erasing a widget and its shadow.
+ + add "--hline" and "--hfile" options for compatibility with FreeBSD
+ dialog (request by Devin Teske).
+ + add dialog version message when opening a trace file (request by
+ xDog Walker).
+ + show filename of rc-file in traces.
+ + add piped-in data for gauge widget to traces.
+ + add entrypoints to gauge widget, for allocating, updating and freeing
+ the widget (adapted from patch by Stephen Hurd).
+ + fix a reference to freed memory in the gauge widget.
+ + fix --no-mouse option by actually closing the mouse (report by
+ xDog Walker).
+ + add sk.po from
+ http://translationproject.org/latest/dialog/
+ + limit Solaris xpg4 portability fix for redefinition of ERR to cover
+ the specific value found in <sys/regset.h>, in case an application
+ includes dialog.h after curses.h (FreeBSD #156601, report by Jaakko
+ Heinonen, Stephen Hurd).
+ + updated configure macros:
+ + CF_CURSES_CPPFLAGS,
+ + CF_CURSES_LIBS, make checks for special libraries on hpux10 and
+ sunos4 optional
+ + CF_CURSES_FUNCS, workaround for bug in gcc 4.2.1 (FreeBSD 8.1)
+ which caused part of test program to be omitted, i.e., when it saw
+ two return-statements in a row it omitted the _first_ one. Also
+ add expression to pointer check to help FreeBSD's linker decide it
+ should be validated. Just an assignment was not enough. Also, add
+ check for unctrl.h
+ + CF_CURSES_HEADER, change order for curses.h / ncurses.h pairs to
+ put ncurses.h first, which will tend to provide the same #define's
+ as in CF_NCURSES_HEADER (report by Dennis Preiser).
+ + CF_CURSES_TERM_H, modify to avoid spurious check for
+ <curses.hterm.h> if there is no ncurses version. Look for
+ ncurses's term.h anyway, to work around breakage by packagers who
+ separate ncurses' header files.
+ + CF_DISABLE_RPATH_HACK, fix garbled message
+ + CF_LD_RPATH_OPT, add mirbsd
+ + CF_MAKEFLAGS, filter out GNU make's entering/leaving messages.
+ This only appeared when using the macro in a dpkg script, though it
+ should have in other cases.
+ + CF_RPATH_HACK, add a check for libraries not found, e.g., from
+ suppressed functionality of gcc in linking from /usr/local/lib, and
+ add a -L option to help work around this.
+ + CF_XOPEN_SOURCE, workaround for cygwin to get ncurses' configure
+ script to define _XOPEN_SOURCE_EXTENDED (cygwin's features.h
+ doesn't do anything, so it needs a crutch).
+ + updated config.guess, config.sub
+
2011/03/02
+ add --prgbox and --programbox (adapted from patch by David Boyd).
+ add sl.po from
@@ -649,7 +734,7 @@ to it:
colors to be the same, provided that bold attribute is set.
Also improved the logic for choosing a background color when the
foreground and background are the same (report by Erika Pacholleck).
- + update configure script macro CF_XOPEN_SOURCE, ensuring that the
+ + updated configure script macro CF_XOPEN_SOURCE, ensuring that the
_POSIX_C_SOURCE value is defined with a specific value (bug report
originally for lynx).
+ fix configure script so that po/makefile is generated properly when
diff --git a/contrib/dialog/VERSION b/contrib/dialog/VERSION
index 0cc90f5..0462455 100644
--- a/contrib/dialog/VERSION
+++ b/contrib/dialog/VERSION
@@ -1 +1 @@
-9:0:0 1.1 20110302
+10:0:0 1.1 20110707
diff --git a/contrib/dialog/aclocal.m4 b/contrib/dialog/aclocal.m4
index 20e0fa9..159b12f 100644
--- a/contrib/dialog/aclocal.m4
+++ b/contrib/dialog/aclocal.m4
@@ -1,5 +1,5 @@
dnl macros used for DIALOG configure script
-dnl $Id: aclocal.m4,v 1.80 2011/01/18 23:17:01 tom Exp $
+dnl $Id: aclocal.m4,v 1.82 2011/06/28 22:48:31 tom Exp $
dnl ---------------------------------------------------------------------------
dnl Copyright 1999-2010,2011 -- Thomas E. Dickey
dnl
@@ -1128,7 +1128,7 @@ CF_NCURSES_VERSION
CF_CURSES_LIBS
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_CPPFLAGS version: 10 updated: 2009/01/06 19:34:11
+dnl CF_CURSES_CPPFLAGS version: 11 updated: 2011/04/09 14:51:08
dnl ------------------
dnl Look for the curses headers.
AC_DEFUN([CF_CURSES_CPPFLAGS],[
@@ -1137,13 +1137,19 @@ AC_CACHE_CHECK(for extra include directories,cf_cv_curses_incdir,[
cf_cv_curses_incdir=no
case $host_os in #(vi
hpux10.*) #(vi
- test -d /usr/include/curses_colr && \
- cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ test -d /usr/include/curses_colr && \
+ cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ fi
;;
sunos3*|sunos4*)
- test -d /usr/5lib && \
- test -d /usr/5include && \
- cf_cv_curses_incdir="-I/usr/5include"
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ test -d /usr/5lib && \
+ test -d /usr/5include && \
+ cf_cv_curses_incdir="-I/usr/5include"
+ fi
;;
esac
])
@@ -1153,7 +1159,7 @@ CF_CURSES_HEADER
CF_TERM_HEADER
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_FUNCS version: 15 updated: 2010/10/23 15:52:32
+dnl CF_CURSES_FUNCS version: 17 updated: 2011/05/14 16:07:29
dnl ---------------
dnl Curses-functions are a little complicated, since a lot of them are macros.
AC_DEFUN([CF_CURSES_FUNCS],
@@ -1161,6 +1167,7 @@ AC_DEFUN([CF_CURSES_FUNCS],
AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
AC_REQUIRE([CF_XOPEN_CURSES])
AC_REQUIRE([CF_CURSES_TERM_H])
+AC_REQUIRE([CF_CURSES_UNCTRL_H])
for cf_func in $1
do
CF_UPPER(cf_tr_func,$cf_func)
@@ -1173,7 +1180,8 @@ do
[
#ifndef ${cf_func}
long foo = (long)(&${cf_func});
-${cf_cv_main_return:-return}(foo == 0);
+if (foo + 1234 > 5678)
+ ${cf_cv_main_return:-return}(foo);
#endif
],
[cf_result=yes],
@@ -1190,7 +1198,7 @@ ${cf_cv_main_return:-return}(foo == 0);
done
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_HEADER version: 2 updated: 2010/04/28 06:02:16
+dnl CF_CURSES_HEADER version: 3 updated: 2011/05/01 19:47:45
dnl ----------------
dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
dnl variations of ncurses' installs.
@@ -1200,10 +1208,10 @@ AC_DEFUN([CF_CURSES_HEADER],[
AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[
cf_cv_ncurses_header=none
for cf_header in ifelse($1,,,[ \
- $1/curses.h \
- $1/ncurses.h]) \
- curses.h \
- ncurses.h ifelse($1,,[ncurses/curses.h ncurses/ncurses.h])
+ $1/ncurses.h \
+ $1/curses.h]) \
+ ncurses.h \
+ curses.h ifelse($1,,[ncurses/ncurses.h ncurses/curses.h])
do
AC_TRY_COMPILE([#include <${cf_header}>],
[initscr(); tgoto("?", 0,0)],
@@ -1219,7 +1227,7 @@ fi
AC_CHECK_HEADERS($cf_cv_ncurses_header)
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_LIBS version: 32 updated: 2011/01/16 17:43:15
+dnl CF_CURSES_LIBS version: 34 updated: 2011/04/09 14:51:08
dnl --------------
dnl Look for the curses libraries. Older curses implementations may require
dnl termcap/termlib to be linked as well. Call CF_CURSES_CPPFLAGS first.
@@ -1239,19 +1247,26 @@ freebsd*) #(vi
AC_CHECK_LIB(mytinfo,tgoto,[CF_ADD_LIBS(-lmytinfo)])
;;
hpux10.*) #(vi
- AC_CHECK_LIB(cur_colr,initscr,[
- CF_ADD_LIBS(-lcur_colr)
- ac_cv_func_initscr=yes
- ],[
- AC_CHECK_LIB(Hcurses,initscr,[
- # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
- CF_ADD_LIBS(-lHcurses)
- CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
- ac_cv_func_initscr=yes
- ])])
+ # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+ # next (1998), and xcurses "newer" (2000). There is no header file for
+ # Hcurses; the subdirectory curses_colr has the headers (curses.h and
+ # term.h) for cur_colr
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ AC_CHECK_LIB(cur_colr,initscr,[
+ CF_ADD_LIBS(-lcur_colr)
+ ac_cv_func_initscr=yes
+ ],[
+ AC_CHECK_LIB(Hcurses,initscr,[
+ # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+ CF_ADD_LIBS(-lHcurses)
+ CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
+ ac_cv_func_initscr=yes
+ ])])
+ fi
;;
linux*)
- case `arch` in
+ case `arch 2>/dev/null` in
x86_64)
if test -d /lib64
then
@@ -1266,9 +1281,12 @@ linux*)
esac
;;
sunos3*|sunos4*)
- if test -d /usr/5lib ; then
- CF_ADD_LIBDIR(/usr/5lib)
- CF_ADD_LIBS(-lcurses -ltermcap)
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ if test -d /usr/5lib ; then
+ CF_ADD_LIBDIR(/usr/5lib)
+ CF_ADD_LIBS(-lcurses -ltermcap)
+ fi
fi
ac_cv_func_initscr=yes
;;
@@ -1333,7 +1351,7 @@ fi
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_TERM_H version: 8 updated: 2010/10/23 15:54:49
+dnl CF_CURSES_TERM_H version: 9 updated: 2011/04/09 18:19:55
dnl ----------------
dnl SVr4 curses should have term.h as well (where it puts the definitions of
dnl the low-level interface). This may not be true in old/broken implementations,
@@ -1347,9 +1365,17 @@ AC_CACHE_CHECK(for term.h, cf_cv_term_header,[
# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
# for <term.h> if we do not find the variant.
-for cf_header in \
- `echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%/.*%/%'`term.h \
- term.h
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
do
AC_TRY_COMPILE([
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -1395,6 +1421,61 @@ ncursesw/term.h)
esac
])dnl
dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_UNCTRL_H version: 1 updated: 2011/04/09 18:19:55
+dnl ------------------
+dnl Any X/Open curses implementation must have unctrl.h, but ncurses packages
+dnl may put it in a subdirectory (along with ncurses' other headers, of
+dnl course). Packages which put the headers in inconsistent locations are
+dnl broken).
+AC_DEFUN([CF_CURSES_UNCTRL_H],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+
+AC_CACHE_CHECK(for unctrl.h, cf_cv_unctrl_header,[
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>],
+ [WINDOW *x],
+ [cf_cv_unctrl_header=$cf_header
+ break],
+ [cf_cv_unctrl_header=no])
+done
+
+case $cf_cv_unctrl_header in #(vi
+no)
+ AC_MSG_WARN(unctrl.h header not found)
+ ;;
+esac
+])
+
+case $cf_cv_unctrl_header in #(vi
+unctrl.h) #(vi
+ AC_DEFINE(HAVE_UNCTRL_H)
+ ;;
+ncurses/unctrl.h) #(vi
+ AC_DEFINE(HAVE_NCURSES_UNCTRL_H)
+ ;;
+ncursesw/unctrl.h)
+ AC_DEFINE(HAVE_NCURSESW_UNCTRL_H)
+ ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
dnl CF_CURSES_WACS_MAP version: 5 updated: 2011/01/15 11:28:59
dnl ------------------
dnl Check for likely values of wacs_map[].
@@ -1518,7 +1599,7 @@ fi
AC_SUBST(LIBTOOL_VERSION)
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_DISABLE_RPATH_HACK version: 1 updated: 2010/04/11 10:54:00
+dnl CF_DISABLE_RPATH_HACK version: 2 updated: 2011/02/13 13:31:33
dnl ---------------------
dnl The rpath-hack makes it simpler to build programs, particularly with the
dnl *BSD ports which may have essential libraries in unusual places. But it
@@ -1526,7 +1607,7 @@ dnl can interfere with building an executable for the base system. Use this
dnl option in that case.
AC_DEFUN([CF_DISABLE_RPATH_HACK],
[
-AC_MSG_CHECKING(if rpath should be not be set)
+AC_MSG_CHECKING(if rpath-hack should be disabled)
CF_ARG_DISABLE(rpath-hack,
[ --disable-rpath-hack don't add rpath options for additional libraries],
[cf_disable_rpath_hack=yes],
@@ -2256,7 +2337,7 @@ ifdef([AC_FUNC_FSEEKO],[
])
])
dnl ---------------------------------------------------------------------------
-dnl CF_LD_RPATH_OPT version: 3 updated: 2010/06/02 05:03:05
+dnl CF_LD_RPATH_OPT version: 4 updated: 2011/06/04 20:09:13
dnl ---------------
dnl For the given system and compiler, find the compiler flags to pass to the
dnl loader to use the "rpath" feature.
@@ -2277,7 +2358,7 @@ irix*) #(vi
linux*|gnu*|k*bsd*-gnu) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
-openbsd[[2-9]].*) #(vi
+openbsd[[2-9]].*|mirbsd*) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
freebsd*) #(vi
@@ -2356,7 +2437,7 @@ ifelse($1,,,[$1=$LIB_PREFIX])
AC_SUBST(LIB_PREFIX)
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_MAKEFLAGS version: 13 updated: 2010/10/23 15:52:32
+dnl CF_MAKEFLAGS version: 14 updated: 2011/03/31 19:29:46
dnl ------------
dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make'
dnl options to lower-levels. It's very useful for "make -n" -- if we have it.
@@ -2373,7 +2454,7 @@ SHELL = /bin/sh
all :
@ echo '.$cf_option'
CF_EOF
- cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | sed -e 's,[[ ]]*$,,'`
+ cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | fgrep -v "ing directory" | sed -e 's,[[ ]]*$,,'`
case "$cf_result" in
.*k)
cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`
@@ -3107,7 +3188,7 @@ $1=`echo "$2" | \
-e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'`
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_RPATH_HACK version: 8 updated: 2010/04/17 15:38:58
+dnl CF_RPATH_HACK version: 9 updated: 2011/02/13 13:31:33
dnl -------------
AC_DEFUN([CF_RPATH_HACK],
[
@@ -3120,9 +3201,36 @@ if test -n "$LD_RPATH_OPT" ; then
cf_rpath_list="/usr/lib /lib"
if test "$cf_ldd_prog" != no
then
+ cf_rpath_oops=
+
AC_TRY_LINK([#include <stdio.h>],
[printf("Hello");],
- [cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort -u`])
+ [cf_rpath_oops=`$cf_ldd_prog conftest$ac_exeext | fgrep ' not found' | sed -e 's% =>.*$%%' |sort -u`
+ cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort -u`])
+
+ # If we passed the link-test, but get a "not found" on a given library,
+ # this could be due to inept reconfiguration of gcc to make it only
+ # partly honor /usr/local/lib (or whatever). Sometimes this behavior
+ # is intentional, e.g., installing gcc in /usr/bin and suppressing the
+ # /usr/local libraries.
+ if test -n "$cf_rpath_oops"
+ then
+ for cf_rpath_src in $cf_rpath_oops
+ do
+ for cf_rpath_dir in \
+ /usr/local \
+ /usr/pkg \
+ /opt/sfw
+ do
+ if test -f $cf_rpath_dir/lib/$cf_rpath_src
+ then
+ CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src)
+ LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+ break
+ fi
+ done
+ done
+ fi
fi
CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS)
@@ -3572,7 +3680,7 @@ if test "$with_dmalloc" = yes ; then
fi
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_WITH_LIBTOOL version: 26 updated: 2010/10/23 15:55:24
+dnl CF_WITH_LIBTOOL version: 27 updated: 2011/06/28 18:45:38
dnl ---------------
dnl Provide a configure option to incorporate libtool. Define several useful
dnl symbols for the makefile rules.
@@ -3648,7 +3756,7 @@ ifdef([AC_PROG_LIBTOOL],[
AC_MSG_ERROR(Cannot find libtool)
fi
])dnl
- LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} -o'
+ LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
LIB_OBJECT='${OBJECTS:.o=.lo}'
LIB_SUFFIX=.la
LIB_CLEAN='${LIBTOOL} --mode=clean'
@@ -3842,7 +3950,7 @@ AC_TRY_LINK([
test $cf_cv_need_xopen_extension = yes && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
])dnl
dnl ---------------------------------------------------------------------------
-dnl CF_XOPEN_SOURCE version: 34 updated: 2010/05/26 05:38:42
+dnl CF_XOPEN_SOURCE version: 35 updated: 2011/02/20 20:37:37
dnl ---------------
dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
dnl or adapt to the vendor's definitions to get equivalent functionality,
@@ -3861,6 +3969,9 @@ case $host_os in #(vi
aix[[456]]*) #(vi
cf_xopen_source="-D_ALL_SOURCE"
;;
+cygwin) #(vi
+ cf_XOPEN_SOURCE=600
+ ;;
darwin[[0-8]].*) #(vi
cf_xopen_source="-D_APPLE_C_SOURCE"
;;
diff --git a/contrib/dialog/arrows.c b/contrib/dialog/arrows.c
index 65af804..6a25fd9 100644
--- a/contrib/dialog/arrows.c
+++ b/contrib/dialog/arrows.c
@@ -1,5 +1,5 @@
/*
- * $Id: arrows.c,v 1.33 2011/01/19 00:27:53 tom Exp $
+ * $Id: arrows.c,v 1.36 2011/06/27 09:13:56 tom Exp $
*
* arrows.c -- draw arrows to indicate end-of-range for lists
*
@@ -36,6 +36,10 @@
#define add_acs(win, code) waddch(win, dlg_boxchar(code))
#endif
+/* size of decorations */
+#define ON_LEFT 4
+#define ON_RIGHT 3
+
#ifdef HAVE_COLOR
static chtype
merge_colors(chtype foreground, chtype background)
@@ -59,6 +63,36 @@ merge_colors(chtype foreground, chtype background)
#define merge_colors(f,b) (f)
#endif
+/*
+ * If we have help-line text, e.g., from "--hline", draw it between the other
+ * decorations at the bottom of the dialog window.
+ */
+void
+dlg_draw_helpline(WINDOW *win, bool decorations)
+{
+ int cur_x, cur_y;
+ int bottom;
+
+ if (dialog_vars.help_line != 0
+ && (bottom = getmaxy(win) - 1) > 0) {
+ chtype attr = A_NORMAL;
+ const int *cols = dlg_index_columns(dialog_vars.help_line);
+ int other = decorations ? (ON_LEFT + ON_RIGHT) : 0;
+ int avail = (getmaxx(win) - other - 2);
+ int limit = dlg_limit_columns(dialog_vars.help_line, avail, 0);
+
+ if (limit > 0) {
+ getyx(win, cur_y, cur_x);
+ other = decorations ? ON_LEFT : 0;
+ (void) wmove(win, bottom, other + (avail - limit) / 2);
+ waddch(win, '[');
+ dlg_print_text(win, dialog_vars.help_line, cols[limit], &attr);
+ waddch(win, ']');
+ wmove(win, cur_y, cur_x);
+ }
+ }
+}
+
void
dlg_draw_arrows2(WINDOW *win,
int top_arrow,
@@ -94,7 +128,7 @@ dlg_draw_arrows2(WINDOW *win,
(void) waddstr(win, "(-)");
} else {
wattrset(win, attr);
- (void) whline(win, dlg_boxchar(ACS_HLINE), 4);
+ (void) whline(win, dlg_boxchar(ACS_HLINE), ON_LEFT);
}
}
mouse_mkbutton(top, x - 1, 6, KEY_PPAGE);
@@ -106,7 +140,7 @@ dlg_draw_arrows2(WINDOW *win,
(void) waddstr(win, "(+)");
} else {
wattrset(win, borderattr);
- (void) whline(win, dlg_boxchar(ACS_HLINE), 4);
+ (void) whline(win, dlg_boxchar(ACS_HLINE), ON_LEFT);
}
mouse_mkbutton(bottom, x - 1, 6, KEY_NPAGE);
@@ -141,6 +175,7 @@ dlg_draw_scrollbar(WINDOW *win,
getyx(win, oldy, oldx);
getmaxyx(win, maxy, maxx);
+ dlg_draw_helpline(win, TRUE);
if (bottom_arrow || top_arrow || dialog_state.use_scrollbar) {
percent = (!total_data
? 100
@@ -213,6 +248,7 @@ dlg_draw_arrows(WINDOW *win,
int top,
int bottom)
{
+ dlg_draw_helpline(win, TRUE);
dlg_draw_arrows2(win,
top_arrow,
bottom_arrow,
diff --git a/contrib/dialog/buttons.c b/contrib/dialog/buttons.c
index d82c455..0241060 100644
--- a/contrib/dialog/buttons.c
+++ b/contrib/dialog/buttons.c
@@ -1,5 +1,5 @@
/*
- * $Id: buttons.c,v 1.84 2011/01/19 00:27:53 tom Exp $
+ * $Id: buttons.c,v 1.86 2011/06/28 10:46:46 tom Exp $
*
* buttons.c -- draw buttons, e.g., OK/Cancel
*
@@ -442,16 +442,23 @@ const char **
dlg_exit_label(void)
{
const char **result;
+ DIALOG_VARS save;
if (dialog_vars.extra_button) {
+ dlg_save_vars(&save);
+ dialog_vars.nocancel = TRUE;
result = dlg_ok_labels();
+ dlg_restore_vars(&save);
} else {
static const char *labels[3];
int n = 0;
- labels[n++] = my_exit_label();
+ if (!dialog_vars.nook)
+ labels[n++] = my_exit_label();
if (dialog_vars.help_button)
labels[n++] = my_help_label();
+ if (n == 0)
+ labels[n++] = my_exit_label();
labels[n] = 0;
result = labels;
@@ -465,7 +472,17 @@ dlg_exit_label(void)
int
dlg_exit_buttoncode(int button)
{
- return dlg_ok_buttoncode(button);
+ int result;
+ DIALOG_VARS save;
+
+ dlg_save_vars(&save);
+ dialog_vars.nocancel = TRUE;
+
+ result = dlg_ok_buttoncode(button);
+
+ dlg_restore_vars(&save);
+
+ return result;
}
const char **
diff --git a/contrib/dialog/calendar.c b/contrib/dialog/calendar.c
index 3958145..45a40ab 100644
--- a/contrib/dialog/calendar.c
+++ b/contrib/dialog/calendar.c
@@ -1,5 +1,5 @@
/*
- * $Id: calendar.c,v 1.60 2011/01/03 23:29:51 tom Exp $
+ * $Id: calendar.c,v 1.62 2011/06/29 09:47:06 tom Exp $
*
* calendar.c -- implements the calendar box
*
@@ -388,6 +388,7 @@ dialog_calendar(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
@@ -571,7 +572,7 @@ dialog_calendar(const char *title,
state = sYEAR;
break;
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
break;
case DLGK_FIELD_PREV:
state = dlg_prev_ok_buttonindex(state, sMONTH);
diff --git a/contrib/dialog/checklist.c b/contrib/dialog/checklist.c
index cdefe77..4b73ceb 100644
--- a/contrib/dialog/checklist.c
+++ b/contrib/dialog/checklist.c
@@ -1,5 +1,5 @@
/*
- * $Id: checklist.c,v 1.124 2011/01/19 00:27:53 tom Exp $
+ * $Id: checklist.c,v 1.127 2011/06/29 23:04:09 tom Exp $
*
* checklist.c -- implements the checklist box
*
@@ -149,6 +149,7 @@ dlg_checklist(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
@@ -193,6 +194,24 @@ dlg_checklist(const char *title,
dlg_does_output();
dlg_tab_correct_str(prompt);
+ /*
+ * If this is a radiobutton list, ensure that no more than one item is
+ * selected initially. Allow none to be selected, since some users may
+ * wish to provide this flavor.
+ */
+ if (flag == FLAG_RADIO) {
+ bool first = TRUE;
+
+ for (i = 0; i < item_no; i++) {
+ if (items[i].state) {
+ if (first) {
+ first = FALSE;
+ } else {
+ items[i].state = 0;
+ }
+ }
+ }
+ }
#ifdef KEY_RESIZE
retry:
#endif
@@ -291,11 +310,12 @@ dlg_checklist(const char *title,
choice = max_choice - 1;
}
/* Print the list */
- for (i = 0; i < max_choice; i++)
+ for (i = 0; i < max_choice; i++) {
print_item(list,
&items[i + scrollamt],
states,
i, i == choice);
+ }
(void) wnoutrefresh(list);
/* register the new window, along with its borders */
@@ -565,7 +585,7 @@ dlg_checklist(const char *title,
if (fkey) {
switch (key) {
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
break;
case DLGK_FIELD_PREV:
button = dlg_prev_button(buttons, button);
diff --git a/contrib/dialog/columns.c b/contrib/dialog/columns.c
index 2ca5be4a..8e5620c 100644
--- a/contrib/dialog/columns.c
+++ b/contrib/dialog/columns.c
@@ -1,5 +1,5 @@
/*
- * $Id: columns.c,v 1.7 2011/01/16 21:51:44 tom Exp $
+ * $Id: columns.c,v 1.8 2011/06/28 09:26:23 tom Exp $
*
* columns.c -- implements column-alignment
*
@@ -25,7 +25,7 @@
#define each(row, data) \
row = 0, data = target; \
- row < num_rows - 1; \
+ row < num_rows; \
++row, data = next_row(data, per_row)
static char *
diff --git a/contrib/dialog/config.guess b/contrib/dialog/config.guess
index bec935b..e4b6966 100755
--- a/contrib/dialog/config.guess
+++ b/contrib/dialog/config.guess
@@ -1,10 +1,10 @@
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-# Free Software Foundation, Inc.
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2911 Free Software Foundation, Inc.
-timestamp='2010-09-24'
+timestamp='2011-01-01'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -57,8 +57,8 @@ GNU config.guess ($timestamp)
Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
-Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -92,7 +92,7 @@ if test $# != 0; then
exit 1
fi
-trap 'exit 1' HUP INT TERM
+trap 'exit 1' 1 2 15
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
@@ -106,7 +106,7 @@ trap 'exit 1' HUP INT TERM
set_cc_for_build='
trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
: ${TMPDIR=/tmp} ;
{ tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
@@ -270,7 +270,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit ;;
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
@@ -326,8 +329,8 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
sparc) echo sparc-icl-nx7; exit ;;
esac ;;
s390x:SunOS:*:*)
- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;;
@@ -495,7 +498,7 @@ EOF
else
echo i586-dg-dgux${UNAME_RELEASE}
fi
- exit ;;
+ exit ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit ;;
@@ -820,8 +823,8 @@ EOF
echo x86_64-unknown-interix${UNAME_RELEASE}
exit ;;
IA64)
- echo ia64-unknown-interix${UNAME_RELEASE}
- exit ;;
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
esac ;;
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
echo i${UNAME_MACHINE}-pc-mks
@@ -934,14 +937,14 @@ EOF
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
or32:Linux:*:*)
- echo or32-unknown-linux-gnu
- exit ;;
+ echo or32-unknown-linux-gnu
+ exit ;;
padre:Linux:*:*)
echo sparc-unknown-linux-gnu
exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
- exit ;;
+ echo hppa64-unknown-linux-gnu
+ exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
diff --git a/contrib/dialog/config.sub b/contrib/dialog/config.sub
index de11910..7c62c34 100755
--- a/contrib/dialog/config.sub
+++ b/contrib/dialog/config.sub
@@ -2,9 +2,9 @@
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-# Free Software Foundation, Inc.
+# 2011 Free Software Foundation, Inc.
-timestamp='2010-09-11'
+timestamp='2011-04-01'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -76,8 +76,8 @@ version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
-Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -175,10 +175,10 @@ case $os in
os=-chorusos
basic_machine=$1
;;
- -chorusrdb)
- os=-chorusrdb
+ -chorusrdb)
+ os=-chorusrdb
basic_machine=$1
- ;;
+ ;;
-hiux*)
os=-hiuxwe2
;;
@@ -283,12 +283,13 @@ case $basic_machine in
| moxie \
| mt \
| msp430 \
- | nds32 | nds32le | nds32be\
+ | nds32 | nds32le | nds32be \
| nios | nios2 \
| ns16k | ns32k \
+ | open8 \
| or32 \
| pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
| rx \
| score \
@@ -296,12 +297,12 @@ case $basic_machine in
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu | strongarm \
- | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| ubicom32 \
| v850 | v850e \
| we32k \
- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | x86 | xc16x | xstormy16 | xtensa \
| z8k | z80)
basic_machine=$basic_machine-unknown
;;
@@ -324,7 +325,15 @@ case $basic_machine in
ms1)
basic_machine=mt-unknown
;;
-
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
@@ -382,24 +391,25 @@ case $basic_machine in
| nds32-* | nds32le-* | nds32be-* \
| nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \
| romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
- | tahoe-* | thumb-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tile-* | tilegx-* \
| tron-* \
| ubicom32-* \
| v850-* | v850e-* | vax-* \
| we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \
| ymp-* \
| z8k-* | z80-*)
@@ -539,7 +549,7 @@ case $basic_machine in
basic_machine=craynv-cray
os=-unicosmp
;;
- cr16)
+ cr16 | cr16-*)
basic_machine=cr16-unknown
os=-elf
;;
@@ -826,10 +836,10 @@ case $basic_machine in
basic_machine=v70-nec
os=-sysv
;;
- next | m*-next )
+ next | m*-next)
basic_machine=m68k-next
case $os in
- -nextstep* )
+ -nextstep*)
;;
-ns2*)
os=-nextstep2
@@ -948,11 +958,14 @@ case $basic_machine in
pn)
basic_machine=pn-gould
;;
- power) basic_machine=power-ibm
+ power)
+ basic_machine=power-ibm
;;
- ppc) basic_machine=powerpc-unknown
+ ppc | ppcbe)
+ basic_machine=powerpc-unknown
;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
@@ -960,9 +973,11 @@ case $basic_machine in
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
- ppc64) basic_machine=powerpc64-unknown
+ ppc64)
+ basic_machine=powerpc64-unknown
;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc64-*)
+ basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
basic_machine=powerpc64le-unknown
@@ -1046,6 +1061,9 @@ case $basic_machine in
basic_machine=i860-stratus
os=-sysv4
;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
sun2)
basic_machine=m68000-sun
;;
@@ -1178,6 +1196,9 @@ case $basic_machine in
xps | xps100)
basic_machine=xps100-honeywell
;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
ymp)
basic_machine=ymp-cray
os=-unicos
@@ -1400,7 +1421,7 @@ case $os in
-nova*)
os=-rtmk-nova
;;
- -ns2 )
+ -ns2)
os=-nextstep2
;;
-nsk*)
@@ -1597,7 +1618,7 @@ case $basic_machine in
m88k-omron*)
os=-luna
;;
- *-next )
+ *-next)
os=-nextstep
;;
*-sequent)
diff --git a/contrib/dialog/configure b/contrib/dialog/configure
index 2d90644..44eaeb4 100755
--- a/contrib/dialog/configure
+++ b/contrib/dialog/configure
@@ -2462,7 +2462,7 @@ SHELL = /bin/sh
all :
@ echo '.$cf_option'
CF_EOF
- cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | sed -e 's,[ ]*$,,'`
+ cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | fgrep -v "ing directory" | sed -e 's,[ ]*$,,'`
case "$cf_result" in
.*k)
cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`
@@ -2832,6 +2832,9 @@ case $host_os in #(vi
aix[456]*) #(vi
cf_xopen_source="-D_ALL_SOURCE"
;;
+cygwin) #(vi
+ cf_XOPEN_SOURCE=600
+ ;;
darwin[0-8].*) #(vi
cf_xopen_source="-D_APPLE_C_SOURCE"
;;
@@ -2857,14 +2860,14 @@ irix[56].*) #(vi
;;
linux*|gnu*|mint*|k*bsd*-gnu) #(vi
-echo "$as_me:2860: checking if we must define _GNU_SOURCE" >&5
+echo "$as_me:2863: checking if we must define _GNU_SOURCE" >&5
echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
if test "${cf_cv_gnu_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 2867 "configure"
+#line 2870 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -2879,16 +2882,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2882: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2885: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:2885: \$? = $ac_status" >&5
+ echo "$as_me:2888: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:2888: \"$ac_try\"") >&5
+ { (eval echo "$as_me:2891: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:2891: \$? = $ac_status" >&5
+ echo "$as_me:2894: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_gnu_source=no
else
@@ -2897,7 +2900,7 @@ cat conftest.$ac_ext >&5
cf_save="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
cat >conftest.$ac_ext <<_ACEOF
-#line 2900 "configure"
+#line 2903 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -2912,16 +2915,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2915: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2918: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:2918: \$? = $ac_status" >&5
+ echo "$as_me:2921: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:2921: \"$ac_try\"") >&5
+ { (eval echo "$as_me:2924: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:2924: \$? = $ac_status" >&5
+ echo "$as_me:2927: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_gnu_source=no
else
@@ -2936,7 +2939,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:2939: result: $cf_cv_gnu_source" >&5
+echo "$as_me:2942: result: $cf_cv_gnu_source" >&5
echo "${ECHO_T}$cf_cv_gnu_source" >&6
test "$cf_cv_gnu_source" = yes && CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
@@ -2966,14 +2969,14 @@ solaris2.[1-9]) #(vi
cf_xopen_source="-D__EXTENSIONS__"
;;
*)
- echo "$as_me:2969: checking if we should define _XOPEN_SOURCE" >&5
+ echo "$as_me:2972: checking if we should define _XOPEN_SOURCE" >&5
echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
if test "${cf_cv_xopen_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 2976 "configure"
+#line 2979 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -2988,16 +2991,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2991: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2994: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:2994: \$? = $ac_status" >&5
+ echo "$as_me:2997: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:2997: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3000: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3000: \$? = $ac_status" >&5
+ echo "$as_me:3003: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_xopen_source=no
else
@@ -3006,7 +3009,7 @@ cat conftest.$ac_ext >&5
cf_save="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
cat >conftest.$ac_ext <<_ACEOF
-#line 3009 "configure"
+#line 3012 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3021,16 +3024,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3024: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3027: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3027: \$? = $ac_status" >&5
+ echo "$as_me:3030: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3030: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3033: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3033: \$? = $ac_status" >&5
+ echo "$as_me:3036: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_xopen_source=no
else
@@ -3045,7 +3048,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:3048: result: $cf_cv_xopen_source" >&5
+echo "$as_me:3051: result: $cf_cv_xopen_source" >&5
echo "${ECHO_T}$cf_cv_xopen_source" >&6
if test "$cf_cv_xopen_source" != no ; then
@@ -3152,16 +3155,16 @@ cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \
-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'`
-echo "$as_me:3155: checking if we should define _POSIX_C_SOURCE" >&5
+echo "$as_me:3158: checking if we should define _POSIX_C_SOURCE" >&5
echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
if test "${cf_cv_posix_c_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
-echo "${as_me:-configure}:3161: testing if the symbol is already defined go no further ..." 1>&5
+echo "${as_me:-configure}:3164: testing if the symbol is already defined go no further ..." 1>&5
cat >conftest.$ac_ext <<_ACEOF
-#line 3164 "configure"
+#line 3167 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3176,16 +3179,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3179: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3182: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3182: \$? = $ac_status" >&5
+ echo "$as_me:3185: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3185: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3188: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3188: \$? = $ac_status" >&5
+ echo "$as_me:3191: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_posix_c_source=no
else
@@ -3206,7 +3209,7 @@ cf_want_posix_source=no
esac
if test "$cf_want_posix_source" = yes ; then
cat >conftest.$ac_ext <<_ACEOF
-#line 3209 "configure"
+#line 3212 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3221,16 +3224,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3224: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3227: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3227: \$? = $ac_status" >&5
+ echo "$as_me:3230: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3230: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3233: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3233: \$? = $ac_status" >&5
+ echo "$as_me:3236: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -3241,15 +3244,15 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "${as_me:-configure}:3244: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+echo "${as_me:-configure}:3247: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
CFLAGS="$cf_trim_CFLAGS"
CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source"
-echo "${as_me:-configure}:3249: testing if the second compile does not leave our definition intact error ..." 1>&5
+echo "${as_me:-configure}:3252: testing if the second compile does not leave our definition intact error ..." 1>&5
cat >conftest.$ac_ext <<_ACEOF
-#line 3252 "configure"
+#line 3255 "configure"
#include "confdefs.h"
#include <sys/types.h>
int
@@ -3264,16 +3267,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3267: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3270: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3270: \$? = $ac_status" >&5
+ echo "$as_me:3273: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3273: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3276: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3276: \$? = $ac_status" >&5
+ echo "$as_me:3279: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -3289,7 +3292,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:3292: result: $cf_cv_posix_c_source" >&5
+echo "$as_me:3295: result: $cf_cv_posix_c_source" >&5
echo "${ECHO_T}$cf_cv_posix_c_source" >&6
if test "$cf_cv_posix_c_source" != no ; then
@@ -3468,7 +3471,7 @@ if test "${enable_largefile+set}" = set; then
fi;
if test "$enable_largefile" != no; then
- echo "$as_me:3471: checking for special C compiler options needed for large files" >&5
+ echo "$as_me:3474: checking for special C compiler options needed for large files" >&5
echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_largefile_CC+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3480,7 +3483,7 @@ else
# IRIX 6.2 and later do not support large files by default,
# so use the C compiler's -n32 option if that helps.
cat >conftest.$ac_ext <<_ACEOF
-#line 3483 "configure"
+#line 3486 "configure"
#include "confdefs.h"
#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
@@ -3500,16 +3503,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3503: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3506: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3506: \$? = $ac_status" >&5
+ echo "$as_me:3509: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3509: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3512: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3512: \$? = $ac_status" >&5
+ echo "$as_me:3515: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3519,16 +3522,16 @@ fi
rm -f conftest.$ac_objext
CC="$CC -n32"
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3522: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3525: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3525: \$? = $ac_status" >&5
+ echo "$as_me:3528: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3528: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3531: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3531: \$? = $ac_status" >&5
+ echo "$as_me:3534: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_largefile_CC=' -n32'; break
else
@@ -3542,13 +3545,13 @@ rm -f conftest.$ac_objext
rm -f conftest.$ac_ext
fi
fi
-echo "$as_me:3545: result: $ac_cv_sys_largefile_CC" >&5
+echo "$as_me:3548: result: $ac_cv_sys_largefile_CC" >&5
echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
if test "$ac_cv_sys_largefile_CC" != no; then
CC=$CC$ac_cv_sys_largefile_CC
fi
- echo "$as_me:3551: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+ echo "$as_me:3554: checking for _FILE_OFFSET_BITS value needed for large files" >&5
echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_file_offset_bits+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3556,7 +3559,7 @@ else
while :; do
ac_cv_sys_file_offset_bits=no
cat >conftest.$ac_ext <<_ACEOF
-#line 3559 "configure"
+#line 3562 "configure"
#include "confdefs.h"
#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
@@ -3576,16 +3579,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3579: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3582: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3582: \$? = $ac_status" >&5
+ echo "$as_me:3585: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3585: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3588: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3588: \$? = $ac_status" >&5
+ echo "$as_me:3591: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3594,7 +3597,7 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
-#line 3597 "configure"
+#line 3600 "configure"
#include "confdefs.h"
#define _FILE_OFFSET_BITS 64
#include <sys/types.h>
@@ -3615,16 +3618,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3618: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3621: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3621: \$? = $ac_status" >&5
+ echo "$as_me:3624: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3624: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3627: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3627: \$? = $ac_status" >&5
+ echo "$as_me:3630: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_file_offset_bits=64; break
else
@@ -3635,7 +3638,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
break
done
fi
-echo "$as_me:3638: result: $ac_cv_sys_file_offset_bits" >&5
+echo "$as_me:3641: result: $ac_cv_sys_file_offset_bits" >&5
echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
if test "$ac_cv_sys_file_offset_bits" != no; then
@@ -3645,7 +3648,7 @@ EOF
fi
rm -rf conftest*
- echo "$as_me:3648: checking for _LARGE_FILES value needed for large files" >&5
+ echo "$as_me:3651: checking for _LARGE_FILES value needed for large files" >&5
echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_large_files+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3653,7 +3656,7 @@ else
while :; do
ac_cv_sys_large_files=no
cat >conftest.$ac_ext <<_ACEOF
-#line 3656 "configure"
+#line 3659 "configure"
#include "confdefs.h"
#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
@@ -3673,16 +3676,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3676: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3679: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3679: \$? = $ac_status" >&5
+ echo "$as_me:3682: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3682: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3685: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3685: \$? = $ac_status" >&5
+ echo "$as_me:3688: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3691,7 +3694,7 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
-#line 3694 "configure"
+#line 3697 "configure"
#include "confdefs.h"
#define _LARGE_FILES 1
#include <sys/types.h>
@@ -3712,16 +3715,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3715: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3718: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3718: \$? = $ac_status" >&5
+ echo "$as_me:3721: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3721: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3724: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3724: \$? = $ac_status" >&5
+ echo "$as_me:3727: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_large_files=1; break
else
@@ -3732,7 +3735,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
break
done
fi
-echo "$as_me:3735: result: $ac_cv_sys_large_files" >&5
+echo "$as_me:3738: result: $ac_cv_sys_large_files" >&5
echo "${ECHO_T}$ac_cv_sys_large_files" >&6
if test "$ac_cv_sys_large_files" != no; then
@@ -3745,7 +3748,7 @@ rm -rf conftest*
fi
if test "$enable_largefile" != no ; then
- echo "$as_me:3748: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+ echo "$as_me:3751: checking for _LARGEFILE_SOURCE value needed for large files" >&5
echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
if test "${ac_cv_sys_largefile_source+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3753,7 +3756,7 @@ else
while :; do
ac_cv_sys_largefile_source=no
cat >conftest.$ac_ext <<_ACEOF
-#line 3756 "configure"
+#line 3759 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -3765,16 +3768,16 @@ return !fseeko;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3768: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3771: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3771: \$? = $ac_status" >&5
+ echo "$as_me:3774: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3774: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3777: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3777: \$? = $ac_status" >&5
+ echo "$as_me:3780: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
break
else
@@ -3783,7 +3786,7 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
cat >conftest.$ac_ext <<_ACEOF
-#line 3786 "configure"
+#line 3789 "configure"
#include "confdefs.h"
#define _LARGEFILE_SOURCE 1
#include <stdio.h>
@@ -3796,16 +3799,16 @@ return !fseeko;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3799: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3802: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3802: \$? = $ac_status" >&5
+ echo "$as_me:3805: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3805: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3808: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3808: \$? = $ac_status" >&5
+ echo "$as_me:3811: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_sys_largefile_source=1; break
else
@@ -3816,7 +3819,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
break
done
fi
-echo "$as_me:3819: result: $ac_cv_sys_largefile_source" >&5
+echo "$as_me:3822: result: $ac_cv_sys_largefile_source" >&5
echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6
if test "$ac_cv_sys_largefile_source" != no; then
@@ -3830,13 +3833,13 @@ rm -rf conftest*
# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
# in glibc 2.1.3, but that breaks too many other things.
# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
-echo "$as_me:3833: checking for fseeko" >&5
+echo "$as_me:3836: checking for fseeko" >&5
echo $ECHO_N "checking for fseeko... $ECHO_C" >&6
if test "${ac_cv_func_fseeko+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 3839 "configure"
+#line 3842 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -3848,16 +3851,16 @@ return fseeko && fseeko (stdin, 0, 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3851: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3854: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:3854: \$? = $ac_status" >&5
+ echo "$as_me:3857: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:3857: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3860: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3860: \$? = $ac_status" >&5
+ echo "$as_me:3863: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_fseeko=yes
else
@@ -3867,7 +3870,7 @@ ac_cv_func_fseeko=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:3870: result: $ac_cv_func_fseeko" >&5
+echo "$as_me:3873: result: $ac_cv_func_fseeko" >&5
echo "${ECHO_T}$ac_cv_func_fseeko" >&6
if test $ac_cv_func_fseeko = yes; then
@@ -3888,14 +3891,14 @@ fi
test "$ac_cv_sys_largefile_source" != no && CPPFLAGS="$CPPFLAGS -D_LARGEFILE_SOURCE "
test "$ac_cv_sys_file_offset_bits" != no && CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits "
- echo "$as_me:3891: checking whether to use struct dirent64" >&5
+ echo "$as_me:3894: checking whether to use struct dirent64" >&5
echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6
if test "${cf_cv_struct_dirent64+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 3898 "configure"
+#line 3901 "configure"
#include "confdefs.h"
#include <sys/types.h>
@@ -3916,16 +3919,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3919: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3922: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:3922: \$? = $ac_status" >&5
+ echo "$as_me:3925: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:3925: \"$ac_try\"") >&5
+ { (eval echo "$as_me:3928: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:3928: \$? = $ac_status" >&5
+ echo "$as_me:3931: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_struct_dirent64=yes
else
@@ -3936,7 +3939,7 @@ fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:3939: result: $cf_cv_struct_dirent64" >&5
+echo "$as_me:3942: result: $cf_cv_struct_dirent64" >&5
echo "${ECHO_T}$cf_cv_struct_dirent64" >&6
test "$cf_cv_struct_dirent64" = yes && cat >>confdefs.h <<\EOF
#define HAVE_STRUCT_DIRENT64 1
@@ -3946,17 +3949,17 @@ EOF
GCC_VERSION=none
if test "$GCC" = yes ; then
- echo "$as_me:3949: checking version of $CC" >&5
+ echo "$as_me:3952: checking version of $CC" >&5
echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
test -z "$GCC_VERSION" && GCC_VERSION=unknown
- echo "$as_me:3953: result: $GCC_VERSION" >&5
+ echo "$as_me:3956: result: $GCC_VERSION" >&5
echo "${ECHO_T}$GCC_VERSION" >&6
fi
if ( test "$GCC" = yes || test "$GXX" = yes )
then
-echo "$as_me:3959: checking if you want to check for gcc warnings" >&5
+echo "$as_me:3962: checking if you want to check for gcc warnings" >&5
echo $ECHO_N "checking if you want to check for gcc warnings... $ECHO_C" >&6
# Check whether --with-warnings or --without-warnings was given.
@@ -3966,7 +3969,7 @@ if test "${with_warnings+set}" = set; then
else
cf_opt_with_warnings=no
fi;
-echo "$as_me:3969: result: $cf_opt_with_warnings" >&5
+echo "$as_me:3972: result: $cf_opt_with_warnings" >&5
echo "${ECHO_T}$cf_opt_with_warnings" >&6
if test "$cf_opt_with_warnings" != no ; then
@@ -3988,10 +3991,10 @@ cat > conftest.i <<EOF
EOF
if test "$GCC" = yes
then
- { echo "$as_me:3991: checking for $CC __attribute__ directives..." >&5
+ { echo "$as_me:3994: checking for $CC __attribute__ directives..." >&5
echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
cat > conftest.$ac_ext <<EOF
-#line 3994 "${as_me:-configure}"
+#line 3997 "${as_me:-configure}"
#include "confdefs.h"
#include "conftest.h"
#include "conftest.i"
@@ -4040,12 +4043,12 @@ EOF
;;
esac
- if { (eval echo "$as_me:4043: \"$ac_compile\"") >&5
+ if { (eval echo "$as_me:4046: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4046: \$? = $ac_status" >&5
+ echo "$as_me:4049: \$? = $ac_status" >&5
(exit $ac_status); }; then
- test -n "$verbose" && echo "$as_me:4048: result: ... $cf_attribute" >&5
+ test -n "$verbose" && echo "$as_me:4051: result: ... $cf_attribute" >&5
echo "${ECHO_T}... $cf_attribute" >&6
cat conftest.h >>confdefs.h
case $cf_attribute in #(vi
@@ -4085,12 +4088,12 @@ INTEL_COMPILER=no
if test "$GCC" = yes ; then
case $host_os in
linux*|gnu*)
- echo "$as_me:4088: checking if this is really Intel C compiler" >&5
+ echo "$as_me:4091: checking if this is really Intel C compiler" >&5
echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
cf_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -no-gcc"
cat >conftest.$ac_ext <<_ACEOF
-#line 4093 "configure"
+#line 4096 "configure"
#include "confdefs.h"
int
@@ -4107,16 +4110,16 @@ make an error
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4110: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4113: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4113: \$? = $ac_status" >&5
+ echo "$as_me:4116: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4116: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4119: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4119: \$? = $ac_status" >&5
+ echo "$as_me:4122: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
INTEL_COMPILER=yes
cf_save_CFLAGS="$cf_save_CFLAGS -we147 -no-gcc"
@@ -4127,14 +4130,14 @@ cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest.$ac_ext
CFLAGS="$cf_save_CFLAGS"
- echo "$as_me:4130: result: $INTEL_COMPILER" >&5
+ echo "$as_me:4133: result: $INTEL_COMPILER" >&5
echo "${ECHO_T}$INTEL_COMPILER" >&6
;;
esac
fi
cat > conftest.$ac_ext <<EOF
-#line 4137 "${as_me:-configure}"
+#line 4140 "${as_me:-configure}"
int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
EOF
@@ -4151,7 +4154,7 @@ then
# remark #981: operands are evaluated in unspecified order
# warning #279: controlling expression is constant
- { echo "$as_me:4154: checking for $CC warning options..." >&5
+ { echo "$as_me:4157: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
cf_save_CFLAGS="$CFLAGS"
EXTRA_CFLAGS="-Wall"
@@ -4167,12 +4170,12 @@ echo "$as_me: checking for $CC warning options..." >&6;}
wd981
do
CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
- if { (eval echo "$as_me:4170: \"$ac_compile\"") >&5
+ if { (eval echo "$as_me:4173: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4173: \$? = $ac_status" >&5
+ echo "$as_me:4176: \$? = $ac_status" >&5
(exit $ac_status); }; then
- test -n "$verbose" && echo "$as_me:4175: result: ... -$cf_opt" >&5
+ test -n "$verbose" && echo "$as_me:4178: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
fi
@@ -4181,7 +4184,7 @@ echo "${ECHO_T}... -$cf_opt" >&6
elif test "$GCC" = yes
then
- { echo "$as_me:4184: checking for $CC warning options..." >&5
+ { echo "$as_me:4187: checking for $CC warning options..." >&5
echo "$as_me: checking for $CC warning options..." >&6;}
cf_save_CFLAGS="$CFLAGS"
EXTRA_CFLAGS=
@@ -4201,12 +4204,12 @@ echo "$as_me: checking for $CC warning options..." >&6;}
Wundef $cf_warn_CONST
do
CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
- if { (eval echo "$as_me:4204: \"$ac_compile\"") >&5
+ if { (eval echo "$as_me:4207: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4207: \$? = $ac_status" >&5
+ echo "$as_me:4210: \$? = $ac_status" >&5
(exit $ac_status); }; then
- test -n "$verbose" && echo "$as_me:4209: result: ... -$cf_opt" >&5
+ test -n "$verbose" && echo "$as_me:4212: result: ... -$cf_opt" >&5
echo "${ECHO_T}... -$cf_opt" >&6
case $cf_opt in #(vi
Wcast-qual) #(vi
@@ -4217,7 +4220,7 @@ echo "${ECHO_T}... -$cf_opt" >&6
[34].*)
test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6
-echo "${as_me:-configure}:4220: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+echo "${as_me:-configure}:4223: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
continue;;
esac
@@ -4242,7 +4245,7 @@ else
fi;
if test -f $srcdir/VERSION ; then
- echo "$as_me:4245: checking for package version" >&5
+ echo "$as_me:4248: checking for package version" >&5
echo $ECHO_N "checking for package version... $ECHO_C" >&6
# if there are not enough fields, cut returns the last one...
@@ -4254,39 +4257,39 @@ echo $ECHO_N "checking for package version... $ECHO_C" >&6
VERSION="$cf_field1"
VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'`
- test -z "$VERSION_MAJOR" && { { echo "$as_me:4257: error: missing major-version" >&5
+ test -z "$VERSION_MAJOR" && { { echo "$as_me:4260: error: missing major-version" >&5
echo "$as_me: error: missing major-version" >&2;}
{ (exit 1); exit 1; }; }
VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[^.]*\.//' -e 's/-.*//'`
- test -z "$VERSION_MINOR" && { { echo "$as_me:4262: error: missing minor-version" >&5
+ test -z "$VERSION_MINOR" && { { echo "$as_me:4265: error: missing minor-version" >&5
echo "$as_me: error: missing minor-version" >&2;}
{ (exit 1); exit 1; }; }
- echo "$as_me:4266: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5
+ echo "$as_me:4269: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5
echo "${ECHO_T}${VERSION_MAJOR}.${VERSION_MINOR}" >&6
- echo "$as_me:4269: checking for package patch date" >&5
+ echo "$as_me:4272: checking for package patch date" >&5
echo $ECHO_N "checking for package patch date... $ECHO_C" >&6
VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[^-]*-//'`
case .$VERSION_PATCH in
.)
- { { echo "$as_me:4274: error: missing patch-date $VERSION_PATCH" >&5
+ { { echo "$as_me:4277: error: missing patch-date $VERSION_PATCH" >&5
echo "$as_me: error: missing patch-date $VERSION_PATCH" >&2;}
{ (exit 1); exit 1; }; }
;;
.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
;;
*)
- { { echo "$as_me:4281: error: illegal patch-date $VERSION_PATCH" >&5
+ { { echo "$as_me:4284: error: illegal patch-date $VERSION_PATCH" >&5
echo "$as_me: error: illegal patch-date $VERSION_PATCH" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
- echo "$as_me:4286: result: $VERSION_PATCH" >&5
+ echo "$as_me:4289: result: $VERSION_PATCH" >&5
echo "${ECHO_T}$VERSION_PATCH" >&6
else
- { { echo "$as_me:4289: error: did not find $srcdir/VERSION" >&5
+ { { echo "$as_me:4292: error: did not find $srcdir/VERSION" >&5
echo "$as_me: error: did not find $srcdir/VERSION" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -4294,19 +4297,19 @@ fi
# show the actual data that we have for versions:
test -n "$verbose" && echo " VERSION $VERSION" 1>&6
-echo "${as_me:-configure}:4297: testing VERSION $VERSION ..." 1>&5
+echo "${as_me:-configure}:4300: testing VERSION $VERSION ..." 1>&5
test -n "$verbose" && echo " VERSION_MAJOR $VERSION_MAJOR" 1>&6
-echo "${as_me:-configure}:4301: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5
+echo "${as_me:-configure}:4304: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5
test -n "$verbose" && echo " VERSION_MINOR $VERSION_MINOR" 1>&6
-echo "${as_me:-configure}:4305: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5
+echo "${as_me:-configure}:4308: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5
test -n "$verbose" && echo " VERSION_PATCH $VERSION_PATCH" 1>&6
-echo "${as_me:-configure}:4309: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5
+echo "${as_me:-configure}:4312: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5
cf_PACKAGE=dialog
PACKAGE=$PACKAGE
@@ -4333,13 +4336,13 @@ else
fi;
EXTRAOBJS=""
-echo "$as_me:4336: checking for ANSI C header files" >&5
+echo "$as_me:4339: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4342 "configure"
+#line 4345 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -4347,13 +4350,13 @@ else
#include <float.h>
_ACEOF
-if { (eval echo "$as_me:4350: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:4353: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:4356: \$? = $ac_status" >&5
+ echo "$as_me:4359: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4375,7 +4378,7 @@ rm -f conftest.err conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 4378 "configure"
+#line 4381 "configure"
#include "confdefs.h"
#include <string.h>
@@ -4393,7 +4396,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 4396 "configure"
+#line 4399 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -4414,7 +4417,7 @@ if test $ac_cv_header_stdc = yes; then
:
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4417 "configure"
+#line 4420 "configure"
#include "confdefs.h"
#include <ctype.h>
#if ((' ' & 0x0FF) == 0x020)
@@ -4440,15 +4443,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4443: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4446: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4446: \$? = $ac_status" >&5
+ echo "$as_me:4449: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:4448: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4451: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4451: \$? = $ac_status" >&5
+ echo "$as_me:4454: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -4461,7 +4464,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
fi
-echo "$as_me:4464: result: $ac_cv_header_stdc" >&5
+echo "$as_me:4467: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then
@@ -4471,7 +4474,7 @@ EOF
fi
-echo "$as_me:4474: checking for inline" >&5
+echo "$as_me:4477: checking for inline" >&5
echo $ECHO_N "checking for inline... $ECHO_C" >&6
if test "${ac_cv_c_inline+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4479,7 +4482,7 @@ else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat >conftest.$ac_ext <<_ACEOF
-#line 4482 "configure"
+#line 4485 "configure"
#include "confdefs.h"
#ifndef __cplusplus
static $ac_kw int static_foo () {return 0; }
@@ -4488,16 +4491,16 @@ $ac_kw int foo () {return 0; }
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4491: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4494: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4494: \$? = $ac_status" >&5
+ echo "$as_me:4497: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4497: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4500: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4500: \$? = $ac_status" >&5
+ echo "$as_me:4503: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_c_inline=$ac_kw; break
else
@@ -4508,7 +4511,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:4511: result: $ac_cv_c_inline" >&5
+echo "$as_me:4514: result: $ac_cv_c_inline" >&5
echo "${ECHO_T}$ac_cv_c_inline" >&6
case $ac_cv_c_inline in
inline | yes) ;;
@@ -4529,28 +4532,28 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
inttypes.h stdint.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4532: checking for $ac_header" >&5
+echo "$as_me:4535: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4538 "configure"
+#line 4541 "configure"
#include "confdefs.h"
$ac_includes_default
#include <$ac_header>
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4544: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4547: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4547: \$? = $ac_status" >&5
+ echo "$as_me:4550: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4550: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4553: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4553: \$? = $ac_status" >&5
+ echo "$as_me:4556: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Header=yes"
else
@@ -4560,7 +4563,7 @@ eval "$as_ac_Header=no"
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:4563: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:4566: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -4570,13 +4573,13 @@ EOF
fi
done
-echo "$as_me:4573: checking for off_t" >&5
+echo "$as_me:4576: checking for off_t" >&5
echo $ECHO_N "checking for off_t... $ECHO_C" >&6
if test "${ac_cv_type_off_t+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4579 "configure"
+#line 4582 "configure"
#include "confdefs.h"
$ac_includes_default
int
@@ -4591,16 +4594,16 @@ if (sizeof (off_t))
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4594: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4597: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4597: \$? = $ac_status" >&5
+ echo "$as_me:4600: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4600: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4603: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4603: \$? = $ac_status" >&5
+ echo "$as_me:4606: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_off_t=yes
else
@@ -4610,7 +4613,7 @@ ac_cv_type_off_t=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:4613: result: $ac_cv_type_off_t" >&5
+echo "$as_me:4616: result: $ac_cv_type_off_t" >&5
echo "${ECHO_T}$ac_cv_type_off_t" >&6
if test $ac_cv_type_off_t = yes; then
:
@@ -4622,13 +4625,13 @@ EOF
fi
-echo "$as_me:4625: checking for size_t" >&5
+echo "$as_me:4628: checking for size_t" >&5
echo $ECHO_N "checking for size_t... $ECHO_C" >&6
if test "${ac_cv_type_size_t+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4631 "configure"
+#line 4634 "configure"
#include "confdefs.h"
$ac_includes_default
int
@@ -4643,16 +4646,16 @@ if (sizeof (size_t))
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4646: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4649: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:4649: \$? = $ac_status" >&5
+ echo "$as_me:4652: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:4652: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4655: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4655: \$? = $ac_status" >&5
+ echo "$as_me:4658: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_size_t=yes
else
@@ -4662,7 +4665,7 @@ ac_cv_type_size_t=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:4665: result: $ac_cv_type_size_t" >&5
+echo "$as_me:4668: result: $ac_cv_type_size_t" >&5
echo "${ECHO_T}$ac_cv_type_size_t" >&6
if test $ac_cv_type_size_t = yes; then
:
@@ -4676,13 +4679,13 @@ fi
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
-echo "$as_me:4679: checking for working alloca.h" >&5
+echo "$as_me:4682: checking for working alloca.h" >&5
echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
if test "${ac_cv_working_alloca_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4685 "configure"
+#line 4688 "configure"
#include "confdefs.h"
#include <alloca.h>
int
@@ -4694,16 +4697,16 @@ char *p = (char *) alloca (2 * sizeof (int));
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4697: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4700: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4700: \$? = $ac_status" >&5
+ echo "$as_me:4703: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:4703: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4706: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4706: \$? = $ac_status" >&5
+ echo "$as_me:4709: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_working_alloca_h=yes
else
@@ -4713,7 +4716,7 @@ ac_cv_working_alloca_h=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:4716: result: $ac_cv_working_alloca_h" >&5
+echo "$as_me:4719: result: $ac_cv_working_alloca_h" >&5
echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
if test $ac_cv_working_alloca_h = yes; then
@@ -4723,13 +4726,13 @@ EOF
fi
-echo "$as_me:4726: checking for alloca" >&5
+echo "$as_me:4729: checking for alloca" >&5
echo $ECHO_N "checking for alloca... $ECHO_C" >&6
if test "${ac_cv_func_alloca_works+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4732 "configure"
+#line 4735 "configure"
#include "confdefs.h"
#ifdef __GNUC__
# define alloca __builtin_alloca
@@ -4761,16 +4764,16 @@ char *p = (char *) alloca (1);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4764: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4767: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4767: \$? = $ac_status" >&5
+ echo "$as_me:4770: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:4770: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4773: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4773: \$? = $ac_status" >&5
+ echo "$as_me:4776: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_alloca_works=yes
else
@@ -4780,7 +4783,7 @@ ac_cv_func_alloca_works=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:4783: result: $ac_cv_func_alloca_works" >&5
+echo "$as_me:4786: result: $ac_cv_func_alloca_works" >&5
echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
if test $ac_cv_func_alloca_works = yes; then
@@ -4801,13 +4804,13 @@ cat >>confdefs.h <<\EOF
#define C_ALLOCA 1
EOF
-echo "$as_me:4804: checking whether \`alloca.c' needs Cray hooks" >&5
+echo "$as_me:4807: checking whether \`alloca.c' needs Cray hooks" >&5
echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
if test "${ac_cv_os_cray+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4810 "configure"
+#line 4813 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -4825,18 +4828,18 @@ fi
rm -rf conftest*
fi
-echo "$as_me:4828: result: $ac_cv_os_cray" >&5
+echo "$as_me:4831: result: $ac_cv_os_cray" >&5
echo "${ECHO_T}$ac_cv_os_cray" >&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:4833: checking for $ac_func" >&5
+echo "$as_me:4836: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4839 "configure"
+#line 4842 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -4867,16 +4870,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4870: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4873: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4873: \$? = $ac_status" >&5
+ echo "$as_me:4876: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:4876: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4879: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4879: \$? = $ac_status" >&5
+ echo "$as_me:4882: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -4886,7 +4889,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:4889: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:4892: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
@@ -4900,7 +4903,7 @@ fi
done
fi
-echo "$as_me:4903: checking stack direction for C alloca" >&5
+echo "$as_me:4906: checking stack direction for C alloca" >&5
echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
if test "${ac_cv_c_stack_direction+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4909,7 +4912,7 @@ else
ac_cv_c_stack_direction=0
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4912 "configure"
+#line 4915 "configure"
#include "confdefs.h"
int
find_stack_direction ()
@@ -4932,15 +4935,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4935: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4938: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:4938: \$? = $ac_status" >&5
+ echo "$as_me:4941: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:4940: \"$ac_try\"") >&5
+ { (eval echo "$as_me:4943: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:4943: \$? = $ac_status" >&5
+ echo "$as_me:4946: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_c_stack_direction=1
else
@@ -4952,7 +4955,7 @@ fi
rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
-echo "$as_me:4955: result: $ac_cv_c_stack_direction" >&5
+echo "$as_me:4958: result: $ac_cv_c_stack_direction" >&5
echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
cat >>confdefs.h <<EOF
@@ -4964,23 +4967,23 @@ fi
for ac_header in stdlib.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4967: checking for $ac_header" >&5
+echo "$as_me:4970: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 4973 "configure"
+#line 4976 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:4977: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:4980: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:4983: \$? = $ac_status" >&5
+ echo "$as_me:4986: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4999,7 +5002,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:5002: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:5005: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5012,13 +5015,13 @@ done
for ac_func in getpagesize
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:5015: checking for $ac_func" >&5
+echo "$as_me:5018: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5021 "configure"
+#line 5024 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -5049,16 +5052,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5052: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5055: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5055: \$? = $ac_status" >&5
+ echo "$as_me:5058: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5058: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5061: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5061: \$? = $ac_status" >&5
+ echo "$as_me:5064: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -5068,7 +5071,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:5071: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:5074: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5078,7 +5081,7 @@ EOF
fi
done
-echo "$as_me:5081: checking for working mmap" >&5
+echo "$as_me:5084: checking for working mmap" >&5
echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5087,7 +5090,7 @@ else
ac_cv_func_mmap_fixed_mapped=no
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5090 "configure"
+#line 5093 "configure"
#include "confdefs.h"
$ac_includes_default
/* Thanks to Mike Haertel and Jim Avera for this test.
@@ -5214,15 +5217,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:5217: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5220: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5220: \$? = $ac_status" >&5
+ echo "$as_me:5223: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:5222: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5225: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5225: \$? = $ac_status" >&5
+ echo "$as_me:5228: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_mmap_fixed_mapped=yes
else
@@ -5234,7 +5237,7 @@ fi
rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
-echo "$as_me:5237: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "$as_me:5240: result: $ac_cv_func_mmap_fixed_mapped" >&5
echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
if test $ac_cv_func_mmap_fixed_mapped = yes; then
@@ -5245,13 +5248,13 @@ EOF
fi
rm -f conftest.mmap
- echo "$as_me:5248: checking whether we are using the GNU C Library 2.1 or newer" >&5
+ echo "$as_me:5251: checking whether we are using the GNU C Library 2.1 or newer" >&5
echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6
if test "${ac_cv_gnu_library_2_1+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5254 "configure"
+#line 5257 "configure"
#include "confdefs.h"
#include <features.h>
@@ -5271,7 +5274,7 @@ fi
rm -rf conftest*
fi
-echo "$as_me:5274: result: $ac_cv_gnu_library_2_1" >&5
+echo "$as_me:5277: result: $ac_cv_gnu_library_2_1" >&5
echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6
GLIBC21="$ac_cv_gnu_library_2_1"
@@ -5284,7 +5287,7 @@ test -z "$ALL_LINGUAS" && ALL_LINGUAS=`test -d $srcdir/po && cd $srcdir/po && ec
: ${CONFIG_H:=config.h}
if test -z "$PACKAGE" ; then
- { { echo "$as_me:5287: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&5
+ { { echo "$as_me:5290: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&5
echo "$as_me: error: CF_BUNDLED_INTL used without setting PACKAGE variable" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -5301,23 +5304,23 @@ for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
stdlib.h string.h unistd.h sys/param.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:5304: checking for $ac_header" >&5
+echo "$as_me:5307: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5310 "configure"
+#line 5313 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:5314: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:5317: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:5320: \$? = $ac_status" >&5
+ echo "$as_me:5323: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -5336,7 +5339,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:5339: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:5342: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5351,13 +5354,13 @@ getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
strdup strtoul tsearch __argz_count __argz_stringify __argz_next
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:5354: checking for $ac_func" >&5
+echo "$as_me:5357: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 5360 "configure"
+#line 5363 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -5388,16 +5391,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5391: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5394: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5394: \$? = $ac_status" >&5
+ echo "$as_me:5397: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5397: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5400: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5400: \$? = $ac_status" >&5
+ echo "$as_me:5403: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -5407,7 +5410,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:5410: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:5413: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -5455,7 +5458,7 @@ if test -n "$cf_searchpath/include" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 5458 "configure"
+#line 5461 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -5467,16 +5470,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5470: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:5473: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:5473: \$? = $ac_status" >&5
+ echo "$as_me:5476: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:5476: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5479: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5479: \$? = $ac_status" >&5
+ echo "$as_me:5482: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -5493,7 +5496,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:5496: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:5499: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -5534,7 +5537,7 @@ if test -n "$cf_searchpath/../include" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 5537 "configure"
+#line 5540 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -5546,16 +5549,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5549: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:5552: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:5552: \$? = $ac_status" >&5
+ echo "$as_me:5555: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:5555: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5558: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5558: \$? = $ac_status" >&5
+ echo "$as_me:5561: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -5572,7 +5575,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:5575: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:5578: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -5588,7 +5591,7 @@ echo "${as_me:-configure}:5575: testing adding $cf_add_incdir to include-path ..
fi
else
-{ { echo "$as_me:5591: error: cannot find libiconv under $withval" >&5
+{ { echo "$as_me:5594: error: cannot find libiconv under $withval" >&5
echo "$as_me: error: cannot find libiconv under $withval" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -5613,7 +5616,7 @@ if test -n "$cf_searchpath/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:5616: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:5619: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -5642,7 +5645,7 @@ if test -n "$cf_searchpath" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:5645: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:5648: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -5651,7 +5654,7 @@ echo "${as_me:-configure}:5645: testing adding $cf_add_libdir to library-path ..
fi
else
-{ { echo "$as_me:5654: error: cannot find libiconv under $withval" >&5
+{ { echo "$as_me:5657: error: cannot find libiconv under $withval" >&5
echo "$as_me: error: cannot find libiconv under $withval" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -5662,7 +5665,7 @@ done
fi;
- echo "$as_me:5665: checking for iconv" >&5
+ echo "$as_me:5668: checking for iconv" >&5
echo $ECHO_N "checking for iconv... $ECHO_C" >&6
if test "${am_cv_func_iconv+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5673,12 +5676,12 @@ else
cf_cv_header_path_iconv=
cf_cv_library_path_iconv=
-echo "${as_me:-configure}:5676: testing Starting FIND_LINKAGE(iconv,) ..." 1>&5
+echo "${as_me:-configure}:5679: testing Starting FIND_LINKAGE(iconv,) ..." 1>&5
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 5681 "configure"
+#line 5684 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5697,16 +5700,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5700: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5703: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5703: \$? = $ac_status" >&5
+ echo "$as_me:5706: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5706: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5709: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5709: \$? = $ac_status" >&5
+ echo "$as_me:5712: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_iconv=yes
@@ -5720,7 +5723,7 @@ cat conftest.$ac_ext >&5
LIBS="-liconv $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 5723 "configure"
+#line 5726 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5739,16 +5742,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5742: \"$ac_link\"") >&5
+if { (eval echo "$as_me:5745: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:5745: \$? = $ac_status" >&5
+ echo "$as_me:5748: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:5748: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5751: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5751: \$? = $ac_status" >&5
+ echo "$as_me:5754: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_iconv=yes
@@ -5765,9 +5768,9 @@ cat conftest.$ac_ext >&5
test -n "$verbose" && echo " find linkage for iconv library" 1>&6
-echo "${as_me:-configure}:5768: testing find linkage for iconv library ..." 1>&5
+echo "${as_me:-configure}:5771: testing find linkage for iconv library ..." 1>&5
-echo "${as_me:-configure}:5770: testing Searching for headers in FIND_LINKAGE(iconv,) ..." 1>&5
+echo "${as_me:-configure}:5773: testing Searching for headers in FIND_LINKAGE(iconv,) ..." 1>&5
cf_save_CPPFLAGS="$CPPFLAGS"
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -5880,11 +5883,11 @@ cf_search="$cf_search $cf_header_path_list"
if test -d $cf_cv_header_path_iconv ; then
test -n "$verbose" && echo " ... testing $cf_cv_header_path_iconv" 1>&6
-echo "${as_me:-configure}:5883: testing ... testing $cf_cv_header_path_iconv ..." 1>&5
+echo "${as_me:-configure}:5886: testing ... testing $cf_cv_header_path_iconv ..." 1>&5
CPPFLAGS="$cf_save_CPPFLAGS -I$cf_cv_header_path_iconv"
cat >conftest.$ac_ext <<_ACEOF
-#line 5887 "configure"
+#line 5890 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -5903,21 +5906,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5906: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:5909: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:5909: \$? = $ac_status" >&5
+ echo "$as_me:5912: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:5912: \"$ac_try\"") >&5
+ { (eval echo "$as_me:5915: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:5915: \$? = $ac_status" >&5
+ echo "$as_me:5918: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found iconv headers in $cf_cv_header_path_iconv" 1>&6
-echo "${as_me:-configure}:5920: testing ... found iconv headers in $cf_cv_header_path_iconv ..." 1>&5
+echo "${as_me:-configure}:5923: testing ... found iconv headers in $cf_cv_header_path_iconv ..." 1>&5
cf_cv_find_linkage_iconv=maybe
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -5935,7 +5938,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_cv_find_linkage_iconv" = maybe ; then
-echo "${as_me:-configure}:5938: testing Searching for iconv library in FIND_LINKAGE(iconv,) ..." 1>&5
+echo "${as_me:-configure}:5941: testing Searching for iconv library in FIND_LINKAGE(iconv,) ..." 1>&5
cf_save_LIBS="$LIBS"
cf_save_LDFLAGS="$LDFLAGS"
@@ -6032,13 +6035,13 @@ cf_search="$cf_library_path_list $cf_search"
if test -d $cf_cv_library_path_iconv ; then
test -n "$verbose" && echo " ... testing $cf_cv_library_path_iconv" 1>&6
-echo "${as_me:-configure}:6035: testing ... testing $cf_cv_library_path_iconv ..." 1>&5
+echo "${as_me:-configure}:6038: testing ... testing $cf_cv_library_path_iconv ..." 1>&5
CPPFLAGS="$cf_test_CPPFLAGS"
LIBS="-liconv $cf_save_LIBS"
LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_iconv"
cat >conftest.$ac_ext <<_ACEOF
-#line 6041 "configure"
+#line 6044 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -6057,21 +6060,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6060: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6063: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6063: \$? = $ac_status" >&5
+ echo "$as_me:6066: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6066: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6069: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6069: \$? = $ac_status" >&5
+ echo "$as_me:6072: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found iconv library in $cf_cv_library_path_iconv" 1>&6
-echo "${as_me:-configure}:6074: testing ... found iconv library in $cf_cv_library_path_iconv ..." 1>&5
+echo "${as_me:-configure}:6077: testing ... found iconv library in $cf_cv_library_path_iconv ..." 1>&5
cf_cv_find_linkage_iconv=yes
cf_cv_library_file_iconv="-liconv"
@@ -6111,7 +6114,7 @@ am_cv_func_iconv="no, consider installing GNU libiconv"
fi
fi
-echo "$as_me:6114: result: $am_cv_func_iconv" >&5
+echo "$as_me:6117: result: $am_cv_func_iconv" >&5
echo "${ECHO_T}$am_cv_func_iconv" >&6
if test "$am_cv_func_iconv" = yes; then
@@ -6120,14 +6123,14 @@ cat >>confdefs.h <<\EOF
#define HAVE_ICONV 1
EOF
- echo "$as_me:6123: checking if the declaration of iconv() needs const." >&5
+ echo "$as_me:6126: checking if the declaration of iconv() needs const." >&5
echo $ECHO_N "checking if the declaration of iconv() needs const.... $ECHO_C" >&6
if test "${am_cv_proto_iconv_const+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 6130 "configure"
+#line 6133 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -6152,16 +6155,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6155: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6158: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6158: \$? = $ac_status" >&5
+ echo "$as_me:6161: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6161: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6164: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6164: \$? = $ac_status" >&5
+ echo "$as_me:6167: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
am_cv_proto_iconv_const=no
else
@@ -6171,7 +6174,7 @@ am_cv_proto_iconv_const=yes
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:6174: result: $am_cv_proto_iconv_const" >&5
+echo "$as_me:6177: result: $am_cv_proto_iconv_const" >&5
echo "${ECHO_T}$am_cv_proto_iconv_const" >&6
if test "$am_cv_proto_iconv_const" = yes ; then
@@ -6213,7 +6216,7 @@ if test -n "$cf_cv_header_path_iconv" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 6216 "configure"
+#line 6219 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -6225,16 +6228,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6228: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6231: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6231: \$? = $ac_status" >&5
+ echo "$as_me:6234: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6234: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6237: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6237: \$? = $ac_status" >&5
+ echo "$as_me:6240: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -6251,7 +6254,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:6254: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:6257: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -6288,7 +6291,7 @@ if test -n "$cf_cv_library_path_iconv" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:6291: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:6294: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -6299,13 +6302,13 @@ fi
fi
fi
- echo "$as_me:6302: checking for nl_langinfo and CODESET" >&5
+ echo "$as_me:6305: checking for nl_langinfo and CODESET" >&5
echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
if test "${am_cv_langinfo_codeset+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 6308 "configure"
+#line 6311 "configure"
#include "confdefs.h"
#include <langinfo.h>
int
@@ -6317,16 +6320,16 @@ char* cs = nl_langinfo(CODESET);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6320: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6323: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6323: \$? = $ac_status" >&5
+ echo "$as_me:6326: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6326: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6329: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6329: \$? = $ac_status" >&5
+ echo "$as_me:6332: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
am_cv_langinfo_codeset=yes
else
@@ -6337,7 +6340,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:6340: result: $am_cv_langinfo_codeset" >&5
+echo "$as_me:6343: result: $am_cv_langinfo_codeset" >&5
echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
if test $am_cv_langinfo_codeset = yes; then
@@ -6348,13 +6351,13 @@ EOF
fi
if test $ac_cv_header_locale_h = yes; then
- echo "$as_me:6351: checking for LC_MESSAGES" >&5
+ echo "$as_me:6354: checking for LC_MESSAGES" >&5
echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6
if test "${am_cv_val_LC_MESSAGES+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 6357 "configure"
+#line 6360 "configure"
#include "confdefs.h"
#include <locale.h>
int
@@ -6366,16 +6369,16 @@ return LC_MESSAGES
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6369: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6372: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6372: \$? = $ac_status" >&5
+ echo "$as_me:6375: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6375: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6378: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6378: \$? = $ac_status" >&5
+ echo "$as_me:6381: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
am_cv_val_LC_MESSAGES=yes
else
@@ -6385,7 +6388,7 @@ am_cv_val_LC_MESSAGES=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:6388: result: $am_cv_val_LC_MESSAGES" >&5
+echo "$as_me:6391: result: $am_cv_val_LC_MESSAGES" >&5
echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6
if test $am_cv_val_LC_MESSAGES = yes; then
@@ -6395,7 +6398,7 @@ EOF
fi
fi
- echo "$as_me:6398: checking whether NLS is requested" >&5
+ echo "$as_me:6401: checking whether NLS is requested" >&5
echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
# Check whether --enable-nls or --disable-nls was given.
@@ -6405,7 +6408,7 @@ if test "${enable_nls+set}" = set; then
else
USE_NLS=no
fi;
- echo "$as_me:6408: result: $USE_NLS" >&5
+ echo "$as_me:6411: result: $USE_NLS" >&5
echo "${ECHO_T}$USE_NLS" >&6
BUILD_INCLUDED_LIBINTL=no
@@ -6418,7 +6421,7 @@ cat >>confdefs.h <<\EOF
#define ENABLE_NLS 1
EOF
- echo "$as_me:6421: checking whether included gettext is requested" >&5
+ echo "$as_me:6424: checking whether included gettext is requested" >&5
echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6
# Check whether --with-included-gettext or --without-included-gettext was given.
@@ -6428,7 +6431,7 @@ if test "${with_included_gettext+set}" = set; then
else
nls_cv_force_use_gnu_gettext=no
fi;
- echo "$as_me:6431: result: $nls_cv_force_use_gnu_gettext" >&5
+ echo "$as_me:6434: result: $nls_cv_force_use_gnu_gettext" >&5
echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
@@ -6437,7 +6440,7 @@ echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
cf_save_LIBS_1="$LIBS"
LIBS="$LIBICONV $LIBS"
- echo "$as_me:6440: checking for libintl.h and gettext()" >&5
+ echo "$as_me:6443: checking for libintl.h and gettext()" >&5
echo $ECHO_N "checking for libintl.h and gettext()... $ECHO_C" >&6
if test "${cf_cv_func_gettext+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -6448,12 +6451,12 @@ else
cf_cv_header_path_intl=
cf_cv_library_path_intl=
-echo "${as_me:-configure}:6451: testing Starting FIND_LINKAGE(intl,) ..." 1>&5
+echo "${as_me:-configure}:6454: testing Starting FIND_LINKAGE(intl,) ..." 1>&5
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 6456 "configure"
+#line 6459 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6473,16 +6476,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6476: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6479: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6479: \$? = $ac_status" >&5
+ echo "$as_me:6482: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6482: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6485: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6485: \$? = $ac_status" >&5
+ echo "$as_me:6488: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_intl=yes
@@ -6496,7 +6499,7 @@ cat conftest.$ac_ext >&5
LIBS="-lintl $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 6499 "configure"
+#line 6502 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6516,16 +6519,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6519: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6522: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6522: \$? = $ac_status" >&5
+ echo "$as_me:6525: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6525: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6528: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6528: \$? = $ac_status" >&5
+ echo "$as_me:6531: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_intl=yes
@@ -6542,9 +6545,9 @@ cat conftest.$ac_ext >&5
test -n "$verbose" && echo " find linkage for intl library" 1>&6
-echo "${as_me:-configure}:6545: testing find linkage for intl library ..." 1>&5
+echo "${as_me:-configure}:6548: testing find linkage for intl library ..." 1>&5
-echo "${as_me:-configure}:6547: testing Searching for headers in FIND_LINKAGE(intl,) ..." 1>&5
+echo "${as_me:-configure}:6550: testing Searching for headers in FIND_LINKAGE(intl,) ..." 1>&5
cf_save_CPPFLAGS="$CPPFLAGS"
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -6657,11 +6660,11 @@ cf_search="$cf_search $cf_header_path_list"
if test -d $cf_cv_header_path_intl ; then
test -n "$verbose" && echo " ... testing $cf_cv_header_path_intl" 1>&6
-echo "${as_me:-configure}:6660: testing ... testing $cf_cv_header_path_intl ..." 1>&5
+echo "${as_me:-configure}:6663: testing ... testing $cf_cv_header_path_intl ..." 1>&5
CPPFLAGS="$cf_save_CPPFLAGS -I$cf_cv_header_path_intl"
cat >conftest.$ac_ext <<_ACEOF
-#line 6664 "configure"
+#line 6667 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6681,21 +6684,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6684: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6687: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6687: \$? = $ac_status" >&5
+ echo "$as_me:6690: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6690: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6693: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6693: \$? = $ac_status" >&5
+ echo "$as_me:6696: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found intl headers in $cf_cv_header_path_intl" 1>&6
-echo "${as_me:-configure}:6698: testing ... found intl headers in $cf_cv_header_path_intl ..." 1>&5
+echo "${as_me:-configure}:6701: testing ... found intl headers in $cf_cv_header_path_intl ..." 1>&5
cf_cv_find_linkage_intl=maybe
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -6713,7 +6716,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_cv_find_linkage_intl" = maybe ; then
-echo "${as_me:-configure}:6716: testing Searching for intl library in FIND_LINKAGE(intl,) ..." 1>&5
+echo "${as_me:-configure}:6719: testing Searching for intl library in FIND_LINKAGE(intl,) ..." 1>&5
cf_save_LIBS="$LIBS"
cf_save_LDFLAGS="$LDFLAGS"
@@ -6810,13 +6813,13 @@ cf_search="$cf_library_path_list $cf_search"
if test -d $cf_cv_library_path_intl ; then
test -n "$verbose" && echo " ... testing $cf_cv_library_path_intl" 1>&6
-echo "${as_me:-configure}:6813: testing ... testing $cf_cv_library_path_intl ..." 1>&5
+echo "${as_me:-configure}:6816: testing ... testing $cf_cv_library_path_intl ..." 1>&5
CPPFLAGS="$cf_test_CPPFLAGS"
LIBS="-lintl $cf_save_LIBS"
LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_intl"
cat >conftest.$ac_ext <<_ACEOF
-#line 6819 "configure"
+#line 6822 "configure"
#include "confdefs.h"
#include <libintl.h>
@@ -6836,21 +6839,21 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6839: \"$ac_link\"") >&5
+if { (eval echo "$as_me:6842: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:6842: \$? = $ac_status" >&5
+ echo "$as_me:6845: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:6845: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6848: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6848: \$? = $ac_status" >&5
+ echo "$as_me:6851: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found intl library in $cf_cv_library_path_intl" 1>&6
-echo "${as_me:-configure}:6853: testing ... found intl library in $cf_cv_library_path_intl ..." 1>&5
+echo "${as_me:-configure}:6856: testing ... found intl library in $cf_cv_library_path_intl ..." 1>&5
cf_cv_find_linkage_intl=yes
cf_cv_library_file_intl="-lintl"
@@ -6890,7 +6893,7 @@ cf_cv_func_gettext=no
fi
fi
-echo "$as_me:6893: result: $cf_cv_func_gettext" >&5
+echo "$as_me:6896: result: $cf_cv_func_gettext" >&5
echo "${ECHO_T}$cf_cv_func_gettext" >&6
LIBS="$cf_save_LIBS_1"
@@ -6929,7 +6932,7 @@ if test -n "$cf_cv_header_path_intl" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 6932 "configure"
+#line 6935 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -6941,16 +6944,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6944: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:6947: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:6947: \$? = $ac_status" >&5
+ echo "$as_me:6950: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:6950: \"$ac_try\"") >&5
+ { (eval echo "$as_me:6953: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:6953: \$? = $ac_status" >&5
+ echo "$as_me:6956: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -6967,7 +6970,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:6970: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:6973: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -7004,7 +7007,7 @@ if test -n "$cf_cv_library_path_intl" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:7007: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:7010: testing adding $cf_add_libdir to library-path ..." 1>&5
INTLLIBS="-L$cf_add_libdir $INTLLIBS"
fi
@@ -7020,13 +7023,13 @@ fi
for ac_func in dcgettext
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:7023: checking for $ac_func" >&5
+echo "$as_me:7026: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7029 "configure"
+#line 7032 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -7057,16 +7060,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7060: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7063: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:7063: \$? = $ac_status" >&5
+ echo "$as_me:7066: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:7066: \"$ac_try\"") >&5
+ { (eval echo "$as_me:7069: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:7069: \$? = $ac_status" >&5
+ echo "$as_me:7072: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -7076,7 +7079,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:7079: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:7082: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -7091,7 +7094,7 @@ done
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
-echo "$as_me:7094: checking for $ac_word" >&5
+echo "$as_me:7097: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_MSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7118,16 +7121,16 @@ esac
fi
MSGFMT="$ac_cv_path_MSGFMT"
if test "$MSGFMT" != ":"; then
- echo "$as_me:7121: result: $MSGFMT" >&5
+ echo "$as_me:7124: result: $MSGFMT" >&5
echo "${ECHO_T}$MSGFMT" >&6
else
- echo "$as_me:7124: result: no" >&5
+ echo "$as_me:7127: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
-echo "$as_me:7130: checking for $ac_word" >&5
+echo "$as_me:7133: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_GMSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7144,7 +7147,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
- echo "$as_me:7147: found $ac_dir/$ac_word" >&5
+ echo "$as_me:7150: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -7156,17 +7159,17 @@ fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
- echo "$as_me:7159: result: $GMSGFMT" >&5
+ echo "$as_me:7162: result: $GMSGFMT" >&5
echo "${ECHO_T}$GMSGFMT" >&6
else
- echo "$as_me:7162: result: no" >&5
+ echo "$as_me:7165: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
-echo "$as_me:7169: checking for $ac_word" >&5
+echo "$as_me:7172: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_XGETTEXT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7193,10 +7196,10 @@ esac
fi
XGETTEXT="$ac_cv_path_XGETTEXT"
if test "$XGETTEXT" != ":"; then
- echo "$as_me:7196: result: $XGETTEXT" >&5
+ echo "$as_me:7199: result: $XGETTEXT" >&5
echo "${ECHO_T}$XGETTEXT" >&6
else
- echo "$as_me:7199: result: no" >&5
+ echo "$as_me:7202: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -7211,7 +7214,7 @@ fi
if test "$nls_cv_use_gnu_gettext" = "yes"; then
if test ! -d $srcdir/intl ; then
- { { echo "$as_me:7214: error: no NLS library is packaged with this application" >&5
+ { { echo "$as_me:7217: error: no NLS library is packaged with this application" >&5
echo "$as_me: error: no NLS library is packaged with this application" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -7219,7 +7222,7 @@ echo "$as_me: error: no NLS library is packaged with this application" >&2;}
# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
-echo "$as_me:7222: checking for $ac_word" >&5
+echo "$as_me:7225: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_MSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7246,16 +7249,16 @@ esac
fi
MSGFMT="$ac_cv_path_MSGFMT"
if test "$MSGFMT" != ":"; then
- echo "$as_me:7249: result: $MSGFMT" >&5
+ echo "$as_me:7252: result: $MSGFMT" >&5
echo "${ECHO_T}$MSGFMT" >&6
else
- echo "$as_me:7252: result: no" >&5
+ echo "$as_me:7255: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
-echo "$as_me:7258: checking for $ac_word" >&5
+echo "$as_me:7261: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_GMSGFMT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7272,7 +7275,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
- echo "$as_me:7275: found $ac_dir/$ac_word" >&5
+ echo "$as_me:7278: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -7284,17 +7287,17 @@ fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
- echo "$as_me:7287: result: $GMSGFMT" >&5
+ echo "$as_me:7290: result: $GMSGFMT" >&5
echo "${ECHO_T}$GMSGFMT" >&6
else
- echo "$as_me:7290: result: no" >&5
+ echo "$as_me:7293: result: no" >&5
echo "${ECHO_T}no" >&6
fi
# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
-echo "$as_me:7297: checking for $ac_word" >&5
+echo "$as_me:7300: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_XGETTEXT+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7321,10 +7324,10 @@ esac
fi
XGETTEXT="$ac_cv_path_XGETTEXT"
if test "$XGETTEXT" != ":"; then
- echo "$as_me:7324: result: $XGETTEXT" >&5
+ echo "$as_me:7327: result: $XGETTEXT" >&5
echo "${ECHO_T}$XGETTEXT" >&6
else
- echo "$as_me:7327: result: no" >&5
+ echo "$as_me:7330: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -7339,7 +7342,7 @@ fi
if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then
: ;
else
- echo "$as_me:7342: result: found msgfmt program is not GNU msgfmt; ignore it" >&5
+ echo "$as_me:7345: result: found msgfmt program is not GNU msgfmt; ignore it" >&5
echo "${ECHO_T}found msgfmt program is not GNU msgfmt; ignore it" >&6
GMSGFMT=":"
fi
@@ -7349,7 +7352,7 @@ echo "${ECHO_T}found msgfmt program is not GNU msgfmt; ignore it" >&6
if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then
: ;
else
- echo "$as_me:7352: result: found xgettext program is not GNU xgettext; ignore it" >&5
+ echo "$as_me:7355: result: found xgettext program is not GNU xgettext; ignore it" >&5
echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
XGETTEXT=":"
fi
@@ -7369,7 +7372,7 @@ echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo "$as_me:7372: checking for $ac_word" >&5
+echo "$as_me:7375: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_INTLBISON+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7384,7 +7387,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
$as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_INTLBISON="$ac_prog"
-echo "$as_me:7387: found $ac_dir/$ac_word" >&5
+echo "$as_me:7390: found $ac_dir/$ac_word" >&5
break
done
@@ -7392,10 +7395,10 @@ fi
fi
INTLBISON=$ac_cv_prog_INTLBISON
if test -n "$INTLBISON"; then
- echo "$as_me:7395: result: $INTLBISON" >&5
+ echo "$as_me:7398: result: $INTLBISON" >&5
echo "${ECHO_T}$INTLBISON" >&6
else
- echo "$as_me:7398: result: no" >&5
+ echo "$as_me:7401: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -7405,7 +7408,7 @@ done
if test -z "$INTLBISON"; then
ac_verc_fail=yes
else
- echo "$as_me:7408: checking version of bison" >&5
+ echo "$as_me:7411: checking version of bison" >&5
echo $ECHO_N "checking version of bison... $ECHO_C" >&6
ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
case $ac_prog_version in
@@ -7414,7 +7417,7 @@ echo $ECHO_N "checking version of bison... $ECHO_C" >&6
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac
- echo "$as_me:7417: result: $ac_prog_version" >&5
+ echo "$as_me:7420: result: $ac_prog_version" >&5
echo "${ECHO_T}$ac_prog_version" >&6
fi
if test $ac_verc_fail = yes; then
@@ -7440,7 +7443,7 @@ echo "${ECHO_T}$ac_prog_version" >&6
if test "x$ALL_LINGUAS" = "x"; then
LINGUAS=
else
- echo "$as_me:7443: checking for catalogs to be installed" >&5
+ echo "$as_me:7446: checking for catalogs to be installed" >&5
echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
NEW_LINGUAS=
for presentlang in $ALL_LINGUAS; do
@@ -7460,7 +7463,7 @@ echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6
fi
done
LINGUAS=$NEW_LINGUAS
- echo "$as_me:7463: result: $LINGUAS" >&5
+ echo "$as_me:7466: result: $LINGUAS" >&5
echo "${ECHO_T}$LINGUAS" >&6
fi
@@ -7495,7 +7498,7 @@ cf_makefile=makefile
use_our_messages=no
if test "$USE_NLS" = yes ; then
if test -d $srcdir/po ; then
-echo "$as_me:7498: checking if we should use included message-library" >&5
+echo "$as_me:7501: checking if we should use included message-library" >&5
echo $ECHO_N "checking if we should use included message-library... $ECHO_C" >&6
# Check whether --enable-included-msgs or --disable-included-msgs was given.
@@ -7506,7 +7509,7 @@ else
use_our_messages=yes
fi;
fi
-echo "$as_me:7509: result: $use_our_messages" >&5
+echo "$as_me:7512: result: $use_our_messages" >&5
echo "${ECHO_T}$use_our_messages" >&6
fi
@@ -7547,23 +7550,23 @@ else
for ac_header in libintl.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7550: checking for $ac_header" >&5
+echo "$as_me:7553: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7556 "configure"
+#line 7559 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:7560: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7563: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:7566: \$? = $ac_status" >&5
+ echo "$as_me:7569: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7582,7 +7585,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:7585: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:7588: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -7627,14 +7630,14 @@ EOF
fi
fi
-echo "$as_me:7630: checking if -lm needed for math functions" >&5
+echo "$as_me:7633: checking if -lm needed for math functions" >&5
echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6
if test "${cf_cv_need_libm+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7637 "configure"
+#line 7640 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -7649,16 +7652,16 @@ double x = rand(); printf("result = %g\n", sqrt(x))
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7652: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7655: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:7655: \$? = $ac_status" >&5
+ echo "$as_me:7658: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:7658: \"$ac_try\"") >&5
+ { (eval echo "$as_me:7661: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:7661: \$? = $ac_status" >&5
+ echo "$as_me:7664: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_need_libm=no
else
@@ -7668,7 +7671,7 @@ cf_cv_need_libm=yes
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:7671: result: $cf_cv_need_libm" >&5
+echo "$as_me:7674: result: $cf_cv_need_libm" >&5
echo "${ECHO_T}$cf_cv_need_libm" >&6
if test "$cf_cv_need_libm" = yes
then
@@ -7677,7 +7680,7 @@ then
fi
-echo "$as_me:7680: checking if you want to use dmalloc for testing" >&5
+echo "$as_me:7683: checking if you want to use dmalloc for testing" >&5
echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6
# Check whether --with-dmalloc or --without-dmalloc was given.
@@ -7693,7 +7696,7 @@ EOF
else
with_dmalloc=
fi;
-echo "$as_me:7696: result: ${with_dmalloc:-no}" >&5
+echo "$as_me:7699: result: ${with_dmalloc:-no}" >&5
echo "${ECHO_T}${with_dmalloc:-no}" >&6
case .$with_cflags in #(vi
@@ -7787,23 +7790,23 @@ fi
esac
if test "$with_dmalloc" = yes ; then
- echo "$as_me:7790: checking for dmalloc.h" >&5
+ echo "$as_me:7793: checking for dmalloc.h" >&5
echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6
if test "${ac_cv_header_dmalloc_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 7796 "configure"
+#line 7799 "configure"
#include "confdefs.h"
#include <dmalloc.h>
_ACEOF
-if { (eval echo "$as_me:7800: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7803: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:7806: \$? = $ac_status" >&5
+ echo "$as_me:7809: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7822,11 +7825,11 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:7825: result: $ac_cv_header_dmalloc_h" >&5
+echo "$as_me:7828: result: $ac_cv_header_dmalloc_h" >&5
echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6
if test $ac_cv_header_dmalloc_h = yes; then
-echo "$as_me:7829: checking for dmalloc_debug in -ldmalloc" >&5
+echo "$as_me:7832: checking for dmalloc_debug in -ldmalloc" >&5
echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6
if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7834,7 +7837,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldmalloc $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 7837 "configure"
+#line 7840 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -7853,16 +7856,16 @@ dmalloc_debug ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7856: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7859: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:7859: \$? = $ac_status" >&5
+ echo "$as_me:7862: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:7862: \"$ac_try\"") >&5
+ { (eval echo "$as_me:7865: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:7865: \$? = $ac_status" >&5
+ echo "$as_me:7868: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dmalloc_dmalloc_debug=yes
else
@@ -7873,7 +7876,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:7876: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
+echo "$as_me:7879: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6
if test $ac_cv_lib_dmalloc_dmalloc_debug = yes; then
cat >>confdefs.h <<EOF
@@ -7888,7 +7891,7 @@ fi
fi
-echo "$as_me:7891: checking if you want to use dbmalloc for testing" >&5
+echo "$as_me:7894: checking if you want to use dbmalloc for testing" >&5
echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6
# Check whether --with-dbmalloc or --without-dbmalloc was given.
@@ -7904,7 +7907,7 @@ EOF
else
with_dbmalloc=
fi;
-echo "$as_me:7907: result: ${with_dbmalloc:-no}" >&5
+echo "$as_me:7910: result: ${with_dbmalloc:-no}" >&5
echo "${ECHO_T}${with_dbmalloc:-no}" >&6
case .$with_cflags in #(vi
@@ -7998,23 +8001,23 @@ fi
esac
if test "$with_dbmalloc" = yes ; then
- echo "$as_me:8001: checking for dbmalloc.h" >&5
+ echo "$as_me:8004: checking for dbmalloc.h" >&5
echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6
if test "${ac_cv_header_dbmalloc_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 8007 "configure"
+#line 8010 "configure"
#include "confdefs.h"
#include <dbmalloc.h>
_ACEOF
-if { (eval echo "$as_me:8011: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:8014: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:8017: \$? = $ac_status" >&5
+ echo "$as_me:8020: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -8033,11 +8036,11 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:8036: result: $ac_cv_header_dbmalloc_h" >&5
+echo "$as_me:8039: result: $ac_cv_header_dbmalloc_h" >&5
echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6
if test $ac_cv_header_dbmalloc_h = yes; then
-echo "$as_me:8040: checking for debug_malloc in -ldbmalloc" >&5
+echo "$as_me:8043: checking for debug_malloc in -ldbmalloc" >&5
echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6
if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8045,7 +8048,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldbmalloc $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8048 "configure"
+#line 8051 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -8064,16 +8067,16 @@ debug_malloc ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8067: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8070: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8070: \$? = $ac_status" >&5
+ echo "$as_me:8073: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8073: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8076: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8076: \$? = $ac_status" >&5
+ echo "$as_me:8079: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dbmalloc_debug_malloc=yes
else
@@ -8084,7 +8087,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:8087: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
+echo "$as_me:8090: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6
if test $ac_cv_lib_dbmalloc_debug_malloc = yes; then
cat >>confdefs.h <<EOF
@@ -8099,7 +8102,7 @@ fi
fi
-echo "$as_me:8102: checking if you want to use purify for testing" >&5
+echo "$as_me:8105: checking if you want to use purify for testing" >&5
echo $ECHO_N "checking if you want to use purify for testing... $ECHO_C" >&6
# Check whether --with-purify or --without-purify was given.
@@ -8115,7 +8118,7 @@ EOF
else
with_purify=
fi;
-echo "$as_me:8118: result: ${with_purify:-no}" >&5
+echo "$as_me:8121: result: ${with_purify:-no}" >&5
echo "${ECHO_T}${with_purify:-no}" >&6
case .$with_cflags in #(vi
@@ -8208,7 +8211,7 @@ fi
;;
esac
-echo "$as_me:8211: checking if you want to use valgrind for testing" >&5
+echo "$as_me:8214: checking if you want to use valgrind for testing" >&5
echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6
# Check whether --with-valgrind or --without-valgrind was given.
@@ -8224,7 +8227,7 @@ EOF
else
with_valgrind=
fi;
-echo "$as_me:8227: result: ${with_valgrind:-no}" >&5
+echo "$as_me:8230: result: ${with_valgrind:-no}" >&5
echo "${ECHO_T}${with_valgrind:-no}" >&6
case .$with_cflags in #(vi
@@ -8317,7 +8320,7 @@ fi
;;
esac
-echo "$as_me:8320: checking if you want to perform memory-leak testing" >&5
+echo "$as_me:8323: checking if you want to perform memory-leak testing" >&5
echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6
# Check whether --with-no-leaks or --without-no-leaks was given.
@@ -8339,10 +8342,10 @@ EOF
else
with_no_leaks=
fi;
-echo "$as_me:8342: result: $with_no_leaks" >&5
+echo "$as_me:8345: result: $with_no_leaks" >&5
echo "${ECHO_T}$with_no_leaks" >&6
-echo "$as_me:8345: checking if you want --trace option" >&5
+echo "$as_me:8348: checking if you want --trace option" >&5
echo $ECHO_N "checking if you want --trace option... $ECHO_C" >&6
# Check whether --enable-trace or --disable-trace was given.
@@ -8352,7 +8355,7 @@ if test "${enable_trace+set}" = set; then
else
enableval=yes
fi;
-echo "$as_me:8355: result: $enableval" >&5
+echo "$as_me:8358: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS trace\$o"
@@ -8366,7 +8369,7 @@ fi
LIBTOOL_MAKE="#"
-echo "$as_me:8369: checking if libtool -version-number should be used" >&5
+echo "$as_me:8372: checking if libtool -version-number should be used" >&5
echo $ECHO_N "checking if libtool -version-number should be used... $ECHO_C" >&6
# Check whether --enable-libtool-version or --disable-libtool-version was given.
@@ -8383,7 +8386,7 @@ else
cf_libtool_version=yes
fi;
-echo "$as_me:8386: result: $cf_libtool_version" >&5
+echo "$as_me:8389: result: $cf_libtool_version" >&5
echo "${ECHO_T}$cf_libtool_version" >&6
if test "$cf_libtool_version" = yes ; then
@@ -8408,7 +8411,7 @@ LIB_LINK='${CC}'
LIB_INSTALL=
LIB_UNINSTALL=
-echo "$as_me:8411: checking if you want to build libraries with libtool" >&5
+echo "$as_me:8414: checking if you want to build libraries with libtool" >&5
echo $ECHO_N "checking if you want to build libraries with libtool... $ECHO_C" >&6
# Check whether --with-libtool or --without-libtool was given.
@@ -8418,7 +8421,7 @@ if test "${with_libtool+set}" = set; then
else
with_libtool=no
fi;
-echo "$as_me:8421: result: $with_libtool" >&5
+echo "$as_me:8424: result: $with_libtool" >&5
echo "${ECHO_T}$with_libtool" >&6
if test "$with_libtool" != "no"; then
@@ -8449,7 +8452,7 @@ case ".$with_libtool" in #(vi
with_libtool=`echo $with_libtool | sed -e s%NONE%$cf_path_syntax%`
;;
*)
- { { echo "$as_me:8452: error: expected a pathname, not \"$with_libtool\"" >&5
+ { { echo "$as_me:8455: error: expected a pathname, not \"$with_libtool\"" >&5
echo "$as_me: error: expected a pathname, not \"$with_libtool\"" >&2;}
{ (exit 1); exit 1; }; }
;;
@@ -8459,7 +8462,7 @@ esac
else
# Extract the first word of "libtool", so it can be a program name with args.
set dummy libtool; ac_word=$2
-echo "$as_me:8462: checking for $ac_word" >&5
+echo "$as_me:8465: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_LIBTOOL+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8476,7 +8479,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_LIBTOOL="$ac_dir/$ac_word"
- echo "$as_me:8479: found $ac_dir/$ac_word" >&5
+ echo "$as_me:8482: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -8487,20 +8490,20 @@ fi
LIBTOOL=$ac_cv_path_LIBTOOL
if test -n "$LIBTOOL"; then
- echo "$as_me:8490: result: $LIBTOOL" >&5
+ echo "$as_me:8493: result: $LIBTOOL" >&5
echo "${ECHO_T}$LIBTOOL" >&6
else
- echo "$as_me:8493: result: no" >&5
+ echo "$as_me:8496: result: no" >&5
echo "${ECHO_T}no" >&6
fi
fi
if test -z "$LIBTOOL" ; then
- { { echo "$as_me:8499: error: Cannot find libtool" >&5
+ { { echo "$as_me:8502: error: Cannot find libtool" >&5
echo "$as_me: error: Cannot find libtool" >&2;}
{ (exit 1); exit 1; }; }
fi
- LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} -o'
+ LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${DESTDIR}${libdir} ${LIBTOOL_VERSION} `cut -f1 ${srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
LIB_OBJECT='${OBJECTS:.o=.lo}'
LIB_SUFFIX=.la
LIB_CLEAN='${LIBTOOL} --mode=clean'
@@ -8511,17 +8514,17 @@ echo "$as_me: error: Cannot find libtool" >&2;}
LIB_PREP=:
# Show the version of libtool
- echo "$as_me:8514: checking version of libtool" >&5
+ echo "$as_me:8517: checking version of libtool" >&5
echo $ECHO_N "checking version of libtool... $ECHO_C" >&6
# Save the version in a cache variable - this is not entirely a good
# thing, but the version string from libtool is very ugly, and for
# bug reports it might be useful to have the original string. "("
cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
- echo "$as_me:8521: result: $cf_cv_libtool_version" >&5
+ echo "$as_me:8524: result: $cf_cv_libtool_version" >&5
echo "${ECHO_T}$cf_cv_libtool_version" >&6
if test -z "$cf_cv_libtool_version" ; then
- { { echo "$as_me:8524: error: This is not GNU libtool" >&5
+ { { echo "$as_me:8527: error: This is not GNU libtool" >&5
echo "$as_me: error: This is not GNU libtool" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -8555,7 +8558,7 @@ if test "$with_libtool" = "yes" ; then
OBJEXT="lo"
LIBTOOL_MAKE=
-echo "$as_me:8558: checking for additional libtool options" >&5
+echo "$as_me:8561: checking for additional libtool options" >&5
echo $ECHO_N "checking for additional libtool options... $ECHO_C" >&6
# Check whether --with-libtool-opts or --without-libtool-opts was given.
@@ -8565,7 +8568,7 @@ if test "${with_libtool_opts+set}" = set; then
else
with_libtool_opts=no
fi;
-echo "$as_me:8568: result: $with_libtool_opts" >&5
+echo "$as_me:8571: result: $with_libtool_opts" >&5
echo "${ECHO_T}$with_libtool_opts" >&6
case .$with_libtool_opts in
@@ -8578,7 +8581,7 @@ esac
fi
-echo "$as_me:8581: checking for specific curses-directory" >&5
+echo "$as_me:8584: checking for specific curses-directory" >&5
echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6
# Check whether --with-curses-dir or --without-curses-dir was given.
@@ -8588,7 +8591,7 @@ if test "${with_curses_dir+set}" = set; then
else
cf_cv_curses_dir=no
fi;
-echo "$as_me:8591: result: $cf_cv_curses_dir" >&5
+echo "$as_me:8594: result: $cf_cv_curses_dir" >&5
echo "${ECHO_T}$cf_cv_curses_dir" >&6
if ( test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" )
@@ -8619,7 +8622,7 @@ case ".$withval" in #(vi
withval=`echo $withval | sed -e s%NONE%$cf_path_syntax%`
;;
*)
- { { echo "$as_me:8622: error: expected a pathname, not \"$withval\"" >&5
+ { { echo "$as_me:8625: error: expected a pathname, not \"$withval\"" >&5
echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
{ (exit 1); exit 1; }; }
;;
@@ -8652,7 +8655,7 @@ if test -n "$cf_cv_curses_dir/include" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 8655 "configure"
+#line 8658 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -8664,16 +8667,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:8667: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:8670: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:8670: \$? = $ac_status" >&5
+ echo "$as_me:8673: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:8673: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8676: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8676: \$? = $ac_status" >&5
+ echo "$as_me:8679: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -8690,7 +8693,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:8693: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:8696: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -8724,7 +8727,7 @@ if test -n "$cf_cv_curses_dir/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:8727: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:8730: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -8752,7 +8755,7 @@ if test $use_ncurses != no ; then
cf_wide_curses=yes
if test $use_ncurses = ncursesw ; then
-echo "$as_me:8755: checking for multibyte character support" >&5
+echo "$as_me:8758: checking for multibyte character support" >&5
echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
if test "${cf_cv_utf8_lib+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8760,7 +8763,7 @@ else
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8763 "configure"
+#line 8766 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -8773,16 +8776,16 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8776: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8779: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8779: \$? = $ac_status" >&5
+ echo "$as_me:8782: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8782: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8785: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8785: \$? = $ac_status" >&5
+ echo "$as_me:8788: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_utf8_lib=yes
else
@@ -8794,12 +8797,12 @@ cat conftest.$ac_ext >&5
cf_cv_header_path_utf8=
cf_cv_library_path_utf8=
-echo "${as_me:-configure}:8797: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
+echo "${as_me:-configure}:8800: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
cf_save_LIBS="$LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8802 "configure"
+#line 8805 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -8812,16 +8815,16 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8815: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8818: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8818: \$? = $ac_status" >&5
+ echo "$as_me:8821: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8821: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8824: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8824: \$? = $ac_status" >&5
+ echo "$as_me:8827: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_utf8=yes
@@ -8835,7 +8838,7 @@ cat conftest.$ac_ext >&5
LIBS="-lutf8 $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 8838 "configure"
+#line 8841 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -8848,16 +8851,16 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8851: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8854: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:8854: \$? = $ac_status" >&5
+ echo "$as_me:8857: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:8857: \"$ac_try\"") >&5
+ { (eval echo "$as_me:8860: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:8860: \$? = $ac_status" >&5
+ echo "$as_me:8863: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_find_linkage_utf8=yes
@@ -8874,9 +8877,9 @@ cat conftest.$ac_ext >&5
test -n "$verbose" && echo " find linkage for utf8 library" 1>&6
-echo "${as_me:-configure}:8877: testing find linkage for utf8 library ..." 1>&5
+echo "${as_me:-configure}:8880: testing find linkage for utf8 library ..." 1>&5
-echo "${as_me:-configure}:8879: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
+echo "${as_me:-configure}:8882: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
cf_save_CPPFLAGS="$CPPFLAGS"
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -8989,11 +8992,11 @@ cf_search="$cf_search $cf_header_path_list"
if test -d $cf_cv_header_path_utf8 ; then
test -n "$verbose" && echo " ... testing $cf_cv_header_path_utf8" 1>&6
-echo "${as_me:-configure}:8992: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:8995: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
CPPFLAGS="$cf_save_CPPFLAGS -I$cf_cv_header_path_utf8"
cat >conftest.$ac_ext <<_ACEOF
-#line 8996 "configure"
+#line 8999 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -9006,21 +9009,21 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9009: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9012: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9012: \$? = $ac_status" >&5
+ echo "$as_me:9015: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9015: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9018: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9018: \$? = $ac_status" >&5
+ echo "$as_me:9021: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found utf8 headers in $cf_cv_header_path_utf8" 1>&6
-echo "${as_me:-configure}:9023: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:9026: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
cf_cv_find_linkage_utf8=maybe
cf_test_CPPFLAGS="$CPPFLAGS"
@@ -9038,7 +9041,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_cv_find_linkage_utf8" = maybe ; then
-echo "${as_me:-configure}:9041: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
+echo "${as_me:-configure}:9044: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
cf_save_LIBS="$LIBS"
cf_save_LDFLAGS="$LDFLAGS"
@@ -9135,13 +9138,13 @@ cf_search="$cf_library_path_list $cf_search"
if test -d $cf_cv_library_path_utf8 ; then
test -n "$verbose" && echo " ... testing $cf_cv_library_path_utf8" 1>&6
-echo "${as_me:-configure}:9138: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:9141: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
CPPFLAGS="$cf_test_CPPFLAGS"
LIBS="-lutf8 $cf_save_LIBS"
LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
cat >conftest.$ac_ext <<_ACEOF
-#line 9144 "configure"
+#line 9147 "configure"
#include "confdefs.h"
#include <libutf8.h>
@@ -9154,21 +9157,21 @@ putwc(0,0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:9157: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9160: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:9160: \$? = $ac_status" >&5
+ echo "$as_me:9163: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:9163: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9166: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9166: \$? = $ac_status" >&5
+ echo "$as_me:9169: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
test -n "$verbose" && echo " ... found utf8 library in $cf_cv_library_path_utf8" 1>&6
-echo "${as_me:-configure}:9171: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
+echo "${as_me:-configure}:9174: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
cf_cv_find_linkage_utf8=yes
cf_cv_library_file_utf8="-lutf8"
@@ -9210,7 +9213,7 @@ fi
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:9213: result: $cf_cv_utf8_lib" >&5
+echo "$as_me:9216: result: $cf_cv_utf8_lib" >&5
echo "${ECHO_T}$cf_cv_utf8_lib" >&6
# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
@@ -9244,7 +9247,7 @@ if test -n "$cf_cv_header_path_utf8" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9247 "configure"
+#line 9250 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9256,16 +9259,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9259: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9262: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9262: \$? = $ac_status" >&5
+ echo "$as_me:9265: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9265: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9268: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9268: \$? = $ac_status" >&5
+ echo "$as_me:9271: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9282,7 +9285,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9285: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9288: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -9316,7 +9319,7 @@ if test -n "$cf_cv_library_path_utf8" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:9319: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:9322: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -9336,7 +9339,7 @@ for ac_prog in ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo "$as_me:9339: checking for $ac_word" >&5
+echo "$as_me:9342: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_path_NCURSES_CONFIG+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9353,7 +9356,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if $as_executable_p "$ac_dir/$ac_word"; then
ac_cv_path_NCURSES_CONFIG="$ac_dir/$ac_word"
- echo "$as_me:9356: found $ac_dir/$ac_word" >&5
+ echo "$as_me:9359: found $ac_dir/$ac_word" >&5
break
fi
done
@@ -9364,10 +9367,10 @@ fi
NCURSES_CONFIG=$ac_cv_path_NCURSES_CONFIG
if test -n "$NCURSES_CONFIG"; then
- echo "$as_me:9367: result: $NCURSES_CONFIG" >&5
+ echo "$as_me:9370: result: $NCURSES_CONFIG" >&5
echo "${ECHO_T}$NCURSES_CONFIG" >&6
else
- echo "$as_me:9370: result: no" >&5
+ echo "$as_me:9373: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -9382,7 +9385,7 @@ LIBS="`$NCURSES_CONFIG --libs` $LIBS"
# even with config script, some packages use no-override for curses.h
-echo "$as_me:9385: checking if we have identified curses headers" >&5
+echo "$as_me:9388: checking if we have identified curses headers" >&5
echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
if test "${cf_cv_ncurses_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9390,13 +9393,13 @@ else
cf_cv_ncurses_header=none
for cf_header in \
- $use_ncurses/curses.h \
- $use_ncurses/ncurses.h \
- curses.h \
- ncurses.h
+ $use_ncurses/ncurses.h \
+ $use_ncurses/curses.h \
+ ncurses.h \
+ curses.h
do
cat >conftest.$ac_ext <<_ACEOF
-#line 9399 "configure"
+#line 9402 "configure"
#include "confdefs.h"
#include <${cf_header}>
int
@@ -9408,16 +9411,16 @@ initscr(); tgoto("?", 0,0)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9411: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9414: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9414: \$? = $ac_status" >&5
+ echo "$as_me:9417: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9417: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9420: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9420: \$? = $ac_status" >&5
+ echo "$as_me:9423: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_header=$cf_header; break
else
@@ -9428,11 +9431,11 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:9431: result: $cf_cv_ncurses_header" >&5
+echo "$as_me:9434: result: $cf_cv_ncurses_header" >&5
echo "${ECHO_T}$cf_cv_ncurses_header" >&6
if test "$cf_cv_ncurses_header" = none ; then
- { { echo "$as_me:9435: error: No curses header-files found" >&5
+ { { echo "$as_me:9438: error: No curses header-files found" >&5
echo "$as_me: error: No curses header-files found" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -9442,23 +9445,23 @@ fi
for ac_header in $cf_cv_ncurses_header
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:9445: checking for $ac_header" >&5
+echo "$as_me:9448: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 9451 "configure"
+#line 9454 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:9455: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:9458: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:9461: \$? = $ac_status" >&5
+ echo "$as_me:9464: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -9477,7 +9480,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:9480: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:9483: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -9530,7 +9533,7 @@ if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9533 "configure"
+#line 9536 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9542,16 +9545,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9545: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9548: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9548: \$? = $ac_status" >&5
+ echo "$as_me:9551: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9551: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9554: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9554: \$? = $ac_status" >&5
+ echo "$as_me:9557: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9568,7 +9571,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9571: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9574: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -9585,7 +9588,7 @@ fi
}
-echo "$as_me:9588: checking for $cf_ncuhdr_root header in include-path" >&5
+echo "$as_me:9591: checking for $cf_ncuhdr_root header in include-path" >&5
echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
if test "${cf_cv_ncurses_h+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9597,7 +9600,7 @@ else
do
cat >conftest.$ac_ext <<_ACEOF
-#line 9600 "configure"
+#line 9603 "configure"
#include "confdefs.h"
#include <$cf_header>
@@ -9621,16 +9624,16 @@ printf("old\n");
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9624: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9627: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9627: \$? = $ac_status" >&5
+ echo "$as_me:9630: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9630: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9633: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9633: \$? = $ac_status" >&5
+ echo "$as_me:9636: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_h=$cf_header
@@ -9645,14 +9648,14 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:9648: result: $cf_cv_ncurses_h" >&5
+echo "$as_me:9651: result: $cf_cv_ncurses_h" >&5
echo "${ECHO_T}$cf_cv_ncurses_h" >&6
if test "$cf_cv_ncurses_h" != no ; then
cf_cv_ncurses_header=$cf_cv_ncurses_h
else
-echo "$as_me:9655: checking for $cf_ncuhdr_root include-path" >&5
+echo "$as_me:9658: checking for $cf_ncuhdr_root include-path" >&5
echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
if test "${cf_cv_ncurses_h2+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9792,7 +9795,7 @@ if test -n "$cf_incdir" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9795 "configure"
+#line 9798 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9804,16 +9807,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9807: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9810: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9810: \$? = $ac_status" >&5
+ echo "$as_me:9813: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9813: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9816: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9816: \$? = $ac_status" >&5
+ echo "$as_me:9819: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9830,7 +9833,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9833: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9836: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -9851,7 +9854,7 @@ fi
do
cat >conftest.$ac_ext <<_ACEOF
-#line 9854 "configure"
+#line 9857 "configure"
#include "confdefs.h"
#include <$cf_header>
@@ -9875,16 +9878,16 @@ printf("old\n");
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9878: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9881: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9881: \$? = $ac_status" >&5
+ echo "$as_me:9884: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9884: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9887: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9887: \$? = $ac_status" >&5
+ echo "$as_me:9890: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_h2=$cf_header
@@ -9905,12 +9908,12 @@ rm -f conftest.$ac_objext conftest.$ac_ext
CPPFLAGS="$cf_save2_CPPFLAGS"
test "$cf_cv_ncurses_h2" != no && break
done
- test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:9908: error: not found" >&5
+ test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:9911: error: not found" >&5
echo "$as_me: error: not found" >&2;}
{ (exit 1); exit 1; }; }
fi
-echo "$as_me:9913: result: $cf_cv_ncurses_h2" >&5
+echo "$as_me:9916: result: $cf_cv_ncurses_h2" >&5
echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
cf_1st_incdir=`echo $cf_cv_ncurses_h2 | sed -e 's%/[^/]*$%%'`
@@ -9943,7 +9946,7 @@ if test -n "$cf_1st_incdir" ; then
cf_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
cat >conftest.$ac_ext <<_ACEOF
-#line 9946 "configure"
+#line 9949 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -9955,16 +9958,16 @@ printf("Hello")
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9958: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9961: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:9961: \$? = $ac_status" >&5
+ echo "$as_me:9964: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:9964: \"$ac_try\"") >&5
+ { (eval echo "$as_me:9967: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:9967: \$? = $ac_status" >&5
+ echo "$as_me:9970: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -9981,7 +9984,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
if test "$cf_have_incdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6
-echo "${as_me:-configure}:9984: testing adding $cf_add_incdir to include-path ..." 1>&5
+echo "${as_me:-configure}:9987: testing adding $cf_add_incdir to include-path ..." 1>&5
CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
@@ -10024,7 +10027,7 @@ EOF
;;
esac
-echo "$as_me:10027: checking for terminfo header" >&5
+echo "$as_me:10030: checking for terminfo header" >&5
echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
if test "${cf_cv_term_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10042,7 +10045,7 @@ esac
for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
do
cat >conftest.$ac_ext <<_ACEOF
-#line 10045 "configure"
+#line 10048 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10057,16 +10060,16 @@ int x = auto_left_margin
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10060: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:10063: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:10063: \$? = $ac_status" >&5
+ echo "$as_me:10066: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:10066: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10069: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10069: \$? = $ac_status" >&5
+ echo "$as_me:10072: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header="$cf_test"
@@ -10082,7 +10085,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:10085: result: $cf_cv_term_header" >&5
+echo "$as_me:10088: result: $cf_cv_term_header" >&5
echo "${ECHO_T}$cf_cv_term_header" >&6
# Set definitions to allow ifdef'ing to accommodate subdirectories
@@ -10116,7 +10119,7 @@ cat >>confdefs.h <<\EOF
#define NCURSES 1
EOF
-echo "$as_me:10119: checking for ncurses version" >&5
+echo "$as_me:10122: checking for ncurses version" >&5
echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
if test "${cf_cv_ncurses_version+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10142,10 +10145,10 @@ Autoconf "old"
#endif
EOF
cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
- { (eval echo "$as_me:10145: \"$cf_try\"") >&5
+ { (eval echo "$as_me:10148: \"$cf_try\"") >&5
(eval $cf_try) 2>&5
ac_status=$?
- echo "$as_me:10148: \$? = $ac_status" >&5
+ echo "$as_me:10151: \$? = $ac_status" >&5
(exit $ac_status); }
if test -f conftest.out ; then
cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
@@ -10155,7 +10158,7 @@ EOF
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10158 "configure"
+#line 10161 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10180,15 +10183,15 @@ int main()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10183: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10186: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10186: \$? = $ac_status" >&5
+ echo "$as_me:10189: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:10188: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10191: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10191: \$? = $ac_status" >&5
+ echo "$as_me:10194: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -10202,7 +10205,7 @@ fi
rm -f $cf_tempfile
fi
-echo "$as_me:10205: result: $cf_cv_ncurses_version" >&5
+echo "$as_me:10208: result: $cf_cv_ncurses_version" >&5
echo "${ECHO_T}$cf_cv_ncurses_version" >&6
test "$cf_cv_ncurses_version" = no || cat >>confdefs.h <<\EOF
#define NCURSES 1
@@ -10214,7 +10217,7 @@ cf_nculib_root=$use_ncurses
# to link gpm.
cf_ncurses_LIBS=""
cf_ncurses_SAVE="$LIBS"
-echo "$as_me:10217: checking for Gpm_Open in -lgpm" >&5
+echo "$as_me:10220: checking for Gpm_Open in -lgpm" >&5
echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10222,7 +10225,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lgpm $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10225 "configure"
+#line 10228 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -10241,16 +10244,16 @@ Gpm_Open ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10244: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10247: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10247: \$? = $ac_status" >&5
+ echo "$as_me:10250: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10250: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10253: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10253: \$? = $ac_status" >&5
+ echo "$as_me:10256: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_gpm_Gpm_Open=yes
else
@@ -10261,10 +10264,10 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:10264: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "$as_me:10267: result: $ac_cv_lib_gpm_Gpm_Open" >&5
echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
if test $ac_cv_lib_gpm_Gpm_Open = yes; then
- echo "$as_me:10267: checking for initscr in -lgpm" >&5
+ echo "$as_me:10270: checking for initscr in -lgpm" >&5
echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
if test "${ac_cv_lib_gpm_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10272,7 +10275,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lgpm $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10275 "configure"
+#line 10278 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -10291,16 +10294,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10294: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10297: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10297: \$? = $ac_status" >&5
+ echo "$as_me:10300: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10300: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10303: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10303: \$? = $ac_status" >&5
+ echo "$as_me:10306: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_gpm_initscr=yes
else
@@ -10311,7 +10314,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:10314: result: $ac_cv_lib_gpm_initscr" >&5
+echo "$as_me:10317: result: $ac_cv_lib_gpm_initscr" >&5
echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
if test $ac_cv_lib_gpm_initscr = yes; then
LIBS="$cf_ncurses_SAVE"
@@ -10326,7 +10329,7 @@ freebsd*)
# This is only necessary if you are linking against an obsolete
# version of ncurses (but it should do no harm, since it's static).
if test "$cf_nculib_root" = ncurses ; then
- echo "$as_me:10329: checking for tgoto in -lmytinfo" >&5
+ echo "$as_me:10332: checking for tgoto in -lmytinfo" >&5
echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10334,7 +10337,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmytinfo $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10337 "configure"
+#line 10340 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -10353,16 +10356,16 @@ tgoto ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10356: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10359: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10359: \$? = $ac_status" >&5
+ echo "$as_me:10362: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10362: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10365: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10365: \$? = $ac_status" >&5
+ echo "$as_me:10368: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_mytinfo_tgoto=yes
else
@@ -10373,7 +10376,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:10376: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "$as_me:10379: result: $ac_cv_lib_mytinfo_tgoto" >&5
echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
if test $ac_cv_lib_mytinfo_tgoto = yes; then
cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
@@ -10392,13 +10395,13 @@ else
eval 'cf_cv_have_lib_'$cf_nculib_root'=no'
cf_libdir=""
- echo "$as_me:10395: checking for initscr" >&5
+ echo "$as_me:10398: checking for initscr" >&5
echo $ECHO_N "checking for initscr... $ECHO_C" >&6
if test "${ac_cv_func_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10401 "configure"
+#line 10404 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char initscr (); below. */
@@ -10429,16 +10432,16 @@ f = initscr;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10432: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10435: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10435: \$? = $ac_status" >&5
+ echo "$as_me:10438: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10438: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10441: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10441: \$? = $ac_status" >&5
+ echo "$as_me:10444: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_initscr=yes
else
@@ -10448,18 +10451,18 @@ ac_cv_func_initscr=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:10451: result: $ac_cv_func_initscr" >&5
+echo "$as_me:10454: result: $ac_cv_func_initscr" >&5
echo "${ECHO_T}$ac_cv_func_initscr" >&6
if test $ac_cv_func_initscr = yes; then
eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
else
cf_save_LIBS="$LIBS"
- echo "$as_me:10458: checking for initscr in -l$cf_nculib_root" >&5
+ echo "$as_me:10461: checking for initscr in -l$cf_nculib_root" >&5
echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
LIBS="-l$cf_nculib_root $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10462 "configure"
+#line 10465 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -10471,25 +10474,25 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10474: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10477: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10477: \$? = $ac_status" >&5
+ echo "$as_me:10480: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10480: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10483: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10483: \$? = $ac_status" >&5
+ echo "$as_me:10486: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- echo "$as_me:10485: result: yes" >&5
+ echo "$as_me:10488: result: yes" >&5
echo "${ECHO_T}yes" >&6
eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
-echo "$as_me:10492: result: no" >&5
+echo "$as_me:10495: result: no" >&5
echo "${ECHO_T}no" >&6
cf_search=
@@ -10579,11 +10582,11 @@ cf_search="$cf_library_path_list $cf_search"
for cf_libdir in $cf_search
do
- echo "$as_me:10582: checking for -l$cf_nculib_root in $cf_libdir" >&5
+ echo "$as_me:10585: checking for -l$cf_nculib_root in $cf_libdir" >&5
echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 10586 "configure"
+#line 10589 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -10595,25 +10598,25 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10598: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10601: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10601: \$? = $ac_status" >&5
+ echo "$as_me:10604: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10604: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10607: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10607: \$? = $ac_status" >&5
+ echo "$as_me:10610: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- echo "$as_me:10609: result: yes" >&5
+ echo "$as_me:10612: result: yes" >&5
echo "${ECHO_T}yes" >&6
eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
break
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
-echo "$as_me:10616: result: no" >&5
+echo "$as_me:10619: result: no" >&5
echo "${ECHO_T}no" >&6
LIBS="$cf_save_LIBS"
fi
@@ -10628,7 +10631,7 @@ fi
eval 'cf_found_library=$cf_cv_have_lib_'$cf_nculib_root
if test $cf_found_library = no ; then
- { { echo "$as_me:10631: error: Cannot link $cf_nculib_root library" >&5
+ { { echo "$as_me:10634: error: Cannot link $cf_nculib_root library" >&5
echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -10636,7 +10639,7 @@ fi
fi
if test -n "$cf_ncurses_LIBS" ; then
- echo "$as_me:10639: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+ echo "$as_me:10642: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
cf_ncurses_SAVE="$LIBS"
for p in $cf_ncurses_LIBS ; do
@@ -10646,7 +10649,7 @@ echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS..
fi
done
cat >conftest.$ac_ext <<_ACEOF
-#line 10649 "configure"
+#line 10652 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -10658,23 +10661,23 @@ initscr(); mousemask(0,0); tgoto((char *)0, 0, 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:10661: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10664: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10664: \$? = $ac_status" >&5
+ echo "$as_me:10667: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:10667: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10670: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10670: \$? = $ac_status" >&5
+ echo "$as_me:10673: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- echo "$as_me:10672: result: yes" >&5
+ echo "$as_me:10675: result: yes" >&5
echo "${ECHO_T}yes" >&6
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
-echo "$as_me:10677: result: no" >&5
+echo "$as_me:10680: result: no" >&5
echo "${ECHO_T}no" >&6
LIBS="$cf_ncurses_SAVE"
fi
@@ -10692,7 +10695,7 @@ fi
else
cf_wide_curses=no
-echo "$as_me:10695: checking for extra include directories" >&5
+echo "$as_me:10698: checking for extra include directories" >&5
echo $ECHO_N "checking for extra include directories... $ECHO_C" >&6
if test "${cf_cv_curses_incdir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10701,22 +10704,28 @@ else
cf_cv_curses_incdir=no
case $host_os in #(vi
hpux10.*) #(vi
- test -d /usr/include/curses_colr && \
- cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ test -d /usr/include/curses_colr && \
+ cf_cv_curses_incdir="-I/usr/include/curses_colr"
+ fi
;;
sunos3*|sunos4*)
- test -d /usr/5lib && \
- test -d /usr/5include && \
- cf_cv_curses_incdir="-I/usr/5include"
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ test -d /usr/5lib && \
+ test -d /usr/5include && \
+ cf_cv_curses_incdir="-I/usr/5include"
+ fi
;;
esac
fi
-echo "$as_me:10715: result: $cf_cv_curses_incdir" >&5
+echo "$as_me:10724: result: $cf_cv_curses_incdir" >&5
echo "${ECHO_T}$cf_cv_curses_incdir" >&6
test "$cf_cv_curses_incdir" != no && CPPFLAGS="$CPPFLAGS $cf_cv_curses_incdir"
-echo "$as_me:10719: checking if we have identified curses headers" >&5
+echo "$as_me:10728: checking if we have identified curses headers" >&5
echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
if test "${cf_cv_ncurses_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10724,11 +10733,11 @@ else
cf_cv_ncurses_header=none
for cf_header in \
- curses.h \
- ncurses.h ncurses/curses.h ncurses/ncurses.h
+ ncurses.h \
+ curses.h ncurses/ncurses.h ncurses/curses.h
do
cat >conftest.$ac_ext <<_ACEOF
-#line 10731 "configure"
+#line 10740 "configure"
#include "confdefs.h"
#include <${cf_header}>
int
@@ -10740,16 +10749,16 @@ initscr(); tgoto("?", 0,0)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10743: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:10752: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:10746: \$? = $ac_status" >&5
+ echo "$as_me:10755: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:10749: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10758: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10752: \$? = $ac_status" >&5
+ echo "$as_me:10761: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_header=$cf_header; break
else
@@ -10760,11 +10769,11 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:10763: result: $cf_cv_ncurses_header" >&5
+echo "$as_me:10772: result: $cf_cv_ncurses_header" >&5
echo "${ECHO_T}$cf_cv_ncurses_header" >&6
if test "$cf_cv_ncurses_header" = none ; then
- { { echo "$as_me:10767: error: No curses header-files found" >&5
+ { { echo "$as_me:10776: error: No curses header-files found" >&5
echo "$as_me: error: No curses header-files found" >&2;}
{ (exit 1); exit 1; }; }
fi
@@ -10774,23 +10783,23 @@ fi
for ac_header in $cf_cv_ncurses_header
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:10777: checking for $ac_header" >&5
+echo "$as_me:10786: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10783 "configure"
+#line 10792 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:10787: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:10796: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:10793: \$? = $ac_status" >&5
+ echo "$as_me:10802: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -10809,7 +10818,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:10812: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:10821: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -10819,7 +10828,7 @@ EOF
fi
done
-echo "$as_me:10822: checking for terminfo header" >&5
+echo "$as_me:10831: checking for terminfo header" >&5
echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
if test "${cf_cv_term_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10837,7 +10846,7 @@ esac
for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
do
cat >conftest.$ac_ext <<_ACEOF
-#line 10840 "configure"
+#line 10849 "configure"
#include "confdefs.h"
#include <stdio.h>
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10852,16 +10861,16 @@ int x = auto_left_margin
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10855: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:10864: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:10858: \$? = $ac_status" >&5
+ echo "$as_me:10867: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:10861: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10870: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10864: \$? = $ac_status" >&5
+ echo "$as_me:10873: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header="$cf_test"
@@ -10877,7 +10886,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
done
fi
-echo "$as_me:10880: result: $cf_cv_term_header" >&5
+echo "$as_me:10889: result: $cf_cv_term_header" >&5
echo "${ECHO_T}$cf_cv_term_header" >&6
# Set definitions to allow ifdef'ing to accommodate subdirectories
@@ -10906,7 +10915,7 @@ EOF
;;
esac
-echo "$as_me:10909: checking for ncurses version" >&5
+echo "$as_me:10918: checking for ncurses version" >&5
echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
if test "${cf_cv_ncurses_version+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10932,10 +10941,10 @@ Autoconf "old"
#endif
EOF
cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
- { (eval echo "$as_me:10935: \"$cf_try\"") >&5
+ { (eval echo "$as_me:10944: \"$cf_try\"") >&5
(eval $cf_try) 2>&5
ac_status=$?
- echo "$as_me:10938: \$? = $ac_status" >&5
+ echo "$as_me:10947: \$? = $ac_status" >&5
(exit $ac_status); }
if test -f conftest.out ; then
cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
@@ -10945,7 +10954,7 @@ EOF
else
cat >conftest.$ac_ext <<_ACEOF
-#line 10948 "configure"
+#line 10957 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -10970,15 +10979,15 @@ int main()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10973: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10982: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:10976: \$? = $ac_status" >&5
+ echo "$as_me:10985: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:10978: \"$ac_try\"") >&5
+ { (eval echo "$as_me:10987: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:10981: \$? = $ac_status" >&5
+ echo "$as_me:10990: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -10992,16 +11001,16 @@ fi
rm -f $cf_tempfile
fi
-echo "$as_me:10995: result: $cf_cv_ncurses_version" >&5
+echo "$as_me:11004: result: $cf_cv_ncurses_version" >&5
echo "${ECHO_T}$cf_cv_ncurses_version" >&6
test "$cf_cv_ncurses_version" = no || cat >>confdefs.h <<\EOF
#define NCURSES 1
EOF
-echo "$as_me:11001: checking if we have identified curses libraries" >&5
+echo "$as_me:11010: checking if we have identified curses libraries" >&5
echo $ECHO_N "checking if we have identified curses libraries... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
-#line 11004 "configure"
+#line 11013 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11013,16 +11022,16 @@ initscr(); tgoto("?", 0,0)
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11016: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11025: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11019: \$? = $ac_status" >&5
+ echo "$as_me:11028: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11022: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11031: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11025: \$? = $ac_status" >&5
+ echo "$as_me:11034: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -11031,13 +11040,13 @@ cat conftest.$ac_ext >&5
cf_result=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-echo "$as_me:11034: result: $cf_result" >&5
+echo "$as_me:11043: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
if test "$cf_result" = no ; then
case $host_os in #(vi
freebsd*) #(vi
- echo "$as_me:11040: checking for tgoto in -lmytinfo" >&5
+ echo "$as_me:11049: checking for tgoto in -lmytinfo" >&5
echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11045,7 +11054,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lmytinfo $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11048 "configure"
+#line 11057 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11064,16 +11073,16 @@ tgoto ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11067: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11076: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11070: \$? = $ac_status" >&5
+ echo "$as_me:11079: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11073: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11082: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11076: \$? = $ac_status" >&5
+ echo "$as_me:11085: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_mytinfo_tgoto=yes
else
@@ -11084,7 +11093,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11087: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "$as_me:11096: result: $ac_cv_lib_mytinfo_tgoto" >&5
echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
if test $ac_cv_lib_mytinfo_tgoto = yes; then
LIBS="-lmytinfo $LIBS"
@@ -11092,7 +11101,13 @@ fi
;;
hpux10.*) #(vi
- echo "$as_me:11095: checking for initscr in -lcur_colr" >&5
+ # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+ # next (1998), and xcurses "newer" (2000). There is no header file for
+ # Hcurses; the subdirectory curses_colr has the headers (curses.h and
+ # term.h) for cur_colr
+ if test "x$cf_cv_screen" = "xcurses_colr"
+ then
+ echo "$as_me:11110: checking for initscr in -lcur_colr" >&5
echo $ECHO_N "checking for initscr in -lcur_colr... $ECHO_C" >&6
if test "${ac_cv_lib_cur_colr_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11100,7 +11115,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lcur_colr $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11103 "configure"
+#line 11118 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11119,16 +11134,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11122: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11137: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11125: \$? = $ac_status" >&5
+ echo "$as_me:11140: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11128: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11143: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11131: \$? = $ac_status" >&5
+ echo "$as_me:11146: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_cur_colr_initscr=yes
else
@@ -11139,16 +11154,16 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11142: result: $ac_cv_lib_cur_colr_initscr" >&5
+echo "$as_me:11157: result: $ac_cv_lib_cur_colr_initscr" >&5
echo "${ECHO_T}$ac_cv_lib_cur_colr_initscr" >&6
if test $ac_cv_lib_cur_colr_initscr = yes; then
- LIBS="-lcur_colr $LIBS"
- ac_cv_func_initscr=yes
+ LIBS="-lcur_colr $LIBS"
+ ac_cv_func_initscr=yes
else
- echo "$as_me:11151: checking for initscr in -lHcurses" >&5
+ echo "$as_me:11166: checking for initscr in -lHcurses" >&5
echo $ECHO_N "checking for initscr in -lHcurses... $ECHO_C" >&6
if test "${ac_cv_lib_Hcurses_initscr+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11156,7 +11171,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lHcurses $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11159 "configure"
+#line 11174 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11175,16 +11190,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11178: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11193: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11181: \$? = $ac_status" >&5
+ echo "$as_me:11196: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11184: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11199: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11187: \$? = $ac_status" >&5
+ echo "$as_me:11202: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_Hcurses_initscr=yes
else
@@ -11195,22 +11210,23 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11198: result: $ac_cv_lib_Hcurses_initscr" >&5
+echo "$as_me:11213: result: $ac_cv_lib_Hcurses_initscr" >&5
echo "${ECHO_T}$ac_cv_lib_Hcurses_initscr" >&6
if test $ac_cv_lib_Hcurses_initscr = yes; then
- # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
- LIBS="-lHcurses $LIBS"
- CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
- ac_cv_func_initscr=yes
+ # HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+ LIBS="-lHcurses $LIBS"
+ CPPFLAGS="$CPPFLAGS -D__HP_CURSES -D_HP_CURSES"
+ ac_cv_func_initscr=yes
fi
fi
+ fi
;;
linux*)
- case `arch` in
+ case `arch 2>/dev/null` in
x86_64)
if test -d /lib64
then
@@ -11234,7 +11250,7 @@ if test -n "/lib64" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11237: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11253: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11263,7 +11279,7 @@ if test -n "/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11266: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11282: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11294,7 +11310,7 @@ if test -n "/lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11297: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11313: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11306,7 +11322,9 @@ fi
esac
;;
sunos3*|sunos4*)
- if test -d /usr/5lib ; then
+ if test "x$cf_cv_screen" = "xcurses_5lib"
+ then
+ if test -d /usr/5lib ; then
if test -n "/usr/5lib" ; then
for cf_add_libdir in /usr/5lib
@@ -11327,7 +11345,7 @@ if test -n "/usr/5lib" ; then
if test "$cf_have_libdir" = no ; then
test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6
-echo "${as_me:-configure}:11330: testing adding $cf_add_libdir to library-path ..." 1>&5
+echo "${as_me:-configure}:11348: testing adding $cf_add_libdir to library-path ..." 1>&5
LDFLAGS="-L$cf_add_libdir $LDFLAGS"
fi
@@ -11335,7 +11353,8 @@ echo "${as_me:-configure}:11330: testing adding $cf_add_libdir to library-path .
done
fi
- LIBS="-lcurses -ltermcap $LIBS"
+ LIBS="-lcurses -ltermcap $LIBS"
+ fi
fi
ac_cv_func_initscr=yes
;;
@@ -11355,13 +11374,13 @@ if test ".$ac_cv_func_initscr" != .yes ; then
# Check for library containing tgoto. Do this before curses library
# because it may be needed to link the test-case for initscr.
- echo "$as_me:11358: checking for tgoto" >&5
+ echo "$as_me:11377: checking for tgoto" >&5
echo $ECHO_N "checking for tgoto... $ECHO_C" >&6
if test "${ac_cv_func_tgoto+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11364 "configure"
+#line 11383 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char tgoto (); below. */
@@ -11392,16 +11411,16 @@ f = tgoto;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11395: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11414: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11398: \$? = $ac_status" >&5
+ echo "$as_me:11417: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11401: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11420: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11404: \$? = $ac_status" >&5
+ echo "$as_me:11423: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_tgoto=yes
else
@@ -11411,7 +11430,7 @@ ac_cv_func_tgoto=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:11414: result: $ac_cv_func_tgoto" >&5
+echo "$as_me:11433: result: $ac_cv_func_tgoto" >&5
echo "${ECHO_T}$ac_cv_func_tgoto" >&6
if test $ac_cv_func_tgoto = yes; then
cf_term_lib=predefined
@@ -11420,7 +11439,7 @@ else
for cf_term_lib in $cf_check_list termcap termlib unknown
do
as_ac_Lib=`echo "ac_cv_lib_$cf_term_lib''_tgoto" | $as_tr_sh`
-echo "$as_me:11423: checking for tgoto in -l$cf_term_lib" >&5
+echo "$as_me:11442: checking for tgoto in -l$cf_term_lib" >&5
echo $ECHO_N "checking for tgoto in -l$cf_term_lib... $ECHO_C" >&6
if eval "test \"\${$as_ac_Lib+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11428,7 +11447,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-l$cf_term_lib $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11431 "configure"
+#line 11450 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11447,16 +11466,16 @@ tgoto ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11450: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11469: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11453: \$? = $ac_status" >&5
+ echo "$as_me:11472: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11456: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11475: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11459: \$? = $ac_status" >&5
+ echo "$as_me:11478: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Lib=yes"
else
@@ -11467,7 +11486,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11470: result: `eval echo '${'$as_ac_Lib'}'`" >&5
+echo "$as_me:11489: result: `eval echo '${'$as_ac_Lib'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6
if test `eval echo '${'$as_ac_Lib'}'` = yes; then
break
@@ -11482,7 +11501,7 @@ fi
for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown
do
as_ac_Lib=`echo "ac_cv_lib_$cf_curs_lib''_initscr" | $as_tr_sh`
-echo "$as_me:11485: checking for initscr in -l$cf_curs_lib" >&5
+echo "$as_me:11504: checking for initscr in -l$cf_curs_lib" >&5
echo $ECHO_N "checking for initscr in -l$cf_curs_lib... $ECHO_C" >&6
if eval "test \"\${$as_ac_Lib+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11490,7 +11509,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-l$cf_curs_lib $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11493 "configure"
+#line 11512 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -11509,16 +11528,16 @@ initscr ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11512: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11531: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11515: \$? = $ac_status" >&5
+ echo "$as_me:11534: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11518: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11537: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11521: \$? = $ac_status" >&5
+ echo "$as_me:11540: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Lib=yes"
else
@@ -11529,23 +11548,23 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:11532: result: `eval echo '${'$as_ac_Lib'}'`" >&5
+echo "$as_me:11551: result: `eval echo '${'$as_ac_Lib'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6
if test `eval echo '${'$as_ac_Lib'}'` = yes; then
break
fi
done
- test $cf_curs_lib = unknown && { { echo "$as_me:11539: error: no curses library found" >&5
+ test $cf_curs_lib = unknown && { { echo "$as_me:11558: error: no curses library found" >&5
echo "$as_me: error: no curses library found" >&2;}
{ (exit 1); exit 1; }; }
LIBS="-l$cf_curs_lib $cf_save_LIBS"
if test "$cf_term_lib" = unknown ; then
- echo "$as_me:11545: checking if we can link with $cf_curs_lib library" >&5
+ echo "$as_me:11564: checking if we can link with $cf_curs_lib library" >&5
echo $ECHO_N "checking if we can link with $cf_curs_lib library... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
-#line 11548 "configure"
+#line 11567 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11557,16 +11576,16 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11560: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11579: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11563: \$? = $ac_status" >&5
+ echo "$as_me:11582: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11566: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11585: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11569: \$? = $ac_status" >&5
+ echo "$as_me:11588: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -11575,18 +11594,18 @@ cat conftest.$ac_ext >&5
cf_result=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- echo "$as_me:11578: result: $cf_result" >&5
+ echo "$as_me:11597: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
- test $cf_result = no && { { echo "$as_me:11580: error: Cannot link curses library" >&5
+ test $cf_result = no && { { echo "$as_me:11599: error: Cannot link curses library" >&5
echo "$as_me: error: Cannot link curses library" >&2;}
{ (exit 1); exit 1; }; }
elif test "$cf_curs_lib" = "$cf_term_lib" ; then
:
elif test "$cf_term_lib" != predefined ; then
- echo "$as_me:11586: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
+ echo "$as_me:11605: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
echo $ECHO_N "checking if we need both $cf_curs_lib and $cf_term_lib libraries... $ECHO_C" >&6
cat >conftest.$ac_ext <<_ACEOF
-#line 11589 "configure"
+#line 11608 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11598,16 +11617,16 @@ initscr(); tgoto((char *)0, 0, 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11601: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11620: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11604: \$? = $ac_status" >&5
+ echo "$as_me:11623: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11607: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11626: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11610: \$? = $ac_status" >&5
+ echo "$as_me:11629: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=no
else
@@ -11616,7 +11635,7 @@ cat conftest.$ac_ext >&5
LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 11619 "configure"
+#line 11638 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -11628,16 +11647,16 @@ initscr()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:11631: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11650: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11634: \$? = $ac_status" >&5
+ echo "$as_me:11653: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:11637: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11656: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11640: \$? = $ac_status" >&5
+ echo "$as_me:11659: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -11649,7 +11668,7 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- echo "$as_me:11652: result: $cf_result" >&5
+ echo "$as_me:11671: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
fi
fi
@@ -11659,7 +11678,7 @@ fi
cf_all_widgets=yes
-echo "$as_me:11662: checking if you want extra dialogs" >&5
+echo "$as_me:11681: checking if you want extra dialogs" >&5
echo $ECHO_N "checking if you want extra dialogs... $ECHO_C" >&6
# Check whether --enable-extras or --disable-extras was given.
@@ -11669,7 +11688,7 @@ if test "${enable_extras+set}" = set; then
else
enableval=yes
fi;
-echo "$as_me:11672: result: $enableval" >&5
+echo "$as_me:11691: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
cf_all_widgets=yes
@@ -11677,7 +11696,7 @@ else
cf_all_widgets=no
fi
-echo "$as_me:11680: checking if you want config-file support" >&5
+echo "$as_me:11699: checking if you want config-file support" >&5
echo $ECHO_N "checking if you want config-file support... $ECHO_C" >&6
# Check whether --enable-rc-file or --disable-rc-file was given.
@@ -11687,7 +11706,7 @@ if test "${enable_rc_file+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11690: result: $enableval" >&5
+echo "$as_me:11709: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS rc\$o"
@@ -11699,7 +11718,7 @@ else
:
fi
-echo "$as_me:11702: checking if you want Xdialog-style dialogs" >&5
+echo "$as_me:11721: checking if you want Xdialog-style dialogs" >&5
echo $ECHO_N "checking if you want Xdialog-style dialogs... $ECHO_C" >&6
# Check whether --enable-Xdialog or --disable-Xdialog was given.
@@ -11709,7 +11728,7 @@ if test "${enable_Xdialog+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11712: result: $enableval" >&5
+echo "$as_me:11731: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS calendar\$o fselect\$o timebox\$o"
@@ -11721,7 +11740,7 @@ else
:
fi
-echo "$as_me:11724: checking if you want the form dialog" >&5
+echo "$as_me:11743: checking if you want the form dialog" >&5
echo $ECHO_N "checking if you want the form dialog... $ECHO_C" >&6
# Check whether --enable-form or --disable-form was given.
@@ -11731,7 +11750,7 @@ if test "${enable_form+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11734: result: $enableval" >&5
+echo "$as_me:11753: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS formbox\$o"
@@ -11743,7 +11762,7 @@ else
:
fi
-echo "$as_me:11746: checking if you want the gauge dialog" >&5
+echo "$as_me:11765: checking if you want the gauge dialog" >&5
echo $ECHO_N "checking if you want the gauge dialog... $ECHO_C" >&6
# Check whether --enable-gauge or --disable-gauge was given.
@@ -11753,7 +11772,7 @@ if test "${enable_gauge+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11756: result: $enableval" >&5
+echo "$as_me:11775: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS guage\$o pause\$o prgbox\$o progressbox\$o"
@@ -11765,7 +11784,7 @@ else
:
fi
-echo "$as_me:11768: checking if you want the tailbox dialog" >&5
+echo "$as_me:11787: checking if you want the tailbox dialog" >&5
echo $ECHO_N "checking if you want the tailbox dialog... $ECHO_C" >&6
# Check whether --enable-tailbox or --disable-tailbox was given.
@@ -11775,7 +11794,7 @@ if test "${enable_tailbox+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11778: result: $enableval" >&5
+echo "$as_me:11797: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS tailbox\$o"
@@ -11787,7 +11806,7 @@ else
:
fi
-echo "$as_me:11790: checking if you want the mixedform dialog" >&5
+echo "$as_me:11809: checking if you want the mixedform dialog" >&5
echo $ECHO_N "checking if you want the mixedform dialog... $ECHO_C" >&6
# Check whether --enable-mixedform or --disable-mixedform was given.
@@ -11797,7 +11816,7 @@ if test "${enable_mixedform+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11800: result: $enableval" >&5
+echo "$as_me:11819: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS mixedform\$o"
@@ -11809,7 +11828,7 @@ else
:
fi
-echo "$as_me:11812: checking if you want the mixedgauge dialog" >&5
+echo "$as_me:11831: checking if you want the mixedgauge dialog" >&5
echo $ECHO_N "checking if you want the mixedgauge dialog... $ECHO_C" >&6
# Check whether --enable-mixedgauge or --disable-mixedgauge was given.
@@ -11819,7 +11838,7 @@ if test "${enable_mixedgauge+set}" = set; then
else
enableval=$cf_all_widgets
fi;
-echo "$as_me:11822: result: $enableval" >&5
+echo "$as_me:11841: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
EXTRAOBJS="$EXTRAOBJS mixedgauge\$o"
@@ -11831,7 +11850,7 @@ else
:
fi
-echo "$as_me:11834: checking if you want the wide-curses features" >&5
+echo "$as_me:11853: checking if you want the wide-curses features" >&5
echo $ECHO_N "checking if you want the wide-curses features... $ECHO_C" >&6
# Check whether --enable-widec or --disable-widec was given.
@@ -11841,7 +11860,7 @@ if test "${enable_widec+set}" = set; then
else
enableval=$cf_wide_curses
fi;
-echo "$as_me:11844: result: $enableval" >&5
+echo "$as_me:11863: result: $enableval" >&5
echo "${ECHO_T}$enableval" >&6
if test "$enableval" != no ; then
cat >>confdefs.h <<\EOF
@@ -11852,13 +11871,13 @@ else
:
fi
-echo "$as_me:11855: checking for ANSI C header files" >&5
+echo "$as_me:11874: checking for ANSI C header files" >&5
echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
if test "${ac_cv_header_stdc+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11861 "configure"
+#line 11880 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -11866,13 +11885,13 @@ else
#include <float.h>
_ACEOF
-if { (eval echo "$as_me:11869: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:11888: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:11875: \$? = $ac_status" >&5
+ echo "$as_me:11894: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -11894,7 +11913,7 @@ rm -f conftest.err conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 11897 "configure"
+#line 11916 "configure"
#include "confdefs.h"
#include <string.h>
@@ -11912,7 +11931,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat >conftest.$ac_ext <<_ACEOF
-#line 11915 "configure"
+#line 11934 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -11933,7 +11952,7 @@ if test $ac_cv_header_stdc = yes; then
:
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11936 "configure"
+#line 11955 "configure"
#include "confdefs.h"
#include <ctype.h>
#if ((' ' & 0x0FF) == 0x020)
@@ -11959,15 +11978,15 @@ main ()
}
_ACEOF
rm -f conftest$ac_exeext
-if { (eval echo "$as_me:11962: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11981: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:11965: \$? = $ac_status" >&5
+ echo "$as_me:11984: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:11967: \"$ac_try\"") >&5
+ { (eval echo "$as_me:11986: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:11970: \$? = $ac_status" >&5
+ echo "$as_me:11989: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
:
else
@@ -11980,7 +11999,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
fi
-echo "$as_me:11983: result: $ac_cv_header_stdc" >&5
+echo "$as_me:12002: result: $ac_cv_header_stdc" >&5
echo "${ECHO_T}$ac_cv_header_stdc" >&6
if test $ac_cv_header_stdc = yes; then
@@ -11990,13 +12009,13 @@ EOF
fi
-echo "$as_me:11993: checking whether time.h and sys/time.h may both be included" >&5
+echo "$as_me:12012: checking whether time.h and sys/time.h may both be included" >&5
echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
if test "${ac_cv_header_time+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 11999 "configure"
+#line 12018 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
@@ -12012,16 +12031,16 @@ return 0;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12015: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12034: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12018: \$? = $ac_status" >&5
+ echo "$as_me:12037: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12021: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12040: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12024: \$? = $ac_status" >&5
+ echo "$as_me:12043: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_header_time=yes
else
@@ -12031,7 +12050,7 @@ ac_cv_header_time=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12034: result: $ac_cv_header_time" >&5
+echo "$as_me:12053: result: $ac_cv_header_time" >&5
echo "${ECHO_T}$ac_cv_header_time" >&6
if test $ac_cv_header_time = yes; then
@@ -12044,13 +12063,13 @@ fi
ac_header_dirent=no
for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-echo "$as_me:12047: checking for $ac_hdr that defines DIR" >&5
+echo "$as_me:12066: checking for $ac_hdr that defines DIR" >&5
echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12053 "configure"
+#line 12072 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>
@@ -12065,16 +12084,16 @@ return 0;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12068: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12087: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12071: \$? = $ac_status" >&5
+ echo "$as_me:12090: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12074: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12093: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12077: \$? = $ac_status" >&5
+ echo "$as_me:12096: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_Header=yes"
else
@@ -12084,7 +12103,7 @@ eval "$as_ac_Header=no"
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12087: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:12106: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -12097,7 +12116,7 @@ fi
done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
- echo "$as_me:12100: checking for opendir in -ldir" >&5
+ echo "$as_me:12119: checking for opendir in -ldir" >&5
echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
if test "${ac_cv_lib_dir_opendir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12105,7 +12124,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldir $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 12108 "configure"
+#line 12127 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -12124,16 +12143,16 @@ opendir ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12127: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12146: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12130: \$? = $ac_status" >&5
+ echo "$as_me:12149: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12133: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12152: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12136: \$? = $ac_status" >&5
+ echo "$as_me:12155: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_dir_opendir=yes
else
@@ -12144,14 +12163,14 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:12147: result: $ac_cv_lib_dir_opendir" >&5
+echo "$as_me:12166: result: $ac_cv_lib_dir_opendir" >&5
echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
if test $ac_cv_lib_dir_opendir = yes; then
LIBS="$LIBS -ldir"
fi
else
- echo "$as_me:12154: checking for opendir in -lx" >&5
+ echo "$as_me:12173: checking for opendir in -lx" >&5
echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
if test "${ac_cv_lib_x_opendir+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12159,7 +12178,7 @@ else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lx $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 12162 "configure"
+#line 12181 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
@@ -12178,16 +12197,16 @@ opendir ();
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12181: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12200: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12184: \$? = $ac_status" >&5
+ echo "$as_me:12203: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12187: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12206: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12190: \$? = $ac_status" >&5
+ echo "$as_me:12209: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_lib_x_opendir=yes
else
@@ -12198,7 +12217,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-echo "$as_me:12201: result: $ac_cv_lib_x_opendir" >&5
+echo "$as_me:12220: result: $ac_cv_lib_x_opendir" >&5
echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
if test $ac_cv_lib_x_opendir = yes; then
LIBS="$LIBS -lx"
@@ -12209,23 +12228,23 @@ fi
for ac_header in search.h unctrl.h unistd.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:12212: checking for $ac_header" >&5
+echo "$as_me:12231: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12218 "configure"
+#line 12237 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:12222: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:12241: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:12228: \$? = $ac_status" >&5
+ echo "$as_me:12247: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -12244,7 +12263,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:12247: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:12266: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -12254,7 +12273,7 @@ EOF
fi
done
-echo "$as_me:12257: checking for term.h" >&5
+echo "$as_me:12276: checking for term.h" >&5
echo $ECHO_N "checking for term.h... $ECHO_C" >&6
if test "${cf_cv_term_header+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12262,12 +12281,20 @@ else
# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
# for <term.h> if we do not find the variant.
-for cf_header in \
- `echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%/.*%/%'`term.h \
- term.h
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
do
cat >conftest.$ac_ext <<_ACEOF
-#line 12270 "configure"
+#line 12297 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -12281,16 +12308,16 @@ WINDOW *x
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12284: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12311: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12287: \$? = $ac_status" >&5
+ echo "$as_me:12314: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12290: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12317: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12293: \$? = $ac_status" >&5
+ echo "$as_me:12320: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header=$cf_header
break
@@ -12309,7 +12336,7 @@ no)
for cf_header in ncurses/term.h ncursesw/term.h
do
cat >conftest.$ac_ext <<_ACEOF
-#line 12312 "configure"
+#line 12339 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
@@ -12327,16 +12354,16 @@ WINDOW *x
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12330: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12357: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12333: \$? = $ac_status" >&5
+ echo "$as_me:12360: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12336: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12363: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12339: \$? = $ac_status" >&5
+ echo "$as_me:12366: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_term_header=$cf_header
break
@@ -12351,7 +12378,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
esac
fi
-echo "$as_me:12354: result: $cf_cv_term_header" >&5
+echo "$as_me:12381: result: $cf_cv_term_header" >&5
echo "${ECHO_T}$cf_cv_term_header" >&6
case $cf_cv_term_header in #(vi
@@ -12375,13 +12402,13 @@ EOF
;;
esac
-echo "$as_me:12378: checking return type of signal handlers" >&5
+echo "$as_me:12405: checking return type of signal handlers" >&5
echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
if test "${ac_cv_type_signal+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12384 "configure"
+#line 12411 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <signal.h>
@@ -12403,16 +12430,16 @@ int i;
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12406: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12433: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12409: \$? = $ac_status" >&5
+ echo "$as_me:12436: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12412: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12439: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12415: \$? = $ac_status" >&5
+ echo "$as_me:12442: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_type_signal=void
else
@@ -12422,7 +12449,7 @@ ac_cv_type_signal=int
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12425: result: $ac_cv_type_signal" >&5
+echo "$as_me:12452: result: $ac_cv_type_signal" >&5
echo "${ECHO_T}$ac_cv_type_signal" >&6
cat >>confdefs.h <<EOF
@@ -12447,13 +12474,13 @@ wctomb \
do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:12450: checking for $ac_func" >&5
+echo "$as_me:12477: checking for $ac_func" >&5
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12456 "configure"
+#line 12483 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below. */
@@ -12484,16 +12511,16 @@ f = $ac_func;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12487: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12514: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12490: \$? = $ac_status" >&5
+ echo "$as_me:12517: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12493: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12520: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12496: \$? = $ac_status" >&5
+ echo "$as_me:12523: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
eval "$as_ac_var=yes"
else
@@ -12503,7 +12530,7 @@ eval "$as_ac_var=no"
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:12506: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:12533: result: `eval echo '${'$as_ac_var'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
if test `eval echo '${'$as_ac_var'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -12513,14 +12540,14 @@ EOF
fi
done
-echo "$as_me:12516: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
+echo "$as_me:12543: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
echo $ECHO_N "checking if we must define _XOPEN_SOURCE_EXTENDED... $ECHO_C" >&6
if test "${cf_cv_need_xopen_extension+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12523 "configure"
+#line 12550 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -12542,23 +12569,23 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12545: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12572: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12548: \$? = $ac_status" >&5
+ echo "$as_me:12575: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12551: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12578: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12554: \$? = $ac_status" >&5
+ echo "$as_me:12581: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_need_xopen_extension=no
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
-#line 12561 "configure"
+#line 12588 "configure"
#include "confdefs.h"
#define _XOPEN_SOURCE_EXTENDED
@@ -12580,16 +12607,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12583: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12610: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12586: \$? = $ac_status" >&5
+ echo "$as_me:12613: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12589: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12616: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12592: \$? = $ac_status" >&5
+ echo "$as_me:12619: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_need_xopen_extension=yes
else
@@ -12601,10 +12628,98 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:12604: result: $cf_cv_need_xopen_extension" >&5
+echo "$as_me:12631: result: $cf_cv_need_xopen_extension" >&5
echo "${ECHO_T}$cf_cv_need_xopen_extension" >&6
test $cf_cv_need_xopen_extension = yes && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
+echo "$as_me:12635: checking for unctrl.h" >&5
+echo $ECHO_N "checking for unctrl.h... $ECHO_C" >&6
+if test "${cf_cv_unctrl_header+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case ${cf_cv_ncurses_header:-curses.h} in #(vi
+*/*)
+ cf_header_item=`echo ${cf_cv_ncurses_header:-curses.h} | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+ cf_header_list="$cf_header_item $cf_header_list"
+ ;;
+esac
+
+for cf_header in $cf_header_list
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line 12656 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>
+int
+main ()
+{
+WINDOW *x
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:12670: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:12673: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:12676: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:12679: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cf_cv_unctrl_header=$cf_header
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cf_cv_unctrl_header=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+
+case $cf_cv_unctrl_header in #(vi
+no)
+ { echo "$as_me:12693: WARNING: unctrl.h header not found" >&5
+echo "$as_me: WARNING: unctrl.h header not found" >&2;}
+ ;;
+esac
+
+fi
+echo "$as_me:12699: result: $cf_cv_unctrl_header" >&5
+echo "${ECHO_T}$cf_cv_unctrl_header" >&6
+
+case $cf_cv_unctrl_header in #(vi
+unctrl.h) #(vi
+ cat >>confdefs.h <<\EOF
+#define HAVE_UNCTRL_H 1
+EOF
+
+ ;;
+ncurses/unctrl.h) #(vi
+ cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_UNCTRL_H 1
+EOF
+
+ ;;
+ncursesw/unctrl.h)
+ cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_UNCTRL_H 1
+EOF
+
+ ;;
+esac
+
for cf_func in \
flushinp \
getattrs \
@@ -12620,16 +12735,17 @@ getparx \
getpary \
getparyx \
use_default_colors \
+wchgat \
wget_wch \
do
cf_tr_func=`echo "$cf_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
- echo "$as_me:12629: checking for ${cf_func}" >&5
+ echo "$as_me:12745: checking for ${cf_func}" >&5
echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6
-echo "${as_me:-configure}:12632: testing ${cf_func} ..." 1>&5
+echo "${as_me:-configure}:12748: testing ${cf_func} ..." 1>&5
if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12638,7 +12754,7 @@ else
eval cf_result='$ac_cv_func_'$cf_func
if test ".$cf_result" != ".no"; then
cat >conftest.$ac_ext <<_ACEOF
-#line 12641 "configure"
+#line 12757 "configure"
#include "confdefs.h"
#ifdef HAVE_XCURSES
@@ -12661,7 +12777,8 @@ main ()
#ifndef ${cf_func}
long foo = (long)(&${cf_func});
-${cf_cv_main_return:-return}(foo == 0);
+if (foo + 1234 > 5678)
+ ${cf_cv_main_return:-return}(foo);
#endif
;
@@ -12669,16 +12786,16 @@ ${cf_cv_main_return:-return}(foo == 0);
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12672: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12789: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12675: \$? = $ac_status" >&5
+ echo "$as_me:12792: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12678: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12795: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12681: \$? = $ac_status" >&5
+ echo "$as_me:12798: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_result=yes
else
@@ -12694,7 +12811,7 @@ fi
# use the computed/retrieved cache-value:
eval 'cf_result=$cf_cv_func_'$cf_func
- echo "$as_me:12697: result: $cf_result" >&5
+ echo "$as_me:12814: result: $cf_result" >&5
echo "${ECHO_T}$cf_result" >&6
if test $cf_result != no; then
cat >>confdefs.h <<EOF
@@ -12704,13 +12821,13 @@ EOF
fi
done
-echo "$as_me:12707: checking for start_color" >&5
+echo "$as_me:12824: checking for start_color" >&5
echo $ECHO_N "checking for start_color... $ECHO_C" >&6
if test "${ac_cv_func_start_color+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12713 "configure"
+#line 12830 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char start_color (); below. */
@@ -12741,16 +12858,16 @@ f = start_color;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12744: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12861: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12747: \$? = $ac_status" >&5
+ echo "$as_me:12864: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12750: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12867: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12753: \$? = $ac_status" >&5
+ echo "$as_me:12870: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
ac_cv_func_start_color=yes
else
@@ -12760,7 +12877,7 @@ ac_cv_func_start_color=no
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:12763: result: $ac_cv_func_start_color" >&5
+echo "$as_me:12880: result: $ac_cv_func_start_color" >&5
echo "${ECHO_T}$ac_cv_func_start_color" >&6
if test $ac_cv_func_start_color = yes; then
cat >>confdefs.h <<\EOF
@@ -12769,14 +12886,14 @@ EOF
fi
-echo "$as_me:12772: checking for chtype typedef" >&5
+echo "$as_me:12889: checking for chtype typedef" >&5
echo $ECHO_N "checking for chtype typedef... $ECHO_C" >&6
if test "${cf_cv_chtype_decl+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12779 "configure"
+#line 12896 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -12788,16 +12905,16 @@ chtype foo
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12791: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12908: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12794: \$? = $ac_status" >&5
+ echo "$as_me:12911: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12797: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12914: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12800: \$? = $ac_status" >&5
+ echo "$as_me:12917: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_chtype_decl=yes
else
@@ -12807,21 +12924,21 @@ cf_cv_chtype_decl=no
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12810: result: $cf_cv_chtype_decl" >&5
+echo "$as_me:12927: result: $cf_cv_chtype_decl" >&5
echo "${ECHO_T}$cf_cv_chtype_decl" >&6
if test $cf_cv_chtype_decl = yes ; then
cat >>confdefs.h <<\EOF
#define HAVE_TYPE_CHTYPE 1
EOF
- echo "$as_me:12817: checking if chtype is scalar or struct" >&5
+ echo "$as_me:12934: checking if chtype is scalar or struct" >&5
echo $ECHO_N "checking if chtype is scalar or struct... $ECHO_C" >&6
if test "${cf_cv_chtype_type+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12824 "configure"
+#line 12941 "configure"
#include "confdefs.h"
#include <${cf_cv_ncurses_header:-curses.h}>
int
@@ -12833,16 +12950,16 @@ chtype foo; long x = foo
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12836: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12953: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:12839: \$? = $ac_status" >&5
+ echo "$as_me:12956: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:12842: \"$ac_try\"") >&5
+ { (eval echo "$as_me:12959: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12845: \$? = $ac_status" >&5
+ echo "$as_me:12962: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_chtype_type=scalar
else
@@ -12852,7 +12969,7 @@ cf_cv_chtype_type=struct
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:12855: result: $cf_cv_chtype_type" >&5
+echo "$as_me:12972: result: $cf_cv_chtype_type" >&5
echo "${ECHO_T}$cf_cv_chtype_type" >&6
if test $cf_cv_chtype_type = scalar ; then
cat >>confdefs.h <<\EOF
@@ -12862,7 +12979,7 @@ EOF
fi
fi
-echo "$as_me:12865: checking for wide alternate character set array" >&5
+echo "$as_me:12982: checking for wide alternate character set array" >&5
echo $ECHO_N "checking for wide alternate character set array... $ECHO_C" >&6
if test "${cf_cv_curses_wacs_map+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12872,7 +12989,7 @@ else
for name in wacs_map _wacs_map __wacs_map _nc_wacs _wacs_char
do
cat >conftest.$ac_ext <<_ACEOF
-#line 12875 "configure"
+#line 12992 "configure"
#include "confdefs.h"
#ifndef _XOPEN_SOURCE_EXTENDED
@@ -12888,16 +13005,16 @@ void *foo = &($name['k'])
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12891: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13008: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12894: \$? = $ac_status" >&5
+ echo "$as_me:13011: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12897: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13014: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12900: \$? = $ac_status" >&5
+ echo "$as_me:13017: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_curses_wacs_map=$name
break
@@ -12908,14 +13025,14 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
done
fi
-echo "$as_me:12911: result: $cf_cv_curses_wacs_map" >&5
+echo "$as_me:13028: result: $cf_cv_curses_wacs_map" >&5
echo "${ECHO_T}$cf_cv_curses_wacs_map" >&6
test "$cf_cv_curses_wacs_map" != unknown && cat >>confdefs.h <<EOF
#define CURSES_WACS_ARRAY $cf_cv_curses_wacs_map
EOF
-echo "$as_me:12918: checking for wide alternate character constants" >&5
+echo "$as_me:13035: checking for wide alternate character constants" >&5
echo $ECHO_N "checking for wide alternate character constants... $ECHO_C" >&6
if test "${cf_cv_curses_wacs_symbols+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12925,7 +13042,7 @@ cf_cv_curses_wacs_symbols=no
if test "$cf_cv_curses_wacs_map" != unknown
then
cat >conftest.$ac_ext <<_ACEOF
-#line 12928 "configure"
+#line 13045 "configure"
#include "confdefs.h"
#ifndef _XOPEN_SOURCE_EXTENDED
@@ -12942,16 +13059,16 @@ cchar_t *foo = WACS_PLUS;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12945: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13062: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12948: \$? = $ac_status" >&5
+ echo "$as_me:13065: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12951: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13068: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12954: \$? = $ac_status" >&5
+ echo "$as_me:13071: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_curses_wacs_symbols=yes
else
@@ -12961,7 +13078,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
else
cat >conftest.$ac_ext <<_ACEOF
-#line 12964 "configure"
+#line 13081 "configure"
#include "confdefs.h"
#ifndef _XOPEN_SOURCE_EXTENDED
@@ -12977,16 +13094,16 @@ cchar_t *foo = WACS_PLUS
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12980: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13097: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:12983: \$? = $ac_status" >&5
+ echo "$as_me:13100: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:12986: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13103: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:12989: \$? = $ac_status" >&5
+ echo "$as_me:13106: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_curses_wacs_symbols=yes
else
@@ -12997,7 +13114,7 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
fi
-echo "$as_me:13000: result: $cf_cv_curses_wacs_symbols" >&5
+echo "$as_me:13117: result: $cf_cv_curses_wacs_symbols" >&5
echo "${ECHO_T}$cf_cv_curses_wacs_symbols" >&6
test "$cf_cv_curses_wacs_symbols" != no && cat >>confdefs.h <<\EOF
@@ -13007,23 +13124,23 @@ EOF
for ac_header in sys/wait.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:13010: checking for $ac_header" >&5
+echo "$as_me:13127: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13016 "configure"
+#line 13133 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:13020: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:13137: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:13026: \$? = $ac_status" >&5
+ echo "$as_me:13143: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -13042,7 +13159,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:13045: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:13162: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -13063,23 +13180,23 @@ else
for ac_header in wait.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:13066: checking for $ac_header" >&5
+echo "$as_me:13183: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13072 "configure"
+#line 13189 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:13076: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:13193: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:13082: \$? = $ac_status" >&5
+ echo "$as_me:13199: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -13098,7 +13215,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:13101: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:13218: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -13111,23 +13228,23 @@ done
for ac_header in waitstatus.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:13114: checking for $ac_header" >&5
+echo "$as_me:13231: checking for $ac_header" >&5
echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
if eval "test \"\${$as_ac_Header+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13120 "configure"
+#line 13237 "configure"
#include "confdefs.h"
#include <$ac_header>
_ACEOF
-if { (eval echo "$as_me:13124: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:13241: \"$ac_cpp conftest.$ac_ext\"") >&5
(eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
ac_status=$?
egrep -v '^ *\+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
- echo "$as_me:13130: \$? = $ac_status" >&5
+ echo "$as_me:13247: \$? = $ac_status" >&5
(exit $ac_status); } >/dev/null; then
if test -s conftest.err; then
ac_cpp_err=$ac_c_preproc_warn_flag
@@ -13146,7 +13263,7 @@ else
fi
rm -f conftest.err conftest.$ac_ext
fi
-echo "$as_me:13149: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:13266: result: `eval echo '${'$as_ac_Header'}'`" >&5
echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
if test `eval echo '${'$as_ac_Header'}'` = yes; then
cat >>confdefs.h <<EOF
@@ -13168,14 +13285,14 @@ cf_wait_headers="$cf_wait_headers
fi
fi
-echo "$as_me:13171: checking for union wait" >&5
+echo "$as_me:13288: checking for union wait" >&5
echo $ECHO_N "checking for union wait... $ECHO_C" >&6
if test "${cf_cv_type_unionwait+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13178 "configure"
+#line 13295 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13191,16 +13308,16 @@ int x;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13194: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13311: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13197: \$? = $ac_status" >&5
+ echo "$as_me:13314: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13200: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13317: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13203: \$? = $ac_status" >&5
+ echo "$as_me:13320: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_type_unionwait=no
echo compiles ok w/o union wait 1>&5
@@ -13210,7 +13327,7 @@ else
cat conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
-#line 13213 "configure"
+#line 13330 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13230,16 +13347,16 @@ union wait x;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13233: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13350: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13236: \$? = $ac_status" >&5
+ echo "$as_me:13353: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13239: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13356: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13242: \$? = $ac_status" >&5
+ echo "$as_me:13359: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_type_unionwait=yes
echo compiles ok with union wait and possibly macros too 1>&5
@@ -13254,7 +13371,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
fi
-echo "$as_me:13257: result: $cf_cv_type_unionwait" >&5
+echo "$as_me:13374: result: $cf_cv_type_unionwait" >&5
echo "${ECHO_T}$cf_cv_type_unionwait" >&6
test $cf_cv_type_unionwait = yes && cat >>confdefs.h <<\EOF
#define HAVE_TYPE_UNIONWAIT 1
@@ -13262,14 +13379,14 @@ EOF
if test $cf_cv_type_unionwait = yes; then
- echo "$as_me:13265: checking if union wait can be used as wait-arg" >&5
+ echo "$as_me:13382: checking if union wait can be used as wait-arg" >&5
echo $ECHO_N "checking if union wait can be used as wait-arg... $ECHO_C" >&6
if test "${cf_cv_arg_union_wait+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13272 "configure"
+#line 13389 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13281,16 +13398,16 @@ union wait x; wait(&x)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13284: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13401: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13287: \$? = $ac_status" >&5
+ echo "$as_me:13404: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13290: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13407: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13293: \$? = $ac_status" >&5
+ echo "$as_me:13410: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_arg_union_wait=yes
else
@@ -13302,20 +13419,20 @@ rm -f conftest.$ac_objext conftest.$ac_ext
fi
- echo "$as_me:13305: result: $cf_cv_arg_union_wait" >&5
+ echo "$as_me:13422: result: $cf_cv_arg_union_wait" >&5
echo "${ECHO_T}$cf_cv_arg_union_wait" >&6
test $cf_cv_arg_union_wait = yes && cat >>confdefs.h <<\EOF
#define WAIT_USES_UNION 1
EOF
- echo "$as_me:13311: checking if union wait can be used as waitpid-arg" >&5
+ echo "$as_me:13428: checking if union wait can be used as waitpid-arg" >&5
echo $ECHO_N "checking if union wait can be used as waitpid-arg... $ECHO_C" >&6
if test "${cf_cv_arg_union_waitpid+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13318 "configure"
+#line 13435 "configure"
#include "confdefs.h"
$cf_wait_headers
int
@@ -13327,16 +13444,16 @@ union wait x; waitpid(0, &x, 0)
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13330: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13447: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13333: \$? = $ac_status" >&5
+ echo "$as_me:13450: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13336: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13453: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13339: \$? = $ac_status" >&5
+ echo "$as_me:13456: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_arg_union_waitpid=yes
else
@@ -13348,7 +13465,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
fi
- echo "$as_me:13351: result: $cf_cv_arg_union_waitpid" >&5
+ echo "$as_me:13468: result: $cf_cv_arg_union_waitpid" >&5
echo "${ECHO_T}$cf_cv_arg_union_waitpid" >&6
test $cf_cv_arg_union_waitpid = yes && cat >>confdefs.h <<\EOF
#define WAITPID_USES_UNION 1
@@ -13356,14 +13473,14 @@ EOF
fi
-echo "$as_me:13359: checking if we must include wchar.h to declare mbstate_t" >&5
+echo "$as_me:13476: checking if we must include wchar.h to declare mbstate_t" >&5
echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6
if test "${cf_cv_mbstate_t+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
-#line 13366 "configure"
+#line 13483 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -13380,23 +13497,23 @@ mbstate_t state
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13383: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13500: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13386: \$? = $ac_status" >&5
+ echo "$as_me:13503: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13389: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13506: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13392: \$? = $ac_status" >&5
+ echo "$as_me:13509: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_mbstate_t=no
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
-#line 13399 "configure"
+#line 13516 "configure"
#include "confdefs.h"
#include <stdlib.h>
@@ -13414,16 +13531,16 @@ mbstate_t value
}
_ACEOF
rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13417: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13534: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
- echo "$as_me:13420: \$? = $ac_status" >&5
+ echo "$as_me:13537: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:13423: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13540: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13426: \$? = $ac_status" >&5
+ echo "$as_me:13543: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_cv_mbstate_t=yes
else
@@ -13435,7 +13552,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
fi
rm -f conftest.$ac_objext conftest.$ac_ext
fi
-echo "$as_me:13438: result: $cf_cv_mbstate_t" >&5
+echo "$as_me:13555: result: $cf_cv_mbstate_t" >&5
echo "${ECHO_T}$cf_cv_mbstate_t" >&6
if test "$cf_cv_mbstate_t" = yes ; then
@@ -13458,7 +13575,7 @@ PACKAGE_CONFIG=dlg_config.h
EXTRA_OUTPUT="$EXTRA_OUTPUT headers-sh:$srcdir/headers-sh.in"
cat >conftest.$ac_ext <<_ACEOF
-#line 13461 "configure"
+#line 13578 "configure"
#include "confdefs.h"
#include <locale.h>
int
@@ -13470,16 +13587,16 @@ setlocale(LC_ALL, "")
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13473: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13590: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13476: \$? = $ac_status" >&5
+ echo "$as_me:13593: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13479: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13596: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13482: \$? = $ac_status" >&5
+ echo "$as_me:13599: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cat >>confdefs.h <<\EOF
#define HAVE_SETLOCALE 1
@@ -13492,7 +13609,7 @@ fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LD_RPATH_OPT=
-echo "$as_me:13495: checking for an rpath option" >&5
+echo "$as_me:13612: checking for an rpath option" >&5
echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
case $cf_cv_system_name in #(vi
irix*) #(vi
@@ -13505,7 +13622,7 @@ irix*) #(vi
linux*|gnu*|k*bsd*-gnu) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
-openbsd[2-9].*) #(vi
+openbsd[2-9].*|mirbsd*) #(vi
LD_RPATH_OPT="-Wl,-rpath,"
;;
freebsd*) #(vi
@@ -13523,17 +13640,17 @@ solaris2*) #(vi
*)
;;
esac
-echo "$as_me:13526: result: $LD_RPATH_OPT" >&5
+echo "$as_me:13643: result: $LD_RPATH_OPT" >&5
echo "${ECHO_T}$LD_RPATH_OPT" >&6
case "x$LD_RPATH_OPT" in #(vi
x-R*)
- echo "$as_me:13531: checking if we need a space after rpath option" >&5
+ echo "$as_me:13648: checking if we need a space after rpath option" >&5
echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
cf_save_LIBS="$LIBS"
LIBS="${LD_RPATH_OPT}$libdir $LIBS"
cat >conftest.$ac_ext <<_ACEOF
-#line 13536 "configure"
+#line 13653 "configure"
#include "confdefs.h"
int
@@ -13545,16 +13662,16 @@ main ()
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13548: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13665: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13551: \$? = $ac_status" >&5
+ echo "$as_me:13668: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13554: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13671: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13557: \$? = $ac_status" >&5
+ echo "$as_me:13674: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
cf_rpath_space=no
else
@@ -13564,14 +13681,14 @@ cf_rpath_space=yes
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
LIBS="$cf_save_LIBS"
- echo "$as_me:13567: result: $cf_rpath_space" >&5
+ echo "$as_me:13684: result: $cf_rpath_space" >&5
echo "${ECHO_T}$cf_rpath_space" >&6
test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
;;
esac
-echo "$as_me:13573: checking if rpath should be not be set" >&5
-echo $ECHO_N "checking if rpath should be not be set... $ECHO_C" >&6
+echo "$as_me:13690: checking if rpath-hack should be disabled" >&5
+echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6
# Check whether --enable-rpath-hack or --disable-rpath-hack was given.
if test "${enable_rpath_hack+set}" = set; then
@@ -13587,21 +13704,21 @@ else
cf_disable_rpath_hack=no
fi;
-echo "$as_me:13590: result: $cf_disable_rpath_hack" >&5
+echo "$as_me:13707: result: $cf_disable_rpath_hack" >&5
echo "${ECHO_T}$cf_disable_rpath_hack" >&6
if test "$cf_disable_rpath_hack" = no ; then
-echo "$as_me:13594: checking for updated LDFLAGS" >&5
+echo "$as_me:13711: checking for updated LDFLAGS" >&5
echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6
if test -n "$LD_RPATH_OPT" ; then
- echo "$as_me:13597: result: maybe" >&5
+ echo "$as_me:13714: result: maybe" >&5
echo "${ECHO_T}maybe" >&6
for ac_prog in ldd
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo "$as_me:13604: checking for $ac_word" >&5
+echo "$as_me:13721: checking for $ac_word" >&5
echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -13616,7 +13733,7 @@ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
$as_executable_p "$ac_dir/$ac_word" || continue
ac_cv_prog_cf_ldd_prog="$ac_prog"
-echo "$as_me:13619: found $ac_dir/$ac_word" >&5
+echo "$as_me:13736: found $ac_dir/$ac_word" >&5
break
done
@@ -13624,10 +13741,10 @@ fi
fi
cf_ldd_prog=$ac_cv_prog_cf_ldd_prog
if test -n "$cf_ldd_prog"; then
- echo "$as_me:13627: result: $cf_ldd_prog" >&5
+ echo "$as_me:13744: result: $cf_ldd_prog" >&5
echo "${ECHO_T}$cf_ldd_prog" >&6
else
- echo "$as_me:13630: result: no" >&5
+ echo "$as_me:13747: result: no" >&5
echo "${ECHO_T}no" >&6
fi
@@ -13638,8 +13755,10 @@ test -n "$cf_ldd_prog" || cf_ldd_prog="no"
cf_rpath_list="/usr/lib /lib"
if test "$cf_ldd_prog" != no
then
+ cf_rpath_oops=
+
cat >conftest.$ac_ext <<_ACEOF
-#line 13642 "configure"
+#line 13761 "configure"
#include "confdefs.h"
#include <stdio.h>
int
@@ -13651,32 +13770,60 @@ printf("Hello");
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13654: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13773: \"$ac_link\"") >&5
(eval $ac_link) 2>&5
ac_status=$?
- echo "$as_me:13657: \$? = $ac_status" >&5
+ echo "$as_me:13776: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:13660: \"$ac_try\"") >&5
+ { (eval echo "$as_me:13779: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
- echo "$as_me:13663: \$? = $ac_status" >&5
+ echo "$as_me:13782: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort -u`
+ cf_rpath_oops=`$cf_ldd_prog conftest$ac_exeext | fgrep ' not found' | sed -e 's% =>.*$%%' |sort -u`
+ cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort -u`
else
echo "$as_me: failed program was:" >&5
cat conftest.$ac_ext >&5
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+ # If we passed the link-test, but get a "not found" on a given library,
+ # this could be due to inept reconfiguration of gcc to make it only
+ # partly honor /usr/local/lib (or whatever). Sometimes this behavior
+ # is intentional, e.g., installing gcc in /usr/bin and suppressing the
+ # /usr/local libraries.
+ if test -n "$cf_rpath_oops"
+ then
+ for cf_rpath_src in $cf_rpath_oops
+ do
+ for cf_rpath_dir in \
+ /usr/local \
+ /usr/pkg \
+ /opt/sfw
+ do
+ if test -f $cf_rpath_dir/lib/$cf_rpath_src
+ then
+ test -n "$verbose" && echo " ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6
+
+echo "${as_me:-configure}:13810: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5
+
+ LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+ break
+ fi
+ done
+ done
+ fi
fi
test -n "$verbose" && echo " ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
-echo "${as_me:-configure}:13675: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13822: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6
-echo "${as_me:-configure}:13679: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13826: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
cf_rpath_dst=
for cf_rpath_src in $LDFLAGS
@@ -13713,7 +13860,7 @@ do
then
test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
-echo "${as_me:-configure}:13716: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+echo "${as_me:-configure}:13863: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
fi
@@ -13726,11 +13873,11 @@ LDFLAGS=$cf_rpath_dst
test -n "$verbose" && echo " ...checked LDFLAGS $LDFLAGS" 1>&6
-echo "${as_me:-configure}:13729: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13876: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6
-echo "${as_me:-configure}:13733: testing ...checking LIBS $LIBS ..." 1>&5
+echo "${as_me:-configure}:13880: testing ...checking LIBS $LIBS ..." 1>&5
cf_rpath_dst=
for cf_rpath_src in $LIBS
@@ -13767,7 +13914,7 @@ do
then
test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
-echo "${as_me:-configure}:13770: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+echo "${as_me:-configure}:13917: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
fi
@@ -13780,11 +13927,11 @@ LIBS=$cf_rpath_dst
test -n "$verbose" && echo " ...checked LIBS $LIBS" 1>&6
-echo "${as_me:-configure}:13783: testing ...checked LIBS $LIBS ..." 1>&5
+echo "${as_me:-configure}:13930: testing ...checked LIBS $LIBS ..." 1>&5
test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
-echo "${as_me:-configure}:13787: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+echo "${as_me:-configure}:13934: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
fi
@@ -13871,7 +14018,7 @@ DEFS=-DHAVE_CONFIG_H
: ${CONFIG_STATUS=./config.status}
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:13874: creating $CONFIG_STATUS" >&5
+{ echo "$as_me:14021: creating $CONFIG_STATUS" >&5
echo "$as_me: creating $CONFIG_STATUS" >&6;}
cat >$CONFIG_STATUS <<_ACEOF
#! $SHELL
@@ -14047,7 +14194,7 @@ cat >>$CONFIG_STATUS <<\EOF
echo "$ac_cs_version"; exit 0 ;;
--he | --h)
# Conflict between --help and --header
- { { echo "$as_me:14050: error: ambiguous option: $1
+ { { echo "$as_me:14197: error: ambiguous option: $1
Try \`$0 --help' for more information." >&5
echo "$as_me: error: ambiguous option: $1
Try \`$0 --help' for more information." >&2;}
@@ -14066,7 +14213,7 @@ Try \`$0 --help' for more information." >&2;}
ac_need_defaults=false;;
# This is an error.
- -*) { { echo "$as_me:14069: error: unrecognized option: $1
+ -*) { { echo "$as_me:14216: error: unrecognized option: $1
Try \`$0 --help' for more information." >&5
echo "$as_me: error: unrecognized option: $1
Try \`$0 --help' for more information." >&2;}
@@ -14116,7 +14263,7 @@ do
"default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
"default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
"dlg_config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS dlg_config.h:config.hin" ;;
- *) { { echo "$as_me:14119: error: invalid argument: $ac_config_target" >&5
+ *) { { echo "$as_me:14266: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
{ (exit 1); exit 1; }; };;
esac
@@ -14407,7 +14554,7 @@ done; }
esac
if test x"$ac_file" != x-; then
- { echo "$as_me:14410: creating $ac_file" >&5
+ { echo "$as_me:14557: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
rm -f "$ac_file"
fi
@@ -14425,7 +14572,7 @@ echo "$as_me: creating $ac_file" >&6;}
-) echo $tmp/stdin ;;
[\\/$]*)
# Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:14428: error: cannot find input file: $f" >&5
+ test -f "$f" || { { echo "$as_me:14575: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
echo $f;;
@@ -14438,7 +14585,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
echo $srcdir/$f
else
# /dev/null tree
- { { echo "$as_me:14441: error: cannot find input file: $f" >&5
+ { { echo "$as_me:14588: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
fi;;
@@ -14504,7 +14651,7 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
* ) ac_file_in=$ac_file.in ;;
esac
- test x"$ac_file" != x- && { echo "$as_me:14507: creating $ac_file" >&5
+ test x"$ac_file" != x- && { echo "$as_me:14654: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
# First look for the input files in the build tree, otherwise in the
@@ -14515,7 +14662,7 @@ echo "$as_me: creating $ac_file" >&6;}
-) echo $tmp/stdin ;;
[\\/$]*)
# Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:14518: error: cannot find input file: $f" >&5
+ test -f "$f" || { { echo "$as_me:14665: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
echo $f;;
@@ -14528,7 +14675,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
echo $srcdir/$f
else
# /dev/null tree
- { { echo "$as_me:14531: error: cannot find input file: $f" >&5
+ { { echo "$as_me:14678: error: cannot find input file: $f" >&5
echo "$as_me: error: cannot find input file: $f" >&2;}
{ (exit 1); exit 1; }; }
fi;;
@@ -14586,7 +14733,7 @@ cat >>$CONFIG_STATUS <<\EOF
rm -f $tmp/in
if test x"$ac_file" != x-; then
if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
- { echo "$as_me:14589: $ac_file is unchanged" >&5
+ { echo "$as_me:14736: $ac_file is unchanged" >&5
echo "$as_me: $ac_file is unchanged" >&6;}
else
ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
diff --git a/contrib/dialog/configure.in b/contrib/dialog/configure.in
index 5ecd8fb..2feac73 100644
--- a/contrib/dialog/configure.in
+++ b/contrib/dialog/configure.in
@@ -1,4 +1,4 @@
-dnl $Id: configure.in,v 1.64 2011/03/01 00:59:50 tom Exp $
+dnl $Id: configure.in,v 1.65 2011/06/27 10:42:27 tom Exp $
dnl Process this file with autoconf to produce a configure script.
dnl ---------------------------------------------------------------------------
dnl Copyright 1999-2010,2011 -- Thomas E. Dickey
@@ -225,6 +225,7 @@ getparx \
getpary \
getparyx \
use_default_colors \
+wchgat \
wget_wch \
)
diff --git a/contrib/dialog/dialog.1 b/contrib/dialog/dialog.1
index fc99311..8fd4de1 100644
--- a/contrib/dialog/dialog.1
+++ b/contrib/dialog/dialog.1
@@ -1,5 +1,5 @@
'\" t
-.\" $Id: dialog.1,v 1.126 2011/03/02 01:24:21 tom Exp $
+.\" $Id: dialog.1,v 1.133 2011/06/29 09:39:29 tom Exp $
.\" Copyright 2005-2010,2011 Thomas E. Dickey
.\"
.\" This program is free software; you can redistribute it and/or modify
@@ -36,7 +36,7 @@
.RE
..
.
-.TH \*D 1 "" "$Date: 2011/03/02 01:24:21 $"
+.TH \*D 1 "" "$Date: 2011/06/29 09:39:29 $"
.SH NAME
\*p \- display dialog boxes from shell scripts
.SH SYNOPSIS
@@ -285,8 +285,9 @@ Override the label used for "Extra" buttons.
Note: for inputmenu widgets, this defaults to "Rename".
.
.IP "\fB--help"
-Prints the help message to \fB\*p\fP's output.
-The help message is printed if no options are given.
+Prints the help message to the standard output and exits.
+The help message is also printed if no options are given,
+or if an unrecognized option is given.
.
.IP "\fB--help-button"
Show a help-button after "OK" and "Cancel" buttons,
@@ -307,6 +308,12 @@ after the item-help "HELP" information.
This can be used to reconstruct the state of a checklist after processing
the help request.
.
+.IP "\fB--hfile \fIfilename"
+Display the given file using a textbox when the user presses F1.
+.
+.IP "\fB--hline \fIstring"
+Display the given string centered at the bottom of the widget.
+.
.IP "\fB--ignore"
Ignore options that \fB\*p\fP does not recognize.
Some well-known ones such as "\fB--icon\fP" are ignored anyway,
@@ -385,6 +392,10 @@ See also "\fB--ascii-lines\fR".
.IP "\fB--no-mouse
Do not enable the mouse.
.
+.IP "\fB--no-nl-expand
+Do not convert "\\n" substrings of the message/prompt text into
+literal newlines.
+.
.IP "\fB--no-ok"
.IP "\fB--nook"
Suppress the "OK" button in checklist, inputbox and menu box modes.
@@ -420,8 +431,9 @@ Prints the size of each dialog box to \fB\*p\fP's output.
.IP "\fB--print-version"
Prints \fB\*p\fR's version to \fB\*p\fP's output.
This may be used alone, without other options.
+It does not cause \fBdialog\fP to exit by itself.
.
-.IP "\fB--scrollbar \fIstring"
+.IP "\fB--scrollbar"
For widgets holding a scrollable set of data,
draw a scrollbar on its right-margin.
This does not respond to the mouse.
@@ -501,6 +513,7 @@ string to be displayed at the top of the dialog box.
logs the command-line parameters and
keystrokes to the given file.
If \fBdialog\fP reads a configure file, it is logged as well.
+Piped input to the \fIgauge\fP widget is logged.
Use control/T to log a picture of the current dialog window.
.
.IP "\fB--trim"
@@ -511,7 +524,8 @@ trim literal newlines and repeated blanks from message text.
See also the "\fB--cr-wrap\fR" and "\fB--no-collapse\fR" options.
.
.IP "\fB--version"
-Same as "\fB--print-version\fP".
+Prints \fB\*p\fR's version to the standard output, and exits.
+See also "\fB--print-version\fP".
.
.IP "\fB--visit-items"
Modify the tab-traversal of checklist, radiobox, menubox and inputmenu
@@ -1278,12 +1292,13 @@ also does not work for common options of \*p, such as the gauge box.
original dialog 0.4 program.
.PP
\fBwhiptail\fP's manpage borrows features from \fB\*p\fP, e.g.,
-\fB--default-item\fP, \fB--output-fd\fP,
-but oddly cites only \fB\*p\fP versions up to 0.4 as a source.
+\fB--default-item\fP (2000),
+\fB--output-fd\fP (2002),
+but oddly cites only \fB\*p\fP versions up to 0.4 (1996) as a source.
That is, its manpage refers to features which
were borrowed from more recent versions of \fB\*p\fP, e.g.,
the \fB--gauge\fP and \fB--password\fP boxes,
-as well as options such as \fB-separate-output\fP.
+as well as options such as \fB-separate-output\fP (2008).
Somewhat humorously, one may note that the \fBpopt\fP feature
(undocumented in its manpage)
of using a "--" as an escape was documented in \fB\*p\fP's manpage about
diff --git a/contrib/dialog/dialog.3 b/contrib/dialog/dialog.3
index 521684a..62938af 100644
--- a/contrib/dialog/dialog.3
+++ b/contrib/dialog/dialog.3
@@ -1,4 +1,4 @@
-.\" $Id: dialog.3,v 1.60 2011/03/02 10:19:12 tom Exp $
+.\" $Id: dialog.3,v 1.68 2011/06/29 09:07:36 tom Exp $
.\" Copyright 2005-2010,2011 Thomas E. Dickey
.\"
.\" This program is free software; you can redistribute it and/or modify
@@ -21,11 +21,24 @@
.ds l dialog
.ds L Dialog
.ds D DIALOG
+.
+.de ES
+.ne 8
+.IP
+..
+.de EX
+.RS +10
+.nf
+..
+.de EE
+.fi
+.RE
+..
.\" Bulleted paragraph
.de bP
.IP \(bu 4
..
-.TH \*D 3 "" "$Date: 2011/03/02 10:19:12 $"
+.TH \*D 3 "" "$Date: 2011/06/29 09:07:36 $"
.SH NAME
\*l \- widgets and utilities for the \*p program
.SH SYNOPSIS
@@ -66,7 +79,7 @@ Colors and video attributes are categorized and associated with
settings in the configuration file
(see the discussion of \fI$DIALOGRC\fP in \fB\*p\fP(1)).
The \fIDIALOG_ATR(n)\fP macro is used for defining the references
-to the combined color and attribute table \fIdlg_color_table[]\fP.
+to the combined color and attribute table \fBdlg_color_table[]\fP.
.PP
The \fB\*p\fP application passes its command-line parameters
to the widget functions. Some of those parameters are single values,
@@ -85,7 +98,7 @@ These include definitions based on the generated \fI<dlg_config.h>\fP header.
.SH DATA STRUCTURES
All of the global data for the \fB\*l\fP library is stored in
a few structures: \fIDIALOG_STATE\fP, \fIDIALOG_VARS\fP and \fIDIALOG_COLORS\fP.
-The corresponding \fIdialog_state\fP, \fIdialog_vars\fP and \fIdlg_color_table\fP
+The corresponding \fBdialog_state\fP, \fBdialog_vars\fP and \fBdlg_color_table\fP
global variables should be initialized to zeros,
and then populated with the data to use.
A few of these must be nonzero for the corresponding widgets to function.
@@ -133,7 +146,7 @@ prefer to write results to the standard output,
e.g., by using the "\fB--stdout\fP" option.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_STATE.output_count
-This is incremented by \fIdlg_does_output\fP,
+This is incremented by \fBdlg_does_output\fP,
which is called by each widget that writes text to the output.
The \fB\*p\fP application uses that to decide if it should
also write a separator, i.e.,
@@ -205,12 +218,15 @@ suppress shadows that would be drawn to the right and bottom of each dialog box.
This corresponds to the command-line option "\fB--visit-items\fP".
.\" ---------------------------------------------------------------------------
.PP
-The \fB\*p\fP application resets the \fIdialog_vars\fP data before
+The \fB\*p\fP application resets the \fBdialog_vars\fP data before
accepting options to invoke each widget.
Most of the \fIDIALOG_VARS\fP members are set directly from \fB\*p\fP's
command-line options:
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.ascii_lines
+This corresponds to the command-line option "\fB--ascii-lines\fP.
+It causes line-drawing to be done with ASCII characters, e.g., "+" and "-".
+See \fIDIALOG_VARS.no_lines\fP.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.backtitle
This corresponds to the command-line option "\fB--backtitle\fP \fIbacktitle\fP".
@@ -344,10 +360,20 @@ and the item-help text will be written to \fB\*p\fP's output after the token "HE
Otherwise, the return status will indicate that the Help button was pressed,
and no message printed.
.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.help_file
+This corresponds to the command-line option "\fB--hfile\fP \fIstring\fP".
+The given filename is passed to \fBdialog_helpfile\fP when the user
+presses F1.
+.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.help_label
This corresponds to the command-line option "\fB--help-label\fP \fIstring\fP".
The given string overrides the label used for "Help" buttons.
.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.help_line
+This corresponds to the command-line option "\fB--hline\fP \fIstring\fP".
+The given string is displayed in the bottom of dialog windows,
+like a subtitle.
+.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.help_status
This corresponds to the command-line option "\fB--help-status\fP".
If true, and the the help-button is selected,
@@ -391,6 +417,10 @@ This corresponds to the command-line option "\fB--insecure\fP".
If true, make the password widget friendlier but less secure,
by echoing asterisks for each character.
.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.in_helpfile
+This variable is used to prevent \fBdialog_helpfile\fP from showing
+anything, e.g., if F1 were pressed within a help-file display.
+.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.item_help
This corresponds to the command-line option "\fB--item-help\fP".
If true,
@@ -423,6 +453,14 @@ This corresponds to the command-line option "\fB--no-label\fP \fIstring\fP".
The given string overrides the label used for "No" buttons.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.no_lines
+This corresponds to the command-line option "\fB--no-lines\fP.
+It suppresses line-drawing.
+See \fIDIALOG_VARS.ascii_lines\fP.
+.\" ---------------------------------------------------------------------------
+.IP \fIDIALOG_VARS.no_nl_expand
+This corresponds to the command-line option "\fB--no-nl-expand\fP".
+If false, \fBdlg_trim_string\fP converts literal "\\n" substrings
+in a message into newlines.
.\" ---------------------------------------------------------------------------
.IP \fIDIALOG_VARS.nocancel
This corresponds to the command-line option "\fB--no-cancel\fP".
@@ -537,24 +575,31 @@ Other parameters depend on the box type.
.IP \fBdialog_calendar
implements the "\fB--calendar\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP subtitle
+.TP 5
+.B const char * \fIsubtitle
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the height excluding the fixed-height calendar grid.
-.IP width
+.TP 5
+.B int \fIwidth
is the overall width of the box,
which is adjusted up to the calendar grid's minimum width if needed.
-.IP day
+.TP 5
+.B int \fIday
is the initial day of the week shown,
counting zero as Sunday.
If the value is negative, the current day of the week is used.
-.IP month
+.TP 5
+.B int \fImonth
is the initial month of the year shown,
counting one as January.
If the value is negative, the current month of the year is used.
-.IP year
+.TP 5
+.B int \fIyear
is the initial year shown.
If the value is negative, the current year is used.
.RE
@@ -563,22 +608,29 @@ If the value is negative, the current year is used.
implements the "\fB--checklist\fP" and "\fB--radiolist\fP" options
depending on the \fIflag\fP parameter.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
-.IP list_height
+.TP 5
+.B int \fIlist_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fItag item status \fR
@@ -589,7 +641,7 @@ or
\fItag item status help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.IP flag
is either \fIFLAG_CHECK\fP, for checklists,
or \fIFLAG_RADIO\fP for radiolists.
@@ -598,15 +650,19 @@ or \fIFLAG_RADIO\fP for radiolists.
.IP \fBdialog_dselect
implements the "\fB--dselect\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP path
+.TP 5
+.B const char * \fIpath
is the preselected value to show in the input-box,
which is used also to set the directory- and file-windows.
-.IP height
+.TP 5
+.B int \fIheight
is the height excluding the minimum needed to show the dialog box framework.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -614,14 +670,18 @@ If zero, the height is based on the screen size.
.IP \fBdialog_editbox
implements the "\fB--editbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP file
+.TP 5
+.B const char * \fIfile
is the name of the file from which to read.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
.RE
@@ -629,22 +689,29 @@ If zero, the height is adjusted to use the available screen size.
.IP \fBdialog_form
implements the "\fB--form\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
-.IP form_height
+.TP 5
+.B int \fIform_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fIName NameY NameX Text TextY TextX FLen ILen\fR
@@ -655,39 +722,53 @@ or
\fIName NameY NameX Text TextY TextX FLen ILen Help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.RE
.\" ************************************************************************
.IP \fBdialog_fselect
implements the "\fB--fselect\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP path
+.TP 5
+.B const char * \fIpath
is the preselected value to show in the input-box,
which is used also to set the directory- and file-windows.
-.IP height
+.TP 5
+.B int \fIheight
is the height excluding the minimum needed to show the dialog box framework.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
.\" ************************************************************************
.IP \fBdialog_gauge
implements the "\fB--gauge\fP" option.
+Alternatively, a simpler or customized gauge widget can be
+setup using
+\fBdlg_allocate_gauge\fP,
+\fBdlg_update_gauge\fP and
+\fBdlg_free_gauge\fP.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP percent
+.TP 5
+.B int \fIpercent
is the percentage to show in the progress bar.
.RE
.\" ************************************************************************
@@ -695,43 +776,79 @@ is the percentage to show in the progress bar.
implements the "\fB--inputbox\fP" or
"\fB--password\fP" option, depending on the value of \fIpassword\fP.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP init
+.TP 5
+.B const char * \fIinit
is the initial value of the input box, whose length is taken into account
when auto-sizing the width of the dialog box.
-.IP password
+.TP 5
+.B int \fIpassword
if true, causes typed input to be echoed as asterisks.
.RE
.\" ************************************************************************
+.IP \fBdialog_helpfile
+implements the "\fB--hfile\fP" option.
+.RS
+.TP 5
+.B const char * \fItitle
+is the title on the top of the widget.
+.TP 5
+.B const char * \fIfile
+is the name of a file containing the text to display.
+This function is internally bound to F1 (function key "1"),
+passing \fBdialog_vars.help_file\fP as a parameter.
+The \fBdialog\fP program sets that variable when the \fB--hfile\fP option
+is given.
+.TP 5
+.B int \fIheight
+is the desired height of the box.
+If zero, the height is based on the screen size.
+.TP 5
+.B int \fIwidth
+is the desired width of the box.
+If zero, the height is based on the screen size.
+.RE
+.\" ************************************************************************
.IP \fBdialog_menu
implements the "\fB--menu\fP" or "\fB--inputmenu\fP" option
-depending on whether \fIdialog_vars.input_menu\fP is set.
+depending on whether \fBdialog_vars.input_menu\fP is set.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP menu_height
+.TP 5
+.B int \fImenu_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fItag item\fR
@@ -742,28 +859,35 @@ or
\fItag item help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.RE
.\" ************************************************************************
.IP \fBdialog_mixedform
implements the "\fB--mixedform\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is adjusted to use the available screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is adjusted to use the available screen size.
-.IP form_height
+.TP 5
+.B int \fIform_height
is the minimum height to reserve for displaying the list.
If zero, it is computed based on the given \fIheight\fP and \fIwidth\fP.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed either as a list of rows
.RS
\fIName NameY NameX Text TextY TextX FLen ILen Ityp\fR
@@ -774,27 +898,33 @@ or
\fIName NameY NameX Text TextY TextX FLen ILen Ityp Help\fR
.RE
.IP
-depending on whether \fIdialog_vars.item_help\fP is set.
+depending on whether \fBdialog_vars.item_help\fP is set.
.RE
.\" ************************************************************************
.IP \fBdialog_mixedgauge
implements the "\fB--mixedgauge\fP" option
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the caption text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.IP percent
is the percentage to show in the progress bar.
-.IP item_no
+.TP 5
+.B int \fIitem_no
is the number of rows in \fIitems\fP.
-.IP items
+.TP 5
+.B int \fIitems
is an array of strings which is viewed as a list of \fItag\fP and \fIitem\fP values.
The \fItag\fP values are listed, one per row, in the list at the top of
the widget.
@@ -832,17 +962,22 @@ Other strings are displayed as is.
implements the "\fB--msgbox\fP" or "\fB--infobox\fP" option
depending on whether \fIpauseopt\fP is set.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP pauseopt
+.TP 5
+.B int \fIpauseopt
if true, an "OK" button will be shown,
and the dialog will wait for it to complete.
With an "OK" button, it is denoted a "msgbox",
@@ -852,35 +987,45 @@ without an "OK" button, it is denoted an "infobox".
.IP \fBdialog_pause
implements the "\fB--pause\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP seconds
+.TP 5
+.B int \fIseconds
is the timeout to use for the progress bar.
.RE
.\" ************************************************************************
.IP \fBdialog_prgbox
implements the "\fB--prgbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
If empty or null, no prompt is shown.
-.IP command
+.TP 5
+.B const char * \fIcommand
is the name of the command to execute.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP pauseopt
+.TP 5
+.B int \fIpauseopt
if true, an "OK" button will be shown,
and the dialog will wait for it to complete.
.RE
@@ -888,15 +1033,19 @@ and the dialog will wait for it to complete.
.IP \fBdialog_progressbox
implements the "\fB--progressbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
If empty or null, no prompt is shown.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -905,19 +1054,24 @@ If zero, the height is based on the screen size.
implements the "\fB--tailbox\fP" or "\fB--tailboxbg\fP" option
depending on whether \fIbg_task\fP is set.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP file
+.TP 5
+.B const char * \fIfile
is the name of the file to display in the dialog.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP bg_task
+.TP 5
+.B int \fIbg_task
if true,
-the window is added to the callback list in \fIdialog_state\fP,
+the window is added to the callback list in \fBdialog_state\fP,
and the application will poll for the window to be updated.
Otherwise an "OK" button is added to the window,
and it will be closed when the button is activated.
@@ -926,14 +1080,18 @@ and it will be closed when the button is activated.
.IP \fBdialog_textbox
implements the "\fB--textbox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP file
+.TP 5
+.B const char * \fIfile
is the name of the file to display in the dialog.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -941,25 +1099,32 @@ If zero, the height is based on the screen size.
.IP \fBdialog_timebox
implements the "\fB--timebox\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP subtitle
+.TP 5
+.B const char * \fIsubtitle
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP hour
+.TP 5
+.B int \fIhour
is the initial hour shown.
If the value is negative, the current hour is used.
Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 24.
-.IP minute
+.TP 5
+.B int \fIminute
is the initial minute shown.
If the value is negative, the current minute is used.
Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 60.
-.IP second
+.TP 5
+.B int \fIsecond
is the initial second shown.
If the value is negative, the current second is used.
Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 60.
@@ -968,14 +1133,18 @@ Returns DLG_EXIT_ERROR if the value specified is greater than or equal to 60.
.IP \fBdialog_yesno
implements the "\fB--yesno\fP" option.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
.RE
@@ -989,7 +1158,7 @@ Bowing to longstanding usage, the functions that initialize the
display and end it are named \fIinit_dialog\fP and \fIend_dialog\fP.
.PP
The only non-widget function whose name begins with "\fIdialog_\fP"
-is \fIdialog_version\fP, which returns the version number of the
+is \fBdialog_version\fP, which returns the version number of the
library as a string.
.
.PP
@@ -1079,6 +1248,30 @@ This is the number of rows in the array.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_allocate_gauge
+Allocates a gauge widget.
+Use \fBdlg_update_gauge\fP to display the result.
+.RS
+.TP 5
+.B const char * \fItitle
+is the title string to display at the top of the widget.
+.TP 5
+.B const char * \fIcprompt
+is the prompt text shown within the widget.
+.TP 5
+.B int \fIheight
+is the desired height of the box.
+If zero, the height is adjusted to use the available screen size.
+.TP 5
+.B int \fIwidth
+is the desired width of the box.
+If zero, the height is adjusted to use the available screen size.
+.TP 5
+.B int \fIpercent
+is the percentage to show in the progress bar.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_asciibox
returns its parameter transformed to the
corresponding "+" or "-", etc. for the line-drawing characters used in \fB\*p\fP.
@@ -1325,7 +1518,7 @@ is the number of \fIitems\fP in the list.
.TP 5
.B dlg_calc_listw
This function is obsolete, provided for library-compatibility.
-It is replaced by \fIdlg_calc_list_width\fP.
+It is replaced by \fBdlg_calc_list_width\fP.
.RS
.TP 5
.B int \fIitem_no
@@ -1541,7 +1734,7 @@ It is terminated by an entry with a null \fIname\fP field.
.TP 5
.B dlg_default_item
This function is obsolete, provided for library-compatibility.
-It is replaced by \fIdlg_default_formitem\fP and \fIdlg_default_listitem\fP.
+It is replaced by \fBdlg_default_formitem\fP and \fBdlg_default_listitem\fP.
.RS
.TP 5
.B char ** \fIitems
@@ -1701,6 +1894,18 @@ is the number of columns (or rows if \fIvertical\fP) allowed for the display.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_draw_helpline
+draw the text in \fBdialog_vars.help_line\fP at the bottom of the given window.
+.RS
+.TP 5
+.B WINDOW * \fIdialog
+is the window to modify.
+.TP 5
+.B bool \fIdecorations
+if true, allow room for the scrolling arrows.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_draw_scrollbar
If \fBdialog_state.use_scrollbar\fP is set,
draw a scrollbar on the right margin of windows holding scrollable data.
@@ -1898,7 +2103,8 @@ Quit program killing all \fBtailboxbg\fP widgets.
.B const char * \fIfmt
is the format of the \fBprintf\fP-like message to write.
.TP 5
-.
+.B ...
+.br
are the variables to apply to the \fIfmt\fP format.
.RE
.\" ---------------------------------------------------------------------------
@@ -2014,6 +2220,15 @@ is the list to free.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_free_gauge
+Remove the gauge widget from the screen and free its associated memory.
+.RS
+.TP 5
+.B void *\fIobjptr
+points to the gauge widget.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_getc
Read a character from the given window.
Handle repainting here (to simplify
@@ -2615,23 +2830,29 @@ applied to the string.
.B dlg_progressbox
implements the "\fB--prgbox\fP" and "\fB--progressbox\fP" options.
.RS
-.IP title
+.TP 5
+.B const char * \fItitle
is the title on the top of the widget.
-.IP cprompt
+.TP 5
+.B const char * \fIcprompt
is the prompt text shown within the widget.
If empty or null, no prompt is shown.
-.IP height
+.TP 5
+.B int \fIheight
is the desired height of the box.
If zero, the height is based on the screen size.
-.IP width
+.TP 5
+.B int \fIwidth
is the desired width of the box.
If zero, the height is based on the screen size.
-.IP pauseopt
+.TP 5
+.B int \fIpauseopt
if true, an "OK" button will be shown,
and the dialog will wait for it to complete.
With an "OK" button, it is denoted a "programbox",
without an "OK" button, it is denoted a "progressbox".
-.IP fp
+.TP 5
+.B FILE * \fIfp
is the file pointer, which may be a pipe or a regular file.
.RE
.\" ---------------------------------------------------------------------------
@@ -2865,16 +3086,66 @@ Some of these may be values declared in the DLG_KEYS_ENUM.
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_trace_msg
+Write a formatted message to the trace file.
+.RS
+.TP 5
+.B const char * \fIfmt
+is the format of the \fBprintf\fP-like message to write.
+.TP 5
+.B ...
+.br
+are the variables to apply to the \fIfmt\fP format.
+.RE
+.IP
+Use the DLG_TRACE macro for portability, in case the trace
+feature is not compiled into the library.
+It uses an extra level of parentheses to work with a variable number of
+parameters, e.g.,
+.ES
+.EX
+DLG_TRACE(("this is dialog version %s\\n", dialog_version()));
+.EE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_trace_win
If \fBdialog_state.trace\fP is set,
log a printable picture of the given window.
.\" ---------------------------------------------------------------------------
.TP 5
.B dlg_trim_string
-Change embedded "\\n" substrings to '\\n' characters and tabs to single spaces.
-If there are no "\\n"s, the function strips all extra spaces, for justification.
-If it has "\\n"'s, the function preserves extra spaces.
-If \fBdialog_vars.cr_wrap\fP is set, the function preserves '\\n's.
+The \fBdialog\fP program uses this in each widget to adjust the
+message string,
+which may contain the newline character (referred to as '\\n')
+and/or the special substring "\\n"
+(which can be translated into a newline character).
+.IP
+There are several optional features:
+.RS
+.bP
+Unless \fBdialog_vars.no_nl_expand\fP is set,
+.RS
+.bP
+If it has "\\n" substrings,
+the function preserves extra spaces.
+For instance, spaces following a newline (substring or character)
+are preserved to use as an indentation.
+.bP
+The function changes embedded "\\n" substrings to '\\n' characters.
+.RE
+.bP
+If \fBdialog_vars.no_nl_expand\fP is not set,
+or if there are no "\\n" substrings,
+this function strips all extra spaces to simplify justification.
+.bP
+If \fBdialog_vars.cr_wrap\fP is set,
+the function preserves '\\n' newline characters.
+Otherwise, each '\\n' newline character is converted to a space.
+.bP
+Unless \fBdialog_vars.nocollapse\fP is set,
+each tab character is converted to a space,
+and sequences of blanks (space or tab) are reduced to a single space.
+.RE
.RS
.TP 5
.B char * \fIsrc
@@ -2891,6 +3162,18 @@ is the window from which to remove bindings
.RE
.\" ---------------------------------------------------------------------------
.TP 5
+.B dlg_update_gauge
+Update a gauge widget to show a different percentage value.
+.RS
+.TP 5
+.B void *\fIobjptr
+points to the gauge object to update.
+.TP 5
+.B int \fIpercent
+is the new percentage value to display.
+.RE
+.\" ---------------------------------------------------------------------------
+.TP 5
.B dlg_yes_buttoncode
Map the given button index for \fBdlg_yes_labels\fP into \fB\*p\fP's exit-code.
.RS
diff --git a/contrib/dialog/dialog.c b/contrib/dialog/dialog.c
index 13b2a17..44a16db 100644
--- a/contrib/dialog/dialog.c
+++ b/contrib/dialog/dialog.c
@@ -1,5 +1,5 @@
/*
- * $Id: dialog.c,v 1.186 2011/03/02 09:58:29 tom Exp $
+ * $Id: dialog.c,v 1.193 2011/06/29 09:10:56 tom Exp $
*
* cdialog - Display simple dialog boxes from shell scripts
*
@@ -71,7 +71,9 @@ typedef enum {
,o_gauge
,o_help
,o_help_button
+ ,o_help_file
,o_help_label
+ ,o_help_line
,o_help_status
,o_icon
,o_ignore
@@ -96,6 +98,7 @@ typedef enum {
,o_no_label
,o_no_lines
,o_no_mouse
+ ,o_no_nl_expand
,o_no_shadow
,o_nocancel
,o_noitem
@@ -137,6 +140,7 @@ typedef enum {
,o_title
,o_trim
,o_under_mouse
+ ,o_version
,o_visit_items
,o_wmclass
,o_yes_label
@@ -215,6 +219,8 @@ static const Options options[] = {
{ "help-button", o_help_button, 1, "" },
{ "help-label", o_help_label, 1, "<str>" },
{ "help-status", o_help_status, 1, "" },
+ { "hfile", o_help_file, 1, "<str>" },
+ { "hline", o_help_line, 1, "<str>" },
{ "icon", o_icon, 1, NULL },
{ "ignore", o_ignore, 1, "" },
{ "infobox", o_infobox, 2, "<text> <height> <width>" },
@@ -239,6 +245,7 @@ static const Options options[] = {
{ "no-label", o_no_label, 1, "<str>" },
{ "no-lines", o_no_lines, 1, "" },
{ "no-mouse", o_no_mouse, 1, "" },
+ { "no-nl-expand", o_no_nl_expand, 1, "" },
{ "no-ok", o_nook, 1, "" },
{ "no-shadow", o_no_shadow, 1, "" },
{ "nocancel", o_nocancel, 1, NULL }, /* see --no-cancel */
@@ -281,7 +288,7 @@ static const Options options[] = {
{ "title", o_title, 1, "<title>" },
{ "trim", o_trim, 1, "" },
{ "under-mouse", o_under_mouse, 1, NULL },
- { "version", o_print_version, 5, "" },
+ { "version", o_version, 5, "" },
{ "visit-items", o_visit_items, 1, "" },
{ "wmclass", o_wmclass, 1, NULL },
{ "yes-label", o_yes_label, 1, "<str>" },
@@ -872,6 +879,7 @@ call_mixed_gauge(CALLARGS)
}
#endif
+#ifdef HAVE_DLG_GAUGE
static int
call_prgbox(CALLARGS)
{
@@ -891,6 +899,7 @@ call_prgbox(CALLARGS)
numeric_arg(av, 2),
numeric_arg(av, 3), TRUE));
}
+#endif
#ifdef HAVE_DLG_GAUGE
static int
@@ -1089,6 +1098,15 @@ compare_opts(const void *a, const void *b)
}
/*
+ * Print program's version.
+ */
+static void
+PrintVersion(FILE *fp)
+{
+ fprintf(fp, "Version: %s\n", dialog_version());
+}
+
+/*
* Print program help-message
*/
static void
@@ -1122,6 +1140,9 @@ Help(void)
size_t j, k;
const Options **opts;
+ end_dialog();
+ dialog_state.output = stdout;
+
opts = dlg_calloc(const Options *, limit);
assert_ptr(opts, "Help");
for (j = 0; j < limit; ++j) {
@@ -1191,6 +1212,9 @@ process_common_options(int argc, char **argv, int offset, bool output)
case o_cr_wrap:
dialog_vars.cr_wrap = TRUE;
break;
+ case o_no_nl_expand:
+ dialog_vars.no_nl_expand = TRUE;
+ break;
case o_no_collapse:
dialog_vars.nocollapse = TRUE;
break;
@@ -1236,6 +1260,12 @@ process_common_options(int argc, char **argv, int offset, bool output)
case o_item_help:
dialog_vars.item_help = TRUE;
break;
+ case o_help_line:
+ dialog_vars.help_line = optionString(argv, &offset);
+ break;
+ case o_help_file:
+ dialog_vars.help_file = optionString(argv, &offset);
+ break;
case o_help_button:
dialog_vars.help_button = TRUE;
break;
@@ -1274,7 +1304,7 @@ process_common_options(int argc, char **argv, int offset, bool output)
break;
case o_print_version:
if (output) {
- fprintf(stdout, "Version: %s\n", dialog_version());
+ PrintVersion(dialog_state.output);
}
break;
case o_separator:
@@ -1356,6 +1386,7 @@ process_common_options(int argc, char **argv, int offset, bool output)
break;
case o_no_mouse:
dialog_state.no_mouse = TRUE;
+ mouse_close();
break;
case o_noitem:
case o_fullbutton:
@@ -1474,6 +1505,9 @@ main(int argc, char *argv[])
* that. We can only write to one of them. If --stdout is used, that
* can interfere with initializing the curses library, so we want to
* know explicitly if it is used.
+ *
+ * Also, look for any --version or --help message, processing those
+ * immediately.
*/
while (offset < argc) {
int base = offset;
@@ -1497,6 +1531,14 @@ main(int argc, char *argv[])
case o_keep_tite:
keep_tite = TRUE;
break;
+ case o_version:
+ dialog_state.output = stdout;
+ PrintVersion(dialog_state.output);
+ exit(DLG_EXIT_OK);
+ break;
+ case o_help:
+ Help();
+ break;
default:
++offset;
continue;
@@ -1512,7 +1554,11 @@ main(int argc, char *argv[])
offset = 1;
init_result(my_buffer);
- if (argc == 2) { /* if we don't want clear screen */
+ /*
+ * Dialog's output may be redirected (see above). Handle the special
+ * case of options that only report information without interaction.
+ */
+ if (argc == 2) {
switch (lookupOption(argv[1], 7)) {
case o_print_maxsize:
(void) initscr();
@@ -1521,7 +1567,7 @@ main(int argc, char *argv[])
fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);
break;
case o_print_version:
- fprintf(stdout, "Version: %s\n", dialog_version());
+ PrintVersion(dialog_state.output);
break;
case o_clear:
initscr();
@@ -1531,8 +1577,6 @@ main(int argc, char *argv[])
case o_ignore:
break;
default:
- case o_help:
- dialog_state.output = stdout;
Help();
break;
}
@@ -1621,6 +1665,8 @@ main(int argc, char *argv[])
case o_unknown:
case o_title:
case o_backtitle:
+ case o_help_line:
+ case o_help_file:
break;
default:
if (argv[j] != 0) {
diff --git a/contrib/dialog/dialog.h b/contrib/dialog/dialog.h
index e726573..4e1b01c 100644
--- a/contrib/dialog/dialog.h
+++ b/contrib/dialog/dialog.h
@@ -1,5 +1,5 @@
/*
- * $Id: dialog.h,v 1.223 2011/03/02 10:04:09 tom Exp $
+ * $Id: dialog.h,v 1.231 2011/06/29 09:51:00 tom Exp $
*
* dialog.h -- common declarations for all dialog modules
*
@@ -44,7 +44,10 @@
#include <signal.h> /* fork() etc. */
#include <math.h> /* sqrt() */
-#undef ERR /* header conflict with Solaris xpg4 */
+/* header conflict with Solaris xpg4 versus <sys/regset.h> */
+#if defined(ERR) && (ERR == 13)
+#undef ERR
+#endif
#if defined(HAVE_NCURSESW_NCURSES_H)
#include <ncursesw/ncurses.h>
@@ -140,6 +143,7 @@
#define DLG_CTRL(n) ((n) & 0x1f) /* CTRL is preferred, but conflicts */
+#define CHR_HELP DLG_CTRL('E')
#define CHR_BACKSPACE DLG_CTRL('H')
#define CHR_REPAINT DLG_CTRL('L')
#define CHR_KILL DLG_CTRL('U')
@@ -476,6 +480,11 @@ typedef struct {
/* 1.1-20100118 */
char *date_format; /* option "--date-format" */
char *time_format; /* option "--time-format" */
+ /* 1.1-20110629 */
+ char *help_line; /* option "--hline" */
+ char *help_file; /* option "--hfile" */
+ bool in_helpfile; /* flag to prevent recursion in --hfile */
+ bool no_nl_expand; /* option "--no-nl-expand" */
} DIALOG_VARS;
#define USE_ITEM_HELP(s) (dialog_vars.item_help && (s) != 0)
@@ -530,6 +539,7 @@ extern int dialog_editbox(const char * /*title*/, const char * /*file*/, int /*h
extern int dialog_form(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, char ** /*items*/);
extern int dialog_fselect(const char * /*title*/, const char * /*path*/, int /*height*/, int /*width*/);
extern int dialog_gauge(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*percent*/);
+extern int dialog_helpfile(const char * /*title*/, const char * /*file*/, int /*height*/, int /*width*/);
extern int dialog_inputbox(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, const char * /*init*/, const int /*password*/);
extern int dialog_menu(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*menu_height*/, int /*item_no*/, char ** /*items*/);
extern int dialog_mixedform(const char * /*title*/, const char * /*cprompt*/, int /*height*/, int /*width*/, int /*form_height*/, int /*item_no*/, char ** /*items*/);
@@ -584,6 +594,7 @@ extern int dlg_eat_argv(int * /* argcp */, char *** /* argvp */, int /* start */
/* arrows.c */
extern void dlg_draw_arrows(WINDOW * /*dialog*/, int /*top_arrow*/, int /*bottom_arrow*/, int /*x*/, int /*top*/, int /*bottom*/);
extern void dlg_draw_arrows2(WINDOW * /*dialog*/, int /*top_arrow*/, int /*bottom_arrow*/, int /*x*/, int /*top*/, int /*bottom*/, chtype /*attr*/, chtype /*borderattr*/);
+extern void dlg_draw_helpline(WINDOW * /*dialog*/, bool /*decorations*/);
extern void dlg_draw_scrollbar(WINDOW * /*dialog*/, long /* first_data */, long /* this_data */, long /* next_data */, long /* total_data */, int /* left */, int /* right */, int /*top*/, int /*bottom*/, chtype /*attr*/, chtype /*borderattr*/);
/* buttons.c */
@@ -619,6 +630,11 @@ extern int dlg_default_formitem(DIALOG_FORMITEM * /*items*/);
extern int dlg_ordinate(const char * /*s*/);
extern void dlg_free_formitems(DIALOG_FORMITEM * /*items*/);
+/* guage.c */
+extern void * dlg_allocate_gauge(const char * /* title */, const char * /* cprompt */, int /* height */, int /* width */, int /* percent */);
+extern void dlg_free_gauge(void * /* objptr */);
+extern void dlg_update_gauge(void * /* objptr */, int /* percent */);
+
/* inputstr.c */
extern bool dlg_edit_string(char * /*string*/, int * /*offset*/, int /*key*/, int /*fkey*/, bool /*force*/);
extern const int * dlg_index_columns(const char * /*string*/);
@@ -740,6 +756,12 @@ extern void dlg_move_window(WINDOW * /*win*/, int /*height*/, int /*width*/, int
#endif
/*
+ * Normally "enter" means "ok". Use this macro to handle the explicit
+ * check for DLGK_ENTER:
+ */
+#define dlg_enter_buttoncode(code) (dialog_vars.nook ? DLG_EXIT_OK : dlg_ok_buttoncode(code))
+
+/*
* The following stuff is needed for mouse support
*/
typedef struct mseRegion {
diff --git a/contrib/dialog/dlg_keys.h b/contrib/dialog/dlg_keys.h
index 6a96c0f..34b4cba 100644
--- a/contrib/dialog/dlg_keys.h
+++ b/contrib/dialog/dlg_keys.h
@@ -1,9 +1,9 @@
/*
- * $Id: dlg_keys.h,v 1.24 2010/01/19 00:57:36 tom Exp $
+ * $Id: dlg_keys.h,v 1.26 2011/06/21 22:09:22 tom Exp $
*
- * dlg_keys.h -- runtime binding support for dialog
+ * dlg_keys.h -- runtime binding support for dialog
*
- * Copyright 2005-2007,2010 Thomas E. Dickey
+ * Copyright 2005-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -89,12 +89,18 @@ typedef enum {
DLGK_BEGIN,
DLGK_FINAL,
DLGK_SELECT,
+ DLGK_HELPFILE,
DLGK_TRACE
} DLG_KEYS_ENUM;
#define is_DLGK_MOUSE(code) ((code) >= M_EVENT)
#define DLGK_MOUSE(code) ((code) + M_EVENT)
+#define HELPKEY_BINDINGS \
+ DLG_KEYS_DATA( DLGK_HELPFILE, CHR_HELP ), \
+ DLG_KEYS_DATA( DLGK_HELPFILE, KEY_F(1) ), \
+ DLG_KEYS_DATA( DLGK_HELPFILE, KEY_HELP )
+
#define ENTERKEY_BINDINGS \
DLG_KEYS_DATA( DLGK_ENTER, '\n' ), \
DLG_KEYS_DATA( DLGK_ENTER, '\r' ), \
diff --git a/contrib/dialog/editbox.c b/contrib/dialog/editbox.c
index 7889024..c7da10c 100644
--- a/contrib/dialog/editbox.c
+++ b/contrib/dialog/editbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: editbox.c,v 1.54 2010/04/28 21:02:01 tom Exp $
+ * $Id: editbox.c,v 1.55 2011/06/21 00:10:46 tom Exp $
*
* editbox.c -- implements the edit box
*
- * Copyright 2007-2009,2010 Thomas E. Dickey
+ * Copyright 2007-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -312,12 +312,14 @@ dlg_editbox(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
diff --git a/contrib/dialog/formbox.c b/contrib/dialog/formbox.c
index 18f2054..7ec798c 100644
--- a/contrib/dialog/formbox.c
+++ b/contrib/dialog/formbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: formbox.c,v 1.71 2010/02/24 10:45:57 Samuel.Martin.Moro Exp $
+ * $Id: formbox.c,v 1.73 2011/06/29 09:48:08 tom Exp $
*
* formbox.c -- implements the form (i.e, some pairs label/editbox)
*
- * Copyright 2003-2009,2010 Thomas E. Dickey
+ * Copyright 2003-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -433,12 +433,14 @@ dlg_form(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
@@ -633,7 +635,7 @@ dlg_form(const char *title,
case DLGK_ENTER:
dlg_del_window(dialog);
- result = (state >= 0) ? dlg_ok_buttoncode(state) : DLG_EXIT_OK;
+ result = (state >= 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
continue;
case DLGK_GRID_LEFT:
diff --git a/contrib/dialog/fselect.c b/contrib/dialog/fselect.c
index 09a5560..e082abf 100644
--- a/contrib/dialog/fselect.c
+++ b/contrib/dialog/fselect.c
@@ -1,5 +1,5 @@
/*
- * $Id: fselect.c,v 1.76 2011/01/16 22:20:16 tom Exp $
+ * $Id: fselect.c,v 1.78 2011/06/29 09:48:21 tom Exp $
*
* fselect.c -- implements the file-selector box
*
@@ -532,12 +532,14 @@ dlg_fselect(const char *title, const char *path, int height, int width, int dsel
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
@@ -795,7 +797,7 @@ dlg_fselect(const char *title, const char *path, int height, int width, int dsel
}
/* FALLTHRU */
case DLGK_ENTER:
- result = (state > 0) ? dlg_ok_buttoncode(state) : DLG_EXIT_OK;
+ result = (state > 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
continue;
#ifdef KEY_RESIZE
case KEY_RESIZE:
diff --git a/contrib/dialog/guage.c b/contrib/dialog/guage.c
index d12bc21..b25052f 100644
--- a/contrib/dialog/guage.c
+++ b/contrib/dialog/guage.c
@@ -1,5 +1,5 @@
/*
- * $Id: guage.c,v 1.52 2011/01/17 10:39:28 tom Exp $
+ * $Id: guage.c,v 1.60 2011/06/27 00:52:28 tom Exp $
*
* guage.c -- implements the gauge dialog
*
@@ -35,8 +35,9 @@
#define isMarker(buf) !strncmp(buf, "XXX", (size_t) 3)
-typedef struct {
- DIALOG_CALLBACK obj;
+typedef struct _my_obj {
+ DIALOG_CALLBACK obj; /* has to be first in struct */
+ struct _my_obj *next;
WINDOW *text;
const char *title;
char *prompt;
@@ -47,6 +48,43 @@ typedef struct {
char line[MAX_LEN + 1];
} MY_OBJ;
+static MY_OBJ *all_objects;
+
+static int
+valid(MY_OBJ * obj)
+{
+ MY_OBJ *list = all_objects;
+ int result = 0;
+
+ while (list != 0) {
+ if (list == obj) {
+ result = 1;
+ break;
+ }
+ list = list->next;
+ }
+ return result;
+}
+
+static void
+delink(MY_OBJ * obj)
+{
+ MY_OBJ *p = all_objects;
+ MY_OBJ *q = 0;
+ while (p != 0) {
+ if (p == obj) {
+ if (q != 0) {
+ q->next = p->next;
+ } else {
+ all_objects = p->next;
+ }
+ break;
+ }
+ q = p;
+ p = p->next;
+ }
+}
+
static int
read_data(char *buffer, FILE *fp)
{
@@ -55,6 +93,7 @@ read_data(char *buffer, FILE *fp)
if (feof(fp)) {
result = 0;
} else if (fgets(buffer, MY_LEN, fp) != 0) {
+ DLG_TRACE(("read_data:%s", buffer));
dlg_trim_string(buffer);
result = 1;
} else {
@@ -88,6 +127,7 @@ repaint_text(MY_OBJ * obj)
dlg_draw_title(dialog, obj->title);
wattrset(dialog, dialog_attr);
+ dlg_draw_helpline(dialog, FALSE);
dlg_print_autowrap(dialog, obj->prompt, obj->height, obj->width);
dlg_draw_box(dialog,
@@ -179,6 +219,7 @@ handle_input(DIALOG_CALLBACK * cb)
} else {
if (feof(dialog_state.pipe_input) ||
(ferror(dialog_state.pipe_input) && errno != EINTR)) {
+ delink(obj);
dlg_remove_callback(cb);
}
}
@@ -202,7 +243,8 @@ handle_my_getc(DIALOG_CALLBACK * cb, int ch, int fkey, int *result)
if (cb != 0) {
if (!fkey && (ch == ERR)) {
(void) handle_input(cb);
- status = (cb->input != 0);
+ /* cb might be freed in handle_input */
+ status = (valid((MY_OBJ *) cb) && (cb->input != 0));
}
} else {
status = FALSE;
@@ -215,46 +257,42 @@ my_cleanup(DIALOG_CALLBACK * cb)
{
MY_OBJ *obj = (MY_OBJ *) cb;
- if (obj != 0) {
- if (obj->prompt != obj->prompt_buf)
+ if (valid(obj)) {
+ if (obj->prompt != obj->prompt_buf) {
free(obj->prompt);
+ obj->prompt = obj->prompt_buf;
+ }
+ delink(obj);
}
}
+void
+dlg_update_gauge(void *objptr, int percent)
+{
+ MY_OBJ *obj = (MY_OBJ *) objptr;
+
+ curs_set(0);
+ obj->percent = percent;
+ repaint_text(obj);
+}
+
/*
- * Display a gauge, or progress meter. Starts at percent% and reads stdin. If
- * stdin is not XXX, then it is interpreted as a percentage, and the display is
- * updated accordingly. Otherwise the next line is the percentage, and
- * subsequent lines up to another XXX are used for the new prompt. Note that
- * the size of the window never changes, so the prompt can not get any larger
- * than the height and width specified.
+ * Allocates a new object and fills it as per the arguments
*/
-int
-dialog_gauge(const char *title,
- const char *cprompt,
- int height,
- int width,
- int percent)
+void *
+dlg_allocate_gauge(const char *title,
+ const char *cprompt,
+ int height,
+ int width,
+ int percent)
{
-#ifdef KEY_RESIZE
- int old_height = height;
- int old_width = width;
-#endif
- int fkey;
- int ch, result;
int x, y;
char *prompt = dlg_strclone(cprompt);
WINDOW *dialog;
MY_OBJ *obj = 0;
- curs_set(0);
-
dlg_tab_correct_str(prompt);
-#ifdef KEY_RESIZE
- retry:
-#endif
-
dlg_auto_size(title, prompt, &height, &width, MIN_HIGH, MIN_WIDE);
dlg_print_size(height, width);
dlg_ctl_size(height, width);
@@ -265,51 +303,97 @@ dialog_gauge(const char *title,
dialog = dlg_new_window(height, width, y, x);
- if (obj == 0) {
- MY_OBJ **objref;
-
- obj = dlg_calloc(MY_OBJ, 1);
- assert_ptr(obj, "dialog_gauge");
-
- objref = &obj;
- obj->obj.input = dialog_state.pipe_input;
- obj->obj.win = dialog;
- obj->obj.keep_win = TRUE;
- obj->obj.bg_task = TRUE;
- obj->obj.handle_getc = handle_my_getc;
- obj->obj.handle_input = handle_input;
- obj->title = title;
- obj->prompt = prompt;
- obj->percent = percent;
- obj->height = height;
- obj->width = width;
- dlg_add_callback_ref((DIALOG_CALLBACK **) objref, my_cleanup);
- } else {
- obj->obj.win = dialog;
+ obj = dlg_calloc(MY_OBJ, 1);
+ assert_ptr(obj, "dialog_gauge");
+
+ obj->obj.input = dialog_state.pipe_input;
+ obj->obj.win = dialog;
+ obj->obj.keep_win = TRUE;
+ obj->obj.bg_task = TRUE;
+ obj->obj.handle_getc = handle_my_getc;
+ obj->obj.handle_input = handle_input;
+
+ obj->title = title;
+ obj->prompt = prompt;
+ obj->percent = percent;
+ obj->height = height;
+ obj->width = width;
+
+ obj->next = all_objects;
+ all_objects = obj;
+
+ return (void *) obj;
+}
+
+void
+dlg_free_gauge(void *objptr)
+{
+ MY_OBJ *obj = (MY_OBJ *) objptr;
+
+ curs_set(1);
+ if (valid(obj)) {
+ delink(obj);
+ obj->obj.keep_win = FALSE;
+ dlg_remove_callback(&(obj->obj));
+ free(obj);
}
+}
- repaint_text(obj);
+/*
+ * Display a gauge, or progress meter. Starts at percent% and reads stdin. If
+ * stdin is not XXX, then it is interpreted as a percentage, and the display is
+ * updated accordingly. Otherwise the next line is the percentage, and
+ * subsequent lines up to another XXX are used for the new prompt. Note that
+ * the size of the window never changes, so the prompt can not get any larger
+ * than the height and width specified.
+ */
+int
+dialog_gauge(const char *title,
+ const char *cprompt,
+ int height,
+ int width,
+ int percent)
+{
+ int fkey;
+ int ch, result;
+ void *objptr = dlg_allocate_gauge(title, cprompt, height, width, percent);
+ MY_OBJ *obj = (MY_OBJ *) objptr;
+
+ dlg_add_callback_ref((DIALOG_CALLBACK **) & obj, my_cleanup);
+ dlg_update_gauge(obj, percent);
do {
- ch = dlg_getc(dialog, &fkey);
+ ch = dlg_getc(obj->obj.win, &fkey);
#ifdef KEY_RESIZE
if (fkey && ch == KEY_RESIZE) {
- /* reset data */
- height = old_height;
- width = old_width;
- /* repaint */
+ MY_OBJ *oldobj = obj;
+
+ dlg_mouse_free_regions();
+
+ obj = dlg_allocate_gauge(title,
+ cprompt,
+ height,
+ width,
+ oldobj->percent);
+
+ /* avoid breaking new window in dlg_remove_callback */
+ oldobj->obj.caller = 0;
+ oldobj->obj.input = 0;
+ oldobj->obj.keep_win = FALSE;
+
+ /* remove the old version of the gauge */
dlg_clear();
- dlg_del_window(dialog);
+ dlg_remove_callback(&(oldobj->obj));
refresh();
- dlg_mouse_free_regions();
- goto retry;
+
+ dlg_add_callback_ref((DIALOG_CALLBACK **) & obj, my_cleanup);
+ dlg_update_gauge(obj, obj->percent);
}
#endif
}
- while (handle_my_getc(&(obj->obj), ch, fkey, &result));
+ while (valid(obj) && handle_my_getc(&(obj->obj), ch, fkey, &result));
- curs_set(1);
- dlg_del_window(dialog);
+ dlg_free_gauge(obj);
return (DLG_EXIT_OK);
}
diff --git a/contrib/dialog/help.c b/contrib/dialog/help.c
new file mode 100644
index 0000000..8ba9229
--- /dev/null
+++ b/contrib/dialog/help.c
@@ -0,0 +1,43 @@
+/*
+ * $Id: help.c,v 1.2 2011/06/25 00:27:16 tom Exp $
+ *
+ * help.c -- implements the help dialog
+ *
+ * Copyright 2011 Thomas E. Dickey
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License, version 2.1
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to
+ * Free Software Foundation, Inc.
+ * 51 Franklin St., Fifth Floor
+ * Boston, MA 02110, USA.
+ */
+
+#include <dialog.h>
+
+/*
+ * Display a help-file as a textbox widget.
+ */
+int
+dialog_helpfile(const char *title,
+ const char *file,
+ int height,
+ int width)
+{
+ int result = DLG_EXIT_ERROR;
+
+ if (!dialog_vars.in_helpfile && file != 0 && *file != '\0') {
+ dialog_vars.in_helpfile = TRUE;
+ result = dialog_textbox(title, file, height, width);
+ dialog_vars.in_helpfile = FALSE;
+ }
+ return (result);
+}
diff --git a/contrib/dialog/inputbox.c b/contrib/dialog/inputbox.c
index 6e83cbc..14e2c28 100644
--- a/contrib/dialog/inputbox.c
+++ b/contrib/dialog/inputbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: inputbox.c,v 1.64 2010/01/19 01:03:39 tom Exp $
+ * $Id: inputbox.c,v 1.67 2011/06/29 09:48:34 tom Exp $
*
- * inputbox.c -- implements the input box
+ * inputbox.c -- implements the input box
*
- * Copyright 2000-2009,2010 Thomas E. Dickey
+ * Copyright 2000-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -46,12 +46,14 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
NAVIGATE_BINDINGS,
END_KEYS_BINDING
@@ -119,6 +121,7 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
dlg_draw_title(dialog, title);
wattrset(dialog, dialog_attr);
+ dlg_draw_helpline(dialog, FALSE);
dlg_print_autowrap(dialog, prompt, height, width);
/* Draw the input field box */
@@ -202,7 +205,7 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
case ' ': /* FIXME: conflict with inputstr.c */
case DLGK_ENTER:
dlg_del_window(dialog);
- result = (state >= 0) ? dlg_ok_buttoncode(state) : DLG_EXIT_OK;
+ result = (state >= 0) ? dlg_enter_buttoncode(state) : DLG_EXIT_OK;
break;
#ifdef KEY_RESIZE
case KEY_RESIZE:
diff --git a/contrib/dialog/makefile.in b/contrib/dialog/makefile.in
index 753f642..d05d74d 100644
--- a/contrib/dialog/makefile.in
+++ b/contrib/dialog/makefile.in
@@ -1,4 +1,4 @@
-# $Id: makefile.in,v 1.78 2011/03/02 09:57:24 tom Exp $
+# $Id: makefile.in,v 1.79 2011/06/25 00:27:56 tom Exp $
# template makefile for DIALOG
##############################################################################
# Copyright (c) 1999-2010,2011 Thomas E. Dickey #
@@ -134,6 +134,7 @@ OBJECTS = $(EXTRAOBJS) \
columns$o \
dlg_keys$o \
editbox$o \
+ help$o \
inputbox$o \
inputstr$o \
menubox$o \
diff --git a/contrib/dialog/menubox.c b/contrib/dialog/menubox.c
index aa4cc2d..25005a4 100644
--- a/contrib/dialog/menubox.c
+++ b/contrib/dialog/menubox.c
@@ -1,5 +1,5 @@
/*
- * $Id: menubox.c,v 1.120 2011/01/19 00:27:53 tom Exp $
+ * $Id: menubox.c,v 1.122 2011/06/29 09:48:46 tom Exp $
*
* menubox.c -- implements the menu box
*
@@ -291,6 +291,7 @@ dlg_menu(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_FIELD_NEXT, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
@@ -312,6 +313,7 @@ dlg_menu(const char *title,
};
static DLG_KEYS_BINDING binding2[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
END_KEYS_BINDING
};
@@ -685,7 +687,7 @@ dlg_menu(const char *title,
FALSE, width);
break;
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
/*
* If dlg_menu() is called from dialog_menu(), we want to
diff --git a/contrib/dialog/mixedgauge.c b/contrib/dialog/mixedgauge.c
index 739165d..e15a4df 100644
--- a/contrib/dialog/mixedgauge.c
+++ b/contrib/dialog/mixedgauge.c
@@ -1,5 +1,5 @@
/*
- * $Id: mixedgauge.c,v 1.23 2011/01/19 00:27:53 tom Exp $
+ * $Id: mixedgauge.c,v 1.24 2011/06/27 08:16:38 tom Exp $
*
* mixedgauge.c -- implements the mixedgauge dialog
*
@@ -331,6 +331,7 @@ dlg_begin_mixedgauge(DIALOG_MIXEDGAUGE * dlg,
dialog_attr, border_attr);
dlg_draw_title(dlg->dialog, dlg->title);
+ dlg_draw_helpline(dlg->dialog, FALSE);
if ((dlg->prompt != 0 && *(dlg->prompt) != 0)
&& wmove(dlg->dialog, dlg->item_no, 0) != ERR) {
diff --git a/contrib/dialog/msgbox.c b/contrib/dialog/msgbox.c
index 91606af..25a021b 100644
--- a/contrib/dialog/msgbox.c
+++ b/contrib/dialog/msgbox.c
@@ -1,9 +1,9 @@
/*
- * $Id: msgbox.c,v 1.64 2010/01/15 10:50:17 tom Exp $
+ * $Id: msgbox.c,v 1.66 2011/06/27 08:36:28 tom Exp $
*
* msgbox.c -- implements the message box and info box
*
- * Copyright 2000-2009,2010 Thomas E. Dickey
+ * Copyright 2000-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -37,6 +37,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
SCROLLKEY_BINDINGS,
@@ -103,6 +104,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
dlg_draw_bottom_box(dialog);
mouse_mkbutton(height - 2, width / 2 - 4, 6, '\n');
dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width);
+ dlg_draw_helpline(dialog, FALSE);
while (result == DLG_EXIT_UNKNOWN) {
if (show) {
@@ -172,6 +174,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
}
} else {
dlg_print_scrolled(dialog, prompt, offset, page, width, pauseopt);
+ dlg_draw_helpline(dialog, FALSE);
wrefresh(dialog);
result = DLG_EXIT_OK;
}
diff --git a/contrib/dialog/package/debian/changelog b/contrib/dialog/package/debian/changelog
index 2b15e4c..51d497e 100644
--- a/contrib/dialog/package/debian/changelog
+++ b/contrib/dialog/package/debian/changelog
@@ -1,3 +1,15 @@
+cdialog (20110707) unstable; urgency=high
+
+ * fix a regression in dlg_getc() from 20110630 changes.
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Thu, 07 Jul 2011 18:10:47 -0400
+
+cdialog (20110630) unstable; urgency=high
+
+ * various bug-fixes reported in FreeBSD.
+
+ -- Thomas E. Dickey <dickey@invisible-island.net> Mon, 13 Jun 2011 05:44:17 -0400
+
cdialog (20110302) unstable; urgency=high
* Add --prgbox and --progressbox
diff --git a/contrib/dialog/package/debian/control b/contrib/dialog/package/debian/control
index c1ad86a..f219de1 100644
--- a/contrib/dialog/package/debian/control
+++ b/contrib/dialog/package/debian/control
@@ -3,12 +3,12 @@ Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
Section: misc
Priority: optional
Standards-Version: 3.8.4
-Build-Depends: debhelper (>= 5)
+Build-Depends: debhelper (>= 5), libncursesw5-dev (>= 5.3), groff-base
Homepage: http://invisible-island.net/dialog/
Package: cdialog
Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Depends: libncursesw5 (>= 5.3)
Description: dialog - display dialog boxes from shell scripts
Dialog is a program that will let you to present a variety of questions
or display messages using dialog boxes from a shell script. These
diff --git a/contrib/dialog/package/dialog.spec b/contrib/dialog/package/dialog.spec
index a6f4360..f5df494 100644
--- a/contrib/dialog/package/dialog.spec
+++ b/contrib/dialog/package/dialog.spec
@@ -1,9 +1,9 @@
Summary: dialog - display dialog boxes from shell scripts
%define AppProgram dialog
%define AppVersion 1.1
-%define AppRelease 20110302
+%define AppRelease 20110707
%define ActualProg c%{AppProgram}
-# $XTermId: dialog.spec,v 1.16 2011/03/02 10:08:16 tom Exp $
+# $XTermId: dialog.spec,v 1.24 2011/07/07 22:10:02 tom Exp $
Name: %{ActualProg}
Version: %{AppVersion}
Release: %{AppRelease}
diff --git a/contrib/dialog/pause.c b/contrib/dialog/pause.c
index 001753f..c104a70 100644
--- a/contrib/dialog/pause.c
+++ b/contrib/dialog/pause.c
@@ -1,5 +1,5 @@
/*
- * $Id: pause.c,v 1.26 2011/01/18 10:16:33 tom Exp $
+ * $Id: pause.c,v 1.29 2011/06/29 09:48:53 tom Exp $
*
* pause.c -- implements the pause dialog
*
@@ -53,6 +53,7 @@ dialog_pause(const char *title,
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_DOWN ),
@@ -124,6 +125,7 @@ dialog_pause(const char *title,
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
wattrset(dialog, dialog_attr);
dlg_print_autowrap(dialog, prompt, height, width);
@@ -215,7 +217,7 @@ dialog_pause(const char *title,
FALSE, width);
break;
case DLGK_ENTER:
- result = dlg_ok_buttoncode(button);
+ result = dlg_enter_buttoncode(button);
break;
case DLGK_MOUSE(0):
result = DLG_EXIT_OK;
diff --git a/contrib/dialog/po/sk.po b/contrib/dialog/po/sk.po
new file mode 100644
index 0000000..e87991c
--- /dev/null
+++ b/contrib/dialog/po/sk.po
@@ -0,0 +1,111 @@
+# Dialog
+# Copyright 2003-2007,2008 # Thomas Dickey
+# This file is distributed under the same license as the dialog package.
+# Marián Čavojský <preklad@cavo.sk>, 2011
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: dialog 1.1.20080819\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-18 18:26-0400\n"
+"PO-Revision-Date: 2011-03-09 09:50+0100\n"
+"Last-Translator: Marián Čavojský <preklad@cavo.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: buttons.c:385
+msgid "Yes"
+msgstr "Ãno"
+
+#: buttons.c:393
+msgid "No"
+msgstr "Nie"
+
+#: buttons.c:401
+msgid "OK"
+msgstr "OK"
+
+#: buttons.c:409
+msgid "Cancel"
+msgstr "Zrušiť"
+
+#: buttons.c:417
+msgid "EXIT"
+msgstr "VÃCHOD"
+
+#: buttons.c:425
+msgid "Extra"
+msgstr "Extra"
+
+#: buttons.c:433
+msgid "Help"
+msgstr "Pomoc"
+
+#. Headline "Month"
+#: calendar.c:273
+msgid "Month"
+msgstr "Mesiac"
+
+#. Headline "Year"
+#: calendar.c:293
+msgid "Year"
+msgstr "Rok"
+
+#: dialog.c:741
+msgid "Rename"
+msgstr "Premenovať"
+
+#: fselect.c:550
+msgid "Directories"
+msgstr "Adresáre"
+
+#: fselect.c:551
+msgid "Files"
+msgstr "Súbory"
+
+#: mixedgauge.c:58
+msgid "Succeeded"
+msgstr "Vporiadku"
+
+#: mixedgauge.c:61
+msgid "Failed"
+msgstr "S chybou"
+
+#: mixedgauge.c:64
+msgid "Passed"
+msgstr "Prešlo"
+
+#: mixedgauge.c:67
+msgid "Completed"
+msgstr "Skompletované"
+
+#: mixedgauge.c:70
+msgid "Checked"
+msgstr "Skontrolované"
+
+#: mixedgauge.c:73
+msgid "Done"
+msgstr "DokonÄené"
+
+#: mixedgauge.c:76
+msgid "Skipped"
+msgstr "PreskoÄené"
+
+#: mixedgauge.c:79
+msgid "In Progress"
+msgstr "Spracováva"
+
+#: mixedgauge.c:85
+msgid "N/A"
+msgstr "N/A"
+
+#: mixedgauge.c:193
+msgid "Overall Progress"
+msgstr "Celkový pokrok"
+
+#: textbox.c:489
+msgid "Search"
+msgstr "Vyhľadať"
diff --git a/contrib/dialog/prgbox.c b/contrib/dialog/prgbox.c
index 8c9f627..a3b3ea6 100644
--- a/contrib/dialog/prgbox.c
+++ b/contrib/dialog/prgbox.c
@@ -1,14 +1,13 @@
/*
- * $Id: prgbox.c,v 1.6 2011/03/02 09:59:26 tom Exp $
+ * $Id: prgbox.c,v 1.7 2011/06/30 20:44:13 tom Exp $
*
* prgbox.c -- implements the prg box
*
* Copyright 2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of the
- * License, or (at your option) any later version.
+ * it under the terms of the GNU Lesser General Public License, version 2.1
+ * as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
diff --git a/contrib/dialog/progressbox.c b/contrib/dialog/progressbox.c
index 5670d1c..024e288 100644
--- a/contrib/dialog/progressbox.c
+++ b/contrib/dialog/progressbox.c
@@ -1,5 +1,5 @@
/*
- * $Id: progressbox.c,v 1.11 2011/03/02 01:10:08 tom Exp $
+ * $Id: progressbox.c,v 1.13 2011/06/27 08:18:20 tom Exp $
*
* progressbox.c -- implements the progress box
*
@@ -109,6 +109,7 @@ pause_for_ok(WINDOW *dialog, int height, int width)
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
END_KEYS_BINDING
@@ -189,6 +190,7 @@ dlg_progressbox(const char *title,
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
if (*prompt != '\0') {
int y2, x2;
diff --git a/contrib/dialog/rc.c b/contrib/dialog/rc.c
index 77dd586..2e2c7e6 100644
--- a/contrib/dialog/rc.c
+++ b/contrib/dialog/rc.c
@@ -1,9 +1,9 @@
/*
- * $Id: rc.c,v 1.45 2010/01/18 10:28:16 tom Exp $
+ * $Id: rc.c,v 1.47 2011/06/20 22:30:04 tom Exp $
*
* rc.c -- routines for processing the configuration file
*
- * Copyright 2000-2008,2010 Thomas E. Dickey
+ * Copyright 2000-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -433,9 +433,7 @@ dlg_create_rc(const char *filename)
dlg_color_table[i].hilite));
}
#endif /* HAVE_COLOR */
-#if 1
dlg_dump_keys(rc_file);
-#endif
(void) fclose(rc_file);
}
@@ -455,9 +453,7 @@ dlg_parse_rc(void)
char *tempptr;
int result = 0;
FILE *rc_file = 0;
-#if 1
char *params;
-#endif
/*
* At startup, dialog determines the settings to use as follows:
@@ -486,20 +482,21 @@ dlg_parse_rc(void)
sprintf(str, "%s%s", tempptr, DIALOGRC);
else
sprintf(str, "%s/%s", tempptr, DIALOGRC);
- rc_file = fopen(str, "rt");
+ rc_file = fopen(tempptr = str, "rt");
}
}
if (rc_file == NULL) { /* step (b) failed? */
/* try step (c) */
strcpy(str, GLOBALRC);
- if ((rc_file = fopen(str, "rt")) == NULL)
+ if ((rc_file = fopen(tempptr = str, "rt")) == NULL)
return 0; /* step (c) failed, use default values */
}
+ DLG_TRACE(("opened rc file \"%s\"\n", tempptr));
/* Scan each line and set variables */
while ((result == 0) && (fgets(str, MAX_LEN, rc_file) != NULL)) {
- dlg_trace_msg("rc:%s\n", str);
+ DLG_TRACE(("rc:%s", str));
if (*str == '\0' || lastch(str) != '\n') {
/* ignore rest of file if line too long */
fprintf(stderr, "\nParse error: line %d of configuration"
diff --git a/contrib/dialog/samples/valgrind.log b/contrib/dialog/samples/valgrind.log
new file mode 100644
index 0000000..f33b862
--- /dev/null
+++ b/contrib/dialog/samples/valgrind.log
@@ -0,0 +1,847 @@
+==23273== Memcheck, a memory error detector.
+==23273== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
+==23273== Using LibVEX rev 1854, a library for dynamic binary translation.
+==23273== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
+==23273== Using valgrind-3.3.1-Debian, a dynamic binary instrumentation framework.
+==23273== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
+==23273==
+--23273-- Command line
+--23273-- /usr/build/dialog/dialog-1.1-20110707/dialog
+--23273-- --title
+--23273-- YES/NO BOX
+--23273-- --clear
+--23273-- --yesno
+--23273-- Hi, this is a yes/no dialog box. You can use this to ask questions that have an answer of either yes or no. BTW, do you notice that long lines will be automatically wrapped around so that they can fit in the box? You can also control line breaking explicitly by inserting 'backslash n' at any place you like, but in this case, auto wrap around will be disabled and you will have to control line breaking yourself.
+--23273-- 15
+--23273-- 61
+--23273-- Startup, with flags:
+--23273-- --suppressions=/usr/lib/valgrind/debian-libc6-dbg.supp
+--23273-- -v
+--23273-- --num-callers=10
+--23273-- --error-limit=no
+--23273-- --show-reachable=yes
+--23273-- --leak-resolution=high
+--23273-- --leak-check=yes
+--23273-- --show-reachable=yes
+--23273-- --log-fd=2
+--23273-- Contents of /proc/version:
+--23273-- Linux version 2.6.26-2-686 (Debian 2.6.26-26lenny3) (dannf@debian.org) (gcc version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25)) #1 SMP Sat Jun 11 14:54:10 UTC 2011
+--23273-- Arch and hwcaps: X86, x86-sse1-sse2
+--23273-- Page sizes: currently 4096, max supported 4096
+--23273-- Valgrind library directory: /usr/lib/valgrind
+--23273-- Reading syms from /lib/ld-2.7.so (0x4000000)
+--23273-- Reading debug info from /lib/ld-2.7.so...
+--23273-- ... CRC mismatch (computed 0f4d8d49 wanted a869dbba)
+--23273-- Reading debug info from /usr/lib/debug/lib/ld-2.7.so...
+--23273-- Reading syms from /usr/build/dialog/dialog-1.1-20110707/dialog (0x8048000)
+--23273-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck (0x38000000)
+--23273-- object doesn't have a dynamic symbol table
+--23273-- Reading suppressions file: /usr/lib/valgrind/debian-libc6-dbg.supp
+--23273-- Reading suppressions file: /usr/lib/valgrind/default.supp
+--23273-- REDIR: 0x4015500 (index) redirected to 0x3802cf43 (vgPlain_x86_linux_REDIR_FOR_index)
+--23273-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x401E000)
+--23273-- Reading syms from /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so (0x4020000)
+==23273== WARNING: new redirection conflicts with existing -- ignoring it
+--23273-- new: 0x04015500 (index ) R-> 0x040241e0 index
+--23273-- REDIR: 0x40156f0 (strlen) redirected to 0x4024490 (strlen)
+--23273-- Reading syms from /usr/lib/debug/libm-2.7.so (0x4027000)
+--23273-- Reading syms from /usr/lib/debug/libc-2.7.so (0x404D000)
+--23273-- REDIR: 0x40beaf0 (rindex) redirected to 0x40240c0 (rindex)
+--23273-- REDIR: 0x40bf760 (memset) redirected to 0x4025380 (memset)
+--23273-- REDIR: 0x40be160 (strcmp) redirected to 0x4024770 (strcmp)
+--23273-- REDIR: 0x40be700 (strlen) redirected to 0x4024470 (strlen)
+--23273-- REDIR: 0x40be910 (strncmp) redirected to 0x40246e0 (strncmp)
+--23273-- REDIR: 0x40bdff0 (index) redirected to 0x40241b0 (index)
+--23273-- REDIR: 0x40b9740 (free) redirected to 0x4022ad0 (free)
+--23273-- REDIR: 0x40bb2c0 (calloc) redirected to 0x4021d60 (calloc)
+--23273-- REDIR: 0x40c07e0 (strchrnul) redirected to 0x4025450 (strchrnul)
+--23273-- REDIR: 0x40bb5e0 (malloc) redirected to 0x4023cb0 (malloc)
+--23273-- REDIR: 0x40bfc80 (memcpy) redirected to 0x40248e0 (memcpy)
+--23273-- REDIR: 0x40be7b0 (strnlen) redirected to 0x4024430 (strnlen)
+--23273-- REDIR: 0x40bf7c0 (mempcpy) redirected to 0x40254b0 (mempcpy)
+--23273-- REDIR: 0x40be1f0 (strcpy) redirected to 0x40244d0 (strcpy)
+--23273-- REDIR: 0x40bba60 (realloc) redirected to 0x4023dc0 (realloc)
+--23273-- REDIR: 0x40bea20 (strncpy) redirected to 0x40245a0 (strncpy)
+--23273-- REDIR: 0x40bf690 (bcmp) redirected to 0x4025070 (bcmp)
+--23273-- REDIR: 0x40bde40 (strcat) redirected to 0x4024240 (strcat)
+==23273==
+==23273== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1)
+--23273--
+--23273-- supp: 14 dl-hack3-cond-1
+==23273== malloc/free: in use at exit: 72,482 bytes in 382 blocks.
+==23273== malloc/free: 419 allocs, 37 frees, 79,695 bytes allocated.
+==23273==
+==23273== searching for pointers to 382 not-freed blocks.
+==23273== checked 149,580 bytes.
+==23273==
+==23273== 6 bytes in 1 blocks are still reachable in loss record 1 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 6 bytes in 1 blocks are still reachable in loss record 2 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 7 bytes in 2 blocks are still reachable in loss record 3 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 11 bytes in 1 blocks are still reachable in loss record 4 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 12 bytes in 1 blocks are still reachable in loss record 5 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x807F18F: _nc_add_to_try (add_tries.c:90)
+==23273== by 0x80885C6: _nc_init_keytry (init_keytry.c:74)
+==23273== by 0x80807F4: _nc_keypad (lib_options.c:262)
+==23273== by 0x808035F: keypad (lib_options.c:129)
+==23273== by 0x8066340: init_dialog (util.c:330)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 6 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 7 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 8 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 9 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 16 bytes in 1 blocks are still reachable in loss record 10 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x807F2D5: _nc_doalloc (doalloc.c:55)
+==23273== by 0x8086167: _nc_trace_alloc (trace_buf.c:55)
+==23273== by 0x8086261: _nc_trace_buf (trace_buf.c:90)
+==23273== by 0x80864A7: _nc_visbuf2n (visbuf.c:94)
+==23273== by 0x8086538: _nc_visbuf2 (visbuf.c:114)
+==23273== by 0x8086553: _nc_visbuf (visbuf.c:120)
+==23273== by 0x8088693: recur_tries (trace_tries.c:55)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273==
+==23273==
+==23273== 21 bytes in 1 blocks are still reachable in loss record 11 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x40BE45F: strdup (strdup.c:43)
+==23273== by 0x8081EE0: setupterm (lib_setup.c:471)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 23 bytes in 1 blocks are still reachable in loss record 12 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8088526: _nc_home_terminfo (home_terminfo.c:57)
+==23273== by 0x8085E1B: _nc_read_entry (read_entry.c:492)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 24 bytes in 1 blocks are still reachable in loss record 13 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 24 bytes in 1 blocks are still reachable in loss record 14 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 15 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 16 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8059BBE: print_button (buttons.c:97)
+==23273== by 0x805A265: dlg_draw_buttons (buttons.c:297)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 17 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x805A1F3: dlg_draw_buttons (buttons.c:296)
+==23273== by 0x806A2D0: dialog_yesno (yesno.c:98)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 1 blocks are still reachable in loss record 18 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 28 bytes in 2 blocks are still reachable in loss record 19 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 32 bytes in 2 blocks are still reachable in loss record 20 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273==
+==23273==
+==23273== 33 bytes in 1 blocks are still reachable in loss record 21 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x808620A: _nc_trace_alloc (trace_buf.c:63)
+==23273== by 0x8086261: _nc_trace_buf (trace_buf.c:90)
+==23273== by 0x80864A7: _nc_visbuf2n (visbuf.c:94)
+==23273== by 0x8086538: _nc_visbuf2 (visbuf.c:114)
+==23273== by 0x8086553: _nc_visbuf (visbuf.c:120)
+==23273== by 0x8088693: recur_tries (trace_tries.c:55)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273== by 0x80886D7: recur_tries (trace_tries.c:59)
+==23273==
+==23273==
+==23273== 44 bytes in 1 blocks are still reachable in loss record 22 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8067711: real_auto_size (util.c:1101)
+==23273== by 0x8067A1F: dlg_auto_size (util.c:1167)
+==23273== by 0x806A14E: dialog_yesno (yesno.c:72)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 47 bytes in 1 blocks are still reachable in loss record 23 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x8085368: read_termtype (read_entry.c:283)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273==
+==23273==
+==23273== 55 bytes in 1 blocks are still reachable in loss record 24 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8084EC3: read_termtype (read_entry.c:207)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 56 bytes in 2 blocks are still reachable in loss record 25 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8059E3A: dlg_button_sizes (buttons.c:179)
+==23273== by 0x8059F04: dlg_button_x_step (buttons.c:209)
+==23273== by 0x805A02F: dlg_button_layout (buttons.c:234)
+==23273== by 0x806A11F: dialog_yesno (yesno.c:71)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 66 bytes in 1 blocks are still reachable in loss record 26 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x808238C: get_space (lib_tparm.c:155)
+==23273== by 0x8082443: save_number (lib_tparm.c:180)
+==23273== by 0x8082D8B: tparam_internal (lib_tparm.c:564)
+==23273== by 0x80833C4: tparm (lib_tparm.c:788)
+==23273== by 0x80704CF: _nc_mvcur_init (lib_mvcur.c:358)
+==23273== by 0x8072684: newterm (lib_newterm.c:191)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 27 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E08: _nc_makenew (lib_newwin.c:218)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074F9A: _nc_setupscreen (lib_set_term.c:459)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 28 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E08: _nc_makenew (lib_newwin.c:218)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074CB3: _nc_setupscreen (lib_set_term.c:414)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 29 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E08: _nc_makenew (lib_newwin.c:218)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074C55: _nc_setupscreen (lib_set_term.c:410)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 80 bytes in 1 blocks are still reachable in loss record 30 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x808538F: read_termtype (read_entry.c:284)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273==
+==23273==
+==23273== 112 bytes in 7 blocks are still reachable in loss record 31 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273==
+==23273==
+==23273== 118 bytes in 1 blocks are still reachable in loss record 32 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x8082957: _nc_tparm_analyze (lib_tparm.c:374)
+==23273== by 0x8082B5E: tparam_internal (lib_tparm.c:502)
+==23273== by 0x80833C4: tparm (lib_tparm.c:788)
+==23273== by 0x80782E6: vidputs (lib_vidattr.c:187)
+==23273== by 0x8078B59: vidattr (lib_vidattr.c:270)
+==23273== by 0x807ACE8: ClrToEOS (tty_update.c:957)
+==23273== by 0x807AF54: ClrBottom (tty_update.c:1006)
+==23273== by 0x807AB1C: ClrUpdate (tty_update.c:897)
+==23273==
+==23273==
+==23273== 128 bytes in 8 blocks are still reachable in loss record 33 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x41165D0: tsearch (tsearch.c:281)
+==23273== by 0x805FC92: make_cache (inputstr.c:149)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273==
+==23273==
+==23273== 128 bytes in 1 blocks are still reachable in loss record 34 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x806BDE0: start_color (lib_color.c:238)
+==23273== by 0x80663B1: dlg_color_setup (util.c:360)
+==23273== by 0x806638E: init_dialog (util.c:342)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 128 bytes in 1 blocks are still reachable in loss record 35 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x806BDA7: start_color (lib_color.c:236)
+==23273== by 0x80663B1: dlg_color_setup (util.c:360)
+==23273== by 0x806638E: init_dialog (util.c:342)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 160 bytes in 1 blocks are still reachable in loss record 36 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8087176: _nc_hash_map (hashmap.c:299)
+==23273== by 0x80865F4: _nc_scroll_optimize (hardscroll.c:199)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 160 bytes in 1 blocks are still reachable in loss record 37 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8087141: _nc_hash_map (hashmap.c:297)
+==23273== by 0x80865F4: _nc_scroll_optimize (hardscroll.c:199)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 160 bytes in 1 blocks are still reachable in loss record 38 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x807F2D5: _nc_doalloc (doalloc.c:55)
+==23273== by 0x80865CB: _nc_scroll_optimize (hardscroll.c:192)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 172 bytes in 1 blocks are still reachable in loss record 39 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8081CD7: setupterm (lib_setup.c:431)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 196 bytes in 7 blocks are still reachable in loss record 40 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FFB4: dlg_index_columns (inputstr.c:396)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 224 bytes in 8 blocks are still reachable in loss record 41 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x805FC0F: make_cache (inputstr.c:139)
+==23273== by 0x805FCF7: load_cache (inputstr.c:161)
+==23273== by 0x805FECD: dlg_index_wchars (inputstr.c:341)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 252 bytes in 1 blocks are still reachable in loss record 42 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80858B3: read_termtype (read_entry.c:345)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 421 bytes in 1 blocks are still reachable in loss record 43 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 480 bytes in 1 blocks are still reachable in loss record 44 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E36: _nc_makenew (lib_newwin.c:223)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074F9A: _nc_setupscreen (lib_set_term.c:459)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 480 bytes in 1 blocks are still reachable in loss record 45 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E36: _nc_makenew (lib_newwin.c:223)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074CB3: _nc_setupscreen (lib_set_term.c:414)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 480 bytes in 1 blocks are still reachable in loss record 46 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x8072E36: _nc_makenew (lib_newwin.c:223)
+==23273== by 0x807299B: newwin (lib_newwin.c:126)
+==23273== by 0x8074C55: _nc_setupscreen (lib_set_term.c:410)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 689 bytes in 1 blocks are still reachable in loss record 47 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8085659: read_termtype (read_entry.c:318)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 780 bytes in 65 blocks are still reachable in loss record 48 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x807F1FF: _nc_add_to_try (add_tries.c:104)
+==23273== by 0x80885C6: _nc_init_keytry (init_keytry.c:74)
+==23273== by 0x80807F4: _nc_keypad (lib_options.c:262)
+==23273== by 0x808035F: keypad (lib_options.c:129)
+==23273== by 0x8066340: init_dialog (util.c:330)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 1,008 bytes in 84 blocks are still reachable in loss record 49 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x807F119: _nc_add_to_try (add_tries.c:77)
+==23273== by 0x80885C6: _nc_init_keytry (init_keytry.c:74)
+==23273== by 0x80807F4: _nc_keypad (lib_options.c:262)
+==23273== by 0x808035F: keypad (lib_options.c:129)
+==23273== by 0x8066340: init_dialog (util.c:330)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 1,338 bytes in 1 blocks are still reachable in loss record 50 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8084DF7: read_termtype (read_entry.c:193)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273==
+==23273==
+==23273== 1,382 bytes in 7 blocks are still reachable in loss record 51 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 1,520 bytes in 1 blocks are still reachable in loss record 52 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80747CF: _nc_setupscreen (lib_set_term.c:221)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 1,640 bytes in 1 blocks are still reachable in loss record 53 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8087007: _nc_hash_map (hashmap.c:277)
+==23273== by 0x80865F4: _nc_scroll_optimize (hardscroll.c:199)
+==23273== by 0x807A762: doupdate (tty_update.c:778)
+==23273== by 0x8073C0A: wrefresh (lib_refresh.c:58)
+==23273== by 0x806D95D: _nc_wgetch (lib_getch.c:295)
+==23273== by 0x806DD0D: wgetch (lib_getch.c:467)
+==23273== by 0x80654FC: really_getch (ui_getc.c:352)
+==23273== by 0x806566B: dlg_getc (ui_getc.c:423)
+==23273== by 0x80627C4: mouse_wgetch (mousewget.c:35)
+==23273==
+==23273==
+==23273== 1,684 bytes in 1 blocks are still reachable in loss record 54 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8060166: dlg_count_columns (inputstr.c:473)
+==23273== by 0x8066FD3: dlg_print_scrolled (util.c:886)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 1,803 bytes in 8 blocks are still reachable in loss record 55 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8068E64: dlg_strclone (util.c:1740)
+==23273== by 0x805FE72: same_cache2 (inputstr.c:212)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273==
+==23273==
+==23273== 1,892 bytes in 1 blocks are still reachable in loss record 56 of 62
+==23273== at 0x4023E8C: realloc (vg_replace_malloc.c:429)
+==23273== by 0x807F2A9: _nc_doalloc (doalloc.c:50)
+==23273== by 0x80853BA: read_termtype (read_entry.c:285)
+==23273== by 0x8085B64: _nc_read_file_entry (read_entry.c:392)
+==23273== by 0x8085BF5: _nc_read_tic_entry (read_entry.c:413)
+==23273== by 0x8085C8A: _nc_read_terminfo_dirs (read_entry.c:438)
+==23273== by 0x8085E90: _nc_read_entry (read_entry.c:500)
+==23273== by 0x8081834: grab_entry (lib_setup.c:255)
+==23273== by 0x8081D46: setupterm (lib_setup.c:438)
+==23273== by 0x8072292: newterm (lib_newterm.c:115)
+==23273==
+==23273==
+==23273== 2,800 bytes in 1 blocks are still reachable in loss record 57 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x8085F59: _nc_set_buffer (setbuf.c:119)
+==23273== by 0x807481F: _nc_setupscreen (lib_set_term.c:232)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 5,528 bytes in 7 blocks are still reachable in loss record 58 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FFCE: dlg_index_columns (inputstr.c:397)
+==23273== by 0x8066A0A: dlg_print_line (util.c:668)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 7,212 bytes in 8 blocks are still reachable in loss record 59 of 62
+==23273== at 0x4023D6E: malloc (vg_replace_malloc.c:207)
+==23273== by 0x805FDE1: same_cache2 (inputstr.c:201)
+==23273== by 0x805FEE7: dlg_index_wchars (inputstr.c:342)
+==23273== by 0x8066A18: dlg_print_line (util.c:669)
+==23273== by 0x8066E40: justify_text (util.c:813)
+==23273== by 0x8066F5E: dlg_print_autowrap (util.c:843)
+==23273== by 0x806703E: dlg_print_scrolled (util.c:892)
+==23273== by 0x806A30C: dialog_yesno (yesno.c:104)
+==23273== by 0x804A728: call_yesno (dialog.c:600)
+==23273== by 0x804CC56: main (dialog.c:1679)
+==23273==
+==23273==
+==23273== 12,800 bytes in 40 blocks are still reachable in loss record 60 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80729EC: newwin (lib_newwin.c:130)
+==23273== by 0x8074F9A: _nc_setupscreen (lib_set_term.c:459)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 12,800 bytes in 40 blocks are still reachable in loss record 61 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80729EC: newwin (lib_newwin.c:130)
+==23273== by 0x8074CB3: _nc_setupscreen (lib_set_term.c:414)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273==
+==23273== 12,800 bytes in 40 blocks are still reachable in loss record 62 of 62
+==23273== at 0x4021E22: calloc (vg_replace_malloc.c:397)
+==23273== by 0x80729EC: newwin (lib_newwin.c:130)
+==23273== by 0x8074C55: _nc_setupscreen (lib_set_term.c:410)
+==23273== by 0x80723F1: newterm (lib_newterm.c:146)
+==23273== by 0x806E82C: initscr (lib_initscr.c:83)
+==23273== by 0x8066211: init_dialog (util.c:292)
+==23273== by 0x804C880: main (dialog.c:1604)
+==23273==
+==23273== LEAK SUMMARY:
+==23273== definitely lost: 0 bytes in 0 blocks.
+==23273== possibly lost: 0 bytes in 0 blocks.
+==23273== still reachable: 72,482 bytes in 382 blocks.
+==23273== suppressed: 0 bytes in 0 blocks.
+--23273-- memcheck: sanity checks: 8 cheap, 2 expensive
+--23273-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
+--23273-- memcheck: auxmaps_L1: 0 searches, 0 cmps, ratio 0:10
+--23273-- memcheck: auxmaps_L2: 0 searches, 0 nodes
+--23273-- memcheck: SMs: n_issued = 11 (176k, 0M)
+--23273-- memcheck: SMs: n_deissued = 0 (0k, 0M)
+--23273-- memcheck: SMs: max_noaccess = 65535 (1048560k, 1023M)
+--23273-- memcheck: SMs: max_undefined = 0 (0k, 0M)
+--23273-- memcheck: SMs: max_defined = 25 (400k, 0M)
+--23273-- memcheck: SMs: max_non_DSM = 11 (176k, 0M)
+--23273-- memcheck: max sec V bit nodes: 21 (1k, 0M)
+--23273-- memcheck: set_sec_vbits8 calls: 130 (new: 21, updates: 109)
+--23273-- memcheck: max shadow mem size: 481k, 0M
+--23273-- translate: fast SP updates identified: 4,767 ( 83.0%)
+--23273-- translate: generic_known SP updates identified: 612 ( 10.6%)
+--23273-- translate: generic_unknown SP updates identified: 358 ( 6.2%)
+--23273-- tt/tc: 11,509 tt lookups requiring 11,938 probes
+--23273-- tt/tc: 11,509 fast-cache updates, 3 flushes
+--23273-- transtab: new 5,099 (117,852 -> 1,563,594; ratio 132:10) [0 scs]
+--23273-- transtab: dumped 0 (0 -> ??)
+--23273-- transtab: discarded 9 (222 -> ??)
+--23273-- scheduler: 864,676 jumps (bb entries).
+--23273-- scheduler: 8/7,086 major/minor sched events.
+--23273-- sanity: 9 cheap, 2 expensive checks.
+--23273-- exectx: 769 lists, 102 contexts (avg 0 per list)
+--23273-- exectx: 470 searches, 372 full compares (791 per 1000)
+--23273-- exectx: 0 cmp2, 36 cmp4, 2,470 cmpAll
+--23273-- errormgr: 69 supplist searches, 5,672 comparisons during search
+--23273-- errormgr: 14 errlist searches, 36 comparisons during search
diff --git a/contrib/dialog/tailbox.c b/contrib/dialog/tailbox.c
index 3499b4b..c111f64 100644
--- a/contrib/dialog/tailbox.c
+++ b/contrib/dialog/tailbox.c
@@ -1,5 +1,5 @@
/*
- * $Id: tailbox.c,v 1.61 2011/01/16 21:48:16 tom Exp $
+ * $Id: tailbox.c,v 1.63 2011/06/27 08:19:43 tom Exp $
*
* tailbox.c -- implements the tail box
*
@@ -284,6 +284,7 @@ dialog_tailbox(const char *title, const char *file, int height, int width, int b
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_BEGIN, '0' ),
DLG_KEYS_DATA( DLGK_BEGIN, KEY_BEG ),
@@ -338,6 +339,7 @@ dialog_tailbox(const char *title, const char *file, int height, int width, int b
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
if (!bg_task) {
buttons = dlg_exit_label();
diff --git a/contrib/dialog/textbox.c b/contrib/dialog/textbox.c
index f9a19eb..72a9b11 100644
--- a/contrib/dialog/textbox.c
+++ b/contrib/dialog/textbox.c
@@ -1,5 +1,5 @@
/*
- * $Id: textbox.c,v 1.99 2011/01/16 22:20:34 tom Exp $
+ * $Id: textbox.c,v 1.101 2011/06/29 09:53:03 tom Exp $
*
* textbox.c -- implements the text box
*
@@ -452,6 +452,7 @@ get_search_term(WINDOW *dialog, char *input, int height, int width)
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
INPUTSTR_BINDINGS,
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
END_KEYS_BINDING
};
@@ -628,6 +629,7 @@ dialog_textbox(const char *title, const char *file, int height, int width)
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_GRID_DOWN, 'J' ),
DLG_KEYS_DATA( DLGK_GRID_DOWN, 'j' ),
@@ -819,7 +821,10 @@ dialog_textbox(const char *title, const char *file, int height, int width)
FALSE, width);
break;
case DLGK_ENTER:
- result = dlg_exit_buttoncode(button);
+ if (dialog_vars.nook)
+ result = DLG_EXIT_OK;
+ else
+ result = dlg_exit_buttoncode(button);
break;
case DLGK_PAGE_FIRST:
if (!obj.begin_reached) {
diff --git a/contrib/dialog/timebox.c b/contrib/dialog/timebox.c
index 63bffd8..5a6be3e 100644
--- a/contrib/dialog/timebox.c
+++ b/contrib/dialog/timebox.c
@@ -1,5 +1,5 @@
/*
- * $Id: timebox.c,v 1.43 2011/01/18 01:07:45 Garrett.Cooper Exp $
+ * $Id: timebox.c,v 1.45 2011/06/27 08:20:22 tom Exp $
*
* timebox.c -- implements the timebox dialog
*
@@ -148,6 +148,7 @@ dialog_timebox(const char *title,
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
DLG_KEYS_DATA( DLGK_DELETE_RIGHT,KEY_DC ),
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_FIRST,KEY_HOME ),
@@ -223,6 +224,7 @@ dialog_timebox(const char *title,
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
wattrset(dialog, dialog_attr);
dlg_print_autowrap(dialog, prompt, height, width);
diff --git a/contrib/dialog/trace.c b/contrib/dialog/trace.c
index b7ca87d..a742ae8 100644
--- a/contrib/dialog/trace.c
+++ b/contrib/dialog/trace.c
@@ -1,5 +1,5 @@
/*
- * $Id: trace.c,v 1.12 2011/01/13 01:36:34 tom Exp $
+ * $Id: trace.c,v 1.14 2011/06/21 21:12:56 tom Exp $
*
* trace.c -- implements screen-dump and keystroke-logging
*
@@ -119,6 +119,7 @@ dlg_trace_chr(int ch, int fkey)
CASE(DLGK_BEGIN);
CASE(DLGK_FINAL);
CASE(DLGK_SELECT);
+ CASE(DLGK_HELPFILE);
CASE(DLGK_TRACE);
}
}
@@ -144,6 +145,7 @@ dlg_trace(const char *fname)
myFP = fopen(fname, "a");
if (myFP != 0) {
dlg_trace_time("** opened at");
+ dlg_trace_msg("** dialog %s\n", dialog_version());
}
}
} else if (myFP != 0) {
diff --git a/contrib/dialog/ui_getc.c b/contrib/dialog/ui_getc.c
index 4298d8a..d9d5a93 100644
--- a/contrib/dialog/ui_getc.c
+++ b/contrib/dialog/ui_getc.c
@@ -1,5 +1,5 @@
/*
- * $Id: ui_getc.c,v 1.59 2011/02/28 10:56:15 tom Exp $
+ * $Id: ui_getc.c,v 1.63 2011/07/07 22:05:58 tom Exp $
*
* ui_getc.c - user interface glue for getc()
*
@@ -385,6 +385,9 @@ prev_callback(DIALOG_CALLBACK * p)
return p;
}
+#define isBeforeChr(chr) ((chr) == before_chr && !before_fkey)
+#define isBeforeFkey(chr) ((chr) == before_chr && before_fkey)
+
/*
* Read a character from the given window. Handle repainting here (to simplify
* things in the calling application). Also, if input-callback(s) are set up,
@@ -396,7 +399,8 @@ dlg_getc(WINDOW *win, int *fkey)
{
WINDOW *save_win = win;
int ch = ERR;
- int before_lookup;
+ int before_chr;
+ int before_fkey;
int result;
bool done = FALSE;
bool literal = FALSE;
@@ -411,6 +415,8 @@ dlg_getc(WINDOW *win, int *fkey)
wtimeout(win, interval);
while (!done) {
+ bool handle_others = FALSE;
+
/*
* If there was no pending file-input, check the keyboard.
*/
@@ -420,80 +426,108 @@ dlg_getc(WINDOW *win, int *fkey)
continue;
}
- before_lookup = ch;
+ before_chr = ch;
+ before_fkey = *fkey;
+
ch = dlg_lookup_key(win, ch, fkey);
dlg_trace_chr(ch, *fkey);
current = time((time_t *) 0);
- switch (ch) {
- case CHR_LITERAL:
- if (!literal) {
- literal = TRUE;
- keypad(win, FALSE);
- continue;
- }
- break;
- case CHR_REPAINT:
- (void) touchwin(win);
- (void) wrefresh(curscr);
- break;
- case ERR: /* wtimeout() in effect; check for file I/O */
- if (interval > 0
- && current >= expired) {
- dlg_exiterr("timeout");
- }
- if (!valid_file(stdin)
- || !valid_file(dialog_state.screen_output)) {
- ch = ESC;
- done = TRUE;
- } else if (check_inputs()) {
- if (handle_inputs(win))
- dlg_raise_window(win);
- else
+ /*
+ * If we acquired a fkey value, then it is one of dialog's builtin
+ * codes such as DLGK_HELPFILE.
+ */
+ if (!*fkey || *fkey != before_fkey) {
+ switch (ch) {
+ case CHR_LITERAL:
+ if (!literal) {
+ literal = TRUE;
+ keypad(win, FALSE);
+ continue;
+ }
+ break;
+ case CHR_REPAINT:
+ (void) touchwin(win);
+ (void) wrefresh(curscr);
+ break;
+ case ERR: /* wtimeout() in effect; check for file I/O */
+ if (interval > 0
+ && current >= expired) {
+ dlg_exiterr("timeout");
+ }
+ if (!valid_file(stdin)
+ || !valid_file(dialog_state.screen_output)) {
+ ch = ESC;
done = TRUE;
- } else {
- done = (interval <= 0);
- }
- break;
- case DLGK_FIELD_PREV:
- /* FALLTHRU */
- case KEY_BTAB:
- /* FALLTHRU */
- case DLGK_FIELD_NEXT:
- /* FALLTHRU */
- case TAB:
- /* Handle tab/backtab as a special case for traversing between the
- * nominal "current" window, and other windows having callbacks.
- * If the nominal (control) window closes, we'll close the windows
- * with callbacks.
- */
- if (dialog_state.getc_callbacks != 0 &&
- (before_lookup == TAB ||
- before_lookup == KEY_BTAB)) {
- if (before_lookup == TAB)
- p = next_callback(p);
- else
- p = prev_callback(p);
- if ((dialog_state.getc_redirect = p) != 0) {
- win = p->win;
+ } else if (check_inputs()) {
+ if (handle_inputs(win))
+ dlg_raise_window(win);
+ else
+ done = TRUE;
} else {
- win = save_win;
+ done = (interval <= 0);
}
- dlg_raise_window(win);
break;
- }
- /* FALLTHRU */
- default:
+ case DLGK_HELPFILE:
+ if (dialog_vars.help_file) {
+ int yold, xold;
+ getyx(win, yold, xold);
+ dialog_helpfile("HELP", dialog_vars.help_file, 0, 0);
+ dlg_raise_window(win);
+ wmove(win, yold, xold);
+ }
+ continue;
+ case DLGK_FIELD_PREV:
+ /* FALLTHRU */
+ case KEY_BTAB:
+ /* FALLTHRU */
+ case DLGK_FIELD_NEXT:
+ /* FALLTHRU */
+ case TAB:
+ /* Handle tab/backtab as a special case for traversing between
+ * the nominal "current" window, and other windows having
+ * callbacks. If the nominal (control) window closes, we'll
+ * close the windows with callbacks.
+ */
+ if (dialog_state.getc_callbacks != 0 &&
+ (isBeforeChr(TAB) ||
+ isBeforeFkey(KEY_BTAB))) {
+ p = (isBeforeChr(TAB)
+ ? next_callback(p)
+ : prev_callback(p));
+ if ((dialog_state.getc_redirect = p) != 0) {
+ win = p->win;
+ } else {
+ win = save_win;
+ }
+ dlg_raise_window(win);
+ break;
+ }
+ /* FALLTHRU */
+ default:
#ifdef NO_LEAKS
- if (before_lookup == DLG_CTRL('P')) {
- /* for testing, ^P closes the connection */
- close(0);
- close(1);
- close(2);
+ if (isBeforeChr(DLG_CTRL('P'))) {
+ /* for testing, ^P closes the connection */
+ close(0);
+ close(1);
+ close(2);
+ break;
+ }
+#endif
+ handle_others = TRUE;
+ break;
+#ifdef HAVE_DLG_TRACE
+ case CHR_TRACE:
+ dlg_trace_win(win);
break;
- }
#endif
+ }
+ } else {
+ handle_others = TRUE;
+ }
+
+ if (handle_others) {
if ((p = dialog_state.getc_redirect) != 0) {
if (!(p->handle_getc(p, ch, *fkey, &result))) {
dlg_remove_callback(p);
@@ -503,12 +537,6 @@ dlg_getc(WINDOW *win, int *fkey)
} else {
done = TRUE;
}
- break;
-#ifdef HAVE_DLG_TRACE
- case CHR_TRACE:
- dlg_trace_win(win);
- break;
-#endif
}
}
if (literal)
diff --git a/contrib/dialog/util.c b/contrib/dialog/util.c
index 8496330..82ef4fa 100644
--- a/contrib/dialog/util.c
+++ b/contrib/dialog/util.c
@@ -1,5 +1,5 @@
/*
- * $Id: util.c,v 1.211 2011/01/19 00:31:43 tom Exp $
+ * $Id: util.c,v 1.227 2011/07/07 23:42:30 tom Exp $
*
* util.c -- miscellaneous utilities for dialog
*
@@ -37,6 +37,20 @@
#endif
#endif
+#if defined(HAVE_WCHGAT)
+# if defined(NCURSES_VERSION_PATCH)
+# if NCURSES_VERSION_PATCH >= 20060715
+# define USE_WCHGAT 1
+# else
+# define USE_WCHGAT 0
+# endif
+# else
+# define USE_WCHGAT 1
+# endif
+#else
+# define USE_WCHGAT 0
+#endif
+
/* globals */
DIALOG_STATE dialog_state;
DIALOG_VARS dialog_vars;
@@ -61,6 +75,8 @@ DIALOG_VARS dialog_vars;
#define DATA(atr,upr,lwr,cmt) { atr COLOR_DATA(upr) RC_DATA(lwr,cmt) }
+#define UseShadow(dw) ((dw) != 0 && (dw)->normal != 0 && (dw)->shadow != 0)
+
/*
* Table of color and attribute values, default is for mono display.
*/
@@ -411,7 +427,7 @@ dlg_get_attrs(WINDOW *win)
{
chtype result;
#ifdef HAVE_GETATTRS
- result = getattrs(win);
+ result = (chtype) getattrs(win);
#else
attr_t my_result;
short my_pair;
@@ -487,6 +503,7 @@ end_dialog(void)
}
}
+#define ESCAPE_LEN 3
#define isOurEscape(p) (((p)[0] == '\\') && ((p)[1] == 'Z') && ((p)[2] != 0))
static int
@@ -500,7 +517,7 @@ centered(int width, const char *string)
if (dialog_vars.colors) {
for (n = 0; n < len; ++n) {
if (isOurEscape(string + n)) {
- hide += 3;
+ hide += ESCAPE_LEN;
}
}
}
@@ -661,6 +678,7 @@ dlg_print_line(WINDOW *win,
{
const char *wrap_ptr = prompt;
const char *test_ptr = prompt;
+ const char *hide_ptr = 0;
const int *cols = dlg_index_columns(prompt);
const int *indx = dlg_index_wchars(prompt);
int wrap_inx = 0;
@@ -687,8 +705,9 @@ dlg_print_line(WINDOW *win,
wrap_inx = n;
*x = cur_x;
} else if (isOurEscape(test_ptr)) {
- hidden += 3;
- n += 2;
+ hide_ptr = test_ptr;
+ hidden += ESCAPE_LEN;
+ n += (ESCAPE_LEN - 1);
}
cur_x = lm + tabbed + cols[n + 1];
if (cur_x > (rm + hidden))
@@ -725,6 +744,23 @@ dlg_print_line(WINDOW *win,
#endif
/*
+ * If we found hidden text past the last point that we will display,
+ * discount that from the displayed length.
+ */
+ if ((hide_ptr != 0) && (hide_ptr >= wrap_ptr)) {
+ hidden -= ESCAPE_LEN;
+ test_ptr = wrap_ptr;
+ while (test_ptr < wrap_ptr) {
+ if (isOurEscape(test_ptr)) {
+ hidden -= ESCAPE_LEN;
+ test_ptr += ESCAPE_LEN;
+ } else {
+ ++test_ptr;
+ }
+ }
+ }
+
+ /*
* Print the line if we have a window pointer. Otherwise this routine
* is just being called for sizing the window.
*/
@@ -736,6 +772,8 @@ dlg_print_line(WINDOW *win,
if (*x == 1)
*x = rm;
+ *x -= hidden;
+
/* Find the start of the next line and return a pointer to it */
test_ptr = wrap_ptr;
while (*test_ptr == ' ')
@@ -863,43 +901,49 @@ dlg_print_scrolled(WINDOW *win,
high = len;
#endif
dummy = newwin(high, width, 0, 0);
- wbkgdset(dummy, dialog_attr | ' ');
- wattrset(dummy, dialog_attr);
- werase(dummy);
- dlg_print_autowrap(dummy, prompt, high, width);
- getyx(dummy, y, x);
-
- copywin(dummy, /* srcwin */
- win, /* dstwin */
- offset + MARGIN, /* sminrow */
- MARGIN, /* smincol */
- MARGIN, /* dminrow */
- MARGIN, /* dmincol */
- height, /* dmaxrow */
- wide, /* dmaxcol */
- FALSE);
-
- delwin(dummy);
-
- /* if the text is incomplete, or we have scrolled, show the percentage */
- if (y > 0 && wide > 4) {
- percent = (int) ((height + offset) * 100.0 / y);
- if (percent < 0)
- percent = 0;
- if (percent > 100)
- percent = 100;
- if (offset != 0 || percent != 100) {
- (void) wattrset(win, position_indicator_attr);
- (void) wmove(win, MARGIN + height, wide - 4);
- (void) sprintf(buffer, "%d%%", percent);
- (void) waddstr(win, buffer);
- if ((len = (int) strlen(buffer)) < 4) {
- wattrset(win, border_attr);
- whline(win, dlg_boxchar(ACS_HLINE), 4 - len);
+ if (dummy == 0) {
+ wattrset(win, dialog_attr);
+ dlg_print_autowrap(win, prompt, height + 1 + (3 * MARGIN), width);
+ last = 0;
+ } else {
+ wbkgdset(dummy, dialog_attr | ' ');
+ wattrset(dummy, dialog_attr);
+ werase(dummy);
+ dlg_print_autowrap(dummy, prompt, high, width);
+ getyx(dummy, y, x);
+
+ copywin(dummy, /* srcwin */
+ win, /* dstwin */
+ offset + MARGIN, /* sminrow */
+ MARGIN, /* smincol */
+ MARGIN, /* dminrow */
+ MARGIN, /* dmincol */
+ height, /* dmaxrow */
+ wide, /* dmaxcol */
+ FALSE);
+
+ delwin(dummy);
+
+ /* if the text is incomplete, or we have scrolled, show the percentage */
+ if (y > 0 && wide > 4) {
+ percent = (int) ((height + offset) * 100.0 / y);
+ if (percent < 0)
+ percent = 0;
+ if (percent > 100)
+ percent = 100;
+ if (offset != 0 || percent != 100) {
+ (void) wattrset(win, position_indicator_attr);
+ (void) wmove(win, MARGIN + height, wide - 4);
+ (void) sprintf(buffer, "%d%%", percent);
+ (void) waddstr(win, buffer);
+ if ((len = (int) strlen(buffer)) < 4) {
+ wattrset(win, border_attr);
+ whline(win, dlg_boxchar(ACS_HLINE), 4 - len);
+ }
}
}
+ last = (y - height);
}
- last = (y - height);
} else
#endif
{
@@ -1037,6 +1081,25 @@ longest_word(const char *string)
return result;
}
+static int
+count_real_columns(const char *text)
+{
+ int result = dlg_count_columns(text);
+ if (result && dialog_vars.colors) {
+ int hidden = 0;
+ while (*text) {
+ if (isOurEscape(text)) {
+ hidden += ESCAPE_LEN;
+ text += ESCAPE_LEN;
+ } else {
+ ++text;
+ }
+ }
+ result -= hidden;
+ }
+ return result;
+}
+
/*
* if (height or width == -1) Maximize()
* if (height or width == 0), justify and return actual limits.
@@ -1074,7 +1137,7 @@ real_auto_size(const char *title,
} else if (prompt != 0) {
wide = MAX(title_length, mincols);
if (strchr(prompt, '\n') == 0) {
- double val = dialog_state.aspect_ratio * dlg_count_columns(prompt);
+ double val = dialog_state.aspect_ratio * count_real_columns(prompt);
double xxx = sqrt(val);
int tmp = (int) xxx;
wide = MAX(wide, tmp);
@@ -1190,6 +1253,27 @@ dlg_auto_sizefile(const char *title,
(void) fclose(fd);
}
+static chtype
+dlg_get_cell_attrs(WINDOW *win)
+{
+ chtype result;
+#ifdef USE_WIDE_CURSES
+ cchar_t wch;
+ wchar_t cc;
+ attr_t attrs;
+ short pair;
+ if (win_wch(win, &wch) == OK
+ && getcchar(&wch, &cc, &attrs, &pair, NULL) == OK) {
+ result = attrs;
+ } else {
+ result = 0;
+ }
+#else
+ result = winch(win) & (A_ATTRIBUTES & ~A_COLOR);
+#endif
+ return result;
+}
+
/*
* Draw a rectangular box with line drawing characters.
*
@@ -1239,54 +1323,221 @@ dlg_draw_box(WINDOW *win, int y, int x, int height, int width,
wattrset(win, save);
}
+static DIALOG_WINDOWS *
+find_window(WINDOW *win)
+{
+ DIALOG_WINDOWS *result = 0;
+ DIALOG_WINDOWS *p;
+
+ for (p = dialog_state.all_windows; p != 0; p = p->next) {
+ if (p->normal == win) {
+ result = p;
+ break;
+ }
+ }
+ return result;
+}
+
#ifdef HAVE_COLOR
/*
- * Draw a shadow on the parent window corresponding to the right- and
- * bottom-edge of the child window, to give a 3-dimensional look.
+ * If we have wchgat(), use that for updating shadow attributes, to work with
+ * wide-character data.
*/
-static void
-draw_childs_shadow(WINDOW *parent, WINDOW *child)
+
+/*
+ * Check if the given point is "in" the given window. If so, return the window
+ * pointer, otherwise null.
+ */
+static WINDOW *
+in_window(WINDOW *win, int y, int x)
{
- if (has_colors()) { /* Whether terminal supports color? */
- chtype save = dlg_get_attrs(parent);
+ WINDOW *result = 0;
+ int y_base = getbegy(win);
+ int x_base = getbegx(win);
+ int y_last = getmaxy(win) + y_base;
+ int x_last = getmaxx(win) + x_base;
+
+ if (y >= y_base && y <= y_last && x >= x_base && x <= x_last)
+ result = win;
+ return result;
+}
+
+static WINDOW *
+window_at_cell(DIALOG_WINDOWS * dw, int y, int x)
+{
+ WINDOW *result = 0;
+ DIALOG_WINDOWS *p;
+ int y_want = y + getbegy(dw->shadow);
+ int x_want = x + getbegx(dw->shadow);
+
+ for (p = dialog_state.all_windows; p != 0; p = p->next) {
+ if (dw->normal != p->normal
+ && dw->shadow != p->normal
+ && (result = in_window(p->normal, y_want, x_want)) != 0) {
+ break;
+ }
+ }
+ if (result == 0) {
+ result = stdscr;
+ }
+ return result;
+}
- dlg_draw_shadow(parent,
- getbegy(child) - getbegy(parent),
- getbegx(child) - getbegx(parent),
- getmaxy(child),
- getmaxx(child));
- wattrset(parent, save);
+static bool
+in_shadow(WINDOW *normal, WINDOW *shadow, int y, int x)
+{
+ bool result = FALSE;
+ int ybase = getbegy(normal);
+ int ylast = getmaxy(normal) + ybase;
+ int xbase = getbegx(normal);
+ int xlast = getmaxx(normal) + xbase;
+
+ y += getbegy(shadow);
+ x += getbegx(shadow);
+
+ if (y >= ybase + SHADOW_ROWS
+ && y < ylast + SHADOW_ROWS
+ && x >= xlast
+ && x < xlast + SHADOW_COLS) {
+ /* in the right-side */
+ result = TRUE;
+ } else if (y >= ylast
+ && y < ylast + SHADOW_ROWS
+ && x >= ybase + SHADOW_COLS
+ && x < ylast + SHADOW_COLS) {
+ /* check the bottom */
+ result = TRUE;
}
+
+ return result;
}
/*
- * Draw shadows along the right and bottom edge to give a more 3D look
- * to the boxes
+ * When erasing a shadow, check each cell to make sure that it is not part of
+ * another box's shadow. This is a little complicated since most shadows are
+ * merged onto stdscr.
*/
-void
-dlg_draw_shadow(WINDOW *win, int y, int x, int height, int width)
+static bool
+last_shadow(DIALOG_WINDOWS * dw, int y, int x)
+{
+ DIALOG_WINDOWS *p;
+ bool result = TRUE;
+
+ for (p = dialog_state.all_windows; p != 0; p = p->next) {
+ if (p->normal != dw->normal
+ && in_shadow(p->normal, dw->shadow, y, x)) {
+ result = FALSE;
+ break;
+ }
+ }
+ return result;
+}
+
+static void
+repaint_cell(DIALOG_WINDOWS * dw, bool draw, int y, int x)
+{
+ WINDOW *win = dw->shadow;
+ WINDOW *cellwin;
+ int y2, x2;
+
+ if ((cellwin = window_at_cell(dw, y, x)) != 0
+ && (draw || last_shadow(dw, y, x))
+ && (y2 = (y + getbegy(win) - getbegy(cellwin))) >= 0
+ && (x2 = (x + getbegx(win) - getbegx(cellwin))) >= 0
+ && wmove(cellwin, y2, x2) != ERR) {
+ chtype the_cell = dlg_get_attrs(cellwin);
+ chtype the_attr = (draw ? shadow_attr : the_cell);
+
+ if (dlg_get_cell_attrs(cellwin) & A_ALTCHARSET) {
+ the_attr |= A_ALTCHARSET;
+ }
+#if USE_WCHGAT
+ wchgat(cellwin, 1,
+ the_attr & (chtype) (~A_COLOR),
+ PAIR_NUMBER(the_attr),
+ NULL);
+#else
+ {
+ chtype the_char = ((winch(cellwin) & A_CHARTEXT) | the_attr);
+ (void) waddch(cellwin, the_char);
+ }
+#endif
+ wnoutrefresh(cellwin);
+ }
+}
+
+#define RepaintCell(dw, draw, y, x) repaint_cell(dw, draw, y, x)
+
+static void
+repaint_shadow(DIALOG_WINDOWS * dw, bool draw, int y, int x, int height, int width)
{
int i, j;
- if (has_colors()) { /* Whether terminal supports color? */
- wattrset(win, shadow_attr);
+ if (UseShadow(dw)) {
+#if !USE_WCHGAT
+ chtype save = dlg_get_attrs(dw->shadow);
+ wattrset(dw->shadow, draw ? shadow_attr : screen_attr);
+#endif
for (i = 0; i < SHADOW_ROWS; ++i) {
for (j = 0; j < width; ++j) {
- if (wmove(win, i + y + height, j + x + SHADOW_COLS) != ERR) {
- (void) waddch(win, winch(win) & (chtype) (~A_COLOR));
- }
+ RepaintCell(dw, draw, i + y + height, j + x + SHADOW_COLS);
}
}
for (i = 0; i < height; i++) {
for (j = 0; j < SHADOW_COLS; ++j) {
- if (wmove(win, i + y + SHADOW_ROWS, j + x + width) != ERR) {
- (void) waddch(win, winch(win) & (chtype) (~A_COLOR));
- }
+ RepaintCell(dw, draw, i + y + SHADOW_ROWS, j + x + width);
}
}
- (void) wnoutrefresh(win);
+ (void) wnoutrefresh(dw->shadow);
+#if !USE_WCHGAT
+ wattrset(dw->shadow, save);
+#endif
+ }
+}
+
+/*
+ * Draw a shadow on the parent window corresponding to the right- and
+ * bottom-edge of the child window, to give a 3-dimensional look.
+ */
+static void
+draw_childs_shadow(DIALOG_WINDOWS * dw)
+{
+ if (UseShadow(dw)) {
+ repaint_shadow(dw,
+ TRUE,
+ getbegy(dw->normal) - getbegy(dw->shadow),
+ getbegx(dw->normal) - getbegx(dw->shadow),
+ getmaxy(dw->normal),
+ getmaxx(dw->normal));
}
}
+
+/*
+ * Erase a shadow on the parent window corresponding to the right- and
+ * bottom-edge of the child window.
+ */
+static void
+erase_childs_shadow(DIALOG_WINDOWS * dw)
+{
+ if (UseShadow(dw)) {
+ repaint_shadow(dw,
+ FALSE,
+ getbegy(dw->normal) - getbegy(dw->shadow),
+ getbegx(dw->normal) - getbegx(dw->shadow),
+ getmaxy(dw->normal),
+ getmaxx(dw->normal));
+ }
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes.
+ */
+void
+dlg_draw_shadow(WINDOW *win, int y, int x, int height, int width)
+{
+ repaint_shadow(find_window(win), TRUE, y, x, height, width);
+}
#endif /* HAVE_COLOR */
/*
@@ -1340,6 +1591,10 @@ dlg_exit(int code)
code = DLG_EXIT_HELP;
goto retry;
}
+#ifdef HAVE_DLG_TRACE
+ dlg_trace((const char *) 0); /* close it */
+#endif
+
#ifdef NO_LEAKS
_dlg_inputstr_leaks();
#if defined(NCURSES_VERSION) && defined(HAVE__NC_FREE_AND_EXIT)
@@ -1650,6 +1905,8 @@ dlg_del_window(WINDOW *win)
}
if (q) {
+ if (dialog_state.all_windows != 0)
+ erase_childs_shadow(q);
delwin(q->normal);
dlg_unregister_window(q->normal);
free(q);
@@ -1663,26 +1920,13 @@ dlg_del_window(WINDOW *win)
WINDOW *
dlg_new_window(int height, int width, int y, int x)
{
- WINDOW *win;
- DIALOG_WINDOWS *p = dlg_calloc(DIALOG_WINDOWS, 1);
-
- if ((win = newwin(height, width, y, x)) == 0) {
- dlg_exiterr("Can't make new window at (%d,%d), size (%d,%d).\n",
- y, x, height, width);
- }
- p->next = dialog_state.all_windows;
- p->normal = win;
- dialog_state.all_windows = p;
-#ifdef HAVE_COLOR
- if (dialog_state.use_shadow) {
- draw_childs_shadow(p->shadow = stdscr, win);
- }
-#endif
-
- (void) keypad(win, TRUE);
- return win;
+ return dlg_new_modal_window(stdscr, height, width, y, x);
}
+/*
+ * "Modal" windows differ from normal ones by having a shadow in a window
+ * separate from the standard screen.
+ */
WINDOW *
dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
{
@@ -1699,7 +1943,8 @@ dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
dialog_state.all_windows = p;
#ifdef HAVE_COLOR
if (dialog_state.use_shadow) {
- draw_childs_shadow(p->shadow = parent, win);
+ p->shadow = parent;
+ draw_childs_shadow(p);
}
#endif
@@ -1714,19 +1959,12 @@ dlg_new_modal_window(WINDOW *parent, int height, int width, int y, int x)
void
dlg_move_window(WINDOW *win, int height, int width, int y, int x)
{
- DIALOG_WINDOWS *p, *q;
+ DIALOG_WINDOWS *p;
if (win != 0) {
dlg_ctl_size(height, width);
- for (p = dialog_state.all_windows; p != 0; p = q) {
- q = p->next;
- if (p->normal == win) {
- break;
- }
- }
-
- if (p != 0) {
+ if ((p = find_window(win)) != 0) {
(void) wresize(win, height, width);
(void) mvwin(win, y, x);
#ifdef HAVE_COLOR
@@ -1741,8 +1979,7 @@ dlg_move_window(WINDOW *win, int height, int width, int y, int x)
(void) refresh();
#ifdef HAVE_COLOR
- if (p->shadow)
- draw_childs_shadow(p->shadow, win);
+ draw_childs_shadow(p);
#endif
}
}
@@ -1883,7 +2120,7 @@ dlg_trim_string(char *s)
char *base = s;
char *p1;
char *p = s;
- int has_newlines = (strstr(s, "\\n") != 0);
+ int has_newlines = !dialog_vars.no_nl_expand && (strstr(s, "\\n") != 0);
while (*p != '\0') {
if (*p == TAB && !dialog_vars.nocollapse)
diff --git a/contrib/dialog/yesno.c b/contrib/dialog/yesno.c
index c666154..4efb073 100644
--- a/contrib/dialog/yesno.c
+++ b/contrib/dialog/yesno.c
@@ -1,9 +1,9 @@
/*
- * $Id: yesno.c,v 1.49 2010/01/15 10:54:54 tom Exp $
+ * $Id: yesno.c,v 1.51 2011/06/27 08:20:57 tom Exp $
*
* yesno.c -- implements the yes/no box
*
- * Copyright 1999-2009,2010 Thomas E. Dickey
+ * Copyright 1999-2010,2011 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -35,6 +35,7 @@ dialog_yesno(const char *title, const char *cprompt, int height, int width)
{
/* *INDENT-OFF* */
static DLG_KEYS_BINDING binding[] = {
+ HELPKEY_BINDINGS,
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_DOWN ),
@@ -89,6 +90,7 @@ dialog_yesno(const char *title, const char *cprompt, int height, int width)
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
+ dlg_draw_helpline(dialog, FALSE);
wattrset(dialog, dialog_attr);
diff --git a/contrib/gcc/c-decl.c b/contrib/gcc/c-decl.c
index 64a6fa8..fbafc0d 100644
--- a/contrib/gcc/c-decl.c
+++ b/contrib/gcc/c-decl.c
@@ -4340,6 +4340,8 @@ grokdeclarator (const struct c_declarator *declarator,
pedwarn ("ISO C90 forbids variable-size array %qs",
name);
}
+ if (warn_variable_decl)
+ warning (0, "variable-sized array %qs", name);
}
if (integer_zerop (size))
diff --git a/contrib/gcc/c.opt b/contrib/gcc/c.opt
index 8769657..038fc51 100644
--- a/contrib/gcc/c.opt
+++ b/contrib/gcc/c.opt
@@ -404,6 +404,10 @@ Wtraditional
C ObjC Var(warn_traditional)
Warn about features not present in traditional C
+Wtrampolines
+Common Var(warn_trampolines)
+Warn when trampolines are emitted
+
Wtrigraphs
C ObjC C++ ObjC++
Warn if trigraphs are encountered that might affect the meaning of the program
diff --git a/contrib/gcc/cfg.c b/contrib/gcc/cfg.c
index aa8eaca..ec11f43 100644
--- a/contrib/gcc/cfg.c
+++ b/contrib/gcc/cfg.c
@@ -830,7 +830,7 @@ dump_cfg_bb_info (FILE *file, basic_block bb)
else
fprintf (file, ", ");
first = false;
- fprintf (file, bb_bitnames[i]);
+ fputs (bb_bitnames[i], file);
}
if (!first)
fprintf (file, ")");
diff --git a/contrib/gcc/common.opt b/contrib/gcc/common.opt
index 367e540..2270d0d 100644
--- a/contrib/gcc/common.opt
+++ b/contrib/gcc/common.opt
@@ -189,6 +189,10 @@ Wunused-variable
Common Var(warn_unused_variable)
Warn when a variable is unused
+Wvariable-decl
+Common Var(warn_variable_decl)
+Warn about variable-sized declarations.
+
Wvolatile-register-var
Common Var(warn_register_var)
Warn when a register variable is declared volatile
diff --git a/contrib/gcc/output.h b/contrib/gcc/output.h
index 1d9b837..9b29059 100644
--- a/contrib/gcc/output.h
+++ b/contrib/gcc/output.h
@@ -109,13 +109,14 @@ extern void output_addr_const (FILE *, rtx);
/* Output a string of assembler code, substituting numbers, strings
and fixed syntactic prefixes. */
-#if GCC_VERSION >= 3004
+#if GCC_VERSION >= 3004 && !defined(__clang__)
#define ATTRIBUTE_ASM_FPRINTF(m, n) __attribute__ ((__format__ (__asm_fprintf__, m, n))) ATTRIBUTE_NONNULL(m)
/* This is a magic identifier which allows GCC to figure out the type
of HOST_WIDE_INT for %wd specifier checks. You must issue this
typedef before using the __asm_fprintf__ format attribute. */
typedef HOST_WIDE_INT __gcc_host_wide_int__;
#else
+/* FIXME(benl): what about %wd? */
#define ATTRIBUTE_ASM_FPRINTF(m, n) ATTRIBUTE_NONNULL(m)
#endif
diff --git a/contrib/gcc/rtl.h b/contrib/gcc/rtl.h
index 6c76f9d..d4af682 100644
--- a/contrib/gcc/rtl.h
+++ b/contrib/gcc/rtl.h
@@ -22,6 +22,11 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#ifndef GCC_RTL_H
#define GCC_RTL_H
+#include <sys/param.h>
+#ifndef __PAST_END
+# define __PAST_END(array, offset) (((typeof(*(array)) *)(array))[offset])
+#endif
+
#include "statistics.h"
#include "machmode.h"
#include "input.h"
@@ -565,12 +570,12 @@ extern void rtvec_check_failed_bounds (rtvec, int, const char *, int,
#define RTL_CHECK1(RTX, N, C1) ((RTX)->u.fld[N])
#define RTL_CHECK2(RTX, N, C1, C2) ((RTX)->u.fld[N])
-#define RTL_CHECKC1(RTX, N, C) ((RTX)->u.fld[N])
+#define RTL_CHECKC1(RTX, N, C) __PAST_END((RTX)->u.fld, N)
#define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->u.fld[N])
-#define RTVEC_ELT(RTVEC, I) ((RTVEC)->elem[I])
+#define RTVEC_ELT(RTVEC, I) __PAST_END((RTVEC)->elem, I)
#define XWINT(RTX, N) ((RTX)->u.hwint[N])
#define XCWINT(RTX, N, C) ((RTX)->u.hwint[N])
-#define XCMWINT(RTX, N, C, M) ((RTX)->u.hwint[N])
+#define XCMWINT(RTX, N, C, M) __PAST_END((RTX)->u.hwint, N)
#define XCNMWINT(RTX, N, C, M) ((RTX)->u.hwint[N])
#define XCNMPRV(RTX, C, M) (&(RTX)->u.rv)
#define BLOCK_SYMBOL_CHECK(RTX) (&(RTX)->u.block_sym)
diff --git a/contrib/gcc/tree-nested.c b/contrib/gcc/tree-nested.c
index 06fbbc9..9efcd98 100644
--- a/contrib/gcc/tree-nested.c
+++ b/contrib/gcc/tree-nested.c
@@ -750,7 +750,7 @@ check_for_nested_with_variably_modified (tree fndecl, tree orig_fndecl)
for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
{
for (arg = DECL_ARGUMENTS (cgn->decl); arg; arg = TREE_CHAIN (arg))
- if (variably_modified_type_p (TREE_TYPE (arg), 0), orig_fndecl)
+ if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl))
return true;
if (check_for_nested_with_variably_modified (cgn->decl, orig_fndecl))
@@ -1621,6 +1621,10 @@ convert_tramp_reference (tree *tp, int *walk_subtrees, void *data)
it doesn't need a trampoline. */
if (DECL_NO_STATIC_CHAIN (decl))
break;
+ if (warn_trampolines)
+ {
+ warning(0, "local function address taken needing trampoline generation");
+ }
/* Lookup the immediate parent of the callee, as that's where
we need to insert the trampoline. */
diff --git a/contrib/gcc/tree.h b/contrib/gcc/tree.h
index 7861514..97090be 100644
--- a/contrib/gcc/tree.h
+++ b/contrib/gcc/tree.h
@@ -22,6 +22,11 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#ifndef GCC_TREE_H
#define GCC_TREE_H
+#include <sys/param.h>
+#ifndef __PAST_END
+# define __PAST_END(array, offset) (((typeof(*(array)) *)(array))[offset])
+#endif
+
#include "hashtab.h"
#include "machmode.h"
#include "input.h"
@@ -830,12 +835,12 @@ extern void omp_clause_range_check_failed (const tree, const char *, int,
#define TREE_RANGE_CHECK(T, CODE1, CODE2) (T)
#define EXPR_CHECK(T) (T)
#define NON_TYPE_CHECK(T) (T)
-#define TREE_VEC_ELT_CHECK(T, I) ((T)->vec.a[I])
-#define TREE_OPERAND_CHECK(T, I) ((T)->exp.operands[I])
-#define TREE_OPERAND_CHECK_CODE(T, CODE, I) ((T)->exp.operands[I])
+#define TREE_VEC_ELT_CHECK(T, I) __PAST_END((T)->vec.a, I)
+#define TREE_OPERAND_CHECK(T, I) __PAST_END((T)->exp.operands, I)
+#define TREE_OPERAND_CHECK_CODE(T, CODE, I) __PAST_END((T)->exp.operands, I)
#define TREE_RTL_OPERAND_CHECK(T, CODE, I) (*(rtx *) &((T)->exp.operands[I]))
#define PHI_NODE_ELT_CHECK(T, i) ((T)->phi.a[i])
-#define OMP_CLAUSE_ELT_CHECK(T, i) ((T)->omp_clause.ops[i])
+#define OMP_CLAUSE_ELT_CHECK(T, i) __PAST_END((T)->omp_clause.ops, i)
#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2) (T)
#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE) (T)
diff --git a/contrib/gperf/src/gen-perf.cc b/contrib/gperf/src/gen-perf.cc
index 8840dc6..7cf9f06 100644
--- a/contrib/gperf/src/gen-perf.cc
+++ b/contrib/gperf/src/gen-perf.cc
@@ -246,7 +246,7 @@ Gen_Perf::change (List_Node *prior, List_Node *curr)
{
if (option[DEBUG])
{
- fprintf (stderr, " by changing asso_value['%c'] (char #%zd) to %d\n",
+ fprintf (stderr, " by changing asso_value['%c'] (char #%td) to %d\n",
*p, p - union_set + 1, asso_values[(unsigned char)(*p)]);
fflush (stderr);
}
diff --git a/contrib/gperf/src/key-list.cc b/contrib/gperf/src/key-list.cc
index 2461470..11292bc 100644
--- a/contrib/gperf/src/key-list.cc
+++ b/contrib/gperf/src/key-list.cc
@@ -1441,7 +1441,7 @@ Key_List::output_lookup_array (void)
if (option[DEBUG])
fprintf (stderr,
- "dup_ptr[%zd]: hash_value = %d, index = %d, count = %d\n",
+ "dup_ptr[%td]: hash_value = %d, index = %d, count = %d\n",
dup_ptr - duplicates,
dup_ptr->hash_value, dup_ptr->index, dup_ptr->count);
diff --git a/contrib/libpcap/bpf/net/bpf_filter.c b/contrib/libpcap/bpf/net/bpf_filter.c
index db12bb2..f172384 100644
--- a/contrib/libpcap/bpf/net/bpf_filter.c
+++ b/contrib/libpcap/bpf/net/bpf_filter.c
@@ -405,7 +405,18 @@ bpf_filter(pc, p, wirelen, buflen)
continue;
case BPF_JMP|BPF_JA:
+#if defined(KERNEL) || defined(_KERNEL)
+ /*
+ * No backward jumps allowed.
+ */
pc += pc->k;
+#else
+ /*
+ * XXX - we currently implement "ip6 protochain"
+ * with backward jumps, so sign-extend pc->k.
+ */
+ pc += (bpf_int32)pc->k;
+#endif
continue;
case BPF_JMP|BPF_JGT|BPF_K:
diff --git a/contrib/lukemftp/FreeBSD-patchset b/contrib/lukemftp/FreeBSD-patchset
deleted file mode 100644
index 2f9ff8a..0000000
--- a/contrib/lukemftp/FreeBSD-patchset
+++ /dev/null
@@ -1,64 +0,0 @@
-diff -ru src.orig/cmds.c src/cmds.c
---- src.orig/cmds.c Sun Jun 15 22:11:43 2003
-+++ src/cmds.c Sun Jun 15 21:46:37 2003
-@@ -131,6 +131,7 @@
- #include <string.h>
- #include <time.h>
- #include <unistd.h>
-+#include <libutil.h>
-
- #include "ftp_var.h"
- #include "version.h"
-diff -ru src.orig/fetch.c src/fetch.c
---- src.orig/fetch.c Sun Jun 15 22:11:43 2003
-+++ src/fetch.c Sun Jun 15 21:46:53 2003
-@@ -69,6 +69,7 @@
- #include <string.h>
- #include <unistd.h>
- #include <time.h>
-+#include <libutil.h>
-
- #include "ftp_var.h"
- #include "version.h"
-Only in src: ftp.cat1
-diff -ru src.orig/progressbar.c src/progressbar.c
---- src.orig/progressbar.c Sun Jun 15 22:11:43 2003
-+++ src/progressbar.c Sun Jun 15 21:50:48 2003
-@@ -50,6 +50,7 @@
- */
- #include <sys/types.h>
- #include <sys/param.h>
-+#include <sys/time.h>
-
- #include <err.h>
- #include <errno.h>
-@@ -57,10 +58,12 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
--#include <tzfile.h>
- #include <unistd.h>
-
- #include "progressbar.h"
-+
-+#define SECSPERHOUR (60 * 60)
-+#define SECSPERDAY ((long)60 * 60 * 24)
-
- #if !defined(NO_PROGRESS)
- /*
-diff -ru src.orig/util.c src/util.c
---- src.orig/util.c Sun Jun 15 22:11:44 2003
-+++ src/util.c Sun Jun 15 21:51:31 2003
-@@ -101,10 +101,11 @@
- #include <string.h>
- #include <termios.h>
- #include <time.h>
--#include <tzfile.h>
- #include <unistd.h>
-
- #include "ftp_var.h"
-+
-+#define TM_YEAR_BASE 1900
-
- /*
- * Connect to peer server and auto-login, if possible.
diff --git a/contrib/lukemftp/INSTALL b/contrib/lukemftp/INSTALL
deleted file mode 100644
index 97e82b0..0000000
--- a/contrib/lukemftp/INSTALL
+++ /dev/null
@@ -1,211 +0,0 @@
-INSTALLATION INTRODUCTION
--------------------------
-
-This file describes how to compile and install lukemftp on your
-system.
-
- ============================================
- = =
- = NOTE: You will need an ANSI C compiler. =
- = =
- ============================================
-
-
-For most systems, execute the following to compile and install
-lukemftp:
- ./configure
- make
- make install
-
-A preformatted manual page (src/ftp.cat1) is also installed. If
-you wish to install the source (src/ftp.1), ensure that your system
-has up-to-date mandoc macros. groff ships with this macro suite,
-but it has bugs. Try:
- ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/share/tmac/
-for a more recent version.
-
-
-CONFIGURATION OPTIONS
----------------------
-
-lukemftp is configured using an `autoconf' generated `configure'
-script. `configure' supports the following options:
-
-* The standard `autoconf configure' options, including:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [/usr/local]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [same as prefix]
- --srcdir=DIR find the sources in DIR [configure dir or ..]
- BSD or GNU make may be required for this to work.
-
-* Specific options:
- --enable-editcomplete Turn on command line editing and completion.
- --disable-editcomplete Turn off command line editing and completion
- [default: enabled].
- --enable-ipv6 Enable IPv6 support (if your OS supports it)
- --disable-ipv6 Disable IPv6 support (even if your OS supports it.)
- [default: enabled].
- --with-socks Compile with SOCKS firewall traversal support.
- --with-socks5[=PATH] Compile with SOCKS5 firewall traversal support.
- --with-socks4[=PATH] Compile with SOCKS4 firewall traversal support.
-
-The following environment variables can be set to override various
-compiler related settings.
- CC=compiler specify name of the C compiler (default: gcc or cc)
- CFLAGS=flags specify flags to C compiler (default: -O -g or just -O)
- LDFLAGS=flags specify flags to linker (default: none)
-
-This can be achieved with:
- env CC="compiler" CFLAGS="flags" LDFLAGS="flags" ./configure
-
-
- ============================================
- = =
- = NOTE: You will need an ANSI C compiler. =
- = =
- ============================================
-
-
-PLATFORM SPECIFIC NOTES
------------------------
-
-The following platforms & compilers have been tested:
-
-- AIX 4.1.5:
-- AIX 4.2.1:
-- AIX 4.3.3:
- - Compiler: xlc -qlanglvl=ansi
- version: xlC 3.1.4.10 -- C for AIX Compiler
- version: ibmcxx.cmp 3.6.6.6 -- IBM C and C++ Compilers
-
- Configure with:
- env CC="xlc" CFLAGS="-qlanglvl=ansi" ./configure
-
-- BSD/OS 4.0.1 (x86)
-- BSD/OS 4.1 (x86)
-- BSD/OS 4.1 (sparc)
-- BSD/OS 4.2 (x86)
- - Compiler: /bin/cc
- version: gcc 2.7.2.1
- version: gcc version 2.95.2 19991024
-
-- Digital UNIX 4.0b
-- Digital UNIX 4.0d
-- Digital UNIX 4.0f
- - Compiler: cc -std
- version: DEC C V5.2-036 on Digital UNIX V4.0 (Rev. 564)
- version: DEC C V5.9-005 on Digital UNIX V4.0 (Rev. 1229)
-
- Configure with
- env CC="cc -std" ./configure
-
- - Compiler: gcc
- version: 2.95.1
-
-- Digital UNIX 5.0
- - Compiler: cc
- version: Compaq C V6.1-011 on Digital UNIX V5.0 (Rev. 910)
-
-- FreeBSD 3.4 (i386):
-- FreeBSD 3.5 (i386):
-- FreeBSD 4.1 (i386):
- - Compiler: cc
- version: gcc version 2.7.2.3
- version: gcc version 2.95.2 19991024
-
-- HP/UX 10.20:
-- HP/UX 11.00:
- - Compiler: /opt/ansic/bin/cc -Ae
- version: A.10.32.03
-
- Configure with
- env CC="cc -Ae" ./configure
-
- To generate code that will run on old architectures you
- may need to add "+DAportable" to CC.
-
-
-- IRIX 6.5.4
-- IRIX 6.5.8
- Compiler: /bin/cc
- version: MIPSpro Compilers: Version 7.2.1
- Compiler:
- version: gcc version 2.95.2
-
-- HP/UX 11.00:
-- HP/UX 11.00 64 bit:
- - Compiler: /opt/ansic/bin/cc -Ae
- version: A.11.01.00
-
- Configure with
- env CC="cc -Ae" ./configure
-
-- NetBSD 1.3.3 (i386)
- Compiler: /usr/bin/cc
- Compiler: /usr/bin/cc
-
- Ignore warnings about ``passing arg 3 of `tputs' from
- incompatible pointer type''.
-
-- RedHat Linux 5.1 (?? i386)
-- RedHat Linux 5.2 (?? i386)
-- RedHat Linux 6.0 (Linux 2.2.10 i686)
-- RedHat Linux 6.1 (Linux 2.2.5-15 i686)
-- RedHat Linux 6.2 (Linux 2.2.16-3smp i686)
- - Compiler: cc
- version: egcs-1.1.2
-
-- Slackware (Linux 2.0.35 i686)
- - Compiler: cc
- version: 2.7.2.3
-
-- Solaris 2.6 (sparc)
-- Solaris 7 (sparc)
- - Compiler: /opt/SUNWspro/bin/cc
- version: WorkShop Compilers 5.0
-
- - Compiler: gcc
- version: egcs-1.1.2
-
-=============
-= OLD NOTES =
-=============
-
-XXX: clean up to match reality
-------------------------------
-
-- RedHat Linux 5.0 (i386)
- Compiler: cc
-
-- Solaris 2.5 (sparc)
-- Solaris 7 (x86)
- Compiler: /opt/SUNWspro/bin/cc
- version: SC3.0 15 Dec 1993
- version: WorkShop Compilers 5.0
- Compiler: gcc
- version: egcs-1.1.2
- version: gcc 2.8.1
- version: gcc 2.95.1
-
-- Solaris 7 (sparc) 64 bit
- Compiler: /opt/SUNWspro/bin/cc -xarch=v9
- version: WorkShop Compilers 5.0
-
-- SunOS 4
- Compiler: gcc -lresolv
- version:
-
-- SuSE Linux
- Compiler: gcc
- version:
-
- /usr/bin/ftp on SuSE Linux 6.4 is this ftp client.
-
- May need `gcc -L/usr/lib/termcap' if tgetent() et al aren't found.
-
-- Ultrix 4.5
- Compiler: cc
- version: MIPS C Compiler 3.0
- Compiler: gcc
- version: 2.7.2.2
diff --git a/contrib/lukemftp/Makefile.in b/contrib/lukemftp/Makefile.in
deleted file mode 100644
index 3e4f298..0000000
--- a/contrib/lukemftp/Makefile.in
+++ /dev/null
@@ -1,33 +0,0 @@
-# $Id: Makefile.in,v 1.6 1999/11/13 01:18:22 lukem Exp $
-#
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-SHELL = /bin/sh
-
-@SET_MAKE@
-
-
-SUBDIRS = libedit libukem src
-
-all: ftp
-
-ftp: @LIBEDIT@ @LIBUKEM@
- ( cd src; ${MAKE} )
-
-libedit.a:
- ( cd libedit; ${MAKE} )
-
-libukem.a:
- ( cd libukem; ${MAKE} )
-
-install clean:
- @for i in ${SUBDIRS}; do \
- ( echo "$@ ===> $$i" ; cd $$i ; ${MAKE} $@ ); \
- done
-
-distclean: clean
- @for i in ${SUBDIRS}; do \
- ( echo "$@ ===> $$i" ; cd $$i ; ${MAKE} $@ ); \
- done
- rm -f Makefile config.cache config.log config.status config.h
diff --git a/contrib/lukemftp/NEWS b/contrib/lukemftp/NEWS
deleted file mode 100644
index 614dec0..0000000
--- a/contrib/lukemftp/NEWS
+++ /dev/null
@@ -1,84 +0,0 @@
-This is a brief description of the new features and fixes added to
-lukemftp-1.5 since the release of lukemftp-1.4. As always, the manual
-page (src/ftp.cat1) is the place to look for complete descriptions.
-
-* Add new commands:
- features list remote features supported by servers
- mlsd machine parseable directory listing
- mlst machine parseable file listing
- remopts set options on remote features
-
- These require support in the remote server for the ftp extensions
- described in RFC 2389 and draft-ietf-ftpext-mlst-11.
-
-* Fix support for the --program-prefix and --program-suffix configure
- options.
-
----
-This is a brief description of the new features and fixes added to
-lukemftp-1.4 since the release of lukemftp-1.3. As always, the manual
-page (src/ftp.cat1) is the place to look for complete descriptions.
-
-* Fix compilation problems on various non 4.4BSD derived platforms which
- support IPv6, and on Linux systems which have strdup() as a macro.
-
-* During auto-fetch, don't attempt to autologin a second time if the first
- time failed.
-
----
-This is a brief description of the new features and fixes added to
-lukemftp-1.3 since the release of lukemftp-1.2. As always, the manual
-page (src/ftp.cat1) is the place to look for complete descriptions.
-
-* The `ls' command now uses the `LIST' directive instead of `NLST',
- in order to be compatible with RFC959.
-
-* Add fget command, which reads a list of filenames to retrieve from
- the given file.
-
-* Add support for uploading files on the command-line with `ftp -u'.
-
-* Various fixes to the IPv6 support.
-
----
-This is a brief description of the new features and fixes added to
-lukemftp-1.2 since the release of lukemftp-1.1. As always, the manual
-page (src/ftp.cat1) is the place to look for complete descriptions.
-
-* During remote completion, only send ``NLST'' instead of ``NLST .''
- when reading the list of files from the remote server; some servers
- don't like the trailing `.'.
-
-* Support a leading ``[user@]'' for ``[user@]host[:][path]'' auto-fetches
- and ``[user@]host'' connections.
-
-* Always compile in support for setting the type of service on transfers.
- Should speed up transfers on Linux systems.
-
-* Improve performance of non-rate-limited transfers.
-
-* Work around ftp servers that aren't Y2K compliant in returning the
- modification time of a file.
-
-* Update the libedit library to support automatic and magic margins,
- allowing ftp's rprompt to move an extra character to the right.
-
----
-This is a brief description of the new features and fixes added to
-lukemftp-1.1 since the release of lukemftp-1.0. As always, the manual
-page (src/ftp.cat1) is the place to look for complete descriptions.
-
-* Implemented `set prompt' and `set rprompt', which allow you to
- configure the prompt and right side prompt (respectively).
- Some tcsh(1) style `%' escapes are supported, including
- %. %c %/ %m %M %n
-
-* Implemented restarting of file:/// and non-proxied http:// URLs
- (using -R)
-
-* Correctly parse remote ports given as numbers that don't appear in
- the services(5) database.
-
-* Prevent a couple of minor memory leaks
-
-* Add missing compilation setting for SOCKS
diff --git a/contrib/lukemftp/README b/contrib/lukemftp/README
deleted file mode 100644
index 4b3a12c..0000000
--- a/contrib/lukemftp/README
+++ /dev/null
@@ -1,61 +0,0 @@
-WHAT IS LUKEMFTP?
------------------
-
-`lukemftp' is what many users affectionately call the enhanced ftp
-client in NetBSD (http://www.netbsd.org). The `lukem' comes from
-the account name of the NetBSD developer who wrote most of the
-enhancements: Luke Mewburn <lukem@netbsd.org>.
-
-This package is a `port' of the NetBSD ftp client to other systems.
-
-The enhancements over the standard ftp client in 4.4BSD (and
-derivatives) include:
- * command-line editing within ftp
- * command-line fetching of URLS, including support for:
- - http proxies (c.f: $http_proxy, $ftp_proxy)
- - authentication
- * configurable prompt
- * context sensitive command and filename completion
- * dynamic progress bar
- * feature negotiation extensions from RFC 2389
- (c.f: `feat' and `remopts')
- * extensions to ftp from the IETF ftpext working group
- (c.f: `mlsd' and `mlst')
- * IPv6 support (from the WIDE project)
- * modification time preservation
- * paging of local and remote files, and of directory listings
- (c.f: `lpage', `page', `pdir')
- * passive mode support, with fallback to active mode
- * retrieval of filenames listed in a given file (c.f: `fget')
- * `set option' override of ftp environment variables
- * socks4/socks5 support
- * TIS Firewall Toolkit gate ftp proxy support (c.f: `gate')
- * transfer-rate throttling (c.f: `-T', `rate')
- * uploading of files on the command line (c.f: `-u')
-
-
-INSTALLATION
-------------
-
-Refer to `INSTALL' for more information on how to compile and install
-lukemftp.
-
-
-FEEDBACK / BUG REPORTS
-----------------------
-
-Please email feedback back to the maintainer: <lukem@netbsd.org>.
-
-
-COPYRIGHT
----------
-
-lukemftp is covered by a BSD-style copyright notice. Please refer to
-the file `COPYING' for more information.
-
-
-AVAILABILITY
-------------
-
-The primary ftp site for lukemftp is:
- ftp://ftp.netbsd.org/pub/NetBSD/misc/lukemftp/
diff --git a/contrib/lukemftp/THANKS b/contrib/lukemftp/THANKS
deleted file mode 100644
index bff4e25..0000000
--- a/contrib/lukemftp/THANKS
+++ /dev/null
@@ -1,30 +0,0 @@
-Whilst a lot of the work in lukemftp (both the original sources in NetBSD
-and this port) was done by me (Luke Mewburn), it would not be as useable
-without the enhancements, fixes, or input from the following people:
-
-Brian Stark <bstark1990@netscape.net>
-Chris G. Demetriou <cgd@netbsd.org>
-Christos Zoulas <christos@netbsd.org>
-Dan Winship <danw@mit.edu>
-Darren Reed <darrenr@pobox.com>
-David Carrel <carrel@netbsd.org>
-Giles Lean <giles@nemeton.com.au>
-Havard Eidnes <Havard.Eidnes@runit.sintef.no>
-ITOH Yasufumi <itohy@netbsd.org>
-Jason R. Thorpe <thorpej@netbsd.org>
-John Hawkinson <jhawk@mit.edu>
-Joseph S. Myers <jsm28@cam.ac.uk>
-Jun-ichiro itojun Hagino <itojun@netbsd.org>
-Kimmo Suominen <kim@tac.nyc.ny.us>
-Klaus Klein <kleink@netbsd.org>
-Luke Mewburn <lukem@netbsd.org>
-Marc Horowitz <marc@mit.edu>
-Matthew R. Green <mrg@eterna.com.au>
-Matthias Pfaller <leo@dachau.marco.de>
-Matthias Scheler <tron@zhadum.de>
-Michael L. Hitch <osymh@terra.oscs.montana.edu>
-Scott Aaron Bamford <sab@ansic.net>
-Simon Burge <simonb@thistledown.com.au>
-Todd C. Miller <Todd.Miller@courtesan.com>
-
-Apologies to anyone I've missed.
diff --git a/contrib/lukemftp/acconfig.h b/contrib/lukemftp/acconfig.h
deleted file mode 100644
index fb3cbfa..0000000
--- a/contrib/lukemftp/acconfig.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* $Id: acconfig.h,v 1.9 2002/06/10 01:27:13 lukem Exp $ */
-
-@TOP@
-@BOTTOM@
-
-/* Define if your compiler supports `long long' */
-#undef HAVE_LONG_LONG
-
-/* Define if *printf() uses %qd to print `long long' (otherwise uses %lld) */
-#undef HAVE_PRINTF_QD
-
-/* Define if in_port_t exists */
-#undef HAVE_IN_PORT_T
-
-/* Define if sa_family_t exists in <sys/socket.h> */
-#undef HAVE_SA_FAMILY_T
-
-/* Define if struct sockaddr.sa_len exists (implies sockaddr_in.sin_len, etc) */
-#undef HAVE_SOCKADDR_SA_LEN
-
-/* Define if socklen_t exists */
-#undef HAVE_SOCKLEN_T
-
-/* Define if AF_INET6 exists in <sys/socket.h> */
-#undef HAVE_AF_INET6
-
-/* Define if `struct sockaddr_in6' exists in <netinet/in.h> */
-#undef HAVE_SOCKADDR_IN6
-
-/* Define if `struct addrinfo' exists in <netdb.h> */
-#undef HAVE_ADDRINFO
-
-/*
- * Define if <netdb.h> contains AI_NUMERICHOST et al.
- * Systems which only implement RFC2133 will need this.
- */
-#undef HAVE_RFC2553_NETDB
-
-/* Define if `struct direct' has a d_namlen element */
-#undef HAVE_D_NAMLEN
-
-/* Define if h_errno exists in <netdb.h> */
-#undef HAVE_H_ERRNO_D
-
-/* Define if fclose() is declared in <stdio.h> */
-#undef HAVE_FCLOSE_D
-
-/* Define if getpass() is declared in <stdlib.h> or <unistd.h> */
-#undef HAVE_GETPASS_D
-
-/* Define if optarg is declared in <stdlib.h> or <unistd.h> */
-#undef HAVE_OPTARG_D
-
-/* Define if optind is declared in <stdlib.h> or <unistd.h> */
-#undef HAVE_OPTIND_D
-
-/* Define if pclose() is declared in <stdio.h> */
-#undef HAVE_PCLOSE_D
-
-/* Define if `long long' is supported and sizeof(off_t) >= 8 */
-#undef HAVE_QUAD_SUPPORT
-
-/* Define if strptime() is declared in <time.h> */
-#undef HAVE_STRPTIME_D
-
-/*
- * Define this if compiling with SOCKS (the firewall traversal library).
- * Also, you must define connect, getsockname, bind, accept, listen, and
- * select to their R-versions.
- */
-#undef SOCKS
-#undef SOCKS4
-#undef SOCKS5
-#undef connect
-#undef getsockname
-#undef bind
-#undef accept
-#undef listen
-#undef select
-#undef dup
-#undef dup2
-#undef fclose
-#undef gethostbyname
-#undef getpeername
-#undef read
-#undef recv
-#undef recvfrom
-#undef rresvport
-#undef send
-#undef sendto
-#undef shutdown
-#undef write
diff --git a/contrib/lukemftp/aclocal.m4 b/contrib/lukemftp/aclocal.m4
deleted file mode 100644
index 3e27508..0000000
--- a/contrib/lukemftp/aclocal.m4
+++ /dev/null
@@ -1,257 +0,0 @@
-dnl $Id: aclocal.m4,v 1.5 1999/11/13 10:50:39 lukem Exp $
-dnl
-
-dnl
-dnl AC_MSG_TRY_COMPILE
-dnl
-dnl Written by Luke Mewburn <lukem@netbsd.org>
-dnl
-dnl Usage:
-dnl AC_MSG_TRY_COMPILE(Message, CacheVar, Includes, Code,
-dnl ActionPass [,ActionFail] )
-dnl
-dnl effectively does:
-dnl AC_CACHE_CHECK(Message, CacheVar,
-dnl AC_TRY_COMPILE(Includes, Code, CacheVar = yes, CacheVar = no)
-dnl if CacheVar == yes
-dnl AC_MESSAGE_RESULT(yes)
-dnl ActionPass
-dnl else
-dnl AC_MESSAGE_RESULT(no)
-dnl ActionFail
-dnl )
-dnl
-AC_DEFUN(AC_MSG_TRY_COMPILE, [
- AC_CACHE_CHECK($1, $2, [
- AC_TRY_COMPILE([ $3 ], [ $4; ], [ $2=yes ], [ $2=no ])
- ])
- if test "x[$]$2" = "xyes"; then
- $5
- else
- $6
- :
- fi
-])
-
-dnl
-dnl AC_MSG_TRY_LINK
-dnl
-dnl Usage:
-dnl AC_MSG_TRY_LINK(Message, CacheVar, Includes, Code,
-dnl ActionPass [,ActionFail] )
-dnl
-dnl as AC_MSG_TRY_COMPILE, but uses AC_TRY_LINK instead of AC_TRY_COMPILE
-dnl
-AC_DEFUN(AC_MSG_TRY_LINK, [
- AC_CACHE_CHECK($1, $2, [
- AC_TRY_LINK([ $3 ], [ $4; ], [ $2=yes ], [ $2=no ])
- ])
- if test "x[$]$2" = "xyes"; then
- $5
- else
- $6
- :
- fi
-])
-
-
-dnl
-dnl AC_LIBRARY_NET: #Id: net.m4,v 1.5 1997/11/09 21:36:54 jhawk Exp #
-dnl
-dnl Written by John Hawkinson <jhawk@mit.edu>. This code is in the Public
-dnl Domain.
-dnl
-dnl This test is for network applications that need socket() and
-dnl gethostbyname() -ish functions. Under Solaris, those applications need to
-dnl link with "-lsocket -lnsl". Under IRIX, they should *not* link with
-dnl "-lsocket" because libsocket.a breaks a number of things (for instance:
-dnl gethostbyname() under IRIX 5.2, and snoop sockets under most versions of
-dnl IRIX).
-dnl
-dnl Unfortunately, many application developers are not aware of this, and
-dnl mistakenly write tests that cause -lsocket to be used under IRIX. It is
-dnl also easy to write tests that cause -lnsl to be used under operating
-dnl systems where neither are necessary (or useful), such as SunOS 4.1.4, which
-dnl uses -lnsl for TLI.
-dnl
-dnl This test exists so that every application developer does not test this in
-dnl a different, and subtly broken fashion.
-dnl
-dnl It has been argued that this test should be broken up into two seperate
-dnl tests, one for the resolver libraries, and one for the libraries necessary
-dnl for using Sockets API. Unfortunately, the two are carefully intertwined and
-dnl allowing the autoconf user to use them independantly potentially results in
-dnl unfortunate ordering dependancies -- as such, such component macros would
-dnl have to carefully use indirection and be aware if the other components were
-dnl executed. Since other autoconf macros do not go to this trouble, and almost
-dnl no applications use sockets without the resolver, this complexity has not
-dnl been implemented.
-dnl
-dnl The check for libresolv is in case you are attempting to link statically
-dnl and happen to have a libresolv.a lying around (and no libnsl.a).
-dnl
-AC_DEFUN(AC_LIBRARY_NET, [
- # Most operating systems have gethostbyname() in the default searched
- # libraries (i.e. libc):
- AC_CHECK_FUNC(gethostbyname, ,
- # Some OSes (eg. Solaris) place it in libnsl:
- AC_CHECK_LIB(nsl, gethostbyname, ,
- # Some strange OSes (SINIX) have it in libsocket:
- AC_CHECK_LIB(socket, gethostbyname, ,
- # Unfortunately libsocket sometimes depends on libnsl.
- # AC_CHECK_LIB's API is essentially broken so the following
- # ugliness is necessary:
- AC_CHECK_LIB(socket, gethostbyname,
- LIBS="-lsocket -lnsl $LIBS",
- AC_CHECK_LIB(resolv, gethostbyname),
- -lnsl)
- )
- )
- )
- AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket, ,
- AC_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", , -lnsl)))
- ])
-
-
-dnl Checks for SOCKS firewall support.
-dnl
-dnl Written by Matthew R. Green <mrg@eterna.com.au>
-dnl
-AC_DEFUN(AC_LIBRARY_SOCKS, [
- AC_MSG_CHECKING(whether to support SOCKS)
- AC_ARG_WITH(socks,
- [ --with-socks Compile with SOCKS firewall traversal support.],
- [
- case "$withval" in
- no)
- AC_MSG_RESULT(no)
- ;;
- yes)
- AC_MSG_RESULT(yes)
- AC_CHECK_LIB(socks5, SOCKSconnect, [
- socks=5
- LIBS="-lsocks5 $LIBS"], [
- AC_CHECK_LIB(socks, Rconnect, [
- socks=4
- LIBS="-lsocks $LIBS"], [
- AC_MSG_ERROR(Could not find socks library. You must first install socks.) ] ) ] )
- ;;
- esac
- ],
- AC_MSG_RESULT(no)
- )
-
- if test "x$socks" = "x"; then
- AC_MSG_CHECKING(whether to support SOCKS5)
- AC_ARG_WITH(socks5,
- [ --with-socks5[=PATH] Compile with SOCKS5 firewall traversal support.],
- [
- case "$withval" in
- no)
- AC_MSG_RESULT(no)
- ;;
- *)
- AC_MSG_RESULT(yes)
- socks=5
- if test "x$withval" = "xyes"; then
- withval="-lsocks5"
- else
- if test -d "$withval"; then
- if test -d "$withval/include"; then
- CFLAGS="$CFLAGS -I$withval/include"
- else
- CFLAGS="$CFLAGS -I$withval"
- fi
- if test -d "$withval/lib"; then
- withval="-L$withval/lib -lsocks5"
- else
- withval="-L$withval -lsocks5"
- fi
- fi
- fi
- LIBS="$withval $LIBS"
- # If Socks was compiled with Kerberos support, we will need
- # to link against kerberos libraries. Temporarily append
- # to LIBS. This is harmless if there is no kerberos support.
- TMPLIBS="$LIBS"
- LIBS="$LIBS $KERBEROS_LIBS"
- AC_TRY_LINK([],
- [ SOCKSconnect(); ],
- [],
- [ AC_MSG_ERROR(Could not find the $withval library. You must first install socks5.) ])
- LIBS="$TMPLIBS"
- ;;
- esac
- ],
- AC_MSG_RESULT(no)
- )
- fi
-
- if test "x$socks" = "x"; then
- AC_MSG_CHECKING(whether to support SOCKS4)
- AC_ARG_WITH(socks4,
- [ --with-socks4[=PATH] Compile with SOCKS4 firewall traversal support.],
- [
- case "$withval" in
- no)
- AC_MSG_RESULT(no)
- ;;
- *)
- AC_MSG_RESULT(yes)
- socks=4
- if test "x$withval" = "xyes"; then
- withval="-lsocks"
- else
- if test -d "$withval"; then
- withval="-L$withval -lsocks"
- fi
- fi
- LIBS="$withval $LIBS"
- AC_TRY_LINK([],
- [ Rconnect(); ],
- [],
- [ AC_MSG_ERROR(Could not find the $withval library. You must first install socks.) ])
- ;;
- esac
- ],
- AC_MSG_RESULT(no)
- )
- fi
-
- if test "x$socks" = "x4"; then
- AC_DEFINE(SOCKS)
- AC_DEFINE(SOCKS4)
- AC_DEFINE(connect, Rconnect)
- AC_DEFINE(getsockname, Rgetsockname)
- AC_DEFINE(bind, Rbind)
- AC_DEFINE(accept, Raccept)
- AC_DEFINE(listen, Rlisten)
- AC_DEFINE(select, Rselect)
- fi
-
- if test "x$socks" = "x5"; then
- AC_DEFINE(SOCKS)
- AC_DEFINE(SOCKS5)
- AC_DEFINE(connect,SOCKSconnect)
- AC_DEFINE(getsockname,SOCKSgetsockname)
- AC_DEFINE(getpeername,SOCKSgetpeername)
- AC_DEFINE(bind,SOCKSbind)
- AC_DEFINE(accept,SOCKSaccept)
- AC_DEFINE(listen,SOCKSlisten)
- AC_DEFINE(select,SOCKSselect)
- AC_DEFINE(recvfrom,SOCKSrecvfrom)
- AC_DEFINE(sendto,SOCKSsendto)
- AC_DEFINE(recv,SOCKSrecv)
- AC_DEFINE(send,SOCKSsend)
- AC_DEFINE(read,SOCKSread)
- AC_DEFINE(write,SOCKSwrite)
- AC_DEFINE(rresvport,SOCKSrresvport)
- AC_DEFINE(shutdown,SOCKSshutdown)
- AC_DEFINE(listen,SOCKSlisten)
- AC_DEFINE(close,SOCKSclose)
- AC_DEFINE(dup,SOCKSdup)
- AC_DEFINE(dup2,SOCKSdup2)
- AC_DEFINE(fclose,SOCKSfclose)
- AC_DEFINE(gethostbyname,SOCKSgethostbyname)
- fi
-])
diff --git a/contrib/lukemftp/config.h.in b/contrib/lukemftp/config.h.in
deleted file mode 100644
index d754334..0000000
--- a/contrib/lukemftp/config.h.in
+++ /dev/null
@@ -1,275 +0,0 @@
-/* config.h.in. Generated automatically from configure.in by autoheader. */
-/* $Id: config.h.in,v 1.28 2002/06/10 08:10:33 lukem Exp $ */
-
-
-/* Define if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-#undef _ALL_SOURCE
-#endif
-
-/* Define if the closedir function returns void instead of int. */
-#undef CLOSEDIR_VOID
-
-/* Define if the `getpgrp' function takes no argument. */
-#undef GETPGRP_VOID
-
-/* Define if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
-/* Define if your Fortran 77 compiler doesn't accept -c and -o together. */
-#undef F77_NO_MINUS_C_MINUS_O
-
-/* Define to `long' if <sys/types.h> doesn't define. */
-#undef off_t
-
-/* Define to the type of arg1 for select(). */
-#undef SELECT_TYPE_ARG1
-
-/* Define to the type of args 2, 3 and 4 for select(). */
-#undef SELECT_TYPE_ARG234
-
-/* Define to the type of arg5 for select(). */
-#undef SELECT_TYPE_ARG5
-
-/* Define if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define if the closedir function returns void instead of int. */
-#undef VOID_CLOSEDIR
-
-/* The number of bytes in a off_t. */
-#undef SIZEOF_OFF_T
-
-/* Define if you have the err function. */
-#undef HAVE_ERR
-
-/* Define if you have the fgetln function. */
-#undef HAVE_FGETLN
-
-/* Define if you have the fparseln function. */
-#undef HAVE_FPARSELN
-
-/* Define if you have the fseeko function. */
-#undef HAVE_FSEEKO
-
-/* Define if you have the getaddrinfo function. */
-#undef HAVE_GETADDRINFO
-
-/* Define if you have the gethostbyname2 function. */
-#undef HAVE_GETHOSTBYNAME2
-
-/* Define if you have the getnameinfo function. */
-#undef HAVE_GETNAMEINFO
-
-/* Define if you have the getpassphrase function. */
-#undef HAVE_GETPASSPHRASE
-
-/* Define if you have the getpgrp function. */
-#undef HAVE_GETPGRP
-
-/* Define if you have the inet_ntop function. */
-#undef HAVE_INET_NTOP
-
-/* Define if you have the inet_pton function. */
-#undef HAVE_INET_PTON
-
-/* Define if you have the memmove function. */
-#undef HAVE_MEMMOVE
-
-/* Define if you have the mkstemp function. */
-#undef HAVE_MKSTEMP
-
-/* Define if you have the poll function. */
-#undef HAVE_POLL
-
-/* Define if you have the select function. */
-#undef HAVE_SELECT
-
-/* Define if you have the setprogname function. */
-#undef HAVE_SETPROGNAME
-
-/* Define if you have the sl_init function. */
-#undef HAVE_SL_INIT
-
-/* Define if you have the snprintf function. */
-#undef HAVE_SNPRINTF
-
-/* Define if you have the strdup function. */
-#undef HAVE_STRDUP
-
-/* Define if you have the strerror function. */
-#undef HAVE_STRERROR
-
-/* Define if you have the strlcat function. */
-#undef HAVE_STRLCAT
-
-/* Define if you have the strlcpy function. */
-#undef HAVE_STRLCPY
-
-/* Define if you have the strptime function. */
-#undef HAVE_STRPTIME
-
-/* Define if you have the strsep function. */
-#undef HAVE_STRSEP
-
-/* Define if you have the strtoll function. */
-#undef HAVE_STRTOLL
-
-/* Define if you have the strunvis function. */
-#undef HAVE_STRUNVIS
-
-/* Define if you have the strvis function. */
-#undef HAVE_STRVIS
-
-/* Define if you have the timegm function. */
-#undef HAVE_TIMEGM
-
-/* Define if you have the usleep function. */
-#undef HAVE_USLEEP
-
-/* Define if you have the <arpa/nameser.h> header file. */
-#undef HAVE_ARPA_NAMESER_H
-
-/* Define if you have the <dirent.h> header file. */
-#undef HAVE_DIRENT_H
-
-/* Define if you have the <err.h> header file. */
-#undef HAVE_ERR_H
-
-/* Define if you have the <libutil.h> header file. */
-#undef HAVE_LIBUTIL_H
-
-/* Define if you have the <ndir.h> header file. */
-#undef HAVE_NDIR_H
-
-/* Define if you have the <paths.h> header file. */
-#undef HAVE_PATHS_H
-
-/* Define if you have the <poll.h> header file. */
-#undef HAVE_POLL_H
-
-/* Define if you have the <regex.h> header file. */
-#undef HAVE_REGEX_H
-
-/* Define if you have the <sys/dir.h> header file. */
-#undef HAVE_SYS_DIR_H
-
-/* Define if you have the <sys/ndir.h> header file. */
-#undef HAVE_SYS_NDIR_H
-
-/* Define if you have the <sys/poll.h> header file. */
-#undef HAVE_SYS_POLL_H
-
-/* Define if you have the <termcap.h> header file. */
-#undef HAVE_TERMCAP_H
-
-/* Define if you have the <util.h> header file. */
-#undef HAVE_UTIL_H
-
-/* Define if you have the <vis.h> header file. */
-#undef HAVE_VIS_H
-
-/* Define if you have the nsl library (-lnsl). */
-#undef HAVE_LIBNSL
-
-/* Define if you have the socket library (-lsocket). */
-#undef HAVE_LIBSOCKET
-
-/* Define if you have the tinfo library (-ltinfo). */
-#undef HAVE_LIBTINFO
-
-/* Define if you have the util library (-lutil). */
-#undef HAVE_LIBUTIL
-
-/* Define if your compiler supports `long long' */
-#undef HAVE_LONG_LONG
-
-/* Define if *printf() uses %qd to print `long long' (otherwise uses %lld) */
-#undef HAVE_PRINTF_QD
-
-/* Define if in_port_t exists */
-#undef HAVE_IN_PORT_T
-
-/* Define if sa_family_t exists in <sys/socket.h> */
-#undef HAVE_SA_FAMILY_T
-
-/* Define if struct sockaddr.sa_len exists (implies sockaddr_in.sin_len, etc) */
-#undef HAVE_SOCKADDR_SA_LEN
-
-/* Define if socklen_t exists */
-#undef HAVE_SOCKLEN_T
-
-/* Define if AF_INET6 exists in <sys/socket.h> */
-#undef HAVE_AF_INET6
-
-/* Define if `struct sockaddr_in6' exists in <netinet/in.h> */
-#undef HAVE_SOCKADDR_IN6
-
-/* Define if `struct addrinfo' exists in <netdb.h> */
-#undef HAVE_ADDRINFO
-
-/*
- * Define if <netdb.h> contains AI_NUMERICHOST et al.
- * Systems which only implement RFC2133 will need this.
- */
-#undef HAVE_RFC2553_NETDB
-
-/* Define if `struct direct' has a d_namlen element */
-#undef HAVE_D_NAMLEN
-
-/* Define if h_errno exists in <netdb.h> */
-#undef HAVE_H_ERRNO_D
-
-/* Define if fclose() is declared in <stdio.h> */
-#undef HAVE_FCLOSE_D
-
-/* Define if getpass() is declared in <stdlib.h> or <unistd.h> */
-#undef HAVE_GETPASS_D
-
-/* Define if optarg is declared in <stdlib.h> or <unistd.h> */
-#undef HAVE_OPTARG_D
-
-/* Define if optind is declared in <stdlib.h> or <unistd.h> */
-#undef HAVE_OPTIND_D
-
-/* Define if pclose() is declared in <stdio.h> */
-#undef HAVE_PCLOSE_D
-
-/* Define if `long long' is supported and sizeof(off_t) >= 8 */
-#undef HAVE_QUAD_SUPPORT
-
-/* Define if strptime() is declared in <time.h> */
-#undef HAVE_STRPTIME_D
-
-/*
- * Define this if compiling with SOCKS (the firewall traversal library).
- * Also, you must define connect, getsockname, bind, accept, listen, and
- * select to their R-versions.
- */
-#undef SOCKS
-#undef SOCKS4
-#undef SOCKS5
-#undef connect
-#undef getsockname
-#undef bind
-#undef accept
-#undef listen
-#undef select
-#undef dup
-#undef dup2
-#undef fclose
-#undef gethostbyname
-#undef getpeername
-#undef read
-#undef recv
-#undef recvfrom
-#undef rresvport
-#undef send
-#undef sendto
-#undef shutdown
-#undef write
diff --git a/contrib/lukemftp/configure b/contrib/lukemftp/configure
deleted file mode 100755
index f759085..0000000
--- a/contrib/lukemftp/configure
+++ /dev/null
@@ -1,4229 +0,0 @@
-#! /bin/sh
-
-# From configure.in Revision: 1.37
-
-
-
-
-
-
-
-
-
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
-\
- --enable-editcomplete Turn on command line editing and completion.
- --disable-editcomplete Turn off command line editing and completion
- [default: enabled]."
-ac_help="$ac_help
-\
- --enable-ipv6 Enable IPv6 support (if your OS supports it).
- --disable-ipv6 Disable IPv6 support (even if your OS supports it)
- [default: enabled]."
-ac_help="$ac_help
- --with-socks Compile with SOCKS firewall traversal support."
-ac_help="$ac_help
- --with-socks5[=PATH] Compile with SOCKS5 firewall traversal support."
-ac_help="$ac_help
- --with-socks4[=PATH] Compile with SOCKS4 firewall traversal support."
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval "$ac_prev=\$ac_option"
- ac_prev=
- continue
- fi
-
- case "$ac_option" in
- -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) ac_optarg= ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case "$ac_option" in
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir="$ac_optarg" ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build="$ac_optarg" ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file="$ac_optarg" ;;
-
- -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
- | --da=*)
- datadir="$ac_optarg" ;;
-
- -disable-* | --disable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- eval "enable_${ac_feature}=no" ;;
-
- -enable-* | --enable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
- *) ac_optarg=yes ;;
- esac
- eval "enable_${ac_feature}='$ac_optarg'" ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix="$ac_optarg" ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he)
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
- --cache-file=FILE cache test results in FILE
- --help print this message
- --no-create do not create output files
- --quiet, --silent do not print \`checking...' messages
- --version print the version of autoconf that created configure
-Directory and file names:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [same as prefix]
- --bindir=DIR user executables in DIR [EPREFIX/bin]
- --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
- --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
- --datadir=DIR read-only architecture-independent data in DIR
- [PREFIX/share]
- --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data in DIR
- [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
- --libdir=DIR object code libraries in DIR [EPREFIX/lib]
- --includedir=DIR C header files in DIR [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
- --infodir=DIR info documentation in DIR [PREFIX/info]
- --mandir=DIR man documentation in DIR [PREFIX/man]
- --srcdir=DIR find the sources in DIR [configure dir or ..]
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM
- run sed PROGRAM on installed program names
-EOF
- cat << EOF
-Host type:
- --build=BUILD configure for building on BUILD [BUILD=HOST]
- --host=HOST configure for HOST [guessed]
- --target=TARGET configure for TARGET [TARGET=HOST]
-Features and packages:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --x-includes=DIR X include files are in DIR
- --x-libraries=DIR X library files are in DIR
-EOF
- if test -n "$ac_help"; then
- echo "--enable and --with options recognized:$ac_help"
- fi
- exit 0 ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host="$ac_optarg" ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir="$ac_optarg" ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir="$ac_optarg" ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir="$ac_optarg" ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir="$ac_optarg" ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst \
- | --locals | --local | --loca | --loc | --lo)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* \
- | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
- localstatedir="$ac_optarg" ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir="$ac_optarg" ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir="$ac_optarg" ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix="$ac_optarg" ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix="$ac_optarg" ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix="$ac_optarg" ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name="$ac_optarg" ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir="$ac_optarg" ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir="$ac_optarg" ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site="$ac_optarg" ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir="$ac_optarg" ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir="$ac_optarg" ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target="$ac_optarg" ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.13"
- exit 0 ;;
-
- -with-* | --with-*)
- ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
- *) ac_optarg=yes ;;
- esac
- eval "with_${ac_package}='$ac_optarg'" ;;
-
- -without-* | --without-*)
- ac_package=`echo $ac_option|sed -e 's/-*without-//'`
- # Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- eval "with_${ac_package}=no" ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes="$ac_optarg" ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries="$ac_optarg" ;;
-
- -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
- ;;
-
- *)
- if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
- echo "configure: warning: $ac_option: invalid host type" 1>&2
- fi
- if test "x$nonopt" != xNONE; then
- { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
- fi
- nonopt="$ac_option"
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
- exec 6>/dev/null
-else
- exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
- case "$ac_arg" in
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c) ;;
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
- ac_configure_args="$ac_configure_args '$ac_arg'" ;;
- *) ac_configure_args="$ac_configure_args $ac_arg" ;;
- esac
-done
-
-# NLS nuisances.
-# Only set these to C if already set. These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}" = set; then LANG=C; export LANG; fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=lukemftp.h
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then its parent.
- ac_prog=$0
- ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
- test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
- srcdir=$ac_confdir
- if test ! -r $srcdir/$ac_unique_file; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
- if test "$ac_srcdir_defaulted" = yes; then
- { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
- else
- { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
- fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
- if test "x$prefix" != xNONE; then
- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
- else
- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
- fi
-fi
-for ac_site_file in $CONFIG_SITE; do
- if test -r "$ac_site_file"; then
- echo "loading site script $ac_site_file"
- . "$ac_site_file"
- fi
-done
-
-if test -r "$cache_file"; then
- echo "loading cache $cache_file"
- . $cache_file
-else
- echo "creating cache $cache_file"
- > $cache_file
-fi
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
- ac_n= ac_c='
-' ac_t=' '
- else
- ac_n=-n ac_c= ac_t=
- fi
-else
- ac_n= ac_c='\c' ac_t=
-fi
-
-
-
-if test "$program_transform_name" = s,x,x,; then
- program_transform_name=
-else
- # Double any \ or $. echo might interpret backslashes.
- cat <<\EOF_SED > conftestsed
-s,\\,\\\\,g; s,\$,$$,g
-EOF_SED
- program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
- rm -f conftestsed
-fi
-test "$program_prefix" != NONE &&
- program_transform_name="s,^,${program_prefix},; $program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
- program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
-
-# sed with no file args requires a program.
-test "$program_transform_name" = "" && program_transform_name="s,x,x,"
-
-# Check whether --enable-editcomplete or --disable-editcomplete was given.
-if test "${enable_editcomplete+set}" = set; then
- enableval="$enable_editcomplete"
- opt_editcomplete=$enableval
-else
- opt_editcomplete=yes
-fi
-
-# Check whether --enable-ipv6 or --disable-ipv6 was given.
-if test "${enable_ipv6+set}" = set; then
- enableval="$enable_ipv6"
- opt_ipv6=$enableval
-else
- opt_ipv6=yes
-fi
-
-
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:590: checking whether ${MAKE-make} sets \${MAKE}" >&5
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftestmake <<\EOF
-all:
- @echo 'ac_maketemp="${MAKE}"'
-EOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
- eval ac_cv_prog_make_${ac_make}_set=yes
-else
- eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftestmake
-fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- SET_MAKE=
-else
- echo "$ac_t""no" 1>&6
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-# Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:619: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="gcc"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:649: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_prog_rejected=no
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- break
- fi
- done
- IFS="$ac_save_ifs"
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# -gt 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- set dummy "$ac_dir/$ac_word" "$@"
- shift
- ac_cv_prog_CC="$@"
- fi
-fi
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
- if test -z "$CC"; then
- case "`uname -s`" in
- *win32* | *WIN32*)
- # Extract the first word of "cl", so it can be a program name with args.
-set dummy cl; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:700: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_CC="cl"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
- echo "$ac_t""$CC" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
- ;;
- esac
- fi
- test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
-fi
-
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:732: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-cat > conftest.$ac_ext << EOF
-
-#line 743 "configure"
-#include "confdefs.h"
-
-main(){return(0);}
-EOF
-if { (eval echo configure:748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- ac_cv_prog_cc_works=yes
- # If we can't run a trivial program, we are probably using a cross compiler.
- if (./conftest; exit) 2>/dev/null; then
- ac_cv_prog_cc_cross=no
- else
- ac_cv_prog_cc_cross=yes
- fi
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_prog_cc_works=no
-fi
-rm -fr conftest*
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
-if test $ac_cv_prog_cc_works = no; then
- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:774: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:779: checking whether we are using GNU C" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.c <<EOF
-#ifdef __GNUC__
- yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:788: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
- ac_cv_prog_gcc=yes
-else
- ac_cv_prog_gcc=no
-fi
-fi
-
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
-
-if test $ac_cv_prog_gcc = yes; then
- GCC=yes
-else
- GCC=
-fi
-
-ac_test_CFLAGS="${CFLAGS+set}"
-ac_save_CFLAGS="$CFLAGS"
-CFLAGS=
-echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:807: checking whether ${CC-cc} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- echo 'void f(){}' > conftest.c
-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
- ac_cv_prog_cc_g=yes
-else
- ac_cv_prog_cc_g=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS="$ac_save_CFLAGS"
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-
-for ac_prog in mawk gawk nawk awk
-do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:843: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$AWK"; then
- ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_AWK="$ac_prog"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-AWK="$ac_cv_prog_AWK"
-if test -n "$AWK"; then
- echo "$ac_t""$AWK" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-test -n "$AWK" && break
-done
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/install-sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f $ac_dir/install.sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
-fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:903: checking for a BSD compatible install" >&5
-if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
- for ac_dir in $PATH; do
- # Account for people who put trailing slashes in PATH elements.
- case "$ac_dir/" in
- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- if test -f $ac_dir/$ac_prog; then
- if test $ac_prog = install &&
- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- :
- else
- ac_cv_path_install="$ac_dir/$ac_prog -c"
- break 2
- fi
- fi
- done
- ;;
- esac
- done
- IFS="$ac_save_IFS"
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL="$ac_cv_path_install"
- else
- # As a last resort, use the slow shell script. We don't cache a
- # path for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the path is relative.
- INSTALL="$ac_install_sh"
- fi
-fi
-echo "$ac_t""$INSTALL" 1>&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:958: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_RANLIB="ranlib"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
- echo "$ac_t""$RANLIB" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-for ac_prog in ar
-do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:990: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$AR"; then
- ac_cv_prog_AR="$AR" # Let the user override the test.
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_AR="$ac_prog"
- break
- fi
- done
- IFS="$ac_save_ifs"
-fi
-fi
-AR="$ac_cv_prog_AR"
-if test -n "$AR"; then
- echo "$ac_t""$AR" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-test -n "$AR" && break
-done
-
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1020: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- # This must be in double quotes, not single quotes, because CPP may get
- # substituted into the Makefile and "${CC-cc}" will confuse make.
- CPP="${CC-cc} -E"
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp.
- cat > conftest.$ac_ext <<EOF
-#line 1035 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1041: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -E -traditional-cpp"
- cat > conftest.$ac_ext <<EOF
-#line 1052 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1058: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP="${CC-cc} -nologo -E"
- cat > conftest.$ac_ext <<EOF
-#line 1069 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1075: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- :
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- CPP=/lib/cpp
-fi
-rm -f conftest*
-fi
-rm -f conftest*
-fi
-rm -f conftest*
- ac_cv_prog_CPP="$CPP"
-fi
- CPP="$ac_cv_prog_CPP"
-else
- ac_cv_prog_CPP="$CPP"
-fi
-echo "$ac_t""$CPP" 1>&6
-
-echo $ac_n "checking for AIX""... $ac_c" 1>&6
-echo "configure:1100: checking for AIX" >&5
-cat > conftest.$ac_ext <<EOF
-#line 1102 "configure"
-#include "confdefs.h"
-#ifdef _AIX
- yes
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "yes" >/dev/null 2>&1; then
- rm -rf conftest*
- echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
-#define _ALL_SOURCE 1
-EOF
-
-else
- rm -rf conftest*
- echo "$ac_t""no" 1>&6
-fi
-rm -f conftest*
-
-
-
-
-echo $ac_n "checking for fparseln in -lutil""... $ac_c" 1>&6
-echo "configure:1126: checking for fparseln in -lutil" >&5
-ac_lib_var=`echo util'_'fparseln | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lutil $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1134 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char fparseln();
-
-int main() {
-fparseln()
-; return 0; }
-EOF
-if { (eval echo configure:1145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo util | sed -e 's/[^a-zA-Z0-9_]/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lutil $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-if test $opt_editcomplete = yes; then
- echo $ac_n "checking for tgetent in -ltinfo""... $ac_c" 1>&6
-echo "configure:1174: checking for tgetent in -ltinfo" >&5
-ac_lib_var=`echo tinfo'_'tgetent | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-ltinfo $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1182 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char tgetent();
-
-int main() {
-tgetent()
-; return 0; }
-EOF
-if { (eval echo configure:1193: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo tinfo | sed -e 's/[^a-zA-Z0-9_]/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-ltinfo $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
-echo "configure:1219: checking for tgetent in -ltermcap" >&5
-ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-ltermcap $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1227 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char tgetent();
-
-int main() {
-tgetent()
-; return 0; }
-EOF
-if { (eval echo configure:1238: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo termcap | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-ltermcap $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
-echo "configure:1264: checking for tgetent in -lcurses" >&5
-ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lcurses $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1272 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char tgetent();
-
-int main() {
-tgetent()
-; return 0; }
-EOF
-if { (eval echo configure:1283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo curses | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lcurses $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
-echo "configure:1309: checking for tgetent in -lncurses" >&5
-ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lncurses $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1317 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char tgetent();
-
-int main() {
-tgetent()
-; return 0; }
-EOF
-if { (eval echo configure:1328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo ncurses | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lncurses $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-fi
-
-fi
-
-
-echo $ac_n "checking for library containing el_init""... $ac_c" 1>&6
-echo "configure:1363: checking for library containing el_init" >&5
-if eval "test \"`echo '$''{'ac_cv_search_el_init'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_func_search_save_LIBS="$LIBS"
-ac_cv_search_el_init="no"
-cat > conftest.$ac_ext <<EOF
-#line 1370 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char el_init();
-
-int main() {
-el_init()
-; return 0; }
-EOF
-if { (eval echo configure:1381: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- ac_cv_search_el_init="none required"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
-fi
-rm -f conftest*
-test "$ac_cv_search_el_init" = "no" && for i in edit; do
-LIBS="-l$i $ac_func_search_save_LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1392 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char el_init();
-
-int main() {
-el_init()
-; return 0; }
-EOF
-if { (eval echo configure:1403: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- ac_cv_search_el_init="-l$i"
-break
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
-fi
-rm -f conftest*
-done
-LIBS="$ac_func_search_save_LIBS"
-fi
-
-echo "$ac_t""$ac_cv_search_el_init" 1>&6
-if test "$ac_cv_search_el_init" != "no"; then
- test "$ac_cv_search_el_init" = "none required" || LIBS="$ac_cv_search_el_init $LIBS"
- have_libedit=yes
-else :
- have_libedit=no
-fi
-fi
-
- # Most operating systems have gethostbyname() in the default searched
- # libraries (i.e. libc):
- echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:1428: checking for gethostbyname" >&5
-if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1433 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char gethostbyname(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostbyname();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
-choke me
-#else
-gethostbyname();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_gethostbyname=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_gethostbyname=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-# Some OSes (eg. Solaris) place it in libnsl:
- echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:1475: checking for gethostbyname in -lnsl" >&5
-ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lnsl $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1483 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostbyname();
-
-int main() {
-gethostbyname()
-; return 0; }
-EOF
-if { (eval echo configure:1494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lnsl $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-# Some strange OSes (SINIX) have it in libsocket:
- echo $ac_n "checking for gethostbyname in -lsocket""... $ac_c" 1>&6
-echo "configure:1521: checking for gethostbyname in -lsocket" >&5
-ac_lib_var=`echo socket'_'gethostbyname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lsocket $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1529 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostbyname();
-
-int main() {
-gethostbyname()
-; return 0; }
-EOF
-if { (eval echo configure:1540: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lsocket $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-# Unfortunately libsocket sometimes depends on libnsl.
- # AC_CHECK_LIB's API is essentially broken so the following
- # ugliness is necessary:
- echo $ac_n "checking for gethostbyname in -lsocket""... $ac_c" 1>&6
-echo "configure:1569: checking for gethostbyname in -lsocket" >&5
-ac_lib_var=`echo socket'_'gethostbyname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lsocket -lnsl $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1577 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostbyname();
-
-int main() {
-gethostbyname()
-; return 0; }
-EOF
-if { (eval echo configure:1588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- LIBS="-lsocket -lnsl $LIBS"
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for gethostbyname in -lresolv""... $ac_c" 1>&6
-echo "configure:1607: checking for gethostbyname in -lresolv" >&5
-ac_lib_var=`echo resolv'_'gethostbyname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lresolv $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1615 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char gethostbyname();
-
-int main() {
-gethostbyname()
-; return 0; }
-EOF
-if { (eval echo configure:1626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo resolv | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lresolv $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
- echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:1665: checking for socket" >&5
-if eval "test \"`echo '$''{'ac_cv_func_socket'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 1670 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char socket(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char socket();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_socket) || defined (__stub___socket)
-choke me
-#else
-socket();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1693: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_socket=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_socket=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- :
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:1711: checking for socket in -lsocket" >&5
-ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lsocket $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1719 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char socket();
-
-int main() {
-socket()
-; return 0; }
-EOF
-if { (eval echo configure:1730: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/^a-zA-Z0-9_/_/g' \
- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
-
- LIBS="-lsocket $LIBS"
-
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:1756: checking for socket in -lsocket" >&5
-ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lsocket -lnsl $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1764 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char socket();
-
-int main() {
-socket()
-; return 0; }
-EOF
-if { (eval echo configure:1775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- LIBS="-lsocket -lnsl $LIBS"
-else
- echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-fi
-
-
-
- echo $ac_n "checking whether to support SOCKS""... $ac_c" 1>&6
-echo "configure:1802: checking whether to support SOCKS" >&5
- # Check whether --with-socks or --without-socks was given.
-if test "${with_socks+set}" = set; then
- withval="$with_socks"
-
- case "$withval" in
- no)
- echo "$ac_t""no" 1>&6
- ;;
- yes)
- echo "$ac_t""yes" 1>&6
- echo $ac_n "checking for SOCKSconnect in -lsocks5""... $ac_c" 1>&6
-echo "configure:1814: checking for SOCKSconnect in -lsocks5" >&5
-ac_lib_var=`echo socks5'_'SOCKSconnect | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lsocks5 $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1822 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char SOCKSconnect();
-
-int main() {
-SOCKSconnect()
-; return 0; }
-EOF
-if { (eval echo configure:1833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
-
- socks=5
- LIBS="-lsocks5 $LIBS"
-else
- echo "$ac_t""no" 1>&6
-
- echo $ac_n "checking for Rconnect in -lsocks""... $ac_c" 1>&6
-echo "configure:1855: checking for Rconnect in -lsocks" >&5
-ac_lib_var=`echo socks'_'Rconnect | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lsocks $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1863 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char Rconnect();
-
-int main() {
-Rconnect()
-; return 0; }
-EOF
-if { (eval echo configure:1874: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
-
- socks=4
- LIBS="-lsocks $LIBS"
-else
- echo "$ac_t""no" 1>&6
-
- { echo "configure: error: Could not find socks library. You must first install socks." 1>&2; exit 1; }
-fi
-
-fi
-
- ;;
- esac
-
-else
- echo "$ac_t""no" 1>&6
-
-fi
-
-
- if test "x$socks" = "x"; then
- echo $ac_n "checking whether to support SOCKS5""... $ac_c" 1>&6
-echo "configure:1911: checking whether to support SOCKS5" >&5
- # Check whether --with-socks5 or --without-socks5 was given.
-if test "${with_socks5+set}" = set; then
- withval="$with_socks5"
-
- case "$withval" in
- no)
- echo "$ac_t""no" 1>&6
- ;;
- *)
- echo "$ac_t""yes" 1>&6
- socks=5
- if test "x$withval" = "xyes"; then
- withval="-lsocks5"
- else
- if test -d "$withval"; then
- if test -d "$withval/include"; then
- CFLAGS="$CFLAGS -I$withval/include"
- else
- CFLAGS="$CFLAGS -I$withval"
- fi
- if test -d "$withval/lib"; then
- withval="-L$withval/lib -lsocks5"
- else
- withval="-L$withval -lsocks5"
- fi
- fi
- fi
- LIBS="$withval $LIBS"
- # If Socks was compiled with Kerberos support, we will need
- # to link against kerberos libraries. Temporarily append
- # to LIBS. This is harmless if there is no kerberos support.
- TMPLIBS="$LIBS"
- LIBS="$LIBS $KERBEROS_LIBS"
- cat > conftest.$ac_ext <<EOF
-#line 1946 "configure"
-#include "confdefs.h"
-
-int main() {
- SOCKSconnect();
-; return 0; }
-EOF
-if { (eval echo configure:1953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- :
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- { echo "configure: error: Could not find the $withval library. You must first install socks5." 1>&2; exit 1; }
-fi
-rm -f conftest*
- LIBS="$TMPLIBS"
- ;;
- esac
-
-else
- echo "$ac_t""no" 1>&6
-
-fi
-
- fi
-
- if test "x$socks" = "x"; then
- echo $ac_n "checking whether to support SOCKS4""... $ac_c" 1>&6
-echo "configure:1975: checking whether to support SOCKS4" >&5
- # Check whether --with-socks4 or --without-socks4 was given.
-if test "${with_socks4+set}" = set; then
- withval="$with_socks4"
-
- case "$withval" in
- no)
- echo "$ac_t""no" 1>&6
- ;;
- *)
- echo "$ac_t""yes" 1>&6
- socks=4
- if test "x$withval" = "xyes"; then
- withval="-lsocks"
- else
- if test -d "$withval"; then
- withval="-L$withval -lsocks"
- fi
- fi
- LIBS="$withval $LIBS"
- cat > conftest.$ac_ext <<EOF
-#line 1996 "configure"
-#include "confdefs.h"
-
-int main() {
- Rconnect();
-; return 0; }
-EOF
-if { (eval echo configure:2003: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- :
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- { echo "configure: error: Could not find the $withval library. You must first install socks." 1>&2; exit 1; }
-fi
-rm -f conftest*
- ;;
- esac
-
-else
- echo "$ac_t""no" 1>&6
-
-fi
-
- fi
-
- if test "x$socks" = "x4"; then
- cat >> confdefs.h <<\EOF
-#define SOCKS 1
-EOF
-
- cat >> confdefs.h <<\EOF
-#define SOCKS4 1
-EOF
-
- cat >> confdefs.h <<\EOF
-#define connect Rconnect
-EOF
-
- cat >> confdefs.h <<\EOF
-#define getsockname Rgetsockname
-EOF
-
- cat >> confdefs.h <<\EOF
-#define bind Rbind
-EOF
-
- cat >> confdefs.h <<\EOF
-#define accept Raccept
-EOF
-
- cat >> confdefs.h <<\EOF
-#define listen Rlisten
-EOF
-
- cat >> confdefs.h <<\EOF
-#define select Rselect
-EOF
-
- fi
-
- if test "x$socks" = "x5"; then
- cat >> confdefs.h <<\EOF
-#define SOCKS 1
-EOF
-
- cat >> confdefs.h <<\EOF
-#define SOCKS5 1
-EOF
-
- cat >> confdefs.h <<\EOF
-#define connect SOCKSconnect
-EOF
-
- cat >> confdefs.h <<\EOF
-#define getsockname SOCKSgetsockname
-EOF
-
- cat >> confdefs.h <<\EOF
-#define getpeername SOCKSgetpeername
-EOF
-
- cat >> confdefs.h <<\EOF
-#define bind SOCKSbind
-EOF
-
- cat >> confdefs.h <<\EOF
-#define accept SOCKSaccept
-EOF
-
- cat >> confdefs.h <<\EOF
-#define listen SOCKSlisten
-EOF
-
- cat >> confdefs.h <<\EOF
-#define select SOCKSselect
-EOF
-
- cat >> confdefs.h <<\EOF
-#define recvfrom SOCKSrecvfrom
-EOF
-
- cat >> confdefs.h <<\EOF
-#define sendto SOCKSsendto
-EOF
-
- cat >> confdefs.h <<\EOF
-#define recv SOCKSrecv
-EOF
-
- cat >> confdefs.h <<\EOF
-#define send SOCKSsend
-EOF
-
- cat >> confdefs.h <<\EOF
-#define read SOCKSread
-EOF
-
- cat >> confdefs.h <<\EOF
-#define write SOCKSwrite
-EOF
-
- cat >> confdefs.h <<\EOF
-#define rresvport SOCKSrresvport
-EOF
-
- cat >> confdefs.h <<\EOF
-#define shutdown SOCKSshutdown
-EOF
-
- cat >> confdefs.h <<\EOF
-#define listen SOCKSlisten
-EOF
-
- cat >> confdefs.h <<\EOF
-#define close SOCKSclose
-EOF
-
- cat >> confdefs.h <<\EOF
-#define dup SOCKSdup
-EOF
-
- cat >> confdefs.h <<\EOF
-#define dup2 SOCKSdup2
-EOF
-
- cat >> confdefs.h <<\EOF
-#define fclose SOCKSfclose
-EOF
-
- cat >> confdefs.h <<\EOF
-#define gethostbyname SOCKSgethostbyname
-EOF
-
- fi
-
-if test -n "$socks"; then
- if test $opt_ipv6 = yes; then
- echo "IPv6 is incompatible with socks, disabling IPv6 support"
- opt_ipv6=no
- fi
-fi
-
-
-
-ac_header_dirent=no
-for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:2166: checking for $ac_hdr that defines DIR" >&5
-if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2171 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <$ac_hdr>
-int main() {
-DIR *dirp = 0;
-; return 0; }
-EOF
-if { (eval echo configure:2179: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- eval "ac_cv_header_dirent_$ac_safe=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_dirent_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- ac_header_dirent=$ac_hdr; break
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
-if test $ac_header_dirent = dirent.h; then
-echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:2204: checking for opendir in -ldir" >&5
-ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-ldir $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2212 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char opendir();
-
-int main() {
-opendir()
-; return 0; }
-EOF
-if { (eval echo configure:2223: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- LIBS="$LIBS -ldir"
-else
- echo "$ac_t""no" 1>&6
-fi
-
-else
-echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:2245: checking for opendir in -lx" >&5
-ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lx $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2253 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char opendir();
-
-int main() {
-opendir()
-; return 0; }
-EOF
-if { (eval echo configure:2264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- LIBS="$LIBS -lx"
-else
- echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:2287: checking for ANSI C header files" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2292 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2300: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- ac_cv_header_stdc=yes
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 2317 "configure"
-#include "confdefs.h"
-#include <string.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "memchr" >/dev/null 2>&1; then
- :
-else
- rm -rf conftest*
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 2335 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "free" >/dev/null 2>&1; then
- :
-else
- rm -rf conftest*
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
- :
-else
- cat > conftest.$ac_ext <<EOF
-#line 2356 "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
-
-EOF
-if { (eval echo configure:2367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
- :
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ac_cv_header_stdc=no
-fi
-rm -fr conftest*
-fi
-
-fi
-fi
-
-echo "$ac_t""$ac_cv_header_stdc" 1>&6
-if test $ac_cv_header_stdc = yes; then
- cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
-
-fi
-
-for ac_hdr in arpa/nameser.h err.h regex.h paths.h poll.h sys/poll.h \
- termcap.h util.h libutil.h vis.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2395: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2400 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2405: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
-
-
-echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:2434: checking whether time.h and sys/time.h may both be included" >&5
-if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2439 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-int main() {
-struct tm *tp;
-; return 0; }
-EOF
-if { (eval echo configure:2448: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ac_cv_header_time=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ac_cv_header_time=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_header_time" 1>&6
-if test $ac_cv_header_time = yes; then
- cat >> confdefs.h <<\EOF
-#define TIME_WITH_SYS_TIME 1
-EOF
-
-fi
-
-echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:2469: checking for off_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2474 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
- rm -rf conftest*
- ac_cv_type_off_t=yes
-else
- rm -rf conftest*
- ac_cv_type_off_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_off_t" 1>&6
-if test $ac_cv_type_off_t = no; then
- cat >> confdefs.h <<\EOF
-#define off_t long
-EOF
-
-fi
-
-echo $ac_n "checking size of off_t""... $ac_c" 1>&6
-echo "configure:2502: checking size of off_t" >&5
-if eval "test \"`echo '$''{'ac_cv_sizeof_off_t'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$cross_compiling" = yes; then
- ac_cv_sizeof_off_t=0
-else
- cat > conftest.$ac_ext <<EOF
-#line 2510 "configure"
-#include "confdefs.h"
-#include <stdio.h>
-main()
-{
- FILE *f=fopen("conftestval", "w");
- if (!f) exit(1);
- fprintf(f, "%d\n", sizeof(off_t));
- exit(0);
-}
-EOF
-if { (eval echo configure:2521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
- ac_cv_sizeof_off_t=`cat conftestval`
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ac_cv_sizeof_off_t=0
-fi
-rm -fr conftest*
-fi
-
-fi
-echo "$ac_t""$ac_cv_sizeof_off_t" 1>&6
-cat >> confdefs.h <<EOF
-#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
-EOF
-
-
-
- echo $ac_n "checking for long long""... $ac_c" 1>&6
-echo "configure:2542: checking for long long" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_LONG_LONG'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2548 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-int main() {
-
-long long X = 2, Y = 1, Z;
-Z = X / Y; ;
-; return 0; }
-EOF
-if { (eval echo configure:2558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- ftp_cv_HAVE_LONG_LONG=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_LONG_LONG=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_LONG_LONG" 1>&6
- if test "x$ftp_cv_HAVE_LONG_LONG" = "xyes"; then
-
-cat >> confdefs.h <<\EOF
-#define HAVE_LONG_LONG 1
-EOF
-
-have_long_long=yes
- else
- have_long_long=no
- :
- fi
-
-
-
- echo $ac_n "checking for in_port_t""... $ac_c" 1>&6
-echo "configure:2587: checking for in_port_t" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_IN_PORT_T'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2593 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <netinet/in.h>
-int main() {
- in_port_t X ;
-; return 0; }
-EOF
-if { (eval echo configure:2602: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_IN_PORT_T=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_IN_PORT_T=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_IN_PORT_T" 1>&6
- if test "x$ftp_cv_HAVE_IN_PORT_T" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_IN_PORT_T 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for sa_family_t""... $ac_c" 1>&6
-echo "configure:2629: checking for sa_family_t" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_SA_FAMILY_T'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2635 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-int main() {
- sa_family_t X ;
-; return 0; }
-EOF
-if { (eval echo configure:2644: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_SA_FAMILY_T=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_SA_FAMILY_T=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_SA_FAMILY_T" 1>&6
- if test "x$ftp_cv_HAVE_SA_FAMILY_T" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_SA_FAMILY_T 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for sockaddr_in.sin_len""... $ac_c" 1>&6
-echo "configure:2671: checking for sockaddr_in.sin_len" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_SOCKADDR_SA_LEN'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2677 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-int main() {
-
- struct sockaddr_in sin;
- int X = sin.sin_len ;
-; return 0; }
-EOF
-if { (eval echo configure:2689: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_SOCKADDR_SA_LEN=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_SOCKADDR_SA_LEN=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_SOCKADDR_SA_LEN" 1>&6
- if test "x$ftp_cv_HAVE_SOCKADDR_SA_LEN" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_SOCKADDR_SA_LEN 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for socklen_t""... $ac_c" 1>&6
-echo "configure:2716: checking for socklen_t" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_SOCKLEN_T'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2722 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-int main() {
- socklen_t X ;
-; return 0; }
-EOF
-if { (eval echo configure:2731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_SOCKLEN_T=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_SOCKLEN_T=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_SOCKLEN_T" 1>&6
- if test "x$ftp_cv_HAVE_SOCKLEN_T" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_SOCKLEN_T 1
-EOF
-
- else
-
- :
- fi
-
-
-if test $opt_ipv6 = yes; then
-
-
- echo $ac_n "checking for AF_INET6""... $ac_c" 1>&6
-echo "configure:2760: checking for AF_INET6" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_AF_INET6'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2766 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-int main() {
- int X = AF_INET6 ;
-; return 0; }
-EOF
-if { (eval echo configure:2775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_AF_INET6=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_AF_INET6=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_AF_INET6" 1>&6
- if test "x$ftp_cv_HAVE_AF_INET6" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_AF_INET6 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for struct sockaddr_in6""... $ac_c" 1>&6
-echo "configure:2802: checking for struct sockaddr_in6" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_SOCKADDR_IN6'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2808 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <netinet/in.h>
-int main() {
- struct sockaddr_in6 X ;
-; return 0; }
-EOF
-if { (eval echo configure:2817: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_SOCKADDR_IN6=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_SOCKADDR_IN6=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_SOCKADDR_IN6" 1>&6
- if test "x$ftp_cv_HAVE_SOCKADDR_IN6" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_SOCKADDR_IN6 1
-EOF
-
- else
-
- :
- fi
-
-
-fi
-
-
- echo $ac_n "checking for struct addrinfo""... $ac_c" 1>&6
-echo "configure:2846: checking for struct addrinfo" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_ADDRINFO'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2852 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-int main() {
- struct addrinfo X ;
-; return 0; }
-EOF
-if { (eval echo configure:2862: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_ADDRINFO=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_ADDRINFO=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_ADDRINFO" 1>&6
- if test "x$ftp_cv_HAVE_ADDRINFO" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_ADDRINFO 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for d_namlen in struct dirent""... $ac_c" 1>&6
-echo "configure:2889: checking for d_namlen in struct dirent" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_D_NAMLEN'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2895 "configure"
-#include "confdefs.h"
-
-#if HAVE_DIRENT_H
-# include <dirent.h>
-#else
-# define dirent direct
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif
-#endif
-int main() {
-
- struct dirent dp;
- int X = dp.d_namlen; ;
-; return 0; }
-EOF
-if { (eval echo configure:2918: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_D_NAMLEN=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_D_NAMLEN=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_D_NAMLEN" 1>&6
- if test "x$ftp_cv_HAVE_D_NAMLEN" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_D_NAMLEN 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for h_errno declaration""... $ac_c" 1>&6
-echo "configure:2945: checking for h_errno declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_H_ERRNO_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2951 "configure"
-#include "confdefs.h"
-
-#include <netdb.h>
-int main() {
- int X = h_errno ;
-; return 0; }
-EOF
-if { (eval echo configure:2959: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_H_ERRNO_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_H_ERRNO_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_H_ERRNO_D" 1>&6
- if test "x$ftp_cv_HAVE_H_ERRNO_D" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_H_ERRNO_D 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for fclose() declaration""... $ac_c" 1>&6
-echo "configure:2986: checking for fclose() declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_FCLOSE_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 2992 "configure"
-#include "confdefs.h"
-
-#include <stdio.h>
-int main() {
- int (*X)() = fclose ;
-; return 0; }
-EOF
-if { (eval echo configure:3000: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_FCLOSE_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_FCLOSE_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_FCLOSE_D" 1>&6
- if test "x$ftp_cv_HAVE_FCLOSE_D" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_FCLOSE_D 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for getpass() declaration""... $ac_c" 1>&6
-echo "configure:3027: checking for getpass() declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_GETPASS_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3033 "configure"
-#include "confdefs.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-int main() {
- char *(*X)() = getpass ;
-; return 0; }
-EOF
-if { (eval echo configure:3042: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_GETPASS_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_GETPASS_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_GETPASS_D" 1>&6
- if test "x$ftp_cv_HAVE_GETPASS_D" = "xyes"; then
-
- cat >> confdefs.h <<\EOF
-#define HAVE_GETPASS_D 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for optarg declaration""... $ac_c" 1>&6
-echo "configure:3070: checking for optarg declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_OPTARG_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3076 "configure"
-#include "confdefs.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-int main() {
- char *X = optarg ;
-; return 0; }
-EOF
-if { (eval echo configure:3085: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_OPTARG_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_OPTARG_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_OPTARG_D" 1>&6
- if test "x$ftp_cv_HAVE_OPTARG_D" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_OPTARG_D 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for optind declaration""... $ac_c" 1>&6
-echo "configure:3112: checking for optind declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_OPTIND_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3118 "configure"
-#include "confdefs.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-int main() {
- int X = optind ;
-; return 0; }
-EOF
-if { (eval echo configure:3127: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_OPTIND_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_OPTIND_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_OPTIND_D" 1>&6
- if test "x$ftp_cv_HAVE_OPTIND_D" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_OPTIND_D 1
-EOF
-
- else
-
- :
- fi
-
-
-
- echo $ac_n "checking for pclose() declaration""... $ac_c" 1>&6
-echo "configure:3154: checking for pclose() declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_PCLOSE_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3160 "configure"
-#include "confdefs.h"
-
-#include <stdio.h>
-int main() {
- int (*X)() = pclose ;
-; return 0; }
-EOF
-if { (eval echo configure:3168: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_PCLOSE_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_PCLOSE_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_PCLOSE_D" 1>&6
- if test "x$ftp_cv_HAVE_PCLOSE_D" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_PCLOSE_D 1
-EOF
-
- else
-
- :
- fi
-
-
-
-for ac_func in err fgetln fseeko getaddrinfo getnameinfo inet_ntop inet_pton \
- mkstemp setprogname sl_init snprintf strdup strerror strlcat \
- strlcpy strptime strsep strunvis strvis timegm usleep
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3199: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 3204 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3227: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
-fi
-done
-
-
-for ac_func in gethostbyname2 getpassphrase getpgrp memmove poll select
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3256: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 3261 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3284: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
-if test $ac_cv_func_getpgrp = yes; then
- echo $ac_n "checking whether getpgrp takes no argument""... $ac_c" 1>&6
-echo "configure:3310: checking whether getpgrp takes no argument" >&5
-if eval "test \"`echo '$''{'ac_cv_func_getpgrp_void'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$cross_compiling" = yes; then
- { echo "configure: error: cannot check getpgrp if cross compiling" 1>&2; exit 1; }
-else
- cat > conftest.$ac_ext <<EOF
-#line 3318 "configure"
-#include "confdefs.h"
-
-/*
- * If this system has a BSD-style getpgrp(),
- * which takes a pid argument, exit unsuccessfully.
- *
- * Snarfed from Chet Ramey's bash pgrp.c test program
- */
-#include <stdio.h>
-#include <sys/types.h>
-
-int pid;
-int pg1, pg2, pg3, pg4;
-int ng, np, s, child;
-
-main()
-{
- pid = getpid();
- pg1 = getpgrp(0);
- pg2 = getpgrp();
- pg3 = getpgrp(pid);
- pg4 = getpgrp(1);
-
- /*
- * If all of these values are the same, it's pretty sure that
- * we're on a system that ignores getpgrp's first argument.
- */
- if (pg2 == pg4 && pg1 == pg3 && pg2 == pg3)
- exit(0);
-
- child = fork();
- if (child < 0)
- exit(1);
- else if (child == 0) {
- np = getpid();
- /*
- * If this is Sys V, this will not work; pgrp will be
- * set to np because setpgrp just changes a pgrp to be
- * the same as the pid.
- */
- setpgrp(np, pg1);
- ng = getpgrp(0); /* Same result for Sys V and BSD */
- if (ng == pg1) {
- exit(1);
- } else {
- exit(0);
- }
- } else {
- wait(&s);
- exit(s>>8);
- }
-}
-
-EOF
-if { (eval echo configure:3373: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
- ac_cv_func_getpgrp_void=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- ac_cv_func_getpgrp_void=no
-fi
-rm -fr conftest*
-fi
-
-
-fi
-
-echo "$ac_t""$ac_cv_func_getpgrp_void" 1>&6
-if test $ac_cv_func_getpgrp_void = yes; then
- cat >> confdefs.h <<\EOF
-#define GETPGRP_VOID 1
-EOF
-
-fi
-
-fi
-if test $ac_cv_lib_util_fparseln != yes; then
- for ac_func in fparseln
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3401: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 3406 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3429: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
-fi
-done
-
-
-fi
-
-LIBOBJS="$LIBOBJS glob.o"
-
-if test $ac_cv_func_strptime = yes; then
-
- echo $ac_n "checking for strptime() declaration""... $ac_c" 1>&6
-echo "configure:3462: checking for strptime() declaration" >&5
-if eval "test \"`echo '$''{'ftp_cv_HAVE_STRPTIME_D'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3468 "configure"
-#include "confdefs.h"
-
- #include <time.h>
-int main() {
- char *X = strptime("", "", NULL) ;
-; return 0; }
-EOF
-if { (eval echo configure:3476: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_HAVE_STRPTIME_D=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_HAVE_STRPTIME_D=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_HAVE_STRPTIME_D" 1>&6
- if test "x$ftp_cv_HAVE_STRPTIME_D" = "xyes"; then
- cat >> confdefs.h <<\EOF
-#define HAVE_STRPTIME_D 1
-EOF
-
- else
-
- :
- fi
-
-fi
-
-if test $have_long_long = yes -a $ac_cv_sizeof_off_t -ge 8; then
-
-
- echo $ac_n "checking *printf() support for %lld""... $ac_c" 1>&6
-echo "configure:3506: checking *printf() support for %lld" >&5
- can_printf_longlong=no
- if test "$cross_compiling" = yes; then
- :
-else
- cat > conftest.$ac_ext <<EOF
-#line 3512 "configure"
-#include "confdefs.h"
-
- #include <stdio.h>
- int main() {
- char buf[100];
- sprintf(buf, "%lld", 4294967300LL);
- return (strcmp(buf, "4294967300"));
- }
-
-EOF
-if { (eval echo configure:3523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-
- echo "$ac_t""yes" 1>&6
- can_printf_longlong=yes
-
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
-
- echo "$ac_t""no" 1>&6
-
-fi
-rm -fr conftest*
-fi
-
-
- if test $can_printf_longlong != yes; then
- echo $ac_n "checking *printf() support for %qd""... $ac_c" 1>&6
-echo "configure:3543: checking *printf() support for %qd" >&5
- if test "$cross_compiling" = yes; then
- :
-else
- cat > conftest.$ac_ext <<EOF
-#line 3548 "configure"
-#include "confdefs.h"
-
- #include <stdio.h>
- int main() {
- char buf[100];
- sprintf(buf, "%qd", 4294967300LL);
- return (strcmp(buf, "4294967300"));
- }
-
-EOF
-if { (eval echo configure:3559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-
- echo "$ac_t""yes" 1>&6
- can_printf_longlong=yes
- cat >> confdefs.h <<\EOF
-#define HAVE_PRINTF_QD 1
-EOF
-
-
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
-
- echo "$ac_t""no" 1>&6
-
-fi
-rm -fr conftest*
-fi
-
- fi
-
- if test $can_printf_longlong = yes; then
- cat >> confdefs.h <<\EOF
-#define HAVE_QUAD_SUPPORT 1
-EOF
-
- for ac_func in strtoll
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3590: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 3595 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func(); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3618: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
-fi
-done
-
-
- fi
-
-fi
-
-
-if test $opt_editcomplete = yes; then
- if test $have_libedit = yes; then
-
- echo $ac_n "checking for EL_RPROMPT in libedit""... $ac_c" 1>&6
-echo "configure:3653: checking for EL_RPROMPT in libedit" >&5
-if eval "test \"`echo '$''{'ftp_cv_have_libedit'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3659 "configure"
-#include "confdefs.h"
-
- #include <histedit.h>
-int main() {
- int X = EL_RPROMPT ;
-; return 0; }
-EOF
-if { (eval echo configure:3667: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_have_libedit=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_have_libedit=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_have_libedit" 1>&6
- if test "x$ftp_cv_have_libedit" = "xyes"; then
- :
- else
- have_libedit=no
- :
- fi
-
- fi
-
- echo $ac_n "checking for working libedit""... $ac_c" 1>&6
-echo "configure:3691: checking for working libedit" >&5
- if test $have_libedit = no; then
- echo "$ac_t""no - using my own" 1>&6
- INCLUDES="-I\${srcdir}/../libedit $INCLUDES"
- LDFLAGS="-L../libedit $LDFLAGS"
- LIBS="-ledit $LIBS"
- LIBEDIT=libedit.a
- LIBDEPENDS="$LIBDEPENDS ../libedit/libedit.a"
- else
- echo "$ac_t""yes" 1>&6
- fi
-else
- CFLAGS="-DNO_EDITCOMPLETE $CFLAGS"
-fi
-
-if test $ac_cv_func_sl_init = yes; then
-
- echo $ac_n "checking if sl_add() returns int""... $ac_c" 1>&6
-echo "configure:3709: checking if sl_add() returns int" >&5
-if eval "test \"`echo '$''{'ftp_cv_INT_SL_ADD'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3715 "configure"
-#include "confdefs.h"
-
- #include <stringlist.h>
-int main() {
- int f = sl_add((StringList *)0, "foo") ;
-; return 0; }
-EOF
-if { (eval echo configure:3723: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_INT_SL_ADD=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_INT_SL_ADD=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_INT_SL_ADD" 1>&6
- if test "x$ftp_cv_INT_SL_ADD" = "xyes"; then
- :
- else
- LIBOBJS="$LIBOBJS sl_init.o"
- :
- fi
-
-fi
-
-
-have_rfc2553_netdb=no
-if test $ac_cv_func_getaddrinfo = yes -a ! -n "$socks"; then
-
- echo $ac_n "checking for AI_NUMERICHOST""... $ac_c" 1>&6
-echo "configure:3751: checking for AI_NUMERICHOST" >&5
-if eval "test \"`echo '$''{'ftp_cv_have_ai_numerichost'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3757 "configure"
-#include "confdefs.h"
-
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
-int main() {
- int X = AI_NUMERICHOST ;
-; return 0; }
-EOF
-if { (eval echo configure:3767: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_have_ai_numerichost=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_have_ai_numerichost=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_have_ai_numerichost" 1>&6
- if test "x$ftp_cv_have_ai_numerichost" = "xyes"; then
- have_rfc2553_netdb=yes
- else
-
- :
- fi
-
-fi
-echo $ac_n "checking for working getaddrinfo()""... $ac_c" 1>&6
-echo "configure:3790: checking for working getaddrinfo()" >&5
-if test $have_rfc2553_netdb = yes; then
- cat >> confdefs.h <<\EOF
-#define HAVE_RFC2553_NETDB 1
-EOF
-
- echo "$ac_t""yes" 1>&6
-else
- if test $ac_cv_func_getaddrinfo = yes; then
- LIBOBJS="$LIBOBJS getaddrinfo.o"
- echo "$ac_t""no - using local version" 1>&6
- else
- echo "$ac_t""using local version" 1>&6
- fi
-fi
-
-
-if test $ac_cv_header_vis_h = yes; then
-
- echo $ac_n "checking for VIS_WHITE in vis.h""... $ac_c" 1>&6
-echo "configure:3810: checking for VIS_WHITE in vis.h" >&5
-if eval "test \"`echo '$''{'ftp_cv_have_vis_white'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
-
- cat > conftest.$ac_ext <<EOF
-#line 3816 "configure"
-#include "confdefs.h"
-
- #include <sys/types.h>
- #include <vis.h>
-int main() {
- int X = VIS_WHITE ;
-; return 0; }
-EOF
-if { (eval echo configure:3825: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
- rm -rf conftest*
- ftp_cv_have_vis_white=yes
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- ftp_cv_have_vis_white=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ftp_cv_have_vis_white" 1>&6
- if test "x$ftp_cv_have_vis_white" = "xyes"; then
- :
- else
- ac_cv_header_vis_h=no
- :
- fi
-
-fi
-
-
-if test -n "$LIBOBJS"; then
- INCLUDES="$INCLUDES -I\${srcdir}/../libukem"
- LDFLAGS="$LDFLAGS -L../libukem"
- LIBS="$LIBS -lukem"
- LIBUKEM=libukem.a
- LIBDEPENDS="$LIBDEPENDS ../libukem/libukem.a"
-fi
-
-
-
-
-
-
-
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs. It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already. You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
- case `(ac_space=' '; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- # `set' does not quote correctly, so add quotes (double-quote substitution
- # turns \\\\ into \\, and sed turns \\ into \).
- sed -n \
- -e "s/'/'\\\\''/g" \
- -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
- ;;
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
- ;;
- esac >> confcache
-if cmp -s $cache_file confcache; then
- :
-else
- if test -w $cache_file; then
- echo "updating cache $cache_file"
- cat confcache > $cache_file
- else
- echo "not updating unwritable cache $cache_file"
- fi
-fi
-rm -f confcache
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-DEFS=-DHAVE_CONFIG_H
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
- case "\$ac_option" in
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
- exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
- -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.13"
- exit 0 ;;
- -help | --help | --hel | --he | --h)
- echo "\$ac_cs_usage"; exit 0 ;;
- *) echo "\$ac_cs_usage"; exit 1 ;;
- esac
-done
-
-ac_given_srcdir=$srcdir
-ac_given_INSTALL="$INSTALL"
-
-trap 'rm -fr `echo "Makefile libedit/Makefile libedit/makelist libukem/Makefile \
- src/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@SHELL@%$SHELL%g
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@SET_MAKE@%$SET_MAKE%g
-s%@CC@%$CC%g
-s%@AWK@%$AWK%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@RANLIB@%$RANLIB%g
-s%@AR@%$AR%g
-s%@CPP@%$CPP%g
-s%@LIBOBJS@%$LIBOBJS%g
-s%@INCLUDES@%$INCLUDES%g
-s%@LIBEDIT@%$LIBEDIT%g
-s%@LIBUKEM@%$LIBUKEM%g
-s%@LIBDEPENDS@%$LIBDEPENDS%g
-
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
- if test $ac_beg -gt 1; then
- sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
- else
- sed "${ac_end}q" conftest.subs > conftest.s$ac_file
- fi
- if test ! -s conftest.s$ac_file; then
- ac_more_lines=false
- rm -f conftest.s$ac_file
- else
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds="sed -f conftest.s$ac_file"
- else
- ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
- fi
- ac_file=`expr $ac_file + 1`
- ac_beg=$ac_end
- ac_end=`expr $ac_end + $ac_max_sed_cmds`
- fi
-done
-if test -z "$ac_sed_cmds"; then
- ac_sed_cmds=cat
-fi
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile libedit/Makefile libedit/makelist libukem/Makefile \
- src/Makefile"}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case "$ac_file" in
- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
- *) ac_file_in="${ac_file}.in" ;;
- esac
-
- # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
- # Remove last slash and all that follows it. Not all systems have dirname.
- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
- # The file is in a subdirectory.
- test ! -d "$ac_dir" && mkdir "$ac_dir"
- ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
- # A "../" for each directory in $ac_dir_suffix.
- ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
- else
- ac_dir_suffix= ac_dots=
- fi
-
- case "$ac_given_srcdir" in
- .) srcdir=.
- if test -z "$ac_dots"; then top_srcdir=.
- else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
- /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
- *) # Relative path.
- srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
- top_srcdir="$ac_dots$ac_given_srcdir" ;;
- esac
-
- case "$ac_given_INSTALL" in
- [/$]*) INSTALL="$ac_given_INSTALL" ;;
- *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
- esac
-
- echo creating "$ac_file"
- rm -f "$ac_file"
- configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
- case "$ac_file" in
- *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
- *) ac_comsub= ;;
- esac
-
- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
- sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-s%@INSTALL@%$INSTALL%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
-ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
-ac_dC='\3'
-ac_dD='%g'
-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_uB='\([ ]\)%\1#\2define\3'
-ac_uC=' '
-ac_uD='\4%g'
-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_eB='$%\1#\2define\3'
-ac_eC=' '
-ac_eD='%g'
-
-if test "${CONFIG_HEADERS+set}" != set; then
-EOF
-cat >> $CONFIG_STATUS <<EOF
- CONFIG_HEADERS="config.h"
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-fi
-for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case "$ac_file" in
- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
- *) ac_file_in="${ac_file}.in" ;;
- esac
-
- echo creating $ac_file
-
- rm -f conftest.frag conftest.in conftest.out
- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
- cat $ac_file_inputs > conftest.in
-
-EOF
-
-# Transform confdefs.h into a sed script conftest.vals that substitutes
-# the proper values into config.h.in to produce config.h. And first:
-# Protect against being on the right side of a sed subst in config.status.
-# Protect against being in an unquoted here document in config.status.
-rm -f conftest.vals
-cat > conftest.hdr <<\EOF
-s/[\\&%]/\\&/g
-s%[\\$`]%\\&%g
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
-s%ac_d%ac_u%gp
-s%ac_u%ac_e%gp
-EOF
-sed -n -f conftest.hdr confdefs.h > conftest.vals
-rm -f conftest.hdr
-
-# This sed command replaces #undef with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >> conftest.vals <<\EOF
-s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
-EOF
-
-# Break up conftest.vals because some shells have a limit on
-# the size of here documents, and old seds have small limits too.
-
-rm -f conftest.tail
-while :
-do
- ac_lines=`grep -c . conftest.vals`
- # grep -c gives empty output for an empty file on some AIX systems.
- if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
- # Write a limited-size here document to conftest.frag.
- echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
- echo 'CEOF
- sed -f conftest.frag conftest.in > conftest.out
- rm -f conftest.in
- mv conftest.out conftest.in
-' >> $CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
- rm -f conftest.vals
- mv conftest.tail conftest.vals
-done
-rm -f conftest.vals
-
-cat >> $CONFIG_STATUS <<\EOF
- rm -f conftest.frag conftest.h
- echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
- cat conftest.in >> conftest.h
- rm -f conftest.in
- if cmp -s $ac_file conftest.h 2>/dev/null; then
- echo "$ac_file is unchanged"
- rm -f conftest.h
- else
- # Remove last slash and all that follows it. Not all systems have dirname.
- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
- # The file is in a subdirectory.
- test ! -d "$ac_dir" && mkdir "$ac_dir"
- fi
- rm -f $ac_file
- mv conftest.h $ac_file
- fi
-fi; done
-
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
diff --git a/contrib/lukemftp/configure.in b/contrib/lukemftp/configure.in
deleted file mode 100644
index 4edb841..0000000
--- a/contrib/lukemftp/configure.in
+++ /dev/null
@@ -1,307 +0,0 @@
-dnl $Id: configure.in,v 1.37 2002/06/10 08:08:53 lukem Exp $
-dnl
-dnl configure.in --
-dnl process this file with autoconf to produce a configure script.
-dnl
-
-AC_REVISION($Revision: 1.37 $)dnl
-
-AC_INIT(lukemftp.h)
-
-dnl Arguments for which features are included
-dnl
-AC_ARG_PROGRAM
-AC_ARG_ENABLE(editcomplete, [\
- --enable-editcomplete Turn on command line editing and completion.
- --disable-editcomplete Turn off command line editing and completion
- [default: enabled].],
- opt_editcomplete=$enableval,
- opt_editcomplete=yes)
-AC_ARG_ENABLE(ipv6, [\
- --enable-ipv6 Enable IPv6 support (if your OS supports it).
- --disable-ipv6 Disable IPv6 support (even if your OS supports it)
- [default: enabled].],
- opt_ipv6=$enableval,
- opt_ipv6=yes)
-
-dnl Checks for programs.
-dnl
-AC_PROG_MAKE_SET
-AC_PROG_CC
-AC_PROG_AWK
-AC_PROG_INSTALL
-AC_PROG_RANLIB
-AC_CHECK_PROGS(AR, ar)
-AC_AIX
-
-
-dnl Checks for libraries.
-dnl
-AC_CHECK_LIB(util, fparseln)
-if test $opt_editcomplete = yes; then
- AC_CHECK_LIB(tinfo, tgetent, ,
- AC_CHECK_LIB(termcap, tgetent, ,
- AC_CHECK_LIB(curses, tgetent, ,
- AC_CHECK_LIB(ncurses, tgetent))))
- AC_SEARCH_LIBS(el_init, edit, have_libedit=yes, have_libedit=no)
-fi
-AC_LIBRARY_NET
-AC_LIBRARY_SOCKS
-if test -n "$socks"; then
- if test $opt_ipv6 = yes; then
- echo "IPv6 is incompatible with socks, disabling IPv6 support"
- opt_ipv6=no
- fi
-fi
-
-
-dnl Checks for header files.
-dnl
-AC_CONFIG_HEADER(config.h)
-AC_HEADER_DIRENT
-AC_HEADER_STDC
-AC_CHECK_HEADERS(arpa/nameser.h err.h regex.h paths.h poll.h sys/poll.h \
- termcap.h util.h libutil.h vis.h)
-
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-dnl
-AC_HEADER_TIME
-AC_TYPE_OFF_T
-AC_CHECK_SIZEOF(off_t, 0)
-AC_MSG_TRY_LINK(for long long, ftp_cv_HAVE_LONG_LONG, [
-#include <sys/types.h>] , [
-long long X = 2, Y = 1, Z;
-Z = X / Y; ], [
-AC_DEFINE(HAVE_LONG_LONG, 1)
-have_long_long=yes], [have_long_long=no])
-
-AC_MSG_TRY_COMPILE(for in_port_t, ftp_cv_HAVE_IN_PORT_T, [
-#include <sys/types.h>
-#include <netinet/in.h> ], [ in_port_t X ], [AC_DEFINE(HAVE_IN_PORT_T, 1)])
-
-AC_MSG_TRY_COMPILE(for sa_family_t, ftp_cv_HAVE_SA_FAMILY_T, [
-#include <sys/types.h>
-#include <sys/socket.h> ], [ sa_family_t X ], [AC_DEFINE(HAVE_SA_FAMILY_T, 1)])
-
-AC_MSG_TRY_COMPILE(for sockaddr_in.sin_len, ftp_cv_HAVE_SOCKADDR_SA_LEN, [
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> ], [
- struct sockaddr_in sin;
- int X = sin.sin_len ], [AC_DEFINE(HAVE_SOCKADDR_SA_LEN, 1)])
-
-AC_MSG_TRY_COMPILE(for socklen_t, ftp_cv_HAVE_SOCKLEN_T, [
-#include <sys/types.h>
-#include <sys/socket.h> ], [ socklen_t X ], [AC_DEFINE(HAVE_SOCKLEN_T, 1)])
-
-if test $opt_ipv6 = yes; then
-
- AC_MSG_TRY_COMPILE(for AF_INET6, ftp_cv_HAVE_AF_INET6, [
-#include <sys/types.h>
-#include <sys/socket.h> ],
- [ int X = AF_INET6 ], [AC_DEFINE(HAVE_AF_INET6, 1)])
-
- AC_MSG_TRY_COMPILE(for struct sockaddr_in6, ftp_cv_HAVE_SOCKADDR_IN6, [
-#include <sys/types.h>
-#include <netinet/in.h> ],
- [ struct sockaddr_in6 X ], [AC_DEFINE(HAVE_SOCKADDR_IN6, 1)])
-
-fi
-
-AC_MSG_TRY_COMPILE(for struct addrinfo, ftp_cv_HAVE_ADDRINFO, [
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h> ],
- [ struct addrinfo X ], [AC_DEFINE(HAVE_ADDRINFO, 1)])
-
-AC_MSG_TRY_COMPILE(for d_namlen in struct dirent, ftp_cv_HAVE_D_NAMLEN, [
-#if HAVE_DIRENT_H
-# include <dirent.h>
-#else
-# define dirent direct
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif
-#endif ], [
- struct dirent dp;
- int X = dp.d_namlen; ], [AC_DEFINE(HAVE_D_NAMLEN, 1)])
-
-AC_MSG_TRY_COMPILE(for h_errno declaration, ftp_cv_HAVE_H_ERRNO_D, [
-#include <netdb.h> ], [ int X = h_errno ], [AC_DEFINE(HAVE_H_ERRNO_D, 1)])
-
-AC_MSG_TRY_COMPILE(for fclose() declaration, ftp_cv_HAVE_FCLOSE_D, [
-#include <stdio.h> ], [ int (*X)() = fclose ], [AC_DEFINE(HAVE_FCLOSE_D, 1)])
-
-AC_MSG_TRY_COMPILE(for getpass() declaration, ftp_cv_HAVE_GETPASS_D, [
-#include <stdlib.h>
-#include <unistd.h> ], [ char *(*X)() = getpass ], [
- AC_DEFINE(HAVE_GETPASS_D, 1)])
-
-AC_MSG_TRY_COMPILE(for optarg declaration, ftp_cv_HAVE_OPTARG_D, [
-#include <stdlib.h>
-#include <unistd.h> ], [ char *X = optarg ], [AC_DEFINE(HAVE_OPTARG_D, 1)])
-
-AC_MSG_TRY_COMPILE(for optind declaration, ftp_cv_HAVE_OPTIND_D, [
-#include <stdlib.h>
-#include <unistd.h> ], [ int X = optind ], [AC_DEFINE(HAVE_OPTIND_D, 1)])
-
-AC_MSG_TRY_COMPILE(for pclose() declaration, ftp_cv_HAVE_PCLOSE_D, [
-#include <stdio.h> ], [ int (*X)() = pclose ], [AC_DEFINE(HAVE_PCLOSE_D, 1)])
-
-
-dnl Checks for library functions.
-dnl
-AC_REPLACE_FUNCS(err fgetln fseeko getaddrinfo getnameinfo inet_ntop inet_pton \
- mkstemp setprogname sl_init snprintf strdup strerror strlcat \
- strlcpy strptime strsep strunvis strvis timegm usleep)
-AC_CHECK_FUNCS(gethostbyname2 getpassphrase getpgrp memmove poll select)
-if test $ac_cv_func_getpgrp = yes; then
- AC_FUNC_GETPGRP
-fi
-if test $ac_cv_lib_util_fparseln != yes; then
- AC_REPLACE_FUNCS(fparseln)
-fi
-
-LIBOBJS="$LIBOBJS glob.o"
-
-if test $ac_cv_func_strptime = yes; then
- AC_MSG_TRY_COMPILE(for strptime() declaration, ftp_cv_HAVE_STRPTIME_D, [
- #include <time.h> ], [ char *X = strptime("", "", NULL) ],
- [AC_DEFINE(HAVE_STRPTIME_D, 1)])
-fi
-
-if test $have_long_long = yes -a $ac_cv_sizeof_off_t -ge 8; then
-
-dnl We assume that if sprintf() supports %lld or %qd,
-dnl then all of *printf() does. If not, disable long long
-dnl support because we don't know how to display it.
-
- AC_MSG_CHECKING(*printf() support for %lld)
- can_printf_longlong=no
- AC_TRY_RUN([
- #include <stdio.h>
- int main() {
- char buf[100];
- sprintf(buf, "%lld", 4294967300LL);
- return (strcmp(buf, "4294967300"));
- }
- ], [
- AC_MSG_RESULT(yes)
- can_printf_longlong=yes
- ], [
- AC_MSG_RESULT(no)
- ], [ : ])
-
- if test $can_printf_longlong != yes; then
- AC_MSG_CHECKING(*printf() support for %qd)
- AC_TRY_RUN([
- #include <stdio.h>
- int main() {
- char buf[100];
- sprintf(buf, "%qd", 4294967300LL);
- return (strcmp(buf, "4294967300"));
- }
- ], [
- AC_MSG_RESULT(yes)
- can_printf_longlong=yes
- AC_DEFINE(HAVE_PRINTF_QD, 1)
- ], [
- AC_MSG_RESULT(no)
- ], [ : ])
- fi
-
- if test $can_printf_longlong = yes; then
- AC_DEFINE(HAVE_QUAD_SUPPORT, 1)
- AC_REPLACE_FUNCS(strtoll)
- fi
-
-fi
-
-
-if test $opt_editcomplete = yes; then
- if test $have_libedit = yes; then
- AC_MSG_TRY_COMPILE(for EL_RPROMPT in libedit,
- ftp_cv_have_libedit, [
- #include <histedit.h> ], [ int X = EL_RPROMPT ], [:],
- have_libedit=no )
- fi
-
- AC_MSG_CHECKING(for working libedit)
- if test $have_libedit = no; then
- AC_MSG_RESULT(no - using my own)
- INCLUDES="-I\${srcdir}/../libedit $INCLUDES"
- LDFLAGS="-L../libedit $LDFLAGS"
- LIBS="-ledit $LIBS"
- LIBEDIT=libedit.a
- LIBDEPENDS="$LIBDEPENDS ../libedit/libedit.a"
- else
- AC_MSG_RESULT(yes)
- fi
-else
- CFLAGS="-DNO_EDITCOMPLETE $CFLAGS"
-fi
-
-if test $ac_cv_func_sl_init = yes; then
- AC_MSG_TRY_COMPILE(if sl_add() returns int, ftp_cv_INT_SL_ADD, [
- #include <stringlist.h> ], [ int f = sl_add((StringList *)0, "foo") ],
- [:] , [LIBOBJS="$LIBOBJS sl_init.o"])
-fi
-
-
-have_rfc2553_netdb=no
-if test $ac_cv_func_getaddrinfo = yes -a ! -n "$socks"; then
- AC_MSG_TRY_COMPILE(for AI_NUMERICHOST,
- ftp_cv_have_ai_numerichost, [
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h> ],
- [ int X = AI_NUMERICHOST ], [ have_rfc2553_netdb=yes ])
-fi
-AC_MSG_CHECKING(for working getaddrinfo())
-if test $have_rfc2553_netdb = yes; then
- AC_DEFINE(HAVE_RFC2553_NETDB, 1)
- AC_MSG_RESULT(yes)
-else
- if test $ac_cv_func_getaddrinfo = yes; then
- LIBOBJS="$LIBOBJS getaddrinfo.o"
- AC_MSG_RESULT(no - using local version)
- else
- AC_MSG_RESULT(using local version)
- fi
-fi
-
-
-if test $ac_cv_header_vis_h = yes; then
- AC_MSG_TRY_COMPILE(for VIS_WHITE in vis.h,
- ftp_cv_have_vis_white, [
- #include <sys/types.h>
- #include <vis.h> ], [ int X = VIS_WHITE ], [:],
- ac_cv_header_vis_h=no )
-fi
-
-
-if test -n "$LIBOBJS"; then
- INCLUDES="$INCLUDES -I\${srcdir}/../libukem"
- LDFLAGS="$LDFLAGS -L../libukem"
- LIBS="$LIBS -lukem"
- LIBUKEM=libukem.a
- LIBDEPENDS="$LIBDEPENDS ../libukem/libukem.a"
-fi
-
-dnl Create the Makefiles
-dnl
-
-AC_SUBST(INCLUDES)
-AC_SUBST(LIBEDIT)
-AC_SUBST(LIBUKEM)
-AC_SUBST(LIBDEPENDS)
-
-AC_OUTPUT(Makefile libedit/Makefile libedit/makelist libukem/Makefile \
- src/Makefile)
diff --git a/contrib/lukemftp/diffout b/contrib/lukemftp/diffout
deleted file mode 100644
index 932f748..0000000
--- a/contrib/lukemftp/diffout
+++ /dev/null
@@ -1,3500 +0,0 @@
-diff -Nru src/CVS/Entries /home/spock/ftp/CVS/Entries
---- src/CVS/Entries Thu Jan 30 11:00:13 2003
-+++ /home/spock/ftp/CVS/Entries Thu Jun 12 02:02:10 2003
-@@ -1,16 +1,17 @@
--/Makefile.in/1.1.1.1/Thu Jul 19 16:26:12 2001//
--/cmds.c/1.1.1.2/Sat Jun 15 09:40:32 2002//
--/cmdtab.c/1.1.1.2/Sat Jun 15 09:40:33 2002//
--/complete.c/1.1.1.1/Thu Jul 19 16:26:13 2001//
--/domacro.c/1.1.1.2/Sat Jun 15 09:40:33 2002//
--/extern.h/1.1.1.2/Sat Jun 15 09:40:33 2002//
--/fetch.c/1.1.1.3/Sat Jun 15 09:40:34 2002//
--/ftp.1/1.1.1.3/Sat Jun 15 09:40:35 2002//
--/ftp.c/1.1.1.3/Sat Jun 15 09:40:36 2002//
--/ftp.cat1/1.1.1.1/Sat Jun 15 09:40:31 2002//
--/ftp_var.h/1.1.1.3/Sat Jun 15 09:40:36 2002//
--/main.c/1.1.1.3/Sat Jun 15 09:40:36 2002//
--/ruserpass.c/1.1.1.2/Sat Jun 15 09:40:36 2002//
--/util.c/1.1.1.2/Sat Jun 15 09:40:37 2002//
--/version.h/1.1.1.2/Sat Jun 15 09:40:37 2002//
-+/Makefile/1.26/Tue Jan 21 16:08:06 2003//
-+/cmds.c/1.100/Sat Nov 30 03:10:55 2002//
-+/cmdtab.c/1.40/Mon Jul 29 04:24:47 2002//
-+/complete.c/1.38/Mon May 1 10:35:17 2000//
-+/domacro.c/1.19/Fri Feb 1 05:04:43 2002//
-+/extern.h/1.61/Tue Jan 21 16:08:07 2003//
-+/fetch.c/1.141/Wed May 14 14:31:00 2003//
-+/ftp.1/1.94/Wed May 14 14:31:00 2003//
-+/ftp.c/1.120/Wed Jun 5 10:20:49 2002//
-+/ftp_var.h/1.64/Tue Jan 21 16:08:07 2003//
-+/main.c/1.84/Wed May 14 14:31:00 2003//
-+/progressbar.c/1.3/Fri Feb 28 09:53:49 2003//
-+/progressbar.h/1.3/Fri Feb 28 09:53:49 2003//
-+/ruserpass.c/1.28/Wed Nov 15 00:11:04 2000//
-+/util.c/1.111/Fri Feb 28 09:54:51 2003//
-+/version.h/1.30/Fri Feb 28 09:54:20 2003//
- D
-diff -Nru src/CVS/Repository /home/spock/ftp/CVS/Repository
---- src/CVS/Repository Thu Jan 30 11:00:13 2003
-+++ /home/spock/ftp/CVS/Repository Thu Jun 12 02:02:10 2003
-@@ -1 +1 @@
--src/contrib/lukemftp/src
-+src/usr.bin/ftp
-diff -Nru src/CVS/Root /home/spock/ftp/CVS/Root
---- src/CVS/Root Thu Jan 30 11:00:13 2003
-+++ /home/spock/ftp/CVS/Root Thu Jun 12 02:02:09 2003
-@@ -1 +1 @@
--spock@current:/cvs/ncvs
-+:pserver:anoncvs@anoncvs.netbsd.org:/cvsroot
-diff -Nru src/Makefile /home/spock/ftp/Makefile
---- src/Makefile Wed Dec 31 19:00:00 1969
-+++ /home/spock/ftp/Makefile Thu Jun 12 02:02:10 2003
-@@ -0,0 +1,26 @@
-+# $NetBSD: Makefile,v 1.26 2003/01/21 16:08:06 jhawk Exp $
-+# from: @(#)Makefile 8.2 (Berkeley) 4/3/94
-+
-+PROG= ftp
-+SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
-+ progressbar.c ruserpass.c util.c
-+
-+# Uncomment the following to provide defaults for gate-ftp operation
-+#
-+#CPPFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
-+
-+.if defined(SMALLPROG)
-+CPPFLAGS+=-DNO_EDITCOMPLETE -DNO_ABOUT
-+.else
-+LDADD+= -ledit -ltermcap
-+DPADD+= ${LIBEDIT} ${LIBTERMCAP}
-+.endif
-+
-+.if !defined(SMALLPROG) || defined(SMALLPROG_INET6)
-+CPPFLAGS+= -DINET6
-+.endif
-+
-+cmds.o fetch.o: version.h
-+main.o: ftp_var.h
-+
-+.include <bsd.prog.mk>
-diff -Nru src/Makefile.in /home/spock/ftp/Makefile.in
---- src/Makefile.in Thu Jul 19 12:26:12 2001
-+++ /home/spock/ftp/Makefile.in Wed Dec 31 19:00:00 1969
-@@ -1,43 +0,0 @@
--#
--# $Id: Makefile.in,v 1.8 2000/08/08 07:04:27 lukem Exp $
--#
--
--srcdir = @srcdir@
--VPATH = @srcdir@
--SHELL = /bin/sh
--
--prefix = @prefix@
--exec_prefix = @exec_prefix@
--bindir = @bindir@
--mandir = @mandir@
--transform = @program_transform_name@
--
--mandircat1 = ${mandir}/cat1
--
--CC = @CC@
--CFLAGS = -I${srcdir} -I${srcdir}/.. -I. -I.. @INCLUDES@ @CFLAGS@
--LIBS = @LIBS@
--LDFLAGS = @LDFLAGS@
--
--INSTALL = @INSTALL@
--
--PROG = ftp
--OBJS = cmds.o cmdtab.o complete.o domacro.o fetch.o ftp.o main.o \
-- ruserpass.o util.o
--
--all: ${PROG}
--
--install: all
-- -mkdir -p ${bindir}
-- ${INSTALL} -m 555 ${PROG} ${bindir}/`echo ${PROG}|sed '$(transform)'`
-- -mkdir -p ${mandircat1}
-- ${INSTALL} -m 444 ${srcdir}/${PROG}.cat1 ${mandircat1}/`echo ${PROG}|sed '$(transform)'`.1
--
--${PROG}: ${OBJS} @LIBDEPENDS@
-- ${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS}
--
--clean:
-- rm -f core ${PROG} ${OBJS}
--
--distclean: clean
-- rm -f Makefile
-diff -Nru src/cmds.c /home/spock/ftp/cmds.c
---- src/cmds.c Sat Jun 15 05:40:32 2002
-+++ /home/spock/ftp/cmds.c Thu Jun 12 02:02:10 2003
-@@ -1,4 +1,4 @@
--/* $NetBSD: cmds.c,v 1.98 2002/06/05 10:20:46 lukem Exp $ */
-+/* $NetBSD: cmds.c,v 1.100 2002/11/30 03:10:55 lukem Exp $ */
-
- /*-
- * Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
-@@ -102,11 +102,35 @@
- * SUCH DAMAGE.
- */
-
-+#include <sys/cdefs.h>
-+#ifndef lint
-+#if 0
-+static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94";
-+#else
-+__RCSID("$NetBSD: cmds.c,v 1.100 2002/11/30 03:10:55 lukem Exp $");
-+#endif
-+#endif /* not lint */
-+
- /*
- * FTP User Program -- Command Routines.
- */
--
--#include "lukemftp.h"
-+#include <sys/types.h>
-+#include <sys/socket.h>
-+#include <sys/stat.h>
-+#include <sys/wait.h>
-+#include <arpa/ftp.h>
-+
-+#include <ctype.h>
-+#include <err.h>
-+#include <glob.h>
-+#include <limits.h>
-+#include <netdb.h>
-+#include <paths.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <time.h>
-+#include <unistd.h>
-
- #include "ftp_var.h"
- #include "version.h"
-@@ -1008,7 +1032,7 @@
- gatemode = 0;
- else {
- if (argc == 3)
-- gateport = strdup(argv[2]);
-+ gateport = xstrdup(argv[2]);
- (void)strlcpy(gsbuf, argv[1], sizeof(gsbuf));
- gateserver = gsbuf;
- gatemode = 1;
-diff -Nru src/cmdtab.c /home/spock/ftp/cmdtab.c
---- src/cmdtab.c Sat Jun 15 05:40:33 2002
-+++ /home/spock/ftp/cmdtab.c Thu Jun 12 02:02:10 2003
-@@ -1,4 +1,4 @@
--/* $NetBSD: cmdtab.c,v 1.39 2000/11/15 00:10:59 lukem Exp $ */
-+/* $NetBSD: cmdtab.c,v 1.40 2002/07/29 04:24:47 lukem Exp $ */
-
- /*-
- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
-@@ -69,8 +69,16 @@
- * SUCH DAMAGE.
- */
-
--#include "lukemftp.h"
-+#include <sys/cdefs.h>
-+#ifndef lint
-+#if 0
-+static char sccsid[] = "@(#)cmdtab.c 8.4 (Berkeley) 10/9/94";
-+#else
-+__RCSID("$NetBSD: cmdtab.c,v 1.40 2002/07/29 04:24:47 lukem Exp $");
-+#endif
-+#endif /* not lint */
-
-+#include <stdio.h>
- #include "ftp_var.h"
-
- /*
-@@ -123,7 +131,7 @@
- char ntranshelp[] = "set translation table for default file name mapping";
- char optshelp[] = "show or set options for remote commands";
- char pagehelp[] = "view a remote file through your pager";
--char passivehelp[] = "enter passive transfer mode";
-+char passivehelp[] = "toggle use of passive transfer mode";
- char plshelp[] = "list contents of remote path through your pager";
- char pmlsdhelp[] = "list contents of remote directory in a machine "
- "parsable form through your pager";
-diff -Nru src/complete.c /home/spock/ftp/complete.c
---- src/complete.c Thu Jul 19 12:26:13 2001
-+++ /home/spock/ftp/complete.c Thu Jun 12 02:02:10 2003
-@@ -36,11 +36,23 @@
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-+#include <sys/cdefs.h>
-+#ifndef lint
-+__RCSID("$NetBSD: complete.c,v 1.38 2000/05/01 10:35:17 lukem Exp $");
-+#endif /* not lint */
-+
- /*
- * FTP user program - command and file completion routines
- */
-
--#include "lukemftp.h"
-+#include <sys/stat.h>
-+
-+#include <ctype.h>
-+#include <err.h>
-+#include <dirent.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-
- #include "ftp_var.h"
-
-diff -Nru src/domacro.c /home/spock/ftp/domacro.c
---- src/domacro.c Sat Jun 15 05:40:33 2002
-+++ /home/spock/ftp/domacro.c Thu Jun 12 02:02:10 2003
-@@ -33,7 +33,18 @@
- * SUCH DAMAGE.
- */
-
--#include "lukemftp.h"
-+#include <sys/cdefs.h>
-+#ifndef lint
-+#if 0
-+static char sccsid[] = "@(#)domacro.c 8.3 (Berkeley) 4/2/94";
-+#else
-+__RCSID("$NetBSD: domacro.c,v 1.19 2002/02/01 05:04:43 itojun Exp $");
-+#endif
-+#endif /* not lint */
-+
-+#include <ctype.h>
-+#include <stdio.h>
-+#include <string.h>
-
- #include "ftp_var.h"
-
-diff -Nru src/extern.h /home/spock/ftp/extern.h
---- src/extern.h Sat Jun 15 05:40:33 2002
-+++ /home/spock/ftp/extern.h Thu Jun 12 02:02:10 2003
-@@ -1,7 +1,7 @@
--/* $NetBSD: extern.h,v 1.60 2000/10/11 14:46:03 is Exp $ */
-+/* $NetBSD: extern.h,v 1.61 2003/01/21 16:08:07 jhawk Exp $ */
-
- /*-
-- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
-+ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
-@@ -110,7 +110,6 @@
- void abortxfer(int);
- void account(int, char **);
- void ai_unmapped(struct addrinfo *);
--void alarmtimer(int);
- int another(int *, char ***, const char *);
- int auto_fetch(int, char **);
- int auto_put(int, char **, const char *);
-@@ -123,7 +122,7 @@
- void cmdtimeout(int);
- void cmdscanner(void);
- int command(const char *, ...)
-- ;
-+ __attribute__((__format__(__printf__, 1, 2)));
- #ifndef NO_EDITCOMPLETE
- unsigned char complete(EditLine *, int);
- void controlediting(void);
-@@ -183,14 +182,11 @@
- void page(int, char **);
- int parseport(const char *, int);
- int parserate(int, char **, int);
--void progressmeter(int);
- char *prompt(void);
- void proxabort(int);
- void proxtrans(const char *, const char *, const char *);
- void psabort(int);
--void psummary(int);
- void pswitch(int);
--void ptransfer(int);
- void put(int, char **);
- void pwd(int, char **);
- void quit(int, char **);
-@@ -263,5 +259,3 @@
- StringList *xsl_init(void);
- void xsl_add(StringList *, char *);
- char *xstrdup(const char *);
--sigfunc xsignal(int, sigfunc);
--sigfunc xsignal_restart(int, sigfunc, int);
-diff -Nru src/fetch.c /home/spock/ftp/fetch.c
---- src/fetch.c Sun Feb 16 14:45:52 2003
-+++ /home/spock/ftp/fetch.c Thu Jun 12 02:02:11 2003
-@@ -1,7 +1,7 @@
--/* $NetBSD: fetch.c,v 1.136 2002/06/05 10:20:48 lukem Exp $ */
-+/* $NetBSD: fetch.c,v 1.141 2003/05/14 14:31:00 wiz Exp $ */
-
- /*-
-- * Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
-+ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
-@@ -39,11 +39,36 @@
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-+#include <sys/cdefs.h>
-+#ifndef lint
-+__RCSID("$NetBSD: fetch.c,v 1.141 2003/05/14 14:31:00 wiz Exp $");
-+#endif /* not lint */
-+
- /*
- * FTP User Program -- Command line file retrieval
- */
-
--#include "lukemftp.h"
-+#include <sys/types.h>
-+#include <sys/param.h>
-+#include <sys/socket.h>
-+#include <sys/stat.h>
-+#include <sys/time.h>
-+
-+#include <netinet/in.h>
-+
-+#include <arpa/ftp.h>
-+#include <arpa/inet.h>
-+
-+#include <ctype.h>
-+#include <err.h>
-+#include <errno.h>
-+#include <netdb.h>
-+#include <fcntl.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <unistd.h>
-+#include <time.h>
-
- #include "ftp_var.h"
- #include "version.h"
-@@ -155,7 +180,7 @@
- *response = (char *)xmalloc(rlen);
- (void)strlcpy(*response, scheme, rlen);
- len = strlcat(*response, " ", rlen);
-- base64_encode(clear, clen, *response + len);
-+ base64_encode(clear, clen, (u_char *)*response + len);
- memset(clear, 0, clen);
- rval = 0;
-
-@@ -235,12 +260,12 @@
- * XXX: this is not totally RFC 1738 compliant; <path> will have the
- * leading `/' unless it's an ftp:// URL, as this makes things easier
- * for file:// and http:// URLs. ftp:// URLs have the `/' between the
-- * host and the url-path removed, but any additional leading slashes
-- * in the url-path are retained (because they imply that we should
-+ * host and the URL-path removed, but any additional leading slashes
-+ * in the URL-path are retained (because they imply that we should
- * later do "CWD" with a null argument).
- *
- * Examples:
-- * input url output path
-+ * input URL output path
- * --------- -----------
- * "ftp://host" NULL
- * "http://host/" NULL
-@@ -484,7 +509,8 @@
- rval = fetch_ftp(url);
- goto cleanup_fetch_url;
- }
-- warnx("Invalid URL (no file after directory) `%s'", url);
-+ warnx("no file after directory (you must specify an "
-+ "output file) `%s'", url);
- goto cleanup_fetch_url;
- } else {
- if (debug)
-@@ -1372,7 +1398,7 @@
- dir ? dir : "<null>", file ? file : "<null>");
-
- dirhasglob = filehasglob = 0;
-- if (doglob && (urltype == CLASSIC_URL_T || urltype == FTP_URL_T)) {
-+ if (doglob && urltype == CLASSIC_URL_T) {
- if (! EMPTYSTRING(dir) && strpbrk(dir, "*?[]{}") != NULL)
- dirhasglob = 1;
- if (! EMPTYSTRING(file) && strpbrk(file, "*?[]{}") != NULL)
-@@ -1741,7 +1767,7 @@
- }
- }
- if (debug)
-- fprintf(ttyout, "auto_put: url `%s' argv[2] `%s'\n",
-+ fprintf(ttyout, "auto_put: URL `%s' argv[2] `%s'\n",
- path, uargv[2] ? uargv[2] : "<null>");
-
- /* connect and cwd */
-diff -Nru src/ftp.1 /home/spock/ftp/ftp.1
---- src/ftp.1 Sat Jun 15 05:40:35 2002
-+++ /home/spock/ftp/ftp.1 Thu Jun 12 02:02:11 2003
-@@ -1,6 +1,6 @@
--.\" $NetBSD: ftp.1,v 1.83 2002/06/05 10:20:48 lukem Exp $
-+.\" $NetBSD: ftp.1,v 1.94 2003/05/14 14:31:00 wiz Exp $
- .\"
--.\" Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
-+.\" Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
- .\" All rights reserved.
- .\"
- .\" This code is derived from software contributed to The NetBSD Foundation
-@@ -68,7 +68,7 @@
- .\"
- .\" @(#)ftp.1 8.3 (Berkeley) 10/9/94
- .\"
--.Dd May 18, 2002
-+.Dd January 20, 2003
- .Dt FTP 1
- .Os
- .Sh NAME
-@@ -76,7 +76,7 @@
- .Nd
- Internet file transfer program
- .Sh SYNOPSIS
--.Nm ""
-+.Nm
- .Op Fl 46AadefginpRtvV
- .Bk -words
- .Op Fl N Ar netrc
-@@ -88,46 +88,81 @@
- .Op Fl P Ar port
- .Ek
- .Bk -words
-+.Op Fl q Ar quittime
-+.Ek
-+.Bk -words
- .Op Fl r Ar retry
- .Ek
- .Bk -words
-+.\" [-T dir,max[,inc]]
- .Oo
--.Fl T
-+.Fl T Xo
- .Sm off
--.Xo
- .Ar dir ,
- .Ar max
- .Op , Ar inc
--.Xc
- .Sm on
-+.Xc
- .Oc
- .Ek
- .Bk -words
-+.\" [[user@]host [port]]
- .Oo
--[\fIuser\fR@]\fIhost\fR
-+.Oo Ar user Ns Li \&@ Oc Ns Ar host
- .Op Ar port
- .Oc
- .Ek
- .Bk -words
--[\fIuser\fR@]\fIhost\fR:[\fIpath\fR][/]
-+.\" [[user@]host:[path][/]]
-+.Sm off
-+.Oo
-+.Op Ar user Li \&@
-+.Ar host Li \&:
-+.Op Ar path
-+.Op Li /
-+.Oc
-+.Sm on
- .Ek
- .Bk -words
--.Op file:///\fIpath\fR
-+.\" [file:///path]
-+.Sm off
-+.Oo
-+.Li file:/// Ar path
-+.Oc
-+.Sm on
- .Ek
- .Bk -words
--.Op ftp://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR[/]
-+.\" [ftp://[user[:password]@]host[:port]/path[/]]
-+.Sm off
-+.Oo
-+.Li ftp://
-+.Oo Ar user
-+.Op Li \&: Ar password
-+.Li \&@ Oc
-+.Ar host Oo Li \&: Ar port Oc
-+.Li / Ar path
-+.Op Li /
-+.Op Li ;type= Ar X
-+.Oc
-+.Sm on
- .Ek
- .Bk -words
--.Op http://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR
-+.\" [http://[user[:password]@]host[:port]/path]
-+.Sm off
-+.Oo
-+.Li http://
-+.Oo Ar user
-+.Op Li \&: Ar password
-+.Li \&@ Oc
-+.Ar host Oo Li \&: Ar port Oc
-+.Li / Ar path
-+.Oc
-+.Sm on
- .Ek
- .Op Ar \&.\&.\&.
--.Nm ""
--.Fl u Ar url
--.\".Ar ftp://[\fIuser\fR[:\fIpassword\fR]@]\fIhost\fR[:\fIport\fR]/\fIpath\fR[/[file]]
--.\"|
--.\".Ar [\fIuser\fR@]\fIhost\fR:[\fIpath\fR][/[\fIfile\fR]]
-+.Nm
- .Bk -words
--file
-+.Fl u Ar URL Ar file
- .Ek
- .Op Ar \&.\&.\&.
- .Sh DESCRIPTION
-@@ -243,6 +278,10 @@
- Retry the connection attempt if it failed, pausing for
- .Ar wait
- seconds.
-+.It Fl q Ar quittime
-+Quit if the connection has stalled for
-+.Ar quittime
-+seconds.
- .It Fl R
- Restart all non-proxied auto-fetches.
- .It Fl t
-@@ -266,11 +305,11 @@
- Refer to
- .Ic rate
- for more information.
--.It Fl u Ar url file Op \&.\&.\&.
-+.It Fl u Ar URL file Op \&.\&.\&.
- Upload files on the command line to
--.Ar url
-+.Ar URL
- where
--.Ar url
-+.Ar URL
- is one of the ftp URL types as supported by auto-fetch
- (with an optional target filename for single file uploads), and
- .Ar file
-@@ -869,7 +908,7 @@
- .Tn FTP
- server at that port.
- If the
--.Ic auto-login
-+.Ic "set auto-login"
- option is on (default),
- .Nm
- will also attempt to automatically log the user in to
-@@ -882,10 +921,10 @@
- and display with the program specified by the
- .Ic "set pager"
- option.
--.It Ic passive Op Ic auto
-+.It Ic passive Op Cm auto
- Toggle passive mode (if no arguments are given).
- If
--.Ic auto
-+.Cm auto
- is given, act as if
- .Ev FTPMODE
- is set to
-@@ -896,14 +935,17 @@
- .Dv PASV
- command for all data connections instead of a
- .Dv PORT
--command. The
-+command.
-+The
- .Dv PASV
- command requests that the remote server open a port for the data connection
--and return the address of that port. The remote server listens on that
--port and the client connects to it. When using the more traditional
-+and return the address of that port.
-+The remote server listens on that port and the client connects to it.
-+When using the more traditional
- .Dv PORT
- command, the client listens on a port and sends that address to the remote
--server, who connects back to it. Passive mode is useful when using
-+server, who connects back to it.
-+Passive mode is useful when using
- .Nm
- through a gateway router or host that controls the directionality of
- traffic.
-@@ -965,34 +1007,34 @@
- .Pp
- When prompting is on, the following commands are available at a prompt:
- .Bl -tag -width 2n -offset indent
--.It Ic a
-+.It Cm a
- Answer
- .Sq yes
- to the current file, and automatically answer
- .Sq yes
- to any remaining files for the current command.
--.It Ic n
-+.It Cm n
- Answer
- .Sq no ,
- and do not transfer the file.
--.It Ic p
-+.It Cm p
- Answer
- .Sq yes
- to the current file, and turn off prompt mode
- (as is
- .Dq prompt off
- had been given).
--.It Ic q
-+.It Cm q
- Terminate the current operation.
--.It Ic y
-+.It Cm y
- Answer
- .Sq yes ,
- and transfer the file.
--.It Ic ?
-+.It Cm ?
- Display a help message.
- .El
- .Pp
--Any other reponse will answer
-+Any other response will answer
- .Sq yes
- to the current file.
- .It Ic proxy Ar ftp-command
-@@ -1072,11 +1114,11 @@
- .Ar direction
- may be one of:
- .Bl -tag -width "all" -offset indent -compact
--.It Ic all
-+.It Cm all
- Both directions.
--.It Ic get
-+.It Cm get
- Incoming transfers.
--.It Ic put
-+.It Cm put
- Outgoing transfers.
- .El
- .Pp
-@@ -1240,7 +1282,7 @@
- implementations which do ignore
- .Dv PORT
- commands but, incorrectly, indicate they've been accepted.
--.It Ic set Op Ar "option value"
-+.It Ic set Op Ar option Ar value
- Set
- .Ar option
- to
-@@ -1252,25 +1294,25 @@
- are not given, display all of the options and their values.
- The currently supported options are:
- .Bl -tag -width "http_proxy" -offset indent
--.It anonpass
-+.It Cm anonpass
- Defaults to
- .Ev $FTPANONPASS
--.It ftp_proxy
-+.It Cm ftp_proxy
- Defaults to
- .Ev $ftp_proxy .
--.It http_proxy
-+.It Cm http_proxy
- Defaults to
- .Ev $http_proxy .
--.It no_proxy
-+.It Cm no_proxy
- Defaults to
- .Ev $no_proxy .
--.It pager
-+.It Cm pager
- Defaults to
- .Ev $PAGER .
--.It prompt
-+.It Cm prompt
- Defaults to
- .Ev $FTPPROMPT .
--.It rprompt
-+.It Cm rprompt
- Defaults to
- .Ev $FTPRPROMPT .
- .El
-@@ -1415,13 +1457,14 @@
- interpretation of the argument.
- Supported suffixes are:
- .Bl -tag -width 3n -offset indent -compact
--.It b
--Causes no modification. (Optional)
--.It k
-+.It Li b
-+Causes no modification.
-+(Optional)
-+.It Li k
- Kilo; multiply the argument by 1024
--.It m
-+.It Li m
- Mega; multiply the argument by 1048576
--.It g
-+.It Li g
- Giga; multiply the argument by 1073741824
- .El
- .Pp
-@@ -1447,7 +1490,15 @@
- .Pp
- The following formats are valid syntax for an auto-fetch element:
- .Bl -tag -width "FOO "
--.It [user@]host:[path][/]
-+.\" [user@]host:[path][/]
-+.It Xo
-+.Sm off
-+.Op Ar user Li \&@
-+.Ar host Li \&:
-+.Op Ar path
-+.Op Li /
-+.Sm on
-+.Xc
- .Dq Classic
- .Tn FTP
- format.
-@@ -1471,7 +1522,19 @@
- in the current directory.
- Otherwise, the full remote name is used as the local name,
- relative to the local root directory.
--.It ftp://[user[:password]@]host[:port]/path[/][;type=X]
-+.\" ftp://[user[:password]@]host[:port]/path[/][;type=X]
-+.It Xo
-+.Sm off
-+.Li ftp://
-+.Oo Ar user
-+.Op Li \&: Ar password
-+.Li \&@ Oc
-+.Ar host Oo Li \&: Ar port Oc
-+.Li / Ar path
-+.Op Li /
-+.Op Li ;type= Ar X
-+.Sm on
-+.Xc
- An
- .Tn FTP
- URL, retrieved using the
-@@ -1493,15 +1556,94 @@
- .Ar password
- if supplied, otherwise prompt the user for one.
- .Pp
-+If a suffix of
-+.Sq ;type=A
-+or
-+.Sq ;type=I
-+is supplied, then the transfer type will take place as
-+ascii or binary (respectively).
-+The default transfer type is binary.
-+.Pp
- In order to be compliant with
- .Cm RFC 1738 ,
- .Nm
--strips the leading
--.Sq /
--from
-+interprets the
-+.Ar path
-+part of an
-+.Dq ftp://
-+auto-fetch URL as follows:
-+.Bl -bullet
-+.It
-+The
-+.Sq Li /
-+immediately after the
-+.Ar host Ns Oo Li \&: Ns Ar port Oc
-+is interpreted as a separator before the
-+.Ar path ,
-+and not as part of the
-+.Ar path
-+itself.
-+.It
-+The
-+.Ar path
-+is interpreted as a
-+.So Li / Sc Ns -separated
-+list of name components.
-+For all but the last such component,
-+.Nm
-+performs the equivalent of a
-+.Ic cd
-+command.
-+For the last path component,
-+.Nm
-+performs the equivalent of a
-+.Ic get
-+command.
-+.It
-+Empty name components,
-+which result from
-+.Sq Li //
-+within the
-+.Ar path ,
-+or from an extra
-+.Sq Li /
-+at the beginning of the
- .Ar path ,
--resulting in a transfer relative from the default login directory of
--the user.
-+will cause the equivalent of a
-+.Ic cd
-+command without a directory name.
-+This is unlikely to be useful.
-+.It
-+Any
-+.Sq Li \&% Ns Ar XX
-+codes within the path components are decoded, with
-+.Ar XX
-+representing a character code in hexadecimal.
-+This decoding takes place after the
-+.Ar path
-+has been split into components,
-+but before each component is used in the equivalent of a
-+.Ic cd
-+or
-+.Ic get
-+command.
-+Some often-used codes are
-+.Sq Li \&%2F
-+(which represents
-+.Sq Li / )
-+and
-+.Sq Li \&%7E
-+(which represents
-+.Sq Li ~ ) .
-+.El
-+.Pp
-+The above interpretation has the following consequences:
-+.Bl -bullet
-+.It
-+The path is interpreted relative to the
-+default login directory of the specified user or of the
-+.Sq anonymous
-+user.
- If the
- .Pa /
- directory is required, use a leading path of
-@@ -1519,15 +1661,57 @@
- .Sq mypass ,
- use
- .Dq ftp://myname:mypass@localhost/%2fetc/motd
--.Pp
--If a suffix of
--.Sq ;type=A
--or
--.Sq ;type=I
--is supplied, then the transfer type will take place as
--ascii or binary (respectively).
--The default transfer type is binary.
--.It http://[user[:password]@]host[:port]/path
-+.It
-+The exact
-+.Ic cd
-+and
-+.Ic get
-+commands can be controlled by careful choice of
-+where to use
-+.Sq /
-+and where to use
-+.Sq %2F
-+(or
-+.Sq %2f ) .
-+For example, the following URLs correspond to the
-+equivalents of the indicated commands:
-+.Bl -tag -width "ftp://host/%2Fdir1%2Fdir2%2Ffile"
-+.It ftp://host/dir1/dir2/file
-+.Dq "cd dir1" ,
-+.Dq "cd dir2" ,
-+.Dq "get file" .
-+.It ftp://host/%2Fdir1/dir2/file
-+.Dq "cd /dir1" ,
-+.Dq "cd dir2" ,
-+.Dq "get file" .
-+.It ftp://host/dir1%2Fdir2/file
-+.Dq "cd dir1/dir2" ,
-+.Dq "get file" .
-+.It ftp://host/%2Fdir1%2Fdir2/file
-+.Dq "cd /dir1/dir2" ,
-+.Dq "get file" .
-+.It ftp://host/dir1%2Fdir2%2Ffile
-+.Dq "get dir1/dir2/file" .
-+.It ftp://host/%2Fdir1%2Fdir2%2Ffile
-+.Dq "get /dir1/dir2/file" .
-+.El
-+.It
-+You must have appropriate access permission for each of the
-+intermediate directories that is used in the equivalent of a
-+.Ic cd
-+command.
-+.El
-+.\" http://[user[:password]@]host[:port]/path
-+.It Xo
-+.Sm off
-+.Li http://
-+.Oo Ar user
-+.Op Li \&: Ar password
-+.Li \&@ Oc
-+.Ar host Oo Li \&: Ar port Oc
-+.Li / Ar path
-+.Sm on
-+.Xc
- An
- .Tn HTTP
- URL, retrieved using the
-@@ -1540,16 +1724,22 @@
- proxy server.
- If
- .Tn HTTP
--authorisation is required to retrieve
-+authorization is required to retrieve
- .Ar path ,
- and
- .Sq user
- (and optionally
- .Sq password )
- is in the URL, use them for the first attempt to authenticate.
--.It file:///path
-+.\" file:///path
-+.It Xo
-+.Sm off
-+.Li file:/// Ar path
-+.Sm on
-+.Xc
- A local URL, copied from
--.Ar /path .
-+.Pa / Ns Ar path
-+on the local host.
- .El
- .Pp
- Unless noted otherwise above, and
-@@ -1736,7 +1926,7 @@
- .Nm
- supports only the default values for the remaining
- file transfer parameters:
--.Ic mode ,
-+.Ic mode ,
- .Ic form ,
- and
- .Ic struct .
-@@ -1841,6 +2031,14 @@
- .Ic init
- is defined, it is automatically executed as the last step in the
- auto-login process.
-+For example,
-+.Bd -literal -offset indent
-+default
-+macdef init
-+epsv4 off
-+.Ed
-+.Pp
-+followed by a blank line.
- .El
- .Sh COMMAND LINE EDITING
- .Nm
-@@ -1888,9 +2086,20 @@
- The following formatting sequences are replaced by the given
- information:
- .Bl -tag -width "%% " -offset indent
--.It %/
-+.It Li \&%/
- The current remote working directory.
--.It %c[[0]\fIn\fR], %.[[0]\fIn\fR]
-+.\" %c[[0]n], %.[[0]n]
-+.It Xo
-+.Sm off
-+.Li \&%c
-+.Op Oo Li 0 Oc Ar n
-+.Sm on
-+.No ,
-+.Sm off
-+.Li \&%.
-+.Op Oo Li 0 Oc Ar n
-+.Sm on
-+.Xc
- The trailing component of the current remote working directory, or
- .Em n
- trailing components if a digit
-@@ -1902,21 +2111,28 @@
- .Sq 0 ,
- the number of skipped components precede the trailing component(s) in
- the format
--.Dq /\fI\*[Lt]skipped\*[Gt]\fRtrailing
-+.\" ``/<number>trailing''
-+.Do
-+.Sm off
-+.Li / Li \*[Lt] Va number Li \*[Gt]
-+.Va trailing
-+.Sm on
-+.Dc
- (for
--.Sq %c )
-+.Sq \&%c )
- or
--.Dq ...trailing
-+.\" ``...trailing''
-+.Dq Li \&... Ns Va trailing
- (for
--.Sq %. ) .
--.It %M
-+.Sq \&%. ) .
-+.It Li \&%M
- The remote host name.
--.It %m
-+.It Li \&%m
- The remote host name, up to the first
- .Sq \&. .
--.It %n
-+.It Li \&%n
- The remote user name.
--.It %%
-+.It Li \&%%
- A single
- .Sq % .
- .El
-@@ -1934,15 +2150,15 @@
- Overrides the default operation mode.
- Support values are:
- .Bl -tag -width "passive"
--.It active
-+.It Cm active
- active mode
- .Tn FTP
- only
--.It auto
-+.It Cm auto
- automatic determination of passive or active (this is the default)
--.It gate
-+.It Cm gate
- gate-ftp mode
--.It passive
-+.It Cm passive
- passive mode
- .Tn FTP
- only
-@@ -2028,6 +2244,21 @@
- Each entry may have an optional trailing ":port", which restricts
- the matching to connections to that port.
- .El
-+.Sh EXTENDED PASSIVE MODE AND FIREWALLS
-+Some firewall configurations do not allow
-+.Nm
-+to use extended passive mode.
-+If you find that even a simple
-+.Ic ls
-+appears to hang after printing a message such as this:
-+.Pp
-+.Dl 229 Entering Extended Passive Mode (|||58551|)
-+.Pp
-+then you will need to disable extended passive mode with
-+.Ic epsv4 off .
-+See the above section
-+.Sx The .netrc File
-+for an example of how to make this automatic.
- .Sh SEE ALSO
- .Xr getservbyname 3 ,
- .Xr editrc 5 ,
-@@ -2061,7 +2292,9 @@
- were implemented in
- .Nx 1.3
- and later releases
--by Luke Mewburn \*[Lt]lukem@netbsd.org\*[Gt].
-+by
-+.An Luke Mewburn
-+.Aq lukem@NetBSD.org .
- .Pp
- IPv6 support was added by the WIDE/KAME project
- (but may not be present in all non-NetBSD versions of this program, depending
-diff -Nru src/ftp.c /home/spock/ftp/ftp.c
---- src/ftp.c Sat Jun 15 05:40:36 2002
-+++ /home/spock/ftp/ftp.c Thu Jun 12 02:02:11 2003
-@@ -98,9 +98,40 @@
- * SUCH DAMAGE.
- */
-
--#include "lukemftp.h"
-+#include <sys/cdefs.h>
-+#ifndef lint
-+#if 0
-+static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94";
-+#else
-+__RCSID("$NetBSD: ftp.c,v 1.120 2002/06/05 10:20:49 lukem Exp $");
-+#endif
-+#endif /* not lint */
-
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <sys/socket.h>
-+#include <sys/time.h>
-+
-+#include <netinet/in.h>
-+#include <netinet/in_systm.h>
-+#include <netinet/ip.h>
-+#include <arpa/inet.h>
-+#include <arpa/ftp.h>
- #include <arpa/telnet.h>
-+
-+#include <ctype.h>
-+#include <err.h>
-+#include <errno.h>
-+#include <netdb.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <time.h>
-+#include <unistd.h>
-+#include <stdarg.h>
-+#ifndef USE_SELECT
-+#include <poll.h>
-+#endif
-
- #include "ftp_var.h"
-
-diff -Nru src/ftp.cat1 /home/spock/ftp/ftp.cat1
---- src/ftp.cat1 Sat Jun 15 05:40:31 2002
-+++ /home/spock/ftp/ftp.cat1 Wed Dec 31 19:00:00 1969
-@@ -1,1055 +0,0 @@
--FTP(1) NetBSD Reference Manual FTP(1)
--
--NNAAMMEE
-- ffttpp - Internet file transfer program
--
--SSYYNNOOPPSSIISS
-- ffttpp [--4466AAaaddeeffggiinnppRRttvvVV] [--NN _n_e_t_r_c] [--oo _o_u_t_p_u_t] [--PP _p_o_r_t] [--rr _r_e_t_r_y] [--TT
-- _d_i_r,_m_a_x[,_i_n_c]] [[_u_s_e_r@]_h_o_s_t [_p_o_r_t]] [_u_s_e_r@]_h_o_s_t:[_p_a_t_h][/]
-- [file:///_p_a_t_h] [ftp://[_u_s_e_r[:_p_a_s_s_w_o_r_d]@]_h_o_s_t[:_p_o_r_t]/_p_a_t_h[/]]
-- [http://[_u_s_e_r[:_p_a_s_s_w_o_r_d]@]_h_o_s_t[:_p_o_r_t]/_p_a_t_h] [_._._.]
-- ffttpp --uu _u_r_l file [_._._.]
--
--DDEESSCCRRIIPPTTIIOONN
-- ffttpp is the user interface to the Internet standard File Transfer Proto-
-- col. The program allows a user to transfer files to and from a remote
-- network site.
--
-- The last five arguments will fetch a file using the FTP or HTTP proto-
-- cols, or by direct copying, into the current directory. This is ideal
-- for scripts. Refer to _A_U_T_O_-_F_E_T_C_H_I_N_G _F_I_L_E_S below for more information.
--
-- Options may be specified at the command line, or to the command inter-
-- preter.
--
-- --44 Forces ffttpp to only use IPv4 addresses.
--
-- --66 Forces ffttpp to only use IPv6 addresses.
--
-- --AA Force active mode ftp. By default, ffttpp will try to use passive
-- mode ftp and fall back to active mode if passive is not support-
-- ed by the server. This option causes ffttpp to always use an ac-
-- tive connection. It is only useful for connecting to very old
-- servers that do not implement passive mode properly.
--
-- --aa Causes ffttpp to bypass normal login procedure, and use an anony-
-- mous login instead.
--
-- --dd Enables debugging.
--
-- --ee Disables command line editing. This is useful for Emacs ange-
-- ftp mode.
--
-- --ff Forces a cache reload for transfers that go through the FTP or
-- HTTP proxies.
--
-- --gg Disables file name globbing.
--
-- --ii Turns off interactive prompting during multiple file transfers.
--
-- --nn Restrains ffttpp from attempting ``auto-login'' upon initial con-
-- nection. If auto-login is enabled, ffttpp will check the _._n_e_t_r_c
-- (see below) file in the user's home directory for an entry de-
-- scribing an account on the remote machine. If no entry exists,
-- ffttpp will prompt for the remote machine login name (default is
-- the user identity on the local machine), and, if necessary,
-- prompt for a password and an account with which to login.
--
-- --NN _n_e_t_r_c
-- Use _n_e_t_r_c instead of _~_/_._n_e_t_r_c. Refer to _T_H_E _._n_e_t_r_c _F_I_L_E for
-- more information.
--
-- --oo _o_u_t_p_u_t
-- When auto-fetching files, save the contents in _o_u_t_p_u_t. _o_u_t_p_u_t
-- is parsed according to the _F_I_L_E _N_A_M_I_N_G _C_O_N_V_E_N_T_I_O_N_S below. If
-- _o_u_t_p_u_t is not `-' or doesn't start with `|', then only the first
-- file specified will be retrieved into _o_u_t_p_u_t; all other files
-- will be retrieved into the basename of their remote name.
--
-- --pp Enable passive mode operation for use behind connection filter-
-- ing firewalls. This option has been deprecated as ffttpp now tries
-- to use passive mode by default, falling back to active mode if
-- the server does not support passive connections.
--
-- --PP _p_o_r_t Sets the port number to _p_o_r_t.
--
-- --rr _w_a_i_t Retry the connection attempt if it failed, pausing for _w_a_i_t sec-
-- onds.
--
-- --RR Restart all non-proxied auto-fetches.
--
-- --tt Enables packet tracing.
--
-- --TT _d_i_r_e_c_t_i_o_n,_m_a_x_i_m_u_m[,_i_n_c_r_e_m_e_n_t]
-- Set the maximum transfer rate for _d_i_r_e_c_t_i_o_n to _m_a_x_i_m_u_m
-- bytes/second, and if specified, the increment to _i_n_c_r_e_m_e_n_t
-- bytes/second. Refer to rraattee for more information.
--
-- --uu _u_r_l _f_i_l_e [...]
-- Upload files on the command line to _u_r_l where _u_r_l is one of the
-- ftp URL types as supported by auto-fetch (with an optional tar-
-- get filename for single file uploads), and _f_i_l_e is one or more
-- local files to be uploaded.
--
-- --vv Enable vveerrbboossee and pprrooggrreessss. This is the default if output is
-- to a terminal (and in the case of pprrooggrreessss, ffttpp is the fore-
-- ground process). Forces ffttpp to show all responses from the re-
-- mote server, as well as report on data transfer statistics.
--
-- --VV Disable vveerrbboossee and pprrooggrreessss, overriding the default of enabled
-- when output is to a terminal.
--
-- The client host with which ffttpp is to communicate may be specified on the
-- command line. If this is done, ffttpp will immediately attempt to establish
-- a connection to an FTP server on that host; otherwise, ffttpp will enter its
-- command interpreter and await instructions from the user. When ffttpp is
-- awaiting commands from the user the prompt `ftp>' is provided to the us-
-- er. The following commands are recognized by ffttpp:
--
-- !! [_c_o_m_m_a_n_d [_a_r_g_s]]
-- Invoke an interactive shell on the local machine. If there
-- are arguments, the first is taken to be a command to execute
-- directly, with the rest of the arguments as its arguments.
--
-- $$ _m_a_c_r_o_-_n_a_m_e [_a_r_g_s]
-- Execute the macro _m_a_c_r_o_-_n_a_m_e that was defined with the mmaaccddeeff
-- command. Arguments are passed to the macro unglobbed.
--
-- aaccccoouunntt [_p_a_s_s_w_d]
-- Supply a supplemental password required by a remote system
-- for access to resources once a login has been successfully
-- completed. If no argument is included, the user will be
-- prompted for an account password in a non-echoing input mode.
--
-- aappppeenndd _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e]
-- Append a local file to a file on the remote machine. If
-- _r_e_m_o_t_e_-_f_i_l_e is left unspecified, the local file name is used
-- in naming the remote file after being altered by any nnttrraannss
-- or nnmmaapp setting. File transfer uses the current settings for
-- ttyyppee, ffoorrmmaatt, mmooddee, and ssttrruuccttuurree.
--
-- aasscciiii Set the file transfer ttyyppee to network ASCII. This is the de-
-- fault type.
--
-- bbeellll Arrange that a bell be sounded after each file transfer com-
-- mand is completed.
--
-- bbiinnaarryy Set the file transfer ttyyppee to support binary image transfer.
--
-- bbyyee Terminate the FTP session with the remote server and exit
-- ffttpp. An end of file will also terminate the session and ex-
-- it.
--
-- ccaassee Toggle remote computer file name case mapping during ggeett,
-- mmggeett and mmppuutt commands. When ccaassee is on (default is off),
-- remote computer file names with all letters in upper case are
-- written in the local directory with the letters mapped to
-- lower case.
--
-- ccdd _r_e_m_o_t_e_-_d_i_r_e_c_t_o_r_y
-- Change the working directory on the remote machine to _r_e_m_o_t_e_-
-- _d_i_r_e_c_t_o_r_y.
--
-- ccdduupp Change the remote machine working directory to the parent of
-- the current remote machine working directory.
--
-- cchhmmoodd _m_o_d_e _r_e_m_o_t_e_-_f_i_l_e
-- Change the permission modes of the file _r_e_m_o_t_e_-_f_i_l_e on the
-- remote system to _m_o_d_e.
--
-- cclloossee Terminate the FTP session with the remote server, and return
-- to the command interpreter. Any defined macros are erased.
--
-- ccrr Toggle carriage return stripping during ascii type file re-
-- trieval. Records are denoted by a carriage return/linefeed
-- sequence during ascii type file transfer. When ccrr is on (the
-- default), carriage returns are stripped from this sequence to
-- conform with the UNIX single linefeed record delimiter.
-- Records on non-UNIX remote systems may contain single line-
-- feeds; when an ascii type transfer is made, these linefeeds
-- may be distinguished from a record delimiter only when ccrr is
-- off.
--
-- ddeebbuugg [_d_e_b_u_g_-_v_a_l_u_e]
-- Toggle debugging mode. If an optional _d_e_b_u_g_-_v_a_l_u_e is speci-
-- fied it is used to set the debugging level. When debugging
-- is on, ffttpp prints each command sent to the remote machine,
-- preceded by the string `-->'
--
-- ddeelleettee _r_e_m_o_t_e_-_f_i_l_e
-- Delete the file _r_e_m_o_t_e_-_f_i_l_e on the remote machine.
--
-- ddiirr [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]]
-- Print a listing of the contents of a directory on the remote
-- machine. The listing includes any system-dependent informa-
-- tion that the server chooses to include; for example, most
-- UNIX systems will produce output from the command `ls -l'.
-- If _r_e_m_o_t_e_-_p_a_t_h is left unspecified, the current working di-
-- rectory is used. If interactive prompting is on, ffttpp will
-- prompt the user to verify that the last argument is indeed
-- the target local file for receiving ddiirr output. If no local
-- file is specified, or if _l_o_c_a_l_-_f_i_l_e is `--', the output is
-- sent to the terminal.
--
-- ddiissccoonnnneecctt A synonym for cclloossee.
--
-- eeddiitt Toggle command line editing, and context sensitive command
-- and file completion. This is automatically enabled if input
-- is from a terminal, and disabled otherwise.
--
-- eeppssvv44 Toggle the use of the extended EPSV and EPRT commands on IPv4
-- connections; first try EPSV / EPRT, and then PASV / PORT.
-- This is enabled by default. If an extended command fails
-- then this option will be temporarily disabled for the dura-
-- tion of the current connection, or until eeppssvv44 is executed
-- again.
--
-- eexxiitt A synonym for bbyyee.
--
-- ffeeaattuurreess Display what features the remote server supports (using the
-- FEAT command).
--
-- ffggeett _l_o_c_a_l_f_i_l_e
-- Retrieve the files listed in _l_o_c_a_l_f_i_l_e, which has one line
-- per filename.
--
-- ffoorrmm _f_o_r_m_a_t
-- Set the file transfer ffoorrmm to _f_o_r_m_a_t. The default (and only
-- supported) format is ``non-print''.
--
-- ffttpp _h_o_s_t [_p_o_r_t]
-- A synonym for ooppeenn.
--
-- ggaattee [_h_o_s_t [_p_o_r_t]]
-- Toggle gate-ftp mode, which used to connect through the TIS
-- FWTK and Gauntlet ftp proxies. This will not be permitted if
-- the gate-ftp server hasn't been set (either explicitly by the
-- user, or from the FTPSERVER environment variable). If _h_o_s_t
-- is given, then gate-ftp mode will be enabled, and the gate-
-- ftp server will be set to _h_o_s_t. If _p_o_r_t is also given, that
-- will be used as the port to connect to on the gate-ftp serv-
-- er.
--
-- ggeett _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
-- Retrieve the _r_e_m_o_t_e_-_f_i_l_e and store it on the local machine.
-- If the local file name is not specified, it is given the same
-- name it has on the remote machine, subject to alteration by
-- the current ccaassee, nnttrraannss, and nnmmaapp settings. The current
-- settings for ttyyppee, ffoorrmm, mmooddee, and ssttrruuccttuurree are used while
-- transferring the file.
--
-- gglloobb Toggle filename expansion for mmddeelleettee, mmggeett, mmppuutt, and
-- mmrreeggeett. If globbing is turned off with gglloobb, the file name
-- arguments are taken literally and not expanded. Globbing for
-- mmppuutt is done as in csh(1). For mmddeelleettee, mmggeett, and mmrreeggeett,
-- each remote file name is expanded separately on the remote
-- machine and the lists are not merged. Expansion of a direc-
-- tory name is likely to be different from expansion of the
-- name of an ordinary file: the exact result depends on the
-- foreign operating system and ftp server, and can be previewed
-- by doing `mls remote-files -' Note: mmggeett, mmppuutt and mmrreeggeett are
-- not meant to transfer entire directory subtrees of files.
-- That can be done by transferring a tar(1) archive of the sub-
-- tree (in binary mode).
--
-- hhaasshh [_s_i_z_e]
-- Toggle hash-sign (``#'') printing for each data block trans-
-- ferred. The size of a data block defaults to 1024 bytes.
-- This can be changed by specifying _s_i_z_e in bytes. Enabling
-- hhaasshh disables pprrooggrreessss.
--
-- hheellpp [_c_o_m_m_a_n_d]
-- Print an informative message about the meaning of _c_o_m_m_a_n_d.
-- If no argument is given, ffttpp prints a list of the known com-
-- mands.
--
-- iiddllee [_s_e_c_o_n_d_s]
-- Set the inactivity timer on the remote server to _s_e_c_o_n_d_s sec-
-- onds. If _s_e_c_o_n_d_s is omitted, the current inactivity timer is
-- printed.
--
-- iimmaaggee A synonym for bbiinnaarryy.
--
-- llccdd [_d_i_r_e_c_t_o_r_y]
-- Change the working directory on the local machine. If no
-- _d_i_r_e_c_t_o_r_y is specified, the user's home directory is used.
--
-- lleessss _f_i_l_e A synonym for ppaaggee.
--
-- llppaaggee _l_o_c_a_l_-_f_i_l_e
-- Display _l_o_c_a_l_-_f_i_l_e with the program specified by the sseett
-- ppaaggeerr option.
--
-- llppwwdd Print the working directory on the local machine.
--
-- llss [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]]
-- A synonym for ddiirr.
--
-- mmaaccddeeff _m_a_c_r_o_-_n_a_m_e
-- Define a macro. Subsequent lines are stored as the macro
-- _m_a_c_r_o_-_n_a_m_e; a null line (consecutive newline characters in a
-- file or carriage returns from the terminal) terminates macro
-- input mode. There is a limit of 16 macros and 4096 total
-- characters in all defined macros. Macros remain defined un-
-- til a cclloossee command is executed. The macro processor inter-
-- prets `$' and `\' as special characters. A `$' followed by a
-- number (or numbers) is replaced by the corresponding argument
-- on the macro invocation command line. A `$' followed by an
-- `i' signals that macro processor that the executing macro is
-- to be looped. On the first pass `$i' is replaced by the
-- first argument on the macro invocation command line, on the
-- second pass it is replaced by the second argument, and so on.
-- A `\' followed by any character is replaced by that charac-
-- ter. Use the `\' to prevent special treatment of the `$'.
--
-- mmddeelleettee [_r_e_m_o_t_e_-_f_i_l_e_s]
-- Delete the _r_e_m_o_t_e_-_f_i_l_e_s on the remote machine.
--
-- mmddiirr _r_e_m_o_t_e_-_f_i_l_e_s _l_o_c_a_l_-_f_i_l_e
-- Like ddiirr, except multiple remote files may be specified. If
-- interactive prompting is on, ffttpp will prompt the user to ver-
-- ify that the last argument is indeed the target local file
-- for receiving mmddiirr output.
--
-- mmggeett _r_e_m_o_t_e_-_f_i_l_e_s
-- Expand the _r_e_m_o_t_e_-_f_i_l_e_s on the remote machine and do a ggeett
-- for each file name thus produced. See gglloobb for details on
-- the filename expansion. Resulting file names will then be
-- processed according to ccaassee, nnttrraannss, and nnmmaapp settings.
-- Files are transferred into the local working directory, which
-- can be changed with `lcd directory'; new local directories
-- can be created with `! mkdir directory'.
--
-- mmkkddiirr _d_i_r_e_c_t_o_r_y_-_n_a_m_e
-- Make a directory on the remote machine.
--
-- mmllss _r_e_m_o_t_e_-_f_i_l_e_s _l_o_c_a_l_-_f_i_l_e
-- Like llss, except multiple remote files may be specified, and
-- the _l_o_c_a_l_-_f_i_l_e must be specified. If interactive prompting
-- is on, ffttpp will prompt the user to verify that the last argu-
-- ment is indeed the target local file for receiving mmllss out-
-- put.
--
-- mmllssdd [_r_e_m_o_t_e_-_p_a_t_h]
-- Display the contents of _r_e_m_o_t_e_-_p_a_t_h (which should default to
-- the current directory if not given) in a machine-parsable
-- form, using MLSD. The format of display can be changed with
-- `remopts mlst ...'.
--
-- mmllsstt [_r_e_m_o_t_e_-_p_a_t_h]
-- Display the details about _r_e_m_o_t_e_-_p_a_t_h (which should default
-- to the current directory if not given) in a machine-parsable
-- form, using MLST. The format of display can be changed with
-- `remopts mlst ...'.
--
-- mmooddee _m_o_d_e_-_n_a_m_e
-- Set the file transfer mmooddee to _m_o_d_e_-_n_a_m_e. The default (and
-- only supported) mode is ``stream''.
--
-- mmooddttiimmee _r_e_m_o_t_e_-_f_i_l_e
-- Show the last modification time of the file on the remote ma-
-- chine.
--
-- mmoorree _f_i_l_e A synonym for ppaaggee.
--
-- mmppuutt _l_o_c_a_l_-_f_i_l_e_s
-- Expand wild cards in the list of local files given as argu-
-- ments and do a ppuutt for each file in the resulting list. See
-- gglloobb for details of filename expansion. Resulting file names
-- will then be processed according to nnttrraannss and nnmmaapp settings.
--
-- mmrreeggeett _r_e_m_o_t_e_-_f_i_l_e_s
-- As per mmggeett, but performs a rreeggeett instead of ggeett.
--
-- mmsseenndd _l_o_c_a_l_-_f_i_l_e_s
-- A synonym for mmppuutt.
--
-- nneewweerr _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
-- Get the file only if the modification time of the remote file
-- is more recent that the file on the current system. If the
-- file does not exist on the current system, the remote file is
-- considered nneewweerr. Otherwise, this command is identical to
-- _g_e_t.
--
-- nnlliisstt [_r_e_m_o_t_e_-_p_a_t_h [_l_o_c_a_l_-_f_i_l_e]]
-- A synonym for llss.
--
-- nnmmaapp [_i_n_p_a_t_t_e_r_n _o_u_t_p_a_t_t_e_r_n]
-- Set or unset the filename mapping mechanism. If no arguments
-- are specified, the filename mapping mechanism is unset. If
-- arguments are specified, remote filenames are mapped during
-- mmppuutt commands and ppuutt commands issued without a specified re-
-- mote target filename. If arguments are specified, local
-- filenames are mapped during mmggeett commands and ggeett commands
-- issued without a specified local target filename. This com-
-- mand is useful when connecting to a non-UNIX remote computer
-- with different file naming conventions or practices. The
-- mapping follows the pattern set by _i_n_p_a_t_t_e_r_n and _o_u_t_p_a_t_t_e_r_n.
-- [_I_n_p_a_t_t_e_r_n] is a template for incoming filenames (which may
-- have already been processed according to the nnttrraannss and ccaassee
-- settings). Variable templating is accomplished by including
-- the sequences `$1', `$2', ..., `$9' in _i_n_p_a_t_t_e_r_n. Use `\' to
-- prevent this special treatment of the `$' character. All
-- other characters are treated literally, and are used to de-
-- termine the nnmmaapp [_i_n_p_a_t_t_e_r_n] variable values. For example,
-- given _i_n_p_a_t_t_e_r_n $1.$2 and the remote file name "mydata.data",
-- $1 would have the value "mydata", and $2 would have the value
-- "data". The _o_u_t_p_a_t_t_e_r_n determines the resulting mapped file-
-- name. The sequences `$1', `$2', ...., `$9' are replaced by
-- any value resulting from the _i_n_p_a_t_t_e_r_n template. The se-
-- quence `$0' is replace by the original filename. Additional-
-- ly, the sequence `[_s_e_q_1, _s_e_q_2]' is replaced by [_s_e_q_1] if _s_e_q_1
-- is not a null string; otherwise it is replaced by _s_e_q_2. For
-- example, the command
--
-- nmap $1.$2.$3 [$1,$2].[$2,file]
--
-- would yield the output filename "myfile.data" for input file-
-- names "myfile.data" and "myfile.data.old", "myfile.file" for
-- the input filename "myfile", and "myfile.myfile" for the in-
-- put filename ".myfile". Spaces may be included in
-- _o_u_t_p_a_t_t_e_r_n, as in the example: `nmap $1 sed "s/ *$//" > $1'
-- . Use the `\' character to prevent special treatment of the
-- `$','[',']', and `,' characters.
--
-- nnttrraannss [_i_n_c_h_a_r_s [_o_u_t_c_h_a_r_s]]
-- Set or unset the filename character translation mechanism.
-- If no arguments are specified, the filename character trans-
-- lation mechanism is unset. If arguments are specified, char-
-- acters in remote filenames are translated during mmppuutt com-
-- mands and ppuutt commands issued without a specified remote tar-
-- get filename. If arguments are specified, characters in lo-
-- cal filenames are translated during mmggeett commands and ggeett
-- commands issued without a specified local target filename.
-- This command is useful when connecting to a non-UNIX remote
-- computer with different file naming conventions or practices.
-- Characters in a filename matching a character in _i_n_c_h_a_r_s are
-- replaced with the corresponding character in _o_u_t_c_h_a_r_s. If
-- the character's position in _i_n_c_h_a_r_s is longer than the length
-- of _o_u_t_c_h_a_r_s, the character is deleted from the file name.
--
-- ooppeenn _h_o_s_t [_p_o_r_t]
-- Establish a connection to the specified _h_o_s_t FTP server. An
-- optional port number may be supplied, in which case, ffttpp will
-- attempt to contact an FTP server at that port. If the aauuttoo--
-- llooggiinn option is on (default), ffttpp will also attempt to auto-
-- matically log the user in to the FTP server (see below).
--
-- ppaaggee _f_i_l_e Retrieve ffiillee and display with the program specified by the
-- sseett ppaaggeerr option.
--
-- ppaassssiivvee [aauuttoo]
-- Toggle passive mode (if no arguments are given). If aauuttoo is
-- given, act as if FTPMODE is set to `auto'. If passive mode
-- is turned on (default), ffttpp will send a PASV command for all
-- data connections instead of a PORT command. The PASV command
-- requests that the remote server open a port for the data con-
-- nection and return the address of that port. The remote
-- server listens on that port and the client connects to it.
-- When using the more traditional PORT command, the client lis-
-- tens on a port and sends that address to the remote server,
-- who connects back to it. Passive mode is useful when using
-- ffttpp through a gateway router or host that controls the direc-
-- tionality of traffic. (Note that though FTP servers are re-
-- quired to support the PASV command by RFC 1123, some do not.)
--
-- ppddiirr [_r_e_m_o_t_e_-_p_a_t_h]
-- Perform ddiirr [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the
-- program specified by the sseett ppaaggeerr option.
--
-- ppllss [_r_e_m_o_t_e_-_p_a_t_h]
-- Perform llss [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the
-- program specified by the sseett ppaaggeerr option.
--
-- ppmmllssdd [_r_e_m_o_t_e_-_p_a_t_h]
-- Perform mmllssdd [_r_e_m_o_t_e_-_p_a_t_h], and display the result with the
-- program specified by the sseett ppaaggeerr option.
--
-- pprreesseerrvvee Toggle preservation of modification times on retrieved files.
--
-- pprrooggrreessss Toggle display of transfer progress bar. The progress bar
-- will be disabled for a transfer that has _l_o_c_a_l_-_f_i_l_e as `--' or
-- a command that starts with `|'. Refer to _F_I_L_E _N_A_M_I_N_G
-- _C_O_N_V_E_N_T_I_O_N_S for more information. Enabling pprrooggrreessss disables
-- hhaasshh.
--
-- pprroommpptt Toggle interactive prompting. Interactive prompting occurs
-- during multiple file transfers to allow the user to selec-
-- tively retrieve or store files. If prompting is turned off
-- (default is on), any mmggeett or mmppuutt will transfer all files,
-- and any mmddeelleettee will delete all files.
--
-- When prompting is on, the following commands are available at
-- a prompt:
--
-- aa Answer `yes' to the current file, and automatically
-- answer `yes' to any remaining files for the current
-- command.
--
-- nn Answer `no', and do not transfer the file.
--
-- pp Answer `yes' to the current file, and turn off
-- prompt mode (as is ``prompt off'' had been given).
--
-- qq Terminate the current operation.
--
-- yy Answer `yes', and transfer the file.
--
-- ?? Display a help message.
--
-- Any other reponse will answer `yes' to the current file.
--
-- pprrooxxyy _f_t_p_-_c_o_m_m_a_n_d
-- Execute an ftp command on a secondary control connection.
-- This command allows simultaneous connection to two remote FTP
-- servers for transferring files between the two servers. The
-- first pprrooxxyy command should be an ooppeenn, to establish the sec-
-- ondary control connection. Enter the command "proxy ?" to
-- see other FTP commands executable on the secondary connec-
-- tion. The following commands behave differently when pref-
-- aced by pprrooxxyy: ooppeenn will not define new macros during the au-
-- to-login process, cclloossee will not erase existing macro defini-
-- tions, ggeett and mmggeett transfer files from the host on the pri-
-- mary control connection to the host on the secondary control
-- connection, and ppuutt, mmppuutt, and aappppeenndd transfer files from the
-- host on the secondary control connection to the host on the
-- primary control connection. Third party file transfers de-
-- pend upon support of the FTP protocol PASV command by the
-- server on the secondary control connection.
--
-- ppuutt _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e]
-- Store a local file on the remote machine. If _r_e_m_o_t_e_-_f_i_l_e is
-- left unspecified, the local file name is used after process-
-- ing according to any nnttrraannss or nnmmaapp settings in naming the
-- remote file. File transfer uses the current settings for
-- ttyyppee, ffoorrmmaatt, mmooddee, and ssttrruuccttuurree.
--
-- ppwwdd Print the name of the current working directory on the remote
-- machine.
--
-- qquuiitt A synonym for bbyyee.
--
-- qquuoottee _a_r_g_1 _a_r_g_2 _._._.
-- The arguments specified are sent, verbatim, to the remote FTP
-- server.
--
-- rraattee _d_i_r_e_c_t_i_o_n [_m_a_x_i_m_u_m [_i_n_c_r_e_m_e_n_t]]
-- Throttle the maximum transfer rate to _m_a_x_i_m_u_m bytes/second.
-- If _m_a_x_i_m_u_m is 0, disable the throttle.
--
-- _d_i_r_e_c_t_i_o_n may be one of:
-- aallll Both directions.
-- ggeett Incoming transfers.
-- ppuutt Outgoing transfers.
--
-- _m_a_x_i_m_u_m can by modified on the fly by _i_n_c_r_e_m_e_n_t bytes (de-
-- fault: 1024) each time a given signal is received:
--
-- SIGUSR1 Increment _m_a_x_i_m_u_m by _i_n_c_r_e_m_e_n_t bytes.
--
-- SIGUSR2 Decrement _m_a_x_i_m_u_m by _i_n_c_r_e_m_e_n_t bytes. The re-
-- sult must be a positive number.
--
-- If _m_a_x_i_m_u_m is not supplied, the current throttle rates are
-- displayed.
--
-- Note: rraattee is not yet implemented for ascii mode transfers.
--
-- rrccvvbbuuff _s_i_z_e
-- Set the size of the socket receive buffer to _s_i_z_e.
--
-- rreeccvv _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
-- A synonym for ggeett.
--
-- rreeggeett _r_e_m_o_t_e_-_f_i_l_e [_l_o_c_a_l_-_f_i_l_e]
-- rreeggeett acts like ggeett, except that if _l_o_c_a_l_-_f_i_l_e exists and is
-- smaller than _r_e_m_o_t_e_-_f_i_l_e, _l_o_c_a_l_-_f_i_l_e is presumed to be a par-
-- tially transferred copy of _r_e_m_o_t_e_-_f_i_l_e and the transfer is
-- continued from the apparent point of failure. This command
-- is useful when transferring very large files over networks
-- that are prone to dropping connections.
--
-- rreemmooppttss _c_o_m_m_a_n_d [_c_o_m_m_a_n_d_-_o_p_t_i_o_n_s]
-- Set options on the remote FTP server for _c_o_m_m_a_n_d to _c_o_m_m_a_n_d_-
-- _o_p_t_i_o_n_s (whose absence is handled on a command-specific ba-
-- sis). Remote FTP commands known to support options include:
-- `MLST' (used for MLSD and MLST).
--
-- rreennaammee [_f_r_o_m [_t_o]]
-- Rename the file _f_r_o_m on the remote machine, to the file _t_o.
--
-- rreesseett Clear reply queue. This command re-synchronizes command/re-
-- ply sequencing with the remote FTP server. Resynchronization
-- may be necessary following a violation of the FTP protocol by
-- the remote server.
--
-- rreessttaarrtt _m_a_r_k_e_r
-- Restart the immediately following ggeett or ppuutt at the indicated
-- _m_a_r_k_e_r. On UNIX systems, marker is usually a byte offset in-
-- to the file.
--
-- rrhheellpp [_c_o_m_m_a_n_d_-_n_a_m_e]
-- Request help from the remote FTP server. If a _c_o_m_m_a_n_d_-_n_a_m_e
-- is specified it is supplied to the server as well.
--
-- rrmmddiirr _d_i_r_e_c_t_o_r_y_-_n_a_m_e
-- Delete a directory on the remote machine.
--
-- rrssttaattuuss [_r_e_m_o_t_e_-_f_i_l_e]
-- With no arguments, show status of remote machine. If _r_e_m_o_t_e_-
-- _f_i_l_e is specified, show status of _r_e_m_o_t_e_-_f_i_l_e on remote ma-
-- chine.
--
-- rruunniiqquuee Toggle storing of files on the local system with unique file-
-- names. If a file already exists with a name equal to the
-- target local filename for a ggeett or mmggeett command, a ".1" is
-- appended to the name. If the resulting name matches another
-- existing file, a ".2" is appended to the original name. If
-- this process continues up to ".99", an error message is
-- printed, and the transfer does not take place. The generated
-- unique filename will be reported. Note that rruunniiqquuee will not
-- affect local files generated from a shell command (see be-
-- low). The default value is off.
--
-- sseenndd _l_o_c_a_l_-_f_i_l_e [_r_e_m_o_t_e_-_f_i_l_e]
-- A synonym for ppuutt.
--
-- sseennddppoorrtt Toggle the use of PORT commands. By default, ffttpp will at-
-- tempt to use a PORT command when establishing a connection
-- for each data transfer. The use of PORT commands can prevent
-- delays when performing multiple file transfers. If the PORT
-- command fails, ffttpp will use the default data port. When the
-- use of PORT commands is disabled, no attempt will be made to
-- use PORT commands for each data transfer. This is useful for
-- certain FTP implementations which do ignore PORT commands
-- but, incorrectly, indicate they've been accepted.
--
-- sseett [_o_p_t_i_o_n _v_a_l_u_e]
-- Set _o_p_t_i_o_n to _v_a_l_u_e. If _o_p_t_i_o_n and _v_a_l_u_e are not given, dis-
-- play all of the options and their values. The currently sup-
-- ported options are:
--
-- anonpass Defaults to $FTPANONPASS
--
-- ftp_proxy Defaults to $ftp_proxy.
--
-- http_proxy Defaults to $http_proxy.
--
-- no_proxy Defaults to $no_proxy.
--
-- pager Defaults to $PAGER.
--
-- prompt Defaults to $FTPPROMPT.
--
-- rprompt Defaults to $FTPRPROMPT.
--
-- ssiittee _a_r_g_1 _a_r_g_2 _._._.
-- The arguments specified are sent, verbatim, to the remote FTP
-- server as a SITE command.
--
-- ssiizzee _r_e_m_o_t_e_-_f_i_l_e
-- Return size of _r_e_m_o_t_e_-_f_i_l_e on remote machine.
--
-- ssnnddbbuuff _s_i_z_e
-- Set the size of the socket send buffer to _s_i_z_e.
--
-- ssttaattuuss Show the current status of ffttpp.
--
-- ssttrruucctt _s_t_r_u_c_t_-_n_a_m_e
-- Set the file transfer _s_t_r_u_c_t_u_r_e to _s_t_r_u_c_t_-_n_a_m_e. The default
-- (and only supported) structure is ``file''.
--
-- ssuunniiqquuee Toggle storing of files on remote machine under unique file
-- names. The remote FTP server must support FTP protocol STOU
-- command for successful completion. The remote server will
-- report unique name. Default value is off.
--
-- ssyysstteemm Show the type of operating system running on the remote ma-
-- chine.
--
-- tteenneexx Set the file transfer type to that needed to talk to TENEX
-- machines.
--
-- tthhrroottttllee A synonym for rraattee.
--
-- ttrraaccee Toggle packet tracing.
--
-- ttyyppee [_t_y_p_e_-_n_a_m_e]
-- Set the file transfer ttyyppee to _t_y_p_e_-_n_a_m_e. If no type is spec-
-- ified, the current type is printed. The default type is net-
-- work ASCII.
--
-- uummaasskk [_n_e_w_m_a_s_k]
-- Set the default umask on the remote server to _n_e_w_m_a_s_k. If
-- _n_e_w_m_a_s_k is omitted, the current umask is printed.
--
-- uunnsseett _o_p_t_i_o_n
-- Unset _o_p_t_i_o_n. Refer to sseett for more information.
--
-- uussaaggee _c_o_m_m_a_n_d
-- Print the usage message for _c_o_m_m_a_n_d.
--
-- uusseerr _u_s_e_r_-_n_a_m_e [_p_a_s_s_w_o_r_d [_a_c_c_o_u_n_t]]
-- Identify yourself to the remote FTP server. If the _p_a_s_s_w_o_r_d
-- is not specified and the server requires it, ffttpp will prompt
-- the user for it (after disabling local echo). If an _a_c_c_o_u_n_t
-- field is not specified, and the FTP server requires it, the
-- user will be prompted for it. If an _a_c_c_o_u_n_t field is speci-
-- fied, an account command will be relayed to the remote server
-- after the login sequence is completed if the remote server
-- did not require it for logging in. Unless ffttpp is invoked
-- with ``auto-login'' disabled, this process is done automati-
-- cally on initial connection to the FTP server.
--
-- vveerrbboossee Toggle verbose mode. In verbose mode, all responses from the
-- FTP server are displayed to the user. In addition, if ver-
-- bose is on, when a file transfer completes, statistics re-
-- garding the efficiency of the transfer are reported. By de-
-- fault, verbose is on.
--
-- xxffeerrbbuuff _s_i_z_e
-- Set the size of the socket send and receive buffers to _s_i_z_e.
--
-- ?? [_c_o_m_m_a_n_d]
-- A synonym for hheellpp.
--
-- Command arguments which have embedded spaces may be quoted with quote `"'
-- marks.
--
-- Commands which toggle settings can take an explicit oonn or ooffff argument to
-- force the setting appropriately.
--
-- Commands which take a byte count as an argument (e.g., hhaasshh, rraattee, and
-- xxffeerrbbuuff) support an optional suffix on the argument which changes the in-
-- terpretation of the argument. Supported suffixes are:
-- b Causes no modification. (Optional)
-- k Kilo; multiply the argument by 1024
-- m Mega; multiply the argument by 1048576
-- g Giga; multiply the argument by 1073741824
--
-- If ffttpp receives a SIGINFO (see the ``status'' argument of stty(1)) or
-- SIGQUIT signal whilst a transfer is in progress, the current transfer
-- rate statistics will be written to the standard error output, in the same
-- format as the standard completion message.
--
--AAUUTTOO--FFEETTCCHHIINNGG FFIILLEESS
-- In addition to standard commands, this version of ffttpp supports an auto-
-- fetch feature. To enable auto-fetch, simply pass the list of host-
-- names/files on the command line.
--
-- The following formats are valid syntax for an auto-fetch element:
--
-- [user@]host:[path][/]
-- ``Classic'' FTP format.
--
-- If _p_a_t_h contains a glob character and globbing is enabled, (see
-- gglloobb), then the equivalent of `mget path' is performed.
--
-- If the directory component of _p_a_t_h contains no globbing characters,
-- it is stored locally with the name basename (see basename(1)) of
-- ppaatthh, in the current directory. Otherwise, the full remote name is
-- used as the local name, relative to the local root directory.
--
-- ftp://[user[:password]@]host[:port]/path[/][;type=X]
-- An FTP URL, retrieved using the FTP protocol if sseett ffttpp__pprrooxxyy isn't
-- defined. Otherwise, transfer the URL using HTTP via the proxy de-
-- fined in sseett ffttpp__pprrooxxyy. If sseett ffttpp__pprrooxxyy isn't defined and _u_s_e_r is
-- given, login as _u_s_e_r. In this case, use _p_a_s_s_w_o_r_d if supplied, oth-
-- erwise prompt the user for one.
--
-- In order to be compliant with RRFFCC 11773388, ffttpp strips the leading `/'
-- from _p_a_t_h, resulting in a transfer relative from the default login
-- directory of the user. If the _/ directory is required, use a lead-
-- ing path of ``%2F''. If a user's home directory is required (and
-- the remote server supports the syntax), use a leading path of
-- ``%7Euser/''. For example, to retrieve _/_e_t_c_/_m_o_t_d from `localhost'
-- as the user `myname' with the password `mypass', use
-- ``ftp://myname:mypass@localhost/%2fetc/motd''
--
-- If a suffix of `;type=A' or `;type=I' is supplied, then the trans-
-- fer type will take place as ascii or binary (respectively). The
-- default transfer type is binary.
--
-- http://[user[:password]@]host[:port]/path
-- An HTTP URL, retrieved using the HTTP protocol. If sseett hhttttpp__pprrooxxyy
-- is defined, it is used as a URL to an HTTP proxy server. If HTTP
-- authorisation is required to retrieve _p_a_t_h, and `user' (and option-
-- ally `password') is in the URL, use them for the first attempt to
-- authenticate.
--
-- file:///path
-- A local URL, copied from _/_p_a_t_h.
--
-- Unless noted otherwise above, and --oo _o_u_t_p_u_t is not given, the file is
-- stored in the current directory as the basename(1) of _p_a_t_h.
--
-- If a classic format or an FTP URL format has a trailing `/' or an empty
-- _p_a_t_h component, then ffttpp will connect to the site and ccdd to the directory
-- given as the path, and leave the user in interactive mode ready for fur-
-- ther input. This will not work if sseett ffttpp__pprrooxxyy is being used.
--
-- Direct HTTP transfers use HTTP 1.1. Proxied FTP and HTTP transfers use
-- HTTP 1.0.
--
-- If --RR is given, all auto-fetches that don't go via the FTP or HTTP prox-
-- ies will be restarted. For FTP, this is implemented by using rreeggeett in-
-- stead of ggeett. For HTTP, this is implemented by using the `Range: bytes='
-- HTTP/1.1 directive.
--
-- If WWW or proxy WWW authentication is required, you will be prompted to
-- enter a username and password to authenticate with.
--
-- When specifying IPv6 numeric addresses in a URL, you need to surround the
-- address in square brackets. E.g.: ``ftp://[::1]:21/''. This is because
-- colons are used in IPv6 numeric address as well as being the separator
-- for the port number.
--
--AABBOORRTTIINNGG AA FFIILLEE TTRRAANNSSFFEERR
-- To abort a file transfer, use the terminal interrupt key (usually Ctrl-
-- C). Sending transfers will be immediately halted. Receiving transfers
-- will be halted by sending an FTP protocol ABOR command to the remote
-- server, and discarding any further data received. The speed at which
-- this is accomplished depends upon the remote server's support for ABOR
-- processing. If the remote server does not support the ABOR command, the
-- prompt will not appear until the remote server has completed sending the
-- requested file.
--
-- If the terminal interrupt key sequence is used whilst ffttpp is awaiting a
-- reply from the remote server for the ABOR processing, then the connection
-- will be closed. This is different from the traditional behaviour (which
-- ignores the terminal interrupt during this phase), but is considered more
-- useful.
--
--FFIILLEE NNAAMMIINNGG CCOONNVVEENNTTIIOONNSS
-- Files specified as arguments to ffttpp commands are processed according to
-- the following rules.
--
-- 1. If the file name `--' is specified, the _s_t_d_i_n (for reading) or _s_t_d_o_u_t
-- (for writing) is used.
--
-- 2. If the first character of the file name is `|', the remainder of the
-- argument is interpreted as a shell command. ffttpp then forks a shell,
-- using popen(3) with the argument supplied, and reads (writes) from
-- the stdout (stdin). If the shell command includes spaces, the argu-
-- ment must be quoted; e.g. ``"| ls -lt"''. A particularly useful
-- example of this mechanism is: ``dir "" |more''.
--
-- 3. Failing the above checks, if ``globbing'' is enabled, local file
-- names are expanded according to the rules used in the csh(1); c.f.
-- the gglloobb command. If the ffttpp command expects a single local file
-- (e.g. ppuutt), only the first filename generated by the "globbing" op-
-- eration is used.
--
-- 4. For mmggeett commands and ggeett commands with unspecified local file
-- names, the local filename is the remote filename, which may be al-
-- tered by a ccaassee, nnttrraannss, or nnmmaapp setting. The resulting filename
-- may then be altered if rruunniiqquuee is on.
--
-- 5. For mmppuutt commands and ppuutt commands with unspecified remote file
-- names, the remote filename is the local filename, which may be al-
-- tered by a nnttrraannss or nnmmaapp setting. The resulting filename may then
-- be altered by the remote server if ssuunniiqquuee is on.
--
--FFIILLEE TTRRAANNSSFFEERR PPAARRAAMMEETTEERRSS
-- The FTP specification specifies many parameters which may affect a file
-- transfer. The ttyyppee may be one of ``ascii'', ``image'' (binary),
-- ``ebcdic'', and ``local byte size'' (for PDP-10's and PDP-20's mostly).
-- ffttpp supports the ascii and image types of file transfer, plus local byte
-- size 8 for tteenneexx mode transfers.
--
-- ffttpp supports only the default values for the remaining file transfer pa-
-- rameters: mmooddee, ffoorrmm, and ssttrruucctt.
--
--TTHHEE ..nneettrrcc FFIILLEE
-- The _._n_e_t_r_c file contains login and initialization information used by the
-- auto-login process. It resides in the user's home directory, unless
-- overridden with the --NN _n_e_t_r_c option, or specified in the NETRC environ-
-- ment variable. The following tokens are recognized; they may be separat-
-- ed by spaces, tabs, or new-lines:
--
-- mmaacchhiinnee _n_a_m_e
-- Identify a remote machine _n_a_m_e. The auto-login process search-
-- es the _._n_e_t_r_c file for a mmaacchhiinnee token that matches the remote
-- machine specified on the ffttpp command line or as an ooppeenn command
-- argument. Once a match is made, the subsequent _._n_e_t_r_c tokens
-- are processed, stopping when the end of file is reached or an-
-- other mmaacchhiinnee or a ddeeffaauulltt token is encountered.
--
-- ddeeffaauulltt This is the same as mmaacchhiinnee _n_a_m_e except that ddeeffaauulltt matches
-- any name. There can be only one ddeeffaauulltt token, and it must be
-- after all mmaacchhiinnee tokens. This is normally used as:
--
-- default login anonymous password user@site
--
-- thereby giving the user an automatic anonymous FTP login to ma-
-- chines not specified in _._n_e_t_r_c. This can be overridden by us-
-- ing the --nn flag to disable auto-login.
--
-- llooggiinn _n_a_m_e
-- Identify a user on the remote machine. If this token is pre-
-- sent, the auto-login process will initiate a login using the
-- specified _n_a_m_e.
--
-- ppaasssswwoorrdd _s_t_r_i_n_g
-- Supply a password. If this token is present, the auto-login
-- process will supply the specified string if the remote server
-- requires a password as part of the login process. Note that if
-- this token is present in the _._n_e_t_r_c file for any user other
-- than _a_n_o_n_y_m_o_u_s, ffttpp will abort the auto-login process if the
-- _._n_e_t_r_c is readable by anyone besides the user.
--
-- aaccccoouunntt _s_t_r_i_n_g
-- Supply an additional account password. If this token is pre-
-- sent, the auto-login process will supply the specified string
-- if the remote server requires an additional account password,
-- or the auto-login process will initiate an ACCT command if it
-- does not.
--
-- mmaaccddeeff _n_a_m_e
-- Define a macro. This token functions like the ffttpp mmaaccddeeff com-
-- mand functions. A macro is defined with the specified name;
-- its contents begin with the next _._n_e_t_r_c line and continue until
-- a blank line (consecutive new-line characters) is encountered.
-- If a macro named iinniitt is defined, it is automatically executed
-- as the last step in the auto-login process.
--
--CCOOMMMMAANNDD LLIINNEE EEDDIITTIINNGG
-- ffttpp supports interactive command line editing, via the editline(3) li-
-- brary. It is enabled with the eeddiitt command, and is enabled by default if
-- input is from a tty. Previous lines can be recalled and edited with the
-- arrow keys, and other GNU Emacs-style editing keys may be used as well.
--
-- The editline(3) library is configured with a _._e_d_i_t_r_c file - refer to
-- editrc(5) for more information.
--
-- An extra key binding is available to ffttpp to provide context sensitive
-- command and filename completion (including remote file completion). To
-- use this, bind a key to the editline(3) command ffttpp--ccoommpplleettee. By de-
-- fault, this is bound to the TAB key.
--
--CCOOMMMMAANNDD LLIINNEE PPRROOMMPPTT
-- By default, ffttpp displays a command line prompt of ``ftp>'' to the user.
-- This can be changed with the sseett pprroommpptt command.
--
-- A prompt can be displayed on the right side of the screen (after the com-
-- mand input) with the sseett rrpprroommpptt command.
--
-- The following formatting sequences are replaced by the given information:
--
-- %/ The current remote working directory.
--
-- %c[[0]_n], %.[[0]_n]
-- The trailing component of the current remote working directo-
-- ry, or _n trailing components if a digit _n is given. If _n be-
-- gins with `0', the number of skipped components precede the
-- trailing component(s) in the format ``/_<_s_k_i_p_p_e_d_>trailing''
-- (for `%c') or ``...trailing'' (for `%.').
--
-- %M The remote host name.
--
-- %m The remote host name, up to the first `.'.
--
-- %n The remote user name.
--
-- %% A single `%'.
--
--EENNVVIIRROONNMMEENNTT
-- ffttpp uses the following environment variables.
--
-- FTPANONPASS Password to send in an anonymous FTP transfer. Defaults
-- to ```whoami`@''.
--
-- FTPMODE Overrides the default operation mode. Support values are:
--
-- active active mode FTP only
--
-- auto automatic determination of passive or active
-- (this is the default)
--
-- gate gate-ftp mode
--
-- passive passive mode FTP only
--
-- FTPPROMPT Command-line prompt to use. Defaults to ``ftp>''. Refer
-- to _C_O_M_M_A_N_D _L_I_N_E _P_R_O_M_P_T for more information.
--
-- FTPRPROMPT Command-line right side prompt to use. Defaults to ``''.
-- Refer to _C_O_M_M_A_N_D _L_I_N_E _P_R_O_M_P_T for more information.
--
-- FTPSERVER Host to use as gate-ftp server when ggaattee is enabled.
--
-- FTPSERVERPORT Port to use when connecting to gate-ftp server when ggaattee
-- is enabled. Default is port returned by a ggeettsseerrvvbbyynnaammee()
-- lookup of ``ftpgate/tcp''.
--
-- HOME For default location of a _._n_e_t_r_c file, if one exists.
--
-- NETRC An alternate location of the _._n_e_t_r_c file.
--
-- PAGER Used by various commands to display files. Defaults to
-- more(1) if empty or not set.
--
-- SHELL For default shell.
--
-- ftp_proxy URL of FTP proxy to use when making FTP URL requests (if
-- not defined, use the standard FTP protocol).
--
-- _N_O_T_E: this is not used for interactive sessions, only for
-- command-line fetches.
--
-- http_proxy URL of HTTP proxy to use when making HTTP URL requests.
-- If proxy authentication is required and there is a user-
-- name and password in this URL, they will automatically be
-- used in the first attempt to authenticate to the proxy.
--
-- Note that the use of a username and password in ftp_proxy
-- and http_proxy may be incompatible with other programs
-- that use it (such as lynx(1)).
--
-- _N_O_T_E: this is not used for interactive sessions, only for
-- command-line fetches.
--
-- no_proxy A space or comma separated list of hosts (or domains) for
-- which proxying is not to be used. Each entry may have an
-- optional trailing ":port", which restricts the matching to
-- connections to that port.
--
--SSEEEE AALLSSOO
-- getservbyname(3), editrc(5), services(5), ftpd(8)
--
--SSTTAANNDDAARRDDSS
-- ffttpp attempts to be compliant with RRFFCC 995599, RRFFCC 11112233, RRFFCC 11773388, RRFFCC 22006688,
-- RRFFCC 22338899, RRFFCC 22442288, RRFFCC 22773322, and ddrraafftt--iieettff--ffttppeexxtt--mmllsstt--1111.
--
--HHIISSTTOORRYY
-- The ffttpp command appeared in 4.2BSD.
--
-- Various features such as command line editing, context sensitive command
-- and file completion, dynamic progress bar, automatic fetching of files
-- and URLs, modification time preservation, transfer rate throttling, con-
-- figurable command line prompt, and other enhancements over the standard
-- BSD ffttpp were implemented in NetBSD 1.3 and later releases by Luke Mewburn
-- <lukem@netbsd.org>.
--
-- IPv6 support was added by the WIDE/KAME project (but may not be present
-- in all non-NetBSD versions of this program, depending if the operating
-- system supports IPv6 in a similar manner to KAME).
--
--BBUUGGSS
-- Correct execution of many commands depends upon proper behavior by the
-- remote server.
--
-- An error in the treatment of carriage returns in the 4.2BSD ascii-mode
-- transfer code has been corrected. This correction may result in incor-
-- rect transfers of binary files to and from 4.2BSD servers using the ascii
-- type. Avoid this problem by using the binary image type.
--
-- ffttpp assumes that all IPv4 mapped addresses (IPv6 addresses with a form
-- like ::ffff:10.1.1.1) indicate IPv4 destinations which can be handled by
-- AF_INET sockets. However, in certain IPv6 network configurations, this
-- assumption is not true. In such an environment, IPv4 mapped addresses
-- must be passed to AF_INET6 sockets directly. For example, if your site
-- uses a SIIT translator for IPv6-to-IPv4 translation, ffttpp is unable to
-- support your configuration.
--
--NetBSD 1.6_BETA1 May 18, 2002 16
-diff -Nru src/ftp_var.h /home/spock/ftp/ftp_var.h
---- src/ftp_var.h Sat Jun 15 05:40:36 2002
-+++ /home/spock/ftp/ftp_var.h Thu Jun 12 02:02:11 2003
-@@ -1,7 +1,7 @@
--/* $NetBSD: ftp_var.h,v 1.62 2001/12/26 09:40:16 lukem Exp $ */
-+/* $NetBSD: ftp_var.h,v 1.64 2003/01/21 16:08:07 jhawk Exp $ */
-
- /*-
-- * Copyright (c) 1996-2001 The NetBSD Foundation, Inc.
-+ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
-@@ -111,14 +111,20 @@
- #define NO_PROGRESS
- #endif
-
-+#include <sys/param.h>
-+
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+
-+#include <setjmp.h>
-+#include <stringlist.h>
-+
- #ifndef NO_EDITCOMPLETE
- #include <histedit.h>
- #endif /* !NO_EDITCOMPLETE */
-
--typedef void (*sigfunc)(int);
--
- #include "extern.h"
--
-+#include "progressbar.h"
-
- /*
- * Format of command table.
-@@ -175,7 +181,6 @@
-
- #define HASHBYTES 1024 /* default mark for `hash' command */
- #define DEFAULTINCR 1024 /* default increment for `rate' command */
--#define STALLTIME 5 /* # of seconds of no xfer before "stalling" */
-
- #define FTP_PORT 21 /* default if ! getservbyname("ftp/tcp") */
- #define HTTP_PORT 80 /* default if ! getservbyname("http/tcp") */
-@@ -204,9 +209,7 @@
- GLOBAL int hash; /* print # for each buffer transferred */
- GLOBAL int mark; /* number of bytes between hashes */
- GLOBAL int sendport; /* use PORT/LPRT cmd for each data connection */
--GLOBAL int verbose; /* print messages coming back from server */
- GLOBAL int connected; /* 1 = connected to server, -1 = logged in */
--GLOBAL int fromatty; /* input is from a terminal */
- GLOBAL int interactive; /* interactively prompt on m* cmds */
- GLOBAL int confirmrest; /* confirm rest of current m* cmd */
- GLOBAL int debug; /* debugging level */
-@@ -223,7 +226,6 @@
- GLOBAL int ntflag; /* use ntin ntout tables for name translation */
- GLOBAL int mapflag; /* use mapin mapout templates on file names */
- GLOBAL int preserve; /* preserve modification time on files */
--GLOBAL int progress; /* display transfer progress bar */
- GLOBAL int code; /* return/reply code for ftp command */
- GLOBAL int crflag; /* if 1, strip car. rets. on ascii gets */
- GLOBAL int passivemode; /* passive mode enabled */
-@@ -252,9 +254,7 @@
- GLOBAL int rate_put; /* maximum put xfer rate */
- GLOBAL int rate_put_incr; /* increment for put xfer rate */
- GLOBAL int retry_connect; /* seconds between retrying connection */
--GLOBAL int ttywidth; /* width of tty */
- GLOBAL char *tmpdir; /* temporary directory */
--GLOBAL FILE *ttyout; /* stdout, or stderr if retrieving to stdout */
- GLOBAL int epsv4; /* use EPSV/EPRT on IPv4 connections */
- GLOBAL int epsv4bad; /* EPSV doesn't work on the current server */
- GLOBAL int editing; /* command line editing enabled */
-@@ -268,10 +268,7 @@
- GLOBAL size_t cursor_argo; /* offset of cursor in margv[cursor_argc] */
- #endif /* !NO_EDITCOMPLETE */
-
--GLOBAL off_t bytes; /* current # of bytes read */
--GLOBAL off_t filesize; /* size of file being transferred */
- GLOBAL char *direction; /* direction transfer is occurring */
--GLOBAL off_t restart_point; /* offset to restart transfer */
-
- GLOBAL char *hostname; /* name of host connected to */
- GLOBAL int unix_server; /* server is unix, can use binary for ascii */
-@@ -287,8 +284,6 @@
- GLOBAL char *outfile; /* filename to output URLs to */
- GLOBAL int restartautofetch; /* restart auto-fetch */
-
--GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
--
- GLOBAL char line[FTPBUFLEN]; /* input line buffer */
- GLOBAL char *stringbase; /* current scan point in line buffer */
- GLOBAL char argbuf[FTPBUFLEN]; /* argument storage buffer */
-@@ -336,29 +331,7 @@
- #endif
-
- #ifdef NO_LONG_LONG
--# define LLF "%ld"
--# define LLFP(x) "%" x "ld"
--# define LLT long
--# define ULLF "%lu"
--# define ULLFP(x) "%" x "lu"
--# define ULLT unsigned long
- # define STRTOLL(x,y,z) strtol(x,y,z)
- #else
--#if HAVE_PRINTF_QD
--# define LLF "%qd"
--# define LLFP(x) "%" x "qd"
--# define LLT long long
--# define ULLF "%qu"
--# define ULLFP(x) "%" x "qu"
--# define ULLT unsigned long long
--# define STRTOLL(x,y,z) strtoll(x,y,z)
--#else
--# define LLF "%lld"
--# define LLFP(x) "%" x "lld"
--# define LLT long long
--# define ULLF "%llu"
--# define ULLFP(x) "%" x "llu"
--# define ULLT unsigned long long
- # define STRTOLL(x,y,z) strtoll(x,y,z)
--#endif
- #endif
-diff -Nru src/main.c /home/spock/ftp/main.c
---- src/main.c Sat Jun 15 05:40:36 2002
-+++ /home/spock/ftp/main.c Thu Jun 12 02:02:11 2003
-@@ -1,4 +1,4 @@
--/* $NetBSD: main.c,v 1.82 2002/06/05 13:51:54 lukem Exp $ */
-+/* $NetBSD: main.c,v 1.84 2003/05/14 14:31:00 wiz Exp $ */
-
- /*-
- * Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
-@@ -98,11 +98,36 @@
- * SUCH DAMAGE.
- */
-
-+#include <sys/cdefs.h>
-+#ifndef lint
-+__COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\n\
-+ The Regents of the University of California. All rights reserved.\n");
-+#endif /* not lint */
-+
-+#ifndef lint
-+#if 0
-+static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94";
-+#else
-+__RCSID("$NetBSD: main.c,v 1.84 2003/05/14 14:31:00 wiz Exp $");
-+#endif
-+#endif /* not lint */
-+
- /*
- * FTP User Program -- Command Interface.
- */
-+#include <sys/types.h>
-+#include <sys/socket.h>
-
--#include "lukemftp.h"
-+#include <err.h>
-+#include <errno.h>
-+#include <netdb.h>
-+#include <paths.h>
-+#include <pwd.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <unistd.h>
-+#include <locale.h>
-
- #define GLOBAL /* force GLOBAL decls in ftp_var.h to be declared */
- #include "ftp_var.h"
-@@ -123,9 +148,7 @@
- char *cp, *ep, *anonuser, *anonpass, *upload_path;
- int dumbterm, s, len, isupload;
-
--#if 0 /* XXX */
- setlocale(LC_ALL, "");
--#endif
- setprogname(argv[0]);
-
- ftpport = "ftp";
-@@ -258,7 +281,7 @@
- }
- }
-
-- while ((ch = getopt(argc, argv, "46AadefginN:o:pP:r:RtT:u:vV")) != -1) {
-+ while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:RtT:u:vV")) != -1) {
- switch (ch) {
- case '4':
- family = AF_INET;
-@@ -330,6 +353,12 @@
- ftpport = optarg;
- break;
-
-+ case 'q':
-+ quit_time = strtol(optarg, &ep, 10);
-+ if (quit_time < 1 || *ep != '\0')
-+ errx(1, "bad quit value: %s", optarg);
-+ break;
-+
- case 'r':
- retry_connect = strtol(optarg, &ep, 10);
- if (retry_connect < 1 || *ep != '\0')
-@@ -1003,6 +1032,6 @@
- " [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n"
- " [file:///file] [ftp://[user[:pass]@]host[:port]/path[/]]\n"
- " [http://[user[:pass]@]host[:port]/path] [...]\n"
--" %s -u url file [...]\n", progname, progname);
-+" %s -u URL file [...]\n", progname, progname);
- exit(1);
- }
-diff -Nru src/progressbar.c /home/spock/ftp/progressbar.c
---- src/progressbar.c Wed Dec 31 19:00:00 1969
-+++ /home/spock/ftp/progressbar.c Thu Jun 12 02:02:11 2003
-@@ -0,0 +1,460 @@
-+/* $NetBSD: progressbar.c,v 1.3 2003/02/28 09:53:49 lukem Exp $ */
-+
-+/*-
-+ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
-+ * All rights reserved.
-+ *
-+ * This code is derived from software contributed to The NetBSD Foundation
-+ * by Luke Mewburn.
-+ *
-+ * This code is derived from software contributed to The NetBSD Foundation
-+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
-+ * NASA Ames Research Center.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. All advertising materials mentioning features or use of this software
-+ * must display the following acknowledgement:
-+ * This product includes software developed by the NetBSD
-+ * Foundation, Inc. and its contributors.
-+ * 4. Neither the name of The NetBSD Foundation nor the names of its
-+ * contributors may be used to endorse or promote products derived
-+ * from this software without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-+ * POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <sys/cdefs.h>
-+#ifndef lint
-+__RCSID("$NetBSD: progressbar.c,v 1.3 2003/02/28 09:53:49 lukem Exp $");
-+#endif /* not lint */
-+
-+/*
-+ * FTP User Program -- Misc support routines
-+ */
-+#include <sys/types.h>
-+#include <sys/param.h>
-+
-+#include <err.h>
-+#include <errno.h>
-+#include <signal.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <time.h>
-+#include <tzfile.h>
-+#include <unistd.h>
-+
-+#include "progressbar.h"
-+
-+#if !defined(NO_PROGRESS)
-+/*
-+ * return non-zero if we're the current foreground process
-+ */
-+int
-+foregroundproc(void)
-+{
-+ static pid_t pgrp = -1;
-+
-+ if (pgrp == -1)
-+ pgrp = getpgrp();
-+
-+ return (tcgetpgrp(fileno(ttyout)) == pgrp);
-+}
-+#endif /* !defined(NO_PROGRESS) */
-+
-+
-+#ifndef NO_PROGRESS
-+static void updateprogressmeter(int);
-+
-+/*
-+ * SIGALRM handler to update the progress meter
-+ */
-+static void
-+updateprogressmeter(int dummy)
-+{
-+ int oerrno = errno;
-+
-+ progressmeter(0);
-+ errno = oerrno;
-+}
-+#endif /* NO_PROGRESS */
-+
-+
-+/*
-+ * List of order of magnitude prefixes.
-+ * The last is `P', as 2^64 = 16384 Petabytes
-+ */
-+static const char prefixes[] = " KMGTP";
-+
-+/*
-+ * Display a transfer progress bar if progress is non-zero.
-+ * SIGALRM is hijacked for use by this function.
-+ * - Before the transfer, set filesize to size of file (or -1 if unknown),
-+ * and call with flag = -1. This starts the once per second timer,
-+ * and a call to updateprogressmeter() upon SIGALRM.
-+ * - During the transfer, updateprogressmeter will call progressmeter
-+ * with flag = 0
-+ * - After the transfer, call with flag = 1
-+ */
-+static struct timeval start;
-+static struct timeval lastupdate;
-+
-+#define BUFLEFT (sizeof(buf) - len)
-+
-+void
-+progressmeter(int flag)
-+{
-+ static off_t lastsize;
-+ off_t cursize;
-+ struct timeval now, wait;
-+#ifndef NO_PROGRESS
-+ struct timeval td;
-+ off_t abbrevsize, bytespersec;
-+ double elapsed;
-+ int ratio, barlength, i, len, remaining;
-+
-+ /*
-+ * Work variables for progress bar.
-+ *
-+ * XXX: if the format of the progress bar changes
-+ * (especially the number of characters in the
-+ * `static' portion of it), be sure to update
-+ * these appropriately.
-+ */
-+ char buf[256]; /* workspace for progress bar */
-+#define BAROVERHEAD 43 /* non `*' portion of progress bar */
-+ /*
-+ * stars should contain at least
-+ * sizeof(buf) - BAROVERHEAD entries
-+ */
-+ static const char stars[] =
-+"*****************************************************************************"
-+"*****************************************************************************"
-+"*****************************************************************************";
-+
-+#endif
-+
-+ if (flag == -1) {
-+ (void)gettimeofday(&start, NULL);
-+ lastupdate = start;
-+ lastsize = restart_point;
-+ }
-+
-+ (void)gettimeofday(&now, NULL);
-+ cursize = bytes + restart_point;
-+ timersub(&now, &lastupdate, &wait);
-+ if (cursize > lastsize) {
-+ lastupdate = now;
-+ lastsize = cursize;
-+ wait.tv_sec = 0;
-+ } else {
-+#ifndef STANDALONE_PROGRESS
-+ if (quit_time > 0 && wait.tv_sec > quit_time) {
-+ len = snprintf(buf, sizeof(buf), "\r\n%s: "
-+ "transfer aborted because stalled for %lu sec.\r\n",
-+ getprogname(), (unsigned long)wait.tv_sec);
-+ (void)write(fileno(ttyout), buf, len);
-+ (void)xsignal(SIGALRM, SIG_DFL);
-+ alarmtimer(0);
-+ siglongjmp(toplevel, 1);
-+ }
-+#endif /* !STANDALONE_PROGRESS */
-+ }
-+ /*
-+ * Always set the handler even if we are not the foreground process.
-+ */
-+#ifdef STANDALONE_PROGRESS
-+ if (progress) {
-+#else
-+ if (quit_time > 0 || progress) {
-+#endif /* !STANDALONE_PROGRESS */
-+ if (flag == -1) {
-+ (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
-+ alarmtimer(1); /* set alarm timer for 1 Hz */
-+ } else if (flag == 1) {
-+ (void)xsignal(SIGALRM, SIG_DFL);
-+ alarmtimer(0);
-+ }
-+ }
-+#ifndef NO_PROGRESS
-+ if (!progress)
-+ return;
-+ len = 0;
-+
-+ /*
-+ * print progress bar only if we are foreground process.
-+ */
-+ if (! foregroundproc())
-+ return;
-+
-+ len += snprintf(buf + len, BUFLEFT, "\r");
-+ if (filesize > 0) {
-+ ratio = (int)((double)cursize * 100.0 / (double)filesize);
-+ ratio = MAX(ratio, 0);
-+ ratio = MIN(ratio, 100);
-+ len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
-+
-+ /*
-+ * calculate the length of the `*' bar, ensuring that
-+ * the number of stars won't exceed the buffer size
-+ */
-+ barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
-+ if (barlength > 0) {
-+ i = barlength * ratio / 100;
-+ len += snprintf(buf + len, BUFLEFT,
-+ "|%.*s%*s|", i, stars, barlength - i, "");
-+ }
-+ }
-+
-+ abbrevsize = cursize;
-+ for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
-+ abbrevsize >>= 10;
-+ len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
-+ (LLT)abbrevsize,
-+ prefixes[i],
-+ i == 0 ? ' ' : 'B');
-+
-+ timersub(&now, &start, &td);
-+ elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
-+
-+ bytespersec = 0;
-+ if (bytes > 0) {
-+ bytespersec = bytes;
-+ if (elapsed > 0.0)
-+ bytespersec /= elapsed;
-+ }
-+ for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
-+ bytespersec >>= 10;
-+ len += snprintf(buf + len, BUFLEFT,
-+ " " LLFP("3") ".%02d %cB/s ",
-+ (LLT)(bytespersec / 1024),
-+ (int)((bytespersec % 1024) * 100 / 1024),
-+ prefixes[i]);
-+
-+ if (filesize > 0) {
-+ if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
-+ len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
-+ } else if (wait.tv_sec >= STALLTIME) {
-+ len += snprintf(buf + len, BUFLEFT, " - stalled -");
-+ } else {
-+ remaining = (int)
-+ ((filesize - restart_point) / (bytes / elapsed) -
-+ elapsed);
-+ if (remaining >= 100 * SECSPERHOUR)
-+ len += snprintf(buf + len, BUFLEFT,
-+ " --:-- ETA");
-+ else {
-+ i = remaining / SECSPERHOUR;
-+ if (i)
-+ len += snprintf(buf + len, BUFLEFT,
-+ "%2d:", i);
-+ else
-+ len += snprintf(buf + len, BUFLEFT,
-+ " ");
-+ i = remaining % SECSPERHOUR;
-+ len += snprintf(buf + len, BUFLEFT,
-+ "%02d:%02d ETA", i / 60, i % 60);
-+ }
-+ }
-+ }
-+ if (flag == 1)
-+ len += snprintf(buf + len, BUFLEFT, "\n");
-+ (void)write(fileno(ttyout), buf, len);
-+
-+#endif /* !NO_PROGRESS */
-+}
-+
-+#ifndef STANDALONE_PROGRESS
-+/*
-+ * Display transfer statistics.
-+ * Requires start to be initialised by progressmeter(-1),
-+ * direction to be defined by xfer routines, and filesize and bytes
-+ * to be updated by xfer routines
-+ * If siginfo is nonzero, an ETA is displayed, and the output goes to stderr
-+ * instead of ttyout.
-+ */
-+void
-+ptransfer(int siginfo)
-+{
-+ struct timeval now, td, wait;
-+ double elapsed;
-+ off_t bytespersec;
-+ int remaining, hh, i, len;
-+
-+ char buf[256]; /* Work variable for transfer status. */
-+
-+ if (!verbose && !progress && !siginfo)
-+ return;
-+
-+ (void)gettimeofday(&now, NULL);
-+ timersub(&now, &start, &td);
-+ elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
-+ bytespersec = 0;
-+ if (bytes > 0) {
-+ bytespersec = bytes;
-+ if (elapsed > 0.0)
-+ bytespersec /= elapsed;
-+ }
-+ len = 0;
-+ len += snprintf(buf + len, BUFLEFT, LLF " byte%s %s in ",
-+ (LLT)bytes, bytes == 1 ? "" : "s", direction);
-+ remaining = (int)elapsed;
-+ if (remaining > SECSPERDAY) {
-+ int days;
-+
-+ days = remaining / SECSPERDAY;
-+ remaining %= SECSPERDAY;
-+ len += snprintf(buf + len, BUFLEFT,
-+ "%d day%s ", days, days == 1 ? "" : "s");
-+ }
-+ hh = remaining / SECSPERHOUR;
-+ remaining %= SECSPERHOUR;
-+ if (hh)
-+ len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
-+ len += snprintf(buf + len, BUFLEFT,
-+ "%02d:%02d ", remaining / 60, remaining % 60);
-+
-+ for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
-+ bytespersec >>= 10;
-+ len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
-+ (LLT)(bytespersec / 1024),
-+ (int)((bytespersec % 1024) * 100 / 1024),
-+ prefixes[i]);
-+
-+ if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
-+ && bytes + restart_point <= filesize) {
-+ remaining = (int)((filesize - restart_point) /
-+ (bytes / elapsed) - elapsed);
-+ hh = remaining / SECSPERHOUR;
-+ remaining %= SECSPERHOUR;
-+ len += snprintf(buf + len, BUFLEFT, " ETA: ");
-+ if (hh)
-+ len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
-+ len += snprintf(buf + len, BUFLEFT, "%02d:%02d",
-+ remaining / 60, remaining % 60);
-+ timersub(&now, &lastupdate, &wait);
-+ if (wait.tv_sec >= STALLTIME)
-+ len += snprintf(buf + len, BUFLEFT, " (stalled)");
-+ }
-+ len += snprintf(buf + len, BUFLEFT, "\n");
-+ (void)write(siginfo ? STDERR_FILENO : fileno(ttyout), buf, len);
-+}
-+
-+/*
-+ * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress
-+ */
-+void
-+psummary(int notused)
-+{
-+ int oerrno = errno;
-+
-+ if (bytes > 0) {
-+ if (fromatty)
-+ write(fileno(ttyout), "\n", 1);
-+ ptransfer(1);
-+ }
-+ errno = oerrno;
-+}
-+#endif /* !STANDALONE_PROGRESS */
-+
-+
-+/*
-+ * Set the SIGALRM interval timer for wait seconds, 0 to disable.
-+ */
-+void
-+alarmtimer(int wait)
-+{
-+ struct itimerval itv;
-+
-+ itv.it_value.tv_sec = wait;
-+ itv.it_value.tv_usec = 0;
-+ itv.it_interval = itv.it_value;
-+ setitimer(ITIMER_REAL, &itv, NULL);
-+}
-+
-+
-+/*
-+ * Install a POSIX signal handler, allowing the invoker to set whether
-+ * the signal should be restartable or not
-+ */
-+sigfunc
-+xsignal_restart(int sig, sigfunc func, int restartable)
-+{
-+ struct sigaction act, oact;
-+ act.sa_handler = func;
-+
-+ sigemptyset(&act.sa_mask);
-+#if defined(SA_RESTART) /* 4.4BSD, Posix(?), SVR4 */
-+ act.sa_flags = restartable ? SA_RESTART : 0;
-+#elif defined(SA_INTERRUPT) /* SunOS 4.x */
-+ act.sa_flags = restartable ? 0 : SA_INTERRUPT;
-+#else
-+#error "system must have SA_RESTART or SA_INTERRUPT"
-+#endif
-+ if (sigaction(sig, &act, &oact) < 0)
-+ return (SIG_ERR);
-+ return (oact.sa_handler);
-+}
-+
-+/*
-+ * Install a signal handler with the `restartable' flag set dependent upon
-+ * which signal is being set. (This is a wrapper to xsignal_restart())
-+ */
-+sigfunc
-+xsignal(int sig, sigfunc func)
-+{
-+ int restartable;
-+
-+ /*
-+ * Some signals print output or change the state of the process.
-+ * There should be restartable, so that reads and writes are
-+ * not affected. Some signals should cause program flow to change;
-+ * these signals should not be restartable, so that the system call
-+ * will return with EINTR, and the program will go do something
-+ * different. If the signal handler calls longjmp() or siglongjmp(),
-+ * it doesn't matter if it's restartable.
-+ */
-+
-+ switch(sig) {
-+#ifdef SIGINFO
-+ case SIGINFO:
-+#endif
-+ case SIGQUIT:
-+ case SIGUSR1:
-+ case SIGUSR2:
-+ case SIGWINCH:
-+ restartable = 1;
-+ break;
-+
-+ case SIGALRM:
-+ case SIGINT:
-+ case SIGPIPE:
-+ restartable = 0;
-+ break;
-+
-+ default:
-+ /*
-+ * This is unpleasant, but I don't know what would be better.
-+ * Right now, this "can't happen"
-+ */
-+ errx(1, "xsignal_restart called with signal %d", sig);
-+ }
-+
-+ return(xsignal_restart(sig, func, restartable));
-+}
-diff -Nru src/progressbar.h /home/spock/ftp/progressbar.h
---- src/progressbar.h Wed Dec 31 19:00:00 1969
-+++ /home/spock/ftp/progressbar.h Thu Jun 12 02:02:11 2003
-@@ -0,0 +1,99 @@
-+/* $NetBSD: progressbar.h,v 1.3 2003/02/28 09:53:49 lukem Exp $ */
-+
-+/*-
-+ * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
-+ * All rights reserved.
-+ *
-+ * This code is derived from software contributed to The NetBSD Foundation
-+ * by Luke Mewburn.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions and the following disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ * 3. All advertising materials mentioning features or use of this software
-+ * must display the following acknowledgement:
-+ * This product includes software developed by the NetBSD
-+ * Foundation, Inc. and its contributors.
-+ * 4. Neither the name of The NetBSD Foundation nor the names of its
-+ * contributors may be used to endorse or promote products derived
-+ * from this software without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-+ * POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#ifndef STANDALONE_PROGRESS
-+#include <setjmp.h>
-+#endif /* !STANDALONE_PROGRESS */
-+
-+#ifndef GLOBAL
-+#define GLOBAL extern
-+#endif
-+
-+
-+#define STALLTIME 5 /* # of seconds of no xfer before "stalling" */
-+
-+typedef void (*sigfunc)(int);
-+
-+
-+GLOBAL FILE *ttyout; /* stdout, or stderr if retrieving to stdout */
-+
-+GLOBAL int progress; /* display transfer progress bar */
-+GLOBAL int ttywidth; /* width of tty */
-+
-+GLOBAL off_t bytes; /* current # of bytes read */
-+GLOBAL off_t filesize; /* size of file being transferred */
-+GLOBAL off_t restart_point; /* offset to restart transfer */
-+
-+
-+#ifndef STANDALONE_PROGRESS
-+GLOBAL int fromatty; /* input is from a terminal */
-+GLOBAL int verbose; /* print messages coming back from server */
-+GLOBAL int quit_time; /* maximum time to wait if stalled */
-+
-+GLOBAL char *direction; /* direction transfer is occurring */
-+
-+GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
-+#endif /* !STANDALONE_PROGRESS */
-+
-+int foregroundproc(void);
-+void alarmtimer(int);
-+void progressmeter(int);
-+sigfunc xsignal(int, sigfunc);
-+sigfunc xsignal_restart(int, sigfunc, int);
-+
-+#ifndef STANDALONE_PROGRESS
-+void psummary(int);
-+void ptransfer(int);
-+#endif /* !STANDALONE_PROGRESS */
-+
-+
-+#ifdef NO_LONG_LONG
-+# define LLF "%ld"
-+# define LLFP(x) "%" x "ld"
-+# define LLT long
-+# define ULLF "%lu"
-+# define ULLFP(x) "%" x "lu"
-+# define ULLT unsigned long
-+#else
-+# define LLF "%lld"
-+# define LLFP(x) "%" x "lld"
-+# define LLT long long
-+# define ULLF "%llu"
-+# define ULLFP(x) "%" x "llu"
-+# define ULLT unsigned long long
-+#endif
-diff -Nru src/ruserpass.c /home/spock/ftp/ruserpass.c
---- src/ruserpass.c Sat Jun 15 05:40:36 2002
-+++ /home/spock/ftp/ruserpass.c Thu Jun 12 02:02:11 2003
-@@ -33,7 +33,26 @@
- * SUCH DAMAGE.
- */
-
--#include "lukemftp.h"
-+#include <sys/cdefs.h>
-+#ifndef lint
-+#if 0
-+static char sccsid[] = "@(#)ruserpass.c 8.4 (Berkeley) 4/27/95";
-+#else
-+__RCSID("$NetBSD: ruserpass.c,v 1.28 2000/11/15 00:11:04 lukem Exp $");
-+#endif
-+#endif /* not lint */
-+
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+
-+#include <ctype.h>
-+#include <err.h>
-+#include <errno.h>
-+#include <netdb.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <unistd.h>
-
- #include "ftp_var.h"
-
-diff -Nru src/util.c /home/spock/ftp/util.c
---- src/util.c Sat Jun 15 05:40:37 2002
-+++ /home/spock/ftp/util.c Thu Jun 12 02:02:11 2003
-@@ -1,7 +1,7 @@
--/* $NetBSD: util.c,v 1.107 2002/06/05 10:20:50 lukem Exp $ */
-+/* $NetBSD: util.c,v 1.111 2003/02/28 09:54:51 lukem Exp $ */
-
- /*-
-- * Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
-+ * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
-@@ -73,11 +73,36 @@
- * SUCH DAMAGE.
- */
-
-+#include <sys/cdefs.h>
-+#ifndef lint
-+__RCSID("$NetBSD: util.c,v 1.111 2003/02/28 09:54:51 lukem Exp $");
-+#endif /* not lint */
-+
- /*
- * FTP User Program -- Misc support routines
- */
--
--#include "lukemftp.h"
-+#include <sys/types.h>
-+#include <sys/socket.h>
-+#include <sys/ioctl.h>
-+#include <sys/time.h>
-+#include <netinet/in.h>
-+#include <arpa/ftp.h>
-+
-+#include <ctype.h>
-+#include <err.h>
-+#include <errno.h>
-+#include <fcntl.h>
-+#include <glob.h>
-+#include <signal.h>
-+#include <limits.h>
-+#include <netdb.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <termios.h>
-+#include <time.h>
-+#include <tzfile.h>
-+#include <unistd.h>
-
- #include "ftp_var.h"
-
-@@ -775,303 +800,6 @@
- code = ocode;
- }
-
--#ifndef NO_PROGRESS
--
--/*
-- * return non-zero if we're the current foreground process
-- */
--int
--foregroundproc(void)
--{
-- static pid_t pgrp = -1;
--
-- if (pgrp == -1)
--#if GETPGRP_VOID
-- pgrp = getpgrp();
--#else /* ! GETPGRP_VOID */
-- pgrp = getpgrp(0);
--#endif /* ! GETPGRP_VOID */
--
-- return (tcgetpgrp(fileno(ttyout)) == pgrp);
--}
--
--
--static void updateprogressmeter(int);
--
--/*
-- * SIGALRM handler to update the progress meter
-- */
--static void
--updateprogressmeter(int dummy)
--{
-- int oerrno = errno;
--
-- progressmeter(0);
-- errno = oerrno;
--}
--#endif /* NO_PROGRESS */
--
--
--/*
-- * List of order of magnitude prefixes.
-- * The last is `P', as 2^64 = 16384 Petabytes
-- */
--static const char prefixes[] = " KMGTP";
--
--/*
-- * Display a transfer progress bar if progress is non-zero.
-- * SIGALRM is hijacked for use by this function.
-- * - Before the transfer, set filesize to size of file (or -1 if unknown),
-- * and call with flag = -1. This starts the once per second timer,
-- * and a call to updateprogressmeter() upon SIGALRM.
-- * - During the transfer, updateprogressmeter will call progressmeter
-- * with flag = 0
-- * - After the transfer, call with flag = 1
-- */
--static struct timeval start;
--static struct timeval lastupdate;
--
--#define BUFLEFT (sizeof(buf) - len)
--
--void
--progressmeter(int flag)
--{
-- static off_t lastsize;
--#ifndef NO_PROGRESS
-- struct timeval now, td, wait;
-- off_t cursize, abbrevsize, bytespersec;
-- double elapsed;
-- int ratio, barlength, i, len, remaining;
--
-- /*
-- * Work variables for progress bar.
-- *
-- * XXX: if the format of the progress bar changes
-- * (especially the number of characters in the
-- * `static' portion of it), be sure to update
-- * these appropriately.
-- */
-- char buf[256]; /* workspace for progress bar */
--#define BAROVERHEAD 43 /* non `*' portion of progress bar */
-- /*
-- * stars should contain at least
-- * sizeof(buf) - BAROVERHEAD entries
-- */
-- const char stars[] =
--"*****************************************************************************"
--"*****************************************************************************"
--"*****************************************************************************";
--
--#endif
--
-- if (flag == -1) {
-- (void)gettimeofday(&start, NULL);
-- lastupdate = start;
-- lastsize = restart_point;
-- }
--#ifndef NO_PROGRESS
-- if (!progress)
-- return;
-- len = 0;
--
-- /*
-- * print progress bar only if we are foreground process.
-- */
-- if (! foregroundproc())
-- return;
--
-- (void)gettimeofday(&now, NULL);
-- cursize = bytes + restart_point;
-- timersub(&now, &lastupdate, &wait);
-- if (cursize > lastsize) {
-- lastupdate = now;
-- lastsize = cursize;
-- wait.tv_sec = 0;
-- }
--
-- len += snprintf(buf + len, BUFLEFT, "\r");
-- if (filesize > 0) {
-- ratio = (int)((double)cursize * 100.0 / (double)filesize);
-- ratio = MAX(ratio, 0);
-- ratio = MIN(ratio, 100);
-- len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
--
-- /*
-- * calculate the length of the `*' bar, ensuring that
-- * the number of stars won't exceed the buffer size
-- */
-- barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
-- if (barlength > 0) {
-- i = barlength * ratio / 100;
-- len += snprintf(buf + len, BUFLEFT,
-- "|%.*s%*s|", i, stars, barlength - i, "");
-- }
-- }
--
-- abbrevsize = cursize;
-- for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
-- abbrevsize >>= 10;
-- len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
-- (LLT)abbrevsize,
-- prefixes[i],
-- i == 0 ? ' ' : 'B');
--
-- timersub(&now, &start, &td);
-- elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
--
-- bytespersec = 0;
-- if (bytes > 0) {
-- bytespersec = bytes;
-- if (elapsed > 0.0)
-- bytespersec /= elapsed;
-- }
-- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
-- bytespersec >>= 10;
-- len += snprintf(buf + len, BUFLEFT,
-- " " LLFP("3") ".%02d %cB/s ",
-- (LLT)(bytespersec / 1024),
-- (int)((bytespersec % 1024) * 100 / 1024),
-- prefixes[i]);
--
-- if (filesize > 0) {
-- if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
-- len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
-- } else if (flag == 1) {
-- i = elapsed / SECSPERHOUR;
-- if (i)
-- len += snprintf(buf + len, BUFLEFT, "%2d:", i);
-- else
-- len += snprintf(buf + len, BUFLEFT, " ");
-- i = (int)elapsed % SECSPERHOUR;
-- len += snprintf(buf + len, BUFLEFT,
-- "%02d:%02d ", i / 60, i % 60);
-- } else if (wait.tv_sec >= STALLTIME) {
-- len += snprintf(buf + len, BUFLEFT, " - stalled -");
-- } else {
-- remaining = (int)
-- ((filesize - restart_point) / (bytes / elapsed) -
-- elapsed);
-- if (remaining >= 100 * SECSPERHOUR)
-- len += snprintf(buf + len, BUFLEFT,
-- " --:-- ETA");
-- else {
-- i = remaining / SECSPERHOUR;
-- if (i)
-- len += snprintf(buf + len, BUFLEFT,
-- "%2d:", i);
-- else
-- len += snprintf(buf + len, BUFLEFT,
-- " ");
-- i = remaining % SECSPERHOUR;
-- len += snprintf(buf + len, BUFLEFT,
-- "%02d:%02d ETA", i / 60, i % 60);
-- }
-- }
-- }
-- if (flag == 1)
-- len += snprintf(buf + len, BUFLEFT, "\n");
-- (void)write(fileno(ttyout), buf, len);
--
-- if (flag == -1) {
-- (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
-- alarmtimer(1); /* set alarm timer for 1 Hz */
-- } else if (flag == 1) {
-- (void)xsignal(SIGALRM, SIG_DFL);
-- alarmtimer(0);
-- }
--#endif /* !NO_PROGRESS */
--}
--
--/*
-- * Display transfer statistics.
-- * Requires start to be initialised by progressmeter(-1),
-- * direction to be defined by xfer routines, and filesize and bytes
-- * to be updated by xfer routines
-- * If siginfo is nonzero, an ETA is displayed, and the output goes to stderr
-- * instead of ttyout.
-- */
--void
--ptransfer(int siginfo)
--{
-- struct timeval now, td, wait;
-- double elapsed;
-- off_t bytespersec;
-- int remaining, hh, i, len;
--
-- char buf[256]; /* Work variable for transfer status. */
--
-- if (!verbose && !progress && !siginfo)
-- return;
--
-- (void)gettimeofday(&now, NULL);
-- timersub(&now, &start, &td);
-- elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
-- bytespersec = 0;
-- if (bytes > 0) {
-- bytespersec = bytes;
-- if (elapsed > 0.0)
-- bytespersec /= elapsed;
-- }
-- len = 0;
-- len += snprintf(buf + len, BUFLEFT, LLF " byte%s %s in ",
-- (LLT)bytes, bytes == 1 ? "" : "s", direction);
-- remaining = (int)elapsed;
-- if (remaining > SECSPERDAY) {
-- int days;
--
-- days = remaining / SECSPERDAY;
-- remaining %= SECSPERDAY;
-- len += snprintf(buf + len, BUFLEFT,
-- "%d day%s ", days, days == 1 ? "" : "s");
-- }
-- hh = remaining / SECSPERHOUR;
-- remaining %= SECSPERHOUR;
-- if (hh)
-- len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
-- len += snprintf(buf + len, BUFLEFT,
-- "%02d:%02d ", remaining / 60, remaining % 60);
--
-- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
-- bytespersec >>= 10;
-- len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
-- (LLT)(bytespersec / 1024),
-- (int)((bytespersec % 1024) * 100 / 1024),
-- prefixes[i]);
--
-- if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
-- && bytes + restart_point <= filesize) {
-- remaining = (int)((filesize - restart_point) /
-- (bytes / elapsed) - elapsed);
-- hh = remaining / SECSPERHOUR;
-- remaining %= SECSPERHOUR;
-- len += snprintf(buf + len, BUFLEFT, " ETA: ");
-- if (hh)
-- len += snprintf(buf + len, BUFLEFT, "%2d:", hh);
-- len += snprintf(buf + len, BUFLEFT, "%02d:%02d",
-- remaining / 60, remaining % 60);
-- timersub(&now, &lastupdate, &wait);
-- if (wait.tv_sec >= STALLTIME)
-- len += snprintf(buf + len, BUFLEFT, " (stalled)");
-- }
-- len += snprintf(buf + len, BUFLEFT, "\n");
-- (void)write(siginfo ? STDERR_FILENO : fileno(ttyout), buf, len);
--}
--
--/*
-- * SIG{INFO,QUIT} handler to print transfer stats if a transfer is in progress
-- */
--void
--psummary(int notused)
--{
-- int oerrno = errno;
--
-- if (bytes > 0) {
-- if (fromatty)
-- write(fileno(ttyout), "\n", 1);
-- ptransfer(1);
-- }
-- errno = oerrno;
--}
-
- /*
- * List words in stringlist, vertically arranged
-@@ -1158,20 +886,6 @@
-
-
- /*
-- * Set the SIGALRM interval timer for wait seconds, 0 to disable.
-- */
--void
--alarmtimer(int wait)
--{
-- struct itimerval itv;
--
-- itv.it_value.tv_sec = wait;
-- itv.it_value.tv_usec = 0;
-- itv.it_interval = itv.it_value;
-- setitimer(ITIMER_REAL, &itv, NULL);
--}
--
--/*
- * Setup or cleanup EditLine structures
- */
- #ifndef NO_EDITCOMPLETE
-@@ -1552,85 +1266,4 @@
- if (s == NULL)
- err(1, "Unable to allocate memory for string copy");
- return (s);
--}
--
--/*
-- * Install a POSIX signal handler, allowing the invoker to set whether
-- * the signal should be restartable or not
-- */
--sigfunc
--xsignal_restart(int sig, sigfunc func, int restartable)
--{
--#ifdef ultrix /* XXX: this is lame - how do we test sigvec vs. sigaction? */
-- struct sigvec vec, ovec;
--
-- vec.sv_handler = func;
-- sigemptyset(&vec.sv_mask);
-- vec.sv_flags = 0;
-- if (sigvec(sig, &vec, &ovec) < 0)
-- return (SIG_ERR);
-- return (ovec.sv_handler);
--#else /* ! ultrix */
-- struct sigaction act, oact;
-- act.sa_handler = func;
--
-- sigemptyset(&act.sa_mask);
--#if defined(SA_RESTART) /* 4.4BSD, Posix(?), SVR4 */
-- act.sa_flags = restartable ? SA_RESTART : 0;
--#elif defined(SA_INTERRUPT) /* SunOS 4.x */
-- act.sa_flags = restartable ? 0 : SA_INTERRUPT;
--#else
--#error "system must have SA_RESTART or SA_INTERRUPT"
--#endif
-- if (sigaction(sig, &act, &oact) < 0)
-- return (SIG_ERR);
-- return (oact.sa_handler);
--#endif /* ! ultrix */
--}
--
--/*
-- * Install a signal handler with the `restartable' flag set dependent upon
-- * which signal is being set. (This is a wrapper to xsignal_restart())
-- */
--sigfunc
--xsignal(int sig, sigfunc func)
--{
-- int restartable;
--
-- /*
-- * Some signals print output or change the state of the process.
-- * There should be restartable, so that reads and writes are
-- * not affected. Some signals should cause program flow to change;
-- * these signals should not be restartable, so that the system call
-- * will return with EINTR, and the program will go do something
-- * different. If the signal handler calls longjmp() or siglongjmp(),
-- * it doesn't matter if it's restartable.
-- */
--
-- switch(sig) {
--#ifdef SIGINFO
-- case SIGINFO:
--#endif
-- case SIGQUIT:
-- case SIGUSR1:
-- case SIGUSR2:
-- case SIGWINCH:
-- restartable = 1;
-- break;
--
-- case SIGALRM:
-- case SIGINT:
-- case SIGPIPE:
-- restartable = 0;
-- break;
--
-- default:
-- /*
-- * This is unpleasant, but I don't know what would be better.
-- * Right now, this "can't happen"
-- */
-- errx(1, "xsignal_restart called with signal %d", sig);
-- }
--
-- return(xsignal_restart(sig, func, restartable));
- }
-diff -Nru src/version.h /home/spock/ftp/version.h
---- src/version.h Sat Jun 15 05:40:37 2002
-+++ /home/spock/ftp/version.h Thu Jun 12 02:02:11 2003
-@@ -1,6 +1,6 @@
--/* $NetBSD: version.h,v 1.29 2002/06/05 10:20:51 lukem Exp $ */
-+/* $NetBSD: version.h,v 1.30 2003/02/28 09:54:20 lukem Exp $ */
- /*-
-- * Copyright (c) 1999-2002 The NetBSD Foundation, Inc.
-+ * Copyright (c) 1999-2003 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
-@@ -40,5 +40,5 @@
- #endif
-
- #ifndef FTP_VERSION
--#define FTP_VERSION "20020605"
-+#define FTP_VERSION "20030228"
- #endif
diff --git a/contrib/lukemftp/install-sh b/contrib/lukemftp/install-sh
deleted file mode 100755
index e9de238..0000000
--- a/contrib/lukemftp/install-sh
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission. M.I.T. makes no representations about the
-# suitability of this software for any purpose. It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch. It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
- case $1 in
- -c) instcmd="$cpprog"
- shift
- continue;;
-
- -d) dir_arg=true
- shift
- continue;;
-
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
-
- -o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd="$stripprog"
- shift
- continue;;
-
- -t=*) transformarg=`echo $1 | sed 's/-t=//'`
- shift
- continue;;
-
- -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
- shift
- continue;;
-
- *) if [ x"$src" = x ]
- then
- src=$1
- else
- # this colon is to work around a 386BSD /bin/sh bug
- :
- dst=$1
- fi
- shift
- continue;;
- esac
-done
-
-if [ x"$src" = x ]
-then
- echo "install: no input file specified"
- exit 1
-else
- true
-fi
-
-if [ x"$dir_arg" != x ]; then
- dst=$src
- src=""
-
- if [ -d $dst ]; then
- instcmd=:
- chmodcmd=""
- else
- instcmd=mkdir
- fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
-
- if [ -f $src -o -d $src ]
- then
- true
- else
- echo "install: $src does not exist"
- exit 1
- fi
-
- if [ x"$dst" = x ]
- then
- echo "install: no destination specified"
- exit 1
- else
- true
- fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
- if [ -d $dst ]
- then
- dst="$dst"/`basename $src`
- else
- true
- fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-# this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
- pathcomp="${pathcomp}${1}"
- shift
-
- if [ ! -d "${pathcomp}" ] ;
- then
- $mkdirprog "${pathcomp}"
- else
- true
- fi
-
- pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
- $doit $instcmd $dst &&
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
- if [ x"$transformarg" = x ]
- then
- dstfile=`basename $dst`
- else
- dstfile=`basename $dst $transformbasename |
- sed $transformarg`$transformbasename
- fi
-
-# don't allow the sed command to completely eliminate the filename
-
- if [ x"$dstfile" = x ]
- then
- dstfile=`basename $dst`
- else
- true
- fi
-
-# Make a temp file name in the proper directory.
-
- dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
- $doit $instcmd $src $dsttmp &&
-
- trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing. If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
- $doit $rmcmd -f $dstdir/$dstfile &&
- $doit $mvcmd $dsttmp $dstdir/$dstfile
-
-fi &&
-
-
-exit 0
diff --git a/contrib/lukemftp/lukemftp.h b/contrib/lukemftp/lukemftp.h
deleted file mode 100644
index e8d83f6..0000000
--- a/contrib/lukemftp/lukemftp.h
+++ /dev/null
@@ -1,403 +0,0 @@
-/* $Id: lukemftp.h,v 1.43 2002/06/10 08:13:01 lukem Exp $ */
-
-#define FTP_PRODUCT "lukemftp"
-#define FTP_VERSION "1.6-beta2"
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-
-#include <arpa/ftp.h>
-#include <arpa/inet.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <unistd.h>
-
-#if HAVE_POLL
-# if HAVE_POLL_H
-# include <poll.h>
-# elif HAVE_SYS_POLL_H
-# include <sys/poll.h>
-# endif
-#elif HAVE_SELECT
-# define USE_SELECT
-#else
-# error "no poll() or select() found"
-#endif
-
-#if HAVE_DIRENT_H
-# include <dirent.h>
-#else
-# define dirent direct
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif
-#endif
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-#endif
-
-#if HAVE_ERR_H
-# include <err.h>
-#endif
-
-#if USE_GLOB_H /* not set by configure; used by other build systems */
-# include <glob.h>
-#else
-# include "ftpglob.h"
-#endif
-
-#if HAVE_PATHS_H
-# include <paths.h>
-#endif
-#ifndef _PATH_BSHELL
-#define _PATH_BSHELL "/bin/sh"
-#endif
-#ifndef _PATH_TMP
-#define _PATH_TMP "/tmp/"
-#endif
-
-typedef struct _stringlist {
- char **sl_str;
- size_t sl_max;
- size_t sl_cur;
-} StringList;
-
-StringList *sl_init(void);
-int sl_add(StringList *, char *);
-void sl_free(StringList *, int);
-char *sl_find(StringList *, char *);
-
-#if HAVE_TERMCAP_H
-# include <termcap.h>
-#else
-int tgetent(char *, const char *);
-char *tgetstr(const char *, char **);
-int tgetflag(const char *);
-int tgetnum(const char *);
-char *tgoto(const char *, int, int);
-void tputs(const char *, int, int (*)(int));
-#endif
-
-#if HAVE_UTIL_H
-# include <util.h>
-#endif
-
-#if HAVE_LIBUTIL_H
-# include <libutil.h>
-#endif
-
-#if HAVE_VIS_H
-# include <vis.h>
-#else
-# include "ftpvis.h"
-#endif
-
-#if ! HAVE_IN_PORT_T
-typedef unsigned short in_port_t;
-#endif
-
-#if ! HAVE_SA_FAMILY_T
-typedef unsigned short sa_family_t;
-#endif
-
-#if ! HAVE_SOCKLEN_T
-typedef unsigned int socklen_t;
-#endif
-
-#if HAVE_AF_INET6 && HAVE_SOCKADDR_IN6
-# define INET6
-#endif
-
-
-#if ! HAVE_RFC2553_NETDB
-
- /* RFC 2553 */
-#undef EAI_ADDRFAMILY
-#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */
-#undef EAI_AGAIN
-#define EAI_AGAIN 2 /* temporary failure in name resolution */
-#undef EAI_BADFLAGS
-#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
-#undef EAI_FAIL
-#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
-#undef EAI_FAMILY
-#define EAI_FAMILY 5 /* ai_family not supported */
-#undef EAI_MEMORY
-#define EAI_MEMORY 6 /* memory allocation failure */
-#undef EAI_NODATA
-#define EAI_NODATA 7 /* no address associated with hostname */
-#undef EAI_NONAME
-#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
-#undef EAI_SERVICE
-#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
-#undef EAI_SOCKTYPE
-#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
-#undef EAI_SYSTEM
-#define EAI_SYSTEM 11 /* system error returned in errno */
-
- /* KAME extensions? */
-#undef EAI_BADHINTS
-#define EAI_BADHINTS 12
-#undef EAI_PROTOCOL
-#define EAI_PROTOCOL 13
-#undef EAI_MAX
-#define EAI_MAX 14
-
- /* RFC 2553 */
-#undef NI_MAXHOST
-#define NI_MAXHOST 1025
-#undef NI_MAXSERV
-#define NI_MAXSERV 32
-
-#undef NI_NOFQDN
-#define NI_NOFQDN 0x00000001
-#undef NI_NUMERICHOST
-#define NI_NUMERICHOST 0x00000002
-#undef NI_NAMEREQD
-#define NI_NAMEREQD 0x00000004
-#undef NI_NUMERICSERV
-#define NI_NUMERICSERV 0x00000008
-#undef NI_DGRAM
-#define NI_DGRAM 0x00000010
-
- /* RFC 2553 */
-#undef AI_PASSIVE
-#define AI_PASSIVE 0x00000001 /* get address to use bind() */
-#undef AI_CANONNAME
-#define AI_CANONNAME 0x00000002 /* fill ai_canonname */
-
- /* KAME extensions ? */
-#undef AI_NUMERICHOST
-#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */
-#undef AI_MASK
-#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
-
- /* RFC 2553 */
-#undef AI_ALL
-#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
-#undef AI_V4MAPPED_CFG
-#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
-#undef AI_ADDRCONFIG
-#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */
-#undef AI_V4MAPPED
-#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */
-
-#endif /* ! HAVE_RFC2553_NETDB */
-
-
-#if ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO
-
-struct addrinfo {
- int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
- int ai_family; /* PF_xxx */
- int ai_socktype; /* SOCK_xxx */
- int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
- size_t ai_addrlen; /* length of ai_addr */
- char *ai_canonname; /* canonical name for hostname */
- struct sockaddr *ai_addr; /* binary address */
- struct addrinfo *ai_next; /* next structure in linked list */
-};
-
-int getaddrinfo(const char *, const char *,
- const struct addrinfo *, struct addrinfo **);
-int getnameinfo(const struct sockaddr *, socklen_t, char *,
- size_t, char *, size_t, int);
-void freeaddrinfo(struct addrinfo *);
-char *gai_strerror(int);
-
-#endif /* ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO */
-
-
-#if ! HAVE_D_NAMLEN
-# define DIRENT_MISSING_D_NAMLEN
-#endif
-
-#if ! HAVE_H_ERRNO_D
-extern int h_errno;
-#endif
-#define HAVE_H_ERRNO 1 /* XXX: an assumption for now... */
-
-#if ! HAVE_FCLOSE_D
-int fclose(FILE *);
-#endif
-
-#if ! HAVE_GETPASS_D
-char *getpass(const char *);
-#endif
-
-#if ! HAVE_OPTARG_D
-extern char *optarg;
-#endif
-
-#if ! HAVE_OPTIND_D
-extern int optind;
-#endif
-
-#if ! HAVE_PCLOSE_D
-int pclose(FILE *);
-#endif
-
-#if ! HAVE_ERR
-void err(int, const char *, ...);
-void errx(int, const char *, ...);
-void warn(const char *, ...);
-void warnx(const char *, ...);
-#endif
-
-#if ! HAVE_FGETLN
-char *fgetln(FILE *, size_t *);
-#endif
-
-#if ! HAVE_FSEEKO
-int fseeko(FILE *, off_t, int);
-#endif
-
-#if ! HAVE_FPARSELN
-# define FPARSELN_UNESCESC 0x01
-# define FPARSELN_UNESCCONT 0x02
-# define FPARSELN_UNESCCOMM 0x04
-# define FPARSELN_UNESCREST 0x08
-# define FPARSELN_UNESCALL 0x0f
-char *fparseln(FILE *, size_t *, size_t *, const char[3], int);
-#endif
-
-#if ! HAVE_INET_NTOP
-const char *inet_ntop(int, const void *, char *, size_t);
-#endif
-
-#if ! HAVE_INET_PTON
-int inet_pton(int, const char *, void *);
-#endif
-
-#if ! HAVE_MKSTEMP
-int mkstemp(char *);
-#endif
-
-#if ! HAVE_SETPROGNAME
-const char *getprogname(void);
-void setprogname(const char *);
-#endif
-
-#if ! HAVE_SNPRINTF
-int snprintf(char *, size_t, const char *, ...);
-#endif
-
-#if ! HAVE_STRDUP
-char *strdup(const char *);
-#endif
-
-#if ! HAVE_STRERROR
-char *strerror(int);
-#endif
-
-#if ! HAVE_STRPTIME || ! HAVE_STRPTIME_D
-char *strptime(const char *, const char *, struct tm *);
-#endif
-
-#if HAVE_QUAD_SUPPORT
-# if ! HAVE_STRTOLL && HAVE_LONG_LONG
-long long strtoll(const char *, char **, int);
-# if ! defined(QUAD_MIN)
-# define QUAD_MIN (-0x7fffffffffffffffL-1)
-# endif
-# if ! defined(QUAD_MAX)
-# define QUAD_MAX (0x7fffffffffffffffL)
-# endif
-# endif
-#else /* ! HAVE_QUAD_SUPPORT */
-# define NO_LONG_LONG 1
-#endif /* ! HAVE_QUAD_SUPPORT */
-
-#if ! HAVE_TIMEGM
-time_t timegm(struct tm *);
-#endif
-
-#if ! HAVE_HSTRERROR
-char *strerror(int);
-#endif
-
-#if ! HAVE_STRLCAT
-size_t strlcat(char *, const char *, size_t);
-#endif
-
-#if ! HAVE_STRLCPY
-size_t strlcpy(char *, const char *, size_t);
-#endif
-
-#if ! HAVE_STRSEP
-char *strsep(char **stringp, const char *delim);
-#endif
-
-#if ! HAVE_MEMMOVE
-# define memmove(a,b,c) bcopy((b),(a),(c))
- /* XXX: add others #defines for borken systems? */
-#endif
-
-#if HAVE_GETPASSPHRASE
-# define getpass getpassphrase
-#endif
-
-#if ! defined(MIN)
-# define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-#if ! defined(MAX)
-# define MAX(a, b) ((a) < (b) ? (b) : (a))
-#endif
-
-#if ! defined(timersub)
-# define timersub(tvp, uvp, vvp) \
- do { \
- (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
- (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
- if ((vvp)->tv_usec < 0) { \
- (vvp)->tv_sec--; \
- (vvp)->tv_usec += 1000000; \
- } \
- } while (0)
-#endif
-
-#if ! defined(S_ISLNK)
-# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
-#endif
-
-#define EPOCH_YEAR 1970
-#define SECSPERHOUR 3600
-#define SECSPERDAY 86400
-#define TM_YEAR_BASE 1900
diff --git a/contrib/lukemftp/src/Makefile b/contrib/lukemftp/src/Makefile
deleted file mode 100644
index 79cc5a6..0000000
--- a/contrib/lukemftp/src/Makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-# $NetBSD: Makefile,v 1.30 2005/02/11 15:13:28 jmc Exp $
-# from: @(#)Makefile 8.2 (Berkeley) 4/3/94
-
-.include <bsd.own.mk>
-
-PROG= ftp
-SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
- progressbar.c ruserpass.c util.c
-
-# Uncomment the following to provide defaults for gate-ftp operation
-#
-#CPPFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
-
-.if defined(SMALLPROG)
-CPPFLAGS+=-DNO_EDITCOMPLETE -DNO_ABOUT -DNO_AUTH -DNO_HELP -DNO_STATUS
-.else
-LDADD+= -ledit -ltermcap
-DPADD+= ${LIBEDIT} ${LIBTERMCAP}
-.endif
-
-.if (!defined(SMALLPROG) || defined(SMALLPROG_INET6)) && (${USE_INET6} != "no")
-CPPFLAGS+= -DINET6
-.endif
-
-cmds.o fetch.o: version.h
-main.o: ftp_var.h
-
-.include <bsd.prog.mk>
diff --git a/contrib/lukemftp/src/Makefile.in b/contrib/lukemftp/src/Makefile.in
deleted file mode 100644
index bb60f10..0000000
--- a/contrib/lukemftp/src/Makefile.in
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# $Id: Makefile.in,v 1.8 2000/08/08 07:04:27 lukem Exp $
-#
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-SHELL = /bin/sh
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-mandir = @mandir@
-transform = @program_transform_name@
-
-mandircat1 = ${mandir}/cat1
-
-CC = @CC@
-CFLAGS = -I${srcdir} -I${srcdir}/.. -I. -I.. @INCLUDES@ @CFLAGS@
-LIBS = @LIBS@
-LDFLAGS = @LDFLAGS@
-
-INSTALL = @INSTALL@
-
-PROG = ftp
-OBJS = cmds.o cmdtab.o complete.o domacro.o fetch.o ftp.o main.o \
- ruserpass.o util.o
-
-all: ${PROG}
-
-install: all
- -mkdir -p ${bindir}
- ${INSTALL} -m 555 ${PROG} ${bindir}/`echo ${PROG}|sed '$(transform)'`
- -mkdir -p ${mandircat1}
- ${INSTALL} -m 444 ${srcdir}/${PROG}.cat1 ${mandircat1}/`echo ${PROG}|sed '$(transform)'`.1
-
-${PROG}: ${OBJS} @LIBDEPENDS@
- ${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS}
-
-clean:
- rm -f core ${PROG} ${OBJS}
-
-distclean: clean
- rm -f Makefile
diff --git a/contrib/lukemftp/todo b/contrib/lukemftp/todo
deleted file mode 100644
index 4863815..0000000
--- a/contrib/lukemftp/todo
+++ /dev/null
@@ -1,25 +0,0 @@
-$Id: todo,v 1.30 2002/06/10 08:08:53 lukem Exp $
-
-update NEWS, README, ...
-
-at end of configure, show summary of options used and features found
-
-if socks is defined, disable ipv6 and use own getaddrinfo()/getnameinfo()
-(for tron)
-
-add locale autoconf checks
-
-AC_CHECK_SIZEOF(off_t, 0) doesn't work on FreeBSD 4.0 because the
-test doesn't include <sys/types.h>. fix autoconf?
-
-in configure, check for ansi c compiler and barf if it fails
-
-check if we need #defines for memcpy() et al
-
-check for utimes() decls [which system?]
-
-possibly install editline.3 and editrc.5
-
-system specific tests (to remove need for manual intervention):
-- sunos4
- LIBS+= -lresolv
diff --git a/contrib/lukemftpd/src/ftpd.c b/contrib/lukemftpd/src/ftpd.c
index afdd517..8b06649 100644
--- a/contrib/lukemftpd/src/ftpd.c
+++ b/contrib/lukemftpd/src/ftpd.c
@@ -1263,8 +1263,9 @@ end_login(void)
curclass.type = CLASS_REAL;
(void) seteuid((uid_t)0);
#ifdef LOGIN_CAP
- setusercontext(NULL, getpwuid(0), 0,
- LOGIN_SETPRIORITY|LOGIN_SETRESOURCES|LOGIN_SETUMASK|LOGIN_SETMAC);
+ setusercontext(NULL, getpwuid(0), 0, LOGIN_SETALL & ~(LOGIN_SETLOGIN |
+ LOGIN_SETUSER | LOGIN_SETGROUP | LOGIN_SETPATH |
+ LOGIN_SETENV));
#endif
#ifdef USE_PAM
if (pamh) {
@@ -1427,9 +1428,8 @@ pass(const char *passwd)
#endif
}
setsid();
- setusercontext(lc, pw, 0,
- LOGIN_SETLOGIN|LOGIN_SETGROUP|LOGIN_SETPRIORITY|
- LOGIN_SETRESOURCES|LOGIN_SETUMASK|LOGIN_SETMAC);
+ setusercontext(lc, pw, 0, LOGIN_SETALL &
+ ~(LOGIN_SETUSER | LOGIN_SETPATH | LOGIN_SETENV));
#else
(void) initgroups(pw->pw_name, pw->pw_gid);
/* cache groups for cmds.c::matchgroup() */
diff --git a/contrib/ntp/ntpd/ntp_config.c b/contrib/ntp/ntpd/ntp_config.c
index beb4c48..99af999 100644
--- a/contrib/ntp/ntpd/ntp_config.c
+++ b/contrib/ntp/ntpd/ntp_config.c
@@ -414,7 +414,7 @@ enum gnn_type {
static int getnetnum P((const char *, struct sockaddr_storage *, int,
enum gnn_type));
static void save_resolve P((char *, int, int, int, int, u_int, int,
- keyid_t, u_char *));
+ keyid_t, u_char *, u_char));
static void do_resolve_internal P((void));
static void abort_resolve P((void));
#if !defined(VMS) && !defined(SYS_WINNT)
@@ -870,9 +870,9 @@ getconfig(
stoa(&peeraddr));
}
} else if (errflg == -1) {
- save_resolve(tokens[1], hmode, peerversion,
+ save_resolve(tokens[istart - 1], hmode, peerversion,
minpoll, maxpoll, peerflags, ttl,
- peerkey, peerkeystr);
+ peerkey, peerkeystr, peeraddr.ss_family);
}
break;
@@ -2325,7 +2325,8 @@ save_resolve(
u_int flags,
int ttl,
keyid_t keyid,
- u_char *keystr
+ u_char *keystr,
+ u_char peeraf
)
{
#ifndef SYS_VXWORKS
@@ -2365,11 +2366,11 @@ save_resolve(
}
#endif
- (void)fprintf(res_fp, "%s %d %d %d %d %d %d %u %s\n", name,
+ (void)fprintf(res_fp, "%s %u %d %d %d %d %d %d %u %s\n", name, peeraf,
mode, version, minpoll, maxpoll, flags, ttl, keyid, keystr);
#ifdef DEBUG
if (debug > 1)
- printf("config: %s %d %d %d %d %x %d %u %s\n", name, mode,
+ printf("config: %s %u %d %d %d %d %x %d %u %s\n", name, peeraf, mode,
version, minpoll, maxpoll, flags, ttl, keyid, keystr);
#endif
diff --git a/contrib/ntp/ntpd/ntp_intres.c b/contrib/ntp/ntpd/ntp_intres.c
index 5facc85..e18888f 100644
--- a/contrib/ntp/ntpd/ntp_intres.c
+++ b/contrib/ntp/ntpd/ntp_intres.c
@@ -29,6 +29,7 @@
#include <stdio.h>
#include <ctype.h>
+#include <resolv.h>
#include <signal.h>
/**/
@@ -111,15 +112,16 @@ static int resolve_value; /* next value of resolve timer */
* is supposed to consist of entries in the following order
*/
#define TOK_HOSTNAME 0
-#define TOK_HMODE 1
-#define TOK_VERSION 2
-#define TOK_MINPOLL 3
-#define TOK_MAXPOLL 4
-#define TOK_FLAGS 5
-#define TOK_TTL 6
-#define TOK_KEYID 7
-#define TOK_KEYSTR 8
-#define NUMTOK 9
+#define TOK_PEERAF 1
+#define TOK_HMODE 2
+#define TOK_VERSION 3
+#define TOK_MINPOLL 4
+#define TOK_MAXPOLL 5
+#define TOK_FLAGS 6
+#define TOK_TTL 7
+#define TOK_KEYID 8
+#define TOK_KEYSTR 9
+#define NUMTOK 10
#define MAXLINESIZE 512
@@ -140,7 +142,7 @@ char *req_file; /* name of the file with configuration info */
static void checkparent P((void));
static void removeentry P((struct conf_entry *));
static void addentry P((char *, int, int, int, int, u_int,
- int, keyid_t, char *));
+ int, keyid_t, char *, u_char));
static int findhostaddr P((struct conf_entry *));
static void openntp P((void));
static int request P((struct conf_peer *));
@@ -397,7 +399,8 @@ addentry(
u_int flags,
int ttl,
keyid_t keyid,
- char *keystr
+ char *keystr,
+ u_char peeraf
)
{
register char *cp;
@@ -407,7 +410,7 @@ addentry(
#ifdef DEBUG
if (debug > 1)
msyslog(LOG_INFO,
- "intres: <%s> %d %d %d %d %x %d %x %s\n", name,
+ "intres: <%s> %u %d %d %d %d %x %d %x %s\n", name, peeraf,
mode, version, minpoll, maxpoll, flags, ttl, keyid,
keystr);
#endif
@@ -422,6 +425,7 @@ addentry(
ce->ce_peeraddr6 = in6addr_any;
#endif
ANYSOCK(&ce->peer_store);
+ ce->peer_store.ss_family = peeraf; /* Save AF for getaddrinfo hints. */
ce->ce_hmode = (u_char)mode;
ce->ce_version = (u_char)version;
ce->ce_minpoll = (u_char)minpoll;
@@ -482,7 +486,8 @@ findhostaddr(
entry->ce_name));
memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
+ hints.ai_family = entry->peer_store.ss_family;
+ hints.ai_socktype = SOCK_DGRAM;
/*
* If the IPv6 stack is not available look only for IPv4 addresses
*/
@@ -1051,6 +1056,13 @@ readconf(
}
}
+ if (intval[TOK_PEERAF] != AF_UNSPEC && intval[TOK_PEERAF] !=
+ AF_INET && intval[TOK_PEERAF] != AF_INET6) {
+ msyslog(LOG_ERR, "invalid peer address family (%u) in "
+ "file %s", intval[TOK_PEERAF], name);
+ exit(1);
+ }
+
if (intval[TOK_HMODE] != MODE_ACTIVE &&
intval[TOK_HMODE] != MODE_CLIENT &&
intval[TOK_HMODE] != MODE_BROADCAST) {
@@ -1107,7 +1119,7 @@ readconf(
addentry(token[TOK_HOSTNAME], (int)intval[TOK_HMODE],
(int)intval[TOK_VERSION], (int)intval[TOK_MINPOLL],
(int)intval[TOK_MAXPOLL], flags, (int)intval[TOK_TTL],
- intval[TOK_KEYID], token[TOK_KEYSTR]);
+ intval[TOK_KEYID], token[TOK_KEYSTR], (u_char)intval[TOK_PEERAF]);
}
}
@@ -1129,6 +1141,9 @@ doconfigure(
dores ? "with" : "without" );
#endif
+ if (dores) /* Reload /etc/resolv.conf - bug 1226 */
+ res_init();
+
ce = confentries;
while (ce != NULL) {
#ifdef DEBUG
diff --git a/contrib/ntp/ntpd/ntp_io.c b/contrib/ntp/ntpd/ntp_io.c
index 8dac3c4..2d5572a 100644
--- a/contrib/ntp/ntpd/ntp_io.c
+++ b/contrib/ntp/ntpd/ntp_io.c
@@ -2716,14 +2716,14 @@ sendpkt(
for (slot = ERRORCACHESIZE; --slot >= 0; )
if(dest->ss_family == AF_INET) {
- if (badaddrs[slot].port == ((struct sockaddr_in*)dest)->sin_port &&
+ if (badaddrs[slot].port == SRCPORT(dest) &&
badaddrs[slot].addr.s_addr == ((struct sockaddr_in*)dest)->sin_addr.s_addr)
break;
}
#ifdef INCLUDE_IPV6_SUPPORT
else if (dest->ss_family == AF_INET6) {
- if (badaddrs6[slot].port == ((struct sockaddr_in6*)dest)->sin6_port &&
- badaddrs6[slot].addr.s6_addr == ((struct sockaddr_in6*)dest)->sin6_addr.s6_addr)
+ if (badaddrs6[slot].port == SRCPORT(dest) &&
+ !memcmp(&badaddrs6[slot].addr, &((struct sockaddr_in6*)dest)->sin6_addr, sizeof(struct in6_addr)))
break;
}
#endif /* INCLUDE_IPV6_SUPPORT */
diff --git a/contrib/pf/authpf/authpf.8 b/contrib/pf/authpf/authpf.8
index bd4ff40..d365057 100644
--- a/contrib/pf/authpf/authpf.8
+++ b/contrib/pf/authpf/authpf.8
@@ -1,5 +1,5 @@
.\" $FreeBSD$
-.\" $OpenBSD: authpf.8,v 1.43 2007/02/24 17:21:04 beck Exp $
+.\" $OpenBSD: authpf.8,v 1.47 2009/01/06 03:11:50 mcbride Exp $
.\"
.\" Copyright (c) 1998-2007 Bob Beck (beck@openbsd.org>. All rights reserved.
.\"
@@ -15,14 +15,16 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd March 28, 2006
+.Dd January 6 2009
.Dt AUTHPF 8
.Os
.Sh NAME
-.Nm authpf
+.Nm authpf ,
+.Nm authpf-noip
.Nd authenticating gateway user shell
.Sh SYNOPSIS
.Nm authpf
+.Nm authpf-noip
.Sh DESCRIPTION
.Nm
is a user shell for authenticating gateways.
@@ -31,47 +33,63 @@ It is used to change
rules when a user authenticates and starts a session with
.Xr sshd 8
and to undo these changes when the user's session exits.
-It is designed for changing filter and translation rules for an individual
-source IP address as long as a user maintains an active
-.Xr ssh 1
-session.
Typical use would be for a gateway that authenticates users before
allowing them Internet use, or a gateway that allows different users into
different places.
+Combined with properly set up filter rules and secure switches,
.Nm
-logs the successful start and end of a session to
-.Xr syslogd 8 .
-This, combined with properly set up filter rules and secure switches,
can be used to ensure users are held accountable for their network traffic.
+It is meant to be used with users who can connect via
+.Xr ssh 1
+only, and requires the
+.Xr pf 4
+subsystem to be enabled.
.Pp
+.Nm authpf-noip
+is a user shell
+which allows multiple connections to take
+place from the same IP address.
+It is useful primarily in cases where connections are tunneled via
+the gateway system, and can be directly associated with the user name.
+It cannot ensure accountability when
+classifying connections by IP address;
+in this case the client's IP address
+is not provided to the packet filter via the
+.Ar client_ip
+macro or the
+.Ar authpf_users
+table.
+Additionally, states associated with the client IP address
+are not purged when the session is ended.
+.Pp
+To use either
.Nm
-can add filter and translation rules using the syntax described in
-.Xr pf.conf 5 .
-.Nm
-requires that the
-.Xr pf 4
-system be enabled and a
-.Xr fdescfs 5
-file system be mounted at
-.Pa /dev/fd
-before use.
-.Nm
-can also maintain the list of IP address of connected users
-in the "authpf_users"
-.Pa table .
+or
+.Nm authpf-noip ,
+the user's shell needs to be set to
+.Pa /usr/sbin/authpf
+or
+.Pa /usr/sbin/authpf-noip .
.Pp
.Nm
-is meant to be used with users who can connect via
+uses the
+.Xr pf.conf 5
+syntax to change filter and translation rules for an individual
+user or client IP address as long as a user maintains an active
.Xr ssh 1
-only.
-On startup,
+session, and logs the successful start and end of a session to
+.Xr syslogd 8 .
.Nm
retrieves the client's connecting IP address via the
.Ev SSH_CLIENT
environment variable and, after performing additional access checks,
reads a template file to determine what filter and translation rules
-(if any) to add.
-On session exit the same rules that were added at startup are removed.
+(if any) to add, and
+maintains the list of IP addresses of connected users in the
+.Ar authpf_users
+table.
+On session exit the same rules and table entries that were added at startup
+are removed, and all states associated with the client's IP address are purged.
.Pp
Each
.Nm
@@ -185,6 +203,9 @@ It is also possible to configure
to only allow specific users access.
This is done by listing their login names, one per line, in
.Pa /etc/authpf/authpf.allow .
+A group of users can also be indicated by prepending "%" to the group name,
+and all members of a login class can be indicated by prepending "@" to the
+login class name.
If "*" is found on a line, then all usernames match.
If
.Nm
@@ -297,7 +318,8 @@ They have a
wireless network which they would like to protect from unauthorized use.
To accomplish this, they create the file
.Pa /etc/authpf/authpf.allow
-which lists their login ids, one per line.
+which lists their login ids, group prepended with "%", or login class
+prepended with "@", one per line.
At this point, even if eve could authenticate to
.Xr sshd 8 ,
she would not be allowed to use the gateway.
@@ -501,6 +523,31 @@ table <authpf_users> persist
anchor "authpf/*" from <authpf_users>
rdr-anchor "authpf/*" from <authpf_users>
.Ed
+.Pp
+.Sy Tunneled users
+\- normally
+.Nm
+allows only one session per client IP address.
+However in some cases, such as when connections are tunneled via
+.Xr ssh 1
+or
+.Xr ipsec 4 ,
+the connections can be authorized based on the userid of the user instead of
+the client IP address.
+In this case it is appropriate to use
+.Nm authpf-noip
+to allow multiple users behind a NAT gateway to connect.
+In the
+.Pa /etc/authpf/authpf.rules
+example below, the remote user could tunnel a remote desktop session to their
+workstation:
+.Bd -literal
+internal_if="bge0"
+workstation_ip="10.2.3.4"
+
+pass out on $internal_if from (self) to $workstation_ip port 3389 \e
+ user $user_id
+.Ed
.Sh FILES
.Bl -tag -width "/etc/authpf/authpf.conf" -compact
.It Pa /etc/authpf/authpf.conf
@@ -512,7 +559,6 @@ rdr-anchor "authpf/*" from <authpf_users>
.Sh SEE ALSO
.Xr pf 4 ,
.Xr pf.conf 5 ,
-.Xr fdescfs 5 ,
.Xr securelevel 7 ,
.Xr ftp-proxy 8
.Sh HISTORY
diff --git a/contrib/pf/authpf/authpf.c b/contrib/pf/authpf/authpf.c
index 56d7728..ac5d85b 100644
--- a/contrib/pf/authpf/authpf.c
+++ b/contrib/pf/authpf/authpf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: authpf.c,v 1.104 2007/02/24 17:35:08 beck Exp $ */
+/* $OpenBSD: authpf.c,v 1.112 2009/01/10 19:08:53 miod Exp $ */
/*
* Copyright (C) 1998 - 2007 Bob Beck (beck@openbsd.org).
@@ -19,7 +19,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
+#include <sys/types.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#endif
#include <login_cap.h>
#include <pwd.h>
+#include <grp.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -48,10 +49,11 @@ __FBSDID("$FreeBSD$");
#include "pathnames.h"
static int read_config(FILE *);
-static void print_message(char *);
-static int allowed_luser(char *);
-static int check_luser(char *, char *);
+static void print_message(const char *);
+static int allowed_luser(struct passwd *);
+static int check_luser(const char *, char *);
static int remove_stale_rulesets(void);
+static int recursive_ruleset_purge(char *, char *);
static int change_filter(int, const char *, const char *);
static int change_table(int, const char *);
static void authpf_kill_states(void);
@@ -60,8 +62,10 @@ int dev; /* pf device */
char anchorname[PF_ANCHOR_NAME_SIZE] = "authpf";
char rulesetname[MAXPATHLEN - PF_ANCHOR_NAME_SIZE - 2];
char tablename[PF_TABLE_NAME_SIZE] = "authpf_users";
+int user_ip = 1; /* controls whether $user_ip is set */
FILE *pidfp;
+int pidfd = -1;
char luser[MAXLOGNAME]; /* username */
char ipsrc[256]; /* ip as a string */
char pidfile[MAXPATHLEN]; /* we save pid in this file. */
@@ -75,6 +79,7 @@ static __dead2 void do_death(int);
#else
static __dead void do_death(int);
#endif
+extern char *__progname; /* program name */
/*
* User shell for authenticating gateways. Sole purpose is to allow
@@ -83,21 +88,24 @@ static __dead void do_death(int);
* up. Meant to be used only from ssh(1) connections.
*/
int
-main(int argc, char *argv[])
+main(void)
{
- int lockcnt = 0, n, pidfd;
+ int lockcnt = 0, n;
FILE *config;
struct in6_addr ina;
struct passwd *pw;
char *cp;
gid_t gid;
uid_t uid;
- char *shell;
+ const char *shell;
login_cap_t *lc;
+ if (strcmp(__progname, "-authpf-noip") == 0)
+ user_ip = 0;
+
config = fopen(PATH_CONFFILE, "r");
if (config == NULL) {
- syslog(LOG_ERR, "can not open %s (%m)", PATH_CONFFILE);
+ syslog(LOG_ERR, "cannot open %s (%m)", PATH_CONFFILE);
exit(1);
}
@@ -142,23 +150,34 @@ main(int argc, char *argv[])
}
if ((lc = login_getclass(pw->pw_class)) != NULL)
- shell = (char *)login_getcapstr(lc, "shell", pw->pw_shell,
+ shell = login_getcapstr(lc, "shell", pw->pw_shell,
pw->pw_shell);
else
shell = pw->pw_shell;
+#ifndef __FreeBSD__
login_close(lc);
+#endif
- if (strcmp(shell, PATH_AUTHPF_SHELL)) {
+ if (strcmp(shell, PATH_AUTHPF_SHELL) &&
+ strcmp(shell, PATH_AUTHPF_SHELL_NOIP)) {
syslog(LOG_ERR, "wrong shell for user %s, uid %u",
pw->pw_name, pw->pw_uid);
+#ifdef __FreeBSD__
+ login_close(lc);
+#else
if (shell != pw->pw_shell)
free(shell);
+#endif
goto die;
}
+#ifdef __FreeBSD__
+ login_close(lc);
+#else
if (shell != pw->pw_shell)
free(shell);
+#endif
/*
* Paranoia, but this data _does_ come from outside authpf, and
@@ -181,13 +200,22 @@ main(int argc, char *argv[])
}
- /* Make our entry in /var/authpf as /var/authpf/ipaddr */
- n = snprintf(pidfile, sizeof(pidfile), "%s/%s", PATH_PIDFILE, ipsrc);
+ /* Make our entry in /var/authpf as ipaddr or username */
+ n = snprintf(pidfile, sizeof(pidfile), "%s/%s",
+ PATH_PIDFILE, user_ip ? ipsrc : luser);
if (n < 0 || (u_int)n >= sizeof(pidfile)) {
syslog(LOG_ERR, "path to pidfile too long");
goto die;
}
+ signal(SIGTERM, need_death);
+ signal(SIGINT, need_death);
+ signal(SIGALRM, need_death);
+ signal(SIGPIPE, need_death);
+ signal(SIGHUP, need_death);
+ signal(SIGQUIT, need_death);
+ signal(SIGTSTP, need_death);
+
/*
* If someone else is already using this ip, then this person
* wants to switch users - so kill the old process and exit
@@ -241,15 +269,17 @@ main(int argc, char *argv[])
}
/*
- * we try to kill the previous process and acquire the lock
+ * We try to kill the previous process and acquire the lock
* for 10 seconds, trying once a second. if we can't after
- * 10 attempts we log an error and give up
+ * 10 attempts we log an error and give up.
*/
- if (++lockcnt > 10) {
- syslog(LOG_ERR, "cannot kill previous authpf (pid %d)",
- otherpid);
+ if (want_death || ++lockcnt > 10) {
+ if (!want_death)
+ syslog(LOG_ERR, "cannot kill previous authpf (pid %d)",
+ otherpid);
fclose(pidfp);
pidfp = NULL;
+ pidfd = -1;
goto dogdeath;
}
sleep(1);
@@ -260,6 +290,7 @@ main(int argc, char *argv[])
*/
fclose(pidfp);
pidfp = NULL;
+ pidfd = -1;
} while (1);
/* whack the group list */
@@ -277,7 +308,7 @@ main(int argc, char *argv[])
}
openlog("authpf", LOG_PID | LOG_NDELAY, LOG_DAEMON);
- if (!check_luser(PATH_BAN_DIR, luser) || !allowed_luser(luser)) {
+ if (!check_luser(PATH_BAN_DIR, luser) || !allowed_luser(pw)) {
syslog(LOG_INFO, "user %s prohibited", luser);
do_death(0);
}
@@ -302,19 +333,12 @@ main(int argc, char *argv[])
printf("Unable to modify filters\r\n");
do_death(0);
}
- if (change_table(1, ipsrc) == -1) {
+ if (user_ip && change_table(1, ipsrc) == -1) {
printf("Unable to modify table\r\n");
change_filter(0, luser, ipsrc);
do_death(0);
}
- signal(SIGTERM, need_death);
- signal(SIGINT, need_death);
- signal(SIGALRM, need_death);
- signal(SIGPIPE, need_death);
- signal(SIGHUP, need_death);
- signal(SIGQUIT, need_death);
- signal(SIGTSTP, need_death);
while (1) {
printf("\r\nHello %s. ", luser);
printf("You are authenticated from host \"%s\"\r\n", ipsrc);
@@ -337,8 +361,6 @@ dogdeath:
sleep(180); /* them lusers read reaaaaal slow */
die:
do_death(0);
-
- /* NOTREACHED */
}
/*
@@ -361,6 +383,8 @@ read_config(FILE *f)
}
i++;
len = strlen(buf);
+ if (len == 0)
+ continue;
if (buf[len - 1] != '\n' && !feof(f)) {
syslog(LOG_ERR, "line %d too long in %s", i,
PATH_CONFFILE);
@@ -413,7 +437,7 @@ parse_error:
* they've been bad or we're unavailable.
*/
static void
-print_message(char *filename)
+print_message(const char *filename)
{
char buf[1024];
FILE *f;
@@ -436,6 +460,7 @@ print_message(char *filename)
* allowed_luser checks to see if user "luser" is allowed to
* use this gateway by virtue of being listed in an allowed
* users file, namely /etc/authpf/authpf.allow .
+ * Users may be listed by <username>, %<group>, or @<login_class>.
*
* If /etc/authpf/authpf.allow does not exist, then we assume that
* all users who are allowed in by sshd(8) are permitted to
@@ -444,9 +469,9 @@ print_message(char *filename)
* the session terminates in the same manner as being banned.
*/
static int
-allowed_luser(char *luser)
+allowed_luser(struct passwd *pw)
{
- char *buf, *lbuf;
+ char *buf,*lbuf;
int matched;
size_t len;
FILE *f;
@@ -476,8 +501,14 @@ allowed_luser(char *luser)
* "public" gateway, such as it is, so let
* everyone use it.
*/
+ int gl_init = 0, ngroups = NGROUPS + 1;
+ gid_t groups[NGROUPS + 1];
+
lbuf = NULL;
+ matched = 0;
+
while ((buf = fgetln(f, &len))) {
+
if (buf[len - 1] == '\n')
buf[len - 1] = '\0';
else {
@@ -488,7 +519,40 @@ allowed_luser(char *luser)
buf = lbuf;
}
- matched = strcmp(luser, buf) == 0 || strcmp("*", buf) == 0;
+ if (buf[0] == '@') {
+ /* check login class */
+ if (strcmp(pw->pw_class, buf + 1) == 0)
+ matched++;
+ } else if (buf[0] == '%') {
+ /* check group membership */
+ int cnt;
+ struct group *group;
+
+ if ((group = getgrnam(buf + 1)) == NULL) {
+ syslog(LOG_ERR,
+ "invalid group '%s' in %s (%s)",
+ buf + 1, PATH_ALLOWFILE,
+ strerror(errno));
+ return (0);
+ }
+
+ if (!gl_init) {
+ (void) getgrouplist(pw->pw_name,
+ pw->pw_gid, groups, &ngroups);
+ gl_init++;
+ }
+
+ for ( cnt = 0; cnt < ngroups; cnt++) {
+ if (group->gr_gid == groups[cnt]) {
+ matched++;
+ break;
+ }
+ }
+ } else {
+ /* check username and wildcard */
+ matched = strcmp(pw->pw_name, buf) == 0 ||
+ strcmp("*", buf) == 0;
+ }
if (lbuf != NULL) {
free(lbuf);
@@ -496,13 +560,13 @@ allowed_luser(char *luser)
}
if (matched)
- return (1); /* matched an allowed username */
+ return (1); /* matched an allowed user/group */
}
syslog(LOG_INFO, "denied access to %s: not listed in %s",
- luser, PATH_ALLOWFILE);
+ pw->pw_name, PATH_ALLOWFILE);
/* reuse buf */
- buf = "\n\nSorry, you are not allowed to use this facility!\n";
+ sprintf(buf, "%s", "\n\nSorry, you are not allowed to use this facility!\n");
fputs(buf, stdout);
}
fflush(stdout);
@@ -520,13 +584,13 @@ allowed_luser(char *luser)
* going to be un-banned.)
*/
static int
-check_luser(char *luserdir, char *luser)
+check_luser(const char *luserdir, char *l_user)
{
FILE *f;
int n;
char tmp[MAXPATHLEN];
- n = snprintf(tmp, sizeof(tmp), "%s/%s", luserdir, luser);
+ n = snprintf(tmp, sizeof(tmp), "%s/%s", luserdir, l_user);
if (n < 0 || (u_int)n >= sizeof(tmp)) {
syslog(LOG_ERR, "provided banned directory line too long (%s)",
luserdir);
@@ -555,7 +619,7 @@ check_luser(char *luserdir, char *luser)
* tell what they can do and where they can go.
*/
syslog(LOG_INFO, "denied access to %s: %s exists",
- luser, tmp);
+ l_user, tmp);
/* reuse tmp */
strlcpy(tmp, "\n\n-**- Sorry, you have been banned! -**-\n\n",
@@ -581,7 +645,7 @@ static int
remove_stale_rulesets(void)
{
struct pfioc_ruleset prs;
- u_int32_t nr, mnr;
+ u_int32_t nr;
memset(&prs, 0, sizeof(prs));
strlcpy(prs.path, anchorname, sizeof(prs.path));
@@ -592,13 +656,12 @@ remove_stale_rulesets(void)
return (1);
}
- mnr = prs.nr;
- nr = 0;
- while (nr < mnr) {
+ nr = prs.nr;
+ while (nr) {
char *s, *t;
pid_t pid;
- prs.nr = nr;
+ prs.nr = nr - 1;
if (ioctl(dev, DIOCGETRULESET, &prs))
return (1);
errno = 0;
@@ -610,119 +673,159 @@ remove_stale_rulesets(void)
if (!prs.name[0] || errno ||
(*s && (t == prs.name || *s != ')')))
return (1);
- if (kill(pid, 0) && errno != EPERM) {
- int i;
- struct pfioc_trans_e t_e[PF_RULESET_MAX+1];
- struct pfioc_trans t;
-
- bzero(&t, sizeof(t));
- bzero(t_e, sizeof(t_e));
- t.size = PF_RULESET_MAX+1;
- t.esize = sizeof(t_e[0]);
- t.array = t_e;
- for (i = 0; i < PF_RULESET_MAX+1; ++i) {
- t_e[i].rs_num = i;
- snprintf(t_e[i].anchor, sizeof(t_e[i].anchor),
- "%s/%s", anchorname, prs.name);
- }
- t_e[PF_RULESET_MAX].rs_num = PF_RULESET_TABLE;
- if ((ioctl(dev, DIOCXBEGIN, &t) ||
- ioctl(dev, DIOCXCOMMIT, &t)) &&
- errno != EINVAL)
+ if ((kill(pid, 0) && errno != EPERM) || pid == getpid()) {
+ if (recursive_ruleset_purge(anchorname, prs.name))
return (1);
- mnr--;
- } else
- nr++;
+ }
+ nr--;
}
return (0);
}
+static int
+recursive_ruleset_purge(char *an, char *rs)
+{
+ struct pfioc_trans_e *t_e = NULL;
+ struct pfioc_trans *t = NULL;
+ struct pfioc_ruleset *prs = NULL;
+ int i;
+
+
+ /* purge rules */
+ errno = 0;
+ if ((t = calloc(1, sizeof(struct pfioc_trans))) == NULL)
+ goto no_mem;
+ if ((t_e = calloc(PF_RULESET_MAX+1,
+ sizeof(struct pfioc_trans_e))) == NULL)
+ goto no_mem;
+ t->size = PF_RULESET_MAX+1;
+ t->esize = sizeof(struct pfioc_trans_e);
+ t->array = t_e;
+ for (i = 0; i < PF_RULESET_MAX+1; ++i) {
+ t_e[i].rs_num = i;
+ snprintf(t_e[i].anchor, sizeof(t_e[i].anchor), "%s/%s", an, rs);
+ }
+ t_e[PF_RULESET_MAX].rs_num = PF_RULESET_TABLE;
+ if ((ioctl(dev, DIOCXBEGIN, t) ||
+ ioctl(dev, DIOCXCOMMIT, t)) &&
+ errno != EINVAL)
+ goto cleanup;
+
+ /* purge any children */
+ if ((prs = calloc(1, sizeof(struct pfioc_ruleset))) == NULL)
+ goto no_mem;
+ snprintf(prs->path, sizeof(prs->path), "%s/%s", an, rs);
+ if (ioctl(dev, DIOCGETRULESETS, prs)) {
+ if (errno != EINVAL)
+ goto cleanup;
+ errno = 0;
+ } else {
+ int nr = prs->nr;
+
+ while (nr) {
+ prs->nr = 0;
+ if (ioctl(dev, DIOCGETRULESET, prs))
+ goto cleanup;
+
+ if (recursive_ruleset_purge(prs->path, prs->name))
+ goto cleanup;
+ nr--;
+ }
+ }
+
+no_mem:
+ if (errno == ENOMEM)
+ syslog(LOG_ERR, "calloc failed");
+
+cleanup:
+ free(t);
+ free(t_e);
+ free(prs);
+ return (errno);
+}
+
/*
* Add/remove filter entries for user "luser" from ip "ipsrc"
*/
static int
-change_filter(int add, const char *luser, const char *ipsrc)
+change_filter(int add, const char *l_user, const char *ip_src)
{
- char *pargv[13] = {
- "pfctl", "-p", "/dev/pf", "-q", "-a", "anchor/ruleset",
- "-D", "user_ip=X", "-D", "user_id=X", "-f",
- "file", NULL
- };
char *fdpath = NULL, *userstr = NULL, *ipstr = NULL;
char *rsn = NULL, *fn = NULL;
pid_t pid;
gid_t gid;
int s;
- if (luser == NULL || !luser[0] || ipsrc == NULL || !ipsrc[0]) {
- syslog(LOG_ERR, "invalid luser/ipsrc");
- goto error;
- }
-
- if (asprintf(&rsn, "%s/%s", anchorname, rulesetname) == -1)
- goto no_mem;
- if (asprintf(&fdpath, "/dev/fd/%d", dev) == -1)
- goto no_mem;
- if (asprintf(&ipstr, "user_ip=%s", ipsrc) == -1)
- goto no_mem;
- if (asprintf(&userstr, "user_id=%s", luser) == -1)
- goto no_mem;
-
if (add) {
struct stat sb;
+ char *pargv[13] = {
+ "pfctl", "-p", "/dev/pf", "-q", "-a", "anchor/ruleset",
+ "-D", "user_id=X", "-D", "user_ip=X", "-f", "file", NULL
+ };
+
+ if (l_user == NULL || !l_user[0] || ip_src == NULL || !ip_src[0]) {
+ syslog(LOG_ERR, "invalid luser/ipsrc");
+ goto error;
+ }
- if (asprintf(&fn, "%s/%s/authpf.rules", PATH_USER_DIR, luser)
- == -1)
+ if (asprintf(&rsn, "%s/%s", anchorname, rulesetname) == -1)
+ goto no_mem;
+ if (asprintf(&fdpath, "/dev/fd/%d", dev) == -1)
+ goto no_mem;
+ if (asprintf(&ipstr, "user_ip=%s", ip_src) == -1)
+ goto no_mem;
+ if (asprintf(&userstr, "user_id=%s", l_user) == -1)
+ goto no_mem;
+ if (asprintf(&fn, "%s/%s/authpf.rules",
+ PATH_USER_DIR, l_user) == -1)
goto no_mem;
if (stat(fn, &sb) == -1) {
free(fn);
if ((fn = strdup(PATH_PFRULES)) == NULL)
goto no_mem;
}
- }
- pargv[2] = fdpath;
- pargv[5] = rsn;
- pargv[7] = userstr;
- pargv[9] = ipstr;
- if (!add)
- pargv[11] = "/dev/null";
- else
- pargv[11] = fn;
-
- switch (pid = fork()) {
- case -1:
- syslog(LOG_ERR, "fork failed");
- goto error;
- case 0:
- /* revoke group privs before exec */
- gid = getgid();
- if (setregid(gid, gid) == -1) {
- err(1, "setregid");
+ pargv[2] = fdpath;
+ pargv[5] = rsn;
+ pargv[7] = userstr;
+ if (user_ip) {
+ pargv[9] = ipstr;
+ pargv[11] = fn;
+ } else {
+ pargv[8] = "-f";
+ pargv[9] = fn;
+ pargv[10] = NULL;
}
- execvp(PATH_PFCTL, pargv);
- warn("exec of %s failed", PATH_PFCTL);
- _exit(1);
- }
- /* parent */
- waitpid(pid, &s, 0);
- if (s != 0) {
- syslog(LOG_ERR, "pfctl exited abnormally");
- goto error;
- }
+ switch (pid = fork()) {
+ case -1:
+ syslog(LOG_ERR, "fork failed");
+ goto error;
+ case 0:
+ /* revoke group privs before exec */
+ gid = getgid();
+ if (setregid(gid, gid) == -1) {
+ err(1, "setregid");
+ }
+ execvp(PATH_PFCTL, pargv);
+ warn("exec of %s failed", PATH_PFCTL);
+ _exit(1);
+ }
+
+ /* parent */
+ waitpid(pid, &s, 0);
+ if (s != 0) {
+ syslog(LOG_ERR, "pfctl exited abnormally");
+ goto error;
+ }
- if (add) {
gettimeofday(&Tstart, NULL);
- syslog(LOG_INFO, "allowing %s, user %s", ipsrc, luser);
+ syslog(LOG_INFO, "allowing %s, user %s", ip_src, l_user);
} else {
+ remove_stale_rulesets();
+
gettimeofday(&Tend, NULL);
-#ifdef __FreeBSD__
- syslog(LOG_INFO, "removed %s, user %s - duration %jd seconds",
- ipsrc, luser, (intmax_t)(Tend.tv_sec - Tstart.tv_sec));
-#else
- syslog(LOG_INFO, "removed %s, user %s - duration %ld seconds",
- ipsrc, luser, Tend.tv_sec - Tstart.tv_sec);
-#endif
+ syslog(LOG_INFO, "removed %s, user %s - duration %ju seconds",
+ ip_src, l_user, (uintmax_t)(Tend.tv_sec - Tstart.tv_sec));
}
return (0);
no_mem:
@@ -740,7 +843,7 @@ error:
* Add/remove this IP from the "authpf_users" table.
*/
static int
-change_table(int add, const char *ipsrc)
+change_table(int add, const char *ip_src)
{
struct pfioc_table io;
struct pfr_addr addr;
@@ -753,12 +856,12 @@ change_table(int add, const char *ipsrc)
io.pfrio_size = 1;
bzero(&addr, sizeof(addr));
- if (ipsrc == NULL || !ipsrc[0])
+ if (ip_src == NULL || !ip_src[0])
return (-1);
- if (inet_pton(AF_INET, ipsrc, &addr.pfra_ip4addr) == 1) {
+ if (inet_pton(AF_INET, ip_src, &addr.pfra_ip4addr) == 1) {
addr.pfra_af = AF_INET;
addr.pfra_net = 32;
- } else if (inet_pton(AF_INET6, ipsrc, &addr.pfra_ip6addr) == 1) {
+ } else if (inet_pton(AF_INET6, ip_src, &addr.pfra_ip6addr) == 1) {
addr.pfra_af = AF_INET6;
addr.pfra_net = 128;
} else {
@@ -769,7 +872,7 @@ change_table(int add, const char *ipsrc)
if (ioctl(dev, add ? DIOCRADDADDRS : DIOCRDELADDRS, &io) &&
errno != ESRCH) {
syslog(LOG_ERR, "cannot %s %s from table %s: %s",
- add ? "add" : "remove", ipsrc, tablename,
+ add ? "add" : "remove", ip_src, tablename,
strerror(errno));
return (-1);
}
@@ -821,7 +924,7 @@ authpf_kill_states(void)
/* signal handler that makes us go away properly */
static void
-need_death(int signo)
+need_death(int signo __unused)
{
want_death = 1;
}
@@ -840,11 +943,12 @@ do_death(int active)
if (active) {
change_filter(0, luser, ipsrc);
- change_table(0, ipsrc);
- authpf_kill_states();
- remove_stale_rulesets();
+ if (user_ip) {
+ change_table(0, ipsrc);
+ authpf_kill_states();
+ }
}
- if (pidfile[0] && (pidfp != NULL))
+ if (pidfile[0] && pidfd != -1)
if (unlink(pidfile) == -1)
syslog(LOG_ERR, "cannot unlink %s (%m)", pidfile);
exit(ret);
diff --git a/contrib/pf/authpf/pathnames.h b/contrib/pf/authpf/pathnames.h
index 358bfd0..e02cf77 100644
--- a/contrib/pf/authpf/pathnames.h
+++ b/contrib/pf/authpf/pathnames.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pathnames.h,v 1.7 2004/04/25 18:40:42 beck Exp $ */
+/* $OpenBSD: pathnames.h,v 1.8 2008/02/14 01:49:17 mcbride Exp $ */
/*
* Copyright (C) 2002 Chris Kuethe (ckuethe@ualberta.ca)
@@ -35,4 +35,5 @@
#define PATH_DEVFILE "/dev/pf"
#define PATH_PIDFILE "/var/authpf"
#define PATH_AUTHPF_SHELL "/usr/sbin/authpf"
+#define PATH_AUTHPF_SHELL_NOIP "/usr/sbin/authpf-noip"
#define PATH_PFCTL "/sbin/pfctl"
diff --git a/contrib/pf/ftp-proxy/filter.c b/contrib/pf/ftp-proxy/filter.c
index f86429d..f575db1 100644
--- a/contrib/pf/ftp-proxy/filter.c
+++ b/contrib/pf/ftp-proxy/filter.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: filter.c,v 1.5 2006/12/01 07:31:21 camield Exp $ */
+/* $OpenBSD: filter.c,v 1.8 2008/06/13 07:25:26 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Camiel Dobbelaar, <cd@sentia.nl>
@@ -53,7 +53,7 @@ static struct pfioc_rule pfr;
static struct pfioc_trans pft;
static struct pfioc_trans_e pfte[TRANS_SIZE];
static int dev, rule_log;
-static char *qname;
+static const char *qname, *tagname;
int
add_filter(u_int32_t id, u_int8_t dir, struct sockaddr *src,
@@ -159,11 +159,12 @@ do_rollback(void)
}
void
-init_filter(char *opt_qname, int opt_verbose)
+init_filter(const char *opt_qname, const char *opt_tagname, int opt_verbose)
{
struct pf_status status;
qname = opt_qname;
+ tagname = opt_tagname;
if (opt_verbose == 1)
rule_log = PF_LOG;
@@ -172,7 +173,7 @@ init_filter(char *opt_qname, int opt_verbose)
dev = open("/dev/pf", O_RDWR);
if (dev == -1)
- err(1, "/dev/pf");
+ err(1, "open /dev/pf");
if (ioctl(dev, DIOCGETSTATUS, &status) == -1)
err(1, "DIOCGETSTATUS");
if (!status.running)
@@ -280,9 +281,9 @@ prepare_rule(u_int32_t id, int rs_num, struct sockaddr *src,
switch (rs_num) {
case PF_RULESET_FILTER:
/*
- * pass quick [log] inet[6] proto tcp \
+ * pass [quick] [log] inet[6] proto tcp \
* from $src to $dst port = $d_port flags S/SA keep state
- * (max 1) [queue qname]
+ * (max 1) [queue qname] [tag tagname]
*/
pfr.rule.action = PF_PASS;
pfr.rule.quick = 1;
@@ -293,6 +294,11 @@ prepare_rule(u_int32_t id, int rs_num, struct sockaddr *src,
pfr.rule.max_states = 1;
if (qname != NULL)
strlcpy(pfr.rule.qname, qname, sizeof pfr.rule.qname);
+ if (tagname != NULL) {
+ pfr.rule.quick = 0;
+ strlcpy(pfr.rule.tagname, tagname,
+ sizeof pfr.rule.tagname);
+ }
break;
case PF_RULESET_NAT:
/*
diff --git a/contrib/pf/ftp-proxy/filter.h b/contrib/pf/ftp-proxy/filter.h
index 6779c59..3b48898 100644
--- a/contrib/pf/ftp-proxy/filter.h
+++ b/contrib/pf/ftp-proxy/filter.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: filter.h,v 1.3 2005/06/07 14:12:07 camield Exp $ */
+/* $OpenBSD: filter.h,v 1.4 2007/08/01 09:31:41 henning Exp $ */
/*
* Copyright (c) 2004, 2005 Camiel Dobbelaar, <cd@sentia.nl>
@@ -26,6 +26,6 @@ int add_rdr(u_int32_t, struct sockaddr *, struct sockaddr *, u_int16_t,
struct sockaddr *, u_int16_t);
int do_commit(void);
int do_rollback(void);
-void init_filter(char *, int);
+void init_filter(const char *, const char *, int);
int prepare_commit(u_int32_t);
int server_lookup(struct sockaddr *, struct sockaddr *, struct sockaddr *);
diff --git a/contrib/pf/ftp-proxy/ftp-proxy.8 b/contrib/pf/ftp-proxy/ftp-proxy.8
index 69c848e..d4dd030 100644
--- a/contrib/pf/ftp-proxy/ftp-proxy.8
+++ b/contrib/pf/ftp-proxy/ftp-proxy.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ftp-proxy.8,v 1.7 2006/12/30 13:01:54 camield Exp $
+.\" $OpenBSD: ftp-proxy.8,v 1.11 2008/02/26 18:52:53 henning Exp $
.\"
.\" Copyright (c) 2004, 2005 Camiel Dobbelaar, <cd@sentia.nl>
.\"
@@ -16,14 +16,15 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 28, 2004
+.Dd February 26, 2008
.Dt FTP-PROXY 8
.Os
.Sh NAME
.Nm ftp-proxy
.Nd Internet File Transfer Protocol proxy daemon
.Sh SYNOPSIS
-.Nm ftp-proxy
+.Nm
+.Bk -words
.Op Fl 6Adrv
.Op Fl a Ar address
.Op Fl b Ar address
@@ -33,7 +34,9 @@
.Op Fl p Ar port
.Op Fl q Ar queue
.Op Fl R Ar address
+.Op Fl T Ar tag
.Op Fl t Ar timeout
+.Ek
.Sh DESCRIPTION
.Nm
is a proxy for the Internet File Transfer Protocol.
@@ -58,7 +61,7 @@ facility for this.
Assuming the FTP control connection is from $client to $server, the
proxy connected to the server using the $proxy source address, and
$port is negotiated, then
-.Nm ftp-proxy
+.Nm
adds the following rules to the various anchors.
(These example rules use inet, but the proxy also supports inet6.)
.Pp
@@ -130,6 +133,20 @@ connections to another proxy.
.It Fl r
Rewrite sourceport to 20 in active mode to suit ancient clients that insist
on this RFC property.
+.It Fl T Ar tag
+The filter rules will add tag
+.Ar tag
+to data connections, and not match quick.
+This way alternative rules that use the
+.Ar tagged
+keyword can be implemented following the
+.Nm
+anchor.
+These rules can use special
+.Xr pf 4
+features like route-to, reply-to, label, rtable, overload, etc. that
+.Nm
+does not implement itself.
.It Fl t Ar timeout
Number of seconds that the control connection can be idle, before the
proxy will disconnect.
@@ -172,7 +189,7 @@ does not allow the ruleset to be modified if the system is running at a
.Xr securelevel 7
higher than 1.
At that level
-.Nm ftp-proxy
+.Nm
cannot add rules to the anchors and FTP data connections may get blocked.
.Pp
Negotiated data connection ports below 1024 are not allowed.
@@ -181,5 +198,5 @@ The negotiated IP address for active modes is ignored for security
reasons.
This makes third party file transfers impossible.
.Pp
-.Nm ftp-proxy
+.Nm
chroots to "/var/empty" and changes to user "proxy" to drop privileges.
diff --git a/contrib/pf/ftp-proxy/ftp-proxy.c b/contrib/pf/ftp-proxy/ftp-proxy.c
index 06c8487..26de75a 100644
--- a/contrib/pf/ftp-proxy/ftp-proxy.c
+++ b/contrib/pf/ftp-proxy/ftp-proxy.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ftp-proxy.c,v 1.13 2006/12/30 13:24:00 camield Exp $ */
+/* $OpenBSD: ftp-proxy.c,v 1.19 2008/06/13 07:25:26 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Camiel Dobbelaar, <cd@sentia.nl>
@@ -61,6 +61,14 @@ __FBSDID("$FreeBSD$");
#define PF_NAT_PROXY_PORT_LOW 50001
#define PF_NAT_PROXY_PORT_HIGH 65535
+#ifndef LIST_END
+#define LIST_END(a) NULL
+#endif
+
+#ifndef getrtable
+#define getrtable(a) 0
+#endif
+
#define sstosa(ss) ((struct sockaddr *)(ss))
enum { CMD_NONE = 0, CMD_PORT, CMD_EPRT, CMD_PASV, CMD_EPSV };
@@ -94,7 +102,7 @@ int client_parse_cmd(struct session *s);
void client_read(struct bufferevent *, void *);
int drop_privs(void);
void end_session(struct session *);
-int exit_daemon(void);
+void exit_daemon(void);
int getline(char *, size_t *);
void handle_connection(const int, short, void *);
void handle_signal(int, short, void *);
@@ -105,6 +113,7 @@ u_int16_t pick_proxy_port(void);
void proxy_reply(int, struct sockaddr *, u_int16_t);
void server_error(struct bufferevent *, short, void *);
int server_parse(struct session *s);
+int allow_data_connection(struct session *s);
void server_read(struct bufferevent *, void *);
const char *sock_ntop(struct sockaddr *);
void usage(void);
@@ -115,14 +124,14 @@ size_t linelen;
char ntop_buf[NTOP_BUFS][INET6_ADDRSTRLEN];
struct sockaddr_storage fixed_server_ss, fixed_proxy_ss;
-char *fixed_server, *fixed_server_port, *fixed_proxy, *listen_ip, *listen_port,
- *qname;
+const char *fixed_server, *fixed_server_port, *fixed_proxy, *listen_ip, *listen_port,
+ *qname, *tagname;
int anonymous_only, daemonize, id_count, ipv6_mode, loglevel, max_sessions,
rfc_mode, session_count, timeout, verbose;
extern char *__progname;
void
-client_error(struct bufferevent *bufev, short what, void *arg)
+client_error(struct bufferevent *bufev __unused, short what, void *arg)
{
struct session *s = arg;
@@ -152,8 +161,19 @@ client_parse(struct session *s)
return (1);
if (linebuf[0] == 'P' || linebuf[0] == 'p' ||
- linebuf[0] == 'E' || linebuf[0] == 'e')
- return (client_parse_cmd(s));
+ linebuf[0] == 'E' || linebuf[0] == 'e') {
+ if (!client_parse_cmd(s))
+ return (0);
+
+ /*
+ * Allow active mode connections immediately, instead of
+ * waiting for a positive reply from the server. Some
+ * rare servers/proxies try to probe or setup the data
+ * connection before an actual transfer request.
+ */
+ if (s->cmd == CMD_PORT || s->cmd == CMD_EPRT)
+ return (allow_data_connection(s));
+ }
if (anonymous_only && (linebuf[0] == 'U' || linebuf[0] == 'u'))
return (client_parse_anon(s));
@@ -220,14 +240,14 @@ void
client_read(struct bufferevent *bufev, void *arg)
{
struct session *s = arg;
- size_t buf_avail, read;
+ size_t buf_avail, clientread;
int n;
do {
buf_avail = sizeof s->cbuf - s->cbuf_valid;
- read = bufferevent_read(bufev, s->cbuf + s->cbuf_valid,
+ clientread = bufferevent_read(bufev, s->cbuf + s->cbuf_valid,
buf_avail);
- s->cbuf_valid += read;
+ s->cbuf_valid += clientread;
while ((n = getline(s->cbuf, &s->cbuf_valid)) > 0) {
logmsg(LOG_DEBUG, "#%d client: %s", s->id, linebuf);
@@ -244,7 +264,7 @@ client_read(struct bufferevent *bufev, void *arg)
end_session(s);
return;
}
- } while (read == buf_avail);
+ } while (clientread == buf_avail);
}
int
@@ -269,10 +289,16 @@ drop_privs(void)
void
end_session(struct session *s)
{
- int err;
+ int serr;
logmsg(LOG_INFO, "#%d ending session", s->id);
+ /* Flush output buffers. */
+ if (s->client_bufev && s->client_fd != -1)
+ evbuffer_write(s->client_bufev->output, s->client_fd);
+ if (s->server_bufev && s->server_fd != -1)
+ evbuffer_write(s->server_bufev->output, s->server_fd);
+
if (s->client_fd != -1)
close(s->client_fd);
if (s->server_fd != -1)
@@ -284,33 +310,29 @@ end_session(struct session *s)
bufferevent_free(s->server_bufev);
/* Remove rulesets by commiting empty ones. */
- err = 0;
+ serr = 0;
if (prepare_commit(s->id) == -1)
- err = errno;
+ serr = errno;
else if (do_commit() == -1) {
- err = errno;
+ serr = errno;
do_rollback();
}
- if (err)
+ if (serr)
logmsg(LOG_ERR, "#%d pf rule removal failed: %s", s->id,
- strerror(err));
+ strerror(serr));
LIST_REMOVE(s, entry);
free(s);
session_count--;
}
-int
+void
exit_daemon(void)
{
struct session *s, *next;
-#ifdef __FreeBSD__
- LIST_FOREACH_SAFE(s, &sessions, entry, next) {
-#else
for (s = LIST_FIRST(&sessions); s != LIST_END(&sessions); s = next) {
next = LIST_NEXT(s, entry);
-#endif
end_session(s);
}
@@ -318,9 +340,6 @@ exit_daemon(void)
closelog();
exit(0);
-
- /* NOTREACHED */
- return (-1);
}
int
@@ -361,7 +380,7 @@ getline(char *buf, size_t *valid)
}
void
-handle_connection(const int listen_fd, short event, void *ev)
+handle_connection(const int listen_fd, short event __unused, void *ev __unused)
{
struct sockaddr_storage tmp_ss;
struct sockaddr *client_sa, *server_sa, *fixed_server_sa;
@@ -508,13 +527,13 @@ handle_connection(const int listen_fd, short event, void *ev)
}
void
-handle_signal(int sig, short event, void *arg)
+handle_signal(int sig, short event __unused, void *arg __unused)
{
/*
* Signal handler rules don't apply, libevent decouples for us.
*/
- logmsg(LOG_ERR, "%s exiting on signal %d", __progname, sig);
+ logmsg(LOG_ERR, "exiting on signal %d", sig);
exit_daemon();
}
@@ -567,10 +586,7 @@ logmsg(int pri, const char *message, ...)
/* We don't care about truncation. */
vsnprintf(buf, sizeof buf, message, ap);
#ifdef __FreeBSD__
- /* XXX: strnvis might be nice to have */
- strvisx(visbuf, buf,
- MIN((sizeof(visbuf) / 4) - 1, strlen(buf)),
- VIS_CSTYLE | VIS_NL);
+ strvis(visbuf, buf, VIS_CSTYLE | VIS_NL);
#else
strnvis(visbuf, buf, sizeof visbuf, VIS_CSTYLE | VIS_NL);
#endif
@@ -602,6 +618,7 @@ main(int argc, char *argv[])
max_sessions = 100;
qname = NULL;
rfc_mode = 0;
+ tagname = NULL;
timeout = 24 * 3600;
verbose = 0;
@@ -609,7 +626,7 @@ main(int argc, char *argv[])
id_count = 1;
session_count = 0;
- while ((ch = getopt(argc, argv, "6Aa:b:D:dm:P:p:q:R:rt:v")) != -1) {
+ while ((ch = getopt(argc, argv, "6Aa:b:D:dm:P:p:q:R:rT:t:v")) != -1) {
switch (ch) {
case '6':
ipv6_mode = 1;
@@ -654,6 +671,11 @@ main(int argc, char *argv[])
case 'r':
rfc_mode = 1;
break;
+ case 'T':
+ if (strlen(optarg) >= PF_TAG_NAME_SIZE)
+ errx(1, "tagname too long");
+ tagname = optarg;
+ break;
case 't':
timeout = strtonum(optarg, 0, 86400, &errstr);
if (errstr)
@@ -734,7 +756,7 @@ main(int argc, char *argv[])
freeaddrinfo(res);
/* Initialize pf. */
- init_filter(qname, verbose);
+ init_filter(qname, tagname, verbose);
if (daemonize) {
if (daemon(0, 0) == -1)
@@ -830,14 +852,15 @@ u_int16_t
pick_proxy_port(void)
{
/* Random should be good enough for avoiding port collisions. */
- return (IPPORT_HIFIRSTAUTO + (arc4random() %
- (IPPORT_HILASTAUTO - IPPORT_HIFIRSTAUTO)));
+ return (IPPORT_HIFIRSTAUTO +
+ arc4random_uniform(IPPORT_HILASTAUTO - IPPORT_HIFIRSTAUTO));
}
void
proxy_reply(int cmd, struct sockaddr *sa, u_int16_t port)
{
- int i, r;
+ u_int i;
+ int r = 0;
switch (cmd) {
case CMD_PORT:
@@ -864,7 +887,7 @@ proxy_reply(int cmd, struct sockaddr *sa, u_int16_t port)
break;
}
- if (r < 0 || r >= sizeof linebuf) {
+ if (r < 0 || ((u_int)r) >= sizeof linebuf) {
logmsg(LOG_ERR, "proxy_reply failed: %d", r);
linebuf[0] = '\0';
linelen = 0;
@@ -881,7 +904,7 @@ proxy_reply(int cmd, struct sockaddr *sa, u_int16_t port)
}
void
-server_error(struct bufferevent *bufev, short what, void *arg)
+server_error(struct bufferevent *bufev __unused, short what, void *arg)
{
struct session *s = arg;
@@ -902,12 +925,26 @@ server_error(struct bufferevent *bufev, short what, void *arg)
int
server_parse(struct session *s)
{
- struct sockaddr *client_sa, *orig_sa, *proxy_sa, *server_sa;
- int prepared = 0;
-
if (s->cmd == CMD_NONE || linelen < 4 || linebuf[0] != '2')
goto out;
+ if ((s->cmd == CMD_PASV && strncmp("227 ", linebuf, 4) == 0) ||
+ (s->cmd == CMD_EPSV && strncmp("229 ", linebuf, 4) == 0))
+ return (allow_data_connection(s));
+
+ out:
+ s->cmd = CMD_NONE;
+ s->port = 0;
+
+ return (1);
+}
+
+int
+allow_data_connection(struct session *s)
+{
+ struct sockaddr *client_sa, *orig_sa, *proxy_sa, *server_sa;
+ int prepared = 0;
+
/*
* The pf rules below do quite some NAT rewriting, to keep up
* appearances. Points to keep in mind:
@@ -932,8 +969,7 @@ server_parse(struct session *s)
orig_sa = sstosa(&s->server_ss);
/* Passive modes. */
- if ((s->cmd == CMD_PASV && strncmp("227 ", linebuf, 4) == 0) ||
- (s->cmd == CMD_EPSV && strncmp("229 ", linebuf, 4) == 0)) {
+ if (s->cmd == CMD_PASV || s->cmd == CMD_EPSV) {
s->port = parse_port(s->cmd);
if (s->port < MIN_PORT) {
logmsg(LOG_CRIT, "#%d bad port in '%s'", s->id,
@@ -974,8 +1010,7 @@ server_parse(struct session *s)
}
/* Active modes. */
- if ((s->cmd == CMD_PORT || s->cmd == CMD_EPRT) &&
- strncmp("200 ", linebuf, 4) == 0) {
+ if (s->cmd == CMD_PORT || s->cmd == CMD_EPRT) {
logmsg(LOG_INFO, "#%d active: server to client port %d"
" via port %d", s->id, s->port, s->proxy_port);
@@ -1025,7 +1060,6 @@ server_parse(struct session *s)
goto fail;
}
- out:
s->cmd = CMD_NONE;
s->port = 0;
@@ -1042,16 +1076,16 @@ void
server_read(struct bufferevent *bufev, void *arg)
{
struct session *s = arg;
- size_t buf_avail, read;
+ size_t buf_avail, srvread;
int n;
bufferevent_settimeout(bufev, timeout, 0);
do {
buf_avail = sizeof s->sbuf - s->sbuf_valid;
- read = bufferevent_read(bufev, s->sbuf + s->sbuf_valid,
+ srvread = bufferevent_read(bufev, s->sbuf + s->sbuf_valid,
buf_avail);
- s->sbuf_valid += read;
+ s->sbuf_valid += srvread;
while ((n = getline(s->sbuf, &s->sbuf_valid)) > 0) {
logmsg(LOG_DEBUG, "#%d server: %s", s->id, linebuf);
@@ -1068,7 +1102,7 @@ server_read(struct bufferevent *bufev, void *arg)
end_session(s);
return;
}
- } while (read == buf_avail);
+ } while (srvread == buf_avail);
}
const char *
@@ -1102,6 +1136,7 @@ usage(void)
{
fprintf(stderr, "usage: %s [-6Adrv] [-a address] [-b address]"
" [-D level] [-m maxsessions]\n [-P port]"
- " [-p port] [-q queue] [-R address] [-t timeout]\n", __progname);
+ " [-p port] [-q queue] [-R address] [-T tag]\n"
+ " [-t timeout]\n", __progname);
exit(1);
}
diff --git a/contrib/pf/man/pf.4 b/contrib/pf/man/pf.4
index 16e74ab..936a5a8 100644
--- a/contrib/pf/man/pf.4
+++ b/contrib/pf/man/pf.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: pf.4,v 1.58 2007/02/09 11:39:06 henning Exp $
+.\" $OpenBSD: pf.4,v 1.62 2008/09/10 14:57:37 jmc Exp $
.\"
.\" Copyright (C) 2001, Kjell Wooding. All rights reserved.
.\"
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 7, 2005
+.Dd July 17 2011
.Dt PF 4
.Os
.Sh NAME
@@ -294,25 +294,31 @@ if another process is concurrently updating a ruleset.
Add a state entry.
.Bd -literal
struct pfioc_state {
- u_int32_t nr;
- struct pf_state state;
+ struct pfsync_state state;
};
.Ed
.It Dv DIOCGETSTATE Fa "struct pfioc_state *ps"
-Extract the entry with the specified number
-.Va nr
-from the state table.
+Extract the entry identified by the
+.Va id
+and
+.Va creatorid
+fields of the
+.Va state
+structure from the state table.
.It Dv DIOCKILLSTATES Fa "struct pfioc_state_kill *psk"
Remove matching entries from the state table.
This ioctl returns the number of killed states in
-.Va psk_af .
+.Va psk_killed .
.Bd -literal
struct pfioc_state_kill {
+ struct pf_state_cmp psk_pfcmp;
sa_family_t psk_af;
int psk_proto;
struct pf_rule_addr psk_src;
struct pf_rule_addr psk_dst;
char psk_ifname[IFNAMSIZ];
+ char psk_label[PF_RULE_LABEL_SIZE];
+ u_int psk_killed;
};
.Ed
.It Dv DIOCCLRSTATES Fa "struct pfioc_state_kill *psk"
@@ -1049,12 +1055,14 @@ internal interface description.
The filtering process is the same as for
.Dv DIOCIGETIFACES .
.Bd -literal
-#define PFI_IFLAG_SKIP 0x0100 /* skip filtering on interface */
+#define PFI_IFLAG_SKIP 0x0100 /* skip filtering on interface */
.Ed
.It Dv DIOCCLRIFFLAG Fa "struct pfioc_iface *io"
Works as
.Dv DIOCSETIFFLAG
above but clears the flags.
+.It Dv DIOCKILLSRCNODES Fa "struct pfioc_iface *io"
+Explicitly remove source tracking nodes.
.El
.Sh FILES
.Bl -tag -width /dev/pf -compact
@@ -1133,6 +1141,7 @@ main(int argc, char *argv[])
.Xr altq 4 ,
.Xr if_bridge 4 ,
.Xr pflog 4 ,
+.Xr pflow 4 ,
.Xr pfsync 4 ,
.Xr pfctl 8 ,
.Xr altq 9
@@ -1140,4 +1149,9 @@ main(int argc, char *argv[])
The
.Nm
packet filtering mechanism first appeared in
-.Ox 3.0 .
+.Ox 3.0
+and then
+.Fx 5.2 .
+.Pp
+This implementation matches
+.Ox 4.5 .
diff --git a/contrib/pf/man/pf.conf.5 b/contrib/pf/man/pf.conf.5
index 98c3d0e..dfec264 100644
--- a/contrib/pf/man/pf.conf.5
+++ b/contrib/pf/man/pf.conf.5
@@ -1,5 +1,5 @@
-.\" $FreeBSD$
-.\" $OpenBSD: pf.conf.5,v 1.393 2008/02/11 07:46:32 jmc Exp $
+.\" $FreeBSD$
+.\" $OpenBSD: pf.conf.5,v 1.406 2009/01/31 19:37:12 sobrado Exp $
.\"
.\" Copyright (c) 2002, Daniel Hartmeier
.\" All rights reserved.
@@ -28,7 +28,7 @@
.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd June 10, 2008
+.Dd January 31 2009
.Dt PF.CONF 5
.Os
.Sh NAME
@@ -79,6 +79,17 @@ By default
enforces this order (see
.Ar set require-order
below).
+.Pp
+Comments can be put anywhere in the file using a hash mark
+.Pq Sq # ,
+and extend to the end of the current line.
+.Pp
+Additional configuration files can be included with the
+.Ic include
+keyword, for example:
+.Bd -literal -offset indent
+include "/etc/pf/sub.filter.conf"
+.Ed
.Sh MACROS
Macros can be defined that will later be expanded in context.
Macro names must start with a letter, and may contain letters, digits
@@ -154,7 +165,7 @@ A table initialized with the empty list,
will be cleared on load.
.El
.Pp
-Tables may be defined with the following two attributes:
+Tables may be defined with the following attributes:
.Bl -tag -width persist
.It Ar persist
The
@@ -173,6 +184,11 @@ can be used to add or remove addresses from the table at any time, even
when running with
.Xr securelevel 7
= 2.
+.It Ar counters
+The
+.Ar counters
+flag enables per-address packet and byte counters which can be displayed with
+.Xr pfctl 8 .
.El
.Pp
For example,
@@ -328,7 +344,8 @@ With 9000 state table entries, the timeout values are scaled to 50%
(tcp.first 60, tcp.established 43200).
.Pp
.It Ar set loginterface
-Enable collection of packet and byte count statistics for the given interface.
+Enable collection of packet and byte count statistics for the given
+interface or interface group.
These statistics can be viewed using
.Bd -literal -offset indent
# pfctl -s info
@@ -403,9 +420,10 @@ set limit { states 20000, frags 20000, src-nodes 2000 }
.Bl -tag -width xxxxxxxx -compact
.It Ar none
Disable the ruleset optimizer.
-This is the default behaviour.
.It Ar basic
-Enable basic ruleset optimization, which does four things to improve the
+Enable basic ruleset optimization.
+This is the default behaviour.
+Basic ruleset optimization does four things to improve the
performance of ruleset evaluations:
.Pp
.Bl -enum -compact
@@ -500,6 +518,16 @@ For example:
.Bd -literal -offset indent
set state-policy if-bound
.Ed
+.It Ar set state-defaults
+The
+.Ar state-defaults
+option sets the state options for states created from rules
+without an explicit
+.Ar keep state .
+For example:
+.Bd -literal -offset indent
+set state-defaults pflow, no-sync
+.Ed
.It Ar set hostid
The 32-bit
.Ar hostid
@@ -617,6 +645,19 @@ modifier to ensure unique IP identifiers.
Enforces a minimum TTL for matching IP packets.
.It Ar max-mss Aq Ar number
Enforces a maximum MSS for matching TCP packets.
+.It Xo Ar set-tos Aq Ar string
+.No \*(Ba Aq Ar number
+.Xc
+Enforces a
+.Em TOS
+for matching IP packets.
+.Em TOS
+may be
+given as one of
+.Ar lowdelay ,
+.Ar throughput ,
+.Ar reliability ,
+or as either hex or decimal.
.It Ar random-id
Replaces the IP identification field with random values to compensate
for predictable values generated by many hosts.
@@ -725,7 +766,7 @@ much in the same way as
works in the packet filter (see below).
This mechanism should be used when it is necessary to exclude specific packets
from broader scrub rules.
-.Sh QUEUEING/ALTQ
+.Sh QUEUEING
The ALTQ system is currently not available in the GENERIC kernel nor as
loadable modules.
In order to use the herein after called queueing options one has to use a
@@ -816,7 +857,7 @@ assigned.
.Ar Priority
mainly controls the time packets take to get sent out, while
.Ar bandwidth
-has primarily effects on throughput.
+primarily affects throughput.
.Ar hfsc
supports both link-sharing and guaranteed real-time services.
It employs a service curve based QoS model,
@@ -879,7 +920,7 @@ Defines a list of subqueues to create on an interface.
.El
.Pp
In the following example, the interface dc0
-should queue up to 5 Mbit/s in four second-level queues using
+should queue up to 5Mbps in four second-level queues using
Class Based Queueing.
Those four queues will be shown in a later example.
.Bd -literal -offset indent
@@ -1171,7 +1212,7 @@ or to the firewall itself.
Note that redirecting external incoming connections to the loopback
address, as in
.Bd -literal -offset indent
-rdr on ne3 inet proto tcp to port spamd -\*(Gt 127.0.0.1 port smtp
+rdr on ne3 inet proto tcp to port smtp -\*(Gt 127.0.0.1 port spamd
.Ed
.Pp
will effectively allow an external host to connect to daemons
@@ -1256,7 +1297,7 @@ block all
.Ed
.It Ar pass
The packet is passed;
-state is created state unless the
+state is created unless the
.Ar no state
option is specified.
.El
@@ -1432,7 +1473,8 @@ This rule applies only to packets with the specified source and destination
addresses and ports.
.Pp
Addresses can be specified in CIDR notation (matching netblocks), as
-symbolic host names or interface names, or as any of the following keywords:
+symbolic host names, interface names or interface group names, or as any
+of the following keywords:
.Pp
.Bl -tag -width xxxxxxxxxxxxxx -compact
.It Ar any
@@ -1454,7 +1496,15 @@ the route back to the packet's source address.
Any address that matches the given table.
.El
.Pp
-Interface names can have modifiers appended:
+Ranges of addresses are specified by using the
+.Sq -
+operator.
+For instance:
+.Dq 10.1.1.10 - 10.1.1.12
+means all addresses from 10.1.1.10 to 10.1.1.12,
+hence addresses 10.1.1.10, 10.1.1.11, and 10.1.1.12.
+.Pp
+Interface names and interface group names can have modifiers appended:
.Pp
.Bl -tag -width xxxxxxxxxxxx -compact
.It Ar :network
@@ -1462,7 +1512,7 @@ Translates to the network(s) attached to the interface.
.It Ar :broadcast
Translates to the interface's broadcast address(es).
.It Ar :peer
-Translates to the point to point interface's peer address(es).
+Translates to the point-to-point interface's peer address(es).
.It Ar :0
Do not include interface aliases.
.El
@@ -1552,17 +1602,6 @@ This is equivalent to "from any to any".
Similar to
.Ar user ,
this rule only applies to packets of sockets owned by the specified group.
-.Pp
-The use of
-.Ar group
-or
-.Ar user
-in
-.Va debug.mpsafenet Ns = Ns 1
-environments may result in a deadlock.
-Please see the
-.Sx BUGS
-section for details.
.It Ar user Aq Ar user
This rule only applies to packets of sockets owned by the specified user.
For outgoing connections initiated from the firewall, this is the user
@@ -1628,7 +1667,7 @@ Flags not specified in
are ignored.
For stateful connections, the default is
.Ar flags S/SA .
-To indicate that flags should not be checkd at all, specify
+To indicate that flags should not be checked at all, specify
.Ar flags any .
The flags are: (F)IN, (S)YN, (R)ST, (P)USH, (A)CK, (U)RG, (E)CE, and C(W)R.
.Bl -tag -width Fl
@@ -1780,7 +1819,7 @@ of
.Em lowdelay
and TCP ACKs with no data payload will be assigned to the second one.
See
-.Sx QUEUEING/ALTQ
+.Sx QUEUEING
for setup details.
.Pp
For example:
@@ -1811,7 +1850,8 @@ or
rules in addition to filter rules.
Tags take the same macros as labels (see above).
.It Ar tagged Aq Ar string
-Used with filter or translation rules to specify that packets must already
+Used with filter, translation or scrub rules
+to specify that packets must already
be tagged with the given tag in order to match the rule.
Inverse tag matching can also be done
by specifying the
@@ -1822,6 +1862,22 @@ keyword.
.It Ar rtable Aq Ar number
Used to select an alternate routing table for the routing lookup.
Only effective before the route lookup happened, i.e. when filtering inbound.
+.It Xo Ar divert-to Aq Ar host
+.Ar port Aq Ar port
+.Xc
+Used to redirect packets to a local socket bound to
+.Ar host
+and
+.Ar port .
+The packets will not be modified, so
+.Xr getsockname 2
+on the socket will return the original destination address of the packet.
+.It Ar divert-reply
+Used to receive replies for sockets that are bound to addresses
+which are not local to the machine.
+See
+.Xr setsockopt 2
+for information on how to bind these sockets.
.It Ar probability Aq Ar number
A probability attribute can be attached to a rule, with a value set between
0 and 1, bounds not included.
@@ -1940,7 +1996,7 @@ pool options.
Note that by default these associations are destroyed as soon as there are
no longer states which refer to them; in order to make the mappings last
beyond the lifetime of the states, increase the global options with
-.Ar set timeout source-track
+.Ar set timeout src.track .
See
.Sx STATEFUL TRACKING OPTIONS
for more ways to control the source tracking.
@@ -2026,7 +2082,7 @@ Rules with
will not work if
.Xr pf 4
operates on a
-.Xr if_bridge 4 .
+.Xr bridge 4 .
.Pp
Example:
.Bd -literal -offset indent
@@ -2046,8 +2102,8 @@ must be specified explicitly to apply options to a rule.
.Bl -tag -width xxxx -compact
.It Ar max Aq Ar number
Limits the number of concurrent states the rule may create.
-When this limit is reached, further packets matching the rule that would
-create state are dropped, until existing states time out.
+When this limit is reached, further packets that would create
+state will not match this rule until existing states time out.
.It Ar no-sync
Prevent state changes for states created by this rule from appearing on the
.Xr pfsync 4
@@ -2064,8 +2120,12 @@ Uses a sloppy TCP connection tracker that does not check sequence
numbers at all, which makes insertion and ICMP teardown attacks way
easier.
This is intended to be used in situations where one does not see all
-packets of a connection, i.e. in asymmetric routing situations.
+packets of a connection, e.g. in asymmetric routing situations.
Cannot be used with modulate or synproxy state.
+.It Ar pflow
+States created by this rule are exported on the
+.Xr pflow 4
+interface.
.El
.Pp
Multiple options can be specified, separated by commas:
@@ -2472,10 +2532,8 @@ into the anchor.
.Pp
Optionally,
.Ar anchor
-rules can specify the parameter's
-direction, interface, address family, protocol and source/destination
-address/port
-using the same syntax as filter rules.
+rules can specify packet filtering parameters using the same syntax as
+filter rules.
When parameters are used, the
.Ar anchor
rule is only evaluated for matching packets.
@@ -2779,10 +2837,11 @@ in BNF:
.Bd -literal
line = ( option | pf-rule | nat-rule | binat-rule | rdr-rule |
antispoof-rule | altq-rule | queue-rule | trans-anchors |
- anchor-rule | anchor-close | load-anchor | table-rule | )
+ anchor-rule | anchor-close | load-anchor | table-rule |
+ include )
option = "set" ( [ "timeout" ( timeout | "{" timeout-list "}" ) ] |
- [ "ruleset-optimization" [ "none" | "basic" | "profile" ]] |
+ [ "ruleset-optimization" [ "none" | "basic" | "profile" ]] |
[ "optimization" [ "default" | "normal" |
"high-latency" | "satellite" |
"aggressive" | "conservative" ] ]
@@ -2790,9 +2849,10 @@ option = "set" ( [ "timeout" ( timeout | "{" timeout-list "}" ) ] |
[ "loginterface" ( interface-name | "none" ) ] |
[ "block-policy" ( "drop" | "return" ) ] |
[ "state-policy" ( "if-bound" | "floating" ) ]
+ [ "state-defaults" state-opts ]
[ "require-order" ( "yes" | "no" ) ]
[ "fingerprints" filename ] |
- [ "skip on" ( interface-name | "{" interface-list "}" ) ] |
+ [ "skip on" ifspec ] |
[ "debug" ( "none" | "urgent" | "misc" | "loud" ) ] )
pf-rule = action [ ( "in" | "out" ) ]
@@ -2804,10 +2864,10 @@ logopts = logopt [ "," logopts ]
logopt = "all" | "user" | "to" interface-name
filteropt-list = filteropt-list filteropt | filteropt
-filteropt = user | group | flags | icmp-type | icmp6-type | tos |
+filteropt = user | group | flags | icmp-type | icmp6-type | "tos" tos |
( "no" | "keep" | "modulate" | "synproxy" ) "state"
[ "(" state-opts ")" ] |
- "fragment" | "no-df" | "min-ttl" number |
+ "fragment" | "no-df" | "min-ttl" number | "set-tos" tos |
"max-mss" number | "random-id" | "reassemble tcp" |
fragmentation | "allow-opts" |
"label" string | "tag" string | [ ! ] "tagged" string |
@@ -2834,17 +2894,16 @@ rdr-rule = [ "no" ] "rdr" [ "pass" [ "log" [ "(" logopts ")" ] ] ]
[ portspec ] [ pooltype ] ]
antispoof-rule = "antispoof" [ "log" ] [ "quick" ]
- "for" ( interface-name | "{" interface-list "}" )
- [ af ] [ "label" string ]
+ "for" ifspec [ af ] [ "label" string ]
table-rule = "table" "\*(Lt" string "\*(Gt" [ tableopts-list ]
tableopts-list = tableopts-list tableopts | tableopts
-tableopts = "persist" | "const" | "file" string |
+tableopts = "persist" | "const" | "counters" | "file" string |
"{" [ tableaddr-list ] "}"
tableaddr-list = tableaddr-list [ "," ] tableaddr-spec | tableaddr-spec
tableaddr-spec = [ "!" ] tableaddr [ "/" mask-bits ]
-tableaddr = hostname | ipv4-dotted-quad | ipv6-coloned-hex |
- interface-name | "self"
+tableaddr = hostname | ifspec | "self" |
+ ipv4-dotted-quad | ipv6-coloned-hex
altq-rule = "altq on" interface-name queueopts-list
"queue" subqueue
@@ -2852,7 +2911,7 @@ queue-rule = "queue" string [ "on" interface-name ] queueopts-list
subqueue
anchor-rule = "anchor" [ string ] [ ( "in" | "out" ) ] [ "on" ifspec ]
- [ af ] [ protospec ] [ hosts ] [ "{" ]
+ [ af ] [ protospec ] [ hosts ] [ filteropt-list ] [ "{" ]
anchor-close = "}"
@@ -2875,8 +2934,10 @@ return = "drop" | "return" | "return-rst" [ "( ttl" number ")" ] |
icmpcode = ( icmp-code-name | icmp-code-number )
icmp6code = ( icmp6-code-name | icmp6-code-number )
-ifspec = ( [ "!" ] interface-name ) | "{" interface-list "}"
-interface-list = [ "!" ] interface-name [ [ "," ] interface-list ]
+ifspec = ( [ "!" ] ( interface-name | interface-group ) ) |
+ "{" interface-list "}"
+interface-list = [ "!" ] ( interface-name | interface-group )
+ [ [ "," ] interface-list ]
route = ( "route-to" | "reply-to" | "dup-to" )
( routehost | "{" routehost-list "}" )
[ pooltype ]
@@ -2896,8 +2957,9 @@ ipspec = "any" | host | "{" host-list "}"
host = [ "!" ] ( address [ "/" mask-bits ] | "\*(Lt" string "\*(Gt" )
redirhost = address [ "/" mask-bits ]
routehost = "(" interface-name [ address [ "/" mask-bits ] ] ")"
-address = ( interface-name | "(" interface-name ")" | hostname |
- ipv4-dotted-quad | ipv6-coloned-hex )
+address = ( interface-name | interface-group |
+ "(" ( interface-name | interface-group ) ")" |
+ hostname | ipv4-dotted-quad | ipv6-coloned-hex )
host-list = host [ [ "," ] host-list ]
redirhost-list = redirhost [ [ "," ] redirhost-list ]
routehost-list = routehost [ [ "," ] routehost-list ]
@@ -2926,11 +2988,11 @@ icmp-type-code = ( icmp-type-name | icmp-type-number )
[ "code" ( icmp-code-name | icmp-code-number ) ]
icmp-list = icmp-type-code [ [ "," ] icmp-list ]
-tos = "tos" ( "lowdelay" | "throughput" | "reliability" |
+tos = ( "lowdelay" | "throughput" | "reliability" |
[ "0x" ] number )
state-opts = state-opt [ [ "," ] state-opts ]
-state-opt = ( "max" number | "no-sync" | timeout | sloppy |
+state-opt = ( "max" number | "no-sync" | timeout | "sloppy" | "pflow" |
"source-track" [ ( "rule" | "global" ) ] |
"max-src-nodes" number | "max-src-states" number |
"max-src-conn" number |
@@ -2971,9 +3033,10 @@ realtime-sc = "realtime" sc-spec
upperlimit-sc = "upperlimit" sc-spec
sc-spec = ( bandwidth-spec |
"(" bandwidth-spec number bandwidth-spec ")" )
+include = "include" filename
.Ed
.Sh FILES
-.Bl -tag -width "/usr/share/examples/pf" -compact
+.Bl -tag -width "/etc/protocols" -compact
.It Pa /etc/hosts
Host name database.
.It Pa /etc/pf.conf
@@ -2984,8 +3047,6 @@ Default location of OS fingerprints.
Protocol name database.
.It Pa /etc/services
Service name database.
-.It Pa /usr/share/examples/pf
-Example rulesets.
.El
.Sh BUGS
Due to a lock order reversal (LOR) with the socket layer, the use of the
@@ -3017,6 +3078,7 @@ Rules with a route label do not match any traffic.
.Xr ip 4 ,
.Xr ip6 4 ,
.Xr pf 4 ,
+.Xr pflow 4 ,
.Xr pfsync 4 ,
.Xr route 4 ,
.Xr tcp 4 ,
diff --git a/contrib/pf/man/pf.os.5 b/contrib/pf/man/pf.os.5
index ac2b7a8..5930525 100644
--- a/contrib/pf/man/pf.os.5
+++ b/contrib/pf/man/pf.os.5
@@ -1,4 +1,4 @@
-.\" $OpenBSD: pf.os.5,v 1.7 2005/11/16 20:07:18 stevesk Exp $
+.\" $OpenBSD: pf.os.5,v 1.8 2007/05/31 19:19:58 jmc Exp $
.\"
.\" Copyright (c) 2003 Mike Frantzen <frantzen@w4g.org>
.\"
@@ -16,7 +16,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 18, 2003
+.Dd May 31 2007
.Dt PF.OS 5
.Os
.Sh NAME
@@ -217,7 +217,7 @@ almost translates into the following fingerprint
57344:64:1:44:M1460: exampleOS:1.0::exampleOS 1.0
.Ed
.Sh SEE ALSO
-.Xr tcpdump 1 ,
.Xr pf 4 ,
.Xr pf.conf 5 ,
-.Xr pfctl 8
+.Xr pfctl 8 ,
+.Xr tcpdump 1
diff --git a/contrib/pf/man/pflog.4 b/contrib/pf/man/pflog.4
index 7ab96e9..c1039a3 100644
--- a/contrib/pf/man/pflog.4
+++ b/contrib/pf/man/pflog.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: pflog.4,v 1.9 2006/10/25 12:51:31 jmc Exp $
+.\" $OpenBSD: pflog.4,v 1.10 2007/05/31 19:19:51 jmc Exp $
.\"
.\" Copyright (c) 2001 Tobias Weingartner
.\" All rights reserved.
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 10, 2001
+.Dd May 31 2007
.Dt PFLOG 4
.Os
.Sh NAME
@@ -36,7 +36,7 @@
.Sh DESCRIPTION
The
.Nm pflog
-interface is a pseudo-device which makes visible all packets logged by
+interface is a device which makes visible all packets logged by
the packet filter,
.Xr pf 4 .
Logged packets can easily be monitored in real
@@ -91,13 +91,13 @@ and monitor all packets logged on it:
# tcpdump -n -e -ttt -i pflog1
.Ed
.Sh SEE ALSO
-.Xr tcpdump 1
.Xr inet 4 ,
.Xr inet6 4 ,
.Xr netintro 4 ,
.Xr pf 4 ,
.Xr ifconfig 8 ,
-.Xr pflogd 8
+.Xr pflogd 8 ,
+.Xr tcpdump 1
.Sh HISTORY
The
.Nm
diff --git a/contrib/pf/man/pfsync.4 b/contrib/pf/man/pfsync.4
index 63adca9..92534f7 100644
--- a/contrib/pf/man/pfsync.4
+++ b/contrib/pf/man/pfsync.4
@@ -1,4 +1,4 @@
-.\" $OpenBSD: pfsync.4,v 1.24 2006/10/23 07:05:49 jmc Exp $
+.\" $OpenBSD: pfsync.4,v 1.28 2009/02/17 10:05:18 dlg Exp $
.\"
.\" Copyright (c) 2002 Michael Shalayeff
.\" Copyright (c) 2003-2004 Ryan McBride
@@ -26,12 +26,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 6, 2006
+.Dd February 17 2009
.Dt PFSYNC 4
.Os
.Sh NAME
.Nm pfsync
-.Nd packet filter state table logging interface
+.Nd packet filter state table sychronisation interface
.Sh SYNOPSIS
.Cd "device pfsync"
.Sh DESCRIPTION
@@ -40,26 +40,25 @@ The
interface is a pseudo-device which exposes certain changes to the state
table used by
.Xr pf 4 .
-.\" XXX: not yet!
-.\" State changes can be viewed by invoking
-.\" .Xr tcpdump 1
-.\" on the
-.\" .Nm
-.\" interface.
+State changes can be viewed by invoking
+.Xr tcpdump 1
+on the
+.Nm
+interface.
If configured with a physical synchronisation interface,
.Nm
-will send state changes out on that interface using IP multicast,
+will also send state changes out on that interface,
and insert state changes received on that interface from other systems
into the state table.
.Pp
By default, all local changes to the state table are exposed via
.Nm .
-However, state changes from packets received by
+State changes from packets received by
.Nm
over the network are not rebroadcast.
-States created by a rule marked with the
+Updates to states created by a rule marked with the
.Ar no-sync
-keyword are omitted from the
+keyword are ignored by the
.Nm
interface (see
.Xr pf.conf 5
@@ -67,33 +66,19 @@ for details).
.Pp
The
.Nm
-interface will attempt to collapse multiple updates of the same
-state into one message where possible.
-The maximum number of times this can be done before the update is sent out
-is controlled by the
+interface will attempt to collapse multiple state updates into a single
+packet where possible.
+The maximum number of times a single state can be updated before a
+.Nm
+packet will be sent out is controlled by the
.Ar maxupd
parameter to ifconfig
(see
.Xr ifconfig 8
and the example below for more details).
-.Pp
-Each packet retrieved on this interface has a header associated
-with it of length
-.Dv PFSYNC_HDRLEN .
-The header indicates the version of the protocol, address family,
-action taken on the following states, and the number of state
-table entries attached in this packet.
-This structure is defined in
-.Aq Pa net/if_pfsync.h
-as:
-.Bd -literal -offset indent
-struct pfsync_header {
- u_int8_t version;
- u_int8_t af;
- u_int8_t action;
- u_int8_t count;
-};
-.Ed
+The sending out of a
+.Nm
+packet will be delayed by a maximum of one second.
.Sh NETWORK SYNCHRONISATION
States can be synchronised between two or more firewalls using this
interface, by specifying a synchronisation interface using
@@ -104,18 +89,16 @@ interface:
# ifconfig pfsync0 syncdev fxp0
.Ed
.Pp
-It is important that the underlying synchronisation interface is up
-and has an IP address assigned.
-.Pp
By default, state change messages are sent out on the synchronisation
-interface using IP multicast packets.
-The protocol is IP protocol 240, PFSYNC, and the multicast group
-used is 224.0.0.240.
-When a peer address is specified using the
+interface using IP multicast packets to the 244.0.0.240 group address.
+An alternative destination address for
+.Nm
+packets can be specified using the
.Ic syncpeer
-keyword, the peer address is used as a destination for the pfsync traffic,
-and the traffic can then be protected using
-.Xr ipsec 4 .
+keyword.
+This can be used in combination with
+.Xr ipsec 4
+to protect the synchronisation traffic.
In such a configuration, the syncdev should be set to the
.Xr enc 4
interface, as this is where the traffic arrives when it is decapsulated,
@@ -127,50 +110,19 @@ e.g.:
It is important that the pfsync traffic be well secured
as there is no authentication on the protocol and it would
be trivial to spoof packets which create states, bypassing the pf ruleset.
-Either run the pfsync protocol on a trusted network \- ideally a network
+Either run the pfsync protocol on a trusted network \- ideally a network
dedicated to pfsync messages such as a crossover cable between two firewalls,
or specify a peer address and protect the traffic with
.Xr ipsec 4 .
-.Pp
-For
-.Nm
-to start its operation automatically at the system boot time,
-.Va pfsync_enable
-and
-.Va pfsync_syncdev
-variables should be used in
-.Xr rc.conf 5 .
-It is not advisable to set up
-.Nm
-with common network interface configuration variables of
-.Xr rc.conf 5
-because
-.Nm
-must start after its
-.Cm syncdev ,
-which cannot be always ensured in the latter case.
-.\" XXX: not yet!
-.\" .Pp
-.\" There is a one-to-one correspondence between packets seen by
-.\" .Xr bpf 4
-.\" on the
-.\" .Nm
-.\" interface, and packets sent out on the synchronisation interface, i.e.\&
-.\" a packet with 4 state deletion messages on
-.\" .Nm
-.\" means that the same 4 deletions were sent out on the synchronisation
-.\" interface.
-.\" However, the actual packet contents may differ as the messages
-.\" sent over the network are "compressed" where possible, containing
-.\" only the necessary information.
.Sh EXAMPLES
.Nm
and
.Xr carp 4
can be used together to provide automatic failover of a pair of firewalls
configured in parallel.
-One firewall handles all traffic \- if it dies or
-is shut down, the second firewall takes over automatically.
+One firewall will handle all traffic until it dies, is shut down, or is
+manually demoted, at which point the second firewall will take over
+automatically.
.Pp
Both firewalls in this example have three
.Xr sis 4
@@ -208,12 +160,12 @@ traffic through.
The following should be added to the top of
.Pa /etc/pf.conf :
.Bd -literal -offset indent
-pass quick on { sis2 } proto pfsync
-pass on { sis0 sis1 } proto carp
+pass quick on { sis2 } proto pfsync keep state (no-sync)
+pass on { sis0 sis1 } proto carp keep state (no-sync)
.Ed
.Pp
-If it is preferable that one firewall handle the traffic,
-the
+It is preferable that one firewall handle the forwarding of all the traffic,
+therefore the
.Ar advskew
on the backup firewall's
.Xr carp 4
@@ -221,6 +173,7 @@ interfaces should be set to something higher than
the primary's.
For example, if firewall B is the backup, its
carp1 configuration would look like this:
+would look like this:
.Bd -literal -offset indent
ifconfig_carp1="vhid 2 pass bar advskew 100 192.168.0.1/24"
.Ed
@@ -230,16 +183,10 @@ The following must also be added to
.Bd -literal -offset indent
net.inet.carp.preempt=1
.Ed
-.Sh BUGS
-Possibility to view state changes using
-.Xr tcpdump 1
-has not been ported from
-.Ox
-yet.
.Sh SEE ALSO
.Xr bpf 4 ,
.Xr carp 4 ,
-.Xr ifconfig 8 ,
+.Xr enc 4 ,
.Xr inet 4 ,
.Xr inet6 4 ,
.Xr ipsec 4 ,
@@ -247,16 +194,20 @@ yet.
.Xr pf 4 ,
.Xr pf.conf 5 ,
.Xr protocols 5 ,
-.Xr rc.conf 5
+.Xr rc.conf 5 ,
.Xr ifconfig 8 ,
.Xr ifstated 8 ,
-.Xr tcpdump 8
+.Xr tcpdump 1
.Sh HISTORY
The
.Nm
device first appeared in
.Ox 3.3 .
+.Pp
The
.Nm
-device was imported to
-.Fx 5.3 .
+protocol and kernel implementation were significantly modified between
+.Ox 4.4
+and
+.Ox 4.5 .
+The two protocols are incompatible and will not interoperate.
diff --git a/contrib/pf/pfctl/parse.y b/contrib/pf/pfctl/parse.y
index c22a0b6..440692e 100644
--- a/contrib/pf/pfctl/parse.y
+++ b/contrib/pf/pfctl/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.517 2007/02/03 23:26:40 dhartmei Exp $ */
+/* $OpenBSD: parse.y,v 1.554 2008/10/17 12:59:53 henning Exp $ */
/*
* Copyright (c) 2001 Markus Friedl. All rights reserved.
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/stat.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -46,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <altq/altq_hfsc.h>
#include <stdio.h>
+#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <stdarg.h>
@@ -62,15 +64,8 @@ __FBSDID("$FreeBSD$");
#include "pfctl_parser.h"
#include "pfctl.h"
-#ifdef __FreeBSD__
-#define HTONL(x) (x) = htonl((__uint32_t)(x))
-#endif
-
static struct pfctl *pf = NULL;
-static FILE *fin = NULL;
static int debug = 0;
-static int lineno = 1;
-static int errors = 0;
static int rulestate = 0;
static u_int16_t returnicmpdefault =
(ICMP_UNREACH << 8) | ICMP_UNREACH_PORT;
@@ -80,6 +75,39 @@ static int blockpolicy = PFRULE_DROP;
static int require_order = 1;
static int default_statelock;
+TAILQ_HEAD(files, file) files = TAILQ_HEAD_INITIALIZER(files);
+static struct file {
+ TAILQ_ENTRY(file) entry;
+ FILE *stream;
+ char *name;
+ int lineno;
+ int errors;
+} *file;
+struct file *pushfile(const char *, int);
+int popfile(void);
+int check_file_secrecy(int, const char *);
+int yyparse(void);
+int yylex(void);
+int yyerror(const char *, ...);
+int kw_cmp(const void *, const void *);
+int lookup(char *);
+int lgetc(int);
+int lungetc(int);
+int findeol(void);
+
+TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead);
+struct sym {
+ TAILQ_ENTRY(sym) entry;
+ int used;
+ int persist;
+ char *nam;
+ char *val;
+};
+int symset(const char *, const char *, int);
+char *symget(const char *);
+
+int atoul(char *, u_long *);
+
enum {
PFCTL_STATE_NONE,
PFCTL_STATE_OPTION,
@@ -128,7 +156,8 @@ enum { PF_STATE_OPT_MAX, PF_STATE_OPT_NOSYNC, PF_STATE_OPT_SRCTRACK,
PF_STATE_OPT_MAX_SRC_STATES, PF_STATE_OPT_MAX_SRC_CONN,
PF_STATE_OPT_MAX_SRC_CONN_RATE, PF_STATE_OPT_MAX_SRC_NODES,
PF_STATE_OPT_OVERLOAD, PF_STATE_OPT_STATELOCK,
- PF_STATE_OPT_TIMEOUT, PF_STATE_OPT_SLOPPY };
+ PF_STATE_OPT_TIMEOUT, PF_STATE_OPT_SLOPPY,
+ PF_STATE_OPT_PFLOW };
enum { PF_SRCTRACK_NONE, PF_SRCTRACK, PF_SRCTRACK_GLOBAL, PF_SRCTRACK_RULE };
@@ -206,26 +235,34 @@ struct filter_opts {
char *tag;
char *match_tag;
u_int8_t match_tag_not;
- int rtableid;
+ u_int rtableid;
+ struct {
+ struct node_host *addr;
+ u_int16_t port;
+ } divert;
} filter_opts;
struct antispoof_opts {
char *label;
- int rtableid;
+ u_int rtableid;
} antispoof_opts;
struct scrub_opts {
- int marker;
+ int marker;
#define SOM_MINTTL 0x01
#define SOM_MAXMSS 0x02
#define SOM_FRAGCACHE 0x04
- int nodf;
- int minttl;
- int maxmss;
- int fragcache;
- int randomid;
- int reassemble_tcp;
- int rtableid;
+#define SOM_SETTOS 0x08
+ int nodf;
+ int minttl;
+ int maxmss;
+ int settos;
+ int fragcache;
+ int randomid;
+ int reassemble_tcp;
+ char *match_tag;
+ u_int8_t match_tag_not;
+ u_int rtableid;
} scrub_opts;
struct queue_opts {
@@ -260,63 +297,45 @@ struct pool_opts {
} pool_opts;
-struct node_hfsc_opts hfsc_opts;
-
-int yyerror(const char *, ...);
-int disallow_table(struct node_host *, const char *);
-int disallow_urpf_failed(struct node_host *, const char *);
-int disallow_alias(struct node_host *, const char *);
-int rule_consistent(struct pf_rule *, int);
-int filter_consistent(struct pf_rule *, int);
-int nat_consistent(struct pf_rule *);
-int rdr_consistent(struct pf_rule *);
-int process_tabledef(char *, struct table_opts *);
-int yyparse(void);
-void expand_label_str(char *, size_t, const char *, const char *);
-void expand_label_if(const char *, char *, size_t, const char *);
-void expand_label_addr(const char *, char *, size_t, u_int8_t,
- struct node_host *);
-void expand_label_port(const char *, char *, size_t, struct node_port *);
-void expand_label_proto(const char *, char *, size_t, u_int8_t);
-void expand_label_nr(const char *, char *, size_t);
-void expand_label(char *, size_t, const char *, u_int8_t, struct node_host *,
- struct node_port *, struct node_host *, struct node_port *,
- u_int8_t);
-void expand_rule(struct pf_rule *, struct node_if *, struct node_host *,
- struct node_proto *, struct node_os*, struct node_host *,
- struct node_port *, struct node_host *, struct node_port *,
- struct node_uid *, struct node_gid *, struct node_icmp *,
- const char *);
-int expand_altq(struct pf_altq *, struct node_if *, struct node_queue *,
- struct node_queue_bw bwspec, struct node_queue_opt *);
-int expand_queue(struct pf_altq *, struct node_if *, struct node_queue *,
- struct node_queue_bw, struct node_queue_opt *);
-int expand_skip_interface(struct node_if *);
+struct node_hfsc_opts hfsc_opts;
+struct node_state_opt *keep_state_defaults = NULL;
+
+int disallow_table(struct node_host *, const char *);
+int disallow_urpf_failed(struct node_host *, const char *);
+int disallow_alias(struct node_host *, const char *);
+int rule_consistent(struct pf_rule *, int);
+int filter_consistent(struct pf_rule *, int);
+int nat_consistent(struct pf_rule *);
+int rdr_consistent(struct pf_rule *);
+int process_tabledef(char *, struct table_opts *);
+void expand_label_str(char *, size_t, const char *, const char *);
+void expand_label_if(const char *, char *, size_t, const char *);
+void expand_label_addr(const char *, char *, size_t, u_int8_t,
+ struct node_host *);
+void expand_label_port(const char *, char *, size_t,
+ struct node_port *);
+void expand_label_proto(const char *, char *, size_t, u_int8_t);
+void expand_label_nr(const char *, char *, size_t);
+void expand_label(char *, size_t, const char *, u_int8_t,
+ struct node_host *, struct node_port *, struct node_host *,
+ struct node_port *, u_int8_t);
+void expand_rule(struct pf_rule *, struct node_if *,
+ struct node_host *, struct node_proto *, struct node_os *,
+ struct node_host *, struct node_port *, struct node_host *,
+ struct node_port *, struct node_uid *, struct node_gid *,
+ struct node_icmp *, const char *);
+int expand_altq(struct pf_altq *, struct node_if *,
+ struct node_queue *, struct node_queue_bw bwspec,
+ struct node_queue_opt *);
+int expand_queue(struct pf_altq *, struct node_if *,
+ struct node_queue *, struct node_queue_bw,
+ struct node_queue_opt *);
+int expand_skip_interface(struct node_if *);
int check_rulestate(int);
-int kw_cmp(const void *, const void *);
-int lookup(char *);
-int lgetc(FILE *);
-int lungetc(int);
-int findeol(void);
-int yylex(void);
-int atoul(char *, u_long *);
int getservice(char *);
int rule_label(struct pf_rule *, char *);
-TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead);
-struct sym {
- TAILQ_ENTRY(sym) entries;
- int used;
- int persist;
- char *nam;
- char *val;
-};
-
-
-int symset(const char *, const char *, int);
-char *symget(const char *);
-
void mv_rules(struct pf_ruleset *, struct pf_ruleset *);
void decide_address_family(struct node_host *, sa_family_t *);
void remove_invalid_hosts(struct node_host **, sa_family_t *);
@@ -334,10 +353,11 @@ struct loadanchors {
typedef struct {
union {
- u_int32_t number;
+ int64_t number;
+ double probability;
int i;
char *string;
- int rtableid;
+ u_int rtableid;
struct {
u_int8_t b1;
u_int8_t b2;
@@ -403,6 +423,10 @@ typedef struct {
int lineno;
} YYSTYPE;
+#define PPORT_RANGE 1
+#define PPORT_STAR 2
+int parseport(char *, struct range *r, int);
+
#define DYNIF_MULTIADDR(addr) ((addr).type == PF_ADDR_DYNIFTL && \
(!((addr).iflags & PFI_AFLAG_NOALIAS) || \
!isdigit((addr).v.ifname[strlen((addr).v.ifname)-1])))
@@ -417,32 +441,37 @@ typedef struct {
%token REASSEMBLE FRAGDROP FRAGCROP ANCHOR NATANCHOR RDRANCHOR BINATANCHOR
%token SET OPTIMIZATION TIMEOUT LIMIT LOGINTERFACE BLOCKPOLICY RANDOMID
%token REQUIREORDER SYNPROXY FINGERPRINTS NOSYNC DEBUG SKIP HOSTID
-%token ANTISPOOF FOR
+%token ANTISPOOF FOR INCLUDE
%token BITMASK RANDOM SOURCEHASH ROUNDROBIN STATICPORT PROBABILITY
%token ALTQ CBQ PRIQ HFSC BANDWIDTH TBRSIZE LINKSHARE REALTIME UPPERLIMIT
%token QUEUE PRIORITY QLIMIT RTABLE
%token LOAD RULESET_OPTIMIZATION
%token STICKYADDRESS MAXSRCSTATES MAXSRCNODES SOURCETRACK GLOBAL RULE
-%token MAXSRCCONN MAXSRCCONNRATE OVERLOAD FLUSH SLOPPY
-%token TAGGED TAG IFBOUND FLOATING STATEPOLICY ROUTE
+%token MAXSRCCONN MAXSRCCONNRATE OVERLOAD FLUSH SLOPPY PFLOW
+%token TAGGED TAG IFBOUND FLOATING STATEPOLICY STATEDEFAULTS ROUTE SETTOS
+%token DIVERTTO DIVERTREPLY
%token <v.string> STRING
+%token <v.number> NUMBER
%token <v.i> PORTBINARY
%type <v.interface> interface if_list if_item_not if_item
%type <v.number> number icmptype icmp6type uid gid
%type <v.number> tos not yesno
+%type <v.probability> probability
%type <v.i> no dir af fragcache optimizer
%type <v.i> sourcetrack flush unaryop statelock
-%type <v.b> action nataction natpass scrubaction
+%type <v.b> action nataction natpasslog scrubaction
%type <v.b> flags flag blockspec
-%type <v.range> port rport
+%type <v.range> portplain portstar portrange
%type <v.hashkey> hashkey
%type <v.proto> proto proto_list proto_item
+%type <v.number> protoval
%type <v.icmp> icmpspec
%type <v.icmp> icmp_list icmp_item
%type <v.icmp> icmp6_list icmp6_item
+%type <v.number> reticmpspec reticmp6spec
%type <v.fromto> fromto
%type <v.peer> ipportspec from to
-%type <v.host> ipspec xhost host dynaddr host_list
+%type <v.host> ipspec toipspec xhost host dynaddr host_list
%type <v.host> redir_host_list redirspec
%type <v.host> route_host route_host_list routespec
%type <v.os> os xos os_list
@@ -451,7 +480,8 @@ typedef struct {
%type <v.gid> gids gid_list gid_item
%type <v.route> route
%type <v.redirection> redirection redirpool
-%type <v.string> label string tag anchorname
+%type <v.string> label stringall tag anchorname
+%type <v.string> string varstring numberstring
%type <v.keep_state> keep
%type <v.state_opt> state_opt_spec state_opt_list state_opt_item
%type <v.logquick> logquick quick log logopts logopt
@@ -474,6 +504,7 @@ typedef struct {
%%
ruleset : /* empty */
+ | ruleset include '\n'
| ruleset '\n'
| ruleset option '\n'
| ruleset scrubrule '\n'
@@ -488,7 +519,22 @@ ruleset : /* empty */
| ruleset antispoof '\n'
| ruleset tabledef '\n'
| '{' fakeanchor '}' '\n';
- | ruleset error '\n' { errors++; }
+ | ruleset error '\n' { file->errors++; }
+ ;
+
+include : INCLUDE STRING {
+ struct file *nfile;
+
+ if ((nfile = pushfile($2, 0)) == NULL) {
+ yyerror("failed to include file %s", $2);
+ free($2);
+ YYERROR;
+ }
+ free($2);
+
+ file = nfile;
+ lungetc('\n');
+ }
;
/*
@@ -511,7 +557,7 @@ optimizer : string {
else if (!strcmp($1, "profile"))
$$ = PF_OPTIMIZE_BASIC | PF_OPTIMIZE_PROFILE;
else {
- yyerror("unknown ruleset-optimization %s", $$);
+ yyerror("unknown ruleset-optimization %s", $1);
YYERROR;
}
}
@@ -536,10 +582,10 @@ option : SET OPTIMIZATION STRING {
}
}
| SET TIMEOUT timeout_spec
- | SET TIMEOUT '{' timeout_list '}'
+ | SET TIMEOUT '{' optnl timeout_list '}'
| SET LIMIT limit_spec
- | SET LIMIT '{' limit_list '}'
- | SET LOGINTERFACE STRING {
+ | SET LIMIT '{' optnl limit_list '}'
+ | SET LOGINTERFACE stringall {
if (check_rulestate(PFCTL_STATE_OPTION)) {
free($3);
YYERROR;
@@ -552,7 +598,7 @@ option : SET OPTIMIZATION STRING {
free($3);
}
| SET HOSTID number {
- if ($3 == 0) {
+ if ($3 == 0 || $3 > UINT_MAX) {
yyerror("hostid must be non-zero");
YYERROR;
}
@@ -629,9 +675,24 @@ option : SET OPTIMIZATION STRING {
YYERROR;
}
}
+ | SET STATEDEFAULTS state_opt_list {
+ if (keep_state_defaults != NULL) {
+ yyerror("cannot redefine state-defaults");
+ YYERROR;
+ }
+ keep_state_defaults = $3;
+ }
;
-string : string STRING {
+stringall : STRING { $$ = $1; }
+ | ALL {
+ if (($$ = strdup("all")) == NULL) {
+ err(1, "stringall: strdup");
+ }
+ }
+ ;
+
+string : STRING string {
if (asprintf(&$$, "%s %s", $1, $2) == -1)
err(1, "string: asprintf");
free($1);
@@ -640,7 +701,27 @@ string : string STRING {
| STRING
;
-varset : STRING '=' string {
+varstring : numberstring varstring {
+ if (asprintf(&$$, "%s %s", $1, $2) == -1)
+ err(1, "string: asprintf");
+ free($1);
+ free($2);
+ }
+ | numberstring
+ ;
+
+numberstring : NUMBER {
+ char *s;
+ if (asprintf(&s, "%lld", (long long)$1) == -1) {
+ yyerror("string: asprintf");
+ YYERROR;
+ }
+ $$ = s;
+ }
+ | STRING
+ ;
+
+varset : STRING '=' varstring {
if (pf->opts & PF_OPT_VERBOSE)
printf("%s = \"%s\"\n", $1, $3);
if (symset($1, $3, 0) == -1)
@@ -654,14 +735,10 @@ anchorname : STRING { $$ = $1; }
| /* empty */ { $$ = NULL; }
;
-optnl : optnl '\n'
- |
- ;
-
-pfa_anchorlist : pfrule optnl
- | anchorrule optnl
- | pfa_anchorlist pfrule optnl
- | pfa_anchorlist anchorrule optnl
+pfa_anchorlist : /* empty */
+ | pfa_anchorlist '\n'
+ | pfa_anchorlist pfrule '\n'
+ | pfa_anchorlist anchorrule '\n'
;
pfa_anchor : '{'
@@ -694,6 +771,7 @@ anchorrule : ANCHOR anchorname dir quick interface af proto fromto
filter_opts pfa_anchor
{
struct pf_rule r;
+ struct node_proto *proto;
if (check_rulestate(PFCTL_STATE_FILTER)) {
if ($2)
@@ -744,6 +822,55 @@ anchorrule : ANCHOR anchorname dir quick interface af proto fromto
r.prob = $9.prob;
r.rtableid = $9.rtableid;
+ if ($9.tag)
+ if (strlcpy(r.tagname, $9.tag,
+ PF_TAG_NAME_SIZE) >= PF_TAG_NAME_SIZE) {
+ yyerror("tag too long, max %u chars",
+ PF_TAG_NAME_SIZE - 1);
+ YYERROR;
+ }
+ if ($9.match_tag)
+ if (strlcpy(r.match_tagname, $9.match_tag,
+ PF_TAG_NAME_SIZE) >= PF_TAG_NAME_SIZE) {
+ yyerror("tag too long, max %u chars",
+ PF_TAG_NAME_SIZE - 1);
+ YYERROR;
+ }
+ r.match_tag_not = $9.match_tag_not;
+ if (rule_label(&r, $9.label))
+ YYERROR;
+ free($9.label);
+ r.flags = $9.flags.b1;
+ r.flagset = $9.flags.b2;
+ if (($9.flags.b1 & $9.flags.b2) != $9.flags.b1) {
+ yyerror("flags always false");
+ YYERROR;
+ }
+ if ($9.flags.b1 || $9.flags.b2 || $8.src_os) {
+ for (proto = $7; proto != NULL &&
+ proto->proto != IPPROTO_TCP;
+ proto = proto->next)
+ ; /* nothing */
+ if (proto == NULL && $7 != NULL) {
+ if ($9.flags.b1 || $9.flags.b2)
+ yyerror(
+ "flags only apply to tcp");
+ if ($8.src_os)
+ yyerror(
+ "OS fingerprinting only "
+ "applies to tcp");
+ YYERROR;
+ }
+ }
+
+ r.tos = $9.tos;
+
+ if ($9.keep.action) {
+ yyerror("cannot specify state handling "
+ "on anchors");
+ YYERROR;
+ }
+
if ($9.match_tag)
if (strlcpy(r.match_tagname, $9.match_tag,
PF_TAG_NAME_SIZE) >= PF_TAG_NAME_SIZE) {
@@ -758,8 +885,8 @@ anchorrule : ANCHOR anchorname dir quick interface af proto fromto
expand_rule(&r, $5, NULL, $7, $8.src_os,
$8.src.host, $8.src.port, $8.dst.host, $8.dst.port,
- 0, 0, 0, pf->astack[pf->asd + 1] ?
- pf->alast->name : $2);
+ $9.uid, $9.gid, $9.icmpspec,
+ pf->astack[pf->asd + 1] ? pf->alast->name : $2);
free($2);
pf->astack[pf->asd + 1] = NULL;
}
@@ -939,8 +1066,20 @@ scrubrule : scrubaction dir logquick interface af proto fromto scrub_opts
r.min_ttl = $8.minttl;
if ($8.maxmss)
r.max_mss = $8.maxmss;
+ if ($8.marker & SOM_SETTOS) {
+ r.rule_flag |= PFRULE_SET_TOS;
+ r.set_tos = $8.settos;
+ }
if ($8.fragcache)
r.rule_flag |= $8.fragcache;
+ if ($8.match_tag)
+ if (strlcpy(r.match_tagname, $8.match_tag,
+ PF_TAG_NAME_SIZE) >= PF_TAG_NAME_SIZE) {
+ yyerror("tag too long, max %u chars",
+ PF_TAG_NAME_SIZE - 1);
+ YYERROR;
+ }
+ r.match_tag_not = $8.match_tag_not;
r.rtableid = $8.rtableid;
expand_rule(&r, $4, NULL, $6, $7.src_os,
@@ -973,30 +1112,38 @@ scrub_opt : NODF {
}
scrub_opts.nodf = 1;
}
- | MINTTL number {
+ | MINTTL NUMBER {
if (scrub_opts.marker & SOM_MINTTL) {
yyerror("min-ttl cannot be respecified");
YYERROR;
}
- if ($2 > 255) {
+ if ($2 < 0 || $2 > 255) {
yyerror("illegal min-ttl value %d", $2);
YYERROR;
}
scrub_opts.marker |= SOM_MINTTL;
scrub_opts.minttl = $2;
}
- | MAXMSS number {
+ | MAXMSS NUMBER {
if (scrub_opts.marker & SOM_MAXMSS) {
yyerror("max-mss cannot be respecified");
YYERROR;
}
- if ($2 > 65535) {
+ if ($2 < 0 || $2 > 65535) {
yyerror("illegal max-mss value %d", $2);
YYERROR;
}
scrub_opts.marker |= SOM_MAXMSS;
scrub_opts.maxmss = $2;
}
+ | SETTOS tos {
+ if (scrub_opts.marker & SOM_SETTOS) {
+ yyerror("set-tos cannot be respecified");
+ YYERROR;
+ }
+ scrub_opts.marker |= SOM_SETTOS;
+ scrub_opts.settos = $2;
+ }
| fragcache {
if (scrub_opts.marker & SOM_FRAGCACHE) {
yyerror("fragcache cannot be respecified");
@@ -1026,15 +1173,17 @@ scrub_opt : NODF {
}
scrub_opts.randomid = 1;
}
- | RTABLE number {
-#ifndef __FreeBSD__
- if ($2 > RT_TABLEID_MAX || $2 < 0) {
+ | RTABLE NUMBER {
+ if ($2 < 0 /* || $2 > RT_TABLEID_MAX */) {
yyerror("invalid rtable id");
YYERROR;
}
-#endif
scrub_opts.rtableid = $2;
}
+ | not TAGGED string {
+ scrub_opts.match_tag = $3;
+ scrub_opts.match_tag_not = $1;
+ }
;
fragcache : FRAGMENT REASSEMBLE { $$ = 0; /* default */ }
@@ -1108,6 +1257,7 @@ antispoof : ANTISPOOF logquick antispoof_ifspc af antispoof_opts {
r.action = PF_DROP;
r.direction = PF_IN;
r.log = $2.log;
+ r.logif = $2.logif;
r.quick = $2.quick;
r.af = $4;
if (rule_label(&r, $5.label))
@@ -1128,20 +1278,20 @@ antispoof : ANTISPOOF logquick antispoof_ifspc af antispoof_opts {
}
;
-antispoof_ifspc : FOR antispoof_if { $$ = $2; }
- | FOR '{' antispoof_iflst '}' { $$ = $3; }
+antispoof_ifspc : FOR antispoof_if { $$ = $2; }
+ | FOR '{' optnl antispoof_iflst '}' { $$ = $4; }
;
-antispoof_iflst : antispoof_if { $$ = $1; }
- | antispoof_iflst comma antispoof_if {
+antispoof_iflst : antispoof_if optnl { $$ = $1; }
+ | antispoof_iflst comma antispoof_if optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
}
;
-antispoof_if : if_item { $$ = $1; }
- | '(' if_item ')' {
+antispoof_if : if_item { $$ = $1; }
+ | '(' if_item ')' {
$2->dynamic = 1;
$$ = $2;
}
@@ -1171,13 +1321,11 @@ antispoof_opt : label {
}
antispoof_opts.label = $1;
}
- | RTABLE number {
-#ifndef __FreeBSD__
- if ($2 > RT_TABLEID_MAX || $2 < 0) {
+ | RTABLE NUMBER {
+ if ($2 < 0 /* || $2 > RT_TABLEID_MAX */ ) {
yyerror("invalid rtable id");
YYERROR;
}
-#endif
antispoof_opts.rtableid = $2;
}
;
@@ -1239,6 +1387,8 @@ table_opt : STRING {
table_opts.flags |= PFR_TFLAG_CONST;
else if (!strcmp($1, "persist"))
table_opts.flags |= PFR_TFLAG_PERSIST;
+ else if (!strcmp($1, "counters"))
+ table_opts.flags |= PFR_TFLAG_COUNTERS;
else {
yyerror("invalid table option '%s'", $1);
free($1);
@@ -1246,15 +1396,19 @@ table_opt : STRING {
}
free($1);
}
- | '{' '}' { table_opts.init_addr = 1; }
- | '{' host_list '}' {
+ | '{' optnl '}' { table_opts.init_addr = 1; }
+ | '{' optnl host_list '}' {
struct node_host *n;
struct node_tinit *ti;
- for (n = $2; n != NULL; n = n->next) {
+ for (n = $3; n != NULL; n = n->next) {
switch (n->addr.type) {
case PF_ADDR_ADDRMASK:
continue; /* ok */
+ case PF_ADDR_RANGE:
+ yyerror("address ranges are not "
+ "permitted inside tables");
+ break;
case PF_ADDR_DYNIFTL:
yyerror("dynamic addresses are not "
"permitted inside tables");
@@ -1278,7 +1432,7 @@ table_opt : STRING {
}
if (!(ti = calloc(1, sizeof(*ti))))
err(1, "table_opt: calloc");
- ti->host = $2;
+ ti->host = $3;
SIMPLEQ_INSERT_TAIL(&table_opts.init_nodes, ti,
entries);
table_opts.init_addr = 1;
@@ -1387,24 +1541,24 @@ queue_opt : BANDWIDTH bandwidth {
queue_opts.marker |= QOM_BWSPEC;
queue_opts.queue_bwspec = $2;
}
- | PRIORITY number {
+ | PRIORITY NUMBER {
if (queue_opts.marker & QOM_PRIORITY) {
yyerror("priority cannot be respecified");
YYERROR;
}
- if ($2 > 255) {
+ if ($2 < 0 || $2 > 255) {
yyerror("priority out of range: max 255");
YYERROR;
}
queue_opts.marker |= QOM_PRIORITY;
queue_opts.priority = $2;
}
- | QLIMIT number {
+ | QLIMIT NUMBER {
if (queue_opts.marker & QOM_QLIMIT) {
yyerror("qlimit cannot be respecified");
YYERROR;
}
- if ($2 > 65535) {
+ if ($2 < 0 || $2 > 65535) {
yyerror("qlimit out of range: max 65535");
YYERROR;
}
@@ -1419,12 +1573,12 @@ queue_opt : BANDWIDTH bandwidth {
queue_opts.marker |= QOM_SCHEDULER;
queue_opts.scheduler = $1;
}
- | TBRSIZE number {
+ | TBRSIZE NUMBER {
if (queue_opts.marker & QOM_TBRSIZE) {
yyerror("tbrsize cannot be respecified");
YYERROR;
}
- if ($2 > 65535) {
+ if ($2 < 0 || $2 > 65535) {
yyerror("tbrsize too big: max 65535");
YYERROR;
}
@@ -1467,6 +1621,14 @@ bandwidth : STRING {
free($1);
$$.bw_absolute = (u_int32_t)bps;
}
+ | NUMBER {
+ if ($1 < 0 || $1 > UINT_MAX) {
+ yyerror("bandwidth number too big");
+ YYERROR;
+ }
+ $$.bw_percent = 0;
+ $$.bw_absolute = $1;
+ }
;
scheduler : CBQ {
@@ -1563,8 +1725,12 @@ hfscopts_item : LINKSHARE bandwidth {
hfsc_opts.linkshare.m2 = $2;
hfsc_opts.linkshare.used = 1;
}
- | LINKSHARE '(' bandwidth comma number comma bandwidth ')'
+ | LINKSHARE '(' bandwidth comma NUMBER comma bandwidth ')'
{
+ if ($5 < 0 || $5 > INT_MAX) {
+ yyerror("timing in curve out of range");
+ YYERROR;
+ }
if (hfsc_opts.linkshare.used) {
yyerror("linkshare already specified");
YYERROR;
@@ -1582,8 +1748,12 @@ hfscopts_item : LINKSHARE bandwidth {
hfsc_opts.realtime.m2 = $2;
hfsc_opts.realtime.used = 1;
}
- | REALTIME '(' bandwidth comma number comma bandwidth ')'
+ | REALTIME '(' bandwidth comma NUMBER comma bandwidth ')'
{
+ if ($5 < 0 || $5 > INT_MAX) {
+ yyerror("timing in curve out of range");
+ YYERROR;
+ }
if (hfsc_opts.realtime.used) {
yyerror("realtime already specified");
YYERROR;
@@ -1601,8 +1771,12 @@ hfscopts_item : LINKSHARE bandwidth {
hfsc_opts.upperlimit.m2 = $2;
hfsc_opts.upperlimit.used = 1;
}
- | UPPERLIMIT '(' bandwidth comma number comma bandwidth ')'
+ | UPPERLIMIT '(' bandwidth comma NUMBER comma bandwidth ')'
{
+ if ($5 < 0 || $5 > INT_MAX) {
+ yyerror("timing in curve out of range");
+ YYERROR;
+ }
if (hfsc_opts.upperlimit.used) {
yyerror("upperlimit already specified");
YYERROR;
@@ -1632,11 +1806,11 @@ hfscopts_item : LINKSHARE bandwidth {
qassign : /* empty */ { $$ = NULL; }
| qassign_item { $$ = $1; }
- | '{' qassign_list '}' { $$ = $2; }
+ | '{' optnl qassign_list '}' { $$ = $3; }
;
-qassign_list : qassign_item { $$ = $1; }
- | qassign_list comma qassign_item {
+qassign_list : qassign_item optnl { $$ = $1; }
+ | qassign_list comma qassign_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
@@ -1670,6 +1844,7 @@ pfrule : action dir logquick interface route af proto fromto
int srctrack = 0;
int statelock = 0;
int adaptive = 0;
+ int defaults = 0;
if (check_rulestate(PFCTL_STATE_FILTER))
YYERROR;
@@ -1752,13 +1927,16 @@ pfrule : action dir logquick interface route af proto fromto
r.tos = $9.tos;
r.keep_state = $9.keep.action;
+ o = $9.keep.options;
/* 'keep state' by default on pass rules. */
if (!r.keep_state && !r.action &&
- !($9.marker & FOM_KEEP))
+ !($9.marker & FOM_KEEP)) {
r.keep_state = PF_STATE_NORMAL;
+ o = keep_state_defaults;
+ defaults = 1;
+ }
- o = $9.keep.options;
while (o) {
struct node_state_opt *p = o;
@@ -1899,6 +2077,15 @@ pfrule : action dir logquick interface route af proto fromto
}
r.rule_flag |= PFRULE_STATESLOPPY;
break;
+ case PF_STATE_OPT_PFLOW:
+ if (r.rule_flag & PFRULE_PFLOW) {
+ yyerror("state pflow "
+ "option: multiple "
+ "definitions");
+ YYERROR;
+ }
+ r.rule_flag |= PFRULE_PFLOW;
+ break;
case PF_STATE_OPT_TIMEOUT:
if (o->data.timeout.number ==
PFTM_ADAPTIVE_START ||
@@ -1916,7 +2103,8 @@ pfrule : action dir logquick interface route af proto fromto
o->data.timeout.seconds;
}
o = o->next;
- free(p);
+ if (!defaults)
+ free(p);
}
/* 'flags S/SA' by default on stateful rules */
@@ -2035,6 +2223,34 @@ pfrule : action dir logquick interface route af proto fromto
}
free($9.queues.pqname);
}
+#ifdef __FreeBSD__
+ r.divert.port = $9.divert.port;
+#else
+ if ((r.divert.port = $9.divert.port)) {
+ if (r.direction == PF_OUT) {
+ if ($9.divert.addr) {
+ yyerror("address specified "
+ "for outgoing divert");
+ YYERROR;
+ }
+ bzero(&r.divert.addr,
+ sizeof(r.divert.addr));
+ } else {
+ if (!$9.divert.addr) {
+ yyerror("no address specified "
+ "for incoming divert");
+ YYERROR;
+ }
+ if ($9.divert.addr->af != r.af) {
+ yyerror("address family "
+ "mismatch for divert");
+ YYERROR;
+ }
+ r.divert.addr =
+ $9.divert.addr->addr.v.a.addr;
+ }
+ }
+#endif
expand_rule(&r, $4, $5.host, $7, $8.src_os,
$8.src.host, $8.src.port, $8.dst.host, $8.dst.port,
@@ -2088,13 +2304,13 @@ filter_opt : USER uids {
filter_opts.marker |= FOM_ICMP;
filter_opts.icmpspec = $1;
}
- | tos {
+ | TOS tos {
if (filter_opts.marker & FOM_TOS) {
yyerror("tos cannot be redefined");
YYERROR;
}
filter_opts.marker |= FOM_TOS;
- filter_opts.tos = $1;
+ filter_opts.tos = $2;
}
| keep {
if (filter_opts.marker & FOM_KEEP) {
@@ -2132,39 +2348,84 @@ filter_opt : USER uids {
filter_opts.match_tag = $3;
filter_opts.match_tag_not = $1;
}
- | PROBABILITY STRING {
- char *e;
- double p = strtod($2, &e);
+ | PROBABILITY probability {
+ double p;
- if (*e == '%') {
- p *= 0.01;
- e++;
+ p = floor($2 * UINT_MAX + 0.5);
+ if (p < 0.0 || p > UINT_MAX) {
+ yyerror("invalid probability: %lf", p);
+ YYERROR;
}
- if (*e) {
- yyerror("invalid probability: %s", $2);
- free($2);
+ filter_opts.prob = (u_int32_t)p;
+ if (filter_opts.prob == 0)
+ filter_opts.prob = 1;
+ }
+ | RTABLE NUMBER {
+ if ($2 < 0 /* || $2 > RT_TABLEID_MAX */ ) {
+ yyerror("invalid rtable id");
YYERROR;
}
- p = floor(p * (UINT_MAX+1.0) + 0.5);
- if (p < 1.0 || p >= (UINT_MAX+1.0)) {
- yyerror("invalid probability: %s", $2);
- free($2);
+ filter_opts.rtableid = $2;
+ }
+ | DIVERTTO portplain {
+#ifdef __FreeBSD__
+ filter_opts.divert.port = $2.a;
+ if (!filter_opts.divert.port) {
+ yyerror("invalid divert port: %u", ntohs($2.a));
YYERROR;
}
- filter_opts.prob = (u_int32_t)p;
- free($2);
+#endif
}
- | RTABLE number {
+ | DIVERTTO STRING PORT portplain {
#ifndef __FreeBSD__
- if ($2 > RT_TABLEID_MAX || $2 < 0) {
- yyerror("invalid rtable id");
+ if ((filter_opts.divert.addr = host($2)) == NULL) {
+ yyerror("could not parse divert address: %s",
+ $2);
+ free($2);
YYERROR;
}
+#else
+ if ($2)
+#endif
+ free($2);
+ filter_opts.divert.port = $4.a;
+ if (!filter_opts.divert.port) {
+ yyerror("invalid divert port: %u", ntohs($4.a));
+ YYERROR;
+ }
+ }
+ | DIVERTREPLY {
+#ifdef __FreeBSD__
+ yyerror("divert-reply has no meaning in FreeBSD pf(4)");
+ YYERROR;
+#else
+ filter_opts.divert.port = 1; /* some random value */
#endif
- filter_opts.rtableid = $2;
}
;
+probability : STRING {
+ char *e;
+ double p = strtod($1, &e);
+
+ if (*e == '%') {
+ p *= 0.01;
+ e++;
+ }
+ if (*e) {
+ yyerror("invalid probability: %s", $1);
+ free($1);
+ YYERROR;
+ }
+ free($1);
+ $$ = p;
+ }
+ | NUMBER {
+ $$ = (double)$1;
+ }
+ ;
+
+
action : PASS { $$.b1 = PF_PASS; $$.b2 = $$.w = 0; }
| BLOCK blockspec { $$ = $2; $$.b1 = PF_DROP; }
;
@@ -2184,8 +2445,8 @@ blockspec : /* empty */ {
$$.w = 0;
$$.w2 = 0;
}
- | RETURNRST '(' TTL number ')' {
- if ($4 > 255) {
+ | RETURNRST '(' TTL NUMBER ')' {
+ if ($4 < 0 || $4 > 255) {
yyerror("illegal ttl value %d", $4);
YYERROR;
}
@@ -2203,34 +2464,20 @@ blockspec : /* empty */ {
$$.w = returnicmpdefault;
$$.w2 = returnicmp6default;
}
- | RETURNICMP '(' STRING ')' {
+ | RETURNICMP '(' reticmpspec ')' {
$$.b2 = PFRULE_RETURNICMP;
- if (!($$.w = parseicmpspec($3, AF_INET))) {
- free($3);
- YYERROR;
- }
- free($3);
- $$.w2 = returnicmp6default;
+ $$.w = $3;
+ $$.w2 = returnicmpdefault;
}
- | RETURNICMP6 '(' STRING ')' {
+ | RETURNICMP6 '(' reticmp6spec ')' {
$$.b2 = PFRULE_RETURNICMP;
$$.w = returnicmpdefault;
- if (!($$.w2 = parseicmpspec($3, AF_INET6))) {
- free($3);
- YYERROR;
- }
- free($3);
+ $$.w2 = $3;
}
- | RETURNICMP '(' STRING comma STRING ')' {
+ | RETURNICMP '(' reticmpspec comma reticmp6spec ')' {
$$.b2 = PFRULE_RETURNICMP;
- if (!($$.w = parseicmpspec($3, AF_INET)) ||
- !($$.w2 = parseicmpspec($5, AF_INET6))) {
- free($3);
- free($5);
- YYERROR;
- }
- free($3);
- free($5);
+ $$.w = $3;
+ $$.w2 = $5;
}
| RETURN {
$$.b2 = PFRULE_RETURN;
@@ -2239,7 +2486,45 @@ blockspec : /* empty */ {
}
;
-dir : /* empty */ { $$ = 0; }
+reticmpspec : STRING {
+ if (!($$ = parseicmpspec($1, AF_INET))) {
+ free($1);
+ YYERROR;
+ }
+ free($1);
+ }
+ | NUMBER {
+ u_int8_t icmptype;
+
+ if ($1 < 0 || $1 > 255) {
+ yyerror("invalid icmp code %lu", $1);
+ YYERROR;
+ }
+ icmptype = returnicmpdefault >> 8;
+ $$ = (icmptype << 8 | $1);
+ }
+ ;
+
+reticmp6spec : STRING {
+ if (!($$ = parseicmpspec($1, AF_INET6))) {
+ free($1);
+ YYERROR;
+ }
+ free($1);
+ }
+ | NUMBER {
+ u_int8_t icmptype;
+
+ if ($1 < 0 || $1 > 255) {
+ yyerror("invalid icmp code %lu", $1);
+ YYERROR;
+ }
+ icmptype = returnicmp6default >> 8;
+ $$ = (icmptype << 8 | $1);
+ }
+ ;
+
+dir : /* empty */ { $$ = PF_INOUT; }
| IN { $$ = PF_IN; }
| OUT { $$ = PF_OUT; }
;
@@ -2297,11 +2582,11 @@ logopt : ALL { $$.log = PF_LOG_ALL; $$.logif = 0; }
interface : /* empty */ { $$ = NULL; }
| ON if_item_not { $$ = $2; }
- | ON '{' if_list '}' { $$ = $3; }
+ | ON '{' optnl if_list '}' { $$ = $4; }
;
-if_list : if_item_not { $$ = $1; }
- | if_list comma if_item_not {
+if_list : if_item_not optnl { $$ = $1; }
+ | if_list comma if_item_not optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
@@ -2340,42 +2625,23 @@ af : /* empty */ { $$ = 0; }
| INET6 { $$ = AF_INET6; }
;
-proto : /* empty */ { $$ = NULL; }
- | PROTO proto_item { $$ = $2; }
- | PROTO '{' proto_list '}' { $$ = $3; }
+proto : /* empty */ { $$ = NULL; }
+ | PROTO proto_item { $$ = $2; }
+ | PROTO '{' optnl proto_list '}' { $$ = $4; }
;
-proto_list : proto_item { $$ = $1; }
- | proto_list comma proto_item {
+proto_list : proto_item optnl { $$ = $1; }
+ | proto_list comma proto_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
}
;
-proto_item : STRING {
+proto_item : protoval {
u_int8_t pr;
- u_long ulval;
- if (atoul($1, &ulval) == 0) {
- if (ulval > 255) {
- yyerror("protocol outside range");
- free($1);
- YYERROR;
- }
- pr = (u_int8_t)ulval;
- } else {
- struct protoent *p;
-
- p = getprotobyname($1);
- if (p == NULL) {
- yyerror("unknown protocol %s", $1);
- free($1);
- YYERROR;
- }
- pr = p->p_proto;
- }
- free($1);
+ pr = (u_int8_t)$1;
if (pr == 0) {
yyerror("proto 0 cannot be used");
YYERROR;
@@ -2389,6 +2655,26 @@ proto_item : STRING {
}
;
+protoval : STRING {
+ struct protoent *p;
+
+ p = getprotobyname($1);
+ if (p == NULL) {
+ yyerror("unknown protocol %s", $1);
+ free($1);
+ YYERROR;
+ }
+ $$ = p->p_proto;
+ free($1);
+ }
+ | NUMBER {
+ if ($1 < 0 || $1 > 255) {
+ yyerror("protocol outside range");
+ YYERROR;
+ }
+ }
+ ;
+
fromto : ALL {
$$.src.host = NULL;
$$.src.port = NULL;
@@ -2405,7 +2691,7 @@ fromto : ALL {
os : /* empty */ { $$ = NULL; }
| OS xos { $$ = $2; }
- | OS '{' os_list '}' { $$ = $3; }
+ | OS '{' optnl os_list '}' { $$ = $4; }
;
xos : STRING {
@@ -2417,8 +2703,8 @@ xos : STRING {
}
;
-os_list : xos { $$ = $1; }
- | os_list comma xos {
+os_list : xos optnl { $$ = $1; }
+ | os_list comma xos optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
@@ -2460,13 +2746,21 @@ ipportspec : ipspec {
}
;
+optnl : '\n' optnl
+ |
+ ;
+
ipspec : ANY { $$ = NULL; }
| xhost { $$ = $1; }
- | '{' host_list '}' { $$ = $2; }
+ | '{' optnl host_list '}' { $$ = $3; }
+ ;
+
+toipspec : TO ipspec { $$ = $2; }
+ | /* empty */ { $$ = NULL; }
;
-host_list : ipspec { $$ = $1; }
- | host_list comma ipspec {
+host_list : ipspec optnl { $$ = $1; }
+ | host_list comma ipspec optnl {
if ($3 == NULL)
$$ = $1;
else if ($1 == NULL)
@@ -2516,10 +2810,43 @@ host : STRING {
free($1);
}
- | STRING '/' number {
+ | STRING '-' STRING {
+ struct node_host *b, *e;
+
+ if ((b = host($1)) == NULL || (e = host($3)) == NULL) {
+ free($1);
+ free($3);
+ yyerror("could not parse host specification");
+ YYERROR;
+ }
+ if (b->af != e->af ||
+ b->addr.type != PF_ADDR_ADDRMASK ||
+ e->addr.type != PF_ADDR_ADDRMASK ||
+ unmask(&b->addr.v.a.mask, b->af) !=
+ (b->af == AF_INET ? 32 : 128) ||
+ unmask(&e->addr.v.a.mask, e->af) !=
+ (e->af == AF_INET ? 32 : 128) ||
+ b->next != NULL || b->not ||
+ e->next != NULL || e->not) {
+ free(b);
+ free(e);
+ free($1);
+ free($3);
+ yyerror("invalid address range");
+ YYERROR;
+ }
+ memcpy(&b->addr.v.a.mask, &e->addr.v.a.addr,
+ sizeof(b->addr.v.a.mask));
+ b->addr.type = PF_ADDR_RANGE;
+ $$ = b;
+ free(e);
+ free($1);
+ free($3);
+ }
+ | STRING '/' NUMBER {
char *buf;
- if (asprintf(&buf, "%s/%u", $1, $3) == -1)
+ if (asprintf(&buf, "%s/%lld", $1, (long long)$3) == -1)
err(1, "host: asprintf");
free($1);
if (($$ = host(buf)) == NULL) {
@@ -2530,10 +2857,32 @@ host : STRING {
}
free(buf);
}
+ | NUMBER '/' NUMBER {
+ char *buf;
+
+ /* ie. for 10/8 parsing */
+#ifdef __FreeBSD__
+ if (asprintf(&buf, "%lld/%lld", (long long)$1, (long long)$3) == -1)
+#else
+ if (asprintf(&buf, "%lld/%lld", $1, $3) == -1)
+#endif
+ err(1, "host: asprintf");
+ if (($$ = host(buf)) == NULL) {
+ /* error. "any" is handled elsewhere */
+ free(buf);
+ yyerror("could not parse host specification");
+ YYERROR;
+ }
+ free(buf);
+ }
| dynaddr
- | dynaddr '/' number {
+ | dynaddr '/' NUMBER {
struct node_host *n;
+ if ($3 < 0 || $3 > 128) {
+ yyerror("bit number too big");
+ YYERROR;
+ }
$$ = $1;
for (n = $1; n != NULL; n = n->next)
set_ipmask(n, $3);
@@ -2578,7 +2927,8 @@ host : STRING {
}
;
-number : STRING {
+number : NUMBER
+ | STRING {
u_long ulval;
if (atoul($1, &ulval) == -1) {
@@ -2646,18 +2996,18 @@ dynaddr : '(' STRING ')' {
;
portspec : port_item { $$ = $1; }
- | '{' port_list '}' { $$ = $2; }
+ | '{' optnl port_list '}' { $$ = $3; }
;
-port_list : port_item { $$ = $1; }
- | port_list comma port_item {
+port_list : port_item optnl { $$ = $1; }
+ | port_list comma port_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
}
;
-port_item : port {
+port_item : portrange {
$$ = calloc(1, sizeof(struct node_port));
if ($$ == NULL)
err(1, "port_item: calloc");
@@ -2670,7 +3020,7 @@ port_item : port {
$$->next = NULL;
$$->tail = $$;
}
- | unaryop port {
+ | unaryop portrange {
if ($2.t) {
yyerror("':' cannot be used with an other "
"port operator");
@@ -2685,7 +3035,7 @@ port_item : port {
$$->next = NULL;
$$->tail = $$;
}
- | port PORTBINARY port {
+ | portrange PORTBINARY portrange {
if ($1.t || $3.t) {
yyerror("':' cannot be used with an other "
"port operator");
@@ -2702,38 +3052,30 @@ port_item : port {
}
;
-port : STRING {
- char *p = strchr($1, ':');
-
- if (p == NULL) {
- if (($$.a = getservice($1)) == -1) {
- free($1);
- YYERROR;
- }
- $$.b = $$.t = 0;
- } else {
- int port[2];
+portplain : numberstring {
+ if (parseport($1, &$$, 0) == -1) {
+ free($1);
+ YYERROR;
+ }
+ free($1);
+ }
+ ;
- *p++ = 0;
- if ((port[0] = getservice($1)) == -1 ||
- (port[1] = getservice(p)) == -1) {
- free($1);
- YYERROR;
- }
- $$.a = port[0];
- $$.b = port[1];
- $$.t = PF_OP_RRG;
+portrange : numberstring {
+ if (parseport($1, &$$, PPORT_RANGE) == -1) {
+ free($1);
+ YYERROR;
}
free($1);
}
;
uids : uid_item { $$ = $1; }
- | '{' uid_list '}' { $$ = $2; }
+ | '{' optnl uid_list '}' { $$ = $3; }
;
-uid_list : uid_item { $$ = $1; }
- | uid_list comma uid_item {
+uid_list : uid_item optnl { $$ = $1; }
+ | uid_list comma uid_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
@@ -2783,39 +3125,35 @@ uid_item : uid {
;
uid : STRING {
- u_long ulval;
-
- if (atoul($1, &ulval) == -1) {
- if (!strcmp($1, "unknown"))
- $$ = UID_MAX;
- else {
- struct passwd *pw;
+ if (!strcmp($1, "unknown"))
+ $$ = UID_MAX;
+ else {
+ struct passwd *pw;
- if ((pw = getpwnam($1)) == NULL) {
- yyerror("unknown user %s", $1);
- free($1);
- YYERROR;
- }
- $$ = pw->pw_uid;
- }
- } else {
- if (ulval >= UID_MAX) {
+ if ((pw = getpwnam($1)) == NULL) {
+ yyerror("unknown user %s", $1);
free($1);
- yyerror("illegal uid value %lu", ulval);
YYERROR;
}
- $$ = ulval;
+ $$ = pw->pw_uid;
}
free($1);
}
+ | NUMBER {
+ if ($1 < 0 || $1 >= UID_MAX) {
+ yyerror("illegal uid value %lu", $1);
+ YYERROR;
+ }
+ $$ = $1;
+ }
;
gids : gid_item { $$ = $1; }
- | '{' gid_list '}' { $$ = $2; }
+ | '{' optnl gid_list '}' { $$ = $3; }
;
-gid_list : gid_item { $$ = $1; }
- | gid_list comma gid_item {
+gid_list : gid_item optnl { $$ = $1; }
+ | gid_list comma gid_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
@@ -2865,31 +3203,27 @@ gid_item : gid {
;
gid : STRING {
- u_long ulval;
-
- if (atoul($1, &ulval) == -1) {
- if (!strcmp($1, "unknown"))
- $$ = GID_MAX;
- else {
- struct group *grp;
+ if (!strcmp($1, "unknown"))
+ $$ = GID_MAX;
+ else {
+ struct group *grp;
- if ((grp = getgrnam($1)) == NULL) {
- yyerror("unknown group %s", $1);
- free($1);
- YYERROR;
- }
- $$ = grp->gr_gid;
- }
- } else {
- if (ulval >= GID_MAX) {
- yyerror("illegal gid value %lu", ulval);
+ if ((grp = getgrnam($1)) == NULL) {
+ yyerror("unknown group %s", $1);
free($1);
YYERROR;
}
- $$ = ulval;
+ $$ = grp->gr_gid;
}
free($1);
}
+ | NUMBER {
+ if ($1 < 0 || $1 >= GID_MAX) {
+ yyerror("illegal gid value %lu", $1);
+ YYERROR;
+ }
+ $$ = $1;
+ }
;
flag : STRING {
@@ -2910,22 +3244,22 @@ flags : FLAGS flag '/' flag { $$.b1 = $2.b1; $$.b2 = $4.b1; }
| FLAGS ANY { $$.b1 = 0; $$.b2 = 0; }
;
-icmpspec : ICMPTYPE icmp_item { $$ = $2; }
- | ICMPTYPE '{' icmp_list '}' { $$ = $3; }
- | ICMP6TYPE icmp6_item { $$ = $2; }
- | ICMP6TYPE '{' icmp6_list '}' { $$ = $3; }
+icmpspec : ICMPTYPE icmp_item { $$ = $2; }
+ | ICMPTYPE '{' optnl icmp_list '}' { $$ = $4; }
+ | ICMP6TYPE icmp6_item { $$ = $2; }
+ | ICMP6TYPE '{' optnl icmp6_list '}' { $$ = $4; }
;
-icmp_list : icmp_item { $$ = $1; }
- | icmp_list comma icmp_item {
+icmp_list : icmp_item optnl { $$ = $1; }
+ | icmp_list comma icmp_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
}
;
-icmp6_list : icmp6_item { $$ = $1; }
- | icmp6_list comma icmp6_item {
+icmp6_list : icmp6_item optnl { $$ = $1; }
+ | icmp6_list comma icmp6_item optnl {
$1->tail->next = $3;
$1->tail = $3;
$$ = $1;
@@ -2944,29 +3278,33 @@ icmp_item : icmptype {
}
| icmptype CODE STRING {
const struct icmpcodeent *p;
- u_long ulval;
- if (atoul($3, &ulval) == 0) {
- if (ulval > 255) {
- free($3);
- yyerror("illegal icmp-code %lu", ulval);
- YYERROR;
- }
- } else {
- if ((p = geticmpcodebyname($1-1, $3,
- AF_INET)) == NULL) {
- yyerror("unknown icmp-code %s", $3);
- free($3);
- YYERROR;
- }
- ulval = p->code;
+ if ((p = geticmpcodebyname($1-1, $3, AF_INET)) == NULL) {
+ yyerror("unknown icmp-code %s", $3);
+ free($3);
+ YYERROR;
}
+
free($3);
$$ = calloc(1, sizeof(struct node_icmp));
if ($$ == NULL)
err(1, "icmp_item: calloc");
$$->type = $1;
- $$->code = ulval + 1;
+ $$->code = p->code + 1;
+ $$->proto = IPPROTO_ICMP;
+ $$->next = NULL;
+ $$->tail = $$;
+ }
+ | icmptype CODE NUMBER {
+ if ($3 < 0 || $3 > 255) {
+ yyerror("illegal icmp-code %lu", $3);
+ YYERROR;
+ }
+ $$ = calloc(1, sizeof(struct node_icmp));
+ if ($$ == NULL)
+ err(1, "icmp_item: calloc");
+ $$->type = $1;
+ $$->code = $3 + 1;
$$->proto = IPPROTO_ICMP;
$$->next = NULL;
$$->tail = $$;
@@ -2985,30 +3323,33 @@ icmp6_item : icmp6type {
}
| icmp6type CODE STRING {
const struct icmpcodeent *p;
- u_long ulval;
- if (atoul($3, &ulval) == 0) {
- if (ulval > 255) {
- yyerror("illegal icmp6-code %lu",
- ulval);
- free($3);
- YYERROR;
- }
- } else {
- if ((p = geticmpcodebyname($1-1, $3,
- AF_INET6)) == NULL) {
- yyerror("unknown icmp6-code %s", $3);
- free($3);
- YYERROR;
- }
- ulval = p->code;
+ if ((p = geticmpcodebyname($1-1, $3, AF_INET6)) == NULL) {
+ yyerror("unknown icmp6-code %s", $3);
+ free($3);
+ YYERROR;
}
free($3);
+
$$ = calloc(1, sizeof(struct node_icmp));
if ($$ == NULL)
err(1, "icmp_item: calloc");
$$->type = $1;
- $$->code = ulval + 1;
+ $$->code = p->code + 1;
+ $$->proto = IPPROTO_ICMPV6;
+ $$->next = NULL;
+ $$->tail = $$;
+ }
+ | icmp6type CODE NUMBER {
+ if ($3 < 0 || $3 > 255) {
+ yyerror("illegal icmp-code %lu", $3);
+ YYERROR;
+ }
+ $$ = calloc(1, sizeof(struct node_icmp));
+ if ($$ == NULL)
+ err(1, "icmp_item: calloc");
+ $$->type = $1;
+ $$->code = $3 + 1;
$$->proto = IPPROTO_ICMPV6;
$$->next = NULL;
$$->tail = $$;
@@ -3017,70 +3358,69 @@ icmp6_item : icmp6type {
icmptype : STRING {
const struct icmptypeent *p;
- u_long ulval;
- if (atoul($1, &ulval) == 0) {
- if (ulval > 255) {
- yyerror("illegal icmp-type %lu", ulval);
- free($1);
- YYERROR;
- }
- $$ = ulval + 1;
- } else {
- if ((p = geticmptypebyname($1, AF_INET)) ==
- NULL) {
- yyerror("unknown icmp-type %s", $1);
- free($1);
- YYERROR;
- }
- $$ = p->type + 1;
+ if ((p = geticmptypebyname($1, AF_INET)) == NULL) {
+ yyerror("unknown icmp-type %s", $1);
+ free($1);
+ YYERROR;
}
+ $$ = p->type + 1;
free($1);
}
+ | NUMBER {
+ if ($1 < 0 || $1 > 255) {
+ yyerror("illegal icmp-type %lu", $1);
+ YYERROR;
+ }
+ $$ = $1 + 1;
+ }
;
icmp6type : STRING {
const struct icmptypeent *p;
- u_long ulval;
- if (atoul($1, &ulval) == 0) {
- if (ulval > 255) {
- yyerror("illegal icmp6-type %lu",
- ulval);
- free($1);
- YYERROR;
- }
- $$ = ulval + 1;
- } else {
- if ((p = geticmptypebyname($1, AF_INET6)) ==
- NULL) {
- yyerror("unknown icmp6-type %s", $1);
- free($1);
- YYERROR;
- }
- $$ = p->type + 1;
+ if ((p = geticmptypebyname($1, AF_INET6)) ==
+ NULL) {
+ yyerror("unknown icmp6-type %s", $1);
+ free($1);
+ YYERROR;
}
+ $$ = p->type + 1;
free($1);
}
+ | NUMBER {
+ if ($1 < 0 || $1 > 255) {
+ yyerror("illegal icmp6-type %lu", $1);
+ YYERROR;
+ }
+ $$ = $1 + 1;
+ }
;
-tos : TOS STRING {
- if (!strcmp($2, "lowdelay"))
+tos : STRING {
+ if (!strcmp($1, "lowdelay"))
$$ = IPTOS_LOWDELAY;
- else if (!strcmp($2, "throughput"))
+ else if (!strcmp($1, "throughput"))
$$ = IPTOS_THROUGHPUT;
- else if (!strcmp($2, "reliability"))
+ else if (!strcmp($1, "reliability"))
$$ = IPTOS_RELIABILITY;
- else if ($2[0] == '0' && $2[1] == 'x')
- $$ = strtoul($2, NULL, 16);
+ else if ($1[0] == '0' && $1[1] == 'x')
+ $$ = strtoul($1, NULL, 16);
else
- $$ = strtoul($2, NULL, 10);
+ $$ = 0; /* flag bad argument */
if (!$$ || $$ > 255) {
- yyerror("illegal tos value %s", $2);
- free($2);
+ yyerror("illegal tos value %s", $1);
+ free($1);
+ YYERROR;
+ }
+ free($1);
+ }
+ | NUMBER {
+ $$ = $1;
+ if (!$$ || $$ > 255) {
+ yyerror("illegal tos value %s", $1);
YYERROR;
}
- free($2);
}
;
@@ -3134,7 +3474,11 @@ state_opt_list : state_opt_item { $$ = $1; }
}
;
-state_opt_item : MAXIMUM number {
+state_opt_item : MAXIMUM NUMBER {
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
$$ = calloc(1, sizeof(struct node_state_opt));
if ($$ == NULL)
err(1, "state_opt_item: calloc");
@@ -3151,7 +3495,11 @@ state_opt_item : MAXIMUM number {
$$->next = NULL;
$$->tail = $$;
}
- | MAXSRCSTATES number {
+ | MAXSRCSTATES NUMBER {
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
$$ = calloc(1, sizeof(struct node_state_opt));
if ($$ == NULL)
err(1, "state_opt_item: calloc");
@@ -3160,7 +3508,11 @@ state_opt_item : MAXIMUM number {
$$->next = NULL;
$$->tail = $$;
}
- | MAXSRCCONN number {
+ | MAXSRCCONN NUMBER {
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
$$ = calloc(1, sizeof(struct node_state_opt));
if ($$ == NULL)
err(1, "state_opt_item: calloc");
@@ -3169,7 +3521,12 @@ state_opt_item : MAXIMUM number {
$$->next = NULL;
$$->tail = $$;
}
- | MAXSRCCONNRATE number '/' number {
+ | MAXSRCCONNRATE NUMBER '/' NUMBER {
+ if ($2 < 0 || $2 > UINT_MAX ||
+ $4 < 0 || $4 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
$$ = calloc(1, sizeof(struct node_state_opt));
if ($$ == NULL)
err(1, "state_opt_item: calloc");
@@ -3197,7 +3554,11 @@ state_opt_item : MAXIMUM number {
$$->next = NULL;
$$->tail = $$;
}
- | MAXSRCNODES number {
+ | MAXSRCNODES NUMBER {
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
$$ = calloc(1, sizeof(struct node_state_opt));
if ($$ == NULL)
err(1, "state_opt_item: calloc");
@@ -3232,9 +3593,21 @@ state_opt_item : MAXIMUM number {
$$->next = NULL;
$$->tail = $$;
}
- | STRING number {
+ | PFLOW {
+ $$ = calloc(1, sizeof(struct node_state_opt));
+ if ($$ == NULL)
+ err(1, "state_opt_item: calloc");
+ $$->type = PF_STATE_OPT_PFLOW;
+ $$->next = NULL;
+ $$->tail = $$;
+ }
+ | STRING NUMBER {
int i;
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
for (i = 0; pf_timeouts[i].name &&
strcmp(pf_timeouts[i].name, $1); ++i)
; /* nothing */
@@ -3267,9 +3640,11 @@ label : LABEL STRING {
qname : QUEUE STRING {
$$.qname = $2;
+ $$.pqname = NULL;
}
| QUEUE '(' STRING ')' {
$$.qname = $3;
+ $$.pqname = NULL;
}
| QUEUE '(' STRING comma STRING ')' {
$$.qname = $3;
@@ -3281,44 +3656,21 @@ no : /* empty */ { $$ = 0; }
| NO { $$ = 1; }
;
-rport : STRING {
- char *p = strchr($1, ':');
-
- if (p == NULL) {
- if (($$.a = getservice($1)) == -1) {
- free($1);
- YYERROR;
- }
- $$.b = $$.t = 0;
- } else if (!strcmp(p+1, "*")) {
- *p = 0;
- if (($$.a = getservice($1)) == -1) {
- free($1);
- YYERROR;
- }
- $$.b = 0;
- $$.t = 1;
- } else {
- *p++ = 0;
- if (($$.a = getservice($1)) == -1 ||
- ($$.b = getservice(p)) == -1) {
- free($1);
- YYERROR;
- }
- if ($$.a == $$.b)
- $$.b = 0;
- $$.t = 0;
+portstar : numberstring {
+ if (parseport($1, &$$, PPORT_RANGE|PPORT_STAR) == -1) {
+ free($1);
+ YYERROR;
}
free($1);
}
;
redirspec : host { $$ = $1; }
- | '{' redir_host_list '}' { $$ = $2; }
+ | '{' optnl redir_host_list '}' { $$ = $3; }
;
-redir_host_list : host { $$ = $1; }
- | redir_host_list comma host {
+redir_host_list : host optnl { $$ = $1; }
+ | redir_host_list comma host optnl {
$1->tail->next = $3;
$1->tail = $3->tail;
$$ = $1;
@@ -3333,7 +3685,7 @@ redirpool : /* empty */ { $$ = NULL; }
$$->host = $2;
$$->rport.a = $$->rport.b = $$->rport.t = 0;
}
- | ARROW redirspec PORT rport {
+ | ARROW redirspec PORT portstar {
$$ = calloc(1, sizeof(struct redirection));
if ($$ == NULL)
err(1, "redirection: calloc");
@@ -3459,7 +3811,7 @@ redirection : /* empty */ { $$ = NULL; }
$$->host = $2;
$$->rport.a = $$->rport.b = $$->rport.t = 0;
}
- | ARROW host PORT rport {
+ | ARROW host PORT portstar {
$$ = calloc(1, sizeof(struct redirection));
if ($$ == NULL)
err(1, "redirection: calloc");
@@ -3468,17 +3820,13 @@ redirection : /* empty */ { $$ = NULL; }
}
;
-/* ifdef __FreeBSD__ */
-natpass : /* empty */ { $$.b1 = $$.b2 = 0; $$.w2 = 0; }
+natpasslog : /* empty */ { $$.b1 = $$.b2 = 0; $$.w2 = 0; }
| PASS { $$.b1 = 1; $$.b2 = 0; $$.w2 = 0; }
-/* else
-natpass : empty { $$.b1 = $$.b2 = 0; }
- | PASS { $$.b1 = 1; $$.b2 = 0; }
- * endif */
| PASS log { $$.b1 = 1; $$.b2 = $2.log; $$.w2 = $2.logif; }
+ | log { $$.b1 = 0; $$.b2 = $1.log; $$.w2 = $1.logif; }
;
-nataction : no NAT natpass {
+nataction : no NAT natpasslog {
if ($1 && $3.b1) {
yyerror("\"pass\" not valid with \"no\"");
YYERROR;
@@ -3491,7 +3839,7 @@ nataction : no NAT natpass {
$$.w = $3.b2;
$$.w2 = $3.w2;
}
- | no RDR natpass {
+ | no RDR natpasslog {
if ($1 && $3.b1) {
yyerror("\"pass\" not valid with \"no\"");
YYERROR;
@@ -3665,7 +4013,7 @@ natrule : nataction interface af proto fromto tag tagged rtable
}
;
-binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
+binatrule : no BINAT natpasslog interface af proto FROM host toipspec tag
tagged rtable redirection
{
struct pf_rule binat;
@@ -3673,7 +4021,7 @@ binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
if (check_rulestate(PFCTL_STATE_NAT))
YYERROR;
- if (disallow_urpf_failed($10, "\"urpf-failed\" is not "
+ if (disallow_urpf_failed($9, "\"urpf-failed\" is not "
"permitted as a binat destination"))
YYERROR;
@@ -3693,11 +4041,11 @@ binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
binat.af = $5;
if (!binat.af && $8 != NULL && $8->af)
binat.af = $8->af;
- if (!binat.af && $10 != NULL && $10->af)
- binat.af = $10->af;
+ if (!binat.af && $9 != NULL && $9->af)
+ binat.af = $9->af;
- if (!binat.af && $14 != NULL && $14->host)
- binat.af = $14->host->af;
+ if (!binat.af && $13 != NULL && $13->host)
+ binat.af = $13->host->af;
if (!binat.af) {
yyerror("address family (inet/inet6) "
"undefined");
@@ -3711,22 +4059,22 @@ binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
free($4);
}
- if ($11 != NULL)
- if (strlcpy(binat.tagname, $11,
+ if ($10 != NULL)
+ if (strlcpy(binat.tagname, $10,
PF_TAG_NAME_SIZE) >= PF_TAG_NAME_SIZE) {
yyerror("tag too long, max %u chars",
PF_TAG_NAME_SIZE - 1);
YYERROR;
}
- if ($12.name)
- if (strlcpy(binat.match_tagname, $12.name,
+ if ($11.name)
+ if (strlcpy(binat.match_tagname, $11.name,
PF_TAG_NAME_SIZE) >= PF_TAG_NAME_SIZE) {
yyerror("tag too long, max %u chars",
PF_TAG_NAME_SIZE - 1);
YYERROR;
}
- binat.match_tag_not = $12.neg;
- binat.rtableid = $13;
+ binat.match_tag_not = $11.neg;
+ binat.rtableid = $12;
if ($6 != NULL) {
binat.proto = $6->proto;
@@ -3740,12 +4088,12 @@ binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
"interface (%s) as the source address of a binat "
"rule"))
YYERROR;
- if ($14 != NULL && $14->host != NULL && disallow_table(
- $14->host, "invalid use of table <%s> as the "
+ if ($13 != NULL && $13->host != NULL && disallow_table(
+ $13->host, "invalid use of table <%s> as the "
"redirect address of a binat rule"))
YYERROR;
- if ($14 != NULL && $14->host != NULL && disallow_alias(
- $14->host, "invalid use of interface (%s) as the "
+ if ($13 != NULL && $13->host != NULL && disallow_alias(
+ $13->host, "invalid use of interface (%s) as the "
"redirect address of a binat rule"))
YYERROR;
@@ -3766,51 +4114,51 @@ binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
sizeof(binat.src.addr));
free($8);
}
- if ($10 != NULL) {
- if ($10->next) {
+ if ($9 != NULL) {
+ if ($9->next) {
yyerror("multiple binat ip addresses");
YYERROR;
}
- if ($10->af != binat.af && $10->af) {
+ if ($9->af != binat.af && $9->af) {
yyerror("binat ip versions must match");
YYERROR;
}
- if (check_netmask($10, binat.af))
+ if (check_netmask($9, binat.af))
YYERROR;
- memcpy(&binat.dst.addr, &$10->addr,
+ memcpy(&binat.dst.addr, &$9->addr,
sizeof(binat.dst.addr));
- binat.dst.neg = $10->not;
- free($10);
+ binat.dst.neg = $9->not;
+ free($9);
}
if (binat.action == PF_NOBINAT) {
- if ($14 != NULL) {
+ if ($13 != NULL) {
yyerror("'no binat' rule does not need"
" '->'");
YYERROR;
}
} else {
- if ($14 == NULL || $14->host == NULL) {
+ if ($13 == NULL || $13->host == NULL) {
yyerror("'binat' rule requires"
" '-> address'");
YYERROR;
}
- remove_invalid_hosts(&$14->host, &binat.af);
- if (invalid_redirect($14->host, binat.af))
+ remove_invalid_hosts(&$13->host, &binat.af);
+ if (invalid_redirect($13->host, binat.af))
YYERROR;
- if ($14->host->next != NULL) {
+ if ($13->host->next != NULL) {
yyerror("binat rule must redirect to "
"a single address");
YYERROR;
}
- if (check_netmask($14->host, binat.af))
+ if (check_netmask($13->host, binat.af))
YYERROR;
if (!PF_AZERO(&binat.src.addr.v.a.mask,
binat.af) &&
!PF_AEQ(&binat.src.addr.v.a.mask,
- &$14->host->addr.v.a.mask, binat.af)) {
+ &$13->host->addr.v.a.mask, binat.af)) {
yyerror("'binat' source mask and "
"redirect mask must be the same");
YYERROR;
@@ -3820,12 +4168,12 @@ binatrule : no BINAT natpass interface af proto FROM host TO ipspec tag
pa = calloc(1, sizeof(struct pf_pooladdr));
if (pa == NULL)
err(1, "binat: calloc");
- pa->addr = $14->host->addr;
+ pa->addr = $13->host->addr;
pa->ifname[0] = 0;
TAILQ_INSERT_TAIL(&binat.rpool.list,
pa, entries);
- free($14);
+ free($13);
}
pfctl_add_rule(pf, &binat, "");
@@ -3841,17 +4189,12 @@ tagged : /* empty */ { $$.neg = 0; $$.name = NULL; }
;
rtable : /* empty */ { $$ = -1; }
- | RTABLE number {
-#ifdef __FreeBSD__
- yyerror("rtable id not supported in FreeBSD, yet");
- YYERROR;
-#else
- if ($2 > RT_TABLEID_MAX || $2 < 0) {
+ | RTABLE NUMBER {
+ if ($2 < 0 /* || $2 > RT_TABLEID_MAX */ ) {
yyerror("invalid rtable id");
YYERROR;
}
$$ = $2;
-#endif
}
;
@@ -3870,8 +4213,8 @@ route_host : STRING {
}
;
-route_host_list : route_host { $$ = $1; }
- | route_host_list comma route_host {
+route_host_list : route_host optnl { $$ = $1; }
+ | route_host_list comma route_host optnl {
if ($1->af == 0)
$1->af = $3->af;
if ($1->af != $3->af) {
@@ -3886,7 +4229,7 @@ route_host_list : route_host { $$ = $1; }
;
routespec : route_host { $$ = $1; }
- | '{' route_host_list '}' { $$ = $2; }
+ | '{' optnl route_host_list '}' { $$ = $3; }
;
route : /* empty */ {
@@ -3922,12 +4265,16 @@ route : /* empty */ {
}
;
-timeout_spec : STRING number
+timeout_spec : STRING NUMBER
{
if (check_rulestate(PFCTL_STATE_OPTION)) {
free($1);
YYERROR;
}
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
if (pfctl_set_timeout(pf, $1, $2, 0) != 0) {
yyerror("unknown timeout %s", $1);
free($1);
@@ -3937,16 +4284,20 @@ timeout_spec : STRING number
}
;
-timeout_list : timeout_list comma timeout_spec
- | timeout_spec
+timeout_list : timeout_list comma timeout_spec optnl
+ | timeout_spec optnl
;
-limit_spec : STRING number
+limit_spec : STRING NUMBER
{
if (check_rulestate(PFCTL_STATE_OPTION)) {
free($1);
YYERROR;
}
+ if ($2 < 0 || $2 > UINT_MAX) {
+ yyerror("only positive values permitted");
+ YYERROR;
+ }
if (pfctl_set_limit(pf, $1, $2) != 0) {
yyerror("unable to set limit %s %u", $1, $2);
free($1);
@@ -3956,8 +4307,8 @@ limit_spec : STRING number
}
;
-limit_list : limit_list comma limit_spec
- | limit_spec
+limit_list : limit_list comma limit_spec optnl
+ | limit_spec optnl
;
comma : ','
@@ -3992,11 +4343,10 @@ int
yyerror(const char *fmt, ...)
{
va_list ap;
- extern char *infile;
- errors = 1;
+ file->errors++;
va_start(ap, fmt);
- fprintf(stderr, "%s:%d: ", infile, yylval.lineno);
+ fprintf(stderr, "%s:%d: ", file->name, yylval.lineno);
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
va_end(ap);
@@ -4914,6 +5264,8 @@ lookup(char *s)
{ "code", CODE},
{ "crop", FRAGCROP},
{ "debug", DEBUG},
+ { "divert-reply", DIVERTREPLY},
+ { "divert-to", DIVERTTO},
{ "drop", DROP},
{ "drop-ovl", FRAGDROP},
{ "dup-to", DUPTO},
@@ -4934,6 +5286,7 @@ lookup(char *s)
{ "icmp6-type", ICMP6TYPE},
{ "if-bound", IFBOUND},
{ "in", IN},
+ { "include", INCLUDE},
{ "inet", INET},
{ "inet6", INET6},
{ "keep", KEEP},
@@ -4963,6 +5316,7 @@ lookup(char *s)
{ "out", OUT},
{ "overload", OVERLOAD},
{ "pass", PASS},
+ { "pflow", PFLOW},
{ "port", PORT},
{ "priority", PRIORITY},
{ "priq", PRIQ},
@@ -4991,11 +5345,13 @@ lookup(char *s)
{ "ruleset-optimization", RULESET_OPTIMIZATION},
{ "scrub", SCRUB},
{ "set", SET},
+ { "set-tos", SETTOS},
{ "skip", SKIP},
{ "sloppy", SLOPPY},
{ "source-hash", SOURCEHASH},
{ "source-track", SOURCETRACK},
{ "state", STATE},
+ { "state-defaults", STATEDEFAULTS},
{ "state-policy", STATEPOLICY},
{ "static-port", STATICPORT},
{ "sticky-address", STICKYADDRESS},
@@ -5036,9 +5392,9 @@ char pushback_buffer[MAXPUSHBACK];
int pushback_index = 0;
int
-lgetc(FILE *f)
+lgetc(int quotec)
{
- int c, next;
+ int c, next;
if (parsebuf) {
/* Read character from the parsebuffer instead of input. */
@@ -5054,24 +5410,31 @@ lgetc(FILE *f)
if (pushback_index)
return (pushback_buffer[--pushback_index]);
- while ((c = getc(f)) == '\\') {
- next = getc(f);
+ if (quotec) {
+ if ((c = getc(file->stream)) == EOF) {
+ yyerror("reached end of file while parsing quoted string");
+ if (popfile() == EOF)
+ return (EOF);
+ return (quotec);
+ }
+ return (c);
+ }
+
+ while ((c = getc(file->stream)) == '\\') {
+ next = getc(file->stream);
if (next != '\n') {
c = next;
break;
}
- yylval.lineno = lineno;
- lineno++;
- }
- if (c == '\t' || c == ' ') {
- /* Compress blanks to a single space. */
- do {
- c = getc(f);
- } while (c == '\t' || c == ' ');
- ungetc(c, f);
- c = ' ';
+ yylval.lineno = file->lineno;
+ file->lineno++;
}
+ while (c == EOF) {
+ if (popfile() == EOF)
+ return (EOF);
+ c = getc(file->stream);
+ }
return (c);
}
@@ -5097,13 +5460,15 @@ findeol(void)
int c;
parsebuf = NULL;
- pushback_index = 0;
/* skip to either EOF or the first real EOL */
while (1) {
- c = lgetc(fin);
+ if (pushback_index)
+ c = pushback_buffer[--pushback_index];
+ else
+ c = lgetc(0);
if (c == '\n') {
- lineno++;
+ file->lineno++;
break;
}
if (c == EOF)
@@ -5117,21 +5482,21 @@ yylex(void)
{
char buf[8096];
char *p, *val;
- int endc, c, next;
+ int quotec, next, c;
int token;
top:
p = buf;
- while ((c = lgetc(fin)) == ' ')
+ while ((c = lgetc(0)) == ' ' || c == '\t')
; /* nothing */
- yylval.lineno = lineno;
+ yylval.lineno = file->lineno;
if (c == '#')
- while ((c = lgetc(fin)) != '\n' && c != EOF)
+ while ((c = lgetc(0)) != '\n' && c != EOF)
; /* nothing */
if (c == '$' && parsebuf == NULL) {
while (1) {
- if ((c = lgetc(fin)) == EOF)
+ if ((c = lgetc(0)) == EOF)
return (0);
if (p + 1 >= buf + sizeof(buf) - 1) {
@@ -5159,17 +5524,25 @@ top:
switch (c) {
case '\'':
case '"':
- endc = c;
+ quotec = c;
while (1) {
- if ((c = lgetc(fin)) == EOF)
+ if ((c = lgetc(quotec)) == EOF)
return (0);
- if (c == endc) {
- *p = '\0';
- break;
- }
if (c == '\n') {
- lineno++;
+ file->lineno++;
continue;
+ } else if (c == '\\') {
+ if ((next = lgetc(quotec)) == EOF)
+ return (0);
+ if (next == quotec || c == ' ' || c == '\t')
+ c = next;
+ else if (next == '\n')
+ continue;
+ else
+ lungetc(next);
+ } else if (c == quotec) {
+ *p = '\0';
+ break;
}
if (p + 1 >= buf + sizeof(buf) - 1) {
yyerror("string too long");
@@ -5182,7 +5555,7 @@ top:
err(1, "yylex: strdup");
return (STRING);
case '<':
- next = lgetc(fin);
+ next = lgetc(0);
if (next == '>') {
yylval.v.i = PF_OP_XRG;
return (PORTBINARY);
@@ -5190,7 +5563,7 @@ top:
lungetc(next);
break;
case '>':
- next = lgetc(fin);
+ next = lgetc(0);
if (next == '<') {
yylval.v.i = PF_OP_IRG;
return (PORTBINARY);
@@ -5198,13 +5571,49 @@ top:
lungetc(next);
break;
case '-':
- next = lgetc(fin);
+ next = lgetc(0);
if (next == '>')
return (ARROW);
lungetc(next);
break;
}
+#define allowed_to_end_number(x) \
+ (isspace(x) || x == ')' || x ==',' || x == '/' || x == '}' || x == '=')
+
+ if (c == '-' || isdigit(c)) {
+ do {
+ *p++ = c;
+ if ((unsigned)(p-buf) >= sizeof(buf)) {
+ yyerror("string too long");
+ return (findeol());
+ }
+ } while ((c = lgetc(0)) != EOF && isdigit(c));
+ lungetc(c);
+ if (p == buf + 1 && buf[0] == '-')
+ goto nodigits;
+ if (c == EOF || allowed_to_end_number(c)) {
+ const char *errstr = NULL;
+
+ *p = '\0';
+ yylval.v.number = strtonum(buf, LLONG_MIN,
+ LLONG_MAX, &errstr);
+ if (errstr) {
+ yyerror("\"%s\" invalid number: %s",
+ buf, errstr);
+ return (findeol());
+ }
+ return (NUMBER);
+ } else {
+nodigits:
+ while (p > buf + 1)
+ lungetc(*--p);
+ c = *--p;
+ if (c == '-')
+ return (c);
+ }
+ }
+
#define allowed_in_string(x) \
(isalnum(x) || (ispunct(x) && x != '(' && x != ')' && \
x != '{' && x != '}' && x != '<' && x != '>' && \
@@ -5218,7 +5627,7 @@ top:
yyerror("string too long");
return (findeol());
}
- } while ((c = lgetc(fin)) != EOF && (allowed_in_string(c)));
+ } while ((c = lgetc(0)) != EOF && (allowed_in_string(c)));
lungetc(c);
*p = '\0';
if ((token = lookup(buf)) == STRING)
@@ -5227,8 +5636,8 @@ top:
return (token);
}
if (c == '\n') {
- yylval.lineno = lineno;
- lineno++;
+ yylval.lineno = file->lineno;
+ file->lineno++;
}
if (c == EOF)
return (0);
@@ -5236,13 +5645,84 @@ top:
}
int
-parse_rules(FILE *input, struct pfctl *xpf)
+check_file_secrecy(int fd, const char *fname)
+{
+ struct stat st;
+
+ if (fstat(fd, &st)) {
+ warn("cannot stat %s", fname);
+ return (-1);
+ }
+ if (st.st_uid != 0 && st.st_uid != getuid()) {
+ warnx("%s: owner not root or current user", fname);
+ return (-1);
+ }
+ if (st.st_mode & (S_IRWXG | S_IRWXO)) {
+ warnx("%s: group/world readable/writeable", fname);
+ return (-1);
+ }
+ return (0);
+}
+
+struct file *
+pushfile(const char *name, int secret)
+{
+ struct file *nfile;
+
+ if ((nfile = calloc(1, sizeof(struct file))) == NULL ||
+ (nfile->name = strdup(name)) == NULL) {
+ warn("malloc");
+ return (NULL);
+ }
+ if (TAILQ_FIRST(&files) == NULL && strcmp(nfile->name, "-") == 0) {
+ nfile->stream = stdin;
+ free(nfile->name);
+ if ((nfile->name = strdup("stdin")) == NULL) {
+ warn("strdup");
+ free(nfile);
+ return (NULL);
+ }
+ } else if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
+ warn("%s", nfile->name);
+ free(nfile->name);
+ free(nfile);
+ return (NULL);
+ } else if (secret &&
+ check_file_secrecy(fileno(nfile->stream), nfile->name)) {
+ fclose(nfile->stream);
+ free(nfile->name);
+ free(nfile);
+ return (NULL);
+ }
+ nfile->lineno = 1;
+ TAILQ_INSERT_TAIL(&files, nfile, entry);
+ return (nfile);
+}
+
+int
+popfile(void)
{
- struct sym *sym, *next;
+ struct file *prev;
+
+ if ((prev = TAILQ_PREV(file, files, entry)) != NULL) {
+ prev->errors += file->errors;
+ TAILQ_REMOVE(&files, file, entry);
+ fclose(file->stream);
+ free(file->name);
+ free(file);
+ file = prev;
+ return (0);
+ }
+ return (EOF);
+}
+
+int
+parse_config(char *filename, struct pfctl *xpf)
+{
+ int errors = 0;
+ struct sym *sym;
- fin = input;
pf = xpf;
- lineno = 1;
errors = 0;
rulestate = PFCTL_STATE_NONE;
returnicmpdefault = (ICMP_UNREACH << 8) | ICMP_UNREACH_PORT;
@@ -5251,34 +5731,36 @@ parse_rules(FILE *input, struct pfctl *xpf)
blockpolicy = PFRULE_DROP;
require_order = 1;
+ if ((file = pushfile(filename, 0)) == NULL) {
+ warn("cannot open the main config file!");
+ return (-1);
+ }
+
yyparse();
+ errors = file->errors;
+ popfile();
/* Free macros and check which have not been used. */
- for (sym = TAILQ_FIRST(&symhead); sym != NULL; sym = next) {
- next = TAILQ_NEXT(sym, entries);
+ while ((sym = TAILQ_FIRST(&symhead))) {
if ((pf->opts & PF_OPT_VERBOSE2) && !sym->used)
fprintf(stderr, "warning: macro '%s' not "
"used\n", sym->nam);
free(sym->nam);
free(sym->val);
- TAILQ_REMOVE(&symhead, sym, entries);
+ TAILQ_REMOVE(&symhead, sym, entry);
free(sym);
}
return (errors ? -1 : 0);
}
-/*
- * Over-designed efficiency is a French and German concept, so how about
- * we wait until they discover this ugliness and make it all fancy.
- */
int
symset(const char *nam, const char *val, int persist)
{
struct sym *sym;
for (sym = TAILQ_FIRST(&symhead); sym && strcmp(nam, sym->nam);
- sym = TAILQ_NEXT(sym, entries))
+ sym = TAILQ_NEXT(sym, entry))
; /* nothing */
if (sym != NULL) {
@@ -5287,7 +5769,7 @@ symset(const char *nam, const char *val, int persist)
else {
free(sym->nam);
free(sym->val);
- TAILQ_REMOVE(&symhead, sym, entries);
+ TAILQ_REMOVE(&symhead, sym, entry);
free(sym);
}
}
@@ -5307,7 +5789,7 @@ symset(const char *nam, const char *val, int persist)
}
sym->used = 0;
sym->persist = persist;
- TAILQ_INSERT_TAIL(&symhead, sym, entries);
+ TAILQ_INSERT_TAIL(&symhead, sym, entry);
return (0);
}
@@ -5336,7 +5818,7 @@ symget(const char *nam)
{
struct sym *sym;
- TAILQ_FOREACH(sym, &symhead, entries)
+ TAILQ_FOREACH(sym, &symhead, entry)
if (strcmp(nam, sym->nam) == 0) {
sym->used = 1;
return (sym->val);
@@ -5519,20 +6001,50 @@ parseicmpspec(char *w, sa_family_t af)
}
int
+parseport(char *port, struct range *r, int extensions)
+{
+ char *p = strchr(port, ':');
+
+ if (p == NULL) {
+ if ((r->a = getservice(port)) == -1)
+ return (-1);
+ r->b = 0;
+ r->t = PF_OP_NONE;
+ return (0);
+ }
+ if ((extensions & PPORT_STAR) && !strcmp(p+1, "*")) {
+ *p = 0;
+ if ((r->a = getservice(port)) == -1)
+ return (-1);
+ r->b = 0;
+ r->t = PF_OP_IRG;
+ return (0);
+ }
+ if ((extensions & PPORT_RANGE)) {
+ *p++ = 0;
+ if ((r->a = getservice(port)) == -1 ||
+ (r->b = getservice(p)) == -1)
+ return (-1);
+ if (r->a == r->b) {
+ r->b = 0;
+ r->t = PF_OP_NONE;
+ } else
+ r->t = PF_OP_RRG;
+ return (0);
+ }
+ return (-1);
+}
+
+int
pfctl_load_anchors(int dev, struct pfctl *pf, struct pfr_buffer *trans)
{
struct loadanchors *la;
- FILE *fin;
TAILQ_FOREACH(la, &loadanchorshead, entries) {
if (pf->opts & PF_OPT_VERBOSE)
fprintf(stderr, "\nLoading anchor %s from %s\n",
la->anchorname, la->filename);
- if ((fin = pfctl_fopen(la->filename, "r")) == NULL) {
- warn("%s", la->filename);
- continue;
- }
- if (pfctl_rules(dev, la->filename, fin, pf->opts, pf->optimize,
+ if (pfctl_rules(dev, la->filename, pf->opts, pf->optimize,
la->anchorname, trans) == -1)
return (-1);
}
diff --git a/contrib/pf/pfctl/pf_print_state.c b/contrib/pf/pfctl/pf_print_state.c
index 02a39b3..0698516 100644
--- a/contrib/pf/pfctl/pf_print_state.c
+++ b/contrib/pf/pfctl/pf_print_state.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_print_state.c,v 1.44 2007/03/01 17:20:53 deraadt Exp $ */
+/* $OpenBSD: pf_print_state.c,v 1.52 2008/08/12 16:40:18 david Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -35,7 +35,10 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/socket.h>
+#ifdef __FreeBSD__
#include <sys/endian.h>
+#define betoh64 be64toh
+#endif
#include <net/if.h>
#define TCPSTATES
#include <netinet/tcp_fsm.h>
@@ -83,6 +86,19 @@ print_addr(struct pf_addr_wrap *addr, sa_family_t af, int verbose)
else
printf("<%s>", addr->v.tblname);
return;
+ case PF_ADDR_RANGE: {
+ char buf[48];
+
+ if (inet_ntop(af, &addr->v.a.addr, buf, sizeof(buf)) == NULL)
+ printf("?");
+ else
+ printf("%s", buf);
+ if (inet_ntop(af, &addr->v.a.mask, buf, sizeof(buf)) == NULL)
+ printf(" - ?");
+ else
+ printf(" - %s", buf);
+ break;
+ }
case PF_ADDR_ADDRMASK:
if (PF_AZERO(&addr->v.a.addr, AF_INET6) &&
PF_AZERO(&addr->v.a.mask, AF_INET6))
@@ -112,7 +128,8 @@ print_addr(struct pf_addr_wrap *addr, sa_family_t af, int verbose)
}
/* mask if not _both_ address and mask are zero */
- if (!(PF_AZERO(&addr->v.a.addr, AF_INET6) &&
+ if (addr->type != PF_ADDR_RANGE &&
+ !(PF_AZERO(&addr->v.a.addr, AF_INET6) &&
PF_AZERO(&addr->v.a.mask, AF_INET6))) {
int bits = unmask(&addr->v.a.mask, af);
@@ -155,17 +172,15 @@ print_name(struct pf_addr *addr, sa_family_t af)
}
void
-print_host(struct pf_state_host *h, sa_family_t af, int opts)
+print_host(struct pf_addr *addr, u_int16_t port, sa_family_t af, int opts)
{
- u_int16_t p = ntohs(h->port);
-
if (opts & PF_OPT_USEDNS)
- print_name(&h->addr, af);
+ print_name(addr, af);
else {
struct pf_addr_wrap aw;
memset(&aw, 0, sizeof(aw));
- aw.v.a.addr = h->addr;
+ aw.v.a.addr = *addr;
if (af == AF_INET)
aw.v.a.mask.addr32[0] = 0xffffffff;
else {
@@ -175,57 +190,72 @@ print_host(struct pf_state_host *h, sa_family_t af, int opts)
print_addr(&aw, af, opts & PF_OPT_VERBOSE2);
}
- if (p) {
+ if (port) {
if (af == AF_INET)
- printf(":%u", p);
+ printf(":%u", ntohs(port));
else
- printf("[%u]", p);
+ printf("[%u]", ntohs(port));
}
}
void
-print_seq(struct pf_state_peer *p)
+print_seq(struct pfsync_state_peer *p)
{
if (p->seqdiff)
- printf("[%u + %u](+%u)", p->seqlo, p->seqhi - p->seqlo,
- p->seqdiff);
+ printf("[%u + %u](+%u)", ntohl(p->seqlo),
+ ntohl(p->seqhi) - ntohl(p->seqlo), ntohl(p->seqdiff));
else
- printf("[%u + %u]", p->seqlo, p->seqhi - p->seqlo);
+ printf("[%u + %u]", ntohl(p->seqlo),
+ ntohl(p->seqhi) - ntohl(p->seqlo));
}
void
-print_state(struct pf_state *s, int opts)
+print_state(struct pfsync_state *s, int opts)
{
- struct pf_state_peer *src, *dst;
+ struct pfsync_state_peer *src, *dst;
+ struct pfsync_state_key *sk, *nk;
struct protoent *p;
int min, sec;
if (s->direction == PF_OUT) {
src = &s->src;
dst = &s->dst;
+ sk = &s->key[PF_SK_STACK];
+ nk = &s->key[PF_SK_WIRE];
+ if (s->proto == IPPROTO_ICMP || s->proto == IPPROTO_ICMPV6)
+ sk->port[0] = nk->port[0];
} else {
src = &s->dst;
dst = &s->src;
+ sk = &s->key[PF_SK_WIRE];
+ nk = &s->key[PF_SK_STACK];
+ if (s->proto == IPPROTO_ICMP || s->proto == IPPROTO_ICMPV6)
+ sk->port[1] = nk->port[1];
}
- printf("%s ", s->u.ifname);
+ printf("%s ", s->ifname);
if ((p = getprotobynumber(s->proto)) != NULL)
printf("%s ", p->p_name);
else
printf("%u ", s->proto);
- if (PF_ANEQ(&s->lan.addr, &s->gwy.addr, s->af) ||
- (s->lan.port != s->gwy.port)) {
- print_host(&s->lan, s->af, opts);
- if (s->direction == PF_OUT)
- printf(" -> ");
- else
- printf(" <- ");
+
+ print_host(&nk->addr[1], nk->port[1], s->af, opts);
+ if (PF_ANEQ(&nk->addr[1], &sk->addr[1], s->af) ||
+ nk->port[1] != sk->port[1]) {
+ printf(" (");
+ print_host(&sk->addr[1], sk->port[1], s->af, opts);
+ printf(")");
}
- print_host(&s->gwy, s->af, opts);
if (s->direction == PF_OUT)
printf(" -> ");
else
printf(" <- ");
- print_host(&s->ext, s->af, opts);
+ print_host(&nk->addr[0], nk->port[0], s->af, opts);
+ if (PF_ANEQ(&nk->addr[0], &sk->addr[0], s->af) ||
+ nk->port[0] != sk->port[0]) {
+ printf(" (");
+ print_host(&sk->addr[0], sk->port[0], s->af, opts);
+ printf(")");
+ }
printf(" ");
if (s->proto == IPPROTO_TCP) {
@@ -271,45 +301,63 @@ print_state(struct pf_state *s, int opts)
}
if (opts & PF_OPT_VERBOSE) {
- sec = s->creation % 60;
- s->creation /= 60;
- min = s->creation % 60;
- s->creation /= 60;
- printf(" age %.2u:%.2u:%.2u", s->creation, min, sec);
- sec = s->expire % 60;
- s->expire /= 60;
- min = s->expire % 60;
- s->expire /= 60;
- printf(", expires in %.2u:%.2u:%.2u", s->expire, min, sec);
+ u_int64_t packets[2];
+ u_int64_t bytes[2];
+ u_int32_t creation = ntohl(s->creation);
+ u_int32_t expire = ntohl(s->expire);
+
+ sec = creation % 60;
+ creation /= 60;
+ min = creation % 60;
+ creation /= 60;
+ printf(" age %.2u:%.2u:%.2u", creation, min, sec);
+ sec = expire % 60;
+ expire /= 60;
+ min = expire % 60;
+ expire /= 60;
+ printf(", expires in %.2u:%.2u:%.2u", expire, min, sec);
+
+ bcopy(s->packets[0], &packets[0], sizeof(u_int64_t));
+ bcopy(s->packets[1], &packets[1], sizeof(u_int64_t));
+ bcopy(s->bytes[0], &bytes[0], sizeof(u_int64_t));
+ bcopy(s->bytes[1], &bytes[1], sizeof(u_int64_t));
printf(", %llu:%llu pkts, %llu:%llu bytes",
#ifdef __FreeBSD__
- (unsigned long long)s->packets[0],
- (unsigned long long)s->packets[1],
- (unsigned long long)s->bytes[0],
- (unsigned long long)s->bytes[1]);
+ (unsigned long long)betoh64(packets[0]),
+ (unsigned long long)betoh64(packets[1]),
+ (unsigned long long)betoh64(bytes[0]),
+ (unsigned long long)betoh64(bytes[1]));
#else
- s->packets[0], s->packets[1], s->bytes[0], s->bytes[1]);
+ betoh64(packets[0]),
+ betoh64(packets[1]),
+ betoh64(bytes[0]),
+ betoh64(bytes[1]));
#endif
- if (s->anchor.nr != -1)
- printf(", anchor %u", s->anchor.nr);
- if (s->rule.nr != -1)
- printf(", rule %u", s->rule.nr);
+ if (ntohl(s->anchor) != -1)
+ printf(", anchor %u", ntohl(s->anchor));
+ if (ntohl(s->rule) != -1)
+ printf(", rule %u", ntohl(s->rule));
if (s->state_flags & PFSTATE_SLOPPY)
printf(", sloppy");
- if (s->src_node != NULL)
+ if (s->state_flags & PFSTATE_PFLOW)
+ printf(", pflow");
+ if (s->sync_flags & PFSYNC_FLAG_SRCNODE)
printf(", source-track");
- if (s->nat_src_node != NULL)
+ if (s->sync_flags & PFSYNC_FLAG_NATSRCNODE)
printf(", sticky-address");
printf("\n");
}
if (opts & PF_OPT_VERBOSE2) {
- printf(" id: %016llx creatorid: %08x%s\n",
+ u_int64_t id;
+
+ bcopy(&s->id, &id, sizeof(u_int64_t));
+ printf(" id: %016llx creatorid: %08x",
#ifdef __FreeBSD__
- (unsigned long long)be64toh(s->id), ntohl(s->creatorid),
+ (unsigned long long)betoh64(id), ntohl(s->creatorid));
#else
- betoh64(s->id), ntohl(s->creatorid),
+ betoh64(id), ntohl(s->creatorid));
#endif
- ((s->sync_flags & PFSTATE_NOSYNC) ? " (no-sync)" : ""));
+ printf("\n");
}
}
diff --git a/contrib/pf/pfctl/pfctl.8 b/contrib/pf/pfctl/pfctl.8
index 917a859..0730443 100644
--- a/contrib/pf/pfctl/pfctl.8
+++ b/contrib/pf/pfctl/pfctl.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: pfctl.8,v 1.128 2007/01/30 21:01:56 jmc Exp $
+.\" $OpenBSD: pfctl.8,v 1.138 2008/06/10 20:55:02 mcbride Exp $
.\"
.\" Copyright (c) 2001 Kjell Wooding. All rights reserved.
.\"
@@ -26,12 +26,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 13, 2011
+.Dd June 21, 2011
.Dt PFCTL 8
.Os
.Sh NAME
.Nm pfctl
-.Nd "control the packet filter (PF) and network address translation (NAT) device"
+.Nd control the packet filter (PF) device
.Sh SYNOPSIS
.Nm pfctl
.Bk -words
@@ -43,15 +43,18 @@
.Op Fl f Ar file
.Op Fl i Ar interface
.Op Fl K Ar host | network
-.Op Fl k Ar host | network
-.Op Fl o Op Ar level
+.Xo
+.Oo Fl k
+.Ar host | network | label | id
+.Oc Xc
+.Op Fl o Ar level
.Op Fl p Ar device
.Op Fl s Ar modifier
-.Oo
-.Fl t Ar table
+.Xo
+.Oo Fl t Ar table
.Fl T Ar command
-.Op Ar address ...
-.Oc
+.Op Ar address ... Oc
+.Xc
.Op Fl x Ar level
.Ek
.Sh DESCRIPTION
@@ -85,7 +88,7 @@ When the variable
is set to
.Dv YES
in
-.Xr rc.conf.local 5 ,
+.Xr rc.conf.local 8 ,
the rule file specified with the variable
.Va pf_rules
is loaded automatically by the
@@ -211,7 +214,7 @@ Flush the NAT rules.
Flush the queue rules.
.It Fl F Cm rules
Flush the filter rules.
-.It Fl F Cm state
+.It Fl F Cm states
Flush the state table (NAT and filter).
.It Fl F Cm Sources
Flush the source tracking table.
@@ -251,22 +254,28 @@ or
.Fl K Ar network
option may be specified, which will kill all the source tracking
entries from the first host/network to the second.
-.It Fl k Ar host | network
-Kill all of the state entries originating from the specified
-.Ar host
+.It Xo
+.Fl k
+.Ar host | network | label | id
+.Xc
+Kill all of the state entries matching the specified
+.Ar host ,
+.Ar network ,
+.Ar label ,
or
-.Ar network .
+.Ar id .
+.Pp
+For example, to kill all of the state entries originating from
+.Dq host :
+.Pp
+.Dl # pfctl -k host
+.Pp
A second
.Fl k Ar host
or
.Fl k Ar network
option may be specified, which will kill all the state entries
from the first host/network to the second.
-For example, to kill all of the state entries originating from
-.Dq host :
-.Pp
-.Dl # pfctl -k host
-.Pp
To kill all of the state entries from
.Dq host1
to
@@ -283,6 +292,32 @@ To kill all states with the target
.Dq host2 :
.Pp
.Dl # pfctl -k 0.0.0.0/0 -k host2
+.Pp
+It is also possible to kill states by rule label or state ID.
+In this mode the first
+.Fl k
+argument is used to specify the type
+of the second argument.
+The following command would kill all states that have been created
+from rules carrying the label
+.Dq foobar :
+.Pp
+.Dl # pfctl -k label -k foobar
+.Pp
+To kill one specific state by its unique state ID
+(as shown by pfctl -s state -vv),
+use the
+.Ar id
+modifier and as a second argument the state ID and optional creator ID.
+To kill a state with ID 4823e84500000003 use:
+.Pp
+.Dl # pfctl -k id -k 4823e84500000003
+.Pp
+To kill a state with ID 4823e84500000018 created from a backup
+firewall with hostid 00000002 use:
+.Pp
+.Dl # pfctl -k id -k 4823e84500000018/2
+.Pp
.It Fl m
Merge in explicitly given options without resetting those
which are omitted.
@@ -298,58 +333,20 @@ Do not actually load rules, just parse them.
.It Fl O
Load only the options present in the rule file.
Other rules and options are ignored.
-.It Fl o Op Ar level
-Control the ruleset optimizer.
-The ruleset optimizer attempts to improve rulesets by removing rule
-duplication and making better use of rule ordering.
+.It Fl o Ar level
+Control the ruleset optimizer, overriding any rule file settings.
.Pp
.Bl -tag -width xxxxxxxxxxxx -compact
.It Fl o Cm none
Disable the ruleset optimizer.
.It Fl o Cm basic
Enable basic ruleset optimizations.
+This is the default behaviour.
.It Fl o Cm profile
Enable basic ruleset optimizations with profiling.
.El
-.Pp
-.Cm basic
-optimization does does four things:
-.Pp
-.Bl -enum -compact
-.It
-remove duplicate rules
-.It
-remove rules that are a subset of another rule
-.It
-combine multiple rules into a table when advantageous
-.It
-re-order the rules to improve evaluation performance
-.El
-.Pp
-If
-.Cm profile
-is specified, the currently loaded ruleset will be examined as a feedback
-profile to tailor the optimization of the
-.Ar quick
-rules to the actual network behavior.
-.Pp
-It is important to note that the ruleset optimizer will modify the ruleset
-to improve performance.
-A side effect of the ruleset modification is that per-rule accounting
-statistics will have different meanings than before.
-If per-rule accounting is important for billing purposes or whatnot, either
-the ruleset optimizer should not be used or a
-.Ar label
-field should be added to all of the accounting rules to act as optimization
-barriers.
-.Pp
-To retain compatibility with previous behaviour, a single
-.Fl o
-without any options will enable
-.Cm basic
-optimizations, and a second
-.Fl o
-will enable profiling.
+For further information on the ruleset optimizer, see
+.Xr pf.conf 5 .
.It Fl P
Do not perform service name lookup for port specific rules,
instead display the ports numerically.
@@ -407,7 +404,7 @@ If
.Fl v
is specified, all anchors attached under the target anchor will be
displayed recursively.
-.It Fl s Cm state
+.It Fl s Cm states
Show the contents of the state table.
.It Fl s Cm Sources
Show the contents of the source tracking table.
@@ -418,7 +415,7 @@ When used together with
source tracking statistics are also shown.
.It Fl s Cm labels
Show per-rule statistics (label, evaluations, packets total, bytes total,
-packets in, bytes in, packets out, bytes out) of
+packets in, bytes in, packets out, bytes out, state creations) of
filter rules with labels, useful for accounting.
.It Fl s Cm timeouts
Show the current global timeouts.
@@ -529,7 +526,7 @@ attributes.
The address/network has been cleared (statistics).
.El
.Pp
-Each table maintains a set of counters that can be retrieved using the
+Each table can maintain a set of counters that can be retrieved using the
.Fl v
flag of
.Nm .
@@ -540,7 +537,7 @@ FTP server.
The following commands configure the firewall and send 10 pings to the FTP
server:
.Bd -literal -offset indent
-# printf "table <test> { ftp.openbsd.org }\en \e
+# printf "table <test> counters { ftp.openbsd.org }\en \e
pass out to <test>\en" | pfctl -f-
# ping -qc10 ftp.openbsd.org
.Ed
@@ -574,7 +571,7 @@ the number of rules which reference the table, and the global
packet statistics for the whole table:
.Bd -literal -offset indent
# pfctl -vvsTables
---a-r- test
+--a-r-C test
Addresses: 1
Cleared: Thu Feb 13 18:55:18 2003
References: [ Anchors: 0 Rules: 1 ]
@@ -634,6 +631,8 @@ For tables which are referenced (used) by rules.
.It h
This flag is set when a table in the main ruleset is hidden by one or more
tables of the same name from anchors attached below it.
+.It C
+This flag is set when per-address counters are enabled on the table.
.El
.It Fl t Ar table
Specify the name of the table.
diff --git a/contrib/pf/pfctl/pfctl.c b/contrib/pf/pfctl/pfctl.c
index e76261b..8b07a2b 100644
--- a/contrib/pf/pfctl/pfctl.c
+++ b/contrib/pf/pfctl/pfctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl.c,v 1.262 2007/03/01 17:20:53 deraadt Exp $ */
+/* $OpenBSD: pfctl.c,v 1.278 2008/08/31 20:18:17 jmc Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -39,6 +39,10 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <sys/stat.h>
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+#endif
+
#include <net/if.h>
#include <netinet/in.h>
#include <net/pfvar.h>
@@ -59,10 +63,6 @@ __FBSDID("$FreeBSD$");
#include "pfctl_parser.h"
#include "pfctl.h"
-#ifdef __FreeBSD__
-#define HTONL(x) (x) = htonl((__uint32_t)(x))
-#endif
-
void usage(void);
int pfctl_enable(int, int);
int pfctl_disable(int, int);
@@ -75,7 +75,9 @@ int pfctl_clear_src_nodes(int, int);
int pfctl_clear_states(int, const char *, int);
void pfctl_addrprefix(char *, struct pf_addr *);
int pfctl_kill_src_nodes(int, const char *, int);
-int pfctl_kill_states(int, const char *, int);
+int pfctl_net_kill_states(int, const char *, int);
+int pfctl_label_kill_states(int, const char *, int);
+int pfctl_id_kill_states(int, const char *, int);
void pfctl_init_options(struct pfctl *);
int pfctl_load_options(struct pfctl *);
int pfctl_load_limit(struct pfctl *, unsigned int, unsigned int);
@@ -126,8 +128,6 @@ int dev = -1;
int first_title = 1;
int labels = 0;
-const char *infile;
-
#define INDENT(d, o) do { \
if (o) { \
int i; \
@@ -208,11 +208,11 @@ static const struct {
static const char *clearopt_list[] = {
"nat", "queue", "rules", "Sources",
- "state", "info", "Tables", "osfp", "all", NULL
+ "states", "info", "Tables", "osfp", "all", NULL
};
static const char *showopt_list[] = {
- "nat", "queue", "rules", "Anchors", "Sources", "state", "info",
+ "nat", "queue", "rules", "Anchors", "Sources", "states", "info",
"Interfaces", "labels", "timeouts", "memory", "Tables", "osfp",
"all", NULL
};
@@ -227,7 +227,7 @@ static const char *debugopt_list[] = {
};
static const char *optiopt_list[] = {
- "o", "none", "basic", "profile", NULL
+ "none", "basic", "profile", NULL
};
void
@@ -237,10 +237,11 @@ usage(void)
fprintf(stderr, "usage: %s [-AdeghmNnOPqRrvz] ", __progname);
fprintf(stderr, "[-a anchor] [-D macro=value] [-F modifier]\n");
- fprintf(stderr, "\t[-f file] [-i interface] [-K host | network] ");
- fprintf(stderr, "[-k host | network ]\n");
- fprintf(stderr, "\t[-o [level]] [-p device] [-s modifier ]\n");
- fprintf(stderr, "\t[-t table -T command [address ...]] [-x level]\n");
+ fprintf(stderr, "\t[-f file] [-i interface] [-K host | network]\n");
+ fprintf(stderr, "\t[-k host | network | label | id] ");
+ fprintf(stderr, "[-o level] [-p device]\n");
+ fprintf(stderr, "\t[-s modifier] ");
+ fprintf(stderr, "[-t table -T command [address ...]] [-x level]\n");
exit(1);
}
@@ -389,7 +390,7 @@ pfctl_clear_states(int dev, const char *iface, int opts)
if (ioctl(dev, DIOCCLRSTATES, &psk))
err(1, "DIOCCLRSTATES");
if ((opts & PF_OPT_QUIET) == 0)
- fprintf(stderr, "%d states cleared\n", psk.psk_af);
+ fprintf(stderr, "%d states cleared\n", psk.psk_killed);
return (0);
}
@@ -528,17 +529,13 @@ pfctl_kill_src_nodes(int dev, const char *iface, int opts)
if (ioctl(dev, DIOCKILLSRCNODES, &psnk))
err(1, "DIOCKILLSRCNODES");
- killed += psnk.psnk_af;
- /* fixup psnk.psnk_af */
- psnk.psnk_af = resp[1]->ai_family;
+ killed += psnk.psnk_killed;
}
freeaddrinfo(res[1]);
} else {
if (ioctl(dev, DIOCKILLSRCNODES, &psnk))
err(1, "DIOCKILLSRCNODES");
- killed += psnk.psnk_af;
- /* fixup psnk.psnk_af */
- psnk.psnk_af = res[0]->ai_family;
+ killed += psnk.psnk_killed;
}
}
@@ -551,7 +548,7 @@ pfctl_kill_src_nodes(int dev, const char *iface, int opts)
}
int
-pfctl_kill_states(int dev, const char *iface, int opts)
+pfctl_net_kill_states(int dev, const char *iface, int opts)
{
struct pfioc_state_kill psk;
struct addrinfo *res[2], *resp[2];
@@ -638,17 +635,13 @@ pfctl_kill_states(int dev, const char *iface, int opts)
if (ioctl(dev, DIOCKILLSTATES, &psk))
err(1, "DIOCKILLSTATES");
- killed += psk.psk_af;
- /* fixup psk.psk_af */
- psk.psk_af = resp[1]->ai_family;
+ killed += psk.psk_killed;
}
freeaddrinfo(res[1]);
} else {
if (ioctl(dev, DIOCKILLSTATES, &psk))
err(1, "DIOCKILLSTATES");
- killed += psk.psk_af;
- /* fixup psk.psk_af */
- psk.psk_af = res[0]->ai_family;
+ killed += psk.psk_killed;
}
}
@@ -661,6 +654,68 @@ pfctl_kill_states(int dev, const char *iface, int opts)
}
int
+pfctl_label_kill_states(int dev, const char *iface, int opts)
+{
+ struct pfioc_state_kill psk;
+
+ if (state_killers != 2 || (strlen(state_kill[1]) == 0)) {
+ warnx("no label specified");
+ usage();
+ }
+ memset(&psk, 0, sizeof(psk));
+ if (iface != NULL && strlcpy(psk.psk_ifname, iface,
+ sizeof(psk.psk_ifname)) >= sizeof(psk.psk_ifname))
+ errx(1, "invalid interface: %s", iface);
+
+ if (strlcpy(psk.psk_label, state_kill[1], sizeof(psk.psk_label)) >=
+ sizeof(psk.psk_label))
+ errx(1, "label too long: %s", state_kill[1]);
+
+ if (ioctl(dev, DIOCKILLSTATES, &psk))
+ err(1, "DIOCKILLSTATES");
+
+ if ((opts & PF_OPT_QUIET) == 0)
+ fprintf(stderr, "killed %d states\n", psk.psk_killed);
+
+ return (0);
+}
+
+int
+pfctl_id_kill_states(int dev, const char *iface, int opts)
+{
+ struct pfioc_state_kill psk;
+
+ if (state_killers != 2 || (strlen(state_kill[1]) == 0)) {
+ warnx("no id specified");
+ usage();
+ }
+
+ memset(&psk, 0, sizeof(psk));
+ if ((sscanf(state_kill[1], "%jx/%x",
+ &psk.psk_pfcmp.id, &psk.psk_pfcmp.creatorid)) == 2)
+ HTONL(psk.psk_pfcmp.creatorid);
+ else if ((sscanf(state_kill[1], "%jx", &psk.psk_pfcmp.id)) == 1) {
+ psk.psk_pfcmp.creatorid = 0;
+ } else {
+ warnx("wrong id format specified");
+ usage();
+ }
+ if (psk.psk_pfcmp.id == 0) {
+ warnx("cannot kill id 0");
+ usage();
+ }
+
+ psk.psk_pfcmp.id = htobe64(psk.psk_pfcmp.id);
+ if (ioctl(dev, DIOCKILLSTATES, &psk))
+ err(1, "DIOCKILLSTATES");
+
+ if ((opts & PF_OPT_QUIET) == 0)
+ fprintf(stderr, "killed %d states\n", psk.psk_killed);
+
+ return (0);
+}
+
+int
pfctl_get_pool(int dev, struct pf_pool *pool, u_int32_t nr,
u_int32_t ticket, int r_action, char *anchorname)
{
@@ -747,10 +802,12 @@ pfctl_print_rule_counters(struct pf_rule *rule, int opts)
(unsigned long long)(rule->packets[0] +
rule->packets[1]),
(unsigned long long)(rule->bytes[0] +
- rule->bytes[1]), rule->states);
+ rule->bytes[1]), rule->states_cur);
if (!(opts & PF_OPT_DEBUG))
- printf(" [ Inserted: uid %u pid %u ]\n",
- (unsigned)rule->cuid, (unsigned)rule->cpid);
+ printf(" [ Inserted: uid %u pid %u "
+ "State Creations: %-6u]\n",
+ (unsigned)rule->cuid, (unsigned)rule->cpid,
+ rule->states_tot);
}
}
@@ -818,19 +875,6 @@ pfctl_show_rules(int dev, char *path, int opts, enum pfctl_show format,
switch (format) {
case PFCTL_SHOW_LABELS:
- if (pr.rule.label[0]) {
- printf("%s ", pr.rule.label);
- printf("%llu %llu %llu %llu %llu %llu %llu\n",
- (unsigned long long)pr.rule.evaluations,
- (unsigned long long)(pr.rule.packets[0] +
- pr.rule.packets[1]),
- (unsigned long long)(pr.rule.bytes[0] +
- pr.rule.bytes[1]),
- (unsigned long long)pr.rule.packets[0],
- (unsigned long long)pr.rule.bytes[0],
- (unsigned long long)pr.rule.packets[1],
- (unsigned long long)pr.rule.bytes[1]);
- }
break;
case PFCTL_SHOW_RULES:
if (pr.rule.label[0] && (opts & PF_OPT_SHOWALL))
@@ -864,8 +908,9 @@ pfctl_show_rules(int dev, char *path, int opts, enum pfctl_show format,
switch (format) {
case PFCTL_SHOW_LABELS:
if (pr.rule.label[0]) {
- printf("%s ", pr.rule.label);
- printf("%llu %llu %llu %llu %llu %llu %llu\n",
+ printf("%s %llu %llu %llu %llu"
+ " %llu %llu %llu %llu\n",
+ pr.rule.label,
(unsigned long long)pr.rule.evaluations,
(unsigned long long)(pr.rule.packets[0] +
pr.rule.packets[1]),
@@ -874,7 +919,8 @@ pfctl_show_rules(int dev, char *path, int opts, enum pfctl_show format,
(unsigned long long)pr.rule.packets[0],
(unsigned long long)pr.rule.bytes[0],
(unsigned long long)pr.rule.packets[1],
- (unsigned long long)pr.rule.bytes[1]);
+ (unsigned long long)pr.rule.bytes[1],
+ (unsigned long long)pr.rule.states_tot);
}
break;
case PFCTL_SHOW_RULES:
@@ -967,7 +1013,7 @@ pfctl_show_src_nodes(int dev, int opts)
struct pfioc_src_nodes psn;
struct pf_src_node *p;
char *inbuf = NULL, *newinbuf = NULL;
- unsigned len = 0;
+ unsigned int len = 0;
int i;
memset(&psn, 0, sizeof(psn));
@@ -1010,9 +1056,9 @@ int
pfctl_show_states(int dev, const char *iface, int opts)
{
struct pfioc_states ps;
- struct pf_state *p;
+ struct pfsync_state *p;
char *inbuf = NULL, *newinbuf = NULL;
- unsigned len = 0;
+ unsigned int len = 0;
int i, dotitle = (opts & PF_OPT_SHOWALL);
memset(&ps, 0, sizeof(ps));
@@ -1041,7 +1087,7 @@ pfctl_show_states(int dev, const char *iface, int opts)
}
p = ps.ps_states;
for (i = 0; i < ps.ps_len; i += sizeof(*p), p++) {
- if (iface != NULL && strcmp(p->u.ifname, iface))
+ if (iface != NULL && strcmp(p->ifname, iface))
continue;
if (dotitle) {
pfctl_print_title("STATES:");
@@ -1163,7 +1209,7 @@ pfctl_add_rule(struct pfctl *pf, struct pf_rule *r, const char *anchor_call)
r->anchor->ruleset.anchor = r->anchor;
if (strlcpy(r->anchor->path, anchor_call,
sizeof(rule->anchor->path)) >= sizeof(rule->anchor->path))
- errx(1, "pfctl_add_rule: strlcpy");
+ errx(1, "pfctl_add_rule: strlcpy");
if ((p = strrchr(anchor_call, '/')) != NULL) {
if (!strlen(p))
err(1, "pfctl_add_rule: bad anchor name %s",
@@ -1172,7 +1218,7 @@ pfctl_add_rule(struct pfctl *pf, struct pf_rule *r, const char *anchor_call)
p = (char *)anchor_call;
if (strlcpy(r->anchor->name, p,
sizeof(rule->anchor->name)) >= sizeof(rule->anchor->name))
- errx(1, "pfctl_add_rule: strlcpy");
+ errx(1, "pfctl_add_rule: strlcpy");
}
if ((rule = calloc(1, sizeof(*rule))) == NULL)
@@ -1197,7 +1243,7 @@ pfctl_ruleset_trans(struct pfctl *pf, char *path, struct pf_anchor *a)
return (1);
}
if (a == pf->astack[0] && ((altqsupport &&
- (pf->loadopt & PFCTL_FLAG_ALTQ) != 0))) {
+ (pf->loadopt & PFCTL_FLAG_ALTQ) != 0))) {
if (pfctl_add_trans(pf->trans, PF_RULESET_ALTQ, path))
return (2);
}
@@ -1350,7 +1396,7 @@ pfctl_add_altq(struct pfctl *pf, struct pf_altq *a)
}
int
-pfctl_rules(int dev, char *filename, FILE *fin, int opts, int optimize,
+pfctl_rules(int dev, char *filename, int opts, int optimize,
char *anchorname, struct pfr_buffer *trans)
{
#define ERR(x) do { warn(x); goto _error; } while(0)
@@ -1386,7 +1432,6 @@ pfctl_rules(int dev, char *filename, FILE *fin, int opts, int optimize,
if (strlcpy(trs.pfrt_anchor, anchorname,
sizeof(trs.pfrt_anchor)) >= sizeof(trs.pfrt_anchor))
ERRX("pfctl_rules: strlcpy");
- infile = filename;
pf.dev = dev;
pf.opts = opts;
pf.optimize = optimize;
@@ -1430,7 +1475,7 @@ pfctl_rules(int dev, char *filename, FILE *fin, int opts, int optimize,
pfctl_get_ticket(t, PF_RULESET_TABLE, anchorname);
}
- if (parse_rules(fin, &pf) < 0) {
+ if (parse_config(filename, &pf) < 0) {
if ((opts & PF_OPT_NOACTION) == 0)
ERRX("Syntax error in config file: "
"pf rules not loaded");
@@ -1456,11 +1501,6 @@ pfctl_rules(int dev, char *filename, FILE *fin, int opts, int optimize,
if (check_commit_altq(dev, opts) != 0)
ERRX("errors in altq config");
- if (fin != stdin) {
- fclose(fin);
- fin = NULL;
- }
-
/* process "load anchor" directives */
if (!anchorname[0])
if (pfctl_load_anchors(dev, &pf, t) == -1)
@@ -1482,8 +1522,6 @@ _error:
err(1, "DIOCXROLLBACK");
exit(1);
} else { /* sub ruleset */
- if (fin != NULL && fin != stdin)
- fclose(fin);
return (-1);
}
@@ -1515,7 +1553,8 @@ pfctl_fopen(const char *name, const char *mode)
void
pfctl_init_options(struct pfctl *pf)
{
- int mib[2], mem;
+ int64_t mem;
+ int mib[2];
size_t size;
pf->timeout[PFTM_TCP_FIRST_PACKET] = PFTM_TCP_FIRST_PACKET_VAL;
@@ -1546,9 +1585,14 @@ pfctl_init_options(struct pfctl *pf)
pf->limit[PF_LIMIT_TABLE_ENTRIES] = PFR_KENTRY_HIWAT;
mib[0] = CTL_HW;
+#ifdef __FreeBSD__
mib[1] = HW_PHYSMEM;
+#else
+ mib[1] = HW_PHYSMEM64;
+#endif
size = sizeof(mem);
- (void) sysctl(mib, 2, &mem, &size, NULL, 0);
+ if (sysctl(mib, 2, &mem, &size, NULL, 0) == -1)
+ err(1, "sysctl");
if (mem <= 100*1024*1024)
pf->limit[PF_LIMIT_TABLE_ENTRIES] = PFR_KENTRY_HIWAT_SMALL;
@@ -1572,7 +1616,7 @@ pfctl_load_options(struct pfctl *pf)
}
/*
- * If we've set the limit, but havn't explicitly set adaptive
+ * If we've set the limit, but haven't explicitly set adaptive
* timeouts, do it now with a start of 60% and end of 120%.
*/
if (pf->limit_set[PF_LIMIT_STATES] &&
@@ -1897,9 +1941,6 @@ pfctl_debug(int dev, u_int32_t level, int opts)
int
pfctl_test_altqsupport(int dev, int opts)
{
-#if defined(__FreeBSD__) && !defined(ENABLE_ALTQ)
- return (0);
-#else
struct pfioc_altq pa;
if (ioctl(dev, DIOCGETALTQS, &pa)) {
@@ -1912,7 +1953,6 @@ pfctl_test_altqsupport(int dev, int opts)
err(1, "DIOCGETALTQS");
}
return (1);
-#endif
}
int
@@ -1971,16 +2011,15 @@ main(int argc, char *argv[])
int ch;
int mode = O_RDONLY;
int opts = 0;
- int optimize = 0;
+ int optimize = PF_OPTIMIZE_BASIC;
char anchorname[MAXPATHLEN];
char *path;
- FILE *fin = NULL;
if (argc < 2)
usage();
while ((ch = getopt(argc, argv,
- "a:AdD:eqf:F:ghi:k:K:mnNOo::Pp:rRs:t:T:vx:z")) != -1) {
+ "a:AdD:eqf:F:ghi:k:K:mnNOo:Pp:rRs:t:T:vx:z")) != -1) {
switch (ch) {
case 'a':
anchoropt = optarg;
@@ -2056,24 +2095,11 @@ main(int argc, char *argv[])
loadopt |= PFCTL_FLAG_FILTER;
break;
case 'o':
- if (optarg) {
- optiopt = pfctl_lookup_option(optarg,
- optiopt_list);
- if (optiopt == NULL) {
- warnx("Unknown optimization '%s'",
- optarg);
- usage();
- }
- }
- if (opts & PF_OPT_OPTIMIZE) {
- if (optiopt != NULL) {
- warnx("Cannot specify -o multiple times"
- "with optimizer level");
- usage();
- }
- optimize |= PF_OPTIMIZE_PROFILE;
+ optiopt = pfctl_lookup_option(optarg, optiopt_list);
+ if (optiopt == NULL) {
+ warnx("Unknown optimization '%s'", optarg);
+ usage();
}
- optimize |= PF_OPTIMIZE_BASIC;
opts |= PF_OPT_OPTIMIZE;
break;
case 'O':
@@ -2303,8 +2329,14 @@ main(int argc, char *argv[])
break;
}
}
- if (state_killers)
- pfctl_kill_states(dev, ifaceopt, opts);
+ if (state_killers) {
+ if (!strcmp(state_kill[0], "label"))
+ pfctl_label_kill_states(dev, ifaceopt, opts);
+ else if (!strcmp(state_kill[0], "id"))
+ pfctl_id_kill_states(dev, ifaceopt, opts);
+ else
+ pfctl_net_kill_states(dev, ifaceopt, opts);
+ }
if (src_node_killers)
pfctl_kill_src_nodes(dev, ifaceopt, opts);
@@ -2329,15 +2361,6 @@ main(int argc, char *argv[])
}
}
- if (rulesopt != NULL) {
- if (strcmp(rulesopt, "-") == 0) {
- fin = stdin;
- rulesopt = "stdin";
- } else {
- if ((fin = pfctl_fopen(rulesopt, "r")) == NULL)
- err(1, "%s", rulesopt);
- }
- }
if ((rulesopt != NULL) && (loadopt & PFCTL_FLAG_OPTION) &&
!anchorname[0])
if (pfctl_clear_interface_flags(dev, opts | PF_OPT_QUIET))
@@ -2352,7 +2375,7 @@ main(int argc, char *argv[])
if (anchorname[0] == '_' || strstr(anchorname, "/_") != NULL)
errx(1, "anchor names beginning with '_' cannot "
"be modified from the command line");
- if (pfctl_rules(dev, rulesopt, fin, opts, optimize,
+ if (pfctl_rules(dev, rulesopt, opts, optimize,
anchorname, NULL))
error = 1;
else if (!(opts & PF_OPT_NOACTION) &&
diff --git a/contrib/pf/pfctl/pfctl.h b/contrib/pf/pfctl/pfctl.h
index 98a1bef..2c69bc2 100644
--- a/contrib/pf/pfctl/pfctl.h
+++ b/contrib/pf/pfctl/pfctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl.h,v 1.40 2007/02/09 11:25:27 henning Exp $ */
+/* $OpenBSD: pfctl.h,v 1.42 2007/12/05 12:01:47 chl Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -49,7 +49,6 @@ struct pfr_buffer {
(var) != NULL; \
(var) = pfr_buf_next((buf), (var)))
-void pfr_set_fd(int);
int pfr_get_fd(void);
int pfr_clr_tables(struct pfr_table *, int *, int);
int pfr_add_tables(struct pfr_table *, int, int *, int);
@@ -64,9 +63,7 @@ int pfr_set_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
int *, int *, int *, int);
int pfr_get_addrs(struct pfr_table *, struct pfr_addr *, int *, int);
int pfr_get_astats(struct pfr_table *, struct pfr_astats *, int *, int);
-int pfr_clr_astats(struct pfr_table *, struct pfr_addr *, int, int *, int);
int pfr_tst_addrs(struct pfr_table *, struct pfr_addr *, int, int *, int);
-int pfr_set_tflags(struct pfr_table *, int, int, int, int *, int *, int);
int pfr_ina_define(struct pfr_table *, struct pfr_addr *, int, int *,
int *, int, int);
void pfr_buf_clear(struct pfr_buffer *);
@@ -91,6 +88,8 @@ FILE *pfctl_fopen(const char *, const char *);
#ifdef __FreeBSD__
extern int altqsupport;
+extern int dummynetsupport;
+#define HTONL(x) (x) = htonl((__uint32_t)(x))
#endif
#ifndef DEFAULT_PRIORITY
@@ -117,9 +116,9 @@ struct pf_altq *pfaltq_lookup(const char *);
char *rate2str(double);
void print_addr(struct pf_addr_wrap *, sa_family_t, int);
-void print_host(struct pf_state_host *, sa_family_t, int);
-void print_seq(struct pf_state_peer *);
-void print_state(struct pf_state *, int);
+void print_host(struct pf_addr *, u_int16_t p, sa_family_t, int);
+void print_seq(struct pfsync_state_peer *);
+void print_state(struct pfsync_state *, int);
int unmask(struct pf_addr *, sa_family_t);
int pfctl_cmdline_symset(char *);
diff --git a/contrib/pf/pfctl/pfctl_altq.c b/contrib/pf/pfctl/pfctl_altq.c
index b90e7c6..40e11d5 100644
--- a/contrib/pf/pfctl/pfctl_altq.c
+++ b/contrib/pf/pfctl/pfctl_altq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl_altq.c,v 1.91 2006/11/28 00:08:50 henning Exp $ */
+/* $OpenBSD: pfctl_altq.c,v 1.93 2007/10/15 02:16:35 deraadt Exp $ */
/*
* Copyright (c) 2002
@@ -21,7 +21,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
+#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -78,7 +78,7 @@ static int gsc_add_seg(struct gen_sc *, double, double, double,
static double sc_x2y(struct service_curve *, double);
#ifdef __FreeBSD__
-u_int32_t getifspeed(int, char *);
+u_int32_t getifspeed(int, char *);
#else
u_int32_t getifspeed(char *);
#endif
@@ -145,8 +145,8 @@ qname_to_qid(const char *qname)
}
void
-print_altq(const struct pf_altq *a, unsigned level, struct node_queue_bw *bw,
- struct node_queue_opt *qopts)
+print_altq(const struct pf_altq *a, unsigned int level,
+ struct node_queue_bw *bw, struct node_queue_opt *qopts)
{
if (a->qname[0] != 0) {
print_queue(a, level, bw, 1, qopts);
@@ -157,6 +157,7 @@ print_altq(const struct pf_altq *a, unsigned level, struct node_queue_bw *bw,
if (a->local_flags & PFALTQ_FLAG_IF_REMOVED)
printf("INACTIVE ");
#endif
+
printf("altq on %s ", a->ifname);
switch (a->scheduler) {
@@ -186,10 +187,11 @@ print_altq(const struct pf_altq *a, unsigned level, struct node_queue_bw *bw,
}
void
-print_queue(const struct pf_altq *a, unsigned level, struct node_queue_bw *bw,
- int print_interface, struct node_queue_opt *qopts)
+print_queue(const struct pf_altq *a, unsigned int level,
+ struct node_queue_bw *bw, int print_interface,
+ struct node_queue_opt *qopts)
{
- unsigned i;
+ unsigned int i;
#ifdef __FreeBSD__
if (a->local_flags & PFALTQ_FLAG_IF_REMOVED)
@@ -893,9 +895,6 @@ print_hfsc_opts(const struct pf_altq *a, const struct node_queue_opt *qopts)
/*
* admission control using generalized service curve
*/
-#ifndef INFINITY
-#define INFINITY HUGE_VAL /* positive infinity defined in <math.h> */
-#endif
/* add a new service curve to a generalized service curve */
static void
@@ -1132,8 +1131,6 @@ getifspeed(char *ifname)
ifr.ifr_data = (caddr_t)&ifrdat;
if (ioctl(s, SIOCGIFDATA, (caddr_t)&ifr) == -1)
err(1, "SIOCGIFDATA");
- if (shutdown(s, SHUT_RDWR) == -1)
- err(1, "shutdown");
if (close(s))
err(1, "close");
return ((u_int32_t)ifrdat.ifi_baudrate);
@@ -1158,8 +1155,6 @@ getifmtu(char *ifname)
#else
err(1, "SIOCGIFMTU");
#endif
- if (shutdown(s, SHUT_RDWR) == -1)
- err(1, "shutdown");
if (close(s))
err(1, "close");
if (ifr.ifr_mtu > 0)
diff --git a/contrib/pf/pfctl/pfctl_optimize.c b/contrib/pf/pfctl/pfctl_optimize.c
index 0514e81..9511720 100644
--- a/contrib/pf/pfctl/pfctl_optimize.c
+++ b/contrib/pf/pfctl/pfctl_optimize.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl_optimize.c,v 1.13 2006/10/31 14:17:45 mcbride Exp $ */
+/* $OpenBSD: pfctl_optimize.c,v 1.17 2008/05/06 03:45:21 mpf Exp $ */
/*
* Copyright (c) 2004 Mike Frantzen <frantzen@openbsd.org>
@@ -185,7 +185,8 @@ struct pf_rule_field {
PF_RULE_FIELD(packets, DC),
PF_RULE_FIELD(bytes, DC),
PF_RULE_FIELD(kif, DC),
- PF_RULE_FIELD(states, DC),
+ PF_RULE_FIELD(states_cur, DC),
+ PF_RULE_FIELD(states_tot, DC),
PF_RULE_FIELD(src_nodes, DC),
PF_RULE_FIELD(nr, DC),
PF_RULE_FIELD(entries, DC),
@@ -201,6 +202,7 @@ struct pf_rule_field {
PF_RULE_FIELD(natpass, NEVER),
PF_RULE_FIELD(max_mss, NEVER),
PF_RULE_FIELD(min_ttl, NEVER),
+ PF_RULE_FIELD(set_tos, NEVER),
};
@@ -398,7 +400,7 @@ optimize_superblock(struct pfctl *pf, struct superblock *block)
* out rules.
*/
- /* shortcut. there will be alot of 1-rule superblocks */
+ /* shortcut. there will be a lot of 1-rule superblocks */
if (!TAILQ_NEXT(TAILQ_FIRST(&block->sb_rules), por_entry))
return (0);
@@ -1320,8 +1322,9 @@ again:
if (pfctl_define_table(tbl->pt_name, PFR_TFLAG_CONST, 1,
- pf->anchor->name, tbl->pt_buf, pf->anchor->ruleset.tticket)) {
- warn("failed to create table %s", tbl->pt_name);
+ pf->astack[0]->name, tbl->pt_buf, pf->astack[0]->ruleset.tticket)) {
+ warn("failed to create table %s in %s",
+ tbl->pt_name, pf->astack[0]->name);
return (1);
}
return (0);
@@ -1424,7 +1427,7 @@ superblock_inclusive(struct superblock *block, struct pf_opt_rule *por)
return (0);
/*
- * Have to handle interface groups seperately. Consider the following
+ * Have to handle interface groups separately. Consider the following
* rules:
* block on EXTIFS to any port 22
* pass on em0 to any port 22
diff --git a/contrib/pf/pfctl/pfctl_osfp.c b/contrib/pf/pfctl/pfctl_osfp.c
index 7018d6c..df78981 100644
--- a/contrib/pf/pfctl/pfctl_osfp.c
+++ b/contrib/pf/pfctl/pfctl_osfp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl_osfp.c,v 1.15 2006/12/13 05:10:15 itojun Exp $ */
+/* $OpenBSD: pfctl_osfp.c,v 1.14 2006/04/08 02:13:14 ray Exp $ */
/*
* Copyright (c) 2003 Mike Frantzen <frantzen@openbsd.org>
diff --git a/contrib/pf/pfctl/pfctl_parser.c b/contrib/pf/pfctl/pfctl_parser.c
index 7dc0c59..d45b9b7 100644
--- a/contrib/pf/pfctl/pfctl_parser.c
+++ b/contrib/pf/pfctl/pfctl_parser.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl_parser.c,v 1.234 2006/10/31 23:46:24 mcbride Exp $ */
+/* $OpenBSD: pfctl_parser.c,v 1.240 2008/06/10 20:55:02 mcbride Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
-#include <limits.h>
#include <netdb.h>
#include <stdarg.h>
#include <errno.h>
@@ -500,7 +499,7 @@ print_status(struct pf_status *s, int opts)
running = s->running ? "Enabled" : "Disabled";
if (s->since) {
- unsigned sec, min, hrs, day = runtime;
+ unsigned int sec, min, hrs, day = runtime;
sec = day % 60;
day /= 60;
@@ -581,7 +580,11 @@ print_status(struct pf_status *s, int opts)
s->src_nodes, "");
for (i = 0; i < SCNT_MAX; i++) {
printf(" %-25s %14lld ", pf_scounters[i],
- (unsigned long long)s->scounters[i]);
+#ifdef __FreeBSD__
+ (long long)s->scounters[i]);
+#else
+ s->scounters[i]);
+#endif
if (runtime > 0)
printf("%14.1f/s\n",
(double)s->scounters[i] / (double)runtime);
@@ -952,6 +955,12 @@ print_rule(struct pf_rule *r, const char *anchor_call, int verbose, int numeric)
printf("sloppy");
opts = 0;
}
+ if (r->rule_flag & PFRULE_PFLOW) {
+ if (!opts)
+ printf(", ");
+ printf("pflow");
+ opts = 0;
+ }
for (i = 0; i < PFTM_MAX; ++i)
if (r->timeout[i]) {
int j;
@@ -979,6 +988,8 @@ print_rule(struct pf_rule *r, const char *anchor_call, int verbose, int numeric)
printf(" min-ttl %d", r->min_ttl);
if (r->max_mss)
printf(" max-mss %d", r->max_mss);
+ if (r->rule_flag & PFRULE_SET_TOS)
+ printf(" set-tos 0x%2.2x", r->set_tos);
if (r->allow_opts)
printf(" allow-opts");
if (r->action == PF_SCRUB) {
@@ -1007,6 +1018,26 @@ print_rule(struct pf_rule *r, const char *anchor_call, int verbose, int numeric)
}
if (r->rtableid != -1)
printf(" rtable %u", r->rtableid);
+ if (r->divert.port) {
+#ifdef __FreeBSD__
+ printf(" divert-to %u", ntohs(r->divert.port));
+#else
+ if (PF_AZERO(&r->divert.addr, r->af)) {
+ printf(" divert-reply");
+ } else {
+ /* XXX cut&paste from print_addr */
+ char buf[48];
+
+ printf(" divert-to ");
+ if (inet_ntop(r->af, &r->divert.addr, buf,
+ sizeof(buf)) == NULL)
+ printf("?");
+ else
+ printf("%s", buf);
+ printf(" port %u", ntohs(r->divert.port));
+ }
+#endif
+ }
if (!anchor_call[0] && (r->action == PF_NAT ||
r->action == PF_BINAT || r->action == PF_RDR)) {
printf(" -> ");
@@ -1027,6 +1058,8 @@ print_tabledef(const char *name, int flags, int addrs,
printf(" const");
if (flags & PFR_TFLAG_PERSIST)
printf(" persist");
+ if (flags & PFR_TFLAG_COUNTERS)
+ printf(" counters");
SIMPLEQ_FOREACH(ti, nodes, entries) {
if (ti->file) {
printf(" file \"%s\"", ti->file);
diff --git a/contrib/pf/pfctl/pfctl_parser.h b/contrib/pf/pfctl/pfctl_parser.h
index ab9017e..4560d66 100644
--- a/contrib/pf/pfctl/pfctl_parser.h
+++ b/contrib/pf/pfctl/pfctl_parser.h
@@ -172,10 +172,10 @@ struct node_queue_opt {
#define SIMPLEQ_END(head) NULL
#define SIMPLEQ_EMPTY STAILQ_EMPTY
#define SIMPLEQ_NEXT STAILQ_NEXT
-/*#define SIMPLEQ_FOREACH STAILQ_FOREACH*/
-#define SIMPLEQ_FOREACH(var, head, field) \
- for((var) = SIMPLEQ_FIRST(head); \
- (var) != SIMPLEQ_END(head); \
+/*#define SIMPLEQ_FOREACH STAILQ_FOREACH*/
+#define SIMPLEQ_FOREACH(var, head, field) \
+ for((var) = SIMPLEQ_FIRST(head); \
+ (var) != SIMPLEQ_END(head); \
(var) = SIMPLEQ_NEXT(var, field))
#define SIMPLEQ_INIT STAILQ_INIT
#define SIMPLEQ_INSERT_HEAD STAILQ_INSERT_HEAD
@@ -213,7 +213,7 @@ struct pf_opt_rule {
TAILQ_HEAD(pf_opt_queue, pf_opt_rule);
-int pfctl_rules(int, char *, FILE *, int, int, char *, struct pfr_buffer *);
+int pfctl_rules(int, char *, int, int, char *, struct pfr_buffer *);
int pfctl_optimize_ruleset(struct pfctl *, struct pf_ruleset *);
int pfctl_add_rule(struct pfctl *, struct pf_rule *, const char *);
@@ -230,7 +230,7 @@ int pfctl_set_hostid(struct pfctl *, u_int32_t);
int pfctl_set_debug(struct pfctl *, char *);
int pfctl_set_interface_flags(struct pfctl *, char *, int, int);
-int parse_rules(FILE *, struct pfctl *);
+int parse_config(char *, struct pfctl *);
int parse_flags(char *);
int pfctl_load_anchors(int, struct pfctl *, struct pfr_buffer *);
diff --git a/contrib/pf/pfctl/pfctl_qstats.c b/contrib/pf/pfctl/pfctl_qstats.c
index d4089d6..95371e4 100644
--- a/contrib/pf/pfctl/pfctl_qstats.c
+++ b/contrib/pf/pfctl/pfctl_qstats.c
@@ -73,7 +73,7 @@ void pfctl_insert_altq_node(struct pf_altq_node **,
struct pf_altq_node *pfctl_find_altq_node(struct pf_altq_node *,
const char *, const char *);
void pfctl_print_altq_node(int, const struct pf_altq_node *,
- unsigned, int);
+ unsigned, int);
void print_cbqstats(struct queue_stats);
void print_priqstats(struct queue_stats);
void print_hfscstats(struct queue_stats);
@@ -185,8 +185,8 @@ pfctl_update_qstats(int dev, struct pf_altq_node **root)
}
}
#ifdef __FreeBSD__
- else if (pa.altq.local_flags & PFALTQ_FLAG_IF_REMOVED) {
- memset(&qstats.data, 0, sizeof(qstats.data));
+ else if (pa.altq.local_flags & PFALTQ_FLAG_IF_REMOVED) {
+ memset(&qstats.data, 0, sizeof(qstats.data));
if ((node = pfctl_find_altq_node(*root, pa.altq.qname,
pa.altq.ifname)) != NULL) {
memcpy(&node->qstats.data, &qstats.data,
@@ -194,7 +194,7 @@ pfctl_update_qstats(int dev, struct pf_altq_node **root)
update_avg(node);
} else {
pfctl_insert_altq_node(root, pa.altq, qstats);
- }
+ }
}
#endif
}
@@ -262,8 +262,8 @@ pfctl_find_altq_node(struct pf_altq_node *root, const char *qname,
}
void
-pfctl_print_altq_node(int dev, const struct pf_altq_node *node, unsigned level,
- int opts)
+pfctl_print_altq_node(int dev, const struct pf_altq_node *node,
+ unsigned int level, int opts)
{
const struct pf_altq_node *child;
@@ -302,11 +302,11 @@ pfctl_print_altq_nodestat(int dev, const struct pf_altq_node *a)
{
if (a->altq.qid == 0)
return;
+
#ifdef __FreeBSD__
if (a->altq.local_flags & PFALTQ_FLAG_IF_REMOVED)
return;
#endif
-
switch (a->altq.scheduler) {
case ALTQT_CBQ:
print_cbqstats(a->qstats);
diff --git a/contrib/pf/pfctl/pfctl_radix.c b/contrib/pf/pfctl/pfctl_radix.c
index 01ad475..38f16c4 100644
--- a/contrib/pf/pfctl/pfctl_radix.c
+++ b/contrib/pf/pfctl/pfctl_radix.c
@@ -30,6 +30,9 @@
*
*/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -300,29 +303,6 @@ pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size,
}
int
-pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
- int *nzero, int flags)
-{
- struct pfioc_table io;
-
- if (tbl == NULL || size < 0 || (size && addr == NULL)) {
- errno = EINVAL;
- return (-1);
- }
- bzero(&io, sizeof io);
- io.pfrio_flags = flags;
- io.pfrio_table = *tbl;
- io.pfrio_buffer = addr;
- io.pfrio_esize = sizeof(*addr);
- io.pfrio_size = size;
- if (ioctl(dev, DIOCRCLRASTATS, &io))
- return (-1);
- if (nzero != NULL)
- *nzero = io.pfrio_nzero;
- return (0);
-}
-
-int
pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
{
struct pfioc_table io;
@@ -344,32 +324,6 @@ pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
}
int
-pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
- int *nchange, int *ndel, int flags)
-{
- struct pfioc_table io;
-
- if (size < 0 || (size && !tbl)) {
- errno = EINVAL;
- return (-1);
- }
- bzero(&io, sizeof io);
- io.pfrio_flags = flags;
- io.pfrio_buffer = tbl;
- io.pfrio_esize = sizeof(*tbl);
- io.pfrio_size = size;
- io.pfrio_setflag = setflag;
- io.pfrio_clrflag = clrflag;
- if (ioctl(dev, DIOCRSETTFLAGS, &io))
- return (-1);
- if (nchange)
- *nchange = io.pfrio_nchange;
- if (ndel)
- *ndel = io.pfrio_ndel;
- return (0);
-}
-
-int
pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
int *nmatch, int flags)
{
diff --git a/contrib/pf/pfctl/pfctl_table.c b/contrib/pf/pfctl/pfctl_table.c
index 3d54466..257c014 100644
--- a/contrib/pf/pfctl/pfctl_table.c
+++ b/contrib/pf/pfctl/pfctl_table.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfctl_table.c,v 1.66 2007/03/01 17:20:54 deraadt Exp $ */
+/* $OpenBSD: pfctl_table.c,v 1.67 2008/06/10 20:55:02 mcbride Exp $ */
/*
* Copyright (c) 2002 Cedric Berger
@@ -275,12 +275,14 @@ pfctl_table(int argc, char *argv[], char *tname, const char *command,
if (b.pfrb_size <= b.pfrb_msize)
break;
}
- PFRB_FOREACH(p, &b)
+ PFRB_FOREACH(p, &b) {
+ ((struct pfr_astats *)p)->pfras_a.pfra_fback = 0;
if (time(NULL) - ((struct pfr_astats *)p)->pfras_tzero >
- lifetime)
+ lifetime)
if (pfr_buf_add(&b2,
&((struct pfr_astats *)p)->pfras_a))
err(1, "duplicate buffer");
+ }
if (opts & PF_OPT_VERBOSE)
flags |= PFR_FLAG_FEEDBACK;
@@ -367,13 +369,14 @@ print_table(struct pfr_table *ta, int verbose, int debug)
if (!debug && !(ta->pfrt_flags & PFR_TFLAG_ACTIVE))
return;
if (verbose) {
- printf("%c%c%c%c%c%c\t%s",
+ printf("%c%c%c%c%c%c%c\t%s",
(ta->pfrt_flags & PFR_TFLAG_CONST) ? 'c' : '-',
(ta->pfrt_flags & PFR_TFLAG_PERSIST) ? 'p' : '-',
(ta->pfrt_flags & PFR_TFLAG_ACTIVE) ? 'a' : '-',
(ta->pfrt_flags & PFR_TFLAG_INACTIVE) ? 'i' : '-',
(ta->pfrt_flags & PFR_TFLAG_REFERENCED) ? 'r' : '-',
(ta->pfrt_flags & PFR_TFLAG_REFDANCHOR) ? 'h' : '-',
+ (ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-',
ta->pfrt_name);
if (ta->pfrt_anchor[0])
printf("\t%s", ta->pfrt_anchor);
@@ -428,7 +431,7 @@ void
print_addrx(struct pfr_addr *ad, struct pfr_addr *rad, int dns)
{
char ch, buf[256] = "{error}";
- char fb[] = { ' ', 'M', 'A', 'D', 'C', 'Z', 'X', ' ', 'Y' };
+ char fb[] = { ' ', 'M', 'A', 'D', 'C', 'Z', 'X', ' ', 'Y', ' ' };
unsigned int fback, hostnet;
fback = (rad != NULL) ? rad->pfra_fback : ad->pfra_fback;
@@ -477,6 +480,8 @@ print_astats(struct pfr_astats *as, int dns)
print_addrx(&as->pfras_a, NULL, dns);
printf("\tCleared: %s", ctime(&time));
+ if (as->pfras_a.pfra_fback == PFR_FB_NOCOUNT)
+ return;
for (dir = 0; dir < PFR_DIR_MAX; dir++)
for (op = 0; op < PFR_OP_ADDR_MAX; op++)
printf("\t%-12s [ Packets: %-18llu Bytes: %-18llu ]\n",
diff --git a/contrib/pf/pflogd/pflogd.8 b/contrib/pf/pflogd/pflogd.8
index 22643fc..38c954c 100644
--- a/contrib/pf/pflogd/pflogd.8
+++ b/contrib/pf/pflogd/pflogd.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: pflogd.8,v 1.32 2006/12/08 10:26:38 joel Exp $
+.\" $OpenBSD: pflogd.8,v 1.37 2008/10/22 08:16:49 henning Exp $
.\"
.\" Copyright (c) 2001 Can Erkin Acar. All rights reserved.
.\"
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 9, 2001
+.Dd October 22 2008
.Dt PFLOGD 8
.Os
.Sh NAME
@@ -34,12 +34,14 @@
.Nd packet filter logging daemon
.Sh SYNOPSIS
.Nm pflogd
+.Bk -words
.Op Fl Dx
.Op Fl d Ar delay
.Op Fl f Ar filename
.Op Fl i Ar interface
.Op Fl s Ar snaplen
.Op Ar expression
+.Ek
.Sh DESCRIPTION
.Nm
is a background daemon which reads packets logged by
@@ -94,6 +96,13 @@ or a
.Dv SIGALRM
is received.
.Pp
+.Nm
+will also log the pcap statistics for the
+.Xr pflog 4
+interface to syslog when a
+.Dv SIGUSR1
+is received.
+.Pp
The options are as follows:
.Bl -tag -width Ds
.It Fl D
@@ -116,6 +125,11 @@ By default,
.Nm
will use
.Ar pflog0 .
+Writes a file containing the process ID of the program to
+.Pa /var/run .
+The file name has the form
+The default is
+.Ar pflogd .
.It Fl s Ar snaplen
Analyze at most the first
.Ar snaplen
@@ -204,12 +218,12 @@ the wi0 interface:
# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0
.Ed
.Sh SEE ALSO
-.Xr tcpdump 1 ,
.Xr pcap 3 ,
.Xr pf 4 ,
.Xr pflog 4 ,
.Xr pf.conf 5 ,
-.Xr newsyslog 8
+.Xr newsyslog 8 ,
+.Xr tcpdump 1
.Sh HISTORY
The
.Nm
diff --git a/contrib/pf/pflogd/pflogd.c b/contrib/pf/pflogd/pflogd.c
index b470ae1..2fc2338 100644
--- a/contrib/pf/pflogd/pflogd.c
+++ b/contrib/pf/pflogd/pflogd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pflogd.c,v 1.37 2006/10/26 13:34:47 jmc Exp $ */
+/* $OpenBSD: pflogd.c,v 1.46 2008/10/22 08:16:49 henning Exp $ */
/*
* Copyright (c) 2001 Theo de Raadt
@@ -37,9 +37,8 @@ __FBSDID("$FreeBSD$");
#include <sys/ioctl.h>
#include <sys/file.h>
#include <sys/stat.h>
-#ifdef __FreeBSD__
-#include <net/bpf.h> /* BIOCLOCK */
-#endif
+#include <sys/socket.h>
+#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -48,15 +47,16 @@ __FBSDID("$FreeBSD$");
#include <pcap.h>
#include <syslog.h>
#include <signal.h>
+#include <err.h>
#include <errno.h>
#include <stdarg.h>
#include <fcntl.h>
#ifdef __FreeBSD__
+#include <ifaddrs.h>
#include "pidfile.h"
#else
#include <util.h>
#endif
-
#include "pflogd.h"
pcap_t *hpcap;
@@ -66,7 +66,7 @@ int Debug = 0;
static int snaplen = DEF_SNAPLEN;
static int cur_snaplen = DEF_SNAPLEN;
-volatile sig_atomic_t gotsig_close, gotsig_alrm, gotsig_hup;
+volatile sig_atomic_t gotsig_close, gotsig_alrm, gotsig_hup, gotsig_usr1;
char *filename = PFLOGD_LOG_FILE;
char *interface = PFLOGD_DEFAULT_IF;
@@ -80,7 +80,9 @@ unsigned int delay = FLUSH_DELAY;
char *copy_argv(char * const *);
void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
void dump_packet_nobuf(u_char *, const struct pcap_pkthdr *, const u_char *);
+void log_pcap_stats(void);
int flush_buffer(FILE *);
+int if_exists(char *);
int init_pcap(void);
void logmsg(int, const char *, ...);
void purge_buffer(void);
@@ -89,6 +91,7 @@ int scan_dump(FILE *, off_t);
int set_snaplen(int);
void set_suspended(int);
void sig_alrm(int);
+void sig_usr1(int);
void sig_close(int);
void sig_hup(int);
void usage(void);
@@ -166,8 +169,8 @@ __dead void
usage(void)
{
fprintf(stderr, "usage: pflogd [-Dx] [-d delay] [-f filename]");
- fprintf(stderr, " [-i interface] [-s snaplen]\n");
- fprintf(stderr, " [expression]\n");
+ fprintf(stderr, " [-i interface] [-p pidfile]\n");
+ fprintf(stderr, " [-s snaplen] [expression]\n");
exit(1);
}
@@ -190,6 +193,12 @@ sig_alrm(int sig)
}
void
+sig_usr1(int sig)
+{
+ gotsig_usr1 = 1;
+}
+
+void
set_pcap_filter(void)
{
struct bpf_program bprog;
@@ -204,6 +213,51 @@ set_pcap_filter(void)
}
int
+if_exists(char *ifname)
+{
+#ifdef __FreeBSD__
+ struct ifaddrs *ifdata, *mb;
+ int exists = 0;
+
+ getifaddrs(&ifdata);
+ if (ifdata == NULL)
+ return (0);
+
+ for (mb = ifdata; mb != NULL; mb = mb->ifa_next) {
+ if (mb == NULL)
+ continue;
+ if (strlen(ifname) != strlen(mb->ifa_name))
+ continue;
+ if (strncmp(ifname, mb->ifa_name, strlen(ifname)) != 0)
+ continue;
+ exists = 1;
+ break;
+ }
+ freeifaddrs(ifdata);
+
+ return (exists);
+#else
+ int s;
+ struct ifreq ifr;
+ struct if_data ifrdat;
+
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ err(1, "socket");
+ bzero(&ifr, sizeof(ifr));
+ if (strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)) >=
+ sizeof(ifr.ifr_name))
+ errx(1, "main ifr_name: strlcpy");
+ ifr.ifr_data = (caddr_t)&ifrdat;
+ if (ioctl(s, SIOCGIFDATA, (caddr_t)&ifr) == -1)
+ return (0);
+ if (close(s))
+ err(1, "close");
+
+ return (1);
+#endif
+}
+
+int
init_pcap(void)
{
hpcap = pcap_open_live(interface, snaplen, 1, PCAP_TO_MS, errbuf);
@@ -554,10 +608,10 @@ dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
return;
}
- append:
+ append:
#ifdef __FreeBSD__
- sh.ts.tv_sec = (bpf_int32)h->ts.tv_sec;
- sh.ts.tv_usec = (bpf_int32)h->ts.tv_usec;
+ sh.ts.tv_sec = (bpf_int32)h->ts.tv_sec;
+ sh.ts.tv_usec = (bpf_int32)h->ts.tv_usec;
sh.caplen = h->caplen;
sh.len = h->len;
@@ -575,17 +629,31 @@ dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
return;
}
+void
+log_pcap_stats(void)
+{
+ struct pcap_stat pstat;
+ if (pcap_stats(hpcap, &pstat) < 0)
+ logmsg(LOG_WARNING, "Reading stats: %s", pcap_geterr(hpcap));
+ else
+ logmsg(LOG_NOTICE,
+ "%u packets received, %u/%u dropped (kernel/pflogd)",
+ pstat.ps_recv, pstat.ps_drop, packets_dropped);
+}
+
int
main(int argc, char **argv)
{
- struct pcap_stat pstat;
- int ch, np, Xflag = 0;
+ int ch, np, ret, Xflag = 0;
pcap_handler phandler = dump_packet;
const char *errstr = NULL;
+ char *pidf = NULL;
+
+ ret = 0;
closefrom(STDERR_FILENO + 1);
- while ((ch = getopt(argc, argv, "Dxd:f:i:s:")) != -1) {
+ while ((ch = getopt(argc, argv, "Dxd:f:i:p:s:")) != -1) {
switch (ch) {
case 'D':
Debug = 1;
@@ -601,6 +669,9 @@ main(int argc, char **argv)
case 'i':
interface = optarg;
break;
+ case 'p':
+ pidf = optarg;
+ break;
case 's':
snaplen = strtonum(optarg, 0, PFLOGD_MAXSNAPLEN,
&errstr);
@@ -622,13 +693,21 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
+ /* does interface exist */
+ if (!if_exists(interface)) {
+ warn("Failed to initialize: %s", interface);
+ logmsg(LOG_ERR, "Failed to initialize: %s", interface);
+ logmsg(LOG_ERR, "Exiting, init failure");
+ exit(1);
+ }
+
if (!Debug) {
openlog("pflogd", LOG_PID | LOG_CONS, LOG_DAEMON);
if (daemon(0, 0)) {
logmsg(LOG_WARNING, "Failed to become daemon: %s",
strerror(errno));
}
- pidfile(NULL);
+ pidfile(pidf);
}
tzset();
@@ -659,6 +738,7 @@ main(int argc, char **argv)
signal(SIGINT, sig_close);
signal(SIGQUIT, sig_close);
signal(SIGALRM, sig_alrm);
+ signal(SIGUSR1, sig_usr1);
signal(SIGHUP, sig_hup);
alarm(delay);
@@ -686,13 +766,12 @@ main(int argc, char **argv)
np = pcap_dispatch(hpcap, PCAP_NUM_PKTS,
phandler, (u_char *)dpcap);
if (np < 0) {
-#ifdef __FreeBSD__
- if (errno == ENXIO) {
- logmsg(LOG_ERR,
- "Device not/no longer configured");
+ if (!if_exists(interface) == -1) {
+ logmsg(LOG_NOTICE, "interface %s went away",
+ interface);
+ ret = -1;
break;
}
-#endif
logmsg(LOG_NOTICE, "%s", pcap_geterr(hpcap));
}
@@ -715,6 +794,11 @@ main(int argc, char **argv)
gotsig_alrm = 0;
alarm(delay);
}
+
+ if (gotsig_usr1) {
+ log_pcap_stats();
+ gotsig_usr1 = 0;
+ }
}
logmsg(LOG_NOTICE, "Exiting");
@@ -724,15 +808,9 @@ main(int argc, char **argv)
}
purge_buffer();
- if (pcap_stats(hpcap, &pstat) < 0)
- logmsg(LOG_WARNING, "Reading stats: %s", pcap_geterr(hpcap));
- else
- logmsg(LOG_NOTICE,
- "%u packets received, %u/%u dropped (kernel/pflogd)",
- pstat.ps_recv, pstat.ps_drop, packets_dropped);
-
+ log_pcap_stats();
pcap_close(hpcap);
if (!Debug)
closelog();
- return (0);
+ return (ret);
}
diff --git a/contrib/pf/pflogd/privsep.c b/contrib/pf/pflogd/privsep.c
index a07d141..2e3895d 100644
--- a/contrib/pf/pflogd/privsep.c
+++ b/contrib/pf/pflogd/privsep.c
@@ -23,6 +23,7 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
+#include <sys/ioctl.h>
#include <net/if.h>
#include <net/bpf.h>
@@ -31,20 +32,13 @@ __FBSDID("$FreeBSD$");
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
-#ifndef __FreeBSD__
#include <pcap.h>
#include <pcap-int.h>
-#endif
#include <pwd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#ifdef __FreeBSD__
-/* XXX: pcap pollutes namespace with strlcpy if not present previously */
-#include <pcap.h>
-#include <pcap-int.h>
-#endif
#include <syslog.h>
#include <unistd.h>
#include "pflogd.h"
diff --git a/contrib/pf/pflogd/privsep_fdpass.c b/contrib/pf/pflogd/privsep_fdpass.c
index 50afdfc..0e6c3c4 100644
--- a/contrib/pf/pflogd/privsep_fdpass.c
+++ b/contrib/pf/pflogd/privsep_fdpass.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: privsep_fdpass.c,v 1.2 2004/08/13 02:51:48 djm Exp $ */
+/* $OpenBSD: privsep_fdpass.c,v 1.5 2008/03/24 16:11:08 deraadt Exp $ */
/*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
@@ -50,7 +50,10 @@ void
send_fd(int sock, int fd)
{
struct msghdr msg;
- char tmp[CMSG_SPACE(sizeof(int))];
+ union {
+ struct cmsghdr hdr;
+ char buf[CMSG_SPACE(sizeof(int))];
+ } cmsgbuf;
struct cmsghdr *cmsg;
struct iovec vec;
int result = 0;
@@ -59,8 +62,8 @@ send_fd(int sock, int fd)
memset(&msg, 0, sizeof(msg));
if (fd >= 0) {
- msg.msg_control = (caddr_t)tmp;
- msg.msg_controllen = CMSG_LEN(sizeof(int));
+ msg.msg_control = (caddr_t)&cmsgbuf.buf;
+ msg.msg_controllen = sizeof(cmsgbuf.buf);
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
cmsg->cmsg_level = SOL_SOCKET;
@@ -86,7 +89,10 @@ int
receive_fd(int sock)
{
struct msghdr msg;
- char tmp[CMSG_SPACE(sizeof(int))];
+ union {
+ struct cmsghdr hdr;
+ char buf[CMSG_SPACE(sizeof(int))];
+ } cmsgbuf;
struct cmsghdr *cmsg;
struct iovec vec;
ssize_t n;
@@ -98,8 +104,8 @@ receive_fd(int sock)
vec.iov_len = sizeof(int);
msg.msg_iov = &vec;
msg.msg_iovlen = 1;
- msg.msg_control = tmp;
- msg.msg_controllen = sizeof(tmp);
+ msg.msg_control = &cmsgbuf.buf;
+ msg.msg_controllen = sizeof(cmsgbuf.buf);
if ((n = recvmsg(sock, &msg, 0)) == -1)
warn("%s: recvmsg", __func__);
diff --git a/contrib/sendmail/src/deliver.c b/contrib/sendmail/src/deliver.c
index acd977f..bb1d60e 100644
--- a/contrib/sendmail/src/deliver.c
+++ b/contrib/sendmail/src/deliver.c
@@ -2416,6 +2416,12 @@ tryhost:
else
pwd = sm_getpwnam(contextaddr->q_user);
sucflags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY;
+#ifdef LOGIN_SETCPUMASK
+ sucflags |= LOGIN_SETCPUMASK;
+#endif /* LOGIN_SETCPUMASK */
+#ifdef LOGIN_SETLOGINCLASS
+ sucflags |= LOGIN_SETLOGINCLASS;
+#endif /* LOGIN_SETLOGINCLASS */
#ifdef LOGIN_SETMAC
sucflags |= LOGIN_SETMAC;
#endif /* LOGIN_SETMAC */
diff --git a/contrib/lukemftp/COPYING b/contrib/tnftp/COPYING
index 31acb74..064be2d 100644
--- a/contrib/lukemftp/COPYING
+++ b/contrib/tnftp/COPYING
@@ -1,4 +1,10 @@
-Copyright 1999, 2000 Luke Mewburn <lukem@netbsd.org>. All rights reserved.
+$NetBSD: COPYING,v 1.7 2010/01/12 07:01:01 lukem Exp $
+
+Copyright (c) 2001-2010 The NetBSD Foundation, Inc.
+All rights reserved.
+
+This code is derived from software contributed to The NetBSD Foundation
+by Simon Burge, Luke Mewburn, and Christos Zoulas.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -10,20 +16,24 @@ are met:
documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
- This product includes software developed by Luke Mewburn.
-4. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
-OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
-USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This product includes software developed by the NetBSD
+ Foundation, Inc. and its contributors.
+4. Neither the name of The NetBSD Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
This product also contains software developed by other people, and you
are advised to read the various source files to read the full details
@@ -32,11 +42,13 @@ acknowledgements:
This product includes software developed by the NetBSD Foundation,
Inc. and its contributors. Those contributors include:
+ - Simon Burge
- Jaromir Dolecek
- Klaus Klein
- Luke Mewburn
- Jason R. Thorpe of the Numerical Aerospace Simulation
Facility, NASA Ames Research Center.
+ - Christos Zoulas
This product includes software developed by the University of
California, Berkeley and its contributors. Those contributors include:
diff --git a/contrib/lukemftp/ChangeLog b/contrib/tnftp/ChangeLog
index 8bdbb45..7674925 100644
--- a/contrib/lukemftp/ChangeLog
+++ b/contrib/tnftp/ChangeLog
@@ -1,3 +1,713 @@
+$NetBSD: ChangeLog,v 1.58 2010/01/12 06:58:57 lukem Exp $
+
+Tue Jan 12 06:58:15 UTC 2010 lukem
+
+ * Release as "tnftp 20100108"
+
+ * Rename onoff() argument "bool" to "val".
+
+Tue Jan 5 09:12:01 UTC 2010 lukem
+
+ * If ARG_MAX isn't defined, use the result from sysconf(_SC_ARG_MAX).
+ Fixes build when using newer glibc.
+
+ * Add libnetbsd.la to the LIBADD for libedit.
+ Fix provided by Adam Sampson.
+
+Mon Jan 4 06:28:07 UTC 2010 lukem
+
+ * Distribute various files not shipped by default automake rules,
+ to use 'make dist' instead of 'cvs export'.
+
+Wed Dec 30 00:12:47 UTC 2009 lukem
+
+ * Release as "tnftp 20091122"
+
+Sun Nov 15 10:14:44 UTC 2009 lukem
+
+ * Merge NetBSD ftp from 20090520 to 20090915. Change:
+ - Rename internal getline() to get_line() to avoid
+ conflict with libc with former.
+ - Avoid a NULL dereference in an error message.
+
+Sat Nov 14 09:21:19 UTC 2009 lukem
+
+ * Convert to automake & libtool.
+
+Sat Jun 6 07:17:38 UTC 2009 lukem
+
+ * Release as "tnftp 20090606"
+
+Fri May 22 01:11:15 UTC 2009 lukem
+
+ * configure fixes:
+ - Add the time.h headers to accheck_includes, for the strptime check.
+ - Remove the check for el_init in libedit; we're always replacing
+ the library and the presence of strvis() in some versions
+ confuses other checks.
+
+Wed May 20 13:47:43 UTC 2009 lukem
+
+ * Release as "tnftp 20090520"
+
+ * Merge NetBSD ftp from 20070722 to 20090520. Changes:
+ - Only attempt to el_parse() a command unknown by the default
+ parser if editing is enabled.
+ Fixes PR 38589.
+ - Turn off the alarmtimer before resetting the SIGALRM handler
+ back to SIG_DFL.
+ Fixes PR 35630.
+ - Add epsv6 and epsv to disable extended passive mode for ipv6 or
+ both ipv4 and ipv6 respectively. This hack is due to our
+ friends a Juniper Networks who break epsv in ipv6.
+ Should be fixed in ScreenOS 6.2.X.
+ - Improve parsing of chunked transfer chunks per RFC2616:
+ - more stringent chunk-size parsing
+ - ignore optional trailing ';chunk-ext' stuff, instead of barfing
+ - detect EOF before final \r\n.
+ - Use the service name to getaddrinfo() (along with the host
+ name), so that features such as DNS Service Discovery have a
+ better chance of working.
+ Display the service name in various status & error messages.
+ - Don't getservbyname() the :port component of a URL; RFC 3986
+ says it's just an unsigned number, not a service name.
+ - Fix numerous WARNS=4 issues (-Wcast-qual -Wsign-compare).
+ - Fix -Wshadow issues
+ - Update copyrights
+ - Remove clause 3 and 4 from TNF licenses
+ - Rename HAVE_STRUCT_SOCKADDR_SA_LEN to
+ HAVE_STRUCT_SOCKADDR_IN_SIN_LEN to accurately reflect the
+ structure member being used.
+ - Use AF_INET instead of AF_UNSPEC as the default family if
+ !defined(INET6).
+
+ * configure improvements:
+ - Style tweaks.
+ - Use AC_LANG_PROGRAM() instead of AC_LANG_SOURCE()
+ - Add a check for strptime() requiring separators between
+ conversions, and use our replacement one if it does.
+
+Sat Dec 20 15:28:24 UTC 2008 lukem
+
+ * configure improvements:
+ - Move IPv6 check from tnftp.h to configure.ac (as per tnftpd).
+ - Rework option descriptions.
+ - Highlight when tests are for a specific option.
+ - Move configuration results to the end of the file.
+ - Display $prefix in configure results.
+
+Fri Aug 15 03:03:36 UTC 2008 lukem
+
+ * Add a "Configuration results" display at the end of configure.
+ Cosmetic tweaks.
+
+Fri Feb 29 09:45:56 UTC 2008 lukem
+
+ * Support @EXEEXT@ for Cygwin (etc).
+
+Mon Aug 6 04:55:19 UTC 2007 lukem
+
+ * Release as "tnftp 20070806"
+
+ * Add a NEWS file.
+
+ * Reduce differences between NetBSD-ftp and local copy.
+
+ * Merge NetBSD ftp from 20070605 to 20070722.
+ Changes:
+ - Document about:ftp and about:version.
+
+ * Add autoconf check for (Dante) SOCKS5.
+ (Needs run-time testing and more portability testing.)
+
+Mon Jul 23 11:44:42 UTC 2007 lukem
+
+ * Don't use non-standard: u_char u_short u_int.
+ Use uint32_t instead of u_int32_t.
+
+ * Consistently use AS_CASE() and AS_IF() in configure.ac.
+
+ * Don't use defined() with HAVE_DECL_xxx.
+ Use `LL' instead of `L' suffix for fallback
+ defines of LLONG_MIN and LLONG_MAX.
+
+Sun Jul 22 12:00:17 UTC 2007 lukem
+
+ * Include <arpa/nameser.h> if available, and provide fallback #defines.
+
+ * Sync with lib/libc/inet/inet_pton.c 1.3:
+ * Sync to bind 9.3.x version
+ * Update ISC copyright
+ * Fix some lint
+
+ * Sync with lib/libc/inet/inet_ntop.c 1.3:
+ * Sync to bind 9.3.x version
+ * Update ISC copyright
+ * Use socklen_t instead of size_t
+ * Use snprintf() instead of SPRINTF()
+ * Improve detection of various boundary conditions
+
+ * Sync to NetBSD glob.h 1.21, glob.c 1.16:
+ * Standards compliance fix
+ * De-lint
+ * Don't overflow when DEBUG is defined.
+
+ * Sync fgetln.c to tools/compat/fgetln.c 1.7:
+ * Clause 3 removal.
+
+ * Sync to config.guess 2007-07-22, config.sub 2007-06-28.
+
+ * Consistency tweaks in configure help strings.
+
+ * Add check for struct sockaddr.sa_len.
+ Change tests for HAVE_foo to defined(HAVE_foo).
+ Replace HAVE_SOCKADDR_SA_LEN with HAVE_STRUCT_SOCKADDR_SA_LEN.
+
+ * Remove pretence of supporting SOCKS for now;
+ no test system is available, and the old
+ autoconf 2.13 support wasn't upgraded to 2.61.
+
+ * configure.ac style consistency tweaks.
+ Move autoconf aux files from ./ to build-aux/
+
+ * Remove duplicate HAVE_STRERROR replacement in tnftp.h.
+
+Thu Jun 7 04:47:47 UTC 2007 lukem
+
+ * Merge NetBSD ftp from 20070510 to 20070605. Changes:
+ - Enforce restriction that (http) proxied URL fetchs don't
+ support being restarted at this time.
+ Addresses NetBSD Problem Report 28697.
+ - Display times in RFC2822 form rather than using ctime(3),
+ since the former is more explicit about the timezone offset.
+ - main: call tzset() to ensure TZ is setup for other <time.h>
+ functions.
+ - remotemodtime(): use strptime() to parse the reply.
+ - fetch_url(): ensure struct tm is zeroed before calling
+ strptime().
+ - Modify parse_url() to consistently strip the leading `/'
+ off ftp URLs.
+ Fixes NetBSD Problem Report 17617.
+ - Use 'RFCnnnn' (with leading 0) instead of 'RFC nnnn', to be
+ consistent with the style in the RFC index.
+ - Refer to RFC3916 instead of 1738 or 2732.
+ - Expand the list of supported RFCs in ftp(1) to contain the
+ document name as well.
+
+Fri May 11 04:39:55 UTC 2007 lukem
+
+ * Update INSTALL and COPYING.
+
+ * Rename HAVE_QUAD_SUPPORT to HAVE_PRINTF_LONG_LONG, and only
+ require support for 'long long' in that check rather than
+ needing sizeof(off_t)>=8, as some systems have a separate
+ off64_t when Large File Support is enabled.
+
+ * config.guess: treat 'i86xen:SunOS:5.*' as 'i86pc:SunOS:5.*'
+
+Thu May 10 15:23:33 UTC 2007 lukem
+
+ * Remove checks for util.h and libutil.h, and replacement for
+ fparseln(), since fparseln() isn't used any more.
+
+ * Merge NetBSD ftp from 20070418 to 20070510. Changes:
+ - Switch from fparseln() to the internal getline() when
+ parsing HTTP headers. Makes ftp a bit more portable
+ (not needing fparseln()) at the expense of not supporting
+ arbitrary long header lines, which I'm not concerned about
+ because we don't support header line continuation either...
+ - Replace references from draft-ietf-ftpext-mlst-NN to RFC 3659.
+ - Fix misplaced const.
+ - Implement copy_bytes() to copy bytes from one fd to another
+ via the provided buffer, with optional rate-limiting and
+ hash-mark printing, using one loop and handle short writes.
+ Refactor sendrequest() and recvrequest() to use copy_data().
+ Addresses NetBSD Problem Report 15943.
+
+Wed May 9 05:24:55 UTC 2007 lukem
+
+ * Fix typo in poll()-based implementation of usleep() replacement.
+
+Wed May 9 04:58:50 UTC 2007 lukem
+
+ * Rename configure.in to configure.ac, as the latter is the
+ preferred name in autoconf 2.61.
+
+ * Convert from autoconf 2.13 to 2.61:
+ * Use a consistent quoting mechanism.
+ * Use modern autoconf macros, #define names, etc.
+ * Search for more header files, and only #include if found.
+ * Remove old-style config.h.in generation.
+ This may fix various tests on platforms such as FreeBSD and OS X.
+
+ * Add -Wl,-search_paths_first to LDFLAGS on OS X (Darwin) if the
+ linker supports it. This is needed so we use our libedit
+ rather than the system one.
+
+ XXX: SOCKS support is currently disabled until I update the
+ autoconf support.
+
+Mon Apr 23 06:04:26 UTC 2007 lukem
+
+ * Merge NetBSD ftp from 20050610 to 20070418. Changes:
+ - Add '-s srcaddr'.
+ - Use IEC 60027-2 2^N based "KiB", "MiB" (etc) instead of
+ 10^n "KB", "MB", ...
+ - Recognize 307 redirect code.
+ - Suppress printing non-COMPLETE reply strings when EPSV/EPRT
+ fails and we fall-back to PASV/PORT. Should fix a problem
+ with the emacs ftp wrapper.
+ - Fix display of 'Continue with <cmd>' messages.
+ - Prevent segfaults in .netrc parsing.
+ - Flush stdout before each command; ftp as slave process on
+ a pipe should work.
+ - getpass() can return NULL in some implementations; cope.
+ - Support '-q quittime' when waiting for server replies.
+ - Various spelling & grammatical fixes in the manual.
+ - Plug some memory leaks.
+ - If a file upload (via -u) fails, return an non-zero exit
+ value based on the index of the file that caused the
+ problem (a la auto-fetch retrieval).
+ - Coverity fixes for CIDs: 873 874 875 1447 1448 2194 2195 3610
+ - Don't remove trailing character during auth_url()
+ - Fix progressbar display on narrow terminals (<43 columns)
+
+Fri Mar 16 06:00:14 UTC 2007 lukem
+
+ * Change the return value of the replacement gai_strerror()
+ from "char *" to "const char *", to match the current
+ standards.
+ Problem noted by Thomas Klausner.
+
+Thu Oct 26 07:24:22 UTC 2006 lukem
+
+ * Correctly parse "AM" and "PM" in the replacement strptime().
+ Problem noted by Kathryn Hogg.
+
+Sat Jun 25 06:27:00 UTC 2005 lukem
+
+ * Release as "tnftp 20050625"
+
+ * Simplify the detection & replacement of dirname() and fparseln()
+ and just use AC_REPLACE_FUNCS.
+ (We don't care if the vendor has a working version in -lgen or -lutil
+ instead of -lc; they'll get our replacement version in that case).
+ Fixes build issue on older Darwin where the previous autoconf check
+ wouldn't find dirname() in the default system libraries.
+
+ * Only provide a prototype for dirname() if we can't find one in
+ <libgen.h>
+
+ * Search for NS_IN6ADDRSZ instead of IN6ADDRSZ, since we use the
+ former and not the latter and older Darwin has the former.
+ (This allows INET6 support to be enabled on Darwin 7.9.0)
+
+Mon Jun 13 09:22:13 UTC 2005 lukem
+
+ * Tweak SOCKS5 support:
+ acconfig.h:
+ - fix a comment
+ - ensure close() is replaced
+ - list entries in the same order as aclocal.m4
+ (and the SOCKS5 FAQ)
+ aclocal.m4:
+ - ensure getpeername() is replaced
+ - don't replace listen() twice
+
+Fri Jun 10 04:39:33 UTC 2005 lukem
+
+ * Release as "tnftp 20050610"
+
+ * Add dependencies on ${srcdir}/../tnftp.h and ../config.h
+
+ * Merge NetBSD ftp from 20050609 to 20050610. Changes:
+ - Implement getline() to read a line into a buffer.
+ - Convert to use getline() instead of fgets() whenever reading
+ user input to ensure that an overly long input line doesn't
+ leave excess characters for the next input operation to
+ accidentally use as input.
+ - Zero out the password & account after we've finished with it.
+ - Consistently use getpass(3) (i.e, character echo suppressed)
+ when reading the account data. For some reason, historically
+ the "login" code suppressed echo for Account: yet the "user"
+ command did not!
+ - Display the hostname in the "getaddrinfo failed" warning.
+ - Appease some -Wcast-qual warnings. Fixing all of these
+ requires significant code refactoring. (mmm, legacy code).
+
+Thu Jun 9 16:49:05 UTC 2005 lukem
+
+ * src, libnetbsd: Excise RCSID block, rather than using
+ #if 0 ... #endif. The point was to minimise RCSID
+ conflicts, and the latter isn't helping there.
+
+ * Merge NetBSD ftp from 20050531 to 20050609. Changes:
+ - Only print the "Trying <address>..." message if verbose
+ and there's more than one struct addrinfo in the
+ getaddrinfo() result.
+ - Don't use non-standard "u_int".
+
+Wed Jun 1 15:08:01 UTC 2005 lukem
+
+ * Look for dirname(3), which may be in -lgen on IRIX, and
+ replace it if not found..
+
+Wed Jun 1 11:48:58 UTC 2005 lukem
+
+ * libnetbsd:
+ - Don't use non-standard: u_char u_short u_int.
+ - Use uint32_t instead of u_int32_t.
+ - Don't use register.
+
+ * libedit: Don't use non-standard uint or u_int.
+
+Tue May 31 02:23:08 UTC 2005 lukem
+
+ * tnftp.h: need <libgen.h> for dirname(3)
+
+ * Merge ftp from 20050513 to 20050531. Changes:
+ - Helps if the definition of xconnect() matches its
+ declaration....
+ - Fix some cast issues highlighted by Scott Reynolds using
+ gcc 4 on OSX.4
+ - Use size_t instead of int where appropriate.
+ - Make this compile on sparc64 (size_t != int).
+ - Printf field widths and size_t don't always mix well, so
+ cast to int. Fixes build problem for alpha.
+ - Some const cleanups.
+ - tab cleanup
+ - Improve method used in fileindir() to determine if `file'
+ is in or under `dir': realpath(3) on non-NetBSD systems may
+ fail if the target filename doesn't exist, so instead use
+ realpath(3) on the parent directory of `file'.
+ Per discussion with Todd Eigenschink.
+ - formatbuf(): fix %m and %M to use the hostname, not the
+ username.
+ - fetch_ftp(): preserve 'anonftp' across a disconnect() so
+ that multiple ftp auto-fetches on the same command line
+ login automatically.
+ - auto_fetch(): use an initialized volatile int to appease
+ IRIX cc.
+
+ * Merge libedit from NetBSD 20050105 to 20050531. Changes include:
+ - Rui Paulo: Incorrect tok_line and tok_str declarations.
+ - Remove clause 3 from the UCB license.
+ - Luke Mewburn: Don't abuse unconstify'ing a string
+ and writing to it, because you'll core dump. Also remove
+ extra const that gives pain to the irix compiler.
+ - Make sure we flush after we prepare when we are unbuffered
+ otherwise the prompt will not appear immediately.
+ - Terminate the arglist with a NULL instead of 0.
+ (Shuts up gcc4.x)
+
+Sat May 28 13:19:38 UTC 2005 lukem
+
+ * libnetbsd/strvis.c:
+ - Sync to NetBSD's vis.c 1.33:
+ Use malloc(3) instead of alloca(3).
+ - Remove extraenous #endif
+
+Fri May 27 05:46:58 UTC 2005 lukem
+
+ * libnetbsd/strvis.c: Sync to NetBSD's vis.c 1.30:
+ Use a more standard TNF license.
+
+ * libedit/sig.c: Include "src/progressbar.h" for xsignal_restart()
+ prototype.
+
+ * Ensure that fallback #define of __attribute__ is available.
+ Fixes build problem on HP-UX with cc.
+
+Thu May 26 14:21:08 UTC 2005 lukem
+
+ * Extend xpoll()'s HAVE_SELECT implementation to support POLLRDNORM,
+ POLLWRNORM, and POLLRDBAND - the latter using exceptfds.
+ Per discussion with Christos Zoulas.
+
+Mon May 16 13:33:27 UTC 2005 lukem
+
+ * Pull in <poll.h> or <sys/poll.h> if they exist even if we're
+ not using poll, as struct pollfd might exist in those.
+ Fixes build problem on OSX.3.
+
+ * Separate CPPFLAGS from CFLAGS.
+
+ * Sync various files in libnetbsd with the original versions
+ in NetBSD. Notable changes
+ - Convert 4 clause UCB license to 3 clause.
+ - Use strlcpy instead of strcpy.
+ - Update ISC copyright.
+ - Use NS_INADDRSZ, NS_IN6ADDRSZ and NS_INT16SZ instead of
+ equivalents without NS_ prefix.
+ - Use socklen_t instead of size_t where appropriate.
+ - Improve bounds checking.
+ - Don't update the size of allocated storage until
+ realloc succeeds.
+ - Fix comment about return value.
+ - Reverse the order of two loop invariant to make
+ 'strlcat(0, "foo", 0)' not get a SEGV.
+ - Use Todd C. Miller's latest copyright notice (more loose).
+ - Use "long long" instead of "quad" in various
+ comments & constants.
+ - Support VIS_HTTPSTYLE.
+ - Implement svis(), strsvis(), strsvisx(), strunvisx().
+
+ * Prefer poll over select when implementing replacement usleep().
+
+Sat May 14 04:44:35 UTC 2005 lukem
+
+ * Release "tnftp 20050514"
+
+ * Fail if we can't find a library with tgetent (needed for libedit).
+ NetBSD PR pkg/28925.
+ * Improve quoting when using various autoconf macros.
+
+ * Merge NetBSD-ftp 20050513:
+ - Correct the "optlen" argument passed to getsockopt(3) and
+ setsockopt(3) in various places. Fixes a problem noted by
+ Allen Briggs.
+ - Improve warning printed when connect(2) for the data
+ channel fails.
+
+Wed May 11 04:19:43 UTC 2005 lukem
+
+ * Release "tnftp 20050511"
+
+Wed May 11 04:10:01 UTC 2005 lukem
+
+ * Update the THANKS file.
+
+ * Only use poll() to implement xpoll() if it's available,
+ otherwise attempt to use select() if that's available,
+ otherwise #error.
+
+ * Detect if struct pollfd is available in <poll.h> or <sys/poll.h>.
+ Improve consistency in use of autoconf macros.
+
+Wed May 11 02:42:08 UTC 2005 lukem
+
+ * Merge NetBSD-ftp 20050511:
+ - Use socklen_t instead of int as the 5th argument to
+ getsockopt(). Improve invocation of setsockopt() and
+ associated failure messages.
+
+Wed May 11 01:46:29 UTC 2005 lukem
+
+ * Clean up RCSID usage in vendor-derived code, restoring original
+ IDs where possible.
+
+Wed May 11 00:08:16 UTC 2005 lukem
+
+ * Merge NetBSD-ftp 20050510:
+ - Prevent an overly-long input line causing a core dump when
+ editing is enabled.
+ Issue noted by Ryoji Kanai in FreeBSD Problem Report # 77158.
+ - Implement a timeout on the accept(2) in dataconn() and the
+ connect(2) in xconnect() by temporarily setting O_NONBLOCK
+ on the socket and using xpoll() to wait for the operation
+ to succeed. The timeout used is the '-q quittime' argument
+ (defaults to 60s for accept(2), and the system default for
+ connect(2)). Idea inspired by discussion with Chuck Cranor.
+ This may (indirectly) fix various problems with timeouts in
+ active mode through broken firewalls.
+ - Implement xpoll() as a wrapper around poll(2), to make it
+ easier to replace on systems without a functional poll(2).
+ Unconditionally use xpoll() instead of conditionally using
+ select(2) or poll(2).
+ - In fetch_url(), don't call freeaddrinfo(res0) too early, as
+ we use pointers to its contents later in the function.
+ Problem found by Onno van der Linden.
+ - Fix ftp url reget when globs are being used.
+ Provided by Mathieu Arnold <mat@FreeBSD.org>.
+ - Factor out common string processing code eliminating static
+ buffers, making functions that should be static be static,
+ and cleaning up const usage. Added a guard against buffer
+ overflow, but the domap function is a bit too complicated
+ to tackle right now.
+ - Clean up whitespace.
+ - Expand description of http_proxy by suggesting the use of
+ RFC 1738 '%xx' encoding for "unsafe URL" characters in
+ usernames and passwords.
+
+Wed Jan 5 05:53:59 UTC 2005 lukem
+
+ * For now, assume libedit is not up-to-date and use our own version.
+
+ * Merge libedit from NetBSD 20020605 to 20050105. Changes include:
+ - Improve vi-mode.
+ - Delete-previous-char and delete-next-char without an
+ argument are not supposed to modify the yank buffer in
+ emacs-mode.
+ - Improve incremental searching.
+ - Improve memory allocation & usage.
+ - Move UCB-licensed code from 4-clause to 3-clause.
+ - Make the tokenization functions publically available.
+ - Various tty access bug-fixes.
+ - Improve readline emulation.
+
+Tue Jan 4 13:33:40 UTC 2005 lukem
+
+ * Unixware 7.1.1 implements RFC 2133 (Basic Socket Interface
+ Extensions for IPv6) but not the successor RFC 2553. The configure
+ script detects this and decides that tnftp needs to compile its own
+ version of getaddrinfo(). This produces the error message
+ /usr/include/netdb.h:248: `getaddrinfo' previously defined here
+ because Unixware provides an implementation of getaddrinfo() in
+ netdb.h instead of a prototype declaration :-/. Since netdb.h
+ cannot be omitted, we will always get this definition and tnftp's
+ version of getaddrinfo will always create a conflict. This ugly
+ preprocessor hack works around the problem. Hints for a better
+ solution welcome. Fix from pkgsrc/net/tnftp.
+
+ * Workaround poll() being a compatibility function on Darwin 7
+ (MacOSX 10.3) by adding a custom test for _POLL_EMUL_H_ which
+ is defined in poll.h on some MacOSX 10.3 systems. Not all 10.3
+ systems have poll.h, so only do the poll() test if at least one
+ of the header files is found. Fix from pkgsrc/net/tnftp.
+
+ * Add a utimes() replacement (using utime()) for Interix.
+ From pkgsrc/net/tnftp.
+
+Mon Jan 3 10:21:57 UTC 2005 lukem
+
+ * Release "tnftp 20050103"
+
+ * Merge NetBSD-ftp 20050103:
+ - Forbid filenames returned from mget that aren't in (or below)
+ the current directory. The previous behaviour (of trusting
+ the remote server's response when retrieving the list of
+ files to mget with prompting disabled) has been in ftp
+ ~forever, and has been a "known issue" for a long time.
+ Recently an advisory was published by D.J. Bernstein on
+ behalf of Yosef Klein warning of the problems with the
+ previous behaviour, so to alleviate concern I've fixed
+ this with a sledgehammer.
+ - Remember the local cwd after any operation which may
+ change it.
+ - Use "remotecwd" instead of "remotepwd".
+ - Add (unsigned char) cast to ctype functions
+ - Ensure that "mname" is set in ls() and mls() so that an
+ aborted confirm() prints the correct name.
+ Problem highlighted & suggested fix from PR [bin/17766]
+ by Steve McClellan.
+ - If an ftp auto-fetch transfer is interrupted by SIGINT
+ (usually ^C), exit with 130 instead of 1 (or rarely, 0).
+ This allows an ftp auto-fetch in a shell loop to correctly
+ terminate the loop.
+ Should fix PR [pkg/26351], and possibly others.
+ - Save approximately 8K by not including http authentication,
+ extended status messages and help strings when the
+ appropriate options are set.
+ - Move UCB-licensed code from 4-clause to 3-clause licence.
+ Patches provided by Joel Baker in PR 22365, verified by
+ Alistair Crooks.
+ - Always decode %xx in a url's user & pass components.
+ - Only remember {WWW,Proxy}-Authenticate "Basic" challenges; no
+ point in tracking any others since ftp doesn't support them.
+ - Improve the parsing of HTTP responses.
+ - Don't base64 encode the trailing NUL in the HTTP basic auth
+ response. Problem noted by Eric Haszlakiewicz.
+ - Improve parsing of HTTP response headers to be more RFC2616
+ compliant, and skip LWS (linear white space; CR, LF, space,
+ tab) and the end of lines and between the field name and
+ the field value. This still isn't 100% compliant, since we
+ don't support "multi line" responses at this time.
+ This should fix PR [bin/22611] from TAMURA Kent (although I
+ can't easily find a http server to reproduce the problem
+ against.)
+ - Fix a minor memory leak when parsing HTTP response headers.
+ - Don't unnecessarily display a 401/407 error when running
+ with -V. Fix from PR [bin/18535] by Jeremy Reed.
+ - Don't warn about "ignored setsockopt" failures unless
+ debugging is enabled. Suggested by Todd Vierling.
+ - Allow empty passwords in ftp://user:@host/file auto-fetch
+ URLs, per RFC 1738. Requested by Simon Poole.
+ - correct URL syntax in comment
+ - Note potentially surprising file-saving behaviour in case
+ of HTTP redirects
+ - -n is ignored for auto-fetch transfers
+ - If connect(2) in xconnect() fails with EINTR, call select(2)
+ on the socket until it's writable or it fails with something
+ other than EINTR. This matches the behaviour in SUSv3, and
+ prevents the problem when pressing ^T (SIGINFO, which is
+ marked as restartable) during connection setup would cause
+ ftp to fail with EADDRINUSE or EALREADY when the second
+ connect(2) was attempted on the same socket. Problem found
+ and solution provided by Maxime Henrion <mux@freebsd.org>.
+ - Add -q to usage. From Kouichirou Hiratsuka in PR 26199.
+ - PR/25566: Anders Magnusson: ftp(1) do not like large TCP
+ windows. Limit it to 8M.
+
+Mon Oct 6 01:23:03 UTC 2003 lukem
+
+ * configure.in improvements:
+ - When testing for IN6ADDRSZ in <arpa/nameser.h>, pull in
+ <sys/types.h> first. From Stoned Elipot <seb @ NetBSD>
+ - Whitespace cleanup
+
+Mon Aug 25 11:45:45 UTC 2003 lukem
+
+ * Release "tnftp 20030825"
+
+ * Add autoconf test for <sys/syslimits.h>; Cygwin needs it for ARG_MAX.
+ Per discussion with Eugene Kotlyarov <ekot@protek36.esoo.ru>.
+
+Thu Jul 31 07:30:00 UTC 2003 lukem
+
+ * release "tnftp 20030731"
+
+ * merge ftp from NetBSD 20030731 to 20030731b:
+ - Work around broken ftp servers (notably ProFTPd) that can't
+ even follow RFC 2389, and skip any amount of whitespace
+ before a FEATure response. The RFC says 'single space' yet
+ ProFTPd puts two. Noted by DervishD <raul@pleyades.net>.
+ - Improve formatting of features[] debug dump.
+ - Invalidate remote directory completion cache if any command
+ which may change the remote contents completes successfully,
+ including: del, mdel, ren, mkdir, rmdir, quote, and all
+ upload commands. Patch from Yar Tikhiy <yar@freebsd.org>.
+
+ * merge ftp from NetBSD 20030228 to 20030731:
+ - $FTPUSERAGENT overrides the HTTP User-Agent header.
+ Based on patch from Douwe Kiela <virtus@wanadoo.nl>.
+ - Add about:tnftp
+ - Fix URL in about:netbsd
+ - netbsd.org->NetBSD.org
+ - strlcpy fix in fetch.c
+ - Uppercase "URL"
+ - fix a bogus error message when given a HTTP URL with a
+ trailing slash
+ - groff fixes in man page
+ - tweak progressbar.c copyright; the stuff jason did in util.c
+ wasn't migrated to this file
+ - Don't coredump when printing '%n' in the prompt if there's
+ no username yet.
+ Fix from Maxim Konovalov <maxim@freebsd.org>
+
+ * Add test for HAVE_IN6ADDRSZ (which older Darwin is lacking),
+ and only enable INET6 if it exists.
+ Patch from Amitai Schlair <schmonz@schmonz.com>.
+
+ * Improve ipv6 check for older linux systems that don't provide
+ sin6_scope_id.
+ Patch from YAMANO Yuji <Yamano_Yuji@tk-bay.ogis-ri.co.jp>.
+
+Fri Feb 28 10:57:30 UTC 2003 lukem
+
+ * tagged as "tnftp 2.0 beta1"
+
+Fri Feb 28 10:07:07 UTC 2003 lukem
+
+ * renamed to `tnftp' (from `lukemftp')
+
+ * renamed `libukem' to `libnetbsd'
+
+
+Mon Jun 17 06:50:13 UTC 2002 lukem
+
+ * #if USE_GLOB_H, use <glob.h> instead of "ftpglob.h".
+ Requested by Mike Heffner <mikeh@freebsd.org>
+
Mon Jun 10 08:12:35 UTC 2002 lukem
* crank FTP_VERSION from 1.6-beta1 to 1.6-beta2
@@ -223,7 +933,7 @@ Tue Oct 3 10:22:36 EST 2000 lukem
Mon Sep 25 21:52:12 EST 2000 lukem
* crank to version 1.5 beta5
-
+
Sun Sep 24 13:31:19 EST 2000 lukem
* merge ftp from NetBSD-current (20000924)
@@ -243,7 +953,7 @@ Sun Sep 24 13:31:19 EST 2000 lukem
- in progressmeter() perform the check for foregroundproc() a
little earlier
- removed unused variable `items' in list_vertical()
-
+
Sat Sep 23 15:43:34 EST 2000 lukem
* remove unused sverrno in warnx() and errx()
@@ -406,7 +1116,7 @@ Wed Aug 2 23:43:50 EST 2000 lukem
* update from NetBSD-current (20000802):
- rename NO_QUAD to NO_LONG_LONG, QUAD* -> LL* and add ULL*
(unsigned) equivalents. name change suggested by Klaus
- Klein <kjk@netbsd.org>
+ Klein <kjk@NetBSD.org>
- change defined(BSD4_4) || HAVE_SIN_LEN tests into
HAVE_SOCKADDR_SA_LEN, and set the latter if BSD4_4 exists
@@ -451,7 +1161,7 @@ Wed Jul 26 18:59:19 EST 2000 lukem
- add support for FEAT and OPTS commands with `features' and
`opts'. (from RFC 2389).
- add support for MLST & MLSD (machine parseble listings)
- with 'mlst', 'mlsd' and 'pmlsd' (mlsd |$PAGER) commands.
+ with 'mlst', 'mlsd' and 'pmlsd' (mlsd |$PAGER) commands.
(from draft-ietf-ftpext-mlst-11)
- rename remotesyst() to getremoteinfo(), and modify to parse
the result from FEAT (if supported), and take into account
@@ -473,7 +1183,7 @@ Wed Jul 26 18:59:19 EST 2000 lukem
- minor knf (indent goto labels by one space, etc).
- simply various command usage handlers by assuming that
argv != NULL except for quit() and disconnect().
- - errx?/warnx? audit. do not pass variable alone, use %s.
+ - errx?/warnx? audit. do not pass variable alone, use %s.
* check for issetugid() and don't use in libedit if it doesn't exist.
@@ -572,12 +1282,12 @@ Sun Jun 4 18:00:07 EST 2000 lukem
- do not pass scoped IPv6 address notation on Host: directive,
since scope identifier is local to the originating node.
do not allow scoped IPv6 address notation in URL, if it is
- via proxy.
+ via proxy.
- fixes from cgd:
* sanity check a length (otherwise certain bogus responses
can crash ftp)
* allow a transfer encoding type of `binary'; certain
- firewall vendors return this bogus type...
+ firewall vendors return this bogus type...
- make debugging output unambiguous on IPv6 numeric addrs
(don't use host:port)
- http://[::1]:8080/ is legal.
@@ -705,7 +1415,7 @@ Sun Nov 28 18:20:41 EST 1999 lukem
- implement xsl_init() and xsl_add(); error checking forms of
sl_{init,add}()
- fix bug where the second press of <TAB> on an empty word (i.e, list
- all options) may have resulted in an strncmp() against NULL.
+ all options) may have resulted in an strncmp() against NULL.
(detected by _DIAGASSERT())
- in cleanuppeer(), reset username to NULL after free()ing it.
fixes [bin/8870] by Wolfgang Rupprecht <wolfgang@wsrcc.com>
@@ -985,7 +1695,7 @@ Mon Oct 4 10:57:41 EST 1999 lukem
* Add support for --{en,dis}able-editcomplete (defaults to enabled),
which prevents libedit support from being compiled in.
- From Chris G. Demetriou <cgd@netbsd.org>
+ From Chris G. Demetriou <cgd@NetBSD.org>
Sun Oct 3 16:49:01 EST 1999 lukem
diff --git a/contrib/tnftp/INSTALL b/contrib/tnftp/INSTALL
new file mode 100644
index 0000000..7c5e96a
--- /dev/null
+++ b/contrib/tnftp/INSTALL
@@ -0,0 +1,60 @@
+INSTALLATION INTRODUCTION
+-------------------------
+
+This file describes how to compile and install tnftp on your system.
+
+ ============================================
+ = =
+ = NOTE: You will need an ANSI C compiler. =
+ = =
+ ============================================
+
+
+For most systems, execute the following to compile and install tnftp:
+ ./configure
+ make
+ make install
+
+A preformatted manual page (src/ftp.cat1) is also installed.
+If you wish to install the source (src/ftp.1), ensure that your system
+has up-to-date mandoc macros, such as those that are shipped with groff.
+
+
+CONFIGURATION OPTIONS
+---------------------
+
+tnftp is configured using an `autoconf' generated `configure'
+script. `configure' supports the following options:
+
+* The standard `autoconf configure' options, including:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [/usr/local]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ BSD or GNU make may be required for this to work.
+
+* Specific options:
+ --enable-editcomplete Turn on command line editing and completion.
+ (default: enabled)
+ --enable-ipv6 Enable IPv6 support (if your OS supports it).
+ (default: enabled)
+ --disable-largefile omit support for large files
+ --with-socks enable support for (Dante) SOCKS5 proxy
+
+The following environment variables can be set to override various
+compiler related settings.
+ CC=compiler specify name of the C compiler (default: gcc or cc)
+ CFLAGS=flags specify flags to C compiler (default: -O -g or just -O)
+ LDFLAGS=flags specify flags to linker (default: none)
+
+This can be achieved with:
+ env CC="compiler" CFLAGS="flags" LDFLAGS="flags" ./configure
+
+
+ ============================================
+ = =
+ = NOTE: You will need an ANSI C compiler. =
+ = =
+ ============================================
+
diff --git a/contrib/tnftp/Makefile.am b/contrib/tnftp/Makefile.am
new file mode 100644
index 0000000..b5b27da
--- /dev/null
+++ b/contrib/tnftp/Makefile.am
@@ -0,0 +1,13 @@
+## $NetBSD: Makefile.am,v 1.2 2010/01/04 06:24:58 lukem Exp $
+
+SUBDIRS = libnetbsd
+
+if USE_LIBEDIT
+SUBDIRS += libedit
+endif
+
+SUBDIRS += src
+
+EXTRA_DIST = \
+ todo \
+ tnftp.h
diff --git a/contrib/tnftp/Makefile.in b/contrib/tnftp/Makefile.in
new file mode 100644
index 0000000..8f92dd7
--- /dev/null
+++ b/contrib/tnftp/Makefile.in
@@ -0,0 +1,726 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@USE_LIBEDIT_TRUE@am__append_1 = libedit
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/tnftp_config.h.in \
+ $(top_srcdir)/configure COPYING ChangeLog INSTALL NEWS THANKS \
+ buildaux/config.guess buildaux/config.sub buildaux/depcomp \
+ buildaux/install-sh buildaux/ltmain.sh buildaux/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = tnftp_config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-dvi-recursive install-exec-recursive \
+ install-html-recursive install-info-recursive \
+ install-pdf-recursive install-ps-recursive install-recursive \
+ installcheck-recursive installdirs-recursive pdf-recursive \
+ ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+ distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = libnetbsd libedit src
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d "$(distdir)" \
+ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr "$(distdir)"; }; }
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NMEDIT = @NMEDIT@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = libnetbsd $(am__append_1) src
+EXTRA_DIST = \
+ todo \
+ tnftp.h
+
+all: tnftp_config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+tnftp_config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+ else :; fi
+
+stamp-h1: $(srcdir)/tnftp_config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status tnftp_config.h
+$(srcdir)/tnftp_config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f tnftp_config.h stamp-h1
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) tnftp_config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) tnftp_config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) tnftp_config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) tnftp_config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-lzma: distdir
+ tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+ $(am__remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lzma*) \
+ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @$(am__cd) '$(distuninstallcheck_dir)' \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile tnftp_config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+ ctags-recursive install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+ all all-am am--refresh check check-am clean clean-generic \
+ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+ dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
+ distcheck distclean distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-recursive uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/contrib/tnftp/NEWS b/contrib/tnftp/NEWS
new file mode 100644
index 0000000..7647a81
--- /dev/null
+++ b/contrib/tnftp/NEWS
@@ -0,0 +1,36 @@
+This is tnftp version 20091122.
+
+Changes in tnftp from 20090606 to 20091122:
+
+ Portability fixes.
+
+Changes in tnftp from 20090520 to 20090606:
+
+ Portability fixes.
+
+Changes in tnftp from 20070806 to 20090520:
+
+ Fix intermittent "Alarm clock" error.
+
+ Add epsv6 and epsv to disable extended passive mode for IPv6 or
+ both IPv4 and IPv6 respectively.
+
+ Improve parsing of HTTP chunked transfers per RFC2616.
+
+ Use the service name to getaddrinfo() (along with the host name),
+ so that features such as DNS Service Discovery will work.
+
+ Fix various compiler warnings.
+
+
+Changes in tnftp from 20050625 to 20070806:
+
+ Implement '-s srcaddr' to set the local IP address for
+ all connections.
+
+ Support '-q quittime' when waiting for server replies.
+
+ Use IEC 60027-2 "KiB", "MiB" (etc) instead of "KB", "MB", ...
+
+ Portability fixes, including for FreeBSD, Mac OS X, and Solaris.
+
diff --git a/contrib/tnftp/README b/contrib/tnftp/README
new file mode 100644
index 0000000..2f81da6
--- /dev/null
+++ b/contrib/tnftp/README
@@ -0,0 +1,68 @@
+WHAT IS TNFTP?
+--------------
+
+`tnftp' is a `port' of the NetBSD FTP client to other systems.
+See http://www.NetBSD.org/ for more details about NetBSD.
+
+tnftp was formerly known as `lukemftp'
+It was renamed to `tnftp' by Luke Mewburn in February 2003.
+
+The enhancements over the standard ftp client in 4.4BSD (and
+derivatives) include:
+ * command-line editing within ftp
+ * command-line fetching of URLS, including support for:
+ - http proxies (see $http_proxy, $ftp_proxy)
+ - authentication
+ * configurable prompt
+ * context sensitive command and filename completion
+ * dynamic progress bar
+ * feature negotiation extensions from RFC 2389
+ (see `feat' and `remopts')
+ * extensions to ftp from the IETF ftpext working group
+ (see `mlsd' and `mlst')
+ * IPv6 support (from the WIDE project)
+ * modification time preservation
+ * paging of local and remote files, and of directory listings
+ (see `lpage', `page', `pdir')
+ * passive mode support, with fallback to active mode
+ * retrieval of filenames listed in a given file (see `fget')
+ * `set option' override of ftp environment variables
+ * TIS Firewall Toolkit gate ftp proxy support (see `gate')
+ * transfer-rate throttling (see `-T', `rate')
+ * uploading of files on the command line (see `-u')
+ * (Dante) SOCKS5 support
+
+Previous features, currently disabled until a test system is available:
+ * SOCKS4 support
+
+
+INSTALLATION
+------------
+
+Refer to `INSTALL' for more information on how to compile and install tnftp.
+
+
+FEEDBACK / BUG REPORTS
+----------------------
+
+Please email feedback back to the maintainer:
+ Luke Mewburn <lukem@NetBSD.org>.
+
+
+COPYRIGHT
+---------
+
+tnftp is covered by a BSD-style copyright notice.
+Please refer to the file `COPYING' for more information.
+
+
+AVAILABILITY
+------------
+
+The primary ftp site for tnftp is:
+ ftp://ftp.NetBSD.org/pub/NetBSD/misc/tnftp/
+
+
+DOCUMENT REFERENCE
+------------------
+$NetBSD: README,v 1.10 2007/08/06 01:58:57 lukem Exp $
diff --git a/contrib/tnftp/THANKS b/contrib/tnftp/THANKS
new file mode 100644
index 0000000..93e12af
--- /dev/null
+++ b/contrib/tnftp/THANKS
@@ -0,0 +1,53 @@
+Whilst a lot of the work in tnftp (both the original sources in NetBSD
+and this port) was done by Luke Mewburn, it would not be as usable
+without the enhancements, bug fixes, or input from the following people:
+
+Amitai Schlair <schmonz@schmonz.com>
+Anders Dinsen <anders@dinsen.net>
+Anders Magnusson <ragge@ltu.se>
+Arkadiusz Miskiewicz <misiek@pld.org.pl>
+Brian Stark <bstark1990@netscape.net>
+Chris G. Demetriou <cgd@NetBSD.org>
+Christos Zoulas <christos@NetBSD.org>
+Dan Winship <danw@mit.edu>
+Darren Reed <darrenr@pobox.com>
+David Brownlee <abs@mono.org>
+David Carrel <carrel@NetBSD.org>
+DervishD <raul@pleyades.net>
+Douwe Kiela <virtus@wanadoo.nl>
+Eugene Kotlyarov <ekot@protek36.esoo.ru>
+Geoff Wing <mason@primenet.com.au>
+Giles Lean <giles@nemeton.com.au>
+Havard Eidnes <Havard.Eidnes@runit.sintef.no>
+Hubert Feyrer <hubert@feyrer.de>
+ITOH Yasufumi <itohy@NetBSD.org>
+Jason R. Thorpe <thorpej@NetBSD.org>
+John Hawkinson <jhawk@mit.edu>
+Joseph S. Myers <jsm28@cam.ac.uk>
+Jun-ichiro itojun Hagino <itojun@NetBSD.org>
+Kimmo Suominen <kim@tac.nyc.ny.us>
+Klaus Klein <kleink@NetBSD.org>
+Launey Thomas <ljt@alum.mit.edu>
+Luke Mewburn <lukem@NetBSD.org>
+Marc Horowitz <marc@mit.edu>
+Mathieu Arnold <mat@FreeBSD.org>
+Matthew R. Green <mrg@eterna.com.au>
+Matthias Pfaller <leo@dachau.marco.de>
+Matthias Scheler <tron@zhadum.de>
+Maxim Konovalov <maxim@FreeBSD.org>
+Maxime Henrion <mux@FreeBSD.org>
+Michael L. Hitch <osymh@terra.oscs.montana.edu>
+Mike Heffner <mikeh@FreeBSD.org>
+Onno van der Linden <o.vd.linden@quicknet.nl>
+Ruslan Ermilov <ru@FreeBSD.org>
+Ryoji Kanai <rkanai@eeye.com>
+Scott Aaron Bamford <sab@ansic.net>
+Simon Burge <simonb@thistledown.com.au>
+Steve McClellan <steve.mcclellan@radisys.com>
+TAMURA Kent <kent@NetBSD.org>
+Stoned Elipot <seb@NetBSD.org>
+Todd C. Miller <Todd.Miller@courtesan.com>
+YAMANO Yuji <yyamano@NetBSD.org>
+Yar Tikhiy <yar@FreeBSD.org>
+
+Apologies to anyone missed.
diff --git a/contrib/tnftp/src/Makefile.am b/contrib/tnftp/src/Makefile.am
new file mode 100644
index 0000000..8ac32f9
--- /dev/null
+++ b/contrib/tnftp/src/Makefile.am
@@ -0,0 +1,52 @@
+## $NetBSD: Makefile.am,v 1.2 2010/01/04 06:24:20 lukem Exp $
+
+bin_PROGRAMS = tnftp
+
+tnftp_SOURCES = \
+ cmds.c \
+ cmdtab.c \
+ complete.c \
+ domacro.c \
+ fetch.c \
+ ftp.c \
+ main.c \
+ progressbar.c \
+ ruserpass.c \
+ util.c
+
+tnftp_CPPFLAGS = \
+ -DHAVE_TNFTPD_H=1 \
+ -D_DEFAULT_CONFDIR=\"${sysconfdir}\" \
+ -I$(srcdir) \
+ -I$(top_srcdir)/libnetbsd \
+ -I$(top_srcdir) \
+ -I$(top_builddir)
+
+tnftp_LDADD = \
+ ../libnetbsd/libnetbsd.la
+
+
+if USE_LIBEDIT
+tnftp_CPPFLAGS += \
+ -I$(top_srcdir)/libedit
+
+tnftp_LDADD += \
+ ../libedit/libedit.la
+endif
+
+
+man1_MANS = \
+ tnftp.1
+
+tnftp.1: ftp.1
+ cp $(srcdir)/ftp.1 tnftp.1
+
+CLEANFILES = \
+ tnftp.1
+
+EXTRA_DIST = \
+ extern.h \
+ ftp.1 \
+ ftp_var.h \
+ progressbar.h \
+ version.h
diff --git a/contrib/tnftp/src/Makefile.in b/contrib/tnftp/src/Makefile.in
new file mode 100644
index 0000000..e11a81a
--- /dev/null
+++ b/contrib/tnftp/src/Makefile.in
@@ -0,0 +1,809 @@
+# Makefile.in generated by automake 1.11 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = tnftp$(EXEEXT)
+@USE_LIBEDIT_TRUE@am__append_1 = \
+@USE_LIBEDIT_TRUE@ -I$(top_srcdir)/libedit
+
+@USE_LIBEDIT_TRUE@am__append_2 = \
+@USE_LIBEDIT_TRUE@ ../libedit/libedit.la
+
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/tnftp_config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_tnftp_OBJECTS = tnftp-cmds.$(OBJEXT) tnftp-cmdtab.$(OBJEXT) \
+ tnftp-complete.$(OBJEXT) tnftp-domacro.$(OBJEXT) \
+ tnftp-fetch.$(OBJEXT) tnftp-ftp.$(OBJEXT) tnftp-main.$(OBJEXT) \
+ tnftp-progressbar.$(OBJEXT) tnftp-ruserpass.$(OBJEXT) \
+ tnftp-util.$(OBJEXT)
+tnftp_OBJECTS = $(am_tnftp_OBJECTS)
+tnftp_DEPENDENCIES = ../libnetbsd/libnetbsd.la $(am__append_2)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+DEFAULT_INCLUDES =
+depcomp = $(SHELL) $(top_srcdir)/buildaux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(tnftp_SOURCES)
+DIST_SOURCES = $(tnftp_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man1_MANS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NMEDIT = @NMEDIT@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+tnftp_SOURCES = \
+ cmds.c \
+ cmdtab.c \
+ complete.c \
+ domacro.c \
+ fetch.c \
+ ftp.c \
+ main.c \
+ progressbar.c \
+ ruserpass.c \
+ util.c
+
+tnftp_CPPFLAGS = -DHAVE_TNFTPD_H=1 \
+ -D_DEFAULT_CONFDIR=\"${sysconfdir}\" -I$(srcdir) \
+ -I$(top_srcdir)/libnetbsd -I$(top_srcdir) -I$(top_builddir) \
+ $(am__append_1)
+tnftp_LDADD = ../libnetbsd/libnetbsd.la $(am__append_2)
+man1_MANS = \
+ tnftp.1
+
+CLEANFILES = \
+ tnftp.1
+
+EXTRA_DIST = \
+ extern.h \
+ ftp.1 \
+ ftp_var.h \
+ progressbar.h \
+ version.h
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+tnftp$(EXEEXT): $(tnftp_OBJECTS) $(tnftp_DEPENDENCIES)
+ @rm -f tnftp$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(tnftp_OBJECTS) $(tnftp_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-cmds.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-cmdtab.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-complete.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-domacro.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-fetch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-ftp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-progressbar.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-ruserpass.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnftp-util.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+tnftp-cmds.o: cmds.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-cmds.o -MD -MP -MF $(DEPDIR)/tnftp-cmds.Tpo -c -o tnftp-cmds.o `test -f 'cmds.c' || echo '$(srcdir)/'`cmds.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-cmds.Tpo $(DEPDIR)/tnftp-cmds.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmds.c' object='tnftp-cmds.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-cmds.o `test -f 'cmds.c' || echo '$(srcdir)/'`cmds.c
+
+tnftp-cmds.obj: cmds.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-cmds.obj -MD -MP -MF $(DEPDIR)/tnftp-cmds.Tpo -c -o tnftp-cmds.obj `if test -f 'cmds.c'; then $(CYGPATH_W) 'cmds.c'; else $(CYGPATH_W) '$(srcdir)/cmds.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-cmds.Tpo $(DEPDIR)/tnftp-cmds.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmds.c' object='tnftp-cmds.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-cmds.obj `if test -f 'cmds.c'; then $(CYGPATH_W) 'cmds.c'; else $(CYGPATH_W) '$(srcdir)/cmds.c'; fi`
+
+tnftp-cmdtab.o: cmdtab.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-cmdtab.o -MD -MP -MF $(DEPDIR)/tnftp-cmdtab.Tpo -c -o tnftp-cmdtab.o `test -f 'cmdtab.c' || echo '$(srcdir)/'`cmdtab.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-cmdtab.Tpo $(DEPDIR)/tnftp-cmdtab.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmdtab.c' object='tnftp-cmdtab.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-cmdtab.o `test -f 'cmdtab.c' || echo '$(srcdir)/'`cmdtab.c
+
+tnftp-cmdtab.obj: cmdtab.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-cmdtab.obj -MD -MP -MF $(DEPDIR)/tnftp-cmdtab.Tpo -c -o tnftp-cmdtab.obj `if test -f 'cmdtab.c'; then $(CYGPATH_W) 'cmdtab.c'; else $(CYGPATH_W) '$(srcdir)/cmdtab.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-cmdtab.Tpo $(DEPDIR)/tnftp-cmdtab.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmdtab.c' object='tnftp-cmdtab.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-cmdtab.obj `if test -f 'cmdtab.c'; then $(CYGPATH_W) 'cmdtab.c'; else $(CYGPATH_W) '$(srcdir)/cmdtab.c'; fi`
+
+tnftp-complete.o: complete.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-complete.o -MD -MP -MF $(DEPDIR)/tnftp-complete.Tpo -c -o tnftp-complete.o `test -f 'complete.c' || echo '$(srcdir)/'`complete.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-complete.Tpo $(DEPDIR)/tnftp-complete.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='complete.c' object='tnftp-complete.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-complete.o `test -f 'complete.c' || echo '$(srcdir)/'`complete.c
+
+tnftp-complete.obj: complete.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-complete.obj -MD -MP -MF $(DEPDIR)/tnftp-complete.Tpo -c -o tnftp-complete.obj `if test -f 'complete.c'; then $(CYGPATH_W) 'complete.c'; else $(CYGPATH_W) '$(srcdir)/complete.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-complete.Tpo $(DEPDIR)/tnftp-complete.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='complete.c' object='tnftp-complete.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-complete.obj `if test -f 'complete.c'; then $(CYGPATH_W) 'complete.c'; else $(CYGPATH_W) '$(srcdir)/complete.c'; fi`
+
+tnftp-domacro.o: domacro.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-domacro.o -MD -MP -MF $(DEPDIR)/tnftp-domacro.Tpo -c -o tnftp-domacro.o `test -f 'domacro.c' || echo '$(srcdir)/'`domacro.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-domacro.Tpo $(DEPDIR)/tnftp-domacro.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='domacro.c' object='tnftp-domacro.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-domacro.o `test -f 'domacro.c' || echo '$(srcdir)/'`domacro.c
+
+tnftp-domacro.obj: domacro.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-domacro.obj -MD -MP -MF $(DEPDIR)/tnftp-domacro.Tpo -c -o tnftp-domacro.obj `if test -f 'domacro.c'; then $(CYGPATH_W) 'domacro.c'; else $(CYGPATH_W) '$(srcdir)/domacro.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-domacro.Tpo $(DEPDIR)/tnftp-domacro.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='domacro.c' object='tnftp-domacro.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-domacro.obj `if test -f 'domacro.c'; then $(CYGPATH_W) 'domacro.c'; else $(CYGPATH_W) '$(srcdir)/domacro.c'; fi`
+
+tnftp-fetch.o: fetch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-fetch.o -MD -MP -MF $(DEPDIR)/tnftp-fetch.Tpo -c -o tnftp-fetch.o `test -f 'fetch.c' || echo '$(srcdir)/'`fetch.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-fetch.Tpo $(DEPDIR)/tnftp-fetch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fetch.c' object='tnftp-fetch.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-fetch.o `test -f 'fetch.c' || echo '$(srcdir)/'`fetch.c
+
+tnftp-fetch.obj: fetch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-fetch.obj -MD -MP -MF $(DEPDIR)/tnftp-fetch.Tpo -c -o tnftp-fetch.obj `if test -f 'fetch.c'; then $(CYGPATH_W) 'fetch.c'; else $(CYGPATH_W) '$(srcdir)/fetch.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-fetch.Tpo $(DEPDIR)/tnftp-fetch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fetch.c' object='tnftp-fetch.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-fetch.obj `if test -f 'fetch.c'; then $(CYGPATH_W) 'fetch.c'; else $(CYGPATH_W) '$(srcdir)/fetch.c'; fi`
+
+tnftp-ftp.o: ftp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-ftp.o -MD -MP -MF $(DEPDIR)/tnftp-ftp.Tpo -c -o tnftp-ftp.o `test -f 'ftp.c' || echo '$(srcdir)/'`ftp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-ftp.Tpo $(DEPDIR)/tnftp-ftp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ftp.c' object='tnftp-ftp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-ftp.o `test -f 'ftp.c' || echo '$(srcdir)/'`ftp.c
+
+tnftp-ftp.obj: ftp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-ftp.obj -MD -MP -MF $(DEPDIR)/tnftp-ftp.Tpo -c -o tnftp-ftp.obj `if test -f 'ftp.c'; then $(CYGPATH_W) 'ftp.c'; else $(CYGPATH_W) '$(srcdir)/ftp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-ftp.Tpo $(DEPDIR)/tnftp-ftp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ftp.c' object='tnftp-ftp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-ftp.obj `if test -f 'ftp.c'; then $(CYGPATH_W) 'ftp.c'; else $(CYGPATH_W) '$(srcdir)/ftp.c'; fi`
+
+tnftp-main.o: main.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-main.o -MD -MP -MF $(DEPDIR)/tnftp-main.Tpo -c -o tnftp-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-main.Tpo $(DEPDIR)/tnftp-main.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='tnftp-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+
+tnftp-main.obj: main.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-main.obj -MD -MP -MF $(DEPDIR)/tnftp-main.Tpo -c -o tnftp-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-main.Tpo $(DEPDIR)/tnftp-main.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='tnftp-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
+
+tnftp-progressbar.o: progressbar.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-progressbar.o -MD -MP -MF $(DEPDIR)/tnftp-progressbar.Tpo -c -o tnftp-progressbar.o `test -f 'progressbar.c' || echo '$(srcdir)/'`progressbar.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-progressbar.Tpo $(DEPDIR)/tnftp-progressbar.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='progressbar.c' object='tnftp-progressbar.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-progressbar.o `test -f 'progressbar.c' || echo '$(srcdir)/'`progressbar.c
+
+tnftp-progressbar.obj: progressbar.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-progressbar.obj -MD -MP -MF $(DEPDIR)/tnftp-progressbar.Tpo -c -o tnftp-progressbar.obj `if test -f 'progressbar.c'; then $(CYGPATH_W) 'progressbar.c'; else $(CYGPATH_W) '$(srcdir)/progressbar.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-progressbar.Tpo $(DEPDIR)/tnftp-progressbar.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='progressbar.c' object='tnftp-progressbar.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-progressbar.obj `if test -f 'progressbar.c'; then $(CYGPATH_W) 'progressbar.c'; else $(CYGPATH_W) '$(srcdir)/progressbar.c'; fi`
+
+tnftp-ruserpass.o: ruserpass.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-ruserpass.o -MD -MP -MF $(DEPDIR)/tnftp-ruserpass.Tpo -c -o tnftp-ruserpass.o `test -f 'ruserpass.c' || echo '$(srcdir)/'`ruserpass.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-ruserpass.Tpo $(DEPDIR)/tnftp-ruserpass.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ruserpass.c' object='tnftp-ruserpass.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-ruserpass.o `test -f 'ruserpass.c' || echo '$(srcdir)/'`ruserpass.c
+
+tnftp-ruserpass.obj: ruserpass.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-ruserpass.obj -MD -MP -MF $(DEPDIR)/tnftp-ruserpass.Tpo -c -o tnftp-ruserpass.obj `if test -f 'ruserpass.c'; then $(CYGPATH_W) 'ruserpass.c'; else $(CYGPATH_W) '$(srcdir)/ruserpass.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-ruserpass.Tpo $(DEPDIR)/tnftp-ruserpass.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ruserpass.c' object='tnftp-ruserpass.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-ruserpass.obj `if test -f 'ruserpass.c'; then $(CYGPATH_W) 'ruserpass.c'; else $(CYGPATH_W) '$(srcdir)/ruserpass.c'; fi`
+
+tnftp-util.o: util.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-util.o -MD -MP -MF $(DEPDIR)/tnftp-util.Tpo -c -o tnftp-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-util.Tpo $(DEPDIR)/tnftp-util.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='util.c' object='tnftp-util.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c
+
+tnftp-util.obj: util.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tnftp-util.obj -MD -MP -MF $(DEPDIR)/tnftp-util.Tpo -c -o tnftp-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tnftp-util.Tpo $(DEPDIR)/tnftp-util.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='util.c' object='tnftp-util.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tnftp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tnftp-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man1_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
+ { for i in $$list; do echo "$$i"; done; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ test -z "$$files" || { \
+ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @list='$(MANS)'; if test -n "$$list"; then \
+ list=`for p in $$list; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+ if test -n "$$list" && \
+ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
+ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+ echo " typically \`make maintainer-clean' will remove them" >&2; \
+ exit 1; \
+ else :; fi; \
+ else :; fi
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-man1 install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-man \
+ uninstall-man1
+
+
+tnftp.1: ftp.1
+ cp $(srcdir)/ftp.1 tnftp.1
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/contrib/lukemftp/src/cmds.c b/contrib/tnftp/src/cmds.c
index 69dbd18..7be3a77 100644
--- a/contrib/lukemftp/src/cmds.c
+++ b/contrib/tnftp/src/cmds.c
@@ -1,7 +1,8 @@
-/* $NetBSD: cmds.c,v 1.112 2005/04/11 01:49:31 lukem Exp $ */
+/* $NetBSD: cmds.c,v 1.17 2010/01/12 06:55:47 lukem Exp $ */
+/* from NetBSD: cmds.c,v 1.130 2009/07/13 19:05:41 roy Exp */
/*-
- * Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -19,13 +20,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -98,12 +92,16 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94";
#else
-__RCSID("$NetBSD: cmds.c,v 1.112 2005/04/11 01:49:31 lukem Exp $");
+__RCSID(" NetBSD: cmds.c,v 1.130 2009/07/13 19:05:41 roy Exp ");
#endif
#endif /* not lint */
@@ -122,57 +120,73 @@ __RCSID("$NetBSD: cmds.c,v 1.112 2005/04/11 01:49:31 lukem Exp $");
#include <limits.h>
#include <netdb.h>
#include <paths.h>
+#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
-#include <libutil.h>
+
+#endif /* tnftp */
#include "ftp_var.h"
#include "version.h"
-struct types {
- char *t_name;
- char *t_mode;
- int t_type;
- char *t_arg;
+static struct types {
+ const char *t_name;
+ const char *t_mode;
+ int t_type;
+ const char *t_arg;
} types[] = {
{ "ascii", "A", TYPE_A, 0 },
{ "binary", "I", TYPE_I, 0 },
{ "image", "I", TYPE_I, 0 },
{ "ebcdic", "E", TYPE_E, 0 },
{ "tenex", "L", TYPE_L, bytename },
- { NULL }
+ { NULL, NULL, 0, NULL }
};
-sigjmp_buf jabort;
-const char *mname;
+static sigjmp_buf jabort;
static int confirm(const char *, const char *);
+static void mintr(int);
+static void mabort(const char *);
+static void set_type(const char *);
static const char *doprocess(char *, size_t, const char *, int, int, int);
static const char *domap(char *, size_t, const char *);
static const char *docase(char *, size_t, const char *);
static const char *dotrans(char *, size_t, const char *);
+/*
+ * Confirm if "cmd" is to be performed upon "file".
+ * If "file" is NULL, generate a "Continue with" prompt instead.
+ */
static int
confirm(const char *cmd, const char *file)
{
- char line[BUFSIZ];
+ const char *errormsg;
+ char cline[BUFSIZ];
+ const char *promptleft, *promptright;
if (!interactive || confirmrest)
return (1);
+ if (file == NULL) {
+ promptleft = "Continue with";
+ promptright = cmd;
+ } else {
+ promptleft = cmd;
+ promptright = file;
+ }
while (1) {
- fprintf(ttyout, "%s %s [anpqy?]? ", cmd, file);
+ fprintf(ttyout, "%s %s [anpqy?]? ", promptleft, promptright);
(void)fflush(ttyout);
- if (fgets(line, sizeof(line), stdin) == NULL) {
+ if (get_line(stdin, cline, sizeof(cline), &errormsg) < 0) {
mflag = 0;
- fprintf(ttyout, "\nEOF received; %s aborted\n", mname);
- clearerr(stdin);
+ fprintf(ttyout, "%s; %s aborted\n", errormsg, cmd);
return (0);
}
- switch (tolower((unsigned char)*line)) {
+ switch (tolower((unsigned char)*cline)) {
case 'a':
confirmrest = 1;
fprintf(ttyout,
@@ -184,7 +198,7 @@ confirm(const char *cmd, const char *file)
break;
case 'q':
mflag = 0;
- fprintf(ttyout, "%s aborted.\n", mname);
+ fprintf(ttyout, "%s aborted.\n", cmd);
/* FALLTHROUGH */
case 'n':
return (0);
@@ -212,12 +226,11 @@ void
settype(int argc, char *argv[])
{
struct types *p;
- int comret;
if (argc == 0 || argc > 2) {
- char *sep;
+ const char *sep;
- fprintf(ttyout, "usage: %s [", argv[0]);
+ UPRINTF("usage: %s [", argv[0]);
sep = " ";
for (p = types; p->t_name; p++) {
fprintf(ttyout, "%s%s", sep, p->t_name);
@@ -232,11 +245,20 @@ settype(int argc, char *argv[])
code = 0;
return;
}
+ set_type(argv[1]);
+}
+
+void
+set_type(const char *ttype)
+{
+ struct types *p;
+ int comret;
+
for (p = types; p->t_name; p++)
- if (strcmp(argv[1], p->t_name) == 0)
+ if (strcmp(ttype, p->t_name) == 0)
break;
if (p->t_name == 0) {
- fprintf(ttyout, "%s: unknown mode.\n", argv[1]);
+ fprintf(ttyout, "%s: unknown mode.\n", ttype);
code = -1;
return;
}
@@ -265,14 +287,13 @@ changetype(int newtype, int show)
newtype = TYPE_I;
if (newtype == curtype)
return;
- if (debug == 0 && show == 0)
+ if (ftp_debug == 0 && show == 0)
verbose = 0;
for (p = types; p->t_name; p++)
if (newtype == p->t_type)
break;
if (p->t_name == 0) {
- warnx("internal error: unknown type %d.", newtype);
- return;
+ errx(1, "changetype: unknown type %d", newtype);
}
if (newtype == TYPE_L && bytename[0] != '\0')
comret = command("TYPE %s %s", p->t_mode, bytename);
@@ -283,12 +304,6 @@ changetype(int newtype, int show)
verbose = oldverbose;
}
-char *stype[] = {
- "type",
- "",
- 0
-};
-
/*
* Set binary transfer type.
*/
@@ -298,12 +313,11 @@ setbinary(int argc, char *argv[])
{
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
- stype[1] = "binary";
- settype(2, stype);
+ set_type("binary");
}
/*
@@ -315,12 +329,11 @@ setascii(int argc, char *argv[])
{
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
- stype[1] = "ascii";
- settype(2, stype);
+ set_type("ascii");
}
/*
@@ -332,12 +345,11 @@ settenex(int argc, char *argv[])
{
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
- stype[1] = "tenex";
- settype(2, stype);
+ set_type("tenex");
}
/*
@@ -349,7 +361,7 @@ setftmode(int argc, char *argv[])
{
if (argc != 2) {
- fprintf(ttyout, "usage: %s mode-name\n", argv[0]);
+ UPRINTF("usage: %s mode-name\n", argv[0]);
code = -1;
return;
}
@@ -366,7 +378,7 @@ setform(int argc, char *argv[])
{
if (argc != 2) {
- fprintf(ttyout, "usage: %s format\n", argv[0]);
+ UPRINTF("usage: %s format\n", argv[0]);
code = -1;
return;
}
@@ -383,7 +395,7 @@ setstruct(int argc, char *argv[])
{
if (argc != 2) {
- fprintf(ttyout, "usage: %s struct-mode\n", argv[0]);
+ UPRINTF("usage: %s struct-mode\n", argv[0]);
code = -1;
return;
}
@@ -398,7 +410,7 @@ void
put(int argc, char *argv[])
{
char buf[MAXPATHLEN];
- char *cmd;
+ const char *cmd;
int loc = 0;
char *locfile;
const char *remfile;
@@ -412,8 +424,7 @@ put(int argc, char *argv[])
goto usage;
if ((argc < 3 && !another(&argc, &argv, "remote-file")) || argc > 3) {
usage:
- fprintf(ttyout, "usage: %s local-file [remote-file]\n",
- argv[0]);
+ UPRINTF("usage: %s local-file [remote-file]\n", argv[0]);
code = -1;
return;
}
@@ -457,15 +468,14 @@ mput(int argc, char *argv[])
const char *tp;
if (argc == 0 || (argc == 1 && !another(&argc, &argv, "local-files"))) {
- fprintf(ttyout, "usage: %s local-files\n", argv[0]);
+ UPRINTF("usage: %s local-files\n", argv[0]);
code = -1;
return;
}
- mname = argv[0];
mflag = 1;
oldintr = xsignal(SIGINT, mintr);
if (sigsetjmp(jabort, 1))
- mabort();
+ mabort(argv[0]);
if (proxy) {
char *cp;
@@ -483,7 +493,7 @@ mput(int argc, char *argv[])
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
- if (confirm("Continue with", "mput")) {
+ if (confirm(argv[0], NULL)) {
mflag++;
}
interactive = ointer;
@@ -507,7 +517,7 @@ mput(int argc, char *argv[])
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
- if (confirm("Continue with", "mput")) {
+ if (confirm(argv[0], NULL)) {
mflag++;
}
interactive = ointer;
@@ -519,7 +529,7 @@ mput(int argc, char *argv[])
memset(&gl, 0, sizeof(gl));
flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_TILDE;
if (glob(argv[i], flags, NULL, &gl) || gl.gl_pathc == 0) {
- warnx("%s: not found", argv[i]);
+ warnx("Glob pattern `%s' not found", argv[i]);
globfree(&gl);
continue;
}
@@ -535,7 +545,7 @@ mput(int argc, char *argv[])
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
- if (confirm("Continue with", "mput")) {
+ if (confirm(argv[0], NULL)) {
mflag++;
}
interactive = ointer;
@@ -569,7 +579,7 @@ get(int argc, char *argv[])
* If restartit is -1, restart the xfer only if the remote file is newer.
*/
int
-getit(int argc, char *argv[], int restartit, const char *mode)
+getit(int argc, char *argv[], int restartit, const char *gmode)
{
int loc, rval;
char *remfile, *olocfile;
@@ -586,8 +596,7 @@ getit(int argc, char *argv[], int restartit, const char *mode)
goto usage;
if ((argc < 3 && !another(&argc, &argv, "local-file")) || argc > 3) {
usage:
- fprintf(ttyout, "usage: %s remote-file [local-file]\n",
- argv[0]);
+ UPRINTF("usage: %s remote-file [local-file]\n", argv[0]);
code = -1;
return (0);
}
@@ -610,7 +619,7 @@ getit(int argc, char *argv[], int restartit, const char *mode)
ret = stat(locfile, &stbuf);
if (restartit == 1) {
if (ret < 0) {
- warn("local: %s", locfile);
+ warn("Can't stat `%s'", locfile);
goto freegetit;
}
restart_point = stbuf.st_size;
@@ -629,7 +638,7 @@ getit(int argc, char *argv[], int restartit, const char *mode)
}
}
- recvrequest("RETR", locfile, remfile, mode,
+ recvrequest("RETR", locfile, remfile, gmode,
remfile != argv[1] || locfile != argv[2], loc);
restart_point = 0;
freegetit:
@@ -638,7 +647,7 @@ getit(int argc, char *argv[], int restartit, const char *mode)
}
/* ARGSUSED */
-void
+static void
mintr(int signo)
{
@@ -648,8 +657,8 @@ mintr(int signo)
siglongjmp(jabort, 1);
}
-void
-mabort(void)
+static void
+mabort(const char *cmd)
{
int ointer, oconf;
@@ -658,7 +667,7 @@ mabort(void)
oconf = confirmrest;
interactive = 1;
confirmrest = 0;
- if (confirm("Continue with", mname)) {
+ if (confirm(cmd, NULL)) {
interactive = ointer;
confirmrest = oconf;
return;
@@ -679,15 +688,14 @@ mget(int argc, char *argv[])
int ointer;
char *cp;
const char *tp;
- int restartit;
+ int volatile restartit;
if (argc == 0 ||
(argc == 1 && !another(&argc, &argv, "remote-files"))) {
- fprintf(ttyout, "usage: %s remote-files\n", argv[0]);
+ UPRINTF("usage: %s remote-files\n", argv[0]);
code = -1;
return;
}
- mname = argv[0];
mflag = 1;
restart_point = 0;
restartit = 0;
@@ -701,7 +709,7 @@ mget(int argc, char *argv[])
}
oldintr = xsignal(SIGINT, mintr);
if (sigsetjmp(jabort, 1))
- mabort();
+ mabort(argv[0]);
while ((cp = remglob(argv, proxy, NULL)) != NULL) {
char buf[MAXPATHLEN];
if (*cp == '\0' || !connected) {
@@ -724,7 +732,7 @@ mget(int argc, char *argv[])
if (stat(tp, &stbuf) == 0)
restart_point = stbuf.st_size;
else
- warn("stat %s", tp);
+ warn("Can't stat `%s'", tp);
}
recvrequest("RETR", tp, cp, restart_point ? "r+" : "w",
tp != cp || !interactive, 1);
@@ -732,7 +740,7 @@ mget(int argc, char *argv[])
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
- if (confirm("Continue with", "mget"))
+ if (confirm(argv[0], NULL))
mflag++;
interactive = ointer;
}
@@ -747,41 +755,41 @@ mget(int argc, char *argv[])
void
fget(int argc, char *argv[])
{
- char *buf, *mode;
+ const char *gmode;
FILE *fp;
+ char buf[MAXPATHLEN], cmdbuf[MAX_C_NAME];
if (argc != 2) {
- fprintf(ttyout, "usage: %s localfile\n", argv[0]);
+ UPRINTF("usage: %s localfile\n", argv[0]);
code = -1;
return;
}
fp = fopen(argv[1], "r");
if (fp == NULL) {
- fprintf(ttyout, "Cannot open source file %s\n", argv[1]);
+ fprintf(ttyout, "Can't open source file %s\n", argv[1]);
code = -1;
return;
}
- argv[0] = "get";
- mode = restart_point ? "r+" : "w";
+ (void)strlcpy(cmdbuf, "get", sizeof(cmdbuf));
+ argv[0] = cmdbuf;
+ gmode = restart_point ? "r+" : "w";
- for (;
- (buf = fparseln(fp, NULL, NULL, "\0\0\0", 0)) != NULL;
- free(buf)) {
+ while (get_line(fp, buf, sizeof(buf), NULL) >= 0) {
if (buf[0] == '\0')
continue;
argv[1] = buf;
- (void)getit(argc, argv, 0, mode);
+ (void)getit(argc, argv, 0, gmode);
}
fclose(fp);
}
-char *
-onoff(int bool)
+const char *
+onoff(int val)
{
- return (bool ? "on" : "off");
+ return (val ? "on" : "off");
}
/*
@@ -793,7 +801,7 @@ status(int argc, char *argv[])
{
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -854,6 +862,8 @@ status(int argc, char *argv[])
fprintf(ttyout, "Use of PORT cmds: %s.\n", onoff(sendport));
fprintf(ttyout, "Use of EPSV/EPRT cmds for IPv4: %s%s.\n", onoff(epsv4),
epsv4bad ? " (disabled for this connection)" : "");
+ fprintf(ttyout, "Use of EPSV/EPRT cmds for IPv6: %s%s.\n", onoff(epsv6),
+ epsv6bad ? " (disabled for this connection)" : "");
fprintf(ttyout, "Command line editing: %s.\n",
#ifdef NO_EDITCOMPLETE
"support not compiled in"
@@ -887,7 +897,7 @@ togglevar(int argc, char *argv[], int *var, const char *mesg)
} else if (argc == 2 && strcasecmp(argv[1], "off") == 0) {
*var = 0;
} else {
- fprintf(ttyout, "usage: %s [ on | off ]\n", argv[0]);
+ UPRINTF("usage: %s [ on | off ]\n", argv[0]);
return (-1);
}
if (mesg)
@@ -916,7 +926,7 @@ setedit(int argc, char *argv[])
#ifdef NO_EDITCOMPLETE
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -950,7 +960,7 @@ sethash(int argc, char *argv[])
if (argc == 1)
hash = !hash;
else if (argc != 2) {
- fprintf(ttyout, "usage: %s [ on | off | bytecount ]\n",
+ UPRINTF("usage: %s [ on | off | bytecount ]\n",
argv[0]);
code = -1;
return;
@@ -1036,7 +1046,7 @@ setgate(int argc, char *argv[])
static char gsbuf[MAXHOSTNAMELEN];
if (argc == 0 || argc > 3) {
- fprintf(ttyout,
+ UPRINTF(
"usage: %s [ on | off | gateserver [port] ]\n", argv[0]);
code = -1;
return;
@@ -1049,7 +1059,7 @@ setgate(int argc, char *argv[])
gatemode = 0;
else {
if (argc == 3)
- gateport = xstrdup(argv[2]);
+ gateport = ftp_strdup(argv[2]);
(void)strlcpy(gsbuf, argv[1], sizeof(gsbuf));
gateserver = gsbuf;
gatemode = 1;
@@ -1097,15 +1107,14 @@ void
setdebug(int argc, char *argv[])
{
if (argc == 0 || argc > 2) {
- fprintf(ttyout, "usage: %s [ on | off | debuglevel ]\n",
- argv[0]);
+ UPRINTF("usage: %s [ on | off | debuglevel ]\n", argv[0]);
code = -1;
return;
} else if (argc == 2) {
if (strcasecmp(argv[1], "on") == 0)
- debug = 1;
+ ftp_debug = 1;
else if (strcasecmp(argv[1], "off") == 0)
- debug = 0;
+ ftp_debug = 0;
else {
int val;
@@ -1116,16 +1125,16 @@ setdebug(int argc, char *argv[])
code = -1;
return;
}
- debug = val;
+ ftp_debug = val;
}
} else
- debug = !debug;
- if (debug)
+ ftp_debug = !ftp_debug;
+ if (ftp_debug)
options |= SO_DEBUG;
else
options &= ~SO_DEBUG;
- fprintf(ttyout, "Debugging %s (debug=%d).\n", onoff(debug), debug);
- code = debug > 0;
+ fprintf(ttyout, "Debugging %s (ftp_debug=%d).\n", onoff(ftp_debug), ftp_debug);
+ code = ftp_debug > 0;
}
/*
@@ -1138,7 +1147,7 @@ cd(int argc, char *argv[])
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "remote-directory"))) {
- fprintf(ttyout, "usage: %s remote-directory\n", argv[0]);
+ UPRINTF("usage: %s remote-directory\n", argv[0]);
code = -1;
return;
}
@@ -1169,13 +1178,13 @@ lcd(int argc, char *argv[])
argv[1] = localhome;
}
if (argc != 2) {
- fprintf(ttyout, "usage: %s [local-directory]\n", argv[0]);
+ UPRINTF("usage: %s [local-directory]\n", argv[0]);
return;
}
if ((locdir = globulize(argv[1])) == NULL)
return;
if (chdir(locdir) == -1)
- warn("lcd %s", locdir);
+ warn("Can't chdir `%s'", locdir);
else {
updatelocalcwd();
if (localcwd[0]) {
@@ -1197,7 +1206,7 @@ delete(int argc, char *argv[])
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "remote-file"))) {
- fprintf(ttyout, "usage: %s remote-file\n", argv[0]);
+ UPRINTF("usage: %s remote-file\n", argv[0]);
code = -1;
return;
}
@@ -1217,15 +1226,14 @@ mdelete(int argc, char *argv[])
if (argc == 0 ||
(argc == 1 && !another(&argc, &argv, "remote-files"))) {
- fprintf(ttyout, "usage: %s [remote-files]\n", argv[0]);
+ UPRINTF("usage: %s [remote-files]\n", argv[0]);
code = -1;
return;
}
- mname = argv[0];
mflag = 1;
oldintr = xsignal(SIGINT, mintr);
if (sigsetjmp(jabort, 1))
- mabort();
+ mabort(argv[0]);
while ((cp = remglob(argv, 0, NULL)) != NULL) {
if (*cp == '\0') {
mflag = 0;
@@ -1237,7 +1245,7 @@ mdelete(int argc, char *argv[])
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
- if (confirm("Continue with", "mdelete")) {
+ if (confirm(argv[0], NULL)) {
mflag++;
}
interactive = ointer;
@@ -1259,7 +1267,7 @@ renamefile(int argc, char *argv[])
goto usage;
if ((argc < 3 && !another(&argc, &argv, "to-name")) || argc > 3) {
usage:
- fprintf(ttyout, "usage: %s from-name to-name\n", argv[0]);
+ UPRINTF("usage: %s from-name to-name\n", argv[0]);
code = -1;
return;
}
@@ -1277,18 +1285,20 @@ renamefile(int argc, char *argv[])
* mlsd MLSD
* nlist NLST
* pdir, pls LIST |$PAGER
- * mmlsd MLSD |$PAGER
+ * pmlsd MLSD |$PAGER
*/
void
ls(int argc, char *argv[])
{
const char *cmd;
- char *remdir, *locfile;
- int freelocfile, pagecmd, mlsdcmd;
+ char *remdir, *locbuf;
+ const char *locfile;
+ int pagecmd, mlsdcmd;
remdir = NULL;
+ locbuf = NULL;
locfile = "-";
- freelocfile = pagecmd = mlsdcmd = 0;
+ pagecmd = mlsdcmd = 0;
/*
* the only commands that start with `p' are
* the `pager' versions.
@@ -1320,41 +1330,38 @@ ls(int argc, char *argv[])
if (argc > 3 || ((pagecmd | mlsdcmd) && argc > 2)) {
usage:
if (pagecmd || mlsdcmd)
- fprintf(ttyout,
- "usage: %s [remote-path]\n", argv[0]);
+ UPRINTF("usage: %s [remote-path]\n", argv[0]);
else
- fprintf(ttyout,
- "usage: %s [remote-path [local-file]]\n",
+ UPRINTF("usage: %s [remote-path [local-file]]\n",
argv[0]);
code = -1;
goto freels;
}
if (pagecmd) {
- char *p;
- int len;
+ const char *p;
+ size_t len;
p = getoptionvalue("pager");
if (EMPTYSTRING(p))
p = DEFAULTPAGER;
len = strlen(p) + 2;
- locfile = xmalloc(len);
- locfile[0] = '|';
- (void)strlcpy(locfile + 1, p, len - 1);
- freelocfile = 1;
+ locbuf = ftp_malloc(len);
+ locbuf[0] = '|';
+ (void)strlcpy(locbuf + 1, p, len - 1);
+ locfile = locbuf;
} else if ((strcmp(locfile, "-") != 0) && *locfile != '|') {
- mname = argv[0];
- if ((locfile = globulize(locfile)) == NULL ||
- !confirm("output to local-file:", locfile)) {
+ if ((locbuf = globulize(locfile)) == NULL ||
+ !confirm("output to local-file:", locbuf)) {
code = -1;
goto freels;
}
- freelocfile = 1;
+ locfile = locbuf;
}
recvrequest(cmd, locfile, remdir, "w", 0, 0);
freels:
- if (freelocfile && locfile)
- (void)free(locfile);
+ if (locbuf)
+ (void)free(locbuf);
}
/*
@@ -1365,8 +1372,9 @@ mls(int argc, char *argv[])
{
sigfunc oldintr;
int ointer, i;
- int dolist;
- char *mode, *dest, *odest;
+ int volatile dolist;
+ char * volatile dest, *odest;
+ const char *lmode;
if (argc == 0)
goto usage;
@@ -1374,13 +1382,12 @@ mls(int argc, char *argv[])
goto usage;
if (argc < 3 && !another(&argc, &argv, "local-file")) {
usage:
- fprintf(ttyout, "usage: %s remote-files local-file\n", argv[0]);
+ UPRINTF("usage: %s remote-files local-file\n", argv[0]);
code = -1;
return;
}
odest = dest = argv[argc - 1];
argv[argc - 1] = NULL;
- mname = argv[0];
if (strcmp(dest, "-") && *dest != '|')
if (((dest = globulize(dest)) == NULL) ||
!confirm("output to local-file:", dest)) {
@@ -1391,15 +1398,15 @@ mls(int argc, char *argv[])
mflag = 1;
oldintr = xsignal(SIGINT, mintr);
if (sigsetjmp(jabort, 1))
- mabort();
+ mabort(argv[0]);
for (i = 1; mflag && i < argc-1 && connected; i++) {
- mode = (i == 1) ? "w" : "a";
- recvrequest(dolist ? "LIST" : "NLST", dest, argv[i], mode,
+ lmode = (i == 1) ? "w" : "a";
+ recvrequest(dolist ? "LIST" : "NLST", dest, argv[i], lmode,
0, 0);
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
- if (confirm("Continue with", argv[0])) {
+ if (confirm(argv[0], NULL)) {
mflag++;
}
interactive = ointer;
@@ -1420,11 +1427,12 @@ shell(int argc, char *argv[])
{
pid_t pid;
sigfunc oldintr;
- char shellnam[MAXPATHLEN], *shell, *namep;
+ char shellnam[MAXPATHLEN];
+ const char *shellp, *namep;
int wait_status;
if (argc == 0) {
- fprintf(ttyout, "usage: %s [command [args]]\n", argv[0]);
+ UPRINTF("usage: %s [command [args]]\n", argv[0]);
code = -1;
return;
}
@@ -1433,26 +1441,26 @@ shell(int argc, char *argv[])
for (pid = 3; pid < 20; pid++)
(void)close(pid);
(void)xsignal(SIGINT, SIG_DFL);
- shell = getenv("SHELL");
- if (shell == NULL)
- shell = _PATH_BSHELL;
- namep = strrchr(shell, '/');
+ shellp = getenv("SHELL");
+ if (shellp == NULL)
+ shellp = _PATH_BSHELL;
+ namep = strrchr(shellp, '/');
if (namep == NULL)
- namep = shell;
+ namep = shellp;
else
namep++;
(void)strlcpy(shellnam, namep, sizeof(shellnam));
- if (debug) {
- fputs(shell, ttyout);
+ if (ftp_debug) {
+ fputs(shellp, ttyout);
putc('\n', ttyout);
}
if (argc > 1) {
- execl(shell, shellnam, "-c", altarg, (char *)0);
+ execl(shellp, shellnam, "-c", altarg, (char *)0);
}
else {
- execl(shell, shellnam, (char *)0);
+ execl(shellp, shellnam, (char *)0);
}
- warn("%s", shell);
+ warn("Can't execute `%s'", shellp);
code = -1;
exit(1);
}
@@ -1461,7 +1469,7 @@ shell(int argc, char *argv[])
;
(void)xsignal(SIGINT, oldintr);
if (pid == -1) {
- warn("Try again later");
+ warn("Can't fork a subshell; try again later");
code = -1;
} else
code = 0;
@@ -1473,7 +1481,8 @@ shell(int argc, char *argv[])
void
user(int argc, char *argv[])
{
- char acct[80];
+ char *password;
+ char emptypass[] = "";
int n, aflag = 0;
if (argc == 0)
@@ -1482,7 +1491,7 @@ user(int argc, char *argv[])
(void)another(&argc, &argv, "username");
if (argc < 2 || argc > 4) {
usage:
- fprintf(ttyout, "usage: %s username [password [account]]\n",
+ UPRINTF("usage: %s username [password [account]]\n",
argv[0]);
code = -1;
return;
@@ -1490,34 +1499,35 @@ user(int argc, char *argv[])
n = command("USER %s", argv[1]);
if (n == CONTINUE) {
if (argc < 3) {
- argv[2] = getpass("Password: ");
- argc++;
+ password = getpass("Password: ");
+ if (password == NULL)
+ password = emptypass;
+ } else {
+ password = argv[2];
}
- n = command("PASS %s", argv[2]);
+ n = command("PASS %s", password);
+ memset(password, 0, strlen(password));
}
if (n == CONTINUE) {
+ aflag++;
if (argc < 4) {
- (void)fputs("Account: ", ttyout);
- (void)fflush(ttyout);
- if (fgets(acct, sizeof(acct) - 1, stdin) == NULL) {
- fprintf(ttyout,
- "\nEOF received; login aborted.\n");
- clearerr(stdin);
- code = -1;
- return;
- }
- acct[strlen(acct) - 1] = '\0';
- argv[3] = acct; argc++;
+ password = getpass("Account: ");
+ if (password == NULL)
+ password = emptypass;
+ } else {
+ password = argv[3];
}
- n = command("ACCT %s", argv[3]);
- aflag++;
+ n = command("ACCT %s", password);
+ memset(password, 0, strlen(password));
}
if (n != COMPLETE) {
fputs("Login failed.\n", ttyout);
return;
}
if (!aflag && argc == 4) {
- (void)command("ACCT %s", argv[3]);
+ password = argv[3];
+ (void)command("ACCT %s", password);
+ memset(password, 0, strlen(password));
}
connected = -1;
getremoteinfo();
@@ -1533,7 +1543,7 @@ pwd(int argc, char *argv[])
code = -1;
if (argc != 1) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
return;
}
if (! remotecwd[0])
@@ -1555,7 +1565,7 @@ lpwd(int argc, char *argv[])
code = -1;
if (argc != 1) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
return;
}
if (! localcwd[0])
@@ -1578,7 +1588,7 @@ makedir(int argc, char *argv[])
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "directory-name"))) {
- fprintf(ttyout, "usage: %s directory-name\n", argv[0]);
+ UPRINTF("usage: %s directory-name\n", argv[0]);
code = -1;
return;
}
@@ -1603,7 +1613,7 @@ removedir(int argc, char *argv[])
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "directory-name"))) {
- fprintf(ttyout, "usage: %s directory-name\n", argv[0]);
+ UPRINTF("usage: %s directory-name\n", argv[0]);
code = -1;
return;
}
@@ -1627,7 +1637,7 @@ quote(int argc, char *argv[])
if (argc == 0 ||
(argc == 1 && !another(&argc, &argv, "command line to send"))) {
- fprintf(ttyout, "usage: %s line-to-send\n", argv[0]);
+ UPRINTF("usage: %s line-to-send\n", argv[0]);
code = -1;
return;
}
@@ -1645,7 +1655,7 @@ site(int argc, char *argv[])
if (argc == 0 ||
(argc == 1 && !another(&argc, &argv, "arguments to SITE command"))){
- fprintf(ttyout, "usage: %s line-to-send\n", argv[0]);
+ UPRINTF("usage: %s line-to-send\n", argv[0]);
code = -1;
return;
}
@@ -1683,7 +1693,7 @@ do_chmod(int argc, char *argv[])
goto usage;
if ((argc < 3 && !another(&argc, &argv, "remote-file")) || argc > 3) {
usage:
- fprintf(ttyout, "usage: %s mode remote-file\n", argv[0]);
+ UPRINTF("usage: %s mode remote-file\n", argv[0]);
code = -1;
return;
}
@@ -1702,7 +1712,7 @@ do_umask(int argc, char *argv[])
int oldverbose = verbose;
if (argc == 0) {
- fprintf(ttyout, "usage: %s [umask]\n", argv[0]);
+ UPRINTF("usage: %s [umask]\n", argv[0]);
code = -1;
return;
}
@@ -1717,7 +1727,7 @@ idlecmd(int argc, char *argv[])
int oldverbose = verbose;
if (argc < 1 || argc > 2) {
- fprintf(ttyout, "usage: %s [seconds]\n", argv[0]);
+ UPRINTF("usage: %s [seconds]\n", argv[0]);
code = -1;
return;
}
@@ -1735,7 +1745,7 @@ rmthelp(int argc, char *argv[])
int oldverbose = verbose;
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -1755,7 +1765,7 @@ quit(int argc, char *argv[])
/* this may be called with argc == 0, argv == NULL */
if (argc == 0 && argv != NULL) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -1777,7 +1787,7 @@ disconnect(int argc, char *argv[])
/* this may be called with argc == 0, argv == NULL */
if (argc == 0 && argv != NULL) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -1791,17 +1801,22 @@ void
account(int argc, char *argv[])
{
char *ap;
+ char emptypass[] = "";
if (argc == 0 || argc > 2) {
- fprintf(ttyout, "usage: %s [password]\n", argv[0]);
+ UPRINTF("usage: %s [password]\n", argv[0]);
code = -1;
return;
}
else if (argc == 2)
ap = argv[1];
- else
+ else {
ap = getpass("Account:");
+ if (ap == NULL)
+ ap = emptypass;
+ }
(void)command("ACCT %s", ap);
+ memset(ap, 0, strlen(ap));
}
sigjmp_buf abortprox;
@@ -1831,9 +1846,10 @@ doproxy(int argc, char *argv[])
struct cmd *c;
int cmdpos;
sigfunc oldintr;
+ char cmdbuf[MAX_C_NAME];
if (argc == 0 || (argc == 1 && !another(&argc, &argv, "command"))) {
- fprintf(ttyout, "usage: %s command\n", argv[0]);
+ UPRINTF("usage: %s command\n", argv[0]);
code = -1;
return;
}
@@ -1869,7 +1885,8 @@ doproxy(int argc, char *argv[])
cmdpos = strcspn(line, " \t");
if (cmdpos > 0) /* remove leading "proxy " from input buffer */
memmove(line, line + cmdpos + 1, strlen(line) - cmdpos + 1);
- argv[1] = c->c_name;
+ (void)strlcpy(cmdbuf, c->c_name, sizeof(cmdbuf));
+ argv[1] = cmdbuf;
(*c->c_handler)(argc-1, argv+1);
if (connected) {
proxflag = 1;
@@ -1925,7 +1942,7 @@ setntrans(int argc, char *argv[])
{
if (argc == 0 || argc > 3) {
- fprintf(ttyout, "usage: %s [inchars [outchars]]\n", argv[0]);
+ UPRINTF("usage: %s [inchars [outchars]]\n", argv[0]);
code = -1;
return;
}
@@ -1961,7 +1978,7 @@ dotrans(char *dst, size_t dlen, const char *src)
found++;
if (i < ostop) {
*cp2++ = *(ntout + i);
- if (cp2 - dst >= dlen - 1)
+ if (cp2 - dst >= (ptrdiff_t)(dlen - 1))
goto out;
}
break;
@@ -1989,7 +2006,7 @@ setnmap(int argc, char *argv[])
}
if (argc == 0 ||
(argc < 3 && !another(&argc, &argv, "mapout")) || argc > 3) {
- fprintf(ttyout, "usage: %s [mapin mapout]\n", argv[0]);
+ UPRINTF("usage: %s [mapin mapout]\n", argv[0]);
code = -1;
return;
}
@@ -2189,7 +2206,7 @@ setpassive(int argc, char *argv[])
activefallback = passivemode;
} else if (argc != 2) {
passiveusage:
- fprintf(ttyout, "usage: %s [ on | off | auto ]\n", argv[0]);
+ UPRINTF("usage: %s [ on | off | auto ]\n", argv[0]);
code = -1;
return;
} else if (strcasecmp(argv[1], "on") == 0) {
@@ -2208,16 +2225,31 @@ setpassive(int argc, char *argv[])
code = passivemode;
}
+
void
setepsv4(int argc, char *argv[])
{
-
code = togglevar(argc, argv, &epsv4,
verbose ? "EPSV/EPRT on IPv4" : NULL);
epsv4bad = 0;
}
void
+setepsv6(int argc, char *argv[])
+{
+ code = togglevar(argc, argv, &epsv6,
+ verbose ? "EPSV/EPRT on IPv6" : NULL);
+ epsv6bad = 0;
+}
+
+void
+setepsv(int argc, char*argv[])
+{
+ setepsv4(argc,argv);
+ setepsv6(argc,argv);
+}
+
+void
setsunique(int argc, char *argv[])
{
@@ -2240,11 +2272,11 @@ parserate(int argc, char *argv[], int cmdlineopt)
if (argc > 4 || (argc < (cmdlineopt ? 3 : 2))) {
usage:
if (cmdlineopt)
- fprintf(ttyout,
+ UPRINTF(
"usage: %s (all|get|put),maximum-bytes[,increment-bytes]]\n",
argv[0]);
else
- fprintf(ttyout,
+ UPRINTF(
"usage: %s (all|get|put) [maximum-bytes [increment-bytes]]\n",
argv[0]);
return -1;
@@ -2316,7 +2348,7 @@ cdup(int argc, char *argv[])
int r;
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -2341,7 +2373,7 @@ restart(int argc, char *argv[])
{
if (argc == 0 || argc > 2) {
- fprintf(ttyout, "usage: %s [restart-point]\n", argv[0]);
+ UPRINTF("usage: %s [restart-point]\n", argv[0]);
code = -1;
return;
}
@@ -2378,7 +2410,7 @@ syst(int argc, char *argv[])
int oldverbose = verbose;
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -2403,7 +2435,7 @@ macdef(int argc, char *argv[])
}
if ((argc < 2 && !another(&argc, &argv, "macro name")) || argc > 2) {
usage:
- fprintf(ttyout, "usage: %s macro_name\n", argv[0]);
+ UPRINTF("usage: %s macro_name\n", argv[0]);
code = -1;
return;
}
@@ -2461,7 +2493,7 @@ sizecmd(int argc, char *argv[])
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "remote-file"))) {
- fprintf(ttyout, "usage: %s remote-file\n", argv[0]);
+ UPRINTF("usage: %s remote-file\n", argv[0]);
code = -1;
return;
}
@@ -2482,13 +2514,14 @@ modtime(int argc, char *argv[])
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "remote-file"))) {
- fprintf(ttyout, "usage: %s remote-file\n", argv[0]);
+ UPRINTF("usage: %s remote-file\n", argv[0]);
code = -1;
return;
}
mtime = remotemodtime(argv[1], 1);
if (mtime != -1)
- fprintf(ttyout, "%s\t%s", argv[1], asctime(localtime(&mtime)));
+ fprintf(ttyout, "%s\t%s", argv[1],
+ rfc2822time(localtime(&mtime)));
code = (mtime > 0);
}
@@ -2500,7 +2533,7 @@ rmtstatus(int argc, char *argv[])
{
if (argc == 0) {
- fprintf(ttyout, "usage: %s [remote-file]\n", argv[0]);
+ UPRINTF("usage: %s [remote-file]\n", argv[0]);
code = -1;
return;
}
@@ -2526,12 +2559,13 @@ newer(int argc, char *argv[])
void
lpage(int argc, char *argv[])
{
- int len;
- char *p, *pager, *locfile;
+ size_t len;
+ const char *p;
+ char *pager, *locfile;
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "local-file"))) {
- fprintf(ttyout, "usage: %s local-file\n", argv[0]);
+ UPRINTF("usage: %s local-file\n", argv[0]);
code = -1;
return;
}
@@ -2543,7 +2577,7 @@ lpage(int argc, char *argv[])
if (EMPTYSTRING(p))
p = DEFAULTPAGER;
len = strlen(p) + strlen(locfile) + 2;
- pager = xmalloc(len);
+ pager = ftp_malloc(len);
(void)strlcpy(pager, p, len);
(void)strlcat(pager, " ", len);
(void)strlcat(pager, locfile, len);
@@ -2559,12 +2593,14 @@ lpage(int argc, char *argv[])
void
page(int argc, char *argv[])
{
- int ohash, orestart_point, overbose, len;
- char *p, *pager;
+ int ohash, orestart_point, overbose;
+ size_t len;
+ const char *p;
+ char *pager;
if (argc == 0 || argc > 2 ||
(argc == 1 && !another(&argc, &argv, "remote-file"))) {
- fprintf(ttyout, "usage: %s remote-file\n", argv[0]);
+ UPRINTF("usage: %s remote-file\n", argv[0]);
code = -1;
return;
}
@@ -2572,7 +2608,7 @@ page(int argc, char *argv[])
if (EMPTYSTRING(p))
p = DEFAULTPAGER;
len = strlen(p) + 2;
- pager = xmalloc(len);
+ pager = ftp_malloc(len);
pager[0] = '|';
(void)strlcpy(pager + 1, p, len - 1);
@@ -2597,7 +2633,7 @@ setxferbuf(int argc, char *argv[])
if (argc != 2) {
usage:
- fprintf(ttyout, "usage: %s size\n", argv[0]);
+ UPRINTF("usage: %s size\n", argv[0]);
code = -1;
return;
}
@@ -2637,7 +2673,7 @@ setoption(int argc, char *argv[])
code = -1;
if (argc == 0 || (argc != 1 && argc != 3)) {
- fprintf(ttyout, "usage: %s [option value]\n", argv[0]);
+ UPRINTF("usage: %s [option value]\n", argv[0]);
return;
}
@@ -2648,20 +2684,28 @@ setoption(int argc, char *argv[])
o->name, o->value ? o->value : "");
}
} else {
- o = getoption(argv[1]);
- if (o == NULL) {
- fprintf(ttyout, "No such option `%s'.\n", argv[1]);
- return;
- }
- FREEPTR(o->value);
- o->value = xstrdup(argv[2]);
- if (verbose)
- fprintf(ttyout, "Setting `%s' to `%s'.\n",
- o->name, o->value);
+ set_option(argv[1], argv[2], 1);
}
code = 0;
}
+void
+set_option(const char * option, const char * value, int doverbose)
+{
+ struct option *o;
+
+ o = getoption(option);
+ if (o == NULL) {
+ fprintf(ttyout, "No such option `%s'.\n", option);
+ return;
+ }
+ FREEPTR(o->value);
+ o->value = ftp_strdup(value);
+ if (verbose && doverbose)
+ fprintf(ttyout, "Setting `%s' to `%s'.\n",
+ o->name, o->value);
+}
+
/*
* Unset an option
*/
@@ -2672,7 +2716,7 @@ unsetoption(int argc, char *argv[])
code = -1;
if (argc == 0 || argc != 2) {
- fprintf(ttyout, "usage: %s option\n", argv[0]);
+ UPRINTF("usage: %s option\n", argv[0]);
return;
}
@@ -2695,7 +2739,7 @@ feat(int argc, char *argv[])
int oldverbose = verbose;
if (argc == 0) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
@@ -2715,7 +2759,7 @@ mlst(int argc, char *argv[])
int oldverbose = verbose;
if (argc < 1 || argc > 2) {
- fprintf(ttyout, "usage: %s [remote-path]\n", argv[0]);
+ UPRINTF("usage: %s [remote-path]\n", argv[0]);
code = -1;
return;
}
@@ -2735,7 +2779,7 @@ opts(int argc, char *argv[])
int oldverbose = verbose;
if (argc < 2 || argc > 3) {
- fprintf(ttyout, "usage: %s command [options]\n", argv[0]);
+ UPRINTF("usage: %s command [options]\n", argv[0]);
code = -1;
return;
}
diff --git a/contrib/lukemftp/src/cmdtab.c b/contrib/tnftp/src/cmdtab.c
index 04efade..dec48e8 100644
--- a/contrib/lukemftp/src/cmdtab.c
+++ b/contrib/tnftp/src/cmdtab.c
@@ -1,7 +1,8 @@
-/* $NetBSD: cmdtab.c,v 1.44 2005/04/11 01:49:31 lukem Exp $ */
+/* $NetBSD: cmdtab.c,v 1.11 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: cmdtab.c,v 1.51 2009/04/12 10:18:52 lukem Exp */
/*-
- * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -65,16 +59,23 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)cmdtab.c 8.4 (Berkeley) 10/9/94";
#else
-__RCSID("$NetBSD: cmdtab.c,v 1.44 2005/04/11 01:49:31 lukem Exp $");
+__RCSID(" NetBSD: cmdtab.c,v 1.51 2009/04/12 10:18:52 lukem Exp ");
#endif
#endif /* not lint */
#include <stdio.h>
+
+#endif /* tnftp */
+
#include "ftp_var.h"
/*
@@ -100,7 +101,9 @@ HSTR deletehelp[] = "delete remote file";
HSTR disconhelp[] = "terminate ftp session";
HSTR domachelp[] = "execute macro";
HSTR edithelp[] = "toggle command line editing";
+HSTR epsvhelp[] = "toggle use of EPSV/EPRT on both IPv4 and IPV6 ftp";
HSTR epsv4help[] = "toggle use of EPSV/EPRT on IPv4 ftp";
+HSTR epsv6help[] = "toggle use of EPSV/EPRT on IPv6 ftp";
HSTR feathelp[] = "show FEATures supported by remote system";
HSTR formhelp[] = "set file transfer format";
HSTR gatehelp[] = "toggle gate-ftp; specify host[:port] to change proxy";
@@ -211,7 +214,9 @@ struct cmd cmdtab[] = {
{ "dir", H(lshelp), 1, 1, 1, CMPL(rl) ls },
{ "disconnect", H(disconhelp), 0, 1, 1, CMPL0 disconnect },
{ "edit", H(edithelp), 0, 0, 0, CMPL0 setedit },
+ { "epsv", H(epsvhelp), 0, 0, 0, CMPL0 setepsv },
{ "epsv4", H(epsv4help), 0, 0, 0, CMPL0 setepsv4 },
+ { "epsv6", H(epsv6help), 0, 0, 0, CMPL0 setepsv6 },
{ "exit", H(quithelp), 0, 0, 0, CMPL0 quit },
{ "features", H(feathelp), 0, 1, 1, CMPL0 feat },
{ "fget", H(fgethelp), 1, 1, 1, CMPL(l) fget },
@@ -294,7 +299,7 @@ struct cmd cmdtab[] = {
{ "verbose", H(verbosehelp), 0, 0, 0, CMPL0 setverbose },
{ "xferbuf", H(xferbufhelp), 0, 0, 0, CMPL0 setxferbuf },
{ "?", H(helphelp), 0, 0, 1, CMPL(C) help },
- { 0 },
+ { NULL, NULL, 0, 0, 0, CMPL0 NULL },
};
struct option optiontab[] = {
@@ -305,5 +310,5 @@ struct option optiontab[] = {
{ "pager", NULL },
{ "prompt", NULL },
{ "rprompt", NULL },
- { 0 },
+ { NULL, NULL },
};
diff --git a/contrib/lukemftp/src/complete.c b/contrib/tnftp/src/complete.c
index 8831bc1..df75d3a 100644
--- a/contrib/lukemftp/src/complete.c
+++ b/contrib/tnftp/src/complete.c
@@ -1,7 +1,8 @@
-/* $NetBSD: complete.c,v 1.38 2000/05/01 10:35:17 lukem Exp $ */
+/* $NetBSD: complete.c,v 1.10 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp */
/*-
- * Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -36,9 +30,13 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: complete.c,v 1.38 2000/05/01 10:35:17 lukem Exp $");
+__RCSID(" NetBSD: complete.c,v 1.46 2009/04/12 10:18:52 lukem Exp ");
#endif /* not lint */
/*
@@ -54,6 +52,8 @@ __RCSID("$NetBSD: complete.c,v 1.38 2000/05/01 10:35:17 lukem Exp $");
#include <stdlib.h>
#include <string.h>
+#endif /* tnftp */
+
#include "ftp_var.h"
#ifndef NO_EDITCOMPLETE
@@ -68,7 +68,7 @@ static unsigned char complete_remote (char *, int);
static int
comparstr(const void *a, const void *b)
{
- return (strcmp(*(const char **)a, *(const char **)b));
+ return (strcmp(*(const char * const *)a, *(const char * const *)b));
}
/*
@@ -87,7 +87,7 @@ complete_ambiguous(char *word, int list, StringList *words)
{
char insertstr[MAXPATHLEN];
char *lastmatch, *p;
- int i, j;
+ size_t i, j;
size_t matchlen, wordlen;
wordlen = strlen(word);
@@ -143,14 +143,14 @@ complete_command(char *word, int list)
size_t wordlen;
unsigned char rv;
- words = xsl_init();
+ words = ftp_sl_init();
wordlen = strlen(word);
for (c = cmdtab; c->c_name != NULL; c++) {
if (wordlen > strlen(c->c_name))
continue;
if (strncmp(word, c->c_name, wordlen) == 0)
- xsl_add(words, c->c_name);
+ ftp_sl_add(words, ftp_strdup(c->c_name));
}
rv = complete_ambiguous(word, list, words);
@@ -158,7 +158,7 @@ complete_command(char *word, int list)
if (el_insertstr(el, " ") == -1)
rv = CC_ERROR;
}
- sl_free(words, 0);
+ sl_free(words, 1);
return (rv);
}
@@ -200,7 +200,7 @@ complete_local(char *word, int list)
if ((dd = opendir(dir)) == NULL)
return (CC_ERROR);
- words = xsl_init();
+ words = ftp_sl_init();
len = strlen(file);
for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) {
@@ -217,8 +217,8 @@ complete_local(char *word, int list)
if (strncmp(file, dp->d_name, len) == 0) {
char *tcp;
- tcp = xstrdup(dp->d_name);
- xsl_add(words, tcp);
+ tcp = ftp_strdup(dp->d_name);
+ ftp_sl_add(words, tcp);
}
}
closedir(dd);
@@ -255,14 +255,14 @@ complete_option(char *word, int list)
size_t wordlen;
unsigned char rv;
- words = xsl_init();
+ words = ftp_sl_init();
wordlen = strlen(word);
for (o = optiontab; o->name != NULL; o++) {
if (wordlen > strlen(o->name))
continue;
if (strncmp(word, o->name, wordlen) == 0)
- xsl_add(words, o->name);
+ ftp_sl_add(words, ftp_strdup(o->name));
}
rv = complete_ambiguous(word, list, words);
@@ -270,7 +270,7 @@ complete_option(char *word, int list)
if (el_insertstr(el, " ") == -1)
rv = CC_ERROR;
}
- sl_free(words, 0);
+ sl_free(words, 1);
return (rv);
}
@@ -285,10 +285,13 @@ complete_remote(char *word, int list)
StringList *words;
char dir[MAXPATHLEN];
char *file, *cp;
- int i;
+ size_t i;
unsigned char rv;
+ char cmdbuf[MAX_C_NAME];
+ char *dummyargv[3] = { NULL, NULL, NULL };
- char *dummyargv[] = { "complete", NULL, NULL };
+ (void)strlcpy(cmdbuf, "complete", sizeof(cmdbuf));
+ dummyargv[0] = cmdbuf;
dummyargv[1] = dir;
if ((file = strrchr(word, '/')) == NULL) {
@@ -304,11 +307,11 @@ complete_remote(char *word, int list)
if (dirchange || dirlist == NULL ||
strcmp(dir, lastdir) != 0) { /* dir not cached */
- char *emesg;
+ const char *emesg;
if (dirlist != NULL)
sl_free(dirlist, 1);
- dirlist = xsl_init();
+ dirlist = ftp_sl_init();
mflag = 1;
emesg = NULL;
@@ -326,8 +329,8 @@ complete_remote(char *word, int list)
tcp++;
else
tcp = cp;
- tcp = xstrdup(tcp);
- xsl_add(dirlist, tcp);
+ tcp = ftp_strdup(tcp);
+ ftp_sl_add(dirlist, tcp);
}
if (emesg != NULL) {
fprintf(ttyout, "\n%s\n", emesg);
@@ -337,13 +340,13 @@ complete_remote(char *word, int list)
dirchange = 0;
}
- words = xsl_init();
+ words = ftp_sl_init();
for (i = 0; i < dirlist->sl_cur; i++) {
cp = dirlist->sl_str[i];
if (strlen(file) > strlen(cp))
continue;
if (strncmp(file, cp, strlen(file)) == 0)
- xsl_add(words, cp);
+ ftp_sl_add(words, cp);
}
rv = complete_ambiguous(file, list, words);
sl_free(words, 0);
@@ -354,17 +357,17 @@ complete_remote(char *word, int list)
* Generic complete routine
*/
unsigned char
-complete(EditLine *el, int ch)
+complete(EditLine *cel, int ch)
{
static char word[FTPBUFLEN];
- static int lastc_argc, lastc_argo;
+ static size_t lastc_argc, lastc_argo;
struct cmd *c;
const LineInfo *lf;
- int celems, dolist, cmpltype;
- size_t len;
+ int dolist, cmpltype;
+ size_t celems, len;
- lf = el_line(el);
+ lf = el_line(cel);
len = lf->lastchar - lf->buffer;
if (len >= sizeof(line))
return (CC_ERROR);
@@ -383,7 +386,7 @@ complete(EditLine *el, int ch)
&& strncmp(word, margv[cursor_argc] ? margv[cursor_argc] : "",
cursor_argo) == 0)
dolist = 1;
- else if (cursor_argc < margc)
+ else if (cursor_argc < (size_t)margc)
(void)strlcpy(word, margv[cursor_argc], cursor_argo + 1);
word[cursor_argo] = '\0';
@@ -426,7 +429,8 @@ complete(EditLine *el, int ch)
}
return (complete_remote(word, dolist));
default:
- errx(1, "unknown complete type `%c'", cmpltype);
+ errx(1, "complete: unknown complete type `%c'",
+ cmpltype);
return (CC_ERROR);
}
/* NOTREACHED */
diff --git a/contrib/lukemftp/src/domacro.c b/contrib/tnftp/src/domacro.c
index 2e10e1c..b8fde0c 100644
--- a/contrib/lukemftp/src/domacro.c
+++ b/contrib/tnftp/src/domacro.c
@@ -1,4 +1,5 @@
-/* $NetBSD: domacro.c,v 1.20 2003/08/07 11:13:53 agc Exp $ */
+/* $NetBSD: domacro.c,v 1.8 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp */
/*
* Copyright (c) 1985, 1993, 1994
@@ -29,12 +30,16 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)domacro.c 8.3 (Berkeley) 4/2/94";
#else
-__RCSID("$NetBSD: domacro.c,v 1.20 2003/08/07 11:13:53 agc Exp $");
+__RCSID(" NetBSD: domacro.c,v 1.22 2009/04/12 10:18:52 lukem Exp ");
#endif
#endif /* not lint */
@@ -42,6 +47,8 @@ __RCSID("$NetBSD: domacro.c,v 1.20 2003/08/07 11:13:53 agc Exp $");
#include <stdio.h>
#include <string.h>
+#endif /* tnftp */
+
#include "ftp_var.h"
void
@@ -50,10 +57,11 @@ domacro(int argc, char *argv[])
int i, j, count = 2, loopflg = 0;
char *cp1, *cp2, line2[FTPBUFLEN];
struct cmd *c;
+ char cmdbuf[MAX_C_NAME];
if ((argc == 0 && argv != NULL) ||
(argc < 2 && !another(&argc, &argv, "macro name"))) {
- fprintf(ttyout, "usage: %s macro_name [args]\n", argv[0]);
+ UPRINTF("usage: %s macro_name [args]\n", argv[0]);
code = -1;
return;
}
@@ -126,7 +134,8 @@ domacro(int argc, char *argv[])
fputs(line, ttyout);
putc('\n', ttyout);
}
- margv[0] = c->c_name;
+ (void)strlcpy(cmdbuf, c->c_name, sizeof(cmdbuf));
+ margv[0] = cmdbuf;
(*c->c_handler)(margc, margv);
if (bell && c->c_bell)
(void)putc('\007', ttyout);
diff --git a/contrib/lukemftp/src/extern.h b/contrib/tnftp/src/extern.h
index f2b802a..9b6c645 100644
--- a/contrib/lukemftp/src/extern.h
+++ b/contrib/tnftp/src/extern.h
@@ -1,7 +1,8 @@
-/* $NetBSD: extern.h,v 1.67 2005/05/14 15:26:43 lukem Exp $ */
+/* $NetBSD: extern.h,v 1.12 2009/11/15 10:12:37 lukem Exp $ */
+/* from NetBSD: extern.h,v 1.77 2009/07/13 19:05:41 roy Exp */
/*-
- * Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -118,7 +112,7 @@ void cmdabort(int);
void cmdtimeout(int);
void cmdscanner(void);
int command(const char *, ...)
- __attribute__((__format__(__printf__, 1, 2)));
+ ;
#ifndef NO_EDITCOMPLETE
unsigned char complete(EditLine *, int);
void controlediting(void);
@@ -141,6 +135,7 @@ int ftp_login(const char *, const char *, const char *);
void get(int, char **);
struct cmd *getcmd(const char *);
int getit(int, char **, int, const char *);
+int get_line(FILE *, char *, size_t, const char **);
struct option *getoption(const char *);
char *getoptionvalue(const char *);
void getremoteinfo(void);
@@ -148,7 +143,7 @@ int getreply(int);
char *globulize(const char *);
char *gunique(const char *);
void help(int, char **);
-char *hookup(char *, char *);
+char *hookup(const char *, const char *);
void idlecmd(int, char **);
int initconn(void);
void intr(int);
@@ -159,22 +154,19 @@ void lostpeer(int);
void lpage(int, char **);
void lpwd(int, char **);
void ls(int, char **);
-void mabort(void);
void macdef(int, char **);
void makeargv(void);
void makedir(int, char **);
void mdelete(int, char **);
void mget(int, char **);
-void mintr(int);
void mls(int, char **);
void mlst(int, char **);
void modtime(int, char **);
void mput(int, char **);
-char *onoff(int);
+const char *onoff(int);
void opts(int, char **);
void newer(int, char **);
void page(int, char **);
-int parseport(const char *, int);
int parserate(int, char **, int);
char *prompt(void);
void proxabort(int);
@@ -189,18 +181,18 @@ void quote1(const char *, int, char **);
void recvrequest(const char *, const char *, const char *,
const char *, int, int);
void reget(int, char **);
-char *remglob(char **, int, char **);
+char *remglob(char **, int, const char **);
time_t remotemodtime(const char *, int);
off_t remotesize(const char *, int);
void removedir(int, char **);
void renamefile(int, char **);
void reset(int, char **);
void restart(int, char **);
+const char *rfc2822time(const struct tm *);
void rmthelp(int, char **);
void rmtstatus(int, char **);
char *rprompt(void);
-int ruserpass(const char *, const char **, const char **,
- const char **);
+int ruserpass(const char *, char **, char **, char **);
void sendrequest(const char *, const char *, const char *, int);
void setascii(int, char **);
void setbell(int, char **);
@@ -210,6 +202,8 @@ void setcr(int, char **);
void setdebug(int, char **);
void setedit(int, char **);
void setepsv4(int, char **);
+void setepsv6(int, char **);
+void setepsv(int, char **);
void setform(int, char **);
void setftmode(int, char **);
void setgate(int, char **);
@@ -235,6 +229,7 @@ void settype(int, char **);
void setupsockbufsize(int);
void setverbose(int, char **);
void setxferbuf(int, char **);
+void set_option(const char *, const char *, int);
void shell(int, char **);
void site(int, char **);
void sizecmd(int, char **);
@@ -248,10 +243,10 @@ void updatelocalcwd(void);
void updateremotecwd(void);
void usage(void);
void user(int, char **);
-int xconnect(int, const struct sockaddr *, socklen_t);
-int xlisten(int, int);
-int xpoll(struct pollfd *, int, int);
-void *xmalloc(size_t);
-StringList *xsl_init(void);
-void xsl_add(StringList *, char *);
-char *xstrdup(const char *);
+int ftp_connect(int, const struct sockaddr *, socklen_t);
+int ftp_listen(int, int);
+int ftp_poll(struct pollfd *, int, int);
+void *ftp_malloc(size_t);
+StringList *ftp_sl_init(void);
+void ftp_sl_add(StringList *, char *);
+char *ftp_strdup(const char *);
diff --git a/contrib/lukemftp/src/fetch.c b/contrib/tnftp/src/fetch.c
index e2acb01..91b49fd 100644
--- a/contrib/lukemftp/src/fetch.c
+++ b/contrib/tnftp/src/fetch.c
@@ -1,7 +1,8 @@
-/* $NetBSD: fetch.c,v 1.158 2005/05/14 15:26:43 lukem Exp $ */
+/* $NetBSD: fetch.c,v 1.18 2009/11/15 10:12:37 lukem Exp $ */
+/* from NetBSD: fetch.c,v 1.191 2009/08/17 09:08:16 christos Exp */
/*-
- * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -18,13 +19,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -39,9 +33,13 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: fetch.c,v 1.158 2005/05/14 15:26:43 lukem Exp $");
+__RCSID(" NetBSD: fetch.c,v 1.191 2009/08/17 09:08:16 christos Exp ");
#endif /* not lint */
/*
@@ -69,7 +67,8 @@ __RCSID("$NetBSD: fetch.c,v 1.158 2005/05/14 15:26:43 lukem Exp $");
#include <string.h>
#include <unistd.h>
#include <time.h>
-#include <libutil.h>
+
+#endif /* tnftp */
#include "ftp_var.h"
#include "version.h"
@@ -113,7 +112,7 @@ static int redirect_loop;
* Determine if token is the next word in buf (case insensitive).
* If so, advance buf past the token and any trailing LWS, and
* return a pointer to the token (in buf). Otherwise, return NULL.
- * token may be preceeded by LWS.
+ * token may be preceded by LWS.
* token must be followed by LWS or NUL. (I.e, don't partial match).
*/
static const char *
@@ -147,9 +146,10 @@ static int
auth_url(const char *challenge, char **response, const char *guser,
const char *gpass)
{
- const char *cp, *scheme;
+ const char *cp, *scheme, *errormsg;
char *ep, *clear, *realm;
- char user[BUFSIZ], *pass;
+ char uuser[BUFSIZ], *gotpass;
+ const char *upass;
int rval;
size_t len, clen, rlen;
@@ -158,12 +158,12 @@ auth_url(const char *challenge, char **response, const char *guser,
rval = -1;
cp = challenge;
scheme = "Basic"; /* only support Basic authentication */
+ gotpass = NULL;
- if (debug)
- fprintf(ttyout, "auth_url: challenge `%s'\n", challenge);
+ DPRINTF("auth_url: challenge `%s'\n", challenge);
if (! match_token(&cp, scheme)) {
- warnx("Unsupported authentication challenge - `%s'",
+ warnx("Unsupported authentication challenge `%s'",
challenge);
goto cleanup_auth_url;
}
@@ -172,50 +172,54 @@ auth_url(const char *challenge, char **response, const char *guser,
if (STRNEQUAL(cp, REALM))
cp += sizeof(REALM) - 1;
else {
- warnx("Unsupported authentication challenge - `%s'",
+ warnx("Unsupported authentication challenge `%s'",
challenge);
goto cleanup_auth_url;
}
/* XXX: need to improve quoted-string parsing to support \ quoting, etc. */
if ((ep = strchr(cp, '\"')) != NULL) {
- size_t len = ep - cp;
-
- realm = (char *)xmalloc(len + 1);
+ len = ep - cp;
+ realm = (char *)ftp_malloc(len + 1);
(void)strlcpy(realm, cp, len + 1);
} else {
- warnx("Unsupported authentication challenge - `%s'",
+ warnx("Unsupported authentication challenge `%s'",
challenge);
goto cleanup_auth_url;
}
fprintf(ttyout, "Username for `%s': ", realm);
if (guser != NULL) {
- (void)strlcpy(user, guser, sizeof(user));
- fprintf(ttyout, "%s\n", user);
+ (void)strlcpy(uuser, guser, sizeof(uuser));
+ fprintf(ttyout, "%s\n", uuser);
} else {
(void)fflush(ttyout);
- if (fgets(user, sizeof(user) - 1, stdin) == NULL) {
- clearerr(stdin);
+ if (get_line(stdin, uuser, sizeof(uuser), &errormsg) < 0) {
+ warnx("%s; can't authenticate", errormsg);
goto cleanup_auth_url;
}
- user[strlen(user) - 1] = '\0';
}
if (gpass != NULL)
- pass = (char *)gpass;
- else
- pass = getpass("Password: ");
+ upass = gpass;
+ else {
+ gotpass = getpass("Password: ");
+ if (gotpass == NULL) {
+ warnx("Can't read password");
+ goto cleanup_auth_url;
+ }
+ upass = gotpass;
+ }
- clen = strlen(user) + strlen(pass) + 2; /* user + ":" + pass + "\0" */
- clear = (char *)xmalloc(clen);
- (void)strlcpy(clear, user, clen);
+ clen = strlen(uuser) + strlen(upass) + 2; /* user + ":" + pass + "\0" */
+ clear = (char *)ftp_malloc(clen);
+ (void)strlcpy(clear, uuser, clen);
(void)strlcat(clear, ":", clen);
- (void)strlcat(clear, pass, clen);
- if (gpass == NULL)
- memset(pass, 0, strlen(pass));
+ (void)strlcat(clear, upass, clen);
+ if (gotpass)
+ memset(gotpass, 0, strlen(gotpass));
/* scheme + " " + enc + "\0" */
rlen = strlen(scheme) + 1 + (clen + 2) * 4 / 3 + 1;
- *response = (char *)xmalloc(rlen);
+ *response = (char *)ftp_malloc(rlen);
(void)strlcpy(*response, scheme, rlen);
len = strlcat(*response, " ", rlen);
/* use `clen - 1' to not encode the trailing NUL */
@@ -240,7 +244,7 @@ base64_encode(const unsigned char *clear, size_t len, unsigned char *encoded)
static const unsigned char enc[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned char *cp;
- int i;
+ size_t i;
cp = encoded;
for (i = 0; i < len; i += 3) {
@@ -284,7 +288,7 @@ url_decode(char *url)
/*
- * Parse URL of form:
+ * Parse URL of form (per RFC3986):
* <type>://[<user>[:<password>]@]<host>[:<port>][/<path>]
* Returns -1 if a parse error occurred, otherwise 0.
* It's the caller's responsibility to url_decode() the returned
@@ -294,12 +298,9 @@ url_decode(char *url)
* malloc(3)ed strings of the relevant section, and port to
* the number given, or ftpport if ftp://, or httpport if http://.
*
- * If <host> is surrounded by `[' and ']', it's parsed as an
- * IPv6 address (as per RFC 2732).
- *
- * XXX: this is not totally RFC 1738 compliant; <path> will have the
+ * XXX: this is not totally RFC3986 compliant; <path> will have the
* leading `/' unless it's an ftp:// URL, as this makes things easier
- * for file:// and http:// URLs. ftp:// URLs have the `/' between the
+ * for file:// and http:// URLs. ftp:// URLs have the `/' between the
* host and the URL-path removed, but any additional leading slashes
* in the URL-path are retained (because they imply that we should
* later do "CWD" with a null argument).
@@ -307,50 +308,56 @@ url_decode(char *url)
* Examples:
* input URL output path
* --------- -----------
- * "ftp://host" NULL
- * "http://host/" NULL
+ * "http://host" "/"
+ * "http://host/" "/"
+ * "http://host/path" "/path"
* "file://host/dir/file" "dir/file"
+ * "ftp://host" ""
* "ftp://host/" ""
- * "ftp://host//" NULL
+ * "ftp://host//" "/"
+ * "ftp://host/dir/file" "dir/file"
* "ftp://host//dir/file" "/dir/file"
*/
static int
-parse_url(const char *url, const char *desc, url_t *type,
- char **user, char **pass, char **host, char **port,
+parse_url(const char *url, const char *desc, url_t *utype,
+ char **uuser, char **pass, char **host, char **port,
in_port_t *portnum, char **path)
{
- const char *origurl;
- char *cp, *ep, *thost, *tport;
+ const char *origurl, *tport;
+ char *cp, *ep, *thost;
size_t len;
- if (url == NULL || desc == NULL || type == NULL || user == NULL
+ if (url == NULL || desc == NULL || utype == NULL || uuser == NULL
|| pass == NULL || host == NULL || port == NULL || portnum == NULL
|| path == NULL)
errx(1, "parse_url: invoked with NULL argument!");
+ DPRINTF("parse_url: %s `%s'\n", desc, url);
origurl = url;
- *type = UNKNOWN_URL_T;
- *user = *pass = *host = *port = *path = NULL;
+ *utype = UNKNOWN_URL_T;
+ *uuser = *pass = *host = *port = *path = NULL;
*portnum = 0;
tport = NULL;
if (STRNEQUAL(url, HTTP_URL)) {
url += sizeof(HTTP_URL) - 1;
- *type = HTTP_URL_T;
+ *utype = HTTP_URL_T;
*portnum = HTTP_PORT;
tport = httpport;
} else if (STRNEQUAL(url, FTP_URL)) {
url += sizeof(FTP_URL) - 1;
- *type = FTP_URL_T;
+ *utype = FTP_URL_T;
*portnum = FTP_PORT;
tport = ftpport;
} else if (STRNEQUAL(url, FILE_URL)) {
url += sizeof(FILE_URL) - 1;
- *type = FILE_URL_T;
+ *utype = FILE_URL_T;
} else {
warnx("Invalid %s `%s'", desc, url);
cleanup_parse_url:
- FREEPTR(*user);
+ FREEPTR(*uuser);
+ if (*pass != NULL)
+ memset(*pass, 0, strlen(*pass));
FREEPTR(*pass);
FREEPTR(*host);
FREEPTR(*port);
@@ -364,29 +371,29 @@ parse_url(const char *url, const char *desc, url_t *type,
/* find [user[:pass]@]host[:port] */
ep = strchr(url, '/');
if (ep == NULL)
- thost = xstrdup(url);
+ thost = ftp_strdup(url);
else {
len = ep - url;
- thost = (char *)xmalloc(len + 1);
+ thost = (char *)ftp_malloc(len + 1);
(void)strlcpy(thost, url, len + 1);
- if (*type == FTP_URL_T) /* skip first / for ftp URLs */
+ if (*utype == FTP_URL_T) /* skip first / for ftp URLs */
ep++;
- *path = xstrdup(ep);
+ *path = ftp_strdup(ep);
}
cp = strchr(thost, '@'); /* look for user[:pass]@ in URLs */
if (cp != NULL) {
- if (*type == FTP_URL_T)
+ if (*utype == FTP_URL_T)
anonftp = 0; /* disable anonftp */
- *user = thost;
+ *uuser = thost;
*cp = '\0';
- thost = xstrdup(cp + 1);
- cp = strchr(*user, ':');
+ thost = ftp_strdup(cp + 1);
+ cp = strchr(*uuser, ':');
if (cp != NULL) {
*cp = '\0';
- *pass = xstrdup(cp + 1);
+ *pass = ftp_strdup(cp + 1);
}
- url_decode(*user);
+ url_decode(*uuser);
if (*pass)
url_decode(*pass);
}
@@ -394,7 +401,7 @@ parse_url(const char *url, const char *desc, url_t *type,
#ifdef INET6
/*
* Check if thost is an encoded IPv6 address, as per
- * RFC 2732:
+ * RFC3986:
* `[' ipv6-address ']'
*/
if (*thost == '[') {
@@ -420,16 +427,17 @@ parse_url(const char *url, const char *desc, url_t *type,
cp = NULL;
} else
#endif /* INET6 */
- if ((cp = strchr(thost, ':')) != NULL)
- *cp++ = '\0';
+ if ((cp = strchr(thost, ':')) != NULL)
+ *cp++ = '\0';
*host = thost;
/* look for [:port] */
if (cp != NULL) {
- long nport;
+ unsigned long nport;
- nport = parseport(cp, -1);
- if (nport == -1) {
+ nport = strtoul(cp, &ep, 10);
+ if (*cp == '\0' || *ep != '\0' ||
+ nport < 1 || nport > MAX_IN_PORT_T) {
warnx("Unknown port `%s' in %s `%s'",
cp, desc, origurl);
goto cleanup_parse_url;
@@ -439,17 +447,19 @@ parse_url(const char *url, const char *desc, url_t *type,
}
if (tport != NULL)
- *port = xstrdup(tport);
- if (*path == NULL)
- *path = xstrdup("/");
-
- if (debug)
- fprintf(ttyout,
- "parse_url: user `%s' pass `%s' host %s port %s(%d) "
- "path `%s'\n",
- *user ? *user : "<null>", *pass ? *pass : "<null>",
- *host ? *host : "<null>", *port ? *port : "<null>",
- *portnum ? *portnum : -1, *path ? *path : "<null>");
+ *port = ftp_strdup(tport);
+ if (*path == NULL) {
+ const char *emptypath = "/";
+ if (*utype == FTP_URL_T) /* skip first / for ftp URLs */
+ emptypath++;
+ *path = ftp_strdup(emptypath);
+ }
+
+ DPRINTF("parse_url: user `%s' pass `%s' host %s port %s(%d) "
+ "path `%s'\n",
+ STRorNULL(*uuser), STRorNULL(*pass),
+ STRorNULL(*host), STRorNULL(*port),
+ *portnum ? *portnum : -1, STRorNULL(*path));
return (0);
}
@@ -469,53 +479,50 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
{
struct addrinfo hints, *res, *res0 = NULL;
int error;
- char hbuf[NI_MAXHOST];
- volatile sigfunc oldintr, oldintp;
- volatile int s;
+ sigfunc volatile oldintr;
+ sigfunc volatile oldintp;
+ int volatile s;
struct stat sb;
- int ischunked, isproxy, rval, hcode;
- size_t len;
+ int volatile ischunked;
+ int volatile isproxy;
+ int volatile rval;
+ int volatile hcode;
+ int len;
+ size_t flen;
static size_t bufsize;
static char *xferbuf;
const char *cp, *token;
- char *ep, *buf, *savefile;
- char *auth, *location, *message;
- char *user, *pass, *host, *port, *path, *decodedpath;
+ char *ep;
+ char buf[FTPBUFLEN];
+ const char *errormsg;
+ char *volatile savefile;
+ char *volatile auth;
+ char *volatile location;
+ char *volatile message;
+ char *uuser, *pass, *host, *port, *path;
+ char *volatile decodedpath;
char *puser, *ppass, *useragent;
off_t hashbytes, rangestart, rangeend, entitylen;
- int (*closefunc)(FILE *);
- FILE *fin, *fout;
+ int (*volatile closefunc)(FILE *);
+ FILE *volatile fin;
+ FILE *volatile fout;
time_t mtime;
url_t urltype;
in_port_t portnum;
+ DPRINTF("fetch_url: `%s' proxyenv `%s'\n", url, STRorNULL(proxyenv));
+
oldintr = oldintp = NULL;
closefunc = NULL;
fin = fout = NULL;
s = -1;
- buf = savefile = NULL;
+ savefile = NULL;
auth = location = message = NULL;
ischunked = isproxy = hcode = 0;
rval = 1;
- user = pass = host = path = decodedpath = puser = ppass = NULL;
-
-#ifdef __GNUC__ /* shut up gcc warnings */
- (void)&closefunc;
- (void)&fin;
- (void)&fout;
- (void)&buf;
- (void)&savefile;
- (void)&rval;
- (void)&isproxy;
- (void)&hcode;
- (void)&ischunked;
- (void)&message;
- (void)&location;
- (void)&auth;
- (void)&decodedpath;
-#endif
+ uuser = pass = host = path = decodedpath = puser = ppass = NULL;
- if (parse_url(url, "URL", &urltype, &user, &pass, &host, &port,
+ if (parse_url(url, "URL", &urltype, &uuser, &pass, &host, &port,
&portnum, &path) == -1)
goto cleanup_fetch_url;
@@ -536,29 +543,27 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
}
- decodedpath = xstrdup(path);
+ decodedpath = ftp_strdup(path);
url_decode(decodedpath);
if (outfile)
- savefile = xstrdup(outfile);
+ savefile = ftp_strdup(outfile);
else {
cp = strrchr(decodedpath, '/'); /* find savefile */
if (cp != NULL)
- savefile = xstrdup(cp + 1);
+ savefile = ftp_strdup(cp + 1);
else
- savefile = xstrdup(decodedpath);
+ savefile = ftp_strdup(decodedpath);
}
+ DPRINTF("fetch_url: savefile `%s'\n", savefile);
if (EMPTYSTRING(savefile)) {
if (urltype == FTP_URL_T) {
rval = fetch_ftp(url);
goto cleanup_fetch_url;
}
- warnx("no file after directory (you must specify an "
+ warnx("No file after directory (you must specify an "
"output file) `%s'", url);
goto cleanup_fetch_url;
- } else {
- if (debug)
- fprintf(ttyout, "savefile `%s'\n", savefile);
}
restart_point = 0;
@@ -574,7 +579,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
direction = "copied";
fin = fopen(decodedpath, "r");
if (fin == NULL) {
- warn("Cannot open file `%s'", decodedpath);
+ warn("Can't open `%s'", decodedpath);
goto cleanup_fetch_url;
}
if (fstat(fileno(fin), &sb) == 0) {
@@ -583,7 +588,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
if (restart_point) {
if (lseek(fileno(fin), restart_point, SEEK_SET) < 0) {
- warn("Can't lseek to restart `%s'",
+ warn("Can't seek to restart `%s'",
decodedpath);
goto cleanup_fetch_url;
}
@@ -596,7 +601,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
fputs("\n", ttyout);
}
} else { /* ftp:// or http:// URLs */
- char *leading;
+ const char *leading;
int hasleading;
if (proxyenv == NULL) {
@@ -610,26 +615,26 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
url_t purltype;
char *phost, *ppath;
char *pport, *no_proxy;
+ in_port_t pportnum;
isproxy = 1;
/* check URL against list of no_proxied sites */
no_proxy = getoptionvalue("no_proxy");
if (! EMPTYSTRING(no_proxy)) {
- char *np, *np_copy;
- long np_port;
+ char *np, *np_copy, *np_iter;
+ unsigned long np_port;
size_t hlen, plen;
- np_copy = xstrdup(no_proxy);
+ np_iter = np_copy = ftp_strdup(no_proxy);
hlen = strlen(host);
- while ((cp = strsep(&np_copy, " ,")) != NULL) {
+ while ((cp = strsep(&np_iter, " ,")) != NULL) {
if (*cp == '\0')
continue;
if ((np = strrchr(cp, ':')) != NULL) {
- *np = '\0';
- np_port =
- strtol(np + 1, &ep, 10);
- if (*ep != '\0')
+ *np++ = '\0';
+ np_port = strtoul(np, &ep, 10);
+ if (*np == '\0' || *ep != '\0')
continue;
if (np_port != portnum)
continue;
@@ -651,8 +656,13 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
if (isproxy) {
+ if (restart_point) {
+ warnx("Can't restart via proxy URL `%s'",
+ proxyenv);
+ goto cleanup_fetch_url;
+ }
if (parse_url(proxyenv, "proxy URL", &purltype,
- &puser, &ppass, &phost, &pport, &portnum,
+ &puser, &ppass, &phost, &pport, &pportnum,
&ppath) == -1)
goto cleanup_fetch_url;
@@ -684,7 +694,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
FREEPTR(port);
port = pport;
FREEPTR(path);
- path = xstrdup(url);
+ path = ftp_strdup(url);
FREEPTR(ppath);
}
} /* ! EMPTYSTRING(proxyenv) */
@@ -694,9 +704,11 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
hints.ai_family = family;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
- error = getaddrinfo(host, NULL, &hints, &res0);
+ error = getaddrinfo(host, port, &hints, &res0);
if (error) {
- warnx("%s", gai_strerror(error));
+ warnx("Can't lookup `%s:%s': %s", host, port,
+ (error == EAI_SYSTEM) ? strerror(errno)
+ : gai_strerror(error));
goto cleanup_fetch_url;
}
if (res0->ai_canonname)
@@ -704,28 +716,31 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
s = -1;
for (res = res0; res; res = res->ai_next) {
- /*
- * see comment in hookup()
- */
+ char hname[NI_MAXHOST], sname[NI_MAXSERV];
+
ai_unmapped(res);
if (getnameinfo(res->ai_addr, res->ai_addrlen,
- hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST) != 0)
- strlcpy(hbuf, "invalid", sizeof(hbuf));
+ hname, sizeof(hname), sname, sizeof(sname),
+ NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
+ strlcpy(hname, "?", sizeof(hname));
+ strlcpy(sname, "?", sizeof(sname));
+ }
- if (verbose && res != res0)
- fprintf(ttyout, "Trying %s...\n", hbuf);
+ if (verbose && res0->ai_next) {
+ fprintf(ttyout, "Trying %s:%s ...\n",
+ hname, sname);
+ }
- ((struct sockaddr_in *)res->ai_addr)->sin_port =
- htons(portnum);
s = socket(res->ai_family, SOCK_STREAM,
res->ai_protocol);
if (s < 0) {
- warn("Can't create socket");
+ warn(
+ "Can't create socket for connection to "
+ "`%s:%s'", hname, sname);
continue;
}
- if (xconnect(s, res->ai_addr, res->ai_addrlen) < 0) {
- warn("Connect to address `%s'", hbuf);
+ if (ftp_connect(s, res->ai_addr, res->ai_addrlen) < 0) {
close(s);
s = -1;
continue;
@@ -736,7 +751,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
if (s < 0) {
- warn("Can't connect to %s", host);
+ warnx("Can't connect to `%s:%s'", host, port);
goto cleanup_fetch_url;
}
@@ -767,7 +782,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
* strip off IPv6 scope identifier, since it is
* local to the node
*/
- h = xstrdup(host);
+ h = ftp_strdup(host);
if (isipv6addr(h) &&
(p = strchr(h, '%')) != NULL) {
*p = '\0';
@@ -826,14 +841,16 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
/* Read the response */
- if ((buf = fparseln(fin, &len, NULL, "\0\0\0", 0)) == NULL) {
- warn("Receiving HTTP reply");
+ len = get_line(fin, buf, sizeof(buf), &errormsg);
+ if (len < 0) {
+ if (*errormsg == '\n')
+ errormsg++;
+ warnx("Receiving HTTP reply: %s", errormsg);
goto cleanup_fetch_url;
}
while (len > 0 && (ISLWS(buf[len-1])))
buf[--len] = '\0';
- if (debug)
- fprintf(ttyout, "received `%s'\n", buf);
+ DPRINTF("fetch_url: received `%s'\n", buf);
/* Determine HTTP response code */
cp = strchr(buf, ' ');
@@ -844,22 +861,22 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
hcode = strtol(cp, &ep, 10);
if (*ep != '\0' && !isspace((unsigned char)*ep))
goto improper;
- message = xstrdup(cp);
+ message = ftp_strdup(cp);
/* Read the rest of the header. */
while (1) {
- FREEPTR(buf);
- if ((buf = fparseln(fin, &len, NULL, "\0\0\0", 0))
- == NULL) {
- warn("Receiving HTTP reply");
+ len = get_line(fin, buf, sizeof(buf), &errormsg);
+ if (len < 0) {
+ if (*errormsg == '\n')
+ errormsg++;
+ warnx("Receiving HTTP reply: %s", errormsg);
goto cleanup_fetch_url;
}
while (len > 0 && (ISLWS(buf[len-1])))
buf[--len] = '\0';
if (len == 0)
break;
- if (debug)
- fprintf(ttyout, "received `%s'\n", buf);
+ DPRINTF("fetch_url: received `%s'\n", buf);
/*
* Look for some headers
@@ -871,10 +888,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
filesize = STRTOLL(cp, &ep, 10);
if (filesize < 0 || *ep != '\0')
goto improper;
- if (debug)
- fprintf(ttyout,
- "parsed len as: " LLF "\n",
- (LLT)filesize);
+ DPRINTF("fetch_url: parsed len as: " LLF "\n",
+ (LLT)filesize);
} else if (match_token(&cp, "Content-Range:")) {
if (! match_token(&cp, "bytes"))
@@ -906,7 +921,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
if (*cp != '\0')
goto improper;
- if (debug) {
+#ifndef NO_DEBUG
+ if (ftp_debug) {
fprintf(ttyout, "parsed range as: ");
if (rangestart == -1)
fprintf(ttyout, "*");
@@ -916,6 +932,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
(LLT)rangeend);
fprintf(ttyout, "/" LLF "\n", (LLT)entitylen);
}
+#endif
if (! restart_point) {
warnx(
"Received unexpected Content-Range header");
@@ -926,11 +943,12 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
struct tm parsed;
char *t;
- /* RFC 1123 */
+ memset(&parsed, 0, sizeof(parsed));
+ /* RFC1123 */
if ((t = strptime(cp,
"%a, %d %b %Y %H:%M:%S GMT",
&parsed))
- /* RFC 850 */
+ /* RFC0850 */
|| (t = strptime(cp,
"%a, %d-%b-%y %H:%M:%S GMT",
&parsed))
@@ -941,55 +959,50 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
parsed.tm_isdst = -1;
if (*t == '\0')
mtime = timegm(&parsed);
- if (debug && mtime != -1) {
+#ifndef NO_DEBUG
+ if (ftp_debug && mtime != -1) {
fprintf(ttyout,
"parsed date as: %s",
- ctime(&mtime));
+ rfc2822time(localtime(&mtime)));
}
+#endif
}
} else if (match_token(&cp, "Location:")) {
- location = xstrdup(cp);
- if (debug)
- fprintf(ttyout,
- "parsed location as `%s'\n", cp);
+ location = ftp_strdup(cp);
+ DPRINTF("fetch_url: parsed location as `%s'\n",
+ cp);
} else if (match_token(&cp, "Transfer-Encoding:")) {
if (match_token(&cp, "binary")) {
warnx(
- "Bogus transfer encoding - `binary' (fetching anyway)");
+ "Bogus transfer encoding `binary' (fetching anyway)");
continue;
}
if (! (token = match_token(&cp, "chunked"))) {
warnx(
- "Unsupported transfer encoding - `%s'",
+ "Unsupported transfer encoding `%s'",
token);
goto cleanup_fetch_url;
}
ischunked++;
- if (debug)
- fprintf(ttyout,
- "using chunked encoding\n");
+ DPRINTF("fetch_url: using chunked encoding\n");
} else if (match_token(&cp, "Proxy-Authenticate:")
|| match_token(&cp, "WWW-Authenticate:")) {
if (! (token = match_token(&cp, "Basic"))) {
- if (debug)
- fprintf(ttyout,
- "skipping unknown auth scheme `%s'\n",
+ DPRINTF(
+ "fetch_url: skipping unknown auth scheme `%s'\n",
token);
continue;
}
FREEPTR(auth);
- auth = xstrdup(token);
- if (debug)
- fprintf(ttyout,
- "parsed auth as `%s'\n", cp);
+ auth = ftp_strdup(token);
+ DPRINTF("fetch_url: parsed auth as `%s'\n", cp);
}
}
/* finished parsing header */
- FREEPTR(buf);
switch (hcode) {
case 200:
@@ -1005,6 +1018,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
case 302:
case 303:
case 305:
+ case 307:
if (EMPTYSTRING(location)) {
warnx(
"No redirection Location provided by server");
@@ -1036,7 +1050,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
if (hcode == 401) {
authp = &wwwauth;
- auser = user;
+ auser = uuser;
apass = pass;
} else {
authp = &proxyauth;
@@ -1056,9 +1070,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
fprintf(ttyout,
"Authorization failed. Retry (y/n)? ");
- if (fgets(reply, sizeof(reply), stdin)
- == NULL) {
- clearerr(stdin);
+ if (get_line(stdin, reply, sizeof(reply), NULL)
+ < 0) {
goto cleanup_fetch_url;
}
if (tolower((unsigned char)reply[0]) != 'y')
@@ -1077,7 +1090,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
#endif
default:
if (message)
- warnx("Error retrieving file - `%s'", message);
+ warnx("Error retrieving file `%s'", message);
else
warnx("Unknown error retrieving file");
goto cleanup_fetch_url;
@@ -1091,7 +1104,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
oldintp = xsignal(SIGPIPE, SIG_IGN);
fout = popen(savefile + 1, "w");
if (fout == NULL) {
- warn("Can't run `%s'", savefile + 1);
+ warn("Can't execute `%s'", savefile + 1);
goto cleanup_fetch_url;
}
closefunc = pclose;
@@ -1129,11 +1142,11 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
(void)xsignal(SIGQUIT, psummary);
oldintr = xsignal(SIGINT, aborthttp);
- if (rcvbuf_size > bufsize) {
+ if ((size_t)rcvbuf_size > bufsize) {
if (xferbuf)
(void)free(xferbuf);
bufsize = rcvbuf_size;
- xferbuf = xmalloc(bufsize);
+ xferbuf = ftp_malloc(bufsize);
}
bytes = 0;
@@ -1143,33 +1156,53 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
/* Finally, suck down the file. */
do {
long chunksize;
+ short lastchunk;
chunksize = 0;
- /* read chunksize */
+ lastchunk = 0;
+ /* read chunk-size */
if (ischunked) {
if (fgets(xferbuf, bufsize, fin) == NULL) {
- warnx("Unexpected EOF reading chunksize");
+ warnx("Unexpected EOF reading chunk-size");
goto cleanup_fetch_url;
}
+ errno = 0;
chunksize = strtol(xferbuf, &ep, 16);
+ if (ep == xferbuf) {
+ warnx("Invalid chunk-size");
+ goto cleanup_fetch_url;
+ }
+ if (errno == ERANGE || chunksize < 0) {
+ errno = ERANGE;
+ warn("Chunk-size `%.*s'",
+ (int)(ep-xferbuf), xferbuf);
+ goto cleanup_fetch_url;
+ }
/*
* XXX: Work around bug in Apache 1.3.9 and
* 1.3.11, which incorrectly put trailing
- * space after the chunksize.
+ * space after the chunk-size.
*/
while (*ep == ' ')
ep++;
+ /* skip [ chunk-ext ] */
+ if (*ep == ';') {
+ while (*ep && *ep != '\r')
+ ep++;
+ }
+
if (strcmp(ep, "\r\n") != 0) {
- warnx("Unexpected data following chunksize");
+ warnx("Unexpected data following chunk-size");
goto cleanup_fetch_url;
}
- if (debug)
- fprintf(ttyout, "got chunksize of " LLF "\n",
- (LLT)chunksize);
- if (chunksize == 0)
- break;
+ DPRINTF("fetch_url: got chunk-size of " LLF "\n",
+ (LLT)chunksize);
+ if (chunksize == 0) {
+ lastchunk = 1;
+ goto chunkdone;
+ }
}
/* transfer file or chunk */
while (1) {
@@ -1178,18 +1211,18 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
if (rate_get)
(void)gettimeofday(&then, NULL);
- bufrem = rate_get ? rate_get : bufsize;
+ bufrem = rate_get ? rate_get : (off_t)bufsize;
if (ischunked)
bufrem = MIN(chunksize, bufrem);
while (bufrem > 0) {
- len = fread(xferbuf, sizeof(char),
- MIN(bufsize, bufrem), fin);
- if (len <= 0)
+ flen = fread(xferbuf, sizeof(char),
+ MIN((off_t)bufsize, bufrem), fin);
+ if (flen <= 0)
goto chunkdone;
- bytes += len;
- bufrem -= len;
- if (fwrite(xferbuf, sizeof(char), len, fout)
- != len) {
+ bytes += flen;
+ bufrem -= flen;
+ if (fwrite(xferbuf, sizeof(char), flen, fout)
+ != flen) {
warn("Writing `%s'", savefile);
goto cleanup_fetch_url;
}
@@ -1201,7 +1234,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
(void)fflush(ttyout);
}
if (ischunked) {
- chunksize -= len;
+ chunksize -= flen;
if (chunksize <= 0)
break;
}
@@ -1221,14 +1254,21 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
/* read CRLF after chunk*/
chunkdone:
if (ischunked) {
- if (fgets(xferbuf, bufsize, fin) == NULL)
- break;
+ if (fgets(xferbuf, bufsize, fin) == NULL) {
+ warnx("Unexpected EOF reading chunk CRLF");
+ goto cleanup_fetch_url;
+ }
if (strcmp(xferbuf, "\r\n") != 0) {
warnx("Unexpected data following chunk");
goto cleanup_fetch_url;
}
+ if (lastchunk)
+ break;
}
} while (ischunked);
+
+/* XXX: deal with optional trailer & CRLF here? */
+
if (hash && !progress && bytes > 0) {
if (bytes < mark)
(void)putc('#', ttyout);
@@ -1252,7 +1292,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
if (utimes(savefile, tval) == -1) {
fprintf(ttyout,
"Can't change modification time to %s",
- asctime(localtime(&mtime)));
+ rfc2822time(localtime(&mtime)));
}
}
if (bytes > 0)
@@ -1263,7 +1303,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
goto cleanup_fetch_url;
improper:
- warnx("Improper response from `%s'", host);
+ warnx("Improper response from `%s:%s'", host, port);
cleanup_fetch_url:
if (oldintr)
@@ -1279,15 +1319,18 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
if (res0)
freeaddrinfo(res0);
FREEPTR(savefile);
- FREEPTR(user);
+ FREEPTR(uuser);
+ if (pass != NULL)
+ memset(pass, 0, strlen(pass));
FREEPTR(pass);
FREEPTR(host);
FREEPTR(port);
FREEPTR(path);
FREEPTR(decodedpath);
FREEPTR(puser);
+ if (ppass != NULL)
+ memset(ppass, 0, strlen(ppass));
FREEPTR(ppass);
- FREEPTR(buf);
FREEPTR(auth);
FREEPTR(location);
FREEPTR(message);
@@ -1301,7 +1344,7 @@ void
aborthttp(int notused)
{
char msgbuf[100];
- int len;
+ size_t len;
sigint_raised = 1;
alarmtimer(0);
@@ -1319,21 +1362,25 @@ static int
fetch_ftp(const char *url)
{
char *cp, *xargv[5], rempath[MAXPATHLEN];
- char *host, *path, *dir, *file, *user, *pass;
+ char *host, *path, *dir, *file, *uuser, *pass;
char *port;
- int dirhasglob, filehasglob, oautologin, rval, type, xargc;
+ char cmdbuf[MAXPATHLEN];
+ char dirbuf[4];
+ int dirhasglob, filehasglob, rval, transtype, xargc;
+ int oanonftp, oautologin;
in_port_t portnum;
url_t urltype;
- host = path = dir = file = user = pass = NULL;
+ DPRINTF("fetch_ftp: `%s'\n", url);
+ host = path = dir = file = uuser = pass = NULL;
port = NULL;
rval = 1;
- type = TYPE_I;
+ transtype = TYPE_I;
if (STRNEQUAL(url, FTP_URL)) {
- if ((parse_url(url, "URL", &urltype, &user, &pass,
+ if ((parse_url(url, "URL", &urltype, &uuser, &pass,
&host, &port, &portnum, &path) == -1) ||
- (user != NULL && *user == '\0') ||
+ (uuser != NULL && *uuser == '\0') ||
EMPTYSTRING(host)) {
warnx("Invalid URL `%s'", url);
goto cleanup_fetch_ftp;
@@ -1346,9 +1393,9 @@ fetch_ftp(const char *url)
/* check for trailing ';type=[aid]' */
if (! EMPTYSTRING(path) && (cp = strrchr(path, ';')) != NULL) {
if (strcasecmp(cp, ";type=a") == 0)
- type = TYPE_A;
+ transtype = TYPE_A;
else if (strcasecmp(cp, ";type=i") == 0)
- type = TYPE_I;
+ transtype = TYPE_I;
else if (strcasecmp(cp, ";type=d") == 0) {
warnx(
"Directory listing via a URL is not supported");
@@ -1362,18 +1409,18 @@ fetch_ftp(const char *url)
}
} else { /* classic style `[user@]host:[file]' */
urltype = CLASSIC_URL_T;
- host = xstrdup(url);
+ host = ftp_strdup(url);
cp = strchr(host, '@');
if (cp != NULL) {
*cp = '\0';
- user = host;
+ uuser = host;
anonftp = 0; /* disable anonftp */
- host = xstrdup(cp + 1);
+ host = ftp_strdup(cp + 1);
}
cp = strchr(host, ':');
if (cp != NULL) {
*cp = '\0';
- path = xstrdup(cp + 1);
+ path = ftp_strdup(cp + 1);
}
}
if (EMPTYSTRING(host))
@@ -1407,7 +1454,8 @@ fetch_ftp(const char *url)
cp = strrchr(dir, '/');
if (cp == dir && urltype == CLASSIC_URL_T) {
file = cp + 1;
- dir = "/";
+ (void)strlcpy(dirbuf, "/", sizeof(dirbuf));
+ dir = dirbuf;
} else if (cp != NULL) {
*cp++ = '\0';
file = cp;
@@ -1421,14 +1469,11 @@ fetch_ftp(const char *url)
url_decode(file);
/* but still don't url_decode(dir) */
}
- if (debug)
- fprintf(ttyout,
- "fetch_ftp: user `%s' pass `%s' host %s port %s "
- "path `%s' dir `%s' file `%s'\n",
- user ? user : "<null>", pass ? pass : "<null>",
- host ? host : "<null>", port ? port : "<null>",
- path ? path : "<null>",
- dir ? dir : "<null>", file ? file : "<null>");
+ DPRINTF("fetch_ftp: user `%s' pass `%s' host %s port %s "
+ "path `%s' dir `%s' file `%s'\n",
+ STRorNULL(uuser), STRorNULL(pass),
+ STRorNULL(host), STRorNULL(port),
+ STRorNULL(path), STRorNULL(dir), STRorNULL(file));
dirhasglob = filehasglob = 0;
if (doglob && urltype == CLASSIC_URL_T) {
@@ -1439,9 +1484,12 @@ fetch_ftp(const char *url)
}
/* Set up the connection */
+ oanonftp = anonftp;
if (connected)
disconnect(0, NULL);
- xargv[0] = (char *)getprogname(); /* XXX discards const */
+ anonftp = oanonftp;
+ (void)strlcpy(cmdbuf, getprogname(), sizeof(cmdbuf));
+ xargv[0] = cmdbuf;
xargv[1] = host;
xargv[2] = NULL;
xargc = 2;
@@ -1456,12 +1504,13 @@ fetch_ftp(const char *url)
setpeer(xargc, xargv);
autologin = oautologin;
if ((connected == 0) ||
- (connected == 1 && !ftp_login(host, user, pass))) {
- warnx("Can't connect or login to host `%s'", host);
+ (connected == 1 && !ftp_login(host, uuser, pass))) {
+ warnx("Can't connect or login to host `%s:%s'",
+ host, port ? port : "?");
goto cleanup_fetch_ftp;
}
- switch (type) {
+ switch (transtype) {
case TYPE_A:
setascii(1, xargv);
break;
@@ -1469,7 +1518,7 @@ fetch_ftp(const char *url)
setbinary(1, xargv);
break;
default:
- errx(1, "fetch_ftp: unknown transfer type %d", type);
+ errx(1, "fetch_ftp: unknown transfer type %d", transtype);
}
/*
@@ -1488,12 +1537,12 @@ fetch_ftp(const char *url)
* directories in one step.
*
* If we are dealing with an `ftp://host/path' URL
- * (urltype is FTP_URL_T), then RFC 1738 says we need to
+ * (urltype is FTP_URL_T), then RFC3986 says we need to
* send a separate CWD command for each unescaped "/"
* in the path, and we have to interpret %hex escaping
* *after* we find the slashes. It's possible to get
* empty components here, (from multiple adjacent
- * slashes in the path) and RFC 1738 says that we should
+ * slashes in the path) and RFC3986 says that we should
* still do `CWD ' (with a null argument) in such cases.
*
* Many ftp servers don't support `CWD ', so if there's an
@@ -1551,12 +1600,11 @@ fetch_ftp(const char *url)
url_decode(dir);
} else
nextpart = NULL;
- if (debug)
- fprintf(ttyout, "dir `%s', nextpart `%s'\n",
- dir ? dir : "<null>",
- nextpart ? nextpart : "<null>");
+ DPRINTF("fetch_ftp: dir `%s', nextpart `%s'\n",
+ STRorNULL(dir), STRorNULL(nextpart));
if (urltype == FTP_URL_T || *dir != '\0') {
- xargv[0] = "cd";
+ (void)strlcpy(cmdbuf, "cd", sizeof(cmdbuf));
+ xargv[0] = cmdbuf;
xargv[1] = dir;
xargv[2] = NULL;
dirchange = 0;
@@ -1566,8 +1614,8 @@ fetch_ftp(const char *url)
fprintf(stderr,
"\n"
"ftp: The `CWD ' command (without a directory), which is required by\n"
-" RFC 1738 to support the empty directory in the URL pathname (`//'),\n"
-" conflicts with the server's conformance to RFC 959.\n"
+" RFC3986 to support the empty directory in the URL pathname (`//'),\n"
+" conflicts with the server's conformance to RFC0959.\n"
" Try the same URL without the `//' in the URL pathname.\n"
"\n");
goto cleanup_fetch_ftp;
@@ -1591,7 +1639,8 @@ fetch_ftp(const char *url)
/* Fetch the file(s). */
xargc = 2;
- xargv[0] = "get";
+ (void)strlcpy(cmdbuf, "get", sizeof(cmdbuf));
+ xargv[0] = cmdbuf;
xargv[1] = file;
xargv[2] = NULL;
if (dirhasglob || filehasglob) {
@@ -1600,9 +1649,10 @@ fetch_ftp(const char *url)
ointeractive = interactive;
interactive = 0;
if (restartautofetch)
- xargv[0] = "mreget";
+ (void)strlcpy(cmdbuf, "mreget", sizeof(cmdbuf));
else
- xargv[0] = "mget";
+ (void)strlcpy(cmdbuf, "mget", sizeof(cmdbuf));
+ xargv[0] = cmdbuf;
mget(xargc, xargv);
interactive = ointeractive;
} else {
@@ -1626,9 +1676,12 @@ fetch_ftp(const char *url)
rval = 0;
cleanup_fetch_ftp:
+ FREEPTR(port);
FREEPTR(host);
FREEPTR(path);
- FREEPTR(user);
+ FREEPTR(uuser);
+ if (pass)
+ memset(pass, 0, strlen(pass));
FREEPTR(pass);
return (rval);
}
@@ -1648,7 +1701,7 @@ fetch_ftp(const char *url)
static int
go_fetch(const char *url)
{
- char *proxy;
+ char *proxyenv;
#ifndef NO_ABOUT
/*
@@ -1697,8 +1750,8 @@ go_fetch(const char *url)
* If ftpproxy is set with an FTP URL, use fetch_url()
* Othewise, use fetch_ftp().
*/
- proxy = getoptionvalue("ftp_proxy");
- if (!EMPTYSTRING(proxy) && STRNEQUAL(url, FTP_URL))
+ proxyenv = getoptionvalue("ftp_proxy");
+ if (!EMPTYSTRING(proxyenv) && STRNEQUAL(url, FTP_URL))
return (fetch_url(url, NULL, NULL, NULL));
return (fetch_ftp(url));
@@ -1719,10 +1772,9 @@ go_fetch(const char *url)
int
auto_fetch(int argc, char *argv[])
{
- volatile int argpos;
- int rval;
+ volatile int argpos, rval;
- argpos = 0;
+ argpos = rval = 0;
if (sigsetjmp(toplevel, 1)) {
if (connected)
@@ -1737,7 +1789,7 @@ auto_fetch(int argc, char *argv[])
/*
* Loop through as long as there's files to fetch.
*/
- for (rval = 0; (rval == 0) && (argpos < argc); argpos++) {
+ for (; (rval == 0) && (argpos < argc); argpos++) {
if (strchr(argv[argpos], ':') == NULL)
break;
redirect_loop = 0;
@@ -1757,38 +1809,47 @@ auto_fetch(int argc, char *argv[])
}
+/*
+ * Upload multiple files from the command line.
+ *
+ * If an error occurs the return value will be the offset+1 in
+ * argv[] of the file that caused a problem (i.e, argv[x]
+ * returns x+1)
+ * Otherwise, 0 is returned if all files uploaded successfully.
+ */
int
auto_put(int argc, char **argv, const char *uploadserver)
{
char *uargv[4], *path, *pathsep;
- int uargc, rval, len;
-
- uargc = 0;
- uargv[uargc++] = "mput";
- uargv[uargc++] = argv[0];
+ int uargc, rval, argpos;
+ size_t len;
+ char cmdbuf[MAX_C_NAME];
+
+ (void)strlcpy(cmdbuf, "mput", sizeof(cmdbuf));
+ uargv[0] = cmdbuf;
+ uargv[1] = argv[0];
+ uargc = 2;
uargv[2] = uargv[3] = NULL;
pathsep = NULL;
rval = 1;
- if (debug)
- fprintf(ttyout, "auto_put: target `%s'\n", uploadserver);
+ DPRINTF("auto_put: target `%s'\n", uploadserver);
- path = xstrdup(uploadserver);
+ path = ftp_strdup(uploadserver);
len = strlen(path);
if (path[len - 1] != '/' && path[len - 1] != ':') {
/*
* make sure we always pass a directory to auto_fetch
*/
if (argc > 1) { /* more than one file to upload */
- int len;
-
len = strlen(uploadserver) + 2; /* path + "/" + "\0" */
free(path);
- path = (char *)xmalloc(len);
+ path = (char *)ftp_malloc(len);
(void)strlcpy(path, uploadserver, len);
(void)strlcat(path, "/", len);
} else { /* single file to upload */
- uargv[0] = "put";
+ (void)strlcpy(cmdbuf, "put", sizeof(cmdbuf));
+ uargv[0] = cmdbuf;
pathsep = strrchr(path, '/');
if (pathsep == NULL) {
pathsep = strrchr(path, ':');
@@ -1797,38 +1858,44 @@ auto_put(int argc, char **argv, const char *uploadserver)
goto cleanup_auto_put;
}
pathsep++;
- uargv[2] = xstrdup(pathsep);
+ uargv[2] = ftp_strdup(pathsep);
pathsep[0] = '/';
} else
- uargv[2] = xstrdup(pathsep + 1);
+ uargv[2] = ftp_strdup(pathsep + 1);
pathsep[1] = '\0';
uargc++;
}
}
- if (debug)
- fprintf(ttyout, "auto_put: URL `%s' argv[2] `%s'\n",
- path, uargv[2] ? uargv[2] : "<null>");
+ DPRINTF("auto_put: URL `%s' argv[2] `%s'\n",
+ path, STRorNULL(uargv[2]));
/* connect and cwd */
rval = auto_fetch(1, &path);
- free(path);
if(rval >= 0)
goto cleanup_auto_put;
+ rval = 0;
+
+ /* target filename provided; upload 1 file */
/* XXX : is this the best way? */
if (uargc == 3) {
uargv[1] = argv[0];
put(uargc, uargv);
- goto cleanup_auto_put;
- }
-
- for(; argv[0] != NULL; argv++) {
- uargv[1] = argv[0];
- mput(uargc, uargv);
+ if ((code / 100) != COMPLETE)
+ rval = 1;
+ } else { /* otherwise a target dir: upload all files to it */
+ for(argpos = 0; argv[argpos] != NULL; argpos++) {
+ uargv[1] = argv[argpos];
+ mput(uargc, uargv);
+ if ((code / 100) != COMPLETE) {
+ rval = argpos + 1;
+ break;
+ }
+ }
}
- rval = 0;
cleanup_auto_put:
+ free(path);
FREEPTR(uargv[2]);
return (rval);
}
diff --git a/contrib/lukemftp/src/ftp.1 b/contrib/tnftp/src/ftp.1
index 917980f..34a88c2 100644
--- a/contrib/lukemftp/src/ftp.1
+++ b/contrib/tnftp/src/ftp.1
@@ -1,6 +1,7 @@
-.\" $NetBSD: ftp.1,v 1.109 2005/02/20 20:54:01 wiz Exp $
+.\" $NetBSD: ftp.1,v 1.13 2009/11/15 10:12:37 lukem Exp $
+.\" from NetBSD: ftp.1,v 1.130 2009/07/11 18:35:48 joerg Exp
.\"
-.\" Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
+.\" Copyright (c) 1996-2008 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
@@ -14,13 +15,6 @@
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation nor the names of its
-.\" contributors may be used to endorse or promote products derived
-.\" from this software without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -64,16 +58,15 @@
.\"
.\" @(#)ftp.1 8.3 (Berkeley) 10/9/94
.\"
-.Dd January 15, 2005
+.Dd May 10, 2008
.Dt FTP 1
.Os
.Sh NAME
.Nm ftp
-.Nd
-Internet file transfer program
+.Nd Internet file transfer program
.Sh SYNOPSIS
.Nm
-.Op Fl 46AadefginpRtvV
+.Op Fl 46AadefginpRtVv
.Bk -words
.Op Fl N Ar netrc
.Ek
@@ -89,6 +82,7 @@ Internet file transfer program
.Bk -words
.Op Fl r Ar retry
.Ek
+.Op Fl s Ar srcaddr
.Bk -words
.\" [-T dir,max[,inc]]
.Oo
@@ -179,7 +173,7 @@ below for more information.
.Pp
Options may be specified at the command line, or to the
command interpreter.
-.Bl -tag -width "port "
+.Bl -tag -width Fl
.It Fl 4
Forces
.Nm
@@ -219,6 +213,14 @@ Disables file name globbing.
.It Fl i
Turns off interactive prompting during
multiple file transfers.
+.It Fl N Ar netrc
+Use
+.Ar netrc
+instead of
+.Pa ~/.netrc .
+Refer to
+.Sx THE .netrc FILE
+for more information.
.It Fl n
Restrains
.Nm
@@ -238,14 +240,6 @@ identity on the local machine), and, if necessary, prompt for a password
and an account with which to login.
To override the auto-login for auto-fetch transfers, specify the
username (and optionally, password) as appropriate.
-.It Fl N Ar netrc
-Use
-.Ar netrc
-instead of
-.Pa ~/.netrc .
-Refer to
-.Sx THE .netrc FILE
-for more information.
.It Fl o Ar output
When auto-fetching files, save the contents in
.Ar output .
@@ -263,35 +257,32 @@ then only the first file specified will be retrieved into
.Ar output ;
all other files will be retrieved into the basename of their
remote name.
+.It Fl P Ar port
+Sets the port number to
+.Ar port .
.It Fl p
Enable passive mode operation for use behind connection filtering firewalls.
This option has been deprecated as
.Nm
now tries to use passive mode by default, falling back to active mode
if the server does not support passive connections.
-.It Fl P Ar port
-Sets the port number to
-.Ar port .
-.It Fl r Ar wait
-Retry the connection attempt if it failed, pausing for
-.Ar wait
-seconds.
.It Fl q Ar quittime
Quit if the connection has stalled for
.Ar quittime
seconds.
.It Fl R
Restart all non-proxied auto-fetches.
+.It Fl r Ar wait
+Retry the connection attempt if it failed, pausing for
+.Ar wait
+seconds.
+.It Fl s Ar srcaddr
+Uses
+.Ar srcaddr
+as the local IP address for all connections.
.It Fl t
Enables packet tracing.
-.It Xo
-.Fl T
-.Sm off
-.Ar direction ,
-.Ar maximum
-.Op , Ar increment
-.Sm on
-.Xc
+.It Fl T Ar direction Ns , Ns Ar maximum Ns Oo , Ns Ar increment Oc
Set the maximum transfer rate for
.Ar direction
to
@@ -312,6 +303,12 @@ is one of the ftp URL types as supported by auto-fetch
(with an optional target filename for single file uploads), and
.Ar file
is one or more local files to be uploaded.
+.It Fl V
+Disable
+.Ic verbose
+and
+.Ic progress ,
+overriding the default of enabled when output is to a terminal.
.It Fl v
Enable
.Ic verbose
@@ -325,12 +322,6 @@ Forces
.Nm
to show all responses from the remote server, as well
as report on data transfer statistics.
-.It Fl V
-Disable
-.Ic verbose
-and
-.Ic progress ,
-overriding the default of enabled when output is to a terminal.
.El
.Pp
The client host with which
@@ -351,8 +342,8 @@ is awaiting commands from the user the prompt
is provided to the user.
The following commands are recognized
by
-.Nm ftp :
-.Bl -tag -width Fl
+.Nm ftp :
+.Bl -tag -width Ic
.It Ic \&! Op Ar command Op Ar args
Invoke an interactive shell on the local machine.
If there are arguments, the first is taken to be a command to execute
@@ -455,16 +446,6 @@ when an ascii type transfer is made, these linefeeds may be
distinguished from a record delimiter only when
.Ic \&cr
is off.
-.It Ic debug Op Ar debug-value
-Toggle debugging mode.
-If an optional
-.Ar debug-value
-is specified it is used to set the debugging level.
-When debugging is on,
-.Nm
-prints each command sent to the remote machine, preceded
-by the string
-.Ql \-\-\*[Gt]
.It Ic delete Ar remote-file
Delete the file
.Ar remote-file
@@ -500,12 +481,13 @@ Toggle command line editing, and context sensitive command and file
completion.
This is automatically enabled if input is from a terminal, and
disabled otherwise.
-.It Ic epsv4
+.It Ic epsv epsv4 epsv6
Toggle the use of the extended
.Dv EPSV
and
.Dv EPRT
-commands on IPv4 connections; first try
+commands on all IP, IPv4, and IPv6 connections respectively.
+First try
.Dv EPSV /
.Dv EPRT ,
and then
@@ -514,7 +496,10 @@ and then
This is enabled by default.
If an extended command fails then this option will be temporarily
disabled for the duration of the current connection, or until
-.Ic epsv4
+.Ic epsv ,
+.Ic epsv4 ,
+or
+.Ic epsv6
is executed again.
.It Ic exit
A synonym for
@@ -538,6 +523,16 @@ format is
.It Ic ftp Ar host Op Ar port
A synonym for
.Ic open .
+.It Ic ftp_debug Op Ar ftp_debug-value
+Toggle debugging mode.
+If an optional
+.Ar ftp_debug-value
+is specified it is used to set the debugging level.
+When debugging is on,
+.Nm
+prints each command sent to the remote machine, preceded
+by the string
+.Ql \-\-\*[Gt] .
.It Ic gate Op Ar host Op Ar port
Toggle gate-ftp mode, which used to connect through the
TIS FWTK and Gauntlet ftp proxies.
@@ -613,8 +608,9 @@ transferring a
.Xr tar 1
archive of the subtree (in binary mode).
.It Ic hash Op Ar size
-Toggle hash-sign (``#'') printing for each data block
-transferred.
+Toggle hash-sign
+.Pq Sq #
+printing for each data block transferred.
The size of a data block defaults to 1024 bytes.
This can be changed by specifying
.Ar size
@@ -663,24 +659,49 @@ A synonym for
Define a macro.
Subsequent lines are stored as the macro
.Ar macro-name ;
-a null line (consecutive newline characters
-in a file or
-carriage returns from the terminal) terminates macro input mode.
+a null line (consecutive newline characters in a file or carriage
+returns from the terminal) terminates macro input mode.
There is a limit of 16 macros and 4096 total characters in all
defined macros.
-Macros remain defined until a
+Macro names can be a maximum of 8 characters.
+Macros are only applicable to the current session they are
+defined within (or if defined outside a session, to the session
+invoked with the next
+.Ic open
+command), and remain defined until a
.Ic close
command is executed.
-The macro processor interprets `$' and `\e' as special characters.
-A `$' followed by a number (or numbers) is replaced by the
+To invoke a macro, use the
+.Ic $
+command (see above).
+.Pp
+The macro processor interprets
+.Sq $
+and
+.Sq \e
+as special characters.
+A
+.Sq $
+followed by a number (or numbers) is replaced by the
corresponding argument on the macro invocation command line.
-A `$' followed by an `i' signals that macro processor that the
-executing macro is to be looped.
-On the first pass `$i' is
-replaced by the first argument on the macro invocation command line,
-on the second pass it is replaced by the second argument, and so on.
-A `\e' followed by any character is replaced by that character.
-Use the `\e' to prevent special treatment of the `$'.
+A
+.Sq $
+followed by an
+.Sq i
+signals the macro processor that the executing macro is to be
+looped.
+On the first pass
+.Dq $i
+is replaced by the first argument on the macro invocation command
+line, on the second pass it is replaced by the second argument,
+and so on.
+A
+.Sq \e
+followed by any character is replaced by that character.
+Use the
+.Sq \e
+to prevent special treatment of the
+.Sq $ .
.It Ic mdelete Op Ar remote-files
Delete the
.Ar remote-files
@@ -756,7 +777,9 @@ The default (and only supported)
mode is
.Dq stream .
.It Ic modtime Ar remote-file
-Show the last modification time of the file on the remote machine.
+Show the last modification time of the file on the remote machine, in
+.Li RFC2822
+format.
.It Ic more Ar file
A synonym for
.Ic page .
@@ -823,9 +846,18 @@ and
.Ic case
settings).
Variable templating is accomplished by including the
-sequences `$1', `$2', ..., `$9' in
+sequences
+.Dq $1 ,
+.Dq $2 ,
+\&...
+.Dq $9
+in
.Ar inpattern .
-Use `\\' to prevent this special treatment of the `$' character.
+Use
+.Sq \e
+to prevent this special treatment of the
+.Sq $
+character.
All other characters are treated literally, and are used to determine the
.Ic nmap
.Op Ar inpattern
@@ -837,13 +869,19 @@ $1.$2 and the remote file name "mydata.data", $1 would have the value
The
.Ar outpattern
determines the resulting mapped filename.
-The sequences `$1', `$2', ...., `$9' are replaced by any value resulting
-from the
+The sequences
+.Dq $1 ,
+.Dq $2 ,
+\&...
+.Dq $9
+are replaced by any value resulting from the
.Ar inpattern
template.
-The sequence `$0' is replace by the original filename.
+The sequence
+.Dq $0
+is replaced by the original filename.
Additionally, the sequence
-.Ql Op Ar seq1 , Ar seq2
+.Dq Op Ar seq1 , Ar seq2
is replaced by
.Op Ar seq1
if
@@ -862,9 +900,18 @@ the output filename "myfile.data" for input filenames "myfile.data" and
"myfile.myfile" for the input filename ".myfile".
Spaces may be included in
.Ar outpattern ,
-as in the example: `nmap $1 sed "s/ *$//" \*[Gt] $1' .
-Use the `\e' character to prevent special treatment
-of the `$','[',']', and `,' characters.
+as in the example:
+.Dl nmap $1 sed "s/ *$//" \*[Gt] $1
+Use the
+.Sq \e
+character to prevent special treatment
+of the
+.Sq $ ,
+.Sq \&[ ,
+.Sq \&] ,
+and
+.Sq \&,
+characters.
.It Ic ntrans Op Ar inchars Op Ar outchars
Set or unset the filename character translation mechanism.
If no arguments are specified, the filename character
@@ -952,7 +999,7 @@ traffic.
servers are required to support the
.Dv PASV
command by
-.Li RFC 1123 ,
+.Li RFC1123 ,
some do not.)
.It Ic pdir Op Ar remote-path
Perform
@@ -1100,10 +1147,7 @@ A synonym for
The arguments specified are sent, verbatim, to the remote
.Tn FTP
server.
-.It Xo
-.Ic rate Ar direction
-.Op Ar maximum Op Ar increment
-.Xc
+.It Ic rate Ar direction Oo Ar maximum Oo Ar increment Oc Oc
Throttle the maximum transfer rate to
.Ar maximum
bytes/second.
@@ -1126,7 +1170,6 @@ Outgoing transfers.
can be modified on the fly by
.Ar increment
bytes (default: 1024) each time a given signal is received:
-.B
.Bl -tag -width "SIGUSR1" -offset indent
.It Dv SIGUSR1
Increment
@@ -1388,10 +1431,7 @@ for more information.
.It Ic usage Ar command
Print the usage message for
.Ar command .
-.It Xo
-.Ic user Ar user-name
-.Op Ar password Op Ar account
-.Xc
+.It Ic user Ar user-name Oo Ar password Oo Ar account Oc Oc
Identify yourself to the remote
.Tn FTP
server.
@@ -1439,7 +1479,9 @@ A synonym for
.El
.Pp
Command arguments which have embedded spaces may be quoted with
-quote `"' marks.
+quote
+.Sq \&"
+marks.
.Pp
Commands which toggle settings can take an explicit
.Ic on
@@ -1491,14 +1533,8 @@ on the command line.
The following formats are valid syntax for an auto-fetch element:
.Bl -tag -width "FOO "
.\" [user@]host:[path][/]
-.It Xo
-.Sm off
-.Op Ar user Li \&@
-.Ar host Li \&:
-.Op Ar path
-.Op Li /
-.Sm on
-.Xc
+.It Oo Ar user Ns Li \&@ Oc Ns Ar host Ns Li \&: Ns Oo Ar path Oc \
+Ns Oo Li / Oc
.Dq Classic
.Tn FTP
format.
@@ -1523,18 +1559,9 @@ in the current directory.
Otherwise, the full remote name is used as the local name,
relative to the local root directory.
.\" ftp://[user[:password]@]host[:port]/path[/][;type=X]
-.It Xo
-.Sm off
-.Li ftp://
-.Oo Ar user
-.Op Li \&: Ar password
-.Li \&@ Oc
-.Ar host Oo Li \&: Ar port Oc
-.Li / Ar path
-.Op Li /
-.Op Li ;type= Ar X
-.Sm on
-.Xc
+.It Li ftp:// Ns Oo Ar user Ns Oo Ns Li \&: Ns Ar password Oc Ns Li \&@ Oc \
+Ns Ar host Ns Oo Li \&: Ns Ar port Oc Ns Li / Ns Ar path Ns Oo Li / Oc \
+Ns Oo Li ;type= Ns Ar X Oc
An
.Tn FTP
URL, retrieved using the
@@ -1565,7 +1592,7 @@ ascii or binary (respectively).
The default transfer type is binary.
.Pp
In order to be compliant with
-.Li RFC 1738 ,
+.Li RFC3986 ,
.Nm
interprets the
.Ar path
@@ -1618,7 +1645,7 @@ Any
.Sq Li \&% Ns Ar XX
codes
(per
-.Li RFC 1738 )
+.Li RFC3986 )
within the path components are decoded, with
.Ar XX
representing a character code in hexadecimal.
@@ -1705,16 +1732,8 @@ intermediate directories that is used in the equivalent of a
command.
.El
.\" http://[user[:password]@]host[:port]/path
-.It Xo
-.Sm off
-.Li http://
-.Oo Ar user
-.Op Li \&: Ar password
-.Li \&@ Oc
-.Ar host Oo Li \&: Ar port Oc
-.Li / Ar path
-.Sm on
-.Xc
+.It Li http:// Ns Oo Ar user Ns Oo Li \&: Ns Ar password Oc Ns Li \&@ Oc \
+Ns Ar host Ns Oo Li \&: Ns Ar port Oc Ns Li / Ns Ar path
An
.Tn HTTP
URL, retrieved using the
@@ -1735,14 +1754,25 @@ and
.Sq password )
is in the URL, use them for the first attempt to authenticate.
.\" file:///path
-.It Xo
-.Sm off
-.Li file:/// Ar path
-.Sm on
-.Xc
+.It Li file:/// Ns Ar path
A local URL, copied from
.Pa / Ns Ar path
on the local host.
+.\" about:
+.It Li about: Ns Ar topic
+Display information regarding
+.Ar topic ;
+no file is retrieved for this auto-fetched element.
+Supported values include:
+.Bl -tag -width "about:version"
+.It Li about:ftp
+Information about
+.Nm ftp .
+.It Li about:version
+The version of
+.Nm ftp .
+Useful to provide when reporting problems.
+.El
.El
.Pp
Unless noted otherwise above, and
@@ -1868,11 +1898,12 @@ A particularly
useful example of this mechanism is:
.Dq Li dir \&"\&" \&|more .
.It
-Failing the above checks, if ``globbing'' is enabled,
-local file names are expanded
-according to the rules used in the
+Failing the above checks, if
+.Dq globbing
+is enabled, local file names are expanded according to the rules
+used in the
.Xr csh 1 ;
-c.f. the
+see the
.Ic glob
command.
If the
@@ -2038,6 +2069,20 @@ next
.Pa .netrc
line and continue until a blank line (consecutive new-line
characters) is encountered.
+Like the other tokens in the
+.Pa .netrc
+file, a
+.Ic macdef
+is applicable only to the
+.Ic machine
+definition preceding it.
+A
+.Ic macdef
+entry cannot be used by multiple
+.Ic machine
+definitions; rather, it must be defined following each
+.Ic machine
+it is intended to be used with.
If a macro named
.Ic init
is defined, it is automatically executed as the last step in the
@@ -2100,14 +2145,7 @@ information:
.It Li \&%/
The current remote working directory.
.\" %c[[0]n], %.[[0]n]
-.It Xo
-.Sm off
-.Li \&%c
-.Op Oo Li 0 Oc Ar n Ns ,
-.Li \&%.
-.Op Oo Li 0 Oc Ar n
-.Sm on
-.Xc
+.It \&%c Ns Oo Oo Li 0 Oc Ns Ar n Oc , Ns Li \&%. Ns Oo Oo Li 0 Oc Ns Ar n Oc
The trailing component of the current remote working directory, or
.Em n
trailing components if a digit
@@ -2248,7 +2286,7 @@ URL characters are required in the username or password
or
.Sq / ) ,
encode them with
-.Li RFC 1738
+.Li RFC3986
.Sq Li \&% Ns Ar XX
encoding.
.Pp
@@ -2291,16 +2329,27 @@ for an example of how to make this automatic.
.Xr ftpd 8
.Sh STANDARDS
.Nm
-attempts to be compliant with
-.Li RFC 959 ,
-.Li RFC 1123 ,
-.Li RFC 1738 ,
-.Li RFC 2068 ,
-.Li RFC 2389 ,
-.Li RFC 2428 ,
-.Li RFC 2732 ,
-and
-.Cm draft-ietf-ftpext-mlst-11 .
+attempts to be compliant with:
+.Bl -tag -offset indent -width 8n
+.It Li RFC0959
+.Em File Transfer Protocol
+.It Li RFC1123
+.Em Requirements for Internet Hosts - Application and Support
+.It Li RFC1635
+.Em How to Use Anonymous FTP
+.It Li RFC2389
+.Em Feature negotiation mechanism for the File Transfer Protocol
+.It Li RFC2428
+.Em FTP Extensions for IPv6 and NATs
+.It Li RFC2616
+.Em Hypertext Transfer Protocol -- HTTP/1.1
+.It Li RFC2822
+.Em Internet Message Format
+.It Li RFC3659
+.Em Extensions to FTP
+.It Li RFC3986
+.Em Uniform Resource Identifier (URI)
+.El
.Sh HISTORY
The
.Nm
diff --git a/contrib/lukemftp/src/ftp.c b/contrib/tnftp/src/ftp.c
index dae6131..4c4942f 100644
--- a/contrib/lukemftp/src/ftp.c
+++ b/contrib/tnftp/src/ftp.c
@@ -1,7 +1,8 @@
-/* $NetBSD: ftp.c,v 1.132 2005/05/14 15:26:43 lukem Exp $ */
+/* $NetBSD: ftp.c,v 1.18 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: ftp.c,v 1.159 2009/04/15 03:42:33 jld Exp */
/*-
- * Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -94,12 +88,17 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+#include <arpa/telnet.h>
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94";
#else
-__RCSID("$NetBSD: ftp.c,v 1.132 2005/05/14 15:26:43 lukem Exp $");
+__RCSID(" NetBSD: ftp.c,v 1.159 2009/04/15 03:42:33 jld Exp ");
#endif
#endif /* not lint */
@@ -127,6 +126,8 @@ __RCSID("$NetBSD: ftp.c,v 1.132 2005/05/14 15:26:43 lukem Exp $");
#include <unistd.h>
#include <stdarg.h>
+#endif /* tnftp */
+
#include "ftp_var.h"
volatile sig_atomic_t abrtflag;
@@ -146,12 +147,12 @@ struct sockinet {
struct sockaddr_in6 su_sin6;
#endif
} si_su;
-#if !HAVE_SOCKADDR_SA_LEN
+#if !defined(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
int si_len;
#endif
};
-#if !HAVE_SOCKADDR_SA_LEN
+#if !defined(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
# define su_len si_len
#else
# define su_len si_su.su_sin.sin_len
@@ -162,27 +163,26 @@ struct sockinet {
struct sockinet myctladdr, hisctladdr, data_addr;
char *
-hookup(char *host, char *port)
+hookup(const char *host, const char *port)
{
- int s = -1, error, portnum;
+ int s = -1, error;
struct addrinfo hints, *res, *res0;
- char hbuf[MAXHOSTNAMELEN];
static char hostnamebuf[MAXHOSTNAMELEN];
- char *cause = "unknown";
socklen_t len;
int on = 1;
memset((char *)&hisctladdr, 0, sizeof (hisctladdr));
memset((char *)&myctladdr, 0, sizeof (myctladdr));
memset(&hints, 0, sizeof(hints));
- portnum = parseport(port, FTP_PORT);
hints.ai_flags = AI_CANONNAME;
hints.ai_family = family;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
- error = getaddrinfo(host, NULL, &hints, &res0);
+ error = getaddrinfo(host, port, &hints, &res0);
if (error) {
- warnx("%s", gai_strerror(error));
+ warnx("Can't lookup `%s:%s': %s", host, port,
+ (error == EAI_SYSTEM) ? strerror(errno)
+ : gai_strerror(error));
code = -1;
return (0);
}
@@ -195,53 +195,26 @@ hookup(char *host, char *port)
hostname = hostnamebuf;
for (res = res0; res; res = res->ai_next) {
- /*
- * make sure that ai_addr is NOT an IPv4 mapped address.
- * IPv4 mapped address complicates too many things in FTP
- * protocol handling, as FTP protocol is defined differently
- * between IPv4 and IPv6.
- *
- * This may not be the best way to handle this situation,
- * since the semantics of IPv4 mapped address is defined in
- * the kernel. There are configurations where we should use
- * IPv4 mapped address as native IPv6 address, not as
- * "an IPv6 address that embeds IPv4 address" (namely, SIIT).
- *
- * More complete solution would be to have an additional
- * getsockopt to grab "real" peername/sockname. "real"
- * peername/sockname will be AF_INET if IPv4 mapped address
- * is used to embed IPv4 address, and will be AF_INET6 if
- * we use it as native. What a mess!
- */
+ char hname[NI_MAXHOST], sname[NI_MAXSERV];
+
ai_unmapped(res);
-#if 0 /*old behavior*/
- if (res != res0) /* not on the first address */
-#else
- if (res0->ai_next) /* if we have multiple possibilities */
-#endif
- {
- if (getnameinfo(res->ai_addr, res->ai_addrlen,
- hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST))
- strlcpy(hbuf, "?", sizeof(hbuf));
- fprintf(ttyout, "Trying %s...\n", hbuf);
+ if (getnameinfo(res->ai_addr, res->ai_addrlen,
+ hname, sizeof(hname), sname, sizeof(sname),
+ NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
+ strlcpy(hname, "?", sizeof(hname));
+ strlcpy(sname, "?", sizeof(sname));
+ }
+ if (verbose && res0->ai_next) {
+ /* if we have multiple possibilities */
+ fprintf(ttyout, "Trying %s:%s ...\n", hname, sname);
}
- ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(portnum);
s = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
if (s < 0) {
- cause = "socket";
+ warn("Can't create socket for connection to `%s:%s'",
+ hname, sname);
continue;
}
- error = xconnect(s, res->ai_addr, res->ai_addrlen);
- if (error) {
- /* this "if" clause is to prevent print warning twice */
- if (res->ai_next) {
- if (getnameinfo(res->ai_addr, res->ai_addrlen,
- hbuf, sizeof(hbuf), NULL, 0,
- NI_NUMERICHOST))
- strlcpy(hbuf, "?", sizeof(hbuf));
- warn("connect to address %s", hbuf);
- }
- cause = "connect";
+ if (ftp_connect(s, res->ai_addr, res->ai_addrlen) < 0) {
close(s);
s = -1;
continue;
@@ -251,7 +224,7 @@ hookup(char *host, char *port)
break;
}
if (s < 0) {
- warn("%s", cause);
+ warnx("Can't connect to `%s:%s'", host, port);
code = -1;
freeaddrinfo(res0);
return 0;
@@ -263,7 +236,8 @@ hookup(char *host, char *port)
len = hisctladdr.su_len;
if (getsockname(s, (struct sockaddr *)&myctladdr.si_su, &len) == -1) {
- warn("getsockname");
+ warn("Can't determine my address of connection to `%s:%s'",
+ host, port);
code = -1;
goto bad;
}
@@ -274,8 +248,7 @@ hookup(char *host, char *port)
int tos = IPTOS_LOWDELAY;
if (setsockopt(s, IPPROTO_IP, IP_TOS,
(void *)&tos, sizeof(tos)) == -1) {
- if (debug)
- warn("setsockopt %s (ignored)",
+ DWARN("setsockopt %s (ignored)",
"IPTOS_LOWDELAY");
}
}
@@ -283,7 +256,7 @@ hookup(char *host, char *port)
cin = fdopen(s, "r");
cout = fdopen(s, "w");
if (cin == NULL || cout == NULL) {
- warnx("fdopen failed.");
+ warnx("Can't fdopen socket");
if (cin)
(void)fclose(cin);
if (cout)
@@ -304,8 +277,7 @@ hookup(char *host, char *port)
if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE,
(void *)&on, sizeof(on)) == -1) {
- if (debug)
- warn("setsockopt %s (ignored)", "SO_OOBINLINE");
+ DWARN("setsockopt %s (ignored)", "SO_OOBINLINE");
}
return (hostname);
@@ -351,7 +323,8 @@ command(const char *fmt, ...)
int r;
sigfunc oldsigint;
- if (debug) {
+#ifndef NO_DEBUG
+ if (ftp_debug) {
fputs("---> ", ttyout);
va_start(ap, fmt);
if (strncmp("PASS ", fmt, 5) == 0)
@@ -363,8 +336,9 @@ command(const char *fmt, ...)
va_end(ap);
putc('\n', ttyout);
}
+#endif
if (cout == NULL) {
- warnx("No control connection for command.");
+ warnx("No control connection for command");
code = -1;
return (0);
}
@@ -386,11 +360,17 @@ command(const char *fmt, ...)
return (r);
}
+static const char *m421[] = {
+ "remote server timed out. Connection closed",
+ "user interrupt. Connection closed",
+ "remote server has closed connection",
+};
+
int
getreply(int expecteof)
{
char current_line[BUFSIZ]; /* last line of previous reply */
- int c, n, line;
+ int c, n, lineno;
int dig;
int originalcode = 0, continuation = 0;
sigfunc oldsigint, oldsigalrm;
@@ -403,10 +383,11 @@ getreply(int expecteof)
oldsigint = xsignal(SIGINT, cmdabort);
oldsigalrm = xsignal(SIGALRM, cmdtimeout);
- for (line = 0 ;; line++) {
+ for (lineno = 0 ;; lineno++) {
dig = n = code = 0;
cp = current_line;
- while (alarmtimer(60),((c = getc(cin)) != '\n')) {
+ while (alarmtimer(quit_time ? quit_time : 60),
+ ((c = getc(cin)) != '\n')) {
if (c == IAC) { /* handle telnet commands */
switch (c = getc(cin)) {
case WILL:
@@ -445,18 +426,15 @@ getreply(int expecteof)
cpend = 0;
lostpeer(0);
if (verbose) {
+ size_t midx;
if (reply_timeoutflag)
- fputs(
- "421 Service not available, remote server timed out. Connection closed\n",
- ttyout);
+ midx = 0;
else if (reply_abrtflag)
- fputs(
- "421 Service not available, user interrupt. Connection closed.\n",
- ttyout);
+ midx = 1;
else
- fputs(
- "421 Service not available, remote server has closed connection.\n",
- ttyout);
+ midx = 2;
+ (void)fprintf(ttyout,
+ "421 Service not available, %s.\n", m421[midx]);
(void)fflush(ttyout);
}
code = 421;
@@ -505,15 +483,15 @@ getreply(int expecteof)
if (verbose > 0 || ((verbose > -1 && n == '5') &&
(n < '5' || !retry_connect))) {
(void)putc(c, ttyout);
- (void)fflush (ttyout);
+ (void)fflush(ttyout);
}
if (cp[-1] == '\r')
cp[-1] = '\0';
*cp = '\0';
- if (line == 0)
+ if (lineno == 0)
(void)strlcpy(reply_string, current_line,
sizeof(reply_string));
- if (line > 0 && code == 0 && reply_callback != NULL)
+ if (lineno > 0 && code == 0 && reply_callback != NULL)
(*reply_callback)(current_line);
if (continuation && code != originalcode) {
if (originalcode == 0)
@@ -537,14 +515,14 @@ getreply(int expecteof)
}
static int
-empty(FILE *cin, FILE *din, int sec)
+empty(FILE *ecin, FILE *din, int sec)
{
int nr, nfd;
struct pollfd pfd[2];
nfd = 0;
- if (cin) {
- pfd[nfd].fd = fileno(cin);
+ if (ecin) {
+ pfd[nfd].fd = fileno(ecin);
pfd[nfd++].events = POLLIN;
}
@@ -553,12 +531,12 @@ empty(FILE *cin, FILE *din, int sec)
pfd[nfd++].events = POLLIN;
}
- if ((nr = xpoll(pfd, nfd, sec * 1000)) <= 0)
+ if ((nr = ftp_poll(pfd, nfd, sec * 1000)) <= 0)
return nr;
nr = 0;
nfd = 0;
- if (cin)
+ if (ecin)
nr |= (pfd[nfd++].revents & POLLIN) ? 1 : 0;
if (din)
nr |= (pfd[nfd++].revents & POLLIN) ? 2 : 0;
@@ -585,8 +563,7 @@ abortxfer(int notused)
strlcpy(msgbuf, "\nsend", sizeof(msgbuf));
break;
default:
- errx(1, "abortxfer called with unknown direction `%s'",
- direction);
+ errx(1, "abortxfer: unknown direction `%s'", direction);
}
len = strlcat(msgbuf, " aborted. Waiting for remote to finish abort.\n",
sizeof(msgbuf));
@@ -594,30 +571,108 @@ abortxfer(int notused)
siglongjmp(xferabort, 1);
}
+/*
+ * Read data from infd & write to outfd, using buf/bufsize as the temporary
+ * buffer, dealing with short writes.
+ * If rate_limit != 0, rate-limit the transfer.
+ * If hash_interval != 0, fputc('c', ttyout) every hash_interval bytes.
+ * Updates global variables: bytes.
+ * Returns 0 if ok, 1 if there was a read error, 2 if there was a write error.
+ * In the case of error, errno contains the appropriate error code.
+ */
+static int
+copy_bytes(int infd, int outfd, char *buf, size_t bufsize,
+ int rate_limit, int hash_interval)
+{
+ volatile off_t hashc;
+ ssize_t inc, outc;
+ char *bufp;
+ struct timeval tvthen, tvnow, tvdiff;
+ off_t bufrem, bufchunk;
+ int serr;
+
+ hashc = hash_interval;
+ if (rate_limit)
+ bufchunk = rate_limit;
+ else
+ bufchunk = bufsize;
+
+ while (1) {
+ if (rate_limit) {
+ (void)gettimeofday(&tvthen, NULL);
+ }
+ errno = 0;
+ inc = outc = 0;
+ /* copy bufchunk at a time */
+ bufrem = bufchunk;
+ while (bufrem > 0) {
+ inc = read(infd, buf, MIN((off_t)bufsize, bufrem));
+ if (inc <= 0)
+ goto copy_done;
+ bytes += inc;
+ bufrem -= inc;
+ bufp = buf;
+ while (inc > 0) {
+ outc = write(outfd, bufp, inc);
+ if (outc < 0)
+ goto copy_done;
+ inc -= outc;
+ bufp += outc;
+ }
+ if (hash_interval) {
+ while (bytes >= hashc) {
+ (void)putc('#', ttyout);
+ hashc += hash_interval;
+ }
+ (void)fflush(ttyout);
+ }
+ }
+ if (rate_limit) { /* rate limited; wait if necessary */
+ while (1) {
+ (void)gettimeofday(&tvnow, NULL);
+ timersub(&tvnow, &tvthen, &tvdiff);
+ if (tvdiff.tv_sec > 0)
+ break;
+ usleep(1000000 - tvdiff.tv_usec);
+ }
+ }
+ }
+
+ copy_done:
+ serr = errno;
+ if (hash_interval && bytes > 0) {
+ if (bytes < hash_interval)
+ (void)putc('#', ttyout);
+ (void)putc('\n', ttyout);
+ (void)fflush(ttyout);
+ }
+ errno = serr;
+ if (inc == -1)
+ return 1;
+ if (outc == -1)
+ return 2;
+
+ return 0;
+}
+
void
sendrequest(const char *cmd, const char *local, const char *remote,
int printnames)
{
struct stat st;
- int c, d;
- FILE *fin, *dout;
- int (*closefunc)(FILE *);
- sigfunc oldintr, oldintp;
- volatile off_t hashbytes;
- char *lmode, *bufp;
+ int c;
+ FILE *volatile fin;
+ FILE *volatile dout;
+ int (*volatile closefunc)(FILE *);
+ sigfunc volatile oldintr;
+ sigfunc volatile oldintp;
+ off_t volatile hashbytes;
+ int hash_interval;
+ const char *lmode;
static size_t bufsize;
static char *buf;
int oprogress;
-#ifdef __GNUC__ /* to shut up gcc warnings */
- (void)&fin;
- (void)&dout;
- (void)&closefunc;
- (void)&oldintr;
- (void)&oldintp;
- (void)&lmode;
-#endif
-
hashbytes = mark;
direction = "sent";
dout = NULL;
@@ -625,7 +680,7 @@ sendrequest(const char *cmd, const char *local, const char *remote,
filesize = -1;
oprogress = progress;
if (verbose && printnames) {
- if (local && *local != '-')
+ if (*local != '-')
fprintf(ttyout, "local: %s ", local);
if (remote)
fprintf(ttyout, "remote: %s\n", remote);
@@ -655,7 +710,7 @@ sendrequest(const char *cmd, const char *local, const char *remote,
oldintp = xsignal(SIGPIPE, SIG_IGN);
fin = popen(local + 1, "r");
if (fin == NULL) {
- warn("%s", local + 1);
+ warn("Can't execute `%s'", local + 1);
code = -1;
goto cleanupsend;
}
@@ -664,7 +719,7 @@ sendrequest(const char *cmd, const char *local, const char *remote,
} else {
fin = fopen(local, "r");
if (fin == NULL) {
- warn("local: %s", local);
+ warn("Can't open `%s'", local);
code = -1;
goto cleanupsend;
}
@@ -698,7 +753,7 @@ sendrequest(const char *cmd, const char *local, const char *remote,
break;
}
if (rc < 0) {
- warn("local: %s", local);
+ warn("Can't seek to restart `%s'", local);
goto cleanupsend;
}
if (command("REST " LLF, (LLT)restart_point) != CONTINUE)
@@ -717,90 +772,28 @@ sendrequest(const char *cmd, const char *local, const char *remote,
if (dout == NULL)
goto abort;
- if (sndbuf_size > bufsize) {
+ if ((size_t)sndbuf_size > bufsize) {
if (buf)
(void)free(buf);
bufsize = sndbuf_size;
- buf = xmalloc(bufsize);
+ buf = ftp_malloc(bufsize);
}
progressmeter(-1);
oldintp = xsignal(SIGPIPE, SIG_IGN);
+ hash_interval = (hash && (!progress || filesize < 0)) ? mark : 0;
switch (curtype) {
case TYPE_I:
case TYPE_L:
- if (rate_put) { /* rate limited */
- while (1) {
- struct timeval then, now, td;
- off_t bufrem;
-
- (void)gettimeofday(&then, NULL);
- errno = c = d = 0;
- bufrem = rate_put;
- while (bufrem > 0) {
- if ((c = read(fileno(fin), buf,
- MIN(bufsize, bufrem))) <= 0)
- goto senddone;
- bytes += c;
- bufrem -= c;
- for (bufp = buf; c > 0;
- c -= d, bufp += d)
- if ((d = write(fileno(dout),
- bufp, c)) <= 0)
- break;
- if (d < 0)
- goto senddone;
- if (hash &&
- (!progress || filesize < 0) ) {
- while (bytes >= hashbytes) {
- (void)putc('#', ttyout);
- hashbytes += mark;
- }
- (void)fflush(ttyout);
- }
- }
- while (1) {
- (void)gettimeofday(&now, NULL);
- timersub(&now, &then, &td);
- if (td.tv_sec > 0)
- break;
- usleep(1000000 - td.tv_usec);
- }
- }
- } else { /* simpler/faster; no rate limit */
- while (1) {
- errno = c = d = 0;
- if ((c = read(fileno(fin), buf, bufsize)) <= 0)
- goto senddone;
- bytes += c;
- for (bufp = buf; c > 0; c -= d, bufp += d)
- if ((d = write(fileno(dout), bufp, c))
- <= 0)
- break;
- if (d < 0)
- goto senddone;
- if (hash && (!progress || filesize < 0) ) {
- while (bytes >= hashbytes) {
- (void)putc('#', ttyout);
- hashbytes += mark;
- }
- (void)fflush(ttyout);
- }
- }
- }
- senddone:
- if (hash && (!progress || filesize < 0) && bytes > 0) {
- if (bytes < mark)
- (void)putc('#', ttyout);
- (void)putc('\n', ttyout);
- }
- if (c < 0)
- warn("local: %s", local);
- if (d < 0) {
+ c = copy_bytes(fileno(fin), fileno(dout), buf, bufsize,
+ rate_put, hash_interval);
+ if (c == 1) {
+ warn("Reading `%s'", local);
+ } else if (c == 2) {
if (errno != EPIPE)
- warn("netout");
+ warn("Writing to network");
bytes = -1;
}
break;
@@ -808,8 +801,7 @@ sendrequest(const char *cmd, const char *local, const char *remote,
case TYPE_A:
while ((c = getc(fin)) != EOF) {
if (c == '\n') {
- while (hash && (!progress || filesize < 0) &&
- (bytes >= hashbytes)) {
+ while (hash_interval && bytes >= hashbytes) {
(void)putc('#', ttyout);
(void)fflush(ttyout);
hashbytes += mark;
@@ -821,23 +813,23 @@ sendrequest(const char *cmd, const char *local, const char *remote,
}
(void)putc(c, dout);
bytes++;
-#if 0 /* this violates RFC */
+#if 0 /* this violates RFC0959 */
if (c == '\r') {
(void)putc('\0', dout);
bytes++;
}
#endif
}
- if (hash && (!progress || filesize < 0)) {
+ if (hash_interval) {
if (bytes < hashbytes)
(void)putc('#', ttyout);
(void)putc('\n', ttyout);
}
if (ferror(fin))
- warn("local: %s", local);
+ warn("Reading `%s'", local);
if (ferror(dout)) {
if (errno != EPIPE)
- warn("netout");
+ warn("Writing to network");
bytes = -1;
}
break;
@@ -894,32 +886,28 @@ sendrequest(const char *cmd, const char *local, const char *remote,
}
void
-recvrequest(const char *cmd, const char *local, const char *remote,
+recvrequest(const char *cmd, const char *volatile local, const char *remote,
const char *lmode, int printnames, int ignorespecial)
{
- FILE *fout, *din;
- int (*closefunc)(FILE *);
- sigfunc oldintr, oldintp;
+ FILE *volatile fout;
+ FILE *volatile din;
+ int (*volatile closefunc)(FILE *);
+ sigfunc volatile oldintr;
+ sigfunc volatile oldintp;
int c, d;
- volatile int is_retr, tcrflag, bare_lfs;
+ int volatile is_retr;
+ int volatile tcrflag;
+ int volatile bare_lfs;
static size_t bufsize;
static char *buf;
- volatile off_t hashbytes;
+ off_t volatile hashbytes;
+ int hash_interval;
struct stat st;
time_t mtime;
struct timeval tval[2];
int oprogress;
int opreserve;
-#ifdef __GNUC__ /* to shut up gcc warnings */
- (void)&local;
- (void)&fout;
- (void)&din;
- (void)&closefunc;
- (void)&oldintr;
- (void)&oldintp;
-#endif
-
fout = NULL;
din = NULL;
hashbytes = mark;
@@ -931,7 +919,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
opreserve = preserve;
is_retr = (strcmp(cmd, "RETR") == 0);
if (is_retr && verbose && printnames) {
- if (local && (ignorespecial || *local != '-'))
+ if (ignorespecial || *local != '-')
fprintf(ttyout, "local: %s ", local);
if (remote)
fprintf(ttyout, "remote: %s\n", remote);
@@ -957,7 +945,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
char *dir = strrchr(local, '/');
if (errno != ENOENT && errno != EACCES) {
- warn("local: %s", local);
+ warn("Can't access `%s'", local);
code = -1;
goto cleanuprecv;
}
@@ -968,13 +956,13 @@ recvrequest(const char *cmd, const char *local, const char *remote,
if (dir != NULL)
*dir = '/';
if (d < 0) {
- warn("local: %s", local);
+ warn("Can't access `%s'", local);
code = -1;
goto cleanuprecv;
}
if (!runique && errno == EACCES &&
chmod(local, (S_IRUSR|S_IWUSR)) < 0) {
- warn("local: %s", local);
+ warn("Can't chmod `%s'", local);
code = -1;
goto cleanuprecv;
}
@@ -1026,7 +1014,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
oldintp = xsignal(SIGPIPE, SIG_IGN);
fout = popen(local + 1, "w");
if (fout == NULL) {
- warn("%s", local+1);
+ warn("Can't execute `%s'", local+1);
goto abort;
}
progress = 0;
@@ -1035,7 +1023,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
} else {
fout = fopen(local, lmode);
if (fout == NULL) {
- warn("local: %s", local);
+ warn("Can't open `%s'", local);
goto abort;
}
closefunc = fclose;
@@ -1045,14 +1033,15 @@ recvrequest(const char *cmd, const char *local, const char *remote,
progress = 0;
preserve = 0;
}
- if (rcvbuf_size > bufsize) {
+ if ((size_t)rcvbuf_size > bufsize) {
if (buf)
(void)free(buf);
bufsize = rcvbuf_size;
- buf = xmalloc(bufsize);
+ buf = ftp_malloc(bufsize);
}
progressmeter(-1);
+ hash_interval = (hash && (!progress || filesize < 0)) ? mark : 0;
switch (curtype) {
@@ -1060,76 +1049,17 @@ recvrequest(const char *cmd, const char *local, const char *remote,
case TYPE_L:
if (is_retr && restart_point &&
lseek(fileno(fout), restart_point, SEEK_SET) < 0) {
- warn("local: %s", local);
+ warn("Can't seek to restart `%s'", local);
goto cleanuprecv;
}
- if (rate_get) { /* rate limiting */
- while (1) {
- struct timeval then, now, td;
- off_t bufrem;
-
- (void)gettimeofday(&then, NULL);
- errno = c = d = 0;
- for (bufrem = rate_get; bufrem > 0; ) {
- if ((c = read(fileno(din), buf,
- MIN(bufsize, bufrem))) <= 0)
- goto recvdone;
- bytes += c;
- bufrem -=c;
- if ((d = write(fileno(fout), buf, c))
- != c)
- goto recvdone;
- if (hash &&
- (!progress || filesize < 0)) {
- while (bytes >= hashbytes) {
- (void)putc('#', ttyout);
- hashbytes += mark;
- }
- (void)fflush(ttyout);
- }
- }
- /* sleep until time is up */
- while (1) {
- (void)gettimeofday(&now, NULL);
- timersub(&now, &then, &td);
- if (td.tv_sec > 0)
- break;
- usleep(1000000 - td.tv_usec);
- }
- }
- } else { /* faster code (no limiting) */
- while (1) {
- errno = c = d = 0;
- if ((c = read(fileno(din), buf, bufsize)) <= 0)
- goto recvdone;
- bytes += c;
- if ((d = write(fileno(fout), buf, c)) != c)
- goto recvdone;
- if (hash && (!progress || filesize < 0)) {
- while (bytes >= hashbytes) {
- (void)putc('#', ttyout);
- hashbytes += mark;
- }
- (void)fflush(ttyout);
- }
- }
- }
- recvdone:
- if (hash && (!progress || filesize < 0) && bytes > 0) {
- if (bytes < mark)
- (void)putc('#', ttyout);
- (void)putc('\n', ttyout);
- }
- if (c < 0) {
+ c = copy_bytes(fileno(din), fileno(fout), buf, bufsize,
+ rate_get, hash_interval);
+ if (c == 1) {
if (errno != EPIPE)
- warn("netin");
+ warn("Reading from network");
bytes = -1;
- }
- if (d < c) {
- if (d < 0)
- warn("local: %s", local);
- else
- warnx("%s: short write", local);
+ } else if (c == 2) {
+ warn("Writing `%s'", local);
}
break;
@@ -1148,7 +1078,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
}
if (fseeko(fout, (off_t)0, SEEK_CUR) < 0) {
done:
- warn("local: %s", local);
+ warn("Can't seek to restart `%s'", local);
goto cleanuprecv;
}
}
@@ -1156,8 +1086,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
if (c == '\n')
bare_lfs++;
while (c == '\r') {
- while (hash && (!progress || filesize < 0) &&
- (bytes >= hashbytes)) {
+ while (hash_interval && bytes >= hashbytes) {
(void)putc('#', ttyout);
(void)fflush(ttyout);
hashbytes += mark;
@@ -1180,18 +1109,18 @@ recvrequest(const char *cmd, const char *local, const char *remote,
contin2: ;
}
break2:
- if (hash && (!progress || filesize < 0)) {
+ if (hash_interval) {
if (bytes < hashbytes)
(void)putc('#', ttyout);
(void)putc('\n', ttyout);
}
if (ferror(din)) {
if (errno != EPIPE)
- warn("netin");
+ warn("Reading from network");
bytes = -1;
}
if (ferror(fout))
- warn("local: %s", local);
+ warn("Writing `%s'", local);
break;
}
@@ -1221,7 +1150,8 @@ recvrequest(const char *cmd, const char *local, const char *remote,
if (utimes(local, tval) == -1) {
fprintf(ttyout,
"Can't change modification time on %s to %s",
- local, asctime(localtime(&mtime)));
+ local,
+ rfc2822time(localtime(&mtime)));
}
}
}
@@ -1230,7 +1160,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
abort:
/*
- * abort using RFC 959 recommended IP,SYNC sequence
+ * abort using RFC0959 recommended IP,SYNC sequence
*/
if (! sigsetjmp(xferabort, 1)) {
/* this is the first call */
@@ -1274,38 +1204,48 @@ initconn(void)
int result, tmpno = 0;
int on = 1;
int error;
- u_int addr[16], port[2];
- u_int af, hal, pal;
+ unsigned int addr[16], port[2];
+ unsigned int af, hal, pal;
socklen_t len;
- char *pasvcmd = NULL;
+ const char *pasvcmd = NULL;
+ int overbose;
#ifdef INET6
- if (myctladdr.su_family == AF_INET6 && debug &&
+#ifndef NO_DEBUG
+ if (myctladdr.su_family == AF_INET6 && ftp_debug &&
(IN6_IS_ADDR_LINKLOCAL(&myctladdr.si_su.su_sin6.sin6_addr) ||
IN6_IS_ADDR_SITELOCAL(&myctladdr.si_su.su_sin6.sin6_addr))) {
- warnx("use of scoped address can be troublesome");
+ warnx("Use of scoped addresses can be troublesome");
}
#endif
+#endif
+
reinit:
if (passivemode) {
data_addr = myctladdr;
data = socket(data_addr.su_family, SOCK_STREAM, 0);
if (data < 0) {
- warn("socket");
+ warn("Can't create socket for data connection");
return (1);
}
if ((options & SO_DEBUG) &&
setsockopt(data, SOL_SOCKET, SO_DEBUG,
(void *)&on, sizeof(on)) == -1) {
- if (debug)
- warn("setsockopt %s (ignored)", "SO_DEBUG");
+ DWARN("setsockopt %s (ignored)", "SO_DEBUG");
}
result = COMPLETE + 1;
switch (data_addr.su_family) {
case AF_INET:
if (epsv4 && !epsv4bad) {
pasvcmd = "EPSV";
+ overbose = verbose;
+ if (ftp_debug == 0)
+ verbose = -1;
result = command("EPSV");
+ verbose = overbose;
+ if (verbose > 0 &&
+ (result == COMPLETE || !connected))
+ fprintf(ttyout, "%s\n", reply_string);
if (!connected)
return (1);
/*
@@ -1320,10 +1260,8 @@ initconn(void)
}
if (result != COMPLETE) {
epsv4bad = 1;
- if (debug)
- fputs(
- "disabling epsv4 for this connection\n",
- ttyout);
+ DPRINTF("disabling epsv4 for this "
+ "connection\n");
}
}
if (result != COMPLETE) {
@@ -1335,16 +1273,33 @@ initconn(void)
break;
#ifdef INET6
case AF_INET6:
- pasvcmd = "EPSV";
- result = command("EPSV");
- if (!connected)
- return (1);
- /* this code is to be friendly with broken BSDI ftpd */
- if (code / 10 == 22 && code != 229) {
- fputs(
-"wrong server: return code must be 229\n",
- ttyout);
- result = COMPLETE + 1;
+ if (epsv6 && !epsv6bad) {
+ pasvcmd = "EPSV";
+ overbose = verbose;
+ if (ftp_debug == 0)
+ verbose = -1;
+ result = command("EPSV");
+ verbose = overbose;
+ if (verbose > 0 &&
+ (result == COMPLETE || !connected))
+ fprintf(ttyout, "%s\n", reply_string);
+ if (!connected)
+ return (1);
+ /*
+ * this code is to be friendly with
+ * broken BSDI ftpd
+ */
+ if (code / 10 == 22 && code != 229) {
+ fputs(
+ "wrong server: return code must be 229\n",
+ ttyout);
+ result = COMPLETE + 1;
+ }
+ if (result != COMPLETE) {
+ epsv6bad = 1;
+ DPRINTF("disabling epsv6 for this "
+ "connection\n");
+ }
}
if (result != COMPLETE) {
pasvcmd = "LPSV";
@@ -1476,7 +1431,7 @@ initconn(void)
data_addr.su_family = AF_INET6;
data_addr.su_len = sizeof(struct sockaddr_in6);
{
- int i;
+ size_t i;
for (i = 0; i < sizeof(struct in6_addr); i++) {
data_addr.si_su.su_sin6.sin6_addr.s6_addr[i] =
UC(addr[i]);
@@ -1516,8 +1471,8 @@ initconn(void)
} else
goto bad;
- while (xconnect(data, (struct sockaddr *)&data_addr.si_su,
- data_addr.su_len) < 0) {
+ if (ftp_connect(data, (struct sockaddr *)&data_addr.si_su,
+ data_addr.su_len) < 0) {
if (activefallback) {
(void)close(data);
data = -1;
@@ -1527,7 +1482,6 @@ initconn(void)
#endif
goto reinit;
}
- warn("connect for data channel");
goto bad;
}
#ifdef IPTOS_THROUGHPUT
@@ -1535,9 +1489,8 @@ initconn(void)
on = IPTOS_THROUGHPUT;
if (setsockopt(data, IPPROTO_IP, IP_TOS,
(void *)&on, sizeof(on)) == -1) {
- if (debug)
- warn("setsockopt %s (ignored)",
- "IPTOS_THROUGHPUT");
+ DWARN("setsockopt %s (ignored)",
+ "IPTOS_THROUGHPUT");
}
}
#endif
@@ -1552,7 +1505,7 @@ initconn(void)
(void)close(data);
data = socket(data_addr.su_family, SOCK_STREAM, 0);
if (data < 0) {
- warn("socket");
+ warn("Can't create socket for data connection");
if (tmpno)
sendport = 1;
return (1);
@@ -1560,33 +1513,31 @@ initconn(void)
if (!sendport)
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR,
(void *)&on, sizeof(on)) == -1) {
- warn("setsockopt %s", "SO_REUSEADDR");
+ warn("Can't set SO_REUSEADDR on data connection");
goto bad;
}
if (bind(data, (struct sockaddr *)&data_addr.si_su,
data_addr.su_len) < 0) {
- warn("bind");
+ warn("Can't bind for data connection");
goto bad;
}
if ((options & SO_DEBUG) &&
setsockopt(data, SOL_SOCKET, SO_DEBUG,
(void *)&on, sizeof(on)) == -1) {
- if (debug)
- warn("setsockopt %s (ignored)", "SO_DEBUG");
+ DWARN("setsockopt %s (ignored)", "SO_DEBUG");
}
len = sizeof(data_addr.si_su);
memset((char *)&data_addr, 0, sizeof (data_addr));
if (getsockname(data, (struct sockaddr *)&data_addr.si_su, &len) == -1) {
- warn("getsockname");
+ warn("Can't determine my address of data connection");
goto bad;
}
data_addr.su_len = len;
- if (xlisten(data, 1) < 0)
- warn("listen");
+ if (ftp_listen(data, 1) < 0)
+ warn("Can't listen to data connection");
if (sendport) {
char hname[NI_MAXHOST], sname[NI_MAXSERV];
- int af;
struct sockinet tmp;
switch (data_addr.su_family) {
@@ -1598,6 +1549,10 @@ initconn(void)
/* FALLTHROUGH */
#ifdef INET6
case AF_INET6:
+ if (!epsv6 || epsv6bad) {
+ result = COMPLETE + 1;
+ break;
+ }
#endif
af = (data_addr.su_family == AF_INET) ? 1 : 2;
tmp = data_addr;
@@ -1610,16 +1565,21 @@ initconn(void)
sizeof(sname), NI_NUMERICHOST | NI_NUMERICSERV)) {
result = ERROR;
} else {
- result = command("EPRT |%d|%s|%s|", af, hname,
+ overbose = verbose;
+ if (ftp_debug == 0)
+ verbose = -1;
+ result = command("EPRT |%u|%s|%s|", af, hname,
sname);
+ verbose = overbose;
+ if (verbose > 0 &&
+ (result == COMPLETE || !connected))
+ fprintf(ttyout, "%s\n", reply_string);
if (!connected)
return (1);
if (result != COMPLETE) {
epsv4bad = 1;
- if (debug)
- fputs(
- "disabling epsv4 for this connection\n",
- ttyout);
+ DPRINTF("disabling epsv4 for this "
+ "connection\n");
}
}
break;
@@ -1672,10 +1632,9 @@ initconn(void)
if (data_addr.su_family == AF_INET) {
on = IPTOS_THROUGHPUT;
if (setsockopt(data, IPPROTO_IP, IP_TOS,
- (void *)&on, sizeof(on)) == -1)
- if (debug)
- warn("setsockopt %s (ignored)",
- "IPTOS_THROUGHPUT");
+ (void *)&on, sizeof(on)) == -1) {
+ DWARN("setsockopt %s (ignored)", "IPTOS_THROUGHPUT");
+ }
}
#endif
return (0);
@@ -1720,14 +1679,14 @@ dataconn(const char *lmode)
timeout = td.tv_sec * 1000 + td.tv_usec/1000;
if (timeout < 0)
timeout = 0;
- rv = xpoll(pfd, 1, timeout);
+ rv = ftp_poll(pfd, 1, timeout);
} while (rv == -1 && errno == EINTR); /* loop until poll ! EINTR */
if (rv == -1) {
- warn("poll waiting before accept");
+ warn("Can't poll waiting before accept");
goto dataconn_failed;
}
if (rv == 0) {
- warn("poll timeout waiting before accept");
+ warnx("Poll timeout waiting before accept");
goto dataconn_failed;
}
@@ -1737,7 +1696,7 @@ dataconn(const char *lmode)
s = accept(data, (struct sockaddr *) &from.si_su, &fromlen);
} while (s == -1 && errno == EINTR); /* loop until accept ! EINTR */
if (s == -1) {
- warn("accept");
+ warn("Can't accept data connection");
goto dataconn_failed;
}
@@ -1751,9 +1710,7 @@ dataconn(const char *lmode)
int tos = IPTOS_THROUGHPUT;
if (setsockopt(s, IPPROTO_IP, IP_TOS,
(void *)&tos, sizeof(tos)) == -1) {
- if (debug)
- warn("setsockopt %s (ignored)",
- "IPTOS_THROUGHPUT");
+ DWARN("setsockopt %s (ignored)", "IPTOS_THROUGHPUT");
}
}
#endif
@@ -1880,15 +1837,10 @@ abortpt(int notused)
void
proxtrans(const char *cmd, const char *local, const char *remote)
{
- sigfunc oldintr;
+ sigfunc volatile oldintr;
int prox_type, nfnd;
- volatile int secndflag;
- char *cmd2;
-
-#ifdef __GNUC__ /* to shut up gcc warnings */
- (void)&oldintr;
- (void)&cmd2;
-#endif
+ int volatile secndflag;
+ const char *volatile cmd2;
oldintr = NULL;
secndflag = 0;
@@ -1992,7 +1944,7 @@ proxtrans(const char *cmd, const char *local, const char *remote)
if (cpend) {
if ((nfnd = empty(cin, NULL, 10)) <= 0) {
if (nfnd < 0)
- warn("abort");
+ warn("Error aborting proxy command");
if (ptabflg)
code = -1;
lostpeer(0);
@@ -2014,13 +1966,13 @@ reset(int argc, char *argv[])
int nfnd = 1;
if (argc == 0 && argv != NULL) {
- fprintf(ttyout, "usage: %s\n", argv[0]);
+ UPRINTF("usage: %s\n", argv[0]);
code = -1;
return;
}
while (nfnd > 0) {
if ((nfnd = empty(cin, NULL, 0)) < 0) {
- warn("reset");
+ warn("Error resetting connection");
code = -1;
lostpeer(0);
} else if (nfnd)
@@ -2042,7 +1994,7 @@ gunique(const char *local)
if (cp)
*cp = '/';
if (d < 0) {
- warn("local: %s", local);
+ warn("Can't access `%s'", local);
return (NULL);
}
len = strlcpy(new, local, sizeof(new));
@@ -2102,7 +2054,7 @@ abort_remote(FILE *din)
int nfnd;
if (cout == NULL) {
- warnx("Lost control connection for abort.");
+ warnx("Lost control connection for abort");
if (ptabflg)
code = -1;
lostpeer(0);
@@ -2116,12 +2068,12 @@ abort_remote(FILE *din)
buf[1] = IP;
buf[2] = IAC;
if (send(fileno(cout), buf, 3, MSG_OOB) != 3)
- warn("abort");
+ warn("Can't send abort message");
fprintf(cout, "%cABOR\r\n", DM);
(void)fflush(cout);
if ((nfnd = empty(cin, din, 10)) <= 0) {
if (nfnd < 0)
- warn("abort");
+ warn("Can't send abort message");
if (ptabflg)
code = -1;
lostpeer(0);
@@ -2137,6 +2089,24 @@ abort_remote(FILE *din)
(void)getreply(0);
}
+/*
+ * Ensure that ai->ai_addr is NOT an IPv4 mapped address.
+ * IPv4 mapped address complicates too many things in FTP
+ * protocol handling, as FTP protocol is defined differently
+ * between IPv4 and IPv6.
+ *
+ * This may not be the best way to handle this situation,
+ * since the semantics of IPv4 mapped address is defined in
+ * the kernel. There are configurations where we should use
+ * IPv4 mapped address as native IPv6 address, not as
+ * "an IPv6 address that embeds IPv4 address" (namely, SIIT).
+ *
+ * More complete solution would be to have an additional
+ * getsockopt to grab "real" peername/sockname. "real"
+ * peername/sockname will be AF_INET if IPv4 mapped address
+ * is used to embed IPv4 address, and will be AF_INET6 if
+ * we use it as native. What a mess!
+ */
void
ai_unmapped(struct addrinfo *ai)
{
@@ -2162,10 +2132,18 @@ ai_unmapped(struct addrinfo *ai)
sin.sin_port = sin6->sin6_port;
ai->ai_family = AF_INET;
-#if HAVE_SOCKADDR_SA_LEN
+#if defined(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
sin.sin_len = len;
#endif
memcpy(ai->ai_addr, &sin, len);
ai->ai_addrlen = len;
#endif
}
+
+#ifdef NO_USAGE
+void
+xusage(void)
+{
+ fputs("Usage error\n", ttyout);
+}
+#endif
diff --git a/contrib/lukemftp/src/ftp_var.h b/contrib/tnftp/src/ftp_var.h
index 25f13d4..cd6dcbf 100644
--- a/contrib/lukemftp/src/ftp_var.h
+++ b/contrib/tnftp/src/ftp_var.h
@@ -1,7 +1,8 @@
-/* $NetBSD: ftp_var.h,v 1.71 2005/04/11 01:49:31 lukem Exp $ */
+/* $NetBSD: ftp_var.h,v 1.10 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: ftp_var.h,v 1.81 2009/04/12 10:18:52 lukem Exp */
/*-
- * Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -107,6 +101,8 @@
#define NO_PROGRESS
#endif
+#if 0 /* tnftp */
+
#include <sys/param.h>
#include <netinet/in.h>
@@ -117,6 +113,8 @@
#include <setjmp.h>
#include <stringlist.h>
+#endif /* tnftp */
+
#ifndef NO_EDITCOMPLETE
#include <histedit.h>
#endif /* !NO_EDITCOMPLETE */
@@ -128,7 +126,7 @@
* Format of command table.
*/
struct cmd {
- char *c_name; /* name of command */
+ const char *c_name; /* name of command */
const char *c_help; /* help string */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
@@ -139,6 +137,8 @@ struct cmd {
void (*c_handler)(int, char **); /* function to call */
};
+#define MAX_C_NAME 12 /* maximum length of cmd.c_name */
+
/*
* Format of macro table
*/
@@ -152,8 +152,8 @@ struct macel {
* Format of option table
*/
struct option {
- char *name;
- char *value;
+ const char *name;
+ char *value;
};
/*
@@ -210,14 +210,14 @@ GLOBAL int sendport; /* use PORT/LPRT cmd for each data connection */
GLOBAL int connected; /* 1 = connected to server, -1 = logged in */
GLOBAL int interactive; /* interactively prompt on m* cmds */
GLOBAL int confirmrest; /* confirm rest of current m* cmd */
-GLOBAL int debug; /* debugging level */
+GLOBAL int ftp_debug; /* debugging level */
GLOBAL int bell; /* ring bell on cmd completion */
GLOBAL int doglob; /* glob local file names */
GLOBAL int autologin; /* establish user account on connection */
GLOBAL int proxy; /* proxy server connection active */
GLOBAL int proxflag; /* proxy connection exists */
GLOBAL int gatemode; /* use gate-ftp */
-GLOBAL char *gateserver; /* server to use for gate-ftp */
+GLOBAL const char *gateserver; /* server to use for gate-ftp */
GLOBAL int sunique; /* store files on server with unique name */
GLOBAL int runique; /* store local files with unique name */
GLOBAL int mcase; /* map upper to lower case for mget names */
@@ -252,9 +252,11 @@ GLOBAL int rate_get_incr; /* increment for get xfer rate */
GLOBAL int rate_put; /* maximum put xfer rate */
GLOBAL int rate_put_incr; /* increment for put xfer rate */
GLOBAL int retry_connect; /* seconds between retrying connection */
-GLOBAL char *tmpdir; /* temporary directory */
+GLOBAL const char *tmpdir; /* temporary directory */
GLOBAL int epsv4; /* use EPSV/EPRT on IPv4 connections */
GLOBAL int epsv4bad; /* EPSV doesn't work on the current server */
+GLOBAL int epsv6; /* use EPSV/EPRT on IPv6 connections */
+GLOBAL int epsv6bad; /* EPSV doesn't work on the current server */
GLOBAL int editing; /* command line editing enabled */
GLOBAL int features[FEAT_max]; /* remote FEATures supported */
@@ -266,8 +268,6 @@ GLOBAL size_t cursor_argc; /* location of cursor in margv */
GLOBAL size_t cursor_argo; /* offset of cursor in margv[cursor_argc] */
#endif /* !NO_EDITCOMPLETE */
-GLOBAL char *direction; /* direction transfer is occurring */
-
GLOBAL char *hostname; /* name of host connected to */
GLOBAL int unix_server; /* server is unix, can use binary for ascii */
GLOBAL int unix_proxy; /* proxy is unix, can use binary for ascii */
@@ -276,9 +276,10 @@ GLOBAL char remotecwd[MAXPATHLEN]; /* remote dir */
GLOBAL char *username; /* name of user logged in as. (dynamic) */
GLOBAL sa_family_t family; /* address family to use for connections */
-GLOBAL char *ftpport; /* port number to use for FTP connections */
-GLOBAL char *httpport; /* port number to use for HTTP connections */
-GLOBAL char *gateport; /* port number to use for gateftp connections */
+GLOBAL const char *ftpport; /* port number to use for FTP connections */
+GLOBAL const char *httpport; /* port number to use for HTTP connections */
+GLOBAL const char *gateport; /* port number to use for gateftp connections */
+GLOBAL struct addrinfo *bindai; /* local address to bind as */
GLOBAL char *outfile; /* filename to output URLs to */
GLOBAL int restartautofetch; /* restart auto-fetch */
@@ -327,7 +328,7 @@ extern struct option optiontab[];
#define FREEPTR(x) if ((x) != NULL) { free(x); (x) = NULL; }
#ifdef BSD4_4
-# define HAVE_SOCKADDR_SA_LEN 1
+# define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1
#endif
#ifdef NO_LONG_LONG
@@ -335,3 +336,20 @@ extern struct option optiontab[];
#else
# define STRTOLL(x,y,z) strtoll(x,y,z)
#endif
+
+#ifdef NO_DEBUG
+#define DPRINTF(...)
+#define DWARN(...)
+#else
+#define DPRINTF(...) if (ftp_debug) (void)fprintf(ttyout, __VA_ARGS__)
+#define DWARN(...) if (ftp_debug) warn(__VA_ARGS__)
+#endif
+
+#define STRorNULL(s) ((s) ? (s) : "<null>")
+
+#ifdef NO_USAGE
+void xusage(void);
+#define UPRINTF(...) xusage()
+#else
+#define UPRINTF(...) (void)fprintf(ttyout, __VA_ARGS__)
+#endif
diff --git a/contrib/lukemftp/src/main.c b/contrib/tnftp/src/main.c
index def05c5..c2d922b 100644
--- a/contrib/lukemftp/src/main.c
+++ b/contrib/tnftp/src/main.c
@@ -1,7 +1,8 @@
-/* $NetBSD: main.c,v 1.94 2005/05/13 05:03:49 lukem Exp $ */
+/* $NetBSD: main.c,v 1.17 2009/11/15 10:12:37 lukem Exp $ */
+/* from NetBSD: main.c,v 1.117 2009/07/13 19:05:41 roy Exp */
/*-
- * Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -94,17 +88,22 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n");
+__COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\
+ The Regents of the University of California. All rights reserved.\
+ Copyright 1996-2008 The NetBSD Foundation, Inc. All rights reserved");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94";
#else
-__RCSID("$NetBSD: main.c,v 1.94 2005/05/13 05:03:49 lukem Exp $");
+__RCSID(" NetBSD: main.c,v 1.117 2009/07/13 19:05:41 roy Exp ");
#endif
#endif /* not lint */
@@ -123,9 +122,12 @@ __RCSID("$NetBSD: main.c,v 1.94 2005/05/13 05:03:49 lukem Exp $");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include <unistd.h>
#include <locale.h>
+#endif /* tnftp */
+
#define GLOBAL /* force GLOBAL decls in ftp_var.h to be declared */
#include "ftp_var.h"
@@ -134,19 +136,24 @@ __RCSID("$NetBSD: main.c,v 1.94 2005/05/13 05:03:49 lukem Exp $");
#define NO_PROXY "no_proxy" /* env var with list of non-proxied
* hosts, comma or space separated */
-static void setupoption(char *, char *, char *);
+static void setupoption(const char *, const char *, const char *);
int main(int, char *[]);
int
-main(int argc, char *argv[])
+main(int volatile argc, char **volatile argv)
{
int ch, rval;
struct passwd *pw;
- char *cp, *ep, *anonuser, *anonpass, *upload_path;
- int dumbterm, s, len, isupload;
+ char *cp, *ep, *anonpass, *upload_path, *src_addr;
+ const char *anonuser;
+ int dumbterm, s, isupload;
+ size_t len;
socklen_t slen;
+ tzset();
+#if 0 /* tnftp */ /* XXX */
setlocale(LC_ALL, "");
+#endif /* tnftp */
setprogname(argv[0]);
sigint_raised = 0;
@@ -184,14 +191,22 @@ main(int argc, char *argv[])
rate_put_incr = DEFAULTINCR;
#ifdef INET6
epsv4 = 1;
+ epsv6 = 1;
#else
epsv4 = 0;
+ epsv6 = 0;
#endif
epsv4bad = 0;
+ epsv6bad = 0;
+ src_addr = NULL;
upload_path = NULL;
isupload = 0;
reply_callback = NULL;
+#ifdef INET6
family = AF_UNSPEC;
+#else
+ family = AF_INET; /* force AF_INET if no INET6 support */
+#endif
netrc[0] = '\0';
cp = getenv("NETRC");
@@ -206,15 +221,15 @@ main(int argc, char *argv[])
*/
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
- err(1, "can't create socket");
+ err(1, "Can't create socket to determine default socket sizes");
slen = sizeof(rcvbuf_size);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF,
(void *)&rcvbuf_size, &slen) == -1)
- err(1, "unable to get default rcvbuf size");
+ err(1, "Unable to get default rcvbuf size");
slen = sizeof(sndbuf_size);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF,
(void *)&sndbuf_size, &slen) == -1)
- err(1, "unable to get default sndbuf size");
+ err(1, "Unable to get default sndbuf size");
(void)close(s);
/* sanity check returned buffer sizes */
if (rcvbuf_size <= 0)
@@ -227,7 +242,7 @@ main(int argc, char *argv[])
if (rcvbuf_size > 8 * 1024 * 1024)
rcvbuf_size = 8 * 1024 * 1024;
- marg_sl = xsl_init();
+ marg_sl = ftp_sl_init();
if ((tmpdir = getenv("TMPDIR")) == NULL)
tmpdir = _PATH_TMP;
@@ -245,7 +260,7 @@ main(int argc, char *argv[])
passivemode = 1;
activefallback = 1;
} else
- warnx("unknown $FTPMODE '%s'; using defaults", cp);
+ warnx("Unknown $FTPMODE `%s'; using defaults", cp);
}
if (strcmp(getprogname(), "pftp") == 0) {
@@ -286,7 +301,7 @@ main(int argc, char *argv[])
}
}
- while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:RtT:u:vV")) != -1) {
+ while ((ch = getopt(argc, argv, "46AadefginN:o:pP:q:r:Rs:tT:u:vV")) != -1) {
switch (ch) {
case '4':
family = AF_INET;
@@ -311,7 +326,7 @@ main(int argc, char *argv[])
case 'd':
options |= SO_DEBUG;
- debug++;
+ ftp_debug++;
break;
case 'e':
@@ -361,19 +376,23 @@ main(int argc, char *argv[])
case 'q':
quit_time = strtol(optarg, &ep, 10);
if (quit_time < 1 || *ep != '\0')
- errx(1, "bad quit value: %s", optarg);
+ errx(1, "Bad quit value: %s", optarg);
break;
case 'r':
retry_connect = strtol(optarg, &ep, 10);
if (retry_connect < 1 || *ep != '\0')
- errx(1, "bad retry value: %s", optarg);
+ errx(1, "Bad retry value: %s", optarg);
break;
case 'R':
restartautofetch = 1;
break;
+ case 's':
+ src_addr = optarg;
+ break;
+
case 't':
trace = 1;
break;
@@ -382,15 +401,18 @@ main(int argc, char *argv[])
{
int targc;
char *targv[6], *oac;
+ char cmdbuf[MAX_C_NAME];
/* look for `dir,max[,incr]' */
targc = 0;
- targv[targc++] = "-T";
- oac = xstrdup(optarg);
+ (void)strlcpy(cmdbuf, "-T", sizeof(cmdbuf));
+ targv[targc++] = cmdbuf;
+ oac = ftp_strdup(optarg);
while ((cp = strsep(&oac, ",")) != NULL) {
if (*cp == '\0') {
- warnx("bad throttle value: %s", optarg);
+ warnx("Bad throttle value `%s'",
+ optarg);
usage();
/* NOTREACHED */
}
@@ -408,7 +430,7 @@ main(int argc, char *argv[])
{
isupload = 1;
interactive = 0;
- upload_path = xstrdup(optarg);
+ upload_path = ftp_strdup(optarg);
break;
}
@@ -435,6 +457,22 @@ main(int argc, char *argv[])
crflag = 1; /* strip c.r. on ascii gets */
sendport = -1; /* not using ports */
+ if (src_addr != NULL) {
+ struct addrinfo hints;
+ int error;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_PASSIVE;
+ error = getaddrinfo(src_addr, NULL, &hints, &bindai);
+ if (error) {
+ errx(1, "Can't lookup `%s': %s", src_addr,
+ (error == EAI_SYSTEM) ? strerror(errno)
+ : gai_strerror(error));
+ }
+ }
+
/*
* Cache the user name and home directory.
*/
@@ -443,7 +481,7 @@ main(int argc, char *argv[])
anonuser = "anonymous";
cp = getenv("HOME");
if (! EMPTYSTRING(cp))
- localhome = xstrdup(cp);
+ localhome = ftp_strdup(cp);
pw = NULL;
cp = getlogin();
if (cp != NULL)
@@ -452,8 +490,8 @@ main(int argc, char *argv[])
pw = getpwuid(getuid());
if (pw != NULL) {
if (localhome == NULL && !EMPTYSTRING(pw->pw_dir))
- localhome = xstrdup(pw->pw_dir);
- localname = xstrdup(pw->pw_name);
+ localhome = ftp_strdup(pw->pw_dir);
+ localname = ftp_strdup(pw->pw_name);
anonuser = localname;
}
if (netrc[0] == '\0' && localhome != NULL) {
@@ -465,7 +503,7 @@ main(int argc, char *argv[])
}
}
if (localhome == NULL)
- localhome = xstrdup("/");
+ localhome = ftp_strdup("/");
/*
* Every anonymous FTP server I've encountered will accept the
@@ -475,7 +513,7 @@ main(int argc, char *argv[])
* - thorpej@NetBSD.org
*/
len = strlen(anonuser) + 2;
- anonpass = xmalloc(len);
+ anonpass = ftp_malloc(len);
(void)strlcpy(anonpass, anonuser, len);
(void)strlcat(anonpass, "@", len);
@@ -502,11 +540,6 @@ main(int argc, char *argv[])
(void)xsignal(SIGUSR2, crankrate);
(void)xsignal(SIGWINCH, setttywidth);
-#ifdef __GNUC__ /* to shut up gcc warnings */
- (void)&argc;
- (void)&argv;
-#endif
-
if (argc > 0) {
if (isupload) {
rval = auto_put(argc, argv, upload_path);
@@ -522,22 +555,23 @@ main(int argc, char *argv[])
if (rval >= 0) /* -1 == connected and cd-ed */
goto sigint_or_rval_exit;
} else {
- char *xargv[4], *user, *host;
+ char *xargv[4], *uuser, *host;
+ char cmdbuf[MAXPATHLEN];
if ((rval = sigsetjmp(toplevel, 1)))
goto sigint_or_rval_exit;
(void)xsignal(SIGINT, intr);
(void)xsignal(SIGPIPE, lostpeer);
- user = NULL;
+ uuser = NULL;
host = argv[0];
cp = strchr(host, '@');
if (cp) {
*cp = '\0';
- user = host;
+ uuser = host;
host = cp + 1;
}
- /* XXX discards const */
- xargv[0] = (char *)getprogname();
+ (void)strlcpy(cmdbuf, getprogname(), sizeof(cmdbuf));
+ xargv[0] = cmdbuf;
xargv[1] = host;
xargv[2] = argv[1];
xargv[3] = NULL;
@@ -545,14 +579,14 @@ main(int argc, char *argv[])
int oautologin;
oautologin = autologin;
- if (user != NULL) {
+ if (uuser != NULL) {
anonftp = 0;
autologin = 0;
}
setpeer(argc+1, xargv);
autologin = oautologin;
- if (connected == 1 && user != NULL)
- (void)ftp_login(host, user, NULL);
+ if (connected == 1 && uuser != NULL)
+ (void)ftp_login(host, uuser, NULL);
if (!retry_connect)
break;
if (!connected) {
@@ -586,18 +620,18 @@ main(int argc, char *argv[])
char *
prompt(void)
{
- static char **prompt;
+ static char **promptopt;
static char buf[MAXPATHLEN];
- if (prompt == NULL) {
+ if (promptopt == NULL) {
struct option *o;
o = getoption("prompt");
if (o == NULL)
- errx(1, "no such option `prompt'");
- prompt = &(o->value);
+ errx(1, "prompt: no such option `prompt'");
+ promptopt = &(o->value);
}
- formatbuf(buf, sizeof(buf), *prompt ? *prompt : DEFAULTPROMPT);
+ formatbuf(buf, sizeof(buf), *promptopt ? *promptopt : DEFAULTPROMPT);
return (buf);
}
@@ -607,18 +641,18 @@ prompt(void)
char *
rprompt(void)
{
- static char **rprompt;
+ static char **rpromptopt;
static char buf[MAXPATHLEN];
- if (rprompt == NULL) {
+ if (rpromptopt == NULL) {
struct option *o;
o = getoption("rprompt");
if (o == NULL)
- errx(1, "no such option `rprompt'");
- rprompt = &(o->value);
+ errx(1, "rprompt: no such option `rprompt'");
+ rpromptopt = &(o->value);
}
- formatbuf(buf, sizeof(buf), *rprompt ? *rprompt : DEFAULTRPROMPT);
+ formatbuf(buf, sizeof(buf), *rpromptopt ? *rpromptopt : DEFAULTRPROMPT);
return (buf);
}
@@ -630,7 +664,12 @@ cmdscanner(void)
{
struct cmd *c;
char *p;
- int num;
+#ifndef NO_EDITCOMPLETE
+ int ch;
+ size_t num;
+#endif
+ int len;
+ char cmdbuf[MAX_C_NAME];
for (;;) {
#ifndef NO_EDITCOMPLETE
@@ -641,34 +680,33 @@ cmdscanner(void)
p = rprompt();
if (*p)
fprintf(ttyout, "%s ", p);
- (void)fflush(ttyout);
}
- if (fgets(line, sizeof(line), stdin) == NULL) {
+ (void)fflush(ttyout);
+ len = get_line(stdin, line, sizeof(line), NULL);
+ switch (len) {
+ case -1: /* EOF */
+ case -2: /* error */
if (fromatty)
putc('\n', ttyout);
quit(0, NULL);
- }
- num = strlen(line);
- if (num == 0)
- break;
- if (line[--num] == '\n') {
- if (num == 0)
- break;
- line[num] = '\0';
- } else if (num == sizeof(line) - 2) {
+ /* NOTREACHED */
+ case -3: /* too long; try again */
fputs("Sorry, input line is too long.\n",
ttyout);
- while ((num = getchar()) != '\n' && num != EOF)
- /* void */;
+ continue;
+ case 0: /* empty; try again */
+ continue;
+ default: /* all ok */
break;
- } /* else it was a line without a newline */
+ }
#ifndef NO_EDITCOMPLETE
} else {
const char *buf;
HistEvent ev;
cursor_pos = NULL;
- buf = el_gets(el, &num);
+ buf = el_gets(el, &ch);
+ num = ch;
if (buf == NULL || num == 0) {
if (fromatty)
putc('\n', ttyout);
@@ -718,7 +756,8 @@ cmdscanner(void)
continue;
}
confirmrest = 0;
- margv[0] = c->c_name;
+ (void)strlcpy(cmdbuf, c->c_name, sizeof(cmdbuf));
+ margv[0] = cmdbuf;
(*c->c_handler)(margc, margv);
if (bell && c->c_bell)
(void)putc('\007', ttyout);
@@ -777,7 +816,7 @@ makeargv(void)
marg_sl->sl_cur = 0; /* reset to start of marg_sl */
for (margc = 0; ; margc++) {
argp = slurpstring();
- xsl_add(marg_sl, argp);
+ ftp_sl_add(marg_sl, argp);
if (argp == NULL)
break;
}
@@ -812,6 +851,8 @@ makeargv(void)
char *
slurpstring(void)
{
+ static char bangstr[2] = { '!', '\0' };
+ static char dollarstr[2] = { '$', '\0' };
int got_one = 0;
char *sb = stringbase;
char *ap = argbase;
@@ -822,7 +863,7 @@ slurpstring(void)
case 0:
slrflag++;
INC_CHKCURSOR(stringbase);
- return ((*sb == '!') ? "!" : "$");
+ return ((*sb == '!') ? bangstr : dollarstr);
/* NOTREACHED */
case 1:
slrflag++;
@@ -945,27 +986,28 @@ void
help(int argc, char *argv[])
{
struct cmd *c;
- char *nargv[1], *p, *cmd;
+ char *nargv[1], *cmd;
+ const char *p;
int isusage;
cmd = argv[0];
isusage = (strcmp(cmd, "usage") == 0);
if (argc == 0 || (isusage && argc == 1)) {
- fprintf(ttyout, "usage: %s [command [...]]\n", cmd);
+ UPRINTF("usage: %s [command [...]]\n", cmd);
return;
}
if (argc == 1) {
StringList *buf;
- buf = xsl_init();
+ buf = ftp_sl_init();
fprintf(ttyout,
"%sommands may be abbreviated. Commands are:\n\n",
proxy ? "Proxy c" : "C");
for (c = cmdtab; (p = c->c_name) != NULL; c++)
if (!proxy || c->c_proxy)
- xsl_add(buf, p);
+ ftp_sl_add(buf, ftp_strdup(p));
list_vertical(buf);
- sl_free(buf, 0);
+ sl_free(buf, 1);
return;
}
@@ -973,6 +1015,7 @@ help(int argc, char *argv[])
while (--argc > 0) {
char *arg;
+ char cmdbuf[MAX_C_NAME];
arg = *++argv;
c = getcmd(arg);
@@ -984,7 +1027,8 @@ help(int argc, char *argv[])
cmd, arg);
else {
if (isusage) {
- nargv[0] = c->c_name;
+ (void)strlcpy(cmdbuf, c->c_name, sizeof(cmdbuf));
+ nargv[0] = cmdbuf;
(*c->c_handler)(0, nargv);
} else
fprintf(ttyout, "%-*s\t%s\n", HELPINDENT,
@@ -1014,27 +1058,18 @@ getoptionvalue(const char *name)
struct option *c;
if (name == NULL)
- errx(1, "getoptionvalue() invoked with NULL name");
+ errx(1, "getoptionvalue: invoked with NULL name");
c = getoption(name);
if (c != NULL)
return (c->value);
- errx(1, "getoptionvalue() invoked with unknown option `%s'", name);
+ errx(1, "getoptionvalue: invoked with unknown option `%s'", name);
/* NOTREACHED */
}
static void
-setupoption(char *name, char *value, char *defaultvalue)
+setupoption(const char *name, const char *value, const char *defaultvalue)
{
- char *nargv[3];
- int overbose;
-
- nargv[0] = "setupoption()";
- nargv[1] = name;
- nargv[2] = (value ? value : defaultvalue);
- overbose = verbose;
- verbose = 0;
- setoption(3, nargv);
- verbose = overbose;
+ set_option(name, value ? value : defaultvalue, 0);
}
void
@@ -1043,9 +1078,10 @@ usage(void)
const char *progname = getprogname();
(void)fprintf(stderr,
-"usage: %s [-46AadefginpRtvV] [-N netrc] [-o outfile] [-P port] [-q quittime]\n"
-" [-r retry] [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n"
-" [file:///file] [ftp://[user[:pass]@]host[:port]/path[/]]\n"
+"usage: %s [-46AadefginpRtVv] [-N netrc] [-o outfile] [-P port] [-q quittime]\n"
+" [-r retry] [-s srcaddr] [-T dir,max[,inc]]\n"
+" [[user@]host [port]] [host:path[/]] [file:///file]\n"
+" [ftp://[user[:pass]@]host[:port]/path[/]]\n"
" [http://[user[:pass]@]host[:port]/path] [...]\n"
" %s -u URL file [...]\n", progname, progname);
exit(1);
diff --git a/contrib/lukemftp/src/progressbar.c b/contrib/tnftp/src/progressbar.c
index d0bd35f..bd4d76d 100644
--- a/contrib/lukemftp/src/progressbar.c
+++ b/contrib/tnftp/src/progressbar.c
@@ -1,7 +1,8 @@
-/* $NetBSD: progressbar.c,v 1.7 2005/04/11 01:49:31 lukem Exp $ */
+/* $NetBSD: progressbar.c,v 1.14 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: progressbar.c,v 1.21 2009/04/12 10:18:52 lukem Exp */
/*-
- * Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -36,9 +30,13 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: progressbar.c,v 1.7 2005/04/11 01:49:31 lukem Exp $");
+__RCSID(" NetBSD: progressbar.c,v 1.21 2009/04/12 10:18:52 lukem Exp ");
#endif /* not lint */
/*
@@ -46,7 +44,6 @@ __RCSID("$NetBSD: progressbar.c,v 1.7 2005/04/11 01:49:31 lukem Exp $");
*/
#include <sys/types.h>
#include <sys/param.h>
-#include <sys/time.h>
#include <err.h>
#include <errno.h>
@@ -55,12 +52,12 @@ __RCSID("$NetBSD: progressbar.c,v 1.7 2005/04/11 01:49:31 lukem Exp $");
#include <stdlib.h>
#include <string.h>
#include <time.h>
+#include <tzfile.h>
#include <unistd.h>
-#include "progressbar.h"
+#endif /* tnftp */
-#define SECSPERHOUR (60 * 60)
-#define SECSPERDAY ((long)60 * 60 * 24)
+#include "progressbar.h"
#if !defined(NO_PROGRESS)
/*
@@ -72,7 +69,11 @@ foregroundproc(void)
static pid_t pgrp = -1;
if (pgrp == -1)
+#if GETPGRP_VOID
pgrp = getpgrp();
+#else /* ! GETPGRP_VOID */
+ pgrp = getpgrp(0);
+#endif /* ! GETPGRP_VOID */
return (tcgetpgrp(fileno(ttyout)) == pgrp);
}
@@ -94,10 +95,23 @@ updateprogressmeter(int dummy)
}
/*
- * List of order of magnitude prefixes.
- * The last is `P', as 2^64 = 16384 Petabytes
+ * List of order of magnitude suffixes, per IEC 60027-2.
*/
-static const char prefixes[] = " KMGTP";
+static const char * const suffixes[] = {
+ "", /* 2^0 (byte) */
+ "KiB", /* 2^10 Kibibyte */
+ "MiB", /* 2^20 Mebibyte */
+ "GiB", /* 2^30 Gibibyte */
+ "TiB", /* 2^40 Tebibyte */
+ "PiB", /* 2^50 Pebibyte */
+ "EiB", /* 2^60 Exbibyte */
+#if 0
+ /* The following are not necessary for signed 64-bit off_t */
+ "ZiB", /* 2^70 Zebibyte */
+ "YiB", /* 2^80 Yobibyte */
+#endif
+};
+#define NSUFFIXES (int)(sizeof(suffixes) / sizeof(suffixes[0]))
/*
* Display a transfer progress bar if progress is non-zero.
@@ -124,7 +138,7 @@ progressmeter(int flag)
struct timeval td;
off_t abbrevsize, bytespersec;
double elapsed;
- int ratio, barlength, i, remaining;
+ int ratio, i, remaining, barlength;
/*
* Work variables for progress bar.
@@ -135,10 +149,10 @@ progressmeter(int flag)
* these appropriately.
*/
#endif
- int len;
+ size_t len;
char buf[256]; /* workspace for progress bar */
#ifndef NO_PROGRESS
-#define BAROVERHEAD 43 /* non `*' portion of progress bar */
+#define BAROVERHEAD 45 /* non `*' portion of progress bar */
/*
* stars should contain at least
* sizeof(buf) - BAROVERHEAD entries
@@ -170,8 +184,8 @@ progressmeter(int flag)
"transfer aborted because stalled for %lu sec.\r\n",
getprogname(), (unsigned long)wait.tv_sec);
(void)write(fileno(ttyout), buf, len);
- (void)xsignal(SIGALRM, SIG_DFL);
alarmtimer(0);
+ (void)xsignal(SIGALRM, SIG_DFL);
siglongjmp(toplevel, 1);
}
#endif /* !STANDALONE_PROGRESS */
@@ -188,8 +202,8 @@ progressmeter(int flag)
(void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
alarmtimer(1); /* set alarm timer for 1 Hz */
} else if (flag == 1) {
- (void)xsignal(SIGALRM, SIG_DFL);
alarmtimer(0);
+ (void)xsignal(SIGALRM, SIG_DFL);
}
}
#ifndef NO_PROGRESS
@@ -216,23 +230,24 @@ progressmeter(int flag)
* calculate the length of the `*' bar, ensuring that
* the number of stars won't exceed the buffer size
*/
- barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
+ barlength = MIN((int)(sizeof(buf) - 1), ttywidth) - BAROVERHEAD;
if (prefix)
- barlength -= strlen(prefix);
+ barlength -= (int)strlen(prefix);
if (barlength > 0) {
i = barlength * ratio / 100;
len += snprintf(buf + len, BUFLEFT,
- "|%.*s%*s|", i, stars, barlength - i, "");
+ "|%.*s%*s|", i, stars, (int)(barlength - i), "");
}
}
abbrevsize = cursize;
- for (i = 0; abbrevsize >= 100000 && i < sizeof(prefixes); i++)
+ for (i = 0; abbrevsize >= 100000 && i < NSUFFIXES; i++)
abbrevsize >>= 10;
- len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %c%c ",
+ if (i == NSUFFIXES)
+ i--;
+ len += snprintf(buf + len, BUFLEFT, " " LLFP("5") " %-3s ",
(LLT)abbrevsize,
- prefixes[i],
- i == 0 ? ' ' : 'B');
+ suffixes[i]);
timersub(&now, &start, &td);
elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
@@ -243,13 +258,13 @@ progressmeter(int flag)
if (elapsed > 0.0)
bytespersec /= elapsed;
}
- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
+ for (i = 1; bytespersec >= 1024000 && i < NSUFFIXES; i++)
bytespersec >>= 10;
len += snprintf(buf + len, BUFLEFT,
- " " LLFP("3") ".%02d %cB/s ",
+ " " LLFP("3") ".%02d %.2sB/s ",
(LLT)(bytespersec / 1024),
(int)((bytespersec % 1024) * 100 / 1024),
- prefixes[i]);
+ suffixes[i]);
if (filesize > 0) {
if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
@@ -299,7 +314,8 @@ ptransfer(int siginfo)
struct timeval now, td, wait;
double elapsed;
off_t bytespersec;
- int remaining, hh, i, len;
+ int remaining, hh, i;
+ size_t len;
char buf[256]; /* Work variable for transfer status. */
@@ -334,12 +350,14 @@ ptransfer(int siginfo)
len += snprintf(buf + len, BUFLEFT,
"%02d:%02d ", remaining / 60, remaining % 60);
- for (i = 1; bytespersec >= 1024000 && i < sizeof(prefixes); i++)
+ for (i = 1; bytespersec >= 1024000 && i < NSUFFIXES; i++)
bytespersec >>= 10;
- len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %cB/s)",
+ if (i == NSUFFIXES)
+ i--;
+ len += snprintf(buf + len, BUFLEFT, "(" LLF ".%02d %.2sB/s)",
(LLT)(bytespersec / 1024),
(int)((bytespersec % 1024) * 100 / 1024),
- prefixes[i]);
+ suffixes[i]);
if (siginfo && bytes > 0 && elapsed > 0.0 && filesize >= 0
&& bytes + restart_point <= filesize) {
@@ -400,6 +418,16 @@ alarmtimer(int wait)
sigfunc
xsignal_restart(int sig, sigfunc func, int restartable)
{
+#ifdef ultrix /* XXX: this is lame - how do we test sigvec vs. sigaction? */
+ struct sigvec vec, ovec;
+
+ vec.sv_handler = func;
+ sigemptyset(&vec.sv_mask);
+ vec.sv_flags = 0;
+ if (sigvec(sig, &vec, &ovec) < 0)
+ return (SIG_ERR);
+ return (ovec.sv_handler);
+#else /* ! ultrix */
struct sigaction act, oact;
act.sa_handler = func;
@@ -414,6 +442,7 @@ xsignal_restart(int sig, sigfunc func, int restartable)
if (sigaction(sig, &act, &oact) < 0)
return (SIG_ERR);
return (oact.sa_handler);
+#endif /* ! ultrix */
}
/*
@@ -457,7 +486,7 @@ xsignal(int sig, sigfunc func)
* This is unpleasant, but I don't know what would be better.
* Right now, this "can't happen"
*/
- errx(1, "xsignal_restart called with signal %d", sig);
+ errx(1, "xsignal_restart: called with signal %d", sig);
}
return(xsignal_restart(sig, func, restartable));
diff --git a/contrib/lukemftp/src/progressbar.h b/contrib/tnftp/src/progressbar.h
index 9e004f4..70e2df3 100644
--- a/contrib/lukemftp/src/progressbar.h
+++ b/contrib/tnftp/src/progressbar.h
@@ -1,7 +1,8 @@
-/* $NetBSD: progressbar.h,v 1.5 2005/02/10 16:00:38 jmc Exp $ */
+/* $NetBSD: progressbar.h,v 1.9 2009/05/20 12:53:47 lukem Exp $ */
+/* from NetBSD: progressbar.h,v 1.8 2009/04/12 10:18:52 lukem Exp */
/*-
- * Copyright (c) 1996-2003 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -15,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -66,7 +60,7 @@ GLOBAL int fromatty; /* input is from a terminal */
GLOBAL int verbose; /* print messages coming back from server */
GLOBAL int quit_time; /* maximum time to wait if stalled */
-GLOBAL char *direction; /* direction transfer is occurring */
+GLOBAL const char *direction; /* direction transfer is occurring */
GLOBAL sigjmp_buf toplevel; /* non-local goto stuff for cmd scanner */
#endif /* !STANDALONE_PROGRESS */
@@ -90,10 +84,19 @@ void ptransfer(int);
# define ULLFP(x) "%" x "lu"
# define ULLT unsigned long
#else
+#if defined(HAVE_PRINTF_QD)
+# define LLF "%qd"
+# define LLFP(x) "%" x "qd"
+# define LLT long long
+# define ULLF "%qu"
+# define ULLFP(x) "%" x "qu"
+# define ULLT unsigned long long
+#else /* !defined(HAVE_PRINTF_QD) */
# define LLF "%lld"
# define LLFP(x) "%" x "lld"
# define LLT long long
# define ULLF "%llu"
# define ULLFP(x) "%" x "llu"
# define ULLT unsigned long long
+#endif /* !defined(HAVE_PRINTF_QD) */
#endif
diff --git a/contrib/lukemftp/src/ruserpass.c b/contrib/tnftp/src/ruserpass.c
index 9cb318a..a2e0360 100644
--- a/contrib/lukemftp/src/ruserpass.c
+++ b/contrib/tnftp/src/ruserpass.c
@@ -1,4 +1,5 @@
-/* $NetBSD: ruserpass.c,v 1.29 2003/08/07 11:13:57 agc Exp $ */
+/* $NetBSD: ruserpass.c,v 1.8 2007/08/06 04:33:24 lukem Exp $ */
+/* from NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp */
/*
* Copyright (c) 1985, 1993, 1994
@@ -29,12 +30,16 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)ruserpass.c 8.4 (Berkeley) 4/27/95";
#else
-__RCSID("$NetBSD: ruserpass.c,v 1.29 2003/08/07 11:13:57 agc Exp $");
+__RCSID(" NetBSD: ruserpass.c,v 1.33 2007/04/17 05:52:04 lukem Exp ");
#endif
#endif /* not lint */
@@ -50,6 +55,8 @@ __RCSID("$NetBSD: ruserpass.c,v 1.29 2003/08/07 11:13:57 agc Exp $");
#include <string.h>
#include <unistd.h>
+#endif /* tnftp */
+
#include "ftp_var.h"
static int token(void);
@@ -66,7 +73,7 @@ static FILE *cfile;
static char tokval[100];
static struct toktab {
- char *tokstr;
+ const char *tokstr;
int tval;
} toktab[] = {
{ "default", DEFAULT },
@@ -80,11 +87,11 @@ static struct toktab {
};
int
-ruserpass(const char *host, const char **aname, const char **apass,
- const char **aacct)
+ruserpass(const char *host, char **aname, char **apass, char **aacct)
{
char *tmp;
- char myname[MAXHOSTNAMELEN + 1], *mydomain;
+ const char *mydomain;
+ char myname[MAXHOSTNAMELEN + 1];
int t, i, c, usedefault = 0;
struct stat stb;
@@ -93,7 +100,7 @@ ruserpass(const char *host, const char **aname, const char **apass,
cfile = fopen(netrc, "r");
if (cfile == NULL) {
if (errno != ENOENT)
- warn("%s", netrc);
+ warn("Can't read `%s'", netrc);
return (0);
}
if (gethostname(myname, sizeof(myname)) < 0)
@@ -102,7 +109,7 @@ ruserpass(const char *host, const char **aname, const char **apass,
if ((mydomain = strchr(myname, '.')) == NULL)
mydomain = "";
next:
- while ((t = token())) switch(t) {
+ while ((t = token()) > 0) switch(t) {
case DEFAULT:
usedefault = 1;
@@ -110,7 +117,9 @@ ruserpass(const char *host, const char **aname, const char **apass,
case MACH:
if (!usedefault) {
- if (token() != ID)
+ if ((t = token()) == -1)
+ goto bad;
+ if (t != ID)
continue;
/*
* Allow match either for user's input host name
@@ -134,12 +143,15 @@ ruserpass(const char *host, const char **aname, const char **apass,
continue;
}
match:
- while ((t = token()) && t != MACH && t != DEFAULT) switch(t) {
+ while ((t = token()) > 0 &&
+ t != MACH && t != DEFAULT) switch(t) {
case LOGIN:
- if (token()) {
+ if ((t = token()) == -1)
+ goto bad;
+ if (t) {
if (*aname == NULL)
- *aname = xstrdup(tokval);
+ *aname = ftp_strdup(tokval);
else {
if (strcmp(*aname, tokval))
goto next;
@@ -150,22 +162,26 @@ ruserpass(const char *host, const char **aname, const char **apass,
if ((*aname == NULL || strcmp(*aname, "anonymous")) &&
fstat(fileno(cfile), &stb) >= 0 &&
(stb.st_mode & 077) != 0) {
- warnx("Error: .netrc file is readable by others.");
- warnx("Remove password or make file unreadable by others.");
+ warnx("Error: .netrc file is readable by others");
+ warnx("Remove password or make file unreadable by others");
goto bad;
}
- if (token() && *apass == NULL)
- *apass = xstrdup(tokval);
+ if ((t = token()) == -1)
+ goto bad;
+ if (t && *apass == NULL)
+ *apass = ftp_strdup(tokval);
break;
case ACCOUNT:
if (fstat(fileno(cfile), &stb) >= 0
&& (stb.st_mode & 077) != 0) {
- warnx("Error: .netrc file is readable by others.");
- warnx("Remove account or make file unreadable by others.");
+ warnx("Error: .netrc file is readable by others");
+ warnx("Remove account or make file unreadable by others");
goto bad;
}
- if (token() && *aacct == NULL)
- *aacct = xstrdup(tokval);
+ if ((t = token()) == -1)
+ goto bad;
+ if (t && *aacct == NULL)
+ *aacct = ftp_strdup(tokval);
break;
case MACDEF:
if (proxy) {
@@ -225,9 +241,13 @@ ruserpass(const char *host, const char **aname, const char **apass,
}
*tmp = c;
if (*tmp == '\n') {
- if (*(tmp-1) == '\0') {
- macros[macnum++].mac_end = tmp - 1;
- break;
+ if (tmp == macros[macnum].mac_start) {
+ macros[macnum++].mac_end = tmp;
+ break;
+ } else if (*(tmp - 1) == '\0') {
+ macros[macnum++].mac_end =
+ tmp - 1;
+ break;
}
*tmp = '\0';
}
@@ -240,12 +260,14 @@ ruserpass(const char *host, const char **aname, const char **apass,
}
break;
default:
- warnx("Unknown .netrc keyword %s", tokval);
+ warnx("Unknown .netrc keyword `%s'", tokval);
break;
}
goto done;
}
done:
+ if (t == -1)
+ goto bad;
(void)fclose(cfile);
return (0);
bad:
@@ -271,16 +293,26 @@ token(void)
if (c == '"') {
while ((c = getc(cfile)) != EOF && c != '"') {
if (c == '\\')
- c = getc(cfile);
+ if ((c = getc(cfile)) == EOF)
+ break;
*cp++ = c;
+ if (cp == tokval + sizeof(tokval)) {
+ warnx("Token in .netrc too long");
+ return (-1);
+ }
}
} else {
*cp++ = c;
while ((c = getc(cfile)) != EOF
&& c != '\n' && c != '\t' && c != ' ' && c != ',') {
if (c == '\\')
- c = getc(cfile);
+ if ((c = getc(cfile)) == EOF)
+ break;
*cp++ = c;
+ if (cp == tokval + sizeof(tokval)) {
+ warnx("Token in .netrc too long");
+ return (-1);
+ }
}
}
*cp = 0;
diff --git a/contrib/lukemftp/src/util.c b/contrib/tnftp/src/util.c
index 6f94bb0..366b194 100644
--- a/contrib/lukemftp/src/util.c
+++ b/contrib/tnftp/src/util.c
@@ -1,7 +1,8 @@
-/* $NetBSD: util.c,v 1.123 2005/05/14 18:56:45 dsl Exp $ */
+/* $NetBSD: util.c,v 1.21 2009/11/15 10:12:37 lukem Exp $ */
+/* from NetBSD: util.c,v 1.152 2009/07/13 19:05:41 roy Exp */
/*-
- * Copyright (c) 1997-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -19,13 +20,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -69,9 +63,13 @@
* SUCH DAMAGE.
*/
+#include "tnftp.h"
+
+#if 0 /* tnftp */
+
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: util.c,v 1.123 2005/05/14 18:56:45 dsl Exp $");
+__RCSID(" NetBSD: util.c,v 1.152 2009/07/13 19:05:41 roy Exp ");
#endif /* not lint */
/*
@@ -90,6 +88,7 @@ __RCSID("$NetBSD: util.c,v 1.123 2005/05/14 18:56:45 dsl Exp $");
#include <fcntl.h>
#include <glob.h>
#include <signal.h>
+#include <libgen.h>
#include <limits.h>
#include <netdb.h>
#include <stdio.h>
@@ -97,11 +96,12 @@ __RCSID("$NetBSD: util.c,v 1.123 2005/05/14 18:56:45 dsl Exp $");
#include <string.h>
#include <termios.h>
#include <time.h>
+#include <tzfile.h>
#include <unistd.h>
-#include "ftp_var.h"
+#endif /* tnftp */
-#define TM_YEAR_BASE 1900
+#include "ftp_var.h"
/*
* Connect to peer server and auto-login, if possible.
@@ -110,7 +110,7 @@ void
setpeer(int argc, char *argv[])
{
char *host;
- char *port;
+ const char *port;
if (argc == 0)
goto usage;
@@ -124,7 +124,7 @@ setpeer(int argc, char *argv[])
(void)another(&argc, &argv, "to");
if (argc < 2 || argc > 3) {
usage:
- fprintf(ttyout, "usage: %s host-name [port]\n", argv[0]);
+ UPRINTF("usage: %s host-name [port]\n", argv[0]);
code = -1;
return;
}
@@ -137,7 +137,7 @@ setpeer(int argc, char *argv[])
if (gatemode) {
if (gateserver == NULL || *gateserver == '\0')
- errx(1, "gateserver not defined (shouldn't happen)");
+ errx(1, "main: gateserver not defined");
host = hookup(gateserver, port);
} else
host = hookup(argv[1], port);
@@ -170,25 +170,25 @@ setpeer(int argc, char *argv[])
}
static void
-parse_feat(const char *line)
+parse_feat(const char *fline)
{
/*
* work-around broken ProFTPd servers that can't
- * even obey RFC 2389.
+ * even obey RFC2389.
*/
- while (*line && isspace((int)*line))
- line++;
+ while (*fline && isspace((int)*fline))
+ fline++;
- if (strcasecmp(line, "MDTM") == 0)
+ if (strcasecmp(fline, "MDTM") == 0)
features[FEAT_MDTM] = 1;
- else if (strncasecmp(line, "MLST", sizeof("MLST") - 1) == 0) {
+ else if (strncasecmp(fline, "MLST", sizeof("MLST") - 1) == 0) {
features[FEAT_MLST] = 1;
- } else if (strcasecmp(line, "REST STREAM") == 0)
+ } else if (strcasecmp(fline, "REST STREAM") == 0)
features[FEAT_REST_STREAM] = 1;
- else if (strcasecmp(line, "SIZE") == 0)
+ else if (strcasecmp(fline, "SIZE") == 0)
features[FEAT_SIZE] = 1;
- else if (strcasecmp(line, "TVFS") == 0)
+ else if (strcasecmp(fline, "TVFS") == 0)
features[FEAT_TVFS] = 1;
}
@@ -202,7 +202,7 @@ getremoteinfo(void)
int overbose, i;
overbose = verbose;
- if (debug == 0)
+ if (ftp_debug == 0)
verbose = -1;
/* determine remote system type */
@@ -268,7 +268,8 @@ getremoteinfo(void)
features[FEAT_FEAT] = 1;
} else
features[FEAT_FEAT] = 0;
- if (debug) {
+#ifndef NO_DEBUG
+ if (ftp_debug) {
#define DEBUG_FEAT(x) fprintf(ttyout, "features[" #x "] = %d\n", features[(x)])
DEBUG_FEAT(FEAT_FEAT);
DEBUG_FEAT(FEAT_MDTM);
@@ -278,6 +279,7 @@ getremoteinfo(void)
DEBUG_FEAT(FEAT_TVFS);
#undef DEBUG_FEAT
}
+#endif
reply_callback = NULL;
verbose = overbose;
@@ -308,6 +310,7 @@ cleanuppeer(void)
anonftp = 0;
data = -1;
epsv4bad = 0;
+ epsv6bad = 0;
if (username)
free(username);
username = NULL;
@@ -373,99 +376,105 @@ lostpeer(int dummy)
* Return non-zero if successful.
*/
int
-ftp_login(const char *host, const char *user, const char *pass)
+ftp_login(const char *host, const char *luser, const char *lpass)
{
char tmp[80];
- const char *acct;
- int n, aflag, rval, freeuser, freepass, freeacct;
+ char *fuser, *pass, *facct, *p;
+ char emptypass[] = "";
+ const char *errormsg;
+ int n, aflag, rval, nlen;
- acct = NULL;
- aflag = rval = freeuser = freepass = freeacct = 0;
-
- if (debug)
- fprintf(ttyout, "ftp_login: user `%s' pass `%s' host `%s'\n",
- user ? user : "<null>", pass ? pass : "<null>",
- host ? host : "<null>");
+ aflag = rval = 0;
+ fuser = pass = facct = NULL;
+ if (luser)
+ fuser = ftp_strdup(luser);
+ if (lpass)
+ pass = ftp_strdup(lpass);
+ DPRINTF("ftp_login: user `%s' pass `%s' host `%s'\n",
+ STRorNULL(fuser), STRorNULL(pass), STRorNULL(host));
/*
* Set up arguments for an anonymous FTP session, if necessary.
*/
if (anonftp) {
- user = "anonymous"; /* as per RFC 1635 */
- pass = getoptionvalue("anonpass");
+ FREEPTR(fuser);
+ fuser = ftp_strdup("anonymous"); /* as per RFC1635 */
+ FREEPTR(pass);
+ pass = ftp_strdup(getoptionvalue("anonpass"));
}
- if (user == NULL)
- freeuser = 1;
- if (pass == NULL)
- freepass = 1;
- freeacct = 1;
- if (ruserpass(host, &user, &pass, &acct) < 0) {
+ if (ruserpass(host, &fuser, &pass, &facct) < 0) {
code = -1;
goto cleanup_ftp_login;
}
- while (user == NULL) {
+ while (fuser == NULL) {
if (localname)
fprintf(ttyout, "Name (%s:%s): ", host, localname);
else
fprintf(ttyout, "Name (%s): ", host);
- *tmp = '\0';
- if (fgets(tmp, sizeof(tmp) - 1, stdin) == NULL) {
- fprintf(ttyout, "\nEOF received; login aborted.\n");
- clearerr(stdin);
+ errormsg = NULL;
+ nlen = get_line(stdin, tmp, sizeof(tmp), &errormsg);
+ if (nlen < 0) {
+ fprintf(ttyout, "%s; %s aborted.\n", errormsg, "login");
code = -1;
goto cleanup_ftp_login;
+ } else if (nlen == 0) {
+ fuser = ftp_strdup(localname);
+ } else {
+ fuser = ftp_strdup(tmp);
}
- tmp[strlen(tmp) - 1] = '\0';
- freeuser = 0;
- if (*tmp == '\0')
- user = localname;
- else
- user = tmp;
}
if (gatemode) {
char *nuser;
- int len;
+ size_t len;
- len = strlen(user) + 1 + strlen(host) + 1;
- nuser = xmalloc(len);
- (void)strlcpy(nuser, user, len);
+ len = strlen(fuser) + 1 + strlen(host) + 1;
+ nuser = ftp_malloc(len);
+ (void)strlcpy(nuser, fuser, len);
(void)strlcat(nuser, "@", len);
(void)strlcat(nuser, host, len);
- freeuser = 1;
- user = nuser;
+ FREEPTR(fuser);
+ fuser = nuser;
}
- n = command("USER %s", user);
+ n = command("USER %s", fuser);
if (n == CONTINUE) {
if (pass == NULL) {
- freepass = 0;
- pass = getpass("Password:");
+ p = getpass("Password: ");
+ if (p == NULL)
+ p = emptypass;
+ pass = ftp_strdup(p);
+ memset(p, 0, strlen(p));
}
n = command("PASS %s", pass);
+ memset(pass, 0, strlen(pass));
}
if (n == CONTINUE) {
aflag++;
- if (acct == NULL) {
- freeacct = 0;
- acct = getpass("Account:");
+ if (facct == NULL) {
+ p = getpass("Account: ");
+ if (p == NULL)
+ p = emptypass;
+ facct = ftp_strdup(p);
+ memset(p, 0, strlen(p));
}
- if (acct[0] == '\0') {
- warnx("Login failed.");
+ if (facct[0] == '\0') {
+ warnx("Login failed");
goto cleanup_ftp_login;
}
- n = command("ACCT %s", acct);
+ n = command("ACCT %s", facct);
+ memset(facct, 0, strlen(facct));
}
if ((n != COMPLETE) ||
- (!aflag && acct != NULL && command("ACCT %s", acct) != COMPLETE)) {
- warnx("Login failed.");
+ (!aflag && facct != NULL && command("ACCT %s", facct) != COMPLETE)) {
+ warnx("Login failed");
goto cleanup_ftp_login;
}
rval = 1;
- username = xstrdup(user);
+ username = ftp_strdup(fuser);
if (proxy)
goto cleanup_ftp_login;
@@ -483,12 +492,13 @@ ftp_login(const char *host, const char *user, const char *pass)
updateremotecwd();
cleanup_ftp_login:
- if (user != NULL && freeuser)
- free((char *)user);
- if (pass != NULL && freepass)
- free((char *)pass);
- if (acct != NULL && freeacct)
- free((char *)acct);
+ FREEPTR(fuser);
+ if (pass != NULL)
+ memset(pass, 0, strlen(pass));
+ FREEPTR(pass);
+ if (facct != NULL)
+ memset(facct, 0, strlen(facct));
+ FREEPTR(facct);
return (rval);
}
@@ -499,23 +509,26 @@ ftp_login(const char *host, const char *user, const char *pass)
* Returns false if no new arguments have been added.
*/
int
-another(int *pargc, char ***pargv, const char *prompt)
+another(int *pargc, char ***pargv, const char *aprompt)
{
- int len = strlen(line), ret;
+ const char *errormsg;
+ int ret, nlen;
+ size_t len;
+ len = strlen(line);
if (len >= sizeof(line) - 3) {
- fputs("sorry, arguments too long.\n", ttyout);
+ fputs("Sorry, arguments too long.\n", ttyout);
intr(0);
}
- fprintf(ttyout, "(%s) ", prompt);
+ fprintf(ttyout, "(%s) ", aprompt);
line[len++] = ' ';
- if (fgets(&line[len], sizeof(line) - len, stdin) == NULL) {
- clearerr(stdin);
+ errormsg = NULL;
+ nlen = get_line(stdin, line + len, sizeof(line)-len, &errormsg);
+ if (nlen < 0) {
+ fprintf(ttyout, "%s; %s aborted.\n", errormsg, "operation");
intr(0);
}
- len += strlen(&line[len]);
- if (len > 0 && line[len - 1] == '\n')
- line[len - 1] = '\0';
+ len += nlen;
makeargv();
ret = margc > *pargc;
*pargc = margc;
@@ -529,83 +542,83 @@ another(int *pargc, char ***pargv, const char *prompt)
* of writing to the screen.
*/
char *
-remglob(char *argv[], int doswitch, char **errbuf)
+remglob(char *argv[], int doswitch, const char **errbuf)
{
- char temp[MAXPATHLEN];
- static char buf[MAXPATHLEN];
- static FILE *ftemp = NULL;
- static char **args;
- int oldverbose, oldhash, oldprogress, fd, len;
- char *cp, *mode;
-
- if (!mflag || !connected) {
- if (!doglob)
- args = NULL;
- else {
- if (ftemp) {
- (void)fclose(ftemp);
- ftemp = NULL;
- }
- }
- return (NULL);
- }
- if (!doglob) {
- if (args == NULL)
- args = argv;
- if ((cp = *++args) == NULL)
- args = NULL;
- return (cp);
- }
- if (ftemp == NULL) {
+ static char buf[MAXPATHLEN];
+ static FILE *ftemp = NULL;
+ static char **args;
+ char temp[MAXPATHLEN];
+ int oldverbose, oldhash, oldprogress, fd;
+ char *cp;
+ const char *rmode;
+ size_t len;
+
+ if (!mflag || !connected) {
+ if (!doglob)
+ args = NULL;
+ else {
+ if (ftemp) {
+ (void)fclose(ftemp);
+ ftemp = NULL;
+ }
+ }
+ return (NULL);
+ }
+ if (!doglob) {
+ if (args == NULL)
+ args = argv;
+ if ((cp = *++args) == NULL)
+ args = NULL;
+ return (cp);
+ }
+ if (ftemp == NULL) {
len = strlcpy(temp, tmpdir, sizeof(temp));
if (temp[len - 1] != '/')
(void)strlcat(temp, "/", sizeof(temp));
(void)strlcat(temp, TMPFILE, sizeof(temp));
- if ((fd = mkstemp(temp)) < 0) {
- warn("unable to create temporary file %s", temp);
- return (NULL);
- }
- close(fd);
- oldverbose = verbose;
+ if ((fd = mkstemp(temp)) < 0) {
+ warn("Unable to create temporary file `%s'", temp);
+ return (NULL);
+ }
+ close(fd);
+ oldverbose = verbose;
verbose = (errbuf != NULL) ? -1 : 0;
- oldhash = hash;
+ oldhash = hash;
oldprogress = progress;
- hash = 0;
+ hash = 0;
progress = 0;
- if (doswitch)
- pswitch(!proxy);
- for (mode = "w"; *++argv != NULL; mode = "a")
- recvrequest("NLST", temp, *argv, mode, 0, 0);
+ if (doswitch)
+ pswitch(!proxy);
+ for (rmode = "w"; *++argv != NULL; rmode = "a")
+ recvrequest("NLST", temp, *argv, rmode, 0, 0);
if ((code / 100) != COMPLETE) {
if (errbuf != NULL)
*errbuf = reply_string;
}
- if (doswitch)
- pswitch(!proxy);
- verbose = oldverbose;
+ if (doswitch)
+ pswitch(!proxy);
+ verbose = oldverbose;
hash = oldhash;
progress = oldprogress;
- ftemp = fopen(temp, "r");
- (void)unlink(temp);
- if (ftemp == NULL) {
+ ftemp = fopen(temp, "r");
+ (void)unlink(temp);
+ if (ftemp == NULL) {
if (errbuf == NULL)
- fputs(
- "can't find list of remote files, oops.\n",
- ttyout);
+ warnx("Can't find list of remote files");
else
*errbuf =
- "can't find list of remote files, oops.";
- return (NULL);
- }
- }
- if (fgets(buf, sizeof(buf), ftemp) == NULL) {
- (void)fclose(ftemp);
+ "Can't find list of remote files";
+ return (NULL);
+ }
+ }
+ if (fgets(buf, sizeof(buf), ftemp) == NULL) {
+ (void)fclose(ftemp);
ftemp = NULL;
- return (NULL);
- }
- if ((cp = strchr(buf, '\n')) != NULL)
- *cp = '\0';
- return (buf);
+ return (NULL);
+ }
+ if ((cp = strchr(buf, '\n')) != NULL)
+ *cp = '\0';
+ return (buf);
}
/*
@@ -623,16 +636,16 @@ globulize(const char *pattern)
char *p;
if (!doglob)
- return (xstrdup(pattern));
+ return (ftp_strdup(pattern));
flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_TILDE;
memset(&gl, 0, sizeof(gl));
if (glob(pattern, flags, NULL, &gl) || gl.gl_pathc == 0) {
- warnx("%s: not found", pattern);
+ warnx("Glob pattern `%s' not found", pattern);
globfree(&gl);
return (NULL);
}
- p = xstrdup(gl.gl_pathv[0]);
+ p = ftp_strdup(gl.gl_pathv[0]);
globfree(&gl);
return (p);
}
@@ -648,7 +661,7 @@ remotesize(const char *file, int noisy)
overbose = verbose;
size = -1;
- if (debug == 0)
+ if (ftp_debug == 0)
verbose = -1;
if (! features[FEAT_SIZE]) {
if (noisy)
@@ -670,7 +683,7 @@ remotesize(const char *file, int noisy)
} else {
if (r == ERROR && code == 500 && features[FEAT_SIZE] == -1)
features[FEAT_SIZE] = 0;
- if (noisy && debug == 0) {
+ if (noisy && ftp_debug == 0) {
fputs(reply_string, ttyout);
putc('\n', ttyout);
}
@@ -692,7 +705,7 @@ remotemodtime(const char *file, int noisy)
overbose = verbose;
ocode = code;
rtime = -1;
- if (debug == 0)
+ if (ftp_debug == 0)
verbose = -1;
if (! features[FEAT_MDTM]) {
if (noisy)
@@ -704,7 +717,6 @@ remotemodtime(const char *file, int noisy)
if (r == COMPLETE) {
struct tm timebuf;
char *timestr, *frac;
- int yy, mo, day, hour, min, sec;
/*
* time-val = 14DIGIT [ "." 1*DIGIT ]
@@ -736,33 +748,30 @@ remotemodtime(const char *file, int noisy)
timestr[1] = '0';
fprintf(ttyout, "Converted to `%s'\n", timestr);
}
+ memset(&timebuf, 0, sizeof(timebuf));
if (strlen(timestr) != 14 ||
- sscanf(timestr, "%04d%02d%02d%02d%02d%02d",
- &yy, &mo, &day, &hour, &min, &sec) != 6) {
+ (strptime(timestr, "%Y%m%d%H%M%S", &timebuf) == NULL)) {
bad_parse_time:
fprintf(ttyout, "Can't parse time `%s'.\n", timestr);
goto cleanup_parse_time;
}
- memset(&timebuf, 0, sizeof(timebuf));
- timebuf.tm_sec = sec;
- timebuf.tm_min = min;
- timebuf.tm_hour = hour;
- timebuf.tm_mday = day;
- timebuf.tm_mon = mo - 1;
- timebuf.tm_year = yy - TM_YEAR_BASE;
timebuf.tm_isdst = -1;
rtime = timegm(&timebuf);
if (rtime == -1) {
- if (noisy || debug != 0)
+ if (noisy || ftp_debug != 0)
goto bad_parse_time;
else
goto cleanup_parse_time;
- } else if (debug)
- fprintf(ttyout, "parsed date as: %s", ctime(&rtime));
+ } else {
+ DPRINTF("remotemodtime: parsed date `%s' as " LLF
+ ", %s",
+ timestr, (LLT)rtime,
+ rfc2822time(localtime(&rtime)));
+ }
} else {
if (r == ERROR && code == 500 && features[FEAT_MDTM] == -1)
features[FEAT_MDTM] = 0;
- if (noisy && debug == 0) {
+ if (noisy && ftp_debug == 0) {
fputs(reply_string, ttyout);
putc('\n', ttyout);
}
@@ -775,6 +784,21 @@ remotemodtime(const char *file, int noisy)
}
/*
+ * Format tm in an RFC2822 compatible manner, with a trailing \n.
+ * Returns a pointer to a static string containing the result.
+ */
+const char *
+rfc2822time(const struct tm *tm)
+{
+ static char result[50];
+
+ if (strftime(result, sizeof(result),
+ "%a, %d %b %Y %H:%M:%S %z\n", tm) == 0)
+ errx(1, "Can't convert RFC2822 time: buffer too small");
+ return result;
+}
+
+/*
* Update global `localcwd', which contains the state of the local cwd
*/
void
@@ -783,8 +807,7 @@ updatelocalcwd(void)
if (getcwd(localcwd, sizeof(localcwd)) == NULL)
localcwd[0] = '\0';
- if (debug)
- fprintf(ttyout, "got localcwd as `%s'\n", localcwd);
+ DPRINTF("updatelocalcwd: got `%s'\n", localcwd);
}
/*
@@ -793,12 +816,13 @@ updatelocalcwd(void)
void
updateremotecwd(void)
{
- int overbose, ocode, i;
+ int overbose, ocode;
+ size_t i;
char *cp;
overbose = verbose;
ocode = code;
- if (debug == 0)
+ if (ftp_debug == 0)
verbose = -1;
if (command("PWD") != COMPLETE)
goto badremotecwd;
@@ -816,8 +840,7 @@ updateremotecwd(void)
remotecwd[i] = *cp;
}
remotecwd[i] = '\0';
- if (debug)
- fprintf(ttyout, "got remotecwd as `%s'\n", remotecwd);
+ DPRINTF("updateremotecwd: got `%s'\n", remotecwd);
goto cleanupremotecwd;
badremotecwd:
remotecwd[0]='\0';
@@ -833,20 +856,26 @@ updateremotecwd(void)
int
fileindir(const char *file, const char *dir)
{
- char realfile[PATH_MAX+1];
+ char parentdirbuf[PATH_MAX+1], *parentdir;
+ char realdir[PATH_MAX+1];
size_t dirlen;
- if (realpath(file, realfile) == NULL) {
- warn("Unable to determine real path of `%s'", file);
+ /* determine parent directory of file */
+ (void)strlcpy(parentdirbuf, file, sizeof(parentdirbuf));
+ parentdir = dirname(parentdirbuf);
+ if (strcmp(parentdir, ".") == 0)
+ return 1; /* current directory is ok */
+
+ /* find the directory */
+ if (realpath(parentdir, realdir) == NULL) {
+ warn("Unable to determine real path of `%s'", parentdir);
return 0;
}
- if (realfile[0] != '/') /* relative result */
+ if (realdir[0] != '/') /* relative result is ok */
return 1;
dirlen = strlen(dir);
-#if 0
-printf("file %s realfile %s dir %s [%d]\n", file, realfile, dir, dirlen);
-#endif
- if (strncmp(realfile, dir, dirlen) == 0 && realfile[dirlen] == '/')
+ if (strncmp(realdir, dir, dirlen) == 0 &&
+ (realdir[dirlen] == '/' || realdir[dirlen] == '\0'))
return 1;
return 0;
}
@@ -857,9 +886,10 @@ printf("file %s realfile %s dir %s [%d]\n", file, realfile, dir, dirlen);
void
list_vertical(StringList *sl)
{
- int i, j, w;
- int columns, width, lines;
+ size_t i, j;
+ size_t columns, lines;
char *p;
+ size_t w, width;
width = 0;
@@ -883,10 +913,12 @@ list_vertical(StringList *sl)
putc('\n', ttyout);
break;
}
- w = strlen(p);
- while (w < width) {
- w = (w + 8) &~ 7;
- (void)putc('\t', ttyout);
+ if (p) {
+ w = strlen(p);
+ while (w < width) {
+ w = (w + 8) &~ 7;
+ (void)putc('\t', ttyout);
+ }
}
}
}
@@ -1031,11 +1063,11 @@ setupsockbufsize(int sock)
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(void *)&sndbuf_size, sizeof(sndbuf_size)) == -1)
- warn("unable to set sndbuf size %d", sndbuf_size);
+ warn("Unable to set sndbuf size %d", sndbuf_size);
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(void *)&rcvbuf_size, sizeof(rcvbuf_size)) == -1)
- warn("unable to set rcvbuf size %d", rcvbuf_size);
+ warn("Unable to set rcvbuf size %d", rcvbuf_size);
}
/*
@@ -1044,7 +1076,7 @@ setupsockbufsize(int sock)
void
ftpvis(char *dst, size_t dstlen, const char *src, size_t srclen)
{
- int di, si;
+ size_t di, si;
for (di = si = 0;
src[si] != '\0' && di < dstlen && si < srclen;
@@ -1073,9 +1105,9 @@ ftpvis(char *dst, size_t dstlen, const char *src, size_t srclen)
void
formatbuf(char *buf, size_t len, const char *src)
{
- const char *p;
- char *p2, *q;
- int i, op, updirs, pdirs;
+ const char *p, *p2, *q;
+ size_t i;
+ int op, updirs, pdirs;
#define ADDBUF(x) do { \
if (i >= len - 1) \
@@ -1153,7 +1185,7 @@ formatbuf(char *buf, size_t len, const char *src)
case 'M':
case 'm':
- for (p2 = connected && username ? username : "-";
+ for (p2 = connected && hostname ? hostname : "-";
*p2 ; p2++) {
if (op == 'm' && *p2 == '.')
break;
@@ -1182,39 +1214,6 @@ formatbuf(char *buf, size_t len, const char *src)
}
/*
- * Parse `port' into a TCP port number, defaulting to `defport' if `port' is
- * an unknown service name. If defport != -1, print a warning upon bad parse.
- */
-int
-parseport(const char *port, int defport)
-{
- int rv;
- long nport;
- char *p, *ep;
-
- p = xstrdup(port);
- nport = strtol(p, &ep, 10);
- if (*ep != '\0' && ep == p) {
- struct servent *svp;
-
- svp = getservbyname(port, "tcp");
- if (svp == NULL) {
- badparseport:
- if (defport != -1)
- warnx("Unknown port `%s', using port %d",
- port, defport);
- rv = defport;
- } else
- rv = ntohs(svp->s_port);
- } else if (nport < 1 || nport > MAX_IN_PORT_T || *ep != '\0')
- goto badparseport;
- else
- rv = nport;
- free(p);
- return (rv);
-}
-
-/*
* Determine if given string is an IPv6 address or not.
* Return 1 for yes, 0 for no
*/
@@ -1226,7 +1225,7 @@ isipv6addr(const char *addr)
struct addrinfo hints, *res;
memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_INET6;
+ hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_DGRAM; /*dummy*/
hints.ai_flags = AI_NUMERICHOST;
if (getaddrinfo(addr, "0", &hints, &res) != 0)
@@ -1235,35 +1234,124 @@ isipv6addr(const char *addr)
rv = 1;
freeaddrinfo(res);
}
- if (debug)
- fprintf(ttyout, "isipv6addr: got %d for %s\n", rv, addr);
+ DPRINTF("isipv6addr: got %d for %s\n", rv, addr);
#endif
return (rv == 1) ? 1 : 0;
}
+/*
+ * Read a line from the FILE stream into buf/buflen using fgets(), so up
+ * to buflen-1 chars will be read and the result will be NUL terminated.
+ * If the line has a trailing newline it will be removed.
+ * If the line is too long, excess characters will be read until
+ * newline/EOF/error.
+ * If EOF/error occurs or a too-long line is encountered and errormsg
+ * isn't NULL, it will be changed to a description of the problem.
+ * (The EOF message has a leading \n for cosmetic purposes).
+ * Returns:
+ * >=0 length of line (excluding trailing newline) if all ok
+ * -1 error occurred
+ * -2 EOF encountered
+ * -3 line was too long
+ */
+int
+get_line(FILE *stream, char *buf, size_t buflen, const char **errormsg)
+{
+ int rv, ch;
+ size_t len;
+
+ if (fgets(buf, buflen, stream) == NULL) {
+ if (feof(stream)) { /* EOF */
+ rv = -2;
+ if (errormsg)
+ *errormsg = "\nEOF received";
+ } else { /* error */
+ rv = -1;
+ if (errormsg)
+ *errormsg = "Error encountered";
+ }
+ clearerr(stream);
+ return rv;
+ }
+ len = strlen(buf);
+ if (buf[len-1] == '\n') { /* clear any trailing newline */
+ buf[--len] = '\0';
+ } else if (len == buflen-1) { /* line too long */
+ while ((ch = getchar()) != '\n' && ch != EOF)
+ continue;
+ if (errormsg)
+ *errormsg = "Input line is too long";
+ clearerr(stream);
+ return -3;
+ }
+ if (errormsg)
+ *errormsg = NULL;
+ return len;
+}
/*
- * Internal version of connect(2); sets socket buffer sizes first and
+ * Internal version of connect(2); sets socket buffer sizes,
+ * binds to a specific local address (if set), and
* supports a connection timeout using a non-blocking connect(2) with
* a poll(2).
* Socket fcntl flags are temporarily updated to include O_NONBLOCK;
* these will not be reverted on connection failure.
- * Returns -1 upon failure (with errno set to the problem), or 0 on success.
+ * Returns 0 on success, or -1 upon failure (with an appropriate
+ * error message displayed.)
*/
int
-xconnect(int sock, const struct sockaddr *name, socklen_t namelen)
+ftp_connect(int sock, const struct sockaddr *name, socklen_t namelen)
{
int flags, rv, timeout, error;
socklen_t slen;
struct timeval endtime, now, td;
struct pollfd pfd[1];
+ char hname[NI_MAXHOST];
+ char sname[NI_MAXSERV];
setupsockbufsize(sock);
+ if (getnameinfo(name, namelen,
+ hname, sizeof(hname), sname, sizeof(sname),
+ NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
+ strlcpy(hname, "?", sizeof(hname));
+ strlcpy(sname, "?", sizeof(sname));
+ }
+
+ if (bindai != NULL) { /* bind to specific addr */
+ struct addrinfo *ai;
+
+ for (ai = bindai; ai != NULL; ai = ai->ai_next) {
+ if (ai->ai_family == name->sa_family)
+ break;
+ }
+ if (ai == NULL)
+ ai = bindai;
+ if (bind(sock, ai->ai_addr, ai->ai_addrlen) == -1) {
+ char bname[NI_MAXHOST];
+ int saveerr;
+
+ saveerr = errno;
+ if (getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ bname, sizeof(bname), NULL, 0, NI_NUMERICHOST) != 0)
+ strlcpy(bname, "?", sizeof(bname));
+ errno = saveerr;
+ warn("Can't bind to `%s'", bname);
+ return -1;
+ }
+ }
- if ((flags = fcntl(sock, F_GETFL, 0)) == -1)
- return -1; /* get current socket flags */
- if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1)
- return -1; /* set non-blocking connect */
+ /* save current socket flags */
+ if ((flags = fcntl(sock, F_GETFL, 0)) == -1) {
+ warn("Can't %s socket flags for connect to `%s:%s'",
+ "save", hname, sname);
+ return -1;
+ }
+ /* set non-blocking connect */
+ if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1) {
+ warn("Can't set socket non-blocking for connect to `%s:%s'",
+ hname, sname);
+ return -1;
+ }
/* NOTE: we now must restore socket flags on successful exit */
@@ -1277,8 +1365,11 @@ xconnect(int sock, const struct sockaddr *name, socklen_t namelen)
rv = connect(sock, name, namelen); /* inititate the connection */
if (rv == -1) { /* connection error */
- if (errno != EINPROGRESS) /* error isn't "please wait" */
+ if (errno != EINPROGRESS) { /* error isn't "please wait" */
+ connecterror:
+ warn("Can't connect to `%s:%s'", hname, sname);
return -1;
+ }
/* connect EINPROGRESS; wait */
do {
@@ -1292,34 +1383,39 @@ xconnect(int sock, const struct sockaddr *name, socklen_t namelen)
timeout = INFTIM;
}
pfd[0].revents = 0;
- rv = xpoll(pfd, 1, timeout);
+ rv = ftp_poll(pfd, 1, timeout);
/* loop until poll ! EINTR */
} while (rv == -1 && errno == EINTR);
if (rv == 0) { /* poll (connect) timed out */
errno = ETIMEDOUT;
- return -1;
+ goto connecterror;
}
if (rv == -1) { /* poll error */
- return -1;
+ goto connecterror;
} else if (pfd[0].revents & (POLLIN|POLLOUT)) {
slen = sizeof(error); /* OK, or pending error */
if (getsockopt(sock, SOL_SOCKET, SO_ERROR,
- &error, &slen) == -1)
- return -1; /* Solaris pending error */
- if (error != 0) {
+ &error, &slen) == -1) {
+ /* Solaris pending error */
+ goto connecterror;
+ } else if (error != 0) {
errno = error; /* BSD pending error */
- return -1;
+ goto connecterror;
}
} else {
errno = EBADF; /* this shouldn't happen ... */
- return -1;
+ goto connecterror;
}
}
- if (fcntl(sock, F_SETFL, flags) == -1) /* restore socket flags */
+ if (fcntl(sock, F_SETFL, flags) == -1) {
+ /* restore socket flags */
+ warn("Can't %s socket flags for connect to `%s:%s'",
+ "restore", hname, sname);
return -1;
+ }
return 0;
}
@@ -1327,7 +1423,7 @@ xconnect(int sock, const struct sockaddr *name, socklen_t namelen)
* Internal version of listen(2); sets socket buffer sizes first.
*/
int
-xlisten(int sock, int backlog)
+ftp_listen(int sock, int backlog)
{
setupsockbufsize(sock);
@@ -1339,16 +1435,74 @@ xlisten(int sock, int backlog)
* on platforms without the former.
*/
int
-xpoll(struct pollfd *fds, int nfds, int timeout)
+ftp_poll(struct pollfd *fds, int nfds, int timeout)
{
+#if defined(HAVE_POLL)
return poll(fds, nfds, timeout);
+
+#elif defined(HAVE_SELECT)
+ /* implement poll(2) using select(2) */
+ fd_set rset, wset, xset;
+ const int rsetflags = POLLIN | POLLRDNORM;
+ const int wsetflags = POLLOUT | POLLWRNORM;
+ const int xsetflags = POLLRDBAND;
+ struct timeval tv, *ptv;
+ int i, max, rv;
+
+ FD_ZERO(&rset); /* build list of read & write events */
+ FD_ZERO(&wset);
+ FD_ZERO(&xset);
+ max = 0;
+ for (i = 0; i < nfds; i++) {
+ if (fds[i].fd > FD_SETSIZE) {
+ warnx("can't select fd %d", fds[i].fd);
+ errno = EINVAL;
+ return -1;
+ } else if (fds[i].fd > max)
+ max = fds[i].fd;
+ if (fds[i].events & rsetflags)
+ FD_SET(fds[i].fd, &rset);
+ if (fds[i].events & wsetflags)
+ FD_SET(fds[i].fd, &wset);
+ if (fds[i].events & xsetflags)
+ FD_SET(fds[i].fd, &xset);
+ }
+
+ ptv = &tv; /* determine timeout */
+ if (timeout == -1) { /* wait forever */
+ ptv = NULL;
+ } else if (timeout == 0) { /* poll once */
+ ptv->tv_sec = 0;
+ ptv->tv_usec = 0;
+ }
+ else if (timeout != 0) { /* wait timeout milliseconds */
+ ptv->tv_sec = timeout / 1000;
+ ptv->tv_usec = (timeout % 1000) * 1000;
+ }
+ rv = select(max + 1, &rset, &wset, &xset, ptv);
+ if (rv <= 0) /* -1 == error, 0 == timeout */
+ return rv;
+
+ for (i = 0; i < nfds; i++) { /* determine results */
+ if (FD_ISSET(fds[i].fd, &rset))
+ fds[i].revents |= (fds[i].events & rsetflags);
+ if (FD_ISSET(fds[i].fd, &wset))
+ fds[i].revents |= (fds[i].events & wsetflags);
+ if (FD_ISSET(fds[i].fd, &xset))
+ fds[i].revents |= (fds[i].events & xsetflags);
+ }
+ return rv;
+
+#else
+# error no way to implement xpoll
+#endif
}
/*
* malloc() with inbuilt error checking
*/
void *
-xmalloc(size_t size)
+ftp_malloc(size_t size)
{
void *p;
@@ -1362,7 +1516,7 @@ xmalloc(size_t size)
* sl_init() with inbuilt error checking
*/
StringList *
-xsl_init(void)
+ftp_sl_init(void)
{
StringList *p;
@@ -1376,7 +1530,7 @@ xsl_init(void)
* sl_add() with inbuilt error checking
*/
void
-xsl_add(StringList *sl, char *i)
+ftp_sl_add(StringList *sl, char *i)
{
if (sl_add(sl, i) == -1)
@@ -1387,12 +1541,12 @@ xsl_add(StringList *sl, char *i)
* strdup() with inbuilt error checking
*/
char *
-xstrdup(const char *str)
+ftp_strdup(const char *str)
{
char *s;
if (str == NULL)
- errx(1, "xstrdup() called with NULL argument");
+ errx(1, "ftp_strdup: called with NULL argument");
s = strdup(str);
if (s == NULL)
err(1, "Unable to allocate memory for string copy");
diff --git a/contrib/lukemftp/src/version.h b/contrib/tnftp/src/version.h
index 7b69df1..6bb3631 100644
--- a/contrib/lukemftp/src/version.h
+++ b/contrib/tnftp/src/version.h
@@ -1,6 +1,8 @@
-/* $NetBSD: version.h,v 1.50 2005/05/14 15:26:43 lukem Exp $ */
+/* $NetBSD: version.h,v 1.4 2009/11/15 10:12:37 lukem Exp $ */
+/* from NetBSD: version.h,v 1.80 2009/11/15 10:03:16 lukem Exp */
+
/*-
- * Copyright (c) 1999-2005 The NetBSD Foundation, Inc.
+ * Copyright (c) 1999-2009 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -14,13 +16,6 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
@@ -40,5 +35,5 @@
#endif
#ifndef FTP_VERSION
-#define FTP_VERSION "20050514"
+#define FTP_VERSION "20090915"
#endif
diff --git a/contrib/tnftp/tnftp.h b/contrib/tnftp/tnftp.h
new file mode 100644
index 0000000..3aa6eca
--- /dev/null
+++ b/contrib/tnftp/tnftp.h
@@ -0,0 +1,495 @@
+/* $NetBSD: tnftp.h,v 1.33 2009/11/14 08:32:42 lukem Exp $ */
+
+#define FTP_PRODUCT PACKAGE_NAME
+#define FTP_VERSION PACKAGE_VERSION
+
+#include "tnftp_config.h"
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+
+#if defined(HAVE_SYS_TYPES_H)
+# include <sys/types.h>
+#endif
+#if defined(STDC_HEADERS)
+# include <stdarg.h>
+# include <stdlib.h>
+# include <string.h>
+#endif
+#if defined(HAVE_LIBGEN_H)
+# include <libgen.h>
+#endif
+#if defined(HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+#if defined(HAVE_POLL_H)
+# include <poll.h>
+#elif defined(HAVE_SYS_POLL_H)
+# include <sys/poll.h>
+#endif
+#if defined(HAVE_SYS_SOCKET_H)
+# include <sys/socket.h>
+#endif
+#if defined(HAVE_NETINET_IN_H)
+# include <netinet/in.h>
+#endif
+#if defined(HAVE_NETINET_IN_SYSTM_H)
+# include <netinet/in_systm.h>
+#endif
+#if defined(HAVE_NETINET_IP_H)
+# include <netinet/ip.h>
+#endif
+#if defined(HAVE_NETDB_H)
+# if HAVE_DECL_AI_NUMERICHOST
+# include <netdb.h>
+# else /* !HAVE_DECL_AI_NUMERICHOST */
+# define getaddrinfo non_rfc2553_getaddrinfo
+# include <netdb.h>
+# undef getaddrinfo
+# endif /* !HAVE_DECL_AI_NUMERICHOST */
+#endif
+#if defined(HAVE_ARPA_INET_H)
+# include <arpa/inet.h>
+#endif
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# if defined(HAVE_SYS_NDIR_H)
+# include <sys/ndir.h>
+# endif
+# if defined(HAVE_SYS_DIR_H)
+# include <sys/dir.h>
+# endif
+# if defined(HAVE_NDIR_H)
+# include <ndir.h>
+# endif
+#endif
+
+#if defined(HAVE_SYS_IOCTL_H)
+# include <sys/ioctl.h>
+#endif
+#if defined(HAVE_SYS_PARAM_H)
+# include <sys/param.h>
+#endif
+#if defined(HAVE_SYS_STAT_H)
+# include <sys/stat.h>
+#endif
+#if defined(HAVE_SYS_SYSLIMITS_H)
+# include <sys/syslimits.h>
+#endif
+#if defined(HAVE_SYS_WAIT_H)
+# include <sys/wait.h>
+#endif
+
+#if defined(HAVE_ARPA_FTP_H)
+# include <arpa/ftp.h>
+#endif
+
+#if defined(HAVE_FCNTL_H)
+# include <fcntl.h>
+#endif
+#if defined(HAVE_LIMITS_H)
+# include <limits.h>
+#endif
+#if defined(HAVE_PWD_H)
+# include <pwd.h>
+#endif
+#if defined(HAVE_SETJMP_H)
+# include <setjmp.h>
+#endif
+#if defined(HAVE_SIGNAL_H)
+# include <signal.h>
+#endif
+#if defined(HAVE_STDDEF_H)
+# include <stddef.h>
+#endif
+#if defined(HAVE_TERMIOS_H)
+# include <termios.h>
+#endif
+
+#if defined(HAVE_POLL)
+/* we use poll */
+#elif defined(HAVE_SELECT)
+/* we use select */
+#else /* !defined(HAVE_POLL) && !defined(HAVE_SELECT) */
+# error "no poll() or select() found"
+#endif
+#if !defined(POLLIN)
+# define POLLIN 0x0001
+#endif
+#if !defined(POLLOUT)
+# define POLLOUT 0x0004
+#endif
+#if !defined(POLLRDNORM)
+# define POLLRDNORM 0x0040
+#endif
+#if !defined(POLLWRNORM)
+# define POLLWRNORM POLLOUT
+#endif
+#if !defined(POLLRDBAND)
+# define POLLRDBAND 0x0080
+#endif
+#if !defined(INFTIM)
+# define INFTIM -1
+#endif
+#if !defined(HAVE_STRUCT_POLLFD)
+struct pollfd {
+ int fd;
+ short events;
+ short revents;
+};
+#endif
+
+#if defined(TIME_WITH_SYS_TIME)
+# include <sys/time.h>
+# include <time.h>
+#else
+# if defined(HAVE_SYS_TIME_H)
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#if defined(HAVE_ERR_H)
+# include <err.h>
+#endif
+
+#if defined(USE_GLOB_H) /* not set by configure; used by other build systems */
+# include <glob.h>
+#else
+# include "ftpglob.h"
+#endif
+
+#if defined(HAVE_PATHS_H)
+# include <paths.h>
+#endif
+#if !defined(_PATH_BSHELL)
+# define _PATH_BSHELL "/bin/sh"
+#endif
+#if !defined(_PATH_TMP)
+# define _PATH_TMP "/tmp/"
+#endif
+
+typedef struct _stringlist {
+ char **sl_str;
+ size_t sl_max;
+ size_t sl_cur;
+} StringList;
+
+StringList *sl_init(void);
+int sl_add(StringList *, char *);
+void sl_free(StringList *, int);
+char *sl_find(StringList *, char *);
+
+#if defined(HAVE_TERMCAP_H)
+# include <termcap.h>
+#else
+int tgetent(char *, const char *);
+char *tgetstr(const char *, char **);
+int tgetflag(const char *);
+int tgetnum(const char *);
+char *tgoto(const char *, int, int);
+void tputs(const char *, int, int (*)(int));
+#endif /* !HAVE_TERMCAP_H */
+
+#if defined(HAVE_VIS_H) && defined(HAVE_STRVIS) && defined(HAVE_STRUNVIS)
+# include <vis.h>
+#else
+# include "ftpvis.h"
+#endif
+
+#if !defined(HAVE_IN_PORT_T)
+typedef unsigned short in_port_t;
+#endif
+
+#if !defined(HAVE_SA_FAMILY_T)
+typedef unsigned short sa_family_t;
+#endif
+
+#if !defined(HAVE_SOCKLEN_T)
+typedef unsigned int socklen_t;
+#endif
+
+#if defined(USE_INET6)
+# define INET6
+#endif
+
+#if !HAVE_DECL_AI_NUMERICHOST
+
+ /* RFC 2553 */
+#undef EAI_ADDRFAMILY
+#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */
+#undef EAI_AGAIN
+#define EAI_AGAIN 2 /* temporary failure in name resolution */
+#undef EAI_BADFLAGS
+#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
+#undef EAI_FAIL
+#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
+#undef EAI_FAMILY
+#define EAI_FAMILY 5 /* ai_family not supported */
+#undef EAI_MEMORY
+#define EAI_MEMORY 6 /* memory allocation failure */
+#undef EAI_NODATA
+#define EAI_NODATA 7 /* no address associated with hostname */
+#undef EAI_NONAME
+#define EAI_NONAME 8 /* hostname nor servname provided, or not known */
+#undef EAI_SERVICE
+#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
+#undef EAI_SOCKTYPE
+#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
+#undef EAI_SYSTEM
+#define EAI_SYSTEM 11 /* system error returned in errno */
+
+ /* KAME extensions? */
+#undef EAI_BADHINTS
+#define EAI_BADHINTS 12
+#undef EAI_PROTOCOL
+#define EAI_PROTOCOL 13
+#undef EAI_MAX
+#define EAI_MAX 14
+
+ /* RFC 2553 */
+#undef NI_MAXHOST
+#define NI_MAXHOST 1025
+#undef NI_MAXSERV
+#define NI_MAXSERV 32
+
+#undef NI_NOFQDN
+#define NI_NOFQDN 0x00000001
+#undef NI_NUMERICHOST
+#define NI_NUMERICHOST 0x00000002
+#undef NI_NAMEREQD
+#define NI_NAMEREQD 0x00000004
+#undef NI_NUMERICSERV
+#define NI_NUMERICSERV 0x00000008
+#undef NI_DGRAM
+#define NI_DGRAM 0x00000010
+
+ /* RFC 2553 */
+#undef AI_PASSIVE
+#define AI_PASSIVE 0x00000001 /* get address to use bind() */
+#undef AI_CANONNAME
+#define AI_CANONNAME 0x00000002 /* fill ai_canonname */
+
+ /* KAME extensions ? */
+#undef AI_NUMERICHOST
+#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */
+#undef AI_MASK
+#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
+
+ /* RFC 2553 */
+#undef AI_ALL
+#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
+#undef AI_V4MAPPED_CFG
+#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */
+#undef AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */
+#undef AI_V4MAPPED
+#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */
+
+#endif /* !HAVE_DECL_AI_NUMERICHOST */
+
+
+#if !HAVE_DECL_AI_NUMERICHOST && !defined(HAVE_STRUCT_ADDRINFO) \
+ && !defined(USE_SOCKS)
+
+struct addrinfo {
+ int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
+ int ai_family; /* PF_xxx */
+ int ai_socktype; /* SOCK_xxx */
+ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+ socklen_t ai_addrlen; /* length of ai_addr */
+ char *ai_canonname; /* canonical name for hostname */
+ struct sockaddr *ai_addr; /* binary address */
+ struct addrinfo *ai_next; /* next structure in linked list */
+};
+
+int getaddrinfo(const char *, const char *,
+ const struct addrinfo *, struct addrinfo **);
+int getnameinfo(const struct sockaddr *, socklen_t,
+ char *, size_t, char *, size_t, int);
+void freeaddrinfo(struct addrinfo *);
+const char *gai_strerror(int);
+
+#endif /* !HAVE_DECL_AI_NUMERICHOST && !defined(HAVE_STRUCT_ADDRINFO) \
+ && !defined(USE_SOCKS) */
+
+#if !defined(HAVE_STRUCT_DIRENT_D_NAMLEN)
+# define DIRENT_MISSING_D_NAMLEN
+#endif
+
+#if !HAVE_DECL_H_ERRNO
+extern int h_errno;
+#endif
+#define HAVE_H_ERRNO 1 /* XXX: an assumption for now... */
+
+#if !HAVE_DECL_FCLOSE
+int fclose(FILE *);
+#endif
+
+#if !HAVE_DECL_GETPASS
+char *getpass(const char *);
+#endif
+
+#if !HAVE_DECL_OPTARG
+extern char *optarg;
+#endif
+
+#if !HAVE_DECL_OPTIND
+extern int optind;
+#endif
+
+#if !HAVE_DECL_PCLOSE
+int pclose(FILE *);
+#endif
+
+#if !HAVE_DECL_DIRNAME
+char *dirname(char *);
+#endif
+
+#if !defined(HAVE_ERR)
+void err(int, const char *, ...);
+void errx(int, const char *, ...);
+void warn(const char *, ...);
+void warnx(const char *, ...);
+#endif
+
+#if !defined(HAVE_FGETLN)
+char *fgetln(FILE *, size_t *);
+#endif
+
+#if !defined(HAVE_FSEEKO)
+int fseeko(FILE *, off_t, int);
+#endif
+
+#if !defined(HAVE_INET_NTOP)
+const char *inet_ntop(int, const void *, char *, socklen_t);
+#endif
+
+#if !defined(HAVE_INET_PTON)
+int inet_pton(int, const char *, void *);
+#endif
+
+#if !defined(HAVE_MKSTEMP)
+int mkstemp(char *);
+#endif
+
+#if !defined(HAVE_SETPROGNAME)
+const char *getprogname(void);
+void setprogname(const char *);
+#endif
+
+#if !defined(HAVE_SNPRINTF)
+int snprintf(char *, size_t, const char *, ...);
+#endif
+
+#if !defined(HAVE_STRDUP)
+char *strdup(const char *);
+#endif
+
+#if !defined(HAVE_STRERROR)
+char *strerror(int);
+#endif
+
+#if !defined(HAVE_STRPTIME) || !HAVE_DECL_STRPTIME
+char *strptime(const char *, const char *, struct tm *);
+#endif
+
+#if defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)
+# if !defined(HAVE_STRTOLL)
+long long strtoll(const char *, char **, int);
+# endif
+# if !defined(LLONG_MIN)
+# define LLONG_MIN (-0x7fffffffffffffffLL-1)
+# endif
+# if !defined(LLONG_MAX)
+# define LLONG_MAX (0x7fffffffffffffffLL)
+# endif
+#else /* !(defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)) */
+# define NO_LONG_LONG 1
+#endif /* !(defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)) */
+
+#if !defined(HAVE_TIMEGM)
+time_t timegm(struct tm *);
+#endif
+
+#if !defined(HAVE_STRLCAT)
+size_t strlcat(char *, const char *, size_t);
+#endif
+
+#if !defined(HAVE_STRLCPY)
+size_t strlcpy(char *, const char *, size_t);
+#endif
+
+#if !defined(HAVE_STRSEP)
+char *strsep(char **stringp, const char *delim);
+#endif
+
+#if !defined(HAVE_UTIMES)
+int utimes(const char *, const struct timeval *);
+#endif
+
+#if !defined(HAVE_MEMMOVE)
+# define memmove(a,b,c) bcopy((b),(a),(c))
+ /* XXX: add others #defines for borken systems? */
+#endif
+
+#if defined(HAVE_GETPASSPHRASE)
+# define getpass getpassphrase
+#endif
+
+#if !defined(MIN)
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+#if !defined(MAX)
+# define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+
+#if !defined(timersub)
+# define timersub(tvp, uvp, vvp) \
+ do { \
+ (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
+ (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
+ if ((vvp)->tv_usec < 0) { \
+ (vvp)->tv_sec--; \
+ (vvp)->tv_usec += 1000000; \
+ } \
+ } while (0)
+#endif
+
+#if !defined(S_ISLNK)
+# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
+#endif
+
+#define EPOCH_YEAR 1970
+#define SECSPERHOUR 3600
+#define SECSPERDAY 86400
+#define TM_YEAR_BASE 1900
+
+#if defined(USE_SOCKS) /* (Dante) SOCKS5 */
+#define connect Rconnect
+#define bind Rbind
+#define getsockname Rgetsockname
+#define getpeername Rgetpeername
+#define accept Raccept
+#define rresvport Rrresvport
+#define bindresvport Rbindresvport
+#define gethostbyname Rgethostbyname
+#define gethostbyname2 Rgethostbyname2
+#define sendto Rsendto
+#define recvfrom Rrecvfrom
+#define recvfrom Rrecvfrom
+#define write Rwrite
+#define writev Rwritev
+#define send Rsend
+#define sendmsg Rsendmsg
+#define read Rread
+#define readv Rreadv
+#define recv Rrecv
+#define recvmsg Rrecvmsg
+#define getaddrinfo Rgetaddrinfo
+#define getipnodebyname Rgetipnodebyname
+#endif /* defined(USE_SOCKS) */
diff --git a/contrib/tnftp/todo b/contrib/tnftp/todo
new file mode 100644
index 0000000..38f8264
--- /dev/null
+++ b/contrib/tnftp/todo
@@ -0,0 +1,25 @@
+$NetBSD: todo,v 1.12 2008/12/20 15:17:58 lukem Exp $
+
+Current Items
+-------------
+
+autoconf test for HAVE_DECL_GETADDRINFO if providing getaddrinfo() override.
+(required for UnixWare 7.1.1)
+
+Interix may need hack to fix detection of getpgrp() void args.
+(See pkgsrc/net/tnftp/files/src/progressbar.c 1.2)
+
+Old Items
+---------
+
+add locale autoconf checks
+
+in configure, check for ansi c compiler and barf if it fails
+
+check if we need #defines for memcpy() et al
+
+possibly install editline.3 and editrc.5
+
+system specific tests (to remove need for manual intervention):
+- sunos4
+ LIBS+= -lresolv
diff --git a/contrib/top/commands.c b/contrib/top/commands.c
index 7891068..49472fd 100644
--- a/contrib/top/commands.c
+++ b/contrib/top/commands.c
@@ -88,6 +88,7 @@ o - specify sort order (vcsw, ivcsw, read, write, fault, total, jid)\n",
stdout);
#endif
fputs("\
+P - toggle the displaying of per-CPU statistics\n\
r - renice a process\n\
s - change number of seconds to delay between updates\n\
S - toggle the displaying of system processes\n\
diff --git a/contrib/top/display.c b/contrib/top/display.c
index f0f0c23..a5a4e9e 100644
--- a/contrib/top/display.c
+++ b/contrib/top/display.c
@@ -151,16 +151,14 @@ int display_resize()
return(smart_terminal ? lines : Largest);
}
-int display_init(statics)
+int display_updatecpus(statics)
struct statics *statics;
{
register int lines;
- register char **pp;
- register int *ip;
register int i;
-
+
/* call resize to do the dirty work */
lines = display_resize();
num_cpus = statics->ncpus;
@@ -170,6 +168,21 @@ struct statics *statics;
for (i = num_cpus; i > 9; i /= 10)
cpustates_column++;
+ return(lines);
+}
+
+int display_init(statics)
+
+struct statics *statics;
+
+{
+ register int lines;
+ register char **pp;
+ register int *ip;
+ register int i;
+
+ lines = display_updatecpus(statics);
+
/* only do the rest if we need to */
if (lines > -1)
{
@@ -698,7 +711,7 @@ char *text;
int width;
s = NULL;
- width = screen_width;
+ width = display_width;
header_length = strlen(text);
if (header_length >= width) {
s = malloc((width + 1) * sizeof(char));
@@ -706,14 +719,6 @@ char *text;
return (NULL);
strncpy(s, text, width);
s[width] = '\0';
- } else {
- s = malloc((width + 1) * sizeof(char));
- if (s == NULL)
- return (NULL);
- strncpy(s, text, width);
- while (screen_width > header_length)
- s[header_length++] = ' ';
- s[width] = '\0';
}
return (s);
}
@@ -738,7 +743,7 @@ char *text;
if (header_status == ON)
{
putchar('\n');
- standout(text, stdout);
+ fputs(text, stdout);
lastline++;
}
else if (header_status == ERASE)
diff --git a/contrib/top/top.X b/contrib/top/top.X
index 41c3d78..9c54f85 100644
--- a/contrib/top/top.X
+++ b/contrib/top/top.X
@@ -200,11 +200,17 @@ a user to set his or her own defaults. The number of processes to display
can also be specified in the environment variable
.BR TOP .
The options
+.BR \-a ,
+.BR \-C ,
+.BR \-H ,
.BR \-I ,
+.BR \-j ,
+.BR \-P ,
.BR \-S ,
+.BR \-t ,
.BR \-u ,
and
-.B \-t
+.B \-z
are actually toggles. A second specification of any of these options
will negate the first. Thus a user who has the environment variable
.B TOP
@@ -309,6 +315,9 @@ Toggle the display of
.IR jail (8)
ID.
.TP
+.B P
+Toggle the display of per-CPU statistics.
+.TP
.B t
Toggle the display of the
.I top
diff --git a/contrib/top/top.c b/contrib/top/top.c
index 6673a27..4e4d86d 100644
--- a/contrib/top/top.c
+++ b/contrib/top/top.c
@@ -196,9 +196,9 @@ char *argv[];
fd_set readfds;
#ifdef ORDER
- static char command_chars[] = "\f qh?en#sdkriIutHmSCajzo";
+ static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPo";
#else
- static char command_chars[] = "\f qh?en#sdkriIutHmSCajz";
+ static char command_chars[] = "\f qh?en#sdkriIutHmSCajzP";
#endif
/* these defines enumerate the "strchr"s of the commands in command_chars */
#define CMD_redraw 0
@@ -225,8 +225,9 @@ char *argv[];
#define CMD_showargs 20
#define CMD_jidtog 21
#define CMD_kidletog 22
+#define CMD_pcputog 23
#ifdef ORDER
-#define CMD_order 23
+#define CMD_order 24
#endif
/* set the buffer for stdout */
@@ -411,7 +412,7 @@ char *argv[];
break;
case 'P':
- pcpu_stats = Yes;
+ pcpu_stats = !pcpu_stats;
break;
case 'z':
@@ -1019,7 +1020,7 @@ restart:
case CMD_thrtog:
ps.thread = !ps.thread;
new_message(MT_standout | MT_delayed,
- "Displaying threads %s",
+ " Displaying threads %s",
ps.thread ? "separately" : "as a count");
header_text = format_header(uname_field);
reset_display();
@@ -1028,7 +1029,7 @@ restart:
case CMD_wcputog:
ps.wcpu = !ps.wcpu;
new_message(MT_standout | MT_delayed,
- "Displaying %sCPU",
+ " Displaying %sCPU",
ps.wcpu ? "W" : "");
header_text = format_header(uname_field);
reset_display();
@@ -1088,6 +1089,16 @@ restart:
ps.kidle ? "D" : "Not d");
putchar('\r');
break;
+ case CMD_pcputog:
+ pcpu_stats = !pcpu_stats;
+ new_message(MT_standout | MT_delayed,
+ " Displaying %sCPU statistics.",
+ pcpu_stats ? "per-" : "global ");
+ toggle_pcpustats(&statics);
+ max_topn = display_updatecpus(&statics);
+ reset_display();
+ putchar('\r');
+ break;
default:
new_message(MT_standout, " BAD CASE IN SWITCH!");
putchar('\r');
diff --git a/contrib/top/top.h b/contrib/top/top.h
index c51485a..a281957 100644
--- a/contrib/top/top.h
+++ b/contrib/top/top.h
@@ -14,7 +14,7 @@
extern int Header_lines; /* 7 */
/* Maximum number of columns allowed for display */
-#define MAX_COLS 512
+#define MAX_COLS 128
/* Log base 2 of 1024 is 10 (2^10 == 1024) */
#define LOG1024 10
diff --git a/contrib/traceroute/traceroute.c b/contrib/traceroute/traceroute.c
index 2a5fea2..1c98262 100644
--- a/contrib/traceroute/traceroute.c
+++ b/contrib/traceroute/traceroute.c
@@ -1618,7 +1618,7 @@ gethostinfo(register char *hostname)
register char **p;
register u_int32_t addr, *ap;
- if (strlen(hostname) > 64) {
+ if (strlen(hostname) >= MAXHOSTNAMELEN) {
Fprintf(stderr, "%s: hostname \"%.32s...\" is too long\n",
prog, hostname);
exit(1);
diff --git a/contrib/tzdata/antarctica b/contrib/tzdata/antarctica
index 629b2d7..d19fbde 100644
--- a/contrib/tzdata/antarctica
+++ b/contrib/tzdata/antarctica
@@ -1,5 +1,5 @@
# <pre>
-# @(#)antarctica 8.8
+# @(#)antarctica 8.9
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
@@ -19,18 +19,6 @@
# I made up all time zone abbreviations mentioned here; corrections welcome!
# FORMAT is `zzz' and GMTOFF is 0 for locations while uninhabited.
-# These rules are stolen from the `europe' file.
-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule RussAQ 1981 1984 - Apr 1 0:00 1:00 S
-Rule RussAQ 1981 1983 - Oct 1 0:00 0 -
-Rule RussAQ 1984 1991 - Sep lastSun 2:00s 0 -
-Rule RussAQ 1985 1991 - Mar lastSun 2:00s 1:00 S
-Rule RussAQ 1992 only - Mar lastSat 23:00 1:00 S
-Rule RussAQ 1992 only - Sep lastSat 23:00 0 -
-Rule RussAQ 1993 max - Mar lastSun 2:00s 1:00 S
-Rule RussAQ 1993 1995 - Sep lastSun 2:00s 0 -
-Rule RussAQ 1996 max - Oct lastSun 2:00s 0 -
-
# These rules are stolen from the `southamerica' file.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule ArgAQ 1964 1966 - Mar 1 0:00 0 -
diff --git a/contrib/tzdata/asia b/contrib/tzdata/asia
index d415ba8..1fc61f0 100644
--- a/contrib/tzdata/asia
+++ b/contrib/tzdata/asia
@@ -1,4 +1,4 @@
-# @(#)asia 8.64
+# @(#)asia 8.65
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
@@ -77,6 +77,10 @@ Rule RussiaAsia 1993 max - Mar lastSun 2:00s 1:00 S
Rule RussiaAsia 1993 1995 - Sep lastSun 2:00s 0 -
Rule RussiaAsia 1996 max - Oct lastSun 2:00s 0 -
+# From Arthur David Olson (2011-06-15):
+# While Russia abandoned DST in 2011, Armenia may choose to
+# follow Russia's "old" rules.
+
# Afghanistan
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Kabul 4:36:48 - LMT 1890
diff --git a/contrib/tzdata/europe b/contrib/tzdata/europe
index f7fc189..aab6833 100644
--- a/contrib/tzdata/europe
+++ b/contrib/tzdata/europe
@@ -1,5 +1,5 @@
# <pre>
-# @(#)europe 8.32
+# @(#)europe 8.33
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
@@ -565,6 +565,26 @@ Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S
Rule Russia 1993 1995 - Sep lastSun 2:00s 0 -
Rule Russia 1996 max - Oct lastSun 2:00s 0 -
+# From Alexander Krivenyshev (2011-06-14):
+# According to Kremlin press service, Russian President Dmitry Medvedev
+# signed a federal law "On calculation of time" on June 9, 2011.
+# According to the law Russia is abolishing daylight saving time.
+#
+# Medvedev signed a law "On the Calculation of Time" (in russian):
+# <a href="http://bmockbe.ru/events/?ID=7583">
+# http://bmockbe.ru/events/?ID=7583
+# </a>
+#
+# Medvedev signed a law on the calculation of the time (in russian):
+# <a href="http://www.regnum.ru/news/polit/1413906.html">
+# http://www.regnum.ru/news/polit/1413906.html
+# </a>
+
+# From Arthur David Olson (2011-06-15):
+# Take "abolishing daylight saving time" to mean that time is now considered
+# to be standard.
+# At least for now, keep the "old" Russia rules for the benefit of Belarus.
+
# These are for backward compatibility with older versions.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -2013,7 +2033,8 @@ Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr
1:00 C-Eur CE%sT 1945
2:00 Poland CE%sT 1946
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
- 2:00 Russia EE%sT
+ 2:00 Russia EE%sT 2011 Mar 27 2:00s
+ 3:00 - EET
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Respublika Adygeya, Arkhangel'skaya oblast',
@@ -2042,7 +2063,8 @@ Zone Europe/Moscow 2:30:20 - LMT 1880
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
- 3:00 Russia MSK/MSD
+ 3:00 Russia MSK/MSD 2011 Mar 27 2:00s
+ 4:00 - MSK
#
# Astrakhanskaya oblast', Kirovskaya oblast', Saratovskaya oblast',
# Volgogradskaya oblast'. Shanks & Pottenger say Kirov is still at +0400
@@ -2055,7 +2077,8 @@ Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T
3:00 Russia VOL%sT 1991 Mar 31 2:00s
4:00 - VOLT 1992 Mar 29 2:00s
- 3:00 Russia VOL%sT
+ 3:00 Russia VOL%sT 2011 Mar 27 2:00s
+ 4:00 - VOLT
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Samarskaya oblast', Udmyrtskaya respublika
@@ -2067,7 +2090,8 @@ Zone Europe/Samara 3:20:36 - LMT 1919 Jul 1 2:00
2:00 Russia KUY%sT 1991 Sep 29 2:00s
3:00 - KUYT 1991 Oct 20 3:00
4:00 Russia SAM%sT 2010 Mar 28 2:00s # Samara Time
- 3:00 Russia SAM%sT
+ 3:00 Russia SAM%sT 2011 Mar 27 2:00s
+ 4:00 - SAMT
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
@@ -2080,7 +2104,8 @@ Zone Asia/Yekaterinburg 4:02:24 - LMT 1919 Jul 15 4:00
4:00 - SVET 1930 Jun 21 # Sverdlovsk Time
5:00 Russia SVE%sT 1991 Mar 31 2:00s
4:00 Russia SVE%sT 1992 Jan 19 2:00s
- 5:00 Russia YEK%sT # Yekaterinburg Time
+ 5:00 Russia YEK%sT 2011 Mar 27 2:00s
+ 6:00 - YEKT # Yekaterinburg Time
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Respublika Altaj, Altajskij kraj, Omskaya oblast'.
@@ -2088,7 +2113,8 @@ Zone Asia/Omsk 4:53:36 - LMT 1919 Nov 14
5:00 - OMST 1930 Jun 21 # Omsk TIme
6:00 Russia OMS%sT 1991 Mar 31 2:00s
5:00 Russia OMS%sT 1992 Jan 19 2:00s
- 6:00 Russia OMS%sT
+ 6:00 Russia OMS%sT 2011 Mar 27 2:00s
+ 7:00 - OMST
#
# From Paul Eggert (2006-08-19): I'm guessing about Tomsk here; it's
# not clear when it switched from +7 to +6.
@@ -2098,7 +2124,8 @@ Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
7:00 Russia NOV%sT 1991 Mar 31 2:00s
6:00 Russia NOV%sT 1992 Jan 19 2:00s
7:00 Russia NOV%sT 1993 May 23 # say Shanks & P.
- 6:00 Russia NOV%sT
+ 6:00 Russia NOV%sT 2011 Mar 27 2:00s
+ 7:00 - NOVT
# From Alexander Krivenyshev (2009-10-13):
# Kemerovo oblast' (Kemerovo region) in Russia will change current time zone on
@@ -2131,7 +2158,8 @@ Zone Asia/Novokuznetsk 5:48:48 - NMT 1920 Jan 6
7:00 Russia KRA%sT 1991 Mar 31 2:00s
6:00 Russia KRA%sT 1992 Jan 19 2:00s
7:00 Russia KRA%sT 2010 Mar 28 2:00s
- 6:00 Russia NOV%sT # Novosibirsk/Novokuznetsk Time
+ 6:00 Russia NOV%sT 2011 Mar 27 2:00s
+ 7:00 - NOVT # Novosibirsk/Novokuznetsk Time
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
@@ -2142,7 +2170,8 @@ Zone Asia/Krasnoyarsk 6:11:20 - LMT 1920 Jan 6
6:00 - KRAT 1930 Jun 21 # Krasnoyarsk Time
7:00 Russia KRA%sT 1991 Mar 31 2:00s
6:00 Russia KRA%sT 1992 Jan 19 2:00s
- 7:00 Russia KRA%sT
+ 7:00 Russia KRA%sT 2011 Mar 27 2:00s
+ 8:00 - KRAT
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Respublika Buryatiya, Irkutskaya oblast',
@@ -2152,7 +2181,8 @@ Zone Asia/Irkutsk 6:57:20 - LMT 1880
7:00 - IRKT 1930 Jun 21 # Irkutsk Time
8:00 Russia IRK%sT 1991 Mar 31 2:00s
7:00 Russia IRK%sT 1992 Jan 19 2:00s
- 8:00 Russia IRK%sT
+ 8:00 Russia IRK%sT 2011 Mar 27 2:00s
+ 9:00 - IRKT
#
# From Oscar van Vlijmen (2003-10-18): [This region consists of]
# Aginskij Buryatskij avtonomnyj okrug, Amurskaya oblast',
@@ -2175,7 +2205,8 @@ Zone Asia/Yakutsk 8:38:40 - LMT 1919 Dec 15
8:00 - YAKT 1930 Jun 21 # Yakutsk Time
9:00 Russia YAK%sT 1991 Mar 31 2:00s
8:00 Russia YAK%sT 1992 Jan 19 2:00s
- 9:00 Russia YAK%sT
+ 9:00 Russia YAK%sT 2011 Mar 27 2:00s
+ 10:00 - YAKT
#
# From Oscar van Vlijmen (2003-10-18): [This region consists of]
# Evrejskaya avtonomnaya oblast', Khabarovskij kraj, Primorskij kraj,
@@ -2188,7 +2219,8 @@ Zone Asia/Vladivostok 8:47:44 - LMT 1922 Nov 15
9:00 - VLAT 1930 Jun 21 # Vladivostok Time
10:00 Russia VLA%sT 1991 Mar 31 2:00s
9:00 Russia VLA%sST 1992 Jan 19 2:00s
- 10:00 Russia VLA%sT
+ 10:00 Russia VLA%sT 2011 Mar 27 2:00s
+ 11:00 - VLAT
#
# Sakhalinskaya oblast'.
# The Zone name should be Yuzhno-Sakhalinsk, but that's too long.
@@ -2198,7 +2230,8 @@ Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
11:00 Russia SAK%sT 1991 Mar 31 2:00s # Sakhalin T.
10:00 Russia SAK%sT 1992 Jan 19 2:00s
11:00 Russia SAK%sT 1997 Mar lastSun 2:00s
- 10:00 Russia SAK%sT
+ 10:00 Russia SAK%sT 2011 Mar 27 2:00s
+ 11:00 - SAKT
#
# From Oscar van Vlijmen (2003-10-18): [This region consists of]
# Magadanskaya oblast', Respublika Sakha (Yakutiya).
@@ -2211,7 +2244,8 @@ Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
10:00 - MAGT 1930 Jun 21 # Magadan Time
11:00 Russia MAG%sT 1991 Mar 31 2:00s
10:00 Russia MAG%sT 1992 Jan 19 2:00s
- 11:00 Russia MAG%sT
+ 11:00 Russia MAG%sT 2011 Mar 27 2:00s
+ 12:00 - MAGT
#
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Kamchatskaya oblast', Koryakskij avtonomnyj okrug.
@@ -2222,7 +2256,8 @@ Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
12:00 Russia PET%sT 1991 Mar 31 2:00s
11:00 Russia PET%sT 1992 Jan 19 2:00s
12:00 Russia PET%sT 2010 Mar 28 2:00s
- 11:00 Russia PET%sT
+ 11:00 Russia PET%sT 2011 Mar 27 2:00s
+ 12:00 - PETT
#
# Chukotskij avtonomnyj okrug
Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
@@ -2231,7 +2266,8 @@ Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
12:00 Russia ANA%sT 1991 Mar 31 2:00s
11:00 Russia ANA%sT 1992 Jan 19 2:00s
12:00 Russia ANA%sT 2010 Mar 28 2:00s
- 11:00 Russia ANA%sT
+ 11:00 Russia ANA%sT 2011 Mar 27 2:00s
+ 12:00 - ANAT
# Serbia
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
diff --git a/contrib/tzdata/southamerica b/contrib/tzdata/southamerica
index 919dc25..90f531d 100644
--- a/contrib/tzdata/southamerica
+++ b/contrib/tzdata/southamerica
@@ -1,5 +1,5 @@
# <pre>
-# @(#)southamerica 8.49
+# @(#)southamerica 8.50
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
@@ -1276,6 +1276,14 @@ Zone America/Curacao -4:35:44 - LMT 1912 Feb 12 # Willemstad
-4:30 - ANT 1965 # Netherlands Antilles Time
-4:00 - AST
+# From Arthur David Olson (2011-06-15):
+# At least for now, use links for places with new iso3166 codes.
+# The name "Lower Prince's Quarter" is both longer than fourteen charaters
+# and contains an apostrophe; use "Lower_Princes" below.
+
+Link America/Curacao America/Lower_Princes # Sint Maarten
+Link America/Curacao America/Kralendijk # Bonaire, Sint Estatius and Saba
+
# Ecuador
#
# From Paul Eggert (2007-03-04):
diff --git a/contrib/tzdata/zone.tab b/contrib/tzdata/zone.tab
index f4afae6..2517764 100644
--- a/contrib/tzdata/zone.tab
+++ b/contrib/tzdata/zone.tab
@@ -1,5 +1,5 @@
# <pre>
-# @(#)zone.tab 8.43
+# @(#)zone.tab 8.45
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
#
@@ -32,7 +32,6 @@ AG +1703-06148 America/Antigua
AI +1812-06304 America/Anguilla
AL +4120+01950 Europe/Tirane
AM +4011+04430 Asia/Yerevan
-AN +1211-06900 America/Curacao
AO -0848+01314 Africa/Luanda
AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island
AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole
@@ -87,6 +86,7 @@ BL +1753-06251 America/St_Barthelemy
BM +3217-06446 Atlantic/Bermuda
BN +0456+11455 Asia/Brunei
BO -1630-06809 America/La_Paz
+BQ +120903-0681636 America/Kralendijk
BR -0351-03225 America/Noronha Atlantic islands
BR -0127-04829 America/Belem Amapa, E Para
BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB)
@@ -155,6 +155,7 @@ CO +0436-07405 America/Bogota
CR +0956-08405 America/Costa_Rica
CU +2308-08222 America/Havana
CV +1455-02331 Atlantic/Cape_Verde
+CW +1211-06900 America/Curacao
CX -1025+10543 Indian/Christmas
CY +3510+03322 Asia/Nicosia
CZ +5005+01426 Europe/Prague
@@ -362,6 +363,7 @@ SO +0204+04522 Africa/Mogadishu
SR +0550-05510 America/Paramaribo
ST +0020+00644 Africa/Sao_Tome
SV +1342-08912 America/El_Salvador
+SX +180305-0630250 America/Lower_Princes
SY +3330+03618 Asia/Damascus
SZ -2618+03106 Africa/Mbabane
TC +2128-07108 America/Grand_Turk
diff --git a/contrib/xz/ChangeLog b/contrib/xz/ChangeLog
index 7d5406c..0746422 100644
--- a/contrib/xz/ChangeLog
+++ b/contrib/xz/ChangeLog
@@ -1,3 +1,328 @@
+commit edf339227a966f24aebe1845fcca9429b8f6e318
+Author: Anders F Bjorklund <afb@users.sourceforge.net>
+Date: Fri Nov 5 12:56:11 2010 +0100
+
+ add build script for macosx universal
+
+commit 7fcc6334ea8923550ba6b5347ff99dc8432234b0
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Jun 16 12:15:29 2011 +0300
+
+ liblzma: Remove unneeded semicolon.
+
+commit 631f4d3ae6adfda84d1a110781d9402c12e16cfc
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 28 16:43:26 2011 +0300
+
+ Don't call close(-1) in tuklib_open_stdxxx() on error.
+
+ Thanks to Jim Meyering.
+
+commit c89faf4c9e5970e7f7f8a25521ed9aa62d1a2d9a
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 28 09:47:56 2011 +0300
+
+ Translations: Update Italian translation.
+
+ Thanks to Milo Casagrande.
+
+commit 6fe2fc9b6ab5bf6848140823e9536370834f42fb
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 28 08:46:04 2011 +0300
+
+ Tests: Add a test file for the bug in the previous commit.
+
+commit 6c4d4db2bc8d8b682bd927144d37daa2ab21a6d6
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri May 27 22:25:44 2011 +0300
+
+ xz: Fix error handling in xz -lvv.
+
+ It could do an invalid free() and read past the end
+ of the uninitialized filters array.
+
+commit 844f84fcad9670c543550edf7c7e42630c8f7715
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri May 27 22:09:49 2011 +0300
+
+ liblzma: Handle allocation failures correctly in lzma_index_init().
+
+ Thanks to Jim Meyering.
+
+commit 240e8b9791df597063a3b68d04ffcb3aa4f2de6a
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon May 23 18:30:30 2011 +0300
+
+ Build: Set GZIP_ENV=-9n in top-level Makefile.am.
+
+commit e32cb264ea72a4459810f30abad70dae5a4fa17d
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 16:59:22 2011 +0300
+
+ Bump version and soname for 5.0.3.
+
+commit 65cff45f8fd1c250491557157cce0f5f38481082
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 16:56:53 2011 +0300
+
+ Update NEWS for 5.0.3.
+
+commit 316c67ffdae1f811ac95e838d5290a013bff4ca7
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 16:28:44 2011 +0300
+
+ Add French translation.
+
+ It is known that the BCJ filter --help text is only
+ partially translated.
+
+commit 1931175eea6d09c0845d6e8e334a7333647f11c0
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat May 21 15:12:10 2011 +0300
+
+ xz: Translate also the string used to print the program name.
+
+ French needs a space before a colon, e.g. "xz : foo error".
+
+commit 841dc1f891b48b23f84c0f0e0c86c7c4e4bdcdf5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 12:26:28 2011 +0300
+
+ Update THANKS.
+
+commit 0f7e2d36240ebf1159d5fb85d8cd7422337a0d3f
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 12:21:33 2011 +0300
+
+ Update INSTALL with a note about linker problem on OpenSolaris x86.
+
+commit 793d857e01e1725f16fc0c8af8172c91a9e38617
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 12:01:37 2011 +0300
+
+ Build: Fix initialization of enable_check_* variables in configure.ac.
+
+ This doesn't matter much in practice since it is unlikely
+ that anyone would have such environment variable names.
+
+ Thanks to Wim Lewis.
+
+commit afcff45cee04c5c7d9c333504046ffb63d1418b5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue May 17 11:54:38 2011 +0300
+
+ Add underscores to attributes (__attribute((__foo__))).
+
+commit 22159c6ba2300a006f2e46ce85ae132e2d2f7d57
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 18 19:35:49 2011 +0300
+
+ Update THANKS.
+
+commit 5e3499059515033d1ce44b6fb0fa49183c7ac633
+Author: Martin Väth <vaeth@mathematik.uni-wuerzburg.de>
+Date: Fri Apr 15 04:54:49 2011 -0400
+
+ xzgrep: fix typo in $0 parsing
+
+ Reported-by: Diego Elio Pettenò <flameeyes@gentoo.org>
+ Signed-off-by: Martin Väth <vaeth@mathematik.uni-wuerzburg.de>
+ Signed-off-by: Mike Frysinger <vapier@gentoo.org>
+
+commit 1125611b9b8d4a209b6a73d2c76e1b39c065972a
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Tue Apr 12 11:59:49 2011 +0300
+
+ Remove doubled words from documentation and comments.
+
+ Spot candidates by running these commands:
+ git ls-files |xargs perl -0777 -n \
+ -e 'while (/\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims)' \
+ -e '{$n=($` =~ tr/\n/\n/ + 1); ($v=$&)=~s/\n/\\n/g; print "$ARGV:$n:$v\n"}'
+
+ Thanks to Jim Meyering for the original patch.
+
+commit 3f8fa53837bae8b44f3addf19923e26401336c3d
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 21:04:13 2011 +0300
+
+ liblzma: Document lzma_easy_(enc|dec)oder_memusage() better too.
+
+commit 320d734c20d0776e3eb80f6b5984ddeb494715b5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 20:59:07 2011 +0300
+
+ liblzma: Document lzma_raw_(enc|dec)oder_memusage() better.
+
+ It didn't mention the return value that is used if
+ an error occurs.
+
+commit 2ee4edeffc8d9734bf68230df31b20ac6a94c9b5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 13:59:50 2011 +0300
+
+ liblzma: Don't create an empty Block in lzma_stream_buffer_encode().
+
+ Empty Block was created if the input buffer was empty.
+ Empty Block wastes a few bytes of space, but more importantly
+ it triggers a bug in XZ Utils 5.0.1 and older when trying
+ to decompress such a file. 5.0.1 and older consider such
+ files to be corrupt. I thought that no encoder creates empty
+ Blocks when releasing 5.0.2 but I was wrong.
+
+commit 73f56fb87d54091d0c4fd22d70e6f042902e3b63
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 13:28:40 2011 +0300
+
+ liblzma: Fix API docs to mention LZMA_UNSUPPORTED_CHECK.
+
+ This return value was missing from the API comments of
+ four functions.
+
+commit 4ce1cf97a88ae1640a380dd19cbc255d729f966b
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Mon Apr 11 13:21:28 2011 +0300
+
+ liblzma: Validate encoder arguments better.
+
+ The biggest problem was that the integrity check type
+ wasn't validated, and e.g. lzma_easy_buffer_encode()
+ would create a corrupt .xz Stream if given an unsupported
+ Check ID. Luckily applications don't usually try to use
+ an unsupport Check ID, so this bug is unlikely to cause
+ many real-world problems.
+
+commit 972f05d7a4268dbe42573701f83faa45d03249eb
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat Apr 9 18:29:30 2011 +0300
+
+ Update THANKS.
+
+commit 28154eeaf6e3442cd1e174f4e81266d60c4dac60
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat Apr 9 18:28:58 2011 +0300
+
+ liblzma: Add missing #ifdefs to filter_common.c.
+
+ Passing --disable-decoders to configure broke a few
+ encoders due to missing #ifdefs in filter_common.c.
+
+ Thanks to Jason Gorski for the patch.
+
+commit aa95516d3d509c6b7895ee519004afcf500a0759
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Sat Apr 2 14:49:56 2011 +0300
+
+ liblzma: Fix a memory leak in stream_encoder.c.
+
+ It leaks old filter options structures (hundred bytes or so)
+ every time the lzma_stream is reinitialized. With the xz tool,
+ this happens when compressing multiple files.
+
+commit 58f52c72f49562a08042da9a2f4bbdf4dd162d0c
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Apr 1 08:47:46 2011 +0300
+
+ Bumped version and liblzma soname to 5.0.2.
+
+commit 162779682e01d15f0ce386ef7f40d1be05ad0053
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Apr 1 08:47:20 2011 +0300
+
+ Updated NEWS for 5.0.2.
+
+commit 45553f9b4b0175c292023010dc41520347004852
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 31 15:06:58 2011 +0300
+
+ Update INSTALL with another note about IRIX.
+
+commit af9d48d5515eadef689b1ce9ffb91e4dbcbc7f35
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 31 12:22:55 2011 +0300
+
+ Tests: Add a new file to test empty LZMA2 streams.
+
+commit d099ef9f517b59ab8e3b6f6aa0543c3643983470
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 31 11:54:48 2011 +0300
+
+ liblzma: Fix decoding of LZMA2 streams having no uncompressed data.
+
+ The decoder considered empty LZMA2 streams to be corrupt.
+ This shouldn't matter much with .xz files, because no encoder
+ creates empty LZMA2 streams in .xz. This bug is more likely
+ to cause problems in applications that use raw LZMA2 streams.
+
+commit df87249b26e79a75fd91041e85512944fc247b57
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 24 01:42:49 2011 +0200
+
+ Scripts: Better fix for xzgrep.
+
+ Now it uses "grep -q".
+
+ Thanks to Gregory Margo.
+
+commit 68c453e1c7b09dc9c7d2ef9d994c46f5b367f5d3
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 24 01:22:18 2011 +0200
+
+ Updated THANKS.
+
+commit b441d39855516ae618faffd5156261b8b413394f
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Thu Mar 24 01:21:32 2011 +0200
+
+ Scripts: Fix xzgrep -l.
+
+ It didn't work at all. It tried to use the -q option
+ for grep, but it appended it after "--". This works
+ around it by redirecting to /dev/null. The downside
+ is that this can be slower with big files compared
+ to proper use of "grep -q".
+
+ Thanks to Gregory Margo.
+
+commit 82d5164839517f55daeadd9ee88c76425db30224
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Feb 4 22:49:31 2011 +0200
+
+ xz: Clean up suffix.c.
+
+ struct suffix_pair isn't needed in compresed_name()
+ so get rid of it there.
+
+commit 6decc8b41882c2250f0450eb87b83c9fbf495e95
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Fri Feb 4 11:29:47 2011 +0200
+
+ xz: Check if the file already has custom suffix when compressing.
+
+ Now "xz -S .test foo.test" refuses to compress the
+ file because it already has the suffix .test. The man
+ page had it documented this way already.
+
+commit ecda90061df8d39399e707e5c76c2ec0a0f400e5
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Wed Feb 2 23:01:51 2011 +0200
+
+ Updated THANKS.
+
+commit 0fda1ae5b1aa0a5c629a09e5228db8ba1cd0dd5f
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Wed Feb 2 23:00:33 2011 +0200
+
+ Translations: Add Polish translation.
+
+ Thanks to Jakub Bogusz.
+
+commit 00be32978fedc5038748438bf685ac1713d1db83
+Author: Lasse Collin <lasse.collin@tukaani.org>
+Date: Wed Feb 2 22:24:00 2011 +0200
+
+ Updated THANKS.
+
commit 7232fcf96bf4bd5f9cd4fc6c93ca2912c665e004
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Fri Jan 28 20:26:38 2011 +0200
diff --git a/contrib/xz/FREEBSD-Xlist b/contrib/xz/FREEBSD-Xlist
index c9c6bdb..b25db96 100644
--- a/contrib/xz/FREEBSD-Xlist
+++ b/contrib/xz/FREEBSD-Xlist
@@ -28,6 +28,7 @@ dos/
extra/
lib/
m4/
+macosx/
makefile.am
src/*/*.rc
src/liblzma/liblzma.pc.in
diff --git a/contrib/xz/FREEBSD-upgrade b/contrib/xz/FREEBSD-upgrade
index 0cc214c..8d48be2 100644
--- a/contrib/xz/FREEBSD-upgrade
+++ b/contrib/xz/FREEBSD-upgrade
@@ -4,7 +4,7 @@ xz
The source code is pulled with git:
- git clone http://git.tukaani.org/xz.git xz
+ git clone --branch=v5.0 http://git.tukaani.org/xz.git xz
ChangeLog is generated with:
@@ -25,4 +25,4 @@ To make local changes to xz, simply patch and commit to the trunk
branch (aka HEAD). Never make local changes on the vendor branch.
mm@FreeBSD.org
-10-May-2010
+11-July-2011
diff --git a/contrib/xz/THANKS b/contrib/xz/THANKS
index a9a2208..70303e0 100644
--- a/contrib/xz/THANKS
+++ b/contrib/xz/THANKS
@@ -10,6 +10,9 @@ has been important. :-) In alphabetical order:
- Karl Berry
- Anders F. Björklund
- Emmanuel Blot
+ - Martin Blumenstingl
+ - Jakub Bogusz
+ - Maarten Bosmans
- Trent W. Buck
- David Burklund
- Daniel Mealha Cabrita
@@ -22,6 +25,7 @@ has been important. :-) In alphabetical order:
- Gilles Espinasse
- Denis Excoffier
- Mike Frysinger
+ - Jason Gorski
- Juan Manuel Guerrero
- Joachim Henke
- Peter Ivanov
@@ -34,7 +38,9 @@ has been important. :-) In alphabetical order:
- Peter Lawler
- Hin-Tak Leung
- Andraž 'ruskie' Levstik
+ - Wim Lewis
- Lorenzo De Liso
+ - Gregory Margo
- Jim Meyering
- Rafał Mużyło
- Adrien Nader
@@ -43,6 +49,7 @@ has been important. :-) In alphabetical order:
- Andre Noll
- Peter O'Gorman
- Igor Pavlov
+ - Diego Elio Pettenò
- Elbert Pol
- Mikko Pouru
- Robert Readman
@@ -55,10 +62,12 @@ has been important. :-) In alphabetical order:
- Dan Shechter
- Stuart Shelton
- Jonathan Stott
+ - Dan Stromberg
- Paul Townsend
- Mohammed Adnène Trojette
- Alexey Tourbin
- Patrick J. Volkerding
+ - Martin Väth
- Christian Weisgerber
- Bert Wesarg
- Ralf Wildenhues
diff --git a/contrib/xz/po/LINGUAS b/contrib/xz/po/LINGUAS
index 7bd249c..6babcab 100644
--- a/contrib/xz/po/LINGUAS
+++ b/contrib/xz/po/LINGUAS
@@ -1,3 +1,5 @@
cs
de
+fr
it
+pl
diff --git a/contrib/xz/po/fr.po b/contrib/xz/po/fr.po
new file mode 100644
index 0000000..2d95411
--- /dev/null
+++ b/contrib/xz/po/fr.po
@@ -0,0 +1,864 @@
+# XZ Utils French Translation
+# This file is put in the public domain.
+# Adrien Nader <camaradetux@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xz-utils\n"
+"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
+"POT-Creation-Date: 2011-05-21 14:35+0200\n"
+"PO-Revision-Date: 2010-09-24 21;12+0200\n"
+"Last-Translator: Adrien Nader <camaradetux@gmail.com>\n"
+"Language-Team: None\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n"
+
+#: src/xz/args.c:338
+#, c-format
+msgid "%s: Unknown file format type"
+msgstr "%s : Format de fichier inconnu"
+
+#: src/xz/args.c:361 src/xz/args.c:369
+#, c-format
+msgid "%s: Unsupported integrity check type"
+msgstr "%s : Type de vérification d'intégrité inconnu"
+
+#: src/xz/args.c:396
+msgid "Only one file can be specified with `--files' or `--files0'."
+msgstr "Un seul fichier peut être spécifié avec `--files' ou `--files0'."
+
+#: src/xz/args.c:459
+#, c-format
+msgid "The environment variable %s contains too many arguments"
+msgstr "La variable d'environnement %s contient trop d'arguments"
+
+#: src/xz/coder.c:105
+msgid "Maximum number of filters is four"
+msgstr "Le nombre maximal de filtres est quatre"
+
+#: src/xz/coder.c:118
+msgid "Memory usage limit is too low for the given filter setup."
+msgstr "La limite d'utilisation mémoire est trop basse pour la configuration de filtres donnée."
+
+#: src/xz/coder.c:148
+msgid "Using a preset in raw mode is discouraged."
+msgstr "Utiliser un préréglage en mode `raw' est déconseillé."
+
+#: src/xz/coder.c:150
+msgid "The exact options of the presets may vary between software versions."
+msgstr "Le détail des préréglages peut varier entre différentes versions du logiciel."
+
+#: src/xz/coder.c:176
+msgid "The .lzma format supports only the LZMA1 filter"
+msgstr "Le format .lzma ne prend en charge que le filtre LZMA1"
+
+#: src/xz/coder.c:184
+msgid "LZMA1 cannot be used with the .xz format"
+msgstr "Le filtre LZMA1 ne peut être utilisé avec le format .xz"
+
+#: src/xz/coder.c:203
+#, c-format
+msgid "Using up to %<PRIu32> threads."
+msgstr "Jusqu'à %<PRIu32> threads seront utilisés."
+
+#: src/xz/coder.c:216
+msgid "Unsupported filter chain or filter options"
+msgstr "Enchaînement ou options de filtres non pris en charge"
+
+#: src/xz/coder.c:224
+#, c-format
+msgid "Decompression will need %s MiB of memory."
+msgstr "La décompression nécessitera %s MiB de mémoire."
+
+#: src/xz/coder.c:259
+#, c-format
+msgid "Adjusted the number of threads from %s to %s to not exceed the memory usage limit of %s MiB"
+msgstr "Nombre de threads réduit de %s à %s pour ne pas dépasser la limite d'utilisation mémoire de %s MiB"
+
+#: src/xz/coder.c:313
+#, c-format
+msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
+msgstr "Taille du dictionnaire LZMA%c réduite de %s MiB à %s MiB pour ne pas dépasser la limite d'utilisation mémoire de %s MiB"
+
+#. TRANSLATORS: When compression or decompression finishes,
+#. and xz is going to remove the source file, xz first checks
+#. if the source file still exists, and if it does, does its
+#. device and inode numbers match what xz saw when it opened
+#. the source file. If these checks fail, this message is
+#. shown, %s being the filename, and the file is not deleted.
+#. The check for device and inode numbers is there, because
+#. it is possible that the user has put a new file in place
+#. of the original file, and in that case it obviously
+#. shouldn't be removed.
+#: src/xz/file_io.c:136
+#, c-format
+msgid "%s: File seems to have been moved, not removing"
+msgstr "%s : Le fichier a apparemment été déplacé, suppression annulée"
+
+#: src/xz/file_io.c:143 src/xz/file_io.c:635
+#, c-format
+msgid "%s: Cannot remove: %s"
+msgstr "%s : Impossible de supprimer : %s"
+
+#: src/xz/file_io.c:168
+#, c-format
+msgid "%s: Cannot set the file owner: %s"
+msgstr "%s : Impossible de modifier le propriétaire du fichier : %s"
+
+#: src/xz/file_io.c:174
+#, c-format
+msgid "%s: Cannot set the file group: %s"
+msgstr "%s : Impossible de modifier le groupe propriétaire du fichier : %s"
+
+#: src/xz/file_io.c:193
+#, c-format
+msgid "%s: Cannot set the file permissions: %s"
+msgstr "%s : Impossible de modifier les permissions du fichier : %s"
+
+#: src/xz/file_io.c:340 src/xz/file_io.c:423
+#, c-format
+msgid "%s: Is a symbolic link, skipping"
+msgstr "%s est un lien symbolique : ignoré"
+
+#: src/xz/file_io.c:468
+#, c-format
+msgid "%s: Is a directory, skipping"
+msgstr "%s est un répertoire : ignoré"
+
+#: src/xz/file_io.c:474
+#, c-format
+msgid "%s: Not a regular file, skipping"
+msgstr "%s n'est pas un fichier régulier : ignoré"
+
+#: src/xz/file_io.c:491
+#, c-format
+msgid "%s: File has setuid or setgid bit set, skipping"
+msgstr "%s : Le fichier possède les bits `setuid' ou `setgid' : ignoré"
+
+#: src/xz/file_io.c:498
+#, c-format
+msgid "%s: File has sticky bit set, skipping"
+msgstr "%s : Le fichier possède le bit `sticky' : ignoré"
+
+#: src/xz/file_io.c:505
+#, c-format
+msgid "%s: Input file has more than one hard link, skipping"
+msgstr "%s : Le fichier d'entrée a plus d'un lien matériel : ignoré"
+
+#: src/xz/file_io.c:761
+#, c-format
+msgid "Error restoring the O_APPEND flag to standard output: %s"
+msgstr "Impossible de rétablir le drapeau O_APPEND sur la sortie standard : %s"
+
+#: src/xz/file_io.c:773
+#, c-format
+msgid "%s: Closing the file failed: %s"
+msgstr "%s : Impossible de fermer le fichier : %s"
+
+#: src/xz/file_io.c:809 src/xz/file_io.c:1008
+#, c-format
+msgid "%s: Seeking failed when trying to create a sparse file: %s"
+msgstr "%s : Impossible de se déplacer dans le fichier pour créer un 'sparse file' : %s"
+
+#: src/xz/file_io.c:883
+#, c-format
+msgid "%s: Read error: %s"
+msgstr "%s : Erreur d'écriture : %s"
+
+#: src/xz/file_io.c:906
+#, c-format
+msgid "%s: Error seeking the file: %s"
+msgstr "%s : Impossible de se déplacer dans le fichier : %s"
+
+#: src/xz/file_io.c:916
+#, c-format
+msgid "%s: Unexpected end of file"
+msgstr "%s : Fin de fichier inattendue"
+
+#: src/xz/file_io.c:966
+#, c-format
+msgid "%s: Write error: %s"
+msgstr "%s : Erreur d'écriture : %s"
+
+#: src/xz/hardware.c:101
+msgid "Disabled"
+msgstr "Désactivé"
+
+#. TRANSLATORS: Test with "xz --info-memory" to see if
+#. the alignment looks nice.
+#: src/xz/hardware.c:120
+msgid "Total amount of physical memory (RAM): "
+msgstr "Quantité totale de mémoire physique (RAM) : "
+
+#: src/xz/hardware.c:122
+msgid "Memory usage limit for compression: "
+msgstr "Limite d'utilisation pour la compression : "
+
+#: src/xz/hardware.c:124
+msgid "Memory usage limit for decompression: "
+msgstr "Limite d'utilisation pour la décompression : "
+
+#. TRANSLATORS: Indicates that there is no integrity check.
+#. This string is used in tables, so the width must not
+#. exceed ten columns with a fixed-width font.
+#: src/xz/list.c:62
+msgid "None"
+msgstr "Aucune"
+
+#. TRANSLATORS: Indicates that integrity check name is not known,
+#. but the Check ID is known (here 2). This and other "Unknown-N"
+#. strings are used in tables, so the width must not exceed ten
+#. columns with a fixed-width font. It's OK to omit the dash if
+#. you need space for one extra letter, but don't use spaces.
+#: src/xz/list.c:69
+msgid "Unknown-2"
+msgstr "Inconnue-2"
+
+#: src/xz/list.c:70
+msgid "Unknown-3"
+msgstr "Inconnue-3"
+
+#: src/xz/list.c:72
+msgid "Unknown-5"
+msgstr "Inconnue-5"
+
+#: src/xz/list.c:73
+msgid "Unknown-6"
+msgstr "Inconnue-6"
+
+#: src/xz/list.c:74
+msgid "Unknown-7"
+msgstr "Inconnue-7"
+
+#: src/xz/list.c:75
+msgid "Unknown-8"
+msgstr "Inconnue-8"
+
+#: src/xz/list.c:76
+msgid "Unknown-9"
+msgstr "Inconnue-9"
+
+#: src/xz/list.c:78
+msgid "Unknown-11"
+msgstr "Inconnue-11"
+
+#: src/xz/list.c:79
+msgid "Unknown-12"
+msgstr "Inconnue-12"
+
+#: src/xz/list.c:80
+msgid "Unknown-13"
+msgstr "Inconnue-13"
+
+#: src/xz/list.c:81
+msgid "Unknown-14"
+msgstr "Inconnue-14"
+
+#: src/xz/list.c:82
+msgid "Unknown-15"
+msgstr "Inconnue-15"
+
+#: src/xz/list.c:126
+#, c-format
+msgid "%s: File is empty"
+msgstr "%s : Le fichier est vide"
+
+#: src/xz/list.c:131
+#, c-format
+msgid "%s: Too small to be a valid .xz file"
+msgstr "%s : Trop petit pour être un fichier xz valide."
+
+#. TRANSLATORS: These are column headings. From Strms (Streams)
+#. to Ratio, the columns are right aligned. Check and Filename
+#. are left aligned. If you need longer words, it's OK to
+#. use two lines here. Test with "xz -l foo.xz".
+#: src/xz/list.c:612
+msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
+msgstr "Flux Blocs Compressé Décompressé Ratio Vérif Nom de fichier"
+
+#: src/xz/list.c:652
+#, c-format
+msgid " Streams: %s\n"
+msgstr " Flux : %s\n"
+
+#: src/xz/list.c:654
+#, c-format
+msgid " Blocks: %s\n"
+msgstr " Blocs : %s\n"
+
+#: src/xz/list.c:656
+#, c-format
+msgid " Compressed size: %s\n"
+msgstr " Taille compressé : %s\n"
+
+#: src/xz/list.c:659
+#, c-format
+msgid " Uncompressed size: %s\n"
+msgstr " Taille décompressé : %s\n"
+
+#: src/xz/list.c:662
+#, c-format
+msgid " Ratio: %s\n"
+msgstr " Ratio : %s\n"
+
+#: src/xz/list.c:664
+#, c-format
+msgid " Check: %s\n"
+msgstr " Vérification : %s\n"
+
+#: src/xz/list.c:665
+#, c-format
+msgid " Stream padding: %s\n"
+msgstr " Octets de rembourrage du flux : %s\n"
+
+#. TRANSLATORS: The second line is column headings. All except
+#. Check are right aligned; Check is left aligned. Test with
+#. "xz -lv foo.xz".
+#: src/xz/list.c:693
+msgid ""
+" Streams:\n"
+" Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
+msgstr ""
+" Flux :\n"
+" Flux Blocs PositionComp PositionDécomp TailleComp TailleDécomp Ratio Vérif. Bourrage"
+
+#. TRANSLATORS: The second line is column headings. All
+#. except Check are right aligned; Check is left aligned.
+#: src/xz/list.c:748
+#, c-format
+msgid ""
+" Blocks:\n"
+" Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
+msgstr ""
+" Blocs :\n"
+" Flux Bloc PositionComp PositionDécomp TailleTot TailleDécomp Ratio Vérif."
+
+#. TRANSLATORS: These are additional column headings
+#. for the most verbose listing mode. CheckVal
+#. (Check value), Flags, and Filters are left aligned.
+#. Header (Block Header Size), CompSize, and MemUsage
+#. are right aligned. %*s is replaced with 0-120
+#. spaces to make the CheckVal column wide enough.
+#. Test with "xz -lvv foo.xz".
+#: src/xz/list.c:760
+#, c-format
+msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
+msgstr " ValVérif %*sEn-tête Drapeaux TailleComp UtilMém Filtres"
+
+#: src/xz/list.c:838 src/xz/list.c:1007
+#, c-format
+msgid " Memory needed: %s MiB\n"
+msgstr " Mémoire nécessaire : %s MiB\n"
+
+#: src/xz/list.c:840 src/xz/list.c:1009
+#, c-format
+msgid " Sizes in headers: %s\n"
+msgstr " Tailles stockées dans l'en-tête : %s\n"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "Yes"
+msgstr "Oui"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "No"
+msgstr "Non"
+
+#. TRANSLATORS: %s is an integer. Only the plural form of this
+#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
+#: src/xz/list.c:986
+#, c-format
+msgid "%s file\n"
+msgid_plural "%s files\n"
+msgstr[0] "%s fichier\n"
+msgstr[1] "%s fichiers\n"
+
+#: src/xz/list.c:999
+msgid "Totals:"
+msgstr "Totaux :"
+
+#: src/xz/list.c:1000
+#, c-format
+msgid " Number of files: %s\n"
+msgstr " Nombre de fichiers : %s\n"
+
+#: src/xz/list.c:1072
+msgid "--list works only on .xz files (--format=xz or --format=auto)"
+msgstr "--list ne marche que sur les fichiers .xz (--format=xz ou --format=auto)"
+
+#: src/xz/list.c:1078
+msgid "--list does not support reading from standard input"
+msgstr "--list est incompatible avec la lecture sur l'entrée standard"
+
+#: src/xz/main.c:89
+#, c-format
+msgid "%s: Error reading filenames: %s"
+msgstr "%s : Erreur lors de la lecture des noms de fichiers : %s"
+
+#: src/xz/main.c:96
+#, c-format
+msgid "%s: Unexpected end of input when reading filenames"
+msgstr "%s : Fin des données inattendue lors de la lecture des noms de fichiers"
+
+#: src/xz/main.c:120
+#, c-format
+msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
+msgstr "%s : Caractère NULL détecté lors de la lecture des noms de fichiers ; peut-être pensiez-vous à `--files0' plutot qu'a `--files' ?"
+
+#: src/xz/main.c:174
+msgid "Compression and decompression with --robot are not supported yet."
+msgstr "La compression et la décompression ne marchent pas encore avec --robot."
+
+#: src/xz/main.c:231
+msgid "Cannot read data from standard input when reading filenames from standard input"
+msgstr "Impossible de lire à la fois les données et les noms de fichiers depuis l'entrée standard"
+
+#. TRANSLATORS: This is the program name in the beginning
+#. of the line in messages. Usually it becomes "xz: ".
+#. This is a translatable string because French needs
+#. a space before a colon.
+#: src/xz/message.c:733
+#, c-format
+msgid "%s: "
+msgstr "%s : "
+
+#: src/xz/message.c:796 src/xz/message.c:846
+msgid "Internal error (bug)"
+msgstr "Erreur interne (bug)"
+
+#: src/xz/message.c:803
+msgid "Cannot establish signal handlers"
+msgstr "Impossible d'installer le gestionnaire de signaux"
+
+#: src/xz/message.c:812
+msgid "No integrity check; not verifying file integrity"
+msgstr "Pas de données de vérification d'intégrité ; vérification non effectuée"
+
+#: src/xz/message.c:815
+msgid "Unsupported type of integrity check; not verifying file integrity"
+msgstr "Méthode de vérification d'intégrité non prise en charge ; vérification non effectuée"
+
+#: src/xz/message.c:822
+msgid "Memory usage limit reached"
+msgstr "Limite d'utilisation mémoire atteinte"
+
+#: src/xz/message.c:825
+msgid "File format not recognized"
+msgstr "Format de fichier inconnu"
+
+#: src/xz/message.c:828
+msgid "Unsupported options"
+msgstr "Options non prises en charge"
+
+#: src/xz/message.c:831
+msgid "Compressed data is corrupt"
+msgstr "Les données compressées sont corrompues"
+
+#: src/xz/message.c:834
+msgid "Unexpected end of input"
+msgstr "Fin des données inattendue "
+
+#: src/xz/message.c:885
+#, c-format
+msgid "%s MiB of memory is required. The limit is %s."
+msgstr "%s MiB de mémoire sont nécessaires, la limite étant %s."
+
+#: src/xz/message.c:1052
+#, c-format
+msgid "%s: Filter chain: %s\n"
+msgstr "%s : Enchaînement de filtres : %s\n"
+
+#: src/xz/message.c:1062
+#, c-format
+msgid "Try `%s --help' for more information."
+msgstr "Utilisez `%s --help' pour plus d'informations."
+
+#: src/xz/message.c:1088
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [FILE]...\n"
+"Compress or decompress FILEs in the .xz format.\n"
+"\n"
+msgstr ""
+"Utilisation : %s [OPTION]... [FICHIER]...\n"
+"Compresse ou decompresse FICHIER(s) au format .xz.\n"
+"\n"
+
+#: src/xz/message.c:1095
+msgid "Mandatory arguments to long options are mandatory for short options too.\n"
+msgstr ""
+"Les arguments obligatoires pour les options longues le sont aussi pour les\n"
+"options courtes.\n"
+
+#: src/xz/message.c:1099
+msgid " Operation mode:\n"
+msgstr " Mode d'opération :\n"
+
+#: src/xz/message.c:1102
+msgid ""
+" -z, --compress force compression\n"
+" -d, --decompress force decompression\n"
+" -t, --test test compressed file integrity\n"
+" -l, --list list information about .xz files"
+msgstr ""
+" -z, --compress forcer la compression\n"
+" -d, --decompress forcer la décompression\n"
+" -t, --test tester l'intégrité du fichier compressé\n"
+" -l, --list lister les informations à propos des fichiers .xz"
+
+#: src/xz/message.c:1108
+msgid ""
+"\n"
+" Operation modifiers:\n"
+msgstr ""
+"\n"
+" Modifictauers :\n"
+
+#: src/xz/message.c:1111
+msgid ""
+" -k, --keep keep (don't delete) input files\n"
+" -f, --force force overwrite of output file and (de)compress links\n"
+" -c, --stdout write to standard output and don't delete input files"
+msgstr ""
+" -k, --keep ne pas supprimer les fichiers d'entrée (\"keep\")\n"
+" -f, --force forcer l'écrasement du fichier de sortie et\n"
+" (dé)compresser les liens\n"
+" -c, --stdout écrire sur la sortie standard et ne pas supprimer les\n"
+" fichiers d'entrée"
+
+#: src/xz/message.c:1117
+msgid ""
+" --single-stream decompress only the first stream, and silently\n"
+" ignore possible remaining input data"
+msgstr ""
+" --single-stream décompresser uniquement le premier flux et ignorer\n"
+" silenciseusement les données éventuellement restantes"
+
+#: src/xz/message.c:1120
+msgid ""
+" --no-sparse do not create sparse files when decompressing\n"
+" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
+" --files[=FILE] read filenames to process from FILE; if FILE is\n"
+" omitted, filenames are read from the standard input;\n"
+" filenames must be terminated with the newline character\n"
+" --files0[=FILE] like --files but use the null character as terminator"
+msgstr ""
+" --no-sparse ne pas créer de 'sparse file' lors de la décompression\n"
+" -S, --suffix=.SUF utiliser le suffixe `.SUF' pour les fichiers compressés\n"
+" --files[=FILE] lire les fichiers sur lesquels opérer depuis FILE ; si\n"
+" FILE est omis, ceux-ci sont lus depuis l'entrée standard\n"
+" et doivent être suivis d'un caractère de retour à la ligne\n"
+" --files0[=FILE] comme --files mais avec un caractère null comme séparateur"
+
+#: src/xz/message.c:1129
+msgid ""
+"\n"
+" Basic file format and compression options:\n"
+msgstr ""
+"\n"
+" Options basiques de format de fichier et de compression :\n"
+
+#: src/xz/message.c:1131
+msgid ""
+" -F, --format=FMT file format to encode or decode; possible values are\n"
+" `auto' (default), `xz', `lzma', and `raw'\n"
+" -C, --check=CHECK integrity check type: `none' (use with caution),\n"
+" `crc32', `crc64' (default), or `sha256'"
+msgstr ""
+" -F, --format=FMT format de fichier à encoder ou décoder ; les possibilités\n"
+" sont : `auto' (par défaut), `xz', `lzma' et `raw'\n"
+" -C, --check=CHECK type de vérification d'intégrité : `none' (à utiliser avec\n"
+" précaution), `crc32', `crc64' (par défaut) ou `sha256'"
+
+#: src/xz/message.c:1138
+msgid ""
+" -0 ... -9 compression preset; default is 6; take compressor *and*\n"
+" decompressor memory usage into account before using 7-9!"
+msgstr ""
+" -0 ... -9 préréglage de compression ; 6 par défaut ; pensez à\n"
+" l'utilisation mémoire du compresseur *et* du décompresseur\n"
+" avant d'utiliser 7, 8 ou 9 !"
+
+#: src/xz/message.c:1142
+msgid ""
+" -e, --extreme try to improve compression ratio by using more CPU time;\n"
+" does not affect decompressor memory requirements"
+msgstr ""
+" -e, --extreme essayer d'améliorer la compression en utilisant davantage\n"
+" de temps processeur sans affecter les besoins mémoire du\n"
+" décompresseur"
+
+#: src/xz/message.c:1147
+msgid ""
+" --block-size=SIZE\n"
+" when compressing to the .xz format, start a new block\n"
+" after every SIZE bytes of input; 0=disabled (default)"
+msgstr ""
+" --block-size=SIZE\n"
+" pour une compression au format .xz, entamer un nouveau\n"
+" bloc après SIZE octets d'entrée ; 0=désactivé (par défaut)"
+
+#: src/xz/message.c:1151
+#, no-c-format
+msgid ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" set memory usage limit for compression, decompression,\n"
+" or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
+msgstr ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" règle la limite d'utilisation mémoire pour la compression,\n"
+" décompression ou les deux ; LIMIT est en octets, % de\n"
+" RAM, ou 0 pour les valeurs par défaut"
+
+#: src/xz/message.c:1158
+msgid ""
+" --no-adjust if compression settings exceed the memory usage limit,\n"
+" give an error instead of adjusting the settings downwards"
+msgstr ""
+" --no-adjust si les réglages de compression dépassent la limite\n"
+" d'utilisation mémoire, renvoyer une erreur plutôt que de\n"
+" diminuer les réglages"
+
+#: src/xz/message.c:1164
+msgid ""
+"\n"
+" Custom filter chain for compression (alternative for using presets):"
+msgstr ""
+"\n"
+" Enchaînement de filtres de compression personnalisé (au lieu des préréglages) :"
+
+#: src/xz/message.c:1173
+msgid ""
+"\n"
+" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
+" --lzma2[=OPTS] more of the following options (valid values; default):\n"
+" preset=PRE reset options to a preset (0-9[e])\n"
+" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
+" lc=NUM number of literal context bits (0-4; 3)\n"
+" lp=NUM number of literal position bits (0-4; 0)\n"
+" pb=NUM number of position bits (0-4; 2)\n"
+" mode=MODE compression mode (fast, normal; normal)\n"
+" nice=NUM nice length of a match (2-273; 64)\n"
+" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=NUM maximum search depth; 0=automatic (default)"
+msgstr ""
+"\n"
+" --lzma1[=OPTS] LZMA1 ou LZMA2 ; OPTS est une liste de zéro ou plusieurs\n"
+" --lzma2[=OPTS] options parmi les suivantes (vals. valides ; par défaut) :\n"
+" preset=PRE remettre les options à un préréglage (0-9[e])\n"
+" dict=NUM taille dictionnaire (4KiB - 1536MiB ; 8MiB)\n"
+" lc=NUM nombre de 'literal context bits' (0-4 ; 3)\n"
+" lp=NUM nombre de 'literal position bits' (0-4 ; 0)\n"
+" pb=NUM nombre de 'position bits' (0-4 ; 2)\n"
+" mode=MODE mode de compression (fast, normal ; normal)\n"
+" nice=NUM nice length of a match (2-273; 64)\n"
+" mf=NAME 'match finder' (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=NUM profondeur de recherche maximale ;\n"
+" 0=automatique (par défaut)"
+
+#: src/xz/message.c:1188
+msgid ""
+"\n"
+" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
+" --powerpc[=OPTS] PowerPC BCJ filter (big endian only)\n"
+" --ia64[=OPTS] IA-64 (Itanium) BCJ filter\n"
+" --arm[=OPTS] ARM BCJ filter (little endian only)\n"
+" --armthumb[=OPTS] ARM-Thumb BCJ filter (little endian only)\n"
+" --sparc[=OPTS] SPARC BCJ filter\n"
+" Valid OPTS for all BCJ filters:\n"
+" start=NUM start offset for conversions (default=0)"
+msgstr ""
+"\n"
+" --x86[=OPTS] filtre BCJ x86 (32-bit et 64-bit)\n"
+" --powerpc[=OPTS] filtre BCJ PowerPC ('big endian' uniquement)\n"
+" --ia64[=OPTS] filtre BCJ IA-64 (Itanium)\n"
+" --arm[=OPTS] filtre BCJ ARM ('little endian' uniquement)\n"
+" --armthumb[=OPTS] filtre BCJ ARM-Thumb ('little endian' uniquement)\n"
+" --sparc[=OPTS] filtre BCJ SPARC\n"
+" OPTS valides pour tous les filtres BCJ :\n"
+" start=NUM start offset for conversions (default=0)"
+
+#: src/xz/message.c:1200
+msgid ""
+"\n"
+" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
+" dist=NUM distance between bytes being subtracted\n"
+" from each other (1-256; 1)"
+msgstr ""
+"\n"
+" --delta[=OPTS] Filtre delta ; OPTS valides (vals. valides ; par défaut) :\n"
+" dist=NUM distance entre les octets soustraits\n"
+" les uns aux autres (1-256 ; 1)"
+
+#: src/xz/message.c:1208
+msgid ""
+"\n"
+" Other options:\n"
+msgstr ""
+"\n"
+" Autres options :\n"
+
+#: src/xz/message.c:1211
+msgid ""
+" -q, --quiet suppress warnings; specify twice to suppress errors too\n"
+" -v, --verbose be verbose; specify twice for even more verbose"
+msgstr ""
+" -q, --quiet supprimer les avertissemnts ; spécifier deux fois pour\n"
+" aussi supprimer les erreur\n"
+" -v, --verbose être bavard ; spécifier deux fois pour l'être davantage"
+
+#: src/xz/message.c:1216
+msgid " -Q, --no-warn make warnings not affect the exit status"
+msgstr " -Q, --no-warn les avertissements ne modifient pas le code de sortie"
+
+#: src/xz/message.c:1218
+msgid " --robot use machine-parsable messages (useful for scripts)"
+msgstr ""
+" --robot utiliser des messages lisibles par un programme\n"
+" (utile pour les scripts)"
+
+#: src/xz/message.c:1221
+msgid ""
+" --info-memory display the total amount of RAM and the currently active\n"
+" memory usage limits, and exit"
+msgstr ""
+" --info-memory affiche la quantité totale de RAM et la limite actuelle\n"
+" en mémoire puis quitte"
+
+#: src/xz/message.c:1224
+msgid ""
+" -h, --help display the short help (lists only the basic options)\n"
+" -H, --long-help display this long help and exit"
+msgstr ""
+" -h, --help affiche l'aide courte (ne liste que les options de base)\n"
+" -H, --long-help affiche l'aide longue (ceci) puis quitte"
+
+#: src/xz/message.c:1228
+msgid ""
+" -h, --help display this short help and exit\n"
+" -H, --long-help display the long help (lists also the advanced options)"
+msgstr ""
+" -h, --help affiche l'aide courte (ceci) puis quitte\n"
+" -H, --long-help affiche l'aide longue (liste aussi les options avancées)"
+
+#: src/xz/message.c:1233
+msgid " -V, --version display the version number and exit"
+msgstr " -V, --version affiche le numéro de version puis quitte"
+
+#: src/xz/message.c:1235
+msgid ""
+"\n"
+"With no FILE, or when FILE is -, read standard input.\n"
+msgstr ""
+"\n"
+"Sans FILE ou quand FILE est -, lire l'entrée standard.\n"
+
+#. TRANSLATORS: This message indicates the bug reporting address
+#. for this package. Please add _another line_ saying
+#. "Report translation bugs to <...>\n" with the email or WWW
+#. address for translation bugs. Thanks.
+#: src/xz/message.c:1241
+#, c-format
+msgid "Report bugs to <%s> (in English or Finnish).\n"
+msgstr ""
+"Signaler les bogues à <%s> (en anglais ou en finlandais).\n"
+"Signaler les bogues de traduction à <camaradetux@gmail.com>.\n"
+
+#: src/xz/message.c:1243
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s page du projet : <%s>\n"
+
+#: src/xz/options.c:86
+#, c-format
+msgid "%s: Options must be `name=value' pairs separated with commas"
+msgstr "%s: Les options doivent être des paires `nom=valeur' séparées par des virgules"
+
+#: src/xz/options.c:93
+#, c-format
+msgid "%s: Invalid option name"
+msgstr "%s : Nom d'option invalide"
+
+#: src/xz/options.c:113
+#, c-format
+msgid "%s: Invalid option value"
+msgstr "%s : Valeur d'option invalide"
+
+#: src/xz/options.c:247
+#, c-format
+msgid "Unsupported LZMA1/LZMA2 preset: %s"
+msgstr "Préréglage LZMA1/LZMA2 non pris en charge : %s"
+
+#: src/xz/options.c:355
+msgid "The sum of lc and lp must not exceed 4"
+msgstr "La somme de lc et lp ne doit pas dépasser 4"
+
+#: src/xz/options.c:359
+#, c-format
+msgid "The selected match finder requires at least nice=%<PRIu32>"
+msgstr "Le `match finder' choisi nécessite au moins nice=%<PRIu32>"
+
+#: src/xz/suffix.c:133 src/xz/suffix.c:258
+#, c-format
+msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
+msgstr "%s : Avec --format=raw, --suffix=.SUF est nécessaire sauf lors de l'écriture vers stdout"
+
+#: src/xz/suffix.c:164
+#, c-format
+msgid "%s: Filename has an unknown suffix, skipping"
+msgstr "%s : Le fichier a un suffixe inconnu, ignoré"
+
+#: src/xz/suffix.c:185
+#, c-format
+msgid "%s: File already has `%s' suffix, skipping"
+msgstr "%s : Le fichier a déjà le suffixe '%s', ignoré"
+
+#: src/xz/suffix.c:393
+#, c-format
+msgid "%s: Invalid filename suffix"
+msgstr "%s: Suffixe de nom de fichier invalide"
+
+#: src/xz/util.c:61
+#, c-format
+msgid "%s: Value is not a non-negative decimal integer"
+msgstr "%s : La valeur n'est pas un entier décimal non négatif"
+
+#: src/xz/util.c:103
+#, c-format
+msgid "%s: Invalid multiplier suffix"
+msgstr "%s : Suffixe multiplicateur invalide"
+
+#: src/xz/util.c:105
+msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
+msgstr "Les suffixes valides sont 'KiB' (2^10), 'MiB' (2^20) et 'GiB' (2^30)."
+
+#: src/xz/util.c:122
+#, c-format
+msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
+msgstr "La valeur de l'option '%s' doit être inclue entre %<PRIu64> et %<PRIu64>"
+
+#: src/xz/util.c:247
+msgid "Empty filename, skipping"
+msgstr "Nom de fichier vide, ignoré"
+
+#: src/xz/util.c:261
+msgid "Compressed data cannot be read from a terminal"
+msgstr "Les données compressées ne peuvent pas être lues depuis un terminal"
+
+#: src/xz/util.c:274
+msgid "Compressed data cannot be written to a terminal"
+msgstr "Les données compressées ne peuvent pas être écrites dans un terminal"
+
+#: src/common/tuklib_exit.c:39
+msgid "Writing to standard output failed"
+msgstr "Impossible d'écrire vers la sortie standard"
+
+#: src/common/tuklib_exit.c:42
+msgid "Unknown error"
+msgstr "Erreur inconnue"
diff --git a/contrib/xz/po/it.po b/contrib/xz/po/it.po
index 8e096dd..ea6f858 100644
--- a/contrib/xz/po/it.po
+++ b/contrib/xz/po/it.po
@@ -2,78 +2,83 @@
# This file is in the public domain
# Gruppo traduzione italiano di Ubuntu-it <gruppo-traduzione@ubuntu-it.org>, 2009, 2010
# Lorenzo De Liso <blackz@ubuntu.com>, 2010.
-# Milo Casagrande <milo@ubuntu.com>, 2009, 2010.
+# Milo Casagrande <milo@ubuntu.com>, 2009, 2010, 2011.
+#
msgid ""
msgstr ""
"Project-Id-Version: xz-utils\n"
-"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
-"POT-Creation-Date: 2010-09-10 14:50+0300\n"
-"PO-Revision-Date: 2010-09-16 21:32+0200\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-05-27 11:42+0200\n"
+"PO-Revision-Date: 2011-05-27 11:43+0200\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
+"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-08-16 19:16+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: src/xz/args.c:333
+#: ../src/xz/args.c:333
#, c-format
msgid "%s: Unknown file format type"
-msgstr "%s: tipo di formato del file sconosciutoN"
+msgstr "%s: tipo di formato del file sconosciuto"
-#: src/xz/args.c:356 src/xz/args.c:364
+#: ../src/xz/args.c:356 ../src/xz/args.c:364
#, c-format
msgid "%s: Unsupported integrity check type"
msgstr "%s: tipo di controllo integrità non supportato"
-#: src/xz/args.c:382
+#: ../src/xz/args.c:382
msgid "Only one file can be specified with `--files' or `--files0'."
msgstr "Solo un file può essere specificato con \"--files\" o \"--files0\"."
-#: src/xz/args.c:445
+#: ../src/xz/args.c:445
#, c-format
msgid "The environment variable %s contains too many arguments"
msgstr "La variabile d'ambiente %s contiene troppi argomenti"
-#: src/xz/coder.c:95
+#: ../src/xz/coder.c:95
msgid "Maximum number of filters is four"
msgstr "Il numero massimo di filtri è quattro"
-#: src/xz/coder.c:108
+#: ../src/xz/coder.c:108
msgid "Memory usage limit is too low for the given filter setup."
msgstr ""
"Il limite dell'uso della memoria è troppo basso per l'impostazione del "
"filtro dato."
-#: src/xz/coder.c:129
+#. The message is shown only if warnings are allowed
+#. but the exit status isn't changed.
+#: ../src/xz/coder.c:129
msgid "Using a preset in raw mode is discouraged."
msgstr "Non è consigliato usare un preset nella modalità raw."
-#: src/xz/coder.c:131
+#: ../src/xz/coder.c:131
msgid "The exact options of the presets may vary between software versions."
msgstr ""
"Le opzioni esatte per i preset possono variare tra le versioni del software."
-#: src/xz/coder.c:157
+#: ../src/xz/coder.c:157
msgid "The .lzma format supports only the LZMA1 filter"
msgstr "Il formato .lzma supporta solo il filtro LZMA1"
-#: src/xz/coder.c:165
+#: ../src/xz/coder.c:165
msgid "LZMA1 cannot be used with the .xz format"
msgstr "LZMA1 non può essere usato con il formato .xz"
-#: src/xz/coder.c:182
+#: ../src/xz/coder.c:182
msgid "Unsupported filter chain or filter options"
msgstr "Catena di filtri od opzioni del filtro non supportata"
-#: src/xz/coder.c:190
+#: ../src/xz/coder.c:190
#, c-format
msgid "Decompression will need %s MiB of memory."
msgstr "L'estrazione necessita di %s MiB di memoria."
-#: src/xz/coder.c:247
+#. Tell the user that we decreased the dictionary size.
+#: ../src/xz/coder.c:247
#, c-format
msgid ""
"Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the "
@@ -92,119 +97,128 @@ msgstr ""
#. it is possible that the user has put a new file in place
#. of the original file, and in that case it obviously
#. shouldn't be removed.
-#: src/xz/file_io.c:137
+#: ../src/xz/file_io.c:137
#, c-format
msgid "%s: File seems to have been moved, not removing"
msgstr "%s: sembra che il file sia stato spostato, non viene rimosso"
-#: src/xz/file_io.c:144 src/xz/file_io.c:590
+#: ../src/xz/file_io.c:144 ../src/xz/file_io.c:589
#, c-format
msgid "%s: Cannot remove: %s"
msgstr "%s: impossibile rimuovere: %s"
-#: src/xz/file_io.c:169
+#: ../src/xz/file_io.c:169
#, c-format
msgid "%s: Cannot set the file owner: %s"
msgstr "%s: impossibile impostare il proprietario del file: %s"
-#: src/xz/file_io.c:175
+#: ../src/xz/file_io.c:175
#, c-format
msgid "%s: Cannot set the file group: %s"
msgstr "%s: impossibile impostare il gruppo del file: %s"
-#: src/xz/file_io.c:194
+#: ../src/xz/file_io.c:194
#, c-format
msgid "%s: Cannot set the file permissions: %s"
msgstr "%s: impossibile impostare i permessi del file: %s"
-#: src/xz/file_io.c:337 src/xz/file_io.c:420
+#: ../src/xz/file_io.c:337 ../src/xz/file_io.c:420
#, c-format
msgid "%s: Is a symbolic link, skipping"
msgstr "%s: è un collegamento simbolico, viene saltato"
-#: src/xz/file_io.c:455
+#: ../src/xz/file_io.c:455
#, c-format
msgid "%s: Is a directory, skipping"
msgstr "%s: è una directory, viene saltata"
-#: src/xz/file_io.c:462
+#: ../src/xz/file_io.c:461
#, c-format
msgid "%s: Not a regular file, skipping"
msgstr "%s: non è un file regolare, viene saltato"
-#: src/xz/file_io.c:479
+#. gzip rejects setuid and setgid files even
+#. when --force was used. bzip2 doesn't check
+#. for them, but calls fchown() after fchmod(),
+#. and many systems automatically drop setuid
+#. and setgid bits there.
+#.
+#. We accept setuid and setgid files if
+#. --force was used. We drop these bits
+#. explicitly in io_copy_attr().
+#: ../src/xz/file_io.c:478
#, c-format
msgid "%s: File has setuid or setgid bit set, skipping"
msgstr "%s: il file ha il bit setuid o setgid impostato, viene saltato"
-#: src/xz/file_io.c:486
+#: ../src/xz/file_io.c:485
#, c-format
msgid "%s: File has sticky bit set, skipping"
msgstr "%s: il file ha lo sticky bit impostato, viene saltato"
-#: src/xz/file_io.c:493
+#: ../src/xz/file_io.c:492
#, c-format
msgid "%s: Input file has more than one hard link, skipping"
msgstr "%s: il file di input ha più di un collegamento fisico, viene saltato"
-#: src/xz/file_io.c:714
+#: ../src/xz/file_io.c:713
#, c-format
msgid "Error restoring the O_APPEND flag to standard output: %s"
msgstr "Errore nel ripristinare la flag O_APPEND sullo standard output: %s"
-#: src/xz/file_io.c:726
+#: ../src/xz/file_io.c:725
#, c-format
msgid "%s: Closing the file failed: %s"
msgstr "%s: chiusura del file non riuscita: %s"
-#: src/xz/file_io.c:762 src/xz/file_io.c:946
+#: ../src/xz/file_io.c:761 ../src/xz/file_io.c:945
#, c-format
msgid "%s: Seeking failed when trying to create a sparse file: %s"
msgstr ""
"%s: posizionamento non riuscito nel tentativo di creare un file sparso: %s"
-#: src/xz/file_io.c:821
+#: ../src/xz/file_io.c:820
#, c-format
msgid "%s: Read error: %s"
msgstr "%s: errore di lettura: %s"
-#: src/xz/file_io.c:844
+#: ../src/xz/file_io.c:843
#, c-format
msgid "%s: Error seeking the file: %s"
msgstr "%s: errore nel cercare il file: %s"
-#: src/xz/file_io.c:854
+#: ../src/xz/file_io.c:853
#, c-format
msgid "%s: Unexpected end of file"
msgstr "%s: fine del file inaspettata"
-#: src/xz/file_io.c:904
+#: ../src/xz/file_io.c:903
#, c-format
msgid "%s: Write error: %s"
msgstr "%s: errore di scrittura: %s"
-#: src/xz/hardware.c:100
+#: ../src/xz/hardware.c:100
msgid "Disabled"
msgstr "Disabilitato"
#. TRANSLATORS: Test with "xz --info-memory" to see if
#. the alignment looks nice.
-#: src/xz/hardware.c:119
+#: ../src/xz/hardware.c:119
msgid "Total amount of physical memory (RAM): "
msgstr "Quantità totale di memoria fisica (RAM): "
-#: src/xz/hardware.c:121
+#: ../src/xz/hardware.c:121
msgid "Memory usage limit for compression: "
msgstr "Limite utilizzo memoria per la compressione: "
-#: src/xz/hardware.c:123
+#: ../src/xz/hardware.c:123
msgid "Memory usage limit for decompression: "
msgstr "Limite utilizzo memoria per l'estrazione: "
#. TRANSLATORS: Indicates that there is no integrity check.
#. This string is used in tables, so the width must not
#. exceed ten columns with a fixed-width font.
-#: src/xz/list.c:62
+#: ../src/xz/list.c:62
msgid "None"
msgstr "Nessuno"
@@ -212,61 +226,61 @@ msgstr "Nessuno"
#. but the Check ID is known (here 2). This and other "Unknown-N"
#. strings are used in tables, so the width must not exceed ten
#. columns with a fixed-width font. It's OK to omit the dash if
-#. you need space for one extra letter.
-#: src/xz/list.c:69
+#. you need space for one extra letter, but don't use spaces.
+#: ../src/xz/list.c:69
msgid "Unknown-2"
msgstr "Sconosc2"
-#: src/xz/list.c:70
+#: ../src/xz/list.c:70
msgid "Unknown-3"
msgstr "Sconosc3"
-#: src/xz/list.c:72
+#: ../src/xz/list.c:72
msgid "Unknown-5"
msgstr "Sconosc5"
-#: src/xz/list.c:73
+#: ../src/xz/list.c:73
msgid "Unknown-6"
msgstr "Sconosc6"
-#: src/xz/list.c:74
+#: ../src/xz/list.c:74
msgid "Unknown-7"
msgstr "Sconosc7"
-#: src/xz/list.c:75
+#: ../src/xz/list.c:75
msgid "Unknown-8"
msgstr "Sconosc8"
-#: src/xz/list.c:76
+#: ../src/xz/list.c:76
msgid "Unknown-9"
msgstr "Sconosc9"
-#: src/xz/list.c:78
+#: ../src/xz/list.c:78
msgid "Unknown-11"
msgstr "Sconosc11"
-#: src/xz/list.c:79
+#: ../src/xz/list.c:79
msgid "Unknown-12"
msgstr "Sconosc12"
-#: src/xz/list.c:80
+#: ../src/xz/list.c:80
msgid "Unknown-13"
msgstr "Sconosc13"
-#: src/xz/list.c:81
+#: ../src/xz/list.c:81
msgid "Unknown-14"
msgstr "Sconosc14"
-#: src/xz/list.c:82
+#: ../src/xz/list.c:82
msgid "Unknown-15"
msgstr "Sconosc15"
-#: src/xz/list.c:126
+#: ../src/xz/list.c:126
#, c-format
msgid "%s: File is empty"
msgstr "%s: il file è vuoto"
-#: src/xz/list.c:131
+#: ../src/xz/list.c:131
#, c-format
msgid "%s: Too small to be a valid .xz file"
msgstr "%s: troppo piccolo per essere un file .xz valido"
@@ -275,49 +289,51 @@ msgstr "%s: troppo piccolo per essere un file .xz valido"
#. to Ratio, the columns are right aligned. Check and Filename
#. are left aligned. If you need longer words, it's OK to
#. use two lines here. Test with "xz -l foo.xz".
-#: src/xz/list.c:612
+#: ../src/xz/list.c:612
msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
msgstr " Strm Blocc. Compresso Estratto Rapp. Contr Nome file"
-#: src/xz/list.c:652
+#: ../src/xz/list.c:652
#, c-format
msgid " Streams: %s\n"
msgstr " Stream: %s\n"
-#: src/xz/list.c:654
+#: ../src/xz/list.c:654
#, c-format
msgid " Blocks: %s\n"
msgstr " Blocchi: %s\n"
-#: src/xz/list.c:656
+#: ../src/xz/list.c:656
#, c-format
msgid " Compressed size: %s\n"
msgstr " Dim. compresso: %s\n"
-#: src/xz/list.c:659
+#: ../src/xz/list.c:659
#, c-format
msgid " Uncompressed size: %s\n"
msgstr " Dim. estratto: %s\n"
-#: src/xz/list.c:662
+#: ../src/xz/list.c:662
#, c-format
msgid " Ratio: %s\n"
msgstr " Rapporto: %s\n"
-#: src/xz/list.c:664
+#: ../src/xz/list.c:664
#, c-format
msgid " Check: %s\n"
msgstr " Controllo: %s\n"
-#: src/xz/list.c:665
+#: ../src/xz/list.c:665
#, c-format
msgid " Stream padding: %s\n"
msgstr " Padding dello stream: %s\n"
+#. Print information about the Streams.
+#.
#. TRANSLATORS: The second line is column headings. All except
#. Check are right aligned; Check is left aligned. Test with
#. "xz -lv foo.xz".
-#: src/xz/list.c:693
+#: ../src/xz/list.c:693
msgid ""
" Streams:\n"
" Stream Blocks CompOffset UncompOffset CompSize "
@@ -329,7 +345,7 @@ msgstr ""
#. TRANSLATORS: The second line is column headings. All
#. except Check are right aligned; Check is left aligned.
-#: src/xz/list.c:748
+#: ../src/xz/list.c:748
#, c-format
msgid ""
" Blocks:\n"
@@ -347,66 +363,74 @@ msgstr ""
#. are right aligned. %*s is replaced with 0-120
#. spaces to make the CheckVal column wide enough.
#. Test with "xz -lvv foo.xz".
-#: src/xz/list.c:760
+#: ../src/xz/list.c:760
#, c-format
msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
msgstr " Val.cont %*s Header Flag Dim.compr. Uso mem. Filtri"
-#: src/xz/list.c:838 src/xz/list.c:1007
+#: ../src/xz/list.c:838 ../src/xz/list.c:1007
#, c-format
msgid " Memory needed: %s MiB\n"
msgstr " Memoria necessaria: %s MiB\n"
-#: src/xz/list.c:840 src/xz/list.c:1009
+#: ../src/xz/list.c:840 ../src/xz/list.c:1009
#, c-format
msgid " Sizes in headers: %s\n"
msgstr " Dim. negli header: %s\n"
-#: src/xz/list.c:841 src/xz/list.c:1010
+#: ../src/xz/list.c:841 ../src/xz/list.c:1010
msgid "Yes"
msgstr "Sì"
-#: src/xz/list.c:841 src/xz/list.c:1010
+#: ../src/xz/list.c:841 ../src/xz/list.c:1010
msgid "No"
msgstr "No"
+#. Since we print totals only when there are at least two files,
+#. the English message will always use "%s files". But some other
+#. languages need different forms for different plurals so we
+#. have to translate this with ngettext().
+#.
#. TRANSLATORS: %s is an integer. Only the plural form of this
#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
-#: src/xz/list.c:986
+#: ../src/xz/list.c:986
#, c-format
msgid "%s file\n"
msgid_plural "%s files\n"
msgstr[0] "%s file\n"
msgstr[1] "%s file\n"
-#: src/xz/list.c:999
+#: ../src/xz/list.c:999
msgid "Totals:"
msgstr "Totali:"
-#: src/xz/list.c:1000
+#: ../src/xz/list.c:1000
#, c-format
msgid " Number of files: %s\n"
msgstr " Numero di file: %s\n"
-#: src/xz/list.c:1072
+#: ../src/xz/list.c:1072
msgid "--list works only on .xz files (--format=xz or --format=auto)"
msgstr "--list funziona solamente con file .xz (--format=xz o --format=auto)"
-#: src/xz/list.c:1078
+#: ../src/xz/list.c:1078
msgid "--list does not support reading from standard input"
msgstr "--list non è in grado di leggere dallo standard input"
-#: src/xz/main.c:89
+#: ../src/xz/main.c:89
#, c-format
msgid "%s: Error reading filenames: %s"
msgstr "%s: errore nel leggere i nomi dei file: %s"
-#: src/xz/main.c:96
+#: ../src/xz/main.c:96
#, c-format
msgid "%s: Unexpected end of input when reading filenames"
msgstr "%s: fine dell'input durante la lettura dei nomi dei file non attesa"
-#: src/xz/main.c:120
+#. A null character was found when using --files,
+#. which expects plain text input separated with
+#. newlines.
+#: ../src/xz/main.c:120
#, c-format
msgid ""
"%s: Null character found when reading filenames; maybe you meant to use `--"
@@ -415,11 +439,11 @@ msgstr ""
"%s: nessun carattere trovato durante la lettura dei nomi dei file; forse si "
"intendeva usare \"--files0\" invece di \"--files\"?"
-#: src/xz/main.c:174
+#: ../src/xz/main.c:174
msgid "Compression and decompression with --robot are not supported yet."
msgstr "La compressione e l'estrazione con --robot non sono ancora supportate."
-#: src/xz/main.c:231
+#: ../src/xz/main.c:231
msgid ""
"Cannot read data from standard input when reading filenames from standard "
"input"
@@ -427,61 +451,72 @@ msgstr ""
"Impossibile leggere i dati dallo standard input durante la lettura dei nomi "
"dei file dallo standard input"
-#: src/xz/message.c:800 src/xz/message.c:844
+#. TRANSLATORS: This is the program name in the beginning
+#. of the line in messages. Usually it becomes "xz: ".
+#. This is a translatable string because French needs
+#. a space before a colon.
+#: ../src/xz/message.c:733
+#, c-format
+msgid "%s: "
+msgstr "%s: "
+
+#: ../src/xz/message.c:796 ../src/xz/message.c:846
msgid "Internal error (bug)"
msgstr "Errore interno (bug)"
-#: src/xz/message.c:807
+#: ../src/xz/message.c:803
msgid "Cannot establish signal handlers"
msgstr "Impossibile stabilire i gestori dei segnali"
-#: src/xz/message.c:816
+#: ../src/xz/message.c:812
msgid "No integrity check; not verifying file integrity"
msgstr ""
"Nessun controllo d'integrità; l'integrità del file non viene verificata"
-#: src/xz/message.c:819
+#: ../src/xz/message.c:815
msgid "Unsupported type of integrity check; not verifying file integrity"
msgstr ""
"Tipo di controllo di integrità non supportato; l'integrità del file non "
"viene verificata"
-#: src/xz/message.c:826
+#: ../src/xz/message.c:822
msgid "Memory usage limit reached"
msgstr "Limite di utilizzo della memoria raggiunto"
-#: src/xz/message.c:829
+#: ../src/xz/message.c:825
msgid "File format not recognized"
msgstr "Formato di file non riconosciuto"
-#: src/xz/message.c:832
+#: ../src/xz/message.c:828
msgid "Unsupported options"
msgstr "Opzioni non supportate"
-#: src/xz/message.c:835
+#: ../src/xz/message.c:831
msgid "Compressed data is corrupt"
msgstr "I dati compressi sono danneggiati"
-#: src/xz/message.c:838
+#: ../src/xz/message.c:834
msgid "Unexpected end of input"
msgstr "Fine dell'input non attesa"
-#: src/xz/message.c:886
+#: ../src/xz/message.c:885
#, c-format
msgid "%s MiB of memory is required. The limit is %s."
msgstr "%s MiB di memoria sono richiesti. Il limite è %s."
-#: src/xz/message.c:1053
+#: ../src/xz/message.c:1052
#, c-format
msgid "%s: Filter chain: %s\n"
msgstr "%s: catena di filtri: %s\n"
-#: src/xz/message.c:1063
+#. Print this with V_WARNING instead of V_ERROR to prevent it from
+#. showing up when --quiet has been specified.
+#: ../src/xz/message.c:1062
#, c-format
msgid "Try `%s --help' for more information."
msgstr "Provare \"%s --help\" per maggiori informazioni."
-#: src/xz/message.c:1089
+#: ../src/xz/message.c:1088
#, c-format
msgid ""
"Usage: %s [OPTION]... [FILE]...\n"
@@ -492,18 +527,18 @@ msgstr ""
"Comprime o estrae i FILE nel formato .xz.\n"
"\n"
-#: src/xz/message.c:1096
+#: ../src/xz/message.c:1095
msgid ""
"Mandatory arguments to long options are mandatory for short options too.\n"
msgstr ""
"Gli argomenti obbligatori per le opzioni lunghe lo sono anche per quelle "
"brevi.\n"
-#: src/xz/message.c:1100
+#: ../src/xz/message.c:1099
msgid " Operation mode:\n"
msgstr " Modalità di operazione:\n"
-#: src/xz/message.c:1103
+#: ../src/xz/message.c:1102
msgid ""
" -z, --compress force compression\n"
" -d, --decompress force decompression\n"
@@ -515,7 +550,7 @@ msgstr ""
" -t, --test Verifica l'integrità dei file compressi\n"
" -l, --list Elenca informazioni sui file .xz"
-#: src/xz/message.c:1109
+#: ../src/xz/message.c:1108
msgid ""
"\n"
" Operation modifiers:\n"
@@ -523,7 +558,7 @@ msgstr ""
"\n"
" Modificatori di operazioni:\n"
-#: src/xz/message.c:1112
+#: ../src/xz/message.c:1111
msgid ""
" -k, --keep keep (don't delete) input files\n"
" -f, --force force overwrite of output file and (de)compress links\n"
@@ -536,7 +571,7 @@ msgstr ""
" -c, --stdout Scrive sullo standard output e non elimina i file di "
"input"
-#: src/xz/message.c:1118
+#: ../src/xz/message.c:1117
msgid ""
" --no-sparse do not create sparse files when decompressing\n"
" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
@@ -556,7 +591,7 @@ msgstr ""
" di newline\n"
" --files0=[FILE] Come --files ma usa il carattere null come terminatore"
-#: src/xz/message.c:1126
+#: ../src/xz/message.c:1125
msgid ""
"\n"
" Basic file format and compression options:\n"
@@ -564,7 +599,7 @@ msgstr ""
"\n"
" Formato file di base e opzioni di compressione:\n"
-#: src/xz/message.c:1128
+#: ../src/xz/message.c:1127
msgid ""
" -F, --format=FMT file format to encode or decode; possible values are\n"
" `auto' (default), `xz', `lzma', and `raw'\n"
@@ -579,12 +614,12 @@ msgstr ""
"attenzione),\n"
" \"crc32\", \"crc64\" (predefinito) o \"sha256\""
-#: src/xz/message.c:1135
+#: ../src/xz/message.c:1134
msgid ""
" -0 ... -9 compression preset; default is 6; take compressor "
"*and*\n"
-" decompressor memory usage into account before using 7-"
-"9!"
+" decompressor memory usage into account before using "
+"7-9!"
msgstr ""
" -0 ... -9 Preset di compressione; predefinito è 6; tenere a "
"mente\n"
@@ -592,7 +627,7 @@ msgstr ""
"prima\n"
" di usare 7-9"
-#: src/xz/message.c:1139
+#: ../src/xz/message.c:1138
msgid ""
" -e, --extreme try to improve compression ratio by using more CPU "
"time;\n"
@@ -603,7 +638,7 @@ msgstr ""
"di\n"
" memoria in fase di estrazione"
-#: src/xz/message.c:1144
+#: ../src/xz/message.c:1143
#, no-c-format
msgid ""
" --memlimit-compress=LIMIT\n"
@@ -621,7 +656,7 @@ msgstr ""
"byte,\n"
" % della memoria RAM oppure 0 per il valore predefinito"
-#: src/xz/message.c:1151
+#: ../src/xz/message.c:1150
msgid ""
" --no-adjust if compression settings exceed the memory usage "
"limit,\n"
@@ -633,7 +668,7 @@ msgstr ""
" utilizzo della memoria, lancia un errore invece di\n"
" utilizzare valori più piccoli"
-#: src/xz/message.c:1157
+#: ../src/xz/message.c:1156
msgid ""
"\n"
" Custom filter chain for compression (alternative for using presets):"
@@ -642,7 +677,7 @@ msgstr ""
" Catena di filtri personalizzati per la compressione (alternative per\n"
" l'utilizzo di preset):"
-#: src/xz/message.c:1166
+#: ../src/xz/message.c:1165
msgid ""
"\n"
" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero "
@@ -672,8 +707,8 @@ msgstr ""
" (4KiB - 1536MiB; 8MiB)\n"
" lc=NUM Numero di bit letterali di contesto (0-4; "
"3)\n"
-" lp=NUM Numero di bit letterali di posizione (0-"
-"4; 0)\n"
+" lp=NUM Numero di bit letterali di posizione "
+"(0-4; 0)\n"
" pb=NUM Numero di bit di posizione (0-4; 2)\n"
" mode=MODE Modalità di compressione\n"
" (fast, normal; normal)\n"
@@ -685,7 +720,7 @@ msgstr ""
"0=automatica\n"
" (predefinito)"
-#: src/xz/message.c:1181
+#: ../src/xz/message.c:1180
msgid ""
"\n"
" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
@@ -708,7 +743,7 @@ msgstr ""
" start=NUM Offset iniziale per le conversioni\n"
" (predefinito=0)"
-#: src/xz/message.c:1193
+#: ../src/xz/message.c:1192
msgid ""
"\n"
" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
@@ -720,7 +755,7 @@ msgstr ""
" dist=NUM Distanza tra byte sottratti\n"
" gli uni dagli altri (1-256; 1)"
-#: src/xz/message.c:1201
+#: ../src/xz/message.c:1200
msgid ""
"\n"
" Other options:\n"
@@ -728,7 +763,7 @@ msgstr ""
"\n"
" Altre opzioni:\n"
-#: src/xz/message.c:1204
+#: ../src/xz/message.c:1203
msgid ""
" -q, --quiet suppress warnings; specify twice to suppress errors "
"too\n"
@@ -741,16 +776,16 @@ msgstr ""
"ancora\n"
" più prolisso"
-#: src/xz/message.c:1209
+#: ../src/xz/message.c:1208
msgid " -Q, --no-warn make warnings not affect the exit status"
msgstr " -Q, --no-warn Gli avvisi non influenzano lo stato d'uscita"
-#: src/xz/message.c:1211
+#: ../src/xz/message.c:1210
msgid ""
" --robot use machine-parsable messages (useful for scripts)"
msgstr " --robot Usa messaggi analizzabili (utile per gli script)"
-#: src/xz/message.c:1214
+#: ../src/xz/message.c:1213
msgid ""
" --info-memory display the total amount of RAM and the currently "
"active\n"
@@ -760,7 +795,7 @@ msgstr ""
"attuale\n"
" attivo di utilizzo della memore ed esce"
-#: src/xz/message.c:1217
+#: ../src/xz/message.c:1216
msgid ""
" -h, --help display the short help (lists only the basic options)\n"
" -H, --long-help display this long help and exit"
@@ -768,7 +803,7 @@ msgstr ""
" -h, --help Stampa l'aiuto breve (elenca solo le opzioni di base)\n"
" -H, --long-help Stampa questo lungo aiuto ed esce"
-#: src/xz/message.c:1221
+#: ../src/xz/message.c:1220
msgid ""
" -h, --help display this short help and exit\n"
" -H, --long-help display the long help (lists also the advanced options)"
@@ -776,11 +811,11 @@ msgstr ""
" -h, --help Stampa questo breve aiuto ed esce\n"
" -H, --long-help Stampa l'aiuto lungo (elenca anche le opzioni avanzate)"
-#: src/xz/message.c:1226
+#: ../src/xz/message.c:1225
msgid " -V, --version display the version number and exit"
msgstr " -V, --version Stampa il numero della versione ed esce"
-#: src/xz/message.c:1228
+#: ../src/xz/message.c:1227
msgid ""
"\n"
"With no FILE, or when FILE is -, read standard input.\n"
@@ -792,51 +827,51 @@ msgstr ""
#. for this package. Please add _another line_ saying
#. "Report translation bugs to <...>\n" with the email or WWW
#. address for translation bugs. Thanks.
-#: src/xz/message.c:1234
+#: ../src/xz/message.c:1233
#, c-format
msgid "Report bugs to <%s> (in English or Finnish).\n"
msgstr ""
"Segnalare i bug a <%s> (in inglese o finlandese).\n"
"Segnalare i bug di traduzione a <tp@lists.linux.it>.\n"
-#: src/xz/message.c:1236
+#: ../src/xz/message.c:1235
#, c-format
msgid "%s home page: <%s>\n"
msgstr "Sito web di %s: <%s>\n"
-#: src/xz/options.c:86
+#: ../src/xz/options.c:86
#, c-format
msgid "%s: Options must be `name=value' pairs separated with commas"
msgstr ""
"%s: le opzioni devono essere coppie \"nome=valore\" separate da virgole"
-#: src/xz/options.c:93
+#: ../src/xz/options.c:93
#, c-format
msgid "%s: Invalid option name"
msgstr "%s: nome opzione non valido"
-#: src/xz/options.c:113
+#: ../src/xz/options.c:113
#, c-format
msgid "%s: Invalid option value"
msgstr "%s: valore dell'opzione non valido"
-#: src/xz/options.c:247
+#: ../src/xz/options.c:247
#, c-format
msgid "Unsupported LZMA1/LZMA2 preset: %s"
msgstr "Preset LZMA/LZMA2 non supportato: %s"
-#: src/xz/options.c:355
+#: ../src/xz/options.c:355
msgid "The sum of lc and lp must not exceed 4"
msgstr "La somma di lc e lp non deve superare 4"
-#: src/xz/options.c:359
+#: ../src/xz/options.c:359
#, c-format
msgid "The selected match finder requires at least nice=%<PRIu32>"
msgstr ""
-"Lo strumento per cercare corrispondenze selezionato richiede almeno nice=%"
-"<PRIu32>"
+"Lo strumento per cercare corrispondenze selezionato richiede almeno nice="
+"%<PRIu32>"
-#: src/xz/suffix.c:79 src/xz/suffix.c:164
+#: ../src/xz/suffix.c:101 ../src/xz/suffix.c:194
#, c-format
msgid ""
"%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
@@ -844,59 +879,59 @@ msgstr ""
"%s: con --format=raw, --suffix=.SUF è richiesto a meno che non si scriva "
"sullo stdout"
-#: src/xz/suffix.c:99
+#: ../src/xz/suffix.c:121
#, c-format
msgid "%s: Filename has an unknown suffix, skipping"
msgstr "%s: il nome del file ha un suffisso sconosciuto, viene saltato"
-#: src/xz/suffix.c:154
+#: ../src/xz/suffix.c:175 ../src/xz/suffix.c:184
#, c-format
msgid "%s: File already has `%s' suffix, skipping"
msgstr "%s: il file ha già il suffisso \"%s\", viene saltato"
-#: src/xz/suffix.c:205
+#: ../src/xz/suffix.c:235
#, c-format
msgid "%s: Invalid filename suffix"
msgstr "%s: suffisso del nome del file non valido"
-#: src/xz/util.c:61
+#: ../src/xz/util.c:61
#, c-format
msgid "%s: Value is not a non-negative decimal integer"
msgstr "%s: il valore non è un numero intero decimale non-negativo"
-#: src/xz/util.c:103
+#: ../src/xz/util.c:103
#, c-format
msgid "%s: Invalid multiplier suffix"
msgstr "%s: suffisso del moltiplicatore non valido"
-#: src/xz/util.c:105
+#: ../src/xz/util.c:105
msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
msgstr ""
"I suffissi validi sono \"KiB\" (2^10), \"MiB\" (2^20), e \"GiB\" (2^30)."
-#: src/xz/util.c:122
+#: ../src/xz/util.c:122
#, c-format
msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
msgstr ""
-"Il valore dell'opzione \"%s\" deve essere nell'intervallo [%<PRIu64>, %"
-"<PRIu64>]"
+"Il valore dell'opzione \"%s\" deve essere nell'intervallo [%<PRIu64>, "
+"%<PRIu64>]"
-#: src/xz/util.c:247
+#: ../src/xz/util.c:247
msgid "Empty filename, skipping"
msgstr "Nome file vuoto, viene saltato"
-#: src/xz/util.c:261
+#: ../src/xz/util.c:261
msgid "Compressed data cannot be read from a terminal"
msgstr "I dati compressi non possono essere letti da un terminale"
-#: src/xz/util.c:274
+#: ../src/xz/util.c:274
msgid "Compressed data cannot be written to a terminal"
msgstr "I dati compressi non possono essere scritti ad un terminale"
-#: src/common/tuklib_exit.c:39
+#: ../src/common/tuklib_exit.c:39
msgid "Writing to standard output failed"
msgstr "Scrittura sullo standard ouput non riuscita"
-#: src/common/tuklib_exit.c:42
+#: ../src/common/tuklib_exit.c:42
msgid "Unknown error"
msgstr "Errore sconosciuto"
diff --git a/contrib/xz/po/pl.po b/contrib/xz/po/pl.po
new file mode 100644
index 0000000..f359fae
--- /dev/null
+++ b/contrib/xz/po/pl.po
@@ -0,0 +1,825 @@
+# Polish translation for xz.
+# This file is in the public domain.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: xz 5.0.1\n"
+"Report-Msgid-Bugs-To: lasse.collin@tukaani.org\n"
+"POT-Creation-Date: 2011-01-28 20:01+0200\n"
+"PO-Revision-Date: 2011-02-02 16:51+0100\n"
+"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: src/xz/args.c:333
+#, c-format
+msgid "%s: Unknown file format type"
+msgstr "%s: Nieznany typ formatu pliku"
+
+#: src/xz/args.c:356 src/xz/args.c:364
+#, c-format
+msgid "%s: Unsupported integrity check type"
+msgstr "%s: Nieobsługiwany typ kontroli spójności"
+
+#: src/xz/args.c:382
+msgid "Only one file can be specified with `--files' or `--files0'."
+msgstr "Wraz z opcją `--files' lub `--files0' można podać tylko jeden plik."
+
+#: src/xz/args.c:445
+#, c-format
+msgid "The environment variable %s contains too many arguments"
+msgstr "Zmienna środowiskowa %s zawiera zbyt dużo argumentów"
+
+#: src/xz/coder.c:95
+msgid "Maximum number of filters is four"
+msgstr "Maksymalna liczba filtrów to cztery"
+
+#: src/xz/coder.c:108
+msgid "Memory usage limit is too low for the given filter setup."
+msgstr "Limit użycia pamięci jest zbyt mały dla podanej konfiguracji filtra."
+
+#: src/xz/coder.c:129
+msgid "Using a preset in raw mode is discouraged."
+msgstr "Użycie ustawień predefiniowanych w trybie surowym jest odradzane."
+
+#: src/xz/coder.c:131
+msgid "The exact options of the presets may vary between software versions."
+msgstr "Dokładne opcje ustawień predefiniowanych mogą różnić się między wersjami oprogramowania."
+
+#: src/xz/coder.c:157
+msgid "The .lzma format supports only the LZMA1 filter"
+msgstr "Format .lzma obsługuje tylko filtr LZMA1"
+
+#: src/xz/coder.c:165
+msgid "LZMA1 cannot be used with the .xz format"
+msgstr "LZMA1 nie może być używany z formatem .xz"
+
+#: src/xz/coder.c:182
+msgid "Unsupported filter chain or filter options"
+msgstr "Nieobsługiwany łańcuch filtrów lub opcje filtra"
+
+#: src/xz/coder.c:190
+#, c-format
+msgid "Decompression will need %s MiB of memory."
+msgstr "Dekompresja będzie wymagała %s MiB pamięci."
+
+#: src/xz/coder.c:247
+#, c-format
+msgid "Adjusted LZMA%c dictionary size from %s MiB to %s MiB to not exceed the memory usage limit of %s MiB"
+msgstr "Skorygowano rozmiar słownika LZMA%c z %s MiB do %s MiB aby nie przekroczyć limitu użycia pamięci %s MiB"
+
+#. TRANSLATORS: When compression or decompression finishes,
+#. and xz is going to remove the source file, xz first checks
+#. if the source file still exists, and if it does, does its
+#. device and inode numbers match what xz saw when it opened
+#. the source file. If these checks fail, this message is
+#. shown, %s being the filename, and the file is not deleted.
+#. The check for device and inode numbers is there, because
+#. it is possible that the user has put a new file in place
+#. of the original file, and in that case it obviously
+#. shouldn't be removed.
+#: src/xz/file_io.c:137
+#, c-format
+msgid "%s: File seems to have been moved, not removing"
+msgstr "%s: Plik wygląda na przeniesiony, nie zostanie usunięty"
+
+#: src/xz/file_io.c:144 src/xz/file_io.c:589
+#, c-format
+msgid "%s: Cannot remove: %s"
+msgstr "%s: Nie można usunąć: %s"
+
+#: src/xz/file_io.c:169
+#, c-format
+msgid "%s: Cannot set the file owner: %s"
+msgstr "%s: Nie można ustawić właściciela pliku: %s"
+
+#: src/xz/file_io.c:175
+#, c-format
+msgid "%s: Cannot set the file group: %s"
+msgstr "%s: Nie można ustawić grupy pliku: %s"
+
+#: src/xz/file_io.c:194
+#, c-format
+msgid "%s: Cannot set the file permissions: %s"
+msgstr "%s: Nie można ustawić uprawnień pliku: %s"
+
+#: src/xz/file_io.c:337 src/xz/file_io.c:420
+#, c-format
+msgid "%s: Is a symbolic link, skipping"
+msgstr "%s: Jest dowiązaniem symbolicznym, pominięto"
+
+#: src/xz/file_io.c:455
+#, c-format
+msgid "%s: Is a directory, skipping"
+msgstr "%s: Jest katalogiem, pominięto"
+
+#: src/xz/file_io.c:461
+#, c-format
+msgid "%s: Not a regular file, skipping"
+msgstr "%s: Nie jest zwykłym plikiem, pominięto"
+
+#: src/xz/file_io.c:478
+#, c-format
+msgid "%s: File has setuid or setgid bit set, skipping"
+msgstr "%s: Plik ma ustawiony bit setuid lub setgid, pominięto"
+
+#: src/xz/file_io.c:485
+#, c-format
+msgid "%s: File has sticky bit set, skipping"
+msgstr "%s: Plik ma ustawiony bit sticky, pominięto"
+
+#: src/xz/file_io.c:492
+#, c-format
+msgid "%s: Input file has more than one hard link, skipping"
+msgstr "%s: Plik wejściowy ma więcej niż jedno dowiązanie zwykłe, pominięto"
+
+#: src/xz/file_io.c:713
+#, c-format
+msgid "Error restoring the O_APPEND flag to standard output: %s"
+msgstr "Błąd podczas odtwarzania flagi O_APPEND dla standardowego wyjścia: %s"
+
+#: src/xz/file_io.c:725
+#, c-format
+msgid "%s: Closing the file failed: %s"
+msgstr "%s: Zamknięcie pliku nie powiodło się: %s"
+
+#: src/xz/file_io.c:761 src/xz/file_io.c:945
+#, c-format
+msgid "%s: Seeking failed when trying to create a sparse file: %s"
+msgstr "%s: Zmiana pozycji nie powiodła się podczas próby utworzenia pliku rzadkiego: %s"
+
+#: src/xz/file_io.c:820
+#, c-format
+msgid "%s: Read error: %s"
+msgstr "%s: BÅ‚Ä…d odczytu: %s"
+
+#: src/xz/file_io.c:843
+#, c-format
+msgid "%s: Error seeking the file: %s"
+msgstr "%s: BÅ‚Ä…d podczas zmiany pozycji w pliku: %s"
+
+#: src/xz/file_io.c:853
+#, c-format
+msgid "%s: Unexpected end of file"
+msgstr "%s: Nieoczekiwany koniec pliku"
+
+#: src/xz/file_io.c:903
+#, c-format
+msgid "%s: Write error: %s"
+msgstr "%s: BÅ‚Ä…d zapisu: %s"
+
+#: src/xz/hardware.c:100
+msgid "Disabled"
+msgstr "Wyłączony"
+
+#. TRANSLATORS: Test with "xz --info-memory" to see if
+#. the alignment looks nice.
+#: src/xz/hardware.c:119
+msgid "Total amount of physical memory (RAM): "
+msgstr "Całkowita ilość pamięci fizycznej (RAM): "
+
+#: src/xz/hardware.c:121
+msgid "Memory usage limit for compression: "
+msgstr "Limit użycia pamięci dla kompresji: "
+
+#: src/xz/hardware.c:123
+msgid "Memory usage limit for decompression: "
+msgstr "Limit użycia pamięci dla dekompresji: "
+
+#. TRANSLATORS: Indicates that there is no integrity check.
+#. This string is used in tables, so the width must not
+#. exceed ten columns with a fixed-width font.
+#: src/xz/list.c:62
+msgid "None"
+msgstr "Brak"
+
+#. TRANSLATORS: Indicates that integrity check name is not known,
+#. but the Check ID is known (here 2). This and other "Unknown-N"
+#. strings are used in tables, so the width must not exceed ten
+#. columns with a fixed-width font. It's OK to omit the dash if
+#. you need space for one extra letter, but don't use spaces.
+#: src/xz/list.c:69
+msgid "Unknown-2"
+msgstr "Nieznany-2"
+
+#: src/xz/list.c:70
+msgid "Unknown-3"
+msgstr "Nieznany-3"
+
+#: src/xz/list.c:72
+msgid "Unknown-5"
+msgstr "Nieznany-5"
+
+#: src/xz/list.c:73
+msgid "Unknown-6"
+msgstr "Nieznany-6"
+
+#: src/xz/list.c:74
+msgid "Unknown-7"
+msgstr "Nieznany-7"
+
+#: src/xz/list.c:75
+msgid "Unknown-8"
+msgstr "Nieznany-8"
+
+#: src/xz/list.c:76
+msgid "Unknown-9"
+msgstr "Nieznany-9"
+
+#: src/xz/list.c:78
+msgid "Unknown-11"
+msgstr "Nieznany11"
+
+#: src/xz/list.c:79
+msgid "Unknown-12"
+msgstr "Nieznany12"
+
+#: src/xz/list.c:80
+msgid "Unknown-13"
+msgstr "Nieznany13"
+
+#: src/xz/list.c:81
+msgid "Unknown-14"
+msgstr "Nieznany14"
+
+#: src/xz/list.c:82
+msgid "Unknown-15"
+msgstr "Nieznany15"
+
+#: src/xz/list.c:126
+#, c-format
+msgid "%s: File is empty"
+msgstr "%s: Plik jest pusty"
+
+#: src/xz/list.c:131
+#, c-format
+msgid "%s: Too small to be a valid .xz file"
+msgstr "%s: Za mały na poprawny plik .xz"
+
+#. TRANSLATORS: These are column headings. From Strms (Streams)
+#. to Ratio, the columns are right aligned. Check and Filename
+#. are left aligned. If you need longer words, it's OK to
+#. use two lines here. Test with "xz -l foo.xz".
+#: src/xz/list.c:612
+msgid "Strms Blocks Compressed Uncompressed Ratio Check Filename"
+msgstr "Strum. Bloki Spakowany Rozpakowany Wsp. Kontrola Nazwa pliku"
+
+#: src/xz/list.c:652
+#, c-format
+msgid " Streams: %s\n"
+msgstr " Strumienie: %s\n"
+
+#: src/xz/list.c:654
+#, c-format
+msgid " Blocks: %s\n"
+msgstr " Bloki: %s\n"
+
+#: src/xz/list.c:656
+#, c-format
+msgid " Compressed size: %s\n"
+msgstr " Rozmiar spakowany: %s\n"
+
+#: src/xz/list.c:659
+#, c-format
+msgid " Uncompressed size: %s\n"
+msgstr " Rozmiar rozpakowany: %s\n"
+
+#: src/xz/list.c:662
+#, c-format
+msgid " Ratio: %s\n"
+msgstr " Współczynnik: %s\n"
+
+#: src/xz/list.c:664
+#, c-format
+msgid " Check: %s\n"
+msgstr " Kontrola spójności: %s\n"
+
+#: src/xz/list.c:665
+#, c-format
+msgid " Stream padding: %s\n"
+msgstr " Wyrównanie strumienia: %s\n"
+
+#. TRANSLATORS: The second line is column headings. All except
+#. Check are right aligned; Check is left aligned. Test with
+#. "xz -lv foo.xz".
+#: src/xz/list.c:693
+msgid ""
+" Streams:\n"
+" Stream Blocks CompOffset UncompOffset CompSize UncompSize Ratio Check Padding"
+msgstr ""
+" Strumienie:\n"
+" Strumień Bloki Offset spak. Offset rozp. Rozm.spak. Rozm.rozp. Wsp. Kontrola Wyrównanie"
+
+#. TRANSLATORS: The second line is column headings. All
+#. except Check are right aligned; Check is left aligned.
+#: src/xz/list.c:748
+#, c-format
+msgid ""
+" Blocks:\n"
+" Stream Block CompOffset UncompOffset TotalSize UncompSize Ratio Check"
+msgstr ""
+" Bloki:\n"
+" Strumień Blok Offset spak. Offset rozp. Rozm.całkowity Rozm.rozp. Wsp. Kontrola"
+
+#. TRANSLATORS: These are additional column headings
+#. for the most verbose listing mode. CheckVal
+#. (Check value), Flags, and Filters are left aligned.
+#. Header (Block Header Size), CompSize, and MemUsage
+#. are right aligned. %*s is replaced with 0-120
+#. spaces to make the CheckVal column wide enough.
+#. Test with "xz -lvv foo.xz".
+#: src/xz/list.c:760
+#, c-format
+msgid " CheckVal %*s Header Flags CompSize MemUsage Filters"
+msgstr " S.kontr. %*sNagłówek Flagi Rozm. spak. Uż.pamięci Filtry"
+
+#: src/xz/list.c:838 src/xz/list.c:1007
+#, c-format
+msgid " Memory needed: %s MiB\n"
+msgstr " Wymagana pamięć: %s MiB\n"
+
+#: src/xz/list.c:840 src/xz/list.c:1009
+#, c-format
+msgid " Sizes in headers: %s\n"
+msgstr " Rozmiar w nagłówkach: %s\n"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "Yes"
+msgstr "Tak"
+
+#: src/xz/list.c:841 src/xz/list.c:1010
+msgid "No"
+msgstr "Nie"
+
+#. TRANSLATORS: %s is an integer. Only the plural form of this
+#. message is used (e.g. "2 files"). Test with "xz -l foo.xz bar.xz".
+#: src/xz/list.c:986
+#, c-format
+msgid "%s file\n"
+msgid_plural "%s files\n"
+msgstr[0] "%s plik\n"
+msgstr[1] "%s pliki\n"
+msgstr[2] "%s plików\n"
+
+#: src/xz/list.c:999
+msgid "Totals:"
+msgstr "Sumarycznie:"
+
+#: src/xz/list.c:1000
+#, c-format
+msgid " Number of files: %s\n"
+msgstr " Liczba plików: %s\n"
+
+#: src/xz/list.c:1072
+msgid "--list works only on .xz files (--format=xz or --format=auto)"
+msgstr "--list działa tylko z plikami .xz (--format=xz lub --format=auto)"
+
+#: src/xz/list.c:1078
+msgid "--list does not support reading from standard input"
+msgstr "--list nie obsługuje odczytu ze standardowego wejścia"
+
+#: src/xz/main.c:89
+#, c-format
+msgid "%s: Error reading filenames: %s"
+msgstr "%s: Błąd odczytu nazw plików: %s"
+
+#: src/xz/main.c:96
+#, c-format
+msgid "%s: Unexpected end of input when reading filenames"
+msgstr "%s: Nieoczekiwany koniec wejścia podczas odczytu nazw plików"
+
+#: src/xz/main.c:120
+#, c-format
+msgid "%s: Null character found when reading filenames; maybe you meant to use `--files0' instead of `--files'?"
+msgstr "%s: Napotkano znak NUL podczas odczytu nazw plików; może miało być `--files0' zamiast `--files'?"
+
+#: src/xz/main.c:174
+msgid "Compression and decompression with --robot are not supported yet."
+msgstr "Kompresja i dekompresja z opcją --robot nie jest jeszcze obsługiwana."
+
+#: src/xz/main.c:231
+msgid "Cannot read data from standard input when reading filenames from standard input"
+msgstr "Nie można odczytać danych ze standardowego wejścia przy czytaniu nazw plików ze standardowego wejścia"
+
+#: src/xz/message.c:792 src/xz/message.c:842
+msgid "Internal error (bug)"
+msgstr "Błąd wewnętrzny"
+
+#: src/xz/message.c:799
+msgid "Cannot establish signal handlers"
+msgstr "Nie można ustawić obsługi sygnałów"
+
+#: src/xz/message.c:808
+msgid "No integrity check; not verifying file integrity"
+msgstr "Brak kontroli spójności; poprawność plików nie będzie weryfikowana"
+
+#: src/xz/message.c:811
+msgid "Unsupported type of integrity check; not verifying file integrity"
+msgstr "Nieobsługiwany typ kontroli spójności; poprawność plików nie będzie weryfikowana"
+
+#: src/xz/message.c:818
+msgid "Memory usage limit reached"
+msgstr "Osiągnięto limit użycia pamięci"
+
+#: src/xz/message.c:821
+msgid "File format not recognized"
+msgstr "Nie rozpoznany format pliku"
+
+#: src/xz/message.c:824
+msgid "Unsupported options"
+msgstr "Nieobsługiwane opcje"
+
+#: src/xz/message.c:827
+msgid "Compressed data is corrupt"
+msgstr "Dane skompresowane sÄ… uszkodzone"
+
+#: src/xz/message.c:830
+msgid "Unexpected end of input"
+msgstr "Nieoczekiwany koniec wejścia"
+
+#: src/xz/message.c:881
+#, c-format
+msgid "%s MiB of memory is required. The limit is %s."
+msgstr "Wymagane jest %s MiB pamięci. Limit to %s."
+
+#: src/xz/message.c:1048
+#, c-format
+msgid "%s: Filter chain: %s\n"
+msgstr "%s: ÅaÅ„cuch filtrów: %s\n"
+
+#: src/xz/message.c:1058
+#, c-format
+msgid "Try `%s --help' for more information."
+msgstr "Polecenie `%s --help' pokaże więcej informacji."
+
+#: src/xz/message.c:1084
+#, c-format
+msgid ""
+"Usage: %s [OPTION]... [FILE]...\n"
+"Compress or decompress FILEs in the .xz format.\n"
+"\n"
+msgstr ""
+"Składnia: %s [OPCJA]... [PLIK]...\n"
+"Kompresja lub dekompresja PLIKÓW w formacie .xz.\n"
+"\n"
+
+#: src/xz/message.c:1091
+msgid "Mandatory arguments to long options are mandatory for short options too.\n"
+msgstr ""
+"Argumenty obowiązkowe dla opcji długich są obowiązkowe również dla opcji\n"
+"krótkich.\n"
+
+#: src/xz/message.c:1095
+msgid " Operation mode:\n"
+msgstr " Tryb pracy:\n"
+
+#: src/xz/message.c:1098
+msgid ""
+" -z, --compress force compression\n"
+" -d, --decompress force decompression\n"
+" -t, --test test compressed file integrity\n"
+" -l, --list list information about .xz files"
+msgstr ""
+" -z, --compress wymuszenie kompresji\n"
+" -d, --decompress wymuszenie dekompresji\n"
+" -t, --test sprawdzenie spójności plików skompresowanych\n"
+" -l, --list wypisanie informacji o plikach .xz"
+
+#: src/xz/message.c:1104
+msgid ""
+"\n"
+" Operation modifiers:\n"
+msgstr ""
+"\n"
+" Modyfikatory operacji:\n"
+
+#: src/xz/message.c:1107
+msgid ""
+" -k, --keep keep (don't delete) input files\n"
+" -f, --force force overwrite of output file and (de)compress links\n"
+" -c, --stdout write to standard output and don't delete input files"
+msgstr ""
+" -k, --keep zachowanie (nieusuwanie) plików wejściowych\n"
+" -f, --force nadpisywanie plików wyjściowych i (de)kompresja dowiązań\n"
+" -c, --stdout zapis na standardowe wyjście, nieusuwanie plików wej."
+
+#: src/xz/message.c:1113
+msgid ""
+" --no-sparse do not create sparse files when decompressing\n"
+" -S, --suffix=.SUF use the suffix `.SUF' on compressed files\n"
+" --files[=FILE] read filenames to process from FILE; if FILE is\n"
+" omitted, filenames are read from the standard input;\n"
+" filenames must be terminated with the newline character\n"
+" --files0[=FILE] like --files but use the null character as terminator"
+msgstr ""
+" --no-sparse nietworzenie plików rzadkich podczas dekompresji\n"
+" -S, --suffix=.ROZ użycie rozszerzenia `.ROZ' dla plików skompresowanych\n"
+" --files[=PLIK] odczyt nazw plików do przetworzenia z PLIKU; jeśli PLIK\n"
+" nie został podany, nazwy są czytane ze standardowego\n"
+" wejścia; muszą być zakończone znakiem nowej linii\n"
+" --files0[=PLIK] podobnie do --files, ale znakiem kończącym musi być NUL"
+
+#: src/xz/message.c:1121
+msgid ""
+"\n"
+" Basic file format and compression options:\n"
+msgstr ""
+"\n"
+" Podstawowe opcje formatu pliku i kompresji:\n"
+
+#: src/xz/message.c:1123
+msgid ""
+" -F, --format=FMT file format to encode or decode; possible values are\n"
+" `auto' (default), `xz', `lzma', and `raw'\n"
+" -C, --check=CHECK integrity check type: `none' (use with caution),\n"
+" `crc32', `crc64' (default), or `sha256'"
+msgstr ""
+" -F, --format=FORM format pliki do kodowania lub dekodowania; możliwe to\n"
+" `auto' (domyślny), `xz', 'lzma' i `raw'\n"
+" -C, --check=TEST typ kontroli spójności: `none' (ostrożnie!),\n"
+" `crc32', `crc64' (domyślny) lub `sha256'"
+
+#: src/xz/message.c:1130
+msgid ""
+" -0 ... -9 compression preset; default is 6; take compressor *and*\n"
+" decompressor memory usage into account before using 7-9!"
+msgstr ""
+" -0 ... -9 predefiniowane opcje kompresji; domyślna to 6; przed\n"
+" użyciem wartości 7-9 należy wziąć pod uwagę wykorzystanie\n"
+" pamięci przy kompresji *oraz* dekompresji!"
+
+#: src/xz/message.c:1134
+msgid ""
+" -e, --extreme try to improve compression ratio by using more CPU time;\n"
+" does not affect decompressor memory requirements"
+msgstr ""
+" -e, --extreme próba poprawy współczynnika kompresji z użyciem większej\n"
+" ilości czasu procesora; nie wpływa na wymagania\n"
+" pamięciowe dekompresora"
+
+#: src/xz/message.c:1139
+#, no-c-format
+msgid ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" set memory usage limit for compression, decompression,\n"
+" or both; LIMIT is in bytes, % of RAM, or 0 for defaults"
+msgstr ""
+" --memlimit-compress=LIMIT\n"
+" --memlimit-decompress=LIMIT\n"
+" -M, --memlimit=LIMIT\n"
+" ustawienie limitu użycia pamięci dla kompresji,\n"
+" dekompresji lub obu; LIMIT jest w bajtach, % RAM lub 0\n"
+" dla limitów domyślnych"
+
+#: src/xz/message.c:1146
+msgid ""
+" --no-adjust if compression settings exceed the memory usage limit,\n"
+" give an error instead of adjusting the settings downwards"
+msgstr ""
+" --no-adjust jeśli ustawienia kompresji przekraczają limit użycia\n"
+" pamięci, zostanie zgłoszony błąd zamiast zmniejszania\n"
+" ustawień"
+
+#: src/xz/message.c:1152
+msgid ""
+"\n"
+" Custom filter chain for compression (alternative for using presets):"
+msgstr ""
+"\n"
+" ÅaÅ„cuch wÅ‚asnych filtrów do kompresji (alternatywa do używania -0 .. -9):"
+
+#: src/xz/message.c:1161
+msgid ""
+"\n"
+" --lzma1[=OPTS] LZMA1 or LZMA2; OPTS is a comma-separated list of zero or\n"
+" --lzma2[=OPTS] more of the following options (valid values; default):\n"
+" preset=PRE reset options to a preset (0-9[e])\n"
+" dict=NUM dictionary size (4KiB - 1536MiB; 8MiB)\n"
+" lc=NUM number of literal context bits (0-4; 3)\n"
+" lp=NUM number of literal position bits (0-4; 0)\n"
+" pb=NUM number of position bits (0-4; 2)\n"
+" mode=MODE compression mode (fast, normal; normal)\n"
+" nice=NUM nice length of a match (2-273; 64)\n"
+" mf=NAME match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=NUM maximum search depth; 0=automatic (default)"
+msgstr ""
+"\n"
+" --lzma1[=OPCJE] LZMA1 lub LZMA2; OPCJE to oddzielona przecinkami lista\n"
+" --lzma2[=OPCJE] zera lub więcej następujących opcji (w nawiasach wartości\n"
+" poprawne; domyślne):\n"
+" preset=PRE ustawienie opcji na predefiniowane (0-9[e])\n"
+" dict=ILE rozmiar słownika (4KiB - 1536MiB; 8MiB)\n"
+" lc=ILE liczba bitów kontekstu literału (0-4; 3)\n"
+" lp=ILE liczba bitów pozycji literału (0-4; 0)\n"
+" pp=ILE liczba bitów pozycji (0-4; 2)\n"
+" mode=TRYB tryb kompresji (fast, normal; normal)\n"
+" nice=ILE długość dopasowania (2-273; 64)\n"
+" mf=NAZWA dopasowywacz (hc3, hc4, bt2, bt3, bt4; bt4)\n"
+" depth=ILE maks. głębokość szukania; 0=auto (domyślne)"
+
+#: src/xz/message.c:1176
+msgid ""
+"\n"
+" --x86[=OPTS] x86 BCJ filter (32-bit and 64-bit)\n"
+" --powerpc[=OPTS] PowerPC BCJ filter (big endian only)\n"
+" --ia64[=OPTS] IA-64 (Itanium) BCJ filter\n"
+" --arm[=OPTS] ARM BCJ filter (little endian only)\n"
+" --armthumb[=OPTS] ARM-Thumb BCJ filter (little endian only)\n"
+" --sparc[=OPTS] SPARC BCJ filter\n"
+" Valid OPTS for all BCJ filters:\n"
+" start=NUM start offset for conversions (default=0)"
+msgstr ""
+"\n"
+" --x86[=OPCJE] Filtr BCJ x86 (32-bitowy lub 64-bitowy)\n"
+" --powerpc[=OPCJE] Filtr BCJ PowerPC (tylko big-endian)\n"
+" --ia64[=OPCJE] Filtr BCJ IA-64 (Itanium)\n"
+" --arm[=OPCJE] Filtr BCJ ARM (tylko little-endian)\n"
+" --armthumb[=OPCJE] Filtr BCJ ARM-Thumb (tylko little-endian)\n"
+" --sparc[=OPCJE] Filtr BCJ SPARC\n"
+" Poprawne OPCJE dla wszystkich filtrów BCJ:\n"
+" start=ILE offset początku konwersji (domyślnie=0)"
+
+#: src/xz/message.c:1188
+msgid ""
+"\n"
+" --delta[=OPTS] Delta filter; valid OPTS (valid values; default):\n"
+" dist=NUM distance between bytes being subtracted\n"
+" from each other (1-256; 1)"
+msgstr ""
+"\n"
+" --delta[=OPCJE] Filtr delta; poprawne OPCJE (poprawne wart.; domyślne):\n"
+" dist=ILE odległość między bajtami odejmowanymi od\n"
+" siebie (1-256; 1)"
+
+#: src/xz/message.c:1196
+msgid ""
+"\n"
+" Other options:\n"
+msgstr ""
+"\n"
+" Inne opcje:\n"
+
+#: src/xz/message.c:1199
+msgid ""
+" -q, --quiet suppress warnings; specify twice to suppress errors too\n"
+" -v, --verbose be verbose; specify twice for even more verbose"
+msgstr ""
+" -q, --quiet pominięcie ostrzeżeń; dwukrotne podanie pomija też błędy\n"
+" -v, --verbose więcej informacji; dwukrotne podanie to jeszcze więcej"
+
+#: src/xz/message.c:1204
+msgid " -Q, --no-warn make warnings not affect the exit status"
+msgstr " -Q, --no-warn ostrzeżenia nie mają wpływu na status zakończenia"
+
+#: src/xz/message.c:1206
+msgid " --robot use machine-parsable messages (useful for scripts)"
+msgstr " --robot komunikaty w formacie dla maszyny (do skryptów)"
+
+#: src/xz/message.c:1209
+msgid ""
+" --info-memory display the total amount of RAM and the currently active\n"
+" memory usage limits, and exit"
+msgstr ""
+" --info-memory wyświetlenie całkowitej ilości pamięci RAM oraz aktualnie\n"
+" aktywnych limitów pamięci i zakończenie pracy"
+
+#: src/xz/message.c:1212
+msgid ""
+" -h, --help display the short help (lists only the basic options)\n"
+" -H, --long-help display this long help and exit"
+msgstr ""
+" -h, --help wyświetlenie krótkiego opisu (tylko podstawowe opcje)\n"
+" -H, --long-help wyświetlenie tego długiego opisu i zakończenie"
+
+#: src/xz/message.c:1216
+msgid ""
+" -h, --help display this short help and exit\n"
+" -H, --long-help display the long help (lists also the advanced options)"
+msgstr ""
+" -h, --help wyświetlenie tego krótkiego opisu i zakończenie\n"
+" -H, --long-help wyświetlenie długiego opisu (także opcje zaawansowane)"
+
+#: src/xz/message.c:1221
+msgid " -V, --version display the version number and exit"
+msgstr " -V, --version wyświetlenie informacji o wersji i zakończenie"
+
+#: src/xz/message.c:1223
+msgid ""
+"\n"
+"With no FILE, or when FILE is -, read standard input.\n"
+msgstr ""
+"\n"
+"Jeśli nie podano PLIKU lub PLIK to -, czytane jest standardowe wejście.\n"
+
+#. TRANSLATORS: This message indicates the bug reporting address
+#. for this package. Please add _another line_ saying
+#. "Report translation bugs to <...>\n" with the email or WWW
+#. address for translation bugs. Thanks.
+#: src/xz/message.c:1229
+#, c-format
+msgid "Report bugs to <%s> (in English or Finnish).\n"
+msgstr ""
+"Błędy prosimy zgłaszać na adres <%s>\n"
+"(w języku angielskim lub fińskim).\n"
+"Błędy w tłumaczeniu prosimy zgłaszać na adres\n"
+"<translation-team-pl@lists.sourceforge.net>.\n"
+
+#: src/xz/message.c:1231
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Strona domowa %s: <%s>\n"
+
+#: src/xz/options.c:86
+#, c-format
+msgid "%s: Options must be `name=value' pairs separated with commas"
+msgstr "%s: Opcje muszą być parami `nazwa=wartość' rozdzielonymi przecinkami"
+
+#: src/xz/options.c:93
+#, c-format
+msgid "%s: Invalid option name"
+msgstr "%s: Błędna nazwa opcji"
+
+#: src/xz/options.c:113
+#, c-format
+msgid "%s: Invalid option value"
+msgstr "%s: Błędna wartość opcji"
+
+#: src/xz/options.c:247
+#, c-format
+msgid "Unsupported LZMA1/LZMA2 preset: %s"
+msgstr "Nieobsługiwane ustawienie predefiniowane LZMA1/LZMA2: %s"
+
+#: src/xz/options.c:355
+msgid "The sum of lc and lp must not exceed 4"
+msgstr "Suma lc i lp nie może przekroczyć 4"
+
+#: src/xz/options.c:359
+#, c-format
+msgid "The selected match finder requires at least nice=%<PRIu32>"
+msgstr "Wybrany dopasowywacz wymaga przynajmniej nice=%<PRIu32>"
+
+#: src/xz/suffix.c:104 src/xz/suffix.c:189
+#, c-format
+msgid "%s: With --format=raw, --suffix=.SUF is required unless writing to stdout"
+msgstr "%s: Przy --format=raw i zapisie do pliku wymagana jest opcja --suffix=.ROZ"
+
+#: src/xz/suffix.c:124
+#, c-format
+msgid "%s: Filename has an unknown suffix, skipping"
+msgstr "%s: Nazwa pliku ma nieznane rozszerzenie, pominięto"
+
+#: src/xz/suffix.c:179
+#, c-format
+msgid "%s: File already has `%s' suffix, skipping"
+msgstr "%s: Plik już ma rozszerzenie `%s', pominięto"
+
+#: src/xz/suffix.c:230
+#, c-format
+msgid "%s: Invalid filename suffix"
+msgstr "%s: Błędne rozszerzenie nazwy pliku"
+
+#: src/xz/util.c:61
+#, c-format
+msgid "%s: Value is not a non-negative decimal integer"
+msgstr "%s: Wartość nie jest nieujemną liczbą całkowitą"
+
+#: src/xz/util.c:103
+#, c-format
+msgid "%s: Invalid multiplier suffix"
+msgstr "%s: Błędny przyrostek mnożnika"
+
+#: src/xz/util.c:105
+msgid "Valid suffixes are `KiB' (2^10), `MiB' (2^20), and `GiB' (2^30)."
+msgstr "Poprawne przyrostki to `KiB' (2^10), `MiB' (2^20) i `GiB' (2^30)."
+
+#: src/xz/util.c:122
+#, c-format
+msgid "Value of the option `%s' must be in the range [%<PRIu64>, %<PRIu64>]"
+msgstr "Wartość opcji `%s' musi być w przedziale [%<PRIu64>, %<PRIu64>]"
+
+#: src/xz/util.c:247
+msgid "Empty filename, skipping"
+msgstr "Pusta nazwa pliku, pominięto"
+
+#: src/xz/util.c:261
+msgid "Compressed data cannot be read from a terminal"
+msgstr "Dane skompresowane nie mogą być czytane z terminala"
+
+#: src/xz/util.c:274
+msgid "Compressed data cannot be written to a terminal"
+msgstr "Dane skompresowane nie mogą być zapisywane na terminal"
+
+#: src/common/tuklib_exit.c:39
+msgid "Writing to standard output failed"
+msgstr "Zapis na standardowe wyjście nie powiódł się"
+
+#: src/common/tuklib_exit.c:42
+msgid "Unknown error"
+msgstr "Nieznany błąd"
diff --git a/contrib/xz/src/common/tuklib_open_stdxxx.c b/contrib/xz/src/common/tuklib_open_stdxxx.c
index 08bc60d..26702a6 100644
--- a/contrib/xz/src/common/tuklib_open_stdxxx.c
+++ b/contrib/xz/src/common/tuklib_open_stdxxx.c
@@ -39,12 +39,14 @@ tuklib_open_stdxxx(int err_status)
| (i == 0 ? O_WRONLY : O_RDONLY));
if (fd != i) {
+ if (fd != -1)
+ (void)close(fd);
+
// Something went wrong. Exit with the
// exit status we were given. Don't try
// to print an error message, since stderr
// may very well be non-existent. This
// error should be extremely rare.
- (void)close(fd);
exit(err_status);
}
}
diff --git a/contrib/xz/src/liblzma/api/lzma/block.h b/contrib/xz/src/liblzma/api/lzma/block.h
index 3019bf9..8a4bf23 100644
--- a/contrib/xz/src/liblzma/api/lzma/block.h
+++ b/contrib/xz/src/liblzma/api/lzma/block.h
@@ -483,6 +483,7 @@ extern LZMA_API(size_t) lzma_block_buffer_bound(size_t uncompressed_size)
*
* \return - LZMA_OK: Encoding was successful.
* - LZMA_BUF_ERROR: Not enough output buffer space.
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_MEM_ERROR
* - LZMA_DATA_ERROR
diff --git a/contrib/xz/src/liblzma/api/lzma/container.h b/contrib/xz/src/liblzma/api/lzma/container.h
index 83e70b4..7a9ffc6 100644
--- a/contrib/xz/src/liblzma/api/lzma/container.h
+++ b/contrib/xz/src/liblzma/api/lzma/container.h
@@ -66,6 +66,10 @@
* This function is a wrapper for lzma_raw_encoder_memusage().
*
* \param preset Compression preset (level and possible flags)
+ *
+ * \return Number of bytes of memory required for the given
+ * preset when encoding. If an error occurs, for example
+ * due to unsupported preset, UINT64_MAX is returned.
*/
extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset)
lzma_nothrow lzma_attr_pure;
@@ -77,6 +81,11 @@ extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset)
* This function is a wrapper for lzma_raw_decoder_memusage().
*
* \param preset Compression preset (level and possible flags)
+ *
+ * \return Number of bytes of memory required to decompress a file
+ * that was compressed using the given preset. If an error
+ * occurs, for example due to unsupported preset, UINT64_MAX
+ * is returned.
*/
extern LZMA_API(uint64_t) lzma_easy_decoder_memusage(uint32_t preset)
lzma_nothrow lzma_attr_pure;
@@ -148,6 +157,7 @@ extern LZMA_API(lzma_ret) lzma_easy_encoder(
*
* \return - LZMA_OK: Encoding was successful.
* - LZMA_BUF_ERROR: Not enough output buffer space.
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_MEM_ERROR
* - LZMA_DATA_ERROR
@@ -171,6 +181,7 @@ extern LZMA_API(lzma_ret) lzma_easy_buffer_encode(
*
* \return - LZMA_OK: Initialization was successful.
* - LZMA_MEM_ERROR
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_PROG_ERROR
*/
@@ -250,6 +261,7 @@ extern LZMA_API(size_t) lzma_stream_buffer_bound(size_t uncompressed_size)
*
* \return - LZMA_OK: Encoding was successful.
* - LZMA_BUF_ERROR: Not enough output buffer space.
+ * - LZMA_UNSUPPORTED_CHECK
* - LZMA_OPTIONS_ERROR
* - LZMA_MEM_ERROR
* - LZMA_DATA_ERROR
diff --git a/contrib/xz/src/liblzma/api/lzma/filter.h b/contrib/xz/src/liblzma/api/lzma/filter.h
index efd036f..e0bc163 100644
--- a/contrib/xz/src/liblzma/api/lzma/filter.h
+++ b/contrib/xz/src/liblzma/api/lzma/filter.h
@@ -131,7 +131,9 @@ extern LZMA_API(lzma_ret) lzma_filters_copy(const lzma_filter *src,
* .id == LZMA_VLI_UNKNOWN.
*
* \return Number of bytes of memory required for the given
- * filter chain when encoding.
+ * filter chain when encoding. If an error occurs,
+ * for example due to unsupported filter chain,
+ * UINT64_MAX is returned.
*/
extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
lzma_nothrow lzma_attr_pure;
@@ -148,7 +150,9 @@ extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
* .id == LZMA_VLI_UNKNOWN.
*
* \return Number of bytes of memory required for the given
- * filter chain when decoding.
+ * filter chain when decoding. If an error occurs,
+ * for example due to unsupported filter chain,
+ * UINT64_MAX is returned.
*/
extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters)
lzma_nothrow lzma_attr_pure;
diff --git a/contrib/xz/src/liblzma/api/lzma/version.h b/contrib/xz/src/liblzma/api/lzma/version.h
index 43c211f..9226663 100644
--- a/contrib/xz/src/liblzma/api/lzma/version.h
+++ b/contrib/xz/src/liblzma/api/lzma/version.h
@@ -22,7 +22,7 @@
*/
#define LZMA_VERSION_MAJOR 5
#define LZMA_VERSION_MINOR 0
-#define LZMA_VERSION_PATCH 1
+#define LZMA_VERSION_PATCH 3
#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE
#ifndef LZMA_VERSION_COMMIT
diff --git a/contrib/xz/src/liblzma/common/alone_decoder.c b/contrib/xz/src/liblzma/common/alone_decoder.c
index 039b428..678c79e 100644
--- a/contrib/xz/src/liblzma/common/alone_decoder.c
+++ b/contrib/xz/src/liblzma/common/alone_decoder.c
@@ -46,7 +46,7 @@ struct lzma_coder_s {
static lzma_ret
alone_decode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, uint8_t *restrict out,
size_t *restrict out_pos, size_t out_size,
diff --git a/contrib/xz/src/liblzma/common/alone_encoder.c b/contrib/xz/src/liblzma/common/alone_encoder.c
index d8c0170..eb1697e 100644
--- a/contrib/xz/src/liblzma/common/alone_encoder.c
+++ b/contrib/xz/src/liblzma/common/alone_encoder.c
@@ -32,7 +32,7 @@ struct lzma_coder_s {
static lzma_ret
alone_encode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, uint8_t *restrict out,
size_t *restrict out_pos, size_t out_size,
@@ -103,7 +103,7 @@ alone_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
if (options->dict_size < LZMA_DICT_SIZE_MIN)
return LZMA_OPTIONS_ERROR;
- // Round up to to the next 2^n or 2^n + 2^(n - 1) depending on which
+ // Round up to the next 2^n or 2^n + 2^(n - 1) depending on which
// one is the next unless it is UINT32_MAX. While the header would
// allow any 32-bit integer, we do this to keep the decoder of liblzma
// accepting the resulting files.
diff --git a/contrib/xz/src/liblzma/common/block_buffer_encoder.c b/contrib/xz/src/liblzma/common/block_buffer_encoder.c
index a8f71c2..519c6a6 100644
--- a/contrib/xz/src/liblzma/common/block_buffer_encoder.c
+++ b/contrib/xz/src/liblzma/common/block_buffer_encoder.c
@@ -226,16 +226,23 @@ lzma_block_buffer_encode(lzma_block *block, lzma_allocator *allocator,
const uint8_t *in, size_t in_size,
uint8_t *out, size_t *out_pos, size_t out_size)
{
- // Sanity checks
- if (block == NULL || block->filters == NULL
- || (in == NULL && in_size != 0) || out == NULL
+ // Validate the arguments.
+ if (block == NULL || (in == NULL && in_size != 0) || out == NULL
|| out_pos == NULL || *out_pos > out_size)
return LZMA_PROG_ERROR;
- // Check the version field.
+ // The contents of the structure may depend on the version so
+ // check the version before validating the contents of *block.
if (block->version != 0)
return LZMA_OPTIONS_ERROR;
+ if ((unsigned int)(block->check) > LZMA_CHECK_ID_MAX
+ || block->filters == NULL)
+ return LZMA_PROG_ERROR;
+
+ if (!lzma_check_is_supported(block->check))
+ return LZMA_UNSUPPORTED_CHECK;
+
// Size of a Block has to be a multiple of four, so limit the size
// here already. This way we don't need to check it again when adding
// Block Padding.
@@ -243,8 +250,7 @@ lzma_block_buffer_encode(lzma_block *block, lzma_allocator *allocator,
// Get the size of the Check field.
const size_t check_size = lzma_check_size(block->check);
- if (check_size == UINT32_MAX)
- return LZMA_PROG_ERROR;
+ assert(check_size != UINT32_MAX);
// Reserve space for the Check field.
if (out_size - *out_pos <= check_size)
diff --git a/contrib/xz/src/liblzma/common/block_encoder.c b/contrib/xz/src/liblzma/common/block_encoder.c
index ca51523..1eeb502 100644
--- a/contrib/xz/src/liblzma/common/block_encoder.c
+++ b/contrib/xz/src/liblzma/common/block_encoder.c
@@ -144,7 +144,7 @@ block_encoder_end(lzma_coder *coder, lzma_allocator *allocator)
static lzma_ret
block_encoder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters lzma_attribute((unused)),
+ const lzma_filter *filters lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
if (coder->sequence != SEQ_CODE)
@@ -161,6 +161,11 @@ lzma_block_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
{
lzma_next_coder_init(&lzma_block_encoder_init, next, allocator);
+ if (block == NULL)
+ return LZMA_PROG_ERROR;
+
+ // The contents of the structure may depend on the version so
+ // check the version first.
if (block->version != 0)
return LZMA_OPTIONS_ERROR;
diff --git a/contrib/xz/src/liblzma/common/common.c b/contrib/xz/src/liblzma/common/common.c
index 0408e15..b9e3860 100644
--- a/contrib/xz/src/liblzma/common/common.c
+++ b/contrib/xz/src/liblzma/common/common.c
@@ -35,7 +35,7 @@ lzma_version_string(void)
// Memory allocation //
///////////////////////
-extern void * lzma_attribute((malloc))
+extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1)
lzma_alloc(size_t size, lzma_allocator *allocator)
{
// Some malloc() variants return NULL if called with size == 0.
diff --git a/contrib/xz/src/liblzma/common/common.h b/contrib/xz/src/liblzma/common/common.h
index b819432..45aba4f 100644
--- a/contrib/xz/src/liblzma/common/common.h
+++ b/contrib/xz/src/liblzma/common/common.h
@@ -205,7 +205,7 @@ struct lzma_internal_s {
/// Allocates memory
extern void *lzma_alloc(size_t size, lzma_allocator *allocator)
- lzma_attribute((malloc)) lzma_attr_alloc_size(1);
+ lzma_attribute((__malloc__)) lzma_attr_alloc_size(1);
/// Frees memory
extern void lzma_free(void *ptr, lzma_allocator *allocator);
diff --git a/contrib/xz/src/liblzma/common/filter_common.c b/contrib/xz/src/liblzma/common/filter_common.c
index b157c62..7c95b05 100644
--- a/contrib/xz/src/liblzma/common/filter_common.c
+++ b/contrib/xz/src/liblzma/common/filter_common.c
@@ -43,7 +43,7 @@ static const struct {
.changes_size = true,
},
#endif
-#ifdef HAVE_DECODER_LZMA2
+#if defined(HAVE_ENCODER_LZMA2) || defined(HAVE_DECODER_LZMA2)
{
.id = LZMA_FILTER_LZMA2,
.options_size = sizeof(lzma_options_lzma),
@@ -52,7 +52,7 @@ static const struct {
.changes_size = true,
},
#endif
-#ifdef HAVE_DECODER_X86
+#if defined(HAVE_ENCODER_X86) || defined(HAVE_DECODER_X86)
{
.id = LZMA_FILTER_X86,
.options_size = sizeof(lzma_options_bcj),
@@ -70,7 +70,7 @@ static const struct {
.changes_size = false,
},
#endif
-#ifdef HAVE_DECODER_IA64
+#if defined(HAVE_ENCODER_IA64) || defined(HAVE_DECODER_IA64)
{
.id = LZMA_FILTER_IA64,
.options_size = sizeof(lzma_options_bcj),
diff --git a/contrib/xz/src/liblzma/common/index.c b/contrib/xz/src/liblzma/common/index.c
index ddb9d36..9af4bc1 100644
--- a/contrib/xz/src/liblzma/common/index.c
+++ b/contrib/xz/src/liblzma/common/index.c
@@ -398,10 +398,13 @@ extern LZMA_API(lzma_index *)
lzma_index_init(lzma_allocator *allocator)
{
lzma_index *i = index_init_plain(allocator);
+ if (i == NULL)
+ return NULL;
+
index_stream *s = index_stream_init(0, 0, 1, 0, allocator);
- if (i == NULL || s == NULL) {
- index_stream_end(s, allocator);
+ if (s == NULL) {
lzma_free(i, allocator);
+ return NULL;
}
index_tree_append(&i->streams, &s->node);
diff --git a/contrib/xz/src/liblzma/common/index_decoder.c b/contrib/xz/src/liblzma/common/index_decoder.c
index a6bc650..83c8a3af 100644
--- a/contrib/xz/src/liblzma/common/index_decoder.c
+++ b/contrib/xz/src/liblzma/common/index_decoder.c
@@ -56,10 +56,11 @@ struct lzma_coder_s {
static lzma_ret
index_decode(lzma_coder *coder, lzma_allocator *allocator,
const uint8_t *restrict in, size_t *restrict in_pos,
- size_t in_size, uint8_t *restrict out lzma_attribute((unused)),
- size_t *restrict out_pos lzma_attribute((unused)),
- size_t out_size lzma_attribute((unused)),
- lzma_action action lzma_attribute((unused)))
+ size_t in_size,
+ uint8_t *restrict out lzma_attribute((__unused__)),
+ size_t *restrict out_pos lzma_attribute((__unused__)),
+ size_t out_size lzma_attribute((__unused__)),
+ lzma_action action lzma_attribute((__unused__)))
{
// Similar optimization as in index_encoder.c
const size_t in_start = *in_pos;
diff --git a/contrib/xz/src/liblzma/common/index_encoder.c b/contrib/xz/src/liblzma/common/index_encoder.c
index c10d7af..45919f0 100644
--- a/contrib/xz/src/liblzma/common/index_encoder.c
+++ b/contrib/xz/src/liblzma/common/index_encoder.c
@@ -42,12 +42,13 @@ struct lzma_coder_s {
static lzma_ret
index_encode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
- const uint8_t *restrict in lzma_attribute((unused)),
- size_t *restrict in_pos lzma_attribute((unused)),
- size_t in_size lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
+ const uint8_t *restrict in lzma_attribute((__unused__)),
+ size_t *restrict in_pos lzma_attribute((__unused__)),
+ size_t in_size lzma_attribute((__unused__)),
uint8_t *restrict out, size_t *restrict out_pos,
- size_t out_size, lzma_action action lzma_attribute((unused)))
+ size_t out_size,
+ lzma_action action lzma_attribute((__unused__)))
{
// Position where to start calculating CRC32. The idea is that we
// need to call lzma_crc32() only once per call to index_encode().
diff --git a/contrib/xz/src/liblzma/common/stream_buffer_encoder.c b/contrib/xz/src/liblzma/common/stream_buffer_encoder.c
index f727d85..2450ee2 100644
--- a/contrib/xz/src/liblzma/common/stream_buffer_encoder.c
+++ b/contrib/xz/src/liblzma/common/stream_buffer_encoder.c
@@ -51,6 +51,9 @@ lzma_stream_buffer_encode(lzma_filter *filters, lzma_check check,
|| out_pos_ptr == NULL || *out_pos_ptr > out_size)
return LZMA_PROG_ERROR;
+ if (!lzma_check_is_supported(check))
+ return LZMA_UNSUPPORTED_CHECK;
+
// Note for the paranoids: Index encoder prevents the Stream from
// getting too big and still being accepted with LZMA_OK, and Block
// encoder catches if the input is too big. So we don't need to
@@ -81,26 +84,32 @@ lzma_stream_buffer_encode(lzma_filter *filters, lzma_check check,
out_pos += LZMA_STREAM_HEADER_SIZE;
- // Block
+ // Encode a Block but only if there is at least one byte of input.
lzma_block block = {
.version = 0,
.check = check,
.filters = filters,
};
- return_if_error(lzma_block_buffer_encode(&block, allocator,
- in, in_size, out, &out_pos, out_size));
+ if (in_size > 0)
+ return_if_error(lzma_block_buffer_encode(&block, allocator,
+ in, in_size, out, &out_pos, out_size));
// Index
{
- // Create an Index with one Record.
+ // Create an Index. It will have one Record if there was
+ // at least one byte of input to encode. Otherwise the
+ // Index will be empty.
lzma_index *i = lzma_index_init(allocator);
if (i == NULL)
return LZMA_MEM_ERROR;
- lzma_ret ret = lzma_index_append(i, allocator,
- lzma_block_unpadded_size(&block),
- block.uncompressed_size);
+ lzma_ret ret = LZMA_OK;
+
+ if (in_size > 0)
+ ret = lzma_index_append(i, allocator,
+ lzma_block_unpadded_size(&block),
+ block.uncompressed_size);
// If adding the Record was successful, encode the Index
// and get its size which will be stored into Stream Footer.
diff --git a/contrib/xz/src/liblzma/common/stream_encoder.c b/contrib/xz/src/liblzma/common/stream_encoder.c
index 48d91da..97a7a23 100644
--- a/contrib/xz/src/liblzma/common/stream_encoder.c
+++ b/contrib/xz/src/liblzma/common/stream_encoder.c
@@ -280,6 +280,7 @@ lzma_stream_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
next->end = &stream_encoder_end;
next->update = &stream_encoder_update;
+ next->coder->filters[0].id = LZMA_VLI_UNKNOWN;
next->coder->block_encoder = LZMA_NEXT_CODER_INIT;
next->coder->index_encoder = LZMA_NEXT_CODER_INIT;
next->coder->index = NULL;
@@ -289,7 +290,6 @@ lzma_stream_encoder_init(lzma_next_coder *next, lzma_allocator *allocator,
next->coder->sequence = SEQ_STREAM_HEADER;
next->coder->block_options.version = 0;
next->coder->block_options.check = check;
- next->coder->filters[0].id = LZMA_VLI_UNKNOWN;
// Initialize the Index
lzma_index_end(next->coder->index, allocator);
diff --git a/contrib/xz/src/liblzma/delta/delta_encoder.c b/contrib/xz/src/liblzma/delta/delta_encoder.c
index ea1cc2c..15c7951 100644
--- a/contrib/xz/src/liblzma/delta/delta_encoder.c
+++ b/contrib/xz/src/liblzma/delta/delta_encoder.c
@@ -85,7 +85,7 @@ delta_encode(lzma_coder *coder, lzma_allocator *allocator,
static lzma_ret
delta_encoder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters_null lzma_attribute((unused)),
+ const lzma_filter *filters_null lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
// Delta doesn't and will never support changing the options in
diff --git a/contrib/xz/src/liblzma/lz/lz_decoder.c b/contrib/xz/src/liblzma/lz/lz_decoder.c
index 2c57355..d74085c 100644
--- a/contrib/xz/src/liblzma/lz/lz_decoder.c
+++ b/contrib/xz/src/liblzma/lz/lz_decoder.c
@@ -126,7 +126,7 @@ decode_buffer(lzma_coder *coder,
static lzma_ret
lz_decode(lzma_coder *coder,
- lzma_allocator *allocator lzma_attribute((unused)),
+ lzma_allocator *allocator lzma_attribute((__unused__)),
const uint8_t *restrict in, size_t *restrict in_pos,
size_t in_size, uint8_t *restrict out,
size_t *restrict out_pos, size_t out_size,
diff --git a/contrib/xz/src/liblzma/lz/lz_encoder.c b/contrib/xz/src/liblzma/lz/lz_encoder.c
index 273f577..e240696 100644
--- a/contrib/xz/src/liblzma/lz/lz_encoder.c
+++ b/contrib/xz/src/liblzma/lz/lz_encoder.c
@@ -480,7 +480,7 @@ lz_encoder_end(lzma_coder *coder, lzma_allocator *allocator)
static lzma_ret
lz_encoder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters_null lzma_attribute((unused)),
+ const lzma_filter *filters_null lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
if (coder->lz.options_update == NULL)
diff --git a/contrib/xz/src/liblzma/lz/lz_encoder_hash.h b/contrib/xz/src/liblzma/lz/lz_encoder_hash.h
index c398d7d..342a333 100644
--- a/contrib/xz/src/liblzma/lz/lz_encoder_hash.h
+++ b/contrib/xz/src/liblzma/lz/lz_encoder_hash.h
@@ -39,7 +39,7 @@
// Endianness doesn't matter in hash_2_calc() (no effect on the output).
#ifdef TUKLIB_FAST_UNALIGNED_ACCESS
# define hash_2_calc() \
- const uint32_t hash_value = *(const uint16_t *)(cur);
+ const uint32_t hash_value = *(const uint16_t *)(cur)
#else
# define hash_2_calc() \
const uint32_t hash_value \
diff --git a/contrib/xz/src/liblzma/lzma/lzma2_decoder.c b/contrib/xz/src/liblzma/lzma/lzma2_decoder.c
index f38879c..3e42575 100644
--- a/contrib/xz/src/liblzma/lzma/lzma2_decoder.c
+++ b/contrib/xz/src/liblzma/lzma/lzma2_decoder.c
@@ -67,6 +67,10 @@ lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
const uint32_t control = in[*in_pos];
++*in_pos;
+ // End marker
+ if (control == 0x00)
+ return LZMA_STREAM_END;
+
if (control >= 0xE0 || control == 1) {
// Dictionary reset implies that next LZMA chunk has
// to set new properties.
@@ -104,10 +108,6 @@ lzma2_decode(lzma_coder *restrict coder, lzma_dict *restrict dict,
&coder->options);
}
} else {
- // End marker
- if (control == 0x00)
- return LZMA_STREAM_END;
-
// Invalid control values
if (control > 2)
return LZMA_DATA_ERROR;
diff --git a/contrib/xz/src/liblzma/lzma/lzma2_encoder.c b/contrib/xz/src/liblzma/lzma/lzma2_encoder.c
index b48e0d6..992720c 100644
--- a/contrib/xz/src/liblzma/lzma/lzma2_encoder.c
+++ b/contrib/xz/src/liblzma/lzma/lzma2_encoder.c
@@ -374,7 +374,7 @@ lzma_lzma2_props_encode(const void *options, uint8_t *out)
const lzma_options_lzma *const opt = options;
uint32_t d = my_max(opt->dict_size, LZMA_DICT_SIZE_MIN);
- // Round up to to the next 2^n - 1 or 2^n + 2^(n - 1) - 1 depending
+ // Round up to the next 2^n - 1 or 2^n + 2^(n - 1) - 1 depending
// on which one is the next:
--d;
d |= d >> 2;
diff --git a/contrib/xz/src/liblzma/simple/arm.c b/contrib/xz/src/liblzma/simple/arm.c
index 8fcf643..a84702a 100644
--- a/contrib/xz/src/liblzma/simple/arm.c
+++ b/contrib/xz/src/liblzma/simple/arm.c
@@ -15,7 +15,7 @@
static size_t
-arm_code(lzma_simple *simple lzma_attribute((unused)),
+arm_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/armthumb.c b/contrib/xz/src/liblzma/simple/armthumb.c
index eb6a69d..4b49175 100644
--- a/contrib/xz/src/liblzma/simple/armthumb.c
+++ b/contrib/xz/src/liblzma/simple/armthumb.c
@@ -15,7 +15,7 @@
static size_t
-armthumb_code(lzma_simple *simple lzma_attribute((unused)),
+armthumb_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/ia64.c b/contrib/xz/src/liblzma/simple/ia64.c
index fd263d4..ce3692b 100644
--- a/contrib/xz/src/liblzma/simple/ia64.c
+++ b/contrib/xz/src/liblzma/simple/ia64.c
@@ -15,7 +15,7 @@
static size_t
-ia64_code(lzma_simple *simple lzma_attribute((unused)),
+ia64_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/powerpc.c b/contrib/xz/src/liblzma/simple/powerpc.c
index aaa14f2..6f83511 100644
--- a/contrib/xz/src/liblzma/simple/powerpc.c
+++ b/contrib/xz/src/liblzma/simple/powerpc.c
@@ -15,7 +15,7 @@
static size_t
-powerpc_code(lzma_simple *simple lzma_attribute((unused)),
+powerpc_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/liblzma/simple/simple_coder.c b/contrib/xz/src/liblzma/simple/simple_coder.c
index 06db86e..37de7fa 100644
--- a/contrib/xz/src/liblzma/simple/simple_coder.c
+++ b/contrib/xz/src/liblzma/simple/simple_coder.c
@@ -212,7 +212,7 @@ simple_coder_end(lzma_coder *coder, lzma_allocator *allocator)
static lzma_ret
simple_coder_update(lzma_coder *coder, lzma_allocator *allocator,
- const lzma_filter *filters_null lzma_attribute((unused)),
+ const lzma_filter *filters_null lzma_attribute((__unused__)),
const lzma_filter *reversed_filters)
{
// No update support, just call the next filter in the chain.
diff --git a/contrib/xz/src/liblzma/simple/sparc.c b/contrib/xz/src/liblzma/simple/sparc.c
index 808a59a..8270d6a 100644
--- a/contrib/xz/src/liblzma/simple/sparc.c
+++ b/contrib/xz/src/liblzma/simple/sparc.c
@@ -15,7 +15,7 @@
static size_t
-sparc_code(lzma_simple *simple lzma_attribute((unused)),
+sparc_code(lzma_simple *simple lzma_attribute((__unused__)),
uint32_t now_pos, bool is_encoder,
uint8_t *buffer, size_t size)
{
diff --git a/contrib/xz/src/lzmainfo/lzmainfo.c b/contrib/xz/src/lzmainfo/lzmainfo.c
index 3100dc6..b0ccdfb 100644
--- a/contrib/xz/src/lzmainfo/lzmainfo.c
+++ b/contrib/xz/src/lzmainfo/lzmainfo.c
@@ -26,7 +26,7 @@
#endif
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
help(void)
{
printf(
@@ -45,7 +45,7 @@ _("Usage: %s [--help] [--version] [FILE]...\n"
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
version(void)
{
puts("lzmainfo (" PACKAGE_NAME ") " LZMA_VERSION_STRING);
diff --git a/contrib/xz/src/xz/coder.c b/contrib/xz/src/xz/coder.c
index 5182ddd..b123ec5 100644
--- a/contrib/xz/src/xz/coder.c
+++ b/contrib/xz/src/xz/coder.c
@@ -102,7 +102,7 @@ coder_add_filter(lzma_vli id, void *options)
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
memlimit_too_small(uint64_t memory_usage)
{
message(V_ERROR, _("Memory usage limit is too low for the given "
diff --git a/contrib/xz/src/xz/file_io.c b/contrib/xz/src/xz/file_io.c
index 09edcca..f9b7f30 100644
--- a/contrib/xz/src/xz/file_io.c
+++ b/contrib/xz/src/xz/file_io.c
@@ -53,7 +53,7 @@ static bool io_write_buf(file_pair *pair, const uint8_t *buf, size_t size);
extern void
io_init(void)
{
- // Make sure that stdin, stdout, and and stderr are connected to
+ // Make sure that stdin, stdout, and stderr are connected to
// a valid file descriptor. Exit immediately with exit code ERROR
// if we cannot make the file descriptors valid. Maybe we should
// print an error message, but our stderr could be screwed anyway.
diff --git a/contrib/xz/src/xz/hardware.h b/contrib/xz/src/xz/hardware.h
index bed952b..ad526f2 100644
--- a/contrib/xz/src/xz/hardware.h
+++ b/contrib/xz/src/xz/hardware.h
@@ -35,4 +35,4 @@ extern void hardware_memlimit_set(uint64_t new_memlimit,
extern uint64_t hardware_memlimit_get(enum operation_mode mode);
/// Display the amount of RAM and memory usage limits and exit.
-extern void hardware_memlimit_show(void) lzma_attribute((noreturn));
+extern void hardware_memlimit_show(void) lzma_attribute((__noreturn__));
diff --git a/contrib/xz/src/xz/list.c b/contrib/xz/src/xz/list.c
index 1c93718..98307eb 100644
--- a/contrib/xz/src/xz/list.c
+++ b/contrib/xz/src/xz/list.c
@@ -382,14 +382,9 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
if (buf.u8[0] == 0)
goto data_error;
- lzma_block block;
- lzma_filter filters[LZMA_FILTERS_MAX + 1];
-
- // Initialize the pointers so that they can be passed to free().
- for (size_t i = 0; i < ARRAY_SIZE(filters); ++i)
- filters[i].options = NULL;
-
// Initialize the block structure and decode Block Header Size.
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+ lzma_block block;
block.version = 0;
block.check = iter->stream.flags->check;
block.filters = filters;
@@ -437,6 +432,10 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
break;
case LZMA_DATA_ERROR:
+ // Free the memory allocated by lzma_block_header_decode().
+ for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
+ free(filters[i].options);
+
goto data_error;
default:
@@ -466,14 +465,6 @@ data_error:
// Show the error message.
message_error("%s: %s", pair->src_name,
message_strm(LZMA_DATA_ERROR));
-
- // Free the memory allocated by lzma_block_header_decode().
- // This is truly needed only if we get here after a succcessful
- // call to lzma_block_header_decode() but it doesn't hurt to
- // always do it.
- for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
- free(filters[i].options);
-
return true;
}
diff --git a/contrib/xz/src/xz/message.c b/contrib/xz/src/xz/message.c
index 38cce4a..80c86a4 100644
--- a/contrib/xz/src/xz/message.c
+++ b/contrib/xz/src/xz/message.c
@@ -94,7 +94,7 @@ static volatile sig_atomic_t progress_needs_updating = false;
/// Signal handler for SIGALRM
static void
-progress_signal_handler(int sig lzma_attribute((unused)))
+progress_signal_handler(int sig lzma_attribute((__unused__)))
{
progress_needs_updating = true;
return;
@@ -726,7 +726,11 @@ vmessage(enum message_verbosity v, const char *fmt, va_list ap)
progress_flush(false);
- fprintf(stderr, "%s: ", progname);
+ // TRANSLATORS: This is the program name in the beginning
+ // of the line in messages. Usually it becomes "xz: ".
+ // This is a translatable string because French needs
+ // a space before a colon.
+ fprintf(stderr, _("%s: "), progname);
vfprintf(stderr, fmt, ap);
fputc('\n', stderr);
diff --git a/contrib/xz/src/xz/message.h b/contrib/xz/src/xz/message.h
index e3fca3c..74599bd 100644
--- a/contrib/xz/src/xz/message.h
+++ b/contrib/xz/src/xz/message.h
@@ -45,7 +45,7 @@ extern enum message_verbosity message_verbosity_get(void);
///
/// This doesn't touch the exit status.
extern void message(enum message_verbosity verbosity, const char *fmt, ...)
- lzma_attribute((format(printf, 2, 3)));
+ lzma_attribute((__format__(__printf__, 2, 3)));
/// \brief Prints a warning and possibly sets exit status
@@ -53,7 +53,7 @@ extern void message(enum message_verbosity verbosity, const char *fmt, ...)
/// The message is printed only if verbosity level is at least V_WARNING.
/// The exit status is set to WARNING unless it was already at ERROR.
extern void message_warning(const char *fmt, ...)
- lzma_attribute((format(printf, 1, 2)));
+ lzma_attribute((__format__(__printf__, 1, 2)));
/// \brief Prints an error message and sets exit status
@@ -61,25 +61,25 @@ extern void message_warning(const char *fmt, ...)
/// The message is printed only if verbosity level is at least V_ERROR.
/// The exit status is set to ERROR.
extern void message_error(const char *fmt, ...)
- lzma_attribute((format(printf, 1, 2)));
+ lzma_attribute((__format__(__printf__, 1, 2)));
/// \brief Prints an error message and exits with EXIT_ERROR
///
/// The message is printed only if verbosity level is at least V_ERROR.
extern void message_fatal(const char *fmt, ...)
- lzma_attribute((format(printf, 1, 2)))
- lzma_attribute((noreturn));
+ lzma_attribute((__format__(__printf__, 1, 2)))
+ lzma_attribute((__noreturn__));
/// Print an error message that an internal error occurred and exit with
/// EXIT_ERROR.
-extern void message_bug(void) lzma_attribute((noreturn));
+extern void message_bug(void) lzma_attribute((__noreturn__));
/// Print a message that establishing signal handlers failed, and exit with
/// exit status ERROR.
-extern void message_signal_handler(void) lzma_attribute((noreturn));
+extern void message_signal_handler(void) lzma_attribute((__noreturn__));
/// Convert lzma_ret to a string.
@@ -116,11 +116,11 @@ extern void message_try_help(void);
/// Prints the version number to stdout and exits with exit status SUCCESS.
-extern void message_version(void) lzma_attribute((noreturn));
+extern void message_version(void) lzma_attribute((__noreturn__));
/// Print the help message.
-extern void message_help(bool long_help) lzma_attribute((noreturn));
+extern void message_help(bool long_help) lzma_attribute((__noreturn__));
/// \brief Set the total number of files to be processed
diff --git a/contrib/xz/src/xz/options.c b/contrib/xz/src/xz/options.c
index 379a2e4..f21a0ba 100644
--- a/contrib/xz/src/xz/options.c
+++ b/contrib/xz/src/xz/options.c
@@ -150,7 +150,7 @@ enum {
static void
set_delta(void *options, uint32_t key, uint64_t value,
- const char *valuestr lzma_attribute((unused)))
+ const char *valuestr lzma_attribute((__unused__)))
{
lzma_options_delta *opt = options;
switch (key) {
@@ -194,7 +194,7 @@ enum {
static void
set_bcj(void *options, uint32_t key, uint64_t value,
- const char *valuestr lzma_attribute((unused)))
+ const char *valuestr lzma_attribute((__unused__)))
{
lzma_options_bcj *opt = options;
switch (key) {
@@ -241,7 +241,7 @@ enum {
};
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
error_lzma_preset(const char *valuestr)
{
message_fatal(_("Unsupported LZMA1/LZMA2 preset: %s"), valuestr);
diff --git a/contrib/xz/src/xz/signals.c b/contrib/xz/src/xz/signals.c
index 4d6a9da..de21364 100644
--- a/contrib/xz/src/xz/signals.c
+++ b/contrib/xz/src/xz/signals.c
@@ -179,7 +179,7 @@ signals_exit(void)
// console window.
static BOOL WINAPI
-signal_handler(DWORD type lzma_attribute((unused)))
+signal_handler(DWORD type lzma_attribute((__unused__)))
{
// Since we don't get a signal number which we could raise() at
// signals_exit() like on POSIX, just set the exit status to
diff --git a/contrib/xz/src/xz/suffix.c b/contrib/xz/src/xz/suffix.c
index ea86c1a..c89f67f 100644
--- a/contrib/xz/src/xz/suffix.c
+++ b/contrib/xz/src/xz/suffix.c
@@ -21,12 +21,6 @@
static char *custom_suffix = NULL;
-struct suffix_pair {
- const char *compressed;
- const char *uncompressed;
-};
-
-
/// \brief Test if the char is a directory separator
static bool
is_dir_sep(char c)
@@ -86,7 +80,10 @@ test_suffix(const char *suffix, const char *src_name, size_t src_len)
static char *
uncompressed_name(const char *src_name, const size_t src_len)
{
- static const struct suffix_pair suffixes[] = {
+ static const struct {
+ const char *compressed;
+ const char *uncompressed;
+ } suffixes[] = {
{ ".xz", "" },
{ ".txz", ".tar" }, // .txz abbreviation for .txt.gz is rare.
{ ".lzma", "" },
@@ -145,25 +142,25 @@ static char *
compressed_name(const char *src_name, const size_t src_len)
{
// The order of these must match the order in args.h.
- static const struct suffix_pair all_suffixes[][3] = {
+ static const char *const all_suffixes[][3] = {
{
- { ".xz", "" },
- { ".txz", ".tar" },
- { NULL, NULL }
+ ".xz",
+ ".txz",
+ NULL
}, {
- { ".lzma", "" },
- { ".tlz", ".tar" },
- { NULL, NULL }
+ ".lzma",
+ ".tlz",
+ NULL
/*
}, {
- { ".gz", "" },
- { ".tgz", ".tar" },
- { NULL, NULL }
+ ".gz",
+ ".tgz",
+ NULL
*/
}, {
// --format=raw requires specifying the suffix
// manually or using stdout.
- { NULL, NULL }
+ NULL
}
};
@@ -171,14 +168,22 @@ compressed_name(const char *src_name, const size_t src_len)
assert(opt_format != FORMAT_AUTO);
const size_t format = opt_format - 1;
- const struct suffix_pair *const suffixes = all_suffixes[format];
+ const char *const *suffixes = all_suffixes[format];
+
+ for (size_t i = 0; suffixes[i] != NULL; ++i) {
+ if (test_suffix(suffixes[i], src_name, src_len) != 0) {
+ message_warning(_("%s: File already has `%s' "
+ "suffix, skipping"), src_name,
+ suffixes[i]);
+ return NULL;
+ }
+ }
- for (size_t i = 0; suffixes[i].compressed != NULL; ++i) {
- if (test_suffix(suffixes[i].compressed, src_name, src_len)
- != 0) {
+ if (custom_suffix != NULL) {
+ if (test_suffix(custom_suffix, src_name, src_len) != 0) {
message_warning(_("%s: File already has `%s' "
"suffix, skipping"), src_name,
- suffixes[i].compressed);
+ custom_suffix);
return NULL;
}
}
@@ -193,7 +198,7 @@ compressed_name(const char *src_name, const size_t src_len)
}
const char *suffix = custom_suffix != NULL
- ? custom_suffix : suffixes[0].compressed;
+ ? custom_suffix : suffixes[0];
const size_t suffix_len = strlen(suffix);
char *dest_name = xmalloc(src_len + suffix_len + 1);
diff --git a/contrib/xz/src/xz/util.h b/contrib/xz/src/xz/util.h
index 4b2d3e2..a2516bf 100644
--- a/contrib/xz/src/xz/util.h
+++ b/contrib/xz/src/xz/util.h
@@ -20,11 +20,11 @@
/// \brief Safe realloc() that never returns NULL
extern void *xrealloc(void *ptr, size_t size)
- lzma_attribute((malloc)) lzma_attr_alloc_size(2);
+ lzma_attribute((__malloc__)) lzma_attr_alloc_size(2);
/// \brief Safe strdup() that never returns NULL
-extern char *xstrdup(const char *src) lzma_attribute((malloc));
+extern char *xstrdup(const char *src) lzma_attribute((__malloc__));
/// \brief Fancy version of strtoull()
@@ -102,7 +102,7 @@ extern const char *uint64_to_nicestr(uint64_t value,
/// A maximum of *left bytes is written starting from *pos. *pos and *left
/// are updated accordingly.
extern void my_snprintf(char **pos, size_t *left, const char *fmt, ...)
- lzma_attribute((format(printf, 3, 4)));
+ lzma_attribute((__format__(__printf__, 3, 4)));
/// \brief Check if filename is empty and print an error message
diff --git a/contrib/xz/src/xz/xz.1 b/contrib/xz/src/xz/xz.1
index cba1d07..f1c9135 100644
--- a/contrib/xz/src/xz/xz.1
+++ b/contrib/xz/src/xz/xz.1
@@ -866,7 +866,7 @@ This is equivalent to specifying \fB\-\-memlimit\-compress=\fIlimit
\fB\-\-memlimit\-decompress=\fIlimit\fR.
.TP
.B \-\-no\-adjust
-Display an error and exit if the compression settings exceed the
+Display an error and exit if the compression settings exceed
the memory usage limit.
The default is to adjust the settings downwards so
that the memory usage limit is not exceeded.
diff --git a/contrib/xz/src/xzdec/xzdec.c b/contrib/xz/src/xzdec/xzdec.c
index fd01507..b7830db 100644
--- a/contrib/xz/src/xzdec/xzdec.c
+++ b/contrib/xz/src/xzdec/xzdec.c
@@ -40,7 +40,7 @@
static unsigned int display_errors = 2;
-static void lzma_attribute((format(printf, 1, 2)))
+static void lzma_attribute((__format__(__printf__, 1, 2)))
my_errorf(const char *fmt, ...)
{
va_list ap;
@@ -57,7 +57,7 @@ my_errorf(const char *fmt, ...)
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
help(void)
{
printf(
@@ -81,7 +81,7 @@ PACKAGE_NAME " home page: <" PACKAGE_URL ">\n", progname);
}
-static void lzma_attribute((noreturn))
+static void lzma_attribute((__noreturn__))
version(void)
{
printf(TOOL_FORMAT "dec (" PACKAGE_NAME ") " LZMA_VERSION_STRING "\n"
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf
index 2faf7fb..d467eaa 100644
--- a/etc/defaults/rc.conf
+++ b/etc/defaults/rc.conf
@@ -38,6 +38,7 @@ ddb_enable="NO" # Set to YES to load ddb scripts at boot.
ddb_config="/etc/ddb.conf" # ddb(8) config file.
devd_enable="YES" # Run devd, to trigger programs on device tree changes.
devd_flags="" # Additional flags for devd(8).
+#kld_list="" # Kernel modules to load after local disks are mounted
kldxref_enable="NO" # Build linker.hints files with kldxref(8).
kldxref_clobber="NO" # Overwrite old linker.hints at boot.
kldxref_module_path="" # Override kern.module_path. A ';'-delimited list.
@@ -443,6 +444,13 @@ ubthidhci_enable="NO" # Switch an USB BT controller present on
#ubthidhci_addr="2" # Check usbconfig list to find the correct
# numbers for your system.
+### Network link/usability verification options
+netwait_enable="NO" # Enable rc.d/netwait (or NO)
+#netwait_ip="" # IP addresses to be pinged by netwait.
+netwait_timeout="60" # Total number of seconds to perform pings.
+#netwait_if="" # Interface name to watch link state on.
+netwait_if_timeout="30" # Total number of seconds to monitor link state.
+
### Miscellaneous network options: ###
icmp_bmcastecho="NO" # respond to broadcast ping packets
diff --git a/etc/devd/Makefile b/etc/devd/Makefile
index ad434f2..8d7246a 100644
--- a/etc/devd/Makefile
+++ b/etc/devd/Makefile
@@ -1,6 +1,6 @@
# $FreeBSD$
-FILES= asus.conf uath.conf
+FILES= asus.conf uath.conf usb.conf
NO_OBJ=
FILESDIR= /etc/devd
diff --git a/etc/devd/uath.conf b/etc/devd/uath.conf
index dc4019c..9f0cb93 100644
--- a/etc/devd/uath.conf
+++ b/etc/devd/uath.conf
@@ -3,13 +3,13 @@
# Atheros USB wireless network device specific devd events
# Accton
-# SMCWUSB-G and SMCWUSBT-G2
+# SMCWUSBT-G2
notify 100 {
match "system" "USB";
match "subsystem" "DEVICE";
match "type" "ATTACH";
match "vendor" "0x083a";
- match "product" "(0x4505|0x4507)";
+ match "product" "0x4507";
action "/usr/sbin/uathload -d /dev/$cdev";
};
diff --git a/etc/devd/usb.conf b/etc/devd/usb.conf
new file mode 100644
index 0000000..568be15
--- /dev/null
+++ b/etc/devd/usb.conf
@@ -0,0 +1,4267 @@
+#
+# $FreeBSD$
+#
+# This file was automatically generated by "tools/bus_autoconf.sh".
+# Please do not edit!
+#
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ac";
+ match "product" "0x1290";
+ match "intclass" "0xff";
+ match "intsubclass" "0xfd";
+ match "intprotocol" "0x01";
+ action "kldload if_ipheth";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ac";
+ match "product" "0x1292";
+ match "intclass" "0xff";
+ match "intsubclass" "0xfd";
+ match "intprotocol" "0x01";
+ action "kldload if_ipheth";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ac";
+ match "product" "0x1294";
+ match "intclass" "0xff";
+ match "intsubclass" "0xfd";
+ match "intprotocol" "0x01";
+ action "kldload if_ipheth";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ac";
+ match "product" "0x1297";
+ match "intclass" "0xff";
+ match "intsubclass" "0xfd";
+ match "intprotocol" "0x01";
+ action "kldload if_ipheth";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0104";
+ match "product" "0x00be";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0123";
+ match "product" "0x0001";
+ action "kldload uep";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03e8";
+ match "product" "0x0008";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03eb";
+ match "product" "0x2109";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "0x0121";
+ action "kldload ugensa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "(0x1016|0x1116|0x1216)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "(0x1b1d|0x1e1d)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "(0x2016|0x2116|0x2216|0x3016|0x3116|0x3216)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "0x3524";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "(0x4016|0x4116|0x4216|0x5016|0x5116|0x5216)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "0x811c";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x03f0";
+ match "product" "0xca02";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0402";
+ match "product" "0x5632";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0403";
+ match "product" "(0x6001|0x6004|0x6010|0x6011|0x8372|0x9e90|0xcc48|0xcc49|0xcc4a|0xd678|0xe6c8|0xe888|0xe889|0xe88a|0xe88b|0xe88c|0xee18|0xf608|0xf60b|0xf850|0xfa00|0xfa01|0xfa02|0xfa03|0xfa04|0xfc08|0xfc09|0xfc0b|0xfc0c|0xfc0d|0xfc82)";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0408";
+ match "product" "0x0304";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0408";
+ match "product" "(0x1000|0xea02|0xea03|0xea04|0xea05|0xea06)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0409";
+ match "product" "(0x00d5|0x00d6|0x00d7|0x8024|0x8025)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "(0x0001|0x0005|0x0009)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x0012";
+ action "kldload if_rue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x003d";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "(0x005e|0x0066|0x0067)";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x006e";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x008b";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x00b3";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "(0x00d8|0x00d9)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x00da";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x00e8";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "(0x0116|0x0119)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x012e";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "0x0137";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0411";
+ match "product" "(0x0148|0x0150|0x015d|0x016f)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0413";
+ match "product" "0x2101";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0423";
+ match "product" "(0x000a|0x000c)";
+ action "kldload if_cue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x043e";
+ match "product" "0x9c01";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x045a";
+ match "product" "(0x5001|0x5002)";
+ action "kldload urio";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x045b";
+ match "product" "0x0053";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x045e";
+ match "product" "0x0079";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x045e";
+ match "product" "0x007a";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x045e";
+ match "product" "(0x00ce|0x0400|0x0401|0x0402|0x0403|0x0404|0x0405|0x0406|0x0407|0x0408|0x0409|0x040a|0x040b|0x040c|0x040d|0x040e|0x040f|0x0410|0x0411|0x0412|0x0413|0x0414|0x0415|0x0416|0x0417|0x0432|0x0433|0x0434|0x0435|0x0436|0x0437|0x0438|0x0439|0x043a|0x043b|0x043c|0x043d|0x043e|0x043f|0x0440|0x0441|0x0442|0x0443|0x0444|0x0445|0x0446|0x0447|0x0448|0x0449|0x044a|0x044b|0x044c|0x044d|0x044e|0x044f|0x0450|0x0451|0x0452|0x0453|0x0454|0x0455|0x0456|0x0457|0x0458|0x0459|0x045a|0x045b|0x045c|0x045d|0x045e|0x045f|0x0460|0x0461|0x0462|0x0463|0x0464|0x0465|0x0466|0x0467|0x0468|0x0469|0x046a|0x046b|0x046c|0x046d|0x046e|0x046f|0x0470|0x0471|0x0472|0x0473|0x0474|0x0475|0x0476|0x0477|0x0478|0x0479|0x047a|0x047b|0x04c8|0x04c9|0x04ca|0x04cb|0x04cc|0x04cd|0x04ce|0x04d7|0x04d8|0x04d9|0x04da|0x04db|0x04dc|0x04dd|0x04de|0x04df|0x04e0|0x04e1|0x04e2|0x04e3|0x04e4|0x04e5|0x04e6|0x04e7|0x04e8|0x04e9|0x04ea)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0471";
+ match "product" "0x066a";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0471";
+ match "product" "0x1236";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0471";
+ match "product" "0x200f";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0482";
+ match "product" "0x0203";
+ action "kldload umodem";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0489";
+ match "product" "(0xe000|0xe003)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x049f";
+ match "product" "(0x0003|0x0032)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x049f";
+ match "product" "0x505a";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04a4";
+ match "product" "0x0014";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04a5";
+ match "product" "0x4027";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04a5";
+ match "product" "0x4068";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04ad";
+ match "product" "(0x0301|0x0302|0x0303|0x0306)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04b4";
+ match "product" "0x1002";
+ action "kldload ufm";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04b7";
+ match "product" "0x0531";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04b8";
+ match "product" "(0x0521|0x0522)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04bb";
+ match "product" "0x0901";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04bb";
+ match "product" "(0x0904|0x0913)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04bb";
+ match "product" "0x0930";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04bb";
+ match "product" "(0x0944|0x0945|0x0947|0x0948)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04bb";
+ match "product" "(0x0a03|0x0a0e)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04bf";
+ match "product" "(0x0115|0x0117)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04c5";
+ match "product" "(0x1058|0x1079)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04da";
+ match "product" "0x2500";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04da";
+ match "product" "0x3900";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04dd";
+ match "product" "(0x8004|0x8005|0x8006|0x8007|0x9031)";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04dd";
+ match "product" "(0x9102|0x9121|0x9123|0x9151|0x91ac|0x9242)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04e8";
+ match "product" "(0x5f00|0x5f01|0x5f02|0x5f03|0x5f04)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04e8";
+ match "product" "0x6601";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04e8";
+ match "product" "(0x6611|0x6613|0x6615|0x6617|0x6619|0x661b|0x662e|0x6630|0x6632)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04e8";
+ match "product" "0x8001";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04f1";
+ match "product" "0x3008";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x04f1";
+ match "product" "(0x3011|0x3012)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0502";
+ match "product" "(0x1631|0x1632|0x16e1|0x16e2|0x16e3)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0506";
+ match "product" "(0x03e8|0x11f8)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0506";
+ match "product" "0x4601";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x0103";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x0109";
+ action "kldload umct";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x0121";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x0257";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x0409";
+ action "kldload umct";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x1203";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x4050";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x5055";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x7050";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "(0x7050|0x7051)";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x705a";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x705c";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x705e";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "(0x8053|0x805c|0x815c|0x825a)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x905b";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x050d";
+ match "product" "0x935a";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0525";
+ match "product" "0x1080";
+ action "kldload udbp";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0525";
+ match "product" "0xa4a2";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0536";
+ match "product" "0x01a0";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0543";
+ match "product" "(0x0ed9|0x1527|0x1529|0x152b|0x152e|0x1921|0x1922|0x1923)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0547";
+ match "product" "0x2008";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0547";
+ match "product" "0x2720";
+ action "kldload udbp";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x054c";
+ match "product" "(0x0038|0x0066|0x0095|0x009a|0x00da|0x0169)";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x054c";
+ match "product" "0x0437";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0557";
+ match "product" "0x2002";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0557";
+ match "product" "0x2007";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0557";
+ match "product" "0x2008";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0557";
+ match "product" "0x2009";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0557";
+ match "product" "0x4000";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x055d";
+ match "product" "0x2018";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0565";
+ match "product" "0x0001";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0565";
+ match "product" "(0x0002|0x0003|0x0005)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0567";
+ match "product" "(0x2000|0x2002)";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x056c";
+ match "product" "0x8007";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x056e";
+ match "product" "(0x200c|0x4002|0x4005|0x400b|0x4010)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x056e";
+ match "product" "(0x5003|0x5004)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x056e";
+ match "product" "0xabc1";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x057c";
+ match "product" "(0x2200|0x3800)";
+ action "kldload ng_ubt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0584";
+ match "product" "0xb000";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0584";
+ match "product" "0xb020";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0586";
+ match "product" "(0x3401|0x3407|0x3409|0x340a|0x340f|0x3410)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0586";
+ match "product" "(0x3416|0x341a)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x058f";
+ match "product" "0x9720";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05a6";
+ match "product" "0x0101";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ac";
+ match "product" "(0x020d|0x020e|0x020f|0x0215|0x0217|0x0218|0x0219|0x021a|0x021b|0x021c|0x0229|0x022a|0x022b|0x030a|0x030b)";
+ action "kldload atp";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ac";
+ match "product" "0x1402";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05ad";
+ match "product" "0x0fba";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05c6";
+ match "product" "(0x6000|0x6613)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05cc";
+ match "product" "0x3000";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05db";
+ match "product" "(0x0003|0x0005|0x0009|0x000a|0x0011)";
+ action "kldload uvscom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05e0";
+ match "product" "(0x2000|0x2001|0x2002|0x2003|0x2004|0x2005|0x2006|0x2007|0x2008|0x2009|0x200a)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05e3";
+ match "product" "0x0501";
+ action "kldload udbp";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x05e9";
+ match "product" "(0x0008|0x0009)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x066b";
+ match "product" "(0x200c|0x2202)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x066b";
+ match "product" "0x2202";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x066b";
+ match "product" "(0x2203|0x2204|0x2206|0x400b)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0675";
+ match "product" "0x0550";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x067b";
+ match "product" "(0x0000|0x0001)";
+ action "kldload udbp";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x067b";
+ match "product" "(0x04bb|0x0609|0x0611|0x0612|0x1234|0x206a|0x2303)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x067b";
+ match "product" "0x2501";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x067b";
+ match "product" "(0x331a|0xaaa0|0xaaa2)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x067c";
+ match "product" "0x1001";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x067e";
+ match "product" "0x1001";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0681";
+ match "product" "0x3c06";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x06e1";
+ match "product" "(0x0008|0x0009)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x06f8";
+ match "product" "0xe000";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x06f8";
+ match "product" "(0xe010|0xe020)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x06f8";
+ match "product" "0xe030";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0707";
+ match "product" "0x0100";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0707";
+ match "product" "(0x0200|0x0201)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0707";
+ match "product" "0xee13";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0707";
+ match "product" "0xee13";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0711";
+ match "product" "(0x0200|0x0210|0x0230)";
+ action "kldload umct";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0731";
+ match "product" "(0x0528|0x2003)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0745";
+ match "product" "0x0001";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0745";
+ match "product" "0x1000";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0769";
+ match "product" "0x11f2";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0769";
+ match "product" "0x11f3";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0769";
+ match "product" "0x31f3";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x077b";
+ match "product" "0x2226";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0789";
+ match "product" "0x010c";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0789";
+ match "product" "0x0160";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0789";
+ match "product" "(0x0162|0x0163|0x0164)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x078b";
+ match "product" "0x1234";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x079b";
+ match "product" "0x0027";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x079b";
+ match "product" "(0x004a|0x0062)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07a6";
+ match "product" "(0x07c2|0x0986|0x8511|0x8513|0x8515)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "0x0001";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "(0x0004|0x000d)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "0x0017";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "0x002a";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "(0x002d|0x002e)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "(0x002f|0x003c|0x003f|0x0041|0x0042)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07aa";
+ match "product" "0x9601";
+ action "kldload if_udav";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "(0x110c|0x200c)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "(0x2770|0x2870|0x3070|0x3071|0x3072)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "0x4000";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "(0x4002|0x4003|0x4004|0x4007|0x400b|0x400c|0x4102|0x4104)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "0x420a";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "0x6001";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "0xabc1";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07b8";
+ match "product" "(0xb21b|0xb21c|0xb21d|0xb21e|0xb21f)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07c9";
+ match "product" "0xb100";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07cf";
+ match "product" "(0x2001|0x2002|0x2003)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07d1";
+ match "product" "0x3a0c";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07d1";
+ match "product" "(0x3c03|0x3c04|0x3c06|0x3c07)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x07d1";
+ match "product" "(0x3c09|0x3c0a|0x3c0b|0x3c0d|0x3c0e|0x3c0f|0x3c11|0x3c13|0x3c15|0x3c16)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x081e";
+ match "product" "0xdf00";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x082d";
+ match "product" "(0x0100|0x0200|0x0300)";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0830";
+ match "product" "(0x0001|0x0002|0x0003|0x0020|0x0031|0x0040|0x0050|0x0060|0x0061|0x0070)";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0833";
+ match "product" "(0x012e|0x039f)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "0x1046";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "(0x4505|0x4506)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "0x4508";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "0x4521";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "0x5046";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "(0x6618|0x7511|0x7512|0x7522|0x8522|0xa512|0xa618|0xa701|0xa702|0xb522|0xc522|0xd522)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x083a";
+ match "product" "0xe501";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0841";
+ match "product" "0x0001";
+ action "kldload urio";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "(0x1001|0x1002)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "0x1020";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "0x1040";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "0x4240";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "0x4260";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "0x4300";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0846";
+ match "product" "(0x6100|0x6a00)";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0856";
+ match "product" "0xac01";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x085a";
+ match "product" "(0x0008|0x0009)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x086e";
+ match "product" "0x1920";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x087d";
+ match "product" "0x5704";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x08d1";
+ match "product" "0x0001";
+ action "kldload if_cue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x08d1";
+ match "product" "0x0003";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x08dd";
+ match "product" "(0x0986|0x0987|0x0988|0x8511)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x08dd";
+ match "product" "0x90ff";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x08e6";
+ match "product" "0x5501";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x08fd";
+ match "product" "0x000a";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0915";
+ match "product" "(0x2000|0x2002)";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x091e";
+ match "product" "0x0004";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0921";
+ match "product" "0x1001";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0930";
+ match "product" "(0x0700|0x0705|0x0706|0x0707|0x0708|0x0709|0x070a|0x070b)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0930";
+ match "product" "0x0a07";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0930";
+ match "product" "(0x0d45|0x1302)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x093c";
+ match "product" "(0x0601|0x0701)";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x094b";
+ match "product" "0x0001";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0951";
+ match "product" "0x0008";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0951";
+ match "product" "0x000a";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x095a";
+ match "product" "0x3003";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0960";
+ match "product" "(0x0065|0x0066|0x0067)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0961";
+ match "product" "0x0010";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x099e";
+ match "product" "(0x0052|0x4000)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x09aa";
+ match "product" "0x1000";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x09d7";
+ match "product" "0x0100";
+ action "kldload ugensa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0a46";
+ match "product" "(0x0268|0x8515|0x9601)";
+ action "kldload if_udav";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0a5c";
+ match "product" "0x2033";
+ action "kldload ubtbcmfw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0ace";
+ match "product" "(0x1211|0x1215)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "(0x5000|0x6000|0x6050|0x6100|0x6150|0x6200|0x6250|0x6300|0x6350|0x6500|0x6501|0x6600|0x6601|0x6701|0x6721|0x6741|0x6761|0x6800|0x6901)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0x6911";
+ action "kldload uhso";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0x6971";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0x6971";
+ action "kldload uhso";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0x7001";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0x7011";
+ action "kldload uhso";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "(0x7021|0x7041|0x7061|0x7100|0x7201|0x7211)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "(0x7251|0x7301|0x7361|0x7381|0x7401|0x7501)";
+ action "kldload uhso";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0x7601";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "(0x7601|0xc031|0xd013|0xd031)";
+ action "kldload uhso";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "0xd033";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0af0";
+ match "product" "(0xd033|0xd055|0xd055)";
+ action "kldload uhso";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b05";
+ match "product" "(0x1706|0x1707)";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b05";
+ match "product" "(0x170c|0x171b)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b05";
+ match "product" "0x171d";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b05";
+ match "product" "(0x1723|0x1724)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b05";
+ match "product" "(0x1731|0x1732|0x1742|0x1760|0x1761|0x1784|0x1790)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b05";
+ match "product" "(0x4200|0x4201|0x4202|0x420f|0x9200|0x9202)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b39";
+ match "product" "0x0109";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b39";
+ match "product" "0x0421";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b3b";
+ match "product" "(0x1630|0x5630|0x6630)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b41";
+ match "product" "0x0011";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b63";
+ match "product" "0x6530";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b8c";
+ match "product" "0x2303";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0b95";
+ match "product" "(0x1720|0x1780|0x7720|0x772a)";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0baf";
+ match "product" "0x0118";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0baf";
+ match "product" "0x0121";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bb2";
+ match "product" "0x6098";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bb4";
+ match "product" "(0x00ce|0x00cf|0x00cf|0x0a01|0x0a02|0x0a03|0x0a04|0x0a05|0x0a06|0x0a07|0x0a08|0x0a09|0x0a0a|0x0a0b|0x0a0c|0x0a0d|0x0a0e|0x0a0f|0x0a10|0x0a11|0x0a12|0x0a13|0x0a14|0x0a15|0x0a16|0x0a17|0x0a18|0x0a19|0x0a1a|0x0a1b|0x0a1c|0x0a1d|0x0a1e|0x0a1f|0x0a20|0x0a21|0x0a22|0x0a23|0x0a24|0x0a25|0x0a26|0x0a27|0x0a28|0x0a29|0x0a2a|0x0a2b|0x0a2c|0x0a2d|0x0a2e|0x0a2f|0x0a30|0x0a31|0x0a32|0x0a33|0x0a34|0x0a35|0x0a36|0x0a37|0x0a38|0x0a39|0x0a3a|0x0a3b|0x0a3c|0x0a3d|0x0a3e|0x0a3f|0x0a40|0x0a41|0x0a42|0x0a43|0x0a44|0x0a45|0x0a46|0x0a47|0x0a48|0x0a49|0x0a4a|0x0a4b|0x0a4c|0x0a4d|0x0a4e|0x0a4f|0x0a50|0x0a51|0x0a52|0x0a53|0x0a54|0x0a55|0x0a56|0x0a57|0x0a58|0x0a59|0x0a5a|0x0a5b|0x0a5c|0x0a5d|0x0a5e|0x0a5f|0x0a60|0x0a61|0x0a62|0x0a63|0x0a64|0x0a65|0x0a66|0x0a67|0x0a68|0x0a69|0x0a6a|0x0a6b|0x0a6c|0x0a6d|0x0a6e|0x0a6f|0x0a70|0x0a71|0x0a72|0x0a73|0x0a74|0x0a75|0x0a76|0x0a77|0x0a78|0x0a79|0x0a7a|0x0a7b|0x0a7c|0x0a7d|0x0a7e|0x0a7f|0x0a80|0x0a81|0x0a82|0x0a83|0x0a84|0x0a85|0x0a86|0x0a87|0x0a88|0x0a89|0x0a8a|0x0a8b|0x0a8c|0x0a8d|0x0a8e|0x0a8f|0x0a90|0x0a91|0x0a92|0x0a93|0x0a94|0x0a95|0x0a96|0x0a97|0x0a98|0x0a99|0x0a9a|0x0a9b|0x0a9c|0x0a9d|0x0a9e|0x0a9f|0x0bce)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bda";
+ match "product" "0x8150";
+ action "kldload if_rue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bda";
+ match "product" "(0x8187|0x8189|0x8197|0x8198)";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bed";
+ match "product" "(0x1100|0x1101)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bf8";
+ match "product" "0x1001";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0bf8";
+ match "product" "0x1009";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0c44";
+ match "product" "0x03a2";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0c88";
+ match "product" "0x17da";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0c88";
+ match "product" "0x17da";
+ action "kldload ugensa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0c88";
+ match "product" "0x180a";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0c8e";
+ match "product" "0x6000";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cad";
+ match "product" "0x9001";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cde";
+ match "product" "0x0008";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cde";
+ match "product" "0x0011";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cde";
+ match "product" "0x0012";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cde";
+ match "product" "0x0015";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cde";
+ match "product" "0x001a";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cde";
+ match "product" "(0x0022|0x0025)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0cf3";
+ match "product" "(0x0001|0x0003|0x0005)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0d8e";
+ match "product" "0x3762";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0d8e";
+ match "product" "(0x7801|0x7811)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0db0";
+ match "product" "(0x3820|0x3821|0x3822|0x3870|0x3871)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0db0";
+ match "product" "(0x6861|0x6865|0x6869)";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0db0";
+ match "product" "(0x6874|0x6877)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0db0";
+ match "product" "(0x6899|0x821a|0x822a|0x870a|0x871a|0x899a)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0db0";
+ match "product" "(0xa861|0xa874)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0db7";
+ match "product" "0x0002";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "0x000d";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "0x0017";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "0x0021";
+ action "kldload if_mos";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "0x0028";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "(0x002b|0x002c|0x002d|0x0039|0x003b|0x003c|0x003d|0x003e|0x003f|0x0040|0x0041|0x0042|0x0047|0x0048|0x004a|0x004d)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "0x061c";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "(0x9071|0x9075)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df6";
+ match "product" "(0x90ac|0x9712)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0df7";
+ match "product" "0x0620";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0e0b";
+ match "product" "(0x9031|0x9041)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0e55";
+ match "product" "0x110b";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0e66";
+ match "product" "(0x0001|0x0003|0x0009|0x000b)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0e66";
+ match "product" "0x400c";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0e67";
+ match "product" "0x0002";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0e7e";
+ match "product" "0x1001";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0ea0";
+ match "product" "0x6858";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0eab";
+ match "product" "0xc893";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0eb0";
+ match "product" "0x9020";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0eb0";
+ match "product" "0x9021";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0eba";
+ match "product" "(0x1080|0x2080)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0eef";
+ match "product" "(0x0001|0x0002)";
+ action "kldload uep";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f3d";
+ match "product" "0x0112";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f3d";
+ match "product" "0x0112";
+ action "kldload ugensa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f4e";
+ match "product" "0x0200";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f88";
+ match "product" "0x3012";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f88";
+ match "product" "0x3014";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f94";
+ match "product" "0x0001";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0f98";
+ match "product" "0x0201";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0fb8";
+ match "product" "(0x3001|0x3002|0x3003|0x4001)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0fcf";
+ match "product" "(0x1003|0x1004|0x1006)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x0fe6";
+ match "product" "(0x8101|0x9700)";
+ action "kldload if_udav";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x100d";
+ match "product" "(0x9031|0x9032)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1011";
+ match "product" "0x3198";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1044";
+ match "product" "0x8001";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1044";
+ match "product" "0x8002";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1044";
+ match "product" "0x8007";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1044";
+ match "product" "(0x8008|0x800a)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1044";
+ match "product" "(0x800b|0x800c|0x800d)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1066";
+ match "product" "(0x00ce|0x0300|0x0500|0x0600|0x0700)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x106c";
+ match "product" "0x3701";
+ action "kldload umodem";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10a6";
+ match "product" "0xaa26";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10ab";
+ match "product" "0x10c5";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10b5";
+ match "product" "0xac70";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10b5";
+ match "product" "0xac70";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10bd";
+ match "product" "0x1427";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10c4";
+ match "product" "(0x0f91|0x1101|0x1601|0x800a|0x803b|0x8043|0x8044)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10c4";
+ match "product" "0x8053";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10c4";
+ match "product" "(0x8066|0x806f|0x807a|0x80ca|0x80dd|0x80ed|0x80f6|0x8115|0x813d|0x813f|0x814a|0x814a|0x814b|0x8156|0x815e|0x818b|0x819f|0x81a6|0x81ac|0x81ad|0x81c8|0x81e2|0x81e7|0x81e8|0x81f2|0x8218|0x822b|0x826b|0x8293|0x82f9|0x8341|0x8382|0x83a8|0x8411|0x846e|0x8477|0xea60|0xea61|0xea71|0xf001|0xf002|0xf003|0xf004)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10c5";
+ match "product" "0xea61";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x10ce";
+ match "product" "0xea61";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1114";
+ match "product" "(0x0001|0x0004|0x0006)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x114b";
+ match "product" "0x0110";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x114b";
+ match "product" "0x0150";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1163";
+ match "product" "0x0100";
+ action "kldload ucycom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1182";
+ match "product" "0x1388";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1186";
+ match "product" "0x3e04";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1189";
+ match "product" "0x0893";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1199";
+ match "product" "(0x0017|0x0018|0x0019|0x0020|0x0021|0x0022|0x0023|0x0024|0x0025|0x0026|0x0027|0x0028|0x0029|0x0112|0x0120|0x0218)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1199";
+ match "product" "0x0218";
+ action "kldload umodem";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1199";
+ match "product" "(0x0220|0x0224|0x0fff|0x6802|0x6803|0x6804|0x6805|0x6808|0x6809|0x6812|0x6813|0x6815|0x6816|0x6820|0x6821|0x6822|0x6832|0x6833|0x6834|0x6835|0x6838|0x6839|0x683a|0x683b|0x683c|0x683d|0x683e|0x6850|0x6851|0x6852|0x6853|0x6855|0x6856|0x6859|0x685a|0x6880|0x6890|0x6891|0x6892|0x6893|0x68a3)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x11ad";
+ match "product" "0x0701";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x11d9";
+ match "product" "(0x1002|0x1003)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x11f5";
+ match "product" "(0x0001|0x0003|0x0004|0x0005)";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x11f6";
+ match "product" "0x2001";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x11f7";
+ match "product" "0x02df";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1231";
+ match "product" "(0xce01|0xce02)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x126f";
+ match "product" "0xa006";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x129b";
+ match "product" "0x1666";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x129b";
+ match "product" "0x1828";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x12d1";
+ match "product" "(0x1001|0x1003|0x1004|0x1401|0x1402|0x1403|0x1404|0x1405|0x1406|0x1407|0x1408|0x1409|0x140a|0x140b|0x140c|0x140d|0x140e|0x140f|0x1410|0x1411|0x1412|0x1413|0x1414|0x1415|0x1416|0x1417|0x1418|0x1419|0x141a|0x141b|0x141c|0x141d|0x141e|0x141f|0x1420|0x1421|0x1422|0x1423|0x1424|0x1425|0x1426|0x1427|0x1428|0x1429|0x142a|0x142b|0x142c|0x142d|0x142e|0x142f|0x1430|0x1431|0x1432|0x1433|0x1434|0x1435|0x1436|0x1437|0x1438|0x1439|0x143a|0x143b|0x143c|0x143d|0x143e|0x143f|0x1446|0x1465|0x14ac|0x1520)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x12ef";
+ match "product" "0x0100";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1342";
+ match "product" "0x0204";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1371";
+ match "product" "(0x9022|0x9032)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1371";
+ match "product" "0x9401";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1385";
+ match "product" "(0x4250|0x5f00|0x5f02)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13ad";
+ match "product" "0x9999";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13b1";
+ match "product" "0x000c";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13b1";
+ match "product" "(0x000d|0x0011)";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13b1";
+ match "product" "0x0018";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13b1";
+ match "product" "0x001a";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13b1";
+ match "product" "(0x0020|0x0023)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13b1";
+ match "product" "0x0024";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13d2";
+ match "product" "0x0400";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x13d3";
+ match "product" "(0x3247|0x3262|0x3273|0x3284|0x3305)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1410";
+ match "product" "(0x1100|0x1110|0x1120|0x1130|0x1400|0x1410|0x1420|0x1430|0x1450|0x2100|0x2110|0x2120|0x2130|0x2400|0x2410|0x2420|0x4100|0x4400|0x5010|0x5100|0x6000|0x6002|0x7042)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1416";
+ match "product" "0x1110";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1435";
+ match "product" "0x0427";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1435";
+ match "product" "0x0711";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1435";
+ match "product" "(0x0826|0x082a)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1453";
+ match "product" "0x4026";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1472";
+ match "product" "0x0009";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1482";
+ match "product" "0x3c09";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1485";
+ match "product" "(0x0001|0x0002)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "0x1706";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "0x2070";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "0x2570";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "(0x2573|0x2671)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "(0x2770|0x2870|0x3070|0x3071|0x3072|0x3370|0x3572|0x8070)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "0x9020";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x148f";
+ match "product" "0x9021";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14b2";
+ match "product" "0x3c02";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14b2";
+ match "product" "(0x3c06|0x3c07|0x3c08|0x3c09|0x3c11|0x3c12)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14b2";
+ match "product" "0x3c22";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14b2";
+ match "product" "(0x3c23|0x3c25|0x3c25|0x3c27|0x3c28)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14ea";
+ match "product" "0xab10";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14ea";
+ match "product" "0xab11";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x14ea";
+ match "product" "0xab13";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1555";
+ match "product" "0x0004";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1557";
+ match "product" "0x7720";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1557";
+ match "product" "0x8150";
+ action "kldload if_rue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x157e";
+ match "product" "0x3006";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x157e";
+ match "product" "(0x300a|0x300b|0x300d)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x157e";
+ match "product" "0x300e";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x157e";
+ match "product" "0x3204";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x157e";
+ match "product" "0x3205";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1582";
+ match "product" "0x6003";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x15a9";
+ match "product" "0x0004";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x15a9";
+ match "product" "(0x0006|0x0010)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x15c5";
+ match "product" "0x0008";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x15e8";
+ match "product" "(0x9100|0x9110)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1614";
+ match "product" "(0x0800|0x0802|0x7002)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1631";
+ match "product" "0x6200";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1631";
+ match "product" "0xc019";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1645";
+ match "product" "(0x0005|0x0008|0x8005)";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x166a";
+ match "product" "0x0303";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x167b";
+ match "product" "0x4001";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x168c";
+ match "product" "0x0001";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1690";
+ match "product" "0x0601";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1690";
+ match "product" "(0x0710|0x0712)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1690";
+ match "product" "0x0722";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1690";
+ match "product" "(0x0740|0x0744)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16ab";
+ match "product" "(0x7801|0x7811)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d5";
+ match "product" "(0x6202|0x6501)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d5";
+ match "product" "0x6501";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d5";
+ match "product" "0x6502";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d5";
+ match "product" "0x6502";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d6";
+ match "product" "(0x0001|0x0001)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d8";
+ match "product" "(0x6006|0x6280)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16d8";
+ match "product" "0x6280";
+ action "kldload ugensa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x16dc";
+ match "product" "(0x0010|0x0011|0x0012|0x0015)";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1726";
+ match "product" "0x1000";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1726";
+ match "product" "0x1000";
+ action "kldload ubsa";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1737";
+ match "product" "0x0039";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1737";
+ match "product" "(0x0070|0x0071)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1737";
+ match "product" "0x0073";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1737";
+ match "product" "(0x0077|0x0078|0x0079)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1740";
+ match "product" "(0x0605|0x0615)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1740";
+ match "product" "0x2000";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1740";
+ match "product" "(0x9701|0x9702|0x9703|0x9705|0x9706|0x9707|0x9708|0x9709|0x9801)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1761";
+ match "product" "0x0b05";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x177f";
+ match "product" "(0x0153|0x0302|0x0313)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x17f4";
+ match "product" "0xaaaa";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1843";
+ match "product" "0x0200";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18c5";
+ match "product" "0x0002";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18c5";
+ match "product" "(0x0008|0x0012)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18e8";
+ match "product" "(0x6196|0x6229)";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18e8";
+ match "product" "0x6232";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18e8";
+ match "product" "0x6238";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18e8";
+ match "product" "0x6259";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x18ef";
+ match "product" "0xe00f";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x19d2";
+ match "product" "(0x0001|0x0002|0x0003|0x0004|0x0005|0x0006|0x0007|0x0008|0x0009|0x000a|0x000b|0x000c|0x000d|0x000e|0x000f|0x0010|0x0011|0x0012|0x0013|0x0014|0x0015|0x0016|0x0017|0x0018|0x0019|0x0020|0x0021|0x0022|0x0023|0x0024|0x0025|0x0026|0x0027|0x0028|0x0029|0x0030|0x0031|0x0032|0x0033|0x0037|0x0039|0x0042|0x0043|0x0048|0x0049|0x0051|0x0052|0x0053|0x0054|0x0055|0x0057|0x0058|0x0059|0x0060|0x0061|0x0062|0x0063|0x0064|0x0066|0x0069|0x0070|0x0073|0x0076|0x0078|0x0082|0x0086|0x0117|0x2000|0x2002|0x2003|0xfff1|0xfff5|0xfffe)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1a86";
+ match "product" "0x7523";
+ action "kldload uchcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1a8d";
+ match "product" "(0x1002|0x1003|0x1004|0x1005|0x1006|0x1007|0x1008|0x1009|0x100a|0x100b|0x100c|0x100d|0x100e|0x100f|0x1010|0x1011|0x1012)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1b3d";
+ match "product" "0x0153";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1b75";
+ match "product" "0x3072";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1b75";
+ match "product" "0x8187";
+ action "kldload if_urtw";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1bbb";
+ match "product" "(0x0000|0xf000)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1bc7";
+ match "product" "(0x1003|0x1004)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1be3";
+ match "product" "0x07a6";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1c9e";
+ match "product" "(0x6061|0x9603|0xf000)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1cf1";
+ match "product" "(0x0001|0x0004)";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1d09";
+ match "product" "0x4000";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1d4d";
+ match "product" "(0x0002|0x000c|0x000e|0x0010)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1da5";
+ match "product" "(0x4512|0x4515|0x4519|0x4523)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1e0e";
+ match "product" "(0x9000|0x9200|0xce16)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x1eda";
+ match "product" "0x2310";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "0x1a00";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "0x200c";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "(0x3a00|0x3a02|0x3a04)";
+ action "kldload if_uath";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "0x3c00";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "0x3c05";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "(0x3c09|0x3c0a)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "0x4000";
+ action "kldload if_kue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2001";
+ match "product" "(0x4001|0x4002|0x4003|0x400b|0x4102|0xabc1)";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "0x5303";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "0xab01";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "(0xab24|0xab25)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "0xab50";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "(0xc007|0xed01)";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "0xed02";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2019";
+ match "product" "(0xed06|0xed14)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x203d";
+ match "product" "(0x1480|0x14a1|0x14a9)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x20b8";
+ match "product" "0x8888";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x20b9";
+ match "product" "0x1682";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x22b8";
+ match "product" "(0x4204|0x4214|0x4224|0x4234|0x4244)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x22b8";
+ match "product" "(0x600c|0x6027)";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x2478";
+ match "product" "0x2008";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x3334";
+ match "product" "0x1701";
+ action "kldload if_aue";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x3340";
+ match "product" "(0x011c|0x0326|0x0426|0x043a|0x051c|0x053a|0x071c|0x0b1c|0x0e3a|0x0f1c|0x0f3a|0x1326|0x191c|0x2326|0x3326)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x3708";
+ match "product" "(0x20ce|0x21ce)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x4113";
+ match "product" "(0x0210|0x0211|0x0400|0x0410)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x413c";
+ match "product" "(0x4001|0x4002|0x4003|0x4004|0x4005|0x4006|0x4007|0x4008|0x4009)";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x413c";
+ match "product" "(0x8102|0x8104)";
+ action "kldload if_upgt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x413c";
+ match "product" "(0x8114|0x8115|0x8116|0x8117|0x8118|0x8128|0x8129|0x8133|0x8134|0x8135|0x8136|0x8137|0x8138|0x8180|0x8181|0x8182)";
+ action "kldload u3g";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x413c";
+ match "product" "0x9500";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x4348";
+ match "product" "0x5523";
+ action "kldload uchcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x4505";
+ match "product" "0x0010";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x4766";
+ match "product" "0x0001";
+ action "kldload uvisor";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x5173";
+ match "product" "0x1809";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x5372";
+ match "product" "0x2303";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x5a57";
+ match "product" "0x0260";
+ action "kldload if_ural";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x5a57";
+ match "product" "(0x0280|0x0282|0x0283|0x0284|0x5257)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x5e04";
+ match "product" "0xce00";
+ action "kldload uipaq";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x6189";
+ match "product" "0x182d";
+ action "kldload if_axe";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x6189";
+ match "product" "0x2068";
+ action "kldload uplcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x6547";
+ match "product" "0x0232";
+ action "kldload uark";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x6891";
+ match "product" "0xa727";
+ action "kldload if_zyd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x7392";
+ match "product" "0x7318";
+ action "kldload if_rum";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x7392";
+ match "product" "(0x7711|0x7717|0x7718)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x8516";
+ match "product" "(0x2070|0x2770|0x2870|0x3070|0x3071|0x3072|0x3572)";
+ action "kldload if_run";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x9710";
+ match "product" "0x7703";
+ action "kldload umoscom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x9710";
+ match "product" "0x7730";
+ action "kldload if_mos";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x9710";
+ match "product" "0x7820";
+ action "kldload umcs";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x9710";
+ match "product" "0x7830";
+ action "kldload if_mos";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x9710";
+ match "product" "0x7840";
+ action "kldload umcs";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0x9e88";
+ match "product" "0x9e8f";
+ action "kldload uftdi";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "vendor" "0xdaae";
+ match "product" "0xead6";
+ action "kldload uslcom";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x02";
+ match "intsubclass" "0x02";
+ match "intprotocol" "0x01";
+ action "kldload umodem";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x03";
+ match "intsubclass" "0x01";
+ match "intprotocol" "0x01";
+ action "kldload ukbd";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x03";
+ match "intsubclass" "0x01";
+ match "intprotocol" "0x02";
+ action "kldload ums";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x07";
+ match "intsubclass" "0x01";
+ match "intprotocol" "0x01";
+ action "kldload ulpt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x07";
+ match "intsubclass" "0x01";
+ match "intprotocol" "0x02";
+ action "kldload ulpt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x07";
+ match "intsubclass" "0x01";
+ match "intprotocol" "0x03";
+ action "kldload ulpt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0xe0";
+ match "intsubclass" "0x01";
+ match "intprotocol" "0x01";
+ action "kldload ng_ubt";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0xff";
+ match "intsubclass" "0x5d";
+ match "intprotocol" "0x01";
+ action "kldload uhid";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x01";
+ match "intsubclass" "0x01";
+ action "kldload snd_uaudio";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x01";
+ match "intsubclass" "0x03";
+ action "kldload snd_uaudio";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "(host|device)";
+ match "intclass" "0x02";
+ match "intsubclass" "0x06";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "(host|device)";
+ match "intclass" "0x02";
+ match "intsubclass" "0x0a";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "(host|device)";
+ match "intclass" "0x02";
+ match "intsubclass" "0x0d";
+ action "kldload if_cdce";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x02";
+ match "intsubclass" "0x88";
+ action "kldload ufoma";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x03";
+ action "kldload uhid";
+};
+
+nomatch 32 {
+ match "bus" "uhub[0-9]+";
+ match "mode" "host";
+ match "intclass" "0x08";
+ action "kldload umass";
+};
+
+# 1634 USB entries processed
+
diff --git a/etc/namedb/named.conf b/etc/namedb/named.conf
index 27c30ae..f1669ab 100644
--- a/etc/namedb/named.conf
+++ b/etc/namedb/named.conf
@@ -122,18 +122,18 @@ zone "arpa" {
1. Faster local resolution for your users
2. No spurious traffic will be sent from your network to the roots
*/
-// RFCs 1912 and 5735 (and BCP 32 for localhost)
+// RFCs 1912, 5735 and 6303 (and BCP 32 for localhost)
zone "localhost" { type master; file "/etc/namedb/master/localhost-forward.db"; };
zone "127.in-addr.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
zone "255.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// RFC 1912-style zone for IPv6 localhost address
+// RFC 1912-style zone for IPv6 localhost address (RFC 6303)
zone "0.ip6.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
-// "This" Network (RFCs 1912 and 5735)
+// "This" Network (RFCs 1912, 5735 and 6303)
zone "0.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// Private Use Networks (RFCs 1918 and 5735)
+// Private Use Networks (RFCs 1918, 5735 and 6303)
zone "10.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
@@ -153,18 +153,18 @@ zone "30.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "31.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "168.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// Link-local/APIPA (RFCs 3927 and 5735)
+// Link-local/APIPA (RFCs 3927, 5735 and 6303)
zone "254.169.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
// IETF protocol assignments (RFCs 5735 and 5736)
zone "0.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// TEST-NET-[1-3] for Documentation (RFCs 5735 and 5737)
+// TEST-NET-[1-3] for Documentation (RFCs 5735, 5737 and 6303)
zone "2.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "100.51.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "113.0.203.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 Range for Documentation (RFC 3849)
+// IPv6 Example Range for Documentation (RFCs 3849 and 6303)
zone "8.b.d.0.1.0.0.2.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
// Domain Names for Documentation and Testing (BCP 32)
@@ -231,17 +231,17 @@ zone "5.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "6.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "7.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 ULA (RFC 4193)
+// IPv6 ULA (RFCs 4193 and 6303)
zone "c.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 Link Local (RFC 4291)
+// IPv6 Link Local (RFCs 4291 and 6303)
zone "8.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "9.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "a.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "b.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
-// IPv6 Deprecated Site-Local Addresses (RFC 3879)
+// IPv6 Deprecated Site-Local Addresses (RFCs 3879 and 6303)
zone "c.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "e.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
diff --git a/etc/namedb/named.root b/etc/namedb/named.root
index 87282e5..1c8facf 100644
--- a/etc/namedb/named.root
+++ b/etc/namedb/named.root
@@ -13,8 +13,8 @@
; on server FTP.INTERNIC.NET
; -OR- RS.INTERNIC.NET
;
-; last update: Jun 17, 2010
-; related version of root zone: 2010061700
+; last update: Jun 8, 2011
+; related version of root zone: 2011060800
;
; formerly NS.INTERNIC.NET
;
@@ -36,6 +36,7 @@ C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
;
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
+D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2D::D
;
; FORMERLY NS.NASA.GOV
;
diff --git a/etc/network.subr b/etc/network.subr
index f9a1f88..44a5892 100644
--- a/etc/network.subr
+++ b/etc/network.subr
@@ -94,7 +94,7 @@ ifconfig_up()
# ifconfig_IF
ifconfig_args=`ifconfig_getargs $1`
if [ -n "${ifconfig_args}" ]; then
- ifconfig $1 ${ifconfig_args}
+ eval ifconfig $1 ${ifconfig_args}
_cfg=0
fi
diff --git a/etc/periodic/monthly/Makefile b/etc/periodic/monthly/Makefile
index 1e71afd..77c1d66 100644
--- a/etc/periodic/monthly/Makefile
+++ b/etc/periodic/monthly/Makefile
@@ -6,7 +6,7 @@ FILES= 999.local
# NB: keep these sorted by MK_* knobs
-.if ${MK_ACCT} != "no"
+.if ${MK_UTMPX} != "no"
FILES+= 200.accounting
.endif
diff --git a/etc/rc.d/Makefile b/etc/rc.d/Makefile
index 887db41..c250e66 100644
--- a/etc/rc.d/Makefile
+++ b/etc/rc.d/Makefile
@@ -18,13 +18,13 @@ FILES= DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \
ip6addrctl ipfilter ipfs ipfw ipmon \
ipnat ipsec ipxrouted \
jail \
- kadmind kerberos keyserv kldxref kpasswdd \
+ kadmind kerberos keyserv kld kldxref kpasswdd \
ldconfig local localpkg lockd lpd \
mixer motd mountcritlocal mountcritremote mountlate \
mdconfig mdconfig2 mountd moused mroute6d mrouted msgs \
- named natd netif netoptions \
+ named natd netif netoptions netwait \
newsyslog nfsclient nfscbd nfsd \
- nfsserver nfsuserd nisdomain nsswitch ntpd ntpdate \
+ nfsuserd nisdomain nsswitch ntpd ntpdate \
othermta \
pf pflog pfsync \
powerd power_profile ppp pppoed pwcheck \
diff --git a/etc/rc.d/kld b/etc/rc.d/kld
new file mode 100755
index 0000000..cd2fbab
--- /dev/null
+++ b/etc/rc.d/kld
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+# Copyright (c) 2011 Douglas Barton
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+# PROVIDE: kld
+# REQUIRE: FILESYSTEMS
+# KEYWORD: nojail
+
+. /etc/rc.subr
+
+name="kld"
+
+start_cmd="${name}_start"
+stop_cmd=':'
+
+kld_start()
+{
+ [ -n "$kld_list" ] || return
+
+ local _kernel_path _module_path _kld _path
+
+ _kernel_path=`$SYSCTL_N kern.bootfile`
+ _kernel_path="${_kernel_path%/*}"
+
+ _module_path=`$SYSCTL_N kern.module_path`
+ _module_path="${_module_path#*\;}"
+ _module_path="$_kernel_path `ltr $_module_path \; ' '`"
+
+ echo 'Loading kernel modules:'
+ for _kld in $kld_list ; do
+ for _path in $_module_path ; do
+ if [ -x "${_path}/${_kld}.ko" ]; then
+ load_kld -e ${_kld}.ko ${_path}/${_kld}.ko
+ continue 2
+ fi
+ done
+ warn "${_kld}.ko not found in $_module_path"
+ done
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/etc/rc.d/lockd b/etc/rc.d/lockd
index 1a3fc6b..135dda7 100755
--- a/etc/rc.d/lockd
+++ b/etc/rc.d/lockd
@@ -5,7 +5,7 @@
#
# PROVIDE: lockd
-# REQUIRE: nfsserver nfsclient nfsd rpcbind statd
+# REQUIRE: nfsclient nfsd rpcbind statd
# BEFORE: DAEMON
# KEYWORD: nojail shutdown
diff --git a/etc/rc.d/mountcritremote b/etc/rc.d/mountcritremote
index 91500e2..62e5079 100755
--- a/etc/rc.d/mountcritremote
+++ b/etc/rc.d/mountcritremote
@@ -4,7 +4,7 @@
#
# PROVIDE: mountcritremote
-# REQUIRE: NETWORKING FILESYSTEMS cleanvar ipsec
+# REQUIRE: NETWORKING FILESYSTEMS cleanvar ipsec netwait
# KEYWORD: nojail
. /etc/rc.subr
diff --git a/etc/rc.d/mountd b/etc/rc.d/mountd
index 1fad302..017418d 100755
--- a/etc/rc.d/mountd
+++ b/etc/rc.d/mountd
@@ -4,7 +4,7 @@
#
# PROVIDE: mountd
-# REQUIRE: NETWORKING nfsserver rpcbind quota
+# REQUIRE: NETWORKING rpcbind quota
# KEYWORD: nojail shutdown
. /etc/rc.subr
diff --git a/etc/rc.d/netwait b/etc/rc.d/netwait
new file mode 100755
index 0000000..1d3556a
--- /dev/null
+++ b/etc/rc.d/netwait
@@ -0,0 +1,98 @@
+#!/bin/sh
+
+# $FreeBSD$
+#
+# PROVIDE: netwait
+# REQUIRE: NETWORKING
+# KEYWORD: nojail
+#
+# The netwait script is intended to be used by systems which have
+# statically-configured IP addresses in rc.conf(5). If your system
+# uses DHCP, you should use synchronous_dhclient="YES" in your
+# /etc/rc.conf instead of using netwait.
+
+. /etc/rc.subr
+
+name="netwait"
+rcvar=`set_rcvar`
+
+start_cmd="${name}_start"
+stop_cmd=":"
+
+netwait_start()
+{
+ local ip rc count output link
+
+ if [ -z "${netwait_ip}" ]; then
+ err 1 "You must define one or more IP addresses in netwait_ip"
+ fi
+
+ if [ ${netwait_timeout} -lt 1 ]; then
+ err 1 "netwait_timeout must be >= 1"
+ fi
+
+ # Handle SIGINT (Ctrl-C); force abort of while() loop
+ trap break SIGINT
+
+ if [ -n "${netwait_if}" ]; then
+ echo -n "Waiting for $netwait_if to have link"
+
+ count=1
+ while [ ${count} -le ${netwait_if_timeout} ]; do
+ if output=`/sbin/ifconfig ${netwait_if} 2>/dev/null`; then
+ link=`expr "${output}" : '.*[[:blank:]]status: \(no carrier\)'`
+ if [ -z "${link}" ]; then
+ echo '.'
+ break
+ fi
+ else
+ echo ''
+ err 1 "ifconfig ${netwait_if} failed"
+ fi
+ sleep 1
+ count=$((count+1))
+ done
+ if [ -n "${link}" ]; then
+ # Restore default SIGINT handler
+ trap - SIGINT
+
+ echo ''
+ warn "Interface still has no link. Continuing with startup, but"
+ warn "be aware you may not have a fully functional networking"
+ warn "layer at this point."
+ return
+ fi
+ fi
+
+ # Handle SIGINT (Ctrl-C); force abort of while() loop
+ trap break SIGINT
+
+ for ip in ${netwait_ip}; do
+ echo -n "Waiting for ${ip} to respond to ICMP"
+
+ count=1
+ while [ ${count} -le ${netwait_timeout} ]; do
+ /sbin/ping -t 1 -c 1 -o ${ip} >/dev/null 2>&1
+ rc=$?
+
+ if [ $rc -eq 0 ]; then
+ # Restore default SIGINT handler
+ trap - SIGINT
+
+ echo '.'
+ return
+ fi
+ count=$((count+1))
+ done
+ echo ': No response from host.'
+ done
+
+ # Restore default SIGINT handler
+ trap - SIGINT
+
+ warn "Exhausted IP list. Continuing with startup, but be aware you may"
+ warn "not have a fully functional networking layer at this point."
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/etc/rc.d/nfsd b/etc/rc.d/nfsd
index f0a65ba..8dae57c 100755
--- a/etc/rc.d/nfsd
+++ b/etc/rc.d/nfsd
@@ -22,9 +22,9 @@ nfsd_precmd()
if checkyesno oldnfs_server_enable; then
rc_flags="-o ${nfs_server_flags}"
- if ! sysctl vfs.nfsrv >/dev/null 2>&1; then
- force_depend nfsserver || return 1
- fi
+ # Load the module now, so that the vfs.nfsrv sysctl
+ # oids are available.
+ load_kld nfsserver
if checkyesno nfs_reserved_port_only; then
echo 'NFS on reserved port only=YES'
diff --git a/etc/rc.d/nfsserver b/etc/rc.d/nfsserver
deleted file mode 100755
index bfa3f12..0000000
--- a/etc/rc.d/nfsserver
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-#
-
-# PROVIDE: nfsserver
-# REQUIRE: NETWORKING mountcritremote
-# KEYWORD: nojail
-
-. /etc/rc.subr
-
-name="nfsserver"
-rcvar="nfs_server_enable"
-start_cmd=":"
-stop_cmd=":"
-required_modules="nfsserver"
-
-load_rc_config $name
-run_rc_command "$1"
diff --git a/etc/rc.d/quota b/etc/rc.d/quota
index 6432f50..edc90ef 100755
--- a/etc/rc.d/quota
+++ b/etc/rc.d/quota
@@ -14,6 +14,7 @@
name="quota"
rcvar=`set_rcvar`
+load_rc_config $name
start_cmd="quota_start"
stop_cmd="/usr/sbin/quotaoff ${quotaoff_flags}"
@@ -30,5 +31,4 @@ quota_start()
echo ' done.'
}
-load_rc_config $name
run_rc_command "$1"
diff --git a/etc/rc.d/routing b/etc/rc.d/routing
index add1e0a..7d18a7c 100755
--- a/etc/rc.d/routing
+++ b/etc/rc.d/routing
@@ -48,7 +48,6 @@ routing_start()
done
;;
esac
- [ -n "${_ropts_initdone}" ] && echo '.'
}
routing_stop()
@@ -250,19 +249,19 @@ static_ipx()
{
}
-_ropts_initdone=
ropts_init()
{
if [ -z "${_ropts_initdone}" ]; then
- echo -n 'Additional routing options:'
+ echo -n "Additional $1 routing options:"
_ropts_initdone=yes
fi
}
options_inet()
{
+ _ropts_initdone=
if checkyesno icmp_bmcastecho; then
- ropts_init
+ ropts_init inet
echo -n ' broadcast ping responses=YES'
${SYSCTL} net.inet.icmp.bmcastecho=1 > /dev/null
else
@@ -270,7 +269,7 @@ options_inet()
fi
if checkyesno icmp_drop_redirect; then
- ropts_init
+ ropts_init inet
echo -n ' ignore ICMP redirect=YES'
${SYSCTL} net.inet.icmp.drop_redirect=1 > /dev/null
else
@@ -278,7 +277,7 @@ options_inet()
fi
if checkyesno icmp_log_redirect; then
- ropts_init
+ ropts_init inet
echo -n ' log ICMP redirect=YES'
${SYSCTL} net.inet.icmp.log_redirect=1 > /dev/null
else
@@ -286,15 +285,15 @@ options_inet()
fi
if checkyesno gateway_enable; then
- ropts_init
- echo -n ' IPv4 gateway=YES'
+ ropts_init inet
+ echo -n ' gateway=YES'
${SYSCTL} net.inet.ip.forwarding=1 > /dev/null
else
${SYSCTL} net.inet.ip.forwarding=0 > /dev/null
fi
if checkyesno forward_sourceroute; then
- ropts_init
+ ropts_init inet
echo -n ' do source routing=YES'
${SYSCTL} net.inet.ip.sourceroute=1 > /dev/null
else
@@ -302,7 +301,7 @@ options_inet()
fi
if checkyesno accept_sourceroute; then
- ropts_init
+ ropts_init inet
echo -n ' accept source routing=YES'
${SYSCTL} net.inet.ip.accept_sourceroute=1 > /dev/null
else
@@ -310,38 +309,51 @@ options_inet()
fi
if checkyesno arpproxy_all; then
- ropts_init
+ ropts_init inet
echo -n ' ARP proxyall=YES'
${SYSCTL} net.link.ether.inet.proxyall=1 > /dev/null
else
${SYSCTL} net.link.ether.inet.proxyall=0 > /dev/null
fi
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
options_inet6()
{
+ _ropts_initdone=
+
if checkyesno ipv6_gateway_enable; then
- ropts_init
- echo -n ' IPv6 gateway=YES'
+ ropts_init inet6
+ echo -n ' gateway=YES'
${SYSCTL} net.inet6.ip6.forwarding=1 > /dev/null
else
${SYSCTL} net.inet6.ip6.forwarding=0 > /dev/null
fi
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
options_atm()
{
+ _ropts_initdone=
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
options_ipx()
{
+ _ropts_initdone=
+
if checkyesno ipxgateway_enable; then
- ropts_init
- echo -n ' IPX gateway=YES'
+ ropts_init ipx
+ echo -n ' gateway=YES'
${SYSCTL} net.ipx.ipx.ipxforwarding=1 > /dev/null
else
${SYSCTL} net.ipx.ipx.ipxforwarding=0 > /dev/null
fi
+
+ [ -n "${_ropts_initdone}" ] && echo '.'
}
load_rc_config $name
diff --git a/etc/rc.d/statd b/etc/rc.d/statd
index 85e003d..4e4a0a4 100755
--- a/etc/rc.d/statd
+++ b/etc/rc.d/statd
@@ -5,7 +5,7 @@
#
# PROVIDE: statd
-# REQUIRE: nfsserver nfsclient nfsd rpcbind
+# REQUIRE: nfsclient nfsd rpcbind
# BEFORE: DAEMON
# KEYWORD: nojail shutdown
diff --git a/etc/rc.d/var b/etc/rc.d/var
index 8e5bdde..0655658 100755
--- a/etc/rc.d/var
+++ b/etc/rc.d/var
@@ -28,7 +28,7 @@
#
# PROVIDE: var
-# REQUIRE: FILESYSTEMS
+# REQUIRE: FILESYSTEMS kld
. /etc/rc.subr
diff --git a/etc/rc.subr b/etc/rc.subr
index 97d449c..36cba6d 100644
--- a/etc/rc.subr
+++ b/etc/rc.subr
@@ -1062,7 +1062,7 @@ load_rc_config()
# Set defaults if defined.
for _var in $rcvar $rcvars; do
- _defval=`eval echo "\\\$${_var}_defval"`
+ eval _defval=\$${_var}_defval
if [ -n "$_defval" ]; then
eval : \${$_var:=\$${_var}_defval}
fi
@@ -1070,9 +1070,9 @@ load_rc_config()
# check obsolete rc.conf variables
for _var in $rcvars_obsolete; do
- _v=`eval echo \\$$_var`
- _msg=`eval echo \\$${_var}_obsolete_msg`
- _new=`eval echo \\$${_var}_newvar`
+ eval _v=\$$_var
+ eval _msg=\$${_var}_obsolete_msg
+ eval _new=\$${_var}_newvar
case $_v in
"")
;;
@@ -1732,8 +1732,6 @@ check_required_after()
return 0
}
-fi
-
# check_kern_features mib
# Return existence of kern.features.* sysctl MIB as true or
# false. The result will be cached in $_rc_cache_kern_features_
@@ -1744,7 +1742,7 @@ check_kern_features()
local _v
[ -n "$1" ] || return 1;
- _v=`eval echo "\\$_rc_cache_kern_features_$1"`
+ eval _v=\$_rc_cache_kern_features_$1
[ -n "$_v" ] && return "$_v";
if ${SYSCTL_N} kern.features.$1 > /dev/null 2>&1; then
@@ -1765,7 +1763,7 @@ check_kern_features()
_echoonce()
{
local _var _msg _mode
- _var=`eval echo \\$$1`
+ eval _var=\$$1
_msg=$2
_mode=$3
@@ -1775,4 +1773,6 @@ _echoonce()
esac
}
+fi # [ -z "${_rc_subr_loaded}" ]
+
_rc_subr_loaded=:
diff --git a/etc/regdomain.xml b/etc/regdomain.xml
index d95000c..ff57113 100644
--- a/etc/regdomain.xml
+++ b/etc/regdomain.xml
@@ -83,7 +83,7 @@
<flags>IEEE80211_CHAN_HT20</flags>
</band>
<band>
- <freqband ref="F1_2412_2462"/>
+ <freqband ref="H4_2412_2462"/>
<maxpower>30</maxpower>
<flags>IEEE80211_CHAN_G</flags>
<flags>IEEE80211_CHAN_HT40</flags>
@@ -96,7 +96,7 @@
<flags>IEEE80211_CHAN_HT20</flags>
</band>
<band>
- <freqband ref="F1_5180_5240"/>
+ <freqband ref="H4_5180_5240"/>
<maxpower>17</maxpower>
<flags>IEEE80211_CHAN_HT40</flags>
</band>
@@ -106,7 +106,7 @@
<flags>IEEE80211_CHAN_HT20</flags>
</band>
<band>
- <freqband ref="F1_5745_5805"/>
+ <freqband ref="H4_5745_5805"/>
<maxpower>23</maxpower>
<flags>IEEE80211_CHAN_HT40</flags>
</band>
@@ -138,6 +138,24 @@
<maxpower>17</maxpower>
</band>
<band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5580"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5660_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
<freqband ref="F1_5745_5805"/>
<maxpower>23</maxpower>
<flags>IEEE80211_CHAN_PASSIVE</flags>
@@ -176,6 +194,48 @@
<flags>IEEE80211_CHAN_HT40</flags>
</band>
<band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5580"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5580"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5660_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5660_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
<freqband ref="F1_5745_5805"/>
<maxpower>23</maxpower>
<flags>IEEE80211_CHAN_HT20</flags>
@@ -231,7 +291,7 @@
<flags>IEEE80211_CHAN_HT20</flags>
</band>
<band>
- <freqband ref="F1_2412_2462"/>
+ <freqband ref="H4_2412_2462"/>
<maxpower>30</maxpower>
<flags>IEEE80211_CHAN_G</flags>
<flags>IEEE80211_CHAN_HT40</flags>
@@ -264,6 +324,14 @@
</netband>
<netband mode="11a">
<band>
+ <freqband ref="F1_4920_4980"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5040_5080"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
<freqband ref="F1_5180_5240"/>
<maxpower>23</maxpower>
</band>
@@ -273,6 +341,12 @@
<flags>IEEE80211_CHAN_PASSIVE</flags>
<flags>IEEE80211_CHAN_DFS</flags>
</band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
</netband>
<netband mode="11ng">
<band>
@@ -290,6 +364,26 @@
</netband>
<netband mode="11na">
<band>
+ <freqband ref="F1_4920_4980"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_4920_4980"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5040_5080"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5040_5080"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
<freqband ref="F1_5180_5240"/>
<maxpower>23</maxpower>
<flags>IEEE80211_CHAN_HT20</flags>
@@ -313,6 +407,20 @@
<flags>IEEE80211_CHAN_PASSIVE</flags>
<flags>IEEE80211_CHAN_DFS</flags>
</band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5680"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
</netband>
</rd>
@@ -321,9 +429,9 @@
<sku>0x30</sku>
<netband mode="11b">
<band>
- <freqband ref="F1_2412_2472"/>
- <maxpower>30</maxpower>
- <flags>IEEE80211_CHAN_B</flags>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
</band>
</netband>
<netband mode="11g">
@@ -1564,11 +1672,31 @@
<flags>IEEE80211_CHAN_A</flags>
<flags>IEEE80211_CHAN_HALF</flags>
</freqband>
+<freqband id="F1_4920_4980">
+ <freqstart>4920</freqstart> <freqend>4980</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_4920_4980">
+ <freqstart>4920</freqstart> <freqend>4980</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
<freqband id="F1_4950_4980">
<freqstart>4950</freqstart> <freqend>4980</freqend>
<chanwidth>20</chanwidth> <chansep>5</chansep>
<flags>IEEE80211_CHAN_A</flags>
</freqband>
+<freqband id="F1_5040_5080">
+ <freqstart>5040</freqstart> <freqend>5080</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5040_5080">
+ <freqstart>5040</freqstart> <freqend>5080</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
<freqband id="F1_5120_5240">
<freqstart>5120</freqstart> <freqend>5240</freqend>
<chanwidth>20</chanwidth> <chansep>20</chansep>
@@ -1624,6 +1752,16 @@
<chanwidth>40</chanwidth> <chansep>20</chansep>
<flags>IEEE80211_CHAN_A</flags>
</freqband>
+<freqband id="F1_5500_5580">
+ <freqstart>5500</freqstart> <freqend>5580</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5500_5580">
+ <freqstart>5500</freqstart> <freqend>5580</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
<freqband id="F1_5500_5620">
<freqstart>5500</freqstart> <freqend>5620</freqend>
<chanwidth>20</chanwidth> <chansep>20</chansep>
@@ -1644,6 +1782,16 @@
<chanwidth>20</chanwidth> <chansep>20</chansep>
<flags>IEEE80211_CHAN_A</flags>
</freqband>
+<freqband id="F1_5660_5700">
+ <freqstart>5660</freqstart> <freqend>5700</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5660_5700">
+ <freqstart>5660</freqstart> <freqend>5700</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
<freqband id="H4_5725_5825">
<freqstart>5725</freqstart> <freqend>5825</freqend>
<chanwidth>40</chanwidth> <chansep>20</chansep>
diff --git a/gnu/lib/libdialog/Makefile b/gnu/lib/libdialog/Makefile
index 7547a60..f0979ac 100644
--- a/gnu/lib/libdialog/Makefile
+++ b/gnu/lib/libdialog/Makefile
@@ -5,16 +5,16 @@ DIALOG= ${.CURDIR}/../../../contrib/dialog
LIB= dialog
SHLIB_MAJOR= 7
SRCS= argv.c arrows.c buttons.c calendar.c checklist.c columns.c \
- dlg_keys.c editbox.c fselect.c formbox.c guage.c inputbox.c \
- inputstr.c menubox.c mixedform.c mixedgauge.c mouse.c \
- mousewget.c msgbox.c pause.c prgbox.c progressbox.c rc.c \
- tailbox.c textbox.c timebox.c trace.c ui_getc.c util.c \
+ dlg_keys.c editbox.c fselect.c formbox.c guage.c help.c \
+ inputbox.c inputstr.c menubox.c mixedform.c mixedgauge.c \
+ mouse.c mousewget.c msgbox.c pause.c prgbox.c progressbox.c \
+ rc.c tailbox.c textbox.c timebox.c trace.c ui_getc.c util.c \
version.c yesno.c
INCS= dialog.h dlg_colors.h dlg_config.h dlg_keys.h
MAN= dialog.3
CFLAGS+= -I${.CURDIR} -I${DIALOG} -D_XOPEN_SOURCE_EXTENDED
.PATH: ${DIALOG}
-WARNS?= 3
+WARNS?= 1
.include <bsd.lib.mk>
diff --git a/gnu/usr.bin/groff/tmac/mdoc.local b/gnu/usr.bin/groff/tmac/mdoc.local
index befc87d..8c356f5 100644
--- a/gnu/usr.bin/groff/tmac/mdoc.local
+++ b/gnu/usr.bin/groff/tmac/mdoc.local
@@ -56,6 +56,7 @@
.ds doc-str-Lb-libnetgraph Netgraph User Library (libnetgraph, \-lnetgraph)
.ds doc-str-Lb-libpmc Performance Monitoring Counters Interface Library (libpmc, \-lpmc)
.ds doc-str-Lb-libproc Processor Monitoring and Analysis Library (libproc, \-lproc)
+.ds doc-str-Lb-libprocstat Process and Files Information Retrieval (libprocstat, \-lprocstat)
.ds doc-str-Lb-librpcsec_gss RPC GSS-API Authentication Library (librpcsec_gss, \-lrpcsec_gss)
.ds doc-str-Lb-librpcsvc RPC Service Library (librpcsvc, \-lrpcsvc)
.ds doc-str-Lb-librtld_db Run-time Linker Debugging Library (librtld_db, \-lrtld_db)
diff --git a/include/rpc/xdr.h b/include/rpc/xdr.h
index a02291b..92116c0 100644
--- a/include/rpc/xdr.h
+++ b/include/rpc/xdr.h
@@ -322,6 +322,7 @@ extern bool_t xdr_hyper(XDR *, quad_t *);
extern bool_t xdr_u_hyper(XDR *, u_quad_t *);
extern bool_t xdr_longlong_t(XDR *, quad_t *);
extern bool_t xdr_u_longlong_t(XDR *, u_quad_t *);
+extern unsigned long xdr_sizeof(xdrproc_t, void *);
__END_DECLS
/*
diff --git a/kerberos5/Makefile b/kerberos5/Makefile
index 366540c..d87fa16 100644
--- a/kerberos5/Makefile
+++ b/kerberos5/Makefile
@@ -1,6 +1,6 @@
# $FreeBSD$
-SUBDIR= doc tools lib libexec usr.bin usr.sbin
+SUBDIR= doc lib libexec usr.bin usr.sbin
# These are the programs which depend on Kerberos.
KPROGS= lib/libpam \
diff --git a/lib/bind/Makefile b/lib/bind/Makefile
index 4268219..e2457b7 100644
--- a/lib/bind/Makefile
+++ b/lib/bind/Makefile
@@ -1,5 +1,5 @@
# $FreeBSD$
-SUBDIR= bind9 dns isc isccc isccfg lwres
+SUBDIR= isc isccc dns isccfg bind9 lwres
.include <bsd.subdir.mk>
diff --git a/lib/bind/config.h b/lib/bind/config.h
index 7a5ea06..003a756 100644
--- a/lib/bind/config.h
+++ b/lib/bind/config.h
@@ -3,7 +3,7 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.in by autoheader. */
/*
- * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -19,7 +19,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: acconfig.h,v 1.51.334.2 2009/02/16 23:47:15 tbox Exp $ */
+/* $Id: acconfig.h,v 1.53 2008-12-01 23:47:44 tbox Exp $ */
/*! \file */
@@ -150,6 +150,9 @@ int sigwait(const unsigned int *set, int *sig);
/* Define if building universal (internal helper macro) */
/* #undef AC_APPLE_UNIVERSAL_BUILD */
+/* Define to enable the "filter-aaaa-on-v4" option. */
+/* #undef ALLOW_FILTER_AAAA_ON_V4 */
+
/* Define if recvmsg() does not meet all of the BSD socket API specifications.
*/
/* #undef BROKEN_RECVMSG */
@@ -160,6 +163,12 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to enable "rrset-order fixed" syntax. */
/* #undef DNS_RDATASET_FIXED */
+/* Define to enable rpz-nsdname rules. */
+/* #undef ENABLE_RPZ_NSDNAME */
+
+/* Define to enable rpz-nsip rules. */
+/* #undef ENABLE_RPZ_NSIP */
+
/* Solaris hack to get select_large_fdset. */
/* #undef FD_SETSIZE */
@@ -193,9 +202,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
/* #undef HAVE_GSSAPI_GSSAPI_H */
+/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */
+/* #undef HAVE_GSSAPI_GSSAPI_KRB5_H */
+
/* Define to 1 if you have the <gssapi.h> header file. */
/* #undef HAVE_GSSAPI_H */
+/* Define to 1 if you have the <gssapi_krb5.h> header file. */
+/* #undef HAVE_GSSAPI_KRB5_H */
+
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
@@ -214,6 +229,9 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the `cap' library (-lcap). */
/* #undef HAVE_LIBCAP */
+/* if system have backtrace function */
+/* #undef HAVE_LIBCTRACE */
+
/* Define to 1 if you have the `c_r' library (-lc_r). */
/* #undef HAVE_LIBC_R */
@@ -250,9 +268,27 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <net/if6.h> header file. */
/* #undef HAVE_NET_IF6_H */
+/* Define if your OpenSSL version supports GOST. */
+/* #undef HAVE_OPENSSL_GOST */
+
+/* Define to 1 if you have the <regex.h> header file. */
+#define HAVE_REGEX_H 1
+
+/* Define to 1 if you have the `setegid' function. */
+#define HAVE_SETEGID 1
+
+/* Define to 1 if you have the `seteuid' function. */
+#define HAVE_SETEUID 1
+
/* Define to 1 if you have the `setlocale' function. */
#define HAVE_SETLOCALE 1
+/* Define to 1 if you have the `setresgid' function. */
+#define HAVE_SETRESGID 1
+
+/* Define to 1 if you have the `setresuid' function. */
+#define HAVE_SETRESUID 1
+
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
@@ -307,6 +343,15 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
+/* return type of gai_strerror */
+#define IRS_GAISTRERROR_RETURN_T const char *
+
+/* Define to the buffer length type used by getnameinfo(3). */
+#define IRS_GETNAMEINFO_BUFLEN_T size_t
+
+/* Define to the flags type used by getnameinfo(3). */
+#define IRS_GETNAMEINFO_FLAGS_T int
+
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
@@ -368,11 +413,8 @@ int sigwait(const unsigned int *set, int *sig);
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
+/* Define to empty if your compiler does not support "static inline". */
#define inline /**/
-#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
diff --git a/lib/bind/config.mk b/lib/bind/config.mk
index 184d017..ebac59a 100644
--- a/lib/bind/config.mk
+++ b/lib/bind/config.mk
@@ -67,8 +67,10 @@ CFLAGS+= -I${LIB_BIND_DIR}
# Use the right version of the atomic.h file from lib/isc
.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
ISC_ATOMIC_ARCH= x86_32
+.elif ${MACHINE_ARCH} == "ia64"
+ISC_ATOMIC_ARCH= ia64
.else
-ISC_ATOMIC_ARCH= ${MACHINE_CPUARCH}
+ISC_ATOMIC_ARCH= noatomic
.endif
# Optional features
@@ -78,11 +80,6 @@ CFLAGS+= -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
.if ${MK_BIND_SIGCHASE} == "yes"
CFLAGS+= -DDIG_SIGCHASE
.endif
-.if ${MK_BIND_XML} == "yes"
-CFLAGS+= -DHAVE_LIBXML2
-CFLAGS+= -I/usr/local/include -I/usr/local/include/libxml2
-CFLAGS+= -L/usr/local/lib -lxml2 -lz -liconv -lm
-.endif
# Link against BIND libraries
.if ${MK_BIND_LIBS} == "no"
@@ -110,6 +107,13 @@ BIND_DPADD= ${LIBBIND9} ${LIBDNS} ${LIBISCCC} ${LIBISCCFG} \
${LIBISC} ${LIBLWRES}
.if ${MK_BIND_LIBS} != "no"
BIND_LDADD= -lbind9 -ldns -lisccc -lisccfg -lisc -llwres
+CFLAGS+= -I${BIND_DIR}/lib/isc/include
+CFLAGS+= -I${BIND_DIR}/lib/isc/unix/include
+CFLAGS+= -I${BIND_DIR}/lib/isc/pthreads/include
+CFLAGS+= -I${.CURDIR}/../dns
+CFLAGS+= -I${BIND_DIR}/lib/dns/include
+CFLAGS+= -I${BIND_DIR}/lib/isccfg/include
+CFLAGS+= -I${.CURDIR}/../isc
.else
BIND_LDADD= ${BIND_DPADD}
.endif
@@ -120,5 +124,16 @@ CRYPTO_DPADD= ${LIBCRYPTO}
CRYPTO_LDADD= -lcrypto
.endif
+.if ${MK_BIND_XML} == "yes"
+CFLAGS+= -DHAVE_LIBXML2
+CFLAGS+= -I/usr/local/include -I/usr/local/include/libxml2
+.if ${MK_BIND_LIBS} != "no"
+BIND_LDADD+= -L/usr/local/lib -lxml2 -lz -liconv -lm
+.else
+BIND_DPADD+= /usr/local/lib/libxml2.a ${LIBZ}
+BIND_DPADD+= /usr/local/lib/libiconv.a ${LIBM}
+.endif
+.endif
+
PTHREAD_DPADD= ${LIBPTHREAD}
PTHREAD_LDADD= -lpthread
diff --git a/lib/bind/dns/Makefile b/lib/bind/dns/Makefile
index 72b9f80..159de00 100644
--- a/lib/bind/dns/Makefile
+++ b/lib/bind/dns/Makefile
@@ -15,26 +15,24 @@ LIB= dns
SRCS+= acache.c acl.c adb.c byaddr.c \
cache.c callbacks.c compress.c \
db.c dbiterator.c dbtable.c diff.c dispatch.c \
- dlz.c dnssec.c ds.c \
+ dlz.c dns64.c dnssec.c ds.c \
dst_api.c dst_lib.c dst_parse.c dst_result.c \
forward.c \
gssapi_link.c gssapictx.c hmac_link.c \
- iptable.c \
- journal.c \
+ iptable.c journal.c \
key.c \
- keytable.c \
- lib.c log.c lookup.c \
+ keydata.c keytable.c lib.c log.c lookup.c \
master.c masterdump.c message.c \
name.c ncache.c nsec.c nsec3.c \
openssl_link.c openssldh_link.c \
- openssldsa_link.c opensslrsa_link.c \
- order.c peer.c portlist.c \
- rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c \
- rdatalist.c \
+ openssldsa_link.c opensslgost_link.c opensslrsa_link.c \
+ order.c peer.c portlist.c private.c \
+ rbt.c rbtdb.c rbtdb64.c rcode.c rdata.c rdatalist.c \
rdataset.c rdatasetiter.c rdataslab.c request.c \
- resolver.c result.c rootns.c sdb.c sdlz.c soa.c ssu.c \
+ resolver.c result.c rootns.c rpz.c rriterator.c \
+ sdb.c sdlz.c soa.c ssu.c ssu_external.c \
stats.c tcpmsg.c time.c timer.c tkey.c \
- tsig.c ttl.c validator.c \
+ tsec.c tsig.c ttl.c validator.c \
version.c view.c xfrin.c zone.c zonekey.c zt.c
CFLAGS+= -I${SRCDIR}/include/dst -I${SRCDIR}/include -I${SRCDIR}
@@ -84,6 +82,7 @@ DNSINCS= ${SRCDIR}/include/dns/acache.h \
${SRCDIR}/include/dns/order.h \
${SRCDIR}/include/dns/peer.h \
${SRCDIR}/include/dns/portlist.h \
+ ${SRCDIR}/include/dns/private.h \
${SRCDIR}/include/dns/rbt.h \
${SRCDIR}/include/dns/rcode.h \
${SRCDIR}/include/dns/rdata.h \
diff --git a/lib/bind/dns/code.h b/lib/bind/dns/code.h
index 779285e..bfc5330 100644
--- a/lib/bind/dns/code.h
+++ b/lib/bind/dns/code.h
@@ -83,11 +83,13 @@
#include "rdata/in_1/dhcid_49.c"
#include "rdata/generic/nsec3_50.c"
#include "rdata/generic/nsec3param_51.c"
+#include "rdata/generic/hip_55.c"
#include "rdata/generic/spf_99.c"
#include "rdata/generic/unspec_103.c"
#include "rdata/generic/tkey_249.c"
#include "rdata/any_255/tsig_250.c"
#include "rdata/generic/dlv_32769.c"
+#include "rdata/generic/keydata_65533.c"
@@ -190,6 +192,7 @@
break; \
case 50: result = fromtext_nsec3(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 51: result = fromtext_nsec3param(rdclass, type, lexer, origin, options, target, callbacks); break; \
+ case 55: result = fromtext_hip(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 99: result = fromtext_spf(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 103: result = fromtext_unspec(rdclass, type, lexer, origin, options, target, callbacks); break; \
case 249: result = fromtext_tkey(rdclass, type, lexer, origin, options, target, callbacks); break; \
@@ -199,6 +202,7 @@
} \
break; \
case 32769: result = fromtext_dlv(rdclass, type, lexer, origin, options, target, callbacks); break; \
+ case 65533: result = fromtext_keydata(rdclass, type, lexer, origin, options, target, callbacks); break; \
default: result = DNS_R_UNKNOWN; break; \
}
@@ -301,6 +305,7 @@
break; \
case 50: result = totext_nsec3(rdata, tctx, target); break; \
case 51: result = totext_nsec3param(rdata, tctx, target); break; \
+ case 55: result = totext_hip(rdata, tctx, target); break; \
case 99: result = totext_spf(rdata, tctx, target); break; \
case 103: result = totext_unspec(rdata, tctx, target); break; \
case 249: result = totext_tkey(rdata, tctx, target); break; \
@@ -310,6 +315,7 @@
} \
break; \
case 32769: result = totext_dlv(rdata, tctx, target); break; \
+ case 65533: result = totext_keydata(rdata, tctx, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -412,6 +418,7 @@
break; \
case 50: result = fromwire_nsec3(rdclass, type, source, dctx, options, target); break; \
case 51: result = fromwire_nsec3param(rdclass, type, source, dctx, options, target); break; \
+ case 55: result = fromwire_hip(rdclass, type, source, dctx, options, target); break; \
case 99: result = fromwire_spf(rdclass, type, source, dctx, options, target); break; \
case 103: result = fromwire_unspec(rdclass, type, source, dctx, options, target); break; \
case 249: result = fromwire_tkey(rdclass, type, source, dctx, options, target); break; \
@@ -421,6 +428,7 @@
} \
break; \
case 32769: result = fromwire_dlv(rdclass, type, source, dctx, options, target); break; \
+ case 65533: result = fromwire_keydata(rdclass, type, source, dctx, options, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -523,6 +531,7 @@
break; \
case 50: result = towire_nsec3(rdata, cctx, target); break; \
case 51: result = towire_nsec3param(rdata, cctx, target); break; \
+ case 55: result = towire_hip(rdata, cctx, target); break; \
case 99: result = towire_spf(rdata, cctx, target); break; \
case 103: result = towire_unspec(rdata, cctx, target); break; \
case 249: result = towire_tkey(rdata, cctx, target); break; \
@@ -532,6 +541,7 @@
} \
break; \
case 32769: result = towire_dlv(rdata, cctx, target); break; \
+ case 65533: result = towire_keydata(rdata, cctx, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -634,6 +644,7 @@
break; \
case 50: result = compare_nsec3(rdata1, rdata2); break; \
case 51: result = compare_nsec3param(rdata1, rdata2); break; \
+ case 55: result = compare_hip(rdata1, rdata2); break; \
case 99: result = compare_spf(rdata1, rdata2); break; \
case 103: result = compare_unspec(rdata1, rdata2); break; \
case 249: result = compare_tkey(rdata1, rdata2); break; \
@@ -643,6 +654,120 @@
} \
break; \
case 32769: result = compare_dlv(rdata1, rdata2); break; \
+ case 65533: result = compare_keydata(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ }
+
+#define CASECOMPARESWITCH \
+ switch (rdata1->type) { \
+ case 1: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_a(rdata1, rdata2); break; \
+ case 3: result = casecompare_ch_a(rdata1, rdata2); break; \
+ case 4: result = casecompare_hs_a(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 2: result = casecompare_ns(rdata1, rdata2); break; \
+ case 3: result = casecompare_md(rdata1, rdata2); break; \
+ case 4: result = casecompare_mf(rdata1, rdata2); break; \
+ case 5: result = casecompare_cname(rdata1, rdata2); break; \
+ case 6: result = casecompare_soa(rdata1, rdata2); break; \
+ case 7: result = casecompare_mb(rdata1, rdata2); break; \
+ case 8: result = casecompare_mg(rdata1, rdata2); break; \
+ case 9: result = casecompare_mr(rdata1, rdata2); break; \
+ case 10: result = casecompare_null(rdata1, rdata2); break; \
+ case 11: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_wks(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 12: result = casecompare_ptr(rdata1, rdata2); break; \
+ case 13: result = casecompare_hinfo(rdata1, rdata2); break; \
+ case 14: result = casecompare_minfo(rdata1, rdata2); break; \
+ case 15: result = casecompare_mx(rdata1, rdata2); break; \
+ case 16: result = casecompare_txt(rdata1, rdata2); break; \
+ case 17: result = casecompare_rp(rdata1, rdata2); break; \
+ case 18: result = casecompare_afsdb(rdata1, rdata2); break; \
+ case 19: result = casecompare_x25(rdata1, rdata2); break; \
+ case 20: result = casecompare_isdn(rdata1, rdata2); break; \
+ case 21: result = casecompare_rt(rdata1, rdata2); break; \
+ case 22: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_nsap(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 23: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_nsap_ptr(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 24: result = casecompare_sig(rdata1, rdata2); break; \
+ case 25: result = casecompare_key(rdata1, rdata2); break; \
+ case 26: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_px(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 27: result = casecompare_gpos(rdata1, rdata2); break; \
+ case 28: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_aaaa(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 29: result = casecompare_loc(rdata1, rdata2); break; \
+ case 30: result = casecompare_nxt(rdata1, rdata2); break; \
+ case 33: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_srv(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 35: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_naptr(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 36: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_kx(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 37: result = casecompare_cert(rdata1, rdata2); break; \
+ case 38: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_a6(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 39: result = casecompare_dname(rdata1, rdata2); break; \
+ case 41: result = casecompare_opt(rdata1, rdata2); break; \
+ case 42: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_apl(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 43: result = casecompare_ds(rdata1, rdata2); break; \
+ case 44: result = casecompare_sshfp(rdata1, rdata2); break; \
+ case 45: result = casecompare_ipseckey(rdata1, rdata2); break; \
+ case 46: result = casecompare_rrsig(rdata1, rdata2); break; \
+ case 47: result = casecompare_nsec(rdata1, rdata2); break; \
+ case 48: result = casecompare_dnskey(rdata1, rdata2); break; \
+ case 49: switch (rdata1->rdclass) { \
+ case 1: result = casecompare_in_dhcid(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 50: result = casecompare_nsec3(rdata1, rdata2); break; \
+ case 51: result = casecompare_nsec3param(rdata1, rdata2); break; \
+ case 55: result = casecompare_hip(rdata1, rdata2); break; \
+ case 99: result = casecompare_spf(rdata1, rdata2); break; \
+ case 103: result = casecompare_unspec(rdata1, rdata2); break; \
+ case 249: result = casecompare_tkey(rdata1, rdata2); break; \
+ case 250: switch (rdata1->rdclass) { \
+ case 255: result = casecompare_any_tsig(rdata1, rdata2); break; \
+ default: use_default = ISC_TRUE; break; \
+ } \
+ break; \
+ case 32769: result = casecompare_dlv(rdata1, rdata2); break; \
+ case 65533: result = casecompare_keydata(rdata1, rdata2); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -745,6 +870,7 @@
break; \
case 50: result = fromstruct_nsec3(rdclass, type, source, target); break; \
case 51: result = fromstruct_nsec3param(rdclass, type, source, target); break; \
+ case 55: result = fromstruct_hip(rdclass, type, source, target); break; \
case 99: result = fromstruct_spf(rdclass, type, source, target); break; \
case 103: result = fromstruct_unspec(rdclass, type, source, target); break; \
case 249: result = fromstruct_tkey(rdclass, type, source, target); break; \
@@ -754,6 +880,7 @@
} \
break; \
case 32769: result = fromstruct_dlv(rdclass, type, source, target); break; \
+ case 65533: result = fromstruct_keydata(rdclass, type, source, target); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -856,6 +983,7 @@
break; \
case 50: result = tostruct_nsec3(rdata, target, mctx); break; \
case 51: result = tostruct_nsec3param(rdata, target, mctx); break; \
+ case 55: result = tostruct_hip(rdata, target, mctx); break; \
case 99: result = tostruct_spf(rdata, target, mctx); break; \
case 103: result = tostruct_unspec(rdata, target, mctx); break; \
case 249: result = tostruct_tkey(rdata, target, mctx); break; \
@@ -865,6 +993,7 @@
} \
break; \
case 32769: result = tostruct_dlv(rdata, target, mctx); break; \
+ case 65533: result = tostruct_keydata(rdata, target, mctx); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -967,6 +1096,7 @@
break; \
case 50: freestruct_nsec3(source); break; \
case 51: freestruct_nsec3param(source); break; \
+ case 55: freestruct_hip(source); break; \
case 99: freestruct_spf(source); break; \
case 103: freestruct_unspec(source); break; \
case 249: freestruct_tkey(source); break; \
@@ -976,6 +1106,7 @@
} \
break; \
case 32769: freestruct_dlv(source); break; \
+ case 65533: freestruct_keydata(source); break; \
default: break; \
}
@@ -1078,6 +1209,7 @@
break; \
case 50: result = additionaldata_nsec3(rdata, add, arg); break; \
case 51: result = additionaldata_nsec3param(rdata, add, arg); break; \
+ case 55: result = additionaldata_hip(rdata, add, arg); break; \
case 99: result = additionaldata_spf(rdata, add, arg); break; \
case 103: result = additionaldata_unspec(rdata, add, arg); break; \
case 249: result = additionaldata_tkey(rdata, add, arg); break; \
@@ -1087,6 +1219,7 @@
} \
break; \
case 32769: result = additionaldata_dlv(rdata, add, arg); break; \
+ case 65533: result = additionaldata_keydata(rdata, add, arg); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -1189,6 +1322,7 @@
break; \
case 50: result = digest_nsec3(rdata, digest, arg); break; \
case 51: result = digest_nsec3param(rdata, digest, arg); break; \
+ case 55: result = digest_hip(rdata, digest, arg); break; \
case 99: result = digest_spf(rdata, digest, arg); break; \
case 103: result = digest_unspec(rdata, digest, arg); break; \
case 249: result = digest_tkey(rdata, digest, arg); break; \
@@ -1198,6 +1332,7 @@
} \
break; \
case 32769: result = digest_dlv(rdata, digest, arg); break; \
+ case 65533: result = digest_keydata(rdata, digest, arg); break; \
default: use_default = ISC_TRUE; break; \
}
@@ -1300,6 +1435,7 @@
break; \
case 50: result = checkowner_nsec3(name, rdclass, type, wildcard); break; \
case 51: result = checkowner_nsec3param(name, rdclass, type, wildcard); break; \
+ case 55: result = checkowner_hip(name, rdclass, type, wildcard); break; \
case 99: result = checkowner_spf(name, rdclass, type, wildcard); break; \
case 103: result = checkowner_unspec(name, rdclass, type, wildcard); break; \
case 249: result = checkowner_tkey(name, rdclass, type, wildcard); break; \
@@ -1309,6 +1445,7 @@
} \
break; \
case 32769: result = checkowner_dlv(name, rdclass, type, wildcard); break; \
+ case 65533: result = checkowner_keydata(name, rdclass, type, wildcard); break; \
default: result = ISC_TRUE; break; \
}
@@ -1411,6 +1548,7 @@
break; \
case 50: result = checknames_nsec3(rdata, owner, bad); break; \
case 51: result = checknames_nsec3param(rdata, owner, bad); break; \
+ case 55: result = checknames_hip(rdata, owner, bad); break; \
case 99: result = checknames_spf(rdata, owner, bad); break; \
case 103: result = checknames_unspec(rdata, owner, bad); break; \
case 249: result = checknames_tkey(rdata, owner, bad); break; \
@@ -1420,6 +1558,7 @@
} \
break; \
case 32769: result = checknames_dlv(rdata, owner, bad); break; \
+ case 65533: result = checknames_keydata(rdata, owner, bad); break; \
default: result = ISC_TRUE; break; \
}
#define RDATATYPE_COMPARE(_s, _d, _tn, _n, _tp) \
@@ -1579,6 +1718,9 @@
case 233: \
RDATATYPE_COMPARE("nsec3", 50, _typename, _length, _typep); \
break; \
+ case 208: \
+ RDATATYPE_COMPARE("hip", 55, _typename, _length, _typep); \
+ break; \
case 230: \
RDATATYPE_COMPARE("uinfo", 100, _typename, _length, _typep); \
break; \
@@ -1605,6 +1747,7 @@
break; \
case 50: \
RDATATYPE_COMPARE("maila", 254, _typename, _length, _typep); \
+ RDATATYPE_COMPARE("keydata", 65533, _typename, _length, _typep); \
break; \
case 68: \
RDATATYPE_COMPARE("any", 255, _typename, _length, _typep); \
@@ -1663,6 +1806,7 @@
case 49: return (RRTYPE_DHCID_ATTRIBUTES); \
case 50: return (RRTYPE_NSEC3_ATTRIBUTES); \
case 51: return (RRTYPE_NSEC3PARAM_ATTRIBUTES); \
+ case 55: return (RRTYPE_HIP_ATTRIBUTES); \
case 99: return (RRTYPE_SPF_ATTRIBUTES); \
case 100: return (DNS_RDATATYPEATTR_RESERVED); \
case 101: return (DNS_RDATATYPEATTR_RESERVED); \
@@ -1676,6 +1820,7 @@
case 254: return (DNS_RDATATYPEATTR_META | DNS_RDATATYPEATTR_QUESTIONONLY); \
case 255: return (DNS_RDATATYPEATTR_META | DNS_RDATATYPEATTR_QUESTIONONLY); \
case 32769: return (RRTYPE_DLV_ATTRIBUTES); \
+ case 65533: return (RRTYPE_KEYDATA_ATTRIBUTES); \
}
#define RDATATYPE_TOTEXT_SW \
switch (type) { \
@@ -1730,6 +1875,7 @@
case 49: return (str_totext("DHCID", target)); \
case 50: return (str_totext("NSEC3", target)); \
case 51: return (str_totext("NSEC3PARAM", target)); \
+ case 55: return (str_totext("HIP", target)); \
case 99: return (str_totext("SPF", target)); \
case 100: return (str_totext("UINFO", target)); \
case 101: return (str_totext("UID", target)); \
@@ -1743,5 +1889,6 @@
case 254: return (str_totext("MAILA", target)); \
case 255: return (str_totext("ANY", target)); \
case 32769: return (str_totext("DLV", target)); \
+ case 65533: return (str_totext("KEYDATA", target)); \
}
#endif /* DNS_CODE_H */
diff --git a/lib/bind/dns/dns/enumtype.h b/lib/bind/dns/dns/enumtype.h
index 1f4e375..ef81791 100644
--- a/lib/bind/dns/dns/enumtype.h
+++ b/lib/bind/dns/dns/enumtype.h
@@ -78,11 +78,13 @@ enum {
dns_rdatatype_dhcid = 49,
dns_rdatatype_nsec3 = 50,
dns_rdatatype_nsec3param = 51,
+ dns_rdatatype_hip = 55,
dns_rdatatype_spf = 99,
dns_rdatatype_unspec = 103,
dns_rdatatype_tkey = 249,
dns_rdatatype_tsig = 250,
dns_rdatatype_dlv = 32769,
+ dns_rdatatype_keydata = 65533,
dns_rdatatype_ixfr = 251,
dns_rdatatype_axfr = 252,
dns_rdatatype_mailb = 253,
@@ -138,11 +140,13 @@ enum {
#define dns_rdatatype_dhcid ((dns_rdatatype_t)dns_rdatatype_dhcid)
#define dns_rdatatype_nsec3 ((dns_rdatatype_t)dns_rdatatype_nsec3)
#define dns_rdatatype_nsec3param ((dns_rdatatype_t)dns_rdatatype_nsec3param)
+#define dns_rdatatype_hip ((dns_rdatatype_t)dns_rdatatype_hip)
#define dns_rdatatype_spf ((dns_rdatatype_t)dns_rdatatype_spf)
#define dns_rdatatype_unspec ((dns_rdatatype_t)dns_rdatatype_unspec)
#define dns_rdatatype_tkey ((dns_rdatatype_t)dns_rdatatype_tkey)
#define dns_rdatatype_tsig ((dns_rdatatype_t)dns_rdatatype_tsig)
#define dns_rdatatype_dlv ((dns_rdatatype_t)dns_rdatatype_dlv)
+#define dns_rdatatype_keydata ((dns_rdatatype_t)dns_rdatatype_keydata)
#define dns_rdatatype_ixfr ((dns_rdatatype_t)dns_rdatatype_ixfr)
#define dns_rdatatype_axfr ((dns_rdatatype_t)dns_rdatatype_axfr)
#define dns_rdatatype_mailb ((dns_rdatatype_t)dns_rdatatype_mailb)
diff --git a/lib/bind/dns/dns/rdatastruct.h b/lib/bind/dns/dns/rdatastruct.h
index e7075c0..880beee 100644
--- a/lib/bind/dns/dns/rdatastruct.h
+++ b/lib/bind/dns/dns/rdatastruct.h
@@ -43,7 +43,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdatastructpre.h,v 1.16 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rdatastructpre.h,v 1.16 2007-06-19 23:47:17 tbox Exp $ */
#ifndef DNS_RDATASTRUCT_H
#define DNS_RDATASTRUCT_H 1
@@ -89,7 +89,7 @@ typedef struct dns_rdatacommon {
#ifndef IN_1_A_1_H
#define IN_1_A_1_H 1
-/* $Id: a_1.h,v 1.28 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a_1.h,v 1.28 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_in_a {
dns_rdatacommon_t common;
@@ -113,7 +113,7 @@ typedef struct dns_rdata_in_a {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: a_1.h,v 1.5 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a_1.h,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
/* by Bjorn.Victor@it.uu.se, 2005-05-07 */
/* Based on generic/mx_15.h */
@@ -152,7 +152,7 @@ typedef struct dns_rdata_ch_a {
#ifndef HS_4_A_1_H
#define HS_4_A_1_H 1
-/* $Id: a_1.h,v 1.12 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a_1.h,v 1.12 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_hs_a {
dns_rdatacommon_t common;
@@ -181,7 +181,7 @@ typedef struct dns_rdata_hs_a {
#ifndef GENERIC_NS_2_H
#define GENERIC_NS_2_H 1
-/* $Id: ns_2.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ns_2.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_ns {
dns_rdatacommon_t common;
@@ -212,7 +212,7 @@ typedef struct dns_rdata_ns {
#ifndef GENERIC_MD_3_H
#define GENERIC_MD_3_H 1
-/* $Id: md_3.h,v 1.28 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: md_3.h,v 1.28 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_md {
dns_rdatacommon_t common;
@@ -243,7 +243,7 @@ typedef struct dns_rdata_md {
#ifndef GENERIC_MF_4_H
#define GENERIC_MF_4_H 1
-/* $Id: mf_4.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mf_4.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mf {
dns_rdatacommon_t common;
@@ -269,7 +269,7 @@ typedef struct dns_rdata_mf {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cname_5.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: cname_5.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_CNAME_5_H
#define GENERIC_CNAME_5_H 1
@@ -302,7 +302,7 @@ typedef struct dns_rdata_cname {
#ifndef GENERIC_SOA_6_H
#define GENERIC_SOA_6_H 1
-/* $Id: soa_6.h,v 1.32 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: soa_6.h,v 1.32 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_soa {
dns_rdatacommon_t common;
@@ -339,7 +339,7 @@ typedef struct dns_rdata_soa {
#ifndef GENERIC_MB_7_H
#define GENERIC_MB_7_H 1
-/* $Id: mb_7.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mb_7.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mb {
dns_rdatacommon_t common;
@@ -369,7 +369,7 @@ typedef struct dns_rdata_mb {
#ifndef GENERIC_MG_8_H
#define GENERIC_MG_8_H 1
-/* $Id: mg_8.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mg_8.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mg {
dns_rdatacommon_t common;
@@ -399,7 +399,7 @@ typedef struct dns_rdata_mg {
#ifndef GENERIC_MR_9_H
#define GENERIC_MR_9_H 1
-/* $Id: mr_9.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mr_9.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mr {
dns_rdatacommon_t common;
@@ -429,7 +429,7 @@ typedef struct dns_rdata_mr {
#ifndef GENERIC_NULL_10_H
#define GENERIC_NULL_10_H 1
-/* $Id: null_10.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: null_10.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_null {
dns_rdatacommon_t common;
@@ -460,7 +460,7 @@ typedef struct dns_rdata_null {
#ifndef IN_1_WKS_11_H
#define IN_1_WKS_11_H 1
-/* $Id: wks_11.h,v 1.22 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: wks_11.h,v 1.22 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_in_wks {
dns_rdatacommon_t common;
@@ -493,7 +493,7 @@ typedef struct dns_rdata_in_wks {
#ifndef GENERIC_PTR_12_H
#define GENERIC_PTR_12_H 1
-/* $Id: ptr_12.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ptr_12.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_ptr {
dns_rdatacommon_t common;
@@ -522,7 +522,7 @@ typedef struct dns_rdata_ptr {
#ifndef GENERIC_HINFO_13_H
#define GENERIC_HINFO_13_H 1
-/* $Id: hinfo_13.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: hinfo_13.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_hinfo {
dns_rdatacommon_t common;
@@ -555,7 +555,7 @@ typedef struct dns_rdata_hinfo {
#ifndef GENERIC_MINFO_14_H
#define GENERIC_MINFO_14_H 1
-/* $Id: minfo_14.h,v 1.27 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: minfo_14.h,v 1.27 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_minfo {
dns_rdatacommon_t common;
@@ -586,7 +586,7 @@ typedef struct dns_rdata_minfo {
#ifndef GENERIC_MX_15_H
#define GENERIC_MX_15_H 1
-/* $Id: mx_15.h,v 1.29 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: mx_15.h,v 1.29 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_mx {
dns_rdatacommon_t common;
@@ -617,7 +617,7 @@ typedef struct dns_rdata_mx {
#ifndef GENERIC_TXT_16_H
#define GENERIC_TXT_16_H 1
-/* $Id: txt_16.h,v 1.28 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: txt_16.h,v 1.28 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_txt_string {
isc_uint8_t length;
@@ -668,7 +668,7 @@ dns_rdata_txt_current(dns_rdata_txt_t *, dns_rdata_txt_string_t *);
#ifndef GENERIC_RP_17_H
#define GENERIC_RP_17_H 1
-/* $Id: rp_17.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rp_17.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -702,7 +702,7 @@ typedef struct dns_rdata_rp {
#ifndef GENERIC_AFSDB_18_H
#define GENERIC_AFSDB_18_H 1
-/* $Id: afsdb_18.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: afsdb_18.h,v 1.20 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -736,7 +736,7 @@ typedef struct dns_rdata_afsdb {
#ifndef GENERIC_X25_19_H
#define GENERIC_X25_19_H 1
-/* $Id: x25_19.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: x25_19.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -769,7 +769,7 @@ typedef struct dns_rdata_x25 {
#ifndef GENERIC_ISDN_20_H
#define GENERIC_ISDN_20_H 1
-/* $Id: isdn_20.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: isdn_20.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -804,7 +804,7 @@ typedef struct dns_rdata_isdn {
#ifndef GENERIC_RT_21_H
#define GENERIC_RT_21_H 1
-/* $Id: rt_21.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rt_21.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1183 */
@@ -837,7 +837,7 @@ typedef struct dns_rdata_rt {
#ifndef IN_1_NSAP_22_H
#define IN_1_NSAP_22_H 1
-/* $Id: nsap_22.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: nsap_22.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1706 */
@@ -870,7 +870,7 @@ typedef struct dns_rdata_in_nsap {
#ifndef IN_1_NSAP_PTR_23_H
#define IN_1_NSAP_PTR_23_H 1
-/* $Id: nsap-ptr_23.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: nsap-ptr_23.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1348. Obsoleted in RFC 1706 - use PTR instead. */
@@ -902,7 +902,7 @@ typedef struct dns_rdata_in_nsap_ptr {
#ifndef GENERIC_SIG_24_H
#define GENERIC_SIG_24_H 1
-/* $Id: sig_24.h,v 1.26 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: sig_24.h,v 1.26 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2535 */
@@ -944,7 +944,7 @@ typedef struct dns_rdata_sig_t {
#ifndef GENERIC_KEY_25_H
#define GENERIC_KEY_25_H 1
-/* $Id: key_25.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: key_25.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2535 */
@@ -981,7 +981,7 @@ typedef struct dns_rdata_key_t {
#ifndef IN_1_PX_26_H
#define IN_1_PX_26_H 1
-/* $Id: px_26.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: px_26.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2163 */
@@ -1015,7 +1015,7 @@ typedef struct dns_rdata_in_px {
#ifndef GENERIC_GPOS_27_H
#define GENERIC_GPOS_27_H 1
-/* $Id: gpos_27.h,v 1.17 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: gpos_27.h,v 1.17 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief per RFC1712 */
@@ -1052,7 +1052,7 @@ typedef struct dns_rdata_gpos {
#ifndef IN_1_AAAA_28_H
#define IN_1_AAAA_28_H 1
-/* $Id: aaaa_28.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: aaaa_28.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1886 */
@@ -1083,7 +1083,7 @@ typedef struct dns_rdata_in_aaaa {
#ifndef GENERIC_LOC_29_H
#define GENERIC_LOC_29_H 1
-/* $Id: loc_29.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: loc_29.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC1876 */
@@ -1126,7 +1126,7 @@ typedef struct dns_rdata_loc {
#ifndef GENERIC_NXT_30_H
#define GENERIC_NXT_30_H 1
-/* $Id: nxt_30.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: nxt_30.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief RFC2535 */
@@ -1160,7 +1160,7 @@ typedef struct dns_rdata_nxt {
#ifndef IN_1_SRV_33_H
#define IN_1_SRV_33_H 1
-/* $Id: srv_33.h,v 1.19 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: srv_33.h,v 1.19 2007-06-19 23:47:17 tbox Exp $ */
/* Reviewed: Fri Mar 17 13:01:00 PST 2000 by bwelling */
@@ -1197,7 +1197,7 @@ typedef struct dns_rdata_in_srv {
#ifndef IN_1_NAPTR_35_H
#define IN_1_NAPTR_35_H 1
-/* $Id: naptr_35.h,v 1.23 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: naptr_35.h,v 1.23 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2915 */
@@ -1237,7 +1237,7 @@ typedef struct dns_rdata_in_naptr {
#ifndef IN_1_KX_36_H
#define IN_1_KX_36_H 1
-/* $Id: kx_36.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: kx_36.h,v 1.20 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2230 */
@@ -1267,7 +1267,7 @@ typedef struct dns_rdata_in_kx {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: cert_37.h,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: cert_37.h,v 1.20 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_CERT_37_H
#define GENERIC_CERT_37_H 1
@@ -1304,7 +1304,7 @@ typedef struct dns_rdata_cert {
#ifndef IN_1_A6_38_H
#define IN_1_A6_38_H 1
-/* $Id: a6_38.h,v 1.24 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: a6_38.h,v 1.24 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2874 */
@@ -1338,7 +1338,7 @@ typedef struct dns_rdata_in_a6 {
#ifndef GENERIC_DNAME_39_H
#define GENERIC_DNAME_39_H 1
-/* $Id: dname_39.h,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dname_39.h,v 1.21 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief per RFC2672 */
@@ -1370,7 +1370,7 @@ typedef struct dns_rdata_dname {
#ifndef GENERIC_OPT_41_H
#define GENERIC_OPT_41_H 1
-/* $Id: opt_41.h,v 1.18 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: opt_41.h,v 1.18 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2671 */
@@ -1426,7 +1426,7 @@ dns_rdata_opt_current(dns_rdata_opt_t *, dns_rdata_opt_opcode_t *);
#ifndef IN_1_APL_42_H
#define IN_1_APL_42_H 1
-/* $Id: apl_42.h,v 1.6 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: apl_42.h,v 1.6 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_apl_ent {
isc_boolean_t negative;
@@ -1478,7 +1478,7 @@ dns_rdata_apl_current(dns_rdata_in_apl_t *, dns_rdata_apl_ent_t *);
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ds_43.h,v 1.7 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ds_43.h,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_DS_43_H
#define GENERIC_DS_43_H 1
@@ -1513,7 +1513,7 @@ typedef struct dns_rdata_ds {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sshfp_44.h,v 1.8 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: sshfp_44.h,v 1.8 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC 4255 */
@@ -1547,7 +1547,7 @@ typedef struct dns_rdata_sshfp {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ipseckey_45.h,v 1.4 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: ipseckey_45.h,v 1.4 2007-06-19 23:47:17 tbox Exp $ */
#ifndef GENERIC_IPSECKEY_45_H
#define GENERIC_IPSECKEY_45_H 1
@@ -1586,7 +1586,7 @@ typedef struct dns_rdata_ipseckey {
#ifndef GENERIC_DNSSIG_46_H
#define GENERIC_DNSSIG_46_H 1
-/* $Id: rrsig_46.h,v 1.7 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rrsig_46.h,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per RFC2535 */
@@ -1627,7 +1627,7 @@ typedef struct dns_rdata_rrsig {
#ifndef GENERIC_NSEC_47_H
#define GENERIC_NSEC_47_H 1
-/* $Id: nsec_47.h,v 1.10 2008/07/15 23:47:21 tbox Exp $ */
+/* $Id: nsec_47.h,v 1.10 2008-07-15 23:47:21 tbox Exp $ */
/*!
* \brief Per RFC 3845 */
@@ -1661,7 +1661,7 @@ typedef struct dns_rdata_nsec {
#ifndef GENERIC_DNSKEY_48_H
#define GENERIC_DNSKEY_48_H 1
-/* $Id: dnskey_48.h,v 1.7 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dnskey_48.h,v 1.7 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief per RFC2535 */
@@ -1698,7 +1698,7 @@ typedef struct dns_rdata_dnskey {
#ifndef IN_1_DHCID_49_H
#define IN_1_DHCID_49_H 1
-/* $Id: dhcid_49.h,v 1.5 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dhcid_49.h,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_in_dhcid {
dns_rdatacommon_t common;
@@ -1728,7 +1728,7 @@ typedef struct dns_rdata_in_dhcid {
#ifndef GENERIC_NSEC3_50_H
#define GENERIC_NSEC3_50_H 1
-/* $Id: nsec3_50.h,v 1.4 2008/09/25 04:02:39 tbox Exp $ */
+/* $Id: nsec3_50.h,v 1.4 2008-09-25 04:02:39 tbox Exp $ */
/*!
* \brief Per RFC 5155 */
@@ -1821,7 +1821,7 @@ typedef struct dns_rdata_nsec3 {
#ifndef GENERIC_NSEC3PARAM_51_H
#define GENERIC_NSEC3PARAM_51_H 1
-/* $Id: nsec3param_51.h,v 1.4 2008/09/25 04:02:39 tbox Exp $ */
+/* $Id: nsec3param_51.h,v 1.4 2008-09-25 04:02:39 tbox Exp $ */
/*!
* \brief Per RFC 5155 */
@@ -1840,6 +1840,53 @@ typedef struct dns_rdata_nsec3param {
#endif /* GENERIC_NSEC3PARAM_51_H */
/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: hip_55.h,v 1.2 2009-02-26 06:09:19 marka Exp $ */
+
+#ifndef GENERIC_HIP_5_H
+#define GENERIC_HIP_5_H 1
+
+/* RFC 5205 */
+
+typedef struct dns_rdata_hip {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ unsigned char * hit;
+ unsigned char * key;
+ unsigned char * servers;
+ isc_uint8_t algorithm;
+ isc_uint8_t hit_len;
+ isc_uint16_t key_len;
+ isc_uint16_t servers_len;
+ /* Private */
+ isc_uint16_t offset;
+} dns_rdata_hip_t;
+
+isc_result_t
+dns_rdata_hip_first(dns_rdata_hip_t *);
+
+isc_result_t
+dns_rdata_hip_next(dns_rdata_hip_t *);
+
+void
+dns_rdata_hip_current(dns_rdata_hip_t *, dns_name_t *);
+
+#endif /* GENERIC_HIP_5_H */
+/*
* Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
@@ -1859,7 +1906,7 @@ typedef struct dns_rdata_nsec3param {
#ifndef GENERIC_SPF_99_H
#define GENERIC_SPF_99_H 1
-/* $Id: spf_99.h,v 1.4 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: spf_99.h,v 1.4 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_spf_string {
isc_uint8_t length;
@@ -1911,7 +1958,7 @@ dns_rdata_spf_current(dns_rdata_spf_t *, dns_rdata_spf_string_t *);
#ifndef GENERIC_UNSPEC_103_H
#define GENERIC_UNSPEC_103_H 1
-/* $Id: unspec_103.h,v 1.17 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: unspec_103.h,v 1.17 2007-06-19 23:47:17 tbox Exp $ */
typedef struct dns_rdata_unspec_t {
dns_rdatacommon_t common;
@@ -1941,7 +1988,7 @@ typedef struct dns_rdata_unspec_t {
#ifndef GENERIC_TKEY_249_H
#define GENERIC_TKEY_249_H 1
-/* $Id: tkey_249.h,v 1.24 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: tkey_249.h,v 1.24 2007-06-19 23:47:17 tbox Exp $ */
/*!
* \brief Per draft-ietf-dnsind-tkey-00.txt */
@@ -1979,7 +2026,7 @@ typedef struct dns_rdata_tkey {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: tsig_250.h,v 1.25 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: tsig_250.h,v 1.25 2007-06-19 23:47:17 tbox Exp $ */
#ifndef ANY_255_TSIG_250_H
#define ANY_255_TSIG_250_H 1
@@ -2016,7 +2063,7 @@ typedef struct dns_rdata_any_tsig {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dlv_32769.h,v 1.5 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: dlv_32769.h,v 1.5 2007-06-19 23:47:17 tbox Exp $ */
/* draft-ietf-dnsext-delegation-signer-05.txt */
#ifndef GENERIC_DLV_32769_H
@@ -2034,6 +2081,41 @@ typedef struct dns_rdata_dlv {
#endif /* GENERIC_DLV_32769_H */
/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+#ifndef GENERIC_KEYDATA_65533_H
+#define GENERIC_KEYDATA_65533_H 1
+
+/* $Id: keydata_65533.h,v 1.2 2009-06-30 02:52:32 each Exp $ */
+
+typedef struct dns_rdata_keydata {
+ dns_rdatacommon_t common;
+ isc_mem_t * mctx;
+ isc_uint32_t refresh; /* Timer for refreshing data */
+ isc_uint32_t addhd; /* Hold-down timer for adding */
+ isc_uint32_t removehd; /* Hold-down timer for removing */
+ isc_uint16_t flags; /* Copy of DNSKEY_48 */
+ isc_uint8_t protocol;
+ isc_uint8_t algorithm;
+ isc_uint16_t datalen;
+ unsigned char * data;
+} dns_rdata_keydata_t;
+
+#endif /* GENERIC_KEYDATA_65533_H */
+/*
* Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
@@ -2050,7 +2132,7 @@ typedef struct dns_rdata_dlv {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rdatastructsuf.h,v 1.10 2007/06/19 23:47:17 tbox Exp $ */
+/* $Id: rdatastructsuf.h,v 1.10 2007-06-19 23:47:17 tbox Exp $ */
ISC_LANG_ENDDECLS
diff --git a/lib/bind/isc/Makefile b/lib/bind/isc/Makefile
index 7648da5..f41f604 100644
--- a/lib/bind/isc/Makefile
+++ b/lib/bind/isc/Makefile
@@ -27,18 +27,26 @@ SRCS+= condition.c mutex.c \
.PATH: ${SRCDIR}
SRCS+= inet_pton.c \
- assertions.c base32.c base64.c bitstring.c buffer.c \
- bufferlist.c commandline.c entropy.c error.c event.c \
- fsaccess.c hash.c heap.c hex.c hmacmd5.c hmacsha.c \
- httpd.c inet_aton.c inet_ntop.c iterated_hash.c \
+ assertions.c backtrace.c base32.c base64.c bitstring.c \
+ buffer.c bufferlist.c commandline.c error.c event.c \
+ fsaccess.c hash.c \
+ heap.c hex.c hmacmd5.c hmacsha.c \
+ httpd.c inet_aton.c \
+ inet_ntop.c \
+ iterated_hash.c \
lex.c lfsr.c lib.c log.c \
md5.c mem.c mutexblock.c \
netaddr.c netscope.c ondestroy.c \
- parseint.c portset.c print.c quota.c radix.c random.c \
+ parseint.c portset.c \
+ print.c \
+ quota.c radix.c random.c \
ratelimiter.c refcount.c region.c result.c rwlock.c \
serial.c sha1.c sha2.c sockaddr.c stats.c string.c strtoul.c \
symtab.c task.c taskpool.c timer.c version.c
+.PATH: ${.CURDIR}
+SRCS+= backtrace-emptytbl.c
+
CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/pthreads/include
CFLAGS+= -I${SRCDIR}/include -I${.CURDIR}
CFLAGS+= -I${SRCDIR}/${ISC_ATOMIC_ARCH}/include
@@ -51,6 +59,7 @@ INCS= ${SRCDIR}/include/isc/app.h \
${SRCDIR}/include/isc/assertions.h \
${SRCDIR}/include/isc/base32.h \
${SRCDIR}/include/isc/base64.h \
+ ${SRCDIR}/include/isc/bind9.h \
${SRCDIR}/include/isc/bitstring.h \
${SRCDIR}/include/isc/boolean.h \
${SRCDIR}/include/isc/buffer.h \
@@ -84,6 +93,7 @@ INCS= ${SRCDIR}/include/isc/app.h \
${SRCDIR}/include/isc/msgcat.h \
${SRCDIR}/include/isc/msgs.h \
${SRCDIR}/include/isc/mutexblock.h \
+ ${SRCDIR}/include/isc/namespace.h \
${SRCDIR}/include/isc/netaddr.h \
${SRCDIR}/include/isc/netscope.h \
${SRCDIR}/include/isc/ondestroy.h \
diff --git a/lib/bind/isc/backtrace-emptytbl.c b/lib/bind/isc/backtrace-emptytbl.c
new file mode 100644
index 0000000..9c50d95
--- /dev/null
+++ b/lib/bind/isc/backtrace-emptytbl.c
@@ -0,0 +1,36 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC 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.
+ */
+
+/* $Id: backtrace-emptytbl.c,v 1.3 2009-09-01 20:13:44 each Exp $ */
+
+/*! \file */
+
+/*
+ * This file defines an empty (default) symbol table used in backtrace.c
+ * If the application wants to have a complete symbol table, it should redefine
+ * isc__backtrace_symtable with the complete table in some way, and link the
+ * version of the library not including this definition
+ * (e.g. libisc-nosymbol.a).
+ */
+
+#include <config.h>
+
+#include <isc/backtrace.h>
+
+const int isc__backtrace_nsymbols = 0;
+const isc_backtrace_symmap_t isc__backtrace_symtable[] = { { NULL, "" } };
diff --git a/lib/bind/isc/isc/platform.h b/lib/bind/isc/isc/platform.h
index 2ac5042..7dab495 100644
--- a/lib/bind/isc/isc/platform.h
+++ b/lib/bind/isc/isc/platform.h
@@ -1,6 +1,5 @@
/* $FreeBSD$ */
-
/*
* Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
@@ -18,7 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.48.84.4 2010-06-03 23:47:49 tbox Exp $ */
+/* $Id: platform.h.in,v 1.56 2010-12-18 01:56:23 each Exp $ */
#ifndef ISC_PLATFORM_H
#define ISC_PLATFORM_H 1
@@ -149,6 +148,11 @@
*/
#undef ISC_PLATFORM_HAVEDEVPOLL
+/*! \brief
+ * Define if we want to log backtrace
+ */
+#define ISC_PLATFORM_USEBACKTRACE 1
+
/*
*** Printing.
***/
@@ -218,6 +222,12 @@
/*
+ * Defined to <gssapi_krb5.h> or <gssapi/gssapi_krb5.h> for how to
+ * include the GSSAPI KRB5 header.
+ */
+
+
+/*
* Defined to <krb5.h> or <krb5/krb5.h> for how to include
* the KRB5 header.
*/
@@ -253,7 +263,14 @@
* If the "xadd" operation is available on this architecture,
* ISC_PLATFORM_HAVEXADD will be defined.
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_HAVEXADD 1
+#else
+#undef ISC_PLATFORM_HAVEXADD
+#endif
/*
* If the "xaddq" operation (64bit xadd) is available on this architecture,
@@ -272,18 +289,39 @@
* If the "atomic swap" operation is available on this architecture,
* ISC_PLATFORM_HAVEATOMICSTORE" will be defined.
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_HAVEATOMICSTORE 1
+#else
+#undef ISC_PLATFORM_HAVEATOMICSTORE
+#endif
/*
* If the "compare-and-exchange" operation is available on this architecture,
* ISC_PLATFORM_HAVECMPXCHG will be defined.
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_HAVECMPXCHG 1
+#else
+#undef ISC_PLATFORM_HAVECMPXCHG
+#endif
/*
* Define if gcc ASM extension is available
*/
+/*
+ * FreeBSD local modification, preserve this over upgrades
+ */
+#if defined (__i386__) || defined (__amd64__) || defined (__ia64__)
#define ISC_PLATFORM_USEGCCASM 1
+#else
+#undef ISC_PLATFORM_USEGCCASM
+#endif
/*
* Define if Tru64 style ASM syntax must be used.
@@ -300,6 +338,17 @@
*/
#define ISC_PLATFORM_HAVESTRINGSH 1
+/*
+ * Define if the hash functions must be provided by OpenSSL.
+ */
+#undef ISC_PLATFORM_OPENSSLHASH
+
+/*
+ * Defines for the noreturn attribute.
+ */
+#define ISC_PLATFORM_NORETURN_PRE
+#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))
+
/***
*** Windows dll support.
***/
diff --git a/lib/bind/lwres/lwres/netdb.h b/lib/bind/lwres/lwres/netdb.h
index cb5cc28..59ad93a 100644
--- a/lib/bind/lwres/lwres/netdb.h
+++ b/lib/bind/lwres/lwres/netdb.h
@@ -17,7 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netdb.h.in,v 1.39.332.2 2009/01/18 23:47:41 tbox Exp $ */
+/* $Id: netdb.h.in,v 1.41 2009-01-18 23:48:14 tbox Exp $ */
/*! \file */
diff --git a/lib/bind/lwres/lwres/platform.h b/lib/bind/lwres/lwres/platform.h
index 608bb72..9f207db 100644
--- a/lib/bind/lwres/lwres/platform.h
+++ b/lib/bind/lwres/lwres/platform.h
@@ -17,7 +17,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.21 2007/06/19 23:47:23 tbox Exp $ */
+/* $Id: platform.h.in,v 1.21 2007-06-19 23:47:23 tbox Exp $ */
/*! \file */
diff --git a/lib/csu/powerpc64/Makefile b/lib/csu/powerpc64/Makefile
index 04926ad..095a9ad 100644
--- a/lib/csu/powerpc64/Makefile
+++ b/lib/csu/powerpc64/Makefile
@@ -4,15 +4,14 @@
SRCS= crt1.c crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= gcrt1.o
-CFLAGS+= -Wall -Wno-unused \
- -I${.CURDIR}/../common \
+OBJS+= Scrt1.o gcrt1.o
+CFLAGS+= -I${.CURDIR}/../common \
-I${.CURDIR}/../../libc/include
all: ${OBJS}
CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s
+CLEANFILES+= crt1.s gcrt1.s Scrt1.s
# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
# directly compiled to .o files.
@@ -31,6 +30,13 @@ gcrt1.s: crt1.c
gcrt1.o: gcrt1.s
${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s
+Scrt1.s: crt1.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
+ sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+
+Scrt1.o: Scrt1.s
+ ${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s
+
realinstall:
${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${OBJS} ${DESTDIR}${LIBDIR}
diff --git a/lib/libc/db/btree/bt_split.c b/lib/libc/db/btree/bt_split.c
index ca8b16a..f0db406 100644
--- a/lib/libc/db/btree/bt_split.c
+++ b/lib/libc/db/btree/bt_split.c
@@ -37,6 +37,7 @@ static char sccsid[] = "@(#)bt_split.c 8.10 (Berkeley) 1/9/95";
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/param.h>
#include <limits.h>
#include <stdio.h>
@@ -482,7 +483,7 @@ bt_rroot(BTREE *t, PAGE *h, PAGE *l, PAGE *r)
WR_RINTERNAL(dest,
l->flags & P_RLEAF ? NEXTINDEX(l) : rec_total(l), l->pgno);
- h->linp[1] = h->upper -= NRINTERNAL;
+ __PAST_END(h->linp, 1) = h->upper -= NRINTERNAL;
dest = (char *)h + h->upper;
WR_RINTERNAL(dest,
r->flags & P_RLEAF ? NEXTINDEX(r) : rec_total(r), r->pgno);
@@ -534,7 +535,7 @@ bt_broot(BTREE *t, PAGE *h, PAGE *l, PAGE *r)
case P_BLEAF:
bl = GETBLEAF(r, 0);
nbytes = NBINTERNAL(bl->ksize);
- h->linp[1] = h->upper -= nbytes;
+ __PAST_END(h->linp, 1) = h->upper -= nbytes;
dest = (char *)h + h->upper;
WR_BINTERNAL(dest, bl->ksize, r->pgno, 0);
memmove(dest, bl->bytes, bl->ksize);
@@ -550,7 +551,7 @@ bt_broot(BTREE *t, PAGE *h, PAGE *l, PAGE *r)
case P_BINTERNAL:
bi = GETBINTERNAL(r, 0);
nbytes = NBINTERNAL(bi->ksize);
- h->linp[1] = h->upper -= nbytes;
+ __PAST_END(h->linp, 1) = h->upper -= nbytes;
dest = (char *)h + h->upper;
memmove(dest, bi, nbytes);
((BINTERNAL *)dest)->pgno = r->pgno;
diff --git a/lib/libc/db/man/mpool.3 b/lib/libc/db/man/mpool.3
index 3de51c3..5af7d27 100644
--- a/lib/libc/db/man/mpool.3
+++ b/lib/libc/db/man/mpool.3
@@ -28,7 +28,7 @@
.\" @(#)mpool.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd February 25, 1999
+.Dd June 17, 2011
.Dt MPOOL 3
.Os
.Sh NAME
@@ -147,7 +147,14 @@ is returned and
is set.
The
.Fa flags
-argument is not currently used.
+argument is specified by
+.Em or Ns 'ing
+any of the following values:
+.Bl -tag -width indent
+.It Dv MPOOL_IGNOREPIN
+The page returned is not pinned;
+page will otherwise be pinned on return.
+.El
.Pp
The
.Fn mpool_put
diff --git a/lib/libc/gen/basename.3 b/lib/libc/gen/basename.3
index 4a3743a..bcdd99e 100644
--- a/lib/libc/gen/basename.3
+++ b/lib/libc/gen/basename.3
@@ -1,33 +1,22 @@
+.\" $OpenBSD: basename.3,v 1.20 2007/05/31 19:19:28 jmc Exp $
.\"
.\" Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
-.\" All rights reserved.
.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
+.\" 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.
.\"
-.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
-.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\" 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.
.\"
-.\" $OpenBSD: basename.3,v 1.12 2000/04/18 03:01:25 aaron Exp $
.\" $FreeBSD$
.\"
-.Dd October 6, 2009
+.Dd March 31, 2010
.Dt BASENAME 3
.Os
.Sh NAME
@@ -42,8 +31,7 @@
.Sh DESCRIPTION
The
.Fn basename
-function
-returns the last component from the pathname pointed to by
+function returns the last component from the pathname pointed to by
.Fa path ,
deleting any trailing
.Sq \&/
@@ -111,4 +99,15 @@ function first appeared in
and
.Fx 4.2 .
.Sh AUTHORS
-.An "Todd C. Miller" Aq Todd.Miller@courtesan.com
+.An Todd C. Miller
+.Sh CAVEATS
+.Fn basename
+returns a pointer to internal static storage space that will be overwritten
+by subsequent calls.
+.Pp
+Other vendor implementations of
+.Fn basename
+may modify the contents of the string passed to
+.Fn basename ;
+this should be taken into account when writing code which calls this function
+if portability is desired.
diff --git a/lib/libc/gen/basename.c b/lib/libc/gen/basename.c
index 9588c28..f2bfe5f 100644
--- a/lib/libc/gen/basename.c
+++ b/lib/libc/gen/basename.c
@@ -1,35 +1,21 @@
+/* $OpenBSD: basename.c,v 1.14 2005/08/08 08:05:33 espie Exp $ */
+
/*
- * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
- * All rights reserved.
+ * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com>
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * 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.
*
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 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.
*/
-#if 0
-#ifndef lint
-static char rcsid[] = "$OpenBSD: basename.c,v 1.4 1999/05/30 17:10:30 espie Exp $";
-#endif /* not lint */
-#endif
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
@@ -40,27 +26,28 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
char *
-basename_r(path, bname)
- const char *path;
- char *bname;
+basename_r(const char *path, char *bname)
{
const char *endp, *startp;
+ size_t len;
/* Empty or NULL string gets treated as "." */
if (path == NULL || *path == '\0') {
- (void)strcpy(bname, ".");
- return(bname);
+ bname[0] = '.';
+ bname[1] = '\0';
+ return (bname);
}
- /* Strip trailing slashes */
+ /* Strip any trailing slashes */
endp = path + strlen(path) - 1;
while (endp > path && *endp == '/')
endp--;
/* All slashes becomes "/" */
if (endp == path && *endp == '/') {
- (void)strcpy(bname, "/");
- return(bname);
+ bname[0] = '/';
+ bname[1] = '\0';
+ return (bname);
}
/* Find the start of the base */
@@ -68,18 +55,18 @@ basename_r(path, bname)
while (startp > path && *(startp - 1) != '/')
startp--;
- if (endp - startp + 2 > MAXPATHLEN) {
+ len = endp - startp + 1;
+ if (len >= MAXPATHLEN) {
errno = ENAMETOOLONG;
- return(NULL);
+ return (NULL);
}
- (void)strncpy(bname, startp, endp - startp + 1);
- bname[endp - startp + 1] = '\0';
- return(bname);
+ memcpy(bname, startp, len);
+ bname[len] = '\0';
+ return (bname);
}
char *
-basename(path)
- const char *path;
+basename(const char *path)
{
static char *bname = NULL;
diff --git a/lib/libc/gen/ftw.c b/lib/libc/gen/ftw.c
index 0177712..bfaf121 100644
--- a/lib/libc/gen/ftw.c
+++ b/lib/libc/gen/ftw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ftw.c,v 1.4 2004/07/07 16:05:23 millert Exp $ */
+/* $OpenBSD: ftw.c,v 1.5 2005/08/08 08:05:34 espie Exp $ */
/*
* Copyright (c) 2003, 2004 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -20,12 +20,6 @@
* Materiel Command, USAF, under agreement number F39502-99-1-0512.
*/
-#if 0
-#if defined(LIBC_SCCS) && !defined(lint)
-static const char rcsid[] = "$OpenBSD: ftw.c,v 1.4 2004/07/07 16:05:23 millert Exp $";
-#endif /* LIBC_SCCS and not lint */
-#endif
-
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
diff --git a/lib/libc/gen/getutxent.3 b/lib/libc/gen/getutxent.3
index 5c8b793..1920555 100644
--- a/lib/libc/gen/getutxent.3
+++ b/lib/libc/gen/getutxent.3
@@ -175,7 +175,7 @@ prefix, corresponding with the device used to facilitate the user login
session.
If no TTY character device is used, this field is left blank.
This field is only applicable to entries of type
-.Dv USER_PROCESS
+.Dv USER_PROCESS
and
.Dv LOGIN_PROCESS .
.It Fa ut_host
@@ -473,7 +473,7 @@ are extensions.
.Sh HISTORY
These functions appeared in
.Fx 9.0 .
-They replaced the
+They replaced the
.In utmp.h
interface.
.Sh AUTHORS
diff --git a/lib/libc/gen/posix_spawn.3 b/lib/libc/gen/posix_spawn.3
index 7569239..73359b4 100644
--- a/lib/libc/gen/posix_spawn.3
+++ b/lib/libc/gen/posix_spawn.3
@@ -34,7 +34,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 24, 2008
+.Dd June 17, 2011
.Dt POSIX_SPAWN 3
.Os
.Sh NAME
@@ -167,7 +167,7 @@ group IDs for the child process are changed as specified in the
attributes object referenced by
.Fa attrp .
.It
-The file actions specified by the spawn file actions object are
+The file actions specified by the spawn file actions object are
performed in the order in which they were added to the spawn file
actions object.
.It
@@ -384,29 +384,28 @@ the child process exits with exit status 127).
.It
If the
.Fa file_actions
-argument is not NULL, and specifies any close, dup2, or open actions to be
+argument is not NULL, and specifies any dup2 or open actions to be
performed, and if
.Fn posix_spawn
or
.Fn posix_spawnp
fails for any of the reasons that would cause
-.Fn close ,
-.Fn dup2 ,
+.Fn dup2
or
.Fn open
to fail, an error value is returned as described by
-.Fn close ,
-.Fn dup2 ,
+.Fn dup2
and
.Fn open ,
respectively (or, if the error occurs after the calling process successfully
returns, the child process exits with exit status 127). An open file action
may, by itself, result in any of the errors described by
-.Fn close
-or
.Fn dup2 ,
in addition to those described by
.Fn open .
+This implementation ignores any errors from
+.Fn close ,
+including trying to close a descriptor that is not open.
.El
.Sh SEE ALSO
.Xr close 2 ,
@@ -443,7 +442,13 @@ The
and
.Fn posix_spawnp
functions conform to
-.St -p1003.1-2001 .
+.St -p1003.1-2001 ,
+except that they ignore all errors from
+.Fn close .
+A future update of the Standard is expected to require that these functions
+not fail because a file descriptor to be closed (via
+.Fn posix_spawn_file_actions_addclose )
+is not open.
.Sh HISTORY
The
.Fn posix_spawn
diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c
index 58044b3..e3124b2 100644
--- a/lib/libc/gen/posix_spawn.c
+++ b/lib/libc/gen/posix_spawn.c
@@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
#include "namespace.h"
#include <sys/queue.h>
+#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
@@ -182,7 +183,7 @@ process_file_actions(const posix_spawn_file_actions_t fa)
if (error)
return (error);
}
- return (0);
+ return (0);
}
static int
@@ -193,7 +194,7 @@ do_posix_spawn(pid_t *pid, const char *path,
{
pid_t p;
volatile int error = 0;
-
+
p = vfork();
switch (p) {
case -1:
@@ -216,7 +217,9 @@ do_posix_spawn(pid_t *pid, const char *path,
error = errno;
_exit(127);
default:
- if (pid != NULL)
+ if (error != 0)
+ _waitpid(p, NULL, WNOHANG);
+ else if (pid != NULL)
*pid = p;
return (error);
}
diff --git a/lib/libc/gen/pututxline.c b/lib/libc/gen/pututxline.c
index 4caa00c..0cc7a01 100644
--- a/lib/libc/gen/pututxline.c
+++ b/lib/libc/gen/pututxline.c
@@ -57,7 +57,7 @@ futx_open(const char *file)
errno = EFTYPE;
return (NULL);
}
-
+
fp = fdopen(fd, "r+");
if (fp == NULL) {
_close(fd);
@@ -103,7 +103,7 @@ utx_active_add(const struct futx *fu)
/* Allow us to overwrite unused records. */
if (partial == -1) {
partial = ftello(fp);
- /*
+ /*
* Distinguish errors from valid values so we
* don't overwrite good data by accident.
*/
diff --git a/lib/libc/iconv/citrus_mapper.c b/lib/libc/iconv/citrus_mapper.c
index a788a9d9..b5ae96d 100644
--- a/lib/libc/iconv/citrus_mapper.c
+++ b/lib/libc/iconv/citrus_mapper.c
@@ -337,7 +337,9 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
goto quit;
/* open mapper */
+ UNLOCK;
ret = mapper_open(ma, &cm, module, variable);
+ WLOCK;
if (ret)
goto quit;
cm->cm_key = strdup(mapname);
diff --git a/lib/libc/iconv/iconv.c b/lib/libc/iconv/iconv.c
index 2cd38df..d1e01e8 100644
--- a/lib/libc/iconv/iconv.c
+++ b/lib/libc/iconv/iconv.c
@@ -85,7 +85,7 @@ _iconv_open(const char *out, const char *in, struct _citrus_iconv *prealloc)
errno = ENOMEM;
return ((iconv_t)-1);
}
-
+
p = out_truncated;
while (*p != 0) {
if (p[0] == '/' && p[1] == '/') {
diff --git a/lib/libc/net/sctp_opt_info.3 b/lib/libc/net/sctp_opt_info.3
index f010613..df8faa6 100644
--- a/lib/libc/net/sctp_opt_info.3
+++ b/lib/libc/net/sctp_opt_info.3
@@ -32,7 +32,7 @@
.\" From: @(#)send.2 8.2 (Berkeley) 2/21/94
.\" $FreeBSD$
.\"
-.Dd December 15, 2006
+.Dd June 18, 2011
.Dt SCTP_OPT_INFO 3
.Os
.Sh NAME
@@ -76,14 +76,30 @@ socket options.
.Pp
.Dv SCTP_PRIMARY_ADDR
.Pp
-.Dv SCTP_SET_PEER_PRIMARY_ADDR
+.Dv SCTP_PEER_ADDR_PARAMS
.Pp
-.Dv SCTP_STATUS
+.Dv SCTP_DEFAULT_SEND_PARAM
.Pp
-.Dv SCTP_GET_PEER_ADDR_INFO
+.Dv SCTP_MAX_SEG
.Pp
.Dv SCTP_AUTH_ACTIVE_KEY
.Pp
+.Dv SCTP_DELAYED_SACK
+.Pp
+.Dv SCTP_MAX_BURST
+.Pp
+.Dv SCTP_CONTEXT
+.Pp
+.Dv SCTP_EVENT
+.Pp
+.Dv SCTP_DEFAULT_SNDINFO
+.Pp
+.Dv SCTP_DEFAULT_PRINFO
+.Pp
+.Dv SCTP_STATUS
+.Pp
+.Dv SCTP_GET_PEER_ADDR_INFO
+.Pp
.Dv SCTP_PEER_AUTH_CHUNKS
.Pp
.Dv SCTP_LOCAL_AUTH_CHUNKS
@@ -115,3 +131,14 @@ is not a socket.
.Sh SEE ALSO
.Xr getsockopt 2 ,
.Xr sctp 4
+.Sh BUGS
+Because the structure used for
+.Fa arg
+of the
+.Dv SCTP_MAX_BURST
+socket option has changed in FreeBSD 9.0 and higher,
+using
+.Dv SCTP_MAX_BURST
+as
+.Fa opt
+is only supported in FreeBSD 9.0 and higher.
diff --git a/lib/libc/net/sctp_sys_calls.c b/lib/libc/net/sctp_sys_calls.c
index a450c17..27664bc 100644
--- a/lib/libc/net/sctp_sys_calls.c
+++ b/lib/libc/net/sctp_sys_calls.c
@@ -365,9 +365,6 @@ sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size)
case SCTP_DEFAULT_SEND_PARAM:
((struct sctp_assocparams *)arg)->sasoc_assoc_id = id;
break;
- case SCTP_SET_PEER_PRIMARY_ADDR:
- ((struct sctp_setpeerprim *)arg)->sspp_assoc_id = id;
- break;
case SCTP_PRIMARY_ADDR:
((struct sctp_setprim *)arg)->ssp_assoc_id = id;
break;
@@ -407,6 +404,15 @@ sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size)
case SCTP_EVENT:
((struct sctp_event *)arg)->se_assoc_id = id;
break;
+ case SCTP_DEFAULT_SNDINFO:
+ ((struct sctp_sndinfo *)arg)->snd_assoc_id = id;
+ break;
+ case SCTP_DEFAULT_PRINFO:
+ ((struct sctp_default_prinfo *)arg)->pr_assoc_id = id;
+ break;
+ case SCTP_MAX_BURST:
+ ((struct sctp_assoc_value *)arg)->assoc_id = id;
+ break;
default:
break;
}
@@ -942,6 +948,12 @@ sctp_recvv(int sd,
struct sctp_rcvinfo *rcvinfo;
struct sctp_nxtinfo *nxtinfo;
+ if (((info != NULL) && (infolen == NULL)) |
+ ((info == NULL) && (infolen != NULL) && (*infolen != 0)) ||
+ ((info != NULL) && (infotype == NULL))) {
+ errno = EINVAL;
+ return (-1);
+ }
if (infotype) {
*infotype = SCTP_RECVV_NOINFO;
}
@@ -1017,16 +1029,22 @@ sctp_sendv(int sd,
{
ssize_t ret;
int i;
- size_t addr_len;
- struct sctp_sendv_spa *spa_info;
+ socklen_t addr_len;
struct msghdr msg;
+ in_port_t port;
+ struct sctp_sendv_spa *spa_info;
struct cmsghdr *cmsg;
char *cmsgbuf;
struct sockaddr *addr;
struct sockaddr_in *addr_in;
struct sockaddr_in6 *addr_in6;
- if ((addrcnt < 0) || (iovcnt < 0)) {
+ if ((addrcnt < 0) ||
+ (iovcnt < 0) ||
+ ((addrs == NULL) && (addrcnt > 0)) ||
+ ((addrs != NULL) && (addrcnt == 0)) ||
+ ((iov == NULL) && (iovcnt > 0)) ||
+ ((iov != NULL) && (iovcnt == 0))) {
errno = EINVAL;
return (-1);
}
@@ -1042,8 +1060,15 @@ sctp_sendv(int sd,
msg.msg_controllen = 0;
cmsg = (struct cmsghdr *)cmsgbuf;
switch (infotype) {
+ case SCTP_SENDV_NOINFO:
+ if ((infolen != 0) || (info != NULL)) {
+ free(cmsgbuf);
+ errno = EINVAL;
+ return (-1);
+ }
+ break;
case SCTP_SENDV_SNDINFO:
- if (infolen < sizeof(struct sctp_sndinfo)) {
+ if ((info == NULL) || (infolen < sizeof(struct sctp_sndinfo))) {
free(cmsgbuf);
errno = EINVAL;
return (-1);
@@ -1056,7 +1081,7 @@ sctp_sendv(int sd,
cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct sctp_sndinfo)));
break;
case SCTP_SENDV_PRINFO:
- if (infolen < sizeof(struct sctp_prinfo)) {
+ if ((info == NULL) || (infolen < sizeof(struct sctp_prinfo))) {
free(cmsgbuf);
errno = EINVAL;
return (-1);
@@ -1069,7 +1094,7 @@ sctp_sendv(int sd,
cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct sctp_prinfo)));
break;
case SCTP_SENDV_AUTHINFO:
- if (infolen < sizeof(struct sctp_authinfo)) {
+ if ((info == NULL) || (infolen < sizeof(struct sctp_authinfo))) {
free(cmsgbuf);
errno = EINVAL;
return (-1);
@@ -1082,7 +1107,7 @@ sctp_sendv(int sd,
cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct sctp_authinfo)));
break;
case SCTP_SENDV_SPA:
- if (infolen < sizeof(struct sctp_sendv_spa)) {
+ if ((info == NULL) || (infolen < sizeof(struct sctp_sendv_spa))) {
free(cmsgbuf);
errno = EINVAL;
return (-1);
@@ -1119,52 +1144,71 @@ sctp_sendv(int sd,
return (-1);
}
addr = addrs;
- if (addrcnt == 1) {
- msg.msg_name = addr;
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+
+ for (i = 0; i < addrcnt; i++) {
switch (addr->sa_family) {
case AF_INET:
- msg.msg_namelen = sizeof(struct sockaddr_in);
+ addr_len = (socklen_t) sizeof(struct sockaddr_in);
+ addr_in = (struct sockaddr_in *)addr;
+ if (addr_in->sin_len != addr_len) {
+ free(cmsgbuf);
+ errno = EINVAL;
+ return (-1);
+ }
+ if (i == 0) {
+ port = addr_in->sin_port;
+ } else {
+ if (port == addr_in->sin_port) {
+ cmsg->cmsg_level = IPPROTO_SCTP;
+ cmsg->cmsg_type = SCTP_DSTADDRV4;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
+ memcpy(CMSG_DATA(cmsg), &addr_in->sin_addr, sizeof(struct in_addr));
+ msg.msg_controllen += CMSG_SPACE(sizeof(struct in_addr));
+ cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct in_addr)));
+ } else {
+ free(cmsgbuf);
+ errno = EINVAL;
+ return (-1);
+ }
+ }
break;
case AF_INET6:
- msg.msg_namelen = sizeof(struct sockaddr_in6);
+ addr_len = (socklen_t) sizeof(struct sockaddr_in6);
+ addr_in6 = (struct sockaddr_in6 *)addr;
+ if (addr_in6->sin6_len != addr_len) {
+ free(cmsgbuf);
+ errno = EINVAL;
+ return (-1);
+ }
+ if (i == 0) {
+ port = addr_in6->sin6_port;
+ } else {
+ if (port == addr_in6->sin6_port) {
+ cmsg->cmsg_level = IPPROTO_SCTP;
+ cmsg->cmsg_type = SCTP_DSTADDRV6;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_addr));
+ memcpy(CMSG_DATA(cmsg), &addr_in6->sin6_addr, sizeof(struct in6_addr));
+ msg.msg_controllen += CMSG_SPACE(sizeof(struct in6_addr));
+ cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct in6_addr)));
+ } else {
+ free(cmsgbuf);
+ errno = EINVAL;
+ return (-1);
+ }
+ }
break;
default:
free(cmsgbuf);
errno = EINVAL;
return (-1);
}
- } else {
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- for (i = 0; i < addrcnt; i++) {
- switch (addr->sa_family) {
- case AF_INET:
- addr_len = sizeof(struct sockaddr_in);
- addr_in = (struct sockaddr_in *)addr;
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_DSTADDRV4;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
- memcpy(CMSG_DATA(cmsg), &addr_in->sin_addr, sizeof(struct in_addr));
- msg.msg_controllen += CMSG_SPACE(sizeof(struct in_addr));
- cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct in_addr)));
- break;
- case AF_INET6:
- addr_len = sizeof(struct sockaddr_in6);
- addr_in6 = (struct sockaddr_in6 *)addr;
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_DSTADDRV6;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_addr));
- memcpy(CMSG_DATA(cmsg), &addr_in6->sin6_addr, sizeof(struct in6_addr));
- msg.msg_controllen += CMSG_SPACE(sizeof(struct in6_addr));
- cmsg = (struct cmsghdr *)((caddr_t)cmsg + CMSG_SPACE(sizeof(struct in6_addr)));
- break;
- default:
- free(cmsgbuf);
- errno = EINVAL;
- return (-1);
- }
- addr = (struct sockaddr *)((caddr_t)addr + addr_len);
+ if (i == 0) {
+ msg.msg_name = addr;
+ msg.msg_namelen = addr_len;
}
+ addr = (struct sockaddr *)((caddr_t)addr + addr_len);
}
if (msg.msg_controllen == 0) {
msg.msg_control = NULL;
diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
index 48d9c14..5290512 100644
--- a/lib/libc/stdlib/malloc.c
+++ b/lib/libc/stdlib/malloc.c
@@ -234,7 +234,7 @@ __FBSDID("$FreeBSD$");
#ifdef __sparc64__
# define LG_QUANTUM 4
# define LG_SIZEOF_PTR 3
-# define TLS_MODEL /* default */
+# define TLS_MODEL __attribute__((tls_model("initial-exec")))
#endif
#ifdef __amd64__
# define LG_QUANTUM 4
diff --git a/lib/libc/stdlib/ptsname.c b/lib/libc/stdlib/ptsname.c
index fc3b719..40b140d 100644
--- a/lib/libc/stdlib/ptsname.c
+++ b/lib/libc/stdlib/ptsname.c
@@ -82,7 +82,7 @@ ptsname(int fildes)
/* Make sure fildes points to a master device. */
if (__isptmaster(fildes) != 0)
goto done;
-
+
if (fdevname_r(fildes, pt_slave + (sizeof _PATH_DEV - 1),
sizeof pt_slave - (sizeof _PATH_DEV - 1)) != NULL)
ret = pt_slave;
diff --git a/lib/libc/sys/rfork.2 b/lib/libc/sys/rfork.2
index f1ae14b..222bac4 100644
--- a/lib/libc/sys/rfork.2
+++ b/lib/libc/sys/rfork.2
@@ -5,7 +5,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 15, 2011
+.Dd July 12, 2011
.Dt RFORK 2
.Os
.Sh NAME
@@ -84,8 +84,18 @@ Note that a lot of code will not run correctly in such an environment.
.It Dv RFSIGSHARE
If set, the kernel will force sharing the sigacts structure between the
child and the parent.
+.It Dv RFTSIGZMB
+If set, the kernel will deliver a specified signal to the parent
+upon the child exit, instead of default SIGCHLD.
+The signal number
+.Dv signum
+is specified by oring the
+.Dv RFTSIGFLAGS(signum)
+expression into
+.Fa flags .
+Specifying signal number 0 disables signal delivery upon the child exit.
.It Dv RFLINUXTHPN
-If set, the kernel will return SIGUSR1 instead of SIGCHILD upon thread
+If set, the kernel will deliver SIGUSR1 instead of SIGCHLD upon thread
exit for the child.
This is intended to mimic certain Linux clone behaviour.
.El
@@ -164,6 +174,8 @@ would be exceeded (see
Both the RFFDG and the RFCFDG flags were specified.
.It Bq Er EINVAL
Any flags not listed above were specified.
+.It Bq Er EINVAL
+An invalid signal number was specified.
.It Bq Er ENOMEM
There is insufficient swap space for the new process.
.El
diff --git a/lib/libc/sys/wait.2 b/lib/libc/sys/wait.2
index 2e084d2..e4812fc 100644
--- a/lib/libc/sys/wait.2
+++ b/lib/libc/sys/wait.2
@@ -66,6 +66,19 @@ the
.Fa status
area contains termination information about the process that exited
as defined below.
+The
+.Fn wait
+call is the same as
+.Fn wait4
+with a
+.Fa wpid
+value of -1,
+with an
+.Fa options
+value of zero,
+and a
+.Fa rusage
+value of zero.
.Pp
The
.Fn wait4
diff --git a/lib/libc/xdr/Makefile.inc b/lib/libc/xdr/Makefile.inc
index 2d360ac..d1bb208 100644
--- a/lib/libc/xdr/Makefile.inc
+++ b/lib/libc/xdr/Makefile.inc
@@ -3,7 +3,8 @@
.PATH: ${.CURDIR}/xdr ${.CURDIR}/.
SRCS+= xdr.c xdr_array.c xdr_float.c xdr_mem.c \
- xdr_rec.c xdr_reference.c xdr_stdio.c
+ xdr_rec.c xdr_reference.c xdr_sizeof.c \
+ xdr_stdio.c
SYM_MAPS+= ${.CURDIR}/xdr/Symbol.map
@@ -39,6 +40,7 @@ MLINKS+= rpc_xdr.3 xdr_accepted_reply.3 \
xdr.3 xdr_reference.3 \
xdr.3 xdr_setpos.3 \
xdr.3 xdr_short.3 \
+ xdr.3 xdr_sizeof.3 \
xdr.3 xdrstdio_create.3 \
xdr.3 xdr_string.3 \
xdr.3 xdr_u_char.3 \
diff --git a/lib/libc/xdr/Symbol.map b/lib/libc/xdr/Symbol.map
index 0739b7b..a8eb3a1 100644
--- a/lib/libc/xdr/Symbol.map
+++ b/lib/libc/xdr/Symbol.map
@@ -42,7 +42,6 @@ FBSD_1.0 {
xdrrec_endofrecord;
xdr_reference;
xdr_pointer;
- /* xdr_sizeof; */ /* Why is xdr_sizeof.c not included in Makefileinc? */
xdrstdio_create;
};
@@ -51,3 +50,7 @@ FBSD_1.1 {
xdr_uint32_t;
xdr_uint64_t;
};
+
+FBSD_1.2 {
+ xdr_sizeof;
+};
diff --git a/lib/libc/xdr/xdr.3 b/lib/libc/xdr/xdr.3
index 19c7e57..69f2544 100644
--- a/lib/libc/xdr/xdr.3
+++ b/lib/libc/xdr/xdr.3
@@ -31,6 +31,7 @@
.Nm xdr_reference ,
.Nm xdr_setpos ,
.Nm xdr_short ,
+.Nm xdr_sizeof,
.Nm xdrstdio_create ,
.Nm xdr_string ,
.Nm xdr_u_char ,
@@ -561,6 +562,18 @@ A filter primitive that translates between C
integers and their external representations.
This routine returns one if it succeeds, zero otherwise.
.Pp
+.It Xo
+.Ft unsigned long
+.Xc
+.It Xo
+.Fn xdr_sizeof "xdrproc_t func" "void *data"
+.Xc
+.Pp
+This routine returns the amount of memory required to encode
+.Fa data
+using filter
+.Fa func .
+.Pp
.It Li "#ifdef _STDIO_H_"
.It Li "/* XDR using stdio library */"
.It Xo
@@ -827,3 +840,8 @@ Returns one if it succeeds, zero otherwise.
.%O RFC1014
.%Q "Sun Microsystems, Inc., USC\-ISI"
.Re
+.Sh HISTORY
+The
+.Nm xdr_sizeof
+function first appeared in
+.Fx 9.0 .
diff --git a/lib/libc/xdr/xdr_sizeof.c b/lib/libc/xdr/xdr_sizeof.c
index 20f1c3a..f33c613 100644
--- a/lib/libc/xdr/xdr_sizeof.c
+++ b/lib/libc/xdr/xdr_sizeof.c
@@ -94,7 +94,7 @@ x_inline(xdrs, len)
if (xdrs->x_op != XDR_ENCODE) {
return (NULL);
}
- if (len < (u_int)xdrs->x_base) {
+ if (len < (u_int)(uintptr_t)xdrs->x_base) {
/* x_private was already allocated */
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
@@ -106,7 +106,7 @@ x_inline(xdrs, len)
xdrs->x_base = 0;
return (NULL);
}
- xdrs->x_base = (caddr_t) len;
+ xdrs->x_base = (caddr_t)(uintptr_t)len;
xdrs->x_handy += len;
return ((int32_t *) xdrs->x_private);
}
diff --git a/lib/libkvm/kvm_pcpu.c b/lib/libkvm/kvm_pcpu.c
index bc73baf..d7108b4 100644
--- a/lib/libkvm/kvm_pcpu.c
+++ b/lib/libkvm/kvm_pcpu.c
@@ -39,13 +39,11 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
-#include <sys/cpuset.h>
#include <sys/pcpu.h>
#include <sys/sysctl.h>
#include <kvm.h>
#include <limits.h>
#include <stdlib.h>
-#include <unistd.h>
#include "kvm_private.h"
@@ -120,9 +118,6 @@ _kvm_pcpu_clear(void)
void *
kvm_getpcpu(kvm_t *kd, int cpu)
{
- long kcpusetsize;
- ssize_t nbytes;
- uintptr_t readptr;
char *buf;
if (kd == NULL) {
@@ -130,10 +125,6 @@ kvm_getpcpu(kvm_t *kd, int cpu)
return (NULL);
}
- kcpusetsize = sysconf(_SC_CPUSET_SIZE);
- if (kcpusetsize == -1 || (u_long)kcpusetsize > sizeof(cpuset_t))
- return ((void *)-1);
-
if (maxcpu == 0)
if (_kvm_pcpu_init(kd) < 0)
return ((void *)-1);
@@ -146,26 +137,8 @@ kvm_getpcpu(kvm_t *kd, int cpu)
_kvm_err(kd, kd->program, "out of memory");
return ((void *)-1);
}
- nbytes = sizeof(struct pcpu) - 2 * kcpusetsize;
- readptr = (uintptr_t)pcpu_data[cpu];
- if (kvm_read(kd, readptr, buf, nbytes) != nbytes) {
- _kvm_err(kd, kd->program, "unable to read per-CPU data");
- free(buf);
- return ((void *)-1);
- }
-
- /* Fetch the valid cpuset_t objects. */
- CPU_ZERO((cpuset_t *)(buf + nbytes));
- CPU_ZERO((cpuset_t *)(buf + nbytes + sizeof(cpuset_t)));
- readptr += nbytes;
- if (kvm_read(kd, readptr, buf + nbytes, kcpusetsize) != kcpusetsize) {
- _kvm_err(kd, kd->program, "unable to read per-CPU data");
- free(buf);
- return ((void *)-1);
- }
- readptr += kcpusetsize;
- if (kvm_read(kd, readptr, buf + nbytes + sizeof(cpuset_t),
- kcpusetsize) != kcpusetsize) {
+ if (kvm_read(kd, (uintptr_t)pcpu_data[cpu], buf,
+ sizeof(struct pcpu)) != sizeof(struct pcpu)) {
_kvm_err(kd, kd->program, "unable to read per-CPU data");
free(buf);
return ((void *)-1);
diff --git a/lib/liblzma/config.h b/lib/liblzma/config.h
index 374762c..9d97247 100644
--- a/lib/liblzma/config.h
+++ b/lib/liblzma/config.h
@@ -59,10 +59,10 @@
#define PACKAGE "xz"
#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org"
#define PACKAGE_NAME "XZ Utils"
-#define PACKAGE_STRING "XZ Utils 5.0.0"
+#define PACKAGE_STRING "XZ Utils 5.0.3"
#define PACKAGE_TARNAME "xz"
#define PACKAGE_URL "http://tukaani.org/xz/"
-#define PACKAGE_VERSION "5.0.0"
+#define PACKAGE_VERSION "5.0.3"
#define SIZEOF_SIZE_T 8
#define STDC_HEADERS 1
#define TUKLIB_CPUCORES_SYSCTL 1
@@ -82,8 +82,12 @@
#ifndef __EXTENSIONS__
# define __EXTENSIONS__ 1
#endif
-#define VERSION "5.0.0"
+#define VERSION "5.0.3"
#if defined(__FreeBSD__)
+#include <sys/_types.h>
+#if defined(__NO_STRICT_ALIGNMENT)
+#define TUKLIB_FAST_UNALIGNED_ACCESS 1
+#endif
#include <machine/endian.h>
#if _BYTE_ORDER == _BIG_ENDIAN
# define WORDS_BIGENDIAN 1
diff --git a/lib/libmd/sha256.3 b/lib/libmd/sha256.3
index fb96100..f40e6df 100644
--- a/lib/libmd/sha256.3
+++ b/lib/libmd/sha256.3
@@ -127,7 +127,7 @@ argument is non-null it must point to at least 65 characters of buffer space.
.Xr sha 3
.Sh HISTORY
These functions appeared in
-.Fx 4.0 .
+.Fx 6.0 .
.Sh AUTHORS
The core hash routines were implemented by Colin Percival based on
the published
diff --git a/lib/libmd/sha512.3 b/lib/libmd/sha512.3
index 45a4096..953ee25 100644
--- a/lib/libmd/sha512.3
+++ b/lib/libmd/sha512.3
@@ -127,7 +127,7 @@ argument is non-null it must point to at least 65 characters of buffer space.
.Xr sha 3
.Sh HISTORY
These functions appeared in
-.Fx 4.0 .
+.Fx 9.0 .
.Sh AUTHORS
The core hash routines were implemented by Colin Percival based on
the published
diff --git a/lib/libprocstat/Makefile b/lib/libprocstat/Makefile
index e509169..9804483 100644
--- a/lib/libprocstat/Makefile
+++ b/lib/libprocstat/Makefile
@@ -15,10 +15,14 @@ SRCS= cd9660.c \
VERSION_DEF= ${.CURDIR}/Versions.def
SYMBOL_MAPS= ${.CURDIR}/Symbol.map
-INCS= libprocstat.h
+INCS= libprocstat.h
CFLAGS+= -I. -I${.CURDIR} -D_KVM_VNODE
SHLIB_MAJOR= 1
-WITHOUT_MAN= yes
+
+DPADD= ${LIBKVM} ${LIBUTIL}
+LDADD= -lkvm -lutil
+
+MAN= libprocstat.3
.if ${MK_NCP} != "no"
CFLAGS+= -DLIBPROCSTAT_NWFS
diff --git a/lib/libprocstat/libprocstat.3 b/lib/libprocstat/libprocstat.3
new file mode 100644
index 0000000..49799f5
--- /dev/null
+++ b/lib/libprocstat/libprocstat.3
@@ -0,0 +1,258 @@
+.\" Copyright (c) 2011 Sergey Kandaurov <pluknet@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 12, 2011
+.Dt LIBPROCSTAT 3
+.Os
+.Sh NAME
+.Nm procstat_open_kvm ,
+.Nm procstat_open_sysctl ,
+.Nm procstat_close ,
+.Nm procstat_getfiles ,
+.Nm procstat_getprocs ,
+.Nm procstat_freefiles ,
+.Nm procstat_freeprocs ,
+.Nm procstat_get_pipe_info ,
+.Nm procstat_get_pts_info ,
+.Nm procstat_get_socket_info ,
+.Nm procstat_get_vnode_info
+.Nd library interface for file and process information retrieval
+.Sh LIBRARY
+.Lb libprocstat
+.Sh SYNOPSIS
+.In sys/param.h
+.In sys/queue.h
+.In libprocstat.h
+.Ft void
+.Fn procstat_close "struct procstat *procstat"
+.Ft void
+.Fo procstat_freefiles
+.Fa "struct procstat *procstat"
+.Fa "struct filestat_list *head"
+.Fc
+.Ft void
+.Fn procstat_freeprocs "struct procstat *procstat" "struct kinfo_proc *p"
+.Ft int
+.Fo procstat_get_pipe_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct pipestat *pipe"
+.Fa "char *errbuf"
+.Fc
+.Ft int
+.Fo procstat_get_pts_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct ptsstat *pts"
+.Fa "char *errbuf"
+.Fc
+.Ft int
+.Fo procstat_get_socket_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct sockstat *sock"
+.Fa "char *errbuf"
+.Fc
+.Ft int
+.Fo procstat_get_vnode_info
+.Fa "struct procstat *procstat"
+.Fa "struct filestat *fst"
+.Fa "struct vnstat *vn"
+.Fa "char *errbuf"
+.Fc
+.Ft "struct filestat_list *"
+.Fo procstat_getfiles
+.Fa "struct procstat *procstat"
+.Fa "struct kinfo_proc *kp"
+.Fa "int mmapped"
+.Fc
+.Ft "struct kinfo_proc *"
+.Fo procstat_getprocs
+.Fa "struct procstat *procstat"
+.Fa "int what"
+.Fa "int arg"
+.Fa "unsigned int *count"
+.Fc
+.Ft "struct procstat *"
+.Fn procstat_open_kvm "const char *nlistf" "const char *memf"
+.Ft "struct procstat *"
+.Fn procstat_open_sysctl void
+.Sh DESCRIPTION
+The
+.Nm libprocstat
+library contains the API for runtime file and process information
+retrieval from the running kernel via the
+.Xr sysctl 3
+library backend, and for post-mortem analysis via the
+.Xr kvm 3
+library backend.
+.Pp
+The
+.Fn procstat_open_kvm
+and
+.Fn procstat_open_sysctl
+functions use the
+.Xr kvm 3
+or
+.Xr sysctl 3
+library routines, respectively, to access kernel state information
+used to retrieve processes and files states.
+The
+.Fa nlistf
+argument is the executable image of the kernel being examined.
+If this argument is
+.Dv NULL ,
+the currently running kernel is assumed.
+The
+.Fa memf
+argument is the kernel memory device file.
+If this argument is
+.Dv NULL ,
+then
+.Pa /dev/mem
+is assumed.
+See
+.Xr kvm_open 3
+for more details.
+Both functions dynamically allocate and return a
+.Vt procstat
+structure pointer used in the rest of the
+.Nm libprocstat
+library routines until the corresponding
+.Fn procstat_close
+call that cleans up the resources allocated by the
+.Fn procstat_open_*
+functions.
+.Pp
+The
+.Fn procstat_getprocs
+function gets a pointer to the
+.Vt procstat
+structure from one of the
+.Fn procstat_open_*
+functions and returns a dynamically allocated (sub-)set of active processes
+in the kernel filled in to array of
+.Vt kinfo_proc
+structures.
+The
+.Fa what
+and
+.Fa arg
+arguments constitute a filtering predicate as described in the
+.Xr kvm_getprocs 3
+function.
+The number of processes found is returned in the reference parameter
+.Fa cnt .
+The caller is responsible to free the allocated memory with a subsequent
+.Fn procstat_freeprocs
+function call.
+.Pp
+The
+.Fn procstat_getfiles
+function gets a pointer to the
+.Vt procstat
+structure initialized with one of the
+.Fn procstat_open_*
+functions, a pointer to
+.Vt kinfo_proc
+structure from the array obtained from the
+.Fn kvm_getprocs
+function, and returns a dynamically allocated linked list of filled in
+.Vt filestat_list
+structures using the STAILQ macros defined in
+.Xr queue 3 .
+The caller is responsible to free the allocated memory with a subsequent
+.Fn procstat_freefiles
+function call.
+.Pp
+The
+.Fn procstat_get_pipe_info ,
+.Fn procstat_get_pts_info ,
+.Fn procstat_get_socket_info
+and
+.Fn procstat_get_vnode_info
+functions are used to retrive information about pipes, pseudo-terminals,
+sockets, and vnodes, respectively.
+Each of them have a similar interface API.
+The
+.Fa procstat
+argument is a pointer obtained from one of
+.Fn procstat_open_*
+functions.
+The
+.Ft filestat Fa fst
+argument is an element of STAILQ linked list as obtained from the
+.Fn procstat_getfiles
+function.
+The
+.Ft filestat
+structure contains a
+.Fa fs_type
+field that specifies a file type and a corresponding function to be
+called among the
+.Nm procstat_get_*_info
+function family.
+The actual object is returned in the 3rd reference parameter.
+The
+.Fa errbuf
+argument indicates an actual error message in case of failure.
+.Pp
+.Bl -tag -width 20n -compact -offset indent
+.It Li PS_FST_TYPE_FIFO
+.Nm procstat_get_vnode_info
+.It Li PS_FST_TYPE_VNODE
+.Nm procstat_get_vnode_info
+.It Li PS_FST_TYPE_SOCKET
+.Nm procstat_get_socket_info
+.It Li PS_FST_TYPE_PIPE
+.Nm procstat_get_pipe_info
+.It Li PS_FST_TYPE_PTS
+.Nm procstat_get_pts_info
+.El
+.Sh SEE ALSO
+.Xr fstat 1 ,
+.Xr fuser 1 ,
+.Xr pipe 2 ,
+.Xr socket 2 ,
+.Xr kvm 3 ,
+.Xr queue 3 ,
+.Xr sysctl 3 ,
+.Xr pts 4 ,
+.Xr vnode 9
+.Sh HISTORY
+The
+.Nm libprocstat
+library appeared in
+.Fx 9.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm libprocstat
+library was written by
+.An Stanislav Sedov Aq stas@FreeBSD.org .
+.Pp
+This manual page was written by
+.An Sergey Kandaurov Aq pluknet@FreeBSD.org .
diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c
index 384fe73..22ca668 100644
--- a/lib/libprocstat/libprocstat.c
+++ b/lib/libprocstat/libprocstat.c
@@ -191,7 +191,7 @@ procstat_getprocs(struct procstat *procstat, int what, int arg,
len = *count * sizeof(*p);
p = malloc(len);
if (p == NULL) {
- warnx("malloc(%zd)", len);
+ warnx("malloc(%zu)", len);
goto fail;
}
bcopy(p0, p, len);
@@ -213,7 +213,7 @@ procstat_getprocs(struct procstat *procstat, int what, int arg,
}
p = malloc(len);
if (p == NULL) {
- warnx("malloc(%zd)", len);
+ warnx("malloc(%zu)", len);
goto fail;
}
error = sysctl(name, 4, p, &len, NULL, 0);
@@ -229,7 +229,7 @@ procstat_getprocs(struct procstat *procstat, int what, int arg,
*count = len / sizeof(*p);
return (p);
} else {
- warnx("unknown access method");
+ warnx("unknown access method: %d", procstat->type);
return (NULL);
}
fail:
@@ -271,11 +271,11 @@ procstat_freefiles(struct procstat *procstat, struct filestat_list *head)
}
free(head);
if (procstat->vmentries != NULL) {
- free (procstat->vmentries);
+ free(procstat->vmentries);
procstat->vmentries = NULL;
}
if (procstat->files != NULL) {
- free (procstat->files);
+ free(procstat->files);
procstat->files = NULL;
}
}
@@ -426,7 +426,7 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap
nfiles = filed.fd_lastfile + 1;
ofiles = malloc(nfiles * sizeof(struct file *));
if (ofiles == NULL) {
- warn("malloc(%zd)", nfiles * sizeof(struct file *));
+ warn("malloc(%zu)", nfiles * sizeof(struct file *));
goto do_mmapped;
}
if (!kvm_read_all(kd, (unsigned long)filed.fd_ofiles, ofiles,
@@ -522,7 +522,8 @@ do_mmapped:
fflags = 0;
if (prot & VM_PROT_READ)
fflags = PS_FST_FFLAG_READ;
- if (prot & VM_PROT_WRITE)
+ if ((vmentry.eflags & MAP_ENTRY_COW) == 0 &&
+ prot & VM_PROT_WRITE)
fflags |= PS_FST_FFLAG_WRITE;
/*
@@ -696,7 +697,8 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m
fflags = 0;
if (kve->kve_protection & KVME_PROT_READ)
fflags = PS_FST_FFLAG_READ;
- if (kve->kve_protection & KVME_PROT_WRITE)
+ if ((kve->kve_flags & KVME_FLAG_COW) == 0 &&
+ kve->kve_protection & KVME_PROT_WRITE)
fflags |= PS_FST_FFLAG_WRITE;
offset = kve->kve_offset;
refcount = kve->kve_ref_count;
@@ -726,7 +728,7 @@ procstat_get_pipe_info(struct procstat *procstat, struct filestat *fst,
} else if (procstat->type == PROCSTAT_SYSCTL) {
return (procstat_get_pipe_info_sysctl(fst, ps, errbuf));
} else {
- warnx("unknow access method: %d", procstat->type);
+ warnx("unknown access method: %d", procstat->type);
snprintf(errbuf, _POSIX2_LINE_MAX, "error");
return (1);
}
@@ -790,7 +792,7 @@ procstat_get_pts_info(struct procstat *procstat, struct filestat *fst,
} else if (procstat->type == PROCSTAT_SYSCTL) {
return (procstat_get_pts_info_sysctl(fst, pts, errbuf));
} else {
- warnx("unknow access method: %d", procstat->type);
+ warnx("unknown access method: %d", procstat->type);
snprintf(errbuf, _POSIX2_LINE_MAX, "error");
return (1);
}
@@ -852,7 +854,7 @@ procstat_get_vnode_info(struct procstat *procstat, struct filestat *fst,
} else if (procstat->type == PROCSTAT_SYSCTL) {
return (procstat_get_vnode_info_sysctl(fst, vn, errbuf));
} else {
- warnx("unknow access method: %d", procstat->type);
+ warnx("unknown access method: %d", procstat->type);
snprintf(errbuf, _POSIX2_LINE_MAX, "error");
return (1);
}
@@ -1059,7 +1061,7 @@ procstat_get_socket_info(struct procstat *procstat, struct filestat *fst,
} else if (procstat->type == PROCSTAT_SYSCTL) {
return (procstat_get_socket_info_sysctl(fst, sock, errbuf));
} else {
- warnx("unknow access method: %d", procstat->type);
+ warnx("unknown access method: %d", procstat->type);
snprintf(errbuf, _POSIX2_LINE_MAX, "error");
return (1);
}
@@ -1283,7 +1285,7 @@ vntype2psfsttype(int type)
static char *
getmnton(kvm_t *kd, struct mount *m)
{
- static struct mount mnt;
+ struct mount mnt;
static struct mtab {
struct mtab *next;
struct mount *m;
@@ -1302,7 +1304,7 @@ getmnton(kvm_t *kd, struct mount *m)
err(1, NULL);
mt->m = m;
bcopy(&mnt.mnt_stat.f_mntonname[0], &mt->mntonname[0], MNAMELEN);
- mnt.mnt_stat.f_mntonname[MNAMELEN] = '\0';
+ mt->mntonname[MNAMELEN] = '\0';
mt->next = mhead;
mhead = mt;
return (mt->mntonname);
diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile
index 6024350..05f0995 100644
--- a/lib/libstand/Makefile
+++ b/lib/libstand/Makefile
@@ -15,7 +15,7 @@ NO_PIC=
INCS= stand.h
MAN= libstand.3
-WARNS?= 2
+WARNS?= 0
CFLAGS+= -ffreestanding -Wformat
CFLAGS+= -I${.CURDIR}
diff --git a/lib/libstand/stand.h b/lib/libstand/stand.h
index eae1605..db0490f 100644
--- a/lib/libstand/stand.h
+++ b/lib/libstand/stand.h
@@ -65,15 +65,13 @@
#include <sys/cdefs.h>
#include <sys/stat.h>
#include <sys/dirent.h>
+
+/* this header intentionally exports NULL from <string.h> */
#include <string.h>
#define CHK(fmt, args...) printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args)
#define PCHK(fmt, args...) {printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args); getchar();}
-#ifndef NULL
-#define NULL 0
-#endif
-
/* Avoid unwanted userlandish components */
#define _KERNEL
#include <sys/errno.h>
diff --git a/lib/libstand/tftp.c b/lib/libstand/tftp.c
index 54e184c..bf92c04 100644
--- a/lib/libstand/tftp.c
+++ b/lib/libstand/tftp.c
@@ -64,13 +64,13 @@ struct tftp_handle;
static int tftp_open(const char *path, struct open_file *f);
static int tftp_close(struct open_file *f);
-static void tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len);
+static int tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len);
static int tftp_read(struct open_file *f, void *buf, size_t size, size_t *resid);
static int tftp_write(struct open_file *f, void *buf, size_t size, size_t *resid);
static off_t tftp_seek(struct open_file *f, off_t offset, int where);
static int tftp_set_blksize(struct tftp_handle *h, const char *str);
static int tftp_stat(struct open_file *f, struct stat *sb);
-static ssize_t sendrecv_tftp(struct tftp_handle *h,
+static ssize_t sendrecv_tftp(struct tftp_handle *h,
ssize_t (*sproc)(struct iodesc *, void *, size_t),
void *sbuf, size_t ssize,
ssize_t (*rproc)(struct tftp_handle *h, void *, ssize_t, time_t, unsigned short *),
@@ -93,7 +93,7 @@ static int tftpport = 2000;
static int is_open = 0;
/*
- * The legacy TFTP_BLKSIZE value was 512.
+ * The legacy TFTP_BLKSIZE value was SEGSIZE(512).
* TFTP_REQUESTED_BLKSIZE of 1428 is (Ethernet MTU, less the TFTP, UDP and
* IP header lengths).
*/
@@ -102,7 +102,7 @@ static int is_open = 0;
/*
* Choose a blksize big enough so we can test with Ethernet
* Jumbo frames in the future.
- */
+ */
#define TFTP_MAX_BLKSIZE 9008
struct tftp_handle {
@@ -113,7 +113,7 @@ struct tftp_handle {
int off;
char *path; /* saved for re-requests */
unsigned int tftp_blksize;
- unsigned long tftp_tsize;
+ unsigned long tftp_tsize;
struct {
u_char header[HEADER_SIZE];
struct tftphdr t;
@@ -121,7 +121,8 @@ struct tftp_handle {
} __packed __aligned(4) lastdata;
};
-static const int tftperrors[8] = {
+#define TFTP_MAX_ERRCODE EOPTNEG
+static const int tftperrors[TFTP_MAX_ERRCODE + 1] = {
0, /* ??? */
ENOENT,
EPERM,
@@ -129,10 +130,57 @@ static const int tftperrors[8] = {
EINVAL, /* ??? */
EINVAL, /* ??? */
EEXIST,
- EINVAL /* ??? */
+ EINVAL, /* ??? */
+ EINVAL, /* Option negotiation failed. */
};
-static ssize_t
+static int tftp_getnextblock(struct tftp_handle *h);
+
+/* send error message back. */
+static void
+tftp_senderr(struct tftp_handle *h, u_short errcode, const char *msg)
+{
+ struct {
+ u_char header[HEADER_SIZE];
+ struct tftphdr t;
+ u_char space[63]; /* +1 from t */
+ } __packed __aligned(4) wbuf;
+ char *wtail;
+ int len;
+
+ len = strlen(msg);
+ if (len > sizeof(wbuf.space))
+ len = sizeof(wbuf.space);
+
+ wbuf.t.th_opcode = htons((u_short) ERROR);
+ wbuf.t.th_code = htons(errcode);
+
+ wtail = wbuf.t.th_msg;
+ bcopy(msg, wtail, len);
+ wtail[len] = '\0';
+ wtail += len + 1;
+
+ sendudp(h->iodesc, &wbuf.t, wtail - (char *) &wbuf.t);
+}
+
+static void
+tftp_sendack(struct tftp_handle *h)
+{
+ struct {
+ u_char header[HEADER_SIZE];
+ struct tftphdr t;
+ } __packed __aligned(4) wbuf;
+ char *wtail;
+
+ wbuf.t.th_opcode = htons((u_short) ACK);
+ wtail = (char *) &wbuf.t.th_block;
+ wbuf.t.th_block = htons((u_short) h->currblock);
+ wtail += 2;
+
+ sendudp(h->iodesc, &wbuf.t, wtail - (char *) &wbuf.t);
+}
+
+static ssize_t
recvtftp(struct tftp_handle *h, void *pkt, ssize_t len, time_t tleft,
unsigned short *rtype)
{
@@ -170,7 +218,7 @@ recvtftp(struct tftp_handle *h, void *pkt, ssize_t len, time_t tleft,
return got;
}
case ERROR:
- if ((unsigned) ntohs(t->th_code) >= 8) {
+ if ((unsigned) ntohs(t->th_code) > TFTP_MAX_ERRCODE) {
printf("illegal tftp error %d\n", ntohs(t->th_code));
errno = EIO;
} else {
@@ -182,14 +230,30 @@ recvtftp(struct tftp_handle *h, void *pkt, ssize_t len, time_t tleft,
return (-1);
case OACK: {
struct udphdr *uh;
- int tftp_oack_len = len - sizeof(t->th_opcode);
- tftp_parse_oack(h, t->th_u.tu_stuff, tftp_oack_len);
+ int tftp_oack_len;
+
+ /*
+ * Unexpected OACK. TFTP transfer already in progress.
+ * Drop the pkt.
+ */
+ if (d->xid != 1) {
+ return (-1);
+ }
+
/*
- * Remember which port this OACK came from,
- * because we need to send the ACK back to it.
+ * Remember which port this OACK came from, because we need
+ * to send the ACK or errors back to it.
*/
uh = (struct udphdr *) pkt - 1;
d->destport = uh->uh_sport;
+
+ /* Parse options ACK-ed by the server. */
+ tftp_oack_len = len - sizeof(t->th_opcode);
+ if (tftp_parse_oack(h, t->th_u.tu_stuff, tftp_oack_len) != 0) {
+ tftp_senderr(h, EOPTNEG, "Malformed OACK");
+ errno = EIO;
+ return (-1);
+ }
return (0);
}
default:
@@ -201,7 +265,7 @@ recvtftp(struct tftp_handle *h, void *pkt, ssize_t len, time_t tleft,
}
/* send request, expect first block (or error) */
-static int
+static int
tftp_makereq(struct tftp_handle *h)
{
struct {
@@ -250,26 +314,28 @@ tftp_makereq(struct tftp_handle *h)
h->iodesc->destport = htons(IPPORT_TFTP);
h->iodesc->xid = 1; /* expected block */
+ h->currblock = 0;
+ h->islastblock = 0;
+ h->validsize = 0;
+
res = sendrecv_tftp(h, &sendudp, &wbuf.t, wtail - (char *) &wbuf.t,
&recvtftp, t, sizeof(*t) + h->tftp_blksize, &rtype);
- if (rtype == OACK) {
- wbuf.t.th_opcode = htons((u_short)ACK);
- wtail = (char *) &wbuf.t.th_block;
- wbuf.t.th_block = htons(0);
- wtail += 2;
- rtype = 0;
- res = sendrecv_tftp(h, &sendudp, &wbuf.t, wtail - (char *) &wbuf.t,
- &recvtftp, t, sizeof(*t) + h->tftp_blksize, &rtype);
- }
+ if (rtype == OACK)
+ return (tftp_getnextblock(h));
+
+ /* Server ignored our blksize request, revert to TFTP default. */
+ h->tftp_blksize = SEGSIZE;
switch (rtype) {
case DATA: {
h->currblock = 1;
h->validsize = res;
h->islastblock = 0;
- if (res < h->tftp_blksize)
+ if (res < h->tftp_blksize) {
h->islastblock = 1; /* very short file */
+ tftp_sendack(h);
+ }
return (0);
}
case ERROR:
@@ -320,7 +386,7 @@ tftp_getnextblock(struct tftp_handle *h)
return (0);
}
-static int
+static int
tftp_open(const char *path, struct open_file *f)
{
struct tftp_handle *tftpfile;
@@ -365,7 +431,7 @@ tftp_open(const char *path, struct open_file *f)
return (0);
}
-static int
+static int
tftp_read(struct open_file *f, void *addr, size_t size,
size_t *resid /* out */)
{
@@ -381,9 +447,11 @@ tftp_read(struct open_file *f, void *addr, size_t size,
needblock = tftpfile->off / tftpfile->tftp_blksize + 1;
- if (tftpfile->currblock > needblock) /* seek backwards */
+ if (tftpfile->currblock > needblock) { /* seek backwards */
+ tftp_senderr(tftpfile, 0, "No error: read aborted");
tftp_makereq(tftpfile); /* no error check, it worked
* for open */
+ }
while (tftpfile->currblock < needblock) {
int res;
@@ -452,7 +520,7 @@ tftp_close(struct open_file *f)
return (0);
}
-static int
+static int
tftp_write(struct open_file *f __unused, void *start __unused, size_t size __unused,
size_t *resid __unused /* out */)
{
@@ -473,7 +541,7 @@ tftp_stat(struct open_file *f, struct stat *sb)
return (0);
}
-static off_t
+static off_t
tftp_seek(struct open_file *f, off_t offset, int where)
{
struct tftp_handle *tftpfile;
@@ -494,7 +562,7 @@ tftp_seek(struct open_file *f, off_t offset, int where)
}
static ssize_t
-sendrecv_tftp(struct tftp_handle *h,
+sendrecv_tftp(struct tftp_handle *h,
ssize_t (*sproc)(struct iodesc *, void *, size_t),
void *sbuf, size_t ssize,
ssize_t (*rproc)(struct tftp_handle *, void *, ssize_t, time_t, unsigned short *),
@@ -562,9 +630,9 @@ tftp_set_blksize(struct tftp_handle *h, const char *str)
/*
* Only accept blksize value if it is numeric.
- * RFC2348 specifies that acceptable valuesare 8-65464
- * 8-65464 . Let's choose a limit less than MAXRSPACE
- */
+ * RFC2348 specifies that acceptable values are 8-65464.
+ * Let's choose a limit less than MAXRSPACE.
+ */
if (*endptr == '\0' && new_blksize >= 8
&& new_blksize <= TFTP_MAX_BLKSIZE) {
h->tftp_blksize = new_blksize;
@@ -597,13 +665,12 @@ tftp_set_blksize(struct tftp_handle *h, const char *str)
* optN, valueN
* The final option/value acknowledgment pair.
*/
-static void
+static int
tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len)
{
/*
* We parse the OACK strings into an array
* of name-value pairs.
- *
*/
char *tftp_options[128] = { 0 };
char *val = buf;
@@ -612,18 +679,22 @@ tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len)
int blksize_is_set = 0;
int tsize = 0;
-
- while ( option_idx < 128 && i < len ) {
- if (buf[i] == '\0') {
- if (&buf[i] > val) {
- tftp_options[option_idx] = val;
- val = &buf[i] + 1;
- ++option_idx;
- }
- }
- ++i;
+ unsigned int orig_blksize;
+
+ while (option_idx < 128 && i < len) {
+ if (buf[i] == '\0') {
+ if (&buf[i] > val) {
+ tftp_options[option_idx] = val;
+ val = &buf[i] + 1;
+ ++option_idx;
+ }
+ }
+ ++i;
}
+ /* Save the block size we requested for sanity check later. */
+ orig_blksize = h->tftp_blksize;
+
/*
* Parse individual TFTP options.
* * "blksize" is specified in RFC2348.
@@ -631,27 +702,37 @@ tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len)
*/
for (i = 0; i < option_idx; i += 2) {
if (strcasecmp(tftp_options[i], "blksize") == 0) {
- if (i + 1 < option_idx) {
+ if (i + 1 < option_idx)
blksize_is_set =
tftp_set_blksize(h, tftp_options[i + 1]);
- }
} else if (strcasecmp(tftp_options[i], "tsize") == 0) {
- if (i + 1 < option_idx) {
+ if (i + 1 < option_idx)
tsize = strtol(tftp_options[i + 1], (char **)NULL, 10);
- }
+ } else {
+ /* Do not allow any options we did not expect to be ACKed. */
+ printf("unexpected tftp option '%s'\n", tftp_options[i]);
+ return (-1);
}
}
if (!blksize_is_set) {
/*
* If TFTP blksize was not set, try defaulting
- * to the legacy TFTP blksize of 512
+ * to the legacy TFTP blksize of SEGSIZE(512)
*/
- h->tftp_blksize = 512;
+ h->tftp_blksize = SEGSIZE;
+ } else if (h->tftp_blksize > orig_blksize) {
+ /*
+ * Server should not be proposing block sizes that
+ * exceed what we said we can handle.
+ */
+ printf("unexpected blksize %u\n", h->tftp_blksize);
+ return (-1);
}
#ifdef TFTP_DEBUG
printf("tftp_blksize: %u\n", h->tftp_blksize);
printf("tftp_tsize: %lu\n", h->tftp_tsize);
#endif
+ return 0;
}
diff --git a/lib/libstand/zalloc.c b/lib/libstand/zalloc.c
index 2cd71c4..41aef0d 100644
--- a/lib/libstand/zalloc.c
+++ b/lib/libstand/zalloc.c
@@ -77,7 +77,7 @@ __FBSDID("$FreeBSD$");
*/
void *
-znalloc(MemPool *mp, iaddr_t bytes)
+znalloc(MemPool *mp, uintptr_t bytes)
{
/*
* align according to pool object size (can be 0). This is
@@ -136,7 +136,7 @@ znalloc(MemPool *mp, iaddr_t bytes)
*/
void
-zfree(MemPool *mp, void *ptr, iaddr_t bytes)
+zfree(MemPool *mp, void *ptr, uintptr_t bytes)
{
/*
* align according to pool object size (can be 0). This is
@@ -153,8 +153,8 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
if ((char *)ptr < (char *)mp->mp_Base ||
(char *)ptr + bytes > (char *)mp->mp_End ||
- ((iaddr_t)ptr & MEMNODE_SIZE_MASK) != 0)
- panic("zfree(%p,%ju): wild pointer", ptr, bytes);
+ ((uintptr_t)ptr & MEMNODE_SIZE_MASK) != 0)
+ panic("zfree(%p,%ju): wild pointer", ptr, (uintmax_t)bytes);
/*
* free the segment
@@ -177,8 +177,10 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
/*
* range check
*/
- if ((char *)ptr + bytes > (char *)mn)
- panic("zfree(%p,%ju): corrupt memlist1",ptr, bytes);
+ if ((char *)ptr + bytes > (char *)mn) {
+ panic("zfree(%p,%ju): corrupt memlist1", ptr,
+ (uintmax_t)bytes);
+ }
/*
* merge against next area or create independant area
@@ -208,8 +210,10 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
return;
/* NOT REACHED */
}
- if ((char *)ptr < (char *)mn + mn->mr_Bytes)
- panic("zfree(%p,%ju): corrupt memlist2", ptr, bytes);
+ if ((char *)ptr < (char *)mn + mn->mr_Bytes) {
+ panic("zfree(%p,%ju): corrupt memlist2", ptr,
+ (uintmax_t)bytes);
+ }
}
/*
* We are beyond the last MemNode, append new MemNode. Merge against
@@ -241,7 +245,7 @@ zfree(MemPool *mp, void *ptr, iaddr_t bytes)
*/
void
-zextendPool(MemPool *mp, void *base, iaddr_t bytes)
+zextendPool(MemPool *mp, void *base, uintptr_t bytes)
{
if (mp->mp_Size == 0) {
mp->mp_Base = base;
diff --git a/lib/libstand/zalloc_defs.h b/lib/libstand/zalloc_defs.h
index 2544f59..5331ee0 100644
--- a/lib/libstand/zalloc_defs.h
+++ b/lib/libstand/zalloc_defs.h
@@ -38,20 +38,12 @@
#define DMALLOCDEBUG /* add debugging code to gather stats */
#define ZALLOCDEBUG
-#include <string.h>
+#include <sys/stdint.h>
#include "stand.h"
-
-typedef uintptr_t iaddr_t; /* unsigned int same size as pointer */
-typedef intptr_t saddr_t; /* signed int same size as pointer */
#include "zalloc_mem.h"
-#define Prototype extern
#define Library extern
-#ifndef NULL
-#define NULL ((void *)0)
-#endif
-
/*
* block extension for sbrk()
*/
@@ -60,8 +52,7 @@ typedef intptr_t saddr_t; /* signed int same size as pointer */
#define BLKEXTENDMASK (BLKEXTEND - 1)
/*
- * required malloc alignment. Use sizeof(long double) for architecture
- * independance.
+ * required malloc alignment. Just hardwire to 16.
*
* Note: if we implement a more sophisticated realloc, we should ensure that
* MALLOCALIGN is at least as large as MemNode.
@@ -72,10 +63,8 @@ typedef struct Guard {
size_t ga_Magic; /* must be at least 32 bits */
} Guard;
-#define MATYPE long double
-#define MALLOCALIGN ((sizeof(MATYPE) > sizeof(Guard)) ? sizeof(MATYPE) : sizeof(Guard))
+#define MALLOCALIGN 16
#define GAMAGIC 0x55FF44FD
#define GAFREE 0x5F54F4DF
#include "zalloc_protos.h"
-
diff --git a/lib/libstand/zalloc_malloc.c b/lib/libstand/zalloc_malloc.c
index cdacf13..b9a295f 100644
--- a/lib/libstand/zalloc_malloc.c
+++ b/lib/libstand/zalloc_malloc.c
@@ -110,7 +110,7 @@ Free(void *ptr, const char *file, int line)
return;
}
if (*((signed char *)res + res->ga_Bytes - 1) != -2)
- panic("free: guard2 fail @ %p + %d from %s:%d", ptr, res->ga_Bytes - MALLOCALIGN, file, line);
+ panic("free: guard2 fail @ %p + %zu from %s:%d", ptr, res->ga_Bytes - MALLOCALIGN, file, line);
*((signed char *)res + res->ga_Bytes - 1) = -1;
#endif
@@ -126,7 +126,7 @@ Free(void *ptr, const char *file, int line)
void *
Calloc(size_t n1, size_t n2, const char *file, int line)
{
- iaddr_t bytes = (iaddr_t)n1 * (iaddr_t)n2;
+ uintptr_t bytes = (uintptr_t)n1 * (uintptr_t)n2;
void *res;
if ((res = Malloc(bytes, file, line)) != NULL) {
diff --git a/lib/libstand/zalloc_mem.h b/lib/libstand/zalloc_mem.h
index c872da1..f29c0d7 100644
--- a/lib/libstand/zalloc_mem.h
+++ b/lib/libstand/zalloc_mem.h
@@ -37,15 +37,15 @@
typedef struct MemNode {
struct MemNode *mr_Next;
- iaddr_t mr_Bytes;
+ uintptr_t mr_Bytes;
} MemNode;
typedef struct MemPool {
void *mp_Base;
void *mp_End;
MemNode *mp_First;
- iaddr_t mp_Size;
- iaddr_t mp_Used;
+ uintptr_t mp_Size;
+ uintptr_t mp_Used;
} MemPool;
#define MEMNODE_SIZE_MASK ((sizeof(MemNode) <= 8) ? 7 : 15)
diff --git a/lib/libstand/zalloc_protos.h b/lib/libstand/zalloc_protos.h
index c90bd5a..53a40e4 100644
--- a/lib/libstand/zalloc_protos.h
+++ b/lib/libstand/zalloc_protos.h
@@ -29,7 +29,7 @@
* $FreeBSD$
*/
-Library void *znalloc(struct MemPool *mpool, iaddr_t bytes);
-Library void zfree(struct MemPool *mpool, void *ptr, iaddr_t bytes);
-Library void zextendPool(MemPool *mp, void *base, iaddr_t bytes);
+Library void *znalloc(struct MemPool *mpool, uintptr_t bytes);
+Library void zfree(struct MemPool *mpool, void *ptr, uintptr_t bytes);
+Library void zextendPool(MemPool *mp, void *base, uintptr_t bytes);
Library void zallocstats(struct MemPool *mp);
diff --git a/lib/libthr/arch/sparc64/Makefile.inc b/lib/libthr/arch/sparc64/Makefile.inc
index 2ee2247..88586b4 100644
--- a/lib/libthr/arch/sparc64/Makefile.inc
+++ b/lib/libthr/arch/sparc64/Makefile.inc
@@ -1,3 +1,3 @@
# $FreeBSD$
-SRCS+= pthread_md.c
+SRCS+= _umtx_op_err.S pthread_md.c
diff --git a/lib/libthr/arch/sparc64/include/pthread_md.h b/lib/libthr/arch/sparc64/include/pthread_md.h
index 7909291..7ee9654 100644
--- a/lib/libthr/arch/sparc64/include/pthread_md.h
+++ b/lib/libthr/arch/sparc64/include/pthread_md.h
@@ -50,10 +50,6 @@ struct tcb {
void *tcb_spare[1];
};
-register struct tcb *_tp __asm("%g7");
-
-#define _tcb (_tp)
-
/*
* The tcb constructors.
*/
@@ -64,26 +60,25 @@ void _tcb_dtor(struct tcb *);
static __inline void
_tcb_set(struct tcb *tcb)
{
- _tp = tcb;
+
+ __asm __volatile("mov %0, %%g7" : : "r" (tcb));
}
-/*
- * Get the current tcb.
- */
static __inline struct tcb *
_tcb_get(void)
{
- return (_tcb);
-}
+ register struct tcb *tp __asm("%g7");
-extern struct pthread *_thr_initial;
+ return (tp);
+}
static __inline struct pthread *
_get_curthread(void)
{
- if (_thr_initial)
- return (_tcb->tcb_thread);
- return (NULL);
+
+ return (_tcb_get()->tcb_thread);
}
+#define HAS__UMTX_OP_ERR 1
+
#endif /* _PTHREAD_MD_H_ */
diff --git a/lib/libthr/arch/sparc64/sparc64/_umtx_op_err.S b/lib/libthr/arch/sparc64/sparc64/_umtx_op_err.S
new file mode 100644
index 0000000..220d279
--- /dev/null
+++ b/lib/libthr/arch/sparc64/sparc64/_umtx_op_err.S
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2011 Marius Strobl <marius@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/syscall.h>
+
+#include <machine/utrap.h>
+
+ENTRY(_umtx_op_err)
+ mov SYS__umtx_op, %g1
+ retl
+ ta %xcc, ST_SYSCALL
+END(_umtx_op_err)
diff --git a/lib/libthr/arch/sparc64/sparc64/pthread_md.c b/lib/libthr/arch/sparc64/sparc64/pthread_md.c
index 3f8e105..e1d439a 100644
--- a/lib/libthr/arch/sparc64/sparc64/pthread_md.c
+++ b/lib/libthr/arch/sparc64/sparc64/pthread_md.c
@@ -24,10 +24,11 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
#include <sys/types.h>
#include <rtld_tls.h>
@@ -37,13 +38,11 @@ struct tcb *
_tcb_ctor(struct pthread *thread, int initial)
{
struct tcb *tcb;
- void *oldtls;
if (initial)
- oldtls = _tp;
+ tcb = _tcb_get();
else
- oldtls = NULL;
- tcb = _rtld_allocate_tls(oldtls, sizeof(struct tcb), 16);
+ tcb = _rtld_allocate_tls(NULL, sizeof(struct tcb), 16);
if (tcb)
tcb->tcb_thread = thread;
return (tcb);
@@ -52,5 +51,6 @@ _tcb_ctor(struct pthread *thread, int initial)
void
_tcb_dtor(struct tcb *tcb)
{
+
_rtld_free_tls(tcb, sizeof(struct tcb), 16);
}
diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
index 7e07215..86abad8 100644
--- a/lib/libthr/thread/thr_init.c
+++ b/lib/libthr/thread/thr_init.c
@@ -409,7 +409,6 @@ init_main_thread(struct pthread *thread)
thread->cancel_enable = 1;
thread->cancel_async = 0;
- thr_set_name(thread->tid, "initial thread");
/* Initialize the mutex queue: */
TAILQ_INIT(&thread->mutexq);
diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile
index debbfa2..f438cff 100644
--- a/lib/libusb/Makefile
+++ b/lib/libusb/Makefile
@@ -22,7 +22,7 @@ MLINKS+= libusb.3 usb.3
# libusb 0.1 compat
INCS+= usb.h
-SRCS+= libusb20_compat01.c
+SRCS+= libusb01.c
# libusb 1.0 compat
INCS+= libusb.h
@@ -184,6 +184,8 @@ MLINKS += libusb20.3 libusb20_dev_get_device_desc.3
MLINKS += libusb20.3 libusb20_dev_alloc_config.3
MLINKS += libusb20.3 libusb20_dev_alloc.3
MLINKS += libusb20.3 libusb20_dev_get_address.3
+MLINKS += libusb20.3 libusb20_dev_get_parent_address.3
+MLINKS += libusb20.3 libusb20_dev_get_parent_port.3
MLINKS += libusb20.3 libusb20_dev_get_bus_number.3
MLINKS += libusb20.3 libusb20_dev_get_mode.3
MLINKS += libusb20.3 libusb20_dev_get_speed.3
diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3
index e7e3115..33d807d 100644
--- a/lib/libusb/libusb.3
+++ b/lib/libusb/libusb.3
@@ -542,6 +542,8 @@ The library is also compliant with LibUSB version 0.1.12.
.Fn usb_device
.Fn usb_get_busses
.Fn usb_check_connected
+.Fn usb_get_driver_np
+.Fn usb_detach_kernel_driver_np
.
.Sh SEE ALSO
.Xr libusb20 3 ,
diff --git a/lib/libusb/libusb20_compat01.c b/lib/libusb/libusb01.c
index 4124ef6..17edb0e 100644
--- a/lib/libusb/libusb20_compat01.c
+++ b/lib/libusb/libusb01.c
@@ -203,6 +203,12 @@ usb_get_string(usb_dev_handle * dev, int strindex,
{
int err;
+ if (dev == NULL)
+ return (-1);
+
+ if (buflen > 65535)
+ buflen = 65535;
+
err = libusb20_dev_req_string_sync((void *)dev,
strindex, langid, buf, buflen);
@@ -218,6 +224,12 @@ usb_get_string_simple(usb_dev_handle * dev, int strindex,
{
int err;
+ if (dev == NULL)
+ return (-1);
+
+ if (buflen > 65535)
+ buflen = 65535;
+
err = libusb20_dev_req_string_simple_sync((void *)dev,
strindex, buf, buflen);
@@ -233,6 +245,12 @@ usb_get_descriptor_by_endpoint(usb_dev_handle * udev, int ep, uint8_t type,
{
memset(buf, 0, size);
+ if (udev == NULL)
+ return (-1);
+
+ if (size > 65535)
+ size = 65535;
+
return (usb_control_msg(udev, ep | USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR, (type << 8) + ep_index, 0,
buf, size, 1000));
@@ -244,6 +262,12 @@ usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t desc_index,
{
memset(buf, 0, size);
+ if (udev == NULL)
+ return (-1);
+
+ if (size > 65535)
+ size = 65535;
+
return (usb_control_msg(udev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
(type << 8) + desc_index, 0, buf, size, 1000));
}
@@ -943,3 +967,49 @@ usb_get_busses(void)
{
return (usb_busses);
}
+
+int
+usb_get_driver_np(usb_dev_handle * dev, int interface, char *name, int namelen)
+{
+ struct libusb20_device *pdev;
+ char *ptr;
+ int err;
+
+ pdev = (void *)dev;
+
+ if (pdev == NULL)
+ return (-1);
+ if (namelen < 1)
+ return (-1);
+ if (namelen > 255)
+ namelen = 255;
+
+ err = libusb20_dev_get_iface_desc(pdev, interface, name, namelen);
+ if (err != 0)
+ return (-1);
+
+ /* we only want the driver name */
+ ptr = strstr(name, ":");
+ if (ptr != NULL)
+ *ptr = 0;
+
+ return (0);
+}
+
+int
+usb_detach_kernel_driver_np(usb_dev_handle * dev, int interface)
+{
+ struct libusb20_device *pdev;
+ int err;
+
+ pdev = (void *)dev;
+
+ if (pdev == NULL)
+ return (-1);
+
+ err = libusb20_dev_detach_kernel_driver(pdev, interface);
+ if (err != 0)
+ return (-1);
+
+ return (0);
+}
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index fa50ea7..3ecba58 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -636,7 +636,7 @@ libusb_clear_halt(struct libusb20_device *pdev, uint8_t endpoint)
return (LIBUSB_ERROR_INVALID_PARAM);
CTX_LOCK(dev->ctx);
- err = libusb20_tr_open(xfer, 0, 0, endpoint);
+ err = libusb20_tr_open(xfer, 0, 1, endpoint);
CTX_UNLOCK(dev->ctx);
if (err != 0 && err != LIBUSB20_ERROR_BUSY)
@@ -719,6 +719,8 @@ libusb_get_driver(struct libusb20_device *pdev, int interface,
return (LIBUSB_ERROR_INVALID_PARAM);
if (namelen < 1)
return (LIBUSB_ERROR_INVALID_PARAM);
+ if (namelen > 255)
+ namelen = 255;
err = libusb20_dev_get_iface_desc(
pdev, interface, name, namelen);
diff --git a/lib/libusb/libusb10_desc.c b/lib/libusb/libusb10_desc.c
index 5823723..3448679 100644
--- a/lib/libusb/libusb10_desc.c
+++ b/lib/libusb/libusb10_desc.c
@@ -300,6 +300,9 @@ libusb_get_string_descriptor_ascii(libusb_device_handle *pdev,
if (pdev == NULL || data == NULL || length < 1)
return (LIBUSB20_ERROR_INVALID_PARAM);
+ if (length > 65535)
+ length = 65535;
+
/* put some default data into the destination buffer */
data[0] = 0;
@@ -314,6 +317,12 @@ int
libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type,
uint8_t desc_index, uint8_t *data, int length)
{
+ if (devh == NULL || data == NULL || length < 1)
+ return (LIBUSB20_ERROR_INVALID_PARAM);
+
+ if (length > 65535)
+ length = 65535;
+
return (libusb_control_transfer(devh, LIBUSB_ENDPOINT_IN,
LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data,
length, 1000));
diff --git a/lib/libusb/libusb20.3 b/lib/libusb/libusb20.3
index 93dfe18..042f885 100644
--- a/lib/libusb/libusb20.3
+++ b/lib/libusb/libusb20.3
@@ -159,6 +159,10 @@ USB access library (libusb -lusb)
.Ft uint8_t
.Fn libusb20_dev_get_address "struct libusb20_device *pdev"
.Ft uint8_t
+.Fn libusb20_dev_get_parent_address "struct libusb20_device *pdev"
+.Ft uint8_t
+.Fn libusb20_dev_get_parent_port "struct libusb20_device *pdev"
+.Ft uint8_t
.Fn libusb20_dev_get_bus_number "struct libusb20_device *pdev"
.Ft uint8_t
.Fn libusb20_dev_get_mode "struct libusb20_device *pdev"
@@ -756,12 +760,31 @@ is an internal function to allocate a new USB device.
.Fn libusb20_dev_get_address
returns the internal and not necessarily the real
hardware address of the given USB device.
+Valid addresses start at one.
+.
+.Pp
+.
+.Fn libusb20_dev_get_parent_address
+returns the internal and not necessarily the real hardware address of
+the given parent USB HUB device.
+This value is zero for the root HUB which usually has a device address
+equal to one.
+Valid addresses start at one.
+.
+.Pp
+.
+.Fn libusb20_dev_get_parent_port
+returns the port number on the parent USB HUB device.
+This value is zero for the root HUB which usually has a device address
+equal to one.
+Valid port numbers start at one.
.
.Pp
.
.Fn libusb20_dev_get_bus_number
returns the internal bus number which the given USB
device belongs to.
+Valid bus numbers start at zero.
.
.Pp
.
diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c
index bcaa1e4..b35e2bf 100644
--- a/lib/libusb/libusb20.c
+++ b/lib/libusb/libusb20.c
@@ -1057,6 +1057,18 @@ libusb20_dev_get_address(struct libusb20_device *pdev)
}
uint8_t
+libusb20_dev_get_parent_address(struct libusb20_device *pdev)
+{
+ return (pdev->parent_address);
+}
+
+uint8_t
+libusb20_dev_get_parent_port(struct libusb20_device *pdev)
+{
+ return (pdev->parent_port);
+}
+
+uint8_t
libusb20_dev_get_bus_number(struct libusb20_device *pdev)
{
return (pdev->bus_number);
@@ -1069,6 +1081,8 @@ libusb20_dev_get_iface_desc(struct libusb20_device *pdev,
if ((buf == NULL) || (len == 0))
return (LIBUSB20_ERROR_INVALID_PARAM);
+ buf[0] = 0; /* set default string value */
+
return (pdev->beMethods->dev_get_iface_desc(
pdev, iface_index, buf, len));
}
diff --git a/lib/libusb/libusb20.h b/lib/libusb/libusb20.h
index 958a379..22a2899 100644
--- a/lib/libusb/libusb20.h
+++ b/lib/libusb/libusb20.h
@@ -262,6 +262,8 @@ struct LIBUSB20_DEVICE_DESC_DECODED *libusb20_dev_get_device_desc(struct libusb2
struct libusb20_config *libusb20_dev_alloc_config(struct libusb20_device *pdev, uint8_t config_index);
struct libusb20_device *libusb20_dev_alloc(void);
uint8_t libusb20_dev_get_address(struct libusb20_device *pdev);
+uint8_t libusb20_dev_get_parent_address(struct libusb20_device *pdev);
+uint8_t libusb20_dev_get_parent_port(struct libusb20_device *pdev);
uint8_t libusb20_dev_get_bus_number(struct libusb20_device *pdev);
uint8_t libusb20_dev_get_mode(struct libusb20_device *pdev);
uint8_t libusb20_dev_get_speed(struct libusb20_device *pdev);
diff --git a/lib/libusb/libusb20_int.h b/lib/libusb/libusb20_int.h
index 2ecfb47..bef4d02 100644
--- a/lib/libusb/libusb20_int.h
+++ b/lib/libusb/libusb20_int.h
@@ -226,6 +226,8 @@ struct libusb20_device {
uint8_t usb_mode;
uint8_t usb_speed;
uint8_t is_opened;
+ uint8_t parent_address;
+ uint8_t parent_port;
char usb_desc[96];
};
diff --git a/lib/libusb/libusb20_ugen20.c b/lib/libusb/libusb20_ugen20.c
index 933d728..307ed96 100644
--- a/lib/libusb/libusb20_ugen20.c
+++ b/lib/libusb/libusb20_ugen20.c
@@ -195,6 +195,11 @@ ugen20_enumerate(struct libusb20_device *pdev, const char *id)
break;
}
+ /* get parent HUB index and port */
+
+ pdev->parent_address = devinfo.udi_hubindex;
+ pdev->parent_port = devinfo.udi_hubport;
+
/* generate a nice description for printout */
snprintf(pdev->usb_desc, sizeof(pdev->usb_desc),
diff --git a/lib/libusb/usb.h b/lib/libusb/usb.h
index 8ee68f2..dc3959e 100644
--- a/lib/libusb/usb.h
+++ b/lib/libusb/usb.h
@@ -299,6 +299,8 @@ int usb_find_busses(void);
int usb_find_devices(void);
struct usb_device *usb_device(usb_dev_handle * dev);
struct usb_bus *usb_get_busses(void);
+int usb_get_driver_np(usb_dev_handle * dev, int interface, char *name, int namelen);
+int usb_detach_kernel_driver_np(usb_dev_handle * dev, int interface);
#if 0
{ /* style */
diff --git a/lib/libutil/login.conf.5 b/lib/libutil/login.conf.5
index 2d1b906..134c779 100644
--- a/lib/libutil/login.conf.5
+++ b/lib/libutil/login.conf.5
@@ -19,7 +19,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 20, 2008
+.Dd July 8, 2011
.Dt LOGIN.CONF 5
.Os
.Sh NAME
@@ -190,6 +190,7 @@ notation may be used.
.It "vmemoryuse size Maximum permitted total VM usage per process.
.It "stacksize size Maximum stack size limit.
.It "pseudoterminals number Maximum number of pseudo-terminals.
+.It "swapuse size Maximum swap space size limit.
.El
.Pp
These resource limit entries actually specify both the maximum
diff --git a/lib/msun/ld80/e_rem_pio2l.h b/lib/msun/ld80/e_rem_pio2l.h
index 81a5ab6..75e4e4b 100644
--- a/lib/msun/ld80/e_rem_pio2l.h
+++ b/lib/msun/ld80/e_rem_pio2l.h
@@ -82,7 +82,7 @@ __ieee754_rem_pio2l(long double x, long double *y)
u.e = x;
expsign = u.xbits.expsign;
ex = expsign & 0x7fff;
- if (ex < BIAS + 25 || ex == BIAS + 25 && u.bits.manh < 0xc90fdaa2) {
+ if (ex < BIAS + 25 || (ex == BIAS + 25 && u.bits.manh < 0xc90fdaa2)) {
/* |x| ~< 2^25*(pi/2), medium size */
/* Use a specialized rint() to get fn. Assume round-to-nearest. */
fn = x*invpio2+0x1.8p63;
diff --git a/lib/msun/src/e_rem_pio2.c b/lib/msun/src/e_rem_pio2.c
index a58a81b..fde9660 100644
--- a/lib/msun/src/e_rem_pio2.c
+++ b/lib/msun/src/e_rem_pio2.c
@@ -171,9 +171,8 @@ medium:
}
/* set z = scalbn(|x|,ilogb(x)-23) */
GET_LOW_WORD(low,x);
- SET_LOW_WORD(z,low);
e0 = (ix>>20)-1046; /* e0 = ilogb(z)-23; */
- SET_HIGH_WORD(z, ix - ((int32_t)(e0<<20)));
+ INSERT_WORDS(z, ix - ((int32_t)(e0<<20)), low);
for(i=0;i<2;i++) {
tx[i] = (double)((int32_t)(z));
z = (z-tx[i])*two24;
diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c
index 21c218e..5894f3c 100644
--- a/libexec/ftpd/ftpd.c
+++ b/libexec/ftpd/ftpd.c
@@ -1191,9 +1191,9 @@ end_login(void)
ftpd_logwtmp(wtmpid, NULL, NULL);
pw = NULL;
#ifdef LOGIN_CAP
- setusercontext(NULL, getpwuid(0), 0,
- LOGIN_SETPRIORITY|LOGIN_SETRESOURCES|LOGIN_SETUMASK|
- LOGIN_SETMAC);
+ setusercontext(NULL, getpwuid(0), 0, LOGIN_SETALL & ~(LOGIN_SETLOGIN |
+ LOGIN_SETUSER | LOGIN_SETGROUP | LOGIN_SETPATH |
+ LOGIN_SETENV));
#endif
#ifdef USE_PAM
if (pamh) {
@@ -1465,9 +1465,8 @@ skip:
return;
}
}
- setusercontext(lc, pw, 0,
- LOGIN_SETLOGIN|LOGIN_SETGROUP|LOGIN_SETPRIORITY|
- LOGIN_SETRESOURCES|LOGIN_SETUMASK|LOGIN_SETMAC);
+ setusercontext(lc, pw, 0, LOGIN_SETALL &
+ ~(LOGIN_SETUSER | LOGIN_SETPATH | LOGIN_SETENV));
#else
setlogin(pw->pw_name);
(void) initgroups(pw->pw_name, pw->pw_gid);
diff --git a/libexec/rtld-elf/Makefile b/libexec/rtld-elf/Makefile
index 45318b9..95bec19 100644
--- a/libexec/rtld-elf/Makefile
+++ b/libexec/rtld-elf/Makefile
@@ -17,6 +17,7 @@ RTLD_ARCH= ${MACHINE_CPUARCH}
.endif
CFLAGS+= -I${.CURDIR}/${RTLD_ARCH} -I${.CURDIR}
.if ${MACHINE_ARCH} == "powerpc64"
+CFLAGS+= -mcall-aixdesc
LDFLAGS+= -nostdlib -e _rtld_start
.else
LDFLAGS+= -nostdlib -e .rtld_start
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 5c2db0a..722b274 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -928,8 +928,8 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
obj->textrel = true;
if (dynp->d_un.d_val & DF_BIND_NOW)
obj->bind_now = true;
- if (dynp->d_un.d_val & DF_STATIC_TLS)
- ;
+ /*if (dynp->d_un.d_val & DF_STATIC_TLS)
+ ;*/
break;
#ifdef __mips__
case DT_MIPS_LOCAL_GOTNO:
@@ -958,8 +958,8 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
obj->z_noopen = true;
if ((dynp->d_un.d_val & DF_1_ORIGIN) && trust)
obj->z_origin = true;
- if (dynp->d_un.d_val & DF_1_GLOBAL)
- /* XXX */;
+ /*if (dynp->d_un.d_val & DF_1_GLOBAL)
+ XXX ;*/
if (dynp->d_un.d_val & DF_1_BIND_NOW)
obj->bind_now = true;
if (dynp->d_un.d_val & DF_1_NODELETE)
diff --git a/libexec/tftpd/tftp-file.c b/libexec/tftpd/tftp-file.c
index 1ef8820..6b8fb6e 100644
--- a/libexec/tftpd/tftp-file.c
+++ b/libexec/tftpd/tftp-file.c
@@ -27,6 +27,8 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
@@ -249,9 +251,34 @@ read_close(void)
}
+/* When an error has occurred, it is possible that the two sides
+ * are out of synch. Ie: that what I think is the other side's
+ * response to packet N is really their response to packet N-1.
+ *
+ * So, to try to prevent that, we flush all the input queued up
+ * for us on the network connection on our host.
+ *
+ * We return the number of packets we flushed (mostly for reporting
+ * when trace is active).
+ */
+
int
-synchnet(int peer __unused)
+synchnet(int peer) /* socket to flush */
{
-
- return 0;
+ int i, j = 0;
+ char rbuf[MAXPKTSIZE];
+ struct sockaddr_storage from;
+ socklen_t fromlen;
+
+ while (1) {
+ (void) ioctl(peer, FIONREAD, &i);
+ if (i) {
+ j++;
+ fromlen = sizeof from;
+ (void) recvfrom(peer, rbuf, sizeof (rbuf), 0,
+ (struct sockaddr *)&from, &fromlen);
+ } else {
+ return(j);
+ }
+ }
}
diff --git a/libexec/tftpd/tftpd.8 b/libexec/tftpd/tftpd.8
index 3bac492..96bd24c 100644
--- a/libexec/tftpd/tftpd.8
+++ b/libexec/tftpd/tftpd.8
@@ -32,7 +32,7 @@
.\" @(#)tftpd.8 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
-.Dd September 14, 2000
+.Dd June 22, 2011
.Dt TFTPD 8
.Os
.Sh NAME
@@ -150,9 +150,27 @@ compatible format string for the creation of the suffix if
.Fl W
is specified.
By default the string "%Y%m%d" is used.
-.It Fl d
+.It Fl d, d Ar [value]
Enables debug output.
-If specified twice, it will log DATA and ACK packets too.
+If
+.Ar value
+is not specified, then the debug level is increased by one
+for each instance of
+.Fl d
+which is specified.
+.Pp
+If
+.Ar value
+is specified, then the debug level is set to
+.Ar value .
+The debug level is a bitmask implemented in
+.Pa src/libexec/tftpd/tftp-utils.h .
+Valid values are 0 (DEBUG_NONE), 1 (DEBUG_PACKETS), 2, (DEBUG_SIMPLE),
+4 (DEBUG_OPTIONS), and 8 (DEBUG_ACCESS). Multiple debug values can be combined
+in the bitmask by logically OR'ing the values. For example, specifying
+.Fl d
+.Ar 15
+will enable all the debug values.
.It Fl l
Log all requests using
.Xr syslog 3
@@ -217,12 +235,34 @@ option.
.Xr services 5 ,
.Xr syslog.conf 5 ,
.Xr inetd 8
+.Pp
+The following RFC's are supported:
.Rs
-.%A K. R. Sollins
+RFC 1350
.%T The TFTP Protocol (Revision 2)
-.%D July 1992
-.%O RFC 1350, STD 33
.Re
+.Rs
+RFC 2347
+.%T TFTP Option Extension
+.Re
+.Rs
+RFC 2348
+.%T TFTP Blocksize Option
+.Re
+.Rs
+RFC 2349
+.%T TFTP Timeout Interval and Transfer Size Options
+.Re
+.Pp
+The non-standard
+.Cm rollover
+and
+.Cm blksize2
+TFTP options are mentioned here:
+.Rs
+.%T Extending TFTP
+.%U http://www.compuphase.com/tftp.htm
+.Re
.Sh HISTORY
The
.Nm
@@ -253,9 +293,15 @@ was introduced in
support for the TFTP Blocksize Option (RFC2348) and the blksize2 option
was introduced in
.Fx 7.4 .
+.Pp
+Edwin Groothuis <edwin@FreeBSD.org> performed a major rewrite of the
+.Nm
+and
+.Xr tftp 1
+code to support RFC2348.
.Sh NOTES
Files larger than 33488896 octets (65535 blocks) cannot be transferred
-without client and server supporting the the TFTP blocksize option (RFC2348),
+without client and server supporting the TFTP blocksize option (RFC2348),
or the non-standard TFTP rollover option.
.Pp
Many tftp clients will not transfer files over 16744448 octets (32767 blocks).
diff --git a/libexec/ulog-helper/Makefile b/libexec/ulog-helper/Makefile
index 3c1770c..c1697c8 100644
--- a/libexec/ulog-helper/Makefile
+++ b/libexec/ulog-helper/Makefile
@@ -5,7 +5,7 @@ BINOWN= root
BINMODE=4555
NO_MAN=
-DPADD= ${LIBULOG} ${LIBMD}
-LDADD= -lulog -lmd
+DPADD= ${LIBULOG}
+LDADD= -lulog
.include <bsd.prog.mk>
diff --git a/libexec/ulog-helper/ulog-helper.c b/libexec/ulog-helper/ulog-helper.c
index eaef778..31b40e9 100644
--- a/libexec/ulog-helper/ulog-helper.c
+++ b/libexec/ulog-helper/ulog-helper.c
@@ -36,11 +36,11 @@ __FBSDID("$FreeBSD$");
/*
* This setuid helper utility writes user login records to disk.
- * Unprivileged processes are not capable of writing records to utmp,
- * wtmp and lastlog, but we do want to allow this for pseudo-terminals.
- * Because a file descriptor to a pseudo-terminal master device can only
- * be obtained by processes using the pseudo-terminal, we expect such a
- * descriptor on stdin.
+ * Unprivileged processes are not capable of writing records to utmpx,
+ * but we do want to allow this for pseudo-terminals. Because a file
+ * descriptor to a pseudo-terminal master device can only be obtained by
+ * processes using the pseudo-terminal, we expect such a descriptor on
+ * stdin.
*
* It uses the real user ID of the calling process to determine the
* username. It does allow users to log arbitrary hostnames.
@@ -49,26 +49,22 @@ __FBSDID("$FreeBSD$");
int
main(int argc, char *argv[])
{
- const char *line;
+ const char *line, *user, *host;
/* Device line name. */
if ((line = ptsname(STDIN_FILENO)) == NULL)
return (EX_USAGE);
if ((argc == 2 || argc == 3) && strcmp(argv[1], "login") == 0) {
- struct passwd *pwd;
- const char *host = NULL;
-
/* Username. */
- pwd = getpwuid(getuid());
- if (pwd == NULL)
+ user = user_from_uid(getuid(), 1);
+ if (user == NULL)
return (EX_OSERR);
/* Hostname. */
- if (argc == 3)
- host = argv[2];
+ host = argc == 3 ? argv[2] : NULL;
- ulog_login(line, pwd->pw_name, host);
+ ulog_login(line, user, host);
return (EX_OK);
} else if (argc == 2 && strcmp(argv[1], "logout") == 0) {
ulog_logout(line);
diff --git a/libexec/ypxfr/ypxfr_extern.h b/libexec/ypxfr/ypxfr_extern.h
index 2712bb9..f843b64 100644
--- a/libexec/ypxfr/ypxfr_extern.h
+++ b/libexec/ypxfr/ypxfr_extern.h
@@ -44,7 +44,7 @@ extern BTREEINFO openinfo_b;
#define _PATH_YP "/var/yp/"
#endif
-extern const char *yp_dir;
+extern char *yp_dir;
extern int debug;
extern enum ypstat yp_errno;
extern void yp_error(const char *, ...);
diff --git a/libexec/ypxfr/ypxfr_main.c b/libexec/ypxfr/ypxfr_main.c
index 636bc3d..f6b478a 100644
--- a/libexec/ypxfr/ypxfr_main.c
+++ b/libexec/ypxfr/ypxfr_main.c
@@ -51,8 +51,8 @@ __FBSDID("$FreeBSD$");
#include <rpcsvc/ypxfrd.h>
#include "ypxfr_extern.h"
-const char *progname = "ypxfr";
-const char *yp_dir = _PATH_YP;
+char *progname = "ypxfr";
+char *yp_dir = _PATH_YP;
int _rpcpmstart = 0;
int ypxfr_use_yplib = 0; /* Assume the worst. */
int ypxfr_clear = 1;
diff --git a/release/Makefile b/release/Makefile
index f8a52d6..0e07ed3 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -68,12 +68,7 @@ base.txz:
# Set up mergemaster root database
sh ${.CURDIR}/scripts/mm-mtree.sh -F \
"TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" -D "${DISTDIR}/base"
-# Merge handbook, etc. from doc tree into src tree doc distribution
-.if !defined(NODOC)
- cd ${DOCDIR} && ${IMAKE} all install \
- DOCDIR=${DISTDIR}/doc/usr/share/doc 'FORMATS=html html-split txt' \
- INSTALL_COMPRESSED='' URLS_ABSOLUTE=YES
-.endif
+# Package all components
cd ${WORLDDIR} && ${IMAKE} packageworld DISTDIR=${DISTDIR}
mv ${DISTDIR}/*.txz ${.OBJDIR}
diff --git a/release/doc/en_US.ISO8859-1/readme/article.sgml b/release/doc/en_US.ISO8859-1/readme/article.sgml
index 33ae82c..f8ba3aa 100644
--- a/release/doc/en_US.ISO8859-1/readme/article.sgml
+++ b/release/doc/en_US.ISO8859-1/readme/article.sgml
@@ -184,8 +184,7 @@
<para>Lists of locations that mirror &os; can be found in the
<ulink
url="&url.books.handbook;/mirrors-ftp.html">FTP
- Sites</ulink> section of the Handbook, or on the <ulink
- url="http://mirrorlist.FreeBSD.org/"></ulink> Web pages.
+ Sites</ulink> section of the Handbook.
Finding a close (in networking terms) mirror from which to
download the distribution is highly recommended.</para>
diff --git a/release/doc/share/sgml/release.ent b/release/doc/share/sgml/release.ent
index 0a4c1ce..60b7130 100644
--- a/release/doc/share/sgml/release.ent
+++ b/release/doc/share/sgml/release.ent
@@ -36,8 +36,8 @@
<!-- The manpaths for man page references -->
<!ENTITY release.man.url "http://www.FreeBSD.org/cgi/man.cgi">
-<!ENTITY release.manpath.xorg "7.4">
-<!ENTITY release.manpath.netbsd "5.0.1">
+<!ENTITY release.manpath.xorg "7.5.1">
+<!ENTITY release.manpath.netbsd "5.1">
<!ENTITY release.manpath.freebsd-ports "Ports">
<!ENTITY release.manpath.freebsd "9-current">
diff --git a/release/generate-release.sh b/release/generate-release.sh
index 080512a..cdba026 100755
--- a/release/generate-release.sh
+++ b/release/generate-release.sh
@@ -57,9 +57,8 @@ fi
if [ -d $2/usr/doc ]; then
cp /etc/resolv.conf $2/etc/resolv.conf
- # Build ports to build the docs, then build the docs
+ # Build ports to build release documentation
chroot $2 /bin/sh -c 'pkg_add -r docproj || (cd /usr/ports/textproc/docproj && make install clean BATCH=yes WITHOUT_X11=yes JADETEX=no WITHOUT_PYTHON=yes)'
- chroot $2 make -C /usr/doc $MAKE_FLAGS 'FORMATS=html html-split txt' URLS_ABSOLUTE=YES
fi
chroot $2 make -C /usr/src $MAKE_FLAGS buildworld buildkernel
diff --git a/release/ia64/make-memstick.sh b/release/ia64/make-memstick.sh
new file mode 100755
index 0000000..c9ff580
--- /dev/null
+++ b/release/ia64/make-memstick.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# This script generates a "memstick image" (image that can be copied to a
+# USB memory stick) from a directory tree. Note that the script does not
+# clean up after itself very well for error conditions on purpose so the
+# problem can be diagnosed (full filesystem most likely but ...).
+#
+# Usage: make-memstick.sh <directory tree> <image filename>
+#
+# $FreeBSD$
+#
+
+PATH=/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+BLOCKSIZE=10240
+
+if [ $# -ne 2 ]; then
+ echo "make-memstick.sh /path/to/directory /path/to/image/file"
+ exit 1
+fi
+
+if [ ! -d ${1} ]; then
+ echo "${1} must be a directory"
+ exit 1
+fi
+
+if [ -e ${2} ]; then
+ echo "won't overwrite ${2}"
+ exit 1
+fi
+
+makefs -B little ${2} ${1}
+if [ $? -ne 0 ]; then
+ echo "makefs failed"
+ exit 1
+fi
+
diff --git a/release/ia64/mkisoimages.sh b/release/ia64/mkisoimages.sh
index 8709c12..f17185b 100644
--- a/release/ia64/mkisoimages.sh
+++ b/release/ia64/mkisoimages.sh
@@ -74,6 +74,6 @@ fi
echo "/dev/iso9660/$LABEL / cd9660 ro 0 0" > $BASE/etc/fstab
makefs -t cd9660 $BOOTOPTS -o rockridge -o label=$LABEL $NAME $BASE $*
+rm $BASE/etc/fstab
rm -f $EFIPART
-rm $1/etc/fstab
exit 0
diff --git a/sbin/ddb/ddb.8 b/sbin/ddb/ddb.8
index 5ee2650..0fb9687 100644
--- a/sbin/ddb/ddb.8
+++ b/sbin/ddb/ddb.8
@@ -126,7 +126,7 @@ it is advisable to enclose
in quotes.
.It Cm scripts
List currently defined scripts.
-.It Cm unset Ar scriptname
+.It Cm unscript Ar scriptname
Delete the script named
.Ar scriptname .
.El
diff --git a/sbin/dumpfs/dumpfs.8 b/sbin/dumpfs/dumpfs.8
index a489a47..858881a 100644
--- a/sbin/dumpfs/dumpfs.8
+++ b/sbin/dumpfs/dumpfs.8
@@ -28,7 +28,7 @@
.\" @(#)dumpfs.8 8.1 (Berkeley) 6/5/93
.\" $FreeBSD$
.\"
-.Dd May 8, 2011
+.Dd Jul 14, 2011
.Dt DUMPFS 8
.Os
.Sh NAME
@@ -37,6 +37,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl f
+.Op Fl l
.Op Fl m
.Ar filesys | device
.Sh DESCRIPTION
@@ -44,7 +45,8 @@ The
.Nm
utility prints out the UFS super block and cylinder group information
for the file system or special device specified, unless the
-.Fl f
+.Fl f ,
+.Fl l
or
.Fl m
flag is specified.
@@ -64,6 +66,11 @@ Fragment numbers may be converted to raw byte offsets by multiplying by the
fragment size, which may be useful when recovering deleted data.
.Pp
If
+.Fl l
+is specified, the pathname to the file system's container derived from
+its unique identifier is printed.
+.Pp
+If
.Fl m
is specified, a
.Xr newfs 8
diff --git a/sbin/dumpfs/dumpfs.c b/sbin/dumpfs/dumpfs.c
index eb92ba7..c54fa2b 100644
--- a/sbin/dumpfs/dumpfs.c
+++ b/sbin/dumpfs/dumpfs.c
@@ -68,6 +68,7 @@ static const char rcsid[] =
#include <fcntl.h>
#include <fstab.h>
#include <libufs.h>
+#include <paths.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -79,6 +80,7 @@ static const char rcsid[] =
struct uufsd disk;
int dumpfs(const char *);
+int dumpfsid(void);
int dumpcg(void);
int dumpfreespace(const char *, int);
void dumpfreespacecg(int);
@@ -92,11 +94,11 @@ int
main(int argc, char *argv[])
{
const char *name;
- int ch, dofreespace, domarshal, eval;
+ int ch, dofreespace, domarshal, dolabel, eval;
- dofreespace = domarshal = eval = 0;
+ dofreespace = domarshal = dolabel = eval = 0;
- while ((ch = getopt(argc, argv, "fm")) != -1) {
+ while ((ch = getopt(argc, argv, "lfm")) != -1) {
switch (ch) {
case 'f':
dofreespace++;
@@ -104,6 +106,9 @@ main(int argc, char *argv[])
case 'm':
domarshal = 1;
break;
+ case 'l':
+ dolabel = 1;
+ break;
case '?':
default:
usage();
@@ -129,6 +134,8 @@ main(int argc, char *argv[])
eval |= dumpfreespace(name, dofreespace);
else if (domarshal)
eval |= marshal(name);
+ else if (dolabel)
+ eval |= dumpfsid();
else
eval |= dumpfs(name);
ufs_disk_close(&disk);
@@ -137,6 +144,14 @@ main(int argc, char *argv[])
}
int
+dumpfsid(void)
+{
+
+ printf("%sufsid/%08x%08x\n", _PATH_DEV, afs.fs_id[0], afs.fs_id[1]);
+ return 0;
+}
+
+int
dumpfs(const char *name)
{
time_t fstime;
diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h
index 250fc1f..8091d0f 100644
--- a/sbin/fsck_ffs/fsck.h
+++ b/sbin/fsck_ffs/fsck.h
@@ -395,5 +395,6 @@ void setinodebuf(ino_t);
int setup(char *dev);
void gjournal_check(const char *filesys);
int suj_check(const char *filesys);
+void update_maps(struct cg *, struct cg*, int);
#endif /* !_FSCK_H_ */
diff --git a/sbin/fsck_ffs/pass5.c b/sbin/fsck_ffs/pass5.c
index 01ed8a5..b95df73 100644
--- a/sbin/fsck_ffs/pass5.c
+++ b/sbin/fsck_ffs/pass5.c
@@ -49,8 +49,8 @@ __FBSDID("$FreeBSD$");
#include "fsck.h"
-static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *, int *, int, int);
-
+static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *,
+ int *, int, int, int);
static void clear_blocks(ufs2_daddr_t start, ufs2_daddr_t end);
void
@@ -61,7 +61,7 @@ pass5(void)
struct fs *fs = &sblock;
struct cg *cg = &cgrp;
ufs2_daddr_t d, dbase, dmax, start;
- int excessdirs, rewritecg = 0;
+ int rewritecg = 0;
struct csum *cs;
struct csum_total cstotal;
struct inodesc idesc[3];
@@ -333,27 +333,8 @@ pass5(void)
memmove(cg, newcg, (size_t)basesize);
cgdirty();
}
- if (bkgrdflag != 0 || usedsoftdep || debug) {
- excessdirs = cg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir;
- if (excessdirs < 0) {
- pfatal("LOST %d DIRECTORIES\n", -excessdirs);
- excessdirs = 0;
- }
- if (excessdirs > 0)
- check_maps(cg_inosused(newcg), cg_inosused(cg),
- inomapsize,
- cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg,
- "DIR",
- freedirs, 0, excessdirs);
- check_maps(cg_inosused(newcg), cg_inosused(cg),
- inomapsize,
- cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg, "FILE",
- freefiles, excessdirs, fs->fs_ipg);
- check_maps(cg_blksfree(cg), cg_blksfree(newcg),
- blkmapsize,
- cg->cg_cgx * (ufs2_daddr_t) fs->fs_fpg, "FRAG",
- freeblks, 0, fs->fs_fpg);
- }
+ if (bkgrdflag != 0 || usedsoftdep || debug)
+ update_maps(cg, newcg, bkgrdflag);
if (cursnapshot == 0 &&
memcmp(cg_inosused(newcg), cg_inosused(cg), mapsize) != 0 &&
dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) {
@@ -426,6 +407,40 @@ pass5(void)
}
}
+/*
+ * Compare the original cylinder group inode and block bitmaps with the
+ * updated cylinder group inode and block bitmaps. Free inodes and blocks
+ * that have been added. Complain if any previously freed inodes blocks
+ * are now allocated.
+ */
+void
+update_maps(
+ struct cg *oldcg, /* cylinder group of claimed allocations */
+ struct cg *newcg, /* cylinder group of determined allocations */
+ int usesysctl) /* 1 => use sysctl interface to update maps */
+{
+ int inomapsize, excessdirs;
+ struct fs *fs = &sblock;
+
+ inomapsize = howmany(fs->fs_ipg, CHAR_BIT);
+ excessdirs = oldcg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir;
+ if (excessdirs < 0) {
+ pfatal("LOST %d DIRECTORIES\n", -excessdirs);
+ excessdirs = 0;
+ }
+ if (excessdirs > 0)
+ check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize,
+ oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "DIR", freedirs,
+ 0, excessdirs, usesysctl);
+ check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize,
+ oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "FILE", freefiles,
+ excessdirs, fs->fs_ipg, usesysctl);
+ check_maps(cg_blksfree(oldcg), cg_blksfree(newcg),
+ howmany(fs->fs_fpg, CHAR_BIT),
+ oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_fpg, "FRAG",
+ freeblks, 0, fs->fs_fpg, usesysctl);
+}
+
static void
check_maps(
u_char *map1, /* map of claimed allocations */
@@ -435,7 +450,8 @@ check_maps(
const char *name, /* name of resource found in maps */
int *opcode, /* sysctl opcode to free resource */
int skip, /* number of entries to skip before starting to free */
- int limit) /* limit on number of entries to free */
+ int limit, /* limit on number of entries to free */
+ int usesysctl) /* 1 => use sysctl interface to update maps */
{
# define BUFSIZE 16
char buf[BUFSIZE];
@@ -443,7 +459,7 @@ check_maps(
ufs2_daddr_t n, astart, aend, ustart, uend;
void (*msg)(const char *fmt, ...);
- if (bkgrdflag)
+ if (usesysctl)
msg = pfatal;
else
msg = pwarn;
@@ -506,7 +522,7 @@ check_maps(
" MARKED USED\n",
"UNALLOCATED", name, ustart,
ustart + size - 1);
- if (bkgrdflag != 0) {
+ if (usesysctl != 0) {
cmd.value = ustart;
cmd.size = size;
if (sysctl(opcode, MIBSIZE, 0, 0,
@@ -552,7 +568,7 @@ check_maps(
" MARKED USED\n",
name, ustart, ustart + size - 1);
}
- if (bkgrdflag != 0) {
+ if (usesysctl != 0) {
cmd.value = ustart;
cmd.size = size;
if (sysctl(opcode, MIBSIZE, 0, 0, &cmd,
diff --git a/sbin/fsck_ffs/suj.c b/sbin/fsck_ffs/suj.c
index b4aa679..ec8b5ab 100644
--- a/sbin/fsck_ffs/suj.c
+++ b/sbin/fsck_ffs/suj.c
@@ -2261,6 +2261,7 @@ suj_build(void)
blk_build((struct jblkrec *)rec);
break;
case JOP_TRUNC:
+ case JOP_SYNC:
ino_build_trunc((struct jtrncrec *)rec);
break;
default:
diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c
index 55a055e..a456911 100644
--- a/sbin/geom/class/part/geom_part.c
+++ b/sbin/geom/class/part/geom_part.c
@@ -362,7 +362,7 @@ gpart_autofill_resize(struct gctl_req *req)
goto done;
}
- offset = pp->lg_stripeoffset / pp->lg_sectorsize;
+ offset = (pp->lg_stripeoffset / pp->lg_sectorsize) % alignment;
last = (off_t)strtoimax(find_geomcfg(gp, "last"), NULL, 0);
LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
s = find_provcfg(pp, "index");
@@ -497,10 +497,10 @@ gpart_autofill(struct gctl_req *req)
alignment = len;
/* Adjust parameters to stripeoffset */
- offset = pp->lg_stripeoffset / pp->lg_sectorsize;
+ offset = (pp->lg_stripeoffset / pp->lg_sectorsize) % alignment;
start = ALIGNUP(start + offset, alignment);
- if (size + offset > alignment)
- size = ALIGNDOWN(size + offset, alignment);
+ if (size > alignment)
+ size = ALIGNDOWN(size, alignment);
first = (off_t)strtoimax(find_geomcfg(gp, "first"), NULL, 0);
last = (off_t)strtoimax(find_geomcfg(gp, "last"), NULL, 0);
@@ -927,6 +927,7 @@ gpart_restore(struct gctl_req *req, unsigned int fl __unused)
gctl_ro_param(r, "size", -1, argv[3]);
if (rl != 0 && label != NULL)
gctl_ro_param(r, "label", -1, argv[4]);
+ gctl_ro_param(r, "alignment", -1, GPART_AUTOFILL);
gctl_ro_param(r, "arg0", -1, s);
error = gpart_autofill(r);
if (error != 0)
@@ -1207,8 +1208,11 @@ gpart_bootcode(struct gctl_req *req, unsigned int fl)
if (idx == 0)
errx(EXIT_FAILURE, "missing -i option");
gpart_write_partcode(gp, idx, partcode, partsize);
- } else
+ } else {
+ if (partsize != VTOC_BOOTSIZE)
+ errx(EXIT_FAILURE, "invalid bootcode");
gpart_write_partcode_vtoc8(gp, idx, partcode);
+ }
} else
if (bootcode == NULL)
errx(EXIT_FAILURE, "no -b nor -p");
diff --git a/sbin/growfs/growfs.8 b/sbin/growfs/growfs.8
index 2e90c79..819e0bd 100644
--- a/sbin/growfs/growfs.8
+++ b/sbin/growfs/growfs.8
@@ -37,12 +37,12 @@
.\" $TSHeader: src/sbin/growfs/growfs.8,v 1.3 2000/12/12 19:31:00 tomsoft Exp $
.\" $FreeBSD$
.\"
-.Dd May 8, 2011
+.Dd June 29, 2011
.Dt GROWFS 8
.Os
.Sh NAME
.Nm growfs
-.Nd grow size of an existing UFS file system
+.Nd expand an existing UFS file system
.Sh SYNOPSIS
.Nm
.Op Fl Ny
@@ -60,11 +60,11 @@ the disk must be labeled to a bigger size using
.Xr bsdlabel 8 .
If you wish to grow a file system beyond the boundary of
the slice it resides in, you must re-size the slice using
-.Xr fdisk 8
+.Xr gpart 8
before running
.Nm .
If you are using volumes you must enlarge them by using
-.Xr vinum 8 .
+.Xr gvinum 8 .
The
.Nm
utility extends the size of the file system on the specified special file.
@@ -119,12 +119,12 @@ up to 2GB if there is enough space in
.Sh SEE ALSO
.Xr bsdlabel 8 ,
.Xr dumpfs 8 ,
-.Xr fdisk 8 ,
.Xr ffsinfo 8 ,
.Xr fsck 8 ,
+.Xr gpart 8 ,
+.Xr gvinum 8 ,
.Xr newfs 8 ,
-.Xr tunefs 8 ,
-.Xr vinum 8
+.Xr tunefs 8
.Sh HISTORY
The
.Nm
diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c
index 45a7237..148f8ca 100644
--- a/sbin/growfs/growfs.c
+++ b/sbin/growfs/growfs.c
@@ -2146,8 +2146,8 @@ main(int argc, char **argv)
if(ExpertFlag == 0) {
for(j=0; j<FSMAXSNAP; j++) {
if(sblock.fs_snapinum[j]) {
- errx(1, "active snapshot found in file system\n"
- " please remove all snapshots before "
+ errx(1, "active snapshot found in file system; "
+ "please remove all snapshots before "
"using growfs");
}
if(!sblock.fs_snapinum[j]) { /* list is dense */
@@ -2159,16 +2159,16 @@ main(int argc, char **argv)
if (ExpertFlag == 0 && Nflag == 0) {
printf("We strongly recommend you to make a backup "
- "before growing the Filesystem\n\n"
- " Did you backup your data (Yes/No) ? ");
+ "before growing the file system.\n"
+ "Did you backup your data (Yes/No)? ");
fgets(reply, (int)sizeof(reply), stdin);
if (strcmp(reply, "Yes\n")){
- printf("\n Nothing done \n");
+ printf("\nNothing done\n");
exit (0);
}
}
- printf("new file systemsize is: %jd frags\n", (intmax_t)sblock.fs_size);
+ printf("New file system size is %jd frags\n", (intmax_t)sblock.fs_size);
/*
* Try to access our new last block in the file system. Even if we
diff --git a/sbin/hastctl/Makefile b/sbin/hastctl/Makefile
index b7b1db9..af946a2 100644
--- a/sbin/hastctl/Makefile
+++ b/sbin/hastctl/Makefile
@@ -21,6 +21,7 @@ MAN= hastctl.8
NO_WFORMAT=
CFLAGS+=-I${.CURDIR}/../hastd
+CFLAGS+=-DHAVE_CAPSICUM
CFLAGS+=-DINET
.if ${MK_INET6_SUPPORT} != "no"
CFLAGS+=-DINET6
diff --git a/sbin/hastctl/hastctl.c b/sbin/hastctl/hastctl.c
index 2f8a6eb..233b948 100644
--- a/sbin/hastctl/hastctl.c
+++ b/sbin/hastctl/hastctl.c
@@ -403,15 +403,15 @@ main(int argc, char *argv[])
break;
case 'e':
if (expand_number(optarg, &extentsize) < 0)
- err(1, "Invalid extentsize");
+ errx(EX_USAGE, "Invalid extentsize");
break;
case 'k':
if (expand_number(optarg, &keepdirty) < 0)
- err(1, "Invalid keepdirty");
+ errx(EX_USAGE, "Invalid keepdirty");
break;
case 'm':
if (expand_number(optarg, &mediasize) < 0)
- err(1, "Invalid mediasize");
+ errx(EX_USAGE, "Invalid mediasize");
break;
case 'h':
default:
diff --git a/sbin/hastd/Makefile b/sbin/hastd/Makefile
index 1ffd0a2..3c4eef1 100644
--- a/sbin/hastd/Makefile
+++ b/sbin/hastd/Makefile
@@ -20,8 +20,9 @@ SRCS+= y.tab.h
MAN= hastd.8 hast.conf.5
NO_WFORMAT=
-CFLAGS+=-DPROTO_TCP_DEFAULT_PORT=8457
CFLAGS+=-I${.CURDIR}
+CFLAGS+=-DHAVE_CAPSICUM
+CFLAGS+=-DPROTO_TCP_DEFAULT_PORT=8457
CFLAGS+=-DINET
.if ${MK_INET6_SUPPORT} != "no"
CFLAGS+=-DINET6
diff --git a/sbin/hastd/activemap.c b/sbin/hastd/activemap.c
index 2777ac5..127b2c8 100644
--- a/sbin/hastd/activemap.c
+++ b/sbin/hastd/activemap.c
@@ -205,7 +205,7 @@ keepdirty_find(struct activemap *amp, int extent)
return (kd);
}
-static void
+static bool
keepdirty_add(struct activemap *amp, int extent)
{
struct keepdirty *kd;
@@ -217,7 +217,7 @@ keepdirty_add(struct activemap *amp, int extent)
*/
TAILQ_REMOVE(&amp->am_keepdirty, kd, kd_next);
TAILQ_INSERT_HEAD(&amp->am_keepdirty, kd, kd_next);
- return;
+ return (false);
}
/*
* Add new element, but first remove the most unused one if
@@ -238,6 +238,8 @@ keepdirty_add(struct activemap *amp, int extent)
amp->am_nkeepdirty++;
TAILQ_INSERT_HEAD(&amp->am_keepdirty, kd, kd_next);
}
+
+ return (true);
}
static void
@@ -308,9 +310,9 @@ activemap_write_start(struct activemap *amp, off_t offset, off_t length)
assert(!bit_test(amp->am_memmap, ext));
bit_set(amp->am_memmap, ext);
amp->am_ndirty++;
- modified = true;
}
- keepdirty_add(amp, ext);
+ if (keepdirty_add(amp, ext))
+ modified = true;
}
return (modified);
@@ -345,7 +347,8 @@ activemap_write_complete(struct activemap *amp, off_t offset, off_t length)
if (--amp->am_memtab[ext] == 0) {
bit_clear(amp->am_memmap, ext);
amp->am_ndirty--;
- modified = true;
+ if (keepdirty_find(amp, ext) == NULL)
+ modified = true;
}
}
diff --git a/sbin/hastd/control.c b/sbin/hastd/control.c
index 4d00403..57a1c8a 100644
--- a/sbin/hastd/control.c
+++ b/sbin/hastd/control.c
@@ -155,8 +155,7 @@ control_status_worker(struct hast_resource *res, struct nv *nvout,
const char *str;
int error;
- cnvin = cnvout = NULL;
- error = 0;
+ cnvin = NULL;
/*
* Prepare and send command to worker process.
diff --git a/sbin/hastd/primary.c b/sbin/hastd/primary.c
index abda5cb..dd414f8 100644
--- a/sbin/hastd/primary.c
+++ b/sbin/hastd/primary.c
@@ -726,11 +726,13 @@ init_remote(struct hast_resource *res, struct proto_conn **inp,
(void)hast_activemap_flush(res);
}
nv_free(nvin);
+#ifdef notyet
/* Setup directions. */
if (proto_send(out, NULL, 0) == -1)
pjdlog_errno(LOG_WARNING, "Unable to set connection direction");
if (proto_recv(in, NULL, 0) == -1)
pjdlog_errno(LOG_WARNING, "Unable to set connection direction");
+#endif
pjdlog_info("Connected to %s.", res->hr_remoteaddr);
if (inp != NULL && outp != NULL) {
*inp = in;
@@ -1685,8 +1687,11 @@ ggate_send_thread(void *arg)
}
if (ggio->gctl_error == 0 && ggio->gctl_cmd == BIO_WRITE) {
mtx_lock(&res->hr_amp_lock);
- activemap_write_complete(res->hr_amp,
- ggio->gctl_offset, ggio->gctl_length);
+ if (activemap_write_complete(res->hr_amp,
+ ggio->gctl_offset, ggio->gctl_length)) {
+ res->hr_stat_activemap_update++;
+ (void)hast_activemap_flush(res);
+ }
mtx_unlock(&res->hr_amp_lock);
}
if (ggio->gctl_cmd == BIO_WRITE) {
diff --git a/sbin/hastd/secondary.c b/sbin/hastd/secondary.c
index 1597af8..7120d3d 100644
--- a/sbin/hastd/secondary.c
+++ b/sbin/hastd/secondary.c
@@ -183,9 +183,11 @@ init_remote(struct hast_resource *res, struct nv *nvin)
unsigned char *map;
size_t mapsize;
+#ifdef notyet
/* Setup direction. */
if (proto_send(res->hr_remoteout, NULL, 0) == -1)
pjdlog_errno(LOG_WARNING, "Unable to set connection direction");
+#endif
map = NULL;
mapsize = 0;
@@ -351,9 +353,11 @@ init_remote(struct hast_resource *res, struct nv *nvin)
if (map != NULL)
free(map);
nv_free(nvout);
+#ifdef notyet
/* Setup direction. */
if (proto_recv(res->hr_remotein, NULL, 0) == -1)
pjdlog_errno(LOG_WARNING, "Unable to set connection direction");
+#endif
if (res->hr_secondary_localcnt > res->hr_primary_remotecnt &&
res->hr_primary_localcnt > res->hr_secondary_remotecnt) {
/* Exit on split-brain. */
diff --git a/sbin/hastd/subr.c b/sbin/hastd/subr.c
index 806338b..89ffda0 100644
--- a/sbin/hastd/subr.c
+++ b/sbin/hastd/subr.c
@@ -31,7 +31,9 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#ifdef HAVE_CAPSICUM
#include <sys/capability.h>
+#endif
#include <sys/param.h>
#include <sys/disk.h>
#include <sys/ioctl.h>
@@ -230,9 +232,15 @@ drop_privs(struct hast_resource *res)
* ioctls and secondary uses ioctls to handle BIO_DELETE and BIO_FLUSH.
* For now capsicum is only used to sandbox hastctl.
*/
- if (res == NULL)
+#ifdef HAVE_CAPSICUM
+ if (res == NULL) {
capsicum = (cap_enter() == 0);
- else
+ if (!capsicum) {
+ pjdlog_common(LOG_DEBUG, 1, errno,
+ "Unable to sandbox using capsicum");
+ }
+ } else
+#endif
capsicum = false;
/*
diff --git a/sbin/ifconfig/Makefile b/sbin/ifconfig/Makefile
index 461de71..d4bdd1e 100644
--- a/sbin/ifconfig/Makefile
+++ b/sbin/ifconfig/Makefile
@@ -29,6 +29,7 @@ SRCS+= af_nd6.c # ND6 support
SRCS+= ifclone.c # clone device support
SRCS+= ifmac.c # MAC support
SRCS+= ifmedia.c # SIOC[GS]IFMEDIA support
+SRCS+= iffib.c # non-default FIB support
SRCS+= ifvlan.c # SIOC[GS]ETVLAN support
SRCS+= ifgre.c # GRE keys etc
SRCS+= ifgif.c # GIF reversed header workaround
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 45cf59b..cec32c5 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -28,7 +28,7 @@
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
.\" $FreeBSD$
.\"
-.Dd May 31, 2011
+.Dd July 3, 2011
.Dt IFCONFIG 8
.Os
.Sh NAME
@@ -296,6 +296,19 @@ Remove the interface from the given
Fill interface index
(lowermost 64bit of an IPv6 address)
automatically.
+.It Cm fib Ar fib_number
+Specify interface FIB.
+A FIB
+.Ar fib_number
+is assigned to all frames or packets received on that interface.
+The FIB is not inherited, e.g. vlans or other sub-interfaces will use
+the default FIB (0) irrespective of the parent interface's FIB.
+The kernel needs to be tuned to support more than the default FIB
+using the
+.Va ROUTETABLES
+kernel configuration option, or the
+.Va net.fibs
+tunable.
.It Cm ipdst
This is used to specify an Internet host who is willing to receive
IP packets encapsulating IPX packets bound for a remote network.
diff --git a/sbin/ifconfig/iffib.c b/sbin/ifconfig/iffib.c
new file mode 100644
index 0000000..f3498b4
--- /dev/null
+++ b/sbin/ifconfig/iffib.c
@@ -0,0 +1,103 @@
+/*-
+ * Copyright (c) 2011 Alexander V. Chernikov
+ * Copyright (c) 2011 Christian S.J. Peron
+ * Copyright (c) 2011 Bjoern A. Zeeb
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+
+#include "ifconfig.h"
+
+static void
+fib_status(int s)
+{
+ struct ifreq ifr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+ if (ioctl(s, SIOCGIFFIB, (caddr_t)&ifr) < 0)
+ return;
+
+ /* Ignore if it is the default. */
+ if (ifr.ifr_fib == 0)
+ return;
+
+ printf("\tfib: %u\n", ifr.ifr_fib);
+}
+
+static void
+setiffib(const char *val, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ unsigned long fib;
+ char *ep;
+
+ fib = strtoul(val, &ep, 0);
+ if (*ep != '\0' || fib > UINT_MAX) {
+ warn("fib %s not valid", val);
+ return;
+ }
+
+ strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
+ ifr.ifr_fib = fib;
+ if (ioctl(s, SIOCSIFFIB, (caddr_t)&ifr) < 0)
+ warn("ioctl (SIOCSIFFIB)");
+}
+
+static struct cmd fib_cmds[] = {
+ DEF_CMD_ARG("fib", setiffib),
+};
+
+static struct afswtch af_fib = {
+ .af_name = "af_fib",
+ .af_af = AF_UNSPEC,
+ .af_other_status = fib_status,
+};
+
+static __constructor void
+fib_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ size_t i;
+
+ for (i = 0; i < N(fib_cmds); i++)
+ cmd_register(&fib_cmds[i]);
+ af_register(&af_fib);
+#undef N
+}
diff --git a/sbin/ipfw/ipfw.8 b/sbin/ipfw/ipfw.8
index 4a22320..6fc12c8 100644
--- a/sbin/ipfw/ipfw.8
+++ b/sbin/ipfw/ipfw.8
@@ -1,7 +1,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 14, 2011
+.Dd June 29, 2011
.Dt IPFW 8
.Os
.Sh NAME
@@ -822,6 +822,78 @@ skipto, but care should be used, as no destination caching
is possible in this case so the rules are always walked to find it,
starting from the
.Cm skipto .
+.It Cm call Ar number | tablearg
+The current rule number is saved in the internal stack and
+ruleset processing continues with the first rule numbered
+.Ar number
+or higher.
+If later a rule with the
+.Cm return
+action is encountered, the processing returns to the first rule
+with number of this
+.Cm call
+rule plus one or higher
+(the same behaviour as with packets returning from
+.Xr divert 4
+socket after a
+.Cm divert
+action).
+This could be used to make somewhat like an assembly language
+.Dq subroutine
+calls to rules with common checks for different interfaces, etc.
+.Pp
+Rule with any number could be called, not just forward jumps as with
+.Cm skipto .
+So, to prevent endless loops in case of mistakes, both
+.Cm call
+and
+.Cm return
+actions don't do any jumps and simply go to the next rule if memory
+can't be allocated or stack overflowed/undeflowed.
+.Pp
+Internally stack for rule numbers is implemented using
+.Xr mbuf_tags 9
+facility and currently has size of 16 entries.
+As mbuf tags are lost when packet leaves the kernel,
+.Cm divert
+should not be used in subroutines to avoid endless loops
+and other undesired effects.
+.It Cm return
+Takes rule number saved to internal stack by the last
+.Cm call
+action and returns ruleset processing to the first rule
+with number greater than number of corresponding
+.Cm call
+rule. See description of the
+.Cm call
+action for more details.
+.Pp
+Note that
+.Cm return
+rules usually end a
+.Dq subroutine
+and thus are unconditional, but
+.Nm
+command-line utility currently requires every action except
+.Cm check-state
+to have body.
+While it is sometimes useful to return only on some packets,
+usually you want to print just
+.Dq return
+for readability.
+A workaround for this is to use new syntax and
+.Fl c
+switch:
+.Pp
+.Bd -literal -offset indent
+# Add a rule without actual body
+ipfw add 2999 return via any
+
+# List rules without "from any to any" part
+ipfw -c list
+.Ed
+.Pp
+This cosmetic annoyance may be fixed in future releases.
.It Cm tee Ar port
Send a copy of packets matching this rule to the
.Xr divert 4
@@ -3253,3 +3325,18 @@ for the respective conversations.
To avoid failures of network error detection and path MTU discovery,
ICMP error messages may need to be allowed explicitly through static
rules.
+.Pp
+Rules using
+.Cm call
+and
+.Cm return
+actions may lead to confusing behaviour if ruleset has mistakes,
+and/or interaction with other subsystems (netgraph, dummynet, etc.) is used.
+One possible case for this is packet leaving
+.Nm
+in subroutine on the input pass, while later on output encountering unpaired
+.Cm return
+first.
+As the call stack is kept intact after input pass, packet will suddenly
+return to the rule number used on input pass, not on output one.
+Order of processing should be checked carefully to avoid such mistakes.
diff --git a/sbin/ipfw/ipfw2.c b/sbin/ipfw/ipfw2.c
index 97d98a3..e259f5e 100644
--- a/sbin/ipfw/ipfw2.c
+++ b/sbin/ipfw/ipfw2.c
@@ -21,6 +21,7 @@
*/
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/sysctl.h>
@@ -213,6 +214,8 @@ static struct _s_x rule_actions[] = {
{ "nat", TOK_NAT },
{ "reass", TOK_REASS },
{ "setfib", TOK_SETFIB },
+ { "call", TOK_CALL },
+ { "return", TOK_RETURN },
{ NULL, 0 } /* terminator */
};
@@ -1135,6 +1138,13 @@ show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth)
printf("reass");
break;
+ case O_CALLRETURN:
+ if (cmd->len & F_NOT)
+ printf("return");
+ else
+ PRINT_UINT_ARG("call ", cmd->arg1);
+ break;
+
default:
printf("** unrecognized action %d len %d ",
cmd->opcode, cmd->len);
@@ -2770,6 +2780,9 @@ ipfw_add(char *av[])
goto chkarg;
case TOK_TEE:
action->opcode = O_TEE;
+ goto chkarg;
+ case TOK_CALL:
+ action->opcode = O_CALLRETURN;
chkarg:
if (!av[0])
errx(EX_USAGE, "missing argument for %s", *(av - 1));
@@ -2862,6 +2875,10 @@ chkarg:
action->opcode = O_REASS;
break;
+ case TOK_RETURN:
+ fill_cmd(action, O_CALLRETURN, F_NOT, 0);
+ break;
+
default:
errx(EX_DATAERR, "invalid action %s\n", av[-1]);
}
@@ -3567,7 +3584,7 @@ read_options:
}
if (lookup_key[j] <= 0)
errx(EX_USAGE, "format: cannot lookup on %s", *av);
- c->d[1] = j; // i converted to option
+ __PAST_END(c->d, 1) = j; // i converted to option
av++;
cmd->arg1 = strtoul(*av, &p, 0);
if (p && *p)
diff --git a/sbin/ipfw/ipfw2.h b/sbin/ipfw/ipfw2.h
index 9562f32..bade0dd 100644
--- a/sbin/ipfw/ipfw2.h
+++ b/sbin/ipfw/ipfw2.h
@@ -99,6 +99,8 @@ enum tokens {
TOK_CHECKSTATE,
TOK_NAT,
TOK_REASS,
+ TOK_CALL,
+ TOK_RETURN,
TOK_ALTQ,
TOK_LOG,
diff --git a/sbin/ipfw/main.c b/sbin/ipfw/main.c
index 109b62b..433ce7d 100644
--- a/sbin/ipfw/main.c
+++ b/sbin/ipfw/main.c
@@ -262,7 +262,7 @@ ipfw_main(int oldac, char **oldav)
save_av = av;
optind = optreset = 1; /* restart getopt() */
- while ((ch = getopt(ac, av, "abcdefhinNqs:STtv")) != -1)
+ while ((ch = getopt(ac, av, "abcdefhinNp:qs:STtv")) != -1)
switch (ch) {
case 'a':
do_acct = 1;
@@ -306,6 +306,10 @@ ipfw_main(int oldac, char **oldav)
co.do_resolv = 1;
break;
+ case 'p':
+ errx(EX_USAGE, "An absolute pathname must be used "
+ "with -p option.");
+
case 'q':
co.do_quiet = 1;
break;
@@ -603,9 +607,12 @@ main(int ac, char *av[])
* as a file to be preprocessed.
*/
- if (ac > 1 && av[ac - 1][0] == '/' && access(av[ac - 1], R_OK) == 0)
- ipfw_readfile(ac, av);
- else {
+ if (ac > 1 && av[ac - 1][0] == '/') {
+ if (access(av[ac - 1], R_OK) == 0)
+ ipfw_readfile(ac, av);
+ else
+ err(EX_USAGE, "pathname: %s", av[ac - 1]);
+ } else {
if (ipfw_main(ac, av)) {
errx(EX_USAGE,
"usage: ipfw [options]\n"
diff --git a/sbin/ipfw/nat.c b/sbin/ipfw/nat.c
index 6f8c39f..c95a625 100644
--- a/sbin/ipfw/nat.c
+++ b/sbin/ipfw/nat.c
@@ -315,14 +315,19 @@ static int
estimate_redir_addr(int *ac, char ***av)
{
size_t space = sizeof(struct cfg_redir);
- char *sep;
+ char *sep = **av;
+ u_int c = 0;
- if ((sep = strtok(**av, ",")) != NULL) {
- space += sizeof(struct cfg_spool);
- while ((sep = strtok(NULL, ",")) != NULL)
- space += sizeof(struct cfg_spool);
+ while ((sep = strchr(sep, ',')) != NULL) {
+ c++;
+ sep++;
}
+ if (c > 0)
+ c++;
+
+ space += c * sizeof(struct cfg_spool);
+
return (space);
}
@@ -370,14 +375,19 @@ static int
estimate_redir_port(int *ac, char ***av)
{
size_t space = sizeof(struct cfg_redir);
- char *sep;
+ char *sep = **av;
+ u_int c = 0;
- if ((sep = strtok(**av, ",")) != NULL) {
- space += sizeof(struct cfg_spool);
- while ((sep = strtok(NULL, ",")) != NULL)
- space += sizeof(struct cfg_spool);
+ while ((sep = strchr(sep, ',')) != NULL) {
+ c++;
+ sep++;
}
+ if (c > 0)
+ c++;
+
+ space += c * sizeof(struct cfg_spool);
+
return (space);
}
@@ -465,10 +475,10 @@ setup_redir_port(char *buf, int *ac, char ***av)
* Extract remote address and optionally port.
*/
/*
- * NB: isalpha(**av) => we've to check that next parameter is really an
+ * NB: isdigit(**av) => we've to check that next parameter is really an
* option for this redirect entry, else stop here processing arg[cv].
*/
- if (*ac != 0 && !isalpha(***av)) {
+ if (*ac != 0 && isdigit(***av)) {
if ((sep = strchr(**av, ':')) != NULL) {
if (StrToAddrAndPortRange(**av, &r->raddr, protoName,
&portRange) != 0)
@@ -584,7 +594,7 @@ setup_redir_proto(char *buf, int *ac, char ***av)
r->raddr.s_addr = INADDR_ANY;
} else {
/* see above in setup_redir_port() */
- if (!isalpha(***av)) {
+ if (isdigit(***av)) {
StrToAddr(**av, &r->paddr);
(*av)++; (*ac)--;
@@ -592,7 +602,7 @@ setup_redir_proto(char *buf, int *ac, char ***av)
* Extract optional remote address.
*/
/* see above in setup_redir_port() */
- if (*ac != 0 && !isalpha(***av)) {
+ if (*ac != 0 && isdigit(***av)) {
StrToAddr(**av, &r->raddr);
(*av)++; (*ac)--;
}
@@ -728,7 +738,8 @@ ipfw_config_nat(int ac, char **av)
char *id, *buf, **av1, *end;
size_t len;
- av++; ac--;
+ av++;
+ ac--;
/* Nat id. */
if (ac == 0)
errx(EX_DATAERR, "missing nat id");
@@ -736,7 +747,8 @@ ipfw_config_nat(int ac, char **av)
i = (int)strtol(id, &end, 0);
if (i <= 0 || *end != '\0')
errx(EX_DATAERR, "illegal nat id: %s", id);
- av++; ac--;
+ av++;
+ ac--;
if (ac == 0)
errx(EX_DATAERR, "missing option");
@@ -745,11 +757,13 @@ ipfw_config_nat(int ac, char **av)
av1 = av;
while (ac1 > 0) {
tok = match_token(nat_params, *av1);
- ac1--; av1++;
+ ac1--;
+ av1++;
switch (tok) {
case TOK_IP:
case TOK_IF:
- ac1--; av1++;
+ ac1--;
+ av1++;
break;
case TOK_ALOG:
case TOK_DENY_INC:
@@ -765,22 +779,40 @@ ipfw_config_nat(int ac, char **av)
errx(EX_DATAERR, "redirect_addr: "
"not enough arguments");
len += estimate_redir_addr(&ac1, &av1);
- av1 += 2; ac1 -= 2;
+ av1 += 2;
+ ac1 -= 2;
break;
case TOK_REDIR_PORT:
if (ac1 < 3)
errx(EX_DATAERR, "redirect_port: "
"not enough arguments");
- av1++; ac1--;
+ av1++;
+ ac1--;
len += estimate_redir_port(&ac1, &av1);
- av1 += 2; ac1 -= 2;
+ av1 += 2;
+ ac1 -= 2;
+ /* Skip optional remoteIP/port */
+ if (ac1 != 0 && isdigit(**av1)) {
+ av1++;
+ ac1--;
+ }
break;
case TOK_REDIR_PROTO:
if (ac1 < 2)
errx(EX_DATAERR, "redirect_proto: "
"not enough arguments");
len += sizeof(struct cfg_redir);
- av1 += 2; ac1 -= 2;
+ av1 += 2;
+ ac1 -= 2;
+ /* Skip optional remoteIP/port */
+ if (ac1 != 0 && isdigit(**av1)) {
+ av1++;
+ ac1--;
+ }
+ if (ac1 != 0 && isdigit(**av1)) {
+ av1++;
+ ac1--;
+ }
break;
default:
errx(EX_DATAERR, "unrecognised option ``%s''", av1[-1]);
@@ -798,7 +830,8 @@ ipfw_config_nat(int ac, char **av)
while (ac > 0) {
tok = match_token(nat_params, *av);
- ac--; av++;
+ ac--;
+ av++;
switch (tok) {
case TOK_IP:
if (ac == 0)
@@ -806,13 +839,15 @@ ipfw_config_nat(int ac, char **av)
if (!inet_aton(av[0], &(n->ip)))
errx(EX_DATAERR, "bad ip address ``%s''",
av[0]);
- ac--; av++;
+ ac--;
+ av++;
break;
case TOK_IF:
if (ac == 0)
errx(EX_DATAERR, "missing option");
set_addr_dynamic(av[0], n);
- ac--; av++;
+ ac--;
+ av++;
break;
case TOK_ALOG:
n->mode |= PKT_ALIAS_LOG;
@@ -891,7 +926,8 @@ ipfw_show_nat(int ac, char **av)
data = NULL;
frule = 0;
lrule = IPFW_DEFAULT_RULE; /* max ipfw rule number */
- ac--; av++;
+ ac--;
+ av++;
if (co.test_only)
return;
diff --git a/sbin/natd/natd.8 b/sbin/natd/natd.8
index 6bed424..0729e2c 100644
--- a/sbin/natd/natd.8
+++ b/sbin/natd/natd.8
@@ -473,7 +473,7 @@ This option is intended to be used with multiple instances:
packets received on this port are checked against
internal translation tables of every configured instance.
If an entry is found, packet is aliased according to that entry.
-In no entry was found in any of the instances, packet is passed
+If no entry was found in any of the instances, packet is passed
unchanged, and no new entry will be created.
See the section
.Sx MULTIPLE INSTANCES
diff --git a/sbin/newfs/newfs.8 b/sbin/newfs/newfs.8
index 9d454cf..7cfdfd1 100644
--- a/sbin/newfs/newfs.8
+++ b/sbin/newfs/newfs.8
@@ -28,7 +28,7 @@
.\" @(#)newfs.8 8.6 (Berkeley) 5/3/95
.\" $FreeBSD$
.\"
-.Dd May 25, 2011
+.Dd June 22, 2011
.Dt NEWFS 8
.Os
.Sh NAME
@@ -297,6 +297,7 @@ on file systems that contain many small files.
.Xr dumpfs 8 ,
.Xr fsck 8 ,
.Xr gjournal 8 ,
+.Xr growfs 8 ,
.Xr makefs 8 ,
.Xr mount 8 ,
.Xr tunefs 8 ,
diff --git a/sbin/newfs_msdos/newfs_msdos.c b/sbin/newfs_msdos/newfs_msdos.c
index 955c3a5..6d8fa7e 100644
--- a/sbin/newfs_msdos/newfs_msdos.c
+++ b/sbin/newfs_msdos/newfs_msdos.c
@@ -44,6 +44,7 @@ static const char rcsid[] =
#include <fcntl.h>
#include <inttypes.h>
#include <paths.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -216,6 +217,9 @@ static const u_int8_t bootcode[] = {
0
};
+static volatile sig_atomic_t got_siginfo;
+static void infohandler(int);
+
static void check_mounted(const char *, mode_t);
static void getstdfmt(const char *, struct bpb *);
static void getdiskinfo(int, const char *, const char *, int,
@@ -243,6 +247,7 @@ main(int argc, char *argv[])
int opt_N = 0;
int Iflag = 0, mflag = 0, oflag = 0;
char buf[MAXPATHLEN];
+ struct sigaction si_sa;
struct stat sb;
struct timeval tv;
struct bpb bpb;
@@ -604,7 +609,19 @@ main(int argc, char *argv[])
if (!(img = malloc(bpb.bpbBytesPerSec)))
err(1, NULL);
dir = bpb.bpbResSectors + (bpb.bpbFATsecs ? bpb.bpbFATsecs : bpb.bpbBigFATsecs) * bpb.bpbFATs;
+ memset(&si_sa, 0, sizeof(si_sa));
+ si_sa.sa_handler = infohandler;
+ if (sigaction(SIGINFO, &si_sa, NULL) == -1)
+ err(1, "sigaction SIGINFO");
for (lsn = 0; lsn < dir + (fat == 32 ? bpb.bpbSecPerClust : rds); lsn++) {
+ if (got_siginfo) {
+ fprintf(stderr,"%s: writing sector %u of %u (%u%%)\n",
+ fname, lsn,
+ (dir + (fat == 32 ? bpb.bpbSecPerClust: rds)),
+ (lsn * 100) / (dir +
+ (fat == 32 ? bpb.bpbSecPerClust: rds)));
+ got_siginfo = 0;
+ }
x = lsn;
if (opt_B &&
fat == 32 && bpb.bpbBackup != MAXU16 &&
@@ -1017,3 +1034,10 @@ usage(void)
"\t-u sectors/track\n");
exit(1);
}
+
+static void
+infohandler(int sig __unused)
+{
+
+ got_siginfo = 1;
+}
diff --git a/sbin/pflogd/Makefile b/sbin/pflogd/Makefile
index ecd06f4..ea37bd1 100644
--- a/sbin/pflogd/Makefile
+++ b/sbin/pflogd/Makefile
@@ -8,7 +8,7 @@ MAN= pflogd.8
CFLAGS+=-include ${.CURDIR}/../../lib/libpcap/config.h
-LDADD= -lpcap -lutil
+LDADD= -lpcap
DPADD= ${LIBPCAP} ${LIBUTIL}
WARNS?= 2
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c
index d54fcf5..ea715f3 100644
--- a/sbin/savecore/savecore.c
+++ b/sbin/savecore/savecore.c
@@ -66,7 +66,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/disk.h>
#include <sys/kerneldump.h>
-#include <sys/param.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <errno.h>
diff --git a/sbin/shutdown/shutdown.8 b/sbin/shutdown/shutdown.8
index 032c4f3..b7067e1 100644
--- a/sbin/shutdown/shutdown.8
+++ b/sbin/shutdown/shutdown.8
@@ -28,7 +28,7 @@
.\" @(#)shutdown.8 8.2 (Berkeley) 4/27/95
.\" $FreeBSD$
.\"
-.Dd December 30, 2010
+.Dd July 13, 2011
.Dt SHUTDOWN 8
.Os
.Sh NAME
@@ -83,20 +83,20 @@ If one of the
.Fl p
or
.Fl r
-is specified,
+options are specified,
.Nm
will execute
.Xr halt 8
or
.Xr reboot 8
-instead of sending signal to
+instead of sending a signal to
.Xr init 8 .
.It Fl n
If the
.Fl o
-is specified, prevent the file system cache from being flushed by passing
+option is specified, prevent the file system cache from being flushed by passing
.Fl n
-option to
+to
.Xr halt 8
or
.Xr reboot 8 .
@@ -106,10 +106,10 @@ This option should probably not be used.
is the time at which
.Nm
will bring the system down and
-may be the word
+may be the case-insensitive word
.Ar now
(indicating an immediate shutdown) or
-specify a future time in one of two formats:
+a future time in one of two formats:
.Ar +number ,
or
.Ar yymmddhhmm ,
@@ -148,7 +148,7 @@ exits.
.Pp
At shutdown time a message is written to the system log, containing the
time of shutdown, the person who initiated the shutdown and the reason.
-Corresponding signal is then sent to
+The corresponding signal is then sent to
.Xr init 8
to respectively halt, reboot or bring the system down to single-user state
(depending on the above options).
@@ -170,22 +170,24 @@ file that
.Nm
created will be removed automatically.
.Pp
-When run without options, the
+When run without options, the
.Nm
-utility will place the system into single user mode at the
+utility will place the system into single user mode at the
.Ar time
specified.
.Pp
-Calling utility as
-.Nm poweroff
-is equivalent of calling:
+Calling
+.Dq Nm poweroff
+is equivalent to running:
.Bd -literal -offset indent
shutdown -p now
.Ed
.Sh FILES
.Bl -tag -width /var/run/nologin -compact
.It Pa /var/run/nologin
-tells login not to let anyone log in
+tells
+.Xr login 1
+not to let anyone log in
.El
.Sh COMPATIBILITY
The hours and minutes in the second time format may be separated by
diff --git a/sbin/tunefs/tunefs.8 b/sbin/tunefs/tunefs.8
index 3b4e944..5b522e5 100644
--- a/sbin/tunefs/tunefs.8
+++ b/sbin/tunefs/tunefs.8
@@ -28,7 +28,7 @@
.\" @(#)tunefs.8 8.2 (Berkeley) 12/11/93
.\" $FreeBSD$
.\"
-.Dd May 8, 2011
+.Dd June 22, 2011
.Dt TUNEFS 8
.Os
.Sh NAME
@@ -165,6 +165,7 @@ specified mount point.
.Xr fs 5 ,
.Xr dumpfs 8 ,
.Xr gjournal 8 ,
+.Xr growfs 8 ,
.Xr newfs 8
.Rs
.%A M. McKusick
diff --git a/sbin/umount/umount.c b/sbin/umount/umount.c
index 9b75449..6c65aec 100644
--- a/sbin/umount/umount.c
+++ b/sbin/umount/umount.c
@@ -154,6 +154,8 @@ main(int argc, char *argv[])
sfs = &mntbuf[mntsize];
if (checkvfsname(sfs->f_fstypename, typelist))
continue;
+ if (strcmp(sfs->f_mntonname, "/dev") == 0)
+ continue;
if (umountfs(sfs) != 0)
errs = 1;
}
diff --git a/share/doc/bind9/Makefile b/share/doc/bind9/Makefile
index 04b5708..4d38b11 100644
--- a/share/doc/bind9/Makefile
+++ b/share/doc/bind9/Makefile
@@ -8,17 +8,20 @@ SRCDIR= ${BIND_DIR}/doc
NO_OBJ=
FILESGROUPS= TOP ARM MISC
-TOP= CHANGES COPYRIGHT FAQ KNOWN-DEFECTS NSEC3-NOTES README \
- README.idnkit README.pkcs11
+TOP= CHANGES COPYRIGHT FAQ HISTORY README
TOPDIR= ${DOCDIR}/bind9
ARM= Bv9ARM.ch01.html Bv9ARM.ch02.html Bv9ARM.ch03.html \
Bv9ARM.ch04.html Bv9ARM.ch05.html Bv9ARM.ch06.html \
Bv9ARM.ch07.html Bv9ARM.ch08.html Bv9ARM.ch09.html \
- Bv9ARM.ch10.html Bv9ARM.html man.dig.html \
+ Bv9ARM.ch10.html Bv9ARM.html \
+ man.arpaname.html man.ddns-confgen.html man.dig.html \
man.dnssec-dsfromkey.html man.dnssec-keyfromlabel.html \
- man.dnssec-keygen.html man.dnssec-signzone.html man.host.html \
+ man.dnssec-keygen.html man.dnssec-revoke.html \
+ man.dnssec-settime.html man.dnssec-signzone.html \
+ man.genrandom.html man.host.html man.isc-hmac-fixup.html \
man.named-checkconf.html man.named-checkzone.html \
- man.named.html man.nsupdate.html \
+ man.named-journalprint.html man.named.html \
+ man.nsec3hash.html man.nsupdate.html \
man.rndc-confgen.html man.rndc.conf.html man.rndc.html
ARMDIR= ${TOPDIR}/arm
MISC= dnssec format-options.pl ipv6 migration migration-4to9 \
diff --git a/share/examples/etc/make.conf b/share/examples/etc/make.conf
index 516a0e2..d3cdf3e7 100644
--- a/share/examples/etc/make.conf
+++ b/share/examples/etc/make.conf
@@ -188,6 +188,7 @@
#SUPFILE= /usr/share/examples/cvsup/standard-supfile
#PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile
#DOCSUPFILE= /usr/share/examples/cvsup/doc-supfile
+#WWWSUPFILE= /usr/share/examples/cvsup/www-supfile
#
# top(1) uses a hash table for the user names. The size of this hash
# can be tuned to match the number of local users. The table size should
diff --git a/share/man/man3/pthread_set_name_np.3 b/share/man/man3/pthread_set_name_np.3
index 3bf430a..aad2fd6 100644
--- a/share/man/man3/pthread_set_name_np.3
+++ b/share/man/man3/pthread_set_name_np.3
@@ -44,9 +44,6 @@ function sets internal name for thread specified by
argument to string value specified by
.Fa name
argument.
-.Pp
-This is a debugging interface and using it on a day-by-day basis makes
-no sense.
.Sh ERRORS
Because of the debugging nature of this function, all errors that may
appear inside are silently ignored.
diff --git a/share/man/man4/axe.4 b/share/man/man4/axe.4
index e11c85a..156aa61 100644
--- a/share/man/man4/axe.4
+++ b/share/man/man4/axe.4
@@ -30,12 +30,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 16, 2011
+.Dd July 14, 2011
.Dt AXE 4
.Os
.Sh NAME
.Nm axe
-.Nd "ASIX Electronics AX88172/178/772 USB Ethernet driver"
+.Nd "ASIX Electronics AX88x7x/760 USB Ethernet driver"
.Sh SYNOPSIS
To compile this driver into the kernel,
place the following lines in your
@@ -59,12 +59,14 @@ if_axe_load="YES"
The
.Nm
driver provides support for USB Ethernet adapters based on the ASIX
-Electronics AX88172, AX88178 and AX88772 USB 2.0 chipsets.
+Electronics AX88172, AX88178, AX88772, AX88772A, AX88772B and AX88760
+USB 2.0 chipsets.
.Pp
-The AX88172 and AX88178 are USB 2.0 devices that contain a 10/100
+The AX88172, AX88772, AX88772A, AX88772B and AX88760 contain a 10/100
Ethernet MAC with MII interface and are designed to work with both
Ethernet and HomePNA transceivers.
-The AX88772 will additionally support 10/100/1000 MACs.
+The AX88178 has a 10/100/1000 Ethernet MAC with GMII/RGMII interface
+for interfacing with Gigabit Ethernet PHY.
.Pp
These devices will operate with
both USB 1.x and USB 2.0 controllers, however performance with 1.x
@@ -85,43 +87,48 @@ driver supports the following media types:
.It Cm autoselect
Enable autoselection of the media type and options.
The user can manually override
-the autoselected mode by adding media options to the
-.Pa /etc/rc.conf
-file.
+the autoselected mode by adding media options to
+.Xr rc.conf 5 .
.It Cm 10baseT/UTP
Set 10Mbps operation.
The
+.Xr ifconfig 8
.Cm mediaopt
-option can also be used to enable
-.Cm full-duplex
-operation.
-Not specifying
+option can also be used to select either
.Cm full-duplex
-implies
+or
.Cm half-duplex
-mode.
+modes.
.It Cm 100baseTX
Set 100Mbps (Fast Ethernet) operation.
The
+.Xr ifconfig 8
.Cm mediaopt
-option can also be used to enable
+option can also be used to select either
.Cm full-duplex
-operation.
-Not specifying
+or
+.Cm half-duplex
+modes.
+.It Cm 1000baseT
+Set 1000Mbps (Gigabit Ethernet) operation (AX88178 only).
+The
+.Xr ifconfig 8
+.Cm mediaopt
+option can also be used to select either
.Cm full-duplex
-implies
+or
.Cm half-duplex
-mode.
+modes.
.El
.Pp
The
.Nm
driver supports the following media options:
-.Bl -tag -width ".Cm 10baseT/UTP"
+.Bl -tag -width ".Cm full-duplex"
.It Cm full-duplex
Force full duplex operation.
-The interface will operate in
-half duplex mode if this media option is not specified.
+.It Cm half-duplex
+Force half duplex operation.
.El
.Pp
For more information on configuring this device, see
@@ -129,8 +136,8 @@ For more information on configuring this device, see
.Sh HARDWARE
The
.Nm
-driver supports ASIX Electronics AX88172/AX88178/AX88772 based USB Ethernet
-adapters including:
+driver supports ASIX Electronics AX88172/AX88178/AX88772/AX88772A/AX88772B/AX88760
+based USB Ethernet adapters including:
.Pp
AX88172:
.Bl -bullet -compact
@@ -139,6 +146,8 @@ AboCom UF200
.It
Acer Communications EP1427X2
.It
+ASIX AX88172
+.It
ATen UC210T
.It
Billionton SnapPort
@@ -167,6 +176,8 @@ System TALKS Inc.\& SGC-X2UL
AX88178:
.Bl -bullet -compact
.It
+ASIX AX88178
+.It
Belkin F5D5055
.It
Logitec LAN-GTJ/U2A
@@ -181,9 +192,9 @@ Sitecom Europe LN-028
AX88772:
.Bl -bullet -compact
.It
-Buffalo (Melco Inc.) LUA3-U2-ATX
+ASIX AX88772
.It
-Cisco-Linksys USB200Mv2
+Buffalo (Melco Inc.) LUA3-U2-ATX
.It
D-Link DUBE100B1
.It
@@ -191,6 +202,26 @@ Planex UE-200TX-G
.It
Planex UE-200TX-G2
.El
+.Pp
+AX88772A:
+.Bl -bullet -compact
+.It
+ASIX AX88772A
+.It
+Cisco-Linksys USB200Mv2
+.El
+.Pp
+AX88772B:
+.Bl -bullet -compact
+.It
+ASIX AX88772B
+.El
+.Pp
+AX88760:
+.Bl -bullet -compact
+.It
+ASIX AX88760
+.El
.Sh DIAGNOSTICS
.Bl -diag
.It "axe%d: watchdog timeout"
@@ -209,7 +240,7 @@ The driver failed to allocate an mbuf for the receiver ring.
.Xr rgephy 4 ,
.Xr ifconfig 8
.Rs
-.%T "ASIX AX88172 AX88178 and AX88772 data sheets"
+.%T "ASIX AX88x7x and AX88760 data sheets"
.%U http://www.asix.com.tw
.Re
.Sh HISTORY
diff --git a/share/man/man4/jme.4 b/share/man/man4/jme.4
index 4220ab5..0bcf652 100644
--- a/share/man/man4/jme.4
+++ b/share/man/man4/jme.4
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 20, 2010
+.Dd June 29, 2011
.Dt JME 4
.Os
.Sh NAME
@@ -178,3 +178,17 @@ address once station address is reprogrammed via eFuse.
It is highly recommended not to reprogram station address and
it is responsibility of administrator to store original station
address into a safe place when station address should be changed.
+.Pp
+There are two known 1000baseT link establishment issues with JMC25x.
+If the full mask revision number of JMC25x controller is less than
+or equal to 4 and link partner enabled IEEE 802.3az Energy Efficient
+Ethernet feature, the controller would not be able to establish a
+1000baseT link.
+Also if the length of cable is longer than 120 meters, controller
+can not establish a 1000baseT link.
+The known workaround for the issue is to force manual link
+configuration with 100baseTX instead of relying on auto-negotiation.
+The full mask revision number of controller could be checked with
+verbose kernel boot option.
+Use lower nibble of chip revision number to get full mask revision of
+the controller.
diff --git a/share/man/man4/ng_ether.4 b/share/man/man4/ng_ether.4
index 9fd409d..6ca5c11 100644
--- a/share/man/man4/ng_ether.4
+++ b/share/man/man4/ng_ether.4
@@ -34,7 +34,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 4, 2006
+.Dd June 23, 2011
.Dt NG_ETHER 4
.Os
.Sh NAME
@@ -183,7 +183,6 @@ Detach from underlying Ethernet interface and shut down node.
Upon receipt of the
.Dv NGM_SHUTDOWN
control message, all hooks are disconnected, promiscuous mode is disabled,
-and the source address override flag is re-enabled,
but the node is not removed.
Node can be shut down only using
.Dv NGM_ETHER_DETACH
diff --git a/share/man/man4/snd_hda.4 b/share/man/man4/snd_hda.4
index 9325788..6dedb02 100644
--- a/share/man/man4/snd_hda.4
+++ b/share/man/man4/snd_hda.4
@@ -668,16 +668,20 @@ and
A few Hardware/OEM vendors tend to screw up BIOS settings, thus
rendering the
.Nm
-driver useless, which usually results in a state where the
+driver useless.
+This usually results in a state where the
.Nm
-driver seems to attach and work, but without any sound. Some of
-that cases can be solved by tuning loader.conf variables. But before
-trying to fix problem that way, make sure that problem is really exists
-and the PCM audio device you are using really corresponds to expected
+driver seems to attach and work, but no sound is played.
+Some cases can be solved by tuning
+.Pa loader.conf
+variables.
+Before trying to fix problem that way, make sure that there really is a problem
+and that the PCM audio device in use really corresponds to the expected
audio connector.
.Pp
-Some vendors use non-standardized General Purpose I/O (GPIO) pins of codec
-to control external amplifiers. In some cases setting proper combination of
-GPIO bits may be needed to make sound work on specific device.
+Some vendors use non-standardized General Purpose I/O (GPIO) pins of the codec
+to control external amplifiers.
+In some cases setting a combination of GPIO bits may be needed to make
+sound work on a specific device.
.Pp
HDMI and DisplayPort audio may also require support from video driver.
diff --git a/share/man/man4/stf.4 b/share/man/man4/stf.4
index fb2617a..660e33e 100644
--- a/share/man/man4/stf.4
+++ b/share/man/man4/stf.4
@@ -1,7 +1,6 @@
.\" $KAME: stf.4,v 1.35 2001/05/02 06:24:49 itojun Exp $
.\"
.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
-.\" Copyright (c) 2010 Hiroki Sato <hrs@FreeBSD.org>
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -30,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 23, 2010
+.Dd April 27, 2001
.Dt STF 4
.Os
.Sh NAME
@@ -43,11 +42,21 @@ tunnel interface
.Sh DESCRIPTION
The
.Nm
-interface supports IPv6 in IPv4 encapsulation by
-tunneling IPv6 traffic over IPv4, as specified in
-.Li RFC3056 Pq 6to4
-and
-.Li RFC5569 Pq 6rd .
+interface supports
+.Dq 6to4
+IPv6 in IPv4 encapsulation.
+It can tunnel IPv6 traffic over IPv4, as specified in
+.Li RFC3056 .
+.Pp
+For ordinary nodes in 6to4 site, you do not need
+.Nm
+interface.
+The
+.Nm
+interface is necessary for site border router
+(called
+.Dq 6to4 router
+in the specification).
.Pp
Each
.Nm
@@ -63,28 +72,12 @@ variable in
.Pp
Due to the way 6to4 protocol is specified,
.Nm
-interface requires certain configuration to work properly. Two
-different protocols defined in RFC3056 and RFC5569 are basically the
-same as each other except for address handling, so
-.Nm
-decides its behavior based on the configured IPv6 addresses as
-explained in the following.
-The
-.Nm
-interface can be configured with multiple IPv6 addresses including
-both 6to4 and 6rd.
-.Sh RFC3056 (a.k.a. 6to4)
+interface requires certain configuration to work properly.
Single
-.Pq no more than 1 valid 6to4 address needs to be configured to the interface.
-.Dq a valid 6to4 address
-is an address which has the following properties. For ordinary nodes
-in 6to4 site, you do not need
-.Nm
-interface; it is necessary only for site border router
-(called
-.Dq 6to4 router
-in the specification).
-.Pp
+(no more than 1)
+valid 6to4 address needs to be configured to the interface.
+.Dq A valid 6to4 address
+is an address which has the following properties.
If any of the following properties are not satisfied,
.Nm
raises runtime error on packet transmission.
@@ -117,78 +110,6 @@ you may want to configure IPv6 prefix length as
.Nm
interface will check the IPv4 source address on packets,
if the IPv6 prefix length is larger than 16.
-.Sh RFC5569 (a.k.a. 6rd)
-The
-.Nm
-interface works in the 6rd mode when one or more IPv6 addresses that
-consists of an IPv6 prefix and 32-bit IPv4 part with a prefix length
-equal to or shorter than 64. In 6rd protocol, an IPv6 address
-.Li 2001:db8:c000:205::1/32
-means the following, for example:
-.Bl -bullet
-.It
-The 6rd relay prefix is
-.Li 2001:db8::/32 .
-.It
-The 6rd router's IPv4 address is
-.Li 192.0.2.5 .
-.El
-.Pp
-As you can see the IPv4 address is embedded in the IPv6 address just
-after the prefix. While you can choose an IPv6 prefix length other
-than 32, it must be from 0 to 32.
-.Pp
-Assuming this address is configured on the
-.Nm
-interface, it does the following:
-.Bl -bullet
-.It
-An incoming IPv6 packet on
-.Nm
-will be encapsuled in an IPv4 packet with the source address
-.Li 192.0.2.5
-and then the IPv4 packet is delivered based on the IPv4 routing table.
-The IPv4 destination address is calculated from the destination
-address of the original IPv6 packet in the same way as the source.
-.It
-An incoming IPv4 packet which encapsules an IPv6 packet whose
-destination address matches a 6rd prefix with embedded IPv4 address
-configured on the
-.Nm
-interface, the IPv6 packet will be decapsulated and delivered based on
-the IPv6 routing table. Note that
-.Nm
-interface normally has a route which covers whole range of a 6rd relay
-prefix, the delivered IPv6 packet can return to
-.Nm
-if there is no more specific route. In that case, the returned packet
-will be discarded silently.
-.El
-.\" XXX: example configuration will be added
-.\" .Pp
-.\" By using this interface, you can configure a 6rd domain. For simplicity,
-.\" we assume the following here:
-.\" .Bl -bullet
-.\" .It
-.\" A 6rd Customer, who has an IPv6/IPv4 LAN and an IPv4-only access
-.\" toward network of his Internet Service Provider. The Customer has
-.\" a router called
-.\" .Dq CE Pq Customer Edge
-.\" Router, which can communicate between his LAN and the ISP over IPv4
-.\" and encapsulate
-.\" his networks.
-.\" .It
-.\" A 6rd Provider, who provides IPv6 Internet reachability by using 6rd
-.\" protocol. The Provider offers access to a router called
-.\" .Dq PE Pq Provider Edge
-.\" Router, which can communicate with
-.\" .El
-.\" .Pp
-.\" A 6rd customer
-.\" needs to configure
-.\" .Nm
-.\" on his CE (Customer Edge) router.
-.Sh Other Functionality of the Interface
.Pp
.Nm
can be configured to be ECN friendly.
@@ -226,6 +147,9 @@ Packets with IPv4 multicast address as outer IPv4 source/destination
Packets with limited broadcast address as outer IPv4 source/destination
.Pq Li 255.0.0.0/8
.It
+Packets with private address as outer IPv4 source/destination
+.Pq Li 10.0.0.0/8 , 172.16.0.0/12 , 192.168.0.0/16
+.It
Packets with subnet broadcast address as outer IPv4 source/destination.
The check is made against subnet broadcast addresses for
all of the directly connected subnets.
@@ -240,11 +164,6 @@ The same set of rules are applied against the IPv4 address embedded into
inner IPv6 address, if the IPv6 address matches 6to4 prefix.
.El
.Pp
-In addition to them, packets with private address as outer IPv4
-source/destination
-.Pq Li 10.0.0.0/8 , 172.16.0.0/12 , 192.168.0.0/16
-are filtered out only in the 6to4 mode.
-.Pp
It is recommended to filter/audit
incoming IPv4 packet with IP protocol number 41, as necessary.
It is also recommended to filter/audit encapsulated IPv6 packets as well.
diff --git a/share/man/man5/make.conf.5 b/share/man/man5/make.conf.5
index 0f9e70d..c424a1e 100644
--- a/share/man/man5/make.conf.5
+++ b/share/man/man5/make.conf.5
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 15, 2009
+.Dd June 16, 2011
.Dt MAKE.CONF 5
.Os
.Sh NAME
@@ -181,7 +181,11 @@ options.
.Pq Vt bool
Set this to use
.Xr cvs 1
-to update your ports with
+to update your
+.Pa src , ports
+and
+.Pa doc
+trees with
.Dq Li "make update" .
.It Va CXXFLAGS
.Pq Vt str
@@ -202,8 +206,8 @@ The documentation
.Ar supfile
to use when doing a
.Dq Li "make update" .
-This defaults to
-.Pa /usr/share/examples/cvsup/doc\-supfile .
+For example,
+.Pa /usr/share/examples/cvsup/doc-supfile .
.It Va INSTALL
.Pq Vt str
the default install command.
@@ -259,14 +263,18 @@ Set this to not update the doc tree during
.Pq Vt bool
Set this to not update the ports tree during
.Dq Li "make update" .
+.It Va NO_WWWUPDATE
+.Pq Vt bool
+Set this to not update the www tree during
+.Dq Li "make update" .
.It Va PORTSSUPFILE
.Pq Vt str
The ports
.Ar supfile
to use when doing a
.Dq Li "make update" .
-This defaults to
-.Pa /usr/share/examples/cvsup/ports\-supfile .
+For example,
+.Pa /usr/share/examples/cvsup/ports-supfile .
.It Va SUP
.Pq Vt str
The location of the
@@ -281,24 +289,20 @@ The first
.Ar supfile
to use when doing a
.Dq Li "make update" .
-This defaults to
-.Pa /usr/share/examples/cvsup/standard\-supfile .
+For example,
+.Pa /usr/share/examples/cvsup/standard-supfile .
.It Va SUPFILE1
.Pq Vt str
The second
.Ar supfile
to use when doing a
.Dq Li "make update" .
-This defaults to
-.Pa /usr/share/examples/cvsup/secure\-supfile .
.It Va SUPFILE2
.Pq Vt str
The third
.Ar supfile
to use when doing a
.Dq Li "make update" .
-This defaults to
-.Pa /usr/share/examples/cvsup/secure\-supfile .
.It Va SUPFLAGS
.Pq Vt str
The flag for the
@@ -315,16 +319,28 @@ The hostname of the sup server to use when doing
.Pq Vt bool
Set this to use
.Xr cvsup 1
-to update your ports with
+to update your
+.Pa src , ports , doc
+and
+.Pa www
+trees with
+.Dq Li "make update" .
+.It Va SVN_UPDATE
+.Pq Vt bool
+Set this to use
+.Xr svn 1
+to update your
+.Pa src
+tree with
.Dq Li "make update" .
.It Va WWWSUPFILE
.Pq Vt str
The www
.Ar supfile
to use when doing a
-.Dq Li "make update"
-This defaults to
-.Pa /usr/share/examples/cvsup/www\-supfile .
+.Dq Li "make update" .
+For example,
+.Pa /usr/share/examples/cvsup/www-supfile .
.El
.Ss "BUILDING THE KERNEL"
The following list provides a name and short description for variables
@@ -730,6 +746,7 @@ filter, or both.
.Bl -tag -width ".Pa /usr/share/examples/etc/make.conf" -compact
.It Pa /etc/make.conf
.It Pa /usr/doc/Makefile
+.It Pa /usr/ports/Makefile
.It Pa /usr/share/examples/etc/make.conf
.It Pa /usr/share/mk/sys.mk
.It Pa /usr/src/Makefile
diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5
index cf062c5..d7d52c1 100644
--- a/share/man/man5/rc.conf.5
+++ b/share/man/man5/rc.conf.5
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 27, 2011
+.Dd June 19, 2011
.Dt RC.CONF 5
.Os
.Sh NAME
@@ -196,6 +196,14 @@ Configuration file for
.Xr ddb 8 .
Default
.Pa /etc/ddb.conf .
+.It Va kld_list
+.Pq Vt str
+A list of kernel modules to load right after the local
+disks are mounted.
+Loading modules at this point in the boot process is
+much faster than doing it via
+.Pa /boot/loader.conf
+for those modules not necessary for mounting local disk.
.It Va kldxref_enable
.Pq Vt bool
Set to
@@ -4285,6 +4293,61 @@ Bus address of the USB Bluetooth controller.
Check the output of
.Xr usbconfig 8
on your system to find this information.
+.It Va netwait_enable
+.Pq Vt bool
+If set to
+.Dq Li YES ,
+delays the start of network-reliant services until
+.Va netwait_if
+is up and ICMP packets to a destination defined in
+.Va netwait_ip
+are flowing.
+Link state is examined first, followed by
+.Dq Li pinging
+an IP address to verify network usability.
+If no destination can be reached or timeouts are exceeded,
+network services are started anyway with no guarantee that
+the network is usable.
+Use of this variable requires both
+.Va netwait_ip
+and
+.Va netwait_if
+to be set.
+.It Va netwait_ip
+.Pq Vt str
+Empty by default.
+This variable contains a space-delimited list of IP addresses to
+.Xr ping 8 .
+DNS hostnames should not be used as resolution is not guaranteed
+to be functional at this point.
+If multiple IP addresses are specified,
+each will be tried until one is successful or the list is exhausted.
+.It Va netwait_timeout
+.Pq Vt int
+Indicates the total number of seconds to perform a
+.Dq Li ping
+against each IP address in
+.Va netwait_ip ,
+at a rate of one ping per second.
+If any of the pings are successful,
+full network connectivity is considered reliable.
+The default is 60.
+.It Va netwait_if
+.Pq Vt str
+Empty by default.
+Defines the name of the network interface on which watch for link.
+.Xr ifconfig 8
+is used to monitor the interface, looking for
+.Dq Li status: no carrier .
+Once gone, the link is considered up.
+This can be a
+.Xr vlan 4
+interface if desired.
+.It Va netwait_if_timeout
+.Pq Vt int
+Defines the total number of seconds to wait for link to become usable,
+polled at a 1-second interval.
+The default is 30.
.El
.Sh FILES
.Bl -tag -width ".Pa /etc/defaults/rc.conf" -compact
@@ -4356,6 +4419,7 @@ on your system to find this information.
.Xr ntpdate 8 ,
.Xr pfctl 8 ,
.Xr pflogd 8 ,
+.Xr ping 8 ,
.Xr powerd 8 ,
.Xr quotacheck 8 ,
.Xr quotaon 8 ,
diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index f0b9905..544344c 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -1,7 +1,7 @@
.\" DO NOT EDIT-- this file is automatically generated.
.\" from FreeBSD: head/tools/build/options/makeman 221733 2011-05-10 13:01:11Z ru
.\" $FreeBSD$
-.Dd May 22, 2011
+.Dd June 17, 2011
.Dt SRC.CONF 5
.Os
.Sh NAME
@@ -78,11 +78,11 @@ The following list provides a name and short description for variables
that can be used for source builds.
.Bl -tag -width indent
.It Va WITHOUT_ACCT
-.\" from FreeBSD: head/tools/build/options/WITHOUT_ACCT 221540 2011-05-06 19:13:03Z ru
+.\" from FreeBSD: head/tools/build/options/WITHOUT_ACCT 223201 2011-06-17 20:47:44Z ed
Set to not build process accounting tools such as
-.Xr ac 8
+.Xr accton 8
and
-.Xr accton 8 .
+.Xr sa 8 .
.It Va WITHOUT_ACPI
.\" from FreeBSD: head/tools/build/options/WITHOUT_ACPI 156932 2006-03-21 07:50:50Z ru
Set to not build
@@ -225,8 +225,8 @@ Set to not build the boot blocks and loader.
Set to not build the BSD licensed version of cpio based on
.Xr libarchive 3 .
.It Va WITH_BSD_GREP
-.\" from FreeBSD: head/tools/build/options/WITH_BSD_GREP 211701 2010-08-23 10:04:26Z gabor
-Build BSD-licensed grep instead of GNU grep.
+.\" from FreeBSD: head/tools/build/options/WITH_BSD_GREP 222273 2011-05-25 01:04:12Z obrien
+Install BSD-licensed grep as '[ef]grep' instead of GNU grep.
.It Va WITHOUT_BSNMP
.\" from FreeBSD: head/tools/build/options/WITHOUT_BSNMP 183306 2008-09-23 16:15:42Z sam
Set to not build or install
@@ -916,6 +916,17 @@ When set, it also enforces the following options:
.It Va WITHOUT_USB
.\" from FreeBSD: head/tools/build/options/WITHOUT_USB 156932 2006-03-21 07:50:50Z ru
Set to not build USB-related programs and libraries.
+.It Va WITHOUT_UTMPX
+.\" from FreeBSD: head/tools/build/options/WITHOUT_UTMPX 223209 2011-06-17 21:30:21Z ed
+Set to not build user accounting tools such as
+.Xr last 1 ,
+.Xr users 1 ,
+.Xr who 1 ,
+.Xr wtmpcvt 1 ,
+.Xr ac 8 ,
+.Xr lastlogin 8
+and
+.Xr utxrm 8 .
.It Va WITHOUT_WIRELESS
.\" from FreeBSD: head/tools/build/options/WITHOUT_WIRELESS 183242 2008-09-21 22:02:26Z sam
Set to not build programs used for 802.11 wireless networks; especially
diff --git a/share/man/man7/build.7 b/share/man/man7/build.7
index 22305b7..b43a961 100644
--- a/share/man/man7/build.7
+++ b/share/man/man7/build.7
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 18, 2011
+.Dd June 16, 2011
.Dt BUILD 7
.Os
.Sh NAME
@@ -517,6 +517,10 @@ target.
If set, the update process does not update the Ports tree as part of the
.Dq make update
target.
+.It Va NO_WWWUPDATE
+If set, the update process does not update the www tree as part of the
+.Dq make update
+target.
.El
.Pp
Builds under directory
diff --git a/share/man/man8/picobsd.8 b/share/man/man8/picobsd.8
index 21ddb71..e95786d 100644
--- a/share/man/man8/picobsd.8
+++ b/share/man/man8/picobsd.8
@@ -647,7 +647,8 @@ already exists on disk (e.g.\& as a result of a previous update).
.Sh SEE ALSO
.Xr crunchgen 1 ,
.Xr mdconfig 8 ,
-.Xr swapon 8
+.Xr nanobsd 8 ,
+.Xr swapon 8
.Sh AUTHORS
.An -nosplit
.An Andrzej Bialecki Aq abial@FreeBSD.org ,
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index 50edf73..a04cb68 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -296,7 +296,6 @@ MAN= accept_filter.9 \
vm_fault_prefault.9 \
vm_map.9 \
vm_map_check_protection.9 \
- vm_map_clean.9 \
vm_map_create.9 \
vm_map_delete.9 \
vm_map_entry_resize_free.9 \
@@ -314,11 +313,11 @@ MAN= accept_filter.9 \
vm_map_simplify_entry.9 \
vm_map_stack.9 \
vm_map_submap.9 \
+ vm_map_sync.9 \
vm_map_wire.9 \
vm_page_alloc.9 \
vm_page_bits.9 \
vm_page_cache.9 \
- vm_page_copy.9 \
vm_page_deactivate.9 \
vm_page_dontneed.9 \
vm_page_flag.9 \
@@ -328,12 +327,10 @@ MAN= accept_filter.9 \
vm_page_insert.9 \
vm_page_io.9 \
vm_page_lookup.9 \
- vm_page_protect.9 \
vm_page_rename.9 \
vm_page_sleep_if_busy.9 \
vm_page_wakeup.9 \
vm_page_wire.9 \
- vm_page_zero_fill.9 \
vm_set_page_size.9 \
vn_fullpath.9 \
vn_isdisk.9 \
@@ -551,8 +548,10 @@ MLINKS+=config_intrhook.9 config_intrhook_disestablish.9 \
config_intrhook.9 config_intrhook_establish.9
MLINKS+=contigmalloc.9 contigfree.9
MLINKS+=copy.9 copyin.9 \
+ copy.9 copyin_nofault.9 \
copy.9 copyinstr.9 \
copy.9 copyout.9 \
+ copy.9 copyout_nofault.9 \
copy.9 copystr.9
MLINKS+=critical_enter.9 critical.9 \
critical_enter.9 critical_exit.9
@@ -860,6 +859,22 @@ MLINKS+=\
mbuf.9 mtod.9 \
mbuf.9 M_TRAILINGSPACE.9 \
mbuf.9 M_WRITABLE.9
+MLINKS+=\
+ mbuf_tags.9 m_tag_alloc.9 \
+ mbuf_tags.9 m_tag_copy.9 \
+ mbuf_tags.9 m_tag_copy_chain.9 \
+ mbuf_tags.9 m_tag_delete.9 \
+ mbuf_tags.9 m_tag_delete_chain.9 \
+ mbuf_tags.9 m_tag_delete_nonpersistent.9 \
+ mbuf_tags.9 m_tag_find.9 \
+ mbuf_tags.9 m_tag_first.9 \
+ mbuf_tags.9 m_tag_free.9 \
+ mbuf_tags.9 m_tag_get.9 \
+ mbuf_tags.9 m_tag_init.9 \
+ mbuf_tags.9 m_tag_locate.9 \
+ mbuf_tags.9 m_tag_next.9 \
+ mbuf_tags.9 m_tag_prepend.9 \
+ mbuf_tags.9 m_tag_unlink.9
MLINKS+=MD5.9 MD5Init.9 \
MD5.9 MD5Transform.9
MLINKS+=mdchain.9 md_append_record.9 \
@@ -1268,7 +1283,8 @@ MLINKS+=uidinfo.9 uifind.9 \
uidinfo.9 uifree.9 \
uidinfo.9 uihashinit.9 \
uidinfo.9 uihold.9
-MLINKS+=uio.9 uiomove.9
+MLINKS+=uio.9 uiomove.9 \
+ uio.9 uiomove_nofault.9
MLINKS+=usbdi.9 usbd_do_request.9 \
usbdi.9 usbd_do_request_flags.9 \
usbdi.9 usbd_errstr.9 \
diff --git a/share/man/man9/copy.9 b/share/man/man9/copy.9
index b6b975f..37c7a0c 100644
--- a/share/man/man9/copy.9
+++ b/share/man/man9/copy.9
@@ -34,13 +34,15 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 7, 1996
+.Dd July 9, 2011
.Dt COPY 9
.Os
.Sh NAME
.Nm copy ,
.Nm copyin ,
+.Nm copyin_nofault ,
.Nm copyout ,
+.Nm copyout_nofault ,
.Nm copystr ,
.Nm copyinstr
.Nd kernel copy functions
@@ -50,8 +52,12 @@
.Ft int
.Fn copyin "const void *uaddr" "void *kaddr" "size_t len"
.Ft int
+.Fn copyin_nofault "const void *uaddr" "void *kaddr" "size_t len"
+.Ft int
.Fn copyout "const void *kaddr" "void *uaddr" "size_t len"
.Ft int
+.Fn copyout_nofault "const void *kaddr" "void *uaddr" "size_t len"
+.Ft int
.Fn copystr "const void *kfaddr" "void *kdaddr" "size_t len" "size_t *done"
.Ft int
.Fn copyinstr "const void *uaddr" "void *kaddr" "size_t len" "size_t *done"
@@ -67,25 +73,40 @@ All but
copy data from user-space to kernel-space or vice-versa.
.Pp
The
-.Nm
-routines provide the following functionality:
-.Bl -tag -width "copyoutstr()"
-.It Fn copyin
-Copies
+.Fn copyin
+and
+.Fn copyin_nofault
+functions copy
.Fa len
bytes of data from the user-space address
.Fa uaddr
to the kernel-space address
.Fa kaddr .
-.It Fn copyout
-Copies
+.Pp
+The
+.Fn copyout
+and
+.Fn copyout_nofault
+functions copy
.Fa len
bytes of data from the kernel-space address
.Fa kaddr
to the user-space address
.Fa uaddr .
-.It Fn copystr
-Copies a NUL-terminated string, at most
+.Pp
+The
+.Fn copyin_nofault
+and
+.Fn copyout_nofault
+functions require that the kernel-space and user-space data be
+accessible without incurring a page fault.
+The source and destination addresses must be physically mapped for
+read and write access, respectively, and neither the source nor
+destination addresses may be pageable.
+.Pp
+The
+.Fn copystr
+function copies a NUL-terminated string, at most
.Fa len
bytes long, from kernel-space address
.Fa kfaddr
@@ -98,8 +119,10 @@ NUL, is returned in
.Fa done
is
.No non- Ns Dv NULL ) .
-.It Fn copyinstr
-Copies a NUL-terminated string, at most
+.Pp
+The
+.Fn copyinstr
+function copies a NUL-terminated string, at most
.Fa len
bytes long, from user-space address
.Fa uaddr
@@ -121,7 +144,6 @@ is
.\" The number of bytes actually copied, including the terminating
.\" NUL, is returned in
.\" .Fa *done .
-.El
.Sh RETURN VALUES
The
.Nm
@@ -129,7 +151,13 @@ functions return 0 on success or
.Er EFAULT
if a bad address is encountered.
In addition, the
-.Fn copystr ,
+.Fn copyin_nofault
+and
+.Fn copyout_nofault
+functions return
+.Er EFAULT
+if a page fault occurs, and the
+.Fn copystr
and
.Fn copyinstr
.\" .Fn copyinstr ,
diff --git a/share/man/man9/device_get_sysctl.9 b/share/man/man9/device_get_sysctl.9
index 4dcc2ab..d838ac7 100644
--- a/share/man/man9/device_get_sysctl.9
+++ b/share/man/man9/device_get_sysctl.9
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 23, 2006
+.Dd June 18, 2011
.Dt DEVICE_GET_SYSCTL 9
.Os
.Sh NAME
@@ -49,7 +49,7 @@ This node can be accessed with the
.Fn device_get_sysctl_tree
function.
The context for the node can be obtained with the
-.Fn device_get_sysctl_ctl
+.Fn device_get_sysctl_ctx
function.
.Sh SEE ALSO
.Xr device 9
diff --git a/share/man/man9/fail.9 b/share/man/man9/fail.9
index e367eff..0973cea 100644
--- a/share/man/man9/fail.9
+++ b/share/man/man9/fail.9
@@ -116,6 +116,7 @@ The sysctl variable may be set using the following grammar:
( (<float> "%") | (<integer> "*" ) )*
<type>
[ "(" <integer> ")" ]
+ [ "[pid " <integer> "]" ]
<float> ::
<integer> [ "." <integer> ] |
@@ -161,6 +162,10 @@ For the purpose of this operator, the return() and print() operators
are the only types that cascade.
A return() term only cascades if the code executes, and a print()
term only cascades when passed a non-zero argument.
+A pid can optionally be specified.
+The fail point term is only executed when invoked by a process with a
+matching p_pid.
+.Pp
.Sh EXAMPLES
.Bl -tag
.It Sy sysctl debug.fail_point.foobar="2.1%return(5)"
@@ -181,6 +186,8 @@ After that, 1/1000th of the time, return 22.
Return 5 for 1 in 1000 executions, but only 5 times total.
.It Sy sysctl debug.fail_point.foobar="1%*sleep(50)"
1/100th of the time, sleep 50ms.
+.It Sy sysctl debug.fail_point.foobar="1*return(5)[pid 1234]"
+Return 5 once, when pid 1234 executes the fail point.
.El
.Sh AUTHORS
.An -nosplit
diff --git a/share/man/man9/ifnet.9 b/share/man/man9/ifnet.9
index e9dbab5..05264dc 100644
--- a/share/man/man9/ifnet.9
+++ b/share/man/man9/ifnet.9
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 1, 2009
+.Dd July 3, 2011
.Dt IFNET 9
.Os
.Sh NAME
@@ -1169,11 +1169,12 @@ list.
Caller must have appropriate privilege.
(No call-down to driver.)
.It Dv SIOCGIFCAP
+.It Dv SIOCGIFFIB
.It Dv SIOCGIFFLAGS
.It Dv SIOCGIFMETRIC
.It Dv SIOCGIFMTU
.It Dv SIOCGIFPHYS
-Get interface capabilities, flags, metric, MTU, medium selection.
+Get interface capabilities, FIB, flags, metric, MTU, medium selection.
(No call-down to driver.)
.Pp
.It Dv SIOCSIFCAP
@@ -1192,6 +1193,12 @@ and
.Va if_data.ifi_hwassist
appropriately.
.Pp
+.It Dv SIOCSIFFIB
+Sets interface FIB.
+Caller must have appropriate privilege.
+FIB values start at 0 and values greater or equals than
+.Va net.fibs
+are considered invalid.
.It Dv SIOCSIFFLAGS
Change interface flags.
Caller must have appropriate privilege.
diff --git a/share/man/man9/uio.9 b/share/man/man9/uio.9
index fb27c9c..9d569b7 100644
--- a/share/man/man9/uio.9
+++ b/share/man/man9/uio.9
@@ -25,12 +25,13 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 21, 2010
+.Dd July 9, 2011
.Dt UIO 9
.Os
.Sh NAME
.Nm uio ,
-.Nm uiomove
+.Nm uiomove ,
+.Nm uiomove_nofault
.Nd device driver I/O routines
.Sh SYNOPSIS
.In sys/types.h
@@ -48,11 +49,15 @@ struct uio {
.Ed
.Ft int
.Fn uiomove "void *buf" "int howmuch" "struct uio *uiop"
+.Ft int
+.Fn uiomove_nofault "void *buf" "int howmuch" "struct uio *uiop"
.Sh DESCRIPTION
-The function
+The functions
.Fn uiomove
-is used to handle transfer of data between buffers and I/O vectors
-that might possibly also cross the user/kernel space boundary.
+and
+.Fn uiomove_nofault
+are used to transfer data between buffers and I/O vectors that might
+possibly cross the user/kernel space boundary.
.Pp
As a result of any
.Xr read 2 ,
@@ -71,6 +76,8 @@ being passed.
The transfer request is encoded in this structure.
The driver itself should use
.Fn uiomove
+or
+.Fn uiomove_nofault
to get at the data in this structure.
.Pp
The fields in the
@@ -99,7 +106,7 @@ Do not copy, already in object.
.El
.It Va uio_rw
The direction of the desired transfer, either
-.Dv UIO_READ ,
+.Dv UIO_READ
or
.Dv UIO_WRITE .
.It Va uio_td
@@ -110,10 +117,24 @@ for the associated thread; used if
indicates that the transfer is to be made from/to a process's address
space.
.El
+.Pp
+The function
+.Fn uiomove_nofault
+requires that the buffer and I/O vectors be accessible without
+incurring a page fault.
+The source and destination addresses must be physically mapped for
+read and write access, respectively, and neither the source nor
+destination addresses may be pageable.
+Thus, the function
+.Fn uiomove_nofault
+can be called from contexts where acquiring virtual memory system
+locks or sleeping are prohibited.
.Sh RETURN VALUES
On success
.Fn uiomove
-will return 0, on error it will return an appropriate errno.
+and
+.Fn uiomove_nofault
+will return 0; on error they will return an appropriate error code.
.Sh EXAMPLES
The idea is that the driver maintains a private buffer for its data,
and processes the request in chunks of maximal the size of this
@@ -156,6 +177,8 @@ fooread(dev_t dev, struct uio *uio, int flag)
.Ed
.Sh ERRORS
.Fn uiomove
+and
+.Fn uiomove_nofault
will fail and return the following error code if:
.Bl -tag -width Er
.It Bq Er EFAULT
@@ -166,6 +189,14 @@ or
returned
.Er EFAULT
.El
+.Pp
+In addition,
+.Fn uiomove_nofault
+will fail and return the following error code if:
+.Bl -tag -width Er
+.It Bq Er EFAULT
+A page fault occurs.
+.El
.Sh SEE ALSO
.Xr read 2 ,
.Xr readv 2 ,
diff --git a/share/man/man9/vm_map.9 b/share/man/man9/vm_map.9
index 12112cd..f45be0b 100644
--- a/share/man/man9/vm_map.9
+++ b/share/man/man9/vm_map.9
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 26, 2004
+.Dd July 9, 2011
.Dt VM_MAP 9
.Os
.Sh NAME
@@ -223,13 +223,9 @@ a user process's address space:
.Bl -tag -width ".Va max_protection"
.It Va protection
Memory protection bits applied to this region.
-These are identical to those defined for
-.Xr vm_page_protect 9 .
.It Va max_protection
Mask for the memory protection bits which may be actually be applied to
this region.
-These are identical to those defined for
-.Xr vm_page_protect 9 .
.It Va inheritance
Contains flags which specify how this entry should be treated
during fork processing.
@@ -328,7 +324,6 @@ is backed by a
.Sh SEE ALSO
.Xr pmap 9 ,
.Xr vm_map_check_protection 9 ,
-.Xr vm_map_clean 9 ,
.Xr vm_map_create 9 ,
.Xr vm_map_delete 9 ,
.Xr vm_map_entry_resize_free 9 ,
@@ -348,8 +343,8 @@ is backed by a
.Xr vm_map_simplify_entry 9 ,
.Xr vm_map_stack 9 ,
.Xr vm_map_submap 9 ,
-.Xr vm_map_wire 9 ,
-.Xr vm_page_protect 9
+.Xr vm_map_sync 9 ,
+.Xr vm_map_wire 9
.Sh AUTHORS
This manual page was written by
.An Bruce M Simpson Aq bms@spc.org .
diff --git a/share/man/man9/vm_map_clean.9 b/share/man/man9/vm_map_sync.9
index eeea5bc..0ee1219 100644
--- a/share/man/man9/vm_map_clean.9
+++ b/share/man/man9/vm_map_sync.9
@@ -25,24 +25,24 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 19, 2003
-.Dt VM_MAP_CLEAN 9
+.Dd July 9, 2011
+.Dt VM_MAP_SYNC 9
.Os
.Sh NAME
-.Nm vm_map_clean
+.Nm vm_map_sync
.Nd push dirty pages to their pager
.Sh SYNOPSIS
.In sys/param.h
.In vm/vm.h
.In vm/vm_map.h
.Ft int
-.Fo vm_map_clean
+.Fo vm_map_sync
.Fa "vm_map_t map" "vm_offset_t start" "vm_offset_t end" "boolean_t syncio"
.Fa "boolean_t invalidate"
.Fc
.Sh DESCRIPTION
The
-.Fn vm_map_clean
+.Fn vm_map_sync
function forces any dirty cached pages in the range
.Fa start
to
@@ -61,13 +61,9 @@ is TRUE, any cached pages are also freed.
.Pp
The range provided must be contiguous, it MUST NOT contain holes.
The range provided MUST NOT contain any sub-map entries.
-.Sh IMPLEMENTATION NOTES
-This routine holds the
-.Va Giant
-lock to prevent multiple entry.
.Sh RETURN VALUES
The
-.Fn vm_map_clean
+.Fn vm_map_sync
function returns
.Dv KERN_SUCCESS
if successful.
diff --git a/share/man/man9/vm_page_copy.9 b/share/man/man9/vm_page_copy.9
deleted file mode 100644
index 3cf7304..0000000
--- a/share/man/man9/vm_page_copy.9
+++ /dev/null
@@ -1,57 +0,0 @@
-.\"
-.\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice(s), this list of conditions and the following disclaimer as
-.\" the first lines of this file unmodified other than the possible
-.\" addition of one or more copyright notices.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice(s), this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
-.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-.\" DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2001
-.Dt VM_PAGE_COPY 9
-.Os
-.Sh NAME
-.Nm vm_page_copy
-.Nd "copy a page"
-.Sh SYNOPSIS
-.In sys/param.h
-.In vm/vm.h
-.In vm/vm_page.h
-.Ft void
-.Fn vm_page_copy "vm_page_t src_m" "vm_page_t dst_m"
-.Sh DESCRIPTION
-The
-.Fn vm_page_copy
-function copies the contents of
-.Fa src_m
-into
-.Fa dst_m .
-.Pp
-The entire contents of
-.Fa dst_m
-are marked as valid.
-.Pp
-The actual copy is performed by
-.Fn pmap_copy_page .
-.Sh AUTHORS
-This manual page was written by
-.An Chad David Aq davidc@acns.ab.ca .
diff --git a/share/man/man9/vm_page_protect.9 b/share/man/man9/vm_page_protect.9
deleted file mode 100644
index 8b4911d..0000000
--- a/share/man/man9/vm_page_protect.9
+++ /dev/null
@@ -1,75 +0,0 @@
-.\"
-.\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice(s), this list of conditions and the following disclaimer as
-.\" the first lines of this file unmodified other than the possible
-.\" addition of one or more copyright notices.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice(s), this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
-.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-.\" DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 14, 2001
-.Dt VM_PAGE_PROTECT 9
-.Os
-.Sh NAME
-.Nm vm_page_protect
-.Nd "lower a page's protection"
-.Sh SYNOPSIS
-.In sys/param.h
-.In vm/vm.h
-.In vm/vm_page.h
-.Ft void
-.Fn vm_page_protect "vm_page_t mem" "int prot"
-.Sh DESCRIPTION
-The
-.Fn vm_page_protect
-function lowers a page's protection.
-The protection is never raised by this function; therefore, if the page is
-already at
-.Dv VM_PROT_NONE ,
-the function does nothing.
-.Pp
-Its arguments are:
-.Bl -tag -width ".Fa prot"
-.It Fa mem
-The page whose protection is lowered.
-.It Fa prot
-The protection the page should be reduced to.
-If
-.Dv VM_PROT_NONE
-is specified, then the
-.Dv PG_WRITABLE
-and
-.Dv PG_MAPPED
-flags are cleared and the pmap_page's protection is set to
-.Dv VM_PROT_NONE .
-If
-.Dv VM_PROT_READ
-is specified, then the
-.Dv PG_WRITABLE
-flag is cleared and the pmap_page's protection is set to
-.Dv VM_PROT_READ .
-.El
-.Pp
-Higher protection requests are ignored.
-.Sh AUTHORS
-This manual page was written by
-.An Chad David Aq davidc@acns.ab.ca .
diff --git a/share/man/man9/vm_page_zero_fill.9 b/share/man/man9/vm_page_zero_fill.9
deleted file mode 100644
index 2adb301..0000000
--- a/share/man/man9/vm_page_zero_fill.9
+++ /dev/null
@@ -1,53 +0,0 @@
-.\"
-.\" Copyright (C) 2001 Chad David <davidc@acns.ab.ca>. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice(s), this list of conditions and the following disclaimer as
-.\" the first lines of this file unmodified other than the possible
-.\" addition of one or more copyright notices.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice(s), this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
-.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
-.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-.\" DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 17, 2001
-.Dt VM_PAGE_ZERO_FILL 9
-.Os
-.Sh NAME
-.Nm vm_page_zero_fill
-.Nd "zero fill a page"
-.Sh SYNOPSIS
-.In sys/param.h
-.In vm/vm.h
-.In vm/vm_page.h
-.Ft boolean_t
-.Fn vm_page_zero_fill "vm_page_t m"
-.Sh DESCRIPTION
-The
-.Fn vm_page_zero_fill
-function zeros the given vm page by calling the machine dependent
-.Fn pmap_zero_page
-routine.
-.Pp
-.Fn vm_page_zero_fill
-always returns
-.Dv TRUE .
-.Sh AUTHORS
-This manual page was written by
-.An Chad David Aq davidc@acns.ab.ca .
diff --git a/share/misc/committers-ports.dot b/share/misc/committers-ports.dot
index 712590c..602ab3b 100644
--- a/share/misc/committers-ports.dot
+++ b/share/misc/committers-ports.dot
@@ -183,6 +183,7 @@ wen [label="Wen Heping\nwen@FreeBSD.org\n2010/12/13"]
wxs [label="Wesley Shields\nwxs@FreeBSD.org\n2008/01/03"]
xride [label="Soeren Straarup\nxride@FreeBSD.org\n2006/09/27"]
yzlin [label="Yi-Jheng Lin\nyzlin@FreeBSD.org\n2009/07/19"]
+zi [label="Ryan Steinmetz\nzi@FreeBSD.org\n2011/07/14"]
znerd [label="Ernst de Haan\nznerd@FreeBSD.org\n2001/11/15"]
# Here are the mentor/mentee relationships.
@@ -413,6 +414,7 @@ tabthorpe -> jadawin
tabthorpe -> jlaffaye
tabthorpe -> pgj
tabthorpe -> rene
+tabthorpe -> zi
thierry -> jadawin
@@ -428,5 +430,6 @@ wxs -> jsa
wxs -> sahil
wxs -> skreuzer
wxs -> swills
+wxs -> zi
}
diff --git a/share/misc/iso3166 b/share/misc/iso3166
index d8d5972..23c9bd6 100644
--- a/share/misc/iso3166
+++ b/share/misc/iso3166
@@ -176,7 +176,6 @@ NA NAM 516 Namibia
NR NRU 520 Nauru
NP NPL 524 Nepal
NL NLD 528 Netherlands
-AN ANT 530 Netherlands Antilles
NC NCL 540 New Caledonia
NZ NZL 554 New Zealand
NI NIC 558 Nicaragua
diff --git a/share/misc/pci_vendors b/share/misc/pci_vendors
index 75420e4..b1ebcd1 100644
--- a/share/misc/pci_vendors
+++ b/share/misc/pci_vendors
@@ -1,11103 +1,20099 @@
-; $FreeBSD$
-;
-; Automatically generated by src/tools/tools/pciid/mk_pci_vendors.pl
-; (with the -l option), using the following source lists:
-;
-; http://www.pcidatabase.com/reports.php?type=csv
-; http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
-;
-; Manual edits on this file will be lost!
-;
-0000 Gammagraphx Inc
-001A Ascend Communications Inc
-0033 Paradyne Corp
-003D Real 3D (Was: Lockheed Martin-Marietta Corp)
- 00D1 i740 PCI Graphics Accelerator
-0070 Hauppauge Computer Works Inc.
- 4000 WinTV PVR-350
- 4001 WinTV PVR-250 (v1)
- 4009 WinTV PVR-250
- 4801 WinTV PVR-250 MCE
- 6800 Hauppage Nova -TD-500 DVB-T Tuner Device ( PCIVEN_1131&DEV_7130&SUBSYS_40510000&REV_014&3B)
-0071 Nebula Electronics Ltd
-0100 Ncipher Corp Ltd
-0123 General Dynamics
-0246 Addtron(??)
-0315 SK - Electronics Co Ltd
-0357 TTTech AG
- 000A TTP-Monitoring Card V2.0
-0403 Future Technology Devices International Ltd
-0432 SCM Microsystems Inc
- 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]
-045E Microsoft
- 006E MN-510 802.11b wireless USB paddle
- 00C2 MN-710 wireless USB paddle
-0482 Kyocera
-04CF Myson Century Inc
- 8818 CS8818 USB2.0-to-ATAPI Bridge Controller with Embedded PHY
-050D Belkin
- 001A FSD7000 802.11g PCI Wireless card
- 0109 F5U409-CU USB/Serial Portable Adapter
- 7050 F5D7050 802.11g Wireless USB Adapter
- 705C F5D7050 v4
-05A9 OmniVision
- 8519 OV519 series
-05E3 CyberDoor
- 0701 CBD516
-064E SUYIN Corporation
- A101 Acer Crystal Eye Webcam (suYin)
- A103 WebCam (SuYin)
- D101 Web Cam (SuYin)
-066F Sigmatel Inc
- 3410 SMTP3410
- 3500 SMTP3500
-0675 Dynalink
- 1700 IS64PH ISDN Adapter
- 1702 IS64PH ISDN Adapter
- 1703 ISDN Adapter (PCI Bus, DV, W)
- 1704 ISDN Adapter (PCI Bus, D, C)
-067B Prolific Technology Inc
- 2303 PL-2303 USB-to-Serial Converter
- 2305 USB-to-Printer Bridge Controller (PL-2305)
- 2393 prolific (prolific)
- 3507 PL-3507 Hi-Speed USB & IEEE 1394 Combo to IDE Bridge Controller
-069D Hughes Network Systems (HNS)
-0700 Stream Machine
-0721 Sapphire Inc
-07CA AVerMedia Technologies Inc
- B808 AVerTV DVB-T Volar (USB 2.0)
-0815 LinTech GmbH
- 0002 ELKA SO-PCI
-0871 Berkom
- FFA1 A1T HCF-PCI Card
- FFA2 T-Concept HCF-PCI Card
- FFA4 A4T
- FFA8 Scitel Quadro
-09C1 Arris
- 0704 CM 200E Cable Modem
-0A5C Broadcom Corporation
- 0201 Broadcom USB iLine10(tm) Network Adapter (Broadcom NetXtreme BCM5782 Gigabie Ethernet Contro)
- 2000 Broadcom Bluetooth Firmware Upgrade Device
- 2009 Broadcom Bluetooth Controller
- 200A Broadcom Bluetooth Controller
- 200F Broadcom Bluetooth Controller
- 201D BROADCOM Bluetooth Device
- 201E IBM Integrated Bluetooth IV
- 2020 Broadcom Bluetooth Dongle
- 2021 BCM2035B3 ROM Adapter Generic
- 2033 Broadcom Blutonium Device Firmware Downloader
- 2035 BCM2035 Bluetooth
- 2038 Broadcom Blutonium Device Firmware Downloader (BCM2038)
- 2039 BROADCOM Bluetooth Device
- 2045 Broadcom Bluetooth Controller
- 2046 Broadcom USB Bluetooth Device ( 5738z)
- 2047 Broadcom USB Bluetooth Device
- 205E Broadcom Bluetooth Firmware Upgrade Device
- 2100 Broadcom Bluetooth 2.0+eDR USB dongle (BT 50)
- 2101 Broadcom Bluetooth 2.0+EDR USB dongle ( 5&11BBCF3F&0&2)
- 2102 ANYCOM Blue USB-200/250 ( USBVID_04B4&PID_21025&38CD4C16&0&6)
- 2110 Broadcom Bluetooth Controller
- 2111 ANYCOM Blue USB-UHE 200/250
- 2120 Broadcom 2045 Bluetooth 2.0 USB-UHE Device with trace filter ( 2045)
- 2121 Broadcom 2045 Bluetooth 2.0 USB Device with trace filter
- 2122 Broadcom Bluetooth 2.0+EDR USB dongle ( BCM92045B3)
- 2124 2045B3ROM Bluetooth Dongle
- 2130 Broadcom 2045 Bluetooth 2.0 USB-UHE Device with trace filter
- 2131 Broadcom 2045 Bluetooth 2.0 USB Device with trace filter
- 2140 2046 Flash UHE Class 2
- 2141 2046 Flash non UHE Class 2
- 2142 2046 Flash non UHE Class 1
- 2143 2046 Flash non UHE Class 1
- 2144 2046 Flash non UHE module Class 2
- 2145 Broadcom BCM9204MD LENO Module
- 2146 Broadcom 2045 Bluetooth 2.1 USB UHE Dongle
- 2147 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 2148 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2149 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 214A Broadcom 2046 Bluetooth 2.1 USB Module
- 214B Broadcom 2046 Bluetooth 2.1 USB Module
- 214C Broadcom 2046 Bluetooth 2.1 USB Module
- 214D Broadcom Bluetooth 2.1 UHE Module
- 214E Thinkpad Bluetooth with Enhanced Data Rate II
- 214F Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2150 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 2151 Broadcom 2046 Bluetooth 2.1 USB Dongle
- 2152 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2153 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2154 Broadcom 2046 Bluetooth 2.1 USB UHE Dongle
- 2155 Broadcom Bluetooth USB Dongle
- 2157 BCM2046 B1 USB 500
- 2158 Broadcom 2046 Bluetooth 2.1 Device
- 4500 Broadcom 2046 Bluetooth 2.1 USB Dongle (BCM2046B1)
- 4502 Broadcom 2046 Bluetooth 2.1 USB Dongle (BCM2046B1)
- 4503 Broadcom 2046 Bluetooth 2.1 USB Dongle ( BCM2046B1)
- 5800 Unified Security Hub
- 6300 Pirelli ISB Remote NDIS Device
-0A89 BREA Technologies Inc
-0B0B Rhino Equiment Corp.
- 0105 Rhino R1T1
- 0205 Rhino R4FXO
- 0206 RCB4FXO 4-channel FXO analog telphony card
- 0305 Rhino R4T1
- 0405 Rhino R8FXX
- 0406 RCB8FXX 8-channel modular analog telphony card
- 0505 Rhino R24FXX
- 0506 RCB24FXS 24-Channel FXS analog telphony card
- 0605 Rhino R2T1
- 0705 Rhino R24FXS
- 0706 RCB24FXO 24-Channel FXO analog telphony card
- 0905 R1T3 Single T3 Digital Telephony Card
- 0906 RCB24FXX 24-channel modular analog telphony card
- 0A06 RCB672FXX 672-channel modular analog telphony card
-0B49 ASCII Corporation
- 064F Trance Vibrator
-0C45 Microdia Ltd.
- 602D USB Webcam (7&2BE7B8E3&0&4)
- 6130 USB CAMERA (5&3512B308&0&1)
-0E11 Compaq Computer Corp (Now owned by Hewlett-Packard)
- 0001 PCI to EISA Bridge
- 0002 PCI to ISA Bridge (ISA Bridge)
- 000F StorageWorks Library Adapter (HVD) (CPQB1A9)
- 0012 686P7 (686P7)
- 0046 Smart Array 6400 Controller (N/A)
- 0049 Gigabit Upgrade Module (NC7132)
- 004A Gigabit Server Adapter (NC6136)
- 005A HP Remote Insight Lights-Out II Board (PowerPC 405GP processor at 200MHz [3305103C])
- 007C NC7770 1000BaseTX
- 007D NC6770 1000BaseTX
- 0085 NC7780 1000BaseTX
- 00B1 HP Remote Insight Lights-Out II PCI Device (3305103C)
- 00BB NC7760
- 00C0 AIC-7899G 64-bit, 66MHz Dual Channel Wide Ultra3 SCSI Controller
- 00CA NC7771
- 00CB NC7781
- 00CF NC7772
- 00D0 NC7782
- 00D1 NC7783
- 00E3 NC7761
- 0508 PCI UTP/STP Controller (Neteligent 4/16 TR)
- 1000 Pentium Bridge (Triflex Model 1000)
- 2000 Pentium Bridge (Triflex Model 2000)
- 3032 GUI Accelerator (QVision 1280/p v0)
- 3033 GUI Accelerator (QVision 1280/p v1)
- 3034 GUI Accelerator (QVision 1280/p v2)
- 4000 Pentium Bridge (Triflex Model 4000)
- 4030 SMART-2/P
- 4031 SMART-2SL
- 4032 Smart Array 3200
- 4033 Smart Array 3100ES
- 4034 Smart Array 221
- 4040 Integrated Array
- 4048 Compaq Raid LC2
- 4050 Smart Array 4200
- 4051 Smart Array 4250ES
- 4058 Smart Array 431
- 4070 Smart Array 5300
- 4080 Smart Array 5i
- 4082 Smart Array 532
- 4083 Smart Array 5312
- 4091 Smart Array 6i
- 409A Smart Array 641
- 409B Smart Array 642
- 409C Smart Array 6400
- 409D Smart Array 6400 EM
- 6010 HotPlug PCI Bridge (Model 6010)
- 7020 USB Controller
- A0EC Original Compaq fibre Channel HBA
- A0F0 Advanced System Management Controller
- A0F3 Triflex PCI to ISA PnP Bridge
- A0F7 PCI Hot Plug Controller
- A0F8 USB Open Host Controller (ZFMicro)
- A0FC HPFC-5166A Tachyon TL 64-bit/66MHz Fibre Channel Adapter
- AE10 Smart-2 Array Controller
- AE29 PCI to ISA Bridge (MIS-L)
- AE2A CPU to PCI Bridge (MPC)
- AE2B PCI to ISA PnP Bridge (MIS-E)
- AE31 System Management Controller (1002&DEV-5653&SUBSYS)
- AE32 Netelligent 10/100 TX PCI UTP TLAN 2.3 (950)
- AE33 Dual EIDE Controller (Triflex)
- AE34 Netelligent 10 T PCI UTP TLAN 2.3
- AE35 Integrated NetFlex-3/P TLAN 2.3
- AE40 Dual-port Netelligent 10/100 TX PCI TLAN 3.03
- AE43 Integrated Netelligent 10/100 TX PCI TLAN 2.3
- AE69 PCI to ISA Bridge (CETUS-L)
- AE6C PCI Bridge (DRACO)
- AE6D CPU to PCI Bridge (NorthStar)
- B011 Dual-port Netelligent 10/100 TX
- B012 UTP/Coax PCI (Netelligent 10 T/2)
- B01E Fast Ethernet NIC (NC3120)
- B01F Fast Ethernet NIC (NC3122)
- B02F Ethernet NIC (NC1120)
- B030 10/100TX Embedded UTP/Coax Controller (Netelligent WS 1500)
- B04A 10/100TX WOL UTP Controller (699209-003)
- B060 CISS SMART2 Array Controller
- B0C6 NC3161 Fast Ethernet Embedded Controller with WOL
- B0C7 Fast Ethernet NIC (NC3160)
- B0D7 Fast Ethernet NIC (NC3121 rev. A & B)
- B0DD Fast Ethernet NIC (NC3131)
- B0DE NC3132 Fast Ethernet Module
- B0DF Gigabit Module (NC6132)
- B0E0 Gigabit Module (NC6133)
- B0E1 Fast Ethernet Module (NC3133)
- B123 Gigabit NIC (NC6134)
- B134 Fast Ethernet NIC (NC3163)
- B13C Fast Ethernet NIC (NC3162)
- B144 Fast Ethernet NIC (NC3123)
- B163 Fast Ethernet NIC (NC3134)
- B164 Fast Ethernet Upgrade Module (NC3135)
- B178 SMART2 Array Controller (CISSB)
- B196 Conexant SoftK56 Modem (0230)
- B1A4 Gigabit Server Adapter (NC7131)
- B200 Memory Hot-Plug Controller
- B203 Integrated Lights Out Processor (iLo)
- B204 Integrated Lights Out Processor (iLo)
- F095 HP StorageWorks 2 Gb, 64-Bit/66-MHz PCI-to-Fibre Channel Host Bus Adapter for Windows 2000, Windows (FCA2101)
- F130 ThunderLAN 1.0 NetFlex-3/P
- F150 ThunderLAN 2.3 NetFlex-3/P with BNC
- F700 LP7000 Compaq/Emulex Fibre Channel HBA
- F800 LP8000 64-bit Compaq/Emulex Fibre Channel HBA
-0E55 HaSoTec GmbH
-1000 LSI Logic (Was: Symbios Logic, NCR)
- 0001 LSI53C810/A/AE PCI-SCSI I/O Processor
- 0002 53C820 820 Fast-Wide-SCSI Adapter
- 0003 LSI53C825/A/AE PCI to SCSI I/O Processor (Fast Wide)
- 0004 SCSI raid controllers (53C815)
- 0005 53C810AP,810ASP, 2081X Fast/Ultra/Wide SCSI Adapter
- 0006 PCI to Ultra SCSI I/O Processor (LSI53C860/860E)
- 000A LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)
- 000B LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller
- 000C LSI53C895 PCI to Ultra2 SCSI I/O Processor with LVD Link
- 000D Ultra Wide SCSI, Ethernet (53C885)
- 000F LSI53C875/E,LSI53C876/E PCI to Ultra SCSI I/O Processor
- 0010 LSI53C1510 I2O-Ready PCI RAID Ultra2 SCSI Controller (Intelligent mode)
- 0012 PCI to Ultra2 SCSI Controller (LSI53C895A)
- 0013 PCI to Ultra SCSI Controller (LSI53C875A)
- 0020 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Multifunction Controller
- 0021 PCI to Ultra160 SCSI Controller (LSI53C1000/1000R/1010R/1010-66)
- 0030 PCI-X to Ultra320 SCSI Controller (LSI53C1020/1030)
- 0031 PCI-X SCSI Controller (LSI53C1030ZC)
- 0032 PCI-X to Ultra320 SCSI Controller (LSI53C1035)
- 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
- 0035 PCI-X SCSI Controller (LSI53C1035)
- 0040 LSI53C1035 LSI53C1035 PCI-X to Ultra320 SCSI Controller (RAID mode)
- 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
- 0050 SAS 3000 series, 4-port with 1064 -StorPort
- 0054 SAS 3000 series, 8-port with 1068 -StorPort
- 0055 SAS1068 PCI-X Fusion-MPT SAS
- 0056 SAS 3000 series, 4-port with 1064E -StorPort
- 0057 M1064E MegaRAID SAS
- 0058 SAS 3000 series, 8-port with 1068E -StorPort
- 005A SAS 3000 series, 6-port with 1066E -StorPort
- 005C SAS1064A PCI-X Fusion-MPT SAS
- 005E SAS 3000 series, 6-port with 1066 -StorPort
- 0060 SAS1078 PCI-X Fusion-MPT SAS
- 0062 PCI-Express Fusion-MPT SAS (LSISAS1078)
- 008F LSI 53C8xx SCSI host adapter chip (53C810)
- 0407 MegaRAID
- 0408 MegaRAID
- 0409 MegaRAID Family RAID Controller
- 0411 MegaRAID Family RAID Controller
- 0413 MegaRAID SAS Verde ZCR
- 0621 Fibre Channel I/O Processor (LSIFC909)
- 0622 Dial Channel Fibre Channel I/O Processor (LSIFC929)
- 0623 Dual Channel Fibre Channel I/O Processor (LSIFC929)
- 0624 LSIFC919 Single Channel Fibre Channel I/O Processor
- 0625 LSIFC919 Single Channel Fibre Channel I/O Processor
- 0626 LSIFC929X Dual Channel Fibre Channel I/O Processor
- 0627 LSIFC929X Dual Channel Fibre Channel I/O Processor
- 0628 LSIFC919X Single Channel Fibre Channel I/O Processor
- 0629 LSIFC919X Single Channel Fibre Channel I/O Processor
- 0630 Fibre Channel I/O Processor (LSIFC920)
- 0640 Fibre Channel Adapter (LSIFC949X)
- 0642 Fibre Channel Adapter (LSIFC939X)
- 0646 Fibre Channel Adapter (LSIFC949ES)
- 0701 53C885 NT50 DigitalScape Fast Ethernet Adapter
- 0702 Gigabit Ethernet Controller (Yellowfin G-NIC)
- 0804 SA2010
- 0805 SA2010ZC
- 0806 SA2020
- 0807 SA2020ZC
- 0901 USB Controller (61C102)
- 1000 Fast SCSI Controller (63C815)
- 1001 Symbios Ultra2 SCSI controller (53C895)
- 1010 Single channel SCSI controller (LSI 53C102000)
- 1960 MegaRAID
-1001 Kolter Electronic - Germany
- 0010 PCI1616 Measurement Card with 32 digital I/O lines
- 0011 OPTO-PCI, 16 IN / 16 OUT 24 VDC (ispLSI1032E)
- 0012 PCI-AD, PCI-ADDA analog I/O-card (ispLSI1032E)
- 0013 PCI-OptoRel, PCI-Relais 16 Relais & Opto (ispLSI1032E)
- 0014 Timer, Pulse & Counter-card 16..32 bit (ispLSI1032E)
- 0015 PCI-DAC416, 4 channel D/A16bit precision (ispLSI1032E)
- 0016 PCI-MFB high-speed analog I/O (ispLSI1032E)
- 0017 PROTO-3 PCI, digital I/O with chipselect (ispLSI1032E)
- 0020 Universal digital I/O PCI-Interface (ispLSI1032E)
-1002 ATI Technologies Inc. / Advanced Micro Devices, Inc.
- 0B12 ATI Radeon X1900 (R580)
- 1002 0F2A1787 (0F2A1787)
- 3150 ATI MOBILITY /ATI RADEON X600 (M24)
- 3151 ATI FireMV 2400 (RV380)
- 3152 ATI MOBILITY /ATI RADEON X300 (M24)
- 3154 ATI MOBILITY FireGL V3200 (M24GL)
- 3171 ATI FireMV 2400 Secondary (RV380)
- 3E50 ATI RADEON X600/X550 Series (RV380)
- 3E54 ATI FireGL V3200 (RV380GL)
- 3E70 ATI RADEON X600/X550 Series Secondary (RV380)
- 3E74 ATI FireGL V3200 Secondary (RV380GL)
- 4136 Radeon IGP 320 (A3)
- 4137 Radeon IGP 340 (RS200)
- 4144 Radeon 9500 Series (R300)
- 4145 Radeon 9200 (M+X) (R300)
- 4146 ATI RADEON 9600TX (R300)
- 4147 Fire GL Z1 AGP/Pro Video Accelerator (128 MB, 4P)
- 4148 ATI RADEON 9800 SE (R350)
- 4149 ATI RADEON 9500 (R350)
- 414A Radeon 9800 Family
- 414B Fire GL X2
- 4150 ATI RADEON 9600 Series (RV350)
- 4151 ATI RADEON 9600 Series (RV350)
- 4152 ATI RADEON 9600 Series (RV360)
- 4153 ATI RADEON 9550/X1050 Series (RV350)
- 4154 ATI FireGL T2 (RV350GL)
- 4155 ATI RADEON 9600 Series (RV350)
- 4156 Fire GL T2
- 4157 Fire GL T2
- 4158 Mach32 (68800AX)
- 4164 Radeon 9500 Series (R300) - Secondary
- 4165 Radeon 9700 Pro (R300 AE) - Secondary
- 4166 ATI RADEON 9600TX Secondary (R300)
- 4167 Fire GL Z1 AGP/Pro Secondary Video Accelerator (128 MB, 4P)
- 4168 ATI RADEON 9800 SE Secondary (R350)
- 4169 ATI RADEON 9500 Secondary (R350)
- 4170 ATI RADEON 9600 Series Secondary (RV350)
- 4171 ATI RADEON 9600 Series Secondary (RV350)
- 4172 ATI RADEON 9600 Series Secondary (RV360)
- 4173 ATI RADEON 9550/X1050 Series Secondary (RV350)
- 4174 ATI FireGL T2 Secondary (RV350GL)
- 4175 ATI RADEON 9600 Series Secondary (RV350)
- 4237 Radeon 7000 IGP
- 4242 All-In-Wonder 8500DV (R200AIW)
- 4243 Radeon 8500 DV OHCI FireWire Controller
- 4336 Radeon IGP 320M (rs200)
- 4337 Mobility M6 (U2) (RS200M)
- 4341 AC'97 Audio Controller (SB200)
- 4342 PCI-PCI Bridge (SB200)
- 4345 EHCI USB Controller (SB200)
- 4347 OHCI USB Controller *1
- 4348 OHCI USB Controller *2
- 4349 PATA-100 IDE Controller (SB200)
- 434C PCI-ISA Bridge (SB200)
- 434D AC'97 Modem Controller (SB200)
- 4353 IXP SB200 SMBUS Controller
- 4354 Mach64 CT (215CT222)
- 4358 Mach64 CX (210888CX)
- 4361 AC'97 Audio Controller
- 4363 IXP SB300 SMBUS Controller
- 4369 PATA 133 Controller (IXP 3xx)
- 436D IXP SB300 AC'97 Modem Controller
- 436E IXP SB300 Serial ATA Controller
- 4370 IXP SB400 AC'97 Audio Controller
- 4371 IXP SB400 PCI-PCI Bridge
- 4372 ATI SMBus (x200)
- 4373 IXP SB400 EHCI USB 2.0 Controller
- 4374 IXP SB400 OHCI USB Controller
- 4375 IXP SB400 OHCI USB Controller
- 4376 PATA 133 Controller (SB4xx)
- 4377 IXP SB400 PCI-ISA Bridge
- 4378 IXP SB400 AC'97 Modem Controller
- 4379 IXP SB400 Serial ATA Controller
- 437A IXP SB400 Serial ATA Controller
- 437B IXP SB450 High Definition Audio Controller
- 4380 IXP SB600 Serial ATA Controller
- 4381 IXP SB600 Serial ATA RAID Controller
- 4382 IXP SB600 AC'97 Audio Controller
- 4383 IXP SB600 High Definition Audio Controller
- 4384 IXP SB600 PCI to PCI Bridge
- 4385 ATI SMBus (ATI RD600/RS600)
- 4386 IXP SB600 USB Controller (EHCI)
- 4387 IXP SB600 USB Controller (OHCI0)
- 4388 IXP SB600 USB Controller (OHCI1)
- 4389 IXP SB600 USB Controller (OHCI2)
- 438A IXP SB600 USB Controller (OHCI3)
- 438B IXP SB600 USB Controller (OHCI4)
- 438C ATI RD600/RS600 IDE Controller (RD600/RS600)
- 438D IXP SB600 PCI to LPC Bridge
- 438E IXP SB600 AC'97 Modem Controller
- 4390 Integrated SATA II Controller (SB700)
- 4391 SB700 SATA Controller [AHCI mode]
- 4392 SB700 SATA Controller [Non-RAID5 mode]
- 4393 SB700 SATA Controller [RAID5 mode]
- 4394 SB700 SATA Controller [SATA and FC Enabled]
- 4395 SB SATA Controller [AHCI mode with HyperFlash-PCIE]
- 4396 SB700 USB EHCI Controller
- 4397 SB700 USB OHCI0 Controller
- 4398 Standard OpenHCD USB-Hostcontroller (SB700)
- 4399 SB700 USB OHCI2 Controller
- 439C PATA 133 Controller (SB7xx)
- 439D SB700 LPC host controller
- 4437 Radeon Mobility 7000 IGP
- 4554 Mach64 ET
- 4654 113--34004-104 (Mach64 VT)
- 4742 3D Rage Pro AGP 1X/2X ((GT-C2U2))
- 4744 Rage 3D Pro AGP 2x (Rage 3D Pro AGP 2x)
- 4747 Rage 3D Pro (GT-C2U2)
- 4749 ATI ALL IN WONDER PRO (8MB) (RAGE PRO TURBO AGP 2X)
- 474C k7 som+ (Rage XC PCI-66)
- 474D SLAT (Rage XL AGP 2x)
- 474E Rage XC AGP 2x
- 474F I Need Driver for the Chip (Rage XL PCI-66)
- 4750 ATI 3D Rage Pro 215GP (ATI 3D Rage Pro 215GP)
- 4751 Rage 3D Pro PCI (PQFP Package, Limited 3D)
- 4752 ATI On-Board VGA for HP Proliant 350 G3 (Rage XL PCI)
- 4753 Rage XC PCI
- 4754 Rage 3D II Graphics Accelerator (Mach 64 VT)
- 4755 3d rage 2 + dvd (Rage 3D II+pci)
- 4756 Rage 3D IIC PCI [Mach64 GT IIC] (PQFP Package)
- 4757 Rage 3D IIC AGP (BGA Package)
- 4758 Mach64 GX (210888GX)
- 4759 m3d agp card on agp slot (215r2qzua21)
- 475A Rage 3D IIC AGP (PQFP Package)
- 4964 Radeon 9000 Series (RV250 Id)
- 4965 Radeon 9000 Series (RV250 Ie)
- 4966 Radeon 9000/9000 Pro (RV250)
- 4967 Radeon 9000 (RV250)
- 496E Radeon 9000/9000 Pro - Secondary (RV250)
- 496F Radeon 9000 (RV250) - Secondary
- 4A48 ATI RADEON X800 Series (R420)
- 4A49 ATI RADEON X800 PRO (R420)
- 4A4A ATI RADEON X800 Series (R420)
- 4A4B ATI RADEON X800 XT (R420)
- 4A4C ATI RADEON X800 Series (R420)
- 4A4D ATI FireGL X3-256 (R420GL)
- 4A4E ATI MOBILITY /ATI RADEON 9800 (M18)
- 4A4F ATI RADEON X800 SE (R420)
- 4A50 ATI RADEON X800 XT Platinum Edition (R420)
- 4A54 ATI RADEON X800 VE (R420)
- 4A68 ATI RADEON X800 Series Secondary (R420)
- 4A69 ATI RADEON X800 PRO Secondary (R420)
- 4A6A ATI RADEON X800 Series Secondary (R420)
- 4A6B ATI RADEON X800 XT Secondary (R420)
- 4A6C ATI RADEON X800 Series Secondary (R420)
- 4A6D ATI FireGL X3-256 Secondary (R420GL)
- 4A6F ATI RADEON X800 SE Secondary (R420)
- 4A70 ATI RADEON X800 XT Platinum Edition Secondary (R420)
- 4A74 ATI RADEON X800 VE Secondary (R420)
- 4B49 ATI RADEON X850 XT (R481)
- 4B4A Radeon X850 SE
- 4B4B ATI RADEON X850 PRO (R481)
- 4B4C ATI RADEON X850 XT Platinum Edition (R481)
- 4B69 ATI RADEON X850 XT Secondary (R481)
- 4B6A ATI RADEON X850 SE Secondary (R481)
- 4B6B ATI RADEON X850 PRO Secondary (R481)
- 4B6C ATI RADEON X850 XT Platinum Edition Secondary (R481)
- 4C42 Rage 3D LT Pro AGP 133MHz (BGA-312 Package)
- 4C44 Rage 3D LT Pro AGP 133 MHz (Rage 3D LT Pro AGP)
- 4C45 Rage Mobility M3 AGP
- 4C46 0x4c46 (Mobility M3 AGP)
- 4C47 Rage 3D LT-G (ati rage pro)
- 4C49 Rage 3D LT Pro PCI (BGA-312 Package)
- 4C4D Rage P/M Mobility AGP 2x (01541014)
- 4C4E Rage Mobility l (216lo sasa25)
- 4C50 Rage 3D LT Pro PCI (BGA-256 Package)
- 4C51 Rage 3D LT Pro PCI (BGA-256 Package, Limited 3D)
- 4C52 Rage P/M Mobility PCI
- 4C53 Rage L Mobility PCI (216L0SASA25)
- 4C54 Mach64 LT (264LT)
- 4C57 Mobility Radeon 7500 (M7 [LW])
- 4C58 FireGL Mobility
- 4C59 Radeon Mobility M6 Series (Mobility 6)
- 4C5A Radeon Mobility M6 LZ
- 4C64 Radeon Mobility M9-GL
- 4C65 Radeon Mobility 9000 (R250 Le)
- 4C66 MOBILITY RADEON 9000 (M9) (R250)
- 4C67 Radeon Mobility 9000 (R250 Lg)
- 4C6E Radeon Mobility 9000 - Secondary (R250 Ln)
- 4D46 Rage Mobility 128 AGP 4x (ATI mobility128)
- 4D4C Rage Mobility 128 AGP (216l0sasa25)
- 4D50 Unified AVStream Driver
- 4D51 Unified AVStream Driver
- 4D52 ATI Theater 550 Pro (ATI Theater 550 Pro)
- 4D53 Unified AVStream Driver
- 4E44 Radeon 9700/Pro, 9500 Series (R300)
- 4E45 ATI RADEON 9500 PRO / 9700 (R300)
- 4E46 ATI RADEON 9600 TX (R300)
- 4E47 Fire GL X1/Z1 AGP/Pro Video Accelerator (R300-WS)
- 4E48 ATI RADEON 9800 PRO (R350)
- 4E49 Radeon 9800 (R350) (??)
- 4E4A ATI RADEON 9800 XT (R360)
- 4E4B ATI FireGL X2-256/X2-256t (R350GL)
- 4E50 ATI MOBILITY /ATI RADEON 9600/9700 Series (M10)
- 4E51 ATI RADEON 9600 Series (RV350)
- 4E52 Mobility Radeon 9500/9600 (M10) (RV350)
- 4E53 Radeon Mobility 9600 (M10 NS)
- 4E54 ATI MOBILITY FIRE GL T2/T2e (M10GL)
- 4E56 ATI MOBILITY /ATI RADEON 9550 (M12)
- 4E64 Radeon 9700/Pro, 9500 (R300) Series - Secondary
- 4E65 ATI RADEON 9500 PRO / 9700 Secondary (R300)
- 4E66 ATI RADEON 9600 TX Secondary (R300)
- 4E67 Fire GL X1/Z1 AGP/Pro Secondary Video Accelerator
- 4E68 ATI RADEON 9800 PRO Secondary (R350)
- 4E69 ATI RADEON 9800 Secondary (R350)
- 4E6A ATI RADEON 9800 XT Secondary (R360)
- 4E6B ATI FireGL X2-256/X2-256t Secondary (R350GL)
- 4E71 Radeon Mobility 9600 (M10 NQ) (secondary)
- 4F72 Radeon 9000 Series (RV250)
- 4F73 Radeon 9000 Series (RV250) (Secondary)
- 5041 Rage 128 Pro PA PCI (gt)
- 5042 Rage 128 Pro PB AGP 2x (rage 128 pf pro agp )
- 5043 Rage 128 PC/Pro AGP 4x
- 5044 Rage 128 Pro PD PCI (rv100)
- 5045 Rage 128 PE/Pro AGP 2x (TMDS)
- 5046 Rage 128 PF/Pro AGP 4x (TMDS)
- 5047 3d Rage pro agp 2x (215R3BUA22)
- 5048 Rage 128 Pro PH AGP 2x (8212104D)
- 5049 Rage 128 Pro PI AGP 4x (R128)
- 504A Rage 128 Pro PJ PCI (TMDS) (Rage 128 Pro PJ PCI)
- 504B Rage 128 Pro PK AGP 2x (TMDS) (Rage 128 Pro PK AGP)
- 504C 4x (TMDS) (Rage 128 Pro PL AGP)
- 504D Rage 128 Pro PM PCI (Rage 128 Pro PM PCI)
- 504E Rage 128 Pro PN AGP 2x (Rage 128 Pro PN AGP)
- 504F Rage 128 Pro PO AGP 4x (Rage 128 Pro PO AGP)
- 5050 Rage 128 Pro PP PCI (TMDS) (Scheda Grafica Standard PCI(VGA))
- 5051 Rage 128 Pro PQ AGP 2x (TMDS) (Rage 128 Pro PQ AGP)
- 5052 Rage 128 Pro PR AGP 4x (TMDS) (Rage 128 Pro PR AGP)
- 5053 Rage 128 Pro PS PCI (Rage 128 Pro PS PCI)
- 5054 Rage 128 Pro PT AGP 2x (Rage 128 Pro PT AGP)
- 5055 rage 128 pro agp 4x tmds (rage 128 pro agp 4x tmds)
- 5056 Rage 128 Pro PV PCI (TMDS) (Rage 128 Pro PV PCI)
- 5057 Rage 128 Pro PW AGP 2x (TMDS) (Rage 128 Pro PW AGP)
- 5058 PX AGP 4x (TMDS) (Rage 128 Pro)
- 5144 Radeon 7200 QD SDR/DDR (Radeon 7200 QD SDR/DDR)
- 5145 Radeon QE
- 5146 Radeon QF
- 5147 Radeon QG
- 5148 Radeon R200 QH (R200)
- 5149 Radeon R200 QI
- 514A Radeon R200 QJ
- 514B Radeon R200 QK
- 514C Radeon 8500 / 8500LE (R200)
- 514D Radeon 9100 Series (R200)
- 514E Radeon R200 QM
- 514F Radeon R200 QN
- 5154 Radeon 8500 R200 QT
- 5155 Radeon 9100 R200 QU
- 5157 Radeon 7500 Series (RV200)
- 5158 Radeon 7500 QX (radeon 9700 or 9200)
- 5159 Radeon 7000 / Radeon VE (RV100)
- 515A Radeon VE QZ
- 515E Radeon ES1000 (Radeon ES1000)
- 515F ES1000
- 5168 Radeon R200 Qh (ati)
- 5169 Radeon R200 Qi
- 516A Radeon R200 Qj
- 516B Radeon R200 Qk
- 516C Radeon 8500 / 8500LE (E7505)
- 516D Radeon 9100 Series (R200) - Secondary
- 5245 Rage 128 GL PCI (215R46ASA22)
- 5246 Rage 32MB (Rage 128 PRO)
- 5247 Rage 128 RG (Rage 32MB)
- 524B Rage 128 VR RK PCI (g01080-108)
- 524C Rage 128 RL/VR AGP 2x
- 5345 Rage 128 SE/4x PCI
- 5346 Rage 128 SF 4x AGP 2x (Rage 128 SF 4x AGP 2x)
- 5347 Rage 128 SG/4x AGP 4x
- 5348 Rage 128 4x SH
- 534B Rage 128 4x SK PCI (Rage 128 SK PCI)
- 534C Rage 128 4x SL AGP 2x (Rage 128 SL AGP 2x)
- 534D Rage 128 4x SM AGP 4x (Rage 128 SM AGP 4x)
- 534E Rage 128 4x
- 5354 Mach 64 ST
- 5446 Rage 128 Pro Ultra TF (unknown)
- 544C Rage 128 Pro TL
- 5452 Rage 128 Pro TR
- 5453 Rage 128 Pro Ultra TS
- 5454 Rage 128 Pro Ultra TT
- 5455 Rade 128 Pro Ultra TU
- 5460 ATI MOBILITY /ATI RADEON X300 (M22)
- 5461 ATI MOBILITY /ATI RADEON X300 (M22)
- 5462 ATI MOBILITY /ATI RADEON X600 SE (M24C)
- 5464 ATI MOBILITY FireGL V3100 (M22GL)
- 5548 ATI RADEON X800 Series (R423)
- 5549 ATI RADEON X800 GTO (R423)
- 554A ATI RADEON X800 XT Platinum Edition (R423)
- 554B ATI RADEON X800 GT (R423)
- 554C R430 XTP
- 554D ATI RADEON X800 CrossFire Edition (R430)
- 554E ATI RADEON X800 GT (R430)
- 554F ATI RADEON X800 GTO (R430)
- 5550 ATI FireGL V7100 (R423GL)
- 5551 ATI FireGL V5100 (R423GL)
- 5552 FireGL V5100 (R423 UR)
- 5554 FireGL V7100 (R423 UT)
- 5568 ATI RADEON X800 Series Secondary (R423)
- 5569 ATI RADEON X800 GTO Secondary (R423)
- 556A ATI RADEON X800 XT Platinum Edition Secondary (R423)
- 556B ATI RADEON X800 GT Secondary (R423)
- 556C R430 XTP Secondary
- 556D ATI RADEON X800 CrossFire Edition Secondary (R430)
- 556E ATI RADEON X800 GT Secondary (R430)
- 556F ATI RADEON X800 GTO Secondary (R430)
- 5570 ATI FireGL V7100 Secondary (R423GL)
- 5571 FireGL V5100 PCIe (R423GL-SE) - Secondary
- 564A ATI MOBILITY FireGL V5000 (M26GL)
- 564B ATI MOBILITY FireGL V5000 (M26GL)
- 564F ATI MOBILITY /ATI RADEON X700 XL (M26)
- 5652 ATI MOBILITY /ATI RADEON X700 (M26)
- 5653 ATI MOBILITY/ATI RADEON X700 (RV410)
- 5654 Mach64 VT (215VT22200)
- 5655 Mach 64 VT3
- 5656 Mach 64 VT4 PCI (Mach 64 VT4 PCI)
- 5657 ATI RADEON X550/X700 Series (RV410)
- 566F RADEON X700 SERIES SECONDARY
- 5673 ATI MOBILITY /ATI RADEON X700 Secondary (M26)
- 5677 ATI RADEON X550/X700 Series Secondary (RV410)
- 5830 RS300/100 Host Bridge
- 5831 RS300/133 Host Bridge
- 5832 RS300/166 Host Bridge
- 5833 ATI Radeon 9000/9100 IGP Chipset - Host-PCI Bridge (RS300M)
- 5834 Radeon 9100 IGP (RS300)
- 5835 Mobilitiy Radeon 9100 IGP AGP (RS300M)
- 5838 ATI Radeon 9000/9100 IGP Chipset - AGP Controller (RS300M)
- 5854 Radeon XPRESS 200 Series Secondary
- 5874 Radeon XPRESS 200 Series Secondary
- 5940 Radeon 9200 Pro Secondary (RV280)
- 5941 ATI Radeon 9200 - Secondary (RV280)
- 5942 Radeon 9000U Family - Secondary
- 5944 Radeon 9200SE PCI (RV280)
- 5950 RS480 Host Bridge
- 5951 Radeon Xpress 200 (RS480/RS482/RX480/RX482) Host bridge
- 5952 CrossFire Xpress 3200 (RD580) Chipset Host Bridge
- 5954 ATI RADEON Xpress Series (RS480)
- 5955 ATI RADEON Xpress Series (RS480M)
- 5956 RD790 GFX Dual Slot
- 5957 RX790 GFX Single Slot
- 5958 RD780 GFX Dual Slot
- 5960 Radeon 9200 Pro (RV280)
- 5961 ATI RADEON 9200 se agp (RV280)
- 5962 Radeon 9000U Family
- 5964 Radeon 9200 SE Series (Radeon 9200)
- 5965 FireMV 2200 (unknown)
- 5969 ES1000
- 5974 ATI RADEON Xpress Series (RS482)
- 5975 ATI RADEON Xpress Series (RS482M)
- 5978 RD790 PCI to PCI bridge (external gfx0 port A)
- 5979 RD790 PCI to PCI bridge (external gfx0 port B)
- 597A RD790 PCI to PCI bridge (PCIe gpp port A)
- 597B RD790 PCI to PCI bridge (PCIe gpp port B)
- 597C RD790 PCI to PCI bridge (PCIe gpp port C)
- 597D RD790 PCI to PCI bridge (PCIe gpp port D)
- 597E RD790 PCI to PCI bridge (PCIe gpp port E)
- 597F RD790 PCI to PCI bridge (PCIe gpp port F)
- 5980 RD790 PCI to PCI bridge (external gfx1 port A)
- 5981 RD790 PCI to PCI bridge (external gfx1 port B)
- 5982 RD790 PCI to PCI bridge (NB-SB link)
- 5A10 RD890 GFX dual slot (2x16) PCI-e Hydra
- 5A11 RD890 single slot GFX Hydra
- 5A12 RD890 dual slot (2x8) PCI-e GFX Hydra
- 5A13 RD890 PCI to PCI bridge (external gfx0 port A)
- 5A14 RD890 PCI to PCI bridge (external gfx0 port B)
- 5A15 RD890 PCI to PCI bridge (PCIe gpp port A)
- 5A16 RD890 PCI to PCI bridge (PCIe gpp port B)
- 5A17 RD890 PCI to PCI bridge (PCIe gpp port C)
- 5A18 RD890 PCI to PCI bridge (PCIe gpp port D)
- 5A19 RD890 PCI to PCI bridge (PCIe gpp port E)
- 5A1A RD890 PCI to PCI bridge (PCIe gpp port F)
- 5A1B RD890 PCI to PCI bridge (PCIe gpp port G)
- 5A1C RD890 PCI to PCI bridge (PCIe gpp port H)
- 5A1D RD890 PCI to PCI bridge (external gfx1 port A)
- 5A1E RD890 PCI to PCI bridge (external gfx1 port B)
- 5A1F RD890 PCI to PCI bridge (NB-SB link)
- 5A30 RS400/100 Host Bridge
- 5A31 Host Bridge (RS400/133)
- 5A32 RS400/166 Host Bridge
- 5A33 Northbridge: Radeon Xpress 200 (RC410)
- 5A34 RS480 PCI-X Root Port
- 5A36 RS480 PCI Bridge
- 5A37 RS480 PCI Bridge
- 5A38 RS480 PCI Bridge
- 5A39 RS480 PCI Bridge
- 5A3F RS480 PCI Bridge
- 5A41 ATI RADEON Xpress Series (RS400)
- 5A42 ATI RADEON Xpress Series (RS400M)
- 5A43 Radeon XPRESS 200 Series Secondary
- 5A61 ATI RADEON Xpress Series (RC410)
- 5A62 ATI RADEON Xpress Series (RC410M)
- 5A63 Radeon XPRESS 200 Series Secondary
- 5B60 ATI RADEON X300/X550/X1050 Series (RV370)
- 5B61 RV371
- 5B62 ATI RADEON X600 Series (RV380x)
- 5B63 ATI RADEON X300/X550/X1050 Series (RV370)
- 5B64 ATI FireGL V3100 (RV370GL)
- 5B65 FireGL D1100 (RV370 5B65)
- 5B66 RV370X
- 5B70 ATI RADEON X300/X550/X1050 Series Secondary (RV370)
- 5B71 RV371 Secondary
- 5B72 ATI RADEON X600 Series Secondary (RV380x)
- 5B73 ATI RADEON X300/X550/X1050 Series Secondary (RV370)
- 5B74 ATI FireGL V3100 Secondary (RV370GL)
- 5B75 ATI FireMV 2200 Secondary (RV370)
- 5B76 RV370X Secondary
- 5C61 Mobility Radeon 9200 (bk-ati ver008.016m.085.006)
- 5C63 Mobility Radeon 9200 (RV280 (M9+))
- 5D44 Radeon 9200 SE Series - Secondary (RV280)
- 5D45 ATI FireMV 2200 PCI Secondary (RV280)
- 5D48 ATI MOBILITY/ATI RADEON X800 XT (M28)
- 5D49 ATI MOBILITY FireGL V5100 (M28GL)
- 5D4A ATI MOBILITY /ATI RADEON X800 (M28)
- 5D4C R480 CONSUMER 4P
- 5D4D ATI RADEON X850 XT Platinum Edition (R480)
- 5D4E Radeon X800 GT
- 5D4F ATI RADEON X800 GTO (R480)
- 5D50 ATI FireGL V7200 (R480GL)
- 5D52 ATI RADEON X850 XT (R480)
- 5D57 ATI RADEON X800 XT (R423)
- 5D6C R480 CONSUMER 4P Secondary
- 5D6D ATI RADEON X850 XT Platinum Edition Secondary (R480)
- 5D6E Radeon X800 GT Secondary
- 5D6F ATI RADEON X800 GTO Secondary (R480)
- 5D70 ATI FireGL V7200 Secondary (R480GL)
- 5D72 ATI RADEON X850 XT Secondary (R480)
- 5D77 ATI RADEON X800 XT Secondary (R423)
- 5E48 ATI FireGL V5000 (RV410GL)
- 5E49 FireGL V3300 (RV410)
- 5E4A ATI RADEON X700 XT (RV410)
- 5E4B ATI RADEON X700 PRO (RV410)
- 5E4C ATI RADEON X700 SE (RV410)
- 5E4D ATI RADEON X700 (RV410)
- 5E4F ATI RADEON X700/X550 Series (RV410)
- 5E68 ATI FireGL V5000 Secondary (RV410GL)
- 5E6A ATI RADEON X700 XT Secondary (RV410)
- 5E6B ATI RADEON X700 PRO Secondary (RV410)
- 5E6C ATI RADEON X700 SE Secondary (RV410)
- 5E6D ATI RADEON X700 Secondary (RV410)
- 5E6F ATI RADEON X700/X550 Series Secondary (RV410)
- 5F57 Radeon X800XT PCIe (R423)
- 6898 ATI Radeon HD 5800 Series (EG CYPRESS XT)
- 6899 ATI Radeon HD 5800 Series (EG CYPRESS PRO)
- 68A0 ATI Mobility Radeon HD 5800 Series (EG BROADWAY XT)
- 68A1 ATI Mobility Radeon HD 5800 Series (EG BROADWAY PRO/LP)
- 68B0 ATI Mobility Radeon HD 5800 Series (EG BROADWAY XT)
- 68B8 ATI Radeon HD 5700 Series (EG JUNIPER XT)
- 68BE ATI Radeon HD 5700 Series (EG JUNIPER LE)
- 700F PCI to AGP Bridge (A3/U1)
- 7010 PCI to AGP Bridge (RS200)
- 7100 ATI RADEON X1800 Series (R520)
- 7101 ATI MOBILITY /ATI RADEON X1800 XT (M58)
- 7102 ATI MOBILITY /ATI RADEON X1800 (M58)
- 7103 ATI MOBILITY FireGL V7200 (M58GL)
- 7104 ATI FireGL V7200 (R520GL)
- 7105 ATI FireGL V5300 (R520GL)
- 7106 ATI MOBILITY FireGL V7100 (M58GL)
- 7108 ATI RADEON X1800 Series (R520)
- 7109 Radeon X1800 Series - Secondary
- 710A ATI RADEON X1800 Series (R520)
- 710B ATI RADEON X1800 Series (R520)
- 710C ATI RADEON X1800 Series (R520)
- 710E ATI FireGL V7300 (R520GL)
- 710F ATI FireGL V7350 (R520GL)
- 7120 ATI RADEON X1800 Series Secondary (R520)
- 7124 ATI FireGL V7200 Secondary (R520GL)
- 7125 ATI FireGL V5300 Secondary (R520GL)
- 7128 ATI RADEON X1800 Series Secondary (R520)
- 7129 ATI RADEON X1800 Series Secondary (R520)
- 712A ATI RADEON X1800 Series Secondary (R520)
- 712B ATI RADEON X1800 Series Secondary (R520)
- 712C ATI RADEON X1800 Series Secondary (R520)
- 712E ATI FireGL V7300 Secondary (R520GL)
- 712F ATI FireGL V7350 Secondary (R520GL)
- 7140 ATI RADEON X1600 Series (RV515)
- 7141 RV505
- 7142 ATI RADEON X1300/X1550 Series (RV515)
- 7143 ATI RADEON X1550 Series (RV515)
- 7145 ATI MOBILITY /ATI RADEON X1400 (M54)
- 7146 ATI RADEON X1300 / X1550 Series (RV515)
- 7147 ATI RADEON X1550 64-bit (RV515)
- 7149 ATI MOBILITY /ATI RADEON X1300 (M52)
- 714A ATI MOBILITY /ATI RADEON X1300 (M52)
- 714B ATI MOBILITY /ATI RADEON X1300 (M52)
- 714C ATI MOBILITY /ATI RADEON X1300 (M52)
- 714D ATI RADEON X1300 Series (RV515)
- 714E ATI RADEON X1300 Series (RV515PCI)
- 714F RV505
- 7151 RV505
- 7152 ATI FireGL V3300 (RV515GL)
- 7153 ATI FireGL V3350 (RV515GL)
- 715E ATI RADEON X1300 Series (RV515)
- 715F ATI RADEON X1550 64-bit (RV515)
- 7160 ATI RADEON X1600 Series Secondary (RV515)
- 7161 RV505 Secondary
- 7162 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 7163 ATI RADEON X1550 Series Secondary (RV515)
- 7166 ATI RADEON X1300 / X1550 Series Secondary (RV515)
- 7167 ATI RADEON X1550 64-bit Secondary (RV515)
- 7169 M52 Secondary
- 716D ATI RADEON X1300 Series Secondary (RV515)
- 716E ATI RADEON X1300 Series Secondary (RV515PCI)
- 716F RV505 Secondary
- 7171 RV505 Secondary
- 7172 ATI FireGL V3300 Secondary (RV515GL)
- 7173 ATI FireGL V3350 Secondary (RV515GL)
- 717E ATI RADEON X1300 Series Secondary (RV515)
- 717F ATI RADEON X1550 64-bit Secondary (RV515)
- 7180 ATI RADEON X1300/X1550 Series (RV515)
- 7181 ATI RADEON X1600 Series (RV515)
- 7183 ATI RADEON X1300/X1550 Series (RV515)
- 7186 ATI MOBILITY /ATI RADEON X1450 (M54)
- 7187 ATI RADEON X1300/X1550 Series (RV515)
- 7188 ATI MOBILITY /ATI RADEON X2300 (M54)
- 718A ATI MOBILITY /ATI RADEON X2300 (M54)
- 718B ATI MOBILITY /ATI RADEON X1350 (M52)
- 718C ATI MOBILITY /ATI RADEON X1350 (M52)
- 718D ATI MOBILITY /ATI RADEON X1450 (M54)
- 718F ATI RADEON X1300 Series (RV515PCI)
- 7193 ATI RADEON X1550 Series (RV515)
- 7196 ATI MOBILITY /ATI RADEON X1350 (M52)
- 719B ATI FireMV 2250 (RV515)
- 719F ATI RADEON X1550 64-bit (RV515)
- 71A0 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 71A1 ATI RADEON X1600 Series Secondary (RV515)
- 71A3 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 71A7 ATI RADEON X1300/X1550 Series Secondary (RV515)
- 71AF ATI RADEON X1300 Series Secondary (RV515PCI)
- 71B3 ATI RADEON X1550 Series Secondary (RV515)
- 71BB ATI FireMV 2250 Secondary (RV515)
- 71C0 ATI RADEON X1600 Series (RV530)
- 71C1 ATI RADEON X1650 Series (RV535)
- 71C2 ATI RADEON X1600 Series (RV530)
- 71C3 ATI RADEON X1300 Series (RV535)
- 71C4 ATI MOBILITY FireGL V5200 (M56GL)
- 71C5 ATI MOBILITY /ATI RADEON X1600 (M56)
- 71C6 ATI RADEON X1650 Series (RV530)
- 71C7 ATI RADEON X1650 Series (RV535)
- 71CD ATI RADEON X1600 Series (RV530)
- 71CE ATI RADEON X1600 Pro / ATI RADEON X1300 XT (RV530)
- 71D2 ATI FireGL V3400 (RV530GL)
- 71D4 ATI MOBILITY FireGL V5250 (M56GL)
- 71D5 ATI MOBILITY /ATI RADEON X1700 (M56)
- 71D6 ATI MOBILITY /ATI RADEON X1700 XT (M56)
- 71DA ATI FireGL V5200 (RV530GL)
- 71DE ATI MOBILITY /ATI RADEON X1700 (M56)
- 71E0 ATI RADEON X1600 Series Secondary (RV530)
- 71E1 ATI RADEON X1650 Series Secondary (RV535)
- 71E2 ATI RADEON X1600 Series Secondary (RV530)
- 71E3 ATI RADEON X1300 Series Secondary (RV535)
- 71E5 M56 Secondary
- 71E6 ATI RADEON X1600 Series Secondary (RV530)
- 71E7 ATI RADEON X1650 Series Secondary (RV535)
- 71ED ATI RADEON X1600 Series Secondary (RV530)
- 71EE ATI RADEON X1600 Pro / ATI RADEON X1300 XT Secondary (RV530)
- 71F2 ATI FireGL V3400 Secondary (RV530GL)
- 71FA ATI FireGL V5200 Secondary (RV530GL)
- 71FE RV530 SE Secondary
- 7205 S3G Unichrome IGP KM400/KN400 (1106)
- 7210 ATI MOBILITY /ATI RADEON HD 2300 (M71)
- 7211 ATI MOBILITY /ATI RADEON HD 2300 (M71)
- 7240 ATI RADEON X1950 Series (R580)
- 7241 Radeon X1900 (R580)
- 7242 Radeon X1900 (R580)
- 7243 ATI RADEON X1900 Series (R580)
- 7244 ATI RADEON X1950 Series (R580)
- 7245 ATI RADEON X1900 Series (R580)
- 7246 ATI RADEON X1900 Series (R580)
- 7247 ATI RADEON X1900 Series (R580)
- 7248 ATI RADEON X1900 Series (R580)
- 7249 ATI RADEON X1900 Series (R580)
- 724A ATI RADEON X1900 Series (R580)
- 724B ATI RADEON X1900 Series (R580)
- 724C ATI RADEON X1900 Series (R580)
- 724D ATI RADEON X1900 Series (R580)
- 724E FireGL V7300/V7350 PCIe (R580)
- 724F ATI RADEON X1900 Series (R580)
- 7260 ATI RADEON X1950 Series Secondary (R580)
- 7263 ATI RADEON X1900 Series Secondary (R580)
- 7264 ATI RADEON X1950 Series Secondary (R580)
- 7265 ATI RADEON X1900 Series Secondary (R580)
- 7266 ATI RADEON X1900 Series Secondary (R580)
- 7267 ATI RADEON X1900 Series Secondary (R580)
- 7268 ATI RADEON X1900 Series Secondary (R580)
- 7269 ATI RADEON X1900 Series Secondary (R580)
- 726A ATI RADEON X1900 Series Secondary (R580)
- 726B ATI RADEON X1900 Series Secondary (R580)
- 726C ATI RADEON X1900 Series Secondary (R580)
- 726D ATI RADEON X1900 Series Secondary (R580)
- 726E FireGL V7300/V7350 PCIe (R580) - Secondary
- 726F ATI RADEON X1900 Series Secondary (R580)
- 7280 ATI RADEON X1950 Series (R580)
- 7284 ATI MOBILITY /ATI RADEON X1900 (M58)
- 7288 ATI RADEON X1950 GT (R580)
- 7291 ATI RADEON X1650 Series (R580)
- 7293 ATI RADEON X1650 Series (R580)
- 72A0 ATI RADEON X1950 Series Secondary (R580)
- 72A8 ATI RADEON X1950 GT Secondary (R580)
- 72B1 ATI RADEON X1650 Series Secondary (R580)
- 72B3 ATI RADEON X1650 Series Secondary (R580)
- 7800 ?
- 7830 RS350/100 Host Bridge
- 7831 RS350/133 Host Bridge
- 7832 RS350/166 Host Bridge
- 7833 Radeon 9100 Pro (RS350)
- 7834 Radeon 9000/9100 Pro IGP Series
- 7835 Radeon Mobility 9200 IGP
- 7838 Radeon 9100 IGP PCI/AGP Bridge
- 7910 RS690 Host Bridge
- 7912 RS690 PCI to PCI Bridge (Internal gfx)
- 7916 RS690 PCI to PCI Bridge (PCI Express Port 2)
- 7917 RS690 PCI to PCI Bridge (PCI Express Port 3)
- 7919 Radeon X1200 Series Audio Controller
- 791A HDMI Audio (791A)
- 791E ATI RADEON X1200 Series (RS690)
- 791F ATI Mobility Radeon x1100 (RS690M)
- 7930 RS600(M) Chipset - Host Bridge
- 7933 RS600(M) Chipset - PCI Express Graphics Port 0
- 7935 RS600(M) Chipset - PCI Express Port 1
- 7937 ATI Technoligies Inc (Samsung R25P)
- 793F ATI RADEON Xpress 1200 Series (RS600)
- 7941 ATI RADEON Xpress 1200 Series (RS600)
- 7942 ATI RADEON Xpress 1200 Series (RS600M)
- 796E ATI RADEON 2100 (RS690)
- 7C37 Radeon 9600 SE (RV350 AQ)
- 9400 ATI Radeon HD 2900 XT (R600)
- 9401 ATI RADEON HD 2900 XT (R600)
- 9402 ATI RADEON HD 2900 XT (R600)
- 9403 ATI RADEON HD 2900 PRO (R600)
- 9405 ATI RADEON HD 2900 GT (R600)
- 940A ATI FireGL V8650 (R600GL)
- 940B ATI FireGL V8600 (R600GL)
- 940F ATI FireGL V7600 (R600GL)
- 9440 ATI Radeon HD 4870 (RV770)
- 9441 ATI Radeon HD 4870 X2 (R700)
- 9442 ATI Radeon HD 4800 Series (RV770)
- 9443 ATI Radeon HD 4850 X2 (R700)
- 9444 ATI FirePro V8750 (FireGL) (RV770)
- 9446 ATI FirePro V7770 (FireGL) (RV770)
- 9447 ATI FirePro V8700 Duo (FireGL) (R700)
- 944A ATI Mobility Radeon HD 4850 (M98)
- 944B ATI Mobility Radeon HD 4850 X2 (M98)
- 944C ATI Radeon HD 4800 Series (RV770)
- 944E ATI Radeon HD 4700 Series (RV770)
- 9450 AMD FireStream 9270 (RV770)
- 9452 AMD FireStream 9250 (RV770)
- 9456 ATI FirePro V8700 (FireGL) (RV770)
- 945A ATI Mobility Radeon HD 4870 (M98)
- 9460 ATI Radeon HD 4800 Series (RV790)
- 9462 ATI Radeon HD 5000 Series (RV790)
- 9480 ATI Mobility Radeon HD 4650 (M96)
- 9487 ATI Radeon Graphics Processor (RV730)
- 9488 ATI Mobility Radeon HD 4670 (M96)
- 948F ATI Radeon Graphics Processor (RV730)
- 9490 ATI Radeon HD 4600 Series (RV730)
- 9491 ATI Radeon E4600 (M96)
- 9495 ATI RADEON HD4650 (RV730)
- 9498 ATI Radeon HD 4650 (RV730)
- 949C ATI FirePro V7750 (FireGL) (RV730)
- 949E ATI FirePro V5700 (FireGL) (RV730)
- 949F ATI FirePro V3750 (FireGL) (RV730)
- 94A0 ATI Mobility Radeon HD 4830 (M97)
- 94A1 ATI Mobility Radeon HD 4860 (M97)
- 94A3 ATI FirePro M7740 (M97)
- 94B1 ATI Radeon Graphics Processor (RV740)
- 94B3 ATI Radeon HD 4770 (RV740)
- 94B4 ATI Radeon HD 4700 Series (RV740)
- 94B5 ATI Radeon HD 4770 (RV740)
- 94C1 ATI Radeon HD 2400 XT (RV610-DT (Pro))
- 94C3 ATI Radeon HD 2400 PRO (RV610-DT (LE))
- 94C4 ATI Radeon HD 2400 PRO AGP (RV610LE)
- 94C5 ATI RADEON HD 2400 LE (RV610)
- 94C7 ATI RADEON HD 2350 (RV610)
- 94C8 ATI MOBILITY /ATI RADEON HD 2400 XT (M72)
- 94C9 ATI MOBILITY /ATI RADEON HD 2400 (M72)
- 94CB ATI RADEON E2400 (M72)
- 94CC ATI RADEON HD 2400 (RV610)
- 9501 ATI Radeon HD 3870 (RV670 XT)
- 9504 ATI MOBILITY /ATI RADEON HD 3850 (M76)
- 9505 ATI RADEON HD 3850 (RV630)
- 9506 ATI MOBILITY /ATI RADEON HD 3850 X2 (M76)
- 9507 ATI Radeon HD 3830 (RV670)
- 9508 ATI MOBILITY /ATI RADEON HD 3870 (M76)
- 9509 ATI MOBILITY /ATI RADEON HD 3870 X2 (M76)
- 950F ATI RADEON HD 3870 X2 (RV630)
- 9511 ATI FireGL V7700 (RV630GL)
- 9513 ATI Radeon HD 3850 X2 (R680)
- 9515 ATI Radeon HD 3850 AGP (RV670 AGP)
- 9519 AMD FireStream 9170 (RV670)
- 9540 ATI Radeon HD 4550 (RV710)
- 9541 ATI Radeon Graphics Processor (RV710)
- 954E ATI Radeon Graphics Processor (RV710)
- 954F ATI Radeon HD 4350 (RV710)
- 9552 ATI Mobility Radeon HD 4330 Series (M92)
- 9553 ATI Mobility Radeon HD 4570 Series (M92)
- 9555 ATI Mobility Radeon HD 4500 Series (M93)
- 9557 ATI FirePro RG220 (M93)
- 9581 ATI Mobility Radeon HD 2600 (M76M)
- 9583 ATI MOBILITY /ATI RADEON HD 2600 XT (M76)
- 9586 ATI RADEON HD 2600 XT AGP (RV630)
- 9587 ATI Radeon HD 2600 Pro AGP (RV630 PRO)
- 9588 ATI Radeon HD 2600 XT (RV630 XT)
- 9589 ATI Radeon HD 2600 Pro (RV630 PRO)
- 958A RADEON HD 2600 X2 SERIES
- 958B ATI MOBILITY / ATI RADEON HD 2600 XT Gemini (M76)
- 958C ATI FireGL V5600 (RV630GL)
- 958D ATI FireGL V3600 (RV630GL)
- 958E ATI RADEON HD 2600 LE (RV630)
- 958F ATI Mobility FireGL Graphics Processor (M76)
- 9590 ATI RADEON HD 3650 Series (RV630)
- 9591 ATI Mobility Radeon HD 3650 (M86-M)
- 9593 ATI Mobility Radeon HD 3670 (M86)
- 9595 ATI Mobility FireGL V5700 (M86)
- 9596 ATI RADEON HD 3600 Series (RV630)
- 9597 ATI RADEON HD 3600 Series (RV630)
- 9598 ATI RADEON HD 3600 Series (RV630)
- 9599 ATI RADEON HD 3600 Series (RV630)
- 959B ATI Mobility FireGL Graphics Processor (M86)
- 95C0 ATI RADEON HD 3470 (RV610)
- 95C2 ATI MOBILITY /ATI RADEON HD 3430 (M72)
- 95C4 ATI Mobility Radeon HD 3450 (M82-S)
- 95C5 ATI Radeon HD 3450 (RV620 LE)
- 95C6 ATI Radeon HD 3450 (RV620)
- 95C7 ATI RADEON HD 3430 (RV610)
- 95C9 ATI Radeon HD 3450 (RV620)
- 95CC ATI FirePRO V3700 (RV620)
- 95CD ATI FireMV 2450 (RV610)
- 95CE ATI FireMV 2260 (RV610)
- 95CF ATI FireMV 2260 (RV610)
- 9610 ATI Radeon HD 3200 Graphics (RS780)
- 9611 ATI RADEON 3100 Graphics (RS780)
- 9612 ATI RADEON HD 3200 Graphics (RS780M)
- 9613 ATI RADEON 3100 Graphics (RS780M)
- 9614 ATI RADEON HD 3300 Graphics (RS780)
- 9615 AMD 780E (RS780)
- 9616 AMD 760G (RS780)
- 9710 ATI Radeon HD 4200 (RS880)
- 9711 ATI Radeon 4100 (RS880)
- 9712 ATI Mobility Radeon HD 4200 (RS880)
- 9713 ATI Mobility Radeon 4100 (RS880)
- 9876 ATI 3D Rage Pro AGP 2X (ATI GTC (GT-C2U2))
- AA01 Ati Mobility Radeon HD 2600 (Ati Function driver for high definition audio - AT)
- AA08 High Definition Audio Device (All with HDMI support)
- AA10 HDMI Audio Support
- AA20 ATI Radeon HD 3600 Series (RV630)
- AA28 Radeon HD 3400 Series (3400)
- CAB0 S2K CPU to PCI Bridge (A3/U1)
- CAB1 Slot1 CPU to PCI Bridge (A3/U1)
- CAB2 CPU to PCI Bridge (RS200)
- CAB3 R200 AGP Bridge [Mobility Radeon 7000 IGP]
- CBB2 CPU to PCI Bridge (RS200)
-1003 ULSI Systems
- 0201 GUI Accelerator (0x0201)
-1004 VLSI Technology
- 0005 CPU Bridge (82C591/2-FC1)
- 0006 ISA Bridge (82C593)
- 0007 Wildcat System Controller (82C594)
- 0008 82C596/7 Wildcat PCI to ISA Bridge
- 0009 82C597-AFC2
- 000C 82C541
- 000D 82C543
- 0100 CPU to PCI Bridge for notebook (dtdftdfz)
- 0101 Peripheral Controller (82C532)
- 0102 PCI to PCI Bridge (82C534)
- 0103 PCI to ISA Bridge (82C538)
- 0104 82C535 CPU to PCI Bridge
- 0105 IrDA Controller (82C147)
- 0200 RISC GUI Accelerator (82C975)
- 0280 RISC GUI Accelerator (82C925)
- 0304 ThunderBird PCI Audio Accelerator (SAA7785)
- 0305 QSound ThunderBird PCI Audio Gameport
- 0306 QSound ThunderBird PCI Audio Support Registers
- 0307 Thunderbird Avenger Audio Accelerator
- 0308 Thunderbird Avenger GamePort Enumerator
- 0702 Golden Gate II (VAS96011)
- 0703 Tollgate
-1005 Advance Logic (ADL) Inc
- 2064 ALG2032/2064
- 2128 ALG2364A
- 2301 AVL2301 GUI Accelerator
- 2302 ALG2302 GUI Accelerator
- 2364 ALG2364 GUI Accelerator
- 2464 ALG2364A
- 2501 ALG2564A/25128A
-1006 Reply Group
-1007 Netframe Systems Inc
-1008 Epson
-100A Phoenix Technologies
-100B National Semiconductors
- 0001 DP83810 10/100 Fast Ethernet Adapter
- 0002 PCI-IDE DMA Master Mode Interface Ctrlr (PC87415)
- 000E Legacy I/O Controller (PC87560)
- 000F CS4210 OHCI Compliant FireWire Controller
- 0011 PCI System I/O (PC87560)
- 0012 USB Controller
- 001B Advanced PCI Audio Accelerator (LM4560)
- 0020 DP83815/16 Fast Ethernet Adapter (MacPhyter/MacPhyter-II)
- 0021 PCI to ISA Bridge (PC82440)
- 0022 DP83820/1 10/100/1000 Gigabit Ethernet Adapter
- 0028 PCI Host Bridge (Geode GX2)
- 002A GeodeLink PCI South Bridge (CS5535)
- 002B CS5535 ISA Bridge
- 002D Geode IDE Controller
- 002E GEODE - GX3 Audio CS5535 (Castle ())
- 002F USB Controller (Geode)
- 0030 Geode VGA Compatible Device (NSC)
- 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller
- 0500 LPC Bridge and GPIO (SCx200)
- 0501 SMI Status and ACPI (SCx200)
- 0502 IDE Controller (SC1100/SCx200)
- 0503 XpressAUDIO (SC1100/SCx200)
- 0504 Video Processor (SCx200)
- 0505 X-Bus Expansion Interface (SCx200)
- 0510 LPC Bridge and GPIO (SC1100)
- 0511 SMI Status and ACPI (SC1100)
- 0515 X-Bus Expansion Interface (SC1100)
- D001 PC87410 PCI EIDE Controller (Single FIFO)
-100C TSENG LABS Inc
- 3202 GUI Accelerator (ET4000W32P-A)
- 3205 GUI Accelerator (ET4000W32P-B)
- 3206 GUI Accelerator (ET4000W32P-C)
- 3207 GUI Accelerator (ET4000W32P-D)
- 3208 Graphics/Multimedia Engine (ET6000)
- 4702 ET6300
-100D AST Computer
-100E Weitek
- 0564 Host Bridge (STPC Client)
- 55CC South Bridge (STPC Client)
- 9000 WeitekPower GUI Accelerator (P9000)
- 9001 WeitekPower P9000 Viper
- 9002 WeitekPower P9000 Viper
- 9100 WeitekPower P9100 Viper
-1010 Video Logic Ltd
-1011 Digital Equipment Corporation
- 0001 DecChip 21050 PCI to PCI Bridge
- 0002 DecChip 21040 "Tulip" Ethernet Adapter
- 0004 DecChip 21030 "TGA" Graphics Accelerator
- 0007 NV-RAM (Zephyr)
- 0008 SCSI to SCSI Adapter (KZPSA)
- 0009 DecChip 21140 Fast Ethernet Adapter
- 000A DecChip 21230 Video Codec
- 000C DecChip 21130 Integrated GUI Accelerator
- 000D DecChip TGA2 PDXGB
- 000F FDDI "DEFPA"
- 0014 DecChip 21041 "Tulip Plus" Ethernet Adapter
- 0016 ATM-Controller "DGLPB"
- 0017 PV-PCI Graphics Controller (ZLXp-L)
- 0019 PCI/CardBus 10/100 Mbit Ethernet Ctlr (DC21142/3)
- 001A Farallon PN9000SX Gigabit Ethernet
- 0021 PCI-PCI Bridge (21052[-AB])
- 0022 PCI-PCI Bridge (DC21150-AA)
- 0023 PCI to PCI Bridge (DC21150)
- 0024 PCI-PCI Bridge (DC21151/2)
- 0025 21153 PCI to PCI Bridge
- 0026 21154 PCI to PCI Bridge
- 0034 CardBus (Modem56)
- 0045 PCI to PCI Bridge (DC21553)
- 0046 21554 PCI to PCI Bridge
- 1011 PCI-PCI Bridge (DC21050)
- 1065 21285 Core Logic for StongArm SA-110 Microprocessor
- 2000 Fault Mgr (3.3v/5v Universal PCI) (3X-KPCON-AA)
-1012 Micronics Computers Inc
-1013 Cirrus Logic
- 0038 pci (FW82371EB)
- 0040 Flat Panel GUI Accelerator (CL-GD7555)
- 004C 64-bit Accelerated LCD/CRT Controller (CL-GD7556)
- 00A0 GUI Accelerator (CL-GD5440)
- 00A2 Alpine GUI Accelerator (CL-GD5432)
- 00A4 Alpine GUI Accelerator (CL-GD5434)
- 00A8 Alpine GUI Accelerator (CL-GD5434)
- 00AC Video card (i guess?) (CL-GD5426)
- 00B0 CL-GD5440
- 00B8 64-bit VisualMedia Accelerator (CL-GD5446)
- 00BC 64-bit SGRAM GUI accelerator (CL-GD5480)
- 00D0 Laguna VisualMedia graphics accelerator (CL-GD5462)
- 00D2 CL-GD5462 (Laguna I)
- 00D4 Laguna 3D VisualMedia Graphics Accel (CL-GD5455)
- 00D5 Laguna BD (CL-GD5464)
- 00D6 Laguna 3D VisualMedia Graphics Accel (CL-GD5465)
- 00E8 CL-GD5436U
- 1013 accelerator do audio do pci de sound fusion (cs4630cm)
- 1100 PCI-to-PC Card host adapter (CL-PD6729)
- 1110 PCMCIA/CardBus Controller (CL-PD6832)
- 1112 PCMCIA/CardBus Controller (CL-PD6834)
- 1113 PCI-to-CardBus Host Adapter (CL-PD6833)
- 1200 Nordic GUI Accelerator (CL-GD7542)
- 1202 Viking GUI Accelerator (CL-GD7543)
- 1204 Nordic-lite VGA Cntrlr (CL-GD7541)
- 4000 Ambient CLM Data Fax Voice (1085)
- 4400 Communications Controller (CL-CD4400)
- 6001 CrystalClear SoundFusion PCI Audio Accelerator (CS4610/4611)
- 6003 Crystal CS4610/14/22/24/30 SoundFusion PCI Audio Accelerator
- 6004 Crystal CS4615 SoundFusion PCI Audio Accelerator
- 6005 Crystal Soundfusion(tm) CS 4281 WDM Audio (CS4281)
- 9876 SoundFusion PCI Audio Accelerator (cirrus logic crystal CS 4614)
-1014 International Business Machines Corp.
- 0002 MCA Bridge (MCA Bridge)
- 0005 CPU Bridge (Alta Lite)
- 0007 CPU Bridge (Alta MP)
- 000A Fire Coral PCI to ISA Bridge with PnP Port
- 0017 CPU to PCI Bridge
- 0018 TR Auto LANStreamer (Auto LANStreamer)
- 001B Graphics Adapter (GXT-150P)
- 001C Carrera
- 001D scsi-2 fast pci adapter (82G2675)
- 0020 PCI to MCA Bridge
- 0022 82351/2 PCI to PCI Bridge
- 002D Python
- 002E Coppertime RAID SCSI Adapter (ServeRAID I/II/3x/4H)
- 0031 2 Port Serial Adapter
- 0036 32-bit LocalBus Bridge (Miami/PCI)
- 0037 PowerPC to PCI Bridge and Memory Ctrlr (IBM27-82660)
- 003A CPU to PCI Bridge
- 003C GXT250P/GXT255P Graphics Adapter
- 003E 85H9533 16/4 Token Ring Controller UTP/STP
- 0045 SSA Adapter
- 0046 Interrupt Controller (MPIC)
- 0047 PCI to PCI Bridge
- 0048 PCI to PCI Bridge
- 0049 Warhead SCSI Controller
- 004D MPEG-2 Decoder (IBM 3780IDSP)
- 004E ATM Controller (14104E00)
- 004F ATM Controller (14104F00)
- 0050 ATM Controller (14105000)
- 0053 25 MBit ATM controller (85h9533)
- 0054 GXT500P/GXT550P Graphics Adapter
- 0057 MPEG PCI Bridge (85g1897)
- 005C 10/100 PCI Ethernet Adapter (i82557B)
- 005D TCP/IP networking device (05J3506)
- 005E GXT800P Graphics Adapter
- 007C ATM Controller (14107C00)
- 007D MPEG-2 Decoder (3780IDSP)
- 008B EADS PCI to PCI Bridge
- 008E GXT3000P Graphics Adapter
- 0090 GXT 3000P
- 0091 SSA Adapter
- 0095 PCI Docking Bridge (20H2999)
- 0096 Chukar chipset SCSI Controller
- 009F PCI 4758 Cryptographic Accelerator
- 00A1 ATM support device (PowerNP NPr2.7)
- 00A5 ATM Controller (1410A500)
- 00A6 ATM 155MBPS MM Controller (1410A600)
- 00B7 GXT2000 256-bit Graphics Rasterizer (Fire GL1)
- 00B8 GXT2000P Graphics Adapter
- 00BE ATM 622MBPS Controller (1410be00)
- 00CE 02LI537 Adapter 2 Token Ring Adapter
- 00DC Advanced Systems Management Adapter (ASMA)
- 00F9 Memory Controller and PCI Bridge (CPC700)
- 00FC PCI-64 Bridge (CPC710)
- 0104 Gigabit Ethernet-SX Adapter
- 0105 PCI-32 Bridge (CPC710)
- 010F Remote Supervisor+Serial Port+Mouse/Keyboard
- 011B Raid controller (cbeh3w)
- 0142 Video Compositor Input (Yotta)
- 0144 Video Compositor Output (Yotta)
- 0153 ?
- 0156 PLB to PCI Bridge (405GP)
- 015E 622Mbps ATM PCI Adapter
- 0160 64bit/66MHz PCI ATM 155 MMF
- 016E GXT4000P Graphics Adapter
- 0170 Rasterizer/IBM GT1000 Geometr (RC1000)
- 017D GXT300P Graphics Adapter
- 0180 Snipe chipset SCSI Controller
- 0188 EADS-X PCI-X to PCI-X Bridge
- 01A2 Modem: Intel Corporation 82440MX AC'97 Modem Controller (prog-if 00 [Generic]) (82801)
- 01A7 PCI-X Bridge R1.1 (IBM 133)
- 01BD Morpheus SCSI RAID Controller (ServeRAID 4/5)
- 01C1 64bit/66MHz PCI ATM 155 UTP
- 01E6 Cryptographic Accelerator
- 01EF PLB to PCI-X Bridge (440GP)
- 01FF 10/100 Mbps Ethernet
- 0219 Multiport Serial Adapter
- 021B GXT6500P Graphics Adapter
- 021C GXT4500P Graphics Adapter
- 0233 GXT135P Graphics Adapter
- 0246 ?
- 0266 PCI-X Dual Channel SCSI
- 0268 Gigabit Ethernet-SX Adapter (PCI-X)
- 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)
- 027F Embedded PowerPC CPU (440GX)
- 0289 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902) (2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
- 028C Citrine chipset SCSI Controller
- 0295 IBM SurePOS Riser Card Function 0 (NECSCE 11508082)
- 0297 IBM SurePOS Riser Card Function 1 (UARTs) (NECSCE 11508082)
- 02A1 Calgary PCI-X Host Bridge
- 0302 PCI-X Host Bridge
- 0314 ZISC 036 Neural accelerator Card
- 3022 QLA3022 Network Adapter
- 4022 QLA3022 Network Adapter
- FFFF Interrupt Controller (MPIC 2)
-1015 LSI Logic Corp of Canada
-1016 Fujitsu ICL Personal Systems
-1017 Spea Software AG
- 5343 SPEA 3D Accelerator (v7-mpeg modul)
-1018 Unisys Corporation
-1019 Elitegroup Computer System
- 1B10 VIA chipset (sis-648D)
-101A NCR Corporation
- 0005 8156 100VG/AnyLAN Adapter
- 0009 Altera FLEX RAID Controller(??)
- 1DC1 Bynet
-101B Vitesse Semiconductor
-101C Western Digital
- 0193 WD33C193A PCI-SCSI Bridge
- 0196 WD33C196A PCI-SCSI Bridge
- 0197 WD33C197A PCI-Wide SCSI Bridge
- 0296 WD33C296A PCI-Wide SCSI Bridge
- 3193 WD7193 Fast SCSI II Host Adapter
- 3197 WD7197 Fast Wide SCSI II Host Adapter
- 3296 WD7296a Fast Wide SCSI II Host Adapter
- 4296 WD34C294 Wide Fast-20 SCSI Host Adapter
- 9710 Pipeline 9710
- 9712 Pipeline 9712
- C24A 90C (??)
-101E American Megatrends Inc.
- 0009 MegaRAID 428 Ultra RAID Controller (rev 03)
- 1960 80960RP i960RP Microprocessor
- 9010 MegaRAID 428 Ultra Fast Wide SCSI RAID Controller
- 9030 EIDE Controller
- 9031 EIDE Controller
- 9032 EIDE & SCSI Controller
- 9033 SCSI Controller (I960)
- 9040 Multimedia card (amd sempron(tm)2200+)
- 9060 Ultra GT RAID Controller (MegaRAID 434)
- 9063 Remote Assistant (MegaRAC 780)
-101F PictureTel Corp
-1020 Hitachi Computer Electronics
-1021 Oki Electric Industry
-1022 Advanced Micro Devices (AMD)
- 0058 SSA Adapter [Advanced SerialRAID/X]
- 02BD Obsidian chipset SCSI controller
- 0308 CalIOC2 PCI-E Root Port
- 1100 Athlon64/Opteron/Sempron (K8 Family) HyperTransport Technology Configuration
- 1101 Athlon64/Opteron/Sempron (K8 Family) Address Map
- 1102 Athlon64/Opteron/Sempron (K8 Family) DRAM Controller
- 1103 Athlon64/Opteron/Sempron (K8 Family) Miscellaneous Control
- 1200 (Family 10h) Athlon64/Opteron/Sempron HyperTransport Technology Configuration
- 1201 (Family 10h) Athlon64/Opteron/Sempron Address Map
- 1202 (Family 10h) Athlon64/Opteron/Sempron DRAM Controller
- 1203 (Family 10h) Athlon64/Opteron/Sempron Miscellaneous Control
- 1204 (Family 10h) Athlon64/Opteron/Sempron Link Control
- 1300 (Family 11h) Athlon64/Opteron/Sempron HyperTransport Technology Configuration
- 1301 (Family 11h) Athlon64/Opteron/Sempron Address Map
- 1302 (Family 11h) Athlon64/Opteron/Sempron DRAM Controller
- 1303 (Family 11h) Athlon64/Opteron/Sempron Miscellaneous Control
- 1304 (Family 11h) Athlon64/Opteron/Sempron Link Control
- 2000 PCnet LANCE PCI Ethernet Controller (Am79C970/1/2/3/5/6)
- 2001 AM79C978 PCnet Single Chip Home Networking Controller 1/10Mbps
- 2003 Wireless LAN chipset SMC 2602W V3 http://www.smc.com/index.cfm?event=downloads.doSearchCriteria&loca (Am1772)
- 2020 AM53C974 SCSI Bridge (AKA Qlogic Fast!SCSI Basic, Tekram DC-390)
- 2040 AM79C974 Ethernet & SCSI Bridge
- 2080 Conrad Kostecki
- 2081 GeodeLX graphics adapter (Unknown)
- 2082 Geode GX3 AES Crypto Driver (GX3)
- 208F GeodeLink PCI South Bridge (CS5536)
- 2090 CS5536 [Geode companion] ISA
- 2091 CS5536 [Geode companion] FLASH
- 2093 CS5536 Audio Controller (CS5536)
- 2094 CS5536 OHCI USB Host Controller (CS5536)
- 2095 CS5536 EHCI USB Host Controller (CS5536)
- 2096 CS5536 USB Device Controller (Number: CS5536)
- 2097 CS5536 USB OTG Controller (CS5536)
- 209A CS5536 IDE Controller (CS5536)
- 3000 Elan SC520 MicroController PCI Bus Host Brdge
- 4361 AC'97 Audio
- 5E4B Radeon X700 Pro (RV410)
- 7004 AMD-751 (Irongate) CPU to PCI Bridge (SMP Chipset)
- 7006 Processor-to-PCI Bridge / Memory Ctrlr (AMD-751)
- 7007 AGP and PCI-to-PCI Bridge (1x/2x AGP) (AMD-751)
- 700A AGP Host to PCI Bridge (AMD-IGR4)
- 700B AGP PCI to PCI Bridge (AMD-IGR4)
- 700C CPU to PCI Bridge (SMP chipset) (AMD-762)
- 700D CPU to PCI Bridge (AGP 4x) (AMD-762)
- 700E AMD-761 CPU to PCI Bridge
- 700F CPU to AGP Bridge (AGP 4x) (AMD-761)
- 7400 AMD-755 (Cobra) PCI to ISA Bridge
- 7401 Bus Master IDE Controller (AMD-755)
- 7403 AMD-755 (Cobra) Power Management Controller
- 7404 PCI to USB Open Host Controller (AMD-755)
- 7408 AMD-756 (Viper) PCI to ISA Bridge
- 7409 AMD-756 (Viper) EIDE Controller
- 740B AMD-756 (Viper) Power Management Controller
- 740C AMD-756 (Viper) USB Open Host Controller
- 7410 AMD-766 (ViperPlus) PCI to ISA/LPC Bridge
- 7411 AMD-766 (ViperPlus) EIDE Controller
- 7412 AMD-766 (ViperPlus) USB Controller
- 7413 AMD-766 (ViperPlus) Power Management Controller
- 7414 AMD-766 (ViperPlus) OpenHCD USB Host Controller
- 7440 AMD-768 (Opus) PCI to ISA/LPC Bridge
- 7441 AMD-768 (Opus) EIDE Controller
- 7443 AMD-768 (Opus) ACPI Controller
- 7445 AMD-768 (Opus) AC'97 Audio
- 7446 AMD-768 (Opus) AC'97 Modem
- 7448 AMD-768 (Opus) PCI Bridge
- 7449 AMD-768 (Opus) USB Controller
- 7450 PCI-X Bridge (AMD-8131)
- 7451 PCI-X IOAPIC (AMD-8131)
- 7454 AMD-8151 AGP Device (System Controller)
- 7455 AGP Bridge (AMD-8151)
- 7458 PCI-X Bridge (AMD-8132)
- 7459 PCI-X IOAPIC (AMD-8132)
- 7460 PCI Bridge (AMD-8111)
- 7461 USB 2.0 Controller (AMD-8111)
- 7462 Ethernet Controller (AMD-8111)
- 7463 USB Enhanced Host Controller (AMD-8111)
- 7464 USB OpenHCI Host Controller (AMD-8111)
- 7468 LPC Bridge (AMD-8111)
- 7469 UltraATA/133 Controller (AMD-8111)
- 746A SMBus 2.0 Controller (AMD-8111)
- 746B AMD-8111 ACPI System Management Controller
- 746D Audio Controller (c-media cmi8738)
- 746E AC'97 Modem (AMD-8111)
- 756B ACPI Controller (AMD-8111)
-1023 Trident Microsystems
- 0194 CardBus Controller (82C194)
- 2000 advanced PCI DirectSound accelerator (4DWAVE-DX)
- 2001 PCI Audio (4D WAVE DX SOUND ACCELERATOR)
- 2100 Video Accelerator (Cyber-XP4)
- 2200 Video adapter (Volari V3)
- 8400 sausgauos (84001023)
- 8420 compaq 100 (51331071)
- 8500 Via Tech VT8361/VT8601 Graphics Controller (VT8361)
- 8520 Windows xp (Trident Video Accelerator CyberBlade i1)
- 8620 trident (CyberBlade-i1)
- 8820 TRIDENT DISPLAY CONTROLER (Ai1)
- 9320 32-bit GUI Accelerator (TGUI9320)
- 9350 32-bit GUI Accelerator (TGUI9350)
- 9360 Flat panel GUI Accelerator
- 9382 Cyber9382 Reference Design
- 9383 Cyber9383 Reference Design
- 9385 Cyber9385 Reference Design
- 9386 Video Accelerator (Cyber9386)
- 9388 Video Accelerator (Cyber9388)
- 9397 Video Accelerator 3D (Cyber9397)
- 939A Video Accelerator (Cyber9397DVD)
- 9420 DGi GUI Accelerator (TGUI9420)
- 9430 GUI Accelerator (TGUI9430)
- 9440 DGi GUI Acclerator (TGUI9682)
- 9460 32-bit GUI Accelerator (TGUI9460)
- 9470 TGUI9470
- 9520 Cyber9520 Video Accelerator
- 9525 Video Accelerator (Cyber9525)
- 9540 Video Acclerator (Cyber9540)
- 9660 TGUI9660XGi/968x/938x GUI Accelerator
- 9680 GUI Accelerator (TGUI9680)
- 9682 TGUI9682 Multimedia Accelerator
- 9683 GUI Accelerator (TGUI9683)
- 9685 2MB VGA (ProVIDIA 9685)
- 9750 trident dgi (3DImage 9750 PCI/AGP)
- 9753 Video Accelerator (TGUI9753)
- 9754 Wave Video Accelerator (TGUI9753)
- 9759 Image GUI Accelerator (TGUI975?)
- 9783 TGUI9783
- 9785 TGUI9785
- 9850 4mb (3D Image 9850 AGP)
- 9880 gggggg (Blade 3D 9880)
- 9910 CyberBlade XP (00011178)
- 9930 CyberBlade/XPm
- 9960 Trident Video Accelerator CyberBlade-1A31 (9960)
-1024 Zenith Data Systems
-1025 Acer Incorporated
- 0028 Agere Systems soft modem chip (AC97 ID:SIL REV:0x27, 08)
- 1435 CPU to PCI & PCI to ISA Bridge (M1435)
- 1445 ALI M1445 VL to PCI Bridge & Enhanced IDE Adapter
- 1449 ALI M1449 PCI to ISA Bridge
- 1451 ALI M1451 Pentium Chipset
- 1461 ALI M1461 P54C Chipset
- 1489 ALI M1489 486 Chipset
- 1511 ALI M1511 Aladdin
- 1512 ALI M1512 Aladdin
- 1513 ALI M1513 Aladdin
- 1521 ALI M1521 Aladdin III CPU Bridge
- 1523 ALI M1523 ISA Bridge
- 1531 ALI M1531 Aladdin IV/IV+ North Bridge
- 1533 ALI M1533 Aladdin IV/V ISA South Bridge
- 1535 ALI M1535 Aladdin V+ PCI South Bridge
- 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge
- 1542 ALI M1542 Aladdin V/V+ AGP+PCI North Bridge
- 1543 PCi South Bridge Aladdin IV+/V (M1543C)
- 1561 ALI M1561 Northbridge [Aladdin 7]
- 1621 ALI M1621 Aladdin Pro II PCI North Bridge
- 1631 ALI M1631 Aladdin Pro III PCI North Bridge
- 1641 ALI M1641 Aladdin Pro IV PCI North Bridge
- 3141 ALI M3141 GUI Accelerator, 2 MB Video-RAM
- 3143 ALI M3143 GUI Accelerator, 2 MB Video-RAM with DAC
- 3145 ALI M3145 GUI Accelerator, 2 MB Video-RAM
- 3147 ALI M3147 GUI Accelerator, 2 MB Video-RAM with DAC
- 3149 ALI M3149 GUI Accelerator, 4 MB Video-RAM
- 3151 ALI M3151 GUI Accelerator, 8 MB Video-RAM
- 3307 ALI M3307 MPEG-1 Decoder
- 3309 ALI M3309 MPEG Decoder
- 3321 ALI M3321 MPEG-II Decoder
- 5212 ALI M4803
- 5215 EIDE Controller (M5217)
- 5217 ALI M5217 I/O Controller
- 5219 ALI M5219 I/O Controller
- 5225 ALI M5225 EIDE Controller
- 5229 ALI M5229 EIDE Controller
- 5235 ALI M5235 I/O Controller
- 5237 PCI USB Host Controller (M5237)
- 5239 ALI M5273 USB 2.0 Controller
- 5240 EIDE Controller
- 5241 PCMCIA Bridge
- 5242 General Purpose Controller
- 5243 PCI to PCI Bridge Controller
- 5244 Floppy Disk Controller
- 5247 ALI M1541 PCI to PCI Bridge
- 5251 ALI M5251 P1394 OHCI Controller
- 5427 ALI PCI to AGP Bridge
- 5451 ALI M5451 PCI AC-Link Controller Audio Device
- 5453 ALI M5453 PCI AC-Link Controller Modem Device
- 7101 ALI M7101 PCI PMU Power Management Controller
-1028 Dell Computer Corporation
- 0001 Expandable RAID Controller (PERC) (SCSI) (PowerEdge 2 /Si)
- 0002 Expandable RAID Controller (PowerEdge 3/Di)
- 0003 Expandable RAID Controller (PowerEdge 3/Si)
- 0004 Expandable RAID Controller (PowerEdge 3/Si)
- 0005 Expandable RAID Controller (PowerEdge 3/Di)
- 0006 Expandable RAID Controller (PowerEdge 3/Di)
- 0007 Remote Assistant Card 3
- 0008 PowerEdge Expandable RAID Controller 3/Di
- 000A Expandable RAID Controller (PowerEdge 3/Di)
- 000C Embedded Systems Management Device 4 (53C885 23800 SCSI Adapter)
- 000D LSI53C895 PCI to Ultra2 SCSI I/O Processor with LVD Link
- 000E PERC 4/DI Raid Controller (000E)
- 000F PERC 4/Di RAID Controller
- 0011 Dell Remote Access Controller v4 (DRAC4)
- 0012 Dell RAC v4 Virtual UART (DRAC4-UART)
- 0013 Expandable RAID Controller (PERC 4e/Si and PERC 4e/Di)
- 0014 Dell Remote Access Controller subsystem (DRAC4-0)
- 0015 Integrated RAID controller (PERC 5/i RAID Controller)
- 012C Intel Gigabit controller
- 0287 Adaptec 2200S SCSI RAID controller (DELL PERC 320/DC)
- 1000 A Intel 537 epg v.92 modem repackaged by dell (FA82537EP)
- 1F0C Dell PERC 6/i Integrated RAID Controller (1078)
-1029 Siemens Nixdorf AG
-102A LSI Logic, Headland Division
- 0000 HYDRA Pentium PCI Chipset (MPI)
- 0010 ASPEN 486 PCI Chipset
- 0310 L64364 ATMizer r II+ ATM-SAR Chip
- 9876 P5 CHIPSET (HYDRA)
-102B Matrox Electronic Systems Ltd.
- 0010 MGA-I (Impression??)
- 0040 Matrox P650 very new model (20080724) (chip=0x2539102b)
- 0518 Atlas GUI Accelerator (MGA-PX2085)
- 0519 MGA-2064W Storm (Millennium board)
- 051A Hurricane/Cyclone 64-bit graphics chip (mga-1164sg-a)
- 051B MGA-2164W Millennium II PCI
- 051E MGA-1164SG Mystique 220 AGP
- 051F MGA-2164WA Millennium II AGP
- 0520 AGP (Matrox lnc MGA-G200B)
- 0521 102B (Matrox lnc MGA-G200B)
- 0522 Matrox G200e (ServerEngines) - English (G200e)
- 0525 Chip of G450 graphics card (MGA G450 Dual Head)
- 0527 Parhelia AGP
- 0528 Parhelia 128MB/256MB/PCI/HR256 (Parhelia)
- 0D10 MGA-I Athena (Ultima/Impression board)
- 1000 MGA-G100 Chipset PCI
- 1001 Twister AGP (MGA-G100)
- 1525 Fusion G450 AGP
- 1527 Fusion Plus G800 AGP
- 2007 GUI+3D Accelerator (Mistral)
- 2527 AGP Chipset (MGA-G550)
- 2537 Parhelia Chipset AGP (Parhelia-LX)
- 2538 Matrox Millennium P650 LP PCIe 64 (Matrox Millennium P650 LP PCIe 64)
- 2539 Millennium P690
- 4536 Video Capture Card (Meteor 2 STD/MC/Dig)
- 6573 10/100 Multiport Switch NIC (Shark)
- 80A0 Multimedia Device (RT.x10)
- 9876 Multimedia device (RT 2000)
-102C Asiliant (Chips And Technologies)
- 00B8 Wingine DGX - DRAM Graphics Accelerator (64310)
- 00C0 AGP/PCI Flat Panel/CRT VGA Accelerator (69000)
- 00D0 F65545 Flat Panel GUI Accelerator
- 00D8 Flat Panel/CRT VGA Controller (65540)
- 00DC F65548 Flat Panel GUI Accelerator
- 00E0 F65550 HiQV32 GUI Accelerator
- 00E4 Flat Panel/LCD CRT GUI Accelerator
- 00E5 F65555 HiQVPro GUI Accelerator
- 00F0 vga Controller
- 00F4 F68554 HiQVision GUI Controller
- 00F5 GUI Controller
- 01E0 PCI Flat Panel/CRT VGA Accelerator (65560)
- 0C30 AGP/PCI Flat Panel/CRT VGA Accelerator (69030)
-102D Wyse Technologies
- 50DC 3328 Audio
-102E Olivetti Advanced Technology
-102F Toshiba America
- 0009 CPU Bridge (r4x00)
- 000A TX3927 MIPS RISC PCI Controller
- 0020 ATM PCI Adapter (Meteor 155)
- 0030 PCIVEN_104C&DEV_803B&SUBSYS_8212104D&REV_004&6B16D5B&0&1AF0 (TC35815CF)
- 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
- 0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939
- 0105 GOKU-S Bus Master IDE Controller (TC86C001FG)
- 0106 GOKU-S USB Host Controller (TC86C001FG)
- 0107 GOKU-S USB Device Controller (TC86C001FG)
- 0108 GOKU-S I2C Bus/SIO/GPIO Controller (TC86C001FG)
- 0180 TX4927/38 MIPS RISC PCI Controller
- 0181 MIPS RISC PCI Controller (PCIC) (TX4925)
- 0182 MIPS RISC PCI Controller (PCIC) (TX4937)
-1030 TMC Research
-1031 Miro Computer Products AG
- 5601 MiroVIDEO DC20 Video I/O & JPEG
- 5607 video in and out with motion jpeg compression and deco (2IVDC-PCX1 1250400 033893932)
- 5631 Media 3D
- 6057 DC30D-601601-4.0 (MiroVIDEO DC30D)
-1032 Compaq
-1033 NEC Electronics Hong Kong
- 0001 PCI to 486 like bus Bridge (upD98409)
- 0002 PCI to VL98 Bridge
- 0003 ATM Controller
- 0004 PCI bus Bridge (R4000)
- 0005 PCI to 486 like peripheral bus Bridge (pci 7432)
- 0006 GUI Accelerator
- 0007 PCI to ux-bus Bridge (unknown from Creative.com)
- 0008 GUI Accelerator (vga equivalent)
- 0009 GUI Accelerator for 98
- 0016 PCI to VL Bridge
- 001A [Nile II]
- 001D uPD98405 NEASCOT-S20 ATM Integrated SAR Controller
- 0021 Vrc4373 [Nile I]
- 0029 3D Accelerator (PoverVR PCX1)
- 002A 3D Accelerator (PoverVR)
- 002C Star Alpha 2
- 002D PCI to C-bus Bridge
- 002F 1394 Host Controller (NEC D72874GC)
- 0035 Dual OHCI controllers plus Single EHCI controller (udp9210)
- 0036 NEASCOT-S40C ATM Light SAR Controller (uPD98409)
- 003B PCI to C-bus Bridge
- 003E NAPCCARD CardBus Controller (uPD66369)
- 0046 3D Accelerator (PoverVR PCX2)
- 005A Vrc5074 [Nile 4]
- 0063 uPD72862 Firewarden OHCI Compliant FireWire Controller
- 0067 PowerVR series II graphics processor (PowerVR Neon 250)
- 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
- 0074 56k Voice Modem (NEC FMK 56 V90)
- 009B Vrc5476
- 00A5 VRC4173
- 00A6 VRC5477 AC97
- 00BE 64-bit CPU with Northbridge (VR4122)
- 00CD IEEE1394 1-Chip OHCI Host Controller (uPD72870)
- 00CE IEEE1394 1-Chip OHCI Host Controller (uPD72871/2)
- 00DF Vr4131
- 00E0 uPD720100A/101 USB 2.0 Enhanced Host Controller
- 00E7 IEEE1394 OHCI 1.1 2-port PHY-Link Ctrlr (uPD72874)
- 00F2 IEEE1394+OHCI+1.1+3-port+PHY-Link+Ctrlr (D72874GC)
- 00F3 uPD6113x Multimedia Decoder/Processor [EMMA2]
- 010C VR7701
- 0125 uPD720400 PCI Express - PCI/PCI-X Bridge
- 013A Angel Family MPEG Device
- 0520 1394 CARD (NEC D72874GC)
- 1033 NEC USB 2.0 Host Adapter (0720101gj)
-1034 Burndy/Framatome Connectors USA Ltd
-1035 Industrial Technology Research
-1036 Future Domain Corp
- 0000 TMC-18XX/TMC-3260 SCSI-2 Controller (36c70)
-1037 Hitachi Micro Systems Inc
-1038 AMP Incorporated
-1039 Silicon Integrated Systems (SiS)
- 0001 Virtual PCI-to-PCI bridge (AGP) (SiS760)
- 0002 Virtual PCI to PCI Bridge (AGP) (520)
- 0003 Virtual PCI to PCI Bridge (AGP) (SiS760)
- 0005 Pentium Chipset
- 0006 PCI/ISA Cache Memory Controller (PCMC) (SiS 85C501)
- 0008 SiS PCI to ISA Bridge (LPC Bridge)
- 0009 SiS600 Power Management Controller
- 0016 SiS961/2 SMBus Controller
- 0018 SiS950 PCI to ISA Bridge (LPC Bridge)
- 0160 SiS160 811 Wireless LAN Adapter (SiS160)
- 0180 Raid Controller(?Mode Raid0) (SiS180)
- 0181 Raid Controller(?Mode Raid1)
- 0182 Raid Controller(?Mode Raid0+1)
- 0183 ?SATA (?SIS965)
- 0186 ?
- 0190 SiS191 Gigabit LAN & SiS190 LAN (SiS968, SiS965, SiS966, SiS965L, SiS966L)
- 0191 SIS190 (SIS190)
- 0200 Onboard Graphics Controller (SiS5597/98)
- 0204 PCI1 (SiS 6215)
- 0205 SiS6205 GUI Accelerator with RAM-DAC, UMA-Support
- 0300 SiS300/SiS305 GUI Accelerator+3D
- 0305 2D/3D/Video/DVD Accelerator (SiS305)
- 0315 2D/3D Accelerator (SiS 315)
- 0325 Silicon Integrated Systems (SiS) (SiS6330)
- 0330 Xabre 2D/3D Accelerator (AG400T8-D64) (SiS330)
- 0406 PCI/ISA Cache Memory Controller (PCMC) (85C501)
- 0496 CPU to PCI & PCI to ISA Bridge (85C496)
- 0530 Host-to-PCI bridge (SiS530)
- 0540 Host-to-PCI Bridge (SiS540)
- 0550 SiS550/1/2 CPU to PCI Bridge
- 0596 Pentium PCI chipset with IDE (SiS596)
- 0597 EIDE Controller (step C) (SiS5513)
- 0601 SiS83C601 PCI Enhanced IDE Controller
- 0620 Host-to-PCI Bridge (SiS620)
- 0630 Host-to-PCI Bridge (SiS630)
- 0635 Host-to-PCI Bridge (SiS 635)
- 0640 Host-to-PCI Bridge (SiS 640)
- 0645 Host-to-PCI Bridge (SiS 645)
- 0646 Host-to-PCI Bridge (SiS645DX)
- 0648 Host-to-PCI Bridge (SiS648MX)
- 0649 SiS648FX(??) CPU to PCI Bridge
- 0650 Host-to-PCI Bridge (SiS961)
- 0651 Host-to-PCI Bridge (SiS651)
- 0652 SiSM650(??) CPU to PCI Bridge
- 0655 Host-to-PCI Bridge (SiS655)
- 0656 CPU to PCI Bridge
- 0658 CPU to PCI Bridge (SiS R658)
- 0659 CPU to PCI Bridge (SiS R659)
- 0660 Host-to-PCI Bridge
- 0661 CPU to PCI Bridge (SiS 661FX)
- 0662 CPU to PCI Bridge
- 0663 CPU to PCI Bridge
- 0730 Host-to-PCI Bridge (SiS 730)
- 0735 Host-to-PCI Bridge (SiS 735)
- 0740 SiS740 CPU to PCI Bridge
- 0741 CPU to PCI Bridge (SiS741)
- 0745 Host-to-PCI Bridge (SiS745)
- 0746 Host-to-PCI Bridge (SiS746)
- 0748 CPU to PCI Bridge (SiS748)
- 0750 SiS750 CPU to PCI Bridge
- 0755 Host-to-PCI Bridge (SiSM650?)
- 0756 CPU to PCI Bridge (SiS755FX)
- 0760 Athlon 64 CPU to PCI Bridge (SiS760)
- 0761 Athlon 64 CPU to PCI Bridge (88e8056)
- 0762 Athlon 64 CPU to PCI Bridge
- 0900 sis 900 and integrated lan (SiS 900)
- 0901 SiS900 10/100 Ethernet Adapter (Device ID = 0900 SiS900)
- 0962 LPC Bridge (SiS962)
- 0963 SiS963 PCI to ISA Bridge (LPC Bridge)
- 0964 LPC Bridge (SiS964)
- 0999 pciven_1039&subsys_200b163&rev_a03&61aaa010&17 (sis950)
- 1039 SiS5597 SVGAa (SiS5597a)
- 1040 ?
- 10EC ?
- 1182 SiS965/966 182/1182 RAID Controller
- 1183 ?SATA (?SIS966/968 )
- 1184 Raid/AHCI Controller (SIS966(AHCI)&*12289;SIS968(RAID))
- 1185 AHCI Controller (SIS968)
- 3602 IDE Controller (SiS83C602)
- 5107 Hot Docking Controller (SiS5107)
- 5300 SiS540 PCI Display Adapter
- 5315 GUI Accelerator (SiS530/1/2)
- 5401 486 PCI Chipset (SiS5401)
- 5511 PCI/ISA System Memory Controller (SiS5511/5512)
- 5513 PATA Controller (All SIS SouthBridge)
- 5517 SiS5517 Pentium Chipset, CPU to PCI Bridge
- 5518 UDMA IDE Controller (SiS5518)
- 5571 SiS5571 Pentium Chipset, CPU to PCI Bridge
- 5581 SiS5581 Pentium Chipset
- 5582 PCI to ISA Bridge (SiS5582)
- 5591 SiS5591/2 CPU to PCI Bridge
- 5596 PCI, Memory & VGA Controller (SiS5596)
- 5597 Host to PCI bridge (SiS5597)
- 5600 Host-to-PCI Bridge (SiS600)
- 5630 Host-to-PCI Bridge (SiS630)
- 5811 ?
- 6204 SiS6204 Video decoder & MPEG interface
- 6205 PCI VGA Controller (SiS6215)
- 6225 PCI Graphics & Video Accelerator (SiS 950 m2284dxs)
- 6236 SiS6236 AGP GUI Accelerator+3D
- 6300 GUI Accelerator+3D (SiS630/730)
- 6306 Integrated 3D SVGA Controller (SiS530/620)
- 6325 Sis 650 Integrated GFX Controller (IGP) (pc&*305;VEN_1039&DEV_6330)
- 6326 SiS6326 GUI Accelerator
- 6330 GUI 2D/3D Accelerator (SiS661FX/M661FX/760/741/M760/M741)
- 6342 SiS662/760GX/761/761GX
- 6351 IGP Graphics Drivers (SIS 651)
- 6972 ?
- 7001 SiS5597/8 Universal Serial Bus Controller
- 7002 USB 2.0 Enhanced Host Controller (SiS 7001 PCI to USB Open Host Controller)
- 7005 SiS551/552 Memory Stick Controller
- 7007 OHCI Compliant FireWire Controller (1039)
- 7012 PCI Audio Accelerator (SiS7012 + Realtek AC97 audio)
- 7013 Smart Link 56K Voice Modem (SiS7013)
- 7015 Software Audio dd (SiS550 dd)
- 7016 10/100 Ethernet Adapter (SiS7016)
- 7018 AC97(CMI973X) ..AUDIO Drivers (SiS7018)
- 7019 Hardware Audio (SiS550/1/2)
- 7300 GUI Accelerator+3D (SiS7013)
- 7502 Realtek HDA Audio Driver.
- 8139 2012 (2012)
- 9876 pci vga card for winxp & win2k (sis6215)
-103A Seiko Epson Corp
-103B Tatung Corp Of America
-103C Hewlett-Packard Company
- 0024 Standard Vista USB Keyboard
- 0A01 HP Scanjet 2400 (HP2400)
- 1005 Visialize EG (A4977A)
- 1008 001 (Donner GFX)
- 100A Hewlett-Packard VisualizeFX Series Video (hpVisualizeFX)
- 1028 Tachyon TL Fibre Channel Adapter (ACPI/HPQ0006)
- 1029 Tachyon XL2 Fibre Channel Adapter (HPFC-5200B)
- 102A Tachyon TS Fibre Channel Host Adapter (Tach TS)
- 1030 DeskDirect 10/100VG LAN Adapter (J2585B)
- 1031 DeskDirect 10/100 NIC (J2585B222)
- 1040 DeskDirect 10BaseT NIC (J2973A)
- 1041 DeskDirect 10/100VG NIC (J2585B)
- 1042 DeskDirect 10BaseT/2 NIC (J2970A)
- 1048 SAS
- 1049 DIVA1
- 104A DIVA2
- 104B SP2
- 104D EL-10 Ethernet Adapter (J3242A)
- 1054 PCI Local Bus Adapter
- 1064 PCnet Ethernet Controller (79C970)
- 108B Visualize FXe
- 10C1 NetServer Smart IRQ Router
- 10ED HP Communications Port (TopTools)
- 10F0 rio System Bus Adapter
- 10F1 rio I/O Controller
- 1200 10/100 NIC (82557B)
- 1219 NetServer PCI Hot-Plug Controller
- 121A NetServer SMIC Controller
- 121B NetServer Legacy COM Port Decoder
- 121C NetServer PCI COM Port Decoder
- 1229 System Bus Adapter (zx1)
- 122A I/O Controller (zx1)
- 122B Local Bus Adapter (zx1)
- 122E PCI-X Local Bus Adapter
- 127B sx1000 System Bus Adapter
- 127C sx1000 I/O Controller
- 1290 Auxiliary Diva Serial Port
- 1291 Auxiliary Diva Serial Port
- 12B4 zx1 QuickSilver AGP8x Local Bus Adapter
- 12EB sx2000 System Bus Adapter
- 12EC sx2000 I/O Controller
- 12EE PCI-X 2.0 Local Bus Adapter
- 12F8 Broadcom BCM4306 802.11b/g Wireless LAN
- 12FA Broadcom Wireless miniPCI in a HP laptop (Broadcom BCM4306)
- 1302 HP Management Shared Memory Device (1302103C)
- 1303 RMP-3 (Remote Management Processor)
- 1361 BCM4312 802.11a/b/g WLAN Controller
- 137A Atheros AR5007 (AR5007)
- 1411 HP PSC 750 (HPOJ750)
- 1F1D 3G Broadband device
- 201D 3G Broadband device
- 231D 3G Broadband device
- 2910 PCI Bus Exerciser (E2910A)
- 2920 Fast Host Interface
- 2924 PCI Host Interface Adapter (E2924A)
- 2925 32 bit PCI Bus Exerciser and Analyzer (E2925A)
- 2926 64 bit PCI Bus Exerciser and Analyzer (E2926A)
- 2927 64 Bit, 66/50MHz PCI Analyzer & Exerciser (E2927a)
- 2940 64 bit, 66/50MHz CompactPCI Analyzer&Exerciser (E2940A)
- 3080 Pavilion ze2028ea
- 3085 Realtek RTL8139/8139C/8139C+
- 30B5 Compaq Presario V3000Z
- 31FB DL365 ATI ES1000 VGA controller
- 3206 Adaptec Embedded Serial ATA HostRAID (unknown)
- 3207 not sure (not sure)
- 3220 P600 SmartArray Raid Controller (P600)
- 3222 Smart Array SAS/SATA Controller
- 3230 Smart Array P400 Controller (Smart Array P400 Controller)
- 3231 Smart Array Controller
- 3232 Smart Array SAS/SATA Controller Test Board
- 3233 Smart Array Controller
- 3234 Smart Array Controller
- 3235 Smart Array Controller
- 3236 Smart Array Controller
- 3237 Smart Array Controller
- 3238 Smart Array E200/E200i SAS/SATA Controller
- 3239 Smart Array Controller
- 323A Smart Array P410i Controller (Smart Array P410i Controller)
- 323B Smart Array Controller
- 323C Smart Array Controller
- 3300 Proliant iLO2 virtual USB controller
- 3302 Integrated Lights Out 2.0 (3305103C)
- 3305 Proliant iLO2 [Integrated Lights Out] controller
- 4030 zx2 System Bus Adapter
- 4031 zx2 I/O Controller
- 4037 PCIe Local Bus Adapter
- 403B PCIe Root Port
- 5461 HP integrated Module with Bluetooth 2.0 Wireless support (unknown)
- 60E8 NetRAID-2M : ZX1/M (OEM AMI MegaRAID 493)
-103E Solliday Engineering
-103F Logic Modeling (Synopsys)
-1040 AccelGraphics Inc (Kubota Pacific)
-1041 Computrend
-1042 Micron (Was: PC Technology Inc)
- 1000 RZ1000 EIDE Controller
- 1001 RZ1001 EIDE Controller
- 3000 Samurai 0 CPU to PCI Bridge
- 3010 Samurai 1 CPU to PCI Bridge
- 3020 Samurai IDE Controller
- 3030 MT82P664 Samurai 64M2 North Bridge
- 3120 Samurai-DDR CPU to PCI Bridge
- 3130 Samurai-DDR AGP Controller
-1043 Asustek Computer Inc.
- 0675 Crestline (GML GL960)
- 1969 Attansic L1 Gigabit Ethernet 10/100/1000Base-T Adapter (P5LD2 - EAYZ)
- 5653 ATI Radeon Graphics Processor x700 Mobility [M26-X] (M26-X)
- 82C6 Gigabit Ethernet NIC(NDIS 6.0) (RTL8168/8111)
-1044 Adaptec (Formerly: Distributed Processing Technology (DPT))
- 1012 RAID Engine (Domino)
- A400 DPT 2124/9X SmartCache III/RAID SCSI Controller
- A500 PCI Bridge (unknown)
- A501 I2O SmartRAID V Controller
- A511 SmartRAID Controller (Raptor)
-1045 OPTi Inc.
- 0005 ?
- A0F8 82C750 Vendetta Chipset USB Controller
- C101 GUI Accelerator (82C264)
- C178 pci usb card 2- port (82C178)
- C556 Viper (82C556)
- C557 82C557/8 Viper-M Pentium Bridge
- C558 82C558 Viper PCI to ISA Bridge with PnP
- C567 82C750 Vendetta Chipset (Viper Max) CPU to PCI Bridge
- C568 82C750 Vendetta Chipset (Viper Max) PCI to ISA Bridge
- C569 82C579 Viper XPress+ Chipset, Pentium to PCI Bridge
- C621 82C621 IDE Controller (Single FIFO)
- C700 82C700 FireStar PCI to ISA Bridge (82C700)
- C701 FireStar mobile chipset: host bridge (82C701)
- C814 FireBridge II Docking Station Controller (82C814)
- C822 CPU to PCI & PCI to ISA PnP bridge (82C822)
- C824 FireFox 32-Bit PC Card Controller (82C824)
- C825 PCI-to-ISA Bridge (82C825 function 0)
- C832 82C832 CPU to PCI Bridge and PCI to ISA Bridge
- C861 FireLink PCI-to- 5 x USB Bridge( usb1.1 ) (82C861)
- C881 82C881 FireLink 1394 OHCI Firewire Link Controller
- C895 82C895
- C931 ISA Sound & Game Port controller. (82C931)
- C935 MachOne integrated PCI audio processor (82C935)
- D568 82C825 FireBridge II PCI EIDE Controller
- D768 82C750 Vendetta Chipset UDMA EIDE Controller
-1046 IPC Corp Ltd
-1047 Genoa Systems Corp
-1048 ELSA GmbH
- 0253 ELSA GLADIAC 528 (0x0c92)
- 0C60 NVidia Geforce 2 MX (Elsa Gladiac MX)
- 0C71 NVidia GeForce3 Ti 200 (Elsa Gladiac 721)
- 1000 ISDN Controller (Quick Step 1000)
- 3000 QuickStep 3000 ISDN Controller
- 8901 ELSA GLoria XL
-1049 Fountain Technology
-104A ST Microelectronics (SGS Thomson)
- 0008 diamond (STG 2000X)
- 0009 STG 1764X
- 0010 PowerVR KYRO series 3 graphics processor (STG4000)
- 0123 SPEAr1300 (V65204)
- 0209 STPC Consumer/Industrial North/South Bridge
- 020A STPC Atlas/Consumer-S/Consumer-II/Elite North Bridge
- 0210 ISA Bridge (STPC Atlas)
- 021A STPC Consumer-S/Elite ISA Bridge
- 021B ISA Bridge (STPC Consumer-II)
- 0228 IDE Controller (STPC Atlas)
- 0230 USB Controller (STPC Atlas)
- 0500 ADSL (ST70137)
- 0981 DEC-Tulip Compatible 10/100 Ethernet Adapter
- 1746 STG 1764X
- 2774 STE10/100A PCI 10/100 Ethernet Controller with PHY
- 3520 MPEG-II Video Decoder
- CC00 ConneXt I/O Hub multifunction device (STA2X11)
- CC01 ConneXt I/O Hub multifunction device (STA2X11)
- CC02 ConneXt I/O Hub multifunction device (STA2X11)
- CC03 ConneXt I/O Hub multifunction device (STA2X11)
- CC04 ConneXt I/O Hub multifunction device (STA2X11)
- CC05 ConneXt I/O Hub multifunction device (STA2X11)
- CC06 ConneXt I/O Hub multifunction device (STA2X11)
- CC07 ConneXt I/O Hub multifunction device (STA2X11)
- CC08 ConneXt I/O Hub multifunction device (STA2X11)
- CC09 ConneXt I/O Hub multifunction device (STA2X11)
- CC0A ConneXt I/O Hub multifunction device (STA2X11)
- CC0B ConneXt I/O Hub multifunction device (STA2X11)
- CC0C ConneXt I/O Hub multifunction device (STA2X11)
- CC0D ConneXt I/O Hub multifunction device (STA2X11)
- CC0E ConneXt I/O Hub multifunction device (STA2X11)
- CC0F ConneXt I/O Hub multifunction device (STA2X11)
- CC10 ConneXt I/O Hub multifunction device (STA2X11)
- CC11 ConneXt I/O Hub multifunction device (STA2X11)
- CC12 ConneXt I/O Hub multifunction device (STA2X11)
- CC13 ConneXt I/O Hub multifunction device (STA2X11)
- CC14 ConneXt I/O Hub multifunction device (STA2X11)
- CC15 ConneXt I/O Hub multifunction device (STA2X11)
- CC16 ConneXt I/O Hub multifunction device (STA2X11)
- CC17 ConneXt I/O Hub multifunction device (STA2X11)
- CD00 SPEAr1300 (V65204)
-104B Mylex / Buslogic
- 0140 BT-946C PCI-SCSI-2 MultiMaster
- 1040 BA80c30 PCI-SCSI MultiMaster
- 8130 BT-930/932/950/952 FlashPoint LT/DL/LW/DW Ultra(wide) SCSI
-104C Texas Instruments (TI)
- 014E device (4610,4515,4610fm)
- 0500 ThunderLAN 100 Mbit LAN Controller (TNETE100A/110A/211)
- 0508 PCI interface for TI380 compressors (TI380PCI)
- 1000 TI PCI Eagle i/f AS
- 104C PCI1510 PC Card CardBus Controller
- 3D04 Permedia (TVP4010)
- 3D07 AGP Permedia 2 (TVP4020)
- 8000 LYNX IEEE1394 FireWire Host Controller (TSB12LV21)
- 8009 OHCI-Lynx PCI IEEE 1394 Host Controller (TSB12LV22)
- 8010 OHCI-Lynx IEEE 1394 Host Controller (TSB12LV26)
- 8011 PCI4450 OHCI-Lynx IEEE-1394 FireWire Controller
- 8017 PCI4410A OHCI-Lynx IEEE-1394 FireWire Controller
- 8019 OHCI-Lynx PCI IEEE 1394 Host Controller (TSB12LV23)
- 8020 OHCI-Lynx PCI IEEE 1394 Host Controller (TSB12LV26)
- 8021 1394a-2000 OHCI PHY/Link Layer Ctrlr xxx (TSB43AA22xxx)
- 8022 TSB43AB22 1394a-2000 Controller (PHY/Link)
- 8023 IEEE1394a-2000 OHCI PHY/Link-Layer Ctrlr (TSB43AB21/A)
- 8024 TSB43AB23 1394a-2000 OHCI PHY/link-layer Controller
- 8025 1394b OHCI-Lynx IEEE 1394 Host Controller (TSB82AA2)
- 8026 TSB43AB21 1394a-2000 OHCI PHY/link-layer Controller
- 8027 PCI4451 OHCI-Lynx IEEE-1394 FireWire Adapter
- 8029 OHCI Compliant IEEE-1394 FireWire Controller (040803-2158)
- 802B PCI7410,7510,7610 OHCI-Lynx Controller
- 802E 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller (PCI7420)
- 8031 PCIxx21/x515 Cardbus Controller
- 8032 OHCI Compliant IEEE-1394 FireWire Controller
- 8033 PCIxx11/21 Integrated FlashMedia Controller
- 8034 SDA Standard Compliant SD Host Controller (10981734)
- 8035 PCI GemCore based SmartCard controller (N/A)
- 8036 Texas Instruments PCIxxx12 Cardbus Controller (PCI6515)
- 8038 Texas Instruments PCI GemCore SmartCard (FF001179)
- 8039 PCIxx12 Cardbus Controller
- 803A OHCI Compliant IEEE 1394 Host controller (PCIxx12)
- 803B Texas Instruments an Integrated FlashMedia Controller (PCIVEN_104C&DEV_803B&SUBSYS_207C17AA&REV_00)
- 803C SDA Standard Compliant SD Host Controller (PCIxx12)
- 803D Texas Instruments PCI GemCore based SmartCard controller (0780)
- 8119 iRDA Compatible Controller (na)
- 8201 TI UltraMedia Firmware Loader Device (006D103C)
- 8204 PCI 7510/4510 Cardbus Controller (4610, 4515, 4610FM, 7510)
- 8231 PCI-Express to PCI/PCI-X bridge (XIO2000A)
- 8235 XIO2200(A) IEEE-1394a-2000 Controller (PHY/Link)
- 8400 D-Link AirPlus DWL-520+, Uses a TI 802.11b 22 MBPS Chip (ACX100AGHK)
- 8401 ACX 100 22Mbps Wireless Interface
- 8671 bogus (bogus)
- 9000 Wireless Interface (??)
- 9065 Fixed Point Digital Signal Processor (TMX320C6412)
- 9066 U.S. Robotics 802.11g Wireless Turbo PC Card (USR5410)
- A001 TDC1570 64-Bit PCI ATM Interface
- A100 TDC1561 32-Bit PCI ATM Interface
- A102 TNETA1575 HyperSAR Plus w/PCI Host interface & UTOPIA Interface
- A106 TMS320C6205 Fixed Point DSP
- A186 TI C6416T DSP (TMS320C6416T)
- A828 PCI-to-PCI Bridge (PCI2050BPDV)
- AC10 PC Card Controller (PCI1050)
- AC11 PC Card Controller (PCI1030/1053)
- AC12 PC card CardBus Controller (PCI1131)
- AC13 PCIVEN_0180&DEV_0822&SUBSYS_01270025&REV_22 (PCI9066)
- AC15 PCI1131 PC Card CardBus Controller
- AC16 PC Card CardBus Controller (PCI1250)
- AC17 PCI1220 PC Card CardBus Controller
- AC18 PC card CardBus Controller (PCI1260)
- AC19 PC card CardBus Controller (PCI1221)
- AC1A PC card CardBus Controller (PCI1210)
- AC1B PC card CardBus Controller (PCI1450)
- AC1C PCI1225 PC Card CardBus Controller
- AC1D PCI1251 PC Card CardBus Controller
- AC1E PCI1211 PC Card CardBus Controller
- AC1F PC card CardBus Controller (PCI1251B)
- AC20 PCI to PCI Bridge (PCI2030)
- AC21 PCI to PCI Bridge (PCI2031)
- AC22 PCI Docking Bridge (PCI2032)
- AC23 PCI-to-PCI Bridge (PCI2250)
- AC28 PCI-to-PCI Bridge (PCI2050/2050I)
- AC30 PC card CardBus Controller (PCI1260)
- AC40 PC card CardBus Controller (PCI4450)
- AC41 PC card CardBus Controller (PCI4410)
- AC42 PC card CardBus Controller (PCI4451)
- AC43 PC card CardBus Controller (PCI4550)
- AC44 PC Card Controller SDFSDAFSADFSDAFSDAF (PCI4510SDFSDFSD)
- AC46 PCCard CardBus Controller (PCI4520)
- AC47 PCI7510 PC Card CardBus Controller
- AC48 PCI7610 PC Card CardBus Controller
- AC49 PCI7410 PC Card CardBus Controller
- AC4A PC Card CardBus Controller with SmartCard
- AC4B PC Card CardBus Controller with FlashMedia
- AC4C PC Card CardBus Controller with FlashMedia
- AC50 PC card cardBus Controller (PCI1410)
- AC51 PCI1420 PC Card CardBus Controller
- AC52 PC card CardBus Controller (PCI1451)
- AC53 PC card CardBus Controller - 5-in-1 Media Card Reader (PCI1421)
- AC54 PCI1620 PC Card CardBus Controller with UltraMedia
- AC55 PCCard CardBus Controller (PCI1520)
- AC56 PCCard CardBus Controller (PCI1510)
- AC57 PCCard CardBus Controller (PCI1530)
- AC58 PCCard CardBus Controller (PCI1515)
- AC59 PCI1621 PC Card CardBus Controller with UltraMedia
- AC5A PCI1610 PC Card CardBus Controller with UltraMedia
- AC60 PCI2040 PCI to DSP Bridge Controller
- AC8D PCI7620
- AC8E CardBus Controller (PCI7420)
- AC8F PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets
- B000 Device ID: 0xB001 (TMS320C645x)
- B001 DSP with a C64x+ core and M/S PCI interface (TMS320DM647-DM648)
- FE00 FireWire Host Controller (tsb12lv26)
- FE03 FireWire Host Controller (12C01A)
-104D Sony Corporation
- 8004 DTL-H2500 [Playstation development board]
- 8009 i.LINK FireWire PCI Host Controller (CXD1947)
- 8039 OHCI i.LINK (IEEE 1394) PCI Host Ctrlr (CXD3222)
- 8056 Rockwell HCF 56K Modem (0x127a)
- 808A Memory Stick Controller (Qc pass)
-104E Oak Technology Inc
- 0017 OTI-64017
- 0107 Spitfire VGA Accelerator (OTI107)
- 0109 Video Adapter
- 0111 OTI-64111 Spitfire
- 0217 OTI-64217
- 0317 OTI-64317
- 0611 T9732 (OTI-610)
-104F Co-Time Computer Ltd.
- 104F Multi I/O (iatca8262)
-1050 Winbond Electronics Corp.
- 0000 Ethernet Controller (NE2000 compatible) (004005-34c8c8)
- 0001 PCI/IDE controller (W83769F)
- 0033 Winbond W89C33 mPCI 802.11 Wireless LAN Adapter (W89C33)
- 0105 Ethernet Adapter (W82C105)
- 0628 PCI to ISA Bridge Set (W83628F/629D)
- 0840 100/10Mbps Ethernet Controller (W89C840F)
- 0940 W89C940 NE2000-Compatible Ethernet Adapter
- 1050 Video capture card mpeg-1 (W99200aF)
- 5A5A ELANC-PCI Twisted-pair Ether-LAN Ctrlr (W89C940F)
- 6692 W6692/A/CF ISDN S/T Controller
- 9921 MPEG1 capture card (W99200AF)
- 9922 W99200F/W9922PF MPEG1/2 Video Encoder
- 9960 Video Codec (W9960CF)
- 9961 H.263/H.261 Video Codec (W9961CF)
- 9970 W9970CF Video Accelerator
- 9971 W9971CF (W9971CF)
-1051 Anigma Corp.
- 0100 Motorola MC145575
-1052 Young Micro Systems(??)
-1053 Young Micro systems(??)
-1054 Hitachi Ltd
- 0001 PCI Bridge
- 0002 PCI Bus Controller
- 0003 ?
- 3009 2Gbps Fibre Channel to PCI HBA 3009
- 300A 4Gbps Fibre Channel to PCI-X HBA 300a
- 300B 4Gbps Fibre Channel to PCI-X HBA 300b
- 300F ColdFusion 3 Chipset Processor to I/O Controller
- 3010 ColdFusion 3 Chipset Memory Controller Hub
- 3011 ColdFusion 3e Chipset Processor to I/O Controller
- 3012 ColdFusion 3e Chipset Memory Controller Hub
- 3017 Unassigned Hitachi Shared FC Device 3017
- 3505 SuperH (SH) 32-Bit RISC MCU/MPU Series (SH7751)
-1055 Standard Microsystems Corp (Was: EFAR Microsystems)
- 0810 EFAR 486 Host Bridge
- 0922 EFAR Pentium Host Bridge
- 0926 ISA Bridge (I dont know pentium 133 intel everex setpnot mx)
- 9130 SLC90E66 Victory66 UDMA66 EIDE Controller (??)
- 9460 Victory66 PCI to ISA Bridge (SLC90E66)
- 9461 SLC90E66 Victory66 UDMA66 EIDE Controller
- 9462 Victory66 USB Host Controller (SLC90E66)
- 9463 Victory66 Power Management Controller (SLC90E66)
- E420 PCI 10/100 Ethernet controller (LAN9420/LAN9420i)
-1056 ICL
-1057 Motorola
- 0001 PCI Bridge / Memory Controller (PCIB/MC) (MPC105)
- 0002 PCI Bridge/Memory Controller (PCIB/MC) (MPC106)
- 0003 Integrated Processor (MPC8240)
- 0004 PCI Bridge/Memory Controller for PPC (MPC107)
- 0006 Integrated Processor (MPC8245)
- 0008 MPC8540
- 0009 MPC8560
- 0100 MC145575 (HCF-PCI)
- 0431 100VG Ethernet Controller (KTI829c)
- 1801 24-bit Digital Signal Processor (DSP56301)
- 1802 24-Bit Digital Signal Processor (DSP56305)
- 18C0 PowerQUICC II PCI Bridge (MPC8265A/66)
- 18C1 MPC8271/MPC8272
- 3052 MotorolaSM56Modem_PCI device (0644dfea15)
- 3055 Motorola SM56 Data Fax Modem - amilo pi 1536 (SM56)
- 3057 Modem Device on High Definition Audio Bus (HDAUDIOFUNC_02om&VEN_1057&DEV_3057&SUBSYS_0001000)
- 3410 Digital Signal Processor (DSP56361)
- 3421 Modem (56IVMR/Phoenix 56ISM)
- 4801 PowerPC Chipset (Raven)
- 4802 memory control chipset (Falcon)
- 4803 Hawk
- 4806 CPX8216
- 4809 HotSwap Controller (CPX8216T)
- 4D68 20268
- 5600 SM 56 PCI Speakerphone/Data,Fax Modem (WDM MOT8888)
- 5602 Motorola SM56 PCI Modem
- 5608 PCI Fax Voice Modem (52-6116-2A 21-864-4 OR 62802-51 QZ0024 M5T90-000)
- 5803 32-Bit Embedded PowerPC Processor (MPC5200)
- 5806 MCF54 Coldfire
- 5808 MPC8220
- 5809 MPC5200B
- 6400 MPC190 Security Processor (S1 family, encryption)
- 6405 MPC184 Security Processor (S1 family)
-1058 Electronics Telecommunication Research Inc (ETRI)
-1059 Kontron Canada (Was: Teknor Microsystems)
-105A Promise Technology Inc
- 0D30 MBUltra100/MBFastTrack100 Lite (PDC20265/R)
- 0D38 FastTrak66 Lite EIDE Controller (PDC20263)
- 1275 PDC20275 MBUltra133 EIDE Controller
- 1960 SuperTrak 66/100 RAID
- 1962 SuperTrak SX 6000
- 3318 PDC20318(??) FastTrak SATA150 TX4 Controller
- 3319 PDC20319(??) FastTrak SATA150 TX4 Controller
- 3371 PDC20371(??) FastTrak SATA150 TX2plus Controller
- 3373 FastTrak 378/SATA 378 RAID Controller (PDC20378)
- 3375 PDC20375(??) FastTrak SATA150 TX2plus Controller
- 3376 PDC20376 FastTrak 376 SATA/RAID Controller
- 3515 FastTrak TX43xx (PDC40719)
- 3519 FastTrak TX42xx (PDC40519)
- 3570 FastTrak TX2300 SATA300 Controller (PDC20771)
- 3571 Fasttrack TX2200 (PDC20571)
- 3574 Promise SATAII150 579 (tm) IDE Controller
- 3577 PDC40779 SATA-300 779
- 3D17 SATA 300 TX4 Controller (PDC40718-GP)
- 3D18 Promise SATAII150 518 (tm) IDE Controller
- 3D73 SATAII 300 TX2+ (PDC40775)
- 3D75 PDC20575 SATAII150 TX2plus
- 3F19 FastTrak TX2650/4650/4652 (scsi)
- 3F20 FastTrak TX2650(3F21)/4650(3F22)/PDC42819(3716) (PDC42819)
- 4302 SuperTrak EX Series (tm) Controller
- 4D30 FastTrack100 on Intel MB SE7500CW2 (PDC20267)
- 4D33 FastTrak/Ultra33 ATA RAID controller (PDC20246)
- 4D38 PDC20262 FastTrak66 EIDE Controller
- 4D68 Ultra100TX2/FastTrak100TX/LP (PDC20268/R)
- 4D69 PDC20269 Ultra133 TX2 EIDE Controller
- 5275 PDC20276 Ultra133 TX2/FastTrak TX Lite EIDE Controller
- 5300 EIDE Controller (DC5300)
- 6268 PDC20268R FastTrak100 TX2/TX4/LP EIDE Controller
- 6269 FastTrak TX2000 EIDE controller (PDC20271)
- 6300 FastTrak SX 8300
- 6301 FastTrak SX8300-1
- 6302 FastTrak SX 4300
- 6303 FastTrak SX 4300-1
- 6304 FastTrak SX8300-2
- 6305 FastTrak SX8300-3
- 6306 FastTrak SX 4300-2
- 6307 FastTrak SX 4300-3
- 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)
- 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller
- 6624 PDC20621 [FastTrak SX4100]
- 6626 PDC20618 (Ultra 618)
- 6629 FastTrak TX4000 Controller
- 7250 Vitesse 7250 SAS RAID
- 7275 PDC20277 FastTrak TX/SBFastTrak133 Lite EIDE Controller
- 8000 SATAII150 SX8
- 8002 SATAII150 SX8
- 8004 SATAII150 SX8
- 8006 SATAII150 SX8
- 8350 SuperTrak EX Series (tm) Controller
- 8650 SuperTrak EX SAS RAID
- C350 SuperTrak EX Series (tm) Controller
- E350 SuperTrak EX 243X0
-105B Foxconn International Inc
-105C Wipro Infotech Limited
-105D Number Nine Visual Technology
- 2309 GUI Accelerator (Imagine 128)
- 2339 Imagine 128 Series 2 (I128s2)
- 493D Revolution 3D (T2R)
- 5348 Revolution IV (Revolution IV)
-105E Vtech Engineering Canada Ltd
-105F Infotronic America Inc
-1060 United Microelectronics (UMC)
- 0001 UM82C881 486 PCI Chipset
- 0002 UM82C886 PCI to ISA Bridge
- 0101 UM8673F PCI Enhanced IDE Controller
- 0881 HB4 486 PCI Chipset (UM8881)
- 0886 UM8886 PCI to ISA Bridge
- 0891 Pentium CPU to PCI bridge (UM82C891)
- 1001 IDE Cntrlr (dual function) (UM886A)
- 673A UM8886 Enhanced IDE Controller
- 673B EIDE Master/DMA
- 8710 UM8710 GUI Accelerator
- 8821 CPU to PCI Bridge
- 8822 PCI to ISA Bridge
- 8851 Pentium CPU to PCI Bridge
- 8852 Pentium CPU to ISA Bridge
- 886A UM8886 PCI to ISA Bridge with EIDE
- 8881 HB4 486 PCI Chipset (UM8881F)
- 8886 ISA Bridge (w/o IDE support) (UM8886)
- 888A UM8886A
- 8891 UM8891 586 PCI Chipset
- 9017 Ethernet (UM9017F)
- 9018 Ethernet (UM9018)
- 9026 Fast Ethernet (UM9026)
- E881 UM8881 486 Chipset (Notebook)
- E886 UM8886 PCI to ISA Bridge with EIDE (Notebook)
- E88A PCI / ISA Bridge (UM8886N)
- E891 UM8891 Pentium Chipset (Notebook)
-1061 I.T.T. (X Tech)
- 0001 ITT AGX013/16 GUI Accelerator
- 0002 ITT 3204/3501 MPEG Decoder
-1062 Maspar Computer Corp
-1063 Ocean Office Automation
-1064 Alcatel CIT
-1065 Texas Microsystems
- 8139 Realtek 8139C Network Card (nic)
-1066 Picopower Technology (A division of National)
- 0000 VL Bridge (PT80C826)
- 0001 Vesuvius V1-LS System Controller (PT86C521)
- 0002 PT86C523 Vesuvius V3-LS PCI to ISA Bridge
- 0003 PT80C524 PCI to PCI Bridge [Nile]
- 0004 PT80C525 PCI to PCI Bridge [Nile-II]
- 0005 National PC87550 System Controller
- 8002 PT86C523 Vesuvius V3-LS ISA Bridge
-1067 Mitsubishi Electronics
- 0301 AccelGraphics AccelECLIPSE
- 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
- 0308 Tornado 3000 [OEM Evans & Sutherland]
- 1002 VG500 [VolumePro Volume Rendering Accelerator]
-1068 Diversified Technology
-1069 Mylex Corp
- 0001 DAC960P Wide-SCSI RAID Controller
- 0002 DAC960PD RAID Controller
- 0010 DAC960PG/PJ/PR/PT/PTL1/PRL RAID Controller
- 0020 DAC960LA
- 0050 AcceleRAID Disk Array
- B166 AcceleRAID 600/500/400/Sapphire Support Device
- BA55 eXtremeRAID support Device
- BA56 eXtremeRAID Disk Array
- BA57 eXtremeRAID 4000/5000 support Device
-106A Aten Research Inc
-106B Apple Computer Inc
- 0001 PowerPC Host-PCI Bridge (Bandit)
- 0002 I/O Controller (Grand Central)
- 0003 Control Video
- 0004 Video-in (PlanB)
- 0007 I/O Controller (OHare)
- 0009 BCM5703X (BCM5703X)
- 000C DOS on Mac
- 000E Mac I/O Controller (Hydra)
- 0010 Mac I/O Controller (Heathrow)
- 0017 Mac I/O Controller (Paddington)
- 0018 FireWire Controller (UniNorth)
- 0019 KeyLargo USB
- 001E UniNorth Internal PCI
- 001F Host-PCI bridge (UniNorth)
- 0020 AGP interface (UniNorth)
- 0021 UniNorth GMAC
- 0022 Keylargo Mac I/O Controller
- 0024 GMAC Ethernet Controller
- 0025 Pangea I/O Controller
- 0026 USB Interface (Pangea)
- 0027 AGP interface (Pangea)
- 0028 Pangea CPU to PCI Bridge
- 0029 Pangea CPU to PCI Bridge
- 002D AGP Bridge (UniNorth 1.5)
- 002E PCI Bridge (UniNorth 1.5)
- 002F Internal PCI (UniNorth 1.5)
- 0030 FireWire Controller (UniNorth/Pangea)
- 0031 UniNorth 2 FireWire
- 0032 UniNorth 2 GMAC (Sun GEM)
- 0033 UniNorth 2 ATA/100
- 0034 UniNorth 2 AGP
- 0035 UniNorth 2 PCI
- 0036 UniNorth 2 Internal PCI
- 003B Integrated ATA Controller (Intrepid)
- 003E KeyLargo/Intrepid Mac I/O
- 003F KeyLargo/Intrepid USB
- 0040 K2 KeyLargo USB
- 0041 K2 KeyLargo Mac/IO
- 0042 K2 FireWire
- 0043 K2 ATA/100
- 0045 K2 HT-PCI Bridge
- 0046 K2 HT-PCI Bridge
- 0047 K2 HT-PCI Bridge
- 0048 K2 HT-PCI Bridge
- 0049 K2 HT-PCI Bridge
- 004B U3 AGP
- 004C K2 GMAC (Sun GEM)
- 004F Mac I/O controler (Shasta)
- 0050 IDE controler (Shasta)
- 0051 Sungem ethernet controler (Shasta)
- 0052 Firewire controler (Shasta)
- 0053 PCI Bridge (Shasta)
- 0054 PCI Bridge (Shasta)
- 0055 PCI Bridge (Shasta)
- 0058 AGP Bridge (U3L)
- 0059 U3H AGP Bridge
- 0066 Intrepid2 AGP Bridge
- 0067 Intrepid2 PCI Bridge
- 0068 Intrepid2 PCI Bridge
- 0069 Intrepid2 ATA/100
- 006A Intrepid2 Firewire
- 006B Intrepid2 GMAC (Sun GEM)
- 008A Mac Pro RAID Card (Apple RAID Controller)
- 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)
-106C Hyundai Electronics America
- 8801 Dual Pentium ISA/PCI Motherboard
- 8802 PowerPC ISA/PCI Motherboard (P54C Tr8)
- 8803 Dual Window Graphics Accelerator
- 8804 PCI LAN Controller (ht019a)
- 8805 100-BaseT LAN Controller
-106D Sequent Computer Systems
-106E DFI Inc.
- 4362 Yukon PCI-E Gigabit Ethernet Controller (copper) (88E8053)
-106F City Gate Development Ltd
-1070 Daewoo Telecom Ltd
-1071 Mitac
- 8160 8060B Mobile Platform
-1072 GIT Co Ltd
-1073 Yamaha Corporation
- 0001 3D GUI Accelerator
- 0002 RPA3 3D-Graphics Controller (YGV615)
- 0003 YMF740 PCI Audio Controller
- 0004 PCI Audio Controller (YMF754B)
- 0005 DS1 Audio (DS1)
- 0006 DS1 Audio (DS1)
- 0008 DS1 Audio (DS1)
- 000A DS-1L PCI Audio Controller (YMF740)
- 000C DS-1L PCI audio controller (YMF740C)
- 000D Yamaha Onboard Sound System (YMF724F)
- 0010 DS-1 PCI audio controller (YMF744B-V)
- 0012 DS-1E PCI Audio Controller (YMF754B)
- 0020 DS-1 Audio
- 1000 Sound system (SW1000XG)
- 2000 Digital Mixing Card (DS2416)
-1074 Nexgen Microsystems
- 4E78 Nx586 Chipset (82C500/1)
-1075 Advanced Integration Research
-1076 Chaintech Computer Co Ltd
-1077 QLogic Corporation
- 1016 Single Channel Ultra3 SCSI Processor (ISP10160)
- 1020 QLA1020/104x Fast-Wide-SCSI "Fast!SCSI IQ" Host Adapter
- 1022 ISP1022A Fast-Wide-SCSI Host Adapter
- 1080 QLA1080 LVD SCSI Host Adapter
- 1216 Dual Channel Ultra3 SCSI Processor (ISP12160)
- 1240 QLA12xx 60-Bit Dual Chanel SCSI Host Adapter
- 1280 SCSI Host Adapter (ISP1280)
- 2020 Fast!SCSI Basic Adapter (ISP2020A)
- 2100 QLA2100 SANblade 2100 64bit FC-AL Adapter
- 2200 QLA2200 SANblade 2200 PCI FC-AL Adapter
- 2300 QLA2300 SANblade 2300 64-bit FC-AL Adapter
- 2312 QLA2312 SANblade 2300 64-bit FC-AL Adapter
- 2322 QLA2322 Fibre Channel Adapter
- 2422 QLogic PCI to Fibre Channel Host Adapter for QLA2460 (ISP2422)
- 2432 Dual Channel 4G PCIe Fibre Channel Adapter (ISP2432)
- 2532 8Gb PCIe x8 Single/Dual Fibre Channel HBA (ISP2532)
- 3010 QLA3010 Network Adapter
- 3022 QLA3022 Network Adapter
- 4000 QLA4000 SANblade 4000 iSCSI Adapter
- 4010 QLA4010 SANblade 4000 iSCSI Adapter
- 4022 QLA4022 iSCSI TOE Adapter
- 5432 QLogic Fibre Channel Adapter
- 6312 QLA6312 Fibre Channel Adapter
- 6322 QLA6322 Fibre Channel Adapter
- 6422 4-Gbps Fibre Channel to PCI-X 2.0 266MHz controller for Embedded Applications (EP2422)
- 6432 4-Gbps Fibre Channel to PCIe controller for Embedded Applications (EP2432)
-1078 Cyrix Corp (Now owned by VIA)
- 0000 Cx5520 ISA Bridge Rev.0
- 0001 Cyrix Integrated CPU (MediaGXm)
- 0002 Cx5520 ISA Bridge Rev.1
- 0100 5530 Kahula/Geode Legacy ISA Bridge
- 0101 SMI status and ACPI timer (Cx5530)
- 0102 5530 Kahula/Geode IDE Controller
- 0103 5530 Kahula/Geode Audio
- 0104 Video Controller (Cx5530)
- 0400 CPU to PCI Bridge (ZFMicro)
- 0401 Power Management Controller (ZFMicro)
- 0402 IDE Controller (ZFMicro)
- 0403 Expansion Bus (ZFMicro)
-1079 I-Bus
- 0D01 ?
-107A Networth
-107B Gateway 2000
-107C LG Electronics / Goldstar Co Ltd
-107D Leadtek Research
- 0000 S3-805/P86C850 GUI Accelerator
- 204D Winfast PX7800 GTX TDH [GeForce 7800 GTX]
- 2134 WinFast 3D S320 II
- 2971 WinFast A350 TDH MyViVo [GeForce FX 5900]
-107E Interphase Corp
- 0001 FRED Local Bus I/F to PCI Peripheral (FLIPPER)
- 0002 100 VG amylan Controller
- 0004 5526 Fibre Channel Host Adapter
- 0005 Fibre Channel Host Adapter (x526)
- 0008 (i)chipSAR+ 155 MBit ATM controller
- 9003 5535-4P-BRI-ST
- 9007 5535-4P-BRI-U
- 9008 5535-1P-SR
- 900C 5535-1P-SR-ST
- 900E 5535-1P-SR-U
- 9011 5535-1P-PRI
- 9013 5535-2P-PRI
- 9023 5536-4P-BRI-ST
- 9027 5536-4P-BRI-U
- 9031 5536-1P-PRI
- 9033 Adapter (5536-2P-PRI)
- 9060 6535 CompactPCI T1/E1/J1 Communications Controller
- 9070 4538 PMC T1/E1/J1 Communications Controller
- 9080 4532-002/005 PMC ATM Over OC-3/STM-1 Communications Controller
- 9081 4532-001/004 PMC ATM Over OC-3/STM-1 Communications Controller
- 9082 PMC ATM Over OC-3/STM-1 Comm Controller (4532-000/003)
- 9090 4531S-000/001 PMC ATM Over T3/E3 Communications Controller
- 90A0 4539 PMC Quad T1/E1/J1 Communications Controller
-107F Data Technology Corporation
- 0802 pinacale capture card (mb87j3560)
- 0803 EIDE Bus Master Controller
- 0806 EIDE Controller
- 1138 High Speed Parallel Port
- 2015 EIDE Controller
-1080 Cypress Semiconductor
- 0600 CPU to PCI & PCI to ISA Bridge (82C596/9)
- C691 AN2131QC 0230 (Cypress CY7c68001)
- C693 PCI to ISA Bridge (82C693)
-1081 Supermac Technology Inc
- 0D47 Radius PCI to NuBUS Bridge (2330)
-1082 EFA Corp Of America
-1083 Forex Computer Corporation
- 0001 PCI Enhanced IDE Adapter (FR710)
- 0613 Host Bridge (??)
-1084 Parador
-1085 Tulip Computers Int'l BV
- 0001 Datalaster Interface for OBD automotive (UsbDgn)
-1086 J. Bond Computer Systems
-1087 Cache Computer
- 9200 ?
-1088 Microcomputer Systems (M) Son
-1089 Data General Corp
-108A SBS Technologie (Was: Bit3 Computer)
- 0001 PCI-VME Bus Adapter (Model 617)
- 0003 not sure (not sure)
- 0010 VME Bridge (Model 618)
- 0040 dataBLIZZARD
- 3000 VME Bridge (Model 2106)
-108C Oakleigh Systems Inc
-108D Olicom
- 0001 Token-Ring 16/4 PCI Adapter (OC-3136/37)
- 0002 Fastload 16/4 PCI/III Token Ring Adapter (OC-3139f)
- 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter
- 0005 GoCard Token Ring 16/4 Adapter (OC-3250)
- 0006 RapidFire Token Ring 100 Adapter (OC-3530)
- 0007 RapidFire Token Ring 16/4 Adapter (OC-3141)
- 0008 RapidFire HSTR 100/16/4 Adapter (OC-3540)
- 000A RapidFire Token-Ring 16/4 PCI Adapter (OC-3150)
- 0011 Ethernet Controller (OC-2805)
- 0012 Ethernet PCI/II 10/100 Controller (OC-2325)
- 0013 OC-2183/2185 PCI/II Ethernet Controller
- 0014 Ethernet PCI/II 10/100 Controller (OC-2326)
- 0019 10/100 Ethernet Controller (OC-2327/50)
- 0021 155 Mbit ATM Adapter (OC-6151/52)
- 0022 ATM Adapter
-108E Sun Microsystems
- 0001 SPARC EBUS
- 1000 SPARC EBUS PCIO PCI I/O Controller
- 1001 Happy Meal Ethernet (PCIO)
- 1100 RIO EBUS
- 1101 RIO GEM
- 1102 RIO 1394
- 1103 RIO USB
- 1648 [bge] Gigabit Ethernet
- 2BAD Sun Gigabit Ethernet Card (GEM)
- 5000 UltraSPARC-IIi Advanced PCI Bridge (SME2411)
- 5043 Co-processor (SunPCI)
- 7063 PCI card with Intel or AMD processor (SunPCi)
- 8000 STP2223BGA UPA to PCI Bus Interface Module (U2P)
- 8001 PCI Bus Module (Schizo)
- 8002 Schizo+ PCI Bus Module
- A000 Sabre (UltraSPARC IIi)
- A001 Hummingbird (UltraSPARC IIe)
- A801 Tomatillo PCI Bus Module
- ABBA 10/100/1000 Ethernet adapter (CE (Cassini Ethernet))
-108F Systemsoft Corp
-1090 Encore Computer Corp
-1091 Intergraph Corporation
- 0020 3D Graphics Processor
- 0021 3D Graphics Processor w/Texturing
- 0040 3D Graphics Frame Buffer
- 0041 3D Graphics Frame Buffer
- 0060 Proprietary Bus Bridge
- 00E4 Powerstorm 4D50T
- 0720 Motion JPEG Codec
- 07A0 Sun Expert3D-Lite Graphics Accelerator
- 1091 Sun Expert3D Graphics Accelerator
-1092 Diamond Multimedia Systems
- 00A0 GUI Accelerator (SpeedStar Pro SE)
- 00A8 GUI Accelerator (SpeedStar 64)
- 0550 Viper V550
- 08D4 WinModem (Supra 2260)
- 094C SupraExpress 56i Pro (SupraExpress 56i Pro)
- 09C8 SupraExpress 56i Pro VCC (SUP2761)
- 1002 RS56-pci (R6793-12)
- 1092 2710a (Viper V330)
- 6120 DVD (Maximum)
- 8810 GUI Accelerator (Stealth SE)
- 8811 GUI Accelerator (Stealth 64/SE)
- 8880 Stealth Video GUI Accelerator
- 8881 GUI Accelerator (Stealth Video)
- 88B0 GUI Accelerator (Stealth 64 Video)
- 88B1 GUI Accelerator (Stealth 64 Video)
- 88C0 GUI Accelerator (Stealth 64)
- 88C1 GUI Accelerator (Stealth 64)
- 88D0 GUI Accelerator (Stealth 64)
- 88D1 GUI Accelerator (Stealth 64)
- 88F0 GUI Accelerator (Stealth 64 Video)
- 88F1 GUI Accelerator (Stealth 64 Video)
- 9876 Supra Express 56i Pro CW *2
- 9999 Diamand Technology DT0398 (Monster Sound)
-1093 National Instruments
- 0160 data adquisition input and output (PCI-DIO-96)
- 0161 Multifunction data acquisition board (PCI-1200)
- 0162 24MIO 6-03-2 (PCI-MIO-16XE-50)
- 1150 High Speed Digital I/O Board (PCI-DIO-32HS)
- 1170 PCI-MIO-16XE-10
- 1180 PCI-MIO-16E-1
- 1190 PCI-MIO-16E-4
- 11B0 PXI-6070E
- 11C0 PXI-6040E
- 11D0 PXI-6030E
- 11E0 PXI-6011E
- 1270 Multifunction Data Acquisition Card (PCI-6032E)
- 12B0 High Speed DIO (PCI-6534)
- 1310 Data Acquisition Device (PCI-6602)
- 1320 PXI-6533
- 1330 PCI-6031E
- 1340 Multifunction Data Acquisition Card (PCI-6033E)
- 1350 NI PCI-6071E Multifunction I/O & NI-DAQ (PCI-6071E)
- 1360 PXI-6602
- 14E0 PCI-6110
- 14F0 PCI-6111
- 17D0 PCI-6503
- 1870 PCI-6713
- 1880 PCI-6711
- 18B0 PCI-6052E
- 2410 PCI-6733
- 2890 PCI-6036E
- 28B0 I/O Terminal NI-DAQ (Legacy) and NI-DAQmx (NI 6014)
- 2A60 PCI-6023E
- 2A70 Multifunction Data Acquisition Card (PCI-6024E)
- 2A80 Multifunction Data Acquisition Card (PCI-6025E)
- 2B20 PCI-6527
- 2C80 PCI-6035E
- 2CA0 PCI-6034E Multifunction DAQ
- 70A9 PCI-6528 Digital I/O at 60V
- 70AF 16-Bit, 250 kS/s, 16 Analog Inputs (PCI-6221)
- 70B8 PCI-6251 M Series High Speed Multifunction DAQ
- 710E GPIB Controller Interface Board (PCIe-GPIB)
- 715D IMAQ-PCI-1426
- 71BC 16-Bit, 250 kS/s, 16 Analog Inputs (DSUB37) (PCI-6221 )
- B001 IMAQ-PCI-1408
- B011 IMAQ-PXI-1408
- B021 IMAQ-PCI-1424
- B031 IMAQ-PCI-1413
- B041 1pcs (IMAQ-PCI-1407)
- B051 IMAQ-PXI-1407
- B061 IMAQ-PCI-1411
- B071 IMAQ-PCI-1422
- B081 IMAQ-PXI-1422
- B091 bluethooth (IMAQ-PXI-1411)
- C801 GPIB Controller Interface Board (PCI-GPIB)
- C811 PCI-GPIB+
- C821 PXI-GPIB
- C831 PMC-GPIB
- C840 PCI-GPIB
- D130 2-port RS-232 Serial Interface Board (PCI-232/2)
-1094 First International Computers
-1095 Silicon Image Inc (Was: CMD Technology Inc)
- 0240 SATA/Raid controller(2XSATA150) (SIL3112)
- 0242 SATAII/Raid controller (SIL3132)
- 0244 eSATA/Raid controller (SIL3132)
- 0640 PCI-0640 EIDE Adapter (Single FIFO)
- 0641 PCI EIDE Adapter with RAID 1 (PCI0640)
- 0642 PCI-0642 EIDE Adapter with RAID 1
- 0643 PCI EIDE controller (PCI0643)
- 0646 PCI-0646 EIDE Adapter (Single FIFO)
- 0647 9738 (PCI0647)
- 0648 Bus Master Ultra DMA PCI-IDE/ATA Chip (PCI-648)
- 0649 PATA100 ATAPI/RAID Controller (PCI-649)
- 0650 PBC-0650A PCI Fast SCSI II Host Adapter
- 0670 USB0670 USB Controller
- 0673 USB0673 USB Controller
- 0680 SiI 0680 (Was: PCI-0680) Ultra ATA133 EIDE Controller
- 1392 High Definition Audio HDMI output (1390/1392)
- 2455 SATALink 4-Port PCI-X Host Controller (SI3124)
- 3112 SATA/Raid controller(2XSATA150) (SIL3112)
- 3114 SATALink/SATARaid Controller (Sil 3114)
- 3124 PCI-X to Serial ATA Controller (SiI 3124)
- 3132 PCI Express (1x) to 2 Port SATA300 (SiI 3132)
- 3512 SATALink/SATARaid Controller (Sil 3512)
- 3531 SiI 3531 SATA Controller
-1096 Alacron
- 1106 0x47204005&RE (0x3059)
- 3059 South Bridge (VT8235)
-1097 Appian Technology (ETMA)
- 0038 EIDE Controller (Single FIFO)
-1098 Quantum Designs H.K. Ltd
- 0001 EIDE Controller (QD8500)
- 0002 EIDE Controller (QD8580)
-1099 Samsung Electronics Co Ltd
-109A Packard Bell
- 8280 4 channel video digitizer card (0x036e)
-109B Gemlight Computer Ltd
-109C Megachips Corp
-109D Zida Technologies Ltd
-109E Conexant (Was: Brooktree Corp)
- 0350 Bt848AKPF video decoder (BT848KPF)
- 0351 tw card B t878 khf (B t878 khf)
- 0369 Video Capture (Bt878fusion 878a)
- 036C Bt879(??) Video Capture
- 036E Bt878/Fusion 878A Mediastream Controller
- 036F Video Capturee (Bt878)
- 0370 Video Capture (10 bit High qualtiy cap) (Bt880B)
- 0878 TV Video Capture: Hauppauge WinTV GO (SUBSYS_13EB0070&REV_11)
- 0879 Video Capture (Audio Section) (Bt879khf)
- 0880 Video Capture (Audio Section) (Bt880)
- 109E Multimedia Video Controller (Brooktree Corp BT848 SVR-2000 V1.02)
- 2115 BtV Mediastream Controller 9x (BtV 2115)
- 2125 BtV Mediastream Controller (BtV 2125)
- 2164 Display Adapter (BtV 2164)
- 2165 MediaStream Controller (BtV 2165)
- 8230 ATM Segment/Reassembly Controller (SRC) (BtV 8230)
- 8471 Bt8471 32 Channel HDLC Controller
- 8472 32/64-channel HDLC Controllers (Bt8471/72)
- 8474 128-channel HDLC Controller (Bt8474)
-109F Trigem Computer Inc.
- 036F Video Capturee (Bt878)
-10A0 Meidensha Corp
-10A1 Juko Electronics Inc Ltd
-10A2 Quantum Corp
-10A3 Everex Systems Inc
-10A4 Globe Manufacturing Sales
-10A5 Racal Interlan
-10A6 Informtech Industrial
-10A7 Benchmarq
-10A8 Sierra Semiconductor
- 0000 64-bit GUI Accelerator
-10A9 Silicon Graphics
- 0001 Crosstalk to PCI Bridge
- 0002 Linc I/O Controller
- 0003 IOC3 I/O Controller
- 0004 O2 MACE
- 0005 RAD Audio
- 0006 HPCEX
- 0007 RPCEX
- 0008 DiVO VIP
- 0009 Gigabit Ethernet (Alteon)
- 0010 Video I/O (AMP)
- 0011 GRIP
- 0012 SGH PSHAC GSN
- 1001 Magic Carpet
- 1002 Lithium
- 1003 Dual JPEG 1
- 1004 Dual JPEG 2
- 1005 Dual JPEG 3
- 1006 Dual JPEG 4
- 1007 Dual JPEG 5
- 1008 Cesium
- 2001 Fibre Channel
- 2002 ASDE
- 8001 O2 1394
- 8002 G-net NT
-10AA ACC Microelectronics
- 0000 ACC 2056/2188 CPU to PCI Bridge
- 2051 Laptop Chipset CPU Bridge
- 5842 Laptop Chipset ISA Bridge
-10AB Digicom
- 1005 USB Bluetooth (USBVID_0000&PID_00005&5657949&0&8)
-10AC Honeywell IAC
-10AD Winbond Systems Labs
- 0001 W83769F PCI EIDE Controller (Signle FIFO)
- 0003 SL82C103 EIDE Controller
- 0005 SL82C105 EIDE Busmaster Controller
- 0103 PCI-ide mode 4.5 Cntrlr (sl82c103)
- 0105 Sonata bus master PCI-IDE controller (W83789F)
- 0150 EIDE Controller
- 0565 PCI/ISA bridge (W83C553F)
-10AE Cornerstone Technology
- 0002 Graphics Controller
-10AF Microcomputer Systems
- 0001 IDE Controller
-10B0 CardExpert Technology
-10B1 Cabletron Systems Inc
-10B2 Raytheon Company
-10B3 Databook Inc
- 3106 DB87144 PCI to CardBus Bridge
- B106 SMC34C90 PCI to CardBus Bridge
-10B4 STB Systems
- 1B1D Velocity 128 3D
-10B5 PLX Technology Inc.
- 0324 ?
- 0364 PCI9080RDK-RC32364 PCI Reference Design Kit for PCI 9080
- 0401 PCI9080RDK-401B PCI Reference Design Kit for PCI 9080
- 0480 Integrated PowerPC I/O Processor (IOP 480)
- 0860 PCI9080RDK-860 PCI Reference Design Kit for PCI 9080
- 0960 PCI Reference Design Kit for PCI 9080 (PCI 9080RDK-960)
- 1030 ISDN card (Gazel R685)
- 1054 dual channel ISDN card (Gazel R697)
- 1076 VScom PCI-800S 8 x RS-232 Controller
- 1077 VScom PCI-400S 4 x RS-232 Controller
- 1078 Vision Systems VScom PCI-210 (PCI 9050)
- 1103 Vision Systems VScom PCI-200 (PCI 9050)
- 1146 Vision Systems VScom PCI-010S (PCI 9050)
- 1147 Vision Systems VScom PCI-020S (PCI 9050)
- 1151 ISDN card (Gazel R753)
- 1152 ISDN card (Gazel R753)
- 1860 PCI9054RDK-860 PCI Reference Design Kit for PCI 9054
- 2021 PCI9080 used in Daktronics VMax Quad Tansmitter Card
- 2288 Chrislin Industries Memory
- 2724 Thales PCSM Security Card
- 2748 TPCX Transientrecorder Card (9054)
- 3001 PCI9030RDK-LITE PCI Reference Design Kit for PCI 9030
- 30C1 cPCI9030RDK-LITE CompactPCI Reference Design Kit for PCI 9030
- 5406 PCI Reference Design Kit for PLX PCI 9054 (PCI RDK9054-LITE)
- 5601 32-bit; 66MHz PCI Bus Master I/O Accelerator, 17 x 17mm FPBGA (PCI 9056)
- 5602 PCI9056RDk-Lite PCI 9056 Rapid Development Kit
- 56C2 cPCI9056RDK-860 CompactPCI Rapid Design kit for PCI 9056
- 6140 PCI6140 32-bit 33MHz PCI-to-PCI Bridge
- 6150 PCI6150 32-bit 33MHz PCI-to-PCI Bridge
- 6152 PCI6152 32-bit 66MHz PCI-to-PCI Bridge
- 6154 PCI6154 64-bit 66MHz PCI-to-PCI Bridge
- 6254 PCI6254 64-bit 66MHz PCI-to-PCI Bridge
- 6466 GBP32 PCI Adaptive Switch Fabric Generator
- 6520 PCI6520 64-bit 133MHz PCI-X-to-PCI-X Bridge
- 6540 PCI6540 64-bit 133MHz PCI-X-to-PCI-X Bridge
- 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side)
- 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side)
- 7709 PCI9080RDK-SH3 PCI Reference Design kit for PCI 9080
- 8111 1 Lane PCI Express to PCI bridge (PEX8111); 1 Lane PCI Express to Generic Local Bus bridge (PEX8311) (PEX 8111, PEX 8311)
- 8112 1 Lane PCI Express to PCI bridge (PEX8112)
- 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge
- 8311 PEX8311 x1 Lane PCI Express-to-Generic Local Bus Bridge
- 8505 PEX 8505 5-lane, 5-port PCI Express Switch
- 8508 PEX 8508 8-lane, 5-port PCI Express Switch
- 8509 PEX 8509 8-lane, 8-port PCI Express Switch
- 8512 PEX 8512 12-lane, 5-port PCI Express Switch
- 8516 Versatile PCI Express Switch (PEX 8516)
- 8517 PEX 8517 16-lane, 5-port PCI Express Switch
- 8518 PEX 8518 16-lane, 5-port PCI Express Switch
- 8524 PEX 8524 24-lane, 6-port PCI Express Switch
- 8525 PEX 8525 24-lane, 5-port PCI Express Switch
- 8532 Versatile PCI Express Switch (PEX 8532)
- 8533 PEX 8533 32-lane, 6-port PCI Express Switch
- 8547 PEX 8547 48-lane, 3-port PCI Express Switch
- 8548 PEX 8548 48-lane, 9-port PCI Express Switch
- 8664 64-Lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch, 35 x 35mm FCBGA (PEX 8664)
- 9030 PCI SMARTarget I/O Accelerator (PCI 9030)
- 9036 Interface chip - value 1k (PCI9036)
- 9050 Target PCI Interface Chip - value 1k (PCI 9050)
- 9052 PCI 9052 Target PLX PCI Interface Chip (PCI 9052)
- 9054 PCI I/O Accelerator (PCI 9054)
- 9056 32-bit, 66 MHz PCI Bus-Mastering I/O Accelerator for PowerQUICC and Generic 32-bit, 66 MHz Local Bus (PCI9056)
- 9060 PCI Bus Master Interface Chip (PCI9060)
- 906D PCI Bus Master Interface Chip (PCI 9060SD)
- 906E PCI Bus Master Interface Chip (PCI 9060ES)
- 9080 High performance PCI to Local Bus chip (PCI 9080)
- 9601 PCI9656RDK-Lite Rapid Development Kit for PCI 9656
- 9610 PCI9610 64 bit 66MHz PCI Master I/O Accelerator
- 9656 PCI9656 64 bit 66MHz PCI I/O Accelerator
- 96C2 cPCI 9656RDK-860 CompactPCI Rapid Development Kit
- A001 GTEK Jetport II 2 port serial adapter
- A100 Blackmagic DeckLink
- A106 Blackmagic DeckLink
- C001 GTEK/Cronyx Omega-PCI 8/16/32 port serial adapter
- C860 cPCI 9054RDK-860 CompactPCI Reference Design Kit for PCI 9054
-10B6 Madge Networks
- 0001 Ringnode (PCI1b) (Smart 16/4)
- 0002 Ringnode (PCIBM2/CardBus) (Smart 16/4)
- 0003 Smart 16/4 Ringnode (Knossos Series)
- 0004 Smart 16/4 Ringnode Mk1 (PCIBM1)
- 0006 16/4 CardBus Adapter (Eric 2)
- 0007 Presto PCI
- 0009 Smart 100/16/4 PCI-HS Ringnode
- 000A Smart 100/16/4 PCI Ringnode
- 000B 16/4 CardBus Adapter Mk2
- 1000 Collage 25 ATM Adapter
- 1001 ATM adapter (Ambassador)
- 1002 ATM Adapter (Ambassador)
-10B7 3COM Corp, Networking Division
- 0001 3C985 1000BaseSX Gigabit Ethernet Adapter
- 0013 3Com11a/b/g Wireless PCI Adapter (3com p/n: 3CRDAG675)
- 0910 3C910-A01
- 1000 3COM 3C905CX-TXNM with 40-0664-003 ASIC (3C905CX-TXNM)
- 1006 Broadcom Corporation NetXtreme BCM5701 Gigabit Ethernet (14e4:1645)
- 1007 V.90 Mini-PCI Modem (3C556)
- 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]
- 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]
- 1700 Gigabit Ethernet PCI CODEC (3C940)
- 1F1F AirConnect Wireless LAN PCI Card (3CRWE777A)
- 3390 Token Link Velocity (3C339)
- 3590 TokenLink Velocity XL Adapter (3C359)
- 4500 3c450 Cyclone/unknown
- 5055 Laptop Hurricane (3C555)
- 5057 Megahertz 10/100 LAN CardBus PC Card (3C575)
- 5157 Megahertz 10/100 LAN CardBus PC Card (3C575B)
- 5257 Cyclone Fast Ethernet CardBus PC Card (3CCFE575CT)
- 5900 Ethernet III Bus Fast PCI (3C590)
- 5920 PCI/EISA 10Mbps Demon/Vortex (3C592)
- 5950 3C595 PCI Ethernet Adapter 100bTX
- 5951 3C595 PCI Ethernet Adapter 100bT4
- 5952 3C595 PCI Ethernet Adapter 100b-MII
- 5970 3C597 PCI/EISA 10/100 Demon/Vortex
- 5B57 Megahertz 10/100 LAN CardBus (3C595)
- 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]
- 6001 3CRWE154G72 [Office Connect Wireless LAN Adapter]
- 6055 10/100 Fast Ethernet MiniPCI Adapter (3C556)
- 6056 MiniPCI 10/100 Ethernet+Modem56k (see devid:1007) (3CN3AC1556B)
- 6560 3CCFE656 Cyclone Ethernet+56k Modem CardBus PC Card
- 6561 10/100 LAN+56K Modem CardBus PC Card (FEM656)
- 6562 3CCFEM656 [id 6562] Cyclone CardBus PC Card
- 6563 10/100 LAN+56K Modem CardBus PC Card (FEM656B)
- 6564 Cyclone CardBus PC Card (3CCFEM656)
- 6565 3CCFEM656C Global 10/100 Fast Ethernet+56K Modem CardBus PC Card
- 7646 Hurricane (3CSOHO100B-TX)
- 7770 AirConnect Wireless PCI
- 7940 3c803 FDDILink UTP Controller
- 7980 3c804 FDDILink SAS Controller
- 7990 3c805 FDDILink DAS Controller
- 80EB 3c940B 10/100/1000Base-T
- 8811 Token Ring Adapter
- 9000 Fast Etherlink PCI TPO NIC (3C900-TPO)
- 9001 Fast Etherlink XL PCI Combo NIC (3C900-COMBO)
- 9004 EtherLink XL TPO 10Mb (3C900-TPO)
- 9005 Fast Etherlink 10Mbps Combo NIC (3C900B-COMBO)
- 9006 EtherLink XL TPC (3C900B-TPC)
- 900A EtherLink PCI Fiber NIC (3C900B-FL)
- 9050 Fast Etherlink XL PCI 10/100 (3C905B - Combo)
- 9051 Fast Etherlink XL 10/100 (3C905-T4)
- 9054 3C905B-TX Fast Etherlink XL PCI
- 9055 Fast Etherlink 10/100 PCI TX NIC (3C905-TX)
- 9056 Fast EtherLink XL 10/100 (3C905B-T4)
- 9058 Deluxe EtherLink 10/100 PCI Combo NIC (3C905B-COMBO)
- 905A 3C905B-FX Fast Etherlink XL Fiber 10/100
- 9200 Fast EtherLink for PC Management NIC (3C905 CX-TXM)
- 9201 Integrated Fast Ethernet Controller (3C920B-EMB)
- 9202 3C920B-EMB-WNM Integrated Fast Ethernet Controller
- 9210 Integrated Fast Ethernet Controller (3C920B-EMB-WNM)
- 9300 3C910 Integrated Fast Ethernet Controller (3CSOHO100B-TX Compatible)
- 9800 Fast EtherLink XL Server Adapter2 (3C980-TX)
- 9805 3C980-TX 10/100baseTX NIC [Python-T]
- 9900 3C990-TX [Typhoon]
- 9902 EtherLink 10/100 PCI with 3XP Processor (3CR990-TX-95)
- 9903 EtherLink 10/100 PCI with 3XP Processor (3CR990-TX-97)
- 9904 3CR990B-TM-X Etherlink 10/100 with 3XP Processor
- 9905 100FX PCI Server NIC w/3XP (3C990B-FX)
- 9908 3CR990SVR95 Etherlink 10/100 Server with 3XP Processor
- 9909 3CR990SVR97 Etherlink 10/100 Server with 3XP Processor
- 990A EC990BSVR Etherlink 10/100 Server with 3XP Processor
- 990B 3C990SVR [Typhoon Server]
- D004 EtherLink XL PCI (3C900B-TPO)
-10B8 Standard Microsystems Corp (SMC,SMSC)
- 0005 EPIC/XF 10/100 Mbps Fast Ethernet Ctrlr (LAN83C170QF/171)
- 0006 EPIC/C Ethernet CardBus Integrated Ctrlr (LAN83C175)
- 1000 FDC (37C665)
- 1001 FDC (37C922)
- A011 Fast ethernet controller (83C170QF)
- B106 CardBus Controller (SMC34C90)
-10B9 Acer Labs Incorporated (ALi/ULi)
- 0101 PCI Audio Device (OEM) (CMI8338/C3DX)
- 0102 PCI Audio Device (OEM) (CMI8338/C3DX)
- 0111 C-Media Audio Device (OEM) (CMI8738/C3DX)
- 0780 Multi-IO Card
- 0782 Multi-IO Card
- 10B9 0402t505 CK46828100B (ALI M5273 A1)
- 1435 ALI M1435 VL to PCI Bridge
- 1445 ALI M1445 VL to PCI Bridge & Enhanced IDE Adapter
- 1449 ALI M1449 PCI to ISA Bridge
- 1451 Pentium CPU to PCI Bridge (M1451)
- 1461 ALI M1461 Pentium PCI Chipset
- 1489 ALI M1489 486 PCI Chipset
- 1511 Aladdin 2 Host Bridge (M1511)
- 1512 ALI M1512 Aladdin
- 1513 Aladdin 2 South Bridge (M1513)
- 1521 ALI M1521 Aladdin III CPU to PCI Bridge
- 1523 ALI M1523 ISA Bridge
- 1531 ALI M1531 Aladdin IV/IV+ CPU to PCI Bridge
- 1533 ALI M1533 Aladdin IV ISA Bridge
- 1535 ALI M1535x ISA Bridge
- 1541 ALI M1541 Aladdin V/V+ AGP System Controller
- 1543 Aladdin V chipset South Bridge (M1543 a1)
- 1561 North Bridge (M1561)
- 1563 ALI M1563 South Bridge with Hypertransport Support
- 1567 ALI M1567 South Bridge with Hypertransport Support
- 1573 ALI M1573 South Bridge with Hypertransport Support
- 1575 ALI M1575 South Bridge with Hypertransport Support
- 1621 ALI M1621 Aladdin Pro II AGP System Controller
- 1631 ALI M1631 Aladdin Pro III AGP System Controller
- 1632 ALI M1632 Aladdin i1 CyberBlade AGP System Controller
- 1641 ALI M1641 Aladdin Pro IV AGP System Controller
- 1644 ALI M1644 AGP System Controller
- 1646 ALI M1646 AGP System Controller
- 1647 ALI M1647 ALiMAGiK 1 AGP System Controller
- 1651 ALI M1651 Aladdin Pro V AGP System Controller
- 1661 ALI M1661 AGP System Controller
- 1667 ALI M1667 AGP System Controller
- 1671 ALI M1671 AGP System Controller
- 1672 ALI M1672 AGP System Controller
- 1681 P4 Nouth Bridge with HyperTransport (M1681)
- 1687 ALI M1687 K8 Northbridge with hypertransport
- 1689 ULi M1689 K8 Northbridge with AGP and hypertransport
- 1691 ALi M1691 Pentium 4/Pentium M Northbridge
- 1695 ULi M1695 K8 Northbridge with PCIe and hypertransport
- 3141 ALI M3141 GUI Accelerator 2Mb
- 3143 ALI M3143 GUI Accelerator 2Mb + DAC
- 3145 ALI M3145 GUI Accelerator 2Mb
- 3147 ALI M3147 GUI Accelerator 2Mb + DAC
- 3149 ALI M3149 GUI Accelerator 4Mb
- 3151 ALI M3151 GUI Accelerator 8Mb
- 3307 ALI M3307 MPEG-1 Decoder
- 3309 ALI M3309 MPEG Decoder
- 5212 ALI M4803
- 5215 ALI MS4803 PCI Enhanced IDE Controller
- 5217 ALI M5217 I/O Controller
- 5219 Ali M5219 PCI BUS MASTER IDE Controller
- 5225 ALI M5225 EIDE Controller
- 5228 M5228 PATA/RAID Controller (M1563)
- 5229 EIDE Controller (M5229 Southbridge)
- 5235 ALI M5235 I/O Controller
- 5236 EHCI USB 2.0 (M5273)
- 5237 OpenHCI 1.1 USB to 2.0 (M5273 A1 for windows 98)
- 5239 USB EHCI2.0 Controller (527210B9)
- 5240 EIDE Controller
- 5241 PCMCIA Bridge
- 5242 General Purpose Controller
- 5243 ALI M1541 PCI to AGP Bridge
- 5244 Floppy Disk Controller
- 5246 ULi AGP 3.0 Controller
- 5247 ALI M1621 PCI to AGP Bridge
- 5249 HyperTransport to PCI Bridge (M5249)
- 524B ALi PCIe Bridge
- 524C ALi PCIe Bridge
- 5251 IEEE P1394 OpenHCI 1.0 Controller (M5251)
- 5253 IEEE P1394 OpenHCI 1.0 Controller (M5253)
- 5261 ALI M5261 Fast Ethernet Controller
- 5263 ULi PCI Fast Ethernet Controller (Albatron K8ULTRA-U Pro)
- 5281 ALI M5281/5283 SATA/RAID Controller (M1565/1566)
- 5287 SATA/Raid controller (ULI M1573)
- 5288 M5288 SATA/Raid controller (ULI M1575/M1697 )
- 5289 M5289 SATA/Raid controller (ULI M1567/M1689 )
- 5427 ALI PCI to AGP Bridge
- 5450 Agere Systems AC'97 Modem
- 5451 ALI M5451 PCI AC-Link Controller Audio Device
- 5453 ALI M5453 PCI AC-Link Controller Modem Device
- 5455 AC'97 Audio Controller (M1563M Southbridge)
- 5457 AC97 Modem controller (M1563M)
- 5459 56k Voice Modem
- 545A 56K Voice Modem
- 5461 High Definition Audio Controller (M5461)
- 5471 Memory Stick Host (M1563M Southbridge)
- 5473 MMC/SD controller (M1563M Southbridge)
- 7101 ALI M7101 Power Management Controller
- 7471 Memory Stick Host (M1563M Southbridge)
- 9876 xhcth700000b (mdv92xp)
-10BA Mitsubishi Electronics Corp.
- 0301 GUI Accelerator
- 0304 AccelGALAXY A2100
-10BB Dapha Electronics Corp
-10BC Advanced Logic Research Inc
-10BD Surecom Technology
- 0803 Ethernet PCI Adapter ( MYSON Technology Inc SURECOM EP-320X-S 100/10M Et)
- 0E34 Ethernet Adapter (NE2000 PCI clone) (NE34)
- 5240 IDE Cntrlr (0055)
- 5241 PCMCIA Bridge
- 5242 General Purpose Controller
- 5243 Bus Cntrlr (00000000)
- 5244 Floppy Disk Controller
- 8139 realtek 8139c (surecom EP-320X-R adapter with realtek 8139c chip)
-10BE Tsenglabs International Corp
-10BF MOST Corp
-10C0 Boca Research Inc
-10C1 ICM Corp Ltd
-10C2 Auspex Systems Inc
-10C3 Samsung Semiconductor Inc
- 1100 SmartEther100 SC1100 LAN Adapter (i82557B)
- 8920 KS8920 Fast Ethernet Adapter
- 8925 KS8925 Fast Ethernet Adapter (??)
-10C4 Award Software International Inc
- 8363 s/n124102160
-10C5 Xerox Corp
-10C6 Rambus Inc
-10C7 Media Vision
-10C8 Neomagic Corporation
- 0000 Graphics Controller
- 0001 NM2070 MagicGraph 128
- 0002 NM2090 MagicGraph 128V
- 0003 MagicGraph 128ZV Video Controller (NM2093)
- 0004 MagicGraph 128XD (NM2160)
- 0005 MagicMedia 256AV (NM2200)
- 0006 NM2360 MagicMedia 256ZX / 256M6D
- 0016 MagicMedia 256XL+ (NM2380)
- 0025 NM2230 NeoMagic MagicMedia 256AV+
- 0083 Graphic Controller NeoMagic MagicGraph128ZV+ (NM2097)
- 8005 MagicMedia 256AV Audio Device (NM2200)
- 8006 MagicMedia 256ZX Audio Device (NM2360)
- 8016 MagicMedia 256XL+ Audio Device (NM2380)
-10C9 Dataexpert Corp
-10CA Fujitsu Microelectronic
-10CB Omron Corp
-10CC Mentor Arc Inc
- 0226 PCI to ISA Bridge
- 0257 CPU to PCI Bridge
- 0660 Articia S Host Bridge
- 0661 Articia S PCI Bridge
-10CD Advanced System Products (AdvanSys)
- 1100 PCI SCSI Host Adapter (ASC1100)
- 1200 ASC1200 PCI SCSI Host Adapter (Fast SCSI II)
- 1300 ASC1300 PCI SCSI Host Adapter (Fast Wide SCSI II)
- 2300 ASC2300 PCI SCSI Hode Adapter (Ultra-Wide SCSI II)
- 2500 PCI Ultra 80/160 SCSI Controllers (ASC38C0800/1600)
- 4000 ASC30c0400 FireWire OHCI Single-Chip Controller
-10CE Radius Inc
-10CF Fujitsu Ltd.
- 10C5 Serial Parallel Card (FMV-103)
- 2001 PCI SCSI Host Adapter (Fast Wide SCSI-2) (MB86605)
- 2002 Fast Wide SCSI Controller (MB86606)
- 2005 10/100 Fast Ethernet Adapter (MB86974)
- 200C IEEE1394 OpenHCI Controller (MB86974)
- 2010 OHCI FireWire Controller
- 2011 MPEG2 R-Engine (MPEG2 Hardware Encoder)
- 2019 Coral-P Graphics Chip (MB86295)
- 201E Coral-PA Graphics Chip (MB86296)
- 202B Carmine Graphisc adapter (mb86297)
-10D0 Fujitsu Ltd
-10D1 FuturePlus Systems
-10D2 Molex Incorporated
-10D3 Jabil Circuit Inc
-10D4 Hualon Microelectronics
-10D5 Autologic Inc
-10D6 Wilson .co .ltd
- FF51 C87899D (0x0100)
- FF66 C87899D (0x0100)
-10D7 BCM Advanced Research
-10D8 Advanced Peripherals Labs
-10D9 Macronix International Co. Ltd.
- 0066 sdas (MX86101P)
- 0431 MX98715
- 0512 MX98713 Fast Ethernet Adapter (PN102TX)
- 0531 Single Chip Fast Ethernet NIC Controller (MX98715/25)
- 0532 PCI/CardBus Fast Ethernet Controller (MX98723/727)
- 0553 Ethernet Adapter (MX987x5)
- 8625 xiankasqudong (MX86250)
- 8626 MX86251+3Dfx Voodoo Rush
- 8627 Voodoo Rush MX86251 (MX86251FC)
- 8888 9619E (MX86250)
- C115 lc82c115
-10DA Thomas-Conrad Corp
- 0508 TC4048 Token Ring
- 3390 Tl3c3x9 Token Ring
-10DB Rohm LSI Research
-10DC CERN-European Lab. for Particle Physics
- 0001 PCI-SCI PMC mezzanine (STAR/RD24)
- 0002 SCI bridge on PCI 5 Volt card (ATT 2C15-3 (FPGA))
- 0004 ALTERA STRATIX (EP20S780)
- 0010 Simple PMC/PCI to S-LINK interface (680-1110-150/400)
- 0011 Simple S-LINK to PMC/PCI interface (680-1110-200/450)
- 0012 32-bit S-LINK to 64-bit PCI interface (S32PCI64)
- 0021 HIPPI destination
- 0022 HIPPI source
- 0033 ALICE DDL to PCI interface (RORC) (EP20KE (APEX-FPGA))
- 0101 Acquisition card for the SPS Orbit System (MACI) (SL651 7057 C200)
- 016A CALICE ODR (XC4VFX100)
- 10DC TTC sr first TTC chip receiver PMC (ATT 2C15-3 (FPGA))
-10DD Evans & Sutherland
- 0001 3D Graphics Processor (?? Freedom GBbus??)
- 0100 Lightning 1200
-10DE NVIDIA Corporation
- 0001 SoundMAX Integrated Digital Audio (Lucent 0x00da)
- 0003 nVIDIA High Definition Audio/HDMI (It seems to be Realtek ALC888/9)
- 0006 realtec based HD Audio (nvidia)
- 0008 NV1 EDGE 3D Accelerator [NV1]
- 0009 NV1 EDGE 3D Multimedia [NV1]
- 0010 Mutara V08 [NV2]
- 0018 Riva 128 Graphics Accelerator [NV3]
- 0019 Riva 128ZX GUI+3D Accelerator [NV3]
- 0020 Riva TNT GUI+3D Accelerator [NV4]
- 0028 NVIDIA RIVA TNT2/TNT2 Pro (NV05)
- 0029 NVIDIA RIVA TNT 2 Ultra (NV05)
- 002A Riva TNT2 [NV5]
- 002B Riva TNT2 [NV5]
- 002C NVIDIA Vanta/Vanta LT (NV05)
- 002D NVIDIA RIVA TNT2 Model 64/Model 64 Pro (NV05)
- 002E Vanta [NV6]
- 002F Vanta [NV6]
- 0030 nForce4 Intel Edition LPC Bridge
- 0034 MCP04 SMBus Controller
- 0035 nForce4 Intel Edition Parallel ATA Controller
- 0036 nForce4 Intel Edition Serial ATA Controller
- 0037 MCP04 Ethernet Controller
- 0038 MCP04 Ethernet Controller
- 003A MCP04 AC'97 Audio Controller
- 003B MCP04 USB Controller
- 003C MCP04 USB Controller
- 003D MCP04 PCI Bridge
- 003E nForce4 Intel Edition Serial ATA Controller
- 003F nForce4 Intel Edition HyperTransport Registers
- 0040 NVIDIA GeForce 6800 Ultra (NV40)
- 0041 NVIDIA GeForce 6800 (NV40)
- 0042 NVIDIA GeForce 6800 LE (NV40)
- 0043 NVIDIA GeForce 6800 XE (NV40)
- 0044 NVIDIA GeForce 6800 XT (NV40)
- 0045 NVIDIA GeForce 6800 GT (NV40)
- 0046 NVIDIA GeForce 6800 GT (NV45)
- 0047 NVIDIA GeForce 6800 GS (NV40)
- 0048 NVIDIA GeForce 6800 XT (NV40)
- 0049 NVIDIA NV40GL (NV40)
- 004D NVIDIA Quadro FX 3400 (NV40)
- 004E NVIDIA Quadro FX 4000 (NV40)
- 0050 nForce4 PCI to ISA Bridge
- 0051 nForce4 ISA Bridge
- 0052 nForce4 SMBus
- 0053 nForce4 Parallel ATA Controller
- 0054 CK804 SATA/RAID Controller (CK804)
- 0055 CK804 SATA/RAID Controller (CK804)
- 0056 nForce4 Ethernet Controller
- 0057 NVIDIA Network Bus Enumerator (CK804)
- 0058 nForce4 AC'97 Modem
- 0059 nForce Audio Controller (unknown)
- 005A nForce4 USB Controller
- 005B nForce4 USB 2.0 Controller
- 005C nForce4 PCI Bridge
- 005D nForce4 PCIe Bridge
- 005E nForce4 Memory Controller
- 005F nForce4 Memory Controller
- 0060 PCI to ISA Bridge (MCP2)
- 0064 nForce 2 SMBus Controller (MCP)
- 0065 PATA Controller (nForce MCP2/MCP2-T/MCP2-U)
- 0066 nForce 2 Networking Controller (MCP2)
- 0067 Nvidia 7050 chipset HDMI Audio (MCP2)
- 0068 nForce2 EHCI USB 2.0 Controller
- 0069 nForce AC'97 Modem
- 006A nForce AC97 Audio Controller (MCP2)
- 006B Audio Processing Unit (Dolby Digital) (nForce MCP-T?)
- 006C nForce MCP-T CPU to PCI Bridge
- 006D Audio Codec Interface (nForce MCP-T)
- 006E OHCI Compliant IEEE 1394 Controller (nForce MCP2)
- 006F nForce4 Intel Edition Memory Registers
- 0071 nForce4 Intel Edition CPU to PCI Bridge
- 0075 nForce4 Intel Edition Memory Registers
- 0076 nForce4 Intel Edition Memory Registers
- 0078 nForce4 Intel Edition Memory Registers
- 0079 nForce4 Intel Edition Memory Registers
- 007A nForce4 Intel Edition Memory Registers
- 007B nForce4 Intel Edition Memory Registers
- 007C nForce4 Intel Edition Memory Registers
- 007D nForce4 Intel Edition Memory Registers
- 007E nForce4 Intel Edition PCIe Root Hub
- 007F nForce4 Intel Edition Memory Registers
- 0080 nForce MCP2S PCI to ISA Bridge
- 0084 nForce MCP2S PCI System Management
- 0085 nForce MCP2S Parallel ATA Controller
- 0086 nForce MCP2A Ethernet Controller
- 0087 nForce MCP2A USB Controller
- 0088 nForce MCP2A USB Controller
- 0089 nForce AC'97 Modem
- 008A nForce AC'97 Audio Codec Interface
- 008B nforce MCP2A PCI Bridge
- 008C Single-Port 10/100M Fast Ethernet PHYceiver (RLT8201BL)
- 008E nForce MCP2S Serial ATA Compatible Controller
- 0090 NVIDIA GeForce 7800 GTX (G70)
- 0091 NVIDIA GeForce 7800 GTX (G70)
- 0092 NVIDIA GeForce 7800 GT (G70)
- 0093 NVIDIA GeForce 7800 GS (G70)
- 0094 NVIDIA GeForce 7800SE/XT/LE/LT/ZT (G70)
- 0095 NVIDIA GeForce 7800 SLI (G70)
- 0098 NVIDIA GeForce Go 7800 (G70)
- 0099 NVIDIA GeForce Go 7800 GTX (G70)
- 009C NVIDIA Quadro FX 350M (G70)
- 009D NVIDIA Quadro FX 4500 (G70)
- 009E NVIDIA G70GL (G70)
- 00A0 RIVA TNT2 Aladdin [NVA0]
- 00B4 nForce4 Intel Edition Memory Registers
- 00C0 NVIDIA GeForce 6800 GS (NV41)
- 00C1 NVIDIA GeForce 6800 (NV41)
- 00C2 NVIDIA GeForce 6800 LE (NV41)
- 00C3 NVIDIA GeForce 6800 XT (NV41)
- 00C8 NVIDIA GeForce Go 6800 (NV41.8)
- 00C9 NVIDIA GeForce Go 6800 Ultra (NV41)
- 00CC NVIDIA Quadro FX Go 1400 (NV41)
- 00CD NVIDIA Quadro FX 3450/4000 SDI (NV41)
- 00CE NVIDIA Quadro FX 1400 (NV41)
- 00D0 LPC Bridge (nForce 3)
- 00D1 Host Bridge (nForce 3)
- 00D2 PCI-to-PCI Bridge (nForce 3?)
- 00D3 nForce4 Memory Controller
- 00D4 nForce MCP3 SMBus Controller
- 00D5 CK8 PATA 133/PATA to SATA Bridge (nForce3-150)
- 00D6 nForce 3 Networking Controller (MCP3)
- 00D7 OpenHCD USB Host Controller (nForce MCP3?)
- 00D8 Enhanced PCI to USB Host Controller (nForce MCP3?)
- 00D9 Agere System PCI Soft Modem (nForce 3)
- 00DA nForce MCP3 Audio Codec Interface
- 00DD PCI-to-PCI Bridge (nForce MCP3?)
- 00DF nForce 7 Networking Controller (MCP73)
- 00E0 LPC Interface Bridge (nForce3 250)
- 00E1 Host/PCI Bridge (nForce3 250)
- 00E2 AGP Host to PCI Bridge (nForce3 250)
- 00E3 CK8S SATA/RAID Controller (nForce 250)
- 00E4 PCI System Management (nForce3 250)
- 00E5 Parallel ATA Controller (nForce3 250)
- 00E6 nForce3 Ethernet Controller
- 00E7 OpenHCD USB Controller (nForce3 250)
- 00E8 Enhanced PCI to USB Controller (nForce3 250)
- 00E9 nForce3 AC'97 Modem
- 00EA nForce3 AC'97 Audio Codec Interface
- 00ED PCI-PCI Bridge (nForce3 250)
- 00EE CK8S SATA/RAID Controller (nForce 250)
- 00F0 NVIDIA Device (BR02)
- 00F1 NVIDIA GeForce 6600 GT (BR02)
- 00F2 NVIDIA GeForce 6600 (BR02)
- 00F3 NVIDIA GeForce 6200 (BR02)
- 00F4 NVIDIA GeForce 6600 LE (BR02)
- 00F5 NVIDIA GeForce 7800 GS (BR02)
- 00F6 NVIDIA GeForce 6800 GS/XT (BR02)
- 00F8 NVIDIA Quadro FX 3400/4400 (BR02)
- 00F9 NVIDIA GeForce 6800 Series GPU (BR02)
- 00FA NVIDIA GeForce PCX 5750 (BR02)
- 00FB NVIDIA GeForce PCX 5900 (BR02)
- 00FC NVIDIA GeForce PCX 5300 (BR02)
- 00FD NVIDIA Quadro PCI-E Series (BR02)
- 00FE NVIDIA Quadro FX 1300 (BR02)
- 00FF NVIDIA GeForce PCX 4300 (BR02)
- 0100 NVIDIA GeForce 256 (NV10)
- 0101 GeForce 256 DDR [NV10DDR]
- 0102 GeForce 256 Ultra [NV10]
- 0103 Quadro (GeForce 256 GL) [NV10GL]
- 0110 NVIDIA GeForce2 MX/MX 400 (NV11)
- 0111 GeForce2 MX 100/200 (DDR) [NV11DDR]
- 0112 GeForce2 Go/MX Ultra [NV11]
- 0113 NVIDIA Quadro2 MXR/EX (NV11)
- 0140 NVIDIA GeForce 6600 GT (NV43)
- 0141 NVIDIA GeForce 6600 (NV43)
- 0142 NVIDIA GeForce 6600 LE (NV43)
- 0143 NVIDIA GeForce 6600 VE (NV43)
- 0144 NVIDIA GeForce Go 6600 (NV43)
- 0145 NVIDIA GeForce 6610 XL (NV43)
- 0146 NVIDIA GeForce Go 6200 TE/6600 TE (NV43)
- 0147 NVIDIA GeForce 6700 XL (NV43)
- 0148 NVIDIA GeForce Go 6600 (NV43)
- 0149 NVIDIA GeForce Go 6600 GT (NV43)
- 014A NVIDIA Quadro NVS 440 (NV43)
- 014B NVIDIA NV43 (NV43)
- 014C NVIDIA Quadro FX 540M (NV43)
- 014D NVIDIA Quadro FX 550 (NV43)
- 014E NVIDIA Quadro FX 540 (NV43)
- 014F NVIDIA GeForce 6200 (NV43)
- 0150 NVIDIA GeForce2 GTS/GeForce2 Pro (NV15)
- 0151 GeForce2 Ti (DDR) [NV15DDR]
- 0152 GeForce2 Ultra (BladeRunner) [NV15BR]
- 0153 NVIDIA Quadro2 Pro (NV15)
- 0160 NVIDIA GeForce 6500 (NV44)
- 0161 NVIDIA GeForce 6200 TurboCache(TM) (NV44)
- 0162 NVIDIA GeForce 6200SE TurboCache(TM) (NV44)
- 0163 NVIDIA GeForce 6200 LE (NV44)
- 0164 GeForce Go 6200 [NV44]
- 0165 NVIDIA Quadro NVS 285 (NV44)
- 0166 NVIDIA GeForce Go 6250 (NV44)
- 0167 NVIDIA GeForce Go 6200 (NV44)
- 0168 NVIDIA GeForce Go 6400 (NV44)
- 0169 NVIDIA GeForce 6250 (NV44)
- 016A NVIDIA GeForce 7100 GS (NV44)
- 016B NVIDIA NV44GLM (NV44)
- 016C NVIDIA NV44GLM (NV44)
- 016D NVIDIA NV44GLM (NV44)
- 016E NVIDIA NV44GL (NV44)
- 0170 NVIDIA GeForce4 MX 460 (NV17)
- 0171 NVIDIA GeForce4 MX 440 (NV17)
- 0172 NVIDIA GeForce4 MX 420 (NV17)
- 0173 NVIDIA GeForce4 MX 440-SE (NV17)
- 0174 NVIDIA GeForce4 MX 440 Go (NV17)
- 0175 NVIDIA GeForce4 MX 420 Go (NV17)
- 0176 NVIDIA GeForce4 MX 420 Go 32M (NV17)
- 0177 NVIDIA GeForce4 460 Go (NV17)
- 0178 NVIDIA Quadro4 550 XGL (NV17)
- 0179 NVIDIA GeForce4 MX 440 Go 64M (NV17)
- 017A NVIDIA Quadro NVS (NV17)
- 017B Quadro4 550 XGL [NV17GL.3]
- 017C NVIDIA Quadro4 500 Go GL (NV17)
- 017D NVIDIA GeForce4 410 Go 16M (NV17)
- 0180 GeForce4 MX 440 with AGP 8X [NV18]
- 0181 NVIDIA GeForce4 MX 440 with AGP8X (NV18)
- 0182 NVIDIA GeForce4 MX 440SE with AGP8X (NV18)
- 0183 NVIDIA GeForce4 MX 420 with AGP8X (NV18)
- 0184 GeForce4 MX [NV18]
- 0185 NVIDIA GeForce4 MX 4000 (NV18)
- 0186 NVIDIA GeForce4 448 Go (NV18)
- 0187 NVIDIA GeForce4 488 Go (NV18)
- 0188 NVIDIA Quadro4 580 XGL (NV18)
- 018A NVIDIA Quadro NVS with AGP8X (NV18)
- 018B NVIDIA Quadro4 380 XGL (NV18)
- 018C NVIDIA Quadro NVS 50 PCI (NV18)
- 018D NVIDIA GeForce4 448 Go (NV18)
- 0191 NVIDIA GeForce 8800 GTX (G80)
- 0193 NVIDIA GeForce 8800 GTS (G80)
- 0194 NVIDIA GeForce 8800 Ultra (G80)
- 0197 NVIDIA Tesla C870 (G80)
- 019D NVIDIA Quadro FX 5600 (G80)
- 019E NVIDIA Quadro FX 4600 (G80)
- 01A0 GeForce2 Integrated Graphics [NVCrush11]
- 01A4 AGP Controller (nForce)
- 01A5 AGP Controller (nForce)
- 01A6 AGP Controller (nForce)
- 01A8 Memory Controller (SDR) (nForce 220)
- 01A9 Memory Controller (SDR) (nForce 420)
- 01AA Memory Controller (DDR) (nForce 220/230)
- 01AB Memory Controller (DDR) (nForce 415/420/430)
- 01AC nForce 220/230/415/420/430 Memory Controller
- 01AD nForce 220/230/415/420/430 Memory Controller
- 01B0 nForce MCP Audio Processing Unit (Dolby Digital)
- 01B1 nForce AC'97 Audio Controller (MCP)
- 01B2 HUB Interface (nForce)
- 01B4 nForce 1/2 SMBus Controller (MCP)
- 01B7 AGP Bridge (nForce)
- 01B8 PCI Bridge (nForce)
- 01BC nForce IDE/ATA Controller (MCP)
- 01C1 nForce PC97 Modem (Intel 537)
- 01C2 nForce OHCI USB Controller
- 01C3 nForce Networking Controller (MCP)
- 01D0 NVIDIA GeForce 7350 LE (G72)
- 01D1 NVIDIA GeForce 7300 LE (G72)
- 01D2 NVIDIA GeForce 7550 LE (G72)
- 01D3 NVIDIA GeForce 7300 SE/7200 GS (G72)
- 01D5 NVIDIA GeForce 7300 LE (G72)
- 01D6 GeForce Go 7200
- 01D7 Quadro NVS 110M / GeForce Go 7300
- 01D8 Quadro NVS 120M / GeForce Go 7400
- 01DA Quadro NVS 110M
- 01DB NVIDIA Quadro NVS 120M (G72)
- 01DC NVIDIA Quadro FX 350M (G72)
- 01DD NVIDIA GeForce 7500 LE (G72)
- 01DE NVIDIA Quadro FX 350 (G72)
- 01DF NVIDIA GeForce 7300 GS (G72)
- 01E0 AGP Controller (nForce2)
- 01E1 AGP Controller (nForce2)
- 01E8 AGP Host to PCI Bridge (nForce2)
- 01EA Memory Controller 0 (nForce2)
- 01EB Memory Controller 1 (nForce2)
- 01EC Memory Controller 2 (nForce2)
- 01ED Memory Controller 3 (nForce2)
- 01EE Memory Controller 4 (nForce2)
- 01EF Memory Controller 5 (nForce2)
- 01F0 NVIDIA GeForce4 MX Integrated GPU (CR17)
- 0200 NVIDIA GeForce3 (NV20)
- 0201 NVIDIA GeForce3 Ti 200 (NV20)
- 0202 NVIDIA GeForce3 Ti 500 (NV20)
- 0203 NVIDIA Quadro DCC (NV20)
- 0210 NVIDIA NV48 (NV48)
- 0211 NVIDIA GeForce 6800 (NV48)
- 0212 NVIDIA GeForce 6800 LE (NV48)
- 0215 NVIDIA GeForce 6800 GT (NV48)
- 0218 NVIDIA GeForce 6800 XT (NV48)
- 0220 NVIDIA NV44 (NV44)
- 0221 NVIDIA GeForce 6200 (NV44)
- 0222 NVIDIA GeForce 6200 A-LE (NV44)
- 0228 NVIDIA NV44M (NV44)
- 0240 NVIDIA GeForce 6150 (C51)
- 0241 NVIDIA GeForce 6150 LE (C51)
- 0242 NVIDIA GeForce 6100 (C51)
- 0243 PCI Express Bridge (C51)
- 0244 Geforce Go 6150 (Geforce Go 6150)
- 0245 NVIDIA Quadro NVS 210S / NVIDIA GeForce 6150LE (C51)
- 0246 PCI Express Bridge (C51)
- 0247 Geforce 6100 Go (C51)
- 0248 PCI Express Bridge (C51)
- 0249 PCI Express Bridge (C51)
- 024A PCI Express Bridge (C51)
- 024B PCI Express Bridge (C51)
- 024C PCI Express Bridge (C51)
- 024D PCI Express Bridge (C51)
- 024E PCI Express Bridge (C51)
- 024F PCI Express Bridge (C51)
- 0250 NVIDIA GeForce4 Ti 4600 (NV25)
- 0251 NVIDIA GeForce4 Ti 4400 (NV25)
- 0252 NVIDIA GeForce4 Ti (NV25)
- 0253 NVIDIA GeForce4 Ti 4200 (NV25)
- 0258 NVIDIA Quadro4 900 XGL (NV25)
- 0259 NVIDIA Quadro4 750 XGL (NV25)
- 025B NVIDIA Quadro4 700 XGL (NV25)
- 0260 MCP51 LPC Bridge
- 0261 MCP51 LPC Bridge
- 0262 MCP51 LPC Bridge
- 0263 MCP51 LPC Bridge
- 0264 NVIDIA nForce PCI System Management (NVIDIA SMB Bus Controller)
- 0265 MCP51 Parallel ATA Controller
- 0266 NVIDIA nForce 430/410 Serial ATA Controller (MCP51S)
- 0267 NVIDIA nForce 430/410 Serial ATA Controller (MCP51S)
- 0268 NVIDIA nForce Networking Controller (MCP51)
- 0269 MCP51 Network Bus Enumerator
- 026A MCP51 MCI
- 026B MCP51 AC'97 Audio Controller (MCP51)
- 026C High Definition Audio Controller (MCP51)
- 026D MCP51 USB Controller
- 026E MCP51 USB Controller
- 026F MCP51 PCI Bridge
- 0270 MCP51 Host Bridge
- 0271 Coprocessor (nForce System Management Controller) (MCP51)
- 0272 MCP51 Memory Controller 0
- 027E C51 Memory Controller 2
- 027F C51 Memory Controller 3
- 0280 NVIDIA GeForce4 Ti 4800 (NV28)
- 0281 NVIDIA GeForce4 Ti 4200 with AGP8X (NV28)
- 0282 NVIDIA GeForce4 Ti 4800 SE (NV28)
- 0286 GeForce4 Ti 4200 Go AGP 8x [NV28]
- 0288 NVIDIA Quadro4 980 XGL (NV28)
- 0289 NVIDIA Quadro4 780 XGL (NV28)
- 028C NVIDIA Quadro4 700 Go GL (NV28)
- 0290 NVIDIA GeForce 7900 GTX (G71)
- 0291 NVIDIA GeForce 7900 GT/GTO (G71)
- 0292 NVIDIA GeForce 7900 GS (G71)
- 0293 NVIDIA GeForce 7950 GX2 (G71)
- 0294 NVIDIA GeForce 7950 GX2 (G71)
- 0295 NVIDIA GeForce 7950 GT (G71)
- 0297 NVIDIA GeForce Go 7950 GTX (G71)
- 0298 NVIDIA GeForce Go 7900 GS (G71)
- 0299 NVIDIA GeForce Go 7900 GTX (G71)
- 029A Quadro FX 2500M
- 029B Quadro FX 1500M
- 029C NVIDIA Quadro FX 5500 (G71)
- 029D NVIDIA Quadro FX 3500 (G71)
- 029E NVIDIA Quadro FX 1500 (G71)
- 029F NVIDIA Quadro FX 4500 X2 (G71)
- 02A0 NVIDIA NV2A GeForce 3 Integrated (XBOX) (NV20)
- 02E0 NVIDIA GeForce 7600 GT (BR02)
- 02E1 NVIDIA GeForce 7600 GS (BR02)
- 02E2 NVIDIA GeForce 7300 GT (BR02)
- 02E3 NVIDIA GeForce 7900 GS (BR02)
- 02E4 NVIDIA GeForce 7950 GT (BR02)
- 02F0 C51 Host Bridge
- 02F1 C51 Host Bridge
- 02F2 C51 Host Bridge
- 02F3 C51 Host Bridge
- 02F4 C51 Host Bridge
- 02F5 C51 Host Bridge
- 02F6 C51 Host Bridge
- 02F7 C51 Host Bridge
- 02F8 C51 Memory Controller 5
- 02F9 C51 Memory Controller 4
- 02FA C51 Memory Controller 0
- 02FB C51 PCIe Bridge
- 02FC C51 PCIe Bridge
- 02FD C51 PCIe Bridge
- 02FE C51 Memory Controller 1
- 02FF C51 Host Bridge
- 0300 GeForce FX [NV30.1]
- 0301 NVIDIA GeForce FX 5800 Ultra (NV30)
- 0302 NVIDIA GeForce FX 5800 (NV30)
- 0308 NVIDIA Quadro FX 2000 (NV30)
- 0309 NVIDIA Quadro FX 1000 (NV30)
- 030A NVIDIA ICE FX 2000 (NV30)
- 0311 NVIDIA GeForce FX 5600 Ultra (NV31)
- 0312 NVIDIA GeForce FX 5600 (NV31)
- 0313 NVIDIA NV31 (NV31)
- 0314 NVIDIA GeForce FX 5600XT (NV31)
- 0316 NVIDIA NV31M (NV31)
- 0317 NVIDIA NV31M Pro (NV31)
- 0318 NVIDIA NV31GL (NV31)
- 0319 NVIDIA NV31GL (NV31)
- 031A NVIDIA GeForce FX Go 5600 (NV31)
- 031B NVIDIA GeForce FX Go 5650 (NV31)
- 031C NVIDIA Quadro FX Go 700 (NV31)
- 031D NVIDIA NV31GLM (NV31)
- 031E NVIDIA NV31GLM Pro (NV31)
- 031F NVIDIA NV31GLM Pro (NV31)
- 0320 NVIDIA GeForce FX 5200 (NV34)
- 0321 NVIDIA GeForce FX 5200 Ultra (NV34)
- 0322 NVIDIA GeForce FX 5200 (NV34)
- 0323 NVIDIA GeForce FX 5200LE (NV34)
- 0324 NVIDIA GeForce FX Go 5200 (NV34)
- 0325 NVIDIA GeForce FX Go 5250/5500 (NV34)
- 0326 NVIDIA GeForce FX 5500 (NV34)
- 0327 NVIDIA GeForce FX 5100 (NV34)
- 0328 NVIDIA GeForce FX Go 5200 32/64M (NV34)
- 0329 GeForce FX Go 5200 [NV34M]
- 032A NVIDIA Quadro NVS 55/280 PCI (NV34)
- 032B NVIDIA Quadro FX 500/FX 600 (NV34)
- 032C NVIDIA GeForce FX Go 53x0 (NV34)
- 032D NVIDIA GeForce FX Go 5100 (NV34)
- 032F NVIDIA NV34GL (NV34)
- 0330 NVIDIA GeForce FX 5900 Ultra (NV35)
- 0331 NVIDIA GeForce FX 5900 (NV35)
- 0332 NVIDIA GeForce FX 5900XT (NV35)
- 0333 NVIDIA GeForce FX 5950 Ultra (NV35)
- 0334 NVIDIA GeForce FX 5900ZT (NV35)
- 0338 NVIDIA Quadro FX 3000 (NV35)
- 033F NVIDIA Quadro FX 700 (NV35)
- 0341 NVIDIA GeForce FX 5700 Ultra (NV36)
- 0342 NVIDIA GeForce FX 5700 (NV36)
- 0343 NVIDIA GeForce FX 5700LE (NV36)
- 0344 NVIDIA GeForce FX 5700VE (NV36)
- 0345 NVIDIA NV36 (NV36)
- 0347 NVIDIA GeForce FX Go 5700 (NV36)
- 0348 NVIDIA GeForce FX Go 5700 (NV36)
- 0349 NVIDIA NV36M Pro (NV36)
- 034B NVIDIA NV36MAP (NV36)
- 034C NVIDIA Quadro FX Go 1000 (NV36)
- 034E NVIDIA Quadro FX 1100 (NV36)
- 034F NVIDIA NV36GL (NV36)
- 0360 MCP55 LPC Bridge
- 0361 MCP55 LPC Bridge
- 0362 MCP55 LPC Bridge
- 0363 MCP55 LPC Bridge
- 0364 MCP55 LPC Bridge
- 0365 MCP55 LPC Bridge
- 0366 MCP55 LPC Bridge
- 0367 MCP55 LPC Bridge
- 0368 SMBus controller ((0xCB84 integrated chip nForce Pro 3400))
- 0369 MCP55 Memory Controller
- 036A MCP55 Memory Controller
- 036B MCP55 SMU
- 036C Standard OpenHCD USB Hostcontroller (81FB1043)
- 036D Standard PCI-to-USB Enhanced Hostcontroller (81FB1043)
- 036E MCP55 PATA Controller (MCP55)
- 036F MCP55 SATA/RAID Controller (MCP55)
- 0370 MCP55 PCI bridge
- 0371 High Definition Audio Controller (MCP55)
- 0372 MCP55 Ethernet
- 0373 MCP55 Ethernet
- 0374 MCP55 PCIe bridge
- 0375 MCP55 PCIe bridge
- 0376 MCP55 PCIe bridge
- 0377 MCP55 PCIe bridge
- 0378 MCP55 PCIe bridge
- 037A MCP55 Memory Controller
- 037C GeForce 7800 GS (MCP55??)
- 037E MCP55 SATA/RAID Controller (MCP55)
- 037F MCP55 SATA/RAID Controller (MCP55S)
- 038B NVIDIA GeForce 7650 GS (G73)
- 0390 NVIDIA GeForce 7650 GS (G73)
- 0391 NVIDIA GeForce 7600 GT (G73)
- 0392 NVIDIA GeForce 7600 GS (G73)
- 0393 NVIDIA GeForce 7300 GT (G73)
- 0394 NVIDIA GeForce 7600 LE (G73)
- 0395 NVIDIA GeForce 7300 GT (G73)
- 0397 GeForce Go 7700
- 0398 NVIDIA GeForce Go 7600 (G73)
- 0399 GeForce Go 7600 GT
- 039B GeForce Go 7900 SE
- 039C Quadro FX 550M
- 039E NVIDIA Quadro FX 560 (G73)
- 03A0 C55 Host Bridge
- 03A1 C55 Host Bridge
- 03A2 C55 Host Bridge
- 03A3 C55 Host Bridge
- 03A4 C55 Host Bridge
- 03A5 C55 Host Bridge
- 03A6 C55 Host Bridge
- 03A7 C55 Host Bridge
- 03A8 C55 Memory Controller
- 03A9 C55 Memory Controller
- 03AA C55 Memory Controller
- 03AB C55 Memory Controller
- 03AC C55 Memory Controller
- 03AD C55 Memory Controller
- 03AE C55 Memory Controller
- 03AF C55 Memory Controller
- 03B0 C55 Memory Controller
- 03B1 C55 Memory Controller
- 03B2 C55 Memory Controller
- 03B3 C55 Memory Controller
- 03B4 C55 Memory Controller
- 03B5 C55 Memory Controller
- 03B6 C55 Memory Controller
- 03B7 C55 PCIe bridge
- 03B8 C55 PCIe bridge
- 03B9 C55 PCIe bridge
- 03BA C55 Memory Controller
- 03BB C55 PCIe bridge
- 03BC C55 Memory Controller
- 03D0 NVIDIA GeForce 6150SE nForce 430 (C61)
- 03D1 NVIDIA GeForce 6100 nForce 405 (C61)
- 03D2 NVIDIA GeForce 6100 nForce 400 (C61)
- 03D5 NVIDIA GeForce 6100 nForce 420 (C61)
- 03E0 PCI standard ISA bridge (nForce 430)
- 03E1 nForce 430 (MCP61) LPC Bridge
- 03E2 nForce 430 (MCP61) LPC Bridge
- 03E3 nForce 430 (MCP61) LPC Bridge
- 03E4 nForce 430 (MCP61) High Definition Audio
- 03E5 nForce 430 (MCP61) Ethernet
- 03E6 nForce 430 (MCP61) Ethernet
- 03E7 nForce 430 (MCP61) SATA Controller
- 03E8 nForce 430 (MCP61) PCIe bridge
- 03E9 nForce 430 (MCP61) PCIe bridge
- 03EA nForce 430 (MCP61) Memory Controller
- 03EB NVIDIA nForce PCI System Management (MCP61)
- 03EC nForce 430 (MCP61) IDE Controller
- 03EE nForce 430 (MCP61) Ethernet
- 03EF Nvidia Networking Card (nForce 405)
- 03F0 nForce 430 (MCP61) High Definition Audio
- 03F1 nForce 430 (MCP61) USB Controller
- 03F2 nForce 430 (MCP61) USB Controller
- 03F3 nForce 430 (MCP61) PCI bridge
- 03F4 nForce 430 (MCP61) SMU
- 03F5 nForce 430 (MCP61) Memory Controller
- 03F6 nForce 430 (MCP61) SATA Controller
- 03F7 nForce 430 (MCP61) SATA Controller
- 0400 NVIDIA GeForce 8600 GTS (G84)
- 0401 NVIDIA GeForce 8600 GT (G84)
- 0402 NVIDIA GeForce 8600 GT (G84)
- 0403 NVIDIA GeForce 8600GS (G84)
- 0404 NVIDIA GeForce 8400 GS (G84)
- 0405 GeForce 9500m GS (unknown)
- 0406 NVIDIA GeForce 8300 GS (G84)
- 0407 NVIDIA GeForce 8600M GT (NVIDIA GeForce 8600M GT)
- 0409 GeForce 8800M GS
- 040A NVIDIA Quadro FX 370 (G84)
- 040B Quadro NVS 320M
- 040C Mobile Quadro FX/NVS video card (NVIDIA Quadro NVS 570M)
- 040D Quadro FX 1600M
- 040E NVIDIA Quadro FX 570 (G84)
- 040F NVIDIA Quadro FX 1700 (G84)
- 0420 NVIDIA GeForce 8400 SE (G86)
- 0421 NVIDIA GeForce 8500 GT (G86)
- 0422 NVIDIA GeForce 8400 GS (G86)
- 0423 NVIDIA GeForce 8300 GS (G86)
- 0424 NVIDIA GeForce 8400 GS (G86)
- 0425 NVIDIA 8600m GS (NVIDIA 8600m GS)
- 0426 Geforce 8400M GT GPU (G86M)
- 0427 Geforce 8400M GS (unknown)
- 0428 NVIDIA GeForce 8400M G (NVIDIA GeForce 8400M G)
- 0429 nVidia Quadro NVS 135M or Quadro NVS 140M (Unknown)
- 042A Quadro NVS 130M
- 042B NVIDIA Quadro NVS 135M (8400 ??)
- 042C NVIDIA GeForce 9400 GT (G86)
- 042D Quadro FX 360 M (Mobile) (Quadro FX 360 M)
- 042F NVIDIA Quadro NVS 290 (G86)
- 0440 MCP65 LPC Bridge
- 0441 MCP65 LPC Bridge
- 0442 MCP65 LPC Bridge
- 0443 MCP65 LPC Bridge
- 0444 MCP65 Memory Controller
- 0445 MCP65 Memory Controller
- 0446 MCP65 SMBus
- 0447 MCP65 SMU
- 0448 MCP65 PATA Controller (MCP65)
- 0449 MCP65 PCI bridge
- 044A MCP65 High Definition Audio
- 044B MCP65 High Definition Audio
- 044C MCP65 AHCI Controller
- 044D MCP65 AHCI Controller
- 044E MCP65 AHCI Controller
- 044F MCP65 AHCI Controller
- 0450 MCP65 Ethernet
- 0451 MCP65 Ethernet
- 0452 MCP65 Ethernet
- 0453 MCP65 Ethernet
- 0454 MCP65 USB Controller
- 0455 MCP65 USB Controller
- 0456 MCP65 USB Controller
- 0457 MCP65 USB Controller
- 0458 MCP65 PCIe bridge
- 0459 MCP65 PCIe bridge
- 045A MCP65 PCIe bridge
- 045C MCP65 SATA Controller
- 045D MCP65 SATA Controller(IDE mode) (MCP65)
- 045E MCP65 SATA Controller
- 045F MCP65 SATA Controller
- 0531 GeForce 7150M
- 0533 nVidia GeForce 7000M / nForce 610M
- 053A NVIDIA GeForce 7050 PV / NVIDIA nForce 630a (C68)
- 053B NVIDIA GeForce 7050 PV / NVIDIA nForce 630a (C68)
- 053E NVIDIA GeForce 7025 / NVIDIA nForce 630a (C68)
- 0542 nForce PCI System Management
- 0543 nForce System Management Controller
- 0547 MCP67 Memory Controller
- 0548 ENE0100 (ENE0100)
- 054C MCP67 Ethernet (MCP67)
- 0550 MCP67 SATA Controller(IDE mode) (MCP67)
- 0554 MCP67 AHCI Controller
- 0555 MCP67 AHCI (MCP67)
- 0556 MCP67 AHCI (MCP67)
- 0558 MCP67 RAID (MCP67)
- 0559 MCP67 RAID (MCP67)
- 055A MCP67 RAID (MCP67)
- 055C MCP67 High Definition Audio
- 055D MCP67 High Definition Audio
- 055E MCP67 OHCI USB 1.1 Controller
- 055F MCP67 EHCI USB 2.0 Controller
- 0560 MCP67 PATA Controller (MCP67)
- 0562 MCP67 PCI Express Bridge
- 0563 MCP67 PCI Express Bridge
- 056C MCP73 PATA (MCP73)
- 05E0 GeForce GTX 295 (GT200b)
- 05E1 NVIDIA GeForce GTX 280 (GT200)
- 05E2 NVIDIA GeForce GTX 260 (GT200)
- 05E3 GeForce GTX 285 (GT200b)
- 05E6 NVIDIA GeForce GTX 275 (GT200)
- 05E7 NVIDIA Tesla C1060 (GT200)
- 05F8 NVIDIA Quadroplex 2200 S4 (GT200)
- 05F9 NVIDIA Quadro CX (GT200)
- 05FD NVIDIA Quadro FX 5800 (GT200)
- 05FE NVIDIA Quadro FX 4800 (GT200)
- 0600 NVIDIA GeForce 8800 GTS 512 (G92)
- 0601 NVIDIA GeForce 9800 GT (G92)
- 0602 NVIDIA GeForce 8800 GT (G92)
- 0604 NVIDIA GeForce 9800 GX2 (G92)
- 0605 NVIDIA GeForce 9800 GT (G92)
- 0606 NVIDIA GeForce 8800 GS (G92)
- 0609 GeForce 8800M GTS
- 060B GeForce 9800M GT (G92)
- 060C GeForce 8800M GTX
- 060D NVIDIA GeForce 8800 GS (G92)
- 0610 NVIDIA GeForce 9600 GSO (G92)
- 0611 NVIDIA GeForce 8800 GT (G92)
- 0612 NVIDIA GeForce 9800 GTX/9800 GTX+ (G92)
- 0613 NVIDIA GeForce 9800 GTX+ (G92)
- 0614 NVIDIA GeForce 9800 GT (G92)
- 0615 GeForce GTS 250 (G92+)
- 0619 NVIDIA Quadro FX 4700 X2 (G92)
- 061A NVIDIA Quadro FX 3700 (G92)
- 061B NVIDIA Quadro VX 200 (G92)
- 0622 NVIDIA GeForce 9600 GT (G94)
- 0623 NVIDIA GeForce 9600 GS (G94)
- 0625 NVIDIA GeForce 9600 GSO 512 (G94)
- 062D NVIDIA GeForce 9600 GT (G94)
- 062E NVIDIA GeForce 9600 GT (G94)
- 0637 NVIDIA GeForce 9600 GT (G94)
- 0638 NVIDIA Quadro FX 1800 (0638)
- 0640 NVIDIA GeForce 9500 GT (G96)
- 0641 NVIDIA GeForce 9400 GT (G96)
- 0642 NVIDIA GeForce 8400 GS (G96)
- 0643 NVIDIA GeForce 9500 GT (G96)
- 0644 NVIDIA GeForce 9500 GS (G96)
- 0645 NVIDIA GeForce 9500 GS (G96)
- 0646 Geforce 9500GS (G95)
- 0648 NVIDIA GeForce 9600M GS (G96)
- 0649 nVidia GeForce 9600M GT (G96)
- 064A GeForce 9700M GT (G96)
- 0652 Ge Force GT 130M (G96M)
- 065C Quadro FX 770M (unkown)
- 06E0 NVIDIA GeForce 9300 GE (G98)
- 06E1 NVIDIA GeForce 9300 GS (G98)
- 06E2 NVIDIA GeForce 8400 (G98)
- 06E3 NVIDIA GeForce 8300 GS (G98)
- 06E4 NVIDIA GeForce 8400 GS (G98)
- 06E6 nVidia G100 (G100)
- 06E7 NVIDIA GeForce 9300 SE (G98)
- 06E9 NVIDIA GeForce 9300M GS (G98)
- 06EA nvidia quadro nvs 150m (unknown)
- 06EB Quadro NVS 160M (unknown)
- 06F8 NVIDIA Quadro NVS 420 (G98)
- 06F9 NVIDIA Quadro FX 370 LP (G98)
- 06FA NVIDIA Quadro NVS 450 (G98)
- 06FD NVidia NVS 295 (NVS 295)
- 0753 NVIDIA nForce System Management Controller (8100)
- 0760 NForce Network Controller (MCP78 NIC)
- 0768 AHCI Controller (MCP ?)
- 07B5 MCP72 AHCI (MCP72)
- 07B9 MCP72 RAID (MCP72)
- 07D8 nForce 7100-630i (MCP73PV) (nForce 7100-630i (MCP73PV))
- 07DC nForce 7100-630i (MCP73PV)asdf (nForce 7100-630i (MCP73PV)asdf)
- 07E0 NVIDIA GeForce 7150 / NVIDIA nForce 630i (C73)
- 07E1 NVIDIA GeForce 7100 / NVIDIA nForce 630i (C73)
- 07E2 NVIDIA GeForce 7050 / NVIDIA nForce 630i (C73)
- 07E3 NVIDIA GeForce 7050 / NVIDIA nForce 610i (C73)
- 07E5 NVIDIA GeForce 7050 / NVIDIA nForce 620i (C73)
- 07F0 MCP73 SATA(IDE mode) (MCP73)
- 07F4 MCP73 AHCI1 (MCP73)
- 07F5 MCP73 AHCI2 (MCP73)
- 07F6 MCP73 AHCI3 (MCP73)
- 07F7 MCP73 AHCI4 (MCP73)
- 07F8 MCP73 RAID1 (MCP73)
- 07F9 MCP73 RAID2 (MCP73)
- 07FA MCP73 RAID3 (MCP73)
- 07FB MCP73 RAID4 (MCP73)
- 07FC High Definition Audio Bus (Possibly nForce 610i)
- 0848 NVIDIA GeForce 8300 (C73)
- 0849 NVIDIA GeForce 8200 (C77)
- 084A NVIDIA nForce 730a (C77)
- 084B NVIDIA GeForce 8200 (C77)
- 084C NVIDIA nForce 780a SLI (C77)
- 084D NVIDIA nForce 750a SLI (C77)
- 084F NVIDIA GeForce 8100 / nForce 720a (C77)
- 0860 NVIDIA GeForce 9300 (C79)
- 0861 NVIDIA GeForce 9400 (C79)
- 0863 NVIDIA GeForce 9400M (C79)
- 0864 NVIDIA GeForce 9300 (C79)
- 0865 NVIDIA GeForce 9300 (C79)
- 0868 NVIDIA nForce 760i SLI (C79)
- 086A NVIDIA GeForce 9400 (C79)
- 086C NVIDIA GeForce 9300 / nForce 730i (C79)
- 086D NVIDIA GeForce 9200 (C79)
- 086F GeForce 8200M G (MCP79MVL)
- 0871 NVIDIA GeForce 9200 (C79)
- 087A NVIDIA Quadro FX 470 (C79)
- 0A65 Nvidia 200 Series (GeForce 210)
- 0AA3 nForce 730i SMBus Controller (MCP7A)
- 0AB0 ID0A80 (NForce 9300)
- 0AB8 MCP79 AHCI1 (MCP79)
- 0AB9 MCP79 AHCI2 (MCP79)
- 0ABC MCP79 RAID1 (MCP79)
- 0ABD MCP79 RAID2 (MCP79)
- 0AD0 SATA Controller IDE mode (MCP78)
- 0BC4 AHCI Controller (MCP?)
- 0BC5 AHCI Controller (MCP?)
- 0BCC Raid Controller (MCP?)
- 0BCD Raid Controller (MCP?)
- 10DE Riva 128 (NV34)
- 10F0 PCI DEVICE (NV3)
- 1112 Gateway Solo 9550 NVIDIA Geforce 2 GO 32 MB (0x1112)
- 8001 nVidia MCP73 HDMI Audio Driver (MCP73)
- 9876 GeForce2 MX / MX 400 (NV11)
-10DF Emulex Corporation
- 10DF Fibre Channel Adapter (Light Pulse)
- 1AE5 LP6000 LightPulse Fibre Channel Host Adapter
- 1AE6 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- 1AE7 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3)
- F005 LP1150e Fibre Channel Host Adapter
- F011 LightPulse Fibre Channel Host Adapter (Saturn)
- F015 LightPulse Fibre Channel Host Adapter (Saturn)
- F085 LightPulse PCI Fibre Channel Host Adapter
- F095 LightPulse PCI Fibre Channel Host Adapter
- F098 LightPulse PCI Fibre Channel Host Adapter
- F0A1 LightPulse PCI Fibre Channel Host Adapter
- F0A5 Emulex 1050EX FC HBA - 2GB PCI-EXPRESS (PL1050Ex)
- F0B5 Viper LightPulse Fibre Channel Host Adapter
- F0D1 Helios LightPulse Fibre Channel Host Adapter
- F0D5 LP1150 Fibre Channel Host Adapter
- F0E1 Zephyr LightPulse Fibre Channel Host Adapter
- F0E5 Zephyr LightPulse Fibre Channel Host Adapter
- F0F5 Neptune LightPulse Fibre Channel Host Adapter
- F0F6 LPX000 Fibre Channel Storport Driver
- F0F7 LPX000 Fibre Channel Storport Driver
- F100 8Gb PCIe Single / Dual port Fibre Channel Adapter (LPe12000 / LPe12002)
- F700 LP7000 LightPulse Fibre Channel Host Adapter
- F701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- F800 LP8000 LightPulse Fibre Channel Host Adapter
- F801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- F900 LightPulse PCI Fibre Channel Host Adapter
- F901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
- F980 LP9802 & LP9802DC HBA adapter (LP9802 / DC)
- F981 LP9802 Fibre Channel Host Adapter Alternate ID
- F982 LP9802 Fibre Channel Host Adapter Alternate ID
- FA00 LightPulse PCI Fibre Channel Host Adapter
- FA01 LP101 Fibre Channel Host Adapter
- FB00 LightPulse PCI Fibre Channel Host Adapter
- FC00 Thor-X LightPulse Fibre Channel Host Adapter
- FC10 Helios-X LightPulse Fibre Channel Host Adapter
- FC20 Zephyr-X LightPulse Fibre Channel Host Adapter
- FC40 Saturn-X LightPulse Fibre Channel Host Adapter
- FD00 Emulex LP11002 (L2A2860 HELIOS v1.11)
- FD11 LPX000 Fibre Channel Storport Driver
- FD12 LPX000 Fibre Channel Storport Driver
- FE00 Zephyr-X LightPulse Fibre Channel Host Adapter
- FE04 LPX000 Fibre Channel Storport Driver
- FE11 LPX000 Fibre Channel Storport Driver
- FE12 LPX000 Fibre Channel Storport Driver
- FF00 Neptune LightPulse Fibre Channel Host Adapter
-10E0 Integrated Micro Solutions
- 5026 IMS5026/27/28 P54C "Diamond" PCI Chipset
- 5027 IMS5027
- 5028 IMS5028 ISA Bridge
- 8849 IMS8849/8 386/486 PCI Chipset
- 8853 IMS8853 ATM Network Adapter
- 9128 IMS9129 TwinTurbo 128 GUI Accelerator
- 9135 IMS9135 TwinTurbo 128-3D Display Adapter
-10E1 Tekram Technology Corp. Ltd.
- 0391 0000 (TRM-S1040)
- 690C DC-690c
- DC20 EIDE Controller (DC-290)
- DC29 DC-290
-10E2 Aptix Corp
-10E3 Tundra Semiconductor Corp.
- 0000 Universe/II VMEbus Bridge (CA91C042/142)
- 0108 Tsi108 Host Bridge for Single PowerPC
- 0148 PCI/X-to-VME Bridge (Tundra Tsi148)
- 0513 Dual-Mode PCI-to-PCI Bus Bridge (Tsi320)
- 0850 Power PC Dual PCI Host Bridge (Tsi850)
- 0854 Power PC Single PCI Host Bridge (Tsi850)
- 0860 CA91C860 Qspan PCI to Motorola Processor Bridge
- 0862 CA91L862A QSpan II PCI to Motorola Processor Bridge
- 8114 PCIe to PCI-X Bridge (Tsi384)
- 8260 PowerSpan II PowerPC-to-PCI Bus Switch (CA91L8200/8260)
- 8261 CA91L8200/8260 PowerSpan II PowerPC to PCI Bus Switch (Single PCI Bus)
- A108 Tsi109 Host Bridge for Dual PowerPC
-10E4 Tandem Computers
-10E5 Micro Industries Corp
-10E6 Gainbery Computer Products Inc
-10E7 Vadem
-10E8 Applied Micro Circuits Corp.
- 1072 INES GPIB-PCI (AMCC5920 based)
- 2011 Video Capture/Edit board (Q-Motion pci 264)
- 4750 S5930/33/35 "Matchmaker" PCI Controller
- 5920 S5920 32-Bit PCI Bus target interface
- 8001 S5933 Daktronics VMax transmitter Card
- 8033 Transputer Link Interface (BBK-PCI light)
- 8043 Myrinet LANai interface chip (LANai4.x)
- 8062 Parastation (S5933)
- 807D PCI44 (S5933)
- 8088 Kingsberg Spacetec Format Synchronizer (FS)
- 8089 Kingsberg Spacetec Serial Output Board (SOB)
- 809C Traquair HEPC3 (S5933)
- 80B1 Active ISDN Controller (Data Fire Basic 4MB PCI)
- 80B9 Some sort of Bridge? (PCI MATCHMAKER S5935QF)
- 80D7 Data Acquisition Card (ADLINK) (PCI-9112)
- 80D8 40MB/s 32-channels Digital I/O card (ADLINK) (PCI-7200)
- 80D9 Data Acquisition Card (ADLINK) (PCI-9118)
- 80DA PCI-9812
- 80FC APCI1500 Signal processing controller (16 dig. inputs + 16 dig. outputs)
- 811A PCI-IEEE1355-DS-DE interface (PCI-DSlink)
- 814C Fastcom ESCC-PCI (Commtech, Inc)
- 8170 Matchmaker PCI Chipset Development Tool (S5933QF)
- 81B7 S5933 AJAVideo NTV ITU-R.601 Video stillstore
- 81E6 Multimedia video controller
- 828D APCI3001 Signal processing controller (up to 16 analog inputs)
- 8291 Fastcom 232/8-PCI (Commtech, Inc)
- 82AF CQ2240 Data Aquisition Card
- 82C4 Fastcom 422/4-PCI (Commtech, Inc)
- 82C5 Fastcom 422/2-PCI (Commtech, Inc)
- 82C6 Fastcom IG422/1-PCI (Commtech, Inc)
- 82C7 Fastcom IG232/2-PCI (Commtech, Inc)
- 82CA Fastcom 232/4-PCI (Commtech, Inc)
- 82DB AJA HDNTV HD SDI Framestore
- 82E2 Fastcom DIO24H-PCI (Commtech, Inc)
- 8406 PCIcanx/PCIcan CAN interface [Kvaser AB]
- 8407 PCIcan II CAN interface (A1021, PCB-07, PCB-08) [Kvaser AB]
- 8851 S5933 on Innes Corp FM Radio Capture card
-10E9 Alps Electronic Corp. Ltd.
- 10E9 no (VID_044E&PID_3017)
-10EA Tvia Inc (Was: InterGraphics Systems (IGS))
- 1680 svga (IGA-1680)
- 1682 video (IGA-1682)
- 1683 IGA-1683
- 2000 TV output ram 2MB Cyberpro2010 (CyberPro 2010)
- 2010 vbcvbcvbcvb (CyberPro 20xx/2000A)
- 5000 CyberPro 5000
- 5050 CyberPro 5050
- 5202 CyberPro 5202
- 5252 CyberPro 5252
-10EB Artists Graphics
- 0101 64 bit graphics processor (3GA)
- 8111 Frame Grabber (Twist3)
-10EC Realtek Semiconductor
- 0139 ethernet 10/100 (rtl8139B)
- 0158 Realtek 5121 Driver Disk (Realtek 5121)
- 0260 Driver MS UAA for HD Audio (RTL260)
- 0261 261 High Definition Audio
- 0262 Realtek High Definition Audio (ALC882)
- 0268 Realtek 2+2 High Definition Audio (Realtek ALC268)
- 0269 Realtek High Definition Audio (I don't know about chip number)
- 0280 280 High Definition Audio
- 0660 High Definition Audio (Realtek HD Audio)
- 0662 Realtek 5.1 High Definition Audio (ALC662)
- 0861 Realtek High Definition Audio (ALC660)
- 0862 862 High Definition Audio
- 0880 Realtek 7.1 High Definition Audio (ALC880)
- 0882 Realtek 7.1+2 High Definition Audio (ALC882)
- 0883 Realtek 7.1+2 High Definition Audio (ALC883)
- 0885 8-channel High Definition Audio (ALC885)
- 0888 Realtek 7.1+2 High Definition Audio (ALC888)
- 8021 NIC (RTL8029AS)
- 8029 PCI Full-Duplex Ethernet Controller with PnP Function (RTL8029)
- 8119 32BIT Card Bus 10/100 (10EC-8119) (10)
- 8129 RT8129/8130 Fast Ethernet Adapter
- 8131 ethernet controller (LFE8139ATX)
- 8136 Realtek 10/100/1000 PCI-E NIC Family all in one NDIS Driver v5.728.0604.2009 06/04/2009 (Rtl8023)
- 8138 RT8139 (B/C) CardBus Fast Ethernet Adapter
- 8139 Realtek RTL8139 Family PCI Fast Ethernet NIC (RTL-8139/8139C/8139D)
- 8167 Realtek RTL8169/8110 Family Gigabit Ethernet NIC (RTL8169 / RTL8111B / RTL8111C)
- 8168 Gigabit Ethernet NIC(NDIS 6.0) (RTL8168/8111/8111c)
- 8169 Single Gigabit LOM Ethernet Controller (RTL8110)
- 8172 Realtek RTL8191SE wireless LAN 802.11N PCI-E NIC (RTL8191SE ?)
- 8180 RTL8180L IEEE 802.11b Wireless MAC and Baseband Processor
- 8185 IEEE 802.11a/b/g Wireless LAN Controller (rev 20) (RTL-8185)
- 8186 PCI Express Gigabit Ethernet controller (RTL8111/8168B)
- 8192 - (0280)
- 8197 Wireless 802.11b/g 54Mbps USB 2.0 Network Adapter (8187B)
- 8199 Single-Chip IEEE 802.11b/g WLAN Controller w/PCI Express Interface (RTL8187SE)
- 9876 GIGABIT ETHERNET LOM (RTL 8168/8111)
- 9877 GIGABIT ETHERNET LOM (RTL 8168/8111)
-10ED Ascii Corporation
- 7310 VGA Video Overlay Adapter (V7310)
-10EE Xilinx Corporation
- 0205 Wildcard TE205P
- 0210 Wildcard TE210P
- 0314 Communications Controller (Spartan XC2S50E)
- 0405 Wildcard TE405P (2nd Gen)
- 0410 Wildcard TE410P (2nd Gen)
- 3FC0 RME Digi96
- 3FC1 RME Digi96/8
- 3FC2 RME Digi 96/8 Pro
- 3FC3 RME Digi96/8 Pad (RME Digi96/8 Pad)
- 3FC4 RME Digi9652 Hammerfall DSP
- 3FC5 RME Digi9652 Hammerfall DSP
- 3FC6 RME Hammerfall DSP MADI
- 5343 Security Adapter (Seamont SC100)
- 8130 Virtex-II Bridge, XC2V1000-4FG456C (Durango PMC)
- 8381 Ellips Santos Frame Grabber
- A123 Spartan 3E (XA3S1600E)
- A124 XA3S1600E (Spartan 3E)
- D154 Copley Controls CAN card (PCI-CAN-02)
-10EF Racore Computer Products
- 8154 Token Ring Adapter (M815x)
-10F0 Curtiss-Wright Controls Embedded Computing
- A800 Graphics board (VCL-P)
- B300 graphics board (VCL-M)
-10F1 Tyan Computer
- 1566 IDE/SCSI
- 1677 Multimedia
- 2013 Conexant RS-56 PCI Modem (RS-56 sp-pci)
- 2865 Tyan Thunder K8E S2865
-10F2 Achme Computer Inc
-10F3 Alaris Inc
-10F4 S-MOS Systems
- 1300 PCI to S5U13x06B0B Bridge Adapter (rev1.1)
-10F5 NKK Corporation
- A001 NR4600 Bridge (NDR4000)
-10F6 Creative Electronic Systems SA
- 0111 CMI8738/C3DX Multimedia Audio Controller (PCIVEN)
-10F7 Matsushita Electric Industrial Corp Ltd
-10F8 Altos India Ltd
-10F9 PC Direct
-10FA TrueVision
- 0000 GUI Accelerator (BT848KPF)
- 0001 GUI Accelerator
- 0002 GUI Accelerator
- 0003 GUI Accelerator
- 0004 GUI Accelerator
- 0005 GUI Accelerator
- 0006 GUI Accelerator
- 0007 GUI Accelerator
- 0008 GUI Accelerator
- 0009 GUI Accelerator
- 000A GUI Accelerator
- 000B GUI Accelerator
- 000C Video Capture & Editing card (Targa 1000)
- 000D GUI Accelerator
- 000E GUI Accelerator
- 000F GUI Accelerator
- 0010 GUI Accelerator
- 0011 GUI Accelerator
- 0012 GUI Accelerator
- 0013 GUI Accelerator
- 0014 GUI Accelerator
- 0015 GUI Accelerator
-10FB Thesys Microelectronic's
- 186F TH 6255
-10FC I-O Data Device Inc.
- 0003 Cardbus IDE Controller
- 0005 Cardbus SCSI CBSC II
- 8139 10 (4020011B)
-10FD Soyo Technology Corp. Ltd.
- 7E50 -
-10FE Fast Multimedia AG
-10FF N-Cube
-1100 Jazz Multimedia
- 3044 IEEE1394 Firewire 3 Port PCI Card (VT6306L)
-1101 Initio Corporation
- 0002 Ultra SCSI Adapter (INI-920)
- 1060 Orchid Ultra-2 SCSI Controller (INI-A100U2W)
- 134A Ultra SCSI Adapter
- 1622 PCI SATA Controller (INIC1620)
- 9100 Fast Wide SCSI Controller (INI-9010/9010W)
- 9400 Fast Wide SCSI Controller (INIC-940)
- 9401 Fast Wide SCSI Controller (INIC-935)
- 9500 SCSI Initio ultra wide inci-950 (1101)
- 9502 pci sata controller (INIC-1620)
- 9700 Fast Wide SCSI Controller
-1102 Creative Technology LTD.
- 0002 Sound Blaster Live! (Also Live! 5.1) - OEM from DELL - CT4780 (CT5880DCQ)
- 0003 AWE64D OEM (CT4600) (EMU8008)
- 0004 Audigy Audio Processor (Creative SB Audigy 2 ZS (WDM))
- 0005 SoundBlaster X-FI XtremeMusic (SB0460)
- 0006 Soundblaster Live! 5.1 (SB0200) (emu10k1x)
- 0007 Device ID same for both, but Subsystem ID = 0x1012 - Extreme Audio, 0x100A - Audigy SE 7.1 (C6SB0410515017656A)
- 0008 sound blaster Audigy 2 (ca0108)
- 1017 3D Blaster Banshee PCI CT6760 (ct4830)
- 1020 3D Blaster RIVA TNT2 (NV5)
- 1047 3D Blaster Annihilator 2 (EV1938)
- 1371 ?
- 2898 es56t-p1 (es2898)
- 4001 Audigy IEEE1394a Firewire Controller (EMU10K1)
- 647D AC'97 Audio Device
- 7002 GamePort (EMU10K1)
- 7003 Creative Labs SB Audigy MIDI/Game port (EMU10K2 )
- 7004 Game port for SB Live! Series
- 7005 Audigy LS Series Game Port
- 7802 Environmental Audio (SB Live) (EMU1OK1-NGF)
- 8064 SB0100 (SBLive! 5.1 OEM)
- 8938 Sound (EV1938)
- 9838 Ectiva EV1938
-1103 Triones Technologies Inc. (HighPoint)
- 0003 HPT343/5/6,HPT363 UDMA EIDE Controller
- 0004 ATA Raid Controller/ATA 100 (HPT366/368/370/370A/372)
- 0005 PATA133 Raid Controller (HPT372/372N)
- 0006 HPT302N UDMA/ATA133 RAID Controller
- 0007 HPT371/N UDMA/ATA133 EIDE Controller
- 0008 HPT374 Rocket 154x/1640, RocketRAID 154x/1640 RAID EIDE Controller
- 0009 HPT372N UDMA/ATA133 RAID Controller (OEM)
- 1720 RR172x SATA Controller (RR172x)
- 1740 RR174x SATA Controller (RR174x)
- 1742 RR174x SATA Controller (RR174x)
- 2210 RR2210 SATA Controller (RR2210)
- 2300 RocketRAID 230x SATA Controller
- 2310 RocketRAID 231x SATA Controller
- 2320 RocketRAID 2320 SATA-II Controller
- 2322 RocketRAID 2322 SATA-II Controller
- 2340 RocketRAID 2340 16 Port SATA-II Controller
- 2522 RR252x SATA Controller (RR252x)
- 3120 RR312x SATA Controller (RR312x)
- 3220 RR322x SATA Controller (RR322x)
- 3320 RR332x SATA Controller (RR332x)
- 3410 RR341x SATA Controller (RR341x)
- 3510 RR35xx SATA Controller (RR35xx)
- 3511 RR35xx SATA Controller (RR35xx)
- 3520 RR35xx SATA Controller (RR35xx)
- 3521 RR35xx SATA Controller (RR35xx)
- 3522 RR35xx SATA Controller (RR35xx)
- 3540 RR35xx SATA Controller (RR35xx)
- 4320 RR432x SATA Controller (RR432x)
- 5081 RR18xx SATA Controller (RR18xx)
- 6081 RR222x/224x SATA Controller (RR222x/224x)
- 7042 RR231x SATA Controller (RR231x)
-1104 Rasterops
-1105 Sigma Designs Inc.
- 1105 REALmagic XCard MPEG 1/2/3/4 DVD Decoder
- 5000 Multimedia
- 8300 EM8300 MPEG-2 Decoder (REALmagic Hollywood Plus)
- 8400 MPEG-2 Decoder (EM8400)
- 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder
- 8470 multimedia controller/A/V streaming processor (EM8470)
- 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder
- 8475 EM8475 MPEG-1/2/4 Decoder Card for Video & Audio
- 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder
- 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder
- 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder
- C622 EM8622L MPEG-4.10 (H.264) and SMPTE 421M (VC-1) A/V Decoder
- C623 Media Decoder SoC (EM8623L)
-1106 VIA Technologies, Inc.
- 0102 Embedded VIA Ethernet Controller
- 0130 VIA Fire 1394.A OHCI Link Layer Ctrlr (VT6305)
- 0198 P4X600 CPU to PCI Bridge
- 0204 K8M400 CPU to PCI Bridge
- 0208 PT890 Standard Host Bridge
- 0238 CPU to PCI Bridge (K8T890)
- 0258 PT880 CPU to PCI Bridge
- 0259 Host Bridge (CN400/PM880)
- 0269 CPU to PCI Bridge (KT880)
- 0282 CPU to PCI Bridge (K8T880Pro)
- 0290 K8M890 Standard Host Bridge
- 0293 PM896 Host Bridge
- 0296 P4M800 Standard Host Bridge
- 0305 VT8363/5 KT133/KM133 System Controller
- 0308 PT894 Standard Host Bridge
- 0314 CN700/VN800/P4M800CE/Pro Host Bridge
- 0324 CX700 Host Bridge
- 0327 P4M890 Standard Host Bridge
- 0336 K8M890CE Host Bridge
- 0340 PT900 Host Bridge
- 0351 VT3351 Host Bridge
- 0364 P4M900 Host Bridge
- 0391 VT8371 KX133 System Controller
- 0397 VIA High Definition Audio (VT1708S)
- 0501 VT8501 Apollo MVP4 System Controller
- 0505 VLB to PCI Bridge (82C505)
- 0561 VT82C570 MV IDE Controller (Single FIFO)
- 0571 Bus Master IDE Controller (VT82C686B/VT823x/A/C)
- 0576 VT82C57x MV System Controller
- 0581 Bus Master IDE Controller; CX700/VX700 RAID Controller
- 0585 VT82C585 Apollo VP,VPX,VPX-97 System Controller
- 0586 VT82C586/A/B PCI to ISA Bridge
- 0591 VIA VT8237A SATA RAID Controller (VT8237S)
- 0595 VT82C595 Apollo VP2,VP2-97 System Controller
- 0596 VT82C596/A/B "Mobile South" PCI to ISA Bridge
- 0597 VT82C597/597AT/598MVP Apollo VP3/MVP3 System Controller
- 0598 VT82C598MVP Apollo MVP3 System Controller
- 0601 VT8601 Apollo PLE133 CPU to PCI Bridge
- 0605 VT8605 ProSavage PM133 System Controller
- 0680 Apollo P6 (VT82C680)
- 0686 VT82C686/A/B "Super South" PCI to ISA Bridge
- 0691 VT82C691/693A/694X Apollo Pro/133/133A System Controller
- 0692 Apollo Pro/BX Chipset
- 0693 VT82C693 Apollo Pro Plus CPU to PCI Bridge
- 0698 VT82C693A Apollo Pro133 AGP
- 0926 VT86C926 Amazon NE2000-Compatible PCI Ethernet Controller
- 1000 VT82C570 MV System Controller
- 1106 VIA Sound VIA AC97 in VT82C686A/B, VIA AC97 in VT8233/AC, VT8235 & VT8237/R, VIA Vinyl audio VT1612A (060000A1106)
- 1107 ISA Bridge w/IDE (060000A)
- 1204 K8M400 CPU to PCI Bridge
- 1208 PT890 Standard Host Bridge
- 1238 CPU to PCI Bridge (K8T890)
- 1258 PT880 CPU to PCI Bridge
- 1259 CN400/PM880 CPU to PCI Bridge
- 1269 CPU to PCI Bridge (KT880)
- 1282 CPU to PCI Bridge (K8T880Pro)
- 1290 K8M890 Standard Host Bridge
- 1293 PM896 Host Bridge
- 1296 P4M800 Standard Host Bridge
- 1308 PT894 Standard Host Bridge
- 1314 CN700/VN800/P4M800CE/Pro Standard Host Bridge
- 1324 CX700 Host Bridge
- 1327 P4M890 Standard Host Bridge
- 1336 K8M890CE Host Bridge
- 1340 PT900 Host Bridge
- 1351 VT3351 Host Bridge
- 1364 P4M900 Host Bridge
- 1401 ISA Bridge w/IDE (060000A)
- 1571 IDE Controller (VT82C416)
- 1595 VT82C595 Apollo VP2,VP2-97 System Controller
- 1708 High Definition Audio controller (VIA VT1708 )
- 2006 VIA Rhine III VT6105M Fast Ethernet controller (VT6105M)
- 2106 VT6105 Rhine Family Fast Ethernet Adapter
- 2204 K8M400 CPU to PCI Bridge
- 2208 PT890 Standard Host Bridge
- 2238 CPU to PCI Bridge (K8T890)
- 2258 PT880 CPU to PCI Bridge
- 2259 Host Bridge (CN400/PM880)
- 2269 CPU to PCI Bridge (KT880)
- 2282 CPU to PCI Bridge (K8T880Pro)
- 2290 K8M890 Standard Host Bridge
- 2293 PM896 Host Bridge
- 2296 P4M800 Standard Host Bridge
- 2308 PT894 Standard Host Bridge
- 2314 CN700/VN800/P4M800CE/Pro Standard Host Bridge
- 2324 CX700 Host Bridge
- 2327 P4M890 Standard Host Bridge
- 2336 K8M890CE Host Bridge
- 2340 PT900 Host Bridge
- 2351 VT3351 Host Bridge
- 2364 P4M900 Host Bridge
- 287A VT8251 Standard PCI to PCI Bridge
- 287B VT8251 Standard PCI to PCIe Bridge
- 287C VT8251 Standard PCIe Root Port
- 287D VT8251 Standard PCIe Root Port
- 287E VT8251 Ultra VLINK Controller
- 3022 CLE266
- 3038 VT82xxxxx UHCI USB 1.1 Controller (All VIA Chipsets)
- 3040 VT83C572, VT86C586/A/B Power Management Controller
- 3041 ISA Bridge w/IDE (82C570MV)
- 3043 Rhine 10/100 Ethernet Adapter (VT86C100A)
- 3044 VT6306 VIA Fire II IEEE-1394 OHCI Link Layer Controller
- 3050 Power Management and SMBus Controller (VT82C596/596A/596)
- 3051 Power Management Controller
- 3053 Rhine III Management Adapter (VT6105M)
- 3057 ACPI Power Management Controller (VT82C686A/B)
- 3058 AC97 Audio Codec (All VIA Chipsets) (VT8275)
- 3059 VT8233/A AC'97 Enhanced Audio Controller
- 3065 Rhine II PCI Fast Ethernet Controller (VT6103)
- 3068 VIA MC97 controller for AC-Link modems (PCIVEN_1106&DEV_3068&SUBSYS_100B14FF&REV_803&267)
- 3074 PCI to ISA Bridge (VT8233)
- 3086 VT82C686 Power Management Controller (??)
- 3091 VT8633 Apollo Pro 266 CPU to PCI Bridge
- 3099 VT8366/A,VT8367 Apollo KT266/A,KT333 CPU to PCI Bridge
- 3101 VT8653 Apollo Pro 266T CPU to PCI Bridge
- 3102 VT8362 ProSavage KN133 CPU to PCI Bridge
- 3103 CPU to PCI Bridge (VT8615)
- 3104 VT6202/12 USB 2.0 Enhanced Host Controller
- 3106 Rhine III PCI Fast Ethernet Controller (VT6105M/LOM)
- 3107 PCI to ISA Bridge (VT8233/A AC97' Enhance Audio Controller)
- 3108 Via Unichrome S3 VGA - part of a VIA Northbridge (8380)
- 3109 PCI to ISA Bridge (VT8233/A AC97' Enhance Audio Controller)
- 3112 VT8361 Apollo KLE133 System Controller
- 3113 VPX/VPX2 PCI to PCI Bridge
- 3116 VT8375 ProSavageDDR PM266/KM266 CPU to PCI Bridge
- 3118 Via Built-In VGA S3 Graphics UniChrome Pro IGP Series CN400 (CN400)
- 3119 'Velocity' Gigabit Ethernet Controllers (VT6120/VT6121/VT6122)
- 3122 VT8623 Apollo CLE266 CastleRock AGP 8X Controller
- 3123 VT8623 Apollo CLE266 CastleRock CPU to PCI Bridge
- 3128 VT8753 Apollo P4X266 System Controller
- 3133 CPU to PCI Bridge (VT3133)
- 3147 PCI to ISA Bridge (VT8233)
- 3148 VT8751 ProSavageDDR P4M266 System Controller
- 3149 SATA RAID Controller (VT8237 Family/ VT6420)
- 3156 VT8372 ProSavageDDR PN266/KN266 CPU to PCI Bridge
- 3157 VIA/S3G Unichrome Pro IAGP (VIA VT8237)
- 3158 ProSavageDDR P4N266 CPU to PCI Bridge
- 3164 VIA VT6410 PATA/PATA RAID Controller (VT6410)
- 3168 P4X400 Host Controller/AGP Bridge (VT8374)
- 3177 PCI to ISA Bridge (VT8235)
- 3178 ProSavageDDR P4N333 CPU to PCI Bridge
- 3188 Apollo K8T800 CPU to PCI Bridge
- 3189 VT8377 Apollo KT400/A/600 CPU to PCI Bridge
- 3198 CPU-to-PCI Bridge (VEN_1106&DEV_B198&SUBSYS_00000000&REV_00)
- 3202 K8N400 CPU to PCI Bridge
- 3204 CPU to PCI Bridge (1394 i2c)
- 3205 CPU to PCI Bridge (PCIVEN_1106&DEV_3205&SUBSYS_00000000&REV_003&61A)
- 3208 CPU to PCI Bridge (PT890)
- 3209 P4M400 CPU to PCI Bridge
- 3213 VPX/VPX2 PCI to PCI Bridge
- 3218 K8T800M CPU to PCI Bridge
- 3227 PCI-to-ISA Bridge (VT8237)
- 3230 Integrated Graphics (K8M890CE & K8N890CE Display Driver)
- 3238 CPU-to-PCI Bridge (K8T890)
- 3249 VIA VT6421 RAID Controller - Windows XP 32.bit (VT6421)
- 324A CX700 PCI to PCI Bridge
- 324B CX700 Host Bridge
- 324E CX700 Internal Module Bus
- 3258 CPU-to-PCI Bridge (PT880)
- 3259 PM880 CPU to PCI Bridge
- 3260 VIA Chrome9 HC IGP
- 3269 CPU to PCI Bridge (KT880)
- 3282 CPU to PCI Bridge (K8T880Pro)
- 3287 VT8251 Standard PCI to ISA Bridge
- 3288 HDA Codec Realtek ALC660 (040300)
- 3290 K8M890 Standard Host Bridge
- 3296 P4M800 Standard Host Bridge
- 3324 CX700 Host Bridge
- 3327 P4M890 Host Bridge
- 3336 K8M890CE Host Bridge
- 3337 VT8237A Standard PCI to ISA Bridge
- 3340 PT900 Host Bridge
- 3343 VIA S3G UniChrome Family (81CE1043)
- 3344 VIA/S3G UniChrome Pro IGP (VT3314)
- 3349 VIA VT8251 AHCI RAID Controller (VT8251)
- 3351 VT3351 Host Bridge
- 3364 P4M900 Host Bridge
- 3371 VIA Chrome9 HC IGP (P4M900)
- 3372 VT8237S PCI to ISA Bridge
- 337A VT8237A Standard PCI to PCI Bridge
- 337B VT8237A Standard PCI to PCIe Bridge
- 4149 VT6420 ATA/ATAPI Host Controller
- 4204 K8M400 CPU to PCI Bridge
- 4208 PT890 Standard Host Bridge
- 4238 K8T890 CPU to PCI Bridge
- 4258 PT880 CPU to PCI Bridge
- 4259 CN400/PM880 CPU to PCI Bridge
- 4269 CPU to PCI Bridge (KT880)
- 4282 CPU to PCI Bridge (K8T880Pro)
- 4290 K8M890 Standard Host Bridge
- 4293 PM896 Host Bridge
- 4296 P4M800 Standard Host Bridge
- 4308 PT894 Standard Host Bridge
- 4314 CN700/VN800/P4M800CE/Pro Host Bridge
- 4324 CX700 Host Bridge
- 4327 P4M890 Host Bridge
- 4336 K8M890CE Host Bridge
- 4340 PT900 Host Bridge
- 4351 VT3351 Host Bridge
- 4364 P4M900 Host Bridge
- 5030 ACPI Power Management Controller (VT82C596)
- 5208 PT890 I/O APIC Interrupt Controller
- 5238 K8T890 I/O APIC Interrupt Controller
- 5287 Serial ATA Controller
- 5290 K8M890 I/O APIC Interrupt Controller
- 5308 Via I/O APIC Interrupt Controller (PT880 Pro / VT8237)
- 5324 CX700M2 Bus Master IDE Controller
- 5327 P4M890 I/O APIC Interrupt Controller
- 5336 K8M890CE I/O APIC Interrupt Controller
- 5337 Serial ATA Controller
- 5340 PT900 I/O APIC Interrupt Controller
- 5351 VT3351 I/O APIC Interrupt Controller
- 5364 P4M900 I/O APIC Interrupt Controller
- 5372 SATA Controller
- 6010 VT86C100A Rhine II Fast Etheenet Adapter (Error??)
- 6100 Rhine II PCI Fast SATA and ethernet controller (VIA VT86C100A)
- 6287 VT8251 AHCI Controller
- 6327 P4M890 Security Device
- 6340 Security Device
- 6364 P4M900 Security Device
- 7204 CPU to PCI Bridge (K8M400)
- 7205 VIA Technologies, Inc. VT8378 [S3 UniChrome] Graphics Adapter (KM400)
- 7208 PT890 Standard Host Bridge
- 7238 CPU to PCI Bridge (K8T890)
- 7258 CPU to PCI Bridge (PT880)
- 7259 CPU to PCI Bridge (PM880)
- 7269 CPU to PCI Bridge (KT880)
- 7282 CPU to PCI Bridge (K8T880Pro)
- 7290 K8M890 Standard Host Bridge
- 7293 PM896 Host Bridge
- 7296 P4M800 Standard Host Bridge
- 7308 PT894 Standard Host Bridge
- 7314 CN700/VN800/P4M800CE/Pro Host Bridge
- 7324 CX700 Host Bridge
- 7327 P4M890 Standard Host Bridge
- 7336 K8M890CE Host Bridge
- 7340 PT900 Host Bridge
- 7351 VT3351 Host Bridge
- 7353 SATA RAID (CX700)
- 7364 P4M900 Host Bridge
- 7372 SATA RAID (VT8237)
- 8208 PT890 (??) PCI to AGP Bridge
- 8231 PCI to ISA Bridge (VT8231)
- 8235 VT8235 Power Management Controller
- 8237 AC97 Enhanced Audio Controller - the 8251 controller is different (VT8237)
- 8305 VT8363/5 Apollo KT133/KM133 PCI to AGP Bridge
- 8324 CX700 PCI to ISA Bridge
- 8391 VT8371 Apollo KX133 PCI to AGP Bridge
- 8501 VT8501 Apollo MVP4 PCI to AGP Bridge
- 8596 VT82C596 Apollo Pro PCI to AGP Bridge
- 8597 VT82C597 Apollo VP3 PCI to AGP Bridge
- 8598 VT82C598MVP/694x Apollo MVP3/Pro133x PCI to AGP Bridge
- 8601 VT82C601 Apollo PLE133 CPU to AGP Bridge
- 8602 PCI to AGP Bridge
- 8605 VT8605 ProSavage PM133 CPU to AGP Bridge
- 8691 VT82C691/693A/694X Apollo Pro/133/133A PCI to PCI Bridge
- 8693 VT82C693 Apollo Pro Plus PCI to PCI Bridge
- 9238 I/O APIC (K8T890)
- 9398 2D/3D Graphics Accelerator (VT8601)
- 9530 Via MSP Cardreader driver (050100)
- 9876 PCI to ISA Bridge (VT8233/A AC97' Enhance Audio Controller)
- A208 PCI-to-PCI Bridge (PT890)
- A238 PCI-to-PCI Bridge (K8T890)
- A327 P4M890 PCI to PCI Bridge Controller
- A364 P4M900 PCI to PCI Bridge Controller
- B091 VT8633 Apollo Pro 266 CPU to AGP Controller
- B099 VT8366/A,VT8367 Apollo KT266/A,KT333 PCI to AGP Bridge
- B101 VT8653 Apollo Pro 266T CPU to AGP Controller
- B102 PCI-to-PCI Bridge (AGP) (VT8362)
- B103 PCI-to-PCI Bridge (AGP) (VT8615)
- B112 VT8361 Apollo KLE133 CPU to AGP Controller
- B113 VPX/VPX2 I/O APIC
- B115 VT8363/5 KT/KM133 CPU to AGP Controller
- B116 VT8375 ProSavageDDR PM266/KM266 PCI to AGP Bridge
- B133 CPU to AGP Controller (vt686b)
- B148 VT8751 ProSavageDDR P4M266 CPU to AGP Bridge
- B156 VT8372 ProSavageDDR PN266/KN266 PCI to AGP Bridge
- B158 PCI-to-PCI Bridge (AGP) (VIA Technologies Inc)
- B168 ProSavageDDR P4X333 CPU to AGP 2.0/3.0 Bridge
- B188 PCI-to-PCI Bridge (AGP 2.0/3.0) (3200+)
- B198 ProSavageDDR P4X600,Apollo KT400/A/600 CPU to AGP Bridge
- B213 VPX/VPX2 I/O APIC
- B999 K8T890 PCI Bridge
- C208 PCI-to-PCI Bridge (PT890)
- C238 PCI-to-PCI Bridge (K8T890)
- C327 P4M890 PCI to PCI Bridge Controller
- C340 PT900 PCI to PCI Bridge Controller
- C364 P4M900 PCI to PCI Bridge Controller
- D104 VT8237 Integrated Fast Ethernet Controller
- D208 PCI-to-PCI Bridge (PT890)
- D213 VPX/VPX2 PCI to PCI Bridge
- D238 PCI-to-PCI Bridge (K8T890)
- D340 PT900 PCI to PCI Bridge Controller
- E208 PCI-to-PCI Bridge (PT890)
- E238 PCI-to-PCI Bridge (K8T890)
- E340 PT900 PCI to PCI Bridge Controller
- F208 PCI-to-PCI Bridge (PT890)
- F238 PCI-to-PCI Bridge (K8T890)
- F340 PT900 PCI to PCI Bridge Controller
-1107 Stratus Computer
- 8576 PCI Host Bridge
-1108 Proteon Inc.
- 0100 P1690Plus-AA Single Port Token Ring Adapter
- 0101 P1690Plus-AB Dual Port Token Ring Adapter
- 0105 Token Ring Adapter (P1690Plus)
- 0108 Token Ring Adapter (P1690Plus)
- 0138 Token Ring Adapter (P1690Plus)
- 0139 Token Ring Adapter (P1690Plus)
- 013C Token Ring Adapter (P1690Plus)
- 013D Token Ring Adapter (P1690Plus)
-1109 Adaptec/Cogent Data Technologies
- 1400 EX110TX PCI Fast Ethernet Adapter (EM110TX)
-110A Siemens PC Systeme GmBH
- 0002 Piranha PCI-EIDE-Adapter (2 Port)
- 0005 Tulip-Controller, Power-Management, Switch Extender
- 0006 PINC
- 0015 Multiprocessor Interrupt Controller (MINT)
- 0017 PCI-WAN Adapter (SiemensCard PWAN)
- 001D Copernicus Management Controller
- 113C FPGA-CPTR Hardware Tracer for CP113C/CP113D
- 113E FPGA-CPTRE Hardware Tracer for CP113E
- 2101 Multichannel Network Interface Controller for HDLC (PEB 20321)
- 2102 DMA supported serial communication controller with 4 channels (PEB 20534)
- 2103 PEB 20324 MUNICH128X Multichannel NIC for HDLC + Extensions
- 2104 PSB 4600/4610 PCI Interface for Telephony Applications (PITA)
- 2106 PEB 20256E Multichannel NIC for HDLC/PPP (256 Channels)
- 2108 PEB 20256M E MUNICH256FM NIC for HDLC/PPP (256 Channels)
- 3141 PROFIBUS Communication Processor CP5611 A2 (01)
- 3160 MCCA Pentium-PCI Host Bridge Core ASIC
- 4033 EB400 ProfiNet Device-Kit (ERTEC400)
- 4942 FPGA I-Bus Tracer for MBD
- 6120 SZB6120 Multimedia Adapter
-110B CHROMATIC Research Inc / Xenon Microsystems
- 0001 Media Processor (Mpact)
- 0002 MPACT DVD decoder. (GM90C7110VX)
- 0004 Integrated video card (Mpact)
-110C Mini-Max Technology Inc
-110D ZNyX Corp
-110E CPU Technology
-110F Ross Technology
-1110 Powerhouse Systems
- 6037 Firepower Powerized SMP I/O ASIC
- 6073 Firepower Powerized SMP I/O ASIC
-1111 Caldera Systems Inc (Was: Santa Cruz Operation)
-1112 Osicom Technologies Inc.
- 2200 FDDI adapter (2200)
- 2300 Fast Ethernet adapter (2300)
- 2340 4 Port Fast Ethernet Adapter
- 2400 ATM adapter (2400)
-1113 Accton Technology Corporation
- 1211 Ethernet Controller 10/100 MBit (EN5030, EN5038)
- 1216 EN-5251 Based Fast Ethernet Adapter
- 1217 Ethernet Adapter (EN-2242)
- 5105 10Mbps Network Card
- 9211 Fast Ethernet Adapter (EN-1207D)
- 9511 0445tabgf16143.1 (SMC en5251be)
- 9876 Ethernet Controller/ drivers (EN5251BE)
-1114 Atmel Corp.
- 0506 802.11b Wireless Network Adaptor (AT76C506)
- 3202 TPM - Trusted Platform Module (AT97SC3202)
-1115 Dupont Pixel Systems Ltd
-1116 Media 100 Inc (Was: Data Translation)
- 0022 DT3001
- 0023 DT3002
- 0024 DT3003
- 0025 DT3004
- 0026 DT3005
- 0027 DT3001-PGL
- 0028 DT3003-PGL
-1117 Datacube Inc.
- 9500 Max-1C SVGA Card
- 9501 MaxPCI image processing board
-1118 Berg Electronics
-1119 ICP-Vortex Computersysteme GmbH
- 0000 PCI SCSI RAID Controller (GDT6000/6020/6050)
- 0001 PCI 1-channel SCSI RAID Controller (GDT6000/6010)
- 0002 PCI 1-channel SCSI RAID Controller (GDT6110/6510)
- 0003 PCI 2-channel SCSI RAID Controller (GDT6120/6520)
- 0004 PCI 3-channel SCSI RAID Controller (GDT6530)
- 0005 PCI 5-channel SCSI RAID Controller (GDT6550)
- 0006 Wide Ultra SCSI Controller (GDT6117/6517)
- 0007 Wide Ultra SCSI Controller (GDT6127/6527)
- 0008 Wide Ultra SCSI Controller (GDT6537)
- 0009 Wide Ultra SCSI Controller (GDT6557/6557-ECC)
- 000A Ultra SCSI Controller (GDT6115/6515)
- 000B Wide SCSI Controller (GDT6125/6525)
- 000C Wide SCSI Controller (GDT6535)
- 000D Wide SCSI Controller (GDT6555/6555-ECC)
- 0100 2 Channel Wide Ultra SCSI (GDT6117RP/6517RP)
- 0101 Wide Ultra SCSI HBA (GDT6127RP/6527RP)
- 0102 Wide Ultra SCSI HBA (GDT6537RP)
- 0103 Wide Ultra SCSI HBA (GDT6557RP)
- 0104 Ultra SCSI HBA (GDT6111RP/6511RP)
- 0105 Ultra SCSI HBA (GDT6121RP/6521RP)
- 0110 Wide Ultra SCSI HBA (GDT6117RD/6517RD)
- 0111 Wide Ultra SCSI HBA (GDT6127RD/6527RD)
- 0112 Wide Ultra SCSI HBA (GDT6537RD)
- 0113 Wide Ultra SCSI HBA (GDT6557RD)
- 0114 Ultra SCSI HBA (GDT6111RD/6511RD)
- 0115 Ultra SCSI HBA (GDT6127RD/6527RD)
- 0118 Wide Ultra2 SCSI HBA (GDT6x18RD)
- 0119 Wide Ultra2 SCSI HBA (GDT6x28RD)
- 011A Wide Ultra2 SCSI HBA (GDT6538RD/6638RD)
- 011B Wide Ultra2 SCSI HBA (GDT6558RD/6658RD)
- 0120 GDT6117RP2/6517RP2
- 0121 GDT6127RP2/6527RP2
- 0122 GDT6537RP2
- 0123 GDT6557RP2
- 0124 GDT6111RP2/6511RP2
- 0125 GDT6127RP2/6527RP2
- 0136 GDT 6113RS/6513RS
- 0137 Disk Array Controller (GDT 6x23RS)
- 0138 GDT 6118RS/6518RS/6618RS
- 0139 GDT 6128RS/6528RS/6628RS
- 013A IBM IXA - Integrated xSeries Adapter (GDT 6x38RS)
- 013B GDT 6558RS/6658RS
- 013C GDT 6533RS/6633RS
- 013D GDT 6543RS/6643RS
- 013E GDT 6553RS/6653RS
- 013F GDT 6563RS/6663RS
- 0166 GDT 7113RN/7513RN/7613RN
- 0167 GDT 7123RN/7523RN/7623RN
- 0168 64-bit PCI Wide Untra2 SCSI HBA (GDT7x18RN)
- 0169 64-bit PCI Wide Ultra2 SCSI HBA (GDT7x28RN)
- 016A 64-bit PCI Wide Ultra2 SCSI HBA (GDT7538RN/7638RN)
- 016B 64-bit PCI Wide Ultra2 SCSI HBA (GDT7558RN/7658RN)
- 016C GDT 7533RN/7633RN
- 016D GDT 7543RN/7643RN
- 016E GDT 7553RN/7653RN
- 016F GDT 7563RN/7663RN
- 01D6 GDT 4x13RZ
- 01D7 GDT 4x23RZ
- 01F6 GDT 8x13RZ
- 01F7 BtYVKixCnmzB
- 01FC GDT 8x33RZ
- 01FD GDT 8x43RZ
- 01FE GDT 8x53RZ
- 01FF GDT 8x63RZ
- 0210 Fibre Channel HBA (GDT6519RD/6619RD)
- 0211 Fibre Channel HBA (GDT6529RD/6629RD)
- 0260 64-bit PCI Fibre Channel HBA (GDT7519RN/7619RN)
- 0261 64-bit PCI Fibre Channel HBA (GDT7529RN/7629RN)
- 02F6 GDT8x22RZ Disk Array Controller
- 0300 GDT Rx Controller
-111A Efficient Networks Inc
- 0000 155P-MF1 (FPGA)
- 0002 155P-MF1 (ASCI)
- 0003 ATM Adapter (ENI-25P)
- 0005 SpeedStream ENI-30x0 ATM Adapter
- 0007 SpeedStream ADSL
-111B Teledyne Electronic Systems
-111C Tricord Systems Inc.
- 0001 Powerbis Bridge
-111D Integrated Device Technology Inc.
- 0001 NICStAR ATM Adapter (IDT77201/211)
- 0003 MICRO ABR SAR PCI ATM Controller (IDT77222/252)
- 0004 MICRO ABR SAR PCI ATM Controller (IDT77V252)
- 7608 IDT High Definition Audio CODEC (IDT Audio CODEC)
- 7618 SigmaTel High Definition Audio CODEC (STAC9227)
- 7634 IDT/Sigmae HDl Audio Driver v6.10.5939.0 05/06/2008 (IDT_Audiov5939)
- 7662 IDT/Sigmae HDl Audio Driver v6.10.5939.0 05/06/2008 (IDT_Audiov5939)
- 7675 92HD73C1 (92HD73C1)
- 76B2 IDT Audio (92HD71B7)
- 76D5 0x3649 (0x76D5)
-111E Eldec Corp
-111F Precision Digital Images
- 4A47 Video engine interface (Precision MX)
- 5243 Frame Capture Bus Interface
-1120 EMC Corp
-1121 Zilog
-1122 Multi-Tech Systems Inc
-1123 Excellent Design Inc
-1124 Leutron Vision AG
-1125 Eurocore
-1126 Vigra
-1127 FORE Systems Inc
- 0200 ForeRunner PCA-200 ATM Adapter
- 0210 PCA-200PC ATM Adapter
- 0250 ATM
- 0300 PCA-200EPC ATM Adapter
- 0310 ATM
- 0400 ATM Adapter (ForeRunner HE)
-1129 Firmworks
-112A Hermes Electronics Co Ltd
-112B Linotype - Hell AG
-112C ZENITH DATA Systems
-112D Ravicad
-112E Infomedia Microelectronics
- 0000 EIDE/hdd and IDE/cd-rom Ctrlr
- 000B EIDE/hdd and IDE/cd-rom Ctrlr
-112F Imaging Technlogy Inc
- 0000 MVC IC-PCI
- 0001 Video Frame Grabber / Processor
-1130 Computervision
- F211 USB Audio Sound Card (0x010)
-1131 Animation Technologies Inc
- 1001 BlueTooth Adapter ISSCBTA [Tripper USB Dongle] (bm05e )
- 1131 01384E42y8
- 1201 VPN IPSEC coprocessor (PTD3000)
- 1234 EHCI USB 2.0 Controller
- 1301 SSL Accelerator (PTD3210)
- 1562 EHCI USB 2.0 Controller (ISP1561)
- 2780 TV deflection controller (TDA2780AQ)
- 3400 UCB1500 Modem Device
- 3401 Multimedia Audio Device (UCB1500)
- 5400 Multimedia processor (TriMedia TM1000/1100)
- 5402 Media Processor (TriMedia TM-1300EH)
- 5406 TriMedia PNX1700
- 7130 PCI video broadcast decoder (SAA7130HL)
- 7133 Phillips TV7131 WDM video capture (Phillips TV7131 WDM video capture)
- 7134 SAA7134HL Multimedia Capture Device
- 7135 SAA???? Multimedia Device(??)
- 7145 SAA7145 Multimedia PCI Bridge
- 7146 PCIVEN_1131&DEV_7130&SUBSYS_D1091461&REV_013&61AAA01&0&60 (saa7146)
- 7160 PCIVEN_13D0&DEV_2103&SUBSYS_210313D0&REV_024&1AF1648C&0&10F0 (Philips SAA7134E, TDA10046 and TDA8275A)
- 7162 SAA7162 Hybrid Capture Device
- 9730 Ethernet controller (SAA9730)
-1132 Mitel Corp
-1133 Eicon Networks Corp (Was: Eicon Technology)
- 7711 EiconCard C91
- 7901 EiconCard S90
- 7902 EiconCard S90
- 7911 EiconCard S91
- 7912 EiconCard S91
- 7941 EiconCard S94
- 7942 EiconCard S94
- 7943 EiconCard S94
- 7944 EiconCard S94
- 7945 EiconCard S94
- 7948 EiconCard S94 64-bit/66MHz
- 9711 EiconCard C91 rev 2.0
- B921 EiconCard P92
- B922 EiconCard P92
- B923 EiconCard P92
- E001 DIVA Pro 2.0 S/T
- E002 DIVA 2.0 S/T
- E003 DIVA Pro 2.0 U
- E004 chip (DIVA 2.0 U)
- E005 Eicon ISDN card using Siemens IPAC chip (DIVA 2.01 S/T)
- E006 Diva CT S/T PCI
- E007 Diva CT U PCI
- E008 Diva CT Lite S/T PCI
- E009 Diva CT Lite U PCI
- E00A Diva ISDN+V.90 PCI
- E00B Eicon ISDN card using Infineon chip (DIVA ISDN 2.02 PCI)
- E00C Diva 2.02 PCI U
- E00D Diva ISDN Pro 3.0 PCI
- E00E Diva ISDN+CT S/T PCI Rev 2
- E010 DIVA Server BRI-2M (Maestra)
- E011 Diva Server BRI 2.0
- E012 DIVA Server BRI-8M (MaestraQ)
- E013 DIVA Server 4BRI/PCI (MaestraQ-U)
- E014 DIVA Server PRI-30M (MaestraP)
- E015 Diva Server PRI-30M PCI v.2
- E016 Diva Server Voice 4BRI PCI
- E017 Diva Server Voice 4BRI PCI Rev 2
- E018 DIVA Server BRI-2M/-2F (00)
- E019 DIVA Server Voice PRI 2.0 PCI
- E01A Diva Server 2FX
- E01B Diva Server BRI-2M Voice Revision 2
- E01C Diva Server PRI Rev 3.0
- E01E Diva Server 2PRI
- E020 Diva Server 4PRI
- E022 Diva Server Analog-2P
- E024 Diva Server Analog-4P
- E028 Diva Server Analog-8P
- E02A Diva Server IPM-300
- E02C Diva Server IPM-600
-1134 Mercury Computer Systems Inc.
- 0001 audio driver (3059)
- 0002 Dual PCI to RapidIO Bridge (DPRB)
- 9876 aodio driver (3059)
-1135 Fuji Xerox Co Ltd
- 0001 Printer Controller
-1136 Momentum Data Systems
-1137 Cisco Systems Inc
-1138 Ziatech Corporation
- 8905 STD 32 Bridge (8905)
-1139 Dynamic Pictures Inc
- 0001 VGA Compatable 3D Graphics
-113A FWB Inc
-113B Network Computing Devices
-113C Cyclone Microsystems Inc.
- 0000 i960 Bridge (PCI9060)
- 0001 i960 Bridge / Evaluation Platform (PCI9060)
- 0911 i960Jx I/O Controller (PCI911)
- 0912 i960Cx I/O Controller (PCI912)
- 0913 i960Hx I/O Controller (PCI913)
- 0914 I/O Controller with secondary PCI bus (PCI914)
-113D Leading Edge Products Inc
-113E Sanyo Electric Co
-113F Equinox Systems
- 0808 Adapter (SST-64P)
- 1010 Adapter (SST-128P)
- 80C0 SST-16P Adapter
- 80C4 SST-16P Adapter
- 80C8 SST-16P Adapter
- 80D0 SST-16P Adapter
- 8888 SST-4P Adapter
- 9090 SST-8P Adapter
-1140 Intervoice Inc
-1141 Crest Microsystem Inc
- 0001 EIDE/ATAPI super adapter
-1142 Alliance Semiconductor
- 3210 ProMotion 3210(6410?) VGA and AVI Playback Accelerator
- 6410 GUI Accelerator (6410 6422)
- 6412 GUI Accelerator
- 6420 GUI Accelerator
- 6422 ProMotion-6422 (ProMotion-6422)
- 6424 ProMotion AT24 GUI Accelerator (ProVideo 6424)
- 6425 0752 20005 (ProMotion AT25)
- 6426 GUI Accelerator
- 643D ProMotion-AT3D (AT25)
- 9876 139K76B 9808 (ProMotion 6422)
-1143 Netpower Inc
-1144 Vickers Inc/Cincinnati Milacron
- 0001 Noservo Controller
-1145 Workbit Corp
- 8007 NinjaSCSI-32 Workbit
- F)21 HDCClassName=
- F007 NinjaSCSI-32 KME
- F010 NinjaSCSI-32 Workbit
- F012 NinjaSCSI-32 Logitec
- F013 NinjaSCSI-32 Logitec
- F015 NinjaSCSI-32 Melco
- F020 CardBus ATAPI Host Adapter
- F021 CardBus CompactFlash Adapter (NPATA32)
- F024 CardBus CompactFlash Adapter (NPATA-32)
-1146 Force Computers
-1147 Interface Corp
- 1123 131dq
-1148 Marvell Semiconductor Germany GmbH
- 4000 FDDI adapter (SK-NET)
- 4200 Token Ring Adapter
- 4300 SK-NET Gigabit Ethernet Adapter (SysKonnect Genesis)
- 4320 SysKonnect Gigabit Ethernet SK-98xx Version 2.0 (Marvell Yukon D-Link DGE530T)
- 4362 Marvell Yukon 88E8053 based Ethernet Controller (88E8053)
- 4400 SK-9Dxx Gigabit Ethernet Adapter
- 4500 SK-9Mxx Gigabit Ethernet Adapter
- 9000 PCI-X 10/100/1000Base-T Server (Marvell Yukon II PCI-X)
- 9843 [Fujitsu] Gigabit Ethernet
- 9E00 PCI Express 10/100/1000Base-T Desktop (Marvell Yukon EC)
-1149 Win System Corp
-114A VMIC
- 5565 Ultrahigh-Speed Fiber-Optics Reflective Memory w/ Interrupts (VMIPCI-5565)
- 5579 Reflective Memory Card (VMIPCI-5579)
- 5587 VMIPCI-5587 Reflective Memory Card
- 5588 VMICPCI5588 Reflective Memory Card (VMICPCI5588)
- 6504 VMICPCI-7755 FPGA
- 7587 VMIVME-7587
-114B Canopus Co Ltd
-114C Annabooks
-114D IC Corporation
- 2189 PCTel HSP56 PCI Modem (0x1002114D)
-114E Nikon Systems Inc
-114F Digi International
- 0002 AccelePort EPC/X
- 0003 RightSwitch SE-6
- 0004 driver (AccelePort Xem)
- 0005 AccelePort Xr EIA-232
- 0006 AccelePort C/X
- 0007 Digi Data Fire PCI 1 S/T (DataFire PCI 1 S/T)
- 0009 AccelePort Xr/J EIA-232
- 000A AccelePort EPC/X
- 000C DataFirePRIme T1 (1-port)
- 000D SyncPort 2-Port (x.25/FR)
- 0011 AccelePort 8r EIA-232 (IBM)
- 0012 AccelePort 8r EIA-422
- 0013 AccelePort Xr EIA-232
- 0014 AccelePort 8r EIA-422
- 0015 AccelePort Xem
- 0016 AccelePort EPC/X
- 0017 AccelePort C/X
- 0019 Datafire PCI 1 U (Multifunction)
- 001A DataFirePRIme E1 (1-port)
- 001B AccelePort C/X (IBM)
- 001D T1/E1/PRI (DataFire RAS)
- 001F ClydeNonCsu6034
- 0020 ClydeNonCsu6032
- 0021 ClydeNonCsu4
- 0022 ClydeNonCsu2
- 0023 AccelePort RAS
- 0024 DataFire RAS B4 ST/U
- 0026 AccelePort 4r 920
- 0027 AccelePort 8r 920
- 0028 ClassicBoard 4
- 0029 DigiClassic PCI
- 0034 AccelePort 2r 920
- 0035 T1/E1/PRI, Compact PCI (DataFire DSP)
- 0040 AccelePort Xp
- 0042 AccelePort 2p PCI
- 0043 AccelePort 4p
- 0044 AccelePort 8p
- 0045 AccelePort 16p
- 004E AccelePort 32p
- 0070 Datafire Micro V IOM2 (Europe)
- 0071 Datafire Micro V (Europe)
- 0072 Datafire Micro V IOM2 (North America)
- 0073 Datafire Micro V (North America)
- 0081 DataFire SYNC 2000 2P Adapter
- 00B0 Digi Neo 4
- 00B1 Digi Neo 8
- 00C8 Digi Neo 2 DB9
- 00C9 Digi Neo 2 DB9 PRI
- 00CA Digi Neo 2 RJ45
- 00CB Digi Neo 2 RJ45 PRI
- 00D0 ClassicBoard 4 422
- 00D1 ClassicBoard 8 422
- 5012 DataFire Sync/570i 2P PCI Adapter
- 5013 DataFire Sync/570i 4P PCI Adapter
- 6001 Avanstar
-1150 Thinking Machines Corp
-1151 JAE Electronics Inc
-1152 Megatek
-1153 Land Win Electronic Corp
-1154 Melco Inc
-1155 Pine Technology Ltd
- 0810 486 CPU/PCI Bridge
- 0922 Pentium CPU/PCI Bridge
- 0926 PCI/ISA Bridge
-1156 Periscope Engineering
-1157 Avsys Corp
-1158 Voarx R&D Inc
- 3011 Tokenet/vg 1001/10m anylan
- 9050 Lanfleet/Truevalue
- 9051 Lanfleet/Truevalue
-1159 MuTech Corp
- 0001 MV-1000
- 0002 Frame Grabber (MV-1500)
-115A Harlequin Ltd
-115B Parallax Graphics
-115C PHOTRON Ltd
-115D Xircom
- 0003 Cardbus Ethernet 10/100+Modem 56 (RBEM56G-100)
- 0005 CardBus Ethernet 10/100
- 0007 CardBus Ethernet 10/100
- 000B CardBus Ethernet 10/100
- 000C Mini-PCI V.90 56k Modem (MPCI 3A56GSP-100 PA)
- 000F CardBus Ethernet 10/100
- 0016 MPCI Modem 56
- 0022 MPCI Modem 56
- 0029 MPCI Modem 56
- 002B Winmodem built into NEC Versa VXi
- 0076 Xircom MPCI3B-56G (Lucent SCORPIO) Soft
- 00D3 Xircom MPCI Modem 56
- 00D4 Modem 56k (MPCI)
- 0101 CardBus 56k Modem (Ms0612006303)
- 0103 CardBus Ethernet + 56k Modem
- 0104 RealPort2 CardBus Modem 56
-115E Peer Protocols Inc
-115F MAXTOR Corp
-1160 Megasoft Inc
-1161 PFU Ltd
- 0001 Host Bridge
-1162 OA Laboratory Co Ltd
-1163 mohamed alsherif
- 0001 3D Blaster (Verite 1000)
- 2000 Rendition V2200 (BLITZ 2200 AGP) (Rendition V2200 (1179-002))
-1164 Advanced Peripherals Tech
-1165 Imagraph Corporation
- 0001 Motion JPEG Recorder/Player with Audio
-1166 ServerWorks (Was: Reliance Computer Corp)
- 0000 CMIC-LE
- 0005 PCI to PCI Bridge, bus/dev/func 0/0/1 (NB6536 (CNB20-LE))
- 0006 Host Bridge, function 2 and function 3 (NB6536 (CNB20-HE))
- 0007 CPU to PCI Bridge (NB6635 (CNB20-LE/HE))
- 0008 Hostbridge & MCH, bus/dev/func 0/0/0 (NB6536 (CNB20-HE))
- 0009 AGP interface (NB6536 (CNB20-LE))
- 0010 CIOB30
- 0011 CMIC-HE
- 0012 CMIC-LE
- 0013 CNB20-HE CPU to PCI Bridge & MCH
- 0014 Host Bridge (CNB20-HE)
- 0015 CMIC-GC CPU to PCI Bridge & MCH
- 0016 Host Bridge (CMIC-GC)
- 0017 CMIC-SL
- 0031 HT1100 HPX0 HT Host Bridge
- 0036 HT1000 PCI/PCI-X bridge
- 0101 CIOB-X2
- 0103 EPB PCIe to PCI-X Bridge
- 0104 HT1000 PCI/PCI-X bridge
- 0110 I/O Bridge with Gigabit Ethernet ServerWorks Grand Champion (CIOB-E)
- 0130 HT1000 PCI-X bridge
- 0132 HT1000 PCIe bridge
- 0140 HT2100 PCIe Bridge
- 0141 HT2100 PCIe Bridge
- 0142 HT2100 PCIe Bridge
- 0144 HT2100 PCI-Express Bridge
- 0200 PCI to ISA Bridge (OSB4)
- 0201 CSB5 PCI to ISA Bridge
- 0203 PCI to ISA Bridge (CSB6)
- 0205 HT1000 Legacy South Bridge
- 0211 OSB4 PCI EIDE Controller
- 0212 CSB5 PCI EIDE Controller
- 0213 OSB6/CSB6 PCI EIDE Controller
- 0214 HT1000 Legacy IDE controller
- 0217 PCI EIDE Controller (Tertiary) (OSB6)
- 021B HT1100 HD Audio
- 0220 OpenHCI Compliant USB Controller (OSB4)
- 0221 OHCI Compliant USB Controller (OSB6)
- 0223 USB controller (0x0223)
- 0225 PCI Bridge (CSB5)
- 0227 PCI Bridge (CSB6)
- 0230 PCI to ISA Bridge
- 0234 HT1000 LPC Bridge
- 0235 Keypad Controller
- 0236 Local Display Controller
- 0237 NVRAM Controller
- 0238 BCM5785 [HT1000] WDTimer
- 0240 K2 SATA
- 0241 8-Channel RAIDCore SATA RAID Host Bus Adapter (BC4852)
- 0242 RAIDCore BC4000
- 024A Broadcom/Serverworks HT1000 SATA Controller (HT1000)
- 024B BCM5785 (HT1000) PATA/IDE Mode
- 0406 HT1100 PCI-X Bridge
- 0408 HT1100 Legacy Device
- 040A HT1100 ISA-LPC Bridge
- 0410 HT1100 SATA Controller (Native SATA Mode)
- 0411 HT1100 SATA Controller (PATA / IDE Mode)
- 0412 HT1100 USB OHCI Controller
- 0414 HT1100 USB EHCI Controller
- 0416 HT1100 USB EHCI Controller (with Debug Port)
- 0420 HT1100 PCI-Express Bridge
- 0421 HT1100 SAS/SATA Controller
- 0422 HT1100 PCI-Express Bridge
-1167 Mutoh Industries Inc
-1168 Thine Electronics Inc
-1169 Centre for Development of Advanced Computing
- 0102 32 Channel Digital Input Card Interface (QL5032)
- 0202 16 Channel Digital Output, 16 Channel Digital Input Interface (QL5032)
- 0302 32 Channel Analog Input Interface (QL5032)
- 0402 16 Channel Analog Output / Analog Input Interface (QL5032)
- 0502 8 Channel Timer Counter Interface (QL5232)
- 0902 PCI to TigerSHARC FPGA Interface (QL5232)
- 2001 PCI to C-DAC RTU bus interface FPGA (Ql5032-33APQ208C)
-116A Polaris Communications
- 6100 BUS/Tag Channel
- 6800 Escon Channel
- 7100 Bus/Tag Channel
- 7800 Escon Channel
-116B Connectware Inc
-116C Intelligent resources
-116D Martin-Marietta
-116E Electronics for Imaging
- 0015 Fiery EX2000D RIP Card Melbourne VX120 (VX120)
- 0500 Printer ASIC (Vx500)
-116F Workstation Technology
-1170 Inventec Corp
-1171 Loughborough Sound Images
-1172 Altera Corporation
- 0001 S CCA5000243A (EPF6016ATC144-2)
- 0004 Multi-serial card (-epf6016qc240-2)
- 0007 Altera FPGA board (StratixIIGX)
- D4AA Arria GX (EP1AGX90EF1152C6N)
-1173 Adobe Systems
-1174 Bridgeport Machines
-1175 Mitron Computer Inc
-1176 One Stop Systems (Was: SBE Inc; Bought out)
- 8474 Conexant Multichannel Synchronous Communications Controller (MUSYCC) (42000133)
-1177 Silicon Engineering
-1178 Alfa Inc
- AFA1 Fast Ethernet Adapter
-1179 Toshiba America Information Systems
- 0102 Extended PCI IDE Controller (toshiba america info systems)
- 0103 Extended PCI IDE Controller Type-B
- 0404 DVD Decoder Card
- 0406 Video Capture device (Tecra a2)
- 0407 DVD Decoder Card (Version 2)
- 0601 Toshiba CPU to PCI bridge (0555873412)
- 0602 PCI to ISA Bridge for Notebooks
- 0603 PCI to CardBus Bridge for Notebooks (ToPIC95)
- 0604 PCI to PCI Bridge for Notebooks
- 0605 PCI to ISA Bridge for Notebooks
- 0606 PCI to ISA Bridge for Notebooks
- 0609 PCI to PCI Bridge for Notebooks
- 060A Toshiba ToPIC95 CardBus Controller (ToPIC95B)
- 060F CardBus Controller (ToPIC97)
- 0611 PCI to ISA Bridge
- 0617 PCI to CardBus Bridge with ZV support (ToPIC100)
- 0618 CPU to PCI and PCI to ISA Bridge
- 0701 PCI Communication Device (vt82c693)
- 0804 Toshiba Smart Media Host Controller (0x0804)
- 0805 SD Card Controller (PCIVEN_1179&DEV_0805&SUBSYS_FF001179&REV_03 )
- 0D01 FIR Port Type-O (0x0D01)
- 13A8 Multi-channel PCI UART (XR17C158/154/152)
-117A A-Trend Technology
-117B LG (Lucky Goldstar) Electronics Inc.
- 8320 USB DEVICE (NOFM12)
-117C Atto Technology
- 0030 Ultra320 SCSI Host Adapter
-117D Becton Dickinson
-117E T/R Systems
- 0001 Printer Host
-117F Integrated Circuit Systems
-1180 Ricoh Co Ltd
- 0465 RL5c465 CardBus Controller
- 0466 RL5c466 CardBus Controller
- 0475 Cardbus Controller (RL5c592)
- 0476 Ricoh R/RL/5C476(II) (unknown)
- 0477 RL5c477 CardBus Controller
- 0478 Cardbus Controller (RB5c478)
- 0511 R5C511
- 0522 R5C522 IEEE-1394 Controller
- 0551 R5C551 IEEE-1394 Controller
- 0552 FireWire (IEEE 1394) Controller (R5C552)
- 0554 R5C554
- 0575 SD Bus Host Adapter
- 0576 SD Bus Host Adapter
- 0592 Ricoh Memory Stick Host Controller (13171043)
- 0811 R5C811
- 0822 SDA Standard Compliant SD Host Controller (R5C832)
- 0832 IEEE 1394 (4 pin firewire) chip) (30CF103C)
- 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394
- 0843 Ricoh SD/MMC Host Controller (R5C853)
- 0852 http://driverzone.com/device.php?id=51441 (01cf1028)
- 5551 IEEE 1394 Controller (Unknown)
- E230 Ricoh PCIe Memory Stick Host Controller (R5U230)
- E832 Ricoh PCIe IEEE1394 Fireware Host Controller (R5U832)
-1181 Telmatics International
-1183 Fujikura Ltd
-1184 Forks Inc
-1185 Dataworld International Ltd
- 8929 EIDE Controller
-1186 D-Link System Inc
- 0100 DEC DC21041-Based Ethernet Adapter
- 1002 Fast Ethernet Adapter (DFE-550TX/580TX/DFE-550FX)
- 1025 DWL-G650 AirPlus Xtreme G Adapter
- 1026 DWL-AG650 AirXpert Wireless CardBus Adapter
- 1043 DWL-AG650 AirXpert Wireless CardBus Adapter
- 1100 Fast Ethernet Adapter (driv16c003206)
- 1300 DFE-528TX/530TX+/538TX Fast Ethernet Adapter (DL 10038C Chipset)
- 1301 Fast Ethernet Adapter (DGE-528T )
- 1340 Fast Ethernet CardBus PC Card (DFE-690TXD)
- 1405 DFE-520TX Fast Ethernet PCI Adapter
- 1541 DFE-680TXD CardBus PC Card
- 1561 CardBus PC Card (DRP-32TXD)
- 2027 DWL-G520 AirPlus Xtreme G Adapter
- 3065 D-Link DFE-500Tx PCI fast Ethernet adapter Re v.A (14001186)
- 3106 Fast Ethernet Adapter (DFE 530TX+ rev E1)
- 3203 DWL-G520 AirPlus Xtreme G Adapter
- 3300 IEEE 802.11g PCI card (D-Link Air Wireless Network (DWL-G510))
- 3A03 DWL-A650 AirPro Wireless CardBus Adapter(rev.B)
- 3A04 DWL-AB650 AirPro Multimode Wireless CardBus Adapter
- 3A05 DWL-AB520 AirPro Multimode Wireless PCI Adapter
- 3A07 DWL-AG650 AirXpert Wireless CardBus Adapter
- 3A08 DWL-AG520 AirXpert Wireless PCI Adapter
- 3A10 DWL-AG650 AirXpert Wireless CardBus Adapter(rev.B)
- 3A11 DWL-AG520 AirXpert Wireless PCI Adapter(rev.B)
- 3A12 DWL-G650 AirPlus Wireless CardBus Adapter(rev.C)
- 3A13 DWL-G520 AirPlus Wireless PCI Adapter(rev.B)
- 3A14 DWL-AG530 AirPremier Wireless PCI Adapter
- 3A63 DWL-AG660 AirXpert Wireless CardBus Adapter
- 3B00 D-LINK DWL-650+ (0x3b001186)
- 3B05 DWL-G650+ CardBus PC Card
- 3C09 Ralink RT61 (DWL-G510 Version C1)
- 4000 Gigabit Ethernet Adapter (DL2000)
- 4001 D Link Fast Ethernet PCMCIA Card (DFE-650TX)
- 4300 Used on DGE-528T Gigabit adaptor (dlg10086)
- 4346 DGE-560SX Single Fiber Gigabit Ethernet PCI-E Adapter V.A1
- 4B00 DGE-560T PCIe Gigabit Ethernet Adapter
- 4B01 DGE-530T V.B1 Gigabit Ethernet Adapter (rev 11)
- 4B02 DGE-560SX PCIe Gigabit Ethernet Adapter
- 4B03 DGE-550T Gigabit Ethernet Adapter V.B1
- 4C00 Gigabit Ethernet Adapter (DGE-530T)
- 8400 DWL-650+ CardBus PC Card
-1187 Advanced Technology Laboratories
-1188 Shima Seiki Manufacturing Ltd
-1189 Matsushita Electronics Co
- 1592 VL/PCI Bridge
-118A Hilevel Technology
-118B Hypertec Pty Ltd
-118C Corollary Inc
- 0014 C-bus II to PCI bus host bridge chip (PCIB)
- 1117 MAC-94C201B3 Profusion Memory Controller Chip [Xeon 8-way SMP]
-118D BitFlow Inc
- 0001 Raptor-PCI framegrabber (n/a)
- 0012 Road Runner Frame Grabber (Model 12)
- 0014 Road Runner Frame Grabber (Model 14)
- 0024 Road Runner Frame Grabber (Model 24)
- 0044 Road Runner Frame Grabber (Model 44)
- 0112 Road Runner Frame Grabber (Model 12)
- 0114 Road Runner Frame Grabber (Model 14)
- 0124 Road Runner Frame Grabber (Model 24)
- 0144 Road Runner Frame Grabber (Model 44)
- 0212 Road Runner Frame Grabber (Model 12)
- 0214 Road Runner Frame Grabber (Model 14)
- 0224 Road Runner Frame Grabber (Model 24)
- 0244 Road Runner Frame Grabber (Model 44)
- 0312 Road Runner Frame Grabber (Model 12)
- 0314 Road Runner Frame Grabber (Model 14)
- 0324 Road Runner Frame Grabber (Model 24)
- 0344 Road Runner Frame Grabber (Model 44)
-118E Hermstedt GmbH
- 0042 ?
- 0142 ?
- 0242 ?
- 0342 ?
- 0440 ?
- 0442 ?
- 0842 ?
-118F GREEN LOGIC
-1190 Tripace
- 2550 Single Chip Ultra (Wide) SCSI Processor (TC-2550)
- C721 EIDE
- C731 PCI Ultra (Wide) SCSI Adapter (TP-910/920/940)
-1191 Acard Technology Corp.
- 0001 EIDE Adapter
- 0002 UltraDMA33 EIDE Controller (AEC6210UF) (ATP850UF)
- 0003 SCSI Cache Host Adapter
- 0004 ATP8400 UltraDMA33 EIDE (Cache??) Controller (AEC6210UF)
- 0005 UltraDMA33 EIDE Controller (AEC6210UF) (ATP850UF)
- 0006 ATP860A UltraDMA66 EIDE Controller, NO-BIOS (AEC6260)
- 0007 UltraDMA66 EIDE Controller (AEC6260) (ATP860R)
- 0008 2CH PCI UltraDMA133 IDE Controller (ATP865)
- 0009 2CH PCI UltraDMA133 IDE Controller (ATP865)
- 000A ACARD AEC-6885/6895/6896 RAID Controller (aec6885)
- 000B ACARD AEC-6897/6898 RAID Controller (AEC6897/6898)
- 000D 2S1P PCI-X SATA(3G)/UDMA Combo Controller (ATP8620)
- 8001 ATP8600 SCSI-2 RAID (Cache??) Host Adapter (AEC6820U)
- 8002 SCSI-2 Host Adapter (AEC6710L/F/s) (ATP850S)
- 8010 ATP870 Ultra Wide SCSI Contoller (AEC6712UW)
- 8020 ATP870 Ultra SCSI Controller (AEC6712U)
- 8030 ATP870 SCSI Controller (AEC6710S/6712S)
- 8040 ATP870 SCSI Controller (AEC6710D)
- 8050 AEC6712SUW SCSI Controller
- 8060 SCSI Host Adapter (AEC671x)
- 8081 PCI Ultra160 LVD/SE SCSI Adapter (AEC-67160)
- 808A AEC67162 PCI Ultra3 LVD/SE Controller (ATP885)
-1192 Densan Co Ltd
-1193 Zeitnet
- 0001 ZN1221 ATM Adapter
- 0002 ZN1225 ATM Adapter
-1194 Toucan Technology
-1195 Ratoc System Inc
-1196 Hytec Electronics Ltd
-1197 Gage Applied Sciences Inc
- 010C 8-bit 2GS/s Analog Input Card (CompuScope 82G)
-1198 Lambda Systems Inc
-1199 Attachmate Corp.
- 0001 IRMA 3270 PCI Adapter
- 0002 Advanced ISCA PCI Adapter
- 0201 SDLC PCI Adapter
-119A Mindshare Inc
-119B Omega Micro Inc.
- 1221 PCI PCMCIA bridge (82C092G)
-119C Information Technology Institute
-119D Bug Sapporo Japan
-119E Fujitsu Microelectronics Ltd.
- 0001 FireStream 155 ATM adapter (MB86697)
- 0003 FireStream 50 ATM adapter (MB86695)
-119F Bull Hn Information Systems
-11A0 Convex Computer Corp
-11A1 Hamamatsu Photonics K.K.
-11A2 Sierra Research and Technology
-11A3 Deuretzbacher GmbH & Co ENG. KG
-11A4 Barco Graphics NV
-11A5 MicroUnity Systems Engineering Inc
-11A6 Pure Data Ltd
-11A7 Power Computing Corp
-11A8 Systech Corp.
- 7302 NTX-8023-PCI 2MB Long Card
- 7308 NTX-8023-PCI 8MB Long Card
- 7402 NTX-8023-PCI 2MB Short Card
- 7408 NTX-8023-PCI 8MB Short Card
-11A9 InnoSys Inc.
- 4240 pci matchmaker 9622qac (AMCC S5933Q)
-11AA Actel
-11AB Marvell Semiconductor (Was: Galileo Technology Ltd)
- 0146 GT-64010/A System Controller for R4xxx/5000 Family CPUs
- 11AB Gigabit Ethernet Controler (88E8055 PCI-E)
- 138F W8300 802.11 Adapter
- 13F8 802.11 Adapter (W8300)
- 1FA6 The Libertas WLAN 802.11b/g (88W8300)
- 1FA7 88W8310 and 88W8000G Libertas 802.11g Chipset
- 1FAA Marvell Libertas 802.11b/g Wireless (8335)
- 1FAB Libertas 802.11b/g Wireless LAN Client Adapter
- 2A01 Libertas 802.11a/b/g Wireless Controller (CB55)
- 2A30 PCI-Express 802.11bg Wireless (88W8687)
- 4320 Yukon 88E8001/8003/8010 PCI Gigabit Ethernet Controller (Copper)
- 4340 Yukon 88E8021 PCI-X IPMI Gigabit Ethernet Controller
- 4341 Yukon 88E8022 PCI-X IPMI Gigabit Ethernet Controller
- 4342 Yukon 88E8061 PCI-E IPMI Gigabit Ethernet Controller
- 4343 Yukon 88E8062 PCI-E IPMI Gigabit Ethernet Controller
- 4344 Yukon 88E8021 PCI-X IPMI Gigabit Ethernet Controller
- 4345 Yukon 88E8022 PCI-X IPMI Gigabit Ethernet Controller
- 4346 Yukon 88E8061 PCI-E IPMI Gigabit Ethernet Controller
- 4347 Yukon 88E8062 PCI-E IPMI Gigabit Ethernet Controller
- 4350 Yukon PCI-E Fast Ethernet Controller (88E8036)
- 4351 Yukon PCI-E Fast Ethernet Controller (88E8036)
- 4352 Marvell Yukon 88E8038 PCI-E Fast Ethernet Controller (88E8038)
- 4353 Gigabit (88E8039 - http://www.marvell.com/drivers/driverDis)
- 4354 Marvell Yukon 88E8040 PCI-E Fast Ethernet Controller (88E8040)
- 4355 Marvell Yukon 88E8040T PCI-E Fast Ethernet Controller (88E8040T)
- 4356 Yukon 88EC033 PCI-E Fast Ethernet Controller
- 4357 marvell ethernet lan (0)
- 4360 Yukon PCI-E ASF Gigabit Ethernet Controller (88E8050)
- 4361 Yukon 88E8050 PCI-E ASF Gigabit Ethernet Controller
- 4362 Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller (88E8053)
- 4363 Yukon PCI-E Gigabit Ethernet Controller (88E8055)
- 4364 Yukon PCI-E Gigabit Ethernet Controller (88E8056)
- 4365 Yukon 88E8070 PCI-E Gigabit Ethernet Controller
- 4366 Yukon 88EC036 PCI-E Gigabit Ethernet Controller
- 4367 Yukon 88EC032 based Ethernet Controller
- 4368 Yukon 88EC034 based Ethernet Controller
- 4369 Yukon 88EC042 PCI-E Gigabit Ethernet Controller
- 436A Yukon 88E8058 PCI-E Gigabit Ethernet Controller
- 436B Yukon 88E8071 PCI-E Gigabit Ethernet Controller
- 436C Marvell 8072 Ethernet Nic (88E8072)
- 4380 Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller (88e8057)
- 4611 System Controller (GT-64115)
- 4620 System Controller for R5000 & R7000 (64-bit PCI) (GT-64120)
- 4801 GT-48001 8-port Switched Ethernet Controller
- 4809 GT-48300 4-port (2.4Gb each) Crossbar Switch
- 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card
- 5040 4-port SATA I PCI-X Controller (88SX5040)
- 5041 4-port SATA I PCI-X Controller (88SX504)
- 5080 MV88SX5080 8-port SATA PCI-X Controller
- 5081 MV88SX5081 8-port SATA PCI-X Controller
- 6041 Marvell Technology Group Ltd. MV88SX6041 4-port SATA II PCI-X Controller (rev 03) (MV88SX6041)
- 6042 MV88SX6042 4-port SATA II PCI-X Controller
- 6081 MV88SX6081 8-port SATA II PCI-X Controller
- 6101 PATA 133 One Channel (88SE6101)
- 6111 6111 SATA2 Controller
- 6120 6120 SATA2 Controller
- 6121 6121 SATA2 Controller
- 6122 6122 SATA2 Controller
- 6140 6140 SATA2 Controller
- 6141 6141 SATA2 Controller
- 6145 Add-on IC to provide 4x SATA Ports, attached to ICH7 (SthBridge?) via PCI-Express. (88SE6145)
- 6320 System Controller for PowerPC Processors (GT-64130/131)
- 6440 64xx/63xx SAS
- 6460 MV64360/64361/64362 System Controller
- 6480 MV64460/64461/64462 System Controller
- 6485 System Controller for PowerPC Processors, Revision B (MV6446x)
- 7042 MV88SXxxxx Family 4-port SATA II PCIe Controller (??)
- 9653 Advanced Communication Controller (GT-96100A)
- F003 Primary Image Piranha Image Generator (GT-64010)
- F004 Primary Image Barracuda Image Generator (GT64120)
- F006 Primary Image Cruncher Geometry Accelerator (GT-64120A)
- FFFF PATA2SATA/SATA2PATA Bridge (88SA8040)
-11AC Canon Information Systems
-11AD Lite-On Communications Inc
- 0001 LC82C168 Fast Ethernet Adapter (??)
- 0002 NETGEAR FA310TX Fast Ethernet PCI Adapter (LC82C169C)
- C115 PNIC II PCI MAC/PHY (LC82C115)
-11AE Scitex Corporation Ltd
- 4153 Bridge Controller
- 5842 Bridge Controller
-11AF Pro-Log Corp/AVID Technology Inc
- 0001 Cinema (9704)
- 000A Nitris
- 000B Nitris DX / Mojo DX
-11B0 V3 Semiconductor Inc
- 0001 i960 Local Bus to PCI Bridge (V960PBC/PSC)
- 0002 i960Jx Local Bus to PCI Bridge (V961PBC/PSC)
- 0004 i960Cx/Hx Local Bus to PCI Bridge (V962PBC/PSC)
- 0010 Am29K Local Bus to PCI Bridge (V292PBC/PSC)
- 0021 i960Sx Local Bus to PCI Bridge (V363EPC)
- 0022 i960Jx Local Bus to PCI Bridge (V363EPC)
- 0024 i960Cx/Hx Local Bus to PCI Bridge (V363EPC)
- 0030 Am29K Local Bus to PCI Bridge (V363EPC)
- 0100 V320USC PCI System Controller for 32-bit MIPS CPUs (9 bit SYSCMD Bus)
- 0101 V320USC PCI System Controller for 32-bit MIPS CPUs (5 bit SYSCMD Bus)
- 0102 V320USC PCI System Controller for Super-H SH3 CPU
- 0103 V320USC PCI System Controller for Super-H SH4 CPU
- 0200 V370PDC High Perf. SDRAM Controller & I/O Control Unit
- 0292 V292PBC Am29030/40 PCI Bridge
- 0500 V340HPC PCI System Controller for 64-bit MIPS CPUs
- 0960 i960 Bridges for i960 Processors (V96xPBC)
- C960 i960 Dual PCI Bridge (V96DPC)
-11B1 Apricot Computers
-11B2 Eastman Kodak
-11B3 Barr Systems Inc
-11B4 Leitch Technology International
-11B5 Radstone Technology Ltd.
- 0001 1553 Bus Interface Card (PMC/PMX1553)
- 0002 FLASH memory Card (PMCF1)
- 0003 Multi Media Adapter (PMCMMA)
- 0004 Video Graphics Overlay (PMCVGO)
- 0005 PPzero Slave Interface Card (PMCPCIS)
- 0006 PPzero Master Interface Card (PMCPCIM)
- 0007 Serial/1553 Interface Card (PMCQ1)
- 0008 Intelligent Serial/Ethernet Card (EPMCQ2)
- 0009 Parallel I/O Module (PMCPIO1)
- 000A Fibre Channel Adapter (PMCFA1C)
- 000B High Speed DSP Gateway Module (PMCHH1)
- 000C Memory Adaptor Module (PMCMA2)
- 0012 FLASH memory Card (V2) (PMCF1)
- 0013 1553 Bus Interface Card (PMC1553EX)
- 0014 1553 Bus Interface Card (PMC1553E)
- 2200 Dual Fibre Channel Adapter (PMCFA2C)
-11B6 United Video Corp
-11B7 Motorola
-11B8 Xpoint Technologies Inc
- 0001 Quad PeerMaster
-11B9 Pathlight Technology Inc.
- C0ED SSA Controller
-11BA Videotron Corp
-11BB Pyramid Technology/DAPHA Electronics Corp
-11BC Network Peripherals Inc
- 0001 PCI FDDI (NPI NuCard)
-11BD Pinnacle Systems Inc
- 0015 rob2d (660806-2.0)
- 1158 spcialit lectronique et informatique
- 11BD maintenance informatique
- BEBE MAINTENANCE INFORMATIQUE VENTE DE CONSOMABLE (51015777)
- BEDE MB87J3560 (51011810)
-11BE International Microcircuits Inc
-11BF Astrodesign Inc
-11C0 Hewlett Packard
-11C1 Lucent/Agere Systems (Was: AT&T MicroElectronics)
- 0420 CardBus 56k Modem
- 0440 Data+Fax+Voice+DSVD (LT Winmodem 56k)
- 0441 LT WinModem 56k Data+Fax
- 0442 LT WinModem 56K Data+Fax (1646T00)
- 0443 1646T00 (LT Winmodem)
- 0444 845G (LT Winmodem)
- 0445 LT WinModem
- 0446 PCIVEN_10DE&DEV_0446&SUBSYS_73691462&REV_A13&267A616A&0&09 (LT Winmodem)
- 0447 windowsme (LT Winmodem)
- 0448 SV2P2 (LT Winmodem 56k)
- 0449 0449144F (LT Winmodem 56k)
- 044A LT WinModem 56k
- 044B LT WinModem
- 044C 9M56PML-G (LT Winmodem)
- 044D LT WinModem
- 044E LT WinModem 56k Data+Fax or Agere F-1156IV/A3
- 044F LT V.90+DSL WildFire Modem (90094-1)
- 0450 LT Winmodem 56K (1456VQH19R-1(INT))
- 0451 LT WinModem 56k Data+Fax+Voice+DSVD (LT Winmodem)
- 0452 1513144 (LT Winmodem)
- 0453 LT WinModem
- 0454 LT WinModem
- 0455 LT WinModem
- 0456 LT WinModem
- 0457 LT WinModem
- 0458 Mars 3 Mercury v.92 v.44 (1648C)
- 0459 LT WinModem
- 045A LT WinModem
- 045B LT WinModem
- 045C LT WinModem
- 045D mars2 (LT WinModem)
- 0461 V90 Wildfire Modem
- 0462 56K.V90/ADSL Wildwire Modem (1690)
- 0464 Lucent Wildwire v.90 + DSL modem (This is NOT a Riptide! (as previously stated))
- 0480 56k.V90/ADSL Wildfire Modem (Venus Winmodem)
- 048B creative modem blaster di5733-1 (1648T00)
- 048C net-comm modem (1648c-tv5)
- 048D 9m56pml-g (lt winmodem)
- 048E 56k V.92modem (svp92pl-t00)
- 048F Agere PCI Soft Modem. SV92PL (SV92P-T00)
- 0540 ?
- 0600 SV92P-T00 Agere PCI Soft Modem. SV92PL (sv92p2)
- 0620 Agere PCI Soft Modem (SV92PP)
- 1040 VEN_11C1&DEV_1040&SUBSYS_11790001 (Prespa)
- 11C1 VEN_11C1&DEV_0620&SUBSYS_11790001&REV_1002 (Prespa)
- 3026 Agere Systems HDA Modem (0x11c11040)
- 5400 FPSC FPGA with 32/64bit, 33/66MHz core (OR3TP12)
- 5801 USB Open Host Controller
- 5802 2-port PCI-to-USB OpenHCI Host Ctrlr (USS-312MC)
- 5803 USS-344 Quadrabus 4-port OpenHCI USB Host Controller
- 5805 USB Advanced Host Controller (uss344)
- 5811 1394A PCI PHY/Link Open Host Ctrlr I/F (FW322)
- 5901 firewire chip for macbook pro (unknown)
- 7121 ?
- 9876 LT WinModem 56K Data+Fax (lucent 1646T00)
- AB10 WL60010 Wireless LAN MAC
- AB11 WL60040 Multimode Wireles LAN MAC
- AB20 PCI Wireless LAN Adapter (WaveLAN)
- AB21 Wireless PCI Adapter
- AB30 Mini-PCI WaveLAN a/b/g (wlsam48d)
- ED00 ET-131x PCI-E Gigabit Ethernet Adapter
- ED01 ET-1301 PCI-E Fast Ethernet Adapter
-11C2 Sand Microelectronics
-11C3 NEC Corp
-11C4 Document Technologies Industries
-11C5 Shiva Corp
-11C6 Dainippon Screen MFG Co Ltd
- 3001 VM-1200 Opto Unit Controller
-11C7 D.C.M. Data Systems
-11C8 Dolphin Interconnect Solutions
- 0658 32 bit , 33 Mhz PCI-SCI Bridge (PSB 32)
- AB34 802.11b MiniPCI Wireless Card
- D665 64 bit , 33 Mhz PCI-SCI Bridge (PSB64)
- D667 64 bit , 66 Mhz PCI-SCI Bridge. (D33x) (PSB66)
-11C9 Magma
- 0010 16-line serial port w/- DMA
- 0011 4-line serial port w/- DMA
-11CA LSI Systems Inc
-11CB Specialix International Ltd.
- 2000 port small IC (PCI-9050-1100083-11)
- 4000 XIO/SIO Host (SUPI-1)
- 8000 Bridge RIO Host (T225)
- 9501 SPEED4+ PCI Adapter
- 9511 SPEED4+ PCI Adapter Local Bus
-11CC Michels & Kleberhoff Computer GmbH
-11CD HAL Computer Systems Inc
-11CE Primary Rate Inc
- 102B FF00102B (1001)
-11CF Pioneer Electronic Corp
-11D0 Loral Frederal Systems - Manassas
-11D1 AuraVision Corporation
- 01F7 PCI Video Processor (VxP524)
- 01F8 PCI Video Processor (VxP524)
- 01F9 tuner card (rev_03)
-11D2 Intercom Inc
-11D3 Trancell Systems Inc
-11D4 Analog Devices, Inc.
- 1535 Blackfin DSP PCI Bus Interface (ADSP-21535)
- 1805 Motorola SM56 PCI Speakerphone Modem
- 1807 56k Winmodem Chip
- 1884 SoundMAX Integrated Digital HD Audio (AD1884HD)
- 1889 Sound Chip (AD1980)
- 194A SoundMAX Integrated Digital Audio (AD1984A)
- 1981 SoundMAX Integrated Digital Audio (8086)
- 1983 SoundMAX Integrated Digital HD Audio (AD1983HD)
- 1984 Analog Devices ADI 198x Integrated HD Audio (Analog Devices ADI 198x)
- 1986 SoundMAX Integrated Digital HD Audio (AD198b)
- 1988 HD Audio Codec (AD1988A)
- 198B AD1988B HD (AD1988B)
- 2192 DSP Microcomputer (function *0) (ADSP-2192)
- 219A DSP Microcomputer (function *1) (ADSP-2192)
- 219E DSP Microcomputer (function *2) (ADSP-2192)
- 2F44 SafeNet Crypto Accelerator chip (ADSP-2141)
- 989B AD1989B HD Audio Codec (AD1989B)
-11D5 Tahoma Technology
- 0115 Versatec Parallel Interface (VPI) + Centronics (10115)
- 0116 DR11-W emulator (10118)
- 0117 Versatec Parallel Interface (VPI) + Centronics (10117)
- 0118 DR11-W emulator (10118)
-11D6 Tekelec Technologies
-11D7 Trenton Terminals Inc
-11D8 Image Technologies Development
-11D9 TEC Corp
-11DA Novell
- 2000 Virtual-Bus / AlacrityVM bridge
-11DB SEGA Enterprises Ltd
- 1234 Dreamcast Broadband Adapter
-11DC Questra Corp
-11DD Crosfield Electronics Ltd
-11DE Zoran Corporation
- 6057 ZR36057/36067 MotionJPEG/TV Card
- 6067 zoran (zr36067pqc)
- 6120 MPEG VideoBVPSXI Capture Card (ZR36120PQC)
- 6O57 ZORAN PCI Bridge (interface for transferring video across the PCI bus) (ZR36057PQC)
- 9876 ?
-11DF New Wave PDG
-11E0 Cray Communications A/S
-11E1 Gec Plessey Semiconductors Inc
-11E2 Samsung Information Systems America
-11E3 Quicklogic Corp
- 5030 PC Watchdog
-11E4 Second Wave Inc
-11E5 IIX consulting
-11E6 Mitsui-Zosen System Research
-11E7 Toshiba America, Electric Company
-11E8 Digital Processing Systems Inc
-11E9 Highwater Designs Ltd
-11EA Elsag Bailey
-11EB Formation Inc
-11EC Coreco Inc
- 2064 ?
-11ED Mediamatics
-11EE Dome Imaging Systems Inc
-11EF Nicolet Technologies B.V.
-11F0 Compu-Shack GmbH
- 4231 FDDI Network Card
- 4232 PCIVEN_8086&DEV_4232&subsys_12018086&rev_004&b04cce1&0&00e1 (FASTline UTP Quattro)
- 4233 FASTline FO
- 4234 FASTline UTP
- 4235 FASTline-II UTP
- 4236 FASTline-II FO
- 4731 Gigabit Ethernet Adapter (GIGAline)
-11F1 Symbios Logic Inc
-11F2 Picture Tel Japan K.K.
-11F3 Keithley Metrabyte
-11F4 Kinetic Systems Corporation
- 2915 2915
-11F5 Computing Devices International
-11F6 Powermatic Data Systems Ltd
- 0112 ReadyLink ENET100-VG4 (ATT2MD11)
- 0113 FreedomLine 100
- 1401 ReadyLink RL2000 Ethernet Adapter (Winbond W89C940)
- 2011 ReadyLink RL100ATX/PCI Fast Ethernet Adapter (TXA9882)
- 2201 ReadyLink 100TX (Winbond W89C840) (TXA9883)
- 9881 ReadyLink RL100TX Fast Ethernet Adapter (TXA9881?)
-11F7 Scientific Atlanta
-11F8 PMC-Sierra Inc.
- 7364 PM7364 FREEDM-32 Frame Engine and Datalink Manager
- 7366 PM7366 FREEDM-8 Frame Engine and Datalink Manager
- 7367 PM7367 FREEDM-32P32 Frame Engine and Datalink Manager
- 7375 LASAR-155 ATM SAR (PM7375)
- 7380 PM7380 FREEDM-32P672 Frame Engine and Datalink Manager
- 7382 PM7382 FREEDM-32P256 Frame Engine and Datalink Manager
- 7384 PM7384 FREEDM-84P672 Frame Engine and Datalink Manager
- 8000 6G SAS/SATA Controller (PM8000 SPC)
- 8010 6G SAS/SATA RAID Controller (PM8010 SRC)
-11F9 I-CUBE Inc
-11FA Kasan Electronics Company Ltd
-11FB Datel Inc
-11FC Silicon Magic
-11FD High Street Consultants
-11FE Comtrol Corp
- 0001 RocketPort 32-port
- 0002 RocketPort 8-port
- 0003 RocketPort 16-port
- 0004 RocketPort 4-port
- 0005 RocketPort 8-port
- 0006 RocketPort 8-port
- 0007 RocketPort 4-port
- 0008 RocketPort 8-port
- 0009 RocketPort 16-port
- 000A RocketPort 4-port
- 000B RocketPort 8-port
- 000C RocketPort 6-port
- 000D RocketPort 4-port
- 000E RocketPort 2-port
- 000F RocketPort 2-port
- 0040 RocketPort Infinity Octa, 8port, RJ45
- 0041 RocketPort Infinity 32port, External Interface
- 0042 RocketPort Infinity 8port, External Interface
- 0043 RocketPort Infinity 16port, External Interface
- 0044 RocketPort Infinity Quad, 4port, DB
- 0045 RocketPort Infinity Octa, 8port, DB
- 0047 RocketPort Infinity 4port, RJ45
- 004F RocketPort Infinity 2port, SMPTE
- 0052 RocketPort Infinity Octa, 8port, SMPTE
- 0801 RocketPort UPCI 32 port w/external I/F
- 0802 RocketPort UPCI 8 port w/external I/F
- 0803 RocketPort UPCI 16 port w/external I/F
- 0805 RocketPort UPCI 8 port w/octa cable
- 080C RocketModem III 8 port
- 080D RocketModem III 4 port
- 0812 RocketPort UPCI Plus 8 port RS422
- 0903 RocketPort Compact PCI 16 port w/external I/F
- 8015 4-port UART 16954 (RocketPort)
-11FF Scion Corp
-1200 CSS Corp
-1201 Vista Controls Corp
-1202 Network General Corp
- 0001 PCI ATM Adapter (NAIATMPCI)
- 4300 Gigabit Ethernet Adapter
-1203 Bayer Corp, Agfa Division
-1204 Lattice Semiconductor Corp
-1205 Array Corp
-1206 Amdahl Corp
-1208 Parsytec GmbH
- 4853 HS-Link Device
-1209 SCI Systems Inc
- 0100 PLX PCI BRIDGE (PCI 9054)
-120A Synaptel
-120B Adaptive Solutions
-120C Technical Corp
-120D Compression Labs Inc
-120E Cyclades Corporation
- 0100 Multiport Serial Card (Cyclom-Y)
- 0101 Multiport Serial Card (Cyclom-Y)
- 0102 Multiport Serial Card (Cyclom-4Y)
- 0103 Multiport Serial Card (Cyclom-4Y)
- 0104 Multiport Serial Card (Cyclom-8Y)
- 0105 Multiport Serial Card (Cyclom-8Y)
- 0200 Cyclom-Z below 1Mb Intelligent Serial Card
- 0201 Cyclom-Z above 1Mb Intelligent Serial Card
- 0300 PC300 RX 2
- 0301 PC300 RX 1
- 0302 PC300 TE 2
- 0303 teclado (PC300 TE 1)
- 0310 PC300 TE 2
- 0311 PC300 TE 1
- 0320 PC300/TE-M (2 ports)
- 0321 PC300/TE-M (1 port)
- 0400 PC400
-120F Essential Communications
- 0001 Roadrunner
-1210 Hyperparallel Technologies
-1211 Braintech Inc
-1212 Kingston Technology Corp
-1213 Applied Intelligent Systems Inc
-1214 Performance Technologies Inc
-1215 Interware Co Ltd
-1216 Purup Prepress A/S
- 0003 PTM400 PCI Taxi Module (188A2L432B)
-1217 O2 Micro Inc
- 00F7 1394 Open Host Controller Interface (0x00f71217)
- 6729 PCI to PCMCIA Bridge (OZ6729)
- 673A PCI to PCMCIA Bridge (OZ6730)
- 6832 CardBus Controller (OZ6832/3)
- 6836 CardBus Controller (OZ6836/6860)
- 6872 CardBus Controller (OZ6812)
- 6925 CardBus Controller (OZ6922)
- 6933 OZ6933/711E1 SmartCardBus Controller
- 6972 OZ6912/711E0 SmartCardBus Controller
- 7110 MemoryCardBus Accelerator (OZ711Mx)
- 7112 OZ711EC1/M1 SmartCardBus MultiMediaBay Controller
- 7113 SmartCardBus Contoller (0Z711EC1)
- 7114 OZ711M1 SmartCardBus MultiMediaBay Controller
- 7120 O2Micro Integrated MMC/SD controller (Unknown device)
- 7130 O2Micro Integrated MMC/SD/MS/xD/SM Controller (0000000A)
- 7134 MemoryCardBus Controller 6-in-1 (OZ711MP1/MS1)
- 7135 MemoryCardBus Contoller (OZ711EZ1)
- 7136 O2Micro CardBus Controller (OZ711SP1)
- 71E2 OZ711E2 SmartCardBus Controller
- 7212 OZ711M2 SmartCardBus MultiMediaBay Controller
- 7213 OZ6933E CardBus Controller
- 7222 pci to pcmcia bridge (unknow)
- 7223 OZ711M3 SmartCardBus MultiMediaBay Controller
- 7233 OZ711MP3/MS3 MemoryCardBus Controller
-1218 Hybricon Corp
-1219 First Virtual Corp
-121A 3Dfx Interactive Inc
- 0001 Voodoo 3D Acceleration Chip (Voodoo)
- 0002 Voodoo 2 3D Accelerator (Voodoo2)
- 0003 Voodoo Banshee (Voodoo Banshee)
- 0004 VooDoo Banshee [Velocity 100]
- 0005 All Voodoo3 chips, 3000 (Voodoo3)
- 0007 Voodoo4
- 0009 Voodoo4/5
- 0010 Rev.A AGPx4, 0.25, 200/2x200 core/RAM (Rampage)
- 0057 Voodoo 3/3000 [Avenger]
-121B Advanced Telecommunications Modules
-121C Nippon Texaco Ltd
-121D Lippert Automationstechnik GmbH
-121E CSPI
-121F Arcus Technology Inc
-1220 Ariel Corporation
- 1220 AMCC 5933 TMS320C80 DSP/Imaging Board (9622qac)
- 4242 controller audio multimediale
-1221 Contec Co Ltd
-1222 Ancor Communications Inc
-1223 Emerson Network Power, Embedded Computing
- 0001 Real-Time Processing Blade in a standard single-slot AdvancedTCA formfactor (KatanaQp)
- 0002 Intel Pentium-M based AMC Module (KosaiPM)
- 0003 PM/Link
- 0004 PM/T1
- 0005 PM/E1
- 0008 PM/SLS
- 0009 BajaSpan Resource Target
- 000A BajaSpan Section 0
- 000B BajaSpan Section 1
- 000C BajaSpan Section 2
- 000D BajaSpan Section 3
- 000E PM/PPC
- 0044 Memory controller (Memory controller)
-1224 Interactive Images
- 1000 Plum Audio, Video and VTR Controller (CL560?)
-1225 Power I/O Inc
-1227 Tech-Source
- 0006 Raptor GFX 8P
-1228 Norsk Elektro Optikk A/S
-1229 Data Kinesis Inc
-122A Integrated Telecom
-122B LG Industrial Systems Co Ltd
-122C Sican GmbH
-122D Aztech System Ltd
- 1206 Asus (ICH2)
- 4201 AMR 56K modem (MR2800W)
- 50DC PCI168/3328 Audio Device
- 80DA 3328 Audio
-122E Xyratex
-122F Andrew Corp.
- 37AF Reflectometer using PLX 9030 (0x9030)
-1230 Fishcamp Engineering
-1231 Woodard McCoach Inc
-1232 GPT Limited
-1233 Bus-tech Inc
-1234 Technical Corp
-1235 RISQ Modular Systems Inc
-1236 Sigma Designs Corp
- 0000 SD6425 (RealMagic64/GX)
- 0531 Single Chip Fast Ethernet NIC Controller (MX98715/25)
- 3D01 RealMagic/2D
- 6401 REALmagic64/GX GUI Accelerator
- 9708 sd6425 (realmagic64/gx)
-1237 Alta Technology Corp
-1238 Adtran
-1239 3DO Company
-123A Visicom Labrotories Inc
-123B SEEQ Technology Inc
-123C Century Systems Inc
-123D Engineering Design Team Inc.
- 0000 EasyConnect 8/32
- 0002 EasyConnect 8/64
- 0003 EasyIO
- 0010 PCI-DV Digital Video Interface (PCI-DV)
-123E Simutech Inc
-123F C-Cube Microsystems
- 00E4 MPEG (cl 480)
- 5111 DV/MPEG Device
- 6120 DVD device (12.03)
- 8120 i845E
- 8888 cPEG C 3.0 DVD/MPEG2 Decoder (12.03)
-1240 Marathon Technologies Corp
-1241 DSC Communications
- 1603 keyboard
-1242 Jaycor Networks Inc
- 1460 2-Gb/s Fibre Channel-PCI 64-bit 66 MHz (JNIC-1460)
- 1560 Dual Channel 2 Gb/s Fibre Channel-PCI-X (JNIC-1560)
- 4643 JNI PCI 64-bit Fibrechannel (needs clone) (JNI PCI 64-bit Fibrechannel)
- 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
- 656A FCX-6562 PCI-X Fibre Channel Adapter
-1243 Delphax
-1244 AVM Audiovisuelles MKTG & Computer GmbH
- 0700 ISDN controller (B1)
- 0800 ISDN Controller (C4)
- 0A00 Fritz!Card A1 ISDN Controller
- 0E00 Fritz!PCI v2.0 ISDN Controller
- 1100 ISDN Controller (C2)
- 1200 ISDN Controller (T1)
- 2700 DSP TNETD5100GHK / TNETD5015 (E13 32A5KYW / 2CAKRCT)
- 2900 Fritz!Card DSL v2.0
-1245 A.P.D., S.A.
-1246 Dipix Technologies Inc
-1247 Xylon Research Inc
-1248 Central Data Corp
-1249 Samsung Electronics Co Ltd
-124A AEG Electrocom GmbH
- 10BD Intel Gigabit network connection (82566DM-2)
-124B Greenspring Computers Inc
- 0040 cPCI-200 Four Slot IndustryPack Carrier
-124C Solitron Technologies Inc.
- 0220 .
-124D Stallion Technologies Inc
- 0000 EasyConnect 8/32
- 0002 EasyConnect 8/64
- 0003 EasyIO PCI
- 0004 EasyConnection ECRA-PCI
-124E Cylink
-124F Infortrend Technology Inc
- 0041 IFT-2000 Series PCI RAID Controller
-1250 Hitachi Microcomputer System Ltd.
- 1978 ?
- 2898 ?
-1251 VLSI Solution OY
-1253 Guzik Technical Enterprises
-1254 Linear Systems Ltd
-1255 Optibase Ltd.
- 1110 MPEG Forge
- 1210 MPEG Fusion
- 2110 VideoPlex pci bpc1825 rev a (VideoPlex-pci)
- 2120 VideoPlex BPC 1851 A (VideoPlex plus)
- 2130 VideoQuest
-1256 Perceptive Solutions Inc.
- 4201 PCI-2240i Dale EIDE Adapter
- 4401 Dale EIDE Adapter (PCI-2220i)
- 5201 PCI-2000 IntelliCache SCSI Controller
-1257 Vertex Networks Inc
-1258 Gilbarco Inc.
- 1988 ?
-1259 Allied Telesyn International
- 2503 Realtek 8139b
- 2560 AT-2560 Fast Ethernet Adapter (i82557B)
- C107 Realtek 8169S
-125A ABB Power Systems
-125B Asix Electronics Corp.
- 0B95 USB2.0 to 10/100M Fast Ethernet Controller (AX88772)
- 1400 ASIX AX88140 Based PCI Fast Ethernet Adapter (AX88140A)
- 1720 USB2 to Fast Ethernet Adapter (AX88172)
-125C Aurora Technologies Inc
- 0101 Saturn 4520P
- 0640 Aries 16000P
-125D ESS Technology
- 0000 PCI Fax Modem (early model) (ESS336H)
- 1948 Solo??
- 1961 ESS Solo-1 Soundcard (Multimedia Device)
- 1968 Maestro-2 PCI audio accelerator (ES2839)
- 1969 Solo-1 PCI AudioDrive family (ES72222)
- 1978 ES1978 Maestro-2E Audiodrive, ES1970 Canyon3D
- 1988 ESS Allegro PCI Audio (WDM) (ES1989)
- 1989 ES1989 Allegro ES56CVM-PI PCI Voice+Fax Modem
- 1990 ES2898S
- 1992 ?
- 1998 ES1980 Maestro-3 PCI Audio Accelerator
- 1999 ES1983 Maestro-3.COMM ES56CVM-PI PCI voice+Fax Modem
- 199A ES1980 Maestro-3 PCI Audio Accelerator
- 199B Maestro-3.COMM PCI Voice+audio (ES1938/41/46 solo audio)
- 2808 PCI Fax Modem (later model) (ES336H)
- 2828 TeleDrive (ES2828S)
- 2838 Data Fax Modem (ES56H-PI4555)
- 2839 Superlink Modem/V.92 chipset 56K
- 2843 ES2838/2839 SuperLink-MLP Voice Modem
- 2847 ES2838/2839 SuperLink-MLP 10 Voice Modem
- 2898 TelDrive ES56T-PI family V.90 PCI modem
-125E Specialvideo Engineering SRL
-125F Concurrent Technologies Inc.
- 2084 AMCC Bridge + 2 x Super I/O (National PC97338) (AMCC S5933)
-1260 Intersil Americas Inc (Was: Harris Semiconductor)
- 3872 LAN-Express IEEE 802.11b PCI Adapter (PRISM 3)
- 3873 PRISM 2.5 802.11b 11Mbps Wireless Controller
- 3886 Creatix CTX405 WLAN Controller (Unknown)
- 3890 PRISM GT 802.11g 54Mbps Wireless Controller (ISL3890)
- 8130 NTSC/PAL Video Decoder (HMP8130)
- 8131 NTSC/PAL Video Decoder (HMP8131)
- FFFF ISL3886IK
-1261 Matsushita-Kotobuki Electronics Industries
-1262 ES Computer Company Ltd
-1263 Sonic Solutions
-1264 AVAL NAGASAKI Corp
-1265 Casio Computer Co Ltd
-1266 Microdyne Corp.
- 0001 NE10/100 Adapter (i82557B)
- 1910 NE2000Plus (RT8029) Ethernet Adapter
-1267 S.A. Telecommunications
- 1016 NICCY PCI Card
- 4243 Satellite receiver board / MPEG2 decoder
- 5352 PCR2101
- 5A4B Telsatturbo
-1268 Tektronix
- 0204 Tektronix IO Processor / Tektronix PCI Acquisition Interface Rev 204 (Unknown)
-1269 Thomson-CSF/TTM
-126A Lexmark International Inc
-126B ADAX Inc
-126C Nortel Networks (Was: Northern Telecom)
- 1211 10/100BaseTX [RTL81xx]
- 126C 802.11b Wireless Ethernet Adapter
- 1F1F e-mobility 802.11b Wireless LAN PCI Card
-126D Splash Technology Inc
-126E Sumitomo Metal Industries Ltd
-126F Silicon Motion Inc
- 0710 LynxEM (SM710)
- 0712 LynxEM+ (SM712)
- 0720 SM720/1 Lynx3DM, SM722 Lynx3DM+
- 0810 LynxE (SM810)
- 0811 LynxE (SM811)
- 0820 Lynx3D (SM820)
- 0910 SILICON MOTION (SM910)
-1270 Olympus Optical Co Ltd
-1271 GW Instruments
- 1025 SoftV90 Data Fax Modem
-1272 Telematics International
- 0780 PCIVEN_1272&DEV_0780&SUBSYS_00000008&REV_7A3&61AAA01&0&58 (PCIVEN_1272&DEV_0780&SUBSYS_00000008&REV_7A3&61A)
-1273 Hughes Network systems
- 0002 t9p17af-01 (DirecPC)
-1274 Creative (Was: Ensoniq)
- 1274 multimedia audio device (5880x)
- 1371 ES1371, ES1373 AudioPCI
- 1373 Sound Blaster Audio(PCI) (ES1373)
- 5000 AudioPCI (ES1371)
- 5880 Soundblaster (CT4750) (5880x)
- 9876 ?
-1275 Network Appliance Corp
-1276 Switched Network Technologies Inc
-1277 Comstream
-1278 VMETRO Ltd (was: Transtech Parallel Systems Ltd)
- 0701 PowerPC Node (TPE3/TM3)
- 0710 TPE5 PowerPC PCI board
- 1100 PMC-FPGA02
-1279 Transmeta Corp.
- 0060 Efficeon Virtual Northbridge (TM8000)
- 0061 Efficeon AGP Bridge (TMTM8000)
- 0295 Virtual Northbridge
- 0395 Northbridge (LongRun)
- 0396 SDRAM Controller
- 0397 BIOS scratchpad
-127A Rockwell Semiconductor Systems (Also Conexant)
- 1002 RC56HCFPCI HCF 56k V.90 Modem
- 1003 HCF 56k V.90 Modem
- 1004 HCF 56k V.90 Modem
- 1005 R6786-61 HCF 56k V.90 Speakerphone Modem
- 1022 HCF V.90 Modem
- 1023 HCF V.90 Data/Fax Modem
- 1024 HCF 56k PCI Modem
- 1025 HCF 56k PCI Modem
- 1026 HCF 56k PCI Speakerphone Modem
- 1032 HCF 56k PCI Modem
- 1033 HCF 56k PCI Modem
- 1034 HCF 56k PCI Modem
- 1035 RH56D/SP-PCI HCF 56k PCI Speakerphone Modem
- 1036 HCF 56k PCI Modem
- 1085 Volcano HCF 56k PCI Modem
- 2003 Conexant SoftK56 PCI Modem
- 2004 Conexant SoftK56 PCI Modem
- 2005 RS56/SP-PCI11P1 Conexant SoftK56 Speakerphone Modem
- 2013 Conexant SoftK56 Modem
- 2014 RS56 SP-PCI Conexant SoftK56 Modem
- 2015 R6793-11 Conexant SoftK56 Speakerphone Modem
- 2016 HSF 56k Data/Fax/Voice/Speakerphone Modem
- 2043 Generic SoftK56
- 2044 Generic SoftK56
- 2045 Generic SoftK56
- 2046 Generic SoftK56
- 2114 R6793-12 Conexant SoftK56 PCI Modem
- 2F15 U.S. Robotics 56k Fax Host Int
- 4300 Riptide Bus / Firmware Downloader
- 4302 Riptide Input Device
- 4310 Master Riptide PCI Audio Device
- 4311 Conexant PCI Modem Enumerator
- 4312 Riptide PCI Game Controller
- 4320 Riptide PCI Audio Controller
- 4321 Riptide HCF 56k PCI Modem
- 4322 Riptide PCI Game Controller
- 4330 Riptide Bus / Firmware Downloader
- 4332 Riptide Input Device
- 4340 Riptide Bus / Firmware Downloader
- 4342 Riptide Input Device
- 4350 Riptide Bus / Firmware Downloader (No Audio)
- 4352 Riptide Input Device
- 4360 Riptide Bus / Firmware Downloader (No Audio)
- 4362 Riptide Input Device
- 5278 Harmonic DVB Network Adapter
- 8234 RapidFire 616X ATM155 Adapter
-127B PIXERA Corp
-127C Crosspoint Solutions Inc
-127D VELA Research
-127E Winnou, L.P.
- 0010 Videum AVX Adapter (Unknown)
-127F Fujifilm
-1280 Photoscript Group Ltd
-1281 Yokogawa Electric Corp
-1282 Davicom Semiconductor Inc.
- 9009 Ethernet Adapter (DM9009)
- 9100 DM9100 Ethernet Controller
- 9102 10/100 Mbps Fast Ethernet Controller (DM9102/A/AF)
-1283 Integrated Technology Express (ITE) Inc
- 0801 Audio Digital Controller (Audio Digital Controller)
- 673A IT8330G PCI EIDE Controller
- 8152 Advanced RISC-to-PCI Companion Chip (IT8152F/G)
- 8172 Ultra RISC (MIPS, SH4) Companion Chip (IT8172G)
- 8211 ATA/ATAPI Controller (IT8211F)
- 8212 ATA 133 IDE RAID Controller (IT8212F)
- 8213 IDE Controller (IT8213F)
- 8330 IT8330G PCI Host Bridge
- 8872 IT8871/72 PCI to ISA I/O chip with SMB, Parallel Port & GPIO
- 8875 PCI Parallel Port (IT8875F)
- 8888 IT8888F PCI to ISA Bridge with SMB
- 8889 IT8889F PCI to ISA Bridge
- 9876 PCI I/O CARD (IT8875F)
- E886 PCI to ISA Bridge (IT8330G)
-1284 Sahara Networks Inc
-1285 Platform Technologies Inc.
- 0100 Maestro-1 AudioDrive (ES1849)
-1286 Mazet GmbH
-1287 LuxSonor Inc.
- 001E DVD Decoder (LS220D)
- 001F DVD Decoder (LS220C)
- 0020 MPEG/DVD video decoder (LS242)
-1288 Timestep Corp
-1289 AVC Technology Inc.
- 1006 ?
-128A Asante Technologies Inc.
- F001 AsanteFAST 10/100 PCI Ethernet Adapter (Ethernet 10/100)
-128B Transwitch Corporation
-128C Retix Corp
-128D G2 Networks Inc.
- 0021 ATM155 Adapter
-128E Hoon Tech co Ltd/Samho Multi Tech Ltd
- 0008 ST128 WSS/SB
- 0009 ST128 SAM9407
- 000A ST128 Game Port
- 000B ST128 MPU Port
- 000C ST128 Ctrl Port
-128F Tateno Dennou Inc
-1290 Sord Computer Corporation
-1291 NCS Computer Italia
-1292 Tritech Microelectronics
-1293 Media Reality Technology
-1294 Rhetorex Inc
-1295 Imagenation Corp
-1296 Kofax Image Products
-1297 Holco Ent Co Ltd/Shuttle Computer
-1298 Spellcaster Telecommunications Inc
-1299 Knowledge Technology Lab
-129A VMETRO Inc.
- 0415 PCI 66MHz Analyzer and 33MHz Exerciser (PBT-415)
- 0515 PCI 66MHz Analyzer and Exerciser (PBT-515)
- 0615 PCI 66MHz and PCI-X 100MHz Bus Analyzer and Exerciser (PBT-615)
- 0715 PCI 66MHz and PCI-X 133MHz Bus Analyzer and Exerciser (Vanguard PCI/PMC/cPCI)
- 1100 PMC-FPGA05
- DD10 Digital Parallel Input Output Device 32bit, 33MHz PCI bus (DPIO)
- DD11 Digital Parallel Input Output Device 64bit, 33MHz PCI bus (DPIO2)
- DD12 Digital Parallel Input Output Device 64bit, 66MHz PCI bus (DPIO2-66)
-129B Image Access
-129C Xantel Corp/Jaycor
-129D Compcore Multimedia Inc
-129E Victor Company of Japan Ltd
-129F OEC Medical Systems Inc
-12A0 Allen-Bradley Company
- 0008 Allen-Bradley 1784-PKTX (1784-PKTX)
-12A1 Simpact Associates Inc
-12A2 Newgen systems Corp
-12A3 Lucent Technologies AMR
- ECB8 V.92 Lucent Modem (1646T00)
-12A4 NTT Electronics Technology Company
-12A5 Vision Dynamics Ltd
-12A6 Scalable Networks Inc
-12A7 AMO GmbH
-12A8 News Datacom
-12A9 Xiotech Corp
-12AA SDL Communications Inc.
- 5568 WANic 400 series X.21 controller (Wan405)
- 556C NAI HSSI Sniffer PCI Adapter
-12AB Yuan Yuan Enterprise Co. Ltd.
- 3000 TUN-200/MPG-200C PCI TV (and possibly DVD Decoder??) Card
-12AC Measurex Corp
-12AD Multidata GmbH
- 0010 HERMES-S0
- 0020 HERMES-PRI
- 0080 HERMES-PRI/PCIX
-12AE Alteon Networks Inc.
- 0001 3C986 ACENIC 1000 Base-SX Gigabit Ethernet Adapter
- 0002 Copper Gigabit Ethernet Adapter (3C986-T)
-12AF TDK USA Corp
-12B0 Jorge Scientific Corp
-12B1 GammaLink
-12B2 General Signal Networks
- 0209 SNA Link/9000 PCI to ESCON Controller
-12B3 Inter-Face Co Ltd
-12B4 FutureTel Inc
-12B5 Granite Systems Inc
-12B6 Natural Microsystems
-12B7 ACCUMEN/Cognex Modular Vision Systems
-12B8 Korg
-12B9 3COM Corp, Modem Division (Formerly US Robotics)
- 1006 5610 56K FaxModem WinModem (5610)
- 1007 US Robotics 56K DATA FAX WINMODEM (AD1807JS)
- 1008 USR5610B (0005610-02) 56K Performance Pro Modem (PCI Internal) (USR5610B)
-12BA Bittware Research/PMC Sierra
- 0032 DSP Prototyping & Development Card (Hammerhead-Lite-PCI)
-12BB Nippon Unisoft Corp
-12BC Array Microsystems
-12BD Computerm Corp
-12BE Anchor Chips Inc
- 3041 AN3041Q CO-MEM PCI Bus Interface/Cache
- 3042 AN3042Q CO-MEM Lite PCI Generic Host Bridge/Shared Memory
-12BF Fujifilm Microdevices
-12C0 Infimed
-12C1 GMM Research Corp.
- 9080 Sync4hs/CCP/PCI/MP communications coprocessor
-12C2 Mentec Ltd
-12C3 Holtek Microelectronics Inc.
- 0058 LAN Adapter (NE2000-compatible) (HT80232)
- 5598 Ethernet Adapter (NE2000-compatible) (HT80229)
-12C4 Connect Tech Inc.
- 0001 Blue Heat PCI/8 RS-232
- 0002 Blue Heat PCI/4 RS-232
- 0003 Blue Heat PCI/2 RS-232
- 0004 Blue Heat PCI/8 RS-485
- 0005 BlueHeat 8 Port RS232 Serial Board (Blue Heat-8 RS232)
- 0006 Blue Heat PCI/4 RS-485
- 0007 Blue Heat PCI/2+2 RS-232/485
- 0008 Blue Heat PCI/2 RS-485
- 0009 Blue Heat PCI/2+6 RS-232/485
- 000A Blue Heat PCI/8 RS-485 (BH081101V1)
- 000B Blue Heat PCI/4 RS-485 (BH041101V1)
- 000C Blue Heat PCI/2 RS-485 (BH021101V1)
- 000D Blue Heat PCI/2 PTM
- 000E Blue Heat PCI Custom Osc
- 000F Blue Heat PCI/8 RS-485 (BH081104V4)
- 0100 NT960/PCI
- 0201 cPCI Titan - 2 Port
- 0202 cPCI Titan - 4 Port
- 0300 BLueStorm/LP 2 RS232
- 0301 BLueStorm/LP 4 RS232
- 0302 BLueStorm/LP 8 RS232
- 0303 BLueStorm/LP 2 RS232/RS485
- 0304 BLueStorm/LP 4 RS232/RS485
- 0305 BLueStorm/LP 8 RS232/RS485
- 0306 BLueStorm/LP 2 Opto
- 0307 BLueStorm/LP 4 Opto
- 0308 Starcom UM100 Wireless modem for WiMax
- 0309 BLueStorm/LP 2 RS485
- 030A BLueStorm/LP 4 RS485
- 030B BLueStorm/LP 8 RS485
- 0310 CTI PCI UART 1+1 (RS232/485)
- 0311 CTI PCI UART 2+2 (RS232/485)
- 0312 CTI PCI UART 4+4 (RS232/485)
- 0320 CTI PCI UART 2
- 0321 CTI PCI UART 4
- 0322 CTI PCI UART 8
- 0330 CTI PCI UART 2 (RS485)
- 0331 CTI PCI UART 4 (RS485)
- 0332 CTI PCI UART 8 (RS485)
-12C5 Picture Elements Inc.
- 007F PEI Imaging Subsystem Engine (ISE)
- 0081 PCI Thresholding Engine (PCIVST)
- 0085 Video Simulator/Sender
- 0086 Multi-scale Thresholder (THR2)
-12C6 Mitani Corp
-12C7 Dialogic Corp.
- 0546 D120JCT-LS Card (kssjsjj)
- 0561 BRI/2 Type Card (Voice Driver)
- 0647 D/240JCT-T1 Card
- 0648 D/300JCT-E1 Card
- 0649 D/300JCT-E1 Card
- 0651 MSI PCI Card
- 0673 BRI/160-PCI Card
- 0674 BRI/120-PCI Card
- 0675 BRI/80-PCI Card
- 0676 D/41JCT Card
- 0685 D/480JCT-2T1 Card
- 0687 D/600JCT-2E1 (75 Ohm) Card
- 0689 Dialogic 2E1 - JCT series (D/600JCT-2E1)
- 0707 D/320JCT (Resource Only) Card
- 0708 D/160JCT (Resource Only) Card
-12C8 G Force Co Ltd
-12C9 Gigi Operations
-12CA Integrated Computing Engines
-12CB Antex Electronics Corp.
- 0027 StudioCard
- 002D BX-12
- 002E SC-2000
- 002F LX-44
- 0030 SC-22
- 0031 BX-44
- 0032 LX-24M Professional 20-bit 2-in, 4-out audio Card w/- MPEG2
- 0033 LX-22M
- 0034 BX-8
- 0035 BX-12e
-12CC Pluto Technologies International
-12CD Aims Lab
-12CE Netspeed Inc
-12CF Prophet Systems Inc
-12D0 GDE Systems Inc
-12D1 PSITech
-12D2 Nvidia (Was:STB,SGS Thompson)
- 0008 NV1
- 0009 DAC64
- 0018 RIVA 128 2D/3D GUI Accelerator
- 0019 RIVA 128ZX 2D/3D GUI Accelerator
- 0020 TNT
- 0028 TNT2
- 0029 UTNT2
- 002C VTNT2
- 00A0 ITNT2
-12D3 Vingmed Sound A/S
-12D4 Ulticom, Inc.
- 0301 SS7 Telecommunications Interface Adapter (EP1S)
-12D5 Equator Technologies
- 1000 Broadband Signal Processor (MAP-CA)
- 1002 Digital Signal Processor (MAP-1000)
-12D6 Analogic Corp
-12D7 Biotonic SRL
-12D8 Pericom Semiconductor
- 71E2 3 Port PCI to PCI bridge (PI7C7300)
- 8150 2-Port PCI to PCI Bridge (PI7C8150)
- 8152 2-Port PCI-To-PCI Bridge (PI7C8152)
- A404 PCIe Packet Switch (PI7C9X20404SL)
- E130 PCI-X Bridge (PI7C9X130)
-12D9 Acculab PLC
-12DA True Time
-12DB Annapolis Micro Systems Inc.
- 0003 FoxFire II
-12DC Symicron Computer Communication Ltd
-12DD Management Graphics
-12DE Rainbow Technologies
- 0200 Cryptoswift 200
-12DF SBS Technologies Inc.
- 2102 Communications Controller (Infineon PEB 20534)
- 8236 PCI Controller (Unknown)
-12E0 Chase Research PLC
- 0010 Quad UART (ST16C654)
- 0020 Quad UART (ST16C654)
- 0021 8x UART
- 0030 Quad UART (ST16C654)
-12E1 Nintendo co Ltd
-12E2 Datum Inc Bancomm-Timing Division
-12E3 Imation Corp - Medical Imaging Systems
-12E4 Brooktrout Technology Inc.
- 1000 PRI Controller (TR1000 PRI)
- 1120 TruFax Board
- 1140 Tr114 Fax Board
- B005 BRI Controller (TR1000 BRI)
- B006 BRI Controller (TR1000 BRI)
-12E5 XCD Inc/Apex Inc
-12E6 Cirel Systems
-12E7 Sunsgroup Corp
-12E8 CRISC Corp
-12E9 GE Spacenet
-12EA Zuken
-12EB Aureal Semiconductor
- 0001 Vortex 1 Digital Audio Processor (AU8820)
- 0002 AU8830 Vortex 2 3D Digital Audio Processor
- 0003 AU8810 Vortex Digital Audio Processor
- 8803 Vortex 56k Software Modem
-12EC 3A International Inc.
- 8139 0xxxx (0xxxx)
-12ED Optivision Inc
-12EE Orange Micro
-12EF Vienna Systems
-12F0 Pentek
-12F1 Sorensen Vision Inc
-12F2 Gammagraphix Inc
- 1002 Grapics Radeon X850 (215RAAGCGA11F)
- 3059 AC97 Enhanced Audio Controller - the 8251 controller is different (VT8235)
-12F3 Radstone Technology / XING Inc
-12F4 Megatel
-12F5 Forks Inc
-12F6 Dawson France
-12F7 Cognex
-12F8 Electronic-Design GmbH
- 0002 s3 trio (VideoMaker)
-12F9 FourFold Technologies
-12FB Spectrum Signal Processing
- 0001 PMC-MAI
- 00F5 F5 Dakar
- 02AD PMC-2MAI
- 2ADC ePMC-2ADC
- 3100 PRO-3100
- 3500 PRO-3500
- 4D4F Modena
- 8120 ePMC-8120
- DA62 Daytona C6201 PCI (Hurricane)
- DB62 Ingliston XBIF
- DC62 Ingliston PLX9054
- DD62 Ingliston JTAG/ISP
- EDDC ePMC-MSDDC
- FA01 ePMC-FPGA
-12FC Capital Equipment Corp
- 5CEC IEEE 488 (PCI-488 GPIB)
-12FD i2S
-12FE ESD Electronic System Design GmbH
-12FF Lexicon
-1300 Harman International Industries Inc
-1302 Computer Sciences Corp
-1303 Innovative Integration
- 0001 cM67 CompactPCI DSP Card (0239)
- 0002 M44/cM44 DSP board
- 0003 Quattro6x DSP board
- 0004 Chico/ChicoPlus Data Acquisition Board
- 0005 Code Hammer Jtag Debugger board
- 0006 Matador DSP board
- 0007 Quixote DSP board
- 0008 Quadia C64x DSP
- 0009 Quadia DSP Baseboard
-1304 Juniper Networks
-1305 NetPhone Inc
-1306 Duet Technologies
-1307 ComputerBoards Inc
- 0001 PCI-DAS1602/16
- 0006 PCI-GPIB
- 000B PCI-DIO48H
- 000C PCI-PDISO8
- 000D PCI-PDISO16
- 000F PCI-DAS1200
- 0010 PCI-DAS1602/12
- 0014 24 Bit Digital Input/Output Board (PCI-DIO24H)
- 0015 PCI-DIO24H/CTR3
- 0016 PCI-DIO24H/CTR15
- 0017 PCI-DIO96H
- 0018 PCI-CTR05
- 0019 PCI-DAS1200/JR
- 001A PCI-DAS1001
- 001B PCI-DAS1002
- 001C PCI-DAS1602JR/16
- 001D PCI-DAS6402/16
- 001E PCI-DAS6402/12
- 001F PCI-DAS16/M1
- 0020 PCI-DDA02/12
- 0021 PCI-DDA04/12
- 0022 PCI-DDA08/12
- 0023 PCI-DDA02/16
- 0024 PCI-DDA04/16
- 0025 PCI-DDA08/16
- 0026 PCI-DAC04/12-HS
- 0027 PCI-DAC04/16-HS
- 0028 24 Bit Digital Input/Output Board (PCI-DIO24)
- 0029 PCI-DAS08
- 002C PCI-INT32 (PCI-INT32)
- 0033 PCI-DUAL-AC5
- 0034 PCI-DAS-TC
- 0035 PCI-DAS64/M1/16
- 0036 PCI-DAS64/M2/16
- 0037 PCI-DAS64/M3/16
- 004C PCI-DAS1000
- 004D PCI-QUAD04
- 0052 PCI-DAS4020/12
- 0054 PCI-DIO96
- 005D PCI-DAS6023
- 005E PCI-DAS6025
- 005F PCI-DAS6030
- 0060 PCI-DAS6031
- 0061 PCI-DAS6032
- 0062 PCI-DAS6033
- 0063 PCI-DAS6034
- 0064 10 channels, 16 bit counter/timer with 32-Bits of Digital I/O (PCI-CTR10)
- 0065 PCI-DAS6040
- 0066 PCI-DAS6052
- 0067 PCI-DAS6070
- 0068 PCI-DAS6071
- 006F PCI-DAS6036
- 0078 PCI-DAS6013
- 0079 PCI-DAS6014
-1308 Jato Technologies Inc.
- 0001 NetCelerator Adapter
-1309 AB Semicon Ltd
-130A Mitsubishi Electric Microcomputer
-130B Colorgraphic Communications Corp
-130C AMBEX Technologies Inc
-130D Accelerix Inc
-130E Yamatake-Honeywell Co Ltd
-130F Advanet Inc
-1310 GESPAC
- 0003 CompactPCI Interface (9060)
- 000D FPGA PCI Bridge
-1311 VideoServer Inc
-1312 Acuity Imaging Inc
-1313 Yaskawa Electric Co
-1316 Teradyne Inc
-1317 ADMtek Inc
- 0531 ADMtek AN986 (nm0403A03461H121S122P)
- 0981 FastNIC 10/100 Fast Ethernet Adapter (AN981)
- 0985 AN983 FastNIC PCI 10/100 Fast Ethernet Adapter
- 1985 AN985 FastNIC CardBus 10/100 Fast Ethernet Adapter
- 2850 HSP56 MicroModem (016)
- 5120 ADMtek ADM5120 SOC (rev: 0) (ADM5120)
- 7892 HSP56 MicroModem (PCT 789T-A)
- 8201 ADM8211 based 802.11b Wireless PCI Card
- 9511 ADM9511 FastNIC PCI 10/100 Fast Ethernet Adapter
- 9513 ADM9513 FastNIC PCI 10/100 Fast Ethernet Adapter
-1318 Packet Engines, Inc.
- 0911 1000BT Network Interface Card (G-NIC II)
-1319 ForteMedia Inc
- 0801 PCI Card MediaForte made in singapore (driver - ftp://ftp.terratec.net/Audio/OEM/Integra/Driver/Inte (FM0801-au)
- 0802 Xwave PCI Joystick (FM801-as)
- 1000 FM801 PCI Audio Device
- 1001 FM801 PCI Joystick
- 1319 Xwave PCI audio controller (FM0801-as)
- 4901 ForteMedia PCI Audio Card (FM801-AU)
-131A Finisar Corp
-131C Nippon Electro-Sensory Devices Corp
-131D Sysmic Inc
-131E Xinex Networks Inc
-131F SIIG Inc
- 1000 PCI Serial Card
- 1001 CyberSerial (1-port) 16650
- 1002 CyberSerial (1-port) 16850
- 1010 Duet 1S(16550)+1P
- 1011 Duet 1S(16650)+1P
- 1012 Duet 1S(16850)+1P
- 1020 CyberParallel PCI Card
- 1021 CyberParallel PCI Card
- 1030 CyberSerial (2-port) 16550
- 1031 CyberSerial (2-port) 16650
- 1032 CyberSerial (2-port) 16850
- 1034 Trio 2S(16550)+1P
- 1035 Trio 2S(16650)+1P
- 1036 Trio 2S(16850)+1P
- 1050 CyberSerial (4-port) 16550
- 1051 CyberSerial (4-port) 16650
- 1052 CyberSerial (4-port) 16850
- 2000 CyberSerial (1-port) 16550
- 2001 CyberSerial (1-port) 16650
- 2002 CyberSerial (1-port) 16850
- 2010 Duet 1S(16550)+1P
- 2011 Siig Inc Duet 1S(16550)+1P
- 2012 Duet 1S(16850)+1P
- 2020 Communication controller (SIIG cyber8000)
- 2021 CyberParallel (2-port)
- 2030 SIIG Cyber Serial Dual PCI Board (SIIG CyberSerial PCI 16C550)
- 2031 CyberSerial (2-port) 16650
- 2032 CyberSerial (2-port) 16850
- 2040 Trio 1S(16550)+2P
- 2041 Trio 1S(16650)+2P
- 2042 Trio 1S(16850)+2P
- 2050 Siig Inc CyberSerial (4-port) 16550 (Siig Inc CyberSerial (4-port) 16550)
- 2051 CyberSerial (4-port) 16650
- 2052 CyberSerial (4-port) 16850
- 2060 Trio 2S(16550)+1P (JJ_P21022-B)
- 2061 Trio 2S(16650)+1P
- 2062 Trio 2S(16850)+1P
-1320 Crypto AG
-1321 Arcobel Graphics BV
-1322 MTT Co Ltd
-1323 DOME Inc
-1324 Sphere Communications
-1325 Salix Technologies Inc
-1326 SeaChange International
-1327 Voss Scientific
-1328 CIFELLI SYSTEMS CORPORATION
- 2048 ?
- 8888 cPEG C 3.0 DVD/MPEG2 decoder (rev 1.5)
-1329 Productivity Enhancement
-132A Microcom Inc
-132B BroadBand Technologies
-132C Micrel Inc
-132D Integrated Silicon Solution Inc
-1330 MMC Networks
-1331 RadiSys Corporation
- 0030 ENP-2611
- 8200 82600 Host Bridge
- 8201 82600 IDE
- 8202 82600 USB
- 8210 82600 PCI Bridge
-1332 Micro Memory
- 5410 PCI 32bit Bulk Memory w/DMA (MM-5410D)
- 5415 MM-5415CN PCI Memory Module with Battery Backup
- 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup
- 6140 Memory Module (MM-6140D)
-1334 Redcreek Communications Inc
-1335 Videomail Inc
-1337 Third Planet Publishing
-1338 BT Electronics
-133A VTEL Corp
-133B Softcom Microsystems
-133C Holontech Corp
-133D S S Technologies
- 1000 Industrial I/O Card (SST-5136-PFB-PCI)
-133E Virtual Computer Corp
-133F SCM Microsystems
-1340 Atalla Corp
-1341 Kyoto Microcomputer Co
-1342 Promax Systems Inc
-1343 Phylon Communications Inc
-1344 Micron Technology (Was: Crucial Technology?)
- 3240 CopperHead CopperTail SC1 AMC AC'97
- 3320 North Bridge (MT8LLN21PADF)
- 3321 North Bridge (21PAD)
- 3470 South Bridge (MT7LLN22NCNE)
- 4020 CopperHead CopperTail SC1 IDE Controller
- 4030 CopperHead CopperTail SC1 USB Controller
-1345 Arescom Inc
-1347 Odetics
-1349 Sumitomo Electric Industries Ltd
-134A DTC Technology Corp.
- 0001 Domex DMX 3191 PCI SCSI Controller (F01 2ASV17184.1)
- 0002 Domex DMX3192U/3194UP SCSI Adapter
-134B Ark Research Corp
-134C Chori Joho System Co Ltd
-134D PCTEL Inc.
- 2188 intel (fa82537ep)
- 2189 HSP56 Micromodem
- 2486 2304WT V.92 MDC Modem
- 7890 HSP56 MicroModem
- 7891 HSP MicroModem 56 (PCT 789T)
- 7892 HSP56 MicroModem (PCT 789T-A)
- 7893 HSP MicroModem 56 (S911 K017)
- 7894 HSP MicroModem 56 (688w)
- 7895 HSP MicroModem 56 (PCT789T)
- 7896 HSP MicroModem 56 (pct789t-c)
- 7897 HSP MicroModem 56/PCT789T (97860963)
- 8086 dev (hfp56)
- 9714 PCTEL (PCT 288-1A)
- D800 pctel 56k modem (pct388p-a)
-134E CSTI
-134F Algo System Co Ltd
-1350 Systec Co Ltd
-1351 Sonix Inc
-1353 Dassault A.T.
- 0002 Proserver
- 0003 PCI-FUT
- 0004 PCI-S0
- 0005 PCI-FUT-S0
-1354 dWave System Inc
-1355 Kratos Analytical Ltd
-1356 The Logical Co
-1359 Prisa Networks
-135A Brain Boxes Limited
- 0224 PLX PCI Bus Logic (PLX9050)
- 0228 pq100akj9737 (f97260118)
-135B Giganet Inc
-135C Quatech Inc
- 0010 QSC-100
- 0020 DSC-100
- 0030 DSC-200/300
- 0040 QSC-200/300
- 0050 ESC-100D
- 0060 ESC-100M
- 00F0 MPAC-100 Syncronous Serial Card (Zilog 85230)
- 0170 QSCLP-100
- 0180 DSCLP-100
- 0190 SSCLP-100
- 01A0 QSCLP-200/300
- 01B0 DSCLP-200/300
- 01C0 SSCLP-200/300
-135D ABB Network Partner AB
-135E Sealevel Systems Inc.
- 5101 Route 56 (5101)
- 5102 RS-232 synchronous card (PCI-ACB)
- 7101 Single Port RS-232/422/485/530
- 7201 Dual Port RS-232/422/485 Interface
- 7202 Dual Port RS-232 Interface
- 7401 Four Port RS-232 Interface
- 7402 Four Port RS-422/485 Interface
- 7801 Eight Port RS-232 Interface
- 8001 Digital I/O Adapter (8001)
-135F I-Data International A-S
-1360 Meinberg Funkuhren GmbH & Co. KG
- 0101 DCF77 Radio Clock (PCI32)
- 0102 DCF77 Radio Clock (PCI509)
- 0103 DCF77 Radio Clock (PCI510)
- 0104 DCF77 Radio Clock (PCI511)
- 0105 PEX511 DCF77 Radio Clock (PCI Express)
- 0201 GPS Receiver (GPS167PCI)
- 0202 GPS Receiver (GPS168PCI)
- 0203 GPS Receiver (GPS169PCI)
- 0204 GPS Receiver (GPS170PCI)
- 0205 GPS170PEX GPS Receiver (PCI Express)
- 0301 IRIG Timecode Reader (TCR510PCI)
- 0302 IRIG Timecode Reader (TCR167PCI)
- 0303 IRIG Timecode Reader (TCR511PCI)
- 0304 TCR511PEX IRIG Timecode Reader (PCI Express)
- 0305 IRIG Timecode Reader (TCR170PEX)
- 0501 PTP/IEEE1588 Slave Card (PTP270PEX)
- 0601 Free Running Clock (FRC511PEX)
-1361 Soliton Systems K.K.
-1362 Fujifacom Corp
-1363 Phoenix Technology Ltd
-1364 ATM Communications Inc
-1365 Hypercope Corp.
- 9050 HYSDN
-1366 Teijin Seiki Co Ltd
-1367 Hitachi Zosen Corp
-1368 Skyware Corp
-1369 Digigram
-136A High Soft Tech
- 0004 HST Saphir VII mini PCI
- 0007 HST Saphir III E MultiLink 4
- 0008 HST Saphir III E MultiLink 8
- 000A HST Saphir III E MultiLink 2
-136B Kawasaki Steel Corp
- FF01 KL5A72002 Motion JPEG
-136C Adtek System Science Co Ltd
-136D Gigalabs Ltd
-136F Applied Magic Inc
-1370 ATL Products
-1371 CNET Technology Inc
- 434E GigaCard Network Adapter
-1373 Silicon Vision Inc
-1374 Silicom Ltd
- 0024 Dual port Giga Ethernet BGE Bypass Server Adapter
- 0025 Quad port Giga Ethernet BGE Bypass Server Adapter
- 0026 Dual port Fiber Giga Ethernet 546 Bypass Server Adapter
- 0027 Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter
- 0028 Dual port Copper Giga Ethernet 546 Bypass Server Adapter
- 0029 Dual port Copper Giga Ethernet 546GB Bypass Server Adapter
- 002A Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter
- 002B Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter PXE2TBI
- 002C Quad port Copper Giga Ethernet 546GB Bypass Server Adapter PXG4BPI
- 002D Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter PXG4BPFI
- 002E Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter PXG4BPFI-LX
- 002F Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter PXG2BPFIL
- 0030 Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter
- 0031 Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter
- 0032 Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter
- 0034 Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
- 0035 Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
- 0036 Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter
- 0037 Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter
- 0038 Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter
- 0039 Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter
- 003A Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter
- 003B Dual port Fiber Ethernet PMC Intel based Bypass Server Adapter (PMCX2BPFI)
- 003C Dual port Copper Ethernet PCI-X BGE based Bypass Server Adapter (PXG2BPRB)
-1375 Boeing - Sunnyvale
- 2571 NA (NA)
-1376 One Stop Systems (Originally LMC; Previously bought out by SBE Inc)
-1377 Electronic Equipment Production GmbH
-1378 Telemann Co Ltd
-1379 Asahi Kasei Microsystems Co Ltd
-137A Mark Of The Unicorn Inc
- 0001 PCI-324 Audiowire Interface
-137B PPT Vision
-137C Iwatsu Electric Co Ltd
-137D Dynachip Corp
-137E Patriot Scientific Corp
-137F Japan Satellite Systems Inc
-1380 Sanritz Automation Co Ltd
-1381 Brains Co Ltd
-1382 Marian - Electronic & Software
- 0001 Sek'D ARC88 professional soundcard (f97260118)
- 2008 Prodif 96 Pro sound system
- 2009 SEK'D Prodif 96 Pro - professional audio card (PLX TECHNOLOGY n PCI9052 n 0435 n BX9497.1 MALA)
- 2048 Prodif Plus sound card (2048)
- 2088 8-in, 8-out sound card (Marc 8 Midi)
- 20C8 Marc A sound system
- 4008 Marc 2 Sound System
- 4010 Marc 2 Pro sound system
- 4048 Marc 4 MIDI sound system
- 4088 Marc 4 Digi sound system
- 4248 Marc X sound system
- 4424 TRACE D4 Sound System
-1383 Controlnet Inc
-1384 Reality Simulation Systems Inc
-1385 Netgear Inc
- 0013 WG311T 108 Mbps Wireless PCI Adapter
- 006B WA301 802.11b Wireless PCI Adapter
- 311A GA511 Gigabit Ethernet
- 4100 802.11b Wireless Adapter (MA301)
- 4105 MA311 802.11b wireless adapter
- 4251 WG111T 108 Mbps Wireless USB 2.0 Adapter
- 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card
- 4800 WG511v1 54 Mbps Wireless PC Card
- 4900 WG311v1 54 Mbps Wireless PCI Adapter
- 4A00 WAG311 802.11a/g Wireless PCI Adapter
- 4B00 WG511T 108 Mbps Wireless PC Card
- 4C00 WG311v2 54 Mbps Wireless PCI Adapter
- 4D00 WG311T 108 Mbps Wireless PCI Adapter
- 4E00 WG511v2 54 Mbps Wireless PC Card
- 4F00 WG511U Double 108 Mbps Wireless PC Card
- 5200 GA511 Gigabit PC Card
- 620A GA620
- 622A GA622
- 630A GA630
- 6B00 WG311v3 54 Mbps Wireless PCI Adapter
- 6D00 WPNT511 RangeMax 240 Mbps Wireless PC Card
- 7B00 WN511B RangeMax Next 280 Mbps Wireless PC Card
- 7C00 WN511T RangeMax Next 300 Mbps Wireless PC Card
- 7D00 WN311B RangeMax Next 280 Mbps Wireless PCI Adapter
- 7E00 WN311T RangeMax Next 300 Mbps Wireless PCI Adapter
- 8169 Gigabit Ethernet Adapter (GA311)
- F004 FA310TX Fast Ethernet Adapter
- F311 Fast Ethernet Adapter (FA311)
- F312 ?
-1386 Video Domain Technologies
-1387 Curtiss-Wright Controls Embedded Computing
- 5310 SCRAMNet GT200 (N/A)
-1388 Hitachi Information Technology Co Ltd
-1389 Applicom International
- 0001 Intelligent fieldbus Adapter (PCI1500PFB)
- 0104 PCI-CANIO adapter (PCI-CANIO)
-138A Fusion Micromedia Corp
-138B Tokimec Inc
-138C Silicon Reality
-138D Future Techno Designs Pty Ltd
-138E Basler GmbH
-138F Patapsco Designs Inc
-1390 Concept Development Inc
-1391 Development Concepts Inc
-1392 Medialight Inc
-1393 Moxa Technologies Co Ltd
- 0001 UC7000 Seria
- 1010 C101/PCI Super Sync Board
- 1020 Smartio CP-102 Series
- 1021 CP102UL (2-port RS-232 Universal PCI)
- 1022 CP102U (2-port RS-232 Universal PCI)
- 1040 Smartio (C104H/PCI)
- 1041 Smartio CP-104UL
- 1042 Smartio CP-104JU
- 1043 CP104EL (4-port RS-232 Smart PCI Express)
- 1044 POS104UL (4-port RS-232 Universal PCI)
- 1140 Industio CT-114I
- 1141 Industio CP-114 Series
- 1142 CB114 (4-port RS-232/422/485 PC/104-plus Module)
- 1180 CP118U (8-port RS-232/422/485 Smart Universal PCI)
- 1181 CP118EL (8-port RS-232/422/485 Smart PCI Express)
- 1320 Industio CP-132 Series
- 1321 Industio CP-132U Series
- 1340 UniversalPCI board, 4 ports RS-422/485 with Isolation DB9M (CP--134U-I-DB9 V2.3 UPCI Board)
- 1341 CB134I (4-port RS-422/485 PC/104-plus Module)
- 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI)
- 1401 ?
- 1680 Smartio (C168H/PCI)
- 1681 CP-168U Smart Serial Board (CP-168U)
- 1682 CP168EL (8-port RS-232 Smart PCI Express)
- 2040 Intelligent CP-204J
- 2180 Intelligent C218Turbo/PCI
- 2210 ---
- 2240 ---
- 3200 Intelligent C320Turbo/PCI
- 5020 C502/PCI Dual-Port Sync Board
- 6800 dvr capture card (0x0000)
-1394 Level One Communications
- 0001 LXT1001 NetCelerator Family Gigabit Ethernet Adapter
-1395 Ambicom Inc
-1396 Cipher Systems Inc
-1397 Cologne Chip Designs GmbH
- 08B4 ISDN network Controller [HFC-4S]
- 0B4D HFC-8S ISDN 16B8D8S0 ISDN HDLC FIFO Controller with 8 S/T
- 16B8 ISDN network Controller [HFC-8S]
- 2BD0 HFC-S PCI A ISDN 2BDS0 ISDN HDLC FIFO Controller
- 30B1 ISDN network Controller [HFC-E1]
- 8B4D HFC-4S ISDN 8B4D4S0 ISDN HDLC FIFO Controller with 4 S/T
- B000 HCF-PCI card (B000)
- B006 HCF-PCI card (B006)
- B007 HCF-PCI card (B007)
- B008 HCF-PCI card (B008)
- B009 HCF-PCI card (B009)
- B00A HCF-PCI card (B00A)
- B00B HCF-PCI card (B00B)
- B00C HCF-PCI card (B00C)
- B100 HCF-PCI card (B100)
- F001 GSM Network Controller [HFC-4GSM]
-1398 Clarion Co Ltd
-1399 Rios Systems Co Ltd
-139A Alacritech Inc
- 0001 Quad Port 10/100 Server Accelerator
- 0003 Single Port 10/100 Server Accelerator
- 0005 Single Port Gigabit Server Accelerator
- 0007 Alacritech iSCSI Controller (SES2000)
-139B Mediasonic Multimedia Systems Ltd
-139C Quantum 3D Inc
-139D EPL Ltd
-139E Media4
-139F Aethra S.R.L.
-13A0 Crystal Group Inc
-13A1 Kawasaki Heavy Industries Ltd
-13A2 Ositech Communications Inc
-13A3 HI-FN Inc.
- 0005 7751 Security Processor
- 0006 Public Key Processor (6500)
- 0007 7811 Security Processor
- 0012 7951 Security Processor
- 0014 78XX Security Processor
- 0015 Security Processor (8065)
- 0016 8065 Security Processor
- 0017 8165 Security Processor
- 0018 8154 Security Processor
- 001D 7956 Security Processor
- 0020 7955 Security Processor
- 0026 8155 Security Processor
-13A4 Rascom Inc
-13A5 Audio Digital Imaging Inc
-13A6 Videonics Inc
-13A7 Teles AG
- 6240 BSRV2-301A (Network Controller)
-13A8 Exar Corp.
- 0152 XR17C/D152 Dual PCI UART
- 0154 Four Channel PCI Bus UART (XR17C154)
- 0158 Eight Channel PCI Bus UART (5V) (XR17C158)
-13A9 Siemens Medical Solutions
-13AA Broadband Networks Inc
-13AB Arcom Control Systems Ltd
-13AC Motion Media Technology Ltd
-13AD Nexus Inc
-13AE ALD Technology Ltd
-13AF T.Sqware
-13B0 Maxspeed Corp
-13B1 Tamura Corp
-13B2 Techno Chips Co Ltd
-13B3 Lanart Corp
-13B4 Wellbean Co Inc
-13B5 ARM
-13B6 DLoG GmbH
- 13B6 sguiu (0x13b6)
-13B7 LOGIC Devices Inc
-13B8 Nokia Telecommunications Oy
-13B9 Elecom Co Ltd
-13BA Oxford Instruments
-13BB Sanyo Technosound Co Ltd
-13BC Bitran Corp
-13BD Sharp Corp
-13BE Miroku Jyoho Service Co Ltd
-13BF Sharewave Inc
-13C0 Microgate Corp.
- 0010 single port multiprotocol serial adapter (SyncLink Adapter)
- 0020 low speed single port multiprotocol serial adapter (SyncLink SCC)
- 0030 4 port multiprotocol serial adapter (SyncLink 4 Port Adapter)
- 0070 single port multiprotocol serial adapter (SyncLink GT Adapter)
- 0080 4 port multiprotocol serial adapter (SyncLink GT4 Adapter)
- 0090 one port asynchronous serial adapter (SyncLink AC Adapter)
- 00A0 2 port multiprotocol serial adapter (SyncLink GT2 Adapter)
- 0210 single port multiprotocol serial adapter (SyncLink Serial Adapter version 2)
-13C1 3ware Inc
- 1000 ATA-RAID Controller (9548qad)
- 1001 ATA-133 Storage Controller (7000/8000 series)
- 1002 SATA/PATA Storage Controller (9000 series)
- 1003 SATA2 Raid Controller (9550SX/9590SE Series)
- 1004 PCI-Express SATA2 Raid Controller (9650SE Series)
- 1005 PCI-Express SATA2/SAS Raid Controller (9690SA Series)
- 1010 PCI-Express2 SAS2/SATA2 Raid Controller (9750 Series)
-13C2 Technotrend Systemtechnik GmbH
- 000E Technotrend/Hauppauge DVB card rev2.3
-13C3 Janz Computer AG
-13C4 Phase Metrics
-13C5 Alphi Technology Corp
-13C6 Condor Engineering Inc
- 0520 CEI-520 A429 Card
- 0620 CEI-620 A429 Card
- 0820 CEI-820 A429 Card
-13C7 Blue Chip Technology Ltd
- 0ADC Multi-Function Analogue/Digital IO Card
- 0B10 Parallel I/O Card
- 0D10 Digital I/O Card
- 5744 Watchdog Card
-13C8 Apptech Inc
-13C9 Eaton Corp
-13CA IOMEGA Corp
-13CB Yano Electric Co Ltd
-13CC Metheus Corp
-13CD Compatible Systems Corp
-13CE Cocom A/S
-13CF Studio Audio & Video Ltd
-13D0 Techsan Electronics Co Ltd
- 2103 B2C2 Sky2PC Core Chip sky star 2 <technisat> (T228502)
- 2200 B2C2 Broadband Receiver PCI Adapter (FCIII)
-13D1 AboCom Systems, Inc
- AB02 Ethernet Controller
- AB03 Ethernet Controller
- AB06 FE2000VX 10/100 CardBus /Atelco Fibreline Ethernet Adapter
- AB08 EZ Card 10/100 Fast Ethernet CardBus Adapter (SMC8035TX)
-13D2 Shark Multimedia Inc
-13D3 IMC Networks
-13D4 Graphics Microsystems Inc
-13D5 Media 100 Inc
-13D6 K.I. Technology Co Inc
-13D7 Toshiba Engineering Corporation
- 8086 toshiba (6205)
-13D8 Phobos Corporation
- 1000 XaQti 1000Mbit/sec Gbit Ethernet Controller (XQ11800FP)
-13D9 Apex PC Solutions Inc
-13DA IntreSource Systems Pty Ltd
-13DB Janich & Klass Computertechnik GmbH
-13DC Netboost Corp
-13DD Multimedia Bundle Inc
-13DE ABB Robotics Products AB
-13DF E-Tech Inc.
- 0001 Modem (PCI56RVP)
-13E0 GVC Corporation
-13E1 Silicom Multimedia Systems Inc
-13E2 Dynamics Research Corp
-13E3 Nest Inc
-13E4 Calculex Inc
-13E5 Telesoft Design Ltd
-13E6 Argosy Research Inc
-13E7 NAC Inc
-13E8 Chip Express Corp
-13E9 Intraserver Technology Inc
-13EA Dallas Semiconductor (Now known as Maxim)
- 3131 BoSS Bit Synchronous HDLC Controller (DS3131)
- 3134 DS3134/31256 Chateau/Envoy 256 Channel HDLC Controller
-13EB Hauppauge Computer Works Inc
-13EC Zydacron Inc
- 000A NPC-RC01 Remote control receiver
-13ED Raytheion E-Systems
-13EE Hayes Microcomputer Products Inc
-13EF Coppercom Inc
-13F0 Sundance Technology Inc
- 0200 Encorest Ethernet PCI Ad ENL832-TX-ICNT Faapter (0x0200)
- 0201 Fast Ehternet Adapter (ST201)
- 0300 Network Adapter (NX1001)
- 1021 Tamarack 9021A Gigabit Ethernet adapter (Tamarack 9021A)
- 1023 IC Plus IP1000 Family Gigabit Ethernet Adapter
- 13F0 ST201 Fast Ethernet Adapter (-PCIVEN_13F0&DEV_0200&SUBSYS_82121043&REV_313&61)
-13F1 Oce' - Technologies B.V.
-13F2 Ford Microelectronics Inc
-13F3 McData Corp
-13F4 Troika Design Inc
- 1401 Zentai Fibre Channel Adapter
-13F5 Kansai Electric Co Ltd
-13F6 C-Media Electronics Inc.
- 0100 CMI8338/C3DX PCI Audio Device
- 0101 PCI Audio Device (CMI8338-031)
- 0111 C-Media Audio Controller (CMI8738)
- 0112 PCI Audio Chip (CMI-8378B/PCI-6CH)
- 0191 CMI 8768 8CH Sound Card (PCIVEN_13F6&DEV_0191&REV_10)
- 0211 HSP56 MICROMODEM (PCIVEN_13F6&DEV_0111&SUBSYS_011113F6&REV_10_13F6&)
- 0300 pci audio driver (0x4005)
- 8788 C-Media Oxygen HD (CMI8788/PCI-8CH)
-13F7 Wildfire Communications
-13F8 Ad Lib Multimedia Inc
-13F9 NTT Advanced Technology Corp
-13FA Pentland Systems Ltd
-13FB Aydin Corp
-13FC Computer Peripherals International
-13FD Micro Science Inc
- 160E a (a)
- 161F s (1D59CB92)
- 1840 USB Harddisk adapter (don't know what you mean... :-()
-13FE Advantech Co., Ltd.
- 1240 4-Axis Stepping/Servo Motor Card (NOVA MCX314)
- 1600 PCI-16xx series PCI multiport serial board (function 0)
- 1680 2-port CAN UniversalPCI Communication Card with Isolation (PCI-1680U-A)
- 16FF PCI-16xx series PCI multiport serial board (function 1: RX/TX steering CPLD)
- 1713 32-channel Isolated Analog Input Card (PCI-1713)
- 1723 16-bit, 8-ch Analog Output PCI Card with 16-ch Digital I/O (PCI-1723)
- 1724 14-bit, 32-channel Isolated Analog Output Card (PCI-1724)
- 1733 PCI-1733 32-channel isolated digital input card
- 1750 PCI-1750 Opto Isolated Digital I/O Card w/Counter
- 1752 PCI-1752
- 1754 PCI-1754
- 1756 PCI-1756
- 1760 ?
- 1761 8-channel relay actuator and 8-channel isolated input card (PCI-1761)
- 1A00 0x0200 (0x03)
- 3730 16Bit dig. I/O Board (PCM-3730I)
-13FF Silicon Spice Inc
-1400 ARTX Inc
- 0001 ArtX1 AGP System Controller
- 0003 ArtX1 Media Device
- 0004 ArtX1 Display Device
- 1401 hd 2600xt (9432 TX)
-1401 CR-Systems A/S
-1402 Meilhaus Electronic GmbH Germany
- 2E00 ME-2000 / 2600 Multifunction Data Aquistion Card
- 4610 Multi-IO board (16x 16bit ADC, 32x TTL I/O) (ME-4610)
- 4650 Multi-IO board (16x 16bit ADC, 32x TTL I/O) (ME-4650)
-1403 Ascor Inc
-1404 Fundamental Software Inc
-1405 Excalibur Systems Inc
-1406 Oce' Printing Systems GmbH
-1407 Lava Computer Manufacturing Inc
- 0100 Lava Dual Serial 550 PCI (0439)
- 0101 Lava Quattro PCI A/B
- 0102 Lava Quattro PCI C/D
- 0110 Lava DSerial PCI Port A (0110)
- 0111 Lava DSerial PCI Port B (nep5p)
- 0180 Lava Octopus PCI Ports 1-4
- 0181 Lava Octopus PCI Ports 5-8
- 0200 LavaPort Dual-650 PCI
- 0201 LavaPort Quad-650 PCI A/B
- 0202 LavaPort Quad-650 PCI C/D
- 0220 LavaPort Quad-650 PCI A/B
- 0221 LavaPort Quad-650 PCI C/D
- 0400 Lava 8255 PIO PCI
- 0500 Lava Single Serial 550 PCI (P4)
- 0510 Lava SP Serial 550 PCI
- 0511 Lava SP BIDIR Parallel PCI
- 0520 Lava RS422 SS-PCI
- 0600 LavaPort 650 PCI (4-0 9253)
- 0A00 COM Port Accelerator (LavaPort PCI)
- 8000 Lava Parallel
- 8001 Lava Dual Parallel port A
- 8002 Lava Dual Parallel port A
- 8003 Lava Dual Parallel port B
- 8800 BOCA Research IOPPAR (2003)
-1408 Aloka Co Ltd
-1409 Timedia Technology Co Ltd
- 7168 PCI / ISA Asynchronous UART Signal Chips Solution (40371409)
- 7268 PCI parallel port (PCI / ISA IEEE1284 ECP/EPP/SPP/BPP Signal Chips So)
-140A DSP Research Inc
-140B Ramix Inc
- 0610 ?
-140C Elmic Systems Inc
-140D Matsushita Electrics Works Ltd
-140E Goepel Electronic GmbH
-140F Salient Systems Corp
-1410 Midas Lab Inc
-1411 Ikos Systems Inc
-1412 VIA Technologies Inc (Was: IC Ensemble Inc)
- 1712 ICE1712 Envy24 Multichannel Audio Controller
- 1724 Envy24PT/HT PCI Multi-Channel Audio Controller (VT1720/24)
-1413 Addonics
-1414 Microsoft Corp
-1415 Oxford Semiconductor Ltd - now part of PLX Technology
- 8401 PCI Interface to local bus (OX9162)
- 8403 OX12PCI840/OX9162 Integrated Parallel Port
- 9500 Quad UART (disabled) (OX16PCI954)
- 9501 Quad UART (OX16PCI954)
- 9504 OX16PCI954 PCI UARTs (unique bars)
- 9505 OX16PCI952 PCI UARTs (unique bars)
- 950A OX16PCI954 Dual PCI UART (??)
- 950B OXCB950 Integrated High Performance UART (CardBus/PCI Interface)
- 9510 PCI Interface (disabled) (OX16PCI954)
- 9511 OX9160/OX16PCI954 PCI Interface to 8-bit Local Bus
- 9512 OX9160/OX16PCI954 PCI Interface to 32-bit Local Bus
- 9513 OX9160/OX16PCI954 Parallel Port
- 9521 OX16PCI952 Integrated Dual UART
- 9523 Integrated Parallel Port (OX16PCI952)
- C158 2 native UARTs (function 0) (OXPCIe952)
- C15D 2 native UARTs (function 1) (OXPCIe952)
- C208 Quad UARTs (OXPCIe954)
- C20D Quad UARTs (function 1) (OXPCIe954)
- C308 Octo UARTs (OXPCIe958)
- C30D Octo UARTs (function 1) (OXPCIe958)
-1416 Multiwave Innovation Pte Ltd
-1417 Convergenet Technologies Inc
-1418 Kyushu Electronics Systems Inc
-1419 Excel Switching Corp
-141A Apache Micro Peripherals Inc
- 1035 PCI Modem Enumerator
-141B Zoom Telephonics Inc
-141C Zoom Telephonics Inc
-141D Digitan Systems Inc
-141E Fanuc Ltd
-141F Visiontech Ltd
- 6181 MPEG decoder (KFIR)
-1420 Psion Dacom PLC
- 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)
- 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)
-1421 ADS Technologies Inc
-1422 Ygrec Systems Co Ltd
-1423 Custom 7Technology Corp
-1424 Vidoeserver Connections
-1425 ASIC Designers Inc
- 000B T210 Protocol Engine
- 000C T204 Protocol Engine
- 0030 T310 10GbE Single Port Protocol Engine Ethernet Adapter
- 0031 T320 10GbE Dual Port Protocol Engine Ethernet Adapter
- 0032 T302 1GbE Dual Port Protocol Engine Ethernet adapter
- 0033 T304 1GbE Quad Port Protocol Engine Ethernet adapter
-1426 Storage Technology Corp
-1427 Better On-line Solutions
-1428 EDEC Co Ltd
-1429 UNEX Technology Corp
-142A Kingmax Technology Inc
-142B RadioLAN
-142C Minton Optic Industry Co Ltd
-142D Pix Stream Inc
-142E Vitec Multimedia
- 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder
- 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder
-142F Radicom Research Inc
-1430 ITT Aerospace/Communications Division
-1431 Gilat Satellite Networks
-1432 Edimax Computer Co
- 9230 Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC
-1433 Eltec Elektronik GmbH
-1435 RTD Embedded Technologies, Inc.
- 0531 DELETE (DELETE)
- 4520 PCI4520 PCI Data Acquisition Controller
- 6020 PCI-104 dspModule (SPM6020)
- 6030 PC/104-Plus dspModule (SPM6030)
- 6420 PC/104-Plus dspModule (SPM186420)
- 6430 PC/104-Plus dspModule (SPM176430)
- 7520 PC/104-Plus dataModule (DM7520)
- 7540 PC/104-Plus dataModule with SmartCal (SDM7540)
-1436 CIS Technology Inc
-1437 Nissin Co Inc
-1438 Atmel-Dream
-1439 Outsource Engineering & Manufacturing Inc
-143A Stargate Solutions Inc
-143B Canon Research Center, America
-143C Amlogic Inc
-143D Tamarack Microelectronics Inc
-143E Jones Futurex Inc
-143F Lightwell Co Ltd - Zax Division
-1440 Algol Corp
-1441 AGIE Ltd
-1442 Phoenix Contact Co GmbH
- 0002 Interbus PCI MPM Board
- 0004 Interbus PCI MPM Board
- 0005 Interbus PCI MPM Board
-1443 Unibrain S.A.
-1444 TRW
-1445 Logical do Ltd
-1446 Graphin Co Ltd
-1447 AIM GmbH
-1448 Alesis Studio
- 0001 Audio Editing (ADAT/EDIT)
-1449 TUT Systems Inc
-144A ADLINK Technology Inc
- 7230 PCI-7230
- 7248 PLX PCI9052 (PCI-9052)
- 7250 PLX PCI9052 (PCI-7250)
- 7256 PCI-7256 16-CH Latching Relay & 16-CH Isolated Digital Input Card (PCI-7256)
- 7296 96-ch digital I/O card (PCI-7296 (PLX PCI-9052))
- 7432 PCI-7432
- 7433 64-ch digital Input card (PCI-7433)
- 7434 PCI-7434
- 7841 SJA 1000- baseddual port CAN bus card (PCI-7841)
- 8133 PCI-8133
- 8554 PCI-8554
- 9111 PCI-9111
- 9113 PCI-9113
- 9114 PCI-9114
-144B Loronix Information Systems, Inc.
- 0601 ?
-144C Catalina Research Inc
-144D Samsung Electronics Co Ltd
-144E Olitec
-144F Askey Computer Corp
-1450 Nexus Systems Inc
-1451 SP3D Chip Design GmbH
-1453 Mycom Inc
-1454 Altiga Networks
-1455 Logic Plus Plus Inc
-1456 Advanced Hardware
-1457 Nuera Communications Inc
-1458 Giga-Byte Technologies
- 1458 microsoft (0x1458)
- 5000 GA-X48T-DQ6 (0x29e0)
-1459 Dooin Electronics
-145A Escalate Networks Inc
-145B Praim SRL
-145C Cryptek
-145D Gallant Computer Inc
-145E Aashima Technology B.V.
-145F Baldor Electric Company
- 0001 Multi-axis Motion Controller (NextMove PCI)
- 0002 Multi-axis Motion Controller (NextMove PCI-2)
-1460 Dynarc Inc
-1461 Avermedia Technologies Inc
-1462 Micro-Star International Co Ltd (MSI)
- 00C1 NX6800-TD256E (NV41.1)
- 4720 Audio controller
- 5071 Audio controller
- 7120 ?
- 7960 MCP2T (MCP2T)
-1463 Fast Corp
-1464 Interactive Circuits & Systems Ltd
-1465 GN Nettest Telecom Division
-1466 Designpro Inc
-1467 Digicom SPA
-1468 Ambit microsystem Corp
-1469 Cleveland Motion Controls
-146A IFR Ltd
-146B Parascan Technologies Ltd
-146C Ruby Tech Corp
-146D Tachyon Inc
-146E Williams Electronic Games Inc
-146F Multi Dimensional Consulting Inc
-1470 Bay Networks
-1471 Integrated Telecom Express Inc (ITE)
- 0188 ADSL PCI (RoadRunner 10)
-1472 Daikin Indistries Ltd
-1473 Zapex Technologies Inc
-1474 Doug Carson & Associates
-1475 Picazo Communications
-1476 Mortara Instrument Inc
-1477 Net Insight
-1478 Diatrend Corp
-1479 Toray Industries Inc
-147A Formosa Industrial Computing
-147B Abit Computer Corp
-147C Aware Inc
-147D Interworks Computer Products
-147E Matsushita Graphic Communication Systems Inc
-147F Nihon Unisys Ltd
-1480 SCII Telecom
-1481 Biopac Systems Inc
-1482 Isytec
-1483 Labway Corp
-1484 Logic Coporation
-1485 ERMA - Electronic GmbH
-1486 L3 Communications Telemetry & Instrumentation
-1487 Marquette Medical Systems
-1488 Kontron Electronik GmbH
-1489 KYE Systems Corp
-148A OPTO 22
-148B Innomedialogic Inc
-148C PowerColor (C.P. Technology Co Ltd)
- 4011 RADEON 9000 PRO EVIL COMMANDO (RV250)
- 4152 0x2079 (0x1002)
-148D Digicom Systems Inc.
- 1003 Creative ModemBlaster V.90 PCI DI5655 (Rockwell HCF chipset)
-148E OSI Plus Corp
-148F Plant Equipment Inc.
- 2573 802.11 bg (1192Af7b)
- 2870 802.11 n WLAN (1.0)
-1490 Stone Microsystems Pty Ltd
-1491 Zeal Corp
-1492 TIME LOGIC Corp
-1493 Maker Communications
-1494 Wintop Technology Inc
-1495 Tokai Communications Industry Co Ltd
-1496 Joytech Computer Co Ltd
-1497 SMA Regelsysteme GmbH
-1498 Tews Datentechnik GmbH
-1499 Emtec Co Ltd
-149A Andor Technology Ltd
-149B Seiko Instruments Inc
-149C Ovislink Corp
-149D Newtek Inc
-149E Mapletree Networks Inc
-149F Lectron Co Ltd
-14A0 Softing GmbH
-14A1 Systembase Co Ltd
-14A2 Millennium Engineering Inc
-14A3 Maverick Networks
-14A4 GVC/BCM Advanced Research
-14A5 Xionics Document Technologies Inc
-14A6 Inova Computers GmbH & Co KG
-14A7 Mythos Systems Inc
-14A8 Featron Technologies Corp
-14A9 Hivertec Inc.
- AD1F 1
-14AA Advanced MOS Technology Inc
-14AB Mentor Graphics Corp
-14AC Novaweb Technologies Inc
-14AD Time Space Radio AB
-14AE CTI Inc
-14AF Guillemot Corp
-14B0 BST Communication Technology Ltd
-14B1 Nextcom K.K.
- 1033 RH56D-PCI (R6795-12)
- 2F30 zyxel omni 56k CI lus rev. (01)
-14B2 Ennovate Networks Inc
-14B3 Xpeed Inc.
- 0000 DSL NIC (9ff-usa-a99-99-0970)
-14B4 Philips Business Electronics B.V.
-14B5 Creamware GmbH
- 0200 Scope
- 0300 Pulsar
- 0400 Pulsar SRB
- 0600 Pulsar 2
- 0800 DSP-Board
- 0900 DSP-Board
- 0A00 DSP-Board
- 0B00 DSP-Board
-14B6 Quantum Data Corp
-14B7 Proxim Inc.
- 0001 pci9052 (Symphony 4110)
-14B8 Techsoft Technology Co Ltd
-14B9 Aironet Wireless Communications (Cisco)
- 0001 werwerwerwe (PC4800)
- 0340 Cisco Systems 340 Series PCI Wireless LAN Adapter
- 0350 Cisco Systems 350 Series PCI Wireless LAN Adapter
- 2500 Wireless PCI LAN Adapter (PC2500 DS)
- 3100 Wireless PCI LAN Adapter (PC3100 FH)
- 3101 Wireless PCI LAN Adapter (PC3100 FH)
- 3500 Wireless PCI LAN Adapter (PC3500 FH)
- 4500 Wireless PCI LAN Adapter (PC4500 DS)
- 4800 Wireless PCI LAN Adapter (PC4800 DS)
- A504 Cisco Aironet 350 Series Mini-PCI (MPI350) (A504 Cisco MAC)
- A505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter
- A506 802.11b/g wireless adapter (AIR-MP21G)
-14BA Internix Inc
-14BB Semtech Corp
-14BC Globespan Semiconductor Inc
- D002 Pulsar [PCI ADSL Card]
- D00F Pulsar [PCI ADSL Card]
-14BD Cardio Control N.V.
-14BE L3 Communications
-14BF Spider Communications Inc
-14C0 Compal Electronics Inc
-14C1 Myricom Inc.
- 0008 Myri-10G Dual-Protocol NIC (10G-PCIE-8A)
- 8043 Myrinet 2000 Scalable Cluster Interconnect
-14C2 DTK Computer
-14C3 Mediatek Corp
-14C4 Iwasaki Information Systems Co Ltd
-14C5 ABB Automation Products AB
-14C6 Data Race Inc
-14C7 Modular Technoloy Holdings Ltd
-14C8 Turbocomm Tech Inc
-14C9 ODIN Telesystems Inc
-14CA PE Logic Corp
-14CB Billionton Systems Inc/Cadmus Micro Inc
-14CC Nakayo Telecommunications Inc
-14CD Universal Scientific Ind
-14CE Whistle Communications
-14CF TEK Microsystems Inc.
- 2920 Serial I/O Controller aka FPMC-DFLEX64 (FPMC-FIO1-F100-1)
-14D0 Ericsson AXE R & D
-14D1 Computer HI-TECH Co Ltd
-14D2 Titan Electronics Inc
- 8001 VScom PCI-010L 1 x Printer Controller
- 8002 VScom PCI-020L 2 x Printer Controller
- 8010 VScom PCI-100L 1 x RS-232 Controller
- 8011 VScom PCI-110L 1 x RS-232 and 1 x Printer Controller
- 8020 VScom PCI-200L 2 x RS-232 Controller
- 8021 VScom PCI-210L 2 x RS-232 and 1 x Printer Controller
- 8040 VScom PCI-400L 4 x RS-232 Controller
- 8041 VScom PCI-410L 4 x RS-232 and 1 x Printer Controller
- 8042 VScom PCI-420L 4 x RS-232 and 2 x Printer Controller
- 8080 VScom PCI-800L 8 x RS-232 Controller
- A000 VScom PCI-010H 1 x Printer Controller
- A001 VScom PCI-110H 1 x RS-232 and 1 x Printer Controller
- A003 VScom PCI-400H 4 x RS-232 Controller
- A004 VScom PCI-400HF1 4 x RS-232 Controller
- A005 VScom PCI-200H 2 x RS-232 Controller
- E001 VScom PCI-010HV2 1 x Printer Controler
- E010 VScom PCI-100HV2 1 x RS-232 Controller
- E020 VScom PCI-200HV2 2 x RS-232 Controller
- FFFF VScom Dummy Controller
-14D3 Cirtech (UK) Ltd
-14D4 Panacom Technology Corporation
- 0400 Interface chip (Panacom 7)
-14D5 Nitsuko Corp
-14D6 Accusys Inc
- 6101 ACS-61xxx, PCIe to SAS/SATA RAID HBA
- 6201 ACS-62xxx, External PCIe to SAS/SATA RAID controller
-14D7 Hirakawa Hewtech Corp
-14D8 Hopf Elektronik GmbH
-14D9 Alpha Processor Inc
- 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]
- 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge
-14DA National Aerospace Laboratories
-14DB Avlab Technology Inc.
- 2100 download drivers (PCI IO 1S)
- 2101 PCI IO 1S-650
- 2102 PCI IO 1S-850
- 2110 OX16PCI952 (PCI IO 1S1P)
- 2111 PCI IO 1S1P-650
- 2112 PCI IO 1S1P-850
- 2120 PCI IO 1P, TK9902, Avlab P005
- 2121 Avlab Technology PCI IO 2P (PCI IO 2P)
- 2130 2 Port PCI Serial Card (PCI IO 2S)
- 2131 pci serial port (PCI IO 2S-650)
- 2132 PCI IO 2S-850
- 2140 PCI IO 2P1S
- 2141 PCI IO 2P1S-650
- 2142 PCI IO 2P1S-850
- 2144 PCI IO 2P2S
- 2145 PCI IO 2P2S-650
- 2146 PCI IO 2P2S-850
- 2150 PCI IO 4S
- 2151 PCI IO 4S-654
- 2152 PCI IO 4S-850
- 2160 PCI IO 2S1P
- 2161 PCI IO 2S1P-650
- 2162 PCI IO 2S1P-850
- 2180 VEN_14DB&DEV_2180&SUBSYS_218014DB&REV_00 (PCI IO 8S)
- 2181 Avlab Technology Inc (PCI IO 8S-654)
- 2182 Avlab Technology Inc (PCI IO 8S-850)
-14DC Amplicon Liveline Limited
- 0000 PCI230 16-chan A/D, 2-chan D/A, 24 DIO, 3 counter timers
- 0001 4-port high speed RS-232 (PCI242H)
- 0002 8-port high speed RS-232 (PCI244H)
- 0003 2-port high speed RS-232 (PCI247H)
- 0004 2-port high speed RS-422/485 (PCI248H)
- 0005 2-port high speed RS-232 and RS-422/485 (PCI249H)
- 0006 16-channel analog input (with timers) (PCI260)
- 0007 PCI224 16-channel 12-bit analog output (with timers)
- 0008 PCI234 4-channel 16-bit analogue output (with timers)
- 0009 24-channel digital I/O (PCI236)
- 000A 72-channel digital I/O (PCI272)
- 000B PCI215 48-channel digital I/O with 6 counter timers
- 000C 16-channel reed relay output (PCI263)
-14DD Bolder Design Labs Inc
-14DE Applied Integration Corp
-14DF Basis Communications Corp
-14E1 Invertex
-14E2 Infolibria
-14E3 Amtelco
-14E4 Broadcom Corporation
- 034F ??? (NV36GL?)
- 04B5 Broadcom 54bg Wireless (BCM4312)
- 0800 Sentry5 Chipcommon I/O Controller (BCM33xx/47xx)
- 0804 Sentry5 PCI Bridge (BCM33xx/47xx)
- 0805 Sentry5 MIPS32 CPU (BCM33xx/47xx)
- 0806 Sentry5 Ethernet Controller (BCM33xx/47xx)
- 080B Sentry5 Crypto Accelerator (BCM33xx/47xx)
- 080F Sentry5 DDR/SDR RAM Controller (BCM33xx/47xx)
- 0811 Sentry5 External Interface (BCM33xx/47xx)
- 0816 Sentry5 MIPS32 CPU (BCM3302)
- 14E4 802.11b/g Wireless Lan Controller (BCM5787M)
- 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express (BCM5752)
- 1601 NetXtreme BCM5752M Gigabit Ethernet PCIe
- 1612 Broadcom Video Decoder/Accelerator (BCM70010/BCM70012)
- 1639 NetXtreme II Gigabit Ethernet (BCM5709)
- 163A NetXtreme II BCM5709S Gigabit Ethernet
- 1644 BCM5700 NetXtreme Gigabit Ethernet Controller
- 1645 broadtcomBCM5701 Gigabit Ethernet (BCM5701)
- 1646 NetXtreme Gigabit Ethernet (BCM5702x1)
- 1647 NetXtreme Gigabit Ethernet (BCM5703)
- 1648 NetXtreme Dual Gigabit Adapter (BCM5704)
- 1649 NetXtreme BCM5704S_2 Gigabit Ethernet
- 164A BCM5706 NetXtreme II Gigabit Ethernet
- 164C Broadcom NetXtreme II Gigabit Ethernet Adapter (BCM5708)
- 164D NetXtreme Fast Ethernet Controller (BCM5702FE)
- 1653 Broadcom NetXtreme Gigabit Ethernet (BCM5788)
- 1654 NetXtreme Gigabit Ethernet (BCM5705-)
- 1658 BCM5750A1 NetXtreme Gigabit Ethernet
- 1659 NetXtreme Gigabit Ethernet PCI Express (BCM5721)
- 165A Broadcom NetXtreme BCM5722 Gigabit (94309)
- 165D Broadcom NetXtreme Gigabit Ethernet (BCM5705M)
- 165E BCM5705MA2 NetXtreme Gigabit Ethernet
- 1668 NetXtreme BCM5714 Gigabit Ethernet
- 1669 NetXtreme 5714S Gigabit Ethernet
- 166A Broadcom NetXtreme Gigabit Ethernet 5780 (BCM5780)
- 166B NetXtreme Gigabit Ethernet (BCM5780S)
- 166D NetXtreme Ethernet 100kB (BCM5705MFE)
- 166E BCM5705F 10/100 Integrated Controller
- 1672 NetXtreme BCM5754M Gigabit Ethernet PCIe
- 1673 NetXtreme BCM5755M Gigabit Ethernet PCIe
- 1674 NetXtreme BCM5756ME Gigabit Ethernet PCIe
- 1676 NetXtreme Gigabit Ethernet (BCM5750A1)
- 1677 NetXtreme Gigabit Ethernet PCI Express (BCM5750A1)
- 1678 BCM5715C 10/100/100 PCIe Ethernet Controller
- 1679 NetXtreme 5715S Gigabit Ethernet
- 167A Broadcom NetXtreme Gigabit Ethernet Controller (BCM5754)
- 167B NetXtreme Gigabit Ethernet (BCM5755/5780)
- 167C BCM5750A1 NetXtreme Gigabit Ethernet
- 167D Broadcom NetXtreme Gigabit Ethernet (BCM5751M)
- 167E BCM5751F NetXtreme Fast Ethernet PCIe
- 167F NetLink BCM5787F Fast Ethernet PCIe
- 1681 Broadcom 57XX Gigabit Integrated Controller (BCM5761)
- 1684 Broadcom NetXtreme Gigabit Ethernet (BCM5764)
- 1693 Ethernet Controller Broadcom Netlink Gigabit (BCM5787A)
- 1696 Broadcom NetXtreme Gigabit Ethernet - http://www.broadcom.com/support/ethernet_nic/downloaddrivers.p (BCM5782)
- 1698 NetLink (BCM5786gigabit ethernet pcie)
- 169A NetLink BCM5786 Gigabit Ethernet PCIe
- 169B NetLink BCM5787 Gigabit Ethernet PCIe
- 169C Broadcom NetLink (TM) Gigabit Ethernet (BCM5788)
- 169D Broadcom Ethernet Adapter (BCM5782k, BCM5789)
- 169E NetXtreme Gigabit Ethernet PCI Express (BCM5754)
- 16A6 BCM5702X NetXtreme Gigabit Ethernet
- 16A7 BCM5703X NetXtreme Gigabit Ethernet
- 16A8 NetXtreme Gigabit Ethernet (BCM5704)
- 16AA BroadCom NetExtreme II Server (B06BDRV)
- 16AC NetXtreme II BCM5708S Gigabit Ethernet
- 16C6 NetXtreme Gigabit Ethernet (BCM5702A3)
- 16C7 BCM5703A3 NetXtreme Gigabit Ethernet
- 16DD NetLink BCM5781 Gigabit Ethernet PCIe
- 16F7 NetXtreme BCM5753 Gigabit PCI Express (BCM5753)
- 16FD NetXtreme Gigabit Ethernet PciXpress (BCM5753M)
- 16FE BCM5753F NetXtreme Fast Ethernet PCIe
- 16FF NetXtreme Gigabit Ethernet
- 170C Broadcom NetLink 4401 10/100 Ethernet NIC (BCM4401)
- 170D BCM5901 NetXtreme Fast Ethernet
- 170E BCM5901 NetXtreme Fast Ethernet
- 1712 NetLink BCM5906 Fast Ethernet PCIe
- 1713 Broadcom NetLink (TM) Fast Ethernet (BCM5906m)
- 3352 BCM3352 QAMLink Single-Chip 4-Line VoIP (BCM3352)
- 3360 Advanced PHY Broadband Gateway Cable Modem (BCM3360)
- 4210 BCM4210 iLine10 HomePNA 2.0
- 4211 BCM4211 iLine10 HomeHPNA 2.0 10Mb/s NIC
- 4212 56k Modem (BCM V.90)
- 4220 802-11b/g Wireless PCI controller
- 4301 Dell Truemobile 1180 802.11g MiniPCI (Broadcom BCM4301 802.11g Wireless LAN Controller)
- 4303 BCM4301 802.11b802.11b Wireless LAN Controller (BCM4303)
- 4305 V.90 56k Modem (BCM4307)
- 4306 Unknown device 4306 (rev 02) (BCM4306)
- 4307 802.11b Wireless LAN Controller (BCM4306)
- 4310 BCM4301 802.11bChipcommon I/O Controller (BCM4310)
- 4311 Broadcom Corporation Dell Wireless 1390 WLAN Mini-PCI Card (BCM4311)
- 4312 BCM4310 UART (Wireless Ethernet Adapter)
- 4313 wireless network card (BCM4310)
- 4315 Broadcom Wireless b/g (BCM4315/BCM22062000)
- 4318 Broadcom 802.11b/g (BCM4318)
- 4319 Dell Wireless 1470 DualBand WLAN
- 431A 802.11a Network Adapter
- 4320 802.11b/g Wireless LAN Controller (BCM4309)
- 4321 802.11a Wireless LAN Controller (BCM4306)
- 4322 UART (BCM4306)
- 4323 V.90 56k Modem (BCM4306)
- 4324 802.11a/b/g Wireless LAN Controller (BCM4309)
- 4325 802.11b/g Wireless LAN Controller (BCM4306)
- 4326 BCM4307 Chipcommon I/O Controller(??)
- 4328 Broadcom 432AGN 802.11a/b/g/draft-n Wi-Fi Solution (BCM4321KFBG)
- 4329 BCM43XNG 802.11n Network Adapter
- 432A 802.11n Network Adapter
- 432B WIRELESS for Hp pavilion, Wireless for macbook pro (late 2009 model), Wireless for Dell e6500 , Ali
- 4344 EDGE/GPRS data and 802.11b/g combo cardbus [GC89]
- 4401 10/100 Integrated Ethernet Controller (BCM4401)
- 4402 10/100 Integrated Ethernet Controller (BCM440)
- 4403 V.90 56k Modem (BCM4402)
- 4410 BCM4410 iLine32(tm) Network Adapter
- 4411 V.90 56k Modem (BCM4212)
- 4412 BCM4412 10/100 Ethernet Network Adapter
- 4430 CardBus iLine32 HomePNA 2.0 (BCM44xx)
- 4431 V.90 56k Modem
- 4432 CardBus 10/100BaseT Ethernet (BCM44xx)
- 4610 Sentry5 PCI to SB Bridge (BCM4610)
- 4611 Sentry5 iLine32 HomePNA 1.0 (BCM4610)
- 4612 Sentry5 V.90 56k Modem (BCM4610)
- 4613 Sentry5 Ethernet Controller (BCM4610)
- 4614 Sentry5 External Interface (BCM4610)
- 4615 Sentry5 USB Controller (BCM4610)
- 4704 Sentry5 PCI to SB Bridge (BCM4704)
- 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller
- 4706 BCM4704 Sentry5 Ethernet Controller
- 4707 BCM4704 Sentry5 USB Controller
- 4708 Crypto Accelerator (BCM4704)
- 4710 Sentry5 PCI to SB Bridge (BCM4710)
- 4711 Sentry5 iLine32 HomePNA 2.0 (BCM47xx)
- 4712 Sentry5 V.92 56k modem (BCM47xx)
- 4713 Sentry5 Ethernet Controller (BCM47xx)
- 4714 Sentry5 External Interface (BCM47xx)
- 4715 Sentry5 USB Controller (BCM47xx)
- 4716 Sentry5 USB Host Controller (BCM47xx)
- 4717 Sentry5 USB Device Controller (BCM47xx)
- 4718 Sentry5 Crypto Accelerator (BCM47xx)
- 4719 BCM47xx/53xx RoboSwitch Core
- 4720 MIPS CPU (BCM4712)
- 5365 Sentry5 PCI to SB Bridge (BCM5365P)
- 5600 StrataSwitch 24+2 Ethernet Switch Controller (BCM5600)
- 5605 StrataSwitch 24+2 Ethernet Switch Controller (BCM5605)
- 5615 StrataSwitch 24+2 Ethernet Switch Controller (BCM5615)
- 5625 StrataSwitch 24+2 Ethernet Switch Controller (BCM5625)
- 5645 StrataSwitch 24+2 Ethernet Switch Controller (BCM5645)
- 5670 8-Port 10GE Ethernet Switch Fabric (BCM5670)
- 5680 G-Switch 8-Port Gigabit Ethernet Switch Controller (BCM5680)
- 5690 12-port Multi-Layer Gigabit Ethernet Switch (BCM5690)
- 5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller (BCM5691)
- 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch
- 5695 BCM5695 12-port + HiGig Multi-Layer Gigabit Ethernet Switch
- 5698 BCM5698 12-port Multi-Layer Gigabit Ethernet Switch
- 5802 The BCM5802 Security Processor integrates Broadcoms IPSec engine (DES, 3DES, HMAC-SHA-1, HMAC-MD5), (BCM5802)
- 5805 The BCM5805 Security Processor integrates a high-performance IPSec engine (DES, 3DES, HMAC-SHA-1, HM (BCM5805)
- 5820 Crypto Accelerator (BCM5820)
- 5821 Crypto Accelerator (BCM5821)
- 5822 Crypto Accelerator (BCM5822)
- 5823 Crypto Accelerator (BCM5823)
- 5824 Crypto Accelerator (BCM5824)
- 5825 BCM5825 (BCM5825)
- 5840 Crypto Accelerator (BCM5840)
- 5841 Crypto Accelerator (BCM5841)
- 5850 Crypto Accelerator (BCM5850)
- 7321 network card integrated (BCM5751)
- 7411 High Definition Video/Audio Decoder (BCM7411)
-14E5 Pixelfusion Ltd
-14E6 Shining Technology Inc
-14E7 3CX
-14E8 Raycer Inc
-14E9 Garnets System Co Ltd
-14EA Planex Communications, Inc.
- AB06 10/100 Fast Ethernet CardBus (RTL8139) (FNW-3603-TX)
- AB07 RTL81xx RealTek Ethernet
- AB08 FNW-3602-TX CardBus Fast Ethernet
-14EB Seiko Epson Corporation
- 0020 PCI to S5U13xxxB00B Bridge Adapter (BEMx.x)
- 0C01 Embedded Memory Display Controller (S1D13808)
-14EC Acqiris
-14ED Datakinetics Ltd
-14EE Maspro Kenkoh Corp
-14EF Carry Computer Engineering Co Ltd
-14F0 Canon Reseach Centre France
-14F1 Conexant Systems, Inc.
- 0F00 ..........
- 1002 HCF 56k Modem
- 1003 HCF 56k Modem
- 1004 HCF 56k Modem
- 1005 HCF 56k Modem
- 1006 HCF 56k Modem
- 1022 HCF 56k Modem
- 1023 HCF 56k Modem
- 1024 HCF 56k Modem
- 1025 HCF 56k Modem
- 1026 HCF 56k Modem
- 1031 dfd
- 1032 HCF 56k Modem
- 1033 HCF 56K Winmodem
- 1034 HCF 56k DFVS Modem
- 1035 PCI Modem Enumerator
- 1036 unknown (Conexant RH56D/SP-PCI)
- 1052 HCF 56k Data/Fax Modem (Worldwide)
- 1053 HCF 56k Data/Fax Modem (Worldwide)
- 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)
- 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)
- 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
- 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
- 1058 HCF P96 Data/Fax/Voice/Spkp Modem
- 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)
- 1063 HCF 56k Data/Fax Modem
- 1064 HCF 56k Data/Fax/Voice Modem
- 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
- 1066 HCF 56k Data/Fax/Voice/Spkp Modem
- 1085 CX11250 SmartHSF Mobile Modem host side device
- 10B3 HCF Data/Fax
- 10B4 All Conextant HFC Modems (PCI) (Conextant HFC)
- 10B5 HCF Data/Fax/Voice/Spkp
- 10B6 Conexant HCF PCI Soft modem (unknown)
- 1433 HCF 56k Data/Fax Modem
- 1434 HCF 56k Data/Fax/Voice Modem
- 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
- 1436 HCF 56k Data/Fax Modem
- 1453 HCF 56k Data/Fax Modem
- 1454 HCF 56k Data/Fax/Voice Modem
- 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
- 1456 HCF 56k Data/Fax/Voice/Spkp Modem
- 14F1 Conextant High Definition Audio_Venice5051 (14F12F30)
- 1610 ADSL AccessRunner PCI Arbitration Device
- 1611 AccessRunner PCI ADSL Interface Device
- 1612 8
- 1620 ADSL AccessRunner V2 PCI Arbitration Device
- 1621 AccessRunner V2 PCI ADSL Interface Device
- 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter
- 1803 HCF 56k Modem
- 1815 HCF 56k Modem
- 1F10 HCF Data/Fax (USA)
- 1F11 HCF Data/Fax (Worldwide)
- 1F14 HCF Data/Fax/Voice (USA)
- 1F15 HCF Data/Fax/Voice (Worldwide)
- 2003 SoftK56 Winmodem
- 2004 SoftK56 RemoteTAM Winmodem
- 2005 SoftK56 Speakerphone Winmodem
- 2006 SoftK56 Speakerphone Winmodem
- 2013 SoftK56 Winmodem
- 2014 SoftK56 RemoteTAM Winmodem
- 2015 SoftK56 Speakerphone Winmodem
- 2016 SoftK56 Speakerphone Winmodem
- 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)
- 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)
- 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)
- 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)
- 2053 HSF Data/Fax
- 2054 HSF Data/Fax/TAM
- 2055 HSF Data/Fax/Voice/Spkp
- 2056 HSF Data/Fax/TAM/Spkp
- 2063 HSF 56k Data/Fax Modem (SmartDAA)
- 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)
- 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)
- 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)
- 2093 HSF 56k Modem
- 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)
- 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)
- 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)
- 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)
- 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)
- 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)
- 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)
- 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)
- 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)
- 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)
- 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)
- 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)
- 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)
- 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)
- 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
- 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
- 2400 unknown (unknown)
- 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
- 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
- 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
- 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
- 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)
- 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)
- 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)
- 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)
- 2702 HSFp or Soft V92 Data Fax Modem (cx11252-11)
- 2BFA HDA D100 MDC v.92 Modem (Unknown)
- 2C06 CXT - Network - HDAUDIO Soft Data Fax Modem with SmartCP
- 2F00 HSF 56k HSFi Churchill Data/Fax Modem
- 2F01 missing driver for pci simple communications controller (0x0780)
- 2F02 HSF 56k HSFi Churchill Data/Fax Modem
- 2F04 CX11252 Modem
- 2F05 CX11252 Modem
- 2F10 HSF Data/Fax (USA)
- 2F11 HSF 56K Data/Fax
- 2F12 HSF Data/Fax/Voice (USA)
- 2F13 HSF Data/Fax (USA)
- 2F14 US Robotics 56K PCI Software Modem
- 2F15 US Robotics 56K Fax Host Int
- 2F20 SoftV92 Data Fax Modem with SmartCP (CX11256)
- 2F30 PCI SoftV92 Modem (CX11252-41z)
- 2F40 Conexant Modem RD02-D490 (71030277)
- 2F50 unknown (205F14F1)
- 2F82 Conexant PCI-E Soft Data/Fax Modem with SmartCP (cx9510-11z)
- 5045 HDAUDIO Soft Data Fax Modem with SmartCP / Conexant High Definition Audio (SmartAudio HD2) (4.0.3.1)
- 5051 Audio (4.0.1.6)
- 5B7A Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder (Belived to be a CX23416)
- 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]
- 8237 CN8237 ATM OC2 ServiceSAR+ Controller with BR Traffic Management
- 8471 CN8471A 32 Channel HDLC Controller
- 8472 CN8472A 64 Channel HDLC Controller
- 8474 CN8474A 128 Channel HDLC Controller
- 8478 CN8478 256 Channel HDLC Controller
- 8502 CX28500 676 Channel HDLC Controller
- 8503 CX28500 1024 Channel HDLC Controller
- 8563 CX28560 2047 Channel HDLC Controller
- 8800 Conexant 23881 Video Capture (NTSC) (2003)
- 8801 CX2388x TV Capture Chip
- 8802 CX2388x TV Capture Chip
- 8803 CX2388x TV Capture Chip
- 8804 CX2388x TV Capture Chip
- 8811 CX2388x TV Capture Chip
- 8852 CX23881-21 (cx23885)
- 8880 PCI Express Video and Broadcast Audio Decoder (CX23888)
-14F2 Mobility Electronics, Inc.
- 0001 Moselle Split Bridge
- 0002 Capilano Split Bridge
- 0120 EV1000 PCI to PCI Bridge
- 0121 EV1000 Parallel port
- 0122 PCI Serial Port (unknown)
- 0123 EV1000 Keyboard Controller
- 0124 PCI PS/2 Mouse Port (3103)
-14F3 Broadlogic
- 2030 2030 DVB-S Satellite Reciever
- 2050 2050 DVB-T Terrestrial (Cable) Reciever
- 2060 2060 ATSC Terrestrial (Cable) Reciever
-14F4 Tokyo Electronic Industry Co Ltd
-14F5 Sopac Ltd
- 2F00 x (x)
-14F6 Coyote Technologies LLC
-14F7 Wolf Technology Inc
-14F8 Audiocodes Inc
- 2077 TP-240 dual span E1 VoIP PCI Card
-14F9 AG Communications
-14FA Wandel & Gochermann
-14FB Transas Marine (UK) Ltd
-14FC Quadrics Supercomputers World
- 0000 QsNet Elan3 Network Adapter
- 0001 QsNetII Elan4 Network Adapter
-14FD Japan Computer Industry Inc
- 0001 H260u printer server for HP Printer (H260u)
-14FE Archtek Telecom Corp
-14FF Twinhead International Corp
-1500 Lantech Computer Company
- 1300 SIS900 10/100M PCI Fast Ethernet Controller
- 1320 VT86C100A 10/100M PCI Fast Ethernet Controler
- 1360 RTL8139A 10/100 Mbps PCI Fast Ethernet Controller
- 1380 DEC21143PD 10/100M PCI Fast Ethernet Controller
-1501 Banksoft Canada Ltd
-1502 Mitsubishi Electric Logistics Support Co Ltd
-1503 Kawasaki LSI USA Inc
-1504 Kaiser Electronics
-1505 ITA Ingenieurburo Fur Testaufgaben GmbH
-1506 Chameleon Systems Inc
-1507 Htec Ltd.
- 0001 MPC105 [Eagle]
- 0002 MPC106 [Grackle]
- 0003 MPC8240 [Kahlua]
- 0100 MC145575 [HFC-PCI]
- 0431 KTI829c 100VG
- 4801 Raven
- 4802 Falcon
- 4803 Hawk
- 4806 CPX8216
-1508 Honda Connectors/Mhotronics Inc
-1509 First International Computer Inc
-150A Forvus Research Inc
-150B Yamashita Systems Corp
-150C Kyopal Co Ltd
-150D Warpspped Inc
-150E C-Port Corp
-150F Intec GmbH
-1510 Behavior Tech Computer Corp
-1511 Centillium Technology Corp
-1512 Rosun Technologies Inc
-1513 Raychem
-1514 TFL LAN Inc
-1515 Advent design
-1516 Myson Technology Inc
- 0800 10/100 Mbps Fast Ethernet Controller (MTD800)
- 0803 PCI Ethernet controller (Myson MTD803/TAMARACK TC6020)
- 0891 10/100/1000 Mbps Gigabit Ethernet Controller (MTD891)
-1517 Echotek Corp
-1518 PEP Modular Computers GmbH
-1519 Telefon Aktiebolaget LM Ericsson
- 2004 PCI Interface bus (0x1)
-151A Globetek Inc.
- 1002 4370 (PCI-1002 5A62)
- 1004 PCI-1004
- 1008 PCI-1008
-151B Combox Ltd
- 9080 combox cb 300a (me594v02100 combox)
-151C Digital Audio Labs Inc
- 0002 CardDeluxe Analog + Digital Audio
- 0003 Prodif T 2496
- 4000 Prodif 88
-151D Fujitsu Computer Products Of America
- 9876 ?
-151E Matrix Corp
-151F Topic Semiconductor Corp
- 0000 TP560 D/F/V 56k Modem
- 0001 TOPIC FM-56PCI-TP (TOPIC FM-56PCI-TP)
- 0568 56k Internal Data Fax Voice Modem (1.0.1.8)
-1520 Chaplet System Inc
-1521 Bell Corp
-1522 Mainpine Limited
- 0100 PCI Interface Chip (PBridge+)
-1523 Music Semiconductors
-1524 ENE Technology Inc
- 0510 PCI Memory Card Reader Controller (1.4.5.0)
- 0520 PCI SmartMedia / xD Card Reader Controller
- 0530 Memory Stick Card Reader (CB-712/714/810)
- 0550 Secure Digital Card Reader (CB-712/714/810)
- 0551 PCI SD/MMC Card Reader Controller
- 0610 PCI Smart Card Reader Controller
- 0730 PCI Memory Stick Card Reader Controller
- 0750 PCI SmartMedia / xD Card Reader Controller
- 0751 PCI Secure Digital / MMC Card Reader Controller
- 1211 CardBus Controller (CB-1211)
- 1225 CardBus Controller (CB-1225)
- 1410 CardBus Controller (CB-1420)
- 1411 Cardbus Controller (CB-710/2/4/810)
- 1412 CB-712/714 CardBus Controller
- 1420 CardBus Controller (CB-1420)
- 1421 CB-720/722/724 CardBus Controller
- 1422 CB-722/724 CardBus Controller
- FC10 pci device (card bus)
-1525 Impact Technologies
-1526 ISS Inc
-1527 Solectron
-1528 Acksys
-1529 American Microsystems Inc
-152A Quickturn Design Systems
-152B Flytech Technology Co Ltd
-152C Macraigor Systems LLC
-152D Quanta Computer Inc
-152E Melec Inc
- 2507 0 (0)
-152F Philips - Crypto
-1530 Acqis Technology Inc
-1531 Chryon Corp
-1532 Echelon Corp
- 0020 LonWorks PCLTA-20 PCI LonTalk Adapter
-1533 Baltimore
-1534 Road Corp
-1535 Evergreen Technologies Inc
-1536 ACTIS Computer
-1537 Datalex Communications
-1538 Aralion Inc.
- 0301 Ultima RAID-100/Multi RAID-100 Controller
- 0303 UltimaRAID-133 Controller
-1539 Atelier Informatiques et Electronique Etudes S.A.
-153A Ono Sokki
-153B Terratec Electronic GmbH
- 1115 IC Ensemble Inc ICE1712 Envy24 Multichannel Audio Controller (ICE1712 Envy24)
- 1143 Philips Semiconductors SAA7134HL Multimedia Capture Device (SAA7134HL)
- 6003 CrystalClear SoundFusion PCI Audio Accel (CS4614/22/24)
-153C Antal Electronic
-153D Filanet Corp
-153E Techwell Inc
-153F MIPS Technologies, Inc
- DEAD Not a chip ... (xx12345)
-1540 Provideo Multimedia Co Ltd
- 9524 PAL/SECAM TV card w/ FM1216ME MK3 tuner (+FM radio) (saa7134)
-1541 Machone Communications
-1542 Vivid Technology Inc
-1543 Silicon Laboratories
- 3052 Modem Intel 537EP (Chipset KAIOMY) (30201543)
- 3155 Modem Device on High Definition Audio Bus (Unknown)
-1544 DCM Technologies Ltd
-1545 Visiontek
-1546 IOI Technology Corp
-1547 Mitutoyo Corp
-1548 Jet Propulsion Laboratory
-1549 Interconnect Systems Solutions
- 80FF PCI/ISA Bus Bridge (PCI-ISA-001)
-154A Max Technologies Inc.
- 9016 USB DVB-T Device AF9015 (AF9015)
-154B Computex Co Ltd
-154C Visual Technology Inc
-154D Pan International Industrial Corp
-154E Servotest Ltd
-154F Stratabeam Technology
-1550 Open Network Co Ltd
-1551 Smart Electronic Development GmbH
-1552 Racal Airtech Ltd
-1553 Chicony Electronics Co Ltd
-1554 Prolink Microsystems Corp
-1555 Gesytec GmbH
- 0002 Easylon PCI Bus Interface (PLX PCI 9050)
-1556 PLD Applications
-1557 Mediastar Co Ltd
-1558 Clevo/Kapok Computer
- 1558 ?
-1559 SI Logic Ltd
-155A Innomedia Inc
-155B Protac International Corp
-155C Cemax-Icon Inc
-155D Mac System Co Ltd
-155E LP Elektronik GmbH
- 0020 Multi Function Card Version 3 (MFC3)
-155F Perle Systems Ltd
-1560 Terayon Communications Systems
-1561 Viewgraphics Inc
-1562 Symbol Technologies, Inc.
- 0001 LA-41x3 Spectrum24 802.11b Wireless LAN PCI Card
- 0002 Symbol Wireless Networker 802.11a/g CardBus (LA-5030)
- 0003 Symbol Wireless Networker 802.11a/g PCI (LA-5033)
-1563 A-Trend Technology Co Ltd
-1564 Yamakatsu Electronics Industry Co Ltd
-1565 Biostar Microtech Int'l Corp
-1566 Ardent Technologies Inc
-1567 Jungsoft
- 07D2 Disk Protection Card for Windows 2000
-1568 DDK Electronics Inc
-1569 Palit Microsystems Inc
-156A Avtec Systems Inc
- 5000 Wideband Advanced Signal Processor (NA)
- 5100 High Data Rate Radio (NA)
-156B 2wire Inc
-156C Vidac Electronics GmbH
- 0001 VMagic MPEG Encoder
-156D Alpha-Top Corp
-156E Alfa Inc
-156F M-Systems Flash Disk Pioneers Ltd
-1570 Lecroy Corp
-1571 Contemporary Controls
- A001 ARCNET backplane (CCSI PCI20)
- A002 ARCnet (CCSI PCI20-485D)
- A003 ARCnet (CCSI PCI20-485X)
- A004 ARCnet (CCSI PCI20-CXB)
- A005 ARCnet (CCSI PCI20-CXS)
- A006 ARCnet (CCSI PCI20-FOG-SMA)
- A007 ARCnet (CCSI PCI20-FOG-ST)
- A008 ARCnet (CCSI PCI20-TB5)
- A009 5 Mbit ARCnet (CCSI PCI20-5-485)
- A00A 5 Mbit ARCnet (CCSI PCI20-5-485D)
- A00B 5 Mbit ARCnet (CCSI PCI20-5-485X)
- A00C 5 Mbit ARCnet (CCSI PIC20-5-FOG-ST)
- A00D 5 Mbit ARCnet (CCSI PCI20-5-FOG-SMA)
- A00E ARCNET (COM200C22)
- A201 10 Mbit ARCnet (CCSI PCI22-485)
- A202 10 Mbit ARCnet (CCSI PCI22-485D)
- A203 10 Mbit ARCnet (CCSI PCI22-485X)
- A204 10 Mbit ARCnet (CCSI PCI22-CHB)
- A205 10 Mbit ARCnet (CCSI PCI22-FOG-ST)
- A206 10 Mbit ARCnet (CCSI PCI22-THB)
-1572 Otis Elevator Company
-1573 Lattice - Vantis
-1574 Fairchild Semiconductor
-1575 Voltaire Advanced Data Security Ltd
-1576 Viewcast COM
-1578 HITT
-1579 Dual Technology Corp
-157A Japan Elecronics Ind Inc
-157B Star Multimedia Corp
-157C Eurosoft (UK)
- 8001 PCI Y2K Compliance Card (Fix2000)
-157D Gemflex Networks
-157E Transition Networks
-157F PX Instruments Technology Ltd
-1580 Primex Aerospace Co
-1581 SEH Computertechnik GmbH
-1582 Cytec Corp
-1583 Inet Technologies Inc
-1584 Uniwill Computer Corp.
- 4003 ?
-1585 Logitron
-1586 Lancast Inc
- 0803 ?
-1587 Konica Corp
-1588 Solidum Systems Corp
- 1100 PAX.ware 1100 dual Gb classifier engine (PAX.port 1100)
- 2000 SNP 8023 packet classifier - AMD component (AMD '971)
- 8023 PAX.ware 100 packet classifier (SNP8023)
-1589 Atlantek Microsystems Pty Ltd
-158A Digalog Systems Inc
-158B Allied Data Technologies
- 0015 Standar HSP Modem Series (HLF-VMPEU560-C)
-158C Hitachi Semiconductor & Devices Sales Co Ltd
-158D Point Multimedia Systems
-158E Lara Technology Inc
-158F Ditect Coop
-1590 3pardata Inc
-1591 ARN
-1592 Syba Tech Ltd.
- 0780 Multi-IO Card
- 0781 Multi-IO Card (W83787IF)
- 0782 Parallel Port Card (EPP) (W837871F)
- 0783 Multi-IO Card (TC32001 PCI I/O)
- 0785 Multi-IO Card (907ab184740802)
- 0786 Multi-IO Card (Winbond w83787if)
- 0787 Multi-IO Card 2 series (winbond w83787if)
- 0788 Multi-IO Card (w837871f)
- 078A Multi-IO Card (007AB192367002ND)
-1593 Bops Inc
-1594 Netgame Ltd
-1595 Diva Systems Corp
-1596 Folsom Research Inc
-1597 Memec Design Services
-1598 Granite Microsystems
-1599 Delta Electronics Inc
-159A General Instrument
-159B Faraday Technology Corp
-159C Stratus Computer Systems
-159D Ningbo Harrison Electronics Co Ltd
-159E A-Max Technology Co Ltd
-159F Galea Network Security
-15A0 Compumaster SRL
-15A1 Geocast Network Systems
-15A2 Catalyst Enterprises Inc
- 0001 PCI Bus Analyzer/Exerciser (TA700)
-15A3 Italtel
-15A4 X-Net OY
-15A5 Toyota Macs Inc
-15A6 Sunlight Ultrasound Technologies Ltd
-15A7 SSE Telecom Inc
-15A8 Shanghai Communications Technologies Center
-15AA Moreton Bay
-15AB Bluesteel Networks Inc
-15AC North Atlantic Instruments
-15AD VMware Inc.
- 0405 NVIDIA (9500MGS)
- 0710 Virtual SVGA
- 0720 VMware PCI Ethernet Adapter (VMXNET)
- 0740 Virtual Machine Communication Interface
- 0770 Standard Enhanced PCI to USB Host Controller (n/a)
- 0801 Virtual Machine Interface
-15AE Amersham Pharmacia Biotech
-15B0 Zoltrix International Limited
- 0001 Pctel (FM-1789)
- 2BD0 soft56k voice,data,fax CARP (2BD0)
-15B1 Source Technology Inc
-15B2 Mosaid Technologies Inc
-15B3 Mellanox Technology
- 0191 MT25408 [ConnectX IB SDR Flash Recovery]
- 5274 InfiniBridge (MT21108)
- 5A44 MT23108 InfiniHost
- 5A45 MT23108 Infinihost HCA Flash Recovery
- 5A46 MT23108 PCI Bridge
- 5E8C MT24204 InfiniHost III Lx HCA
- 5E8D MT24204 InfiniHost III Lx HCA Flash Recovery
- 6274 MT25204 InfiniHost III Lx HCA
- 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
- 6279 MT25208 InfiniHost III Ex HCA Flash Recovery
- 6282 MT25218 [InfiniHost III Ex] (MT25218)
- 6340 MT25408 [ConnectX IB SDR]
- 634A MT25418 [ConnectX IB DDR, PCIe 2.0 2.5GT/s]
- 6354 MT25428 [ConnectX IB QDR]
- 6368 MT25448 [ConnectX EN 10GigE, PCIe 2.0 2.5GT/s]
- 6732 MT26418 [ConnectX IB DDR, PCIe 2.0 5GT/s]
- 673C MT26428 [ConnectX IB QDR, PCIe 2.0 5GT/s]
- 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
-15B4 CCI/TRIAD
-15B5 Cimetrics Inc
-15B6 Texas Memory Systems Inc
-15B7 Sandisk Corp
-15B8 ADDI-DATA GmbH
- 3009 Analog output board (xPCI-3504)
-15B9 Maestro Digital Communications
-15BA Impacct Technology Corp
-15BB Portwell Inc
-15BC Agilent Technologies
- 0100 ATTO Celerity FC-22XH Fibre Channel Adapter
- 0101 ATTO Celerity FC-22XH Fibre Channel Adapter
- 0103 4 Port Fibre Channel Controller (QX4)
- 0105 ATTO Celerity FC-42XS Fibre Channel Adapter
- 1100 E8001-66442 PCI Express CIC
- 1203 ATTO Celerity FC-42EN Fibre Channel Adapter
- 2530 HP Communications Port
- 2531 HP Toptools Remote Control Adapter
- 2532 HP Toptools Remote Control Adapter
- 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker
- 2928 64 Bit, 66MHz PCI Exerciser & Analyzer
- 2929 E2929A 64 Bit, 133MHz PCI-X Analyzer & Exerciser
-15BD DFI Inc
-15BE Sola Electronics
-15BF High Tech Computer Corp (HTC)
-15C0 BVM Ltd
-15C1 Quantel
-15C2 Newer Technology Inc
-15C3 Taiwan Mycomp Co Ltd
-15C4 EVSX Inc
-15C5 Procomp Informatics Ltd
-15C6 Technical University of Budapest
-15C7 Tateyama Dystem Laboratory Co Ltd
-15C8 Penta Media Co Ltd
-15C9 Serome Technology Inc
-15CA Bitboys OY
-15CB AG Electronics Ltd
-15CC Hotrail Inc
-15CD Dreamtech Co Ltd
-15CE Genrad Inc
-15CF Hilscher GmbH
-15D1 Infineon Technologies AG
- 0001 TC11IB TriCore 32-Bit Single-Chip MicroController
- 0002 PEB 20535 E v3.1 DSCC4 4 Channel Serial Communication Controller
- 0003 PEB 20544 E v1.1 SPOCC Six Port Optimized Communication Controller
- 0004 PEB 3454 E v1.1 TE3-SPICE Six Port Integrated Communication Controller w/- 4 DS3 Framers & 2 Fast Ethernet MACs
-15D2 First International Computer Inc (FIC)
-15D3 NDS Technologies Israel Ltd
-15D4 Iwill Corp
-15D5 Tatung Co
-15D6 Entridia Corp
-15D7 Rockwell-Collins Inc
- RS56 hcf 56 (hcf cx11252-41z)
-15D8 Cybernetics Technology Co Ltd
- 9001 ?
-15D9 Super Micro Computer Inc
-15DA Cyberfirm Inc
-15DB Applied Computing Systems Inc
-15DC Litronic Inc.
- 0001 PCI Cryptography Module (Argus 300)
-15DD Sigmatel Inc.
- 7664 idt high audio (vgn-ar71mr)
- 7680 SIGMATEL STAC 92XX C-Major HD Audio
- 7690 9200 HD Audio CODEC (10F70000)
- 8384 IDT High Definition Audio CODEC (*2UF1a)
- 9876 1
-15DE Malleable Technologies Inc
-15DF Infinilink Corp
-15E0 Cacheflow Inc
- 7134 01 (01385168)
-15E1 Voice Technologies Group Inc
-15E2 Quicknet Technologies Inc
- 0500 Internet PhoneJack PCI Card
-15E3 Networth Technologies Inc
-15E4 VSN Systemen BV
-15E5 Valley technologies Inc
-15E6 Agere Inc
-15E7 Get Engineering Corp
-15E8 National Datacomm Corp.
- 0130 Wireless NIC (NCP130)
- 0131 InstantWave HR PCI card (Prism II)
-15E9 Pacific Digital Corp.
- 1841 ATA controller (NetStaQ ADMA-100)
-15EA Tokyo Denshi Sekei K.K.
-15EB Drsearch GmbH
-15EC Beckhoff GmbH
-15ED Macrolink Inc
-15EE In Win Development Inc
-15EF Intelligent Paradigm Inc
-15F0 B-Tree Systems Inc
-15F1 Times N Systems Inc
- 2F30 Conexant HSFi (CX11252-15)
-15F2 Diagnostic Instruments Inc
- 0001 Spot RT Interface Board (Spot RT)
- 0002 Spot RT Interface Board (Spot RT *2)
- 0003 Spot Insight Interface Board (Spot Insight)
-15F3 Digitmedia Corp
-15F4 Valuesoft
-15F5 Power Micro Research
-15F6 Extreme Packet Device Inc
-15F7 Banctec
-15F8 Koga Electronics Co
-15F9 Zenith Electronics Corp
-15FA J.P. Axzam Corp
-15FB Zilog Inc
-15FC Techsan Electronics Co Ltd
-15FD N-CUBED.NET
-15FE Kinpo Electronics Inc
-15FF Fastpoint Technologies Inc
-1600 Northrop Grumman - Canada Ltd
-1601 Tenta Technology
-1602 Prosys-TEC Inc
-1603 Nokia Wireless Communications
-1604 Central System Research Co Ltd
-1605 Pairgain Technologies
-1606 Europop AG
-1607 Lava Semiconductor Manufacturing Inc
-1608 Automated Wagering International
-1609 Scimetric Instruments Inc
-160A Kollmorgen Servotronix
-160B Onkyo Corp
-160C Oregon Micro Systems Inc
-160D Aaeon Electronics Inc
-160E CML Emergency Services
-160F ITEC Co Ltd
-1610 Tottori Sanyo Electric Co Ltd
-1611 Bel Fuse Inc
-1612 Telesynergy Research Inc
-1613 System Craft Inc
-1614 Jace Tech Inc
-1615 Equus Computer Systems Inc
-1616 Iotech Inc
-1617 Rapidstream Inc
-1618 Esec SA
-1619 FarSite Communications Limited
- 0400 Two Port Intelligent Sync Comms Card (FarSync T2P)
- 0440 Four Port Intelligent Sync Comms Card (FarSync T4P)
- 0610 One Port Intelligent Sync Comms Card (FarSync T1U)
- 0620 Two Port Intelligent Sync Comms Card (FarSync T2U)
- 0640 Four Port Intelligent Sync Comms Card (FarSync T4U)
- 1610 One Port Intelligent Sync Comms Card (FarSync TE1)
- 1612 Channelized Intelligent Sync Comms Card (FarSync TE1C)
- 2610 G.SHDSL Intelligent Sync Comms Card (FarSync DSL-S1)
- 3640 Four Port Intelligent Sync Comms Card (FarSync T4E)
- 4620 Two Port Intelligent Sync Comms Card (FarSync T2Ue (PCI Express))
- 4640 Four Port Intelligent Sync Comms Card (FarSync T4Ue (PCI Express))
-161A Wvinten Ltd
-161B Mobilian Israel Ltd
-161C Berkshire Products
-161D Gatec
-161E Kyoei Sangyo Co Ltd
-161F Arima Computer Co
-1620 Sigmacom Co Ltd
-1621 Lynx Studio Technology Inc
- 0020 4 in/4 out Professional Digital Audio Card (LynxTWO-A)
- 0021 2 in/6 out Professional Digital Audio Card (LynxTWO-B)
- 0022 6 in/2 out Professional Digital Audio Card (LynxTWO-C)
- 0023 2 in/2 out Professional Digital Audio Card (Lynx L22)
- 0024 16 in/16 out AES/EBU Audio Card (Lynx AES16)
- 0025 16 in/16 out AES/EBU Audio Card w/SRC (Lynx AES16-SRC)
-1622 Nokia Home Communications
-1623 KRF Tech Ltd
-1624 CE Infosys GmBH
-1625 Warp Nine Engineering
-1626 TDK Semiconductor Corp
-1627 BCom Electronics Inc
-1629 Kongsberg Spacetec a.s.
- 1003 Format synchronizer v3.0
- 2002 Fast Universal Data Output
-162A Sejin Computerland Co Ltd
-162B Shanghai Bell Company Limited
-162C C&H Technologies Inc
-162D Reprosoft Co Ltd
- 0100 Repeographics Controller
- 0101 Reprographics Controller
- 0102 Reprographics Controller
- 0103 Reprographics Controller
-162E Margi Systems Inc
-162F Rohde & Schwarz GmBH & Co KG
- 1111 General Purpose Relay Card (TS-PRL1)
- 1112 TS-PMA Matrix Module
- 1113 TS-PSAM Source and Measurement Module
- 1114 TS-PBAS Basic Interface Module
- 1115 TS-PICT In-Circuit Test Module
- 1116 TS-PFG Function Generator Module
- 1117 TS-PAM Analyzer Module
- 1118 TS-PDFT Digital Functional Test Module
-1630 Sky Computers Inc
-1631 NEC Computer International
-1632 Verisys Inc
-1633 Adac Corporation
-1634 Visionglobal Network Corp
-1635 Decros
-1636 Jean Company Ltd
-1637 NSI
-1638 Eumitcom Technology Inc
- 1100 WL11000P (WL11000P)
-163A Air Prime Inc
-163B Glotrex Co Ltd
-163C Smart Link
- 3052 RS56/HSP-PCI (R6793-11)
- FF02 Intel Chipset (82945G)
-163D Heidelberg Digital LLC
-163E 3dpower
-163F Renishaw PLC
-1640 Intelliworxx Inc
-1641 MKNet Corporation
-1642 Bitland
-1643 Hajime Industries Ltd
-1644 Western Avionics Ltd
-1645 Quick-Serv. Computer Co Ltd
-1646 Nippon Systemware Co Ltd
-1647 Hertz Systemtechnik GmBH
-1648 MeltDown Systems LLC
-1649 Jupiter Systems
-164A Aiwa Co Ltd
-164C Department Of Defense
-164D Ishoni Networks
-164E Micrel Inc
-164F Datavoice (Pty) Ltd.
- 0001 PCI interface chip (PLX 9054)
- 0002 PCI interaface chip (PLX 9054)
-1650 Admore Technology Inc
-1651 Chaparral Network Storage
-1652 Spectrum Digital Inc
-1653 Nature Worldwide Technology Corp
-1654 Sonicwall Inc
-1655 Dazzle Multimedia Inc
-1656 Insyde Software Corp
-1657 Brocade Communications Systems
- 0646 Brocade 400 series PCIe HBA (BRE040)
-1658 Med Associates Inc.
- 0704 DIG 704 PCI - Interface with Millisecond Timer and Interrupts (905410B5)
-1659 Shiba Denshi Systems Inc
-165A Epix Inc.
- C100 PCI camera link video capture board (PIXCI CL1)
- D200 PCI digital video capture board (PIXCI D2X)
- D300 PCI digital video capture board (PIXCI D3X)
-165B Real-Time Digital Inc
-165C Kondo Kagaku
- 0002 FT232BL (FT232BL)
-165D Hsing Tech Enterprise Co Ltd
-165E Hyunju Computer Co Ltd
-165F Comartsystem Korea
- 2000 16 Channel Audio Capture Card (XILINX SPARTAN)
-1660 Network Security Technologies Inc
-1661 Worldspace Corp
-1662 Int Labs
-1663 Elmec Inc Ltd
-1664 Fastfame Technology Co Ltd
-1665 Edax Inc
-1666 Norpak Corporation
-1667 CoSystems Inc
-1668 Action Tec Electronics Inc
- 0100 PCI to PCI Bridge (0304)
-166A Komatsu Ltd
-166B Supernet Inc
-166C Shade Ltd
-166D Sibyte Inc.
- 0001 BCM1125/BCM1250 PCI Configuration Header
- 0002 MIPS BCM1125/BCM1250 processors (BCM1125/BCM1250 HyperTransport Configuration Heade)
-166E Schneider Automation Inc
-166F Televox Software Inc
-1670 Rearden Steel
-1671 Atan Technology Inc
-1672 Unitec Co Ltd
-1673 Connex
-1675 Square Wave Technology
-1676 Emachines Inc.
- 1001 Realtek AC' 97 Audio Driver (5.10.00.5760)
-1677 Bernecker + Rainer
- 104E B&R Dual CAN Interface Card 5LS172.6
- 12D7 B&R Dual CAN Interface Card 5LS172.61
- 20AD Profibus DP / K-Feldbus / COM (5ACPCI.MFIO-K01)
-1678 INH Semiconductor
-1679 Tokyo Electron Device Ltd
-167B ZyDAS Technology Corp
-167D Samsung Electro-Mechanics Co Ltd
-167E Onnto Corp
-167F iba AG
- 4634 FOB-IO Card
- 4C32 L2B PCI Board
- 5344 FOB-SD Card
- 5443 FOB-TDC Card
- F0B2 ibaFOB-2io-D (ibaFOB-2io-D)
- F0B4 ibaFOB-4io-D (ibaFOB-4io-D)
-1680 Dunti Corp
-1681 Hercules
- 0050 Hercules WiFi PCI 802.11G (HWGPCI-54)
-1682 PINE Technology, Ltd.
- 9875 ?
-1688 Castlenet Technology
-168A Utimaco Safeware AG
-168B Circut Assembly Corp (Ca)
-168C Atheros Communications Inc.
- 0007 802.11a Wireless Adapter (AR5007)
- 0011 802.11a Wireless Adapter (AR5bmb5)
- 0012 802.11a/b/g Mini-PCI Wireless Adapter (AR5211)
- 0013 802.11a/b/g Wireless Adapter (AR2312)
- 0014 Wireless Network Adapter
- 0015 Wireless Network Adapter
- 0016 Wireless Network Adapter
- 0017 Wireless Network Adapter
- 0018 Wireless Network Adapter
- 0019 Wireless Network Adapter
- 001A http://cr.am/framed.php?url=http%3A%2F%2Fwww.tp%2Dlink.com%2Fsupport%2Fdownload.asp&ref=driverguide (Atheros AR5005G)
- 001B AR5006 family 802.11abg Wireless NIC
- 001C AR5006 family 802.11abg Wireless NIC
- 001D PCIVEN_168C&DEV_001D&SUBSYS_2055168C&REV_013&267A616A&0&50 (TP-Link TL-WN350GD)
- 0020 AR5005VL 802.11bg Wireless NIC
- 0023 802.11a/b/g/n Wireless PCI Adapter (AR5416)
- 0024 Atheros 802.11a/b/g/n (pre-N) radio (AR5008)
- 002A Atheros AR5B91 Wireless Network Adapter (0001)
- 002B Atheros AR9285 Wireless LAN 802.11 a/b/g/n Controller (AR928x)
- 1014 Atheros AR5212 802.11abg wireless Drivers (AR5212)
- 14F1 PCIVEN_14f1&DEV_10b6&SUBSYS_10b614f&REV_89 (nForce6100-430 )
- FF19 AR5006X Wireless Network Adapter
- FF1C AR5008 Wireless Network Adapter
- FF1D AR5008 Wireless Network Adapter
- FF96 LAN-Express AS IEEE 802.11g miniPCI adapter (AR5212)
-168D NMI Electronics Ltd
-168E Hyundai Multicav Computer Co Ltd
-168F KDS Innotech Corp
-1690 Netcontinuum Inc
-1693 Ferma
- 0212 EPONINE ESR-PCI Board (PLX PCI9054)
- 0213 EPONINE MTM120 PCI Board (Motorola MPC8245)
-1695 Epox Computer Co Ltd
-1696 Hitachi Video and Information System Inc
-169A Otari Inc
-169B Decsys Corporation
-169C Netcell Corporation
- 0044 SyncRAID SR3000/5000 Series SATA RAID Controllers
-169D Link Evolution Corp
-16A5 Tekram Technology Co Ltd
-16A8 Shatai Systems Inc
-16AA Enseo
-16AB Global Sun Technology Inc
- 1100 GL24110P
- 1101 PLX9052 PCMCIA-to-PCI Wireless LAN
- 1102 PCMCIA-to-PCI Wireless Network Bridge
- 8501 WL-8305 Wireless LAN PCI Adapter
-16AE SafeNet Inc.
- 1141 ??? (SafeXcel-1141)
-16AF Nextcomm Inc
-16B0 Wincor Nixdorf International GmbH
-16B2 Design Of Systems On Silicon (DS2)
-16B3 CNF Mobile Solutions
-16B4 Aspex Technology Ltd
-16B8 Sonnet Technologies Inc
-16BD Aristos Logic Corporation
-16BE Creatix Polymedia GmbH
-16C3 Insilicon Corporation
-16C5 Puretek Industrial Co Ltd
-16C6 Micrel-Kendin
- 8695 KS8695 Centaur ARM processor
- 8841 KSZ8841 Single-port Ethernet MAC Controller
- 8842 KDZ8842 2-port Ethernet switch/MAC Controller
-16C7 Micrel - Kendin Operations
-16C8 OCTASIC Inc
-16C9 EONIC B.V. The Netherlands
-16CA Cenatek Inc.
- 0001 Solid State Disk (Rocket Drive)
-16CB Minolta Co Ltd
-16CC Inari
-16CD Densitron Computers Ltd
-16CE Roland Corp(??)
-16CF Roland Corp
-16D0 Systemax
-16D2 Axis Corporation
-16D5 Acromag Inc
- 0504 PMC-DX504 Reconfigurable FPGA with LVDS I/O
- 0520 PMC520 Serial Communication, 232 Octal
- 0521 PMC521 Serial Communication, 422/485 Octal
- 1020 PMC-AX1020 Reconfigurable FPGA with A/D & D/A
- 1065 PMC-AX1065 Reconfigurable FPGA with A/D & D/A
- 2004 PMC-DX2004 Reconfigurable FPGA with LVDS I/O
- 2020 PMC-AX2020 Reconfigurable FPGA with A/D & D/A
- 2065 PMC-AX2065 Reconfigurable FPGA with A/D & D/A
- 3020 PMC-AX3020 Reconfigurable FPGA with A/D & D/A
- 3065 PMC-AX3065 Reconfigurable FPGA with A/D & D/A
- 4243 PMC424, APC424, AcPC424 Digital I/O and Counter Timer Module
- 4248 PMC464, APC464, AcPC464 Digital I/O and Counter Timer Module
- 424B PMC-DX2002 Reconfigurable FPGA with Differential I/O
- 4253 PMC-DX503 Reconfigurable FPGA with TTL and Differential I/O
- 4312 PMC-CX1002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
- 4313 PMC-CX1003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
- 4322 PMC-CX2002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
- 4323 PMC-CX2003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
- 4350 PMC-DX501 Reconfigurable Digital I/O Module
- 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O
- 4357 PMC-DX502 Reconfigurable Differential I/O Module
- 4457 PMC730, APC730, AcPC730 Multifunction Module
- 464D PMC408 32-Channel Digital Input/Output Module
- 4A42 PMC483, APC483, AcPC483 Counter Timer Module
- 4A50 PMC484, APC484, AcPC484 Counter Timer Module
- 4A56 PMC230 16-Bit Analog Output Module
- 4B47 PMC330 16-Bit Analog Input Module
- 4C40 PMC-LX40 Reconfigurable Virtex-4 FPGA with plug-in I/O
- 4C60 PMC-LX60 Reconfigurable Virtex-4 FPGA with plug-in I/O
- 4D4D PMC341 Simultaneous Sampling Analog Input Module
- 4D4E PMC482, APC482, AcPC482 Counter Timer Board
- 524D PMC-DX2001 Reconfigurable FPGA with TTL I/O
- 5335 PMC-SX35 Reconfigurable Virtex-4 FPGA with plug-in I/O
-16D8 Omnicluster Technologies
-16DA Marek Micro GmBH
-16DE Digital Stream Technology Inc
-16DF Pika Technology Inc
-16E0 Third Millenium Test Solutions
-16E2 Geotest-Marvin Test Systems Inc
-16E3 European Space agency
-16E5 Intellon Corp
- 6000 INT6000 Ethernet-to-Powerline Bridge [HomePlug AV]
- 6300 INT6300 Ethernet-to-Powerline Bridge [HomePlug AV]
-16E7 Keisoku Giken Co Ltd
-16E9 Silicon Sccess Networks
-16EB Inside Telnetcom Co Ltd
-16EC U.S. Robotics
- 00FF USR997900 10/100 Mbps PCI Network Card
- 0116 Realtek RTL8169/8110 Family PCI Gigabit Ethernet NIC (??)
- 1007 U.S. Robotics 56K Win INT (0637)
- 2013 U.S. Robotics 56K Voice Host Int (11323A)
- 2F00 http://www.usr.com/support/product-template.asp?prod=5660a (USRobotics 5660A - Internal Soft Modem)
- 2F12 U.S.Robotic (A- Modem/PCI) (E129336-1)
- 3685 Wireless Access Adapter Model 022415
- 5685 U.S. Robotics 56K Voice Host Int (A-Modem/ PCI) (E129336-1)
-16ED Sycron N.V.
- 1001 UMIO communication Card
-16EE Canberra Industries Inc
-16EF Amigo Technology
-16F0 TLA Inc
-16F1 Adicti Corp
-16F2 Bosch Rexroth AG
-16F3 Jetway Information Co Ltd
-16F4 VWEB Corp
- 8000 VW2010
-16F6 VideoTele.com Inc
-16F7 Advanced Rendering Technology Ltd
-16FC Ciena Corp
-16FE Fujitsu LSI Solution Ltd
-1700 Antara LLC
-1701 Interactive computer Products Inc
-1702 Internet Machines Corp (IMC)
-1703 Desana Systems
-1704 Clearwater Networks
-1705 Digital First
-1706 Pacific Broadband Communications
-1707 Cogency Semiconductor Inc
-1708 Harris MCD
-1709 Zarlink Semiconductor (Was: Mitel Semiconductor)
-170A Alpine Electronics Inc
-170B NetOctave Inc.
- 0100 Crypto Aceletator (NSP2000-SSL)
-170C YottaYotta Inc
-170D SensoMotoric Instruments GmbH
-170E SanValley Systems Inc
-170F Cyberdyne Inc
-1710 Pelago Networks
- 9835 2 serial, 1 LPT port PCI Card
-1711 Netscreen Technologies Inc
-1712 Nice Systems
-1713 Topcon Corp
-1714 Science Park Corp
-1715 The Imaging Source Europe GMbH
-1716 Aldec Inc
-1717 Runtop Inc
-1718 Pixela corp
-1719 EZChip Technologies
-171A Fantasma Networks Inc
-171B Andor System Support Co Ltd
-171C Merilus Inc
-171D TEAC Corp
-171E Realchip Inc
-171F Pijnenburg
-1720 Top Layer Networks Inc
-1721 Glonet Systems INC
-1722 Trimedia Technologies Inc
-1725 Vitesse Semiconductor
- 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller
-1726 Avaya
-1729 Danam Communications Inc
-172A Accelerated Encryption
- 13C8 AEP SureWare Runner 1000V3
-172C Ampere Inc
-172E Digianswer A/S
-172F Sparkle Computer Co Ltd
-1730 Brainvision Inc
-1734 Fujitsu-Siemens Computers GmbH
- 007A ATI Rage XL (rev 27) (Rage XL)
- 1011 Adaptec AIC-7902 Dual Channel U320 SCSI (AIC-7902W)
- 1012 Serverworks Southbridge with RAID/IDE (rev a0), OHCI USB (rev 05), GCLE-2 Host Bridge (CSB6)
- 1013 Broadcom Corp. NetXtreme Gigabyte Ethernet (BCM5703)
- 1078 Amilo Pro v2010
- 1085 Celsius M450
- 1098 Amilo L 1310G
- 10B9 SAS 3000 series, 8-port with 1068 -StorPort (0x00541000)
-1735 ATEN International Co Ltd
-1737 Linksys
- 0013 WMP54G Wireless Pci Card
- 0015 WMP54GS Wireless Pci Card
- 0029 WPG54G ver. 4 PCI Card
- 0071 Dual Band Wireless N USB Network Adapter (RT2870)
- 1032 Linksys Instant Gigabit Desktop Network Interface (EG1032 v3)
- 1064 Gigabit Network Adapter
- AB08 21x4x DEC-Tulip compatible 10/100 Ethernet
- AB09 PCM200 10/100 CardBus Ethernet Adapter
-1738 Harris Corp
-1739 Interface Concept
-173B Broadcom (Was: Altima Communications Inc)
- 03E8 Gigabit Ethernet Adapter (AC1000)
- 03E9 AC1001 Gigabit Ethernet
- 03EA Gigabit Ethernet Adapter (AC1002)
- 03EB AC1003 Gigabit Ethernet
-1740 Ulyssix Technologies Inc
-1743 Peppercon AG
- 8139 Fast Ethernet Adapter with ROL (ROL/F-100)
-1745 VIXS
- 2020 PureTV
- 2100 PureTV
-1746 Corrent Corp
-1747 Test Research Inc
-1749 RLX Technologies Inc
-174A Spirent Communications
-174B PC Partner Limited
- 0260 Saphire Radeon 9250 (RV280)
- 0261 Sapphire Radeon 9250 - Secondary (RV280)
- 7176 RADEON 9000 ATLANTIS PRO (RV250)
- 7177 RADEON 9000 ATLANTIS PRO - Secondary (RV280)
- 7C12 RADEON 9200 ATLANTIS - Secondary (RV280)
- 7C13 RADEON 9200 ATLANTIS (RV280)
- 9501 ATI Radeon HD 3870 (RV670 )
- E131 ATI 4870 (RV770)
-174C Intelitek
-174D WellX Telecom
-174E Xi'an Tongshi Data Co Ltd
-174F TAIKO Electric Works Ltd
-1751 Pixelworks Inc
-1752 Global Brands Manufacture Ltd
-1753 TeraRecon, Inc.
- 1001 VolumePro 500 (VP500)
- 1004 VolumePro 1000 (VP1000)
-1754 Antares Microsystems Inc
-1755 Alchemy Semiconductor Inc.
- 0000 Au1500 Processor (Au1500)
-1757 Laservall S.P.A.
-1758 National Hybrid Inc
-1759 Trinamic Microchips
-175C AudioScience Inc
-175D CTC Parker Automation
-175E Ascension Technology Corp
-175F Asita Technologies Inc
-1760 Tedia Spol. Sr.o
-1761 Pickering Interfaces Ltd
-1762 JR3 Inc
-1763 Cmicro Corporation
-1764 Micro Vision Co Ltd
-1765 Future Systems Inc
-1766 Eurotech Spa
-1767 Well Communication Corp
-1768 Malachite Technologies Inc
-176A General Dynamics Canada
-176E Kaba Mas Corporation
-176F SAYA Limited
-1771 InnoVision Multimedia Ltd
-1772 Siber Core Technologies Inc
-1773 Soma Networks Inc
-1775 SBS Technologies Inc
-1778 For-A Company Limited
-1779 V One Multimedia PTE Ltd
-177B Racal Instruments Inc
-177C Tanbac Co Ltd
-177D Cavium Networks
- 0001 Nitrox XL
-177E Jeol USA Inc
-177F Precision Instruments Inc
-1780 Unixtar Technology Inc
-1782 Lightsand Communications Inc
-1783 Trebia Networks
-1784 Lockheed Martin Systems Integration
-1787 Hightech Information System Ltd (Medion??)
-1789 Ennyah Technologies Corp
-178A Sandcraft Inc
-178D DesignTech Co Ltd
-178E Envara
-1790 Zuken Inc
-1791 Dotcast Inc
-1792 Artiza Networks Inc
-1793 Unitech Electronics Co Ltd
-1795 OKB SAPR Ltd
- 0003 Accord 5MX
- 0005 Accord-TINY
- 0006 Accord 5MX miniPCI
- 0010 Accord 5.5 PCI
- 0020 Accord 5.5 PCIe
-1796 Forschungszentrum (Research Centre) Julich
- 0001 SIS1100 [Gigabit link]
- 0002 HOTlink
- 0003 Counter Timer
- 0004 CAMAC Controller
- 0005 PROFIBUS
- 0006 AMCC HOTlink
- 000D Synchronisation Slave
-1797 JumpTec h, GMBH
-1798 iReady Corp
-1799 Belkin Research and Development Labs
- 6001 Wireless PCI Card - F5D6001
- 6020 Wireless PCMCIA Card - F5D6020
- 6060 Wireless PDA Card - F5D6060
- 7000 Wireless PCI Card - F5D7000
- 700A Wireless PCI Card - F5D7000UK
- 7010 BCM4306 802.11b/g Wireless Lan Controller - F5D7010
-179B Ratio Entwicklungen GmbH
-179C Indus TeQ Site Pvt Ltd
- 0557 DP-PCI-557 [PCI 1553B]
- 0566 DP-PCI-566 [Intelligent PCI 1553B]
- 5031 DP-CPCI-5031-Synchro Module
- 5121 DP-CPCI-5121-IP Carrier
- 5211 DP-CPCI-5211-IP Carrier
- 5679 AGE Display Module
-179D SES Japn Co Ltd
-179E IntelliBus Network Systems
-17A0 Genesys Logic, Inc
- 8033 GL880S USB 1.1 Controller
- 8034 GL880S USB 2.0 Controller
-17A1 Macro Image Technology Inc
-17A3 Dongguan Chang'an Global Smart Electronic Factory
-17A4 Resonext Communications Inc
-17A5 Quest Tech Consulting Inc
-17A6 Primarion
-17A7 Start Network Technology Co Ltd
-17A8 Gtech
-17A9 Arunta Comsec Pty Ltd
-17AA Legend Ltd
-17AB Phillips Components
-17AD Genesys Logic Inc
-17AE NEC Corp
-17AF Hightech Information Systems, Ltd.
- 4150 HIS Excalibur Radeon 9600 (200)
-17B0 Sphinx Elektronik GmbH
-17B1 Astec Inc
-17B2 Aeroflex Test Solutions
-17B3 Hawking Technologies Inc
- AB08 PN672TX 10/100 Ethernet
-17B4 Indra Networks Inc
- 0011 WebEnhance 100 GZIP Compression Card
-17B5 Emerge Core Networks LLC
-17B6 GE Medical Systems
-17B7 CAE
-17B9 Sapura Devices
-17BA Sandburst Corporation
-17BB ArTile Microsystems Inc
-17BC Infiniswitch Corporation
-17BD Merging Technologies
-17BE Systemonic AG
-17BF Max Diligent Technology Inc
-17C0 Wistron Corporation
- 12AB ?
-17C1 Nital Consulting Services Inc
-17C2 Newisys Inc
-17C3 Protogate Inc
-17C4 Movita Tehnologies Inc
-17C5 Digital Safety Technologies Inc
-17C6 American Computers & Digital Components Inc
-17C7 Bystronic Laser AG
-17C8 Hexium Ltd
-17C9 OPCiel Networks Inc
-17CA Uniwide Technologies
-17CB Woodside Networks Inc
- 0001 AGN100 802.11 a/b/g True MIMO Wireless Card
- 0002 AGN300 802.11 a/b/g True MIMO Wireless Card
-17CC NetChip Technology Inc
- 2280 USB 2.0 Device Controller (Net 2280)
-17CD Tality Corporation
-17CF Z-Com Inc
-17D0 Fodus Communications Inc
-17D1 Patton Electronics
-17D2 Red River
-17D3 Areca Technology Corporation
- 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller
- 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller
- 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller
- 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller
- 1210 ARC-1210 4-Port PCIe to SATA RAID Controller
- 1220 ARC-1220 8-Port PCIe to SATA RAID Controller
- 1230 ARC-1230 12-Port PCIe to SATA RAID Controller
- 1260 ARC-1260 16-Port PCIe to SATA RAID Controller
-17D4 Darim Vision Company
-17D5 S2IO Technologies
- 5831 Xframe 10 Gigabit Ethernet PCI-X
- 5832 Xframe II 10GbE PCI-X 2.0 Adapter (X2)
- 5833 E3100 PCI-Express 10Gb Ethernet Interface (X3)
-17D6 Virtual Silicon Technology Inc
-17D7 SITA
-17D8 Wing-Span Enterprise Co Ltd
-17D9 Leader Electronics Corp
-17DA 0-In Design Automation Inc
-17DB Cray Inc
-17DC Visiowave S.A.
-17DD ICOM Inc
-17DE Kworld Computer Co Ltd
-17DF Dini Group LaJalla Inc
-17E0 Integrated Circuit Solution Incorporation
-17E1 ETI A/S
-17E2 DoTop Technology Inc
-17E3 Opteon Corporation
-17E4 Sectra AB
- 0001 KK671 Cardbus encryption board
- 0002 KK672 Cardbus encryption board
-17E5 Paceline Systems
-17E6 Entropic Communications Inc
- 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface)
- 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface)
- 0021 EN2210 [c.Link] MoCA Network Controller (Coax)
-17E7 Mitsubishi Electric Engineering Company Limited
-17E8 Chrontel Inc
-17E9 DH Electronics GmbH
-17EA iStor Networks Inc
-17EB Aplux Communications Ltd
-17EC Chip Engines Inc
-17ED Arbor Technology Corp
-17EE Connect Components, Ltd.
- 4153 Radeon 9550 (RV350)
-17EF Sonexis
-17F0 Velio Communications Inc
-17F1 Interactive Silicon Inc
-17F2 Albatron Corp
-17F3 RDC Semiconductor Co., Ltd.
- 1010 IDE Controller (D1010)
- 1011 Standard IDE Controller (D1011)
- 1030 PCI to PCI-E Bridge (M1030)
- 2010 GPU (VGA ) (M2010)
- 3010 HD Audio (M3010)
- 6020 R6020 North Bridge
- 6021 Host Bridge
- 6030 R6030 ISA Bridge
- 6036 PCI to ISA Bridge
- 6040 R6040 MAC Controller
- 6060 R6060 USB 1.1 Controller
- 6061 USB 2.0 Controller (EHCI)
-17F4 MicroPlex Printware AG
-17F5 Cymer Inc
-17F6 Leopard Logic Inc
-17F7 Topdek Semiconductor Inc
-17F8 Bermai Inc
-17F9 GemTek Technology Co Ltd
-17FA E-MOVE Technology Co Ltd
-17FB Wavecrest Corp
-17FC Iogear Inc
-17FD Netexcell
-17FE Linksys (Was: InProComm Inc)
- 2120 WMP11v4 802.11b PCI Card
- 2220 INPROCOMM IPN 2220 Wireless LAN Adapter
-17FF Benq Corp
-1800 Virtual IP group Inc
-1801 Pro-Nets Technology Corp
-1802 Sinus Messtechnik GmbH
-1803 ProdaSafe GmbH
-1804 Enterasys Networks
-1805 Euresys S.A.
-1806 Nexio Systems Inc
-1807 Comit Systems Inc
-1808 Pigeon Point System
-1809 Emuzed Inc
-180A Brecis Communications
-180B Formoza-Altair
-180C ICP Electronics Inc
-180D Prolific Technology Inc
-180E HCL Technologies Ltd
-1810 HCL Technologies Ltd
-1811 Wipro Technologies
-1812 LANergy
-1813 Ambient Technologies Inc
- 3059 AC97 Enhanced Audio Controller - the 8251 controller is different (VT8237)
- 4000 intel V.92 HaM Modem (MD5628D-L-A)
- 4100 Intel HaM V.92 Modem (Ambient MD8820)
-1814 Ralink Technology, Corp.
- 0001 ...I don't know (...B742000)
- 0101 RT2460 802.11b Baseband/MAC integrated chip (2460 802.11b)
- 0200 RT2500 802.11g PCI
- 0201 Ralink Chipset 802.11b/g WLAN Card ( RT2560F)
- 0300 Wireless Adapter Canyon CN-WF511
- 0301 Edimax 54 MBit WLan 802.11g rt 2500 (b8341462)
- 0302 wireless a/b (RT2525 2.4GHz transceiver + RT2560 MAC/BBP)
- 0401 Ralink MIMO RT 2661 Wireless 54 Mbps (RT 2661)
- 0601 b/g/n Wlan (RT2860T)
- 0781 Wireless (RT2860/RT2890)
- 9876 Edimax 54 MBit WLan 802.11g rt 2500 (b8341462)
- E932 RT2560F 802.11 b/g PCI
-1815 Devolo AG
-1816 Pro Team Computer Corporation
-1817 JAE
-1818 SMAR Equipamentos Industriais Ltd
-1819 Rosta Ltd
-181A NurLogic Design Inc
-181B Comax Technology Inc
-181C Yamatake Corporation
-181D eInfochips
-181E TiARIS
-181F Tachys Technologies
-1820 InfiniCom System
-1821 RedSwitch Inc
-1822 TwinHan Technology Co Ltd (AKA: VisionPlus)
- 0001 VisionPlus DVB
- 4E35 Mantis DTV PCI Bridge Controller [Ver 1.0]
-1823 FulCrum Microsystems
-1824 2C Computing Inc
-1825 Computer Access Technology Corporation
-1826 Cradle Technologies Inc
-1827 Denali Software Inc
-1828 Xsido Corporation
-1829 Verisity Design Inc
-182A Ampro Computers Inc
-182B Commetrex Corporation
-182C SYNAD Technology Ltd
-182D SiteCom Europe BV
- 3069 ISDN PCI DC-105V2
- 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]
-182E Raza Foundries Inc
- 0008 XLR516 Processor
-182F Broadcom
- 000B BCM5785 [HT1000] SATA (RAID Mode)
-1830 Credence
-1831 Glimmergalss Networks
-1832 Acquisition Logic Inc
-1833 Cognitronics Corporation
-1834 Delphi Connection Systems
-1835 SimpleTech Inc
-1836 IPFlex Inc
-1837 Sierra Logic Inc
-1838 Precision Photonics Corp
-1839 Genesis Microchip Inc
-183A Transwarp Networks Inc
-183B Mikrom GmbH
- 08A7 MVC100 DVI
- 08A8 MVC101 SDI
- 08A9 MVC102 DVI+Audio
- 08B0 MVC200-DC
-183C GCT Semicondustor Inc
-183D SI Packets
-183E Telewise Communications Inc
-183F Computer Ultrasound Global Inc
-1840 vpr Matrix Inc
-1841 Lamprey Networks Inc
-1842 Camtel Technology Corp
-1843 Firstech Technology Co Ltd
-1844 Controlnet Inc
-1845 Siliquent Technologies Ltd
-1846 Lucent Technologies NS UK
-1847 Engim Inc
-1848 Microcom C.E. as
-1849 ASRock Inc
-184A Thales Computers
-184B Systec Corporation
-184C Hirose Electric Co Ltd
-184D ICTV Inc
-184E Netlogic Microsystems Inc
-184F Ionwerks Inc
-1850 Advantest Corp
-1851 Microtune Inc
-1852 Anritsu Corp
-1853 Oasis Silicon Systems AG
-1854 LG Electronics
-1855 Cascade Semiconductor Solutions Inc
-1856 Silicon Logic Engineering Inc
-185B Compro Technology Inc
-185F Wistron NeWeb Corp
-1860 Primagraphics Ltd
-1864 SilverBack
- 2110 ISNAP 2110
-1866 Supergrace
-1867 Topspin Communications
- 5A44 MT23108 PCI-X HCA
- 5A45 MT23108 PCI-X HCA flash recovery
- 5A46 MT23108 PCI-X HCA bridge
- 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
- 6282 MT25208 InfiniHost III Ex
-186C Humusoft s.r.o.
- 0612 AD612 Data Acquisition Device
- 0614 MF614 Multifunction I/O Card
- 0622 AD622 Data Acquisition Device
- 0624 MF624 Multifunction I/O Card
- 0625 MF625 3-phase Motor Driver
-1876 L-3 Communications
- A101 VigraWATCH PCI
- A102 VigraWATCH PMC
- A103 Vigra I/O
-187E ZyXEL Communication Corporation
- 3403 ZyAir G-110 802.11g
- 340E M-302 802.11g XtremeMIMO
-1885 Avvida Systems Inc
-1887 Elan Digital Systems Ltd
-1888 Varisys Limited
- 0301 VMFX1 FPGA PMC module
- 0601 VSM2 dual PMC carrier
- 0710 VS14x series PowerPC PCI board
- 0720 VS24x series PowerPC PCI board
- 2503 Video Capture (10 bit High qualtiy cap) (Bt881)
- 2504 Video Capture (Bt878)
- 3503 VGA Geforce4 MX440 (nVidia NV28)
- 3505 VGA Geforce4 Ti4200 (nVidia NV28)
-188A Ample Communications Inc
-1890 Egenera Inc
-1894 KNC One
-1896 B&B Electronics Manufacturing Company Inc
-1898 DIC Information Technology Ltd
- 2001 DVB Receiver Card
-18A1 Astute Networks Inc
-18AC DViCO Corp
- D500 FusionHDTV 5
- D800 FusionHDTV 3 Gold
- D810 FusionHDTV 3
- D820 FusionHDTV 3 Gold-T
- DB30 FusionHDTV DVB-T Pro
-18B8 Ammasso
- B001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor
-18BC Ge-Cube
-18C3 Micronas Semiconductor Holding AG
-18C8 Cray Inc (Was: Octigabay System)
-18C9 ARVOO Engineering BV
- 1011 Video processor (Leonardo CL)
- 1012 Video processor (Leonardo CL-P)
- 1013 Video processor (Leonardo CL-DB)
- 1014 Video processor (Leonardo CL-P-DB)
- 1015 Video processor (Leonardo CL-DVR)
- 1016 Video processor (Leonardo CL-DVR-DB)
- 2011 Framegrabber (Picasso 2SQ)
- 2012 Framegrabber (Picasso 3C/3Cpro)
- 2013 Framegrabber (Picasso LS)
- 2014 Framegrabber (Picasso CL)
- 2015 Framegrabber (Picasso FI)
- 2016 Framegrabber (Picasso SDI)
- 2017 Framegrabber (Picasso DUO)
- 2021 Framegrabber (Colory)
- 3011 Video Output Board (Valentino)
-18CA XGI Technology Inc
- 0020 XGI Compatible Super VGA (Volari Z9s) controller (Volari Z9s)
- 0040 Volari Family (8085)
- 0047 Volari 8300 (chip: XP10, codename: XG47)
-18D0 Kobian Pte Ltd
-18D2 Sitecom
- 3069 DC-105v2 ISDN controller
-18D4 Celestica
-18DD Artimi Inc
- 4C6F Artimi RTMI-100 UWB adapter
-18E6 MPL AG
- 0001 OSCI [Octal Serial Communication Interface]
-18EC Cesnet z.s.p.o.
- C006 COMBO6
- C045 COMBO6E
- C050 COMBO-PTM
- C058 COMBO6X
-18F1 Spectrum Systementwicklung Microelectronic GmbH
-18F4 Napatech A/S
-18F6 NextIO
- 1000 [Nexsis] Switch Virtual P2P PCIe Bridge
- 1050 [Nexsis] Switch Virtual P2P PCI Bridge
- 2000 [Nexsis] Switch Integrated Mgmt. Endpoint
-18F7 Commtech, Inc.
- 0001 Fastcom:ESCC-PCI-335 Syncronous RS422/485 serial communication adapter (ESCC-PCI-335)
- 0002 Fastcom:422/4-PCI-335 Asyncronous RS422/485 serial adapter (422/4-PCI-335)
- 0004 Fastcom:422/2-PCI-335 Asyncronous RS422/485 serial adapter (422/2-PCI-335)
- 0005 Fastcom IGESCC-PCI-ISO/1
- 000A Fastcom:232/4-PCI-335 Asyncronous RS232 serial adapter (232/4-PCI-335)
- 000F Fastcom FSCC
- 0010 Fastcom GSCC
- 0011 Fastcom QSSB
- 0014 SuperFSCC
-18FB Resilience Corp
-1904 Hangzhou Silan Microelectronics Co Ltd
- 8139 RTL8139D (Realtek) PCI 10/100BaseTX ethernet adaptor
-1905 WIS Technology Inc
-1910 Seaway Networks
- 0001 Seaway Network Content Accelerator (SW5000-NCA)
-1923 Sangoma Technologies Corp
- 0040 A200/Remora FXO/FXS Analog AFT card
- 0100 A104d QUAD T1/E1 AFT card
- 0300 A101 single-port T1/E1
- 0400 A104u Quad T1/E1 AFT
-1924 Level 5 Networks Inc
-192E TransDimension
- 0104 PCI Development Card
-1931 Option N.V.
- 000C Qualcomm MSM6275 UMTS chip
-1942 ClearSpeed Technology plc
- E511 CSX600 Advance Accelerator Board
-194A DapTechnology B.V.
- 1111 FireSpy3850
- 1112 FireSpy450b
- 1113 FireSpy450bT
- 1114 FireSpy850
- 1115 FireSpy850bT
-1954 Curtis Inc
-1957 Freescale Semiconductor Inc
- 0012 MPC8548 [PowerQUICC III]
- 0013 MPC8548
- 0014 MPC8543E
- 0015 MPC8543
- 0018 MPC8547E
- 0019 MPC8545E
- 001A MPC8545
- 0020 MPC8568E
- 0021 MPC8568
- 0022 MPC8567E
- 0023 MPC8567
- 0030 MPC8533E
- 0031 MPC8533
- 0032 MPC8544E
- 0033 MPC8544
- 0080 MPC8349E
- 0081 MPC8349
- 0082 MPC8347E TBGA
- 0083 MPC8347 TBGA
- 0084 MPC8347E PBGA
- 0085 MPC8347 PBGA
- 0086 MPC8343E
- 0087 MPC8343
- 7010 MPC8641 PCI Host Bridge
- 7011 MPC8641D PCI Host Bridge
-1958 Faster Technology LLC
-1959 PA Semi Inc
-1966 Orad Hi-Tec Systems
- 1975 DVG64 family
-1969 Attansic (Now owned by Atheros)
- 1026 PCI-E ETHERNET CONTROLLER (AR8121/AR8113 )
- 1048 Gigabit Ethernet 10/100/1000 Base-T Controller (Atheros L1)
- 1062 Atheros AR8132 PCI-E Fast Ethernet Controller (AR8132)
- 1063 Atheros AR8131 PCI-E Gigabit Ethernet Controller (AR8131)
- 2048 Fast Ethernet 10/100 Base-T Controller (Atheros L2)
-196A Sensory Networks Inc
- 0101 NodalCore C-1000 Content Classification Accelerator
- 0102 NodalCore C-2000 Content Classification Accelerator
- 0105 NodalCore C-3000 Content Classification Accelerator
-196D Club-3D BV
-1971 AGEIA Technologies, Inc.
- 0001 AGEIA PhysX 100 Series PCI Express Card (PCIVEN_1971&DEV_0000&SUBSYS_00021028&REV_004&2)
- 1011 AGEIA PhysX 100 Series PCI Card (PCIVEN_1971&DEV_1011&CC_FF00)
- 1021 AGEIA PhysX 200 Series PCI Express Card
- 1975 DVG64 family
-197B JMicron Technology Corp.
- 0250 JMC250 PCI Express Gigabit Ethernet (JMC2XX)
- 0256 JMC260 PCI Express Fast Ethernet (JMC2XX)
- 0260 JMC260 PCI Express Fast Ethernet (JMC2XX)
- 197B JMB38X SD/MMC Host Controller (JMB38X)
- 2360 JMicron 20360/20363 AHCI Controller
- 2361 PCI Express to SATA II and PATA Host Controller (JMB363)
- 2363 JMicron JMB362/JMB363 AHCI Controller (JMB36X)
- 2365 JMB365 AHCI/IDE
- 2366 JMicron JMB366 AHCI/IDE Controller (JMB36X)
- 2368 IDE Comtroller (JMB368)
- 2380 IEEE 1394 Host Controller (JMB38X)
- 2382 JMB38X SD/MMC Host Controller (JMB38X)
- 2383 JMB38X MS Host Controller (JMB38X)
- 2384 JMB38X xD Host Controller (JMB38X)
-1982 Distant Early Warning Communications Inc
- 1600 OX16C954 HOST-A
- 16FF OX16C954 HOST-B
-1989 Montilio Inc
- 0001 RapidFile Bridge
- 8001 RapidFile Bridge
-198A Nallatech
- 0210 XMC-210
- 0220 XMC-220
- 0230 XMC-230
- 0240 XMC-240
- 1180 PCIe-180 ( pm 965)
- 1280 PCIe-280
- 402F BenNUEY PCIX
- 4030 H100-PCIX
- 4031 BenNUEY PCI-104-V4
- 4032 BenONE-PCIe
- 4033 BenONE-Xilinx-Kit-ROHS
- 4034 BenNUEY PCIX RoHS
-1993 Innominate Security Technologies AG
-199A Pulse-LINK Inc
-19A2 ServerEngines LLC
- 0001 ACA2400 Crypto Accelerator
- 0200 BladeEngine 10Gb PCI-E iSCSI adapter
- 0201 BladeEngine 10Gb PCI-E Network Adpater
- 0520 4135 HFT Interface Controller
-19A8 DAQDATA GmbH
-19AC Kasten Chase Applied Research
- 0001 Crypto Accelerator (ACA2400)
-19AE Progeny Systems Corp
- 0520 4135 HFT Interface Controller
-19D4 Quixant Limited
-19DE Pico Computing
-19E2 Vector Informatik GmbH
-19E3 DDRdrive LLC
- DD52 DDRdrive X1
-19E7 NET (Network Equipment Technologies)
- 1001 STIX DSP Card
- 1002 STIX - 1 Port T1/E1 Card
- 1003 STIX - 2 Port T1/E1 Card
- 1004 STIX - 4 Port T1/E1 Card
- 1005 STIX - 4 Port FXS Card
-1A03 ASPEED Technology Inc
-1A07 Kvaser AB
- 0006 CAN interface PC104+ HS/HS
- 0007 CAN interface PCIcanx II HS or HS/HS
-1A08 Sierra Semiconductor
- 0000 SC15064
-1A1D GFaI e.V.
-1A22 Ambric Inc
-1A29 Fortinet Inc
-1A51 Hectronic AB
-1A58 Razer USA Ltd
-1A5D Celoxica
-1A68 VirtenSys Limited
-1A71 XenSource Inc
-1A73 Violin Technologies Inc
-1A77 Lightfleet Corporation
-1A78 Virident Systems Inc
-1A8C Verigy Pte Ltd
- 1100 E8001-66443 PCIe CIC
-1AB9 Espia Srl
-1AE8 Silicon Software GmbH
- 0A40 microEnable IV-Base x1
- 0A41 microEnable IV-FULL x1
-1B13 Jaton Corporation USA
- 0001 nVidia Corporation NV17 (GeForce4 MX 440)
-1B28 Taicom Data Systems Co Ltd
-1B47 Proxim(??) (Possibly Incorrect)
-1C1C DTC / Symphony / Forex Computer Corp
- 0001 FR710/82C101 EIDE
-1D44 Distributed Processing Technology (DPT)
- A400 PM2x24/PM3224 SCSI Adapter
-1DE1 Tekram Technology
- 0391 TRM-S1040 DC-315U Ultra SCSI Controller
- 2020 SCSI Controller (DC-390)
- 690C IDE Cache Controller (DC-690C)
- DC29 Bus Master IDE PCI 2 controllers (DC290M)
-1DE2 A/DHOC Systems
- 1190 001 Slave PCI protyting board
-1FC0 Tumsan Oy
- 0300 E2200 Dual E1/Rawpipe Card
-1FC1 PathScale Inc
-1FC9 Tehuti Networks Ltd.
- 3009 10 Giga TOE SmartNIC
- 3010 10 Giga TOE SmartNIC
- 3014 10 Giga TOE SmartNIC 2-Port
-1FCE Cognio Inc
- 0001 Spectrum Analyzer PC Card (SAgE)
-2000 Agat-RT(??)
- 0DDD Alder-9P computer telephony interface board
- 2800 56K Voice Modem
-2001 Temporal Research Ltd
-2002 Automation Technology GmbH
- 2003 PCI Frame Grabber
-2003 Netodragon?? Smartlink??
- 8800 Netodragon 56K voice modem
-2004 Smart Link Ltd
-2014 NONTECH Nonnenmacher GmbH
- 0004 aa551234 PCI Master Target
- 0040 0xff8000 PCI to Private Bus Bridge
-21C3 21st Century Computer Corp
-22B8 Motorola Inc
-2348 Racore
- 2010 8142 100VG/AnyLAN
-2646 Kingston Technology Corp
-270B Xantel Corp
-270F Chaintech Computer Co Ltd
-2711 AVID Technology Inc
-2EC1 Zenic Inc
-3000 Hansol Electronics Inc
-3030 C-Net
-3142 Post Impression Systems
-3388 PLX Technology (Was: HiNT Corp)
- 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio Controller
- 0014 HiNT HC4 PCI to ISDN bridge, Network Controller
- 0020 PCI 6154/6254 HB2/HB6 Universal PCI to PCI bridge (transparent mode)
- 0021 PCI 6140/52/6254 HB1/1-SE/HB6 Universal PCI to PCI Bridge (non-transparent mode)
- 0022 PCI 6150 HB4 PCI to PCI Bridge
- 0026 PCI 6154 HB2 PCI to PCI Bridge
- 0028 PCI 6540 HB8 Dual Mode PCI-X-to-PCI-X Bridge (transparent mode)
- 0029 PCI 6540 HB8 Dual Mode PCI-X-to-PCI-X Bridge (non-transparent mode)
- 0030 PCI 6520 HB7 Transparent PCI-X-to-PCI-X Bridge
- 0031 Synchronous 32-Bit, 33 MHz PCI-to-PCI Bridge for Video Capture Applications (PCI 6156)
- 101A E.Band [AudioTrak Inca88]
- 101B E.Band [AudioTrak Inca88]
- 8011 VXPro II Chipset CPU to PCI Bridge
- 8012 VXPro II Chipset PCI to ISA Bridge
- 8013 EIDE Controller (PLX Registration Record Management)
- A101 Blackmagic DeckLink
- A102 Blackmagic DeckLink
- A103 Blackmagic DeckLink
- A104 Blackmagic DeckLink
- A105 Blackmagic DeckLink
-3411 Quantum Designs (H.K.) Inc
-3513 ARCOM Control Systems Ltd
-3842 EVGA.COM
-38D0 mfp-online.de
- 62D6 fieldbus-master PCI Measurement bus Controller for EPSI
-38EF 4Links
-3D3D 3Dlabs, Inc. Ltd
- 0001 3D Accelerator (GLint 300SX)
- 0002 Sapphire 3D Accelerator (GLint 500TX)
- 0003 Delta Geometry processor (GLint)
- 0004 2D+3D Accelerator (3C0SX)
- 0005 2D+3D Accelerator (Permedia)
- 0006 3D Accelerator (GLint MX)
- 0007 Permedia II 2D+3D Accelerator (3D Extreme)
- 0008 GLINT Gamma G1
- 0009 2d+3d chipset, integrated ramdac (Permedia2v)
- 000A Driver Ethernet Pci Ven 1969 (Permedia 3)
- 000C Permedia 3
- 000D 3D Accelerator (GLINT R4)
- 000E GLINT Gamma G2
- 0011 GLint R4 rev B
- 0012 GLint R5 rev A
- 0013 GLint R5 rev B
- 0020 3Dlabs Wildcat VP 880 Pro (0x0020)
- 0022 VP10 visual processor
- 0024 VP9 visual processor
- 0030 3Dlabs Wildcat Realizm 800 (0x030000)
- 0100 2D+3D Accelerator (Permedia II)
- 07A1 Wildcat III 6210
- 07A2 Sun XVR-500 Graphics Accelerator
- 07A3 Wildcat IV 7210
- 1004 3D+3D Accelerator (Permedia)
- 3D04 2D+3D Accelerator (Permedia)
- FFFF Glint VGA (Error??)
-4005 Avance Logic Inc.
- 0300 ALS300 PCI Audio Device
- 0308 PCI Audio Device + modem (3220)
- 0309 PCI Input Controller (ALS300 )
- 1064 GUI Accelerator (ALG2064)
- 2064 ALG-2032/64i GUI Accelerator
- 2128 GUI Accelerator (ALG2364A)
- 2301 GUI Accelerator (ALG2301)
- 2302 GUI Accelerator (ALG2302)
- 2303 GUI Accelerator (AVG2302)
- 2364 GUI Accelerator (ALG2364)
- 2464 GUI Accelerator (ALG2464)
- 2501 GUI Accelerator (ALG2564A/25128A)
- 4000 Audio Chipset (ALS4000)
-4033 Delta Networks Inc
- 1300 SIS900 10/100Mbps Fast Ethernet Controller
- 1320 VT86C100A 10/100M PCI Fast Ethernet Controller
- 1360 RTL8139A 10/100 Mbps PCI Fast Ethernet Controller
- 1380 DEC 21143PD 10/100M PCI Fast Ethernet Controller
- 7001 ISL36341M PRISM 2.5 Mini-PCI 802.11b Wireless Controller
-4040 NetXen Incorporated
- 0001 NXB-10GXSR 10 Gigabit Ethernet PCIe Adapter with SR-XFP optical interface
- 0002 NXB-10GCX4 10 Gigabit Ethernet PCIe Adapter with CX4 copper interface
- 0003 NXB-4GCU Quad Gigabit Ethernet PCIe Adapter with 1000-BASE-T interface
- 0004 BladeCenter-H 10 Gigabit Ethernet High Speed Daughter Card
-4143 Digital Equipment Corp
-4144 Alpha Data Parallel Systems Ltd
- 0040 Virtex-E Bridge (ADM-XRC)
- 0041 Virtex-II Bridge (ADM-XRC-II Lite)
- 0042 Virtex-II Bridge (ADM-XRC-II)
- 0043 Virtex-II Pro Bridge (ADM-XPL)
- 0044 Virtex-II Pro PCI/PCI-X Bridge (ADM-XP)
- 0045 Virtex-II Bridge (ADP-WRC-II)
- 0046 Virtex-II Bridge (ADP-DRC-II)
- 0049 Virtex-II Pro PCI (ADP-XPI)
- 004A Virtex-II Pro PCI-X Bridge (ADP-XPI (PCI-X))
- 004F Virtex-II Pro PCI-X Bridge (ADM-XRC-4FX)
- 0050 Virtex-4LX Bridge (ADM-XRC-5LX)
- 0051 ADM-XRC-5T1 (ADM-XRC-5T1)
-416C Aladdin Knowledge Systems
- 0100 AladdinCARD
- 0200 CPC
-4250 Burke Porter Ltd
-4321 Tata Power Strategic Electronics Division
-434D ?? Unknown (Present in WinXP Drivers)
- 1002 56K Voice Modem
-434E CAST Navigation LLC
-4444 Conexant Inc (Was: Globespan, ICompression Inc)
- 0002 iTVC12 MPEG Codec
- 0016 iTVC16/CX23416 MPEG Codec
- 0803 iTVC15/CX23415 MPEG Codec
-4468 Bridgeport Machines
-4594 Cogetec Informatique Inc
-45FB Baldor Electric Company
-4680 UMAX Computer Corp
-4843 Hercules Computer Technology Inc
-4916 RedCreek Communications Inc
- 1960 RedCreek PCI Adapter
-4943 Growth Networks
-494F ICS Advent
- 22C0 Watchdog WDT500
- ACA8 PCI-AI/1216 ADC Card
- ACA9 PCI-AI/1216(M) ADC Card
-4954 Integral Technologies
-4978 Axil Computer Inc
-4A14 NetVin
- 5000 NV5000 RPTI RTL8029-Based PCI Ethernet Adapter
-4ABD Applied Biosystems Division
-4B10 Buslogic Inc
- 3080 SCSI Host Adapter
- 4010 Wide SCSI Host Adapter
-4C48 Lung Hwa Electronics
-4C53 SBS Technologies (AKA: SBS-Or Industrial Computers)
- 0000 Diagnostics Device (PLUSTEST)
-4CA1 Seanix Technology Inc
-4CCC Computer Conversions Corp
-4D51 Mediaq Inc.
- 0200 MQ-200
-4D54 Microtechnica Co Ltd
-4D56 MATRIX VISION GmbH
-4DDC ILC Data Device Corp
- 0100 DD-42924I5-300 (ARINC 429 Data Bus)
- 0801 BU-65570I1 MIL-STD-1553 Test and Simulation
- 0802 BU-65570I2 MIL-STD-1553 Test and Simulation
- 0811 BU-65572I1 MIL-STD-1553 Test and Simulation
- 0812 BU-65572I2 MIL-STD-1553 Test and Simulation
- 0881 BU-65570T1 MIL-STD-1553 Test and Simulation
- 0882 BU-65570T2 MIL-STD-1553 Test and Simulation
- 0891 BU-65572T1 MIL-STD-1553 Test and Simulation
- 0892 BU-65572T2 MIL-STD-1553 Test and Simulation
- 0901 BU-65565C1 MIL-STD-1553 Data Bus
- 0902 BU-65565C2 MIL-STD-1553 Data Bus
- 0903 BU-65565C3 MIL-STD-1553 Data Bus
- 0904 BU-65565C4 MIL-STD-1553 Data Bus
- 0B01 BU-65569I1 MIL-STD-1553 Data Bus
- 0B02 BU-65569I2 MIL-STD-1553 Data Bus
- 0B03 BU-65569I3 MIL-STD-1553 Data Bus
- 0B04 BU-65569I4 MIL-STD-1553 Data Bus
-5046 GemTek Technology corp
- 1001 PCI Radio
-5053 TBS/Voyetra Technologies
- 2010 Daytona Audio Adapter
-5136 S S Technologies
-5143 Qualcomm Inc
-5145 Ensoniq (Oldest ID)
- 3031 Concert AudioPCI
-5168 Animation Technologies Inc
- 0300 FlyDVB-S
- 0301 FlyDVB-T
-5301 Alliance Semiconductor Corp
- 0001 ProMotion aT3D
-5333 S3 Graphics Co., Ltd
- 0551 Plato/PX (86C551)
- 5333 via (S3 86c765)
- 5631 Virge 3D (86C325)
- 8800 Vision 866 GUI Accelerator (86C866)
- 8801 Vision 964 GUI Accelerator (86C964)
- 8810 S3 TRIO32 IACB2 86C732-P (86C732-P)
- 8811 86C732 Trio32, 86C764 Trio64, 86C765 Trio64V+ Rev 01
- 8812 Aurora 64V+ (86CM65?)
- 8813 Trio 32/64 GUI Accelerator v3 (86C764)
- 8814 Trio 64UV+ (86C767)
- 8815 Aurora128 (86CM66)
- 883D ViRGE/VX 3D GUI Accelerator (86C988)
- 8870 Fire GL
- 8880 Vision 868 GUI Accelerator VRAM rev. 0 (86C868)
- 8881 Vision 868 GUI Accelerator VRAM rev. 1 (86C868)
- 8882 Vision 868 GUI Accelerator VRAM rev. 2 (86C868)
- 8883 Vision 868 GUI Accelerator VRAM rev. 3 (86C868)
- 88B0 Vision 928 GUI Accelerator VRAM rev. 0 (86C928)
- 88B1 Vision 928 GUI Accelerator VRAM rev. 1 (86C928)
- 88B2 Vision 928 GUI Accelerator VRAM rev. 2 (86C928)
- 88B3 Vision 928 GUI Accelerator VRAM rev. 3 (86C928)
- 88C0 Vision 864 GUI Accelerator DRAM rev. 0 (86C864)
- 88C1 Vision 864 GUI Accelerator DRAM rev. 1 (86C864)
- 88C2 Vision 864 GUI Accelerator DRAM rev. 2 (86C864)
- 88C3 Vision 864 GUI Accelerator DRAM rev. 3 (86C864)
- 88D0 Vision 964 GUI Accelerator VRAM rev. 0 (86C964)
- 88D1 Vision 964-P GUI Accelerator VRAM rev. 1 (86C964)
- 88D2 Vision 964-P GUI Accelerator DRAM rev 2 (86C964)
- 88D3 Vision 964-P GUI Accelerator VRAM rev. 3 (86C964)
- 88F0 Vision 968 GUI Accelerator VRAM rev. 0 (86C968)
- 88F1 Vision 968 GUI Accelerator VRAM rev. 1 (86C968)
- 88F2 Vision 968 GUI Accelerator VRAM rev. 2 (86C968)
- 88F3 Vision 968 GUI Accelerator VRAM rev. 3 (86C968)
- 8900 Trio64V2/DX (86C775)
- 8901 S3 trio64uv+ for windows xp (pciven_5333dev_8C2E&SUBSYS_00011179&REV_054&74C6)
- 8902 SMA Family (86C551)
- 8903 TrioV Family
- 8904 86C365 Trio3D QFP, 86C366 Trio3D BGA
- 8905 86C765 Trio64V+ compatible (86c765)
- 8906 86C765 Trio64V+ compatible (86c765)
- 8907 86C765 Trio64V+ compatible (86c765)
- 8908 86C765 Trio64V+ compatible (9711 MCN74)
- 8909 86C765 Trio64V+ Compatible
- 890A 86C765 Trio64V+ compatible (0x00091011)
- 890B 86C765 Trio64V+ compatible (9726 c19394.00)
- 890C 86C765 Trio64V+ compatible (86C765)
- 890D 86C765 Trio64V+ Compatible
- 890E 86C765 Trio64V+ compatible (9711 MCN74)
- 890F 86C765 Trio64V+ compatible (86c765)
- 8A01 86C375 ViRGE/DX, 86C385 ViRGE/GX
- 8A10 86C357 ViRGE/GX2, 86C359 ViRGE/GX2+
- 8A11 ViRGE /GX2+ Macrovision (86C359)
- 8A12 ViRGE /GX2+ (86C359)
- 8A13 Trio3D2x & Trio3D2x+ AGP / Trio3D2x & Trio3D2x+ 8MB (86C368)
- 8A20 S3savage3D (86C391)
- 8A21 Savage3D/MV (86C390)
- 8A22 86C394/5/6/7/8 Savage4 LT/GT/Pro-M/Pro/Xtreme
- 8A23 Savage 4 (86C394-397)
- 8A25 Savage4 ProSavage PM133
- 8A26 ProSavage (86C395B)
- 8C00 ViRGE/M3 (ViRGE/MX) (85C260)
- 8C01 ViRGE/M5 (ViRGE/MX) (86C260)
- 8C02 ViRGE/MXC (86C240)
- 8C03 86C280 ViRGE/MX+ Macrovision
- 8C10 86C270 Savage/MX,274 Savage/IX,290 Savage/MX+MV,294 Savage/IX+MV
- 8C11 82C270-294 Savage/MX
- 8C12 Savage MX/IX/MX+MV/IX+MV (86C270/274/290/294)
- 8C13 SAVAGE IX (82C294)
- 8C22 SuperSavage 128/MX (86C508)
- 8C24 SuperSavage MX/64
- 8C26 SuperSavage MX/64C
- 8C2A SuperSavage 128/IX (86C544)
- 8C2B SuperSavage 128/IX DDR (86C553)
- 8C2C SuperSavage/IX (86C564)
- 8C2D SuperSavage/IX DDR (86C573)
- 8C2E SuperSavage/IXC SDRAM (86C584)
- 8C2F SuperSavage/IXC DDR (86C594)
- 8D01 82C380 Twister, 82C381 Twister T
- 8D02 Twister K (86c387)
- 8D03 VT8751 ProSavageDDR P4M266
- 8D04 ProSavage DDR (86C410)
- 8E00 86C777 DeltaChromeS8, 86C787 DeltaChromeF1
- 8E01 DeltaChromeX9m (86C732)
- 8E10 GammaChromeS18
- 8E48 Chrome 20 Series
- 9102 Inno Savage 2000 (86c410)
- CA00 SonicVibes PCI Audio Accelerator (86C617)
-5401 Ericsson
- 0101 DSSS Wireless LAN PCI Card
-5430 Evergreen Technologies Inc
- 0100 AcceleraPCI Upgrade Card Adapter
-544C Teralogic Inc
- 0350 TL880-based HDTV/ATSC tuner
-5455 Technische Universitaet Berlin
- 4458 S5933 PCI to MyBus Bridge
-5456 GoTView
-5519 Cnet Technologies Inc
-5544 Dunord Technologies
- 0001 I-30xx Scanner Interface
-5555 Genroco Inc.
- 0003 Digital Video OEM computer module (VPI General Digital Video Component)
-5654 VoiceTronix Pty Ltd
- 3132 OpenSwitch12
-5700 Netpower
-5851 Exacq Technologies
-5853 XenSource Inc
- 0001 Xen Platform Device
-6356 UltraStor
- 4002 ULTRA24 SCSI Host
- 4102 ULTRA24 SCSI Host
- 4202 ULTRA24 SCSI Host
- 4302 ULTRA24 SCSI Host
- 4402 ULTRA24 SCSI Host
- 4502 ULTRA24 SCSI Host
- 4602 ULTRA24 SCSI Host
- 4702 ULTRA24 SCSI Host
- 4802 ULTRA24 SCSI Host
- 4902 ULTRA24 SCSI Host
- 4A02 ULTRA24 SCSI Host
- 4B02 ULTRA24 SCSI Host
- 4C02 ULTRA24 SCSI Host
- 4D02 ULTRA24 SCSI Host
- 4E02 ULTRA24 SCSI Host
- 4F02 ULTRA24 SCSI Host
-6374 c't Magazin fuer Computertechnik
- 6773 CT-GPPCI General Purpose PCI Interface
-6409 Logitec Corp
-6666 Decision Computer International Co.
- 0001 PCCOM4
- 0002 PCCOM8
- 0004 PCCOM2
- 0101 PCI 8255/8254 I/O Card
-6809 Kurusugawa Electronics Industry Inc
-7063 pcHDTV
- 2000 HD-2000
- 3000 HD-3000
- 5500 HD5500 HDTV
-7604 O.N. Electric Co Ltd
-7747 DaoGuo Technology Co Ltd
-7BDE Midac Corporation
-7FED PowerTV
-8001 Beyertone AG Germany
-8008 Quancom Electronic GmbH
- 0010 PWDOG1 Watchdog
- 0011 PWDOG2 Watchdog2
- 0016 PROTO2
- 0100 PREL8
- 0102 PREL16
- 0103 POPTOREL16
- 0105 POPTO16IN
- 0106 PTTL24IO
- 0107 PUNIREL
- 1000 PDAC4
- 1001 PAD12DAC4
- 1002 PAD16DAC4
- 1005 PAD12
- 1006 PAD16
- 3000 POPTOLCA
- 3100 PCIPROTO
- 3103 PCIOPTO16IO
- 3104 PCIOPTOREL16
- 3203 PCIOPTO16IO/LC
- 3204 PCIREL16
- 3301 PCITTL32IO
- 3302 PCIGPIB
-807D Asustek Computer Inc
-8086 Intel Corporation
- 0007 82379AB (??)
- 0008 Extended Express System Support Controller
- 0039 21145 Ethernet Adapter
- 0122 82437FX 430FX (Triton) System Controller
- 0308 PCI Audio Device + modem (3220)
- 0309 I/O Processor PCI-to-PCI Bridge Unit (80303)
- 030D I/O Companion Unit PCI-to-PCI Bridge (80312)
- 0318 80219 400 MHz Gen Purpose PCI Processor Address Translation Unit
- 0319 80219 600 MHz Gen Purpose PCI Processor Address Translation Unit
- 0326 6700/6702PXH I/OxAPIC Interrupt Controller A
- 0327 I/OxAPIC Interrupt Controller B (6700PXH)
- 0329 PCI Express-to-PCI Express Bridge A (6700PXH)
- 032A PCI Express-to-PCI Express Bridge B (6700PXH)
- 032C PCI Express-to-PCI Express Bridge (6702PXH)
- 032D 41110 [Lanai-V] Serial to Parallel PCI Bridge - Single Segment Bridge
- 0330 80332 [Dobson] I/O processor A-segment Bridge
- 0331 80332 [Dobson] I/O processor A-segment IOAPIC
- 0332 80332 [Dobson] I/O processor B-segment Bridge
- 0333 80332 [Dobson] I/O processor B-segment IOAPIC
- 0334 80332 [Dobson] I/O processor Address Translation Unit (ATU)
- 0335 80331 [Lindsay] I/O processor PCI-X bridge
- 0336 80331 [Lindsay] I/O processor Address Translation Unit (ATU)
- 0340 41210 [Lanai] Serial to Parallel PCI Bridge A-segment Bridge
- 0341 41210 [Lanai] Serial to Parallel PCI Bridge B-segment Bridge
- 0370 Segment-A PCI Express-to-PCI Express Bridge (80333)
- 0371 A-Bus IOAPIC (80333)
- 0372 Segment-B PCI Express-to-PCI Express Bridge (80333)
- 0373 B-Bus IOAPIC (80333)
- 0374 Address Translation Unit (80333)
- 0482 PCI-EISA Bridge (PCEB)hp dx 7300 microwave tower (82375MB)
- 0483 82424TX/ZX (Saturn) Cache/DRAM Controller
- 0484 82378ZB/IB,82379AB PCI to ISA Bridge, System I/O
- 0486 82420EX/ZX 486 PCIset System, ISA Bridge & EIDE Controller
- 04A3 82434LX/NX (Mercury/Neptune) Cache/DRAM Controller
- 04D0 82437FX 430FX CPU to PCI Bridge
- 0500 Processor Bus Controller (E8870)
- 0501 Memory Controller (E8870)
- 0502 Scalability Port 0 (E8870)
- 0503 E8870 Scalability Port 1 / Global Performance Monitoring
- 0510 E8870IO Hub Interface Port 0 (8-bit Compatibility)
- 0511 Hub Interface Port 2 (E8870IO)
- 0512 Hub Interface Port 2 (E8870IO)
- 0513 Hub Interface Port 3 (E8870IO)
- 0514 Hub Interface Port 4 (E8870IO)
- 0515 Server I/O Hub (SIOH) (E8870IO)
- 0516 E8870IO Reliabilty, Availability and Serviceability (RAS)
- 0530 Scalability Port 0 (E8870SP)
- 0531 Scalability Port 1 (E8870SP)
- 0532 Scalability Port 2 (E8870SP)
- 0533 Scalability Port 3 (E8870SP)
- 0534 Scalability Port 4 (E8870SP)
- 0535 Scalability Port 5 (E8870SP)
- 0536 Scalability Port Switch Global Registers (E8870SP)
- 0537 Interleave Configuration Registers (E8870SP)
- 0600 Storage RAID Controller (01af8086)
- 0601 RAID Controller
- 061F 80303 I/O Processor
- 0800 pci/ven_8086&dev_27da&subsys_30b2103c&rev_023&b1bfb68&0&fb (10B01734)
- 0960 i960 RP Microprocessor/Bridge (80960RP)
- 0962 i960RM/RN Microprocessor/Bridge (80960RM/RN)
- 0964 i960 RP Microprocessor Bridge (80960RP)
- 1000 82542 Gigabit Ethernet Controller
- 1001 82543GC Gigabit Ethernet Adapter (Fiber)
- 1002 Pro 100 LAN+Modem 56 CardBus II
- 1004 Gigabit Ethernet Controller (Copper) (82543GC)
- 1008 Gigabit Ethernet Controller (Copper) (82544EI/GC)
- 1009 Gigabit Ethernet Controller (Fiber) (82544EI)
- 100A 82540EM Gigabit Ethernet Controller
- 100C Gigabit Ethernet Controller (Copper) (82543EI/GC)
- 100D Gigabit Ethernet Controller (LOM) (82544GC)
- 100E Gigabit Ethernet Controller (82540EM)
- 100F Gigabit Ethernet Controller (copper) (82545EM)
- 1010 Dual Port Gigabit Ethernet Controller (Copper) (82546EB)
- 1011 Gigabit Ethernet Controller (Fiber) (82545EM)
- 1012 Dual Port Gigabit Ethernet Controller (Fiber) (82546EB)
- 1013 Gigabit Ethernet Controller (Copper) (82541EI)
- 1014 Gigabit Ethernet Controller (82541ER)
- 1015 Gigabit Ethernet Controller (LOM) (82540EM)
- 1016 Gigabit Ethernet Controller (LOM) (82540EP)
- 1017 Gigabit Ethernet Controller (LOM) (82540EP)
- 1018 PRO/1000 MT Mobile connection (82541EI)
- 1019 Gigabit Ethernet Controller (LOM) (82547EI)
- 101A Gigabit Ethernet Controller (LOM) (82547EI)
- 101D Dual Port Gigabit Ethernet Controller (82546EB)
- 101E Gigabit Ethernet Controller (Mobile) (82540EP)
- 1026 Gigabit Ethernet Controller (82545ep)
- 1027 Gigabit Ethernet Controller (Fiber) (82545GM)
- 1028 Gigabit Ethernet Controller (82545GM)
- 1029 Fast Ethernet PCI/CardBus Controller
- 1030 82559 InBusiness 10/100
- 1031 82801CAM (ICH3) PRO/100 VE (LOM) Network Connection
- 1032 82801CAM (ICH3) PRO/100 VE Network Connection
- 1033 82801CAM (ICH3) PRO/100 VM Network Connection
- 1034 82801CAM (ICH3) PRO/100 VM Network Connection
- 1035 82801CAM (ICH3)/82562EH based Phoneline Network Connection
- 1036 82801CAM (ICH3)/82562EH based Phoneline Network Connection
- 1037 82801CAM (ICH3) Chipset Ethernet Controller
- 1038 82801CAM (ICH3) PRO/100 VM (KM) Network Connection
- 1039 82801DB/DBL (ICH4/ICH4-L) PRO/100 VE Network Connection
- 103A 82801DB/DBL (ICH4/ICH4-L) PRO/100 VE Network Connection
- 103B 82801DB/DBL (ICH4/ICH4-L) PRO/100 VM Network Connection
- 103C 82801DB/DBL (ICH4/ICH4-L) PRO/100 VM Network Connection
- 103D 82801DB (ICH4) PRO/100 VE Network Connection
- 103E 82801DB (ICH4) PRO/100 VM Network Connection
- 1040 V.92 PCI (DSP) Data Fax Modema (536EP)
- 1042 PRO/Wireless 2011 LAN PCI Card
- 1043 Intel(R) PRO/Wireless 2100 LAN Card Driver (82801)
- 1048 10 Gigabit Ethernet Controller (82597EX)
- 1049 Gigabit Network Connection Interface Controller (82566MM NIC)
- 104A 82566DM Gigabit Network Connection
- 104B 82566DC Gigabit Network Connection
- 104C 82562V 10/100 Network Connection
- 104D 82566MC Gigabit Network Connection
- 1050 PRO/100 VE Network Connection (82801EB/ER)
- 1051 82801EB/ER (ICH5/ICH5R) PRO/100 VE Network Connection
- 1052 PRO/100 VM Network Connection (82801EB/ER)
- 1053 PRO/100 VM Network Connection (82801EB/ER)
- 1054 PRO/100 VE Network Connection (mobile) (82801EB/ER)
- 1055 PRO/100 VM Network Connection (mobile) (82801EB/ER)
- 1056 PRO/100 VE Network Connection
- 1057 PRO/100 VE Network Connection
- 1059 Fast Ethernet PCI/CardBus Controller (82551QM)
- 105B 82546GB Gigabit Ethernet Controller (Copper)
- 105E HP NC360T PCIe DP Gigabit Server Adapter (n1e5132)
- 105F PRO/1000 PF Family
- 1060 PRO/1000 PB
- 1064 82562EZ PRO/100 Ethernet Controller
- 1065 82562ET/EZ/GT/GZ PRO/100 VE Ethernet Controller
- 1066 82562EM/EX/GX PRO/100 VM (LOM) Ethernet Controller
- 1067 82562EM/EX/GX PRO/100 VM Ethernet Controller
- 1068 82562ET/EZ/GT/GZ PRO/100 VE (LOM) Ethernet Controller Mobile
- 1069 82562EM/EX/GX PRO/100 VM (LOM) Ethernet Controller Mobile
- 106A 82562Gt PRO/100 VE (LOM) Ethernet Controller
- 106B 82562Gt PRO/100 VE Ethernet Controller Mobile
- 1075 Gigabit Ethernet Controller (82547EI)
- 1076 Gigabit Ethernet Controller (82541EI)
- 1077 Gigabit Ethernet Controller (Mobile) (82547EI)
- 1078 Gigabit Ethernet Controller (82541ER)
- 1079 Dual Port Gigabit Ethernet Controller (82546EB)
- 107A Dual Port Gigabit Ethernet Controller (Fiber) (82546EB)
- 107B Dual Port Gigabit Ethernet Controller (Copper) (82546EB)
- 107C Gigabit Ethernet Controller (Copper) rev 5 (82541PI)
- 107D PRO/1000 PT
- 107E PRO/1000 PF
- 107F PRO/1000 PB
- 1080 FA82537EP - Intel 537EP V.92 (PCI) modem (0321CGEA04)
- 1081 PRO/1000 EB Network Connection
- 1082 PRO/1000 EB Server Connection
- 1083 PRO/1000 EB Backplane Connection
- 1084 Enterprise Southbridge IDE Redirection
- 1085 Enterprise Southbridge Serial Port Redirection
- 1086 Enterprise Southbridge IPMI/KCS0
- 1087 Enterprise Southbridge UHCI Redirection
- 1089 Enterprise Southbridge BT
- 108A PRO/1000 P
- 108B Intel network controller (PCIE Gigabit Ethernet) (PC82573V)
- 108C Intel Corporation 82573E Gigabit Ethernet Controller (Copper) (82573E)
- 108D Active Management Technology - IDE
- 108E Intel(R) Active Management Technology - KCS (ICH7R)
- 108F Intel(R) Active Management Technology - SOL (ICH7R)
- 1091 PRO/100 VM Network Connection
- 1092 PRO/100 VE Network Controller (27DA)
- 1093 PRO/100 VM Network Connection
- 1094 get PRO2KXP.exe from Intel (Onboard - Intel PRO 100/VE nic)
- 1095 PRO/100 VE Network Connection
- 1096 Intel PRO/1000 EB (Intel PRO/1000 EB)
- 1097 PRO/1000 EB Server Connection
- 1098 PRO/1000 EB Backplane Connection
- 1099 82546GB Quad Port Server Adapter
- 109A Intel PRO/1000 PL Network Adaptor (82573L)
- 109B 82546GB PRO/1000 GF Quad Port Server Adapter
- 109E 82597-based CX4 10 Gigabit Adapter
- 10A0 82571EB PRO/1000 AT Quad Port Bypass Adapter
- 10A1 82571EB PRO/1000 AF Quad Port Bypass Adapter
- 10A4 82571EB Gigabit Ethernet Controller
- 10A5 82571EB Gigabit Ethernet Controller (Fiber)
- 10A7 82575EB Gigabit Network Connection
- 10A9 82575EB Gigabit Backplane Connection
- 10B0 82573L PRO/1000 PL Network Connection
- 10B2 82573V PRO/1000 PM Network Connection
- 10B3 82573E PRO/1000 PM Network Connection
- 10B4 82573L PRO/1000 PL Network Connection
- 10B5 82546GB PRO/1000 GT Quad Port Server Adapter
- 10B6 82598 10GbE PCI-Express Ethernet Controller
- 10B9 82572EI PRO/1000 PT Desktop Adapter (Copper)
- 10BA PRO/1000 EB1 Network Connection with I/O Acceleration
- 10BB PRO/1000 EB1 Backplane Connection with I/O Acceleration
- 10BC 82571EB Gigabit Ethernet Controller (Copper)
- 10BD Intel 82566DM Gigabit Ethernet Adapter (82566DM)
- 10C0 Intel(R) 82562V-2 10/100 Network Connection (8082)
- 10C2 82562G-2 10/100 Network Connection
- 10C3 82562GT-2 10/100 Network Connection
- 10C4 Intel 82562GT 10/100 Network Controller (82562GT)
- 10C5 82562G 10/100 Network Connection
- 10C6 82598EB 10 Gigabit AF Dual Port Network Connection
- 10C7 82598EB 10 Gigabit AF Network Connection
- 10CE Intel 82567V-2 Gigabit Network Connection (82567V-2)
- 10D3 Intel 82574L Gigabit Ethernet Controller (82574L)
- 10D5 82571PT Gigabit PT Quad Port Server ExpressModule
- 10D6 82575GB Gigabit Network Connection
- 10D9 82571EB Dual Port Gigabit Mezzanine Adapter
- 10DA 82571EB Quad Port Gigabit Mezzanine Adapter
- 10DD 82598EB 10 Gigabit AT CX4 Network Connection
- 10DE Intel Gigabit network connection (82567LM-3 )
- 10E2 82575GB Gigabit Network Connection
- 10E8 Unknown (Unknown)
- 10F5 Intel 82567LM-2 Gigabit Network Connection (82567LM)
- 1100 82815 815/E (Solano) Host to I/O Hub Bridge with 100MHz DRAM Controller
- 1101 82815 815/E (Solano) PCI to AGP Bridge
- 1102 82815 815/E (Solano) Internal GUI Accelerator
- 1107 PRO/1000 MF Server Adapter (LX)
- 1110 82815 815/E (Solano) Host to I/O Hub Bridge, AGP Not Implemented
- 1112 82815 815/E (Solano) Internal GUI Accelerator
- 1120 82815 815/E (Solano) Host to I/O Hub Bridge, AGP Implemented
- 1121 82815 815/E (Solano) PCI to AGP Bridge
- 1130 82815/EM/EP/P 815/EM/EP/P (Solano) Host to I/O Hub Bridge
- 1131 82815/EM/EP/P 815/EM/EP/P (Solano) PCI to AGP Bridge
- 1132 82815/EM/EP/P 815/EM/EP/P (Solano) Interal GUI Accelerator
- 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
- 1162 BECC XScale 80200 Companion Chip (FPGA by ADI Engineering Inc)
- 1179 Dual Port Gigabit Ethernet Controller (82546EB)
- 1200 Network Processor (IXP1200)
- 1209 Fast Ethernet Controller (8255xER/IT)
- 1221 82092AA PCI to PCMCIA Bridge
- 1222 82092AA EIDE Controller
- 1223 Video Controller (SAA 7116 H)
- 1225 82452KX/GX Orion Extended Express Processor to PCI Bridge
- 1226 82596 EtherExpress PRO/10
- 1227 LAN Controller with 82562EM/EX PHYPCI (82801db ich4)
- 1228 Intelligent 10/100 Fast Ethernet Adapter (EE PRO/100 Smart)
- 1229 82550/1/7/8/9 EtherExpress PRO/100(B) Ethernet Adapter
- 122D 82437FX 430FX (Triton) Cache/DRAM Controller
- 122E PCI to ISA Bridge (Triton) (82371FB)
- 1230 82338/82371FB PIIX PCI EIDE Controller
- 1231 DSVD Modem
- 1234 82371MX 430MX Mobile Chipset MPIIX + EIDE + I/O
- 1235 82437MX 430MX Mobile Chipset System Controller
- 1237 82440/1FX 440FX (Natoma) System Controller
- 1239 82371FB 430FX PCI EIDE Controller
- 123B PCI to PCI Docking Bridge (82380PB)
- 123C Mobile PCI-to-ISA Bridge (MISA) (82380AB)
- 123D Programmable Interrupt Device (683053)
- 123E 82466GX Integrated Hot-Plug Controller ("Hidden" mode)
- 123F Integrated Hot-Plug Controller (IHPC) (82466GX)
- 1240 Intel752 AGP Graphics Accelerator
- 124B 82380FB 380FB Mobile Chipset PCI Bridge
- 1250 System Controller (TXC) (82430HX)
- 12D8 SIGMATEL STAC 92XX C-Major HD Audio (92XX)
- 1360 Hub Interface to PCI Bridge (82806AA)
- 1361 82806AA PCI64 Hub Controller (HRes), APIC
- 1460 82870P2 P64H2 PCI/PCI-X Hub Controller
- 1461 P64H2 I/O Advanced Programmable Interrupt Controller
- 1462 82870P2 P64H2 PCI/PCI-X Hot Plug Controller
- 1960 i960RP Microprocessor (80960RP)
- 1962 Windows 2003 Server Promise SuperTrak SX6000 (tm) IDE RAID Controller
- 1A10 Celeron(tm) Processor to I/O Controller
- 1A11 Celeron(tm) Processor to I/O Controller
- 1A12 Eicon DIVA Server Voice PRI 2.0 (PCI)
- 1A13 Eicon DIVA Server Voice PRI 2.0 (PCI)
- 1A20 82840 840 (Carmel) Chipset
- 1A21 82840 840 (Carmel) Chipset Host to I/O Hub Bridge (Dual CPU)
- 1A22 82840 840 (Carmel) Chipset Host to I/O Hub Bridge (Quad CPU)
- 1A23 82840 840 (Carmel) Chipset PCI to AGP Bridge
- 1A24 82840 840 (Carmel) Chipset PCI Bridge (Hub B)
- 1A30 Host-Hub Interface Bridge (82845G[GL/GV/GE/PE])
- 1A31 82845/E/MP/MZ Brookdale CPU to AGP Bridge
- 1A38 5000 Series Chipset DMA Engine (5000P)
- 1A48 82597-based 10 Gigabit Adapter
- 1B48 82597-based 10 Gigabit Adapter
- 2125 AC97 Audio Controller. website to download - http://www.intel.com/design/chipsets/manuals/29802801.p (82801AA)
- 2406 AC97 Modem Controller / PCI Modem (82801 / ?)
- 2410 82801AA 8xx Chipset LPC Interface Bridge
- 2411 IDE Controller (UltraATA/66) (82801AA)
- 2412 82801AA 8xx Chipset USB Controllers
- 2413 82801AA 8xx Chipset SMBus Controller
- 2415 Aureal (AD1881 SOUNDMAX) Placa Me Asaki P3-141 (Intel 82801DBM SM/BUS Controller 24C3)
- 2416 82801AA 8xx Chipset AC'97 PCI Modem
- 2418 82801AA 8xx Chipset Hub to PCI Bridge
- 2420 82801AB 8xx Chipset LPC Interface Bridge
- 2421 IDE Controller (UltraATA/33) (82801AB)
- 2422 82801AB 8xx Chipset USB Controller
- 2423 82801AB 8xx Chipset SMBus Controller
- 2425 82801AB 8xx Chipset AC'97 Audio Controller
- 2426 82801AB 8xx Chipset AC'97 PCI Modem
- 2428 82801AB 8xx Chipset Hub to PCI Bridge
- 2431 pci bus (82810)
- 2440 82801BA (ICH2) LPC Interface Controller
- 2441 82801BA (ICH2) UltraATA/66 EIDE Controller
- 2442 82801BA/BAM (ICH2/ICH2-M) USB Universal Host Controller
- 2443 82801BA/BAM (ICH2/ICH2-M) SMBus Controller
- 2444 82801BA/BAM (ICH2/ICH2-M) USB Universal Host Controller
- 2445 82801BA/BAM (ICH2/ICH2-M) AC'97 Audio Controller
- 2446 82801BA/BAM (ICH2/ICH2-M) AC'97 Modem Controller
- 2448 82801 Family (ICH2/3/4/5/6/7/8/9-M) Hub Interface to PCI Bridge
- 2449 82559ER Integrated 10Base-T/100Base-TX Ethernet Controller (82559ER)
- 244A 82801BAM (ICH2-M) UltraATA/100 IDE Controller
- 244B 82801BA (ICH2) UltraATA/100 IDE Controller
- 244C 82801BAM (ICH2-M) LPC Interface Controller
- 244E 82801 Family (ICH2/3/4/5/6/7/8/9,63xxESB) Hub Interface to PCI Bridge
- 2450 82801E PCI to ISA Bridge (LPC Bridge)
- 2452 USB Controller (82801E)
- 2453 SMBus Controller (82801E)
- 2459 82562 based Fast Ethernet Connection
- 245B IDE Controller (82801E)
- 245D 82562 based Fast Ethernet Connection
- 245E Hub Interface to PCI Bridge (82801E)
- 2480 82801CA/CAM (ICH3-S/ICH3-M) LPC Interface
- 2481 82801CA (ICH3-S/ICH3-M) UltraATA/66 IDE Controller
- 2482 82801CA/CAM (ICH3-S/ICH3-M) USB Controller *1
- 2483 82801CA/CAM (ICH3-S/ICH3-M) SMBus Controller
- 2484 82801CA/CAM (ICH3-S/ICH3-M) USB Controller *2
- 2485 82801CA/CAM (ICH3-S/ICH3-M) AC'97 Audio Controller
- 2486 82801CA/CAM (ICH3-S/ICH3-M) AC'97 Modem Controller
- 2487 82801CA/CAM USB Controller *3 (ICH3-S/ICH3-M)
- 248A 82801CAM (ICH3-M) UltraATA/100 EIDE Controller
- 248B 82801CA (ICH3) UltraATA/100 EIDE Controller
- 248C LPC Interface or ISA bridge: see Notes (82801CAM)
- 248D 82801(??) USB 2.0 Enhanced Host Controller w/HCReset Disabled
- 24C0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
- 24C1 82801DBL (ICH4-L) IDE Controller
- 24C2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller *1
- 24C3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
- 24C4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller *2
- 24C5 Realtek AC97 Audio (82801DBM SoundMAXController (ICH4-M B0 step))
- 24C6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
- 24C7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller *3
- 24CA 82801DBM (ICH4-M) UltraATA/100 EIDE Controller
- 24CB 82801DB/DBL (ICH4/ICH4-L) UltraATA/100 EIDE Controller
- 24CC 82801DBM (ICH4-M) LPC Interface Bridge
- 24CD 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB 2.0 EHCI Controller
- 24D0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
- 24D1 82801EB (ICH5) SATA Controller
- 24D2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *1
- 24D3 82801EB/ER (ICH5/ICH5R) SMBus Controller
- 24D4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *2
- 24D5 ADI SoundMAX Audio Device Driver, Version 5.12.1.3622 for the Microsoft Windows XP Operating Sys (8086)
- 24D6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
- 24D7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *3
- 24DB 82801EB/ER (ICH5/ICH5R) EIDE Controller
- 24DC LPC Interface Controller (82801EB)
- 24DD 82801EB/ER (ICH5/ICH5R) USB 2.0 EHCI Controller
- 24DE 82801EB/ER (ICH5/ICH5R) USB UHCI Controller *4
- 24DF SATA Controller (RAID) (82801ER)
- 2500 Host-Hub Interface Bridge / DRAM Ctrlr (82820)
- 2501 82820 820 (Camino) Chipset Host Bridge (MCH) (UP Only)
- 2502 82820
- 2503 82820
- 2504 82820
- 250B 82820 820 (Camino) Chipset CPU Host Bridge (MCH) (RDRAM Only)
- 250F 82820 820 (Camino) Chipset PCI to AGP Bridge
- 2520 Memory Translator Hub (MTH) (82805AA)
- 2521 Memory Repeater Hub for SDRAM (MRH-S) (82804AA)
- 2530 Host-Hub Interface Bridge(A2 step) (82850/E)
- 2531 82860 (860) CPU to I/O Hub Bridge (Interface A)
- 2532 AGP Bridge (82850/850E/860)
- 2533 82860 (860) PCI Bridge (Hub Interface B)
- 2534 82860 (860) PCI Bridge (Hub Interface C)
- 2535 82860 (860) PCI Bridge
- 2536 82860 (860) PCI Bridge
- 2537 82850/82860 (850/860) ??? Controller
- 2539 (Quad Processor mode) (82860)
- 2540 E7500 System Controller (MCH, Hub Interface A)
- 2541 E7500 System Controller (MCH, Hub Interface A) Error Reporter
- 2543 HI_B Virtual PCI-to-PCI Bridge (E7500/E7501)
- 2544 HI_B PCI-to-PCI Bridge Error Reporting (E7500/E7501)
- 2545 HI_C Virtual PCI-to-PCI Bridge (E7500/E7501)
- 2546 HI_C PCI-to-PCI Bridge Error Reporting (E7500/E7501)
- 2547 HI_D Virtual PCI-to-PCI Bridge (E7500/E7501)
- 2548 HI_D PCI-to-PCI Bridge Error Reporting (E7500/E7501)
- 254C Host Controller (E7501)
- 2550 Host Controller (E7505)
- 2551 E7205/E7505 Host RAS Controller
- 2552 PCI-to-AGP Bridge (E7205/E7505)
- 2553 Hub Interface_B PCI-to-PCI Bridge (E7505)
- 2554 E7505 Hub Interface_B PCI to PCI Bridge Error Reporing
- 255D Host Controller (E7205)
- 2560 DRAM Controller / Host-Hub I/F Bridge (82845G/GL/GV/GE/PE)
- 2561 82845G/GL/GV/GE/PE Brookdale Host to AGP Bridge
- 2562 82845G/GL/GV/GE/PE Integrated Graphics Device
- 2570 DRAM Controller / Host-Hub Interface (82865G/PE/P, 82848P)
- 2571 PCI-to-AGP Bridge (82865G/PE/P, 82848P)
- 2572 Integrated Graphics Device (82865G)
- 2573 PCI-to-CSA Bridge (82865G/PE/P, 82848P)
- 2576 Overflow Configuration (82865G/PE/P, 82848P)
- 2578 DRAM Controller / Host-Hub Interface (82875P/E7210)
- 2579 PCI-to-AGP Bridge (82875P)
- 257A ?
- 257B PCI to CSA Bridge (82875P/E7210)
- 257E 82875P,E7210 PCU to I/O Memory Controller (Overflow Configuration)
- 2580 82915G/GV/GL/P/PL/GL/910GE/GL Grantsdale Host Bridge/DRAM Controller
- 2581 82915G/GV/GL/P/PL/GL/910GE/GL Grantsdale Host-PCIe Graphics Bridge
- 2582 82915G/GV/GL, 82910GL Integrated Graphics Device
- 2584 Host Bridge / DRAM Controller (82925X/XE)
- 2585 82925X/XE Host-PCIe Graphics Bridge
- 2588 Host Bridge/DRAM Controller (E7221)
- 2589 E7220/E7221 PCIe Root Port
- 258A E7221 Integrated Graphics Controller
- 2590 Mobile Intel(R) 915GM/PM/GMS/910GML Express Processor to DRAM Controller (915GM)
- 2591 82915PM/GM PCIe Graphics Port
- 2592 82915GM/GMS, 82910GML Integrated Graphics Device
- 25A1 6300ESB LPC Inteface Controller
- 25A2 IDE Controller (6300ESB)
- 25A3 6300ESB Serial ATA Controller
- 25A4 SMBus Controller (6300ESB)
- 25A6 AC'97 Audio Controller (6300ESB)
- 25A7 AC'97 Modem Controller (6300ESB)
- 25A9 USB 1.1 UHCI Controller *1 (6300ESB)
- 25AA USB 1.1 UHCI Controller *2 (6300ESB)
- 25AB Watchdog Timer (6300ESB)
- 25AC 6300ESB I/O Advanced Programmable Interrupt Controller
- 25AD USB 2.0 EHCI Controller (6300ESB)
- 25AE Hub Interface to PCI-X Bridge (6300ESB)
- 25B0 Serial ATA Controller (RAID mode) (6300ESB)
- 25C0 5000X Chipset Memory Controller Hub
- 25D0 5000Z Chipset Memory Controller Hub
- 25D4 5000V Chipset Memory Controller Hub
- 25D8 5000P Chipset Memory Controller Hub
- 25E2 5000 Series Chipset PCIe x4 Port 2
- 25E3 5000 Series Chipset PCIe x4 Port 3
- 25E4 5000 Series Chipset PCIe x4 Port 4
- 25E5 5000 Series Chipset PCIe x4 Port 5
- 25E6 5000 Series Chipset PCIe x4 Port 6
- 25E7 5000 Series Chipset PCIe x4 Port 7
- 25E8 5000 Series Chipset AMB Memory Mapped Registers
- 25F0 5000 Series Chipset Error Reporting Registers
- 25F1 5000 Series Chipset Reserved Registers
- 25F3 5000 Series Chipset Reserved Registers
- 25F5 5000 Series Chipset FBD Registers
- 25F6 5000 Series Chipset FBD Registers
- 25F7 5000 Series Chipset PCIe x8 Port 2-3
- 25F8 5000 Series Chipset PCIe x8 Port 4-5
- 25F9 5000 Series Chipset PCIe x8 Port 6-7
- 25FA 5000X Chipset PCIe x16 Port 4-7
- 2600 E8500/E8501 Hub Interface 1.5
- 2601 E8500/E8501 PCIe x4 Port D
- 2602 E8500/E8501 PCIe x4 Port C0
- 2603 E8500/E8501 PCIe x4 Port C1
- 2604 E8500/E8501 PCIe x4 Port B0
- 2605 E8500/E8501 PCIe x4 Port B1
- 2606 E8500/E8501 PCIe x4 Port A0
- 2607 E8500/E8501 PCIe x4 Port A1
- 2608 E8500/E8501 PCIe x8 Port C
- 2609 E8500/E8501 PCIe x8 Port B
- 260A E8500/E8501 PCIe x8 Port A
- 260C E8500/E8501 IMI Registers
- 2610 E8500/E8501 Front Side Bus, Boot and Interrupt Registers
- 2611 E8500/E8501 Address Mapping Registers
- 2612 E8500/E8501 RAS Registers
- 2613 E8500/E8501 Miscellaneous Registers
- 2614 E8500/E8501 Miscellaneous Registers
- 2615 E8500/E8501 Miscellaneous Registers
- 2617 E8500/E8501 Debug Registers
- 2618 E8500/E8501 Debug Registers
- 2619 E8500/E8501 Debug Registers
- 261A E8500/E8501 Debug Registers
- 261B E8500/E8501 Debug Registers
- 261C E8500/E8501 Debug Registers
- 261D E8500/E8501 Debug Registers
- 261E E8500/E8501 Debug Registers
- 2620 E8500/E8501 XMB A/B/C/D Identification Registers
- 2621 E8500/E8501 XMB A/B/C/D Miscellaneous Registers
- 2622 E8500/E8501 XMB A/B/C/D Memory Interleaving Registers
- 2623 E8500/E8501 XMB A/B/C/D DDR Initialization and Calibration Registers
- 2624 E8500/E8501 XMB A/B/C/D Reserved
- 2625 E8500/E8501 XMB A/B/C/D Reserved
- 2626 E8500/E8501 XMB A/B/C/D Reserved
- 2627 E8500/E8501 XMB A/B/C/D Reserved
- 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
- 2641 LPC Interface Bridge (ICH6-M) (82801FBM)
- 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge
- 2651 82801FB (ICH6) SATA Controller
- 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller
- 2653 82801FBM (ICH6M) SATA Controller
- 2658 USB UHCI Controller *1 (82801FB/FR/FW/FRW)
- 2659 USB UHCI Controller *2 (82801FB/FR/FW/FRW)
- 265A USB UHCI Controller *3 (82801FB/FR/FW/FRW)
- 265B USB UHCI Controller *4 (82801FB/FR/FW/FRW)
- 265C USB 2.0 EHCI Controller (82801FB/FR/FW/FRW)
- 2660 PCI Express Port 1 (82801FB/FR/FW/FRW)
- 2662 PCI Express Port 2 (82801FB/FR/FW/FRW)
- 2664 82801FB (ICH6) PCIe Root Port 3
- 2666 PCI Express Port 4 (82801FB/FR/FW/FRW)
- 2668 82801FB (ICH6) High Definition Audio Controller
- 2669 jkn (2028026)
- 266A 82801FB (ICH6) SMBus Controller
- 266C LAN Controller (82801FB/FR/FW/FRW)
- 266D hp/Compal - http://service.marasst.com/Compal/DL75/HDL75%20driver%20Ver%2002/Modem.zip (czc82809kr)
- 266E VIA AC97 codec incorporated into VT82C686A/B, VT8231, VT8233/A/C, VT8235, VT8237/R, VT8251 Southbrid (VIA Technologies Vinyl AC'97 Codec Combo Driver (W)
- 266F PATA100 Controller - 266F (82801FB/FBM/FW/FR/FRW)
- 2670 LPC Interface Controller (631xESB/6321ESB/3100 )
- 2680 631xESB/632xESB/3100 Serial ATA Storage Controller
- 2681 LSI LOGIC, 62089A2, LSISAS1068 B0, T 0620, WE 119200.1 (62089A2)
- 2682 Enterprise Southbridge SATA cc=RAID
- 2683 Enterprise Southbridge SATA cc=RAID
- 2688 631xESB/632xESB/3100 Chipset USB Universal Host Controller *1
- 2689 631xESB/632xESB/3100 Chipset USB Universal Host Controller *2
- 268A 631xESB/632xESB/3100 Chipset USB Universal Host Controller *3
- 268B 631xESB/632xESB/3100 Chipset USB Universal Host Controller *4
- 268C 631xESB/632xESB/3100 Chipset USB2 Enhanced Host Controller
- 2690 631xESB/632xESB/3100 PCIe Root Port 1
- 2692 631xESB/632xESB/3100 PCIe Root Port 2
- 2694 631xESB/632xESB/3100 PCIe Root Port 3
- 2696 631xESB/632xESB/3100 PCIe Root Port 4
- 2698 Enterprise Southbridge AC'97 Audio
- 2699 Enterprise Southbridge AC'97 Modem
- 269A Enterprise Southbridge High Definition Audio
- 269B SMBus Controller (631xESB/6321ESB/3100)
- 269E 631xESB/632xESB/3100 Ultra ATA Storage Controller
- 2770 Host Bridge/DRAM Controller (82945G/GZ/P/PL)
- 2771 Host to PCI Express Bridge (82945G/GZ/P/PL)
- 2772 Integrated Graphics Device (82945G/GZ)
- 2774 82955X Memory Controller Hub
- 2775 82955X PCIe Root Port
- 2776 82945G Integrated Graphics Controller
- 2778 E7230/3000/3010 Processor to I/O Controller
- 2779 E7230/3000/3010 PCIe Root Port
- 277A 82975X PCIe Root Port
- 277C Intel 975X Express Chipset (82975X)
- 277D 82975X PCIe Root Port
- 2780 82915G/GV/GL, 82910GL Integrated Graphics Device (Secondary) (??)
- 2782 Graphics device: 82915G/GV/910GL Express Chipset Family (82915G)
- 2790 82915GM/GMS, 82910GML Integrated Graphics Device (Secondary) (??)
- 2792 Mobile Intel(R) 915GM/GMS/, 910GML Express Chipset Family (Mobile 82915GLx/x/x)
- 27A0 955XM/945GM/PM/GMS/940GML Express Processor to DRAM Controller
- 27A1 955XM/945GM/PM/GMS/940GML Express PCIe Root Port
- 27A2 Mobile 945GM/GU Express Integrated Graphics Controller
- 27A3 Intel Hardware Monitoring (Found on Apple Mac Family Computers)
- 27A6 Mobile 945GM/GU Express Integrated Graphics Controller
- 27AC Mobile 945GME Express Processor to DRAM Controller
- 27AD Mobile 945GME Express PCI Express Root Port
- 27AE Mobile 945 Express Chipset Family
- 27B0 82801GH (ICH7DH) LPC Interface Controller
- 27B1 82801GBM (ICH7) LPC Interface Controller
- 27B8 Intel 82801GB/GR (ICH7 Family) LPC Interface Controller - 27B8 (945GL)
- 27B9 82801GBM (ICH7-M) LPC Interface Controller
- 27BD 82801GHM (ICH7-M DH) LPC Interface Controller
- 27C0 82801GB/GR/GH (ICH7 Family) Serial ATA Storage Controller
- 27C1 82801GB I/O Controller Hub SATA cc=AHCI
- 27C3 82801GB I/O Controller Hub SATA cc=RAID
- 27C4 82801GBM/GHM (ICH7-M Family) Serial ATA Storage Controller
- 27C5 82801GB Mobile I/O Controller Hub SATA cc=AHCI
- 27C6 82801G (ICH7 Family) Serial ATA Storage Controller (RAID)
- 27C8 82801G (ICH7 Family) USB Universal Host Controller
- 27C9 82801G (ICH7 Family) USB Universal Host Controller
- 27CA 82801G (ICH7 Family) USB Universal Host Controller
- 27CB 82801G (ICH7 Family) USB Universal Host Controller
- 27CC 82801G (ICH7 Family) USB 2.0 Enhanced Host Controller
- 27D0 82801G (ICH7 Family) PCIe Root Port
- 27D2 82801G (ICH7 Family) PCIe Root Port
- 27D4 82801G (ICH7 Family) PCIe Root Port
- 27D6 82801G (ICH7 Family) PCIe Root Port
- 27D8 IDT High Definition Audio Driver (BA101897)
- 27DA Intel[R] 82801G (ICH7 Family) C- 27DA (82801G)
- 27DC Intel PRO/100 VE Desktop Adapter (GF)
- 27DD 82801GB I/O Controller Hub AC'97 Modem
- 27DE 82801GB I/O Controller Hub AC'97 Audio
- 27DF 82801G (ICH7 Family) Ultra ATA Storage Controller
- 27E0 82801GR/GH/GHM (ICH7 Family) PCIe Root Port
- 27E2 82801GR/GH/GHM (ICH7 Family) PCIe Root Port
- 2802 INTEL(R) HIGH DEFINITION AUDIO HDMI (8086)
- 2810 82801HB/HR (ICH8/R) LPC Interface Controller
- 2811 82801HBM (ICH8M) LPC Interface Controller
- 2812 82801HH (ICH8DH) LPC Interface Controller
- 2814 82801HO (ICH8DO) LPC Interface Controller
- 2815 82801HEM (ICH8M-E) LPC Interface Controller
- 2820 SATA IDE Controller:4 port (82801HB/HR/HH/HO)
- 2821 82801 (ICH8R) SATA AHCI Controller
- 2822 Raid Controller (82801HR/HH/HO&82801IR/IH/IO(AIE=0)/ICH10R)
- 2824 82801HR/HO/HH (ICH8R/DO/DH) SATA AHCI Controller
- 2825 82801H (ICH8 Family) 2 port SATA Controller
- 2828 82801 (ICH8M) 3 port SATA Controller
- 2829 Mobile SATA AHCI Controller
- 282A Raid Controller (ICH8ME/9ME)
- 2830 82801H (ICH8 Family) USB UHCI *1
- 2831 82801H (ICH8 Family) USB UHCI *2
- 2832 82801H (ICH8 Family) USB UHCI *3
- 2834 82801H (ICH8 Family) USB UHCI *4
- 2835 82801H (ICH8 Family) USB UHCI *5
- 2836 82801H (ICH8 Family) USB2 EHCI *1
- 283A ICH8 Enhanced USB2 Enhanced Host Controller (81EC1043 (?))
- 283E SM Bus Controller (PCIVEN_8086&DEV_283E&SUBSYS_FF641179&REV_033&B1B)
- 283F 82801H (ICH8 Family) PCIe Port 1
- 2841 82801H (ICH8 Family) PCIe Port 2
- 2843 82801H (ICH8 Family) PCIe Port 3
- 2845 82801H (ICH8 Family) PCIe Port 4
- 2847 82801H (ICH8 Family) PCIe Port 5
- 2849 82801H (ICH8 Family) PCIe Port 6
- 284B Intel audio controller embedded with the 82801H chipset ( ICH8 chipset ) (82801H)
- 284F 82801H (ICH8 Family) Thermal Reporting Device
- 2850 82801H (ICH8 Family) Ultra ATA Storage Controllers
- 28B4 Management Engine Interface
- 28C4 Management Engine Interface
- 28D4 Management Engine Interface
- 28E4 Management Engine Interface
- 28F4 Management Engine Interface
- 2910 82801IB/IR/IH (ICH9 Family) LPC Interface Controller
- 2911 82801IB/IR/IH (ICH9 Family) Mobile LPC Interface Controller
- 2912 82801IH (ICH9DH) LPC Interface Controller
- 2913 82801IB/IR/IH (ICH9 Family) MDH LPC Interface Controller
- 2914 82801IB/IR/IH (ICH9 Family) DO LPC Interface Controller
- 2915 82801IB/IR/IH (ICH9 Family) MDO LPC Interface Controller
- 2916 82801IR (ICH9R) LPC Interface Controller
- 2917 ICH9M-E LPC Interface Controller
- 2918 82801IB (ICH9) LPC Interface Controller
- 2919 ICH9M LPC Interface Controller
- 2920 82801IB/IR/IH (ICH9 Family) 4 port Serial ATA Storage Controller 1
- 2921 82801IB/IR/IH (ICH9 Family) 2 port Serial ATA Storage Controller 1
- 2922 82801IB/IR/IH (ICH9 Family) 6 port SATA AHCI Controller
- 2923 82801IB/IR/IH (ICH9 Family) 4 port SATA AHCI Controller
- 2925 82801IB/IR/IH (ICH9 Family) SATA RAID Controller
- 2926 82801IB/IR/IH (ICH9 Family) 2 port Serial ATA Storage Controller 2
- 2928 82801IB/IR/IH (ICH9 Family) Mobile 2 port Serial ATA Storage Controller 1
- 2929 82801IB/IR/IH (ICH9 Family) Mobile SATA AHCI Controller
- 292C 82801IB/IR/IH (ICH9 Family) Mobile SATA RAID Controller
- 292D 82801IB/IR/IH (ICH9 Family) Mobile 2 port Serial ATA Storage Controller 2
- 292E 82801IB/IR/IH (ICH9 Family) Mobile 1 port Serial ATA Storage Controller 2
- 2930 Intel(R) ICH9 Family SMBus Controller working fine with http://download.cnet.com/Chipset-Driver-Inte (8086)
- 2932 82801IB/IR/IH (ICH9 Family) Thermal Subsystem
- 2934 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2935 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2936 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2937 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2938 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 2939 82801IB/IR/IH (ICH9 Family) USB Universal Host Controller
- 293A 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293B 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293C 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293D 82801IB/IR/IH (ICH9 Family) USB2 Enhanced Host Controller
- 293E 82801IB/IR/IH (ICH9 Family) HD Audio Controller
- 2940 82801IB/IR/IH (ICH9 Family) PCIe Root Port 1
- 2941 82801IB/IR/IH (ICH9 Family) PCIe Root Port 1
- 2942 82801IB/IR/IH (ICH9 Family) PCIe Root Port 2
- 2943 82801IB/IR/IH (ICH9 Family) PCIe Root Port 2
- 2944 82801IB/IR/IH (ICH9 Family) PCIe Root Port 3
- 2945 82801IB/IR/IH (ICH9 Family) PCIe Root Port 3
- 2946 82801IB/IR/IH (ICH9 Family) PCIe Root Port 4
- 2947 82801IB/IR/IH (ICH9 Family) PCIe Root Port 4
- 2948 82801IB/IR/IH (ICH9 Family) PCIe Root Port 5
- 2949 82801IB/IR/IH (ICH9 Family) PCIe Root Port 5
- 294A 82801IB/IR/IH (ICH9 Family) PCIe Root Port 6
- 294B 82801IB/IR/IH (ICH9 Family) PCIe Root Port 6
- 294C Intel(R) 82566DC-2 Gigabit Network Connection (82566DC-2)
- 2970 946GZ/PL/GL Processor to I/O Controller
- 2971 946GZ/PL/GL PCIe Root Port
- 2972 Onboard Video Device for 82946GZ chips (82946GZ )
- 2973 946GZ/GL Integrated Graphics Controller
- 2974 946GZ/GL HECI Controller
- 2975 946GZ/GL HECI Controller
- 2976 946GZ/GL PT IDER Controller
- 2977 946GZ/GL KT Controller
- 2980 Processor to I/O Controller
- 2981 PCIe Root Port
- 2982 G965 Graphics Media Accelerator
- 2983 G965 Graphics Media Accelerator
- 2984 82G35 Express HECI Controller
- 2987 Active Management Technology - SOL
- 2990 Q963/Q965 Memory Controller Hub
- 2991 Q963/Q965 PCIe Root Port
- 2992 Intel(R) Express Chipset video (Q965/Q963)
- 2993 Q963/Q965 Integrated Graphics Controller
- 2994 intel management engine interface (0x8086)
- 2995 Q963/Q965 HECI Controller
- 2996 Q963/Q965 PT IDER Controller
- 2997 Intel PCI Serial Port (Q965/Q963)
- 29A0 Intel P965/G965 Processor to I/O Controller (?(82P965))
- 29A1 Intel P965/G965 PCI Express Root Port (?(82Q965, 82G965, 82P965))
- 29A2 G965 Integrated Graphics Controller
- 29A3 G965 Integrated Graphics Controller
- 29A4 The Intel Management Engine provides thermal management for Intel Desktop Boards. (Intel DG965SS)
- 29A5 P965/G965 HECI Controller
- 29A6 P965/G965 PT IDER Controller
- 29A7 P965/G965 KT Controller
- 29B0 Q35 (??) DRAM Controller
- 29B1 Q35 (??) PCIe Root Port
- 29B2 Intel(R) Q35 Express Chipset Family (Q35)
- 29B3 Q35 (??) Integrated Graphics Controller
- 29B4 Intel(R) Management Engine Interface (HECI) (Q35-Chipset)
- 29B5 Q35 (??) HECI Controller
- 29B6 Q35 (??) PT IDER Controller
- 29B7 Q35 (??) Serial KT Controller
- 29C0 P35/G33 (Bearlake) Processor to I/O Controller
- 29C1 P35/G33 (Bearlake) PCIe Root Port
- 29C2 P35/G33 (Bearlake) Integrated Graphics Controller
- 29C3 P35/G33 (Bearlake) Integrated Graphics Controller
- 29C4 Intel ME: Management Engine Interface (Intel DG33fb)
- 29C5 P35/G33 (Bearlake) HECI Controller
- 29C6 P35/G33 (Bearlake) PT IDER Controller
- 29C7 P35/G33 (Bearlake) Serial KT Controller
- 29CF P35/G33 (Bearlake) Virtual HECI Controller
- 29D0 Q33 (Bearlake) Processor to I/O Controller
- 29D1 Q33 (Bearlake) PCIe Root Port
- 29D2 Q33 (Bearlake) Integrated Graphics Controller
- 29D3 Q33 (Bearlake) Integrated Graphics Controller
- 29D4 Intel Management Interface (82801)
- 29D5 Q33 (Bearlake) HECI Controller
- 29D6 Q33 (Bearlake) PT IDER Controller
- 29D7 Q33 (Bearlake) Serial KT Controller
- 29E0 X38/X48 (Bearlake) Processor to I/O Controller
- 29E1 X38/X48 (Bearlake) PCIe Root Port 1
- 29E4 X38/X48 (Bearlake) HECI Controller
- 29E5 X38/X48 (Bearlake) HECI Controller
- 29E6 X38/X48 (Bearlake) PT IDER Controller
- 29E7 X38/X48 (Bearlake) Serial KT Controller
- 29E9 X38/X48 (Bearlake) PCIe Root Port 2
- 29F0 3200 Chipset (Bearlake) Processor to I/O Controller
- 29F1 3200 Chipset (Bearlake) PCIe Root Port 1
- 29F4 3200 Chipset (Bearlake) Server HECI Controller
- 29F5 3200 Chipset (Bearlake) Server HECI Controller
- 29F6 3200 Chipset (Bearlake) Server PT IDER Controller
- 29F7 3200 Chipset (Bearlake) Server Serial KT Controller
- 29F9 3200 Chipset (Bearlake) PCIe Root Port 2
- 2A00 Mobile PM965/GM965/GL960 Express Processor to DRAM Controller
- 2A01 Mobile PM965/GM965/GL960 Express PCIe Root Port
- 2A02 Mobile 965 Express Integrated Graphics Controller
- 2A03 Mobile 965 Express Integrated Graphics Controller
- 2A04 Intel PCI communication controller (Q965/Q96)
- 2A05 Mobile HECI Controller
- 2A06 Mobile PT IDER Controller
- 2A07 Intel PCI Serial Port (Q965/Q963)
- 2A08 Intel(R) Extended Thermal Model MCH (Q965 Chipset)
- 2A10 Mobile GME965/GLE960 Express Processor to DRAM Controller
- 2A11 Mobile GME965/GLE960 Express PCI Express Root Port
- 2A12 Mobile 965 Express Chipset Family
- 2A13 Mobile 965 Express Chipset Family
- 2A14 Mobile GME965/GLE960 MEI Controller
- 2A15 Mobile GME965/GLE960 MEI Controller
- 2A16 Mobile GME965/GLE960 PT IDER Controller
- 2A17 Mobile GME965/GLE960 KT Controller
- 2A40 Mobile Memory Controller Hub
- 2A41 Mobile PCI Express Graphics Port
- 2A42 Intel Mobile Graphic (Mobile Intel 4 Series Chipset Family)
- 2A43 Intel Mobile Graphic (Mobile Intel 4 Series Chipset Family)
- 2A44 Intel Management Engine Interface (Mobile 4 Series Chipset)
- 2A47 Active Management Technology - SOL (20EC17AA)
- 2A50 Mobile MEI Controller
- 2A51 Mobile MEI Controller
- 2A52 Mobile PT IDER Controller
- 2A53 Mobile AMT SOL Redirection
- 2C01 QuickPath Architecture System Address Decoder
- 2C10 QuickPath Interconnect Link 0
- 2C11 QuickPath Interconnect Physical 0
- 2C14 QuickPath Interconnect Link 1
- 2C18 QuickPath Memory Controller
- 2C19 QuickPath Memory Controller Target Address Decoder
- 2C1A QuickPath Memory Controller RAS Registers
- 2C1C QuickPath Memory Controller Test Registers
- 2C20 QuickPath Memory Controller Channel 0 Control Registers
- 2C21 QuickPath Memory Controller Channel 0 Address Registers
- 2C22 QuickPath Memory Controller Channel 0 Rank Registers
- 2C23 QuickPath Memory Controller Channel 0 Thermal Control Registers
- 2C28 QuickPath Memory Controller Channel 1 Control Registers
- 2C29 QuickPath Memory Controller Channel 1 Address Registers
- 2C2A QuickPath Memory Controller Channel 1 Rank Registers
- 2C2B QuickPath Memory Controller Channel 1 Thermal Control Registers
- 2C30 QuickPath Memory Controller Channel 2 Control Registers
- 2C31 QuickPath Memory Controller Channel 2 Address Registers
- 2C32 QuickPath Memory Controller Channel 2 Rank Registers
- 2C33 QuickPath Memory Controller Channel 2 Thermal Control Registers
- 2C40 QuickPath Architecture Generic Non-Core Registers
- 2E00 DRAM Controller
- 2E01 PCI Express Root Port
- 2E02 Integrated Graphics Controller
- 2E03 Integrated Graphics Controller
- 2E04 HECI Controller
- 2E05 HECI Controller
- 2E06 PT IDER Controller
- 2E07 Serial KT Controller
- 2E14 Intel Active Client Manager HECI Device (PCIVEN_8086&DEV_2E14&SUBSYS_3035103C&REV_03B1B68)
- 2E17 Intel PCI Serial Port (CC_0700)
- 2E24 Intel Management Engine Interface (PCIVEN_8086&DEV_2E24&SUBSYS_028A1028&REV_03)
- 2E32 Intel G41 express graphics (PCIVEN_8086&DEV_2E32&SUBSYS_31031565&REV_033&115)
- 2F00 multimedia audio device (codec AC97) SoundMAX or VIA (815B104D)
- 3092 I2O 1.5 RAID Controller (SRCU32)
- 3200 31244 PCI-X to Serial ATA Controller
- 3313 IOP348 I/O Processor (SL8e) in IOC Mode SAS/SATA
- 331B IOP348 I/O Processor (SL8x) in IOC Mode SAS/SATA
- 3331 IOC340 I/O Controller (VV8e) SAS/SATA
- 3339 IOC340 I/O Controller (VV8x) SAS/SATA
- 3340 82855PM Processor to I/O Controller
- 3341 82855PM Processor to AGP Controller
- 3342 Power Management (82855PM)
- 3363 IOC340 I/O Controller in IOC Mode SAS/SATA
- 33C3 IOP348 I/O Processor (SL8De) in IOC Mode SAS/SATA
- 33CB IOP348 I/O Processor (SL8Dx) in IOC Mode SAS/SATA
- 3400 QuickPath Architecture I/O Hub to ESI Port
- 3401 QuickPath Architecture I/O Hub to ESI Port
- 3402 QuickPath Architecture I/O Hub to ESI Port
- 3403 QuickPath Architecture I/O Hub to ESI Port
- 3404 QuickPath Architecture I/O Hub to ESI Port
- 3405 QuickPath Architecture I/O Hub to ESI Port
- 3406 QuickPath Architecture I/O Hub to ESI Port
- 3407 QuickPath Architecture I/O Hub to ESI Port
- 3408 QuickPath Architecture I/O Hub PCI Express Root Port 1
- 3409 QuickPath Architecture I/O Hub PCI Express Root Port 2
- 340A QuickPath Architecture I/O Hub PCI Express Root Port 3
- 340B QuickPath Architecture I/O Hub PCI Express Root Port 4
- 340C QuickPath Architecture I/O Hub PCI Express Root Port 5
- 340D QuickPath Architecture I/O Hub PCI Express Root Port 6
- 340E QuickPath Architecture I/O Hub PCI Express Root Port 7
- 340F QuickPath Architecture I/O Hub PCI Express Root Port 8
- 3410 QuickPath Architecture I/O Hub PCI Express Root Port 9
- 3411 QuickPath Architecture I/O Hub PCI Express Root Port 10
- 3418 Quickpath Interconnect Physical Layer Port 0
- 3419 Quickpath Interconnect Physical Layer Port 1
- 3420 QuickPath Architecture I/O Hub PCI Express Root Port 0
- 3421 QuickPath Architecture I/O Hub PCI Express Root Port 0
- 3422 QuickPath Architecture I/O Hub GPIO and Scratch Pad Registers
- 3423 QuickPath Architecture I/O Hub Control Status and RAS Registers
- 3425 QuickPath Interconnect Physical and Link Layer Registers - Port 0
- 3426 QuickPath Interconnect Routing and Protocol Layer Registers - Port 0
- 3427 QuickPath Interconnect Physical and Link Layer Registers - Port 1
- 3428 QuickPath Interconnect Routing & Protocol Layer Registers - Port 1
- 3429 DMA Engine
- 342A DMA Engine
- 342B DMA Engine
- 342C DMA Engine
- 342D QuickPath Architecture I/O Hub I/OxAPIC Interrupt Controller
- 342E QuickPath Architecture I/O Hub System Management Registers
- 342F Trusted Execution Technology Registers
- 3430 DMA Engine
- 3431 DMA Engine
- 3432 DMA Engine
- 3433 DMA Engine
- 3438 QuickPath Architecture I/O Hub Throttle Registers
- 348D Gigabit Ethernet Controller (82541EI)
- 3500 631xESB/632xESB PCIe Upstream Port
- 3501 6310ESB PCIe Upstream Port
- 3504 631xESB/632xESB I/OxAPIC Interrupt Controller
- 3505 6310ESB I/OxAPIC Interrupt Controller
- 350C 631xESB/632xESB PCIe to PCI-X Bridge
- 350D 6310ESB PCIe to PCI-X Bridge
- 3510 631xESB/632xESB PCIe Downstream Port E1
- 3511 6310ESB PCIe Downstream Port E1
- 3514 631xESB/632xESB PCIe Downstream Port E2
- 3515 6310ESB PCIe Downstream Port E2
- 3518 631xESB/632xESB PCIe Downstream Port E3
- 3519 6310ESB PCIe Downstream Port E3
- 3575 Host-Hub I/F Bridge / SDRAM Controller (82830[MP])
- 3576 82830M/MP CPU to AGP Bridge
- 3577 Integrated Graphics Device (82830M/MG)
- 3578 CPU to I/O Bridge (82830[MP])
- 3579 82835 SDRAM Controlller / Host-Hub Interface Bridge
- 357B 82835 Integrated Graphics Device
- 3580 82852GM/GME/GMV/PM, 855GM/GME Montara Host-Hub Interface Bridge
- 3581 82852GME/PM Montara Virtual PCI to AGP Bridge
- 3582 82852GM/GME/GMV/PM, 855GM/GME Montara Integrated Graphics Device
- 3584 82852GM/GME/GMV/PM, 855GM/GME Montara System Memory Controller
- 3585 82852GM/GME/GMV/PM, 855GM/GME Montara Configuration Process
- 3590 E7520 Server Memory Controller Hub
- 3591 E752x Memory Controller Hub Error Reporting Registers
- 3592 E732x Server Memory Controller Hub
- 3593 E752x Memory Controller Hub Error Reporting Registers
- 3594 E752x Memory Controller Hub DMA Controller
- 3595 E752x Memory Controller Hub PCIe Port A0
- 3596 E752x Memory Controller Hub PCIe Port A1
- 3597 E752x Memory Controller Hub PCIe Port B0
- 3598 E752x Memory Controller Hub PCIe Port B1
- 3599 E752x Memory Controller Hub PCIe Port C0
- 359A E752x Memory Controller Hub DMA Controller
- 359B E752x Memory Controller Hub Extended Configuration Registers
- 359E E7525 Workstation Memory Controller Hub
- 35B0 3100 Chipset Memory I/O Controller Hub
- 35B1 3100 Chipset DRAM Controller Error Reporting Registers
- 35B5 3100 Chipset Enhanced DMA Controller
- 35B6 3100 Chipset PCIe Port A
- 35B7 3100 Chipset PCIe Port A1
- 35C8 3100 Chipset Extended Configuration Test Overflow Registers
- 3600 7300 Chipset (Caneland) Memory Controller Hub
- 3604 7300 Chipset (Caneland) PCIe Port 1
- 3605 7300 Chipset (Caneland) PCIe Port 2
- 3606 7300 Chipset (Caneland) PCIe Port 3
- 3607 7300 Chipset (Caneland) PCIe Port 4
- 3608 7300 Chipset (Caneland) PCIe Port 5
- 3609 7300 Chipset (Caneland) PCIe Port 6
- 360A 7300 Chipset (Caneland) PCIe Port 7
- 360B who knows&erka (PCIVEN_8086&DEV_2448&SUBSYS_00000000&REV8813&18d)
- 360C 7300 Chipset (Caneland) FSB Registers
- 360D 7300 Chipset (Caneland) Snoop Filter Registers
- 360E 7300 Chipset (Caneland) Debug and Miscellaneous Registers
- 360F 7300 Chipset (Caneland) FBD Branch 0 Registers
- 3610 7300 Chipset (Caneland) FBD Branch 1 Registers
- 3A00 ICH10 4 port SATA IDE Controller (ICH10 Family)
- 3A01 2 port SATA IDE Controller
- 3A02 ICH10D SATA Controller (82801JD)
- 3A03 4 port SATA AHCI Controller
- 3A05 ICH10D SATA Controller (82801JD)
- 3A06 SATA2(2Port1) (ICH10 Family)
- 3A10 LPC Interface Controller
- 3A14 82801JDO ICH10DO (82801JDO)
- 3A16 LPC Interface Controller
- 3A18 LPC Interface Controller
- 3A1A LPC Interface Controller
- 3A1E LPC Interface Controller
- 3A20 SATA2(4Port2) (ICH10 Family)
- 3A21 2 port SATA IDE Controller
- 3A22 6 port SATA AHCI Controller
- 3A23 4 port SATA AHCI Controller
- 3A25 SATA RAID Controller
- 3A26 SATA2(2Port2) (ICH10 Family)
- 3A30 SMB controller (50011458)
- 3A32 Thermal Subsystem
- 3A34 USB UHCI Controller *1
- 3A35 USB UHCI Controller *2
- 3A36 USB UHCI Controller *3
- 3A37 USB UHCI Controller *4
- 3A38 USB UHCI Controller *5
- 3A39 USB UHCI Controller *6
- 3A3A USB EHCI Controller *1
- 3A3C USB EHCI Controller *2
- 3A3E Microsoft UAA Bus Driver for High Definition Audio (Microsoft UAA Bus Driver for High Definition Audio)
- 3A40 PCI Express Port 1
- 3A42 PCI Express Port 2
- 3A44 PCI Express Port 3
- 3A46 PCI Express Port 4
- 3A48 PCI Express Port 5
- 3A4A PCI Express Port 6
- 3A4C Gigabit Ethernet Controller
- 3A51 VECI Controller
- 3A55 Virtual SATA Contoller
- 3A60 SM-Bus Controller (ICH10)
- 3A62 Thermal Subsystem
- 3A64 USB UHCI Controller *1
- 3A65 USB UHCI Controller *2
- 3A66 USB UHCI Controller *3
- 3A67 USB UHCI Controller *4
- 3A68 USB UHCI Controller *5
- 3A69 USB UHCI Controller *6
- 3A6A USB EHCI Controller *1
- 3A6C USB EHCI Controller *2
- 3A6E HD Audio Controller
- 3A70 PCI Express Port 1
- 3A72 PCI Express Port 2
- 3A74 PCI Express Port 3
- 3A76 PCI Express Port 4
- 3A78 PCI Express Port 5
- 3A7A PCI Express Port 6
- 3A7C Gigabit Ethernet Controller
- 3B20 IBEX SATA Controller
- 3B21 IBEX SATA Controller
- 3B22 IBEX AHCI Controller(6Port) (Intel Q57 Express)
- 3B23 IBEX AHCI Controller(4Port)
- 3B26 IBEX SATA Controller
- 3B28 IBEX SATA Controller
- 3B29 IBEX AHCI Controller(4Port)
- 3B2E IBEX SATA Controller
- 3B2F IBEX AHCI Controller(6Port)
- 4000 V.90 HaM Modem (Creatix)
- 4001 5400A Chipset Memory Controller Hub
- 4003 5400B Chipset Memory Controller Hub
- 4008 5400 Series Chipset Memory Controller Hub
- 4010 5400 Series Chipset Memory Controller Hub
- 4021 5400 Series Chipset PCIe Port 1
- 4022 5400 Series Chipset PCIe Port 2
- 4023 5400 Series Chipset PCIe Port 3
- 4024 5400 Series Chipset PCIe Port 4
- 4025 5400 Series Chipset PCIe Port 5
- 4026 5400 Series Chipset PCIe Port 6
- 4027 5400 Series Chipset PCIe Port 7
- 4028 5400 Series Chipset PCIe Port 8
- 4029 5400 Series Chipset PCIe Port 9
- 402D 5400 Series Chipset PCI Express Ports 4 - 1 and ESI port
- 402E 5400 Series Chipset PCI Express Ports 9 - 5
- 402F 5400 Series Chipset DMA/DCA Engine
- 4030 5400 Series Chipset FSB Registers
- 4031 5400 Series Chipset Coherency Engine, Data Manager and Snoop Filter.
- 4032 5400 Series Chipset I/OxAPIC
- 4035 5400 Series Chipset Channel Control for FB-DIMM Branch 0
- 4036 5400 Series Chipset Channel Control for FB-DIMM Branch 1
- 4220 driverIntel PRO/Wireless 2200BG (MPCI3B)
- 4222 Intel 3945ABG Wireless LAN controller (10208086)
- 4223 Intel (R) PRO/Wireless 2200BG Network Connection, (R) PRO/Wireless 2915ABG Network Connection (2915ABG)
- 4224 802.11a/b/g WLan adapter (Intel Pro Wireless 2915ABG)
- 4227 PRO/Wireless 3945ABG Network Connection
- 4228 PRO/Wireless 3965ABG Network Connection
- 4229 Intel Wireless WiFi Link 4965AGN(supporting 802.11a/b/g/Draft-N) (Intel 4965AGN)
- 422D Intel Wireless WiFi Link 4965AGN (Intel 4965AGN)
- 4230 Intel Wireless WiFi Link 4965AGN (Intel 4965AGN)
- 4232 Carte Intel WiFi Link 5100 AGN (Intel WiFi Link 5100)
- 4233 Intel Wireless WiFi Link 4965AGN (Intel 4965AGN)
- 4235 Intel WiFi Link 5300 AGN (5300AGN)
- 4237 Intel (R) WiFi Link 5100 AGN (5100 AGN)
- 4318 Dell Wireless 1370 WLAN Mini-PCI Card (1370 (0280))
- 444D Flash Cache Logic Chip
- 444E Intel TurboMemory (TurboMemory)
- 4813 Dell Wireless 1370 WLAN Mini-PCI Card (1370 (0280))
- 4888 intel 3945abg wireless lan controller
- 5001 Modem - PPP (Device0000004c)
- 5002 LE80578 Graphics Processor Unit
- 5005 Modem - PPPoA (PRO/DSL 2200)
- 5009 LE80578 Video Display Controller
- 500D LE80578 Expansion Bus
- 500E LE80578 UART Controller
- 500F LE80578 General Purpose IO
- 5010 LE80578 I2C Controller
- 5012 LE80578 Serial Peripheral Interface Bus
- 5020 Memory Controller Hub
- 5021 DRAM Error Reporting Registers
- 5023 EDMA Controller
- 5024 PCI Express Port PEA0
- 5025 PCI Express Port PEA1
- 5028 S-ATA IDE
- 5029 AHCI Controller (?(EP80579))
- 502A S-ATA RAID0/1
- 502B S-ATA Reserved
- 502C System Device
- 5030 System Device
- 5031 LPC Bus
- 5032 SMBus Controller
- 5033 USB 1.1 Controller
- 5035 USB 2.0 Controller
- 5037 PCI-PCI Bridge (transparent mode)
- 5039 Controller Area Network (CAN) interface *1
- 503A Controller Area Network (CAN) interface *2
- 503B Synchronous Serial Port (SPP)
- 503C IEEE 1588 Hardware Assist
- 503D Local Expansion Bus
- 503E Global Control Unit (GCU)
- 503F System Device
- 5040 Gigabit Ethernet MAC
- 5041 Gigabit Ethernet MAC
- 5042 Gigabit Ethernet MAC
- 5043 Gigabit Ethernet MAC
- 5044 Gigabit Ethernet MAC
- 5045 Gigabit Ethernet MAC
- 5046 Gigabit Ethernet MAC
- 5047 Gigabit Ethernet MAC
- 5048 Gigabit Ethernet MAC
- 5049 Gigabit Ethernet MAC
- 504A Gigabit Ethernet MAC
- 504B Gigabit Ethernet MAC
- 504C TDM
- 5200 EtherExpress PRO/100 Server PCI to PCI Bridge
- 5201 EtherExpress PRO/100 Server Ethernet Adapter
- 5309 I/O Processor Address Translation Unit (80303)
- 530D I/O Companion Unit Address Translation (80312)
- 5378 GW80314 I/O Companion Chip (with SRAM)
- 5379 GW80314 I/O Companion Chip (without SRAM)
- 537C 31154 133MHz PCI-X to PCI-X Bridge
- 65C0 5100 Chipset Memory Controller Hub (??)
- 65E0 5100 Chipset Memory Controller Hub (??)
- 65E2 5100 Chipset PCIe x4 Port 2
- 65E3 5100 Chipset PCIe x4 Port 3
- 65E4 5100 Chipset PCIe x4 Port 4
- 65E5 5100 Chipset PCIe x4 Port 5
- 65E6 5100 Chipset PCIe x4 Port 6
- 65E7 5100 Chipset PCIe x4 Port 7
- 65F0 5100 Chipset FSB Registers
- 65F1 5100 Chipset Reserved Registers
- 65F3 5100 Chipset Miscellaneous Registers
- 65F5 5100 Chipset DDR Channel 0 Registers
- 65F6 5100 Chipset DDR Channel 1 Registers
- 65F7 5100 Chipset PCIe x8 Port 2-3
- 65F8 5100 Chipset PCIe x8 Port 4-5
- 65F9 5100 Chipset PCIe x8 Port 6-7
- 65FA 5100 Chipset PCIe x16 Port 4-7
- 65FF 5100 Chipset DMA Engine
- 6960 EHCI 960 Emulator
- 7000 PIIX3 PCI-to-ISA Bridge (Triton II) (82371SB)
- 7010 PIIX3 IDE Interface (Triton II) (82371SB)
- 7020 PIIX3 USB Host Controller (Triton II) (82371SB)
- 7030 82437VX 430VX System Controller
- 7050 Intercast Video Capture Card
- 7051 Intel Business Video Conferencing Card (PB 642365-003)
- 7100 System Controller (MTXC), part of 430TX chipset (82439TX)
- 7110 PIIX4/4E/4M ISBridgeA (82371AB/EB/MB)
- 7111 PIIX4/4E/4M IDE Controller (82371AB/EB/MB)
- 7112 PIIX4/4E/4M USB Interface (82371AB/EB/MB)
- 7113 PIIX4/4E/4M Power Management Controller (82371AB/EB/MB)
- 7120 Host-Hub Interface Bridge / DRAM Ctrlr (Intel(R) 82801IMB)
- 7121 82810 810 Chipset Graphics Controller
- 7122 Host-Hub Interface Bridge / DRAM Ctrlr (82810-DC100)
- 7123 Intel 82810 Graphics Controller (82810-DC100)
- 7124 82810E 810e Host-Hub Interface and Memory Controller
- 7125 Intel Direct AGP 810 Chipset (82810E)
- 7126 82810 810 Chipset Host Bridge and Memory Controller Hub
- 7127 82810E 810 Chipset Graphics Controller (at 133MHz)
- 7128 82810-M DC-100 810 Chipset Host Bridge and Graphics Controller
- 712A 82810-M DC-133 810 Chipset Host Bridge and Graphics Controller
- 7180 Host/PCI bridge in 440LX/EX AGP chipset (rmc)
- 7181 AGP device in 440LX/EX AGP chipset (82443 ex/lx)
- 7182 intel (440LX/EX)
- 7190 82443BX/ZX 440BX/ZX CPU to PCI Bridge (AGP Implemented)
- 7191 440BX/ZX AGPset PCI-to-PCI bridge (82443BX/ZX)
- 7192 82443BX/ZX 440BX/ZX CPU to PCI Bridge (AGP Not Implemented)
- 7194 82440MX CPU to I/O Controller
- 7195 AC97 Audio Controller (82443MX)
- 7196 AC97 Modem Controller (Winmodem) (82440 - 443MX)
- 7198 PCI to ISA Bridge (82443MX)
- 7199 EIDE Controller (82443MX)
- 719A USB Universal Host Controller (82443MX)
- 719B Power Management Controller (82443MX)
- 71A0 82443GX 440GX CPU to PCI Bridge (AGP Implemented)
- 71A1 fabricated by Intel (intel 82801 IB ICH9 )
- 71A2 82443GX 440GX CPU to PCI Bridge (AGP Not Implemented)
- 7221 graphics device (82810)
- 7600 82472FB/82468GX PCI to ISA/LPC Bridge
- 7601 82472FB/82468GX PCI EIDE Controller
- 7602 82472FB/82468GX USB Universal Host Controller
- 7603 82472FB/82468GX System Management Bus Controller
- 7605 IEEE1394 OpenHCI Host Controller (82372FB)
- 7800 Intel740 AGP Graphics Accelerator
- 8002 Trusted Execution Technology
- 8003 Trusted Execution Technology Registers
- 803B 0x81ef (0x104d)
- 8086 PRO/100 VE Network Connection (24D0)
- 811A Atom SCH PATA (Atom SCH)
- 84C4 82454KX/GX 450KX/GX Orion System Controller
- 84C5 450KX/GX Memory Controller (Orion) (82453KX/GX)
- 84CA 450NX PCIset Memory & I/O Controller (82451NX)
- 84CB 82454NX/82467GX 450NX PCI Expander Bridge
- 84E0 82460GX 460GX System Address Controller
- 84E1 82460GX 460GX System Data Controller
- 84E2 82460GX 460GX AGP Bridge (GXB Function 2)
- 84E3 82460GX 460GX Memory Address Controller
- 84E4 82460GX 460GX Memory Data Controller
- 84E6 82466GX 460GX Wide and fast PCI eXpander Bridge
- 84EA 82460GX 460GX AGP Bridge (GXB Function 1)
- 8500 IXP4XX - Intel Network Processor family. IXP420, IXP421, IXP422, IXP425 and IXC1100
- 85A1 LPC Bridge (6300ESB)
- 85A2 IDE Controller (6300ESB)
- 85A3 Serial ATA Controller (6300ESB)
- 85A4 SMBus Controller (6300ESB)
- 85A6 AC'97 Audio Controller (6300ESB)
- 85A7 AC'97 Modem Controller (6300ESB)
- 85A9 USB 1.1 UHCI Controller *1 (6300ESB)
- 85AA USB 1.1 UHCI Controller *2 (6300ESB)
- 8671 ?
- 9000 IXP2000 Family Network Processor
- 9001 IXP2400 Network Processor
- 9002 IXP2300 Network Processor
- 9004 IXP2800 Network Processor
- 9620 I2O RAID PCI to PCI Bridge
- 9621 SRCU21 I2O 1.5 RAID Controller (F/W<6.0)
- 9622 SRCUxx I2O 1.5 RAID Controller (F/W<6.0)
- 9641 SRCU31 I2O 1.5 RAID Controller (F/W<6.0)
- 96A1 SRCU31L I2O 1.5 RAID Controller (F/W<6.0)
- 9874 AUDIO CONTROLLER (AC97)
- 9876 intel brokdale (i845)
- 9877 1
- 9888 HDAUDIOFUNC_01&VEN_8086&DEV_2802&REV_1000 (HDAUDIOFUNC_01&VEN_8086&DEV_2802&SUBSYS_80860101&)
- 9999 Interface chip (pci30b2103c)
- A01F PRO/10GbE LR Server Adapter retail verson
- A11F PRO/10GbE LR Server Adapter OEM version
- A620 6400/6402 Advanced Memory Buffer (AMB)
- B152 PCI to PCI Bridge (S21152BB)
- B154 S21152BA,S21154AE/BE PCI to PCI Bridge
- B555 21555 Non-transparent PCI to PCI Bridge
- FFFF 82450KX/GX Orion Cache/DRAM Controller (Buggy ID)
-80EE InnoTek Systemberatung GmbH
- BEEF VirtualBox Graphics Adapter
- CAFE VirtualBox Guest Service
-8384 Sigmatel Inc (??)
- 7618 High Definition Audio Codec
- 7670 9770 High Definition Audio
- 7672 9772 High Definition Audio
-8401 TRENDware International Inc
-8686 ScaleMP
- 1010 vSMPowered system controller [vSMP CTL]
-8800 Trigem Computer
- 2008 Video assistent component
-8866 T-Square Design Inc.
- 1689 MP3 player/FM radio/voice recorder 256 Mo flash (T2-MP3-001)
-8888 Silicon Magic Corp
-8912 TRX
-8E0E Computone Corp
-8E2E KTI
- 3000 ET32/Px Ethernet Adapter
-9004 Adaptec Inc
- 0078 AHA-2940UW/CN (aic-7880p)
- 1078 RAID Coprocessor (AIC-7810C)
- 1135 Texas Instruments (0x0035)
- 1160 AIC-1160 Family Fibre Channel Adapter
- 2178 AIC-7821 SCSI Host Adapter
- 3860 AHA-2930CU PCI SCSI Controller
- 3B78 QuadChannel Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-4944W/4944UW)
- 5075 AIC-755x SCSI Controller
- 5078 AVA-2902I/E,AVA-2904,AVA-2910 (AIC-7850P) Fast/Wide SCSI II
- 5175 AIC-755x SCSI Controller
- 5178 AIC-7850 Fast SCSI Controller
- 5275 AIC-755x SCSI Controller
- 5278 AIC-7850 Fast SCSI Controller
- 5375 AIC-755x SCSI Controller
- 5378 AIC-7850 Fast SCSI Controller
- 5475 AIC-755x SCSI Controller
- 5478 AIC-7850 Fast SCSI Controller
- 5575 AVA-2930 SCSI Host Adapter
- 5578 AIC-7855 Fast SCSI Controller
- 5647 ANA-7711 TCP Offload Engine
- 5675 AIC-755x SCSI Controller
- 5678 AIC-7856 Fast SCSI Controller
- 5775 AIC-755x SCSI Controller
- 5778 AIC-7850 Fast SCSI Controller
- 5800 AIC-5800 IEEE-1394 FireWire Controller
- 5900 ATM155 & 25 LAN Controller (ANA-5910/30/40)
- 5905 ANA-5910A/5930A/5940A ATM Adapter
- 6038 Ultra SCSI Adpater (VAR) (AHA-2930C)
- 6075 CardBus Ultra SCSI Controller (AIC-7560?)
- 6078 PCI SCSI Controller (AIC-7860)
- 6178 AIC-7861 AHA-2940AU PCI SCSI Controller
- 6278 AIC-7860 SCSI Controller
- 6378 AIC-7860 SCSI Controller
- 6478 AIC-786x SCSI Controller
- 6578 AIC-786x SCSI Controller
- 6678 AIC-786x SCSI Controller
- 6778 AIC-786x SCSI Controller
- 6915 ANA620xx/ANA69011A Fast Ethernet
- 7078 Fast and Wide SCSI Ctrlr (AIC-7870)
- 7178 Fast/Fast-Wide SCSI Ctrlr (AHA-2940/2940W)
- 7278 Multichannel Fast/Fast-Wide SCSI Ctrlr (AHA-3940/3940W)
- 7378 AHA-3985 4 Channel RAID SCSI Host Adapter
- 7478 AHA-2944/W SCSI Host Adapter
- 7578 Multichannel Fast/Fast-Wide Diff. SCSI Ctrlr (AHA-3944/3944W)
- 7678 QuadChannel Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-4944W/4944UW)
- 7710 ANA-7711F Network Accelerator Card (NAC) - Optical
- 7711 ANA-7711C Network Accelerator Card (NAC) - Copper
- 7778 AIC-787x SCSI Controller
- 7810 AIC-7810 Memory Controller IC
- 7815 RAID + Memory Controller IC (AIC-7515)
- 7850 Fast/Wide SCSI-2 Controller (aic-7850)
- 7855 Single channel SCSI Host Adapter (AHA-2930)
- 7860 AIC-7860 based PCI SCSI Controller
- 7870 Fast/Wide SCSI-2 Controller (AIC-7870)
- 7871 AHA-2940 Fast/Wide SCSI Host Adapter
- 7872 AHA-3940 Dual-Channel FAST/Wide SCSI Host Adapter
- 7873 AHA-3985 4 Channel RAID SCSI Host Adapter (AIC-7873)
- 7874 Differential SCSI (aha 2944)
- 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset
- 7890 SCSI controller (AIC-7890)
- 7891 SCSI controller (AIC-789x)
- 7892 SCSI controller (AIC-789x)
- 7893 SCSI controller (AIC-789x)
- 7894 SCSI controller (AIC-789x)
- 7895 Ultra-Wide SCSI Ctrlr on AHA-2940 AHA-394x (AIC-7895)
- 7896 SCSI controller (AIC-789x)
- 7897 SCSI controller (AIC-789x)
- 8078 AIC-7880P Ultra/Ultra Wide SCSI Chipset
- 8178 AHA-2940U/UW/2940D Ultra/Ultra Wide/Dual SCSI Host Adapter
- 8278 AHA-3940U/UW/UWD Ultra/Ultra Wide/Dual SCSI Host Adapter
- 8378 SCSI Controller (AIC-7883U)
- 8478 Ultra-Wide Diff. SCSI Ctrlr (ADAPTEC 2940UW CN SCSI)
- 8578 Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-3944U/3944UWD)
- 8678 QuadChannel Ultra-Wide Diff. SCSI Ctrlr (AHA-4944UW)
- 8778 AHA-2940UW Pro AIC-788x Ultra-Wide SCSI Controller
- 8878 Ultra Wide SCSI Controller (AIC-7888?)
- 8B78 AIC-7880P (ABA-1030)
- EC78 QuadChannel Fast-Wide/Ultra-Wide Diff. SCSI Ctrlr (AHA-4944W/4944UW)
-9005 Adaptec Inc
- 0010 AHA-2940U2W/U2B,2950U2W Ultra2 SCSI (AIC-7890AB scsi controller)
- 0011 AHA-2930U2 Ultra2 SCSI Host Adapter
- 0013 AIC-7890/1 SCSI Host Adapter
- 001F Ultra2-Wide SCSI controller (AIC-7890 AB for Windows XP)
- 0020 SCSI Controller (AIC-789x)
- 002F SCSI Controller (AIC-789x)
- 0030 SCSI Controller (AIC-789x)
- 003F SCSI Controller (AIC-789x)
- 0050 AHA-3940U2x/AHA-3950U2x Ultra2 SCSI Controller
- 0051 AHA-3950U2x Ultra2 SCSI Controller
- 0053 SCSI Controller (AIC-7896)
- 005F Ultra2 SCSI Controller (AIC-7896/7)
- 0080 29160/N/LP Ultra160 (AIC-7892A) SCSI Host Adapter
- 0081 19160 AIC-7892B Ultra160 SCSI Adapter
- 0082 2915/2930LP PCI SCSI Controller
- 0083 AIC-7892D Ultra160 SCSI Host Adapter
- 008F AIC-7892 Ultra160 SCSI Host Adapter
- 00C0 AHA-39160 (AIC-7899A) Ultra160 SCSI Host Adapter
- 00C1 AIC-7899B Ultra160 SCSI Host Adapter
- 00C3 AIC-7899D Ultra160 SCSI Host Adapter
- 00C5 RAID Subsystem HBA
- 00CF AIC-7899P Ultra160 SCSI Host Adapter
- 0241 Serial ATA II RAID 1420SA
- 0250 ServeRAID Controller
- 0258 Adaptec AAR-2610SA SATA 6-Port Raid (AAC-RAID)
- 0279 ServeRAID 6M
- 0283 AAC-RAID
- 0284 AAC-RAID
- 0285 PCIX133 32/64bit (Adaptec 2410SA SATA RAID)
- 0286 SUBSYS_95801014REV_02 (SUBSYS_95801014REV_02)
- 0410 AIC-9410W SAS (Razor HBA RAID)
- 0412 AIC-9410W SAS (Razor HBA non-RAID)
- 0415 ASC-58300 SAS/SATA Controller
- 0416 ASC-58300 SAS/SATA Controller
- 041E AIC-9410W SAS (Razor ASIC non-RAID)
- 041F AIC-9410W SAS (Razor ASIC RAID)=20
- 0430 AIC-9405W SAS (Razor-Lite HBA RAID)
- 0432 AIC-9405W SAS (Razor-Lite HBA non-RAID)
- 043E AIC-9405W SAS (Razor-Lite ASIC non-RAID)=20
- 043F AIC-9405W SAS (Razor-Lite ASIC RAID)=20
- 0500 Obsidian chipset SCSI controller
- 0503 Scamp chipset SCSI controller
- 0910 AUA-3100B
- 091E AUA-3100B
- 8000 Ultra320 SCSI Controller (ASC-29320A)
- 800F Ultra320 SCSI Controller (AIC-7901)
- 8010 Ultra320 SCSI Controller (ASC-39320)
- 8011 Ultra320 SCSI Controller (ASC-39320D)
- 8012 Ultra320 SCSI Controller (ASC-29320)
- 8013 ASC-29320B Ultra320 SCSI Controller
- 8014 Ultra320 SCSI Controller (ASC-29320LP)
- 8015 SCSI Card 39320 Ultra320 SCSI Controller
- 8016 Ultra320 SCSI Controller (ASC-39320A)
- 8017 Ultra320 SCSI Controller (ASC-29320ALP)
- 801C Ultra320 SCSI Controller (AIC-?????)
- 801D Ultra320 SCSI Controller (AIC-7902B)
- 801E Ultra320 SCSI Controller (AIC-7901)
- 801F Ultra320 SCSI Controller (AIC-7902)
- 8080 Ultra320 HostRAID Controller (ASC-29320A)
- 808F Ultra320 HostRAID Controller (AIC-7901)
- 8090 HostRAID SCSI Controller (ASC-39320)
- 8091 HostRAID SCSI Controller (ASC-39320D)
- 8092 HostRAID SCSI Controller (ASC-29320)
- 8093 HostRAID SCSI Controller (ASC-29320LPE)
- 8094 HostRAID SCSI Controller (ASC-29320LP)
- 8095 HostRAID SCSI Controller (ASC-39320)
- 8096 HostRAID SCSI Controller (ASC-39320A)
- 8097 HostRAID SCSI Controller (ASC-29320ALP)
- 809C HostRAID SCSI Controller (ASC-39320D)
- 809D HostRAID SCSI Controller (AIC-7902B)
- 809E HostRAID SCSI Controller (AIC-7901A)
- 809F HostRAID SCSI Controller (AIC-7902B)
-907F Atronics
- 2015 IDE-2015PL EIDE Controller
-919A Gigapixel Corp
-9412 Holtek
- 6565 HT6565 PCI EIDE Controller
-9699 Omni Media Technology Inc
-9710 MosChip Semiconductors (Was: Netmos Technology)
- 7780 USB IRDA-port
- 9250 MCS9250 PCI to PCI Bridge
- 9705 Nm9705 Parallel Port Adapter
- 9715 Nm9715 Dual Parallel Port Adapter
- 9735 Nm9735 Single Parallel / Dual Serial Port Adapter
- 9745 Nm9745 Dual UART and PCI-ISA Bridge
- 9755 Nm9755 Parallel Port and PCI-ISA Bridge
- 9805 Netmos Parallel port PCI card (9805)
- 9815 Nm9715CV Parallel/Serial Port Adapter
- 9820 Nm9820 Single PCI UART
- 9825 Nm9825 Single PCI UART
- 9835 Nm9835 Parallel/Serial Port Adapter
- 9845 4 serial, 1 parallel port PCI card (NM9845CV)
- 9855 Nm9855 Parallel/Serial Port Adapter
-9877 Pan Asia Superitendence Corp
-9902 StarGen, Inc.
- 0001 PCI-to-PCI Bridge (SG2010)
- 0002 PCI to high speed serial bridge (SG2010)
- 0003 6 port serial switch /PCI-to-PCI bridge (SG1010)
-A0A0 AOpen Inc
-A0F1 Unisys Corp
-A200 NEC Corp.
- A200 tv (saa1735hl)
-A259 Hewlett Packard
-A25A Hewlett Packard Convex Division
-A25B Hewlett Packard GmbH PL24-MKT
-A304 Sony
-A727 3Com Corp
- 0013 3CRPAG175 Wireless PC Card
-AA42 Scitex Digital Video
- 03A3 CharKey (9400-0931)
-AAAA Parallels Software International Inc
- 1112 PCI Tool Device
- 1131 Parallels Video Driver
-AC1E Digital Receiver Technology Inc
-AC3D Actuality Systems
-AECB Adrienne Electronics Corporation
-B00C IC Book Labs
- 001C IC80+PCI POST Diagnostics Card
- 011C IC128 PCI Parallel Port Controller
- 021C Gunboat x4 Quad PCI Serial Port Controller (Low Speed)
- 031C Gunboat x4 Pro Quad PCI Serial Port Controller (High Speed)
- 041C Ironclad x8 Octal PCI Serial Port Controller (Standard Speed)
- 051C Ironclad x8 Pro Octal PCI Serial Port Controller (High Speed)
- 061C IC138 PCI Parallel Port Controller
- 081C Dreadnought x16 Pro 16-port PCI Serial Controller (High Speed)
- 091C Dreadnought x16 Lite 16-port Serial Controller
-B1B3 Shiva Europe Ltd
-B54B Contec Co Ltd
-B894 Brown & Sharpe Mfg Co
-BDBD Blackmagic Design
- A106 Blackmagic DeckLink
- A107 Blackmagic DeckLink
- A108 Blackmagic DeckLink
- A109 Blackmagic DeckLink
- A10B Blackmagic DeckLink
- A10C Blackmagic DeckLink
- A10E Blackmagic DeckLink
- A10F Blackmagic DeckLink
- A112 Blackmagic DeckLink
- A113 Blackmagic DeckLink
- A114 Blackmagic DeckLink
- A115 Blackmagic DeckLink
-C001 TSI Telsys
-C0A9 Micron (Crucial Technology)
-C0DE Motorola
- 5600 62802
- C0DE oZ0030 (62802-51)
-C0FE Motion Engineering Inc
-C622 Hudson Soft Co Ltd
-CA50 Varian Australia Pty Ltd
-CAFE Chrysalis-ITS
- 0003 Luna K3 Hardware Security Module
-CCCC Catapult Communications
-CCEC Curtiss-Wright Controls Embedded Computing
-CDDD Tyxz Inc
- 0101 DeepSea 1 High-Speed Stereo Vision Capture Card
- 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber
-D161 Digium, Inc
- 0120 Wildcard TE120P single-span T1/E1/J1 card
- 0205 Wildcard TE205P
- 0210 Wildcard TE210P
- 0405 Wildcard TE405P Quad-Span togglable E1/T1/J1 card 5.0v
- 0406 Wildcard TE406P Quad-Span togglable E1/T1/J1 echo cancellation card 5.0v
- 0410 Wildcard TE410P Quad-Span togglable E1/T1/J1 card 3.3v
- 0411 Wildcard TE411P Quad-Span togglable E1/T1/J1 echo cancellation card 3.3v
- 0800 Wildcard TDM800P 8-port analog card
- 2400 Wildcard TDM2400P
- 3400 Wildcard TC400P transcoder base card
- B410 Wildcard B410 quad-BRI card
-D4D4 Curtiss-Wright Controls Embedded Computing
- 010F PMC-211 (PMC-211)
- 0601 PCI Mezzanine Card
-D531 I+ME ACTIA GmBH
-D841 Super PCI(??)
-D84D Exsys
-DC93 Dawicontrol
-DEAD Indigita Corp
-DEAF Middle Digital, Inc
- 9050 PC Weasel PCI VGA Device
- 9051 PC Weasel PCI Serial Communication Device
- 9052 PC Weasel PCI
-E000 Winbond
- E000 W89C940 Ethernet Adapter
-E159 Tiger Jet Network Inc
- 0001 Multiple devices use this ID: General Purpose I/O Controller
- 0002 Tiger 100APC ISDN Chipset
- 0600 PCI-to-PCI Bridge (Tiger 600)
-E4BF EKF Electronik GmbH
-E55E Essence Technology Inc
-EA01 Eagle Technology
- 000A PCI-773 Temperature Card
- 0032 PCI-730 & PC104P-30 Card
- 003E PCI-762 Opto-Isolator Card
- 0041 PCI-763 Reed Relay Card
- 0043 PCI-769 Opto-Isolator Reed Relay Combo Card
- 0046 PCI-766 Analog Output Card
- 0052 PCI-703 Analog I/O Card
- 0800 PCI-800 Digital I/O Card
-EA60 RME
- 9896 Digi32
- 9897 Digi32 Pro
- 9898 Digi32/8
-EABB Aashima Technology B.V.
-EACE Endace Measurement Systems Ltd.
- 3100 OC-3/OC-12 (DAG 3.10)
- 3200 OC-3/OC-12 (DAG 3.2x)
- 320E Fast Ethernet (DAG 3.2E)
- 340E Fast Ethernet (DAG 3.4E)
- 341E Fast Ethernet (DAG 3.41E)
- 3500 OC-3/OC-12 (DAG 3.5)
- 351C Fast Ethernet (DAG 3.5ECM)
- 4100 OC-48 (DAG 4.10)
- 4110 OC-48 (DAG 4.11)
- 4200 OC-48 (DAG 4.2)
- 420E Dual Gigabit Ethernet (DAG 4.2E)
- 4220 DAG 4.2 OC-48
- 422E DAG 4.2E Dual Gigabit Ethernet
- 430E Dual Gigabit Ethernet (DAG 4.3E)
-EC80 Belkin Corp
- EC00 F5D6000
-ECC0 Echo Digital Audio Corporation
- 0050 Gina24_301
- 0051 Gina24_361
- 0060 Layla24
- 0070 Mona_301_80
- 0071 Mona_301_66
- 0072 Mona_361
- 0080 4/2 channel (analog/digital) audio card (MiaMIDI)
- 0100 6/8 channel (analog/digital) audio card (GINA3G)
-EDD8 ARK Logic, Inc
- A091 Stingray GUI Accelerator (ARK1000PV)
- A099 Stingray GUI Accelerator (ARK2000PV)
- A0A1 Stingray 64 ARK2000MT 64-bit GUI W/DCI Playback
- A0A9 Quadro645 GUI Accelerator (ARK2000MI)
- A0B1 GUI Accelerator (ARK2000MI+)
-F1D0 AJA Video
- C0FE Xena HS/HD-R
- C0FF Kona/Xena 2
- CAFE KONA SD SMPTE 259M I/O
- CFEE Xena LS/SD-22-DA/SD-DA
- DCAF Kona HD
- DFEE Xena HD-DA
- EFAC KONA SD SMPTE 259M I/O
- FACD KONA HD SMPTE 292M I/O
-F5F5 F5 Networks Inc
-FA57 Interagon AS (Was: Fast Search & Transfer ASA)
- 0001 Pattern Matching Chip (PMC)
-FAB7 Fabric7 Systems Inc
-FEBD Ultraview Corp
-FEDA Broadcom (Was: Epigram Inc; Bought out in 1999)
- A0FA BCM4210 iLine10 HomePNA 2.0
- A10E BCM4230 iLine10 HomePNA 2.0
-FEDE Fedetec Inc
- 0003 TABIC PCI v3
-FFFD XenSource Inc
- 0101 PCI Event Channel Controller
-FFFE VMWare Inc (Older Product Versions)
- 0405 Virtual SVGA 4.0
- 0710 Virtual SVGA
+# $FreeBSD$
+
+#
+# List of PCI ID's
+#
+# Version: 2011.07.14
+# Date: 2011-07-14 03:15:06
+#
+# Maintained by Martin Mares <mj@ucw.cz> and other volunteers from the
+# PCI ID Project at http://pciids.sf.net/.
+#
+# New data are always welcome, especially if they are accurate. If you have
+# anything to contribute, please follow the instructions at the web site.
+#
+# This file can be distributed under either the GNU General Public License
+# (version 2 or higher) or the 3-clause BSD License.
+#
+
+# Vendors, devices and subsystems. Please keep sorted.
+
+# Syntax:
+# vendor vendor_name
+# device device_name <-- single tab
+# subvendor subdevice subsystem_name <-- two tabs
+
+0000 Gammagraphx, Inc. (or missing ID)
+0010 Allied Telesis, Inc
+# This is a relabelled RTL-8139
+ 8139 AT-2500TX V3 Ethernet
+001a Ascend Communications, Inc.
+001c PEAK-System Technik GmbH
+ 0001 PCAN-PCI CAN-Bus controller
+ 001c 0004 2 Channel CAN Bus SJC1000
+ 001c 0005 2 Channel CAN Bus SJC1000 (Optically Isolated)
+0033 Paradyne corp.
+003d Lockheed Martin-Marietta Corp
+# Real TJN ID is e159, but they got it wrong several times --mj
+0059 Tiger Jet Network Inc. (Wrong ID)
+0070 Hauppauge computer works Inc.
+ 0003 WinTV PVR-250
+ 0009 WinTV PVR-150
+ 0801 WinTV PVR-150
+ 0807 WinTV PVR-150
+ 4000 WinTV PVR-350
+ 4001 WinTV PVR-250 (v1)
+ 4009 WinTV PVR-250
+ 4800 WinTV PVR-350
+ 4801 WinTV PVR-250 MCE
+ 4803 WinTV PVR-250
+ 7444 WinTV HVR-1600
+ 7801 WinTV HVR-1800 MCE
+ 8003 WinTV PVR-150
+ 8801 WinTV PVR-150
+ c108 WinTV-HVR-4400-HD model 1278
+ c801 WinTV PVR-150
+ e807 WinTV PVR-500 MCE (1st tuner)
+ e817 WinTV PVR-500 MCE (2nd tuner)
+0071 Nebula Electronics Ltd.
+0095 Silicon Image, Inc. (Wrong ID)
+ 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD
+# Wrong ID used in subsystem ID of the TELES.S0/PCI 2.x ISDN adapter
+00a7 Teles AG (Wrong ID)
+00f5 BFG Technologies, Inc.
+0100 Ncipher Corp Ltd
+0123 General Dynamics
+# 018a is not LevelOne but there is a board misprogrammed
+018a LevelOne
+ 0106 FPC-0106TX misprogrammed [RTL81xx]
+# 021b is not Compaq but there is a board misprogrammed
+021b Compaq Computer Corporation
+ 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking]
+0270 Hauppauge computer works Inc. (Wrong ID)
+0291 Davicom Semiconductor, Inc.
+ 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40)
+# SpeedStream is Efficient Networks, Inc, a Siemens Company
+02ac SpeedStream
+ 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx]
+02e0 XFX Pine Group Inc
+0308 ZyXEL Communications Corporation
+0315 SK-Electronics Co., Ltd.
+0357 TTTech AG
+ 000a TTP-Monitoring Card V2.0
+036f Trigem Computer Inc.
+0403 Future Technology Devices International Ltd
+0432 SCM Microsystems, Inc.
+ 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]
+0482 Kyocera
+# vendor code used for (at a minimum) RSA cards
+04b3 IBM Corp.
+ 4001 Remote System Administration device [RSA2]
+050d Belkin
+058f Alcor Micro Corporation
+05a9 OmniVision
+ 8519 OV519 series
+05e3 CyberDoor
+ 0701 CBD516
+066f Sigmatel Inc.
+ 3410 SMTP3410
+ 3500 SMTP3500
+0675 Dynalink
+ 1700 IS64PH ISDN Adapter
+ 1702 IS64PH ISDN Adapter
+ 1703 ISDN Adapter (PCI Bus, DV, W)
+ 1704 ISDN Adapter (PCI Bus, D, C)
+069d Hughes Network Systems (HNS)
+0721 Sapphire, Inc.
+0777 Ubiquiti Networks, Inc.
+# Atheros, 6th Generation, AR5414, 802.11a, 5GHz
+ 3005 XtremeRange5
+0795 Wired Inc.
+ 6663 Butane II (MPEG2 encoder board)
+ 6666 MediaPress (MPEG2 encoder board)
+07ca AVerMedia Technologies Inc.
+# Expresscard DVB-T tuner sold by Fujitsu for notebooks
+ 534a Slim mobile Express DVB-T (Fujitsu)
+ a301 AVerTV 301
+ b808 AVerTV DVB-T Volar (USB 2.0)
+07d0 ITT Geospatial Systems
+07d1 D-Link System Inc
+07e2 ELMEG Communication Systems GmbH
+0842 NPG, Personal Grand Technology
+# Nee Gemplus International, SA
+08e6 Gemalto NV
+08ff AuthenTec
+ afe4 [Anchor] AF-S2 FingerLoc Sensor Module
+0925 First International Computer, Inc.
+ 1234 VA-502 Mainboard
+093a PixArt Imaging Inc.
+ 010e Innovage Mini Digital Camera
+ 010f SDC-300 Webcam
+ 020f Digital Photo Viewer
+ 2468 CIF Single Chip
+ 2600 PAC7311
+ 2603 Philips Webcam SPC500NC
+ 2608 Maxell MaxCam RotaWeb
+ 2620 C3 Tech Mod. 153
+09c1 Arris
+ 0704 CM 200E Cable Modem
+0a89 BREA Technologies Inc
+0b0b Rhino Equipment Corp.
+ 0105 Rhino R1T1
+ 0205 Rhino R4FXO
+ 0206 RCB4FXO 4-channel FXO analog telphony card
+ 0305 Rhino R4T1
+ 0405 Rhino R8FXX
+ 0406 RCB8FXX 8-channel modular analog telphony card
+ 0505 Rhino R24FXX
+ 0506 RCB24FXS 24-Channel FXS analog telphony card
+ 0605 Rhino R2T1
+ 0705 Rhino R24FXS
+ 0706 RCB24FXO 24-Channel FXO analog telphony card
+ 0905 R1T3 Single T3 Digital Telephony Card
+ 0906 RCB24FXX 24-channel modular analog telphony card
+ 0a06 RCB672FXX 672-channel modular analog telphony card
+0b3d Brontes Technologies
+0b49 ASCII Corporation
+ 064f Trance Vibrator
+0ccd TerraTec Electronic GmbH
+ 0038 Cinergy T^2 DVB-T Receiver
+0e11 Compaq Computer Corporation
+ 0001 PCI to EISA Bridge
+ 0002 PCI to ISA Bridge
+ 0046 Smart Array 64xx
+ 0e11 4091 Smart Array 6i
+ 0e11 409a Smart Array 641
+ 0e11 409b Smart Array 642
+ 0e11 409c Smart Array 6400
+ 0e11 409d Smart Array 6400 EM
+ 0049 NC7132 Gigabit Upgrade Module
+ 004a NC6136 Gigabit Server Adapter
+ 005a Remote Insight II board - Lights-Out
+ 007c NC7770 1000BaseTX
+ 007d NC6770 1000BaseTX
+ 0085 NC7780 1000BaseTX
+ 00b1 Remote Insight II board - PCI device
+ 00bb NC7760
+ 00ca NC7771
+ 00cb NC7781
+ 00cf NC7772
+ 00d0 NC7782
+ 00d1 NC7783
+ 00e3 NC7761
+ 0508 Netelligent 4/16 Token Ring
+ 1000 Triflex/Pentium Bridge, Model 1000
+ 2000 Triflex/Pentium Bridge, Model 2000
+ 3032 QVision 1280/p
+ 3033 QVision 1280/p
+ 3034 QVision 1280/p
+ 4000 4000 [Triflex]
+ 4040 Integrated Array
+ 4048 Compaq Raid LC2
+ 4050 Smart Array 4200
+ 4051 Smart Array 4250ES
+ 4058 Smart Array 431
+ 4070 Smart Array 5300
+ 4080 Smart Array 5i
+ 4082 Smart Array 532
+ 4083 Smart Array 5312
+ 4091 Smart Array 6i
+ 409a Smart Array 641
+ 409b Smart Array 642
+ 409c Smart Array 6400
+ 409d Smart Array 6400 EM
+ 6010 HotPlug PCI Bridge 6010
+ 7020 USB Controller
+ a0ec Fibre Channel Host Controller
+ a0f0 Advanced System Management Controller
+ a0f3 Triflex PCI to ISA Bridge
+ a0f7 PCI Hotplug Controller
+ 8086 002a PCI Hotplug Controller A
+ 8086 002b PCI Hotplug Controller B
+ a0f8 ZFMicro Chipset USB
+ a0fc FibreChannel HBA Tachyon
+ ae10 Smart-2/P RAID Controller
+ 0e11 4030 Smart-2/P Array Controller
+ 0e11 4031 Smart-2SL Array Controller
+ 0e11 4032 Smart Array 3200 Controller
+ 0e11 4033 Smart Array 3100ES Controller
+ 0e11 4034 Smart Array 221 Controller
+ ae29 MIS-L
+ ae2a MPC
+ ae2b MIS-E
+ ae31 System Management Controller
+ ae32 Netelligent 10/100 TX PCI UTP
+ ae33 Triflex Dual EIDE Controller
+ ae34 Netelligent 10 T PCI UTP
+ ae35 Integrated NetFlex-3/P
+ ae40 Netelligent Dual 10/100 TX PCI UTP
+ ae43 Netelligent Integrated 10/100 TX UTP
+ ae69 CETUS-L
+ ae6c Northstar
+ ae6d NorthStar CPU to PCI Bridge
+ b011 Netelligent 10/100 TX Embedded UTP
+ b012 Netelligent 10 T/2 PCI UTP/Coax
+ b01e NC3120 Fast Ethernet NIC
+ b01f NC3122 Fast Ethernet NIC
+ b02f NC1120 Ethernet NIC
+ b030 Netelligent 10/100 TX UTP
+ b04a 10/100 TX PCI Intel WOL UTP Controller
+ b060 Smart Array 5300 Controller
+ b0c6 NC3161 Fast Ethernet NIC
+ b0c7 NC3160 Fast Ethernet NIC
+ b0d7 NC3121 Fast Ethernet NIC
+ b0dd NC3131 Fast Ethernet NIC
+ b0de NC3132 Fast Ethernet Module
+ b0df NC6132 Gigabit Module
+ b0e0 NC6133 Gigabit Module
+ b0e1 NC3133 Fast Ethernet Module
+ b123 NC6134 Gigabit NIC
+ b134 NC3163 Fast Ethernet NIC
+ b13c NC3162 Fast Ethernet NIC
+ b144 NC3123 Fast Ethernet NIC
+ b163 NC3134 Fast Ethernet NIC
+ b164 NC3165 Fast Ethernet Upgrade Module
+ b178 Smart Array 5i/532
+ 0e11 4080 Smart Array 5i
+ 0e11 4082 Smart Array 532
+ 0e11 4083 Smart Array 5312
+ b1a4 NC7131 Gigabit Server Adapter
+ b200 Memory Hot-Plug Controller
+ b203 Integrated Lights Out Controller
+ b204 Integrated Lights Out Processor
+ c000 Remote Insight Lights-Out Edition
+ f130 NetFlex-3/P ThunderLAN 1.0
+ f150 NetFlex-3/P ThunderLAN 2.3
+0e21 Cowon Systems, Inc.
+0e55 HaSoTec GmbH
+0eac SHF Communication Technologies AG
+ 0008 Ethernet Powerlink Managing Node 01
+0f62 Acrox Technologies Co., Ltd.
+# Formerly NCR
+1000 LSI Logic / Symbios Logic
+ 0001 53c810
+ 1000 1000 LSI53C810AE PCI to SCSI I/O Processor
+ 0002 53c820
+ 0003 53c825
+ 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide)
+ 0004 53c815
+ 0005 53c810AP
+ 0006 53c860
+ 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor
+ 000a 53c1510
+ 0e11 b143 Integrated Dual Channel Wide Ultra2 SCSI Controller
+ 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)
+ 000b 53C896/897
+ 0e11 6004 EOB003 Series SCSI host adapter
+ 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller
+ 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter
+ 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter
+ 13e9 1000 6221L-4U (Dual U2W SCSI, dual 10/100TX, graphics)
+ 000c 53c895
+ 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter
+ 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter
+ 1de1 3906 DC-390U2B SCSI adapter
+ 1de1 3907 DC-390U2W
+ 000d 53c885
+ 000f 53c875
+ 0e11 7004 Embedded Ultra Wide SCSI Controller
+ 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller
+ 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter
+ 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter
+ 1092 8760 FirePort 40 Dual SCSI Controller
+ 1775 10d0 V5D Single Board Computer Wide Ultra SCSI
+ 1775 10d1 V5D Single Board Computer Ultra SCSI
+ 1de1 3904 DC390F/U Ultra Wide SCSI Adapter
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1050 CT7 mainboard
+ 0010 53C1510
+ 0e11 4040 Integrated Smart Array Controller
+ 0e11 4048 RAID LC2 Controller
+ 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode)
+ 0012 53c895a
+ 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller
+ 0013 53c875a
+ 1000 1000 LSI53C875A PCI to Ultra SCSI Controller
+ 0020 53c1010 Ultra3 SCSI Adapter
+ 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller
+ 107b 1040 Server Onboard 53C1010-33
+ 1de1 1020 DC-390U3W
+ 0021 53c1010 66MHz Ultra3 SCSI Adapter
+ 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller
+ 1000 1010 Asus TR-DLS onboard 53C1010-66
+ 103c 1300 Ultra160 SCSI [AB306A]
+ 103c 1310 Ultra160 SCSI [A9918A]
+ 103c 1330 Ultra160 SCSI [A7059A]
+ 103c 1340 Ultra160 SCSI [A7060A]
+ 124b 1070 PMC-USCSI3
+ 4c53 1080 CT8 mainboard
+ 4c53 1300 P017 mezzanine (32-bit PMC)
+ 4c53 1310 P017 mezzanine (64-bit PMC)
+ 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0e11 00da ProLiant ML 350
+ 1028 0123 LSI Logic 1020/1030
+ 1028 014a LSI Logic 1020/1030
+ 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4)
+ 1028 0183 LSI Logic 1020/1030
+ 1028 018a PERC 4/IM
+ 1028 1010 LSI U320 SCSI Controller
+ 103c 12c5 Ultra320 SCSI [A7173A]
+ 103c 1323 Core I/O LAN/SCSI Combo [AB314A]
+ 103c 3108 Single Channel Ultra320 SCSI HBA G2
+ 124b 1170 PMC-USCSI320
+# VMware's emulation of this device. Was missing from the list.
+ 15ad 1976 LSI Logic Parallel SCSI Controller
+ 1734 1052 PRIMERGY BX/RX/TX S2 series onboard SCSI(IME)
+ 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller
+ 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 1000 0033 MegaRAID SCSI 320-2XR
+ 1000 0066 MegaRAID SCSI 320-2XRWS
+ 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
+ 0050 SAS1064 PCI-X Fusion-MPT SAS
+ 1028 1f04 SAS 5/E
+ 1028 1f09 SAS 5i/R
+ 0054 SAS1068 PCI-X Fusion-MPT SAS
+ 1028 1f04 SAS 5/E Adapter Controller
+ 1028 1f05 SAS 5/i Adapter Controller
+ 1028 1f06 SAS 5/i Integrated Controller
+ 1028 1f07 SAS 5/iR Integrated RAID Controller
+ 1028 1f08 SAS 5/iR Integrated RAID Controller
+ 1028 1f09 SAS 5/iR Adapter RAID Controller
+ 15ad 1976 SAS Controller
+ 0055 SAS1068 PCI-X Fusion-MPT SAS
+ 1033 8336 SAS1068
+ 0056 SAS1064ET PCI-Express Fusion-MPT SAS
+ 1014 03bb ServeRAID BR10il SAS/SATA Controller v2
+ 0057 M1064E MegaRAID SAS
+ 8086 346c Embedded Software RAID Technology II (ESTRII)
+ 0058 SAS1068E PCI-Express Fusion-MPT SAS
+ 1000 3140 SAS3081E-R 8-Port SAS/SATA Host Bus Adapter
+ 1028 021d SAS 6/iR Integrated Workstations RAID Controller
+ 1028 1f0e SAS 6/iR Adapter RAID Controller
+ 1028 1f0f SAS 6/iR Integrated Blades RAID Controller
+ 1028 1f10 SAS 6/iR Integrated RAID Controller
+ 103c 3229 SC44Ge Host Bus Adapter
+ 0059 MegaRAID SAS 8208ELP/8208ELP
+ 005a SAS1066E PCI-Express Fusion-MPT SAS
+ 005b MegaRAID SAS 2208 [Thunderbolt]
+ 1028 1f2d PERC H810 Adapter
+ 1028 1f30 PERC H710 Embedded
+ 1028 1f31 PERC H710P Adapter
+ 1028 1f33 PERC H710P Mini (for blades)
+ 1028 1f34 PERC H710P Mini (for monolithics)
+ 1028 1f35 PERC H710 Adapter
+ 1028 1f37 PERC H710 Mini (for blades)
+ 1028 1f38 PERC H710 Mini (for monolithics)
+ 005c SAS1064A PCI-X Fusion-MPT SAS
+ 005d MegaRAID SAS-3 3108 [Invader]
+ 005e SAS1066 PCI-X Fusion-MPT SAS
+ 0060 MegaRAID SAS 1078
+ 1000 1006 MegaRAID SAS 8888ELP
+ 1000 100a MegaRAID SAS 8708ELP
+ 1000 100e MegaRAID SAS 8884E
+ 1000 100f MegaRAID SAS 8708E
+ 1000 1010 MegaRAID SATA 350-8ELP
+ 1000 1011 MegaRAID SATA 350-4ELP
+ 1000 1012 MegaRAID SAS 8704ELP
+ 1000 1016 MegaRAID SAS 8880EM2
+ 1014 0363 MegaRAID SAS PCI Express ROMB
+ 1014 0364 SystemX MegaRAID SAS 8808E
+ 1014 0365 SystemX MegaRAID SAS 8884E
+ 1014 0379 SystemX MegaRAID SAS 8880EM2
+ 1028 1f0a PERC 6/E Adapter RAID Controller
+ 1028 1f0b PERC 6/i Adapter RAID Controller
+ 1028 1f0c PERC 6/i Integrated RAID Controller
+ 1028 1f0d PERC 6/i Integrated RAID Controller
+ 1028 1f11 CERC 6/i Integrated RAID Controller
+ 1033 835a MegaRAID SAS PCI Express ROMB
+ 1043 824d MegaRAID SAS PCI Express ROMB
+ 1170 002f MegaRAID SAS PCI Express ROMB
+ 1170 0036 MegaRAID SAS PCI Express ROMB
+ 15d9 c080 MegaRAID SAS PCI Express ROMB
+ 17aa 6b7c MegaRAID SAS PCI Express ROMB
+ 18a1 0003 LSI MegaRAID SAS PCI Express ROMB
+ 8086 1006 RAID Controller SRCSAS28EP
+ 8086 100a RAID Controller SRCSAS28EV
+ 8086 1010 RAID Controller SRCSATA28E
+ 8086 34cc Integrated RAID Controller SROMBSAS28E
+ 8086 34cd Integrated RAID Controller SROMBSAS28E
+ 0062 SAS1078 PCI-Express Fusion-MPT SAS
+ 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS
+ 0064 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor]
+ 0065 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor]
+ 006e SAS2308 PCI-Express Fusion-MPT SAS-2
+ 0070 SAS2004 PCI-Express Fusion-MPT SAS-2 [Spitfire]
+ 0071 MR SAS HBA
+ 0072 SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon]
+ 1028 1f1c 6Gbps SAS HBA Adapter
+ 1028 1f1d PERC H200 Adapter
+ 1028 1f1e PERC H200 Integrated
+ 1028 1f1f PERC H200 Modular
+ 1028 1f20 PERC H200 Embedded
+ 1028 1f22 Internal Tape Adapter
+ 8086 350f RMS2LL040 RAID Controller
+ 0073 MegaRAID SAS 9240
+ 1000 9240 MegaRAID SAS 9240-8i
+ 1000 9241 MegaRAID SAS 9240-4i
+ 1014 03b1 ServeRAID M1015 SAS/SATA Controller
+ 1028 1f4e PERC H310 Adapter
+ 1028 1f4f PERC H310 Integrated
+ 1028 1f50 PERC H310 Mini Blades
+ 1028 1f51 PERC H310 Mini Monolithics
+ 1028 1f52 PERC H310 Embedded1
+ 1028 1f53 PERC H310 Embedded2
+ 1028 1f54 PERC H310 Reserved
+ 1054 3035 LSI MegaRAID SAS 9240-8i
+ 1137 0072 2004 iMR ROMB
+ 1137 0073 2008 ROMB
+ 15d9 0400 Supermicro SMC2008-iMR
+ 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607)
+ 8086 350d RMS2AF040 RAID Controller
+ 8086 9240 RAID Controller RS2WC080
+ 8086 9241 RAID Controller RS2WC040
+ 0074 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator]
+ 0076 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator]
+ 0077 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator]
+ 0079 MegaRAID SAS 2108 [Liberator]
+ 1000 9251 MegaRAID SAS 9260-4ix
+ 1000 9256 MegaRAID SAS 9260-8ix
+ 1000 9260 MegaRAID SAS 9260-4i
+ 1000 9261 MegaRAID SAS 9260-8i
+ 1000 9262 MegaRAID SAS 9262-8i
+ 1000 9263 MegaRAID SAS 9261-8i
+ 1000 9264 MegaRAID SAS 9264-8i
+ 1000 9275 MegaRAID SAS 9280-8ex
+ 1000 9276 MR9260-16i
+ 1000 9280 MegaRAID SAS 9280-8e
+ 1000 9281 MegaRAID SAS 9281-8E
+ 1000 9282 MegaRAID SAS 9280-4i4e
+ 1000 9290 MegaRAID SAS 9280DE-24i4e
+ 1014 03b2 ServeRAID M5015 SAS/SATA Controller
+ 1014 03b3 ServeRAID M5025 SAS/SATA Controller
+ 1028 1f15 PERC H800 Adapter
+ 1028 1f16 PERC H700 Adapter
+ 1028 1f17 PERC H700 Integrated
+ 1028 1f18 PERC H700 Modular
+ 1028 1f1a PERC H800 Proto Adapter
+ 1028 1f1b PERC H700 Integrated
+ 1043 8480 PIKE-2108 16PD
+ 1734 1176 RAID Ctrl SAS 6G 5/6 512MB (D2616)
+ 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607)
+ 8086 9256 MegaRAID SAS 9260DE-8i
+ 8086 9260 RAID Controller RS2BL040
+ 8086 9261 RAID Controller RS2BL080
+ 8086 9264 Warm Beach (Caster Lite)
+ 8086 9267 RAID Controller RS2VB040
+ 8086 9268 RAID Controller RS2VB080
+ 007c MegaRAID SAS 1078DE
+ 1014 0395 ServeRAID-AR10is SAS/SATA Controller
+ 007e SSS6200 PCI-Express Flash SSD
+ 0080 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0081 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0082 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0083 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0084 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0085 SAS2208 PCI-Express Fusion-MPT SAS-2
+ 0086 SAS2308 PCI-Express Fusion-MPT SAS-2
+ 0087 SAS2308 PCI-Express Fusion-MPT SAS-2
+ 008f 53c875J
+ 1092 8000 FirePort 40 SCSI Controller
+ 1092 8760 FirePort 40 Dual SCSI Host Adapter
+ 0090 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0091 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0094 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0095 SAS3108 PCI-Express Fusion-MPT SAS-3
+ 0096 SAS3004 PCI-Express Fusion-MPT SAS-3
+ 0097 SAS3008 PCI-Express Fusion-MPT SAS-3
+ 0407 MegaRAID
+ 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller
+ 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller
+ 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller
+ 1028 0531 PowerEdge Expandable RAID Controller 4/QC
+ 1028 0533 PowerEdge Expandable RAID Controller 4/QC
+ 8086 0530 MegaRAID Intel RAID Controller SRCZCRX
+ 8086 0532 MegaRAID Intel RAID Controller SRCU42X
+ 0408 MegaRAID
+ 1000 0001 MegaRAID SCSI 320-1E RAID Controller
+ 1000 0002 MegaRAID SCSI 320-2E RAID Controller
+ 1025 004d MegaRAID ACER ROMB-2E RAID Controller
+ 1028 0001 PowerEdge RAID Controller PERC4e/SC
+ 1028 0002 PowerEdge RAID Controller PERC4e/DC
+ 1028 0012 PowerEdge RAID Controller RAC4
+ 1028 0015 PowerEdge RAID Controller PERC5
+ 1028 1f03 PowerEdge RAID Controller PERC5
+ 1734 1065 FSC MegaRAID PCI Express ROMB
+ 8086 0002 MegaRAID Intel RAID Controller SRCU42E
+ 8086 3449 MegaRAID Intel RAID Controller SROMBU
+ 0409 MegaRAID
+ 1000 3004 MegaRAID SATA 300-4X RAID Controller
+ 1000 3008 MegaRAID SATA 300-8X RAID Controller
+ 8086 3008 MegaRAID RAID Controller SRCS28X
+ 8086 3431 MegaRAID RAID Controller Alief SROMBU42E
+ 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E
+ 0411 MegaRAID SAS
+ 1000 1001 MegaRAID SAS 8408E
+ 1000 1002 MegaRAID SAS 8480E
+ 1000 1003 MegaRAID SAS 8344ELP
+ 1000 1004 MegaRAID SAS 8308ELP
+ 1000 1008 MegaRAID SAS 84016E
+ 1000 100c MegaRAID SATA 300-12E
+ 1000 100d MegaRAID SATA 300-16E
+ 1000 2004 MegaRAID SATA 300-8ELP
+ 1000 2005 MegaRAID SATA 300-4ELP
+ 1033 8287 MegaRAID SAS PCI Express ROMB
+ 1054 3016 MegaRAID SAS RoMB Server
+ 1734 1081 MegaRAID SAS PCI Express ROMB
+ 1734 10a3 MegaRAID SAS PCI Express ROMB
+ 8086 1001 RAID Controller SRCSAS18E
+ 8086 1003 RAID Controller SRCSAS144E
+ 8086 3500 SROMBSAS18E RAID Controller
+ 8086 3501 SROMBSAS18E RAID Controller
+ 8086 3504 SROMBSAS18E RAID Controller
+ 0413 MegaRAID SAS Verde ZCR
+ 1000 1005 MegaRAID SAS 8300XLP
+ 0621 FC909 Fibre Channel Adapter
+ 0622 FC929 Fibre Channel Adapter
+ 1000 1020 44929 O Dual Fibre Channel card
+ 0623 FC929 LAN
+ 0624 FC919 Fibre Channel Adapter
+ 0625 FC919 LAN
+ 0626 FC929X Fibre Channel Adapter
+ 1000 1010 7202-XP-LC Dual Fibre Channel card
+ 0627 FC929X LAN
+ 0628 FC919X Fibre Channel Adapter
+ 0629 FC919X LAN
+ 0640 FC949X Fibre Channel Adapter
+ 0642 FC939X Fibre Channel Adapter
+ 0646 FC949ES Fibre Channel Adapter
+ 0701 83C885 NT50 DigitalScape Fast Ethernet
+ 0702 Yellowfin G-NIC gigabit ethernet
+ 1318 0000 PEI100X
+ 0804 SA2010
+ 0805 SA2010ZC
+ 0806 SA2020
+ 0807 SA2020ZC
+ 0901 61C102
+ 1000 63C815
+ 1960 MegaRAID
+ 1000 0518 MegaRAID 518 SCSI 320-2 Controller
+ 1000 0520 MegaRAID 520 SCSI 320-1 Controller
+ 1000 0522 MegaRAID 522 i4 133 RAID Controller
+ 1000 0523 MegaRAID SATA 150-6 RAID Controller
+ 1000 4523 MegaRAID SATA 150-4 RAID Controller
+ 1000 a520 MegaRAID ZCR SCSI 320-0 Controller
+ 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller
+ 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller
+ 1028 0531 PowerEdge Expandable RAID Controller 4/QC
+ 1028 0533 PowerEdge Expandable RAID Controller 4/QC
+ 8086 0520 MegaRAID RAID Controller SRCU41L
+ 8086 0523 MegaRAID RAID Controller SRCS16
+ 6001 DX1 Multiformat Broadcast HD/SD Encoder/Decoder
+1001 Kolter Electronic
+ 0010 PCI 1616 Measurement card with 32 digital I/O lines
+ 0011 OPTO-PCI Opto-Isolated digital I/O board
+ 0012 PCI-AD/DA Analogue I/O board
+ 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs
+ 0014 PCI-Counter/Timer Counter Timer board
+ 0015 PCI-DAC416 Analogue output board
+ 0016 PCI-MFB Analogue I/O board
+ 0017 PROTO-3 PCI Prototyping board
+ 9100 INI-9100/9100W SCSI Host
+1002 ATI Technologies Inc
+ 1314 Wrestler HDMI Audio [Radeon HD 6250/6310]
+ 3150 M24 1P [Radeon Mobility X600]
+ 103c 0934 nx8220
+ 3151 M24 [FireMV 2400]
+ 3152 M22 [Radeon Mobility X300]
+ 3154 M24GL [Mobility FireGL V3200]
+ 3171 M24 [FireMV 2400] (Secondary)
+ 3e50 RV380 0x3e50 [Radeon X600]
+ 3e54 RV380 0x3e54 [FireGL V3200]
+ 3e70 RV380 [Radeon X600] (Secondary)
+ 4136 Radeon IGP 320 M
+ 4137 Radeon IGP330/340/350
+ 4144 R300 AD [Radeon 9500 Pro]
+ 4145 R300 AE [Radeon 9700 Pro]
+ 4146 R300 AF [Radeon 9700 Pro]
+ 4147 R300 AG [FireGL Z1/X1]
+ 4148 R350 AH [Radeon 9800]
+ 4149 R350 AI [Radeon 9800]
+ 414a R350 AJ [Radeon 9800]
+ 414b R350 AK [FireGL X2]
+ 4150 RV350 AP [Radeon 9600]
+ 1002 0002 R9600 Pro primary (Asus OEM for HP)
+ 1002 0003 R9600 Pro secondary (Asus OEM for HP)
+ 1002 4722 All-in-Wonder 2006 AGP Edition
+ 1458 4024 Giga-Byte GV-R96128D (Primary)
+ 148c 2064 PowerColor R96A-C3N
+ 148c 2066 PowerColor R96A-C3N
+ 174b 7c19 Sapphire Atlantis Radeon 9600 Pro
+ 174b 7c29 GC-R9600PRO [Sapphire] (Primary)
+ 17ee 2002 Radeon 9600 256Mb Primary
+ 18bc 0101 GC-R9600PRO (Primary)
+ 4151 RV350 AQ [Radeon 9600]
+ 1043 c004 A9600SE
+ 4152 RV350 AR [Radeon 9600]
+ 1002 0002 Radeon 9600XT
+ 1002 4772 All-in-Wonder 9600 XT
+ 1043 c002 Radeon 9600 XT TVD
+ 1043 c01a A9600XT/TD
+ 174b 7c29 Sapphire Radeon 9600XT
+ 1787 4002 Radeon 9600 XT
+ 4153 RV350 AS [Radeon 9550]
+ 1043 010c A9550GE/TD
+ 1462 932c RX9550SE-TD128 (MS-8932)
+ 4154 RV350 AT [FireGL T2]
+ 4155 RV350 AU [FireGL T2]
+ 4156 RV350 AV [FireGL T2]
+ 4157 RV350 AW [FireGL T2]
+ 4158 68800AX [Mach32]
+ 4164 R300 AD [Radeon 9500 Pro] (Secondary)
+ 4165 R300 AE [Radeon 9700 Pro] (Secondary)
+ 4166 R300 AF [Radeon 9700 Pro] (Secondary)
+ 4168 Radeon R350 [Radeon 9800] (Secondary)
+ 4170 RV350 AP [Radeon 9600] (Secondary)
+ 1002 0003 R9600 Pro secondary (Asus OEM for HP)
+ 1002 4723 All-in-Wonder 2006 AGP Edition (Secondary)
+ 1458 4025 Giga-Byte GV-R96128D (Secondary)
+ 148c 2067 PowerColor R96A-C3N (Secondary)
+ 174b 7c28 GC-R9600PRO [Sapphire] (Secondary)
+ 17ee 2003 Radeon 9600 256Mb (Secondary)
+ 18bc 0100 GC-R9600PRO (Secondary)
+ 4171 RV350 AQ [Radeon 9600] (Secondary)
+ 1043 c005 A9600SE (Secondary)
+ 4172 RV350 AR [Radeon 9600] (Secondary)
+ 1002 0003 Radeon 9600XT (Secondary)
+ 1002 4773 All-in-Wonder 9600 XT (Secondary)
+ 1043 c003 A9600XT (Secondary)
+ 1043 c01b A9600XT/TD (Secondary)
+ 174b 7c28 Sapphire Radeon 9600XT (Secondary)
+ 1787 4003 Radeon 9600 XT (Secondary)
+ 4173 RV350 AS [Radeon 9550] (Secondary)
+ 1043 010d A9550GE/TD (Secondary)
+ 4237 Radeon 7000 IGP
+ 4242 R200 BB [Radeon All in Wonder 8500DV]
+ 1002 02aa Radeon 8500 AIW DV Edition
+ 4243 R200 BC [Radeon All in Wonder 8500]
+ 4336 Radeon Mobility U1
+ 1002 4336 Pavilion ze4300 ATI Radeon Mobility U1 (IGP 320 M)
+ 103c 0024 Pavilion ze4400 builtin Video
+ 161f 2029 eMachines M5312 builtin Video
+ 4337 Radeon IGP 330M/340M/350M
+ 1014 053a ThinkPad R40e
+ 103c 0850 Radeon IGP 345M
+ 4341 IXP150 AC'97 Audio Controller
+ 4342 IXP200 3COM 3C920B Ethernet Controller
+ 4345 EHCI USB Controller
+ 4347 OHCI USB Controller #1
+ 4348 OHCI USB Controller #2
+ 4349 Dual Channel Bus Master PCI IDE Controller
+ 434d IXP AC'97 Modem
+ 4353 SMBus
+ 4354 215CT [Mach64 CT]
+ 4358 210888CX [Mach64 CX]
+ 4361 IXP SB300 AC'97 Audio Controller
+ 4363 SMBus
+ 436e 436E Serial ATA Controller
+ 4370 IXP SB400 AC'97 Audio Controller
+ 1025 0079 Aspire 5024WLMMi
+ 1025 0091 Aspire 5032WXMi
+ 103c 2a05 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 105b 0c81 Realtek ALC 653
+ 107b 0300 MX6421
+ 1462 0131 MS-1013 Notebook
+ 4371 IXP SB400 PCI-PCI Bridge
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4372 IXP SB400 SMBus Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 1462 7217 Aspire L250
+ 4373 IXP SB400 USB2 Host Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4374 IXP SB400 USB Host Controller
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4375 IXP SB400 USB Host Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4376 IXP SB400 IDE Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 1462 7217 Aspire L250
+ 4377 IXP SB400 PCI-ISA Bridge
+ 1025 0080 Aspire 5024WLMi
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 7217 Aspire L250
+ 4378 SB400 AC'97 Modem Controller
+ 1025 0080 Aspire 5024WLMMi
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 4379 IXP SB400 Serial ATA Controller
+ 1462 7141 Aspire L250
+ 437a IXP SB400 Serial ATA Controller
+ 1002 4379 4379 Serial ATA Controller
+ 1002 437a 437A Serial ATA Controller
+ 1462 7141 Aspire L250
+ 14f1 8800 Leadtek WinFast TV2000XP Expert
+ 437b IXP SB4x0 High Definition Audio Controller
+ 1002 437b IXP SB4x0 High Definition Audio Controller
+ 10cf 1326 Fujitsu Lifebook A3040
+ 1734 10b8 Realtek High Definition Audio
+ 4380 SB600 Non-Raid-5 SATA
+ 103c 2813 DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 b003 GA-MA790FX-DS5 (rev. 1.0)
+ 1458 b005 Gigabyte GA-MA69G-S3H Motherboard
+ 1462 7327 K9AG Neo2
+ 17f2 5999 KI690-AM2 Motherboard
+ 4381 SB600 Raid-5 SATA
+ 4382 SB600 AC97 Audio
+ 4383 SBx00 Azalia (Intel HDA)
+ 103c 1611 Pavilion DM1Z-3000
+ 103c 280a DC5750 Microtower
+ 1043 8230 M3A78-EH Motherboard
+ 1043 836c M4A785TD Motherboard
+ 1043 8410 M4A89GTD PRO/USB3 Motherboard
+ 1043 841b M5A88-V EVO
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 a022 GA-MA770-DS3rev2.0 Motherboard
+ 17f2 5000 KI690-AM2 Motherboard
+ 4384 SBx00 PCI to PCI Bridge
+ 4385 SBx00 SMBus Controller
+ 103c 1611 Pavilion DM1Z-3000
+ 103c 280a DC5750 Microtower
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8389 M4A785TD Motherboard
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 4385 GA-MA770-DS3rev2.0 Motherboard
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4386 SB600 USB Controller (EHCI)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4387 SB600 USB (OHCI0)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4388 SB600 USB (OHCI1)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 4389 SB600 USB (OHCI2)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438a SB600 USB (OHCI3)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438b SB600 USB (OHCI4)
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438c SB600 IDE
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1458 5002 Gigabyte GA-MA69G-S3H Motherboard
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438d SB600 PCI to LPC Bridge
+ 103c 280a DC5750 Microtower
+ 1179 ff50 Satellite P305D-S8995E
+ 1462 7368 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 438e SB600 AC97 Modem
+ 4390 SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode]
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8389 M4A785TD Motherboard
+ 1458 b002 GA-MA770-DS3rev2.0 Motherboard
+ 1849 4390 Motherboard (one of many)
+ 4391 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode]
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 4392 SB7x0/SB8x0/SB9x0 SATA Controller [Non-RAID5 mode]
+ 4393 SB7x0/SB8x0/SB9x0 SATA Controller [RAID5 mode]
+ 4394 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode]
+ 4395 SB8x0/SB9x0 SATA Controller [Storage mode]
+ 4396 SB7x0/SB8x0/SB9x0 USB EHCI Controller
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 4397 SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 4398 SB7x0 USB OHCI1 Controller
+ 1043 82ef M3A78-EH Motherboard
+ 4399 SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 439c SB7x0/SB8x0/SB9x0 IDE Controller
+ 1043 82ef M3A78-EH Motherboard
+ 439d SB7x0/SB8x0/SB9x0 LPC host controller
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 82ef M3A78-EH Motherboard
+ 1043 8443 M5A88-V EVO
+ 43a0 SB700/SB800 PCI to PCI bridge (PCIE port 0)
+ 43a1 SB700/SB800 PCI to PCI bridge (PCIE port 1)
+ 4437 Radeon Mobility 7000 IGP
+ 4554 210888ET [Mach64 ET]
+ 4654 Mach64 VT
+ 4742 3D Rage Pro AGP 1X/2X
+ 1002 0040 Rage Pro Turbo AGP 2X
+ 1002 0044 Rage Pro Turbo AGP 2X
+ 1002 0061 Rage Pro AIW AGP 2X
+ 1002 0062 Rage Pro AIW AGP 2X
+ 1002 0063 Rage Pro AIW AGP 2X
+ 1002 0080 Rage Pro Turbo AGP 2X
+ 1002 0084 Rage Pro Turbo AGP 2X
+ 1002 4742 Rage Pro Turbo AGP 2X
+ 1002 8001 Rage Pro Turbo AGP 2X
+ 1028 0082 Rage Pro Turbo AGP 2X
+ 1028 4082 Optiplex GX1 Onboard Display Adapter
+ 1028 8082 Rage Pro Turbo AGP 2X
+ 1028 c082 Rage Pro Turbo AGP 2X
+ 8086 4152 Xpert 98D AGP 2X
+ 8086 464a Rage Pro Turbo AGP 2X
+ 4744 3D Rage Pro AGP 1X
+ 1002 4744 Rage Pro Turbo AGP
+ 8086 4d55 Rage 3D Pro AGP 1X [Intel MU440EX]
+ 4747 3D Rage Pro
+ 4749 3D Rage Pro
+ 1002 0061 Rage Pro AIW
+ 1002 0062 Rage Pro AIW
+ 474c Rage XC
+ 474d Rage XL AGP 2X
+ 1002 0004 Xpert 98 RXL AGP 2X
+ 1002 0008 Xpert 98 RXL AGP 2X
+ 1002 0080 Rage XL AGP 2X
+ 1002 0084 Xpert 98 AGP 2X
+ 1002 474d Rage XL AGP
+ 1033 806a Rage XL AGP
+ 474e Rage XC AGP
+ 1002 474e Rage XC AGP
+ 474f Rage XL
+ 1002 0008 Rage XL
+ 1002 474f Rage XL
+ 4750 3D Rage Pro 215GP
+ 1002 0040 Rage Pro Turbo
+ 1002 0044 Rage Pro Turbo
+ 1002 0080 Rage Pro Turbo
+ 1002 0084 Rage Pro Turbo
+ 1002 4750 Rage Pro Turbo
+ 4751 3D Rage Pro 215GQ
+ 4752 Rage XL
+ 0e11 001e Proliant Rage XL
+ 1002 0008 Rage XL
+ 1002 4752 Proliant Rage XL
+ 1002 8008 Rage XL
+ 1014 0240 eServer xSeries server mainboard
+ 1028 00ce PowerEdge 1400
+ 1028 00d1 PowerEdge 2550
+ 1028 00d9 PowerEdge 2500
+ 1028 0134 PowerEdge 600SC
+ 1028 014a PowerEdge 1750
+ 1028 0165 PowerEdge 750
+ 103c 10e1 NetServer Rage XL
+ 107b 6400 6400 Server
+ 1734 007a PRIMERGY RX/TX series onboard VGA
+ 8086 3411 SDS2 Mainboard
+ 8086 3427 S875WP1-E mainboard
+ 8086 5744 S845WD1-E mainboard
+ 4753 Rage XC
+ 1002 4753 Rage XC
+ 4754 3D Rage I/II 215GT [Mach64 GT]
+ 4755 3D Rage II+ 215GTB [Mach64 GTB]
+ 4756 3D Rage IIC 215IIC [Mach64 GT IIC]
+ 1002 4756 Rage IIC
+ 4757 3D Rage IIC AGP
+ 1002 4757 Rage IIC AGP
+ 1028 0089 Rage 3D IIC
+ 1028 008e PowerEdge 1300 onboard video
+ 1028 4082 Rage 3D IIC
+ 1028 8082 Rage 3D IIC
+ 1028 c082 Rage 3D IIC
+ 4758 210888GX [Mach64 GX]
+ 4759 3D Rage IIC
+ 475a 3D Rage IIC AGP
+ 1002 0084 Rage 3D Pro AGP 2x XPERT 98
+ 1002 0087 Rage 3D IIC
+ 1002 475a Rage IIC AGP
+ 4964 Radeon RV250 Id [Radeon 9000]
+ 4965 Radeon RV250 Ie [Radeon 9000]
+ 4966 Radeon RV250 If [Radeon 9000]
+ 10f1 0002 RV250 If [Tachyon G9000 PRO]
+ 148c 2039 RV250 If [Radeon 9000 Pro "Evil Commando"]
+ 1509 9a00 RV250 If [Radeon 9000 "AT009"]
+ 1681 0040 RV250 If [3D prophet 9000]
+ 174b 7176 RV250 If [Sapphire Radeon 9000 Pro]
+ 174b 7192 RV250 If [Radeon 9000 "Atlantis"]
+ 17af 2005 RV250 If [Excalibur Radeon 9000 Pro]
+ 17af 2006 RV250 If [Excalibur Radeon 9000]
+ 4967 Radeon RV250 Ig [Radeon 9000]
+ 496e Radeon RV250 [Radeon 9000] (Secondary)
+ 4a48 R420 JH [Radeon X800]
+ 4a49 R420 JI [Radeon X800PRO]
+ 4a4a R420 JJ [Radeon X800SE]
+ 4a4b R420 JK [Radeon X800]
+ 4a4c R420 JL [Radeon X800]
+ 4a4d R420 JM [FireGL X3]
+ 4a4e M18 JN [Radeon Mobility 9800]
+ 4a4f Radeon X800 SE (R420) (AGP)
+ 4a50 R420 JP [Radeon X800XT]
+ 4a54 R420 [Radeon X800 VE]
+ 4a69 R420 [Radeon X800 PRO/GTO] (Secondary)
+ 4a6a R420 [Radeon X800] (Secondary)
+ 4a6b R420 [Radeon X800] (Secondary)
+ 4a70 R420 [X800XT-PE] (Secondary)
+ 4a74 R420 [Radeon X800 VE] (Secondary)
+ 4b48 Radeon X850 Consumer (R481)
+ 4b49 R480 [Radeon X850XT]
+ 4b4a Radeon X850 SE (R480) (AGP)
+ 4b4b R480 [Radeon X850Pro]
+ 4b4c R481 [Radeon X850XT-PE]
+ 4b69 R480 [Radeon X850XT] (Secondary)
+ 4b6b R480 [Radeon X850Pro] (Secondary)
+ 4b6c R481 [Radeon X850XT-PE] (Secondary)
+ 4c42 3D Rage LT Pro AGP-133
+ 0e11 b0e7 Rage LT Pro (Compaq Presario 5240)
+ 0e11 b0e8 Rage 3D LT Pro
+ 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750)
+ 1002 0040 Rage LT Pro AGP 2X
+ 1002 0044 Rage LT Pro AGP 2X
+ 1002 4c42 Rage LT Pro AGP 2X
+ 1002 8001 Rage LT Pro AGP 2X
+ 1028 0085 Rage 3D LT Pro
+ 4c44 3D Rage LT Pro AGP-66
+ 4c45 Rage Mobility M3 AGP
+ 4c46 Rage Mobility M3 AGP 2x
+ 1002 0155 IBM Thinkpad A22p
+ 1014 0155 IBM Thinkpad A22p
+ 1028 00b1 Latitude C600
+ 4c47 3D Rage LT-G 215LG
+ 4c49 3D Rage LT Pro
+ 1002 0004 Rage LT Pro
+ 1002 0040 Rage LT Pro
+ 1002 0044 Rage LT Pro
+ 1002 4c49 Rage LT Pro
+ 4c4d Rage Mobility P/M AGP 2x
+ 0e11 b111 Armada M700
+ 0e11 b160 Armada E500
+ 1002 0084 Xpert 98 AGP 2X (Mobility)
+ 1014 0154 ThinkPad A20m/A21m
+ 1028 00aa Latitude CPt
+ 1028 00bb Latitude CPx
+ 1179 ff00 Satellite 1715XCDS laptop
+ 13bd 1019 PC-AR10
+ 4c4e Rage Mobility L AGP 2x
+ 4c50 3D Rage LT Pro
+ 1002 4c50 Rage LT Pro
+ 4c51 3D Rage LT Pro
+ 4c52 Rage Mobility P/M
+ 1033 8112 Versa Note VXi
+ 4c53 Rage Mobility L
+ 4c54 264LT [Mach64 LT]
+ 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500]
+ 1014 0517 ThinkPad T30
+ 1014 0530 ThinkPad T42 2373-4WU
+ 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100)
+ 1028 012a Latitude C640
+ 1043 1622 Mobility Radeon M7 (L3C/S)
+ 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4
+ 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7]
+ 4c59 Radeon Mobility M6 LY
+ 0e11 b111 Evo N600c
+ 1014 0235 ThinkPad A30/A30p (2652/2653)
+ 1014 0239 ThinkPad X22/X23/X24
+ 103c 0025 XE4500 Notebook
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 104d 8140 PCG-Z1SP laptop
+ 1509 1930 Medion MD9703
+ 4c5a Radeon Mobility M6 LZ
+ 4c64 Radeon RV250 Ld [Radeon Mobility 9000 M9]
+ 4c65 Radeon RV250 Le [Radeon Mobility 9000 M9]
+ 4c66 Radeon RV250 [Mobility FireGL 9000]
+ 1014 054d ThinkPad T41
+ 4c67 Radeon RV250 Lg [Radeon Mobility 9000 M9]
+# Secondary chip to the Lf
+ 4c6e Radeon RV250 Ln [Radeon Mobility 9000 M9] (Secondary)
+ 4d46 Rage Mobility M4 AGP
+ 4d4c Rage Mobility M4 AGP
+ 4d52 Theater 550 PRO PCI [ATI TV Wonder 550]
+ 4d53 Theater 550 PRO PCIe
+ 4e44 Radeon R300 ND [Radeon 9700 Pro]
+ 1002 515e Radeon ES1000
+ 1002 5965 Radeon ES1000
+ 4e45 Radeon R300 NE [Radeon 9500 Pro]
+ 1002 0002 Radeon R300 NE [Radeon 9500 Pro]
+ 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro]
+ 4e46 R300 NF [Radeon 9600 TX]
+ 4e47 Radeon R300 NG [FireGL X1]
+ 4e48 Radeon R350 [Radeon 9800 Pro]
+ 4e49 Radeon R350 [Radeon 9800]
+ 4e4a R360 NJ [Radeon 9800 XT]
+ 1002 4e4a R360 [Radeon 9800 XT]
+ 4e4b R350 NK [FireGL X2]
+ 4e50 RV350 [Mobility Radeon 9600 M10]
+ 1025 005a TravelMate 290
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 144d c00c P35 notebook
+ 1462 0311 MSI M510A
+ 1734 1055 Amilo M1420W
+ 4e51 M10 NQ [Radeon Mobility 9600]
+ 4e52 RV350 [Mobility Radeon 9600 M10]
+ 144d c00c P35 notebook
+ 4e53 M10 NS [Radeon Mobility 9600]
+ 4e54 M10 NT [FireGL Mobility T2]
+ 4e56 M11 NV [FireGL Mobility T2e]
+ 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary)
+ 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary)
+ 1002 0003 Radeon R300 NE [Radeon 9500 Pro]
+ 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary)
+ 4e66 RV350 NF [Radeon 9600] (Secondary)
+ 4e67 Radeon R300 [FireGL X1] (Secondary)
+ 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary)
+ 4e69 Radeon R350 [Radeon 9800] (Secondary)
+ 4e6a RV350 NJ [Radeon 9800 XT] (Secondary)
+ 1002 4e6a R360 [Radeon 9800 XT] (Secondary)
+ 1002 4e71 M10 NQ [Radeon Mobility 9600]
+ 4e71 M10 NQ [Radeon Mobility 9600] (Secondary)
+ 4f72 RV250 [Radeon 9000 Series]
+ 4f73 Radeon RV250 [Radeon 9000 Series] (Secondary)
+ 5041 Rage 128 PA/PRO
+ 5042 Rage 128 PB/PRO AGP 2x
+ 5043 Rage 128 PC/PRO AGP 4x
+ 5044 Rage 128 PD/PRO TMDS
+ 1002 0028 Rage 128 AIW
+ 1002 0029 Rage 128 AIW
+ 5045 Rage 128 PE/PRO AGP 2x TMDS
+ 5046 Rage 128 PF/PRO AGP 4x TMDS
+ 1002 0004 Rage Fury Pro
+ 1002 0008 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0014 Rage Fury Pro
+ 1002 0018 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0028 Rage 128 Pro AIW AGP
+ 1002 002a Rage 128 Pro AIW AGP
+ 1002 0048 Rage Fury Pro
+ 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device)
+ 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)
+ 5047 Rage 128 PG/PRO
+ 5048 Rage 128 PH/PRO AGP 2x
+ 5049 Rage 128 PI/PRO AGP 4x
+ 504a Rage 128 PJ/PRO TMDS
+ 504b Rage 128 PK/PRO AGP 2x TMDS
+ 504c Rage 128 PL/PRO AGP 4x TMDS
+ 504d Rage 128 PM/PRO
+ 504e Rage 128 PN/PRO AGP 2x
+ 504f Rage 128 PO/PRO AGP 4x
+ 5050 Rage 128 PP/PRO TMDS [Xpert 128]
+ 1002 0008 Xpert 128
+ 5051 Rage 128 PQ/PRO AGP 2x TMDS
+ 5052 Rage 128 PR/PRO AGP 4x TMDS
+ 5053 Rage 128 PS/PRO
+ 5054 Rage 128 PT/PRO AGP 2x
+ 5055 Rage 128 PU/PRO AGP 4x
+ 5056 Rage 128 PV/PRO TMDS
+ 5057 Rage 128 PW/PRO AGP 2x TMDS
+ 5058 Rage 128 PX/PRO AGP 4x TMDS
+ 5144 Radeon R100 QD [Radeon 7200]
+ 1002 0008 Radeon 7000/Radeon VE
+ 1002 0009 Radeon 7000/Radeon
+ 1002 000a Radeon 7000/Radeon
+ 1002 001a Radeon 7000/Radeon
+ 1002 0029 Radeon AIW
+ 1002 0038 Radeon 7000/Radeon
+ 1002 0039 Radeon 7000/Radeon
+ 1002 008a Radeon 7000/Radeon
+ 1002 00ba Radeon 7000/Radeon
+ 1002 0139 Radeon 7000/Radeon
+ 1002 028a Radeon 7000/Radeon
+ 1002 02aa Radeon AIW
+ 1002 053a Radeon 7000/Radeon
+ 5145 Radeon R100 QE
+ 5146 Radeon R100 QF
+ 5147 Radeon R100 QG
+ 5148 Radeon R200 QH [Radeon 8500]
+ 1002 010a FireGL 8800 64Mb
+ 1002 0152 FireGL 8800 128Mb
+ 1002 0162 FireGL 8700 32Mb
+ 1002 0172 FireGL 8700 64Mb
+ 5149 Radeon R200 QI
+ 514a Radeon R200 QJ
+ 514b Radeon R200 QK
+ 514c Radeon R200 QL [Radeon 8500 LE]
+ 1002 003a Radeon R200 QL [Radeon 8500 LE]
+ 1002 013a Radeon 8500
+ 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition]
+ 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb]
+ 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE]
+ 1787 0f08 Radeon R200 QL [PowerMagic Radeon 8500]
+ 514d Radeon R200 QM [Radeon 9100]
+ 514e Radeon R200 QN [Radeon 8500LE]
+ 514f Radeon R200 QO [Radeon 8500LE]
+ 5154 R200 QT [Radeon 8500]
+ 5155 R200 QU [Radeon 9100]
+ 5157 Radeon RV200 QW [Radeon 7500]
+ 1002 013a Radeon 7500
+ 1002 0f2b ALL-IN-WONDER VE PCI
+ 1002 103a Dell Optiplex GX260
+ 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR]
+ 148c 2024 RV200 QW [Radeon 7500LE Dual Display]
+ 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition]
+ 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display]
+ 174b 7146 RV200 QW [Radeon 7500 LE]
+ 174b 7147 RV200 QW [Sapphire Radeon 7500LE]
+ 174b 7161 Radeon RV200 QW [Radeon 7500 LE]
+ 17af 0202 RV200 QW [Excalibur Radeon 7500LE]
+ 5158 Radeon RV200 QX [Radeon 7500]
+ 5159 Radeon RV100 QY [Radeon 7000/VE]
+ 1002 000a Radeon 7000/Radeon VE
+ 1002 000b Radeon 7000
+ 1002 0038 Radeon 7000/Radeon VE
+ 1002 003a Radeon 7000/Radeon VE
+ 1002 00ba Radeon 7000/Radeon VE
+ 1002 013a Radeon 7000/Radeon VE
+ 1002 0908 XVR-100 (supplied by Sun)
+# The IBM card doubles as an ATI PCI video adapter
+ 1014 029a Remote Supervisor Adapter II (RSA2)
+ 1014 02c8 eServer xSeries server mainboard
+ 1028 016c PowerEdge 1850 Embedded Radeon 7000/VE
+ 1028 016d PowerEdge 2850 Embedded Radeon 7000-M
+ 1028 0170 PowerEdge 6850 Embedded Radeon 7000/VE
+ 1028 019a PowerEdge SC1425
+ 103c 1292 Radeon 7000
+ 1043 c00a A7000/T/64M
+ 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series]
+ 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition]
+ 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display]
+ 174b 0280 Radeon RV100 QY [Radeon 7000/VE]
+ 174b 7112 RV100 QY [Sapphire Radeon VE 7000]
+ 174b 7c28 Sapphire Radeon VE 7000 DDR
+ 1787 0202 RV100 QY [Excalibur Radeon 7000]
+ 17ee 1001 Radeon 7000 64MB DDR + DVI
+ 515a Radeon RV100 QZ [Radeon 7000/VE]
+ 515e ES1000
+ 1028 01bb PowerEdge 1955 Embedded ATI ES1000
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 1028 01f0 PowerEdge R900 Embedded ATI ES1000
+ 1028 0205 PowerEdge 2970 Embedded ATI ES1000
+ 1028 020b PowerEdge T605 Embedded ATI ES1000
+ 1028 020f PowerEdge R300 Embedded ATI ES1000
+ 1028 0210 PowerEdge T300 Embedded ATI ES1000
+ 1028 0221 PowerEdge R805 Embedded ATI ES1000
+ 1028 0223 PowerEdge R905 Embedded ATI ES1000
+ 1028 0225 PowerEdge T105 Embedded ATI ES1000
+ 1028 023c PowerEdge R200 Embedded ATI ES1000
+ 103c 1304 Integrity iLO2 Advanced KVM VGA [AD307A]
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 S5000PSLSATA Server Board
+ 515f ES1000
+ 5168 Radeon R200 Qh
+ 5169 Radeon R200 Qi
+ 516a Radeon R200 Qj
+ 516b Radeon R200 Qk
+# This one is not in ATI documentation, but is in XFree86 source code
+ 516c Radeon R200 Ql
+ 5245 Rage 128 RE/SG
+ 1002 0008 Xpert 128
+ 1002 0028 Rage 128 AIW
+ 1002 0029 Rage 128 AIW
+ 1002 0068 Rage 128 AIW
+ 5246 Rage 128 RF/SG AGP
+ 1002 0004 Magnum/Xpert 128/Xpert 99
+ 1002 0008 Magnum/Xpert128/X99/Xpert2000
+ 1002 0028 Rage 128 AIW AGP
+ 1002 0044 Rage Fury/Xpert 128/Xpert 2000
+ 1002 0068 Rage 128 AIW AGP
+ 1002 0448 Rage Fury
+ 5247 Rage 128 RG
+ 524b Rage 128 RK/VR
+ 524c Rage 128 RL/VR AGP
+ 1002 0008 Xpert 99/Xpert 2000
+ 1002 0088 Xpert 99
+ 5345 Rage 128 SE/4x
+ 5346 Rage 128 SF/4x AGP 2x
+ 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL
+ 5347 Rage 128 SG/4x AGP 4x
+ 5348 Rage 128 SH
+ 534b Rage 128 SK/4x
+ 534c Rage 128 SL/4x AGP 2x
+ 534d Rage 128 SM/4x AGP 4x
+ 1002 0008 Xpert 99/Xpert 2000
+ 1002 0018 Xpert 2000
+ 534e Rage 128 4x
+ 5354 Mach 64 VT
+ 1002 5654 Mach 64 reference
+ 5446 Rage 128 Pro Ultra TF
+ 1002 0004 Rage Fury Pro
+ 1002 0008 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0018 Rage Fury Pro/Xpert 2000 Pro
+ 1002 0028 Rage 128 AIW Pro AGP
+ 1002 0029 Rage 128 AIW
+ 1002 002a Rage 128 AIW Pro AGP
+ 1002 002b Rage 128 AIW
+ 1002 0048 Xpert 2000 Pro
+ 544c Rage 128 Pro Ultra TL
+ 5452 Rage 128 Pro Ultra TR
+ 1002 001c Rage 128 Pro 4XL
+ 103c 1279 Rage 128 Pro 4XL
+ 5453 Rage 128 Pro Ultra TS
+ 5454 Rage 128 Pro Ultra TT
+ 5455 Rage 128 Pro Ultra TU
+ 5460 M22 [Mobility Radeon X300]
+ 1775 1100 CR11/VR11 Single Board Computer
+ 5461 M22 [Mobility Radeon X300]
+ 5462 M24 [Radeon Mobility X600]
+ 5464 M22 [FireGL GL]
+ 5548 R423 UH [Radeon X800 (PCIE)]
+ 5549 R423 UI [Radeon X800PRO (PCIE)]
+ 554a R423 UJ [Radeon X800LE (PCIE)]
+ 554b R423 UK [Radeon X800SE (PCIE)]
+ 554c Radeon X800 XTP (R430) (PCIE)
+ 554d R430 [Radeon X800 XL] (PCIe)
+ 1458 2124 GV-R80L256V-B (AGP)
+ 554e Radeon X800 SE (R430) (PCIE)
+ 554f R430 [Radeon X800 (PCIE)]
+ 5550 R423 [FireGL V7100]
+ 5551 R423 [FireGL V5100 (PCIE)]
+ 5552 R423 UR [FireGL V5100 (PCIE)]
+ 5554 R423 UT [FireGL V7100 (PCIE)]
+ 5555 R430 GL PRO
+ 5569 R423 UI [Radeon X800PRO (PCIE)] (Secondary)
+ 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary)
+ 556d R430 [Radeon X800 XL] (PCIe) (Secondary)
+ 1458 2125 GV-R80L256V-B (AGP)
+ 556f R430 [Radeon X800] (PCIE) (Secondary)
+ 5571 R423GL-SE [FireGL V5100 (PCIE)] (Secondary)
+ 564a M26 [Mobility FireGL V5000]
+ 564b M26 [Mobility FireGL V5000]
+ 564f M26 [Radeon Mobility X700 XL (PCIE)]
+ 5652 M26 [Radeon Mobility X700]
+ 5653 Radeon Mobility X700 (PCIE)
+ 1025 0080 Aspire 5024WLMi
+ 103c 0940 HP Compaq NW8240 Mobile Workstation
+ 5654 264VT [Mach64 VT]
+ 1002 5654 Mach64VT Reference
+ 5655 264VT3 [Mach64 VT3]
+ 5656 264VT4 [Mach64 VT4]
+ 5657 Radeon X550/X700 Series (RV410)
+ 5830 RS300 Host Bridge
+ 5831 RS300 Host Bridge
+ 5832 RS300 Host Bridge
+ 5833 Radeon 9100 IGP Host Bridge
+ 5834 Radeon 9100 IGP
+ 5835 RS300M AGP [Radeon Mobility 9100IGP]
+ 5838 Radeon 9100 IGP AGP Bridge
+ 5854 Radeon Xpress Series (RS480)
+ 5874 Radeon Xpress Series (RS482)
+ 5940 RV280 [Radeon 9200 PRO] (Secondary)
+ 17af 2021 Excalibur Radeon 9250 (Secondary)
+ 5941 RV280 [Radeon 9200] (Secondary)
+ 1458 4019 Gigabyte Radeon 9200
+ 174b 7c12 Sapphire Radeon 9200
+ 17af 200d Excalibur Radeon 9200
+ 18bc 0050 GeXcube GC-R9200-C3 (Secondary)
+ 5944 RV280 [Radeon 9200 SE (PCI)]
+ 5950 RS480 Host Bridge
+ 1025 0080 Aspire 5024WLMMi
+ 103c 280a DC5750 Microtower
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 1462 7217 Aspire L250
+ 5951 Radeon Xpress 200 (RS480/RS482/RX480/RX482) Chipset - Host bridge
+ 5952 RD580 [CrossFire Xpress 3200] Chipset Host Bridge
+ 5954 RS480 [Radeon Xpress 200G Series]
+ 1002 5954 RV370 [Radeon Xpress 200G Series]
+ 5955 Radeon XPRESS 200M 5955 (PCIE)
+ 1002 5955 RS480 0x5955 [Radeon XPRESS 200M 5955 (PCIE)]
+ 103c 308b MX6125
+ 1462 0131 MS-1013 Notebook
+ 5956 RD790 Northbridge only dual slot PCI-e_GFX and HT3 K8 part
+ 5957 RX780/RX790 Chipset Host Bridge
+ 1849 5957 A770CrossFire Motherboard
+ 5958 RD780 Northbridge only dual slot PCI-e_GFX and HT1 K8 part
+ 5960 RV280 [Radeon 9200 PRO]
+ 17af 2020 Excalibur Radeon 9250
+ 5961 RV280 [Radeon 9200]
+ 1002 2f72 All-in-Wonder 9200 Series
+ 1019 4c30 Radeon 9200 VIVO
+ 12ab 5961 YUAN SMARTVGA Radeon 9200
+ 1458 4018 Gigabyte Radeon 9200
+ 174b 7c13 Sapphire Radeon 9200
+ 17af 200c Excalibur Radeon 9200
+ 18bc 0050 Radeon 9200 Game Buster
+ 18bc 0051 GeXcube GC-R9200-C3
+ 18bc 0053 Radeon 9200 Game Buster VIVO
+ 5962 RV280 [Radeon 9200]
+ 5964 RV280 [Radeon 9200 SE]
+ 1002 5964 Radeon 9200 SE, 64-bit 128MB DDR, 200/166MHz
+ 1043 c006 ASUS Radeon 9200 SE / TD / 128M
+ 1458 4018 Radeon 9200 SE
+ 1458 4032 Radeon 9200 SE 128MB
+ 147b 6191 R9200SE-DT
+ 148c 2073 CN-AG92E
+ 174b 7c13 Sapphire Radeon 9200 SE
+ 1787 5964 Excalibur 9200SE VIVO 128M
+ 17af 2012 Radeon 9200 SE Excalibur
+ 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster
+ 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
+ 5965 RV280 [FireMV 2200 PCI]
+ 5969 ES1000
+ 5974 RS482 [Radeon Xpress 200]
+ 103c 280a DC5750 Microtower
+ 1462 7141 Aspire L250
+ 5975 RS482 [Radeon Xpress 200M]
+ 5978 RD790 PCI to PCI bridge (external gfx0 port A)
+ 1849 5957 A770CrossFire Motherboard
+ 5979 RD790 PCI to PCI bridge (external gfx0 port B)
+ 597a RD790 PCI to PCI bridge (PCI express gpp port A)
+ 597b RD790 PCI to PCI bridge (PCI express gpp port B)
+ 597c RD790 PCI to PCI bridge (PCI express gpp port C)
+ 597d RD790 PCI to PCI bridge (PCI express gpp port D)
+ 597e RD790 PCI to PCI bridge (PCI express gpp port E)
+ 1849 5957 A770CrossFire Motherboard
+ 597f RD790 PCI to PCI bridge (PCI express gpp port F)
+ 1849 5957 A770CrossFire Motherboard
+ 5980 RD790 PCI to PCI bridge (external gfx1 port A)
+ 5981 RD790 PCI to PCI bridge (external gfx1 port B)
+ 5982 RD790 PCI to PCI bridge (NB-SB link)
+ 5a10 RD890 Northbridge only dual slot (2x16) PCI-e GFX Hydra part
+ 5a11 RD890 Northbridge only single slot PCI-e GFX Hydra part
+ 5a12 RD890 Northbridge only dual slot (2x8) PCI-e GFX Hydra part
+ 5a13 RD890 PCI to PCI bridge (external gfx0 port A)
+ 5a14 RD890 PCI to PCI bridge (external gfx0 port B)
+ 5a15 RD890 PCI to PCI bridge (PCI express gpp port A)
+ 5a16 RD890 PCI to PCI bridge (PCI express gpp port B)
+ 5a17 RD890 PCI to PCI bridge (PCI express gpp port C)
+ 5a18 RD890 PCI to PCI bridge (PCI express gpp port D)
+ 5a19 RD890 PCI to PCI bridge (PCI express gpp port E)
+ 5a1a RD890 PCI to PCI bridge (PCI express gpp port F)
+ 5a1b RD890 PCI to PCI bridge (PCI express gpp port G)
+ 5a1c RD890 PCI to PCI bridge (PCI express gpp port H)
+ 5a1d RD890 PCI to PCI bridge (external gfx1 port A)
+ 5a1e RD890 PCI to PCI bridge (external gfx1 port B)
+ 5a1f RD890 PCI to PCI bridge (NB-SB link)
+ 5a33 Radeon Xpress 200 Host Bridge
+ 5a34 RS480 PCI-X Root Port
+# Comes in pair with 5a3f
+ 5a36 RS480 PCI Bridge
+ 5a37 RS480 PCI Bridge
+ 5a38 RS480 PCI Bridge
+# Comes in pair with 5a38
+ 5a39 RS480 PCI Bridge
+ 5a3f RS480 PCI Bridge
+ 1462 7217 Aspire L250
+ 5a41 RS400 [Radeon Xpress 200]
+ 5a42 RS400 [Radeon Xpress 200M]
+ 5a43 Radeon Xpress Series (RS400)
+ 5a61 RC410 [Radeon Xpress 200]
+ 5a62 RC410 [Radeon Xpress 200M]
+ 5a63 Radeon Xpress Series (RC410)
+ 5b60 RV370 5B60 [Radeon X300 (PCIE)]
+ 1043 002a Extreme AX300SE-X
+ 1043 032e Extreme AX300/TD
+ 1458 2102 GV-RX30S128D (X300SE)
+ 1462 0400 RX300SE-TD128E (MS-8940 REV:200)
+ 1462 0402 RX300SE-TD128E (MS-8940)
+ 174b 0500 Radeon X300 (PCIE)
+ 196d 1086 X300SE HM
+ 5b62 RV380 [Radeon X600 (PCIE)]
+ 5b63 RV370 [Sapphire X550 Silent]
+ 5b64 RV370 5B64 [FireGL V3100 (PCIE)]
+ 5b65 RV370 5B65 [FireGL D1100 (PCIE)]
+ 5b66 RV370X
+ 5b70 RV370 [Radeon X300SE]
+ 1462 0403 RX300SE-TD128E (MS-8940) (secondary display)
+ 174b 0501 Radeon X300SE
+ 196d 1087 X300SE HM
+ 5b72 RV380 [Radeon X600]
+ 5b73 RV370 secondary [Sapphire X550 Silent]
+ 5b74 RV370 5B64 [FireGL V3100 (PCIE)] (Secondary)
+ 5b75 RV370 5B75 [FireGL D1100 (PCIE)] (Secondary)
+ 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)]
+ 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)]
+ 1002 5c63 Apple iBook G4 2004
+ 144d c00c P30 notebook
+ 5d44 RV280 [Radeon 9200 SE] (Secondary)
+ 1458 4019 Radeon 9200 SE (Secondary)
+ 1458 4032 Radeon 9200 SE 128MB
+ 147b 6190 R9200SE-DT (Secondary)
+ 174b 7c12 Sapphire Radeon 9200 SE (Secondary)
+ 1787 5965 Excalibur 9200SE VIVO 128M (Secondary)
+ 17af 2013 Radeon 9200 SE Excalibur (Secondary)
+ 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary)
+ 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
+ 5d45 RV280 [FireMV 2200 PCI] (secondary)
+ 5d48 M28 [Radeon Mobility X800XT]
+ 5d49 M28 [Mobility FireGL V5100]
+ 5d4a Mobility Radeon X800
+ 5d4c Radeon X850 (PCIE)
+ 5d4d R480 [Radeon X850XT Platinum (PCIE)]
+ 5d4e Radeon X850 SE (R480) (PCIE)
+ 5d4f R480 [Radeon X800 GTO (PCIE)]
+ 5d50 FireGL V7200 (R480) (PCIE)
+ 5d51 R480 GL 12P
+ 5d52 R480 [Radeon X850XT (PCIE)] (Primary)
+ 1002 0b12 PowerColor X850XT PCIe (Primary)
+ 1002 0b13 PowerColor X850XT PCIe (Secondary)
+ 5d57 R423 5F57 [Radeon X800XT (PCIE)]
+ 5d6d R480 [Radeon X850XT Platinum (PCIE)] (Secondary)
+ 5d6f R480 [Radeon X800 GTO (PCIE)] (Secondary)
+ 5d72 R480 [Radeon X850XT (PCIE)] (Secondary)
+ 5d77 R423 5F57 [Radeon X800XT (PCIE)] (Secondary)
+ 5e48 RV410 [FireGL V5000]
+ 5e49 RV410 [FireGL V3300]
+ 5e4a RV410 [Radeon X700XT]
+ 5e4b RV410 [Radeon X700 Pro (PCIE)]
+ 5e4c RV410 [Radeon X700SE]
+ 5e4d RV410 [Radeon X700 (PCIE)]
+ 148c 2116 PowerColor Bravo X700
+ 5e4f RV410 [Radeon X700]
+ 5e6b RV410 [Radeon X700 Pro (PCIE)] (Secondary)
+ 5e6d RV410 [Radeon X700 (PCIE)] (Secondary)
+ 148c 2117 PowerColor Bravo X700
+ 5f57 R423 [Radeon X800XT (PCIE)]
+ 6718 Cayman XT [AMD Radeon HD 6900 Series]
+ 6719 Cayman PRO [AMD Radeon 6900 Series]
+ 671d Antilles [AMD Radeon HD 6990]
+ 671f NI CAYMAN [Radeon HD 6900 Series]
+ 6720 Blackcomb [AMD Radeon HD 6900M Series]
+ 6738 Barts XT [ATI Radeon HD 6800 Series]
+ 6739 Barts PRO [ATI Radeon HD 6800 Series]
+ 673e Barts LE [AMD Radeon HD 6700 Series]
+ 6740 Whistler XT [AMD Radeon HD 6700M Series]
+ 6741 NI Whistler [AMD Radeon HD 6600M Series]
+ 6742 Whistler LE [AMD Radeon HD 6625M Graphics]
+ 6743 NI WHISTLER [Radeon E6760]
+ 6750 Turks [AMD Radeon HD 6500 series]
+ 6758 Turks XT [AMD Radeon HD 6600 Series]
+ 6759 NI Turks [AMD Radeon HD 6500]
+ 6760 NI Seymour [AMD Radeon HD 6470M]
+ 6761 NI Seymour [AMD Radeon HD 6430M]
+ 6763 NI SEYMOUR [Radoen] E6460
+ 6770 NI CAICOS [AMD Radeon HD 6400 Series]
+ 6779 NI Caicos [AMD RADEON HD 6450]
+ 174b e164 Sapphire HD 6450 1GB DDR3
+ 6858 SI LOMBOK [Radoen HD 6000 Series]
+ 6889 EG Cypress [FirePro V7800]
+ 688c Cypress [AMD FireStream 9370]
+ 688d Cypress [AMD FireStream 9350]
+ 6898 Radeon HD 5870 (Cypress)
+ 1462 8032 R5870 PM2D1G
+ 6899 Cypress [Radeon HD 5800 Series]
+ 689b EG CYPRESS [Radeon HD 6800 Series]
+ 689c Hemlock [ATI Radeon HD 5900 Series]
+ 689e Radeon HD 5800 Series (Cypress LE)
+ 68a0 Broadway XT [Mobility Radeon HD 5800 Series]
+ 103c 1520 Broadway XT [FirePro M7820]
+ 68a1 Broadway PRO [Mobility Radeon HD 5800 Series]
+ 68a8 Broadway [ATI Mobility Radeon HD 6800 Series]
+ 68b8 Juniper [Radeon HD 5700 Series]
+ 68b9 Juniper [ATI Radeon HD 5600/5700]
+ 68ba Juniper XT [AMD Radeon HD 6000 Series]
+ 68be Juniper [Radeon HD 5750 Series]
+ 68bf Juniper LE [AMD Radeon HD 6700 Series]
+ 68c0 Madison [Mobility Radeon HD 5000 Series]
+ 103c 1521 Madison XT [FirePro M5800]
+ 68c1 Madison [AMD Radeon HD 5000M Series]
+ 1025 0347 Aspire 7740G
+ 103c 1521 Madison Pro [FirePro M5800]
+ 68c7 Pinewood [Radeon HD 5570]
+ 68c8 FirePro V4800
+ 68d8 Redwood [Radeon HD 5670]
+ 68d9 Redwood PRO [Radeon HD 5500 Series]
+ 68da Redwood PRO [Radeon HD 5500 Series]
+ 68e0 Manhattan [Mobility Radeon HD 5400 Series]
+ 103c 1486 TouchSmart tm2-2050er discrete GPU (Mobility Radeon HD 5450)
+ 68e1 Manhattan [Mobility Radeon HD 5430 Series]
+ 68e4 Robson CE [AMD Radeon HD 6300 Series]
+ 68e5 Robson LE [AMD Radeon HD 6300M Series]
+ 68f1 Cadar [FirePro 2460]
+ 68f2 Cedar [FirePro 2270]
+ 68f9 Cedar PRO [Radeon HD 5450]
+ 1028 010e XPS 8300
+ 700f PCI Bridge [IGP 320M]
+ 7010 PCI Bridge [IGP 340M]
+ 7100 R520 [Radeon X1800]
+ 7102 M58 [Radeon Mobility X1800]
+ 7103 M58 [Mobility FireGL V7200]
+ 7104 R520GL [FireGL V7200] (Primary)
+ 7105 R520 [FireGL]
+ 7106 M58 [Mobility FireGL V7100]
+ 7108 M58 [Radeon Mobility X1800]
+ 7109 R520 [Radeon X1800]
+ 1002 0322 All-in-Wonder X1800XL
+ 1002 0d02 Radeon X1800 CrossFire Edition
+ 710a R520 [Radeon X1800]
+ 710b R520 [Radeon X1800]
+ 710c R520 [Radeon X1800]
+ 7120 R520 [Radeon X1800] (Secondary)
+ 7124 R520GL [FireGL V7200] (Secondary)
+ 7129 R520 [Radeon X1800] (Secondary)
+ 1002 0323 All-in-Wonder X1800XL (Secondary)
+ 1002 0d03 Radeon X1800 CrossFire Edition (Secondary)
+ 7140 RV515 [Radeon X1600]
+ 7142 RV515 PRO [Radeon X1300/X1550 Series]
+ 1002 0322 All-in-Wonder 2006 PCI-E Edition
+ 1043 0142 EAX1300PRO/TD/256M
+ 7143 RV505 [Radeon X1550 Series]
+ 7145 Radeon Mobility X1400
+ 17aa 2006 Thinkpad T60 model 2007
+ 7146 RV515 [Radeon X1300]
+ 1002 0322 All-in-Wonder 2006 PCI-E Edition
+ 1545 1996 Radeon X1300 512MB PCI-e
+ 7147 RV505 [Radeon X1550 64-bit]
+ 7149 M52 [Mobility Radeon X1300]
+ 714a M52 [Mobility Radeon X1300]
+ 714b M52 [Mobility Radeon X1300]
+ 714c M52 [Mobility Radeon X1300]
+ 714d RV515 [Radeon X1300]
+ 714e RV515LE [Radeon X1300]
+ 7152 RV515GL [FireGL V3300] (Primary)
+ 7153 RV515GL [FireGL V3350]
+ 715e RV515 [Radeon X1300]
+ 715f RV505 CE [Radeon X1550 64-bit]
+ 7162 RV515 PRO [Radeon X1300/X1550 Series] (Secondary)
+ 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)
+ 7163 RV505 [Radeon X1550 Series] (Secondary)
+ 7166 RV515 [Radeon X1300] (Secondary)
+ 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)
+ 1545 1997 Radeon X1300 512MB PCI-e (Secondary)
+ 7167 RV515 [Radeon X1550 64-bit] (Secondary)
+ 716e RV515LE [Radeon X1300] Secondary
+ 7172 RV515GL [FireGL V3300] (Secondary)
+ 7173 RV515GL [FireGL V3350] (Secondary)
+ 7180 RV516 [Radeon X1300/X1550 Series]
+ 7181 RV516 XT Radeon X1600 Series (Primary)
+ 7183 RV516 [Radeon X1300/X1550 Series]
+ 7186 RV515 [Radeon Mobility X1450]
+ 7187 RV516 [Radeon X1300/X1550 Series]
+ 7188 M64-S [Mobility Radeon X2300]
+ 103c 30c1 6910p
+ 718a Mobility Radeon X2300
+ 718c M62CSP64 [Mobility Radeon X1350]
+ 718d M64CSP128 [Mobility Radeon X1450]
+ 7193 RV516 [Radeon X1550 Series]
+ 7196 RV516 [Mobility Radeon X1350]
+ 719b FireMV 2250
+ 719f RV516LE [Radeon X1550 64-bit]
+ 71a0 RV516 [Radeon X1300/X1550 Series] (Secondary)
+ 71a1 RV516 XT Radeon X1600 Series (Secondary)
+ 71a3 RV516 [Radeon X1300 Pro] (Secondary)
+ 71a7 RV516 [Radeon X1300/X1550 Series] (Secondary)
+ 71bb FireMV 2250 (Secondary)
+ 71c0 RV530 [Radeon X1600]
+ 71c1 Radeon X1650 Pro
+ 71c2 RV530 [Radeon X1600]
+ 71c4 M56GL [Mobility FireGL V5200]
+ 17aa 2007 ThinkPad T60p
+ 71c5 M56P [Radeon Mobility X1600]
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq NW8440
+ 1043 10b2 A6J-Q008
+ 106b 0080 MacBook Pro
+ 71c6 RV530LE [Radeon X1600/X1650 PRO]
+ 71c7 RV535 [Radeon X1650 Series]
+ 71ce RV530LE [Radeon X1600]
+ 71d2 RV530GL [FireGL V3400]
+ 71d4 M66GL [ATI Mobility FireGL V5250]
+ 71d5 M66-P [Mobility Radeon X1700]
+ 71d6 M66-XT [Mobility Radeon X1700]
+ 71de RV530LE [Radeon X1600]
+ 71e0 RV530 [Radeon X1600] (Secondary)
+ 71e1 Radeon X1650 Pro (Secondary)
+ 71e2 RV530 [Radeon X1600] (Secondary)
+ 71e6 RV530LE [Radeon X1650 PRO] (Secondary)
+ 71e7 RV535 [Radeon X1650 Series]
+ 71f2 RV530GL [FireGL V3400 (Secondary)]
+ 7210 M71 [Mobility Radeon X2100]
+ 7211 M71 [Mobility Radeon X2100] (Secondary)
+ 7240 R580 [Radeon X1900]
+ 7241 R580 [Radeon X1900]
+ 7242 R580 [Radeon X1900]
+ 7243 R580 [Radeon X1900]
+ 7244 R580 [Radeon X1900]
+ 7245 R580 [Radeon X1900]
+ 7246 R580 [Radeon X1900]
+ 7247 R580 [Radeon X1900]
+ 7248 R580 [Radeon X1900]
+ 7249 R580 [Radeon X1900 XT] (Primary)
+ 724a R580 [Radeon X1900]
+ 724b R580 [Radeon X1900]
+ 1002 0b12 Radeon X1900 (Primary)
+ 1002 0b13 Radeon X1900 (Secondary)
+ 724c R580 [Radeon X1900]
+ 724d R580 [Radeon X1900]
+ 724e R580 [AMD Stream Processor]
+ 7269 R580 [Radeon X1900 XT] (Secondary)
+ 726b R580 [Radeon X1900]
+ 726e R580 [AMD Stream Processor] (Secondary)
+ 7280 RV570 [Radeon X1950 Pro]
+ 7288 Radeon X1950 GT
+ 7291 Radeon X1650 XT (Primary) (PCIE)
+ 7293 Radeon X1650 Series
+ 72a0 RV570 [Radeon X1950 Pro] (secondary)
+ 72a8 Radeon X1950 GT (Secondary)
+ 72b1 Radeon X1650 XT (Secondary) (PCIE)
+ 72b3 Radeon X1650 Series (Secondary)
+ 7833 Radeon 9100 IGP Host Bridge
+ 7834 Radeon 9100 PRO IGP
+ 7835 Radeon Mobility 9200 IGP
+ 7838 Radeon 9100 IGP PCI/AGP Bridge
+ 7910 RS690 Host Bridge
+ 1179 ff50 Satellite P305D-S8995E
+ 17f2 5000 KI690-AM2 Motherboard
+ 7911 RS690 Host Bridge
+ 7912 RS690 PCI to PCI Bridge (Internal gfx)
+ 7913 RS690 PCI to PCI Bridge (PCI Express Graphics Port 0)
+ 7915 RS690 PCI to PCI Bridge (PCI Express Port 1)
+ 7916 RS690 PCI to PCI Bridge (PCI Express Port 2)
+ 7917 RS690 PCI to PCI Bridge (PCI Express Port 3)
+ 1002 7910 RS690 PCI to PCI Bridge
+ 7919 Radeon X1200 Series Audio Controller
+ 1179 7919 Satellite P305D-S8995E
+ 17f2 5000 KI690-AM2 Motherboard
+ 791e RS690 [Radeon X1200 Series]
+ 1462 7327 K9AG Neo2
+ 17f2 5000 KI690-AM2 Motherboard
+ 791f RS690M [Radeon X1200 Series]
+ 1179 ff50 Satellite P305D-S8995E
+ 7930 Radeon Xpress 7930 Host Bridge
+ 7932 RS7932 PCI Bridge
+ 7933 RS7933 PCI Bridge
+ 7936 RS7936 PCI Bridge
+ 793b RS600 audio device [Radeon Xpress 12xx Series]
+ 793f RS600 [Radeon Xpress 1200 Series]
+ 7941 RS600 [Radeon Xpress 1200 Series]
+ 7942 Radeon Xpress 1250
+ 796e Radeon 2100
+ 7c37 RV350 AQ [Radeon 9600 SE]
+ 9400 R600 [Radeon HD 2900 Series]
+ 1002 3000 Sapphire Radeon HD 2900 XT
+ 1002 3142 HIS Radeon HD 2900XT 512MB GDDR3 VIVO PCIe
+ 9403 R600 [Radeon HD 2900 PRO]
+ 940a R600GL [Fire GL V8650]
+ 940b R600GL [Fire GL V8600]
+ 940f R600 [FireGL V7600]
+ 9440 RV770 [Radeon HD 4870]
+ 9441 R700 [Radeon HD 4870 X2]
+ 9442 RV770 [Radeon HD 4850]
+ 1002 0502 MSI R4850-T2D512
+ 174b e810 Sapphire HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink
+ 9443 R700 [Radeon HD 4850]
+ 944a M98L [Mobility Radeon HD 4850]
+ 944c RV770 LE [Radeon HD 4800 Series]
+ 944e RV770 CE [Radeon HD 4710]
+ 9450 RV770 [FireStream 9270]
+ 9452 RV770 [FireStream 9250]
+ 945a M98 XT [Mobility Radeon HD 4870]
+ 9460 RV790 [Radeon HD 4890]
+ 9462 RV790LE [Radeon HD 4800 Series]
+ 9480 M96 [Mobility Radeon HD 4650]
+ 103c 3628 ATI Mobility Radeon HD 4650 [dv6-1190en]
+ 9485 RV740 Pro [Radeon HD 4770]
+ 9489 M96 XT [Mobility FireGL V5725]
+ 9490 RV730XT [Radeon HD 4670]
+ 174b e880 Radeon HD 4670 512MB DDR3
+ 9491 M96 CSP [ATI RADEON E4690]
+ 9495 RV730 Pro AGP [Radeon HD 4600 Series]
+ 1002 9495 RV730 XT [PowerColor Radeon HD4670 AGP 1GB DDR]
+ 1458 0028 HD4650
+ 9498 RV730 PRO [Radeon HD 4650]
+ 949e RV370 [FirePro V5700]
+ 949f RV730 [FirePro V5700]
+ 94a0 Mobility Radeon HD 4830 [M97]
+ 94a1 [M97 XT] Mobility Radeon HD 4860
+ 94a3 M97 GL [ATI FirePro M7740]
+ 94b3 Radeon HD 4770 [RV740]
+ 94b4 RV740 LE [ATI Radeon HD 4700 Series]
+ 94c1 RV610 [Radeon HD 2400 XT]
+ 1028 0211 Optiplex 755
+ 1028 0d02 Optiplex 755
+ 94c3 RV610 video device [Radeon HD 2400 PRO]
+ 1002 94c3 Radeon HD 2400PRO
+ 1028 0302 Radeon HD 2400 Pro
+ 174b e400 Sapphire HD 2400 PRO video device
+ 18bc 3550 GeCube Radeon HD2400 PRO
+ 94c4 RV610 LE AGP [Radeon HD 2400 PRO AGP]
+ 94c8 Radeon HD 2400 XT
+ 94c9 Mobility Radeon HD 2400
+ 1002 94c9 Radeon HD2400
+ 94cb Radeon E2400
+ 94cc RV 610LE PCI [Radeon HD 2400]
+ 9501 Radeon HD 3870
+ 174b e620 Sapphire Radeon HD 3870 PCIe 2.0
+ 9504 Mobility Radeon HD 3850
+ 9505 RV670PRO [Radeon HD 3850]
+ 9507 RV670 [Radeon HD 3850]
+ 9508 M88 XT Mobility Radeon HD 3870]
+ 950f R680 [Radeon HD 3870 x2]
+ 9511 RV670 [FireGL 7700]
+ 9515 RV670 AGP [Radeon HD 3850]
+ 9519 RV670 [FireStream 9170]
+ 9540 RV710 [Radeon HD 4550]
+ 954f RV710 [Radeon HD 4350]
+ 1462 1618 R4350 MD512H (MS-V161)
+ 9552 M92 LP [Mobility Radeon HD 4300 Series]
+ 9553 M92 [Mobility Radeon HD 4500/5100 Series]
+ 1179 ff82 Satellite L505-13T GPU (Mobility Radeon HD 5145)
+ 9555 M93 [Mobility Radeon HD 4300/4500 Series]
+ 103c 1411 ProBook 4720s GPU (Mobility Radeon HD 4350)
+ 9559 Mobility Radeon HD 3600 Series
+ 955f M92 [Mobility Radeon HD 4330]
+ 9581 M76 [Radeon Mobility HD 2600 Series]
+ 9583 M76XT [Mobility Radeon HD 2600 XT]
+ 9586 RV 630 XT AGP [Radeon HD 2600 XT AGP]
+ 9587 RV630 PRO AGP [Radeon HD 2600 PRO AGP]
+ 9588 RV630 [Radeon HD 2600XT]
+ 1458 216c Radeon HD 2600 XT, 256MB GDDR3, 2x DVI, TV-out, PCIe (GV-RX26T256H)
+ 9589 RV630 [Radeon HD 2600 Series]
+ 958c RV630GL [FireGL v5600]
+ 958d RV630 [FireGL V3600]
+ 9591 Mobility Radeon HD 3650
+ 1002 9591 Mobility Radeon HD 3650
+ 9593 Radeon Mobility HD 3670
+ 9595 M86GL [Mobility FireGL V5700]
+ 9596 RV635 PRO AGP [Radeon HD 3650]
+ 1043 0028 EAH3650 SILENT/HTDI/512M/A
+ 9598 Mobility Radeon HD 3600 Series
+ 1002 9598 Mobility Radeon HD 3600
+ 1043 01d6 EAH3650 Silent
+ 95c0 Mobility Radeon HD 3470
+ 1002 95c0 Mobility Radeon HD 3470
+ 95c4 Mobility Radeon HD 3400 Series
+ 1002 95c4 Mobility Radeon HD 3400
+ 95c5 RV620 LE [Radeon HD 3450]
+ 95c6 RV620 LE AGP [Radeon HD 3450]
+ 95c7 RV620 CE [Radeon HD 3430]
+ 95c9 RV620 PCI [Radeon HD 3450]
+ 95cc RV620 [ATI FireGL V3700]
+ 95cd RV620 [FireMV 2450]
+ 95ce RV620 [FirePro 2260]
+ 95cf RV620 [FirePro 2260]
+ 960f RS780 Azalia controller
+ 9610 Radeon HD 3200 Graphics
+ 1458 d000 GA-MA78GM-S2H Motherboard
+ 9611 Radeon 3100 Graphics
+ 9612 RS780M/RS780MN [Radeon HD 3200 Graphics]
+ 9613 RS780MC [Radeon HD 3100 Graphics]
+ 9614 Radeon HD 3300 Graphics
+ 9615 RS780E [AMD 780E]
+ 9616 760G [Radeon 3000]
+ 970f RS880 Audio Device [Radeon HD 4200]
+ 1043 83a2 M4A785TD Motherboard
+ 1043 843e M5A88-V EVO
+ 9710 RS880 [Radeon HD 4200]
+ 1043 83a2 M4A785TD Motherboard
+ 9712 M880G [Mobility Radeon HD 4200]
+ 9713 M860G [Mobility Radeon 4100]
+ 9714 RS880 [Radeon HD 4290]
+ 9715 RS880 [Radeon HD 4250]
+ 1043 843e M5A88-V EVO
+ 9723 Radeon HD 5450
+ 9802 AMD Radeon HD 6310 GraphicsATI
+ aa00 R600 Audio Device [Radeon HD 2900 Series]
+ aa08 RV630/M76 audio device [Radeon HD 2600 Series]
+ aa10 RV610 audio device [Radeon HD 2400 PRO]
+ 174b aa10 Sapphire HD 2400 PRO audio device
+ 18bc aa10 GeCube Radeon HD 2400 PRO HDCP-capable digital-only audio device
+ aa18 Radeon HD 3870 Audio device
+ aa20 RV635 Audio device [Radeon HD 3600 Series]
+ aa28 RV620 Audio device [Radeon HD 34xx Series]
+ aa30 HD48x0 audio
+ 174b aa30 Sapphire HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink
+ aa38 RV710/730
+ 103c 3628 ATI RV710/730 [dv6-1190en]
+ 174b aa38 R700 Audio Device [Radeon HD 4000 Series]
+ aa50 Cypress HDMI Audio [Radeon HD 5800 Series]
+ aa58 Juniper HDMI Audio [Radeon HD 5700 Series]
+ aa60 Redwood HDMI Audio [Radeon HD 5600 Series]
+ 1025 0347 Aspire 7740G
+ aa68 Manhattan HDMI Audio [Mobility Radeon HD 5000 Series]
+ 1028 aa68 XPS 8300
+ aa88 Barts HDMI Audio [Radeon HD 6800 Series]
+ aa98 NI Caicos HDMI Audio [AMD RADEON HD 6450]
+ 174b aa98 Sapphire HD 6450 1GB DDR3
+ ac00 Theater 600 Pro
+ ac02 TV Wonder HD 600 PCIe
+ ac12 Theater HD T507 (DVB-T) TV tuner/capture device
+ cab0 AGP Bridge [IGP 320M]
+ cab2 RS200/RS200M AGP Bridge [IGP 340M]
+ cab3 R200 AGP Bridge [Mobility Radeon 7000 IGP]
+ cbb2 RS200/RS200M AGP Bridge [IGP 340M]
+1003 ULSI Systems
+ 0201 US201
+1004 VLSI Technology Inc
+ 0005 82C592-FC1
+ 0006 82C593-FC1
+ 0007 82C594-AFC2
+ 0008 82C596/7 [Wildcat]
+ 0009 82C597-AFC2
+ 000c 82C541 [Lynx]
+ 000d 82C543 [Lynx]
+ 0101 82C532
+ 0102 82C534 [Eagle]
+ 0103 82C538
+ 0104 82C535
+ 0105 82C147
+ 0200 82C975
+ 0280 82C925
+ 0304 QSound ThunderBird PCI Audio
+ 1004 0304 QSound ThunderBird PCI Audio
+ 122d 1206 DSP368 Audio
+ 1483 5020 XWave Thunder 3D Audio
+ 0305 QSound ThunderBird PCI Audio Gameport
+ 1004 0305 QSound ThunderBird PCI Audio Gameport
+ 122d 1207 DSP368 Audio Gameport
+ 1483 5021 XWave Thunder 3D Audio Gameport
+ 0306 QSound ThunderBird PCI Audio Support Registers
+ 1004 0306 QSound ThunderBird PCI Audio Support Registers
+ 122d 1208 DSP368 Audio Support Registers
+ 1483 5022 XWave Thunder 3D Audio Support Registers
+ 0307 Thunderbird
+ 0308 Thunderbird
+ 0702 VAS96011 [Golden Gate II]
+ 0703 Tollgate
+1005 Avance Logic Inc. [ALI]
+ 2064 ALG2032/2064
+ 2128 ALG2364A
+ 2301 ALG2301
+ 2302 ALG2302
+ 2364 ALG2364
+ 2464 ALG2364A
+ 2501 ALG2564A/25128A
+1006 Reply Group
+1007 NetFrame Systems Inc
+1008 Epson
+100a Phoenix Technologies
+100b National Semiconductor Corporation
+ 0001 DP83810
+ 0002 87415/87560 IDE
+ 000e 87560 Legacy I/O
+ 000f FireWire Controller
+ 0011 NS87560 National PCI System I/O
+ 0012 USB Controller
+ 0020 DP83815 (MacPhyter) Ethernet Controller
+ 103c 0024 Pavilion ze4400 builtin Network
+ 12d9 000c Aculab E1/T1 PMXc cPCI carrier card
+ 1385 f311 FA311 / FA312 (FA311 with WoL HW)
+ 0021 PC87200 PCI to ISA Bridge
+ 0022 DP83820 10/100/1000 Ethernet Controller
+ 1186 4900 DGE-500T
+ 1385 621a GA621
+ 1385 622a GA622T
+ 0028 Geode GX2 Host Bridge
+ 002a CS5535 South Bridge
+ 002b CS5535 ISA bridge
+ 002d CS5535 IDE
+ 002e CS5535 Audio
+ 002f CS5535 USB
+ 0030 Geode GX2 Graphics Processor
+ 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller
+ 0500 SCx200 Bridge
+ 0501 SCx200 SMI
+ 0502 SCx200, SC1100 IDE controller
+ 100b 0502 IDE Controller
+ 0503 SCx200, SC1100 Audio Controller
+ 100b 0503 XpressAudio controller
+ 0504 SCx200 Video
+ 0505 SCx200 XBus
+ 0510 SC1100 Bridge
+ 100b 0500 GPIO and LPC support bridge
+ 0511 SC1100 SMI & ACPI
+ 100b 0501 SC1100 SMI & ACPI bridge
+ 0515 SC1100 XBus
+ 100b 0505 SC1100 PCI to XBus bridge
+ d001 87410 IDE
+100c Tseng Labs Inc
+ 3202 ET4000/W32p rev A
+ 3205 ET4000/W32p rev B
+ 3206 ET4000/W32p rev C
+ 3207 ET4000/W32p rev D
+ 3208 ET6000
+ 4702 ET6300
+100d AST Research Inc
+100e Weitek
+ 9000 P9000 Viper
+ 9001 P9000 Viper
+ 9002 P9000 Viper
+ 9100 P9100 Viper Pro/SE
+1010 Video Logic, Ltd.
+1011 Digital Equipment Corporation
+ 0001 DECchip 21050
+ 0002 DECchip 21040 [Tulip]
+ 0004 DECchip 21030 [TGA]
+ 0007 NVRAM [Zephyr NVRAM]
+ 0008 KZPSA [KZPSA]
+ 0009 DECchip 21140 [FasterNet]
+ 1025 0310 21140 Fast Ethernet
+ 10b8 2001 SMC9332BDT EtherPower 10/100
+ 10b8 2002 SMC9332BVT EtherPower T4 10/100
+ 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port)
+ 1109 2400 ANA-6944A/TX Fast Ethernet
+ 1112 2300 RNS2300 Fast Ethernet
+ 1112 2320 RNS2320 Fast Ethernet
+ 1112 2340 RNS2340 Fast Ethernet
+ 1113 1207 EN-1207-TX Fast Ethernet
+ 1186 1100 DFE-500TX Fast Ethernet
+ 1186 1112 DFE-570TX Fast Ethernet
+ 1186 1140 DFE-660 Cardbus Ethernet 10/100
+ 1186 1142 DFE-660 Cardbus Ethernet 10/100
+ 11f6 0503 Freedomline Fast Ethernet
+ 1282 9100 AEF-380TXD Fast Ethernet
+ 1385 1100 FA310TX Fast Ethernet
+ 2646 0001 KNE100TX Fast Ethernet
+ 000a 21230 Video Codec
+ 000d PBXGB [TGA2]
+ 000f PCI-to-PDQ Interface Chip [PFI]
+ 1011 def1 FDDI controller (DEFPA)
+ 103c def1 FDDI controller (3X-DEFPA)
+ 0014 DECchip 21041 [Tulip Pass 3]
+ 1186 0100 DE-530+
+ 0016 DGLPB [OPPO]
+ 0017 PV-PCI Graphics Controller (ZLXp-L)
+ 0018 Memory Channel interface
+ 0019 DECchip 21142/43
+ 1011 500a DE500A Fast Ethernet
+ 1011 500b DE500B Fast Ethernet
+ 1014 0001 10/100 EtherJet Cardbus
+ 1025 0315 ALN315 Fast Ethernet
+ 1033 800c PC-9821-CS01 100BASE-TX Interface Card
+ 1033 800d PC-9821NR-B06 100BASE-TX Interface Card
+ 103c 125a 10/100Base-TX (PCI) [A5506B]
+ 108d 0016 Rapidfire 2327 10/100 Ethernet
+ 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus
+ 10b8 2005 SMC8032DT Extreme Ethernet 10/100
+ 10b8 8034 SMC8034 Extreme Ethernet 10/100
+ 10ef 8169 Cardbus Fast Ethernet
+ 1109 2a00 ANA-6911A/TX Fast Ethernet
+ 1109 2b00 ANA-6911A/TXC Fast Ethernet
+ 1109 3000 ANA-6922/TX Fast Ethernet
+ 1113 1207 Cheetah Fast Ethernet
+ 1113 2220 Cardbus Fast Ethernet
+ 115d 0002 Cardbus Ethernet 10/100
+ 1179 0203 Fast Ethernet
+ 1179 0204 Cardbus Fast Ethernet
+ 1186 1100 DFE-500TX Fast Ethernet
+ 1186 1101 DFE-500TX Fast Ethernet
+ 1186 1102 DFE-500TX Fast Ethernet
+ 1186 1112 DFE-570TX Quad Fast Ethernet
+ 1259 2800 AT-2800Tx Fast Ethernet
+ 1266 0004 Eagle Fast EtherMAX
+ 12af 0019 NetFlyer Cardbus Fast Ethernet
+ 1374 0001 Cardbus Ethernet Card 10/100
+ 1374 0002 Cardbus Ethernet Card 10/100
+ 1374 0007 Cardbus Ethernet Card 10/100
+ 1374 0008 Cardbus Ethernet Card 10/100
+ 1385 2100 FA510
+ 1395 0001 10/100 Ethernet CardBus PC Card
+ 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200)
+ 1498 000a TPMC880-10 10/100Base-T and 10Base2 PMC Ethernet Adapter
+ 1498 000b TPMC880-11 Single 10/100Base-T PMC Ethernet Adapter
+ 1498 000c TPMC880-12 Single 10Base2 PMC Ethernet Adapter
+ 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card
+ 1668 2000 FastNet Pro (PE2000)
+ 2646 0001 KNE100TX
+ 2646 0002 KNE-CB4TX
+ 8086 0001 EtherExpress PRO/100 Mobile CardBus 32
+ 001a Farallon PN9000SX Gigabit Ethernet
+ 0021 DECchip 21052
+ 0022 DECchip 21150
+ 0023 DECchip 21150
+ 0024 DECchip 21152
+ 0025 DECchip 21153
+ 0026 DECchip 21154
+ 0034 56k Modem Cardbus
+ 1374 0003 56k Modem Cardbus
+ 0045 DECchip 21553
+ 0046 DECchip 21554
+ 0e11 4050 Smart Array 4200 Controller
+ 0e11 4051 Smart Array 4250ES Controller
+ 0e11 4058 Smart Array 431 Controller
+ 103c 10c2 NetRAID-4M
+ 12d9 000a IP Telephony card
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 9005 0364 5400S (Mustang)
+ 9005 0365 5400S (Mustang)
+ 9005 1364 Dell PowerEdge RAID Controller 2
+ 9005 1365 Dell PowerEdge RAID Controller 2
+ e4bf 1000 CC8-1-BLUES
+ 1065 StrongARM DC21285
+ 1069 0020 DAC960P / DAC1164P
+1012 Micronics Computers Inc
+1013 Cirrus Logic
+ 0038 GD 7548
+ 0040 GD 7555 Flat Panel GUI Accelerator
+ 004c GD 7556 Video/Graphics LCD/CRT Ctrlr
+ 00a0 GD 5430/40 [Alpine]
+ 00a2 GD 5432 [Alpine]
+ 00a4 GD 5434-4 [Alpine]
+ 00a8 GD 5434-8 [Alpine]
+ 00ac GD 5436 [Alpine]
+ 00b0 GD 5440
+ 00b8 GD 5446
+ 00bc GD 5480
+ 1013 00bc CL-GD5480
+ 00d0 GD 5462
+ 00d2 GD 5462 [Laguna I]
+ 00d4 GD 5464 [Laguna]
+ 00d5 GD 5464 BD [Laguna]
+ 00d6 GD 5465 [Laguna]
+ 13ce 8031 Barco Metheus 2 Megapixel, Dual Head
+ 13cf 8031 Barco Metheus 2 Megapixel, Dual Head
+ 00e8 GD 5436U
+ 1100 CL 6729
+ 1110 PD 6832 PCMCIA/CardBus Ctrlr
+ 1112 PD 6834 PCMCIA/CardBus Ctrlr
+ 1113 PD 6833 PCMCIA/CardBus Ctrlr
+ 1200 GD 7542 [Nordic]
+ 1202 GD 7543 [Viking]
+ 1204 GD 7541 [Nordic Light]
+ 4000 MD 5620 [CLM Data Fax Voice]
+ 4400 CD 4400
+ 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]
+ 1014 1010 CS4610 SoundFusion Audio Accelerator
+ 6003 CS 4614/22/24/30 [CrystalClear SoundFusion Audio Accelerator]
+ 1013 4280 Crystal SoundFusion PCI Audio Accelerator
+ 1014 0153 ThinkPad 600X/A20m
+ 153b 112e DMX XFire 1024
+ 153b 1136 SiXPack 5.1+
+ 1681 0050 Game Theater XP
+ 1681 a010 Gamesurround Fortissimo II
+ 1681 a011 Gamesurround Fortissimo III 7.1
+ 5053 3357 Santa Cruz
+ 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
+ 6005 Crystal CS4281 PCI Audio
+ 1013 4281 Crystal CS4281 PCI Audio
+ 10cf 10a8 Crystal CS4281 PCI Audio
+ 10cf 10a9 Crystal CS4281 PCI Audio
+ 10cf 10aa Crystal CS4281 PCI Audio
+ 10cf 10ab Crystal CS4281 PCI Audio
+ 10cf 10ac Crystal CS4281 PCI Audio
+ 10cf 10ad Crystal CS4281 PCI Audio
+ 10cf 10b4 Crystal CS4281 PCI Audio
+ 1179 0001 Crystal CS4281 PCI Audio
+ 14c0 000c Crystal CS4281 PCI Audio
+1014 IBM
+ 0002 PCI to MCA Bridge
+ 0005 Processor to I/O Controller [Alta Lite]
+ 0007 Processor to I/O Controller [Alta MP]
+ 000a PCI to ISA Bridge (IBM27-82376) [Fire Coral]
+ 0017 CPU to PCI Bridge
+ 0018 TR Auto LANstreamer
+ 001b GXT-150P
+ 001c Carrera
+ 001d SCSI-2 FAST PCI Adapter (82G2675)
+ 0020 GXT1000 Graphics Adapter
+ 0022 PCI to PCI Bridge (IBM27-82351)
+ 002d Processor to I/O Controller [Python]
+ 002e SCSI RAID Adapter [ServeRAID]
+ 1014 002e ServeRAID-3x
+ 1014 022e ServeRAID-4H
+ 0031 2 Port Serial Adapter
+# AS400 iSeries PCI sync serial card
+ 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter
+ 0036 PCI to 32-bit LocalBus Bridge [Miami]
+ 0037 PowerPC to PCI Bridge (IBM27-82660)
+ 003a CPU to PCI Bridge
+ 003c GXT250P/GXT255P Graphics Adapter
+ 003e 16/4 Token ring UTP/STP controller
+ 1014 003e Token-Ring Adapter
+ 1014 00cd Token-Ring Adapter + Wake-On-LAN
+ 1014 00ce 16/4 Token-Ring Adapter 2
+ 1014 00cf 16/4 Token-Ring Adapter Special
+ 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter
+ 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN
+ 1014 016d iSeries 2744 Card
+ 0045 SSA Adapter
+ 0046 MPIC interrupt controller
+ 0047 PCI to PCI Bridge
+ 0048 PCI to PCI Bridge
+ 0049 Warhead SCSI Controller
+ 004e ATM Controller (14104e00)
+ 004f ATM Controller (14104f00)
+ 0050 ATM Controller (14105000)
+ 0053 25 MBit ATM Controller
+ 0054 GXT500P/GXT550P Graphics Adapter
+ 0057 MPEG PCI Bridge
+ 0058 SSA Adapter [Advanced SerialRAID/X]
+ 005c i82557B 10/100
+ 005e GXT800P Graphics Adapter
+ 007c ATM Controller (14107c00)
+ 007d 3780IDSP [MWave]
+ 008b EADS PCI to PCI Bridge
+ 008e GXT3000P Graphics Adapter
+ 0090 GXT 3000P
+ 1014 008e GXT-3000P
+ 0091 SSA Adapter
+ 0095 20H2999 PCI Docking Bridge
+ 0096 Chukar chipset SCSI controller
+ 1014 0097 iSeries 2778 DASD IOA
+ 1014 0098 iSeries 2763 DASD IOA
+ 1014 0099 iSeries 2748 DASD IOA
+ 009f PCI 4758 Cryptographic Accelerator
+ 00a5 ATM Controller (1410a500)
+ 00a6 ATM 155MBPS MM Controller (1410a600)
+ 00b7 256-bit Graphics Rasterizer [FireGL1]
+ 1092 00b8 FireGL1 AGP 32Mb
+ 00b8 GXT2000P Graphics Adapter
+ 00be ATM 622MBPS Controller (1410be00)
+ 00dc Advanced Systems Management Adapter (ASMA)
+ 00fc CPC710 Dual Bridge and Memory Controller (PCI-64)
+ 0104 Gigabit Ethernet-SX Adapter
+ 0105 CPC710 Dual Bridge and Memory Controller (PCI-32)
+ 010f Remote Supervisor Adapter (RSA)
+ 0142 Yotta Video Compositor Input
+ 1014 0143 Yotta Input Controller (ytin)
+ 0144 Yotta Video Compositor Output
+ 1014 0145 Yotta Output Controller (ytout)
+ 0156 405GP PLB to PCI Bridge
+ 015e 622Mbps ATM PCI Adapter
+ 0160 64bit/66MHz PCI ATM 155 MMF
+ 016e GXT4000P Graphics Adapter
+ 0170 GXT6000P Graphics Adapter
+ 017d GXT300P Graphics Adapter
+ 0180 Snipe chipset SCSI controller
+ 1014 0241 iSeries 2757 DASD IOA
+ 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780)
+ 0188 EADS-X PCI-X to PCI-X Bridge
+ 01a7 PCI-X to PCI-X Bridge
+ 01bd ServeRAID Controller
+ 1014 01bd ServeRAID 4Lx
+ 1014 01be ServeRAID-4M
+ 1014 01bf ServeRAID-4L
+ 1014 0208 ServeRAID-4Mx
+ 1014 020e ServeRAID-4Lx
+ 1014 022e ServeRAID-4H
+ 1014 0258 ServeRAID-5i
+ 1014 0259 ServeRAID-5i
+ 01c1 64bit/66MHz PCI ATM 155 UTP
+ 01e6 Cryptographic Accelerator
+ 01ef PowerPC 440GP PCI Bridge
+ 1734 102b PCEAS PCI-X Dual Port ESCON Adapter
+ 1734 10f8 PCEAT PCI-Express Dual Port ESCON Adapter
+ 01ff 10/100 Mbps Ethernet
+ 0219 Multiport Serial Adapter
+ 1014 021a Dual RVX
+ 1014 0251 Internal Modem/RVX
+ 1014 0252 Quad Internal Modem
+ 021b GXT6500P Graphics Adapter
+ 021c GXT4500P Graphics Adapter
+ 0233 GXT135P Graphics Adapter
+ 0266 PCI-X Dual Channel SCSI
+ 0268 Gigabit Ethernet-SX Adapter (PCI-X)
+ 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)
+ 028c Citrine chipset SCSI controller
+ 1014 028d Dual Channel PCI-X DDR SAS RAID Adapter (572E)
+ 1014 02be Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B)
+ 1014 02c0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A)
+ 1014 030d PCI-X DDR Auxiliary Cache Adapter (575B)
+ 02a1 Calgary PCI-X Host Bridge
+ 02bd Obsidian chipset SCSI controller
+ 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)
+ 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/571D)
+ 1014 0338 PCI-X DDR Auxiliary Cache Adapter (575C)
+ 0302 Winnipeg PCI-X Host Bridge
+ 0308 CalIOC2 PCI-E Root Port
+ 0314 ZISC 036 Neural accelerator card
+ 032d Axon - Cell Companion Chip
+ 1014 03a1 PCIe PowerXCell 8i Cell Accelerator Board
+ 0339 Obsidian-E PCI-E SCSI controller
+ 1014 030a PCIe 3Gb SAS RAID Adapter (574E)
+ 1014 033a PCIe 3Gb SAS Adapter (57B3)
+ 1014 0360 PCI-E Auxiliary Cache Adapter (57B7)
+ 033d PCI-E IPR SAS Adapter (FPGA)
+ 1014 033c PCIe2 1.8GB Cache 6Gb SAS RAID Adapter Tri-port (57B5)
+ 1014 0356 PCIe2 1.8GB Cache 6Gb SAS RAID & SSD Adapter (574D)
+ 1014 035f PCIe2 6Gb SAS Adapter Quad-port (57B2)
+ 034a PCI-E IPR SAS Adapter (ASIC)
+ 1014 033b PCIe2 6Gb SAS RAID Adapter Quad-port (57B4)
+ 1014 0355 PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57B1)
+ 1014 0357 PCIe2 6Gb SAS Adapter Quad-port (57C6)
+ 1014 035d PCIe2 3.6GB Cache 6Gb SAS RAID & SSD Adapter (575D)
+ 1014 035e PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57CE)
+ 3022 QLA3022 Network Adapter
+ 4022 QLA3022 Network Adapter
+ ffff MPIC-2 interrupt controller
+1015 LSI Logic Corp of Canada
+1016 ICL Personal Systems
+1017 SPEA Software AG
+ 5343 SPEA 3D Accelerator
+1018 Unisys Systems
+1019 Elitegroup Computer Systems
+101a AT&T GIS (NCR)
+ 0005 100VG ethernet
+ 0007 BYNET BIC4G/2C/2G
+ 101a 0019 BYNET BIC2C
+ 101a 001c BYNET BIC2G
+ 101a 001f BYNET BIC4G
+ 0009 PQS Memory Controller
+ 000a BYNET BPCI Adapter
+ 000b BYNET 4 Port BYA Switch (BYA4P)
+ 000c BYNET 4 Port BYA Switch (BYA4G)
+ 0010 NCR AMC Memory Controller
+ 1dc1 BYNET BIC2M/BIC4M/BYA4M
+ 101a 0019 BIC2M
+ 101a 001f BIC4M
+ 101a 0ece BYA4M
+ 1fa8 BYNET Multi-port BIC Adapter (XBIC Based)
+ 101a 00c3 BYNET BIC2SE
+101b Vitesse Semiconductor
+# Maxim VSC452 Super BMC Controller with Video
+ 0452 VSC452 [SuperBMC]
+101c Western Digital
+ 0193 33C193A
+ 0196 33C196A
+ 0197 33C197A
+ 0296 33C296A
+ 3193 7193
+ 3197 7197
+ 3296 33C296A
+ 4296 34C296
+ 9710 Pipeline 9710
+ 9712 Pipeline 9712
+ c24a 90C
+# ID for Newly Acquired Storage Products from Vitesse
+101d Maxim Integrated Products
+101e American Megatrends Inc.
+ 0009 MegaRAID 428 Ultra RAID Controller (rev 03)
+ 1960 MegaRAID
+ 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller
+ 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller
+ 101e 0477 MegaRAID 477 Elite 3100 RAID Controller
+ 101e 0493 MegaRAID 493 Elite 1600 RAID Controller
+ 101e 0494 MegaRAID 494 Elite 1650 RAID Controller
+ 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller
+ 101e 0511 MegaRAID 511 i4 IDE RAID Controller
+ 101e 0522 MegaRAID 522 i4133 RAID Controller
+ 1028 0471 PowerEdge RAID Controller 3/QC
+ 1028 0475 PowerEdge RAID Controller 3/SC
+ 1028 0493 PowerEdge RAID Controller 3/DC
+ 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch
+ 103c 60e7 NetRAID-1M
+ 9010 MegaRAID 428 Ultra RAID Controller
+ 9030 EIDE Controller
+ 9031 EIDE Controller
+ 9032 EIDE & SCSI Controller
+ 9033 SCSI Controller
+ 9040 Multimedia card
+ 9060 MegaRAID 434 Ultra GT RAID Controller
+ 9063 MegaRAC
+ 101e 0767 Dell Remote Assistant Card 2
+101f PictureTel
+1020 Hitachi Computer Products
+1021 OKI Electric Industry Co. Ltd.
+1022 Advanced Micro Devices [AMD]
+ 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration
+ 1101 K8 [Athlon64/Opteron] Address Map
+ 1102 K8 [Athlon64/Opteron] DRAM Controller
+ 1103 K8 [Athlon64/Opteron] Miscellaneous Control
+ 1200 Family 10h Processor HyperTransport Configuration
+ 1201 Family 10h Processor Address Map
+ 1202 Family 10h Processor DRAM Controller
+ 1203 Family 10h Processor Miscellaneous Control
+ 1204 Family 10h Processor Link Control
+ 1300 Family 11h Processor HyperTransport Configuration
+ 1301 Family 11h Processor Address Map
+ 1302 Family 11h Processor DRAM Controller
+ 1303 Family 11h Processor Miscellaneous Control
+ 1304 Family 11h Processor Link Control
+ 1510 Family 14h Processor Root Complex
+ 1022 1510 Pavilion DM1Z-3000 Host bridge
+ 1512 Family 14h Processor Root Port
+ 1513 Family 14h Processor Root Port
+ 1514 Family 14h Processor Root Port
+ 1515 Family 14h Processor Root Port
+ 1516 Family 14h Processor Root Port
+ 1600 Family 15h Processor Function 0
+ 1601 Family 15h Processor Function 1
+ 1602 Family 15h Processor Function 2
+ 1603 Family 15h Processor Function 3
+ 1604 Family 15h Processor Function 4
+ 1605 Family 15h Processor Function 5
+ 1700 Family 12h/14h Processor Function 0
+ 1701 Family 12h/14h Processor Function 1
+ 1702 Family 12h/14h Processor Function 2
+ 1703 Family 12h/14h Processor Function 3
+ 1704 Family 12h/14h Processor Function 4
+ 1705 Family 12h Processor Root Complex
+ 1707 Family 12h Processor Root Port
+ 1708 Family 12h Processor Root Port
+ 1709 Family 12h Processor Root Port
+ 170a Family 12h Processor Root Port
+ 170b Family 12h Processor Root Port
+ 170c Family 12h Processor Root Port
+ 170d Family 12h Processor Root Port
+ 1716 Family 12h/14h Processor Function 5
+ 1718 Family 12h/14h Processor Function 6
+ 1719 Family 12h/14h Processor Function 7
+ 2000 79c970 [PCnet32 LANCE]
+ 1014 2000 NetFinity 10/100 Fast Ethernet
+ 1022 2000 PCnet - Fast 79C971
+ 103c 104c Ethernet with LAN remote power Adapter
+ 103c 1064 Ethernet with LAN remote power Adapter
+ 103c 1065 Ethernet with LAN remote power Adapter
+ 103c 106c Ethernet with LAN remote power Adapter
+ 103c 106e Ethernet with LAN remote power Adapter
+ 103c 10ea Ethernet with LAN remote power Adapter
+ 1113 1220 EN1220 10/100 Fast Ethernet
+ 1259 2450 AT-2450 10/100 Fast Ethernet
+ 1259 2454 AT-2450v4 10Mb Ethernet Adapter
+ 1259 2700 AT-2700TX 10/100 Fast Ethernet
+ 1259 2701 AT-2700FX 100Mb Ethernet
+ 1259 2702 AT-2700FTX 10/100 Mb Fiber/Copper Fast Ethernet
+ 1259 2703 AT-2701FX
+ 1259 2704 AT-2701FTX 10/100 Mb Fiber/Copper Fast Ethernet
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1010 CP5/CR6 mainboard
+ 4c53 1020 VR6 mainboard
+ 4c53 1030 PC5 mainboard
+ 4c53 1040 CL7 mainboard
+ 4c53 1060 PC7 mainboard
+ 2001 79c978 [HomePNA]
+ 1092 0a78 Multimedia Home Network Adapter
+ 1668 0299 ActionLink Home Network Adapter
+ 2003 Am 1771 MBW [Alchemy]
+ 2020 53c974 [PCscsi]
+ 2040 79c974
+ 2080 CS5536 [Geode companion] Host Bridge
+ 2081 Geode LX Video
+ 2082 Geode LX AES Security Block
+ 208f CS5536 GeodeLink PCI South Bridge
+ 2090 CS5536 [Geode companion] ISA
+ 2091 CS5536 [Geode companion] FLASH
+ 2093 CS5536 [Geode companion] Audio
+ 2094 CS5536 [Geode companion] OHC
+ 2095 CS5536 [Geode companion] EHC
+ 2096 CS5536 [Geode companion] UDC
+ 2097 CS5536 [Geode companion] UOC
+ 209a CS5536 [Geode companion] IDE
+ 3000 ELanSC520 Microcontroller
+ 7006 AMD-751 [Irongate] System Controller
+ 7007 AMD-751 [Irongate] AGP Bridge
+ 700a AMD-IGR4 AGP Host to PCI Bridge
+ 700b AMD-IGR4 PCI to PCI Bridge
+ 700c AMD-760 MP [IGD4-2P] System Controller
+ 700d AMD-760 MP [IGD4-2P] AGP Bridge
+ 700e AMD-760 [IGD4-1P] System Controller
+ 700f AMD-760 [IGD4-1P] AGP Bridge
+ 7400 AMD-755 [Cobra] ISA
+ 7401 AMD-755 [Cobra] IDE
+ 7403 AMD-755 [Cobra] ACPI
+ 7404 AMD-755 [Cobra] USB
+ 7408 AMD-756 [Viper] ISA
+ 7409 AMD-756 [Viper] IDE
+ 740b AMD-756 [Viper] ACPI
+ 740c AMD-756 [Viper] USB
+ 7410 AMD-766 [ViperPlus] ISA
+ 7411 AMD-766 [ViperPlus] IDE
+ 7413 AMD-766 [ViperPlus] ACPI
+ 7414 AMD-766 [ViperPlus] USB
+ 7440 AMD-768 [Opus] ISA
+ 1043 8044 A7M-D Mainboard
+ 7441 AMD-768 [Opus] IDE
+ 7443 AMD-768 [Opus] ACPI
+ 1043 8044 A7M-D Mainboard
+ 7445 AMD-768 [Opus] Audio
+ 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible)
+ 7448 AMD-768 [Opus] PCI
+ 7449 AMD-768 [Opus] USB
+ 7450 AMD-8131 PCI-X Bridge
+ 7451 AMD-8131 PCI-X IOAPIC
+ 7454 AMD-8151 System Controller
+ 7455 AMD-8151 AGP Bridge
+ 7458 AMD-8132 PCI-X Bridge
+ 7459 AMD-8132 PCI-X IOAPIC
+ 7460 AMD-8111 PCI
+ 161f 3017 HDAMB
+ 7461 AMD-8111 USB
+ 7462 AMD-8111 Ethernet
+ 7463 AMD-8111 USB EHCI
+ 7464 AMD-8111 USB OHCI
+ 161f 3017 HDAMB
+ 7468 AMD-8111 LPC
+ 161f 3017 HDAMB
+ 7469 AMD-8111 IDE
+ 1022 2b80 AMD-8111 IDE [Quartet]
+ 161f 3017 HDAMB
+ 746a AMD-8111 SMBus 2.0
+ 746b AMD-8111 ACPI
+ 161f 3017 HDAMB
+ 746d AMD-8111 AC97 Audio
+ 161f 3017 HDAMB
+ 746e AMD-8111 MC97 Modem
+ 756b AMD-8111 ACPI
+ 7800 Hudson SATA Controller [IDE mode]
+ 7801 Hudson SATA Controller [AHCI mode]
+ 7802 Hudson SATA Controller [RAID mode]
+ 7803 Hudson SATA Controller [RAID mode]
+ 7804 Hudson SATA Controller [AHCI mode]
+ 7805 Hudson SATA Controller [RAID mode]
+ 7806 Hudson SD Flash Controller
+ 7807 Hudson USB OHCI Controller
+ 7808 Hudson USB EHCI Controller
+ 7809 Hudson USB OHCI Controller
+ 780b Hudson SMBus Controller
+ 780c Hudson IDE Controller
+ 780d Hudson Azalia Controller
+ 780e Hudson LPC Bridge
+ 780f Hudson PCI Bridge
+ 7812 Hudson USB XHCI Controller
+ 9600 RS780 Host Bridge
+ 1043 82f1 M3A78-EH Motherboard
+ 9601 RS880 Host Bridge
+ 1043 843e M5A88-V EVO
+ 9602 RS780/RS880 PCI to PCI bridge (int gfx)
+ 9603 RS780 PCI to PCI bridge (ext gfx port 0)
+ 9604 RS780 PCI to PCI bridge (PCIE port 0)
+ 9605 RS780 PCI to PCI bridge (PCIE port 1)
+ 9606 RS780 PCI to PCI bridge (PCIE port 2)
+ 9607 RS780 PCI to PCI bridge (PCIE port 3)
+ 9608 RS780/RS880 PCI to PCI bridge (PCIE port 4)
+ 9609 RS780/RS880 PCI to PCI bridge (PCIE port 5)
+ 960a RS780 PCI to PCI bridge (NB-SB link)
+ 960b RS780 PCI to PCI bridge (ext gfx port 1)
+1023 Trident Microsystems
+ 0194 82C194
+ 2000 4DWave DX
+ 2001 4DWave NX
+ 122d 1400 Trident PCI288-Q3DII (NX)
+ 2100 CyberBlade XP4m32
+ 2200 XGI Volari XP5
+ 8400 CyberBlade/i7
+ 1023 8400 CyberBlade i7 AGP
+ 8420 CyberBlade/i7d
+ 0e11 b15a CyberBlade i7 AGP
+ 8500 CyberBlade/i1
+ 8520 CyberBlade i1
+ 0e11 b16e CyberBlade i1 AGP
+ 1023 8520 CyberBlade i1 AGP
+ 8620 CyberBlade/i1
+ 1014 0502 ThinkPad R30/T30
+ 1014 1025 Travelmate 352TE
+ 8820 CyberBlade XPAi1
+ 9320 TGUI 9320
+ 9350 GUI Accelerator
+ 9360 Flat panel GUI Accelerator
+ 9382 Cyber 9382 [Reference design]
+ 9383 Cyber 9383 [Reference design]
+ 9385 Cyber 9385 [Reference design]
+ 9386 Cyber 9386
+ 9388 Cyber 9388
+ 9397 Cyber 9397
+ 939a Cyber 9397DVD
+ 9420 TGUI 9420
+ 9430 TGUI 9430
+ 9440 TGUI 9440
+ 9460 TGUI 9460
+ 9470 TGUI 9470
+ 9520 Cyber 9520
+ 9525 Cyber 9525
+ 9540 Cyber 9540
+ 9660 TGUI 9660/938x/968x
+ 9680 TGUI 9680
+ 9682 TGUI 9682
+ 9683 TGUI 9683
+ 9685 ProVIDIA 9685
+ 9750 3DImage 9750
+ 1014 9750 3DImage 9750
+ 1023 9750 3DImage 9750
+ 9753 TGUI 9753
+ 9754 TGUI 9754
+ 9759 TGUI 975
+ 9783 TGUI 9783
+ 9785 TGUI 9785
+ 9850 3DImage 9850
+ 9880 Blade 3D PCI/AGP
+ 1023 9880 Blade 3D
+ 9910 CyberBlade/XP
+ 9930 CyberBlade/XPm
+ 9960 CyberBlade XP2
+1024 Zenith Data Systems
+1025 Acer Incorporated [ALI]
+ 1435 M1435
+ 1445 M1445
+ 1449 M1449
+ 1451 M1451
+ 1461 M1461
+ 1489 M1489
+ 1511 M1511
+ 1512 ALI M1512 Aladdin
+ 1513 M1513
+ 1521 ALI M1521 Aladdin III CPU Bridge
+ 10b9 1521 ALI M1521 Aladdin III CPU Bridge
+ 1523 ALI M1523 ISA Bridge
+ 10b9 1523 ALI M1523 ISA Bridge
+ 1531 M1531 Northbridge [Aladdin IV/IV+]
+ 1533 M1533 PCI-to-ISA Bridge
+ 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge
+ 1535 M1535 PCI Bridge + Super I/O + FIR
+ 1541 M1541 Northbridge [Aladdin V]
+ 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge
+ 1542 M1542 Northbridge [Aladdin V]
+ 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR
+ 1561 M1561 Northbridge [Aladdin 7]
+ 1621 M1621 Northbridge [Aladdin-Pro II]
+ 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2]
+ 1641 M1641 Northbridge [Aladdin-Pro IV]
+ 1647 M1647 [MaGiK1] PCI North Bridge
+ 1671 M1671 Northbridge [ALADDiN-P4]
+ 1672 Northbridge [CyberALADDiN-P4]
+ 3141 M3141
+ 3143 M3143
+ 3145 M3145
+ 3147 M3147
+ 3149 M3149
+ 3151 M3151
+ 3307 M3307 MPEG-I Video Controller
+ 3309 M3309 MPEG-II Video w/ Software Audio Decoder
+ 3321 M3321 MPEG-II Audio/Video Decoder
+ 5212 M4803
+ 5215 ALI PCI EIDE Controller
+ 5217 M5217H
+ 5219 M5219
+ 5225 M5225
+ 5229 M5229
+ 5235 M5235
+ 5237 M5237 PCI USB Host Controller
+ 5240 EIDE Controller
+ 5241 PCMCIA Bridge
+ 5242 General Purpose Controller
+ 5243 PCI to PCI Bridge Controller
+ 5244 Floppy Disk Controller
+ 5247 M1541 PCI to PCI Bridge
+ 5251 M5251 P1394 Controller
+ 5427 PCI to AGP Bridge
+ 5451 M5451 PCI AC-Link Controller Audio Device
+ 5453 M5453 PCI AC-Link Controller Modem Device
+ 7101 M7101 PCI PMU Power Management Controller
+ 10b9 7101 M7101 PCI PMU Power Management Controller
+1028 Dell
+ 0001 PowerEdge Expandable RAID Controller 2/Si
+ 1028 0001 PowerEdge 2400
+ 0002 PowerEdge Expandable RAID Controller 3/Di
+ 1028 0002 PowerEdge 4400
+ 1028 00d1 PERC 3/DiV [Viper]
+ 1028 00d9 PERC 3/DiL [Lexus]
+ 0003 PowerEdge Expandable RAID Controller 3/Si
+ 1028 0003 PowerEdge 2450
+# PowerEdge Codename Iguana
+ 0004 PowerEdge Expandable RAID Controller 3/Di [Iguana]
+ 1028 0004 PERC 3/DiF [Iguana]
+ 0006 PowerEdge Expandable RAID Controller 3/Di
+ 0007 Remote Access Card III
+ 0008 Remote Access Card III
+ 0009 Remote Access Card III: BMC/SMIC device not present
+ 000a PowerEdge Expandable RAID Controller 3/Di
+ 1028 0106 PERC 3/DiJ [Jaguar]
+ 1028 011b PERC 3/DiD [Dagger]
+ 1028 0121 PERC 3/DiB [Boxster]
+ 000c Embedded Remote Access or ERA/O
+ 000d Embedded Remote Access: BMC/SMIC device
+ 000e PowerEdge Expandable RAID controller 4/Di
+ 000f PowerEdge Expandable RAID controller 4/Di
+ 1028 014a PowerEdge 1750
+ 0010 Remote Access Card 4
+ 0011 Remote Access Card 4 Daughter Card
+ 0012 Remote Access Card 4 Daughter Card Virtual UART
+ 0013 PowerEdge Expandable RAID controller 4
+ 1028 016c PowerEdge Expandable RAID Controller 4e/Si
+ 1028 016d PowerEdge Expandable RAID Controller 4e/Di
+ 1028 016e PowerEdge Expandable RAID Controller 4e/Di
+ 1028 016f PowerEdge Expandable RAID Controller 4e/Di
+ 1028 0170 PowerEdge Expandable RAID Controller 4e/Di
+ 0014 Remote Access Card 4 Daughter Card SMIC interface
+ 0015 PowerEdge Expandable RAID controller 5
+ 1028 1f01 PERC 5/E Adapter RAID Controller
+ 1028 1f02 PERC 5/i Adapter RAID Controller
+ 1028 1f03 PERC 5/i Integrated RAID Controller
+ 0016 PowerEdge Expandable RAID controller S300
+ 1028 1f24 PERC S300 Controller
+1029 Siemens Nixdorf IS
+102a LSI Logic
+ 0000 HYDRA
+ 0010 ASPEN
+ 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers
+ 9005 000f 2940U2W SCSI Controller
+ 9005 0106 2940U2W SCSI Controller
+ 9005 a180 2940U2W SCSI Controller
+ 00c5 AIC-7899 U160/m SCSI Controller
+ 1028 00c5 PowerEdge 2550/2650/4600
+ 00cf AIC-7899P U160/m
+ 1028 0106 PowerEdge 4600
+ 1028 0121 PowerEdge 2650
+102b Matrox Graphics, Inc.
+# DJ: I've a suspicion that 0010 is a duplicate of 0d10.
+ 0010 MGA-I [Impression?]
+ 0100 MGA 1064SG [Mystique]
+ 0518 MGA-II [Athena]
+ 0519 MGA 2064W [Millennium]
+ 051a MGA 1064SG [Mystique]
+ 102b 0100 MGA-1064SG Mystique
+ 102b 1100 MGA-1084SG Mystique
+ 102b 1200 MGA-1084SG Mystique
+ 1100 102b MGA-1084SG Mystique
+ 110a 0018 Scenic Pro C5 (D1025)
+ 051b MGA 2164W [Millennium II]
+ 102b 051b MGA-2164W Millennium II
+ 102b 1100 MGA-2164W Millennium II
+ 102b 1200 MGA-2164W Millennium II
+ 102b 2100 MGA-2164W Millennium II
+ 051e MGA 1064SG [Mystique] AGP
+ 051f MGA 2164W [Millennium II] AGP
+ 0520 MGA G200
+ 102b dbc2 G200 Multi-Monitor
+ 102b dbc8 G200 Multi-Monitor
+ 102b dbe2 G200 Multi-Monitor
+ 102b dbe8 G200 Multi-Monitor
+ 102b ff03 Millennium G200 SD
+ 102b ff04 Marvel G200
+ 0521 MGA G200 AGP
+ 1014 ff03 Millennium G200 AGP
+ 102b 48e9 Mystique G200 AGP
+ 102b 48f8 Millennium G200 SD AGP
+ 102b 4a60 Millennium G200 LE AGP
+ 102b 4a64 Millennium G200 AGP
+ 102b c93c Millennium G200 AGP
+ 102b c9b0 Millennium G200 AGP
+ 102b c9bc Millennium G200 AGP
+ 102b ca60 Millennium G250 LE AGP
+ 102b ca6c Millennium G250 AGP
+ 102b dbbc Millennium G200 AGP
+ 102b dbc2 Millennium G200 MMS (Dual G200)
+ 102b dbc3 G200 Multi-Monitor
+ 102b dbc8 Millennium G200 MMS (Dual G200)
+ 102b dbd2 G200 Multi-Monitor
+ 102b dbd3 G200 Multi-Monitor
+ 102b dbd4 G200 Multi-Monitor
+ 102b dbd5 G200 Multi-Monitor
+ 102b dbd8 G200 Multi-Monitor
+ 102b dbd9 G200 Multi-Monitor
+ 102b dbe2 Millennium G200 MMS (Quad G200)
+ 102b dbe3 G200 Multi-Monitor
+ 102b dbe8 Millennium G200 MMS (Quad G200)
+ 102b dbf2 G200 Multi-Monitor
+ 102b dbf3 G200 Multi-Monitor
+ 102b dbf4 G200 Multi-Monitor
+ 102b dbf5 G200 Multi-Monitor
+ 102b dbf8 G200 Multi-Monitor
+ 102b dbf9 G200 Multi-Monitor
+ 102b f806 Mystique G200 Video AGP
+ 102b ff00 MGA-G200 AGP
+ 102b ff02 Mystique G200 AGP
+ 102b ff03 Millennium G200 AGP
+ 102b ff04 Marvel G200 AGP
+ 110a 0032 MGA-G200 AGP
+ 0522 MGA G200e [Pilot] ServerEngines (SEP1)
+ 0525 MGA G400/G450
+ 0e11 b16f MGA-G400 AGP
+ 102b 0328 Millennium G400 16Mb SDRAM
+ 102b 0338 Millennium G400 16Mb SDRAM
+ 102b 0378 Millennium G400 32Mb SDRAM
+ 102b 0541 Millennium G450 Dual Head
+ 102b 0542 Millennium G450 Dual Head LX
+ 102b 0543 Millennium G450 Single Head LX
+ 102b 0641 Millennium G450 32Mb SDRAM Dual Head
+ 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX
+ 102b 0643 Millennium G450 32Mb SDRAM Single Head LX
+ 102b 07c0 Millennium G450 Dual Head LE
+ 102b 07c1 Millennium G450 SDR Dual Head LE
+ 102b 0d41 Millennium G450 Dual Head PCI
+ 102b 0d42 Millennium G450 Dual Head LX PCI
+ 102b 0d43 Millennium G450 32Mb Dual Head PCI
+ 102b 0e00 Marvel G450 eTV
+ 102b 0e01 Marvel G450 eTV
+ 102b 0e02 Marvel G450 eTV
+ 102b 0e03 Marvel G450 eTV
+ 102b 0f80 Millennium G450 Low Profile
+ 102b 0f81 Millennium G450 Low Profile
+ 102b 0f82 Millennium G450 Low Profile DVI
+ 102b 0f83 Millennium G450 Low Profile DVI
+ 102b 19d8 Millennium G400 16Mb SGRAM
+ 102b 19f8 Millennium G400 32Mb SGRAM
+ 102b 2159 Millennium G400 Dual Head 16Mb
+ 102b 2179 Millennium G400 MAX/Dual Head 32Mb
+ 102b 217d Millennium G400 Dual Head Max
+ 102b 23c0 Millennium G450
+ 102b 23c1 Millennium G450
+ 102b 23c2 Millennium G450 DVI
+ 102b 23c3 Millennium G450 DVI
+ 102b 2f58 Millennium G400
+ 102b 2f78 Millennium G400
+ 102b 3693 Marvel G400 AGP
+ 102b 5dd0 4Sight II
+ 102b 5f50 4Sight II
+ 102b 5f51 4Sight II
+ 102b 5f52 4Sight II
+ 102b 9010 Millennium G400 Dual Head
+ 1458 0400 GA-G400
+ 1705 0001 Millennium G450 32MB SGRAM
+ 1705 0002 Millennium G450 16MB SGRAM
+ 1705 0003 Millennium G450 32MB
+ 1705 0004 Millennium G450 16MB
+ 0527 Parhelia
+ 102b 0840 Parhelia 128Mb
+ 102b 0850 Parhelia 256MB
+ 102b 0870 MED2mp-DVI
+ 102b 0880 P-256 Edge Overlap Controller
+ 0528 Parhelia
+ 102b 1020 Parhelia 128MB
+ 102b 1030 Parhelia 256 MB Dual DVI
+ 102b 1040 MED2mp-DVI
+ 102b 1050 Sono S20
+ 102b 1060 PJ-30L
+ 102b 1070 PJ-40L
+ 102b 1421 MED5mp
+ 102b 1431 MED3mp-DVI
+ 102b 1451 MED5mp-DVI
+ 102b 1491 MED2mp-DVI
+ 102b 14b1 MED3mp-DVI
+ 102b 14c1 MED5mp-DVI
+ 102b 14e1 Parhelia PCI 256MB
+ 102b 14f1 Parhelia Precision SGT
+ 102b 1501 ATC-4MP
+ 102b 1511 ATC-4MP
+ 102b 1521 TheatreVUE T30
+ 102b 1531 TheatreVUE T20
+ 102b 1541 MED2mp-DVI
+ 102b 1551 MED3mp-DVI
+ 102b 1561 MED5mp-DVI
+ 102b 1571 Parhelia DL256 PCI
+ 102b 1591 Parhelia Precision SDT
+ 102b 15a1 MED4mp-DVI
+ 102b 2011 Parhelia HR256
+ 102b 2021 QID Pro
+ 102b 2061 PJ-40LP
+ 102b 2081 EWS Quad
+ 102b 2411 PPX-OUT8
+ 102b 2421 VPX-OUT8
+ 102b 2441 PPX-OUT4
+ 102b 2451 VPX-OUT4
+ 102b 2491 LPX-OUT4
+ 0530 MGA G200EV
+ 0532 MGA G200eW WPCM450
+ 1028 0235 PowerEdge R710 MGA G200eW WPCM450
+ 1028 0236 PowerEdge R610 MGA G200eW WPCM450
+ 1028 0237 PowerEdge T610 MGA G200eW WPCM450
+ 1028 0287 PowerEdge M610 MGA G200eW WPCM450
+ 1028 028c PowerEdge R410 MGA G200eW WPCM450
+ 1028 028d PowerEdge T410 MGA G200eW WPCM450
+ 1028 029c PowerEdge M710 MGA G200eW WPCM450
+ 1028 02a4 PowerEdge T310 MGA G200eW WPCM450
+ 0533 MGA G200EH
+ 103c 3381 iLO4
+ 0534 G200eR2
+ 0540 M91XX
+ 102b 2080 M9140 LP PCIe x16
+ 102b 20c0 Xenia
+ 102b 20c1 Xenia Pro
+ 102b 2100 M9120 PCIe x16
+ 102b 2140 M9125 PCIe x16
+ 102b 2180 M9120 Plus LP PCIe x16
+ 102b 21c0 M9120 Plus LP PCIe x1
+ 102b 2200 VDA1164 Output Board
+ 102b 2240 M9148 LP PCIe x16
+ 102b 2241 M9138 LP PCIe x16
+ 102b 2280 M9188 ATX PCIe x16
+ 102b 22c0 M9128 LP PCIe x16
+ 0d10 MGA Ultima/Impression
+ 1000 MGA G100 [Productiva]
+ 102b ff01 Productiva G100
+ 102b ff05 Productiva G100 Multi-Monitor
+ 1001 MGA G100 [Productiva] AGP
+ 102b 1001 MGA-G100 AGP
+ 102b ff00 MGA-G100 AGP
+ 102b ff01 MGA-G100 Productiva AGP
+ 102b ff03 Millennium G100 AGP
+ 102b ff04 MGA-G100 AGP
+ 102b ff05 MGA-G100 Productiva AGP Multi-Monitor
+ 110a 001e MGA-G100 AGP
+ 2007 MGA Mistral
+ 2527 MGA G550 AGP
+ 102b 0f83 Millennium G550
+ 102b 0f84 Millennium G550 Dual Head DDR 32Mb
+ 102b 1e41 Millennium G550
+# Clearly the device name should not say AGP anymore...
+ 102b 2300 Millennium G550 LP PCIE
+ 2537 Millenium P650/P750
+ 102b 1820 Millennium P750 64MB
+ 102b 1830 Millennium P650 64MB
+ 102b 1850 RAD2mp
+ 102b 1860 RAD3mp
+ 102b 1880 Sono S10
+ 102b 1c10 QID 128MB
+ 102b 2811 Millennium P650 Low-profile PCI 64MB
+ 102b 2821 Millenium P650 Low-profile PCI
+ 102b 2841 RAD PCI
+ 102b 2851 Spectrum PCI
+ 102b 2871 EpicA TC2
+ 102b 2c11 QID Low-profile PCI
+ 102b 2c21 QID LP PCI LW
+ 102b 2c31 QID LP PCI
+ 102b 2c41 EpicA TC4
+ 102b 3001 Extio F1400
+ 102b 3011 Extio F1220
+ 102b 3041 RG-200DL
+ 102b 3051 RG-400SL
+ 102b 3061 Extio F1420
+ 102b 3081 Extio F1240
+ 2538 Millenium P650 PCIe
+ 102b 0847 RAD PCIe
+ 102b 08c7 Millennium P650 PCIe 128MB
+ 102b 0907 Millennium P650 PCIe 64MB
+ 102b 0947 Parhelia APVe
+ 102b 0987 ATC PCIe 4MP
+ 102b 1047 Millennium P650 LP PCIe 128MB
+ 102b 1087 Millennium P650 LP PCIe 64MB
+ 102b 1801 Millenium P650 PCIe x1
+ 102b 2538 Parhelia APVe
+ 102b 3007 QID Low-profile PCIe
+ 102b 3087 Aurora VX3mp
+ 102b 30c7 QID LP PCIe
+ 2539 Millennium P690
+ 102b 0040 Millenium P690 PCIe x16
+ 102b 0042 ONYX
+ 102b 0043 SPECTRA
+ 102b 0080 Millenium P690 Plus LP PCIe x16
+ 102b 0081 Millenium P690 LP PCIe x16
+ 102b 0082 RAD LPX PCIe x16
+ 102b 00c0 Millenium P690 Plus LP PCI
+ 102b 00c2 Millenium P690 LP PCI
+ 102b 00c3 RAD LPX PCI
+ 102b 0101 Millenium P690 PCI
+ 102b 0140 Millenium P690 LP PCIe x1
+ 102b 0180 Display Wall IP Decode 128 MB
+ 4536 VIA Framegrabber
+ 4cdc Morphis Vision System Jpeg2000
+ 4fc5 Morphis Vision System
+ 5e10 Morphis Vision System Aux/IO
+ 6573 Shark 10/100 Multiport SwitchNIC
+102c Chips and Technologies
+ 00b8 F64310
+ 00c0 F69000 HiQVideo
+ 102c 00c0 F69000 HiQVideo
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1010 CP5/CR6 mainboard
+ 4c53 1020 VR6 mainboard
+ 4c53 1030 PC5 mainboard
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 00d0 F65545
+ 00d8 F65545
+ 00dc F65548
+ 00e0 F65550
+ 00e4 F65554
+ 00e5 F65555 HiQVPro
+ 0e11 b049 Armada 1700 Laptop Display Controller
+ 1179 0001 Satellite Pro/Satellite
+ 00f0 F68554
+ 00f4 F68554 HiQVision
+ 00f5 F68555
+ 0c30 F69030
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 4c53 1080 CT8 mainboard
+102d Wyse Technology Inc.
+ 50dc 3328 Audio
+102e Olivetti Advanced Technology
+102f Toshiba America
+ 0009 r4x00
+ 000a TX3927 MIPS RISC PCI Controller
+ 0020 ATM Meteor 155
+ 102f 00f8 ATM Meteor 155
+ 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller
+ 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
+ 0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939
+ 0105 TC86C001 [goku-s] IDE
+ 0106 TC86C001 [goku-s] USB 1.1 Host
+ 0107 TC86C001 [goku-s] USB Device Controller
+ 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller
+ 0180 TX4927/38 MIPS RISC PCI Controller
+ 0181 TX4925 MIPS RISC PCI Controller
+ 0182 TX4937 MIPS RISC PCI Controller
+ 01b4 Celleb platform IDE interface
+ 01b5 SCC USB 2.0 EHCI controller
+ 01b6 SCC USB 1.1 OHCI controller
+1030 TMC Research
+1031 Miro Computer Products AG
+ 5601 DC20 ASIC
+ 5607 Video I/O & motion JPEG compressor
+ 5631 Media 3D
+ 6057 MiroVideo DC10/DC30+
+1032 Compaq
+1033 NEC Corporation
+ 0000 Vr4181A USB Host or Function Control Unit
+ 0001 PCI to 486-like bus Bridge
+ 0002 PCI to VL98 Bridge
+ 0003 ATM Controller
+ 0004 R4000 PCI Bridge
+ 0005 PCI to 486-like bus Bridge
+ 0006 PC-9800 Graphic Accelerator
+ 0007 PCI to UX-Bus Bridge
+ 0008 PC-9800 Graphic Accelerator
+ 0009 PCI to PC9800 Core-Graph Bridge
+ 0016 PCI to VL Bridge
+ 001a [Nile II]
+ 0021 Vrc4373 [Nile I]
+ 0029 PowerVR PCX1
+ 002a PowerVR 3D
+ 002c Star Alpha 2
+ 002d PCI to C-bus Bridge
+ 0035 USB
+ 1033 0035 Hama USB 2.0 CardBus
+ 103c 1293 USB add-in card
+ 103c 1294 USB 2.0 add-in card
+ 1179 0001 USB
+ 12ee 7000 Root Hub
+ 14c2 0105 PTI-205N USB 2.0 Host Controller
+ 1799 0001 Root Hub
+ 1931 000a GlobeTrotter Fusion Quad Lite (PPP data)
+ 1931 000b GlobeTrotter Fusion Quad Lite (GSM data)
+ 807d 0035 PCI-USB2 (OHCI subsystem)
+ 003b PCI to C-bus Bridge
+ 003e NAPCCARD Cardbus Controller
+ 0046 PowerVR PCX2 [midas]
+ 005a Vrc5074 [Nile 4]
+ 0063 Firewarden
+ 0067 PowerVR Neon 250 Chipset
+ 1010 0020 PowerVR Neon 250 AGP 32Mb
+ 1010 0080 PowerVR Neon 250 AGP 16Mb
+ 1010 0088 PowerVR Neon 250 16Mb
+ 1010 0090 PowerVR Neon 250 AGP 16Mb
+ 1010 0098 PowerVR Neon 250 16Mb
+ 1010 00a0 PowerVR Neon 250 AGP 32Mb
+ 1010 00a8 PowerVR Neon 250 32Mb
+ 1010 0120 PowerVR Neon 250 AGP 32Mb
+ 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
+ 0074 56k Voice Modem
+ 1033 8014 RCV56ACF 56k Voice Modem
+ 009b Vrc5476
+ 00a5 VRC4173
+ 00a6 VRC5477 AC97
+ 00cd IEEE 1394 [OrangeLink] Host Controller
+ 12ee 8011 Root hub
+ 00ce IEEE 1394 Host Controller
+ 00df Vr4131
+ 00e0 USB 2.0
+ 12ee 7001 Root hub
+ 14c2 0205 PTI-205N USB 2.0 Host Controller
+ 1799 0002 Root Hub
+ 807d 1043 PCI-USB2 (EHCI subsystem)
+ 00e7 uPD72873 IEEE1394 OHCI 1.1 2-port Host Controller
+ 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
+ 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2]
+ 010c VR7701
+ 0125 uPD720400 PCI Express - PCI/PCI-X Bridge
+ 013a Dual Tuner/MPEG Encoder
+ 0194 uPD720200 USB 3.0 Host Controller
+ 1043 8413 P8P67 Deluxe Motherboard
+1034 Framatome Connectors USA Inc.
+1035 Comp. & Comm. Research Lab
+1036 Future Domain Corp.
+ 0000 TMC-18C30 [36C70]
+1037 Hitachi Micro Systems
+1038 AMP, Inc
+1039 Silicon Integrated Systems [SiS]
+ 0001 Virtual PCI-to-PCI bridge (AGP)
+ 0002 SG86C202
+ 0003 SiS AGP Port (virtual PCI-to-PCI bridge)
+ 0004 PCI-to-PCI bridge
+ 0006 85C501/2/3
+ 0008 SiS85C503/5513 (LPC Bridge)
+ 0009 ACPI
+ 000a PCI-to-PCI bridge
+ 0016 SiS961/2 SMBus Controller
+ 0018 SiS85C503/5513 (LPC Bridge)
+ 0180 RAID bus controller 180 SATA/PATA [SiS]
+ 0181 SATA
+ 0182 182 SATA/RAID Controller
+ 1734 1095 D2030-A1
+ 0186 AHCI Controller (0106)
+ 0190 190 Ethernet Adapter
+ 0191 191 Gigabit Ethernet Adapter
+ 0200 5597/5598/6326 VGA
+ 1039 0000 SiS5597 SVGA (Shared RAM)
+ 0204 82C204
+ 0205 SG86C205
+ 0300 300/305 PCI/AGP VGA Display Adapter
+ 107d 2720 Leadtek WinFast VR300
+ 0310 315H PCI/AGP VGA Display Adapter
+ 0315 315 PCI/AGP VGA Display Adapter
+ 0325 315PRO PCI/AGP VGA Display Adapter
+ 0330 330 [Xabre] PCI/AGP VGA Display Adapter
+ 0406 85C501/2
+ 0496 85C496
+ 0530 530 Host
+ 0540 540 Host
+ 0550 550 Host
+ 0597 5513C
+ 0601 85C601
+ 0620 620 Host
+ 0630 630 Host
+ 0633 633 Host
+ 0635 635 Host
+ 0645 SiS645 Host & Memory & AGP Controller
+ 0646 SiS645DX Host & Memory & AGP Controller
+ 0648 645xx
+ 0649 SiS649 Host
+ 0650 650/M650 Host
+ 0651 651 Host
+ 0655 655 Host
+ 0660 660 Host
+ 0661 661FX/M661FX/M661MX Host
+ 0662 662 Host
+ 0671 671MX
+ 0730 730 Host
+ 0733 733 Host
+ 0735 735 Host
+ 0740 740 Host
+ 0741 741/741GX/M741 Host
+ 0745 745 Host
+ 0746 746 Host
+ 0755 755 Host
+ 0760 760/M760 Host
+ 0761 761/M761 Host
+ 1734 1099 D2030-A1 Motherboard
+ 0900 SiS900 PCI Fast Ethernet
+ 1019 0a14 K7S5A motherboard
+ 1039 0900 SiS900 10/100 Ethernet Adapter onboard [Asus P4SC-EA]
+ 1043 8035 CUSI-FX motherboard
+ 1043 80a7 Motherboard P4S800D-X
+ 1462 0900 MS-6701 motherboard
+ 0961 SiS961 [MuTIOL Media IO]
+ 0962 SiS962 [MuTIOL Media IO]
+ 0963 SiS963 [MuTIOL Media IO]
+ 0964 SiS964 [MuTIOL Media IO]
+ 0965 SiS965 [MuTIOL Media IO]
+ 0966 SiS966 [MuTIOL Media IO]
+ 0968 SiS968 [MuTIOL Media IO]
+ 1180 SATA Controller / IDE mode
+ 1182 SATA Controller / RAID mode
+ 1183 SATA Controller / IDE mode
+ 1184 AHCI Controller / RAID mode
+ 1185 AHCI IDE Controller (0106)
+ 3602 83C602
+ 5107 5107
+ 5300 SiS540 PCI Display Adapter
+ 5315 550 PCI/AGP VGA Display Adapter
+ 5401 486 PCI Chipset
+ 5511 5511/5512
+ 5513 5513 [IDE]
+ 1019 0970 P6STP-FL motherboard
+ 1039 5513 SiS5513 EIDE Controller (A,B step)
+ 1043 8035 CUSI-FX motherboard
+ 1462 7010 MS-6701 motherboard
+ 1631 5513 GA-8SIML Rev1.0 Motherboard
+ 1734 1095 D2030-A1 Motherboard
+ 5517 5517
+ 5571 5571
+ 5581 5581 Pentium Chipset
+ 5582 5582
+ 5591 5591/5592 Host
+ 5596 5596 Pentium Chipset
+ 5597 5597 [SiS5582]
+ 5600 5600 Host
+ 6204 Video decoder & MPEG interface
+ 6205 VGA Controller
+ 6236 6236 3D-AGP
+ 6300 630/730 PCI/AGP VGA Display Adapter
+ 1019 0970 P6STP-FL motherboard
+ 1043 8035 CUSI-FX motherboard
+ 104d 80e2 VAIO PCV-J200
+ 6306 530/620 PCI/AGP VGA Display Adapter
+ 6325 65x/M650/740 PCI/AGP VGA Display Adapter
+ 1039 6325 SiS 651 onboard [Asus P4SC-EA]
+ 1631 1004 SiS 651C onboard [Gigabyte GA-8SIML Rev1.0]
+ 6326 86C326 5598/6326
+ 1039 6326 SiS6326 GUI Accelerator
+ 1092 0a50 SpeedStar A50
+ 1092 0a70 SpeedStar A70
+ 1092 4910 SpeedStar A70
+ 1092 4920 SpeedStar A70
+ 10b0 6326 S6110-B (AGP)
+ 1569 6326 SiS6326 GUI Accelerator
+ 6330 661/741/760 PCI/AGP or 662/761Gx PCIE VGA Display Adapter
+ 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter
+ 1043 8113 SiS Real 256E (ASUS P5S800-VM motherboard)
+ 1458 d000 SiS661FX GUI 2D/3D Accelerator
+ 1734 1099 D2030-A1
+ 6350 770/670 PCIE VGA Display Adapter
+ 6351 771/671 PCIE VGA Display Adapter
+ 7001 USB 1.1 Controller
+ 1019 0a14 K7S5A motherboard
+ 1039 7000 Onboard USB Controller
+ 1462 5470 ECS K7SOM+ motherboard
+ 1462 7010 MS-6701 motherboard
+ 1734 1095 D2030-A1 Motherboard
+ 7002 USB 2.0 Controller
+ 1462 5470 K7SOM+ 5.2C Motherboard
+ 1462 7010 MS-6701 motherboard
+ 1509 7002 Onboard USB Controller
+ 1734 1095 D2030-A1
+ 7007 FireWire Controller
+ 1462 701d MS-6701
+ 7012 C-Media AC'97 Sound Controller
+ 1039 7012 SiS 7012 onboard [Asus P4SC-EA] AC'97 Sound Controller
+ 1043 818f A8S-X Motherboard
+ 13f6 0300 CMI9739(A) on ECS K7SOM+ motherboard
+ 1462 5850 MSI 648 Max (MS-6585)
+ 1462 7010 MS-6701 motherboard
+ 15bd 1001 DFI 661FX motherboard
+ 1734 109f D2030-A1 Motherboard
+ 1849 7012 K7S41GX motherboard
+# There are may be different modem codecs here (Intel537 compatible and incompatible)
+ 7013 AC'97 Modem Controller
+ 7016 SiS7016 PCI Fast Ethernet Adapter
+ 1039 7016 SiS7016 10/100 Ethernet Adapter
+ 7018 SiS PCI Audio Accelerator
+ 1014 01b6 SiS PCI Audio Accelerator
+ 1014 01b7 SiS PCI Audio Accelerator
+ 1019 7018 SiS PCI Audio Accelerator
+ 1025 000e SiS PCI Audio Accelerator
+ 1025 0018 SiS PCI Audio Accelerator
+ 1039 7018 SiS PCI Audio Accelerator
+ 1043 1453 SiS PCI Audio Accelerator
+ 1043 800b SiS PCI Audio Accelerator
+ 104d 80e2 VAIO PCV-J200
+ 1054 7018 SiS PCI Audio Accelerator
+ 107d 5330 SiS PCI Audio Accelerator
+ 107d 5350 SiS PCI Audio Accelerator
+ 1170 3209 SiS PCI Audio Accelerator
+ 1462 400a SiS PCI Audio Accelerator
+ 14a4 2089 SiS PCI Audio Accelerator
+ 14cd 2194 SiS PCI Audio Accelerator
+ 14ff 1100 SiS PCI Audio Accelerator
+ 152d 8808 SiS PCI Audio Accelerator
+ 1558 1103 SiS PCI Audio Accelerator
+ 1558 2200 SiS PCI Audio Accelerator
+ 1563 7018 SiS PCI Audio Accelerator
+ 15c5 0111 SiS PCI Audio Accelerator
+ 270f a171 SiS PCI Audio Accelerator
+ a0a0 0022 SiS PCI Audio Accelerator
+ 7019 SiS7019 Audio Accelerator
+ 7502 Azalia Audio Controller
+103a Seiko Epson Corporation
+103b Tatung Corp. Of America
+103c Hewlett-Packard Company
+ 0025 XE4500 Notebook
+ 002a NX9000 Notebook
+ 08bc NX5000 Notebook
+ 1005 A4977A Visualize EG
+ 1008 Visualize FX
+ 1028 Tach TL Fibre Channel Host Adapter
+ 1029 Tach XL2 Fibre Channel Host Adapter
+ 107e 000f Interphase 5560 Fibre Channel Adapter
+ 9004 9210 1Gb/2Gb Family Fibre Channel Controller
+ 9004 9211 1Gb/2Gb Family Fibre Channel Controller
+ 102a Tach TS Fibre Channel Host Adapter
+ 107e 000e Interphase 5540/5541 Fibre Channel Adapter
+ 9004 9110 1Gb/2Gb Family Fibre Channel Controller
+ 9004 9111 1Gb/2Gb Family Fibre Channel Controller
+ 1030 J2585A DeskDirect 10/100VG NIC
+ 1031 J2585B HP 10/100VG PCI LAN Adapter
+ 103c 1040 J2973A DeskDirect 10BaseT NIC
+ 103c 1041 J2585B DeskDirect 10/100VG NIC
+ 103c 1042 J2970A DeskDirect 10BaseT/2 NIC
+ 1040 J2973A DeskDirect 10BaseT NIC
+ 1041 J2585B DeskDirect 10/100 NIC
+ 1042 J2970A DeskDirect 10BaseT/2 NIC
+ 1048 Diva Serial [GSP] Multiport UART
+ 103c 1049 Tosca Console
+ 103c 104a Tosca Secondary
+ 103c 104b Maestro SP2
+ 103c 1223 Superdome Console
+ 103c 1226 Keystone SP2
+ 103c 1227 Powerbar SP2
+ 103c 1282 Everest SP2
+ 103c 1301 Diva RMP3
+ 1054 PCI Local Bus Adapter
+ 1064 79C970 PCnet Ethernet Controller
+ 108b Visualize FXe
+ 10c1 NetServer Smart IRQ Router
+ 10ed TopTools Remote Control
+ 10f0 rio System Bus Adapter
+ 10f1 rio I/O Controller
+ 1200 82557B 10/100 NIC
+ 1219 NetServer PCI Hot-Plug Controller
+ 121a NetServer SMIC Controller
+ 121b NetServer Legacy COM Port Decoder
+ 121c NetServer PCI COM Port Decoder
+ 1229 zx1 System Bus Adapter
+ 122a zx1 I/O Controller
+ 122e PCI-X Local Bus Adapter
+ 127b sx1000 System Bus Adapter
+ 127c sx1000 I/O Controller
+ 1290 Auxiliary Diva Serial Port
+ 103c 1291 Diva SP2
+ 1291 Auxiliary Diva Serial Port
+ 12b4 zx1 QuickSilver AGP8x Local Bus Adapter
+ 12eb sx2000 System Bus Adapter
+ 12ec sx2000 I/O Controller
+ 12ee PCI-X 2.0 Local Bus Adapter
+ 12f8 Broadcom BCM4306 802.11b/g Wireless LAN
+ 12fa BCM4306 802.11b/g Wireless LAN Controller
+ 1302 RMP-3 Shared Memory Driver
+ 1303 RMP-3 (Remote Management Processor)
+ 1361 BCM4312 802.11a/b/g WLAN Controller
+ 1371 Broadcom Corporation BCM4312 802.11a/b/g (rev 02)
+ 2910 E2910A PCIBus Exerciser
+ 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer
+ 3080 Pavilion ze2028ea
+ 3085 Realtek RTL8139/8139C/8139C+
+ 30a3 Compaq NW8440 Notebook
+ 30b5 Compaq Presario V3000Z
+ 31fb DL365 ATI ES1000 VGA controller
+ 3206 Adaptec Embedded Serial ATA HostRAID
+ 3220 Smart Array P600
+ 103c 3225 3 Gb/s SAS RAID
+ 3230 Smart Array Controller
+ 103c 3223 Smart Array P800
+ 103c 3234 P400 SAS Controller
+ 103c 3235 P400i SAS Controller
+ 103c 3237 E500 SAS Controller
+ 103c 323d P700m SAS Controller
+ 3238 Smart Array E200i (SAS Controller)
+ 103c 3211 Smart Array E200i
+ 103c 3212 Smart Array E200
+ 323a Smart Array G6 controllers
+ 103c 3241 Smart Array P212
+ 103c 3243 Smart Array P410
+ 103c 3245 Smart Array P410i
+ 103c 3247 Smart Array P411
+ 103c 3249 Smart Array P812
+ 103c 324a HP Smart Array 712m (Mezzanine RAID controller)
+ 103c 324b Smart Array P711m (Mezzanine RAID controller)
+ 3300 Integrated Lights-Out Standard Virtual USB Controller
+ 103c 3304 iLO2
+ 103c 3305 iLO2
+ 103c 3309 iLO2 GXL/iLO3 GXE
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3301 Integrated Lights-Out Standard Serial Port
+ 103c 3304 iLO2
+ 103c 3305 iLO2
+ 103c 330e iLO3
+ 103c 3381 iLO4
+# Virtual serial port which is presented on a Java applet
+ 3302 Integrated Lights-Out Standard KCS Interface
+ 103c 3304 iLO2
+ 103c 3305 iLO2
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3305 Integrated Lights-Out (iLO2) Controller
+ 3306 Integrated Lights-Out Standard Slave Instrumentation & System Support
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3307 Integrated Lights-Out Standard Management Processor Support and Messaging
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 3308 Integrated Lights-Out Standard MS Watchdog Timer
+ 103c 330e iLO3
+ 103c 3381 iLO4
+ 402f PCIe Root Port
+ 4030 zx2 System Bus Adapter
+ 4031 zx2 I/O Controller
+ 4037 PCIe Local Bus Adapter
+ 403b PCIe Root Port
+ 60e8 NetRAID-2M : ZX1/M (OEM AMI MegaRAID 493)
+103e Solliday Engineering
+103f Synopsys/Logic Modeling Group
+1040 Accelgraphics Inc.
+1041 Computrend
+1042 Micron
+ 1000 PC Tech RZ1000
+ 1001 PC Tech RZ1001
+ 3000 Samurai_0
+ 3010 Samurai_1
+ 3020 Samurai_IDE
+1043 ASUSTeK Computer Inc.
+ 0675 ISDNLink P-IN100-ST-D
+ 0675 1704 ISDN Adapter (PCI Bus, D, C)
+ 0675 1707 ISDN Adapter (PCI Bus, DV, W)
+ 10cf 105e ISDN Adapter (PCI Bus, DV, W)
+ 0c11 A7N8X Motherboard nForce2 IDE/USB/SMBus
+ 4015 v7100 SDRAM [GeForce2 MX]
+ 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner]
+ 4057 v8200 GeForce 3
+ 8043 v8240 PAL 128M [P4T] Motherboard
+ 8047 v8420 Deluxe [GeForce4 Ti4200]
+ 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI]
+ 8095 A7N8X Motherboard nForce2 AC97 Audio
+ 80ac A7N8X Motherboard nForce2 AGP/Memory
+ 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out]
+ 80c5 nForce3 chipset motherboard [SK8N]
+ 80df v9520 Magic/T
+ 815a A8N-SLI Motherboard nForce4 SATA
+ 8168 Realtek PCI-E Gigabit Ethernet Controller (RTL8111B)
+ 8187 802.11a/b/g Wireless LAN Card
+ 8188 Tiger Hybrid TV Capture Device
+# Found on ASUS M2V motherboard
+ 81e7 Realtek ALC-660 6-channel CODEC
+ 81f4 EN7300TC512/TD/128M/A(C262G) [Graphics Card EN7300TC512]
+ 8233 EEE-PC 701 Netbook
+ 82ca G96 GeForce 9500 GT
+ 82e8 M3N72-D
+ 8383 P7P55D Series Motherboard
+ 83a4 Motherboard M2N68-AM SE2
+ 843e M5A88-V EVO
+# wrong vendor ID (should have been AMD)
+ 9602 RS880 PCI to PCI bridge (int gfx)
+ 1043 83a2 M4A785TD Motherboard
+1044 Adaptec (formerly DPT)
+ 1012 Domino RAID Engine
+ a400 SmartCache/Raid I-IV Controller
+ a500 PCI Bridge
+ a501 SmartRAID V Controller
+ 1044 c001 PM1554U2 Ultra2 Single Channel
+ 1044 c002 PM1654U2 Ultra2 Single Channel
+ 1044 c003 PM1564U3 Ultra3 Single Channel
+ 1044 c004 PM1564U3 Ultra3 Dual Channel
+ 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c00a PM2554U2 Ultra2 Single Channel
+ 1044 c00b PM2654U2 Ultra2 Single Channel
+ 1044 c00c PM2664U3 Ultra3 Single Channel
+ 1044 c00d PM2664U3 Ultra3 Dual Channel
+ 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI)
+ 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI)
+ 1044 c016 PM3755F Fibre Channel (NON ACPI)
+ 1044 c01e PM3757U2 Ultra2 Single Channel
+ 1044 c01f PM3757U2 Ultra2 Dual Channel
+ 1044 c020 PM3767U3 Ultra3 Dual Channel
+ 1044 c021 PM3767U3 Ultra3 Quad Channel
+ 1044 c028 PM2865U3 Ultra3 Single Channel
+ 1044 c029 PM2865U3 Ultra3 Dual Channel
+ 1044 c02a PM2865F Fibre Channel
+ 1044 c03c 2000S Ultra3 Single Channel
+ 1044 c03d 2000S Ultra3 Dual Channel
+ 1044 c03e 2000F Fibre Channel
+ 1044 c046 3000S Ultra3 Single Channel
+ 1044 c047 3000S Ultra3 Dual Channel
+ 1044 c048 3000F Fibre Channel
+ 1044 c050 5000S Ultra3 Single Channel
+ 1044 c051 5000S Ultra3 Dual Channel
+ 1044 c052 5000F Fibre Channel
+ 1044 c05a 2400A UDMA Four Channel
+ 1044 c05b 2400A UDMA Four Channel DAC
+ 1044 c064 3010S Ultra3 Dual Channel
+ 1044 c065 3410S Ultra160 Four Channel
+ 1044 c066 3010S Fibre Channel
+ a511 SmartRAID V Controller
+ 1044 c032 ASR-2005S I2O Zero Channel
+ 1044 c035 ASR-2010S I2O Zero Channel
+ c066 3010S Ultra3 Dual Channel
+1045 OPTi Inc.
+ a0f8 82C750 [Vendetta] USB Controller
+ c101 92C264
+ c178 92C178
+ c556 82X556 [Viper]
+ c557 82C557 [Viper-M]
+ c558 82C558 [Viper-M ISA+IDE]
+ c567 82C750 [Vendetta], device 0
+ c568 82C750 [Vendetta], device 1
+ c569 82C579 [Viper XPress+ Chipset]
+ c621 82C621 [Viper-M/N+]
+ c700 82C700 [FireStar]
+ c701 82C701 [FireStar Plus]
+ c814 82C814 [Firebridge 1]
+ c822 82C822
+ c824 82C824
+ c825 82C825 [Firebridge 2]
+ c832 82C832
+ c861 82C861
+ c895 82C895
+ c935 EV1935 ECTIVA MachOne PCIAudio
+ d568 82C825 [Firebridge 2]
+ d721 IDE [FireStar]
+1046 IPC Corporation, Ltd.
+1047 Genoa Systems Corp
+1048 Elsa AG
+ 0c60 Gladiac MX
+ 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL]
+ 1000 QuickStep 1000
+ 3000 QuickStep 3000
+ 8901 Gloria XL
+ 1048 0935 GLoria XL (Virge)
+1049 Fountain Technologies, Inc.
+# nee SGS Thomson Microelectronics
+104a STMicroelectronics
+ 0000 STLS2F Host Bridge
+ 0008 STG 2000X
+ 0009 STG 1764X
+ 0010 STG4000 [3D Prophet Kyro Series]
+ 0201 STPC Vega Northbridge
+ 0209 STPC Consumer/Industrial North- and Southbridge
+ 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge
+ 020b STPC Consumer II ISA Bridge
+ 0210 STPC Atlas ISA Bridge
+ 021a STPC Consumer S Southbridge
+ 021b STPC Consumer IIA Southbridge
+ 0220 STPC Industrial PCI to PCCard bridge
+ 0228 STPC Atlas IDE
+ 0229 STPC Vega IDE
+ 0230 STPC Atlas/Vega OHCI USB Controller
+ 0238 STPC Vega LAN
+ 0500 ST70137 [Unicorn] ADSL DMT Transceiver
+ 104a 0500 BeWAN ADSL PCI st
+ 0564 STPC Client Northbridge
+ 0981 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 1746 STG 1764X
+ 2774 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 3520 MPEG-II decoder card
+ 55cc STPC Client Southbridge
+104b BusLogic
+ 0140 BT-946C (old) [multimaster 01]
+ 1040 BT-946C (BA80C30) [MultiMaster 10]
+ 8130 Flashpoint LT
+104c Texas Instruments
+ 0500 100 MBit LAN Controller
+ 0508 TMS380C2X Compressor Interface
+ 1000 Eagle i/f AS
+ 104c PCI1510 PC card Cardbus Controller
+ 3d04 TVP4010 [Permedia]
+ 3d07 TVP4020 [Permedia 2]
+ 1011 4d10 Comet
+ 1040 000f AccelStar II
+ 1040 0011 AccelStar II
+ 1048 0a31 WINNER 2000
+ 1048 0a32 GLoria Synergy
+ 1048 0a34 GLoria Synergy
+ 1048 0a35 GLoria Synergy
+ 1048 0a36 GLoria Synergy
+ 1048 0a43 GLoria Synergy
+ 1048 0a44 GLoria Synergy
+ 107d 2633 WinFast 3D L2300
+ 1092 0126 FIRE GL 1000 PRO
+ 1092 0127 FIRE GL 1000 PRO
+ 1092 0136 FIRE GL 1000 PRO
+ 1092 0141 FIRE GL 1000 PRO
+ 1092 0146 FIRE GL 1000 PRO
+ 1092 0148 FIRE GL 1000 PRO
+ 1092 0149 FIRE GL 1000 PRO
+ 1092 0152 FIRE GL 1000 PRO
+ 1092 0154 FIRE GL 1000 PRO
+ 1092 0155 FIRE GL 1000 PRO
+ 1092 0156 FIRE GL 1000 PRO
+ 1092 0157 FIRE GL 1000 PRO
+ 1097 3d01 Jeronimo Pro
+ 1102 100f Graphics Blaster Extreme
+ 3d3d 0100 Reference Permedia 2 3D
+ 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller
+ 1443 8003 FireBoard200
+ e4bf 1010 CF1-1-SNARE
+ e4bf 1020 CF1-2-SNARE
+ 8009 TSB12LV22 IEEE-1394 Controller
+ 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller
+ 8017 PCI4410 FireWire Controller
+ 8019 TSB12LV23 IEEE-1394 Controller
+ 11bd 000a Studio DV500-1394
+ 11bd 000e Studio DV
+ e4bf 1010 CF2-1-CYMBAL
+ 8020 TSB12LV26 IEEE-1394 Controller (Link)
+ 1028 00d8 Precision 530
+ 104d 80e2 VAIO PCV-J200
+ 11bd 000f Studio DV500-1394
+ 11bd 001c Excalibur 4.1
+ 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)
+ 104d 80df Vaio PCG-FX403
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) [iOHCI-Lynx]
+ 104c 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
+ 8023 TSB43AB22A IEEE-1394a-2000 Controller (PHY/Link) [iOHCI-Lynx]
+ 103c 088c NC8000 laptop
+ 1043 808b K8N4-E Mainboard
+ 1043 815b P5W DH Deluxe Motherboard
+ 1443 8023 FireCard400
+ 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
+ 107d 6620 Winfast DV2000 FireWire Controller
+ 1443 8024 FireBoard Blue
+ 1458 1000 GA-EP45-DS5 Motherboard
+ 8025 TSB82AA2 IEEE-1394b Link Layer Controller
+ 1458 1000 GA-K8N Ultra-9 Mainboard
+ 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)
+ 1025 0035 TravelMate 660
+ 1025 003c Aspire 2001WLCi (Compaq CL50 motherboard)
+ 103c 0025 XE4500 Notebook
+ 103c 006a NX9500
+ 1043 808d A7V333 mainboard.
+ 8027 PCI4451 IEEE-1394 Controller
+ 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)
+ 8029 PCI4510 IEEE-1394 Controller
+ 1028 0163 Latitude D505
+ 1028 0196 Inspiron 5160
+ 1071 8160 MIM2900
+ 802b PCI7410,7510,7610 OHCI-Lynx Controller
+ 1028 0139 Latitude D400
+ 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Latitude D800)
+ 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller
+ 1028 018d Inspiron 700m/710m
+ 8031 PCIxx21/x515 Cardbus Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8032 OHCI Compliant IEEE 1394 Host Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8033 PCIxx21 Integrated FlashMedia Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8034 PCI6411/6421/6611/6621/7411/7421/7611/7621 Secure Digital Controller
+ 1025 0080 Aspire 5024WLMi
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 103c 308b MX6125
+ 8035 PCI6411/6421/6611/6621/7411/7421/7611/7621 Smart Card Controller
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 8036 PCI6515 Cardbus Controller
+ 8038 PCI6515 SmartCard Controller
+ 8039 PCIxx12 Cardbus Controller
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 104d 902d VAIO VGN-NR120E
+ 803a PCIxx12 OHCI Compliant IEEE 1394 Host Controller
+ 103c 309f nx9420
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 104d 902d VAIO VGN-NR120E
+ 803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)
+ 103c 309f nx9420
+ 103c 30a3 Compaq nw8440
+ 104d 902d VAIO VGN-NR120E
+ 803c PCIxx12 SDA Standard Compliant SD Host Controller
+ 103c 309f nx9420
+ 103c 30a3 Compaq nw8440
+ 803d PCIxx12 GemCore based SmartCard controller
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 nc8430
+ 103c 30aa nc6310
+ 8101 TSB43DB42 IEEE-1394a-2000 Controller (PHY/Link)
+ 8201 PCI1620 Firmware Loading Function
+ 8204 PCI7410,7510,7610 PCI Firmware Loading Function
+ 1028 0139 Latitude D400
+ 1028 014e Latitude D800
+ 8231 XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge
+ 5678 1234 DC-1394 PCIe
+ 8232 XIO3130 PCI Express Switch (Upstream)
+ 8233 XIO3130 PCI Express Switch (Downstream)
+ 8235 XIO2200A IEEE-1394a-2000 Controller (PHY/Link)
+ 5678 1234 DC-1394 PCIe
+ 823e XIO2213A/B/XIO2221 PCI Express to PCI Bridge [Cheetah Express]
+ 823f XIO2213A/B/XIO2221 IEEE-1394b OHCI Controller [Cheetah Express]
+ 1546 803c FWB-PCIE1X11B
+ 8240 XIO2001 PCI Express-to-PCI Bridge
+ 8400 ACX 100 22Mbps Wireless Interface
+ 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus]
+ 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter
+ 1395 2201 WL22-PC
+ 16ab 8501 WL-8305 IEEE802.11b+ Wireless LAN PCI Adapter
+ 8401 ACX 100 22Mbps Wireless Interface
+ 9000 Wireless Interface (of unknown type)
+ 9065 TMS320DM642
+ 9066 ACX 111 54Mbps Wireless Interface
+ 0308 3404 G-102 v1 802.11g Wireless Cardbus Adapter
+ 0308 3406 G-162 v2 802.11g Wireless Cardbus Adapter
+ 104c 9066 WL212 Sitecom Wireless Network PCI-Card 100M (Version 1)
+ 104c 9096 Trendnet TEW-412PC Wireless PCI Adapter (Version A)
+ 1186 3b04 DWL-G520+ Wireless PCI Adapter
+ 1186 3b05 DWL-G650+ AirPlusG+ CardBus Wireless LAN
+ 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.B1)
+ 1385 4c00 WG311v2 802.11g Wireless PCI Adapter
+ 13d1 aba0 SWLMP-54108 108Mbps Wireless mini PCI card 802.11g+
+ 14ea ab07 GW-NS54GM Wireless Cardbus Adapter
+ 16ec 010d USR5416 802.11g Wireless Turbo PCI Adapter
+ 16ec 010e USR5410 802.11g Wireless Cardbus Adapter
+ 1737 0033 WPC54G v2 802.11g Wireless-G Notebook Adapter
+ 17cf 0032 G-162 v1 802.11g Wireless Cardbus Adapter
+ 17cf 0033 Z-Com XG650 Wireless miniPCI 802.11b/g
+ 187e 340b G-302 v2 802.11g Wireless PCI Adapter
+ 187e 340c G-360 v2 802.11g Wireless PCI Adapter
+ a001 TDC1570
+ a100 TDC1561
+ a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f
+ a106 TMS320C6414 TMS320C6415 TMS320C6416
+ 175c 5000 ASI50xx Audio Adapter
+ 175c 6400 ASI6400 Cobranet series
+ 175c 8700 ASI87xx Radio Tuner card
+ ac10 PCI1050
+ ac11 PCI1053
+ ac12 PCI1130
+ ac13 PCI1031
+ ac15 PCI1131
+ ac16 PCI1250
+ 1014 0092 ThinkPad 600
+ ac17 PCI1220
+ ac18 PCI1260
+ ac19 PCI1221
+ ac1a PCI1210
+ ac1b PCI1450
+ 0e11 b113 Armada M700
+ 1014 0130 ThinkPad 600X/A21m/T20/T22
+ ac1c PCI1225
+ 0e11 b121 Armada E500
+ 1028 0088 Latitude CPi A400XT
+ ac1d PCI1251A
+ ac1e PCI1211
+ ac1f PCI1251B
+ ac20 TI 2030
+ ac21 PCI2031
+ ac22 PCI2032 PCI Docking Bridge
+ ac23 PCI2250 PCI-to-PCI Bridge
+ ac28 PCI2050 PCI-to-PCI Bridge
+ ac2c PCI2060 PCI-to-PCI Bridge
+ ac30 PCI1260 PC card Cardbus Controller
+ ac40 PCI4450 PC card Cardbus Controller
+ ac41 PCI4410 PC card Cardbus Controller
+ ac42 PCI4451 PC card Cardbus Controller
+ 1028 00e6 PCI4451 PC card CardBus Controller (Inspiron 8100)
+ ac44 PCI4510 PC card Cardbus Controller
+ 1028 0149 Inspiron 5100
+ 1028 0163 Latitude D505
+ 1028 0196 Inspiron 5160
+ 1071 8160 MIM2000
+ ac46 PCI4520 PC card Cardbus Controller
+ 1014 0552 ThinkPad
+ ac47 PCI7510 PC card Cardbus Controller
+ 1028 0139 Latitude D400
+ 1028 013f Precision M60
+ 1028 014e Latitude D800
+ ac48 PCI7610 PC Card Cardbus Controller
+ ac49 PCI7410 PC Card Cardbus Controller
+ ac4a PCI7510,7610 PC card Cardbus Controller
+ 1028 0139 Latitude D400
+ 1028 014e Latitude D800
+ ac4b PCI7610 SD/MMC controller
+ ac4c PCI7610 Memory Stick controller
+ ac50 PCI1410 PC card Cardbus Controller
+ ac51 PCI1420 PC card Cardbus Controller
+ 0e11 004e Evo N600c
+ 1014 0148 ThinkPad A20m
+ 1014 023b ThinkPad T23
+ 1028 00b1 Latitude C600
+ 1028 012a Latitude C640
+ 1033 80cd Versa Note VXi
+ 10cf 1095 Lifebook S-4510/C6155
+ e4bf 1000 CP2-2-HIPHOP
+ ac52 PCI1451 PC card Cardbus Controller
+ ac53 PCI1421 PC card Cardbus Controller
+ ac54 PCI1620 PC Card Controller
+ 103c 08b0 tc1100 tablet
+ ac55 PCI1520 PC card Cardbus Controller
+ 1014 0512 ThinkPad T30/T40
+ 103c 0025 XE4500 Notebook
+ ac56 PCI1510 PC card Cardbus Controller
+ 1014 0512 ThinkPad R50e
+ 1014 0528 ThinkPad R40e
+ 17aa 2012 ThinkPad T60/R60 series
+ ac60 PCI2040 PCI to DSP Bridge Controller
+ 175c 5100 ASI51xx Audio Adapter
+ 175c 6100 ASI61xx Audio Adapter
+ 175c 6200 ASI62xx Audio Adapter
+ 175c 8800 ASI88xx Audio Adapter
+ 186f 3001 WR-G303 PCI radio receiver
+ 186f 3005 WR-G305 PCI radio receiver
+ 186f 3101 WR-G313 PCI radio receiver
+ 186f 3105 WR-G315 PCI radio receiver
+ ac8d PCI 7620
+ ac8e PCI7420 CardBus Controller
+ 1028 018d Inspiron 700m/710m
+ ac8f PCI7420/7620 Combo CardBus, 1394a-2000 OHCI and SD/MS-Pro Controller
+ 1028 018d Inspiron 700m/710m
+ b001 TMS320C6424
+ fe00 FireWire Host Controller
+ fe03 12C01A FireWire Host Controller
+104d Sony Corporation
+ 8004 DTL-H2500 [Playstation development board]
+ 8009 CXD1947Q i.LINK Controller
+ 8039 CXD3222 i.LINK Controller
+ 8056 Rockwell HCF 56K modem
+ 808a Memory Stick Controller
+ 81ce SxS Pro memory card
+ 902d VAIO VGN-NR120E
+104e Oak Technology, Inc
+ 0017 OTI-64017
+ 0107 OTI-107 [Spitfire]
+ 0109 Video Adapter
+ 0111 OTI-64111 [Spitfire]
+ 0217 OTI-64217
+ 0317 OTI-64317
+104f Co-time Computer Ltd
+1050 Winbond Electronics Corp
+ 0000 NE2000
+ 0001 W83769F
+ 0033 W89C33D 802.11 a/b/g BB/MAC
+ 0105 W82C105
+ 0840 W89C840
+ 1050 0001 W89C840 Ethernet Adapter
+ 1050 0840 W89C840 Ethernet Adapter
+ 0940 W89C940
+ 5a5a W89C940F
+ 6692 W6692
+ 1043 1702 ISDN Adapter (PCI Bus, D, W)
+ 1043 1703 ISDN Adapter (PCI Bus, DV, W)
+ 1043 1707 ISDN Adapter (PCI Bus, DV, W)
+ 144f 1702 ISDN Adapter (PCI Bus, D, W)
+ 144f 1703 ISDN Adapter (PCI Bus, DV, W)
+ 144f 1707 ISDN Adapter (PCI Bus, DV, W)
+ 9921 W99200F MPEG-1 Video Encoder
+ 9922 W99200F/W9922PF MPEG-1/2 Video Encoder
+ 9970 W9970CF
+1051 Anigma, Inc.
+1052 ?Young Micro Systems
+1053 Young Micro Systems
+1054 Hitachi, Ltd
+ 3009 2Gbps Fibre Channel to PCI HBA 3009
+ 300a 4Gbps Fibre Channel to PCI-X HBA 300a
+ 300b 4Gbps Fibre Channel to PCI-X HBA 300b
+ 300f ColdFusion 3 Chipset Processor to I/O Controller
+ 3010 ColdFusion 3 Chipset Memory Controller Hub
+ 3011 ColdFusion 3e Chipset Processor to I/O Controller
+ 3012 ColdFusion 3e Chipset Memory Controller Hub
+ 3017 Unassigned Hitachi Shared FC Device 3017
+ 301b Virtual VGA Device
+ 301d PCIe-to-PCIe Bridge with Virtualization IO Assist Feature
+ 3020 FIVE-EX based Fibre Channel to PCIe HBA
+ 302c M001 PCI Express Switch Upstream Port
+ 302d M001 PCI Express Switch Downstream Port
+ 3505 SH7751 PCI Controller (PCIC)
+ 350e SH7751R PCI Controller (PCIC)
+1055 Efar Microsystems
+ 9130 SLC90E66 [Victory66] IDE
+ 9460 SLC90E66 [Victory66] ISA
+ 9462 SLC90E66 [Victory66] USB
+ 9463 SLC90E66 [Victory66] ACPI
+ e420 LAN9420/LAN9420i
+1056 ICL
+# Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this.
+1057 Motorola
+ 0001 MPC105 [Eagle]
+ 0002 MPC106 [Grackle]
+ 0003 MPC8240 [Kahlua]
+ 0004 MPC107
+ 0006 MPC8245 [Unity]
+ 0008 MPC8540
+ 0009 MPC8560
+ 0012 MPC8548 [PowerQUICC III]
+ 0100 MC145575 [HFC-PCI]
+ 0431 KTI829c 100VG
+ 1073 Nokia N770
+ 1219 Nokia N800
+ 1801 DSP56301 Digital Signal Processor
+ 14fb 0101 Transas Radar Imitator Board [RIM]
+ 14fb 0102 Transas Radar Imitator Board [RIM-2]
+ 14fb 0202 Transas Radar Integrator Board [RIB-2]
+ 14fb 0611 1 channel CAN bus Controller [CanPci-1]
+ 14fb 0612 2 channels CAN bus Controller [CanPci-2]
+ 14fb 0613 3 channels CAN bus Controller [CanPci-3]
+ 14fb 0614 4 channels CAN bus Controller [CanPci-4]
+ 14fb 0621 1 channel CAN bus Controller [CanPci2-1]
+ 14fb 0622 2 channels CAN bus Controller [CanPci2-2]
+ 14fb 0810 Transas VTS Radar Integrator Board [RIB-4]
+ 175c 4200 ASI4215 Audio Adapter
+ 175c 4300 ASI43xx Audio Adapter
+ 175c 4400 ASI4401 Audio Adapter
+ ecc0 0010 Darla
+ ecc0 0020 Gina
+ ecc0 0030 Layla rev.0
+ ecc0 0031 Layla rev.1
+ ecc0 0040 Darla24 rev.0
+ ecc0 0041 Darla24 rev.1
+ ecc0 0050 Gina24 rev.0
+ ecc0 0051 Gina24 rev.1
+ ecc0 0070 Mona rev.0
+ ecc0 0071 Mona rev.1
+ ecc0 0072 Mona rev.2
+ 18c0 MPC8265A/8266/8272
+ 18c1 MPC8271/MPC8272
+ 3052 SM56 Data Fax Modem
+ 3055 SM56 Data Fax Modem
+ 3410 DSP56361 Digital Signal Processor
+ ecc0 0050 Gina24 rev.0
+ ecc0 0051 Gina24 rev.1
+ ecc0 0060 Layla24
+ ecc0 0070 Mona rev.0
+ ecc0 0071 Mona rev.1
+ ecc0 0072 Mona rev.2
+ ecc0 0080 Mia rev.0
+ ecc0 0081 Mia rev.1
+ ecc0 0090 Indigo
+ ecc0 00a0 Indigo IO
+ ecc0 00b0 Indigo DJ
+ ecc0 0100 3G
+ 4801 Raven
+ 4802 Falcon
+ 4803 Hawk
+ 4806 CPX8216
+ 4d68 20268
+ 5600 SM56 PCI Modem
+ 1057 0300 SM56 PCI Speakerphone Modem
+ 1057 0301 SM56 PCI Voice Modem
+ 1057 0302 SM56 PCI Fax Modem
+ 1057 5600 SM56 PCI Voice modem
+ 13d2 0300 SM56 PCI Speakerphone Modem
+ 13d2 0301 SM56 PCI Voice modem
+ 13d2 0302 SM56 PCI Fax Modem
+ 1436 0300 SM56 PCI Speakerphone Modem
+ 1436 0301 SM56 PCI Voice modem
+ 1436 0302 SM56 PCI Fax Modem
+ 144f 100c SM56 PCI Fax Modem
+ 1494 0300 SM56 PCI Speakerphone Modem
+ 1494 0301 SM56 PCI Voice modem
+ 14c8 0300 SM56 PCI Speakerphone Modem
+ 14c8 0302 SM56 PCI Fax Modem
+ 1668 0300 SM56 PCI Speakerphone Modem
+ 1668 0302 SM56 PCI Fax Modem
+ 5608 Wildcard X100P
+ 5803 MPC5200
+ 5806 MCF54 Coldfire
+ 5808 MPC8220
+ 5809 MPC5200B
+ 6400 MPC190 Security Processor (S1 family, encryption)
+ 6405 MPC184 Security Processor (S1 family)
+1058 Electronics & Telecommunications RSH
+# Formerly: Teknor Industrial Computers Inc
+1059 Kontron
+105a Promise Technology, Inc.
+ 0d30 PDC20265 (FastTrak100 Lite/Ultra100)
+ 1043 8042 AV7266-E South Bridge Promise RAID
+ 105a 4d33 Ultra100
+ 0d38 20263
+ 105a 4d39 Fasttrak66
+ 1275 20275
+ 3318 PDC20318 (SATA150 TX4)
+ 3319 PDC20319 (FastTrak S150 TX4)
+ 8086 3427 S875WP1-E mainboard
+ 3371 PDC20371 (FastTrak S150 TX2plus)
+ 3373 PDC20378 (FastTrak 378/SATA 378)
+ 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard
+ 1462 590d KT6 Delta-FIS2R (MS-6590)
+ 1462 702e K8T NEO FIS2R motherboard
+ 3375 PDC20375 (SATA150 TX2plus)
+ 3376 PDC20376 (FastTrak 376)
+ 1043 809e A7V8X motherboard
+ 3515 PDC40719 [FastTrak TX4300/TX4310]
+ 3519 PDC40519 (FastTrak TX4200)
+ 3570 20771 (FastTrak TX2300)
+ 3571 PDC20571 (FastTrak TX2200)
+ 3574 PDC20579 SATAII 150 IDE Controller
+ 3577 PDC40779 (SATA 300 779)
+ 3d17 PDC40718 (SATA 300 TX4)
+ 3d18 PDC20518/PDC40518 (SATAII 150 TX4)
+ 3d73 PDC40775 (SATA 300 TX2plus)
+ 3d75 PDC20575 (SATAII150 TX2plus)
+ 3f20 PDC42819 [FastTrak TX2650/TX4650]
+ 4302 80333 [SuperTrak EX4350]
+ 4d30 PDC20267 (FastTrak100/Ultra100)
+ 105a 4d33 Ultra100
+ 105a 4d39 FastTrak100
+ 8086 5744 S845WD1-E mainboard
+ 4d33 20246
+ 105a 4d33 20246 IDE Controller
+ 4d38 PDC20262 (FastTrak66/Ultra66)
+ 105a 4d30 Ultra Device on SuperTrak
+ 105a 4d33 Ultra66
+ 105a 4d39 FastTrak66
+ 4d68 PDC20268 (Ultra100 TX2)
+ 105a 4d68 Ultra100TX2
+ 4d69 20269
+ 105a 4d68 Ultra133TX2
+ 5275 PDC20276 (MBFastTrak133 Lite)
+ 1043 807e A7V333 motherboard.
+ 105a 0275 SuperTrak SX6000 IDE
+ 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode)
+ 1458 b001 MBUltra 133
+ 5300 DC5300
+ 6268 PDC20270 (FastTrak100 LP/TX2/TX4)
+ 105a 4d68 FastTrak100 TX2
+ 6269 PDC20271 (FastTrak TX2000)
+ 105a 6269 FastTrak TX2/TX2000
+ 6300 PDC81731 [FastTrak SX8300]
+ 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)
+ 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller
+ 6624 PDC20621 [FastTrak SX4100]
+ 6626 PDC20618 (Ultra 618)
+ 6629 PDC20619 (FastTrak TX4000)
+ 7275 PDC20277 (SBFastTrak133 Lite)
+ 8002 SATAII150 SX8
+ 8350 80333 [SuperTrak EX8350/EX16350], 80331 [SuperTrak EX8300/EX16300]
+ 8650 81384 [SuperTrak EX SAS and SATA RAID Controller]
+ 105a 4600 SuperTrak EX4650A
+ 105a 4601 SuperTrak EX4650
+ 105a 4610 SuperTrak EX4650EL
+ 105a 8600 SuperTrak EX8650EL
+ 105a 8601 SuperTrak EX8650A
+ 105a 8602 SuperTrak EX8654
+ 105a 8603 SuperTrak EX8658
+ 105a 8604 SuperTrak EX8650
+ 105a 8610 SuperTrak EX8650M
+ 105a a600 SuperTrak EX12650
+ 105a b600 SuperTrak EX16650
+ 105a b601 SuperTrak EX16654
+ 105a b602 SuperTrak EX16658
+ 8760 PM8010 [SuperTrak EX SAS and SATA 6G RAID Controller]
+ c350 80333 [SuperTrak EX12350]
+ e350 80333 [SuperTrak EX24350]
+105b Foxconn International, Inc.
+ 0c4d SiS AC'97 Sound Controller
+105c Wipro Infotech Limited
+105d Number 9 Computer Company
+ 2309 Imagine 128
+ 2339 Imagine 128-II
+ 105d 0000 Imagine 128 series 2 4Mb VRAM
+ 105d 0001 Imagine 128 series 2 4Mb VRAM
+ 105d 0002 Imagine 128 series 2 4Mb VRAM
+ 105d 0003 Imagine 128 series 2 4Mb VRAM
+ 105d 0004 Imagine 128 series 2 4Mb VRAM
+ 105d 0005 Imagine 128 series 2 4Mb VRAM
+ 105d 0006 Imagine 128 series 2 4Mb VRAM
+ 105d 0007 Imagine 128 series 2 4Mb VRAM
+ 105d 0008 Imagine 128 series 2e 4Mb DRAM
+ 105d 0009 Imagine 128 series 2e 4Mb DRAM
+ 105d 000a Imagine 128 series 2 8Mb VRAM
+ 105d 000b Imagine 128 series 2 8Mb H-VRAM
+ 11a4 000a Barco Metheus 5 Megapixel
+ 13cc 0000 Barco Metheus 5 Megapixel
+ 13cc 0004 Barco Metheus 5 Megapixel
+ 13cc 0005 Barco Metheus 5 Megapixel
+ 13cc 0006 Barco Metheus 5 Megapixel
+ 13cc 0008 Barco Metheus 5 Megapixel
+ 13cc 0009 Barco Metheus 5 Megapixel
+ 13cc 000a Barco Metheus 5 Megapixel
+ 13cc 000c Barco Metheus 5 Megapixel
+ 493d Imagine 128 T2R [Ticket to Ride]
+ 11a4 000a Barco Metheus 5 Megapixel, Dual Head
+ 11a4 000b Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0002 Barco Metheus 4 Megapixel, Dual Head
+ 13cc 0003 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0007 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0008 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 0009 Barco Metheus 5 Megapixel, Dual Head
+ 13cc 000a Barco Metheus 5 Megapixel, Dual Head
+ 5348 Revolution 4
+ 105d 0037 Revolution IV-FP AGP (For SGI 1600SW)
+ 11a4 0028 PVS5600M
+ 11a4 0038 PVS5600D
+105e Vtech Computers Ltd
+105f Infotronic America Inc
+1060 United Microelectronics [UMC]
+ 0001 UM82C881
+ 0002 UM82C886
+ 0101 UM8673F
+ 0881 UM8881
+ 0886 UM8886F
+ 0891 UM8891A
+ 1001 UM886A
+ 673a UM8886BF
+ 673b EIDE Master/DMA
+ 8710 UM8710
+ 886a UM8886A
+ 8881 UM8881F
+ 8886 UM8886F
+ 888a UM8886A
+ 8891 UM8891A
+ 9017 UM9017F
+ 9018 UM9018
+ 9026 UM9026
+ e881 UM8881N
+ e886 UM8886N
+ e88a UM8886N
+ e891 UM8891N
+1061 I.I.T.
+ 0001 AGX016
+ 0002 IIT3204/3501
+1062 Maspar Computer Corp
+1063 Ocean Office Automation
+1064 Alcatel
+ 1102 Dynamite 2840 (ADSL PCI modem)
+1065 Texas Microsystems
+1066 PicoPower Technology
+ 0000 PT80C826
+ 0001 PT86C521 [Vesuvius v1] Host Bridge
+ 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master
+ 0003 PT86C524 [Nile] PCI-to-PCI Bridge
+ 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge
+ 0005 National PC87550 System Controller
+ 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave
+1067 Mitsubishi Electric
+ 0301 AccelGraphics AccelECLIPSE
+ 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
+ 0308 Tornado 3000 [OEM Evans & Sutherland]
+ 1002 VG500 [VolumePro Volume Rendering Accelerator]
+1068 Diversified Technology
+1069 Mylex Corporation
+ 0001 DAC960P
+ 0002 DAC960PD
+ 0010 DAC960PG
+ 0020 DAC960LA
+ 0050 AcceleRAID 352/170/160 support Device
+ 1069 0050 AcceleRAID 352 support Device
+ 1069 0052 AcceleRAID 170 support Device
+ 1069 0054 AcceleRAID 160 support Device
+ b166 AcceleRAID 600/500/400/Sapphire support Device
+ 1014 0242 iSeries 2872 DASD IOA
+ 1014 0266 Dual Channel PCI-X U320 SCSI Adapter
+ 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter
+ 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter
+ 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter
+ 1069 0200 AcceleRAID 400, Single Channel, PCI-X, U320, SCSI RAID
+ 1069 0202 AcceleRAID Sapphire, Dual Channel, PCI-X, U320, SCSI RAID
+ 1069 0204 AcceleRAID 500, Dual Channel, Low-Profile, PCI-X, U320, SCSI RAID
+ 1069 0206 AcceleRAID 600, Dual Channel, PCI-X, U320, SCSI RAID
+ ba55 eXtremeRAID 1100 support Device
+ ba56 eXtremeRAID 2000/3000 support Device
+ 1069 0030 eXtremeRAID 3000 support Device
+ 1069 0040 eXtremeRAID 2000 support Device
+ ba57 eXtremeRAID 4000/5000 support Device
+ 1069 0072 eXtremeRAID 5000 support Device
+106a Aten Research Inc
+106b Apple Computer Inc.
+ 0001 Bandit PowerPC host bridge
+ 0002 Grand Central I/O
+ 0003 Control Video
+ 0004 PlanB Video-In
+ 0007 O'Hare I/O
+ 000c DOS on Mac
+ 000e Hydra Mac I/O
+ 0010 Heathrow Mac I/O
+ 0017 Paddington Mac I/O
+ 0018 UniNorth FireWire
+ 0019 KeyLargo USB
+ 001e UniNorth Internal PCI
+ 001f UniNorth PCI
+ 0020 UniNorth AGP
+ 0021 UniNorth GMAC (Sun GEM)
+ 0022 KeyLargo Mac I/O
+ 0024 UniNorth/Pangea GMAC (Sun GEM)
+ 0025 KeyLargo/Pangea Mac I/O
+ 0026 KeyLargo/Pangea USB
+ 0027 UniNorth/Pangea AGP
+ 0028 UniNorth/Pangea PCI
+ 0029 UniNorth/Pangea Internal PCI
+ 002d UniNorth 1.5 AGP
+ 002e UniNorth 1.5 PCI
+ 002f UniNorth 1.5 Internal PCI
+ 0030 UniNorth/Pangea FireWire
+ 0031 UniNorth 2 FireWire
+ 106b 5811 iBook G4 2004
+ 0032 UniNorth 2 GMAC (Sun GEM)
+ 0033 UniNorth 2 ATA/100
+ 0034 UniNorth 2 AGP
+ 0035 UniNorth 2 PCI
+ 0036 UniNorth 2 Internal PCI
+ 003b UniNorth/Intrepid ATA/100
+ 003e KeyLargo/Intrepid Mac I/O
+ 003f KeyLargo/Intrepid USB
+ 0040 K2 KeyLargo USB
+ 0041 K2 KeyLargo Mac/IO
+ 0042 K2 FireWire
+ 0043 K2 ATA/100
+ 0045 K2 HT-PCI Bridge
+ 0046 K2 HT-PCI Bridge
+ 0047 K2 HT-PCI Bridge
+ 0048 K2 HT-PCI Bridge
+ 0049 K2 HT-PCI Bridge
+ 004a CPC945 HT Bridge
+ 004b U3 AGP
+ 004c K2 GMAC (Sun GEM)
+ 004f Shasta Mac I/O
+ 0050 Shasta IDE
+ 0051 Shasta (Sun GEM)
+ 0052 Shasta Firewire
+ 0053 Shasta PCI Bridge
+ 0054 Shasta PCI Bridge
+ 0055 Shasta PCI Bridge
+ 0056 U4 PCIe
+ 0057 U3 HT Bridge
+ 0058 U3L AGP Bridge
+ 0059 U3H AGP Bridge
+ 005b CPC945 PCIe Bridge
+ 0066 Intrepid2 AGP Bridge
+ 0067 Intrepid2 PCI Bridge
+ 0068 Intrepid2 PCI Bridge
+ 0069 Intrepid2 ATA/100
+ 006a Intrepid2 Firewire
+ 006b Intrepid2 GMAC (Sun GEM)
+ 0074 U4 HT Bridge
+ 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)
+106c Hynix Semiconductor
+ 8801 Dual Pentium ISA/PCI Motherboard
+ 8802 PowerPC ISA/PCI Motherboard
+ 8803 Dual Window Graphics Accelerator
+ 8804 LAN Controller
+ 8805 100-BaseT LAN
+106d Sequent Computer Systems
+106e DFI, Inc
+106f City Gate Development Ltd
+1070 Daewoo Telecom Ltd
+1071 Mitac
+ 8160 Mitac 8060B Mobile Platform
+1072 GIT Co Ltd
+1073 Yamaha Corporation
+ 0001 3D GUI Accelerator
+ 0002 YGV615 [RPA3 3D-Graphics Controller]
+ 0003 YMF-740
+ 0004 YMF-724
+ 1073 0004 YMF724-Based PCI Audio Adapter
+ 0005 DS1 Audio
+ 1073 0005 DS-XG PCI Audio CODEC
+ 0006 DS1 Audio
+ 0008 DS1 Audio
+ 1073 0008 DS-XG PCI Audio CODEC
+ 000a DS1L Audio
+ 1073 0004 DS-XG PCI Audio CODEC
+ 1073 000a DS-XG PCI Audio CODEC
+ 8086 4d55 DS-XG PCI Audio CODEC [Intel MU440EX]
+ 000c YMF-740C [DS-1L Audio Controller]
+ 107a 000c DS-XG PCI Audio CODEC
+ 000d YMF-724F [DS-1 Audio Controller]
+ 1073 000d DS-XG PCI Audio CODEC
+ 0010 YMF-744B [DS-1S Audio Controller]
+ 1073 0006 DS-XG PCI Audio CODEC
+ 1073 0010 DS-XG PCI Audio CODEC
+ 0012 YMF-754 [DS-1E Audio Controller]
+ 1073 0012 DS-XG PCI Audio Codec
+ 0020 DS-1 Audio
+ 1000 SW1000XG [XG Factory]
+ 2000 DS2416 Digital Mixing Card
+ 1073 2000 DS2416 Digital Mixing Card
+1074 NexGen Microsystems
+ 4e78 82c500/1
+1075 Advanced Integrations Research
+1076 Chaintech Computer Co. Ltd
+1077 QLogic Corp.
+ 1016 ISP10160 Single Channel Ultra3 SCSI Processor
+ 1020 ISP1020 Fast-wide SCSI
+ 1022 ISP1022 Fast-wide SCSI
+ 1080 ISP1080 SCSI Host Adapter
+ 1216 ISP12160 Dual Channel Ultra3 SCSI Processor
+ 101e 8471 QLA12160 on AMI MegaRAID
+ 101e 8493 QLA12160 on AMI MegaRAID
+ 1240 ISP1240 SCSI Host Adapter
+ 1280 ISP1280 SCSI Host Adapter
+ 2020 ISP2020A Fast!SCSI Basic Adapter
+ 2100 QLA2100 64-bit Fibre Channel Adapter
+ 1077 0001 QLA2100 64-bit Fibre Channel Adapter
+ 2200 QLA2200 64-bit Fibre Channel Adapter
+ 1077 0002 QLA2200
+ 2300 QLA2300 64-bit Fibre Channel Adapter
+ 2312 ISP2312-based 2Gb Fibre Channel to PCI-X HBA
+ 103c 0131 2Gb Fibre Channel - Single port [A7538A]
+ 103c 12ba 2Gb Fibre Channel - Dual port [A6826A]
+ 2322 ISP2322-based 2Gb Fibre Channel to PCI-X HBA
+ 2422 ISP2422-based 4Gb Fibre Channel to PCI-X HBA
+ 103c 12d7 4Gb Fibre Channel [AB379A]
+ 103c 12dd 4Gb Fibre Channel [AB429A]
+ 2432 ISP2432-based 4Gb Fibre Channel to PCI Express HBA
+ 2532 ISP2532-based 8Gb Fibre Channel to PCI Express HBA
+ 3022 ISP4022-based Ethernet NIC
+ 3032 ISP4032-based Ethernet IPv6 NIC
+ 4010 ISP4010-based iSCSI TOE HBA
+ 4022 ISP4022-based iSCSI TOE HBA
+ 4032 ISP4032-based iSCSI TOE IPv6 HBA
+ 5432 SP232-based 4Gb Fibre Channel to PCI Express HBA
+ 6312 SP202-based 2Gb Fibre Channel to PCI-X HBA
+ 6322 SP212-based 2Gb Fibre Channel to PCI-X HBA
+ 7220 IBA7220 InfiniBand HCA
+ 7322 IBA7322 QDR InfiniBand HCA
+ 8000 10GbE Converged Network Adapter (TCP/IP Networking)
+ 8001 10GbE Converged Network Adapter (FCoE)
+ 8020 cLOM8214 1/10GbE Controller
+ 103c 3346 CN1000Q Dual Port Converged Network Adapter
+ 103c 3733 NC523SFP 10Gb 2-port Server Adapter
+ 1077 0203 8200 Series Single Port 10GbE Converged Network Adapter (TCP/IP Networking)
+ 1077 0207 8200 Series Dual Port 10GbE Converged Network Adapter (TCP/IP Networking)
+ 1077 020b 3200 Series Dual Port 10Gb Intelligent Ethernet Adapter
+ 1077 020c 3200 Series Quad Port 1Gb Intelligent Ethernet Adapter
+ 1077 020f 3200 Series Single Port 10Gb Intelligent Ethernet Adapter
+ 1077 0210 QME8242-k 10GbE Dual Port Mezzanine Card
+ 8021 8200 Series 10GbE Converged Network Adapter (FCoE)
+ 103c 3348 CN1000Q Dual Port Converged Network Adapter
+ 1077 0211 QME8242-k 10GbE Dual Port Mezzanine Card, FCoE
+ 8022 8200 Series 10GbE Converged Network Adapter (iSCSI)
+ 103c 3347 CN1000Q Dual Port Converged Network Adapter
+ 1077 0212 QME8242-k 10GbE Dual Port Mezzanine Card, iSCSI
+ 8432 ISP2432M-based 10GbE Converged Network Adapter (CNA)
+1078 Cyrix Corporation
+ 0000 5510 [Grappa]
+ 0001 PCI Master
+ 0002 5520 [Cognac]
+ 0100 5530 Legacy [Kahlua]
+ 0101 5530 SMI [Kahlua]
+ 0102 5530 IDE [Kahlua]
+ 0103 5530 Audio [Kahlua]
+ 0104 5530 Video [Kahlua]
+ 0400 ZFMicro PCI Bridge
+ 0401 ZFMicro Chipset SMI
+ 0402 ZFMicro Chipset IDE
+ 0403 ZFMicro Expansion Bus
+1079 I-Bus
+107a NetWorth
+107b Gateway 2000
+107c LG Electronics [Lucky Goldstar Co. Ltd]
+107d LeadTek Research Inc.
+ 0000 P86C850
+ 204d [GeForce 7800 GTX] Winfast PX7800 GTX TDH
+ 2134 WinFast 3D S320 II
+ 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo
+ 6609 Winfast TV 2000 XP RM
+ 6654 Conexant CX23883 [WinFast DTV1800 H]
+ 6f22 WinFast PxTV1200
+ 6f34 WinFast DVR3100 H
+107e Interphase Corporation
+ 0001 5515 ATM Adapter [Flipper]
+ 0002 100 VG AnyLan Controller
+ 0004 5526 Fibre Channel Host Adapter
+ 0005 x526 Fibre Channel Host Adapter
+ 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic]
+ 9003 5535-4P-BRI-ST
+ 9007 5535-4P-BRI-U
+ 9008 5535-1P-SR
+ 900c 5535-1P-SR-ST
+ 900e 5535-1P-SR-U
+ 9011 5535-1P-PRI
+ 9013 5535-2P-PRI
+ 9023 5536-4P-BRI-ST
+ 9027 5536-4P-BRI-U
+ 9031 5536-1P-PRI
+ 9033 5536-2P-PRI
+107f Data Technology Corporation
+ 0802 SL82C105
+1080 Contaq Microsystems
+ 0600 82C599
+ c691 Cypress CY82C691
+ c693 82c693
+1081 Supermac Technology
+ 0d47 Radius PCI to NuBUS Bridge
+1082 EFA Corporation of America
+1083 Forex Computer Corporation
+ 0001 FR710
+1084 Parador
+1085 Tulip Computers Int.B.V.
+1086 J. Bond Computer Systems
+1087 Cache Computer
+1088 Microcomputer Systems (M) Son
+1089 Data General Corporation
+# Formerly Bit3 Computer Corp.
+108a SBS Technologies
+ 0001 VME Bridge Model 617
+ 0010 VME Bridge Model 618
+ 0040 dataBLIZZARD
+ 3000 VME Bridge Model 2706
+108c Oakleigh Systems Inc.
+108d Olicom
+ 0001 Token-Ring 16/4 PCI Adapter (3136/3137)
+ 0002 16/4 Token Ring
+ 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter
+ 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter
+ 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card
+ 0006 OC-3530 RapidFire Token-Ring 100
+ 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter
+ 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter
+ 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter
+ 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter
+ 0011 OC-2315
+ 0012 OC-2325
+ 0013 OC-2183/2185
+ 0014 OC-2326
+ 0019 OC-2327/2250 10/100 Ethernet Adapter
+ 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter
+ 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter
+ 0021 OC-6151/6152 [RapidFire ATM 155]
+ 0022 ATM Adapter
+# formerly Sun Microsystems
+108e Oracle Corporation
+ 0001 EBUS
+ 1000 EBUS
+ 1001 Happy Meal 10/100 Ethernet [hme]
+ 1100 RIO EBUS
+ 108e 1100 RIO EBUS on Blade 100 motherboard
+# Correction
+ 1101 RIO 10/100 Ethernet [eri]
+ 108e 1101 RIO GEM on Blade 100 motherboard
+ 1102 RIO 1394
+ 108e 1102 RIO 1394 on Blade 100 motherboard
+ 1103 RIO USB
+ 108e 1103 RIO USB on Blade 100 motherboard
+ 1647 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 1648 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 16a7 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 16a8 Broadcom 570x 10/100/1000 Ethernet [bge]
+ 2bad GEM 10/100/1000 Ethernet [ge]
+ 5000 Simba Advanced PCI Bridge
+ 108e 5000 Netra AX1105-500
+ 5043 SunPCI Co-processor
+ 5ca0 Crypto Accelerator 6000 [mca]
+ 6300 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6301 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6302 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6303 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6310 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6311 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6312 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6313 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6320 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6323 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6330 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6331 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6332 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6333 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6340 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6343 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6350 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6353 Intel 21554 PCI-PCI bus bridge [db21554]
+ 6722 Intel 21554 PCI-PCI bus bridge [db21554]
+ 676e SunPCiIII
+ 7063 SunPCiII / SunPCiIIpro
+ 8000 Psycho PCI Bus Module
+ 8001 Schizo PCI Bus Module
+ 8002 Schizo+ PCI Bus Module
+ 80f0 PCIe switch [px]
+ 80f8 PCIe switch [px]
+ 9010 PCIe/PCI bridge switch [pxb_plx]
+ 9020 PCIe/PCI bridge switch [pxb_plx]
+ 9102 Davicom Fast Ethernet driver for Davicom DM9102A [dmfe]
+ a000 Psycho UPA-PCI Bus Module [pcipsy]
+ a001 Psycho UPA-PCI Bus Module [pcipsy]
+ 108e a001 Ultra IIe on Blade 100 motherboard
+ a801 Schizo Fireplane-PCI bus bridge module [pcisch]
+ aaaa Multithreaded Shared 10GbE Ethernet Network Controller
+ abba Cassini 10/100/1000
+ abcd Multithreaded 10-Gigabit Ethernet Network Controller
+ c416 Sun Fire System/System Controller Interface chip [sbbc]
+108f Systemsoft
+1090 Compro Computer Services, Inc.
+ 4610 PCI RTOM
+ 4620 GPIO HSD
+1091 Intergraph Corporation
+ 0020 3D graphics processor
+ 0021 3D graphics processor w/Texturing
+ 0040 3D graphics frame buffer
+ 0041 3D graphics frame buffer
+ 0060 Proprietary bus bridge
+ 00e4 Powerstorm 4D50T
+ 0720 Motion JPEG codec
+ 0780 Intense3D Wildcat 3410 (MSMT496)
+ 07a0 Sun Expert3D-Lite Graphics Accelerator
+ 1091 Sun Expert3D Graphics Accelerator
+1092 Diamond Multimedia Systems
+ 0028 Viper V770
+ 1092 4a00 Viper V770 32MB
+ 00a0 Speedstar Pro SE
+ 00a8 Speedstar 64
+ 0550 Viper V550
+ 08d4 Supra 2260 Modem
+ 094c SupraExpress 56i Pro
+ 1001 Video Crunch It 1001 capture card
+ 1092 Viper V330
+ 6120 Maximum DVD
+ 8810 Stealth SE
+ 8811 Stealth 64/SE
+ 8880 Stealth
+ 8881 Stealth
+ 88b0 Stealth 64
+ 88b1 Stealth 64
+ 88c0 Stealth 64
+ 88c1 Stealth 64
+ 88d0 Stealth 64
+ 88d1 Stealth 64
+ 88f0 Stealth 64
+ 88f1 Stealth 64
+ 9999 DMD-I0928-1 "Monster sound" sound chip
+1093 National Instruments
+ 0160 PCI-DIO-96
+ 0162 PCI-MIO-16XE-50
+ 1150 PCI-DIO-32HS High Speed Digital I/O Board
+ 1170 PCI-MIO-16XE-10
+ 1180 PCI-MIO-16E-1
+ 1190 PCI-MIO-16E-4
+ 11b0 PXI-6070E
+ 11c0 PXI-6040e
+ 11d0 PXI-6030e
+ 1270 PCI-6032e
+ 1310 PCI-6602
+ 1330 PCI-6031E
+ 1340 PCI-6033e
+ 1350 PCI-6071E
+ 1360 PXI-6602
+ 14e0 PCI-6110
+ 14f0 PCI-6111
+ 1580 PXI-6031E
+ 15b0 PXI-6071E
+ 1710 PXI-6509
+ 17d0 PCI-6503
+ 1870 PCI-6713
+ 1880 PCI-6711
+ 18b0 PCI-6052E
+ 18c0 PXI-6052E
+ 2410 PCI-6733
+ 2420 PXI-6733
+ 2430 PCI-6731
+ 2880 DAQCard-6601
+ 2890 PCI-6036E
+ 28c0 PCI-6014
+ 2a60 PCI-6023E
+ 2a70 PCI-6024E
+ 2a80 PCI-6025E
+ 2ab0 PXI-6025e
+ 2b80 PXI-6713
+ 2b90 PXI-6711
+ 2c60 PCI-6601
+ 2c70 PXI-6601
+ 2c80 PCI-6035E
+ 2ca0 PCI-6034E
+ 2cc0 PXI-6608
+ 2db0 PCI-6608
+ 70a9 PCI-6528 (Digital I/O at 60V)
+ 70aa PCI-6229
+ 70ab PCI-6259
+ 70ac PCI-6289
+ 70ae PXI-6220
+ 70af PCI-6221
+ 70b0 PCI-6220
+ 70b4 PCI-6250
+ 70b6 PCI-6280
+ 70b7 PCI-6254
+ 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ]
+ 70bc PCI-6284
+ 70bd PCI-6281
+ 70bf PXI-6281
+ 70c0 PCI-6143
+ 70f2 PCI-6224
+ 7144 PXI-5124 (12-bit 200 MS/s Digitizer)
+ 716c PCI-6225
+ 717d PCIE-6251
+ 717f PCIe-6259
+ 71bc PCI-6221 (37pin)
+ 71d0 PXI-6143
+ b001 IMAQ-PCI-1408
+ b011 IMAQ-PXI-1408
+ b021 IMAQ-PCI-1424
+ b031 IMAQ-PCI-1413
+ b041 IMAQ-PCI-1407
+ b051 IMAQ-PXI-1407
+ b061 IMAQ-PCI-1411
+ b071 IMAQ-PCI-1422
+ b081 IMAQ-PXI-1422
+ b091 IMAQ-PXI-1411
+ c801 PCI-GPIB
+ c831 PCI-GPIB bridge
+1094 First International Computers [FIC]
+# nee CMD Technology Inc
+1095 Silicon Image, Inc.
+ 0240 Adaptec AAR-1210SA SATA HostRAID Controller
+ 0640 PCI0640
+ 0643 PCI0643
+ 0646 PCI0646
+ 0647 PCI0647
+ 0648 PCI0648
+ 1043 8025 CUBX motherboard
+ 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller
+ 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller
+ 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller
+ 101e 0649 AMI MegaRAID IDE 100 Controller
+ 0650 PBC0650A
+ 0670 USB0670
+ 1095 0670 USB0670
+ 0673 USB0673
+ 0680 PCI0680 Ultra ATA-133 Host Controller
+ 1095 0680 SiI 0680 ATA/133 Controller
+ 1095 3680 Winic W-680 (Silicon Image 680 based)
+ 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller
+ 1095 3112 SiI 3112 SATALink Controller
+ 1095 6112 SiI 3112 SATARaid Controller
+ 9005 0250 SATAConnect 1205SA Host Controller
+ 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller
+ 1095 3114 SiI 3114 SATALink Controller
+ 1095 6114 SiI 3114 SATARaid Controller
+ 3124 SiI 3124 PCI-X Serial ATA Controller
+ 1095 3124 SiI 3124 PCI-X Serial ATA Controller
+ 3132 SiI 3132 Serial ATA Raid II Controller
+ 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller
+ 1095 3512 SiI 3512 SATALink Controller
+ 1095 6512 SiI 3512 SATARaid Controller
+ 3531 SiI 3531 [SATALink/SATARaid] Serial ATA Controller
+1096 Alacron
+1097 Appian Technology
+1098 Quantum Designs (H.K.) Ltd
+ 0001 QD-8500
+ 0002 QD-8580
+1099 Samsung Electronics Co., Ltd
+109a Packard Bell
+109b Gemlight Computer Ltd.
+109c Megachips Corporation
+109d Zida Technologies Ltd.
+109e Brooktree Corporation
+ 032e Bt878 Video Capture
+ 0350 Bt848 Video Capture
+ 0351 Bt849A Video capture
+ 0369 Bt878 Video Capture
+ 1002 0001 TV-Wonder
+ 1002 0003 TV-Wonder/VE
+ 036c Bt879(??) Video Capture
+ 13e9 0070 Win/TV (Video Section)
+ 036e Bt878 Video Capture
+ 0070 13eb WinTV Series
+ 0070 ff01 Viewcast Osprey 200
+ 0071 0101 DigiTV PCI
+ 107d 6606 WinFast TV 2000
+ 11bd 0012 PCTV pro (TV + FM stereo receiver)
+ 11bd 001c PCTV Sat (DBC receiver)
+ 127a 0001 Bt878 Mediastream Controller NTSC
+ 127a 0002 Bt878 Mediastream Controller PAL BG
+ 127a 0003 Bt878a Mediastream Controller PAL BG
+ 127a 0048 Bt878/832 Mediastream Controller
+ 144f 3000 MagicTView CPH060 - Video
+ 1461 0002 TV98 Series (TV/No FM/Remote)
+ 1461 0003 AverMedia UltraTV PCI 350
+ 1461 0004 AVerTV WDM Video Capture
+ 1461 0761 AverTV DVB-T
+ 1461 0771 AverMedia AVerTV DVB-T 771
+ 14f1 0001 Bt878 Mediastream Controller NTSC
+ 14f1 0002 Bt878 Mediastream Controller PAL BG
+ 14f1 0003 Bt878a Mediastream Controller PAL BG
+ 14f1 0048 Bt878/832 Mediastream Controller
+ 1822 0001 VisionPlus DVB card
+ 1851 1850 FlyVideo'98 - Video
+ 1851 1851 FlyVideo II
+ 1852 1852 FlyVideo'98 - Video (with FM Tuner)
+ 18ac d500 DViCO FusionHDTV5 Lite
+ 270f fc00 Digitop DTT-1000
+ bd11 1200 PCTV pro (TV + FM stereo receiver)
+ 036f Bt879 Video Capture
+ 127a 0044 Bt879 Video Capture NTSC
+ 127a 0122 Bt879 Video Capture PAL I
+ 127a 0144 Bt879 Video Capture NTSC
+ 127a 0222 Bt879 Video Capture PAL BG
+ 127a 0244 Bt879a Video Capture NTSC
+ 127a 0322 Bt879 Video Capture NTSC
+ 127a 0422 Bt879 Video Capture NTSC
+ 127a 1122 Bt879 Video Capture PAL I
+ 127a 1222 Bt879 Video Capture PAL BG
+ 127a 1322 Bt879 Video Capture NTSC
+ 127a 1522 Bt879a Video Capture PAL I
+ 127a 1622 Bt879a Video Capture PAL BG
+ 127a 1722 Bt879a Video Capture NTSC
+ 14f1 0044 Bt879 Video Capture NTSC
+ 14f1 0122 Bt879 Video Capture PAL I
+ 14f1 0144 Bt879 Video Capture NTSC
+ 14f1 0222 Bt879 Video Capture PAL BG
+ 14f1 0244 Bt879a Video Capture NTSC
+ 14f1 0322 Bt879 Video Capture NTSC
+ 14f1 0422 Bt879 Video Capture NTSC
+ 14f1 1122 Bt879 Video Capture PAL I
+ 14f1 1222 Bt879 Video Capture PAL BG
+ 14f1 1322 Bt879 Video Capture NTSC
+ 14f1 1522 Bt879a Video Capture PAL I
+ 14f1 1622 Bt879a Video Capture PAL BG
+ 14f1 1722 Bt879a Video Capture NTSC
+ 1851 1850 FlyVideo'98 - Video
+ 1851 1851 FlyVideo II
+ 1852 1852 FlyVideo'98 - Video (with FM Tuner)
+ 0370 Bt880 Video Capture
+ 1851 1850 FlyVideo'98
+ 1851 1851 FlyVideo'98 EZ - video
+ 1852 1852 FlyVideo'98 (with FM Tuner)
+ 0878 Bt878 Audio Capture
+ 0070 13eb WinTV Series
+ 0070 ff01 Viewcast Osprey 200
+ 0071 0101 DigiTV PCI
+ 1002 0001 TV-Wonder
+ 1002 0003 TV-Wonder/VE
+ 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section)
+ 11bd 001c PCTV Sat (DBC receiver)
+ 127a 0001 Bt878 Video Capture (Audio Section)
+ 127a 0002 Bt878 Video Capture (Audio Section)
+ 127a 0003 Bt878 Video Capture (Audio Section)
+ 127a 0048 Bt878 Video Capture (Audio Section)
+ 13e9 0070 Win/TV (Audio Section)
+ 144f 3000 MagicTView CPH060 - Audio
+ 1461 0002 Avermedia PCTV98 Audio Capture
+ 1461 0003 UltraTV PCI 350
+ 1461 0004 AVerTV WDM Audio Capture
+ 1461 0761 AVerTV DVB-T
+ 1461 0771 AverMedia AVerTV DVB-T 771
+ 14f1 0001 Bt878 Video Capture (Audio Section)
+ 14f1 0002 Bt878 Video Capture (Audio Section)
+ 14f1 0003 Bt878 Video Capture (Audio Section)
+ 14f1 0048 Bt878 Video Capture (Audio Section)
+ 1822 0001 VisionPlus DVB Card
+ 18ac d500 DViCO FusionHDTV5 Lite
+ 270f fc00 Digitop DTT-1000
+ bd11 1200 PCTV pro (TV + FM stereo receiver, audio section)
+ 0879 Bt879 Audio Capture
+ 127a 0044 Bt879 Video Capture (Audio Section)
+ 127a 0122 Bt879 Video Capture (Audio Section)
+ 127a 0144 Bt879 Video Capture (Audio Section)
+ 127a 0222 Bt879 Video Capture (Audio Section)
+ 127a 0244 Bt879 Video Capture (Audio Section)
+ 127a 0322 Bt879 Video Capture (Audio Section)
+ 127a 0422 Bt879 Video Capture (Audio Section)
+ 127a 1122 Bt879 Video Capture (Audio Section)
+ 127a 1222 Bt879 Video Capture (Audio Section)
+ 127a 1322 Bt879 Video Capture (Audio Section)
+ 127a 1522 Bt879 Video Capture (Audio Section)
+ 127a 1622 Bt879 Video Capture (Audio Section)
+ 127a 1722 Bt879 Video Capture (Audio Section)
+ 14f1 0044 Bt879 Video Capture (Audio Section)
+ 14f1 0122 Bt879 Video Capture (Audio Section)
+ 14f1 0144 Bt879 Video Capture (Audio Section)
+ 14f1 0222 Bt879 Video Capture (Audio Section)
+ 14f1 0244 Bt879 Video Capture (Audio Section)
+ 14f1 0322 Bt879 Video Capture (Audio Section)
+ 14f1 0422 Bt879 Video Capture (Audio Section)
+ 14f1 1122 Bt879 Video Capture (Audio Section)
+ 14f1 1222 Bt879 Video Capture (Audio Section)
+ 14f1 1322 Bt879 Video Capture (Audio Section)
+ 14f1 1522 Bt879 Video Capture (Audio Section)
+ 14f1 1622 Bt879 Video Capture (Audio Section)
+ 14f1 1722 Bt879 Video Capture (Audio Section)
+ 0880 Bt880 Audio Capture
+ 2115 BtV 2115 Mediastream controller
+ 2125 BtV 2125 Mediastream controller
+ 2164 BtV 2164
+ 2165 BtV 2165
+ 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC)
+ 8472 Bt8472
+ 8474 Bt8474
+109f Trigem Computer Inc.
+10a0 Meidensha Corporation
+10a1 Juko Electronics Ind. Co. Ltd
+10a2 Quantum Corporation
+10a3 Everex Systems Inc
+10a4 Globe Manufacturing Sales
+10a5 Smart Link Ltd.
+ 3052 SmartPCI562 56K Modem
+ 5449 SmartPCI561 modem
+10a6 Informtech Industrial Ltd.
+10a7 Benchmarq Microelectronics
+10a8 Sierra Semiconductor
+ 0000 STB Horizon 64
+10a9 Silicon Graphics Intl. Corp.
+ 0001 Crosstalk to PCI Bridge
+ 0002 Linc I/O controller
+ 0003 IOC3 I/O controller
+ 0004 O2 MACE
+ 0005 RAD Audio
+ 0006 HPCEX
+ 0007 RPCEX
+ 0008 DiVO VIP
+ 0009 AceNIC Gigabit Ethernet
+ 10a9 8002 AceNIC Gigabit Ethernet
+ 0010 AMP Video I/O
+ 0011 GRIP
+ 0012 SGH PSHAC GSN
+ 0208 SSIM1 SAS Adapter
+ 1001 Magic Carpet
+ 1002 Lithium
+ 1003 Dual JPEG 1
+ 1004 Dual JPEG 2
+ 1005 Dual JPEG 3
+ 1006 Dual JPEG 4
+ 1007 Dual JPEG 5
+ 1008 Cesium
+ 100a IOC4 I/O controller
+ 1504 SSIM1 Fibre Channel Adapter
+ 2001 Fibre Channel
+ 2002 ASDE
+ 4001 TIO-CE PCI Express Bridge
+ 4002 TIO-CE PCI Express Port
+ 8001 O2 1394
+ 8002 G-net NT
+10aa ACC Microelectronics
+ 0000 ACCM 2188
+ 2051 2051 CPU bridge
+ 5842 2051 ISA bridge
+10ab Digicom
+10ac Honeywell IAC
+10ad Symphony Labs
+ 0001 W83769F
+ 0003 SL82C103
+ 0005 SL82C105
+ 0103 SL82c103
+ 0105 SL82c105
+ 0565 W83C553F/W83C554F
+10ae Cornerstone Technology
+10af Micro Computer Systems Inc
+10b0 CardExpert Technology
+10b1 Cabletron Systems Inc
+10b2 Raytheon Company
+10b3 Databook Inc
+ 3106 DB87144
+ b106 DB87144
+10b4 STB Systems Inc
+ 1b1d Velocity 128 3D
+ 10b4 237e Velocity 4400
+10b5 PLX Technology, Inc.
+ 0001 i960 PCI bus interface
+ 1024 Acromag, Inc. IndustryPack Carrier Card
+ 1042 Brandywine / jxi2, Inc. - PMC-SyncClock32, IRIG A & B, Nasa 36
+ 106a Dual OX16C952 4 port serial adapter [Megawolf Romulus/4]
+ 1076 VScom 800 8 port serial adaptor
+ 1077 VScom 400 4 port serial adaptor
+ 1078 VScom 210 2 port serial and 1 port parallel adaptor
+ 1103 VScom 200 2 port serial adaptor
+ 1146 VScom 010 1 port parallel adaptor
+ 1147 VScom 020 2 port parallel adaptor
+ 2540 IXXAT CAN-Interface PC-I 04/PCI
+ 2724 Thales PCSM Security Card
+ 3376 Cosateq 4 Port CAN Card
+ 6140 PCI6140 32-bit 33MHz PCI-to-PCI Bridge
+ 6150 PCI6150 32-bit 33MHz PCI-to-PCI Bridge
+ 6152 PCI6152 32-bit 66MHz PCI-to-PCI Bridge
+ 6154 PCI6154 64-bit 66MHz PCI-to-PCI Bridge
+ 6254 PCI6254 64-bit 66MHz PCI-to-PCI Bridge
+ 6466 PCI6466 64-bit 66MHz PCI-to-PCI Bridge
+ 6520 PCI6520 64-bit 133MHz PCI-X-to-PCI-X Bridge
+ 6540 PCI6540 64-bit 133MHz PCI-X-to-PCI-X Bridge
+ 1775 1100 CR11 Single Board Computer
+ 4c53 10e0 PSL09 PrPMC
+ 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side)
+ 1775 1100 CR11 Single Board Computer
+ 4c53 10e0 PSL09 PrPMC
+ 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side)
+ 1775 1100 CR11 Single Board Computer
+ 4c53 10e0 PSL09 PrPMC
+ 8111 PEX 8111 PCI Express-to-PCI Bridge
+ 8112 PEX8112 x1 Lane PCI Express-to-PCI Bridge
+ 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge
+ 8311 PEX8311 x1 Lane PCI Express-to-Generic Local Bus Bridge
+ 8505 PEX 8505 5-lane, 5-port PCI Express Switch
+ 8508 PEX 8508 8-lane, 5-port PCI Express Switch
+ 8509 PEX 8509 8-lane, 8-port PCI Express Switch
+ 8512 PEX 8512 12-lane, 5-port PCI Express Switch
+ 8516 PEX 8516 Versatile PCI Express Switch
+ 8517 PEX 8517 16-lane, 5-port PCI Express Switch
+ 8518 PEX 8518 16-lane, 5-port PCI Express Switch
+ 8524 PEX 8524 24-lane, 6-port PCI Express Switch
+ 8525 PEX 8525 24-lane, 5-port PCI Express Switch
+ 8532 PEX 8532 Versatile PCI Express Switch
+ 8533 PEX 8533 32-lane, 6-port PCI Express Switch
+ 8547 PEX 8547 48-lane, 3-port PCI Express Switch
+ 8548 PEX 8548 48-lane, 9-port PCI Express Switch
+ 8604 PEX 8604 4-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8606 PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8608 PEX 8608 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8609 PEX 8609 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+ 8612 PEX 8612 12-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8613 PEX 8613 12-lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8614 PEX 8614 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8615 PEX 8615 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+ 8616 PEX 8616 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8617 PEX 8617 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch with P2P
+ 8618 PEX 8618 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8619 PEX 8619 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA
+ 8624 PEX 8624 24-lane, 6-Port PCI Express Gen 2 (5.0 GT/s) Switch [ExpressLane]
+ 13a3 1845 DX1845 Acceleration Card
+ 8625 PEX 8625 24-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8632 PEX 8632 32-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8636 PEX 8636 36-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8647 PEX 8647 48-Lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8648 PEX 8648 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8649 PEX 8649 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8664 PEX 8664 64-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch
+ 8680 PEX 8680 80-lane, 20-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
+ 8696 PEX 8696 96-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch
+ 9016 PLX 9016 8-port serial controller
+ 9030 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge
+ 10b5 2695 Hilscher CIF50-PB Profibus Master Board
+ 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board
+ 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board
+ 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board
+ 10b5 2977 IXXAT iPC-I XC16/PCI CAN Board
+ 10b5 2978 SH ARC-PCIu/SH ARC-PCI104/SH ARC-PCIe SOHARD ARCNET card
+ 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board
+ 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board
+ 10b5 3463 Alpermann+Velte PCL PCI D (v2) (3V/5V): Timecode Reader Board
+ 12fe 0111 CPCI-ASIO4 (ESD 4-port Serial Interface Board)
+ 1369 9c01 VX222v2
+ 1369 9d01 VX222-Mic
+ 1369 9d02 VX222-Mic
+ 1369 9e01 PCX924v2
+ 1369 9f01 PCX924-Mic
+ 1369 9f02 PCX924-Mic
+ 1369 a001 PCX22v2
+ 1369 a701 LCM220v2
+ 1369 a801 LCM200
+ 1397 3136 4xS0-ISDN PCI Adapter
+ 1397 3137 S2M-E1-ISDN PCI Adapter
+ 1518 0200 Kontron ThinkIO-C
+ 15ed 1002 MCCS 8-port Serial Hot Swap
+ 15ed 1003 MCCS 16-port Serial Hot Swap
+# MIL-STD-1553B Board
+ e1c5 0001 TE1-PCI
+ e1c5 0005 TA1-PCI
+ e1c5 0006 TA1-PCI4
+ 9036 9036
+ 9050 PCI <-> IOBus Bridge
+ 10b5 1067 IXXAT CAN i165
+ 10b5 114e Wasco WITIO PCI168extended
+ 10b5 1169 Wasco OPTOIO32standard 32 digital in, 32 digital out
+ 10b5 1172 IK220 (Heidenhain)
+ 10b5 2036 SatPak GPS
+ 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board
+ 10b5 2273 SH ARC-PCI SOHARD ARCNET card
+ 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board
+ 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board
+ 10b5 3196 Goramo PLX200SYN sync serial card
+ 10b5 9050 PCI-I04 PCI Passive PC/CAN Interface
+ 1369 8901 PCX11+ PCI
+ 1369 8f01 VX222
+ 1369 9401 PCX924
+ 1369 9501 PCX22
+ 1498 0362 TPMC866 8 Channel Serial Card
+ 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem
+ 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem
+ 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem
+ 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem
+ 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem
+ 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem
+ 15ed 1000 Macrolink MCCS 8-port Serial
+ 15ed 1001 Macrolink MCCS 16-port Serial
+ 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap
+ 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap
+ 5654 2036 OpenSwitch 6 Telephony card
+ 5654 3132 OpenSwitch 12 Telephony card
+ 5654 5634 OpenLine4 Telephony Card
+ d531 c002 PCIntelliCAN 2xSJA1000 CAN bus
+ d84d 4006 EX-4006 1P
+ d84d 4008 EX-4008 1P EPP/ECP
+ d84d 4014 EX-4014 2P
+ d84d 4018 EX-4018 3P EPP/ECP
+ d84d 4025 EX-4025 1S(16C550) RS-232
+ d84d 4027 EX-4027 1S(16C650) RS-232
+ d84d 4028 EX-4028 1S(16C850) RS-232
+ d84d 4036 EX-4036 2S(16C650) RS-232
+ d84d 4037 EX-4037 2S(16C650) RS-232
+ d84d 4038 EX-4038 2S(16C850) RS-232
+ d84d 4052 EX-4052 1S(16C550) RS-422/485
+ d84d 4053 EX-4053 2S(16C550) RS-422/485
+ d84d 4055 EX-4055 4S(16C550) RS-232
+ d84d 4058 EX-4055 4S(16C650) RS-232
+ d84d 4065 EX-4065 8S(16C550) RS-232
+ d84d 4068 EX-4068 8S(16C650) RS-232
+ d84d 4078 EX-4078 2S(16C552) RS-232+1P
+ 9052 PCI9052 PCI <-> IOBus Bridge
+ 9054 PCI9054 32-bit 33MHz PCI <-> IOBus Bridge
+ 10b5 2455 Wessex Techology PHIL-PCI
+ 10b5 2696 Innes Corp AM Radcap card
+ 10b5 2717 Innes Corp Auricon card
+ 10b5 2844 Innes Corp TVS Encoder card
+ 12c7 4001 Intel Dialogic DM/V960-4T1 PCI
+ 12d9 0002 PCI Prosody Card rev 1.5
+ 14b4 d100 Dektec DTA-100
+ 14b4 d114 Dektec DTA-120
+ 16df 0011 PIKA PrimeNet MM PCI
+ 16df 0012 PIKA PrimeNet MM cPCI 8
+ 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling)
+ 16df 0014 PIKA PrimeNet MM cPCI 4
+ 16df 0015 PIKA Daytona MM
+ 16df 0016 PIKA InLine MM
+ 9056 PCI9056 32-bit 66MHz PCI <-> IOBus Bridge
+ 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1
+ 10b5 3268 IXXAT iPC-I XC16/PCIe CAN Board
+ 10b5 3352 Alpermann+Velte PCL PCIe HD: Timecode Reader Board
+ 10b5 3353 Alpermann+Velte PCL PCIe D: Timecode Reader Board
+ 10b5 3354 Alpermann+Velte PCL PCIe LV: Timecode Reader Board
+ 10b5 3355 Alpermann+Velte PCL PCIe L: Timecode Reader Board
+ 10b5 3415 Alpermann+Velte PCIe TS: Time Synchronisation Board
+ 1369 c001 LX6464ES
+ 1369 c201 LX1616ES
+ 14b4 d10a DekTec DTA-110T
+ 14b4 d140 Dektec DTA-140
+ 1a0e 006f Dektec DTA-111
+ 9060 PCI9060 32-bit 33MHz PCI <-> IOBus Bridge
+ 906d 9060SD
+ 125c 0640 Aries 16000P
+ 906e 9060ES
+ 9080 PCI9080 32-bit; 33MHz PCI <-> IOBus Bridge
+ 103c 10eb (Agilent) E2777B 83K Series Optical Communication Interface
+ 103c 10ec (Agilent) E6978-66442 PCI CIC
+ 10b5 1123 Sectra KK631 encryption board
+ 10b5 9080 9080 [real subsystem ID not set]
+ 12d9 0002 PCI Prosody Card
+ 12df 4422 4422PCI ["Do-All" Telemetry Data Aquisition System]
+ 1369 9601 PCX822np
+ 1369 a102 PCX822v2
+ 1369 a201 PCX442
+ 1369 a301 LCM440v2
+ 1369 a401 VX822
+ 1369 a402 VX822v2
+ 1369 a901 LCM420
+ 1369 aa01 VX820v2
+ 1517 000b ECSG-1R3ADC-PMC Clock synthesizer
+ 9656 PCI9656 PCI <-> IOBus Bridge
+ 1517 000f ECDR-GC314-PMC Receiver
+ 1885 0700 Tsunami FPGA PMC with Altera Stratix S40
+ 1885 0701 Tsunami FPGA PMC with Altera Stratix S30
+ a100 Blackmagic Design DeckLink
+ bb04 B&B 3PCIOSD1A Isolated PCI Serial
+ c001 CronyxOmega-PCI (8-port RS232)
+10b6 Madge Networks
+ 0001 Smart 16/4 PCI Ringnode
+ 0002 Smart 16/4 PCI Ringnode Mk2
+ 10b6 0002 Smart 16/4 PCI Ringnode Mk2
+ 10b6 0006 16/4 CardBus Adapter
+ 0003 Smart 16/4 PCI Ringnode Mk3
+ 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL
+ 10b6 0003 Smart 16/4 PCI Ringnode Mk3
+ 10b6 0007 Presto PCI Plus Adapter
+ 0004 Smart 16/4 PCI Ringnode Mk1
+ 0006 16/4 Cardbus Adapter
+ 10b6 0006 16/4 CardBus Adapter
+ 0007 Presto PCI Adapter
+ 10b6 0007 Presto PCI
+ 0009 Smart 100/16/4 PCI-HS Ringnode
+ 10b6 0009 Smart 100/16/4 PCI-HS Ringnode
+ 000a Smart 100/16/4 PCI Ringnode
+ 10b6 000a Smart 100/16/4 PCI Ringnode
+ 000b 16/4 CardBus Adapter Mk2
+ 10b6 0008 16/4 CardBus Adapter Mk2
+ 10b6 000b 16/4 Cardbus Adapter Mk2
+ 000c RapidFire 3140V2 16/4 TR Adapter
+ 10b6 000c RapidFire 3140V2 16/4 TR Adapter
+ 1000 Collage 25/155 ATM Client Adapter
+ 1001 Collage 155 ATM Server Adapter
+10b7 3Com Corporation
+ 0001 3c985 1000BaseSX (SX/TX)
+ 0013 AR5212 802.11abg NIC (3CRDAG675)
+ 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter
+ 0910 3C910-A01
+ 1006 MINI PCI type 3B Data Fax Modem
+ 1007 Mini PCI 56k Winmodem
+ 10b7 615b Mini PCI 56K Modem
+ 10b7 615c Mini PCI 56K Modem
+ 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]
+ 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]
+ 1700 3c940 10/100/1000Base-T [Marvell]
+ 1043 80eb A7V600/P4P800/K8V motherboard
+ 10b7 0010 3C940 Gigabit LOM Ethernet Adapter
+ 10b7 0020 3C941 Gigabit LOM Ethernet Adapter
+ 147b 1407 KV8-MAX3 motherboard
+ 3390 3c339 TokenLink Velocity
+ 3590 3c359 TokenLink Velocity XL
+ 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B)
+ 4500 3c450 HomePNA [Tornado]
+ 5055 3c555 Laptop Hurricane
+ 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang]
+ 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card
+ 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone]
+ 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card
+ 5257 3cCFE575CT CardBus [Cyclone]
+ 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet
+ 5900 3c590 10BaseT [Vortex]
+ 5920 3c592 EISA 10mbps Demon/Vortex
+ 5950 3c595 100BaseTX [Vortex]
+ 5951 3c595 100BaseT4 [Vortex]
+ 5952 3c595 100Base-MII [Vortex]
+ 5970 3c597 EISA Fast Demon/Vortex
+ 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang]
+ 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card
+ 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]
+ 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter]
+ 6055 3c556 Hurricane CardBus [Cyclone]
+ 6056 3c556B CardBus [Tornado]
+ 10b7 6556 10/100 Mini PCI Ethernet Adapter
+ 6560 3cCFE656 CardBus [Cyclone]
+ 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus
+ 6561 3cCFEM656 10/100 LAN+56K Modem CardBus
+ 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus
+ 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone]
+ 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus
+ 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus
+ 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus
+ 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado]
+ 7646 3cSOHO100-TX Hurricane
+ 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect]
+ 7940 3c803 FDDILink UTP Controller
+ 7980 3c804 FDDILink SAS Controller
+ 7990 3c805 FDDILink DAS Controller
+ 80eb 3c940B 10/100/1000Base-T
+ 8811 Token ring
+ 9000 3c900 10BaseT [Boomerang]
+ 9001 3c900 10Mbps Combo [Boomerang]
+ 9004 3c900B-TPO Etherlink XL [Cyclone]
+ 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb
+ 9005 3c900B-Combo Etherlink XL [Cyclone]
+ 10b7 9005 3C900B-Combo Etherlink XL Combo
+ 9006 3c900B-TPC Etherlink XL [Cyclone]
+ 900a 3c900B-FL 10base-FL [Cyclone]
+ 9050 3c905 100BaseTX [Boomerang]
+ 9051 3c905 100BaseT4 [Boomerang]
+ 9054 3C905B-TX Fast Etherlink XL PCI
+ 10b7 9054 3C905B-TX Fast Etherlink XL PCI
+ 9055 3c905B 100BaseTX [Cyclone]
+ 1028 0080 3C905B Fast Etherlink XL 10/100
+ 1028 0081 3C905B Fast Etherlink XL 10/100
+ 1028 0082 3C905B Fast Etherlink XL 10/100
+ 1028 0083 3C905B Fast Etherlink XL 10/100
+ 1028 0084 3C905B Fast Etherlink XL 10/100
+ 1028 0085 3C905B Fast Etherlink XL 10/100
+ 1028 0086 3C905B Fast Etherlink XL 10/100
+ 1028 0087 3C905B Fast Etherlink XL 10/100
+ 1028 0088 3C905B Fast Etherlink XL 10/100
+ 1028 0089 3C905B Fast Etherlink XL 10/100
+ 1028 0090 3C905B Fast Etherlink XL 10/100
+ 1028 0091 3C905B Fast Etherlink XL 10/100
+ 1028 0092 3C905B Fast Etherlink XL 10/100
+ 1028 0093 3C905B Fast Etherlink XL 10/100
+ 1028 0094 3C905B Fast Etherlink XL 10/100
+ 1028 0095 3C905B Fast Etherlink XL 10/100
+ 1028 0096 3C905B Fast Etherlink XL 10/100
+ 1028 0097 3C905B Fast Etherlink XL 10/100
+ 1028 0098 3C905B Fast Etherlink XL 10/100
+ 1028 0099 3C905B Fast Etherlink XL 10/100
+ 10b7 9055 3C905B Fast Etherlink XL 10/100
+ 9056 3c905B-T4 Fast EtherLink XL [Cyclone]
+ 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone]
+ 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone]
+ 9200 3c905C-TX/TX-M [Tornado]
+ 1028 0095 3C920 Integrated Fast Ethernet Controller
+ 1028 0097 3C920 Integrated Fast Ethernet Controller
+ 1028 00b4 OptiPlex GX110
+ 1028 00d8 Precision 530
+ 1028 00fe Optiplex GX240
+ 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640]
+ 10b7 1000 3C905CX-TX/TX-M Fast Etherlink for PC Management NIC
+ 10b7 7000 10/100 Mini PCI Ethernet Adapter
+ 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller)
+ 144d c005 X10 Laptop
+ 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado]
+ 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller
+ 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller
+ 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller
+ 9300 3CSOHO100B-TX 910-A01 [tulip]
+ 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone]
+ 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter
+ 9805 3c980-C 10/100baseTX NIC [Python-T]
+ 10b7 1201 EtherLink Server 10/100 Dual Port A
+ 10b7 1202 EtherLink Server 10/100 Dual Port B
+ 10b7 9805 3c980 10/100baseTX NIC [Python-T]
+ 10f1 2462 Thunder K7 S2462
+ 9900 3C990-TX [Typhoon]
+ 9902 3CR990-TX-95 [Typhoon 56-bit]
+ 9903 3CR990-TX-97 [Typhoon 168-bit]
+ 9904 3C990B-TX-M/3C990BSVR [Typhoon2]
+ 10b7 1000 3CR990B-TX-M [Typhoon2]
+ 10b7 2000 3CR990BSVR [Typhoon2 Server]
+ 9905 3CR990-FX-95/97/95 [Typhon Fiber]
+ 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit]
+ 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit]
+ 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit]
+ 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit]
+ 9908 3CR990SVR95 [Typhoon Server 56-bit]
+ 9909 3CR990SVR97 [Typhoon Server 168-bit]
+ 990a 3C990SVR [Typhoon Server]
+ 990b 3C990SVR [Typhoon Server]
+10b8 Standard Microsystems Corp [SMC]
+ 0005 83c170 EPIC/100 Fast Ethernet Adapter
+ 1055 e000 LANEPIC 10/100 [EVB171Q-PCI]
+ 1055 e002 LANEPIC 10/100 [EVB171G-PCI]
+ 10b8 a011 EtherPower II 10/100
+ 10b8 a014 EtherPower II 10/100
+ 10b8 a015 EtherPower II 10/100
+ 10b8 a016 EtherPower II 10/100
+ 10b8 a017 EtherPower II 10/100
+ 0006 83c175 EPIC/100 Fast Ethernet Adapter
+ 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter
+ 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter
+ 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter
+ 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter
+ 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter
+ 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter
+ 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter
+ 1000 FDC 37c665
+ 1001 FDC 37C922
+ a011 83C170QF
+ b106 SMC34C90
+10b9 ALi Corporation
+ 0101 CMI8338/C3DX PCI Audio Device
+ 0111 C-Media CMI8738/C3DX Audio Device (OEM)
+ 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM)
+ 0780 Multi-IO Card
+ 0782 Multi-IO Card
+ 1435 M1435
+ 1445 M1445
+ 1449 M1449
+ 1451 M1451
+ 1461 M1461
+ 1489 M1489
+ 1511 M1511 [Aladdin]
+ 1512 M1512 [Aladdin]
+ 1513 M1513 [Aladdin]
+ 1521 M1521 [Aladdin III]
+ 10b9 1521 ALI M1521 Aladdin III CPU Bridge
+ 1523 M1523
+ 10b9 1523 ALI M1523 ISA Bridge
+ 1531 M1531 [Aladdin IV]
+ 1533 M1533/M1535/M1543 PCI to ISA Bridge [Aladdin IV/V/V+]
+ 1014 053b ThinkPad R40e
+ 10b9 1533 ALi M1533 Aladdin IV/V ISA Bridge
+ 1541 M1541
+ 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller
+ 1543 M1543
+ 1563 M1563 HyperTransport South Bridge
+ 10b9 1563 ASRock 939Dual-SATA2 Motherboard
+ 1849 1563 ASRock 939Dual-SATA2 Motherboard
+ 1573 PCI to LPC Controller
+ 1575 M1575 South Bridge
+ 1621 M1621
+ 1631 ALI M1631 PCI North Bridge Aladdin Pro III
+ 1632 M1632M Northbridge+Trident
+ 1641 ALI M1641 PCI North Bridge Aladdin Pro IV
+ 1644 M1644/M1644T Northbridge+Trident
+ 1646 M1646 Northbridge+Trident
+ 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]
+ 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]
+ 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR]
+ 1672 M1672 Northbridge [CyberALADDiN-P4]
+ 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR]
+ 1687 M1687 K8 Northbridge [AGP8X and HyperTransport]
+ 1689 M1689 K8 Northbridge [Super K8 Single Chip]
+ 1695 M1695 K8 Northbridge [PCI Express and HyperTransport]
+ 1697 M1697 HTT Host Bridge
+ 3141 M3141
+ 3143 M3143
+ 3145 M3145
+ 3147 M3147
+ 3149 M3149
+ 3151 M3151
+ 3307 M3307
+ 3309 M3309
+ 3323 M3325 Video/Audio Decoder
+ 5212 M4803
+ 5215 MS4803
+ 5217 M5217H
+ 5219 M5219
+ 5225 M5225
+ 5228 M5228 ALi ATA/RAID Controller
+ 5229 M5229 IDE
+ 1014 050f ThinkPad R30
+ 1014 053d ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin IDE
+ 103c 0025 XE4500 Notebook
+ 1043 8053 A7A266 Motherboard IDE
+ 1849 5229 ASRock 939Dual-SATA2 Motherboard IDE (PATA)
+ 5235 M5225
+ 5237 USB 1.1 Controller
+ 1014 0540 ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin USB
+ 103c 0025 XE4500 Notebook
+ 104d 810f VAIO PCG-U1 USB/OHCI Revision 1.0
+ 10b9 5237 ASRock 939Dual-SATA2 Motherboard
+ 1849 5237 ASRock 939Dual-SATA2 Motherboard
+ 5239 USB 2.0 Controller
+ 10b9 5239 ASRock 939Dual-SATA2 Motherboard
+ 1849 5239 ASRock 939Dual-SATA2 Motherboard
+ 5243 M1541 PCI to AGP Controller
+ 5246 AGP8X Controller
+ 5247 PCI to AGP Controller
+ 5249 M5249 HTT to PCI Bridge
+ 524b PCI Express Root Port
+ 524c PCI Express Root Port
+ 524d PCI Express Root Port
+ 524e PCI Express Root Port
+ 5251 M5251 P1394 OHCI 1.0 Controller
+ 5253 M5253 P1394 OHCI 1.1 Controller
+ 5261 M5261 Ethernet Controller
+ 5263 ULi 1689,1573 integrated ethernet.
+ 5281 ALi M5281 Serial ATA / RAID Host Controller
+ 5287 ULi 5287 SATA
+ 5288 ULi M5288 SATA
+ 1043 8056 A8R-MVP Mainboard
+ 5289 ULi 5289 SATA
+ 5450 Lucent Technologies Soft Modem AMR
+ 5451 M5451 PCI AC-Link Controller Audio Device
+ 1014 0506 ThinkPad R30
+ 1014 053e ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin Audio
+ 103c 0025 XE4500 Notebook
+ 5453 M5453 PCI AC-Link Controller Modem Device
+ 5455 M5455 PCI AC-Link Controller Audio Device
+ 10b9 5455 ASRock 939Dual-SATA2 Motherboard
+ 1849 0850 ASRock 939Dual-SATA2 Motherboard
+ 5457 M5457 AC'97 Modem Controller
+ 1014 0535 ThinkPad R40e
+ 103c 0024 Pavilion ze4400 builtin Modem Device
+ 103c 0025 XE4500 Notebook
+ 5459 SmartLink SmartPCI561 56K Modem
+ 545a SmartLink SmartPCI563 56K Modem
+ 5461 High Definition Audio/AC'97 Host Controller
+ 5471 M5471 Memory Stick Controller
+ 5473 M5473 SD-MMC Controller
+ 7101 M7101 Power Management Controller [PMU]
+ 1014 0510 ThinkPad R30
+ 1014 053c ThinkPad R40e
+ 103c 0024 Pavilion ze4400
+ 103c 0025 XE4500 Notebook
+ 1849 7101 ASRock 939Dual-SATA2 Motherboard
+10ba Mitsubishi Electric Corp.
+ 0301 AccelGraphics AccelECLIPSE
+ 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
+ 0308 Tornado 3000 [OEM Evans & Sutherland]
+ 10dd 0024 Tornado 3000
+ 1002 VG500 [VolumePro Volume Rendering Accelerator]
+10bb Dapha Electronics Corporation
+10bc Advanced Logic Research
+10bd Surecom Technology
+ 0e34 NE-34
+10be Tseng Labs International Co.
+10bf Most Inc
+10c0 Boca Research Inc.
+10c1 ICM Co., Ltd.
+10c2 Auspex Systems Inc.
+10c3 Samsung Semiconductors, Inc.
+ 1100 Smartether100 SC1100 LAN Adapter (i82557B)
+10c4 Award Software International Inc.
+10c5 Xerox Corporation
+10c6 Rambus Inc.
+10c7 Media Vision
+10c8 Neomagic Corporation
+ 0001 NM2070 [MagicGraph 128]
+ 0002 NM2090 [MagicGraph 128V]
+ 0003 NM2093 [MagicGraph 128ZV]
+ 0004 NM2160 [MagicGraph 128XD]
+ 1014 00ba MagicGraph 128XD
+ 1025 1007 MagicGraph 128XD
+ 1028 0074 MagicGraph 128XD
+ 1028 0075 MagicGraph 128XD
+ 1028 007d MagicGraph 128XD
+ 1028 007e MagicGraph 128XD
+ 1033 802f MagicGraph 128XD
+ 104d 801b MagicGraph 128XD
+ 104d 802f MagicGraph 128XD
+ 104d 830b MagicGraph 128XD
+ 10ba 0e00 MagicGraph 128XD
+ 10c8 0004 MagicGraph 128XD
+ 10cf 1029 MagicGraph 128XD
+ 10f7 8308 MagicGraph 128XD
+ 10f7 8309 MagicGraph 128XD
+ 10f7 830b MagicGraph 128XD
+ 10f7 830d MagicGraph 128XD
+ 10f7 8312 MagicGraph 128XD
+ 0005 NM2200 [MagicGraph 256AV]
+ 1014 00dd ThinkPad 570
+ 1028 0088 Latitude CPi A
+ 0006 NM2360 [MagicMedia 256ZX]
+ 1014 0152 ThinkPad 600X
+ 0016 NM2380 [MagicMedia 256XL+]
+ 10c8 0016 MagicMedia 256XL+
+ 0025 NM2230 [MagicGraph 256AV+]
+ 0083 NM2093 [MagicGraph 128ZV+]
+ 8005 NM2200 [MagicMedia 256AV Audio]
+ 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery
+ 0e11 b126 MagicMedia 256AV Audio Device on Durango
+ 1014 00dd ThinkPad 390/i1720/i1721
+ 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720
+ 1028 0088 Latitude CPi A
+ 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron
+ 103c 0007 MagicMedia 256AV Audio Device on Voyager II
+ 103c 0008 MagicMedia 256AV Audio Device on Voyager III
+ 103c 000d MagicMedia 256AV Audio Device on Omnibook 900
+ 10c8 8005 MagicMedia 256AV Audio Device on FireAnt
+ 110a 8005 MagicMedia 256AV Audio Device
+ 14c0 0004 MagicMedia 256AV Audio Device
+ 8006 NM2360 [MagicMedia 256ZX Audio]
+ 8016 NM2380 [MagicMedia 256XL+ Audio]
+10c9 Dataexpert Corporation
+10ca Fujitsu Microelectr., Inc.
+10cb Omron Corporation
+# nee Mentor ARC Inc
+10cc Mai Logic Incorporated
+ 0660 Articia S Host Bridge
+ 0661 Articia S PCI Bridge
+10cd Advanced System Products, Inc
+ 1100 ASC1100
+ 1200 ASC1200 [(abp940) Fast SCSI-II]
+ 1300 ABP940-U / ABP960-U
+ 10cd 1310 ASC1300 SCSI Adapter
+ 1195 1320 Ultra-SCSI CardBus PC Card REX CB31
+ 2300 ABP940-UW
+ 2500 ABP940-U2W
+ 2700 ABP3950-U3W
+10ce Radius
+# nee Citicorp TTI
+10cf Fujitsu Limited.
+ 01ef PCEA4 PCI-Express Dual Port ESCON Adapter
+ 1414 On-board USB 1.1 companion controller
+ 1415 On-board USB 2.0 EHCI controller
+ 1422 E8410 nVidia graphics adapter
+ 142d HD audio (Realtek ALC262)
+ 1430 82566MM Intel 1Gb copper LAN interface
+ 1623 PCEA4 PCI-Express Dual Port ESCON Adapter
+ 2001 mb86605
+ 200c MB86613L IEEE1394 OHCI 1.0 Controller
+ 2019 MB86295S [CORAL P]
+ 201e MB86296S [CORAL PA]
+ 202b MB86297A [Carmine Graphics Controller]
+10d1 FuturePlus Systems Corp.
+10d2 Molex Incorporated
+10d3 Jabil Circuit Inc
+10d4 Hualon Microelectronics
+10d5 Autologic Inc.
+10d6 Cetia
+10d7 BCM Advanced Research
+10d8 Advanced Peripherals Labs
+10d9 Macronix, Inc. [MXIC]
+ 0431 MX98715
+ 0512 MX98713
+ 0531 MX987x5
+ 1186 1200 DFE-540TX ProFAST 10/100 Adapter
+ 8625 MX86250
+ 8626 Macronix MX86251 + 3Dfx Voodoo Rush
+ 8888 MX86200
+10da Compaq IPG-Austin
+ 0508 TC4048 Token Ring 4/16
+ 3390 Tl3c3x9
+10db Rohm LSI Systems, Inc.
+10dc CERN/ECP/EDU
+ 0001 STAR/RD24 SCI-PCI (PMC)
+ 0002 TAR/RD24 SCI-PCI (PMC)
+ 0021 HIPPI destination
+ 0022 HIPPI source
+ 10dc ATT2C15-3 FPGA
+10dd Evans & Sutherland
+ 0100 Lightning 1200
+ 10dd 0023 Lightning 1200 15+16M
+10de nVidia Corporation
+ 0008 NV1 [EDGE 3D]
+ 0009 NV1 [EDGE 3D]
+ 0010 NV2 [Mutara V08]
+ 0020 NV4 [RIVA TNT]
+ 1043 0200 V3400 TNT
+ 1048 0c18 Erazor II SGRAM
+ 1048 0c19 Erazor II
+ 1048 0c1b Erazor II
+ 1048 0c1c Erazor II
+ 1092 0550 Viper V550
+ 1092 0552 Viper V550
+ 1092 4804 Viper V550
+ 1092 4808 Viper V550
+ 1092 4810 Viper V550
+ 1092 4812 Viper V550
+ 1092 4815 Viper V550
+ 1092 4820 Viper V550 with TV out
+ 1092 4822 Viper V550
+ 1092 4904 Viper V550
+ 1092 4914 Viper V550
+ 1092 8225 Viper V550
+ 10b4 273d Velocity 4400
+ 10b4 273e Velocity 4400
+ 10b4 2740 Velocity 4400
+ 10de 0020 Riva TNT
+ 1102 1015 Graphics Blaster CT6710
+ 1102 1016 Graphics Blaster RIVA TNT
+ 0028 NV5 [RIVA TNT2/TNT2 Pro]
+ 1043 0200 AGP-V3800 SGRAM
+ 1043 0201 AGP-V3800 SDRAM
+ 1043 0205 PCI-V3800
+ 1043 4000 AGP-V3800PRO
+ 1048 0c21 Synergy II
+ 1048 0c28 Erazor III
+ 1048 0c29 Erazor III
+ 1048 0c2a Erazor III
+ 1048 0c2b Erazor III
+ 1048 0c31 Erazor III Pro
+ 1048 0c32 Erazor III Pro
+ 1048 0c33 Erazor III Pro
+ 1048 0c34 Erazor III Pro
+ 107d 2134 WinFast 3D S320 II + TV-Out
+ 1092 4804 Viper V770
+ 1092 4a00 Viper V770
+ 1092 4a02 Viper V770 Ultra
+ 1092 5a00 RIVA TNT2/TNT2 Pro
+ 1092 6a02 Viper V770 Ultra
+ 1092 7a02 Viper V770 Ultra
+ 10de 0005 RIVA TNT2 Pro
+ 10de 000f Compaq NVIDIA TNT2 Pro
+ 1102 1020 3D Blaster RIVA TNT2
+ 1102 1026 3D Blaster RIVA TNT2 Digital
+ 14af 5810 Maxi Gamer Xentor
+ 0029 NV5 [RIVA TNT2 Ultra]
+ 1043 0200 AGP-V3800 Deluxe
+ 1043 0201 AGP-V3800 Ultra SDRAM
+ 1043 0205 PCI-V3800 Ultra
+ 1048 0c2e Erazor III Ultra
+ 1048 0c2f Erazor III Ultra
+ 1048 0c30 Erazor III Ultra
+ 1102 1021 3D Blaster RIVA TNT2 Ultra
+ 1102 1029 3D Blaster RIVA TNT2 Ultra
+ 1102 102f 3D Blaster RIVA TNT2 Ultra
+ 14af 5820 Maxi Gamer Xentor 32
+ 002a NV5 [Riva TNT2]
+ 002b NV5 [Riva TNT2]
+ 002c NV6 [Vanta/Vanta LT]
+ 1043 0200 AGP-V3800 Combat SDRAM
+ 1043 0201 AGP-V3800 Combat
+ 1048 0c20 TNT2 Vanta
+ 1048 0c21 TNT2 Vanta
+ 1092 6820 Viper V730
+ 1102 1031 CT6938 VANTA 8MB
+ 1102 1034 CT6894 VANTA 16MB
+ 14af 5008 Maxi Gamer Phoenix 2
+ 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]
+ 1043 0200 AGP-V3800M
+ 1043 0201 AGP-V3800M
+ 1048 0c3a Erazor III LT
+ 1048 0c3b Erazor III LT
+ 10de 0006 RIVA TNT2 Model 64/Model 64 Pro
+ 10de 001e M64 AGP4x
+ 1102 1023 CT6892 RIVA TNT2 Value
+ 1102 1024 CT6932 RIVA TNT2 Value 32Mb
+ 1102 102c CT6931 RIVA TNT2 Value [Jumper]
+ 1462 8808 MSI-8808
+ 1554 1041 Pixelview RIVA TNT2 M64
+ 1569 002d Palit Microsystems Daytona TNT2 M64
+ 002e NV6 [Vanta]
+ 002f NV6 [Vanta]
+ 0034 MCP04 SMBus
+ 0035 MCP04 IDE
+ 0036 MCP04 Serial ATA Controller
+ 0037 MCP04 Ethernet Controller
+ 0038 MCP04 Ethernet Controller
+ 003a MCP04 AC'97 Audio Controller
+ 003b MCP04 USB Controller
+ 003c MCP04 USB Controller
+ 003d MCP04 PCI Bridge
+ 003e MCP04 Serial ATA Controller
+ 0040 NV40 [GeForce 6800 Ultra]
+ 0041 NV40 [GeForce 6800]
+ 1043 817b V9999 Gamer Edition
+ 0042 NV40.2 [GeForce 6800 LE]
+ 0043 NV40.3 [GeForce 6800 XE]
+ 0044 NV40 [GeForce 6800 XT]
+ 0045 NV40 [GeForce 6800 GT]
+ 0046 NV45 [GeForce 6800 GT]
+ 0047 NV40 [GeForce 6800 GS]
+ 1682 2109 GeForce 6800 GS
+ 0048 NV40 [GeForce 6800 XT]
+ 0049 NV40GL
+ 004d NV40GL [Quadro FX 4000]
+ 004e NV40GL [Quadro FX 4000]
+ 0050 CK804 ISA Bridge
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 0c11 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 0051 CK804 ISA Bridge
+ 1028 0225 PowerEdge T105 ISA Bridge
+ 0052 CK804 SMBus
+ 1028 0225 PowerEdge T105 SMBus
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 0c11 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 0053 CK804 IDE
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 5002 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 0054 CK804 Serial ATA Controller
+ 1028 0225 PowerEdge T105 Serial ATA
+ 1043 815a A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 b003 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 5401 NF4 AM2L Mainboard
+ 0055 CK804 Serial ATA Controller
+ 1028 0225 PowerEdge T105 Serial ATA
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 b003 GA-K8N Ultra-9 Mainboard
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 5401 NF4 AM2L Mainboard
+ 0056 CK804 Ethernet Controller
+ 0057 CK804 Ethernet Controller
+ 1043 8141 K8N4-E or A8N-E Mainboard
+ 10de cb84 NF4 Lanparty
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 e000 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 2501 NF4 AM2L Mainboard
+ 0058 CK804 AC'97 Modem
+ 0059 CK804 AC'97 Audio Controller
+ 1043 812a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 8211 NF4 AM2L Mainboard
+ 005a CK804 USB Controller
+ 1028 0225 PowerEdge T105 onboard USB
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 5004 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 005b CK804 USB Controller
+ 1028 0225 PowerEdge T105 onboard USB
+ 1043 815a K8N4-E or A8N-E Mainboard
+ 10f1 2865 Tomcat K8E (S2865)
+ 1458 5004 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 005c CK804 PCI Bridge
+ 005d CK804 PCIE Bridge
+ 005e CK804 Memory Controller
+ 1028 0225 PowerEdge T105 Memory Controller
+ 1043 815a A8N-E Mainboard
+ 10de 005e ECS Elitegroup NFORCE3-A939 motherboard.
+ 10f1 2865 Tomcat K8E (S2865)
+ 10f1 2891 Thunder K8SRE Mainboard
+ 1458 5000 GA-K8N Ultra-9 Mainboard
+ 1462 7100 MSI K8N Diamond
+ 147b 1c1a KN8-Ultra Mainboard
+ 1565 3402 NF4 AM2L Mainboard
+ 005f CK804 Memory Controller
+ 0060 nForce2 ISA Bridge
+ 1043 80ad A7N8X Mainboard
+ 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X
+ a0a0 03ba UK79G-1394 motherboard
+ 0064 nForce2 SMBus (MCP)
+ 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X
+ a0a0 03bb UK79G-1394 motherboard
+ 0065 nForce2 IDE
+ 10de 0c11 nForce 2 EIDE Controller
+ a0a0 03b2 UK79G-1394 motherboard
+ 0066 nForce2 Ethernet Controller
+ 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet
+ 10de 0c11 nForce MCP-T Networking Adapter
+ a0a0 03b3 UK79G-1394 motherboard
+ 0067 nForce2 USB Controller
+ 1043 0c11 A7N8X Mainboard
+ a0a0 03b4 UK79G-1394 motherboard
+ 0068 nForce2 USB Controller
+ 1043 0c11 A7N8X Mainboard
+ a0a0 03b4 UK79G-1394 motherboard
+ 006a nForce2 AC97 Audio Controler (MCP)
+ 1043 8095 nForce2 AC97 Audio Controler (MCP)
+ a0a0 0304 UK79G-1394 motherboard
+ 006b nForce Audio Processing Unit
+ 10de 006b nForce2 MCP Audio Processing Unit
+ a0a0 0304 UK79G-1394 motherboard
+ 006c nForce2 External PCI Bridge
+ 006d nForce2 PCI Bridge
+ 006e nForce2 FireWire (IEEE 1394) Controller
+ a0a0 0306 UK79G-1394 motherboard
+ 0080 MCP2A ISA bridge
+ 147b 1c09 NV7 Motherboard
+ 0084 MCP2A SMBus
+ 147b 1c09 NV7 Motherboard
+ 0085 MCP2A IDE
+ 147b 1c09 NV7 Motherboard
+ 0086 MCP2A Ethernet Controller
+ 0087 MCP2A USB Controller
+ 147b 1c09 NV7 Motherboard
+ 0088 MCP2A USB Controller
+ 147b 1c09 NV7 Motherboard
+ 008a MCP2S AC'97 Audio Controller
+ 147b 1c09 NV7 Motherboard
+ 008b MCP2A PCI Bridge
+ 008c MCP2A Ethernet Controller
+ 008e nForce2 Serial ATA Controller
+ 0090 G70 [GeForce 7800 GTX]
+ 0091 G70 [GeForce 7800 GTX]
+ 0092 G70 [GeForce 7800 GT]
+ 0093 G70 [GeForce 7800 GS]
+ 0095 G70 [GeForce 7800 SLI]
+ 0098 G70 [GeForce Go 7800]
+ 0099 G70 [GeForce Go 7800 GTX]
+ 009d G70GL [Quadro FX 4500]
+ 00a0 NV5 [Aladdin TNT2]
+ 14af 5810 Maxi Gamer Xentor
+ 00c0 NV41 [GeForce 6800 GS]
+ 00c1 NV41.1 [GeForce 6800]
+ 00c2 NV41.2 [GeForce 6800 LE]
+ 00c3 NV42 [GeForce 6800 XT]
+ 00c8 NV41.8 [GeForce Go 6800]
+ 00c9 NV41.9 [GeForce Go 6800 Ultra]
+ 00cc NV41 [Quadro FX Go1400]
+ 00cd NV41 [Quadro FX 3450/4000 SDI]
+ 10de 029b wx4300 Workstation
+ 00ce NV41GL [Quadro FX 1400]
+ 00d0 nForce3 LPC Bridge
+ 00d1 nForce3 Host Bridge
+ 00d2 nForce3 AGP Bridge
+ 00d3 CK804 Memory Controller
+ 00d4 nForce3 SMBus
+ 00d5 nForce3 IDE
+ 00d6 nForce3 Ethernet
+ 00d7 nForce3 USB 1.1
+ 00d8 nForce3 USB 2.0
+ 00d9 nForce3 Audio
+ 00da nForce3 Audio
+ 00dd nForce3 PCI Bridge
+ 00df CK8S Ethernet Controller
+ 1043 80a7 K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 147b 1c0b NF8 Mainboard
+ 00e0 nForce3 250Gb LPC Bridge
+ 1043 813f K8N-E
+ 10de 0c11 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e0 Motherboard (one of many)
+ 00e1 nForce3 250Gb Host Bridge
+ 1043 813f K8N-E
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e1 Motherboard (one of many)
+ 00e2 nForce3 250Gb AGP Host to PCI Bridge
+ 00e3 nForce3 Serial ATA Controller
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 147b 1c0b NF8 Mainboard
+ 1849 00e3 Motherboard (one of many)
+ 00e4 nForce 250Gb PCI System Management
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e4 Motherboard (one of many)
+ 00e5 CK8S Parallel ATA Controller (v2.5)
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e5 Motherboard (one of many)
+ f849 00e5 Motherboard (one of many)
+ 00e6 CK8S Ethernet Controller
+ 00e7 CK8S USB Controller
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e7 Motherboard (one of many)
+ 00e8 nForce3 EHCI USB 2.0 Controller
+ 1043 813f K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 7030 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 1849 00e8 Motherboard (one of many)
+ 00ea nForce3 250Gb AC'97 Audio Controller
+ 1043 819d K8N-E
+ 105b 0c43 Winfast NF3250K8AA
+ 1462 b010 K8N Neo-FSR v2.0
+ 147b 1c0b NF8 Mainboard
+ 00ed nForce3 250Gb PCI-to-PCI Bridge
+ 00ee nForce3 Serial ATA Controller 2
+ 00f0 NV40 [GeForce 6800 Ultra]
+ 00f1 NV43 [GeForce 6600 GT]
+ 1043 81a6 N6600GT TD 128M AGP
+ 1043 81c6 N6600GT TD 128M AGP
+ 1458 3150 GV-N66T128VP
+ 1554 1191 PixelView PV-N43UA (128KD)
+ 1682 2119 GeForce 6600 GT AGP 128MB DDR3 DUAL DVI TV
+ 00f2 NV43 [GeForce 6600]
+ 1554 1194 PixelView PV-N43AT (256KD)
+ 1682 211c GeForce 6600 256MB DDR DUAL DVI TV
+ 00f3 NV43 [GeForce 6200]
+ 00f4 NV43 [GeForce 6600 LE]
+ 00f5 G70 [GeForce 7800 GS]
+ 00f6 NV43 [GeForce 6800 GS]
+ 1682 217e XFX GeForce 6800 XTreme 256MB DDR3 AGP
+ 00f8 NV45GL [Quadro FX 3400/4400]
+ 00f9 NV45 [GeForce 6800 GTO]
+ 10de 00f9 NV40 [GeForce 6800 GT]
+ 1682 2120 GEFORCE 6800 GT PCI-E
+ 00fa NV36 [GeForce PCX 5750]
+ 00fb NV35 [GeForce PCX 5900]
+ 00fc NV37GL [Quadro FX 330/GeForce PCX 5300]
+ 00fd NV37GL [Quadro PCI-E Series]
+ 00fe NV38GL [Quadro FX 1300]
+ 00ff NV18 [GeForce PCX 4300]
+ 0100 NV10 [GeForce 256 SDR]
+ 1043 0200 AGP-V6600 SGRAM
+ 1043 0201 AGP-V6600 SDRAM
+ 1043 4008 AGP-V6600 SGRAM
+ 1043 4009 AGP-V6600 SDRAM
+ 1048 0c41 Erazor X
+ 1048 0c43 ERAZOR X PCI
+ 1048 0c48 Synergy Force
+ 1102 102d CT6941 GeForce 256
+ 14af 5022 3D Prophet SE
+ 0101 NV10DDR [GeForce 256 DDR]
+ 1043 0202 AGP-V6800 DDR
+ 1043 400a AGP-V6800 DDR SGRAM
+ 1043 400b AGP-V6800 DDR SDRAM
+ 1048 0c42 Erazor X
+ 107d 2822 WinFast GeForce 256
+ 1102 102e CT6971 GeForce 256 DDR
+ 14af 5021 3D Prophet DDR-DVI
+ 0103 NV10GL [Quadro]
+ 1048 0c40 GLoria II-64
+ 1048 0c44 GLoria II
+ 1048 0c45 GLoria II
+ 1048 0c4a GLoria II-64 Pro
+ 1048 0c4b GLoria II-64 Pro DVII
+ 0110 NV11 [GeForce2 MX/MX 400]
+ 1043 4015 AGP-V7100 Pro
+ 1043 4021 V7100 Deluxe Combo
+ 1043 4031 V7100 Pro with TV output
+ 1048 0c60 Gladiac MX
+ 1048 0c61 Gladiac 511PCI
+ 1048 0c63 Gladiac 511TV-OUT 32MB
+ 1048 0c64 Gladiac 511TV-OUT 64MB
+ 1048 0c65 Gladiac 511TWIN
+ 1048 0c66 Gladiac 311
+ 10de 0091 Dell OEM GeForce 2 MX 400
+ 10de 00a1 Apple OEM GeForce2 MX
+ 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817]
+ 14af 7102 3D Prophet II MX
+ 14af 7103 3D Prophet II MX Dual-Display
+ 1545 0023 Xtasy Rev. B2
+ 0111 NV11DDR [GeForce2 MX200]
+ 0112 NV11 [GeForce2 Go]
+ 0113 NV11GL [Quadro2 MXR/EX/Go]
+ 0140 NV43 [GeForce 6600 GT]
+ 0141 NV43 [GeForce 6600]
+ 1043 81b0 EN6600 Silencer
+ 1458 3124 GV-NX66128DP Turbo Force Edition
+ 0142 NV43 [GeForce 6600 LE]
+ 0143 NV43 [GeForce 6600 VE]
+ 0144 NV43 [GeForce Go 6600]
+ 0145 NV43 [GeForce 6610 XL]
+ 0146 NV43 [Geforce Go 6600TE/6200TE]
+ 0147 NV43 [GeForce 6700 XL]
+ 0148 NV43 [GeForce Go 6600]
+ 0149 NV43 [GeForce Go 6600 GT]
+ 014a NV43 [Quadro NVS 440]
+ 014c NV43 [Quadro FX 540 MXM]
+ 014d NV43GL [Quadro FX 550]
+ 014e NV43GL [Quadro FX 540]
+ 014f NV43 [GeForce 6200]
+ 0150 NV15 [GeForce2 GTS/Pro]
+ 1043 4016 V7700 AGP Video Card
+ 1048 0c50 Gladiac
+ 1048 0c52 Gladiac-64
+ 107d 2840 WinFast GeForce2 GTS with TV output
+ 107d 2842 WinFast GeForce 2 Pro
+ 10de 002e GeForce2 GTS
+ 1462 8831 Creative GeForce2 Pro
+ 0151 NV15DDR [GeForce2 Ti]
+ 1043 405f V7700Ti
+ 1462 5506 Creative 3D Blaster Geforce2 Titanium
+ 0152 NV15BR [GeForce2 Ultra, Bladerunner]
+ 1048 0c56 GLADIAC Ultra
+ 0153 NV15GL [Quadro2 Pro]
+ 0160 NV44 [GeForce 6500]
+ 0161 NV44 [GeForce 6200 TurboCache(TM)]
+ 0162 NV44 [GeForce 6200SE TurboCache (TM)]
+ 0163 NV44 [GeForce 6200 LE]
+ 0164 NV44 [GeForce Go 6200]
+ 0165 NV44 [Quadro NVS 285]
+ 0166 NV44 [GeForce Go 6400]
+ 0167 NV44 [GeForce Go 6200]
+ 0168 NV44 [GeForce Go 6400]
+ 0169 NV44 [GeForce 6250]
+ 016a NV44 [GeForce 7100 GS]
+ 0170 NV17 [GeForce4 MX 460]
+ 0171 NV17 [GeForce4 MX 440]
+ 10b0 0002 Gainward Pro/600 TV
+ 10de 0008 Apple OEM GeForce4 MX 440
+ 1462 8661 G4MX440-VTP
+ 1462 8730 MX440SES-T (MS-8873)
+ 1462 8852 GeForce4 MX440 PCI
+ 147b 8f00 Abit Siluro GeForce4MX440
+ 0172 NV17 [GeForce4 MX 420]
+ 0173 NV17 [GeForce4 MX 440-SE]
+ 0174 NV17 [GeForce4 440 Go]
+ 0175 NV17 [GeForce4 420 Go]
+ 0176 NV17 [GeForce4 420 Go 32M]
+ 103c 08b0 tc1100 tablet
+ 144d c005 X10 Laptop
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 0177 NV17 [GeForce4 460 Go]
+ 0178 NV17GL [Quadro4 550 XGL]
+ 0179 NV17 [GeForce4 440 Go 64M]
+ 10de 0179 GeForce4 MX (Mac)
+ 017a NV17GL [Quadro NVS]
+ 017b NV17GL [Quadro4 550 XGL]
+ 017c NV17GL [Quadro4 500 GoGL]
+ 017d NV17 [GeForce4 410 Go 16M]
+ 0181 NV18 [GeForce4 MX 440 AGP 8x]
+ 1043 8063 GeForce4 MX 440 AGP 8X
+ 1043 806f V9180 Magic
+ 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X
+ 1462 8900 MS-8890 GeForce 4 MX440 AGP8X
+ 1462 9350 MSI Geforce4 MX T8X with AGP8X
+ 147b 8f0d Siluro GF4 MX-8X
+ 1554 1111 PixelView MVGA-NVG18A
+ 0182 NV18 [GeForce4 MX 440SE AGP 8x]
+ 0183 NV18 [GeForce4 MX 420 AGP 8x]
+ 0184 NV18 [GeForce4 MX]
+ 0185 NV18 [GeForce4 MX 4000]
+ 0186 NV18M [GeForce4 448 Go]
+ 0187 NV18M [GeForce4 488 Go]
+ 0188 NV18GL [Quadro4 580 XGL]
+ 0189 NV18 [GeForce4 MX with AGP8X (Mac)]
+ 018a NV18GL [Quadro NVS 280 SD]
+ 018b NV18GL [Quadro4 380 XGL]
+ 018c NV18GL [Quadro NVS 50 PCI]
+ 018d NV18M [GeForce4 448 Go]
+ 0191 G80 [GeForce 8800 GTX]
+ 0193 G80 [GeForce 8800 GTS]
+ 107d 20bd WinFast PX 8800 GTS TDH
+ 0194 G80 [GeForce 8800 Ultra]
+# Found in GPU server Tesla D870 and S870
+ 0197 G80 [Tesla C870]
+ 019d G80 [Quadro FX 5600]
+ 019e G80 [Quadro FX 4600]
+ 01a0 NVCrush11 [GeForce2 MX Integrated Graphics]
+ 01a4 nForce CPU bridge
+ 01ab nForce 420 Memory Controller (DDR)
+ 01ac nForce 220/420 Memory Controller
+ 01ad nForce 220/420 Memory Controller
+ 01b0 nForce Audio Processing Unit
+ 01b1 nForce AC'97 Audio Controller
+ 01b2 nForce ISA Bridge
+ 01b4 nForce PCI System Management
+ 01b7 nForce AGP to PCI Bridge
+ 01b8 nForce PCI-to-PCI bridge
+ 01bc nForce IDE
+ 01c1 nForce AC'97 Modem Controller
+ 01c2 nForce USB Controller
+ 01c3 nForce Ethernet Controller
+ 01d0 G72 [GeForce 7350 LE]
+ 01d1 G72 [GeForce 7300 LE]
+ 1462 0345 7300LE PCI Express Graphics Adapter
+ 01d2 G72 [GeForce 7550 LE]
+ 01d3 G72 [GeForce 7300 SE/7200 GS]
+ 01d6 G72M [GeForce Go 7200]
+ 01d7 G72M [Quadro NVS 110M/GeForce Go 7300]
+ 01d8 G72M [GeForce Go 7400]
+ 1028 01d7 XPS M1210
+ 01d9 G72M [GeForce Go 7450]
+ 01da G72M [Quadro NVS 110M]
+ 01db G72M [Quadro NVS 120M]
+ 01dc G72GL [Quadro FX 350M]
+ 01dd G72 [GeForce 7500 LE]
+ 01de G72GL [Quadro FX 350]
+ 10de 01dc Quadro FX Go350M
+ 01df G71 [GeForce 7300 GS]
+ 01e0 nForce2 IGP2
+ 147b 1c09 NV7 Motherboard
+ 01e8 nForce2 AGP
+ 01ea nForce2 Memory Controller 0
+ a0a0 03b9 UK79G-1394 motherboard
+ 01eb nForce2 Memory Controller 1
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ec nForce2 Memory Controller 2
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ed nForce2 Memory Controller 3
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ee nForce2 Memory Controller 4
+ 10de 01ee MSI Delta-L nForce2 memory controller
+ a0a0 03b9 UK79G-1394 motherboard
+ 01ef nForce2 Memory Controller 5
+ a0a0 03b9 UK79G-1394 motherboard
+ 01f0 NV18 [GeForce4 MX - nForce GPU]
+ a0a0 03b5 UK79G-1394 motherboard
+ 0200 NV20 [GeForce3]
+ 1043 402f AGP-V8200 DDR
+ 1048 0c70 GLADIAC 920
+ 0201 NV20 [GeForce3 Ti 200]
+ 0202 NV20 [GeForce3 Ti 500]
+ 1043 405b V8200 T5
+ 1545 002f Xtasy 6964
+ 0203 NV20DCC [Quadro DCC]
+ 0211 NV48 [GeForce 6800]
+ 0212 NV48 [GeForce 6800 LE]
+ 0215 NV48 [GeForce 6800 GT]
+ 0218 NV48 [GeForce 6800 XT]
+ 0221 NV44A [GeForce 6200]
+ 3842 a341 256A8N341DX
+ 0222 NV44 [GeForce 6200 A-LE]
+ 0240 C51PV [GeForce 6150]
+ 1043 81cd A8N-VM CSM
+ 1462 7207 K8NGM2 series
+ 0241 C51 [GeForce 6150 LE]
+ 0242 C51G [GeForce 6100]
+ 105b 0cad Winfast 6100K8MB
+ 0243 C51 PCI Express Bridge
+ 0244 C51 [Geforce Go 6150]
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 10de 0244 GeForce Go 6150
+ 0245 C51 [Quadro NVS 210S/GeForce 6150LE]
+ 0246 C51 PCI Express Bridge
+ 0247 C51 [GeForce Go 6100]
+ 1043 1382 MCP51 PCI-X GeForce Go 6100
+ 0248 C51 PCI Express Bridge
+ 0249 C51 PCI Express Bridge
+ 024a C51 PCI Express Bridge
+ 024b C51 PCI Express Bridge
+ 024c C51 PCI Express Bridge
+ 024d C51 PCI Express Bridge
+ 024e C51 PCI Express Bridge
+ 024f C51 PCI Express Bridge
+ 0250 NV25 [GeForce4 Ti 4600]
+ 0251 NV25 [GeForce4 Ti 4400]
+ 1043 8023 v8440 GeForce 4 Ti4400
+ 10de 0251 PNY GeForce4 Ti 4400
+ 1462 8710 PNY GeForce4 Ti 4400
+ 0252 NV25 [GeForce4 Ti]
+ 0253 NV25 [GeForce4 Ti 4200]
+ 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI)
+ 147b 8f09 Siluro (Dual VGA/TV-out/DVI)
+ 0258 NV25GL [Quadro4 900 XGL]
+ 0259 NV25GL [Quadro4 750 XGL]
+ 025b NV25GL [Quadro4 700 XGL]
+ 0260 MCP51 LPC Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 1458 5001 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0261 MCP51 LPC Bridge
+ 105b 0cad Winfast 6100K8MB
+ 0262 MCP51 LPC Bridge
+ 0263 MCP51 LPC Bridge
+ 0264 MCP51 SMBus
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1462 7207 K8NGM2 series
+ 0265 MCP51 IDE
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+# Foxconn has used a wrong vendor ID for this one
+ f05b 0cad Winfast 6100K8MB
+ 0266 MCP51 Serial ATA Controller
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 0267 MCP51 Serial ATA Controller
+ 1043 81bc A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 0268 MCP51 Ethernet Controller
+ 0269 MCP51 Ethernet Controller
+ 103c 30b7 Presario V6133CL
+ 1043 8141 A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 026a MCP51 MCI
+ 026b MCP51 AC97 Audio Controller
+ 105b 0cad Winfast 6100K8MB
+ 026c MCP51 High Definition Audio
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 10de cb84 ASUSTeK Computer Inc. A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 026d MCP51 USB Controller
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1462 7207 K8NGM2 series
+ 026e MCP51 USB Controller
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1462 7207 K8NGM2 series
+ 026f MCP51 PCI Bridge
+ 103c 30b7 Presario V6133CL
+ 0270 MCP51 Host Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81bc A8N-VM CSM Mainboard
+ 105b 0cad Winfast 6100K8MB
+ 1458 5001 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0271 MCP51 PMU
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 0272 MCP51 Memory Controller 0
+ 105b 0cad Winfast 6100K8MB
+ 027e C51 Memory Controller 2
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 027f C51 Memory Controller 3
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0280 NV28 [GeForce4 Ti 4800]
+ 0281 NV28 [GeForce4 Ti 4200 AGP 8x]
+ 0282 NV28 [GeForce4 Ti 4800 SE]
+ 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x]
+ 0288 NV28GL [Quadro4 980 XGL]
+ 0289 NV28GL [Quadro4 780 XGL]
+ 028c NV28GLM [Quadro4 Go700]
+ 0290 G71 [GeForce 7900 GTX]
+ 0291 G71 [GeForce 7900 GT/GTO]
+ 10de 042b NX7900GTO-T2D512E [7900 GTO]
+ 0292 G71 [GeForce 7900 GS]
+ 0293 G71 [GeForce 7900 GX2]
+ 0294 G71 [GeForce 7950 GX2]
+ 0295 G71 [GeForce 7950 GT]
+ 1043 8225 GeForce 7950 GT
+ 107d 2a68 WinFast PX7950GT TDH
+ 1462 0663 NX7950GT-VT2D512EZ-HD
+ 0297 G71 [GeForce Go 7950 GTX]
+ 0298 G71 [GeForce Go 7900 GS]
+ 0299 G71 [GeForce Go 7900 GTX]
+ 029a G71 [Quadro FX 2500M]
+ 029b G71 [Quadro FX 1500M]
+ 029c G71 [Quadro FX 5500]
+ 029d G71GL [Quadro FX 3500]
+ 029e G71 [Quadro FX 1500]
+ 029f G70 [Quadro FX 4500 X2]
+# Xbox Graphics Processing Unit (Integrated). GeForce3 derivative (NV20 < NV2A < NV25).
+ 02a0 NV2A [XGPU]
+ 02a5 MCPX CPU Bridge
+ 02a6 MCPX Memory Controller
+ 02e0 G73 [GeForce 7600 GT]
+ 02e0 2249 GF 7600GT 560M 256MB DDR3 DUAL DVI TV
+ 02e1 G73 [GeForce 7600 GS]
+ 1682 222b PV-T73K-UAL3 (256MB)
+ 1682 2247 GF 7600GS 512MB DDR2
+ 02e2 G73 [GeForce 7300 GT]
+ 02e3 G71 [GeForce 7900 GS]
+ 02e4 G71 [GeForce 7950 GT]
+ 1682 2271 PV-T71A-YDF7 (512MB)
+ 02f0 C51 Host Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1462 7207 K8NGM2 series
+ 02f1 C51 Host Bridge
+ 1458 5000 GA-M55plus-S3G
+ 02f2 C51 Host Bridge
+ 02f3 C51 Host Bridge
+ 02f4 C51 Host Bridge
+ 02f5 C51 Host Bridge
+ 02f6 C51 Host Bridge
+ 02f7 C51 Host Bridge
+ 02f8 C51 Memory Controller 5
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02f9 C51 Memory Controller 4
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02fa C51 Memory Controller 0
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02fb C51 PCI Express Bridge
+ 02fc C51 PCI Express Bridge
+ 103c 30b7 Presario V6133CL
+ 02fd C51 PCI Express Bridge
+ 103c 30b7 Presario V6133CL
+ 02fe C51 Memory Controller 1
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 02ff C51 Host Bridge
+ 103c 30b7 Presario V6133CL
+ 1043 81cd A8N-VM CSM Mainboard
+ 1458 5000 GA-M55plus-S3G
+ 1462 7207 K8NGM2 series
+ 0300 NV30 [GeForce FX]
+ 0301 NV30 [GeForce FX 5800 Ultra]
+ 0302 NV30 [GeForce FX 5800]
+ 0308 NV30GL [Quadro FX 2000]
+ 0309 NV30GL [Quadro FX 1000]
+ 0311 NV31 [GeForce FX 5600 Ultra]
+ 0312 NV31 [GeForce FX 5600]
+ 0313 NV31
+ 0314 NV31 [GeForce FX 5600XT]
+ 1043 814a V9560XT/TD
+ 0316 NV31M
+ 0317 NV31M Pro
+ 031a NV31M [GeForce FX Go5600]
+ 031b NV31M [GeForce FX Go5650]
+ 031c NV31 [Quadro FX Go700]
+ 031d NV31GLM
+ 031e NV31GLM Pro
+ 031f NV31GLM Pro
+ 0320 NV34 [GeForce FX 5200]
+ 0321 NV34 [GeForce FX 5200 Ultra]
+ 0322 NV34 [GeForce FX 5200]
+ 1043 02fb V9250 Magic
+ 1043 8180 V9520-X/TD/128M
+ 1462 9110 MS-8911 (FX5200-TD128)
+ 1462 9171 MS-8917 (FX5200-T128)
+ 1462 9360 MS-8936 (FX5200-T128)
+ 0323 NV34 [GeForce FX 5200LE]
+ 0324 NV34M [GeForce FX Go5200 64M]
+ 1028 0196 Inspiron 5160
+ 103c 006a Pavilion ZD7000 laptop
+ 1071 8160 MIM2000
+ 0325 NV34M [GeForce FX Go5250]
+ 0326 NV34 [GeForce FX 5500]
+ 1458 310d GeForce FX 5500 128 MB
+ 1682 2034 GeForce 5500 256 MB
+ 0327 NV34 [GeForce FX 5100]
+ 0328 NV34M [GeForce FX Go5200 32M/64M]
+ 0329 NV34M [GeForce FX Go5200]
+ 10de 0010 Powerbook G4
+ 032a NV34GL [Quadro NVS 280 PCI]
+ 032b NV34GL [Quadro FX 500/600 PCI]
+ 032c NV34GLM [GeForce FX Go 5300]
+ 032d NV34 [GeForce FX Go5100]
+ 032f NV34GL
+ 0330 NV35 [GeForce FX 5900 Ultra]
+ 1043 8137 V9950 Ultra / 256 MB
+ 0331 NV35 [GeForce FX 5900]
+ 1043 8145 V9950GE
+ 0332 NV35 [GeForce FX 5900XT]
+ 0333 NV38 [GeForce FX 5950 Ultra]
+ 0334 NV35 [GeForce FX 5900ZT]
+ 1462 9373 FX5900ZT-VTD128 (MS-8937)
+ 0338 NV35GL [Quadro FX 3000]
+ 033f NV35GL [Quadro FX 700]
+ 0341 NV36.1 [GeForce FX 5700 Ultra]
+ 1462 9380 MS-8938 (FX5700U-TD128)
+ 0342 NV36.2 [GeForce FX 5700]
+ 0343 NV36 [GeForce FX 5700LE]
+ 0344 NV36.4 [GeForce FX 5700VE]
+ 0345 NV36.5
+ 0347 NV36 [GeForce FX Go5700]
+ 103c 006a NX9500
+ 0348 NV36 [GeForce FX Go5700]
+ 0349 NV36M Pro
+ 034b NV36MAP
+ 034c NV36 [Quadro FX Go1000]
+ 034e NV36GL [Quadro FX 1100]
+ 034f NV36GL
+ 0360 MCP55 LPC Bridge
+ 0361 MCP55 LPC Bridge
+ 1028 0221 PowerEdge R805 MCP55 LPC Bridge
+ 0362 MCP55 LPC Bridge
+ 147b 12c4 KN9-Ultra Mainboard
+ 0363 MCP55 LPC Bridge
+ 0364 MCP55 LPC Bridge
+ 1028 0221 PowerEdge R805 MCP55 LPC Bridge
+ 0365 MCP55 LPC Bridge
+ 0366 MCP55 LPC Bridge
+ 0367 MCP55 LPC Bridge
+ 0368 MCP55 SMBus
+ 1028 020c PowerEdge M605 MCP55 SMBus
+ 1028 0221 PowerEdge R805 MCP55 SMBus
+ 147b 12c4 KN9-Ultra Mainboard
+ 0369 MCP55 Memory Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 036a MCP55 Memory Controller
+ 036b MCP55 SMU
+ 036c MCP55 USB Controller
+ 1028 020c PowerEdge M605 MCP55 USB Controller
+ 1028 0221 PowerEdge R805 MCP55 USB Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 036d MCP55 USB Controller
+ 1028 020c PowerEdge M605 MCP55 USB Controller
+ 1028 0221 PowerEdge R805 MCP55 USB Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 036e MCP55 IDE
+ 147b 12c4 KN9-Ultra Mainboard
+ 0370 MCP55 PCI bridge
+ 0371 MCP55 High Definition Audio
+ 0372 MCP55 Ethernet
+ 0373 MCP55 Ethernet
+ 147b 12c4 KN9-Ultra Mainboard
+ 0374 MCP55 PCI Express bridge
+ 0375 MCP55 PCI Express bridge
+ 0376 MCP55 PCI Express bridge
+ 0377 MCP55 PCI Express bridge
+ 0378 MCP55 PCI Express bridge
+ 037a MCP55 Memory Controller
+ 037e MCP55 SATA Controller
+ 037f MCP55 SATA Controller
+ 1028 0221 PowerEdge R805 MCP55 SATA Controller
+ 147b 12c4 KN9-Ultra Mainboard
+ 038b G73 [GeForce 7650 GS]
+ 0390 G73 [GeForce 7650 GS]
+ 0391 G73 [GeForce 7600 GT]
+ 1458 3427 GV-NX76T128D-RH
+ 0392 G73 [GeForce 7600 GS]
+ 1462 0622 NX7600GS-T2D256EH
+ 0393 G73 [GeForce 7300 GT]
+ 10de 0412 NX7300GT-TD256EH
+ 1462 0412 NX7300GT-TD256EH
+ 0394 G73 [GeForce 7600 LE]
+ 0395 G73 [GeForce 7300 GT]
+ 0397 G73 [GeForce Go 7700]
+ 0398 G73 [GeForce Go 7600]
+ 1025 006c Acer 9814 WKMI
+ 0399 G73 [GeForce Go 7600 GT]
+ 039a G73M [Quadro NVS 300M]
+ 039b G73 [GeForce Go 7900 SE]
+ 039c G73 [Quadro FX 550M]
+ 10de 039c Quadro FX 560M
+ 039e G73GL [Quadro FX 560]
+ 03a0 C55 Host Bridge
+ 03a1 C55 Host Bridge
+ 03a2 C55 Host Bridge
+ 03a3 C55 Host Bridge
+ 03a4 C55 Host Bridge
+ 03a5 C55 Host Bridge
+ 03a6 C55 Host Bridge
+ 03a7 C55 Host Bridge
+ 03a8 C55 Memory Controller
+ 03a9 C55 Memory Controller
+ 03aa C55 Memory Controller
+ 03ab C55 Memory Controller
+ 03ac C55 Memory Controller
+ 03ad C55 Memory Controller
+ 03ae C55 Memory Controller
+ 03af C55 Memory Controller
+ 03b0 C55 Memory Controller
+ 03b1 C55 Memory Controller
+ 03b2 C55 Memory Controller
+ 03b3 C55 Memory Controller
+ 03b4 C55 Memory Controller
+ 03b5 C55 Memory Controller
+ 03b6 C55 Memory Controller
+ 03b7 C55 PCI Express bridge
+ 03b8 C55 PCI Express bridge
+ 03b9 C55 PCI Express bridge
+ 03ba C55 Memory Controller
+ 03bb C55 PCI Express bridge
+ 03bc C55 Memory Controller
+ 03d0 C61 [GeForce 6150SE nForce 430]
+ 1028 020e Inspiron 531
+ 03d1 C61 [GeForce 6100 nForce 405]
+ 03d2 C61 [GeForce 6100 nForce 400]
+ 03d5 C61 [GeForce 6100 nForce 420]
+ 03d6 C61 [GeForce 7025 / nForce 630a]
+ 03e0 MCP61 LPC Bridge
+ 1028 020e Inspiron 531
+ 1849 03e0 939NF6G-VSTA Board
+ 03e1 MCP61 LPC Bridge
+ 03e2 MCP61 LPC Bridge
+ 03e3 MCP61 LPC Bridge
+ 03e4 MCP61 High Definition Audio
+ 03e5 MCP61 Ethernet
+ 03e6 MCP61 Ethernet
+ 03e7 MCP61 SATA Controller
+ 03e8 MCP61 PCI Express bridge
+ 1028 020e Inspiron 531
+ 1849 03e8 939NF6G-VSTA Board
+ 03e9 MCP61 PCI Express bridge
+ 1028 020e Inspiron 531
+ 1849 03e9 939NF6G-VSTA Board
+ 03ea MCP61 Memory Controller
+ 1028 020e Inspiron 531
+ 1849 03ea 939NF6G-VSTA Board
+ 03eb MCP61 SMBus
+ 1028 020e Inspiron 531
+ 1849 03eb 939NF6G-VSTA Board
+ 03ec MCP61 IDE
+ 1028 020e Inspiron 531
+ 1849 03ec 939NF6G-VSTA Board
+ 03ee MCP61 Ethernet
+ 03ef MCP61 Ethernet
+ 1028 020e Inspiron 531
+ 1849 03ef 939NF6G-VSTA Board
+ 03f0 MCP61 High Definition Audio
+ 1028 020e Inspiron 531
+ 1849 0888 939NF6G-VSTA Board
+ 03f1 MCP61 USB Controller
+ 1028 020e Inspiron 531
+ 1849 03f1 939NF6G-VSTA Board
+ 03f2 MCP61 USB Controller
+ 1028 020e Inspiron 531
+ 1849 03f2 939NF6G-VSTA Board
+ 03f3 MCP61 PCI bridge
+ 1028 020e Inspiron 531
+ 1849 03f3 939NF6G-VSTA Board
+ 03f4 MCP61 SMU
+ 03f5 MCP61 Memory Controller
+ 1028 020e Inspiron 531
+ 1849 03eb 939NF6G-VSTA Board
+ 03f6 MCP61 SATA Controller
+ 1028 020e Inspiron 531
+ 1849 03f6 939NF6G-VSTA Board
+ 03f7 MCP61 SATA Controller
+ 0400 G84 [GeForce 8600 GTS]
+ 0401 G84 [GeForce 8600GT]
+ 0402 G84 [GeForce 8600 GT]
+ 1462 0910 NX8600GT-T2D256EZ
+ 0403 G84 [GeForce 8600 GS]
+ 0404 G84 [GeForce 8400 GS]
+ 1462 1230 NX8400GS-TD256E
+ 0405 G84 [GeForce 9500M GS]
+ 0406 G84 [GeForce 8300 GS]
+ 0407 G84 [GeForce 8600M GT]
+ 0408 G84 [GeForce 9650M GS]
+ 0409 G84 [GeForce 8700M GT]
+ 040a G84 [Quadro FX 370]
+ 040b G84M [Quadro NVS 320M]
+ 040c G84M [Quadro FX 570M]
+ 17aa 20d9 ThinkPad T61p
+ 040d G84 [Quadro FX 1600M]
+ 040e G84 [Quadro FX 570]
+ 040f G84 [Quadro FX 1700]
+ 0410 G92 [GeForce GT 330]
+ 0420 G86 [GeForce 8400 SE]
+ 0421 G86 [GeForce 8500 GT]
+ 1462 0960 NX8500GT-TD512EH/M2
+ 0422 G86 [GeForce 8400 GS]
+ 0423 G86 [GeForce 8300 GS]
+ 0424 G86 [GeForce 8400 GS]
+ 0425 G86 [GeForce 8600M GS]
+ 1025 0121 Aspire 5920G
+ 0426 G86 [GeForce 8400M GT]
+ 0427 G86 [GeForce 8400M GS]
+ 0428 G86 [GeForce 8400M G]
+ 0429 G84M [Quadro NVS 140M]
+ 17aa 20d8 ThinkPad T61
+ 042a G86M [Quadro NVS 130M]
+ 042b G86M [Quadro NVS 135M]
+ 042c G86 [GeForce 9400 GT]
+ 042d G86M [Quadro FX 360M]
+ 042e G86 [GeForce 9300M G]
+ 042f G86 [Quadro NVS 290]
+ 0440 MCP65 LPC Bridge
+ 0441 MCP65 LPC Bridge
+ 0442 MCP65 LPC Bridge
+ 0443 MCP65 LPC Bridge
+ 0444 MCP65 Memory Controller
+ 0445 MCP65 Memory Controller
+ 0446 MCP65 SMBus
+ 0447 MCP65 SMU
+ 0448 MCP65 IDE
+ 0449 MCP65 PCI bridge
+ 044a MCP65 High Definition Audio
+ 044b MCP65 High Definition Audio
+ 044c MCP65 AHCI Controller
+ 044d MCP65 AHCI Controller
+ 044e MCP65 AHCI Controller
+ 044f MCP65 AHCI Controller
+ 0450 MCP65 Ethernet
+ 0451 MCP65 Ethernet
+ 0452 MCP65 Ethernet
+ 0453 MCP65 Ethernet
+ 0454 MCP65 USB Controller
+ 0455 MCP65 USB Controller
+ 0456 MCP65 USB Controller
+ 0457 MCP65 USB Controller
+ 0458 MCP65 PCI Express bridge
+ 0459 MCP65 PCI Express bridge
+ 045a MCP65 PCI Express bridge
+ 045c MCP65 SATA Controller
+ 045d MCP65 SATA Controller
+ 045e MCP65 SATA Controller
+ 045f MCP65 SATA Controller
+ 0531 C67 [GeForce 7150M / nForce 630M]
+ 0533 C67 [GeForce 7000M / nForce 610M]
+ 053a C68 [GeForce 7050 PV / nForce 630a]
+ 053b C68 [GeForce 7050 PV / nForce 630a]
+ 1043 8308 M2N68-AM Motherbord
+ 053e C68 [GeForce 7025 / nForce 630a]
+ 0541 MCP67 Memory Controller
+ 0542 MCP67 SMBus
+ 1043 8308 M2N68-AM Motherbord
+ 0543 MCP67 Co-processor
+ 0547 MCP67 Memory Controller
+ 1043 8308 M2N68-AM Motherbord
+ 1849 0547 ALiveNF7G-HDready
+ 0548 MCP67 ISA Bridge
+ 1043 8308 M2N68-AM Motherboard
+ 054c MCP67 Ethernet
+ 1043 8308 M2N68-AM Motherbord
+ 1849 054c ALiveNF7G-HDready, MCP67 Gigabit Ethernet
+ 054d MCP67 Ethernet
+ 054e MCP67 Ethernet
+# forcedeth source code from Nvidi
+ 054f MCP67 Ethernet
+ 0550 MCP67 AHCI Controller
+ 1043 8308 M2N68-AM Motherboard
+ 0554 MCP67 AHCI Controller
+ 1043 8308 M2N68-AM Motherboard
+ 0555 MCP67 SATA Controller
+ 1043 8308 M2N68-AM Motherboard
+ 055c MCP67 High Definition Audio
+ 1043 8290 M2N68-AM Motherboard
+ 055d MCP67 High Definition Audio
+ 055e MCP67 OHCI USB 1.1 Controller
+ 1043 8308 M2N68-AM Motherboard
+ 055f MCP67 EHCI USB 2.0 Controller
+ 1043 8308 M2N68-AM Motherboard
+ 0560 MCP67 IDE Controller
+ f043 8308 M2N68-AM Motherboard
+ 0561 MCP67 PCI Bridge
+ 0562 MCP67 PCI Express Bridge
+ 1849 0562 ALiveNF7G-HDready
+ 0563 MCP67 PCI Express Bridge
+ 0568 MCP78S [GeForce 8200] Memory Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0568 K10N78FullHD-hSLI R3.0 Memory Controller
+ 0569 MCP78S [GeForce 8200] PCI Express Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0569 K10N78FullHD-hSLI R3.0 PCI Express Bridge
+ 056a MCP73 [nForce 630i] USB 2.0 Controller (EHCI)
+ 1019 297a MCP73PVT-SM
+ 056c MCP73 IDE
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 056d MCP73 PCI Express bridge
+ 1019 297a MCP73PVT-SM
+ 056e MCP73 PCI Express bridge
+ 1019 297a MCP73PVT-SM
+ 056f MCP73 PCI Express bridge
+ 1019 297a MCP73PVT-SM
+ 05b1 NF200 PCIe 2.0 switch for mainboards
+ 05b8 NF200 PCIe 2.0 switch for GTX 295
+ 05be NF200 PCIe 2.0 switch for Quadro Plex S4 / Tesla S870 / Tesla S1070 / Tesla S2050
+ 05e0 GT200b [GeForce GTX 295]
+ 05e1 GT200 [GeForce GTX 280]
+# GT200 [GTX 260] or GT200 [GTX 260-216] or GT200b [GTX 260-216]
+ 05e2 GT200 [GeForce GTX 260]
+ 05e3 GT200b [GeForce GTX 285]
+ 05e6 GT200b [GeForce GTX 275]
+# Found in GPU server Tesla S1070
+ 05e7 GT200 [Tesla C1060]
+ 05ea GT200 [GeForce GTX 260]
+ 05eb GT200 [GeForce GTX 295]
+ 05ed GT200GL [Quadro Plex 2200 D2]
+ 05f8 GT200GL [Quadro Plex 2200 S4]
+ 05f9 GT200GL [Quadro CX]
+ 05fd GT200GL [Quadro FX 5800]
+ 05fe GT200GL [Quadro FX 4800]
+ 05ff GT200GL [NVIDIA Quadro FX 3800]
+ 0600 G92 [GeForce 8800 GTS 512]
+ 0601 G92 [GeForce 9800 GT]
+ 0602 G92 [GeForce 8800 GT]
+ 0603 G92 [GeForce GT 230]
+ 0604 G92 [GeForce 9800 GX2]
+ 0605 G92 [GeForce 9800 GT]
+ 0606 G92 [GeForce 8800 GS]
+ 0607 G92 [GeForce GTS 240]
+ 0608 G92 [GeForce 9800M GTX]
+ 0609 G92 [GeForce 8800M GTS]
+ 060a GT200 [GeForce GTX 280M]
+ 060b G92 [GeForce 9800M GT]
+ 060c G92 [GeForce 8800M GTX]
+ 060d G92 [GeForce 8800 GS]
+ 060f G92 [GeForce GTX 285M]
+ 0610 G92 [GeForce 9600 GSO]
+ 1682 2385 GeForce 9600 GSO 768mb
+ 0611 G92 [GeForce 8800 GT]
+ 107d 2ab0 Winfast PX8800 GT PCI-E
+ 19da 1040 ZT-88TES2P-FSP
+ 0612 G92 [GeForce 9800 GTX]
+ 0613 G92 [GeForce 9800 GTX+]
+ 0614 G92 [GeForce 9800 GT]
+ 107d 2ab3 WinFast PX9800 GT (S-Fanpipe)
+ 0615 G92 [GeForce GTS 250]
+ 3842 1150 GeForce GTS 250 P/N 512-P3-1150-TR
+# Overclocked
+ 3842 1151 GeForce GTS 250 P/N 512-P3-1151-TR
+ 3842 1155 GeForce GTS 250 P/N 01G-P3-1155-TR
+# Overclocked
+ 3842 1156 GeForce GTS 250 P/N 01G-P3-1156-TR
+ 0617 G92 [GeForce 9800M GTX]
+ 0618 G92 [GeForce GTX 260M]
+ 0619 G92GL [Quadro FX 4700 X2]
+ 061a G92 [Quadro FX 3700]
+ 061b G92GL [Quadro VX 200]
+ 061c G92M [Quadro FX 3600M]
+ 061d G92 [Quadro FX 2800M]
+ 061e G92 [Quadro FX 3700M]
+ 061f G92 [Quadro FX 3800M]
+ 0622 G94 [GeForce 9600 GT]
+ 107d 2ac1 WinFast PX9600GT 1024MB
+ 1458 3481 GV-NX96T512HP
+ 0623 G94 [GeForce 9600 GS]
+ 0625 G94 [GeForce 9600 GSO 512]
+ 0626 G94 [GeForce GT 130]
+ 0627 G94 [GeForce GT 140]
+ 0628 G94 [GeForce 9800M GTS]
+ 062a G94 [GeForce 9700M GTS]
+ 062b G94 [GeForce 9800M GS]
+ 062c G94 [GeForce 9800M GTS]
+ 062d G94 [GeForce 9600 GT]
+ 062e G94 [GeForce 9600 GT]
+ 0631 G94M [GeForce GTS 160M]
+ 0632 G94M [GeForce GTS 150M]
+ 0635 G94 [GeForce 9600 GSO]
+ 0637 G94 [GeForce 9600 GT]
+ 0638 G94 [Quadro FX 1800]
+ 063a G94M [Quadro FX 2700M]
+ 0640 G96 [GeForce 9500 GT]
+ 0641 G96 [GeForce 9400 GT]
+ 0643 G96 [GeForce 9500 GT]
+ 0644 G96 [GeForce 9500 GS]
+ 0645 G96 [GeForce 9500 GS]
+ 0646 G96 [GeForce GT 120]
+ 0647 G96 [GeForce 9600M GT]
+ 0648 G96 [GeForce 9600M GS]
+ 0649 G96 [GeForce 9600M GT]
+ 064a G96 [GeForce 9700M GT]
+ 064b G96 [GeForce 9500M G]
+ 064c G96 [GeForce 9650M GT]
+ 0651 G96 [GeForce G 110M]
+ 0652 G96 [GeForce GT 130M]
+ 0653 G96M [GeForce GT 120M]
+ 0654 G96 [GeForce GT 220M]
+ 0656 G96 [GeForce 9650 S]
+ 0658 G96 [Quadro FX 380]
+ 0659 G96 [Quadro FX 580]
+ 065a G96 [Quadro FX 1700M]
+ 065b G96 [GeForce 9400 GT]
+ 065c G96M [Quadro FX 770M]
+ 06c0 GF100 [GeForce GTX 480]
+ 06cd GF100 [GeForce GTX 470]
+ 06d1 GF100 [Tesla C2050 / C2070]
+ 06d2 GF100 [M2070]
+ 06d8 GF100 [Quadro 6000]
+ 06d9 GF100 [Quadro 5000]
+ 06dd GF100 [Quadro 4000]
+ 06de GF100 [Tesla S2050]
+ 06df GF100 [M2070Q]
+ 06e0 G98 [GeForce 9300 GE]
+ 06e1 G98 [GeForce 9300 GS]
+ 06e2 G98 [GeForce 8400]
+ 06e3 G98 [GeForce 8300 GS]
+ 06e4 G98 [GeForce 8400 GS]
+ 1458 3475 GV-NX84S256HE [GeForce 8400 GS]
+ 06e5 G98 [GeForce 9300M GS]
+ 06e6 G98 [GeForce G100]
+ 06e7 G98 [GeForce 9300 SE]
+ 06e8 G98 [GeForce 9200M GS]
+ 06e9 G98 [GeForce 9300M GS]
+ 1043 19b2 U6V laptop
+ 06ea G86M [Quadro NVS 150M]
+ 06eb G98M [Quadro NVS 160M]
+ 06ec G98M [GeForce G 105M]
+ 06ef G98M [GeForce G 103M]
+ 06f1 G98 [GeForce G105M]
+ 06f8 G98 [Quadro NVS 420]
+ 06f9 G98 [Quadro FX 370 LP]
+ 06fa G98 [Quadro NVS 450]
+ 06fb G98 [Quadro FX 370M]
+ 06fd G98 [Quadro NVS 295]
+ 06ff G98 [HICx16 + Graphics]
+ 0751 MCP78S [GeForce 8200] Memory Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0751 K10N78FullHD-hSLI R3.0 Memory Controller
+ 0752 MCP78S [GeForce 8200] SMBus
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0752 K10N78FullHD-hSLI R3.0 SMBus
+ 0753 MCP78S [GeForce 8200] Co-Processor
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0753 K10N78FullHD-hSLI R3.0 Co-Processor
+ 0754 MCP78S [GeForce 8200] Memory Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0754 K10N78FullHD-hSLI R3.0 Memory Controller
+ 0759 MCP78S [GeForce 8200] IDE
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0759 K10N78FullHD-hSLI R3.0 IDE
+ 075a MCP78S [GeForce 8200] PCI Bridge
+ 1043 82e8 M3N72-D
+ 1849 075a K10N78FullHD-hSLI R3.0 PCI Bridge
+ 075b MCP78S [GeForce 8200] PCI Express Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 075b K10N78FullHD-hSLI R3.0 PCI Express Bridge
+ 075c MCP78S [GeForce 8200] LPC Bridge
+ 1462 7508 K9N2GM-FIH
+ 1849 075c K10N78FullHD-hSLI R3.0 LPC Bridge
+ 075d MCP78S [GeForce 8200] LPC Bridge
+ 1043 82e8 M3N72-D
+ 0760 MCP77 Ethernet
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0760 K10N78FullHD-hSLI R3.0 Ethernet
+ 0761 MCP77 Ethernet
+ 0762 MCP77 Ethernet
+ 0763 MCP77 Ethernet
+ 0774 MCP72XE/MCP72P/MCP78U/MCP78S High Definition Audio
+# has a Realtek ALC1200 HDAudio Codec
+ 1043 82fe M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 3662 K10N78FullHD-hSLI R3.0 High Definition Audio
+ 0778 MCP78S [GeForce 8200] PCI Express Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 0778 K10N78FullHD-hSLI R3.0 PCI Express Bridge
+ 077a MCP78S [GeForce 8200] PCI Bridge
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077a K10N78FullHD-hSLI R3.0 PCI Bridge
+ 077b MCP78S [GeForce 8200] OHCI USB 1.1 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077b K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller
+ 077c MCP78S [GeForce 8200] EHCI USB 2.0 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077c K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller
+ 077d MCP78S [GeForce 8200] OHCI USB 1.1 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077d K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller
+ 077e MCP78S [GeForce 8200] EHCI USB 2.0 Controller
+ 1043 82e8 M3N72-D
+ 1462 7508 K9N2GM-FIH
+ 1849 077e K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller
+ 07c0 MCP73 Host Bridge
+ 1afa 7150 JW-IN7150-HD
+ 07c1 MCP73 Host Bridge
+ 1019 297a MCP73PVT-SM
+ 07c2 MCP73 Host Bridge
+ 07c5 MCP73 Host Bridge
+ 07c8 MCP73 Memory Controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07cb nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07cd nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07ce nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07cf nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d0 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d1 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d2 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d3 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d6 nForce 630i memory controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d7 MCP73 LPC Bridge
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d8 MCP73 SMBus
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07d9 MCP73 Memory Controller
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 07da MCP73 Co-processor
+ 1afa 7150 JW-IN7150-HD
+ 07dc MCP73 Ethernet
+ 07dd MCP73 Ethernet
+ 07de MCP73 Ethernet
+ 07df MCP73 Ethernet
+ 07e0 C73 [GeForce 7150 / nForce 630i]
+ 1afa 7150 JW-IN7150-HD
+ 07e1 C73 [GeForce 7100 / nForce 630i]
+ 1019 297a MCP73PVT-SM
+ 07e2 C73 [GeForce 7050 / nForce 630i]
+ 07e3 C73 [GeForce 7050 / nForce 610i]
+ 07e5 C73 [GeForce 7100 / nForce 620i]
+ 07f0 MCP73 IDE
+ 07f4 GeForce 7100/nForce 630i SATA
+ 1019 297a MCP73PVT-SM
+ 07f8 MCP73 SATA RAID Controller
+ 07fc MCP73 High Definition Audio
+ 1019 297a MCP73PVT-SM
+ 10de 07fc MCP73 High Definition Audio
+ 07fe GeForce 7100/nForce 630i USB
+ 1019 297a MCP73PVT-SM
+ 1afa 7150 JW-IN7150-HD
+ 0844 C77 [GeForce 9100M G]
+ 0845 C77 [GeForce 8200M G]
+ 0846 C77 [GeForce 9200]
+ 0847 C78 [GeForce 9100]
+ 0848 C77 [GeForce 8300]
+ 0849 C77 [GeForce 8200]
+ 1462 7508 K9N2GM-FIH
+ 1849 0849 K10N78FullHD-hSLI R3.0 GeForce 8200
+ 084a C77 [nForce 730a]
+ 084b C77 [GeForce 8200]
+ 084c C77 [nForce 780a SLI]
+ 084d C77 [nForce 750a SLI]
+ 1043 82e8 M3N72-D mGPU
+ 084f C77 [GeForce 8100 / nForce 720a]
+ 0860 C79 [GeForce 9300]
+ 0861 C79 [GeForce 9400]
+ 0862 C79 [GeForce 9400M G]
+ 0863 C79 [GeForce 9400M]
+ 0864 C79 [GeForce 9300]
+ 0865 C79 [GeForce 9300]
+ 0866 C79 [GeForce 9400M G]
+ 0867 C79 [GeForce 9400]
+ 0868 C79 [nForce 760i SLI]
+ 086a C79 [GeForce 9400]
+ 086c C79 [GeForce 9300 / nForce 730i]
+ 086d C79 [GeForce 9200]
+ 086e C79 [GeForce 9100M G]
+ 086f C79 [GeForce 9200M G]
+ 0870 C79 [GeForce 9400M]
+ 0871 C79 [GeForce 9200]
+ 0872 C79 [GeForce G102M]
+ 0873 C79 [GeForce G102M]
+ 0874 C79 [ION]
+ 0876 ION VGA [GeForce 9400M]
+ 087a C79 [GeForce 9400]
+ 087d ION VGA
+ 19da a123 IONITX-F-E
+ 087e ION LE VGA
+ 087f ION LE VGA
+ 08a4 GT216 [GeForce 320M]
+ 0a20 GT216 [GeForce GT 220]
+ 0a23 GT218 [GeForce 210]
+ 0a28 GT216 [GeForce GT 230M]
+ 0a29 GT216 [GeForce GT 330M]
+ 0a2a GT216 [GeForce GT 230M]
+ 0a2b GT216 [GeForce GT 330M]
+ 0a2c GT216 [NVS 5100M]
+ 0a2d GT216 [GeForce GT 320M]
+ 0a34 GT216 [GeForce GT 240M]
+ 0a35 GT216 [GeForce GT 325M]
+ 0a38 GT216GL [Quadro 400]
+ 0a3c GT216 [Quadro FX 880M]
+ 0a60 GT218 [GeForce G210]
+ 0a62 GT218 [GeForce 205]
+ 0a63 GT218 [GeForce 310]
+ 0a64 GT218 [ION]
+ 0a65 GT218 [GeForce 210]
+ 1043 8334 EN210 SILENT
+ 0a66 GT218 [GeForce 310]
+ 0a68 G98M [GeForce G105M]
+ 0a69 G98M [GeForce G105M]
+ 0a6a GT218 [NVS 2100M]
+ 0a6c GT218 [NVS 3100M]
+ 1028 040b Latitude E6510
+ 17aa 2142 ThinkPad T410
+ 0a6e GT218 [GeForce 305M]
+ 0a6f GT218 [ION]
+ 0a70 GT218 [GeForce 310M]
+ 0a71 GT218 [GeForce 305M]
+ 0a72 GT218 [GeForce 310M]
+ 0a73 GT218 [GeForce 305M]
+ 0a74 GT218 [GeForce G210M]
+ 0a75 GT218 [GeForce 310M]
+ 0a78 GT218GL [Quadro FX 380 LP]
+ 0a7c GT218 [Quadro FX 380M]
+ 0a80 MCP79 Host Bridge
+ 0a81 MCP79 Host Bridge
+ 0a82 MCP79 Host Bridge
+ 0a83 MCP79 Host Bridge
+ 0a84 MCP79 Host Bridge
+ 0a85 MCP79 Host Bridge
+ 0a86 MCP79 Host Bridge
+ 0a87 MCP79 Host Bridge
+ 0a88 MCP79 Memory Controller
+ 0a89 MCP79 Memory Controller
+ 0aa0 MCP79 PCI Express Bridge
+ 0aa2 MCP79 SMBus
+ 19da a123 IONITX-F-E
+ 0aa3 MCP79 Co-processor
+ 19da a123 IONITX-F-E
+ 0aa4 MCP79 Memory Controller
+ 19da a123 IONITX-F-E
+ 0aa5 MCP79 OHCI USB 1.1 Controller
+ 19da a123 IONITX-F-E
+ 0aa6 MCP79 EHCI USB 2.0 Controller
+ 19da a123 IONITX-F-E
+ 0aa7 MCP79 OHCI USB 1.1 Controller
+ 19da a123 IONITX-F-E
+ 0aa8 MCP79 OHCI USB 1.1 Controller
+ 0aa9 MCP79 EHCI USB 2.0 Controller
+ 19da a123 IONITX-F-E
+ 0aaa MCP79 EHCI USB 2.0 Controller
+ 0aab MCP79 PCI Bridge
+ 0aac MCP79 LPC Bridge
+ 0aad MCP79 LPC Bridge
+ 19da a123 IONITX-F-E
+ 0aae MCP79 LPC Bridge
+ 0aaf MCP79 LPC Bridge
+ 0ab0 MCP79 Ethernet
+ 19da a123 IONITX-F-E
+ 0ab1 MCP79 Ethernet
+ 0ab2 MCP79 Ethernet
+ 0ab3 MCP79 Ethernet
+ 0ab4 MCP79 SATA Controller
+ 19da a123 IONITX-F-E
+ 0ab5 MCP79 SATA Controller
+ 0ab6 MCP79 SATA Controller
+ 0ab7 MCP79 SATA Controller
+ 0ab8 MCP79 AHCI Controller
+ 0ab9 MCP79 AHCI Controller
+ 0aba MCP79 AHCI Controller
+ 0abb MCP79 AHCI Controller
+ 0abc MCP79 RAID Controller
+ 0abd MCP79 RAID Controller
+ 0abe MCP79 RAID Controller
+ 0abf MCP79 RAID Controller
+ 0ac0 MCP79 High Definition Audio
+ 0ac1 MCP79 High Definition Audio
+ 0ac2 MCP79 High Definition Audio
+ 0ac3 MCP79 High Definition Audio
+ 0ac4 MCP79 PCI Express Bridge
+ 0ac5 MCP79 PCI Express Bridge
+ 0ac6 MCP79 PCI Express Bridge
+ 0ac7 MCP79 PCI Express Bridge
+ 0ac8 MCP79 PCI Express Bridge
+ 0ad0 MCP78S [GeForce 8200] SATA Controller (non-AHCI mode)
+ 1462 7508 K9N2GM-FIH
+ 1849 0ad0 K10N78FullHD-hSLI R3.0 IDE
+ 0ad4 MCP78S [GeForce 8200] AHCI Controller
+ 1043 82e8 M3N72-D
+ 1849 0ad4 K10N78FullHD-hSLI R3.0 AHCI Controller
+ 0ad8 MCP78S [GeForce 8200] SATA Controller (RAID mode)
+ 0be2 High Definition Audio Controller
+ 0be3 High Definition Audio Controller
+ 1028 040b Latitude E6510
+ 10de 066d G98 [GeForce 8400GS]
+ 0be4 High Definition Audio Controller
+ 0be5 GF100 High Definition Audio Controller
+ 0be9 GF106 High Definition Audio Controller
+ 1558 8687 CLEVO/KAPOK W860CU
+ 0bea GF108 High Definition Audio Controller
+ 0beb GF104 High Definition Audio Controller
+ 1462 2322 N460GTX Cyclone 1GD5/OC
+ 0ca0 GT215 [GeForce GT 330]
+ 0ca2 GT215 [GeForce GT 320]
+ 0ca3 GT215 [GeForce GT 240]
+ 0ca4 GT215 [GeForce GT 340]
+ 0ca7 GT215 [GeForce GT 330]
+ 0ca8 GT215 [GeForce GTS 260M]
+ 0ca9 GT215 [GeForce GTS 250M]
+ 0caf GT215 [GeForce GT 335M]
+ 0cb0 GT215 [GeForce GTS 350M]
+ 0cb1 GT215 [GeForce GTS 360M]
+ 0cbc GT215 [Quadro FX 1800M]
+ 0d60 MCP89 HOST Bridge
+ 0d68 MCP89 Memory Controller
+ 0d69 MCP89 Memory Controller
+ 0d76 MCP89 PCI Express Bridge
+ 0d79 MCP89 SMBus
+ 0d7a MCP89 Co-Processor
+ 0d7b MCP89 Memory Controller
+ 0d7d MCP89 Ethernet
+ 0d80 MCP89 LPC Bridge
+ 0d85 MCP89 SATA Controller
+ 0d88 MCP89 SATA Controller (AHCI mode)
+ 0d89 MCP89 SATA Controller (AHCI mode)
+ 0d8d MCP89 SATA Controller (RAID mode)
+ 0d94 MCP89 High Definition Audio
+ 0d9c MCP89 OHCI USB 1.1 Controller
+ 0d9d MCP89 EHCI USB 2.0 Controller
+ 0dc4 GF106 [GeForce 450 GTS]
+# rev a1
+ 0dd1 GF106 [GeForce GTX 460M]
+ 1558 8687 CLEVO/KAPOK W860CU
+ 0dd2 GF106 [GeForce GT 445M]
+ 0dd8 GF106GL [Quadro 2000]
+ 0dda GF106 [Quadro 2000M]
+ 0de1 GF108 [GeForce GT 430]
+ 0dee GF108 [Geforce GT 415M]
+ 0df4 GF106 [GeForce GT 555M SDDR3]
+ 0df8 GF108 [Quadro 600]
+ 0dfa GF108 [Quadro 1000M]
+ 0e08 HDMI Audio stub
+ 0e09 GF110 High Definition Audio Controller
+ 0e22 GF104 [GeForce GTX 460]
+ 1462 2322 N460GTX Cyclone 1GD5/OC
+ 0e3a GF104 [Quadro 3000M]
+ 0e3b GF104 [Quadro 4000M]
+ 1056 GF108 [Quadro NVS 4200M]
+ 1080 GF110 [Geforce GTX 580]
+ 1081 GF110 [Geforce GTX 570]
+ 10de 087e Leadtek WinFast GTX 570
+ 1086 GF110 [Geforce GTX 570 HD]
+ 10c3 GT218 [GeForce 8400 GS]
+ 10de 066d G98 [GeForce 8400GS]
+ 10c5 M116N
+ 10d8 GT218 [NVS 300]
+ 1200 GF110 [GeForce GTX 560 Ti]
+ 1244 GF116 [GeForce GTX 550 Ti]
+10df Emulex Corporation
+ 1ae5 LP6000 Fibre Channel Host Adapter
+ e100 Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+ e131 LightPulse 8Gb/s PCIe Shared I/O Fibre Channel Adapter
+ e180 Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+ e200 Lancer-X: LightPulse Fibre Channel Host Adapter
+ e208 LightPulse 16Gb Fibre Channel Host Adapter (Lancer-VF)
+ e220 OneConnect NIC (Lancer)
+ e240 OneConnect iSCSI Initiator (Lancer)
+ e260 OneConnect FCoE Initiator (Lancer)
+ e268 OneConnect 10Gb FCoE Converged Network Adapter (Lancer-VF)
+ f011 Saturn: LightPulse Fibre Channel Host Adapter
+ f015 Saturn: LightPulse Fibre Channel Host Adapter
+ f085 LP850 Fibre Channel Host Adapter
+ f095 LP952 Fibre Channel Host Adapter
+ f098 LP982 Fibre Channel Host Adapter
+ f0a1 Thor LightPulse Fibre Channel Host Adapter
+ f0a5 Thor LightPulse Fibre Channel Host Adapter
+ f0b5 Viper LightPulse Fibre Channel Host Adapter
+ f0d1 Helios LightPulse Fibre Channel Host Adapter
+ f0d5 Helios LightPulse Fibre Channel Host Adapter
+ f0e1 Zephyr LightPulse Fibre Channel Host Adapter
+ f0e5 Zephyr LightPulse Fibre Channel Host Adapter
+ f0f5 Neptune LightPulse Fibre Channel Host Adapter
+ f100 Saturn-X: LightPulse Fibre Channel Host Adapter
+ f111 Saturn-X LightPulse Fibre Channel Host Adapter
+ f112 Saturn-X LightPulse Fibre Channel Host Adapter
+ f180 LPSe12002 EmulexSecure Fibre Channel Adapter
+ f700 LP7000 Fibre Channel Host Adapter
+ f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+ f800 LP8000 Fibre Channel Host Adapter
+ f801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+ f900 LP9000 Fibre Channel Host Adapter
+ f901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+ f980 LP9802 Fibre Channel Host Adapter
+ f981 LP9802 Fibre Channel Host Adapter Alternate ID
+ f982 LP9802 Fibre Channel Host Adapter Alternate ID
+ fa00 Thor-X LightPulse Fibre Channel Host Adapter
+ fb00 Viper LightPulse Fibre Channel Host Adapter
+ fc00 Thor-X LightPulse Fibre Channel Host Adapter
+ 10df fc00 LP10000 LightPulse Fibre Channel Host Adapter
+ fc10 Helios-X LightPulse Fibre Channel Host Adapter
+ fc20 Zephyr-X LightPulse Fibre Channel Host Adapter
+ fc40 Saturn-X: LightPulse Fibre Channel Host Adapter
+ fc50 Proteus-X: LightPulse IOV Fibre Channel Host Adapter
+ fd00 Helios-X LightPulse Fibre Channel Host Adapter
+ fd11 Helios-X LightPulse Fibre Channel Host Adapter
+ fd12 Helios-X LightPulse Fibre Channel Host Adapter
+ fe00 Zephyr-X LightPulse Fibre Channel Host Adapter
+ fe05 Zephyr-X: LightPulse FCoE Adapter
+ fe11 Zephyr-X LightPulse Fibre Channel Host Adapter
+ fe12 Zephyr-X LightPulse FCoE Adapter
+ ff00 Neptune LightPulse Fibre Channel Host Adapter
+10e0 Integrated Micro Solutions Inc.
+ 5026 IMS5026/27/28
+ 5027 IMS5027
+ 5028 IMS5028
+ 8849 IMS8849
+ 8853 IMS8853
+ 9128 IMS9128 [Twin turbo 128]
+10e1 Tekram Technology Co.,Ltd.
+ 0391 TRM-S1040
+ 10e1 0391 DC-315U SCSI-3 Host Adapter
+ 690c DC-690c
+ dc29 DC-290
+10e2 Aptix Corporation
+10e3 Tundra Semiconductor Corp.
+ 0000 CA91C042 [Universe]
+ 0108 Tsi108 Host Bridge for Single PowerPC
+ 0148 Tsi148 [Tempe]
+ 1775 1100 VR11 Single Board Computer
+ 0860 CA91C860 [QSpan]
+ 0862 CA91C862A [QSpan-II]
+ 8260 CA91L8200B [Dual PCI PowerSpan II]
+ 8261 CA91L8260B [Single PCI PowerSpan II]
+ a108 Tsi109 Host Bridge for Dual PowerPC
+10e4 Tandem Computers
+ 8029 Realtek 8029 Network Card
+10e5 Micro Industries Corporation
+10e6 Gainbery Computer Products Inc.
+10e7 Vadem
+10e8 Applied Micro Circuits Corp.
+ 1072 INES GPIB-PCI (AMCC5920 based)
+ 2011 Q-Motion Video Capture/Edit board
+ 4750 S5930 [Matchmaker]
+ 5920 S5920
+ 8043 LANai4.x [Myrinet LANai interface chip]
+ 8062 S5933_PARASTATION
+ 807d S5933 [Matchmaker]
+ 8088 Kongsberg Spacetec Format Synchronizer
+ 8089 Kongsberg Spacetec Serial Output Board
+ 809c S5933_HEPC3
+ 80b9 Harmonix Hi-Card P8 (4x active ISDN BRI)
+ 80d7 PCI-9112
+ 80d8 PCI-7200
+ 80d9 PCI-9118
+ 80da PCI-9812
+ 80fc APCI1500 Signal processing controller (16 dig. inputs + 16 dig. outputs)
+ 811a PCI-IEEE1355-DS-DE Interface
+ 814c Fastcom ESCC-PCI (Commtech, Inc.)
+ 8170 S5933 [Matchmaker] (Chipset Development Tool)
+ 81e6 Multimedia video controller
+ 828d APCI3001 Signal processing controller (up to 16 analog inputs)
+ 8291 Fastcom 232/8-PCI (Commtech, Inc.)
+ 82c4 Fastcom 422/4-PCI (Commtech, Inc.)
+ 82c5 Fastcom 422/2-PCI (Commtech, Inc.)
+ 82c6 Fastcom IG422/1-PCI (Commtech, Inc.)
+ 82c7 Fastcom IG232/2-PCI (Commtech, Inc.)
+ 82ca Fastcom 232/4-PCI (Commtech, Inc.)
+ 82db AJA HDNTV HD SDI Framestore
+ 82e2 Fastcom DIO24H-PCI (Commtech, Inc.)
+ 8406 PCIcanx/PCIcan CAN interface [Kvaser AB]
+ 8407 PCIcan II CAN interface (A1021, PCB-07, PCB-08) [Kvaser AB]
+ 8851 S5933 on Innes Corp FM Radio Capture card
+10e9 Alps Electric Co., Ltd.
+10ea Integraphics
+ 1680 IGA-1680
+ 1682 IGA-1682
+ 1683 IGA-1683
+ 2000 CyberPro 2000
+ 2010 CyberPro 2000A
+ 5000 CyberPro 5000
+ 5050 CyberPro 5050
+ 5202 CyberPro 5202
+# CyberPro5202 Audio Function
+ 5252 CyberPro5252
+10eb Artists Graphics
+ 0101 3GA
+ 8111 Twist3 Frame Grabber
+10ec Realtek Semiconductor Co., Ltd.
+ 0139 Zonet Zen3200
+ 0260 Realtek 260 High Definition Audio
+ 0261 Realtek 261 High Definition Audio
+ 0262 Realtek 262 High Definition Audio
+ 0269 Realtek ALC269 High Definition Audio (82801G)
+ 0280 Realtek 280 High Definition Audio
+ 0660 Realtek 660 High Definition Audio
+ 0662 Realtek 662 High Definition Audio
+ 0861 Realtek 861 High Definition Audio
+ 0862 Realtek 862 High Definition Audio
+ 0880 Realtek 880 High Definition Audio
+ 0883 Realtek 883 High Definition Audio
+ 1025 1605 TravelMate 5600 series
+ 0885 Realtek 885 High Definition Audio
+ 0888 Realtek 888 High Definition Audio
+ 1028 020d Inspiron 530
+ 8029 RTL-8029(AS)
+ 10b8 2011 EZ-Card (SMC1208)
+ 10ec 8029 RTL-8029(AS)
+ 1113 1208 EN1208
+ 1186 0300 DE-528
+ 1259 2400 AT-2400
+ 1af4 1100 Qemu virtual machine
+ 8129 RTL-8129
+ 10ec 8129 RT8129 Fast Ethernet Adapter
+ 11ec 8129 RT8129 Fast Ethernet Adapter
+ 8136 RTL8101E/RTL8102E PCI Express Fast Ethernet controller
+ 1179 ff64 RTL8102E PCI-E Fast Ethernet NIC
+ 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter
+ 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter
+ 8139 RTL-8139/8139C/8139C+
+ 0357 000a TTP-Monitoring Card V2.0
+ 1025 005a TravelMate 290
+ 1025 8920 ALN-325
+ 1025 8921 ALN-325
+ 103c 006a NX9500
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 103c 30d9 Presario C700
+ 1043 1045 L8400B or L3C/S notebook
+ 1043 8109 P5P800-MX Mainboard
+ 1071 8160 MIM2000
+ 10bd 0320 EP-320X-R
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1113 ec01 FNC-0107TX
+ 1186 1300 DFE-538TX
+ 1186 1320 SN5200
+ 1186 8139 DRN-32TX
+ 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter
+ 1259 2500 AT-2500TX
+ 1259 2503 AT-2500TX/ACPI
+ 1385 f31d FA311 v2
+ 1395 2100 AMB2100
+ 1429 d010 ND010/ND012
+ 1432 9130 EN-9130TX
+ 1436 8139 RT8139
+ 144d c00c P30/P35 notebook
+ 1458 e000 GA-7VM400M/7VT600 Motherboard
+ 1462 0131 MS-1013 Notebook
+ 1462 217c Aspire L250
+ 1462 788c 865PE Neo2-V Mainboard
+ 146c 1439 FE-1439TX
+ 1489 6001 GF100TXRII
+ 1489 6002 GF100TXRA
+ 149c 139a LFE-8139ATX
+ 149c 8139 LFE-8139TX
+ 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet
+ 1565 2300 P4TSV Onboard LAN (RTL8100B)
+ 1631 7003 Onboard RTL8111 on GA-8SIML Rev1.0 Mainboard
+ 1695 9001 Onboard RTL8101L 10/100 MBit
+ 16ec 00ff USR997900A
+ 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card
+ 1799 5010 F5D5010 CardBus Notebook Network Card
+ 187e 3303 FN312
+ 1904 8139 RTL8139D Fast Ethernet Adapter
+ 2646 0001 KNE120TX
+ 8e2e 7000 KF-230TX
+ 8e2e 7100 KF-230TX/2
+ a0a0 0007 ALN-325C
+ 8167 RTL-8110SC/8169SC Gigabit Ethernet
+ 1458 e000 GA-MA69G-S3H Motherboard
+ 1462 235c P965 Neo MS-7235 mainboard
+ 1462 236c 945P Neo3-F motherboard
+ 8168 RTL8111/8168B PCI Express Gigabit Ethernet controller
+ 1019 8168 MCP73PVT-SM
+ 103c 1611 Pavilion DM1Z-3000
+ 1043 11f5 A6J-Q008
+ 1043 16d5 U6V/U31J laptop
+ 1043 81aa P5B
+ 1043 82c6 M3A78-EH Motherboard
+ 1043 83a3 M4A785TD Motherboard
+ 1043 8432 P8P67 Deluxe Motherboard [Realtek RTL8111E]
+ 10ec 8168 TEG-ECTX Gigabit PCI-E Adapter [Trendnet]
+ 1458 e000 GA-EP45-DS5 Motherboard
+ 1462 238c Onboard RTL8111b on MSI P965 Platinum Mainboard
+ 1462 368c K9AG Neo2
+ 1775 11cc CC11/CL11
+ 1849 8168 Motherboard (one of many)
+ 8086 d615 DeskTop Board D510MO
+ 8169 RTL-8169 Gigabit Ethernet
+ 1025 0079 Aspire 5024WLMi
+ 10bd 3202 EP-320G-TX1 32-bit PCI Gigabit Ethernet Adapter
+ 10ec 8169 RTL8169/8110 Family PCI Gigabit Ethernet NIC
+ 1259 c107 CG-LAPCIGT
+ 1371 434e ProG-2000L
+ 1385 311a GA311
+ 1458 e000 GA-8I915ME-G Mainboard
+ 1462 030c K8N Neo-FSR v2.0 mainboard
+ 1462 065c Hetis 865GV-E (MS-7065)
+ 1462 702c K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 16ec 011f USR997903
+ 1734 1091 D2030-A1
+ a0a0 0449 AK86-L motherboard
+ 8171 RTL8191SEvA Wireless LAN Controller
+ 8172 RTL8191SEvB Wireless LAN Controller
+ 8173 RTL8192SE Wireless LAN Controller
+ 8174 RTL8192SE Wireless LAN Controller
+ 8176 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8177 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8178 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8180 RTL8180L 802.11b MAC
+ 1385 4700 MA521 802.11b Wireless PC Card
+ 1737 0019 WPC11v4 802.11b Wireless-B Notebook Adapter
+ 8185 RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller
+ 8191 RTL8188CE 802.11b/g/n WiFi Adapter
+ 8192 RTL8192E/RTL8192SE Wireless LAN Controller
+ 8197 SmartLAN56 56K Modem
+ 8199 RTL8187SE Wireless LAN Controller
+10ed Ascii Corporation
+ 7310 V7310
+10ee Xilinx Corporation
+ 0001 EUROCOM for PCI (ECOMP)
+ 0002 Octal E1/T1 for PCI ETP Card
+ 0007 Zomojo Z1
+ 0205 Wildcard TE205P
+ 0210 Wildcard TE210P
+ 0314 Wildcard TE405P/TE410P (1st Gen)
+ 0405 Wildcard TE405P (2nd Gen)
+ 0410 Wildcard TE410P (2nd Gen)
+ 2b00 Zomojo Zcard
+ 3fc0 RME Digi96
+ 3fc1 RME Digi96/8
+ 3fc2 RME Digi96/8 Pro
+ 3fc3 RME Digi96/8 Pad
+ 3fc4 RME Digi9652 (Hammerfall)
+ 3fc5 RME Hammerfall DSP
+ 3fc6 RME Hammerfall DSP MADI
+ 8380 Ellips ProfiXpress Profibus Master
+ 8381 Ellips Santos Frame Grabber
+ d154 Copley Controls CAN card (PCI-CAN-02)
+# SED is assigned Xilinx PCI device IDs ebf0 through ebff
+ ebf0 SED Systems Modulator/Demodulator
+ ebf1 SED Systems Audio Interface Card
+ ebf2 SED Systems Common PCI Interface
+10ef Racore Computer Products, Inc.
+ 8154 M815x Token Ring Adapter
+10f0 Peritek Corporation
+10f1 Tyan Computer
+ 2865 Tyan Thunder K8E S2865
+ 5300 Tyan S5380 Mainboard
+10f2 Achme Computer, Inc.
+10f3 Alaris, Inc.
+10f4 S-MOS Systems, Inc.
+10f5 NKK Corporation
+ a001 NDR4000 [NR4600 Bridge]
+10f6 Creative Electronic Systems SA
+10f7 Matsushita Electric Industrial Co., Ltd.
+10f8 Altos India Ltd
+10f9 PC Direct
+10fa Truevision
+ 000c TARGA 1000
+10fb Thesys Gesellschaft fuer Mikroelektronik mbH
+ 186f TH 6255
+10fc I-O Data Device, Inc.
+# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives
+ 0003 Cardbus IDE Controller
+ 0005 Cardbus SCSI CBSC II
+10fd Soyo Computer, Inc
+10fe Fast Multimedia AG
+10ff NCube
+1100 Jazz Multimedia
+1101 Initio Corporation
+ 0002 INI-920 Ultra SCSI Adapter
+ 1060 INI-A100U2W
+ 1622 INI-1623 PCI SATA-II Controller
+ 9100 INI-9100/9100W
+ 9400 INI-940 Fast Wide SCSI Adapter
+ 9401 INI-935 Fast Wide SCSI Adapter
+ 9500 INI-950 SCSI Adapter
+ 9502 INI-950P Ultra Wide SCSI Adapter
+1102 Creative Labs
+ 0002 SB Live! EMU10k1
+ 100a 1102 SB Live! 5.1 Digital OEM SB0220 EMU10K1-JFF
+ 1102 0020 CT4850 SBLive! Value
+ 1102 0021 CT4620 SBLive!
+ 1102 002f SBLive! mainboard implementation
+ 1102 100a SB Live! 5.1 Digital OEM [SB0220]
+ 1102 4001 E-mu APS
+ 1102 8022 CT4780 SBLive! Value
+ 1102 8023 CT4790 SoundBlaster PCI512
+ 1102 8024 CT4760 SBLive!
+ 1102 8025 SBLive! Mainboard Implementation
+ 1102 8026 CT4830 SBLive! Value
+ 1102 8027 CT4832 SBLive! Value
+ 1102 8028 CT4760 SBLive! OEM version
+ 1102 8031 CT4831 SBLive! Value
+ 1102 8040 CT4760 SBLive!
+ 1102 8051 CT4850 SBLive! Value
+ 1102 8061 SBLive! Player 5.1
+ 1102 8064 SBLive! 5.1 Model SB0100
+ 1102 8065 SBLive! 5.1 Digital Model SB0220
+ 1102 8066 Live! 5.1 Digital [SB0228]
+ 1102 8067 SBLive! 5.1 eMicro 28028
+ 0004 SB Audigy
+ 1102 0051 SB0090 Audigy Player
+ 1102 0053 SB0090 Audigy Player/OEM
+ 1102 0058 SB0090 Audigy Player/OEM
+ 1102 1002 SB Audigy2 Platinum
+ 1102 1007 SB0240 Audigy 2 Platinum 6.1
+ 1102 1009 SB Audigy2 OEM HP
+ 1102 2002 SB Audigy 2 ZS (SB0350)
+ 1102 4001 E-MU 1010
+ 0005 SB X-Fi
+ 1102 0021 X-Fi Platinum
+ 1102 002c X-Fi XtremeGamer FATAL1TY PRO
+ 1102 1003 X-Fi XtremeMusic
+ 0006 [SB Live! Value] EMU10k1X
+ 0007 CA0106 Soundblaster
+ 1102 0007 SBLive! 24bit
+ 1102 1001 SB0310 Audigy LS
+ 1102 1002 SB0312 Audigy LS
+ 1102 1006 SB0410 SBLive! 24-bit
+ 1102 100a SB0570 [SB Audigy SE]
+ 1102 1012 SB0790 X-Fi XA
+ 1102 1013 Soundblaster X-Fi Xtreme Audio
+ 1462 1009 K8N Diamond
+ 0008 SB0400 Audigy2 Value
+ 1102 0008 EMU0404 Digital Audio System
+ 1102 4004 EMU1010 Digital Audio System [MAEM8960]
+ 0009 [SB X-Fi Xtreme Audio] CA0110-IBG
+ 1102 0010 [SB X-Fi Xtreme Audio] CA0110-IBG
+ 1102 0018 SB1040
+ 000b X-Fi Titanium series [EMU20k2]
+ 1102 0041 SB X-Fi Titanium PCI-e [SB0880]
+ 4001 SB Audigy FireWire Port
+ 1102 0010 SB Audigy FireWire Port
+ 7002 SB Live! Game Port
+ 1102 0020 Gameport Joystick
+ 7003 SB Audigy Game Port
+ 1102 0040 SB Audigy Game Port
+ 1102 0060 SB Audigy2 MIDI/Game Port
+ 7004 [SB Live! Value] Input device controller
+ 7005 SB Audigy LS Game Port
+ 1102 1001 SB0310 Audigy LS MIDI/Game port
+ 1102 1002 SB0312 Audigy LS MIDI/Game port
+ 7006 [SB X-Fi Xtreme Audio] CA0110-IBG PCI to PCIe Bridge
+ 8938 Ectiva EV1938
+ 1033 80e5 SlimTower-Jim (NEC)
+ 1071 7150 Mitac 7150
+ 110a 5938 Siemens Scenic Mobile 510PIII
+ 13bd 100c Ceres-C (Sharp, Intel BX)
+ 13bd 100d Sharp, Intel Banister
+ 13bd 100e TwinHead P09S/P09S3 (Sharp)
+ 13bd f6f1 Marlin (Sharp)
+ 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp)
+ 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp)
+ 156d b400 G400 - Geo (AlphaTop (Taiwan))
+ 156d b550 G560 (AlphaTop (Taiwan))
+ 156d b560 G560 (AlphaTop (Taiwan))
+ 156d b700 G700/U700 (AlphaTop (Taiwan))
+ 156d b795 G795 (AlphaTop (Taiwan))
+ 156d b797 G797 (AlphaTop (Taiwan))
+# nee Triones Technologies, Inc.
+1103 HighPoint Technologies, Inc.
+ 0003 HPT343/345/346/363
+ 0004 HPT366/368/370/370A/372/372N
+ 1103 0001 HPT370A
+ 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4)
+ 1103 0005 HPT370 UDMA100
+ 1103 0006 HPT302/302N
+ 0005 HPT372A/372N
+ 0006 HPT302/302N
+ 0007 HPT371/371N
+ 0008 HPT374
+ 0009 HPT372N
+ 1720 RocketRAID 1720 (2x SATA II RAID Controller)
+ 1740 RocketRAID 1740
+ 1742 RocketRAID 1742
+ 2210 RocketRAID 2210 SATA-II Controller
+ 2300 RocketRAID 230x 4 Port SATA-II Controller
+ 2310 RocketRAID 2310 4 Port SATA-II Controller
+ 2320 RocketRAID 2320 SATA-II Controller
+ 2322 RocketRAID 2322 SATA-II Controller
+ 2340 RocketRAID 2340 16 Port SATA-II Controller
+ 2640 RocketRAID 2640 SAS/SATA Controller
+ 2722 RocketRAID 2722
+ 3220 RocketRAID 3220
+ 3320 RocketRAID 3320
+1104 RasterOps Corp.
+1105 Sigma Designs, Inc.
+ 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder
+ 8300 REALmagic Hollywood Plus DVD Decoder
+ 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder
+ 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder
+ 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder
+ 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder
+ 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder
+ 1105 0001 REALmagic X-Card
+ 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder
+ 127d 0000 CineView II
+ 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder
+ 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder
+ c622 EM8622L MPEG-4.10 (H.264) and SMPTE 421M (VC-1) A/V Decoder
+1106 VIA Technologies, Inc.
+ 0102 Embedded VIA Ethernet Controller
+ 0130 VT6305 1394.A Controller
+ 0198 P4X600 Host Bridge
+ 0204 K8M800 Host Bridge
+ 0208 PT890 Host Bridge
+ 0238 K8T890 Host Bridge
+ 0258 PT880 Host Bridge
+ 0259 CN333/CN400/PM880 Host Bridge
+ 0269 KT880 Host Bridge
+ 0282 K8T800Pro Host Bridge
+ 1043 80a3 A8V Deluxe
+ 0290 K8M890 Host Bridge
+ 0293 PM896 Host Bridge
+ 0296 P4M800 Host Bridge
+ 0305 VT8363/8365 [KT133/KM133]
+ 1019 0987 K7VZA Mainboard
+ 1043 8033 A7V Mainboard
+ 1043 803e A7V-E Mainboard
+ 1043 8042 A7V133/A7V133-C Mainboard
+ 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard
+ 0308 PT880 Ultra/PT894 Host Bridge
+ 1043 8199 P4V800D-X Mainboard
+ 0314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 0324 CX700/VX700 Host Bridge
+ 0327 P4M890 Host Bridge
+ 0336 K8M890CE Host Bridge
+ 0340 PT900 Host Bridge
+ 0351 K8T890CF Host Bridge
+ 0353 VX800 Host Bridge
+ 0364 CN896/VN896/P4M900 Host Bridge
+ 1043 81ce P5VD2-VM mothervoard
+ 0391 VT8371 [KX133]
+ 0397 VT1708S HD Audio
+ 1043 836c P7H55
+ 1043 83c7 P5KPL-AM EPU
+ 0409 VX855/VX875 Host Bridge: Host Control
+ 0415 VT6415 PATA IDE Host Controller
+ 1043 838f M5A88-V EVO
+ 0501 VT8501 [Apollo MVP4]
+ 0505 VT82C505
+# Shares chip with :0576. The VT82C576M has :1571 instead of :0561.
+ 0561 VT82C576MV
+ 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE
+ 1019 0985 P6VXA Motherboard
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 8052 VT8233A Bus Master ATA100/66/33 IDE
+ 1043 808c A7V8X / A7V333 motherboard
+ 1043 80a1 A7V8X-X motherboard rev. 1.01
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE
+ 1179 0001 Magnia Z310
+ 1297 f641 FX41 motherboard
+ 1458 5002 GA-7VAX Mainboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7120 KT4AV motherboard
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 1849 0571 K7VT2/K7VT6 motherboard
+ 0576 VT82C576 3V [Apollo Master]
+ 0581 CX700/VX700 RAID Controller
+# Upgrade bios to get correct ID: 5324 instead of 0581
+ 1106 0581 Wrong IDE ID
+ 0585 VT82C585VP [Apollo VP1/VPX]
+ 0586 VT82C586/A/B PCI-to-ISA [Apollo VP]
+ 1106 0000 MVP3 ISA Bridge
+ 0591 VT8237A SATA 2-Port Controller
+ 0595 VT82C595 [Apollo VP2]
+ 0596 VT82C596 ISA [Mobile South]
+ 1106 0000 VT82C596/A/B PCI to ISA Bridge
+ 1458 0596 VT82C596/A/B PCI to ISA Bridge
+ 0597 VT82C597 [Apollo VP3]
+ 0598 VT82C598 [Apollo MVP3]
+ 0601 VT8601 [Apollo ProMedia]
+ 0605 VT8605 [ProSavage PM133]
+ 103c 1254 D9840-60001 [Brio BA410 Motherboard]
+ 1043 802c CUV4X mainboard
+ 0680 VT82C680 [Apollo P6]
+ 0686 VT82C686 [Apollo Super South]
+ 1019 0985 P6VXA Motherboard
+ 103c 1256 D9840-60001 [Brio BA410 Motherboard]
+ 1043 802c CUV4X mainboard
+ 1043 8033 A7V Mainboard
+ 1043 803e A7V-E Mainboard
+ 1043 8040 A7M266 Mainboard
+ 1043 8042 A7V133/A7V133-C Mainboard
+ 1106 0000 VT82C686/A PCI to ISA Bridge
+ 1106 0686 VT82C686/A PCI to ISA Bridge
+ 1179 0001 Magnia Z310
+ 147b a702 KG7-Lite Mainboard
+ 0691 VT82C693A/694x [Apollo PRO133x]
+ 1019 0985 P6VXA Motherboard
+ 1179 0001 Magnia Z310
+ 1458 0691 VT82C691 Apollo Pro System Controller
+ 0693 VT82C693 [Apollo Pro Plus]
+ 0698 VT82C693A [Apollo Pro133 AGP]
+ 0926 VT82C926 [Amazon]
+ 1000 VT82C570MV
+ 1106 VT82C570MV
+ 1122 VX800/VX820 Chrome 9 HC3 Integrated Graphics
+ 1204 K8M800 Host Bridge
+ 1208 PT890 Host Bridge
+ 1238 K8T890 Host Bridge
+ 1258 PT880 Host Bridge
+ 1259 CN333/CN400/PM880 Host Bridge
+ 1269 KT880 Host Bridge
+ 1282 K8T800Pro Host Bridge
+ 1290 K8M890 Host Bridge
+ 1293 PM896 Host Bridge
+ 1296 P4M800 Host Bridge
+ 1308 PT894 Host Bridge
+ 1314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 1324 CX700/VX700 Host Bridge
+ 1327 P4M890 Host Bridge
+ 1336 K8M890CE Host Bridge
+ 1340 PT900 Host Bridge
+ 1351 VT3351 Host Bridge
+ 1353 VX800/VX820 Error Reporting
+ 1364 CN896/VN896/P4M900 Host Bridge
+ 1409 VX855/VX875 Error Reporting
+ 1571 VT82C576M/VT82C586
+ 1595 VT82C595/97 [Apollo VP2/97]
+ 1732 VT1732 [Envy24 II] PCI Multi-Channel Audio Controller
+ 2106 VIA Rhine Family Fast Ethernet Adapter (VT6105)
+ 2204 K8M800 Host Bridge
+ 2208 PT890 Host Bridge
+ 2238 K8T890 Host Bridge
+ 2258 PT880 Host Bridge
+ 2259 CN333/CN400/PM880 CPU Host Bridge
+ 2269 KT880 Host Bridge
+ 2282 K8T800Pro Host Bridge
+ 2290 K8M890 Host Bridge
+ 2293 PM896 Host Bridge
+ 2296 P4M800 Host Bridge
+ 2308 PT894 Host Bridge
+ 2314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 2324 CX700/VX700 Host Bridge
+ 2327 P4M890 Host Bridge
+ 2336 K8M890CE Host Bridge
+ 2340 PT900 Host Bridge
+ 2351 VT3351 Host Bridge
+ 2353 VX800/VX820 Host Bus Control
+ 2364 CN896/VN896/P4M900 Host Bridge
+ 2409 VX855/VX875 Host Bus Control
+ 287a VT8251 PCI to PCI Bridge
+ 287b VT8251 Host Bridge
+ 287c VT8251 PCIE Root Port
+ 287d VT8251 PCIE Root Port
+ 287e VT8251 Ultra VLINK Controller
+ 3022 CLE266
+ 3038 VT82xxxxx UHCI USB 1.1 Controller
+# possibly Hewlett-Packard D9840-60001 [Brio BA410 Motherboard]
+ 0925 1234 VA-502 Mainboard
+ 1019 0985 P6VXA Motherboard
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 8080 A7V333 motherboard
+ 1043 808c VT6202 USB2.0 4 port controller
+ 1043 80a1 A7V8X-X motherboard
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1179 0001 Magnia Z310
+ 1458 5004 GA-7VAX Mainboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7120 KT4AV motherboard
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 182d 201d CN-029 USB2.0 4 port PCI Card
+ 1849 3038 K7VT6
+ 3040 VT82C586B ACPI
+ 3043 VT86C100A [Rhine]
+ 10bd 0000 VT86C100A Fast Ethernet Adapter
+ 1106 0100 VT86C100A Fast Ethernet Adapter
+ 1186 1400 DFE-530TX rev A
+ 3044 VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller
+ 0010 0001 IEEE 1394 4port DCST 1394-3+1B
+ 1025 005a TravelMate 290
+ 103c 2a20 Pavilion t3030.de Desktop PC
+ 1043 808a A8V/A8N/P4P800 series motherboard
+ 1043 81fe M4A series motherboard
+ 1458 1000 GA-7VT600-1394 Motherboard
+ 1462 207d K8NGM2 series motherboard
+ 1462 217d Aspire L250
+ 1462 590d KT6 Delta-FIS2R (MS-6590)
+ 1462 702d K8T NEO 2 motherboard
+ 1462 971d MS-6917
+ 3050 VT82C596 Power Management
+ 3051 VT82C596 Power Management
+ 3053 VT6105M [Rhine-III]
+ 3057 VT82C686 [Apollo Super ACPI]
+ 1019 0985 P6VXA Motherboard
+ 1019 0987 K7VZA Motherboard
+ 1043 8033 A7V Mainboard
+ 1043 803e A7V-E Mainboard
+ 1043 8040 A7M266 Mainboard
+ 1043 8042 A7V133/A7V133-C Mainboard
+ 1179 0001 Magnia Z310
+ 3058 VT82C686 AC97 Audio Controller
+ 0e11 0097 SoundMax Digital Integrated Audio
+ 0e11 b194 Soundmax integrated digital audio
+ 1019 0985 P6VXA Motherboard
+ 1019 0987 K7VZA Motherboard
+ 103c 1251 D9840-60001 [Brio BA410 Motherboard]
+ 1043 1106 A7V133/A7V133-C Mainboard
+ 1106 4511 Onboard Audio on EP7KXA
+ 1106 aa03 VT1612A AC'97 Audio Controller
+ 11d4 5348 AD1881A audio
+ 1458 7600 Onboard Audio
+ 1462 3091 MS-6309 Onboard Audio
+ 1462 3092 MS-6309 v2.x Mainboard (VIA VT1611A codec)
+ 1462 3300 MS-6330 Onboard Audio
+ 15dd 7609 Onboard Audio
+ 3059 VT8233/A/8235/8237 AC97 Audio Controller
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1019 1877 K8M800-M2 (V2.0) onboard audio
+ 1043 8095 A7V8X Motherboard (Realtek ALC650 codec)
+ 1043 80a1 A7V8X-X Motherboard
+ 1043 80b0 A7V600/K8V-X/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX])
+ 1043 810d Asus P5VD1-X (AD1888 codec [SoundMax])
+ 1043 812a A8V Deluxe motherboard (Realtek ALC850 codec)
+ 10ec 8168 High Definition Audio
+ 1106 3059 L7VMM2 Motherboard
+ 1106 4161 K7VT2 motherboard
+ 1106 4170 PCPartner P4M800-8237R Motherboard
+ 1106 4552 Soyo KT-600 Dragon Plus (Realtek ALC 650)
+ 1297 c160 FX41 motherboard (Realtek ALC650 codec)
+ 1413 147b KV8 Pro motherboard onboard audio
+ 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650)
+ 1462 0080 K8T NEO 2 motherboard
+ 1462 3800 KT266 onboard audio
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 1695 300c EP-8KRA2+ Mainboard
+ 1849 0850 ASRock 775Dual-880 Pro onboard audio (Realtek ALC850)
+ 1849 9739 P4VT8 Mainboard (C-Media CMI9739A codec)
+ 1849 9761 K7VT6 motherboard
+ 4005 4710 MSI K7T266 Pro2-RU (MSI-6380 v2) onboard audio (Realtek/ALC 200/200P)
+ a0a0 01b6 AK77-8XN onboard audio
+ a0a0 0342 AK86-L motherboard
+ 3065 VT6102 [Rhine-II]
+ 1043 80a1 A7V8X-X Motherboard
+ 1043 80ed A7V600-X Motherboard
+ 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235
+ 1186 1400 DFE-530TX rev A
+ 1186 1401 DFE-530TX rev B
+ 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B)
+ 1462 7061 MS-7061
+ 1462 7181 K8MM3-V mainboard
+ 147b 1c09 NV7 Motherboard
+ 1695 3005 VT6103
+ 1695 300c Realtek ALC655 sound chip
+ 1849 3065 K7VT6 motherboard
+# This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs
+ 3068 AC'97 Modem Controller
+ 1462 309e MS-6309 Saturn Motherboard
+ 3074 VT8233 PCI to ISA Bridge
+ 1043 8052 VT8233A
+ 3091 VT8633 [Apollo Pro266]
+ 3099 VT8366/A/7 [Apollo KT266/A/333]
+ 1043 8064 A7V266-E Mainboard
+ 1043 807f A7V333 Mainboard
+ 1849 3099 K7VT2 motherboard
+ 3101 VT8653 Host Bridge
+ 3102 VT8662 Host Bridge
+ 3103 VT8615 Host Bridge
+ 3104 USB 2.0
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 808c A7V8X motherboard
+ 1043 80a1 A7V8X-X motherboard rev 1.01
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1297 f641 FX41 motherboard
+ 1458 5004 GA-7VAX Mainboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T NEO 2 motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7120 KT4AV motherboard
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 182d 201d CN-029 USB 2.0 4 port PCI Card
+ 1849 3104 K7VT6 motherboard
+ 3106 VT6105/VT6106S [Rhine-III]
+ 1106 0105 VT6106S [Rhine-III]
+ 1186 1403 DFE-530TX rev C
+ 1186 1406 DFE-530TX+ rev F2
+ 1186 1407 DFE-538TX
+ 3108 K8M800/K8N800/K8N800A [S3 UniChrome Pro]
+ 3109 VT8233C PCI to ISA Bridge
+ 3112 VT8361 [KLE133] Host Bridge
+ 3113 VPX/VPX2 PCI to PCI Bridge Controller
+ 3116 VT8375 [KM266/KL266] Host Bridge
+ 1297 f641 FX41 motherboard
+ 3118 CN400/PM800/PM880/PN800/PN880 [S3 UniChrome Pro]
+ 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter
+ 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics
+ 3123 VT8623 [Apollo CLE266]
+ 3128 VT8753 [P4X266 AGP]
+ 3133 VT3133 Host Bridge
+ 3142 VT6651 WiFi Adapter, 802.11b
+ 3147 VT8233A ISA Bridge
+ 1043 808c A7V333 motherboard
+ 3148 P4M266 Host Bridge
+ 3149 VIA VT6420 SATA RAID Controller
+ 1043 80ed A7V600/K8V Deluxe/K8V-X/A8V Deluxe motherboard
+ 1458 b003 GA-7VM400AM(F) Motherboard
+ 1462 5901 KT6 Delta-FIS2R (MS-6590)
+ 1462 7020 K8T Neo 2 Motherboard
+ 1462 7094 K8T Neo2-F V2.0
+ 1462 7181 K8MM3-V mainboard
+ 147b 1407 KV8-MAX3 motherboard
+ 147b 1408 KV7
+ 1849 3149 K7VT6 motherboard
+ a0a0 04ad AK86-L motherboard
+ 3156 P/KN266 Host Bridge
+ 3157 CX700/VX700 [S3 UniChrome Pro]
+ 3164 VT6410 ATA133 RAID controller
+ 1043 80f4 P4P800 Mainboard Deluxe ATX
+ 1462 7028 915P/G Neo2
+ 3168 P4X333/P4X400/PT800 AGP Bridge
+ 1849 3168 P4VT8 Mainboard
+ 3177 VT8235 ISA Bridge
+ 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
+ 1043 808c A7V8X motherboard
+ 1043 80a1 A7V8X-X motherboard
+ 1106 0000 KT4AV motherboard
+ 1297 f641 FX41 motherboard
+ 1458 5001 GA-7VAX Mainboard
+ 1849 3177 K7VT2 motherboard
+ 3178 ProSavageDDR P4N333 Host Bridge
+ 3188 VT8385 [K8T800 AGP] Host Bridge
+ 1043 80a3 K8V Deluxe/K8V-X motherboard
+ 147b 1407 KV8-MAX3 motherboard
+ 3189 VT8377 [KT400/KT600 AGP] Host Bridge
+ 1043 807f A7V8X motherboard
+ 1106 0000 KT4AV motherboard (KT400A)
+ 1458 5000 GA-7VAX Mainboard
+ 1849 3189 K7VT6 motherboard
+ 3204 K8M800 Host Bridge
+ 3205 VT8378 [KM400/A] Chipset Host Bridge
+ 1458 5000 GA-7VM400M Motherboard
+ 3208 PT890 Host Bridge
+ 3213 VPX/VPX2 PCI to PCI Bridge Controller
+ 3218 K8T800M Host Bridge
+ 3227 VT8237 ISA bridge [KT600/K8T800/K8T890 South]
+ 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
+ 1106 3227 DFI KT600-AL / Soltek SL-B9D-FGR Motherboard
+ 1458 5001 GA-7VT600 Motherboard
+ 147b 1407 KV8-MAX3 motherboard
+ 1849 3227 K7VT4 motherboard
+ 3230 K8M890CE/K8N890CE [Chrome 9]
+ 3238 K8T890 Host Bridge
+ 3249 VT6421 IDE RAID Controller
+ 324a CX700/VX700 PCI to PCI Bridge
+ 324b CX700/VX700 Host Bridge
+ 324e CX700/VX700 Internal Module Bus
+ 3253 VT6655 WiFi Adapter, 802.11a/b/g
+ 3258 PT880 Host Bridge
+ 3259 CN333/CN400/PM880 Host Bridge
+ 3260 VIA Chrome9 HC IGP
+ 3269 KT880 Host Bridge
+ 3282 K8T800Pro Host Bridge
+ 3287 VT8251 PCI to ISA Bridge
+ 3288 VT1708/A [Azalia HDAC] (VIA High Definition Audio Controller)
+ 3290 K8M890 Host Bridge
+ 3296 P4M800 Host Bridge
+ 3324 CX700/VX700 Host Bridge
+ 3327 P4M890 Host Bridge
+ 3336 K8M890CE Host Bridge
+ 3337 VT8237A PCI to ISA Bridge
+ 3340 PT900 Host Bridge
+ 3343 P4M890 [S3 UniChrome Pro]
+ 3344 CN700/P4M800 Pro/P4M800 CE/VN800 [S3 UniChrome Pro]
+ 3349 VT8251 AHCI/SATA 4-Port Controller
+ 3351 VT3351 Host Bridge
+ 3353 VX800 PCI to PCI Bridge
+ 3364 CN896/VN896/P4M900 Host Bridge
+ 3371 CN896/VN896/P4M900 [Chrome 9 HC]
+ 3372 VT8237S PCI to ISA Bridge
+ 337a VT8237A PCI to PCI Bridge
+ 337b VT8237A Host Bridge
+ 3403 VT6315 Series Firewire Controller
+ 1043 8374 M5A88-V EVO
+ 1043 8384 P8P67 Deluxe Motherboard
+ 3409 VX855/VX875 DRAM Bus Control
+ 4149 VIA VT6420 (ATA133) Controller
+ 4204 K8M800 Host Bridge
+ 4208 PT890 Host Bridge
+ 4238 K8T890 Host Bridge
+ 4258 PT880 Host Bridge
+ 4259 CN333/CN400/PM880 Host Bridge
+ 4269 KT880 Host Bridge
+ 4282 K8T800Pro Host Bridge
+ 4290 K8M890 Host Bridge
+ 4293 PM896 Host Bridge
+ 4296 P4M800 Host Bridge
+ 4308 PT894 Host Bridge
+ 4314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 4324 CX700/VX700 Host Bridge
+ 4327 P4M890 Host Bridge
+ 4336 K8M890CE Host Bridge
+ 4340 PT900 Host Bridge
+ 4351 VT3351 Host Bridge
+ 4353 VX800/VX820 Power Management Control
+ 4364 CN896/VN896/P4M900 Host Bridge
+ 4397 VT1708B/1702S/1708S HD audio codec
+ 4409 VX855/VX875 Power Management Control
+ 5030 VT82C596 ACPI [Apollo PRO]
+ 5122 VX855/VX875 Chrome 9 HCM Integrated Graphics
+ 5208 PT890 I/O APIC Interrupt Controller
+ 5238 K8T890 I/O APIC Interrupt Controller
+ 5287 VT8251 Serial ATA Controller
+ 5290 K8M890 I/O APIC Interrupt Controller
+ 5308 PT894 I/O APIC Interrupt Controller
+ 5324 VX800 Serial ATA and EIDE Controller
+ 5327 P4M890 I/O APIC Interrupt Controller
+ 5336 K8M890CE I/O APIC Interrupt Controller
+ 5340 PT900 I/O APIC Interrupt Controller
+ 5351 VT3351 I/O APIC Interrupt Controller
+ 5353 VX800/VX820 APIC and Central Traffic Control
+ 5364 CN896/VN896/P4M900 I/O APIC Interrupt Controller
+ 5409 VX855/VX875 APIC and Central Traffic Control
+ 6100 VT85C100A [Rhine II]
+ 6287 SATA RAID Controller
+ 6327 P4M890 Security Device
+ 6353 VX800/VX820 Scratch Registers
+ 6364 CN896/VN896/P4M900 Security Device
+ 6409 VX855/VX875 Scratch Registers
+ 7204 K8M800 Host Bridge
+ 7205 KM400/KN400/P4M800 [S3 UniChrome]
+ 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard
+ 1462 7061 MS-7061
+ 7208 PT890 Host Bridge
+ 7238 K8T890 Host Bridge
+ 7258 PT880 Host Bridge
+ 7259 CN333/CN400/PM880 Host Bridge
+ 7269 KT880 Host Bridge
+ 7282 K8T800Pro Host Bridge
+ 7290 K8M890 Host Bridge
+ 7293 PM896 Host Bridge
+ 7296 P4M800 Host Bridge
+ 7308 PT894 Host Bridge
+ 7314 CN700/VN800/P4M800CE/Pro Host Bridge
+ 7324 CX700/VX700 Host Bridge
+ 7327 P4M890 Host Bridge
+ 7336 K8M890CE Host Bridge
+ 7340 PT900 Host Bridge
+ 7351 VT3351 Host Bridge
+ 7353 VX800/VX820 North-South Module Interface Control
+ 7364 CN896/VN896/P4M900 Host Bridge
+ 7409 VX855/VX875 North-South Module Interface Control
+ 8231 VT8231 [PCI-to-ISA Bridge]
+ 8235 VT8235 ACPI
+ 8305 VT8363/8365 [KT133/KM133 AGP]
+ 8324 CX700/VX700 PCI to ISA Bridge
+ 8353 VX800/VX820 Bus Control and Power Management
+ 8391 VT8371 [KX133 AGP]
+ 8400 MVP4
+ 8409 VX855/VX875 Bus Control and Power Management
+ 8500 KLE133/PLE133/PLE133T
+ 8501 VT8501 [Apollo MVP4 AGP]
+ 8596 VT82C596 [Apollo PRO AGP]
+ 8597 VT82C597 [Apollo VP3 AGP]
+ 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP]
+ 1019 0985 P6VXA Motherboard
+ 8601 VT8601 [Apollo ProMedia AGP]
+ 8605 VT8605 [PM133 AGP]
+ 8691 VT82C691 [Apollo Pro]
+ 8693 VT82C693 [Apollo Pro Plus] PCI Bridge
+ 8a25 PL133/PL133T [S3 ProSavage]
+ 8a26 KL133/KL133A/KM133/KM133A [S3 ProSavage]
+ 8d01 PN133/PN133T [S3 Twister]
+ 8d04 KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
+ 9530 Secure Digital Memory Card Controller
+ 95d0 SDIO Host Controller
+ a208 PT890 PCI to PCI Bridge Controller
+ a238 K8T890 PCI to PCI Bridge Controller
+ a327 P4M890 PCI to PCI Bridge Controller
+ a353 VX8xx South-North Module Interface Control
+ a364 CN896/VN896/P4M900 PCI to PCI Bridge Controller
+ a409 VX855/VX875 USB Device Controller
+ b091 VT8633 [Apollo Pro266 AGP]
+ b099 VT8366/A/7 [Apollo KT266/A/333 AGP]
+ b101 VT8653 AGP Bridge
+ b102 VT8362 AGP Bridge
+ b103 VT8615 AGP Bridge
+ b112 VT8361 [KLE133] AGP Bridge
+ b113 VPX/VPX2 I/O APIC Interrupt Controller
+ b115 VT8363/8365 [KT133/KM133] PCI Bridge
+ b168 VT8235 PCI Bridge
+ b188 VT8237 PCI bridge [K8T800/K8T890 South]
+ 147b 1407 KV8-MAX3 motherboard
+ b198 VT8237/VX700 PCI Bridge
+ b213 VPX/VPX2 I/O APIC Interrupt Controller
+ b353 VX855/VX875 PCI to PCI Bridge
+ b999 [K8T890 North / VT8237 South] PCI Bridge
+ c208 PT890 PCI to PCI Bridge Controller
+ c238 K8T890 PCI to PCI Bridge Controller
+ c327 P4M890 PCI to PCI Bridge Controller
+ c340 PT900 PCI to PCI Bridge Controller
+ c353 VX800/VX820 PCI Express Root Port
+ c364 CN896/VN896/P4M900 PCI to PCI Bridge Controller
+ c409 VX855/VX875 EIDE Controller
+ d104 VT8237R USB UDCI Controller
+ d208 PT890 PCI to PCI Bridge Controller
+ d213 VPX/VPX2 PCI to PCI Bridge Controller
+ d238 K8T890 PCI to PCI Bridge Controller
+ d340 PT900 PCI to PCI Bridge Controller
+ e208 PT890 PCI to PCI Bridge Controller
+ e238 K8T890 PCI to PCI Bridge Controller
+ e340 PT900 PCI to PCI Bridge Controller
+ e353 VX800/VX820 PCI Express Root Port
+ e721 VT1708B 8-channel High Definition Audio CODEC
+ f208 PT890 PCI to PCI Bridge Controller
+ f238 K8T890 PCI to PCI Bridge Controller
+ f340 PT900 PCI to PCI Bridge Controller
+ f353 VX800/VX820 PCI Express Root Port
+1107 Stratus Computers
+ 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!)
+1108 Proteon, Inc.
+ 0100 p1690plus_AA
+ 0101 p1690plus_AB
+ 0105 P1690Plus
+ 0108 P1690Plus
+ 0138 P1690Plus
+ 0139 P1690Plus
+ 013c P1690Plus
+ 013d P1690Plus
+1109 Cogent Data Technologies, Inc.
+ 1400 EM110TX [EX110TX]
+110a Siemens Nixdorf AG
+ 0002 Pirahna 2-port
+ 0005 Tulip controller, power management, switch extender
+ 0006 FSC PINC (I/O-APIC)
+ 0015 FSC Multiprocessor Interrupt Controller
+ 001d FSC Copernicus Management Controller
+ 007b FSC Remote Service Controller, mailbox device
+ 007c FSC Remote Service Controller, shared memory device
+ 007d FSC Remote Service Controller, SMIC device
+ 2101 HST SAPHIR V Primary PCI (ISDN/PMx)
+# Superfastcom-PCI (Commtech, Inc.) or DSCC4 WAN Adapter
+ 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels
+ 2104 Eicon Diva 2.02 compatible passive ISDN card
+ 3141 SIMATIC NET CP 5611 (Profibus Adapter)
+ 3142 SIMATIC NET CP 5613A1 (Profibus Adapter)
+ 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter)
+ 4029 SIMATIC NET CP 5613A2 (Profibus Adapter)
+ 4942 FPGA I-Bus Tracer for MBD
+ 6120 SZB6120
+110b Chromatic Research Inc.
+ 0001 Mpact Media Processor
+ 0004 Mpact 2
+110c Mini-Max Technology, Inc.
+110d Znyx Advanced Systems
+110e CPU Technology
+110f Ross Technology
+1110 Powerhouse Systems
+ 6037 Firepower Powerized SMP I/O ASIC
+ 6073 Firepower Powerized SMP I/O ASIC
+1111 Santa Cruz Operation
+# Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom
+1112 Osicom Technologies Inc
+ 2200 FDDI Adapter
+ 2300 Fast Ethernet Adapter
+ 2340 4 Port Fast Ethernet Adapter
+ 2400 ATM Adapter
+1113 Accton Technology Corporation
+ 1211 SMC2-1211TX
+ 103c 1207 EN-1207D Fast Ethernet Adapter
+ 1113 1211 EN-1207D Fast Ethernet Adapter
+ 1216 EN-1216 Ethernet Adapter
+ 1113 1216 EN1207F series PCI Fast Ethernet Adapter
+ 1113 2220 EN2220A Cardbus Fast Ethernet Adapter
+ 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card
+ 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?]
+ 1217 EN-1217 Ethernet Adapter
+ 5105 10Mbps Network card
+ 9211 EN-1207D Fast Ethernet Adapter
+ 1113 9211 EN-1207D Fast Ethernet Adapter
+ 9511 21x4x DEC-Tulip compatible Fast Ethernet
+ d301 CPWNA100 (Philips wireless PCMCIA)
+ ec02 SMC 1244TX v3
+ ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter
+1114 Atmel Corporation
+ 0506 at76c506 802.11b Wireless Network Adaptor
+1115 3D Labs
+1116 Data Translation
+ 0022 DT3001
+ 0023 DT3002
+ 0024 DT3003
+ 0025 DT3004
+ 0026 DT3005
+ 0027 DT3001-PGL
+ 0028 DT3003-PGL
+ 0051 DT322
+ 0060 DT340
+ 0069 DT332
+ 80c2 DT3162
+1117 Datacube, Inc
+ 9500 Max-1C SVGA card
+ 9501 Max-1C image processing
+1118 Berg Electronics
+1119 ICP Vortex Computersysteme GmbH
+ 0000 GDT 6000/6020/6050
+ 0001 GDT 6000B/6010
+ 0002 GDT 6110/6510
+ 0003 GDT 6120/6520
+ 0004 GDT 6530
+ 0005 GDT 6550
+ 0006 GDT 6117/6517
+ 0007 GDT 6127/6527
+ 0008 GDT 6537
+ 0009 GDT 6557/6557-ECC
+ 000a GDT 6115/6515
+ 000b GDT 6125/6525
+ 000c GDT 6535
+ 000d GDT 6555/6555-ECC
+ 0100 GDT 6117RP/6517RP
+ 0101 GDT 6127RP/6527RP
+ 0102 GDT 6537RP
+ 0103 GDT 6557RP
+ 0104 GDT 6111RP/6511RP
+ 0105 GDT 6121RP/6521RP
+ 0110 GDT 6117RD/6517RD
+ 0111 GDT 6127RD/6527RD
+ 0112 GDT 6537RD
+ 0113 GDT 6557RD
+ 0114 GDT 6111RD/6511RD
+ 0115 GDT 6121RD/6521RD
+ 0118 GDT 6118RD/6518RD/6618RD
+ 0119 GDT 6128RD/6528RD/6628RD
+ 011a GDT 6538RD/6638RD
+ 011b GDT 6558RD/6658RD
+ 0120 GDT 6117RP2/6517RP2
+ 0121 GDT 6127RP2/6527RP2
+ 0122 GDT 6537RP2
+ 0123 GDT 6557RP2
+ 0124 GDT 6111RP2/6511RP2
+ 0125 GDT 6121RP2/6521RP2
+ 0136 GDT 6113RS/6513RS
+ 0137 GDT 6123RS/6523RS
+ 0138 GDT 6118RS/6518RS/6618RS
+ 0139 GDT 6128RS/6528RS/6628RS
+ 013a GDT 6538RS/6638RS
+ 013b GDT 6558RS/6658RS
+ 013c GDT 6533RS/6633RS
+ 013d GDT 6543RS/6643RS
+ 013e GDT 6553RS/6653RS
+ 013f GDT 6563RS/6663RS
+ 0166 GDT 7113RN/7513RN/7613RN
+ 0167 GDT 7123RN/7523RN/7623RN
+ 0168 GDT 7118RN/7518RN/7518RN
+ 0169 GDT 7128RN/7528RN/7628RN
+ 016a GDT 7538RN/7638RN
+ 016b GDT 7558RN/7658RN
+ 016c GDT 7533RN/7633RN
+ 016d GDT 7543RN/7643RN
+ 016e GDT 7553RN/7653RN
+ 016f GDT 7563RN/7663RN
+ 01d6 GDT 4x13RZ
+ 01d7 GDT 4x23RZ
+ 01f6 GDT 8x13RZ
+ 01f7 GDT 8x23RZ
+ 01fc GDT 8x33RZ
+ 01fd GDT 8x43RZ
+ 01fe GDT 8x53RZ
+ 01ff GDT 8x63RZ
+ 0210 GDT 6519RD/6619RD
+ 0211 GDT 6529RD/6629RD
+ 0260 GDT 7519RN/7619RN
+ 0261 GDT 7529RN/7629RN
+ 02ff GDT MAXRP
+ 0300 GDT NEWRX
+ 0301 GDT NEWRX2
+111a Efficient Networks, Inc
+ 0000 155P-MF1 (FPGA)
+ 0002 155P-MF1 (ASIC)
+ 0003 ENI-25P ATM
+ 111a 0000 ENI-25p Miniport ATM Adapter
+ 0005 SpeedStream (LANAI)
+ 111a 0001 ENI-3010 ATM
+ 111a 0009 ENI-3060 ADSL (VPI=0)
+ 111a 0101 ENI-3010 ATM
+ 111a 0109 ENI-3060CO ADSL (VPI=0)
+ 111a 0809 ENI-3060 ADSL (VPI=0 or 8)
+ 111a 0909 ENI-3060CO ADSL (VPI=0 or 8)
+ 111a 0a09 ENI-3060 ADSL (VPI=<0..15>)
+ 0007 SpeedStream ADSL
+ 111a 1001 ENI-3061 ADSL [ASIC]
+ 1020 SpeedStream PCI 10/100 Network Card
+ 1203 SpeedStream 1023 Wireless PCI Adapter
+111b Teledyne Electronic Systems
+111c Tricord Systems Inc.
+ 0001 Powerbis Bridge
+111d Integrated Device Technology, Inc.
+ 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR]
+ 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller
+ 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller
+ 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller
+ 8018 PES12N3A PCI Express Switch
+ 801c PES24N3A PCI Express Switch
+ 8028 PES4T4 PCI Express Switch
+ 802b PES8T5A PCI Express Switch
+ 802c PES16T4 PCI Express Switch
+ 802d PES16T7 PCI Express Switch
+ 802e PES24T6 PCI Express Switch
+ 802f PES32T8 PCI Express Switch
+ 8032 PES48T12 PCI Express Switch
+ 8034 PES16/22/34H16 PCI Express Switch
+ 8035 PES32H8 PCI Express Switch
+ 8036 PES48H12 PCI Express Switch
+ 8037 PES64H16 PCI Express Switch
+ 8039 PES3T3 PCI Express Switch
+ 803a PES4T4 PCI Express Switch
+ 803c PES5T5 PCI Express Switch
+ 803d PES6T5 PCI Express Switch
+ 8048 PES8NT2 PCI Express Switch
+ 8049 PES8NT2 PCI Express Switch
+ 804a PES8NT2 PCI Express Internal NTB
+ 804b PES8NT2 PCI Express External NTB
+ 804c PES16NT2 PCI Express Switch
+ 804d PES16NT2 PCI Express Switch
+ 804e PES16NT2 PCI Express Internal NTB
+ 804f PES16NT2 PCI Express External NTB
+ 8058 PES12NT3 PCI Express Switch
+ 8059 PES12NT3 PCI Express Switch
+ 805a PES12NT3 PCI Express Internal NTB
+ 805b PES12NT3 PCI Express External NTB
+ 805c PES24NT3 PCI Express Switch
+ 805d PES24NT3 PCI Express Switch
+ 805e PES24NT3 PCI Express Internal NTB
+ 805f PES24NT3 PCI Express External NTB
+ 8060 PES16T4G2 PCI Express Gen2 Switch
+ 8061 PES12T3G2 PCI Express Gen2 Switch
+ 8068 PES6T6G2 PCI Express Gen2 Switch
+ 806a PES24T3G2 PCI Express Gen2 Switch
+ 14c1 000c 10G-PCIE2-8B2
+ 806c PES16T4A/4T4G2 PCI Express Gen2 Switch
+ 806e PES24T6G2 PCI Express Gen2 Switch
+ 806f HIO524G2 PCI Express Gen2 Switch
+111e Eldec
+111f Precision Digital Images
+ 4a47 Precision MX Video engine interface
+ 5243 Frame capture bus interface
+1120 EMC Corporation
+1121 Zilog
+1122 Multi-tech Systems, Inc.
+1123 Excellent Design, Inc.
+1124 Leutron Vision AG
+ 2581 Picport Monochrome
+1125 Eurocore
+1126 Vigra
+1127 FORE Systems Inc
+ 0200 ForeRunner PCA-200 ATM
+ 0210 PCA-200PC
+ 0250 ATM
+ 0300 ForeRunner PCA-200EPC ATM
+ 0310 ATM
+ 0400 ForeRunnerHE ATM Adapter
+ 1127 0400 ForeRunnerHE ATM
+1129 Firmworks
+112a Hermes Electronics Company, Ltd.
+112b Linotype - Hell AG
+112c Zenith Data Systems
+112d Ravicad
+112e Infomedia Microelectronics Inc.
+112f Dalsa Inc.
+ 0000 MVC IC-PCI
+ 0001 MVC IM-PCI Video frame grabber/processor
+ 0008 PC-CamLink PCI framegrabber
+1130 Computervision
+1131 Philips Semiconductors
+ 1561 USB 1.1 Host Controller
+ 1775 c200 C2K onboard USB 1.1 host controller
+ 1562 USB 2.0 Host Controller
+ 1775 c200 C2K onboard USB 2.0 host controller
+ 3400 SmartPCI56(UCB1500) 56K Modem
+ 5400 TriMedia TM1000/1100
+ 12ca 0000 BlueICE
+ 5402 TriMedia TM1300
+ 1244 0f00 Fritz!Card DSL
+ 15eb 1300 DT1300
+ 15eb 1302 DT1302
+ 15eb 1304 DT1304
+ 15eb 1305 DT1305
+ 15eb 1306 PMCDT1306
+ 15eb 1308 DT1308
+ 15eb 1331 DT1301 with SAA7121
+ 15eb 1337 DT1301 with SAA7127
+ 15eb 2d3d X3D
+ 15eb 7022 PTM1300
+ 5405 TriMedia TM1500
+ 1136 0005 LCP-1500
+ 5406 TriMedia TM1700
+ 540b PNX1005 Media Processor
+ 1131 0020 PNXLite PCI Demo Board
+ 7130 SAA7130 Video Broadcast Decoder
+ 0000 4016 Behold TV 401
+ 0000 4051 Behold TV 405 FM
+ 0000 5051 Behold TV 505 RDS
+ 0000 505b Behold TV 505 RDS
+ 102b 48d0 Matrox CronosPlus
+ 1048 226b ELSA EX-VISION 300TV
+ 107d 6655 WinFast DTV1000S
+ 1131 0000 Behold TV 401
+ 1131 2001 10MOONS PCI TV CAPTURE CARD
+ 1131 2005 Techcom (India) TV Tuner Card (SSD-TV-670)
+ 1458 9006 GT-PS700 DVB-S tuner
+ 1461 050c Nagase Sangyo TransGear 3000TV
+ 1461 10ff AVerMedia DVD EZMaker
+ 1461 2108 AverMedia AverTV/305
+ 1461 2115 AverMedia AverTV Studio 305
+ 153b 1152 Terratec Cinergy 200 TV
+ 185b c100 Compro VideoMate TV PVR/FM
+ 185b c901 Videomate DVB-T200
+ 5168 0138 LifeView FlyVIDEO2000
+ 5ace 5010 Behold TV 501
+ 5ace 5050 Behold TV 505 FM
+ 7133 SAA7131/SAA7133/SAA7135 Video Broadcast Decoder
+ 0000 4091 Beholder BeholdTV 409 FM
+ 0000 5071 Behold TV 507 RDS
+ 0000 507b Behold TV 507 RDS
+ 0000 5201 Behold TV Columbus
+# Deleting vendor name after rereading submit instructions
+ 0070 6701 WinTV HVR-1110
+ 1019 4cb5 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM)
+ 1043 0210 FlyTV mini Asus Digimatrix
+ 1043 4843 ASUS TV-FM 7133
+ 1043 4845 TV-FM 7135
+ 1043 4862 P7131 Dual
+ 1043 4876 My Cinema-P7131 Hybrid
+ 1131 0000 KWorld V-Stream Studio TV Terminator
+ 1131 2001 Proteus Pro [philips reference design]
+ 1131 2018 Tiger reference design
+ 1131 4ee9 MonsterTV Mobile
+ 11bd 002b PCTV Stereo
+ 11bd 002e PCTV 110i (saa7133)
+ 12ab 0800 PURPLE TV
+ 13c2 2804 Technotrend Budget T-3000 Hybrid
+ 1421 0335 Instant TV DVB-T Cardbus
+ 1421 1370 Instant TV (saa7135)
+ 1435 7330 VFG7330
+ 1435 7350 VFG7350
+ 1458 9002 GT-PTV-TAF-RH DVB-T/Analog TV/FM tuner
+ 1458 9003 GT-PTV-AF-RH Analog TV/FM tuner
+ 1458 9004 GT-P8000 DVB-T/Analog TV/FM tuner
+ 1458 9005 GT-P6000 Analog TV/FM tuner
+ 1458 9008 GT-P5100 Analog TV tuner
+ 1461 1044 AVerTVHD MCE A180
+ 1461 4836 M10D Hybrid DVBT
+ 1461 861e M105 PAL/SECAM/NTSC/FM Tuner
+ 1461 a14b AVerTV Studio 509
+ 1461 a836 M115 DVB-T, PAL/SECAM/NTSC Tuner
+ 1461 f01d DVB-T Super 007
+ 1461 f31f Avermedia AVerTV GO 007 FM
+ 1461 f936 Hybrid+FM PCI (rev A16D)
+ 1462 6231 TV@nywhere Plus
+ 1489 0214 LifeView FlyTV Platinum FM
+ 14c0 1212 LifeView FlyTV Platinum Mini2
+ 153b 1160 Cinergy 250 PCI TV
+ 153b 1162 Terratec Cinergy 400 mobile
+ 17de 7350 ATSC 110 Digital / Analog HDTV Tuner
+ 17de 7352 ATSC 115 Digital / Analog HDTV Tuner
+ 185b c100 VideoMate TV
+ 185b c900 VideoMate T750
+ 5168 0306 LifeView FlyDVB-T DUO
+ 5168 0319 LifeView FlyDVB Trio
+ 5168 0502 LifeView FlyDVB-T Duo CardBus
+ 5168 0520 LifeView FlyDVB Trio CardBus
+ 5168 1502 LifeView FlyTV CardBus
+ 5168 2502 LifeView FlyDVB-T CardBus
+ 5168 2520 LifeView FlyDVB-S Duo CardBus
+ 5168 3502 LifeView FlyDVB-T Hybrid CardBus
+ 5168 3520 LifeView FlyDVB Trio N CardBus
+ 5ace 5030 Behold TV 503 FM
+ 5ace 5090 Behold TV 509 FM
+ 5ace 6090 Behold TV 609 FM
+ 5ace 6091 Behold TV 609 FM
+ 5ace 6092 Behold TV 609 RDS
+ 5ace 6093 Behold TV 609 RDS
+ 5ace 6190 Behold TV M6
+ 5ace 6191 Behold TV M63
+ 5ace 6193 Behold TV M6 Extra
+ 5ace 6290 Behold TV H6
+ 5ace 7090 Behold TV A7
+ 5ace 7190 Behold TV H7
+ 5ace 7595 Behold TV X7
+ 7134 SAA7134/SAA7135HL Video Broadcast Decoder
+ 0000 4036 Behold TV 403
+ 0000 4037 Behold TV 403 FM
+ 0000 4071 Behold TV 407 FM
+ 1019 4cb4 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM)
+ 1043 0210 Digimatrix TV
+ 1043 4840 ASUS TV-FM 7134
+ 1043 4842 TV-FM 7134
+ 1131 0000 Behold TV 403 FM
+ 1131 2004 EUROPA V3 reference design
+ 1131 4e85 SKNet Monster TV
+ 1131 6752 EMPRESS
+ 11bd 002b PCTV Stereo
+ 11bd 002d PCTV 300i DVB-T + PAL
+ 1461 2c00 AverTV Hybrid+FM PCI
+ 1461 9715 AVerTV Studio 307
+ 1461 a70a Avermedia AVerTV 307
+ 1461 a70b AverMedia M156 / Medion 2819
+ 1461 d6ee Cardbus TV/Radio (E500)
+ 1471 b7e9 AVerTV Cardbus plus
+ 153b 1142 Terratec Cinergy 400 TV
+ 153b 1143 Terratec Cinergy 600 TV
+ 153b 1158 Terratec Cinergy 600 TV MK3
+ 1540 9524 ProVideo PV952
+ 16be 0003 Medion 7134
+ 185b c200 Compro VideoMate Gold+ Pal
+ 185b c900 Videomate DVB-T300
+ 1894 a006 KNC One TV-Station DVR
+ 1894 fe01 KNC One TV-Station RDS / Typhoon TV Tuner RDS
+ 5168 0138 FLY TV PRIME 34FM
+ 5ace 5070 Behold TV 507 FM
+ 5ace 6070 Behold TV 607 FM
+ 5ace 6071 Behold TV 607 FM
+ 5ace 6072 Behold TV 607 RDS
+ 5ace 6073 Behold TV 607 RDS
+ 7145 SAA7145
+ 7146 SAA7146
+ 110a 0000 Fujitsu/Siemens DVB-C card rev1.5
+ 110a ffff Fujitsu/Siemens DVB-C card rev1.5
+ 1124 2581 Leutron Vision PicPort
+ 1131 4f56 KNC1 DVB-S Budget
+ 1131 4f60 Fujitsu-Siemens Activy DVB-S Budget Rev AL
+ 1131 4f61 Activy DVB-S Budget Rev GR
+ 1131 5f61 Activy DVB-T Budget
+ 114b 2003 DVRaptor Video Edit/Capture Card
+ 11bd 0006 DV500 Overlay
+ 11bd 000a DV500 Overlay
+ 11bd 000f DV500 Overlay
+ 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5
+ 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6
+ 13c2 0002 Technotrend/Hauppauge DVB card rev2.1
+ 13c2 0003 Technotrend/Hauppauge DVB card rev2.1
+ 13c2 0004 Technotrend/Hauppauge DVB card rev2.1
+ 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6
+ 13c2 0008 Technotrend/Hauppauge DVB-T
+ 13c2 000a Octal/Technotrend DVB-C for iTV
+ 13c2 000e Technotrend/Hauppauge DVB card rev2.3
+ 13c2 1003 Technotrend-Budget/Hauppauge WinTV-NOVA-S DVB card
+ 13c2 1004 Technotrend-Budget/Hauppauge WinTV-NOVA-C DVB card
+ 13c2 1005 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card
+ 13c2 100c Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card
+ 13c2 100f Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card
+ 13c2 1010 DVB C-1500
+ 13c2 1011 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card
+ 13c2 1012 DVB T-1500
+ 13c2 1013 SATELCO Multimedia DVB
+ 13c2 1016 WinTV-NOVA-SE DVB card
+ 13c2 1018 DVB S-1401
+ 13c2 1019 S2-3200
+ 13c2 1102 Technotrend/Hauppauge DVB card rev2.1
+ 153b 1155 Cinergy 1200 DVB-S
+ 153b 1156 Terratec Cynergy 1200C
+ 153b 1157 Cinergy 1200 DVB-T
+ 1894 0020 KNC One DVB-C V1.0
+ 1894 0023 TVStation DVB-C plus
+ 7160 SAA7160
+ 1458 9009 E8000 DVB-T/Analog TV/FM tuner
+ 7162 SAA7162
+ 11bd 0101 Pinnacle PCTV 7010iX TV Card
+ 7164 SAA7164
+ 0070 8800 WinTV HVR-2250
+ 0070 8810 WinTV HVR-2250
+ 0070 8851 WinTV HVR-2250
+ 0070 8853 WinTV HVR-2250
+ 0070 8880 WinTV HVR-2250
+ 0070 8891 WinTV HVR-2250
+ 0070 88a0 WinTV HVR-2250
+ 0070 88a1 WinTV HVR-2250
+ 0070 8900 WinTV HVR-2200
+ 0070 8901 WinTV HVR-2200
+ 0070 8940 WinTV HVR-2200 (submodel 89619)
+ 0070 8951 WinTV HVR-2200
+ 0070 8953 WinTV HVR-2200
+ 0070 8980 WinTV HVR-2200
+ 0070 8991 WinTV HVR-2200
+ 0070 8993 WinTV HVR-2200
+ 0070 89a0 WinTV HVR-2200
+ 0070 89a1 WinTV HVR-2200
+ 7231 SAA7231
+ 5ace 8000 Behold TV H8
+ 5ace 8100 Behold TV A8
+ 9730 SAA9730 Integrated Multimedia and Peripheral Controller
+ 1131 0000 Integrated Multimedia and Peripheral Controller
+1132 Mitel Corp.
+1133 Dialogic Corporation
+ 7701 Eiconcard C90
+ 7711 Eiconcard C91
+ 7901 EiconCard S90
+ 7902 EiconCard S90
+ 7911 EiconCard S91
+ 7912 EiconCard S91
+ 7921 Eiconcard S92
+ 7941 EiconCard S94
+ 7942 EiconCard S94
+ 7943 EiconCard S94
+ 7944 EiconCard S94
+ 7945 Eiconcard S94
+ 7948 Eiconcard S94 64bit/66MHz
+ 9711 Eiconcard S91 V2
+ 9911 Eiconcard S91 V2
+ 9941 Eiconcard S94 V2
+ 9a41 Eiconcard S94 PCIe
+ b921 EiconCard P92
+ b922 EiconCard P92
+ b923 EiconCard P92
+ e001 Diva Pro 2.0 S/T
+ e002 Diva 2.0 S/T PCI
+ e003 Diva Pro 2.0 U
+ e004 Diva 2.0 U PCI
+ e005 Diva 2.01 S/T PCI
+ e006 Diva CT S/T PCI
+ e007 Diva CT U PCI
+ e008 Diva CT Lite S/T PCI
+ e009 Diva CT Lite U PCI
+ e00a Diva ISDN+V.90 PCI
+ e00b Diva ISDN PCI 2.02
+ e00c Diva 2.02 PCI U
+ e00d Diva Pro 3.0 PCI
+ e00e Diva ISDN+CT S/T PCI Rev 2
+ e010 Diva Server BRI-2M PCI
+ 110a 0021 Fujitsu Siemens ISDN S0
+ e011 Diva Server BRI S/T Rev 2
+ e012 Diva Server 4BRI-8M PCI
+ e013 4BRI
+ 1133 1300 Diva V-4BRI-8 PCI v2
+ 1133 e013 Diva 4BRI-8 PCI v2
+ e014 Diva Server PRI-30M PCI
+ e015 Diva PRI PCI v2
+ e016 Diva Server Voice 4BRI PCI
+ e017 Diva Server Voice 4BRI Rev 2
+ 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI
+ e018 BRI
+ 1133 1800 Diva V-BRI-2 PCI v2
+ 1133 e018 Diva BRI-2 PCI v2
+ e019 Diva Server Voice PRI Rev 2
+ 1133 e019 Diva Server Voice PRI 2.0 PCI
+ e01a Diva BRI-2FX PCI v2
+ e01b Diva Server Voice BRI-2M 2.0 PCI
+ 1133 e01b Diva Server Voice BRI-2M 2.0 PCI
+ e01c PRI
+ 1133 1c01 Diva PRI/E1/T1-8 PCI v3
+ 1133 1c02 Diva PRI/T1-24 PCI(e) v3
+ 1133 1c03 Diva PRI/E1-30 PCI(e) v3
+ 1133 1c04 Diva PRI/E1/T1-CTI PCI(e) v3
+ 1133 1c05 Diva V-PRI/T1-24 PCI(e) v3
+ 1133 1c06 Diva V-PRI/E1-30 PCI(e) v3
+ 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ
+ 1133 1c08 Diva Server PRI/T1-24 Cornet NQ
+ 1133 1c09 Diva Server PRI/E1-30 Cornet NQ
+ 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ
+ 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ
+ 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ
+ e01e 2PRI
+ 1133 1e01 Diva 2PRI/E1/T1-60 PCI v1
+ 1133 e01e Diva V-2PRI/E1/T1-60 PCI v1
+ e020 4PRI
+ 1133 2001 Diva 4PRI/E1/T1-120 PCI v1
+ 1133 e020 Diva V-4PRI/E1/T1-120 PCI v1
+ e022 Analog-2
+ 1133 2200 Diva V-Analog-2 PCI v1
+ 1133 e022 Diva Analog-2 PCI v1
+ e024 Analog-4
+ 1133 2400 Diva V-Analog-4 PCI v1
+ 1133 e024 Diva Analog-4 PCI v1
+ e028 Analog-8
+ 1133 2800 Diva V-Analog-8 PCI v1
+ 1133 e028 Diva Analog-8 PCI v1
+ e02a Diva IPM-300 PCI v1
+ e02c Diva IPM-600 PCI v1
+ e02e 4BRI
+ 1133 2e01 Diva V-4BRI-8 PCIe v2
+ 1133 e02e Diva 4BRI-8 PCIe v2
+ e032 BRI
+ 1133 3201 Diva V-BRI-2 PCIe v2
+ 1133 e032 Diva BRI-2 PCIe v2
+ e034 Diva BRI-CTI PCI v2
+1134 Mercury Computer Systems
+ 0001 Raceway Bridge
+ 0002 Dual PCI to RapidIO Bridge
+1135 Fuji Xerox Co Ltd
+ 0001 Printer controller
+1136 Momentum Data Systems
+ 0002 PCI-JTAG
+1137 Cisco Systems Inc
+ 0023 81 VIC PCIe Upstream Port
+ 0040 VIC PCIe Upstream Port
+ 0041 VIC PCIe Downstream Port
+ 0042 VIC Management Controller
+ 1137 0047 P81E PCIe
+ 0043 VIC Ethernet NIC
+ 1137 0047 P81E PCIe
+ 1137 0048 M81KR Mezzanine
+ 0044 VIC Ethernet NIC Dynamic
+ 1137 0047 P81E PCIe
+ 1137 0048 M81KR Mezzanine
+ 0045 VIC FCoE HBA
+ 1137 0047 P81E PCIe
+ 1137 0048 M81KR Mezzanine
+1138 Ziatech Corporation
+ 8905 8905 [STD 32 Bridge]
+1139 Dynamic Pictures, Inc
+ 0001 VGA Compatable 3D Graphics
+113a FWB Inc
+113b Network Computing Devices
+113c Cyclone Microsystems, Inc.
+ 0000 PCI-9060 i960 Bridge
+ 0001 PCI-SDK [PCI i960 Evaluation Platform]
+ 0911 PCI-911 [i960Jx-based Intelligent I/O Controller]
+ 0912 PCI-912 [i960CF-based Intelligent I/O Controller]
+ 0913 PCI-913
+ 0914 PCI-914 [I/O Controller w/ secondary PCI bus]
+113d Leading Edge Products Inc
+113e Sanyo Electric Co - Computer Engineering Dept
+113f Equinox Systems, Inc.
+ 0808 SST-64P Adapter
+ 1010 SST-128P Adapter
+ 80c0 SST-16P DB Adapter
+ 80c4 SST-16P RJ Adapter
+ 80c8 SST-16P Adapter
+ 8888 SST-4P Adapter
+ 9090 SST-8P Adapter
+1140 Intervoice Inc
+1141 Crest Microsystem Inc
+1142 Alliance Semiconductor Corporation
+ 3210 AP6410
+ 6422 ProVideo 6422
+ 6424 ProVideo 6424
+ 6425 ProMotion AT25
+ 643d ProMotion AT3D
+1143 NetPower, Inc
+1144 Cincinnati Milacron
+ 0001 Noservo controller
+1145 Workbit Corporation
+ 8007 NinjaSCSI-32 Workbit
+ f007 NinjaSCSI-32 KME
+ f010 NinjaSCSI-32 Workbit
+ f012 NinjaSCSI-32 Logitec
+ f013 NinjaSCSI-32 Logitec
+ f015 NinjaSCSI-32 Melco
+ f020 NinjaSCSI-32 Sony PCGA-DVD51
+ f021 NinjaPATA-32 Delkin Cardbus UDMA
+ f024 NinjaPATA-32 Delkin Cardbus UDMA
+ f103 NinjaPATA-32 Delkin Cardbus UDMA
+1146 Force Computers
+1147 Interface Corp
+# Nee Schneider & Koch
+1148 SysKonnect
+ 4000 FDDI Adapter
+ 0e11 b03b Netelligent 100 FDDI DAS Fibre SC
+ 0e11 b03c Netelligent 100 FDDI SAS Fibre SC
+ 0e11 b03d Netelligent 100 FDDI DAS UTP
+ 0e11 b03e Netelligent 100 FDDI SAS UTP
+ 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC
+ 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP)
+ 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS)
+ 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP)
+ 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP)
+ 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS)
+ 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64)
+ 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS)
+ 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64)
+ 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64)
+ 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS)
+ 4200 Token Ring adapter
+ 4300 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
+ 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)
+ 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)
+ 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)
+ 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)
+ 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)
+ 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)
+ 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)
+ 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)
+ 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)
+ 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
+ 1259 2970 AT-2970SX Gigabit Ethernet Adapter
+ 1259 2971 AT-2970LX Gigabit Ethernet Adapter
+ 1259 2972 AT-2970TX Gigabit Ethernet Adapter
+ 1259 2973 AT-2971SX Gigabit Ethernet Adapter
+ 1259 2974 AT-2971T Gigabit Ethernet Adapter
+ 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter
+ 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter
+ 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter
+ 4320 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter, PCI64, Fiber ZX/SC
+ 1148 0121 Marvell RDK-8001 Adapter
+ 1148 0221 Marvell RDK-8002 Adapter
+ 1148 0321 Marvell RDK-8003 Adapter
+ 1148 0421 Marvell RDK-8004 Adapter
+ 1148 0621 Marvell RDK-8006 Adapter
+ 1148 0721 Marvell RDK-8007 Adapter
+ 1148 0821 Marvell RDK-8008 Adapter
+ 1148 0921 Marvell RDK-8009 Adapter
+ 1148 1121 Marvell RDK-8011 Adapter
+ 1148 1221 Marvell RDK-8012 Adapter
+ 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter
+ 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
+ 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
+ 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+ 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+ 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+ 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
+ 1148 9521 SK-9521 10/100/1000Base-T Adapter
+ 4400 SK-9Dxx Gigabit Ethernet Adapter
+ 4500 SK-9Mxx Gigabit Ethernet Adapter
+ 9000 SK-9S21 10/100/1000Base-T Server Adapter, PCI-X, Copper RJ-45
+ 9843 [Fujitsu] Gigabit Ethernet
+ 9e00 SK-9E21D 10/100/1000Base-T Adapter, Copper RJ-45
+ 1148 2100 SK-9E21 Server Adapter
+ 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter
+ 1148 2200 SK-9E22 Server Adapter
+ 1148 8100 SK-9E81 Server Adapter
+ 1148 8200 SK-9E82 Server Adapter
+ 1148 9100 SK-9E91 Server Adapter
+ 1148 9200 SK-9E92 Server Adapter
+ 9e01 SK-9E21M 10/100/1000Base-T Adapter
+1149 Win System Corporation
+114a VMIC
+ 5565 GE-IP PCI5565,PMC5565 Reflective Memory Node
+ 5579 VMIPCI-5579 (Reflective Memory Card)
+ 5587 VMIPCI-5587 (Reflective Memory Card)
+ 6504 VMIC PCI 7755 FPGA
+ 7587 VMIVME-7587
+114b Canopus Co., Ltd
+114c Annabooks
+114d IC Corporation
+114e Nikon Systems Inc
+114f Digi International
+ 0002 AccelePort EPC
+ 0003 RightSwitch SE-6
+ 0004 AccelePort Xem
+ 0005 AccelePort Xr
+ 0006 AccelePort Xr,C/X
+ 0009 AccelePort Xr/J
+ 000a AccelePort EPC/J
+ 000c DataFirePRIme T1 (1-port)
+ 000d SyncPort 2-Port (x.25/FR)
+ 0011 AccelePort 8r EIA-232 (IBM)
+ 0012 AccelePort 8r EIA-422
+ 0013 AccelePort Xr
+ 0014 AccelePort 8r EIA-422
+ 0015 AccelePort Xem
+ 0016 AccelePort EPC/X
+ 0017 AccelePort C/X
+ 001a DataFirePRIme E1 (1-port)
+ 001b AccelePort C/X (IBM)
+ 001c AccelePort Xr (SAIP)
+ 001d DataFire RAS T1/E1/PRI
+ 114f 0050 DataFire RAS E1 Adapter
+ 114f 0051 DataFire RAS Dual E1 Adapter
+ 114f 0052 DataFire RAS T1 Adapter
+ 114f 0053 DataFire RAS Dual T1 Adapter
+ 0023 AccelePort RAS
+ 0024 DataFire RAS B4 ST/U
+ 114f 0030 DataFire RAS BRI U Adapter
+ 114f 0031 DataFire RAS BRI S/T Adapter
+ 0026 AccelePort 4r 920
+ 0027 AccelePort Xr 920
+ 0028 ClassicBoard 4
+ 0029 ClassicBoard 8
+ 0034 AccelePort 2r 920
+ 0035 DataFire DSP T1/E1/PRI cPCI
+ 0040 AccelePort Xp
+ 114f 0042 AccelePort 2p PCI
+ 114f 0043 AccelePort 4p PCI
+ 114f 0044 AccelePort 8p PCI
+ 114f 0045 AccelePort 16p PCI
+ 114f 004e AccelePort 32p PCI
+ 0042 AccelePort 2p
+ 0043 AccelePort 4p
+ 0044 AccelePort 8p
+ 0045 AccelePort 16p
+ 004e AccelePort 32p
+ 0070 Datafire Micro V IOM2 (Europe)
+ 0071 Datafire Micro V (Europe)
+ 0072 Datafire Micro V IOM2 (North America)
+ 0073 Datafire Micro V (North America)
+ 00b0 Digi Neo 4
+ 00b1 Digi Neo 8
+ 00c8 Digi Neo 2 DB9
+ 00c9 Digi Neo 2 DB9 PRI
+ 00ca Digi Neo 2 RJ45
+ 00cb Digi Neo 2 RJ45 PRI
+ 00cc Digi Neo 1 422
+ 00cd Digi Neo 1 422 485
+ 00ce Digi Neo 2 422 485
+ 00d0 ClassicBoard 4 422
+ 00d1 ClassicBoard 8 422
+ 00f1 Digi Neo PCI-E 4 port
+ 00f4 Digi Neo 4 (IBM version)
+ 6001 Avanstar
+1150 Thinking Machines Corp
+1151 JAE Electronics Inc.
+1152 Megatek
+1153 Land Win Electronic Corp
+1154 Melco Inc
+1155 Pine Technology Ltd
+1156 Periscope Engineering
+1157 Avsys Corporation
+1158 Voarx R & D Inc
+ 3011 Tokenet/vg 1001/10m anylan
+ 9050 Lanfleet/Truevalue
+ 9051 Lanfleet/Truevalue
+1159 Mutech Corp
+ 0001 MV-1000
+ 0002 MV-1500
+115a Harlequin Ltd
+115b Parallax Graphics
+115c Photron Ltd.
+115d Xircom
+ 0003 Cardbus Ethernet 10/100
+ 1014 0181 10/100 EtherJet Cardbus Adapter
+ 1014 1181 10/100 EtherJet Cardbus Adapter
+ 1014 8181 10/100 EtherJet Cardbus Adapter
+ 1014 9181 10/100 EtherJet Cardbus Adapter
+ 115d 0181 Cardbus Ethernet 10/100
+ 115d 0182 RealPort2 CardBus Ethernet 10/100 (R2BE-100)
+ 115d 1181 Cardbus Ethernet 10/100
+ 1179 0181 Cardbus Ethernet 10/100
+ 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter
+ 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter
+ 0005 Cardbus Ethernet 10/100
+ 1014 0182 10/100 EtherJet Cardbus Adapter
+ 1014 1182 10/100 EtherJet Cardbus Adapter
+ 115d 0182 Cardbus Ethernet 10/100
+ 115d 1182 Cardbus Ethernet 10/100
+ 0007 Cardbus Ethernet 10/100
+ 1014 0182 10/100 EtherJet Cardbus Adapter
+ 1014 1182 10/100 EtherJet Cardbus Adapter
+ 115d 0182 Cardbus Ethernet 10/100
+ 115d 1182 Cardbus Ethernet 10/100
+ 000b Cardbus Ethernet 10/100
+ 1014 0183 10/100 EtherJet Cardbus Adapter
+ 115d 0183 Cardbus Ethernet 10/100
+ 000c Mini-PCI V.90 56k Modem
+ 000f Cardbus Ethernet 10/100
+ 1014 0183 10/100 EtherJet Cardbus Adapter
+ 115d 0183 Cardbus Ethernet 10/100
+ 00d4 Mini-PCI K56Flex Modem
+ 0101 Cardbus 56k modem
+ 115d 1081 Cardbus 56k Modem
+ 0103 Cardbus Ethernet + 56k Modem
+ 1014 9181 Cardbus 56k Modem
+ 1115 1181 Cardbus Ethernet 100 + 56k Modem
+ 115d 1181 CBEM56G-100 Ethernet + 56k Modem
+ 8086 9181 PRO/100 LAN + Modem56 CardBus
+115e Peer Protocols Inc
+115f Maxtor Corporation
+1160 Megasoft Inc
+1161 PFU Limited
+1162 OA Laboratory Co Ltd
+1163 Rendition
+ 0001 Verite 1000
+ 2000 Verite V2000/V2100/V2200
+ 1092 2000 Stealth II S220
+1164 Advanced Peripherals Technologies
+1165 Imagraph Corporation
+ 0001 Motion TPEG Recorder/Player with audio
+# nee ServerWorks
+1166 Broadcom
+ 0000 CMIC-LE
+ 0005 CNB20-LE Host Bridge
+ 0006 CNB20HE Host Bridge
+ 0007 CNB20-LE Host Bridge
+ 0008 CNB20HE Host Bridge
+ 0009 CNB20LE Host Bridge
+ 0010 CIOB30
+ 0011 CMIC-HE
+ 0012 CMIC-WS Host Bridge (GC-LE chipset)
+ 0013 CNB20-HE Host Bridge
+ 0014 CMIC-LE Host Bridge (GC-LE chipset)
+ 0015 CMIC-GC Host Bridge
+ 0016 CMIC-GC Host Bridge
+ 0017 GCNB-LE Host Bridge
+ 0031 HT1100 HPX0 HT Host Bridge
+ 0036 BCM5785 [HT1000] PCI/PCI-X Bridge
+ 0101 CIOB-X2 PCI-X I/O Bridge
+ 0103 EPB PCI-Express to PCI-X Bridge
+ 0104 BCM5785 [HT1000] PCI/PCI-X Bridge
+ 0110 CIOB-E I/O Bridge with Gigabit Ethernet
+ 0130 BCM5780 [HT2000] PCI-X bridge
+ 0132 BCM5780 [HT2000] PCI-Express Bridge
+ 1166 0132 HT2000 PCI-Express bridge
+ 0140 HT2100 PCI-Express Bridge
+ 0141 HT2100 PCI-Express Bridge
+ 0142 HT2100 PCI-Express Bridge
+ 0144 HT2100 PCI-Express Bridge
+ 0200 OSB4 South Bridge
+ 0201 CSB5 South Bridge
+ 4c53 1080 CT8 mainboard
+ 0203 CSB6 South Bridge
+ 1734 1012 PRIMERGY RX/TX series
+ 0205 BCM5785 [HT1000] Legacy South Bridge
+ 0211 OSB4 IDE Controller
+ 0212 CSB5 IDE Controller
+ 1028 014a PowerEdge 1750
+ 1028 810b PowerEdge 1650/2550
+ 4c53 1080 CT8 mainboard
+ 0213 CSB6 RAID/IDE Controller
+ 1028 4134 PowerEdge 600SC
+ 1028 c134 Poweredge SC600
+ 1734 1012 PRIMERGY RX/TX series onboard IDE
+ 0214 BCM5785 [HT1000] IDE
+ 1028 0205 PowerEdge 2970 HT1000 IDE
+ 0217 CSB6 IDE Controller
+ 1028 4134 Poweredge SC600
+ 021b HT1100 HD Audio
+ 0220 OSB4/CSB5 OHCI USB Controller
+ 4c53 1080 CT8 mainboard
+ 0221 CSB6 OHCI USB Controller
+ 1734 1012 PRIMERGY RX/TX series onboard OHCI
+ 0223 BCM5785 [HT1000] USB
+ 1028 0205 PowerEdge 2970 HT1000 USB Controller
+ 1028 020b PowerEdge T605 HT1000 USB Controller
+ 0225 CSB5 LPC bridge
+ 0227 GCLE-2 Host Bridge
+ 1734 1012 PRIMERGY RX/TX series
+ 0230 CSB5 LPC bridge
+ 4c53 1080 CT8 mainboard
+ 0234 BCM5785 [HT1000] LPC
+ 1028 0205 PowerEdge 2970 HT1000 LPC
+ 1028 020b PowerEdge T605 HT1000 LPC
+ 0235 BCM5785 [HT1000] XIOAPIC0-2
+ 0238 BCM5785 [HT1000] WDTimer
+ 0240 K2 SATA
+ 0241 RAIDCore RC4000
+ 0242 RAIDCore BC4000
+ 024a BCM5785 [HT1000] SATA (Native SATA Mode)
+ 1028 020b PowerEdge T605 onboard SATA Controller
+# The device starts as 024A, and changes to 024B if set to PATA mode in BIOS
+ 024b BCM5785 [HT1000] SATA (PATA/IDE Mode)
+ 1028 0205 PowerEdge 2970 HT1000 SATA controller
+ 0406 HT1100 PCI-X Bridge
+ 0408 HT1100 Legacy Device
+ 040a HT1100 ISA-LPC Bridge
+ 1028 0223 PowerEdge R905 HT1100 ISA-LPC Bridge
+ 0410 HT1100 SATA Controller (Native SATA Mode)
+ 0411 HT1100 SATA Controller (PATA / IDE Mode)
+ 0412 HT1100 USB OHCI Controller
+ 0414 HT1100 USB EHCI Controller
+ 0416 HT1100 USB EHCI Controller (with Debug Port)
+ 0420 HT1100 PCI-Express Bridge
+ 0421 HT1100 SAS/SATA Controller
+ 0422 HT1100 PCI-Express Bridge
+1167 Mutoh Industries Inc
+1168 Thine Electronics Inc
+1169 Centre for Development of Advanced Computing
+# nee Polaris Communications
+116a Luminex Software, Inc.
+ 6100 Bus/Tag Channel
+ 6800 Escon Channel
+ 7100 Bus/Tag Channel
+ 7800 Escon Channel
+116b Connectware Inc
+116c Intelligent Resources Integrated Systems
+116d Martin-Marietta
+116e Electronics for Imaging
+116f Workstation Technology
+1170 Inventec Corporation
+1171 Loughborough Sound Images Plc
+1172 Altera Corporation
+1173 Adobe Systems, Inc
+1174 Bridgeport Machines
+1175 Mitron Computer Inc.
+1176 SBE Incorporated
+1177 Silicon Engineering
+1178 Alfa, Inc.
+ afa1 Fast Ethernet Adapter
+1179 Toshiba America Info Systems
+ 0102 Extended IDE Controller
+ 0103 EX-IDE Type-B
+ 0404 DVD Decoder card
+ 0406 Tecra Video Capture device
+ 0407 DVD Decoder card (Version 2)
+ 0601 CPU to PCI bridge
+ 1179 0001 Satellite Pro
+ 0602 PCI to ISA bridge
+ 0603 ToPIC95 PCI to CardBus Bridge for Notebooks
+ 0604 PCI-Docking Host bridge
+ 060a ToPIC95
+ 1179 0001 Satellite Pro
+ 060f ToPIC97
+ 1179 0001 Satellite 4010
+ 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support
+ 0618 CPU to PCI and PCI to ISA bridge
+ 0701 FIR Port Type-O
+ 0804 TC6371AF SmartMedia Controller
+ 0805 SD TypA Controller
+ 0d01 FIR Port Type-DO
+ 1179 0001 FIR Port Type-DO
+117a A-Trend Technology
+117b L G Electronics, Inc.
+117c Atto Technology
+ 002c SAS RAID Adapter
+ 0030 Ultra320 SCSI Host Adapter
+ 117c 8013 ExpressPCI UL4D
+ 117c 8014 ExpressPCI UL4S
+ 117c 8027 ExpressPCI UL5D
+ 117c 802f ExpressPCI UL5D Low Profile
+ 0033 SAS Adapter
+117d Becton & Dickinson
+117e T/R Systems
+117f Integrated Circuit Systems
+1180 Ricoh Co Ltd
+ 0465 RL5c465
+ 0466 RL5c466
+ 0475 RL5c475
+ 144d c006 vpr Matrix 170B4 CardBus bridge
+ 0476 RL5c476 II
+ 1014 0185 ThinkPad A/T/X Series
+ 1014 056c ThinkPad Z60t
+ 1028 014f Latitude X300 laptop
+ 1028 0188 Inspiron 6000 laptop
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 1237 A6J-Q008
+ 1043 1967 V6800V
+ 1043 1987 Asus A4K and Z81K notebooks, possibly others ( mid-2005 machines )
+ 104d 80df Vaio PCG-FX403
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 104d 814e VAIO GRZ390Z
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 14ef 0220 PCD-RP-220S
+ 17aa 201c ThinkPad X60s
+ 17aa 20c4 ThinkPad T61
+ 0477 RL5c477
+ 0478 RL5c478
+ 1014 0184 ThinkPad A30p
+ 0511 R5C511
+ 0522 R5C522 IEEE 1394 Controller
+ 1014 01cf ThinkPad A30p
+ 1043 1967 V6800V
+ 0551 R5C551 IEEE 1394 Controller
+ 144d c006 vpr Matrix 170B4
+ 0552 R5C552 IEEE 1394 Controller
+ 1014 0511 ThinkPad A/T/X Series
+ 1028 014f Latitude X300 laptop
+ 1028 0188 Inspiron 6000 laptop
+ 1043 1237 A6J-Q008
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 17aa 201e ThinkPad X60s
+ 0554 R5C554
+ 0575 R5C575 SD Bus Host Adapter
+ 0576 R5C576 SD Bus Host Adapter
+ 0592 R5C592 Memory Stick Bus Host Adapter
+ 1025 0121 Aspire 5920G
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 1043 1237 A6J-Q008
+ 1043 1967 V6800V
+ 144d c018 X20 IV
+ 17aa 20ca ThinkPad T61
+ 0811 R5C811
+ 0822 R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter
+ 1014 0556 ThinkPad X60s / Z60t
+ 1014 0598 ThinkPad Z60m
+ 1025 0121 Aspire 5920G
+ 1028 0188 Inspiron 6000 laptop
+ 1028 01a2 Inspiron 9200
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 103c 03b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 103c 30c1 Compaq 6910p
+ 1043 1237 A6J-Q008
+ 1043 1967 ASUS V6800V
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 144d c018 X20 IV
+ 17aa 201d ThinkPad X60s
+ 17aa 20c7 ThinkPad T61
+ 0832 R5C832 IEEE 1394 Controller
+ 1025 0121 Aspire 5920G
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 103c 30c1 Compaq 6910p
+ 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394
+ 0843 R5C843 MMC Host Controller
+ 1025 0121 Aspire 5920G
+ 1028 01d7 XPS M1210
+ 1028 01f3 Inspiron 1420
+ 1028 01f5 Dell Inspiron 1501
+ 103c 03b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 1183 0843 Alienware Aurora m9700
+ 0852 xD-Picture Card Controller
+ 1025 0121 Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30b5 Presario V3242AU
+ 103c 30b7 Presario V6133CL
+ 1043 1967 V6800V
+ 1180 0852 Pavilion 2410us
+ 1324 10cf P7120
+ e230 Memory Stick Host Controller
+ e822 MMC/SD Host Controller
+ 1028 040b Latitude E6510
+ e832 FireWire Host Controller
+ 1028 040b Latitude E6510
+1181 Telmatics International
+1183 Fujikura Ltd
+1184 Forks Inc
+1185 Dataworld International Ltd
+1186 D-Link System Inc
+ 0100 DC21041
+ 1002 DL10050 Sundance Ethernet
+ 1186 1002 DFE-550TX/FX
+ 1186 1012 DFE-580TX
+ 1025 AirPlus Xtreme G DWL-G650 Adapter
+ 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter
+ 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter
+ 1300 RTL8139 Ethernet
+ 1186 1300 DFE-538TX 10/100 Ethernet Adapter
+ 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter
+ 1186 1303 DFE-528TX 10/100 Fast Ethernet PCI Adapter
+ 1340 DFE-690TXD CardBus PC Card
+ 1405 DFE-520TX Fast Ethernet PCI Adapter
+ 1540 DFE-680TX
+ 1541 DFE-680TXD CardBus PC Card
+ 1561 DRP-32TXD Cardbus PC Card
+ 3300 DWL-510 / DWL-610 802.11b [Realtek RTL8180L]
+ 1186 3300 DWL-610 Wireless Cardbus Adapter
+ 1186 3301 DWL-510 Wireless PCI Adapter
+ 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B)
+ 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter
+ 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter
+ 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter
+ 3a08 AirXpert DWL-AG520 Wireless PCI Adapter
+ 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B)
+ 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B)
+ 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
+ 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter
+ 3a70 DWA-556 Xtreme N PCI Express Desktop Adapter
+ 3c00 D-link DWL-G650X
+ 3c09 AirPlus G DWL-G510
+ 4000 DL2000-based Gigabit Ethernet
+ 4001 DGE-550SX PCI-X Gigabit Ethernet Adapter
+ 4300 DGE-528T Gigabit Ethernet Adapter
+# There are at least 3 revisions of this adapter; 4800 is board revision A1 as far as I can tell, revision B1 is 4c00.
+ 4800 DGE-530T Gigabit Ethernet Adapter (rev 11)
+ 4b00 DGE-560T PCI Express Gigabit Ethernet Adapter
+ 4b01 DGE-530T Gigabit Ethernet Adapter (rev 11)
+ 4b02 DGE-560SX PCI Express Gigabit Ethernet Adapter
+ 4b03 DGE-550T Gigabit Ethernet Adapter V.B1
+ 4c00 Gigabit Ethernet Adapter
+ 1186 4c00 DGE-530T Gigabit Ethernet Adapter
+ 8400 D-Link DWL-650+ CardBus PC Card
+1187 Advanced Technology Laboratories, Inc.
+1188 Shima Seiki Manufacturing Ltd.
+1189 Matsushita Electronics Co Ltd
+118a Hilevel Technology
+118b Hypertec Pty Limited
+118c Corollary, Inc
+ 0014 PCIB [C-bus II to PCI bus host bridge chip]
+ 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter]
+118d BitFlow Inc
+ 0001 Raptor-PCI framegrabber
+ 0012 Model 12 Road Runner Frame Grabber
+ 0014 Model 14 Road Runner Frame Grabber
+ 0024 Model 24 Road Runner Frame Grabber
+ 0044 Model 44 Road Runner Frame Grabber
+ 0112 Model 12 Road Runner Frame Grabber
+ 0114 Model 14 Road Runner Frame Grabber
+ 0124 Model 24 Road Runner Frame Grabber
+ 0144 Model 44 Road Runner Frame Grabber
+ 0212 Model 12 Road Runner Frame Grabber
+ 0214 Model 14 Road Runner Frame Grabber
+ 0224 Model 24 Road Runner Frame Grabber
+ 0244 Model 44 Road Runner Frame Grabber
+ 0312 Model 12 Road Runner Frame Grabber
+ 0314 Model 14 Road Runner Frame Grabber
+ 0324 Model 24 Road Runner Frame Grabber
+ 0344 Model 44 Road Runner Frame Grabber
+118e Hermstedt GmbH
+118f Green Logic
+1190 Tripace
+ c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter
+1191 Artop Electronic Corp
+ 0003 SCSI Cache Host Adapter
+ 0004 ATP8400
+ 0005 ATP850UF
+ 0006 ATP860 NO-BIOS
+ 0007 ATP860
+ 0008 ATP865 NO-ROM
+ 0009 ATP865
+ 000a ATP867-A
+ 000b ATP867-B
+ 000d ATP8620
+ 000e ATP8620
+ 8002 AEC6710 SCSI-2 Host Adapter
+ 8010 AEC6712UW SCSI
+ 8020 AEC6712U SCSI
+ 8030 AEC6712S SCSI
+ 8040 AEC6712D SCSI
+ 8050 AEC6712SUW SCSI
+ 8060 AEC6712 SCSI
+ 8080 AEC67160 SCSI
+ 8081 AEC67160S SCSI
+ 808a AEC67162 2-ch. LVD SCSI
+1192 Densan Company Ltd
+1193 Zeitnet Inc.
+ 0001 1221
+ 0002 1225
+1194 Toucan Technology
+1195 Ratoc System Inc
+1196 Hytec Electronics Ltd
+1197 Gage Applied Sciences, Inc.
+ 010c CompuScope 82G 8bit 2GS/s Analog Input Card
+1198 Lambda Systems Inc
+1199 Attachmate Corporation
+ 6832 Sierra Wireless MC8780 Device
+119a Mind Share, Inc.
+119b Omega Micro Inc.
+ 1221 82C092G
+119c Information Technology Inst.
+119d Bug, Inc. Sapporo Japan
+119e Fujitsu Microelectronics Ltd.
+ 0001 FireStream 155
+ 0003 FireStream 50
+119f Bull HN Information Systems
+11a0 Convex Computer Corporation
+11a1 Hamamatsu Photonics K.K.
+11a2 Sierra Research and Technology
+11a3 Deuretzbacher GmbH & Co. Eng. KG
+11a4 Barco Graphics NV
+11a5 Microunity Systems Eng. Inc
+11a6 Pure Data Ltd.
+11a7 Power Computing Corp.
+11a8 Systech Corp.
+11a9 InnoSys Inc.
+ 4240 AMCC S933Q Intelligent Serial Card
+11aa Actel
+# Nee Galileo Technology, Inc.
+11ab Marvell Technology Group Ltd.
+ 0146 GT-64010/64010A System Controller
+ 0f53 88E6318 Link Street network controller
+ 11ab MV88SE614x SATA II PCI-E controller
+ 138f W8300 802.11 Adapter (rev 07)
+ 1fa6 Marvell W8300 802.11 Adapter
+ 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.A1)
+ 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset
+ 1faa 88w8335 [Libertas] 802.11b/g Wireless
+ 1385 4e00 WG511v2 54 Mbps Wireless PC Card
+ 1385 6b00 WG311v3 802.11g Wireless PCI Adapter
+ 1737 0040 WPC54G v5 802.11g Wireless-G Notebook Adapter
+ 2211 88SB2211 PCI Express to PCI Bridge
+ 2a01 88W8335 [Libertas] 802.11b/g Wireless
+ 2a02 88W8361 [TopDog] 802.11n Wireless
+ 07d1 3b02 DIR-615 rev. A1 Mini PCI Wireless Module
+ 1385 7e00 WN311T RangeMax Next 300 Mbps Wireless PCI Adapter
+ 1799 801b F5D8011 v2 802.11n N1 Wireless Notebook Card
+ 2a08 88W8362e [TopDog] 802.11a/b/g/n Wireless
+ 2a0a 88W8363 [TopDog] 802.11n Wireless
+ 2a0c 88W8363 [TopDog] 802.11n Wireless
+ 2a24 88W8363 [TopDog] 802.11n Wireless
+ 2a2b 88W8687 [TopDog] 802.11b/g Wireless
+ 2a30 88W8687 [TopDog] 802.11b/g Wireless
+ 2a40 88W8366 [TopDog] 802.11n Wireless
+ 2a43 88W8366 [TopDog] 802.11n Wireless
+ 4101 OLPC Cafe Controller Secure Digital Controller
+ 4320 88E8001 Gigabit Ethernet Controller
+ 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS)
+ 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS)
+ 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus)
+ 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus)
+ 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)
+ 10b8 b452 EZ Card 1000 (SMC9452TXV.2)
+ 11ab 0121 Marvell RDK-8001
+ 11ab 0321 Marvell RDK-8003
+ 11ab 1021 Marvell RDK-8010
+ 11ab 4320 Marvell Yukon Gigabit Ethernet 10/100/1000Baset-T Constroller (Asus)
+ 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)
+ 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)
+ 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)
+ 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit)
+ 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill)
+ 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox)
+ 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron)
+ 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)
+ 4340 88E8021 PCI-X IPMI Gigabit Ethernet Controller
+ 4341 88E8022 PCI-X IPMI Gigabit Ethernet Controller
+ 4342 88E8061 PCI-E IPMI Gigabit Ethernet Controller
+ 4343 88E8062 PCI-E IPMI Gigabit Ethernet Controller
+ 4344 88E8021 PCI-X IPMI Gigabit Ethernet Controller
+ 4345 88E8022 PCI-X IPMI Gigabit Ethernet Controller
+ 4346 88E8061 PCI-E IPMI Gigabit Ethernet Controller
+ 4347 88E8062 PCI-E IPMI Gigabit Ethernet Controller
+ 4c53 10d0 Telum ASLP10 PrAMC Gigabit Ethernet
+ 4350 88E8035 PCI-E Fast Ethernet Controller
+ 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba)
+ 11ab 3521 Marvell RDK-8035
+ 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE)
+ 4351 88E8036 PCI-E Fast Ethernet Controller
+ 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron)
+ 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic)
+ 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba)
+ 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal)
+ 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec)
+ 11ab 3621 Marvell RDK-8036
+ 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard
+ 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima)
+ 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE)
+ 4352 88E8038 PCI-E Fast Ethernet Controller
+ 4353 88E8039 PCI-E Fast Ethernet Controller
+ 104d 902d VAIO VGN-NR120E
+ 4354 88E8040 PCI-E Fast Ethernet Controller
+ 4355 88E8040T PCI-E Fast Ethernet Controller
+ 1179 ff50 Satellite P305D-S8995E
+ 4356 88EC033 PCI-E Fast Ethernet Controller
+ 4357 88E8042 PCI-E Fast Ethernet Controller
+ 435a 88E8048 PCI-E Fast Ethernet Controller
+ 4360 88E8052 PCI-E ASF Gigabit Ethernet Controller
+ 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus)
+ 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron)
+ 11ab 5221 Marvell RDK-8052
+ 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
+ 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI)
+ 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock)
+ a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen)
+ 4361 88E8050 PCI-E ASF Gigabit Ethernet Controller
+ 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway)
+ 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel)
+ 8086 3063 D925XCVLK mainboard
+ 8086 3439 Marvell 88E8050 Gigabit Ethernet Controller (Intel)
+ 4362 88E8053 PCI-E Gigabit Ethernet Controller
+ 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus)
+ 1043 8142 Marvell 88E8053 Gigabit Ethernet controller PCIe (Asus)
+ 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem)
+ 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)
+ 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO)
+ 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)
+ 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal)
+ 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec)
+ 11ab 5321 Marvell RDK-8053
+ 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+ 13d1 ac11 EGE5K - Giga Ethernet Expresscard
+ 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
+ 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI)
+ 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal)
+ 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo)
+ 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI)
+ 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima)
+ 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima)
+ 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox)
+ 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron)
+ 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta)
+ 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock)
+ 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+ 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)
+ a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen)
+ 4363 88E8055 PCI-E Gigabit Ethernet Controller
+ 4364 88E8056 PCI-E Gigabit Ethernet Controller
+ 11ba 00ba 8056 Gigabit Ethernet Controller
+ 4365 88E8070 based Ethernet Controller
+ 4366 88EC036 PCI-E Gigabit Ethernet Controller
+ 4367 88EC032 Ethernet Controller
+ 4368 88EC034 Ethernet Controller
+ 4369 88EC042 Ethernet Controller
+ 436a 88E8058 PCI-E Gigabit Ethernet Controller
+ 436b 88E8071 PCI-E Gigabit Ethernet Controller
+ 436c 88E8072 PCI-E Gigabit Ethernet Controller
+ 436d 88E8055 PCI-E Gigabit Ethernet Controller
+ 4370 88E8075 PCI-E Gigabit Ethernet Controller
+ 4380 88E8057 PCI-E Gigabit Ethernet Controller
+# AVB = "Audio Video Bridging"
+ 4381 Yukon Optima 88E8059 [PCIe Gigabit Ethernet Controller with AVB]
+ 4611 GT-64115 System Controller
+ 4620 GT-64120/64120A/64121A System Controller
+ 4801 GT-48001
+ 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card
+ 5040 MV88SX5040 4-port SATA I PCI-X Controller
+ 5041 MV88SX5041 4-port SATA I PCI-X Controller
+ 5080 MV88SX5080 8-port SATA I PCI-X Controller
+ 5081 MV88SX5081 8-port SATA I PCI-X Controller
+ 5181 88f5181 [Orion-1] ARM SoC
+ 5182 88f5182 [Orion-NAS] ARM SoC
+ 5281 88f5281 [Orion-2] ARM SoC
+ 6041 MV88SX6041 4-port SATA II PCI-X Controller
+ 6042 88SX6042 PCI-X 4-Port SATA-II
+ 6081 MV88SX6081 8-port SATA II PCI-X Controller
+ 6101 88SE6101/6102 single-port PATA133 interface
+ 6111 88SE6111 1-port PATA133(IDE) and 1-port SATA II Controllers
+ 6121 88SE6121 SATA II Controller
+ 6141 88SE614x SATA II PCI-E controller
+ 6145 88SE6145 SATA II PCI-E controller
+ 6180 88F6180 [Kirkwood] ARM SoC
+ 6192 88F6190/6192 [Kirkwood] ARM SoC
+ 6281 88F6281 [Kirkwood] ARM SoC
+# This device ID was used for earlier chips.
+ 6381 MV78xx0 [Discovery Innovation] ARM SoC
+ 6440 88SE6440 SAS/SATA PCIe controller
+ 6450 64560 System Controller
+ 6460 MV64360/64361/64362 System Controller
+ 6480 MV64460/64461/64462 System Controller
+ 1775 c200 C2K CompactPCI single board computer
+ 6485 MV64460/64461/64462 System Controller, Revision B
+ 7042 88SX7042 PCI-e 4-port SATA-II
+ 16b8 434b Tempo SATA E4P
+ 7810 MV78100 [Discovery Innovation] ARM SoC
+ 7820 MV78200 [Discovery Innovation] ARM SoC
+ f003 GT-64010 Primary Image Piranha Image Generator
+11ac Canon Information Systems Research Aust.
+11ad Lite-On Communications Inc
+ 0002 LNE100TX
+ 11ad 0002 LNE100TX
+ 11ad 0003 LNE100TX
+ 11ad f003 LNE100TX
+ 11ad ffff LNE100TX
+ 1385 f004 FA310TX
+ 2646 f002 KNE110TX EtheRx Fast Ethernet
+ c115 LNE100TX [Linksys EtherFast 10/100]
+ 11ad c001 LNE100TX [ver 2.0]
+ 2646 000b KNE111TX
+11ae Aztech System Ltd
+11af Avid Technology Inc.
+ 0001 Cinema
+ ee40 Digidesign Audiomedia III
+11b0 V3 Semiconductor Inc.
+ 0002 V300PSC
+ 0292 V292PBC [Am29030/40 Bridge]
+ 0960 V96xPBC
+ c960 V96DPC
+11b1 Apricot Computers
+11b2 Eastman Kodak
+11b3 Barr Systems Inc.
+11b4 Leitch Technology International
+11b5 Radstone Technology Plc
+11b6 United Video Corp
+11b7 Motorola
+11b8 XPoint Technologies, Inc
+ 0001 Quad PeerMaster
+11b9 Pathlight Technology Inc.
+ c0ed SSA Controller
+11ba Videotron Corp
+11bb Pyramid Technology
+11bc Network Peripherals Inc
+ 0001 NP-PCI
+11bd Pinnacle Systems Inc.
+ 002e PCTV 40i
+ 0040 Royal TS Function 1
+ 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 1
+ 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 1
+ 0041 RoyalTS Function 2
+ 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 2
+ 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 2
+ 0042 Royal TS Function 3
+ 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Common
+ 11bd 0045 PCTV Dual Sat Pro PCI 4000i Common
+ 0051 PCTV HD 800i
+ bede AV/DV Studio Capture Card
+11be International Microcircuits Inc
+11bf Astrodesign, Inc.
+11c0 Hewlett Packard
+# Nee Lucent Microelectronics
+11c1 Agere Systems
+ 0440 56k WinModem
+ 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd
+ 10cf 102c LB LT Modem V.90 56k
+ 10cf 104a BIBLO LT Modem 56k
+ 10cf 105f LB2 LT Modem V.90 56k
+ 1179 0001 Internal V.90 Modem
+ 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 122d 4101 MDP7800-U Modem
+ 122d 4102 MDP7800SP-U Modem
+ 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 144d 2101 LT56PV Modem
+ 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 0441 56k WinModem
+ 1033 804d LT WinModem 56k Data+Fax
+ 1033 8065 LT WinModem 56k Data+Fax
+ 1092 0440 Supra 56i
+ 1179 0001 Internal V.90 Modem
+ 11c1 0440 LT WinModem 56k Data+Fax
+ 11c1 0441 LT WinModem 56k Data+Fax
+ 122d 4100 MDP7800-U Modem
+ 13e0 0040 LT WinModem 56k Data+Fax
+ 13e0 0100 LT WinModem 56k Data+Fax
+ 13e0 0410 LT WinModem 56k Data+Fax
+ 13e0 0420 TelePath Internet 56k WinModem
+ 13e0 0440 LT WinModem 56k Data+Fax
+ 13e0 0443 LT WinModem 56k Data+Fax
+ 13e0 f102 LT WinModem 56k Data+Fax
+ 1416 9804 CommWave 56k Modem
+ 141d 0440 LT WinModem 56k Data+Fax
+ 144f 0441 Lucent 56k V.90 DF Modem
+ 144f 0449 Lucent 56k V.90 DF Modem
+ 144f 110d Lucent Win Modem
+ 1468 0441 Presario 56k V.90 DF Modem
+ 1668 0440 Lucent Win Modem
+ 0442 56k WinModem
+ 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 144d 2104 LT56PT Modem
+ 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 0443 LT WinModem
+ 0444 LT WinModem
+ 0445 LT WinModem
+ 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card)
+ 8086 2204 PRO/100+ MiniPCI on Armada E500
+ 0446 LT WinModem
+ 0447 LT WinModem
+ 0448 WinModem 56k
+ 1014 0131 Lucent Win Modem
+ 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd
+ 13e0 0030 56k Voice Modem
+ 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd
+# Actiontech eth+modem card as used by Dell &c.
+ 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem)
+ 0449 L56xM+S [Mars-2] WinModem 56k
+ 0e11 b14d 56k V.90 Modem
+ 1014 018c ThinkPad 600X
+ 13e0 0020 LT WinModem 56k Data+Fax
+ 13e0 0041 TelePath Internet 56k WinModem
+ 1436 0440 Lucent Win Modem
+ 144f 0449 Lucent 56k V.90 DFi Modem
+ 1468 0410 IBM ThinkPad T23
+ 1468 0440 Lucent Win Modem
+ 1468 0449 Presario 56k V.90 DFi Modem
+ 044a F-1156IV WinModem (V90, 56KFlex)
+ 10cf 1072 LB Global LT Modem
+ 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+ 044b LT WinModem
+ 044c LT WinModem
+ 044d LT WinModem
+ 044e LT WinModem
+ 044f V90 WildWire Modem
+ 0450 LT WinModem
+ 1033 80a8 Versa Note Vxi
+ 144f 4005 Magnia SG20
+ 1468 0450 Evo N600c
+ 0451 LT WinModem
+ 0452 LT WinModem
+ 0453 LT WinModem
+ 0454 LT WinModem
+ 0455 LT WinModem
+ 0456 LT WinModem
+ 0457 LT WinModem
+ 0458 LT WinModem
+ 0459 LT WinModem
+ 045a LT WinModem
+ 045c LT WinModem
+ 0461 V90 WildWire Modem
+ 0462 V90 WildWire Modem
+ 0480 Venus Modem (V90, 56KFlex)
+ 048c V.92 56K WinModem
+# InPorte Home Internal 56k Modem/fax/answering machine/SMS Features
+ 048f V.92 56k WinModem
+ 0620 Lucent V.92 Data/Fax Modem
+ 1040 HDA softmodem
+ 2600 StarPro26XX family (SP2601, SP2603, SP2612) DSP
+ 3026 HDA Modem
+ 5400 OR3TP12 FPSC
+ 5656 Venus Modem
+ 5801 USB
+ 5802 USS-312 USB Controller
+ 5803 USS-344S USB Controller
+ 5811 FW322/323
+ 1043 8294 IEEE 1394a Firewire Controller
+ 8086 524c D865PERL mainboard
+ dead 0800 FireWire Host Bus Adapter
+ 5901 FW643 PCI Express1394b Controller (PHY/Link)
+ 1443 0643 FireBoard800-e V.2
+ 1546 0643 FWB-PCIE1X20
+ 8110 T8110 H.100/H.110 TDM switch
+ 12d9 000c E1/T1 PMXc cPCI carrier card
+ ab10 WL60010 Wireless LAN MAC
+ ab11 WL60040 Multimode Wireles LAN MAC
+ 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102)
+ 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512)
+ 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106)
+ 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516)
+ ab20 ORiNOCO PCI Adapter
+ ab21 Agere Wireless PCI Adapter
+ ab30 Hermes2 Mini-PCI WaveLAN a/b/g
+ 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g
+ ed00 ET-131x PCI-E Ethernet Controller
+ ed01 ET-131x PCI-E Ethernet Controller
+11c2 Sand Microelectronics
+11c3 NEC Corporation
+11c4 Document Technologies, Inc
+11c5 Shiva Corporation
+11c6 Dainippon Screen Mfg. Co. Ltd
+11c7 D.C.M. Data Systems
+11c8 Dolphin Interconnect Solutions AS
+ 0658 PSB32 SCI-Adapter D31x
+ d665 PSB64 SCI-Adapter D32x
+ d667 PSB66 SCI-Adapter D33x
+11c9 Magma
+ 0010 16-line serial port w/- DMA
+ 0011 4-line serial port w/- DMA
+11ca LSI Systems, Inc
+11cb Specialix Research Ltd.
+ 2000 PCI_9050
+ 11cb 0200 SX
+ 11cb b008 I/O8+
+ 4000 SUPI_1
+ 8000 T225
+11cc Michels & Kleberhoff Computer GmbH
+11cd HAL Computer Systems, Inc.
+11ce Netaccess
+11cf Pioneer Electronic Corporation
+11d0 Lockheed Martin Federal Systems-Manassas
+11d1 Auravision
+ 01f7 VxP524
+ 01f9 VxP951
+11d2 Intercom Inc.
+11d3 Trancell Systems Inc
+11d4 Analog Devices
+ 0078 AD1986HD sound chip
+ 1535 Blackfin BF535 processor
+ 1805 SM56 PCI modem
+ 1889 AD1889 sound chip
+ 194a AD1984A sound chip
+ 1981 AD1981HD sound chip
+ 1983 AD1983HD sound chip
+ 1984 AD1984HD sound chip
+ 17aa 20bb T61p Notebook
+ 1986 AD1986A sound chip
+ 11d4 1986 Lenovo N100 B9G
+ 198b AD1988B Sound Chip
+ 5340 AD1881 sound chip
+11d5 Ikon Corporation
+ 0115 10115
+ 0117 10117
+11d6 Tekelec Telecom
+11d7 Trenton Technology, Inc.
+11d8 Image Technologies Development
+11d9 TEC Corporation
+11da Novell
+11db Sega Enterprises Ltd
+11dc Questra Corporation
+11dd Crosfield Electronics Limited
+11de Zoran Corporation
+ 6017 miroVIDEO DC30
+ 6057 ZR36057PQC Video cutting chipset
+ 1031 7efe DC10 Plus
+ 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board
+ 12f8 8a02 Tekram Video Kit
+ 13ca 4231 JPEG/TV Card
+ 6120 ZR36120
+ 1328 f001 Cinemaster C DVD Decoder
+ 13c2 0000 MediaFocus Satellite TV Card
+ 1de1 9fff Video Kit C210
+11df New Wave PDG
+11e0 Cray Communications A/S
+11e1 GEC Plessey Semi Inc.
+11e2 Samsung Information Systems America
+11e3 Quicklogic Corporation
+ 0001 COM-ON-AIR Dosch&Amand DECT
+ 0560 QL5064 Companion Design Demo Board
+ 5030 PC Watchdog
+ 8417 QL5064 [QuickPCI] PCI v2.2 bridge for SMT417 Dual TMS320C6416T PMC Module
+11e4 Second Wave Inc
+11e5 IIX Consulting
+11e6 Mitsui-Zosen System Research
+11e7 Toshiba America, Elec. Company
+11e8 Digital Processing Systems Inc.
+11e9 Highwater Designs Ltd.
+11ea Elsag Bailey
+11eb Formation Inc.
+11ec Coreco Inc
+ 000d Oculus-F/64P
+ 1800 Cobra/C6
+11ed Mediamatics
+11ee Dome Imaging Systems Inc
+11ef Nicolet Technologies B.V.
+11f0 Compu-Shack
+ 4231 FDDI
+ 4232 FASTline UTP Quattro
+ 4233 FASTline FO
+ 4234 FASTline UTP
+ 4235 FASTline-II UTP
+ 4236 FASTline-II FO
+ 4731 GIGAline
+11f1 Symbios Logic Inc
+11f2 Picture Tel Japan K.K.
+11f3 Keithley Metrabyte
+ 0011 KPCI-PIO24
+11f4 Kinetic Systems Corporation
+ 2915 CAMAC controller
+11f5 Computing Devices International
+11f6 Compex
+ 0112 ENet100VG4
+ 0113 FreedomLine 100
+ 1401 ReadyLink 2000
+ 2011 RL100-ATX 10/100
+ 11f6 2011 RL100-ATX
+ 2201 ReadyLink 100TX (Winbond W89C840)
+ 11f6 2011 ReadyLink 100TX
+ 9881 RL100TX Fast Ethernet
+11f7 Scientific Atlanta
+11f8 PMC-Sierra Inc.
+ 5220 BR522x [PMC-Sierra maxRAID SAS Controller]
+ 7364 PM7364 [FREEDM - 32 Frame Engine & Datalink Mgr]
+ 7375 PM7375 [LASAR-155 ATM SAR]
+ 7384 PM7384 [FREEDM - 84P672 Frm Engine & Datalink Mgr]
+ 8000 PM8000 [SPC - SAS Protocol Controller]
+11f9 I-Cube Inc
+11fa Kasan Electronics Company, Ltd.
+11fb Datel Inc
+11fc Silicon Magic
+11fd High Street Consultants
+11fe Comtrol Corporation
+ 0001 RocketPort 32 port w/external I/F
+ 0002 RocketPort 8 port w/external I/F
+ 0003 RocketPort 16 port w/external I/F
+ 0004 RocketPort 4 port w/quad cable
+ 0005 RocketPort 8 port w/octa cable
+ 0006 RocketPort 8 port w/RJ11 connectors
+ 0007 RocketPort 4 port w/RJ11 connectors
+ 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector
+ 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector
+ 000a RocketPort Plus 4 port
+ 000b RocketPort Plus 8 port
+ 000c RocketModem 6 port
+ 000d RocketModem 4-port
+ 000e RocketPort Plus 2 port RS232
+ 000f RocketPort Plus 2 port RS422
+ 0040 RocketPort Infinity Octa, 8port, RJ45
+ 0041 RocketPort Infinity 32port, External Interface
+ 0042 RocketPort Infinity 8port, External Interface
+ 0043 RocketPort Infinity 16port, External Interface
+ 0044 RocketPort Infinity Quad, 4port, DB
+ 0045 RocketPort Infinity Octa, 8port, DB
+ 0047 RocketPort Infinity 4port, RJ45
+ 004f RocketPort Infinity 2port, SMPTE
+ 0052 RocketPort Infinity Octa, 8port, SMPTE
+ 0801 RocketPort UPCI 32 port w/external I/F
+ 0802 RocketPort UPCI 8 port w/external I/F
+ 0803 RocketPort UPCI 16 port w/external I/F
+ 0805 RocketPort UPCI 8 port w/octa cable
+ 080c RocketModem III 8 port
+ 080d RocketModem III 4 port
+ 0811 RocketPort UPCI Plus 8 port RS232
+ 0812 RocketPort UPCI Plus 8 port RS422
+ 0903 RocketPort Compact PCI 16 port w/external I/F
+ 8015 RocketPort 4-port UART 16954
+11ff Scion Corporation
+ 0003 AG-5
+1200 CSS Corporation
+1201 Vista Controls Corp
+1202 Network General Corp.
+ 4300 Gigabit Ethernet Adapter
+ 1202 9841 SK-9841 LX
+ 1202 9842 SK-9841 LX dual link
+ 1202 9843 SK-9843 SX
+ 1202 9844 SK-9843 SX dual link
+1203 Bayer Corporation, Agfa Division
+1204 Lattice Semiconductor Corporation
+1205 Array Corporation
+1206 Amdahl Corporation
+1208 Parsytec GmbH
+ 4853 HS-Link Device
+1209 SCI Systems Inc
+120a Synaptel
+120b Adaptive Solutions
+120c Technical Corp.
+120d Compression Labs, Inc.
+120e Cyclades Corporation
+ 0100 Cyclom-Y below first megabyte
+ 0101 Cyclom-Y above first megabyte
+ 0102 Cyclom-4Y below first megabyte
+ 0103 Cyclom-4Y above first megabyte
+ 0104 Cyclom-8Y below first megabyte
+ 0105 Cyclom-8Y above first megabyte
+ 0200 Cyclades-Z below first megabyte
+ 0201 Cyclades-Z above first megabyte
+ 0300 PC300/RSV or /X21 (2 ports)
+ 0301 PC300/RSV or /X21 (1 port)
+ 0310 PC300/TE (2 ports)
+ 0311 PC300/TE (1 port)
+ 0320 PC300/TE-M (2 ports)
+ 0321 PC300/TE-M (1 port)
+ 0400 PC400
+120f Essential Communications
+ 0001 Roadrunner serial HIPPI
+1210 Hyperparallel Technologies
+1211 Braintech Inc
+1212 Kingston Technology Corp.
+1213 Applied Intelligent Systems, Inc.
+1214 Performance Technologies, Inc.
+1215 Interware Co., Ltd
+1216 Purup Prepress A/S
+1217 O2 Micro, Inc.
+ 00f7 Firewire (IEEE 1394)
+ 1179 ff50 Satellite P305D-S8995E
+ 6729 OZ6729
+ 673a OZ6730
+ 6832 OZ6832/6833 CardBus Controller
+ 6836 OZ6836/6860 CardBus Controller
+ 6872 OZ6812 CardBus Controller
+ 6925 OZ6922 CardBus Controller
+ 6933 OZ6933/711E1 CardBus/SmartCardBus Controller
+ 1025 1016 Travelmate 612 TX
+ 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller
+ 1014 020c ThinkPad R30
+ 1028 0152 Latitude D500
+ 1179 0001 Magnia Z310
+ 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 1734 106c Amilo A1645
+ 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller
+ 7113 OZ711EC1 SmartCardBus Controller
+ 1025 0035 TravelMate 660
+ 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller
+ 7120 Integrated MMC/SD Controller
+ 1179 ff50 Satellite P305D-S8995E
+ 7130 Integrated MS/xD Controller
+ 1179 ff50 Satellite P305D-S8995E
+ 7134 OZ711MP1/MS1 MemoryCardBus Controller
+ 7135 Cardbus bridge
+ 7136 OZ711SP1 Memory CardBus Controller
+ 71e2 OZ711E2 SmartCardBus Controller
+ 7212 OZ711M2 4-in-1 MemoryCardBus Controller
+ 7213 OZ6933E CardBus Controller
+ 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 10cf 11c4 Lifebook P5020D Laptop
+ 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller
+1218 Hybricon Corp.
+1219 First Virtual Corporation
+121a 3Dfx Interactive, Inc.
+ 0001 Voodoo
+ 0002 Voodoo 2
+ 0003 Voodoo Banshee
+ 1092 0003 Monster Fusion
+ 1092 4000 Monster Fusion
+ 1092 4002 Monster Fusion
+ 1092 4801 Monster Fusion AGP
+ 1092 4803 Monster Fusion AGP
+ 1092 8030 Monster Fusion
+ 1092 8035 Monster Fusion AGP
+ 10b0 0001 Dragon 4000
+ 1102 1017 3D Blaster Banshee PCI (CT6760)
+ 1102 1018 3D Blaster Banshee VE
+ 121a 0001 Voodoo Banshee AGP
+ 121a 0003 Voodoo Banshee AGP SGRAM
+ 121a 0004 Voodoo Banshee
+ 139c 0016 Raven
+ 139c 0017 Raven
+ 14af 0002 Maxi Gamer Phoenix
+ 0004 Voodoo Banshee [Velocity 100]
+ 0005 Voodoo 3
+ 121a 0004 Voodoo3 AGP
+ 121a 0030 Voodoo3 AGP
+ 121a 0031 Voodoo3 AGP
+ 121a 0034 Voodoo3 AGP
+ 121a 0036 Voodoo3 2000 PCI
+ 121a 0037 Voodoo3 AGP
+ 121a 0038 Voodoo3 AGP
+ 121a 003a Voodoo3 AGP
+ 121a 0044 Voodoo3
+ 121a 004b Velocity 100
+ 121a 004c Velocity 200
+ 121a 004d Voodoo3 AGP
+ 121a 004e Voodoo3 AGP
+ 121a 0051 Voodoo3 AGP
+ 121a 0052 Voodoo3 AGP
+ 121a 0057 Voodoo3 3000 PCI
+ 121a 0060 Voodoo3 3500 TV (NTSC)
+ 121a 0061 Voodoo3 3500 TV (PAL)
+ 121a 0062 Voodoo3 3500 TV (SECAM)
+ 0009 Voodoo 4 / Voodoo 5
+ 121a 0003 Voodoo5 PCI 5500
+ 121a 0009 Voodoo5 AGP 5500/6000
+ 0057 Voodoo 3/3000 [Avenger]
+121b Advanced Telecommunications Modules
+121c Nippon Texaco., Ltd
+121d Lippert Automationstechnik GmbH
+121e CSPI
+ 0201 Myrinet 2000 Scalable Cluster Interconnect
+121f Arcus Technology, Inc.
+1220 Ariel Corporation
+ 1220 AMCC 5933 TMS320C80 DSP/Imaging board
+1221 Contec Co., Ltd
+ 9172 PO-64L(PCI)H [Isolated Digital Output Board for PCI]
+ 91a2 PO-32L(PCI)H [Isolated Digital Output Board for PCI]
+ 91c3 DA16-16(LPCI)L [Un-insulated highly precise analog output board for Low Profile PCI]
+ b152 DIO-96D2-LPCI
+ c103 ADA16-32/2(PCI)F [High-Speed Analog I/O Board for PCI]
+1222 Ancor Communications, Inc.
+1223 Artesyn Communication Products
+ 0003 PM/Link
+ 0004 PM/T1
+ 0005 PM/E1
+ 0008 PM/SLS
+ 0009 BajaSpan Resource Target
+ 000a BajaSpan Section 0
+ 000b BajaSpan Section 1
+ 000c BajaSpan Section 2
+ 000d BajaSpan Section 3
+ 000e PM/PPC
+1224 Interactive Images
+1225 Power I/O, Inc.
+1227 Tech-Source
+ 0006 Raptor GFX 8P
+ 0023 Raptor GFX [1100T]
+ 0045 Raptor 4000-L [Linux version]
+ 004a Raptor 4000-LR-L [Linux version]
+1228 Norsk Elektro Optikk A/S
+1229 Data Kinesis Inc.
+122a Integrated Telecom
+122b LG Industrial Systems Co., Ltd
+122c Sican GmbH
+122d Aztech System Ltd
+ 1206 368DSP
+ 1400 Trident PCI288-Q3DII (NX)
+ 50dc 3328 Audio
+ 122d 0001 3328 Audio
+ 80da 3328 Audio
+ 122d 0001 3328 Audio
+122e Xyratex
+ 7722 Napatech XL1
+ 7724 Napatech XL2/XA
+ 7729 Napatech XD
+122f Andrew Corporation
+1230 Fishcamp Engineering
+1231 Woodward McCoach, Inc.
+ 04e1 Desktop PCI Telephony 4
+ 05e1 Desktop PCI Telephony 5/6
+ 0d00 LightParser
+ 0d02 LightParser 2
+ 0d13 Desktop PCI L1/L3 Telephony
+1232 GPT Limited
+1233 Bus-Tech, Inc.
+# Also Bochs uses this for virtual VGA...
+1234 Technical Corp.
+1235 Risq Modular Systems, Inc.
+1236 Sigma Designs Corporation
+ 0000 RealMagic64/GX
+ 6401 REALmagic 64/GX (SD 6425)
+1237 Alta Technology Corporation
+1238 Adtran
+1239 3DO Company
+123a Visicom Laboratories, Inc.
+123b Seeq Technology, Inc.
+123c Century Systems, Inc.
+123d Engineering Design Team, Inc.
+ 0000 EasyConnect 8/32
+ 0002 EasyConnect 8/64
+ 0003 EasyIO
+123e Simutech, Inc.
+123f C-Cube Microsystems
+ 00e4 MPEG
+ 8120 E4?
+ 11bd 0006 DV500 E4
+ 11bd 000a DV500 E4
+ 11bd 000f DV500 E4
+ 1809 0016 Emuzed MAUI-III PCI PVR FM TV
+ 8888 Cinemaster C 3.0 DVD Decoder
+ 1002 0001 Cinemaster C 3.0 DVD Decoder
+ 1002 0002 Cinemaster C 3.0 DVD Decoder
+ 1328 0001 Cinemaster C 3.0 DVD Decoder
+1240 Marathon Technologies Corp.
+1241 DSC Communications
+# Formerly Jaycor Networks, Inc.
+1242 JNI Corporation
+ 1560 JNIC-1560 PCI-X Fibre Channel Controller
+ 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+ 1242 656a FCX-6562 PCI-X Fibre Channel Adapter
+ 4643 FCI-1063 Fibre Channel Adapter
+ 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+ 656a FCX-6562 PCI-X Fibre Channel Adapter
+1243 Delphax
+# Audio-Visuelles Marketing und Computersysteme
+1244 AVM GmbH
+ 0700 B1 ISDN
+ 0800 C4 ISDN
+ 0a00 A1 ISDN [Fritz]
+ 1244 0a00 FRITZ!Card ISDN Controller
+ 0e00 Fritz!PCI v2.0 ISDN
+ 1100 C2 ISDN
+ 1200 T1 ISDN
+ 2700 Fritz!Card DSL SL
+ 2900 Fritz!Card DSL v2.0
+1245 A.P.D., S.A.
+1246 Dipix Technologies, Inc.
+1247 Xylon Research, Inc.
+1248 Central Data Corporation
+1249 Samsung Electronics Co., Ltd.
+124a AEG Electrocom GmbH
+124b SBS/Greenspring Modular I/O
+ 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier
+ 124b 9080 PCI9080 Bridge
+124c Solitron Technologies, Inc.
+124d Stallion Technologies, Inc.
+ 0000 EasyConnection 8/32
+ 0002 EasyConnection 8/64
+ 0003 EasyIO
+ 0004 EasyConnection/RA
+124e Cylink
+124f Infortrend Technology, Inc.
+ 0041 IFT-2000 Series RAID Controller
+1250 Hitachi Microcomputer System Ltd
+1251 VLSI Solutions Oy
+1253 Guzik Technical Enterprises
+1254 Linear Systems Ltd.
+ 0065 DVB Master FD
+ 007c DVB Master Quad/o
+1255 Optibase Ltd
+ 1110 MPEG Forge
+ 1210 MPEG Fusion
+ 2110 VideoPlex
+ 2120 VideoPlex CC
+ 2130 VideoQuest
+1256 Perceptive Solutions, Inc.
+ 4201 PCI-2220I
+ 4401 PCI-2240I
+ 5201 PCI-2000
+1257 Vertex Networks, Inc.
+1258 Gilbarco, Inc.
+1259 Allied Telesyn International
+ 2560 AT-2560 Fast Ethernet Adapter (i82557B)
+ 2801 AT-2801FX (RTL-8139)
+ a117 RTL81xx Fast Ethernet
+ a11e RTL81xx Fast Ethernet
+ a120 21x4x DEC-Tulip compatible 10/100 Ethernet
+125a ABB Power Systems
+125b Asix Electronics Corporation
+ 1400 AX88141 Fast Ethernet Controller
+ 1186 1100 AX8814X Based PCI Fast Ethernet Adapter
+125c Aurora Technologies, Inc.
+ 0101 Saturn 4520P
+ 0640 Aries 16000P
+125d ESS Technology
+ 0000 ES336H Fax Modem (Early Model)
+ 1948 ES1948 Maestro-1
+ 1968 ES1968 Maestro 2
+ 1028 0085 ES1968 Maestro-2 PCI
+ 1033 8051 ES1968 Maestro-2 Audiodrive
+ 1969 ES1969 Solo-1 Audiodrive
+ 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard
+ 125d 8888 Solo-1 Audio Adapter
+ 153b 111b Terratec 128i PCI
+ 1978 ES1978 Maestro 2E
+ 0e11 b112 Armada M700/E500
+ 1033 803c ES1978 Maestro-2E Audiodrive
+ 1033 8058 ES1978 Maestro-2E Audiodrive
+ 1092 4000 Monster Sound MX400
+ 1179 0001 ES1978 Maestro-2E Audiodrive
+ 1988 ES1988 Allegro-1
+ 0e11 0098 Evo N600c
+ 1092 4100 Sonic Impact S100
+ 125d 0431 Allegro AudioDrive
+ 125d 1988 ESS Allegro-1 Audiodrive
+ 125d 1998 Allegro AudioDrive
+ 125d 1999 Allegro-1 AudioDrive
+ 1989 ESS Modem
+ 125d 1989 ESS Modem
+ 1998 ES1983S Maestro-3i PCI Audio Accelerator
+ 1028 00b1 Latitude C600
+ 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100)
+ 1999 ES1983S Maestro-3i PCI Modem Accelerator
+ 199a ES1983S Maestro-3i PCI Audio Accelerator
+ 199b ES1983S Maestro-3i PCI Modem Accelerator
+ 2808 ES336H Fax Modem (Later Model)
+ 2838 ES2838/2839 SuperLink Modem
+ 2898 ES2898 Modem
+ 125d 0424 ES56-PI Data Fax Modem
+ 125d 0425 ES56T-PI Data Fax Modem
+ 125d 0426 ES56V-PI Data Fax Modem
+ 125d 0427 VW-PI Data Fax Modem
+ 125d 0428 ES56ST-PI Data Fax Modem
+ 125d 0429 ES56SV-PI Data Fax Modem
+ 147a c001 ES56-PI Data Fax Modem
+ 148d 1030 HCF WV-PI56 [ESS ES56-PI Data Fax Modem]
+ 14fe 0428 ES56-PI Data Fax Modem
+ 14fe 0429 ES56-PI Data Fax Modem
+125e Specialvideo Engineering SRL
+125f Concurrent Technologies, Inc.
+1260 Intersil Corporation
+ 3872 ISL3872 [Prism 3]
+ 1468 0202 LAN-Express IEEE 802.11b Wireless LAN
+ 3873 ISL3874 [Prism 2.5]/ISL3872 [Prism 3]
+ 10cf 1169 MBH7WM01-8734 802.11b Wireless Mini PCI Card [ISL3874]
+ 1186 3501 DWL-520 Wireless PCI Adapter (rev A) [ISL3874]
+ 1186 3700 DWL-520 Wireless PCI Adapter (rev E1) [ISL3872]
+ 1385 4105 MA311 802.11b wireless adapter [ISL3874]
+ 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter
+ 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter
+ 1737 3874 WMP11 v1 802.11b Wireless-B PCI Adapter [ISL3874]
+ 8086 2510 M3AWEB Wireless 802.11b MiniPCI Adapter
+ 8086 2513 Wireless 802.11b MiniPCI Adapter
+ 3877 ISL3877 [Prism Indigo]
+ 3886 ISL3886 [Prism Javelin/Prism Xbow]
+ 17cf 0037 XG-901 and clones Wireless Adapter
+ 3890 ISL3890 [Prism GT/Prism Duette]/ISL3886 [Prism Javelin/Prism Xbow]
+ 10b8 2802 SMC2802W V1 Wireless PCI Adapter [ISL3890]
+ 10b8 2835 SMC2835W Wireless Cardbus Adapter
+ 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter
+ 1113 4203 WN4201B
+ 1113 8201 T-Com T-Sinus 154pcicard Wireless PCI Adapter
+ 1113 b301 T-Sinus 154card Cardbus
+ 1113 ee03 SMC2802W V2 Wireless PCI Adapter [ISL3886]
+ 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter
+ 1186 3202 DWL-G650 A1 Wireless Adapter
+ 1259 c104 CG-WLCB54GT Wireless Adapter
+ 1260 0000 WG511 v1 54 Mbps Wireless PC Card
+ 1385 4800 WG511 v2/v3 54 Mbps Wireless PC Card
+ 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter
+ 17cf 0014 XG-600 and clones Wireless Adapter
+ 17cf 0020 XG-900 and clones Wireless Adapter
+ 187e 3403 G-110 802.11g Wireless Cardbus Adapter
+ 8130 HMP8130 NTSC/PAL Video Decoder
+ 8131 HMP8131 NTSC/PAL Video Decoder
+# This is probably more likely a HW fault, but I am keeping it for now --mj
+ ffff ISL3886IK
+ 1260 0000 Senao 3054MP+ (J) mini-PCI WLAN 802.11g adapter
+1261 Matsushita-Kotobuki Electronics Industries, Ltd.
+1262 ES Computer Company, Ltd.
+1263 Sonic Solutions
+1264 Aval Nagasaki Corporation
+1265 Casio Computer Co., Ltd.
+1266 Microdyne Corporation
+ 0001 NE10/100 Adapter (i82557B)
+ 1910 NE2000Plus (RT8029) Ethernet Adapter
+ 1266 1910 NE2000Plus Ethernet Adapter
+1267 S. A. Telecommunications
+ 5352 PCR2101
+ 5a4b Telsat Turbo
+1268 Tektronix
+1269 Thomson-CSF/TTM
+126a Lexmark International, Inc.
+126b Adax, Inc.
+126c Northern Telecom
+ 1211 10/100BaseTX [RTL81xx]
+ 126c 802.11b Wireless Ethernet Adapter
+126d Splash Technology, Inc.
+126e Sumitomo Metal Industries, Ltd.
+126f Silicon Motion, Inc.
+ 0501 SM501 VoyagerGX Rev. AA
+ 0510 SM501 VoyagerGX Rev. B
+ 0710 SM710 LynxEM
+ 0712 SM712 LynxEM+
+ 0720 SM720 Lynx3DM
+ 0730 SM731 Cougar3DR
+ 0810 SM810 LynxE
+ 0811 SM811 LynxE
+ 0820 SM820 Lynx3D
+ 0910 SM910
+1270 Olympus Optical Co., Ltd.
+1271 GW Instruments
+1272 Telematics International
+1273 Hughes Network Systems
+ 0002 DirecPC
+1274 Ensoniq
+ 1171 ES1373 [AudioPCI] (also Creative Labs CT5803)
+ 1371 ES1371 [AudioPCI-97]
+ 0e11 0024 AudioPCI on Motherboard Compaq Deskpro
+ 0e11 b1a7 ES1371, ES1373 AudioPCI
+ 1033 80ac ES1371, ES1373 AudioPCI
+ 1042 1854 Tazer
+ 107b 8054 Tabor2
+ 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128
+ 1274 8001 CT4751 board
+ 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A
+ 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10
+ 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A
+ 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A
+ 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A
+ 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A
+ 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00
+ 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A
+ 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00
+ 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00
+ 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00
+ 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191
+ 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193
+ 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A
+ 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A
+ 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639
+ 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800
+ 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801
+ 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739
+ 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11
+ 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31
+ 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11
+ 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13
+ 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E
+ 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810
+ 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E
+ 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S
+ 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S
+ 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR
+ 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX
+ 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV
+ 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2
+ 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV
+ 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2
+ 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX
+ 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX
+ 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX
+ 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman
+ 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod
+ 8086 4541 D815EEA Motherboard
+ 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island
+ 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX
+ 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal
+ 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX
+ 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX
+ 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver
+ 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver
+ 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX
+ 5000 ES1370 [AudioPCI]
+ 5880 5880B [AudioPCI]
+ 1274 2000 Creative Sound Blaster AudioPCI128
+ 1274 2003 Creative SoundBlaster AudioPCI 128
+ 1274 5880 Creative Sound Blaster AudioPCI128
+ 1274 8001 Sound Blaster 16PCI 4.1ch
+ 1458 a000 5880 AudioPCI On Motherboard 6OXET
+ 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00
+ 270f 2001 5880 AudioPCI On Motherboard 6CTR
+ 270f 2200 5880 AudioPCI On Motherboard 6WTX
+ 270f 7040 5880 AudioPCI On Motherboard 6ATA4
+ 8001 CT5880 [AudioPCI]
+ 8002 5880A [AudioPCI]
+1275 Network Appliance Corporation
+1276 Switched Network Technologies, Inc.
+1277 Comstream
+1278 Transtech Parallel Systems Ltd.
+ 0701 TPE3/TM3 PowerPC Node
+ 0710 TPE5 PowerPC PCI board
+ 1100 PMC-FPGA02
+ 1101 TS-C43 card with 4 ADSP-TS101 processors
+1279 Transmeta Corporation
+ 0060 TM8000 Northbridge
+ 0061 TM8000 AGP bridge
+ 0295 Northbridge
+ 0395 LongRun Northbridge
+ 0396 SDRAM controller
+ 0397 BIOS scratchpad
+127a Rockwell International
+ 1002 HCF 56k Data/Fax Modem
+ 1092 094c SupraExpress 56i PRO [Diamond SUP2380]
+ 122d 4002 HPG / MDP3858-U
+ 122d 4005 MDP3858-E
+ 122d 4007 MDP3858-A/-NZ
+ 122d 4012 MDP3858-SA
+ 122d 4017 MDP3858-W
+ 122d 4018 MDP3858-W
+ 127a 1002 Rockwell 56K D/F HCF Modem
+ 1003 HCF 56k Data/Fax Modem
+ 0e11 b0bc 229-DF Zephyr
+ 0e11 b114 229-DF Cheetah
+ 1033 802b 229-DF
+ 13df 1003 PCI56RX Modem
+ 13e0 0117 IBM
+ 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem
+ 13e0 0197 IBM
+ 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem
+ 13e0 01f7 IBM
+ 1436 1003 IBM
+ 1436 1103 IBM 5614PM3G V.90 Modem
+ 1436 1602 Compaq 229-DF Ducati
+ 1004 HCF 56k Data/Fax/Voice Modem
+ 1048 1500 MicroLink 56k Modem
+ 10cf 1059 Fujitsu 229-DFRT
+ 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1005 127a AOpen FM56-P
+ 1033 8029 229-DFSV
+ 1033 8054 Modem
+ 10cf 103c Fujitsu
+ 10cf 1055 Fujitsu 229-DFSV
+ 10cf 1056 Fujitsu 229-DFSV
+ 122d 4003 MDP3858SP-U
+ 122d 4006 Packard Bell MDP3858V-E
+ 122d 4008 MDP3858SP-A/SP-NZ
+ 122d 4009 MDP3858SP-E
+ 122d 4010 MDP3858V-U
+ 122d 4011 MDP3858SP-SA
+ 122d 4013 MDP3858V-A/V-NZ
+ 122d 4015 MDP3858SP-W
+ 122d 4016 MDP3858V-W
+ 122d 4019 MDP3858V-SA
+ 13df 1005 PCI56RVP Modem
+ 13e0 0187 IBM
+ 13e0 01a7 IBM
+ 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem
+ 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem
+ 1436 1005 IBM
+ 1436 1105 IBM
+ 1437 1105 IBM 5614PS3G V.90 Modem
+ 1022 HCF 56k Modem
+ 1436 1303 M3-5614PM3G V.90 Modem
+ 1023 HCF 56k Data/Fax Modem
+ 122d 4020 Packard Bell MDP3858-WE
+ 122d 4023 MDP3858-UE
+ 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem
+ 13e0 0297 IBM
+ 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem
+ 1436 1203 IBM
+ 1436 1303 IBM
+ 1024 HCF 56k Data/Fax/Voice Modem
+ 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 10cf 106a Fujitsu 235-DFSV
+ 122d 4021 Packard Bell MDP3858V-WE
+ 122d 4022 MDP3858SP-WE
+ 122d 4024 MDP3858V-UE
+ 122d 4025 MDP3858SP-UE
+ 1026 HCF 56k PCI Speakerphone Modem
+ 1032 HCF 56k Modem
+ 1033 HCF 56k Modem
+ 1034 HCF 56k Modem
+ 1035 HCF 56k PCI Speakerphone Modem
+ 1036 HCF 56k Modem
+ 1085 HCF 56k Volcano PCI Modem
+ 2004 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 2005 HCF 56k Data/Fax Modem
+ 104d 8044 229-DFSV
+ 104d 8045 229-DFSV
+ 104d 8055 PBE/Aztech 235W-DFSV
+ 104d 8056 235-DFSV
+ 104d 805a Modem
+ 104d 805f Modem
+ 104d 8074 Modem
+ 2013 HSF 56k Data/Fax Modem
+ 1179 0001 Modem
+ 1179 ff00 Modem
+ 2014 HSF 56k Data/Fax/Voice Modem
+ 10cf 1057 Fujitsu Citicorp III
+ 122d 4050 MSP3880-U
+ 122d 4055 MSP3880-W
+ 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 10cf 1063 Fujitsu
+ 10cf 1064 Fujitsu
+ 1468 2015 Fujitsu
+ 2016 HSF 56k Data/Fax/Voice/Spkp Modem
+ 122d 4051 MSP3880V-W
+ 122d 4052 MSP3880SP-W
+ 122d 4054 MSP3880V-U
+ 122d 4056 MSP3880SP-U
+ 122d 4057 MSP3880SP-A
+ 4311 Riptide HSF 56k PCI Modem
+ 127a 4311 Ring Modular? Riptide HSF RT HP Dom
+ 13e0 0210 HP-GVC
+ 4320 Riptide PCI Audio Controller
+ 1235 4320 Riptide PCI Audio Controller
+ 4321 Riptide HCF 56k PCI Modem
+ 1235 4321 Hewlett Packard DF
+ 1235 4324 Hewlett Packard DF
+ 13e0 0210 Hewlett Packard DF
+ 144d 2321 Riptide
+ 4322 Riptide PCI Game Controller
+ 1235 4322 Riptide PCI Game Controller
+ 8234 RapidFire 616X ATM155 Adapter
+ 108d 0022 RapidFire 616X ATM155 Adapter
+ 108d 0027 RapidFire 616X ATM155 Adapter
+127b Pixera Corporation
+127c Crosspoint Solutions, Inc.
+127d Vela Research
+127e Winnov, L.P.
+ 0010 Videum 1000 Plus
+127f Fujifilm
+1280 Photoscript Group Ltd.
+1281 Yokogawa Electric Corporation
+1282 Davicom Semiconductor, Inc.
+ 6585 DM562P V90 Modem
+ 9009 Ethernet 100/10 MBit
+ 9100 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 9102 21x4x DEC-Tulip compatible 10/100 Ethernet
+# Subsystem ID is main ID reveresed.
+ 0291 8212 DM9102A (DM9102AE, SM9102AF) Ethernet 100/10 MBit
+ 9132 Ethernet 100/10 MBit
+1283 Integrated Technology Express, Inc.
+ 673a IT8330G
+ 8152 IT8152F/G Advanced RISC-to-PCI Companion Chip
+ 8211 ITE 8211F Single Channel UDMA 133
+ 1043 8138 P5GD1-VW Mainboard
+# PCI version seems to be IT8212, embedded seems to be ITE8212
+ 8212 IT/ITE8212 Dual channel ATA RAID controller
+ 1283 0001 IT/ITE8212 Dual channel ATA RAID controller
+ 8213 IT8213 IDE Controller
+ 8330 IT8330G
+ 8872 IT8874F PCI Dual Serial Port Controller
+ 8888 IT8888F/G PCI to ISA Bridge with SMB [Golden Gate]
+ 8889 IT8889F PCI to ISA Bridge
+ e886 IT8330G
+1284 Sahara Networks, Inc.
+1285 Platform Technologies, Inc.
+ 0100 AGOGO sound chip (aka ESS Maestro 1)
+1286 Mazet GmbH
+1287 M-Pact, Inc.
+ 001e LS220D DVD Decoder
+ 001f LS220C DVD Decoder
+1288 Timestep Corporation
+1289 AVC Technology, Inc.
+128a Asante Technologies, Inc.
+128b Transwitch Corporation
+128c Retix Corporation
+128d G2 Networks, Inc.
+ 0021 ATM155 Adapter
+128e Hoontech Corporation/Samho Multi Tech Ltd.
+ 0008 ST128 WSS/SB
+ 0009 ST128 SAM9407
+ 000a ST128 Game Port
+ 000b ST128 MPU Port
+ 000c ST128 Ctrl Port
+128f Tateno Dennou, Inc.
+1290 Sord Computer Corporation
+1291 NCS Computer Italia
+1292 Tritech Microelectronics Inc
+ fc02 Pyramid3D TR25202
+1293 Media Reality Technology
+1294 Rhetorex, Inc.
+1295 Imagenation Corporation
+ 0800 PXR800
+ 1000 PXD1000
+1296 Kofax Image Products
+1297 Holco Enterprise Co, Ltd/Shuttle Computer
+1298 Spellcaster Telecommunications Inc.
+1299 Knowledge Technology Lab.
+129a VMetro, inc.
+ 0615 PBT-615 PCI-X Bus Analyzer
+ 1100 PMC-FPGA05
+ 1106 XMC-FPGA05F, PCI interface
+ 1107 XMC-FPGA05F, PCIe interface
+ 1108 XMC-FPGA05D, PCI interface
+ 1109 XMC-FPGA05D, PCIe interface
+129b Image Access
+129c Jaycor
+129d Compcore Multimedia, Inc.
+129e Victor Company of Japan, Ltd.
+129f OEC Medical Systems, Inc.
+12a0 Allen-Bradley Company
+12a1 Simpact Associates, Inc.
+12a2 Newgen Systems Corporation
+12a3 Lucent Technologies
+ 8105 T8105 H100 Digital Switch
+12a4 NTT Electronics Technology Company
+12a5 Vision Dynamics Ltd.
+12a6 Scalable Networks, Inc.
+12a7 AMO GmbH
+12a8 News Datacom
+12a9 Xiotech Corporation
+12aa SDL Communications, Inc.
+12ab Yuan Yuan Enterprise Co., Ltd.
+ 0000 MPG160/Kuroutoshikou ITVC15-STVLP
+ 0002 AU8830 [Vortex2] Based Sound Card With A3D Support
+ 0003 T507 (DVB-T) TV tuner/capture device
+ 2300 Club-3D Zap TV2100
+ 3000 MPG-200C PCI DVD Decoder Card
+ 4789 MPC788 MiniPCI Hybrid TV Tuner
+ fff3 MPG600/Kuroutoshikou ITVC16-STVLP
+ ffff MPG600/Kuroutoshikou ITVC16-STVLP
+12ac Measurex Corporation
+12ad Multidata GmbH
+12ae Alteon Networks Inc.
+ 0001 AceNIC Gigabit Ethernet
+ 1014 0104 Gigabit Ethernet-SX PCI Adapter
+ 12ae 0001 Gigabit Ethernet-SX (Universal)
+ 1410 0104 Gigabit Ethernet-SX PCI Adapter
+ 0002 AceNIC Gigabit Ethernet (Copper)
+ 10a9 8002 Acenic Gigabit Ethernet
+ 12ae 0002 Gigabit Ethernet-T (3C986-T)
+ 00fa Farallon PN9100-T Gigabit Ethernet
+12af TDK USA Corp
+12b0 Jorge Scientific Corp
+12b1 GammaLink
+12b2 General Signal Networks
+12b3 Inter-Face Co Ltd
+12b4 FutureTel Inc
+12b5 Granite Systems Inc.
+12b6 Natural Microsystems
+12b7 Cognex Modular Vision Systems Div. - Acumen Inc.
+12b8 Korg
+# Nee US Robotics
+12b9 3Com Corp, Modem Division
+ 1006 WinModem
+ 12b9 005c USR 56k Internal Voice WinModem (Model 3472)
+ 12b9 005e USR 56k Internal WinModem (Models 662975)
+ 12b9 0062 USR 56k Internal Voice WinModem (Model 662978)
+ 12b9 0068 USR 56k Internal Voice WinModem (Model 5690)
+ 12b9 007a USR 56k Internal Voice WinModem (Model 662974)
+ 12b9 007f USR 56k Internal WinModem (Models 5698, 5699)
+ 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528)
+ 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529)
+ 12b9 0091 USR 56k Internal Voice WinModem (Model 2978)
+ 1007 USR 56k Internal WinModem
+ 12b9 00a3 USR 56k Internal WinModem (Model 3595)
+ 12b9 00c4 U.S. Robotics V.92 Voice Faxmodem (2884A/B/C)
+ 1008 56K FaxModem Model 5610
+ 12b9 00a2 USR 56k Internal FAX Modem (Model 2977)
+ 12b9 00aa USR 56k Internal Voice Modem (Model 2976)
+ 12b9 00ab USR 56k Internal Voice Modem (Model 5609)
+ 12b9 00ac USR 56k Internal Voice Modem (Model 3298)
+ 12b9 00ad USR 56k Internal FAX Modem (Model 5610)
+ 12b9 00d3 USR 56K Internal V92 FAX Modem (Model 5610)
+ 12b9 baba USR 56K Internal Voice Modem 3CP3298-DEL (Model 5601) [Hawk]
+12ba BittWare, Inc.
+12bb Nippon Unisoft Corporation
+12bc Array Microsystems
+12bd Computerm Corp.
+12be Anchor Chips Inc.
+ 3041 AN3041Q CO-MEM
+ 3042 AN3042Q CO-MEM Lite
+ 12be 3042 Anchor Chips Lite Evaluation Board
+12bf Fujifilm Microdevices
+12c0 Infimed
+12c1 GMM Research Corp
+12c2 Mentec Limited
+12c3 Holtek Microelectronics Inc
+ 0058 PCI NE2K Ethernet
+ 5598 PCI NE2K Ethernet
+12c4 Connect Tech Inc
+ 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11)
+ 0002 Blue HEAT/PCI 4 (RS232)
+ 0003 Blue HEAT/PCI 2 (RS232)
+ 0004 Blue HEAT/PCI 8 (UNIV, RS485)
+ 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485)
+ 0006 Blue HEAT/PCI 4 (OPTO, RS485)
+ 0007 Blue HEAT/PCI 2+2 (RS232/485)
+ 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485)
+ 0009 Blue HEAT/PCI 2+6 (RS232/485)
+ 000a Blue HEAT/PCI 8 (Tx, RS485)
+ 000b Blue HEAT/PCI 4 (Tx, RS485)
+ 000c Blue HEAT/PCI 2 (20 MHz, RS485)
+ 000d Blue HEAT/PCI 2 PTM
+ 0100 NT960/PCI
+ 0201 cPCI Titan - 2 Port
+ 0202 cPCI Titan - 4 Port
+ 0300 CTI PCI UART 2 (RS232)
+ 0301 CTI PCI UART 4 (RS232)
+ 0302 CTI PCI UART 8 (RS232)
+ 0310 CTI PCI UART 1+1 (RS232/485)
+ 0311 CTI PCI UART 2+2 (RS232/485)
+ 0312 CTI PCI UART 4+4 (RS232/485)
+ 0320 CTI PCI UART 2
+ 0321 CTI PCI UART 4
+ 0322 CTI PCI UART 8
+ 0330 CTI PCI UART 2 (RS485)
+ 0331 CTI PCI UART 4 (RS485)
+ 0332 CTI PCI UART 8 (RS485)
+12c5 Picture Elements Incorporated
+ 007e Imaging/Scanning Subsystem Engine
+ 007f Imaging/Scanning Subsystem Engine
+ 0081 PCIVST [Grayscale Thresholding Engine]
+ 0085 Video Simulator/Sender
+ 0086 THR2 Multi-scale Thresholder
+12c6 Mitani Corporation
+12c7 Dialogic Corp
+# 12 Line, 6 port, CT-BUS/SC-BUS, loopstart FXO adaptor.
+ 0546 Springware D/120JCT-LS
+# 24 Channel, 1 Port, CT-BUS/SC-BUS, T1/PRI adaptor.
+ 0647 Springware D/240JCT-T1
+# 4 Line, 4 port, CT-BUS/SC-BUS, loopstart FXO adaptor. Revision 01
+ 0676 Springware D/41JCT-LS
+# 48 Channel, 2 Port, CT-BUS/SC-BUS, T1/PRI adaptor.
+ 0685 Springware D/480JCT-2T1
+12c8 G Force Co, Ltd
+12c9 Gigi Operations
+12ca Integrated Computing Engines
+12cb Antex Electronics Corporation
+ 0027 SC4 (StudioCard)
+ 002e StudioCard 2000
+12cc Pluto Technologies International
+12cd Aims Lab
+12ce Netspeed Inc.
+12cf Prophet Systems, Inc.
+12d0 GDE Systems, Inc.
+12d1 PSITech
+12d2 NVidia / SGS Thomson (Joint Venture)
+ 0008 NV1
+ 0009 DAC64
+ 0018 Riva128
+ 1048 0c10 VICTORY Erazor
+ 107b 8030 STB Velocity 128
+ 1092 0350 Viper V330
+ 1092 1092 Viper V330
+ 10b4 1b1b STB Velocity 128
+ 10b4 1b1d STB Velocity 128
+ 10b4 1b1e STB Velocity 128, PAL TV-Out
+ 10b4 1b20 STB Velocity 128 Sapphire
+ 10b4 1b21 STB Velocity 128
+ 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out
+ 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out
+ 10b4 1b27 STB Velocity 128 DVD
+ 10b4 1b88 MVP Pro 128
+ 10b4 222a STB Velocity 128 AGP
+ 10b4 2230 STB Velocity 128
+ 10b4 2232 STB Velocity 128
+ 10b4 2235 STB Velocity 128 AGP
+ 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000
+ 0019 Riva128ZX
+ 0020 TNT
+ 0028 TNT2
+ 0029 UTNT2
+ 002c VTNT2
+ 00a0 ITNT2
+12d3 Vingmed Sound A/S
+12d4 Ulticom (Formerly DGM&S)
+ 0200 T1 Card
+12d5 Equator Technologies Inc
+ 0003 BSP16
+ 1000 BSP15
+12d6 Analogic Corp
+12d7 Biotronic SRL
+12d8 Pericom Semiconductor
+ 01a7 PI7C21P100 PCI to PCI Bridge
+ 71e2 PI7C7300A/PI7C7300D PCI-to-PCI Bridge
+ 71e3 PI7C7300A/PI7C7300D PCI-to-PCI Bridge (Secondary Bus 2)
+ 8140 PI7C8140A PCI-to-PCI Bridge
+ 8148 PI7C8148A/PI7C8148B PCI-to-PCI Bridge
+ 8150 PCI to PCI Bridge
+ 8152 PI7C8152A/PI7C8152B/PI7C8152BI PCI-to-PCI Bridge
+ 8154 PI7C8154A/PI7C8154B/PI7C8154BI PCI-to-PCI Bridge
+ e110 PI7C9X110 PCI Express to PCI bridge
+ 1775 11cc CC11/CL11 CompactPCI Bridge
+ e130 PCI Express to PCI-XPI7C9X130 PCI-X Bridge
+12d9 Aculab PLC
+ 0002 PCI Prosody
+ 0004 cPCI Prosody
+ 0005 Aculab E1/T1 PCI card
+ 1078 Prosody X class e1000 device
+ 12d9 000d Prosody X PCI
+ 12d9 000e Prosody X cPCI
+12da True Time Inc.
+12db Annapolis Micro Systems, Inc
+12dc Symicron Computer Communication Ltd.
+12dd Management Graphics
+12de Rainbow Technologies
+ 0200 CryptoSwift CS200
+12df SBS Technologies Inc
+12e0 Chase Research
+ 0010 ST16C654 Quad UART
+ 0020 ST16C654 Quad UART
+ 0030 ST16C654 Quad UART
+12e1 Nintendo Co, Ltd
+12e2 Datum Inc. Bancomm-Timing Division
+12e3 Imation Corp - Medical Imaging Systems
+12e4 Brooktrout Technology Inc
+12e5 Apex Semiconductor Inc
+12e6 Cirel Systems
+12e7 Sunsgroup Corporation
+12e8 Crisc Corp
+12e9 GE Spacenet
+12ea Zuken
+12eb Aureal Semiconductor
+ 0001 Vortex 1
+ 104d 8036 AU8820 Vortex Digital Audio Processor
+ 1092 2000 Sonic Impact A3D
+ 1092 2100 Sonic Impact A3D
+ 1092 2110 Sonic Impact A3D
+ 1092 2200 Sonic Impact A3D
+ 122d 1002 AU8820 Vortex Digital Audio Processor
+ 12eb 0001 AU8820 Vortex Digital Audio Processor
+ 5053 3355 Montego
+ 0002 Vortex 2
+ 104d 8049 AU8830 Vortex 3D Digital Audio Processor
+ 104d 807b AU8830 Vortex 3D Digital Audio Processor
+ 1092 3000 Monster Sound II
+ 1092 3001 Monster Sound II
+ 1092 3002 Monster Sound II
+ 1092 3003 Monster Sound II
+ 1092 3004 Monster Sound II
+ 12eb 0002 AU8830 Vortex 3D Digital Audio Processor
+ 12eb 0088 AU8830 Vortex 3D Digital Audio Processor
+ 144d 3510 AU8830 Vortex 3D Digital Audio Processor
+ 5053 3356 Montego II
+ 0003 AU8810 Vortex Digital Audio Processor
+ 104d 8049 AU8810 Vortex Digital Audio Processor
+ 104d 8077 AU8810 Vortex Digital Audio Processor
+ 109f 1000 AU8810 Vortex Digital Audio Processor
+ 12eb 0003 AU8810 Vortex Digital Audio Processor
+ 1462 6780 AU8810 Vortex Digital Audio Processor
+ 14a4 2073 AU8810 Vortex Digital Audio Processor
+ 14a4 2091 AU8810 Vortex Digital Audio Processor
+ 14a4 2104 AU8810 Vortex Digital Audio Processor
+ 14a4 2106 AU8810 Vortex Digital Audio Processor
+ 8803 Vortex 56k Software Modem
+ 12eb 8803 Vortex 56k Software Modem
+12ec 3A International, Inc.
+12ed Optivision Inc.
+12ee Orange Micro
+12ef Vienna Systems
+12f0 Pentek
+12f1 Sorenson Vision Inc
+12f2 Gammagraphx, Inc.
+12f3 Radstone Technology
+12f4 Megatel
+12f5 Forks
+12f6 Dawson France
+12f7 Cognex
+12f8 Electronic Design GmbH
+ 0002 VideoMaker
+12f9 Four Fold Ltd
+12fb Spectrum Signal Processing
+ 0001 PMC-MAI
+ 00f5 F5 Dakar
+ 02ad PMC-2MAI
+ 2adc ePMC-2ADC
+ 3100 PRO-3100
+ 3500 PRO-3500
+ 4d4f Modena
+ 8120 ePMC-8120
+ da62 Daytona C6201 PCI (Hurricane)
+ db62 Ingliston XBIF
+ dc62 Ingliston PLX9054
+ dd62 Ingliston JTAG/ISP
+ eddc ePMC-MSDDC
+ fa01 ePMC-FPGA
+12fc Capital Equipment Corp
+12fd I2S
+12fe ESD Electronic System Design GmbH
+12ff Lexicon
+1300 Harman International Industries Inc
+1302 Computer Sciences Corp
+1303 Innovative Integration
+ 0030 X3-SDF 4-channel XMC acquisition board
+1304 Juniper Networks
+1305 Netphone, Inc
+1306 Duet Technologies
+# Nee ComputerBoards
+1307 Measurement Computing
+ 0001 PCI-DAS1602/16
+ 000b PCI-DIO48H
+ 000c PCI-PDISO8
+ 000d PCI-PDISO16
+ 000f PCI-DAS1200
+ 0010 PCI-DAS1602/12
+ 0014 PCI-DIO24H
+ 0015 PCI-DIO24H/CTR3
+ 0016 PCI-DIO48H/CTR15
+ 0017 PCI-DIO96H
+ 0018 PCI-CTR05
+ 0019 PCI-DAS1200/JR
+ 001a PCI-DAS1001
+ 001b PCI-DAS1002
+ 001c PCI-DAS1602JR/16
+ 001d PCI-DAS6402/16
+ 001e PCI-DAS6402/12
+ 001f PCI-DAS16/M1
+ 0020 PCI-DDA02/12
+ 0021 PCI-DDA04/12
+ 0022 PCI-DDA08/12
+ 0023 PCI-DDA02/16
+ 0024 PCI-DDA04/16
+ 0025 PCI-DDA08/16
+ 0026 PCI-DAC04/12-HS
+ 0027 PCI-DAC04/16-HS
+ 0028 PCI-DIO24
+ 0029 PCI-DAS08
+ 002c PCI-INT32
+ 0033 PCI-DUAL-AC5
+ 0034 PCI-DAS-TC
+ 0035 PCI-DAS64/M1/16
+ 0036 PCI-DAS64/M2/16
+ 0037 PCI-DAS64/M3/16
+ 004c PCI-DAS1000
+ 004d PCI-QUAD04
+ 0052 PCI-DAS4020/12
+ 0053 PCIM-DDA06/16
+ 0054 PCI-DIO96
+ 005d PCI-DAS6023
+ 005e PCI-DAS6025
+ 005f PCI-DAS6030
+ 0060 PCI-DAS6031
+ 0061 PCI-DAS6032
+ 0062 PCI-DAS6033
+ 0063 PCI-DAS6034
+ 0064 PCI-DAS6035
+ 0065 PCI-DAS6040
+ 0066 PCI-DAS6052
+ 0067 PCI-DAS6070
+ 0068 PCI-DAS6071
+ 006f PCI-DAS6036
+ 0078 PCI-DAS6013
+ 0079 PCI-DAS6014
+1308 Jato Technologies Inc.
+ 0001 NetCelerator Adapter
+ 1308 0001 NetCelerator Adapter
+1309 AB Semiconductor Ltd
+130a Mitsubishi Electric Microcomputer
+130b Colorgraphic Communications Corp
+130c Ambex Technologies, Inc
+130d Accelerix Inc
+130e Yamatake-Honeywell Co. Ltd
+130f Advanet Inc
+1310 Gespac
+1311 Videoserver, Inc
+1312 Acuity Imaging, Inc
+1313 Yaskawa Electric Co.
+1315 Wavesat
+1316 Teradyne Inc
+1317 ADMtek
+ 0981 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 0985 NC100 Network Everywhere Fast Ethernet 10/100
+ 1734 100c Scenic N300 ADMtek AN983 10/100 Mbps PCI Adapter
+ 1985 21x4x DEC-Tulip compatible 10/100 Ethernet
+ 1385 511a FA511
+ 1395 2103 CB100-EZ (4-LED version)
+ 2850 HSP MicroModem 56
+ 5120 ADM5120 OpenGate System-on-Chip
+ 8201 ADM8211 802.11b Wireless Interface
+ 10b8 2635 SMC2635W v1 802.11b Wireless Cardbus Adapter
+ 1317 8201 SMC2635W v2 802.11b Wireless Cardbus Adapter
+ 8211 ADM8211 802.11b Wireless Interface
+ 9511 21x4x DEC-Tulip compatible 10/100 Ethernet
+1318 Packet Engines Inc.
+ 0911 GNIC-II PCI Gigabit Ethernet [Hamachi]
+1319 Fortemedia, Inc
+ 0801 Xwave QS3000A [FM801]
+ 1319 1319 FM801 PCI Audio
+ 0802 Xwave QS3000A [FM801 game port]
+ 1319 1319 FM801 PCI Joystick
+ 1000 FM801 PCI Audio
+ 1001 FM801 PCI Joystick
+131a Finisar Corp.
+131c Nippon Electro-Sensory Devices Corp
+131d Sysmic, Inc.
+131e Xinex Networks Inc
+131f Siig Inc
+ 1000 CyberSerial (1-port) 16550
+ 1001 CyberSerial (1-port) 16650
+ 1002 CyberSerial (1-port) 16850
+ 1010 Duet 1S(16550)+1P
+ 1011 Duet 1S(16650)+1P
+ 1012 Duet 1S(16850)+1P
+ 1020 CyberParallel (1-port)
+ 1021 CyberParallel (2-port)
+ 1030 CyberSerial (2-port) 16550
+ 1031 CyberSerial (2-port) 16650
+ 1032 CyberSerial (2-port) 16850
+ 1034 Trio 2S(16550)+1P
+ 1035 Trio 2S(16650)+1P
+ 1036 Trio 2S(16850)+1P
+ 1050 CyberSerial (4-port) 16550
+ 1051 CyberSerial (4-port) 16650
+ 1052 CyberSerial (4-port) 16850
+ 2000 CyberSerial (1-port) 16550
+ 2001 CyberSerial (1-port) 16650
+ 2002 CyberSerial (1-port) 16850
+ 2010 Duet 1S(16550)+1P
+ 2011 Duet 1S(16650)+1P
+ 2012 Duet 1S(16850)+1P
+ 2020 CyberParallel (1-port)
+ 2021 CyberParallel (2-port)
+ 2030 CyberSerial (2-port) 16550
+ 131f 2030 PCI Serial Card
+ 2031 CyberSerial (2-port) 16650
+ 2032 CyberSerial (2-port) 16850
+ 2040 Trio 1S(16550)+2P
+ 2041 Trio 1S(16650)+2P
+ 2042 Trio 1S(16850)+2P
+ 2050 CyberSerial (4-port) 16550
+ 2051 CyberSerial (4-port) 16650
+ 2052 CyberSerial (4-port) 16850
+ 2060 Trio 2S(16550)+1P
+ 2061 Trio 2S(16650)+1P
+ 2062 Trio 2S(16850)+1P
+ 2081 CyberSerial (8-port) ST16654
+1320 Crypto AG
+1321 Arcobel Graphics BV
+1322 MTT Co., Ltd
+1323 Dome Inc
+1324 Sphere Communications
+1325 Salix Technologies, Inc
+1326 Seachange international
+1327 Voss scientific
+1328 quadrant international
+1329 Productivity Enhancement
+132a Microcom Inc.
+132b Broadband Technologies
+132c Micrel Inc
+132d Integrated Silicon Solution, Inc.
+1330 MMC Networks
+1331 RadiSys Corporation
+ 0030 ENP-2611
+ 8200 82600 Host Bridge
+ 8201 82600 IDE
+ 8202 82600 USB
+ 8210 82600 PCI Bridge
+1332 Micro Memory
+ 5415 MM-5415CN PCI Memory Module with Battery Backup
+ 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup
+ 6140 MM-6140D
+1334 Redcreek Communications, Inc
+1335 Videomail, Inc
+1337 Third Planet Publishing
+1338 BT Electronics
+133a Vtel Corp
+133b Softcom Microsystems
+133c Holontech Corp
+133d SS Technologies
+133e Virtual Computer Corp
+133f SCM Microsystems
+1340 Atalla Corp
+1341 Kyoto Microcomputer Co
+1342 Promax Systems Inc
+1343 Phylon Communications Inc
+# nee Crucial Technology
+1344 Micron Technology Inc
+1345 Arescom Inc
+1347 Odetics
+1349 Sumitomo Electric Industries, Ltd.
+134a DTC Technology Corp.
+ 0001 Domex 536
+ 0002 Domex DMX3194UP SCSI Adapter
+134b ARK Research Corp.
+134c Chori Joho System Co. Ltd
+134d PCTel Inc
+ 2189 HSP56 MicroModem
+ 2486 2304WT V.92 MDC Modem
+ 7890 HSP MicroModem 56
+ 134d 0001 PCT789 adapter
+ 7891 HSP MicroModem 56
+ 134d 0001 HSP MicroModem 56
+ 7892 HSP MicroModem 56
+ 7893 HSP MicroModem 56
+ 7894 HSP MicroModem 56
+ 7895 HSP MicroModem 56
+ 7896 HSP MicroModem 56
+ 7897 HSP MicroModem 56
+134e CSTI
+134f Algo System Co Ltd
+1350 Systec Co. Ltd
+1351 Sonix Inc
+1353 Thales Idatys
+ 0002 Proserver
+ 0003 PCI-FUT
+ 0004 PCI-S0
+ 0005 PCI-FUT-S0
+1354 Dwave System Inc
+1355 Kratos Analytical Ltd
+1356 The Logical Co
+1359 Prisa Networks
+135a Brain Boxes
+ 0a61 UC-324 [VELOCITY RS422/485]
+135b Giganet Inc
+135c Quatech Inc
+ 0010 QSC-100
+ 0020 DSC-100
+ 0030 DSC-200/300
+ 0040 QSC-200/300
+ 0050 ESC-100D
+ 0060 ESC-100M
+ 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230)
+ 0170 QSCLP-100
+ 0180 DSCLP-100
+ 0190 SSCLP-100
+ 01a0 QSCLP-200/300
+ 01b0 DSCLP-200/300
+ 01c0 SSCLP-200/300
+ 0258 DSPSX-200/300
+135d ABB Network Partner AB
+135e Sealevel Systems Inc
+ 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32)
+ 7101 Single Port RS-232/422/485/530
+ 7201 Dual Port RS-232/422/485 Interface
+ 7202 Dual Port RS-232 Interface
+ 7401 Four Port RS-232 Interface
+ 7402 Four Port RS-422/485 Interface
+ 7801 Eight Port RS-232 Interface
+ 7804 Eight Port RS-232/422/485 Interface
+ 8001 8001 Digital I/O Adapter
+135f I-Data International A-S
+1360 Meinberg Funkuhren
+ 0101 PCI32 DCF77 Radio Clock
+ 0102 PCI509 DCF77 Radio Clock
+ 0103 PCI510 DCF77 Radio Clock
+ 0104 PCI511 DCF77 Radio Clock
+ 0105 PEX511 DCF77 Radio Clock (PCI Express)
+ 0201 GPS167PCI GPS Receiver
+ 0202 GPS168PCI GPS Receiver
+ 0203 GPS169PCI GPS Receiver
+ 0204 GPS170PCI GPS Receiver
+ 0205 GPS170PEX GPS Receiver (PCI Express)
+ 0206 GPS180PEX GPS Receiver (PCI Express)
+ 0301 TCR510PCI IRIG Timecode Reader
+ 0302 TCR167PCI IRIG Timecode Reader
+ 0303 TCR511PCI IRIG Timecode Reader
+ 0304 TCR511PEX IRIG Timecode Reader (PCI Express)
+ 0305 TCR170PEX IRIG Timecode Reader (PCI Express)
+ 0306 TCR180PEX IRIG Timecode Reader (PCI Express)
+ 0501 PTP270PEX PTP/IEEE1588 slave card (PCI Express)
+ 0601 FRC511PEX Free Running Clock (PCI Express)
+1361 Soliton Systems K.K.
+1362 Fujifacom Corporation
+1363 Phoenix Technology Ltd
+1364 ATM Communications Inc
+1365 Hypercope GmbH
+1366 Teijin Seiki Co. Ltd
+1367 Hitachi Zosen Corporation
+1368 Skyware Corporation
+1369 Digigram
+136a High Soft Tech
+ 0004 HST Saphir VII mini PCI
+ 0007 HST Saphir III E MultiLink 4
+ 0008 HST Saphir III E MultiLink 8
+ 000a HST Saphir III E MultiLink 2
+136b Kawasaki Steel Corporation
+ ff01 KL5A72002 Motion JPEG
+136c Adtek System Science Co Ltd
+136d Gigalabs Inc
+136f Applied Magic Inc
+1370 ATL Products
+1371 CNet Technology Inc
+ 434e GigaCard Network Adapter
+ 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)
+1373 Silicon Vision Inc
+1374 Silicom Ltd.
+ 0024 Silicom Dual port Giga Ethernet BGE Bypass Server Adapter
+ 0025 Silicom Quad port Giga Ethernet BGE Bypass Server Adapter
+ 0026 Silicom Dual port Fiber Giga Ethernet 546 Bypass Server Adapter
+ 0027 Silicom Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter
+ 0029 Silicom Dual port Copper Giga Ethernet 546GB Bypass Server Adapter
+ 002a Silicom Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter
+ 002b Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter (PXE2TBI)
+ 002c Silicom Quad port Copper Giga Ethernet 546GB Bypass Server Adapter (PXG4BPI)
+ 002d Silicom Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI)
+ 002e Silicom Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI-LX)
+ 002f Silicom Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter (PXG2BPFIL)
+ 0030 Silicom Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter
+ 0031 Silicom Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter
+ 0032 Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter
+ 0034 Silicom Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
+ 0035 Silicom Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter
+ 0036 Silicom Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter
+ 0037 Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter
+ 0038 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter
+ 0039 Silicom Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter
+ 003a Silicom Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter
+ 003b Silicom Dual port Fiber Ethernet PMC Intel based Bypass Server Adapter (PMCX2BPFI)
+ 003c Silicom Dual port Copper Ethernet PCI-X BGE based Bypass Server Adapter (PXG2BPRB)
+ 003e Silicom Dual port Fiber Giga Ethernet PCI-E 571 TAP/Bypass Server Adapter (PEG2TBFI)
+ 003f Silicom Dual port Copper Giga Ethernet PCI-X 546 TAP/Bypass Server Adapter (PXG2TBI)
+ 0040 Silicom Quad port Fiber-SX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI)
+ 0043 Silicom Quad port Fiber-SX Giga Ethernet 546 Bypass Server Adapter (PXG4BPFID)
+ 0045 Silicom 6 port Copper Giga Ethernet 546 Bypass Server Adapter (PXG6BPI)
+ 0047 Silicom Dual port Fiber-SX Giga Ethernet 571 Bypass Disconnect Server Adapter (PEG2BPFID)
+ 004a Silicom Quad port Fiber-LX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI-LX)
+ 004d Dual port Copper Giga Ethernet PCI-E Bypass Server Adapter
+1375 Argosystems Inc
+1376 LMC
+1377 Electronic Equipment Production & Distribution GmbH
+1378 Telemann Co. Ltd
+1379 Asahi Kasei Microsystems Co Ltd
+137a Mark of the Unicorn Inc
+ 0001 PCI-324 Audiowire Interface
+137b PPT Vision
+137c Iwatsu Electric Co Ltd
+137d Dynachip Corporation
+137e Patriot Scientific Corporation
+137f Japan Satellite Systems Inc
+1380 Sanritz Automation Co Ltd
+1381 Brains Co. Ltd
+1382 Marian - Electronic & Software
+ 0001 ARC88 audio recording card
+ 2008 Prodif 96 Pro sound system
+ 2048 Prodif Plus sound system
+ 2088 Marc 8 Midi sound system
+ 20c8 Marc A sound system
+ 4008 Marc 2 sound system
+ 4010 Marc 2 Pro sound system
+ 4048 Marc 4 MIDI sound system
+ 4088 Marc 4 Digi sound system
+ 4248 Marc X sound system
+ 4424 TRACE D4 Sound System
+1383 Controlnet Inc
+1384 Reality Simulation Systems Inc
+1385 Netgear
+ 006b WA301 802.11b Wireless PCI Adapter
+ 4100 MA301 802.11b Wireless PCI Adapter
+ 4105 MA311 802.11b Wireless PCI Adapter
+ 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card
+ 4a00 WAG311 802.11a/g Wireless PCI Adapter
+ 5200 GA511 Gigabit PC Card
+ 620a GA620 Gigabit Ethernet
+ 630a GA630 Gigabit Ethernet
+ 6d00 WPNT511 RangeMax 240 Mbps Wireless PC Card
+ 7b00 WN511B RangeMax Next 270 Mbps Wireless PC Card
+ 7c00 WN511T RangeMax Next 300 Mbps Wireless PC Card
+ 7d00 WN311B RangeMax Next 270 Mbps Wireless PCI Adapter
+ f004 FA310TX
+ f312 FA312 REV-A1 Fast Ethernet PCI Adapter
+1386 Video Domain Technologies
+1387 Systran Corp
+1388 Hitachi Information Technology Co Ltd
+1389 Applicom International
+ 0001 PCI1500PFB [Intelligent fieldbus adaptor]
+138a Fusion Micromedia Corp
+138b Tokimec Inc
+138c Silicon Reality
+138d Future Techno Designs pte Ltd
+138e Basler GmbH
+138f Patapsco Designs Inc
+1390 Concept Development Inc
+1391 Development Concepts Inc
+1392 Medialight Inc
+1393 Moxa Technologies Co Ltd
+ 0001 UC7000 Serial
+ 1020 CP102 (2-port RS-232 PCI)
+ 1021 CP102UL (2-port RS-232 Universal PCI)
+ 1022 CP102U (2-port RS-232 Universal PCI)
+ 1023 CP-102UF
+ 1024 CP-102E (2-port RS-232 Smart PCI Express Serial Board)
+ 1025 CP-102EL (2-port RS-232 Smart PCI Express Serial Board)
+ 1040 Smartio C104H/PCI
+ 1041 CP104U (4-port RS-232 Universal PCI)
+ 1042 CP104JU (4-port RS-232 Universal PCI)
+ 1043 CP104EL (4-port RS-232 Smart PCI Express)
+ 1044 POS104UL (4-port RS-232 Universal PCI)
+ 1045 CP-104EL-A (4-port RS-232 PCI Express Serial Board)
+ 1080 CB108 (8-port RS-232 PC/104-plus Module)
+ 1140 CT-114 series
+ 1141 Industrio CP-114
+ 1142 CB114 (4-port RS-232/422/485 PC/104-plus Module)
+ 1143 CP-114UL (4-port RS-232/422/485 Smart Universal PCI Serial Board)
+ 1144 CP-114EL (4-port RS-232/422/485 Smart PCI Express Serial Board)
+ 1180 CP118U (8-port RS-232/422/485 Smart Universal PCI)
+ 1181 CP118EL (8-port RS-232/422/485 Smart PCI Express)
+ 1182 CP-118EL-A (8-port RS-232/422/485 PCI Express Serial Board)
+ 1320 CP132 (2-port RS-422/485 PCI)
+ 1321 CP132U (2-Port RS-422/485 Universal PCI)
+ 1322 CP-132EL (2-port RS-422/485 Smart PCI Express Serial Board)
+ 1340 CP134U (4-Port RS-422/485 Universal PCI)
+ 1341 CB134I (4-port RS-422/485 PC/104-plus Module)
+ 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI)
+ 1680 Smartio C168H/PCI
+ 1681 CP-168U V2 Smart Serial Board (8-port RS-232)
+ 1682 CP168EL (8-port RS-232 Smart PCI Express)
+ 1683 CP-168EL-A (8-port RS-232 PCI Express Serial Board)
+ 2040 Intellio CP-204J
+ 2180 Intellio C218 Turbo PCI
+ 3200 Intellio C320 Turbo PCI
+1394 Level One Communications
+ 0001 LXT1001 Gigabit Ethernet
+ 1186 4800 DGE-500SX
+ 1394 0001 NetCelerator Adapter
+1395 Ambicom Inc
+1396 Cipher Systems Inc
+1397 Cologne Chip Designs GmbH
+ 08b4 ISDN network Controller [HFC-4S]
+ 1397 b520 HFC-4S [IOB4ST]
+ 1397 b540 HFC-4S [Swyx 4xS0 SX2 QuadBri]
+ 1397 b550 HFC-4S [Junghanns quadBRI]
+ 1397 b556 HFC-4S [Junghanns DuoDBRI]
+ 1397 e888 HFC-4S [OpenVox B200P / B400P]
+ 16b8 ISDN network Controller [HFC-8S]
+ 1397 b562 HFC-8S [IOB8ST]
+ 2bd0 ISDN network controller [HFC-PCI]
+ 0675 1704 ISDN Adapter (PCI Bus, D, C)
+ 0675 1708 ISDN Adapter (PCI Bus, D, C, ACPI)
+ 1397 2bd0 ISDN Board
+ e4bf 1000 CI1-1-Harp
+ 30b1 ISDN network Controller [HFC-E1]
+ b700 ISDN network controller PrimuX S0 [HFC-PCI]
+ f001 GSM Network Controller [HFC-4GSM]
+1398 Clarion co. Ltd
+1399 Rios systems Co Ltd
+139a Alacritech Inc
+ 0001 Quad Port 10/100 Server Accelerator
+ 0003 Single Port 10/100 Server Accelerator
+ 0005 Single Port Gigabit Server Accelerator
+139b Mediasonic Multimedia Systems Ltd
+139c Quantum 3d Inc
+139d EPL limited
+139e Media4
+139f Aethra s.r.l.
+13a0 Crystal Group Inc
+13a1 Kawasaki Heavy Industries Ltd
+13a2 Ositech Communications Inc
+13a3 Hifn Inc.
+ 0005 7751 Security Processor
+ 0006 6500 Public Key Processor
+ 0007 7811 Security Processor
+ 0012 7951 Security Processor
+ 0014 78XX Security Processor
+ 0016 8065 Security Processor
+ 0017 8165 Security Processor
+ 0018 8154 Security Processor
+ 001d 7956 Security Processor
+ 001f 7855 Security Processor
+ 0020 7955 Security Processor
+ 0026 8155 Security Processor
+ 002e 9630 Compression Processor
+ 002f 9725 Compression and Security Processor
+ 13a3 1600 DR1600 Acceleration Card
+ 13a3 1605 DR1605 Acceleration Card
+ 13a3 1610 DR1610 Acceleration Card
+ 13a3 1615 DR1615 Acceleration Card
+ 13a3 1620 DR1620 Acceleration Card
+ 13a3 1625 DR1625 Acceleration Card
+ 0033 8201 Acceleration Processor
+ 13a3 0036 DX1710 Acceleration Card
+ 0034 8202 Acceleration Processor
+ 13a3 0036 DX1720 Acceleration Card
+ 0035 8203 Acceleration Processor
+ 13a3 0036 DX1730 Acceleration Card
+ 0037 8204 Acceleration Processor
+ 13a3 0036 DX1740 Acceleration Card
+13a4 Rascom Inc
+13a5 Audio Digital Imaging Inc
+13a6 Videonics Inc
+13a7 Teles AG
+13a8 Exar Corp.
+ 0152 XR17C/D152 Dual PCI UART
+ 0154 XR17C154 Quad UART
+ 0158 XR17C158 Octal UART
+ 0252 XR17V252 Dual UART PCI controller
+ 0254 XR17V254 Quad UART PCI controller
+ 0258 XR17V258 Octal UART PCI controller
+13a9 Siemens Medical Systems, Ultrasound Group
+13aa Broadband Networks Inc
+13ab Arcom Control Systems Ltd
+13ac Motion Media Technology Ltd
+13ad Nexus Inc
+13ae ALD Technology Ltd
+13af T.Sqware
+13b0 Maxspeed Corp
+13b1 Tamura corporation
+13b2 Techno Chips Co. Ltd
+13b3 Lanart Corporation
+13b4 Wellbean Co Inc
+13b5 ARM
+13b6 Dlog GmbH
+13b7 Logic Devices Inc
+13b8 Nokia Telecommunications oy
+13b9 Elecom Co Ltd
+13ba Oxford Instruments
+13bb Sanyo Technosound Co Ltd
+13bc Bitran Corporation
+13bd Sharp corporation
+13be Miroku Jyoho Service Co. Ltd
+13bf Sharewave Inc
+13c0 Microgate Corporation
+ 0010 SyncLink Adapter v1
+ 0020 SyncLink SCC Adapter
+ 0030 SyncLink Multiport Adapter
+ 0070 SyncLink GT Adapter
+ 0080 SyncLink GT4 Adapter
+ 00a0 SyncLink GT2 Adapter
+ 0210 SyncLink Adapter v2
+13c1 3ware Inc
+ 1000 5xxx/6xxx-series PATA-RAID
+ 1001 7xxx/8xxx-series PATA/SATA-RAID
+ 13c1 1001 7xxx/8xxx-series PATA/SATA-RAID
+ 1002 9xxx-series SATA-RAID
+ 1003 9550SX SATA-II RAID PCI-X
+ 1004 9650SE SATA-II RAID PCIe
+ 1005 9690SA SAS/SATA-II RAID PCIe
+ 1010 9750 SAS2/SATA-II RAID PCIe
+13c2 Technotrend Systemtechnik GmbH
+ 000e Technotrend/Hauppauge DVB card rev2.3
+ 1019 TTechnoTrend-budget DVB S2-3200
+13c3 Janz Computer AG
+13c4 Phase Metrics
+13c5 Alphi Technology Corp
+13c6 Condor Engineering Inc
+ 0520 CEI-520 A429 Card
+ 0620 CEI-620 A429 Card
+ 0820 CEI-820 A429 Card
+ 0830 CEI-830 A429 Card
+ 1004 P-SER Multi-channel PMC to RS-485/422/232 adapter
+13c7 Blue Chip Technology Ltd
+ 0adc PCI-ADC
+ 0b10 PCI-PIO
+ 0d10 PCI-DIO
+ 524c PCI-RLY
+ 5744 PCI-WDT
+13c8 Apptech Inc
+13c9 Eaton Corporation
+13ca Iomega Corporation
+13cb Yano Electric Co Ltd
+13cc Metheus Corporation
+13cd Compatible Systems Corporation
+13ce Cocom A/S
+13cf Studio Audio & Video Ltd
+13d0 Techsan Electronics Co Ltd
+ 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card
+ 2104 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card (rev 01)
+ 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card
+13d1 Abocom Systems Inc
+ ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter
+ ab03 21x4x DEC-Tulip compatible 10/100 Ethernet
+ ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter
+ ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
+13d2 Shark Multimedia Inc
+13d4 Graphics Microsystems Inc
+13d5 Media 100 Inc
+13d6 K.I. Technology Co Ltd
+13d7 Toshiba Engineering Corporation
+13d8 Phobos corporation
+13d9 Apex PC Solutions Inc
+13da Intresource Systems pte Ltd
+13db Janich & Klass Computertechnik GmbH
+13dc Netboost Corporation
+13dd Multimedia Bundle Inc
+13de ABB Robotics Products AB
+13df E-Tech Inc
+ 0001 PCI56RVP Modem
+ 13df 0001 PCI56RVP Modem
+13e0 GVC Corporation
+13e1 Silicom Multimedia Systems Inc
+13e2 Dynamics Research Corporation
+13e3 Nest Inc
+13e4 Calculex Inc
+13e5 Telesoft Design Ltd
+13e6 Argosy research Inc
+13e7 NAC Incorporated
+13e8 Chip Express Corporation
+13e9 Intraserver Technology Inc
+13ea Dallas Semiconductor
+13eb Hauppauge Computer Works Inc
+13ec Zydacron Inc
+ 000a NPC-RC01 Remote control receiver
+13ed Raytheion E-Systems
+13ee Hayes Microcomputer Products Inc
+13ef Coppercom Inc
+13f0 Sundance Technology Inc / IC Plus Corp
+ 0200 IC Plus IP100A Integrated 10/100 Ethernet MAC + PHY
+ 1043 8213 NX1001
+ 0201 ST201 Sundance Ethernet
+ 1021 TC902x Gigabit Ethernet
+ 1023 IP1000 Family Gigabit Ethernet
+ 1043 8180 NX1101
+13f1 Oce' - Technologies B.V.
+13f2 Ford Microelectronics Inc
+13f3 Mcdata Corporation
+13f4 Troika Networks, Inc.
+ 1401 Zentai Fibre Channel Adapter
+13f5 Kansai Electric Co. Ltd
+13f6 C-Media Electronics Inc
+ 0011 CMI8738
+ 0100 CM8338A
+ 13f6 ffff CMI8338/C3DX PCI Audio Device
+ 0101 CM8338B
+ 13f6 0101 CMI8338-031 PCI Audio Device
+ 0111 CM8738
+ 1019 0970 P6STP-FL motherboard
+ 1043 8035 CUSI-FX motherboard
+ 1043 8077 CMI8738 6-channel audio controller
+ 1043 80e2 CMI8738 6ch-MX
+ 13f6 0111 CMI8738/C3DX PCI Audio Device
+ 13f6 9761 Theatron Agrippa
+ 153b 1144 Aureon 5.1
+ 153b 1170 Aureon 7.1
+ 1681 a000 Gamesurround MUSE XL
+ 270f 1103 CT-7NJS Ultra motherboard
+ 270f f462 7NJL1 motherboard
+ 584d 3731 Digital X-Mystique
+ 584d 3741 X-Plosion 7.1
+ 584d 3751 X-Raider 7.1
+ 584d 3761 X-Mystique 7.1 LP
+ 584d 3771 X-Mystique 7.1 LP Value
+ 7284 8384 Striker 7.1
+ 0211 CM8738
+ 8788 CMI8788 [Oxygen HD Audio]
+ 1043 8269 Virtuoso 200 (Xonar D2)
+ 1043 8275 Virtuoso 100 (Xonar DX)
+ 1043 82b7 Virtuoso 200 (Xonar D2X)
+ 1043 8314 Virtuoso 200 (Xonar HDAV1.3)
+ 1043 8327 Virtuoso 100 (Xonar DX)
+ 1043 834f Virtuoso 100 (Xonar D1)
+ 1043 835c Virtuoso 100 (Xonar Essence STX)
+ 1043 835d Virtuoso 100 (Xonar ST)
+ 1043 835e Virtuoso 200 (Xonar HDAV1.3 Slim)
+ 1043 838e Virtuoso 66 (Xonar DS)
+ 1043 8428 Virtuoso 100 (Xonar Xense)
+ 1043 8467 CMI8786 (Xonar DG)
+ 13f6 8782 PCI 2.0 HD Audio
+ 13f6 ffff CMI8787-HG2PCI
+ 14c3 1710 HiFier Fantasia
+ 14c3 1711 HiFier Serenade
+ 1a58 0910 Barracuda AC-1
+ 415a 5431 X-Meridian 7.1
+ 5431 017a X-Meridian 7.1 2G
+ 584d 3781 HDA X-Purity 7.1 Platinum
+ 7284 9761 CLARO
+ 7284 9781 CLARO halo
+ 7284 9783 eCLARO
+ 9880 CM9880
+13f7 Wildfire Communications
+13f8 Ad Lib Multimedia Inc
+13f9 NTT Advanced Technology Corp.
+13fa Pentland Systems Ltd
+13fb Aydin Corp
+13fc Computer Peripherals International
+13fd Micro Science Inc
+13fe Advantech Co. Ltd
+ 1240 PCI-1240 4-channel stepper motor controller card
+ 1600 PCI-16xx series PCI multiport serial board (function 0)
+# This board has two PCI functions, appears as two PCI devices
+ 1601 0002 PCI-1601 2-port unisolated RS-422/485
+# This board has two PCI functions, appears as two PCI devices
+ 1602 0002 PCI-1602 2-port isolated RS-422/485
+ 1612 0004 PCI-1612 4-port RS-232/422/485
+ 1603 PCI-1603 2-port isolated RS-232/current loop
+ 1604 PCI-1604 2-port RS-232
+ 16ff PCI-16xx series PCI multiport serial board (function 1: RX/TX steering CPLD)
+ 1601 0000 PCI-1601 2-port unisolated RS-422/485 PCI communications card
+ 1602 0000 PCI-1602 2-port isolated RS-422/485
+ 1612 0000 PCI-1612 4-port RS-232/422/485
+ 1711 PCI-1711 16-channel data acquisition card 12-bit, 100kS/s
+ 1733 PCI-1733 32-channel isolated digital input card
+ 1752 PCI-1752
+ 1754 PCI-1754
+ 1756 PCI-1756
+13ff Silicon Spice Inc
+1400 Artx Inc
+ 1401 9432 TX
+1401 CR-Systems A/S
+1402 Meilhaus Electronic GmbH
+ 0630 ME-630
+ 0940 ME-94
+ 0950 ME-95
+ 0960 ME-96
+ 1000 ME-1000
+ 100a ME-1000
+ 100b ME-1000
+ 1400 ME-1400
+ 140a ME-1400A
+ 140b ME-1400B
+ 140c ME-1400C
+ 140d ME-1400D
+ 140e ME-1400E
+ 14ea ME-1400EA
+ 14eb ME-1400EB
+ 1604 ME-1600/4U
+ 1608 ME-1600/8U
+ 160c ME-1600/12U
+ 160f ME-1600/16U
+ 168f ME-1600/16U8I
+ 4610 ME-4610
+ 4650 ME-4650
+ 4660 ME-4660
+ 4661 ME-4660I
+ 4662 ME-4660
+ 4663 ME-4660I
+ 4670 ME-4670
+ 4671 ME-4670I
+ 4672 ME-4670S
+ 4673 ME-4670IS
+ 4680 ME-4680
+ 4681 ME-4680I
+ 4682 ME-4680S
+ 4683 ME-4680IS
+ 6004 ME-6000/4
+ 6008 ME-6000/8
+ 600f ME-6000/16
+ 6014 ME-6000I/4
+ 6018 ME-6000I/8
+ 601f ME-6000I/16
+ 6034 ME-6000ISLE/4
+ 6038 ME-6000ISLE/8
+ 603f ME-6000ISLE/16
+ 6044 ME-6000/4/DIO
+ 6048 ME-6000/8/DIO
+ 604f ME-6000/16/DIO
+ 6054 ME-6000I/4/DIO
+ 6058 ME-6000I/8/DIO
+ 605f ME-6000I/16/DIO
+ 6074 ME-6000ISLE/4/DIO
+ 6078 ME-6000ISLE/8/DIO
+ 607f ME-6000ISLE/16/DIO
+ 6104 ME-6100/4
+ 6108 ME-6100/8
+ 610f ME-6100/16
+ 6114 ME-6100I/4
+ 6118 ME-6100I/8
+ 611f ME-6100I/16
+ 6134 ME-6100ISLE/4
+ 6138 ME-6100ISLE/8
+ 613f ME-6100ISLE/16
+ 6144 ME-6100/4/DIO
+ 6148 ME-6100/8/DIO
+ 614f ME-6100/16/DIO
+ 6154 ME-6100I/4/DIO
+ 6158 ME-6100I/8/DIO
+ 615f ME-6100I/16/DIO
+ 6174 ME-6100ISLE/4/DIO
+ 6178 ME-6100ISLE/8/DIO
+ 617f ME-6100ISLE/16/DIO
+ 6259 ME-6200I/9/DIO
+ 6359 ME-6300I/9/DIO
+ 810a ME-8100A
+ 810b ME-8100B
+ 820a ME-8200A
+ 820b ME-8200B
+1403 Ascor Inc
+1404 Fundamental Software Inc
+1405 Excalibur Systems Inc
+1406 Oce' Printing Systems GmbH
+1407 Lava Computer mfg Inc
+ 0100 Lava Dual Serial
+ 0101 Lava Quatro A
+ 0102 Lava Quatro B
+ 0110 Lava DSerial-PCI Port A
+ 0111 Lava DSerial-PCI Port B
+ 0120 Quattro-PCI A
+ 0121 Quattro-PCI B
+ 0180 Lava Octo A
+ 0181 Lava Octo B
+ 0200 Lava Port Plus
+ 0201 Lava Quad A
+ 0202 Lava Quad B
+ 0220 Lava Quattro PCI Ports A/B
+ 0221 Lava Quattro PCI Ports C/D
+ 0400 Lava 8255-PIO-PCI
+ 0500 Lava Single Serial
+ 0520 Lava RS422-SS-PCI
+ 0600 Lava Port 650
+ 8000 Lava Parallel
+ 8001 Dual parallel port controller A
+ 8002 Lava Dual Parallel port A
+ 8003 Lava Dual Parallel port B
+ 8800 BOCA Research IOPPAR
+1408 Aloka Co. Ltd
+1409 Timedia Technology Co Ltd
+ 7168 PCI2S550 (Dual 16550 UART)
+ 1409 0002 SER4036A3V (2x RS232 port)
+ 1409 4027 SER4027A (1x RS232 port)
+ 1409 4037 SER4037A (2x RS232 port)
+# Single DC-37 connector
+ 1409 4056 SER4056A (4x RS232)
+ 1409 5027 SER4027D
+ 1409 5037 SER4037D (2x RS232 port)
+# Single DC-62 connector
+ 1409 5066 SER4066R (8x RS232)
+# 4x 8p8c connectors
+ 1409 6056 SER4056D (4x RS232 port)
+ 7268 SUN1888 (Dual IEEE1284 parallel port)
+ 1409 0103 PAR4008A
+ 1409 0104 PAR4018A
+140a DSP Research Inc
+# Formerly RAMiX, Inc.
+140b GE Intelligent Platforms
+140c Elmic Systems Inc
+140d Matsushita Electric Works Ltd
+140e Goepel Electronic GmbH
+140f Salient Systems Corp
+1410 Midas lab Inc
+1411 Ikos Systems Inc
+# Nee IC Ensemble Inc.
+1412 VIA Technologies Inc.
+ 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller
+ 1412 1712 Hoontech ST Audio DSP 24
+ 1412 3632 M-Audio Delta Audiophile 192
+ 1412 d630 M-Audio Delta 1010
+ 1412 d631 M-Audio Delta DiO
+ 1412 d632 M-Audio Delta 66
+ 1412 d633 M-Audio Delta 44
+ 1412 d634 M-Audio Delta Audiophile 2496
+ 1412 d635 M-Audio Delta TDIF
+ 1412 d637 M-Audio Delta RBUS
+ 1412 d638 M-Audio Delta 410
+ 1412 d63b M-Audio Delta 1010LT
+ 1412 d63c Digigram VX442
+ 1416 1712 Hoontech ST Audio DSP 24 Media 7.1
+ 153b 1115 EWS88 MT
+ 153b 1125 EWS88 MT (Master)
+ 153b 112b EWS88 D
+ 153b 112c EWS88 D (Master)
+ 153b 1130 EWX 24/96
+ 153b 1138 DMX 6fire 24/96
+ 153b 1151 PHASE88
+ 16ce 1040 Edirol DA-2496
+ 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller
+ 1412 1724 Albatron PX865PE 7.1
+ 1412 3630 M-Audio Revolution 7.1
+ 1412 3631 M-Audio Revolution 5.1
+ 153b 1145 Aureon 7.1 Space
+ 153b 1147 Aureon 5.1 Sky
+ 153b 1150 PHASE 22
+ 153b 1153 Aureon 7.1 Universe
+ 17ab 1906 PSC 724 [Ultimate Edge]
+ 270f f641 ZNF3-150
+ 270f f645 ZNF3-250
+ 3130 4154 MAYA 44 MKII
+1413 Addonics
+1414 Microsoft Corporation
+ 0001 MN-120 (ADMtek Centaur-C based)
+ 0002 MN-130 (ADMtek Centaur-P based)
+ 5353 Hyper-V virtual VGA
+ 5801 XMA Decoder (Xenon)
+ 5802 SATA Controller - CdRom (Xenon)
+ 5803 SATA Controller - Disk (Xenon)
+ 5804 OHCI Controller 0 (Xenon)
+ 5805 EHCI Controller 0 (Xenon)
+ 5806 OHCI Controller 1 (Xenon)
+ 5807 EHCI Controller 1 (Xenon)
+ 580a Fast Ethernet Adapter (Xenon)
+ 580b Secure Flash Controller (Xenon)
+ 580d System Management Controller (Xenon)
+ 5811 Xenos GPU (Xenon)
+1415 Oxford Semiconductor Ltd
+ 8401 OX9162 Mode 1 (8-bit bus)
+ 8403 OX9162 Mode 0 (parallel port)
+ 9500 OX16PCI954 (Quad 16950 UART) function 0 (Disabled)
+ 9501 OX16PCI954 (Quad 16950 UART) function 0 (Uart)
+ 12c4 0201 Titan/cPCI (2 port)
+ 12c4 0202 Titan/cPCI (4 port)
+ 12c4 0203 Titan/cPCI (8 port)
+ 12c4 0210 Titan/104-Plus (8 port, p1-4)
+ 131f 2050 CyberPro (4-port)
+# Model IO1085, Part No: JJ-P46012
+ 131f 2051 CyberSerial 4S Plus
+ 15ed 2000 MCCR Serial p0-3 of 8
+ 15ed 2001 MCCR Serial p0-3 of 16
+ 9505 OXuPCI952 (Dual 16C950 UART)
+ 950a EXSYS EX-41092 Dual 16950 Serial adapter
+ 950b OXCB950 Cardbus 16950 UART
+ 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled)
+ 12c4 0200 Titan/cPCI (Unused)
+ 9511 OX16PCI954 (Quad 16950 UART) function 1 (8bit bus)
+ 12c4 0211 Titan/104-Plus (8 port, p5-8)
+ 15ed 2000 MCCR Serial p4-7 of 8
+ 15ed 2001 MCCR Serial p4-15 of 16
+ 9512 OX16PCI954 (Quad 16950 UART) function 1 (32bit bus)
+ 9513 OX16PCI954 (Quad 16950 UART) function 1 (parallel port)
+ 9521 OX16PCI952 (Dual 16950 UART)
+ 9523 OX16PCI952 Integrated Parallel Port
+ c308 EX-44016 16-port serial
+1416 Multiwave Innovation pte Ltd
+1417 Convergenet Technologies Inc
+1418 Kyushu electronics systems Inc
+1419 Excel Switching Corp
+141a Apache Micro Peripherals Inc
+141b Zoom Telephonics Inc
+141d Digitan Systems Inc
+141e Fanuc Ltd
+141f Visiontech Ltd
+1420 Psion Dacom plc
+ 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)
+ 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)
+1421 Ads Technologies Inc
+1422 Ygrec Systems Co Ltd
+1423 Custom Technology Corp.
+1424 Videoserver Connections
+1425 Chelsio Communications Inc
+ 000b T210 Protocol Engine
+ 000c T204 Protocol Engine
+ 0022 10GbE Ethernet Adapter
+ 0030 T310 10GbE Single Port Adapter
+ 103c 705e PCIe 10GBase-SR [AD386A]
+ 0031 T320 10GbE Dual Port Adapter
+ 0032 T302 1GbE Dual Port Adapter
+ 0033 T304 1GbE Quad Port Adapter
+ 0034 B320 10GbE Dual Port Adapter
+ 0035 S310-CR 10GbE Single Port Adapter
+ 0036 S320-LP-CR 10GbE Dual Port Adapter
+ 0037 N320-G2-CR 10GbE Dual Port Adapter
+ 4001 T420-CR Unified Wire Ethernet Controller
+ 4002 T422-CR Unified Wire Ethernet Controller
+ 4003 T440-CR Unified Wire Ethernet Controller
+ 4004 T420-BCH Unified Wire Ethernet Controller
+ 4005 T440-BCH Unified Wire Ethernet Controller
+ 4006 T440-CH Unified Wire Ethernet Controller
+ 4007 T420-SO Unified Wire Ethernet Controller
+ 4008 T420-CX Unified Wire Ethernet Controller
+ 4009 T420-BT Unified Wire Ethernet Controller
+ 400a T404-BT Unified Wire Ethernet Controller
+ 4401 T420-CR Unified Wire Ethernet Controller
+ 4402 T422-CR Unified Wire Ethernet Controller
+ 4403 T440-CR Unified Wire Ethernet Controller
+ 4404 T420-BCH Unified Wire Ethernet Controller
+ 4405 T440-BCH Unified Wire Ethernet Controller
+ 4406 T440-CH Unified Wire Ethernet Controller
+ 4407 T420-SO Unified Wire Ethernet Controller
+ 4408 T420-CX Unified Wire Ethernet Controller
+ 4409 T420-BT Unified Wire Ethernet Controller
+ 440a T404-BT Unified Wire Ethernet Controller
+ 4501 T420-CR Unified Wire Storage Controller
+ 4502 T422-CR Unified Wire Storage Controller
+ 4503 T440-CR Unified Wire Storage Controller
+ 4504 T420-BCH Unified Wire Storage Controller
+ 4505 T440-BCH Unified Wire Storage Controller
+ 4506 T440-CH Unified Wire Storage Controller
+ 4507 T420-SO Unified Wire Storage Controller
+ 4508 T420-CX Unified Wire Storage Controller
+ 4509 T420-BT Unified Wire Storage Controller
+ 450a T404-BT Unified Wire Storage Controller
+ 4601 T420-CR Unified Wire Storage Controller
+ 4602 T422-CR Unified Wire Storage Controller
+ 4603 T440-CR Unified Wire Storage Controller
+ 4604 T420-BCH Unified Wire Storage Controller
+ 4605 T440-BCH Unified Wire Storage Controller
+ 4606 T440-CH Unified Wire Storage Controller
+ 4607 T420-SO Unified Wire Storage Controller
+ 4608 T420-CX Unified Wire Storage Controller
+ 4609 T420-BT Unified Wire Storage Controller
+ 460a T404-BT Unified Wire Storage Controller
+ 4701 T420-CR Unified Wire Ethernet Controller
+ 4702 T422-CR Unified Wire Ethernet Controller
+ 4703 T440-CR Unified Wire Ethernet Controller
+ 4704 T420-BCH Unified Wire Ethernet Controller
+ 4705 T440-BCH Unified Wire Ethernet Controller
+ 4706 T440-CH Unified Wire Ethernet Controller
+ 4707 T420-SO Unified Wire Ethernet Controller
+ 4708 T420-CX Unified Wire Ethernet Controller
+ 4709 T420-BT Unified Wire Ethernet Controller
+ 470a T404-BT Unified Wire Ethernet Controller
+ 4801 T420-CR Unified Wire Ethernet Controller
+ 4802 T422-CR Unified Wire Ethernet Controller
+ 4803 T440-CR Unified Wire Ethernet Controller
+ 4804 T420-BCH Unified Wire Ethernet Controller
+ 4805 T440-BCH Unified Wire Ethernet Controller
+ 4806 T440-CH Unified Wire Ethernet Controller
+ 4807 T420-SO Unified Wire Ethernet Controller
+ 4808 T420-CX Unified Wire Ethernet Controller
+ 4809 T420-BT Unified Wire Ethernet Controller
+ 480a T404-BT Unified Wire Ethernet Controller
+ a000 PE10K Unified Wire Ethernet Controller
+1426 Storage Technology Corp.
+1427 Better On-Line Solutions
+1428 Edec Co Ltd
+1429 Unex Technology Corp.
+142a Kingmax Technology Inc
+142b Radiolan
+142c Minton Optic Industry Co Ltd
+142d Pix stream Inc
+142e Vitec Multimedia
+ 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder
+ 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder
+142f Radicom Research Inc
+1430 ITT Aerospace/Communications Division
+1431 Gilat Satellite Networks
+1432 Edimax Computer Co.
+ 9130 RTL81xx Fast Ethernet
+1433 Eltec Elektronik GmbH
+# Nee Real Time Devices US Inc.
+1435 RTD Embedded Technologies, Inc.
+ 4520 PCI4520
+ 6020 SPM6020
+ 6030 SPM6030
+ 6420 SPM186420
+ 6430 SPM176430
+ 6431 SPM176431
+ 7520 DM7520
+ 7540 SDM7540
+ 7820 DM7820
+1436 CIS Technology Inc
+1437 Nissin Inc Co
+1438 Atmel-dream
+1439 Outsource Engineering & Mfg. Inc
+143a Stargate Solutions Inc
+143b Canon Research Center, America
+143c Amlogic Inc
+143d Tamarack Microelectronics Inc
+143e Jones Futurex Inc
+143f Lightwell Co Ltd - Zax Division
+1440 ALGOL Corp.
+1441 AGIE Ltd
+1442 Phoenix Contact GmbH & Co.
+1443 Unibrain S.A.
+1444 TRW
+1445 Logical DO Ltd
+1446 Graphin Co Ltd
+1447 AIM GmBH
+1448 Alesis Studio Electronics
+1449 TUT Systems Inc
+144a Adlink Technology
+ 6208 PCI-6208V
+ 7250 PCI-7250
+ 7296 PCI-7296
+ 7432 PCI-7432
+ 7433 PCI-7433
+ 7434 PCI-7434
+ 7841 PCI-7841
+ 8133 PCI-8133
+ 8164 PCI-8164
+ 8554 PCI-8554
+ 9111 PCI-9111
+ 9113 PCI-9113
+ 9114 PCI-9114
+# nee Loronix Information Systems Inc.
+144b Verint Systems Inc.
+144c Catalina Research Inc
+144d Samsung Electronics Co Ltd
+ c00c P35 laptop
+ c511 R20 Laptop
+144e OLITEC
+144f Askey Computer Corp.
+1450 Octave Communications Ind.
+1451 SP3D Chip Design GmBH
+1453 MYCOM Inc
+1454 Altiga Networks
+1455 Logic Plus Plus Inc
+1456 Advanced Hardware Architectures
+1457 Nuera Communications Inc
+1458 Giga-byte Technology
+ 9001 GC-PTV-TAF Hybrid TV card
+ e911 GN-WIAG02
+1459 DOOIN Electronics
+145a Escalate Networks Inc
+145b PRAIM SRL
+145c Cryptek
+145d Gallant Computer Inc
+145e Aashima Technology B.V.
+145f Baldor Electric Company
+ 0001 NextMove PCI
+1460 DYNARC INC
+1461 Avermedia Technologies Inc
+ a3ce M179
+ a3cf M179
+ a836 M115 DVB-T, PAL/SECAM/NTSC Tuner
+ e836 M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner
+ f436 AVerTV Hybrid+FM
+1462 Micro-Star International Co., Ltd.
+ 5501 nVidia NV15DDR [GeForce2 Ti]
+ 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G]
+ 6825 PCI Card wireless 11g [PC54G]
+ 6834 RaLink RT2500 802.11g [PC54G2]
+ 7125 MS-7125 [K8N Neo4 Platinum]
+ 7235 P965 Neo MS-7235 mainboard
+ 7242 K9AGM RS485 Motherboard
+ 7250 MS-7250 Motherboard [K9N Platinum SLI/non-SLI]
+ 7327 K9AGM2-FIH Motherboard
+ 7650 Hetis 865GV-E (MS-7065)
+ 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter
+ 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter
+ 9110 GeFORCE FX5200
+ 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter
+ 9123 NVIDIA NV31 [GeForce FX 5600] FX5600-VTDR128 [MS-8912]
+ 9510 Radeon 9600XT
+ 9511 Radeon 9600XT
+ 9591 nVidia Corporation NV36 [GeForce FX 5700LE]
+ b834 Wireless 11g Turbo G PCI card [MSI PC60G]
+1463 Fast Corporation
+1464 Interactive Circuits & Systems Ltd
+1465 GN NETTEST Telecom DIV.
+1466 Designpro Inc.
+1467 DIGICOM SPA
+1468 AMBIT Microsystem Corp.
+1469 Cleveland Motion Controls
+146a IFR
+146b Parascan Technologies Ltd
+146c Ruby Tech Corp.
+ 1430 FE-1430TX Fast Ethernet PCI Adapter
+146d Tachyon, INC.
+146e Williams Electronics Games, Inc.
+146f Multi Dimensional Consulting Inc
+1470 Bay Networks
+1471 Integrated Telecom Express Inc
+1472 DAIKIN Industries, Ltd
+1473 ZAPEX Technologies Inc
+1474 Doug Carson & Associates
+1475 PICAZO Communications
+1476 MORTARA Instrument Inc
+1477 Net Insight
+1478 DIATREND Corporation
+1479 TORAY Industries Inc
+147a FORMOSA Industrial Computing
+147b ABIT Computer Corp.
+ 1084 IP35 [Dark Raider]
+147c AWARE, Inc.
+147d Interworks Computer Products
+147e Matsushita Graphic Communication Systems, Inc.
+147f NIHON UNISYS, Ltd.
+1480 SCII Telecom
+1481 BIOPAC Systems Inc
+1482 ISYTEC - Integrierte Systemtechnik GmBH
+ 0001 PCI-16 Host Interface for ITC-16
+1483 LABWAY Corporation
+1484 Logic Corporation
+1485 ERMA - Electronic GmBH
+1486 L3 Communications Telemetry & Instrumentation
+1487 MARQUETTE Medical Systems
+1488 KONTRON Electronik GmBH
+1489 KYE Systems Corporation
+148a OPTO
+148b INNOMEDIALOGIC Inc.
+148c C.P. Technology Co. Ltd
+148d DIGICOM Systems, Inc.
+ 1003 HCF 56k Data/Fax Modem
+148e OSI Plus Corporation
+148f Plant Equipment, Inc.
+1490 Stone Microsystems PTY Ltd.
+1491 ZEAL Corporation
+1492 Time Logic Corporation
+1493 MAKER Communications
+1494 WINTOP Technology, Inc.
+1495 TOKAI Communications Industry Co. Ltd
+1496 JOYTECH Computer Co., Ltd.
+1497 SMA Regelsysteme GmBH
+ 1497 SMA Technologie AG
+1498 TEWS Technologies GmbH
+ 0330 TPMC816 2 Channel CAN bus controller.
+ 035d TPMC861 4-Channel Isolated Serial Interface RS422/RS485
+ 0385 TPMC901 Extended CAN bus with 2/4/6 CAN controller
+ 21cc TCP460 CompactPCI 16 Channel Serial Interface RS232/RS422
+ 21cd TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422
+ 3064 TPCI100 (2 Slot IndustryPack PCI Carrier)
+ 30c8 TPCI200
+1499 EMTEC CO., Ltd
+149a ANDOR Technology Ltd
+149b SEIKO Instruments Inc
+149c OVISLINK Corp.
+149d NEWTEK Inc
+ 0001 Video Toaster for PC
+149e Mapletree Networks Inc.
+149f LECTRON Co Ltd
+14a0 SOFTING GmBH
+14a1 Systembase Co Ltd
+14a2 Millennium Engineering Inc
+14a3 Maverick Networks
+14a4 GVC/BCM Advanced Research
+ 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller
+14a5 XIONICS Document Technologies Inc
+14a6 INOVA Computers GmBH & Co KG
+14a7 MYTHOS Systems Inc
+14a8 FEATRON Technologies Corporation
+14a9 HIVERTEC Inc
+14aa Advanced MOS Technology Inc
+14ab Mentor Graphics Corp.
+14ac Novaweb Technologies Inc
+14ad Time Space Radio AB
+14ae CTI, Inc
+14af Guillemot Corporation
+ 7102 3D Prophet II MX
+14b0 BST Communication Technology Ltd
+14b1 Nextcom K.K.
+14b2 ENNOVATE Networks Inc
+14b3 XPEED Inc
+ 0000 DSL NIC
+14b4 PHILIPS Business Electronics B.V.
+14b5 Creamware GmBH
+ 0200 Scope
+ 0300 Pulsar
+ 0400 PulsarSRB
+ 0600 Pulsar2
+ 0800 DSP-Board
+ 0900 DSP-Board
+ 0a00 DSP-Board
+ 0b00 DSP-Board
+14b6 Quantum Data Corp.
+14b7 PROXIM Inc
+ 0001 Symphony 4110
+14b8 Techsoft Technology Co Ltd
+14b9 AIRONET Wireless Communications
+ 0001 PC4800
+ 0340 PC4800
+ 0350 PC4800
+ 4500 PC4500
+ 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800
+ a504 Cisco Aironet Wireless 802.11b
+ a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter
+ a506 Cisco Aironet Mini PCI b/g
+14ba INTERNIX Inc.
+# ARCNET interface card based on SMSC COM20022 chip and manufactured for SMSC Japan
+ 0600 ARC-PCI/22
+14bb SEMTECH Corporation
+14bc Globespan Semiconductor Inc.
+ d002 Pulsar [PCI ADSL Card]
+ d00f Pulsar [PCI ADSL Card]
+14bd CARDIO Control N.V.
+14be L3 Communications
+14bf SPIDER Communications Inc.
+14c0 COMPAL Electronics Inc
+14c1 MYRICOM Inc.
+ 0008 Myri-10G Dual-Protocol NIC
+ 14c1 0008 10G-PCIE-8A
+ 14c1 0009 10G-PCIE-8A (MSI-X firmware)
+ 14c1 000a 10G-PCIE-8B
+ 14c1 000b 10G-PCIE-8B2
+ 14c1 000c 10G-PCIE2-8B2
+ 8043 Myrinet 2000 Scalable Cluster Interconnect
+ 103c 1240 Myrinet M2L-PCI64/2-3.0 LANai 7.4 (HP OEM)
+14c2 DTK Computer
+14c3 MEDIATEK Corp.
+14c4 IWASAKI Information Systems Co Ltd
+14c5 Automation Products AB
+14c6 Data Race Inc
+14c7 Modular Technology Holdings Ltd
+14c8 Turbocomm Tech. Inc.
+14c9 ODIN Telesystems Inc
+14ca PE Logic Corp.
+14cb Billionton Systems Inc
+14cc NAKAYO Telecommunications Inc
+14cd Universal Scientific Ind.
+14ce Whistle Communications
+14cf TEK Microsystems Inc.
+14d0 Ericsson Axe R & D
+14d1 Computer Hi-Tech Co Ltd
+14d2 Titan Electronics Inc
+ 8001 VScom 010L 1 port parallel adaptor
+ 8002 VScom 020L 2 port parallel adaptor
+ 8010 VScom 100L 1 port serial adaptor
+ 8011 VScom 110L 1 port serial and 1 port parallel adaptor
+ 8020 VScom 200L 1 port serial adaptor
+ 8021 VScom 210L 2 port serial and 1 port parallel adaptor
+ 8028 VScom 200I/200I-SI 2-port serial adapter
+ 8040 VScom 400L 4 port serial adaptor
+ 8043 VScom 430L 4-port serial and 3-port parallel adapter
+ 8048 VScom 400I 4-port serial adapter
+ 8080 VScom 800L 8 port serial adaptor
+ 8088 VScom 800I 8-port serial adapter
+ a000 VScom 010H 1 port parallel adaptor
+ a001 VScom 100H 1 port serial adaptor
+ a003 VScom 400H 4 port serial adaptor
+ a004 VScom 400HF1 4 port serial adaptor
+ a005 VScom 200H 2 port serial adaptor
+ a007 VScom PCI800EH (PCIe) 8-port serial adapter Port 1-4
+ a008 VScom PCI800EH (PCIe) 8-port serial adapter Port 5-8
+ a009 VScom PCI400EH (PCIe) 4-port serial adapter
+ e001 VScom 010HV2 1 port parallel adaptor
+ e010 VScom 100HV2 1 port serial adaptor
+ e020 VScom 200HV2 2 port serial adaptor
+14d3 CIRTECH (UK) Ltd
+14d4 Panacom Technology Corp
+14d5 Nitsuko Corporation
+14d6 Accusys Inc
+ 6101 ACS-61xxx, PCIe to SAS/SATA RAID HBA
+ 6201 ACS-62xxx, External PCIe to SAS/SATA RAID controller
+14d7 Hirakawa Hewtech Corp
+14d8 HOPF Elektronik GmBH
+# Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc.
+14d9 Alliance Semiconductor Corporation
+ 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]
+ 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge
+14da National Aerospace Laboratories
+14db AFAVLAB Technology Inc
+ 2120 TK9902
+ 2182 AFAVLAB Technology Inc. 8-port serial card
+14dc Amplicon Liveline Ltd
+ 0000 PCI230
+ 0001 PCI242
+ 0002 PCI244
+ 0003 PCI247
+ 0004 PCI248
+ 0005 PCI249
+ 0006 PCI260
+ 0007 PCI224
+ 0008 PCI234
+ 0009 PCI236
+ 000a PCI272
+ 000b PCI215
+14dd Boulder Design Labs Inc
+14de Applied Integration Corporation
+14df ASIC Communications Corp
+14e1 INVERTEX
+14e2 INFOLIBRIA
+14e3 AMTELCO
+14e4 Broadcom Corporation
+ 0576 BCM43224 802.11a/b/g/n
+ 0800 Sentry5 Chipcommon I/O Controller
+ 0804 Sentry5 PCI Bridge
+ 0805 Sentry5 MIPS32 CPU
+ 0806 Sentry5 Ethernet Controller
+ 080b Sentry5 Crypto Accelerator
+ 080f Sentry5 DDR/SDR RAM Controller
+ 0811 Sentry5 External Interface Core
+ 0816 BCM3302 Sentry5 MIPS32 CPU
+ 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express
+ 1028 01c1 Precision 490
+ 1028 01c2 Latitude D620
+ 103c 3015 PCIe LAN on Motherboard
+ 107b 5048 E4500 Onboard
+ 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express
+ 1612 BCM70012 Video Decoder [Crystal HD]
+ 1615 BCM70015 Video Decoder [Crystal HD]
+ 1639 NetXtreme II BCM5709 Gigabit Ethernet
+ 1028 0235 PowerEdge R710 BCM5709 Gigabit Ethernet
+ 1028 0236 PowerEdge R610 BCM5709 Gigabit Ethernet
+ 1028 0237 PowerEdge T610 BCM5709 Gigabit Ethernet
+ 103c 7055 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter
+ 103c 7059 NC382T PCI Express Dual Port Multifunction Gigabit Server Adapter
+ 10a9 8027 Quad port Gigabit Ethernet Controller
+ 163a NetXtreme II BCM5709S Gigabit Ethernet
+ 1028 027b PowerEdge M805 Broadcom NetXtreme II BCM5709S
+ 1028 029c PowerEdge M710 BCM5709S Gigabit Ethernet
+ 103c 171d NC382m Dual Port 1GbE Multifunction BL-c Adapter
+ 103c 7056 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter
+ 163b NetXtreme II BCM5716 Gigabit Ethernet
+ 1028 028c PowerEdge R410 BCM5716 Gigabit Ethernet
+ 1028 028d PowerEdge T410 BCM5716 Gigabit Ethernet
+ 163c NetXtreme II BCM5716S Gigabit Ethernet
+ 1644 NetXtreme BCM5700 Gigabit Ethernet
+ 1014 0277 Broadcom Vigil B5700 1000Base-T
+ 1028 00d1 Broadcom BCM5700
+ 1028 0106 Broadcom BCM5700
+ 1028 0109 Broadcom BCM5700 1000Base-T
+ 1028 010a Broadcom BCM5700 1000BaseTX
+ 10b7 1000 3C996-T 1000Base-T
+ 10b7 1001 3C996B-T 1000Base-T
+ 10b7 1002 3C996C-T 1000Base-T
+ 10b7 1003 3C997-T 1000Base-T Dual Port
+ 10b7 1004 3C996-SX 1000Base-SX
+ 10b7 1005 3C997-SX 1000Base-SX Dual Port
+ 10b7 1008 3C942 Gigabit LOM (31X31)
+ 14e4 0002 NetXtreme 1000Base-SX
+ 14e4 0003 NetXtreme 1000Base-SX
+ 14e4 0004 NetXtreme 1000Base-T
+ 14e4 1028 NetXtreme 1000BaseTX
+ 14e4 1644 BCM5700 1000Base-T
+ 1645 NetXtreme BCM5701 Gigabit Ethernet
+ 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+ 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
+ 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL)
+ 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL)
+ 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+ 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
+ 1028 0121 Broadcom BCM5701 1000Base-T
+ 103c 128a BCM5701 1000Base-T (HP, OEM 3COM)
+ 103c 128b 1000Base-SX (PCI) [A7073A]
+ 103c 12a4 Core Lan 1000Base-T
+ 103c 12c1 IOX Core Lan 1000Base-T [A7109AX]
+ 103c 1300 Core LAN/SCSI Combo [A6794A]
+ 10a9 8010 IO9/IO10 Gigabit Ethernet (Copper)
+ 10a9 8011 Gigabit Ethernet (Copper)
+ 10a9 8012 Gigabit Ethernet (Fiber)
+ 10b7 1004 3C996-SX 1000Base-SX
+ 10b7 1006 3C996B-T 1000Base-T
+ 10b7 1007 3C1000-T 1000Base-T
+ 10b7 1008 3C940-BR01 1000Base-T
+ 14e4 0001 BCM5701 1000Base-T
+ 14e4 0005 BCM5701 1000Base-T
+ 14e4 0006 BCM5701 1000Base-T
+ 14e4 0007 BCM5701 1000Base-SX
+ 14e4 0008 BCM5701 1000Base-T
+ 14e4 1645 NetXtreme BCM5701 Gigabit Ethernet
+ 14e4 8008 BCM5701 1000Base-T
+ 1646 NetXtreme BCM5702 Gigabit Ethernet
+ 0e11 00bb NC7760 1000BaseTX
+ 1028 0126 Broadcom BCM5702 1000BaseTX
+ 14e4 8009 BCM5702 1000BaseTX
+ 1647 NetXtreme BCM5703 Gigabit Ethernet
+ 0e11 0099 NC7780 1000BaseTX
+ 0e11 009a NC7770 1000BaseTX
+ 10a9 8010 SGI IO9 Gigabit Ethernet (Copper)
+ 14e4 0009 BCM5703 1000BaseTX
+ 14e4 000a BCM5703 1000BaseSX
+ 14e4 000b BCM5703 1000BaseTX
+ 14e4 8009 BCM5703 1000BaseTX
+ 14e4 800a BCM5703 1000BaseTX
+ 1648 NetXtreme BCM5704 Gigabit Ethernet
+ 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 1028 014a PowerEdge 1750
+ 1028 0170 PowerEdge 6850 Broadcom NetXtreme BCM5704
+ 103c 310f NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 10a9 8013 Dual Port Gigabit Ethernet (PCI-X,Copper)
+ 10a9 8018 Dual Port Gigabit Ethernet (A330)
+ 10a9 801a Dual Port Gigabit Ethernet (IA-blade)
+ 10a9 801b Quad Port Gigabit Ethernet (PCI-E,Copper)
+ 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X
+ 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X
+ 1166 1648 NetXtreme CIOB-E 1000Base-T
+ 1734 100b PRIMERGY RX/TX series onboard LAN
+ 1649 NetXtreme BCM5704S_2 Gigabit Ethernet
+ 164a NetXtreme II BCM5706 Gigabit Ethernet
+ 103c 1709 NC371i Integrated PCI-X Multifunction Gigabit Server Adapter
+ 103c 3070 NC380T PCI Express Dual Port Multifunction Gigabit Server Adapter
+ 103c 3101 NC370T MultifuNCtion Gigabit Server Adapter
+ 103c 3106 NC370i Multifunction Gigabit Server Adapter
+ 164c NetXtreme II BCM5708 Gigabit Ethernet
+ 1028 01f0 PowerEdge R900 Broadcom NetXtreme II BCM5708
+ 1028 0205 PowerEdge 2970 Broadcom NetXtreme II BCM5708
+ 1028 020b PowerEdge T605 Broadcom NetXtreme II BCM5708
+ 1028 0221 PowerEdge R805 Broadcom NetXtreme II BCM5708
+ 1028 0223 PowerEdge R905 Broadcom NetXtreme II BCM5708
+ 1028 1f12 PowerEdge R805/R905 Broadcom NetXtreme II BCM5708
+ 103c 7037 NC373T PCI Express Multifunction Gigabit Server Adapter
+ 103c 7038 NC373i Integrated Multifunction Gigabit Server Adapter
+ 103c 7045 NC374m PCI Express Dual Port Multifunction Gigabit Server Adapter
+ 164d NetXtreme BCM5702FE Gigabit Ethernet
+ 164e NetXtreme II BCM57710 10-Gigabit PCIe [Everest]
+ 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter
+ 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter
+ 164f NetXtreme II BCM57711 10-Gigabit PCIe
+ 1650 NetXtreme II BCM57711E 10-Gigabit PCIe
+ 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter
+ 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter
+ 1653 NetXtreme BCM5705 Gigabit Ethernet
+ 0e11 00e3 NC7761 Gigabit Server Adapter
+ 1654 NetXtreme BCM5705_2 Gigabit Ethernet
+ 0e11 00e3 NC7761 Gigabit Server Adapter
+ 103c 3100 NC1020 ProLiant Gigabit Server Adapter 32 PCI
+ 103c 3226 NC150T 4-port Gigabit Combo Switch & Adapter
+ 1655 NetXtreme BCM5717 Gigabit Ethernet PCIe
+ 1656 NetXtreme BCM5718 Gigabit Ethernet PCIe
+ 1657 NetXtreme BCM5719 Gigabit Ethernet PCIe
+ 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express
+ 1014 02c6 eServer xSeries server mainboard
+ 1028 01e6 PowerEdge 860
+ 1028 023c PowerEdge R200 Broadcom NetXtreme BCM5721
+ 103c 170b NC320m PCI Express Dual Port Gigabit Server Adapter
+ 103c 7031 NC320T PCIe Gigabit Server Adapter
+ 103c 7032 NC320i PCIe Gigabit Server Adapter
+ 1734 1061 PRIMERGY RX/TX S2 series onboard LAN
+ 165a NetXtreme BCM5722 Gigabit Ethernet PCI Express
+# Dual NIC server
+ 1014 0378 IBM System x3350 (Machine type 4192)
+ 1028 020f PowerEdge R300 Broadcom NetXtreme 5722
+ 1028 0210 PowerEdge T300 Broadcom NetXtreme 5722
+ 1028 0225 PowerEdge T105 Broadcom NetXtreme 5722
+ 103c 7051 NC105i PCIe Gigabit Server Adapter
+ 103c 7052 NC105T PCIe Gigabit Server Adapter
+ 165b NetXtreme BCM5723 Gigabit Ethernet PCIe
+ 103c 705d NC107i Integrated PCI Express Gigabit Server Adapter
+ 165c NetXtreme BCM5724 Gigabit Ethernet PCIe
+ 165d NetXtreme BCM5705M Gigabit Ethernet
+ 1028 865d Latitude D400
+ 14e4 165d Dell Latitude D600
+ 165e NetXtreme BCM5705M_2 Gigabit Ethernet
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 099c NX6110/NC6120
+ 10cf 1279 LifeBook E8010D
+ 165f NetXtreme BCM5720 Gigabit Ethernet PCIe
+ 1662 NetXtreme II BCM57712 10 Gigabit Ethernet
+ 1663 NetXtreme II BCM57712 10 Gigabit Ethernet Multi Function
+ 1668 NetXtreme BCM5714 Gigabit Ethernet
+ 103c 7039 NC324i PCIe Dual Port Gigabit Server Adapter
+ 1669 NetXtreme 5714S Gigabit Ethernet
+ 166a NetXtreme BCM5780 Gigabit Ethernet
+ 103c 7035 NC325i Integrated Dual port PCIe Express Gigabit Server Adapter
+ 166b NetXtreme BCM5780S Gigabit Ethernet
+ 166e 570x 10/100 Integrated Controller
+ 166f NetXtreme II BCM57712 10 Gigabit Ethernet Virtual Function
+ 1672 NetXtreme BCM5754M Gigabit Ethernet PCI Express
+ 1673 NetXtreme BCM5755M Gigabit Ethernet PCI Express
+ 1674 NetXtreme BCM5756ME Gigabit Ethernet PCI Express
+ 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express
+ 1028 0176 Dimension XPS Gen 4
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 1028 0182 Latitude D610
+ 1028 0187 Precision M70
+ 1028 01a8 Precision 380
+ 1028 01ad OptiPlex GX620
+ 103c 3006 DC7100 SFF(DX878AV)
+ 1462 028c 915P/G Neo2
+ 1734 105d Scenic W620
+ 1678 NetXtreme BCM5715 Gigabit Ethernet
+ 103c 703e NC326i PCIe Dual Port Gigabit Server Adapter
+ 1679 NetXtreme BCM5715S Gigabit Ethernet
+ 103c 1707 NC326m PCIe Dual Port Adapter
+ 103c 170c NC325m PCIe Quad Port Adapter
+ 103c 703c NC326i PCIe Dual Port Gigabit Server Adapter
+ 167a NetXtreme BCM5754 Gigabit Ethernet PCI Express
+ 1028 01da OptiPlex 745
+ 1028 01de Precision 390
+ 1028 01df PowerEdge SC440
+ 1028 0214 Precision T3400
+ 1028 021e Precision T5400
+ 167b NetXtreme BCM5755 Gigabit Ethernet PCI Express
+ 103c 280a DC5750 Microtower
+ 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express
+ 1014 0577 ThinkPad Z60t
+ 103c 0940 HP Compaq nw8240 Mobile Workstation
+ 17aa 2081 ThinkPad R60e
+ 167e NetXtreme BCM5751F Fast Ethernet PCI Express
+ 167f NetLink BCM5787F Fast Ethernet PCI Express
+ 1680 NetXtreme BCM5761e Gigabit Ethernet PCIe
+ 1681 NetXtreme BCM5761 Gigabit Ethernet PCIe
+ 1684 NetXtreme BCM5764M Gigabit Ethernet PCIe
+ 1685 NetXtreme II BCM57500S Gigabit Ethernet
+ 168a NetXtreme II BCM57800 10 Gigabit Ethernet
+ 168d NetXtreme II BCM57840 10/20 Gigabit Ethernet
+ 168e NetXtreme II BCM57810 10 Gigabit Ethernet
+ 1690 NetXtreme BCM57760 Gigabit Ethernet PCIe
+ 1691 NetLink BCM57788 Gigabit Ethernet PCIe
+ 1028 04aa XPS 8300
+ 1692 NetLink BCM57780 Gigabit Ethernet PCIe
+ 1025 033d Aspire 7740G
+ 1693 NetLink BCM5787M Gigabit Ethernet PCI Express
+ 1025 0121 Aspire 5920G
+ 103c 30c0 6710b
+ 1694 NetLink BCM57790 Gigabit Ethernet PCIe
+ 1696 NetXtreme BCM5782 Gigabit Ethernet
+ 103c 12bc d530 CMT (DG746A)
+ 14e4 000d NetXtreme BCM5782 1000Base-T
+ 1698 NetLink BCM5784M Gigabit Ethernet PCIe
+ 1699 NetLink BCM5785 Gigabit Ethernet
+ 169a NetLink BCM5786 Gigabit Ethernet PCI Express
+ 169b NetLink BCM5787 Gigabit Ethernet PCI Express
+ 169c NetXtreme BCM5788 Gigabit Ethernet
+ 103c 308b MX6125
+ 103c 30a1 NC2400
+ 144d c018 X20
+ 1462 590c KT6 Delta-FIS2R (MS-6590)
+ 169d NetLink BCM5789 Gigabit Ethernet PCI Express
+ 16a0 NetLink BCM5785 Fast Ethernet
+ 16a5 NetXtreme II BCM57800 10 Gigabit Ethernet Multi Function
+ 16a6 NetXtreme BCM5702X Gigabit Ethernet
+ 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+ 1028 0126 BCM5702 1000Base-T
+ 14e4 000c BCM5702 1000Base-T
+ 14e4 8009 BCM5702 1000Base-T
+ 16a7 NetXtreme BCM5703X Gigabit Ethernet
+ 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 1014 026f eServer xSeries server mainboard
+ 14e4 0009 NetXtreme BCM5703 1000Base-T
+ 14e4 000a NetXtreme BCM5703 1000Base-SX
+ 14e4 000b NetXtreme BCM5703 1000Base-T
+ 14e4 800a NetXtreme BCM5703 1000Base-T
+ 16a8 NetXtreme BCM5704S Gigabit Ethernet
+ 103c 132b PCI-X 1000Mbps Dual-port Built-in
+ 10a9 8014 Dual Port Gigabit Ethernet (PCI-X,Fiber)
+ 10a9 801c Quad Port Gigabit Ethernet (PCI-E,Fiber)
+ 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X
+ 16a9 NetXtreme II BCM57800 10 Gigabit Ethernet Virtual Function
+ 16aa NetXtreme II BCM5706S Gigabit Ethernet
+ 103c 3102 NC370F MultifuNCtion Gigabit Server Adapter
+ 103c 310c NC370i Multifunction Gigabit Server Adapter
+ 16ab NetXtreme II BCM57840 10/20 Gigabit Ethernet Multi Function
+ 16ac NetXtreme II BCM5708S Gigabit Ethernet
+ 1014 0304 NetXtreme II BCM5708S Gigabit Ethernet
+ 1028 01bb PowerEdge 1955 Broadcom NetXtreme II BCM5708S
+ 1028 020c PowerEdge M605 Broadcom NetXtreme II BCM5708S
+ 103c 1706 NC373m Multifunction Gigabit Server Adapter
+ 103c 7038 NC373i PCI Express Multifunction Gigabit Server Adapter
+ 103c 703b NC373i Integrated Multifunction Gigabit Server Adapter
+ 103c 703d NC373F PCI Express Multifunction Gigabit Server Adapter
+ 16ad NetXtreme II BCM57840 10/20 Gigabit Ethernet Virtual Function
+ 16ae NetXtreme II BCM57810 10 Gigabit Ethernet Multi Function
+ 16af NetXtreme II BCM57810 10 Gigabit Ethernet Virtual Function
+ 16b0 NetXtreme BCM57761 Gigabit Ethernet PCIe
+ 16b1 NetLink BCM57781 Gigabit Ethernet PCIe
+ 16b2 NetLink BCM57791 Gigabit Ethernet PCIe
+ 16b4 NetXtreme BCM57765 Gigabit Ethernet PCIe
+ 16b5 NetLink BCM57785 Gigabit Ethernet PCIe
+ 16b6 NetLink BCM57795 Gigabit Ethernet PCIe
+ 16bc NetXtreme BCM57765 Memory Card Reader
+ 16c6 NetXtreme BCM5702A3 Gigabit Ethernet
+ 10b7 1100 3C1000B-T 10/100/1000 PCI
+ 14e4 000c BCM5702 1000Base-T
+ 14e4 8009 BCM5702 1000Base-T
+ 16c7 NetXtreme BCM5703 Gigabit Ethernet
+ 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+ 103c 12c3 Combo FC/GigE-SX [A9782A]
+ 103c 12ca Combo FC/GigE-T [A9784A]
+ 103c 1321 Core I/O LAN/SCSI Combo [AB314A]
+ 14e4 0009 NetXtreme BCM5703 1000Base-T
+ 14e4 000a NetXtreme BCM5703 1000Base-SX
+ 16dd NetLink BCM5781 Gigabit Ethernet PCI Express
+ 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express
+ 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 16fe NetXtreme BCM5753F Fast Ethernet PCI Express
+ 170c BCM4401-B0 100Base-TX
+ 1028 0188 Inspiron 6000 laptop
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 1028 01af Inspiron 6400
+ 1028 01cd Inspiron 9400 Laptop
+ 1028 01d7 XPS M1210
+ 1028 01d8 Inspiron E1405
+ 103c 099c NX6110/NC6120
+ 103c 30a2 NX7300 laptop
+ 14e4 170c HP Compaq 6720t Mobile Thin Client
+ 170d NetXtreme BCM5901 100Base-TX
+ 1014 0545 ThinkPad R40e
+ 170e NetXtreme BCM5901 100Base-TX
+ 1712 NetLink BCM5906 Fast Ethernet PCI Express
+ 1713 NetLink BCM5906M Fast Ethernet PCI Express
+ 1028 01f3 Inspiron 1420
+ 1028 0209 XPS M1330
+ 103c 30c0 Compaq 6710b
+ 17aa 3a23 IdeaPad S10e
+ 3352 BCM3352
+ 3360 BCM3360
+ 4210 BCM4210 iLine10 HomePNA 2.0
+ 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem
+ 4212 BCM4212 v.90 56k modem
+ 4220 802-11b/g Wireless PCI controller, packaged as a Linksys WPC54G ver 1.2 PCMCIA card
+ 4222 NetXtreme BCM5753M Gigabit Ethernet PCI Express
+ 4301 BCM4301 802.11b Wireless LAN Controller
+ 1028 0407 TrueMobile 1180 Onboard WLAN
+ 1043 0120 WL-103b Wireless LAN PC Card
+ 16a5 1602 B-300 802.11b Wireless CardBus Adapter
+ 1737 4301 WMP11 v2.7 802.11b Wireless-B PCI Adapter
+ 4305 BCM4307 V.90 56k Modem
+ 4306 BCM4307 Ethernet Controller
+ 4307 BCM4307 802.11b Wireless LAN Controller
+ 4310 BCM4310 Chipcommon I/OController
+ 4311 BCM4311 802.11b/g WLAN
+ 1028 0007 Wireless 1390 WLAN Mini-Card
+ 1028 0008 Wireless 1390 WLAN ExpressCard
+ 103c 1363 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1364 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1365 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1374 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1375 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1376 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 1377 BCM4311 802.11b/g Wireless LAN Controller
+ 103c 137f BCM4322 802.11a/b/g/n Wireless LAN Controller
+ 103c 1380 BCM4322 802.11a/b/g/n Wireless LAN Controller
+ 14e4 4311 BCM94311MCG
+ 4312 BCM4311 802.11a/b/g
+ 1028 0007 Wireless 1490 Dual Band WLAN Mini-Card
+ 1028 0008 Wireless 1490 Dual Band WLAN ExpressCard
+ 103c 135a Broadcom 802.11a/b/g WLAN
+ 103c 135f Broadcom 802.11a/b/g WLAN
+ 103c 1360 Broadcom 802.11a/b/g WLAN
+ 103c 1361 Broadcom 802.11a/b/g WLAN
+ 103c 1362 Broadcom 802.11a/b/g WLAN
+ 103c 1370 Broadcom 802.11a/b/g WLAN
+ 103c 1371 Broadcom 802.11a/b/g WLAN
+ 103c 1372 Broadcom 802.11a/b/g WLAN
+ 103c 1373 Broadcom 802.11a/b/g WLAN
+ 103c 30b5 Presario V3242AU
+ 1371 103c Broadcom 802.11 Multiband-netwerkadapter(6715s)
+ 4313 BCM4311 802.11a
+ 4315 BCM4312 802.11b/g LP-PHY
+ 1028 000b Wireless 1395 WLAN Mini-Card
+ 1028 000c Wireless 1397 WLAN Mini-Card
+ 103c 137c BCM4312 802.11b/g Wireless LAN Controller
+ 103c 137d BCM4312 802.11b/g Wireless LAN Controller
+ 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller
+ 1028 0005 Wireless 1370 WLAN Mini-PCI Card
+ 1028 0006 Wireless 1370 WLAN PC Card
+ 103c 1355 Broadcom 802.11b/g WLAN
+ 103c 1356 Broadcom 802.11b/g WLAN
+ 103c 1357 Broadcom 802.11b/g WLAN
+ 1043 100f WL-138G v2 / WL-138gE / WL-100gE
+ 1043 120f A6U notebook embedded card
+ 1154 0355 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Adapter
+ 1468 0311 Aspire 3022WLMi, 5024WLMi, 5020
+ 1468 0312 TravelMate 2410
+ 14e4 0449 Gateway 7510GX
+ 16ec 0119 U.S.Robotics Wireless MAXg PC Card
+ 1737 0042 WMP54GS v1.1 802.11g Wireless-G PCI Adapter with SpeedBooster
+ 1737 0048 WPC54G v3 802.11g Wireless-G Notebook Adapter
+ 1737 0049 WPC54GS v2 802.11g Wireless-G Notebook Adapter with SpeedBooster
+ 1799 7000 F5D7000 v4000 Wireless G Desktop Card
+ 1799 7001 F5D7001 v2000 Wireless G Plus Desktop Card
+ 1799 7010 F5D7010 v4000 Wireless G Notebook Card
+ 1799 7011 F5D7011 v2000 High-Speed Mode Wireless G Notebook Card
+ 4319 BCM4318 [AirForce 54g] 802.11a/b/g PCI Express Transceiver
+ 1028 0005 Wireless 1470 Dual Band WLAN Mini-PCI Card
+ 1028 0006 Wireless 1470 Dual Band WLAN PC Card
+ 103c 1358 Broadcom 802.11a/b/g WLAN
+ 103c 1359 Broadcom 802.11a/b/g WLAN
+ 103c 135a Broadcom 802.11a/b/g WLAN
+ 4320 BCM4306 802.11b/g Wireless LAN Controller
+ 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card
+ 1028 0002 TrueMobile 1300 WLAN PC Card
+ 1028 0003 Wireless 1350 WLAN Mini-PCI Card
+ 1028 0004 Wireless 1350 WLAN PC Card
+ 103c 12f4 Broadcom 802.11b/g WLAN
+ 103c 12f8 Broadcom 802.11b/g WLAN
+ 103c 12fa Broadcom 802.11b/g WLAN
+ 103c 12fb Broadcom 802.11b/g WLAN
+ 1043 100f WL-100G
+ 1057 7025 WN825G
+ 106b 004e AirPort Extreme
+ 1154 0330 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Desktop Adapter
+ 144f 7050 eMachines M6805 802.11g Built-in Wireless
+ 144f 7051 Sonnet Aria Extreme PCI
+ 14e4 4320 Linksys WMP54G PCI
+ 1737 0015 WMP54GS v1.0 802.11g Wireless-G PCI Adapter with SpeedBooster
+ 1737 4320 WPC54G v1 / WPC54GS v1 802.11g Wireless-G Notebook Adapter
+ 1799 7000 F5D7000 v1000 Wireless G Desktop Card
+ 1799 7001 F5D7001 v1000 Wireless G Plus Desktop Card
+ 1799 7010 F5D7010 v1000 Wireless G Notebook Card
+ 1799 7011 F5D7011 v1000 High-Speed Mode Wireless G Notebook Card
+ 185f 1220 TravelMate 290E WLAN Mini-PCI Card
+ 4321 BCM4306 802.11a Wireless LAN Controller
+ 4322 BCM4306 UART
+ 4324 BCM4306 802.11a/b/g
+ 1028 0001 Truemobile 1400
+ 1028 0002 TrueMobile 1400 Dual Band WLAN PC Card
+ 1028 0003 Truemobile 1450 MiniPCI
+ 1028 0004 Wireless 1450 Dual Band WLAN PC Card
+ 103c 12f9 Broadcom 802.11a/b/g WLAN
+ 103c 12fc Broadcom 802.11a/b/g WLAN
+ 4325 BCM43xG 802.11b/g
+ 1414 0003 Wireless Notebook Adapter MN-720
+ 1414 0004 Wireless PCI Adapter MN-730
+ 4326 BCM4307 Chipcommon I/O Controller?
+ 4328 BCM4321 802.11a/b/g/n
+ 1028 0009 Wireless 1500 Draft 802.11n WLAN Mini-Card
+ 1028 000a Wireless 1500 Draft 802.11n WLAN Mini-card
+ 103c 1366 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 103c 1367 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 103c 1368 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 103c 1369 BCM4321 802.11a/b/g/n Wireless LAN Controller
+ 14e4 4328 BCM4328 802.11a/b/g/n
+ 4329 BCM4321 802.11b/g/n
+ 1737 0058 WPC300N v1 Wireless-N Notebook Adapter
+ 432a BCM4321
+ 432b BCM4322 802.11a/b/g/n Wireless LAN Controller
+ 1028 000d Wireless 1510 Wireless-N WLAN Mini-Card
+ 432c BCM4322 802.11b/g/n
+ 1799 d311 Dynex DX-NNBX 802.11n WLAN Cardbus Card
+ 432d BCM4322 802.11a/b/g/n
+ 4331 BCM4331 802.11a/b/g/n
+ 106b 00d6 AirPort Extreme
+ 4344 EDGE/GPRS data and 802.11b/g combo cardbus [GC89]
+ 4353 BCM43224 802.11a/b/g/n
+ 4357 BCM43225 802.11b/g/n
+ 4358 BCM43227 802.11b/g/n
+ 4359 BCM43228 802.11a/b/g/n
+ 4401 BCM4401 100Base-T
+ 1025 0035 TravelMate 660
+ 103c 08b0 tc1100 tablet
+ 1043 80a8 A7V8X motherboard
+ 4402 BCM4402 Integrated 10/100BaseT
+ 4403 BCM4402 V.90 56k Modem
+ 4410 BCM4413 iLine32 HomePNA 2.0
+ 4411 BCM4413 V.90 56k modem
+ 4412 BCM4412 10/100BaseT
+ 4430 BCM44xx CardBus iLine32 HomePNA 2.0
+ 4432 BCM4432 CardBus 10/100BaseT
+ 4610 BCM4610 Sentry5 PCI to SB Bridge
+ 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0
+ 4612 BCM4610 Sentry5 V.90 56k Modem
+ 4613 BCM4610 Sentry5 Ethernet Controller
+ 4614 BCM4610 Sentry5 External Interface
+ 4615 BCM4610 Sentry5 USB Controller
+ 4704 BCM4704 PCI to SB Bridge
+ 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller
+ 4706 BCM4704 Sentry5 Ethernet Controller
+ 4707 BCM4704 Sentry5 USB Controller
+ 4708 BCM4704 Crypto Accelerator
+ 4710 BCM4710 Sentry5 PCI to SB Bridge
+ 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0
+ 4712 BCM47xx V.92 56k modem
+ 4713 Sentry5 Ethernet Controller
+ 4714 BCM47xx Sentry5 External Interface
+ 4715 Sentry5 USB Controller
+ 4716 BCM47xx Sentry5 USB Host Controller
+ 4717 BCM47xx Sentry5 USB Device Controller
+ 4718 Sentry5 Crypto Accelerator
+ 4719 BCM47xx/53xx RoboSwitch Core
+ 4720 BCM4712 MIPS CPU
+ 4727 BCM4313 802.11b/g/n Wireless LAN Controller
+ 1028 0010 XPS 8300
+ 5365 BCM5365P Sentry5 Host Bridge
+ 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller
+ 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller
+ 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller
+ 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller
+ 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller
+ 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric
+ 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller
+ 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch
+ 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller
+ 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch
+ 5695 BCM5695 12-port + HiGig Multi-Layer Gigabit Ethernet Switch
+ 5698 BCM5698 12-port Multi-Layer Gigabit Ethernet Switch
+ 5820 BCM5820 Crypto Accelerator
+ 5821 BCM5821 Crypto Accelerator
+ 5822 BCM5822 Crypto Accelerator
+ 5823 BCM5823 Crypto Accelerator
+ 5824 BCM5824 Crypto Accelerator
+ 5840 BCM5840 Crypto Accelerator
+ 5841 BCM5841 Crypto Accelerator
+ 5850 BCM5850 Crypto Accelerator
+ b800 BCM56800 StrataXGS 10GE Switch Controller
+14e5 Pixelfusion Ltd
+14e6 SHINING Technology Inc
+14e7 3CX
+14e8 RAYCER Inc
+14e9 GARNETS System CO Ltd
+14ea Planex Communications, Inc
+ ab06 FNW-3603-TX CardBus Fast Ethernet
+ ab07 RTL81xx RealTek Ethernet
+ ab08 FNW-3602-TX CardBus Fast Ethernet
+14eb SEIKO EPSON Corp
+14ec ACQIRIS
+14ed DATAKINETICS Ltd
+14ee MASPRO KENKOH Corp
+14ef CARRY Computer ENG. CO Ltd
+14f0 CANON RESEACH CENTRE FRANCE
+14f1 Conexant Systems, Inc.
+ 1002 HCF 56k Modem
+ 1003 HCF 56k Modem
+ 1004 HCF 56k Modem
+ 1005 HCF 56k Modem
+ 1006 HCF 56k Modem
+ 1022 HCF 56k Modem
+ 1023 HCF 56k Modem
+ 1024 HCF 56k Modem
+ 1025 HCF 56k Modem
+ 1026 HCF 56k Modem
+ 1032 HCF 56k Modem
+ 1033 HCF 56k Data/Fax Modem
+ 1033 8077 NEC
+ 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem
+ 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem
+ 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem
+ 13e0 020d Dell Copper
+ 13e0 020e Dell Silver
+ 13e0 0261 IBM
+ 13e0 0290 Compaq Goldwing
+ 13e0 02a0 IBM
+ 13e0 02b0 IBM
+ 13e0 02c0 Compaq Scooter
+ 13e0 02d0 IBM
+ 144f 1500 IBM P85-DF (1)
+ 144f 1501 IBM P85-DF (2)
+ 144f 150a IBM P85-DF (3)
+ 144f 150b IBM P85-DF Low Profile (1)
+ 144f 1510 IBM P85-DF Low Profile (2)
+ 1034 HCF 56k Data/Fax/Voice Modem
+ 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 10cf 1098 Fujitsu P85-DFSV
+ 1036 HCF 56k Data/Fax/Voice/Spkp Modem
+ 104d 8067 HCF 56k Modem
+ 122d 4029 MDP3880SP-W
+ 122d 4031 MDP3880SP-U
+ 13e0 0209 Dell Titanium
+ 13e0 020a Dell Graphite
+ 13e0 0260 Gateway Red Owl
+ 13e0 0270 Gateway White Horse
+ 1052 HCF 56k Data/Fax Modem (Worldwide)
+ 1053 HCF 56k Data/Fax Modem (Worldwide)
+ 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)
+ 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)
+ 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
+ 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
+ 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)
+ 1063 HCF 56k Data/Fax Modem
+ 1064 HCF 56k Data/Fax/Voice Modem
+ 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1066 HCF 56k Data/Fax/Voice/Spkp Modem
+ 122d 4033 Dell Athena - MDP3900V-U
+ 1085 HCF V90 56k Data/Fax/Voice/Spkp PCI Modem
+ 10b6 CX06834-11 HCF V.92 56k Data/Fax/Voice/Spkp Modem
+ 1433 HCF 56k Data/Fax Modem
+ 1434 HCF 56k Data/Fax/Voice Modem
+ 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1436 HCF 56k Data/Fax Modem
+ 1453 HCF 56k Data/Fax Modem
+ 13e0 0240 IBM
+ 13e0 0250 IBM
+ 144f 1502 IBM P95-DF (1)
+ 144f 1503 IBM P95-DF (2)
+ 1454 HCF 56k Data/Fax/Voice Modem
+ 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 1456 HCF 56k Data/Fax/Voice/Spkp Modem
+ 122d 4035 Dell Europa - MDP3900V-W
+ 122d 4302 Dell MP3930V-W(C) MiniPCI
+ 1610 ADSL AccessRunner PCI Arbitration Device
+ 1611 AccessRunner PCI ADSL Interface Device
+ 1620 AccessRunner V2 PCI ADSL Arbitration Device
+ 1621 AccessRunner V2 PCI ADSL Interface Device
+ 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter
+ 1803 HCF 56k Modem
+ 0e11 0023 623-LAN Grizzly
+ 0e11 0043 623-LAN Yogi
+ 1811 MiniPCI Network Adapter
+ 1815 HCF 56k Modem
+ 0e11 0022 Grizzly
+ 0e11 0042 Yogi
+ 2003 HSF 56k Data/Fax Modem
+ 2004 HSF 56k Data/Fax/Voice Modem
+ 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 2006 HSF 56k Data/Fax/Voice/Spkp Modem
+ 2013 HSF 56k Data/Fax Modem
+ 0e11 b195 Bear
+ 0e11 b196 Seminole 1
+ 0e11 b1be Seminole 2
+ 1025 8013 Acer
+ 1033 809d NEC
+ 1033 80bc NEC
+ 155d 6793 HP
+ 155d 8850 E Machines
+ 2014 HSF 56k Data/Fax/Voice Modem
+ 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+ 2016 HSF 56k Data/Fax/Voice/Spkp Modem
+ 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)
+ 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)
+ 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)
+ 14f1 2045 Generic SoftK56
+ 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)
+ 2063 HSF 56k Data/Fax Modem (SmartDAA)
+ 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)
+ 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)
+ 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)
+ 2093 HSF 56k Modem
+ 155d 2f07 Legend
+ 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)
+ 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)
+ 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)
+ 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)
+ 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)
+ 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)
+ 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)
+ 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)
+ 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)
+ 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)
+ 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)
+ 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)
+ 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)
+ 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)
+ 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
+ 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
+ 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
+ 104d 8075 Modem
+ 104d 8083 Modem
+ 104d 8097 Modem
+ 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
+ 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
+ 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
+ 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)
+ 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)
+ 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)
+ 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)
+ 2bfa D110 HDAudio Soft Data Fax Modem with SmartCP
+ 1025 0009 Aspire 5622WLMi
+ 2f00 HSF 56k HSFi Modem
+ 13e0 8d84 IBM HSFi V.90
+ 13e0 8d85 Compaq Stinger
+ 14f1 2004 Dynalink 56PMi
+ 2f02 HSF 56k HSFi Data/Fax
+ 2f11 HSF 56k HSFi Modem
+ 2f20 HSF 56k Data/Fax Modem
+ 14f1 200c Soft Data Fax Modem with SmartCP
+ 14f1 200f Dimension 3000
+ 2f30 SoftV92 SpeakerPhone SoftRing Modem with SmartSP
+ 14f1 2014 Devolo MikroLink 56K Modem PCI
+ 2f50 Conexant SoftK56 Data/Fax Modem
+ 5045 CX20549 (Venice)
+ 5047 High Definition Audio [Waikiki]
+ 5051 High Definition Audio (HERMOSA)
+ 5b7a CX23418 Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder
+ 0070 7444 WinTV HVR-1600
+ 5854 3343 GoTView PCI DVD3 Hybrid
+ 8200 CX25850
+ 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]
+ 8800 CX23880/1/2/3 PCI Video and Audio Decoder
+ 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models
+ 0070 3401 Hauppauge WinTV 34xxx models
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 7801 WinTV HVR-1800 MCE
+ 0070 9001 Nova-T DVB-T
+ 0070 9200 Nova-SE2 DVB-S
+ 0070 9202 Nova-S-Plus DVB-S
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 0070 9600 WinTV 88x Video
+ 0070 9802 WinTV-HVR1100 DVB-T/Hybrid (Low Profile)
+ 1002 00f8 ATI TV Wonder Pro
+ 1002 a101 HDTV Wonder
+ 1043 4823 ASUS PVR-416
+ 107d 6611 Winfast TV 2000XP Expert
+ 107d 6613 Leadtek Winfast 2000XP Expert
+ 107d 6620 Leadtek Winfast DV2000
+ 107d 663c Leadtek PVR 2000
+ 107d 665f WinFast DTV1000-T
+ 10fc d003 IODATA GV-VCP3/PCI
+ 10fc d035 IODATA GV/BCTV7E
+ 1421 0334 Instant TV DVB-T PCI
+ 1461 000a AVerTV 303 (M126)
+ 1461 000b AverTV Studio 303 (M126)
+ 1461 8011 UltraTV Media Center PCI 550
+ 1462 8606 MSI TV-@nywhere Master
+ 14c7 0107 GDI Black Gold
+ 14f1 0187 Conexant DVB-T reference design
+ 14f1 0342 Digital-Logic MICROSPACE Entertainment Center (MEC)
+ 153b 1166 Cinergy 1400 DVB-T
+ 1540 2580 Provideo PV259
+ 1554 4811 PixelView
+ 1554 4813 Club 3D ZAP1000 MCE Edition
+ 17de 08a1 KWorld/VStream XPert DVB-T with cx22702
+ 17de 08a6 KWorld/VStream XPert DVB-T
+ 17de 08b2 KWorld DVB-S 100
+ 17de a8a6 digitalnow DNTV Live! DVB-T
+ 1822 0025 digitalnow DNTV Live! DVB-T Pro
+ 185b e000 VideoMate X500
+ 18ac d500 FusionHDTV 5 Gold
+ 18ac d810 FusionHDTV 3 Gold-Q
+ 18ac d820 FusionHDTV 3 Gold-T
+ 18ac db00 FusionHDTV DVB-T1
+ 18ac db11 FusionHDTV DVB-T Plus
+ 18ac db50 FusionHDTV DVB-T Dual Digital
+ 5654 2388 GoTView PCI Hybrid TV Tuner Card
+ 7063 3000 pcHDTV HD3000 HDTV
+ 7063 5500 pcHDTV HD-5500
+ 8801 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]
+ 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models
+ 185b e000 VideoMate X500
+ 5654 2388 GoTView PCI Hybrid Audio AVStream Device
+ 7063 5500 pcHDTV HD-5500
+ 8802 CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port]
+ 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 9002 Nova-T DVB-T Model 909
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 0070 9600 WinTV 88x MPEG Encoder
+ 1043 4823 ASUS PVR-416
+ 107d 663c Leadtek PVR 2000
+ 107d 665f WinFast DTV1000-T
+ 14f1 0187 Conexant DVB-T reference design
+ 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Transport Stream Capture
+ 17de 08a6 KWorld/VStream XPert DVB-T
+ 18ac d500 DViCO FusionHDTV5 Gold
+ 18ac d810 DViCO FusionHDTV3 Gold-Q
+ 18ac d820 DViCO FusionHDTV3 Gold-T
+ 18ac db00 DVICO FusionHDTV DVB-T1
+ 18ac db10 DVICO FusionHDTV DVB-T Plus
+ 5654 2388 GoTView PCI Hybrid TS Capture Device
+ 7063 3000 pcHDTV HD3000 HDTV
+ 7063 5500 pcHDTV HD-5500
+ 8804 CX23880/1/2/3 PCI Video and Audio Decoder [IR Port]
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 9002 Nova-T DVB-T Model 909
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 7063 5500 pcHDTV HD-5500
+ 8811 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]
+ 0070 3401 Hauppauge WinTV 34xxx models
+ 0070 6902 WinTV HVR-4000-HD
+ 0070 9402 WinTV-HVR1100 DVB-T/Hybrid
+ 0070 9600 WinTV 88x Audio
+ 1462 8606 MSI TV-@nywhere Master
+ 18ac d500 DViCO FusionHDTV5 Gold
+ 18ac d810 DViCO FusionHDTV3 Gold-Q
+ 18ac d820 DViCO FusionHDTV3 Gold-T
+ 18ac db00 DVICO FusionHDTV DVB-T1
+ 5654 2388 GoTView PCI Hybrid Audio Capture Device
+ 8852 CX23885 PCI Video and Audio Decoder
+ 0070 8010 Hauppauge WinTV HVR-1400 ExpressCard
+ 1461 c039 AVerTV Hybrid Express (A577)
+ 18ac db78 FusionHDTV DVB-T Dual Express
+ 8880 CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb
+ 0070 c108 WinTV-HVR-4400-HD model 1278
+ 5654 2389 GoTView X5 DVD Hybrid PCI-E
+ 5654 2390 GoTView X5 3D HYBRID PCI-E
+14f2 MOBILITY Electronics
+ 0120 EV1000 bridge
+ 0121 EV1000 Parallel port
+ 0122 EV1000 Serial port
+ 0123 EV1000 Keyboard controller
+ 0124 EV1000 Mouse controller
+14f3 BroadLogic
+ 2030 2030 DVB-S Satellite Receiver
+ 2035 2035 DVB-S Satellite Receiver
+ 2050 2050 DVB-T Terrestrial (Cable) Receiver
+ 2060 2060 ATSC Terrestrial (Cable) Receiver
+14f4 TOKYO Electronic Industry CO Ltd
+14f5 SOPAC Ltd
+14f6 COYOTE Technologies LLC
+14f7 WOLF Technology Inc
+14f8 AUDIOCODES Inc
+ 2077 TP-240 dual span E1 VoIP PCI card
+14f9 AG COMMUNICATIONS
+14fa WANDEL & GOLTERMANN
+14fb TRANSAS MARINE (UK) Ltd
+14fc Quadrics Ltd
+ 0000 QsNet Elan3 Network Adapter
+ 0001 QsNetII Elan4 Network Adapter
+ 0002 QsNetIII Elan5 Network Adapter
+14fd JAPAN Computer Industry Inc
+14fe ARCHTEK TELECOM Corp
+14ff TWINHEAD INTERNATIONAL Corp
+1500 DELTA Electronics, Inc
+ 1360 RTL81xx RealTek Ethernet
+1501 BANKSOFT CANADA Ltd
+1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd
+1503 KAWASAKI LSI USA Inc
+1504 KAISER Electronics
+1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH
+1506 CHAMELEON Systems Inc
+# Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057).
+1507 Motorola ?? / HTEC
+ 0001 MPC105 [Eagle]
+ 0002 MPC106 [Grackle]
+ 0003 MPC8240 [Kahlua]
+ 0100 MC145575 [HFC-PCI]
+ 0431 KTI829c 100VG
+ 4801 Raven
+ 4802 Falcon
+ 4803 Hawk
+ 4806 CPX8216
+1508 HONDA CONNECTORS/MHOTRONICS Inc
+1509 FIRST INTERNATIONAL Computer Inc
+150a FORVUS RESEARCH Inc
+150b YAMASHITA Systems Corp
+150c KYOPAL CO Ltd
+150d WARPSPPED Inc
+150e C-PORT Corp
+150f INTEC GmbH
+1510 BEHAVIOR TECH Computer Corp
+1511 CENTILLIUM Technology Corp
+1512 ROSUN Technologies Inc
+1513 Raychem
+1514 TFL LAN Inc
+1515 Advent design
+1516 MYSON Technology Inc
+ 0800 MTD-8xx 100/10M Ethernet PCI Adapter
+ 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+ 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+ 0891 MTD-8xx 100/10M Ethernet PCI Adapter
+1517 ECHOTEK Corp
+# nee PEP MODULAR Computers GmbH
+1518 Kontron Modular Computers GmbH
+1519 TELEFON AKTIEBOLAGET LM Ericsson
+151a Globetek
+ 1002 PCI-1002
+ 1004 PCI-1004
+ 1008 PCI-1008
+151b COMBOX Ltd
+151c DIGITAL AUDIO LABS Inc
+ 0003 Prodif T 2496
+ 4000 Prodif 88
+151d Fujitsu Computer Products Of America
+151e MATRIX Corp
+151f TOPIC SEMICONDUCTOR Corp
+ 0000 TP560 Data/Fax/Voice 56k modem
+1520 CHAPLET System Inc
+1521 BELL Corp
+1522 MainPine Ltd
+ 0100 PCI <-> IOBus Bridge
+ 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem
+ 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem
+ 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem
+ 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+ 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+ 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+ 1522 2000 RockForceD1 1 Port V.90 Data Modem
+ 1522 2100 RockForceF1 1 Port V.34 Super-G3 Fax Modem
+ 1522 2200 RockForceD2 2 Port V.90 Data Modem
+ 1522 2300 RockForceF2 2 Port V.34 Super-G3 Fax Modem
+ 1522 2400 RockForceD4 4 Port V.90 Data Modem
+ 1522 2500 RockForceF4 4 Port V.34 Super-G3 Fax Modem
+ 1522 2600 RockForceD8 8 Port V.90 Data Modem
+ 1522 2700 RockForceF8 8 Port V.34 Super-G3 Fax Modem
+ 1522 3000 IQ Express D1 - 1 Port V.92 Data Modem
+ 1522 3100 IQ Express F1 - 1 Port V.34 Super-G3 Fax Modem
+ 1522 3200 IQ Express D2 - 2 Port V.92 Data Modem
+ 1522 3300 IQ Express F2 - 2 Port V.34 Super-G3 Fax Modem
+ 1522 3400 IQ Express D4 - 4 Port V.92 Data Modem
+ 1522 3500 IQ Express F4 - 4 Port V.34 Super-G3 Fax Modem
+ 1522 3c00 IQ Express D8 - 8 Port V.92 Data Modem
+ 1522 3d00 IQ Express F8 - 8 Port V.34 Super-G3 Fax Modem
+ 4000 PCI Express UART
+ 1522 4001 IQ Express 1-port V.34 Super-G3 Fax
+ 1522 4002 IQ Express 2-port V.34 Super-G3 Fax
+ 1522 4004 IQ Express 4-port V.34 Super-G3 Fax
+ 1522 4008 IQ Express 8-port V.34 Super-G3 Fax
+ 1522 4100 IQ Express SideBand
+1523 MUSIC Semiconductors
+1524 ENE Technology Inc
+ 0510 CB710 Memory Card Reader Controller
+ 103c 006a NX9500
+ 0520 FLASH memory: ENE Technology Inc:
+ 0530 ENE PCI Memory Stick Card Reader Controller
+ 0550 ENE PCI Secure Digital Card Reader Controller
+ 0551 SD/MMC Card Reader Controller
+ 0610 PCI Smart Card Reader Controller
+ 0720 Memory Stick Card Reader Controller
+ 0730 ENE PCI Memory Stick Card Reader Controller
+ 0750 ENE PCI SmartMedia / xD Card Reader Controller
+ 0751 ENE PCI Secure Digital / MMC Card Reader Controller
+ 1211 CB1211 Cardbus Controller
+ 1225 CB1225 Cardbus Controller
+ 1410 CB1410 Cardbus Controller
+ 1025 003c CL50 motherboard
+ 1025 005a TravelMate 290
+ 1411 CB-710/2/4 Cardbus Controller
+ 103c 006a NX9500
+ 1412 CB-712/4 Cardbus Controller
+ 1420 CB1420 Cardbus Controller
+ 1421 CB-720/2/4 Cardbus Controller
+ 1422 CB-722/4 Cardbus Controller
+1525 IMPACT Technologies
+1526 ISS, Inc
+1527 SOLECTRON
+1528 ACKSYS
+1529 AMERICAN MICROSystems Inc
+152a QUICKTURN DESIGN Systems
+152b FLYTECH Technology CO Ltd
+152c MACRAIGOR Systems LLC
+152d QUANTA Computer Inc
+152e MELEC Inc
+152f PHILIPS - CRYPTO
+1530 ACQIS Technology Inc
+1531 CHRYON Corp
+1532 ECHELON Corp
+ 0020 LonWorks PCLTA-20 PCI LonTalk Adapter
+1533 BALTIMORE
+1534 ROAD Corp
+1535 EVERGREEN Technologies Inc
+1536 ACTIS Computer
+1537 DATALEX COMMUNCATIONS
+1538 ARALION Inc
+ 0303 ARS106S Ultra ATA 133/100/66 Host Controller
+1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A.
+153a ONO SOKKI
+153b TERRATEC Electronic GmbH
+ 1144 Aureon 5.1
+# Terratec seems to use several IDs for the same card.
+ 1147 Aureon 5.1 Sky
+ 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV]
+153c ANTAL Electronic
+153d FILANET Corp
+153e TECHWELL Inc
+153f MIPS Technologies, Inc.
+ 0001 SOC-it 101 System Controller
+1540 PROVIDEO MULTIMEDIA Co Ltd
+1541 MACHONE Communications
+1542 Concurrent Computer Corporation
+ 9260 RCIM-II Real-Time Clock & Interrupt Module
+1543 SILICON Laboratories
+ 3052 Intel 537 [Winmodem]
+ 3155 Motorola SM56 Speakerphone Modem
+ 4c22 Si3036 MC'97 DAA
+1544 DCM DATA Systems
+1545 VISIONTEK
+1546 IOI Technology Corp
+1547 MITUTOYO Corp
+1548 JET PROPULSION Laboratory
+1549 INTERCONNECT Systems Solutions
+154a MAX Technologies Inc
+154b COMPUTEX Co Ltd
+154c VISUAL Technology Inc
+154d PAN INTERNATIONAL Industrial Corp
+154e SERVOTEST Ltd
+154f STRATABEAM Technology
+1550 OPEN NETWORK Co Ltd
+1551 SMART Electronic DEVELOPMENT GmBH
+1552 RACAL AIRTECH Ltd
+1553 CHICONY Electronics Co Ltd
+1554 PROLINK Microsystems Corp
+1555 GESYTEC GmBH
+1556 PLD APPLICATIONS
+1557 MEDIASTAR Co Ltd
+1558 CLEVO/KAPOK Computer
+1559 SI LOGIC Ltd
+155a INNOMEDIA Inc
+155b PROTAC INTERNATIONAL Corp
+155c Cemax-Icon Inc
+155d Mac System Co Ltd
+155e LP Elektronik GmbH
+155f Perle Systems Ltd
+1560 Terayon Communications Systems
+1561 Viewgraphics Inc
+1562 Symbol Technologies
+1563 A-Trend Technology Co Ltd
+1564 Yamakatsu Electronics Industry Co Ltd
+1565 Biostar Microtech Int'l Corp
+1566 Ardent Technologies Inc
+1567 Jungsoft
+1568 DDK Electronics Inc
+1569 Palit Microsystems Inc.
+156a Avtec Systems
+156b 2wire Inc
+156c Vidac Electronics GmbH
+156d Alpha-Top Corp
+156e Alfa Inc
+156f M-Systems Flash Disk Pioneers Ltd
+1570 Lecroy Corp
+1571 Contemporary Controls
+ a001 CCSI PCI20-485 ARCnet
+ a002 CCSI PCI20-485D ARCnet
+ a003 CCSI PCI20-485X ARCnet
+ a004 CCSI PCI20-CXB ARCnet
+ a005 CCSI PCI20-CXS ARCnet
+ a006 CCSI PCI20-FOG-SMA ARCnet
+ a007 CCSI PCI20-FOG-ST ARCnet
+ a008 CCSI PCI20-TB5 ARCnet
+ a009 CCSI PCI20-5-485 5Mbit ARCnet
+ a00a CCSI PCI20-5-485D 5Mbit ARCnet
+ a00b CCSI PCI20-5-485X 5Mbit ARCnet
+ a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet
+ a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet
+ a201 CCSI PCI22-485 10Mbit ARCnet
+ a202 CCSI PCI22-485D 10Mbit ARCnet
+ a203 CCSI PCI22-485X 10Mbit ARCnet
+ a204 CCSI PCI22-CHB 10Mbit ARCnet
+ a205 CCSI PCI22-FOG_ST 10Mbit ARCnet
+ a206 CCSI PCI22-THB 10Mbit ARCnet
+1572 Otis Elevator Company
+1573 Lattice - Vantis
+1574 Fairchild Semiconductor
+1575 Voltaire Advanced Data Security Ltd
+1576 Viewcast COM
+1578 HITT
+ 4d34 VPMK4 [Video Processor Mk IV]
+ 5615 VPMK3 [Video Processor Mk III]
+1579 Dual Technology Corp
+157a Japan Elecronics Ind Inc
+157b Star Multimedia Corp
+157c Eurosoft (UK)
+ 8001 Fix2000 PCI Y2K Compliance Card
+157d Gemflex Networks
+157e Transition Networks
+157f PX Instruments Technology Ltd
+1580 Primex Aerospace Co
+1581 SEH Computertechnik GmbH
+1582 Cytec Corp
+1583 Inet Technologies Inc
+1584 Uniwill Computer Corp
+1585 Logitron
+1586 Lancast Inc
+1587 Konica Corp
+1588 Solidum Systems Corp
+1589 Atlantek Microsystems Pty Ltd
+ 0008 Leutron Vision PicPortExpress CL
+ 0009 Leutron Vision PicPortExpress CL Stereo
+158a Digalog Systems Inc
+158b Allied Data Technologies
+158c Hitachi Semiconductor & Devices Sales Co Ltd
+158d Point Multimedia Systems
+158e Lara Technology Inc
+158f Ditect Coop
+1590 3PAR Inc.
+ 0001 Eagle Cluster Manager
+ 0002 Osprey Cluster Manager
+ 0003 Harrier Cluster Manager
+ a01d FC044X Fibre Channel HBA
+1591 ARN
+1592 Syba Tech Ltd
+ 0781 Multi-IO Card
+ 0782 Parallel Port Card 2xEPP
+ 0783 Multi-IO Card
+ 0785 Multi-IO Card
+ 0786 Multi-IO Card
+ 0787 Multi-IO Card
+ 0788 Multi-IO Card
+ 078a Multi-IO Card
+1593 Bops Inc
+1594 Netgame Ltd
+1595 Diva Systems Corp
+1596 Folsom Research Inc
+1597 Memec Design Services
+1598 Granite Microsystems
+1599 Delta Electronics Inc
+159a General Instrument
+159b Faraday Technology Corp
+159c Stratus Computer Systems
+159d Ningbo Harrison Electronics Co Ltd
+159e A-Max Technology Co Ltd
+159f Galea Network Security
+15a0 Compumaster SRL
+15a1 Geocast Network Systems
+15a2 Catalyst Enterprises Inc
+ 0001 TA700 PCI Bus Analyzer/Exerciser
+15a3 Italtel
+15a4 X-Net OY
+15a5 Toyota Macs Inc
+15a6 Sunlight Ultrasound Technologies Ltd
+15a7 SSE Telecom Inc
+15a8 Shanghai Communications Technologies Center
+15aa Moreton Bay
+15ab Bluesteel Networks Inc
+15ac North Atlantic Instruments
+15ad VMware
+ 0405 SVGA II Adapter
+ 0710 SVGA Adapter
+ 0720 VMXNET Ethernet Controller
+ 0740 Virtual Machine Communication Interface
+ 0770 USB2 EHCI Controller
+ 0774 USB1.1 UHCI Controller
+ 0790 PCI bridge
+ 07a0 PCI Express Root Port
+ 07b0 VMXNET3 Ethernet Controller
+ 07c0 PVSCSI SCSI Controller
+ 0801 Virtual Machine Interface
+ 15ad 0800 Hypervisor ROM Interface
+15ae Amersham Pharmacia Biotech
+15b0 Zoltrix International Ltd
+15b1 Source Technology Inc
+15b2 Mosaid Technologies Inc
+15b3 Mellanox Technologies
+ 0191 MT25408 [ConnectX IB Flash Recovery]
+ 01f5 MT27500 Family [ConnectX-3 Flash Recovery]
+ 1002 MT25400 Family [ConnectX-2 Virtual Function]
+ 1003 MT27500 Family [ConnectX-3]
+ 1004 MT27500 Family [ConnectX-3 Virtual Function]
+ 1005 MT27510 Family
+ 1006 MT27511 Family
+ 1007 MT27520 Family
+ 1008 MT27521 Family
+ 1009 MT27530 Family
+ 100a MT27531 Family
+ 100b MT27540 Family
+ 100c MT27541 Family
+ 100d MT27550 Family
+ 100e MT27551 Family
+ 100f MT27560 Family
+ 1010 MT27561 Family
+ 5274 MT21108 InfiniBridge
+ 5a44 MT23108 InfiniHost
+ 5a45 MT23108 [Infinihost HCA Flash Recovery]
+ 5a46 MT23108 PCI Bridge
+ 5e8c MT24204 [InfiniHost III Lx HCA]
+ 5e8d MT25204 [InfiniHost III Lx HCA Flash Recovery]
+ 6274 MT25204 [InfiniHost III Lx HCA]
+ 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
+ 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery]
+ 6282 MT25208 [InfiniHost III Ex]
+ 6340 MT25408 [ConnectX VPI - IB SDR / 10GigE]
+ 634a MT25418 [ConnectX VPI PCIe 2.0 2.5GT/s - IB DDR / 10GigE]
+ 6368 MT25448 [ConnectX EN 10GigE, PCIe 2.0 2.5GT/s]
+ 6372 MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe 2.0 2.5GT/s]
+ 6732 MT26418 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE]
+ 673c MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE]
+ 6746 MT26438 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE Virtualization+]
+ 103c 1781 NC543i 1-port 4x QDR IB/Flex-10 10Gb Adapter
+ 103c 3349 NC543i 2-port 4xQDR IB/10Gb Adapter
+ 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
+ 675a MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s]
+ 6764 MT26468 [ConnectX EN 10GigE, PCIe 2.0 5GT/s Virtualization+]
+ 103c 3313 HP NC542m Dual Port Flex-10 10GbE BLc Adapter
+ 676e MT26478 [ConnectX EN 40GigE, PCIe 2.0 5GT/s]
+ 6778 MT26488 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE Virtualization+]
+15b4 CCI/TRIAD
+15b5 Cimetrics Inc
+15b6 Texas Memory Systems Inc
+ 0001 XP15 DSP Accelerator
+ 0002 XP30 DSP Accelerator
+ 0003 XP00 Data Acquisition Device
+ 0004 XP35 DSP Accelerator
+ 0007 XP100 DSP Accelerator [XP100-T0]
+ 0008 XP100 DSP Accelerator [XP100-T1]
+ 0009 XP100 DSP Accelerator [XP100-E0]
+ 000a XP100 DSP Accelerator [XP100-E1]
+ 000e XP100 DSP Accelerator [XP100-0]
+ 000f XP100 DSP Accelerator [XP100-1]
+ 0010 XP100 DSP Accelerator [XP100-P0]
+ 0011 XP100 DSP Accelerator [XP100-P1]
+ 0012 XP100 DSP Accelerator [XP100-P2]
+ 0013 XP100 DSP Accelerator [XP100-P3]
+ 0014 RamSan Flash SSD
+ 0015 ZBox
+15b7 Sandisk Corp
+15b8 ADDI-DATA GmbH
+ 1001 APCI1516 SP controller (16 digi outputs)
+ 1003 APCI1032 SP controller (32 digi inputs w/ opto coupler)
+ 1004 APCI2032 SP controller (32 digi outputs)
+ 1005 APCI2200 SP controller (8/16 digi outputs (relay))
+ 1006 APCI1564 SP controller (32 digi ins, 32 digi outs)
+ 100a APCI1696 SP controller (96 TTL I/Os)
+ 3001 APCI3501 SP controller (analog output board)
+ 300f APCI3600 Noise and vibration measurement board
+ 7001 APCI7420 2-port Serial Controller
+ 7002 APCI7300 Serial Controller
+15b9 Maestro Digital Communications
+15ba Impacct Technology Corp
+15bb Portwell Inc
+15bc Agilent Technologies
+ 0103 QX4 PCI Express quad 4-gigabit Fibre Channel controller
+ 0105 Celerity FC-42XS Fibre Channel Adapter
+ 117c 0022 Celerity FC-42XS Fibre Channel Adapter
+ 1100 E8001-66442 PCI Express CIC
+ 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker
+ 2928 64 Bit, 66MHz PCI Exerciser & Analyzer
+ 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser
+15bd DFI Inc
+15be Sola Electronics
+15bf High Tech Computer Corp (HTC)
+15c0 BVM Ltd
+15c1 Quantel
+15c2 Newer Technology Inc
+15c3 Taiwan Mycomp Co Ltd
+15c4 EVSX Inc
+15c5 Procomp Informatics Ltd
+ 8010 1394b - 1394 Firewire 3-Port Host Adapter Card
+15c6 Technical University of Budapest
+15c7 Tateyama System Laboratory Co Ltd
+ 0349 Tateyama C-PCI PLC/NC card Rev.01A
+15c8 Penta Media Co Ltd
+15c9 Serome Technology Inc
+15ca Bitboys OY
+15cb AG Electronics Ltd
+15cc Hotrail Inc
+15cd Dreamtech Co Ltd
+15ce Genrad Inc
+15cf Hilscher GmbH
+15d1 Infineon Technologies AG
+15d2 FIC (First International Computer Inc)
+15d3 NDS Technologies Israel Ltd
+15d4 Iwill Corp
+15d5 Tatung Co
+15d6 Entridia Corp
+15d7 Rockwell-Collins Inc
+15d8 Cybernetics Technology Co Ltd
+15d9 Super Micro Computer Inc
+15da Cyberfirm Inc
+15db Applied Computing Systems Inc
+15dc Litronic Inc
+ 0001 Argus 300 PCI Cryptography Module
+15dd Sigmatel Inc
+15de Malleable Technologies Inc
+15df Infinilink Corp
+15e0 Cacheflow Inc
+15e1 Voice Technologies Group Inc
+15e2 Quicknet Technologies Inc
+ 0500 PhoneJack-PCI
+15e3 Networth Technologies Inc
+15e4 VSN Systemen BV
+15e5 Valley technologies Inc
+15e6 Agere Inc
+15e7 Get Engineering Corp
+15e8 National Datacomm Corp
+ 0130 Wireless PCI Card
+ 0131 NCP130A2 Wireless NIC
+15e9 Pacific Digital Corp
+ 1841 ADMA-100 DiscStaQ ATA Controller
+15ea Tokyo Denshi Sekei K.K.
+15eb DResearch Digital Media Systems GmbH
+15ec Beckhoff GmbH
+ 3101 FC3101 Profibus DP 1 Channel PCI
+ 5102 FC5102
+15ed Macrolink Inc
+15ee In Win Development Inc
+15ef Intelligent Paradigm Inc
+15f0 B-Tree Systems Inc
+15f1 Times N Systems Inc
+15f2 Diagnostic Instruments Inc
+15f3 Digitmedia Corp
+15f4 Valuesoft
+15f5 Power Micro Research
+15f6 Extreme Packet Device Inc
+15f7 Banctec
+15f8 Koga Electronics Co
+15f9 Zenith Electronics Corp
+15fa J.P. Axzam Corp
+15fb Zilog Inc
+15fc Techsan Electronics Co Ltd
+15fd N-CUBED.NET
+15fe Kinpo Electronics Inc
+15ff Fastpoint Technologies Inc
+1600 Northrop Grumman - Canada Ltd
+1601 Tenta Technology
+1602 Prosys-tec Inc
+1603 Nokia Wireless Communications
+1604 Central System Research Co Ltd
+1605 Pairgain Technologies
+1606 Europop AG
+1607 Lava Semiconductor Manufacturing Inc
+1608 Automated Wagering International
+1609 Scimetric Instruments Inc
+1612 Telesynergy Research Inc.
+1618 Stone Ridge Technology
+ 0001 RDX 11
+ 0002 HFT-01
+ 0400 FarSync T2P (2 port X.21/V.35/V.24)
+ 0440 FarSync T4P (4 port X.21/V.35/V.24)
+ 0610 FarSync T1U (1 port X.21/V.35/V.24)
+ 0620 FarSync T2U (2 port X.21/V.35/V.24)
+ 0640 FarSync T4U (4 port X.21/V.35/V.24)
+ 1610 FarSync TE1 (T1,E1)
+ 2610 FarSync DSL-S1 (SHDSL)
+ 3640 FarSync T4E (4-port X.21/V.35/V.24)
+ 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24)
+ 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24)
+1619 FarSite Communications Ltd
+ 0400 FarSync T2P (2 port X.21/V.35/V.24)
+ 0440 FarSync T4P (4 port X.21/V.35/V.24)
+ 0610 FarSync T1U (1 port X.21/V.35/V.24)
+ 0620 FarSync T2U (2 port X.21/V.35/V.24)
+ 0640 FarSync T4U (4 port X.21/V.35/V.24)
+ 1610 FarSync TE1 (T1,E1)
+ 2610 FarSync DSL-S1 (SHDSL)
+ 3640 FarSync T4E (4-port X.21/V.35/V.24)
+ 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24)
+ 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24)
+161f Rioworks
+1626 TDK Semiconductor Corp.
+ 8410 RTL81xx Fast Ethernet
+1629 Kongsberg Spacetec AS
+ 1003 Format synchronizer v3.0
+ 1006 Format synchronizer, model 10500
+ 1007 Format synchronizer, model 21000
+ 2002 Fast Universal Data Output
+1631 Packard Bell B.V.
+1638 Standard Microsystems Corp [SMC]
+ 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000
+163c Smart Link Ltd.
+ 3052 SmartLink SmartPCI562 56K Modem
+ 5449 SmartPCI561 Modem
+1641 MKNet Corp.
+1657 Brocade Communications Systems, Inc.
+ 0013 425/825/42B/82B 4Gbps/8Gbps PCIe dual port FC HBA
+ 103c 1742 HP 82B 8Gbps dual port FC HBA
+ 103c 1744 HP 42B 4Gbps dual port FC HBA
+ 1657 0014 425/825 4Gbps/8Gbps PCIe dual port FC HBA
+ 0014 1010/1020/1007 10Gbps CNA
+ 1657 0014 1010/1020/1007 10Gbps CNA - FCOE
+ 1657 0015 1010/1020/1007 10Gbps CNA - LL
+ 0017 415/815/41B/81B 4Gbps/8Gbps PCIe single port FC HBA
+ 103c 1741 HP 41B 4Gbps single port FC HBA
+ 103c 1743 HP 81B 8Gbps single port FC HBA
+ 1657 0014 415/815 4Gbps/8Gbps single port PCIe FC HBA
+ 0021 804/807 8Gbps FC HBA
+ 103c 1779 804 8Gbps FC HBA for HP Bladsystem c-class
+ 1657 0014 8Gbps FC HBA
+# Same Device_ID used for 410 (1port) and 420 (2 port) HBAs.
+ 0646 400 4Gbps PCIe FC HBA
+165a Epix Inc
+ c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232]
+ d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232]
+ d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232]
+165d Hsing Tech. Enterprise Co., Ltd.
+165f Linux Media Labs, LLC
+ 1020 LMLM4 MPEG-4 encoder
+1661 Worldspace Corp.
+1668 Actiontec Electronics Inc
+ 0100 Mini-PCI bridge
+# Formerly SiByte, Inc.
+166d Broadcom Corporation
+ 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI
+ 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport
+ 0012 SiByte BCM1280/BCM1480 System-on-a-Chip PCI-X
+ 0014 Sibyte BCM1280/BCM1480 System-on-a-Chip HyperTransport
+1677 Bernecker + Rainer
+ 104e 5LS172.6 B&R Dual CAN Interface Card
+ 12d7 5LS172.61 B&R Dual CAN Interface Card
+ 20ad 5ACPCI.MFIO-K01 Profibus DP / K-Feldbus / COM
+1678 NetEffect
+ 0100 NE020 10Gb Accelerated Ethernet Adapter (iWARP RNIC)
+1679 Tokyo Electron Device Ltd.
+ 3000 SD Standard host controller [Ellen]
+167b ZyDAS Technology Corp.
+ 2102 ZyDAS ZD1202
+ 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card
+ 187e 3407 ZyAIR B-320 802.11b Wireless PCI Adapter
+ 2116 ZD1212B Wireless Adapter
+167d Samsung Electro-Mechanics Co., Ltd.
+ a000 MagicLAN SWL-2210P 802.11b [Intersil ISL3874]
+167e ONNTO Corp.
+1681 Hercules
+ 0010 Hercules 3d Prophet II Ultra 64MB (350 MHz NV15BR core)
+1682 XFX Pine Group Inc.
+1688 CastleNet Technology Inc.
+ 1170 WLAN 802.11b card
+168c Atheros Communications Inc.
+ 0007 AR5000 802.11a Wireless Adapter
+ 1737 0007 WPC54A Wireless PC Card
+ 1b47 0100 Harmony 8450CN Wireless CardBus Module
+ 1b47 0110 Skyline 4030 / Harmony 8450 802.11a Wireless CardBus Adapter
+ 8086 2501 PRO/Wireless 5000 LAN PCI Adapter Module
+ 0011 AR5210 802.11a NIC
+ 0012 AR5211 802.11ab NIC
+ 126c 8031 2201 Mobile Adapter
+ 1385 4400 WAB501 802.11ab Wireless CardBus Card
+ 1b47 aa00 8460 802.11ab Wireless CardBus Adapter
+ 0013 Atheros AR5001X+ Wireless Network Adapter
+ 0308 3402 AG-100 802.11ag Wireless Cardbus Adapter
+ 0308 3405 G-102 v2 802.11g Wireless Cardbus Adapter
+ 0308 3408 G-170S 802.11g Wireless CardBus Adapter
+ 0e11 00e5 NC6000 laptop
+ 10b7 6002 3CRWE154A72 802.11abg Cardbus Adapter
+ 1113 d301 Philips CPWNA100 Wireless CardBus adapter
+ 1113 ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter
+ 1154 033b Buffalo WLI-CB-AMG54
+ 1154 034e Buffalo WLI-CB-AG108HP 802.11abg Cardbus Adapter
+ 1186 3202 DWL-G650 (Rev B3,B5) Wireless cardbus adapter
+ 1186 3203 AirPlus DWL-G520 Wireless PCI Adapter (rev. A)
+ 1186 3a12 D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
+ 1186 3a13 AirPlus DWL-G520 Wireless PCI Adapter (rev. B)
+ 1186 3a14 AirPremier AG DWL-AG530 Wireless PCI Adapter (rev.A)
+ 1186 3a17 D-Link AirPremier DWL-G680 Wireless Cardbus Adapter
+ 1186 3a18 D-Link AirPremier DWL-G550 Wireless PCI Adapter
+ 1186 3a1a WNA-2330 802.11bg Wireless CardBus Adapter
+ 1186 3a63 D-Link AirPremier DWL-AG660 Wireless Cardbus Adapter
+ 1186 3a93 Conceptronic C54I Wireless 801.11g PCI card
+ 1186 3a94 C54C Wireless 801.11g cardbus
+ 1186 3ab0 Allnet ALL0281 Wireless PCI Card
+ 1385 4900 WG311v1 802.11g Wireless PCI Adapter
+ 1385 4b00 WG511T 108 Mbps Wireless PC Card (rev.A/B)
+ 1385 4d00 WG311T 108 Mbps Wireless PCI Adapter (rev.A2)
+ 1385 4f00 WG511U Double 108 Mbps Wireless PC Card
+ 1385 5a00 WG311T 108 Mbps Wireless PCI Adapter (rev.A3)
+ 1385 5b00 WG511T 108 Mbps Wireless PC Card (rev.C)
+ 1385 5d00 WPN511 RangeMax Wireless PC Card
+ 1458 e911 Gigabyte GN-WIAG02
+ 1468 0403 U10H014 802.11g Cardbus Adapter
+ 1468 0408 ThinkPad 11b/g Wireless LAN Mini PCI Adapter
+ 14b7 0a10 8480-WD 802.11abg Cardbus Adapter
+ 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter
+ 14b7 aa30 8800-FC 802.11bg Cardbus Adapter
+ 14b7 aa40 8470-WD 802.11bg Cardbus Adapter
+ 14b9 cb21 CB21 802.11a/b/g Cardbus Adapter
+ 1668 1026 IBM HighRate 11 a/b/g Wireless CardBus Adapter
+ 168c 0013 AirPlus XtremeG DWL-G650 Wireless PCMCIA Adapter
+ 168c 1025 DWL-G650B2 Wireless CardBus Adapter
+ 168c 1027 Engenius NL-3054CB ARIES b/g CardBus Adapter
+ 168c 1042 Ubiquiti Networks SuperRange a/b/g Cardbus Adapter
+ 168c 1051 EZ Connect g 802.11g 108Mbps Wireless PCI Adapter
+ 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter
+ 168c 2027 D-Link AirPlus DWL-G520 Wireless PCI Adapter (rev. A)
+ 168c 2041 Engenius 5354MP Plus ARIES2 b/g MiniPCI Adapter
+ 168c 2042 Engenius 5354MP Plus ARIES2 a/b/g MiniPCI Adapter
+ 168c 2051 TRENDnet TEW-443PI Wireless PCI Adapter
+ 16a5 160a BWP712 802.11bg Wireless CardBus Adapter
+ 16ab 7302 Trust Speedshare Turbo Pro Wireless PCI Adapter
+ 1737 0017 WPC55AG
+ 1737 0026 WMP55AG v1.1
+ 1737 0035 WPC55AG v1.2 802.11abg Cardbus Adapter
+ 1799 3000 F6D3000 Dual-Band Wireless A+G Desktop Card
+ 1799 3010 F6D3010 Dual-Band Wireless A+G Notebook Card
+ 17cf 0042 Z-COMAX Highpower XG-622H (400mw) 802.11b/g mini-PCI Adapter
+ 185f 1012 CM9 Wireless a/b/g MiniPCI Adapter
+ 185f 2012 Wistron NeWeb WLAN a+b+g model CB9
+ a727 6801 3CRXJK10075 OfficeConnect Wireless 108Mbps 11g XJACK PC Card
+# the name AR5005G is used for the reference design using AR2413
+ 001a AR2413 802.11bg NIC
+ 1052 168c Sweex Wireless Lan PC Card 54Mbps
+ 1113 ee20 SMC Wireless CardBus Adapter 802.11g (SMCWCB-G EU)
+ 1113 ee24 SMC Wireless PCI Card WPCI-G
+ 1186 3a15 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.D1)
+ 1186 3a16 AirPlus G DWL-G510 Wireless PCI Adapter(rev.B)
+ 1186 3a1c WNA-1330 Notebook Adapter
+ 1186 3a1d WDA-1320 Desktop Adapter
+ 1186 3a23 AirPlus G DWL-G520+A Wireless PCI Adapter
+ 1186 3a24 AirPlus G DWL-G650+A Wireless Cardbus Adapter
+ 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.C1)
+ 168c 001a Belkin FD7000
+ 168c 1052 TP-Link TL-WN510G Wireless CardBus Adapter
+ 168c 2052 Compex Wireless 802.11 b/g MiniPCI Adapter, Rev A1 [WLM54G]
+ 16ec 0122 Wireless PCI Adapter Model 5418
+ 1737 0053 WPC54G v7 802.11g Wireless-G Notebook Adapter
+ 1799 700c F5D7000 v5000 Wireless G Desktop Card
+ 1799 701d F5D7010 v5000 Wireless G Notebook Card
+ 17f9 0008 DX-WGNBC 802.11bg Wireless CardBus Adapter
+ 17f9 0018 DX-WGDTC 802.11bg Wireless PCI Adapter
+# the name AR5006X is used for the reference design using AR5413
+ 001b AR5413 802.11abg NIC
+ 0777 3002 XR2 802.11g Wireless Mini PCI Adapter
+ 0777 3005 XR5 802.11a Wireless Mini PCI Adapter
+ 0777 3009 XR9 900MHz Wireless Mini PCI Adapter
+ 1154 034e WLI-CB-AG108HP 802.11abg Wireless CardBus Adapter
+ 1186 3a19 D-Link AirPremier AG DWL-AG660 Wireless Cardbus Adapter
+ 1186 3a22 AirPremier AG DWL-AG530 Wireless PCI Adapter (rev.B)
+ 11ad 5001 WN5301A 802.11bg Wireless PCI Adapter
+ 1458 e901 GN-WI01HT Wireless a/b/g MiniPCI Adapter
+ 168c 001b Wireless LAN PCI LiteOn
+ 168c 1062 IPN-W100CB 802.11abg Wireless CardBus Adapter
+ 168c 2062 EnGenius EMP-8602 (400mw) or Compex WLM54AG (SuperAG)
+ 168c 2063 EnGenius EMP-8602 (400mw) or Compex WLM54AG
+ 17f9 000b WL-711A 802.11abg Wireless CardBus Adapter
+ 17f9 000c WPIA-112AG 802.11abg Wireless PCI Adapter
+ 17f9 000d PC-686X 802.11abg Wireless Mini PCI Adapter
+ 185f 1600 DCMA-82 High Power WLAN 802.11a/b/g mini-PCI Module (Super A/G, eXtended Range, 400mW)
+ 1948 3aba RBTBJ-AW 802.11abg Wireless Cardbus Adapter
+ a727 6804 Wireless 11a/b/g PC Card with XJACK(r) Antenna
+ 001c AR242x / AR542x Wireless Network Adapter (PCI-Express)
+ 0777 3006 SRX 802.11abg Wireless ExpressCard Adapter
+ 103c 137a AR5BXB63 (Foxconn) 802.11bg Mini PCIe NIC
+ 144f 7128 WLL3141 (Toshiba PA3613U-1MPC) 802.11bg Wireless Adapter
+ 1468 0428 AR5BXB63 802.11bg NIC
+ 1468 042a AR5007EG 802.11bg NIC
+ 147b 1033 AirPace Wi-Fi
+ 168c 001c AR242x 802.11abg NIC (PCI Express)
+ 168c 3061 AR5006EGS 802.11bg NIC (2.4GHz, PCI Express)
+ 168c 3062 AR5006EXS 802.11abg NIC (2.4/5.0GHz, PCI Express)
+ 168c 3063 AR5006EX 802.11abg NIC (2.4/5.0GHz, PCI Express)
+ 168c 3065 AR5006EG 802.11bg NIC (2.4GHz, PCI Express)
+ 168c 3067 AR242x 802.11abg Wireless PCI Express Adapter (rev 01)
+ 1a3b 1026 AR5007EG 802.11bg Wi-Fi mini PCI express card
+ 001d AR5007G Wireless Network Adapter
+ 1799 720b F5D7000 v8000 Wireless G Desktop Card
+ 1799 721b F5D7010 v8000 Wireless G Notebook Card
+# the name AR5005VL is used for some AR5513 based designs
+ 0020 AR5513 802.11abg Wireless NIC
+ 0308 3407 M-102 802.11g Wireless Cardbus Adapter
+ 1186 3a67 DWL-G650M Super G MIMO Wireless Notebook Adapter
+ 1186 3a68 DWL-G520M Wireless 108G MIMO Desktop Adapter
+ 187e 340e M-302 802.11g Wireless PCI Adapter
+ 1976 2003 TEW-601PC 802.11g Wireless CardBus Adapter
+ 0023 AR5008 Wireless Network Adapter
+ 0308 340b NWD-170N 802.11bgn Wireless CardBus Adapter
+ 1154 0365 Buffalo WLP-CB-AG300 802.11abgn Cardbus Adapter
+ 1154 0367 WLI-CB-AG301N 802.11abgn Wireless CardBus Adapter
+ 1186 3a6a DWA-642 802.11n RangeBooster N CardBus Adapter
+ 1186 3a6d DWA-552 802.11n Xtreme N Desktop Adapter (rev A1)
+ 1186 3a76 DWA-645 802.11n RangeBooster N 650 Notebook Adapter (rev A1)
+ 1737 0059 WPC300N v2 Wireless-N Notebook Adapter
+ 1737 0069 WPC100 v1 802.11n RangePlus Wireless Notebook Adapter
+ 1799 8011 F5D8011 v1 802.11n N1 Wireless Notebook Card
+ 187e 3411 NWD-370N 802.11n Wireless PCI Adapter
+ 1976 2008 TEW-621PC 802.11bgn Wireless CardBus Adapter
+ 0024 AR5008 Wireless Network Adapter
+ 0027 AR9160 802.11abgn Wireless PCI Adapter
+ 0777 4082 SR71-A 802.11abgn Wireless Mini PCI Adapter
+ 0029 AR922X Wireless Network Adapter
+ 1186 3a7a DWA-552 802.11n Xtreme N Desktop Adapter (rev A2)
+ 002a AR928X Wireless Network Adapter (PCI-Express)
+ 103c 3041 AR5BHB92-H 802.11abgn Wireless Half-size Mini PCIe Card
+ 1a3b 1081 AW-NE773 802.11abgn Wireless Half-size Mini PCIe Card
+ 002b AR9285 Wireless Network Adapter (PCI-Express)
+ 1931 0023 Option GTM67x PCIe WiFi Adapter
+ 002c AR2427 Wireless Network Adapter (PCI-Express)
+ 002d AR9287 Wireless Network Adapter
+ 002e AR9287 Wireless Network Adapter (PCI-Express)
+ 0030 AR9300 Wireless LAN adaptor
+ 0032 AR9485 Wireless Network Adapter
+ 0033 11a/b/g/n Wireless LAN Mini-PCI Express Adapter
+ 0207 AR5210
+ 1014 AR5212 802.11abg NIC
+ 1014 058a ThinkPad 11a/b/g Wireless LAN Mini Express Adapter (AR5BXB6)
+ 9013 AR5001X+ Wireless Network Adapter
+ ff19 AR5006X Wireless Network Adapter
+ ff1c AR5008 Wireless Network Adapter
+ ff1d AR5008 Wireless Network Adapter
+1695 EPoX Computer Co., Ltd.
+169c Netcell Corporation
+ 0044 Revolution Storage Processing Card
+# The right ID is 196d, but they got it nibble-swapped in 2202.
+169d Club-3D VB (Wrong ID)
+ 3306 ZAP TV 2202
+16a5 Tekram Technology Co.,Ltd.
+16ab Global Sun Technology Inc
+ 1100 GL24110P
+ 1101 PLX9052 PCMCIA-to-PCI Wireless LAN
+ 1102 PCMCIA-to-PCI Wireless Network Bridge
+ 8501 WL-8305 Wireless LAN PCI Adapter
+16ae SafeNet Inc
+ 0001 SafeXcel 1140
+ 000a SafeXcel 1841
+ 1141 SafeXcel 1141
+ 1841 SafeXcel 1842
+16af SparkLAN Communications, Inc.
+16b4 Aspex Semiconductor Ltd
+16b8 Sonnet Technologies, Inc.
+16be Creatix Polymedia GmbH
+16c6 Micrel-Kendin
+ 8695 Centaur KS8695 ARM processor
+ 8842 KSZ8842-PMQL 2-Port Ethernet Switch
+16c8 Octasic Inc.
+16c9 EONIC B.V. The Netherlands
+16ca CENATEK Inc
+ 0001 Rocket Drive DL
+16cd Densitron Technologies
+16ce Roland Corp.
+16d5 Acromag, Inc.
+ 0504 PMC-DX504 Reconfigurable FPGA with LVDS I/O
+ 0520 PMC520 Serial Communication, 232 Octal
+ 0521 PMC521 Serial Communication, 422/485 Octal
+ 1020 PMC-AX1020 Reconfigurable FPGA with A/D & D/A
+ 1065 PMC-AX1065 Reconfigurable FPGA with A/D & D/A
+ 2004 PMC-DX2004 Reconfigurable FPGA with LVDS I/O
+ 2020 PMC-AX2020 Reconfigurable FPGA with A/D & D/A
+ 2065 PMC-AX2065 Reconfigurable FPGA with A/D & D/A
+ 3020 PMC-AX3020 Reconfigurable FPGA with A/D & D/A
+ 3065 PMC-AX3065 Reconfigurable FPGA with A/D & D/A
+ 4243 PMC424, APC424, AcPC424 Digital I/O and Counter Timer Module
+ 4248 PMC464, APC464, AcPC464 Digital I/O and Counter Timer Module
+ 424b PMC-DX2002 Reconfigurable FPGA with Differential I/O
+ 4253 PMC-DX503 Reconfigurable FPGA with TTL and Differential I/O
+ 4312 PMC-CX1002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
+ 4313 PMC-CX1003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
+ 4322 PMC-CX2002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O
+ 4323 PMC-CX2003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O
+ 4350 PMC-DX501 Reconfigurable Digital I/O Module
+ 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O
+ 4357 PMC-DX502 Reconfigurable Differential I/O Module
+ 4457 PMC730, APC730, AcPC730 Multifunction Module
+ 464d PMC408 32-Channel Digital Input/Output Module
+ 4850 PMC220-16 12-Bit Analog Output Module
+ 4a42 PMC483, APC483, AcPC483 Counter Timer Module
+ 4a50 PMC484, APC484, AcPC484 Counter Timer Module
+ 4a56 PMC230 16-Bit Analog Output Module
+ 4b47 PMC330, APC330, AcPC330 Analog Input Module, 16-bit A/D
+ 4c40 PMC-LX40 Reconfigurable Virtex-4 FPGA with plug-in I/O
+ 4c60 PMC-LX60 Reconfigurable Virtex-4 FPGA with plug-in I/O
+ 4d4d PMC341, APC341, AcPC341 Analog Input Module, Simultaneous Sample & Hold
+ 4d4e PMC482, APC482, AcPC482 Counter Timer Board
+ 524d PMC-DX2001 Reconfigurable FPGA with TTL I/O
+ 5335 PMC-SX35 Reconfigurable Virtex-4 FPGA with plug-in I/O
+ 5456 PMC470 48-Channel Digital Input/Output Module
+ 5601 PMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5602 PMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5603 PMC-VSX95 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5604 PMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5605 PMC-VFX70 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5606 PMC-VLX155-1M Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5801 XMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5802 XMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5804 XMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O
+ 5807 XMC-SLX150: Reconfigurable Spartan-6 FPGA with plug-in I/O
+ 5808 XMC-SLX150-1M: Reconfigurable Spartan-6 FPGA with plug-in I/O
+ 5901 APCe8650 PCI Express IndustryPack Carrier Card
+16da Advantech Co., Ltd.
+ 0011 INES GPIB-PCI
+16df PIKA Technologies Inc.
+16e2 Geotest-MTS
+16e3 European Space Agency
+ 1e0f LEON2FT Processor
+16e5 Intellon Corp.
+ 6000 INT6000 Ethernet-to-Powerline Bridge [HomePlug AV]
+ 6300 INT6300 Ethernet-to-Powerline Bridge [HomePlug AV]
+16ec U.S. Robotics
+ 00ed USR997900
+ 0116 USR997902 10/100/1000 Mbps PCI Network Card
+ 2f00 USR5660A (USR265660A, USR5660A-BP) 56K PCI Faxmodem
+ 3685 Wireless Access PCI Adapter Model 022415
+ 4320 USR997904 10/100/1000 64-bit NIC (Marvell Yukon)
+ ab06 USR997901A 10/100 Cardbus NIC
+16ed Sycron N. V.
+ 1001 UMIO communication card
+16f3 Jetway Information Co., Ltd.
+16f4 Vweb Corp
+ 8000 VW2010
+16f6 VideoTele.com, Inc.
+1702 Internet Machines Corporation (IMC)
+1705 Digital First, Inc.
+170b NetOctave
+ 0100 NSP2000-SSL crypto accelerator
+170c YottaYotta Inc.
+1719 EZChip Technologies
+# Seems to be a 2nd ID for Vitesse Semiconductor
+1725 Vitesse Semiconductor
+ 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller
+172a Accelerated Encryption
+ 13c8 AEP SureWare Runner 1000V3
+1734 Fujitsu Technology Solutions
+ 1078 Amilo Pro v2010
+ 1085 Celsius M450
+ 1098 Amilo L 1310G
+1735 Aten International Co. Ltd.
+1737 Linksys
+ 0013 WMP54G Wireless Pci Card
+ 0029 WPG54G ver. 4 PCI Card
+ 1032 Gigabit Network Adapter
+ 1737 0015 EG1032 v2 Instant Gigabit Network Adapter
+ 1737 0024 EG1032 v3 Instant Gigabit Network Adapter
+ 1064 Gigabit Network Adapter
+ 1737 0016 EG1064 v2 Instant Gigabit Network Adapter
+ ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
+ ab09 21x4x DEC-Tulip compatible 10/100 Ethernet
+173b Altima (nee Broadcom)
+ 03e8 AC1000 Gigabit Ethernet
+ 03e9 AC1001 Gigabit Ethernet
+ 03ea AC9100 Gigabit Ethernet
+ 173b 0001 AC1002
+ 03eb AC1003 Gigabit Ethernet
+1743 Peppercon AG
+ 8139 ROL/F-100 Fast Ethernet Adapter with ROL
+1745 ViXS Systems, Inc.
+ 2020 XCode II Series
+ 2100 XCode 2100 Series
+1749 RLX Technologies
+174b PC Partner Limited
+174d WellX Telecom SA
+175c AudioScience Inc
+175e Sanera Systems, Inc.
+1760 TEDIA spol. s r. o.
+1771 InnoVISION Multimedia Ltd.
+# nee SBS Technologies
+1775 GE Intelligent Platforms
+177d Cavium Networks
+ 0001 Nitrox XL N1
+ 0003 Nitrox XL N1 Lite
+ 0004 Octeon (and older) FIPS
+ 0005 Octeon CN38XX Network Processor Pass 3.x
+ 0006 RoHS
+ 0010 Nitrox XL NPX
+ 0020 Octeon CN31XX Network Processor
+ 0030 Octeon CN30XX Network Processor
+ 0040 Octeon CN58XX Network Processor
+ 0050 Octeon CN57XX Network Processor (CN54XX/CN55XX/CN56XX)
+ 0070 Octeon CN50XX Network Processor
+ 0080 Octeon CN52XX Network Processor
+ 0090 Octeon II CN63XX Network Processor
+ 0091 Octeon II CN68XX Network Processor
+ 0092 Octeon II CN65XX Network Processor
+ 0093 Octeon II CN61XX Network Processor
+1787 Hightech Information System Ltd.
+1789 Ennyah Technologies Corp.
+# also used by Struck Innovative Systeme for joint developments
+1796 Research Centre Juelich
+ 0001 SIS1100 [Gigabit link]
+ 0002 HOTlink
+ 0003 Counter Timer
+ 0004 CAMAC Controller
+ 0005 PROFIBUS
+ 0006 AMCC HOTlink
+ 000d Synchronisation Slave
+ 000e SIS1100-eCMC
+ 000f TDC (GPX)
+ 0010 PCIe Counter Timer
+ 0011 SIS1100-e single link
+ 0012 SIS1100-e quad link
+1797 Techwell Inc.
+ 6801 TW6802 multimedia video card
+ 6802 TW6802 multimedia other device
+1799 Belkin
+ 6001 F5D6001 Wireless PCI Card [Realtek RTL8180]
+ 6020 F5D6020 v3000 Wireless PCMCIA Card [Realtek RTL8180]
+ 6060 F5D6060 Wireless PDA Card
+ 700f F5D7000 v7000 Wireless G Desktop Card [Realtek RTL8185]
+ 701f F5D7010 v7000 Wireless G Notebook Card [Realtek RTL8185]
+179a id Quantique
+ 0001 Quantis PCI 16Mbps
+179c Data Patterns
+ 0557 DP-PCI-557 [PCI 1553B]
+ 0566 DP-PCI-566 [Intelligent PCI 1553B]
+ 1152 DP-cPCI-1152 (8-channel Isolated ADC Module)
+ 5031 DP-CPCI-5031-Synchro Module
+# cPCI Carrier for Mezzanine Modules
+ 5112 DP-cPCI-5112 [MM-Carrier]
+ 5121 DP-CPCI-5121-IP Carrier
+ 5211 DP-CPCI-5211-IP Carrier
+ 5679 AGE Display Module
+17a0 Genesys Logic, Inc
+ 7163 GL9701 PCIe to PCI Bridge
+ 8083 GL880 USB 1.1 UHCI controller
+ 8084 GL880 USB 2.0 EHCI controller
+17aa Lenovo
+ 20b1 ThinkPad T61p
+17ab Phillips Components
+17af Hightech Information System Ltd.
+17b3 Hawking Technologies
+ ab08 PN672TX 10/100 Ethernet
+17b4 Indra Networks, Inc.
+ 0011 WebEnhance 100 GZIP Compression Card
+ 0012 WebEnhance 200 GZIP Compression Card
+ 0015 WebEnhance 300 GZIP Compression Card
+ 0016 StorCompress 300 GZIP Compression Card
+ 0017 StorSecure 300 GZIP Compression and AES Encryption Card
+17c0 Wistron Corp.
+17c2 Newisys, Inc.
+17cb Airgo Networks Inc
+ 0001 AGN100 802.11 a/b/g True MIMO Wireless Card
+ 1385 5c00 WGM511 Pre-N 802.11g Wireless CardBus Adapter
+ 0002 AGN300 802.11 a/b/g True MIMO Wireless Card
+ 1385 6d00 WPNT511 RangeMax 240 Mbps Wireless CardBus Adapter
+ 1737 0054 WPC54GX4 v1 802.11g Wireless-G Notebook Adapter with SRX400
+17cc NetChip Technology, Inc
+ 2280 USB 2.0
+17cf Z-Com, Inc.
+17d3 Areca Technology Corp.
+ 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller
+ 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller
+ 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller
+ 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller
+ 1170 ARC-1170 24-Port PCI-X to SATA RAID Controller
+ 1201 ARC-1200 2-Port PCI-Express to SATA II RAID Controller
+ 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller
+ 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller
+ 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller
+ 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller
+ 1280 ARC-1280/1280ML 24-Port PCI-Express to SATA II RAID Controller
+ 17d3 1221 ARC-1221 8-Port PCI-Express to SATA RAID Controller
+ 1300 ARC-1300ix-16 16-Port PCI-Express to SAS Non-RAID Host Adapter
+ 1680 ARC-1680 8 port PCIe/PCI-X to SAS/SATA II RAID Controller
+ 1880 ARC-1880 8/12 port PCIe/PCI-X to SAS/SATA II RAID Controller
+# nee Neterion Inc., previously S2io Inc.
+17d5 Exar Corp.
+ 5731 Xframe 10-Gigabit Ethernet PCI-X
+ 5732 Xframe II 10-Gigabit Ethernet PCI-X 2.0
+ 5831 Xframe 10-Gigabit Ethernet PCI-X
+ 103c 12d5 PCI-X 133MHz 10GbE SR Fiber
+ 10a9 8020 Single Port 10-Gigabit Ethernet (PCI-X, Fiber)
+ 10a9 8024 Single Port 10-Gigabit Ethernet (PCI-X, Fiber)
+ 5832 Xframe II 10-Gigabit Ethernet PCI-X 2.0
+ 103c 1337 PCI-X 266MHz 10GigE SR [AD385A]
+ 10a9 8021 Single Port 10-Gigabit Ethernet II (PCI-X, Fiber)
+ 17d5 6020 Xframe II SR
+ 17d5 6021 Xframe II SR, Low Profile
+ 17d5 6022 Xframe E SR
+ 17d5 6420 Xframe II LR
+ 17d5 6421 Xframe II LR, Low Profile
+ 17d5 6422 Xframe E LR
+ 17d5 6c20 Xframe II CX4
+ 17d5 6c21 Xframe II CX4, Low Profile
+ 17d5 6c22 Xframe E CX4
+ 5833 X3100 Series 10 Gigabit Ethernet PCIe
+ 17d5 6030 X3110 Single Port SR
+ 17d5 6031 X3120 Dual Port SR
+ 17d5 6430 X3110 Single Port LR
+ 17d5 6431 X3120 Dual Port LR
+ 17d5 7030 X3110 Single Port LRM
+ 17d5 7031 X3120 Dual Port LRM
+ 17d5 7430 X3110 Single Port 10GBase-T
+ 17d5 7431 X3120 Dual Port 10GBase-T
+ 17d5 7830 X3110 Single Port 10GBase-CR
+ 17d5 7831 X3120 Dual Port 10GBase-CR
+17db Cray Inc
+ 0101 XT Series [Seastar] 3D Toroidal Router
+17de KWorld Computer Co. Ltd.
+17e4 Sectra AB
+ 0001 KK671 Cardbus encryption board
+ 0002 KK672 Cardbus encryption board
+17e6 Entropic Communications Inc.
+ 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface)
+ 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface)
+ 0021 EN2210 [c.Link] MoCA Network Controller (Coax)
+ 0025 EN2510 [c.Link] MoCA Network Controller (Coax, PCIe interface)
+17ee Connect Components Ltd
+17f2 Albatron Corp.
+17f3 RDC Semiconductor, Inc.
+ 1010 R1010 IDE Controller
+ 6020 R6020 North Bridge
+ 6021 R6021 Host Bridge
+ 6030 R6030 ISA Bridge
+ 6031 R6031 ISA Bridge
+ 6040 R6040 MAC Controller
+ 6060 R6060 USB 1.1 Controller
+ 6061 R6061 USB 2.0 Controller
+17f7 Topdek Semiconductor Inc.
+17f9 Gemtek Technology Co., Ltd
+17fe InProComm Inc.
+ 2120 IPN 2120 802.11b
+ 1737 0020 WMP11 v4 802.11b Wireless-B PCI Adapter
+ 2220 IPN 2220 802.11g
+ 1468 0305 T60N871 802.11g Mini PCI Wireless Adapter
+ 1737 0029 WPC54G v4 802.11g Wireless-G Notebook Adapter
+17ff Benq Corporation
+1803 ProdaSafe GmbH
+1805 Euresys S.A.
+1809 Lumanate, Inc.
+1813 Ambient Technologies Inc
+ 4000 HaM controllerless modem
+ 16be 0001 V9x HAM Data Fax Modem
+ 4100 HaM plus Data Fax Modem
+ 16be 0002 V9x HAM 1394
+1814 Ralink corp.
+ 0101 Wireless PCI Adapter RT2400 / RT2460
+ 1043 0127 WiFi-b add-on Card
+ 1371 0010 Minitar MNW2BPCI Wireless PCI Card
+ 1462 6828 PC11B2 (MS-6828) Wireless 11b PCI Card
+ 0200 RT2500 802.11g PCI [PC54G2]
+ 0201 RT2500 802.11g
+ 1043 130f WL-130g
+ 1371 001e CWC-854 Wireless-G CardBus Adapter
+ 1371 001f CWM-854 Wireless-G Mini PCI Adapter
+ 1371 0020 CWP-854 Wireless-G PCI Adapter
+ 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter
+ 1458 e931 GN-WIKG 802.11b/g mini-PCI Adapter
+ 1462 6833 Unknown 802.11g mini-PCI Adapter
+ 1462 6835 Wireless 11G CardBus CB54G2
+ 1737 0032 WMP54G 2.0 PCI Adapter
+ 1799 700a F5D7000 v2000/v3000 Wireless G Desktop Card
+ 1799 701a F5D7010 v2000/v3000 Wireless G Notebook Card
+ 185f 22a0 CN-WF513 Wireless Cardbus Adapter
+ 1948 3c00 C54RC v1 Wireless 11g CardBus Adapter
+ 1948 3c01 C54Ri v1 Wireless 11g PCI Adapter
+ 0300 Wireless Adapter Canyon CN-WF511
+ 0301 RT2561/RT61 802.11g PCI
+ 1186 3c08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.E1)
+ 1186 3c09 DWL-G510 Rev C
+ 13d1 abe3 miniPCI Pluscom 802.11 a/b/g
+ 1458 e933 GN-WI01GS
+ 1458 e934 GN-WP01GS
+ 1737 0055 WMP54G ver 4.1
+ 1799 700e F5D7000 v6000 Wireless G Desktop Card
+ 1799 701e F5D7010 v6000 Wireless G Notebook Card
+ 17f9 0012 AWLC3026T 802.11g Wireless CardBus Adapter
+ 1814 2561 EW-7108PCg
+ 0302 RT2561/RT61 rev B 802.11g
+ 1186 3a71 DWA-510 Wireless G Desktop Adapter
+ 1186 3c08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.E2)
+ 1186 3c09 AirPlus G DWL-G510 Wireless Network Adapter (Rev.C)
+ 1462 b834 PC54G3 Wireless 11g PCI Card
+ 1948 3c23 C54RC v2 Wireless 11g CardBus Adapter
+ 1948 3c24 C54Ri v2 Wireless 11g PCI Adapter
+ 0401 RT2600 802.11 MIMO
+ 1737 0052 WPC54GR v1 802.11g Wireless-G Notebook Adapter with RangeBooster
+ 17f9 0011 WPCR-137G 802.11bg Wireless CardBus Adapter
+ 17f9 0016 WPIR-119GH 802.11bg Wireless Desktop Adapter
+ 0601 RT2800 802.11n PCI
+ 1799 801c F5D8011 v3 802.11n N1 Wireless Notebook Card
+ 187e 3412 NWD-310N 802.11n Wireless PCI Adapter
+ 0681 RT2860 Wireless 802.11n PCIe
+ 0701 RT2760 Wireless 802.11n 1T/2R Cardbus
+ 0781 RT2860
+ 3060 RT3060 Wireless 802.11n 1T/1R
+ 1186 3c04 DWA-525 Wireless N 150 Desktop Adapter (rev.A1)
+ 3090 RT3090 Wireless 802.11n 1T/1R PCIe
+ 13bd 1057 GN-WS32L-RH Half-size Mini PCIe Card
+ 3091 RT3091 Wireless 802.11n 1T/2R PCIe
+ 3092 RT3092 Wireless 802.11n 2T/2R PCIe
+ e932 RT2560F 802.11 b/g PCI
+1815 Devolo AG
+1820 InfiniCon Systems Inc.
+1822 Twinhan Technology Co. Ltd
+ 4e35 Mantis DTV PCI Bridge Controller [Ver 1.0]
+182d SiteCom Europe BV
+# HFC-based ISDN card
+ 3069 ISDN PCI DC-105V2
+ 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]
+182e Raza Microelectronics, Inc.
+ 0008 XLR516 Processor
+# Strange vendor ID used by BCM5785 when in RAID mode
+182f Broadcom
+# HT1000 uses 3 IDs 1166:024a (Native SATA Mode), 1166:024b (PATA/IDE Mode), 182f:000b (RAID Mode) depends on SATA BIOS setting
+ 000b BCM5785 [HT1000] SATA (RAID Mode)
+1830 Credence Systems Corporation
+183b MikroM GmbH
+ 08a7 MVC100 DVI
+ 08a8 MVC101 SDI
+ 08a9 MVC102 DVI+Audio
+ 08b0 MVC200-DC
+1849 ASRock Incorporation
+184a Thales Computers
+ 1100 MAX II cPLD
+1851 Microtune, Inc.
+1852 Anritsu Corp.
+1853 SMSC Automotive Infotainment System Group
+1854 LG Electronics, Inc.
+185b Compro Technology, Inc.
+ 1489 VideoMate Vista T100
+185f Wistron NeWeb Corp.
+1864 SilverBack
+ 2110 ISNAP 2110
+1867 Topspin Communications
+ 5a44 MT23108 InfiniHost HCA
+ 5a45 MT23108 InfiniHost HCA flash recovery
+ 5a46 MT23108 InfiniHost HCA bridge
+ 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
+ 6282 MT25208 InfiniHost III Ex
+186c Humusoft, s.r.o.
+ 0612 AD612 Data Acquisition Device
+ 0614 MF614 Multifunction I/O Card
+ 0622 AD622 Data Acquisition Device
+ 0624 MF624 Multifunction I/O Card
+ 0625 MF625 3-phase Motor Driver
+186f WiNRADiO Communications
+1876 L-3 Communications
+ a101 VigraWATCH PCI
+ a102 VigraWATCH PMC
+ a103 Vigra I/O
+187e ZyXEL Communication Corporation
+ 3403 ZyAir G-110 802.11g
+ 340e M-302 802.11g XtremeMIMO
+1885 Avvida Systems Inc.
+1888 Varisys Ltd
+ 0301 VMFX1 FPGA PMC module
+ 0601 VSM2 dual PMC carrier
+ 0710 VS14x series PowerPC PCI board
+ 0720 VS24x series PowerPC PCI board
+188a Ample Communications, Inc
+1890 Egenera, Inc.
+1894 KNC One
+1896 B&B Electronics Manufacturing Company, Inc.
+ 4202 MIport 3PCIU2 2-port Serial
+ 4204 MIport 3PCIU4 4-port Serial
+ 4208 MIport 3PCIU8 8-port Serial
+ 4211 MIport 3PCIOU1 1-port Isolated Serial
+ 4212 MIport 3PCIOU2 2-port Isolated Serial
+ 4214 MIport 3PCIOU4 4-port Isolated Serial
+ bb10 3PCI2 2-Port Serial
+ bb11 3PCIO1 1-Port Isolated Serial
+1897 AMtek
+18a1 Astute Networks Inc.
+18a2 Stretch Inc.
+ 0002 VRC6016 16-Channel PCIe DVR Card
+18a3 AT&T
+18ac DViCO Corporation
+ d500 FusionHDTV 5
+ d800 FusionHDTV 3 Gold
+ d810 FusionHDTV 3 Gold-Q
+ d820 FusionHDTV 3 Gold-T
+ db30 FusionHDTV DVB-T Pro
+ db40 FusionHDTV DVB-T Hybrid
+ db78 FusionHDTV DVB-T Dual Express
+18b8 Ammasso
+ b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor
+18bc Info-Tek Corp.
+18c3 Micronas Semiconductor Holding AG
+# Nee Octigabay System
+18c8 Cray Inc
+18c9 ARVOO Engineering BV
+18ca XGI Technology Inc. (eXtreme Graphics Innovation)
+ 0020 Z7/Z9 (XG20 core)
+ 0021 Z9s/Z9m (XG21 core)
+# duh! Device name, not my name :)
+ 0027 Z11/Z11M
+ 0040 Volari V3XT/V5/V8
+ 0047 Volari 8300 (chip: XP10, codename: XG47)
+18d2 Sitecom
+# Sitecom HFC-S based ISDN controller card DC-105v2
+ 3069 DC-105v2 ISDN controller
+18d8 Dialogue Technology Corp.
+18dd Artimi Inc
+ 4c6f Artimi RTMI-100 UWB adapter
+18e6 MPL AG
+ 0001 OSCI [Octal Serial Communication Interface]
+18eb Advance Multimedia Internet Technology, Inc.
+18ec Cesnet, z.s.p.o.
+ 6d05 ML555
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+ c006 COMBO6
+ 18ec d001 COMBO-4MTX
+ 18ec d002 COMBO-4SFP
+ 18ec d003 COMBO-4SFPRO
+ 18ec d004 COMBO-2XFP
+ c032 COMBO-LXT110
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+ c045 COMBO6E
+ c050 COMBO-PTM
+ c058 COMBO6X
+ 18ec d001 COMBO-4MTX
+ 18ec d002 COMBO-4SFP
+ 18ec d003 COMBO-4SFPRO
+ 18ec d004 COMBO-2XFP
+ c132 COMBO-LXT155
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+ c232 COMBO-FXT100
+ 18ec 0100 NIC (ethernet interfaces)
+ 18ec 0200 NIC (szedata2) 4x1G
+ 18ec 0201 NIC (szedata2) 2x10G
+ 18ec 0300 NIFIC (szedata2) 4x1G
+ 18ec 0302 NIFIC (szedata2) 2x10G
+ 18ec 4200 Flexible FlowMon (szedata2) 1x10G
+ 18ec ff00 Testing design
+ 18ec ff01 Boot design
+18ee Chenming Mold Ind. Corp.
+18f1 Spectrum GmbH
+18f4 Napatech A/S
+ 0051 NT20-X Capture Card
+ 0061 NT20E Capture Card
+ 0064 NT20E Inline Card
+ 0071 NT4E Capture Card
+ 0074 NT4E Inline Card
+ 0081 NT4E 4-port Expansion Card
+ 0091 NT20X Capture Card [New Rev]
+ 00a1 NT4E-STD Capture Card
+ 00a4 NT4E-STD Inline Card
+18f6 NextIO
+ 1000 [Nexsis] Switch Virtual P2P PCIe Bridge
+ 1050 [Nexsis] Switch Virtual P2P PCI Bridge
+ 2000 [Nexsis] Switch Integrated Mgmt. Endpoint
+18f7 Commtech, Inc.
+ 0001 Fastcom ESCC-PCI-335
+ 0002 Fastcom 422/4-PCI-335
+ 0003 Fastcom 232/4-1M-PCI
+ 0004 Fastcom 422/2-PCI-335
+ 0005 Fastcom IGESCC-PCI-ISO/1
+ 000a Fastcom 232/4-PCI-335
+ 000b Fastcom 232/8-PCI-335 Async 8-Port RS-232 Serial PCI Adapter
+ 000f Fastcom FSCC
+ 0010 Fastcom GSCC
+# Dual Serocco
+ 0011 Fastcom QSSB
+ 0014 SuperFSCC
+ 0015 SuperFSCC-104
+ 0016 Fastcom FSCC-232 Sync/Async 2-Port RS-232 Serial PCI Adapter (F-Core)
+ 0017 SuperFSCC-104-NOUART
+ 0018 Fastcom SuperFSCC/4 Sync/Async 4-Port RS-422 Serial PCI Adapter with DMA (F-Core)
+ 0019 SuperFSCC with soft UARTs
+ 001a Fastcom SuperFSCC-104-LVDS Sync/Async 2-Port RS-644 Serial PC/104+ Adapter with DMA (F-Core)
+ 001b Fastcom FSCC/4 Sync/Async 4-Port RS-422 Serial PCI Adapter (F-Core)
+ 001c Fastcom SuperFSCC/4-LVDSSync/Async 4-Port RS-644 Serial PCI Adapter with DMA (F-Core)
+18fb Resilience Corporation
+1904 Hangzhou Silan Microelectronics Co., Ltd.
+ 2031 SC92031 PCI Fast Ethernet Adapter
+ 8139 RTL8139D [Realtek] PCI 10/100BaseTX ethernet adaptor
+1905 Micronas USA, Inc.
+1912 Renesas Technology Corp.
+ 0002 SH7780 PCI Controller (PCIC)
+ 0011 SH7757 PCIe End-Point [PBI]
+ 0012 SH7757 PCIe-PCI Bridge [PPB]
+ 0013 SH7757 PCIe Switch [PS]
+1919 Soltek Computer Inc.
+1923 Sangoma Technologies Corp.
+ 0040 A200/Remora FXO/FXS Analog AFT card
+ 0100 A104d QUAD T1/E1 AFT card
+ 0300 A101 single-port T1/E1
+ 0400 A104u Quad T1/E1 AFT
+1924 Solarflare Communications
+ 0703 SFC4000 rev A net [Solarstorm]
+ 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard]
+ 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
+ 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard]
+ 1924 0101 SFE4001-A1
+ 1924 0102 SFE4001-A2
+ 1924 0103 SFE4001-A3
+ 1924 0201 SFE4002-A1
+ 1924 0301 SFE4003-A1
+ 1924 0302 SFE4003-A2
+ 1924 0303 SFE4003-A3
+ 1924 0304 SFE4003-A4
+ 1924 0500 SFE4005-A0
+ 0710 SFC4000 rev B [Solarstorm]
+ 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
+ 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard]
+ 1924 0102 SFE4001-A2
+ 1924 0103 SFE4001-A3
+ 1924 0201 SFE4002-A1
+ 1924 0302 SFE4003-A2
+ 1924 0303 SFE4003-A3
+ 1924 0304 SFE4003-A4
+ 1924 0500 SFE4005-A0
+ 1924 5102 SFN4111T-A2
+ 1924 5103 SFN4111T-R3
+ 1924 5104 SFN4111T-R4
+ 1924 5105 SFN4111T-R5
+ 1924 5201 SFN4112F-R1
+ 1924 5202 SFN4112F-R2
+ 0803 SFC9020 [Solarstorm]
+ 1924 6200 SFN5122F-R0
+ 1924 6201 SFN5122F-R1
+ 1924 6202 SFN5122F-R2
+ 1924 6204 SFN5122F-R4
+ 1924 6205 SFN5122F-R5
+ 1924 6206 SFN5122F-R6
+ 1924 6210 SFN5322F-R0
+ 1924 6211 SFN5322F-R1
+ 1924 6a05 SFN5112F-R5
+ 1924 6a06 SFN5112F-R6
+ 1924 7206 SFN5162F-R6
+ 1924 7a06 SFN5152F-R6
+ 0813 SFL9021 [Solarstorm]
+ 1924 6100 SFN5121T-R0
+ 1924 6102 SFN5121T-R2
+ 1924 6103 SFN5121T-R3
+ 1924 6104 SFN5121T-R4
+ 1924 6902 SFN5111T-R2
+ 1924 6904 SFN5111T-R4
+ 1924 7104 SFN5161T-R4
+ 1924 7904 SFN5151T-R4
+ 1803 SFC9020 Virtual Function [Solarstorm]
+ 1813 SFL9021 Virtual Function [Solarstorm]
+ 6703 SFC4000 rev A iSCSI/Onload [Solarstorm]
+ 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard]
+ 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
+ 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard]
+ 1924 0101 SFE4001-A1
+ 1924 0102 SFE4001-A2
+ 1924 0103 SFE4001-A3
+ 1924 0201 SFE4002-A1
+ 1924 0301 SFE4003-A1
+ 1924 0302 SFE4003-A2
+ 1924 0303 SFE4003-A3
+ 1924 0304 SFE4003-A4
+ 1924 0500 SFE4005-A0
+ c101 EF1-21022T [EtherFabric]
+192e TransDimension
+1931 Option N.V.
+ 000c Qualcomm MSM6275 UMTS chip
+1932 DiBcom
+193c MAXIM Integrated Products
+193f Comtech AHA Corp.
+ 0001 AHA36x-PCIX
+ 0360 AHA360-PCIe
+ 0363 AHA363-PCIe
+ 0364 AHA364-PCIe
+ 0367 AHA367-PCIe
+1942 ClearSpeed Technology plc
+ e511 Advance X620 accelerator card
+ e521 Advance e620 accelerator card
+1947 C-guys, Inc.
+ 4743 CG200 Dual SD/SDIO Host controller device
+1948 Alpha Networks Inc.
+194a DapTechnology B.V.
+ 1111 FireSpy3850
+ 1112 FireSpy450b
+ 1113 FireSpy450bT
+ 1114 FireSpy850
+ 1115 FireSpy850bT
+ 1200 FireTrac 3460bT
+ 1201 FireTrac 3460bT (fallback firmware)
+ 1202 FireTrac 3460bT
+ 1203 FireTrac 3460bT (fallback firmware)
+1954 Curtis, Inc.
+1957 Freescale Semiconductor Inc
+ 0012 MPC8548E
+ 0013 MPC8548
+ 0014 MPC8543E
+ 0015 MPC8543
+ 0018 MPC8547E
+ 0019 MPC8545E
+ 001a MPC8545
+ 0020 MPC8568E
+ 0021 MPC8568
+ 0022 MPC8567E
+ 0023 MPC8567
+ 0030 MPC8533E
+ 0031 MPC8533
+ 0032 MPC8544E
+ 0033 MPC8544
+ 0040 MPC8572E
+ 0041 MPC8572
+ 0050 MPC8536E
+ 0051 MPC8536
+ 0052 MPC8535E
+ 0053 MPC8535
+ 0060 MPC8569
+ 0061 MPC8569E
+ 0070 P2020E
+ 0071 P2020
+ 0078 P2010E
+ 0079 P2010
+ 0080 MPC8349E
+ 0081 MPC8349
+ 0082 MPC8347E TBGA
+ 0083 MPC8347 TBGA
+ 0084 MPC8347E PBGA
+ 0085 MPC8347 PBGA
+ 0086 MPC8343E
+ 0087 MPC8343
+ 00b4 MPC8315E
+ 0100 P1020E
+ 0101 P1020
+ 0102 P1021E
+ 0103 P1021
+ 0108 P1011E
+ 0109 P1011
+ 010a P1012E
+ 010b P1012
+ 0110 P1022E
+ 0111 P1022
+ 0118 P1013E
+ 0119 P1013
+ 0400 P4080E
+ 0401 P4080
+ 0408 P4040E
+ 0409 P4040
+ 7010 MPC8641 PCI Host Bridge
+ 7011 MPC8641D PCI Host Bridge
+ 7018 MPC8610
+1958 Faster Technology, LLC.
+1959 PA Semi, Inc
+ a000 PA6T Core
+ a001 PWRficient Host Bridge
+ a002 PWRficient PCI-Express Port
+ a003 PWRficient SMBus Controller
+ a004 PWRficient 16550 UART
+ a005 PWRficient Gigabit Ethernet
+ a006 PWRficient 10-Gigabit Ethernet
+ a007 PWRficient DMA Controller
+ a008 PWRficient LPC/Localbus Interface
+ a009 PWRficient L2 Cache
+ a00a PWRficient DDR2 Memory Controller
+ a00b PWRficient SERDES
+ a00c PWRficient System/Debug Controller
+ a00d PWRficient PCI-Express Internal Endpoint
+1966 Orad Hi-Tec Systems
+ 1975 DVG64 family
+ 1977 DVG128 family
+# nee Attansic Technology Corp.
+1969 Atheros Communications
+ 1026 AR8121/AR8113/AR8114 Gigabit or Fast Ethernet
+ 1043 8304 P5KPL-CM Motherboard
+ 1048 L1 Gigabit Ethernet
+ 1043 8226 P5KPL-VM Motherboard
+ 1062 AR8132 Fast Ethernet
+ 1063 AR8131 Gigabit Ethernet
+ 1458 e000 GA-G31M-ES2L Motherboard
+ 1066 L2c Gigabit Ethernet
+ 1067 L1c Gigabit Ethernet
+ 1073 AR8151 v1.0 Gigabit Ethernet
+ 1083 AR8151 v2.0 Gigabit Ethernet
+ 2048 L2 Fast Ethernet
+ 2060 AR8152 v1.1 Fast Ethernet
+ 2062 AR8152 v2.0 Fast Ethernet
+196a Sensory Networks Inc.
+ 0101 NodalCore C-1000 Content Classification Accelerator
+ 0102 NodalCore C-2000 Content Classification Accelerator
+ 0105 NodalCore C-3000 Content Classification Accelerator
+196d Club-3D BV
+1971 AGEIA Technologies, Inc.
+ 1011 Physics Processing Unit [PhysX]
+ 1043 0001 PhysX P1
+1974 TransferZentrum Mikroelektronik
+1976 TRENDnet
+1977 Parsec
+197b JMicron Technology Corp.
+ 0250 JMC250 PCI Express Gigabit Ethernet Controller
+ 0260 JMC260 PCI Express Fast Ethernet Controller
+ 0368 JMB368 IDE controller
+ 2360 JMB360 AHCI Controller
+ 2361 JMB361 AHCI/IDE
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 2362 JMB362 AHCI Controller
+ 1043 8460 P8P67 Deluxe Motherboard
+ 2363 JMB362/JMB363 Serial ATA Controller
+ 1043 81e4 P5B [JMB363]
+ 1458 b000 GA-EP45-DS5 Motherboard
+ 1849 2363 Motherboard (one of many)
+ 2364 JMB364 AHCI Controller
+ 2365 JMB365 AHCI/IDE
+ 2366 JMB366 AHCI/IDE
+ 2368 JMB368 IDE controller
+ 2369 JMB369 Serial ATA Controller
+ 2380 IEEE 1394 Host Controller
+ 2381 Standard SD Host Controller
+ 2382 SD/MMC Host Controller
+ 2383 MS Host Controller
+ 2384 xD Host Controller
+ 2386 Standard SD Host Controller
+ 2387 SD/MMC Host Controller
+ 2388 MS Host Controller
+ 2389 xD Host Controller
+ 2391 Standard SD Host Controller
+ 2392 SD/MMC Host Controller
+ 2393 MS Host Controller
+ 2394 xD Host Controller
+1982 Distant Early Warning Communications Inc
+ 1600 OX16C954 HOST-A
+ 16ff OX16C954 HOST-B
+1989 Montilio Inc.
+ 0001 RapidFile Bridge
+ 8001 RapidFile
+198a Nallatech Ltd.
+1993 Innominate Security Technologies AG
+199a Pulse-LINK, Inc.
+199d Xsigo Systems
+ 8209 Virtual NIC Device
+ 890a Virtual HBA Device
+199f Auvitek
+ 8501 AU85X1 PCI REV1.1
+# nee ServerEngines Corp.
+19a2 Emulex Corporation
+ 0200 BladeEngine 10Gb PCI-E iSCSI adapter
+ 0201 BladeEngine 10Gb PCIe Network Adapter
+ 0211 BladeEngine2 10Gb Gen2 PCIe Network Adapter
+ 0212 BladeEngine2 10Gb Gen2 PCIe iSCSI Adapter
+ 0221 BladeEngine3 10Gb Gen2 PCIe Network Adapter
+ 0222 BladeEngine3 10Gb Gen2 PCIe iSCSI Adapter
+ 0700 OneConnect 10Gb NIC
+ 103c 1747 NC550SFP DualPort 10GbE Server Adapter
+ 103c 1749 NC550SFP Dual Port Server Adapter
+ 103c 174a NC551m Dual Port FlexFabric 10Gb Adapter
+ 103c 174b StorageWorks NC550 DualPort Converged Network Adapter
+ 103c 3314 NC551i Dual Port FlexFabric 10Gb Adapter
+ 0702 OneConnect 10Gb iSCSI Initiator
+ 0704 OneConnect 10Gb FCoE Initiator
+ 0710 OneConnect 10Gb NIC (be3)
+ 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter
+ 103c 3340 NC552SFP 2-port 10Gb Server Adapter
+ 103c 3341 NC552m 10Gb 2-port FlexFabric Converged Network Adapter
+ 103c 3345 NC553m 10Gb 2-port FlexFabric Converged Network Adapter
+ 0712 OneConnect 10Gb iSCSI Initiator (be3)
+ 0714 OneConnect 10Gb FCoE Initiator (be3)
+ 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter
+19a8 DAQDATA GmbH
+19ac Kasten Chase Applied Research
+ 0001 ACA2400 Crypto Accelerator
+19ae Progeny Systems Corporation
+ 0520 4135 HFT Interface Controller
+ 0521 Decimator
+19c1 Exegy Inc.
+# nee NextNet Wireless
+19d1 Motorola Expedience
+19d4 Quixant Limited
+19da ZOTAC International (MCO) Ltd.
+19de Pico Computing
+19e2 Vector Informatik GmbH
+19e3 DDRdrive LLC
+ 5801 DDRdrive X1
+ 5808 DDRdrive X8
+ dd52 DDRdrive X1-30
+19e7 NET (Network Equipment Technologies)
+ 1001 STIX DSP Card
+ 1002 STIX - 1 Port T1/E1 Card
+ 1003 STIX - 2 Port T1/E1 Card
+ 1004 STIX - 4 Port T1/E1 Card
+ 1005 STIX - 4 Port FXS Card
+19ee Netronome Systems, Inc.
+19f1 BFG Tech
+19ff Eclipse Electronic Systems, Inc.
+1a03 ASPEED Technology, Inc.
+ 1150 AST1150 PCI-to-PCI Bridge
+ 2000 ASPEED Graphics Family
+1a07 Kvaser AB
+ 0006 CAN interface PC104+ HS/HS
+ 0007 CAN interface PCIcanx II HS or HS/HS
+ 0008 CAN interface PCIEcan HS or HS/HS
+ 0009 CAN interface PCI104 HS/HS
+1a08 Sierra semiconductor
+ 0000 SC15064
+1a0e DekTec Digital Video B.V.
+1a17 Force10 Networks, Inc.
+ 8002 PB-10GE-2P 10GbE Security Card
+1a1d GFaI e.V.
+ 1a17 Meta Networks MTP-1G IDPS NIC
+1a1e 3Leaf Systems, Inc.
+1a22 Ambric Inc.
+1a29 Fortinet, Inc.
+1a2b Ascom AG
+ 0000 GESP v1.2
+ 0001 GESP v1.3
+ 0002 ECOMP v1.3
+ 0005 ETP v1.4
+ 000a ETP-104 v1.1
+ 000e DSLP-104 v1.1
+1a3b AzureWave
+ 1112 AR9285 Wireless Network Adapter (PCI-Express)
+1a51 Hectronic AB
+1a56 Bigfoot Networks, Inc.
+1a57 Highly Reliable Systems
+1a58 Razer USA Ltd.
+1a5d Celoxica
+1a5e Aprius Inc.
+1a5f System TALKS Inc.
+1a68 VirtenSys Limited
+1a71 XenSource, Inc.
+1a73 Violin Memory, Inc
+ 0001 Mozart [Memory Appliance 1010]
+1a76 Wavesat
+1a77 Lightfleet Corporation
+1a78 Virident Systems Inc.
+ 0031 Virident tachIOn Drive
+ 1a78 0034 tachIOn PCIe SSD [rev 3]
+ 1a78 0037 tachIOn PCIe SSD [rev 3D]
+ 1a78 0038 tachIOn PCIe SSD [rev 4]
+ 1a78 0039 tachIOn PCIe SSD [rev 4D]
+1a84 Commex Technologies
+ 0001 Vulcan SP HT6210 10-Gigabit Ethernet (rev 02)
+1a88 MEN Mikro Elektronik
+ 4d45 Multifunction IP core
+1a8c Verigy Pte. Ltd.
+ 1100 E8001-66443 PCI Express CIC
+1a8e DRS Technologies
+ 2090 Model 2090 PCI Express
+1aa8 Ciprico, Inc.
+ 0009 RAIDCore Controller
+ 000a RAIDCore Controller
+1aae Global Velocity, Inc.
+1ab6 CalDigit, Inc.
+ 6201 RAID Card
+1ab9 Espia Srl
+1ad7 Spectracom Corporation
+ 8000 TSync-PCIe Time Code Processor
+ 9100 TPRO-PCI-66U Timecode Reader/Generator
+1ade Spin Master Ltd.
+ 1501 Swipetech barcode scanner
+1ae0 Google, Inc.
+1ae8 Silicon Software GmbH
+ 0a40 microEnable IV-BASE x1
+ 0a41 microEnable IV-FULL x1
+ 0a44 microEnable IV-FULL x4
+ 0e44 microEnable IV-GigE x4
+1aec Wolfson Microelectronics
+1aed Fusion-io
+ 1003 ioDimm3 (v1.2)
+ 1005 ioDimm3
+ 1006 ioXtreme
+ 1007 ioXtreme Pro
+ 1008 ioXtreme-2
+1aee Caustic Graphics Inc.
+# nee Qumranet, Inc.
+1af4 Red Hat, Inc
+ 1000 Virtio network device
+ 1001 Virtio block device
+ 1002 Virtio memory balloon
+ 1003 Virtio console
+1af5 Netezza Corp.
+1afa J & W Electronics Co., Ltd.
+1b03 Magnum Semiconductor, Inc,
+ 6100 DXT/DXTPro Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder
+1b13 Jaton Corp
+1b1a K&F Computing Research Co.
+ 0e70 GRAPE
+1b21 ASMedia Technology Inc.
+ 1042 ASM1042 SuperSpeed USB Host Controller
+1b36 Red Hat, Inc.
+1b3a Westar Display Technologies
+ 7589 HRED J2000 - JPEG 2000 Video Codec Device
+1b3e Teradata Corp.
+ 1fa8 BYNET BIC2SE/X
+ 1b3e 00a3 BYNET BIC2SX
+ 1b3e 00c3 BYNET BIC2SE
+1b40 Schooner Information Technology, Inc.
+# Early Proxim devices use 1b47 rather than 14b7.
+1b47 PROXIM Inc (Wrong ID)
+1b4b Marvell Technology Group Ltd.
+ 9123 88SE9123 PCIe SATA 6.0 Gb/s controller
+ 9125 88SE9125 PCIe SATA 6.0 Gb/s controller
+ 9128 88SE9128 PCIe SATA 6 Gb/s RAID controller
+ 9130 88SE9128 PCIe SATA 6 Gb/s RAID controller with HyperDuo
+ 1043 8438 P8P67 Deluxe Motherboard
+ 91a0 88SE91A0 SATA 6Gb/s Controller
+ 91a4 88SE91A4 SATA 6Gb/s Controller
+1b55 NetUP Inc.
+ 2a2c Dual DVB-S2-CI card
+ e2e4 Dual DVB-T/C-CI RF card
+1b73 Fresco Logic
+ 1000 FL1000G USB 3.0 Host Controller
+1bad ReFLEX CES
+1bb3 Bluecherry
+ 4304 BC-04120A MPEG4 4 port video encoder / decoder
+ 4309 BC-08240A MPEG4 4 port video encoder / decoder
+ 4310 BC-16480A MPEG4 16 port video encoder / decoder
+ 4e04 BC-04120A 4 port MPEG4 video encoder / decoder
+ 4e09 BC-08240A 8 port MPEG4 video encoder / decoder
+ 4e10 BC-16480A 16 port MPEG4 video encoder / decoder
+ 5304 BC-H04120A 4 port H.264 video and audio encoder / decoder
+ 5308 BC-H08240A 8 port H.264 video and audio encoder / decoder
+ 5310 BC-H16480A 16 port H.264 video and audio encoder / decoder
+1bb5 Quantenna Communications, Inc.
+1bf4 VTI Instruments Corporation
+1c1c Symphony
+ 0001 82C101
+1d44 DPT
+ a400 PM2x24/PM3224
+1de1 Tekram Technology Co.,Ltd.
+ 0391 TRM-S1040
+ 2020 DC-390
+ 690c 690c
+ dc29 DC290
+# nee Tumsan Oy
+1fc0 Ascom (Finland) Oy
+ 0300 E2200 Dual E1/Rawpipe Card
+ 0301 C5400 SHDSL/E1 Card
+# nee PathScale, Inc
+1fc1 QLogic, Corp.
+ 000d IBA6110 InfiniBand HCA
+ 0010 IBA6120 InfiniBand HCA
+1fc9 Tehuti Networks Ltd.
+ 3009 10-Giga TOE SmartNIC
+ 3010 10-Giga TOE SmartNIC
+ 0000 3002 10-Giga TOE Single Port XFP SmartNIC
+ 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC
+ 0000 3008 10-Giga TOE Single Port CX4 SmartNIC
+ 3014 10-Giga TOE SmartNIC 2-Port
+ 0000 3003 10-Giga TOE Dual Port XFP Low Profile SmartNIC
+ 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC
+ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC
+ 3110 10-Giga TOE Single Port SmartNIC
+ 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC
+ 3114 10-Giga TOE Dual Port Low Profile SmartNIC
+ 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC
+ 0000 3011 10-Giga TOE Dual Port SFP+/CX4 Low Profile SmartNIC
+ 0000 3012 10-Giga TOE Dual Port CX4/SFP+ Low Profile SmartNIC
+ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC
+ 3310 10-Giga TOE SFP+ Single Port SmartNIC
+ 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC
+ 3314 10-Giga TOE Dual Port Low Profile SmartNIC
+ 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC
+ 0000 3011 10-Giga TOE Dual Port SFP+/CX4 Low Profile SmartNIC
+ 0000 3012 10-Giga TOE Dual Port CX4/SFP+ Low Profile SmartNIC
+ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC
+1fce Cognio Inc.
+ 0001 Spectrum Analyzer PC Card (SAgE)
+1fd4 SUNIX Co., Ltd.
+ 0001 Matrix multiport serial adapter
+2000 Smart Link Ltd.
+ 2800 SmartPCI2800 V.92 PCI Soft DFT
+2001 Temporal Research Ltd
+2003 Smart Link Ltd.
+ 8800 LM-I56N
+2004 Smart Link Ltd.
+2116 ZyDAS Technology Corp.
+21c3 21st Century Computer Corp.
+# (Probably only the Mobile Phone Division)
+22b8 Motorola, Inc.
+2304 Colorgraphic Communications Corp.
+2348 Racore
+ 2010 8142 100VG/AnyLAN
+2646 Kingston Technologies
+270b Xantel Corporation
+270f Chaintech Computer Co. Ltd
+2711 AVID Technology Inc.
+29b4 82q35 Express MEI Controller
+2a15 3D Vision(???)
+3000 Hansol Electronics Inc.
+3142 Post Impression Systems.
+3388 Hint Corp
+ 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller
+ 0014 HiNT HC4 PCI to ISDN bridge, Network controller
+ 0020 HB6 Universal PCI-PCI bridge (transparent mode)
+ 0021 HB6 Universal PCI-PCI bridge (non-transparent mode)
+ 1775 c200 C2K CompactPCI interface bridge
+ 1775 ce90 CE9
+ 4c53 1050 CT7 mainboard
+ 4c53 1080 CT8 mainboard
+ 4c53 1090 Cx9 mainboard
+ 4c53 10a0 CA3/CR3 mainboard
+ 4c53 3010 PPCI mezzanine (32-bit PMC)
+ 4c53 3011 PPCI mezzanine (64-bit PMC)
+ 4c53 4000 PMCCARR1 carrier board
+ 0022 HiNT HB4 PCI-PCI Bridge (PCI6150)
+ 0026 HB2 PCI-PCI Bridge
+ 1018 Audiotrak INCA88
+ 1019 Miditrak 2120
+ 101a E.Band [AudioTrak Inca88]
+ 101b E.Band [AudioTrak Inca88]
+ 8011 VXPro II Chipset
+ 3388 8011 VXPro II Chipset CPU to PCI Bridge
+ 8012 VXPro II Chipset
+ 3388 8012 VXPro II Chipset PCI to ISA Bridge
+ 8013 VXPro II IDE
+ 3388 8013 VXPro II Chipset EIDE Controller
+ a103 Blackmagic Design DeckLink HD Pro
+3411 Quantum Designs (H.K.) Inc
+3442 Bihl+Wiedemann GmbH
+ 1783 AS-i 3.0 cPCI Master
+ 1922 AS-i 3.0 PCI Master
+3475 Arastra Inc.
+3513 ARCOM Control Systems Ltd
+3842 eVga.com. Corp.
+38ef 4Links
+3d3d 3DLabs
+ 0001 GLINT 300SX
+ 0002 GLINT 500TX
+ 0000 0000 GLoria L
+ 0003 GLINT Delta
+ 0000 0000 GLoria XL
+ 0004 Permedia
+ 0005 Permedia
+ 0006 GLINT MX
+ 0000 0000 GLoria XL
+ 1048 0a42 GLoria XXL
+ 0007 3D Extreme
+ 0008 GLINT Gamma G1
+ 1048 0a42 GLoria XXL
+ 0009 Permedia II 2D+3D
+ 1040 0011 AccelStar II
+ 1048 0a42 GLoria XXL
+ 13e9 1000 6221L-4U
+ 3d3d 0100 AccelStar II 3D Accelerator
+ 3d3d 0111 Permedia 3:16
+ 3d3d 0114 Santa Ana
+ 3d3d 0116 Oxygen GVX1
+ 3d3d 0119 Scirocco
+ 3d3d 0120 Santa Ana PCL
+ 3d3d 0125 Oxygen VX1
+ 3d3d 0127 Permedia3 Create!
+ 000a GLINT R3
+ 3d3d 0121 Oxygen VX1
+ 000c GLINT R3 [Oxygen VX1]
+ 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4]
+ 000d GLint R4 rev A
+ 000e GLINT Gamma G2
+ 0011 GLint R4 rev B
+ 0012 GLint R5 rev A
+ 0013 GLint R5 rev B
+ 0020 VP10 visual processor
+ 0022 VP10 visual processor
+ 0024 VP9 visual processor
+ 002c Wildcat Realizm 100/200
+ 0030 Wildcat Realizm 800
+ 0032 Wildcat Realizm 500
+ 0100 Permedia II 2D+3D
+ 07a1 Wildcat III 6210
+ 07a2 Sun XVR-500 Graphics Accelerator
+ 07a3 Wildcat IV 7210
+ 1004 Permedia
+ 3d04 Permedia
+ ffff Glint VGA
+4005 Avance Logic Inc.
+ 0300 ALS300 PCI Audio Device
+ 0308 ALS300+ PCI Audio Device
+ 0309 PCI Input Controller
+ 1064 ALG-2064
+ 2064 ALG-2064i
+ 2128 ALG-2364A GUI Accelerator
+ 2301 ALG-2301
+ 2302 ALG-2302
+ 2303 AVG-2302 GUI Accelerator
+ 2364 ALG-2364A
+ 2464 ALG-2464
+ 2501 ALG-2564A/25128A
+ 4000 ALS4000 Audio Chipset
+ 4005 4000 ALS4000 Audio Chipset
+ 4710 ALC200/200P
+4033 Addtron Technology Co, Inc.
+ 1360 RTL8139 Ethernet
+4040 NetXen Incorporated
+ 0001 NXB-10GXSR 10-Gigabit Ethernet PCIe Adapter with SR-XFP optical interface
+ 103c 7047 NC510F PCIe 10-Gigabit Server Adapter
+ 0002 NXB-10GCX4 10-Gigabit Ethernet PCIe Adapter with CX4 copper interface
+ 103c 7048 NC510c PCIe 10-Gigabit Server Adapter
+ 0003 NXB-4GCU Quad Gigabit Ethernet PCIe Adapter with 1000-BASE-T interface
+ 0004 BladeCenter-H 10-Gigabit Ethernet High Speed Daughter Card
+ 0005 NetXen Dual Port 10GbE Multifunction Adapter for c-Class
+ 103c 170e NC512m Dual Port 10GbE Multifunction BL-C Adapter
+ 0024 XG Mgmt
+ 0025 XG Mgmt
+ 0100 NX3031 Multifunction 1/10-Gigabit Server Adapter
+ 103c 171b NC522m Dual Port 10GbE Multifunction BL-c Adapter
+ 103c 1740 NC375T PCI Express Quad Port Gigabit Server Adapter
+ 103c 3251 NC375i 1G w/NC524SFP 10G Module
+ 103c 705a NC375i Integrated Quad Port Multifunction Gigabit Server Adapter
+ 103c 705b NC522SFP Dual Port 10GbE Server Adapter
+ 152d 896b TG20 Dual Port 10GbE Server/Storage Adapter
+ 4040 0124 NX3031 Quad Port Gigabit Server Adapter
+ 4040 0126 Dual Port SFP+ 10GbE Server Adapter
+4143 Digital Equipment Corp
+4144 Alpha Data
+ 0044 ADM-XRCIIPro
+4150 ONA Electroerosion
+ 0001 PCI32TLITE FILSTRUP1 PCI to VME Bridge Controller
+ 0006 PCI32TLITE UART 16550 Opencores
+ 0007 PCI32TLITE CAN Controller Opencores
+415a Auzentech, Inc.
+416c Aladdin Knowledge Systems
+ 0100 AladdinCARD
+ 0200 CPC
+4321 Tata Power Strategic Electronics Division
+434e CAST Navigation LLC
+4444 Internext Compression Inc
+ 0016 iTVC16 (CX23416) MPEG-2 Encoder
+ 0070 0003 WinTV PVR 250
+ 0070 0009 WinTV PVR 150
+ 0070 0801 WinTV PVR 150
+ 0070 0807 WinTV PVR 150
+ 0070 4001 WinTV PVR 250
+ 0070 4009 WinTV PVR 250
+ 0070 4801 WinTV PVR 250
+ 0070 4803 WinTV PVR 250
+ 0070 8003 WinTV PVR 150
+ 0070 8801 WinTV PVR 150
+ 0070 c801 WinTV PVR 150
+ 0070 e807 WinTV PVR 500 (1st unit)
+ 0070 e817 WinTV PVR 500 (2nd unit)
+ 0070 ff92 WiNTV PVR-550
+ 0270 0801 WinTV PVR 150
+ 104d 013d ENX-26 TV Encoder
+ 10fc d038 GV-MVP/RX2W (1st unit)
+ 10fc d039 GV-MVP/RX2W (2nd unit)
+ 12ab fff3 MPG600
+ 12ab ffff MPG600
+ 1461 c00a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK3 tuner)
+ 1461 c00b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK3 tuner)
+ 1461 c00c M113 PCI Analog TV (NTSC, JAPAN version, Philips FI1286MK2 tuner)
+ 1461 c010 M113 PCI Analog TV (NTSC, Philips FI1236MK3 tuner)
+ 1461 c011 M113 PCI Analog TV (NTSC+FM, Philips FM1236MK3 tuner)
+ 1461 c018 M113 PCI Analog TV (NTSC, Philips FQ1236MK5 tuner)
+ 1461 c019 UltraTV 1500 MCE, a.k.a. M113 PCI Analog TV (NTSC+FM, Philips FQ1236MK5 tuner)
+ 1461 c01a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK5 tuner)
+ 1461 c01b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK5 tuner)
+ 1461 c030 M113 PCI Analog TV (NTSC-J, Partsnic tuner)
+ 1461 c031 M113 PCI Analog TV (NTSC-J+FM, Partsnic tuner)
+ 1461 c032 M113 PCI Analog TV (PAL/SECAM, Partsnic tuner)
+ 1461 c033 M113 PCI Analog TV (PAL/SECAM+FM, Partsnic tuner)
+ 1461 c034 M113 PCI Analog TV (NTSC, Partsnic tuner)
+ 1461 c035 M113 PCI Analog TV (NTSC+FM, Partsnic tuner)
+ 1461 c03f C115 PCI video capture card (no tuner)
+ 1461 c136 M104 mini-PCI Analog TV
+ 1461 c20a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK3 tuner)
+ 1461 c218 M755 AVerTV Video Capture (NTSC, Philips FQ1236MK5 tuner)
+ 1461 c219 M755 AVerTV Video Capture (NTSC+FM, Philips FQ1236MK5 tuner)
+ 1461 c21a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK5 tuner)
+ 1461 c21b M755 AVerTV Video Capture (PAL/SECAM+FM, Philips FM1216MK5 tuner)
+ 1461 c230 M755 AVerTV Video Capture (NTSC-J, Partsnic tuner)
+ 1461 c231 M755 AVerTV Video Capture (NTSC-J+FM, Partsnic tuner)
+ 1461 c232 M755 AVerTV Video Capture (PAL/SECAM, Partsnic tuner)
+ 1461 c233 M755 AVerTV Video Capture (PAL/SECAM+FM, Partsnic tuner)
+ 1461 c234 M755 AVerTV Video Capture (NTSC, Partsnic tuner)
+ 1461 c235 M755 AVerTV Video Capture (NTSC+FM, Partsnic tuner)
+ 1461 c337 E106 AVerMedia AVerTV Video Capture
+ 1461 c439 M116 AVerMedia AVerTV MCE 116 Plus (NTSC/PAL/SECAM+FM+REMOTE, Xceive 2028 tuner)
+ 1461 c5ff C755 AVerTV Video Capture card (no tuner)
+ 1461 c6ff C115 PCI video capture card (no tuner)
+ 1461 c739 M785 AVerMedia PCI Analog TV (NTSC/PAL/SECAM+FM, Xceive 2028 tuner)
+ 9005 0092 VideOh! AVC-2010
+ 9005 0093 VideOh! AVC-2410
+ 0803 iTVC15 MPEG-2 Encoder
+ 0070 4000 WinTV PVR-350
+ 0070 4001 WinTV PVR-250
+ 0070 4800 WinTV PVR-350 (V1)
+ 12ab 0000 MPG160
+ 1461 a3ce M179
+ 1461 a3cf M179
+4468 Bridgeport machines
+4594 Cogetec Informatique Inc
+45fb Baldor Electric Company
+4624 Budker Institute of Nuclear Physics
+ adc1 ADC200ME High speed ADC
+ de01 DL200ME High resolution delay line PCI based card
+ de02 DL200ME Middle resolution delay line PCI based card
+4680 Umax Computer Corp
+4843 Hercules Computer Technology Inc
+4916 RedCreek Communications Inc
+ 1960 RedCreek PCI adapter
+4943 Growth Networks
+494f ACCES I/O Products, Inc.
+ 0520 PCI-IDO-48
+ 0920 PCI-IDI-48
+ 0c50 PCI-DIO-24H
+ 0c51 PCI-DIO-24D
+ 0c60 PCI-DIO-48(H)
+ 0c68 PCI-DIO-72
+ 0c70 PCI-DIO-96
+ 0c78 PCI-DIO-120
+ 0dc8 PCI-IDIO-16
+ 0e50 PCI-DIO-24S
+ 0e51 PCI-DIO-24H(C)
+ 0e52 PCI-DIO-24D(C)
+ 0e60 PCI-DIO-48S(H)
+ 0e61 P104-DIO-24S
+ 0f00 PCI-IIRO-8
+ 0f01 LPCI-IIRO-8
+ 0f08 PCI-IIRO-16
+ 1050 PCI-422/485-2
+ 1058 PCI-COM422/4
+ 1059 PCI-COM485/4
+ 1068 PCI-COM422/8
+ 1069 PCI-COM485/8
+ 1088 PCI-COM232/1
+ 1090 PCI-COM232/2
+ 10a8 P104-COM232-8
+ 10c9 PCI-COM-1S
+ 10d0 PCI-COM2S
+ 10e8 PCI-COM-8SM
+ 1148 PCI-ICM-1S
+ 1150 PCI-ICM-2S
+ 1158 PCI-ICM422/4
+ 1159 PCI-ICM485/4
+ 1250 PCI-WDG-2S
+ 12d0 PCI-WDG-IMPAC
+ 22c0 PCI-WDG-CSM
+ 2c50 PCI-DIO-96CT
+ 2c58 PCI-DIO-96C3
+ 5ed0 PCI-DAC
+ 6c90 PCI-DA12-2
+ 6c98 PCI-DA12-4
+ 6ca0 PCI-DA12-6
+ 6ca8 PCI-DA12-8
+ 6ca9 PCI-DA12-8V
+ 6cb0 PCI-DA12-16
+ 6cb1 PCI-DA12-16V
+ 8ef0 P104-FAS16-16
+ aca8 PCI-AI12-16
+ aca9 PCI-AI12-16A
+ eca8 PCI-AIO12-16
+ eca9 PCI-A12-16
+ ecaa PCI-A12-16A
+ ece8 PCI-A16-16
+4978 Axil Computer Inc
+4a14 NetVin
+ 5000 NV5000SC
+ 4a14 5000 RT8029-Based Ethernet Adapter
+4b10 Buslogic Inc.
+4c48 LUNG HWA Electronics
+4c53 SBS Technologies
+ 0000 PLUSTEST device
+ 4c53 3000 PLUSTEST card (PC104+)
+ 4c53 3001 PLUSTEST card (PMC)
+ 0001 PLUSTEST-MM device
+ 4c53 3002 PLUSTEST-MM card (PMC)
+4ca1 Seanix Technology Inc
+4d51 MediaQ Inc.
+ 0200 MQ-200
+4d54 Microtechnica Co Ltd
+4d56 MATRIX VISION GmbH
+ 0000 [mvHYPERION-CLe/CLb] CameraLink PCI Express x1 Frame Grabber
+ 0001 [mvHYPERION-CLf/CLm] CameraLink PCI Express x4 Frame Grabber
+ 0010 [mvHYPERION-16R16/-32R16] 16 Video Channel PCI Express x4 Frame Grabber
+ 0020 [mvHYPERION-HD-SDI] HD-SDI PCI Express x4 Frame Grabber
+ 0030 [mvHYPERION-HD-SDI-Merger] HD-SDI PCI Express x4 Frame Grabber
+4ddc ILC Data Device Corp
+ 0100 DD-42924I5-300 (ARINC 429 Data Bus)
+ 0801 BU-65570I1 MIL-STD-1553 Test and Simulation
+ 0802 BU-65570I2 MIL-STD-1553 Test and Simulation
+ 0811 BU-65572I1 MIL-STD-1553 Test and Simulation
+ 0812 BU-65572I2 MIL-STD-1553 Test and Simulation
+ 0881 BU-65570T1 MIL-STD-1553 Test and Simulation
+ 0882 BU-65570T2 MIL-STD-1553 Test and Simulation
+ 0891 BU-65572T1 MIL-STD-1553 Test and Simulation
+ 0892 BU-65572T2 MIL-STD-1553 Test and Simulation
+ 0901 BU-65565C1 MIL-STD-1553 Data Bus
+ 0902 BU-65565C2 MIL-STD-1553 Data Bus
+ 0903 BU-65565C3 MIL-STD-1553 Data Bus
+ 0904 BU-65565C4 MIL-STD-1553 Data Bus
+ 0b01 BU-65569I1 MIL-STD-1553 Data Bus
+ 0b02 BU-65569I2 MIL-STD-1553 Data Bus
+ 0b03 BU-65569I3 MIL-STD-1553 Data Bus
+ 0b04 BU-65569I4 MIL-STD-1553 Data Bus
+5045 University of Toronto
+ 4243 BLASTbus PCI Interface Card v1
+5046 GemTek Technology Corporation
+ 1001 PCI Radio
+5053 Voyetra Technologies
+ 2010 Daytona Audio Adapter
+50b2 TerraTec Electronic GmbH
+ 1111 Terratec XLerate
+5136 S S Technologies
+5143 Qualcomm Inc
+5145 Ensoniq (Old)
+ 3031 Concert AudioPCI
+5168 Animation Technologies Inc.
+ 0300 FlyDVB-S
+ 0301 FlyDVB-T
+5301 Alliance Semiconductor Corp.
+ 0001 ProMotion aT3D
+5333 S3 Inc.
+ 0551 Plato/PX (system)
+ 5631 86c325 [ViRGE]
+ 8800 86c866 [Vision 866]
+ 8801 86c964 [Vision 964]
+ 8810 86c764_0 [Trio 32 vers 0]
+ 8811 86c764/765 [Trio32/64/64V+]
+ 8812 86cM65 [Aurora64V+]
+ 8813 86c764_3 [Trio 32/64 vers 3]
+ 8814 86c767 [Trio 64UV+]
+ 8815 86cM65 [Aurora 128]
+ 883d 86c988 [ViRGE/VX]
+ 8870 FireGL
+ 8880 86c868 [Vision 868 VRAM] vers 0
+ 8881 86c868 [Vision 868 VRAM] vers 1
+ 8882 86c868 [Vision 868 VRAM] vers 2
+ 8883 86c868 [Vision 868 VRAM] vers 3
+ 88b0 86c928 [Vision 928 VRAM] vers 0
+ 88b1 86c928 [Vision 928 VRAM] vers 1
+ 88b2 86c928 [Vision 928 VRAM] vers 2
+ 88b3 86c928 [Vision 928 VRAM] vers 3
+ 88c0 86c864 [Vision 864 DRAM] vers 0
+ 88c1 86c864 [Vision 864 DRAM] vers 1
+ 88c2 86c864 [Vision 864-P DRAM] vers 2
+ 88c3 86c864 [Vision 864-P DRAM] vers 3
+ 88d0 86c964 [Vision 964 VRAM] vers 0
+ 88d1 86c964 [Vision 964 VRAM] vers 1
+ 88d2 86c964 [Vision 964-P VRAM] vers 2
+ 88d3 86c964 [Vision 964-P VRAM] vers 3
+ 88f0 86c968 [Vision 968 VRAM] rev 0
+ 88f1 86c968 [Vision 968 VRAM] rev 1
+ 88f2 86c968 [Vision 968 VRAM] rev 2
+ 88f3 86c968 [Vision 968 VRAM] rev 3
+ 8900 86c755 [Trio 64V2/DX]
+ 5333 8900 86C775 Trio64V2/DX
+ 8901 86c775/86c785 [Trio 64V2/DX or /GX]
+ 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX
+ 8902 Plato/PX
+ 8903 Trio 3D business multimedia
+ 8904 86c365, 86c366 [Trio 3D]
+ 1014 00db Integrated Trio3D
+ 4843 314a Terminator 128/3D GLH
+ 5333 8904 86C365 Trio3D AGP
+ 8905 Trio 64V+ family
+ 8906 Trio 64V+ family
+ 8907 Trio 64V+ family
+ 8908 Trio 64V+ family
+ 8909 Trio 64V+ family
+ 890a Trio 64V+ family
+ 890b Trio 64V+ family
+ 890c Trio 64V+ family
+ 890d Trio 64V+ family
+ 890e Trio 64V+ family
+ 890f Trio 64V+ family
+ 8a01 86c375 [ViRGE/DX] or 86c385 [ViRGE/GX]
+ 0e11 b032 ViRGE/GX
+ 10b4 1617 Nitro 3D
+ 10b4 1717 Nitro 3D
+ 5333 8a01 ViRGE/DX
+ 8a10 ViRGE/GX2
+ 1092 8a10 Stealth 3D 4000
+ 8a13 86c360 [Trio 3D/1X], 86c362, 86c368 [Trio 3D/2X]
+ 5333 8a13 Trio3D/2X
+ 8a20 86c794 [Savage 3D]
+ 5333 8a20 86C391 Savage3D
+ 8a21 86c390 [Savage 3D/MV]
+ 5333 8a21 86C390 Savage3D/MV
+ 8a22 Savage 4
+ 1033 8068 Savage 4
+ 1033 8069 Savage 4
+ 1033 8110 Savage 4 LT
+ 105d 0018 SR9 8Mb SDRAM
+ 105d 002a SR9 Pro 16Mb SDRAM
+ 105d 003a SR9 Pro 32Mb SDRAM
+ 105d 092f SR9 Pro+ 16Mb SGRAM
+ 1092 4207 Stealth III S540
+ 1092 4800 Stealth III S540
+ 1092 4807 SpeedStar A90
+ 1092 4808 Stealth III S540
+ 1092 4809 Stealth III S540
+ 1092 480e Stealth III S540
+ 1092 4904 Stealth III S520
+ 1092 4905 SpeedStar A200
+ 1092 4a09 Stealth III S540
+ 1092 4a0b Stealth III S540 Xtreme
+ 1092 4a0f Stealth III S540
+ 1092 4e01 Stealth III S540
+ 1102 101d 3d Blaster Savage 4
+ 1102 101e 3d Blaster Savage 4
+ 5333 8100 86C394-397 Savage4 SDRAM 100
+ 5333 8110 86C394-397 Savage4 SDRAM 110
+ 5333 8125 86C394-397 Savage4 SDRAM 125
+ 5333 8143 86C394-397 Savage4 SDRAM 143
+ 5333 8a22 86C394-397 Savage4
+ 5333 8a2e 86C394-397 Savage4 32bit
+ 5333 9125 86C394-397 Savage4 SGRAM 125
+ 5333 9143 86C394-397 Savage4 SGRAM 143
+ 8a23 Savage 4
+ 8a25 ProSavage PM133
+ 0303 0303 D9840-60001 [Brio BA410 Motherboard]
+ 8a26 ProSavage KM133
+ 8c00 ViRGE/M3
+ 8c01 ViRGE/MX
+ 1179 0001 ViRGE/MX
+ 8c02 ViRGE/MX+
+ 8c03 ViRGE/MX+MV
+ 8c10 86C270-294 Savage/MX-MV
+ 8c11 82C270-294 Savage/MX
+ 8c12 86C270-294 Savage/IX-MV
+ 1014 017f ThinkPad T20/T22
+ 1179 0001 86C584 SuperSavage/IXC Toshiba
+ 8c13 86C270-294 Savage/IX
+ 1179 0001 Magnia Z310
+ 8c22 SuperSavage MX/128
+ 8c24 SuperSavage MX/64
+ 8c26 SuperSavage MX/64C
+ 8c2a SuperSavage IX/128 SDR
+ 8c2b SuperSavage IX/128 DDR
+ 8c2c SuperSavage IX/64 SDR
+ 8c2d SuperSavage IX/64 DDR
+ 8c2e SuperSavage IX/C SDR
+ 1014 01fc ThinkPad T23
+ 8c2f SuperSavage IX/C DDR
+ 8d01 86C380 [ProSavageDDR K4M266]
+ 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)
+ 8d03 VT8751 [ProSavageDDR P4M266]
+ 8d04 VT8375 [ProSavage8 KM266/KL266]
+ 8e40 2300E Graphics Processor
+ 8e48 Chrome S27 PCIE
+ 5333 0130 Chrome S27 256M DDR2
+ 9102 86C410 Savage 2000
+ 1092 5932 Viper II Z200
+ 1092 5934 Viper II Z200
+ 1092 5952 Viper II Z200
+ 1092 5954 Viper II Z200
+ 1092 5a35 Viper II Z200
+ 1092 5a37 Viper II Z200
+ 1092 5a55 Viper II Z200
+ 1092 5a57 Viper II Z200
+ ca00 SonicVibes
+5431 AuzenTech, Inc.
+544c Teralogic Inc
+ 0350 TL880-based HDTV/ATSC tuner
+5452 SCANLAB AG
+ 3443 RTC4
+5455 Technische University Berlin
+ 4458 S5933
+5456 GoTView
+5519 Cnet Technologies, Inc.
+5544 Dunord Technologies
+ 0001 I-30xx Scanner Interface
+5555 Genroco, Inc
+ 0003 TURBOstor HFP-832 [HiPPI NIC]
+5646 Vector Fabrics BV
+5654 VoiceTronix Pty Ltd
+5700 Netpower
+584d AuzenTech Co., Ltd.
+5851 Exacq Technologies
+5853 XenSource, Inc.
+ 0001 Xen Platform Device
+# Virtual device surfaced in guests to provide HID events.
+ c110 Virtualized HID
+# Device surfaced in guests to provide 2d graphics capabilities
+ c147 Virtualized Graphics Device
+5854 GoTView
+5ace Beholder International Ltd.
+631c SmartInfra Ltd
+ 1652 PXI-1652 Signal Generator
+ 2504 PXI-2504 Signal Interrogator
+6356 UltraStor
+6374 c't Magazin fuer Computertechnik
+ 6773 GPPCI
+6409 Logitec Corp.
+6549 Teradici Corp.
+ 1200 TERA1200 PC-over-IP Host
+6666 Decision Computer International Co.
+ 0001 PCCOM4
+ 0002 PCCOM8
+ 0004 PCCOM2
+ 0101 PCI 8255/8254 I/O Card
+ 0200 12-bit AD/DA Card
+ 0201 14-bit AD/DA Card
+ 1011 Industrial Card
+ 1021 8 photo couple 8 relay Card
+ 1022 4 photo couple 4 relay Card
+ 1025 16 photo couple 16 relay Card
+ 4000 WatchDog Card
+6739 RV 940 [Barts Pro]
+# nee Qumranet
+6900 Red Hat, Inc.
+7063 pcHDTV
+ 2000 HD-2000
+ 3000 HD-3000
+ 5500 HD5500 HDTV
+7284 HT OMEGA Inc.
+7604 O.N. Electronic Co Ltd.
+7bde MIDAC Corporation
+7fed PowerTV
+8008 Quancom Electronic GmbH
+ 0010 WDOG1 [PCI-Watchdog 1]
+ 0011 PWDOG2 [PCI-Watchdog 2]
+ 0015 Clock77/PCI & Clock77/PCIe (DCF-77 receiver)
+# Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card.
+807d Asustek Computer, Inc.
+8086 Intel Corporation
+ 0007 82379AB
+ 0008 Extended Express System Support Controller
+ 0039 21145 Fast Ethernet
+ 0040 Core Processor DRAM Controller
+ 0041 Core Processor PCI Express x16 Root Port
+ 0042 Core Processor Integrated Graphics Controller
+ 0043 Core Processor Secondary PCI Express Root Port
+ 0044 Core Processor DRAM Controller
+ 1025 0347 Aspire 7740G
+ e4bf 50c1 PC1-GROOVE
+ 0045 Core Processor PCI Express x16 Root Port
+ 0046 Core Processor Integrated Graphics Controller
+ e4bf 50c1 PC1-GROOVE
+ 0047 Core Processor Secondary PCI Express Root Port
+ 0048 Core Processor DRAM Controller
+ 0049 Core Processor PCI Express x16 Root Port
+ 004a Core Processor Integrated Graphics Controller
+ 004b Core Processor Secondary PCI Express Root Port
+ 0050 Core Processor Thermal Management Controller
+ 0069 Core Processor DRAM Controller
+ 0082 Centrino Advanced-N 6205
+ 8086 1301 Centrino Advanced-N 6205 AGN
+ 8086 1306 Centrino Advanced-N 6205 ABG
+ 8086 1307 Centrino Advanced-N 6205 BG
+ 8086 1321 Centrino Advanced-N 6205 AGN
+ 8086 1326 Centrino Advanced-N 6205 ABG
+ 0083 Centrino Wireless-N 1000
+ 8086 1205 Centrino Wireless-N 1000 BGN
+ 8086 1206 Centrino Wireless-N 1000 BG
+ 8086 1225 Centrino Wireless-N 1000 BGN
+ 8086 1226 Centrino Wireless-N 1000 BG
+ 8086 1305 Centrino Wireless-N 1000 BGN
+ 8086 1306 Centrino Wireless-N 1000 BG
+ 8086 1325 Centrino Wireless-N 1000 BGN
+ 8086 1326 Centrino Wireless-N 1000 BG
+ 0084 Centrino Wireless-N 1000
+ 8086 1215 Centrino Wireless-N 1000 BGN
+ 8086 1216 Centrino Wireless-N 1000 BG
+ 8086 1315 Centrino Wireless-N 1000 BGN
+ 8086 1316 Centrino Wireless-N 1000 BG
+ 0085 Centrino Advanced-N 6205
+ 8086 1311 Centrino Advanced-N 6205 AGN
+ 8086 1316 Centrino Advanced-N 6205 ABG
+ 0087 Centrino Advanced-N + WiMAX 6250
+ 8086 1301 Centrino Advanced-N + WiMAX 6250 2x2 AGN
+ 8086 1306 Centrino Advanced-N + WiMAX 6250 2x2 ABG
+ 8086 1321 Centrino Advanced-N + WiMAX 6250 2x2 AGN
+ 8086 1326 Centrino Advanced-N + WiMAX 6250 2x2 ABG
+ 0089 Centrino Advanced-N + WiMAX 6250
+ 8086 1311 Centrino Advanced-N + WiMAX 6250 2x2 AGN
+ 8086 1316 Centrino Advanced-N + WiMAX 6250 2x2 ABG
+ 008a Centrino Wireless-N 1030
+ 8086 5305 Centrino Wireless-N 1030 BGN
+ 8086 5307 Centrino Wireless-N 1030 BG
+ 8086 5325 Centrino Wireless-N 1030 BGN
+ 8086 5327 Centrino Wireless-N 1030 BG
+ 008b Centrino Wireless-N 1030
+ 8086 5315 Centrino Wireless-N 1030 BGN
+ 8086 5317 Centrino Wireless-N 1030 BG
+ 0090 Centrino Advanced-N 6230
+ 8086 5211 Centrino Advanced-N 6230 AGN
+ 8086 5215 Centrino Advanced-N 6230 BGN
+ 8086 5216 Centrino Advanced-N 6230 ABG
+ 0091 Centrino Advanced-N 6230
+ 8086 5201 Centrino Advanced-N 6230 AGN
+ 8086 5205 Centrino Advanced-N 6230 BGN
+ 8086 5206 Centrino Advanced-N 6230 ABG
+ 8086 5207 Centrino Advanced-N 6230 BG
+ 8086 5221 Centrino Advanced-N 6230 AGN
+ 8086 5225 Centrino Advanced-N 6230 BGN
+ 8086 5226 Centrino Advanced-N 6230 ABG
+ 0100 2nd Generation Core Processor Family DRAM Controller
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 0101 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 0102 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0104 2nd Generation Core Processor Family DRAM Controller
+ 0105 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 0106 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0108 Xeon E3-1200 Processor Family DRAM Controller
+ 0109 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 010a Xeon E3-1200 Processor Family Integrated Graphics Controller
+ 010b Xeon E3-1200/2nd Generation Core Processor Family Integrated Graphics Controller
+ 010c Xeon E3-1200/2nd Generation Core Processor Family DRAM Controller
+ 010d Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
+ 010e Xeon E3-1200/2nd Generation Core Processor Family Integrated Graphics Controller
+ 0112 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0116 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0122 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0126 2nd Generation Core Processor Family Integrated Graphics Controller
+ 0150 Ivy Bridge DRAM Controller
+ 0151 Ivy Bridge PCI Express Root Port
+ 0152 Ivy Bridge Graphics Controller
+ 0154 Ivy Bridge DRAM Controller
+ 0155 Ivy Bridge PCI Express Root Port
+ 0156 Ivy Bridge Graphics Controller
+ 0158 Ivy Bridge DRAM Controller
+ 0159 Ivy Bridge PCI Express Root Port
+ 015a Ivy Bridge Graphics Controller
+ 015c Ivy Bridge DRAM Controller
+ 015d Ivy Bridge PCI Express Root Port
+ 015e Ivy Bridge Graphics Controller
+ 0309 80303 I/O Processor PCI-to-PCI Bridge
+ 030d 80312 I/O Companion Chip PCI-to-PCI Bridge
+ 0326 6700/6702PXH I/OxAPIC Interrupt Controller A
+ 1775 1100 CR11/VR11 Single Board Computer
+ 0327 6700PXH I/OxAPIC Interrupt Controller B
+ 1775 1100 CR11/VR11 Single Board Computer
+ 0329 6700PXH PCI Express-to-PCI Bridge A
+ 032a 6700PXH PCI Express-to-PCI Bridge B
+ 032c 6702PXH PCI Express-to-PCI Bridge A
+ 0330 80332 [Dobson] I/O processor (A-Segment Bridge)
+ 0331 80332 [Dobson] I/O processor (A-Segment IOAPIC)
+ 0332 80332 [Dobson] I/O processor (B-Segment Bridge)
+ 0333 80332 [Dobson] I/O processor (B-Segment IOAPIC)
+ 0334 80332 [Dobson] I/O processor (ATU)
+ 0335 80331 [Lindsay] I/O processor (PCI-X Bridge)
+ 0336 80331 [Lindsay] I/O processor (ATU)
+ 0340 41210 [Lanai] Serial to Parallel PCI Bridge (A-Segment Bridge)
+ 0341 41210 [Lanai] Serial to Parallel PCI Bridge (B-Segment Bridge)
+ 0370 80333 Segment-A PCI Express-to-PCI Express Bridge
+ 0371 80333 A-Bus IOAPIC
+ 0372 80333 Segment-B PCI Express-to-PCI Express Bridge
+ 0373 80333 B-Bus IOAPIC
+ 0374 80333 Address Translation Unit
+ 0436 DH89xxCC Gigabit SGMII Connection
+ 0438 DH8900CC Series Gigabit Network Connection
+ 043a DH8900CC Series Gigabit Fiber Network Connection
+ 043c DH8900CC Series Gigabit Backplane Network Connection
+ 0440 DH8900CC Series Gigabit SFP Network Connection
+ 0482 82375EB/SB PCI to EISA Bridge
+ 0483 82424TX/ZX [Saturn] CPU to PCI bridge
+ 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge
+ 0486 82425EX/ZX [Aries] PCIset with ISA bridge
+ 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge
+ 04d0 82437FX [Triton FX]
+ 0500 E8870 Processor bus control
+ 0501 E8870 Memory controller
+# and registers common to both SPs
+ 0502 E8870 Scalability Port 0
+# and global performance monitoring
+ 0503 E8870 Scalability Port 1
+ 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port)
+ 0511 E8870IO Hub Interface Port 1 registers
+ 0512 E8870IO Hub Interface Port 2 registers
+ 0513 E8870IO Hub Interface Port 3 registers
+ 0514 E8870IO Hub Interface Port 4 registers
+ 0515 E8870IO General SIOH registers
+ 0516 E8870IO RAS registers
+ 0530 E8870SP Scalability Port 0 registers
+ 0531 E8870SP Scalability Port 1 registers
+ 0532 E8870SP Scalability Port 2 registers
+ 0533 E8870SP Scalability Port 3 registers
+ 0534 E8870SP Scalability Port 4 registers
+ 0535 E8870SP Scalability Port 5 registers
+# (bi-interleave 0) and global registers that are neither per-port nor per-interleave
+ 0536 E8870SP Interleave registers 0 and 1
+# (bi-interleave 1)
+ 0537 E8870SP Interleave registers 2 and 3
+ 0600 RAID Controller
+ 8086 0136 SRCU31L
+ 8086 01af SRCZCR
+ 8086 01c1 ICP Vortex GDT8546RZ
+ 8086 01f7 SCRU32
+# uninitialized SRCU32 RAID Controller
+ 061f 80303 I/O Processor
+ 0700 CE Media Processor A/V Bridge
+ 0701 CE Media Processor NAND Flash Controller
+ 0703 CE Media Processor Media Control Unit 1
+ 0704 CE Media Processor Video Capture Interface
+ 0707 CE Media Processor SPI Slave
+ 0708 CE Media Processor 4100
+ 0800 Moorestown SPI Ctrl 0
+ 0801 Moorestown SPI Ctrl 1
+ 0802 Moorestown I2C 0
+ 0803 Moorestown I2C 1
+ 0804 Moorestown I2C 2
+ 0805 Moorestown Keyboard Ctrl
+ 0806 Moorestown USB Ctrl
+ 0807 Moorestown SD Host Ctrl 0
+ 0808 Moorestown SD Host Ctrl 1
+ 0809 Moorestown NAND Ctrl
+ 080a Moorestown Audio Ctrl
+ 080b Moorestown ISP
+ 080c Moorestown Security Controller
+ 080d Moorestown External Displays
+ 080e Moorestown SCU IPC
+ 080f Moorestown GPIO Controller
+ 0810 Moorestown Power Management Unit
+ 0811 Moorestown OTG Ctrl
+ 0812 Moorestown SPI Ctrl 2
+ 0813 Moorestown SC DMA
+ 0814 Moorestown LPE DMA
+ 0815 Moorestown SSP0
+ 0885 Centrino Wireless-N + WiMAX 6150
+ 8086 1305 Centrino Wireless-N + WiMAX 6150 BGN
+ 8086 1307 Centrino Wireless-N + WiMAX 6150 BG
+ 8086 1325 Centrino Wireless-N + WiMAX 6150 BGN
+ 8086 1327 Centrino Wireless-N + WiMAX 6150 BG
+ 0886 Centrino Wireless-N + WiMAX 6150
+ 8086 1315 Centrino Wireless-N + WiMAX 6150 BGN
+ 8086 1317 Centrino Wireless-N + WiMAX 6150 BG
+ 0896 Centrino Wireless-N 130
+ 8086 5005 Centrino Wireless-N 130 BGN
+ 8086 5007 Centrino Wireless-N 130 BG
+ 8086 5025 Centrino Wireless-N 130 BGN
+ 8086 5027 Centrino Wireless-N 130 BG
+ 0897 Centrino Wireless-N 130
+ 8086 5015 Centrino Wireless-N 130 BGN
+ 8086 5017 Centrino Wireless-N 130 BG
+ 08ae Centrino Wireless-N 100
+ 8086 1005 Centrino Wireless-N 100 BGN
+ 8086 1007 Centrino Wireless-N 100 BG
+ 8086 1025 Centrino Wireless-N 100 BGN
+ 8086 1027 Centrino Wireless-N 100 BG
+ 08af Centrino Wireless-N 100
+ 8086 1015 Centrino Wireless-N 100 BGN
+ 8086 1017 Centrino Wireless-N 100 BG
+ 0960 80960RP (i960RP) Microprocessor/Bridge
+ 0962 80960RM (i960RM) Bridge
+ 0964 80960RP (i960RP) Microprocessor/Bridge
+ 0be0 Cedarview Integrated Graphics Controller
+ 0be1 Cedarview Integrated Graphics Controller
+ 0be2 Cedarview Integrated Graphics Controller
+ 0be3 Cedarview Integrated Graphics Controller
+ 0be4 Cedarview Integrated Graphics Controller
+ 0be5 Cedarview Integrated Graphics Controller
+ 0be6 Cedarview Integrated Graphics Controller
+ 0be7 Cedarview Integrated Graphics Controller
+ 0be8 Cedarview Integrated Graphics Controller
+ 0be9 Cedarview Integrated Graphics Controller
+ 0bea Cedarview Integrated Graphics Controller
+ 0beb Cedarview Integrated Graphics Controller
+ 0bec Cedarview Integrated Graphics Controller
+ 0bed Cedarview Integrated Graphics Controller
+ 0bee Cedarview Integrated Graphics Controller
+ 0bef Cedarview Integrated Graphics Controller
+ 0bf0 Cedarview DRAM Controller
+ 0bf1 Cedarview DRAM Controller
+ 0bf2 Cedarview DRAM Controller
+ 0bf3 Cedarview DRAM Controller
+ 0bf4 Cedarview DRAM Controller
+ 0bf5 Cedarview DRAM Controller
+ 0bf6 Cedarview DRAM Controller
+ 0bf7 Cedarview DRAM Controller
+ 1000 82542 Gigabit Ethernet Controller (Fiber)
+ 0e11 b0df NC6132 Gigabit Ethernet Adapter (1000-SX)
+ 0e11 b0e0 NC6133 Gigabit Ethernet Adapter (1000-LX)
+ 0e11 b123 NC6134 Gigabit Ethernet Adapter (1000-LX)
+ 1014 0119 Netfinity Gigabit Ethernet SX Adapter
+ 8086 1000 PRO/1000 Gigabit Server Adapter
+ 1001 82543GC Gigabit Ethernet Controller (Fiber)
+ 0e11 004a NC6136 Gigabit Server Adapter
+ 1014 01ea Netfinity Gigabit Ethernet SX Adapter
+ 8086 1002 PRO/1000 F Server Adapter
+ 8086 1003 PRO/1000 F Server Adapter
+ 1002 Pro 100 LAN+Modem 56 Cardbus II
+ 8086 200e Pro 100 LAN+Modem 56 Cardbus II
+ 8086 2013 Pro 100 SR Mobile Combo Adapter
+ 8086 2017 Pro 100 S Combo Mobile Adapter
+ 1004 82543GC Gigabit Ethernet Controller (Copper)
+ 0e11 0049 NC7132 Gigabit Upgrade Module
+ 0e11 b1a4 NC7131 Gigabit Server Adapter
+ 1014 10f2 Gigabit Ethernet Server Adapter
+ 8086 1004 PRO/1000 T Server Adapter
+ 8086 2004 PRO/1000 T Server Adapter
+ 1008 82544EI Gigabit Ethernet Controller (Copper)
+ 1014 0269 iSeries 1000/100/10 Ethernet Adapter
+ 1028 011b PowerEdge 1650/2550
+ 1028 011c PRO/1000 XT Network Connection
+ 8086 1107 PRO/1000 XT Server Adapter
+ 8086 2107 PRO/1000 XT Server Adapter
+ 8086 2110 PRO/1000 XT Desktop Adapter
+ 8086 3108 PRO/1000 XT Network Connection
+ 1009 82544EI Gigabit Ethernet Controller (Fiber)
+ 1014 0268 iSeries Gigabit Ethernet Adapter
+ 8086 1109 PRO/1000 XF Server Adapter
+ 8086 2109 PRO/1000 XF Server Adapter
+ 100a 82540EM Gigabit Ethernet Controller
+ 100c 82544GC Gigabit Ethernet Controller (Copper)
+ 8086 1112 PRO/1000 T Desktop Adapter
+ 8086 2112 PRO/1000 T Desktop Adapter
+ 100d 82544GC Gigabit Ethernet Controller (LOM)
+ 1028 0123 PRO/1000 XT Network Connection
+ 1079 891f 82544GC Based Network Connection
+ 4c53 1080 CT8 mainboard
+ 8086 110d 82544GC Based Network Connection
+ 100e 82540EM Gigabit Ethernet Controller
+ 1014 0265 PRO/1000 MT Network Connection
+ 1014 0267 PRO/1000 MT Network Connection
+ 1014 026a PRO/1000 MT Network Connection
+ 1028 002e Optiplex GX260
+ 1028 0134 PowerEdge 600SC
+ 1028 0151 Optiplex GX270
+ 107b 8920 PRO/1000 MT Desktop Adapter
+ 8086 001e PRO/1000 MT Desktop Adapter
+ 8086 002e PRO/1000 MT Desktop Adapter
+ 8086 1376 PRO/1000 GT Desktop Adapter
+ 8086 1476 PRO/1000 GT Desktop Adapter
+ 100f 82545EM Gigabit Ethernet Controller (Copper)
+ 1014 0269 iSeries 1000/100/10 Ethernet Adapter
+ 1014 028e PRO/1000 MT Network Connection
+ 15ad 0750 PRO/1000 MT Single Port Adapter
+ 8086 1000 PRO/1000 MT Network Connection
+ 8086 1001 PRO/1000 MT Server Adapter
+ 1010 82546EB Gigabit Ethernet Controller (Copper)
+ 0e11 00db NC7170 Gigabit Server Adapter
+ 1014 027c PRO/1000 MT Dual Port Network Adapter
+ 15ad 0760 PRO/1000 MT Dual Port Adapter
+ 18fb 7872 RESlink-X
+ 1fc1 0026 Niagara 2260 Bypass Card
+ 4c53 1080 CT8 mainboard
+ 4c53 10a0 CA3/CR3 mainboard
+ 8086 1011 PRO/1000 MT Dual Port Server Adapter
+ 8086 1012 PRO/1000 MT Dual Port Server Adapter
+ 8086 101a PRO/1000 MT Dual Port Network Connection
+ 8086 3424 SE7501HG2 Mainboard
+ 1011 82545EM Gigabit Ethernet Controller (Fiber)
+ 1014 0268 iSeries Gigabit Ethernet Adapter
+ 8086 1002 PRO/1000 MF Server Adapter
+ 8086 1003 PRO/1000 MF Server Adapter (LX)
+ 1012 82546EB Gigabit Ethernet Controller (Fiber)
+ 0e11 00dc NC6170 Gigabit Server Adapter
+ 8086 1012 PRO/1000 MF Dual Port Server Adapter
+ 1013 82541EI Gigabit Ethernet Controller
+ 8086 0013 PRO/1000 MT Network Connection
+ 8086 1013 PRO/1000 MT Network Connection
+ 8086 1113 PRO/1000 MT Desktop Adapter
+ 1014 82541ER Gigabit Ethernet Controller
+ 8086 0014 PRO/1000 MT Desktop Connection
+ 8086 1014 PRO/1000 MT Network Connection
+ 1015 82540EM Gigabit Ethernet Controller (LOM)
+ 8086 1015 PRO/1000 MT Mobile Connection
+ 1016 82540EP Gigabit Ethernet Controller (Mobile)
+ 1014 052c PRO/1000 MT Mobile Connection
+ 1179 0001 PRO/1000 MT Mobile Connection
+ 8086 1016 PRO/1000 MT Mobile Connection
+ 1017 82540EP Gigabit Ethernet Controller
+ 8086 1017 PR0/1000 MT Desktop Connection
+ 1018 82541EI Gigabit Ethernet Controller
+ 8086 1018 PRO/1000 MT Mobile Connection
+ 1019 82547EI Gigabit Ethernet Controller
+ 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1458 e000 Intel Gigabit Ethernet (Kenai II)
+ 8086 1019 PRO/1000 CT Desktop Connection
+ 8086 301f D865PERL mainboard
+ 8086 3025 D875PBZ motherboard
+ 8086 302c Intel 82865G Mainboard (D865GBF)
+ 8086 3427 S875WP1-E mainboard
+ 101a 82547EI Gigabit Ethernet Controller (Mobile)
+ 8086 101a PRO/1000 CT Mobile Connection
+ 101d 82546EB Gigabit Ethernet Controller
+ 8086 1000 PRO/1000 MT Quad Port Server Adapter
+ 101e 82540EP Gigabit Ethernet Controller (Mobile)
+ 1014 0549 Thinkpad
+ 1179 0001 PRO/1000 MT Mobile Connection
+ 8086 101e PRO/1000 MT Mobile Connection
+ 1026 82545GM Gigabit Ethernet Controller
+ 1028 0169 Precision 470
+ 8086 1000 PRO/1000 MT Server Connection
+ 8086 1001 PRO/1000 MT Server Adapter
+ 8086 1002 PRO/1000 MT Server Adapter
+ 8086 1003 PRO/1000 GT Server Adapter
+ 8086 1026 PRO/1000 MT Server Connection
+ 1027 82545GM Gigabit Ethernet Controller
+ 103c 3103 NC310F PCI-X Gigabit Server Adapter
+ 8086 1001 PRO/1000 MF Server Adapter(LX)
+ 8086 1002 PRO/1000 MF Server Adapter(LX)
+ 8086 1003 PRO/1000 MF Server Adapter(LX)
+ 8086 1027 PRO/1000 MF Server Adapter
+ 1028 82545GM Gigabit Ethernet Controller
+ 8086 1028 PRO/1000 MB Server Connection
+ 1029 82559 Ethernet Controller
+ 1030 82559 InBusiness 10/100
+ 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller
+ 1014 0209 ThinkPad A/T/X Series
+ 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 104d 813c Vaio PCG-GRV616G
+ 107b 5350 EtherExpress PRO/100 VE
+ 1179 0001 EtherExpress PRO/100 VE
+ 144d c000 EtherExpress PRO/100 VE
+ 144d c001 EtherExpress PRO/100 VE
+ 144d c003 EtherExpress PRO/100 VE
+ 144d c006 vpr Matrix 170B4
+ 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller
+ 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller
+ 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller
+ 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller
+ 1036 82801CAM (ICH3) 82562EH Ethernet Controller
+ 1037 82801CAM (ICH3) Chipset Ethernet Controller
+ 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller
+ 0e11 0098 Evo N600c
+ 1039 82801DB PRO/100 VE (LOM) Ethernet Controller
+ 1014 0267 NetVista A30p
+ 114a 0582 PC8 onboard ethernet ETH1
+ 103a 82801DB PRO/100 VE (CNR) Ethernet Controller
+ 103b 82801DB PRO/100 VM (LOM) Ethernet Controller
+ 103c 82801DB PRO/100 VM (CNR) Ethernet Controller
+ 103d 82801DB PRO/100 VE (MOB) Ethernet Controller
+ 1014 0522 ThinkPad R40
+ 1028 2002 Latitude D500
+ 8086 103d 82562EZ 10/100 Ethernet Controller
+ 103e 82801DB PRO/100 VM (MOB) Ethernet Controller
+ 1040 536EP Data Fax Modem
+ 16be 1040 V.9X DSP Data Fax Modem
+ 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter
+ 103c 08b0 tc1100 tablet
+ 8086 2522 Samsung X10/P30 integrated WLAN
+ 8086 2527 MIM2000/Centrino
+ 8086 2561 Dell Latitude D800
+ 8086 2581 Toshiba Satellite M10
+ 1048 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE LR Server Adapter
+ 8086 a11f PRO/10GbE LR Server Adapter
+ 1049 82566MM Gigabit Network Connection
+ 103c 30c1 Compaq 6910p
+ 17aa 20b9 ThinkPad T61
+ 104a 82566DM Gigabit Network Connection
+ 104b 82566DC Gigabit Network Connection
+ 104c 82562V 10/100 Network Connection
+ 104d 82566MC Gigabit Network Connection
+ 1050 82562EZ 10/100 Ethernet Controller
+ 1028 019d Dimension 3000
+ 1462 728c 865PE Neo2 (MS-6728)
+ 1462 758c MS-6758 (875P Neo)
+ 8086 3020 D865PERL mainboard
+ 8086 302f Desktop Board D865GBF
+ 8086 3427 S875WP1-E mainboard
+ 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller
+ 1052 PRO/100 VM Network Connection
+ 1053 PRO/100 VM Network Connection
+ 1054 PRO/100 VE Network Connection
+ 1055 PRO/100 VM Network Connection
+ 1056 PRO/100 VE Network Connection
+ 1057 PRO/100 VE Network Connection
+ 1059 82551QM Ethernet Controller
+ 105b 82546GB Gigabit Ethernet Controller (Copper)
+ 105e 82571EB Gigabit Ethernet Controller
+ 103c 7044 NC360T PCI Express Dual Port Gigabit Server Adapter
+ 103c 704e Dual Port 1000Base-T (PCIe) [AD337A]
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 6003 Telum GE-QT
+ 8086 005e PRO/1000 PT Dual Port Server Connection
+ 8086 105e PRO/1000 PT Dual Port Network Connection
+ 8086 10d5 82571PT Gigabit PT Quad Port Server ExpressModule
+ 8086 115e PRO/1000 PT Dual Port Server Adapter
+ 8086 125e PRO/1000 PT Dual Port Server Adapter
+ 8086 135e PRO/1000 PT Dual Port Server Adapter
+ 105f 82571EB Gigabit Ethernet Controller
+ 103c 704f Dual Port 1000Base-SX (PCIe) [AD338A]
+ 8086 005a PRO/1000 PF Dual Port Server Adapter
+ 8086 115f PRO/1000 PF Dual Port Server Adapter
+ 8086 125f PRO/1000 PF Dual Port Server Adapter
+ 8086 135f PRO/1000 PF Dual Port Server Adapter
+ 1060 82571EB Gigabit Ethernet Controller
+ 8086 0060 PRO/1000 PB Dual Port Server Connection
+ 8086 1060 PRO/1000 PB Dual Port Server Connection
+ 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller
+ 1043 80f8 P5GD1-VW Mainboard
+ 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller
+ 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller
+ 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller
+ 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile
+ 1069 82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile
+ 106a 82562G - PRO/100 VE (LOM) Ethernet Controller
+ 106b 82562G - PRO/100 VE Ethernet Controller Mobile
+ 1075 82547GI Gigabit Ethernet Controller
+ 1028 0165 PowerEdge 750
+ 8086 0075 PRO/1000 CT Network Connection
+ 8086 1075 PRO/1000 CT Network Connection
+ 1076 82541GI Gigabit Ethernet Controller
+ 1028 0165 PRO/1000 MT Network Connection
+ 1028 016d PRO/1000 MT Network Connection
+ 1028 019a PRO/1000 MT Network Connection
+ 1028 106d PRO/1000 MT Network Connection
+ 8086 0076 PRO/1000 MT Network Connection
+ 8086 1076 PRO/1000 MT Network Connection
+ 8086 1176 PRO/1000 MT Desktop Adapter
+ 8086 1276 PRO/1000 MT Network Adapter
+ 1077 82541GI Gigabit Ethernet Controller
+ 1179 0001 PRO/1000 MT Mobile Connection
+ 8086 0077 PRO/1000 MT Mobile Connection
+ 8086 1077 PRO/1000 MT Mobile Connection
+ 1078 82541ER Gigabit Ethernet Controller
+ 8086 1078 82541ER-based Network Connection
+ 1079 82546GB Gigabit Ethernet Controller
+ 103c 12a6 Dual Port 1000Base-T [A9900A]
+ 103c 12cf Core Dual Port 1000Base-T [AB352A]
+ 1775 10d0 V5D Single Board Computer Gigabit Ethernet
+ 1775 ce90 CE9
+ 1fc1 0027 Niagara 2261 Failover NIC
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 4c53 10b0 CL9 mainboard
+ 8086 0079 PRO/1000 MT Dual Port Network Connection
+ 8086 1079 PRO/1000 MT Dual Port Network Connection
+ 8086 1179 PRO/1000 MT Dual Port Server Adapter
+ 8086 117a PRO/1000 MT Dual Port Server Adapter
+ 107a 82546GB Gigabit Ethernet Controller
+ 103c 12a8 Dual Port 1000base-SX [A9899A]
+ 8086 107a PRO/1000 MF Dual Port Server Adapter
+ 8086 127a PRO/1000 MF Dual Port Server Adapter
+ 107b 82546GB Gigabit Ethernet Controller
+ 8086 007b PRO/1000 MB Dual Port Server Connection
+ 8086 107b PRO/1000 MB Dual Port Server Connection
+ 107c 82541PI Gigabit Ethernet Controller
+ 8086 1376 PRO/1000 GT Desktop Adapter
+ 8086 1476 PRO/1000 GT Desktop Adapter
+ 107d 82572EI Gigabit Ethernet Controller (Copper)
+ 8086 1082 PRO/1000 PT Server Adapter
+ 8086 1084 PRO/1000 PT Server Adapter
+ 8086 1092 PRO/1000 PT Server Adapter
+ 107e 82572EI Gigabit Ethernet Controller (Fiber)
+ 8086 1084 PRO/1000 PF Server Adapter
+ 8086 1085 PRO/1000 PF Server Adapter
+ 8086 1094 PRO/1000 PF Server Adapter
+ 107f 82572EI Gigabit Ethernet Controller
+ 1080 FA82537EP 56K V.92 Data/Fax Modem PCI
+ 1081 631xESB/632xESB LAN Controller Copper
+ 1082 631xESB/632xESB LAN Controller fiber
+ 1083 631xESB/632xESB LAN Controller SERDES
+ 1084 631xESB/632xESB IDE Redirection
+ 1085 631xESB/632xESB Serial Port Redirection
+ 1086 631xESB/632xESB IPMI/KCS0
+ 1087 631xESB/632xESB UHCI Redirection
+ 1089 631xESB/632xESB BT
+ 108a 82546GB Gigabit Ethernet Controller
+ 8086 108a PRO/1000 P Dual Port Server Adapter
+ 8086 118a PRO/1000 P Dual Port Server Adapter
+ 108b 82573V Gigabit Ethernet Controller (Copper)
+ 1462 176c on board on MSI 945P - NEO (MS-7176)
+ 108c 82573E Gigabit Ethernet Controller (Copper)
+ 108e 82573E KCS (Active Management)
+ 108f Active Management Technology - SOL
+ 1091 PRO/100 VM Network Connection
+ 1092 PRO/100 VE Network Connection
+ 1093 PRO/100 VM Network Connection
+ 1094 PRO/100 VE Network Connection
+ 1095 PRO/100 VE Network Connection
+ 1096 80003ES2LAN Gigabit Ethernet Controller (Copper)
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 1097 631xESB/632xESB DPT LAN Controller (Fiber)
+ 1098 80003ES2LAN Gigabit Ethernet Controller (Serdes)
+ 1099 82546GB Gigabit Ethernet Controller (Copper)
+ 8086 1099 PRO/1000 GT Quad Port Server Adapter
+ 109a 82573L Gigabit Ethernet Controller
+ 1179 ff10 PRO/1000 PL
+ 17aa 2001 ThinkPad T60
+ 17aa 207e ThinkPad X60s
+ 8086 109a PRO/1000 PL Network Connection
+ 8086 309c DeskTop Board D945GTP
+ 8086 30a5 DeskTop Board D975XBX
+ 109b 82546GB PRO/1000 GF Quad Port Server Adapter
+ 109e 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE CX4 Server Adapter
+ 8086 a11f PRO/10GbE CX4 Server Adapter
+ 10a0 82571EB PRO/1000 AT Quad Port Bypass Adapter
+ 10a1 82571EB PRO/1000 AF Quad Port Bypass Adapter
+ 10a4 82571EB Gigabit Ethernet Controller
+ 8086 10a4 PRO/1000 PT Quad Port Server Adapter
+ 8086 11a4 PRO/1000 PT Quad Port Server Adapter
+ 10a5 82571EB Gigabit Ethernet Controller (Fiber)
+ 8086 10a5 PRO/1000 PF Quad Port Server Adapter
+ 8086 10a6 PRO/1000 PF Quad Port Server Adapter
+ 10a6 82599EB 10-Gigabit Dummy Function
+ 10a7 82575EB Gigabit Network Connection
+ 8086 10a8 82575EB Gigabit Riser Card
+ 10a9 82575EB Gigabit Backplane Connection
+ 10b0 82573L PRO/1000 PL Network Connection
+ 10b2 82573V PRO/1000 PM Network Connection
+ 10b3 82573E PRO/1000 PM Network Connection
+ 10b4 82573L PRO/1000 PL Network Connection
+ 10b5 82546GB Gigabit Ethernet Controller (Copper)
+ 103c 3109 NC340T PCI-X Quad-port Gigabit Server Adapter
+ 8086 1099 PRO/1000 GT Quad Port Server Adapter
+ 8086 1199 PRO/1000 GT Quad Port Server Adapter
+ 10b6 82598 10GbE PCI-Express Ethernet Controller
+ 10b9 82572EI Gigabit Ethernet Controller (Copper)
+ 103c 704a HP 110T PCIe Gigabit Server Adapter
+ 8086 1083 PRO/1000 PT Desktop Adapter
+ 8086 1093 PRO/1000 PT Desktop Adapter
+ 10ba 80003ES2LAN Gigabit Ethernet Controller (Copper)
+ 10bb 80003ES2LAN Gigabit Ethernet Controller (Serdes)
+ 10bc 82571EB Gigabit Ethernet Controller (Copper)
+ 103c 704b NC364T PCI Express Quad Port Gigabit Server Adapter
+ 108e 11bc x4 PCI-Express Quad Gigabit Ethernet UTP Low Profile Adapter
+ 8086 10bc PRO/1000 PT Quad Port LP Server Adapter
+ 8086 11bc PRO/1000 PT Quad Port LP Server Adapter
+ 10bd 82566DM-2 Gigabit Network Connection
+ 1028 0211 OptiPlex 755
+ 10bf 82567LF Gigabit Network Connection
+ 10c0 82562V-2 10/100 Network Connection
+ 1028 020d Inspiron 530
+ 10c2 82562G-2 10/100 Network Connection
+ 10c3 82562GT-2 10/100 Network Connection
+ 10c4 82562GT 10/100 Network Connection
+ 10c5 82562G 10/100 Network Connection
+ 10c6 82598EB 10-Gigabit AF Dual Port Network Connection
+ 8086 a05f 10-Gigabit XF SR Dual Port Server Adapter
+ 8086 a15f 10-Gigabit XF SR Dual Port Server Adapter
+ 10c7 82598EB 10-Gigabit AF Network Connection
+ 1014 037f 10-Gigabit XF SR Server Adapter
+ 1014 0380 10-Gigabit XF LR Server Adapter
+ 8086 a05f 10-Gigabit XF SR Server Adapter
+ 8086 a15f 10-Gigabit XF SR Server Adapter
+ 8086 a16f 10-Gigabit XF SR Server Adapter
+ 10c8 82598EB 10-Gigabit AT Network Connection
+ 8086 a10c 10-Gigabit AT Server Adapter
+ 8086 a11c 10-Gigabit AT Server Adapter
+ 8086 a12c 10-Gigabit AT Server Adapter
+ 10c9 82576 Gigabit Network Connection
+ 103c 31ef NC362i Integrated Dual port Gigabit Server Adapter
+ 103c 323f NC362i Integrated Dual port Gigabit Server Adapter
+ 10a9 8028 UV-BaseIO dual-port GbE
+ 13a3 0037 DS4100 Secure Multi-Gigabit Server Adapter with Compression
+ 8086 a01c Gigabit ET Dual Port Server Adapter
+ 8086 a03c Gigabit ET Dual Port Server Adapter
+ 8086 a04c Gigabit ET Dual Port Server Adapter
+ 10ca 82576 Virtual Function
+ 10cb 82567V Gigabit Network Connection
+ 10cc 82567LM-2 Gigabit Network Connection
+ 10cd 82567LF-2 Gigabit Network Connection
+ 10ce 82567V-2 Gigabit Network Connection
+ 10d3 82574L Gigabit Network Connection
+ 103c 3250 NC112T PCI Express single Port Gigabit Server Adapter
+ 10a9 8029 Prism XL Single Port Gigabit Ethernet
+ 8086 0001 Gigabit CT2 Desktop Adapter
+ 8086 a01f Gigabit CT Desktop Adapter
+ e4bf 50c1 PC1-GROOVE
+ 10d5 82571PT Gigabit PT Quad Port Server ExpressModule
+ 10d6 82575GB Gigabit Network Connection
+ 8086 10d6 Gigabit VT Quad Port Server Adapter
+ 8086 145a Gigabit VT Quad Port Server Adapter
+ 8086 147a Gigabit VT Quad Port Server Adapter
+ 10d8 82599EB 10 Gigabit Unprogrammed
+ 10d9 82571EB Dual Port Gigabit Mezzanine Adapter
+ 103c 1716 NC360m Dual Port 1GbE BL-c Adapter
+ 10da 82571EB Quad Port Gigabit Mezzanine Adapter
+ 103c 1717 NC364m Quad Port 1GbE BL-c Adapter
+ 10db 82598EB 10-Gigabit Dual Port Network Connection
+ 10dd 82598EB 10-Gigabit AT CX4 Network Connection
+ 10de 82567LM-3 Gigabit Network Connection
+ 10df 82567LF-3 Gigabit Network Connection
+ 10e1 82598EB 10-Gigabit AF Dual Port Network Connection
+ 8086 a15f 10-Gigabit SR Dual Port Express Module
+ 10e2 82575GB Gigabit Network Connection
+ 8086 10e2 Gigabit VT Quad Port Server Adapter
+ 10e5 82567LM-4 Gigabit Network Connection
+ 10e6 82576 Gigabit Network Connection
+ 8086 a01f Gigabit EF Dual Port Server Adapter
+ 8086 a02f Gigabit EF Dual Port Server Adapter
+ 10e7 82576 Gigabit Network Connection
+ 103c 31ff NC362i Integrated Dual Port BL-c Gigabit Server Adapter
+ 10e8 82576 Gigabit Network Connection
+ 8086 a02b Gigabit ET Quad Port Server Adapter
+ 8086 a02c Gigabit ET Quad Port Server Adapter
+ 10ea 82577LM Gigabit Network Connection
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 10eb 82577LC Gigabit Network Connection
+ 10ec 82598EB 10-Gigabit AT CX4 Network Connection
+ 8086 a01f 10-Gigabit CX4 Dual Port Server Adapter
+ 8086 a11f 10-Gigabit CX4 Dual Port Server Adapter
+ 10ed 82599 Ethernet Controller Virtual Function
+ 10ef 82578DM Gigabit Network Connection
+ 10f0 82578DC Gigabit Network Connection
+ 10f1 82598EB 10-Gigabit AF Dual Port Network Connection
+ 8086 a20f 10-Gigabit AF DA Dual Port Server Adapter
+ 8086 a21f 10-Gigabit AF DA Dual Port Server Adapter
+ 10f4 82598EB 10-Gigabit AF Network Connection
+ 8086 106f 10-Gigabit XF LR Server Adapter
+ 8086 a06f 10-Gigabit XF LR Server Adapter
+ 10f5 82567LM Gigabit Network Connection
+ 10f6 82574L Gigabit Network Connection
+ 10f7 82599EB 10-Gigabit KX4 Network Connection
+ 108e 7b12 Sun Dual 10GbE PCIe 2.0 FEM
+ 8086 000d Ethernet Mezzanine Adapter X520-KX4-2
+ 10f8 82599EB 10 Gigabit Dual Port Backplane Connection
+ 1028 1f63 10GbE 2P X520k bNDC
+ 8086 000c Ethernet X520 10GbE Dual Port KX4-KR Mezz
+ 10f9 82599EB 10 Gigabit CX4 Dual Port Network Connection
+ 10fb 82599EB 10-Gigabit SFI/SFP+ Network Connection
+ 108e 7b11 Ethernet Server Adapter X520-2
+ 1734 11a9 10 Gigabit Dual Port Network Connection
+ 8086 0002 Ethernet Server Adapter X520-DA2
+ 8086 0003 Ethernet Server Adapter X520-2
+ 8086 0006 Ethernet Server Adapter X520-1
+ 8086 000a Ethernet Server Adapter X520-1
+ 8086 000c Ethernet Server Adapter X520-2
+ 8086 7a11 Ethernet Server Adapter X520-2
+ 10fc 82599EB 10-Gigabit XAUI/BX4 Network Connection
+ 10fe 82552 10/100 Network Connection
+ 1107 PRO/1000 MF Server Adapter (LX)
+ 1130 82815 815 Chipset Host Bridge and Memory Controller Hub
+ 1025 1016 Travelmate 612 TX
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 1131 82815 815 Chipset AGP Bridge
+ 1132 82815 Chipset Graphics Controller (CGC)
+ 1025 1016 Travelmate 612 TX
+ 103c 2001 e-pc 40
+ 104d 80df Vaio PCG-FX403
+ 8086 4532 D815EEA2 Mainboard
+ 8086 4541 D815EEA Motherboard
+ 8086 4557 D815EGEW Mainboard
+ 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
+ 8086 1161 82806AA PCI64 Hub APIC
+ 1162 Xscale 80200 Big Endian Companion Chip
+ 1200 IXP1200 Network Processor
+ 172a 0000 AEP SSL Accelerator
+ 1209 8255xER/82551IT Fast Ethernet Controller
+ 140b 0610 PMC610 quad Ethernet board
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 4c53 1070 PC6 mainboard
+ 1221 82092AA PCI to PCMCIA Bridge
+ 1222 82092AA IDE Controller
+ 1223 SAA7116
+ 1225 82452KX/GX [Orion]
+ 1226 82596 PRO/10 PCI
+ 1227 82865 EtherExpress PRO/100A
+ 1228 82556 EtherExpress PRO/100 Smart
+ 1229 82557/8/9/0/1 Ethernet Pro 100
+ 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN*
+ 0e11 b01e NC3120 Fast Ethernet NIC
+ 0e11 b01f NC3122 Fast Ethernet NIC (dual port)
+ 0e11 b02f NC1120 Ethernet NIC
+ 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN
+ 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL)
+ 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded)
+ 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL)
+ 0e11 b0dd NC3131 Fast Ethernet NIC (dual port)
+ 0e11 b0de NC3132 Fast Ethernet Module (dual port)
+ 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX)
+ 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL)
+ 0e11 b13c NC3162 Fast Ethernet NIC (embedded)
+ 0e11 b144 NC3123 Fast Ethernet NIC (WOL)
+ 0e11 b163 NC3134 Fast Ethernet NIC (dual port)
+ 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port)
+ 0e11 b1a4 NC7131 Gigabit Server Adapter
+ 1014 005c 82558B Ethernet Pro 10/100
+ 1014 01bc 82559 Fast Ethernet LAN On Motherboard
+ 1014 01f1 10/100 Ethernet Server Adapter
+ 1014 01f2 10/100 Ethernet Server Adapter
+ 1014 0207 Ethernet Pro/100 S
+ 1014 0232 10/100 Dual Port Server Adapter
+ 1014 023a ThinkPad R30
+ 1014 105c Netfinity 10/100
+ 1014 2205 ThinkPad A22p
+ 1014 305c 10/100 EtherJet Management Adapter
+ 1014 405c 10/100 EtherJet Adapter with Alert on LAN
+ 1014 505c 10/100 EtherJet Secure Management Adapter
+ 1014 605c 10/100 EtherJet Secure Management Adapter
+ 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter
+ 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter
+ 1028 009b 10/100 Ethernet Server Adapter
+ 1028 00ce 10/100 Ethernet Server Adapter
+ 1033 8000 PC-9821X-B06
+ 1033 8016 PK-UG-X006
+ 1033 801f PK-UG-X006
+ 1033 8026 PK-UG-X006
+ 1033 8063 82559-based Fast Ethernet Adapter
+ 1033 8064 82559-based Fast Ethernet Adapter
+ 103c 10c0 NetServer 10/100TX
+ 103c 10c3 NetServer 10/100TX
+ 103c 10ca NetServer 10/100TX
+ 103c 10cb NetServer 10/100TX
+ 103c 10e3 NetServer 10/100TX
+ 103c 10e4 NetServer 10/100TX
+ 103c 1200 NetServer 10/100TX
+ 108e 10cf EtherExpress PRO/100(B)
+ 10c3 1100 SmartEther100 SC1100
+ 10cf 1115 8255x-based Ethernet Adapter (10/100)
+ 10cf 1143 8255x-based Ethernet Adapter (10/100)
+ 110a 008b 82551QM Fast Ethernet Multifuction PCI/CardBus Controller
+ 114a 0582 PC8 onboard ethernet ETH2
+ 1179 0001 8255x-based Ethernet Adapter (10/100)
+ 1179 0002 PCI FastEther LAN on Docker
+ 1179 0003 8255x-based Fast Ethernet
+ 1259 2560 AT-2560 100
+ 1259 2561 AT-2560 100 FX Ethernet Adapter
+ 1266 0001 NE10/100 Adapter
+ 13e9 1000 6221L-4U
+ 144d 2501 SEM-2000 MiniPCI LAN Adapter
+ 144d 2502 SEM-2100IL MiniPCI LAN Adapter
+ 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 1080 CT8 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 8086 0001 EtherExpress PRO/100B (TX)
+ 8086 0002 EtherExpress PRO/100B (T4)
+ 8086 0003 EtherExpress PRO/10+
+ 8086 0004 EtherExpress PRO/100 WfM
+ 8086 0005 82557 10/100
+ 8086 0006 82557 10/100 with Wake on LAN
+ 8086 0007 82558 10/100 Adapter
+ 8086 0008 82558 10/100 with Wake on LAN
+ 8086 0009 82558B PRO/100+ PCI (TP)
+ 8086 000a EtherExpress PRO/100+ Management Adapter
+ 8086 000b EtherExpress PRO/100+
+ 8086 000c EtherExpress PRO/100+ Management Adapter
+ 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter
+ 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN*
+ 8086 000f EtherExpress PRO/100 Desktop Adapter
+ 8086 0010 EtherExpress PRO/100 S Management Adapter
+ 8086 0011 EtherExpress PRO/100 S Management Adapter
+ 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D)
+ 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E)
+ 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC
+ 8086 0031 EtherExpress PRO/100 Desktop Adapter
+ 8086 0040 EtherExpress PRO/100 S Desktop Adapter
+ 8086 0041 EtherExpress PRO/100 S Desktop Adapter
+ 8086 0042 EtherExpress PRO/100 Desktop Adapter
+ 8086 0050 EtherExpress PRO/100 S Desktop Adapter
+ 8086 1009 EtherExpress PRO/100+ Server Adapter
+ 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B)
+ 8086 1012 EtherExpress PRO/100 S Server Adapter (D)
+ 8086 1013 EtherExpress PRO/100 S Server Adapter (E)
+ 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter
+ 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter
+ 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server
+ 8086 1040 EtherExpress PRO/100 S Server Adapter
+ 8086 1041 EtherExpress PRO/100 S Server Adapter
+ 8086 1042 EtherExpress PRO/100 Server Adapter
+ 8086 1050 EtherExpress PRO/100 S Server Adapter
+ 8086 1051 EtherExpress PRO/100 Server Adapter
+ 8086 1052 EtherExpress PRO/100 Server Adapter
+ 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter
+ 8086 1229 82557/8/9 [Ethernet Pro 100]
+ 8086 2009 EtherExpress PRO/100 S Mobile Adapter
+ 8086 200d EtherExpress PRO/100 Cardbus
+ 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem
+ 8086 200f EtherExpress PRO/100 SR Mobile Adapter
+ 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter
+ 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter
+ 8086 2016 EtherExpress PRO/100 S Mobile Adapter
+ 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter
+ 8086 2018 EtherExpress PRO/100 SR Mobile Adapter
+ 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter
+ 8086 2101 EtherExpress PRO/100 P Mobile Adapter
+ 8086 2102 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2103 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2104 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2105 EtherExpress PRO/100 SP Mobile Adapter
+ 8086 2106 EtherExpress PRO/100 P Mobile Adapter
+ 8086 2107 EtherExpress PRO/100 Network Connection
+ 8086 2108 EtherExpress PRO/100 Network Connection
+ 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter
+ 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter
+ 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2203 EtherExpress PRO/100+ MiniPCI
+ 8086 2204 EtherExpress PRO/100+ MiniPCI
+ 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter
+ 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter
+ 8086 2402 EtherExpress PRO/100+ MiniPCI
+ 8086 2407 EtherExpress PRO/100+ MiniPCI
+ 8086 2408 EtherExpress PRO/100+ MiniPCI
+ 8086 2409 EtherExpress PRO/100+ MiniPCI
+ 8086 240f EtherExpress PRO/100+ MiniPCI
+ 8086 2410 EtherExpress PRO/100+ MiniPCI
+ 8086 2411 EtherExpress PRO/100+ MiniPCI
+ 8086 2412 EtherExpress PRO/100+ MiniPCI
+ 8086 2413 EtherExpress PRO/100+ MiniPCI
+ 8086 3000 82559 Fast Ethernet LAN on Motherboard
+ 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN*
+ 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II*
+ 8086 3006 EtherExpress PRO/100 S Network Connection
+ 8086 3007 EtherExpress PRO/100 S Network Connection
+ 8086 3008 EtherExpress PRO/100 Network Connection
+ 8086 3010 EtherExpress PRO/100 S Network Connection
+ 8086 3011 EtherExpress PRO/100 S Network Connection
+ 8086 3012 EtherExpress PRO/100 Network Connection
+ 8086 301a S845WD1-E mainboard
+ 8086 3411 SDS2 Mainboard
+ 122d 430FX - 82437FX TSC [Triton I]
+ 122e 82371FB PIIX ISA [Triton I]
+ 1230 82371FB PIIX IDE [Triton I]
+ 1231 DSVD Modem
+ 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX)
+ 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP)
+ 1237 440FX - 82441FX PMC [Natoma]
+ 1af4 1100 Qemu virtual machine
+ 1239 82371FB PIIX IDE Interface
+ 123b 82380PB PCI to PCI Docking Bridge
+ 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge
+ 123d 683053 Programmable Interrupt Device
+ 123e 82466GX (IHPC) Integrated Hot-Plug Controller (hidden mode)
+ 123f 82466GX Integrated Hot-Plug Controller (IHPC)
+ 1240 82752 (752) AGP Graphics Accelerator
+ 124b 82380FB (MPCI2) Mobile Docking Controller
+ 1250 430HX - 82439HX TXC [Triton II]
+ 1360 82806AA PCI64 Hub PCI Bridge
+ 1361 82806AA PCI64 Hub Controller (HRes)
+ 8086 1361 82806AA PCI64 Hub Controller (HRes)
+ 8086 8000 82806AA PCI64 Hub Controller (HRes)
+ 1460 82870P2 P64H2 Hub PCI Bridge
+ 1461 82870P2 P64H2 I/OxAPIC
+ 15d9 3480 P4DP6
+ 4c53 1090 Cx9/Vx9 mainboard
+ 1462 82870P2 P64H2 Hot Plug Controller
+ 1501 82567V-3 Gigabit Network Connection
+ 1502 82579LM Gigabit Network Connection
+ 1503 82579V Gigabit Network Connection
+ 1043 849c P8P67 Deluxe Motherboard
+ 1507 82599EB 10 Gigabit Network Connection
+ 1508 82598EB Gigabit BX Network Connection
+ 150a 82576NS Gigabit Network Connection
+ 150b 82598EB 10-Gigabit AT2 Server Adapter
+ 8086 a10c 82598EB 10-Gigabit AT2 Server Adapter
+ 8086 a11c 82598EB 10-Gigabit AT2 Server Adapter
+ 8086 a12c 82598EB 10-Gigabit AT2 Server Adapter
+ 150c 82583V Gigabit Network Connection
+ 150d 82576 Gigabit Backplane Connection
+ 8086 a10c Gigabit ET Quad Port Mezzanine Card
+ 150e 82580 Gigabit Network Connection
+ 103c 1780 NC365T 4-port Ethernet Server Adapter
+ 8086 12a1 Ethernet Server Adapter I340-T4
+ 8086 12a2 Ethernet Server Adapter I340-T4
+ 150f 82580 Gigabit Fiber Network Connection
+ 1510 82580 Gigabit Backplane Connection
+ 1511 82580 Gigabit SFP Connection
+ 1514 82599EB 10 Gigabit KX4 Network Connection
+ 8086 000b Ethernet X520 10GbE Dual Port KX4 Mezz
+ 1516 82580 Gigabit Network Connection
+ 8086 12b1 Ethernet Server Adapter I340-T2
+ 8086 12b2 Ethernet Server Adapter I340-T2
+ 1517 82599ES 10 Gigabit Network Connection
+ 1137 006a UCS CNA M61KR-I Intel Converged Network Adapter
+ 1518 82576NS SerDes Gigabit Network Connection
+ 151c 82599EB 10 Gigabit TN Network Connection
+ 108e 7b13 Dual 10GBASE-T LP
+ 1521 I350 Gigabit Network Connection
+ 1028 1f60 Intel GbE 4P I350crNDC
+ 1028 1f62 Intel GbE 2P I350crNDC
+ 10a9 802a UV2-BaseIO dual-port GbE
+ 8086 0001 Ethernet Server Adapter I350-T4
+ 8086 0002 Ethernet Server Adapter I350-T2
+ 8086 00a1 Ethernet Server Adapter I350-T4
+ 8086 00a2 Ethernet Server Adapter I350-T2
+ 8086 5001 Ethernet Server Adapter I350-T4
+ 8086 5002 Ethernet Server Adapter I350-T2
+ 1522 I350 Gigabit Fiber Network Connection
+ 8086 0002 Ethernet Server Adapter I350-T2
+ 8086 0003 Ethernet Server Adapter I350-F4
+ 8086 0004 Ethernet Server Adapter I350-F2
+ 8086 00a3 Ethernet Server Adapter I350-F4
+ 8086 00a4 Ethernet Server Adapter I350-F2
+ 1523 I350 Gigabit Backplane Connection
+ 8086 1f52 1GbE 4P I350 Mezz
+ 1524 I350 Gigabit Connection
+ 1525 82567V-4 Gigabit Network Connection
+ 1526 82576 Gigabit Network Connection
+ 8086 a05c Gigabit ET2 Quad Port Server Adapter
+ 8086 a06c Gigabit ET2 Quad Port Server Adapter
+ 1527 82580 Gigabit Fiber Network Connection
+ 8086 0001 Ethernet Server Adapter I340-F4
+ 8086 0002 Ethernet Server Adapter I340-F4
+ 1528 Ethernet Controller 10 Gigabit X540-AT2
+ 8086 0001 Ethernet Server Adapter X540-T2
+ 8086 0002 Ethernet Server Adapter X540-T1
+ 8086 001a Ethernet Server Adapter X540-T2
+ 8086 00a2 Ethernet Server Adapter X540-T1
+ 8086 5003 Ethernet Server Adapter X540-T2
+ 1529 82599 10 Gigabit Dual Port Backplane Connection with FCoE
+ 152a 82599 10 Gigabit Dual port Network Connection with FCoE
+ 154d 82599EB 10-Gigabit SFP+ Network Connection
+ 8086 7b11 10GbE 2P X520 Adapter
+ 1960 80960RP (i960RP) Microprocessor
+ 101e 0431 MegaRAID 431 RAID Controller
+ 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller
+ 101e 0466 MegaRAID 466 Express Plus RAID Controller
+ 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller
+ 101e 0490 MegaRAID 490 Express 300 RAID Controller
+ 101e 0762 MegaRAID 762 Express RAID Controller
+ 101e 09a0 PowerEdge Expandable RAID Controller 2/SC
+ 1028 0467 PowerEdge Expandable RAID Controller 2/DC
+ 1028 1111 PowerEdge Expandable RAID Controller 2/SC
+ 103c 03a2 MegaRAID
+ 103c 10c6 MegaRAID 438, NetRAID-3Si
+ 103c 10c7 MegaRAID T5, Integrated NetRAID
+ 103c 10cc MegaRAID, Integrated NetRAID
+ 103c 10cd NetRAID-1Si
+ 105a 0000 SuperTrak
+ 105a 2168 SuperTrak Pro
+ 105a 5168 SuperTrak66/100
+ 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC
+ 1111 1112 PowerEdge Expandable RAID Controller 2/SC
+ 113c 03a2 MegaRAID
+ e4bf 1010 CG1-RADIO
+ e4bf 1020 CU2-QUARTET
+ e4bf 1040 CU1-CHORUS
+ e4bf 3100 CX1-BAND
+ 1962 80960RM (i960RM) Microprocessor
+ 105a 0000 SuperTrak SX6000 I2O CPU
+ 1a21 82840 840 [Carmel] Chipset Host Bridge (Hub A)
+ 1a23 82840 840 [Carmel] Chipset AGP Bridge
+ 1a24 82840 840 [Carmel] Chipset PCI Bridge (Hub B)
+ 1a30 82845 845 [Brookdale] Chipset Host Bridge
+ 1028 010e Optiplex GX240
+ 15d9 3280 Supermicro P4SBE Mainboard
+ 1a31 82845 845 [Brookdale] Chipset AGP Bridge
+ 1a38 5000 Series Chipset DMA Engine
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 1a48 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE SR Server Adapter
+ 8086 a11f PRO/10GbE SR Server Adapter
+ 1b48 82597EX 10GbE Ethernet Controller
+ 8086 a01f PRO/10GbE LR Server Adapter
+ 8086 a11f PRO/10GbE LR Server Adapter
+ 1c00 6 Series/C200 Series Chipset Family 4 port SATA IDE Controller
+ 1c01 6 Series/C200 Series Chipset Family 4 port SATA IDE Controller
+ 1c02 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c03 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller
+ 1c04 6 Series/C200 Series Chipset Family SATA RAID Controller
+ 1c05 6 Series/C200 Series Chipset Family SATA RAID Controller
+ 1c08 6 Series/C200 Series Chipset Family 2 port SATA IDE Controller
+ 1c09 6 Series/C200 Series Chipset Family 2 port SATA IDE Controller
+ 1c10 6 Series/C200 Series Chipset Family PCI Express Root Port 1
+ 1c12 6 Series/C200 Series Chipset Family PCI Express Root Port 2
+ 1c14 6 Series/C200 Series Chipset Family PCI Express Root Port 3
+ 1c16 6 Series/C200 Series Chipset Family PCI Express Root Port 4
+ 1c18 6 Series/C200 Series Chipset Family PCI Express Root Port 5
+ 1c1a 6 Series/C200 Series Chipset Family PCI Express Root Port 6
+ 1c1c 6 Series/C200 Series Chipset Family PCI Express Root Port 7
+ 1c1e 6 Series/C200 Series Chipset Family PCI Express Root Port 8
+ 1c20 6 Series/C200 Series Chipset Family High Definition Audio Controller
+ 1028 04aa XPS 8300
+ 1043 8418 P8P67 Deluxe Motherboard
+ 1c22 6 Series/C200 Series Chipset Family SMBus Controller
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c24 6 Series/C200 Series Chipset Family Thermal Management Controller
+ 1c25 6 Series/C200 Series Chipset Family DMI to PCI Bridge
+ 1c26 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c2d 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c33 6 Series/C200 Series Chipset Family LAN Controller
+ 1c35 6 Series/C200 Series Chipset Family VECI Controller
+ 1c3a 6 Series/C200 Series Chipset Family MEI Controller #1
+ 1028 04aa XPS 8300
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c3b 6 Series/C200 Series Chipset Family MEI Controller #2
+ 1c3c 6 Series/C200 Series Chipset Family IDE-r Controller
+ 1c3d 6 Series/C200 Series Chipset Family KT Controller
+ 1c40 6 Series/C200 Series Chipset Family LPC Controller
+ 1c41 Mobile SFF 6 Series Chipset Family LPC Controller
+ 1c42 6 Series/C200 Series Chipset Family LPC Controller
+ 1c43 Mobile 6 Series Chipset Family LPC Controller
+ 1c44 Z68 Express Chipset Family LPC Controller
+ 1c45 6 Series/C200 Series Chipset Family LPC Controller
+ 1c46 P67 Express Chipset Family LPC Controller
+ 1043 844d P8P67 Deluxe Motherboard
+ 1c47 UM67 Express Chipset Family LPC Controller
+ 1c48 6 Series/C200 Series Chipset Family LPC Controller
+ 1c49 HM65 Express Chipset Family LPC Controller
+ 1c4a H67 Express Chipset Family LPC Controller
+ 1028 04aa XPS 8300
+ 1c4b HM67 Express Chipset Family LPC Controller
+ 1c4c Q65 Express Chipset Family LPC Controller
+ 1c4d QS67 Express Chipset Family LPC Controller
+ 1c4e Q67 Express Chipset Family LPC Controller
+ 1c4f QM67 Express Chipset Family LPC Controller
+ 1c50 B65 Express Chipset Family LPC Controller
+ 1c51 6 Series/C200 Series Chipset Family LPC Controller
+ 1c52 C202 Chipset Family LPC Controller
+ 1c53 6 Series/C200 Series Chipset Family LPC Controller
+ 1c54 C204 Chipset Family LPC Controller
+ 1c55 6 Series/C200 Series Chipset Family LPC Controller
+ 1c56 C206 Chipset Family LPC Controller
+ 1c57 6 Series/C200 Series Chipset Family LPC Controller
+ 1c58 Upgraded B65 Express Chipset Family LPC Controller
+ 1c59 Upgraded HM67 Express Chipset Family LPC Controller
+ 1c5a Upgraded Q67 Express Chipset Family LPC Controller
+ 1c5b 6 Series/C200 Series Chipset Family LPC Controller
+ 1c5c H61 Express Chipset Family LPC Controller
+ 1c5d 6 Series/C200 Series Chipset Family LPC Controller
+ 1c5e 6 Series/C200 Series Chipset Family LPC Controller
+ 1c5f 6 Series/C200 Series Chipset Family LPC Controller
+ 1d00 Patsburg 4-Port SATA IDE Controller
+ 1d02 Patsburg 6-Port SATA AHCI Controller
+ 1d04 Patsburg SATA RAID Controller
+ 1d06 Patsburg SATA Premium RAID Controller
+ 1d08 Patsburg 2-Port SATA IDE Controller
+ 1d10 Patsburg PCI Express Root Port 1
+ 1d11 Patsburg PCI Express Root Port 1
+ 1d12 Patsburg PCI Express Root Port 2
+ 1d13 Patsburg PCI Express Root Port 2
+ 1d14 Patsburg PCI Express Root Port 3
+ 1d15 Patsburg PCI Express Root Port 3
+ 1d16 Patsburg PCI Express Root Port 4
+ 1d17 Patsburg PCI Express Root Port 4
+ 1d18 Patsburg PCI Express Root Port 5
+ 1d19 Patsburg PCI Express Root Port 5
+ 1d1a Patsburg PCI Express Root Port 6
+ 1d1b Patsburg PCI Express Root Port 6
+ 1d1c Patsburg PCI Express Root Port 7
+ 1d1d Patsburg PCI Express Root Port 7
+ 1d1e Patsburg PCI Express Root Port 8
+ 1d1f Patsburg PCI Express Root Port 8
+ 1d20 Patsburg High Definition Audio Controller
+ 1d22 Patsburg SMBus Host Controller
+ 1d24 Patsburg Thermal Management Controller
+ 1d25 Patsburg DMI to PCI Bridge
+ 1d26 Patsburg USB2 Enhanced Host Controller #1
+ 1d2d Patsburg USB2 Enhanced Host Controller #2
+ 1d33 Patsburg LAN Controller
+ 1d35 Patsburg VECI Controller
+ 1d3a Patsburg MEI Controller #1
+ 1d3b Patsburg MEI Controller #2
+ 1d3c Patsburg IDE-r Controller
+ 1d3d Patsburg KT Controller
+ 1d3e Patsburg PCI Express Virtual Root Port
+ 1d3f Patsburg PCI Express Virtual Switch Port
+ 1d40 Patsburg LPC Controller
+ 1d41 Patsburg LPC Controller
+ 1d50 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d54 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d55 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d58 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d59 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d5b Patsburg 4-Port SATA Storage Control Unit
+ 1d60 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d61 Patsburg SAS Storage Control Unit 1
+ 1d64 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d65 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d68 Patsburg Dual 4-Port SATA/SAS Storage Control Unit
+ 1d69 Patsburg 4-Port SATA/SAS Storage Control Unit
+ 1d6b Patsburg 4-Port SATA Storage Control Unit
+ 1d70 Patsburg SMBus Controller 0
+ 1d71 Patsburg SMBus Controller 1
+ 1d72 Patsburg SMBus Controller 2
+ 1d73 Patsburg Integrated NVSRAM Controller
+ 1d74 Patsburg PCI Express Upstream Port
+ 1d76 Patsburg Multi-Function Glue
+ 1e00 Panther Point 4 port SATA IDE Controller
+ 1e01 Panther Point 4 port SATA IDE Controller
+ 1e02 Panther Point 6 port SATA AHCI Controller
+ 1e03 Panther Point 6 port SATA AHCI Controller
+ 1e04 Panther Point SATA RAID Controller
+ 1e05 Panther Point SATA RAID Controller
+ 1e06 Panther Point SATA Premium RAID Controller
+ 1e07 Panther Point SATA Premium RAID Controller
+ 1e08 Panther Point 2 port SATA IDE Controller
+ 1e09 Panther Point 2 port SATA IDE Controller
+ 1e10 Panther Point PCI Express Root Port 1
+ 1e12 Panther Point PCI Express Root Port 2
+ 1e14 Panther Point PCI Express Root Port 3
+ 1e16 Panther Point PCI Express Root Port 4
+ 1e18 Panther Point PCI Express Root Port 5
+ 1e1a Panther Point PCI Express Root Port 6
+ 1e1c Panther Point PCI Express Root Port 7
+ 1e1e Panther Point PCI Express Root Port 8
+ 1e20 Panther Point High Definition Audio Controller
+ 1e22 Panther Point SMBus Controller
+ 1e24 Panther Point Thermal Management Controller
+ 1e25 Panther Point DMI to PCI Bridge
+ 1e26 Panther Point USB Enhanced Host Controller #1
+ 1e2d Panther Point USB Enhanced Host Controller #2
+ 1e31 Panther Point USB xHCI Host Controller
+ 1e33 Panther Point LAN Controller
+ 1e3a Panther Point MEI Controller #1
+ 1e3b Panther Point MEI Controller #2
+ 1e3c Panther Point IDE-r Controller
+ 1e3d Panther Point KT Controller
+ 1e40 Panther Point LPC Controller
+ 1e41 Panther Point LPC Controller
+ 1e42 Panther Point LPC Controller
+ 1e43 Panther Point LPC Controller
+ 1e44 Panther Point LPC Controller
+ 1e45 Panther Point LPC Controller
+ 1e46 Panther Point LPC Controller
+ 1e47 Panther Point LPC Controller
+ 1e48 Panther Point LPC Controller
+ 1e49 Panther Point LPC Controller
+ 1e4a Panther Point LPC Controller
+ 1e4b Panther Point LPC Controller
+ 1e4c Panther Point LPC Controller
+ 1e4d Panther Point LPC Controller
+ 1e4e Panther Point LPC Controller
+ 1e4f Panther Point LPC Controller
+ 1e50 Panther Point LPC Controller
+ 1e51 Panther Point LPC Controller
+ 1e52 Panther Point LPC Controller
+ 1e53 Panther Point LPC Controller
+ 1e54 Panther Point LPC Controller
+ 1e55 Panther Point LPC Controller
+ 1e56 Panther Point LPC Controller
+ 1e57 Panther Point LPC Controller
+ 1e58 Panther Point LPC Controller
+ 1e59 Panther Point LPC Controller
+ 1e5a Panther Point LPC Controller
+ 1e5b Panther Point LPC Controller
+ 1e5c Panther Point LPC Controller
+ 1e5d Panther Point LPC Controller
+ 1e5e Panther Point LPC Controller
+ 1e5f Panther Point LPC Controller
+ 2310 DH89xxCC LPC Controller
+ 2323 DH89xxCC 4 Port SATA AHCI Controller
+ 2330 DH89xxCC SMBus Controller
+ 2331 DH89xxCC Chap Counter
+ 2332 DH89xxCC Thermal Subsystem
+ 2334 DH89xxCC USB2 Enhanced Host Controller #1
+ 2335 DH89xxCC USB2 Enhanced Host Controller #1
+ 2342 DH89xxCC PCI Express Root Port #1
+ 2343 DH89xxCC PCI Express Root Port #1
+ 2344 DH89xxCC PCI Express Root Port #2
+ 2345 DH89xxCC PCI Express Root Port #2
+ 2346 DH89xxCC PCI Express Root Port #3
+ 2347 DH89xxCC PCI Express Root Port #3
+ 2348 DH89xxCC PCI Express Root Port #4
+ 2349 DH89xxCC PCI Express Root Port #4
+ 2360 DH89xxCC Watchdog Timer
+ 2364 DH89xxCC MEI 0
+ 2365 DH89xxCC MEI 1
+ 2410 82801AA ISA Bridge (LPC)
+ 2411 82801AA IDE Controller
+ 2412 82801AA USB Controller
+ 2413 82801AA SMBus Controller
+ 2415 82801AA AC'97 Audio Controller
+ 1028 0095 Precision Workstation 220 Integrated Digital Audio
+ 1028 00b4 OptiPlex GX110
+ 110a 0051 Activy 2xx
+ 11d4 0040 SoundMAX Integrated Digital Audio
+ 11d4 0048 SoundMAX Integrated Digital Audio
+ 11d4 5340 SoundMAX Integrated Digital Audio
+ 1734 1025 Activy 3xx
+ 2416 82801AA AC'97 Modem Controller
+ 2418 82801AA PCI Bridge
+ 2420 82801AB ISA Bridge (LPC)
+ 2421 82801AB IDE Controller
+ 2422 82801AB USB Controller
+ 2423 82801AB SMBus Controller
+ 2425 82801AB AC'97 Audio Controller
+ 11d4 0040 SoundMAX Integrated Digital Audio
+ 11d4 0048 SoundMAX Integrated Digital Audio
+ 2426 82801AB AC'97 Modem Controller
+ 2428 82801AB PCI Bridge
+ 2440 82801BA ISA Bridge (LPC)
+ 8086 5744 S845WD1-E
+ 2442 82801BA/BAM USB Controller #1
+ 1014 01c6 Netvista A40/A40p
+ 1025 1016 Travelmate 612 TX
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 147b 0507 TH7II-RAID
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 8086 5744 S845WD1-E mainboard
+ 2443 82801BA/BAM SMBus Controller
+ 1014 01c6 Netvista A40/A40p
+ 1025 1016 Travelmate 612 TX
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 147b 0507 TH7II-RAID
+ 15d9 3280 Supermicro P4SBE Mainboard
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 8086 5744 S845WD1-E mainboard
+ 2444 82801BA/BAM USB Controller #1
+ 1025 1016 Travelmate 612 TX
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 104d 80df Vaio PCG-FX403
+ 147b 0507 TH7II-RAID
+ 8086 4532 D815EEA2 mainboard
+ 8086 5744 S845WD1-E mainboard
+ 2445 82801BA/BAM AC'97 Audio Controller
+ 0e11 000b Compaq Deskpro EN Audio
+ 0e11 0088 Evo D500
+ 1014 01c6 Netvista A40/A40p
+ 1025 1016 Travelmate 612 TX
+ 1028 00d8 Precision 530
+ 103c 126f e-pc 40
+ 104d 80df Vaio PCG-FX403
+ 1462 3370 STAC9721 AC
+ 147b 0507 TH7II-RAID
+ 8086 4557 D815EGEW Mainboard
+ 2446 82801BA/BAM AC'97 Modem Controller
+ 1025 1016 Travelmate 612 TX
+ 104d 80df Vaio PCG-FX403
+ 2448 82801 Mobile PCI Bridge
+# (rev d3) (prog-if (rev d3) (prog-if 01 [Subtractive decode])
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ 103c 099c NX6110/NC6120
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 103c 30c1 Compaq 6910p
+ 104d 902d VAIO VGN-NR120E
+ 144d c00c P30 notebook
+ 1734 1055 Amilo M1420
+ 17aa 20ae ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2449 82801BA/BAM/CA/CAM Ethernet Controller
+ 0e11 0012 EtherExpress PRO/100 VM
+ 0e11 0091 EtherExpress PRO/100 VE
+ 1014 01ce EtherExpress PRO/100 VE
+ 1014 01dc EtherExpress PRO/100 VE
+ 1014 01eb EtherExpress PRO/100 VE
+ 1014 01ec EtherExpress PRO/100 VE
+ 1014 0202 EtherExpress PRO/100 VE
+ 1014 0205 EtherExpress PRO/100 VE
+ 1014 0217 EtherExpress PRO/100 VE
+ 1014 0234 EtherExpress PRO/100 VE
+ 1014 023d EtherExpress PRO/100 VE
+ 1014 0244 EtherExpress PRO/100 VE
+ 1014 0245 EtherExpress PRO/100 VE
+ 1014 0265 PRO/100 VE Desktop Connection
+ 1014 0267 PRO/100 VE Desktop Connection
+ 1014 026a PRO/100 VE Desktop Connection
+ 109f 315d EtherExpress PRO/100 VE
+ 109f 3181 EtherExpress PRO/100 VE
+ 1179 ff01 PRO/100 VE Network Connection
+ 1186 7801 EtherExpress PRO/100 VE
+ 144d 2602 HomePNA 1M CNR
+ 8086 3010 EtherExpress PRO/100 VE
+ 8086 3011 EtherExpress PRO/100 VM
+ 8086 3012 82562EH based Phoneline
+ 8086 3013 EtherExpress PRO/100 VE
+ 8086 3014 EtherExpress PRO/100 VM
+ 8086 3015 82562EH based Phoneline
+ 8086 3016 EtherExpress PRO/100 P Mobile Combo
+ 8086 3017 EtherExpress PRO/100 P Mobile
+ 8086 3018 EtherExpress PRO/100
+ 244a 82801BAM IDE U100 Controller
+ 1025 1016 Travelmate 612TX
+ 104d 80df Vaio PCG-FX403
+ 244b 82801BA IDE U100 Controller
+ 1014 01c6 Netvista A40/A40p
+ 1028 00c7 Dimension 8100
+ 1028 00d8 Precision 530
+ 1028 010e Optiplex GX240
+ 103c 126f e-pc 40
+ 1043 8027 TUSL2-C Mainboard
+ 147b 0507 TH7II-RAID
+ 15d9 3280 Supermicro P4SBE Mainboard
+ 8086 4532 D815EEA2 mainboard
+ 8086 4557 D815EGEW Mainboard
+ 8086 5744 S845WD1-E mainboard
+ 244c 82801BAM ISA Bridge (LPC)
+ 244e 82801 PCI Bridge
+ 1014 0267 NetVista A30p
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 103c 2a3b Pavilion A1512X
+ 1458 5000 GA-EP45-DS5 Motherboard
+ 1775 11cc CC11/CL11
+ 2450 82801E ISA Bridge (LPC)
+ 2452 82801E USB Controller
+ 2453 82801E SMBus Controller
+ 2459 82801E Ethernet Controller 0
+ 245b 82801E IDE U100 Controller
+ 245d 82801E Ethernet Controller 1
+ 245e 82801E PCI Bridge
+ 2480 82801CA LPC Interface Controller
+ 2482 82801CA/CAM USB Controller #1
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 8086 3424 SE7501HG2 Mainboard
+ 8086 4541 Latitude C640
+ 2483 82801CA/CAM SMBus Controller
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 2484 82801CA/CAM USB Controller #2
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 2485 82801CA/CAM AC'97 Audio Controller
+ 1013 5959 Crystal WMD Audio Codec
+ 1014 0222 ThinkPad A30/A30p/T23
+ 1014 0508 ThinkPad T30
+ 1014 051c ThinkPad A/T/X Series
+ 1043 1583 L3C (SPDIF)
+ 1043 1623 L2B (no SPDIF)
+ 1043 1643 L3F
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 144d c006 vpr Matrix 170B4
+ 2486 82801CA/CAM AC'97 Modem Controller
+ 1014 0223 ThinkPad A/T/X Series
+ 1014 0503 ThinkPad R31
+ 1014 051a ThinkPad A/T/X Series
+ 101f 1025 620 Series
+ 1043 1496 PCtel HSP56 MR
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 134d 4c21 Dell Inspiron 2100 internal modem
+ 144d 2115 vpr Matrix 170B4 internal modem
+ 14f1 5421 MD56ORD V.92 MDC Modem
+ 2487 82801CA/CAM USB Controller #3
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 15d9 3480 P4DP6
+ 8086 1958 vpr Matrix 170B4
+ 248a 82801CAM IDE U100 Controller
+ 0e11 0030 Evo N600c
+ 1014 0220 ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 8086 1958 vpr Matrix 170B4
+ 8086 4541 Latitude C640
+ 248b 82801CA Ultra ATA Storage Controller
+ 15d9 3480 P4DP6
+ 248c 82801CAM ISA Bridge (LPC)
+ 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
+ 1014 0267 NetVista A30p
+ 1462 5800 845PE Max (MS-6580)
+ 24c1 82801DBL (ICH4-L) IDE Controller
+ 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 114a 0582 PC8 onboard USB 1.x
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1462 5800 845PE Max (MS-6580)
+ 1509 2990 Averatec 5110H laptop
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 1734 1055 Amilo M1420
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ 8086 4541 Latitude D400/D500
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 014f Latitude X300
+ 1028 018d Inspiron 700m/710m
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1071 8160 MIM2000
+ 114a 0582 PC8 onboard SMbus
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1458 24c2 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 1734 1055 Amilo M1420
+ 4c53 1090 Cx9 / Vx9 mainboard
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 144d c00c P30/P35 notebook
+ 1462 5800 845PE Max (MS-6580)
+ 1509 2990 Averatec 5110H
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ 8086 4541 Latitude D400/D500
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller
+ 0e11 00b8 Analog Devices Inc. codec [SoundMAX]
+ 1014 0267 NetVista A30p
+ 1014 0537 ThinkPad T41
+ 1014 055f Thinkpad R50e model 1634
+ 1025 005a TravelMate 290
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m [SigmaTel STAC9750,51]
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 1713 M6800N
+ 1043 80b0 P4B533
+ 1071 8160 MIM2000
+ 1179 0201 Toshiba Tecra M1
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1458 a002 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 1734 1005 D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T
+ 1734 1055 Amilo M1420
+ 8086 24c5 Dell Dimension 2400
+ 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
+ 1014 0524 ThinkPad T41
+ 1014 0525 ThinkPad
+ 1014 0559 ThinkPad R50e
+ 1025 003c Aspire 2001WLCi (Compal CL50 motherboard) implementation
+ 1025 005a TravelMate 290
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 1826 M6800N
+ 1071 8160 MIM2000
+ 134d 4c21 Latitude D500
+ 144d 2115 X10 Laptop
+ 144d c00c P30/P35 notebook
+# Conexant HSF Softmodem (CXT22)
+ 14f1 5422 D480 MDC V.9x Modem
+ 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
+ 1014 0267 NetVista A30p
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 0126 Optiplex GX260
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 144d c00c P30/P35 notebook
+ 1462 5800 845PE Max (MS-6580)
+ 1509 2990 Averatec 5110H
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ 8086 4541 Latitude D400/D500
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24ca 82801DBM (ICH4-M) IDE Controller
+ 1014 052d ThinkPad
+ 1025 005a TravelMate 290
+ 1028 014f Latitude X300
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1071 8160 MIM2000
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1734 1055 Amilo M1420
+ 8086 4541 Latitude D400/D500
+ 24cb 82801DB (ICH4) IDE Controller
+ 1014 0267 NetVista A30p
+ 1028 0126 Optiplex GX260
+ 1043 8089 P4B533
+ 114a 0582 PC8 onboard IDE
+ 1458 24c2 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 4c53 1090 Cx9 / Vx9 mainboard
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24cc 82801DBM (ICH4-M) LPC Interface Bridge
+ 144d c00c P30 notebook
+ 1734 1055 Amilo M1420
+ 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
+ 1014 0267 NetVista A30p
+ 1014 052e ThinkPad
+ 1025 005a TravelMate 290
+ 1028 011d Latitude D600
+ 1028 0126 Optiplex GX260
+ 1028 0139 Latitude D400
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 1043 8089 P4B533
+ 1071 8160 MIM2000
+ 114a 0582 PC8 onboard USB 2.0
+ 1179 ff00 Satellite 2430
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 1462 3981 845PE Max (MS-6580)
+ 1509 1968 Averatec 5110H
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 1734 1055 Amilo M1420
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 24c2 Latitude X300
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
+ 24d1 82801EB (ICH5) SATA Controller
+ 1028 0169 Precision 470
+ 1028 019a PowerEdge SC1425
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800 series motherboard
+ 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 5200 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard UHCI
+ 1028 016d PowerEdge 2850 onboard UHCI
+ 1028 0170 PowerEdge 6850 onboard UHCI
+ 1028 0183 PowerEdge 1800
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000/8KNXP motherboard
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0156 Precision 360
+ 1028 0169 Precision 470
+ 103c 12bc d330 uT
+ 1043 80a6 P4P800 Mainboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series SMBus
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard UHCI
+ 1028 016d PowerEdge 2850 onboard UHCI
+ 1028 0170 PowerEdge 6850 onboard UHCI
+ 1028 0183 PowerEdge 1800
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
+ 100a 147b Abit IS7-E motherboard
+ 1028 0169 Precision 470
+ 103c 006a NX9500
+ 103c 12bc d330 uT
+ 1043 80f3 P4P800 Mainboard
+ 1043 810f P5P800-MX Mainboard
+ 1458 a002 GA-8IPE1000/8KNXP motherboard
+ 1462 0080 865PE Neo2-V (MS-6788) Mainboard
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 8086 a000 D865PERL mainboard
+ 8086 e000 D865PERL mainboard
+ 8086 e001 Desktop Board D865GBF
+ 8086 e002 SoundMax Intergrated Digital Audio
+ 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
+ 103c 006a NX9500
+ 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3
+ 1014 02ed xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard UHCI
+ 1028 016d PowerEdge 2850 onboard UHCI
+ 1028 0170 PowerEdge 6850 onboard UHCI
+ 1028 0183 PowerEdge 1800
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24db 82801EB/ER (ICH5/ICH5R) IDE Controller
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 IDE Controller
+ 1028 016d PowerEdge 2850 IDE Controller
+ 1028 0170 PowerEdge 6850 IDE Controller
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7580 MSI 875P
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard IDE
+ 8086 24db P4C800 Mainboard
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24dc 82801EB (ICH5) LPC Interface Bridge
+ 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller
+ 1014 02dd eServer xSeries server mainboard
+ 1014 02ed eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 1028 016c PowerEdge 1850 onboard EHCI
+ 1028 016d PowerEdge 2850 onboard EHCI
+ 1028 0170 PowerEdge 6850 onboard EHCI
+ 1028 0183 PowerEdge 1800
+ 1028 019a PowerEdge SC1425
+ 103c 006a NX9500
+ 103c 12bc d530 CMT (DG746A)
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4
+ 1014 02ed xSeries server mainboard
+ 1028 0169 Precision 470
+ 1043 80a6 P4P800/P5P800 series motherboard
+ 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
+ 1462 7280 865PE Neo2 (MS-6728)
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1565 3101 P4TSV Motherboard (865G)
+ 15d9 4580 P4SCE Mainboard
+ 1734 101c PRIMERGY RX/TX S2 series onboard UHCI
+ 8086 3427 S875WP1-E mainboard
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 8086 524c D865PERL mainboard
+ 24df 82801ER (ICH5R) SATA Controller
+ 2500 82820 820 (Camino) Chipset Host Bridge (MCH)
+ 1028 0095 Precision Workstation 220 Chipset
+ 1043 801c P3C-2000 system chipset
+ 2501 82820 820 (Camino) Chipset Host Bridge (MCH)
+ 1043 801c P3C-2000 system chipset
+ 250b 82820 820 (Camino) Chipset Host Bridge
+ 250f 82820 820 (Camino) Chipset AGP Bridge
+ 2520 82805AA MTH Memory Translator Hub
+ 2521 82804AA MRH-S Memory Repeater Hub for SDRAM
+ 2530 82850 850 (Tehama) Chipset Host Bridge (MCH)
+ 1028 00c7 Dimension 8100
+ 147b 0507 TH7II-RAID
+ 2531 82860 860 (Wombat) Chipset Host Bridge (MCH)
+ 1028 00d8 Precision 530
+ 2532 82850 850 (Tehama) Chipset AGP Bridge
+ 2533 82860 860 (Wombat) Chipset AGP Bridge
+ 2534 82860 860 (Wombat) Chipset PCI Bridge
+ 2540 E7500 Memory Controller Hub
+ 15d9 3480 P4DP6
+ 2541 E7500/E7501 Host RASUM Controller
+ 15d9 3480 P4DP6
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 3424 SE7501HG2 Mainboard
+ 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge
+ 2544 E7500/E7501 Hub Interface B RASUM Controller
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge
+ 2546 E7500/E7501 Hub Interface C RASUM Controller
+ 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge
+ 2548 E7500/E7501 Hub Interface D RASUM Controller
+ 254c E7501 Memory Controller Hub
+ 4c53 1090 Cx9 / Vx9 mainboard
+ 8086 3424 SE7501HG2 Mainboard
+ 2550 E7505 Memory Controller Hub
+ 2551 E7505/E7205 Series RAS Controller
+ 2552 E7505/E7205 PCI-to-AGP Bridge
+ 2553 E7505 Hub Interface B PCI-to-PCI Bridge
+ 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller
+ 255d E7205 Memory Controller Hub
+ 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface
+ 1028 0126 Optiplex GX260
+ 1458 2560 GA-8PE667 Ultra
+ 1462 5800 845PE Max (MS-6580)
+ 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge
+ 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device
+ 0e11 00b9 Evo D510 SFF
+ 1014 0267 NetVista A30p
+ 1734 1003 D1521 Mainboard (Fujitsu-Siemens)
+ 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)
+ 2570 82865G/PE/P DRAM Controller/Host-Hub Interface
+ 103c 006a NX9500
+ 103c 12bc d330 uT
+ 1043 80f2 P4P800/P5P800 series motherboard
+ 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE)
+ 2571 82865G/PE/P PCI to AGP Controller
+ 2572 82865G Integrated Graphics Controller
+ 1028 019d Dimension 3000
+ 103c 12bc D530 sff(dc578av)
+ 1043 80a5 P5P800-MX Mainboard
+ 1462 7650 Hetis 865GV-E (MS-7065)
+ 1734 101b Fujitsu-Siemens Scenic E300 i865GV
+ 8086 4246 Desktop Board D865GBF
+ 8086 4c43 Desktop Board D865GLC
+ 2573 82865G/PE/P PCI to CSA Bridge
+ 2576 82865G/PE/P Processor to I/O Memory Interface
+ 2578 82875P/E7210 Memory Controller Hub
+ 1458 2578 GA-8KNXP motherboard (875P)
+ 1462 7580 MS-6758 (875P Neo)
+ 15d9 4580 P4SCE Motherboard
+ 2579 82875P Processor to AGP Controller
+ 257b 82875P/E7210 Processor to PCI to CSA Bridge
+ 257e 82875P/E7210 Processor to I/O Memory Interface
+ 2580 82915G/P/GV/GL/PL/910GL Memory Controller Hub
+ 1458 2580 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105b Scenic W620
+ 2581 82915G/P/GV/GL/PL/910GL PCI Express Root Port
+ 2582 82915G/GV/910GL Integrated Graphics Controller
+ 1028 1079 Optiplex GX280
+ 103c 3006 DC7100 SFF(DX878AV)
+ 1043 2582 P5GD1-VW Mainboard
+ 1458 2582 GA-8I915ME-G Mainboard
+ 1734 105b Scenic W620
+ 1849 2582 ASRock P4Dual-915GL
+ 2584 82925X/XE Memory Controller Hub
+ 1028 0177 Dimension 8400
+ 2585 82925X/XE PCI Express Root Port
+ 2588 E7220/E7221 Memory Controller Hub
+ 2589 E7220/E7221 PCI Express Root Port
+ 258a E7221 Integrated Graphics Controller
+ 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller
+ 1014 0575 ThinkPad Z60t
+ 1028 0182 Dell Latidude C610
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 104d 81b7 Vaio VGN-S3XP
+ a304 81b7 Vaio VGN-S3XP
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2591 Mobile 915GM/PM Express PCI Express Root Port
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ 2592 Mobile 915GM/GMS/910GML Express Graphics Controller
+ 103c 099c NX6110/NC6120
+ 103c 308a NC6220
+ 1043 1881 GMA 900 915GM Integrated Graphics
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 25a1 6300ESB LPC Interface Controller
+ 25a2 6300ESB PATA Storage Controller
+ 1775 10d0 V5D Single Board Computer IDE
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 25a3 6300ESB SATA Storage Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25a4 6300ESB SMBus Controller
+ 1775 10d0 V5D Single Board Computer
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25a6 6300ESB AC'97 Audio Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 25a7 6300ESB AC'97 Modem Controller
+ 25a9 6300ESB USB Universal Host Controller
+ 1775 10d0 V5D Single Board Computer USB
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25aa 6300ESB USB Universal Host Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ab 6300ESB Watchdog Timer
+ 1775 10d0 V5D Single Board Computer
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ac 6300ESB I/O Advanced Programmable Interrupt Controller
+ 1775 10d0 V5D Single Board Computer
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ad 6300ESB USB2 Enhanced Host Controller
+ 1775 10d0 V5D Single Board Computer USB 2.0
+ 1775 1100 CR11/VR11 Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25ae 6300ESB 64-bit PCI-X Bridge
+ 25b0 6300ESB SATA RAID Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 4c53 10e0 PSL09 PrPMC
+ 25c0 5000X Chipset Memory Controller Hub
+ 25d0 5000Z Chipset Memory Controller Hub
+ 25d4 5000V Chipset Memory Controller Hub
+ 15d9 8680 X7DVL-E-O motherboard
+ 25d8 5000P Chipset Memory Controller Hub
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25e2 5000 Series Chipset PCI Express x4 Port 2
+ 25e3 5000 Series Chipset PCI Express x4 Port 3
+ 25e4 5000 Series Chipset PCI Express x4 Port 4
+ 25e5 5000 Series Chipset PCI Express x4 Port 5
+ 25e6 5000 Series Chipset PCI Express x4 Port 6
+ 25e7 5000 Series Chipset PCI Express x4 Port 7
+ 25f0 5000 Series Chipset FSB Registers
+ 1028 01bb PowerEdge 1955 FSB Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f1 5000 Series Chipset Reserved Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f3 5000 Series Chipset Reserved Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f5 5000 Series Chipset FBD Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f6 5000 Series Chipset FBD Registers
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 25f7 5000 Series Chipset PCI Express x8 Port 2-3
+ 25f8 5000 Series Chipset PCI Express x8 Port 4-5
+ 25f9 5000 Series Chipset PCI Express x8 Port 6-7
+ 25fa 5000X Chipset PCI Express x16 Port 4-7
+ 2600 E8500/E8501 Hub Interface 1.5
+ 1028 0170 PowerEdge 6850 Hub Interface
+ 2601 E8500/E8501 PCI Express x4 Port D
+ 2602 E8500/E8501 PCI Express x4 Port C0
+ 2603 E8500/E8501 PCI Express x4 Port C1
+ 2604 E8500/E8501 PCI Express x4 Port B0
+ 2605 E8500/E8501 PCI Express x4 Port B1
+ 2606 E8500/E8501 PCI Express x4 Port A0
+ 2607 E8500/E8501 PCI Express x4 Port A1
+ 2608 E8500/E8501 PCI Express x8 Port C
+ 2609 E8500/E8501 PCI Express x8 Port B
+ 260a E8500/E8501 PCI Express x8 Port A
+ 260c E8500/E8501 IMI Registers
+ 2610 E8500/E8501 FSB Registers
+ 2611 E8500/E8501 Address Mapping Registers
+ 2612 E8500/E8501 RAS Registers
+ 2613 E8500/E8501 Reserved Registers
+ 2614 E8500/E8501 Reserved Registers
+ 2615 E8500/E8501 Miscellaneous Registers
+ 2617 E8500/E8501 Reserved Registers
+ 2618 E8500/E8501 Reserved Registers
+ 2619 E8500/E8501 Reserved Registers
+ 261a E8500/E8501 Reserved Registers
+ 261b E8500/E8501 Reserved Registers
+ 261c E8500/E8501 Reserved Registers
+ 261d E8500/E8501 Reserved Registers
+ 261e E8500/E8501 Reserved Registers
+ 2620 E8500/E8501 eXternal Memory Bridge
+ 1028 0170 PowerEdge 6850 Memory Bridge
+ 2621 E8500/E8501 XMB Miscellaneous Registers
+ 1028 0170 PowerEdge 6850 XMB Registers
+ 2622 E8500/E8501 XMB Memory Interleaving Registers
+ 1028 0170 PowerEdge 6850 Memory Interleaving Registers
+ 2623 E8500/E8501 XMB DDR Initialization and Calibration
+ 1028 0170 PowerEdge 6850 DDR Initialization and Calibration
+ 2624 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2625 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2626 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2627 E8500/E8501 XMB Reserved Registers
+ 1028 0170 PowerEdge 6850 Reserved Registers
+ 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2641 82801FBM (ICH6M) LPC Interface Bridge
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge
+ 2651 82801FB/FW (ICH6/ICH6W) SATA Controller
+ 1028 0179 Optiplex GX280
+ 1043 2601 P5GD1-VW Mainboard
+ 1734 105c Scenic W620
+ 8086 4147 D915GAG Motherboard
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller
+ 1028 0177 Dimension 8400
+ 1462 7028 915P/G Neo2
+ 2653 82801FBM (ICH6M) SATA Controller
+ 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 2558 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 2659 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 265a GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 265a GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 5006 GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ 8086 265c Dimension 3100
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ 103c 099c NX6110/NC6120
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2
+ 103c 0934 HP Compaq nw8240 Mobile Workstation
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller
+ 1014 05b7 ThinkPad Z60t
+# based on the PTGD1-LA motherboard
+ 103c 2a09 PufferM-UL8E
+ 1043 1173 Asus A6VC
+ 1043 814e P5GD1-VW Mainboard
+ 1462 7028 915P/G Neo2
+ 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 266a GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller
+ 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller
+ 1025 006a Conexant AC'97 CoDec (in Acer TravelMate 2410 serie laptop)
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller
+ 1025 006a Realtek ALC 655 codec (in Acer TravelMate 2410 serie laptop)
+ 1028 0177 Dimension 8400
+ 1028 0179 Optiplex GX280
+ 1028 0182 Latitude D610 Laptop
+ 1028 0187 Dell Precision M70 Laptop
+ 1028 0188 Inspiron 6000 laptop
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 0944 Compaq NC6220
+ 103c 099c NX6110/NC6120
+ 103c 3006 DC7100 SFF(DX878AV)
+ 1458 a002 GA-8I915ME-G Mainboard
+ 152d 0745 Packard Bell A8550 Laptop
+ 1734 105a Scenic W620
+ 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller
+ 1028 0177 Dimension 8400
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 099c NX6110/NC6120
+ 1043 80a6 P5GD1-VW Mainboard
+ 1458 266f GA-8I915ME-G Mainboard
+ 1462 7028 915P/G Neo2
+ 1734 105c Scenic W620
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 2670 631xESB/632xESB/3100 Chipset LPC Interface Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2680 631xESB/632xESB/3100 Chipset SATA IDE Controller
+ 2681 631xESB/632xESB SATA AHCI Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2682 631xESB/632xESB SATA RAID Controller
+ 2683 631xESB/632xESB SATA RAID Controller
+ 2688 631xESB/632xESB/3100 Chipset UHCI USB Controller #1
+ 1028 01bb PowerEdge 1955 onboard USB
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2689 631xESB/632xESB/3100 Chipset UHCI USB Controller #2
+ 1028 01bb PowerEdge 1955 onboard USB
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 268a 631xESB/632xESB/3100 Chipset UHCI USB Controller #3
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 268b 631xESB/632xESB/3100 Chipset UHCI USB Controller #4
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 268c 631xESB/632xESB/3100 Chipset EHCI USB2 Controller
+ 1028 01bb PowerEdge 1955 onboard USB
+ 1028 01f0 PowerEdge R900 onboard USB
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 2690 631xESB/632xESB/3100 Chipset PCI Express Root Port 1
+ 2692 631xESB/632xESB/3100 Chipset PCI Express Root Port 2
+ 2694 631xESB/632xESB/3100 Chipset PCI Express Root Port 3
+ 2696 631xESB/632xESB/3100 Chipset PCI Express Root Port 4
+ 2698 631xESB/632xESB AC '97 Audio Controller
+ 2699 631xESB/632xESB AC '97 Modem Controller
+ 269a 631xESB/632xESB High Definition Audio Controller
+ 269b 631xESB/632xESB/3100 Chipset SMBus Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 8086 3476 Intel S5000PSLSATA Server Board
+ 269e 631xESB/632xESB IDE Controller
+ 15d9 8680 X7DVL-E-O motherboard
+ 2770 82945G/GZ/P/PL Memory Controller Hub
+ 1028 01ad OptiPlex GX620
+ 103c 2a3b Pavilion A1512X
+ 1043 817a P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 8086 544e DeskTop Board D945GTP
+ 2771 82945G/GZ/P/PL PCI Express Root Port
+ 2772 82945G/GZ Integrated Graphics Controller
+ 103c 2a3b Pavilion A1512X
+ 8086 544e DeskTop Board D945GTP
+ 8086 d605 Intel Desktop Board D945GCCR
+ 2774 82955X Memory Controller Hub
+ 2775 82955X PCI Express Root Port
+ 2776 82945G/GZ Integrated Graphics Controller
+ 2778 E7230/3000/3010 Memory Controller Hub
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 2779 E7230/3000/3010 PCI Express Root Port
+ 277a 82975X/3010 PCI Express Root Port
+ 277c 82975X Memory Controller Hub
+ 1043 8178 P5WDG2 WS Professional motherboard
+ 277d 82975X PCI Express Root Port
+ 2782 82915G Integrated Graphics Controller
+ 1043 2582 P5GD1-VW Mainboard
+ 1734 105b Scenic W620
+ 2792 Mobile 915GM/GMS/910GML Express Graphics Controller
+ 103c 099c NX6110/NC6120
+ 1043 1881 GMA 900 915GM Integrated Graphics
+ e4bf 0ccd CCD-CALYPSO
+ e4bf 0cd3 CD3-JIVE
+ e4bf 58b1 XB1
+ 27a0 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub
+ 1025 006c 9814 WKMI
+ 1028 01d7 XPS M1210
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 17aa 2015 ThinkPad T60
+ 17aa 2017 ThinkPad T60/R60 series
+ 27a1 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express PCI Express Root Port
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 27a2 Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller
+ 103c 30a1 NC2400
+ 17aa 201a ThinkPad T60/R60 series
+ 9902 1584 CCE MPL-D10H120F
+ 27a6 Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller
+ 103c 30a1 NC2400
+ 1775 11cc CC11/CL11 integrated graphics (secondary)
+ 17aa 201a ThinkPad T60/R60 series
+ 27ac Mobile 945GME Express Memory Controller Hub
+ 1775 11cc CC11/CL11
+ 27ad Mobile 945GME Express PCI Express Root Port
+ 27ae Mobile 945GME Express Integrated Graphics Controller
+ 1775 11cc CC11/CL11 integrated graphics (primary)
+ 27b0 82801GH (ICH7DH) LPC Interface Bridge
+ 103c 2a3b Pavilion A1512X
+ 8086 544e DeskTop Board D945GTP
+ 27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge
+ 1028 01e6 PowerEdge 860
+ 1043 8179 P5KPL-VM Motherboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 8086 544e DeskTop Board D945GTP
+ 27b9 82801GBM (ICH7-M) LPC Interface Bridge
+ 1028 01d7 XPS M1210
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 17aa 2009 ThinkPad T60/R60 series
+ 27bc NM10 Family LPC Controller
+ 8086 4f4d DeskTop Board D510MO
+ 27bd 82801GHM (ICH7-M DH) LPC Interface Bridge
+ 1025 006c 9814 WKMI
+ 27c0 N10/ICH7 Family SATA IDE Controller
+ 1028 01ad OptiPlex GX620
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 1043 8179 P5KPL-VM Motherboard
+ 107b 5048 E4500
+ 1462 2310 MSI Hetis 945
+ 1462 7236 945P Neo3-F Rev. 2.2 motherboard
+ 1775 11cc CC11/CL11
+ 8086 544e DeskTop Board D945GTP
+ 27c1 N10/ICH7 Family SATA AHCI Controller
+ 1028 01df PowerEdge SC440
+ 103c 2a3b Pavilion A1512X
+ 1775 11cc CC11/CL11
+ 8086 4f4d DeskTop Board D510MO
+ 8086 5842 DeskTop Board D975XBX
+ 27c3 82801GR/GH (ICH7 Family) SATA RAID Controller
+ 1775 11cc CC11/CL11
+ 8086 544e DeskTop Board D945GTP
+ 27c4 82801GBM/GHM (ICH7 Family) SATA IDE Controller
+ 1025 006c 9814 WKMI
+ 1028 01d7 XPS M1210
+ 17aa 200e Thinkpad T60 model 2007
+ 27c5 82801GBM/GHM (ICH7 Family) SATA AHCI Controller
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 17aa 200d ThinkPad T60/R60 series
+ 27c6 82801GHM (ICH7-M DH) SATA RAID Controller
+ 27c8 N10/ICH 7 Family USB UHCI Controller #1
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27c9 N10/ICH 7 Family USB UHCI Controller #2
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27ca N10/ICH 7 Family USB UHCI Controller #3
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27cb N10/ICH 7 Family USB UHCI Controller #4
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 107b 5048 E4500
+ 1775 11cc CC11/CL11
+ 17aa 200a ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27cc N10/ICH 7 Family USB2 EHCI Controller
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM,P5LD2-VM Mainboard
+ 1775 11cc CC11/CL11
+ 17aa 200b ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 27d0 N10/ICH 7 Family PCI Express Port 1
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 1775 11cc CC11/CL11
+ 27d2 N10/ICH 7 Family PCI Express Port 2
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a3 Compaq nw8440
+ 1775 11cc CC11/CL11
+ 27d4 N10/ICH 7 Family PCI Express Port 3
+ 1775 11cc CC11/CL11
+ 27d6 N10/ICH 7 Family PCI Express Port 4
+ 103c 30a3 Compaq nw8440
+ 1775 11cc CC11/CL11
+ 27d8 N10/ICH 7 Family High Definition Audio Controller
+ 1025 006c 9814 WKMI
+ 1028 01d7 XPS M1210
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1123 A6J-Q008
+ 1043 13c4 Asus G2P
+ 1043 817f P5LD2-VM Mainboard (Realtek ALC 882 codec)
+ 1043 8290 P5KPL-VM Motherboard
+ 1043 82ea P5KPL-CM Motherboard
+ 107b 5048 E4500
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1179 ff10 Toshiba Satellite A100-796 audio (Realtek ALC861)
+ 1179 ff31 AC97 Data Fax SoftModem with SmartCP
+ 1447 1043 Asus A8JP (Analog Devices AD1986A)
+ 1458 a102 GA-8I945PG-RH Mainboard
+ 152d 0753 Softmodem
+ 1734 10ad Conexant softmodem SmartCP
+ 17aa 2010 ThinkPad T60/R60 series
+ 17aa 3802 Lenovo 3000 C200 audio [Realtek ALC861VD]
+ 8086 1112 DeskTop Board D945GTP
+ 8086 27d8 DeskTop Board D945GTP
+ 8086 d618 DeskTop Board D510MO
+ 27da N10/ICH 7 Family SMBus Controller
+ 1025 006c 9814 WKMI
+ 1028 01ad OptiPlex GX620
+ 1028 01d7 XPS M1210
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 1043 8179 P5KPL-VM Motherboard
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1458 5001 GA-8I945PG-RH Mainboard
+ 1775 11cc CC11/CL11
+ 17aa 200f ThinkPad T60/R60 series
+ 8086 4f4d DeskTop Board D510MO
+ 8086 544e DeskTop Board D945GTP
+ 8086 5842 DeskTop Board D975XBX
+ 27dc N10/ICH 7 Family LAN Controller
+ 103c 2a3b Pavilion A1512X
+ 8086 308d DeskTop Board D945GTP
+ 27dd 82801G (ICH7 Family) AC'97 Modem Controller
+ 27de 82801G (ICH7 Family) AC'97 Audio Controller
+ 1028 01ad OptiPlex GX620
+ 1462 7267 Realtek ALC883 Audio Controller
+ 1775 11cc CC11 integrated audio (AD1981BL codec)
+ 27df 82801G (ICH7 Family) IDE Controller
+ 1028 01df PowerEdge SC440
+ 1028 01e6 PowerEdge 860
+ 103c 2a3b Pavilion A1512X
+ 103c 309f Compaq nx9420 Notebook
+ 103c 30a1 NC2400
+ 103c 30a3 Compaq nw8440
+ 1043 1237 A6J-Q008
+ 1043 8179 P5KPL-VM Motherboard
+ 107b 5048 E4500
+ 10f7 8338 Panasonic CF-Y5 laptop
+ 1775 11cc CC11/CL11
+ 17aa 200c ThinkPad T60/R60 series
+ 8086 544e DeskTop Board D945GTP
+ 27e0 82801GR/GH/GHM (ICH7 Family) PCI Express Port 5
+ 1775 11cc CC11/CL11
+ 27e2 82801GR/GH/GHM (ICH7 Family) PCI Express Port 6
+ 1775 11cc CC11/CL11
+ 2802 82GL40 [Cantiga] High Definition Audio HDMI Service
+ 2810 82801HB/HR (ICH8/R) LPC Interface Controller
+ 1043 81ec P5B
+ 2811 82801HBM (ICH8M-E) LPC Interface Controller
+ 103c 30c1 Compaq 6910p
+ 17aa 20b6 T61
+ e4bf cc47 CCG-RUMBA
+ 2812 82801HH (ICH8DH) LPC Interface Controller
+ 2814 82801HO (ICH8DO) LPC Interface Controller
+ 2815 82801HEM (ICH8M) LPC Interface Controller
+ 1025 0121 Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 2820 82801H (ICH8 Family) 4 port SATA IDE Controller
+ 1028 01da OptiPlex 745
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 2821 82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA AHCI Controller
+ 2822 82801 SATA RAID Controller
+ 1028 020d Inspiron 530
+ 2824 82801HB (ICH8) 4 port SATA AHCI Controller
+ 1043 81ec P5B
+ 2825 82801H (ICH8 Family) 2 port SATA IDE Controller
+ 1028 01da OptiPlex 745
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 2826 Patsburg SATA RAID Controller
+ 2828 82801HBM/HEM (ICH8M/ICH8M-E) SATA IDE Controller
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ e4bf cc47 CCG-RUMBA
+ 2829 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller
+ 1025 0121 Aspire 5920G
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20a7 ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 282a Mobile 82801 SATA RAID Controller
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 2830 82801H (ICH8 Family) USB UHCI Controller #1
+ 1025 0121 Acer Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2831 82801H (ICH8 Family) USB UHCI Controller #2
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+# Name mistyped on previous submission
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2832 82801H (ICH8 Family) USB UHCI Controller #3
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2833 82801H (ICH8 Family) USB UHCI Controller #4
+ 1043 81ec P5B
+ 2834 82801H (ICH8 Family) USB UHCI Controller #4
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20aa ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2835 82801H (ICH8 Family) USB UHCI Controller #5
+ 1025 0121 Acer Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20aa ThinkPad T60
+ e4bf cc47 CCG-RUMBA
+ 2836 82801H (ICH8 Family) USB2 EHCI Controller #1
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20ab ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 283a 82801H (ICH8 Family) USB2 EHCI Controller #2
+ 1025 0121 Acer Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ab ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 283e 82801H (ICH8 Family) SMBus Controller
+ 1025 0121 Aspire 5920G
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 103c 30d9 Presario C700
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 9008 Vaio VGN-SZ79SN_C
+ 104d 902d VAIO VGN-NR120E
+ 1462 7235 P965 Neo MS-7235 mainboard
+ 17aa 20a9 ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 283f 82801H (ICH8 Family) PCI Express Port 1
+ 1028 01da OptiPlex 745
+ 103c 30c1 Compaq 6910p
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ad ThinkPad T61
+ 2841 82801H (ICH8 Family) PCI Express Port 2
+ 103c 30c1 Compaq 6910p
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ad ThinkPad T61
+ 2843 82801H (ICH8 Family) PCI Express Port 3
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20ad ThinkPad T61
+ 2845 82801H (ICH8 Family) PCI Express Port 4
+ 17aa 20ad ThinkPad T61
+ 2847 82801H (ICH8 Family) PCI Express Port 5
+ 1028 01da OptiPlex 745
+ 103c 30c1 Compaq 6910p
+ 17aa 20ad ThinkPad T61
+ 2849 82801H (ICH8 Family) PCI Express Port 6
+ 284b 82801H (ICH8 Family) HD Audio Controller
+ 1025 011f Realtek ALC268 audio codec
+ 1025 0121 Aspire 5920G
+ 1025 0145 Realtek ALC889 (Aspire 8920G w. Dolby Theather)
+ 1028 01da OptiPlex 745
+ 1028 01f3 Inspiron 1420
+ 1028 01f9 Dell Latitude D630
+ 1028 01ff Dell Precision M4300
+ 1028 0256 Studio 1735
+ 103c 2802 HP Compaq dc7700p
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 1043 1339 Asus M51S series
+ 1043 81ec P5B
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 9008 Vaio VGN-SZ79SN_C
+ 104d 9016 Sony VAIO VGN-AR51M
+ 104d 902d VAIO VGN-NR120E
+ 14f1 5051 Presario C700
+ 17aa 20ac ThinkPad T61
+ 8384 7616 Dell Vostro 1400
+ e4bf cc47 CCG-RUMBA
+ 284f 82801H (ICH8 Family) Thermal Reporting Device
+ 2850 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller
+ 1025 0121 Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20a6 ThinkPad T61
+ e4bf cc47 CCG-RUMBA
+ 2912 82801IH (ICH9DH) LPC Interface Controller
+ 2914 82801IO (ICH9DO) LPC Interface Controller
+ 1028 0211 Optiplex 755
+ 2916 82801IR (ICH9R) LPC Interface Controller
+ 1028 020d Inspiron 530
+ 2917 ICH9M-E LPC Interface Controller
+ e4bf cc4d CCM-BOOGIE
+ 2918 82801IB (ICH9) LPC Interface Controller
+ 1028 0236 PowerEdge R610 82801IB (ICH9) LPC Interface Controller
+ 1462 7360 G33/P35 Neo
+ 2919 ICH9M LPC Interface Controller
+ 2920 82801IR/IO/IH (ICH9R/DO/DH) 4 port SATA IDE Controller
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard SATA Controller
+ 1028 0210 PowerEdge T300 onboard SATA Controller
+ 1028 0211 Optiplex 755
+ 1028 023c PowerEdge R200 onboard SATA Controller
+ 2921 82801IB (ICH9) 2 port SATA IDE Controller
+ 1028 0235 PowerEdge R710 SATA IDE Controller
+ 1028 0236 PowerEdge R610 SATA IDE Controller
+ 1028 0237 PowerEdge T610 SATA IDE Controller
+ 1462 7360 G33/P35 Neo
+ 2922 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA AHCI Controller
+ 2923 82801IB (ICH9) 4 port SATA AHCI Controller
+ 2925 82801IR/IO (ICH9R/DO) SATA RAID Controller
+ 1734 10e0 System Board D2542
+ 8086 2925 System Board D2542
+ 2926 82801I (ICH9 Family) 2 port SATA IDE Controller
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard SATA Controller
+ 1028 0210 PowerEdge T300 onboard SATA Controller
+ 1028 0211 Optiplex 755
+ 1462 7360 G33/P35 Neo
+ 2928 ICH9M/M-E 2 port SATA IDE Controller
+ 2929 ICH9M/M-E SATA AHCI Controller
+ 103c 3628 dv6-1190en
+ e4bf cc4d CCM-BOOGIE
+ 292c ICH9M-E SATA RAID Controller
+ 292d ICH9M/M-E 2 port SATA IDE Controller
+ e4bf cc4d CCM-BOOGIE
+ 292e ICH9M SATA IDE Controller
+ 2930 82801I (ICH9 Family) SMBus Controller
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 103c 3628 dv6-1190en
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2932 82801I (ICH9 Family) Thermal Subsystem
+ 103c 3628 dv6-1190en
+ 2934 82801I (ICH9 Family) USB UHCI Controller #1
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard UHCI
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 023c PowerEdge R200 onboard UHCI
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1028 2011 Optiplex 755
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2935 82801I (ICH9 Family) USB UHCI Controller #2
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard UHCI
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 023c PowerEdge R200 onboard UHCI
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2936 82801I (ICH9 Family) USB UHCI Controller #3
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard UHCI
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0211 Optiplex 755
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 023c PowerEdge R200 onboard UHCI
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 2937 82801I (ICH9 Family) USB UHCI Controller #4
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1028 2011 Optiplex 755
+ 1462 7360 G33/P35 Neo
+ 8086 2937 Optiplex 755
+ 8086 2942 828011 (ICH9 Family ) USB UHCI Controller
+ e4bf cc4d CCM-BOOGIE
+ 2938 82801I (ICH9 Family) USB UHCI Controller #5
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB UHCI Controller
+ 1028 0236 PowerEdge R610 USB UHCI Controller
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1028 0287 PowerEdge M610 onboard UHCI
+ 1028 029c PowerEdge M710 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ 8086 2938 Optiplex 755
+ e4bf cc4d CCM-BOOGIE
+ 2939 82801I (ICH9 Family) USB UHCI Controller #6
+ 1028 020d Inspiron 530
+ 1028 0210 PowerEdge T300 onboard UHCI
+ 1028 0237 PowerEdge T610 USB UHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 293a 82801I (ICH9 Family) USB2 EHCI Controller #1
+ 1028 020d Inspiron 530
+ 1028 020f PowerEdge R300 onboard EHCI
+ 1028 0210 PowerEdge T300 onboard EHCI
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB EHCI Controller
+ 1028 0236 PowerEdge R610 USB EHCI Controller
+ 1028 0237 PowerEdge T610 USB EHCI Controller
+ 1028 023c PowerEdge R200 onboard EHCI
+ 1028 0287 PowerEdge M610 onboard EHCI
+ 1028 029c PowerEdge M710 USB EHCI Controller
+ 1462 7360 G33/P35 Neo
+ e4bf cc4d CCM-BOOGIE
+ 293c 82801I (ICH9 Family) USB2 EHCI Controller #2
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 1028 0235 PowerEdge R710 USB EHCI Controller
+ 1028 0236 PowerEdge R610 USB EHCI Controller
+ 1028 0237 PowerEdge T610 USB EHCI Controller
+ 1028 0287 PowerEdge M610 onboard EHCI
+ 1028 029c PowerEdge M710 USB EHCI Controller
+ 1462 7360 G33/P35 Neo
+ 8086 293c Optiplex 755
+ e4bf cc4d CCM-BOOGIE
+ 293e 82801I (ICH9 Family) HD Audio Controller
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 103c 3628 dv6-1190en
+ 1462 7360 G33/P35 Neo
+ 8086 293e Optiplex 755
+ 8086 2940 Optiplex 755
+ e4bf cc4d CCM-BOOGIE
+ 2940 82801I (ICH9 Family) PCI Express Port 1
+ 1028 020d Inspiron 530
+ 1028 0211 Optiplex 755
+ 8086 2940 Optiplex 755
+ 2942 82801I (ICH9 Family) PCI Express Port 2
+ 1028 020d Inspiron 530
+ 2944 82801I (ICH9 Family) PCI Express Port 3
+ 1028 020d Inspiron 530
+ 2946 82801I (ICH9 Family) PCI Express Port 4
+ 1028 020d Inspiron 530
+ 2948 82801I (ICH9 Family) PCI Express Port 5
+ 1028 020d Inspiron 530
+ 294a 82801I (ICH9 Family) PCI Express Port 6
+ 1028 020d Inspiron 530
+ 294c 82566DC-2 Gigabit Network Connection
+ 17aa 302e 82566DM-2 Gigabit Network Connection
+ 2970 82946GZ/PL/GL Memory Controller Hub
+ 2971 82946GZ/PL/GL PCI Express Root Port
+ 2972 82946GZ/GL Integrated Graphics Controller
+ 2973 82946GZ/GL Integrated Graphics Controller
+ 2974 82946GZ/GL HECI Controller
+ 2975 82946GZ/GL HECI Controller
+ 2976 82946GZ/GL PT IDER Controller
+ 2977 82946GZ/GL KT Controller
+ 2980 82G35 Express DRAM Controller
+ 2981 82G35 Express PCI Express Root Port
+ 2982 82G35 Express Integrated Graphics Controller
+ 2983 82G35 Express Integrated Graphics Controller
+ 2984 82G35 Express HECI Controller
+ 2990 82Q963/Q965 Memory Controller Hub
+ 1028 01da OptiPlex 745
+ 2991 82Q963/Q965 PCI Express Root Port
+ 2992 82Q963/Q965 Integrated Graphics Controller
+ 2993 82Q963/Q965 Integrated Graphics Controller
+ 2994 82Q963/Q965 HECI Controller
+ 2995 82Q963/Q965 HECI Controller
+ 2996 82Q963/Q965 PT IDER Controller
+ 2997 82Q963/Q965 KT Controller
+ 29a0 82P965/G965 Memory Controller Hub
+ 1043 81ea P5B
+ 1462 7276 MS-7276 [G965MDH]
+ 29a1 82P965/G965 PCI Express Root Port
+ 29a2 82G965 Integrated Graphics Controller
+ 1462 7276 MS-7276 [G965MDH]
+ 29a3 82G965 Integrated Graphics Controller
+ 29a4 82P965/G965 HECI Controller
+ 29a5 82P965/G965 HECI Controller
+ 29a6 82P965/G965 PT IDER Controller
+ 29a7 82P965/G965 KT Controller
+ 29b0 82Q35 Express DRAM Controller
+ 1028 0211 OptiPlex 755
+ 29b1 82Q35 Express PCI Express Root Port
+ 1028 0211 OptiPlex 755
+ 29b2 82Q35 Express Integrated Graphics Controller
+ 1028 0211 OptiPlex 755
+ 29b3 82Q35 Express Integrated Graphics Controller
+ 1028 0211 OptiPlex 755
+ 29b4 82Q35 Express MEI Controller
+ 1028 0211 OptiPlex 755
+ 29b5 82Q35 Express MEI Controller
+ 29b6 82Q35 Express PT IDER Controller
+ 1028 0211 OptiPlex 755
+ 29b7 82Q35 Express Serial KT Controller
+ 1028 0211 OptiPlex 755
+ 29c0 82G33/G31/P35/P31 Express DRAM Controller
+ 1028 020d Inspiron 530
+ 1043 82b0 P5KPL-VM Motherboard
+ 1462 7360 G33/P35 Neo
+ 29c1 82G33/G31/P35/P31 Express PCI Express Root Port
+ 1028 020d Inspiron 530
+ 29c2 82G33/G31 Express Integrated Graphics Controller
+ 1028 020d Inspiron 530
+ 1043 82b0 P5KPL-VM Motherboard
+ 29c3 82G33/G31 Express Integrated Graphics Controller
+ 1028 020d Inspiron 530
+ 1043 82b0 P5KPL-VM Motherboard
+ 29c4 82G33/G31/P35/P31 Express MEI Controller
+ 29c5 82G33/G31/P35/P31 Express MEI Controller
+ 29c6 82G33/G31/P35/P31 Express PT IDER Controller
+ 29c7 82G33/G31/P35/P31 Express Serial KT Controller
+ 29cf Virtual HECI Controller
+ 29d0 82Q33 Express DRAM Controller
+ 29d1 82Q33 Express PCI Express Root Port
+ 29d2 82Q33 Express Integrated Graphics Controller
+ 29d3 82Q33 Express Integrated Graphics Controller
+ 29d4 82Q33 Express MEI Controller
+ 29d5 82Q33 Express MEI Controller
+ 29d6 82Q33 Express PT IDER Controller
+ 29d7 82Q33 Express Serial KT Controller
+ 29e0 82X38/X48 Express DRAM Controller
+ 29e1 82X38/X48 Express Host-Primary PCI Express Bridge
+ 29e4 82X38/X48 Express MEI Controller
+ 29e5 82X38/X48 Express MEI Controller
+ 29e6 82X38/X48 Express PT IDER Controller
+ 29e7 82X38/X48 Express Serial KT Controller
+ 29e9 82X38/X48 Express Host-Secondary PCI Express Bridge
+ 29f0 3200/3210 Chipset DRAM Controller
+ 29f1 3200/3210 Chipset Host-Primary PCI Express Bridge
+ 29f4 3200/3210 Chipset MEI Controller
+ 29f5 3200/3210 Chipset MEI Controller
+ 29f6 3200/3210 Chipset PT IDER Controller
+ 29f7 3200/3210 Chipset Serial KT Controller
+ 29f9 3210 Chipset Host-Secondary PCI Express Bridge
+ 2a00 Mobile PM965/GM965/GL960 Memory Controller Hub
+ 1025 0121 Acer Aspire 5920G
+ 1028 01f3 Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30c1 Compaq 6910p
+ 103c 30d9 Presario C700
+ 104d 9005 Vaio VGN-FZ260E
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20b1 ThinkPad T61
+ 17aa 20b3 T61
+ e4bf cc47 CCG-RUMBA
+ 2a01 Mobile PM965/GM965/GL960 PCI Express Root Port
+ 2a02 Mobile GM965/GL960 Integrated Graphics Controller (primary)
+ 1028 01f3 Inspiron 1420
+ 1028 01f9 Latitude D630
+ 103c 30c0 Compaq 6710b
+ 103c 30d9 Presario C700
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20b5 T61
+ e4bf cc47 CCG-RUMBA
+ 2a03 Mobile GM965/GL960 Integrated Graphics Controller (secondary)
+ 1028 01f3 Dell Inspiron 1420
+ 103c 30c0 Compaq 6710b
+ 103c 30d9 Presario C700
+ 104d 902d VAIO VGN-NR120E
+ 17aa 20b5 T61
+ e4bf cc47 CCG-RUMBA
+ 2a04 Mobile PM965/GM965 MEI Controller
+ 103c 30c1 Compaq 6910p
+ 2a05 Mobile PM965/GM965 MEI Controller
+ 2a06 Mobile PM965/GM965 PT IDER Controller
+ 103c 30c1 Compaq 6910p
+ 2a07 Mobile PM965/GM965 KT Controller
+ 103c 30c1 Compaq 6910p
+ 2a10 Mobile GME965/GLE960 Memory Controller Hub
+ e4bf cc47 CCG-RUMBA
+ 2a11 Mobile GME965/GLE960 PCI Express Root Port
+ 2a12 Mobile GME965/GLE960 Integrated Graphics Controller
+ e4bf cc47 CCG-RUMBA
+ 2a13 Mobile GME965/GLE960 Integrated Graphics Controller
+ e4bf cc47 CCG-RUMBA
+ 2a14 Mobile GME965/GLE960 MEI Controller
+ 2a15 Mobile GME965/GLE960 MEI Controller
+ 2a16 Mobile GME965/GLE960 PT IDER Controller
+ 2a17 Mobile GME965/GLE960 KT Controller
+ 2a40 Mobile 4 Series Chipset Memory Controller Hub
+ e4bf cc4d CCM-BOOGIE
+ 2a41 Mobile 4 Series Chipset PCI Express Graphics Port
+ e4bf cc4d CCM-BOOGIE
+ 2a42 Mobile 4 Series Chipset Integrated Graphics Controller
+ e4bf cc4d CCM-BOOGIE
+ 2a43 Mobile 4 Series Chipset Integrated Graphics Controller
+ e4bf cc4d CCM-BOOGIE
+ 2a44 Mobile 4 Series Chipset MEI Controller
+ 2a45 Mobile 4 Series Chipset MEI Controller
+ 2a46 Mobile 4 Series Chipset PT IDER Controller
+ 2a47 Mobile 4 Series Chipset AMT SOL Redirection
+ 2a50 Cantiga MEI Controller
+ 2a51 Cantiga MEI Controller
+ 2a52 Cantiga PT IDER Controller
+ 2a53 Cantiga AMT SOL Redirection
+ 2b00 Xeon Processor E7 Product Family System Configuration Controller 1
+ 2b02 Xeon Processor E7 Product Family System Configuration Controller 2
+ 2b04 Xeon Processor E7 Product Family Power Controller
+ 2b08 Xeon Processor E7 Product Family Caching Agent 0
+ 2b0c Xeon Processor E7 Product Family Caching Agent 1
+ 2b10 Xeon Processor E7 Product Family QPI Home Agent 0
+ 2b13 Xeon Processor E7 Product Family Memory Controller 0c
+ 2b14 Xeon Processor E7 Product Family Memory Controller 0a
+ 2b16 Xeon Processor E7 Product Family Memory Controller 0b
+ 2b18 Xeon Processor E7 Product Family QPI Home Agent 1
+ 2b1b Xeon Processor E7 Product Family Memory Controller 1c
+ 2b1c Xeon Processor E7 Product Family Memory Controller 1a
+ 2b1e Xeon Processor E7 Product Family Memory Controller 1b
+ 2b20 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 0
+ 2b22 Xeon Processor E7 Product Family System Configuration Controller 3
+ 2b24 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 1
+ 2b28 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 2
+ 2b2a Xeon Processor E7 Product Family System Configuration Controller 4
+ 2b2c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 3
+ 2b30 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 4
+ 2b34 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 5
+ 2b38 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 6
+ 2b3c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 7
+ 2b40 Xeon Processor E7 Product Family QPI Router Port 0-1
+ 2b42 Xeon Processor E7 Product Family QPI Router Port 2-3
+ 2b44 Xeon Processor E7 Product Family QPI Router Port 4-5
+ 2b46 Xeon Processor E7 Product Family QPI Router Port 6-7
+ 2b48 Xeon Processor E7 Product Family Test and Debug 0
+ 2b4c Xeon Processor E7 Product Family Test and Debug 1
+ 2b50 Xeon Processor E7 Product Family QPI Physical Port 0: REUT control/status
+ 2b52 Xeon Processor E7 Product Family QPI Physical Port 0: Misc. control/status
+ 2b54 Xeon Processor E7 Product Family QPI Physical Port 1: REUT control/status
+ 2b56 Xeon Processor E7 Product Family QPI Physical Port 1: Misc. control/status
+ 2b58 Xeon Processor E7 Product Family QPI Physical Port 2: REUT control/status
+ 2b5a Xeon Processor E7 Product Family QPI Physical Port 2: Misc. control/status
+ 2b5c Xeon Processor E7 Product Family QPI Physical Port 3: REUT control/status
+ 2b5e Xeon Processor E7 Product Family QPI Physical Port 3: Misc. control/status
+ 2b60 Xeon Processor E7 Product Family SMI Physical Port 0: REUT control/status
+ 2b62 Xeon Processor E7 Product Family SMI Physical Port 0: Misc control/status
+ 2b64 Xeon Processor E7 Product Family SMI Physical Port 1: REUT control/status
+ 2b66 Xeon Processor E7 Product Family SMI Physical Port 1: Misc control/status
+ 2b68 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 8
+ 2b6c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 9
+ 2c01 Xeon 5500/Core i7 QuickPath Architecture System Address Decoder
+ 2c10 Xeon 5500/Core i7 QPI Link 0
+ 2c11 Xeon 5500/Core i7 QPI Physical 0
+ 2c14 Xeon 5500/Core i7 QPI Link 1
+ 2c15 Xeon 5500/Core i7 QPI Physical 1
+ 2c18 Xeon 5500/Core i7 Integrated Memory Controller
+ 2c19 Xeon 5500/Core i7 Integrated Memory Controller Target Address Decoder
+ 2c1a Xeon 5500/Core i7 Integrated Memory Controller RAS Registers
+ 2c1c Xeon 5500/Core i7 Integrated Memory Controller Test Registers
+ 2c20 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Control Registers
+ 2c21 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Address Registers
+ 2c22 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Rank Registers
+ 2c23 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Thermal Control Registers
+ 2c28 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Control Registers
+ 2c29 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Address Registers
+ 2c2a Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Rank Registers
+ 2c2b Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Thermal Control Registers
+ 2c30 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Control Registers
+ 2c31 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Address Registers
+ 2c32 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Rank Registers
+ 2c33 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Thermal Control Registers
+ 2c40 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers
+ 2c41 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers
+ 2c50 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c51 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c52 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c53 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c54 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c55 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c56 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c57 Core Processor QuickPath Architecture Generic Non-Core Registers
+ 2c58 Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c59 Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5a Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5b Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5c Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5d Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5e Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c5f Xeon C5500/C3500 QPI Generic Non-core Registers
+ 2c61 Core Processor QuickPath Architecture Generic Non-core Registers
+ 2c62 Core Processor QuickPath Architecture Generic Non-core Registers
+ 2c70 Xeon 5600 Series QuickPath Architecture Generic Non-core Registers
+ 2c81 Core Processor QuickPath Architecture System Address Decoder
+ 2c90 Core Processor QPI Link 0
+ 2c91 Core Processor QPI Physical 0
+ 2c98 Core Processor Integrated Memory Controller
+ 2c99 Core Processor Integrated Memory Controller Target Address Decoder
+ 2c9a Core Processor Integrated Memory Controller Test Registers
+ 2c9c Core Processor Integrated Memory Controller Test Registers
+ 2ca0 Core Processor Integrated Memory Controller Channel 0 Control Registers
+ 2ca1 Core Processor Integrated Memory Controller Channel 0 Address Registers
+ 2ca2 Core Processor Integrated Memory Controller Channel 0 Rank Registers
+ 2ca3 Core Processor Integrated Memory Controller Channel 0 Thermal Control Registers
+ 2ca8 Core Processor Integrated Memory Controller Channel 1 Control Registers
+ 2ca9 Core Processor Integrated Memory Controller Channel 1 Address Registers
+ 2caa Core Processor Integrated Memory Controller Channel 1 Rank Registers
+ 2cab Core Processor Integrated Memory Controller Channel 1 Thermal Control Registers
+ 2cc1 Xeon C5500/C3500 QPI System Address Decoder
+ 2cd0 Xeon C5500/C3500 QPI Link 0
+ 2cd1 Xeon C5500/C3500 QPI Physical 0
+ 2cd4 Xeon C5500/C3500 QPI Link 1
+ 2cd5 Xeon C5500/C3500 QPI Physical 1
+ 2cd8 Xeon C5500/C3500 Integrated Memory Controller Registers
+ 2cd9 Xeon C5500/C3500 Integrated Memory Controller Target Address Decoder
+ 2cda Xeon C5500/C3500 Integrated Memory Controller RAS Registers
+ 2cdc Xeon C5500/C3500 Integrated Memory Controller Test Registers
+ 2ce0 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Control
+ 2ce1 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Address
+ 2ce2 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Rank
+ 2ce3 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Thermal Control
+ 2ce8 Xeon C5500/C3500 Integrated Memory Controller Channel 1 Control
+ 2ce9 Xeon C5500/C3500 Integrated Memory Controller Channel 1 Address
+ 2cea Xeon C5500/C3500 Integrated Memory Controller Channel 1 Rank
+ 2ceb Xeon C5500/C3500 Integrated Memory Controller Channel 1 Thermal Control
+ 2cf0 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Control
+ 2cf1 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Address
+ 2cf2 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Rank
+ 2cf3 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Thermal Control
+ 2d01 Core Processor QuickPath Architecture System Address Decoder
+ 2d10 Core Processor QPI Link 0
+ 2d11 Core Processor QPI Physical 0
+ 2d12 Core Processor Reserved
+ 2d13 Core Processor Reserved
+ 2d81 Xeon 5600 Series QuickPath Architecture System Address Decoder
+ 2d90 Xeon 5600 Series QPI Link 0
+ 2d91 Xeon 5600 Series QPI Physical 0
+ 2d92 Xeon 5600 Series Mirror Port Link 0
+ 2d93 Xeon 5600 Series Mirror Port Link 1
+ 2d94 Xeon 5600 Series QPI Link 1
+ 2d95 Xeon 5600 Series QPI Physical 1
+ 2d98 Xeon 5600 Series Integrated Memory Controller Registers
+ 2d99 Xeon 5600 Series Integrated Memory Controller Target Address Decoder
+ 2d9a Xeon 5600 Series Integrated Memory Controller RAS Registers
+ 2d9c Xeon 5600 Series Integrated Memory Controller Test Registers
+ 2da0 Xeon 5600 Series Integrated Memory Controller Channel 0 Control
+ 2da1 Xeon 5600 Series Integrated Memory Controller Channel 0 Address
+ 2da2 Xeon 5600 Series Integrated Memory Controller Channel 0 Rank
+ 2da3 Xeon 5600 Series Integrated Memory Controller Channel 0 Thermal Control
+ 2da8 Xeon 5600 Series Integrated Memory Controller Channel 1 Control
+ 2da9 Xeon 5600 Series Integrated Memory Controller Channel 1 Address
+ 2daa Xeon 5600 Series Integrated Memory Controller Channel 1 Rank
+ 2dab Xeon 5600 Series Integrated Memory Controller Channel 1 Thermal Control
+ 2db0 Xeon 5600 Series Integrated Memory Controller Channel 2 Control
+ 2db1 Xeon 5600 Series Integrated Memory Controller Channel 2 Address
+ 2db2 Xeon 5600 Series Integrated Memory Controller Channel 2 Rank
+ 2db3 Xeon 5600 Series Integrated Memory Controller Channel 2 Thermal Control
+ 2e00 4 Series Chipset DRAM Controller
+ 2e01 4 Series Chipset PCI Express Root Port
+ 2e02 4 Series Chipset Integrated Graphics Controller
+ 2e03 4 Series Chipset Integrated Graphics Controller
+ 2e04 4 Series Chipset HECI Controller
+ 2e05 4 Series Chipset HECI Controller
+ 2e06 4 Series Chipset PT IDER Controller
+ 2e07 4 Series Chipset Serial KT Controller
+ 2e10 4 Series Chipset DRAM Controller
+ 2e11 4 Series Chipset PCI Express Root Port
+ 2e12 4 Series Chipset Integrated Graphics Controller
+ 2e13 4 Series Chipset Integrated Graphics Controller
+ 2e14 4 Series Chipset HECI Controller
+ 2e15 4 Series Chipset HECI Controller
+ 2e16 4 Series Chipset PT IDER Controller
+ 2e17 4 Series Chipset Serial KT Controller
+ 2e20 4 Series Chipset DRAM Controller
+ 1458 5000 GA-EP45-DS5 Motherboard
+ 2e21 4 Series Chipset PCI Express Root Port
+ 1458 5000 GA-EP45-DS5 Motherboard
+ 2e22 4 Series Chipset Integrated Graphics Controller
+ 2e23 4 Series Chipset Integrated Graphics Controller
+ 2e24 4 Series Chipset HECI Controller
+ 2e25 4 Series Chipset HECI Controller
+ 2e26 4 Series Chipset PT IDER Controller
+ 2e27 4 Series Chipset Serial KT Controller
+ 2e29 4 Series Chipset PCI Express Root Port
+ 2e30 4 Series Chipset DRAM Controller
+ 2e31 4 Series Chipset PCI Express Root Port
+ 2e32 4 Series Chipset Integrated Graphics Controller
+ 2e33 4 Series Chipset Integrated Graphics Controller
+ 2e34 4 Series Chipset HECI Controller
+ 2e35 4 Series Chipset HECI Controller
+ 2e36 4 Series Chipset PT IDER Controller
+ 2e37 4 Series Chipset Serial KT Controller
+ 2e40 4 Series Chipset DRAM Controller
+ 2e41 4 Series Chipset PCI Express Root Port
+ 2e42 4 Series Chipset Integrated Graphics Controller
+ 2e43 4 Series Chipset Integrated Graphics Controller
+ 2e44 4 Series Chipset HECI Controller
+ 2e45 4 Series Chipset HECI Controller
+ 2e46 4 Series Chipset PT IDER Controller
+ 2e47 4 Series Chipset Serial KT Controller
+ 2e50 CE Media Processor CE3100
+ 2e52 CE Media Processor Clock and Reset Controller
+ 2e58 CE Media Processor Interrupt Controller
+ 2e5a CE Media Processor CE3100 A/V Bridge
+ 2e5b Graphics Media Accelerator 500 Graphics
+ 2e5c CE Media Processor Video Decoder
+ 2e5d CE Media Processor Transport Stream Interface
+ 2e5e CE Media Processor Transport Stream Processor 0
+ 2e5f CE Media Processor Audio DSP
+ 2e60 CE Media Processor Audio Interfaces
+ 2e61 CE Media Processor Video Display Controller
+ 2e62 CE Media Processor Video Processing Unit
+ 2e63 CE Media Processor HDMI Tx Interface
+ 2e65 CE Media Processor Expansion Bus Interface
+ 2e66 CE Media Processor UART
+ 2e67 CE Media Processor General Purpose I/Os
+ 2e68 CE Media Processor I2C Interface
+ 2e69 CE Media Processor Smart Card Interface
+ 2e6a CE Media Processor SPI Master Interface
+ 2e6e CE Media Processor Gigabit Ethernet Controller
+ 2e6f CE Media Processor Media Timing Unit
+ 2e70 CE Media Processor USB
+ 2e71 CE Media Processor SATA
+ 2e73 CE Media Processor CE3100 PCI Express
+ 2e90 4 Series Chipset DRAM Controller
+ 2e91 4 Series Chipset PCI Express Root Port
+ 2e92 4 Series Chipset Integrated Graphics Controller
+ 2e93 4 Series Chipset Integrated Graphics Controller
+ 2e94 4 Series Chipset HECI Controller
+ 2e95 4 Series Chipset HECI Controller
+ 2e96 4 Series Chipset PT IDER Controller
+ 3200 GD31244 PCI-X SATA HBA
+ 1775 c200 C2K onboard SATA host bus adapter
+ 3310 IOP348 I/O Processor
+ 1054 3030 HRA380 Hitachi RAID Adapter to PCIe
+ 1054 3034 HRA381 Hitachi RAID Adapter to PCIe
+ 3313 IOP348 I/O Processor (SL8e) in IOC Mode SAS/SATA
+ 331b IOP348 I/O Processor (SL8x) in IOC Mode SAS/SATA
+ 3331 IOC340 I/O Controller (VV8e) SAS/SATA
+ 3339 IOC340 I/O Controller (VV8x) SAS/SATA
+ 3340 82855PM Processor to I/O Controller
+ 1014 0529 Thinkpad T40 series
+ 1025 005a TravelMate 290
+ 103c 088c NC8000 laptop
+ 103c 0890 NC6000 laptop
+ 103c 08b0 tc1100 tablet
+ 144d c005 X10 Laptop
+ 144d c00c P30/P35 notebook
+ 3341 82855PM Processor to AGP Controller
+ 144d c00c P30 notebook
+ 3363 IOC340 I/O Controller in IOC Mode SAS/SATA
+ 3382 81342 [Chevelon] I/O Processor (ATUe)
+ 33c3 IOP348 I/O Processor (SL8De) in IOC Mode SAS/SATA
+ 33cb IOP348 I/O Processor (SL8Dx) in IOC Mode SAS/SATA
+ 3400 5520/5500/X58 I/O Hub to ESI Port
+ 3401 5520/5500/X58 I/O Hub to ESI Port
+ 3402 5520/5500/X58 I/O Hub to ESI Port
+ 3403 5500 I/O Hub to ESI Port
+ 1028 0236 PowerEdge R610 I/O Hub to ESI Port
+ 1028 0287 PowerEdge M610 I/O Hub to ESI Port
+ 1028 028c PowerEdge R410 I/O Hub to ESI Port
+ 1028 028d PowerEdge T410 I/O Hub to ESI Port
+ 3404 5520/5500/X58 I/O Hub to ESI Port
+ 3405 5520/5500/X58 I/O Hub to ESI Port
+ 3406 5520 I/O Hub to ESI Port
+ 3407 5520/5500/X58 I/O Hub to ESI Port
+ 3408 5520/5500/X58 I/O Hub PCI Express Root Port 1
+ 3409 5520/5500/X58 I/O Hub PCI Express Root Port 2
+ 340a 5520/5500/X58 I/O Hub PCI Express Root Port 3
+ 340b 5520/X58 I/O Hub PCI Express Root Port 4
+ 340c 5520/X58 I/O Hub PCI Express Root Port 5
+ 340d 5520/X58 I/O Hub PCI Express Root Port 6
+ 340e 5520/5500/X58 I/O Hub PCI Express Root Port 7
+ 340f 5520/5500/X58 I/O Hub PCI Express Root Port 8
+ 3410 5520/5500/X58 I/O Hub PCI Express Root Port 9
+ 3411 5520/5500/X58 I/O Hub PCI Express Root Port 10
+ 3418 5520/5500/X58 Physical Layer Port 0
+ 3419 5520/5500 Physical Layer Port 1
+ 3420 5500 Non-Legacy I/O Hub PCI Express Root Port 0
+ 3421 5520 Non-Legacy I/O Hub PCI Express Root Port 0
+ 3422 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers
+ 3423 5520/5500/X58 I/O Hub Control Status and RAS Registers
+ 3425 5520/5500/X58 Physical and Link Layer Registers Port 0
+ 3426 5520/5500/X58 Routing and Protocol Layer Registers Port 0
+ 3427 5520/5500 Physical and Link Layer Registers Port 1
+ 3428 5520/5500 Routing & Protocol Layer Register Port 1
+ 3429 5520/5500/X58 Chipset QuickData Technology Device
+ 342a 5520/5500/X58 Chipset QuickData Technology Device
+ 342b 5520/5500/X58 Chipset QuickData Technology Device
+ 342c 5520/5500/X58 Chipset QuickData Technology Device
+ 342d 5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller
+ 342e 5520/5500/X58 I/O Hub System Management Registers
+ 342f 5520/5500/X58 Trusted Execution Technology Registers
+ 3430 5520/5500/X58 Chipset QuickData Technology Device
+ 3431 5520/5500/X58 Chipset QuickData Technology Device
+ 3432 5520/5500/X58 Chipset QuickData Technology Device
+ 3433 5520/5500/X58 Chipset QuickData Technology Device
+ 3438 5520/5500/X58 I/O Hub Throttle Registers
+ 3500 6311ESB/6321ESB PCI Express Upstream Port
+ 3501 6310ESB PCI Express Upstream Port
+ 3504 6311ESB/6321ESB I/OxAPIC Interrupt Controller
+ 3505 6310ESB I/OxAPIC Interrupt Controller
+ 350c 6311ESB/6321ESB PCI Express to PCI-X Bridge
+ 350d 6310ESB PCI Express to PCI-X Bridge
+ 3510 6311ESB/6321ESB PCI Express Downstream Port E1
+ 3511 6310ESB PCI Express Downstream Port E1
+ 3514 6311ESB/6321ESB PCI Express Downstream Port E2
+ 3515 6310ESB PCI Express Downstream Port E2
+ 3518 6311ESB/6321ESB PCI Express Downstream Port E3
+ 3519 6310ESB PCI Express Downstream Port E3
+ 3575 82830 830 Chipset Host Bridge
+ 0e11 0030 Evo N600c
+ 1014 021d ThinkPad A/T/X Series
+ 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+ 3576 82830 830 Chipset AGP Bridge
+ 3577 82830 CGC [Chipset Graphics Controller]
+ 1014 0513 ThinkPad A/T/X Series
+ 3578 82830 830 Chipset Host Bridge
+ 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+ 1014 055c ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 114a 0582 PC8
+ 1734 1055 Amilo M1420
+ 1775 10d0 V5D Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller
+ 1734 1055 Amilo M1420
+ 3582 82852/855GM Integrated Graphics Device
+ 1014 0562 ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 114a 0582 PC8 integrated graphics
+ 1775 10d0 V5D Single Board Computer VGA
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ e4bf 0cc9 CC9-SAMBA
+ e4bf 0cd2 CD2-BEBOP
+ 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+ 1014 055d ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 114a 0582 PC8
+ 1734 1055 Amilo M1420
+ 1775 10d0 V5D Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+ 1014 055e ThinkPad R50e
+ 1028 0139 Latitude D400
+ 1028 014f Latitude X300
+ 1028 0152 Latitude D500
+ 1028 0163 Latitude D505
+ 1028 018d Inspiron 700m/710m
+ 1028 0196 Inspiron 5160
+ 114a 0582 PC8
+ 1734 1055 Amilo M1420
+ 1775 10d0 V5D Single Board Computer
+ 1775 ce90 CE9
+ 4c53 10b0 CL9 mainboard
+ 4c53 10e0 PSL09 PrPMC
+ 358c 82854 GMCH
+ 358e 82854 GMCH Integrated Graphics Device
+ 3590 E7520 Memory Controller Hub
+ 1014 02dd eServer xSeries server mainboard
+ 1028 016c PowerEdge 1850 Memory Controller Hub
+ 1028 016d PowerEdge 2850 Memory Controller Hub
+ 1028 019a PowerEdge SC1425
+ 1734 103e PRIMERGY RX/TX S2 series
+ 1775 1100 CR11/VR11 Single Board Computer
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 3591 E7525/E7520 Error Reporting Registers
+ 1014 02dd eServer xSeries server mainboard
+ 1028 0169 Precision 470
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 3592 E7320 Memory Controller Hub
+ 3593 E7320 Error Reporting Registers
+ 3594 E7520 DMA Controller
+ 1775 1100 CR11/VR11 Single Board Computer
+ 4c53 10d0 Telum ASLP10 Processor AMC
+ 3595 E7525/E7520/E7320 PCI Express Port A
+ 1775 1100 CR11/VR11 Single Board Computer
+ 3596 E7525/E7520/E7320 PCI Express Port A1
+ 3597 E7525/E7520 PCI Express Port B
+ 1775 1100 CR11/VR11 Single Board Computer
+ 3598 E7520 PCI Express Port B1
+ 1775 1100 CR11/VR11 Single Board Computer
+ 3599 E7520 PCI Express Port C
+ 1775 1100 CR11/VR11 Single Board Computer
+ 359a E7520 PCI Express Port C1
+ 359b E7525/E7520/E7320 Extended Configuration Registers
+ 1014 02dd eServer xSeries server mainboard
+ 359e E7525 Memory Controller Hub
+ 1028 0169 Precision 470
+ 35b0 3100 Chipset Memory I/O Controller Hub
+ 35b1 3100 DRAM Controller Error Reporting Registers
+ 35b5 3100 Chipset Enhanced DMA Controller
+ 35b6 3100 Chipset PCI Express Port A
+ 35b7 3100 Chipset PCI Express Port A1
+ 35c8 3100 Extended Configuration Test Overflow Registers
+ 3600 7300 Chipset Memory Controller Hub
+ 3604 7300 Chipset PCI Express Port 1
+ 3605 7300 Chipset PCI Express Port 2
+ 3606 7300 Chipset PCI Express Port 3
+ 3607 7300 Chipset PCI Express Port 4
+ 3608 7300 Chipset PCI Express Port 5
+ 3609 7300 Chipset PCI Express Port 6
+ 360a 7300 Chipset PCI Express Port 7
+ 360b 7300 Chipset QuickData Technology Device
+ 360c 7300 Chipset FSB Registers
+ 1028 01f0 PowerEdge R900 7300 Chipset FSB Registers
+ 360d 7300 Chipset Snoop Filter Registers
+ 360e 7300 Chipset Debug and Miscellaneous Registers
+ 360f 7300 Chipset FBD Branch 0 Registers
+ 3610 7300 Chipset FBD Branch 1 Registers
+ 3700 Xeon C5500/C3500 DMI
+ 3701 Xeon C5500/C3500 DMI
+ 3702 Xeon C5500/C3500 DMI
+ 3703 Xeon C5500/C3500 DMI
+ 3704 Xeon C5500/C3500 DMI
+ 3705 Xeon C5500/C3500 DMI
+ 3706 Xeon C5500/C3500 DMI
+ 3707 Xeon C5500/C3500 DMI
+ 3708 Xeon C5500/C3500 DMI
+ 3709 Xeon C5500/C3500 DMI
+ 370a Xeon C5500/C3500 DMI
+ 370b Xeon C5500/C3500 DMI
+ 370c Xeon C5500/C3500 DMI
+ 370d Xeon C5500/C3500 DMI
+ 370e Xeon C5500/C3500 DMI
+ 370f Xeon C5500/C3500 DMI
+ 3710 Xeon C5500/C3500 CB3 DMA
+ 3711 Xeon C5500/C3500 CB3 DMA
+ 3712 Xeon C5500/C3500 CB3 DMA
+ 3713 Xeon C5500/C3500 CB3 DMA
+ 3714 Xeon C5500/C3500 CB3 DMA
+ 3715 Xeon C5500/C3500 CB3 DMA
+ 3716 Xeon C5500/C3500 CB3 DMA
+ 3717 Xeon C5500/C3500 CB3 DMA
+ 3718 Xeon C5500/C3500 CB3 DMA
+ 3719 Xeon C5500/C3500 CB3 DMA
+ 371a Xeon C5500/C3500 QPI Link
+ 371b Xeon C5500/C3500 QPI Routing and Protocol
+ 371d Xeon C5500/C3500 QPI Routing and Protocol
+ 3720 Xeon C5500/C3500 PCI Express Root Port 0
+ 3721 Xeon C5500/C3500 PCI Express Root Port 1
+ 3722 Xeon C5500/C3500 PCI Express Root Port 2
+ 3723 Xeon C5500/C3500 PCI Express Root Port 3
+ 3724 Xeon C5500/C3500 PCI Express Root Port 4
+ 3725 Xeon C5500/C3500 NTB Primary
+ 3726 Xeon C5500/C3500 NTB Primary
+ 3727 Xeon C5500/C3500 NTB Secondary
+ 3728 Xeon C5500/C3500 Core
+ 3729 Xeon C5500/C3500 Core
+ 372a Xeon C5500/C3500 Core
+ 372b Xeon C5500/C3500 Core
+ 372c Xeon C5500/C3500 Reserved
+ 373f Xeon C5500/C3500 IOxAPIC
+ 3a00 82801JD/DO (ICH10 Family) 4-port SATA IDE Controller
+ 3a02 82801JD/DO (ICH10 Family) SATA AHCI Controller
+ 3a05 82801JD/DO (ICH10 Family) SATA RAID Controller
+ 3a06 82801JD/DO (ICH10 Family) 2-port SATA IDE Controller
+ 3a14 82801JDO (ICH10DO) LPC Interface Controller
+ 3a16 82801JIR (ICH10R) LPC Interface Controller
+ 1028 028c PowerEdge R410 LPC Interface Controller
+ 1028 028d PowerEdge T410 LPC Interface Controller
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a18 82801JIB (ICH10) LPC Interface Controller
+ 3a1a 82801JD (ICH10D) LPC Interface Controller
+ 3a20 82801JI (ICH10 Family) 4 port SATA IDE Controller #1
+ 1028 028c PowerEdge R410 SATA IDE Controller
+ 1028 028d PowerEdge T410 SATA IDE Controller
+ 3a22 82801JI (ICH10 Family) SATA AHCI Controller
+ 1043 82d4 P5Q Deluxe Motherboard
+ 1458 b005 GA-EP45-DS5 Motherboard
+ 3a25 82801JIR (ICH10R) SATA RAID Controller
+ 1028 028c PERC S100 Controller (PE R410)
+ 1028 028d PERC S100 Controller (PE T410)
+ 1028 02f1 PERC S100 Controller (PE R510)
+ 3a26 82801JI (ICH10 Family) 2 port SATA IDE Controller #2
+ 1028 028c PowerEdge R410 SATA IDE Controller
+ 1028 028d PowerEdge T410 SATA IDE Controller
+ 3a30 82801JI (ICH10 Family) SMBus Controller
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a32 82801JI (ICH10 Family) Thermal Subsystem
+ 3a34 82801JI (ICH10 Family) USB UHCI Controller #1
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a35 82801JI (ICH10 Family) USB UHCI Controller #2
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a36 82801JI (ICH10 Family) USB UHCI Controller #3
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a37 82801JI (ICH10 Family) USB UHCI Controller #4
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a38 82801JI (ICH10 Family) USB UHCI Controller #5
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a39 82801JI (ICH10 Family) USB UHCI Controller #6
+ 1028 028c PowerEdge R410 USB UHCI Controller
+ 1028 028d PowerEdge T410 USB UHCI Controller
+ 1458 5004 GA-EP45-DS5 Motherboard
+ 3a3a 82801JI (ICH10 Family) USB2 EHCI Controller #1
+ 1028 028c PowerEdge R410 USB EHCI Controller
+ 1028 028d PowerEdge T410 USB EHCI Controller
+ 1458 5006 GA-EP45-DS5 Motherboard
+ 3a3c 82801JI (ICH10 Family) USB2 EHCI Controller #2
+ 1028 028c PowerEdge R410 USB EHCI Controller
+ 1028 028d PowerEdge T410 USB EHCI Controller
+ 1458 5006 GA-EP45-DS5 Motherboard
+ 3a3e 82801JI (ICH10 Family) HD Audio Controller
+ 1458 a002 GA-EP45-UD3R Motherboard
+ 1458 a102 GA-EP45-DS5 Motherboard
+ 3a40 82801JI (ICH10 Family) PCI Express Root Port 1
+ 1028 028c PowerEdge R410 PCI Express Port 1
+ 1028 028d PowerEdge T410 PCI Express Port 1
+ 1043 82ea P6T DeLuxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a42 82801JI (ICH10 Family) PCI Express Port 2
+ 3a44 82801JI (ICH10 Family) PCI Express Root Port 3
+ 1043 82ea P6T DeLuxe Motherboard
+ 3a46 82801JI (ICH10 Family) PCI Express Root Port 4
+ 1043 82ea P6T DeLuxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a48 82801JI (ICH10 Family) PCI Express Root Port 5
+ 1043 82ea P6T Deluxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a4a 82801JI (ICH10 Family) PCI Express Root Port 6
+ 1043 82ea P6T DeLuxe Motherboard
+ 1458 5001 GA-EP45-DS5 Motherboard
+ 3a4c 82801JI (ICH10 Family) Gigabit Ethernet Controller
+ 3a51 82801JDO (ICH10DO) VECI Controller
+ 3a55 82801JD/DO (ICH10 Family) Virtual SATA Controller
+ 3a60 82801JD/DO (ICH10 Family) SMBus Controller
+ 3a62 82801JD/DO (ICH10 Family) Thermal Subsystem
+ 3a64 82801JD/DO (ICH10 Family) USB UHCI Controller #1
+ 3a65 82801JD/DO (ICH10 Family) USB UHCI Controller #2
+ 3a66 82801JD/DO (ICH10 Family) USB UHCI Controller #3
+ 3a67 82801JD/DO (ICH10 Family) USB UHCI Controller #4
+ 3a68 82801JD/DO (ICH10 Family) USB UHCI Controller #5
+ 3a69 82801JD/DO (ICH10 Family) USB UHCI Controller #6
+ 3a6a 82801JD/DO (ICH10 Family) USB2 EHCI Controller #1
+ 3a6c 82801JD/DO (ICH10 Family) USB2 EHCI Controller #2
+ 3a6e 82801JD/DO (ICH10 Family) HD Audio Controller
+ 3a70 82801JD/DO (ICH10 Family) PCI Express Port 1
+ 3a72 82801JD/DO (ICH10 Family) PCI Express Port 2
+ 3a74 82801JD/DO (ICH10 Family) PCI Express Port 3
+ 3a76 82801JD/DO (ICH10 Family) PCI Express Port 4
+ 3a78 82801JD/DO (ICH10 Family) PCI Express Port 5
+ 3a7a 82801JD/DO (ICH10 Family) PCI Express Port 6
+ 3a7c 82801JD/DO (ICH10 Family) Gigabit Ethernet Controller
+ 3b00 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b01 Mobile 5 Series Chipset LPC Interface Controller
+ 3b02 5 Series Chipset LPC Interface Controller
+ 3b03 Mobile 5 Series Chipset LPC Interface Controller
+ 3b04 5 Series Chipset LPC Interface Controller
+ 3b05 Mobile 5 Series Chipset LPC Interface Controller
+ 3b06 5 Series Chipset LPC Interface Controller
+ 3b07 Mobile 5 Series Chipset LPC Interface Controller
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b08 5 Series Chipset LPC Interface Controller
+ 3b09 Mobile 5 Series Chipset LPC Interface Controller
+ 1025 0347 Aspire 7740G
+ 3b0a 5 Series Chipset LPC Interface Controller
+ 3b0b Mobile 5 Series Chipset LPC Interface Controller
+ 3b0c 5 Series Chipset LPC Interface Controller
+ 3b0d 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b0e 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b0f 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b10 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b11 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b12 3400 Series Chipset LPC Interface Controller
+ 3b13 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b14 3400 Series Chipset LPC Interface Controller
+ 3b15 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b16 3400 Series Chipset LPC Interface Controller
+ 3b17 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b18 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b19 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1a 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1b 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1c 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1d 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1e 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b1f 5 Series/3400 Series Chipset LPC Interface Controller
+ 3b20 5 Series/3400 Series Chipset 4 port SATA IDE Controller
+ 3b21 5 Series/3400 Series Chipset 2 port SATA IDE Controller
+ 3b22 5 Series/3400 Series Chipset 6 port SATA AHCI Controller
+ 3b23 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
+ 3b25 5 Series/3400 Series Chipset SATA RAID Controller
+ 3b26 5 Series/3400 Series Chipset 2 port SATA IDE Controller
+ 3b28 5 Series/3400 Series Chipset 4 port SATA IDE Controller
+ 3b29 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
+ 1025 0347 Aspire 7740G
+ 3b2c 5 Series/3400 Series Chipset SATA RAID Controller
+ 3b2d 5 Series/3400 Series Chipset 2 port SATA IDE Controller
+ e4bf 50c1 PC1-GROOVE
+ 3b2e 5 Series/3400 Series Chipset 4 port SATA IDE Controller
+ e4bf 50c1 PC1-GROOVE
+ 3b2f 5 Series/3400 Series Chipset 6 port SATA AHCI Controller
+ e4bf 50c1 PC1-GROOVE
+ 3b30 5 Series/3400 Series Chipset SMBus Controller
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b32 5 Series/3400 Series Chipset Thermal Subsystem
+ 1025 0347 Aspire 7740G
+ 3b34 5 Series/3400 Series Chipset USB2 Enhanced Host Controller
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b36 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b37 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b38 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b39 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3a 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3b 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3c 5 Series/3400 Series Chipset USB2 Enhanced Host Controller
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b3e 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b3f 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b40 5 Series/3400 Series Chipset USB Universal Host Controller
+ 3b41 5 Series/3400 Series Chipset LAN Controller
+ 3b42 5 Series/3400 Series Chipset PCI Express Root Port 1
+ 3b44 5 Series/3400 Series Chipset PCI Express Root Port 2
+ 3b46 5 Series/3400 Series Chipset PCI Express Root Port 3
+ 3b48 5 Series/3400 Series Chipset PCI Express Root Port 4
+ 3b4a 5 Series/3400 Series Chipset PCI Express Root Port 5
+ 3b4c 5 Series/3400 Series Chipset PCI Express Root Port 6
+ 3b4e 5 Series/3400 Series Chipset PCI Express Root Port 7
+ 3b50 5 Series/3400 Series Chipset PCI Express Root Port 8
+ 3b53 5 Series/3400 Series Chipset VECI Controller
+ 3b56 5 Series/3400 Series Chipset High Definition Audio
+ 1025 0347 Aspire 7740G
+ 1028 040b Latitude E6510
+ e4bf 50c1 PC1-GROOVE
+ 3b57 5 Series/3400 Series Chipset High Definition Audio
+ 3b64 5 Series/3400 Series Chipset HECI Controller
+ 1025 0347 Aspire 7740G
+ e4bf 50c1 PC1-GROOVE
+ 3b65 5 Series/3400 Series Chipset HECI Controller
+ 3b66 5 Series/3400 Series Chipset PT IDER Controller
+ 3b67 5 Series/3400 Series Chipset KT Controller
+ e4bf 50c1 PC1-GROOVE
+ 3c00 Sandy Bridge DMI2
+ 3c01 Sandy Bridge DMI2 in PCI Express Mode
+ 3c02 Sandy Bridge IIO PCI Express Root Port 1a
+ 3c03 Sandy Bridge IIO PCI Express Root Port 1b
+ 3c04 Sandy Bridge IIO PCI Express Root Port 2a
+ 3c05 Sandy Bridge IIO PCI Express Root Port 2b
+ 3c06 Sandy Bridge IIO PCI Express Root Port 2c
+ 3c07 Sandy Bridge IIO PCI Express Root Port 2d
+ 3c08 Sandy Bridge IIO PCI Express Root Port 3a in PCI Express Mode
+ 3c09 Sandy Bridge IIO PCI Express Root Port 3b
+ 3c0a Sandy Bridge IIO PCI Express Root Port 3c
+ 3c0b Sandy Bridge IIO PCI Express Root Port 3d
+ 3c0d Sandy Bridge Non-Transparent Bridge
+ 3c0e Sandy Bridge Non-Transparent Bridge
+ 3c0f Sandy Bridge Non-Transparent Bridge
+ 3c20 Sandy Bridge DMA Channel 0
+ 3c21 Sandy Bridge DMA Channel 1
+ 3c22 Sandy Bridge DMA Channel 2
+ 3c23 Sandy Bridge DMA Channel 3
+ 3c24 Sandy Bridge DMA Channel 4
+ 3c25 Sandy Bridge DMA Channel 5
+ 3c26 Sandy Bridge DMA Channel 6
+ 3c27 Sandy Bridge DMA Channel 7
+ 3c28 Sandy Bridge Address Map, VTd_Misc, System Management
+ 3c2a Sandy Bridge Control Status and Global Errors
+ 3c2c Sandy Bridge I/O APIC
+ 3c2e Sandy Bridge DMA
+ 3c2f Sandy Bridge DMA
+ 3c40 Sandy Bridge IIO Switch and IRP Performance Monitor
+ 3c41 Sandy Bridge QPI Port 0 Performance Monitor
+ 3c42 Sandy Bridge QPI Port 1 Performance Monitor
+ 3c43 Sandy Bridge Ring to PCI Express Performance Monitor
+ 3c44 Sandy Bridge Ring to QuickPath Interconnect Link 0 Performance Monitor
+ 3c45 Sandy Bridge Ring to QuickPath Interconnect Link 1 Performance Monitor
+ 3c46 Sandy Bridge Processor Home Agent Performance Monitoring
+ 3c71 Sandy Bridge Integrated Memory Controller RAS Registers
+ 3c80 Sandy Bridge QPI Link 0
+ 3c83 Sandy Bridge QPI Link Reut 0
+ 3c84 Sandy Bridge QPI Link Reut 0
+ 3c86 Sandy Bridge QPI Port 0 DFX Link
+ 3c90 Sandy Bridge QPI Link 1
+ 3c93 Sandy Bridge QPI Link Reut 1
+ 3c94 Sandy Bridge QPI Link Reut 1
+ 3c96 Sandy Bridge QPI Port 1 DFX Link
+ 3ca0 Sandy Bridge Processor Home Agent
+ 3ca8 Sandy Bridge Integrated Memory Controller Registers
+ 3caa Sandy Bridge Integrated Memory Controller Target Address Decoder 0
+ 3cab Sandy Bridge Integrated Memory Controller Target Address Decoder 1
+ 3cac Sandy Bridge Integrated Memory Controller Target Address Decoder 2
+ 3cad Sandy Bridge Integrated Memory Controller Target Address Decoder 3
+ 3cae Sandy Bridge Integrated Memory Controller Target Address Decoder 4
+ 3cb0 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 0
+ 3cb1 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 1
+ 3cb2 Sandy Bridge Integrated Memory Controller ERROR Registers 0
+ 3cb3 Sandy Bridge Integrated Memory Controller ERROR Registers 1
+ 3cb4 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 2
+ 3cb5 Sandy Bridge Integrated Memory Controller Channel 0-3 Thermal Control 3
+ 3cb6 Sandy Bridge Integrated Memory Controller ERROR Registers 2
+ 3cb7 Sandy Bridge Integrated Memory Controller ERROR Registers 3
+ 3cb8 Sandy Bridge DDRIO
+ 3cc0 Sandy Bridge Power Control Unit 0
+ 3cc1 Sandy Bridge Power Control Unit 1
+ 3cc2 Sandy Bridge Power Control Unit 2
+ 3cd0 Sandy Bridge Power Control Unit 3
+ 3ce0 Sandy Bridge Interrupt Control Registers
+ 3ce3 Sandy Bridge Semaphore and Scratchpad Configuration Registers
+ 3ce4 Sandy Bridge R2PCIe
+ 3ce6 Sandy Bridge QuickPath Interconnect Agent Ring Registers
+ 3ce8 Sandy Bridge Unicast Register 0
+ 3ce9 Sandy Bridge Unicast Register 5
+ 3cea Sandy Bridge Unicast Register 1
+ 3ceb Sandy Bridge Unicast Register 6
+ 3cec Sandy Bridge Unicast Register 3
+ 3ced Sandy Bridge Unicast Register 7
+ 3cee Sandy Bridge Unicast Register 4
+ 3cef Sandy Bridge Unicast Register 8
+ 3cf4 Sandy Bridge Integrated Memory Controller System Address Decoder 0
+ 3cf5 Sandy Bridge Integrated Memory Controller System Address Decoder 1
+ 3cf6 Sandy Bridge System Address Decoder
+ 4000 5400 Chipset Memory Controller Hub
+ 4001 5400 Chipset Memory Controller Hub
+ 4003 5400 Chipset Memory Controller Hub
+ 4021 5400 Chipset PCI Express Port 1
+ 4022 5400 Chipset PCI Express Port 2
+ 4023 5400 Chipset PCI Express Port 3
+ 4024 5400 Chipset PCI Express Port 4
+ 4025 5400 Chipset PCI Express Port 5
+ 4026 5400 Chipset PCI Express Port 6
+ 4027 5400 Chipset PCI Express Port 7
+ 4028 5400 Chipset PCI Express Port 8
+ 4029 5400 Chipset PCI Express Port 9
+ 402d 5400 Chipset IBIST Registers
+ 402e 5400 Chipset IBIST Registers
+ 402f 5400 Chipset QuickData Technology Device
+ 4030 5400 Chipset FSB Registers
+ 4031 5400 Chipset CE/SF Registers
+ 4032 5400 Chipset IOxAPIC
+ 4035 5400 Chipset FBD Registers
+ 4036 5400 Chipset FBD Registers
+ 4100 Moorestown Graphics and Video
+ 4108 Atom Processor E6xx Integrated Graphics Controller
+ 4109 Atom Processor E6xx Integrated Graphics Controller
+ 410a Atom Processor E6xx Integrated Graphics Controller
+ 410b Atom Processor E6xx Integrated Graphics Controller
+ 410c Atom Processor E6xx Integrated Graphics Controller
+ 410d Atom Processor E6xx Integrated Graphics Controller
+ 410e Atom Processor E6xx Integrated Graphics Controller
+ 410f Atom Processor E6xx Integrated Graphics Controller
+ 4114 Atom Processor E6xx PCI Host Bridge #1
+ 4115 Atom Processor E6xx PCI Host Bridge #2
+ 4116 Atom Processor E6xx PCI Host Bridge #3
+ 4117 Atom Processor E6xx PCI Host Bridge #4
+ 4220 PRO/Wireless 2200BG [Calexico2] Network Connection
+ 103c 0934 Compaq nw8240/nx8220
+ 103c 12f6 Compaq nw8240/nx8220
+ 8086 2712 IBM ThinkPad R50e
+ 8086 2721 Dell B130 laptop integrated WLAN
+ 8086 2722 Dell Latitude D600
+ 8086 2731 Samsung P35 integrated WLAN
+ 4222 PRO/Wireless 3945ABG [Golan] Network Connection
+ 103c 135c Compaq 6710b or nx9420 Notebook
+ 8086 1000 PRO/Wireless 3945ABG Network Connection
+ 8086 1001 PRO/Wireless 3945ABG Network Connection
+ 8086 1005 PRO/Wireless 3945BG Network Connection
+ 8086 1034 PRO/Wireless 3945BG Network Connection
+ 8086 1044 PRO/Wireless 3945BG Network Connection
+ 8086 1c00 PRO/Wireless 3945ABG Network Connection
+ 4223 PRO/Wireless 2915ABG [Calexico2] Network Connection
+ 1000 8086 mPCI 3B Americas/Europe ZZA
+ 1001 8086 mPCI 3B Europe ZZE
+ 1002 8086 mPCI 3B Japan ZZJ
+ 1003 8086 mPCI 3B High-Band ZZH
+ 1351 103c Compaq NC6220
+ 4224 PRO/Wireless 2915ABG [Calexico2] Network Connection
+ 4227 PRO/Wireless 3945ABG [Golan] Network Connection
+ 8086 1011 ThinkPad R60e/X60s
+ 8086 1014 PRO/Wireless 3945BG Network Connection
+ 4229 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection
+ 8086 1100 Vaio VGN-SZ79SN_C
+ 8086 1101 PRO/Wireless 4965 AG or AGN
+ 422b Centrino Ultimate-N 6300
+ 8086 1101 Centrino Ultimate-N 6300 3x3 AGN
+ 8086 1121 Centrino Ultimate-N 6300 3x3 AGN
+ 422c Centrino Advanced-N 6200
+ 8086 1301 Centrino Advanced-N 6200 2x2 AGN
+ 8086 1306 Centrino Advanced-N 6200 2x2 ABG
+ 8086 1307 Centrino Advanced-N 6200 2x2 BG
+ 8086 1321 Centrino Advanced-N 6200 2x2 AGN
+ 8086 1326 Centrino Advanced-N 6200 2x2 ABG
+ 4230 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection
+ 8086 1110 Lenovo ThinkPad T51
+ 8086 1111 Lenovo ThinkPad T61
+ 4232 WiFi Link 5100
+ 8086 1201 WiFi Link 5100 AGN
+ 8086 1204 WiFi Link 5100 AGN
+ 8086 1205 WiFi Link 5100 BGN
+ 8086 1206 WiFi Link 5100 ABG
+ 8086 1221 WiFi Link 5100 AGN
+ 8086 1224 WiFi Link 5100 AGN
+ 8086 1225 WiFi Link 5100 BGN
+ 8086 1226 WiFi Link 5100 ABG
+ 8086 1301 WiFi Link 5100 AGN
+ 8086 1304 WiFi Link 5100 AGN
+ 8086 1305 WiFi Link 5100 BGN
+ 8086 1306 WiFi Link 5100 ABG
+ 8086 1321 WiFi Link 5100 AGN
+ 8086 1324 WiFi Link 5100 AGN
+ 8086 1325 WiFi Link 5100 BGN
+ 8086 1326 WiFi Link 5100 ABG
+ 4235 Ultimate N WiFi Link 5300
+ 4236 Ultimate N WiFi Link 5300
+ 4237 PRO/Wireless 5100 AGN [Shiloh] Network Connection
+ 8086 1211 WiFi Link 5100 AGN
+ 8086 1214 WiFi Link 5100 AGN
+ 8086 1215 WiFi Link 5100 BGN
+ 8086 1216 WiFi Link 5100 ABG
+ 8086 1311 WiFi Link 5100 AGN
+ 8086 1314 WiFi Link 5100 AGN
+ 8086 1315 WiFi Link 5100 BGN
+ 8086 1316 WiFi Link 5100 ABG
+ 4238 Centrino Ultimate-N 6300
+ 8086 1111 Centrino Ultimate-N 6300 3x3 AGN
+ 4239 Centrino Advanced-N 6200
+ 8086 1311 Centrino Advanced-N 6200 2x2 AGN
+ 8086 1316 Centrino Advanced-N 6200 2x2 ABG
+ 423a PRO/Wireless 5350 AGN [Echo Peak] Network Connection
+ 423b PRO/Wireless 5350 AGN [Echo Peak] Network Connection
+ 423c WiMAX/WiFi Link 5150
+ 8086 1201 WiMAX/WiFi Link 5150 AGN
+ 8086 1206 WiMAX/WiFi Link 5150 ABG
+ 8086 1221 WiMAX/WiFi Link 5150 AGN
+ 8086 1301 WiMAX/WiFi Link 5150 AGN
+ 8086 1306 WiMAX/WiFi Link 5150 ABG
+ 8086 1321 WiMAX/WiFi Link 5150 AGN
+ 423d WiMAX/WiFi Link 5150
+ 8086 1211 WiMAX/WiFi Link 5150 AGN
+ 8086 1216 WiMAX/WiFi Link 5150 ABG
+ 8086 1311 WiMAX/WiFi Link 5150 AGN
+ 8086 1316 WiMAX/WiFi Link 5150 ABG
+ 444e Turbo Memory Controller
+ 5001 LE80578
+ 5002 LE80578 Graphics Processor Unit
+ 5009 LE80578 Video Display Controller
+ 500d LE80578 Expansion Bus
+ 500e LE80578 UART Controller
+ 500f LE80578 General Purpose IO
+ 5010 LE80578 I2C Controller
+ 5012 LE80578 Serial Peripheral Interface Bus
+ 5020 EP80579 Memory Controller Hub
+ 5021 EP80579 DRAM Error Reporting Registers
+ 5023 EP80579 EDMA Controller
+ 5024 EP80579 PCI Express Port PEA0
+ 5025 EP80579 PCI Express Port PEA1
+ 5028 EP80579 S-ATA IDE
+ 5029 EP80579 S-ATA AHCI
+ 502a EP80579 S-ATA Reserved
+ 502b EP80579 S-ATA Reserved
+ 502c EP80579 Integrated Processor ASU
+ 502d EP80579 Integrated Processor with QuickAssist ASU
+ 502e EP80579 Reserved
+ 502f EP80579 Reserved
+ 5030 EP80579 Reserved
+ 5031 EP80579 LPC Bus
+ 5032 EP80579 SMBus Controller
+ 5033 EP80579 USB 1.1 Controller
+ 5035 EP80579 USB 2.0 Controller
+ 5037 EP80579 PCI-PCI Bridge (transparent mode)
+ 5039 EP80579 Controller Area Network (CAN) interface #1
+ 503a EP80579 Controller Area Network (CAN) interface #2
+ 503b EP80579 Synchronous Serial Port (SPP)
+ 503c EP80579 IEEE 1588 Hardware Assist
+ 503d EP80579 Local Expansion Bus
+ 503e EP80579 Global Control Unit (GCU)
+ 503f EP80579 Reserved
+ 5040 EP80579 Integrated Processor Gigabit Ethernet MAC
+ 5041 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC
+ 5042 EP80579 Reserved
+ 5043 EP80579 Reserved
+ 5044 EP80579 Integrated Processor Gigabit Ethernet MAC
+ 5045 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC
+ 5046 EP80579 Reserved
+ 5047 EP80579 Reserved
+ 5048 EP80579 Integrated Processor Gigabit Ethernet MAC
+ 5049 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC
+ 504a EP80579 Reserved
+ 504b EP80579 Reserved
+ 504c EP80579 Integrated Processor with QuickAssist TDM
+ 5200 EtherExpress PRO/100 Intelligent Server
+ 5201 EtherExpress PRO/100 Intelligent Server
+ 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter
+ 530d 80310 (IOP) IO Processor
+ 65c0 5100 Chipset Memory Controller Hub
+ 65e2 5100 Chipset PCI Express x4 Port 2
+ 65e3 5100 Chipset PCI Express x4 Port 3
+ 65e4 5100 Chipset PCI Express x4 Port 4
+ 65e5 5100 Chipset PCI Express x4 Port 5
+ 65e6 5100 Chipset PCI Express x4 Port 6
+ 65e7 5100 Chipset PCI Express x4 Port 7
+ 65f0 5100 Chipset FSB Registers
+ 1028 020f PowerEdge R300
+ 1028 0210 PowerEdge T300
+ 65f1 5100 Chipset Reserved Registers
+ 1028 0210 PowerEdge T300
+ 65f3 5100 Chipset Reserved Registers
+ 65f5 5100 Chipset DDR Channel 0 Registers
+ 65f6 5100 Chipset DDR Channel 1 Registers
+ 65f7 5100 Chipset PCI Express x8 Port 2-3
+ 65f8 5100 Chipset PCI Express x8 Port 4-5
+ 65f9 5100 Chipset PCI Express x8 Port 6-7
+ 65fa 5100 Chipset PCI Express x16 Port 4-7
+ 65ff 5100 Chipset DMA Engine
+ 7000 82371SB PIIX3 ISA [Natoma/Triton II]
+ 1af4 1100 Qemu virtual machine
+ 7010 82371SB PIIX3 IDE [Natoma/Triton II]
+ 1af4 1100 Qemu virtual machine
+ 7020 82371SB PIIX3 USB [Natoma/Triton II]
+ 1af4 1100 Qemu virtual machine
+ 7030 430VX - 82437VX TVX [Triton VX]
+ 7050 Intercast Video Capture Card
+ 7051 PB 642365-003 (Business Video Conferencing Card)
+ 7100 430TX - 82439TX MTXC
+ 7110 82371AB/EB/MB PIIX4 ISA
+ 15ad 1976 Virtual Machine Chipset
+ 7111 82371AB/EB/MB PIIX4 IDE
+ 15ad 1976 Virtual Machine Chipset
+ 7112 82371AB/EB/MB PIIX4 USB
+ 15ad 1976 Virtual Machine Chipset
+ 7113 82371AB/EB/MB PIIX4 ACPI
+ 15ad 1976 Virtual Machine Chipset
+ 1af4 1100 Qemu virtual machine
+ 7120 82810 GMCH (Graphics Memory Controller Hub)
+ 4c53 1040 CL7 mainboard
+ 4c53 1060 PC7 mainboard
+ 7121 82810 (CGC) Chipset Graphics Controller
+ 4c53 1040 CL7 mainboard
+ 4c53 1060 PC7 mainboard
+ 8086 4341 Cayman (CA810) Mainboard
+ 7122 82810 DC-100 (GMCH) Graphics Memory Controller Hub
+ 7123 82810 DC-100 (CGC) Chipset Graphics Controller
+ 7124 82810E DC-133 (GMCH) Graphics Memory Controller Hub
+ 1028 00b4 OptiPlex GX110
+ 7125 82810E DC-133 (CGC) Chipset Graphics Controller
+ 1028 00b4 OptiPlex GX110
+ 7126 82810 DC-133 System and Graphics Controller
+ 7128 82810-M DC-100 System and Graphics Controller
+ 712a 82810-M DC-133 System and Graphics Controller
+ 7180 440LX/EX - 82443LX/EX Host bridge
+ 7181 440LX/EX - 82443LX/EX AGP bridge
+ 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge
+ 0e11 0500 Armada 1750 Laptop System Chipset
+ 0e11 b110 Armada M700/E500
+ 1028 008e PowerEdge 1300 mainboard
+ 1043 803b CUBX-L/E Mainboard
+ 1179 0001 Toshiba Tecra 8100 Laptop System Chipset
+ 15ad 1976 Virtual Machine Chipset
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge
+ 1028 008e PowerEdge 1300 mainboard
+ 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)
+ 0e11 0460 Armada 1700 Laptop System Chipset
+ 1179 0001 Satellite 4010
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 8086 7190 Dell PowerEdge 350
+ 7194 82440MX Host Bridge
+ 1033 0000 Versa Note Vxi
+ 4c53 10a0 CA3/CR3 mainboard
+ 7195 82440MX AC'97 Audio Controller
+ 1033 80cc Versa Note VXi
+ 10cf 1099 QSound_SigmaTel Stac97 PCI Audio
+ 11d4 0040 SoundMAX Integrated Digital Audio
+ 11d4 0048 SoundMAX Integrated Digital Audio
+ 7196 82440MX AC'97 Modem Controller
+ 7198 82440MX ISA Bridge
+ 7199 82440MX EIDE Controller
+ 719a 82440MX USB Universal Host Controller
+ 719b 82440MX Power Management Controller
+ 71a0 440GX - 82443GX Host bridge
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ 71a1 440GX - 82443GX AGP bridge
+ 71a2 440GX - 82443GX Host bridge (AGP disabled)
+ 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+ 7600 82372FB PIIX5 ISA
+ 7601 82372FB PIIX5 IDE
+ 7602 82372FB PIIX5 USB
+ 7603 82372FB PIIX5 SMBus
+ 7800 82740 (i740) AGP Graphics Accelerator
+ 003d 0008 Starfighter AGP
+ 003d 000b Starfighter AGP
+ 1092 0100 Stealth II G460
+ 10b4 201a Lightspeed 740
+ 10b4 202f Lightspeed 740
+ 8086 0000 Terminator 2x/i
+ 8086 0100 Intel740 Graphics Accelerator
+ 8002 Trusted Execution Technology Registers
+ 8003 Trusted Execution Technology Registers
+ 8100 System Controller Hub (SCH Poulsbo)
+ 8108 System Controller Hub (SCH Poulsbo) Graphics Controller
+ 8110 System Controller Hub (SCH Poulsbo) PCI Express Port 1
+ 8112 System Controller Hub (SCH Poulsbo) PCI Express Port 2
+ 8114 System Controller Hub (SCH Poulsbo) USB UHCI #1
+ 8115 System Controller Hub (SCH Poulsbo) USB UHCI #2
+ 8116 System Controller Hub (SCH Poulsbo) USB UHCI #3
+ 8117 System Controller Hub (SCH Poulsbo) USB EHCI #1
+ 8118 System Controller Hub (SCH Poulsbo) USB Client Controller
+ 8119 System Controller Hub (SCH Poulsbo) LPC Bridge
+ 811a System Controller Hub (SCH Poulsbo) IDE Controller
+ 811b System Controller Hub (SCH Poulsbo) HD Audio Controller
+ 811c System Controller Hub (SCH Poulsbo) SDIO Controller #1
+ 811d System Controller Hub (SCH Poulsbo) SDIO Controller #2
+ 811e System Controller Hub (SCH Poulsbo) SDIO Controller #3
+ 8180 Atom Processor E6xx PCI Express Port 3
+ 8181 Atom Processor E6xx PCI Express Port 4
+ 8182 Atom Processor E6xx Integrated Graphics Controller
+ 8183 Atom Processor E6xx Configuration Unit
+ 8184 Atom Processor E6xx PCI Express Port 1
+ 8185 Atom Processor E6xx PCI Express Port 2
+ 8186 Atom Processor E6xx LPC Bridge
+ 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge
+ 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller
+ 84ca 450NX - 82451NX Memory & I/O Controller
+ 84cb 450NX - 82454NX/84460GX PCI Expander Bridge
+ 84e0 460GX - 84460GX System Address Controller (SAC)
+ 84e1 460GX - 84460GX System Data Controller (SDC)
+ 84e2 460GX - 84460GX AGP Bridge (GXB function 2)
+ 84e3 460GX - 84460GX Memory Address Controller (MAC)
+ 84e4 460GX - 84460GX Memory Data Controller (MDC)
+ 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)
+ 84ea 460GX - 84460GX AGP Bridge (GXB function 1)
+ 8500 IXP4XX Network Processor (IXP420/421/422/425/IXC1100)
+ 1993 0ded mGuard-PCI AV#2
+ 1993 0dee mGuard-PCI AV#1
+ 1993 0def mGuard-PCI AV#0
+ 8800 Platform Controller Hub EG20T PCI Express Port
+ 8801 Platform Controller Hub EG20T Packet Hub
+ 8802 Platform Controller Hub EG20T Gigabit Ethernet Controller
+ 8803 Platform Controller Hub EG20T General Purpose IO Controller
+ 8804 Platform Controller Hub EG20T USB OHCI Controller #4
+ 8805 Platform Controller Hub EG20T USB OHCI Controller #5
+ 8806 Platform Controller Hub EG20T USB OHCI Controller #6
+ 8807 Platform Controller Hub EG20T USB2 EHCI Controller #2
+ 8808 Platform Controller Hub EG20T USB Client Controller
+ 8809 Platform Controller Hub EG20T SDIO Controller #1
+ 880a Platform Controller Hub EG20T SDIO Controller #2
+ 880b Platform Controller Hub EG20T SATA AHCI Controller
+ 880c Platform Controller Hub EG20T USB OHCI Controller #1
+ 880d Platform Controller Hub EG20T USB OHCI Controller #2
+ 880e Platform Controller Hub EG20T USB OHCI Controller #3
+ 880f Platform Controller Hub EG20T USB2 EHCI Controller #1
+ 8810 Platform Controller Hub EG20T DMA Controller #1
+ 8811 Platform Controller Hub EG20T UART Controller 0
+ 8812 Platform Controller Hub EG20T UART Controller 1
+ 8813 Platform Controller Hub EG20T UART Controller 2
+ 8814 Platform Controller Hub EG20T UART Controller 3
+ 8815 Platform Controller Hub EG20T DMA Controller #2
+ 8816 Platform Controller Hub EG20T Serial Peripheral Interface Bus
+ 8817 Platform Controller Hub EG20T I2C Controller
+ 8818 Platform Controller Hub EG20T Controller Area Network (CAN) Controller
+ 8819 Platform Controller Hub EG20T IEEE 1588 Hardware Assist
+ 9000 IXP2000 Family Network Processor
+ 9001 IXP2400 Network Processor
+ 9002 IXP2300 Network Processor
+ 9004 IXP2800 Network Processor
+ 9621 Integrated RAID
+ 9622 Integrated RAID
+ 9641 Integrated RAID
+ 96a1 Integrated RAID
+ a000 N10 Family DMI Bridge
+ 8086 4f4d DeskTop Board D510MO
+ a001 N10 Family Integrated Graphics Controller
+ 8086 4f4d DeskTop Board D510MO
+ a002 N10 Family Integrated Graphics Controller
+ a003 N10 Family CHAPS counter
+ a010 N10 Family DMI Bridge
+ a011 N10 Family Integrated Graphics Controller
+ a012 N10 Family Integrated Graphics Controller
+ a013 N10 Family CHAPS counter
+ a620 6400/6402 Advanced Memory Buffer (AMB)
+ b152 21152 PCI-to-PCI Bridge
+ 8086 b152 21152 PCI-to-PCI Bridge
+# observed, and documented in Intel revision note; new mask of 1011:0026
+ b154 21154 PCI-to-PCI Bridge
+ b555 21555 Non transparent PCI-to-PCI Bridge
+ 12c7 5005 SS7HD PCI Adaptor Card
+ 12c7 5006 SS7HDC cPCI Adaptor Card
+ 12d9 000a PCI VoIP Gateway
+ 4c53 1050 CT7 mainboard
+ 4c53 1051 CE7 mainboard
+ e4bf 1000 CC8-1-BLUES
+ d130 Core Processor DMI
+ d131 Core Processor DMI
+ d132 Core Processor DMI
+ 1028 040b Latitude E6510
+ d133 Core Processor DMI
+ d134 Core Processor DMI
+ d135 Core Processor DMI
+ d136 Core Processor DMI
+ d137 Core Processor DMI
+ d138 Core Processor PCI Express Root Port 1
+ d139 Core Processor PCI Express Root Port 2
+ d13a Core Processor PCI Express Root Port 3
+ d13b Core Processor PCI Express Root Port 4
+ d150 Core Processor QPI Link
+ d151 Core Processor QPI Routing and Protocol Registers
+ d155 Core Processor System Management Registers
+ d156 Core Processor Semaphore and Scratchpad Registers
+ d157 Core Processor System Control and Status Registers
+ d158 Core Processor Miscellaneous Registers
+80ee InnoTek Systemberatung GmbH
+ beef VirtualBox Graphics Adapter
+ cafe VirtualBox Guest Service
+8322 Sodick America Corp.
+8384 SigmaTel
+ 7618 High Definition Audio Codec
+ 7634 9250 HD Audio Codec
+ 7662 High Definition Audio Codec
+ 104d 1e00 High Definition Audio Codec [STAC9872AK]
+ 7664 High Definition Audio Codec
+ 7670 9770 High Definition Audio
+ 7672 9772 High Definition Audio
+ 7682 IDT High Definition Audio Codec
+ 7690 9200 HD Audio Codec
+ 1028 01c1 Precision 490
+8401 TRENDware International Inc.
+8686 ScaleMP
+ 1010 vSMPowered system controller [vSMP CTL]
+8800 Trigem Computer Inc.
+ 2008 Video assistent component
+8866 T-Square Design Inc.
+8888 Silicon Magic
+8912 TRX
+# 8c4a is not Winbond but there is a board misprogrammed
+8c4a Winbond
+ 1980 W89C940 misprogrammed [ne2k]
+8e0e Computone Corporation
+8e2e KTI
+ 3000 ET32P2
+9004 Adaptec
+ 0078 AHA-2940U_CN
+ 1078 AIC-7810
+ 1160 AIC-1160 [Family Fibre Channel Adapter]
+ 2178 AIC-7821
+ 3860 AHA-2930CU
+ 3b78 AHA-4844W/4844UW
+ 5075 AIC-755x
+ 5078 AIC-7850
+ 9004 7850 AHA-2904/Integrated AIC-7850
+ 5175 AIC-755x
+ 5178 AIC-7851
+ 5275 AIC-755x
+ 5278 AIC-7852
+ 5375 AIC-755x
+ 5378 AIC-7850
+ 5475 AIC-755x
+ 5478 AIC-7850
+ 5575 AVA-2930
+ 5578 AIC-7855
+ 5647 ANA-7711 TCP Offload Engine
+ 9004 7710 ANA-7711F TCP Offload Engine - Optical
+ 9004 7711 ANA-7711LP TCP Offload Engine - Copper
+ 5675 AIC-755x
+ 5678 AIC-7856
+ 5775 AIC-755x
+ 5778 AIC-7850
+ 5800 AIC-5800
+ 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter
+ 5905 ANA-5910A/5930A/5940A ATM Adapter
+ 6038 AIC-3860
+ 6075 AIC-1480 / APA-1480
+ 9004 7560 AIC-1480 / APA-1480 Cardbus
+ 6078 AIC-7860
+ 6178 AIC-7861
+ 9004 7861 AHA-2940AU Single
+ 6278 AIC-7860
+ 6378 AIC-7860
+ 6478 AIC-786x
+ 6578 AIC-786x
+ 6678 AIC-786x
+ 6778 AIC-786x
+ 6915 ANA620xx/ANA69011A
+ 9004 0008 ANA69011A/TX 10/100
+ 9004 0009 ANA69011A/TX 10/100
+ 9004 0010 ANA62022 2-port 10/100
+ 9004 0018 ANA62044 4-port 10/100
+ 9004 0019 ANA62044 4-port 10/100
+ 9004 0020 ANA62022 2-port 10/100
+ 9004 0028 ANA69011A/TX 10/100
+ 9004 8008 ANA69011A/TX 64 bit 10/100
+ 9004 8009 ANA69011A/TX 64 bit 10/100
+ 9004 8010 ANA62022 2-port 64 bit 10/100
+ 9004 8018 ANA62044 4-port 64 bit 10/100
+ 9004 8019 ANA62044 4-port 64 bit 10/100
+ 9004 8020 ANA62022 2-port 64 bit 10/100
+ 9004 8028 ANA69011A/TX 64 bit 10/100
+ 7078 AHA-294x / AIC-7870
+ 7178 AHA-2940/2940W / AIC-7871
+ 7278 AHA-3940/3940W / AIC-7872
+ 7378 AHA-3985 / AIC-7873
+ 7478 AHA-2944/2944W / AIC-7874
+ 7578 AHA-3944/3944W / AIC-7875
+ 7678 AHA-4944W/UW / AIC-7876
+ 7710 ANA-7711F Network Accelerator Card (NAC) - Optical
+ 7711 ANA-7711C Network Accelerator Card (NAC) - Copper
+ 7778 AIC-787x
+ 7810 AIC-7810
+ 7815 AIC-7815 RAID+Memory Controller IC
+ 9004 7815 ARO-1130U2 RAID Controller
+ 9004 7840 AIC-7815 RAID+Memory Controller IC
+ 7850 AIC-7850
+ 7855 AHA-2930
+ 7860 AIC-7860
+ 7870 AIC-7870
+ 7871 AHA-2940
+ 7872 AHA-3940
+ 7873 AHA-3980
+ 7874 AHA-2944
+ 7880 AIC-7880P
+ 7890 AIC-7890
+ 7891 AIC-789x
+ 7892 AIC-789x
+ 7893 AIC-789x
+ 7894 AIC-789x
+ 7895 AHA-2940U/UW / AHA-39xx / AIC-7895
+ 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 9004 7891 AHA-2940U/2940UW Dual
+ 9004 7892 AHA-3940AU/AUW/AUWD/UWD
+ 9004 7894 AHA-3944AUWD
+ 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+ 7896 AIC-789x
+ 7897 AIC-789x
+ 8078 AIC-7880U
+ 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset
+ 8178 AHA-2940U/UW/D / AIC-7881U
+ 9004 7881 AHA-2940UW SCSI Host Adapter
+ 8278 AHA-3940U/UW/UWD / AIC-7882U
+ 8378 AHA-3940U/UW / AIC-7883U
+ 8478 AHA-2944UW / AIC-7884U
+ 8578 AHA-3944U/UWD / AIC-7885
+ 8678 AHA-4944UW / AIC-7886
+ 8778 AHA-2940UW Pro / AIC-788x
+ 9004 7887 2940UW Pro Ultra-Wide SCSI Controller
+ 8878 AHA-2930UW / AIC-7888
+ 9004 7888 AHA-2930UW SCSI Controller
+ 8b78 ABA-1030
+ ec78 AHA-4944W/UW
+9005 Adaptec
+ 0010 AHA-2940U2/U2W
+ 9005 2180 AHA-2940U2 SCSI Controller
+ 9005 8100 AHA-2940U2B SCSI Controller
+ 9005 a100 AHA-2940U2B SCSI Controller
+ 9005 a180 AHA-2940U2W SCSI Controller
+ 9005 e100 AHA-2950U2B SCSI Controller
+ 0011 AHA-2930U2
+ 0013 78902
+ 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller
+ 9005 000f AIC7890_ARO
+ 001f AHA-2940U2/U2W / 7890/7891
+ 9005 000f 2940U2W SCSI Controller
+ 9005 a180 2940U2W SCSI Controller
+ 0020 AIC-7890
+ 002f AIC-7890
+ 0030 AIC-7890
+ 003f AIC-7890
+ 0050 AHA-3940U2x/395U2x
+ 9005 f500 AHA-3950U2B
+ 9005 ffff AHA-3950U2B
+ 0051 AHA-3950U2D
+ 9005 b500 AHA-3950U2D
+ 0053 AIC-7896 SCSI Controller
+ 9005 ffff AIC-7896 SCSI Controller mainboard implementation
+ 005f AIC-7896U2/7897U2
+ 0080 AIC-7892A U160/m
+ 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter
+ 9005 6220 AHA-29160C
+ 9005 62a0 29160N Ultra160 SCSI Controller
+ 9005 e220 29160LP Low Profile Ultra160 SCSI Controller
+ 9005 e2a0 29160 Ultra160 SCSI Controller
+ 0081 AIC-7892B U160/m
+ 9005 62a1 19160 Ultra160 SCSI Controller
+ 0083 AIC-7892D U160/m
+ 008f AIC-7892P U160/m
+ 1179 0001 Magnia Z310
+ 15d9 9005 Onboard SCSI Host Adapter
+ 0092 AVC-2010 [VideoH!]
+ 0093 AVC-2410 [VideoH!]
+ 00c0 AHA-3960D / AIC-7899A U160/m
+ 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter
+ 9005 f620 AHA-3960D U160/m
+ 00c1 AIC-7899B U160/m
+ 00c3 AIC-7899D U160/m
+ 00c5 RAID subsystem HBA
+ 1028 00c5 PowerEdge 2400,2500,2550,4400
+ 00cf AIC-7899P U160/m
+ 1028 00ce PowerEdge 1400
+ 1028 00d1 PowerEdge 2550
+ 1028 00d9 PowerEdge 2500
+ 10f1 2462 Thunder K7 S2462
+ 15d9 9005 Onboard SCSI Host Adapter
+ 8086 3411 SDS2 Mainboard
+ 0241 Serial ATA II RAID 1420SA
+ 0242 Serial ATA II RAID 1220SA
+ 0243 Serial ATA II RAID 1430SA
+ 0244 eSATA II RAID 1225SA
+ 0250 ServeRAID Controller
+ 1014 0279 ServeRAID 6M
+ 1014 028c ServeRAID 6i/6i+
+ 1014 028e ServeRAID 7k
+ 0279 ServeRAID 6M
+ 0283 AAC-RAID
+ 9005 0283 Catapult
+ 0284 AAC-RAID
+ 9005 0284 Tomcat
+ 0285 AAC-RAID
+ 0e11 0295 SATA 6Ch (Bearcat)
+ 1014 02f2 ServeRAID 8i
+ 1028 0287 PowerEdge Expandable RAID Controller 320/DC
+ 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair)
+ 103c 3227 AAR-2610SA
+ 108e 0286 STK RAID INT
+ 108e 0287 STK RAID EXT
+ 108e 7aac STK RAID REM
+ 108e 7aae STK RAID EX
+ 15d9 02b5 SMC AOC-USAS-S4i
+ 15d9 02b6 SMC AOC-USAS-S8i
+ 15d9 02c9 SMC AOC-USAS-S4iR
+ 15d9 02ca SMC AOC-USAS-S8iR
+ 15d9 02d2 SMC AOC-USAS-S8i-LP
+ 15d9 02d3 SMC AOC-USAS-S8iR-LP
+ 17aa 0286 Legend S220 (Legend Crusader)
+ 17aa 0287 Legend S230 (Legend Vulcan)
+ 9005 0285 2200S (Vulcan)
+ 9005 0286 2120S (Crusader)
+ 9005 0287 2200S (Vulcan-2m)
+ 9005 0288 3230S (Harrier)
+ 9005 0289 3240S (Tornado)
+# Some early versions reported 2020S
+ 9005 028a ASR-2020ZCR
+# Some early versions reported 2025S
+ 9005 028b ASR-2025ZCR (Terminator)
+ 9005 028e ASR-2020SA (Skyhawk)
+ 9005 028f ASR-2025SA
+ 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II)
+ 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8)
+ 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16)
+ 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler)
+ 9005 0296 ASR-2240S
+ 9005 0297 ASR-4005SAS
+ 9005 0298 ASR-4000
+ 9005 0299 ASR-4800SAS
+ 9005 029a 4805SAS
+ 9005 02a4 ICP ICP9085LI
+ 9005 02a5 ICP ICP5085BR
+ 9005 02b5 ASR5800
+ 9005 02b6 ASR5805
+ 9005 02b7 ASR5808
+ 9005 02b8 ICP5445SL
+ 9005 02b9 ICP5085SL
+ 9005 02ba ICP5805SL
+ 9005 02bb 3405
+ 9005 02bc 3805
+ 9005 02bd 31205
+ 9005 02be 31605
+ 9005 02bf ICP ICP5045BL
+ 9005 02c0 ICP ICP5085BL
+ 9005 02c1 ICP ICP5125BR
+ 9005 02c2 ICP ICP5165BR
+ 9005 02c3 51205
+ 9005 02c4 51605
+ 9005 02c5 ICP ICP5125SL
+ 9005 02c6 ICP ICP5165SL
+ 9005 02c7 3085
+ 9005 02c8 ICP5805BL
+ 9005 02ce 51245
+ 9005 02cf 51645
+ 9005 02d0 52445
+ 9005 02d1 5405
+ 9005 02d4 ASR-2045
+ 9005 02d5 ASR-2405
+ 9005 02d6 ASR-2445
+ 9005 02d7 ASR-2805
+ 9005 02d8 5405G
+ 9005 02d9 5445G
+ 9005 02da 5805G
+ 9005 02db 5085G
+ 9005 02dc 51245G
+ 9005 02dd 51645G
+ 9005 02de 52445G
+ 9005 02df ASR-2045G
+ 9005 02e0 ASR-2405G
+ 9005 02e1 ASR-2445G
+ 9005 02e2 ASR-2805G
+ 0286 AAC-RAID (Rocket)
+ 1014 034d 8s
+ 1014 9540 ServeRAID 8k/8k-l4
+ 1014 9580 ServeRAID 8k/8k-l8
+ 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer)
+ 9005 028d ASR-2130S
+ 9005 029b ASR-2820SA
+ 9005 029c ASR-2620SA
+ 9005 029d ASR-2420SA
+ 9005 029e ICP ICP9024R0
+ 9005 029f ICP ICP9014R0
+ 9005 02a0 ICP ICP9047MA
+ 9005 02a1 ICP ICP9087MA
+ 9005 02a2 3800
+ 9005 02a3 ICP ICP5445AU
+ 9005 02a4 ICP ICP9085LI
+ 9005 02a5 ICP ICP5085BR
+ 9005 02a6 ICP9067MA
+ 9005 02a7 3805
+ 9005 02a8 3400
+ 9005 02a9 ICP ICP5085AU
+ 9005 02aa ICP ICP5045AU
+ 9005 02ac 1800
+ 9005 02b3 2400
+ 9005 02b4 ICP ICP5045AL
+ 9005 0800 Callisto
+ 0410 AIC-9410W SAS (Razor HBA RAID)
+ 9005 0410 ASC-48300(Spirit RAID)
+ 9005 0411 ASC-58300 (Oakmont RAID)
+ 0412 AIC-9410W SAS (Razor HBA non-RAID)
+ 9005 0412 ASC-48300 (Spirit non-RAID)
+ 9005 0413 ASC-58300 (Oakmont non-RAID)
+ 0415 ASC-58300 SAS (Razor-External HBA RAID)
+ 0416 ASC-58300 SAS (Razor-External HBA non-RAID)
+ 041e AIC-9410W SAS (Razor ASIC non-RAID)
+ 041f AIC-9410W SAS (Razor ASIC RAID)
+ 9005 041f AIC-9410W SAS (Razor ASIC RAID)
+ 042f VSC7250/7251 SAS (Aurora ASIC non-RAID)
+ 0430 AIC-9405W SAS (Razor-Lite HBA RAID)
+ 9005 0430 ASC-44300 (Spirit-Lite RAID)
+ 0432 AIC-9405W SAS (Razor-Lite HBA non-RAID)
+ 9005 0432 ASC-44300 (Spirit-Lite non-RAID)
+ 043e AIC-9405W SAS (Razor-Lite ASIC non-RAID)
+ 043f AIC-9405W SAS (Razor-Lite ASIC RAID)
+ 0450 ASC-1405 Unified Serial HBA
+ 0500 Obsidian chipset SCSI controller
+ 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)
+ 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/572D)
+ 0503 Scamp chipset SCSI controller
+ 1014 02bf Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E)
+ 1014 02c3 PCI-X DDR 3Gb SAS RAID Adapter (572F)
+ 1014 02d5 Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571F)
+ 0910 AUA-3100B
+ 091e AUA-3100B
+ 8000 ASC-29320A U320
+ 800f AIC-7901 U320
+ 8010 ASC-39320 U320
+ 8011 ASC-39320D
+ 0e11 00ac ASC-39320D U320
+ 9005 0041 ASC-39320D U320
+ 8012 ASC-29320 U320
+ 8013 ASC-29320B U320
+ 8014 ASC-29320LP U320
+ 8015 ASC-39320B U320
+ 8016 ASC-39320A U320
+ 8017 ASC-29320ALP U320
+ 9005 0044 ASC-29320ALP PCIx U320
+ 9005 0045 ASC-29320LPE PCIe U320
+ 801c ASC-39320D U320
+ 801d AIC-7902B U320
+ 1014 02cc ServeRAID 7e
+ 801e AIC-7901A U320
+ 801f AIC-7902 U320
+ 1734 1011 PRIMERGY RX300 onboard SCSI
+ 8080 ASC-29320A U320 w/HostRAID
+ 808f AIC-7901 U320 w/HostRAID
+ 8090 ASC-39320 U320 w/HostRAID
+ 8091 ASC-39320D U320 w/HostRAID
+ 8092 ASC-29320 U320 w/HostRAID
+ 8093 ASC-29320B U320 w/HostRAID
+ 8094 ASC-29320LP U320 w/HostRAID
+ 8095 ASC-39320(B) U320 w/HostRAID
+ 8096 ASC-39320A U320 w/HostRAID
+ 8097 ASC-29320ALP U320 w/HostRAID
+ 809c ASC-39320D(B) U320 w/HostRAID
+ 809d AIC-7902(B) U320 w/HostRAID
+ 1014 02cc ServeRAID 7e
+ 809e AIC-7901A U320 w/HostRAID
+ 809f AIC-7902 U320 w/HostRAID
+907f Atronics
+ 2015 IDE-2015PL
+919a Gigapixel Corp
+9412 Holtek
+ 6565 6565
+9699 Omni Media Technology Inc
+ 6565 6565
+9710 NetMos Technology
+ 9250 PCI-to-PCI bridge [MCS9250]
+ 9805 PCI 1 port parallel adapter
+ 9815 PCI 9815 Multi-I/O Controller
+ 1000 0020 2P0S (2 port parallel adaptor)
+ 9820 PCI 9820 Multi-I/O Controller
+ 9835 PCI 9835 Multi-I/O Controller
+ 1000 0002 2S (16C550 UART)
+ 1000 0012 1P2S
+ 9845 PCI 9845 Multi-I/O Controller
+# Serial ports at BAR0-3
+ 1000 0004 0P4S (4 port 16550A serial card)
+ 1000 0006 0P6S (6 port 16550a serial card)
+# Serial ports at BAR0-3, Parallel port at BAR4
+ 1000 0014 1P4S (1 Parallel / 4 16550A Serial Port Adapter)
+ 9855 PCI 9855 Multi-I/O Controller
+# Parallel port at BAR0. Serial ports at BAR2-5
+ 1000 0014 1P4S
+# Parallel ports at BAR0,BAR2. Serial ports at BAR4-5
+ 1000 0022 2P2S (2 Parallel / 2 16550A Serial Port Adapter)
+ 9865 PCI 9865 Multi-I/O Controller
+ 9901 PCIe 9901 Multi-I/O Controller
+ 9904 4-Port PCIe Serial Adapter
+ 9922 PCIe 9922 Multi-I/O Controller
+ 9990 MCS9990 PCIe to 4â€Port USB 2.0 Host Controller
+9902 Stargen Inc.
+ 0001 SG2010 PCI over Starfabric Bridge
+ 0002 SG2010 PCI to Starfabric Gateway
+ 0003 SG1010 Starfabric Switch and PCI Bridge
+a0a0 AOPEN Inc.
+a0f1 UNISYS Corporation
+a200 NEC Corporation
+a259 Hewlett Packard
+a25b Hewlett Packard GmbH PL24-MKT
+a304 Sony
+a727 3Com Corporation
+ 0013 3CRPAG175 Wireless PC Card
+ 6803 3CRDAG675B Wireless 11a/b/g Adapter
+aa42 Scitex Digital Video
+aa55 Ncomputing X300 PCI-Engine
+aaaa Adnaco Technology Inc.
+ 0001 H1 PCIe over fiber optic host controller
+ 0002 R1BP1 PCIe over fiber optic expansion chassis
+abcd Vadatech Inc.
+ac1e Digital Receiver Technology Inc
+ac3d Actuality Systems
+ad00 Alta Data Technologies LLC
+aecb Adrienne Electronics Corporation
+ 6250 VITC/LTC Timecode Reader card [PCI-VLTC/RDR]
+affe Sirrix AG security technologies
+ 01e1 PCI1E1 1-port ISDN E1 interface
+ 02e1 PCI2E1 2-port ISDN E1 interface
+ 450e PCI4S0EC 4-port ISDN S0 interface
+ dead Sirrix.PCI4S0 4-port ISDN S0 interface
+b100 OpenVox Communication Co. Ltd.
+# Not registered officially
+b10b Uakron PCI Project
+b1b3 Shiva Europe Limited
+b1d9 ATCOM Technology co., LTD.
+# Pinnacle should be 11bd, but they got it wrong several times --mj
+bd11 Pinnacle Systems, Inc. (Wrong ID)
+bdbd Blackmagic Design
+c001 TSI Telsys
+c0a9 Micron/Crucial Technology
+c0de Motorola
+c0fe Motion Engineering, Inc.
+ca50 Varian Australia Pty Ltd
+cace CACE Technologies, Inc.
+ 0001 TurboCap Port A
+ 0002 TurboCap Port B
+ 0023 AirPcap N
+cafe Chrysalis-ITS
+ 0003 Luna K3 Hardware Security Module
+cccc Catapult Communications
+ccec Curtiss-Wright Controls Embedded Computing
+cddd Tyzx, Inc.
+ 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber
+ 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber
+ceba KEBA AG
+d161 Digium, Inc.
+ 0120 Wildcard TE120P single-span T1/E1/J1 card
+ 0205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V
+ 0210 Wildcard TE210P/TE212P dual-span T1/E1/J1 card 3.3V
+ 0220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express)
+ 0405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V
+ 0410 Wildcard TE410P/TE412P quad-span T1/E1/J1 card 3.3V
+ 0420 Wildcard TE420P quad-span T1/E1/J1 card 3.3V (PCI-Express)
+ 0800 Wildcard TDM800P 8-port analog card
+ 1205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V (u1)
+ 1220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen)
+ 1405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V (u1)
+ 1420 Wildcard TE420 quad-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen)
+ 2400 Wildcard TDM2400P 24-port analog card
+ 3400 Wildcard TC400P transcoder base card
+ 8000 Wildcard TE121 single-span T1/E1/J1 card (PCI-Express)
+ 8001 Wildcard TE122 single-span T1/E1/J1 card
+ 8002 Wildcard AEX800 8-port analog card (PCI-Express)
+ 8003 Wildcard AEX2400 24-port analog card (PCI-Express)
+ 8004 Wildcard TCE400P transcoder base card
+ 8005 Wildcard TDM410 4-port analog card
+ 8006 Wildcard AEX410 4-port analog card (PCI-Express)
+ 8007 Hx8 Series 8-port Base Card
+ 8008 Hx8 Series 8-port Base Card (PCI-Express)
+ b410 Wildcard B410 quad-BRI card
+d4d4 Dy4 Systems Inc
+ 0601 PCI Mezzanine Card
+d531 I+ME ACTIA GmbH
+d84d Exsys
+db10 Diablo Technologies
+dead Indigita Corporation
+deaf Middle Digital Inc.
+ 9050 PC Weasel Virtual VGA
+ 9051 PC Weasel Serial Port
+ 9052 PC Weasel Watchdog Timer
+deda SoftHard Technology Ltd.
+e000 Winbond
+ e000 W89C940
+e159 Tiger Jet Network Inc.
+ 0001 Tiger3XX Modem/ISDN interface
+ 0059 0001 128k ISDN-S/T Adapter
+ 0059 0003 128k ISDN-U Adapter
+ 00a7 0001 TELES.S0/PCI 2.x ISDN Adapter
+ 8086 0003 Digium X100P/X101P analogue PSTN FXO interface
+ b100 0003 OpenVox A400P 4-port analog card
+ b1d9 0003 AX400P 4-port analog card
+ 0002 Tiger100APC ISDN chipset
+e1c5 Elcus
+e4bf EKF Elektronik GmbH
+e55e Essence Technology, Inc.
+ea01 Eagle Technology
+ 000a PCI-773 Temperature Card
+ 0032 PCI-730 & PC104P-30 Card
+ 003e PCI-762 Opto-Isolator Card
+ 0041 PCI-763 Reed Relay Card
+ 0043 PCI-769 Opto-Isolator Reed Relay Combo Card
+ 0046 PCI-766 Analog Output Card
+ 0052 PCI-703 Analog I/O Card
+ 0800 PCI-800 Digital I/O Card
+# The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID.
+ea60 RME
+ 9896 Digi32
+ 9897 Digi32 Pro
+ 9898 Digi32/8
+eabb Aashima Technology B.V.
+eace Endace Measurement Systems, Ltd
+ 3100 DAG 3.10 OC-3/OC-12
+ 3200 DAG 3.2x OC-3/OC-12
+ 320e DAG 3.2E Fast Ethernet
+ 340e DAG 3.4E Fast Ethernet
+ 341e DAG 3.41E Fast Ethernet
+ 3500 DAG 3.5 OC-3/OC-12
+ 351c DAG 3.5ECM Fast Ethernet
+ 360d DAG 3.6D DS3
+ 360e DAG 3.6E Fast Ethernet
+ 368e DAG 3.6E Gig Ethernet
+ 3707 DAG 3.7T T1/E1/J1
+ 370d DAG 3.7D DS3/E3
+ 378e DAG 3.7G Gig Ethernet
+ 3800 DAG 3.8S OC-3/OC-12
+ 4100 DAG 4.10 OC-48
+ 4110 DAG 4.11 OC-48
+ 4220 DAG 4.2 OC-48
+ 422e DAG 4.2GE Gig Ethernet
+ 4230 DAG 4.2S OC-48
+ 423e DAG 4.2GE Gig Ethernet
+ 4300 DAG 4.3S OC-48
+ 430e DAG 4.3GE Gig Ethernet
+ 452e DAG 4.5G2 Gig Ethernet
+ 454e DAG 4.5G4 Gig Ethernet
+ 45b8 DAG 4.5Z8 Gig Ethernet
+ 45be DAG 4.5Z2 Gig Ethernet
+ 520e DAG 5.2X 10G Ethernet
+ 521a DAG 5.2SXA 10G Ethernet/OC-192
+ 5400 DAG 5.4S-12 OC-3/OC-12
+ 5401 DAG 5.4SG-48 Gig Ethernet/OC-3/OC-12/OC-48
+ 540a DAG 5.4GA Gig Ethernet
+ 541a DAG 5.4SA-12 OC-3/OC-12
+ 542a DAG 5.4SGA-48 Gig Ethernet/OC-3/OC-12/OC-48
+ 6000 DAG 6.0SE 10G Ethernet/OC-192
+ 6100 DAG 6.1SE 10G Ethernet/OC-192
+ 6200 DAG 6.2SE 10G Ethernet/OC-192
+ 7100 DAG 7.1S OC-3/OC-12
+ 7400 DAG 7.4S OC-3/OC-12
+ 7401 DAG 7.4S48 OC-48
+ 752e DAG 7.5G2 Gig Ethernet
+ 754e DAG 7.5G4 Gig Ethernet
+ 8100 DAG 8.1X 10G Ethernet
+ 8101 DAG 8.1SX 10G Ethernet/OC-192
+ 8102 DAG 8.1X 10G Ethernet
+ 820e DAG 8.2X 10G Ethernet
+ 820f DAG 8.2X 10G Ethernet (2nd bus)
+ 8400 DAG 8.4I Infiniband x4 SDR
+ 8500 DAG 8.5I Infiniband x4 DDR
+ 920e DAG 9.2X2 10G Ethernet
+ec80 Belkin Corporation
+ ec00 F5D6000
+ecc0 Echo Digital Audio Corporation
+edd8 ARK Logic Inc
+ a091 1000PV [Stingray]
+ a099 2000PV [Stingray]
+ a0a1 2000MT
+ a0a9 2000MI
+# Found on M2N68-AM Motherboard
+f043 ASUSTeK Computer Inc. (Wrong ID)
+f05b Foxconn International, Inc. (Wrong ID)
+f1d0 AJA Video
+ c0fe Xena HS/HD-R
+ c0ff Kona/Xena 2
+ cafe Kona SD
+ cfee Xena LS/SD-22-DA/SD-DA
+ dcaf Kona HD
+ dfee Xena HD-DA
+ efac Xena SD-MM/SD-22-MM
+ facd Xena HD-MM
+f5f5 F5 Networks, Inc.
+# Subsystem ID for PATA controller on nForce motherboard
+f849 ASRock Incorporation (Wrong ID)
+fa57 Interagon AS
+ 0001 PMC [Pattern Matching Chip]
+fab7 Fabric7 Systems, Inc.
+febd Ultraview Corp.
+# Nee Epigram
+feda Broadcom Inc
+ a0fa BCM4210 iLine10 HomePNA 2.0
+ a10e BCM4230 iLine10 HomePNA 2.0
+fede Fedetec Inc.
+ 0003 TABIC PCI v3
+ffee FNK Tech
+fffd XenSource, Inc.
+ 0101 PCI Event Channel Controller
+# Used in some old VMWare products before they got a real ID assigned
+fffe VMWare Inc (temporary ID)
+ 0710 Virtual SVGA
+ffff Illegal Vendor ID
+
+
+# List of known device classes, subclasses and programming interfaces
+
+# Syntax:
+# C class class_name
+# subclass subclass_name <-- single tab
+# prog-if prog-if_name <-- two tabs
+
+C 00 Unclassified device
+ 00 Non-VGA unclassified device
+ 01 VGA compatible unclassified device
+C 01 Mass storage controller
+ 00 SCSI storage controller
+ 01 IDE interface
+ 02 Floppy disk controller
+ 03 IPI bus controller
+ 04 RAID bus controller
+ 05 ATA controller
+ 20 ADMA single stepping
+ 30 ADMA continuous operation
+ 06 SATA controller
+ 00 Vendor specific
+ 01 AHCI 1.0
+ 07 Serial Attached SCSI controller
+ 08 Non-Volatile memory controller
+ 80 Mass storage controller
+C 02 Network controller
+ 00 Ethernet controller
+ 01 Token ring network controller
+ 02 FDDI network controller
+ 03 ATM network controller
+ 04 ISDN controller
+ 05 WorldFip controller
+ 06 PICMG controller
+ 80 Network controller
+C 03 Display controller
+ 00 VGA compatible controller
+ 00 VGA controller
+ 01 8514 controller
+ 01 XGA compatible controller
+ 02 3D controller
+ 80 Display controller
+C 04 Multimedia controller
+ 00 Multimedia video controller
+ 01 Multimedia audio controller
+ 02 Computer telephony device
+ 03 Audio device
+ 80 Multimedia controller
+C 05 Memory controller
+ 00 RAM memory
+ 01 FLASH memory
+ 80 Memory controller
+C 06 Bridge
+ 00 Host bridge
+ 01 ISA bridge
+ 02 EISA bridge
+ 03 MicroChannel bridge
+ 04 PCI bridge
+ 00 Normal decode
+ 01 Subtractive decode
+ 05 PCMCIA bridge
+ 06 NuBus bridge
+ 07 CardBus bridge
+ 08 RACEway bridge
+ 00 Transparent mode
+ 01 Endpoint mode
+ 09 Semi-transparent PCI-to-PCI bridge
+ 40 Primary bus towards host CPU
+ 80 Secondary bus towards host CPU
+ 0a InfiniBand to PCI host bridge
+ 80 Bridge
+C 07 Communication controller
+ 00 Serial controller
+ 00 8250
+ 01 16450
+ 02 16550
+ 03 16650
+ 04 16750
+ 05 16850
+ 06 16950
+ 01 Parallel controller
+ 00 SPP
+ 01 BiDir
+ 02 ECP
+ 03 IEEE1284
+ fe IEEE1284 Target
+ 02 Multiport serial controller
+ 03 Modem
+ 00 Generic
+ 01 Hayes/16450
+ 02 Hayes/16550
+ 03 Hayes/16650
+ 04 Hayes/16750
+ 04 GPIB controller
+ 05 Smard Card controller
+ 80 Communication controller
+C 08 Generic system peripheral
+ 00 PIC
+ 00 8259
+ 01 ISA PIC
+ 02 EISA PIC
+ 10 IO-APIC
+ 20 IO(X)-APIC
+ 01 DMA controller
+ 00 8237
+ 01 ISA DMA
+ 02 EISA DMA
+ 02 Timer
+ 00 8254
+ 01 ISA Timer
+ 02 EISA Timers
+ 03 RTC
+ 00 Generic
+ 01 ISA RTC
+ 04 PCI Hot-plug controller
+ 05 SD Host controller
+ 80 System peripheral
+C 09 Input device controller
+ 00 Keyboard controller
+ 01 Digitizer Pen
+ 02 Mouse controller
+ 03 Scanner controller
+ 04 Gameport controller
+ 00 Generic
+ 10 Extended
+ 80 Input device controller
+C 0a Docking station
+ 00 Generic Docking Station
+ 80 Docking Station
+C 0b Processor
+ 00 386
+ 01 486
+ 02 Pentium
+ 10 Alpha
+ 20 Power PC
+ 30 MIPS
+ 40 Co-processor
+C 0c Serial bus controller
+ 00 FireWire (IEEE 1394)
+ 00 Generic
+ 10 OHCI
+ 01 ACCESS Bus
+ 02 SSA
+ 03 USB Controller
+ 00 UHCI
+ 10 OHCI
+ 20 EHCI
+ 30 XHCI
+ 80 Unspecified
+ fe USB Device
+ 04 Fibre Channel
+ 05 SMBus
+ 06 InfiniBand
+ 07 IPMI SMIC interface
+ 08 SERCOS interface
+ 09 CANBUS
+C 0d Wireless controller
+ 00 IRDA controller
+ 01 Consumer IR controller
+ 10 RF controller
+ 11 Bluetooth
+ 12 Broadband
+ 20 802.1a controller
+ 21 802.1b controller
+ 80 Wireless controller
+C 0e Intelligent controller
+ 00 I2O
+C 0f Satellite communications controller
+ 01 Satellite TV controller
+ 02 Satellite audio communication controller
+ 03 Satellite voice communication controller
+ 04 Satellite data communication controller
+C 10 Encryption controller
+ 00 Network and computing encryption device
+ 10 Entertainment encryption device
+ 80 Encryption controller
+C 11 Signal processing controller
+ 00 DPIO module
+ 01 Performance counters
+ 10 Communication synchronizer
+ 20 Signal processing management
+ 80 Signal processing controller
+C ff Unassigned class
diff --git a/share/misc/usb_hid_usages b/share/misc/usb_hid_usages
index 2e66836..0a4a556 100644
--- a/share/misc/usb_hid_usages
+++ b/share/misc/usb_hid_usages
@@ -989,9 +989,11 @@
0x0B Armature
0x0C Multiple Point Digitizer
0x0D Free Space Wand
+ 0x0E Device Configuration
0x20 Stylus
0x21 Puck
0x22 Finger
+ 0x23 Device Settings
0x30 Tip Pressure
0x31 Barrel Pressure
0x32 In Range
@@ -1015,6 +1017,14 @@
0x44 Barrel Switch
0x45 Eraser
0x46 Tablet Pick
+ 0x47 Touch Valid
+ 0x48 Width
+ 0x49 Height
+ 0x51 Contact Identifier
+ 0x52 Device Mode
+ 0x53 Device Identifier
+ 0x54 Contact Count
+ 0x55 Contact Count Maximum
15 Physical Interface Device
0x00 Undefined
diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk
index f7ab5f8..ee78619 100644
--- a/share/mk/bsd.own.mk
+++ b/share/mk/bsd.own.mk
@@ -63,6 +63,15 @@
# SHAREMODE ASCII text file mode. [${NOBINMODE}]
#
#
+# CONFDIR Base path for configuration files. [/etc]
+#
+# CONFOWN Configuration file owner. [root]
+#
+# CONFGRP Configuration file group. [wheel]
+#
+# CONFMODE Configuration file mode. [644]
+#
+#
# DOCDIR Base path for system documentation (e.g. PSD, USD,
# handbook, FAQ etc.). [${SHAREDIR}/doc]
#
@@ -145,6 +154,11 @@ SHAREOWN?= root
SHAREGRP?= wheel
SHAREMODE?= ${NOBINMODE}
+CONFDIR?= /etc
+CONFOWN?= root
+CONFGRP?= wheel
+CONFMODE?= 644
+
MANDIR?= ${SHAREDIR}/man/man
MANOWN?= ${SHAREOWN}
MANGRP?= ${SHAREGRP}
@@ -383,6 +397,7 @@ __DEFAULT_YES_OPTIONS = \
TEXTPROC \
TOOLCHAIN \
USB \
+ UTMPX \
WIRELESS \
WPA_SUPPLICANT_EAPOL \
ZFS \
diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c
index 29e66c5..43aeec3 100644
--- a/sys/amd64/acpica/acpi_wakeup.c
+++ b/sys/amd64/acpica/acpi_wakeup.c
@@ -226,7 +226,8 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
return (ret);
#ifdef SMP
- wakeup_cpus = PCPU_GET(other_cpus);
+ wakeup_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &wakeup_cpus);
#endif
AcpiSetFirmwareWakingVector(WAKECODE_PADDR(sc));
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 53988e9..668e79c 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -604,10 +604,10 @@ cpu_mp_announce(void)
void
init_secondary(void)
{
- cpuset_t tcpuset, tallcpus;
struct pcpu *pc;
struct nmi_pcpu *np;
u_int64_t msr, cr0;
+ u_int cpuid;
int cpu, gsel_tss, x;
struct region_descriptor ap_gdt;
@@ -711,8 +711,9 @@ init_secondary(void)
fpuinit();
/* A quick check from sanity claus */
+ cpuid = PCPU_GET(cpuid);
if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", PCPU_GET(cpuid));
+ printf("SMP: cpuid = %d\n", cpuid);
printf("SMP: actual apic_id = %d\n", lapic_id());
printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
panic("cpuid mismatch! boom!!");
@@ -734,19 +735,13 @@ init_secondary(void)
smp_cpus++;
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid));
- printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid));
- tcpuset = PCPU_GET(cpumask);
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
/* Determine if we are a logical CPU. */
/* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
- CPU_OR(&logical_cpus_mask, &tcpuset);
-
- /* Build our map of 'other' CPUs. */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
+ CPU_SET(cpuid, &logical_cpus_mask);
if (bootverbose)
lapic_dump("AP");
@@ -893,7 +888,6 @@ assign_cpu_ids(void)
static int
start_all_aps(void)
{
- cpuset_t tallcpus, tcpuset;
vm_offset_t va = boot_address + KERNBASE;
u_int64_t *pt4, *pt3, *pt2;
u_int32_t mpbioswarmvec;
@@ -961,12 +955,6 @@ start_all_aps(void)
CPU_SET(cpu, &all_cpus); /* record AP in CPU map */
}
- /* build our map of 'other' CPUs */
- tallcpus = all_cpus;
- tcpuset = PCPU_GET(cpumask);
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
-
/* restore the warmstart vector */
*(u_int32_t *) WARMBOOT_OFF = mpbioswarmvec;
@@ -1150,9 +1138,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
if (othercpus < 1)
return;
} else {
- sched_pin();
- CPU_NAND(&mask, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &mask);
if (CPU_EMPTY(&mask))
return;
}
@@ -1349,11 +1335,13 @@ ipi_cpu(int cpu, u_int ipi)
void
ipi_all_but_self(u_int ipi)
{
+ cpuset_t other_cpus;
+
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
- sched_pin();
if (IPI_IS_BITMAPED(ipi)) {
- ipi_selected(PCPU_GET(other_cpus), ipi);
- sched_unpin();
+ ipi_selected(other_cpus, ipi);
return;
}
@@ -1363,8 +1351,7 @@ ipi_all_but_self(u_int ipi)
* Set the mask of receiving CPUs for this purpose.
*/
if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, PCPU_PTR(other_cpus));
- sched_unpin();
+ CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
@@ -1373,7 +1360,7 @@ ipi_all_but_self(u_int ipi)
int
ipi_nmi_handler()
{
- cpuset_t cpumask;
+ u_int cpuid;
/*
* As long as there is not a simple way to know about a NMI's
@@ -1381,13 +1368,11 @@ ipi_nmi_handler()
* the global pending bitword an IPI_STOP_HARD has been issued
* and should be handled.
*/
- sched_pin();
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
- if (!CPU_OVERLAP(&ipi_nmi_pending, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
return (1);
- CPU_NAND_ATOMIC(&ipi_nmi_pending, &cpumask);
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
cpustop_handler();
return (0);
}
@@ -1399,25 +1384,21 @@ ipi_nmi_handler()
void
cpustop_handler(void)
{
- cpuset_t cpumask;
u_int cpu;
- sched_pin();
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
savectx(&stoppcbs[cpu]);
/* Indicate that we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
if (cpu == 0 && cpustop_restartfunc != NULL) {
cpustop_restartfunc();
@@ -1432,19 +1413,17 @@ cpustop_handler(void)
void
cpususpend_handler(void)
{
- cpuset_t cpumask;
register_t cr3, rf;
u_int cpu;
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
rf = intr_disable();
cr3 = rcr3();
if (savectx(susppcbs[cpu])) {
wbinvd();
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
} else {
pmap_init_pat();
PCPU_SET(switchtime, 0);
@@ -1452,11 +1431,11 @@ cpususpend_handler(void)
}
/* Wait for resume */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
/* Restore CR3 and enable interrupts */
load_cr3(cr3);
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 025ca5f..bed795b 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -925,16 +925,18 @@ pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde)
void
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invlpg(va);
smp_invlpg(va);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invlpg(va);
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -946,8 +948,9 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
void
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
vm_offset_t addr;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
@@ -955,9 +958,10 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
invlpg(addr);
smp_invlpg_range(sva, eva);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
for (addr = sva; addr < eva; addr += PAGE_SIZE)
invlpg(addr);
CPU_AND(&other_cpus, &pmap->pm_active);
@@ -970,16 +974,18 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
void
pmap_invalidate_all(pmap_t pmap)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invltlb();
smp_invltlb();
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invltlb();
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -999,11 +1005,11 @@ pmap_invalidate_cache(void)
}
struct pde_action {
- cpuset_t store; /* processor that updates the PDE */
cpuset_t invalidate; /* processors that invalidate their TLB */
vm_offset_t va;
pd_entry_t *pde;
pd_entry_t newpde;
+ u_int store; /* processor that updates the PDE */
};
static void
@@ -1011,12 +1017,8 @@ pmap_update_pde_action(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (!CPU_CMP(&act->store, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (act->store == PCPU_GET(cpuid))
pde_store(act->pde, act->newpde);
- } else
- sched_unpin();
}
static void
@@ -1024,12 +1026,8 @@ pmap_update_pde_teardown(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (CPU_OVERLAP(&act->invalidate, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
pmap_update_pde_invalidate(act->va, act->newpde);
- } else
- sched_unpin();
}
/*
@@ -1044,28 +1042,30 @@ static void
pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
{
struct pde_action act;
- cpuset_t active, cpumask, other_cpus;
+ cpuset_t active, other_cpus;
+ u_int cpuid;
sched_pin();
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
if (pmap == kernel_pmap)
active = all_cpus;
else
active = pmap->pm_active;
if (CPU_OVERLAP(&active, &other_cpus)) {
- act.store = cpumask;
+ act.store = cpuid;
act.invalidate = active;
act.va = va;
act.pde = pde;
act.newpde = newpde;
- CPU_OR(&cpumask, &active);
- smp_rendezvous_cpus(cpumask,
+ CPU_SET(cpuid, &active);
+ smp_rendezvous_cpus(active,
smp_no_rendevous_barrier, pmap_update_pde_action,
pmap_update_pde_teardown, &act);
} else {
pde_store(pde, newpde);
- if (CPU_OVERLAP(&active, &cpumask))
+ if (CPU_ISSET(cpuid, &active))
pmap_update_pde_invalidate(va, newpde);
}
sched_unpin();
@@ -2104,7 +2104,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
vm_page_t m, free;
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -2847,8 +2847,8 @@ pmap_remove_all(vm_page_t m)
vm_offset_t va;
vm_page_t free;
- KASSERT((m->flags & PG_FICTITIOUS) == 0,
- ("pmap_remove_all: page %p is fictitious", m));
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
free = NULL;
vm_page_lock_queues();
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
@@ -5095,17 +5095,19 @@ void
pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
+ u_int cpuid;
u_int64_t cr3;
critical_enter();
pmap = vmspace_pmap(td->td_proc->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
#ifdef SMP
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
#else
- CPU_NAND(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR(cpuid, &oldpmap->pm_active);
+ CPU_SET(cpuid, &pmap->pm_active);
#endif
cr3 = DMAP_TO_PHYS((vm_offset_t)pmap->pm_pml4);
td->td_pcb->pcb_cr3 = cr3;
diff --git a/sys/amd64/amd64/sys_machdep.c b/sys/amd64/amd64/sys_machdep.c
index fa895f3..17eada1 100644
--- a/sys/amd64/amd64/sys_machdep.c
+++ b/sys/amd64/amd64/sys_machdep.c
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_capabilities.h"
+#include "opt_capsicum.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -180,28 +180,30 @@ sysarch(td, uap)
uint64_t a64base;
struct i386_ioperm_args iargs;
-#ifdef CAPABILITIES
+#ifdef CAPABILITY_MODE
/*
- * Whitelist of operations which are safe enough for capability mode.
+ * When adding new operations, add a new case statement here to
+ * explicitly indicate whether or not the operation is safe to
+ * perform in capability mode.
*/
if (IN_CAPABILITY_MODE(td)) {
switch (uap->op) {
- case I386_GET_LDT:
- case I386_SET_LDT:
- case I386_GET_IOPERM:
- case I386_GET_FSBASE:
- case I386_SET_FSBASE:
- case I386_GET_GSBASE:
- case I386_SET_GSBASE:
- case AMD64_GET_FSBASE:
- case AMD64_SET_FSBASE:
- case AMD64_GET_GSBASE:
- case AMD64_SET_GSBASE:
- break;
+ case I386_GET_LDT:
+ case I386_SET_LDT:
+ case I386_GET_IOPERM:
+ case I386_GET_FSBASE:
+ case I386_SET_FSBASE:
+ case I386_GET_GSBASE:
+ case I386_SET_GSBASE:
+ case AMD64_GET_FSBASE:
+ case AMD64_SET_FSBASE:
+ case AMD64_GET_GSBASE:
+ case AMD64_SET_GSBASE:
+ break;
- case I386_SET_IOPERM:
- default:
- return (ECAPMODE);
+ case I386_SET_IOPERM:
+ default:
+ return (ECAPMODE);
}
}
#endif
diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index 13f5cd0..d05880f 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -59,7 +59,6 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/pioctl.h>
#include <sys/proc.h>
-#include <sys/sched.h>
#include <sys/sf_buf.h>
#include <sys/smp.h>
#include <sys/sysctl.h>
@@ -535,8 +534,8 @@ cpu_reset()
u_int cnt;
if (smp_active) {
- sched_pin();
- map = PCPU_GET(other_cpus);
+ map = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &map);
CPU_NAND(&map, &stopped_cpus);
if (!CPU_EMPTY(&map)) {
printf("cpu_reset: Stopping other CPUs\n");
@@ -545,7 +544,6 @@ cpu_reset()
if (PCPU_GET(cpuid) != 0) {
cpu_reset_proxyid = PCPU_GET(cpuid);
- sched_unpin();
cpustop_restartfunc = cpu_reset_proxy;
cpu_reset_proxy_active = 0;
printf("cpu_reset: Restarting BSP\n");
@@ -564,8 +562,7 @@ cpu_reset()
while (1);
/* NOTREACHED */
- } else
- sched_unpin();
+ }
DELAY(1000000);
}
diff --git a/sys/amd64/ia32/ia32_sigtramp.S b/sys/amd64/ia32/ia32_sigtramp.S
index 7d64470..710834c 100644
--- a/sys/amd64/ia32/ia32_sigtramp.S
+++ b/sys/amd64/ia32/ia32_sigtramp.S
@@ -79,8 +79,20 @@ ia32_osigcode:
jmp 1b
+/*
+ * The lcall $7,$0 emulator cannot use the call gate that does an
+ * inter-privilege transition. The reason is that the call gate
+ * does not disable interrupts, and, before the swapgs is
+ * executed, we would have a window where the ring 0 code is
+ * executed with the wrong gsbase.
+ *
+ * Instead, reflect the lcall $7,$0 back to ring 3 trampoline
+ * which sets up the frame for int $0x80.
+ */
ALIGN_TEXT
lcall_tramp:
+ cmpl $SYS_vfork,%eax
+ je 2f
pushl %ebp
movl %esp,%ebp
pushl 0x24(%ebp) /* arg 6 */
@@ -91,8 +103,19 @@ lcall_tramp:
pushl 0x10(%ebp) /* arg 1 */
pushl 0xc(%ebp) /* gap */
int $0x80
- leave
+ leavel
+1:
lretl
+2:
+ /*
+ * vfork handling is special and relies on the libc stub saving
+ * the return ip in %ecx. If vfork failed, then there is no
+ * child which can corrupt the frame created by call gate.
+ */
+ int $0x80
+ jb 1b
+ addl $8,%esp
+ jmpl *%ecx
#endif
ALIGN_TEXT
diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h
index 9b61d37..c07e09b 100644
--- a/sys/amd64/include/cpufunc.h
+++ b/sys/amd64/include/cpufunc.h
@@ -467,16 +467,18 @@ load_es(u_short sel)
}
static __inline void
-cpu_monitor(const void *addr, int extensions, int hints)
+cpu_monitor(const void *addr, u_long extensions, u_int hints)
{
- __asm __volatile("monitor;"
- : :"a" (addr), "c" (extensions), "d"(hints));
+
+ __asm __volatile("monitor"
+ : : "a" (addr), "c" (extensions), "d" (hints));
}
static __inline void
-cpu_mwait(int extensions, int hints)
+cpu_mwait(u_long extensions, u_int hints)
{
- __asm __volatile("mwait;" : :"a" (hints), "c" (extensions));
+
+ __asm __volatile("mwait" : : "a" (hints), "c" (extensions));
}
#ifdef _KERNEL
diff --git a/sys/amd64/include/pci_cfgreg.h b/sys/amd64/include/pci_cfgreg.h
index 7588282..717d5cc 100644
--- a/sys/amd64/include/pci_cfgreg.h
+++ b/sys/amd64/include/pci_cfgreg.h
@@ -1,43 +1,6 @@
/*-
- * Copyright (c) 1997, Stefan Esser <se@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice unmodified, this list of conditions, and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- *
+ * This file is in the public domain.
*/
+/* $FreeBSD$ */
-#define CONF1_ADDR_PORT 0x0cf8
-#define CONF1_DATA_PORT 0x0cfc
-
-#define CONF1_ENABLE 0x80000000ul
-#define CONF1_ENABLE_CHK 0x80000000ul
-#define CONF1_ENABLE_MSK 0x7f000000ul
-#define CONF1_ENABLE_CHK1 0xff000001ul
-#define CONF1_ENABLE_MSK1 0x80000001ul
-#define CONF1_ENABLE_RES1 0x80000000ul
-
-int pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus);
-int pci_cfgregopen(void);
-u_int32_t pci_cfgregread(int bus, int slot, int func, int reg, int bytes);
-void pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes);
+#include <x86/pci_cfgreg.h>
diff --git a/sys/amd64/pci/pci_bus.c b/sys/amd64/pci/pci_bus.c
deleted file mode 100644
index 7c377ac..0000000
--- a/sys/amd64/pci/pci_bus.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/*-
- * Copyright (c) 1997, Stefan Esser <se@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice unmodified, this list of conditions, and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "opt_cpu.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/bus.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/module.h>
-#include <sys/rman.h>
-#include <sys/sysctl.h>
-
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pcib_private.h>
-#include <isa/isavar.h>
-#include <machine/legacyvar.h>
-#include <machine/pci_cfgreg.h>
-#include <machine/resource.h>
-
-#include "pcib_if.h"
-
-int
-legacy_pcib_maxslots(device_t dev)
-{
- return 31;
-}
-
-/* read configuration space register */
-
-uint32_t
-legacy_pcib_read_config(device_t dev, u_int bus, u_int slot, u_int func,
- u_int reg, int bytes)
-{
- return(pci_cfgregread(bus, slot, func, reg, bytes));
-}
-
-/* write configuration space register */
-
-void
-legacy_pcib_write_config(device_t dev, u_int bus, u_int slot, u_int func,
- u_int reg, uint32_t data, int bytes)
-{
- pci_cfgregwrite(bus, slot, func, reg, data, bytes);
-}
-
-/* route interrupt */
-
-static int
-legacy_pcib_route_interrupt(device_t pcib, device_t dev, int pin)
-{
-
- /* No routing possible */
- return (PCI_INVALID_IRQ);
-}
-
-/* Pass MSI requests up to the nexus. */
-
-static int
-legacy_pcib_alloc_msi(device_t pcib, device_t dev, int count, int maxcount,
- int *irqs)
-{
- device_t bus;
-
- bus = device_get_parent(pcib);
- return (PCIB_ALLOC_MSI(device_get_parent(bus), dev, count, maxcount,
- irqs));
-}
-
-static int
-legacy_pcib_alloc_msix(device_t pcib, device_t dev, int *irq)
-{
- device_t bus;
-
- bus = device_get_parent(pcib);
- return (PCIB_ALLOC_MSIX(device_get_parent(bus), dev, irq));
-}
-
-static int
-legacy_pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr,
- uint32_t *data)
-{
- device_t bus;
-
- bus = device_get_parent(pcib);
- return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data));
-}
-
-static const char *
-legacy_pcib_is_host_bridge(int bus, int slot, int func,
- uint32_t id, uint8_t class, uint8_t subclass,
- uint8_t *busnum)
-{
- const char *s = NULL;
-
- *busnum = 0;
- if (class == PCIC_BRIDGE && subclass == PCIS_BRIDGE_HOST)
- s = "Host to PCI bridge";
- return s;
-}
-
-/*
- * Scan the first pci bus for host-pci bridges and add pcib instances
- * to the nexus for each bridge.
- */
-static void
-legacy_pcib_identify(driver_t *driver, device_t parent)
-{
- int bus, slot, func;
- u_int8_t hdrtype;
- int found = 0;
- int pcifunchigh;
- int found824xx = 0;
- int found_orion = 0;
- device_t child;
- devclass_t pci_devclass;
-
- if (pci_cfgregopen() == 0)
- return;
- /*
- * Check to see if we haven't already had a PCI bus added
- * via some other means. If we have, bail since otherwise
- * we're going to end up duplicating it.
- */
- if ((pci_devclass = devclass_find("pci")) &&
- devclass_get_device(pci_devclass, 0))
- return;
-
-
- bus = 0;
- retry:
- for (slot = 0; slot <= PCI_SLOTMAX; slot++) {
- func = 0;
- hdrtype = legacy_pcib_read_config(0, bus, slot, func,
- PCIR_HDRTYPE, 1);
- /*
- * When enumerating bus devices, the standard says that
- * one should check the header type and ignore the slots whose
- * header types that the software doesn't know about. We use
- * this to filter out devices.
- */
- if ((hdrtype & PCIM_HDRTYPE) > PCI_MAXHDRTYPE)
- continue;
- if ((hdrtype & PCIM_MFDEV) &&
- (!found_orion || hdrtype != 0xff))
- pcifunchigh = PCI_FUNCMAX;
- else
- pcifunchigh = 0;
- for (func = 0; func <= pcifunchigh; func++) {
- /*
- * Read the IDs and class from the device.
- */
- u_int32_t id;
- u_int8_t class, subclass, busnum;
- const char *s;
- device_t *devs;
- int ndevs, i;
-
- id = legacy_pcib_read_config(0, bus, slot, func,
- PCIR_DEVVENDOR, 4);
- if (id == -1)
- continue;
- class = legacy_pcib_read_config(0, bus, slot, func,
- PCIR_CLASS, 1);
- subclass = legacy_pcib_read_config(0, bus, slot, func,
- PCIR_SUBCLASS, 1);
-
- s = legacy_pcib_is_host_bridge(bus, slot, func,
- id, class, subclass,
- &busnum);
- if (s == NULL)
- continue;
-
- /*
- * Check to see if the physical bus has already
- * been seen. Eg: hybrid 32 and 64 bit host
- * bridges to the same logical bus.
- */
- if (device_get_children(parent, &devs, &ndevs) == 0) {
- for (i = 0; s != NULL && i < ndevs; i++) {
- if (strcmp(device_get_name(devs[i]),
- "pcib") != 0)
- continue;
- if (legacy_get_pcibus(devs[i]) == busnum)
- s = NULL;
- }
- free(devs, M_TEMP);
- }
-
- if (s == NULL)
- continue;
- /*
- * Add at priority 100 to make sure we
- * go after any motherboard resources
- */
- child = BUS_ADD_CHILD(parent, 100,
- "pcib", busnum);
- device_set_desc(child, s);
- legacy_set_pcibus(child, busnum);
-
- found = 1;
- if (id == 0x12258086)
- found824xx = 1;
- if (id == 0x84c48086)
- found_orion = 1;
- }
- }
- if (found824xx && bus == 0) {
- bus++;
- goto retry;
- }
-
- /*
- * Make sure we add at least one bridge since some old
- * hardware doesn't actually have a host-pci bridge device.
- * Note that pci_cfgregopen() thinks we have PCI devices..
- */
- if (!found) {
- if (bootverbose)
- printf(
- "legacy_pcib_identify: no bridge found, adding pcib0 anyway\n");
- child = BUS_ADD_CHILD(parent, 100, "pcib", 0);
- legacy_set_pcibus(child, 0);
- }
-}
-
-static int
-legacy_pcib_probe(device_t dev)
-{
-
- if (pci_cfgregopen() == 0)
- return ENXIO;
- return -100;
-}
-
-static int
-legacy_pcib_attach(device_t dev)
-{
- int bus;
-
- bus = pcib_get_bus(dev);
- device_add_child(dev, "pci", bus);
- return bus_generic_attach(dev);
-}
-
-int
-legacy_pcib_read_ivar(device_t dev, device_t child, int which,
- uintptr_t *result)
-{
-
- switch (which) {
- case PCIB_IVAR_DOMAIN:
- *result = 0;
- return 0;
- case PCIB_IVAR_BUS:
- *result = legacy_get_pcibus(dev);
- return 0;
- }
- return ENOENT;
-}
-
-int
-legacy_pcib_write_ivar(device_t dev, device_t child, int which,
- uintptr_t value)
-{
-
- switch (which) {
- case PCIB_IVAR_DOMAIN:
- return EINVAL;
- case PCIB_IVAR_BUS:
- legacy_set_pcibus(dev, value);
- return 0;
- }
- return ENOENT;
-}
-
-SYSCTL_DECL(_hw_pci);
-
-static unsigned long legacy_host_mem_start = 0x80000000;
-TUNABLE_ULONG("hw.pci.host_mem_start", &legacy_host_mem_start);
-SYSCTL_ULONG(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN,
- &legacy_host_mem_start, 0x80000000,
- "Limit the host bridge memory to being above this address. Must be\n\
-set at boot via a tunable.");
-
-struct resource *
-legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
- u_long start, u_long end, u_long count, u_int flags)
-{
- /*
- * If no memory preference is given, use upper 32MB slot most
- * bioses use for their memory window. Typically other bridges
- * before us get in the way to assert their preferences on memory.
- * Hardcoding like this sucks, so a more MD/MI way needs to be
- * found to do it. This is typically only used on older laptops
- * that don't have pci busses behind pci bridge, so assuming > 32MB
- * is liekly OK.
- *
- * However, this can cause problems for other chipsets, so we make
- * this tunable by hw.pci.host_mem_start.
- */
- if (type == SYS_RES_MEMORY && start == 0UL && end == ~0UL)
- start = legacy_host_mem_start;
- if (type == SYS_RES_IOPORT && start == 0UL && end == ~0UL)
- start = 0x1000;
- return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
- count, flags));
-}
-
-static device_method_t legacy_pcib_methods[] = {
- /* Device interface */
- DEVMETHOD(device_identify, legacy_pcib_identify),
- DEVMETHOD(device_probe, legacy_pcib_probe),
- DEVMETHOD(device_attach, legacy_pcib_attach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
-
- /* Bus interface */
- DEVMETHOD(bus_print_child, bus_generic_print_child),
- DEVMETHOD(bus_read_ivar, legacy_pcib_read_ivar),
- DEVMETHOD(bus_write_ivar, legacy_pcib_write_ivar),
- DEVMETHOD(bus_alloc_resource, legacy_pcib_alloc_resource),
- DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
- DEVMETHOD(bus_release_resource, bus_generic_release_resource),
- DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
- DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
- DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
- DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
-
- /* pcib interface */
- DEVMETHOD(pcib_maxslots, legacy_pcib_maxslots),
- DEVMETHOD(pcib_read_config, legacy_pcib_read_config),
- DEVMETHOD(pcib_write_config, legacy_pcib_write_config),
- DEVMETHOD(pcib_route_interrupt, legacy_pcib_route_interrupt),
- DEVMETHOD(pcib_alloc_msi, legacy_pcib_alloc_msi),
- DEVMETHOD(pcib_release_msi, pcib_release_msi),
- DEVMETHOD(pcib_alloc_msix, legacy_pcib_alloc_msix),
- DEVMETHOD(pcib_release_msix, pcib_release_msix),
- DEVMETHOD(pcib_map_msi, legacy_pcib_map_msi),
-
- { 0, 0 }
-};
-
-static devclass_t hostb_devclass;
-
-DEFINE_CLASS_0(pcib, legacy_pcib_driver, legacy_pcib_methods, 1);
-DRIVER_MODULE(pcib, legacy, legacy_pcib_driver, hostb_devclass, 0, 0);
-
-
-/*
- * Install placeholder to claim the resources owned by the
- * PCI bus interface. This could be used to extract the
- * config space registers in the extreme case where the PnP
- * ID is available and the PCI BIOS isn't, but for now we just
- * eat the PnP ID and do nothing else.
- *
- * XXX we should silence this probe, as it will generally confuse
- * people.
- */
-static struct isa_pnp_id pcibus_pnp_ids[] = {
- { 0x030ad041 /* PNP0A03 */, "PCI Bus" },
- { 0x080ad041 /* PNP0A08 */, "PCIe Bus" },
- { 0 }
-};
-
-static int
-pcibus_pnp_probe(device_t dev)
-{
- int result;
-
- if ((result = ISA_PNP_PROBE(device_get_parent(dev), dev, pcibus_pnp_ids)) <= 0)
- device_quiet(dev);
- return(result);
-}
-
-static int
-pcibus_pnp_attach(device_t dev)
-{
- return(0);
-}
-
-static device_method_t pcibus_pnp_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, pcibus_pnp_probe),
- DEVMETHOD(device_attach, pcibus_pnp_attach),
- DEVMETHOD(device_detach, bus_generic_detach),
- DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
- { 0, 0 }
-};
-
-static devclass_t pcibus_pnp_devclass;
-
-DEFINE_CLASS_0(pcibus_pnp, pcibus_pnp_driver, pcibus_pnp_methods, 1);
-DRIVER_MODULE(pcibus_pnp, isa, pcibus_pnp_driver, pcibus_pnp_devclass, 0, 0);
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
index cecf363..d24a422 100644
--- a/sys/arm/arm/pmap.c
+++ b/sys/arm/arm/pmap.c
@@ -3120,8 +3120,8 @@ pmap_remove_all(vm_page_t m)
pmap_t curpm;
int flags = 0;
- KASSERT((m->flags & PG_FICTITIOUS) == 0,
- ("pmap_remove_all: page %p is fictitious", m));
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
if (TAILQ_EMPTY(&m->md.pv_list))
return;
vm_page_lock_queues();
@@ -3242,9 +3242,12 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
PTE_SYNC(ptep);
if (pg != NULL) {
- f = pmap_modify_pv(pg, pm, sva,
- PVF_WRITE, 0);
- vm_page_dirty(pg);
+ if (!(pg->flags & PG_UNMANAGED)) {
+ f = pmap_modify_pv(pg, pm, sva,
+ PVF_WRITE, 0);
+ vm_page_dirty(pg);
+ } else
+ f = 0;
} else
f = PVF_REF | PVF_EXEC;
diff --git a/sys/arm/arm/sys_machdep.c b/sys/arm/arm/sys_machdep.c
index 89e5227..4c3e350 100644
--- a/sys/arm/arm/sys_machdep.c
+++ b/sys/arm/arm/sys_machdep.c
@@ -36,7 +36,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_capabilities.h"
+#include "opt_capsicum.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -107,20 +107,22 @@ sysarch(td, uap)
{
int error;
-#ifdef CAPABILITIES
+#ifdef CAPABILITY_MODE
/*
- * Whitelist of operations which are safe enough for capability mode.
+ * When adding new operations, add a new case statement here to
+ * explicitly indicate whether or not the operation is safe to
+ * perform in capability mode.
*/
if (IN_CAPABILITY_MODE(td)) {
switch (uap->op) {
- case ARM_SYNC_ICACHE:
- case ARM_DRAIN_WRITEBUF:
- case ARM_SET_TP:
- case ARM_GET_TP:
- break;
-
- default:
- return (ECAPMODE);
+ case ARM_SYNC_ICACHE:
+ case ARM_DRAIN_WRITEBUF:
+ case ARM_SET_TP:
+ case ARM_GET_TP:
+ break;
+
+ default:
+ return (ECAPMODE);
}
}
#endif
diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c
index 717e7c2..a7eb5f6 100644
--- a/sys/arm/at91/at91_machdep.c
+++ b/sys/arm/at91/at91_machdep.c
@@ -91,7 +91,6 @@ __FBSDID("$FreeBSD$");
#include <arm/at91/at91var.h>
#include <arm/at91/at91rm92reg.h>
#include <arm/at91/at91sam9g20reg.h>
-#include <arm/at91/at91board.h>
#define KERNEL_PT_SYS 0 /* Page table for mapping proc0 zero page */
#define KERNEL_PT_KERN 1
diff --git a/sys/arm/conf/CAMBRIA b/sys/arm/conf/CAMBRIA
index 6862129..befe28a 100644
--- a/sys/arm/conf/CAMBRIA
+++ b/sys/arm/conf/CAMBRIA
@@ -130,7 +130,7 @@ options ATH_DIAGAPI
#options ATH_TX99_DIAG
device ath_rate_sample # SampleRate tx rate control for ath
-options AH_DEBUG
+#options AH_DEBUG
#options AH_ASSERT
options AH_PRIVATE_DIAG
#device ath_ar5210
diff --git a/sys/arm/mv/common.c b/sys/arm/mv/common.c
index 16bd325..09da857 100644
--- a/sys/arm/mv/common.c
+++ b/sys/arm/mv/common.c
@@ -122,7 +122,7 @@ static struct soc_node_spec soc_nodes[] = {
{ "mrvl,sata", &decode_win_sata_setup, NULL },
{ "mrvl,xor", &decode_win_xor_setup, &decode_win_xor_dump },
{ "mrvl,idma", &decode_win_idma_setup, &decode_win_idma_dump },
- { "mvrl,pcie", &decode_win_pcie_setup, NULL },
+ { "mrvl,pcie", &decode_win_pcie_setup, NULL },
{ NULL, NULL, NULL },
};
diff --git a/sys/arm/mv/gpio.c b/sys/arm/mv/gpio.c
index 93c1577..ffcab14 100644
--- a/sys/arm/mv/gpio.c
+++ b/sys/arm/mv/gpio.c
@@ -197,10 +197,7 @@ mv_gpio_attach(device_t dev)
}
}
- /*
- * GPIO lines setup is already done at this stage (see mv_machdep.c).
- */
- return (0);
+ return (platform_gpio_init());
}
static int
@@ -565,20 +562,6 @@ mv_handle_gpios_prop(phandle_t ctrl, pcell_t *gpios, int len)
if (fdt_regsize(ctrl, &gpio_ctrl, &size))
return (ENXIO);
- /*
- * Since to set up GPIO we use the same functions as GPIO driver, and
- * mv_gpio_softc is NULL at this early stage, we need to create a fake
- * softc and set mv_gpio_softc pointer to that newly created object.
- * After successful GPIO setup, the [shared] pointer will be set back
- * to NULL.
- */
- mv_gpio_softc = &sc;
-
- sc.bst = fdtbus_bs_tag;
- gpio_ctrl += fdt_immr_va;
-
- if (bus_space_map(sc.bst, gpio_ctrl, size, 0, &sc.bsh) != 0)
- return (ENXIO);
if (OF_getprop(ctrl, "pin-count", &pincnt, sizeof(pcell_t)) < 0)
return (ENXIO);
@@ -612,8 +595,6 @@ mv_handle_gpios_prop(phandle_t ctrl, pcell_t *gpios, int len)
gpios += gpio_cells + inc;
}
- /* Reset pointer. */
- mv_gpio_softc = NULL;
return (0);
}
diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c
index 771f16c..fdcef9c 100644
--- a/sys/arm/mv/mv_machdep.c
+++ b/sys/arm/mv/mv_machdep.c
@@ -340,6 +340,7 @@ initarm(void *mdp, void *unused __unused)
#endif
}
+ preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
} else {
/* Fall back to hardcoded metadata. */
lastaddr = fake_preload_metadata();
@@ -511,13 +512,8 @@ initarm(void *mdp, void *unused __unused)
if (platform_mpp_init() != 0)
while (1);
- /*
- * Initialize GPIO as early as possible.
- */
- if (platform_gpio_init() != 0)
- while (1);
-
cninit();
+
physmem = memsize / PAGE_SIZE;
debugf("initarm: console initialized\n");
diff --git a/sys/arm/sa11x0/assabet_machdep.c b/sys/arm/sa11x0/assabet_machdep.c
index 87788f0..61c5056 100644
--- a/sys/arm/sa11x0/assabet_machdep.c
+++ b/sys/arm/sa11x0/assabet_machdep.c
@@ -77,7 +77,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm.h>
#include <vm/pmap.h>
-#include <vm/vm.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
diff --git a/sys/arm/sa11x0/sa11x0.c b/sys/arm/sa11x0/sa11x0.c
index bfffe6a..7b83f95 100644
--- a/sys/arm/sa11x0/sa11x0.c
+++ b/sys/arm/sa11x0/sa11x0.c
@@ -58,7 +58,6 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/reboot.h>
#include <sys/malloc.h>
-#include <sys/bus.h>
#include <sys/interrupt.h>
#include <sys/module.h>
#include <sys/rman.h>
@@ -74,7 +73,6 @@ __FBSDID("$FreeBSD$");
#include <arm/sa11x0/sa11x0_dmacreg.h>
#include <arm/sa11x0/sa11x0_ppcreg.h>
#include <arm/sa11x0/sa11x0_gpioreg.h>
-#include <machine/bus.h>
extern void sa11x0_activateirqs(void);
diff --git a/sys/boot/Makefile b/sys/boot/Makefile
index cfc82b9..06cffb1 100644
--- a/sys/boot/Makefile
+++ b/sys/boot/Makefile
@@ -8,10 +8,6 @@
SUBDIR+= ficl
.endif
-.if ${MK_FDT} != "no"
-SUBDIR+= fdt
-.endif
-
# Pick the machine-dependent subdir based on the target architecture.
ADIR= ${MACHINE:S/amd64/i386/:S/powerpc64/powerpc/}
.if exists(${.CURDIR}/${ADIR}/.)
diff --git a/sys/boot/Makefile.amd64 b/sys/boot/Makefile.amd64
index 256201d..b9e1609 100644
--- a/sys/boot/Makefile.amd64
+++ b/sys/boot/Makefile.amd64
@@ -2,3 +2,4 @@
SUBDIR+= efi
SUBDIR+= zfs
+SUBDIR+= userboot
diff --git a/sys/boot/Makefile.arm b/sys/boot/Makefile.arm
index f96104d..46fc574 100644
--- a/sys/boot/Makefile.arm
+++ b/sys/boot/Makefile.arm
@@ -1,3 +1,7 @@
# $FreeBSD$
+.if ${MK_FDT} != "no"
+SUBDIR+= fdt
+.endif
+
SUBDIR+= uboot
diff --git a/sys/boot/Makefile.powerpc b/sys/boot/Makefile.powerpc
index ca8c331..b7660f4 100644
--- a/sys/boot/Makefile.powerpc
+++ b/sys/boot/Makefile.powerpc
@@ -1,4 +1,8 @@
# $FreeBSD$
+.if ${MK_FDT} != "no"
+SUBDIR+= fdt
+.endif
+
SUBDIR+= ofw
SUBDIR+= uboot
diff --git a/sys/boot/common/Makefile.inc b/sys/boot/common/Makefile.inc
index be6c3301..ad9535c 100644
--- a/sys/boot/common/Makefile.inc
+++ b/sys/boot/common/Makefile.inc
@@ -1,6 +1,6 @@
# $FreeBSD$
-SRCS+= boot.c commands.c console.c devopen.c interp.c
+SRCS+= boot.c commands.c console.c devopen.c disk.c interp.c
SRCS+= interp_backslash.c interp_parse.c ls.c misc.c
SRCS+= module.c panic.c
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c
new file mode 100644
index 0000000..e1de382
--- /dev/null
+++ b/sys/boot/common/disk.c
@@ -0,0 +1,799 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * MBR/GPT partitioned disk device handling.
+ *
+ * Ideas and algorithms from:
+ *
+ * - NetBSD libi386/biosdisk.c
+ * - FreeBSD biosboot/disk.c
+ *
+ */
+
+#include <stand.h>
+
+#include <sys/diskmbr.h>
+#include <sys/disklabel.h>
+#include <sys/gpt.h>
+
+#include <stdarg.h>
+#include <uuid.h>
+
+#include <bootstrap.h>
+
+#include "disk.h"
+
+#ifdef DISK_DEBUG
+# define DEBUG(fmt, args...) printf("%s: " fmt "\n" , __func__ , ## args)
+#else
+# define DEBUG(fmt, args...)
+#endif
+
+/*
+ * Search for a slice with the following preferences:
+ *
+ * 1: Active FreeBSD slice
+ * 2: Non-active FreeBSD slice
+ * 3: Active Linux slice
+ * 4: non-active Linux slice
+ * 5: Active FAT/FAT32 slice
+ * 6: non-active FAT/FAT32 slice
+ */
+#define PREF_RAWDISK 0
+#define PREF_FBSD_ACT 1
+#define PREF_FBSD 2
+#define PREF_LINUX_ACT 3
+#define PREF_LINUX 4
+#define PREF_DOS_ACT 5
+#define PREF_DOS 6
+#define PREF_NONE 7
+
+#ifdef LOADER_GPT_SUPPORT
+
+struct gpt_part {
+ int gp_index;
+ uuid_t gp_type;
+ uint64_t gp_start;
+ uint64_t gp_end;
+};
+
+static uuid_t efi = GPT_ENT_TYPE_EFI;
+static uuid_t freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT;
+static uuid_t freebsd_ufs = GPT_ENT_TYPE_FREEBSD_UFS;
+static uuid_t freebsd_swap = GPT_ENT_TYPE_FREEBSD_SWAP;
+static uuid_t freebsd_zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
+static uuid_t ms_basic_data = GPT_ENT_TYPE_MS_BASIC_DATA;
+
+#endif
+
+#if defined(LOADER_GPT_SUPPORT) || defined(LOADER_MBR_SUPPORT)
+
+/* Given a size in 512 byte sectors, convert it to a human-readable number. */
+static char *
+display_size(uint64_t size)
+{
+ static char buf[80];
+ char unit;
+
+ size /= 2;
+ unit = 'K';
+ if (size >= 10485760000LL) {
+ size /= 1073741824;
+ unit = 'T';
+ } else if (size >= 10240000) {
+ size /= 1048576;
+ unit = 'G';
+ } else if (size >= 10000) {
+ size /= 1024;
+ unit = 'M';
+ }
+ sprintf(buf, "%.6ld%cB", (long)size, unit);
+ return (buf);
+}
+
+#endif
+
+#ifdef LOADER_MBR_SUPPORT
+
+static void
+disk_checkextended(struct disk_devdesc *dev,
+ struct dos_partition *slicetab, int slicenum, int *nslicesp)
+{
+ uint8_t buf[DISK_SECSIZE];
+ struct dos_partition *dp;
+ uint32_t base;
+ int rc, i, start, end;
+
+ dp = &slicetab[slicenum];
+ start = *nslicesp;
+
+ if (dp->dp_size == 0)
+ goto done;
+ if (dp->dp_typ != DOSPTYP_EXT)
+ goto done;
+ rc = dev->d_dev->dv_strategy(dev, F_READ, dp->dp_start, DISK_SECSIZE,
+ (char *) buf, NULL);
+ if (rc)
+ goto done;
+ if (buf[0x1fe] != 0x55 || buf[0x1ff] != 0xaa) {
+ DEBUG("no magic in extended table");
+ goto done;
+ }
+ base = dp->dp_start;
+ dp = (struct dos_partition *) &buf[DOSPARTOFF];
+ for (i = 0; i < NDOSPART; i++, dp++) {
+ if (dp->dp_size == 0)
+ continue;
+ if (*nslicesp == NEXTDOSPART)
+ goto done;
+ dp->dp_start += base;
+ bcopy(dp, &slicetab[*nslicesp], sizeof(*dp));
+ (*nslicesp)++;
+ }
+ end = *nslicesp;
+
+ /*
+ * now, recursively check the slices we just added
+ */
+ for (i = start; i < end; i++)
+ disk_checkextended(dev, slicetab, i, nslicesp);
+done:
+ return;
+}
+
+static int
+disk_readslicetab(struct disk_devdesc *dev,
+ struct dos_partition **slicetabp, int *nslicesp)
+{
+ struct dos_partition *slicetab = NULL;
+ int nslices, i;
+ int rc;
+ uint8_t buf[DISK_SECSIZE];
+
+ /*
+ * Find the slice in the DOS slice table.
+ */
+ rc = dev->d_dev->dv_strategy(dev, F_READ, 0, DISK_SECSIZE,
+ (char *) buf, NULL);
+ if (rc) {
+ DEBUG("error reading MBR");
+ return (rc);
+ }
+
+ /*
+ * Check the slice table magic.
+ */
+ if (buf[0x1fe] != 0x55 || buf[0x1ff] != 0xaa) {
+ DEBUG("no slice table/MBR (no magic)");
+ return (rc);
+ }
+
+ /*
+ * copy the partition table, then pick up any extended partitions.
+ */
+ slicetab = malloc(NEXTDOSPART * sizeof(struct dos_partition));
+ bcopy(buf + DOSPARTOFF, slicetab,
+ sizeof(struct dos_partition) * NDOSPART);
+ nslices = NDOSPART; /* extended slices start here */
+ for (i = 0; i < NDOSPART; i++)
+ disk_checkextended(dev, slicetab, i, &nslices);
+
+ *slicetabp = slicetab;
+ *nslicesp = nslices;
+ return (0);
+}
+
+/*
+ * Search for the best MBR slice (typically the first FreeBSD slice).
+ */
+static int
+disk_bestslice(struct dos_partition *slicetab, int nslices)
+{
+ struct dos_partition *dp;
+ int pref, preflevel;
+ int i, prefslice;
+
+ prefslice = 0;
+ preflevel = PREF_NONE;
+
+ dp = &slicetab[0];
+ for (i = 0; i < nslices; i++, dp++) {
+ switch (dp->dp_typ) {
+ case DOSPTYP_386BSD: /* FreeBSD */
+ pref = dp->dp_flag & 0x80 ? PREF_FBSD_ACT : PREF_FBSD;
+ break;
+
+ case DOSPTYP_LINUX:
+ pref = dp->dp_flag & 0x80 ? PREF_LINUX_ACT : PREF_LINUX;
+ break;
+
+ case 0x01: /* DOS/Windows */
+ case 0x04:
+ case 0x06:
+ case 0x0b:
+ case 0x0c:
+ case 0x0e:
+ pref = dp->dp_flag & 0x80 ? PREF_DOS_ACT : PREF_DOS;
+ break;
+
+ default:
+ pref = PREF_NONE;
+ }
+ if (pref < preflevel) {
+ preflevel = pref;
+ prefslice = i + 1;
+ }
+ }
+ return (prefslice);
+}
+
+static int
+disk_openmbr(struct disk_devdesc *dev)
+{
+ struct dos_partition *slicetab = NULL, *dptr;
+ int nslices, sector, slice;
+ int rc;
+ uint8_t buf[DISK_SECSIZE];
+ struct disklabel *lp;
+
+ /*
+ * Following calculations attempt to determine the correct value
+ * for dev->d_offset by looking for the slice and partition specified,
+ * or searching for reasonable defaults.
+ */
+ rc = disk_readslicetab(dev, &slicetab, &nslices);
+ if (rc)
+ return (rc);
+
+ /*
+ * if a slice number was supplied but not found, this is an error.
+ */
+ if (dev->d_slice > 0) {
+ slice = dev->d_slice - 1;
+ if (slice >= nslices) {
+ DEBUG("slice %d not found", slice);
+ rc = EPART;
+ goto out;
+ }
+ }
+
+ /*
+ * Check for the historically bogus MBR found on true dedicated disks
+ */
+ if (slicetab[3].dp_typ == DOSPTYP_386BSD &&
+ slicetab[3].dp_start == 0 && slicetab[3].dp_size == 50000) {
+ sector = 0;
+ goto unsliced;
+ }
+
+ /*
+ * Try to auto-detect the best slice; this should always give
+ * a slice number
+ */
+ if (dev->d_slice == 0) {
+ slice = disk_bestslice(slicetab, nslices);
+ if (slice == -1) {
+ rc = ENOENT;
+ goto out;
+ }
+ dev->d_slice = slice;
+ }
+
+ /*
+ * Accept the supplied slice number unequivocally (we may be looking
+ * at a DOS partition).
+ * Note: we number 1-4, offsets are 0-3
+ */
+ dptr = &slicetab[dev->d_slice - 1];
+ sector = dptr->dp_start;
+ DEBUG("slice entry %d at %d, %d sectors",
+ dev->d_slice - 1, sector, dptr->dp_size);
+
+unsliced:
+ /*
+ * Now we have the slice offset, look for the partition in the
+ * disklabel if we have a partition to start with.
+ *
+ * XXX we might want to check the label checksum.
+ */
+ if (dev->d_partition < 0) {
+ /* no partition, must be after the slice */
+ DEBUG("opening raw slice");
+ dev->d_offset = sector;
+ rc = 0;
+ goto out;
+ }
+
+ rc = dev->d_dev->dv_strategy(dev, F_READ, sector + LABELSECTOR,
+ DISK_SECSIZE, (char *) buf, NULL);
+ if (rc) {
+ DEBUG("error reading disklabel");
+ goto out;
+ }
+
+ lp = (struct disklabel *) buf;
+
+ if (lp->d_magic != DISKMAGIC) {
+ DEBUG("no disklabel");
+ rc = ENOENT;
+ goto out;
+ }
+ if (dev->d_partition >= lp->d_npartitions) {
+ DEBUG("partition '%c' exceeds partitions in table (a-'%c')",
+ 'a' + dev->d_partition,
+ 'a' + lp->d_npartitions);
+ rc = EPART;
+ goto out;
+ }
+
+ dev->d_offset =
+ lp->d_partitions[dev->d_partition].p_offset -
+ lp->d_partitions[RAW_PART].p_offset +
+ sector;
+ rc = 0;
+
+out:
+ if (slicetab)
+ free(slicetab);
+ return (rc);
+}
+
+/*
+ * Print out each valid partition in the disklabel of a FreeBSD slice.
+ * For size calculations, we assume a 512 byte sector size.
+ */
+static void
+disk_printbsdslice(struct disk_devdesc *dev, daddr_t offset,
+ char *prefix, int verbose)
+{
+ char line[80];
+ char buf[DISK_SECSIZE];
+ struct disklabel *lp;
+ int i, rc, fstype;
+
+ /* read disklabel */
+ rc = dev->d_dev->dv_strategy(dev, F_READ, offset + LABELSECTOR,
+ DISK_SECSIZE, (char *) buf, NULL);
+ if (rc)
+ return;
+ lp =(struct disklabel *)(&buf[0]);
+ if (lp->d_magic != DISKMAGIC) {
+ sprintf(line, "%s: FFS bad disklabel\n", prefix);
+ pager_output(line);
+ return;
+ }
+
+ /* Print partitions */
+ for (i = 0; i < lp->d_npartitions; i++) {
+ /*
+ * For each partition, make sure we know what type of fs it
+ * is. If not, then skip it.
+ */
+ fstype = lp->d_partitions[i].p_fstype;
+ if (fstype != FS_BSDFFS &&
+ fstype != FS_SWAP &&
+ fstype != FS_VINUM)
+ continue;
+
+ /* Only print out statistics in verbose mode */
+ if (verbose)
+ sprintf(line, " %s%c: %s %s (%d - %d)\n",
+ prefix, 'a' + i,
+ (fstype == FS_SWAP) ? "swap " :
+ (fstype == FS_VINUM) ? "vinum" :
+ "FFS ",
+ display_size(lp->d_partitions[i].p_size),
+ lp->d_partitions[i].p_offset,
+ (lp->d_partitions[i].p_offset
+ + lp->d_partitions[i].p_size));
+ else
+ sprintf(line, " %s%c: %s\n", prefix, 'a' + i,
+ (fstype == FS_SWAP) ? "swap" :
+ (fstype == FS_VINUM) ? "vinum" :
+ "FFS");
+ pager_output(line);
+ }
+}
+
+static void
+disk_printslice(struct disk_devdesc *dev, int slice,
+ struct dos_partition *dp, char *prefix, int verbose)
+{
+ char stats[80];
+ char line[80];
+
+ if (verbose)
+ sprintf(stats, " %s (%d - %d)", display_size(dp->dp_size),
+ dp->dp_start, dp->dp_start + dp->dp_size);
+ else
+ stats[0] = '\0';
+
+ switch (dp->dp_typ) {
+ case DOSPTYP_386BSD:
+ disk_printbsdslice(dev, (daddr_t)dp->dp_start,
+ prefix, verbose);
+ return;
+ case DOSPTYP_LINSWP:
+ sprintf(line, "%s: Linux swap%s\n", prefix, stats);
+ break;
+ case DOSPTYP_LINUX:
+ /*
+ * XXX
+ * read the superblock to confirm this is an ext2fs partition?
+ */
+ sprintf(line, "%s: ext2fs%s\n", prefix, stats);
+ break;
+ case 0x00: /* unused partition */
+ case DOSPTYP_EXT:
+ return;
+ case 0x01:
+ sprintf(line, "%s: FAT-12%s\n", prefix, stats);
+ break;
+ case 0x04:
+ case 0x06:
+ case 0x0e:
+ sprintf(line, "%s: FAT-16%s\n", prefix, stats);
+ break;
+ case 0x07:
+ sprintf(line, "%s: NTFS/HPFS%s\n", prefix, stats);
+ break;
+ case 0x0b:
+ case 0x0c:
+ sprintf(line, "%s: FAT-32%s\n", prefix, stats);
+ break;
+ default:
+ sprintf(line, "%s: Unknown fs: 0x%x %s\n", prefix, dp->dp_typ,
+ stats);
+ }
+ pager_output(line);
+}
+
+static int
+disk_printmbr(struct disk_devdesc *dev, char *prefix, int verbose)
+{
+ struct dos_partition *slicetab;
+ int nslices, i;
+ int rc;
+ char line[80];
+
+ rc = disk_readslicetab(dev, &slicetab, &nslices);
+ if (rc)
+ return (rc);
+ for (i = 0; i < nslices; i++) {
+ sprintf(line, "%ss%d", prefix, i + 1);
+ disk_printslice(dev, i, &slicetab[i], line, verbose);
+ }
+ free(slicetab);
+ return (0);
+}
+
+#endif
+
+#ifdef LOADER_GPT_SUPPORT
+
+static int
+disk_readgpt(struct disk_devdesc *dev, struct gpt_part **gptp, int *ngptp)
+{
+ struct dos_partition *dp;
+ struct gpt_hdr *hdr;
+ struct gpt_ent *ent;
+ struct gpt_part *gptab = NULL;
+ int entries_per_sec, rc, i, part;
+ daddr_t lba, elba;
+ uint8_t gpt[DISK_SECSIZE], tbl[DISK_SECSIZE];
+
+ /*
+ * Following calculations attempt to determine the correct value
+ * for dev->d_offset by looking for the slice and partition specified,
+ * or searching for reasonable defaults.
+ */
+ rc = 0;
+
+ /* First, read the MBR and see if we have a PMBR. */
+ rc = dev->d_dev->dv_strategy(dev, F_READ, 0, DISK_SECSIZE,
+ (char *) tbl, NULL);
+ if (rc) {
+ DEBUG("error reading MBR");
+ return (EIO);
+ }
+
+ /* Check the slice table magic. */
+ if (tbl[0x1fe] != 0x55 || tbl[0x1ff] != 0xaa)
+ return (ENXIO);
+
+ /* Check for GPT slice. */
+ part = 0;
+ dp = (struct dos_partition *)(tbl + DOSPARTOFF);
+ for (i = 0; i < NDOSPART; i++) {
+ if (dp[i].dp_typ == 0xee)
+ part++;
+ else if ((part != 1) && (dp[i].dp_typ != 0x00))
+ return (EINVAL);
+ }
+ if (part != 1)
+ return (EINVAL);
+
+ /* Read primary GPT table header. */
+ rc = dev->d_dev->dv_strategy(dev, F_READ, 1, DISK_SECSIZE,
+ (char *) gpt, NULL);
+ if (rc) {
+ DEBUG("error reading GPT header");
+ return (EIO);
+ }
+ hdr = (struct gpt_hdr *)gpt;
+ if (bcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)) != 0 ||
+ hdr->hdr_lba_self != 1 || hdr->hdr_revision < 0x00010000 ||
+ hdr->hdr_entsz < sizeof(*ent) ||
+ DISK_SECSIZE % hdr->hdr_entsz != 0) {
+ DEBUG("Invalid GPT header\n");
+ return (EINVAL);
+ }
+
+ /* Walk the partition table to count valid partitions. */
+ part = 0;
+ entries_per_sec = DISK_SECSIZE / hdr->hdr_entsz;
+ elba = hdr->hdr_lba_table + hdr->hdr_entries / entries_per_sec;
+ for (lba = hdr->hdr_lba_table; lba < elba; lba++) {
+ rc = dev->d_dev->dv_strategy(dev, F_READ, lba, DISK_SECSIZE,
+ (char *) tbl, NULL);
+ if (rc) {
+ DEBUG("error reading GPT table");
+ return (EIO);
+ }
+ for (i = 0; i < entries_per_sec; i++) {
+ ent = (struct gpt_ent *)(tbl + i * hdr->hdr_entsz);
+ if (uuid_is_nil(&ent->ent_type, NULL) ||
+ ent->ent_lba_start == 0 ||
+ ent->ent_lba_end < ent->ent_lba_start)
+ continue;
+ part++;
+ }
+ }
+
+ /* Save the important information about all the valid partitions. */
+ if (part != 0) {
+ gptab = malloc(part * sizeof(struct gpt_part));
+ part = 0;
+ for (lba = hdr->hdr_lba_table; lba < elba; lba++) {
+ rc = dev->d_dev->dv_strategy(dev, F_READ, lba, DISK_SECSIZE,
+ (char *) tbl, NULL);
+ if (rc) {
+ DEBUG("error reading GPT table");
+ free(gptab);
+ return (EIO);
+ }
+ for (i = 0; i < entries_per_sec; i++) {
+ ent = (struct gpt_ent *)(tbl + i * hdr->hdr_entsz);
+ if (uuid_is_nil(&ent->ent_type, NULL) ||
+ ent->ent_lba_start == 0 ||
+ ent->ent_lba_end < ent->ent_lba_start)
+ continue;
+ gptab[part].gp_index = (lba - hdr->hdr_lba_table) *
+ entries_per_sec + i + 1;
+ gptab[part].gp_type = ent->ent_type;
+ gptab[part].gp_start = ent->ent_lba_start;
+ gptab[part].gp_end = ent->ent_lba_end;
+ part++;
+ }
+ }
+ }
+
+ *gptp = gptab;
+ *ngptp = part;
+ return (0);
+}
+
+static struct gpt_part *
+disk_bestgpt(struct gpt_part *gpt, int ngpt)
+{
+ struct gpt_part *gp, *prefpart;
+ int i, pref, preflevel;
+
+ prefpart = NULL;
+ preflevel = PREF_NONE;
+
+ gp = gpt;
+ for (i = 0; i < ngpt; i++, gp++) {
+ /* Windows. XXX: Also Linux. */
+ if (uuid_equal(&gp->gp_type, &ms_basic_data, NULL))
+ pref = PREF_DOS;
+ /* FreeBSD */
+ else if (uuid_equal(&gp->gp_type, &freebsd_ufs, NULL) ||
+ uuid_equal(&gp->gp_type, &freebsd_zfs, NULL))
+ pref = PREF_FBSD;
+ else
+ pref = PREF_NONE;
+ if (pref < preflevel) {
+ preflevel = pref;
+ prefpart = gp;
+ }
+ }
+ return (prefpart);
+}
+
+static int
+disk_opengpt(struct disk_devdesc *dev)
+{
+ struct gpt_part *gpt = NULL, *gp;
+ int rc, ngpt, i;
+
+ rc = disk_readgpt(dev, &gpt, &ngpt);
+ if (rc)
+ return (rc);
+
+ /* Is this a request for the whole disk? */
+ if (dev->d_slice < 0) {
+ dev->d_offset = 0;
+ rc = 0;
+ goto out;
+ }
+
+ /*
+ * If a partition number was supplied, then the user is trying to use
+ * an MBR address rather than a GPT address, so fail.
+ */
+ if (dev->d_partition != 0xff) {
+ rc = ENOENT;
+ goto out;
+ }
+
+ /* If a slice number was supplied but not found, this is an error. */
+ gp = NULL;
+ if (dev->d_slice > 0) {
+ for (i = 0; i < ngpt; i++) {
+ if (gpt[i].gp_index == dev->d_slice) {
+ gp = &gpt[i];
+ break;
+ }
+ }
+ if (gp == NULL) {
+ DEBUG("partition %d not found", dev->d_slice);
+ rc = ENOENT;
+ goto out;
+ }
+ }
+
+ /* Try to auto-detect the best partition. */
+ if (dev->d_slice == 0) {
+ gp = disk_bestgpt(gpt, ngpt);
+ if (gp == NULL) {
+ rc = ENOENT;
+ goto out;
+ }
+ dev->d_slice = gp->gp_index;
+ }
+
+ dev->d_offset = gp->gp_start;
+ rc = 0;
+
+out:
+ if (gpt)
+ free(gpt);
+ return (rc);
+}
+
+static void
+disk_printgptpart(struct disk_devdesc *dev, struct gpt_part *gp,
+ char *prefix, int verbose)
+{
+ char stats[80];
+ char line[96];
+
+ if (verbose)
+ sprintf(stats, " %s",
+ display_size(gp->gp_end + 1 - gp->gp_start));
+ else
+ stats[0] = '\0';
+
+ if (uuid_equal(&gp->gp_type, &efi, NULL))
+ sprintf(line, "%s: EFI %s\n", prefix, stats);
+ else if (uuid_equal(&gp->gp_type, &ms_basic_data, NULL))
+ sprintf(line, "%s: FAT/NTFS %s\n", prefix, stats);
+ else if (uuid_equal(&gp->gp_type, &freebsd_boot, NULL))
+ sprintf(line, "%s: FreeBSD boot%s\n", prefix, stats);
+ else if (uuid_equal(&gp->gp_type, &freebsd_ufs, NULL))
+ sprintf(line, "%s: FreeBSD UFS %s\n", prefix, stats);
+ else if (uuid_equal(&gp->gp_type, &freebsd_zfs, NULL))
+ sprintf(line, "%s: FreeBSD ZFS %s\n", prefix, stats);
+ else if (uuid_equal(&gp->gp_type, &freebsd_swap, NULL))
+ sprintf(line, "%s: FreeBSD swap%s\n", prefix, stats);
+ else
+ sprintf(line,
+ "%s: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x%s\n",
+ prefix,
+ gp->gp_type.time_low, gp->gp_type.time_mid,
+ gp->gp_type.time_hi_and_version,
+ gp->gp_type.clock_seq_hi_and_reserved,
+ gp->gp_type.clock_seq_low,
+ gp->gp_type.node[0],
+ gp->gp_type.node[1],
+ gp->gp_type.node[2],
+ gp->gp_type.node[3],
+ gp->gp_type.node[4],
+ gp->gp_type.node[5],
+ stats);
+ pager_output(line);
+}
+
+static int
+disk_printgpt(struct disk_devdesc *dev, char *prefix, int verbose)
+{
+ struct gpt_part *gpt = NULL;
+ int rc, ngpt, i;
+ char line[80];
+
+ rc = disk_readgpt(dev, &gpt, &ngpt);
+ if (rc)
+ return (rc);
+ for (i = 0; i < ngpt; i++) {
+ sprintf(line, "%sp%d", prefix, i + 1);
+ disk_printgptpart(dev, &gpt[i], line, verbose);
+ }
+ free(gpt);
+ return (0);
+}
+
+#endif
+
+int
+disk_open(struct disk_devdesc *dev)
+{
+ int rc;
+
+ rc = 0;
+ /*
+ * While we are reading disk metadata, make sure we do it relative
+ * to the start of the disk
+ */
+ dev->d_offset = 0;
+
+#ifdef LOADER_GPT_SUPPORT
+ rc = disk_opengpt(dev);
+ if (rc)
+#endif
+#ifdef LOADER_MBR_SUPPORT
+ rc = disk_openmbr(dev);
+#endif
+
+ return (rc);
+}
+
+void
+disk_print(struct disk_devdesc *dev, char *prefix, int verbose)
+{
+
+#ifdef LOADER_GPT_SUPPORT
+ if (disk_printgpt(dev, prefix, verbose) == 0)
+ return;
+#endif
+#ifdef LOADER_MBR_SUPPORT
+ disk_printmbr(dev, prefix, verbose);
+#endif
+}
diff --git a/sys/boot/common/disk.h b/sys/boot/common/disk.h
new file mode 100644
index 0000000..0fc7e91
--- /dev/null
+++ b/sys/boot/common/disk.h
@@ -0,0 +1,99 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * Device descriptor for partitioned disks. We assume that all disk addresses
+ * are 512 byte block offsets from the start of the disk. To use, set the
+ * d_slice and d_partition variables as follows:
+ *
+ * Whole disk access:
+ *
+ * d_slice = -1
+ * d_partition = -1
+ *
+ * Whole MBR slice:
+ *
+ * d_slice = MBR slice number (typically 1..4)
+ * d_partition = -1
+ *
+ * BSD disklabel partition within an MBR slice:
+ *
+ * d_slice = MBR slice number (typically 1..4)
+ * d_partition = disklabel partition (typically 0..7)
+ *
+ * GPT partition:
+ *
+ * d_slice = GPT partition number (typically 1..N)
+ * d_partition = 255
+ *
+ * For both MBR and GPT, to automatically find the 'best' slice or partition,
+ * set d_slice to zero. This uses the partition type to decide which partition
+ * to use according to the following list of preferences:
+ *
+ * FreeBSD (active)
+ * FreeBSD (inactive)
+ * Linux (active)
+ * Linux (inactive)
+ * DOS/Windows (active)
+ * DOS/Windows (inactive)
+ *
+ * Active MBR slices (marked as bootable) are preferred over inactive. GPT
+ * doesn't have the concept of active/inactive partitions. In both MBR and GPT,
+ * if there are multiple slices/partitions of a given type, the first one
+ * is chosen.
+ *
+ * The low-level disk device will typically call slice_open() from its open
+ * method to interpret the disk partition tables according to the rules above.
+ * This will initialize d_offset to the block offset of the start of the
+ * selected partition - this offset should be added to the offset passed to
+ * the device's strategy method.
+ */
+
+#define DISK_SECSIZE 512
+
+struct disk_devdesc
+{
+ struct devsw *d_dev;
+ int d_type;
+ int d_unit;
+ void *d_opendata;
+ int d_slice;
+ int d_partition;
+ int d_offset;
+};
+
+/*
+ * Parse disk metadata and initialise dev->d_offset.
+ */
+extern int disk_open(struct disk_devdesc * dev);
+
+/*
+ * Print information about slices on a disk. For the size calculations we
+ * assume a 512 byte sector.
+ */
+extern void disk_print(struct disk_devdesc *dev, char *prefix, int verbose);
diff --git a/sys/boot/common/load_elf.c b/sys/boot/common/load_elf.c
index ee6389f..bf095bb 100644
--- a/sys/boot/common/load_elf.c
+++ b/sys/boot/common/load_elf.c
@@ -260,7 +260,7 @@ __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
firstaddr = lastaddr = 0;
ehdr = ef->ehdr;
if (ef->kernel) {
-#ifdef __i386__
+#if defined(__i386__) || defined(__amd64__)
#if __ELF_WORD_SIZE == 64
off = - (off & 0xffffffffff000000ull);/* x86_64 relocates after locore */
#else
diff --git a/sys/boot/common/load_elf_obj.c b/sys/boot/common/load_elf_obj.c
index dcd71ef..54d9b10 100644
--- a/sys/boot/common/load_elf_obj.c
+++ b/sys/boot/common/load_elf_obj.c
@@ -196,7 +196,7 @@ static int
__elfN(obj_loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
{
Elf_Ehdr *hdr;
- Elf_Shdr *shdr;
+ Elf_Shdr *shdr, *cshdr, *lshdr;
vm_offset_t firstaddr, lastaddr;
int i, nsym, res, ret, shdrbytes, symstrindex;
@@ -294,12 +294,35 @@ __elfN(obj_loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
/* Clear the whole area, including bss regions. */
kern_bzero(firstaddr, lastaddr - firstaddr);
- /* Now read it all in. */
- for (i = 0; i < hdr->e_shnum; i++) {
- if (shdr[i].sh_addr == 0 || shdr[i].sh_type == SHT_NOBITS)
- continue;
- if (kern_pread(ef->fd, (vm_offset_t)shdr[i].sh_addr,
- shdr[i].sh_size, (off_t)shdr[i].sh_offset) != 0) {
+ /* Figure section with the lowest file offset we haven't loaded yet. */
+ for (cshdr = NULL; /* none */; /* none */)
+ {
+ /*
+ * Find next section to load. The complexity of this loop is
+ * O(n^2), but with the number of sections being typically
+ * small, we do not care.
+ */
+ lshdr = cshdr;
+
+ for (i = 0; i < hdr->e_shnum; i++) {
+ if (shdr[i].sh_addr == 0 ||
+ shdr[i].sh_type == SHT_NOBITS)
+ continue;
+ /* Skip sections that were loaded already. */
+ if (lshdr != NULL &&
+ lshdr->sh_offset >= shdr[i].sh_offset)
+ continue;
+ /* Find section with smallest offset. */
+ if (cshdr == lshdr ||
+ cshdr->sh_offset > shdr[i].sh_offset)
+ cshdr = &shdr[i];
+ }
+
+ if (cshdr == lshdr)
+ break;
+
+ if (kern_pread(ef->fd, (vm_offset_t)cshdr->sh_addr,
+ cshdr->sh_size, (off_t)cshdr->sh_offset) != 0) {
printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
"_obj_loadimage: read failed\n");
goto out;
diff --git a/sys/boot/common/reloc_elf.c b/sys/boot/common/reloc_elf.c
index 43b7cbf..b614091 100644
--- a/sys/boot/common/reloc_elf.c
+++ b/sys/boot/common/reloc_elf.c
@@ -78,7 +78,7 @@ __elfN(reloc)(struct elf_file *ef, symaddr_fn *symaddr, const void *reldata,
}
return (0);
-#elif defined(__i386__) && __ELF_WORD_SIZE == 64
+#elif (defined(__i386__) || defined(__amd64__)) && __ELF_WORD_SIZE == 64
Elf64_Addr *where, val;
Elf_Addr addend, addr;
Elf_Size rtype, symidx;
diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c
index 2724d7c..b767732 100644
--- a/sys/boot/common/ufsread.c
+++ b/sys/boot/common/ufsread.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ffs/fs.h>
+
#ifdef UFS_SMALL_CGBASE
/* XXX: Revert to old (broken for over 1.5Tb filesystems) version of cgbase
(see sys/ufs/ffs/fs.h rev 1.39) so that small boot loaders (e.g. boot2) can
@@ -90,7 +91,7 @@ static ssize_t fsread(ino_t, void *, size_t);
static uint8_t ls, dsk_meta;
static uint32_t fs_off;
-static __inline int
+static __inline uint8_t
fsfind(const char *name, ino_t * ino)
{
char buf[DEV_BSIZE];
@@ -158,7 +159,7 @@ static int sblock_try[] = SBLOCKSEARCH;
#elif defined(UFS1_ONLY)
#define DIP(field) dp1.field
#else
-#define DIP(field) fs->fs_magic == FS_UFS1_MAGIC ? dp1.field : dp2.field
+#define DIP(field) fs.fs_magic == FS_UFS1_MAGIC ? dp1.field : dp2.field
#endif
static ssize_t
@@ -173,7 +174,7 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static ino_t inomap;
char *blkbuf;
void *indbuf;
- struct fs *fs;
+ struct fs fs;
char *s;
size_t n, nb, size, off, vboff;
ufs_lbn_t lbn;
@@ -181,30 +182,29 @@ fsread(ino_t inode, void *buf, size_t nbyte)
static ufs2_daddr_t blkmap, indmap;
u_int u;
-
blkbuf = dmadat->blkbuf;
indbuf = dmadat->indbuf;
- fs = (struct fs *)dmadat->sbbuf;
if (!dsk_meta) {
inomap = 0;
for (n = 0; sblock_try[n] != -1; n++) {
- if (dskread(fs, sblock_try[n] / DEV_BSIZE,
+ if (dskread(dmadat->sbbuf, sblock_try[n] / DEV_BSIZE,
SBLOCKSIZE / DEV_BSIZE))
return -1;
+ memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
if ((
#if defined(UFS1_ONLY)
- fs->fs_magic == FS_UFS1_MAGIC
+ fs.fs_magic == FS_UFS1_MAGIC
#elif defined(UFS2_ONLY)
- (fs->fs_magic == FS_UFS2_MAGIC &&
- fs->fs_sblockloc == sblock_try[n])
+ (fs.fs_magic == FS_UFS2_MAGIC &&
+ fs.fs_sblockloc == sblock_try[n])
#else
- fs->fs_magic == FS_UFS1_MAGIC ||
- (fs->fs_magic == FS_UFS2_MAGIC &&
- fs->fs_sblockloc == sblock_try[n])
+ fs.fs_magic == FS_UFS1_MAGIC ||
+ (fs.fs_magic == FS_UFS2_MAGIC &&
+ fs.fs_sblockloc == sblock_try[n])
#endif
) &&
- fs->fs_bsize <= MAXBSIZE &&
- fs->fs_bsize >= sizeof(struct fs))
+ fs.fs_bsize <= MAXBSIZE &&
+ fs.fs_bsize >= sizeof(struct fs))
break;
}
if (sblock_try[n] == -1) {
@@ -212,12 +212,13 @@ fsread(ino_t inode, void *buf, size_t nbyte)
return -1;
}
dsk_meta++;
- }
+ } else
+ memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
if (!inode)
return 0;
if (inomap != inode) {
- n = IPERVBLK(fs);
- if (dskread(blkbuf, INO_TO_VBA(fs, n, inode), DBPERVBLK))
+ n = IPERVBLK(&fs);
+ if (dskread(blkbuf, INO_TO_VBA(&fs, n, inode), DBPERVBLK))
return -1;
n = INO_TO_VBO(n, inode);
#if defined(UFS1_ONLY)
@@ -227,13 +228,12 @@ fsread(ino_t inode, void *buf, size_t nbyte)
memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
sizeof(struct ufs2_dinode));
#else
- if (fs->fs_magic == FS_UFS1_MAGIC)
+ if (fs.fs_magic == FS_UFS1_MAGIC)
memcpy(&dp1, (struct ufs1_dinode *)blkbuf + n,
sizeof(struct ufs1_dinode));
else
memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
sizeof(struct ufs2_dinode));
-
#endif
inomap = inode;
fs_off = 0;
@@ -246,15 +246,15 @@ fsread(ino_t inode, void *buf, size_t nbyte)
nbyte = n;
nb = nbyte;
while (nb) {
- lbn = lblkno(fs, fs_off);
- off = blkoff(fs, fs_off);
+ lbn = lblkno(&fs, fs_off);
+ off = blkoff(&fs, fs_off);
if (lbn < NDADDR) {
addr = DIP(di_db[lbn]);
- } else if (lbn < NDADDR + NINDIR(fs)) {
- n = INDIRPERVBLK(fs);
+ } else if (lbn < NDADDR + NINDIR(&fs)) {
+ n = INDIRPERVBLK(&fs);
addr = DIP(di_ib[0]);
u = (u_int)(lbn - NDADDR) / n * DBPERVBLK;
- vbaddr = fsbtodb(fs, addr) + u;
+ vbaddr = fsbtodb(&fs, addr) + u;
if (indmap != vbaddr) {
if (dskread(indbuf, vbaddr, DBPERVBLK))
return -1;
@@ -262,21 +262,25 @@ fsread(ino_t inode, void *buf, size_t nbyte)
}
n = (lbn - NDADDR) & (n - 1);
#if defined(UFS1_ONLY)
- addr = ((ufs1_daddr_t *)indbuf)[n];
+ memcpy(&addr, (ufs1_daddr_t *)indbuf + n,
+ sizeof(ufs1_daddr_t));
#elif defined(UFS2_ONLY)
- addr = ((ufs2_daddr_t *)indbuf)[n];
+ memcpy(&addr, (ufs2_daddr_t *)indbuf + n,
+ sizeof(ufs2_daddr_t));
#else
- if (fs->fs_magic == FS_UFS1_MAGIC)
- addr = ((ufs1_daddr_t *)indbuf)[n];
+ if (fs.fs_magic == FS_UFS1_MAGIC)
+ memcpy(&addr, (ufs1_daddr_t *)indbuf + n,
+ sizeof(ufs1_daddr_t));
else
- addr = ((ufs2_daddr_t *)indbuf)[n];
+ memcpy(&addr, (ufs2_daddr_t *)indbuf + n,
+ sizeof(ufs2_daddr_t));
#endif
} else {
return -1;
}
- vbaddr = fsbtodb(fs, addr) + (off >> VBLKSHIFT) * DBPERVBLK;
+ vbaddr = fsbtodb(&fs, addr) + (off >> VBLKSHIFT) * DBPERVBLK;
vboff = off & VBLKMASK;
- n = sblksize(fs, size, lbn) - (off & ~VBLKMASK);
+ n = sblksize(&fs, size, lbn) - (off & ~VBLKMASK);
if (n > VBLKSIZE)
n = VBLKSIZE;
if (blkmap != vbaddr) {
diff --git a/sys/boot/ficl/amd64/sysdep.c b/sys/boot/ficl/amd64/sysdep.c
new file mode 100644
index 0000000..00b0d4a
--- /dev/null
+++ b/sys/boot/ficl/amd64/sysdep.c
@@ -0,0 +1,101 @@
+/*******************************************************************
+** s y s d e p . c
+** Forth Inspired Command Language
+** Author: John Sadler (john_sadler@alum.mit.edu)
+** Created: 16 Oct 1997
+** Implementations of FICL external interface functions...
+**
+*******************************************************************/
+
+/* $FreeBSD$ */
+
+#ifdef TESTMAIN
+#include <stdio.h>
+#include <stdlib.h>
+#else
+#include <stand.h>
+#endif
+#include "ficl.h"
+
+/*
+******************* FreeBSD P O R T B E G I N S H E R E ******************** Michael Smith
+*/
+
+#if PORTABLE_LONGMULDIV == 0
+DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
+{
+ DPUNS q;
+ u_int64_t qx;
+
+ qx = (u_int64_t)x * (u_int64_t) y;
+
+ q.hi = (u_int32_t)( qx >> 32 );
+ q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
+
+ return q;
+}
+
+UNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
+{
+ UNSQR result;
+ u_int64_t qx, qh;
+
+ qh = q.hi;
+ qx = (qh << 32) | q.lo;
+
+ result.quot = qx / y;
+ result.rem = qx % y;
+
+ return result;
+}
+#endif
+
+void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
+{
+ IGNORE(pVM);
+
+ while(*msg != 0)
+ putchar(*(msg++));
+ if (fNewline)
+ putchar('\n');
+
+ return;
+}
+
+void *ficlMalloc (size_t size)
+{
+ return malloc(size);
+}
+
+void *ficlRealloc (void *p, size_t size)
+{
+ return realloc(p, size);
+}
+
+void ficlFree (void *p)
+{
+ free(p);
+}
+
+
+/*
+** Stub function for dictionary access control - does nothing
+** by default, user can redefine to guarantee exclusive dict
+** access to a single thread for updates. All dict update code
+** is guaranteed to be bracketed as follows:
+** ficlLockDictionary(TRUE);
+** <code that updates dictionary>
+** ficlLockDictionary(FALSE);
+**
+** Returns zero if successful, nonzero if unable to acquire lock
+** befor timeout (optional - could also block forever)
+*/
+#if FICL_MULTITHREAD
+int ficlLockDictionary(short fLock)
+{
+ IGNORE(fLock);
+ return 0;
+}
+#endif /* FICL_MULTITHREAD */
+
+
diff --git a/sys/boot/ficl/amd64/sysdep.h b/sys/boot/ficl/amd64/sysdep.h
new file mode 100644
index 0000000..08bc0e1
--- /dev/null
+++ b/sys/boot/ficl/amd64/sysdep.h
@@ -0,0 +1,434 @@
+/*******************************************************************
+ s y s d e p . h
+** Forth Inspired Command Language
+** Author: John Sadler (john_sadler@alum.mit.edu)
+** Created: 16 Oct 1997
+** Ficl system dependent types and prototypes...
+**
+** Note: Ficl also depends on the use of "assert" when
+** FICL_ROBUST is enabled. This may require some consideration
+** in firmware systems since assert often
+** assumes stderr/stdout.
+** $Id: sysdep.h,v 1.11 2001/12/05 07:21:34 jsadler Exp $
+*******************************************************************/
+/*
+** Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu)
+** All rights reserved.
+**
+** Get the latest Ficl release at http://ficl.sourceforge.net
+**
+** I am interested in hearing from anyone who uses ficl. If you have
+** a problem, a success story, a defect, an enhancement request, or
+** if you would like to contribute to the ficl release, please
+** contact me by email at the address above.
+**
+** L I C E N S E and D I S C L A I M E R
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions
+** are met:
+** 1. Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** 2. Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in the
+** documentation and/or other materials provided with the distribution.
+**
+** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** $Id: sysdep.h,v 1.6 2001-04-26 21:41:55-07 jsadler Exp jsadler $
+*/
+
+/* $FreeBSD$ */
+
+#if !defined (__SYSDEP_H__)
+#define __SYSDEP_H__
+
+#include <sys/types.h>
+
+#include <stddef.h> /* size_t, NULL */
+#include <setjmp.h>
+#include <assert.h>
+
+#if !defined IGNORE /* Macro to silence unused param warnings */
+#define IGNORE(x) &x
+#endif
+
+/*
+** TRUE and FALSE for C boolean operations, and
+** portable 32 bit types for CELLs
+**
+*/
+#if !defined TRUE
+#define TRUE 1
+#endif
+#if !defined FALSE
+#define FALSE 0
+#endif
+
+/*
+** System dependent data type declarations...
+*/
+#if !defined INT32
+#define INT32 int
+#endif
+
+#if !defined UNS32
+#define UNS32 unsigned int
+#endif
+
+#if !defined UNS16
+#define UNS16 unsigned short
+#endif
+
+#if !defined UNS8
+#define UNS8 unsigned char
+#endif
+
+#if !defined NULL
+#define NULL ((void *)0)
+#endif
+
+/*
+** FICL_UNS and FICL_INT must have the same size as a void* on
+** the target system. A CELL is a union of void*, FICL_UNS, and
+** FICL_INT.
+** (11/2000: same for FICL_FLOAT)
+*/
+#if !defined FICL_INT
+#define FICL_INT long
+#endif
+
+#if !defined FICL_UNS
+#define FICL_UNS unsigned long
+#endif
+
+#if !defined FICL_FLOAT
+#define FICL_FLOAT float
+#endif
+
+/*
+** Ficl presently supports values of 32 and 64 for BITS_PER_CELL
+*/
+#if !defined BITS_PER_CELL
+#define BITS_PER_CELL 64
+#endif
+
+#if ((BITS_PER_CELL != 32) && (BITS_PER_CELL != 64))
+ Error!
+#endif
+
+typedef struct
+{
+ FICL_UNS hi;
+ FICL_UNS lo;
+} DPUNS;
+
+typedef struct
+{
+ FICL_UNS quot;
+ FICL_UNS rem;
+} UNSQR;
+
+typedef struct
+{
+ FICL_INT hi;
+ FICL_INT lo;
+} DPINT;
+
+typedef struct
+{
+ FICL_INT quot;
+ FICL_INT rem;
+} INTQR;
+
+
+/*
+** B U I L D C O N T R O L S
+*/
+
+#if !defined (FICL_MINIMAL)
+#define FICL_MINIMAL 0
+#endif
+#if (FICL_MINIMAL)
+#define FICL_WANT_SOFTWORDS 0
+#define FICL_WANT_FILE 0
+#define FICL_WANT_FLOAT 0
+#define FICL_WANT_USER 0
+#define FICL_WANT_LOCALS 0
+#define FICL_WANT_DEBUGGER 0
+#define FICL_WANT_OOP 0
+#define FICL_PLATFORM_EXTEND 0
+#define FICL_MULTITHREAD 0
+#define FICL_ROBUST 0
+#define FICL_EXTENDED_PREFIX 0
+#endif
+
+/*
+** FICL_PLATFORM_EXTEND
+** Includes words defined in ficlCompilePlatform
+*/
+#if !defined (FICL_PLATFORM_EXTEND)
+#define FICL_PLATFORM_EXTEND 1
+#endif
+
+
+/*
+** FICL_WANT_FILE
+** Includes the FILE and FILE-EXT wordset and associated code. Turn this off if you do not
+** have a filesystem!
+** Contributed by Larry Hastings
+*/
+#if !defined (FICL_WANT_FILE)
+#define FICL_WANT_FILE 0
+#endif
+
+/*
+** FICL_WANT_FLOAT
+** Includes a floating point stack for the VM, and words to do float operations.
+** Contributed by Guy Carver
+*/
+#if !defined (FICL_WANT_FLOAT)
+#define FICL_WANT_FLOAT 0
+#endif
+
+/*
+** FICL_WANT_DEBUGGER
+** Inludes a simple source level debugger
+*/
+#if !defined (FICL_WANT_DEBUGGER)
+#define FICL_WANT_DEBUGGER 1
+#endif
+
+/*
+** FICL_EXTENDED_PREFIX enables a bunch of extra prefixes in prefix.c and prefix.fr (if
+** included as part of softcore.c)
+*/
+#if !defined FICL_EXTENDED_PREFIX
+#define FICL_EXTENDED_PREFIX 0
+#endif
+
+/*
+** User variables: per-instance variables bound to the VM.
+** Kinda like thread-local storage. Could be implemented in a
+** VM private dictionary, but I've chosen the lower overhead
+** approach of an array of CELLs instead.
+*/
+#if !defined FICL_WANT_USER
+#define FICL_WANT_USER 1
+#endif
+
+#if !defined FICL_USER_CELLS
+#define FICL_USER_CELLS 16
+#endif
+
+/*
+** FICL_WANT_LOCALS controls the creation of the LOCALS wordset and
+** a private dictionary for local variable compilation.
+*/
+#if !defined FICL_WANT_LOCALS
+#define FICL_WANT_LOCALS 1
+#endif
+
+/* Max number of local variables per definition */
+#if !defined FICL_MAX_LOCALS
+#define FICL_MAX_LOCALS 16
+#endif
+
+/*
+** FICL_WANT_OOP
+** Inludes object oriented programming support (in softwords)
+** OOP support requires locals and user variables!
+*/
+#if !(FICL_WANT_LOCALS) || !(FICL_WANT_USER)
+#if !defined (FICL_WANT_OOP)
+#define FICL_WANT_OOP 0
+#endif
+#endif
+
+#if !defined (FICL_WANT_OOP)
+#define FICL_WANT_OOP 1
+#endif
+
+/*
+** FICL_WANT_SOFTWORDS
+** Controls inclusion of all softwords in softcore.c
+*/
+#if !defined (FICL_WANT_SOFTWORDS)
+#define FICL_WANT_SOFTWORDS 1
+#endif
+
+/*
+** FICL_MULTITHREAD enables dictionary mutual exclusion
+** wia the ficlLockDictionary system dependent function.
+** Note: this implementation is experimental and poorly
+** tested. Further, it's unnecessary unless you really
+** intend to have multiple SESSIONS (poor choice of name
+** on my part) - that is, threads that modify the dictionary
+** at the same time.
+*/
+#if !defined FICL_MULTITHREAD
+#define FICL_MULTITHREAD 0
+#endif
+
+/*
+** PORTABLE_LONGMULDIV causes ficlLongMul and ficlLongDiv to be
+** defined in C in sysdep.c. Use this if you cannot easily
+** generate an inline asm definition
+*/
+#if !defined (PORTABLE_LONGMULDIV)
+#define PORTABLE_LONGMULDIV 0
+#endif
+
+/*
+** INLINE_INNER_LOOP causes the inner interpreter to be inline code
+** instead of a function call. This is mainly because MS VC++ 5
+** chokes with an internal compiler error on the function version.
+** in release mode. Sheesh.
+*/
+#if !defined INLINE_INNER_LOOP
+#if defined _DEBUG
+#define INLINE_INNER_LOOP 0
+#else
+#define INLINE_INNER_LOOP 1
+#endif
+#endif
+
+/*
+** FICL_ROBUST enables bounds checking of stacks and the dictionary.
+** This will detect stack over and underflows and dictionary overflows.
+** Any exceptional condition will result in an assertion failure.
+** (As generated by the ANSI assert macro)
+** FICL_ROBUST == 1 --> stack checking in the outer interpreter
+** FICL_ROBUST == 2 also enables checking in many primitives
+*/
+
+#if !defined FICL_ROBUST
+#define FICL_ROBUST 2
+#endif
+
+/*
+** FICL_DEFAULT_STACK Specifies the default size (in CELLs) of
+** a new virtual machine's stacks, unless overridden at
+** create time.
+*/
+#if !defined FICL_DEFAULT_STACK
+#define FICL_DEFAULT_STACK 128
+#endif
+
+/*
+** FICL_DEFAULT_DICT specifies the number of CELLs to allocate
+** for the system dictionary by default. The value
+** can be overridden at startup time as well.
+** FICL_DEFAULT_ENV specifies the number of cells to allot
+** for the environment-query dictionary.
+*/
+#if !defined FICL_DEFAULT_DICT
+#define FICL_DEFAULT_DICT 12288
+#endif
+
+#if !defined FICL_DEFAULT_ENV
+#define FICL_DEFAULT_ENV 260
+#endif
+
+/*
+** FICL_DEFAULT_VOCS specifies the maximum number of wordlists in
+** the dictionary search order. See Forth DPANS sec 16.3.3
+** (file://dpans16.htm#16.3.3)
+*/
+#if !defined FICL_DEFAULT_VOCS
+#define FICL_DEFAULT_VOCS 16
+#endif
+
+/*
+** FICL_MAX_PARSE_STEPS controls the size of an array in the FICL_SYSTEM structure
+** that stores pointers to parser extension functions. I would never expect to have
+** more than 8 of these, so that's the default limit. Too many of these functions
+** will probably exact a nasty performance penalty.
+*/
+#if !defined FICL_MAX_PARSE_STEPS
+#define FICL_MAX_PARSE_STEPS 8
+#endif
+
+/*
+** FICL_ALIGN is the power of two to which the dictionary
+** pointer address must be aligned. This value is usually
+** either 1 or 2, depending on the memory architecture
+** of the target system; 2 is safe on any 16 or 32 bit
+** machine. 3 would be appropriate for a 64 bit machine.
+*/
+#if !defined FICL_ALIGN
+#define FICL_ALIGN 3
+#define FICL_ALIGN_ADD ((1 << FICL_ALIGN) - 1)
+#endif
+
+/*
+** System dependent routines --
+** edit the implementations in sysdep.c to be compatible
+** with your runtime environment...
+** ficlTextOut sends a NULL terminated string to the
+** default output device - used for system error messages
+** ficlMalloc and ficlFree have the same semantics as malloc and free
+** in standard C
+** ficlLongMul multiplies two UNS32s and returns a 64 bit unsigned
+** product
+** ficlLongDiv divides an UNS64 by an UNS32 and returns UNS32 quotient
+** and remainder
+*/
+struct vm;
+void ficlTextOut(struct vm *pVM, char *msg, int fNewline);
+void *ficlMalloc (size_t size);
+void ficlFree (void *p);
+void *ficlRealloc(void *p, size_t size);
+/*
+** Stub function for dictionary access control - does nothing
+** by default, user can redefine to guarantee exclusive dict
+** access to a single thread for updates. All dict update code
+** must be bracketed as follows:
+** ficlLockDictionary(TRUE);
+** <code that updates dictionary>
+** ficlLockDictionary(FALSE);
+**
+** Returns zero if successful, nonzero if unable to acquire lock
+** before timeout (optional - could also block forever)
+**
+** NOTE: this function must be implemented with lock counting
+** semantics: nested calls must behave properly.
+*/
+#if FICL_MULTITHREAD
+int ficlLockDictionary(short fLock);
+#else
+#define ficlLockDictionary(x) 0 /* ignore */
+#endif
+
+/*
+** 64 bit integer math support routines: multiply two UNS32s
+** to get a 64 bit product, & divide the product by an UNS32
+** to get an UNS32 quotient and remainder. Much easier in asm
+** on a 32 bit CPU than in C, which usually doesn't support
+** the double length result (but it should).
+*/
+DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y);
+UNSQR ficlLongDiv(DPUNS q, FICL_UNS y);
+
+
+/*
+** FICL_HAVE_FTRUNCATE indicates whether the current OS supports
+** the ftruncate() function (available on most UNIXes). This
+** function is necessary to provide the complete File-Access wordset.
+*/
+#if !defined (FICL_HAVE_FTRUNCATE)
+#define FICL_HAVE_FTRUNCATE 0
+#endif
+
+
+#endif /*__SYSDEP_H__*/
diff --git a/sys/boot/i386/Makefile.inc b/sys/boot/i386/Makefile.inc
index f165042..0cad7d2 100644
--- a/sys/boot/i386/Makefile.inc
+++ b/sys/boot/i386/Makefile.inc
@@ -11,6 +11,7 @@ LDFLAGS+= -nostdlib
.if ${MACHINE_CPUARCH} == "amd64"
CFLAGS+= -m32 -march=i386
+ACFLAGS+= -m32
LDFLAGS+= -m elf_i386_fbsd
AFLAGS+= --32
.endif
diff --git a/sys/boot/i386/boot2/Makefile b/sys/boot/i386/boot2/Makefile
index 9568c1c1..e2fc534 100644
--- a/sys/boot/i386/boot2/Makefile
+++ b/sys/boot/i386/boot2/Makefile
@@ -89,6 +89,9 @@ boot2.out: ${BTXCRT} boot2.o sio.o
${LD} ${LDFLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC}
boot2.o: boot2.s
+.if ${CC:T:Mclang} == "clang"
+ ${CC} ${ACFLAGS} -c boot2.s
+.endif
SRCS= boot2.c boot2.h
diff --git a/sys/boot/i386/libi386/biosacpi.c b/sys/boot/i386/libi386/biosacpi.c
index f511eb7..ff8b1ca 100644
--- a/sys/boot/i386/libi386/biosacpi.c
+++ b/sys/boot/i386/libi386/biosacpi.c
@@ -61,7 +61,7 @@ biosacpi_detect(void)
return;
/* export values from the RSDP */
- sprintf(buf, "%p", VTOP(rsdp));
+ sprintf(buf, "%u", VTOP(rsdp));
setenv("hint.acpi.0.rsdp", buf, 1);
revision = rsdp->Revision;
if (revision == 0)
diff --git a/sys/boot/i386/libi386/bioscd.c b/sys/boot/i386/libi386/bioscd.c
index a6dba0c..a3abf34 100644
--- a/sys/boot/i386/libi386/bioscd.c
+++ b/sys/boot/i386/libi386/bioscd.c
@@ -117,6 +117,7 @@ bc_bios2unit(int biosdev)
int i;
DEBUG("looking for bios device 0x%x", biosdev);
+ printf("looking for bios device 0x%x, nbcinfo=%d\n", biosdev, nbcinfo);
for (i = 0; i < nbcinfo; i++) {
DEBUG("bc unit %d is BIOS device 0x%x", i, bcinfo[i].bc_unit);
if (bcinfo[i].bc_unit == biosdev)
@@ -148,6 +149,7 @@ bc_init(void)
int
bc_add(int biosdev)
{
+ printf("bc_add(%d)\n", biosdev);
if (nbcinfo >= MAXBCDEV)
return (-1);
@@ -159,8 +161,10 @@ bc_add(int biosdev)
v86.ds = VTOPSEG(&bcinfo[nbcinfo].bc_sp);
v86.esi = VTOPOFF(&bcinfo[nbcinfo].bc_sp);
v86int();
- if ((v86.eax & 0xff00) != 0)
+ if ((v86.eax & 0xff00) != 0) {
+ printf("CD probe failed, eax=0x%08x\n", v86.eax);
return (-1);
+ }
printf("BIOS CD is cd%d\n", nbcinfo);
nbcinfo++;
diff --git a/sys/boot/i386/zfsboot/Makefile b/sys/boot/i386/zfsboot/Makefile
index 65df86f..8caff27 100644
--- a/sys/boot/i386/zfsboot/Makefile
+++ b/sys/boot/i386/zfsboot/Makefile
@@ -86,6 +86,9 @@ zfsboot.out: ${BTXCRT} zfsboot.o sio.o drv.o cons.o util.o
${LD} ${LDFLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSTAND}
zfsboot.o: zfsboot.s
+.if ${CC:T:Mclang} == "clang"
+ ${CC} ${ACFLAGS} -c zfsboot.s
+.endif
SRCS= zfsboot.c
diff --git a/sys/boot/i386/zfsboot/zfsldr.S b/sys/boot/i386/zfsboot/zfsldr.S
index 182d88e..b8be282 100644
--- a/sys/boot/i386/zfsboot/zfsldr.S
+++ b/sys/boot/i386/zfsboot/zfsldr.S
@@ -16,7 +16,6 @@
*/
/* Memory Locations */
- .set MEM_REL,0x700 # Relocation address
.set MEM_ARG,0x900 # Arguments
.set MEM_ORG,0x7c00 # Origin
.set MEM_BUF,0x8000 # Load area
@@ -38,43 +37,6 @@
.globl start
.code16
-start: jmp main # Start recognizably
-
-/*
- * This is the start of a standard BIOS Parameter Block (BPB). Most bootable
- * FAT disks have this at the start of their MBR. While normal BIOS's will
- * work fine without this section, IBM's El Torito emulation "fixes" up the
- * BPB by writing into the memory copy of the MBR. Rather than have data
- * written into our code, we'll define a BPB to work around it.
- * The data marked with (T) indicates a field required for a ThinkPad to
- * recognize the disk and (W) indicates fields written from IBM BIOS code.
- * The use of the BPB is based on what OpenBSD and NetBSD implemented in
- * their boot code but the required fields were determined by trial and error.
- *
- * Note: If additional space is needed in boot1, one solution would be to
- * move the "prompt" message data (below) to replace the OEM ID.
- */
- .org 0x03, 0x00
-oemid: .space 0x08, 0x00 # OEM ID
-
- .org 0x0b, 0x00
-bpb: .word 512 # sector size (T)
- .byte 0 # sectors/clustor
- .word 0 # reserved sectors
- .byte 0 # number of FATs
- .word 0 # root entries
- .word 0 # small sectors
- .byte 0 # media type (W)
- .word 0 # sectors/fat
- .word 18 # sectors per track (T)
- .word 2 # number of heads (T)
- .long 0 # hidden sectors (W)
- .long 0 # large sectors
-
- .org 0x24, 0x00
-ebpb: .byte 0 # BIOS physical drive number (W)
-
- .org 0x25,0x90
/*
* Load the rest of zfsboot2 and BTX up, copy the parts to the right locations,
* and start it all up.
@@ -84,33 +46,24 @@ ebpb: .byte 0 # BIOS physical drive number (W)
* Setup the segment registers to flat addressing (segment 0) and setup the
* stack to end just below the start of our code.
*/
-main: cld # String ops inc
+start: cld # String ops inc
xor %cx,%cx # Zero
mov %cx,%es # Address
mov %cx,%ds # data
mov %cx,%ss # Set up
mov $start,%sp # stack
/*
- * Relocate ourself to MEM_REL. Since %cx == 0, the inc %ch sets
- * %cx == 0x100.
- */
- mov %sp,%si # Source
- mov $MEM_REL,%di # Destination
- incb %ch # Word count
- rep # Copy
- movsw # code
-/*
- * If we are on a hard drive, then load the MBR and look for the first
- * FreeBSD slice. We use the fake partition entry below that points to
- * the MBR when we call nread. The first pass looks for the first active
- * FreeBSD slice. The second pass looks for the first non-active FreeBSD
- * slice if the first one fails.
+ * Load the MBR and look for the first FreeBSD slice. We use the fake
+ * partition entry below that points to the MBR when we call read.
+ * The first pass looks for the first active FreeBSD slice. The
+ * second pass looks for the first non-active FreeBSD slice if the
+ * first one fails.
*/
- mov $part4,%si # Partition
- cmpb $0x80,%dl # Hard drive?
- jb main.4 # No
- movb $0x1,%dh # Block count
- callw nread # Read MBR
+ call check_edd # Make sure EDD works
+ mov $part4,%si # Dummy partition
+ xor %eax,%eax # Read MBR
+ movl $MEM_BUF,%ebx # from first
+ call read # sector
mov $0x1,%cx # Two passes
main.1: mov $MEM_BUF+PRT_OFF,%si # Partition table
movb $0x1,%dh # Partition
@@ -131,60 +84,55 @@ main.3: add $0x10,%si # Next entry
*/
mov $msg_part,%si # Message
jmp error # Error
-/*
- * Floppies use partition 0 of drive 0.
- */
-main.4: xor %dx,%dx # Partition:drive
/*
* Ok, we have a slice and drive in %dx now, so use that to locate and
* load boot2. %si references the start of the slice we are looking
- * for, so go ahead and load up the 64 sectors starting at sector 1024
+ * for, so go ahead and load up the 128 sectors starting at sector 1024
* (i.e. after the two vdev labels). We don't have do anything fancy
* here to allow for an extra copy of boot1 and a partition table
* (compare to this section of the UFS bootstrap) so we just load it
- * all at 0x8000. The first part of boot2 is BTX, which wants to run
+ * all at 0x9000. The first part of boot2 is BTX, which wants to run
* at 0x9000. The boot2.bin binary starts right after the end of BTX,
* so we have to figure out where the start of it is and then move the
- * binary to 0xc000. After we have moved the client, we relocate BTX
- * itself to 0x9000 - doing it in this order means that none of the
- * memcpy regions overlap which would corrupt the copy. Normally, BTX
- * clients start at MEM_USR, or 0xa000, but when we use btxld to
- * create zfsboot2, we use an entry point of 0x2000. That entry point is
- * relative to MEM_USR; thus boot2.bin starts at 0xc000.
+ * binary to 0xc000. Normally, BTX clients start at MEM_USR, or 0xa000,
+ * but when we use btxld to create zfsboot2, we use an entry point of
+ * 0x2000. That entry point is relative to MEM_USR; thus boot2.bin
+ * starts at 0xc000.
*
* The load area and the target area for the client overlap so we have
* to use a decrementing string move. We also play segment register
* games with the destination address for the move so that the client
* can be larger than 16k (which would overflow the zero segment since
- * the client starts at 0xc000). Relocating BTX is easy since the load
- * area and target area do not overlap.
+ * the client starts at 0xc000).
*/
main.5: mov %dx,MEM_ARG # Save args
- movb $NSECT,%dh # Sector count
+ mov $NSECT,%cx # Sector count
movl $1024,%eax # Offset to boot2
- callw nread.1 # Read disk
-main.6: mov $MEM_BUF,%si # BTX (before reloc)
- mov 0xa(%si),%bx # Get BTX length and set
+ mov $MEM_BTX,%ebx # Destination buffer
+main.6: pushal # Save params
+ call read # Read disk
+ popal # Restore
+ incl %eax # Advance to
+ add $SIZ_SEC,%ebx # next sector
+ loop main.6 # If not last, read another
+ mov MEM_BTX+0xa,%bx # Get BTX length
mov $NSECT*SIZ_SEC-1,%di # Size of load area (less one)
- mov %di,%si # End of load
- add $MEM_BUF,%si # area
+ mov %di,%si # End of load area, 0x9000 rel
sub %bx,%di # End of client, 0xc000 rel
mov %di,%cx # Size of
inc %cx # client
+ mov $(MEM_BTX)>>4,%dx # Segment
+ mov %dx,%ds # addressing 0x9000
mov $(MEM_USR+2*SIZ_PAG)>>4,%dx # Segment
mov %dx,%es # addressing 0xc000
std # Move with decrement
rep # Relocate
movsb # client
- mov %ds,%dx # Back to
- mov %dx,%es # zero segment
- mov $MEM_BUF,%si # BTX (before reloc)
- mov $MEM_BTX,%di # BTX
- mov %bx,%cx # Get BTX length
- cld # Increment this time
- rep # Relocate
- movsb # BTX
+ cld # Back to increment
+ xor %dx,%dx # Back
+ mov %ds,%dx # to zero
+ mov %dx,%es # segment
/*
* Enable A20 so we can access memory above 1 meg.
@@ -210,33 +158,37 @@ seta20.3: sti # Enable interrupts
/*
- * Trampoline used to call read from within zfsldr. Sets up an EDD
- * packet on the stack and passes it to read.
+ * Read a sector from the disk. Sets up an EDD packet on the stack
+ * and passes it to read. We assume that the destination address is
+ * always segment-aligned.
*
* %eax - int - LBA to read in relative to partition start
+ * %ebx - ptr - destination address
* %dl - byte - drive to read from
- * %dh - byte - num sectors to read
* %si - ptr - MBR partition entry
*/
-nread: xor %eax,%eax # Sector offset in partition
-nread.1: xor %ecx,%ecx # Get
+read: xor %ecx,%ecx # Get
addl 0x8(%si),%eax # LBA
adc $0,%ecx
pushl %ecx # Starting absolute block
pushl %eax # block number
- push %es # Address of
- push $MEM_BUF # transfer buffer
- xor %ax,%ax # Number of
- movb %dh,%al # blocks to
- push %ax # transfer
+ shr $4,%ebx # Convert to segment
+ push %bx # Address of
+ push $0 # transfer buffer
+ push $0x1 # Read 1 sector
push $0x10 # Size of packet
- mov %sp,%bp # Packet pointer
- callw read # Read from disk
- lea 0x10(%bp),%sp # Clear stack
- jnc return # If success, return
- mov $msg_read,%si # Otherwise, set the error
- # message and fall through to
- # the error routine
+ mov %sp,%si # Packet pointer
+ mov $0x42,%ah # BIOS: Extended
+ int $0x13 # read
+ jc read.1 # If error, fail
+ lea 0x10(%si),%sp # Clear stack
+ ret # If success, return
+read.1: mov %ah,%al # Format
+ mov $read_err,%di # error
+ call hex8 # code
+ mov $msg_read,%si # Set the error message and
+ # fall through to the error
+ # routine
/*
* Print out the error message pointed to by %ds:(%si) followed
* by a prompt, wait for a keypress, and then reboot the machine.
@@ -257,51 +209,49 @@ putstr.0: mov $0x7,%bx # Page:attribute
putstr: lodsb # Get char
testb %al,%al # End of string?
jne putstr.0 # No
-
+ ret # To caller
/*
- * Overused return code. ereturn is used to return an error from the
- * read function. Since we assume putstr succeeds, we (ab)use the
- * same code when we return from putstr.
- */
-ereturn: movb $0x1,%ah # Invalid
- stc # argument
-return: retw # To caller
-/*
- * Reads sectors from the disk. If EDD is enabled, then check if it is
- * installed and use it if it is. If it is not installed or not enabled, then
- * fall back to using CHS. Since we use a LBA, if we are using CHS, we have to
- * fetch the drive parameters from the BIOS and divide it out ourselves.
- * Call with:
- *
- * %dl - byte - drive number
- * stack - 10 bytes - EDD Packet
+ * Check to see if the disk supports EDD. zfsboot requires EDD and does not
+ * support older C/H/S disk I/O.
*/
-read: cmpb $0x80,%dl # Hard drive?
- jb read.1 # No, use CHS
+check_edd: cmpb $0x80,%dl # Hard drive?
+ jb check_edd.1 # No, fail to boot
mov $0x55aa,%bx # Magic
push %dx # Save
movb $0x41,%ah # BIOS: Check
int $0x13 # extensions present
pop %dx # Restore
- jc read.1 # If error, use CHS
+ jc check_edd.1 # If error, fail
cmp $0xaa55,%bx # Magic?
- jne read.1 # No, so use CHS
+ jne check_edd.1 # No, so fail
testb $0x1,%cl # Packet interface?
- jz read.1 # No, so use CHS
- mov %bp,%si # Disk packet
- movb $0x42,%ah # BIOS: Extended
- int $0x13 # read
- retw # To caller
-read.1: mov $msg_chs,%si
- jmp error
-msg_chs: .asciz "CHS not supported"
+ jz check_edd.1 # No, so fail
+ ret # EDD ok, keep booting
+check_edd.1: mov $msg_chs,%si # Warn that CHS is
+ jmp error # unsupported and fail
+/*
+ * AL to hex, saving the result to [EDI].
+ */
+hex8: push %ax # Save
+ shrb $0x4,%al # Do upper
+ call hex8.1 # 4
+ pop %ax # Restore
+hex8.1: andb $0xf,%al # Get lower 4
+ cmpb $0xa,%al # Convert
+ sbbb $0x69,%al # to hex
+ das # digit
+ orb $0x20,%al # To lower case
+ stosb # Save char
+ ret # (Recursive)
/* Messages */
-msg_read: .asciz "Read"
-msg_part: .asciz "Boot"
+msg_chs: .asciz "CHS not supported"
+msg_read: .ascii "Read error: "
+read_err: .asciz "XX"
+msg_part: .asciz "Boot error"
-prompt: .asciz " error\r\n"
+prompt: .asciz "\r\n"
.org PRT_OFF,0x90
diff --git a/sys/boot/powerpc/ps3/Makefile b/sys/boot/powerpc/ps3/Makefile
index b05470b..0f0b782 100644
--- a/sys/boot/powerpc/ps3/Makefile
+++ b/sys/boot/powerpc/ps3/Makefile
@@ -10,13 +10,13 @@ INSTALLFLAGS= -b
# Architecture-specific loader code
SRCS= start.S conf.c metadata.c vers.c main.c devicename.c ppc64_elf_freebsd.c
-SRCS+= lv1call.S ps3cons.c font.h ps3mmu.c ps3net.c
+SRCS+= lv1call.S ps3cons.c font.h ps3mmu.c ps3net.c ps3repo.c ps3stor.c ps3disk.c
SRCS+= ucmpdi2.c
LOADER_DISK_SUPPORT?= yes
LOADER_UFS_SUPPORT?= yes
LOADER_CD9660_SUPPORT?= yes
-LOADER_EXT2FS_SUPPORT?= no
+LOADER_EXT2FS_SUPPORT?= yes
LOADER_NET_SUPPORT?= yes
LOADER_NFS_SUPPORT?= yes
LOADER_TFTP_SUPPORT?= no
diff --git a/sys/boot/powerpc/ps3/conf.c b/sys/boot/powerpc/ps3/conf.c
index 7749a15..200fc7f 100644
--- a/sys/boot/powerpc/ps3/conf.c
+++ b/sys/boot/powerpc/ps3/conf.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1999 Michael Smith <msmith@freebsd.org>
+ * Copyright (C) 1999 Michael Smith <msmith@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -34,6 +34,8 @@ __FBSDID("$FreeBSD$");
#include "dev_net.h"
#endif
+extern struct devsw ps3disk;
+
/*
* We could use linker sets for some or all of these, but
* then we would have to control what ended up linked into
@@ -46,10 +48,8 @@ __FBSDID("$FreeBSD$");
/* Exported for libstand */
struct devsw *devsw[] = {
#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT)
-#ifdef NOTYET
&ps3disk,
#endif
-#endif
#if defined(LOADER_NET_SUPPORT)
&netdev,
#endif
diff --git a/sys/boot/powerpc/ps3/devicename.c b/sys/boot/powerpc/ps3/devicename.c
index b652d9b..c46bc89 100644
--- a/sys/boot/powerpc/ps3/devicename.c
+++ b/sys/boot/powerpc/ps3/devicename.c
@@ -33,8 +33,10 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include "bootstrap.h"
+#include "ps3.h"
+#include "ps3devdesc.h"
-static int ps3_parsedev(struct devdesc **dev, const char *devspec,
+static int ps3_parsedev(struct ps3_devdesc **dev, const char *devspec,
const char **path);
/*
@@ -45,7 +47,7 @@ static int ps3_parsedev(struct devdesc **dev, const char *devspec,
int
ps3_getdev(void **vdev, const char *devspec, const char **path)
{
- struct devdesc **dev = (struct devdesc **)vdev;
+ struct ps3_devdesc **dev = (struct ps3_devdesc **)vdev;
int rv = 0;
/*
@@ -82,9 +84,9 @@ ps3_getdev(void **vdev, const char *devspec, const char **path)
*
*/
static int
-ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
+ps3_parsedev(struct ps3_devdesc **dev, const char *devspec, const char **path)
{
- struct devdesc *idev;
+ struct ps3_devdesc *idev;
struct devsw *dv;
char *cp;
const char *np;
@@ -104,7 +106,7 @@ ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
}
if (dv == NULL)
return(ENOENT);
- idev = malloc(sizeof(struct devdesc));
+ idev = malloc(sizeof(struct ps3_devdesc));
err = 0;
np = (devspec + strlen(dv->dv_name));
@@ -112,7 +114,6 @@ ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
case DEVT_NONE:
break;
-#ifdef NOTYET
case DEVT_DISK:
unit = -1;
pnum = -1;
@@ -154,7 +155,6 @@ ps3_parsedev(struct devdesc **dev, const char *devspec, const char **path)
if (path != NULL)
*path = (*cp == 0) ? cp : cp + 1;
break;
-#endif
case DEVT_NET:
/*
@@ -188,7 +188,7 @@ fail:
char *
ps3_fmtdev(void *vdev)
{
- struct devdesc *dev = (struct devdesc *)vdev;
+ struct ps3_devdesc *dev = (struct ps3_devdesc *)vdev;
char *cp;
static char buf[128];
@@ -197,7 +197,6 @@ ps3_fmtdev(void *vdev)
strcpy(buf, "(no device)");
break;
-#ifdef NOTYET
case DEVT_DISK:
cp = buf;
cp += sprintf(cp, "%s%d", dev->d_dev->dv_name, dev->d_unit);
@@ -212,7 +211,6 @@ ps3_fmtdev(void *vdev)
strcat(cp, ":");
break;
-#endif
case DEVT_NET:
sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
@@ -227,7 +225,7 @@ ps3_fmtdev(void *vdev)
int
ps3_setcurrdev(struct env_var *ev, int flags, const void *value)
{
- struct devdesc *ncurr;
+ struct ps3_devdesc *ncurr;
int rv;
if ((rv = ps3_parsedev(&ncurr, value, NULL)) != 0)
diff --git a/sys/boot/powerpc/ps3/lv1call.S b/sys/boot/powerpc/ps3/lv1call.S
index a5dafdd..1c1e28e 100644
--- a/sys/boot/powerpc/ps3/lv1call.S
+++ b/sys/boot/powerpc/ps3/lv1call.S
@@ -1,5 +1,6 @@
/*-
* Copyright (C) 2010 Nathan Whitehorn
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -163,7 +164,7 @@ lv1_gpu_context_allocate:
sldi %r3,%r3,32
clrldi %r4,%r4,32
- ori %r3,%r3,%r4
+ or %r3,%r3,%r4
clrldi %r4,%r5,32
clrldi %r5,%r6,32
@@ -254,3 +255,98 @@ lv1_setup_dma:
mtlr %r0
blr
+.global lv1_get_repository_node_value
+lv1_get_repository_node_value:
+ mflr %r0
+ stw %r0,4(%r1)
+
+ sldi %r3,%r3,32
+ clrldi %r4,%r4,32
+ or %r3,%r3,%r4
+ sldi %r4,%r5,32
+ clrldi %r5,%r6,32
+ or %r4,%r4,%r5
+ sldi %r5,%r7,32
+ clrldi %r6,%r8,32
+ or %r5,%r5,%r6
+ sldi %r6,%r9,32
+ clrldi %r7,%r10,32
+ or %r6,%r6,%r7
+ lwz %r7,8(%r1)
+ lwz %r8,12(%r1)
+ sldi %r7,%r7,32
+ or %r7,%r7,%r8
+
+ li %r11,91
+ hc
+ extsw %r3,%r3
+
+ lwz %r6,16(%r1)
+ std %r4,0(%r6)
+ lwz %r6,20(%r1)
+ std %r5,0(%r6)
+
+ lwz %r0,4(%r1)
+ mtlr %r0
+ blr
+
+.global lv1_storage_read
+lv1_storage_read:
+ mflr %r0
+ stw %r0,4(%r1)
+
+ sldi %r3,%r3,32
+ clrldi %r4,%r4,32
+ or %r3,%r3,%r4
+ sldi %r4,%r5,32
+ clrldi %r5,%r6,32
+ or %r4,%r4,%r5
+ sldi %r5,%r7,32
+ clrldi %r6,%r8,32
+ or %r5,%r5,%r6
+ sldi %r6,%r9,32
+ clrldi %r7,%r10,32
+ or %r6,%r6,%r7
+ lwz %r7,8(%r1)
+ lwz %r8,12(%r1)
+ sldi %r7,%r7,32
+ or %r7,%r7,%r8
+ lwz %r8,16(%r1)
+ lwz %r9,20(%r1)
+ sldi %r8,%r8,32
+ or %r8,%r8,%r9
+
+ li %r11,245
+ hc
+ extsw %r3,%r3
+
+ lwz %r5,24(%r1)
+ std %r4,0(%r5)
+
+ lwz %r0,4(%r1)
+ mtlr %r0
+ blr
+
+.global lv1_storage_check_async_status
+lv1_storage_check_async_status:
+ mflr %r0
+ stw %r0,4(%r1)
+ stw %r7,-4(%r1)
+
+ sldi %r3,%r3,32
+ clrldi %r4,%r4,32
+ or %r3,%r3,%r4
+ sldi %r4,%r5,32
+ clrldi %r5,%r6,32
+ or %r4,%r4,%r5
+
+ li %r11,254
+ hc
+ extsw %r3,%r3
+
+ lwz %r5,-4(%r1)
+ std %r4,0(%r5)
+
+ lwz %r0,4(%r1)
+ mtlr %r0
+ blr
diff --git a/sys/boot/powerpc/ps3/lv1call.h b/sys/boot/powerpc/ps3/lv1call.h
index 26e6e14..da47afb 100644
--- a/sys/boot/powerpc/ps3/lv1call.h
+++ b/sys/boot/powerpc/ps3/lv1call.h
@@ -68,5 +68,13 @@ int lv1_net_start_rx_dma(int bus, int dev, uint32_t addr, int);
int lv1_net_stop_tx_dma(int bus, int dev, int);
int lv1_net_stop_rx_dma(int bus, int dev, int);
+int lv1_get_repository_node_value(uint64_t lpar_id, uint64_t n1, uint64_t n2,
+ uint64_t n3, uint64_t n4, uint64_t *v1, uint64_t *v2);
+
+int lv1_storage_read(uint64_t dev_id, uint64_t region_id,
+ uint64_t start_sector, uint64_t sector_count,
+ uint64_t flags, uint64_t buf, uint64_t *tag);
+int lv1_storage_check_async_status(uint64_t dev_id, uint64_t tag, uint64_t *status);
+
#endif
diff --git a/sys/boot/powerpc/ps3/main.c b/sys/boot/powerpc/ps3/main.c
index 22c51fa..db808ad 100644
--- a/sys/boot/powerpc/ps3/main.c
+++ b/sys/boot/powerpc/ps3/main.c
@@ -1,5 +1,6 @@
/*-
* Copyright (C) 2010 Nathan Whitehorn
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include "bootstrap.h"
#include "lv1call.h"
#include "ps3.h"
+#include "ps3devdesc.h"
struct arch_switch archsw;
extern void *_end;
@@ -58,7 +60,9 @@ main(void)
{
uint64_t maxmem = 0;
void *heapbase;
- int i;
+ int i, err;
+ struct ps3_devdesc currdev;
+ struct open_file f;
lv1_get_physmem(&maxmem);
@@ -78,9 +82,37 @@ main(void)
/*
* March through the device switch probing for things.
*/
- for (i = 0; devsw[i] != NULL; i++)
- if (devsw[i]->dv_init != NULL)
- (devsw[i]->dv_init)();
+ for (i = 0; devsw[i] != NULL; i++) {
+ if (devsw[i]->dv_init != NULL) {
+ err = (devsw[i]->dv_init)();
+ if (err) {
+ printf("\n%s: initialization failed err=%d\n",
+ devsw[i]->dv_name, err);
+ continue;
+ }
+ }
+
+ printf("\nDevice: %s\n", devsw[i]->dv_name);
+
+ currdev.d_dev = devsw[i];
+ currdev.d_type = currdev.d_dev->dv_type;
+
+ if (strcmp(devsw[i]->dv_name, "disk") == 0) {
+ f.f_devdata = &currdev;
+ currdev.d_unit = 3;
+ currdev.d_disk.pnum = 1;
+ currdev.d_disk.ptype = PTYPE_GPT;
+
+ if (devsw[i]->dv_open(&f, &currdev) == 0)
+ break;
+ }
+
+ if (strcmp(devsw[i]->dv_name, "net") == 0)
+ break;
+ }
+
+ if (devsw[i] == NULL)
+ panic("No boot device found!");
/*
* Get timebase at boot.
@@ -98,8 +130,10 @@ main(void)
printf("(%s, %s)\n", bootprog_maker, bootprog_date);
printf("Memory: %lldKB\n", maxmem / 1024);
- env_setenv("currdev", EV_VOLATILE, "net", ps3_setcurrdev, env_nounset);
- env_setenv("loaddev", EV_VOLATILE, "net", env_noset, env_nounset);
+ env_setenv("currdev", EV_VOLATILE, ps3_fmtdev(&currdev),
+ ps3_setcurrdev, env_nounset);
+ env_setenv("loaddev", EV_VOLATILE, ps3_fmtdev(&currdev), env_noset,
+ env_nounset);
setenv("LINES", "24", 1);
setenv("hw.platform", "ps3", 1);
diff --git a/sys/boot/powerpc/ps3/ps3bus.h b/sys/boot/powerpc/ps3/ps3bus.h
new file mode 100644
index 0000000..a3b20f3
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3bus.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_BUS_H
+#define _PS3_BUS_H
+
+enum {
+ PS3_BUS_TYPE_STOR = 5,
+};
+
+enum {
+ PS3_DEV_TYPE_STOR_DISK = 0,
+ PS3_DEV_TYPE_STOR_CDROM = 5,
+ PS3_DEV_TYPE_STOR_FLASH = 14,
+};
+
+#endif
diff --git a/sys/boot/powerpc/ps3/ps3devdesc.h b/sys/boot/powerpc/ps3/ps3devdesc.h
new file mode 100644
index 0000000..5a6e52f
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3devdesc.h
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (C) 2000 Benno Rice.
+ * Copyright (C) 2007 Semihalf, Rafal Jaworowski <raj@semihalf.com>
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_DEV_DESC_H
+#define _PS3_DEV_DESC_H
+
+/* Note: Must match the 'struct devdesc' in bootstrap.h */
+struct ps3_devdesc {
+ struct devsw *d_dev;
+ int d_type;
+ int d_unit;
+
+ union {
+ struct {
+ void *data;
+ int pnum;
+ int ptype;
+ } disk;
+ } d_kind;
+};
+
+#define d_disk d_kind.disk
+
+#define PTYPE_BSDLABEL 1
+#define PTYPE_GPT 2
+
+#endif
diff --git a/sys/boot/powerpc/ps3/ps3disk.c b/sys/boot/powerpc/ps3/ps3disk.c
new file mode 100644
index 0000000..5c5195b
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3disk.c
@@ -0,0 +1,313 @@
+/*-
+ * Copyright (C) 2008 Semihalf, Rafal Jaworowski
+ * Copyright (C) 2009 Semihalf, Piotr Ziecik
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/endian.h>
+#include <machine/stdarg.h>
+#include <stand.h>
+#include <uuid.h>
+
+#define FSTYPENAMES
+#include <sys/disklabel.h>
+#include <sys/diskmbr.h>
+#include <sys/gpt.h>
+
+#include "bootstrap.h"
+#include "ps3bus.h"
+#include "ps3devdesc.h"
+#include "ps3stor.h"
+
+#define dev_printf(dev, fmt, args...) \
+ printf("%s%d: " fmt "\n" , dev->d_dev->dv_name, dev->d_unit, ##args)
+
+#ifdef DISK_DEBUG
+#define DEBUG(fmt, args...) printf("%s:%d: " fmt "\n" , __func__ , __LINE__, ##args)
+#else
+#define DEBUG(fmt, args...)
+#endif
+
+struct open_dev;
+
+static int ps3disk_open_gpt(struct ps3_devdesc *dev, struct open_dev *od);
+static void ps3disk_uuid_letoh(uuid_t *uuid);
+
+static int ps3disk_init(void);
+static int ps3disk_strategy(void *devdata, int flag, daddr_t dblk,
+ size_t size, char *buf, size_t *rsize);
+static int ps3disk_open(struct open_file *f, ...);
+static int ps3disk_close(struct open_file *f);
+static void ps3disk_print(int verbose);
+
+struct devsw ps3disk = {
+ "disk",
+ DEVT_DISK,
+ ps3disk_init,
+ ps3disk_strategy,
+ ps3disk_open,
+ ps3disk_close,
+ noioctl,
+ ps3disk_print,
+};
+
+struct gpt_part {
+ int gp_index;
+ uuid_t gp_type;
+ uint64_t gp_start;
+ uint64_t gp_end;
+};
+
+struct open_dev {
+ uint64_t od_start;
+
+ union {
+ struct {
+ int nparts;
+ struct gpt_part *parts;
+ } gpt;
+ } od_kind;
+};
+
+#define od_gpt_nparts od_kind.gpt.nparts
+#define od_gpt_parts od_kind.gpt.parts
+
+static struct ps3_stordev stor_dev;
+
+static int ps3disk_init(void)
+{
+ int err;
+
+ err = ps3stor_setup(&stor_dev, PS3_DEV_TYPE_STOR_DISK);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+static int ps3disk_strategy(void *devdata, int flag, daddr_t dblk,
+ size_t size, char *buf, size_t *rsize)
+{
+ struct ps3_devdesc *dev = (struct ps3_devdesc *) devdata;
+ struct open_dev *od = (struct open_dev *) dev->d_disk.data;
+ int err;
+
+ if (flag != F_READ) {
+ dev_printf(dev, "write operation is not supported!\n");
+ return EROFS;
+ }
+
+ if (size % stor_dev.sd_blksize) {
+ dev_printf(dev, "size=%u is not multiple of device block size=%llu\n",
+ size, stor_dev.sd_blksize);
+ return EIO;
+ }
+
+ if (rsize)
+ *rsize = 0;
+
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, od->od_start + dblk,
+ size / stor_dev.sd_blksize, 0, buf);
+
+ if (!err && rsize)
+ *rsize = size;
+
+ if (err)
+ dev_printf(dev, "read operation failed dblk=%llu size=%d err=%d\n",
+ dblk, size, err);
+
+ return err;
+}
+
+static int ps3disk_open(struct open_file *f, ...)
+{
+ va_list ap;
+ struct ps3_devdesc *dev;
+ struct open_dev *od;
+ int err;
+
+ va_start(ap, f);
+ dev = va_arg(ap, struct ps3_devdesc *);
+ va_end(ap);
+
+ od = malloc(sizeof(struct open_dev));
+ if (!od) {
+ dev_printf(dev, "couldn't allocate memory for new open_dev\n");
+ return ENOMEM;
+ }
+
+ err = ps3disk_open_gpt(dev, od);
+
+ if (err) {
+ dev_printf(dev, "couldn't open GPT disk error=%d\n", err);
+ free(od);
+ } else {
+ ((struct ps3_devdesc *) (f->f_devdata))->d_disk.data = od;
+ }
+
+ return err;
+}
+
+static int ps3disk_close(struct open_file *f)
+{
+ struct ps3_devdesc *dev = f->f_devdata;
+ struct open_dev *od = dev->d_disk.data;
+
+ if (dev->d_disk.ptype == PTYPE_GPT && od->od_gpt_nparts)
+ free(od->od_gpt_parts);
+
+ free(od);
+
+ dev->d_disk.data = NULL;
+
+ return 0;
+}
+
+static void ps3disk_print(int verbose)
+{
+}
+
+static int ps3disk_open_gpt(struct ps3_devdesc *dev, struct open_dev *od)
+{
+ char buf[512];
+ struct gpt_hdr *hdr;
+ struct gpt_ent *ent;
+ daddr_t slba, elba, lba;
+ int nparts, eps, i, part, err;
+
+ od->od_gpt_nparts = 0;
+ od->od_gpt_parts = NULL;
+
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, 0, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ if (le16toh(*((uint16_t *) (buf + DOSMAGICOFFSET))) != DOSMAGIC) {
+ err = ENXIO;
+ goto out;
+ }
+
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, 1, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ hdr = (struct gpt_hdr *) buf;
+
+ if (bcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)) ||
+ le64toh(hdr->hdr_lba_self) != 1 || le32toh(hdr->hdr_revision) < 0x00010000 ||
+ le32toh(hdr->hdr_entsz) < sizeof(struct gpt_ent) ||
+ stor_dev.sd_blksize % le32toh(hdr->hdr_entsz) != 0) {
+ err = ENXIO;
+ goto out;
+ }
+
+ nparts = 0;
+ eps = stor_dev.sd_blksize / le32toh(hdr->hdr_entsz);
+ slba = le64toh(hdr->hdr_lba_table);
+ elba = slba + le32toh(hdr->hdr_entries) / eps;
+
+ for (lba = slba; lba < elba; lba++) {
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, lba, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ ent = (struct gpt_ent *) buf;
+
+ for (i = 0; i < eps; i++) {
+ if (uuid_is_nil(&ent[i].ent_type, NULL) ||
+ le64toh(ent[i].ent_lba_start) == 0 ||
+ le64toh(ent[i].ent_lba_end) < le64toh(ent[i].ent_lba_start))
+ continue;
+
+ nparts++;
+ }
+ }
+
+ if (nparts) {
+ od->od_gpt_nparts = nparts;
+
+ od->od_gpt_parts = malloc(nparts * sizeof(struct gpt_part));
+ if (!od->od_gpt_parts) {
+ err = ENOMEM;
+ goto out;
+ }
+
+ for (lba = slba, part = 0; lba < elba; lba++) {
+ err = ps3stor_read_sectors(&stor_dev, dev->d_unit, lba, 1, 0, buf);
+ if (err) {
+ err = EIO;
+ goto out;
+ }
+
+ ent = (struct gpt_ent *) buf;
+
+ for (i = 0; i < eps; i++) {
+ if (uuid_is_nil(&ent[i].ent_type, NULL) ||
+ le64toh(ent[i].ent_lba_start) == 0 ||
+ le64toh(ent[i].ent_lba_end) < le64toh(ent[i].ent_lba_start))
+ continue;
+
+ od->od_gpt_parts[part].gp_index = (lba - slba) * eps + i + 1;
+ od->od_gpt_parts[part].gp_type = ent[i].ent_type;
+ od->od_gpt_parts[part].gp_start = le64toh(ent[i].ent_lba_start);
+ od->od_gpt_parts[part].gp_end = le64toh(ent[i].ent_lba_end);
+ ps3disk_uuid_letoh(&od->od_gpt_parts[part].gp_type);
+ part++;
+ }
+ }
+ }
+
+ dev->d_disk.ptype = PTYPE_GPT;
+
+ if (od->od_gpt_nparts && !dev->d_disk.pnum)
+ dev->d_disk.pnum = od->od_gpt_parts[0].gp_index;
+
+ for (i = 0; i < od->od_gpt_nparts; i++)
+ if (od->od_gpt_parts[i].gp_index == dev->d_disk.pnum)
+ od->od_start = od->od_gpt_parts[i].gp_start;
+
+ err = 0;
+
+out:
+
+ if (err && od->od_gpt_parts)
+ free(od->od_gpt_parts);
+
+ return err;
+}
+
+static void ps3disk_uuid_letoh(uuid_t *uuid)
+{
+ uuid->time_low = le32toh(uuid->time_low);
+ uuid->time_mid = le16toh(uuid->time_mid);
+ uuid->time_hi_and_version = le16toh(uuid->time_hi_and_version);
+}
diff --git a/sys/boot/powerpc/ps3/ps3repo.c b/sys/boot/powerpc/ps3/ps3repo.c
new file mode 100644
index 0000000..0064769
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3repo.c
@@ -0,0 +1,249 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stand.h>
+
+#include "lv1call.h"
+#include "ps3.h"
+#include "ps3repo.h"
+
+static uint64_t make_n1(const char *text, unsigned int index)
+{
+ uint64_t n1;
+
+ n1 = 0;
+ strncpy((char *) &n1, text, sizeof(n1));
+ n1 = (n1 >> 32) + index;
+
+ return n1;
+}
+
+static uint64_t make_n(const char *text, unsigned int index)
+{
+ uint64_t n;
+
+ n = 0;
+ strncpy((char *) &n, text, sizeof(n));
+ n = n + index;
+
+ return n;
+}
+
+int ps3repo_read_bus_type(unsigned int bus_index, uint64_t *bus_type)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("type", 0), 0, 0, &v1, &v2);
+
+ *bus_type = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_id(unsigned int bus_index, uint64_t *bus_id)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("id", 0), 0, 0, &v1, &v2);
+
+ *bus_id = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_num_dev(unsigned int bus_index, uint64_t *num_dev)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("num_dev", 0), 0, 0, &v1, &v2);
+
+ *num_dev = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_type(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_type)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("type", 0), 0, &v1, &v2);
+
+ *dev_type = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_id(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_id)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("id", 0), 0, &v1, &v2);
+
+ *dev_id = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_blk_size(unsigned int bus_index, unsigned int dev_index, uint64_t *blk_size)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("blk_size", 0), 0, &v1, &v2);
+
+ *blk_size = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_nblocks(unsigned int bus_index, unsigned int dev_index, uint64_t *nblocks)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("n_blocks", 0), 0, &v1, &v2);
+
+ *nblocks = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_nregs(unsigned int bus_index, unsigned int dev_index, uint64_t *nregs)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("n_regs", 0), 0, &v1, &v2);
+
+ *nregs = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_reg_id(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_id)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("region", reg_index), make_n("id", 0), &v1, &v2);
+
+ *reg_id = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_reg_start(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_start)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("region", reg_index), make_n("start", 0), &v1, &v2);
+
+ *reg_start = v1;
+
+ return err;
+}
+
+int ps3repo_read_bus_dev_reg_size(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_size)
+{
+ uint64_t v1, v2;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME, make_n1("bus", bus_index),
+ make_n("dev", dev_index), make_n("region", reg_index), make_n("size", 0), &v1, &v2);
+
+ *reg_size = v1;
+
+ return err;
+}
+
+int ps3repo_find_bus_by_type(uint64_t bus_type, unsigned int *bus_index)
+{
+ unsigned int i;
+ uint64_t type;
+ int err;
+
+ for (i = 0; i < 10; i++) {
+ err = ps3repo_read_bus_type(i, &type);
+ if (err) {
+ *bus_index = (unsigned int) -1;
+ return err;
+ }
+
+ if (type == bus_type) {
+ *bus_index = i;
+ return 0;
+ }
+ }
+
+ *bus_index = (unsigned int) -1;
+
+ return ENODEV;
+}
+
+int ps3repo_find_bus_dev_by_type(unsigned int bus_index, uint64_t dev_type,
+ unsigned int *dev_index)
+{
+ unsigned int i;
+ uint64_t type;
+ int err;
+
+ for (i = 0; i < 10; i++) {
+ err = ps3repo_read_bus_dev_type(bus_index, i, &type);
+ if (err) {
+ *dev_index = (unsigned int) -1;
+ return err;
+ }
+
+ if (type == dev_type) {
+ *dev_index = i;
+ return 0;
+ }
+ }
+
+ *dev_index = (unsigned int) -1;
+
+ return ENODEV;
+}
diff --git a/sys/boot/powerpc/ps3/ps3repo.h b/sys/boot/powerpc/ps3/ps3repo.h
new file mode 100644
index 0000000..68001df
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3repo.h
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_REPO_H
+#define _PS3_REPO_H
+
+#define PS3_LPAR_ID_PME 1
+
+int ps3repo_read_bus_type(unsigned int bus_index, uint64_t *bus_type);
+int ps3repo_read_bus_id(unsigned int bus_index, uint64_t *bus_id);
+int ps3repo_read_bus_num_dev(unsigned int bus_index, uint64_t *num_dev);
+int ps3repo_read_bus_dev_type(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_type);
+int ps3repo_read_bus_dev_id(unsigned int bus_index, unsigned int dev_index, uint64_t *dev_id);
+int ps3repo_read_bus_dev_blk_size(unsigned int bus_index, unsigned int dev_index, uint64_t *blk_size);
+int ps3repo_read_bus_dev_nblocks(unsigned int bus_index, unsigned int dev_index, uint64_t *nblocks);
+int ps3repo_read_bus_dev_nregs(unsigned int bus_index, unsigned int dev_index, uint64_t *nregs);
+int ps3repo_read_bus_dev_reg_id(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_id);
+int ps3repo_read_bus_dev_reg_start(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_start);
+int ps3repo_read_bus_dev_reg_size(unsigned int bus_index, unsigned int dev_index,
+ unsigned int reg_index, uint64_t *reg_size);
+int ps3repo_find_bus_by_type(uint64_t bus_type, unsigned int *bus_index);
+int ps3repo_find_bus_dev_by_type(unsigned int bus_index, uint64_t dev_type,
+ unsigned int *dev_index);
+
+#endif
diff --git a/sys/boot/powerpc/ps3/ps3stor.c b/sys/boot/powerpc/ps3/ps3stor.c
new file mode 100644
index 0000000..667b39c
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3stor.c
@@ -0,0 +1,165 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stand.h>
+
+#include "bootstrap.h"
+#include "lv1call.h"
+#include "ps3bus.h"
+#include "ps3repo.h"
+#include "ps3stor.h"
+
+int ps3stor_setup(struct ps3_stordev *sd, int type)
+{
+ unsigned int i;
+ int err;
+
+ sd->sd_type = type;
+
+ err = ps3repo_find_bus_by_type(PS3_BUS_TYPE_STOR, &sd->sd_busidx);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_id(sd->sd_busidx, &sd->sd_busid);
+ if (err)
+ goto out;
+
+ err = ps3repo_find_bus_dev_by_type(sd->sd_busidx, type, &sd->sd_devidx);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_id(sd->sd_busidx, sd->sd_devidx, &sd->sd_devid);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_blk_size(sd->sd_busidx, sd->sd_devidx, &sd->sd_blksize);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_nblocks(sd->sd_busidx, sd->sd_devidx, &sd->sd_nblocks);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_nregs(sd->sd_busidx, sd->sd_devidx, &sd->sd_nregs);
+ if (err)
+ goto out;
+
+ for (i = 0; i < sd->sd_nregs; i++) {
+ err = ps3repo_read_bus_dev_reg_id(sd->sd_busidx, sd->sd_devidx, i,
+ &sd->sd_regs[i].sr_id);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_reg_start(sd->sd_busidx, sd->sd_devidx, i,
+ &sd->sd_regs[i].sr_start);
+ if (err)
+ goto out;
+
+ err = ps3repo_read_bus_dev_reg_size(sd->sd_busidx, sd->sd_devidx, i,
+ &sd->sd_regs[i].sr_size);
+ if (err)
+ goto out;
+ }
+
+ if (!sd->sd_nregs) {
+ err = ENODEV;
+ goto out;
+ }
+
+ err = lv1_open_device(sd->sd_busid, sd->sd_devid, 0);
+ if (err)
+ goto out;
+
+ err = lv1_setup_dma(sd->sd_busid, sd->sd_devid, &sd->sd_dmabase);
+ if (err)
+ goto close_dev;
+
+ return 0;
+
+close_dev:
+
+ lv1_close_device(sd->sd_busid, sd->sd_devid);
+
+out:
+
+ return err;
+}
+
+int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx,
+ uint64_t start_sector, uint64_t sector_count, uint64_t flags, char *buf)
+{
+#define MIN(a, b) ((a) <= (b) ? (a) : (b))
+#define BOUNCE_SECTORS 4
+#define ASYNC_STATUS_POLL_PERIOD 100 /* microseconds */
+
+ struct ps3_storreg *reg = &sd->sd_regs[regidx];
+ char dma_buf[sd->sd_blksize * BOUNCE_SECTORS];
+ uint64_t nleft, nread, nsectors;
+ uint64_t tag, status;
+ unsigned int timeout;
+ int err;
+
+ nleft = sector_count;
+ nread = 0;
+
+ while (nleft) {
+ nsectors = MIN(nleft, BOUNCE_SECTORS);
+
+ err = lv1_storage_read(sd->sd_devid, reg->sr_id, start_sector + nread, nsectors,
+ flags, (uint32_t) dma_buf, &tag);
+ if (err)
+ return err;
+
+ timeout = 5000000; /* microseconds */
+
+ while (1) {
+ if (timeout < ASYNC_STATUS_POLL_PERIOD)
+ return ETIMEDOUT;
+
+ err = lv1_storage_check_async_status(sd->sd_devid, tag, &status);
+ if (!err && !status)
+ break;
+
+ delay(ASYNC_STATUS_POLL_PERIOD);
+ timeout -= ASYNC_STATUS_POLL_PERIOD;
+ }
+
+ memcpy(buf + nread * sd->sd_blksize, (u_char *) dma_buf, nsectors * sd->sd_blksize);
+ nread += nsectors;
+ nleft -= nsectors;
+ }
+
+ return 0;
+
+#undef MIN
+#undef BOUNCE_SECTORS
+#undef ASYNC_STATUS_POLL_PERIOD
+}
+
+void ps3stor_print(struct ps3_stordev *sd)
+{
+}
diff --git a/sys/boot/powerpc/ps3/ps3stor.h b/sys/boot/powerpc/ps3/ps3stor.h
new file mode 100644
index 0000000..350b716
--- /dev/null
+++ b/sys/boot/powerpc/ps3/ps3stor.h
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _PS3_STOR_H
+#define _PS3_STOR_H
+
+#define PS3_STOR_DEV_MAXREGS 8
+
+struct ps3_storreg {
+ uint64_t sr_id;
+ uint64_t sr_start;
+ uint64_t sr_size;
+};
+
+struct ps3_stordev {
+ int sd_type;
+ unsigned int sd_busidx;
+ unsigned int sd_devidx;
+ uint64_t sd_busid;
+ uint64_t sd_devid;
+ uint64_t sd_blksize;
+ uint64_t sd_nblocks;
+ uint64_t sd_nregs;
+ struct ps3_storreg sd_regs[PS3_STOR_DEV_MAXREGS];
+ uint64_t sd_dmabase;
+};
+
+int ps3stor_setup(struct ps3_stordev *sd, int type);
+
+int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx,
+ uint64_t start_sector, uint64_t sector_count, uint64_t flags, char *buf);
+
+void ps3stor_print(struct ps3_stordev *sd);
+
+#endif
diff --git a/sys/boot/powerpc/ps3/version b/sys/boot/powerpc/ps3/version
index fa0b185..fdac54e 100644
--- a/sys/boot/powerpc/ps3/version
+++ b/sys/boot/powerpc/ps3/version
@@ -3,4 +3,6 @@ $FreeBSD$
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
file is important. Make sure the current version number is on line 6.
+0.3: Added GPT support to disk.
+0.2: Added disk support.
0.1: Initial PS3/PowerPC version.
diff --git a/sys/boot/sparc64/loader/main.c b/sys/boot/sparc64/loader/main.c
index 9a3ae58..be0819f 100644
--- a/sys/boot/sparc64/loader/main.c
+++ b/sys/boot/sparc64/loader/main.c
@@ -96,10 +96,10 @@ static struct mmu_ops {
typedef void kernel_entry_t(vm_offset_t mdp, u_long o1, u_long o2, u_long o3,
void *openfirmware);
-static inline u_long dtlb_get_data_sun4u(u_int);
+static inline u_long dtlb_get_data_sun4u(u_int, u_int);
static int dtlb_enter_sun4u(u_int, u_long data, vm_offset_t);
static vm_offset_t dtlb_va_to_pa_sun4u(vm_offset_t);
-static inline u_long itlb_get_data_sun4u(u_int);
+static inline u_long itlb_get_data_sun4u(u_int, u_int);
static int itlb_enter_sun4u(u_int, u_long data, vm_offset_t);
static vm_offset_t itlb_va_to_pa_sun4u(vm_offset_t);
static void itlb_relocate_locked0_sun4u(void);
@@ -136,6 +136,7 @@ u_int itlb_slot;
static int cpu_impl;
static u_int dtlb_slot_max;
static u_int itlb_slot_max;
+static u_int tlb_locked;
static vm_offset_t curkva = 0;
static vm_offset_t heapva;
@@ -355,42 +356,55 @@ __elfN(exec)(struct preloaded_file *fp)
}
static inline u_long
-dtlb_get_data_sun4u(u_int slot)
+dtlb_get_data_sun4u(u_int tlb, u_int slot)
{
+ u_long data, pstate;
+ slot = TLB_DAR_SLOT(tlb, slot);
/*
- * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work
- * around errata of USIII and beyond.
+ * We read ASI_DTLB_DATA_ACCESS_REG twice back-to-back in order to
+ * work around errata of USIII and beyond.
*/
- (void)ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG);
- return (ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG));
+ pstate = rdpr(pstate);
+ wrpr(pstate, pstate & ~PSTATE_IE, 0);
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ wrpr(pstate, pstate, 0);
+ return (data);
}
static inline u_long
-itlb_get_data_sun4u(u_int slot)
+itlb_get_data_sun4u(u_int tlb, u_int slot)
{
+ u_long data, pstate;
+ slot = TLB_DAR_SLOT(tlb, slot);
/*
- * We read ASI_ITLB_DATA_ACCESS_REG twice in order to work
- * around errata of USIII and beyond.
+ * We read ASI_DTLB_DATA_ACCESS_REG twice back-to-back in order to
+ * work around errata of USIII and beyond.
*/
- (void)ldxa(TLB_DAR_SLOT(slot), ASI_ITLB_DATA_ACCESS_REG);
- return (ldxa(TLB_DAR_SLOT(slot), ASI_ITLB_DATA_ACCESS_REG));
+ pstate = rdpr(pstate);
+ wrpr(pstate, pstate & ~PSTATE_IE, 0);
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ wrpr(pstate, pstate, 0);
+ return (data);
}
static vm_offset_t
dtlb_va_to_pa_sun4u(vm_offset_t va)
{
u_long pstate, reg;
- int i;
+ u_int i, tlb;
pstate = rdpr(pstate);
wrpr(pstate, pstate & ~PSTATE_IE, 0);
for (i = 0; i < dtlb_slot_max; i++) {
- reg = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
+ reg = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_DTLB_TAG_READ_REG);
if (TLB_TAR_VA(reg) != va)
continue;
- reg = dtlb_get_data_sun4u(i);
+ reg = dtlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
reg >>= TD_PA_SHIFT;
if (cpu_impl == CPU_IMPL_SPARC64V ||
@@ -411,10 +425,11 @@ itlb_va_to_pa_sun4u(vm_offset_t va)
pstate = rdpr(pstate);
wrpr(pstate, pstate & ~PSTATE_IE, 0);
for (i = 0; i < itlb_slot_max; i++) {
- reg = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
+ reg = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_ITLB_TAG_READ_REG);
if (TLB_TAR_VA(reg) != va)
continue;
- reg = itlb_get_data_sun4u(i);
+ reg = itlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
reg >>= TD_PA_SHIFT;
if (cpu_impl == CPU_IMPL_SPARC64V ||
@@ -458,14 +473,14 @@ itlb_relocate_locked0_sun4u(void)
pstate = rdpr(pstate);
wrpr(pstate, pstate & ~PSTATE_IE, 0);
- data = itlb_get_data_sun4u(0);
+ data = itlb_get_data_sun4u(tlb_locked, 0);
if ((data & (TD_V | TD_L)) != (TD_V | TD_L)) {
wrpr(pstate, pstate, 0);
return;
}
/* Flush the mapping of slot 0. */
- tag = ldxa(TLB_DAR_SLOT(0), ASI_ITLB_TAG_READ_REG);
+ tag = ldxa(TLB_DAR_SLOT(tlb_locked, 0), ASI_ITLB_TAG_READ_REG);
stxa(TLB_DEMAP_VA(TLB_TAR_VA(tag)) | TLB_DEMAP_PRIMARY |
TLB_DEMAP_PAGE, ASI_IMMU_DEMAP, 0);
flush(0); /* The USIII-family ignores the address. */
@@ -475,11 +490,12 @@ itlb_relocate_locked0_sun4u(void)
* that formerly were in slot 0.
*/
for (i = 1; i < itlb_slot_max; i++) {
- if ((itlb_get_data_sun4u(i) & TD_V) != 0)
+ if ((itlb_get_data_sun4u(tlb_locked, i) & TD_V) != 0)
continue;
stxa(AA_IMMU_TAR, ASI_IMMU, tag);
- stxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG, data);
+ stxa(TLB_DAR_SLOT(tlb_locked, i), ASI_ITLB_DATA_ACCESS_REG,
+ data);
flush(0); /* The USIII-family ignores the address. */
break;
}
@@ -651,6 +667,26 @@ tlb_init_sun4u(void)
phandle_t bsp;
cpu_impl = VER_IMPL(rdpr(ver));
+ switch (cpu_impl) {
+ case CPU_IMPL_SPARC64:
+ case CPU_IMPL_ULTRASPARCI:
+ case CPU_IMPL_ULTRASPARCII:
+ case CPU_IMPL_ULTRASPARCIIi:
+ case CPU_IMPL_ULTRASPARCIIe:
+ tlb_locked = TLB_DAR_T32;
+ break;
+ case CPU_IMPL_ULTRASPARCIII:
+ case CPU_IMPL_ULTRASPARCIIIp:
+ case CPU_IMPL_ULTRASPARCIIIi:
+ case CPU_IMPL_ULTRASPARCIIIip:
+ case CPU_IMPL_ULTRASPARCIV:
+ case CPU_IMPL_ULTRASPARCIVp:
+ tlb_locked = TLB_DAR_T16;
+ break;
+ case CPU_IMPL_SPARC64V:
+ tlb_locked = TLB_DAR_FTLB;
+ break;
+ }
bsp = find_bsp_sun4u(OF_child(root), cpu_get_mid_sun4u());
if (bsp == 0)
panic("%s: no node for bootcpu?!?!", __func__);
@@ -821,21 +857,23 @@ pmap_print_tlb_sun4u(void)
pstate = rdpr(pstate);
for (i = 0; i < itlb_slot_max; i++) {
wrpr(pstate, pstate & ~PSTATE_IE, 0);
- tte = itlb_get_data_sun4u(i);
+ tte = itlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
if (!(tte & TD_V))
continue;
- tag = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
+ tag = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_ITLB_TAG_READ_REG);
printf("iTLB-%2u: ", i);
pmap_print_tte_sun4u(tag, tte);
}
for (i = 0; i < dtlb_slot_max; i++) {
wrpr(pstate, pstate & ~PSTATE_IE, 0);
- tte = dtlb_get_data_sun4u(i);
+ tte = dtlb_get_data_sun4u(tlb_locked, i);
wrpr(pstate, pstate, 0);
if (!(tte & TD_V))
continue;
- tag = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
+ tag = ldxa(TLB_DAR_SLOT(tlb_locked, i),
+ ASI_DTLB_TAG_READ_REG);
printf("dTLB-%2u: ", i);
pmap_print_tte_sun4u(tag, tte);
}
diff --git a/sys/boot/userboot/Makefile b/sys/boot/userboot/Makefile
new file mode 100644
index 0000000..f15c905
--- /dev/null
+++ b/sys/boot/userboot/Makefile
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+.include <bsd.own.mk>
+
+SUBDIR= ficl libstand test userboot
+
+.include <bsd.subdir.mk>
+
diff --git a/sys/boot/userboot/ficl/Makefile b/sys/boot/userboot/ficl/Makefile
new file mode 100644
index 0000000..af5d1461
--- /dev/null
+++ b/sys/boot/userboot/ficl/Makefile
@@ -0,0 +1,73 @@
+# $FreeBSD$
+#
+.include <bsd.own.mk>
+MK_SSP= no
+
+.PATH: ${.CURDIR}/../../ficl
+.PATH: ${.CURDIR}/../../ficl/${MACHINE_CPUARCH}
+BASE_SRCS= dict.c ficl.c fileaccess.c float.c loader.c math64.c \
+ prefix.c search.c stack.c tools.c vm.c words.c
+
+SRCS= ${BASE_SRCS} sysdep.c softcore.c
+CLEANFILES= softcore.c testmain testmain.o
+CFLAGS+= -ffreestanding -fPIC
+.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
+CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -mno-sse2
+.endif
+.if ${MACHINE_CPUARCH} == "i386"
+CFLAGS+= -mpreferred-stack-boundary=2
+CFLAGS+= -mno-sse3
+.endif
+.if ${MACHINE_CPUARCH} == "powerpc" || ${MACHINE_CPUARCH} == "arm"
+CFLAGS+= -msoft-float
+.endif
+.if ${MACHINE} == "pc98"
+CFLAGS+= -Os -DPC98
+.endif
+.if HAVE_PNP
+CFLAGS+= -DHAVE_PNP
+.endif
+.ifmake testmain
+CFLAGS+= -DTESTMAIN -D_TESTMAIN
+SRCS+= testmain.c
+PROG= testmain
+.include <bsd.prog.mk>
+.else
+LIB= ficl
+INTERNALLIB=
+.include <bsd.lib.mk>
+.endif
+
+# Standard softwords
+.PATH: ${.CURDIR}/../../ficl/softwords
+SOFTWORDS= softcore.fr jhlocal.fr marker.fr freebsd.fr ficllocal.fr \
+ ifbrack.fr
+# Optional OO extension softwords
+#SOFTWORDS+= oo.fr classes.fr
+
+#.if ${MACHINE_CPUARCH} == "amd64"
+#CFLAGS+= -m32 -march=i386 -I.
+#.endif
+
+.if ${MACHINE_ARCH} == "powerpc64"
+CFLAGS+= -m32 -mcpu=powerpc -I.
+.endif
+
+CFLAGS+= -I${.CURDIR}/../../ficl
+CFLAGS+= -I${.CURDIR}/../../ficl/${MACHINE_CPUARCH}
+CFLAGS+= -I${.CURDIR}/../../common
+
+softcore.c: ${SOFTWORDS} softcore.awk
+ (cd ${.CURDIR}/../../ficl/softwords; cat ${SOFTWORDS} \
+ | awk -f softcore.awk -v datestamp="`LC_ALL=C date`") > ${.TARGET}
+
+#.if ${MACHINE_CPUARCH} == "amd64"
+#${SRCS:M*.c:R:S/$/.o/g}: machine
+#
+#beforedepend ${OBJS}: machine
+#
+#machine:
+# ln -sf ${.CURDIR}/../../i386/include machine
+#
+#CLEANFILES+= machine
+#.endif
diff --git a/sys/boot/userboot/libstand/Makefile b/sys/boot/userboot/libstand/Makefile
new file mode 100644
index 0000000..9e71a24
--- /dev/null
+++ b/sys/boot/userboot/libstand/Makefile
@@ -0,0 +1,161 @@
+# $FreeBSD$
+# Originally from $NetBSD: Makefile,v 1.21 1997/10/26 22:08:38 lukem Exp $
+#
+# Notes:
+# - We don't use the libc strerror/sys_errlist because the string table is
+# quite large.
+#
+
+WITHOUT_SSP=
+NO_MAN=
+
+.include <bsd.own.mk>
+
+S= ${.CURDIR}/../../../../lib/libstand
+
+.PATH: ${S}
+LIB= stand
+INTERNALLIB=
+NO_PROFILE=
+NO_PIC=
+
+WARNS?= 0
+
+CFLAGS+= -ffreestanding -Wformat -fPIC
+CFLAGS+= -I${.CURDIR}/../../../../lib/libstand
+
+.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
+CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -mno-sse2
+.endif
+.if ${MACHINE_CPUARCH} == "i386"
+CFLAGS+= -mpreferred-stack-boundary=2
+CFLAGS+= -mno-sse3
+.endif
+.if ${MACHINE} == "pc98"
+CFLAGS+= -Os
+.endif
+.if ${MACHINE_CPUARCH} == "powerpc"
+CFLAGS+= -msoft-float -D_STANDALONE -DNETIF_DEBUG
+.endif
+.if ${MACHINE_CPUARCH} == "arm"
+CFLAGS+= -msoft-float -D_STANDALONE
+.endif
+
+# standalone components and stuff we have modified locally
+SRCS+= zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \
+ globals.c pager.c printf.c strdup.c strerror.c strtol.c random.c \
+ sbrk.c twiddle.c zalloc.c zalloc_malloc.c
+
+# private (pruned) versions of libc string functions
+SRCS+= strcasecmp.c
+
+LIBC= ${.CURDIR}/../../../../lib/libc
+
+.PATH: ${LIBC}/net
+
+SRCS+= ntoh.c
+
+# string functions from libc
+.PATH: ${LIBC}/string
+.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "powerpc" || \
+ ${MACHINE_CPUARCH} == "sparc64" || ${MACHINE_CPUARCH} == "amd64" || \
+ ${MACHINE_CPUARCH} == "arm"
+SRCS+= bcmp.c bcopy.c bzero.c ffs.c index.c memccpy.c memchr.c memcmp.c \
+ memcpy.c memmove.c memset.c qdivrem.c rindex.c strcat.c strchr.c \
+ strcmp.c strcpy.c strcspn.c strlen.c strncat.c strncmp.c strncpy.c \
+ strpbrk.c strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c
+.endif
+.if ${MACHINE_CPUARCH} == "arm"
+.PATH: ${LIBC}/arm/gen
+SRCS+= divsi3.S
+.endif
+.if ${MACHINE_CPUARCH} == "ia64"
+.PATH: ${LIBC}/ia64/string
+SRCS+= bcmp.c bcopy.S bzero.S ffs.S index.c memccpy.c memchr.c memcmp.c \
+ memcpy.S memmove.S memset.c rindex.c strcat.c strchr.c \
+ strcmp.c strcpy.c strcspn.c strlen.c \
+ strncat.c strncmp.c strncpy.c strpbrk.c strrchr.c strsep.c \
+ strspn.c strstr.c strtok.c swab.c
+
+.PATH: ${LIBC}/ia64/gen
+SRCS+= __divdi3.S __divsi3.S __moddi3.S __modsi3.S
+SRCS+= __udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S
+.endif
+.if ${MACHINE_CPUARCH} == "powerpc"
+.PATH: ${LIBC}/libc/quad
+SRCS+= ashldi3.c ashrdi3.c
+.PATH: ${LIBC}/powerpc/gen
+SRCS+= syncicache.c
+.endif
+
+# uuid functions from libc
+.PATH: ${LIBC}/uuid
+SRCS+= uuid_equal.c uuid_is_nil.c
+
+# _setjmp/_longjmp
+.if ${MACHINE_CPUARCH} == "amd64"
+.PATH: ${.CURDIR}/amd64
+.elif ${MACHINE_ARCH} == "powerpc64"
+.PATH: ${S}/powerpc
+.else
+.PATH: ${S}/${MACHINE_CPUARCH}
+.endif
+SRCS+= _setjmp.S
+
+# decompression functionality from libbz2
+# NOTE: to actually test this functionality after libbz2 upgrade compile
+# loader(8) with LOADER_BZIP2_SUPPORT defined
+.PATH: ${.CURDIR}/../../../../contrib/bzip2
+CFLAGS+= -DBZ_NO_STDIO -DBZ_NO_COMPRESS
+SRCS+= libstand_bzlib_private.h
+
+.for file in bzlib.c crctable.c decompress.c huffman.c randtable.c
+SRCS+= _${file}
+CLEANFILES+= _${file}
+
+_${file}: ${file}
+ sed "s|bzlib_private\.h|libstand_bzlib_private.h|" ${.ALLSRC} > ${.TARGET}
+.endfor
+
+CLEANFILES+= libstand_bzlib_private.h
+libstand_bzlib_private.h: bzlib_private.h
+ sed -e 's|<stdlib.h>|"stand.h"|' \
+ ${.ALLSRC} > ${.TARGET}
+
+# decompression functionality from libz
+.PATH: ${.CURDIR}/../../../../lib/libz
+CFLAGS+=-DHAVE_MEMCPY -I${.CURDIR}/../../../../lib/libz
+SRCS+= adler32.c crc32.c libstand_zutil.h
+
+.for file in infback.c inffast.c inflate.c inftrees.c zutil.c
+SRCS+= _${file}
+CLEANFILES+= _${file}
+
+_${file}: ${file}
+ sed "s|zutil\.h|libstand_zutil.h|" ${.ALLSRC} > ${.TARGET}
+.endfor
+
+# depend on stand.h being able to be included multiple times
+CLEANFILES+= libstand_zutil.h
+libstand_zutil.h: zutil.h
+ sed -e 's|<stddef.h>|"stand.h"|' \
+ -e 's|<string.h>|"stand.h"|' \
+ -e 's|<stdlib.h>|"stand.h"|' \
+ ${.ALLSRC} > ${.TARGET}
+
+# io routines
+SRCS+= closeall.c dev.c ioctl.c nullfs.c stat.c \
+ fstat.c close.c lseek.c open.c read.c write.c readdir.c
+
+# network routines
+SRCS+= arp.c ether.c inet_ntoa.c in_cksum.c net.c udp.c netif.c rpc.c
+
+# network info services:
+SRCS+= bootp.c rarp.c bootparam.c
+
+# boot filesystems
+SRCS+= ufs.c nfs.c cd9660.c tftp.c gzipfs.c bzipfs.c
+SRCS+= dosfs.c ext2fs.c
+SRCS+= splitfs.c
+
+.include <bsd.lib.mk>
diff --git a/sys/boot/userboot/libstand/amd64/_setjmp.S b/sys/boot/userboot/libstand/amd64/_setjmp.S
new file mode 100644
index 0000000..e841f49
--- /dev/null
+++ b/sys/boot/userboot/libstand/amd64/_setjmp.S
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+ .asciz "@(#)_setjmp.s 5.1 (Berkeley) 4/23/90"
+#endif /* LIBC_SCCS and not lint */
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * C library -- _setjmp, _longjmp
+ *
+ * _longjmp(a,v)
+ * will generate a "return(v)" from the last call to
+ * _setjmp(a)
+ * by restoring registers from the environment 'a'.
+ * The previous signal state is NOT restored.
+ */
+
+ENTRY(_setjmp)
+ movq %rdi,%rax
+ movq 0(%rsp),%rdx /* retval */
+ movq %rdx, 0(%rax) /* 0; retval */
+ movq %rbx, 8(%rax) /* 1; rbx */
+ movq %rsp,16(%rax) /* 2; rsp */
+ movq %rbp,24(%rax) /* 3; rbp */
+ movq %r12,32(%rax) /* 4; r12 */
+ movq %r13,40(%rax) /* 5; r13 */
+ movq %r14,48(%rax) /* 6; r14 */
+ movq %r15,56(%rax) /* 7; r15 */
+ fnstcw 64(%rax) /* 8; fpu cw */
+ stmxcsr 68(%rax) /* and mxcsr */
+ xorq %rax,%rax
+ ret
+END(_setjmp)
+
+ .weak CNAME(_longjmp)
+ENTRY(_longjmp)
+ movq %rdi,%rdx
+ /* Restore the mxcsr, but leave exception flags intact. */
+ stmxcsr -4(%rsp)
+ movl 68(%rdx),%eax
+ andl $0xffffffc0,%eax
+ movl -4(%rsp),%edi
+ andl $0x3f,%edi
+ xorl %eax,%edi
+ movl %edi,-4(%rsp)
+ ldmxcsr -4(%rsp)
+ movq %rsi,%rax /* retval */
+ movq 0(%rdx),%rcx
+ movq 8(%rdx),%rbx
+ movq 16(%rdx),%rsp
+ movq 24(%rdx),%rbp
+ movq 32(%rdx),%r12
+ movq 40(%rdx),%r13
+ movq 48(%rdx),%r14
+ movq 56(%rdx),%r15
+ fldcw 64(%rdx)
+ testq %rax,%rax
+ jnz 1f
+ incq %rax
+1: movq %rcx,0(%rsp)
+ ret
+END(_longjmp)
diff --git a/sys/boot/userboot/test/Makefile b/sys/boot/userboot/test/Makefile
new file mode 100644
index 0000000..24d89b7
--- /dev/null
+++ b/sys/boot/userboot/test/Makefile
@@ -0,0 +1,15 @@
+# $FreeBSD$
+
+
+NO_MAN=
+WITHOUT_SSP=
+
+.include <bsd.own.mk>
+
+PROG= test
+INTERNALPROG=
+
+CFLAGS+= -I${.CURDIR}/..
+CFLAGS+= -I${.CURDIR}/../../..
+
+.include <bsd.prog.mk>
diff --git a/sys/boot/userboot/test/test.c b/sys/boot/userboot/test/test.c
new file mode 100644
index 0000000..a752a80
--- /dev/null
+++ b/sys/boot/userboot/test/test.c
@@ -0,0 +1,428 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <dlfcn.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include <boot/userboot/userboot.h>
+
+char *host_base = NULL;
+struct termios term, oldterm;
+char *image;
+size_t image_size;
+int disk_fd = -1;
+
+uint64_t regs[16];
+uint64_t pc;
+
+void test_exit(void *arg, int v);
+
+/*
+ * Console i/o
+ */
+
+void
+test_putc(void *arg, int ch)
+{
+ char c = ch;
+
+ write(1, &c, 1);
+}
+
+int
+test_getc(void *arg)
+{
+ char c;
+
+ if (read(0, &c, 1) == 1)
+ return c;
+ return -1;
+}
+
+int
+test_poll(void *arg)
+{
+ int n;
+
+ if (ioctl(0, FIONREAD, &n) >= 0)
+ return (n > 0);
+ return (0);
+}
+
+/*
+ * Host filesystem i/o
+ */
+
+struct test_file {
+ int tf_isdir;
+ size_t tf_size;
+ struct stat tf_stat;
+ union {
+ int fd;
+ DIR *dir;
+ } tf_u;
+};
+
+int
+test_open(void *arg, const char *filename, void **h_return)
+{
+ struct stat st;
+ struct test_file *tf;
+ char path[PATH_MAX];
+
+ if (!host_base)
+ return (ENOENT);
+
+ strlcpy(path, host_base, PATH_MAX);
+ if (path[strlen(path) - 1] == '/')
+ path[strlen(path) - 1] = 0;
+ strlcat(path, filename, PATH_MAX);
+ tf = malloc(sizeof(struct test_file));
+ if (stat(path, &tf->tf_stat) < 0) {
+ free(tf);
+ return (errno);
+ }
+
+ tf->tf_size = st.st_size;
+ if (S_ISDIR(tf->tf_stat.st_mode)) {
+ tf->tf_isdir = 1;
+ tf->tf_u.dir = opendir(path);
+ if (!tf->tf_u.dir)
+ goto out;
+ *h_return = tf;
+ return (0);
+ }
+ if (S_ISREG(tf->tf_stat.st_mode)) {
+ tf->tf_isdir = 0;
+ tf->tf_u.fd = open(path, O_RDONLY);
+ if (tf->tf_u.fd < 0)
+ goto out;
+ *h_return = tf;
+ return (0);
+ }
+
+out:
+ free(tf);
+ return (EINVAL);
+}
+
+int
+test_close(void *arg, void *h)
+{
+ struct test_file *tf = h;
+
+ if (tf->tf_isdir)
+ closedir(tf->tf_u.dir);
+ else
+ close(tf->tf_u.fd);
+ free(tf);
+
+ return (0);
+}
+
+int
+test_isdir(void *arg, void *h)
+{
+ struct test_file *tf = h;
+
+ return (tf->tf_isdir);
+}
+
+int
+test_read(void *arg, void *h, void *dst, size_t size, size_t *resid_return)
+{
+ struct test_file *tf = h;
+ ssize_t sz;
+
+ if (tf->tf_isdir)
+ return (EINVAL);
+ sz = read(tf->tf_u.fd, dst, size);
+ if (sz < 0)
+ return (EINVAL);
+ *resid_return = size - sz;
+ return (0);
+}
+
+int
+test_readdir(void *arg, void *h, uint32_t *fileno_return, uint8_t *type_return,
+ size_t *namelen_return, char *name)
+{
+ struct test_file *tf = h;
+ struct dirent *dp;
+
+ if (!tf->tf_isdir)
+ return (EINVAL);
+
+ dp = readdir(tf->tf_u.dir);
+ if (!dp)
+ return (ENOENT);
+
+ /*
+ * Note: d_namlen is in the range 0..255 and therefore less
+ * than PATH_MAX so we don't need to test before copying.
+ */
+ *fileno_return = dp->d_fileno;
+ *type_return = dp->d_type;
+ *namelen_return = dp->d_namlen;
+ memcpy(name, dp->d_name, dp->d_namlen);
+ name[dp->d_namlen] = 0;
+
+ return (0);
+}
+
+int
+test_seek(void *arg, void *h, uint64_t offset, int whence)
+{
+ struct test_file *tf = h;
+
+ if (tf->tf_isdir)
+ return (EINVAL);
+ if (lseek(tf->tf_u.fd, offset, whence) < 0)
+ return (errno);
+ return (0);
+}
+
+int
+test_stat(void *arg, void *h, int *mode_return, int *uid_return, int *gid_return,
+ uint64_t *size_return)
+{
+ struct test_file *tf = h;
+
+ *mode_return = tf->tf_stat.st_mode;
+ *uid_return = tf->tf_stat.st_uid;
+ *gid_return = tf->tf_stat.st_gid;
+ *size_return = tf->tf_stat.st_size;
+ return (0);
+}
+
+/*
+ * Disk image i/o
+ */
+
+int
+test_diskread(void *arg, int unit, uint64_t offset, void *dst, size_t size,
+ size_t *resid_return)
+{
+ ssize_t n;
+
+ if (unit != 0 || disk_fd == -1)
+ return (EIO);
+ n = pread(disk_fd, dst, size, offset);
+ if (n < 0)
+ return (errno);
+ *resid_return = size - n;
+ return (0);
+}
+
+/*
+ * Guest virtual machine i/o
+ *
+ * Note: guest addresses are kernel virtual
+ */
+
+int
+test_copyin(void *arg, const void *from, uint64_t to, size_t size)
+{
+
+ to &= 0x7fffffff;
+ if (to > image_size)
+ return (EFAULT);
+ if (to + size > image_size)
+ size = image_size - to;
+ memcpy(&image[to], from, size);
+}
+
+int
+test_copyout(void *arg, uint64_t from, void *to, size_t size)
+{
+
+ from &= 0x7fffffff;
+ if (from > image_size)
+ return (EFAULT);
+ if (from + size > image_size)
+ size = image_size - from;
+ memcpy(to, &image[from], size);
+}
+
+void
+test_setreg(void *arg, int r, uint64_t v)
+{
+
+ if (r < 0 || r >= 16)
+ return;
+ regs[r] = v;
+}
+
+void
+test_setmsr(void *arg, int r, uint64_t v)
+{
+}
+
+void
+test_setcr(void *arg, int r, uint64_t v)
+{
+}
+
+void
+test_setgdt(void *arg, uint64_t v, size_t sz)
+{
+}
+
+void
+test_exec(void *arg, uint64_t pc)
+{
+ printf("Execute at 0x%llx\n", pc);
+ test_exit(arg, 0);
+}
+
+/*
+ * Misc
+ */
+
+void
+test_delay(void *arg, int usec)
+{
+
+ usleep(usec);
+}
+
+void
+test_exit(void *arg, int v)
+{
+
+ tcsetattr(0, TCSAFLUSH, &oldterm);
+ exit(v);
+}
+
+void
+test_getmem(void *arg, uint64_t *lowmem, uint64_t *highmem)
+{
+
+ *lowmem = 128*1024*1024;
+ *highmem = 0;
+}
+
+struct loader_callbacks_v1 cb = {
+ .putc = test_putc,
+ .getc = test_getc,
+ .poll = test_poll,
+
+ .open = test_open,
+ .close = test_close,
+ .isdir = test_isdir,
+ .read = test_read,
+ .readdir = test_readdir,
+ .seek = test_seek,
+ .stat = test_stat,
+
+ .diskread = test_diskread,
+
+ .copyin = test_copyin,
+ .copyout = test_copyout,
+ .setreg = test_setreg,
+ .setmsr = test_setmsr,
+ .setcr = test_setcr,
+ .setgdt = test_setgdt,
+ .exec = test_exec,
+
+ .delay = test_delay,
+ .exit = test_exit,
+ .getmem = test_getmem,
+};
+
+void
+usage()
+{
+
+ printf("usage: %s [-d <disk image path>] [-h <host filesystem path>\n");
+ exit(1);
+}
+
+int
+main(int argc, char** argv)
+{
+ void *h;
+ void (*func)(struct loader_callbacks_v1 *, void *, int, int);
+ int opt;
+ char *disk_image = NULL;
+
+ while ((opt = getopt(argc, argv, "d:h:")) != -1) {
+ switch (opt) {
+ case 'd':
+ disk_image = optarg;
+ break;
+
+ case 'h':
+ host_base = optarg;
+ break;
+
+ case '?':
+ usage();
+ }
+ }
+
+ h = dlopen("/boot/userboot.so",
+ RTLD_LOCAL);
+ if (!h) {
+ printf("%s\n", dlerror());
+ return (1);
+ }
+ func = dlsym(h, "loader_main");
+ if (!func) {
+ printf("%s\n", dlerror());
+ return (1);
+ }
+
+ image_size = 128*1024*1024;
+ image = malloc(image_size);
+ if (disk_image) {
+ disk_fd = open(disk_image, O_RDONLY);
+ if (disk_fd < 0)
+ err(1, "Can't open disk image '%s'", disk_image);
+ }
+
+ tcgetattr(0, &term);
+ oldterm = term;
+ term.c_iflag &= ~(ICRNL);
+ term.c_lflag &= ~(ICANON|ECHO);
+ tcsetattr(0, TCSAFLUSH, &term);
+
+ func(&cb, NULL, USERBOOT_VERSION_1, disk_fd >= 0);
+}
diff --git a/sys/boot/userboot/userboot.h b/sys/boot/userboot/userboot.h
new file mode 100644
index 0000000..7d8263e
--- /dev/null
+++ b/sys/boot/userboot/userboot.h
@@ -0,0 +1,178 @@
+/*-
+ * Copyright (c) 2011 Doug Rabson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * USERBOOT interface versions
+ */
+#define USERBOOT_VERSION_1 1
+
+/*
+ * Exit codes from the loader
+ */
+#define USERBOOT_EXIT_QUIT 1
+#define USERBOOT_EXIT_REBOOT 2
+
+struct loader_callbacks_v1 {
+ /*
+ * Console i/o
+ */
+
+ /*
+ * Wait until a key is pressed on the console and then return it
+ */
+ int (*getc)(void *arg);
+
+ /*
+ * Write the character ch to the console
+ */
+ void (*putc)(void *arg, int ch);
+
+ /*
+ * Return non-zero if a key can be read from the console
+ */
+ int (*poll)(void *arg);
+
+ /*
+ * Host filesystem i/o
+ */
+
+ /*
+ * Open a file in the host filesystem
+ */
+ int (*open)(void *arg, const char *filename, void **h_return);
+
+ /*
+ * Close a file
+ */
+ int (*close)(void *arg, void *h);
+
+ /*
+ * Return non-zero if the file is a directory
+ */
+ int (*isdir)(void *arg, void *h);
+
+ /*
+ * Read size bytes from a file. The number of bytes remaining
+ * in dst after reading is returned in *resid_return
+ */
+ int (*read)(void *arg, void *h, void *dst, size_t size,
+ size_t *resid_return);
+
+ /*
+ * Read an entry from a directory. The entry's inode number is
+ * returned in *fileno_return, its type in *type_return and
+ * the name length in *namelen_return. The name itself is
+ * copied to the buffer name which must be at least PATH_MAX
+ * in size.
+ */
+ int (*readdir)(void *arg, void *h, uint32_t *fileno_return,
+ uint8_t *type_return, size_t *namelen_return, char *name);
+
+ /*
+ * Seek to a location within an open file
+ */
+ int (*seek)(void *arg, void *h, uint64_t offset,
+ int whence);
+
+ /*
+ * Return some stat(2) related information about the file
+ */
+ int (*stat)(void *arg, void *h, int *mode_return,
+ int *uid_return, int *gid_return, uint64_t *size_return);
+
+ /*
+ * Disk image i/o
+ */
+
+ /*
+ * Read from a disk image at the given offset
+ */
+ int (*diskread)(void *arg, int unit, uint64_t offset,
+ void *dst, size_t size, size_t *resid_return);
+
+ /*
+ * Guest virtual machine i/o
+ */
+
+ /*
+ * Copy to the guest address space
+ */
+ int (*copyin)(void *arg, const void *from,
+ uint64_t to, size_t size);
+
+ /*
+ * Copy from the guest address space
+ */
+ int (*copyout)(void *arg, uint64_t from,
+ void *to, size_t size);
+
+ /*
+ * Set a guest register value
+ */
+ void (*setreg)(void *arg, int, uint64_t);
+
+ /*
+ * Set a guest MSR value
+ */
+ void (*setmsr)(void *arg, int, uint64_t);
+
+ /*
+ * Set a guest CR value
+ */
+ void (*setcr)(void *arg, int, uint64_t);
+
+ /*
+ * Set the guest GDT address
+ */
+ void (*setgdt)(void *arg, uint64_t, size_t);
+
+ /*
+ * Transfer control to the guest at the given address
+ */
+ void (*exec)(void *arg, uint64_t pc);
+
+ /*
+ * Misc
+ */
+
+ /*
+ * Sleep for usec microseconds
+ */
+ void (*delay)(void *arg, int usec);
+
+ /*
+ * Exit with the given exit code
+ */
+ void (*exit)(void *arg, int v);
+
+ /*
+ * Return guest physical memory map details
+ */
+ void (*getmem)(void *arg, uint64_t *lowmem,
+ uint64_t *highmem);
+};
diff --git a/sys/boot/userboot/userboot/Makefile b/sys/boot/userboot/userboot/Makefile
new file mode 100644
index 0000000..28ddc12
--- /dev/null
+++ b/sys/boot/userboot/userboot/Makefile
@@ -0,0 +1,61 @@
+# $FreeBSD$
+
+NO_MAN=
+WITHOUT_SSP=
+
+.include <bsd.own.mk>
+
+SHLIB_NAME= userboot.so
+NO_CTF= yes
+STRIP=
+LIBDIR= /boot
+
+SRCS= autoload.c
+SRCS+= bootinfo.c
+SRCS+= bootinfo32.c
+SRCS+= bootinfo64.c
+SRCS+= conf.c
+SRCS+= console.c
+SRCS+= copy.c
+SRCS+= devicename.c
+SRCS+= elf32_freebsd.c
+SRCS+= elf64_freebsd.c
+SRCS+= host.c
+SRCS+= main.c
+SRCS+= userboot_cons.c
+SRCS+= userboot_disk.c
+SRCS+= vers.c
+
+CFLAGS+= -Wall
+CFLAGS+= -I${.CURDIR}/..
+CFLAGS+= -I${.CURDIR}/../../common
+CFLAGS+= -I${.CURDIR}/../../..
+CFLAGS+= -I${.CURDIR}/../../../../lib/libstand
+CFLAGS+= -ffreestanding -I.
+CFLAGS+= -DLOADER_GPT_SUPPORT -DLOADER_MBR_SUPPORT
+
+LDFLAGS+= -nostdlib -Wl,-Bsymbolic
+
+NEWVERSWHAT= "User boot" ${MACHINE_CPUARCH}
+
+vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version
+ sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT}
+
+CLEANFILES= vers.c
+
+.if ${MK_FORTH} != "no"
+BOOT_FORTH= yes
+CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/i386
+LIBFICL= ${.OBJDIR}/../ficl/libficl.a
+LIBSTAND= ${.OBJDIR}/../libstand/libstand.a
+.endif
+
+# Always add MI sources
+.PATH: ${.CURDIR}/../../common
+.include "${.CURDIR}/../../common/Makefile.inc"
+CFLAGS+= -I${.CURDIR}/../../common
+CFLAGS+= -I.
+DPADD= ${LIBFICL} ${LIBSTAND}
+LDADD= ${LIBFICL} ${LIBSTAND}
+
+.include <bsd.lib.mk>
diff --git a/sys/boot/userboot/userboot/autoload.c b/sys/boot/userboot/userboot/autoload.c
new file mode 100644
index 0000000..a86afcf
--- /dev/null
+++ b/sys/boot/userboot/userboot/autoload.c
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+int
+userboot_autoload(void)
+{
+
+ return (0);
+}
diff --git a/sys/boot/userboot/userboot/bootinfo.c b/sys/boot/userboot/userboot/bootinfo.c
new file mode 100644
index 0000000..75ad5e7
--- /dev/null
+++ b/sys/boot/userboot/userboot/bootinfo.c
@@ -0,0 +1,192 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include <sys/param.h>
+#include <sys/reboot.h>
+#include <sys/linker.h>
+
+#include "bootstrap.h"
+#include "libuserboot.h"
+
+/*
+ * Return a 'boothowto' value corresponding to the kernel arguments in
+ * (kargs) and any relevant environment variables.
+ */
+static struct
+{
+ const char *ev;
+ int mask;
+} howto_names[] = {
+ {"boot_askname", RB_ASKNAME},
+ {"boot_cdrom", RB_CDROM},
+ {"boot_ddb", RB_KDB},
+ {"boot_dfltroot", RB_DFLTROOT},
+ {"boot_gdb", RB_GDB},
+ {"boot_multicons", RB_MULTIPLE},
+ {"boot_mute", RB_MUTE},
+ {"boot_pause", RB_PAUSE},
+ {"boot_serial", RB_SERIAL},
+ {"boot_single", RB_SINGLE},
+ {"boot_verbose", RB_VERBOSE},
+ {NULL, 0}
+};
+
+int
+bi_getboothowto(char *kargs)
+{
+ char *cp;
+ char *curpos, *next, *string;
+ int howto;
+ int active;
+ int i;
+ int vidconsole;
+
+ /* Parse kargs */
+ howto = 0;
+ if (kargs != NULL) {
+ cp = kargs;
+ active = 0;
+ while (*cp != 0) {
+ if (!active && (*cp == '-')) {
+ active = 1;
+ } else if (active)
+ switch (*cp) {
+ case 'a':
+ howto |= RB_ASKNAME;
+ break;
+ case 'C':
+ howto |= RB_CDROM;
+ break;
+ case 'd':
+ howto |= RB_KDB;
+ break;
+ case 'D':
+ howto |= RB_MULTIPLE;
+ break;
+ case 'm':
+ howto |= RB_MUTE;
+ break;
+ case 'g':
+ howto |= RB_GDB;
+ break;
+ case 'h':
+ howto |= RB_SERIAL;
+ break;
+ case 'p':
+ howto |= RB_PAUSE;
+ break;
+ case 'r':
+ howto |= RB_DFLTROOT;
+ break;
+ case 's':
+ howto |= RB_SINGLE;
+ break;
+ case 'v':
+ howto |= RB_VERBOSE;
+ break;
+ default:
+ active = 0;
+ break;
+ }
+ cp++;
+ }
+ }
+ /* get equivalents from the environment */
+ for (i = 0; howto_names[i].ev != NULL; i++)
+ if (getenv(howto_names[i].ev) != NULL)
+ howto |= howto_names[i].mask;
+
+ /* Enable selected consoles */
+ string = next = strdup(getenv("console"));
+ vidconsole = 0;
+ while (next != NULL) {
+ curpos = strsep(&next, " ,");
+ if (*curpos == '\0')
+ continue;
+ if (!strcmp(curpos, "vidconsole"))
+ vidconsole = 1;
+ else if (!strcmp(curpos, "comconsole"))
+ howto |= RB_SERIAL;
+ else if (!strcmp(curpos, "nullconsole"))
+ howto |= RB_MUTE;
+ }
+
+ if (vidconsole && (howto & RB_SERIAL))
+ howto |= RB_MULTIPLE;
+
+ /*
+ * XXX: Note that until the kernel is ready to respect multiple consoles
+ * for the boot messages, the first named console is the primary console
+ */
+ if (!strcmp(string, "vidconsole"))
+ howto &= ~RB_SERIAL;
+
+ free(string);
+
+ return(howto);
+}
+
+void
+bi_setboothowto(int howto)
+{
+ int i;
+
+ for (i = 0; howto_names[i].ev != NULL; i++)
+ if (howto & howto_names[i].mask)
+ setenv(howto_names[i].ev, "YES", 1);
+}
+
+/*
+ * Copy the environment into the load area starting at (addr).
+ * Each variable is formatted as <name>=<value>, with a single nul
+ * separating each variable, and a double nul terminating the environment.
+ */
+vm_offset_t
+bi_copyenv(vm_offset_t addr)
+{
+ struct env_var *ep;
+
+ /* traverse the environment */
+ for (ep = environ; ep != NULL; ep = ep->ev_next) {
+ CALLBACK(copyin, ep->ev_name, addr, strlen(ep->ev_name));
+ addr += strlen(ep->ev_name);
+ CALLBACK(copyin, "=", addr, 1);
+ addr++;
+ if (ep->ev_value != NULL) {
+ CALLBACK(copyin, ep->ev_value, addr, strlen(ep->ev_value));
+ addr += strlen(ep->ev_value);
+ }
+ CALLBACK(copyin, "", addr, 1);
+ addr++;
+ }
+ CALLBACK(copyin, "", addr, 1);
+ addr++;
+ return(addr);
+}
diff --git a/sys/boot/userboot/userboot/bootinfo32.c b/sys/boot/userboot/userboot/bootinfo32.c
new file mode 100644
index 0000000..00784c9
--- /dev/null
+++ b/sys/boot/userboot/userboot/bootinfo32.c
@@ -0,0 +1,264 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include <sys/param.h>
+#include <sys/reboot.h>
+#include <sys/linker.h>
+#include <i386/include/bootinfo.h>
+
+#include "bootstrap.h"
+#include "libuserboot.h"
+
+static struct bootinfo bi;
+
+/*
+ * Copy module-related data into the load area, where it can be
+ * used as a directory for loaded modules.
+ *
+ * Module data is presented in a self-describing format. Each datum
+ * is preceded by a 32-bit identifier and a 32-bit size field.
+ *
+ * Currently, the following data are saved:
+ *
+ * MOD_NAME (variable) module name (string)
+ * MOD_TYPE (variable) module type (string)
+ * MOD_ARGS (variable) module parameters (string)
+ * MOD_ADDR sizeof(vm_offset_t) module load address
+ * MOD_SIZE sizeof(size_t) module size
+ * MOD_METADATA (variable) type-specific metadata
+ */
+#define COPY32(v, a, c) { \
+ u_int32_t x = (v); \
+ if (c) \
+ CALLBACK(copyin, &x, a, sizeof(x)); \
+ a += sizeof(x); \
+}
+
+#define MOD_STR(t, a, s, c) { \
+ COPY32(t, a, c); \
+ COPY32(strlen(s) + 1, a, c); \
+ if (c) \
+ CALLBACK(copyin, s, a, strlen(s) + 1); \
+ a += roundup(strlen(s) + 1, sizeof(u_long));\
+}
+
+#define MOD_NAME(a, s, c) MOD_STR(MODINFO_NAME, a, s, c)
+#define MOD_TYPE(a, s, c) MOD_STR(MODINFO_TYPE, a, s, c)
+#define MOD_ARGS(a, s, c) MOD_STR(MODINFO_ARGS, a, s, c)
+
+#define MOD_VAR(t, a, s, c) { \
+ COPY32(t, a, c); \
+ COPY32(sizeof(s), a, c); \
+ if (c) \
+ CALLBACK(copyin, &s, a, sizeof(s)); \
+ a += roundup(sizeof(s), sizeof(u_long)); \
+}
+
+#define MOD_ADDR(a, s, c) MOD_VAR(MODINFO_ADDR, a, s, c)
+#define MOD_SIZE(a, s, c) MOD_VAR(MODINFO_SIZE, a, s, c)
+
+#define MOD_METADATA(a, mm, c) { \
+ COPY32(MODINFO_METADATA | mm->md_type, a, c); \
+ COPY32(mm->md_size, a, c); \
+ if (c) \
+ CALLBACK(copyin, mm->md_data, a, mm->md_size); \
+ a += roundup(mm->md_size, sizeof(u_long));\
+}
+
+#define MOD_END(a, c) { \
+ COPY32(MODINFO_END, a, c); \
+ COPY32(0, a, c); \
+}
+
+static vm_offset_t
+bi_copymodules32(vm_offset_t addr)
+{
+ struct preloaded_file *fp;
+ struct file_metadata *md;
+ int c;
+
+ c = addr != 0;
+ /* start with the first module on the list, should be the kernel */
+ for (fp = file_findfile(NULL, NULL); fp != NULL; fp = fp->f_next) {
+
+ MOD_NAME(addr, fp->f_name, c); /* this field must come first */
+ MOD_TYPE(addr, fp->f_type, c);
+ if (fp->f_args)
+ MOD_ARGS(addr, fp->f_args, c);
+ MOD_ADDR(addr, fp->f_addr, c);
+ MOD_SIZE(addr, fp->f_size, c);
+ for (md = fp->f_metadata; md != NULL; md = md->md_next)
+ if (!(md->md_type & MODINFOMD_NOCOPY))
+ MOD_METADATA(addr, md, c);
+ }
+ MOD_END(addr, c);
+ return(addr);
+}
+
+/*
+ * Load the information expected by an i386 kernel.
+ *
+ * - The 'boothowto' argument is constructed
+ * - The 'bootdev' argument is constructed
+ * - The 'bootinfo' struct is constructed, and copied into the kernel space.
+ * - The kernel environment is copied into kernel space.
+ * - Module metadata are formatted and placed in kernel space.
+ */
+int
+bi_load32(char *args, int *howtop, int *bootdevp, vm_offset_t *bip, vm_offset_t *modulep, vm_offset_t *kernendp)
+{
+ struct preloaded_file *xp, *kfp;
+ struct i386_devdesc *rootdev;
+ struct file_metadata *md;
+ vm_offset_t addr;
+ vm_offset_t kernend;
+ vm_offset_t envp;
+ vm_offset_t size;
+ vm_offset_t ssym, esym;
+ char *rootdevname;
+ int bootdevnr, i, howto;
+ char *kernelname;
+ const char *kernelpath;
+
+ howto = bi_getboothowto(args);
+
+ /*
+ * Allow the environment variable 'rootdev' to override the supplied device
+ * This should perhaps go to MI code and/or have $rootdev tested/set by
+ * MI code before launching the kernel.
+ */
+ rootdevname = getenv("rootdev");
+ userboot_getdev((void **)(&rootdev), rootdevname, NULL);
+ if (rootdev == NULL) { /* bad $rootdev/$currdev */
+ printf("can't determine root device\n");
+ return(EINVAL);
+ }
+
+ /* Try reading the /etc/fstab file to select the root device */
+ getrootmount(userboot_fmtdev((void *)rootdev));
+
+ bootdevnr = 0;
+#if 0
+ if (bootdevnr == -1) {
+ printf("root device %s invalid\n", i386_fmtdev(rootdev));
+ return (EINVAL);
+ }
+#endif
+ free(rootdev);
+
+ /* find the last module in the chain */
+ addr = 0;
+ for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) {
+ if (addr < (xp->f_addr + xp->f_size))
+ addr = xp->f_addr + xp->f_size;
+ }
+ /* pad to a page boundary */
+ addr = roundup(addr, PAGE_SIZE);
+
+ /* copy our environment */
+ envp = addr;
+ addr = bi_copyenv(addr);
+
+ /* pad to a page boundary */
+ addr = roundup(addr, PAGE_SIZE);
+
+ kfp = file_findfile(NULL, "elf kernel");
+ if (kfp == NULL)
+ kfp = file_findfile(NULL, "elf32 kernel");
+ if (kfp == NULL)
+ panic("can't find kernel file");
+ kernend = 0; /* fill it in later */
+ file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto);
+ file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp);
+ file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend);
+#if 0
+ bios_addsmapdata(kfp);
+#endif
+
+ /* Figure out the size and location of the metadata */
+ *modulep = addr;
+ size = bi_copymodules32(0);
+ kernend = roundup(addr + size, PAGE_SIZE);
+ *kernendp = kernend;
+
+ /* patch MODINFOMD_KERNEND */
+ md = file_findmetadata(kfp, MODINFOMD_KERNEND);
+ bcopy(&kernend, md->md_data, sizeof kernend);
+
+ /* copy module list and metadata */
+ (void)bi_copymodules32(addr);
+
+ ssym = esym = 0;
+ md = file_findmetadata(kfp, MODINFOMD_SSYM);
+ if (md != NULL)
+ ssym = *((vm_offset_t *)&(md->md_data));
+ md = file_findmetadata(kfp, MODINFOMD_ESYM);
+ if (md != NULL)
+ esym = *((vm_offset_t *)&(md->md_data));
+ if (ssym == 0 || esym == 0)
+ ssym = esym = 0; /* sanity */
+
+ /* legacy bootinfo structure */
+ kernelname = getenv("kernelname");
+ userboot_getdev(NULL, kernelname, &kernelpath);
+ bi.bi_version = BOOTINFO_VERSION;
+ bi.bi_kernelname = 0; /* XXX char * -> kernel name */
+ bi.bi_nfs_diskless = 0; /* struct nfs_diskless * */
+ bi.bi_n_bios_used = 0; /* XXX would have to hook biosdisk driver for these */
+#if 0
+ for (i = 0; i < N_BIOS_GEOM; i++)
+ bi.bi_bios_geom[i] = bd_getbigeom(i);
+#endif
+ bi.bi_size = sizeof(bi);
+ bi.bi_memsizes_valid = 1;
+#if 0
+ bi.bi_basemem = bios_basemem / 1024;
+ bi.bi_extmem = bios_extmem / 1024;
+#endif
+ bi.bi_envp = envp;
+ bi.bi_modulep = *modulep;
+ bi.bi_kernend = kernend;
+ bi.bi_symtab = ssym; /* XXX this is only the primary kernel symtab */
+ bi.bi_esymtab = esym;
+
+ /*
+ * Copy the legacy bootinfo and kernel name to the guest at 0x2000
+ */
+ bi.bi_kernelname = (char *) (0x2000 + sizeof(bi));
+ CALLBACK(copyin, &bi, 0x2000, sizeof(bi));
+ CALLBACK(copyin, kernelname, 0x2000 + sizeof(bi), strlen(kernelname) + 1);
+
+ /* legacy boot arguments */
+ *howtop = howto | RB_BOOTINFO;
+ *bootdevp = bootdevnr;
+ *bip = 0x2000;
+
+ return(0);
+}
diff --git a/sys/boot/userboot/userboot/bootinfo64.c b/sys/boot/userboot/userboot/bootinfo64.c
new file mode 100644
index 0000000..fc7c14d
--- /dev/null
+++ b/sys/boot/userboot/userboot/bootinfo64.c
@@ -0,0 +1,304 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include <sys/param.h>
+#include <sys/reboot.h>
+#include <sys/linker.h>
+#include <i386/include/bootinfo.h>
+#include <machine/cpufunc.h>
+#include <machine/psl.h>
+#include <machine/specialreg.h>
+
+#include "bootstrap.h"
+#include "libuserboot.h"
+
+/*
+ * Copy module-related data into the load area, where it can be
+ * used as a directory for loaded modules.
+ *
+ * Module data is presented in a self-describing format. Each datum
+ * is preceded by a 32-bit identifier and a 32-bit size field.
+ *
+ * Currently, the following data are saved:
+ *
+ * MOD_NAME (variable) module name (string)
+ * MOD_TYPE (variable) module type (string)
+ * MOD_ARGS (variable) module parameters (string)
+ * MOD_ADDR sizeof(vm_offset_t) module load address
+ * MOD_SIZE sizeof(size_t) module size
+ * MOD_METADATA (variable) type-specific metadata
+ */
+#define COPY32(v, a, c) { \
+ u_int32_t x = (v); \
+ if (c) \
+ CALLBACK(copyin, &x, a, sizeof(x)); \
+ a += sizeof(x); \
+}
+
+#define MOD_STR(t, a, s, c) { \
+ COPY32(t, a, c); \
+ COPY32(strlen(s) + 1, a, c); \
+ if (c) \
+ CALLBACK(copyin, s, a, strlen(s) + 1); \
+ a += roundup(strlen(s) + 1, sizeof(u_int64_t));\
+}
+
+#define MOD_NAME(a, s, c) MOD_STR(MODINFO_NAME, a, s, c)
+#define MOD_TYPE(a, s, c) MOD_STR(MODINFO_TYPE, a, s, c)
+#define MOD_ARGS(a, s, c) MOD_STR(MODINFO_ARGS, a, s, c)
+
+#define MOD_VAR(t, a, s, c) { \
+ COPY32(t, a, c); \
+ COPY32(sizeof(s), a, c); \
+ if (c) \
+ CALLBACK(copyin, &s, a, sizeof(s)); \
+ a += roundup(sizeof(s), sizeof(u_int64_t)); \
+}
+
+#define MOD_ADDR(a, s, c) MOD_VAR(MODINFO_ADDR, a, s, c)
+#define MOD_SIZE(a, s, c) MOD_VAR(MODINFO_SIZE, a, s, c)
+
+#define MOD_METADATA(a, mm, c) { \
+ COPY32(MODINFO_METADATA | mm->md_type, a, c); \
+ COPY32(mm->md_size, a, c); \
+ if (c) \
+ CALLBACK(copyin, mm->md_data, a, mm->md_size); \
+ a += roundup(mm->md_size, sizeof(u_int64_t));\
+}
+
+#define MOD_END(a, c) { \
+ COPY32(MODINFO_END, a, c); \
+ COPY32(0, a, c); \
+}
+
+static vm_offset_t
+bi_copymodules64(vm_offset_t addr)
+{
+ struct preloaded_file *fp;
+ struct file_metadata *md;
+ int c;
+ u_int64_t v;
+
+ c = addr != 0;
+ /* start with the first module on the list, should be the kernel */
+ for (fp = file_findfile(NULL, NULL); fp != NULL; fp = fp->f_next) {
+
+ MOD_NAME(addr, fp->f_name, c); /* this field must come first */
+ MOD_TYPE(addr, fp->f_type, c);
+ if (fp->f_args)
+ MOD_ARGS(addr, fp->f_args, c);
+ v = fp->f_addr;
+ MOD_ADDR(addr, v, c);
+ v = fp->f_size;
+ MOD_SIZE(addr, v, c);
+ for (md = fp->f_metadata; md != NULL; md = md->md_next)
+ if (!(md->md_type & MODINFOMD_NOCOPY))
+ MOD_METADATA(addr, md, c);
+ }
+ MOD_END(addr, c);
+ return(addr);
+}
+
+/*
+ * Check to see if this CPU supports long mode.
+ */
+static int
+bi_checkcpu(void)
+{
+#if 0
+ char *cpu_vendor;
+ int vendor[3];
+ int eflags, regs[4];
+
+ /* Check for presence of "cpuid". */
+ eflags = read_eflags();
+ write_eflags(eflags ^ PSL_ID);
+ if (!((eflags ^ read_eflags()) & PSL_ID))
+ return (0);
+
+ /* Fetch the vendor string. */
+ do_cpuid(0, regs);
+ vendor[0] = regs[1];
+ vendor[1] = regs[3];
+ vendor[2] = regs[2];
+ cpu_vendor = (char *)vendor;
+
+ /* Check for vendors that support AMD features. */
+ if (strncmp(cpu_vendor, INTEL_VENDOR_ID, 12) != 0 &&
+ strncmp(cpu_vendor, AMD_VENDOR_ID, 12) != 0 &&
+ strncmp(cpu_vendor, CENTAUR_VENDOR_ID, 12) != 0)
+ return (0);
+
+ /* Has to support AMD features. */
+ do_cpuid(0x80000000, regs);
+ if (!(regs[0] >= 0x80000001))
+ return (0);
+
+ /* Check for long mode. */
+ do_cpuid(0x80000001, regs);
+ return (regs[3] & AMDID_LM);
+#else
+ return (1);
+#endif
+}
+
+struct smap {
+ uint64_t base;
+ uint64_t length;
+ uint32_t type;
+} __packed;
+
+/* From FreeBSD <machine/pc/bios.h> */
+#define SMAP_TYPE_MEMORY 1
+
+#define GB (1024UL * 1024 * 1024)
+
+#define MODINFOMD_SMAP 0x1001
+
+static void
+bios_addsmapdata(struct preloaded_file *kfp)
+{
+ uint64_t lowmem, highmem;
+ int smapnum, len;
+ struct smap smap[3], *sm;
+
+ CALLBACK(getmem, &lowmem, &highmem);
+
+ sm = &smap[0];
+
+ sm->base = 0; /* base memory */
+ sm->length = 640 * 1024;
+ sm->type = SMAP_TYPE_MEMORY;
+ sm++;
+
+ sm->base = 0x100000; /* extended memory */
+ sm->length = lowmem - 0x100000;
+ sm->type = SMAP_TYPE_MEMORY;
+ sm++;
+
+ smapnum = 2;
+
+ if (highmem != 0) {
+ sm->base = 4 * GB;
+ sm->length = highmem;
+ sm->type = SMAP_TYPE_MEMORY;
+ smapnum++;
+ }
+
+ len = smapnum * sizeof (struct smap);
+ file_addmetadata(kfp, MODINFOMD_SMAP, len, &smap[0]);
+}
+
+/*
+ * Load the information expected by an amd64 kernel.
+ *
+ * - The 'boothowto' argument is constructed
+ * - The 'bootdev' argument is constructed
+ * - The 'bootinfo' struct is constructed, and copied into the kernel space.
+ * - The kernel environment is copied into kernel space.
+ * - Module metadata are formatted and placed in kernel space.
+ */
+int
+bi_load64(char *args, vm_offset_t *modulep, vm_offset_t *kernendp)
+{
+ struct preloaded_file *xp, *kfp;
+ struct userboot_devdesc *rootdev;
+ struct file_metadata *md;
+ vm_offset_t addr;
+ u_int64_t kernend;
+ u_int64_t envp;
+ vm_offset_t size;
+ char *rootdevname;
+ int howto;
+
+ if (!bi_checkcpu()) {
+ printf("CPU doesn't support long mode\n");
+ return (EINVAL);
+ }
+
+ howto = bi_getboothowto(args);
+
+ /*
+ * Allow the environment variable 'rootdev' to override the supplied device
+ * This should perhaps go to MI code and/or have $rootdev tested/set by
+ * MI code before launching the kernel.
+ */
+ rootdevname = getenv("rootdev");
+ userboot_getdev((void **)(&rootdev), rootdevname, NULL);
+ if (rootdev == NULL) { /* bad $rootdev/$currdev */
+ printf("can't determine root device\n");
+ return(EINVAL);
+ }
+
+ /* Try reading the /etc/fstab file to select the root device */
+ getrootmount(userboot_fmtdev((void *)rootdev));
+
+ /* find the last module in the chain */
+ addr = 0;
+ for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) {
+ if (addr < (xp->f_addr + xp->f_size))
+ addr = xp->f_addr + xp->f_size;
+ }
+ /* pad to a page boundary */
+ addr = roundup(addr, PAGE_SIZE);
+
+ /* copy our environment */
+ envp = addr;
+ addr = bi_copyenv(addr);
+
+ /* pad to a page boundary */
+ addr = roundup(addr, PAGE_SIZE);
+
+ kfp = file_findfile(NULL, "elf kernel");
+ if (kfp == NULL)
+ kfp = file_findfile(NULL, "elf64 kernel");
+ if (kfp == NULL)
+ panic("can't find kernel file");
+ kernend = 0; /* fill it in later */
+ file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto);
+ file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp);
+ file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend);
+ bios_addsmapdata(kfp);
+
+ /* Figure out the size and location of the metadata */
+ *modulep = addr;
+ size = bi_copymodules64(0);
+ kernend = roundup(addr + size, PAGE_SIZE);
+ *kernendp = kernend;
+
+ /* patch MODINFOMD_KERNEND */
+ md = file_findmetadata(kfp, MODINFOMD_KERNEND);
+ bcopy(&kernend, md->md_data, sizeof kernend);
+
+ /* copy module list and metadata */
+ (void)bi_copymodules64(addr);
+
+ return(0);
+}
diff --git a/sys/boot/userboot/userboot/conf.c b/sys/boot/userboot/userboot/conf.c
new file mode 100644
index 0000000..0c57eba
--- /dev/null
+++ b/sys/boot/userboot/userboot/conf.c
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 1997
+ * Matthias Drochner. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project
+ * by Matthias Drochner.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $NetBSD: conf.c,v 1.2 1997/03/22 09:03:29 thorpej Exp $
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+
+#include "libuserboot.h"
+
+/*
+ * We could use linker sets for some or all of these, but
+ * then we would have to control what ended up linked into
+ * the bootstrap. So it's easier to conditionalise things
+ * here.
+ *
+ * XXX rename these arrays to be consistent and less namespace-hostile
+ */
+
+/* Exported for libstand */
+struct devsw *devsw[] = {
+ &host_dev,
+ &userboot_disk,
+ NULL
+};
+
+struct fs_ops *file_system[] = {
+ &host_fsops,
+ &ufs_fsops,
+ &gzipfs_fsops,
+ NULL
+};
+
+/* Exported for i386 only */
+/*
+ * Sort formats so that those that can detect based on arguments
+ * rather than reading the file go first.
+ */
+extern struct file_format i386_elf;
+extern struct file_format i386_elf_obj;
+extern struct file_format amd64_elf;
+extern struct file_format amd64_elf_obj;
+
+struct file_format *file_formats[] = {
+ &i386_elf,
+ &i386_elf_obj,
+ &amd64_elf,
+ &amd64_elf_obj,
+ NULL
+};
+
+/*
+ * Consoles
+ *
+ * We don't prototype these in libuserboot.h because they require
+ * data structures from bootstrap.h as well.
+ */
+extern struct console userboot_console;
+
+struct console *consoles[] = {
+ &userboot_console,
+ NULL
+};
diff --git a/sys/boot/userboot/userboot/copy.c b/sys/boot/userboot/userboot/copy.c
new file mode 100644
index 0000000..94548f2
--- /dev/null
+++ b/sys/boot/userboot/userboot/copy.c
@@ -0,0 +1,74 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+
+#include "libuserboot.h"
+
+ssize_t
+userboot_copyin(const void *src, vm_offset_t va, size_t len)
+{
+
+ CALLBACK(copyin, src, va, len);
+ return (len);
+}
+
+ssize_t
+userboot_copyout(vm_offset_t va, void *dst, size_t len)
+{
+
+ CALLBACK(copyout, va, dst, len);
+ return (len);
+}
+
+ssize_t
+userboot_readin(int fd, vm_offset_t va, size_t len)
+{
+ void *pa;
+ ssize_t res, s;
+ size_t sz;
+ char buf[4096];
+
+ res = 0;
+ while (len > 0) {
+ sz = len;
+ if (sz > sizeof(buf))
+ sz = sizeof(buf);
+ s = read(fd, buf, sz);
+ if (s == 0)
+ break;
+ if (s < 0)
+ return (s);
+ CALLBACK(copyin, buf, va, s);
+ len -= s;
+ res += s;
+ va += s;
+ }
+ return (res);
+}
diff --git a/sys/boot/userboot/userboot/devicename.c b/sys/boot/userboot/userboot/devicename.c
new file mode 100644
index 0000000..24c5179
--- /dev/null
+++ b/sys/boot/userboot/userboot/devicename.c
@@ -0,0 +1,274 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include <string.h>
+#include <sys/disklabel.h>
+
+#include "bootstrap.h"
+#include "disk.h"
+#include "libuserboot.h"
+
+static int userboot_parsedev(struct disk_devdesc **dev, const char *devspec, const char **path);
+
+/*
+ * Point (dev) at an allocated device specifier for the device matching the
+ * path in (devspec). If it contains an explicit device specification,
+ * use that. If not, use the default device.
+ */
+int
+userboot_getdev(void **vdev, const char *devspec, const char **path)
+{
+ struct disk_devdesc **dev = (struct disk_devdesc **)vdev;
+ int rv;
+
+ /*
+ * If it looks like this is just a path and no
+ * device, go with the current device.
+ */
+ if ((devspec == NULL) ||
+ (devspec[0] == '/') ||
+ (strchr(devspec, ':') == NULL)) {
+
+ if (((rv = userboot_parsedev(dev, getenv("currdev"), NULL)) == 0) &&
+ (path != NULL))
+ *path = devspec;
+ return(rv);
+ }
+
+ /*
+ * Try to parse the device name off the beginning of the devspec
+ */
+ return(userboot_parsedev(dev, devspec, path));
+}
+
+/*
+ * Point (dev) at an allocated device specifier matching the string version
+ * at the beginning of (devspec). Return a pointer to the remaining
+ * text in (path).
+ *
+ * In all cases, the beginning of (devspec) is compared to the names
+ * of known devices in the device switch, and then any following text
+ * is parsed according to the rules applied to the device type.
+ *
+ * For disk-type devices, the syntax is:
+ *
+ * disk<unit>[s<slice>][<partition>]:
+ *
+ */
+static int
+userboot_parsedev(struct disk_devdesc **dev, const char *devspec, const char **path)
+{
+ struct disk_devdesc *idev;
+ struct devsw *dv;
+ int i, unit, slice, partition, err;
+ char *cp;
+ const char *np;
+
+ /* minimum length check */
+ if (strlen(devspec) < 2)
+ return(EINVAL);
+
+ /* look for a device that matches */
+ for (i = 0, dv = NULL; devsw[i] != NULL; i++) {
+ if (!strncmp(devspec, devsw[i]->dv_name, strlen(devsw[i]->dv_name))) {
+ dv = devsw[i];
+ break;
+ }
+ }
+ if (dv == NULL)
+ return(ENOENT);
+ idev = malloc(sizeof(struct disk_devdesc));
+ err = 0;
+ np = (devspec + strlen(dv->dv_name));
+
+ switch(dv->dv_type) {
+ case DEVT_NONE: /* XXX what to do here? Do we care? */
+ break;
+
+ case DEVT_DISK:
+ unit = -1;
+ slice = -1;
+ partition = -1;
+ if (*np && (*np != ':')) {
+ unit = strtol(np, &cp, 10); /* next comes the unit number */
+ if (cp == np) {
+ err = EUNIT;
+ goto fail;
+ }
+#ifdef LOADER_GPT_SUPPORT
+ if (*cp == 'p') { /* got a GPT partition */
+ np = cp + 1;
+ slice = strtol(np, &cp, 10);
+ if (cp == np) {
+ err = ESLICE;
+ goto fail;
+ }
+ if (*cp && (*cp != ':')) {
+ err = EINVAL;
+ goto fail;
+ }
+ partition = 0xff;
+ } else {
+#endif
+ if (*cp == 's') { /* got a slice number */
+ np = cp + 1;
+ slice = strtol(np, &cp, 10);
+ if (cp == np) {
+ err = ESLICE;
+ goto fail;
+ }
+ }
+ if (*cp && (*cp != ':')) {
+ partition = *cp - 'a'; /* got a partition number */
+ if ((partition < 0) || (partition >= MAXPARTITIONS)) {
+ err = EPART;
+ goto fail;
+ }
+ cp++;
+ }
+#ifdef LOADER_GPT_SUPPORT
+ }
+#endif
+ } else {
+ cp = np;
+ }
+ if (*cp && (*cp != ':')) {
+ err = EINVAL;
+ goto fail;
+ }
+
+ idev->d_unit = unit;
+ idev->d_slice = slice;
+ idev->d_partition = partition;
+ if (path != NULL)
+ *path = (*cp == 0) ? cp : cp + 1;
+ break;
+
+ case DEVT_CD:
+ case DEVT_NET:
+ case DEVT_ZFS:
+ unit = 0;
+
+ if (*np && (*np != ':')) {
+ unit = strtol(np, &cp, 0); /* get unit number if present */
+ if (cp == np) {
+ err = EUNIT;
+ goto fail;
+ }
+ } else {
+ cp = np;
+ }
+ if (*cp && (*cp != ':')) {
+ err = EINVAL;
+ goto fail;
+ }
+
+ idev->d_unit = unit;
+ if (path != NULL)
+ *path = (*cp == 0) ? cp : cp + 1;
+ break;
+
+ default:
+ err = EINVAL;
+ goto fail;
+ }
+ idev->d_dev = dv;
+ idev->d_type = dv->dv_type;
+ if (dev == NULL) {
+ free(idev);
+ } else {
+ *dev = idev;
+ }
+ return(0);
+
+ fail:
+ free(idev);
+ return(err);
+}
+
+
+char *
+userboot_fmtdev(void *vdev)
+{
+ struct disk_devdesc *dev = (struct disk_devdesc *)vdev;
+ static char buf[128]; /* XXX device length constant? */
+ char *cp;
+
+ switch(dev->d_type) {
+ case DEVT_NONE:
+ strcpy(buf, "(no device)");
+ break;
+
+ case DEVT_CD:
+ sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
+ break;
+
+ case DEVT_DISK:
+ cp = buf;
+ cp += sprintf(cp, "%s%d", dev->d_dev->dv_name, dev->d_unit);
+#ifdef LOADER_GPT_SUPPORT
+ if (dev->d_partition == 0xff) {
+ cp += sprintf(cp, "p%d", dev->d_slice);
+ } else {
+#endif
+ if (dev->d_slice > 0)
+ cp += sprintf(cp, "s%d", dev->d_slice);
+ if (dev->d_partition >= 0)
+ cp += sprintf(cp, "%c", dev->d_partition + 'a');
+#ifdef LOADER_GPT_SUPPORT
+ }
+#endif
+ strcat(cp, ":");
+ break;
+
+ case DEVT_NET:
+ case DEVT_ZFS:
+ sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
+ break;
+ }
+ return(buf);
+}
+
+
+/*
+ * Set currdev to suit the value being supplied in (value)
+ */
+int
+userboot_setcurrdev(struct env_var *ev, int flags, const void *value)
+{
+ struct disk_devdesc *ncurr;
+ int rv;
+
+ if ((rv = userboot_parsedev(&ncurr, value, NULL)) != 0)
+ return(rv);
+ free(ncurr);
+ env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
+ return(0);
+}
diff --git a/sys/boot/userboot/userboot/elf32_freebsd.c b/sys/boot/userboot/userboot/elf32_freebsd.c
new file mode 100644
index 0000000..8489385
--- /dev/null
+++ b/sys/boot/userboot/userboot/elf32_freebsd.c
@@ -0,0 +1,99 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/exec.h>
+#include <sys/linker.h>
+#include <string.h>
+#include <i386/include/bootinfo.h>
+#include <i386/include/elf.h>
+#include <stand.h>
+
+#include "bootstrap.h"
+#include "libuserboot.h"
+
+static int elf32_exec(struct preloaded_file *amp);
+static int elf32_obj_exec(struct preloaded_file *amp);
+
+struct file_format i386_elf = { elf32_loadfile, elf32_exec };
+struct file_format i386_elf_obj = { elf32_obj_loadfile, elf32_obj_exec };
+
+/*
+ * There is an ELF kernel and one or more ELF modules loaded.
+ * We wish to start executing the kernel image, so make such
+ * preparations as are required, and do so.
+ */
+static int
+elf32_exec(struct preloaded_file *fp)
+{
+ struct file_metadata *md;
+ Elf_Ehdr *ehdr;
+ vm_offset_t entry, bootinfop, modulep, kernend;
+ int boothowto, err, bootdev;
+ uint32_t stack[1024];
+
+
+ if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
+ return(EFTYPE);
+ ehdr = (Elf_Ehdr *)&(md->md_data);
+
+ err = bi_load32(fp->f_args, &boothowto, &bootdev, &bootinfop, &modulep, &kernend);
+ if (err != 0)
+ return(err);
+ entry = ehdr->e_entry & 0xffffff;
+
+#ifdef DEBUG
+ printf("Start @ 0x%lx ...\n", entry);
+#endif
+
+ dev_cleanup();
+
+ /*
+ * Build a scratch stack at physical 0x1000
+ */
+ stack[0] = boothowto;
+ stack[1] = bootdev;
+ stack[2] = 0;
+ stack[3] = 0;
+ stack[4] = 0;
+ stack[5] = bootinfop;
+ stack[6] = modulep;
+ stack[7] = kernend;
+ CALLBACK(copyin, stack, 0x1000, sizeof(stack));
+ CALLBACK(setreg, 4, 0x1000);
+ CALLBACK(exec, entry);
+
+ panic("exec returned");
+}
+
+static int
+elf32_obj_exec(struct preloaded_file *fp)
+{
+ return (EFTYPE);
+}
diff --git a/sys/boot/userboot/userboot/elf64_freebsd.c b/sys/boot/userboot/userboot/elf64_freebsd.c
new file mode 100644
index 0000000..36129ef
--- /dev/null
+++ b/sys/boot/userboot/userboot/elf64_freebsd.c
@@ -0,0 +1,172 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define __ELF_WORD_SIZE 64
+#include <sys/param.h>
+#include <sys/exec.h>
+#include <sys/linker.h>
+#include <string.h>
+#include <i386/include/bootinfo.h>
+#include <machine/elf.h>
+#include <stand.h>
+
+#include "bootstrap.h"
+#include "libuserboot.h"
+
+static int elf64_exec(struct preloaded_file *amp);
+static int elf64_obj_exec(struct preloaded_file *amp);
+
+struct file_format amd64_elf = { elf64_loadfile, elf64_exec };
+struct file_format amd64_elf_obj = { elf64_obj_loadfile, elf64_obj_exec };
+
+#define MSR_EFER 0xc0000080
+#define EFER_LME 0x00000100
+#define EFER_LMA 0x00000400 /* Long mode active (R) */
+#define CR4_PAE 0x00000020
+#define CR4_VMXE (1UL << 13)
+#define CR4_PSE 0x00000010
+#define CR0_PG 0x80000000
+#define CR0_PE 0x00000001 /* Protected mode Enable */
+#define CR0_NE 0x00000020 /* Numeric Error enable (EX16 vs IRQ13) */
+
+#define PG_V 0x001
+#define PG_RW 0x002
+#define PG_U 0x004
+#define PG_PS 0x080
+
+typedef u_int64_t p4_entry_t;
+typedef u_int64_t p3_entry_t;
+typedef u_int64_t p2_entry_t;
+
+#define GUEST_NULL_SEL 0
+#define GUEST_CODE_SEL 1
+#define GUEST_DATA_SEL 2
+#define GUEST_GDTR_LIMIT (3 * 8 - 1)
+
+static void
+setup_freebsd_gdt(uint64_t *gdtr)
+{
+ gdtr[GUEST_NULL_SEL] = 0;
+ gdtr[GUEST_CODE_SEL] = 0x0020980000000000;
+ gdtr[GUEST_DATA_SEL] = 0x0000900000000000;
+}
+
+/*
+ * There is an ELF kernel and one or more ELF modules loaded.
+ * We wish to start executing the kernel image, so make such
+ * preparations as are required, and do so.
+ */
+static int
+elf64_exec(struct preloaded_file *fp)
+{
+ struct file_metadata *md;
+ Elf_Ehdr *ehdr;
+ vm_offset_t modulep, kernend;
+ int err;
+ int i;
+ uint32_t stack[1024];
+ p4_entry_t PT4[512];
+ p3_entry_t PT3[512];
+ p2_entry_t PT2[512];
+ uint64_t gdtr[3];
+
+ if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
+ return(EFTYPE);
+ ehdr = (Elf_Ehdr *)&(md->md_data);
+
+ err = bi_load64(fp->f_args, &modulep, &kernend);
+ if (err != 0)
+ return(err);
+
+ bzero(PT4, PAGE_SIZE);
+ bzero(PT3, PAGE_SIZE);
+ bzero(PT2, PAGE_SIZE);
+
+ /*
+ * Build a scratch stack at physical 0x1000, page tables:
+ * PT4 at 0x2000,
+ * PT3 at 0x3000,
+ * PT2 at 0x4000,
+ * gdtr at 0x5000,
+ */
+
+ /*
+ * This is kinda brutal, but every single 1GB VM memory segment
+ * points to the same first 1GB of physical memory. But it is
+ * more than adequate.
+ */
+ for (i = 0; i < 512; i++) {
+ /* Each slot of the level 4 pages points to the same level 3 page */
+ PT4[i] = (p4_entry_t) 0x3000;
+ PT4[i] |= PG_V | PG_RW | PG_U;
+
+ /* Each slot of the level 3 pages points to the same level 2 page */
+ PT3[i] = (p3_entry_t) 0x4000;
+ PT3[i] |= PG_V | PG_RW | PG_U;
+
+ /* The level 2 page slots are mapped with 2MB pages for 1GB. */
+ PT2[i] = i * (2 * 1024 * 1024);
+ PT2[i] |= PG_V | PG_RW | PG_PS | PG_U;
+ }
+
+#ifdef DEBUG
+ printf("Start @ %#llx ...\n", ehdr->e_entry);
+#endif
+
+ dev_cleanup();
+
+ stack[0] = 0; /* return address */;
+ stack[1] = modulep;
+ stack[2] = kernend;
+ CALLBACK(copyin, stack, 0x1000, sizeof(stack));
+ CALLBACK(copyin, PT4, 0x2000, sizeof(PT4));
+ CALLBACK(copyin, PT3, 0x3000, sizeof(PT3));
+ CALLBACK(copyin, PT2, 0x4000, sizeof(PT2));
+ CALLBACK(setreg, 4, 0x1000);
+
+ CALLBACK(setmsr, MSR_EFER, EFER_LMA | EFER_LME);
+ CALLBACK(setcr, 4, CR4_PAE | CR4_VMXE);
+ CALLBACK(setcr, 3, 0x2000);
+ CALLBACK(setcr, 0, CR0_PG | CR0_PE | CR0_NE);
+
+ setup_freebsd_gdt(gdtr);
+ CALLBACK(copyin, gdtr, 0x5000, sizeof(gdtr));
+ CALLBACK(setgdt, 0x5000, sizeof(gdtr));
+
+ CALLBACK(exec, ehdr->e_entry);
+
+ panic("exec returned");
+}
+
+static int
+elf64_obj_exec(struct preloaded_file *fp)
+{
+
+ return (EFTYPE);
+}
diff --git a/sys/boot/userboot/userboot/host.c b/sys/boot/userboot/userboot/host.c
new file mode 100644
index 0000000..81858a9
--- /dev/null
+++ b/sys/boot/userboot/userboot/host.c
@@ -0,0 +1,198 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Read from the host filesystem
+ */
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stand.h>
+#include <bootstrap.h>
+
+#include "libuserboot.h"
+
+/*
+ * Open a file.
+ */
+static int
+host_open(const char *upath, struct open_file *f)
+{
+
+ if (f->f_dev != &host_dev)
+ return (EINVAL);
+
+ return (CALLBACK(open, upath, &f->f_fsdata));
+}
+
+static int
+host_close(struct open_file *f)
+{
+
+ CALLBACK(close, f->f_fsdata);
+ f->f_fsdata = (void *)0;
+
+ return (0);
+}
+
+/*
+ * Copy a portion of a file into memory.
+ */
+static int
+host_read(struct open_file *f, void *start, size_t size, size_t *resid)
+{
+
+ return (CALLBACK(read, f->f_fsdata, start, size, resid));
+}
+
+/*
+ * Don't be silly - the bootstrap has no business writing anything.
+ */
+static int
+host_write(struct open_file *f, void *start, size_t size, size_t *resid)
+{
+
+ return (EROFS);
+}
+
+static off_t
+host_seek(struct open_file *f, off_t offset, int where)
+{
+
+ return (CALLBACK(seek, f->f_fsdata, offset, where));
+}
+
+static int
+host_stat(struct open_file *f, struct stat *sb)
+{
+ int mode;
+ int uid;
+ int gid;
+ uint64_t size;
+
+ CALLBACK(stat, f->f_fsdata, &mode, &uid, &gid, &size);
+ sb->st_mode = mode;
+ sb->st_uid = uid;
+ sb->st_gid = gid;
+ sb->st_size = size;
+ return (0);
+}
+
+static int
+host_readdir(struct open_file *f, struct dirent *d)
+{
+ uint32_t fileno;
+ uint8_t type;
+ size_t namelen;
+ int rc;
+
+ rc = CALLBACK(readdir, f->f_fsdata, &fileno, &type, &namelen,
+ d->d_name);
+ if (rc)
+ return (rc);
+
+ d->d_fileno = fileno;
+ d->d_type = type;
+ d->d_namlen = namelen;
+
+ return (0);
+}
+
+static int
+host_dev_init(void)
+{
+
+ return (0);
+}
+
+static void
+host_dev_print(int verbose)
+{
+ char line[80];
+
+ sprintf(line, " host%d: Host filesystem\n", 0);
+ pager_output(line);
+}
+
+/*
+ * 'Open' the host device.
+ */
+static int
+host_dev_open(struct open_file *f, ...)
+{
+ va_list args;
+ struct devdesc *dev;
+
+ va_start(args, f);
+ dev = va_arg(args, struct devdesc*);
+ va_end(args);
+
+ return (0);
+}
+
+static int
+host_dev_close(struct open_file *f)
+{
+
+ return (0);
+}
+
+static int
+host_dev_strategy(void *devdata, int rw, daddr_t dblk, size_t size,
+ char *buf, size_t *rsize)
+{
+
+ return (ENOSYS);
+}
+
+struct fs_ops host_fsops = {
+ "host",
+ host_open,
+ host_close,
+ host_read,
+ host_write,
+ host_seek,
+ host_stat,
+ host_readdir
+};
+
+struct devsw host_dev = {
+ .dv_name = "host",
+ .dv_type = DEVT_NET,
+ .dv_init = host_dev_init,
+ .dv_strategy = host_dev_strategy,
+ .dv_open = host_dev_open,
+ .dv_close = host_dev_close,
+ .dv_ioctl = noioctl,
+ .dv_print = host_dev_print,
+ .dv_cleanup = NULL
+};
diff --git a/sys/boot/userboot/userboot/libuserboot.h b/sys/boot/userboot/userboot/libuserboot.h
new file mode 100644
index 0000000..0aa1a3f
--- /dev/null
+++ b/sys/boot/userboot/userboot/libuserboot.h
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include "userboot.h"
+
+extern struct loader_callbacks_v1 *callbacks;
+extern void *callbacks_arg;
+
+#define CALLBACK(fn, args...) (callbacks->fn(callbacks_arg , ##args))
+
+#define MAXDEV 31 /* maximum number of distinct devices */
+
+typedef unsigned long physaddr_t;
+
+/* exported devices */
+extern struct devsw userboot_disk;
+extern int userboot_disk_maxunit;
+extern struct devsw host_dev;
+
+/* access to host filesystem */
+struct fs_ops host_fsops;
+
+struct bootinfo;
+struct preloaded_file;
+extern int bi_load(struct bootinfo *, struct preloaded_file *);
+
+extern void delay(int);
+
+extern int userboot_autoload(void);
+extern ssize_t userboot_copyin(const void *, vm_offset_t, size_t);
+extern ssize_t userboot_copyout(vm_offset_t, void *, size_t);
+extern ssize_t userboot_readin(int, vm_offset_t, size_t);
+extern int userboot_getdev(void **, const char *, const char **);
+char *userboot_fmtdev(void *vdev);
+int userboot_setcurrdev(struct env_var *ev, int flags, const void *value);
+
+int bi_getboothowto(char *kargs);
+void bi_setboothowto(int howto);
+vm_offset_t bi_copyenv(vm_offset_t addr);
+int bi_load32(char *args, int *howtop, int *bootdevp, vm_offset_t *bip,
+ vm_offset_t *modulep, vm_offset_t *kernend);
+int bi_load64(char *args, vm_offset_t *modulep, vm_offset_t *kernend);
diff --git a/sys/boot/userboot/userboot/main.c b/sys/boot/userboot/userboot/main.c
new file mode 100644
index 0000000..d01d95e
--- /dev/null
+++ b/sys/boot/userboot/userboot/main.c
@@ -0,0 +1,177 @@
+/*-
+ * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * Copyright (c) 1998,2000 Doug Rabson <dfr@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include <string.h>
+#include <setjmp.h>
+
+#include "bootstrap.h"
+#include "disk.h"
+#include "libuserboot.h"
+
+struct loader_callbacks_v1 *callbacks;
+void *callbacks_arg;
+
+extern char bootprog_name[];
+extern char bootprog_rev[];
+extern char bootprog_date[];
+extern char bootprog_maker[];
+static jmp_buf jb;
+
+struct arch_switch archsw; /* MI/MD interface boundary */
+
+static void extract_currdev(void);
+
+void
+delay(int usec)
+{
+
+ CALLBACK(delay, usec);
+}
+
+void
+exit(int v)
+{
+
+ CALLBACK(exit, v);
+ longjmp(jb, 1);
+}
+
+void
+loader_main(struct loader_callbacks_v1 *cb, void *arg, int version, int ndisks)
+{
+ static char malloc[512*1024];
+ int i;
+
+ if (version != USERBOOT_VERSION_1)
+ abort();
+
+ callbacks = cb;
+ callbacks_arg = arg;
+ userboot_disk_maxunit = ndisks;
+
+ /*
+ * initialise the heap as early as possible. Once this is done,
+ * alloc() is usable. The stack is buried inside us, so this is
+ * safe.
+ */
+ setheap((void *)malloc, (void *)(malloc + 512*1024));
+
+ /*
+ * Hook up the console
+ */
+ cons_probe();
+
+ /*
+ * March through the device switch probing for things.
+ */
+ for (i = 0; devsw[i] != NULL; i++)
+ if (devsw[i]->dv_init != NULL)
+ (devsw[i]->dv_init)();
+
+ printf("\n");
+ printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
+ printf("(%s, %s)\n", bootprog_maker, bootprog_date);
+#if 0
+ printf("Memory: %ld k\n", memsize() / 1024);
+#endif
+
+ setenv("LINES", "24", 1); /* optional */
+
+ archsw.arch_autoload = userboot_autoload;
+ archsw.arch_getdev = userboot_getdev;
+ archsw.arch_copyin = userboot_copyin;
+ archsw.arch_copyout = userboot_copyout;
+ archsw.arch_readin = userboot_readin;
+
+ extract_currdev();
+
+ if (setjmp(jb))
+ return;
+
+ interact(); /* doesn't return */
+
+ exit(0);
+}
+
+/*
+ * Set the 'current device' by (if possible) recovering the boot device as
+ * supplied by the initial bootstrap.
+ */
+static void
+extract_currdev(void)
+{
+ struct disk_devdesc dev;
+
+ //bzero(&dev, sizeof(dev));
+
+ if (userboot_disk_maxunit > 0) {
+ dev.d_dev = &userboot_disk;
+ dev.d_type = dev.d_dev->dv_type;
+ dev.d_unit = 0;
+ dev.d_slice = 0;
+ dev.d_partition = 0;
+ /*
+ * Figure out if we are using MBR or GPT - for GPT we
+ * set the partition to 0 since everything is a GPT slice.
+ */
+ if (dev.d_dev->dv_open(NULL, &dev))
+ dev.d_partition = 255;
+ } else {
+ dev.d_dev = &host_dev;
+ dev.d_type = dev.d_dev->dv_type;
+ dev.d_unit = 0;
+ }
+
+ env_setenv("currdev", EV_VOLATILE, userboot_fmtdev(&dev),
+ userboot_setcurrdev, env_nounset);
+ env_setenv("loaddev", EV_VOLATILE, userboot_fmtdev(&dev),
+ env_noset, env_nounset);
+}
+
+COMMAND_SET(quit, "quit", "exit the loader", command_quit);
+
+static int
+command_quit(int argc, char *argv[])
+{
+
+ exit(USERBOOT_EXIT_QUIT);
+ return (CMD_OK);
+}
+
+COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot);
+
+static int
+command_reboot(int argc, char *argv[])
+{
+
+ exit(USERBOOT_EXIT_REBOOT);
+ return (CMD_OK);
+}
diff --git a/sys/boot/userboot/userboot/userboot_cons.c b/sys/boot/userboot/userboot/userboot_cons.c
new file mode 100644
index 0000000..5ecb7c8
--- /dev/null
+++ b/sys/boot/userboot/userboot/userboot_cons.c
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include "bootstrap.h"
+#include "libuserboot.h"
+
+int console;
+
+static void userboot_cons_probe(struct console *cp);
+static int userboot_cons_init(int);
+static void userboot_cons_putchar(int);
+static int userboot_cons_getchar(void);
+static int userboot_cons_poll(void);
+
+struct console userboot_console = {
+ "userboot",
+ "userboot",
+ 0,
+ userboot_cons_probe,
+ userboot_cons_init,
+ userboot_cons_putchar,
+ userboot_cons_getchar,
+ userboot_cons_poll,
+};
+
+static void
+userboot_cons_probe(struct console *cp)
+{
+
+ cp->c_flags |= (C_PRESENTIN | C_PRESENTOUT);
+}
+
+static int
+userboot_cons_init(int arg)
+{
+
+ return (0);
+}
+
+static void
+userboot_cons_putchar(int c)
+{
+
+ CALLBACK(putc, c);
+}
+
+static int
+userboot_cons_getchar()
+{
+
+ return (CALLBACK(getc));
+}
+
+static int
+userboot_cons_poll()
+{
+
+ return (CALLBACK(poll));
+}
diff --git a/sys/boot/userboot/userboot/userboot_disk.c b/sys/boot/userboot/userboot/userboot_disk.c
new file mode 100644
index 0000000..074d3e1
--- /dev/null
+++ b/sys/boot/userboot/userboot/userboot_disk.c
@@ -0,0 +1,146 @@
+/*-
+ * Copyright (c) 2011 Google, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Userboot disk image handling.
+ */
+
+#include <stand.h>
+
+#include <stdarg.h>
+#include <uuid.h>
+
+#include <bootstrap.h>
+
+#include "disk.h"
+#include "libuserboot.h"
+
+int userboot_disk_maxunit = 0;
+
+static int userdisk_init(void);
+static int userdisk_strategy(void *devdata, int flag, daddr_t dblk,
+ size_t size, char *buf, size_t *rsize);
+static int userdisk_open(struct open_file *f, ...);
+static int userdisk_close(struct open_file *f);
+static void userdisk_print(int verbose);
+
+struct devsw userboot_disk = {
+ "disk",
+ DEVT_DISK,
+ userdisk_init,
+ userdisk_strategy,
+ userdisk_open,
+ userdisk_close,
+ noioctl,
+ userdisk_print,
+ NULL
+};
+
+/*
+ * Nothing to do here.
+ */
+static int
+userdisk_init(void)
+{
+
+ return(0);
+}
+
+/*
+ * Print information about disks
+ */
+static void
+userdisk_print(int verbose)
+{
+ int i;
+ char line[80];
+ struct disk_devdesc dev;
+
+ for (i = 0; i < userboot_disk_maxunit; i++) {
+ sprintf(line, " disk%d: Guest drive image\n", i);
+ pager_output(line);
+ dev.d_dev = &userboot_disk;
+ dev.d_unit = i;
+ dev.d_slice = -1;
+ dev.d_partition = -1;
+ dev.d_offset = 0;
+ sprintf(line, " disk%d", i);
+ disk_print(&dev, line, verbose);
+ }
+}
+
+/*
+ * Attempt to open the disk described by (dev) for use by (f).
+ */
+static int
+userdisk_open(struct open_file *f, ...)
+{
+ va_list ap;
+ struct disk_devdesc *dev;
+
+ va_start(ap, f);
+ dev = va_arg(ap, struct disk_devdesc *);
+ va_end(ap);
+
+ if (dev->d_unit < 0 || dev->d_unit >= userboot_disk_maxunit)
+ return (EIO);
+
+ return (disk_open(dev));
+}
+
+static int
+userdisk_close(struct open_file *f)
+{
+
+ return(0);
+}
+
+static int
+userdisk_strategy(void *devdata, int rw, daddr_t dblk, size_t size,
+ char *buf, size_t *rsize)
+{
+ struct disk_devdesc *dev = devdata;
+ uint64_t off;
+ size_t resid;
+ int rc;
+
+ if (rw == F_WRITE)
+ return (EROFS);
+ if (rw != F_READ)
+ return (EINVAL);
+ if (rsize)
+ *rsize = 0;
+ off = (dblk + dev->d_offset) * DISK_SECSIZE;
+ rc = CALLBACK(diskread, dev->d_unit, off, buf, size, &resid);
+ if (rc)
+ return (rc);
+ if (rsize)
+ *rsize = size - resid;
+ return (0);
+}
diff --git a/sys/boot/userboot/userboot/version b/sys/boot/userboot/userboot/version
new file mode 100644
index 0000000..ce6e270
--- /dev/null
+++ b/sys/boot/userboot/userboot/version
@@ -0,0 +1,4 @@
+$FreeBSD$
+
+1.1: Initial userland boot
+
diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c
index f1a9433..ed0dbef 100644
--- a/sys/cam/ata/ata_da.c
+++ b/sys/cam/ata/ata_da.c
@@ -818,7 +818,7 @@ adagetattr(struct bio *bp)
int ret = -1;
struct cam_periph *periph;
- if (bp->bio_disk == NULL || bp->bio_disk->d_drv1)
+ if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL)
return ENXIO;
periph = (struct cam_periph *)bp->bio_disk->d_drv1;
if (periph->path == NULL)
diff --git a/sys/cam/ata/ata_xpt.c b/sys/cam/ata/ata_xpt.c
index d02b36f..84ab46b 100644
--- a/sys/cam/ata/ata_xpt.c
+++ b/sys/cam/ata/ata_xpt.c
@@ -1601,6 +1601,34 @@ ata_device_transport(struct cam_path *path)
}
static void
+ata_dev_advinfo(union ccb *start_ccb)
+{
+ struct cam_ed *device;
+ struct ccb_dev_advinfo *cdai;
+ off_t amt;
+
+ start_ccb->ccb_h.status = CAM_REQ_INVALID;
+ device = start_ccb->ccb_h.path->device;
+ cdai = &start_ccb->cdai;
+ switch(cdai->buftype) {
+ case CDAI_TYPE_SERIAL_NUM:
+ if (cdai->flags & CDAI_FLAG_STORE)
+ break;
+ start_ccb->ccb_h.status = CAM_REQ_CMP;
+ cdai->provsiz = device->serial_num_len;
+ if (device->serial_num_len == 0)
+ break;
+ amt = device->serial_num_len;
+ if (cdai->provsiz > cdai->bufsiz)
+ amt = cdai->bufsiz;
+ memcpy(cdai->buf, device->serial_num, amt);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
ata_action(union ccb *start_ccb)
{
@@ -1650,7 +1678,13 @@ ata_action(union ccb *start_ccb)
xpt_done(start_ccb);
break;
}
- /* FALLTHROUGH */
+ xpt_action_default(start_ccb);
+ break;
+ }
+ case XPT_DEV_ADVINFO:
+ {
+ ata_dev_advinfo(start_ccb);
+ break;
}
default:
xpt_action_default(start_ccb);
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index f234076..013c415 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -4894,8 +4894,8 @@ camisr_runqueue(void *V_queue)
&& (--dev->tag_delay_count == 0))
xpt_start_tags(ccb_h->path);
if (!device_is_send_queued(dev)) {
- runq = xpt_schedule_dev_sendq(ccb_h->path->bus,
- dev);
+ (void)xpt_schedule_dev_sendq(ccb_h->path->bus,
+ dev);
}
}
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index c1951ff..91384b7 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -687,6 +687,10 @@ cdregister(struct cam_periph *periph, void *arg)
else
softc->minimum_command_size = 6;
+ /*
+ * Refcount and block open attempts until we are setup
+ * Can't block
+ */
(void)cam_periph_hold(periph, PRIBIO);
cam_periph_unlock(periph);
/*
@@ -747,7 +751,6 @@ cdregister(struct cam_periph *periph, void *arg)
softc->disk->d_hba_subdevice = cpi.hba_subdevice;
disk_create(softc->disk, DISK_VERSION);
cam_periph_lock(periph);
- cam_periph_unhold(periph);
/*
* Add an async callback so that we get
@@ -972,12 +975,6 @@ cdregister(struct cam_periph *periph, void *arg)
cdregisterexit:
- /*
- * Refcount and block open attempts until we are setup
- * Can't block
- */
- (void)cam_periph_hold(periph, PRIBIO);
-
if ((softc->flags & CD_FLAG_CHANGER) == 0)
xpt_schedule(periph, CAM_PRIORITY_DEV);
else
diff --git a/sys/cam/scsi/scsi_xpt.c b/sys/cam/scsi/scsi_xpt.c
index 1b507ca..c1f713b 100644
--- a/sys/cam/scsi/scsi_xpt.c
+++ b/sys/cam/scsi/scsi_xpt.c
@@ -2440,12 +2440,13 @@ scsi_dev_advinfo(union ccb *start_ccb)
struct ccb_dev_advinfo *cdai;
off_t amt;
+ start_ccb->ccb_h.status = CAM_REQ_INVALID;
device = start_ccb->ccb_h.path->device;
cdai = &start_ccb->cdai;
switch(cdai->buftype) {
case CDAI_TYPE_SCSI_DEVID:
if (cdai->flags & CDAI_FLAG_STORE)
- break;
+ return;
cdai->provsiz = device->device_id_len;
if (device->device_id_len == 0)
break;
@@ -2456,7 +2457,7 @@ scsi_dev_advinfo(union ccb *start_ccb)
break;
case CDAI_TYPE_SERIAL_NUM:
if (cdai->flags & CDAI_FLAG_STORE)
- break;
+ return;
cdai->provsiz = device->serial_num_len;
if (device->serial_num_len == 0)
break;
@@ -2490,7 +2491,7 @@ scsi_dev_advinfo(union ccb *start_ccb)
}
break;
default:
- break;
+ return;
}
start_ccb->ccb_h.status = CAM_REQ_CMP;
diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c b/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
index 434b482..4fa75195 100644
--- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
+++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
/* Portions Copyright 2010 Robert Milkowski */
@@ -311,6 +312,9 @@ zfs_prop_init(void)
zprop_register_number(ZFS_PROP_COMPRESSRATIO, "compressratio", 0,
PROP_READONLY, ZFS_TYPE_DATASET,
"<1.00x or higher if compressed>", "RATIO");
+ zprop_register_number(ZFS_PROP_REFRATIO, "refcompressratio", 0,
+ PROP_READONLY, ZFS_TYPE_DATASET,
+ "<1.00x or higher if compressed>", "REFRATIO");
zprop_register_number(ZFS_PROP_VOLBLOCKSIZE, "volblocksize",
ZVOL_DEFAULT_BLOCKSIZE, PROP_ONETIME,
ZFS_TYPE_VOLUME, "512 to 128k, power of 2", "VOLBLOCK");
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
index 7170aba..498352e 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
@@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
#include <sys/dmu_objset.h>
@@ -2150,7 +2151,7 @@ dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx)
void
dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
{
- uint64_t refd, avail, uobjs, aobjs;
+ uint64_t refd, avail, uobjs, aobjs, ratio;
dsl_dir_stats(ds->ds_dir, nv);
@@ -2177,6 +2178,11 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_DEFER_DESTROY,
DS_IS_DEFER_DESTROY(ds) ? 1 : 0);
+ ratio = ds->ds_phys->ds_compressed_bytes == 0 ? 100 :
+ (ds->ds_phys->ds_uncompressed_bytes * 100 /
+ ds->ds_phys->ds_compressed_bytes);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFRATIO, ratio);
+
if (ds->ds_phys->ds_next_snap_obj) {
/*
* This is a snapshot; override the dd's space used with
@@ -2184,10 +2190,7 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
*/
dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USED,
ds->ds_phys->ds_unique_bytes);
- dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO,
- ds->ds_phys->ds_compressed_bytes == 0 ? 100 :
- (ds->ds_phys->ds_uncompressed_bytes * 100 /
- ds->ds_phys->ds_compressed_bytes));
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO, ratio);
}
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
index 7978d61..ef9d4b5 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
@@ -71,9 +71,16 @@
* 1<<zfs_vdev_cache_bshift byte reads by the vdev_cache (aka software
* track buffer). At most zfs_vdev_cache_size bytes will be kept in each
* vdev's vdev_cache.
+ *
+ * TODO: Note that with the current ZFS code, it turns out that the
+ * vdev cache is not helpful, and in some cases actually harmful. It
+ * is better if we disable this. Once some time has passed, we should
+ * actually remove this to simplify the code. For now we just disable
+ * it by setting the zfs_vdev_cache_size to zero. Note that Solaris 11
+ * has made these same changes.
*/
int zfs_vdev_cache_max = 1<<14; /* 16KB */
-int zfs_vdev_cache_size = 10ULL << 20; /* 10MB */
+int zfs_vdev_cache_size = 0;
int zfs_vdev_cache_bshift = 16;
#define VCBS (1 << zfs_vdev_cache_bshift) /* 64KB */
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h b/sys/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h
index cd4caaa..b810f07 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h
@@ -65,7 +65,7 @@ typedef long ctf_id_t;
* filling in ctf_sect_t structures and passing them to ctf_bufopen():
*/
typedef struct ctf_sect {
- char *cts_name; /* section name (if any) */
+ const char *cts_name; /* section name (if any) */
ulong_t cts_type; /* section type (ELF SHT_... value) */
ulong_t cts_flags; /* section flags (ELF SHF_... value) */
#if defined(sun)
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
index edc26cd..e4070c2 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
*/
/* Portions Copyright 2010 Robert Milkowski */
@@ -124,6 +125,7 @@ typedef enum {
ZFS_PROP_DEDUP,
ZFS_PROP_MLSLABEL,
ZFS_PROP_SYNC,
+ ZFS_PROP_REFRATIO,
ZFS_NUM_PROPS
} zfs_prop_t;
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
index 0b86eac..d2a1cf1 100644
--- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
+++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
@@ -412,8 +412,8 @@ dtrace_gethrtime_init(void *arg)
continue;
pc = pcpu_find(i);
- map = PCPU_GET(cpumask);
- CPU_OR(&map, &pc->pc_cpumask);
+ CPU_SETOF(PCPU_GET(cpuid), &map);
+ CPU_SET(pc->pc_cpuid, &map);
smp_rendezvous_cpus(map, NULL,
dtrace_gethrtime_init_cpu,
diff --git a/sys/cddl/dev/dtrace/i386/dtrace_subr.c b/sys/cddl/dev/dtrace/i386/dtrace_subr.c
index 412fc38..b52097b 100644
--- a/sys/cddl/dev/dtrace/i386/dtrace_subr.c
+++ b/sys/cddl/dev/dtrace/i386/dtrace_subr.c
@@ -413,8 +413,8 @@ dtrace_gethrtime_init(void *arg)
continue;
pc = pcpu_find(i);
- map = PCPU_GET(cpumask);
- CPU_OR(&map, &pc->pc_cpumask);
+ CPU_SETOF(PCPU_GET(cpuid), &map);
+ CPU_SET(pc->pc_cpuid, &map);
smp_rendezvous_cpus(map, NULL,
dtrace_gethrtime_init_cpu,
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index 560db72..82bdc53 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -58,7 +58,7 @@ struct timespec32 {
#define TS_CP(src,dst,fld) do { \
CP((src).fld,(dst).fld,tv_sec); \
CP((src).fld,(dst).fld,tv_nsec); \
-} while (0);
+} while (0)
struct rusage32 {
struct timeval32 ru_utime;
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index 23985d3..5b6e895 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -1416,6 +1416,19 @@ freebsd32_pwrite(struct thread *td, struct freebsd32_pwrite_args *uap)
return (pwrite(td, &ap));
}
+#ifdef COMPAT_43
+int
+ofreebsd32_lseek(struct thread *td, struct ofreebsd32_lseek_args *uap)
+{
+ struct lseek_args nuap;
+
+ nuap.fd = uap->fd;
+ nuap.offset = uap->offset;
+ nuap.whence = uap->whence;
+ return (lseek(td, &nuap));
+}
+#endif
+
int
freebsd32_lseek(struct thread *td, struct freebsd32_lseek_args *uap)
{
diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h
index bfc142d..21b84e8 100644
--- a/sys/compat/freebsd32/freebsd32_proto.h
+++ b/sys/compat/freebsd32/freebsd32_proto.h
@@ -690,6 +690,11 @@ int freebsd32_posix_fallocate(struct thread *, struct freebsd32_posix_fallocate_
#if !defined(PAD64_REQUIRED) && defined(__powerpc__)
#define PAD64_REQUIRED
#endif
+struct ofreebsd32_lseek_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char offset_l_[PADL_(int)]; int offset; char offset_r_[PADR_(int)];
+ char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)];
+};
struct ofreebsd32_stat_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
char ub_l_[PADL_(struct ostat32 *)]; struct ostat32 * ub; char ub_r_[PADR_(struct ostat32 *)];
@@ -747,6 +752,7 @@ struct ofreebsd32_getdirentries_args {
#ifdef PAD64_REQUIRED
#else
#endif
+int ofreebsd32_lseek(struct thread *, struct ofreebsd32_lseek_args *);
int ofreebsd32_stat(struct thread *, struct ofreebsd32_stat_args *);
int ofreebsd32_lstat(struct thread *, struct ofreebsd32_lstat_args *);
int ofreebsd32_sigaction(struct thread *, struct ofreebsd32_sigaction_args *);
@@ -923,6 +929,7 @@ int freebsd7_freebsd32_shmctl(struct thread *, struct freebsd7_freebsd32_shmctl_
#define FREEBSD32_SYS_AUE_freebsd32_wait4 AUE_WAIT4
#define FREEBSD32_SYS_AUE_freebsd4_freebsd32_getfsstat AUE_GETFSSTAT
+#define FREEBSD32_SYS_AUE_ofreebsd32_lseek AUE_LSEEK
#define FREEBSD32_SYS_AUE_freebsd32_recvmsg AUE_RECVMSG
#define FREEBSD32_SYS_AUE_freebsd32_sendmsg AUE_SENDMSG
#define FREEBSD32_SYS_AUE_freebsd32_recvfrom AUE_RECVFROM
diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h
index 9fcbdf0..19f91be 100644
--- a/sys/compat/freebsd32/freebsd32_syscall.h
+++ b/sys/compat/freebsd32/freebsd32_syscall.h
@@ -25,7 +25,7 @@
#define FREEBSD32_SYS_chown 16
#define FREEBSD32_SYS_break 17
#define FREEBSD32_SYS_freebsd4_freebsd32_getfsstat 18
- /* 19 is obsolete olseek */
+ /* 19 is old freebsd32_lseek */
#define FREEBSD32_SYS_getpid 20
#define FREEBSD32_SYS_mount 21
#define FREEBSD32_SYS_unmount 22
@@ -411,6 +411,8 @@
#define FREEBSD32_SYS_freebsd32_msgctl 511
#define FREEBSD32_SYS_freebsd32_shmctl 512
#define FREEBSD32_SYS_lpathconf 513
+#define FREEBSD32_SYS_cap_new 514
+#define FREEBSD32_SYS_cap_getrights 515
#define FREEBSD32_SYS_cap_enter 516
#define FREEBSD32_SYS_cap_getmode 517
#define FREEBSD32_SYS_freebsd32_pselect 522
diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c
index 7e648e4..8e67e8b 100644
--- a/sys/compat/freebsd32/freebsd32_syscalls.c
+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
@@ -29,7 +29,7 @@ const char *freebsd32_syscallnames[] = {
"chown", /* 16 = chown */
"break", /* 17 = break */
"compat4.freebsd32_getfsstat", /* 18 = freebsd4 freebsd32_getfsstat */
- "obs_olseek", /* 19 = obsolete olseek */
+ "compat.freebsd32_lseek", /* 19 = old freebsd32_lseek */
"getpid", /* 20 = getpid */
"mount", /* 21 = mount */
"unmount", /* 22 = unmount */
@@ -537,8 +537,8 @@ const char *freebsd32_syscallnames[] = {
"freebsd32_msgctl", /* 511 = freebsd32_msgctl */
"freebsd32_shmctl", /* 512 = freebsd32_shmctl */
"lpathconf", /* 513 = lpathconf */
- "#514", /* 514 = cap_new */
- "#515", /* 515 = cap_getrights */
+ "cap_new", /* 514 = cap_new */
+ "cap_getrights", /* 515 = cap_getrights */
"cap_enter", /* 516 = cap_enter */
"cap_getmode", /* 517 = cap_getmode */
"#518", /* 518 = pdfork */
diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c
index 2c174c7..66f42ac 100644
--- a/sys/compat/freebsd32/freebsd32_sysent.c
+++ b/sys/compat/freebsd32/freebsd32_sysent.c
@@ -66,7 +66,7 @@ struct sysent freebsd32_sysent[] = {
{ AS(chown_args), (sy_call_t *)chown, AUE_CHOWN, NULL, 0, 0, 0, SY_THR_STATIC }, /* 16 = chown */
{ AS(obreak_args), (sy_call_t *)obreak, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 17 = break */
{ compat4(AS(freebsd4_freebsd32_getfsstat_args),freebsd32_getfsstat), AUE_GETFSSTAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 18 = freebsd4 freebsd32_getfsstat */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 19 = obsolete olseek */
+ { compat(AS(ofreebsd32_lseek_args),freebsd32_lseek), AUE_LSEEK, NULL, 0, 0, 0, SY_THR_STATIC }, /* 19 = old freebsd32_lseek */
{ 0, (sy_call_t *)getpid, AUE_GETPID, NULL, 0, 0, 0, SY_THR_STATIC }, /* 20 = getpid */
{ AS(mount_args), (sy_call_t *)mount, AUE_MOUNT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 21 = mount */
{ AS(unmount_args), (sy_call_t *)unmount, AUE_UMOUNT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 22 = unmount */
@@ -574,8 +574,8 @@ struct sysent freebsd32_sysent[] = {
{ AS(freebsd32_msgctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 511 = freebsd32_msgctl */
{ AS(freebsd32_shmctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 512 = freebsd32_shmctl */
{ AS(lpathconf_args), (sy_call_t *)lpathconf, AUE_LPATHCONF, NULL, 0, 0, 0, SY_THR_STATIC }, /* 513 = lpathconf */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 514 = cap_new */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 515 = cap_getrights */
+ { AS(cap_new_args), (sy_call_t *)cap_new, AUE_CAP_NEW, NULL, 0, 0, 0, SY_THR_STATIC }, /* 514 = cap_new */
+ { AS(cap_getrights_args), (sy_call_t *)cap_getrights, AUE_CAP_GETRIGHTS, NULL, 0, 0, 0, SY_THR_STATIC }, /* 515 = cap_getrights */
{ 0, (sy_call_t *)cap_enter, AUE_CAP_ENTER, NULL, 0, 0, 0, SY_THR_STATIC }, /* 516 = cap_enter */
{ AS(cap_getmode_args), (sy_call_t *)cap_getmode, AUE_CAP_GETMODE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 517 = cap_getmode */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 518 = pdfork */
diff --git a/sys/compat/freebsd32/freebsd32_systrace_args.c b/sys/compat/freebsd32/freebsd32_systrace_args.c
index 10eea64..39b66fd 100644
--- a/sys/compat/freebsd32/freebsd32_systrace_args.c
+++ b/sys/compat/freebsd32/freebsd32_systrace_args.c
@@ -2918,6 +2918,22 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 2;
break;
}
+ /* cap_new */
+ case 514: {
+ struct cap_new_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = p->rights; /* u_int64_t */
+ *n_args = 2;
+ break;
+ }
+ /* cap_getrights */
+ case 515: {
+ struct cap_getrights_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = (intptr_t) p->rightsp; /* u_int64_t * */
+ *n_args = 2;
+ break;
+ }
/* cap_enter */
case 516: {
*n_args = 0;
@@ -7873,6 +7889,32 @@ systrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
+ /* cap_new */
+ case 514:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t";
+ break;
+ default:
+ break;
+ };
+ break;
+ /* cap_getrights */
+ case 515:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t *";
+ break;
+ default:
+ break;
+ };
+ break;
/* cap_enter */
case 516:
break;
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index d524f3c..d4b67ae 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -89,7 +89,8 @@
18 AUE_GETFSSTAT COMPAT4 { int freebsd32_getfsstat( \
struct statfs32 *buf, long bufsize, \
int flags); }
-19 AUE_LSEEK OBSOL olseek
+19 AUE_LSEEK COMPAT { int freebsd32_lseek(int fd, int offset, \
+ int whence); }
20 AUE_GETPID NOPROTO { pid_t getpid(void); }
21 AUE_MOUNT NOPROTO { int mount(char *type, char *path, \
int flags, caddr_t data); }
@@ -956,8 +957,9 @@
512 AUE_SHMCTL NOSTD { int freebsd32_shmctl(int shmid, int cmd, \
struct shmid_ds32 *buf); }
513 AUE_LPATHCONF NOPROTO { int lpathconf(char *path, int name); }
-514 AUE_CAP_NEW UNIMPL cap_new
-515 AUE_CAP_GETRIGHTS UNIMPL cap_getrights
+514 AUE_CAP_NEW NOPROTO { int cap_new(int fd, u_int64_t rights); }
+515 AUE_CAP_GETRIGHTS NOPROTO { int cap_getrights(int fd, \
+ u_int64_t *rightsp); }
516 AUE_CAP_ENTER NOPROTO { int cap_enter(void); }
517 AUE_CAP_GETMODE NOPROTO { int cap_getmode(u_int *modep); }
518 AUE_PDFORK UNIMPL pdfork
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index ddbd8b4..692c5a3 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -1049,6 +1049,15 @@ linprocfs_doproccmdline(PFS_FILL_ARGS)
PROC_UNLOCK(p);
return (ret);
}
+
+ /*
+ * Mimic linux behavior and pass only processes with usermode
+ * address space as valid. Return zero silently otherwize.
+ */
+ if (p->p_vmspace == &vmspace0) {
+ PROC_UNLOCK(p);
+ return (0);
+ }
if (p->p_args != NULL) {
sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
PROC_UNLOCK(p);
@@ -1073,6 +1082,15 @@ linprocfs_doprocenviron(PFS_FILL_ARGS)
PROC_UNLOCK(p);
return (ret);
}
+
+ /*
+ * Mimic linux behavior and pass only processes with usermode
+ * address space as valid. Return zero silently otherwize.
+ */
+ if (p->p_vmspace == &vmspace0) {
+ PROC_UNLOCK(p);
+ return (0);
+ }
PROC_UNLOCK(p);
ret = linprocfs_doargv(td, p, sb, ps_string_env);
diff --git a/sys/compat/linux/linux_ipc.c b/sys/compat/linux/linux_ipc.c
index 97cea53..36223b1 100644
--- a/sys/compat/linux/linux_ipc.c
+++ b/sys/compat/linux/linux_ipc.c
@@ -575,7 +575,15 @@ linux_semctl(struct thread *td, struct linux_semctl_args *args)
return (error);
case LINUX_IPC_INFO:
case LINUX_SEM_INFO:
- bcopy(&seminfo, &linux_seminfo, sizeof(linux_seminfo) );
+ bcopy(&seminfo, &linux_seminfo.semmni, sizeof(linux_seminfo) -
+ sizeof(linux_seminfo.semmap) );
+ /*
+ * Linux does not use the semmap field but populates it with
+ * the defined value from SEMMAP, which really is redefined to
+ * SEMMNS, which they define as SEMMNI * SEMMSL. Try to
+ * simulate this returning our dynamic semmns value.
+ */
+ linux_seminfo.semmap = linux_seminfo.semmns;
/* XXX BSD equivalent?
#define used_semids 10
#define used_sems 10
diff --git a/sys/conf/Makefile.mips b/sys/conf/Makefile.mips
index 55d57e6..ab2b40a 100644
--- a/sys/conf/Makefile.mips
+++ b/sys/conf/Makefile.mips
@@ -50,7 +50,13 @@ HACK_EXTRA_FLAGS=-shared
# is extremely poor, as well as -mno-abicalls to force no ABI usage.
CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS)
-TRAMP_EXTRA_FLAGS=${EXTRA_FLAGS} $(ARCH_FLAGS)
+TRAMP_ARCH_FLAGS?=$(ARCH_FLAGS)
+TRAMP_EXTRA_FLAGS=${EXTRA_FLAGS} ${TRAMP_ARCH_FLAGS}
+.if ${MACHINE_ARCH:Mmips64*} != ""
+TRAMP_ELFSIZE=64
+.else
+TRAMP_ELFSIZE=32
+.endif
# XXX hardcoded kernel entry point
ASM_CFLAGS+=${CFLAGS} -D_LOCORE -DLOCORE
@@ -64,11 +70,12 @@ ${KERNEL_KO}.tramp.bin: ${KERNEL_KO} $S/$M/$M/elf_trampoline.c \
sed -e s/${KERNLOADADDR}/${TRAMPLOADADDR}/ -e s/" + SIZEOF_HEADERS"// \
${LDSCRIPT_NAME} > ${LDSCRIPT_NAME}.tramp.noheader
${CC} -O -nostdlib -I. -I$S ${TRAMP_EXTRA_FLAGS} ${TRAMP_LDFLAGS} -Xlinker \
- -T -Xlinker ${LDSCRIPT_NAME}.tramp.noheader \
- -DKERNNAME="\"${KERNEL_KO}.tmp\"" $S/$M/$M/elf_trampoline.c \
- $S/$M/$M/inckern.S -o ${KERNEL_KO}.tramp.noheader
- ${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \
- ${KERNEL_KO}.tramp.bin \
+ -T -Xlinker ${LDSCRIPT_NAME}.tramp.noheader \
+ -DKERNNAME="\"${KERNEL_KO}.tmp\"" -DELFSIZE=${TRAMP_ELFSIZE} \
+ $S/$M/$M/elf_trampoline.c $S/$M/$M/inckern.S \
+ -o ${KERNEL_KO}.tramp.elf
+ ${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.elf \
+ ${KERNEL_KO}.tramp.bin
%BEFORE_DEPEND
@@ -83,7 +90,7 @@ ${KERNEL_KO}.tramp.bin: ${KERNEL_KO} $S/$M/$M/elf_trampoline.c \
%CLEAN
CLEAN+= ${LDSCRIPT_NAME} ${LDSCRIPT_NAME}.tramp.noheader \
- ${KERNEL_KO}.tramp.noheader ${KERNEL_KO}.tramp.bin
+ ${KERNEL_KO}.tramp.elf ${KERNEL_KO}.tramp.bin
${LDSCRIPT_NAME}: $S/conf/${LDSCRIPT_NAME}
sed s/KERNLOADADDR/${KERNLOADADDR}/g $S/conf/${LDSCRIPT_NAME} \
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index b84d0c5..d3951e3 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -1162,7 +1162,8 @@ options MAC_STUB
options MAC_TEST
# Support for Capsicum
-options CAPABILITIES
+options CAPABILITIES # fine-grained rights on file descriptors
+options CAPABILITY_MODE # sandboxes with no global namespace access
#####################################################################
@@ -2252,14 +2253,14 @@ device sound
# conjunction with snd_sbc.
# snd_sbc: Creative SoundBlaster ISA PnP/non-PnP.
# Supports ESS and Avance ISA chips as well.
-# snd_spicds: SPI codec driver, needed by Envy24/Envy24HT drivers.
# snd_solo: ESS Solo-1x PCI.
+# snd_spicds: SPI codec driver, needed by Envy24/Envy24HT drivers.
# snd_t4dwave: Trident 4DWave DX/NX PCI, Sis 7018 PCI and Acer Labs
# M5451 PCI.
+# snd_uaudio: USB audio.
# snd_via8233: VIA VT8233x PCI.
# snd_via82c686: VIA VT82C686A PCI.
# snd_vibes: S3 Sonicvibes PCI.
-# snd_uaudio: USB audio.
device snd_ad1816
device snd_als4000
@@ -2289,10 +2290,10 @@ device snd_sbc
device snd_solo
device snd_spicds
device snd_t4dwave
+device snd_uaudio
device snd_via8233
device snd_via82c686
device snd_vibes
-device snd_uaudio
# For non-PnP sound cards:
hint.pcm.0.at="isa"
@@ -2832,9 +2833,6 @@ options VERBOSE_SYSINIT
#####################################################################
# SYSV IPC KERNEL PARAMETERS
#
-# Maximum number of entries in a semaphore map.
-options SEMMAP=31
-
# Maximum number of System V semaphores that can be used on the system at
# one time.
options SEMMNI=11
diff --git a/sys/conf/files b/sys/conf/files
index a62e1a6..0dc814e 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -386,14 +386,14 @@ contrib/pf/net/pf_if.c optional pf inet \
compile-with "${NORMAL_C} -I$S/contrib/pf"
contrib/pf/net/pf_ioctl.c optional pf inet \
compile-with "${NORMAL_C} -I$S/contrib/pf"
+contrib/pf/net/pf_lb.c optional pf inet \
+ compile-with "${NORMAL_C} -I$S/contrib/pf"
contrib/pf/net/pf_norm.c optional pf inet \
compile-with "${NORMAL_C} -I$S/contrib/pf"
contrib/pf/net/pf_osfp.c optional pf inet \
compile-with "${NORMAL_C} -I$S/contrib/pf"
contrib/pf/net/pf_ruleset.c optional pf inet \
compile-with "${NORMAL_C} -I$S/contrib/pf"
-contrib/pf/net/pf_subr.c optional pf inet \
- compile-with "${NORMAL_C} -I$S/contrib/pf"
contrib/pf/net/pf_table.c optional pf inet \
compile-with "${NORMAL_C} -I$S/contrib/pf"
contrib/pf/netinet/in4_cksum.c optional pf inet
@@ -1552,6 +1552,7 @@ dev/pci/isa_pci.c optional pci isa
dev/pci/pci.c optional pci
dev/pci/pci_if.m standard
dev/pci/pci_pci.c optional pci
+dev/pci/pci_subr.c optional pci
dev/pci/pci_user.c optional pci
dev/pci/pcib_if.m standard
dev/pci/vga_pci.c optional pci
@@ -1917,6 +1918,7 @@ dev/usb/net/if_kue.c optional kue
dev/usb/net/if_mos.c optional mos
dev/usb/net/if_rue.c optional rue
dev/usb/net/if_udav.c optional udav
+dev/usb/net/if_usie.c optional usie
dev/usb/net/usb_ethernet.c optional aue | axe | cdce | cue | kue | mos | \
rue | udav
dev/usb/net/uhso.c optional uhso
@@ -1969,8 +1971,8 @@ dev/usb/serial/uvscom.c optional uvscom
dev/usb/serial/usb_serial.c optional ucom | u3g | uark | ubsa | ubser | \
uchcom | ucycom | ufoma | uftdi | \
ugensa | uipaq | umcs | umct | \
- umodem | umoscom | uplcom | uslcom | \
- uvisor | uvscom
+ umodem | umoscom | uplcom | usie | \
+ uslcom | uvisor | uvscom
#
# USB misc drivers
#
@@ -1991,8 +1993,12 @@ dev/usb/quirk/usb_quirk.c optional usb
#
# USB templates
#
-dev/usb/template/usb_template.c optional usb_template
+dev/usb/template/usb_template.c optional usb_template
+dev/usb/template/usb_template_audio.c optional usb_template
dev/usb/template/usb_template_cdce.c optional usb_template
+dev/usb/template/usb_template_kbd.c optional usb_template
+dev/usb/template/usb_template_modem.c optional usb_template
+dev/usb/template/usb_template_mouse.c optional usb_template
dev/usb/template/usb_template_msc.c optional usb_template
dev/usb/template/usb_template_mtp.c optional usb_template
#
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 7916845..1388d01 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -128,7 +128,6 @@ amd64/amd64/trap.c standard
amd64/amd64/uio_machdep.c standard
amd64/amd64/uma_machdep.c standard
amd64/amd64/vm_machdep.c standard
-amd64/pci/pci_bus.c optional pci
amd64/pci/pci_cfgreg.c optional pci
crypto/aesni/aesencdec_amd64.S optional aesni
crypto/aesni/aeskeys_amd64.S optional aesni
@@ -315,7 +314,8 @@ x86/isa/isa.c standard
x86/isa/isa_dma.c standard
x86/isa/nmi.c standard
x86/isa/orm.c optional isa
-x86/pci/qpi.c standard
+x86/pci/pci_bus.c optional pci
+x86/pci/qpi.c optional pci
x86/x86/busdma_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/io_apic.c standard
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 4f0d0d0..a19b93c 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -352,7 +352,6 @@ i386/linux/linux_support.s optional compat_linux \
dependency "linux_assym.h"
i386/linux/linux_sysent.c optional compat_linux
i386/linux/linux_sysvec.c optional compat_linux
-i386/pci/pci_bus.c optional pci
i386/pci/pci_cfgreg.c optional pci
i386/pci/pci_pir.c optional pci
i386/svr4/svr4_locore.s optional compat_svr4 \
@@ -405,14 +404,15 @@ x86/isa/isa.c optional isa
x86/isa/isa_dma.c optional isa
x86/isa/nmi.c standard
x86/isa/orm.c optional isa
-x86/pci/qpi.c standard
+x86/pci/pci_bus.c optional pci
+x86/pci/qpi.c optional pci
x86/x86/busdma_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/io_apic.c optional apic
x86/x86/local_apic.c optional apic
x86/x86/mca.c standard
x86/x86/mptable.c optional apic native
-x86/x86/mptable_pci.c optional apic pci
+x86/x86/mptable_pci.c optional apic native pci
x86/x86/msi.c optional apic pci
x86/x86/nexus.c standard
x86/x86/tsc.c standard
diff --git a/sys/conf/files.ia64 b/sys/conf/files.ia64
index 15ef939..e341230 100644
--- a/sys/conf/files.ia64
+++ b/sys/conf/files.ia64
@@ -120,6 +120,7 @@ ia64/pci/pci_cfgreg.c optional pci
isa/syscons_isa.c optional sc
isa/vga_isa.c optional vga
kern/imgact_elf32.c optional compat_freebsd32
+kern/kern_clocksource.c standard
libkern/bcmp.c standard
libkern/ffsl.c standard
libkern/fls.c standard
diff --git a/sys/conf/files.mips b/sys/conf/files.mips
index 7ad93a5..6438c49 100644
--- a/sys/conf/files.mips
+++ b/sys/conf/files.mips
@@ -106,4 +106,5 @@ dev/siba/siba_pcib.c optional siba pci
dev/hwpmc/hwpmc_mips.c optional hwpmc
dev/hwpmc/hwpmc_mips24k.c optional hwpmc
+dev/rt/if_rt.c optional rt
dev/nvram2env/nvram2env.c optional nvram2env
diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98
index 5db5421..e034601 100644
--- a/sys/conf/files.pc98
+++ b/sys/conf/files.pc98
@@ -199,7 +199,6 @@ i386/linux/linux_support.s optional compat_linux \
dependency "linux_assym.h"
i386/linux/linux_sysent.c optional compat_linux
i386/linux/linux_sysvec.c optional compat_linux
-i386/pci/pci_bus.c optional pci
i386/pci/pci_cfgreg.c optional pci
i386/pci/pci_pir.c optional pci
i386/svr4/svr4_locore.s optional compat_svr4 \
@@ -249,6 +248,7 @@ pc98/pc98/pc98_machdep.c standard
x86/isa/atpic.c optional atpic
x86/isa/clock.c standard
x86/isa/isa.c optional isa
+x86/pci/pci_bus.c optional pci
x86/x86/busdma_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/io_apic.c optional apic
diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc
index 7226c8f..9f5a357 100644
--- a/sys/conf/files.powerpc
+++ b/sys/conf/files.powerpc
@@ -203,11 +203,13 @@ powerpc/powerpc/syncicache.c standard
powerpc/powerpc/sys_machdep.c standard
powerpc/powerpc/uio_machdep.c standard
powerpc/ps3/ehci_ps3.c optional ps3 ehci
+powerpc/ps3/ohci_ps3.c optional ps3 ohci
powerpc/ps3/if_glc.c optional ps3 glc
powerpc/ps3/mmu_ps3.c optional ps3
powerpc/ps3/platform_ps3.c optional ps3
powerpc/ps3/ps3ata.c optional ps3 ps3ata
powerpc/ps3/ps3bus.c optional ps3
+powerpc/ps3/ps3disk.c optional ps3
powerpc/ps3/ps3pic.c optional ps3
powerpc/ps3/ps3_syscons.c optional ps3 sc
powerpc/ps3/ps3-hvcall.S optional ps3 sc
diff --git a/sys/conf/options b/sys/conf/options
index ee696a8..9f1ac80 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -63,7 +63,8 @@ SYSCTL_DEBUG opt_sysctl.h
ADAPTIVE_LOCKMGRS
ALQ
AUDIT opt_global.h
-CAPABILITIES opt_capabilities.h
+CAPABILITIES opt_capsicum.h
+CAPABILITY_MODE opt_capsicum.h
CODA_COMPAT_5 opt_coda.h
COMPAT_43 opt_compat.h
COMPAT_43TTY opt_compat.h
@@ -163,7 +164,6 @@ MSGMNI opt_sysvipc.h
MSGSEG opt_sysvipc.h
MSGSSZ opt_sysvipc.h
MSGTQL opt_sysvipc.h
-SEMMAP opt_sysvipc.h
SEMMNI opt_sysvipc.h
SEMMNS opt_sysvipc.h
SEMMNU opt_sysvipc.h
@@ -426,7 +426,6 @@ SLIP_IFF_OPTS opt_slip.h
TCPDEBUG
TCP_OFFLOAD_DISABLE opt_inet.h #Disable code to dispatch tcp offloading
TCP_SIGNATURE opt_inet.h
-TCP_SORECEIVE_STREAM opt_inet.h
VLAN_ARRAY opt_vlan.h
XBONEHACK
FLOWTABLE opt_route.h
@@ -773,7 +772,8 @@ ATH_TXBUF opt_ath.h
ATH_RXBUF opt_ath.h
ATH_DIAGAPI opt_ath.h
ATH_TX99_DIAG opt_ath.h
-ATH_ENABLE_11N opt_ah.h
+ATH_ENABLE_11N opt_ath.h
+ATH_ENABLE_DFS opt_ath.h
# options for the Atheros hal
AH_SUPPORT_AR5416 opt_ah.h
diff --git a/sys/conf/options.mips b/sys/conf/options.mips
index c3ba6b9..0384283 100644
--- a/sys/conf/options.mips
+++ b/sys/conf/options.mips
@@ -36,6 +36,7 @@ CPU_HAVEFPU opt_global.h
CPU_SB1 opt_global.h
CPU_CNMIPS opt_global.h
CPU_RMI opt_global.h
+CPU_NLM opt_global.h
ISA_MIPS1 opt_cputype.h
ISA_MIPS3 opt_cputype.h
@@ -70,3 +71,11 @@ OCTEON_BOARD_CAPK_0100ND opt_cvmx.h
# Options that control the Atheros SoC peripherals
#
ARGE_DEBUG opt_global.h
+
+#
+# Options that control the Ralink RT305xF Etherenet MAC.
+#
+IF_RT_DEBUG opt_if_rt.h
+IF_RT_PHY_SUPPORT opt_if_rt.h
+IF_RT_RING_DATA_COUNT opt_if_rt.h
+
diff --git a/sys/contrib/altq/altq/altq_red.c b/sys/contrib/altq/altq/altq_red.c
index cd216bd..b461ce0 100644
--- a/sys/contrib/altq/altq/altq_red.c
+++ b/sys/contrib/altq/altq/altq_red.c
@@ -514,11 +514,9 @@ mark_ecn(struct mbuf *m, struct altq_pktattr *pktattr, int flags)
struct mbuf *m0;
struct pf_mtag *at;
void *hdr;
- int af;
at = pf_find_mtag(m);
if (at != NULL) {
- af = at->af;
hdr = at->hdr;
#ifdef ALTQ3_COMPAT
} else if (pktattr != NULL) {
@@ -528,9 +526,6 @@ mark_ecn(struct mbuf *m, struct altq_pktattr *pktattr, int flags)
} else
return (0);
- if (af != AF_INET && af != AF_INET6)
- return (0);
-
/* verify that pattr_hdr is within the mbuf data */
for (m0 = m; m0 != NULL; m0 = m0->m_next)
if (((caddr_t)hdr >= m0->m_data) &&
@@ -541,8 +536,8 @@ mark_ecn(struct mbuf *m, struct altq_pktattr *pktattr, int flags)
return (0);
}
- switch (af) {
- case AF_INET:
+ switch (((struct ip *)hdr)->ip_v) {
+ case IPVERSION:
if (flags & REDF_ECN4) {
struct ip *ip = hdr;
u_int8_t otos;
@@ -575,7 +570,7 @@ mark_ecn(struct mbuf *m, struct altq_pktattr *pktattr, int flags)
}
break;
#ifdef INET6
- case AF_INET6:
+ case (IPV6_VERSION >> 4):
if (flags & REDF_ECN6) {
struct ip6_hdr *ip6 = hdr;
u_int32_t flowlabel;
diff --git a/sys/contrib/pf/net/if_pflog.c b/sys/contrib/pf/net/if_pflog.c
index d16a09b..0893e8d 100644
--- a/sys/contrib/pf/net/if_pflog.c
+++ b/sys/contrib/pf/net/if_pflog.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pflog.c,v 1.22 2006/12/15 09:31:20 otto Exp $ */
+/* $OpenBSD: if_pflog.c,v 1.26 2007/10/18 21:58:18 mpf Exp $ */
/*
* The authors of this code are John Ioannidis (ji@tla.org),
* Angelos D. Keromytis (kermit@csd.uch.gr) and
@@ -99,11 +99,11 @@ __FBSDID("$FreeBSD$");
#include <net/pfvar.h>
#include <net/if_pflog.h>
-#ifdef INET
#ifdef __FreeBSD__
+#ifdef INET
#include <machine/in_cksum.h>
-#endif
-#endif
+#endif /* INET */
+#endif /* __FreeBSD__ */
#define PFLOGMTU (32768 + MHLEN + MLEN)
@@ -115,7 +115,11 @@ __FBSDID("$FreeBSD$");
void pflogattach(int);
int pflogoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
- struct route *);
+#ifdef __FreeBSD__
+ struct route *);
+#else
+ struct rtentry *);
+#endif
int pflogioctl(struct ifnet *, u_long, caddr_t);
void pflogstart(struct ifnet *);
#ifdef __FreeBSD__
@@ -128,7 +132,7 @@ int pflog_clone_destroy(struct ifnet *);
LIST_HEAD(, pflog_softc) pflogif_list;
#ifdef __FreeBSD__
-IFC_SIMPLE_DECLARE(pflog, 1);
+IFC_SIMPLE_DECLARE(pflog, 1);
#else
struct if_clone pflog_cloner =
IF_CLONE_INITIALIZER("pflog", pflog_clone_create, pflog_clone_destroy);
@@ -136,10 +140,6 @@ struct if_clone pflog_cloner =
struct ifnet *pflogifs[PFLOGIFS_MAX]; /* for fast access */
-#ifndef __FreeBSD__
-extern int ifqmaxlen;
-#endif
-
void
pflogattach(int npflog)
{
@@ -147,9 +147,6 @@ pflogattach(int npflog)
LIST_INIT(&pflogif_list);
for (i = 0; i < PFLOGIFS_MAX; i++)
pflogifs[i] = NULL;
-#ifndef __FreeBSD__
- (void) pflog_clone_create(&pflog_cloner, 0);
-#endif
if_clone_attach(&pflog_cloner);
}
@@ -168,9 +165,9 @@ pflog_clone_create(struct if_clone *ifc, int unit)
if (unit >= PFLOGIFS_MAX)
return (EINVAL);
- if ((pflogif = malloc(sizeof(*pflogif), M_DEVBUF, M_NOWAIT)) == NULL)
+ if ((pflogif = malloc(sizeof(*pflogif),
+ M_DEVBUF, M_NOWAIT|M_ZERO)) == NULL)
return (ENOMEM);
- bzero(pflogif, sizeof(*pflogif));
pflogif->sc_unit = unit;
#ifdef __FreeBSD__
@@ -209,6 +206,7 @@ pflog_clone_create(struct if_clone *ifc, int unit)
s = splnet();
#ifdef __FreeBSD__
+ /* XXX: Why pf(4) lock?! Better add a pflog lock?! */
PF_LOCK();
#endif
LIST_INSERT_HEAD(&pflogif_list, pflogif, sc_list);
@@ -289,7 +287,11 @@ pflogstart(struct ifnet *ifp)
int
pflogoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
- struct route *ro)
+#ifdef __FreeBSD__
+ struct route *rt)
+#else
+ struct rtentry *rt)
+#endif
{
m_freem(m);
return (0);
@@ -300,9 +302,6 @@ int
pflogioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
switch (cmd) {
- case SIOCSIFADDR:
- case SIOCAIFADDR:
- case SIOCSIFDSTADDR:
case SIOCSIFFLAGS:
#ifdef __FreeBSD__
if (ifp->if_flags & IFF_UP)
@@ -317,7 +316,7 @@ pflogioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
#endif
break;
default:
- return (EINVAL);
+ return (ENOTTY);
}
return (0);
@@ -333,7 +332,7 @@ pflog_packet(struct pfi_kif *kif, struct mbuf *m, sa_family_t af, u_int8_t dir,
struct pfloghdr hdr;
if (kif == NULL || m == NULL || rm == NULL || pd == NULL)
- return (-1);
+ return ( 1);
if ((ifn = pflogifs[rm->logif]) == NULL || !ifn->if_bpf)
return (0);
@@ -347,7 +346,7 @@ pflog_packet(struct pfi_kif *kif, struct mbuf *m, sa_family_t af, u_int8_t dir,
if (am == NULL) {
hdr.rulenr = htonl(rm->nr);
- hdr.subrulenr = -1;
+ hdr.subrulenr = 1;
} else {
hdr.rulenr = htonl(am->nr);
hdr.subrulenr = htonl(rm->nr);
@@ -357,11 +356,11 @@ pflog_packet(struct pfi_kif *kif, struct mbuf *m, sa_family_t af, u_int8_t dir,
}
if (rm->log & PF_LOG_SOCKET_LOOKUP && !pd->lookup.done)
#ifdef __FreeBSD__
- /*
+ /*
* XXX: This should not happen as we force an early lookup
* via debug.pfugidhack
*/
- ; /* empty */
+ ; /* empty */
#else
pd->lookup.done = pf_socket_lookup(dir, pd);
#endif
diff --git a/sys/contrib/pf/net/if_pflog.h b/sys/contrib/pf/net/if_pflog.h
index a3c74d1..5f48f6c 100644
--- a/sys/contrib/pf/net/if_pflog.h
+++ b/sys/contrib/pf/net/if_pflog.h
@@ -1,5 +1,4 @@
-/* $FreeBSD$ */
-/* $OpenBSD: if_pflog.h,v 1.14 2006/10/25 11:27:01 henning Exp $ */
+/* $OpenBSD: if_pflog.h,v 1.13 2006/10/23 12:46:09 henning Exp $ */
/*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
* All rights reserved.
@@ -26,11 +25,10 @@
*/
#ifndef _NET_IF_PFLOG_H_
-#define _NET_IF_PFLOG_H_
+#define _NET_IF_PFLOG_H_
#define PFLOGIFS_MAX 16
-#ifdef _KERNEL
struct pflog_softc {
#ifdef __FreeBSD__
struct ifnet *sc_ifp; /* the interface pointer */
@@ -40,9 +38,8 @@ struct pflog_softc {
int sc_unit;
LIST_ENTRY(pflog_softc) sc_list;
};
-#endif /* _KERNEL */
-#define PFLOG_RULESET_NAME_SIZE 16
+#define PFLOG_RULESET_NAME_SIZE 16
struct pfloghdr {
u_int8_t length;
@@ -61,9 +58,9 @@ struct pfloghdr {
u_int8_t pad[3];
};
-#define PFLOG_HDRLEN sizeof(struct pfloghdr)
+#define PFLOG_HDRLEN sizeof(struct pfloghdr)
/* minus pad, also used as a signature */
-#define PFLOG_REAL_HDRLEN offsetof(struct pfloghdr, pad)
+#define PFLOG_REAL_HDRLEN offsetof(struct pfloghdr, pad)
/* XXX remove later when old format logs are no longer needed */
struct old_pfloghdr {
@@ -74,23 +71,24 @@ struct old_pfloghdr {
u_short action;
u_short dir;
};
-#define OLD_PFLOG_HDRLEN sizeof(struct old_pfloghdr)
+#define OLD_PFLOG_HDRLEN sizeof(struct old_pfloghdr)
#ifdef _KERNEL
-
#ifdef __FreeBSD__
struct pf_rule;
struct pf_ruleset;
struct pfi_kif;
struct pf_pdesc;
+#if 0
typedef int pflog_packet_t(struct pfi_kif *, struct mbuf *, sa_family_t,
u_int8_t, u_int8_t, struct pf_rule *, struct pf_rule *,
struct pf_ruleset *, struct pf_pdesc *);
extern pflog_packet_t *pflog_packet_ptr;
-#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g,h) do { \
- if (pflog_packet_ptr != NULL) \
- pflog_packet_ptr(i,a,b,c,d,e,f,g,h); \
+#endif
+#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g,h) do { \
+ if (pflog_packet_ptr != NULL) \
+ pflog_packet_ptr(i,a,b,c,d,e,f,g,h); \
} while (0)
#else /* ! __FreeBSD__ */
#if NPFLOG > 0
@@ -98,6 +96,6 @@ extern pflog_packet_t *pflog_packet_ptr;
#else
#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g,h) ((void)0)
#endif /* NPFLOG > 0 */
-#endif /* __FreeBSD__ */
+#endif
#endif /* _KERNEL */
#endif /* _NET_IF_PFLOG_H_ */
diff --git a/sys/contrib/pf/net/if_pflow.h b/sys/contrib/pf/net/if_pflow.h
new file mode 100644
index 0000000..35ccbeb
--- /dev/null
+++ b/sys/contrib/pf/net/if_pflow.h
@@ -0,0 +1,126 @@
+/* $OpenBSD: if_pflow.h,v 1.5 2009/02/27 11:09:36 gollo Exp $ */
+
+/*
+ * Copyright (c) 2008 Henning Brauer <henning@openbsd.org>
+ * Copyright (c) 2008 Joerg Goltermann <jg@osn.de>
+ *
+ * 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 MIND, 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _NET_IF_PFLOW_H_
+#define _NET_IF_PFLOW_H_
+
+#define PFLOW_ID_LEN sizeof(u_int64_t)
+
+#define PFLOW_MAXFLOWS 30
+#define PFLOW_VERSION 5
+#define PFLOW_ENGINE_TYPE 42
+#define PFLOW_ENGINE_ID 42
+#define PFLOW_MAXBYTES 0xffffffff
+#define PFLOW_TIMEOUT 30
+
+struct pflow_flow {
+ u_int32_t src_ip;
+ u_int32_t dest_ip;
+ u_int32_t nexthop_ip;
+ u_int16_t if_index_in;
+ u_int16_t if_index_out;
+ u_int32_t flow_packets;
+ u_int32_t flow_octets;
+ u_int32_t flow_start;
+ u_int32_t flow_finish;
+ u_int16_t src_port;
+ u_int16_t dest_port;
+ u_int8_t pad1;
+ u_int8_t tcp_flags;
+ u_int8_t protocol;
+ u_int8_t tos;
+ u_int16_t src_as;
+ u_int16_t dest_as;
+ u_int8_t src_mask;
+ u_int8_t dest_mask;
+ u_int16_t pad2;
+} __packed;
+
+#ifdef _KERNEL
+
+extern int pflow_ok;
+
+struct pflow_softc {
+ struct ifnet sc_if;
+ struct ifnet *sc_pflow_ifp;
+
+ unsigned int sc_count;
+ unsigned int sc_maxcount;
+ u_int64_t sc_gcounter;
+ struct ip_moptions sc_imo;
+#ifdef __FreeBSD__
+ struct callout sc_tmo;
+#else
+ struct timeout sc_tmo;
+#endif
+ struct in_addr sc_sender_ip;
+ u_int16_t sc_sender_port;
+ struct in_addr sc_receiver_ip;
+ u_int16_t sc_receiver_port;
+ struct mbuf *sc_mbuf; /* current cumulative mbuf */
+ SLIST_ENTRY(pflow_softc) sc_next;
+};
+
+extern struct pflow_softc *pflowif;
+
+#endif /* _KERNEL */
+
+struct pflow_header {
+ u_int16_t version;
+ u_int16_t count;
+ u_int32_t uptime_ms;
+ u_int32_t time_sec;
+ u_int32_t time_nanosec;
+ u_int32_t flow_sequence;
+ u_int8_t engine_type;
+ u_int8_t engine_id;
+ u_int8_t reserved1;
+ u_int8_t reserved2;
+} __packed;
+
+#define PFLOW_HDRLEN sizeof(struct pflow_header)
+
+struct pflowstats {
+ u_int64_t pflow_flows;
+ u_int64_t pflow_packets;
+ u_int64_t pflow_onomem;
+ u_int64_t pflow_oerrors;
+};
+
+/*
+ * Configuration structure for SIOCSETPFLOW SIOCGETPFLOW
+ */
+struct pflowreq {
+ struct in_addr sender_ip;
+ struct in_addr receiver_ip;
+ u_int16_t receiver_port;
+ u_int16_t addrmask;
+#define PFLOW_MASK_SRCIP 0x01
+#define PFLOW_MASK_DSTIP 0x02
+#define PFLOW_MASK_DSTPRT 0x04
+};
+
+#ifdef _KERNEL
+int export_pflow(struct pf_state *);
+int pflow_sysctl(int *, u_int, void *, size_t *, void *, size_t);
+#endif /* _KERNEL */
+
+#endif /* _NET_IF_PFLOW_H_ */
diff --git a/sys/contrib/pf/net/if_pfsync.c b/sys/contrib/pf/net/if_pfsync.c
index 9466118..ba8a348 100644
--- a/sys/contrib/pf/net/if_pfsync.c
+++ b/sys/contrib/pf/net/if_pfsync.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pfsync.c,v 1.73 2006/11/16 13:13:38 henning Exp $ */
+/* $OpenBSD: if_pfsync.c,v 1.110 2009/02/24 05:39:19 dlg Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff
@@ -26,10 +26,25 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
+/*
+ * Copyright (c) 2009 David Gwynne <dlg@openbsd.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.
+ */
+
#ifdef __FreeBSD__
#include "opt_inet.h"
#include "opt_inet6.h"
-#include "opt_carp.h"
#include "opt_bpf.h"
#include "opt_pf.h"
@@ -56,7 +71,10 @@ __FBSDID("$FreeBSD$");
#endif /* __FreeBSD__ */
#include <sys/param.h>
+#include <sys/kernel.h>
#ifdef __FreeBSD__
+#include <sys/bus.h>
+#include <sys/interrupt.h>
#include <sys/priv.h>
#endif
#include <sys/proc.h>
@@ -72,12 +90,14 @@ __FBSDID("$FreeBSD$");
#include <sys/taskqueue.h>
#include <sys/lock.h>
#include <sys/mutex.h>
-#include <sys/sysctl.h>
#else
#include <sys/ioctl.h>
#include <sys/timeout.h>
#endif
-#include <sys/kernel.h>
+#include <sys/sysctl.h>
+#ifndef __FreeBSD__
+#include <sys/pool.h>
+#endif
#include <net/if.h>
#ifdef __FreeBSD__
@@ -86,6 +106,11 @@ __FBSDID("$FreeBSD$");
#include <net/if_types.h>
#include <net/route.h>
#include <net/bpf.h>
+#include <net/netisr.h>
+#ifdef __FreeBSD__
+#include <net/vnet.h>
+#endif
+
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netinet/tcp.h>
@@ -117,23 +142,191 @@ __FBSDID("$FreeBSD$");
#include "pfsync.h"
#endif
-#define PFSYNC_MINMTU \
- (sizeof(struct pfsync_header) + sizeof(struct pf_state))
+#define PFSYNC_MINPKT ( \
+ sizeof(struct ip) + \
+ sizeof(struct pfsync_header) + \
+ sizeof(struct pfsync_subheader) + \
+ sizeof(struct pfsync_eof))
+
+struct pfsync_pkt {
+ struct ip *ip;
+ struct in_addr src;
+ u_int8_t flags;
+};
+
+int pfsync_input_hmac(struct mbuf *, int);
+
+int pfsync_upd_tcp(struct pf_state *, struct pfsync_state_peer *,
+ struct pfsync_state_peer *);
+
+int pfsync_in_clr(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_ins(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_iack(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_upd(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_upd_c(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_ureq(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_del(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_del_c(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_bus(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_tdb(struct pfsync_pkt *, struct mbuf *, int, int);
+int pfsync_in_eof(struct pfsync_pkt *, struct mbuf *, int, int);
+
+int pfsync_in_error(struct pfsync_pkt *, struct mbuf *, int, int);
+
+int (*pfsync_acts[])(struct pfsync_pkt *, struct mbuf *, int, int) = {
+ pfsync_in_clr, /* PFSYNC_ACT_CLR */
+ pfsync_in_ins, /* PFSYNC_ACT_INS */
+ pfsync_in_iack, /* PFSYNC_ACT_INS_ACK */
+ pfsync_in_upd, /* PFSYNC_ACT_UPD */
+ pfsync_in_upd_c, /* PFSYNC_ACT_UPD_C */
+ pfsync_in_ureq, /* PFSYNC_ACT_UPD_REQ */
+ pfsync_in_del, /* PFSYNC_ACT_DEL */
+ pfsync_in_del_c, /* PFSYNC_ACT_DEL_C */
+ pfsync_in_error, /* PFSYNC_ACT_INS_F */
+ pfsync_in_error, /* PFSYNC_ACT_DEL_F */
+ pfsync_in_bus, /* PFSYNC_ACT_BUS */
+ pfsync_in_tdb, /* PFSYNC_ACT_TDB */
+ pfsync_in_eof /* PFSYNC_ACT_EOF */
+};
+
+struct pfsync_q {
+ int (*write)(struct pf_state *, struct mbuf *, int);
+ size_t len;
+ u_int8_t action;
+};
+
+/* we have one of these for every PFSYNC_S_ */
+int pfsync_out_state(struct pf_state *, struct mbuf *, int);
+int pfsync_out_iack(struct pf_state *, struct mbuf *, int);
+int pfsync_out_upd_c(struct pf_state *, struct mbuf *, int);
+int pfsync_out_del(struct pf_state *, struct mbuf *, int);
+
+struct pfsync_q pfsync_qs[] = {
+ { pfsync_out_state, sizeof(struct pfsync_state), PFSYNC_ACT_INS },
+ { pfsync_out_iack, sizeof(struct pfsync_ins_ack), PFSYNC_ACT_INS_ACK },
+ { pfsync_out_state, sizeof(struct pfsync_state), PFSYNC_ACT_UPD },
+ { pfsync_out_upd_c, sizeof(struct pfsync_upd_c), PFSYNC_ACT_UPD_C },
+ { pfsync_out_del, sizeof(struct pfsync_del_c), PFSYNC_ACT_DEL_C }
+};
+
+void pfsync_q_ins(struct pf_state *, int);
+void pfsync_q_del(struct pf_state *);
+
+struct pfsync_upd_req_item {
+ TAILQ_ENTRY(pfsync_upd_req_item) ur_entry;
+ struct pfsync_upd_req ur_msg;
+};
+TAILQ_HEAD(pfsync_upd_reqs, pfsync_upd_req_item);
+
+struct pfsync_deferral {
+ TAILQ_ENTRY(pfsync_deferral) pd_entry;
+ struct pf_state *pd_st;
+ struct mbuf *pd_m;
+#ifdef __FreeBSD__
+ struct callout pd_tmo;
+#else
+ struct timeout pd_tmo;
+#endif
+};
+TAILQ_HEAD(pfsync_deferrals, pfsync_deferral);
+
+#define PFSYNC_PLSIZE MAX(sizeof(struct pfsync_upd_req_item), \
+ sizeof(struct pfsync_deferral))
+
+#ifdef notyet
+int pfsync_out_tdb(struct tdb *, struct mbuf *, int);
+#endif
-#ifdef PFSYNCDEBUG
-#define DPRINTF(x) do { if (pfsyncdebug) printf x ; } while (0)
-int pfsyncdebug;
+struct pfsync_softc {
+#ifdef __FreeBSD__
+ struct ifnet *sc_ifp;
+#else
+ struct ifnet sc_if;
+#endif
+ struct ifnet *sc_sync_if;
+
+#ifdef __FreeBSD__
+ uma_zone_t sc_pool;
#else
-#define DPRINTF(x)
+ struct pool sc_pool;
#endif
+ struct ip_moptions sc_imo;
+
+ struct in_addr sc_sync_peer;
+ u_int8_t sc_maxupdates;
+#ifdef __FreeBSD__
+ int pfsync_sync_ok;
+#endif
+
+ struct ip sc_template;
+
+ struct pf_state_queue sc_qs[PFSYNC_S_COUNT];
+ size_t sc_len;
+
+ struct pfsync_upd_reqs sc_upd_req_list;
+
+ struct pfsync_deferrals sc_deferrals;
+ u_int sc_deferred;
+
+ void *sc_plus;
+ size_t sc_pluslen;
+
+ u_int32_t sc_ureq_sent;
+ int sc_bulk_tries;
+#ifdef __FreeBSD__
+ struct callout sc_bulkfail_tmo;
+#else
+ struct timeout sc_bulkfail_tmo;
+#endif
+
+ u_int32_t sc_ureq_received;
+ struct pf_state *sc_bulk_next;
+ struct pf_state *sc_bulk_last;
+#ifdef __FreeBSD__
+ struct callout sc_bulk_tmo;
+#else
+ struct timeout sc_bulk_tmo;
+#endif
+
+ TAILQ_HEAD(, tdb) sc_tdb_q;
+
+#ifdef __FreeBSD__
+ struct callout sc_tmo;
+#else
+ struct timeout sc_tmo;
+#endif
+#ifdef __FreeBSD__
+ eventhandler_tag sc_detachtag;
+#endif
+
+};
+
+#ifdef __FreeBSD__
+static VNET_DEFINE(struct pfsync_softc *, pfsyncif) = NULL;
+#define V_pfsyncif VNET(pfsyncif)
+
+static VNET_DEFINE(struct pfsyncstats, pfsyncstats);
+#define V_pfsyncstats VNET(pfsyncstats)
+
+SYSCTL_NODE(_net, OID_AUTO, pfsync, CTLFLAG_RW, 0, "PFSYNC");
+SYSCTL_VNET_STRUCT(_net_pfsync, OID_AUTO, stats, CTLFLAG_RW,
+ &VNET_NAME(pfsyncstats), pfsyncstats,
+ "PFSYNC statistics (struct pfsyncstats, net/if_pfsync.h)");
+#else
struct pfsync_softc *pfsyncif = NULL;
struct pfsyncstats pfsyncstats;
+#define V_pfsyncstats pfsyncstats
+#endif
+
#ifdef __FreeBSD__
-SYSCTL_DECL(_net_inet_pfsync);
-SYSCTL_STRUCT(_net_inet_pfsync, 0, stats, CTLFLAG_RW,
- &pfsyncstats, pfsyncstats,
- "PFSYNC statistics (struct pfsyncstats, net/if_pfsync.h)");
+static void pfsyncintr(void *);
+struct pfsync_swi {
+ void * pfsync_swi_cookie;
+};
+static struct pfsync_swi pfsync_swi;
+#define schednetisr(p) swi_sched(pfsync_swi.pfsync_swi_cookie, 0)
+#define NETISR_PFSYNC
#endif
void pfsyncattach(int);
@@ -144,45 +337,53 @@ void pfsync_clone_destroy(struct ifnet *);
int pfsync_clone_create(struct if_clone *, int);
int pfsync_clone_destroy(struct ifnet *);
#endif
-void pfsync_setmtu(struct pfsync_softc *, int);
int pfsync_alloc_scrub_memory(struct pfsync_state_peer *,
struct pf_state_peer *);
-int pfsync_insert_net_state(struct pfsync_state *, u_int8_t);
-#ifdef PFSYNC_TDB
void pfsync_update_net_tdb(struct pfsync_tdb *);
-#endif
int pfsyncoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
+#ifdef __FreeBSD__
struct route *);
+#else
+ struct rtentry *);
+#endif
int pfsyncioctl(struct ifnet *, u_long, caddr_t);
void pfsyncstart(struct ifnet *);
-struct mbuf *pfsync_get_mbuf(struct pfsync_softc *, u_int8_t, void **);
-int pfsync_request_update(struct pfsync_state_upd *, struct in_addr *);
-int pfsync_sendout(struct pfsync_softc *);
-#ifdef PFSYNC_TDB
+struct mbuf *pfsync_if_dequeue(struct ifnet *);
+struct mbuf *pfsync_get_mbuf(struct pfsync_softc *);
+
+void pfsync_deferred(struct pf_state *, int);
+void pfsync_undefer(struct pfsync_deferral *, int);
+void pfsync_defer_tmo(void *);
+
+void pfsync_request_update(u_int32_t, u_int64_t);
+void pfsync_update_state_req(struct pf_state *);
+
+void pfsync_drop(struct pfsync_softc *);
+void pfsync_sendout(void);
+void pfsync_send_plus(void *, size_t);
int pfsync_tdb_sendout(struct pfsync_softc *);
-#endif
int pfsync_sendout_mbuf(struct pfsync_softc *, struct mbuf *);
void pfsync_timeout(void *);
-#ifdef PFSYNC_TDB
void pfsync_tdb_timeout(void *);
-#endif
void pfsync_send_bus(struct pfsync_softc *, u_int8_t);
+
+void pfsync_bulk_start(void);
+void pfsync_bulk_status(u_int8_t);
void pfsync_bulk_update(void *);
-void pfsync_bulkfail(void *);
+void pfsync_bulk_fail(void *);
#ifdef __FreeBSD__
void pfsync_ifdetach(void *, struct ifnet *);
-void pfsync_senddef(void *, int);
/* XXX: ugly */
#define betoh64 (unsigned long long)be64toh
#define timeout_del callout_stop
#endif
-int pfsync_sync_ok;
+#define PFSYNC_MAX_BULKTRIES 12
#ifndef __FreeBSD__
-extern int ifqmaxlen;
+int pfsync_sync_ok;
#endif
#ifdef __FreeBSD__
@@ -197,7 +398,6 @@ pfsyncattach(int npfsync)
{
if_clone_attach(&pfsync_cloner);
}
-
int
#ifdef __FreeBSD__
pfsync_clone_create(struct if_clone *ifc, int unit, caddr_t param)
@@ -205,95 +405,103 @@ pfsync_clone_create(struct if_clone *ifc, int unit, caddr_t param)
pfsync_clone_create(struct if_clone *ifc, int unit)
#endif
{
+ struct pfsync_softc *sc;
struct ifnet *ifp;
+ int q;
if (unit != 0)
return (EINVAL);
+#ifndef __FreeBSD__
pfsync_sync_ok = 1;
- if ((pfsyncif = malloc(sizeof(*pfsyncif), M_DEVBUF, M_NOWAIT)) == NULL)
+#endif
+
+ sc = malloc(sizeof(struct pfsync_softc), M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (sc == NULL)
return (ENOMEM);
- bzero(pfsyncif, sizeof(*pfsyncif));
+
+ for (q = 0; q < PFSYNC_S_COUNT; q++)
+ TAILQ_INIT(&sc->sc_qs[q]);
+
#ifdef __FreeBSD__
- if ((pfsyncif->sc_imo.imo_membership = (struct in_multi **)malloc(
- (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_DEVBUF,
- M_NOWAIT)) == NULL) {
- free(pfsyncif, M_DEVBUF);
- return (ENOSPC);
+ sc->pfsync_sync_ok = 1;
+ sc->sc_pool = uma_zcreate("pfsync", PFSYNC_PLSIZE,
+ NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
+ if (sc->sc_pool == NULL) {
+ free(sc, M_DEVBUF);
+ return (ENOMEM);
}
- pfsyncif->sc_imo.imo_mfilters = NULL;
- pfsyncif->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
- pfsyncif->sc_imo.imo_multicast_vif = -1;
+#else
+ pool_init(&sc->sc_pool, PFSYNC_PLSIZE, 0, 0, 0, "pfsync", NULL);
+#endif
+ TAILQ_INIT(&sc->sc_upd_req_list);
+ TAILQ_INIT(&sc->sc_deferrals);
+ sc->sc_deferred = 0;
+
+ TAILQ_INIT(&sc->sc_tdb_q);
- ifp = pfsyncif->sc_ifp = if_alloc(IFT_PFSYNC);
+ sc->sc_len = PFSYNC_MINPKT;
+ sc->sc_maxupdates = 128;
+
+#ifdef __FreeBSD__
+ sc->sc_imo.imo_membership = (struct in_multi **)malloc(
+ (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_DEVBUF,
+ M_NOWAIT | M_ZERO);
+ sc->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
+ sc->sc_imo.imo_multicast_vif = -1;
+#else
+ sc->sc_imo.imo_membership = (struct in_multi **)malloc(
+ (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_IPMOPTS,
+ M_WAITOK | M_ZERO);
+ sc->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
+#endif
+
+#ifdef __FreeBSD__
+ ifp = sc->sc_ifp = if_alloc(IFT_PFSYNC);
if (ifp == NULL) {
- free(pfsyncif->sc_imo.imo_membership, M_DEVBUF);
- free(pfsyncif, M_DEVBUF);
+ free(sc->sc_imo.imo_membership, M_DEVBUF);
+ uma_zdestroy(sc->sc_pool);
+ free(sc, M_DEVBUF);
return (ENOSPC);
}
if_initname(ifp, ifc->ifc_name, unit);
- pfsyncif->sc_detachtag = EVENTHANDLER_REGISTER(ifnet_departure_event,
+ sc->sc_detachtag = EVENTHANDLER_REGISTER(ifnet_departure_event,
+#ifdef __FreeBSD__
+ pfsync_ifdetach, V_pfsyncif, EVENTHANDLER_PRI_ANY);
+#else
pfsync_ifdetach, pfsyncif, EVENTHANDLER_PRI_ANY);
- if (pfsyncif->sc_detachtag == NULL) {
+#endif
+ if (sc->sc_detachtag == NULL) {
if_free(ifp);
- free(pfsyncif->sc_imo.imo_membership, M_DEVBUF);
- free(pfsyncif, M_DEVBUF);
+ free(sc->sc_imo.imo_membership, M_DEVBUF);
+ uma_zdestroy(sc->sc_pool);
+ free(sc, M_DEVBUF);
return (ENOSPC);
}
-
- pfsyncif->sc_ifq.ifq_maxlen = ifqmaxlen;
- mtx_init(&pfsyncif->sc_ifq.ifq_mtx, ifp->if_xname,
- "pfsync send queue", MTX_DEF);
- TASK_INIT(&pfsyncif->sc_send_task, 0, pfsync_senddef, pfsyncif);
-#endif
- pfsyncif->sc_mbuf = NULL;
- pfsyncif->sc_mbuf_net = NULL;
-#ifdef PFSYNC_TDB
- pfsyncif->sc_mbuf_tdb = NULL;
-#endif
- pfsyncif->sc_statep.s = NULL;
- pfsyncif->sc_statep_net.s = NULL;
-#ifdef PFSYNC_TDB
- pfsyncif->sc_statep_tdb.t = NULL;
-#endif
- pfsyncif->sc_maxupdates = 128;
-#ifdef __FreeBSD__
- pfsyncif->sc_sync_peer.s_addr = htonl(INADDR_PFSYNC_GROUP);
- pfsyncif->sc_sendaddr.s_addr = htonl(INADDR_PFSYNC_GROUP);
#else
- pfsyncif->sc_sync_peer.s_addr = INADDR_PFSYNC_GROUP;
- pfsyncif->sc_sendaddr.s_addr = INADDR_PFSYNC_GROUP;
-#endif
- pfsyncif->sc_ureq_received = 0;
- pfsyncif->sc_ureq_sent = 0;
- pfsyncif->sc_bulk_send_next = NULL;
- pfsyncif->sc_bulk_terminator = NULL;
-#ifndef __FreeBSD__
- ifp = &pfsyncif->sc_if;
+ ifp = &sc->sc_if;
snprintf(ifp->if_xname, sizeof ifp->if_xname, "pfsync%d", unit);
#endif
- ifp->if_softc = pfsyncif;
+ ifp->if_softc = sc;
ifp->if_ioctl = pfsyncioctl;
ifp->if_output = pfsyncoutput;
ifp->if_start = pfsyncstart;
ifp->if_type = IFT_PFSYNC;
ifp->if_snd.ifq_maxlen = ifqmaxlen;
- ifp->if_hdrlen = PFSYNC_HDRLEN;
- pfsync_setmtu(pfsyncif, ETHERMTU);
+ ifp->if_hdrlen = sizeof(struct pfsync_header);
+ ifp->if_mtu = 1500; /* XXX */
#ifdef __FreeBSD__
- callout_init(&pfsyncif->sc_tmo, CALLOUT_MPSAFE);
-#ifdef PFSYNC_TDB
- callout_init(&pfsyncif->sc_tdb_tmo, CALLOUT_MPSAFE);
-#endif
- callout_init(&pfsyncif->sc_bulk_tmo, CALLOUT_MPSAFE);
- callout_init(&pfsyncif->sc_bulkfail_tmo, CALLOUT_MPSAFE);
+ callout_init(&sc->sc_tmo, CALLOUT_MPSAFE);
+ callout_init(&sc->sc_bulk_tmo, CALLOUT_MPSAFE);
+ callout_init(&sc->sc_bulkfail_tmo, CALLOUT_MPSAFE);
#else
- timeout_set(&pfsyncif->sc_tmo, pfsync_timeout, pfsyncif);
- timeout_set(&pfsyncif->sc_tdb_tmo, pfsync_tdb_timeout, pfsyncif);
- timeout_set(&pfsyncif->sc_bulk_tmo, pfsync_bulk_update, pfsyncif);
- timeout_set(&pfsyncif->sc_bulkfail_tmo, pfsync_bulkfail, pfsyncif);
+ ifp->if_hardmtu = MCLBYTES; /* XXX */
+ timeout_set(&sc->sc_tmo, pfsync_timeout, sc);
+ timeout_set(&sc->sc_bulk_tmo, pfsync_bulk_update, sc);
+ timeout_set(&sc->sc_bulkfail_tmo, pfsync_bulk_fail, sc);
#endif
+
if_attach(ifp);
#ifndef __FreeBSD__
if_alloc_sadl(ifp);
@@ -307,10 +515,16 @@ pfsync_clone_create(struct if_clone *ifc, int unit)
#ifdef __FreeBSD__
bpfattach(ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
#else
- bpfattach(&pfsyncif->sc_if.if_bpf, ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
+ bpfattach(&sc->sc_if.if_bpf, ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
#endif
#endif
+#ifdef __FreeBSD__
+ V_pfsyncif = sc;
+#else
+ pfsyncif = sc;
+#endif
+
return (0);
}
@@ -321,60 +535,92 @@ int
#endif
pfsync_clone_destroy(struct ifnet *ifp)
{
+ struct pfsync_softc *sc = ifp->if_softc;
+
#ifdef __FreeBSD__
- EVENTHANDLER_DEREGISTER(ifnet_departure_event, pfsyncif->sc_detachtag);
- callout_stop(&pfsyncif->sc_tmo);
-#ifdef PFSYNC_TDB
- callout_stop(&pfsyncif->sc_tdb_tmo);
+ EVENTHANDLER_DEREGISTER(ifnet_departure_event, sc->sc_detachtag);
+#endif
+ timeout_del(&sc->sc_bulk_tmo);
+ timeout_del(&sc->sc_tmo);
+#if NCARP > 0
+#ifdef notyet
+#ifdef __FreeBSD__
+ if (!sc->pfsync_sync_ok)
+#else
+ if (!pfsync_sync_ok)
+#endif
+ carp_group_demote_adj(&sc->sc_if, -1);
#endif
- callout_stop(&pfsyncif->sc_bulk_tmo);
- callout_stop(&pfsyncif->sc_bulkfail_tmo);
- /* XXX: more? */
#endif
-
#if NBPFILTER > 0
bpfdetach(ifp);
#endif
if_detach(ifp);
+
+ pfsync_drop(sc);
+
+ while (sc->sc_deferred > 0)
+ pfsync_undefer(TAILQ_FIRST(&sc->sc_deferrals), 0);
+
+#ifdef __FreeBSD__
+ UMA_DESTROY(sc->sc_pool);
+#else
+ pool_destroy(&sc->sc_pool);
+#endif
#ifdef __FreeBSD__
if_free(ifp);
- free(pfsyncif->sc_imo.imo_membership, M_DEVBUF);
+ free(sc->sc_imo.imo_membership, M_DEVBUF);
+#else
+ free(sc->sc_imo.imo_membership, M_IPMOPTS);
#endif
- free(pfsyncif, M_DEVBUF);
+ free(sc, M_DEVBUF);
+
+#ifdef __FreeBSD__
+ V_pfsyncif = NULL;
+#else
pfsyncif = NULL;
+#endif
+
#ifndef __FreeBSD__
return (0);
#endif
}
-/*
- * Start output on the pfsync interface.
- */
-void
-pfsyncstart(struct ifnet *ifp)
+struct mbuf *
+pfsync_if_dequeue(struct ifnet *ifp)
{
struct mbuf *m;
#ifndef __FreeBSD__
int s;
#endif
- for (;;) {
#ifdef __FreeBSD__
- IF_LOCK(&ifp->if_snd);
- _IF_DROP(&ifp->if_snd);
- _IF_DEQUEUE(&ifp->if_snd, m);
- IF_UNLOCK(&ifp->if_snd);
+ IF_LOCK(&ifp->if_snd);
+ _IF_DROP(&ifp->if_snd);
+ _IF_DEQUEUE(&ifp->if_snd, m);
+ IF_UNLOCK(&ifp->if_snd);
#else
- s = splnet();
- IF_DROP(&ifp->if_snd);
- IF_DEQUEUE(&ifp->if_snd, m);
- splx(s);
+ s = splnet();
+ IF_DEQUEUE(&ifp->if_snd, m);
+ splx(s);
#endif
- if (m == NULL)
- return;
- else
- m_freem(m);
+ return (m);
+}
+
+/*
+ * Start output on the pfsync interface.
+ */
+void
+pfsyncstart(struct ifnet *ifp)
+{
+ struct mbuf *m;
+
+ while ((m = pfsync_if_dequeue(ifp)) != NULL) {
+#ifndef __FreeBSD__
+ IF_DROP(&ifp->if_snd);
+#endif
+ m_freem(m);
}
}
@@ -383,85 +629,196 @@ pfsync_alloc_scrub_memory(struct pfsync_state_peer *s,
struct pf_state_peer *d)
{
if (s->scrub.scrub_flag && d->scrub == NULL) {
- d->scrub = pool_get(&pf_state_scrub_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ d->scrub = pool_get(&V_pf_state_scrub_pl, PR_NOWAIT | PR_ZERO);
+#else
+ d->scrub = pool_get(&pf_state_scrub_pl, PR_NOWAIT | PR_ZERO);
+#endif
if (d->scrub == NULL)
return (ENOMEM);
- bzero(d->scrub, sizeof(*d->scrub));
}
return (0);
}
+#ifndef __FreeBSD__
+void
+pfsync_state_export(struct pfsync_state *sp, struct pf_state *st)
+{
+ bzero(sp, sizeof(struct pfsync_state));
+
+ /* copy from state key */
+ sp->key[PF_SK_WIRE].addr[0] = st->key[PF_SK_WIRE]->addr[0];
+ sp->key[PF_SK_WIRE].addr[1] = st->key[PF_SK_WIRE]->addr[1];
+ sp->key[PF_SK_WIRE].port[0] = st->key[PF_SK_WIRE]->port[0];
+ sp->key[PF_SK_WIRE].port[1] = st->key[PF_SK_WIRE]->port[1];
+ sp->key[PF_SK_STACK].addr[0] = st->key[PF_SK_STACK]->addr[0];
+ sp->key[PF_SK_STACK].addr[1] = st->key[PF_SK_STACK]->addr[1];
+ sp->key[PF_SK_STACK].port[0] = st->key[PF_SK_STACK]->port[0];
+ sp->key[PF_SK_STACK].port[1] = st->key[PF_SK_STACK]->port[1];
+ sp->proto = st->key[PF_SK_WIRE]->proto;
+ sp->af = st->key[PF_SK_WIRE]->af;
+
+ /* copy from state */
+ strlcpy(sp->ifname, st->kif->pfik_name, sizeof(sp->ifname));
+ bcopy(&st->rt_addr, &sp->rt_addr, sizeof(sp->rt_addr));
+ sp->creation = htonl(time_second - st->creation);
+ sp->expire = pf_state_expires(st);
+ if (sp->expire <= time_second)
+ sp->expire = htonl(0);
+ else
+ sp->expire = htonl(sp->expire - time_second);
+
+ sp->direction = st->direction;
+ sp->log = st->log;
+ sp->timeout = st->timeout;
+ sp->state_flags = st->state_flags;
+ if (st->src_node)
+ sp->sync_flags |= PFSYNC_FLAG_SRCNODE;
+ if (st->nat_src_node)
+ sp->sync_flags |= PFSYNC_FLAG_NATSRCNODE;
+
+ bcopy(&st->id, &sp->id, sizeof(sp->id));
+ sp->creatorid = st->creatorid;
+ pf_state_peer_hton(&st->src, &sp->src);
+ pf_state_peer_hton(&st->dst, &sp->dst);
+
+ if (st->rule.ptr == NULL)
+ sp->rule = htonl(-1);
+ else
+ sp->rule = htonl(st->rule.ptr->nr);
+ if (st->anchor.ptr == NULL)
+ sp->anchor = htonl(-1);
+ else
+ sp->anchor = htonl(st->anchor.ptr->nr);
+ if (st->nat_rule.ptr == NULL)
+ sp->nat_rule = htonl(-1);
+ else
+ sp->nat_rule = htonl(st->nat_rule.ptr->nr);
+
+ pf_state_counter_hton(st->packets[0], sp->packets[0]);
+ pf_state_counter_hton(st->packets[1], sp->packets[1]);
+ pf_state_counter_hton(st->bytes[0], sp->bytes[0]);
+ pf_state_counter_hton(st->bytes[1], sp->bytes[1]);
+
+}
+#endif
+
int
-pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag)
+pfsync_state_import(struct pfsync_state *sp, u_int8_t flags)
{
struct pf_state *st = NULL;
+ struct pf_state_key *skw = NULL, *sks = NULL;
struct pf_rule *r = NULL;
struct pfi_kif *kif;
+ int pool_flags;
+ int error;
+#ifdef __FreeBSD__
+ if (sp->creatorid == 0 && V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (sp->creatorid == 0 && pf_status.debug >= PF_DEBUG_MISC) {
- printf("pfsync_insert_net_state: invalid creator id:"
+#endif
+ printf("pfsync_state_import: invalid creator id:"
" %08x\n", ntohl(sp->creatorid));
return (EINVAL);
}
- kif = pfi_kif_get(sp->ifname);
- if (kif == NULL) {
+ if ((kif = pfi_kif_get(sp->ifname)) == NULL) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync_insert_net_state: "
+#endif
+ printf("pfsync_state_import: "
"unknown interface: %s\n", sp->ifname);
- /* skip this state */
- return (0);
+ if (flags & PFSYNC_SI_IOCTL)
+ return (EINVAL);
+ return (0); /* skip this state */
}
/*
- * If the ruleset checksums match, it's safe to associate the state
- * with the rule of that number.
+ * If the ruleset checksums match or the state is coming from the ioctl,
+ * it's safe to associate the state with the rule of that number.
*/
- if (sp->rule != htonl(-1) && sp->anchor == htonl(-1) && chksum_flag)
+ if (sp->rule != htonl(-1) && sp->anchor == htonl(-1) &&
+ (flags & (PFSYNC_SI_IOCTL | PFSYNC_SI_CKSUM)) && ntohl(sp->rule) <
+ pf_main_ruleset.rules[PF_RULESET_FILTER].active.rcount)
r = pf_main_ruleset.rules[
PF_RULESET_FILTER].active.ptr_array[ntohl(sp->rule)];
else
+#ifdef __FreeBSD__
+ r = &V_pf_default_rule;
+#else
r = &pf_default_rule;
+#endif
- if (!r->max_states || r->states < r->max_states)
- st = pool_get(&pf_state_pl, PR_NOWAIT);
- if (st == NULL) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
- return (ENOMEM);
- }
- bzero(st, sizeof(*st));
+ if ((r->max_states && r->states_cur >= r->max_states))
+ goto cleanup;
- /* allocate memory for scrub info */
- if (pfsync_alloc_scrub_memory(&sp->src, &st->src) ||
- pfsync_alloc_scrub_memory(&sp->dst, &st->dst)) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
- if (st->src.scrub)
- pool_put(&pf_state_scrub_pl, st->src.scrub);
- pool_put(&pf_state_pl, st);
- return (ENOMEM);
- }
+#ifdef __FreeBSD__
+ if (flags & PFSYNC_SI_IOCTL)
+ pool_flags = PR_WAITOK | PR_ZERO;
+ else
+ pool_flags = PR_ZERO;
- st->rule.ptr = r;
- /* XXX get pointers to nat_rule and anchor */
+ if ((st = pool_get(&V_pf_state_pl, pool_flags)) == NULL)
+ goto cleanup;
+#else
+ if (flags & PFSYNC_SI_IOCTL)
+ pool_flags = PR_WAITOK | PR_LIMITFAIL | PR_ZERO;
+ else
+ pool_flags = PR_LIMITFAIL | PR_ZERO;
- /* XXX when we have nat_rule/anchors, use STATE_INC_COUNTERS */
- r->states++;
+ if ((st = pool_get(&pf_state_pl, pool_flags)) == NULL)
+ goto cleanup;
+#endif
- /* fill in the rest of the state entry */
- pf_state_host_ntoh(&sp->lan, &st->lan);
- pf_state_host_ntoh(&sp->gwy, &st->gwy);
- pf_state_host_ntoh(&sp->ext, &st->ext);
+ if ((skw = pf_alloc_state_key(pool_flags)) == NULL)
+ goto cleanup;
- pf_state_peer_ntoh(&sp->src, &st->src);
- pf_state_peer_ntoh(&sp->dst, &st->dst);
+ if (PF_ANEQ(&sp->key[PF_SK_WIRE].addr[0],
+ &sp->key[PF_SK_STACK].addr[0], sp->af) ||
+ PF_ANEQ(&sp->key[PF_SK_WIRE].addr[1],
+ &sp->key[PF_SK_STACK].addr[1], sp->af) ||
+ sp->key[PF_SK_WIRE].port[0] != sp->key[PF_SK_STACK].port[0] ||
+ sp->key[PF_SK_WIRE].port[1] != sp->key[PF_SK_STACK].port[1]) {
+ if ((sks = pf_alloc_state_key(pool_flags)) == NULL)
+ goto cleanup;
+ } else
+ sks = skw;
+ /* allocate memory for scrub info */
+ if (pfsync_alloc_scrub_memory(&sp->src, &st->src) ||
+ pfsync_alloc_scrub_memory(&sp->dst, &st->dst))
+ goto cleanup;
+
+ /* copy to state key(s) */
+ skw->addr[0] = sp->key[PF_SK_WIRE].addr[0];
+ skw->addr[1] = sp->key[PF_SK_WIRE].addr[1];
+ skw->port[0] = sp->key[PF_SK_WIRE].port[0];
+ skw->port[1] = sp->key[PF_SK_WIRE].port[1];
+ skw->proto = sp->proto;
+ skw->af = sp->af;
+ if (sks != skw) {
+ sks->addr[0] = sp->key[PF_SK_STACK].addr[0];
+ sks->addr[1] = sp->key[PF_SK_STACK].addr[1];
+ sks->port[0] = sp->key[PF_SK_STACK].port[0];
+ sks->port[1] = sp->key[PF_SK_STACK].port[1];
+ sks->proto = sp->proto;
+ sks->af = sp->af;
+ }
+
+ /* copy to state */
bcopy(&sp->rt_addr, &st->rt_addr, sizeof(st->rt_addr));
st->creation = time_second - ntohl(sp->creation);
- st->expire = ntohl(sp->expire) + time_second;
+ st->expire = time_second;
+ if (sp->expire) {
+ /* XXX No adaptive scaling. */
+ st->expire -= r->timeout[sp->timeout] - ntohl(sp->expire);
+ }
- st->af = sp->af;
- st->proto = sp->proto;
+ st->expire = ntohl(sp->expire) + time_second;
st->direction = sp->direction;
st->log = sp->log;
st->timeout = sp->timeout;
@@ -469,21 +826,74 @@ pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag)
bcopy(sp->id, &st->id, sizeof(st->id));
st->creatorid = sp->creatorid;
- st->sync_flags = PFSTATE_FROMSYNC;
+ pf_state_peer_ntoh(&sp->src, &st->src);
+ pf_state_peer_ntoh(&sp->dst, &st->dst);
+
+ st->rule.ptr = r;
+ st->nat_rule.ptr = NULL;
+ st->anchor.ptr = NULL;
+ st->rt_kif = NULL;
- if (pf_insert_state(kif, st)) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ st->pfsync_time = time_second;
+ st->sync_state = PFSYNC_S_NONE;
+
+ /* XXX when we have nat_rule/anchors, use STATE_INC_COUNTERS */
+ r->states_cur++;
+ r->states_tot++;
+
+ if (!ISSET(flags, PFSYNC_SI_IOCTL))
+ SET(st->state_flags, PFSTATE_NOSYNC);
+
+ if ((error = pf_state_insert(kif, skw, sks, st)) != 0) {
/* XXX when we have nat_rule/anchors, use STATE_DEC_COUNTERS */
- r->states--;
+ r->states_cur--;
+ goto cleanup_state;
+ }
+
+ if (!ISSET(flags, PFSYNC_SI_IOCTL)) {
+ CLR(st->state_flags, PFSTATE_NOSYNC);
+ if (ISSET(st->state_flags, PFSTATE_ACK)) {
+ pfsync_q_ins(st, PFSYNC_S_IACK);
+ schednetisr(NETISR_PFSYNC);
+ }
+ }
+ CLR(st->state_flags, PFSTATE_ACK);
+
+ return (0);
+
+cleanup:
+ error = ENOMEM;
+ if (skw == sks)
+ sks = NULL;
+#ifdef __FreeBSD__
+ if (skw != NULL)
+ pool_put(&V_pf_state_key_pl, skw);
+ if (sks != NULL)
+ pool_put(&V_pf_state_key_pl, sks);
+#else
+ if (skw != NULL)
+ pool_put(&pf_state_key_pl, skw);
+ if (sks != NULL)
+ pool_put(&pf_state_key_pl, sks);
+#endif
+
+cleanup_state: /* pf_state_insert frees the state keys */
+ if (st) {
+#ifdef __FreeBSD__
+ if (st->dst.scrub)
+ pool_put(&V_pf_state_scrub_pl, st->dst.scrub);
+ if (st->src.scrub)
+ pool_put(&V_pf_state_scrub_pl, st->src.scrub);
+ pool_put(&V_pf_state_pl, st);
+#else
if (st->dst.scrub)
pool_put(&pf_state_scrub_pl, st->dst.scrub);
if (st->src.scrub)
pool_put(&pf_state_scrub_pl, st->src.scrub);
pool_put(&pf_state_pl, st);
- return (EINVAL);
+#endif
}
-
- return (0);
+ return (error);
}
void
@@ -493,597 +903,865 @@ pfsync_input(struct mbuf *m, __unused int off)
pfsync_input(struct mbuf *m, ...)
#endif
{
- struct ip *ip = mtod(m, struct ip *);
- struct pfsync_header *ph;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
struct pfsync_softc *sc = pfsyncif;
- struct pf_state *st;
- struct pf_state_cmp key;
- struct pfsync_state *sp;
- struct pfsync_state_upd *up;
- struct pfsync_state_del *dp;
- struct pfsync_state_clr *cp;
- struct pfsync_state_upd_req *rup;
- struct pfsync_state_bus *bus;
-#ifdef PFSYNC_TDB
- struct pfsync_tdb *pt;
#endif
- struct in_addr src;
- struct mbuf *mp;
- int iplen, action, error, i, s, count, offp, sfail, stale = 0;
- u_int8_t chksum_flag = 0;
+ struct pfsync_pkt pkt;
+ struct ip *ip = mtod(m, struct ip *);
+ struct pfsync_header *ph;
+ struct pfsync_subheader subh;
+
+ int offset;
+ int rv;
- pfsyncstats.pfsyncs_ipackets++;
+ V_pfsyncstats.pfsyncs_ipackets++;
/* verify that we have a sync interface configured */
- if (!sc || !sc->sc_sync_ifp || !pf_status.running)
+#ifdef __FreeBSD__
+ if (!sc || !sc->sc_sync_if || !V_pf_status.running)
+#else
+ if (!sc || !sc->sc_sync_if || !pf_status.running)
+#endif
goto done;
/* verify that the packet came in on the right interface */
- if (sc->sc_sync_ifp != m->m_pkthdr.rcvif) {
- pfsyncstats.pfsyncs_badif++;
+ if (sc->sc_sync_if != m->m_pkthdr.rcvif) {
+ V_pfsyncstats.pfsyncs_badif++;
goto done;
}
- /* verify that the IP TTL is 255. */
+#ifdef __FreeBSD__
+ sc->sc_ifp->if_ipackets++;
+ sc->sc_ifp->if_ibytes += m->m_pkthdr.len;
+#else
+ sc->sc_if.if_ipackets++;
+ sc->sc_if.if_ibytes += m->m_pkthdr.len;
+#endif
+ /* verify that the IP TTL is 255. */
if (ip->ip_ttl != PFSYNC_DFLTTL) {
- pfsyncstats.pfsyncs_badttl++;
+ V_pfsyncstats.pfsyncs_badttl++;
goto done;
}
- iplen = ip->ip_hl << 2;
-
- if (m->m_pkthdr.len < iplen + sizeof(*ph)) {
- pfsyncstats.pfsyncs_hdrops++;
+ offset = ip->ip_hl << 2;
+ if (m->m_pkthdr.len < offset + sizeof(*ph)) {
+ V_pfsyncstats.pfsyncs_hdrops++;
goto done;
}
- if (iplen + sizeof(*ph) > m->m_len) {
- if ((m = m_pullup(m, iplen + sizeof(*ph))) == NULL) {
- pfsyncstats.pfsyncs_hdrops++;
- goto done;
+ if (offset + sizeof(*ph) > m->m_len) {
+ if (m_pullup(m, offset + sizeof(*ph)) == NULL) {
+ V_pfsyncstats.pfsyncs_hdrops++;
+ return;
}
ip = mtod(m, struct ip *);
}
- ph = (struct pfsync_header *)((char *)ip + iplen);
+ ph = (struct pfsync_header *)((char *)ip + offset);
/* verify the version */
if (ph->version != PFSYNC_VERSION) {
- pfsyncstats.pfsyncs_badver++;
+ V_pfsyncstats.pfsyncs_badver++;
goto done;
}
- action = ph->action;
- count = ph->count;
-
- /* make sure it's a valid action code */
- if (action >= PFSYNC_ACT_MAX) {
- pfsyncstats.pfsyncs_badact++;
+#if 0
+ if (pfsync_input_hmac(m, offset) != 0) {
+ /* XXX stats */
goto done;
}
+#endif
/* Cheaper to grab this now than having to mess with mbufs later */
- src = ip->ip_src;
-
- if (!bcmp(&ph->pf_chksum, &pf_status.pf_chksum, PF_MD5_DIGEST_LENGTH))
- chksum_flag++;
-
- switch (action) {
- case PFSYNC_ACT_CLR: {
- struct pf_state *nexts;
- struct pfi_kif *kif;
- u_int32_t creatorid;
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- sizeof(*cp), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
+ pkt.ip = ip;
+ pkt.src = ip->ip_src;
+ pkt.flags = 0;
+
+#ifdef __FreeBSD__
+ if (!bcmp(&ph->pfcksum, &V_pf_status.pf_chksum, PF_MD5_DIGEST_LENGTH))
+#else
+ if (!bcmp(&ph->pfcksum, &pf_status.pf_chksum, PF_MD5_DIGEST_LENGTH))
+#endif
+ pkt.flags |= PFSYNC_SI_CKSUM;
+
+ offset += sizeof(*ph);
+ for (;;) {
+ m_copydata(m, offset, sizeof(subh), (caddr_t)&subh);
+ offset += sizeof(subh);
+
+ if (subh.action >= PFSYNC_ACT_MAX) {
+ V_pfsyncstats.pfsyncs_badact++;
+ goto done;
}
- cp = (struct pfsync_state_clr *)(mp->m_data + offp);
- creatorid = cp->creatorid;
- s = splsoftnet();
+ rv = (*pfsync_acts[subh.action])(&pkt, m, offset,
+ ntohs(subh.count));
+ if (rv == -1)
+ return;
+
+ offset += rv;
+ }
+
+done:
+ m_freem(m);
+}
+
+int
+pfsync_in_clr(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct pfsync_clr *clr;
+ struct mbuf *mp;
+ int len = sizeof(*clr) * count;
+ int i, offp;
+
+ struct pf_state *st, *nexts;
+ struct pf_state_key *sk, *nextsk;
+ struct pf_state_item *si;
+ u_int32_t creatorid;
+ int s;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ clr = (struct pfsync_clr *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- if (cp->ifname[0] == '\0') {
+ for (i = 0; i < count; i++) {
+ creatorid = clr[i].creatorid;
+
+ if (clr[i].ifname[0] == '\0') {
+#ifdef __FreeBSD__
+ for (st = RB_MIN(pf_state_tree_id, &V_tree_id);
+ st; st = nexts) {
+ nexts = RB_NEXT(pf_state_tree_id, &V_tree_id, st);
+#else
for (st = RB_MIN(pf_state_tree_id, &tree_id);
st; st = nexts) {
nexts = RB_NEXT(pf_state_tree_id, &tree_id, st);
+#endif
if (st->creatorid == creatorid) {
- st->sync_flags |= PFSTATE_FROMSYNC;
+ SET(st->state_flags, PFSTATE_NOSYNC);
pf_unlink_state(st);
}
}
} else {
- if ((kif = pfi_kif_get(cp->ifname)) == NULL) {
+ if (pfi_kif_get(clr[i].ifname) == NULL)
+ continue;
+
+ /* XXX correct? */
#ifdef __FreeBSD__
- PF_UNLOCK();
+ for (sk = RB_MIN(pf_state_tree, &V_pf_statetbl);
+#else
+ for (sk = RB_MIN(pf_state_tree, &pf_statetbl);
#endif
- splx(s);
- return;
- }
- for (st = RB_MIN(pf_state_tree_lan_ext,
- &kif->pfik_lan_ext); st; st = nexts) {
- nexts = RB_NEXT(pf_state_tree_lan_ext,
- &kif->pfik_lan_ext, st);
- if (st->creatorid == creatorid) {
- st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ sk; sk = nextsk) {
+ nextsk = RB_NEXT(pf_state_tree,
+#ifdef __FreeBSD__
+ &V_pf_statetbl, sk);
+#else
+ &pf_statetbl, sk);
+#endif
+ TAILQ_FOREACH(si, &sk->states, entry) {
+ if (si->s->creatorid == creatorid) {
+ SET(si->s->state_flags,
+ PFSTATE_NOSYNC);
+ pf_unlink_state(si->s);
+ }
}
}
}
+ }
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_UNLOCK();
#endif
- splx(s);
+ splx(s);
- break;
+ return (len);
+}
+
+int
+pfsync_in_ins(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct mbuf *mp;
+ struct pfsync_state *sa, *sp;
+ int len = sizeof(*sp) * count;
+ int i, offp;
+
+ int s;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
}
- case PFSYNC_ACT_INS:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*sp), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
+ sa = (struct pfsync_state *)(mp->m_data + offp);
- s = splsoftnet();
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- for (i = 0, sp = (struct pfsync_state *)(mp->m_data + offp);
- i < count; i++, sp++) {
- /* check for invalid values */
- if (sp->timeout >= PFTM_MAX ||
- sp->src.state > PF_TCPS_PROXY_DST ||
- sp->dst.state > PF_TCPS_PROXY_DST ||
- sp->direction > PF_OUT ||
- (sp->af != AF_INET && sp->af != AF_INET6)) {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync_insert: PFSYNC_ACT_INS: "
- "invalid value\n");
- pfsyncstats.pfsyncs_badstate++;
- continue;
- }
+ for (i = 0; i < count; i++) {
+ sp = &sa[i];
- if ((error = pfsync_insert_net_state(sp,
- chksum_flag))) {
- if (error == ENOMEM) {
+ /* check for invalid values */
+ if (sp->timeout >= PFTM_MAX ||
+ sp->src.state > PF_TCPS_PROXY_DST ||
+ sp->dst.state > PF_TCPS_PROXY_DST ||
+ sp->direction > PF_OUT ||
+ (sp->af != AF_INET && sp->af != AF_INET6)) {
#ifdef __FreeBSD__
- PF_UNLOCK();
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
#endif
- splx(s);
- goto done;
- }
- continue;
+ printf("pfsync_input: PFSYNC5_ACT_INS: "
+ "invalid value\n");
}
+ V_pfsyncstats.pfsyncs_badval++;
+ continue;
}
+
+ if (pfsync_state_import(sp, pkt->flags) == ENOMEM) {
+ /* drop out, but process the rest of the actions */
+ break;
+ }
+ }
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_UNLOCK();
#endif
- splx(s);
- break;
- case PFSYNC_ACT_UPD:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*sp), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
+ splx(s);
+
+ return (len);
+}
+
+int
+pfsync_in_iack(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct pfsync_ins_ack *ia, *iaa;
+ struct pf_state_cmp id_key;
+ struct pf_state *st;
- s = splsoftnet();
+ struct mbuf *mp;
+ int len = count * sizeof(*ia);
+ int offp, i;
+ int s;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ iaa = (struct pfsync_ins_ack *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- for (i = 0, sp = (struct pfsync_state *)(mp->m_data + offp);
- i < count; i++, sp++) {
- int flags = PFSYNC_FLAG_STALE;
-
- /* check for invalid values */
- if (sp->timeout >= PFTM_MAX ||
- sp->src.state > PF_TCPS_PROXY_DST ||
- sp->dst.state > PF_TCPS_PROXY_DST) {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync_insert: PFSYNC_ACT_UPD: "
- "invalid value\n");
- pfsyncstats.pfsyncs_badstate++;
- continue;
- }
+ for (i = 0; i < count; i++) {
+ ia = &iaa[i];
- bcopy(sp->id, &key.id, sizeof(key.id));
- key.creatorid = sp->creatorid;
+ bcopy(&ia->id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = ia->creatorid;
- st = pf_find_state_byid(&key);
- if (st == NULL) {
- /* insert the update */
- if (pfsync_insert_net_state(sp, chksum_flag))
- pfsyncstats.pfsyncs_badstate++;
- continue;
- }
- sfail = 0;
- if (st->proto == IPPROTO_TCP) {
- /*
- * The state should never go backwards except
- * for syn-proxy states. Neither should the
- * sequence window slide backwards.
- */
- if (st->src.state > sp->src.state &&
- (st->src.state < PF_TCPS_PROXY_SRC ||
- sp->src.state >= PF_TCPS_PROXY_SRC))
- sfail = 1;
- else if (SEQ_GT(st->src.seqlo,
- ntohl(sp->src.seqlo)))
- sfail = 3;
- else if (st->dst.state > sp->dst.state) {
- /* There might still be useful
- * information about the src state here,
- * so import that part of the update,
- * then "fail" so we send the updated
- * state back to the peer who is missing
- * our what we know. */
- pf_state_peer_ntoh(&sp->src, &st->src);
- /* XXX do anything with timeouts? */
- sfail = 7;
- flags = 0;
- } else if (st->dst.state >= TCPS_SYN_SENT &&
- SEQ_GT(st->dst.seqlo, ntohl(sp->dst.seqlo)))
- sfail = 4;
- } else {
- /*
- * Non-TCP protocol state machine always go
- * forwards
- */
- if (st->src.state > sp->src.state)
- sfail = 5;
- else if (st->dst.state > sp->dst.state)
- sfail = 6;
- }
- if (sfail) {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: %s stale update "
- "(%d) id: %016llx "
- "creatorid: %08x\n",
- (sfail < 7 ? "ignoring"
- : "partial"), sfail,
- betoh64(st->id),
- ntohl(st->creatorid));
- pfsyncstats.pfsyncs_badstate++;
-
- if (!(sp->sync_flags & PFSTATE_STALE)) {
- /* we have a better state, send it */
- if (sc->sc_mbuf != NULL && !stale)
- pfsync_sendout(sc);
- stale++;
- if (!st->sync_flags)
- pfsync_pack_state(
- PFSYNC_ACT_UPD, st, flags);
- }
- continue;
- }
- pfsync_alloc_scrub_memory(&sp->dst, &st->dst);
- pf_state_peer_ntoh(&sp->src, &st->src);
- pf_state_peer_ntoh(&sp->dst, &st->dst);
- st->expire = ntohl(sp->expire) + time_second;
- st->timeout = sp->timeout;
- }
- if (stale && sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
+ st = pf_find_state_byid(&id_key);
+ if (st == NULL)
+ continue;
+
+ if (ISSET(st->state_flags, PFSTATE_ACK))
+ pfsync_deferred(st, 0);
+ }
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_UNLOCK();
#endif
- splx(s);
- break;
+ splx(s);
/*
- * It's not strictly necessary for us to support the "uncompressed"
- * delete action, but it's relatively simple and maintains consistency.
+ * XXX this is not yet implemented, but we know the size of the
+ * message so we can skip it.
*/
- case PFSYNC_ACT_DEL:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*sp), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
- s = splsoftnet();
+ return (count * sizeof(struct pfsync_ins_ack));
+}
+
+int
+pfsync_upd_tcp(struct pf_state *st, struct pfsync_state_peer *src,
+ struct pfsync_state_peer *dst)
+{
+ int sfail = 0;
+
+ /*
+ * The state should never go backwards except
+ * for syn-proxy states. Neither should the
+ * sequence window slide backwards.
+ */
+ if (st->src.state > src->state &&
+ (st->src.state < PF_TCPS_PROXY_SRC ||
+ src->state >= PF_TCPS_PROXY_SRC))
+ sfail = 1;
+ else if (SEQ_GT(st->src.seqlo, ntohl(src->seqlo)))
+ sfail = 3;
+ else if (st->dst.state > dst->state) {
+ /* There might still be useful
+ * information about the src state here,
+ * so import that part of the update,
+ * then "fail" so we send the updated
+ * state back to the peer who is missing
+ * our what we know. */
+ pf_state_peer_ntoh(src, &st->src);
+ /* XXX do anything with timeouts? */
+ sfail = 7;
+ } else if (st->dst.state >= TCPS_SYN_SENT &&
+ SEQ_GT(st->dst.seqlo, ntohl(dst->seqlo)))
+ sfail = 4;
+
+ return (sfail);
+}
+
+int
+pfsync_in_upd(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct pfsync_state *sa, *sp;
+ struct pf_state_cmp id_key;
+ struct pf_state_key *sk;
+ struct pf_state *st;
+ int sfail;
+
+ struct mbuf *mp;
+ int len = count * sizeof(*sp);
+ int offp, i;
+ int s;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ sa = (struct pfsync_state *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- for (i = 0, sp = (struct pfsync_state *)(mp->m_data + offp);
- i < count; i++, sp++) {
- bcopy(sp->id, &key.id, sizeof(key.id));
- key.creatorid = sp->creatorid;
+ for (i = 0; i < count; i++) {
+ sp = &sa[i];
- st = pf_find_state_byid(&key);
- if (st == NULL) {
- pfsyncstats.pfsyncs_badstate++;
- continue;
+ /* check for invalid values */
+ if (sp->timeout >= PFTM_MAX ||
+ sp->src.state > PF_TCPS_PROXY_DST ||
+ sp->dst.state > PF_TCPS_PROXY_DST) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
+ printf("pfsync_input: PFSYNC_ACT_UPD: "
+ "invalid value\n");
}
- st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ V_pfsyncstats.pfsyncs_badval++;
+ continue;
+ }
+
+ bcopy(sp->id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = sp->creatorid;
+
+ st = pf_find_state_byid(&id_key);
+ if (st == NULL) {
+ /* insert the update */
+ if (pfsync_state_import(sp, 0))
+ V_pfsyncstats.pfsyncs_badstate++;
+ continue;
}
+
+ if (ISSET(st->state_flags, PFSTATE_ACK))
+ pfsync_deferred(st, 1);
+
+ sk = st->key[PF_SK_WIRE]; /* XXX right one? */
+ sfail = 0;
+ if (sk->proto == IPPROTO_TCP)
+ sfail = pfsync_upd_tcp(st, &sp->src, &sp->dst);
+ else {
+ /*
+ * Non-TCP protocol state machine always go
+ * forwards
+ */
+ if (st->src.state > sp->src.state)
+ sfail = 5;
+ else if (st->dst.state > sp->dst.state)
+ sfail = 6;
+ }
+
+ if (sfail) {
#ifdef __FreeBSD__
- PF_UNLOCK();
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
#endif
- splx(s);
- break;
- case PFSYNC_ACT_UPD_C: {
- int update_requested = 0;
+ printf("pfsync: %s stale update (%d)"
+ " id: %016llx creatorid: %08x\n",
+ (sfail < 7 ? "ignoring" : "partial"),
+ sfail, betoh64(st->id),
+ ntohl(st->creatorid));
+ }
+ V_pfsyncstats.pfsyncs_stale++;
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*up), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
+ pfsync_update_state(st);
+ schednetisr(NETISR_PFSYNC);
+ continue;
}
+ pfsync_alloc_scrub_memory(&sp->dst, &st->dst);
+ pf_state_peer_ntoh(&sp->src, &st->src);
+ pf_state_peer_ntoh(&sp->dst, &st->dst);
+ st->expire = ntohl(sp->expire) + time_second;
+ st->timeout = sp->timeout;
+ st->pfsync_time = time_second;
+ }
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ splx(s);
+
+ return (len);
+}
+
+int
+pfsync_in_upd_c(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct pfsync_upd_c *ua, *up;
+ struct pf_state_key *sk;
+ struct pf_state_cmp id_key;
+ struct pf_state *st;
+
+ int len = count * sizeof(*up);
+ int sfail;
+
+ struct mbuf *mp;
+ int offp, i;
+ int s;
- s = splsoftnet();
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ ua = (struct pfsync_upd_c *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- for (i = 0, up = (struct pfsync_state_upd *)(mp->m_data + offp);
- i < count; i++, up++) {
- /* check for invalid values */
- if (up->timeout >= PFTM_MAX ||
- up->src.state > PF_TCPS_PROXY_DST ||
- up->dst.state > PF_TCPS_PROXY_DST) {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync_insert: "
- "PFSYNC_ACT_UPD_C: "
- "invalid value\n");
- pfsyncstats.pfsyncs_badstate++;
- continue;
+ for (i = 0; i < count; i++) {
+ up = &ua[i];
+
+ /* check for invalid values */
+ if (up->timeout >= PFTM_MAX ||
+ up->src.state > PF_TCPS_PROXY_DST ||
+ up->dst.state > PF_TCPS_PROXY_DST) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
+ printf("pfsync_input: "
+ "PFSYNC_ACT_UPD_C: "
+ "invalid value\n");
}
+ V_pfsyncstats.pfsyncs_badval++;
+ continue;
+ }
- bcopy(up->id, &key.id, sizeof(key.id));
- key.creatorid = up->creatorid;
+ bcopy(&up->id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = up->creatorid;
- st = pf_find_state_byid(&key);
- if (st == NULL) {
- /* We don't have this state. Ask for it. */
- error = pfsync_request_update(up, &src);
- if (error == ENOMEM) {
+ st = pf_find_state_byid(&id_key);
+ if (st == NULL) {
+ /* We don't have this state. Ask for it. */
+ pfsync_request_update(id_key.creatorid, id_key.id);
+ continue;
+ }
+
+ if (ISSET(st->state_flags, PFSTATE_ACK))
+ pfsync_deferred(st, 1);
+
+ sk = st->key[PF_SK_WIRE]; /* XXX right one? */
+ sfail = 0;
+ if (sk->proto == IPPROTO_TCP)
+ sfail = pfsync_upd_tcp(st, &up->src, &up->dst);
+ else {
+ /*
+ * Non-TCP protocol state machine always go forwards
+ */
+ if (st->src.state > up->src.state)
+ sfail = 5;
+ else if (st->dst.state > up->dst.state)
+ sfail = 6;
+ }
+
+ if (sfail) {
#ifdef __FreeBSD__
- PF_UNLOCK();
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
#endif
- splx(s);
- goto done;
- }
- update_requested = 1;
- pfsyncstats.pfsyncs_badstate++;
- continue;
- }
- sfail = 0;
- if (st->proto == IPPROTO_TCP) {
- /*
- * The state should never go backwards except
- * for syn-proxy states. Neither should the
- * sequence window slide backwards.
- */
- if (st->src.state > up->src.state &&
- (st->src.state < PF_TCPS_PROXY_SRC ||
- up->src.state >= PF_TCPS_PROXY_SRC))
- sfail = 1;
- else if (st->dst.state > up->dst.state)
- sfail = 2;
- else if (SEQ_GT(st->src.seqlo,
- ntohl(up->src.seqlo)))
- sfail = 3;
- else if (st->dst.state >= TCPS_SYN_SENT &&
- SEQ_GT(st->dst.seqlo, ntohl(up->dst.seqlo)))
- sfail = 4;
- } else {
- /*
- * Non-TCP protocol state machine always go
- * forwards
- */
- if (st->src.state > up->src.state)
- sfail = 5;
- else if (st->dst.state > up->dst.state)
- sfail = 6;
+ printf("pfsync: ignoring stale update "
+ "(%d) id: %016llx "
+ "creatorid: %08x\n", sfail,
+ betoh64(st->id),
+ ntohl(st->creatorid));
}
- if (sfail) {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: ignoring stale update "
- "(%d) id: %016llx "
- "creatorid: %08x\n", sfail,
- betoh64(st->id),
- ntohl(st->creatorid));
- pfsyncstats.pfsyncs_badstate++;
-
- /* we have a better state, send it out */
- if ((!stale || update_requested) &&
- sc->sc_mbuf != NULL) {
- pfsync_sendout(sc);
- update_requested = 0;
- }
- stale++;
- if (!st->sync_flags)
- pfsync_pack_state(PFSYNC_ACT_UPD, st,
- PFSYNC_FLAG_STALE);
- continue;
- }
- pfsync_alloc_scrub_memory(&up->dst, &st->dst);
- pf_state_peer_ntoh(&up->src, &st->src);
- pf_state_peer_ntoh(&up->dst, &st->dst);
- st->expire = ntohl(up->expire) + time_second;
- st->timeout = up->timeout;
+ V_pfsyncstats.pfsyncs_stale++;
+
+ pfsync_update_state(st);
+ schednetisr(NETISR_PFSYNC);
+ continue;
}
- if ((update_requested || stale) && sc->sc_mbuf)
- pfsync_sendout(sc);
+ pfsync_alloc_scrub_memory(&up->dst, &st->dst);
+ pf_state_peer_ntoh(&up->src, &st->src);
+ pf_state_peer_ntoh(&up->dst, &st->dst);
+ st->expire = ntohl(up->expire) + time_second;
+ st->timeout = up->timeout;
+ st->pfsync_time = time_second;
+ }
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_UNLOCK();
#endif
- splx(s);
- break;
+ splx(s);
+
+ return (len);
+}
+
+int
+pfsync_in_ureq(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct pfsync_upd_req *ur, *ura;
+ struct mbuf *mp;
+ int len = count * sizeof(*ur);
+ int i, offp;
+
+ struct pf_state_cmp id_key;
+ struct pf_state *st;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
}
- case PFSYNC_ACT_DEL_C:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*dp), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
+ ura = (struct pfsync_upd_req *)(mp->m_data + offp);
- s = splsoftnet();
-#ifdef __FreeBSD__
- PF_LOCK();
-#endif
- for (i = 0, dp = (struct pfsync_state_del *)(mp->m_data + offp);
- i < count; i++, dp++) {
- bcopy(dp->id, &key.id, sizeof(key.id));
- key.creatorid = dp->creatorid;
+ for (i = 0; i < count; i++) {
+ ur = &ura[i];
+
+ bcopy(&ur->id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = ur->creatorid;
- st = pf_find_state_byid(&key);
+ if (id_key.id == 0 && id_key.creatorid == 0)
+ pfsync_bulk_start();
+ else {
+ st = pf_find_state_byid(&id_key);
if (st == NULL) {
- pfsyncstats.pfsyncs_badstate++;
+ V_pfsyncstats.pfsyncs_badstate++;
continue;
}
- st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ if (ISSET(st->state_flags, PFSTATE_NOSYNC))
+ continue;
+
+ pfsync_update_state_req(st);
}
+ }
+
+ return (len);
+}
+
+int
+pfsync_in_del(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct mbuf *mp;
+ struct pfsync_state *sa, *sp;
+ struct pf_state_cmp id_key;
+ struct pf_state *st;
+ int len = count * sizeof(*sp);
+ int offp, i;
+ int s;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ sa = (struct pfsync_state *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_LOCK();
#endif
- splx(s);
- break;
- case PFSYNC_ACT_INS_F:
- case PFSYNC_ACT_DEL_F:
- /* not implemented */
- break;
- case PFSYNC_ACT_UREQ:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*rup), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
+ for (i = 0; i < count; i++) {
+ sp = &sa[i];
+
+ bcopy(sp->id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = sp->creatorid;
+
+ st = pf_find_state_byid(&id_key);
+ if (st == NULL) {
+ V_pfsyncstats.pfsyncs_badstate++;
+ continue;
}
+ SET(st->state_flags, PFSTATE_NOSYNC);
+ pf_unlink_state(st);
+ }
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ splx(s);
+
+ return (len);
+}
+
+int
+pfsync_in_del_c(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ struct mbuf *mp;
+ struct pfsync_del_c *sa, *sp;
+ struct pf_state_cmp id_key;
+ struct pf_state *st;
+ int len = count * sizeof(*sp);
+ int offp, i;
+ int s;
- s = splsoftnet();
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ sa = (struct pfsync_del_c *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- if (sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
- for (i = 0,
- rup = (struct pfsync_state_upd_req *)(mp->m_data + offp);
- i < count; i++, rup++) {
- bcopy(rup->id, &key.id, sizeof(key.id));
- key.creatorid = rup->creatorid;
-
- if (key.id == 0 && key.creatorid == 0) {
- sc->sc_ureq_received = time_uptime;
- if (sc->sc_bulk_send_next == NULL)
- sc->sc_bulk_send_next =
- TAILQ_FIRST(&state_list);
- sc->sc_bulk_terminator = sc->sc_bulk_send_next;
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: received "
- "bulk update request\n");
- pfsync_send_bus(sc, PFSYNC_BUS_START);
-#ifdef __FreeBSD__
- callout_reset(&sc->sc_bulk_tmo, 1 * hz,
- pfsync_bulk_update, pfsyncif);
-#else
- timeout_add(&sc->sc_bulk_tmo, 1 * hz);
-#endif
- } else {
- st = pf_find_state_byid(&key);
- if (st == NULL) {
- pfsyncstats.pfsyncs_badstate++;
- continue;
- }
- if (!st->sync_flags)
- pfsync_pack_state(PFSYNC_ACT_UPD,
- st, 0);
- }
+ for (i = 0; i < count; i++) {
+ sp = &sa[i];
+
+ bcopy(&sp->id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = sp->creatorid;
+
+ st = pf_find_state_byid(&id_key);
+ if (st == NULL) {
+ V_pfsyncstats.pfsyncs_badstate++;
+ continue;
}
- if (sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
+
+ SET(st->state_flags, PFSTATE_NOSYNC);
+ pf_unlink_state(st);
+ }
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_LOCK();
#endif
- splx(s);
- break;
- case PFSYNC_ACT_BUS:
- /* If we're not waiting for a bulk update, who cares. */
- if (sc->sc_ureq_sent == 0)
- break;
+ splx(s);
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- sizeof(*bus), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
- bus = (struct pfsync_state_bus *)(mp->m_data + offp);
- switch (bus->status) {
- case PFSYNC_BUS_START:
+ return (len);
+}
+
+int
+pfsync_in_bus(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
#ifdef __FreeBSD__
- callout_reset(&sc->sc_bulkfail_tmo,
- pf_pool_limits[PF_LIMIT_STATES].limit /
- (PFSYNC_BULKPACKETS * sc->sc_maxcount),
- pfsync_bulkfail, pfsyncif);
+ struct pfsync_softc *sc = V_pfsyncif;
#else
- timeout_add(&sc->sc_bulkfail_tmo,
- pf_pool_limits[PF_LIMIT_STATES].limit /
- (PFSYNC_BULKPACKETS * sc->sc_maxcount));
+ struct pfsync_softc *sc = pfsyncif;
#endif
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: received bulk "
- "update start\n");
- break;
- case PFSYNC_BUS_END:
- if (time_uptime - ntohl(bus->endtime) >=
- sc->sc_ureq_sent) {
- /* that's it, we're happy */
- sc->sc_ureq_sent = 0;
- sc->sc_bulk_tries = 0;
- timeout_del(&sc->sc_bulkfail_tmo);
+ struct pfsync_bus *bus;
+ struct mbuf *mp;
+ int len = count * sizeof(*bus);
+ int offp;
+
+ /* If we're not waiting for a bulk update, who cares. */
+ if (sc->sc_ureq_sent == 0)
+ return (len);
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ bus = (struct pfsync_bus *)(mp->m_data + offp);
+
+ switch (bus->status) {
+ case PFSYNC_BUS_START:
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulkfail_tmo, 5 * hz, pfsync_bulk_fail,
+ V_pfsyncif);
+#else
+ timeout_add_sec(&sc->sc_bulkfail_tmo, 5); /* XXX magic */
+#endif
+#ifdef XXX
+ pf_pool_limits[PF_LIMIT_STATES].limit /
+ (PFSYNC_BULKPACKETS * sc->sc_maxcount));
+#endif
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
+ printf("pfsync: received bulk update start\n");
+ break;
+
+ case PFSYNC_BUS_END:
+ if (time_uptime - ntohl(bus->endtime) >=
+ sc->sc_ureq_sent) {
+ /* that's it, we're happy */
+ sc->sc_ureq_sent = 0;
+ sc->sc_bulk_tries = 0;
+ timeout_del(&sc->sc_bulkfail_tmo);
#if NCARP > 0
- if (!pfsync_sync_ok)
+#ifdef notyet
#ifdef __FreeBSD__
-#ifdef CARP_ADVANCED
- carp_group_demote_adj(sc->sc_ifp, -1);
+ if (!sc->pfsync_sync_ok)
+#else
+ if (!pfsync_sync_ok)
+#endif
+ carp_group_demote_adj(&sc->sc_if, -1);
#endif
+#endif
+#ifdef __FreeBSD__
+ sc->pfsync_sync_ok = 1;
#else
- carp_group_demote_adj(&sc->sc_if, -1);
+ pfsync_sync_ok = 1;
#endif
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC)
#endif
- pfsync_sync_ok = 1;
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: received valid "
- "bulk update end\n");
- } else {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: received invalid "
- "bulk update end: bad timestamp\n");
- }
- break;
+ printf("pfsync: received valid "
+ "bulk update end\n");
+ } else {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
+ printf("pfsync: received invalid "
+ "bulk update end: bad timestamp\n");
}
break;
-#ifdef PFSYNC_TDB
- case PFSYNC_ACT_TDB_UPD:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*pt), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
- s = splsoftnet();
+ }
+
+ return (len);
+}
+
+int
+pfsync_in_tdb(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ int len = count * sizeof(struct pfsync_tdb);
+
+#if defined(IPSEC)
+ struct pfsync_tdb *tp;
+ struct mbuf *mp;
+ int offp;
+ int i;
+ int s;
+
+ mp = m_pulldown(m, offset, len, &offp);
+ if (mp == NULL) {
+ V_pfsyncstats.pfsyncs_badlen++;
+ return (-1);
+ }
+ tp = (struct pfsync_tdb *)(mp->m_data + offp);
+
+ s = splsoftnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- for (i = 0, pt = (struct pfsync_tdb *)(mp->m_data + offp);
- i < count; i++, pt++)
- pfsync_update_net_tdb(pt);
+ for (i = 0; i < count; i++)
+ pfsync_update_net_tdb(&tp[i]);
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_UNLOCK();
#endif
- splx(s);
- break;
+ splx(s);
#endif
+
+ return (len);
+}
+
+#if defined(IPSEC)
+/* Update an in-kernel tdb. Silently fail if no tdb is found. */
+void
+pfsync_update_net_tdb(struct pfsync_tdb *pt)
+{
+ struct tdb *tdb;
+ int s;
+
+ /* check for invalid values */
+ if (ntohl(pt->spi) <= SPI_RESERVED_MAX ||
+ (pt->dst.sa.sa_family != AF_INET &&
+ pt->dst.sa.sa_family != AF_INET6))
+ goto bad;
+
+ s = spltdb();
+ tdb = gettdb(pt->spi, &pt->dst, pt->sproto);
+ if (tdb) {
+ pt->rpl = ntohl(pt->rpl);
+ pt->cur_bytes = betoh64(pt->cur_bytes);
+
+ /* Neither replay nor byte counter should ever decrease. */
+ if (pt->rpl < tdb->tdb_rpl ||
+ pt->cur_bytes < tdb->tdb_cur_bytes) {
+ splx(s);
+ goto bad;
+ }
+
+ tdb->tdb_rpl = pt->rpl;
+ tdb->tdb_cur_bytes = pt->cur_bytes;
}
+ splx(s);
+ return;
-done:
- if (m)
- m_freem(m);
+bad:
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
+ printf("pfsync_insert: PFSYNC_ACT_TDB_UPD: "
+ "invalid value\n");
+ V_pfsyncstats.pfsyncs_badstate++;
+ return;
+}
+#endif
+
+
+int
+pfsync_in_eof(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ /* check if we are at the right place in the packet */
+ if (offset != m->m_pkthdr.len - sizeof(struct pfsync_eof))
+ V_pfsyncstats.pfsyncs_badact++;
+
+ /* we're done. free and let the caller return */
+ m_freem(m);
+ return (-1);
+}
+
+int
+pfsync_in_error(struct pfsync_pkt *pkt, struct mbuf *m, int offset, int count)
+{
+ V_pfsyncstats.pfsyncs_badact++;
+
+ m_freem(m);
+ return (-1);
}
int
pfsyncoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
- struct route *ro)
+#ifdef __FreeBSD__
+ struct route *rt)
+#else
+ struct rtentry *rt)
+#endif
{
m_freem(m);
return (0);
@@ -1101,12 +1779,15 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
struct ip_moptions *imo = &sc->sc_imo;
struct pfsyncreq pfsyncr;
struct ifnet *sifp;
+ struct ip *ip;
int s, error;
switch (cmd) {
+#if 0
case SIOCSIFADDR:
case SIOCAIFADDR:
case SIOCSIFDSTADDR:
+#endif
case SIOCSIFFLAGS:
#ifdef __FreeBSD__
if (ifp->if_flags & IFF_UP)
@@ -1121,32 +1802,33 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
#endif
break;
case SIOCSIFMTU:
- if (ifr->ifr_mtu < PFSYNC_MINMTU)
+ if (ifr->ifr_mtu <= PFSYNC_MINPKT)
return (EINVAL);
- if (ifr->ifr_mtu > MCLBYTES)
+ if (ifr->ifr_mtu > MCLBYTES) /* XXX could be bigger */
ifr->ifr_mtu = MCLBYTES;
- s = splnet();
+ if (ifr->ifr_mtu < ifp->if_mtu) {
+ s = splnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_LOCK();
#endif
- if (ifr->ifr_mtu < ifp->if_mtu)
- pfsync_sendout(sc);
- pfsync_setmtu(sc, ifr->ifr_mtu);
+ pfsync_sendout();
#ifdef __FreeBSD__
- PF_UNLOCK();
+ PF_UNLOCK();
#endif
- splx(s);
+ splx(s);
+ }
+ ifp->if_mtu = ifr->ifr_mtu;
break;
case SIOCGETPFSYNC:
bzero(&pfsyncr, sizeof(pfsyncr));
- if (sc->sc_sync_ifp)
+ if (sc->sc_sync_if) {
strlcpy(pfsyncr.pfsyncr_syncdev,
- sc->sc_sync_ifp->if_xname, IFNAMSIZ);
+ sc->sc_sync_if->if_xname, IFNAMSIZ);
+ }
pfsyncr.pfsyncr_syncpeer = sc->sc_sync_peer;
pfsyncr.pfsyncr_maxupdates = sc->sc_maxupdates;
- if ((error = copyout(&pfsyncr, ifr->ifr_data, sizeof(pfsyncr))))
- return (error);
- break;
+ return (copyout(&pfsyncr, ifr->ifr_data, sizeof(pfsyncr)));
+
case SIOCSETPFSYNC:
#ifdef __FreeBSD__
if ((error = priv_check(curthread, PRIV_NETINET_PF)) != 0)
@@ -1182,20 +1864,13 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
sc->sc_maxupdates = pfsyncr.pfsyncr_maxupdates;
if (pfsyncr.pfsyncr_syncdev[0] == 0) {
- sc->sc_sync_ifp = NULL;
- if (sc->sc_mbuf_net != NULL) {
- /* Don't keep stale pfsync packets around. */
- s = splnet();
- m_freem(sc->sc_mbuf_net);
- sc->sc_mbuf_net = NULL;
- sc->sc_statep_net.s = NULL;
- splx(s);
- }
+ sc->sc_sync_if = NULL;
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
if (imo->imo_num_memberships > 0) {
- in_delmulti(imo->imo_membership[--imo->imo_num_memberships]);
+ in_delmulti(imo->imo_membership[
+ --imo->imo_num_memberships]);
imo->imo_multicast_ifp = NULL;
}
break;
@@ -1206,27 +1881,21 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
#endif
if ((sifp = ifunit(pfsyncr.pfsyncr_syncdev)) == NULL)
return (EINVAL);
+
#ifdef __FreeBSD__
PF_LOCK();
#endif
-
s = splnet();
#ifdef __FreeBSD__
if (sifp->if_mtu < sc->sc_ifp->if_mtu ||
#else
if (sifp->if_mtu < sc->sc_if.if_mtu ||
#endif
- (sc->sc_sync_ifp != NULL &&
- sifp->if_mtu < sc->sc_sync_ifp->if_mtu) ||
+ (sc->sc_sync_if != NULL &&
+ sifp->if_mtu < sc->sc_sync_if->if_mtu) ||
sifp->if_mtu < MCLBYTES - sizeof(struct ip))
- pfsync_sendout(sc);
- sc->sc_sync_ifp = sifp;
-
-#ifdef __FreeBSD__
- pfsync_setmtu(sc, sc->sc_ifp->if_mtu);
-#else
- pfsync_setmtu(sc, sc->sc_if.if_mtu);
-#endif
+ pfsync_sendout();
+ sc->sc_sync_if = sifp;
if (imo->imo_num_memberships > 0) {
#ifdef __FreeBSD__
@@ -1239,7 +1908,7 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
imo->imo_multicast_ifp = NULL;
}
- if (sc->sc_sync_ifp &&
+ if (sc->sc_sync_if &&
#ifdef __FreeBSD__
sc->sc_sync_peer.s_addr == htonl(INADDR_PFSYNC_GROUP)) {
#else
@@ -1247,8 +1916,8 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
#endif
struct in_addr addr;
- if (!(sc->sc_sync_ifp->if_flags & IFF_MULTICAST)) {
- sc->sc_sync_ifp = NULL;
+ if (!(sc->sc_sync_if->if_flags & IFF_MULTICAST)) {
+ sc->sc_sync_if = NULL;
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
@@ -1266,8 +1935,8 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
PF_UNLOCK();
#endif
if ((imo->imo_membership[0] =
- in_addmulti(&addr, sc->sc_sync_ifp)) == NULL) {
- sc->sc_sync_ifp = NULL;
+ in_addmulti(&addr, sc->sc_sync_if)) == NULL) {
+ sc->sc_sync_if = NULL;
splx(s);
return (ENOBUFS);
}
@@ -1275,47 +1944,54 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
PF_LOCK();
#endif
imo->imo_num_memberships++;
- imo->imo_multicast_ifp = sc->sc_sync_ifp;
+ imo->imo_multicast_ifp = sc->sc_sync_if;
imo->imo_multicast_ttl = PFSYNC_DFLTTL;
imo->imo_multicast_loop = 0;
}
- if (sc->sc_sync_ifp ||
-#ifdef __FreeBSD__
- sc->sc_sendaddr.s_addr != htonl(INADDR_PFSYNC_GROUP)) {
-#else
- sc->sc_sendaddr.s_addr != INADDR_PFSYNC_GROUP) {
-#endif
+ ip = &sc->sc_template;
+ bzero(ip, sizeof(*ip));
+ ip->ip_v = IPVERSION;
+ ip->ip_hl = sizeof(sc->sc_template) >> 2;
+ ip->ip_tos = IPTOS_LOWDELAY;
+ /* len and id are set later */
+ ip->ip_off = htons(IP_DF);
+ ip->ip_ttl = PFSYNC_DFLTTL;
+ ip->ip_p = IPPROTO_PFSYNC;
+ ip->ip_src.s_addr = INADDR_ANY;
+ ip->ip_dst.s_addr = sc->sc_sync_peer.s_addr;
+
+ if (sc->sc_sync_if) {
/* Request a full state table update. */
sc->sc_ureq_sent = time_uptime;
#if NCARP > 0
- if (pfsync_sync_ok)
+#ifdef notyet
#ifdef __FreeBSD__
-#ifdef CARP_ADVANCED
- carp_group_demote_adj(sc->sc_ifp, 1);
-#endif
+ if (sc->pfsync_sync_ok)
#else
+ if (pfsync_sync_ok)
+#endif
carp_group_demote_adj(&sc->sc_if, 1);
#endif
#endif
+#ifdef __FreeBSD__
+ sc->pfsync_sync_ok = 0;
+#else
pfsync_sync_ok = 0;
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: requesting bulk update\n");
+#endif
#ifdef __FreeBSD__
- callout_reset(&sc->sc_bulkfail_tmo, 5 * hz,
- pfsync_bulkfail, pfsyncif);
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
#else
- timeout_add(&sc->sc_bulkfail_tmo, 5 * hz);
+ if (pf_status.debug >= PF_DEBUG_MISC)
#endif
- error = pfsync_request_update(NULL, NULL);
- if (error == ENOMEM) {
+ printf("pfsync: requesting bulk update\n");
#ifdef __FreeBSD__
- PF_UNLOCK();
+ callout_reset(&sc->sc_bulkfail_tmo, 5 * hz,
+ pfsync_bulk_fail, V_pfsyncif);
+#else
+ timeout_add_sec(&sc->sc_bulkfail_tmo, 5);
#endif
- splx(s);
- return (ENOMEM);
- }
- pfsync_sendout(sc);
+ pfsync_request_update(0, 0);
}
#ifdef __FreeBSD__
PF_UNLOCK();
@@ -1331,34 +2007,158 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
return (0);
}
-void
-pfsync_setmtu(struct pfsync_softc *sc, int mtu_req)
+int
+pfsync_out_state(struct pf_state *st, struct mbuf *m, int offset)
{
- int mtu;
+ struct pfsync_state *sp = (struct pfsync_state *)(m->m_data + offset);
+
+ pfsync_state_export(sp, st);
+
+ return (sizeof(*sp));
+}
- if (sc->sc_sync_ifp && sc->sc_sync_ifp->if_mtu < mtu_req)
- mtu = sc->sc_sync_ifp->if_mtu;
+int
+pfsync_out_iack(struct pf_state *st, struct mbuf *m, int offset)
+{
+ struct pfsync_ins_ack *iack =
+ (struct pfsync_ins_ack *)(m->m_data + offset);
+
+ iack->id = st->id;
+ iack->creatorid = st->creatorid;
+
+ return (sizeof(*iack));
+}
+
+int
+pfsync_out_upd_c(struct pf_state *st, struct mbuf *m, int offset)
+{
+ struct pfsync_upd_c *up = (struct pfsync_upd_c *)(m->m_data + offset);
+
+ up->id = st->id;
+ pf_state_peer_hton(&st->src, &up->src);
+ pf_state_peer_hton(&st->dst, &up->dst);
+ up->creatorid = st->creatorid;
+
+ up->expire = pf_state_expires(st);
+ if (up->expire <= time_second)
+ up->expire = htonl(0);
else
- mtu = mtu_req;
+ up->expire = htonl(up->expire - time_second);
+ up->timeout = st->timeout;
+
+ bzero(up->_pad, sizeof(up->_pad)); /* XXX */
+
+ return (sizeof(*up));
+}
+
+int
+pfsync_out_del(struct pf_state *st, struct mbuf *m, int offset)
+{
+ struct pfsync_del_c *dp = (struct pfsync_del_c *)(m->m_data + offset);
+
+ dp->id = st->id;
+ dp->creatorid = st->creatorid;
- sc->sc_maxcount = (mtu - sizeof(struct pfsync_header)) /
- sizeof(struct pfsync_state);
- if (sc->sc_maxcount > 254)
- sc->sc_maxcount = 254;
+ SET(st->state_flags, PFSTATE_NOSYNC);
+
+ return (sizeof(*dp));
+}
+
+void
+pfsync_drop(struct pfsync_softc *sc)
+{
+ struct pf_state *st;
+ struct pfsync_upd_req_item *ur;
+#ifdef notyet
+ struct tdb *t;
+#endif
+ int q;
+
+ for (q = 0; q < PFSYNC_S_COUNT; q++) {
+ if (TAILQ_EMPTY(&sc->sc_qs[q]))
+ continue;
+
+ TAILQ_FOREACH(st, &sc->sc_qs[q], sync_list) {
+#ifdef PFSYNC_DEBUG
#ifdef __FreeBSD__
- sc->sc_ifp->if_mtu = sizeof(struct pfsync_header) +
+ KASSERT(st->sync_state == q,
+ ("%s: st->sync_state == q",
+ __FUNCTION__));
#else
- sc->sc_if.if_mtu = sizeof(struct pfsync_header) +
+ KASSERT(st->sync_state == q);
+#endif
#endif
- sc->sc_maxcount * sizeof(struct pfsync_state);
+ st->sync_state = PFSYNC_S_NONE;
+ }
+ TAILQ_INIT(&sc->sc_qs[q]);
+ }
+
+ while ((ur = TAILQ_FIRST(&sc->sc_upd_req_list)) != NULL) {
+ TAILQ_REMOVE(&sc->sc_upd_req_list, ur, ur_entry);
+ pool_put(&sc->sc_pool, ur);
+ }
+
+ sc->sc_plus = NULL;
+
+#ifdef notyet
+ if (!TAILQ_EMPTY(&sc->sc_tdb_q)) {
+ TAILQ_FOREACH(t, &sc->sc_tdb_q, tdb_sync_entry)
+ CLR(t->tdb_flags, TDBF_PFSYNC);
+
+ TAILQ_INIT(&sc->sc_tdb_q);
+ }
+#endif
+
+ sc->sc_len = PFSYNC_MINPKT;
}
-struct mbuf *
-pfsync_get_mbuf(struct pfsync_softc *sc, u_int8_t action, void **sp)
+void
+pfsync_sendout(void)
{
- struct pfsync_header *h;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
+#endif
+#if NBPFILTER > 0
+#ifdef __FreeBSD__
+ struct ifnet *ifp = sc->sc_ifp;
+#else
+ struct ifnet *ifp = &sc->sc_if;
+#endif
struct mbuf *m;
- int len;
+#endif
+ struct ip *ip;
+ struct pfsync_header *ph;
+ struct pfsync_subheader *subh;
+ struct pf_state *st;
+ struct pfsync_upd_req_item *ur;
+#ifdef notyet
+ struct tdb *t;
+#endif
+#ifdef __FreeBSD__
+ size_t pktlen;
+#endif
+ int offset;
+ int q, count = 0;
+
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#else
+ splassert(IPL_NET);
+#endif
+
+ if (sc == NULL || sc->sc_len == PFSYNC_MINPKT)
+ return;
+
+#if NBPFILTER > 0
+ if (ifp->if_bpf == NULL && sc->sc_sync_if == NULL) {
+#else
+ if (sc->sc_sync_if == NULL) {
+#endif
+ pfsync_drop(sc);
+ return;
+ }
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL) {
@@ -1367,874 +2167,1136 @@ pfsync_get_mbuf(struct pfsync_softc *sc, u_int8_t action, void **sp)
#else
sc->sc_if.if_oerrors++;
#endif
- return (NULL);
+ V_pfsyncstats.pfsyncs_onomem++;
+ pfsync_drop(sc);
+ return;
}
- switch (action) {
- case PFSYNC_ACT_CLR:
- len = sizeof(struct pfsync_header) +
- sizeof(struct pfsync_state_clr);
- break;
- case PFSYNC_ACT_UPD_C:
- len = (sc->sc_maxcount * sizeof(struct pfsync_state_upd)) +
- sizeof(struct pfsync_header);
- break;
- case PFSYNC_ACT_DEL_C:
- len = (sc->sc_maxcount * sizeof(struct pfsync_state_del)) +
- sizeof(struct pfsync_header);
- break;
- case PFSYNC_ACT_UREQ:
- len = (sc->sc_maxcount * sizeof(struct pfsync_state_upd_req)) +
- sizeof(struct pfsync_header);
- break;
- case PFSYNC_ACT_BUS:
- len = sizeof(struct pfsync_header) +
- sizeof(struct pfsync_state_bus);
- break;
-#ifdef PFSYNC_TDB
- case PFSYNC_ACT_TDB_UPD:
- len = (sc->sc_maxcount * sizeof(struct pfsync_tdb)) +
- sizeof(struct pfsync_header);
- break;
+#ifdef __FreeBSD__
+ pktlen = max_linkhdr + sc->sc_len;
+ if (pktlen > MHLEN) {
+ /* Find the right pool to allocate from. */
+ /* XXX: This is ugly. */
+ m_cljget(m, M_DONTWAIT, pktlen <= MSIZE ? MSIZE :
+ pktlen <= MCLBYTES ? MCLBYTES :
+#if MJUMPAGESIZE != MCLBYTES
+ pktlen <= MJUMPAGESIZE ? MJUMPAGESIZE :
#endif
- default:
- len = (sc->sc_maxcount * sizeof(struct pfsync_state)) +
- sizeof(struct pfsync_header);
- break;
- }
-
- if (len > MHLEN) {
- MCLGET(m, M_DONTWAIT);
- if ((m->m_flags & M_EXT) == 0) {
+ pktlen <= MJUM9BYTES ? MJUM9BYTES : MJUM16BYTES);
+#else
+ if (max_linkhdr + sc->sc_len > MHLEN) {
+ MCLGETI(m, M_DONTWAIT, NULL, max_linkhdr + sc->sc_len);
+#endif
+ if (!ISSET(m->m_flags, M_EXT)) {
m_free(m);
#ifdef __FreeBSD__
sc->sc_ifp->if_oerrors++;
#else
sc->sc_if.if_oerrors++;
#endif
- return (NULL);
+ V_pfsyncstats.pfsyncs_onomem++;
+ pfsync_drop(sc);
+ return;
}
- m->m_data += (MCLBYTES - len) &~ (sizeof(long) - 1);
- } else
- MH_ALIGN(m, len);
+ }
+ m->m_data += max_linkhdr;
+ m->m_len = m->m_pkthdr.len = sc->sc_len;
- m->m_pkthdr.rcvif = NULL;
- m->m_pkthdr.len = m->m_len = sizeof(struct pfsync_header);
- h = mtod(m, struct pfsync_header *);
- h->version = PFSYNC_VERSION;
- h->af = 0;
- h->count = 0;
- h->action = action;
-#ifndef PFSYNC_TDB
- if (action != PFSYNC_ACT_TDB_UPD)
-#endif
- bcopy(&pf_status.pf_chksum, &h->pf_chksum,
- PF_MD5_DIGEST_LENGTH);
+ /* build the ip header */
+ ip = (struct ip *)m->m_data;
+ bcopy(&sc->sc_template, ip, sizeof(*ip));
+ offset = sizeof(*ip);
- *sp = (void *)((char *)h + PFSYNC_HDRLEN);
-#ifdef PFSYNC_TDB
- if (action == PFSYNC_ACT_TDB_UPD)
-#ifdef __FreeBSD__
- callout_reset(&sc->sc_tdb_tmo, hz, pfsync_tdb_timeout,
- pfsyncif);
-#else
- timeout_add(&sc->sc_tdb_tmo, hz);
-#endif
- else
-#endif
-#ifdef __FreeBSD__
- callout_reset(&sc->sc_tmo, hz, pfsync_timeout, pfsyncif);
-#else
- timeout_add(&sc->sc_tmo, hz);
-#endif
- return (m);
-}
+ ip->ip_len = htons(m->m_pkthdr.len);
+ ip->ip_id = htons(ip_randomid());
-int
-pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags)
-{
- struct ifnet *ifp = NULL;
- struct pfsync_softc *sc = pfsyncif;
- struct pfsync_header *h, *h_net;
- struct pfsync_state *sp = NULL;
- struct pfsync_state_upd *up = NULL;
- struct pfsync_state_del *dp = NULL;
- struct pf_rule *r;
- u_long secs;
- int s, ret = 0;
- u_int8_t i = 255, newaction = 0;
+ /* build the pfsync header */
+ ph = (struct pfsync_header *)(m->m_data + offset);
+ bzero(ph, sizeof(*ph));
+ offset += sizeof(*ph);
- if (sc == NULL)
- return (0);
+ ph->version = PFSYNC_VERSION;
+ ph->len = htons(sc->sc_len - sizeof(*ip));
#ifdef __FreeBSD__
- ifp = sc->sc_ifp;
+ bcopy(V_pf_status.pf_chksum, ph->pfcksum, PF_MD5_DIGEST_LENGTH);
#else
- ifp = &sc->sc_if;
+ bcopy(pf_status.pf_chksum, ph->pfcksum, PF_MD5_DIGEST_LENGTH);
#endif
- /*
- * If a packet falls in the forest and there's nobody around to
- * hear, does it make a sound?
- */
- if (ifp->if_bpf == NULL && sc->sc_sync_ifp == NULL &&
-#ifdef __FreeBSD__
- sc->sc_sync_peer.s_addr == htonl(INADDR_PFSYNC_GROUP)) {
-#else
- sc->sc_sync_peer.s_addr == INADDR_PFSYNC_GROUP) {
-#endif
- /* Don't leave any stale pfsync packets hanging around. */
- if (sc->sc_mbuf != NULL) {
- m_freem(sc->sc_mbuf);
- sc->sc_mbuf = NULL;
- sc->sc_statep.s = NULL;
- }
- return (0);
- }
+ /* walk the queues */
+ for (q = 0; q < PFSYNC_S_COUNT; q++) {
+ if (TAILQ_EMPTY(&sc->sc_qs[q]))
+ continue;
- if (action >= PFSYNC_ACT_MAX)
- return (EINVAL);
+ subh = (struct pfsync_subheader *)(m->m_data + offset);
+ offset += sizeof(*subh);
- s = splnet();
+ count = 0;
+ TAILQ_FOREACH(st, &sc->sc_qs[q], sync_list) {
+#ifdef PFSYNC_DEBUG
#ifdef __FreeBSD__
- PF_ASSERT(MA_OWNED);
+ KASSERT(st->sync_state == q,
+ ("%s: st->sync_state == q",
+ __FUNCTION__));
+#else
+ KASSERT(st->sync_state == q);
#endif
- if (sc->sc_mbuf == NULL) {
- if ((sc->sc_mbuf = pfsync_get_mbuf(sc, action,
- (void *)&sc->sc_statep.s)) == NULL) {
- splx(s);
- return (ENOMEM);
- }
- h = mtod(sc->sc_mbuf, struct pfsync_header *);
- } else {
- h = mtod(sc->sc_mbuf, struct pfsync_header *);
- if (h->action != action) {
- pfsync_sendout(sc);
- if ((sc->sc_mbuf = pfsync_get_mbuf(sc, action,
- (void *)&sc->sc_statep.s)) == NULL) {
- splx(s);
- return (ENOMEM);
- }
- h = mtod(sc->sc_mbuf, struct pfsync_header *);
- } else {
- /*
- * If it's an update, look in the packet to see if
- * we already have an update for the state.
- */
- if (action == PFSYNC_ACT_UPD && sc->sc_maxupdates) {
- struct pfsync_state *usp =
- (void *)((char *)h + PFSYNC_HDRLEN);
-
- for (i = 0; i < h->count; i++) {
- if (!memcmp(usp->id, &st->id,
- PFSYNC_ID_LEN) &&
- usp->creatorid == st->creatorid) {
- sp = usp;
- sp->updates++;
- break;
- }
- usp++;
- }
- }
+#endif
+
+ offset += pfsync_qs[q].write(st, m, offset);
+ st->sync_state = PFSYNC_S_NONE;
+ count++;
}
+ TAILQ_INIT(&sc->sc_qs[q]);
+
+ bzero(subh, sizeof(*subh));
+ subh->action = pfsync_qs[q].action;
+ subh->count = htons(count);
}
- secs = time_second;
+ if (!TAILQ_EMPTY(&sc->sc_upd_req_list)) {
+ subh = (struct pfsync_subheader *)(m->m_data + offset);
+ offset += sizeof(*subh);
- st->pfsync_time = time_uptime;
+ count = 0;
+ while ((ur = TAILQ_FIRST(&sc->sc_upd_req_list)) != NULL) {
+ TAILQ_REMOVE(&sc->sc_upd_req_list, ur, ur_entry);
- if (sp == NULL) {
- /* not a "duplicate" update */
- i = 255;
- sp = sc->sc_statep.s++;
- sc->sc_mbuf->m_pkthdr.len =
- sc->sc_mbuf->m_len += sizeof(struct pfsync_state);
- h->count++;
- bzero(sp, sizeof(*sp));
+ bcopy(&ur->ur_msg, m->m_data + offset,
+ sizeof(ur->ur_msg));
+ offset += sizeof(ur->ur_msg);
- bcopy(&st->id, sp->id, sizeof(sp->id));
- sp->creatorid = st->creatorid;
+ pool_put(&sc->sc_pool, ur);
- strlcpy(sp->ifname, st->u.s.kif->pfik_name, sizeof(sp->ifname));
- pf_state_host_hton(&st->lan, &sp->lan);
- pf_state_host_hton(&st->gwy, &sp->gwy);
- pf_state_host_hton(&st->ext, &sp->ext);
+ count++;
+ }
- bcopy(&st->rt_addr, &sp->rt_addr, sizeof(sp->rt_addr));
+ bzero(subh, sizeof(*subh));
+ subh->action = PFSYNC_ACT_UPD_REQ;
+ subh->count = htons(count);
+ }
- sp->creation = htonl(secs - st->creation);
- pf_state_counter_hton(st->packets[0], sp->packets[0]);
- pf_state_counter_hton(st->packets[1], sp->packets[1]);
- pf_state_counter_hton(st->bytes[0], sp->bytes[0]);
- pf_state_counter_hton(st->bytes[1], sp->bytes[1]);
- if ((r = st->rule.ptr) == NULL)
- sp->rule = htonl(-1);
- else
- sp->rule = htonl(r->nr);
- if ((r = st->anchor.ptr) == NULL)
- sp->anchor = htonl(-1);
- else
- sp->anchor = htonl(r->nr);
- sp->af = st->af;
- sp->proto = st->proto;
- sp->direction = st->direction;
- sp->log = st->log;
- sp->state_flags = st->state_flags;
- sp->timeout = st->timeout;
+ /* has someone built a custom region for us to add? */
+ if (sc->sc_plus != NULL) {
+ bcopy(sc->sc_plus, m->m_data + offset, sc->sc_pluslen);
+ offset += sc->sc_pluslen;
- if (flags & PFSYNC_FLAG_STALE)
- sp->sync_flags |= PFSTATE_STALE;
+ sc->sc_plus = NULL;
}
- pf_state_peer_hton(&st->src, &sp->src);
- pf_state_peer_hton(&st->dst, &sp->dst);
+#ifdef notyet
+ if (!TAILQ_EMPTY(&sc->sc_tdb_q)) {
+ subh = (struct pfsync_subheader *)(m->m_data + offset);
+ offset += sizeof(*subh);
- if (st->expire <= secs)
- sp->expire = htonl(0);
- else
- sp->expire = htonl(st->expire - secs);
+ count = 0;
+ TAILQ_FOREACH(t, &sc->sc_tdb_q, tdb_sync_entry) {
+ offset += pfsync_out_tdb(t, m, offset);
+ CLR(t->tdb_flags, TDBF_PFSYNC);
- /* do we need to build "compressed" actions for network transfer? */
- if (sc->sc_sync_ifp && flags & PFSYNC_FLAG_COMPRESS) {
- switch (action) {
- case PFSYNC_ACT_UPD:
- newaction = PFSYNC_ACT_UPD_C;
- break;
- case PFSYNC_ACT_DEL:
- newaction = PFSYNC_ACT_DEL_C;
- break;
- default:
- /* by default we just send the uncompressed states */
- break;
+ count++;
}
+ TAILQ_INIT(&sc->sc_tdb_q);
+
+ bzero(subh, sizeof(*subh));
+ subh->action = PFSYNC_ACT_TDB;
+ subh->count = htons(count);
}
+#endif
- if (newaction) {
- if (sc->sc_mbuf_net == NULL) {
- if ((sc->sc_mbuf_net = pfsync_get_mbuf(sc, newaction,
- (void *)&sc->sc_statep_net.s)) == NULL) {
- splx(s);
- return (ENOMEM);
- }
- }
- h_net = mtod(sc->sc_mbuf_net, struct pfsync_header *);
-
- switch (newaction) {
- case PFSYNC_ACT_UPD_C:
- if (i != 255) {
- up = (void *)((char *)h_net +
- PFSYNC_HDRLEN + (i * sizeof(*up)));
- up->updates++;
- } else {
- h_net->count++;
- sc->sc_mbuf_net->m_pkthdr.len =
- sc->sc_mbuf_net->m_len += sizeof(*up);
- up = sc->sc_statep_net.u++;
-
- bzero(up, sizeof(*up));
- bcopy(&st->id, up->id, sizeof(up->id));
- up->creatorid = st->creatorid;
- }
- up->timeout = st->timeout;
- up->expire = sp->expire;
- up->src = sp->src;
- up->dst = sp->dst;
- break;
- case PFSYNC_ACT_DEL_C:
- sc->sc_mbuf_net->m_pkthdr.len =
- sc->sc_mbuf_net->m_len += sizeof(*dp);
- dp = sc->sc_statep_net.d++;
- h_net->count++;
-
- bzero(dp, sizeof(*dp));
- bcopy(&st->id, dp->id, sizeof(dp->id));
- dp->creatorid = st->creatorid;
- break;
- }
+ subh = (struct pfsync_subheader *)(m->m_data + offset);
+ offset += sizeof(*subh);
+
+ bzero(subh, sizeof(*subh));
+ subh->action = PFSYNC_ACT_EOF;
+ subh->count = htons(1);
+
+ /* XXX write checksum in EOF here */
+
+ /* we're done, let's put it on the wire */
+#if NBPFILTER > 0
+ if (ifp->if_bpf) {
+ m->m_data += sizeof(*ip);
+ m->m_len = m->m_pkthdr.len = sc->sc_len - sizeof(*ip);
+#ifdef __FreeBSD__
+ BPF_MTAP(ifp, m);
+#else
+ bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
+#endif
+ m->m_data -= sizeof(*ip);
+ m->m_len = m->m_pkthdr.len = sc->sc_len;
}
- if (h->count == sc->sc_maxcount ||
- (sc->sc_maxupdates && (sp->updates >= sc->sc_maxupdates)))
- ret = pfsync_sendout(sc);
+ if (sc->sc_sync_if == NULL) {
+ sc->sc_len = PFSYNC_MINPKT;
+ m_freem(m);
+ return;
+ }
+#endif
- splx(s);
- return (ret);
+#ifdef __FreeBSD__
+ sc->sc_ifp->if_opackets++;
+ sc->sc_ifp->if_obytes += m->m_pkthdr.len;
+#else
+ sc->sc_if.if_opackets++;
+ sc->sc_if.if_obytes += m->m_pkthdr.len;
+#endif
+
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL) == 0)
+#ifdef __FreeBSD__
+ {
+ PF_LOCK();
+#endif
+ V_pfsyncstats.pfsyncs_opackets++;
+#ifdef __FreeBSD__
+ }
+#endif
+ else
+#ifdef __FreeBSD__
+ {
+ PF_LOCK();
+#endif
+ V_pfsyncstats.pfsyncs_oerrors++;
+#ifdef __FreeBSD__
+ }
+#endif
+
+ /* start again */
+ sc->sc_len = PFSYNC_MINPKT;
}
-/* This must be called in splnet() */
-int
-pfsync_request_update(struct pfsync_state_upd *up, struct in_addr *src)
+void
+pfsync_insert_state(struct pf_state *st)
{
- struct ifnet *ifp = NULL;
- struct pfsync_header *h;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
struct pfsync_softc *sc = pfsyncif;
- struct pfsync_state_upd_req *rup;
- int ret = 0;
-
- if (sc == NULL)
- return (0);
+#endif
#ifdef __FreeBSD__
- ifp = sc->sc_ifp;
+ PF_ASSERT(MA_OWNED);
#else
- ifp = &sc->sc_if;
+ splassert(IPL_SOFTNET);
#endif
- if (sc->sc_mbuf == NULL) {
- if ((sc->sc_mbuf = pfsync_get_mbuf(sc, PFSYNC_ACT_UREQ,
- (void *)&sc->sc_statep.s)) == NULL)
- return (ENOMEM);
- h = mtod(sc->sc_mbuf, struct pfsync_header *);
- } else {
- h = mtod(sc->sc_mbuf, struct pfsync_header *);
- if (h->action != PFSYNC_ACT_UREQ) {
- pfsync_sendout(sc);
- if ((sc->sc_mbuf = pfsync_get_mbuf(sc, PFSYNC_ACT_UREQ,
- (void *)&sc->sc_statep.s)) == NULL)
- return (ENOMEM);
- h = mtod(sc->sc_mbuf, struct pfsync_header *);
- }
- }
- if (src != NULL)
- sc->sc_sendaddr = *src;
- sc->sc_mbuf->m_pkthdr.len = sc->sc_mbuf->m_len += sizeof(*rup);
- h->count++;
- rup = sc->sc_statep.r++;
- bzero(rup, sizeof(*rup));
- if (up != NULL) {
- bcopy(up->id, rup->id, sizeof(rup->id));
- rup->creatorid = up->creatorid;
+ if (ISSET(st->rule.ptr->rule_flag, PFRULE_NOSYNC) ||
+ st->key[PF_SK_WIRE]->proto == IPPROTO_PFSYNC) {
+ SET(st->state_flags, PFSTATE_NOSYNC);
+ return;
}
- if (h->count == sc->sc_maxcount)
- ret = pfsync_sendout(sc);
+ if (sc == NULL || ISSET(st->state_flags, PFSTATE_NOSYNC))
+ return;
- return (ret);
+#ifdef PFSYNC_DEBUG
+#ifdef __FreeBSD__
+ KASSERT(st->sync_state == PFSYNC_S_NONE,
+ ("%s: st->sync_state == PFSYNC_S_NONE", __FUNCTION__));
+#else
+ KASSERT(st->sync_state == PFSYNC_S_NONE);
+#endif
+#endif
+
+ if (sc->sc_len == PFSYNC_MINPKT)
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_tmo, 1 * hz, pfsync_timeout,
+ V_pfsyncif);
+#else
+ timeout_add_sec(&sc->sc_tmo, 1);
+#endif
+
+ pfsync_q_ins(st, PFSYNC_S_INS);
+
+ if (ISSET(st->state_flags, PFSTATE_ACK))
+ schednetisr(NETISR_PFSYNC);
+ else
+ st->sync_updates = 0;
}
+int defer = 10;
+
int
-pfsync_clear_states(u_int32_t creatorid, char *ifname)
+pfsync_defer(struct pf_state *st, struct mbuf *m)
{
- struct ifnet *ifp = NULL;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
struct pfsync_softc *sc = pfsyncif;
- struct pfsync_state_clr *cp;
- int s, ret;
+#endif
+ struct pfsync_deferral *pd;
- if (sc == NULL)
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#else
+ splassert(IPL_SOFTNET);
+#endif
+
+ if (sc->sc_deferred >= 128)
+ pfsync_undefer(TAILQ_FIRST(&sc->sc_deferrals), 0);
+
+ pd = pool_get(&sc->sc_pool, M_NOWAIT);
+ if (pd == NULL)
return (0);
+ sc->sc_deferred++;
#ifdef __FreeBSD__
- ifp = sc->sc_ifp;
+ m->m_flags |= M_SKIP_FIREWALL;
#else
- ifp = &sc->sc_if;
+ m->m_pkthdr.pf.flags |= PF_TAG_GENERATED;
#endif
+ SET(st->state_flags, PFSTATE_ACK);
+
+ pd->pd_st = st;
+ pd->pd_m = m;
+
+ TAILQ_INSERT_TAIL(&sc->sc_deferrals, pd, pd_entry);
#ifdef __FreeBSD__
- PF_ASSERT(MA_OWNED);
+ callout_init(&pd->pd_tmo, CALLOUT_MPSAFE);
+ callout_reset(&pd->pd_tmo, defer, pfsync_defer_tmo,
+ pd);
+#else
+ timeout_set(&pd->pd_tmo, pfsync_defer_tmo, pd);
+ timeout_add(&pd->pd_tmo, defer);
#endif
- s = splnet();
- if (sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
- if ((sc->sc_mbuf = pfsync_get_mbuf(sc, PFSYNC_ACT_CLR,
- (void *)&sc->sc_statep.c)) == NULL) {
- splx(s);
- return (ENOMEM);
- }
- sc->sc_mbuf->m_pkthdr.len = sc->sc_mbuf->m_len += sizeof(*cp);
- cp = sc->sc_statep.c;
- cp->creatorid = creatorid;
- if (ifname != NULL)
- strlcpy(cp->ifname, ifname, IFNAMSIZ);
- ret = (pfsync_sendout(sc));
- splx(s);
- return (ret);
+ return (1);
}
void
-pfsync_timeout(void *v)
+pfsync_undefer(struct pfsync_deferral *pd, int drop)
{
- struct pfsync_softc *sc = v;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
+#endif
int s;
- s = splnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ PF_ASSERT(MA_OWNED);
+#else
+ splassert(IPL_SOFTNET);
#endif
- pfsync_sendout(sc);
+
+ TAILQ_REMOVE(&sc->sc_deferrals, pd, pd_entry);
+ sc->sc_deferred--;
+
+ CLR(pd->pd_st->state_flags, PFSTATE_ACK);
+ timeout_del(&pd->pd_tmo); /* bah */
+ if (drop)
+ m_freem(pd->pd_m);
+ else {
+ s = splnet();
#ifdef __FreeBSD__
- PF_UNLOCK();
+ /* XXX: use pf_defered?! */
+ PF_UNLOCK();
#endif
- splx(s);
+ ip_output(pd->pd_m, (void *)NULL, (void *)NULL, 0,
+ (void *)NULL, (void *)NULL);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ splx(s);
+ }
+
+ pool_put(&sc->sc_pool, pd);
}
-#ifdef PFSYNC_TDB
void
-pfsync_tdb_timeout(void *v)
+pfsync_defer_tmo(void *arg)
{
- struct pfsync_softc *sc = v;
+#if defined(__FreeBSD__) && defined(VIMAGE)
+ struct pfsync_deferral *pd = arg;
+#endif
int s;
- s = splnet();
+ s = splsoftnet();
#ifdef __FreeBSD__
+ CURVNET_SET(pd->pd_m->m_pkthdr.rcvif->if_vnet); /* XXX */
PF_LOCK();
#endif
- pfsync_tdb_sendout(sc);
+ pfsync_undefer(arg, 0);
#ifdef __FreeBSD__
PF_UNLOCK();
+ CURVNET_RESTORE();
#endif
splx(s);
}
+
+void
+pfsync_deferred(struct pf_state *st, int drop)
+{
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
+ struct pfsync_deferral *pd;
+
+ TAILQ_FOREACH(pd, &sc->sc_deferrals, pd_entry) {
+ if (pd->pd_st == st) {
+ pfsync_undefer(pd, drop);
+ return;
+ }
+ }
+
+ panic("pfsync_send_deferred: unable to find deferred state");
+}
+
+u_int pfsync_upds = 0;
-/* This must be called in splnet() */
void
-pfsync_send_bus(struct pfsync_softc *sc, u_int8_t status)
+pfsync_update_state(struct pf_state *st)
{
- struct pfsync_state_bus *bus;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
+#endif
+ int sync = 0;
#ifdef __FreeBSD__
PF_ASSERT(MA_OWNED);
+#else
+ splassert(IPL_SOFTNET);
#endif
- if (sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
- if (pfsync_sync_ok &&
- (sc->sc_mbuf = pfsync_get_mbuf(sc, PFSYNC_ACT_BUS,
- (void *)&sc->sc_statep.b)) != NULL) {
- sc->sc_mbuf->m_pkthdr.len = sc->sc_mbuf->m_len += sizeof(*bus);
- bus = sc->sc_statep.b;
- bus->creatorid = pf_status.hostid;
- bus->status = status;
- bus->endtime = htonl(time_uptime - sc->sc_ureq_received);
- pfsync_sendout(sc);
+ if (sc == NULL)
+ return;
+
+ if (ISSET(st->state_flags, PFSTATE_ACK))
+ pfsync_deferred(st, 0);
+ if (ISSET(st->state_flags, PFSTATE_NOSYNC)) {
+ if (st->sync_state != PFSYNC_S_NONE)
+ pfsync_q_del(st);
+ return;
+ }
+
+ if (sc->sc_len == PFSYNC_MINPKT)
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_tmo, 1 * hz, pfsync_timeout,
+ V_pfsyncif);
+#else
+ timeout_add_sec(&sc->sc_tmo, 1);
+#endif
+
+ switch (st->sync_state) {
+ case PFSYNC_S_UPD_C:
+ case PFSYNC_S_UPD:
+ case PFSYNC_S_INS:
+ /* we're already handling it */
+
+ st->sync_updates++;
+ if (st->sync_updates >= sc->sc_maxupdates)
+ sync = 1;
+ break;
+
+ case PFSYNC_S_IACK:
+ pfsync_q_del(st);
+ case PFSYNC_S_NONE:
+ pfsync_q_ins(st, PFSYNC_S_UPD_C);
+ st->sync_updates = 0;
+ break;
+
+ default:
+ panic("pfsync_update_state: unexpected sync state %d",
+ st->sync_state);
+ }
+
+ if (sync || (time_second - st->pfsync_time) < 2) {
+ pfsync_upds++;
+ schednetisr(NETISR_PFSYNC);
}
}
void
-pfsync_bulk_update(void *v)
+pfsync_request_update(u_int32_t creatorid, u_int64_t id)
{
- struct pfsync_softc *sc = v;
- int s, i = 0;
- struct pf_state *state;
-
- s = splnet();
#ifdef __FreeBSD__
- PF_LOCK();
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
- if (sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
+ struct pfsync_upd_req_item *item;
+ size_t nlen = sizeof(struct pfsync_upd_req);
+ int s;
/*
- * Grab at most PFSYNC_BULKPACKETS worth of states which have not
- * been sent since the latest request was made.
+ * this code does nothing to prevent multiple update requests for the
+ * same state being generated.
*/
- state = sc->sc_bulk_send_next;
- if (state)
- do {
- /* send state update if syncable and not already sent */
- if (!state->sync_flags
- && state->timeout < PFTM_MAX
- && state->pfsync_time <= sc->sc_ureq_received) {
- pfsync_pack_state(PFSYNC_ACT_UPD, state, 0);
- i++;
- }
- /* figure next state to send */
- state = TAILQ_NEXT(state, u.s.entry_list);
-
- /* wrap to start of list if we hit the end */
- if (!state)
- state = TAILQ_FIRST(&state_list);
- } while (i < sc->sc_maxcount * PFSYNC_BULKPACKETS &&
- state != sc->sc_bulk_terminator);
-
- if (!state || state == sc->sc_bulk_terminator) {
- /* we're done */
- pfsync_send_bus(sc, PFSYNC_BUS_END);
- sc->sc_ureq_received = 0;
- sc->sc_bulk_send_next = NULL;
- sc->sc_bulk_terminator = NULL;
- timeout_del(&sc->sc_bulk_tmo);
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: bulk update complete\n");
- } else {
- /* look again for more in a bit */
+ item = pool_get(&sc->sc_pool, PR_NOWAIT);
+ if (item == NULL) {
+ /* XXX stats */
+ return;
+ }
+
+ item->ur_msg.id = id;
+ item->ur_msg.creatorid = creatorid;
+
+ if (TAILQ_EMPTY(&sc->sc_upd_req_list))
+ nlen += sizeof(struct pfsync_subheader);
+
#ifdef __FreeBSD__
- callout_reset(&sc->sc_bulk_tmo, 1, pfsync_bulk_update,
- pfsyncif);
+ if (sc->sc_len + nlen > sc->sc_ifp->if_mtu) {
#else
- timeout_add(&sc->sc_bulk_tmo, 1);
+ if (sc->sc_len + nlen > sc->sc_if.if_mtu) {
#endif
- sc->sc_bulk_send_next = state;
+ s = splnet();
+ pfsync_sendout();
+ splx(s);
+
+ nlen = sizeof(struct pfsync_subheader) +
+ sizeof(struct pfsync_upd_req);
}
- if (sc->sc_mbuf != NULL)
- pfsync_sendout(sc);
- splx(s);
+
+ TAILQ_INSERT_TAIL(&sc->sc_upd_req_list, item, ur_entry);
+ sc->sc_len += nlen;
+
+ schednetisr(NETISR_PFSYNC);
+}
+
+void
+pfsync_update_state_req(struct pf_state *st)
+{
#ifdef __FreeBSD__
- PF_UNLOCK();
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
+
+ if (sc == NULL)
+ panic("pfsync_update_state_req: nonexistant instance");
+
+ if (ISSET(st->state_flags, PFSTATE_NOSYNC)) {
+ if (st->sync_state != PFSYNC_S_NONE)
+ pfsync_q_del(st);
+ return;
+ }
+
+ switch (st->sync_state) {
+ case PFSYNC_S_UPD_C:
+ case PFSYNC_S_IACK:
+ pfsync_q_del(st);
+ case PFSYNC_S_NONE:
+ pfsync_q_ins(st, PFSYNC_S_UPD);
+ schednetisr(NETISR_PFSYNC);
+ return;
+
+ case PFSYNC_S_INS:
+ case PFSYNC_S_UPD:
+ case PFSYNC_S_DEL:
+ /* we're already handling it */
+ return;
+
+ default:
+ panic("pfsync_update_state_req: unexpected sync state %d",
+ st->sync_state);
+ }
}
void
-pfsync_bulkfail(void *v)
+pfsync_delete_state(struct pf_state *st)
{
- struct pfsync_softc *sc = v;
- int s, error;
-
#ifdef __FreeBSD__
- PF_LOCK();
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
- if (sc->sc_bulk_tries++ < PFSYNC_MAX_BULKTRIES) {
- /* Try again in a bit */
+
#ifdef __FreeBSD__
- callout_reset(&sc->sc_bulkfail_tmo, 5 * hz, pfsync_bulkfail,
- pfsyncif);
+ PF_ASSERT(MA_OWNED);
#else
- timeout_add(&sc->sc_bulkfail_tmo, 5 * hz);
+ splassert(IPL_SOFTNET);
#endif
- s = splnet();
- error = pfsync_request_update(NULL, NULL);
- if (error == ENOMEM) {
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: cannot allocate mbufs for "
- "bulk update\n");
- } else
- pfsync_sendout(sc);
- splx(s);
- } else {
- /* Pretend like the transfer was ok */
- sc->sc_ureq_sent = 0;
- sc->sc_bulk_tries = 0;
-#if NCARP > 0
- if (!pfsync_sync_ok)
+
+ if (sc == NULL)
+ return;
+
+ if (ISSET(st->state_flags, PFSTATE_ACK))
+ pfsync_deferred(st, 1);
+ if (ISSET(st->state_flags, PFSTATE_NOSYNC)) {
+ if (st->sync_state != PFSYNC_S_NONE)
+ pfsync_q_del(st);
+ return;
+ }
+
+ if (sc->sc_len == PFSYNC_MINPKT)
#ifdef __FreeBSD__
-#ifdef CARP_ADVANCED
- carp_group_demote_adj(sc->sc_ifp, -1);
-#endif
+ callout_reset(&sc->sc_tmo, 1 * hz, pfsync_timeout,
+ V_pfsyncif);
#else
- carp_group_demote_adj(&sc->sc_if, -1);
+ timeout_add_sec(&sc->sc_tmo, 1);
#endif
-#endif
- pfsync_sync_ok = 1;
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: failed to receive "
- "bulk update status\n");
- timeout_del(&sc->sc_bulkfail_tmo);
+
+ switch (st->sync_state) {
+ case PFSYNC_S_INS:
+ /* we never got to tell the world so just forget about it */
+ pfsync_q_del(st);
+ return;
+
+ case PFSYNC_S_UPD_C:
+ case PFSYNC_S_UPD:
+ case PFSYNC_S_IACK:
+ pfsync_q_del(st);
+ /* FALLTHROUGH to putting it on the del list */
+
+ case PFSYNC_S_NONE:
+ pfsync_q_ins(st, PFSYNC_S_DEL);
+ return;
+
+ default:
+ panic("pfsync_delete_state: unexpected sync state %d",
+ st->sync_state);
}
+}
+
+void
+pfsync_clear_states(u_int32_t creatorid, const char *ifname)
+{
+ struct {
+ struct pfsync_subheader subh;
+ struct pfsync_clr clr;
+ } __packed r;
+
#ifdef __FreeBSD__
- PF_UNLOCK();
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
+
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#else
+ splassert(IPL_SOFTNET);
+#endif
+
+ if (sc == NULL)
+ return;
+
+ bzero(&r, sizeof(r));
+
+ r.subh.action = PFSYNC_ACT_CLR;
+ r.subh.count = htons(1);
+
+ strlcpy(r.clr.ifname, ifname, sizeof(r.clr.ifname));
+ r.clr.creatorid = creatorid;
+
+ pfsync_send_plus(&r, sizeof(r));
}
-/* This must be called in splnet() */
-int
-pfsync_sendout(struct pfsync_softc *sc)
+void
+pfsync_q_ins(struct pf_state *st, int q)
{
-#if NBPFILTER > 0
#ifdef __FreeBSD__
- struct ifnet *ifp = sc->sc_ifp;
+ struct pfsync_softc *sc = V_pfsyncif;
#else
- struct ifnet *ifp = &sc->sc_if;
-#endif
+ struct pfsync_softc *sc = pfsyncif;
#endif
- struct mbuf *m;
+ size_t nlen = pfsync_qs[q].len;
+ int s;
#ifdef __FreeBSD__
- PF_ASSERT(MA_OWNED);
+ KASSERT(st->sync_state == PFSYNC_S_NONE,
+ ("%s: st->sync_state == PFSYNC_S_NONE", __FUNCTION__));
+#else
+ KASSERT(st->sync_state == PFSYNC_S_NONE);
#endif
- timeout_del(&sc->sc_tmo);
- if (sc->sc_mbuf == NULL)
- return (0);
- m = sc->sc_mbuf;
- sc->sc_mbuf = NULL;
- sc->sc_statep.s = NULL;
+#if 1 || defined(PFSYNC_DEBUG)
+ if (sc->sc_len < PFSYNC_MINPKT)
+#ifdef __FreeBSD__
+ panic("pfsync pkt len is too low %zu", sc->sc_len);
+#else
+ panic("pfsync pkt len is too low %d", sc->sc_len);
+#endif
+#endif
+ if (TAILQ_EMPTY(&sc->sc_qs[q]))
+ nlen += sizeof(struct pfsync_subheader);
-#if NBPFILTER > 0
- if (ifp->if_bpf)
#ifdef __FreeBSD__
- BPF_MTAP(ifp, m);
+ if (sc->sc_len + nlen > sc->sc_ifp->if_mtu) {
#else
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
+ if (sc->sc_len + nlen > sc->sc_if.if_mtu) {
+#endif
+ s = splnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
#endif
+ pfsync_sendout();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
#endif
+ splx(s);
- if (sc->sc_mbuf_net) {
- m_freem(m);
- m = sc->sc_mbuf_net;
- sc->sc_mbuf_net = NULL;
- sc->sc_statep_net.s = NULL;
+ nlen = sizeof(struct pfsync_subheader) + pfsync_qs[q].len;
}
- return pfsync_sendout_mbuf(sc, m);
+ sc->sc_len += nlen;
+ TAILQ_INSERT_TAIL(&sc->sc_qs[q], st, sync_list);
+ st->sync_state = q;
}
-#ifdef PFSYNC_TDB
-int
-pfsync_tdb_sendout(struct pfsync_softc *sc)
+void
+pfsync_q_del(struct pf_state *st)
{
-#if NBPFILTER > 0
#ifdef __FreeBSD__
- struct ifnet *ifp = sc->sc_ifp;
+ struct pfsync_softc *sc = V_pfsyncif;
#else
- struct ifnet *ifp = &sc->sc_if;
-#endif
+ struct pfsync_softc *sc = pfsyncif;
#endif
- struct mbuf *m;
+ int q = st->sync_state;
#ifdef __FreeBSD__
- PF_ASSERT(MA_OWNED);
+ KASSERT(st->sync_state != PFSYNC_S_NONE,
+ ("%s: st->sync_state != PFSYNC_S_NONE", __FUNCTION__));
+#else
+ KASSERT(st->sync_state != PFSYNC_S_NONE);
#endif
- timeout_del(&sc->sc_tdb_tmo);
- if (sc->sc_mbuf_tdb == NULL)
- return (0);
- m = sc->sc_mbuf_tdb;
- sc->sc_mbuf_tdb = NULL;
- sc->sc_statep_tdb.t = NULL;
+ sc->sc_len -= pfsync_qs[q].len;
+ TAILQ_REMOVE(&sc->sc_qs[q], st, sync_list);
+ st->sync_state = PFSYNC_S_NONE;
-#if NBPFILTER > 0
- if (ifp->if_bpf)
+ if (TAILQ_EMPTY(&sc->sc_qs[q]))
+ sc->sc_len -= sizeof(struct pfsync_subheader);
+}
+
+#ifdef notyet
+void
+pfsync_update_tdb(struct tdb *t, int output)
+{
#ifdef __FreeBSD__
- BPF_MTAP(ifp, m);
+ struct pfsync_softc *sc = V_pfsyncif;
#else
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
-#endif
+ struct pfsync_softc *sc = pfsyncif;
#endif
+ size_t nlen = sizeof(struct pfsync_tdb);
+ int s;
+
+ if (sc == NULL)
+ return;
+
+ if (!ISSET(t->tdb_flags, TDBF_PFSYNC)) {
+ if (TAILQ_EMPTY(&sc->sc_tdb_q))
+ nlen += sizeof(struct pfsync_subheader);
- return pfsync_sendout_mbuf(sc, m);
+ if (sc->sc_len + nlen > sc->sc_if.if_mtu) {
+ s = splnet();
+ pfsync_sendout();
+ splx(s);
+
+ nlen = sizeof(struct pfsync_subheader) +
+ sizeof(struct pfsync_tdb);
+ }
+
+ sc->sc_len += nlen;
+ TAILQ_INSERT_TAIL(&sc->sc_tdb_q, t, tdb_sync_entry);
+ SET(t->tdb_flags, TDBF_PFSYNC);
+ t->tdb_updates = 0;
+ } else {
+ if (++t->tdb_updates >= sc->sc_maxupdates)
+ schednetisr(NETISR_PFSYNC);
+ }
+
+ if (output)
+ SET(t->tdb_flags, TDBF_PFSYNC_RPL);
+ else
+ CLR(t->tdb_flags, TDBF_PFSYNC_RPL);
}
+
+void
+pfsync_delete_tdb(struct tdb *t)
+{
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
+ if (sc == NULL || !ISSET(t->tdb_flags, TDBF_PFSYNC))
+ return;
+
+ sc->sc_len -= sizeof(struct pfsync_tdb);
+ TAILQ_REMOVE(&sc->sc_tdb_q, t, tdb_sync_entry);
+ CLR(t->tdb_flags, TDBF_PFSYNC);
+
+ if (TAILQ_EMPTY(&sc->sc_tdb_q))
+ sc->sc_len -= sizeof(struct pfsync_subheader);
+}
+
int
-pfsync_sendout_mbuf(struct pfsync_softc *sc, struct mbuf *m)
+pfsync_out_tdb(struct tdb *t, struct mbuf *m, int offset)
{
- struct sockaddr sa;
- struct ip *ip;
+ struct pfsync_tdb *ut = (struct pfsync_tdb *)(m->m_data + offset);
+
+ bzero(ut, sizeof(*ut));
+ ut->spi = t->tdb_spi;
+ bcopy(&t->tdb_dst, &ut->dst, sizeof(ut->dst));
+ /*
+ * When a failover happens, the master's rpl is probably above
+ * what we see here (we may be up to a second late), so
+ * increase it a bit for outbound tdbs to manage most such
+ * situations.
+ *
+ * For now, just add an offset that is likely to be larger
+ * than the number of packets we can see in one second. The RFC
+ * just says the next packet must have a higher seq value.
+ *
+ * XXX What is a good algorithm for this? We could use
+ * a rate-determined increase, but to know it, we would have
+ * to extend struct tdb.
+ * XXX pt->rpl can wrap over MAXINT, but if so the real tdb
+ * will soon be replaced anyway. For now, just don't handle
+ * this edge case.
+ */
+#define RPL_INCR 16384
+ ut->rpl = htonl(t->tdb_rpl + (ISSET(t->tdb_flags, TDBF_PFSYNC_RPL) ?
+ RPL_INCR : 0));
+ ut->cur_bytes = htobe64(t->tdb_cur_bytes);
+ ut->sproto = t->tdb_sproto;
+ return (sizeof(*ut));
+}
+#endif
+
+void
+pfsync_bulk_start(void)
+{
#ifdef __FreeBSD__
- PF_ASSERT(MA_OWNED);
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
#endif
- if (sc->sc_sync_ifp ||
+
+ sc->sc_ureq_received = time_uptime;
+
+ if (sc->sc_bulk_next == NULL)
#ifdef __FreeBSD__
- sc->sc_sync_peer.s_addr != htonl(INADDR_PFSYNC_GROUP)) {
+ sc->sc_bulk_next = TAILQ_FIRST(&V_state_list);
#else
- sc->sc_sync_peer.s_addr != INADDR_PFSYNC_GROUP) {
+ sc->sc_bulk_next = TAILQ_FIRST(&state_list);
#endif
- M_PREPEND(m, sizeof(struct ip), M_DONTWAIT);
- if (m == NULL) {
- pfsyncstats.pfsyncs_onomem++;
- return (0);
+ sc->sc_bulk_last = sc->sc_bulk_next;
+
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
+ printf("pfsync: received bulk update request\n");
+
+ pfsync_bulk_status(PFSYNC_BUS_START);
+ pfsync_bulk_update(sc);
+}
+
+void
+pfsync_bulk_update(void *arg)
+{
+ struct pfsync_softc *sc = arg;
+ struct pf_state *st = sc->sc_bulk_next;
+ int i = 0;
+ int s;
+
+ s = splsoftnet();
+#ifdef __FreeBSD__
+ CURVNET_SET(sc->sc_ifp->if_vnet);
+ PF_LOCK();
+#endif
+ do {
+ if (st->sync_state == PFSYNC_S_NONE &&
+ st->timeout < PFTM_MAX &&
+ st->pfsync_time <= sc->sc_ureq_received) {
+ pfsync_update_state_req(st);
+ i++;
}
- ip = mtod(m, struct ip *);
- ip->ip_v = IPVERSION;
- ip->ip_hl = sizeof(*ip) >> 2;
- ip->ip_tos = IPTOS_LOWDELAY;
+
+ st = TAILQ_NEXT(st, entry_list);
+ if (st == NULL)
#ifdef __FreeBSD__
- ip->ip_len = m->m_pkthdr.len;
+ st = TAILQ_FIRST(&V_state_list);
#else
- ip->ip_len = htons(m->m_pkthdr.len);
+ st = TAILQ_FIRST(&state_list);
#endif
- ip->ip_id = htons(ip_randomid());
+
+ if (i > 0 && TAILQ_EMPTY(&sc->sc_qs[PFSYNC_S_UPD])) {
+ sc->sc_bulk_next = st;
#ifdef __FreeBSD__
- ip->ip_off = IP_DF;
+ callout_reset(&sc->sc_bulk_tmo, 1,
+ pfsync_bulk_fail, sc);
#else
- ip->ip_off = htons(IP_DF);
+ timeout_add(&sc->sc_bulk_tmo, 1);
#endif
- ip->ip_ttl = PFSYNC_DFLTTL;
- ip->ip_p = IPPROTO_PFSYNC;
- ip->ip_sum = 0;
+ goto out;
+ }
+ } while (st != sc->sc_bulk_last);
- bzero(&sa, sizeof(sa));
- ip->ip_src.s_addr = INADDR_ANY;
+ /* we're done */
+ sc->sc_bulk_next = NULL;
+ sc->sc_bulk_last = NULL;
+ pfsync_bulk_status(PFSYNC_BUS_END);
+out:
#ifdef __FreeBSD__
- if (sc->sc_sendaddr.s_addr == htonl(INADDR_PFSYNC_GROUP))
+ PF_UNLOCK();
+ CURVNET_RESTORE();
+#endif
+ splx(s);
+}
+
+void
+pfsync_bulk_status(u_int8_t status)
+{
+ struct {
+ struct pfsync_subheader subh;
+ struct pfsync_bus bus;
+ } __packed r;
+
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
#else
- if (sc->sc_sendaddr.s_addr == INADDR_PFSYNC_GROUP)
+ struct pfsync_softc *sc = pfsyncif;
#endif
- m->m_flags |= M_MCAST;
- ip->ip_dst = sc->sc_sendaddr;
- sc->sc_sendaddr.s_addr = sc->sc_sync_peer.s_addr;
- pfsyncstats.pfsyncs_opackets++;
+ bzero(&r, sizeof(r));
+
+ r.subh.action = PFSYNC_ACT_BUS;
+ r.subh.count = htons(1);
#ifdef __FreeBSD__
- if (!IF_HANDOFF(&sc->sc_ifq, m, NULL))
- pfsyncstats.pfsyncs_oerrors++;
- taskqueue_enqueue(taskqueue_thread, &pfsyncif->sc_send_task);
+ r.bus.creatorid = V_pf_status.hostid;
#else
- if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
- pfsyncstats.pfsyncs_oerrors++;
+ r.bus.creatorid = pf_status.hostid;
#endif
- } else
- m_freem(m);
+ r.bus.endtime = htonl(time_uptime - sc->sc_ureq_received);
+ r.bus.status = status;
- return (0);
+ pfsync_send_plus(&r, sizeof(r));
}
-#ifdef PFSYNC_TDB
-/* Update an in-kernel tdb. Silently fail if no tdb is found. */
void
-pfsync_update_net_tdb(struct pfsync_tdb *pt)
+pfsync_bulk_fail(void *arg)
{
- struct tdb *tdb;
- int s;
+ struct pfsync_softc *sc = arg;
- /* check for invalid values */
- if (ntohl(pt->spi) <= SPI_RESERVED_MAX ||
- (pt->dst.sa.sa_family != AF_INET &&
- pt->dst.sa.sa_family != AF_INET6))
- goto bad;
+#ifdef __FreeBSD__
+ CURVNET_SET(sc->sc_ifp->if_vnet);
+#endif
- s = spltdb();
- tdb = gettdb(pt->spi, &pt->dst, pt->sproto);
- if (tdb) {
- pt->rpl = ntohl(pt->rpl);
- pt->cur_bytes = betoh64(pt->cur_bytes);
+ if (sc->sc_bulk_tries++ < PFSYNC_MAX_BULKTRIES) {
+ /* Try again */
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulkfail_tmo, 5 * hz,
+ pfsync_bulk_fail, V_pfsyncif);
+#else
+ timeout_add_sec(&sc->sc_bulkfail_tmo, 5);
+#endif
+ pfsync_request_update(0, 0);
+ } else {
+ /* Pretend like the transfer was ok */
+ sc->sc_ureq_sent = 0;
+ sc->sc_bulk_tries = 0;
+#if NCARP > 0
+#ifdef notyet
+#ifdef __FreeBSD__
+ if (!sc->pfsync_sync_ok)
+#else
+ if (!pfsync_sync_ok)
+#endif
+ carp_group_demote_adj(&sc->sc_if, -1);
+#endif
+#endif
+#ifdef __FreeBSD__
+ sc->pfsync_sync_ok = 1;
+#else
+ pfsync_sync_ok = 1;
+#endif
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
+ printf("pfsync: failed to receive bulk update\n");
+ }
- /* Neither replay nor byte counter should ever decrease. */
- if (pt->rpl < tdb->tdb_rpl ||
- pt->cur_bytes < tdb->tdb_cur_bytes) {
- splx(s);
- goto bad;
- }
+#ifdef __FreeBSD__
+ CURVNET_RESTORE();
+#endif
+}
- tdb->tdb_rpl = pt->rpl;
- tdb->tdb_cur_bytes = pt->cur_bytes;
+void
+pfsync_send_plus(void *plus, size_t pluslen)
+{
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
+ struct pfsync_softc *sc = pfsyncif;
+#endif
+ int s;
+
+#ifdef __FreeBSD__
+ if (sc->sc_len + pluslen > sc->sc_ifp->if_mtu) {
+#else
+ if (sc->sc_len + pluslen > sc->sc_if.if_mtu) {
+#endif
+ s = splnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ pfsync_sendout();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ splx(s);
}
- splx(s);
- return;
- bad:
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync_insert: PFSYNC_ACT_TDB_UPD: "
- "invalid value\n");
- pfsyncstats.pfsyncs_badstate++;
- return;
+ sc->sc_plus = plus;
+ sc->sc_len += (sc->sc_pluslen = pluslen);
+
+ s = splnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ pfsync_sendout();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ splx(s);
}
-/* One of our local tdbs have been updated, need to sync rpl with others */
int
-pfsync_update_tdb(struct tdb *tdb, int output)
+pfsync_up(void)
{
- struct ifnet *ifp = NULL;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = V_pfsyncif;
+#else
struct pfsync_softc *sc = pfsyncif;
- struct pfsync_header *h;
- struct pfsync_tdb *pt = NULL;
- int s, i, ret;
-
- if (sc == NULL)
- return (0);
+#endif
#ifdef __FreeBSD__
- ifp = sc->sc_ifp;
+ if (sc == NULL || !ISSET(sc->sc_ifp->if_flags, IFF_DRV_RUNNING))
#else
- ifp = &sc->sc_if;
+ if (sc == NULL || !ISSET(sc->sc_if.if_flags, IFF_RUNNING))
#endif
- if (ifp->if_bpf == NULL && sc->sc_sync_ifp == NULL &&
+ return (0);
+
+ return (1);
+}
+
+int
+pfsync_state_in_use(struct pf_state *st)
+{
#ifdef __FreeBSD__
- sc->sc_sync_peer.s_addr == htonl(INADDR_PFSYNC_GROUP)) {
+ struct pfsync_softc *sc = V_pfsyncif;
#else
- sc->sc_sync_peer.s_addr == INADDR_PFSYNC_GROUP) {
+ struct pfsync_softc *sc = pfsyncif;
#endif
- /* Don't leave any stale pfsync packets hanging around. */
- if (sc->sc_mbuf_tdb != NULL) {
- m_freem(sc->sc_mbuf_tdb);
- sc->sc_mbuf_tdb = NULL;
- sc->sc_statep_tdb.t = NULL;
- }
+
+ if (sc == NULL)
return (0);
- }
+
+ if (st->sync_state != PFSYNC_S_NONE)
+ return (1);
+
+ if (sc->sc_bulk_next == NULL && sc->sc_bulk_last == NULL)
+ return (0);
+
+ return (1);
+}
+
+u_int pfsync_ints;
+u_int pfsync_tmos;
+
+void
+pfsync_timeout(void *arg)
+{
+#if defined(__FreeBSD__) && defined(VIMAGE)
+ struct pfsync_softc *sc = arg;
+#endif
+ int s;
#ifdef __FreeBSD__
- PF_ASSERT(MA_OWNED);
+ CURVNET_SET(sc->sc_ifp->if_vnet);
#endif
+
+ pfsync_tmos++;
+
s = splnet();
- if (sc->sc_mbuf_tdb == NULL) {
- if ((sc->sc_mbuf_tdb = pfsync_get_mbuf(sc, PFSYNC_ACT_TDB_UPD,
- (void *)&sc->sc_statep_tdb.t)) == NULL) {
- splx(s);
- return (ENOMEM);
- }
- h = mtod(sc->sc_mbuf_tdb, struct pfsync_header *);
- } else {
- h = mtod(sc->sc_mbuf_tdb, struct pfsync_header *);
- if (h->action != PFSYNC_ACT_TDB_UPD) {
- /*
- * XXX will never happen as long as there's
- * only one "TDB action".
- */
- pfsync_tdb_sendout(sc);
- sc->sc_mbuf_tdb = pfsync_get_mbuf(sc,
- PFSYNC_ACT_TDB_UPD, (void *)&sc->sc_statep_tdb.t);
- if (sc->sc_mbuf_tdb == NULL) {
- splx(s);
- return (ENOMEM);
- }
- h = mtod(sc->sc_mbuf_tdb, struct pfsync_header *);
- } else if (sc->sc_maxupdates) {
- /*
- * If it's an update, look in the packet to see if
- * we already have an update for the state.
- */
- struct pfsync_tdb *u =
- (void *)((char *)h + PFSYNC_HDRLEN);
-
- for (i = 0; !pt && i < h->count; i++) {
- if (tdb->tdb_spi == u->spi &&
- tdb->tdb_sproto == u->sproto &&
- !bcmp(&tdb->tdb_dst, &u->dst,
- SA_LEN(&u->dst.sa))) {
- pt = u;
- pt->updates++;
- }
- u++;
- }
- }
- }
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ pfsync_sendout();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ splx(s);
- if (pt == NULL) {
- /* not a "duplicate" update */
- pt = sc->sc_statep_tdb.t++;
- sc->sc_mbuf_tdb->m_pkthdr.len =
- sc->sc_mbuf_tdb->m_len += sizeof(struct pfsync_tdb);
- h->count++;
- bzero(pt, sizeof(*pt));
+#ifdef __FreeBSD__
+ CURVNET_RESTORE();
+#endif
+}
- pt->spi = tdb->tdb_spi;
- memcpy(&pt->dst, &tdb->tdb_dst, sizeof pt->dst);
- pt->sproto = tdb->tdb_sproto;
- }
+/* this is a softnet/netisr handler */
+void
+#ifdef __FreeBSD__
+pfsyncintr(void *arg)
+#else
+pfsyncintr(void)
+#endif
+{
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = arg;
+#endif
+ int s;
- /*
- * When a failover happens, the master's rpl is probably above
- * what we see here (we may be up to a second late), so
- * increase it a bit for outbound tdbs to manage most such
- * situations.
- *
- * For now, just add an offset that is likely to be larger
- * than the number of packets we can see in one second. The RFC
- * just says the next packet must have a higher seq value.
- *
- * XXX What is a good algorithm for this? We could use
- * a rate-determined increase, but to know it, we would have
- * to extend struct tdb.
- * XXX pt->rpl can wrap over MAXINT, but if so the real tdb
- * will soon be replaced anyway. For now, just don't handle
- * this edge case.
- */
-#define RPL_INCR 16384
- pt->rpl = htonl(tdb->tdb_rpl + (output ? RPL_INCR : 0));
- pt->cur_bytes = htobe64(tdb->tdb_cur_bytes);
+#ifdef __FreeBSD__
+ if (sc == NULL)
+ return;
- if (h->count == sc->sc_maxcount ||
- (sc->sc_maxupdates && (pt->updates >= sc->sc_maxupdates)))
- ret = pfsync_tdb_sendout(sc);
+ CURVNET_SET(sc->sc_ifp->if_vnet);
+#endif
+ pfsync_ints++;
+ s = splnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ pfsync_sendout();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
- return (ret);
+
+#ifdef __FreeBSD__
+ CURVNET_RESTORE();
+#endif
+}
+
+int
+pfsync_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
+ size_t newlen)
+{
+
+#ifdef notyet
+ /* All sysctl names at this level are terminal. */
+ if (namelen != 1)
+ return (ENOTDIR);
+
+ switch (name[0]) {
+ case PFSYNCCTL_STATS:
+ if (newp != NULL)
+ return (EPERM);
+ return (sysctl_struct(oldp, oldlenp, newp, newlen,
+ &V_pfsyncstats, sizeof(V_pfsyncstats)));
+ }
+#endif
+ return (ENOPROTOOPT);
}
-#endif /* PFSYNC_TDB */
#ifdef __FreeBSD__
void
@@ -2243,18 +3305,15 @@ pfsync_ifdetach(void *arg, struct ifnet *ifp)
struct pfsync_softc *sc = (struct pfsync_softc *)arg;
struct ip_moptions *imo;
- if (sc == NULL || sc->sc_sync_ifp != ifp)
+ if (sc == NULL || sc->sc_sync_if != ifp)
return; /* not for us; unlocked read */
+ CURVNET_SET(sc->sc_ifp->if_vnet);
+
PF_LOCK();
/* Deal with a member interface going away from under us. */
- sc->sc_sync_ifp = NULL;
- if (sc->sc_mbuf_net != NULL) {
- m_freem(sc->sc_mbuf_net);
- sc->sc_mbuf_net = NULL;
- sc->sc_statep_net.s = NULL;
- }
+ sc->sc_sync_if = NULL;
imo = &sc->sc_imo;
if (imo->imo_num_memberships > 0) {
KASSERT(imo->imo_num_memberships == 1,
@@ -2272,29 +3331,73 @@ pfsync_ifdetach(void *arg, struct ifnet *ifp)
}
PF_UNLOCK();
+
+ CURVNET_RESTORE();
}
-void
-pfsync_senddef(void *arg, __unused int pending)
+static int
+vnet_pfsync_init(const void *unused)
{
- struct pfsync_softc *sc = (struct pfsync_softc *)arg;
- struct mbuf *m;
+ int error = 0;
- for(;;) {
- IF_DEQUEUE(&sc->sc_ifq, m);
- if (m == NULL)
- break;
- /* Deal with a member interface going away from under us. */
- if (sc->sc_sync_ifp == NULL) {
- pfsyncstats.pfsyncs_oerrors++;
- m_freem(m);
- continue;
- }
- if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
- pfsyncstats.pfsyncs_oerrors++;
- }
+ pfsyncattach(0);
+
+ error = swi_add(NULL, "pfsync", pfsyncintr, V_pfsyncif,
+ SWI_NET, INTR_MPSAFE, &pfsync_swi.pfsync_swi_cookie);
+ if (error)
+ panic("%s: swi_add %d", __func__, error);
+
+ pfsync_state_import_ptr = pfsync_state_import;
+ pfsync_up_ptr = pfsync_up;
+ pfsync_insert_state_ptr = pfsync_insert_state;
+ pfsync_update_state_ptr = pfsync_update_state;
+ pfsync_delete_state_ptr = pfsync_delete_state;
+ pfsync_clear_states_ptr = pfsync_clear_states;
+ pfsync_state_in_use_ptr = pfsync_state_in_use;
+ pfsync_defer_ptr = pfsync_defer;
+
+ return (0);
+}
+
+static int
+vnet_pfsync_uninit(const void *unused)
+{
+
+ swi_remove(pfsync_swi.pfsync_swi_cookie);
+
+ pfsync_state_import_ptr = NULL;
+ pfsync_up_ptr = NULL;
+ pfsync_insert_state_ptr = NULL;
+ pfsync_update_state_ptr = NULL;
+ pfsync_delete_state_ptr = NULL;
+ pfsync_clear_states_ptr = NULL;
+ pfsync_state_in_use_ptr = NULL;
+ pfsync_defer_ptr = NULL;
+
+ if_clone_detach(&pfsync_cloner);
+
+ return (0);
}
+/* Define startup order. */
+#define PFSYNC_SYSINIT_ORDER SI_SUB_PROTO_BEGIN
+#define PFSYNC_MODEVENT_ORDER (SI_ORDER_FIRST) /* On boot slot in here. */
+#define PFSYNC_VNET_ORDER (PFSYNC_MODEVENT_ORDER + 2) /* Later still. */
+
+/*
+ * Starting up.
+ * VNET_SYSINIT is called for each existing vnet and each new vnet.
+ */
+VNET_SYSINIT(vnet_pfsync_init, PFSYNC_SYSINIT_ORDER, PFSYNC_VNET_ORDER,
+ vnet_pfsync_init, NULL);
+
+/*
+ * Closing up shop. These are done in REVERSE ORDER,
+ * Not called on reboot.
+ * VNET_SYSUNINIT is called for each exiting vnet as it exits.
+ */
+VNET_SYSUNINIT(vnet_pfsync_uninit, PFSYNC_SYSINIT_ORDER, PFSYNC_VNET_ORDER,
+ vnet_pfsync_uninit, NULL);
static int
pfsync_modevent(module_t mod, int type, void *data)
{
@@ -2302,10 +3405,14 @@ pfsync_modevent(module_t mod, int type, void *data)
switch (type) {
case MOD_LOAD:
+#ifndef __FreeBSD__
pfsyncattach(0);
+#endif
break;
case MOD_UNLOAD:
+#ifndef __FreeBSD__
if_clone_detach(&pfsync_cloner);
+#endif
break;
default:
error = EINVAL;
@@ -2325,5 +3432,5 @@ static moduledata_t pfsync_mod = {
DECLARE_MODULE(pfsync, pfsync_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY);
MODULE_VERSION(pfsync, PFSYNC_MODVER);
-MODULE_DEPEND(pflog, pf, PF_MODVER, PF_MODVER, PF_MODVER);
+MODULE_DEPEND(pfsync, pf, PF_MODVER, PF_MODVER, PF_MODVER);
#endif /* __FreeBSD__ */
diff --git a/sys/contrib/pf/net/if_pfsync.h b/sys/contrib/pf/net/if_pfsync.h
index f306610..17259b7 100644
--- a/sys/contrib/pf/net/if_pfsync.h
+++ b/sys/contrib/pf/net/if_pfsync.h
@@ -1,5 +1,4 @@
-/* $FreeBSD$ */
-/* $OpenBSD: if_pfsync.h,v 1.30 2006/10/31 14:49:01 henning Exp $ */
+/* $OpenBSD: if_pfsync.h,v 1.35 2008/06/29 08:42:15 mcbride Exp $ */
/*
* Copyright (c) 2001 Michael Shalayeff
@@ -27,227 +26,217 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
+/*
+ * Copyright (c) 2008 David Gwynne <dlg@openbsd.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.
+ */
+
#ifndef _NET_IF_PFSYNC_H_
-#define _NET_IF_PFSYNC_H_
+#define _NET_IF_PFSYNC_H_
+#define PFSYNC_VERSION 5
+#define PFSYNC_DFLTTL 255
-#define PFSYNC_ID_LEN sizeof(u_int64_t)
+#define PFSYNC_ACT_CLR 0 /* clear all states */
+#define PFSYNC_ACT_INS 1 /* insert state */
+#define PFSYNC_ACT_INS_ACK 2 /* ack of insterted state */
+#define PFSYNC_ACT_UPD 3 /* update state */
+#define PFSYNC_ACT_UPD_C 4 /* "compressed" update state */
+#define PFSYNC_ACT_UPD_REQ 5 /* request "uncompressed" state */
+#define PFSYNC_ACT_DEL 6 /* delete state */
+#define PFSYNC_ACT_DEL_C 7 /* "compressed" delete state */
+#define PFSYNC_ACT_INS_F 8 /* insert fragment */
+#define PFSYNC_ACT_DEL_F 9 /* delete fragments */
+#define PFSYNC_ACT_BUS 10 /* bulk update status */
+#define PFSYNC_ACT_TDB 11 /* TDB replay counter update */
+#define PFSYNC_ACT_EOF 12 /* end of frame */
+#define PFSYNC_ACT_MAX 13
+
+#define PFSYNC_ACTIONS "CLR ST", \
+ "INS ST", \
+ "INS ST ACK", \
+ "UPD ST", \
+ "UPD ST COMP", \
+ "UPD ST REQ", \
+ "DEL ST", \
+ "DEL ST COMP", \
+ "INS FR", \
+ "DEL FR", \
+ "BULK UPD STAT", \
+ "TDB UPD", \
+ "EOF"
+
+#define PFSYNC_HMAC_LEN 20
-struct pfsync_state_scrub {
- u_int16_t pfss_flags;
- u_int8_t pfss_ttl; /* stashed TTL */
-#define PFSYNC_SCRUB_FLAG_VALID 0x01
- u_int8_t scrub_flag;
- u_int32_t pfss_ts_mod; /* timestamp modulation */
-} __packed;
+/*
+ * A pfsync frame is built from a header followed by several sections which
+ * are all prefixed with their own subheaders. Frames must be terminated with
+ * an EOF subheader.
+ *
+ * | ... |
+ * | IP header |
+ * +============================+
+ * | pfsync_header |
+ * +----------------------------+
+ * | pfsync_subheader |
+ * +----------------------------+
+ * | first action fields |
+ * | ... |
+ * +----------------------------+
+ * | pfsync_subheader |
+ * +----------------------------+
+ * | second action fields |
+ * | ... |
+ * +----------------------------+
+ * | EOF pfsync_subheader |
+ * +----------------------------+
+ * | HMAC |
+ * +============================+
+ */
-struct pfsync_state_host {
- struct pf_addr addr;
- u_int16_t port;
- u_int16_t pad[3];
+/*
+ * Frame header
+ */
+
+struct pfsync_header {
+ u_int8_t version;
+ u_int8_t _pad;
+ u_int16_t len;
+ u_int8_t pfcksum[PF_MD5_DIGEST_LENGTH];
} __packed;
-struct pfsync_state_peer {
- struct pfsync_state_scrub scrub; /* state is scrubbed */
- u_int32_t seqlo; /* Max sequence number sent */
- u_int32_t seqhi; /* Max the other end ACKd + win */
- u_int32_t seqdiff; /* Sequence number modulator */
- u_int16_t max_win; /* largest window (pre scaling) */
- u_int16_t mss; /* Maximum segment size option */
- u_int8_t state; /* active state level */
- u_int8_t wscale; /* window scaling factor */
- u_int8_t pad[6];
+/*
+ * Frame region subheader
+ */
+
+struct pfsync_subheader {
+ u_int8_t action;
+ u_int8_t _pad;
+ u_int16_t count;
} __packed;
-struct pfsync_state {
- u_int32_t id[2];
- char ifname[IFNAMSIZ];
- struct pfsync_state_host lan;
- struct pfsync_state_host gwy;
- struct pfsync_state_host ext;
- struct pfsync_state_peer src;
- struct pfsync_state_peer dst;
- struct pf_addr rt_addr;
- u_int32_t rule;
- u_int32_t anchor;
- u_int32_t nat_rule;
- u_int32_t creation;
- u_int32_t expire;
- u_int32_t packets[2][2];
- u_int32_t bytes[2][2];
- u_int32_t creatorid;
- sa_family_t af;
- u_int8_t proto;
- u_int8_t direction;
- u_int8_t log;
- u_int8_t state_flags;
- u_int8_t timeout;
- u_int8_t sync_flags;
- u_int8_t updates;
+/*
+ * CLR
+ */
+
+struct pfsync_clr {
+ char ifname[IFNAMSIZ];
+ u_int32_t creatorid;
} __packed;
-#define PFSYNC_FLAG_COMPRESS 0x01
-#define PFSYNC_FLAG_STALE 0x02
+/*
+ * INS, UPD, DEL
+ */
+
+/* these use struct pfsync_state in pfvar.h */
-#ifdef PFSYNC_TDB
-struct pfsync_tdb {
- u_int32_t spi;
- union sockaddr_union dst;
- u_int32_t rpl;
- u_int64_t cur_bytes;
- u_int8_t sproto;
- u_int8_t updates;
- u_int8_t pad[2];
+/*
+ * INS_ACK
+ */
+
+struct pfsync_ins_ack {
+ u_int64_t id;
+ u_int32_t creatorid;
} __packed;
-#endif
-struct pfsync_state_upd {
- u_int32_t id[2];
+/*
+ * UPD_C
+ */
+
+struct pfsync_upd_c {
+ u_int64_t id;
struct pfsync_state_peer src;
struct pfsync_state_peer dst;
- u_int32_t creatorid;
- u_int32_t expire;
- u_int8_t timeout;
- u_int8_t updates;
- u_int8_t pad[6];
+ u_int32_t creatorid;
+ u_int32_t expire;
+ u_int8_t timeout;
+ u_int8_t _pad[3];
} __packed;
-struct pfsync_state_del {
- u_int32_t id[2];
- u_int32_t creatorid;
- struct {
- u_int8_t state;
- } src;
- struct {
- u_int8_t state;
- } dst;
- u_int8_t pad[2];
-} __packed;
+/*
+ * UPD_REQ
+ */
-struct pfsync_state_upd_req {
- u_int32_t id[2];
- u_int32_t creatorid;
- u_int32_t pad;
+struct pfsync_upd_req {
+ u_int64_t id;
+ u_int32_t creatorid;
} __packed;
-struct pfsync_state_clr {
- char ifname[IFNAMSIZ];
- u_int32_t creatorid;
- u_int32_t pad;
-} __packed;
+/*
+ * DEL_C
+ */
-struct pfsync_state_bus {
- u_int32_t creatorid;
- u_int32_t endtime;
- u_int8_t status;
-#define PFSYNC_BUS_START 1
-#define PFSYNC_BUS_END 2
- u_int8_t pad[7];
+struct pfsync_del_c {
+ u_int64_t id;
+ u_int32_t creatorid;
} __packed;
-#ifdef _KERNEL
-
-union sc_statep {
- struct pfsync_state *s;
- struct pfsync_state_upd *u;
- struct pfsync_state_del *d;
- struct pfsync_state_clr *c;
- struct pfsync_state_bus *b;
- struct pfsync_state_upd_req *r;
-};
+/*
+ * INS_F, DEL_F
+ */
-#ifdef PFSYNC_TDB
-union sc_tdb_statep {
- struct pfsync_tdb *t;
-};
-#endif
+/* not implemented (yet) */
-extern int pfsync_sync_ok;
+/*
+ * BUS
+ */
-struct pfsync_softc {
-#ifdef __FreeBSD__
- struct ifnet *sc_ifp;
-#else
- struct ifnet sc_if;
-#endif
- struct ifnet *sc_sync_ifp;
+struct pfsync_bus {
+ u_int32_t creatorid;
+ u_int32_t endtime;
+ u_int8_t status;
+#define PFSYNC_BUS_START 1
+#define PFSYNC_BUS_END 2
+ u_int8_t _pad[3];
+} __packed;
- struct ip_moptions sc_imo;
-#ifdef __FreeBSD__
- struct callout sc_tmo;
-#ifdef PFSYNC_TDB
- struct callout sc_tdb_tmo;
-#endif
- struct callout sc_bulk_tmo;
- struct callout sc_bulkfail_tmo;
-#else
- struct timeout sc_tmo;
- struct timeout sc_tdb_tmo;
- struct timeout sc_bulk_tmo;
- struct timeout sc_bulkfail_tmo;
-#endif
- struct in_addr sc_sync_peer;
- struct in_addr sc_sendaddr;
- struct mbuf *sc_mbuf; /* current cumulative mbuf */
- struct mbuf *sc_mbuf_net; /* current cumulative mbuf */
-#ifdef PFSYNC_TDB
- struct mbuf *sc_mbuf_tdb; /* dito for TDB updates */
-#endif
-#ifdef __FreeBSD__
- struct ifqueue sc_ifq;
- struct task sc_send_task;
-#endif
- union sc_statep sc_statep;
- union sc_statep sc_statep_net;
-#ifdef PFSYNC_TDB
- union sc_tdb_statep sc_statep_tdb;
-#endif
- u_int32_t sc_ureq_received;
- u_int32_t sc_ureq_sent;
- struct pf_state *sc_bulk_send_next;
- struct pf_state *sc_bulk_terminator;
- int sc_bulk_tries;
- int sc_maxcount; /* number of states in mtu */
- int sc_maxupdates; /* number of updates/state */
-#ifdef __FreeBSD__
- eventhandler_tag sc_detachtag;
-#endif
-};
+/*
+ * TDB
+ */
-extern struct pfsync_softc *pfsyncif;
-#endif
+struct pfsync_tdb {
+ u_int32_t spi;
+ union sockaddr_union dst;
+ u_int32_t rpl;
+ u_int64_t cur_bytes;
+ u_int8_t sproto;
+ u_int8_t updates;
+ u_int8_t _pad[2];
+} __packed;
+/*
+ * EOF
+ */
-struct pfsync_header {
- u_int8_t version;
-#define PFSYNC_VERSION 3
- u_int8_t af;
- u_int8_t action;
-#define PFSYNC_ACT_CLR 0 /* clear all states */
-#define PFSYNC_ACT_INS 1 /* insert state */
-#define PFSYNC_ACT_UPD 2 /* update state */
-#define PFSYNC_ACT_DEL 3 /* delete state */
-#define PFSYNC_ACT_UPD_C 4 /* "compressed" state update */
-#define PFSYNC_ACT_DEL_C 5 /* "compressed" state delete */
-#define PFSYNC_ACT_INS_F 6 /* insert fragment */
-#define PFSYNC_ACT_DEL_F 7 /* delete fragments */
-#define PFSYNC_ACT_UREQ 8 /* request "uncompressed" state */
-#define PFSYNC_ACT_BUS 9 /* Bulk Update Status */
-#define PFSYNC_ACT_TDB_UPD 10 /* TDB replay counter update */
-#define PFSYNC_ACT_MAX 11
- u_int8_t count;
- u_int8_t pf_chksum[PF_MD5_DIGEST_LENGTH];
+struct pfsync_eof {
+ u_int8_t hmac[PFSYNC_HMAC_LEN];
} __packed;
-#define PFSYNC_BULKPACKETS 1 /* # of packets per timeout */
-#define PFSYNC_MAX_BULKTRIES 12
-#define PFSYNC_HDRLEN sizeof(struct pfsync_header)
-#define PFSYNC_ACTIONS \
- "CLR ST", "INS ST", "UPD ST", "DEL ST", \
- "UPD ST COMP", "DEL ST COMP", "INS FR", "DEL FR", \
- "UPD REQ", "BLK UPD STAT", "TDB UPD"
+#define PFSYNC_HDRLEN sizeof(struct pfsync_header)
+
-#define PFSYNC_DFLTTL 255
+
+/*
+ * Names for PFSYNC sysctl objects
+ */
+#define PFSYNCCTL_STATS 1 /* PFSYNC stats */
+#define PFSYNCCTL_MAXID 2
+
+#define PFSYNCCTL_NAMES { \
+ { 0, 0 }, \
+ { "stats", CTLTYPE_STRUCT }, \
+}
struct pfsyncstats {
u_int64_t pfsyncs_ipackets; /* total input packets, IPv4 */
@@ -280,96 +269,56 @@ struct pfsyncreq {
};
#ifdef __FreeBSD__
-#define SIOCSETPFSYNC _IOW('i', 247, struct ifreq)
-#define SIOCGETPFSYNC _IOWR('i', 248, struct ifreq)
+#define SIOCSETPFSYNC _IOW('i', 247, struct ifreq)
+#define SIOCGETPFSYNC _IOWR('i', 248, struct ifreq)
#endif
-#define pf_state_peer_hton(s,d) do { \
- (d)->seqlo = htonl((s)->seqlo); \
- (d)->seqhi = htonl((s)->seqhi); \
- (d)->seqdiff = htonl((s)->seqdiff); \
- (d)->max_win = htons((s)->max_win); \
- (d)->mss = htons((s)->mss); \
- (d)->state = (s)->state; \
- (d)->wscale = (s)->wscale; \
- if ((s)->scrub) { \
- (d)->scrub.pfss_flags = \
- htons((s)->scrub->pfss_flags & PFSS_TIMESTAMP); \
- (d)->scrub.pfss_ttl = (s)->scrub->pfss_ttl; \
- (d)->scrub.pfss_ts_mod = htonl((s)->scrub->pfss_ts_mod);\
- (d)->scrub.scrub_flag = PFSYNC_SCRUB_FLAG_VALID; \
- } \
-} while (0)
-
-#define pf_state_peer_ntoh(s,d) do { \
- (d)->seqlo = ntohl((s)->seqlo); \
- (d)->seqhi = ntohl((s)->seqhi); \
- (d)->seqdiff = ntohl((s)->seqdiff); \
- (d)->max_win = ntohs((s)->max_win); \
- (d)->mss = ntohs((s)->mss); \
- (d)->state = (s)->state; \
- (d)->wscale = (s)->wscale; \
- if ((s)->scrub.scrub_flag == PFSYNC_SCRUB_FLAG_VALID && \
- (d)->scrub != NULL) { \
- (d)->scrub->pfss_flags = \
- ntohs((s)->scrub.pfss_flags) & PFSS_TIMESTAMP; \
- (d)->scrub->pfss_ttl = (s)->scrub.pfss_ttl; \
- (d)->scrub->pfss_ts_mod = ntohl((s)->scrub.pfss_ts_mod);\
- } \
-} while (0)
-
-#define pf_state_host_hton(s,d) do { \
- bcopy(&(s)->addr, &(d)->addr, sizeof((d)->addr)); \
- (d)->port = (s)->port; \
-} while (0)
-
-#define pf_state_host_ntoh(s,d) do { \
- bcopy(&(s)->addr, &(d)->addr, sizeof((d)->addr)); \
- (d)->port = (s)->port; \
-} while (0)
-
-#define pf_state_counter_hton(s,d) do { \
- d[0] = htonl((s>>32)&0xffffffff); \
- d[1] = htonl(s&0xffffffff); \
-} while (0)
-
-#define pf_state_counter_ntoh(s,d) do { \
- d = ntohl(s[0]); \
- d = d<<32; \
- d += ntohl(s[1]); \
-} while (0)
-
#ifdef _KERNEL
+
+/*
+ * this shows where a pf state is with respect to the syncing.
+ */
+#define PFSYNC_S_INS 0x00
+#define PFSYNC_S_IACK 0x01
+#define PFSYNC_S_UPD 0x02
+#define PFSYNC_S_UPD_C 0x03
+#define PFSYNC_S_DEL 0x04
+#define PFSYNC_S_COUNT 0x05
+
+#define PFSYNC_S_DEFER 0xfe
+#define PFSYNC_S_NONE 0xff
+
#ifdef __FreeBSD__
-void pfsync_input(struct mbuf *, __unused int);
+void pfsync_input(struct mbuf *, __unused int);
#else
-void pfsync_input(struct mbuf *, ...);
+void pfsync_input(struct mbuf *, ...);
#endif
-int pfsync_clear_states(u_int32_t, char *);
-int pfsync_pack_state(u_int8_t, struct pf_state *, int);
-#define pfsync_insert_state(st) do { \
- if ((st->rule.ptr->rule_flag & PFRULE_NOSYNC) || \
- (st->proto == IPPROTO_PFSYNC)) \
- st->sync_flags |= PFSTATE_NOSYNC; \
- else if (!st->sync_flags) \
- pfsync_pack_state(PFSYNC_ACT_INS, (st), \
- PFSYNC_FLAG_COMPRESS); \
- st->sync_flags &= ~PFSTATE_FROMSYNC; \
-} while (0)
-#define pfsync_update_state(st) do { \
- if (!st->sync_flags) \
- pfsync_pack_state(PFSYNC_ACT_UPD, (st), \
- PFSYNC_FLAG_COMPRESS); \
- st->sync_flags &= ~PFSTATE_FROMSYNC; \
-} while (0)
-#define pfsync_delete_state(st) do { \
- if (!st->sync_flags) \
- pfsync_pack_state(PFSYNC_ACT_DEL, (st), \
- PFSYNC_FLAG_COMPRESS); \
-} while (0)
-#ifdef PFSYNC_TDB
-int pfsync_update_tdb(struct tdb *, int);
+int pfsync_sysctl(int *, u_int, void *, size_t *,
+ void *, size_t);
+
+#define PFSYNC_SI_IOCTL 0x01
+#define PFSYNC_SI_CKSUM 0x02
+#define PFSYNC_SI_ACK 0x04
+int pfsync_state_import(struct pfsync_state *, u_int8_t);
+#ifndef __FreeBSD__
+void pfsync_state_export(struct pfsync_state *,
+ struct pf_state *);
#endif
+
+void pfsync_insert_state(struct pf_state *);
+void pfsync_update_state(struct pf_state *);
+void pfsync_delete_state(struct pf_state *);
+void pfsync_clear_states(u_int32_t, const char *);
+
+#ifdef notyet
+void pfsync_update_tdb(struct tdb *, int);
+void pfsync_delete_tdb(struct tdb *);
+#endif
+
+int pfsync_defer(struct pf_state *, struct mbuf *);
+
+int pfsync_up(void);
+int pfsync_state_in_use(struct pf_state *);
#endif
#endif /* _NET_IF_PFSYNC_H_ */
diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c
index 135d734..5efd651 100644
--- a/sys/contrib/pf/net/pf.c
+++ b/sys/contrib/pf/net/pf.c
@@ -1,9 +1,8 @@
-/* $OpenBSD: pf.c,v 1.527 2007/02/22 15:23:23 pyr Exp $ */
-/* add: $OpenBSD: pf.c,v 1.559 2007/09/18 18:45:59 markus Exp $ */
+/* $OpenBSD: pf.c,v 1.634 2009/02/27 12:37:45 henning Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
- * Copyright (c) 2002,2003 Henning Brauer
+ * Copyright (c) 2002 - 2008 Henning Brauer
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -66,10 +65,17 @@ __FBSDID("$FreeBSD$");
#define NPFSYNC 0
#endif
+#ifdef DEV_PFLOW
+#define NPFLOW DEV_PFLOW
+#else
+#define NPFLOW 0
+#endif
+
#else
#include "bpfilter.h"
#include "pflog.h"
#include "pfsync.h"
+#include "pflow.h"
#endif
#include <sys/param.h>
@@ -81,8 +87,10 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/time.h>
#ifdef __FreeBSD__
+#include <sys/random.h>
#include <sys/sysctl.h>
#include <sys/endian.h>
+#define betoh64 be64toh
#else
#include <sys/pool.h>
#endif
@@ -95,11 +103,21 @@ __FBSDID("$FreeBSD$");
#include <sys/rwlock.h>
#endif
+#ifdef __FreeBSD__
+#include <sys/md5.h>
+#else
+#include <crypto/md5.h>
+#endif
+
#include <net/if.h>
#include <net/if_types.h>
#include <net/bpf.h>
#include <net/route.h>
-#ifndef __FreeBSD__
+#ifdef __FreeBSD__
+#ifdef RADIX_MPATH
+#include <net/radix_mpath.h>
+#endif
+#else
#include <net/radix_mpath.h>
#endif
@@ -118,16 +136,18 @@ __FBSDID("$FreeBSD$");
#include <netinet/udp_var.h>
#include <netinet/icmp_var.h>
#include <netinet/if_ether.h>
+#ifdef __FreeBSD__
+#include <netinet/ip_fw.h>
+#include <netinet/ipfw/ip_fw_private.h> /* XXX: only for DIR_IN/DIR_OUT */
+#endif
#ifndef __FreeBSD__
#include <dev/rndvar.h>
#endif
#include <net/pfvar.h>
#include <net/if_pflog.h>
-
-#if NPFSYNC > 0
+#include <net/if_pflow.h>
#include <net/if_pfsync.h>
-#endif /* NPFSYNC > 0 */
#ifdef INET6
#include <netinet/ip6.h>
@@ -147,15 +167,61 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
extern int ip_optcopy(struct ip *, struct ip *);
-extern int debug_pfugidhack;
#endif
-#define DPFPRINTF(n, x) if (pf_status.debug >= (n)) printf x
+#ifdef __FreeBSD__
+#define DPFPRINTF(n, x) if (V_pf_status.debug >= (n)) printf x
+#else
+#define DPFPRINTF(n, x) if (pf_status.debug >= (n)) printf x
+#endif
/*
* Global variables
*/
+/* state tables */
+#ifdef __FreeBSD__
+VNET_DEFINE(struct pf_state_tree, pf_statetbl);
+
+VNET_DEFINE(struct pf_altqqueue, pf_altqs[2]);
+VNET_DEFINE(struct pf_palist, pf_pabuf);
+VNET_DEFINE(struct pf_altqqueue *, pf_altqs_active);
+VNET_DEFINE(struct pf_altqqueue *, pf_altqs_inactive);
+VNET_DEFINE(struct pf_status, pf_status);
+
+VNET_DEFINE(u_int32_t, ticket_altqs_active);
+VNET_DEFINE(u_int32_t, ticket_altqs_inactive);
+VNET_DEFINE(int, altqs_inactive_open);
+VNET_DEFINE(u_int32_t, ticket_pabuf);
+
+VNET_DEFINE(MD5_CTX, pf_tcp_secret_ctx);
+#define V_pf_tcp_secret_ctx VNET(pf_tcp_secret_ctx)
+VNET_DEFINE(u_char, pf_tcp_secret[16]);
+#define V_pf_tcp_secret VNET(pf_tcp_secret)
+VNET_DEFINE(int, pf_tcp_secret_init);
+#define V_pf_tcp_secret_init VNET(pf_tcp_secret_init)
+VNET_DEFINE(int, pf_tcp_iss_off);
+#define V_pf_tcp_iss_off VNET(pf_tcp_iss_off)
+
+struct pf_anchor_stackframe {
+ struct pf_ruleset *rs;
+ struct pf_rule *r;
+ struct pf_anchor_node *parent;
+ struct pf_anchor *child;
+};
+VNET_DEFINE(struct pf_anchor_stackframe, pf_anchor_stack[64]);
+#define V_pf_anchor_stack VNET(pf_anchor_stack)
+
+VNET_DEFINE(uma_zone_t, pf_src_tree_pl);
+VNET_DEFINE(uma_zone_t, pf_rule_pl);
+VNET_DEFINE(uma_zone_t, pf_pooladdr_pl);
+VNET_DEFINE(uma_zone_t, pf_state_pl);
+VNET_DEFINE(uma_zone_t, pf_state_key_pl);
+VNET_DEFINE(uma_zone_t, pf_state_item_pl);
+VNET_DEFINE(uma_zone_t, pf_altq_pl);
+#else
+struct pf_state_tree pf_statetbl;
+
struct pf_altqqueue pf_altqs[2];
struct pf_palist pf_pabuf;
struct pf_altqqueue *pf_altqs_active;
@@ -167,6 +233,11 @@ u_int32_t ticket_altqs_inactive;
int altqs_inactive_open;
u_int32_t ticket_pabuf;
+MD5_CTX pf_tcp_secret_ctx;
+u_char pf_tcp_secret[16];
+int pf_tcp_secret_init;
+int pf_tcp_iss_off;
+
struct pf_anchor_stackframe {
struct pf_ruleset *rs;
struct pf_rule *r;
@@ -174,16 +245,11 @@ struct pf_anchor_stackframe {
struct pf_anchor *child;
} pf_anchor_stack[64];
-#ifdef __FreeBSD__
-uma_zone_t pf_src_tree_pl, pf_rule_pl;
-uma_zone_t pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
-#else
-struct pool pf_src_tree_pl, pf_rule_pl;
-struct pool pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
+struct pool pf_src_tree_pl, pf_rule_pl, pf_pooladdr_pl;
+struct pool pf_state_pl, pf_state_key_pl, pf_state_item_pl;
+struct pool pf_altq_pl;
#endif
-void pf_print_host(struct pf_addr *, u_int16_t, u_int8_t);
-
void pf_init_threshold(struct pf_threshold *, u_int32_t,
u_int32_t);
void pf_add_threshold(struct pf_threshold *);
@@ -212,27 +278,12 @@ void pf_send_tcp(const struct pf_rule *, sa_family_t,
u_int16_t, u_int16_t, u_int32_t, u_int32_t,
u_int8_t, u_int16_t, u_int16_t, u_int8_t, int,
u_int16_t, struct ether_header *, struct ifnet *);
-void pf_send_icmp(struct mbuf *, u_int8_t, u_int8_t,
+static void pf_send_icmp(struct mbuf *, u_int8_t, u_int8_t,
sa_family_t, struct pf_rule *);
-struct pf_rule *pf_match_translation(struct pf_pdesc *, struct mbuf *,
- int, int, struct pfi_kif *,
- struct pf_addr *, u_int16_t, struct pf_addr *,
- u_int16_t, int);
-struct pf_rule *pf_get_translation(struct pf_pdesc *, struct mbuf *,
- int, int, struct pfi_kif *, struct pf_src_node **,
- struct pf_addr *, u_int16_t,
- struct pf_addr *, u_int16_t,
- struct pf_addr *, u_int16_t *);
-int pf_test_tcp(struct pf_rule **, struct pf_state **,
- int, struct pfi_kif *, struct mbuf *, int,
- void *, struct pf_pdesc *, struct pf_rule **,
-#ifdef __FreeBSD__
- struct pf_ruleset **, struct ifqueue *,
- struct inpcb *);
-#else
- struct pf_ruleset **, struct ifqueue *);
-#endif
-int pf_test_udp(struct pf_rule **, struct pf_state **,
+void pf_detach_state(struct pf_state *);
+void pf_state_key_detach(struct pf_state *, int);
+u_int32_t pf_tcp_iss(struct pf_pdesc *);
+int pf_test_rule(struct pf_rule **, struct pf_state **,
int, struct pfi_kif *, struct mbuf *, int,
void *, struct pf_pdesc *, struct pf_rule **,
#ifdef __FreeBSD__
@@ -241,14 +292,14 @@ int pf_test_udp(struct pf_rule **, struct pf_state **,
#else
struct pf_ruleset **, struct ifqueue *);
#endif
-int pf_test_icmp(struct pf_rule **, struct pf_state **,
- int, struct pfi_kif *, struct mbuf *, int,
- void *, struct pf_pdesc *, struct pf_rule **,
- struct pf_ruleset **, struct ifqueue *);
-int pf_test_other(struct pf_rule **, struct pf_state **,
- int, struct pfi_kif *, struct mbuf *, int, void *,
- struct pf_pdesc *, struct pf_rule **,
- struct pf_ruleset **, struct ifqueue *);
+static __inline int pf_create_state(struct pf_rule *, struct pf_rule *,
+ struct pf_rule *, struct pf_pdesc *,
+ struct pf_src_node *, struct pf_state_key *,
+ struct pf_state_key *, struct pf_state_key *,
+ struct pf_state_key *, struct mbuf *, int,
+ u_int16_t, u_int16_t, int *, struct pfi_kif *,
+ struct pf_state **, int, u_int16_t, u_int16_t,
+ int);
int pf_test_fragment(struct pf_rule **, int,
struct pfi_kif *, struct mbuf *, void *,
struct pf_pdesc *, struct pf_rule **,
@@ -257,7 +308,7 @@ int pf_tcp_track_full(struct pf_state_peer *,
struct pf_state_peer *, struct pf_state **,
struct pfi_kif *, struct mbuf *, int,
struct pf_pdesc *, u_short *, int *);
-int pf_tcp_track_sloppy(struct pf_state_peer *,
+int pf_tcp_track_sloppy(struct pf_state_peer *,
struct pf_state_peer *, struct pf_state **,
struct pf_pdesc *, u_short *);
int pf_test_state_tcp(struct pf_state **, int,
@@ -270,30 +321,14 @@ int pf_test_state_icmp(struct pf_state **, int,
struct pfi_kif *, struct mbuf *, int,
void *, struct pf_pdesc *, u_short *);
int pf_test_state_other(struct pf_state **, int,
- struct pfi_kif *, struct pf_pdesc *);
-int pf_match_tag(struct mbuf *, struct pf_rule *,
- struct pf_mtag *, int *);
-int pf_step_out_of_anchor(int *, struct pf_ruleset **,
- int, struct pf_rule **, struct pf_rule **,
- int *);
-void pf_hash(struct pf_addr *, struct pf_addr *,
- struct pf_poolhashkey *, sa_family_t);
-int pf_map_addr(u_int8_t, struct pf_rule *,
- struct pf_addr *, struct pf_addr *,
- struct pf_addr *, struct pf_src_node **);
-int pf_get_sport(sa_family_t, u_int8_t, struct pf_rule *,
- struct pf_addr *, struct pf_addr *, u_int16_t,
- struct pf_addr *, u_int16_t*, u_int16_t, u_int16_t,
- struct pf_src_node **);
+ struct pfi_kif *, struct mbuf *, struct pf_pdesc *);
void pf_route(struct mbuf **, struct pf_rule *, int,
struct ifnet *, struct pf_state *,
struct pf_pdesc *);
void pf_route6(struct mbuf **, struct pf_rule *, int,
struct ifnet *, struct pf_state *,
struct pf_pdesc *);
-#ifdef __FreeBSD__
-/* XXX: import */
-#else
+#ifndef __FreeBSD__
int pf_socket_lookup(int, struct pf_pdesc *);
#endif
u_int8_t pf_get_wscale(struct mbuf *, int, u_int16_t,
@@ -306,19 +341,32 @@ void pf_set_rt_ifp(struct pf_state *,
struct pf_addr *);
int pf_check_proto_cksum(struct mbuf *, int, int,
u_int8_t, sa_family_t);
+#ifndef __FreeBSD__
+struct pf_divert *pf_get_divert(struct mbuf *);
+#endif
+void pf_print_state_parts(struct pf_state *,
+ struct pf_state_key *, struct pf_state_key *);
int pf_addr_wrap_neq(struct pf_addr_wrap *,
struct pf_addr_wrap *);
-struct pf_state *pf_find_state_recurse(struct pfi_kif *,
- struct pf_state_cmp *, u_int8_t);
+int pf_compare_state_keys(struct pf_state_key *,
+ struct pf_state_key *, struct pfi_kif *, u_int);
+#ifdef __FreeBSD__
+struct pf_state *pf_find_state(struct pfi_kif *,
+ struct pf_state_key_cmp *, u_int, struct mbuf *,
+ struct pf_mtag *);
+#else
+struct pf_state *pf_find_state(struct pfi_kif *,
+ struct pf_state_key_cmp *, u_int, struct mbuf *);
+#endif
int pf_src_connlimit(struct pf_state **);
int pf_check_congestion(struct ifqueue *);
#ifdef __FreeBSD__
int in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len);
-extern int pf_end_threads;
+VNET_DECLARE(int, pf_end_threads);
-struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX];
+VNET_DEFINE(struct pf_pool_limit, pf_pool_limits[PF_LIMIT_MAX]);
#else
extern struct pool pfr_ktable_pl;
extern struct pool pfr_kentry_pl;
@@ -332,80 +380,101 @@ struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX] = {
};
#endif
-#define STATE_LOOKUP() \
+#ifdef __FreeBSD__
+#define PPACKET_LOOPED() \
+ (pd->pf_mtag->flags & PF_PACKET_LOOPED)
+
+#define PACKET_LOOPED() \
+ (pd.pf_mtag->flags & PF_PACKET_LOOPED)
+
+#define STATE_LOOKUP(i, k, d, s, m, pt) \
do { \
- if (direction == PF_IN) \
- *state = pf_find_state_recurse( \
- kif, &key, PF_EXT_GWY); \
- else \
- *state = pf_find_state_recurse( \
- kif, &key, PF_LAN_EXT); \
- if (*state == NULL || (*state)->timeout == PFTM_PURGE) \
+ s = pf_find_state(i, k, d, m, pt); \
+ if (s == NULL || (s)->timeout == PFTM_PURGE) \
return (PF_DROP); \
- if (direction == PF_OUT && \
- (((*state)->rule.ptr->rt == PF_ROUTETO && \
- (*state)->rule.ptr->direction == PF_OUT) || \
- ((*state)->rule.ptr->rt == PF_REPLYTO && \
- (*state)->rule.ptr->direction == PF_IN)) && \
- (*state)->rt_kif != NULL && \
- (*state)->rt_kif != kif) \
+ if (PPACKET_LOOPED()) \
+ return (PF_PASS); \
+ if (d == PF_OUT && \
+ (((s)->rule.ptr->rt == PF_ROUTETO && \
+ (s)->rule.ptr->direction == PF_OUT) || \
+ ((s)->rule.ptr->rt == PF_REPLYTO && \
+ (s)->rule.ptr->direction == PF_IN)) && \
+ (s)->rt_kif != NULL && \
+ (s)->rt_kif != i) \
return (PF_PASS); \
} while (0)
+#else
+#define STATE_LOOKUP(i, k, d, s, m) \
+ do { \
+ s = pf_find_state(i, k, d, m); \
+ if (s == NULL || (s)->timeout == PFTM_PURGE) \
+ return (PF_DROP); \
+ if (d == PF_OUT && \
+ (((s)->rule.ptr->rt == PF_ROUTETO && \
+ (s)->rule.ptr->direction == PF_OUT) || \
+ ((s)->rule.ptr->rt == PF_REPLYTO && \
+ (s)->rule.ptr->direction == PF_IN)) && \
+ (s)->rt_kif != NULL && \
+ (s)->rt_kif != i) \
+ return (PF_PASS); \
+ } while (0)
+#endif
-#define STATE_TRANSLATE(s) \
- (s)->lan.addr.addr32[0] != (s)->gwy.addr.addr32[0] || \
- ((s)->af == AF_INET6 && \
- ((s)->lan.addr.addr32[1] != (s)->gwy.addr.addr32[1] || \
- (s)->lan.addr.addr32[2] != (s)->gwy.addr.addr32[2] || \
- (s)->lan.addr.addr32[3] != (s)->gwy.addr.addr32[3])) || \
- (s)->lan.port != (s)->gwy.port
-
-#define BOUND_IFACE(r, k) \
+#ifdef __FreeBSD__
+#define BOUND_IFACE(r, k) \
+ ((r)->rule_flag & PFRULE_IFBOUND) ? (k) : V_pfi_all
+#else
+#define BOUND_IFACE(r, k) \
((r)->rule_flag & PFRULE_IFBOUND) ? (k) : pfi_all
+#endif
-#define STATE_INC_COUNTERS(s) \
+#define STATE_INC_COUNTERS(s) \
do { \
- s->rule.ptr->states++; \
- if (s->anchor.ptr != NULL) \
- s->anchor.ptr->states++; \
- if (s->nat_rule.ptr != NULL) \
- s->nat_rule.ptr->states++; \
+ s->rule.ptr->states_cur++; \
+ s->rule.ptr->states_tot++; \
+ if (s->anchor.ptr != NULL) { \
+ s->anchor.ptr->states_cur++; \
+ s->anchor.ptr->states_tot++; \
+ } \
+ if (s->nat_rule.ptr != NULL) { \
+ s->nat_rule.ptr->states_cur++; \
+ s->nat_rule.ptr->states_tot++; \
+ } \
} while (0)
-#define STATE_DEC_COUNTERS(s) \
+#define STATE_DEC_COUNTERS(s) \
do { \
if (s->nat_rule.ptr != NULL) \
- s->nat_rule.ptr->states--; \
+ s->nat_rule.ptr->states_cur--; \
if (s->anchor.ptr != NULL) \
- s->anchor.ptr->states--; \
- s->rule.ptr->states--; \
+ s->anchor.ptr->states_cur--; \
+ s->rule.ptr->states_cur--; \
} while (0)
+static __inline int pf_src_compare(struct pf_src_node *, struct pf_src_node *);
+static __inline int pf_state_compare_key(struct pf_state_key *,
+ struct pf_state_key *);
+static __inline int pf_state_compare_id(struct pf_state *,
+ struct pf_state *);
+
+#ifdef __FreeBSD__
+VNET_DEFINE(struct pf_src_tree, tree_src_tracking);
+
+VNET_DEFINE(struct pf_state_tree_id, tree_id);
+VNET_DEFINE(struct pf_state_queue, state_list);
+#else
struct pf_src_tree tree_src_tracking;
struct pf_state_tree_id tree_id;
struct pf_state_queue state_list;
-
-#ifdef __FreeBSD__
-static int pf_src_compare(struct pf_src_node *, struct pf_src_node *);
-static int pf_state_compare_lan_ext(struct pf_state *, struct pf_state *);
-static int pf_state_compare_ext_gwy(struct pf_state *, struct pf_state *);
-static int pf_state_compare_id(struct pf_state *, struct pf_state *);
#endif
RB_GENERATE(pf_src_tree, pf_src_node, entry, pf_src_compare);
-RB_GENERATE(pf_state_tree_lan_ext, pf_state,
- u.s.entry_lan_ext, pf_state_compare_lan_ext);
-RB_GENERATE(pf_state_tree_ext_gwy, pf_state,
- u.s.entry_ext_gwy, pf_state_compare_ext_gwy);
+RB_GENERATE(pf_state_tree, pf_state_key, entry, pf_state_compare_key);
RB_GENERATE(pf_state_tree_id, pf_state,
- u.s.entry_id, pf_state_compare_id);
+ entry_id, pf_state_compare_id);
-#ifdef __FreeBSD__
-static int
-#else
static __inline int
-#endif
pf_src_compare(struct pf_src_node *a, struct pf_src_node *b)
{
int diff;
@@ -449,169 +518,6 @@ pf_src_compare(struct pf_src_node *a, struct pf_src_node *b)
return (0);
}
-#ifdef __FreeBSD__
-static int
-#else
-static __inline int
-#endif
-pf_state_compare_lan_ext(struct pf_state *a, struct pf_state *b)
-{
- int diff;
-
- if ((diff = a->proto - b->proto) != 0)
- return (diff);
- if ((diff = a->af - b->af) != 0)
- return (diff);
- switch (a->af) {
-#ifdef INET
- case AF_INET:
- if (a->lan.addr.addr32[0] > b->lan.addr.addr32[0])
- return (1);
- if (a->lan.addr.addr32[0] < b->lan.addr.addr32[0])
- return (-1);
- if (a->ext.addr.addr32[0] > b->ext.addr.addr32[0])
- return (1);
- if (a->ext.addr.addr32[0] < b->ext.addr.addr32[0])
- return (-1);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- if (a->lan.addr.addr32[3] > b->lan.addr.addr32[3])
- return (1);
- if (a->lan.addr.addr32[3] < b->lan.addr.addr32[3])
- return (-1);
- if (a->ext.addr.addr32[3] > b->ext.addr.addr32[3])
- return (1);
- if (a->ext.addr.addr32[3] < b->ext.addr.addr32[3])
- return (-1);
- if (a->lan.addr.addr32[2] > b->lan.addr.addr32[2])
- return (1);
- if (a->lan.addr.addr32[2] < b->lan.addr.addr32[2])
- return (-1);
- if (a->ext.addr.addr32[2] > b->ext.addr.addr32[2])
- return (1);
- if (a->ext.addr.addr32[2] < b->ext.addr.addr32[2])
- return (-1);
- if (a->lan.addr.addr32[1] > b->lan.addr.addr32[1])
- return (1);
- if (a->lan.addr.addr32[1] < b->lan.addr.addr32[1])
- return (-1);
- if (a->ext.addr.addr32[1] > b->ext.addr.addr32[1])
- return (1);
- if (a->ext.addr.addr32[1] < b->ext.addr.addr32[1])
- return (-1);
- if (a->lan.addr.addr32[0] > b->lan.addr.addr32[0])
- return (1);
- if (a->lan.addr.addr32[0] < b->lan.addr.addr32[0])
- return (-1);
- if (a->ext.addr.addr32[0] > b->ext.addr.addr32[0])
- return (1);
- if (a->ext.addr.addr32[0] < b->ext.addr.addr32[0])
- return (-1);
- break;
-#endif /* INET6 */
- }
-
- if ((diff = a->lan.port - b->lan.port) != 0)
- return (diff);
- if ((diff = a->ext.port - b->ext.port) != 0)
- return (diff);
-
- return (0);
-}
-
-#ifdef __FreeBSD__
-static int
-#else
-static __inline int
-#endif
-pf_state_compare_ext_gwy(struct pf_state *a, struct pf_state *b)
-{
- int diff;
-
- if ((diff = a->proto - b->proto) != 0)
- return (diff);
- if ((diff = a->af - b->af) != 0)
- return (diff);
- switch (a->af) {
-#ifdef INET
- case AF_INET:
- if (a->ext.addr.addr32[0] > b->ext.addr.addr32[0])
- return (1);
- if (a->ext.addr.addr32[0] < b->ext.addr.addr32[0])
- return (-1);
- if (a->gwy.addr.addr32[0] > b->gwy.addr.addr32[0])
- return (1);
- if (a->gwy.addr.addr32[0] < b->gwy.addr.addr32[0])
- return (-1);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- if (a->ext.addr.addr32[3] > b->ext.addr.addr32[3])
- return (1);
- if (a->ext.addr.addr32[3] < b->ext.addr.addr32[3])
- return (-1);
- if (a->gwy.addr.addr32[3] > b->gwy.addr.addr32[3])
- return (1);
- if (a->gwy.addr.addr32[3] < b->gwy.addr.addr32[3])
- return (-1);
- if (a->ext.addr.addr32[2] > b->ext.addr.addr32[2])
- return (1);
- if (a->ext.addr.addr32[2] < b->ext.addr.addr32[2])
- return (-1);
- if (a->gwy.addr.addr32[2] > b->gwy.addr.addr32[2])
- return (1);
- if (a->gwy.addr.addr32[2] < b->gwy.addr.addr32[2])
- return (-1);
- if (a->ext.addr.addr32[1] > b->ext.addr.addr32[1])
- return (1);
- if (a->ext.addr.addr32[1] < b->ext.addr.addr32[1])
- return (-1);
- if (a->gwy.addr.addr32[1] > b->gwy.addr.addr32[1])
- return (1);
- if (a->gwy.addr.addr32[1] < b->gwy.addr.addr32[1])
- return (-1);
- if (a->ext.addr.addr32[0] > b->ext.addr.addr32[0])
- return (1);
- if (a->ext.addr.addr32[0] < b->ext.addr.addr32[0])
- return (-1);
- if (a->gwy.addr.addr32[0] > b->gwy.addr.addr32[0])
- return (1);
- if (a->gwy.addr.addr32[0] < b->gwy.addr.addr32[0])
- return (-1);
- break;
-#endif /* INET6 */
- }
-
- if ((diff = a->ext.port - b->ext.port) != 0)
- return (diff);
- if ((diff = a->gwy.port - b->gwy.port) != 0)
- return (diff);
-
- return (0);
-}
-
-#ifdef __FreeBSD__
-static int
-#else
-static __inline int
-#endif
-pf_state_compare_id(struct pf_state *a, struct pf_state *b)
-{
- if (a->id > b->id)
- return (1);
- if (a->id < b->id)
- return (-1);
- if (a->creatorid > b->creatorid)
- return (1);
- if (a->creatorid < b->creatorid)
- return (-1);
-
- return (0);
-}
-
#ifdef INET6
void
pf_addrcpy(struct pf_addr *dst, struct pf_addr *src, sa_family_t af)
@@ -632,80 +538,6 @@ pf_addrcpy(struct pf_addr *dst, struct pf_addr *src, sa_family_t af)
}
#endif /* INET6 */
-struct pf_state *
-pf_find_state_byid(struct pf_state_cmp *key)
-{
- pf_status.fcounters[FCNT_STATE_SEARCH]++;
- return (RB_FIND(pf_state_tree_id, &tree_id, (struct pf_state *)key));
-}
-
-struct pf_state *
-pf_find_state_recurse(struct pfi_kif *kif, struct pf_state_cmp *key, u_int8_t tree)
-{
- struct pf_state *s;
-
- pf_status.fcounters[FCNT_STATE_SEARCH]++;
-
- switch (tree) {
- case PF_LAN_EXT:
- if ((s = RB_FIND(pf_state_tree_lan_ext, &kif->pfik_lan_ext,
- (struct pf_state *)key)) != NULL)
- return (s);
- if ((s = RB_FIND(pf_state_tree_lan_ext, &pfi_all->pfik_lan_ext,
- (struct pf_state *)key)) != NULL)
- return (s);
- return (NULL);
- case PF_EXT_GWY:
- if ((s = RB_FIND(pf_state_tree_ext_gwy, &kif->pfik_ext_gwy,
- (struct pf_state *)key)) != NULL)
- return (s);
- if ((s = RB_FIND(pf_state_tree_ext_gwy, &pfi_all->pfik_ext_gwy,
- (struct pf_state *)key)) != NULL)
- return (s);
- return (NULL);
- default:
- panic("pf_find_state_recurse");
- }
-}
-
-struct pf_state *
-pf_find_state_all(struct pf_state_cmp *key, u_int8_t tree, int *more)
-{
- struct pf_state *s, *ss = NULL;
- struct pfi_kif *kif;
-
- pf_status.fcounters[FCNT_STATE_SEARCH]++;
-
- switch (tree) {
- case PF_LAN_EXT:
- TAILQ_FOREACH(kif, &pfi_statehead, pfik_w_states) {
- s = RB_FIND(pf_state_tree_lan_ext,
- &kif->pfik_lan_ext, (struct pf_state *)key);
- if (s == NULL)
- continue;
- if (more == NULL)
- return (s);
- ss = s;
- (*more)++;
- }
- return (ss);
- case PF_EXT_GWY:
- TAILQ_FOREACH(kif, &pfi_statehead, pfik_w_states) {
- s = RB_FIND(pf_state_tree_ext_gwy,
- &kif->pfik_ext_gwy, (struct pf_state *)key);
- if (s == NULL)
- continue;
- if (more == NULL)
- return (s);
- ss = s;
- (*more)++;
- }
- return (ss);
- default:
- panic("pf_find_state_all");
- }
-}
-
void
pf_init_threshold(struct pf_threshold *threshold,
u_int32_t limit, u_int32_t seconds)
@@ -739,7 +571,6 @@ pf_check_threshold(struct pf_threshold *threshold)
int
pf_src_connlimit(struct pf_state **state)
{
- struct pf_state *s;
int bad = 0;
(*state)->src_node->conn++;
@@ -749,13 +580,21 @@ pf_src_connlimit(struct pf_state **state)
if ((*state)->rule.ptr->max_src_conn &&
(*state)->rule.ptr->max_src_conn <
(*state)->src_node->conn) {
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_SRCCONN]++;
+#else
pf_status.lcounters[LCNT_SRCCONN]++;
+#endif
bad++;
}
if ((*state)->rule.ptr->max_src_conn_rate.limit &&
pf_check_threshold(&(*state)->src_node->conn_rate)) {
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_SRCCONNRATE]++;
+#else
pf_status.lcounters[LCNT_SRCCONNRATE]++;
+#endif
bad++;
}
@@ -766,16 +605,21 @@ pf_src_connlimit(struct pf_state **state)
struct pfr_addr p;
u_int32_t killed = 0;
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_OVERLOAD_TABLE]++;
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
pf_status.lcounters[LCNT_OVERLOAD_TABLE]++;
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf_src_connlimit: blocking address ");
pf_print_host(&(*state)->src_node->addr, 0,
- (*state)->af);
+ (*state)->key[PF_SK_WIRE]->af);
}
bzero(&p, sizeof(p));
- p.pfra_af = (*state)->af;
- switch ((*state)->af) {
+ p.pfra_af = (*state)->key[PF_SK_WIRE]->af;
+ switch ((*state)->key[PF_SK_WIRE]->af) {
#ifdef INET
case AF_INET:
p.pfra_net = 32;
@@ -795,34 +639,51 @@ pf_src_connlimit(struct pf_state **state)
/* kill existing states if that's required. */
if ((*state)->rule.ptr->flush) {
- pf_status.lcounters[LCNT_OVERLOAD_FLUSH]++;
+ struct pf_state_key *sk;
+ struct pf_state *st;
- RB_FOREACH(s, pf_state_tree_id, &tree_id) {
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_OVERLOAD_FLUSH]++;
+ RB_FOREACH(st, pf_state_tree_id, &V_tree_id) {
+#else
+ pf_status.lcounters[LCNT_OVERLOAD_FLUSH]++;
+ RB_FOREACH(st, pf_state_tree_id, &tree_id) {
+#endif
+ sk = st->key[PF_SK_WIRE];
/*
* Kill states from this source. (Only those
* from the same rule if PF_FLUSH_GLOBAL is not
* set)
*/
- if (s->af == (*state)->af &&
+ if (sk->af ==
+ (*state)->key[PF_SK_WIRE]->af &&
(((*state)->direction == PF_OUT &&
PF_AEQ(&(*state)->src_node->addr,
- &s->lan.addr, s->af)) ||
+ &sk->addr[0], sk->af)) ||
((*state)->direction == PF_IN &&
PF_AEQ(&(*state)->src_node->addr,
- &s->ext.addr, s->af))) &&
+ &sk->addr[1], sk->af))) &&
((*state)->rule.ptr->flush &
PF_FLUSH_GLOBAL ||
- (*state)->rule.ptr == s->rule.ptr)) {
- s->timeout = PFTM_PURGE;
- s->src.state = s->dst.state =
+ (*state)->rule.ptr == st->rule.ptr)) {
+ st->timeout = PFTM_PURGE;
+ st->src.state = st->dst.state =
TCPS_CLOSED;
killed++;
}
}
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
printf(", %u states killed", killed);
}
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC)
+#else
if (pf_status.debug >= PF_DEBUG_MISC)
+#endif
printf("\n");
}
@@ -846,18 +707,30 @@ pf_insert_src_node(struct pf_src_node **sn, struct pf_rule *rule,
k.rule.ptr = rule;
else
k.rule.ptr = NULL;
+#ifdef __FreeBSD__
+ V_pf_status.scounters[SCNT_SRC_NODE_SEARCH]++;
+ *sn = RB_FIND(pf_src_tree, &V_tree_src_tracking, &k);
+#else
pf_status.scounters[SCNT_SRC_NODE_SEARCH]++;
*sn = RB_FIND(pf_src_tree, &tree_src_tracking, &k);
+#endif
}
if (*sn == NULL) {
if (!rule->max_src_nodes ||
rule->src_nodes < rule->max_src_nodes)
- (*sn) = pool_get(&pf_src_tree_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ (*sn) = pool_get(&V_pf_src_tree_pl, PR_NOWAIT | PR_ZERO);
+#else
+ (*sn) = pool_get(&pf_src_tree_pl, PR_NOWAIT | PR_ZERO);
+#endif
else
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_SRCNODES]++;
+#else
pf_status.lcounters[LCNT_SRCNODES]++;
+#endif
if ((*sn) == NULL)
return (-1);
- bzero(*sn, sizeof(struct pf_src_node));
pf_init_threshold(&(*sn)->conn_rate,
rule->max_src_conn_rate.limit,
@@ -871,109 +744,590 @@ pf_insert_src_node(struct pf_src_node **sn, struct pf_rule *rule,
(*sn)->rule.ptr = NULL;
PF_ACPY(&(*sn)->addr, src, af);
if (RB_INSERT(pf_src_tree,
+#ifdef __FreeBSD__
+ &V_tree_src_tracking, *sn) != NULL) {
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
&tree_src_tracking, *sn) != NULL) {
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf: src_tree insert failed: ");
pf_print_host(&(*sn)->addr, 0, af);
printf("\n");
}
+#ifdef __FreeBSD__
+ pool_put(&V_pf_src_tree_pl, *sn);
+#else
pool_put(&pf_src_tree_pl, *sn);
+#endif
return (-1);
}
(*sn)->creation = time_second;
(*sn)->ruletype = rule->action;
if ((*sn)->rule.ptr != NULL)
(*sn)->rule.ptr->src_nodes++;
+#ifdef __FreeBSD__
+ V_pf_status.scounters[SCNT_SRC_NODE_INSERT]++;
+ V_pf_status.src_nodes++;
+#else
pf_status.scounters[SCNT_SRC_NODE_INSERT]++;
pf_status.src_nodes++;
+#endif
} else {
if (rule->max_src_states &&
(*sn)->states >= rule->max_src_states) {
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_SRCSTATES]++;
+#else
pf_status.lcounters[LCNT_SRCSTATES]++;
+#endif
return (-1);
}
}
return (0);
}
+/* state table stuff */
+
+static __inline int
+pf_state_compare_key(struct pf_state_key *a, struct pf_state_key *b)
+{
+ int diff;
+
+ if ((diff = a->proto - b->proto) != 0)
+ return (diff);
+ if ((diff = a->af - b->af) != 0)
+ return (diff);
+ switch (a->af) {
+#ifdef INET
+ case AF_INET:
+ if (a->addr[0].addr32[0] > b->addr[0].addr32[0])
+ return (1);
+ if (a->addr[0].addr32[0] < b->addr[0].addr32[0])
+ return (-1);
+ if (a->addr[1].addr32[0] > b->addr[1].addr32[0])
+ return (1);
+ if (a->addr[1].addr32[0] < b->addr[1].addr32[0])
+ return (-1);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (a->addr[0].addr32[3] > b->addr[0].addr32[3])
+ return (1);
+ if (a->addr[0].addr32[3] < b->addr[0].addr32[3])
+ return (-1);
+ if (a->addr[1].addr32[3] > b->addr[1].addr32[3])
+ return (1);
+ if (a->addr[1].addr32[3] < b->addr[1].addr32[3])
+ return (-1);
+ if (a->addr[0].addr32[2] > b->addr[0].addr32[2])
+ return (1);
+ if (a->addr[0].addr32[2] < b->addr[0].addr32[2])
+ return (-1);
+ if (a->addr[1].addr32[2] > b->addr[1].addr32[2])
+ return (1);
+ if (a->addr[1].addr32[2] < b->addr[1].addr32[2])
+ return (-1);
+ if (a->addr[0].addr32[1] > b->addr[0].addr32[1])
+ return (1);
+ if (a->addr[0].addr32[1] < b->addr[0].addr32[1])
+ return (-1);
+ if (a->addr[1].addr32[1] > b->addr[1].addr32[1])
+ return (1);
+ if (a->addr[1].addr32[1] < b->addr[1].addr32[1])
+ return (-1);
+ if (a->addr[0].addr32[0] > b->addr[0].addr32[0])
+ return (1);
+ if (a->addr[0].addr32[0] < b->addr[0].addr32[0])
+ return (-1);
+ if (a->addr[1].addr32[0] > b->addr[1].addr32[0])
+ return (1);
+ if (a->addr[1].addr32[0] < b->addr[1].addr32[0])
+ return (-1);
+ break;
+#endif /* INET6 */
+ }
+
+ if ((diff = a->port[0] - b->port[0]) != 0)
+ return (diff);
+ if ((diff = a->port[1] - b->port[1]) != 0)
+ return (diff);
+
+ return (0);
+}
+
+static __inline int
+pf_state_compare_id(struct pf_state *a, struct pf_state *b)
+{
+ if (a->id > b->id)
+ return (1);
+ if (a->id < b->id)
+ return (-1);
+ if (a->creatorid > b->creatorid)
+ return (1);
+ if (a->creatorid < b->creatorid)
+ return (-1);
+
+ return (0);
+}
+
int
-pf_insert_state(struct pfi_kif *kif, struct pf_state *state)
+pf_state_key_attach(struct pf_state_key *sk, struct pf_state *s, int idx)
{
- /* Thou MUST NOT insert multiple duplicate keys */
- state->u.s.kif = kif;
- if (RB_INSERT(pf_state_tree_lan_ext, &kif->pfik_lan_ext, state)) {
- if (pf_status.debug >= PF_DEBUG_MISC) {
- printf("pf: state insert failed: tree_lan_ext");
- printf(" lan: ");
- pf_print_host(&state->lan.addr, state->lan.port,
- state->af);
- printf(" gwy: ");
- pf_print_host(&state->gwy.addr, state->gwy.port,
- state->af);
- printf(" ext: ");
- pf_print_host(&state->ext.addr, state->ext.port,
- state->af);
- if (state->sync_flags & PFSTATE_FROMSYNC)
- printf(" (from sync)");
- printf("\n");
- }
+ struct pf_state_item *si;
+ struct pf_state_key *cur;
+ struct pf_state *olds = NULL;
+
+#ifdef __FreeBSD__
+ KASSERT(s->key[idx] == NULL, ("%s: key is null!", __FUNCTION__));
+#else
+ KASSERT(s->key[idx] == NULL); /* XXX handle this? */
+#endif
+
+#ifdef __FreeBSD__
+ if ((cur = RB_INSERT(pf_state_tree, &V_pf_statetbl, sk)) != NULL) {
+#else
+ if ((cur = RB_INSERT(pf_state_tree, &pf_statetbl, sk)) != NULL) {
+#endif
+ /* key exists. check for same kif, if none, add to key */
+ TAILQ_FOREACH(si, &cur->states, entry)
+ if (si->s->kif == s->kif &&
+ si->s->direction == s->direction) {
+ if (sk->proto == IPPROTO_TCP &&
+ si->s->src.state >= TCPS_FIN_WAIT_2 &&
+ si->s->dst.state >= TCPS_FIN_WAIT_2) {
+ si->s->src.state = si->s->dst.state =
+ TCPS_CLOSED;
+ /* unlink late or sks can go away */
+ olds = si->s;
+ } else {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
+ printf("pf: %s key attach "
+ "failed on %s: ",
+ (idx == PF_SK_WIRE) ?
+ "wire" : "stack",
+ s->kif->pfik_name);
+ pf_print_state_parts(s,
+ (idx == PF_SK_WIRE) ?
+ sk : NULL,
+ (idx == PF_SK_STACK) ?
+ sk : NULL);
+ printf(", existing: ");
+ pf_print_state_parts(si->s,
+ (idx == PF_SK_WIRE) ?
+ sk : NULL,
+ (idx == PF_SK_STACK) ?
+ sk : NULL);
+ printf("\n");
+ }
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_key_pl, sk);
+#else
+ pool_put(&pf_state_key_pl, sk);
+#endif
+ return (-1); /* collision! */
+ }
+ }
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_key_pl, sk);
+#else
+ pool_put(&pf_state_key_pl, sk);
+#endif
+ s->key[idx] = cur;
+ } else
+ s->key[idx] = sk;
+
+#ifdef __FreeBSD__
+ if ((si = pool_get(&V_pf_state_item_pl, PR_NOWAIT)) == NULL) {
+#else
+ if ((si = pool_get(&pf_state_item_pl, PR_NOWAIT)) == NULL) {
+#endif
+ pf_state_key_detach(s, idx);
return (-1);
}
+ si->s = s;
- if (RB_INSERT(pf_state_tree_ext_gwy, &kif->pfik_ext_gwy, state)) {
- if (pf_status.debug >= PF_DEBUG_MISC) {
- printf("pf: state insert failed: tree_ext_gwy");
- printf(" lan: ");
- pf_print_host(&state->lan.addr, state->lan.port,
- state->af);
- printf(" gwy: ");
- pf_print_host(&state->gwy.addr, state->gwy.port,
- state->af);
- printf(" ext: ");
- pf_print_host(&state->ext.addr, state->ext.port,
- state->af);
- if (state->sync_flags & PFSTATE_FROMSYNC)
- printf(" (from sync)");
- printf("\n");
+ /* list is sorted, if-bound states before floating */
+#ifdef __FreeBSD__
+ if (s->kif == V_pfi_all)
+#else
+ if (s->kif == pfi_all)
+#endif
+ TAILQ_INSERT_TAIL(&s->key[idx]->states, si, entry);
+ else
+ TAILQ_INSERT_HEAD(&s->key[idx]->states, si, entry);
+
+ if (olds)
+ pf_unlink_state(olds);
+
+ return (0);
+}
+
+void
+pf_detach_state(struct pf_state *s)
+{
+ if (s->key[PF_SK_WIRE] == s->key[PF_SK_STACK])
+ s->key[PF_SK_WIRE] = NULL;
+
+ if (s->key[PF_SK_STACK] != NULL)
+ pf_state_key_detach(s, PF_SK_STACK);
+
+ if (s->key[PF_SK_WIRE] != NULL)
+ pf_state_key_detach(s, PF_SK_WIRE);
+}
+
+void
+pf_state_key_detach(struct pf_state *s, int idx)
+{
+ struct pf_state_item *si;
+
+ si = TAILQ_FIRST(&s->key[idx]->states);
+ while (si && si->s != s)
+ si = TAILQ_NEXT(si, entry);
+
+ if (si) {
+ TAILQ_REMOVE(&s->key[idx]->states, si, entry);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_item_pl, si);
+#else
+ pool_put(&pf_state_item_pl, si);
+#endif
+ }
+
+ if (TAILQ_EMPTY(&s->key[idx]->states)) {
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_state_tree, &V_pf_statetbl, s->key[idx]);
+#else
+ RB_REMOVE(pf_state_tree, &pf_statetbl, s->key[idx]);
+#endif
+ if (s->key[idx]->reverse)
+ s->key[idx]->reverse->reverse = NULL;
+#ifdef __FreeBSD__
+ /* XXX: implement this */
+#else
+ if (s->key[idx]->inp)
+ s->key[idx]->inp->inp_pf_sk = NULL;
+#endif
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_key_pl, s->key[idx]);
+#else
+ pool_put(&pf_state_key_pl, s->key[idx]);
+#endif
+ }
+ s->key[idx] = NULL;
+}
+
+struct pf_state_key *
+pf_alloc_state_key(int pool_flags)
+{
+ struct pf_state_key *sk;
+
+#ifdef __FreeBSD__
+ if ((sk = pool_get(&V_pf_state_key_pl, pool_flags)) == NULL)
+#else
+ if ((sk = pool_get(&pf_state_key_pl, pool_flags)) == NULL)
+#endif
+ return (NULL);
+ TAILQ_INIT(&sk->states);
+
+ return (sk);
+}
+
+int
+pf_state_key_setup(struct pf_pdesc *pd, struct pf_rule *nr,
+ struct pf_state_key **skw, struct pf_state_key **sks,
+ struct pf_state_key **skp, struct pf_state_key **nkp,
+ struct pf_addr *saddr, struct pf_addr *daddr,
+ u_int16_t sport, u_int16_t dport)
+{
+#ifdef __FreeBSD__
+ KASSERT((*skp == NULL && *nkp == NULL),
+ ("%s: skp == NULL && nkp == NULL", __FUNCTION__));
+#else
+ KASSERT((*skp == NULL && *nkp == NULL));
+#endif
+
+ if ((*skp = pf_alloc_state_key(PR_NOWAIT | PR_ZERO)) == NULL)
+ return (ENOMEM);
+
+ PF_ACPY(&(*skp)->addr[pd->sidx], saddr, pd->af);
+ PF_ACPY(&(*skp)->addr[pd->didx], daddr, pd->af);
+ (*skp)->port[pd->sidx] = sport;
+ (*skp)->port[pd->didx] = dport;
+ (*skp)->proto = pd->proto;
+ (*skp)->af = pd->af;
+
+ if (nr != NULL) {
+ if ((*nkp = pf_alloc_state_key(PR_NOWAIT | PR_ZERO)) == NULL)
+ return (ENOMEM); /* caller must handle cleanup */
+
+ /* XXX maybe just bcopy and TAILQ_INIT(&(*nkp)->states) */
+ PF_ACPY(&(*nkp)->addr[0], &(*skp)->addr[0], pd->af);
+ PF_ACPY(&(*nkp)->addr[1], &(*skp)->addr[1], pd->af);
+ (*nkp)->port[0] = (*skp)->port[0];
+ (*nkp)->port[1] = (*skp)->port[1];
+ (*nkp)->proto = pd->proto;
+ (*nkp)->af = pd->af;
+ } else
+ *nkp = *skp;
+
+ if (pd->dir == PF_IN) {
+ *skw = *skp;
+ *sks = *nkp;
+ } else {
+ *sks = *skp;
+ *skw = *nkp;
+ }
+ return (0);
+}
+
+
+int
+pf_state_insert(struct pfi_kif *kif, struct pf_state_key *skw,
+ struct pf_state_key *sks, struct pf_state *s)
+{
+#ifndef __FreeBSD__
+ splassert(IPL_SOFTNET);
+#endif
+
+ s->kif = kif;
+
+ if (skw == sks) {
+ if (pf_state_key_attach(skw, s, PF_SK_WIRE))
+ return (-1);
+ s->key[PF_SK_STACK] = s->key[PF_SK_WIRE];
+ } else {
+ if (pf_state_key_attach(skw, s, PF_SK_WIRE)) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_key_pl, sks);
+#else
+ pool_put(&pf_state_key_pl, sks);
+#endif
+ return (-1);
+ }
+ if (pf_state_key_attach(sks, s, PF_SK_STACK)) {
+ pf_state_key_detach(s, PF_SK_WIRE);
+ return (-1);
}
- RB_REMOVE(pf_state_tree_lan_ext, &kif->pfik_lan_ext, state);
- return (-1);
}
- if (state->id == 0 && state->creatorid == 0) {
- state->id = htobe64(pf_status.stateid++);
- state->creatorid = pf_status.hostid;
+ if (s->id == 0 && s->creatorid == 0) {
+#ifdef __FreeBSD__
+ s->id = htobe64(V_pf_status.stateid++);
+ s->creatorid = V_pf_status.hostid;
+#else
+ s->id = htobe64(pf_status.stateid++);
+ s->creatorid = pf_status.hostid;
+#endif
}
- if (RB_INSERT(pf_state_tree_id, &tree_id, state) != NULL) {
- if (pf_status.debug >= PF_DEBUG_MISC) {
#ifdef __FreeBSD__
- printf("pf: state insert failed: "
- "id: %016llx creatorid: %08x",
- (long long)be64toh(state->id),
- ntohl(state->creatorid));
+ if (RB_INSERT(pf_state_tree_id, &V_tree_id, s) != NULL) {
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
#else
+ if (RB_INSERT(pf_state_tree_id, &tree_id, s) != NULL) {
+ if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf: state insert failed: "
"id: %016llx creatorid: %08x",
- betoh64(state->id), ntohl(state->creatorid));
+#ifdef __FreeBSD__
+ (unsigned long long)betoh64(s->id), ntohl(s->creatorid));
+#else
+ betoh64(s->id), ntohl(s->creatorid));
#endif
- if (state->sync_flags & PFSTATE_FROMSYNC)
- printf(" (from sync)");
printf("\n");
}
- RB_REMOVE(pf_state_tree_lan_ext, &kif->pfik_lan_ext, state);
- RB_REMOVE(pf_state_tree_ext_gwy, &kif->pfik_ext_gwy, state);
+ pf_detach_state(s);
return (-1);
}
- TAILQ_INSERT_TAIL(&state_list, state, u.s.entry_list);
+#ifdef __FreeBSD__
+ TAILQ_INSERT_TAIL(&V_state_list, s, entry_list);
+ V_pf_status.fcounters[FCNT_STATE_INSERT]++;
+ V_pf_status.states++;
+#else
+ TAILQ_INSERT_TAIL(&state_list, s, entry_list);
pf_status.fcounters[FCNT_STATE_INSERT]++;
pf_status.states++;
+#endif
pfi_kif_ref(kif, PFI_KIF_REF_STATE);
-#if NPFSYNC
- pfsync_insert_state(state);
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_insert_state_ptr != NULL)
+ pfsync_insert_state_ptr(s);
+#else
+ pfsync_insert_state(s);
+#endif
#endif
return (0);
}
+struct pf_state *
+pf_find_state_byid(struct pf_state_cmp *key)
+{
+#ifdef __FreeBSD__
+ V_pf_status.fcounters[FCNT_STATE_SEARCH]++;
+
+ return (RB_FIND(pf_state_tree_id, &V_tree_id, (struct pf_state *)key));
+#else
+ pf_status.fcounters[FCNT_STATE_SEARCH]++;
+
+ return (RB_FIND(pf_state_tree_id, &tree_id, (struct pf_state *)key));
+#endif
+}
+
+/* XXX debug function, intended to be removed one day */
+int
+pf_compare_state_keys(struct pf_state_key *a, struct pf_state_key *b,
+ struct pfi_kif *kif, u_int dir)
+{
+ /* a (from hdr) and b (new) must be exact opposites of each other */
+ if (a->af == b->af && a->proto == b->proto &&
+ PF_AEQ(&a->addr[0], &b->addr[1], a->af) &&
+ PF_AEQ(&a->addr[1], &b->addr[0], a->af) &&
+ a->port[0] == b->port[1] &&
+ a->port[1] == b->port[0])
+ return (0);
+ else {
+ /* mismatch. must not happen. */
+ printf("pf: state key linking mismatch! dir=%s, "
+ "if=%s, stored af=%u, a0: ",
+ dir == PF_OUT ? "OUT" : "IN", kif->pfik_name, a->af);
+ pf_print_host(&a->addr[0], a->port[0], a->af);
+ printf(", a1: ");
+ pf_print_host(&a->addr[1], a->port[1], a->af);
+ printf(", proto=%u", a->proto);
+ printf(", found af=%u, a0: ", b->af);
+ pf_print_host(&b->addr[0], b->port[0], b->af);
+ printf(", a1: ");
+ pf_print_host(&b->addr[1], b->port[1], b->af);
+ printf(", proto=%u", b->proto);
+ printf(".\n");
+ return (-1);
+ }
+}
+
+struct pf_state *
+#ifdef __FreeBSD__
+pf_find_state(struct pfi_kif *kif, struct pf_state_key_cmp *key, u_int dir,
+ struct mbuf *m, struct pf_mtag *pftag)
+#else
+pf_find_state(struct pfi_kif *kif, struct pf_state_key_cmp *key, u_int dir,
+ struct mbuf *m)
+#endif
+{
+ struct pf_state_key *sk;
+ struct pf_state_item *si;
+
+#ifdef __FreeBSD__
+ V_pf_status.fcounters[FCNT_STATE_SEARCH]++;
+#else
+ pf_status.fcounters[FCNT_STATE_SEARCH]++;
+#endif
+
+#ifdef __FreeBSD__
+ if (dir == PF_OUT && pftag->statekey &&
+ ((struct pf_state_key *)pftag->statekey)->reverse)
+ sk = ((struct pf_state_key *)pftag->statekey)->reverse;
+ else {
+#ifdef __FreeBSD__
+ if ((sk = RB_FIND(pf_state_tree, &V_pf_statetbl,
+#else
+ if ((sk = RB_FIND(pf_state_tree, &pf_statetbl,
+#endif
+ (struct pf_state_key *)key)) == NULL)
+ return (NULL);
+ if (dir == PF_OUT && pftag->statekey &&
+ pf_compare_state_keys(pftag->statekey, sk,
+ kif, dir) == 0) {
+ ((struct pf_state_key *)
+ pftag->statekey)->reverse = sk;
+ sk->reverse = pftag->statekey;
+ }
+ }
+#else
+ if (dir == PF_OUT && m->m_pkthdr.pf.statekey &&
+ ((struct pf_state_key *)m->m_pkthdr.pf.statekey)->reverse)
+ sk = ((struct pf_state_key *)m->m_pkthdr.pf.statekey)->reverse;
+ else {
+#ifdef __FreeBSD__
+ if ((sk = RB_FIND(pf_state_tree, &V_pf_statetbl,
+#else
+ if ((sk = RB_FIND(pf_state_tree, &pf_statetbl,
+#endif
+ (struct pf_state_key *)key)) == NULL)
+ return (NULL);
+ if (dir == PF_OUT && m->m_pkthdr.pf.statekey &&
+ pf_compare_state_keys(m->m_pkthdr.pf.statekey, sk,
+ kif, dir) == 0) {
+ ((struct pf_state_key *)
+ m->m_pkthdr.pf.statekey)->reverse = sk;
+ sk->reverse = m->m_pkthdr.pf.statekey;
+ }
+ }
+#endif
+
+ if (dir == PF_OUT)
+#ifdef __FreeBSD__
+ pftag->statekey = NULL;
+#else
+ m->m_pkthdr.pf.statekey = NULL;
+#endif
+
+ /* list is sorted, if-bound states before floating ones */
+ TAILQ_FOREACH(si, &sk->states, entry)
+#ifdef __FreeBSD__
+ if ((si->s->kif == V_pfi_all || si->s->kif == kif) &&
+#else
+ if ((si->s->kif == pfi_all || si->s->kif == kif) &&
+#endif
+ sk == (dir == PF_IN ? si->s->key[PF_SK_WIRE] :
+ si->s->key[PF_SK_STACK]))
+ return (si->s);
+
+ return (NULL);
+}
+
+struct pf_state *
+pf_find_state_all(struct pf_state_key_cmp *key, u_int dir, int *more)
+{
+ struct pf_state_key *sk;
+ struct pf_state_item *si, *ret = NULL;
+
+#ifdef __FreeBSD__
+ V_pf_status.fcounters[FCNT_STATE_SEARCH]++;
+#else
+ pf_status.fcounters[FCNT_STATE_SEARCH]++;
+#endif
+
+#ifdef __FreeBSD__
+ sk = RB_FIND(pf_state_tree, &V_pf_statetbl, (struct pf_state_key *)key);
+#else
+ sk = RB_FIND(pf_state_tree, &pf_statetbl, (struct pf_state_key *)key);
+#endif
+ if (sk != NULL) {
+ TAILQ_FOREACH(si, &sk->states, entry)
+ if (dir == PF_INOUT ||
+ (sk == (dir == PF_IN ? si->s->key[PF_SK_WIRE] :
+ si->s->key[PF_SK_STACK]))) {
+ if (more == NULL)
+ return (si->s);
+
+ if (ret)
+ (*more)++;
+ else
+ ret = si;
+ }
+ }
+ return (ret ? ret->s : NULL);
+}
+
+/* END state table stuff */
+
+
void
pf_purge_thread(void *v)
{
@@ -982,61 +1336,61 @@ pf_purge_thread(void *v)
int locked;
#endif
+ CURVNET_SET((struct vnet *)v);
+
for (;;) {
tsleep(pf_purge_thread, PWAIT, "pftm", 1 * hz);
#ifdef __FreeBSD__
- sx_slock(&pf_consistency_lock);
+ sx_slock(&V_pf_consistency_lock);
+ PF_LOCK();
+ locked = 0;
+
+ if (V_pf_end_threads) {
+ PF_UNLOCK();
+ sx_sunlock(&V_pf_consistency_lock);
+ sx_xlock(&V_pf_consistency_lock);
PF_LOCK();
- locked = 0;
- if (pf_end_threads) {
- PF_UNLOCK();
- sx_sunlock(&pf_consistency_lock);
- sx_xlock(&pf_consistency_lock);
- PF_LOCK();
- pf_purge_expired_states(pf_status.states, 1);
- pf_purge_expired_fragments();
- pf_purge_expired_src_nodes(1);
- pf_end_threads++;
+ pf_purge_expired_states(V_pf_status.states, 1);
+ pf_purge_expired_fragments();
+ pf_purge_expired_src_nodes(1);
+ V_pf_end_threads++;
- sx_xunlock(&pf_consistency_lock);
- PF_UNLOCK();
- wakeup(pf_purge_thread);
- kproc_exit(0);
- }
+ sx_xunlock(&V_pf_consistency_lock);
+ PF_UNLOCK();
+ wakeup(pf_purge_thread);
+ kproc_exit(0);
+ }
#endif
s = splsoftnet();
/* process a fraction of the state table every second */
#ifdef __FreeBSD__
- if(!pf_purge_expired_states(1 + (pf_status.states
- / pf_default_rule.timeout[PFTM_INTERVAL]), 0)) {
- PF_UNLOCK();
- sx_sunlock(&pf_consistency_lock);
- sx_xlock(&pf_consistency_lock);
- PF_LOCK();
- locked = 1;
+ if (!pf_purge_expired_states(1 + (V_pf_status.states /
+ V_pf_default_rule.timeout[PFTM_INTERVAL]), 0)) {
+ PF_UNLOCK();
+ sx_sunlock(&V_pf_consistency_lock);
+ sx_xlock(&V_pf_consistency_lock);
+ PF_LOCK();
+ locked = 1;
- pf_purge_expired_states(1 + (pf_status.states
- / pf_default_rule.timeout[PFTM_INTERVAL]), 1);
- }
+ pf_purge_expired_states(1 + (V_pf_status.states /
+ V_pf_default_rule.timeout[PFTM_INTERVAL]), 1);
+ }
#else
pf_purge_expired_states(1 + (pf_status.states
/ pf_default_rule.timeout[PFTM_INTERVAL]));
#endif
/* purge other expired types every PFTM_INTERVAL seconds */
+#ifdef __FreeBSD__
+ if (++nloops >= V_pf_default_rule.timeout[PFTM_INTERVAL]) {
+#else
if (++nloops >= pf_default_rule.timeout[PFTM_INTERVAL]) {
+#endif
pf_purge_expired_fragments();
- if (!pf_purge_expired_src_nodes(locked)) {
- PF_UNLOCK();
- sx_sunlock(&pf_consistency_lock);
- sx_xlock(&pf_consistency_lock);
- PF_LOCK();
- locked = 1;
- pf_purge_expired_src_nodes(1);
- }
+ pf_purge_expired_src_nodes(0);
nloops = 0;
}
@@ -1044,11 +1398,12 @@ pf_purge_thread(void *v)
#ifdef __FreeBSD__
PF_UNLOCK();
if (locked)
- sx_xunlock(&pf_consistency_lock);
+ sx_xunlock(&V_pf_consistency_lock);
else
- sx_sunlock(&pf_consistency_lock);
+ sx_sunlock(&V_pf_consistency_lock);
#endif
}
+ CURVNET_RESTORE();
}
u_int32_t
@@ -1064,7 +1419,7 @@ pf_state_expires(const struct pf_state *state)
return (time_second);
if (state->timeout == PFTM_UNTIL_PACKET)
return (0);
-#ifdef __FreeBSD__
+#ifdef __FreeBSD__
KASSERT(state->timeout != PFTM_UNLINKED,
("pf_state_expires: timeout == PFTM_UNLINKED"));
KASSERT((state->timeout < PFTM_MAX),
@@ -1075,15 +1430,25 @@ pf_state_expires(const struct pf_state *state)
#endif
timeout = state->rule.ptr->timeout[state->timeout];
if (!timeout)
+#ifdef __FreeBSD__
+ timeout = V_pf_default_rule.timeout[state->timeout];
+#else
timeout = pf_default_rule.timeout[state->timeout];
+#endif
start = state->rule.ptr->timeout[PFTM_ADAPTIVE_START];
if (start) {
end = state->rule.ptr->timeout[PFTM_ADAPTIVE_END];
- states = state->rule.ptr->states;
+ states = state->rule.ptr->states_cur;
} else {
+#ifdef __FreeBSD__
+ start = V_pf_default_rule.timeout[PFTM_ADAPTIVE_START];
+ end = V_pf_default_rule.timeout[PFTM_ADAPTIVE_END];
+ states = V_pf_status.states;
+#else
start = pf_default_rule.timeout[PFTM_ADAPTIVE_START];
end = pf_default_rule.timeout[PFTM_ADAPTIVE_END];
states = pf_status.states;
+#endif
}
if (end && states > start && start < end) {
if (states < end)
@@ -1103,46 +1468,61 @@ void
pf_purge_expired_src_nodes(int waslocked)
#endif
{
- struct pf_src_node *cur, *next;
- int locked = waslocked;
-
- for (cur = RB_MIN(pf_src_tree, &tree_src_tracking); cur; cur = next) {
- next = RB_NEXT(pf_src_tree, &tree_src_tracking, cur);
+ struct pf_src_node *cur, *next;
+ int locked = waslocked;
- if (cur->states <= 0 && cur->expire <= time_second) {
- if (! locked) {
#ifdef __FreeBSD__
- if (!sx_try_upgrade(&pf_consistency_lock))
- return (0);
+ for (cur = RB_MIN(pf_src_tree, &V_tree_src_tracking); cur; cur = next) {
+ next = RB_NEXT(pf_src_tree, &V_tree_src_tracking, cur);
#else
- rw_enter_write(&pf_consistency_lock);
+ for (cur = RB_MIN(pf_src_tree, &tree_src_tracking); cur; cur = next) {
+ next = RB_NEXT(pf_src_tree, &tree_src_tracking, cur);
#endif
- next = RB_NEXT(pf_src_tree,
- &tree_src_tracking, cur);
- locked = 1;
- }
- if (cur->rule.ptr != NULL) {
- cur->rule.ptr->src_nodes--;
- if (cur->rule.ptr->states <= 0 &&
- cur->rule.ptr->max_src_nodes <= 0)
- pf_rm_rule(NULL, cur->rule.ptr);
- }
- RB_REMOVE(pf_src_tree, &tree_src_tracking, cur);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, cur);
- }
- }
- if (locked && !waslocked)
+ if (cur->states <= 0 && cur->expire <= time_second) {
+ if (! locked) {
#ifdef __FreeBSD__
- sx_downgrade(&pf_consistency_lock);
+ if (!sx_try_upgrade(&V_pf_consistency_lock))
+ return (0);
#else
- rw_exit_write(&pf_consistency_lock);
+ rw_enter_write(&pf_consistency_lock);
+#endif
+ next = RB_NEXT(pf_src_tree,
+#ifdef __FreeBSD__
+ &V_tree_src_tracking, cur);
+#else
+ &tree_src_tracking, cur);
+#endif
+ locked = 1;
+ }
+ if (cur->rule.ptr != NULL) {
+ cur->rule.ptr->src_nodes--;
+ if (cur->rule.ptr->states_cur <= 0 &&
+ cur->rule.ptr->max_src_nodes <= 0)
+ pf_rm_rule(NULL, cur->rule.ptr);
+ }
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_src_tree, &V_tree_src_tracking, cur);
+ V_pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
+ V_pf_status.src_nodes--;
+ pool_put(&V_pf_src_tree_pl, cur);
+#else
+ RB_REMOVE(pf_src_tree, &tree_src_tracking, cur);
+ pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
+ pf_status.src_nodes--;
+ pool_put(&pf_src_tree_pl, cur);
#endif
+ }
+ }
+ if (locked && !waslocked)
#ifdef __FreeBSD__
+ {
+ sx_downgrade(&V_pf_consistency_lock);
+ }
return (1);
+#else
+ rw_exit_write(&pf_consistency_lock);
#endif
}
@@ -1152,15 +1532,17 @@ pf_src_tree_remove_state(struct pf_state *s)
u_int32_t timeout;
if (s->src_node != NULL) {
- if (s->proto == IPPROTO_TCP) {
- if (s->src.tcp_est)
- --s->src_node->conn;
- }
+ if (s->src.tcp_est)
+ --s->src_node->conn;
if (--s->src_node->states <= 0) {
timeout = s->rule.ptr->timeout[PFTM_SRC_NODE];
if (!timeout)
timeout =
+#ifdef __FreeBSD__
+ V_pf_default_rule.timeout[PFTM_SRC_NODE];
+#else
pf_default_rule.timeout[PFTM_SRC_NODE];
+#endif
s->src_node->expire = time_second + timeout;
}
}
@@ -1169,7 +1551,11 @@ pf_src_tree_remove_state(struct pf_state *s)
timeout = s->rule.ptr->timeout[PFTM_SRC_NODE];
if (!timeout)
timeout =
+#ifdef __FreeBSD__
+ V_pf_default_rule.timeout[PFTM_SRC_NODE];
+#else
pf_default_rule.timeout[PFTM_SRC_NODE];
+#endif
s->nat_src_node->expire = time_second + timeout;
}
}
@@ -1184,29 +1570,49 @@ pf_unlink_state(struct pf_state *cur)
if (cur->local_flags & PFSTATE_EXPIRING)
return;
cur->local_flags |= PFSTATE_EXPIRING;
+#else
+ splassert(IPL_SOFTNET);
#endif
+
if (cur->src.state == PF_TCPS_PROXY_DST) {
+ /* XXX wire key the right one? */
#ifdef __FreeBSD__
- pf_send_tcp(NULL, cur->rule.ptr, cur->af,
+ pf_send_tcp(NULL, cur->rule.ptr, cur->key[PF_SK_WIRE]->af,
#else
- pf_send_tcp(cur->rule.ptr, cur->af,
+ pf_send_tcp(cur->rule.ptr, cur->key[PF_SK_WIRE]->af,
#endif
- &cur->ext.addr, &cur->lan.addr,
- cur->ext.port, cur->lan.port,
+ &cur->key[PF_SK_WIRE]->addr[1],
+ &cur->key[PF_SK_WIRE]->addr[0],
+ cur->key[PF_SK_WIRE]->port[1],
+ cur->key[PF_SK_WIRE]->port[0],
cur->src.seqhi, cur->src.seqlo + 1,
TH_RST|TH_ACK, 0, 0, 0, 1, cur->tag, NULL, NULL);
}
- RB_REMOVE(pf_state_tree_ext_gwy,
- &cur->u.s.kif->pfik_ext_gwy, cur);
- RB_REMOVE(pf_state_tree_lan_ext,
- &cur->u.s.kif->pfik_lan_ext, cur);
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_state_tree_id, &V_tree_id, cur);
+#else
RB_REMOVE(pf_state_tree_id, &tree_id, cur);
-#if NPFSYNC
- if (cur->creatorid == pf_status.hostid)
- pfsync_delete_state(cur);
+#endif
+#if NPFLOW > 0
+ if (cur->state_flags & PFSTATE_PFLOW)
+#ifdef __FreeBSD__
+ if (export_pflow_ptr != NULL)
+ export_pflow_ptr(cur);
+#else
+ export_pflow(cur);
+#endif
+#endif
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_delete_state_ptr != NULL)
+ pfsync_delete_state_ptr(cur);
+#else
+ pfsync_delete_state(cur);
+#endif
#endif
cur->timeout = PFTM_UNLINKED;
pf_src_tree_remove_state(cur);
+ pf_detach_state(cur);
}
/* callers should be at splsoftnet and hold the
@@ -1214,10 +1620,17 @@ pf_unlink_state(struct pf_state *cur)
void
pf_free_state(struct pf_state *cur)
{
-#if NPFSYNC
- if (pfsyncif != NULL &&
- (pfsyncif->sc_bulk_send_next == cur ||
- pfsyncif->sc_bulk_terminator == cur))
+#ifndef __FreeBSD__
+ splassert(IPL_SOFTNET);
+#endif
+
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_state_in_use_ptr != NULL)
+ pfsync_state_in_use_ptr(cur);
+#else
+ if (pfsync_state_in_use(cur))
+#endif
return;
#endif
#ifdef __FreeBSD__
@@ -1226,24 +1639,34 @@ pf_free_state(struct pf_state *cur)
#else
KASSERT(cur->timeout == PFTM_UNLINKED);
#endif
- if (--cur->rule.ptr->states <= 0 &&
+ if (--cur->rule.ptr->states_cur <= 0 &&
cur->rule.ptr->src_nodes <= 0)
pf_rm_rule(NULL, cur->rule.ptr);
if (cur->nat_rule.ptr != NULL)
- if (--cur->nat_rule.ptr->states <= 0 &&
+ if (--cur->nat_rule.ptr->states_cur <= 0 &&
cur->nat_rule.ptr->src_nodes <= 0)
pf_rm_rule(NULL, cur->nat_rule.ptr);
if (cur->anchor.ptr != NULL)
- if (--cur->anchor.ptr->states <= 0)
+ if (--cur->anchor.ptr->states_cur <= 0)
pf_rm_rule(NULL, cur->anchor.ptr);
pf_normalize_tcp_cleanup(cur);
- pfi_kif_unref(cur->u.s.kif, PFI_KIF_REF_STATE);
- TAILQ_REMOVE(&state_list, cur, u.s.entry_list);
+ pfi_kif_unref(cur->kif, PFI_KIF_REF_STATE);
+#ifdef __FreeBSD__
+ TAILQ_REMOVE(&V_state_list, cur, entry_list);
+#else
+ TAILQ_REMOVE(&state_list, cur, entry_list);
+#endif
if (cur->tag)
pf_tag_unref(cur->tag);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_pl, cur);
+ V_pf_status.fcounters[FCNT_STATE_REMOVALS]++;
+ V_pf_status.states--;
+#else
pool_put(&pf_state_pl, cur);
pf_status.fcounters[FCNT_STATE_REMOVALS]++;
pf_status.states--;
+#endif
}
#ifdef __FreeBSD__
@@ -1257,28 +1680,32 @@ pf_purge_expired_states(u_int32_t maxcheck)
static struct pf_state *cur = NULL;
struct pf_state *next;
#ifdef __FreeBSD__
- int locked = waslocked;
+ int locked = waslocked;
#else
- int locked = 0;
+ int locked = 0;
#endif
while (maxcheck--) {
/* wrap to start of list when we hit the end */
if (cur == NULL) {
+#ifdef __FreeBSD__
+ cur = TAILQ_FIRST(&V_state_list);
+#else
cur = TAILQ_FIRST(&state_list);
+#endif
if (cur == NULL)
break; /* list empty */
}
/* get next state, as cur may get deleted */
- next = TAILQ_NEXT(cur, u.s.entry_list);
+ next = TAILQ_NEXT(cur, entry_list);
if (cur->timeout == PFTM_UNLINKED) {
/* free unlinked state */
if (! locked) {
#ifdef __FreeBSD__
- if (!sx_try_upgrade(&pf_consistency_lock))
- return (0);
+ if (!sx_try_upgrade(&V_pf_consistency_lock))
+ return (0);
#else
rw_enter_write(&pf_consistency_lock);
#endif
@@ -1290,8 +1717,8 @@ pf_purge_expired_states(u_int32_t maxcheck)
pf_unlink_state(cur);
if (! locked) {
#ifdef __FreeBSD__
- if (!sx_try_upgrade(&pf_consistency_lock))
- return (0);
+ if (!sx_try_upgrade(&V_pf_consistency_lock))
+ return (0);
#else
rw_enter_write(&pf_consistency_lock);
#endif
@@ -1304,7 +1731,7 @@ pf_purge_expired_states(u_int32_t maxcheck)
#ifdef __FreeBSD__
if (!waslocked && locked)
- sx_downgrade(&pf_consistency_lock);
+ sx_downgrade(&V_pf_consistency_lock);
return (1);
#else
@@ -1318,7 +1745,7 @@ pf_tbladdr_setup(struct pf_ruleset *rs, struct pf_addr_wrap *aw)
{
if (aw->type != PF_ADDR_TABLE)
return (0);
- if ((aw->p.tbl = pfr_attach_table(rs, aw->v.tblname)) == NULL)
+ if ((aw->p.tbl = pfr_attach_table(rs, aw->v.tblname, 1)) == NULL)
return (1);
return (0);
}
@@ -1365,34 +1792,33 @@ pf_print_host(struct pf_addr *addr, u_int16_t p, sa_family_t af)
#ifdef INET6
case AF_INET6: {
u_int16_t b;
- u_int8_t i, curstart = 255, curend = 0,
- maxstart = 0, maxend = 0;
+ u_int8_t i, curstart, curend, maxstart, maxend;
+ curstart = curend = maxstart = maxend = 255;
for (i = 0; i < 8; i++) {
if (!addr->addr16[i]) {
if (curstart == 255)
curstart = i;
- else
- curend = i;
+ curend = i;
} else {
- if (curstart) {
- if ((curend - curstart) >
- (maxend - maxstart)) {
- maxstart = curstart;
- maxend = curend;
- curstart = 255;
- }
+ if ((curend - curstart) >
+ (maxend - maxstart)) {
+ maxstart = curstart;
+ maxend = curend;
}
+ curstart = curend = 255;
}
}
+ if ((curend - curstart) >
+ (maxend - maxstart)) {
+ maxstart = curstart;
+ maxend = curend;
+ }
for (i = 0; i < 8; i++) {
if (i >= maxstart && i <= maxend) {
- if (maxend != 7) {
- if (i == maxstart)
- printf(":");
- } else {
- if (i == maxend)
- printf(":");
- }
+ if (i == 0)
+ printf(":");
+ if (i == maxend)
+ printf(":");
} else {
b = ntohs(addr->addr16[i]);
printf("%x", b);
@@ -1413,39 +1839,87 @@ pf_print_host(struct pf_addr *addr, u_int16_t p, sa_family_t af)
void
pf_print_state(struct pf_state *s)
{
- switch (s->proto) {
+ pf_print_state_parts(s, NULL, NULL);
+}
+
+void
+pf_print_state_parts(struct pf_state *s,
+ struct pf_state_key *skwp, struct pf_state_key *sksp)
+{
+ struct pf_state_key *skw, *sks;
+ u_int8_t proto, dir;
+
+ /* Do our best to fill these, but they're skipped if NULL */
+ skw = skwp ? skwp : (s ? s->key[PF_SK_WIRE] : NULL);
+ sks = sksp ? sksp : (s ? s->key[PF_SK_STACK] : NULL);
+ proto = skw ? skw->proto : (sks ? sks->proto : 0);
+ dir = s ? s->direction : 0;
+
+ switch (proto) {
+ case IPPROTO_IPV4:
+ printf("IPv4");
+ break;
+ case IPPROTO_IPV6:
+ printf("IPv6");
+ break;
case IPPROTO_TCP:
- printf("TCP ");
+ printf("TCP");
break;
case IPPROTO_UDP:
- printf("UDP ");
+ printf("UDP");
break;
case IPPROTO_ICMP:
- printf("ICMP ");
+ printf("ICMP");
break;
case IPPROTO_ICMPV6:
- printf("ICMPV6 ");
+ printf("ICMPv6");
break;
default:
- printf("%u ", s->proto);
+ printf("%u", skw->proto);
break;
}
- pf_print_host(&s->lan.addr, s->lan.port, s->af);
- printf(" ");
- pf_print_host(&s->gwy.addr, s->gwy.port, s->af);
- printf(" ");
- pf_print_host(&s->ext.addr, s->ext.port, s->af);
- printf(" [lo=%u high=%u win=%u modulator=%u", s->src.seqlo,
- s->src.seqhi, s->src.max_win, s->src.seqdiff);
- if (s->src.wscale && s->dst.wscale)
- printf(" wscale=%u", s->src.wscale & PF_WSCALE_MASK);
- printf("]");
- printf(" [lo=%u high=%u win=%u modulator=%u", s->dst.seqlo,
- s->dst.seqhi, s->dst.max_win, s->dst.seqdiff);
- if (s->src.wscale && s->dst.wscale)
- printf(" wscale=%u", s->dst.wscale & PF_WSCALE_MASK);
- printf("]");
- printf(" %u:%u", s->src.state, s->dst.state);
+ switch (dir) {
+ case PF_IN:
+ printf(" in");
+ break;
+ case PF_OUT:
+ printf(" out");
+ break;
+ }
+ if (skw) {
+ printf(" wire: ");
+ pf_print_host(&skw->addr[0], skw->port[0], skw->af);
+ printf(" ");
+ pf_print_host(&skw->addr[1], skw->port[1], skw->af);
+ }
+ if (sks) {
+ printf(" stack: ");
+ if (sks != skw) {
+ pf_print_host(&sks->addr[0], sks->port[0], sks->af);
+ printf(" ");
+ pf_print_host(&sks->addr[1], sks->port[1], sks->af);
+ } else
+ printf("-");
+ }
+ if (s) {
+ if (proto == IPPROTO_TCP) {
+ printf(" [lo=%u high=%u win=%u modulator=%u",
+ s->src.seqlo, s->src.seqhi,
+ s->src.max_win, s->src.seqdiff);
+ if (s->src.wscale && s->dst.wscale)
+ printf(" wscale=%u",
+ s->src.wscale & PF_WSCALE_MASK);
+ printf("]");
+ printf(" [lo=%u high=%u win=%u modulator=%u",
+ s->dst.seqlo, s->dst.seqhi,
+ s->dst.max_win, s->dst.seqdiff);
+ if (s->src.wscale && s->dst.wscale)
+ printf(" wscale=%u",
+ s->dst.wscale & PF_WSCALE_MASK);
+ printf("]");
+ }
+ printf(" %u:%u", s->src.state, s->dst.state);
+ }
}
void
@@ -1528,6 +2002,7 @@ pf_addr_wrap_neq(struct pf_addr_wrap *aw1, struct pf_addr_wrap *aw2)
return (1);
switch (aw1->type) {
case PF_ADDR_ADDRMASK:
+ case PF_ADDR_RANGE:
if (PF_ANEQ(&aw1->v.a.addr, &aw2->v.a.addr, 0))
return (1);
if (PF_ANEQ(&aw1->v.a.mask, &aw2->v.a.mask, 0))
@@ -1651,12 +2126,13 @@ pf_change_icmp(struct pf_addr *ia, u_int16_t *ip, struct pf_addr *oa,
struct pf_addr oia, ooa;
PF_ACPY(&oia, ia, af);
- PF_ACPY(&ooa, oa, af);
+ if (oa)
+ PF_ACPY(&ooa, oa, af);
/* Change inner protocol port, fix inner protocol checksum. */
if (ip != NULL) {
u_int16_t oip = *ip;
- u_int32_t opc = 0; /* make the compiler happy */
+ u_int32_t opc;
if (pc != NULL)
opc = *pc;
@@ -1700,31 +2176,33 @@ pf_change_icmp(struct pf_addr *ia, u_int16_t *ip, struct pf_addr *oa,
break;
#endif /* INET6 */
}
- /* Change outer ip address, fix outer ip or icmpv6 checksum. */
- PF_ACPY(oa, na, af);
- switch (af) {
+ /* Outer ip address, fix outer ip or icmpv6 checksum, if necessary. */
+ if (oa) {
+ PF_ACPY(oa, na, af);
+ switch (af) {
#ifdef INET
- case AF_INET:
- *hc = pf_cksum_fixup(pf_cksum_fixup(*hc,
- ooa.addr16[0], oa->addr16[0], 0),
- ooa.addr16[1], oa->addr16[1], 0);
- break;
+ case AF_INET:
+ *hc = pf_cksum_fixup(pf_cksum_fixup(*hc,
+ ooa.addr16[0], oa->addr16[0], 0),
+ ooa.addr16[1], oa->addr16[1], 0);
+ break;
#endif /* INET */
#ifdef INET6
- case AF_INET6:
- *ic = pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(
- pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(
- pf_cksum_fixup(pf_cksum_fixup(*ic,
- ooa.addr16[0], oa->addr16[0], u),
- ooa.addr16[1], oa->addr16[1], u),
- ooa.addr16[2], oa->addr16[2], u),
- ooa.addr16[3], oa->addr16[3], u),
- ooa.addr16[4], oa->addr16[4], u),
- ooa.addr16[5], oa->addr16[5], u),
- ooa.addr16[6], oa->addr16[6], u),
- ooa.addr16[7], oa->addr16[7], u);
- break;
+ case AF_INET6:
+ *ic = pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(
+ pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(
+ pf_cksum_fixup(pf_cksum_fixup(*ic,
+ ooa.addr16[0], oa->addr16[0], u),
+ ooa.addr16[1], oa->addr16[1], u),
+ ooa.addr16[2], oa->addr16[2], u),
+ ooa.addr16[3], oa->addr16[3], u),
+ ooa.addr16[4], oa->addr16[4], u),
+ ooa.addr16[5], oa->addr16[5], u),
+ ooa.addr16[6], oa->addr16[6], u),
+ ooa.addr16[7], oa->addr16[7], u);
+ break;
#endif /* INET6 */
+ }
}
}
@@ -1746,7 +2224,7 @@ pf_modulate_sack(struct mbuf *m, int off, struct pf_pdesc *pd,
int copyback = 0, i, olen;
struct sackblk sack;
-#define TCPOLEN_SACKLEN (TCPOLEN_SACK + 2)
+#define TCPOLEN_SACKLEN (TCPOLEN_SACK + 2)
if (hlen < TCPOLEN_SACKLEN ||
!pf_pull_hdr(m, off + sizeof(*th), opts, hlen, NULL, NULL, pd->af))
return 0;
@@ -1815,9 +2293,9 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
#endif /* INET6 */
struct tcphdr *th;
char *opt;
- struct pf_mtag *pf_mtag;
-
#ifdef __FreeBSD__
+ struct pf_mtag *pf_mtag;
+
KASSERT(
#ifdef INET
af == AF_INET
@@ -1839,7 +2317,7 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
#ifdef INET6
h6 = NULL;
#endif
-#endif
+#endif /* __FreeBSD__ */
/* maximum segment size tcp option */
tlen = sizeof(struct tcphdr);
@@ -1865,42 +2343,46 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
return;
#ifdef __FreeBSD__
#ifdef MAC
- if (replyto)
- mac_netinet_firewall_reply(replyto, m);
- else
- mac_netinet_firewall_send(m);
-#else
- (void)replyto;
-#endif
+ mac_netinet_firewall_send(m);
#endif
if ((pf_mtag = pf_get_mtag(m)) == NULL) {
m_freem(m);
return;
}
+#endif
if (tag)
#ifdef __FreeBSD__
m->m_flags |= M_SKIP_FIREWALL;
+ pf_mtag->tag = rtag;
#else
- pf_mtag->flags |= PF_TAG_GENERATED;
+ m->m_pkthdr.pf.flags |= PF_TAG_GENERATED;
+ m->m_pkthdr.pf.tag = rtag;
#endif
- pf_mtag->tag = rtag;
-
if (r != NULL && r->rtableid >= 0)
#ifdef __FreeBSD__
{
M_SETFIB(m, r->rtableid);
-#endif
pf_mtag->rtableid = r->rtableid;
+#else
+ m->m_pkthdr.pf.rtableid = r->rtableid;
+#endif
#ifdef __FreeBSD__
}
#endif
+
#ifdef ALTQ
if (r != NULL && r->qid) {
+#ifdef __FreeBSD__
pf_mtag->qid = r->qid;
+
/* add hints for ecn */
- pf_mtag->af = af;
pf_mtag->hdr = mtod(m, struct ip *);
+#else
+ m->m_pkthdr.pf.qid = r->qid;
+ /* add hints for ecn */
+ m->m_pkthdr.pf.hdr = mtod(m, struct ip *);
+#endif
}
#endif /* ALTQ */
m->m_data += max_linkhdr;
@@ -1966,18 +2448,19 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
#ifdef __FreeBSD__
h->ip_off = V_path_mtu_discovery ? IP_DF : 0;
h->ip_len = len;
+ h->ip_ttl = ttl ? ttl : V_ip_defttl;
#else
- h->ip_off = htons(ip_mtudisc ? IP_DF : 0);
h->ip_len = htons(len);
+ h->ip_off = htons(ip_mtudisc ? IP_DF : 0);
+ h->ip_ttl = ttl ? ttl : ip_defttl;
#endif
- h->ip_ttl = ttl ? ttl : V_ip_defttl;
h->ip_sum = 0;
if (eh == NULL) {
#ifdef __FreeBSD__
- PF_UNLOCK();
- ip_output(m, (void *)NULL, (void *)NULL, 0,
- (void *)NULL, (void *)NULL);
- PF_LOCK();
+ PF_UNLOCK();
+ ip_output(m, (void *)NULL, (void *)NULL, 0,
+ (void *)NULL, (void *)NULL);
+ PF_LOCK();
#else /* ! __FreeBSD__ */
ip_output(m, (void *)NULL, (void *)NULL, 0,
(void *)NULL, (void *)NULL);
@@ -2025,23 +2508,23 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL);
PF_LOCK();
#else
- ip6_output(m, NULL, NULL, 0, NULL, NULL);
+ ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL);
#endif
break;
#endif /* INET6 */
}
}
-void
+static void
pf_send_icmp(struct mbuf *m, u_int8_t type, u_int8_t code, sa_family_t af,
struct pf_rule *r)
{
- struct pf_mtag *pf_mtag;
struct mbuf *m0;
#ifdef __FreeBSD__
#ifdef INET
struct ip *ip;
#endif
+ struct pf_mtag *pf_mtag;
#endif
#ifdef __FreeBSD__
@@ -2049,33 +2532,42 @@ pf_send_icmp(struct mbuf *m, u_int8_t type, u_int8_t code, sa_family_t af,
if (m0 == NULL)
return;
#else
- m0 = m_copy(m, 0, M_COPYALL);
+ if ((m0 = m_copy(m, 0, M_COPYALL)) == NULL)
+ return;
#endif
+
+#ifdef __FreeBSD__
if ((pf_mtag = pf_get_mtag(m0)) == NULL)
return;
-#ifdef __FreeBSD__
/* XXX: revisit */
m0->m_flags |= M_SKIP_FIREWALL;
#else
- pf_mtag->flags |= PF_TAG_GENERATED;
+ m0->m_pkthdr.pf.flags |= PF_TAG_GENERATED;
#endif
if (r->rtableid >= 0)
#ifdef __FreeBSD__
{
M_SETFIB(m0, r->rtableid);
-#endif
pf_mtag->rtableid = r->rtableid;
+#else
+ m0->m_pkthdr.pf.rtableid = r->rtableid;
+#endif
#ifdef __FreeBSD__
}
#endif
#ifdef ALTQ
if (r->qid) {
+#ifdef __FreeBSD__
pf_mtag->qid = r->qid;
/* add hints for ecn */
- pf_mtag->af = af;
pf_mtag->hdr = mtod(m0, struct ip *);
+#else
+ m0->m_pkthdr.pf.qid = r->qid;
+ /* add hints for ecn */
+ m0->m_pkthdr.pf.hdr = mtod(m0, struct ip *);
+#endif
}
#endif /* ALTQ */
@@ -2155,6 +2647,44 @@ pf_match_addr(u_int8_t n, struct pf_addr *a, struct pf_addr *m,
}
}
+/*
+ * Return 1 if b <= a <= e, otherwise return 0.
+ */
+int
+pf_match_addr_range(struct pf_addr *b, struct pf_addr *e,
+ struct pf_addr *a, sa_family_t af)
+{
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ if ((a->addr32[0] < b->addr32[0]) ||
+ (a->addr32[0] > e->addr32[0]))
+ return (0);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6: {
+ int i;
+
+ /* check a >= b */
+ for (i = 0; i < 4; ++i)
+ if (a->addr32[i] > b->addr32[i])
+ break;
+ else if (a->addr32[i] < b->addr32[i])
+ return (0);
+ /* check a <= e */
+ for (i = 0; i < 4; ++i)
+ if (a->addr32[i] < e->addr32[i])
+ break;
+ else if (a->addr32[i] > e->addr32[i])
+ return (0);
+ break;
+ }
+#endif /* INET6 */
+ }
+ return (1);
+}
+
int
pf_match(u_int8_t op, u_int32_t a1, u_int32_t a2, u_int32_t p)
{
@@ -2206,88 +2736,80 @@ pf_match_gid(u_int8_t op, gid_t a1, gid_t a2, gid_t g)
return (pf_match(op, a1, a2, g));
}
-#ifndef __FreeBSD__
-struct pf_mtag *
-pf_find_mtag(struct mbuf *m)
-{
- struct m_tag *mtag;
-
- if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) == NULL)
- return (NULL);
-
- return ((struct pf_mtag *)(mtag + 1));
-}
-
-struct pf_mtag *
-pf_get_mtag(struct mbuf *m)
-{
- struct m_tag *mtag;
-
- if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) == NULL) {
- mtag = m_tag_get(PACKET_TAG_PF, sizeof(struct pf_mtag),
- M_NOWAIT);
- if (mtag == NULL)
- return (NULL);
- bzero(mtag + 1, sizeof(struct pf_mtag));
- m_tag_prepend(m, mtag);
- }
-
- return ((struct pf_mtag *)(mtag + 1));
-}
-#endif
-
int
-pf_match_tag(struct mbuf *m, struct pf_rule *r, struct pf_mtag *pf_mtag,
- int *tag)
+#ifdef __FreeBSD__
+pf_match_tag(struct mbuf *m, struct pf_rule *r, int *tag,
+ struct pf_mtag *pf_mtag)
+#else
+pf_match_tag(struct mbuf *m, struct pf_rule *r, int *tag)
+#endif
{
if (*tag == -1)
+#ifdef __FreeBSD__
*tag = pf_mtag->tag;
+#else
+ *tag = m->m_pkthdr.pf.tag;
+#endif
return ((!r->match_tag_not && r->match_tag == *tag) ||
(r->match_tag_not && r->match_tag != *tag));
}
int
-pf_tag_packet(struct mbuf *m, struct pf_mtag *pf_mtag, int tag, int rtableid)
+#ifdef __FreeBSD__
+pf_tag_packet(struct mbuf *m, int tag, int rtableid,
+ struct pf_mtag *pf_mtag)
+#else
+pf_tag_packet(struct mbuf *m, int tag, int rtableid)
+#endif
{
if (tag <= 0 && rtableid < 0)
return (0);
- if (pf_mtag == NULL)
- if ((pf_mtag = pf_get_mtag(m)) == NULL)
- return (1);
if (tag > 0)
+#ifdef __FreeBSD__
pf_mtag->tag = tag;
+#else
+ m->m_pkthdr.pf.tag = tag;
+#endif
if (rtableid >= 0)
#ifdef __FreeBSD__
{
M_SETFIB(m, rtableid);
-#endif
- pf_mtag->rtableid = rtableid;
-#ifdef __FreeBSD__
}
+#else
+ m->m_pkthdr.pf.rtableid = rtableid;
#endif
return (0);
}
-static void
+void
pf_step_into_anchor(int *depth, struct pf_ruleset **rs, int n,
- struct pf_rule **r, struct pf_rule **a, int *match)
+ struct pf_rule **r, struct pf_rule **a, int *match)
{
struct pf_anchor_stackframe *f;
(*r)->anchor->match = 0;
if (match)
*match = 0;
+#ifdef __FreeBSD__
+ if (*depth >= sizeof(V_pf_anchor_stack) /
+ sizeof(V_pf_anchor_stack[0])) {
+#else
if (*depth >= sizeof(pf_anchor_stack) /
sizeof(pf_anchor_stack[0])) {
+#endif
printf("pf_step_into_anchor: stack overflow\n");
*r = TAILQ_NEXT(*r, entries);
return;
} else if (*depth == 0 && a != NULL)
*a = *r;
+#ifdef __FreeBSD__
+ f = V_pf_anchor_stack + (*depth)++;
+#else
f = pf_anchor_stack + (*depth)++;
+#endif
f->rs = *rs;
f->r = *r;
if ((*r)->anchor_wildcard) {
@@ -2316,7 +2838,11 @@ pf_step_out_of_anchor(int *depth, struct pf_ruleset **rs, int n,
do {
if (*depth <= 0)
break;
+#ifdef __FreeBSD__
+ f = V_pf_anchor_stack + *depth - 1;
+#else
f = pf_anchor_stack + *depth - 1;
+#endif
if (f->parent != NULL && f->child != NULL) {
if (f->child->match ||
(match != NULL && *match)) {
@@ -2337,7 +2863,7 @@ pf_step_out_of_anchor(int *depth, struct pf_ruleset **rs, int n,
if (*depth == 0 && a != NULL)
*a = NULL;
*rs = f->rs;
- if (f->r->anchor->match || (match != NULL && *match))
+ if (f->r->anchor->match || (match != NULL && *match))
quick = f->r->quick;
*r = TAILQ_NEXT(f->r, entries);
} while (*r == NULL);
@@ -2402,567 +2928,6 @@ pf_addr_inc(struct pf_addr *addr, sa_family_t af)
}
#endif /* INET6 */
-#define mix(a,b,c) \
- do { \
- a -= b; a -= c; a ^= (c >> 13); \
- b -= c; b -= a; b ^= (a << 8); \
- c -= a; c -= b; c ^= (b >> 13); \
- a -= b; a -= c; a ^= (c >> 12); \
- b -= c; b -= a; b ^= (a << 16); \
- c -= a; c -= b; c ^= (b >> 5); \
- a -= b; a -= c; a ^= (c >> 3); \
- b -= c; b -= a; b ^= (a << 10); \
- c -= a; c -= b; c ^= (b >> 15); \
- } while (0)
-
-/*
- * hash function based on bridge_hash in if_bridge.c
- */
-void
-pf_hash(struct pf_addr *inaddr, struct pf_addr *hash,
- struct pf_poolhashkey *key, sa_family_t af)
-{
- u_int32_t a = 0x9e3779b9, b = 0x9e3779b9, c = key->key32[0];
-
- switch (af) {
-#ifdef INET
- case AF_INET:
- a += inaddr->addr32[0];
- b += key->key32[1];
- mix(a, b, c);
- hash->addr32[0] = c + key->key32[2];
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- a += inaddr->addr32[0];
- b += inaddr->addr32[2];
- mix(a, b, c);
- hash->addr32[0] = c;
- a += inaddr->addr32[1];
- b += inaddr->addr32[3];
- c += key->key32[1];
- mix(a, b, c);
- hash->addr32[1] = c;
- a += inaddr->addr32[2];
- b += inaddr->addr32[1];
- c += key->key32[2];
- mix(a, b, c);
- hash->addr32[2] = c;
- a += inaddr->addr32[3];
- b += inaddr->addr32[0];
- c += key->key32[3];
- mix(a, b, c);
- hash->addr32[3] = c;
- break;
-#endif /* INET6 */
- }
-}
-
-int
-pf_map_addr(sa_family_t af, struct pf_rule *r, struct pf_addr *saddr,
- struct pf_addr *naddr, struct pf_addr *init_addr, struct pf_src_node **sn)
-{
- unsigned char hash[16];
- struct pf_pool *rpool = &r->rpool;
- struct pf_addr *raddr = &rpool->cur->addr.v.a.addr;
- struct pf_addr *rmask = &rpool->cur->addr.v.a.mask;
- struct pf_pooladdr *acur = rpool->cur;
- struct pf_src_node k;
-
- if (*sn == NULL && r->rpool.opts & PF_POOL_STICKYADDR &&
- (r->rpool.opts & PF_POOL_TYPEMASK) != PF_POOL_NONE) {
- k.af = af;
- PF_ACPY(&k.addr, saddr, af);
- if (r->rule_flag & PFRULE_RULESRCTRACK ||
- r->rpool.opts & PF_POOL_STICKYADDR)
- k.rule.ptr = r;
- else
- k.rule.ptr = NULL;
- pf_status.scounters[SCNT_SRC_NODE_SEARCH]++;
- *sn = RB_FIND(pf_src_tree, &tree_src_tracking, &k);
- if (*sn != NULL && !PF_AZERO(&(*sn)->raddr, af)) {
- PF_ACPY(naddr, &(*sn)->raddr, af);
- if (pf_status.debug >= PF_DEBUG_MISC) {
- printf("pf_map_addr: src tracking maps ");
- pf_print_host(&k.addr, 0, af);
- printf(" to ");
- pf_print_host(naddr, 0, af);
- printf("\n");
- }
- return (0);
- }
- }
-
- if (rpool->cur->addr.type == PF_ADDR_NOROUTE)
- return (1);
- if (rpool->cur->addr.type == PF_ADDR_DYNIFTL) {
- switch (af) {
-#ifdef INET
- case AF_INET:
- if (rpool->cur->addr.p.dyn->pfid_acnt4 < 1 &&
- (rpool->opts & PF_POOL_TYPEMASK) !=
- PF_POOL_ROUNDROBIN)
- return (1);
- raddr = &rpool->cur->addr.p.dyn->pfid_addr4;
- rmask = &rpool->cur->addr.p.dyn->pfid_mask4;
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- if (rpool->cur->addr.p.dyn->pfid_acnt6 < 1 &&
- (rpool->opts & PF_POOL_TYPEMASK) !=
- PF_POOL_ROUNDROBIN)
- return (1);
- raddr = &rpool->cur->addr.p.dyn->pfid_addr6;
- rmask = &rpool->cur->addr.p.dyn->pfid_mask6;
- break;
-#endif /* INET6 */
- }
- } else if (rpool->cur->addr.type == PF_ADDR_TABLE) {
- if ((rpool->opts & PF_POOL_TYPEMASK) != PF_POOL_ROUNDROBIN)
- return (1); /* unsupported */
- } else {
- raddr = &rpool->cur->addr.v.a.addr;
- rmask = &rpool->cur->addr.v.a.mask;
- }
-
- switch (rpool->opts & PF_POOL_TYPEMASK) {
- case PF_POOL_NONE:
- PF_ACPY(naddr, raddr, af);
- break;
- case PF_POOL_BITMASK:
- PF_POOLMASK(naddr, raddr, rmask, saddr, af);
- break;
- case PF_POOL_RANDOM:
- if (init_addr != NULL && PF_AZERO(init_addr, af)) {
- switch (af) {
-#ifdef INET
- case AF_INET:
- rpool->counter.addr32[0] = htonl(arc4random());
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- if (rmask->addr32[3] != 0xffffffff)
- rpool->counter.addr32[3] =
- htonl(arc4random());
- else
- break;
- if (rmask->addr32[2] != 0xffffffff)
- rpool->counter.addr32[2] =
- htonl(arc4random());
- else
- break;
- if (rmask->addr32[1] != 0xffffffff)
- rpool->counter.addr32[1] =
- htonl(arc4random());
- else
- break;
- if (rmask->addr32[0] != 0xffffffff)
- rpool->counter.addr32[0] =
- htonl(arc4random());
- break;
-#endif /* INET6 */
- }
- PF_POOLMASK(naddr, raddr, rmask, &rpool->counter, af);
- PF_ACPY(init_addr, naddr, af);
-
- } else {
- PF_AINC(&rpool->counter, af);
- PF_POOLMASK(naddr, raddr, rmask, &rpool->counter, af);
- }
- break;
- case PF_POOL_SRCHASH:
- pf_hash(saddr, (struct pf_addr *)&hash, &rpool->key, af);
- PF_POOLMASK(naddr, raddr, rmask, (struct pf_addr *)&hash, af);
- break;
- case PF_POOL_ROUNDROBIN:
- if (rpool->cur->addr.type == PF_ADDR_TABLE) {
- if (!pfr_pool_get(rpool->cur->addr.p.tbl,
- &rpool->tblidx, &rpool->counter,
- &raddr, &rmask, af))
- goto get_addr;
- } else if (rpool->cur->addr.type == PF_ADDR_DYNIFTL) {
- if (!pfr_pool_get(rpool->cur->addr.p.dyn->pfid_kt,
- &rpool->tblidx, &rpool->counter,
- &raddr, &rmask, af))
- goto get_addr;
- } else if (pf_match_addr(0, raddr, rmask, &rpool->counter, af))
- goto get_addr;
-
- try_next:
- if ((rpool->cur = TAILQ_NEXT(rpool->cur, entries)) == NULL)
- rpool->cur = TAILQ_FIRST(&rpool->list);
- if (rpool->cur->addr.type == PF_ADDR_TABLE) {
- rpool->tblidx = -1;
- if (pfr_pool_get(rpool->cur->addr.p.tbl,
- &rpool->tblidx, &rpool->counter,
- &raddr, &rmask, af)) {
- /* table contains no address of type 'af' */
- if (rpool->cur != acur)
- goto try_next;
- return (1);
- }
- } else if (rpool->cur->addr.type == PF_ADDR_DYNIFTL) {
- rpool->tblidx = -1;
- if (pfr_pool_get(rpool->cur->addr.p.dyn->pfid_kt,
- &rpool->tblidx, &rpool->counter,
- &raddr, &rmask, af)) {
- /* table contains no address of type 'af' */
- if (rpool->cur != acur)
- goto try_next;
- return (1);
- }
- } else {
- raddr = &rpool->cur->addr.v.a.addr;
- rmask = &rpool->cur->addr.v.a.mask;
- PF_ACPY(&rpool->counter, raddr, af);
- }
-
- get_addr:
- PF_ACPY(naddr, &rpool->counter, af);
- if (init_addr != NULL && PF_AZERO(init_addr, af))
- PF_ACPY(init_addr, naddr, af);
- PF_AINC(&rpool->counter, af);
- break;
- }
- if (*sn != NULL)
- PF_ACPY(&(*sn)->raddr, naddr, af);
-
- if (pf_status.debug >= PF_DEBUG_MISC &&
- (rpool->opts & PF_POOL_TYPEMASK) != PF_POOL_NONE) {
- printf("pf_map_addr: selected address ");
- pf_print_host(naddr, 0, af);
- printf("\n");
- }
-
- return (0);
-}
-
-int
-pf_get_sport(sa_family_t af, u_int8_t proto, struct pf_rule *r,
- struct pf_addr *saddr, struct pf_addr *daddr, u_int16_t dport,
- struct pf_addr *naddr, u_int16_t *nport, u_int16_t low, u_int16_t high,
- struct pf_src_node **sn)
-{
- struct pf_state_cmp key;
- struct pf_addr init_addr;
- u_int16_t cut;
-
- bzero(&init_addr, sizeof(init_addr));
- if (pf_map_addr(af, r, saddr, naddr, &init_addr, sn))
- return (1);
-
- if (proto == IPPROTO_ICMP) {
- low = 1;
- high = 65535;
- }
-
- do {
- key.af = af;
- key.proto = proto;
- PF_ACPY(&key.ext.addr, daddr, key.af);
- PF_ACPY(&key.gwy.addr, naddr, key.af);
- key.ext.port = dport;
-
- /*
- * port search; start random, step;
- * similar 2 portloop in in_pcbbind
- */
- if (!(proto == IPPROTO_TCP || proto == IPPROTO_UDP ||
- proto == IPPROTO_ICMP)) {
- key.gwy.port = dport;
- if (pf_find_state_all(&key, PF_EXT_GWY, NULL) == NULL)
- return (0);
- } else if (low == 0 && high == 0) {
- key.gwy.port = *nport;
- if (pf_find_state_all(&key, PF_EXT_GWY, NULL) == NULL)
- return (0);
- } else if (low == high) {
- key.gwy.port = htons(low);
- if (pf_find_state_all(&key, PF_EXT_GWY, NULL) == NULL) {
- *nport = htons(low);
- return (0);
- }
- } else {
- u_int16_t tmp;
-
- if (low > high) {
- tmp = low;
- low = high;
- high = tmp;
- }
- /* low < high */
- cut = htonl(arc4random()) % (1 + high - low) + low;
- /* low <= cut <= high */
- for (tmp = cut; tmp <= high; ++(tmp)) {
- key.gwy.port = htons(tmp);
- if (pf_find_state_all(&key, PF_EXT_GWY, NULL) ==
- NULL) {
- *nport = htons(tmp);
- return (0);
- }
- }
- for (tmp = cut - 1; tmp >= low; --(tmp)) {
- key.gwy.port = htons(tmp);
- if (pf_find_state_all(&key, PF_EXT_GWY, NULL) ==
- NULL) {
- *nport = htons(tmp);
- return (0);
- }
- }
- }
-
- switch (r->rpool.opts & PF_POOL_TYPEMASK) {
- case PF_POOL_RANDOM:
- case PF_POOL_ROUNDROBIN:
- if (pf_map_addr(af, r, saddr, naddr, &init_addr, sn))
- return (1);
- break;
- case PF_POOL_NONE:
- case PF_POOL_SRCHASH:
- case PF_POOL_BITMASK:
- default:
- return (1);
- }
- } while (! PF_AEQ(&init_addr, naddr, af) );
-
- return (1); /* none available */
-}
-
-struct pf_rule *
-pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
- int direction, struct pfi_kif *kif, struct pf_addr *saddr, u_int16_t sport,
- struct pf_addr *daddr, u_int16_t dport, int rs_num)
-{
- struct pf_rule *r, *rm = NULL;
- struct pf_ruleset *ruleset = NULL;
- int tag = -1;
- int rtableid = -1;
- int asd = 0;
-
- r = TAILQ_FIRST(pf_main_ruleset.rules[rs_num].active.ptr);
- while (r && rm == NULL) {
- struct pf_rule_addr *src = NULL, *dst = NULL;
- struct pf_addr_wrap *xdst = NULL;
-
- if (r->action == PF_BINAT && direction == PF_IN) {
- src = &r->dst;
- if (r->rpool.cur != NULL)
- xdst = &r->rpool.cur->addr;
- } else {
- src = &r->src;
- dst = &r->dst;
- }
-
- r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
- r = r->skip[PF_SKIP_IFP].ptr;
- else if (r->direction && r->direction != direction)
- r = r->skip[PF_SKIP_DIR].ptr;
- else if (r->af && r->af != pd->af)
- r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != pd->proto)
- r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&src->addr, saddr, pd->af,
- src->neg, kif))
- r = r->skip[src == &r->src ? PF_SKIP_SRC_ADDR :
- PF_SKIP_DST_ADDR].ptr;
- else if (src->port_op && !pf_match_port(src->port_op,
- src->port[0], src->port[1], sport))
- r = r->skip[src == &r->src ? PF_SKIP_SRC_PORT :
- PF_SKIP_DST_PORT].ptr;
- else if (dst != NULL &&
- PF_MISMATCHAW(&dst->addr, daddr, pd->af, dst->neg, NULL))
- r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (xdst != NULL && PF_MISMATCHAW(xdst, daddr, pd->af,
- 0, NULL))
- r = TAILQ_NEXT(r, entries);
- else if (dst != NULL && dst->port_op &&
- !pf_match_port(dst->port_op, dst->port[0],
- dst->port[1], dport))
- r = r->skip[PF_SKIP_DST_PORT].ptr;
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
- r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY && (pd->proto !=
- IPPROTO_TCP || !pf_osfp_match(pf_osfp_fingerprint(pd, m,
- off, pd->hdr.tcp), r->os_fingerprint)))
- r = TAILQ_NEXT(r, entries);
- else {
- if (r->tag)
- tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
- if (r->anchor == NULL) {
- rm = r;
- } else
- pf_step_into_anchor(&asd, &ruleset, rs_num,
- &r, NULL, NULL);
- }
- if (r == NULL)
- pf_step_out_of_anchor(&asd, &ruleset, rs_num, &r,
- NULL, NULL);
- }
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid))
- return (NULL);
- if (rm != NULL && (rm->action == PF_NONAT ||
- rm->action == PF_NORDR || rm->action == PF_NOBINAT))
- return (NULL);
- return (rm);
-}
-
-struct pf_rule *
-pf_get_translation(struct pf_pdesc *pd, struct mbuf *m, int off, int direction,
- struct pfi_kif *kif, struct pf_src_node **sn,
- struct pf_addr *saddr, u_int16_t sport,
- struct pf_addr *daddr, u_int16_t dport,
- struct pf_addr *naddr, u_int16_t *nport)
-{
- struct pf_rule *r = NULL;
-
- if (direction == PF_OUT) {
- r = pf_match_translation(pd, m, off, direction, kif, saddr,
- sport, daddr, dport, PF_RULESET_BINAT);
- if (r == NULL)
- r = pf_match_translation(pd, m, off, direction, kif,
- saddr, sport, daddr, dport, PF_RULESET_NAT);
- } else {
- r = pf_match_translation(pd, m, off, direction, kif, saddr,
- sport, daddr, dport, PF_RULESET_RDR);
- if (r == NULL)
- r = pf_match_translation(pd, m, off, direction, kif,
- saddr, sport, daddr, dport, PF_RULESET_BINAT);
- }
-
- if (r != NULL) {
- switch (r->action) {
- case PF_NONAT:
- case PF_NOBINAT:
- case PF_NORDR:
- return (NULL);
- case PF_NAT:
- if (pf_get_sport(pd->af, pd->proto, r, saddr,
- daddr, dport, naddr, nport, r->rpool.proxy_port[0],
- r->rpool.proxy_port[1], sn)) {
- DPFPRINTF(PF_DEBUG_MISC,
- ("pf: NAT proxy port allocation "
- "(%u-%u) failed\n",
- r->rpool.proxy_port[0],
- r->rpool.proxy_port[1]));
- return (NULL);
- }
- break;
- case PF_BINAT:
- switch (direction) {
- case PF_OUT:
- if (r->rpool.cur->addr.type == PF_ADDR_DYNIFTL){
- switch (pd->af) {
-#ifdef INET
- case AF_INET:
- if (r->rpool.cur->addr.p.dyn->
- pfid_acnt4 < 1)
- return (NULL);
- PF_POOLMASK(naddr,
- &r->rpool.cur->addr.p.dyn->
- pfid_addr4,
- &r->rpool.cur->addr.p.dyn->
- pfid_mask4,
- saddr, AF_INET);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- if (r->rpool.cur->addr.p.dyn->
- pfid_acnt6 < 1)
- return (NULL);
- PF_POOLMASK(naddr,
- &r->rpool.cur->addr.p.dyn->
- pfid_addr6,
- &r->rpool.cur->addr.p.dyn->
- pfid_mask6,
- saddr, AF_INET6);
- break;
-#endif /* INET6 */
- }
- } else
- PF_POOLMASK(naddr,
- &r->rpool.cur->addr.v.a.addr,
- &r->rpool.cur->addr.v.a.mask,
- saddr, pd->af);
- break;
- case PF_IN:
- if (r->src.addr.type == PF_ADDR_DYNIFTL) {
- switch (pd->af) {
-#ifdef INET
- case AF_INET:
- if (r->src.addr.p.dyn->
- pfid_acnt4 < 1)
- return (NULL);
- PF_POOLMASK(naddr,
- &r->src.addr.p.dyn->
- pfid_addr4,
- &r->src.addr.p.dyn->
- pfid_mask4,
- daddr, AF_INET);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- if (r->src.addr.p.dyn->
- pfid_acnt6 < 1)
- return (NULL);
- PF_POOLMASK(naddr,
- &r->src.addr.p.dyn->
- pfid_addr6,
- &r->src.addr.p.dyn->
- pfid_mask6,
- daddr, AF_INET6);
- break;
-#endif /* INET6 */
- }
- } else
- PF_POOLMASK(naddr,
- &r->src.addr.v.a.addr,
- &r->src.addr.v.a.mask, daddr,
- pd->af);
- break;
- }
- break;
- case PF_RDR: {
- if (pf_map_addr(pd->af, r, saddr, naddr, NULL, sn))
- return (NULL);
- if ((r->rpool.opts & PF_POOL_TYPEMASK) ==
- PF_POOL_BITMASK)
- PF_POOLMASK(naddr, naddr,
- &r->rpool.cur->addr.v.a.mask, daddr,
- pd->af);
-
- if (r->rpool.proxy_port[1]) {
- u_int32_t tmp_nport;
-
- tmp_nport = ((ntohs(dport) -
- ntohs(r->dst.port[0])) %
- (r->rpool.proxy_port[1] -
- r->rpool.proxy_port[0] + 1)) +
- r->rpool.proxy_port[0];
-
- /* wrap around if necessary */
- if (tmp_nport > 65535)
- tmp_nport -= 65535;
- *nport = htons((u_int16_t)tmp_nport);
- } else if (r->rpool.proxy_port[0])
- *nport = htons(r->rpool.proxy_port[0]);
- break;
- }
- default:
- return (NULL);
- }
- }
-
- return (r);
-}
-
int
#ifdef __FreeBSD__
pf_socket_lookup(int direction, struct pf_pdesc *pd, struct inpcb *inp_arg)
@@ -2983,7 +2948,8 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
return (-1);
pd->lookup.uid = UID_MAX;
pd->lookup.gid = GID_MAX;
- pd->lookup.pid = NO_PID; /* XXX: revisit */
+ pd->lookup.pid = NO_PID;
+
#ifdef __FreeBSD__
if (inp_arg != NULL) {
INP_LOCK_ASSERT(inp_arg);
@@ -2992,6 +2958,7 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
return (1);
}
#endif
+
switch (pd->proto) {
case IPPROTO_TCP:
if (pd->hdr.tcp == NULL)
@@ -3050,7 +3017,8 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
#else
inp = in_pcbhashlookup(tb, saddr->v4, sport, daddr->v4, dport);
if (inp == NULL) {
- inp = in_pcblookup_listen(tb, daddr->v4, dport, 0);
+ inp = in_pcblookup_listen(tb, daddr->v4, dport, 0,
+ NULL);
if (inp == NULL)
return (-1);
}
@@ -3077,7 +3045,8 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
inp = in6_pcbhashlookup(tb, &saddr->v6, sport, &daddr->v6,
dport);
if (inp == NULL) {
- inp = in6_pcblookup_listen(tb, &daddr->v6, dport, 0);
+ inp = in6_pcblookup_listen(tb, &daddr->v6, dport, 0,
+ NULL);
if (inp == NULL)
return (-1);
}
@@ -3147,7 +3116,11 @@ pf_get_mss(struct mbuf *m, int off, u_int16_t th_off, sa_family_t af)
int hlen;
u_int8_t hdr[60];
u_int8_t *opt, optlen;
+#ifdef __FreeBSD__
u_int16_t mss = V_tcp_mssdflt;
+#else
+ u_int16_t mss = tcp_mssdflt;
+#endif
hlen = th_off << 2; /* hlen <= sizeof(hdr) */
if (hlen <= sizeof(struct tcphdr))
@@ -3191,8 +3164,13 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, u_int16_t offer)
struct route_in6 ro6;
#endif /* INET6 */
struct rtentry *rt = NULL;
- int hlen = 0; /* make the compiler happy */
+#ifdef __FreeBSD__
+ int hlen = 0;
u_int16_t mss = V_tcp_mssdflt;
+#else
+ int hlen;
+ u_int16_t mss = tcp_mssdflt;
+#endif
switch (af) {
#ifdef INET
@@ -3240,7 +3218,11 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, u_int16_t offer)
if (rt && rt->rt_ifp) {
mss = rt->rt_ifp->if_mtu - hlen - sizeof(struct tcphdr);
+#ifdef __FreeBSD__
mss = max(V_tcp_mssdflt, mss);
+#else
+ mss = max(tcp_mssdflt, mss);
+#endif
RTFREE(rt);
}
mss = min(mss, offer);
@@ -3252,55 +3234,113 @@ void
pf_set_rt_ifp(struct pf_state *s, struct pf_addr *saddr)
{
struct pf_rule *r = s->rule.ptr;
+ struct pf_src_node *sn = NULL;
s->rt_kif = NULL;
if (!r->rt || r->rt == PF_FASTROUTE)
return;
- switch (s->af) {
+ switch (s->key[PF_SK_WIRE]->af) {
#ifdef INET
case AF_INET:
- pf_map_addr(AF_INET, r, saddr, &s->rt_addr, NULL,
- &s->nat_src_node);
+ pf_map_addr(AF_INET, r, saddr, &s->rt_addr, NULL, &sn);
s->rt_kif = r->rpool.cur->kif;
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
- pf_map_addr(AF_INET6, r, saddr, &s->rt_addr, NULL,
- &s->nat_src_node);
+ pf_map_addr(AF_INET6, r, saddr, &s->rt_addr, NULL, &sn);
s->rt_kif = r->rpool.cur->kif;
break;
#endif /* INET6 */
}
}
+u_int32_t
+pf_tcp_iss(struct pf_pdesc *pd)
+{
+ MD5_CTX ctx;
+ u_int32_t digest[4];
+
+#ifdef __FreeBSD__
+ if (V_pf_tcp_secret_init == 0) {
+ read_random(&V_pf_tcp_secret, sizeof(V_pf_tcp_secret));
+ MD5Init(&V_pf_tcp_secret_ctx);
+ MD5Update(&V_pf_tcp_secret_ctx, V_pf_tcp_secret,
+ sizeof(V_pf_tcp_secret));
+ V_pf_tcp_secret_init = 1;
+ }
+
+ ctx = V_pf_tcp_secret_ctx;
+#else
+ if (pf_tcp_secret_init == 0) {
+ arc4random_buf(pf_tcp_secret, sizeof(pf_tcp_secret));
+ MD5Init(&pf_tcp_secret_ctx);
+ MD5Update(&pf_tcp_secret_ctx, pf_tcp_secret,
+ sizeof(pf_tcp_secret));
+ pf_tcp_secret_init = 1;
+ }
+
+ ctx = pf_tcp_secret_ctx;
+#endif
+
+ MD5Update(&ctx, (char *)&pd->hdr.tcp->th_sport, sizeof(u_short));
+ MD5Update(&ctx, (char *)&pd->hdr.tcp->th_dport, sizeof(u_short));
+ if (pd->af == AF_INET6) {
+ MD5Update(&ctx, (char *)&pd->src->v6, sizeof(struct in6_addr));
+ MD5Update(&ctx, (char *)&pd->dst->v6, sizeof(struct in6_addr));
+ } else {
+ MD5Update(&ctx, (char *)&pd->src->v4, sizeof(struct in_addr));
+ MD5Update(&ctx, (char *)&pd->dst->v4, sizeof(struct in_addr));
+ }
+ MD5Final((u_char *)digest, &ctx);
+#ifdef __FreeBSD__
+ V_pf_tcp_iss_off += 4096;
+#define ISN_RANDOM_INCREMENT (4096 - 1)
+ return (digest[0] + (arc4random() & ISN_RANDOM_INCREMENT) +
+ V_pf_tcp_iss_off);
+#undef ISN_RANDOM_INCREMENT
+#else
+ pf_tcp_iss_off += 4096;
+ return (digest[0] + tcp_iss + pf_tcp_iss_off);
+#endif
+}
+
int
-pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
+pf_test_rule(struct pf_rule **rm, struct pf_state **sm, int direction,
struct pfi_kif *kif, struct mbuf *m, int off, void *h,
-#ifdef __FreeBSD__
struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
+#ifdef __FreeBSD__
struct ifqueue *ifq, struct inpcb *inp)
#else
- struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
struct ifqueue *ifq)
#endif
{
struct pf_rule *nr = NULL;
struct pf_addr *saddr = pd->src, *daddr = pd->dst;
- struct tcphdr *th = pd->hdr.tcp;
- u_int16_t bport, nport = 0;
sa_family_t af = pd->af;
struct pf_rule *r, *a = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_src_node *nsn = NULL;
+ struct tcphdr *th = pd->hdr.tcp;
+ struct pf_state_key *skw = NULL, *sks = NULL;
+ struct pf_state_key *sk = NULL, *nk = NULL;
u_short reason;
- int rewrite = 0;
+ int rewrite = 0, hdrlen = 0;
int tag = -1, rtableid = -1;
- u_int16_t mss = V_tcp_mssdflt;
int asd = 0;
int match = 0;
+ int state_icmp = 0;
+#ifdef __FreeBSD__
+ u_int16_t sport = 0, dport = 0;
+ u_int16_t bproto_sum = 0, bip_sum = 0;
+#else
+ u_int16_t sport, dport;
+ u_int16_t bproto_sum = 0, bip_sum;
+#endif
+ u_int8_t icmptype = 0, icmpcode = 0;
- if (pf_check_congestion(ifq)) {
+
+ if (direction == PF_IN && pf_check_congestion(ifq)) {
REASON_SET(&reason, PFRES_CONGEST);
return (PF_DROP);
}
@@ -3308,44 +3348,193 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
#ifdef __FreeBSD__
if (inp != NULL)
pd->lookup.done = pf_socket_lookup(direction, pd, inp);
- else if (debug_pfugidhack) {
+ else if (V_debug_pfugidhack) {
PF_UNLOCK();
DPFPRINTF(PF_DEBUG_MISC, ("pf: unlocked lookup\n"));
- pd->lookup.done = pf_socket_lookup(direction, pd, inp);
+ pd->lookup.done = pf_socket_lookup(direction, pd, inp);
PF_LOCK();
}
#endif
+ switch (pd->proto) {
+ case IPPROTO_TCP:
+ sport = th->th_sport;
+ dport = th->th_dport;
+ hdrlen = sizeof(*th);
+ break;
+ case IPPROTO_UDP:
+ sport = pd->hdr.udp->uh_sport;
+ dport = pd->hdr.udp->uh_dport;
+ hdrlen = sizeof(*pd->hdr.udp);
+ break;
+#ifdef INET
+ case IPPROTO_ICMP:
+ if (pd->af != AF_INET)
+ break;
+ sport = dport = pd->hdr.icmp->icmp_id;
+ hdrlen = sizeof(*pd->hdr.icmp);
+ icmptype = pd->hdr.icmp->icmp_type;
+ icmpcode = pd->hdr.icmp->icmp_code;
+
+ if (icmptype == ICMP_UNREACH ||
+ icmptype == ICMP_SOURCEQUENCH ||
+ icmptype == ICMP_REDIRECT ||
+ icmptype == ICMP_TIMXCEED ||
+ icmptype == ICMP_PARAMPROB)
+ state_icmp++;
+ break;
+#endif /* INET */
+#ifdef INET6
+ case IPPROTO_ICMPV6:
+ if (af != AF_INET6)
+ break;
+ sport = dport = pd->hdr.icmp6->icmp6_id;
+ hdrlen = sizeof(*pd->hdr.icmp6);
+ icmptype = pd->hdr.icmp6->icmp6_type;
+ icmpcode = pd->hdr.icmp6->icmp6_code;
+
+ if (icmptype == ICMP6_DST_UNREACH ||
+ icmptype == ICMP6_PACKET_TOO_BIG ||
+ icmptype == ICMP6_TIME_EXCEEDED ||
+ icmptype == ICMP6_PARAM_PROB)
+ state_icmp++;
+ break;
+#endif /* INET6 */
+ default:
+ sport = dport = hdrlen = 0;
+ break;
+ }
+
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
- if (direction == PF_OUT) {
- bport = nport = th->th_sport;
- /* check outgoing packet for BINAT/NAT */
- if ((nr = pf_get_translation(pd, m, off, PF_OUT, kif, &nsn,
- saddr, th->th_sport, daddr, th->th_dport,
- &pd->naddr, &nport)) != NULL) {
- PF_ACPY(&pd->baddr, saddr, af);
- pf_change_ap(saddr, &th->th_sport, pd->ip_sum,
- &th->th_sum, &pd->naddr, nport, 0, af);
- rewrite++;
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
+ /* check packet for BINAT/NAT/RDR */
+ if ((nr = pf_get_translation(pd, m, off, direction, kif, &nsn,
+ &skw, &sks, &sk, &nk, saddr, daddr, sport, dport)) != NULL) {
+ if (nk == NULL || sk == NULL) {
+ REASON_SET(&reason, PFRES_MEMORY);
+ goto cleanup;
}
- } else {
- bport = nport = th->th_dport;
- /* check incoming packet for BINAT/RDR */
- if ((nr = pf_get_translation(pd, m, off, PF_IN, kif, &nsn,
- saddr, th->th_sport, daddr, th->th_dport,
- &pd->naddr, &nport)) != NULL) {
- PF_ACPY(&pd->baddr, daddr, af);
- pf_change_ap(daddr, &th->th_dport, pd->ip_sum,
- &th->th_sum, &pd->naddr, nport, 0, af);
+
+ if (pd->ip_sum)
+ bip_sum = *pd->ip_sum;
+
+ switch (pd->proto) {
+ case IPPROTO_TCP:
+ bproto_sum = th->th_sum;
+ pd->proto_sum = &th->th_sum;
+
+ if (PF_ANEQ(saddr, &nk->addr[pd->sidx], af) ||
+ nk->port[pd->sidx] != sport) {
+ pf_change_ap(saddr, &th->th_sport, pd->ip_sum,
+ &th->th_sum, &nk->addr[pd->sidx],
+ nk->port[pd->sidx], 0, af);
+ pd->sport = &th->th_sport;
+ sport = th->th_sport;
+ }
+
+ if (PF_ANEQ(daddr, &nk->addr[pd->didx], af) ||
+ nk->port[pd->didx] != dport) {
+ pf_change_ap(daddr, &th->th_dport, pd->ip_sum,
+ &th->th_sum, &nk->addr[pd->didx],
+ nk->port[pd->didx], 0, af);
+ dport = th->th_dport;
+ pd->dport = &th->th_dport;
+ }
+ rewrite++;
+ break;
+ case IPPROTO_UDP:
+ bproto_sum = pd->hdr.udp->uh_sum;
+ pd->proto_sum = &pd->hdr.udp->uh_sum;
+
+ if (PF_ANEQ(saddr, &nk->addr[pd->sidx], af) ||
+ nk->port[pd->sidx] != sport) {
+ pf_change_ap(saddr, &pd->hdr.udp->uh_sport,
+ pd->ip_sum, &pd->hdr.udp->uh_sum,
+ &nk->addr[pd->sidx],
+ nk->port[pd->sidx], 1, af);
+ sport = pd->hdr.udp->uh_sport;
+ pd->sport = &pd->hdr.udp->uh_sport;
+ }
+
+ if (PF_ANEQ(daddr, &nk->addr[pd->didx], af) ||
+ nk->port[pd->didx] != dport) {
+ pf_change_ap(daddr, &pd->hdr.udp->uh_dport,
+ pd->ip_sum, &pd->hdr.udp->uh_sum,
+ &nk->addr[pd->didx],
+ nk->port[pd->didx], 1, af);
+ dport = pd->hdr.udp->uh_dport;
+ pd->dport = &pd->hdr.udp->uh_dport;
+ }
rewrite++;
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
+ break;
+#ifdef INET
+ case IPPROTO_ICMP:
+ nk->port[0] = nk->port[1];
+ if (PF_ANEQ(saddr, &nk->addr[pd->sidx], AF_INET))
+ pf_change_a(&saddr->v4.s_addr, pd->ip_sum,
+ nk->addr[pd->sidx].v4.s_addr, 0);
+
+ if (PF_ANEQ(daddr, &nk->addr[pd->didx], AF_INET))
+ pf_change_a(&daddr->v4.s_addr, pd->ip_sum,
+ nk->addr[pd->didx].v4.s_addr, 0);
+
+ if (nk->port[1] != pd->hdr.icmp->icmp_id) {
+ pd->hdr.icmp->icmp_cksum = pf_cksum_fixup(
+ pd->hdr.icmp->icmp_cksum, sport,
+ nk->port[1], 0);
+ pd->hdr.icmp->icmp_id = nk->port[1];
+ pd->sport = &pd->hdr.icmp->icmp_id;
+ }
+ m_copyback(m, off, ICMP_MINLEN, (caddr_t)pd->hdr.icmp);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case IPPROTO_ICMPV6:
+ nk->port[0] = nk->port[1];
+ if (PF_ANEQ(saddr, &nk->addr[pd->sidx], AF_INET6))
+ pf_change_a6(saddr, &pd->hdr.icmp6->icmp6_cksum,
+ &nk->addr[pd->sidx], 0);
+
+ if (PF_ANEQ(daddr, &nk->addr[pd->didx], AF_INET6))
+ pf_change_a6(daddr, &pd->hdr.icmp6->icmp6_cksum,
+ &nk->addr[pd->didx], 0);
+ rewrite++;
+ break;
+#endif /* INET */
+ default:
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ if (PF_ANEQ(saddr,
+ &nk->addr[pd->sidx], AF_INET))
+ pf_change_a(&saddr->v4.s_addr,
+ pd->ip_sum,
+ nk->addr[pd->sidx].v4.s_addr, 0);
+
+ if (PF_ANEQ(daddr,
+ &nk->addr[pd->didx], AF_INET))
+ pf_change_a(&daddr->v4.s_addr,
+ pd->ip_sum,
+ nk->addr[pd->didx].v4.s_addr, 0);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (PF_ANEQ(saddr,
+ &nk->addr[pd->sidx], AF_INET6))
+ PF_ACPY(saddr, &nk->addr[pd->sidx], af);
+
+ if (PF_ANEQ(daddr,
+ &nk->addr[pd->didx], AF_INET6))
+ PF_ACPY(saddr, &nk->addr[pd->didx], af);
+ break;
+#endif /* INET */
+ }
+ break;
}
+ if (nr->natpass)
+ r = NULL;
+ pd->nat_rule = nr;
}
while (r != NULL) {
@@ -3356,26 +3545,36 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = r->skip[PF_SKIP_DIR].ptr;
else if (r->af && r->af != af)
r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != IPPROTO_TCP)
+ else if (r->proto && r->proto != pd->proto)
r = r->skip[PF_SKIP_PROTO].ptr;
else if (PF_MISMATCHAW(&r->src.addr, saddr, af,
r->src.neg, kif))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
+ /* tcp/udp only. port_op always 0 in other cases */
else if (r->src.port_op && !pf_match_port(r->src.port_op,
- r->src.port[0], r->src.port[1], th->th_sport))
+ r->src.port[0], r->src.port[1], sport))
r = r->skip[PF_SKIP_SRC_PORT].ptr;
else if (PF_MISMATCHAW(&r->dst.addr, daddr, af,
r->dst.neg, NULL))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
+ /* tcp/udp only. port_op always 0 in other cases */
else if (r->dst.port_op && !pf_match_port(r->dst.port_op,
- r->dst.port[0], r->dst.port[1], th->th_dport))
+ r->dst.port[0], r->dst.port[1], dport))
r = r->skip[PF_SKIP_DST_PORT].ptr;
+ /* icmp only. type always 0 in other cases */
+ else if (r->type && r->type != icmptype + 1)
+ r = TAILQ_NEXT(r, entries);
+ /* icmp only. type always 0 in other cases */
+ else if (r->code && r->code != icmpcode + 1)
+ r = TAILQ_NEXT(r, entries);
else if (r->tos && !(r->tos == pd->tos))
r = TAILQ_NEXT(r, entries);
else if (r->rule_flag & PFRULE_FRAGMENT)
r = TAILQ_NEXT(r, entries);
- else if ((r->flagset & th->th_flags) != r->flags)
+ else if (pd->proto == IPPROTO_TCP &&
+ (r->flagset & th->th_flags) != r->flags)
r = TAILQ_NEXT(r, entries);
+ /* tcp/udp only. uid.op always 0 in other cases */
else if (r->uid.op && (pd->lookup.done || (pd->lookup.done =
#ifdef __FreeBSD__
pf_socket_lookup(direction, pd, inp), 1)) &&
@@ -3385,6 +3584,7 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
!pf_match_uid(r->uid.op, r->uid.uid[0], r->uid.uid[1],
pd->lookup.uid))
r = TAILQ_NEXT(r, entries);
+ /* tcp/udp only. gid.op always 0 in other cases */
else if (r->gid.op && (pd->lookup.done || (pd->lookup.done =
#ifdef __FreeBSD__
pf_socket_lookup(direction, pd, inp), 1)) &&
@@ -3394,12 +3594,23 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
!pf_match_gid(r->gid.op, r->gid.gid[0], r->gid.gid[1],
pd->lookup.gid))
r = TAILQ_NEXT(r, entries);
- else if (r->prob && r->prob <= arc4random())
+ else if (r->prob &&
+#ifdef __FreeBSD__
+ r->prob <= arc4random())
+#else
+ r->prob <= arc4random_uniform(UINT_MAX - 1) + 1)
+#endif
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+#ifdef __FreeBSD__
+ else if (r->match_tag && !pf_match_tag(m, r, &tag, pd->pf_mtag))
+#else
+ else if (r->match_tag && !pf_match_tag(m, r, &tag))
+#endif
r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY && !pf_osfp_match(
- pf_osfp_fingerprint(pd, m, off, th), r->os_fingerprint))
+ else if (r->os_fingerprint != PF_OSFP_ANY &&
+ (pd->proto != IPPROTO_TCP || !pf_osfp_match(
+ pf_osfp_fingerprint(pd, m, off, th),
+ r->os_fingerprint)))
r = TAILQ_NEXT(r, entries);
else {
if (r->tag)
@@ -3428,13 +3639,9 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MATCH);
- if (r->log || (nr != NULL && nr->natpass && nr->log)) {
+ if (r->log || (nr != NULL && nr->log)) {
if (rewrite)
-#ifdef __FreeBSD__
- m_copyback(m, off, sizeof(*th), (caddr_t)th);
-#else
- m_copyback(m, off, sizeof(*th), th);
-#endif
+ m_copyback(m, off, hdrlen, pd->hdr.any);
PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
a, ruleset, pd);
}
@@ -3445,161 +3652,233 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
(r->rule_flag & PFRULE_RETURN))) {
/* undo NAT changes, if they have taken place */
if (nr != NULL) {
- if (direction == PF_OUT) {
- pf_change_ap(saddr, &th->th_sport, pd->ip_sum,
- &th->th_sum, &pd->baddr, bport, 0, af);
- rewrite++;
- } else {
- pf_change_ap(daddr, &th->th_dport, pd->ip_sum,
- &th->th_sum, &pd->baddr, bport, 0, af);
- rewrite++;
- }
- }
- if (((r->rule_flag & PFRULE_RETURNRST) ||
+ PF_ACPY(saddr, &sk->addr[pd->sidx], af);
+ PF_ACPY(daddr, &sk->addr[pd->didx], af);
+ if (pd->sport)
+ *pd->sport = sk->port[pd->sidx];
+ if (pd->dport)
+ *pd->dport = sk->port[pd->didx];
+ if (pd->proto_sum)
+ *pd->proto_sum = bproto_sum;
+ if (pd->ip_sum)
+ *pd->ip_sum = bip_sum;
+ m_copyback(m, off, hdrlen, pd->hdr.any);
+ }
+ if (pd->proto == IPPROTO_TCP &&
+ ((r->rule_flag & PFRULE_RETURNRST) ||
(r->rule_flag & PFRULE_RETURN)) &&
!(th->th_flags & TH_RST)) {
- u_int32_t ack = ntohl(th->th_seq) + pd->p_len;
+ u_int32_t ack = ntohl(th->th_seq) + pd->p_len;
+ int len = 0;
+#ifdef INET
+ struct ip *h4;
+#endif
+#ifdef INET6
+ struct ip6_hdr *h6;
+#endif
+
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ h4 = mtod(m, struct ip *);
+ len = ntohs(h4->ip_len) - off;
+ break;
+#endif
+#ifdef INET6
+ case AF_INET6:
+ h6 = mtod(m, struct ip6_hdr *);
+ len = ntohs(h6->ip6_plen) - (off - sizeof(*h6));
+ break;
+#endif
+ }
- if (th->th_flags & TH_SYN)
- ack++;
- if (th->th_flags & TH_FIN)
- ack++;
+ if (pf_check_proto_cksum(m, off, len, IPPROTO_TCP, af))
+ REASON_SET(&reason, PFRES_PROTCKSUM);
+ else {
+ if (th->th_flags & TH_SYN)
+ ack++;
+ if (th->th_flags & TH_FIN)
+ ack++;
#ifdef __FreeBSD__
- pf_send_tcp(m, r, af, pd->dst,
+ pf_send_tcp(m, r, af, pd->dst,
#else
- pf_send_tcp(r, af, pd->dst,
+ pf_send_tcp(r, af, pd->dst,
#endif
- pd->src, th->th_dport, th->th_sport,
- ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0,
- r->return_ttl, 1, 0, pd->eh, kif->pfik_ifp);
- } else if ((af == AF_INET) && r->return_icmp)
+ pd->src, th->th_dport, th->th_sport,
+ ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0,
+ r->return_ttl, 1, 0, pd->eh, kif->pfik_ifp);
+ }
+ } else if (pd->proto != IPPROTO_ICMP && af == AF_INET &&
+ r->return_icmp)
pf_send_icmp(m, r->return_icmp >> 8,
r->return_icmp & 255, af, r);
- else if ((af == AF_INET6) && r->return_icmp6)
+ else if (pd->proto != IPPROTO_ICMPV6 && af == AF_INET6 &&
+ r->return_icmp6)
pf_send_icmp(m, r->return_icmp6 >> 8,
r->return_icmp6 & 255, af, r);
}
if (r->action == PF_DROP)
- return (PF_DROP);
+ goto cleanup;
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
+#ifdef __FreeBSD__
+ if (pf_tag_packet(m, tag, rtableid, pd->pf_mtag)) {
+#else
+ if (pf_tag_packet(m, tag, rtableid)) {
+#endif
REASON_SET(&reason, PFRES_MEMORY);
- return (PF_DROP);
+ goto cleanup;
}
- if (r->keep_state || nr != NULL ||
- (pd->flags & PFDESC_TCP_NORM)) {
- /* create new state */
- u_int16_t len;
- struct pf_state *s = NULL;
- struct pf_src_node *sn = NULL;
+ if (!state_icmp && (r->keep_state || nr != NULL ||
+ (pd->flags & PFDESC_TCP_NORM))) {
+ int action;
+ action = pf_create_state(r, nr, a, pd, nsn, skw, sks, nk, sk, m,
+ off, sport, dport, &rewrite, kif, sm, tag, bproto_sum,
+ bip_sum, hdrlen);
+ if (action != PF_PASS)
+ return (action);
+ } else {
+#ifdef __FreeBSD__
+ if (sk != NULL)
+ pool_put(&V_pf_state_key_pl, sk);
+ if (nk != NULL)
+ pool_put(&V_pf_state_key_pl, nk);
+#else
+ if (sk != NULL)
+ pool_put(&pf_state_key_pl, sk);
+ if (nk != NULL)
+ pool_put(&pf_state_key_pl, nk);
+#endif
+ }
- len = pd->tot_len - off - (th->th_off << 2);
+ /* copy back packet headers if we performed NAT operations */
+ if (rewrite)
+ m_copyback(m, off, hdrlen, pd->hdr.any);
+
+#if NPFSYNC > 0
+ if (*sm != NULL && !ISSET((*sm)->state_flags, PFSTATE_NOSYNC) &&
+#ifdef __FreeBSD__
+ direction == PF_OUT && pfsync_up_ptr != NULL && pfsync_up_ptr()) {
+#else
+ direction == PF_OUT && pfsync_up()) {
+#endif
+ /*
+ * We want the state created, but we dont
+ * want to send this in case a partner
+ * firewall has to know about it to allow
+ * replies through it.
+ */
+#ifdef __FreeBSD__
+ if (pfsync_defer_ptr != NULL)
+ pfsync_defer_ptr(*sm, m);
+#else
+ if (pfsync_defer(*sm, m))
+#endif
+ return (PF_DEFER);
+ }
+#endif
+
+ return (PF_PASS);
- /* check maximums */
- if (r->max_states && (r->states >= r->max_states)) {
- pf_status.lcounters[LCNT_STATES]++;
- REASON_SET(&reason, PFRES_MAXSTATES);
- goto cleanup;
- }
- /* src node for filter rule */
- if ((r->rule_flag & PFRULE_SRCTRACK ||
- r->rpool.opts & PF_POOL_STICKYADDR) &&
- pf_insert_src_node(&sn, r, saddr, af) != 0) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- /* src node for translation rule */
- if (nr != NULL && (nr->rpool.opts & PF_POOL_STICKYADDR) &&
- ((direction == PF_OUT &&
- pf_insert_src_node(&nsn, nr, &pd->baddr, af) != 0) ||
- (pf_insert_src_node(&nsn, nr, saddr, af) != 0))) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- s = pool_get(&pf_state_pl, PR_NOWAIT);
- if (s == NULL) {
- REASON_SET(&reason, PFRES_MEMORY);
cleanup:
- if (sn != NULL && sn->states == 0 && sn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, sn);
- }
- if (nsn != sn && nsn != NULL && nsn->states == 0 &&
- nsn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, nsn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, nsn);
- }
- return (PF_DROP);
- }
- bzero(s, sizeof(*s));
- s->rule.ptr = r;
- s->nat_rule.ptr = nr;
- s->anchor.ptr = a;
- STATE_INC_COUNTERS(s);
- if (r->allow_opts)
- s->state_flags |= PFSTATE_ALLOWOPTS;
- if (r->rule_flag & PFRULE_STATESLOPPY)
- s->state_flags |= PFSTATE_SLOPPY;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
- s->proto = IPPROTO_TCP;
- s->direction = direction;
- s->af = af;
- if (direction == PF_OUT) {
- PF_ACPY(&s->gwy.addr, saddr, af);
- s->gwy.port = th->th_sport; /* sport */
- PF_ACPY(&s->ext.addr, daddr, af);
- s->ext.port = th->th_dport;
- if (nr != NULL) {
- PF_ACPY(&s->lan.addr, &pd->baddr, af);
- s->lan.port = bport;
- } else {
- PF_ACPY(&s->lan.addr, &s->gwy.addr, af);
- s->lan.port = s->gwy.port;
- }
- } else {
- PF_ACPY(&s->lan.addr, daddr, af);
- s->lan.port = th->th_dport;
- PF_ACPY(&s->ext.addr, saddr, af);
- s->ext.port = th->th_sport;
- if (nr != NULL) {
- PF_ACPY(&s->gwy.addr, &pd->baddr, af);
- s->gwy.port = bport;
- } else {
- PF_ACPY(&s->gwy.addr, &s->lan.addr, af);
- s->gwy.port = s->lan.port;
- }
- }
+#ifdef __FreeBSD__
+ if (sk != NULL)
+ pool_put(&V_pf_state_key_pl, sk);
+ if (nk != NULL)
+ pool_put(&V_pf_state_key_pl, nk);
+#else
+ if (sk != NULL)
+ pool_put(&pf_state_key_pl, sk);
+ if (nk != NULL)
+ pool_put(&pf_state_key_pl, nk);
+#endif
+ return (PF_DROP);
+}
+static __inline int
+pf_create_state(struct pf_rule *r, struct pf_rule *nr, struct pf_rule *a,
+ struct pf_pdesc *pd, struct pf_src_node *nsn, struct pf_state_key *skw,
+ struct pf_state_key *sks, struct pf_state_key *nk, struct pf_state_key *sk,
+ struct mbuf *m, int off, u_int16_t sport, u_int16_t dport, int *rewrite,
+ struct pfi_kif *kif, struct pf_state **sm, int tag, u_int16_t bproto_sum,
+ u_int16_t bip_sum, int hdrlen)
+{
+ struct pf_state *s = NULL;
+ struct pf_src_node *sn = NULL;
+ struct tcphdr *th = pd->hdr.tcp;
+#ifdef __FreeBSD__
+ u_int16_t mss = V_tcp_mssdflt;
+#else
+ u_int16_t mss = tcp_mssdflt;
+#endif
+ u_short reason;
+
+ /* check maximums */
+ if (r->max_states && (r->states_cur >= r->max_states)) {
+#ifdef __FreeBSD__
+ V_pf_status.lcounters[LCNT_STATES]++;
+#else
+ pf_status.lcounters[LCNT_STATES]++;
+#endif
+ REASON_SET(&reason, PFRES_MAXSTATES);
+ return (PF_DROP);
+ }
+ /* src node for filter rule */
+ if ((r->rule_flag & PFRULE_SRCTRACK ||
+ r->rpool.opts & PF_POOL_STICKYADDR) &&
+ pf_insert_src_node(&sn, r, pd->src, pd->af) != 0) {
+ REASON_SET(&reason, PFRES_SRCLIMIT);
+ goto csfailed;
+ }
+ /* src node for translation rule */
+ if (nr != NULL && (nr->rpool.opts & PF_POOL_STICKYADDR) &&
+ pf_insert_src_node(&nsn, nr, &sk->addr[pd->sidx], pd->af)) {
+ REASON_SET(&reason, PFRES_SRCLIMIT);
+ goto csfailed;
+ }
+#ifdef __FreeBSD__
+ s = pool_get(&V_pf_state_pl, PR_NOWAIT | PR_ZERO);
+#else
+ s = pool_get(&pf_state_pl, PR_NOWAIT | PR_ZERO);
+#endif
+ if (s == NULL) {
+ REASON_SET(&reason, PFRES_MEMORY);
+ goto csfailed;
+ }
+ s->rule.ptr = r;
+ s->nat_rule.ptr = nr;
+ s->anchor.ptr = a;
+ STATE_INC_COUNTERS(s);
+ if (r->allow_opts)
+ s->state_flags |= PFSTATE_ALLOWOPTS;
+ if (r->rule_flag & PFRULE_STATESLOPPY)
+ s->state_flags |= PFSTATE_SLOPPY;
+ if (r->rule_flag & PFRULE_PFLOW)
+ s->state_flags |= PFSTATE_PFLOW;
+ s->log = r->log & PF_LOG_ALL;
+ s->sync_state = PFSYNC_S_NONE;
+ if (nr != NULL)
+ s->log |= nr->log & PF_LOG_ALL;
+ switch (pd->proto) {
+ case IPPROTO_TCP:
s->src.seqlo = ntohl(th->th_seq);
- s->src.seqhi = s->src.seqlo + len + 1;
+ s->src.seqhi = s->src.seqlo + pd->p_len + 1;
if ((th->th_flags & (TH_SYN|TH_ACK)) == TH_SYN &&
r->keep_state == PF_STATE_MODULATE) {
/* Generate sequence number modulator */
-#ifdef __FreeBSD__
- while ((s->src.seqdiff =
- pf_new_isn(s) - s->src.seqlo) == 0)
- ;
-#else
- while ((s->src.seqdiff =
- tcp_rndiss_next() - s->src.seqlo) == 0)
- ;
-#endif
+ if ((s->src.seqdiff = pf_tcp_iss(pd) - s->src.seqlo) ==
+ 0)
+ s->src.seqdiff = 1;
pf_change_a(&th->th_seq, &th->th_sum,
htonl(s->src.seqlo + s->src.seqdiff), 0);
- rewrite = 1;
+ *rewrite = 1;
} else
s->src.seqdiff = 0;
if (th->th_flags & TH_SYN) {
s->src.seqhi++;
- s->src.wscale = pf_get_wscale(m, off, th->th_off, af);
+ s->src.wscale = pf_get_wscale(m, off,
+ th->th_off, pd->af);
}
s->src.max_win = MAX(ntohs(th->th_win), 1);
if (s->src.wscale & PF_WSCALE_MASK) {
@@ -3615,994 +3894,173 @@ cleanup:
s->dst.max_win = 1;
s->src.state = TCPS_SYN_SENT;
s->dst.state = TCPS_CLOSED;
- s->creation = time_second;
- s->expire = time_second;
s->timeout = PFTM_TCP_FIRST_PACKET;
- pf_set_rt_ifp(s, saddr);
- if (sn != NULL) {
- s->src_node = sn;
- s->src_node->states++;
- }
- if (nsn != NULL) {
- PF_ACPY(&nsn->raddr, &pd->naddr, af);
- s->nat_src_node = nsn;
- s->nat_src_node->states++;
- }
+ break;
+ case IPPROTO_UDP:
+ s->src.state = PFUDPS_SINGLE;
+ s->dst.state = PFUDPS_NO_TRAFFIC;
+ s->timeout = PFTM_UDP_FIRST_PACKET;
+ break;
+ case IPPROTO_ICMP:
+#ifdef INET6
+ case IPPROTO_ICMPV6:
+#endif
+ s->timeout = PFTM_ICMP_FIRST_PACKET;
+ break;
+ default:
+ s->src.state = PFOTHERS_SINGLE;
+ s->dst.state = PFOTHERS_NO_TRAFFIC;
+ s->timeout = PFTM_OTHER_FIRST_PACKET;
+ }
+
+ s->creation = time_second;
+ s->expire = time_second;
+
+ if (sn != NULL) {
+ s->src_node = sn;
+ s->src_node->states++;
+ }
+ if (nsn != NULL) {
+ /* XXX We only modify one side for now. */
+ PF_ACPY(&nsn->raddr, &nk->addr[1], pd->af);
+ s->nat_src_node = nsn;
+ s->nat_src_node->states++;
+ }
+ if (pd->proto == IPPROTO_TCP) {
if ((pd->flags & PFDESC_TCP_NORM) && pf_normalize_tcp_init(m,
off, pd, th, &s->src, &s->dst)) {
REASON_SET(&reason, PFRES_MEMORY);
pf_src_tree_remove_state(s);
STATE_DEC_COUNTERS(s);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_pl, s);
+#else
pool_put(&pf_state_pl, s);
+#endif
return (PF_DROP);
}
if ((pd->flags & PFDESC_TCP_NORM) && s->src.scrub &&
pf_normalize_tcp_stateful(m, off, pd, &reason, th, s,
- &s->src, &s->dst, &rewrite)) {
+ &s->src, &s->dst, rewrite)) {
/* This really shouldn't happen!!! */
DPFPRINTF(PF_DEBUG_URGENT,
("pf_normalize_tcp_stateful failed on first pkt"));
pf_normalize_tcp_cleanup(s);
pf_src_tree_remove_state(s);
STATE_DEC_COUNTERS(s);
- pool_put(&pf_state_pl, s);
- return (PF_DROP);
- }
- if (pf_insert_state(BOUND_IFACE(r, kif), s)) {
- pf_normalize_tcp_cleanup(s);
- REASON_SET(&reason, PFRES_STATEINS);
- pf_src_tree_remove_state(s);
- STATE_DEC_COUNTERS(s);
- pool_put(&pf_state_pl, s);
- return (PF_DROP);
- } else
- *sm = s;
- if (tag > 0) {
- pf_tag_ref(tag);
- s->tag = tag;
- }
- if ((th->th_flags & (TH_SYN|TH_ACK)) == TH_SYN &&
- r->keep_state == PF_STATE_SYNPROXY) {
- s->src.state = PF_TCPS_PROXY_SRC;
- if (nr != NULL) {
- if (direction == PF_OUT) {
- pf_change_ap(saddr, &th->th_sport,
- pd->ip_sum, &th->th_sum, &pd->baddr,
- bport, 0, af);
- } else {
- pf_change_ap(daddr, &th->th_dport,
- pd->ip_sum, &th->th_sum, &pd->baddr,
- bport, 0, af);
- }
- }
- s->src.seqhi = htonl(arc4random());
- /* Find mss option */
- mss = pf_get_mss(m, off, th->th_off, af);
- mss = pf_calc_mss(saddr, af, mss);
- mss = pf_calc_mss(daddr, af, mss);
- s->src.mss = mss;
#ifdef __FreeBSD__
- pf_send_tcp(NULL, r, af, daddr, saddr, th->th_dport,
+ pool_put(&V_pf_state_pl, s);
#else
- pf_send_tcp(r, af, daddr, saddr, th->th_dport,
+ pool_put(&pf_state_pl, s);
#endif
- th->th_sport, s->src.seqhi, ntohl(th->th_seq) + 1,
- TH_SYN|TH_ACK, 0, s->src.mss, 0, 1, 0, NULL, NULL);
- REASON_SET(&reason, PFRES_SYNPROXY);
- return (PF_SYNPROXY_DROP);
+ return (PF_DROP);
}
}
+ s->direction = pd->dir;
- /* copy back packet headers if we performed NAT operations */
- if (rewrite)
- m_copyback(m, off, sizeof(*th), (caddr_t)th);
-
- return (PF_PASS);
-}
+ if (sk == NULL && pf_state_key_setup(pd, nr, &skw, &sks, &sk, &nk,
+ pd->src, pd->dst, sport, dport))
+ goto csfailed;
-int
-pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
- struct pfi_kif *kif, struct mbuf *m, int off, void *h,
+ if (pf_state_insert(BOUND_IFACE(r, kif), skw, sks, s)) {
+ if (pd->proto == IPPROTO_TCP)
+ pf_normalize_tcp_cleanup(s);
+ REASON_SET(&reason, PFRES_STATEINS);
+ pf_src_tree_remove_state(s);
+ STATE_DEC_COUNTERS(s);
#ifdef __FreeBSD__
- struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
- struct ifqueue *ifq, struct inpcb *inp)
+ pool_put(&V_pf_state_pl, s);
#else
- struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
- struct ifqueue *ifq)
+ pool_put(&pf_state_pl, s);
#endif
-{
- struct pf_rule *nr = NULL;
- struct pf_addr *saddr = pd->src, *daddr = pd->dst;
- struct udphdr *uh = pd->hdr.udp;
- u_int16_t bport, nport = 0;
- sa_family_t af = pd->af;
- struct pf_rule *r, *a = NULL;
- struct pf_ruleset *ruleset = NULL;
- struct pf_src_node *nsn = NULL;
- u_short reason;
- int rewrite = 0;
- int tag = -1, rtableid = -1;
- int asd = 0;
- int match = 0;
-
- if (pf_check_congestion(ifq)) {
- REASON_SET(&reason, PFRES_CONGEST);
return (PF_DROP);
- }
+ } else
+ *sm = s;
-#ifdef __FreeBSD__
- if (inp != NULL)
- pd->lookup.done = pf_socket_lookup(direction, pd, inp);
- else if (debug_pfugidhack) {
- PF_UNLOCK();
- DPFPRINTF(PF_DEBUG_MISC, ("pf: unlocked lookup\n"));
- pd->lookup.done = pf_socket_lookup(direction, pd, inp);
- PF_LOCK();
+ pf_set_rt_ifp(s, pd->src); /* needs s->state_key set */
+ if (tag > 0) {
+ pf_tag_ref(tag);
+ s->tag = tag;
}
+ if (pd->proto == IPPROTO_TCP && (th->th_flags & (TH_SYN|TH_ACK)) ==
+ TH_SYN && r->keep_state == PF_STATE_SYNPROXY) {
+ s->src.state = PF_TCPS_PROXY_SRC;
+ /* undo NAT changes, if they have taken place */
+ if (nr != NULL) {
+ struct pf_state_key *skt = s->key[PF_SK_WIRE];
+ if (pd->dir == PF_OUT)
+ skt = s->key[PF_SK_STACK];
+ PF_ACPY(pd->src, &skt->addr[pd->sidx], pd->af);
+ PF_ACPY(pd->dst, &skt->addr[pd->didx], pd->af);
+ if (pd->sport)
+ *pd->sport = skt->port[pd->sidx];
+ if (pd->dport)
+ *pd->dport = skt->port[pd->didx];
+ if (pd->proto_sum)
+ *pd->proto_sum = bproto_sum;
+ if (pd->ip_sum)
+ *pd->ip_sum = bip_sum;
+ m_copyback(m, off, hdrlen, pd->hdr.any);
+ }
+ s->src.seqhi = htonl(arc4random());
+ /* Find mss option */
+ mss = pf_get_mss(m, off, th->th_off, pd->af);
+ mss = pf_calc_mss(pd->src, pd->af, mss);
+ mss = pf_calc_mss(pd->dst, pd->af, mss);
+ s->src.mss = mss;
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, r, pd->af, pd->dst, pd->src, th->th_dport,
+#else
+ pf_send_tcp(r, pd->af, pd->dst, pd->src, th->th_dport,
#endif
-
- r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
-
- if (direction == PF_OUT) {
- bport = nport = uh->uh_sport;
- /* check outgoing packet for BINAT/NAT */
- if ((nr = pf_get_translation(pd, m, off, PF_OUT, kif, &nsn,
- saddr, uh->uh_sport, daddr, uh->uh_dport,
- &pd->naddr, &nport)) != NULL) {
- PF_ACPY(&pd->baddr, saddr, af);
- pf_change_ap(saddr, &uh->uh_sport, pd->ip_sum,
- &uh->uh_sum, &pd->naddr, nport, 1, af);
- rewrite++;
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
- }
- } else {
- bport = nport = uh->uh_dport;
- /* check incoming packet for BINAT/RDR */
- if ((nr = pf_get_translation(pd, m, off, PF_IN, kif, &nsn,
- saddr, uh->uh_sport, daddr, uh->uh_dport, &pd->naddr,
- &nport)) != NULL) {
- PF_ACPY(&pd->baddr, daddr, af);
- pf_change_ap(daddr, &uh->uh_dport, pd->ip_sum,
- &uh->uh_sum, &pd->naddr, nport, 1, af);
- rewrite++;
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
- }
+ th->th_sport, s->src.seqhi, ntohl(th->th_seq) + 1,
+ TH_SYN|TH_ACK, 0, s->src.mss, 0, 1, 0, NULL, NULL);
+ REASON_SET(&reason, PFRES_SYNPROXY);
+ return (PF_SYNPROXY_DROP);
}
- while (r != NULL) {
- r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
- r = r->skip[PF_SKIP_IFP].ptr;
- else if (r->direction && r->direction != direction)
- r = r->skip[PF_SKIP_DIR].ptr;
- else if (r->af && r->af != af)
- r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != IPPROTO_UDP)
- r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, saddr, af,
- r->src.neg, kif))
- r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (r->src.port_op && !pf_match_port(r->src.port_op,
- r->src.port[0], r->src.port[1], uh->uh_sport))
- r = r->skip[PF_SKIP_SRC_PORT].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, daddr, af,
- r->dst.neg, NULL))
- r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (r->dst.port_op && !pf_match_port(r->dst.port_op,
- r->dst.port[0], r->dst.port[1], uh->uh_dport))
- r = r->skip[PF_SKIP_DST_PORT].ptr;
- else if (r->tos && !(r->tos == pd->tos))
- r = TAILQ_NEXT(r, entries);
- else if (r->rule_flag & PFRULE_FRAGMENT)
- r = TAILQ_NEXT(r, entries);
- else if (r->uid.op && (pd->lookup.done || (pd->lookup.done =
+ return (PF_PASS);
+
+csfailed:
#ifdef __FreeBSD__
- pf_socket_lookup(direction, pd, inp), 1)) &&
+ if (sk != NULL)
+ pool_put(&V_pf_state_key_pl, sk);
+ if (nk != NULL)
+ pool_put(&V_pf_state_key_pl, nk);
#else
- pf_socket_lookup(direction, pd), 1)) &&
+ if (sk != NULL)
+ pool_put(&pf_state_key_pl, sk);
+ if (nk != NULL)
+ pool_put(&pf_state_key_pl, nk);
#endif
- !pf_match_uid(r->uid.op, r->uid.uid[0], r->uid.uid[1],
- pd->lookup.uid))
- r = TAILQ_NEXT(r, entries);
- else if (r->gid.op && (pd->lookup.done || (pd->lookup.done =
+
+ if (sn != NULL && sn->states == 0 && sn->expire == 0) {
#ifdef __FreeBSD__
- pf_socket_lookup(direction, pd, inp), 1)) &&
+ RB_REMOVE(pf_src_tree, &V_tree_src_tracking, sn);
+ V_pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
+ V_pf_status.src_nodes--;
+ pool_put(&V_pf_src_tree_pl, sn);
#else
- pf_socket_lookup(direction, pd), 1)) &&
+ RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
+ pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
+ pf_status.src_nodes--;
+ pool_put(&pf_src_tree_pl, sn);
#endif
- !pf_match_gid(r->gid.op, r->gid.gid[0], r->gid.gid[1],
- pd->lookup.gid))
- r = TAILQ_NEXT(r, entries);
- else if (r->prob && r->prob <= arc4random())
- r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
- r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY)
- r = TAILQ_NEXT(r, entries);
- else {
- if (r->tag)
- tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
- if (r->anchor == NULL) {
- match = 1;
- *rm = r;
- *am = a;
- *rsm = ruleset;
- if ((*rm)->quick)
- break;
- r = TAILQ_NEXT(r, entries);
- } else
- pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
- }
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
}
- r = *rm;
- a = *am;
- ruleset = *rsm;
-
- REASON_SET(&reason, PFRES_MATCH);
-
- if (r->log || (nr != NULL && nr->natpass && nr->log)) {
- if (rewrite)
+ if (nsn != sn && nsn != NULL && nsn->states == 0 && nsn->expire == 0) {
#ifdef __FreeBSD__
- m_copyback(m, off, sizeof(*uh), (caddr_t)uh);
+ RB_REMOVE(pf_src_tree, &V_tree_src_tracking, nsn);
+ V_pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
+ V_pf_status.src_nodes--;
+ pool_put(&V_pf_src_tree_pl, nsn);
#else
- m_copyback(m, off, sizeof(*uh), uh);
+ RB_REMOVE(pf_src_tree, &tree_src_tracking, nsn);
+ pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
+ pf_status.src_nodes--;
+ pool_put(&pf_src_tree_pl, nsn);
#endif
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
- }
-
- if ((r->action == PF_DROP) &&
- ((r->rule_flag & PFRULE_RETURNICMP) ||
- (r->rule_flag & PFRULE_RETURN))) {
- /* undo NAT changes, if they have taken place */
- if (nr != NULL) {
- if (direction == PF_OUT) {
- pf_change_ap(saddr, &uh->uh_sport, pd->ip_sum,
- &uh->uh_sum, &pd->baddr, bport, 1, af);
- rewrite++;
- } else {
- pf_change_ap(daddr, &uh->uh_dport, pd->ip_sum,
- &uh->uh_sum, &pd->baddr, bport, 1, af);
- rewrite++;
- }
- }
- if ((af == AF_INET) && r->return_icmp)
- pf_send_icmp(m, r->return_icmp >> 8,
- r->return_icmp & 255, af, r);
- else if ((af == AF_INET6) && r->return_icmp6)
- pf_send_icmp(m, r->return_icmp6 >> 8,
- r->return_icmp6 & 255, af, r);
- }
-
- if (r->action == PF_DROP)
- return (PF_DROP);
-
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
- REASON_SET(&reason, PFRES_MEMORY);
- return (PF_DROP);
- }
-
- if (r->keep_state || nr != NULL) {
- /* create new state */
- struct pf_state *s = NULL;
- struct pf_src_node *sn = NULL;
-
- /* check maximums */
- if (r->max_states && (r->states >= r->max_states)) {
- pf_status.lcounters[LCNT_STATES]++;
- REASON_SET(&reason, PFRES_MAXSTATES);
- goto cleanup;
- }
- /* src node for filter rule */
- if ((r->rule_flag & PFRULE_SRCTRACK ||
- r->rpool.opts & PF_POOL_STICKYADDR) &&
- pf_insert_src_node(&sn, r, saddr, af) != 0) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- /* src node for translation rule */
- if (nr != NULL && (nr->rpool.opts & PF_POOL_STICKYADDR) &&
- ((direction == PF_OUT &&
- pf_insert_src_node(&nsn, nr, &pd->baddr, af) != 0) ||
- (pf_insert_src_node(&nsn, nr, saddr, af) != 0))) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- s = pool_get(&pf_state_pl, PR_NOWAIT);
- if (s == NULL) {
- REASON_SET(&reason, PFRES_MEMORY);
-cleanup:
- if (sn != NULL && sn->states == 0 && sn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, sn);
- }
- if (nsn != sn && nsn != NULL && nsn->states == 0 &&
- nsn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, nsn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, nsn);
- }
- return (PF_DROP);
- }
- bzero(s, sizeof(*s));
- s->rule.ptr = r;
- s->nat_rule.ptr = nr;
- s->anchor.ptr = a;
- STATE_INC_COUNTERS(s);
- if (r->allow_opts)
- s->state_flags |= PFSTATE_ALLOWOPTS;
- if (r->rule_flag & PFRULE_STATESLOPPY)
- s->state_flags |= PFSTATE_SLOPPY;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
- s->proto = IPPROTO_UDP;
- s->direction = direction;
- s->af = af;
- if (direction == PF_OUT) {
- PF_ACPY(&s->gwy.addr, saddr, af);
- s->gwy.port = uh->uh_sport;
- PF_ACPY(&s->ext.addr, daddr, af);
- s->ext.port = uh->uh_dport;
- if (nr != NULL) {
- PF_ACPY(&s->lan.addr, &pd->baddr, af);
- s->lan.port = bport;
- } else {
- PF_ACPY(&s->lan.addr, &s->gwy.addr, af);
- s->lan.port = s->gwy.port;
- }
- } else {
- PF_ACPY(&s->lan.addr, daddr, af);
- s->lan.port = uh->uh_dport;
- PF_ACPY(&s->ext.addr, saddr, af);
- s->ext.port = uh->uh_sport;
- if (nr != NULL) {
- PF_ACPY(&s->gwy.addr, &pd->baddr, af);
- s->gwy.port = bport;
- } else {
- PF_ACPY(&s->gwy.addr, &s->lan.addr, af);
- s->gwy.port = s->lan.port;
- }
- }
- s->src.state = PFUDPS_SINGLE;
- s->dst.state = PFUDPS_NO_TRAFFIC;
- s->creation = time_second;
- s->expire = time_second;
- s->timeout = PFTM_UDP_FIRST_PACKET;
- pf_set_rt_ifp(s, saddr);
- if (sn != NULL) {
- s->src_node = sn;
- s->src_node->states++;
- }
- if (nsn != NULL) {
- PF_ACPY(&nsn->raddr, &pd->naddr, af);
- s->nat_src_node = nsn;
- s->nat_src_node->states++;
- }
- if (pf_insert_state(BOUND_IFACE(r, kif), s)) {
- REASON_SET(&reason, PFRES_STATEINS);
- pf_src_tree_remove_state(s);
- STATE_DEC_COUNTERS(s);
- pool_put(&pf_state_pl, s);
- return (PF_DROP);
- } else
- *sm = s;
- if (tag > 0) {
- pf_tag_ref(tag);
- s->tag = tag;
- }
- }
-
- /* copy back packet headers if we performed NAT operations */
- if (rewrite)
- m_copyback(m, off, sizeof(*uh), (caddr_t)uh);
-
- return (PF_PASS);
-}
-
-int
-pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
- struct pfi_kif *kif, struct mbuf *m, int off, void *h,
- struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
- struct ifqueue *ifq)
-{
- struct pf_rule *nr = NULL;
- struct pf_addr *saddr = pd->src, *daddr = pd->dst;
- struct pf_rule *r, *a = NULL;
- struct pf_ruleset *ruleset = NULL;
- struct pf_src_node *nsn = NULL;
- u_short reason;
- u_int16_t icmpid = 0, bport, nport = 0;
- sa_family_t af = pd->af;
- u_int8_t icmptype = 0; /* make the compiler happy */
- u_int8_t icmpcode = 0; /* make the compiler happy */
- int state_icmp = 0;
- int tag = -1, rtableid = -1;
-#ifdef INET6
- int rewrite = 0;
-#endif /* INET6 */
- int asd = 0;
- int match = 0;
-
- if (pf_check_congestion(ifq)) {
- REASON_SET(&reason, PFRES_CONGEST);
- return (PF_DROP);
- }
-
- switch (pd->proto) {
-#ifdef INET
- case IPPROTO_ICMP:
- icmptype = pd->hdr.icmp->icmp_type;
- icmpcode = pd->hdr.icmp->icmp_code;
- icmpid = pd->hdr.icmp->icmp_id;
-
- if (icmptype == ICMP_UNREACH ||
- icmptype == ICMP_SOURCEQUENCH ||
- icmptype == ICMP_REDIRECT ||
- icmptype == ICMP_TIMXCEED ||
- icmptype == ICMP_PARAMPROB)
- state_icmp++;
- break;
-#endif /* INET */
-#ifdef INET6
- case IPPROTO_ICMPV6:
- icmptype = pd->hdr.icmp6->icmp6_type;
- icmpcode = pd->hdr.icmp6->icmp6_code;
- icmpid = pd->hdr.icmp6->icmp6_id;
-
- if (icmptype == ICMP6_DST_UNREACH ||
- icmptype == ICMP6_PACKET_TOO_BIG ||
- icmptype == ICMP6_TIME_EXCEEDED ||
- icmptype == ICMP6_PARAM_PROB)
- state_icmp++;
- break;
-#endif /* INET6 */
- }
-
- r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
-
- if (direction == PF_OUT) {
- bport = nport = icmpid;
- /* check outgoing packet for BINAT/NAT */
- if ((nr = pf_get_translation(pd, m, off, PF_OUT, kif, &nsn,
- saddr, icmpid, daddr, icmpid, &pd->naddr, &nport)) !=
- NULL) {
- PF_ACPY(&pd->baddr, saddr, af);
- switch (af) {
-#ifdef INET
- case AF_INET:
- pf_change_a(&saddr->v4.s_addr, pd->ip_sum,
- pd->naddr.v4.s_addr, 0);
- pd->hdr.icmp->icmp_cksum = pf_cksum_fixup(
- pd->hdr.icmp->icmp_cksum, icmpid, nport, 0);
- pd->hdr.icmp->icmp_id = nport;
- m_copyback(m, off, ICMP_MINLEN,
- (caddr_t)pd->hdr.icmp);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- pf_change_a6(saddr, &pd->hdr.icmp6->icmp6_cksum,
- &pd->naddr, 0);
- rewrite++;
- break;
-#endif /* INET6 */
- }
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
- }
- } else {
- bport = nport = icmpid;
- /* check incoming packet for BINAT/RDR */
- if ((nr = pf_get_translation(pd, m, off, PF_IN, kif, &nsn,
- saddr, icmpid, daddr, icmpid, &pd->naddr, &nport)) !=
- NULL) {
- PF_ACPY(&pd->baddr, daddr, af);
- switch (af) {
-#ifdef INET
- case AF_INET:
- pf_change_a(&daddr->v4.s_addr,
- pd->ip_sum, pd->naddr.v4.s_addr, 0);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- pf_change_a6(daddr, &pd->hdr.icmp6->icmp6_cksum,
- &pd->naddr, 0);
- rewrite++;
- break;
-#endif /* INET6 */
- }
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
- }
- }
-
- while (r != NULL) {
- r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
- r = r->skip[PF_SKIP_IFP].ptr;
- else if (r->direction && r->direction != direction)
- r = r->skip[PF_SKIP_DIR].ptr;
- else if (r->af && r->af != af)
- r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != pd->proto)
- r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, saddr, af,
- r->src.neg, kif))
- r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, daddr, af,
- r->dst.neg, NULL))
- r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (r->type && r->type != icmptype + 1)
- r = TAILQ_NEXT(r, entries);
- else if (r->code && r->code != icmpcode + 1)
- r = TAILQ_NEXT(r, entries);
- else if (r->tos && !(r->tos == pd->tos))
- r = TAILQ_NEXT(r, entries);
- else if (r->rule_flag & PFRULE_FRAGMENT)
- r = TAILQ_NEXT(r, entries);
- else if (r->prob && r->prob <= arc4random())
- r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
- r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY)
- r = TAILQ_NEXT(r, entries);
- else {
- if (r->tag)
- tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
- if (r->anchor == NULL) {
- match = 1;
- *rm = r;
- *am = a;
- *rsm = ruleset;
- if ((*rm)->quick)
- break;
- r = TAILQ_NEXT(r, entries);
- } else
- pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
- }
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
- }
- r = *rm;
- a = *am;
- ruleset = *rsm;
-
- REASON_SET(&reason, PFRES_MATCH);
-
- if (r->log || (nr != NULL && nr->natpass && nr->log)) {
-#ifdef INET6
- if (rewrite)
- m_copyback(m, off, sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
-#endif /* INET6 */
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
- }
-
- if (r->action != PF_PASS)
- return (PF_DROP);
-
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
- REASON_SET(&reason, PFRES_MEMORY);
- return (PF_DROP);
- }
-
- if (!state_icmp && (r->keep_state || nr != NULL)) {
- /* create new state */
- struct pf_state *s = NULL;
- struct pf_src_node *sn = NULL;
-
- /* check maximums */
- if (r->max_states && (r->states >= r->max_states)) {
- pf_status.lcounters[LCNT_STATES]++;
- REASON_SET(&reason, PFRES_MAXSTATES);
- goto cleanup;
- }
- /* src node for filter rule */
- if ((r->rule_flag & PFRULE_SRCTRACK ||
- r->rpool.opts & PF_POOL_STICKYADDR) &&
- pf_insert_src_node(&sn, r, saddr, af) != 0) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- /* src node for translation rule */
- if (nr != NULL && (nr->rpool.opts & PF_POOL_STICKYADDR) &&
- ((direction == PF_OUT &&
- pf_insert_src_node(&nsn, nr, &pd->baddr, af) != 0) ||
- (pf_insert_src_node(&nsn, nr, saddr, af) != 0))) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- s = pool_get(&pf_state_pl, PR_NOWAIT);
- if (s == NULL) {
- REASON_SET(&reason, PFRES_MEMORY);
-cleanup:
- if (sn != NULL && sn->states == 0 && sn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, sn);
- }
- if (nsn != sn && nsn != NULL && nsn->states == 0 &&
- nsn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, nsn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, nsn);
- }
- return (PF_DROP);
- }
- bzero(s, sizeof(*s));
- s->rule.ptr = r;
- s->nat_rule.ptr = nr;
- s->anchor.ptr = a;
- STATE_INC_COUNTERS(s);
- if (r->allow_opts)
- s->state_flags |= PFSTATE_ALLOWOPTS;
- if (r->rule_flag & PFRULE_STATESLOPPY)
- s->state_flags |= PFSTATE_SLOPPY;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
- s->proto = pd->proto;
- s->direction = direction;
- s->af = af;
- if (direction == PF_OUT) {
- PF_ACPY(&s->gwy.addr, saddr, af);
- s->gwy.port = nport;
- PF_ACPY(&s->ext.addr, daddr, af);
- s->ext.port = 0;
- if (nr != NULL) {
- PF_ACPY(&s->lan.addr, &pd->baddr, af);
- s->lan.port = bport;
- } else {
- PF_ACPY(&s->lan.addr, &s->gwy.addr, af);
- s->lan.port = s->gwy.port;
- }
- } else {
- PF_ACPY(&s->lan.addr, daddr, af);
- s->lan.port = nport;
- PF_ACPY(&s->ext.addr, saddr, af);
- s->ext.port = 0;
- if (nr != NULL) {
- PF_ACPY(&s->gwy.addr, &pd->baddr, af);
- s->gwy.port = bport;
- } else {
- PF_ACPY(&s->gwy.addr, &s->lan.addr, af);
- s->gwy.port = s->lan.port;
- }
- }
- s->creation = time_second;
- s->expire = time_second;
- s->timeout = PFTM_ICMP_FIRST_PACKET;
- pf_set_rt_ifp(s, saddr);
- if (sn != NULL) {
- s->src_node = sn;
- s->src_node->states++;
- }
- if (nsn != NULL) {
- PF_ACPY(&nsn->raddr, &pd->naddr, af);
- s->nat_src_node = nsn;
- s->nat_src_node->states++;
- }
- if (pf_insert_state(BOUND_IFACE(r, kif), s)) {
- REASON_SET(&reason, PFRES_STATEINS);
- pf_src_tree_remove_state(s);
- STATE_DEC_COUNTERS(s);
- pool_put(&pf_state_pl, s);
- return (PF_DROP);
- } else
- *sm = s;
- if (tag > 0) {
- pf_tag_ref(tag);
- s->tag = tag;
- }
- }
-
-#ifdef INET6
- /* copy back packet headers if we performed IPv6 NAT operations */
- if (rewrite)
- m_copyback(m, off, sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
-#endif /* INET6 */
-
- return (PF_PASS);
-}
-
-int
-pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
- struct pfi_kif *kif, struct mbuf *m, int off, void *h, struct pf_pdesc *pd,
- struct pf_rule **am, struct pf_ruleset **rsm, struct ifqueue *ifq)
-{
- struct pf_rule *nr = NULL;
- struct pf_rule *r, *a = NULL;
- struct pf_ruleset *ruleset = NULL;
- struct pf_src_node *nsn = NULL;
- struct pf_addr *saddr = pd->src, *daddr = pd->dst;
- sa_family_t af = pd->af;
- u_short reason;
- int tag = -1, rtableid = -1;
- int asd = 0;
- int match = 0;
-
- if (pf_check_congestion(ifq)) {
- REASON_SET(&reason, PFRES_CONGEST);
- return (PF_DROP);
- }
-
- r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
-
- if (direction == PF_OUT) {
- /* check outgoing packet for BINAT/NAT */
- if ((nr = pf_get_translation(pd, m, off, PF_OUT, kif, &nsn,
- saddr, 0, daddr, 0, &pd->naddr, NULL)) != NULL) {
- PF_ACPY(&pd->baddr, saddr, af);
- switch (af) {
-#ifdef INET
- case AF_INET:
- pf_change_a(&saddr->v4.s_addr, pd->ip_sum,
- pd->naddr.v4.s_addr, 0);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- PF_ACPY(saddr, &pd->naddr, af);
- break;
-#endif /* INET6 */
- }
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
- }
- } else {
- /* check incoming packet for BINAT/RDR */
- if ((nr = pf_get_translation(pd, m, off, PF_IN, kif, &nsn,
- saddr, 0, daddr, 0, &pd->naddr, NULL)) != NULL) {
- PF_ACPY(&pd->baddr, daddr, af);
- switch (af) {
-#ifdef INET
- case AF_INET:
- pf_change_a(&daddr->v4.s_addr,
- pd->ip_sum, pd->naddr.v4.s_addr, 0);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- PF_ACPY(daddr, &pd->naddr, af);
- break;
-#endif /* INET6 */
- }
- if (nr->natpass)
- r = NULL;
- pd->nat_rule = nr;
- }
- }
-
- while (r != NULL) {
- r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
- r = r->skip[PF_SKIP_IFP].ptr;
- else if (r->direction && r->direction != direction)
- r = r->skip[PF_SKIP_DIR].ptr;
- else if (r->af && r->af != af)
- r = r->skip[PF_SKIP_AF].ptr;
- else if (r->proto && r->proto != pd->proto)
- r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, pd->src, af,
- r->src.neg, kif))
- r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af,
- r->dst.neg, NULL))
- r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (r->tos && !(r->tos == pd->tos))
- r = TAILQ_NEXT(r, entries);
- else if (r->rule_flag & PFRULE_FRAGMENT)
- r = TAILQ_NEXT(r, entries);
- else if (r->prob && r->prob <= arc4random())
- r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
- r = TAILQ_NEXT(r, entries);
- else if (r->os_fingerprint != PF_OSFP_ANY)
- r = TAILQ_NEXT(r, entries);
- else {
- if (r->tag)
- tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
- if (r->anchor == NULL) {
- match = 1;
- *rm = r;
- *am = a;
- *rsm = ruleset;
- if ((*rm)->quick)
- break;
- r = TAILQ_NEXT(r, entries);
- } else
- pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
- }
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
- }
- r = *rm;
- a = *am;
- ruleset = *rsm;
-
- REASON_SET(&reason, PFRES_MATCH);
-
- if (r->log || (nr != NULL && nr->natpass && nr->log))
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
-
- if ((r->action == PF_DROP) &&
- ((r->rule_flag & PFRULE_RETURNICMP) ||
- (r->rule_flag & PFRULE_RETURN))) {
- struct pf_addr *a = NULL;
-
- if (nr != NULL) {
- if (direction == PF_OUT)
- a = saddr;
- else
- a = daddr;
- }
- if (a != NULL) {
- switch (af) {
-#ifdef INET
- case AF_INET:
- pf_change_a(&a->v4.s_addr, pd->ip_sum,
- pd->baddr.v4.s_addr, 0);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- PF_ACPY(a, &pd->baddr, af);
- break;
-#endif /* INET6 */
- }
- }
- if ((af == AF_INET) && r->return_icmp)
- pf_send_icmp(m, r->return_icmp >> 8,
- r->return_icmp & 255, af, r);
- else if ((af == AF_INET6) && r->return_icmp6)
- pf_send_icmp(m, r->return_icmp6 >> 8,
- r->return_icmp6 & 255, af, r);
- }
-
- if (r->action != PF_PASS)
- return (PF_DROP);
-
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
- REASON_SET(&reason, PFRES_MEMORY);
- return (PF_DROP);
- }
-
- if (r->keep_state || nr != NULL) {
- /* create new state */
- struct pf_state *s = NULL;
- struct pf_src_node *sn = NULL;
-
- /* check maximums */
- if (r->max_states && (r->states >= r->max_states)) {
- pf_status.lcounters[LCNT_STATES]++;
- REASON_SET(&reason, PFRES_MAXSTATES);
- goto cleanup;
- }
- /* src node for filter rule */
- if ((r->rule_flag & PFRULE_SRCTRACK ||
- r->rpool.opts & PF_POOL_STICKYADDR) &&
- pf_insert_src_node(&sn, r, saddr, af) != 0) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- /* src node for translation rule */
- if (nr != NULL && (nr->rpool.opts & PF_POOL_STICKYADDR) &&
- ((direction == PF_OUT &&
- pf_insert_src_node(&nsn, nr, &pd->baddr, af) != 0) ||
- (pf_insert_src_node(&nsn, nr, saddr, af) != 0))) {
- REASON_SET(&reason, PFRES_SRCLIMIT);
- goto cleanup;
- }
- s = pool_get(&pf_state_pl, PR_NOWAIT);
- if (s == NULL) {
- REASON_SET(&reason, PFRES_MEMORY);
-cleanup:
- if (sn != NULL && sn->states == 0 && sn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, sn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, sn);
- }
- if (nsn != sn && nsn != NULL && nsn->states == 0 &&
- nsn->expire == 0) {
- RB_REMOVE(pf_src_tree, &tree_src_tracking, nsn);
- pf_status.scounters[SCNT_SRC_NODE_REMOVALS]++;
- pf_status.src_nodes--;
- pool_put(&pf_src_tree_pl, nsn);
- }
- return (PF_DROP);
- }
- bzero(s, sizeof(*s));
- s->rule.ptr = r;
- s->nat_rule.ptr = nr;
- s->anchor.ptr = a;
- STATE_INC_COUNTERS(s);
- if (r->allow_opts)
- s->state_flags |= PFSTATE_ALLOWOPTS;
- if (r->rule_flag & PFRULE_STATESLOPPY)
- s->state_flags |= PFSTATE_SLOPPY;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
- s->proto = pd->proto;
- s->direction = direction;
- s->af = af;
- if (direction == PF_OUT) {
- PF_ACPY(&s->gwy.addr, saddr, af);
- PF_ACPY(&s->ext.addr, daddr, af);
- if (nr != NULL)
- PF_ACPY(&s->lan.addr, &pd->baddr, af);
- else
- PF_ACPY(&s->lan.addr, &s->gwy.addr, af);
- } else {
- PF_ACPY(&s->lan.addr, daddr, af);
- PF_ACPY(&s->ext.addr, saddr, af);
- if (nr != NULL)
- PF_ACPY(&s->gwy.addr, &pd->baddr, af);
- else
- PF_ACPY(&s->gwy.addr, &s->lan.addr, af);
- }
- s->src.state = PFOTHERS_SINGLE;
- s->dst.state = PFOTHERS_NO_TRAFFIC;
- s->creation = time_second;
- s->expire = time_second;
- s->timeout = PFTM_OTHER_FIRST_PACKET;
- pf_set_rt_ifp(s, saddr);
- if (sn != NULL) {
- s->src_node = sn;
- s->src_node->states++;
- }
- if (nsn != NULL) {
- PF_ACPY(&nsn->raddr, &pd->naddr, af);
- s->nat_src_node = nsn;
- s->nat_src_node->states++;
- }
- if (pf_insert_state(BOUND_IFACE(r, kif), s)) {
- REASON_SET(&reason, PFRES_STATEINS);
- pf_src_tree_remove_state(s);
- STATE_DEC_COUNTERS(s);
- pool_put(&pf_state_pl, s);
- return (PF_DROP);
- } else
- *sm = s;
- if (tag > 0) {
- pf_tag_ref(tag);
- s->tag = tag;
- }
}
-
- return (PF_PASS);
+ return (PF_DROP);
}
int
@@ -4649,9 +4107,14 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
pd->proto == IPPROTO_ICMPV6) &&
(r->type || r->code))
r = TAILQ_NEXT(r, entries);
- else if (r->prob && r->prob <= arc4random())
+ else if (r->prob && r->prob <=
+ (arc4random() % (UINT_MAX - 1) + 1))
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+#ifdef __FreeBSD__
+ else if (r->match_tag && !pf_match_tag(m, r, &tag, pd->pf_mtag))
+#else
+ else if (r->match_tag && !pf_match_tag(m, r, &tag))
+#endif
r = TAILQ_NEXT(r, entries);
else {
if (r->anchor == NULL) {
@@ -4683,7 +4146,11 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
if (r->action != PF_PASS)
return (PF_DROP);
- if (pf_tag_packet(m, pd->pf_mtag, tag, -1)) {
+#ifdef __FreeBSD__
+ if (pf_tag_packet(m, tag, -1, pd->pf_mtag)) {
+#else
+ if (pf_tag_packet(m, tag, -1)) {
+#endif
REASON_SET(&reason, PFRES_MEMORY);
return (PF_DROP);
}
@@ -4696,11 +4163,11 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
struct pf_state **state, struct pfi_kif *kif, struct mbuf *m, int off,
struct pf_pdesc *pd, u_short *reason, int *copyback)
{
- struct tcphdr *th = pd->hdr.tcp;
- u_int16_t win = ntohs(th->th_win);
- u_int32_t ack, end, seq, orig_seq;
- u_int8_t sws, dws;
- int ackskew;
+ struct tcphdr *th = pd->hdr.tcp;
+ u_int16_t win = ntohs(th->th_win);
+ u_int32_t ack, end, seq, orig_seq;
+ u_int8_t sws, dws;
+ int ackskew;
if (src->wscale && dst->wscale && !(th->th_flags & TH_SYN)) {
sws = src->wscale & PF_WSCALE_MASK;
@@ -4728,13 +4195,9 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
/* Deferred generation of sequence number modulator */
if (dst->seqdiff && !src->seqdiff) {
-#ifdef __FreeBSD__
- while ((src->seqdiff = pf_new_isn(*state) - seq) == 0)
- ;
-#else
- while ((src->seqdiff = tcp_rndiss_next() - seq) == 0)
+ /* use random iss for the TCP server */
+ while ((src->seqdiff = arc4random() - seq) == 0)
;
-#endif
ack = ntohl(th->th_ack) - dst->seqdiff;
pf_change_a(&th->th_seq, &th->th_sum, htonl(seq +
src->seqdiff), 0);
@@ -4841,7 +4304,7 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
}
-#define MAXACKWINDOW (0xffff + 1500) /* 1500 is an arbitrary fudge factor */
+#define MAXACKWINDOW (0xffff + 1500) /* 1500 is an arbitrary fudge factor */
if (SEQ_GEQ(src->seqhi, end) &&
/* Last octet inside other's window space */
SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) &&
@@ -4851,7 +4314,8 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
(ackskew <= (MAXACKWINDOW << sws)) &&
/* Acking not more than one window forward */
((th->th_flags & TH_RST) == 0 || orig_seq == src->seqlo ||
- (orig_seq == src->seqlo + 1) || (pd->flags & PFDESC_IP_REAS) == 0)) {
+ (orig_seq == src->seqlo + 1) || (orig_seq + 1 == src->seqlo) ||
+ (pd->flags & PFDESC_IP_REAS) == 0)) {
/* Require an exact/+1 sequence match on resets when possible */
if (dst->scrub || src->scrub) {
@@ -4941,19 +4405,25 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
* and keep updating the state TTL.
*/
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf: loose state match: ");
pf_print_state(*state);
pf_print_flags(th->th_flags);
printf(" seq=%u (%u) ack=%u len=%u ackskew=%d "
- "pkts=%llu:%llu\n", seq, orig_seq, ack, pd->p_len,
+ "pkts=%llu:%llu dir=%s,%s\n", seq, orig_seq, ack,
#ifdef __FreeBSD__
- ackskew, (unsigned long long)(*state)->packets[0],
- (unsigned long long)(*state)->packets[1]);
+ pd->p_len, ackskew, (unsigned long long)(*state)->packets[0],
+ (unsigned long long)(*state)->packets[1],
#else
- ackskew, (*state)->packets[0],
- (*state)->packets[1]);
+ pd->p_len, ackskew, (*state)->packets[0],
+ (*state)->packets[1],
#endif
+ pd->dir == PF_IN ? "in" : "out",
+ pd->dir == (*state)->direction ? "fwd" : "rev");
}
if (dst->scrub || src->scrub) {
@@ -4991,7 +4461,7 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
/* Send RST for state mismatches during handshake */
if (!(th->th_flags & TH_RST))
#ifdef __FreeBSD__
- pf_send_tcp(m, (*state)->rule.ptr, pd->af,
+ pf_send_tcp(NULL, (*state)->rule.ptr, pd->af,
#else
pf_send_tcp((*state)->rule.ptr, pd->af,
#endif
@@ -5003,16 +4473,16 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
src->seqlo = 0;
src->seqhi = 1;
src->max_win = 1;
+#ifdef __FreeBSD__
+ } else if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
} else if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf: BAD state: ");
pf_print_state(*state);
pf_print_flags(th->th_flags);
printf(" seq=%u (%u) ack=%u len=%u ackskew=%d "
-#ifdef notyet
"pkts=%llu:%llu dir=%s,%s\n",
-#else
- "pkts=%llu:%llu%s\n",
-#endif
seq, orig_seq, ack, pd->p_len, ackskew,
#ifdef __FreeBSD__
(unsigned long long)(*state)->packets[0],
@@ -5020,12 +4490,8 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
#else
(*state)->packets[0], (*state)->packets[1],
#endif
-#ifdef notyet
- direction == PF_IN ? "in" : "out",
- direction == (*state)->direction ? "fwd" : "rev");
-#else
- "");
-#endif
+ pd->dir == PF_IN ? "in" : "out",
+ pd->dir == (*state)->direction ? "fwd" : "rev");
printf("pf: State failure on: %c %c %c %c | %c %c\n",
SEQ_GEQ(src->seqhi, end) ? ' ' : '1',
SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) ?
@@ -5039,7 +4505,6 @@ pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst,
return (PF_DROP);
}
- /* Any packets which have gotten here are to be passed */
return (PF_PASS);
}
@@ -5114,32 +4579,36 @@ pf_tcp_track_sloppy(struct pf_state_peer *src, struct pf_state_peer *dst,
return (PF_PASS);
}
-
int
pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct mbuf *m, int off, void *h, struct pf_pdesc *pd,
u_short *reason)
{
- struct pf_state_cmp key;
+ struct pf_state_key_cmp key;
struct tcphdr *th = pd->hdr.tcp;
int copyback = 0;
struct pf_state_peer *src, *dst;
+ struct pf_state_key *sk;
key.af = pd->af;
key.proto = IPPROTO_TCP;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd->src, key.af);
- PF_ACPY(&key.gwy.addr, pd->dst, key.af);
- key.ext.port = th->th_sport;
- key.gwy.port = th->th_dport;
- } else {
- PF_ACPY(&key.lan.addr, pd->src, key.af);
- PF_ACPY(&key.ext.addr, pd->dst, key.af);
- key.lan.port = th->th_sport;
- key.ext.port = th->th_dport;
+ if (direction == PF_IN) { /* wire side, straight */
+ PF_ACPY(&key.addr[0], pd->src, key.af);
+ PF_ACPY(&key.addr[1], pd->dst, key.af);
+ key.port[0] = th->th_sport;
+ key.port[1] = th->th_dport;
+ } else { /* stack side, reverse */
+ PF_ACPY(&key.addr[1], pd->src, key.af);
+ PF_ACPY(&key.addr[0], pd->dst, key.af);
+ key.port[1] = th->th_sport;
+ key.port[0] = th->th_dport;
}
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
if (direction == (*state)->direction) {
src = &(*state)->src;
@@ -5149,6 +4618,8 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
dst = &(*state)->src;
}
+ sk = (*state)->key[pd->didx];
+
if ((*state)->src.state == PF_TCPS_PROXY_SRC) {
if (direction != (*state)->direction) {
REASON_SET(reason, PFRES_SYNPROXY);
@@ -5183,15 +4654,6 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->src.state = PF_TCPS_PROXY_DST;
}
if ((*state)->src.state == PF_TCPS_PROXY_DST) {
- struct pf_state_host *src, *dst;
-
- if (direction == PF_OUT) {
- src = &(*state)->gwy;
- dst = &(*state)->ext;
- } else {
- src = &(*state)->ext;
- dst = &(*state)->lan;
- }
if (direction == (*state)->direction) {
if (((th->th_flags & (TH_SYN|TH_ACK)) != TH_ACK) ||
(ntohl(th->th_ack) != (*state)->src.seqhi + 1) ||
@@ -5204,11 +4666,11 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->dst.seqhi = htonl(arc4random());
#ifdef __FreeBSD__
pf_send_tcp(NULL, (*state)->rule.ptr, pd->af,
- &src->addr,
#else
- pf_send_tcp((*state)->rule.ptr, pd->af, &src->addr,
+ pf_send_tcp((*state)->rule.ptr, pd->af,
#endif
- &dst->addr, src->port, dst->port,
+ &sk->addr[pd->sidx], &sk->addr[pd->didx],
+ sk->port[pd->sidx], sk->port[pd->didx],
(*state)->dst.seqhi, 0, TH_SYN, 0,
(*state)->src.mss, 0, 0, (*state)->tag, NULL, NULL);
REASON_SET(reason, PFRES_SYNPROXY);
@@ -5232,11 +4694,11 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->tag, NULL, NULL);
#ifdef __FreeBSD__
pf_send_tcp(NULL, (*state)->rule.ptr, pd->af,
- &src->addr,
#else
- pf_send_tcp((*state)->rule.ptr, pd->af, &src->addr,
+ pf_send_tcp((*state)->rule.ptr, pd->af,
#endif
- &dst->addr, src->port, dst->port,
+ &sk->addr[pd->sidx], &sk->addr[pd->didx],
+ sk->port[pd->sidx], sk->port[pd->didx],
(*state)->src.seqhi + 1, (*state)->src.seqlo + 1,
TH_ACK, (*state)->dst.max_win, 0, 0, 1,
0, NULL, NULL);
@@ -5259,7 +4721,11 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
if (((th->th_flags & (TH_SYN|TH_ACK)) == TH_SYN) &&
dst->state >= TCPS_FIN_WAIT_2 &&
src->state >= TCPS_FIN_WAIT_2) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf: state reuse ");
pf_print_state(*state);
pf_print_flags(th->th_flags);
@@ -5282,21 +4748,31 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
}
/* translate source/destination address, if necessary */
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_OUT)
+ if ((*state)->key[PF_SK_WIRE] != (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk = (*state)->key[pd->didx];
+
+ if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], pd->af) ||
+ nk->port[pd->sidx] != th->th_sport)
pf_change_ap(pd->src, &th->th_sport, pd->ip_sum,
- &th->th_sum, &(*state)->gwy.addr,
- (*state)->gwy.port, 0, pd->af);
- else
+ &th->th_sum, &nk->addr[pd->sidx],
+ nk->port[pd->sidx], 0, pd->af);
+
+ if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], pd->af) ||
+ nk->port[pd->didx] != th->th_dport)
pf_change_ap(pd->dst, &th->th_dport, pd->ip_sum,
- &th->th_sum, &(*state)->lan.addr,
- (*state)->lan.port, 0, pd->af);
- m_copyback(m, off, sizeof(*th), (caddr_t)th);
- } else if (copyback) {
- /* Copyback sequence modulation or stateful scrub changes */
- m_copyback(m, off, sizeof(*th), (caddr_t)th);
+ &th->th_sum, &nk->addr[pd->didx],
+ nk->port[pd->didx], 0, pd->af);
+ copyback = 1;
}
+ /* Copyback sequence modulation or stateful scrub changes if needed */
+ if (copyback)
+#ifdef __FreeBSD__
+ m_copyback(m, off, sizeof(*th), (caddr_t)th);
+#else
+ m_copyback(m, off, sizeof(*th), th);
+#endif
+
return (PF_PASS);
}
@@ -5305,24 +4781,28 @@ pf_test_state_udp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct mbuf *m, int off, void *h, struct pf_pdesc *pd)
{
struct pf_state_peer *src, *dst;
- struct pf_state_cmp key;
+ struct pf_state_key_cmp key;
struct udphdr *uh = pd->hdr.udp;
key.af = pd->af;
key.proto = IPPROTO_UDP;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd->src, key.af);
- PF_ACPY(&key.gwy.addr, pd->dst, key.af);
- key.ext.port = uh->uh_sport;
- key.gwy.port = uh->uh_dport;
- } else {
- PF_ACPY(&key.lan.addr, pd->src, key.af);
- PF_ACPY(&key.ext.addr, pd->dst, key.af);
- key.lan.port = uh->uh_sport;
- key.ext.port = uh->uh_dport;
+ if (direction == PF_IN) { /* wire side, straight */
+ PF_ACPY(&key.addr[0], pd->src, key.af);
+ PF_ACPY(&key.addr[1], pd->dst, key.af);
+ key.port[0] = uh->uh_sport;
+ key.port[1] = uh->uh_dport;
+ } else { /* stack side, reverse */
+ PF_ACPY(&key.addr[1], pd->src, key.af);
+ PF_ACPY(&key.addr[0], pd->dst, key.af);
+ key.port[1] = uh->uh_sport;
+ key.port[0] = uh->uh_dport;
}
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
if (direction == (*state)->direction) {
src = &(*state)->src;
@@ -5346,16 +4826,25 @@ pf_test_state_udp(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->timeout = PFTM_UDP_SINGLE;
/* translate source/destination address, if necessary */
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_OUT)
+ if ((*state)->key[PF_SK_WIRE] != (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk = (*state)->key[pd->didx];
+
+ if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], pd->af) ||
+ nk->port[pd->sidx] != uh->uh_sport)
pf_change_ap(pd->src, &uh->uh_sport, pd->ip_sum,
- &uh->uh_sum, &(*state)->gwy.addr,
- (*state)->gwy.port, 1, pd->af);
- else
+ &uh->uh_sum, &nk->addr[pd->sidx],
+ nk->port[pd->sidx], 1, pd->af);
+
+ if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], pd->af) ||
+ nk->port[pd->didx] != uh->uh_dport)
pf_change_ap(pd->dst, &uh->uh_dport, pd->ip_sum,
- &uh->uh_sum, &(*state)->lan.addr,
- (*state)->lan.port, 1, pd->af);
+ &uh->uh_sum, &nk->addr[pd->didx],
+ nk->port[pd->didx], 1, pd->af);
+#ifdef __FreeBSD__
m_copyback(m, off, sizeof(*uh), (caddr_t)uh);
+#else
+ m_copyback(m, off, sizeof(*uh), uh);
+#endif
}
return (PF_PASS);
@@ -5365,12 +4854,15 @@ int
pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct mbuf *m, int off, void *h, struct pf_pdesc *pd, u_short *reason)
{
- struct pf_addr *saddr = pd->src, *daddr = pd->dst;
- u_int16_t icmpid = 0; /* make the compiler happy */
- u_int16_t *icmpsum = NULL; /* make the compiler happy */
- u_int8_t icmptype = 0; /* make the compiler happy */
+ struct pf_addr *saddr = pd->src, *daddr = pd->dst;
+#ifdef __FreeBSD__
+ u_int16_t icmpid = 0, *icmpsum;
+#else
+ u_int16_t icmpid, *icmpsum;
+#endif
+ u_int8_t icmptype;
int state_icmp = 0;
- struct pf_state_cmp key;
+ struct pf_state_key_cmp key;
switch (pd->proto) {
#ifdef INET
@@ -5410,84 +4902,84 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
*/
key.af = pd->af;
key.proto = pd->proto;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd->src, key.af);
- PF_ACPY(&key.gwy.addr, pd->dst, key.af);
- key.ext.port = 0;
- key.gwy.port = icmpid;
- } else {
- PF_ACPY(&key.lan.addr, pd->src, key.af);
- PF_ACPY(&key.ext.addr, pd->dst, key.af);
- key.lan.port = icmpid;
- key.ext.port = 0;
+ key.port[0] = key.port[1] = icmpid;
+ if (direction == PF_IN) { /* wire side, straight */
+ PF_ACPY(&key.addr[0], pd->src, key.af);
+ PF_ACPY(&key.addr[1], pd->dst, key.af);
+ } else { /* stack side, reverse */
+ PF_ACPY(&key.addr[1], pd->src, key.af);
+ PF_ACPY(&key.addr[0], pd->dst, key.af);
}
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
(*state)->expire = time_second;
(*state)->timeout = PFTM_ICMP_ERROR_REPLY;
/* translate source/destination address, if necessary */
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_OUT) {
- switch (pd->af) {
+ if ((*state)->key[PF_SK_WIRE] != (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk = (*state)->key[pd->didx];
+
+ switch (pd->af) {
#ifdef INET
- case AF_INET:
+ case AF_INET:
+ if (PF_ANEQ(pd->src,
+ &nk->addr[pd->sidx], AF_INET))
pf_change_a(&saddr->v4.s_addr,
pd->ip_sum,
- (*state)->gwy.addr.v4.s_addr, 0);
- pd->hdr.icmp->icmp_cksum =
- pf_cksum_fixup(
- pd->hdr.icmp->icmp_cksum, icmpid,
- (*state)->gwy.port, 0);
- pd->hdr.icmp->icmp_id =
- (*state)->gwy.port;
- m_copyback(m, off, ICMP_MINLEN,
- (caddr_t)pd->hdr.icmp);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- pf_change_a6(saddr,
- &pd->hdr.icmp6->icmp6_cksum,
- &(*state)->gwy.addr, 0);
- m_copyback(m, off,
- sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
- break;
-#endif /* INET6 */
- }
- } else {
- switch (pd->af) {
-#ifdef INET
- case AF_INET:
+ nk->addr[pd->sidx].v4.s_addr, 0);
+
+ if (PF_ANEQ(pd->dst, &nk->addr[pd->didx],
+ AF_INET))
pf_change_a(&daddr->v4.s_addr,
pd->ip_sum,
- (*state)->lan.addr.v4.s_addr, 0);
+ nk->addr[pd->didx].v4.s_addr, 0);
+
+ if (nk->port[0] !=
+ pd->hdr.icmp->icmp_id) {
pd->hdr.icmp->icmp_cksum =
pf_cksum_fixup(
pd->hdr.icmp->icmp_cksum, icmpid,
- (*state)->lan.port, 0);
+ nk->port[pd->sidx], 0);
pd->hdr.icmp->icmp_id =
- (*state)->lan.port;
- m_copyback(m, off, ICMP_MINLEN,
- (caddr_t)pd->hdr.icmp);
- break;
+ nk->port[pd->sidx];
+ }
+
+ m_copyback(m, off, ICMP_MINLEN,
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp);
+ break;
#endif /* INET */
#ifdef INET6
- case AF_INET6:
+ case AF_INET6:
+ if (PF_ANEQ(pd->src,
+ &nk->addr[pd->sidx], AF_INET6))
+ pf_change_a6(saddr,
+ &pd->hdr.icmp6->icmp6_cksum,
+ &nk->addr[pd->sidx], 0);
+
+ if (PF_ANEQ(pd->dst,
+ &nk->addr[pd->didx], AF_INET6))
pf_change_a6(daddr,
&pd->hdr.icmp6->icmp6_cksum,
- &(*state)->lan.addr, 0);
- m_copyback(m, off,
- sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
- break;
+ &nk->addr[pd->didx], 0);
+
+ m_copyback(m, off,
+ sizeof(struct icmp6_hdr),
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp6);
+ break;
#endif /* INET6 */
- }
}
}
-
return (PF_PASS);
} else {
@@ -5497,6 +4989,9 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
*/
struct pf_pdesc pd2;
+#ifdef __FreeBSD__
+ bzero(&pd2, sizeof pd2);
+#endif
#ifdef INET
struct ip h2;
#endif /* INET */
@@ -5504,10 +4999,18 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct ip6_hdr h2_6;
int terminal = 0;
#endif /* INET6 */
- int ipoff2 = 0; /* make the compiler happy */
- int off2 = 0; /* make the compiler happy */
+#ifdef __FreeBSD__
+ int ipoff2 = 0;
+ int off2 = 0;
+#else
+ int ipoff2;
+ int off2;
+#endif
pd2.af = pd->af;
+ /* Payload packet is from the opposite direction. */
+ pd2.sidx = (direction == PF_IN) ? 1 : 0;
+ pd2.didx = (direction == PF_IN) ? 0 : 1;
switch (pd->af) {
#ifdef INET
case AF_INET:
@@ -5593,10 +5096,6 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
} while (!terminal);
break;
#endif /* INET6 */
-#ifdef __FreeBSD__
- default:
- panic("AF not supported: %d", pd->af);
-#endif
}
switch (pd2.proto) {
@@ -5622,19 +5121,16 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
key.af = pd2.af;
key.proto = IPPROTO_TCP;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd2.dst, key.af);
- PF_ACPY(&key.gwy.addr, pd2.src, key.af);
- key.ext.port = th.th_dport;
- key.gwy.port = th.th_sport;
- } else {
- PF_ACPY(&key.lan.addr, pd2.dst, key.af);
- PF_ACPY(&key.ext.addr, pd2.src, key.af);
- key.lan.port = th.th_dport;
- key.ext.port = th.th_sport;
- }
+ PF_ACPY(&key.addr[pd2.sidx], pd2.src, key.af);
+ PF_ACPY(&key.addr[pd2.didx], pd2.dst, key.af);
+ key.port[pd2.sidx] = th.th_sport;
+ key.port[pd2.didx] = th.th_dport;
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
if (direction == (*state)->direction) {
src = &(*state)->dst;
@@ -5660,7 +5156,11 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
if (!((*state)->state_flags & PFSTATE_SLOPPY) &&
(!SEQ_GEQ(src->seqhi, seq) ||
!SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)))) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
printf("pf: BAD ICMP %d:%d ",
icmptype, pd->hdr.icmp->icmp_code);
pf_print_host(pd->src, 0, pd->af);
@@ -5672,22 +5172,47 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
}
REASON_SET(reason, PFRES_BADSTATE);
return (PF_DROP);
+ } else {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
+ printf("pf: OK ICMP %d:%d ",
+ icmptype, pd->hdr.icmp->icmp_code);
+ pf_print_host(pd->src, 0, pd->af);
+ printf(" -> ");
+ pf_print_host(pd->dst, 0, pd->af);
+ printf(" state: ");
+ pf_print_state(*state);
+ printf(" seq=%u\n", seq);
+ }
}
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_IN) {
+ /* translate source/destination address, if necessary */
+ if ((*state)->key[PF_SK_WIRE] !=
+ (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk =
+ (*state)->key[pd->didx];
+
+ if (PF_ANEQ(pd2.src,
+ &nk->addr[pd2.sidx], pd2.af) ||
+ nk->port[pd2.sidx] != th.th_sport)
pf_change_icmp(pd2.src, &th.th_sport,
- daddr, &(*state)->lan.addr,
- (*state)->lan.port, NULL,
+ daddr, &nk->addr[pd2.sidx],
+ nk->port[pd2.sidx], NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, pd2.af);
- } else {
+
+ if (PF_ANEQ(pd2.dst,
+ &nk->addr[pd2.didx], pd2.af) ||
+ nk->port[pd2.didx] != th.th_dport)
pf_change_icmp(pd2.dst, &th.th_dport,
- saddr, &(*state)->gwy.addr,
- (*state)->gwy.port, NULL,
+ NULL, /* XXX Inbound NAT? */
+ &nk->addr[pd2.didx],
+ nk->port[pd2.didx], NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, pd2.af);
- }
copyback = 1;
}
@@ -5696,22 +5221,38 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
#ifdef INET
case AF_INET:
m_copyback(m, off, ICMP_MINLEN,
- (caddr_t)pd->hdr.icmp);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp);
m_copyback(m, ipoff2, sizeof(h2),
- (caddr_t)&h2);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ &h2);
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp6);
m_copyback(m, ipoff2, sizeof(h2_6),
- (caddr_t)&h2_6);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ &h2_6);
break;
#endif /* INET6 */
}
+#ifdef __FreeBSD__
m_copyback(m, off2, 8, (caddr_t)&th);
+#else
+ m_copyback(m, off2, 8, &th);
+#endif
}
return (PF_PASS);
@@ -5730,57 +5271,79 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
key.af = pd2.af;
key.proto = IPPROTO_UDP;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd2.dst, key.af);
- PF_ACPY(&key.gwy.addr, pd2.src, key.af);
- key.ext.port = uh.uh_dport;
- key.gwy.port = uh.uh_sport;
- } else {
- PF_ACPY(&key.lan.addr, pd2.dst, key.af);
- PF_ACPY(&key.ext.addr, pd2.src, key.af);
- key.lan.port = uh.uh_dport;
- key.ext.port = uh.uh_sport;
- }
+ PF_ACPY(&key.addr[pd2.sidx], pd2.src, key.af);
+ PF_ACPY(&key.addr[pd2.didx], pd2.dst, key.af);
+ key.port[pd2.sidx] = uh.uh_sport;
+ key.port[pd2.didx] = uh.uh_dport;
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_IN) {
+ /* translate source/destination address, if necessary */
+ if ((*state)->key[PF_SK_WIRE] !=
+ (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk =
+ (*state)->key[pd->didx];
+
+ if (PF_ANEQ(pd2.src,
+ &nk->addr[pd2.sidx], pd2.af) ||
+ nk->port[pd2.sidx] != uh.uh_sport)
pf_change_icmp(pd2.src, &uh.uh_sport,
- daddr, &(*state)->lan.addr,
- (*state)->lan.port, &uh.uh_sum,
+ daddr, &nk->addr[pd2.sidx],
+ nk->port[pd2.sidx], &uh.uh_sum,
pd2.ip_sum, icmpsum,
pd->ip_sum, 1, pd2.af);
- } else {
+
+ if (PF_ANEQ(pd2.dst,
+ &nk->addr[pd2.didx], pd2.af) ||
+ nk->port[pd2.didx] != uh.uh_dport)
pf_change_icmp(pd2.dst, &uh.uh_dport,
- saddr, &(*state)->gwy.addr,
- (*state)->gwy.port, &uh.uh_sum,
+ NULL, /* XXX Inbound NAT? */
+ &nk->addr[pd2.didx],
+ nk->port[pd2.didx], &uh.uh_sum,
pd2.ip_sum, icmpsum,
pd->ip_sum, 1, pd2.af);
- }
+
switch (pd2.af) {
#ifdef INET
case AF_INET:
m_copyback(m, off, ICMP_MINLEN,
- (caddr_t)pd->hdr.icmp);
- m_copyback(m, ipoff2, sizeof(h2),
- (caddr_t)&h2);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp);
+#ifdef __FreeBSD__
+ m_copyback(m, ipoff2, sizeof(h2), (caddr_t)&h2);
+#else
+ m_copyback(m, ipoff2, sizeof(h2), &h2);
+#endif
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp6);
m_copyback(m, ipoff2, sizeof(h2_6),
- (caddr_t)&h2_6);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ &h2_6);
break;
#endif /* INET6 */
}
- m_copyback(m, off2, sizeof(uh),
- (caddr_t)&uh);
+#ifdef __FreeBSD__
+ m_copyback(m, off2, sizeof(uh), (caddr_t)&uh);
+#else
+ m_copyback(m, off2, sizeof(uh), &uh);
+#endif
}
-
return (PF_PASS);
break;
}
@@ -5798,42 +5361,51 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
key.af = pd2.af;
key.proto = IPPROTO_ICMP;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd2.dst, key.af);
- PF_ACPY(&key.gwy.addr, pd2.src, key.af);
- key.ext.port = 0;
- key.gwy.port = iih.icmp_id;
- } else {
- PF_ACPY(&key.lan.addr, pd2.dst, key.af);
- PF_ACPY(&key.ext.addr, pd2.src, key.af);
- key.lan.port = iih.icmp_id;
- key.ext.port = 0;
- }
+ PF_ACPY(&key.addr[pd2.sidx], pd2.src, key.af);
+ PF_ACPY(&key.addr[pd2.didx], pd2.dst, key.af);
+ key.port[0] = key.port[1] = iih.icmp_id;
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_IN) {
+ /* translate source/destination address, if necessary */
+ if ((*state)->key[PF_SK_WIRE] !=
+ (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk =
+ (*state)->key[pd->didx];
+
+ if (PF_ANEQ(pd2.src,
+ &nk->addr[pd2.sidx], pd2.af) ||
+ nk->port[pd2.sidx] != iih.icmp_id)
pf_change_icmp(pd2.src, &iih.icmp_id,
- daddr, &(*state)->lan.addr,
- (*state)->lan.port, NULL,
+ daddr, &nk->addr[pd2.sidx],
+ nk->port[pd2.sidx], NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, AF_INET);
- } else {
+
+ if (PF_ANEQ(pd2.dst,
+ &nk->addr[pd2.didx], pd2.af) ||
+ nk->port[pd2.didx] != iih.icmp_id)
pf_change_icmp(pd2.dst, &iih.icmp_id,
- saddr, &(*state)->gwy.addr,
- (*state)->gwy.port, NULL,
+ NULL, /* XXX Inbound NAT? */
+ &nk->addr[pd2.didx],
+ nk->port[pd2.didx], NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, AF_INET);
- }
- m_copyback(m, off, ICMP_MINLEN,
- (caddr_t)pd->hdr.icmp);
- m_copyback(m, ipoff2, sizeof(h2),
- (caddr_t)&h2);
- m_copyback(m, off2, ICMP_MINLEN,
- (caddr_t)&iih);
- }
+#ifdef __FreeBSD__
+ m_copyback(m, off, ICMP_MINLEN, (caddr_t)pd->hdr.icmp);
+ m_copyback(m, ipoff2, sizeof(h2), (caddr_t)&h2);
+ m_copyback(m, off2, ICMP_MINLEN, (caddr_t)&iih);
+#else
+ m_copyback(m, off, ICMP_MINLEN, pd->hdr.icmp);
+ m_copyback(m, ipoff2, sizeof(h2), &h2);
+ m_copyback(m, off2, ICMP_MINLEN, &iih);
+#endif
+ }
return (PF_PASS);
break;
}
@@ -5852,42 +5424,55 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
key.af = pd2.af;
key.proto = IPPROTO_ICMPV6;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd2.dst, key.af);
- PF_ACPY(&key.gwy.addr, pd2.src, key.af);
- key.ext.port = 0;
- key.gwy.port = iih.icmp6_id;
- } else {
- PF_ACPY(&key.lan.addr, pd2.dst, key.af);
- PF_ACPY(&key.ext.addr, pd2.src, key.af);
- key.lan.port = iih.icmp6_id;
- key.ext.port = 0;
- }
+ PF_ACPY(&key.addr[pd2.sidx], pd2.src, key.af);
+ PF_ACPY(&key.addr[pd2.didx], pd2.dst, key.af);
+ key.port[0] = key.port[1] = iih.icmp6_id;
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
+
+ /* translate source/destination address, if necessary */
+ if ((*state)->key[PF_SK_WIRE] !=
+ (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk =
+ (*state)->key[pd->didx];
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_IN) {
+ if (PF_ANEQ(pd2.src,
+ &nk->addr[pd2.sidx], pd2.af) ||
+ nk->port[pd2.sidx] != iih.icmp6_id)
pf_change_icmp(pd2.src, &iih.icmp6_id,
- daddr, &(*state)->lan.addr,
- (*state)->lan.port, NULL,
+ daddr, &nk->addr[pd2.sidx],
+ nk->port[pd2.sidx], NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, AF_INET6);
- } else {
+
+ if (PF_ANEQ(pd2.dst,
+ &nk->addr[pd2.didx], pd2.af) ||
+ nk->port[pd2.didx] != iih.icmp6_id)
pf_change_icmp(pd2.dst, &iih.icmp6_id,
- saddr, &(*state)->gwy.addr,
- (*state)->gwy.port, NULL,
+ NULL, /* XXX Inbound NAT? */
+ &nk->addr[pd2.didx],
+ nk->port[pd2.didx], NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, AF_INET6);
- }
+
+#ifdef __FreeBSD__
m_copyback(m, off, sizeof(struct icmp6_hdr),
(caddr_t)pd->hdr.icmp6);
- m_copyback(m, ipoff2, sizeof(h2_6),
- (caddr_t)&h2_6);
+ m_copyback(m, ipoff2, sizeof(h2_6), (caddr_t)&h2_6);
m_copyback(m, off2, sizeof(struct icmp6_hdr),
(caddr_t)&iih);
+#else
+ m_copyback(m, off, sizeof(struct icmp6_hdr),
+ pd->hdr.icmp6);
+ m_copyback(m, ipoff2, sizeof(h2_6), &h2_6);
+ m_copyback(m, off2, sizeof(struct icmp6_hdr),
+ &iih);
+#endif
}
-
return (PF_PASS);
break;
}
@@ -5895,55 +5480,68 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
default: {
key.af = pd2.af;
key.proto = pd2.proto;
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd2.dst, key.af);
- PF_ACPY(&key.gwy.addr, pd2.src, key.af);
- key.ext.port = 0;
- key.gwy.port = 0;
- } else {
- PF_ACPY(&key.lan.addr, pd2.dst, key.af);
- PF_ACPY(&key.ext.addr, pd2.src, key.af);
- key.lan.port = 0;
- key.ext.port = 0;
- }
+ PF_ACPY(&key.addr[pd2.sidx], pd2.src, key.af);
+ PF_ACPY(&key.addr[pd2.didx], pd2.dst, key.af);
+ key.port[0] = key.port[1] = 0;
+
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
- STATE_LOOKUP();
+ /* translate source/destination address, if necessary */
+ if ((*state)->key[PF_SK_WIRE] !=
+ (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk =
+ (*state)->key[pd->didx];
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_IN) {
- pf_change_icmp(pd2.src, NULL,
- daddr, &(*state)->lan.addr,
- 0, NULL,
+ if (PF_ANEQ(pd2.src,
+ &nk->addr[pd2.sidx], pd2.af))
+ pf_change_icmp(pd2.src, NULL, daddr,
+ &nk->addr[pd2.sidx], 0, NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, pd2.af);
- } else {
- pf_change_icmp(pd2.dst, NULL,
- saddr, &(*state)->gwy.addr,
- 0, NULL,
+
+ if (PF_ANEQ(pd2.dst,
+ &nk->addr[pd2.didx], pd2.af))
+ pf_change_icmp(pd2.src, NULL,
+ NULL, /* XXX Inbound NAT? */
+ &nk->addr[pd2.didx], 0, NULL,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, pd2.af);
- }
+
switch (pd2.af) {
#ifdef INET
case AF_INET:
+#ifdef __FreeBSD__
m_copyback(m, off, ICMP_MINLEN,
(caddr_t)pd->hdr.icmp);
- m_copyback(m, ipoff2, sizeof(h2),
- (caddr_t)&h2);
+ m_copyback(m, ipoff2, sizeof(h2), (caddr_t)&h2);
+#else
+ m_copyback(m, off, ICMP_MINLEN,
+ pd->hdr.icmp);
+ m_copyback(m, ipoff2, sizeof(h2), &h2);
+#endif
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- (caddr_t)pd->hdr.icmp6);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ pd->hdr.icmp6);
m_copyback(m, ipoff2, sizeof(h2_6),
- (caddr_t)&h2_6);
+#ifdef __FreeBSD__
+ (caddr_t)
+#endif
+ &h2_6);
break;
#endif /* INET6 */
}
}
-
return (PF_PASS);
break;
}
@@ -5953,26 +5551,28 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
int
pf_test_state_other(struct pf_state **state, int direction, struct pfi_kif *kif,
- struct pf_pdesc *pd)
+ struct mbuf *m, struct pf_pdesc *pd)
{
struct pf_state_peer *src, *dst;
- struct pf_state_cmp key;
+ struct pf_state_key_cmp key;
key.af = pd->af;
key.proto = pd->proto;
if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, pd->src, key.af);
- PF_ACPY(&key.gwy.addr, pd->dst, key.af);
- key.ext.port = 0;
- key.gwy.port = 0;
+ PF_ACPY(&key.addr[0], pd->src, key.af);
+ PF_ACPY(&key.addr[1], pd->dst, key.af);
+ key.port[0] = key.port[1] = 0;
} else {
- PF_ACPY(&key.lan.addr, pd->src, key.af);
- PF_ACPY(&key.ext.addr, pd->dst, key.af);
- key.lan.port = 0;
- key.ext.port = 0;
+ PF_ACPY(&key.addr[1], pd->src, key.af);
+ PF_ACPY(&key.addr[0], pd->dst, key.af);
+ key.port[1] = key.port[0] = 0;
}
- STATE_LOOKUP();
+#ifdef __FreeBSD__
+ STATE_LOOKUP(kif, &key, direction, *state, m, pd->pf_mtag);
+#else
+ STATE_LOOKUP(kif, &key, direction, *state, m);
+#endif
if (direction == (*state)->direction) {
src = &(*state)->src;
@@ -5996,39 +5596,48 @@ pf_test_state_other(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->timeout = PFTM_OTHER_SINGLE;
/* translate source/destination address, if necessary */
- if (STATE_TRANSLATE(*state)) {
- if (direction == PF_OUT)
- switch (pd->af) {
+ if ((*state)->key[PF_SK_WIRE] != (*state)->key[PF_SK_STACK]) {
+ struct pf_state_key *nk = (*state)->key[pd->didx];
+
+#ifdef __FreeBSD__
+ KASSERT(nk, ("%s: nk is null", __FUNCTION__));
+ KASSERT(pd, ("%s: pd is null", __FUNCTION__));
+ KASSERT(pd->src, ("%s: pd->src is null", __FUNCTION__));
+ KASSERT(pd->dst, ("%s: pd->dst is null", __FUNCTION__));
+#else
+ KASSERT(nk);
+ KASSERT(pd);
+ KASSERT(pd->src);
+ KASSERT(pd->dst);
+#endif
+ switch (pd->af) {
#ifdef INET
- case AF_INET:
+ case AF_INET:
+ if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], AF_INET))
pf_change_a(&pd->src->v4.s_addr,
- pd->ip_sum, (*state)->gwy.addr.v4.s_addr,
+ pd->ip_sum,
+ nk->addr[pd->sidx].v4.s_addr,
0);
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- PF_ACPY(pd->src, &(*state)->gwy.addr, pd->af);
- break;
-#endif /* INET6 */
- }
- else
- switch (pd->af) {
-#ifdef INET
- case AF_INET:
+
+
+ if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], AF_INET))
pf_change_a(&pd->dst->v4.s_addr,
- pd->ip_sum, (*state)->lan.addr.v4.s_addr,
+ pd->ip_sum,
+ nk->addr[pd->didx].v4.s_addr,
0);
+
break;
#endif /* INET */
#ifdef INET6
- case AF_INET6:
- PF_ACPY(pd->dst, &(*state)->lan.addr, pd->af);
- break;
+ case AF_INET6:
+ if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], AF_INET))
+ PF_ACPY(pd->src, &nk->addr[pd->sidx], pd->af);
+
+ if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], AF_INET))
+ PF_ACPY(pd->dst, &nk->addr[pd->didx], pd->af);
#endif /* INET6 */
- }
+ }
}
-
return (PF_PASS);
}
@@ -6086,6 +5695,11 @@ pf_pull_hdr(struct mbuf *m, int off, void *p, int len,
int
pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
{
+#ifdef __FreeBSD__
+#ifdef RADIX_MPATH
+ struct radix_node_head *rnh;
+#endif
+#endif
struct sockaddr_in *dst;
int ret = 1;
int check_mpath;
@@ -6106,6 +5720,14 @@ pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
struct ifnet *ifp;
check_mpath = 0;
+#ifdef __FreeBSD__
+#ifdef RADIX_MPATH
+ /* XXX: stick to table 0 for now */
+ rnh = rt_tables_get_rnh(0, af);
+ if (rnh != NULL && rn_mpath_capable(rnh))
+ check_mpath = 1;
+#endif
+#endif
bzero(&ro, sizeof(ro));
switch (af) {
case AF_INET:
@@ -6113,18 +5735,24 @@ pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
dst->sin_family = AF_INET;
dst->sin_len = sizeof(*dst);
dst->sin_addr = addr->v4;
-#ifndef __FreeBSD__ /* MULTIPATH_ROUTING */
+#ifndef __FreeBSD__
if (ipmultipath)
check_mpath = 1;
#endif
break;
#ifdef INET6
case AF_INET6:
+ /*
+ * Skip check for addresses with embedded interface scope,
+ * as they would always match anyway.
+ */
+ if (IN6_IS_SCOPE_EMBED(&addr->v6))
+ goto out;
dst6 = (struct sockaddr_in6 *)&ro.ro_dst;
dst6->sin6_family = AF_INET6;
dst6->sin6_len = sizeof(*dst6);
dst6->sin6_addr = addr->v6;
-#ifndef __FreeBSD__ /* MULTIPATH_ROUTING */
+#ifndef __FreeBSD__
if (ip6_multipath)
check_mpath = 1;
#endif
@@ -6174,11 +5802,13 @@ pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
if (kif->pfik_ifp == ifp)
ret = 1;
-#ifdef __FreeBSD__ /* MULTIPATH_ROUTING */
- rn = NULL;
-#else
+#ifdef __FreeBSD__
+#ifdef RADIX_MPATH
rn = rn_mpath_next(rn);
#endif
+#else
+ rn = rn_mpath_next(rn, 0);
+#endif
} while (check_mpath == 1 && rn != NULL && ret == 0);
} else
ret = 0;
@@ -6249,7 +5879,6 @@ pf_rtlabel_match(struct pf_addr *addr, sa_family_t af, struct pf_addr_wrap *aw)
}
#ifdef INET
-
void
pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
struct pf_state *s, struct pf_pdesc *pd)
@@ -6274,7 +5903,11 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
(dir != PF_IN && dir != PF_OUT) || oifp == NULL)
panic("pf_route: invalid parameters");
+#ifdef __FreeBSD__
if (pd->pf_mtag->routed++ > 3) {
+#else
+ if ((*m)->m_pkthdr.pf.routed++ > 3) {
+#endif
m0 = *m;
*m = NULL;
goto bad;
@@ -6309,9 +5942,17 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
dst->sin_addr = ip->ip_dst;
if (r->rt == PF_FASTROUTE) {
+#ifdef __FreeBSD__
in_rtalloc(ro, 0);
+#else
+ rtalloc(ro);
+#endif
if (ro->ro_rt == 0) {
+#ifdef __FreeBSD__
KMOD_IPSTAT_INC(ips_noroute);
+#else
+ ipstat.ips_noroute++;
+#endif
goto bad;
}
@@ -6377,7 +6018,7 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
* XXX: in_delayed_cksum assumes HBO for ip->ip_len (at least)
*/
NTOHS(ip->ip_len);
- NTOHS(ip->ip_off); /* XXX: needed? */
+ NTOHS(ip->ip_off); /* XXX: needed? */
in_delayed_cksum(m0);
HTONS(ip->ip_len);
HTONS(ip->ip_off);
@@ -6386,9 +6027,8 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
m0->m_pkthdr.csum_flags &= ifp->if_hwassist;
if (ntohs(ip->ip_len) <= ifp->if_mtu ||
- (m0->m_pkthdr.csum_flags & ifp->if_hwassist & CSUM_TSO) != 0 ||
(ifp->if_hwassist & CSUM_FRAGMENT &&
- ((ip->ip_off & htons(IP_DF)) == 0))) {
+ ((ip->ip_off & htons(IP_DF)) == 0))) {
/*
* ip->ip_len = htons(ip->ip_len);
* ip->ip_off = htons(ip->ip_off);
@@ -6408,7 +6048,6 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
PF_LOCK();
goto done;
}
-
#else
/* Copied from ip_output. */
#ifdef IPSEC
@@ -6429,25 +6068,28 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
if (!(ifp->if_capabilities & IFCAP_CSUM_TCPv4) ||
ifp->if_bridge != NULL) {
in_delayed_cksum(m0);
- m0->m_pkthdr.csum_flags &= ~M_TCPV4_CSUM_OUT; /* Clear */
+ m0->m_pkthdr.csum_flags &= ~M_TCPV4_CSUM_OUT; /* Clr */
}
} else if (m0->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT) {
if (!(ifp->if_capabilities & IFCAP_CSUM_UDPv4) ||
ifp->if_bridge != NULL) {
in_delayed_cksum(m0);
- m0->m_pkthdr.csum_flags &= ~M_UDPV4_CSUM_OUT; /* Clear */
+ m0->m_pkthdr.csum_flags &= ~M_UDPV4_CSUM_OUT; /* Clr */
}
}
if (ntohs(ip->ip_len) <= ifp->if_mtu) {
+ ip->ip_sum = 0;
if ((ifp->if_capabilities & IFCAP_CSUM_IPv4) &&
ifp->if_bridge == NULL) {
m0->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT;
+#ifdef __FreeBSD__
KMOD_IPSTAT_INC(ips_outhwcsum);
- } else {
- ip->ip_sum = 0;
+#else
+ ipstat.ips_outhwcsum++;
+#endif
+ } else
ip->ip_sum = in_cksum(m0, ip->ip_hl << 2);
- }
/* Update relevant hardware checksum stats for TCP/UDP */
if (m0->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
KMOD_TCPSTAT_INC(tcps_outhwcsum);
@@ -6457,12 +6099,17 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
goto done;
}
#endif
+
/*
* Too large for interface; fragment if possible.
* Must be able to put at least 8 bytes per fragment.
*/
- if (ip->ip_off & htons(IP_DF) || (m0->m_pkthdr.csum_flags & CSUM_TSO)) {
+ if (ip->ip_off & htons(IP_DF)) {
+#ifdef __FreeBSD__
KMOD_IPSTAT_INC(ips_cantfrag);
+#else
+ ipstat.ips_cantfrag++;
+#endif
if (r->rt != PF_DUPTO) {
#ifdef __FreeBSD__
/* icmp_error() expects host byte ordering */
@@ -6493,7 +6140,7 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
error = ip_fragment(m0, ifp, ifp->if_mtu);
#endif
if (error) {
-#ifndef __FreeBSD__ /* ip_fragment does not do m_freem() on FreeBSD */
+#ifndef __FreeBSD__ /* ip_fragment does not do m_freem() on FreeBSD */
m0 = NULL;
#endif
goto bad;
@@ -6519,7 +6166,11 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
}
if (error == 0)
+#ifdef __FreeBSD__
KMOD_IPSTAT_INC(ips_fragmented);
+#else
+ ipstat.ips_fragmented++;
+#endif
done:
if (r->rt != PF_DUPTO)
@@ -6547,13 +6198,16 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
struct ifnet *ifp = NULL;
struct pf_addr naddr;
struct pf_src_node *sn = NULL;
- int error = 0;
if (m == NULL || *m == NULL || r == NULL ||
(dir != PF_IN && dir != PF_OUT) || oifp == NULL)
panic("pf_route6: invalid parameters");
+#ifdef __FreeBSD__
if (pd->pf_mtag->routed++ > 3) {
+#else
+ if ((*m)->m_pkthdr.pf.routed++ > 3) {
+#endif
m0 = *m;
*m = NULL;
goto bad;
@@ -6592,14 +6246,9 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
m0->m_flags |= M_SKIP_FIREWALL;
PF_UNLOCK();
ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL);
- PF_LOCK();
#else
- mtag = m_tag_get(PACKET_TAG_PF_GENERATED, 0, M_NOWAIT);
- if (mtag == NULL)
- goto bad;
- m_tag_prepend(m0, mtag);
- pd->pf_mtag->flags |= PF_TAG_GENERATED;
- ip6_output(m0, NULL, NULL, 0, NULL, NULL);
+ m0->m_pkthdr.pf.flags |= PF_TAG_GENERATED;
+ ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL);
#endif
return;
}
@@ -6660,7 +6309,7 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
- error = nd6_output(ifp, ifp, m0, dst, NULL);
+ nd6_output(ifp, ifp, m0, dst, NULL);
#ifdef __FreeBSD__
PF_LOCK();
#endif
@@ -6671,7 +6320,7 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
PF_UNLOCK();
icmp6_error(m0, ICMP6_PACKET_TOO_BIG, 0, ifp->if_mtu);
PF_LOCK();
- } else
+ } else
#else
if (r->rt != PF_DUPTO)
icmp6_error(m0, ICMP6_PACKET_TOO_BIG, 0, ifp->if_mtu);
@@ -6691,7 +6340,6 @@ bad:
}
#endif /* INET6 */
-
#ifdef __FreeBSD__
/*
* FreeBSD supports cksum offloads for the following drivers.
@@ -6729,10 +6377,10 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p, sa_family_t a
if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR) {
sum = m->m_pkthdr.csum_data;
} else {
- ip = mtod(m, struct ip *);
+ ip = mtod(m, struct ip *);
sum = in_pseudo(ip->ip_src.s_addr,
- ip->ip_dst.s_addr, htonl((u_short)len +
- m->m_pkthdr.csum_data + IPPROTO_TCP));
+ ip->ip_dst.s_addr, htonl((u_short)len +
+ m->m_pkthdr.csum_data + IPPROTO_TCP));
}
sum ^= 0xffff;
++hw_assist;
@@ -6743,14 +6391,14 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p, sa_family_t a
if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR) {
sum = m->m_pkthdr.csum_data;
} else {
- ip = mtod(m, struct ip *);
+ ip = mtod(m, struct ip *);
sum = in_pseudo(ip->ip_src.s_addr,
- ip->ip_dst.s_addr, htonl((u_short)len +
- m->m_pkthdr.csum_data + IPPROTO_UDP));
+ ip->ip_dst.s_addr, htonl((u_short)len +
+ m->m_pkthdr.csum_data + IPPROTO_UDP));
}
sum ^= 0xffff;
++hw_assist;
- }
+ }
break;
case IPPROTO_ICMP:
#ifdef INET6
@@ -6827,6 +6475,7 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p, sa_family_t a
return (0);
}
#else /* !__FreeBSD__ */
+
/*
* check protocol (tcp/udp/icmp/icmp6) checksum and set mbuf flag
* off is the offset where the protocol header starts
@@ -6919,7 +6568,37 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p,
m->m_pkthdr.csum_flags |= flag_ok;
return (0);
}
-#endif /* __FreeBSD__ */
+#endif
+
+#ifndef __FreeBSD__
+struct pf_divert *
+pf_find_divert(struct mbuf *m)
+{
+ struct m_tag *mtag;
+
+ if ((mtag = m_tag_find(m, PACKET_TAG_PF_DIVERT, NULL)) == NULL)
+ return (NULL);
+
+ return ((struct pf_divert *)(mtag + 1));
+}
+
+struct pf_divert *
+pf_get_divert(struct mbuf *m)
+{
+ struct m_tag *mtag;
+
+ if ((mtag = m_tag_find(m, PACKET_TAG_PF_DIVERT, NULL)) == NULL) {
+ mtag = m_tag_get(PACKET_TAG_PF_DIVERT, sizeof(struct pf_divert),
+ M_NOWAIT);
+ if (mtag == NULL)
+ return (NULL);
+ bzero(mtag + 1, sizeof(struct pf_divert));
+ m_tag_prepend(m, mtag);
+ }
+
+ return ((struct pf_divert *)(mtag + 1));
+}
+#endif
#ifdef INET
int
@@ -6934,8 +6613,14 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
struct pfi_kif *kif;
u_short action, reason = 0, log = 0;
struct mbuf *m = *m0;
- struct ip *h = NULL; /* make the compiler happy */
+#ifdef __FreeBSD__
+ struct ip *h = NULL;
+ struct m_tag *ipfwtag;
+ struct pf_rule *a = NULL, *r = &V_pf_default_rule, *tr, *nr;
+#else
+ struct ip *h;
struct pf_rule *a = NULL, *r = &pf_default_rule, *tr, *nr;
+#endif
struct pf_state *s = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_pdesc pd;
@@ -6943,44 +6628,32 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
#ifdef __FreeBSD__
PF_LOCK();
-#endif
- if (!pf_status.running)
-#ifdef __FreeBSD__
+ if (!V_pf_status.running)
{
PF_UNLOCK();
-#endif
return (PF_PASS);
-#ifdef __FreeBSD__
}
+#else
+ if (!pf_status.running)
+ return (PF_PASS);
#endif
memset(&pd, 0, sizeof(pd));
- if ((pd.pf_mtag = pf_get_mtag(m)) == NULL) {
#ifdef __FreeBSD__
+ if ((pd.pf_mtag = pf_get_mtag(m)) == NULL) {
PF_UNLOCK();
-#endif
DPFPRINTF(PF_DEBUG_URGENT,
("pf_test: pf_get_mtag returned NULL\n"));
return (PF_DROP);
}
-#ifdef __FreeBSD__
- if (m->m_flags & M_SKIP_FIREWALL) {
- PF_UNLOCK();
- return (PF_PASS);
- }
-#else
- if (pd.pf_mtag->flags & PF_TAG_GENERATED)
- return (PF_PASS);
#endif
-
-#ifdef __FreeBSD__
- /* XXX_IMPORT: later */
-#else
+#ifndef __FreeBSD__
if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
- ifp = ifp->if_carpdev;
+ kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
+ else
#endif
+ kif = (struct pfi_kif *)ifp->if_pf_kif;
- kif = (struct pfi_kif *)ifp->if_pf_kif;
if (kif == NULL) {
#ifdef __FreeBSD__
PF_UNLOCK();
@@ -6989,12 +6662,15 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
("pf_test: kif == NULL, if_xname %s\n", ifp->if_xname));
return (PF_DROP);
}
- if (kif->pfik_flags & PFI_IFLAG_SKIP) {
+ if (kif->pfik_flags & PFI_IFLAG_SKIP)
#ifdef __FreeBSD__
+ {
PF_UNLOCK();
#endif
return (PF_PASS);
+#ifdef __FreeBSD__
}
+#endif
#ifdef __FreeBSD__
M_ASSERTPKTHDR(m);
@@ -7003,7 +6679,7 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
if ((m->m_flags & M_PKTHDR) == 0)
panic("non-M_PKTHDR is passed to pf_test");
#endif /* DIAGNOSTIC */
-#endif /* __FreeBSD__ */
+#endif
if (m->m_pkthdr.len < (int)sizeof(*h)) {
action = PF_DROP;
@@ -7012,12 +6688,36 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
goto done;
}
+#ifdef __FreeBSD__
+ if (m->m_flags & M_SKIP_FIREWALL) {
+ PF_UNLOCK();
+ return (PF_PASS);
+ }
+#else
+ if (m->m_pkthdr.pf.flags & PF_TAG_GENERATED)
+ return (PF_PASS);
+#endif
+
+#ifdef __FreeBSD__
+ if (ip_divert_ptr != NULL &&
+ ((ipfwtag = m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL)) != NULL)) {
+ struct ipfw_rule_ref *rr = (struct ipfw_rule_ref *)(ipfwtag+1);
+ if (rr->info & IPFW_IS_DIVERT && rr->rulenum == 0) {
+ pd.pf_mtag->flags |= PF_PACKET_LOOPED;
+ m_tag_delete(m, ipfwtag);
+ }
+ if (pd.pf_mtag->flags & PF_FASTFWD_OURS_PRESENT) {
+ m->m_flags |= M_FASTFWD_OURS;
+ pd.pf_mtag->flags &= ~PF_FASTFWD_OURS_PRESENT;
+ }
+ } else
+#endif
/* We do IP header normalization and packet reassembly here */
if (pf_normalize_ip(m0, dir, kif, &reason, &pd) != PF_PASS) {
action = PF_DROP;
goto done;
}
- m = *m0;
+ m = *m0; /* pf_normalize messes with m0 */
h = mtod(m, struct ip *);
off = h->ip_hl << 2;
@@ -7030,9 +6730,13 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
pd.src = (struct pf_addr *)&h->ip_src;
pd.dst = (struct pf_addr *)&h->ip_dst;
- PF_ACPY(&pd.baddr, dir == PF_OUT ? pd.src : pd.dst, AF_INET);
+ pd.sport = pd.dport = NULL;
pd.ip_sum = &h->ip_sum;
+ pd.proto_sum = NULL;
pd.proto = h->ip_p;
+ pd.dir = dir;
+ pd.sidx = (dir == PF_IN) ? 0 : 1;
+ pd.didx = (dir == PF_IN) ? 1 : 0;
pd.af = AF_INET;
pd.tos = h->ip_tos;
pd.tot_len = ntohs(h->ip_len);
@@ -7056,12 +6760,6 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && pf_check_proto_cksum(m, off,
- ntohs(h->ip_len) - off, IPPROTO_TCP, AF_INET)) {
- REASON_SET(&reason, PFRES_PROTCKSUM);
- action = PF_DROP;
- goto done;
- }
pd.p_len = pd.tot_len - off - (th.th_off << 2);
if ((th.th_flags & TH_ACK) && pd.p_len == 0)
pqid = 1;
@@ -7071,18 +6769,23 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
action = pf_test_state_tcp(&s, dir, kif, m, off, h, &pd,
&reason);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_tcp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_tcp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ipintrq);
#endif
break;
@@ -7097,12 +6800,6 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && uh.uh_sum && pf_check_proto_cksum(m,
- off, ntohs(h->ip_len) - off, IPPROTO_UDP, AF_INET)) {
- action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
- goto done;
- }
if (uh.uh_dport == 0 ||
ntohs(uh.uh_ulen) > m->m_pkthdr.len - off ||
ntohs(uh.uh_ulen) < sizeof(struct udphdr)) {
@@ -7112,18 +6809,23 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
}
action = pf_test_state_udp(&s, dir, kif, m, off, h, &pd);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_udp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_udp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ipintrq);
#endif
break;
@@ -7138,47 +6840,60 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && pf_check_proto_cksum(m, off,
- ntohs(h->ip_len) - off, IPPROTO_ICMP, AF_INET)) {
- action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
- goto done;
- }
action = pf_test_state_icmp(&s, dir, kif, m, off, h, &pd,
&reason);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_icmp(&r, &s, dir, kif,
- m, off, h, &pd, &a, &ruleset, NULL);
+ action = pf_test_rule(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_icmp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ipintrq);
#endif
break;
}
+#ifdef INET6
+ case IPPROTO_ICMPV6: {
+ action = PF_DROP;
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: dropping IPv4 packet with ICMPv6 payload\n"));
+ goto done;
+ }
+#endif
+
default:
- action = pf_test_state_other(&s, dir, kif, &pd);
+ action = pf_test_state_other(&s, dir, kif, m, &pd);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_other(&r, &s, dir, kif, m, off, h,
- &pd, &a, &ruleset, NULL);
+ action = pf_test_rule(&r, &s, dir, kif, m, off, h,
+ &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_other(&r, &s, dir, kif, m, off, h,
+ action = pf_test_rule(&r, &s, dir, kif, m, off, h,
&pd, &a, &ruleset, &ipintrq);
#endif
break;
@@ -7195,17 +6910,37 @@ done:
}
if ((s && s->tag) || r->rtableid)
- pf_tag_packet(m, pd.pf_mtag, s ? s->tag : 0, r->rtableid);
+#ifdef __FreeBSD__
+ pf_tag_packet(m, s ? s->tag : 0, r->rtableid, pd.pf_mtag);
+#else
+ pf_tag_packet(m, s ? s->tag : 0, r->rtableid);
+#endif
+
+ if (dir == PF_IN && s && s->key[PF_SK_STACK])
+#ifdef __FreeBSD__
+ pd.pf_mtag->statekey = s->key[PF_SK_STACK];
+#else
+ m->m_pkthdr.pf.statekey = s->key[PF_SK_STACK];
+#endif
#ifdef ALTQ
if (action == PF_PASS && r->qid) {
+#ifdef __FreeBSD__
if (pqid || (pd.tos & IPTOS_LOWDELAY))
pd.pf_mtag->qid = r->pqid;
else
pd.pf_mtag->qid = r->qid;
/* add hints for ecn */
- pd.pf_mtag->af = AF_INET;
pd.pf_mtag->hdr = h;
+
+#else
+ if (pqid || (pd.tos & IPTOS_LOWDELAY))
+ m->m_pkthdr.pf.qid = r->pqid;
+ else
+ m->m_pkthdr.pf.qid = r->qid;
+ /* add hints for ecn */
+ m->m_pkthdr.pf.hdr = h;
+#endif
}
#endif /* ALTQ */
@@ -7219,7 +6954,55 @@ done:
(s->nat_rule.ptr->action == PF_RDR ||
s->nat_rule.ptr->action == PF_BINAT) &&
(ntohl(pd.dst->v4.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
- pd.pf_mtag->flags |= PF_TAG_TRANSLATE_LOCALHOST;
+#ifdef __FreeBSD__
+ m->m_flags |= M_SKIP_FIREWALL;
+#else
+ m->m_pkthdr.pf.flags |= PF_TAG_TRANSLATE_LOCALHOST;
+#endif
+
+#ifdef __FreeBSD__
+ if (action == PF_PASS && r->divert.port &&
+ ip_divert_ptr != NULL && !PACKET_LOOPED()) {
+
+ ipfwtag = m_tag_alloc(MTAG_IPFW_RULE, 0,
+ sizeof(struct ipfw_rule_ref), M_NOWAIT | M_ZERO);
+ if (ipfwtag != NULL) {
+ ((struct ipfw_rule_ref *)(ipfwtag+1))->info = r->divert.port;
+ ((struct ipfw_rule_ref *)(ipfwtag+1))->rulenum = dir;
+
+ m_tag_prepend(m, ipfwtag);
+
+ PF_UNLOCK();
+
+ if (m->m_flags & M_FASTFWD_OURS) {
+ pd.pf_mtag->flags |= PF_FASTFWD_OURS_PRESENT;
+ m->m_flags &= ~M_FASTFWD_OURS;
+ }
+
+ ip_divert_ptr(*m0,
+ dir == PF_IN ? DIR_IN : DIR_OUT);
+ *m0 = NULL;
+ return (action);
+ } else {
+ /* XXX: ipfw has the same behaviour! */
+ action = PF_DROP;
+ REASON_SET(&reason, PFRES_MEMORY);
+ log = 1;
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: failed to allocate divert tag\n"));
+ }
+ }
+#else
+ if (dir == PF_IN && action == PF_PASS && r->divert.port) {
+ struct pf_divert *divert;
+
+ if ((divert = pf_get_divert(m))) {
+ m->m_pkthdr.pf.flags |= PF_TAG_DIVERTED;
+ divert->port = r->divert.port;
+ divert->addr.ipv4 = r->divert.addr.v4;
+ }
+ }
+#endif
if (log) {
struct pf_rule *lr;
@@ -7263,53 +7046,44 @@ done:
}
tr = r;
nr = (s != NULL) ? s->nat_rule.ptr : pd.nat_rule;
- if (nr != NULL) {
- struct pf_addr *x;
- /*
- * XXX: we need to make sure that the addresses
- * passed to pfr_update_stats() are the same than
- * the addresses used during matching (pfr_match)
- */
- if (r == &pf_default_rule) {
- tr = nr;
- x = (s == NULL || s->direction == dir) ?
- &pd.baddr : &pd.naddr;
- } else
- x = (s == NULL || s->direction == dir) ?
- &pd.naddr : &pd.baddr;
- if (x == &pd.baddr || s == NULL) {
- /* we need to change the address */
- if (dir == PF_OUT)
- pd.src = x;
- else
- pd.dst = x;
- }
- }
+#ifdef __FreeBSD__
+ if (nr != NULL && r == &V_pf_default_rule)
+#else
+ if (nr != NULL && r == &pf_default_rule)
+#endif
+ tr = nr;
if (tr->src.addr.type == PF_ADDR_TABLE)
- pfr_update_stats(tr->src.addr.p.tbl, (s == NULL ||
- s->direction == dir) ? pd.src : pd.dst, pd.af,
- pd.tot_len, dir == PF_OUT, r->action == PF_PASS,
- tr->src.neg);
+ pfr_update_stats(tr->src.addr.p.tbl,
+ (s == NULL) ? pd.src :
+ &s->key[(s->direction == PF_IN)]->
+ addr[(s->direction == PF_OUT)],
+ pd.af, pd.tot_len, dir == PF_OUT,
+ r->action == PF_PASS, tr->src.neg);
if (tr->dst.addr.type == PF_ADDR_TABLE)
- pfr_update_stats(tr->dst.addr.p.tbl, (s == NULL ||
- s->direction == dir) ? pd.dst : pd.src, pd.af,
- pd.tot_len, dir == PF_OUT, r->action == PF_PASS,
- tr->dst.neg);
+ pfr_update_stats(tr->dst.addr.p.tbl,
+ (s == NULL) ? pd.dst :
+ &s->key[(s->direction == PF_IN)]->
+ addr[(s->direction == PF_IN)],
+ pd.af, pd.tot_len, dir == PF_OUT,
+ r->action == PF_PASS, tr->dst.neg);
}
-
- if (action == PF_SYNPROXY_DROP) {
+ switch (action) {
+ case PF_SYNPROXY_DROP:
m_freem(*m0);
+ case PF_DEFER:
*m0 = NULL;
action = PF_PASS;
- } else if (r->rt)
+ break;
+ default:
/* pf_route can free the mbuf causing *m0 to become NULL */
- pf_route(m0, r, dir, ifp, s, &pd);
-
+ if (r->rt)
+ pf_route(m0, r, dir, kif->pfik_ifp, s, &pd);
+ break;
+ }
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
-
return (action);
}
#endif /* INET */
@@ -7327,8 +7101,13 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
struct pfi_kif *kif;
u_short action, reason = 0, log = 0;
struct mbuf *m = *m0, *n = NULL;
+#ifdef __FreeBSD__
+ struct ip6_hdr *h = NULL;
+ struct pf_rule *a = NULL, *r = &V_pf_default_rule, *tr, *nr;
+#else
struct ip6_hdr *h;
struct pf_rule *a = NULL, *r = &pf_default_rule, *tr, *nr;
+#endif
struct pf_state *s = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_pdesc pd;
@@ -7336,38 +7115,31 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
#ifdef __FreeBSD__
PF_LOCK();
-#endif
-
- if (!pf_status.running)
-#ifdef __FreeBSD__
- {
+ if (!V_pf_status.running) {
PF_UNLOCK();
-#endif
return (PF_PASS);
-#ifdef __FreeBSD__
}
+#else
+ if (!pf_status.running)
+ return (PF_PASS);
#endif
memset(&pd, 0, sizeof(pd));
- if ((pd.pf_mtag = pf_get_mtag(m)) == NULL) {
#ifdef __FreeBSD__
+ if ((pd.pf_mtag = pf_get_mtag(m)) == NULL) {
PF_UNLOCK();
-#endif
DPFPRINTF(PF_DEBUG_URGENT,
- ("pf_test6: pf_get_mtag returned NULL\n"));
+ ("pf_test: pf_get_mtag returned NULL\n"));
return (PF_DROP);
}
- if (pd.pf_mtag->flags & PF_TAG_GENERATED)
- return (PF_PASS);
-
-#ifdef __FreeBSD__
- /* XXX_IMPORT: later */
-#else
+#endif
+#ifndef __FreeBSD__
if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
- ifp = ifp->if_carpdev;
+ kif = (struct pfi_kif *)ifp->if_carpdev->if_pf_kif;
+ else
#endif
+ kif = (struct pfi_kif *)ifp->if_pf_kif;
- kif = (struct pfi_kif *)ifp->if_pf_kif;
if (kif == NULL) {
#ifdef __FreeBSD__
PF_UNLOCK();
@@ -7376,12 +7148,15 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
("pf_test6: kif == NULL, if_xname %s\n", ifp->if_xname));
return (PF_DROP);
}
- if (kif->pfik_flags & PFI_IFLAG_SKIP) {
+ if (kif->pfik_flags & PFI_IFLAG_SKIP)
#ifdef __FreeBSD__
+ {
PF_UNLOCK();
#endif
return (PF_PASS);
+#ifdef __FreeBSD__
}
+#endif
#ifdef __FreeBSD__
M_ASSERTPKTHDR(m);
@@ -7392,10 +7167,6 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
#endif /* DIAGNOSTIC */
#endif
-#ifdef __FreeBSD__
- h = NULL; /* make the compiler happy */
-#endif
-
if (m->m_pkthdr.len < (int)sizeof(*h)) {
action = PF_DROP;
REASON_SET(&reason, PFRES_SHORT);
@@ -7403,12 +7174,19 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
goto done;
}
+#ifdef __FreeBSD__
+ if (pd.pf_mtag->flags & PF_TAG_GENERATED)
+#else
+ if (m->m_pkthdr.pf.flags & PF_TAG_GENERATED)
+#endif
+ return (PF_PASS);
+
/* We do IP header normalization and packet reassembly here */
if (pf_normalize_ip6(m0, dir, kif, &reason, &pd) != PF_PASS) {
action = PF_DROP;
goto done;
}
- m = *m0;
+ m = *m0; /* pf_normalize messes with m0 */
h = mtod(m, struct ip6_hdr *);
#if 1
@@ -7425,8 +7203,12 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
pd.src = (struct pf_addr *)&h->ip6_src;
pd.dst = (struct pf_addr *)&h->ip6_dst;
- PF_ACPY(&pd.baddr, dir == PF_OUT ? pd.src : pd.dst, AF_INET6);
+ pd.sport = pd.dport = NULL;
pd.ip_sum = NULL;
+ pd.proto_sum = NULL;
+ pd.dir = dir;
+ pd.sidx = (dir == PF_IN) ? 0 : 1;
+ pd.didx = (dir == PF_IN) ? 1 : 0;
pd.af = AF_INET6;
pd.tos = 0;
pd.tot_len = ntohs(h->ip6_plen) + sizeof(struct ip6_hdr);
@@ -7470,7 +7252,7 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = 1;
goto done;
}
- /* fallthrough */
+ /* FALLTHROUGH */
}
case IPPROTO_AH:
case IPPROTO_HOPOPTS:
@@ -7515,13 +7297,6 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && pf_check_proto_cksum(n, off,
- ntohs(h->ip6_plen) - (off - sizeof(struct ip6_hdr)),
- IPPROTO_TCP, AF_INET6)) {
- action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
- goto done;
- }
pd.p_len = pd.tot_len - off - (th.th_off << 2);
action = pf_normalize_tcp(dir, kif, m, 0, off, h, &pd);
if (action == PF_DROP)
@@ -7529,18 +7304,23 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
action = pf_test_state_tcp(&s, dir, kif, m, off, h, &pd,
&reason);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_tcp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_tcp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ip6intrq);
#endif
break;
@@ -7555,13 +7335,6 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && uh.uh_sum && pf_check_proto_cksum(n,
- off, ntohs(h->ip6_plen) - (off - sizeof(struct ip6_hdr)),
- IPPROTO_UDP, AF_INET6)) {
- action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
- goto done;
- }
if (uh.uh_dport == 0 ||
ntohs(uh.uh_ulen) > m->m_pkthdr.len - off ||
ntohs(uh.uh_ulen) < sizeof(struct udphdr)) {
@@ -7571,23 +7344,35 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
}
action = pf_test_state_udp(&s, dir, kif, m, off, h, &pd);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_udp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_udp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ip6intrq);
#endif
break;
}
+ case IPPROTO_ICMP: {
+ action = PF_DROP;
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: dropping IPv6 packet with ICMPv4 payload\n"));
+ goto done;
+ }
+
case IPPROTO_ICMPV6: {
struct icmp6_hdr ih;
@@ -7597,54 +7382,62 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && pf_check_proto_cksum(n, off,
- ntohs(h->ip6_plen) - (off - sizeof(struct ip6_hdr)),
- IPPROTO_ICMPV6, AF_INET6)) {
- action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
- goto done;
- }
action = pf_test_state_icmp(&s, dir, kif,
m, off, h, &pd, &reason);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_icmp(&r, &s, dir, kif,
- m, off, h, &pd, &a, &ruleset, NULL);
+ action = pf_test_rule(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_icmp(&r, &s, dir, kif,
+ action = pf_test_rule(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ip6intrq);
#endif
break;
}
default:
- action = pf_test_state_other(&s, dir, kif, &pd);
+ action = pf_test_state_other(&s, dir, kif, m, &pd);
if (action == PF_PASS) {
-#if NPFSYNC
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_update_state_ptr != NULL)
+ pfsync_update_state_ptr(s);
+#else
pfsync_update_state(s);
+#endif
#endif /* NPFSYNC */
r = s->rule.ptr;
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
#ifdef __FreeBSD__
- action = pf_test_other(&r, &s, dir, kif, m, off, h,
- &pd, &a, &ruleset, NULL);
+ action = pf_test_rule(&r, &s, dir, kif, m, off, h,
+ &pd, &a, &ruleset, NULL, inp);
#else
- action = pf_test_other(&r, &s, dir, kif, m, off, h,
+ action = pf_test_rule(&r, &s, dir, kif, m, off, h,
&pd, &a, &ruleset, &ip6intrq);
#endif
break;
}
done:
+ if (n != m) {
+ m_freem(n);
+ n = NULL;
+ }
+
/* handle dangerous IPv6 extension headers. */
if (action == PF_PASS && rh_cnt &&
!((s && s->state_flags & PFSTATE_ALLOWOPTS) || r->allow_opts)) {
@@ -7656,17 +7449,36 @@ done:
}
if ((s && s->tag) || r->rtableid)
- pf_tag_packet(m, pd.pf_mtag, s ? s->tag : 0, r->rtableid);
+#ifdef __FreeBSD__
+ pf_tag_packet(m, s ? s->tag : 0, r->rtableid, pd.pf_mtag);
+#else
+ pf_tag_packet(m, s ? s->tag : 0, r->rtableid);
+#endif
+
+ if (dir == PF_IN && s && s->key[PF_SK_STACK])
+#ifdef __FreeBSD__
+ pd.pf_mtag->statekey = s->key[PF_SK_STACK];
+#else
+ m->m_pkthdr.pf.statekey = s->key[PF_SK_STACK];
+#endif
#ifdef ALTQ
if (action == PF_PASS && r->qid) {
+#ifdef __FreeBSD__
if (pd.tos & IPTOS_LOWDELAY)
pd.pf_mtag->qid = r->pqid;
else
pd.pf_mtag->qid = r->qid;
/* add hints for ecn */
- pd.pf_mtag->af = AF_INET6;
pd.pf_mtag->hdr = h;
+#else
+ if (pd.tos & IPTOS_LOWDELAY)
+ m->m_pkthdr.pf.qid = r->pqid;
+ else
+ m->m_pkthdr.pf.qid = r->qid;
+ /* add hints for ecn */
+ m->m_pkthdr.pf.hdr = h;
+#endif
}
#endif /* ALTQ */
@@ -7675,7 +7487,27 @@ done:
(s->nat_rule.ptr->action == PF_RDR ||
s->nat_rule.ptr->action == PF_BINAT) &&
IN6_IS_ADDR_LOOPBACK(&pd.dst->v6))
- pd.pf_mtag->flags |= PF_TAG_TRANSLATE_LOCALHOST;
+#ifdef __FreeBSD__
+ m->m_flags |= M_SKIP_FIREWALL;
+#else
+ m->m_pkthdr.pf.flags |= PF_TAG_TRANSLATE_LOCALHOST;
+#endif
+
+#ifdef __FreeBSD__
+ /* XXX: Anybody working on it?! */
+ if (r->divert.port)
+ printf("pf: divert(9) is not supported for IPv6\n");
+#else
+ if (dir == PF_IN && action == PF_PASS && r->divert.port) {
+ struct pf_divert *divert;
+
+ if ((divert = pf_get_divert(m))) {
+ m->m_pkthdr.pf.flags |= PF_TAG_DIVERTED;
+ divert->port = r->divert.port;
+ divert->addr.ipv6 = r->divert.addr.v6;
+ }
+ }
+#endif
if (log) {
struct pf_rule *lr;
@@ -7719,48 +7551,39 @@ done:
}
tr = r;
nr = (s != NULL) ? s->nat_rule.ptr : pd.nat_rule;
- if (nr != NULL) {
- struct pf_addr *x;
- /*
- * XXX: we need to make sure that the addresses
- * passed to pfr_update_stats() are the same than
- * the addresses used during matching (pfr_match)
- */
- if (r == &pf_default_rule) {
- tr = nr;
- x = (s == NULL || s->direction == dir) ?
- &pd.baddr : &pd.naddr;
- } else {
- x = (s == NULL || s->direction == dir) ?
- &pd.naddr : &pd.baddr;
- }
- if (x == &pd.baddr || s == NULL) {
- if (dir == PF_OUT)
- pd.src = x;
- else
- pd.dst = x;
- }
- }
+#ifdef __FreeBSD__
+ if (nr != NULL && r == &V_pf_default_rule)
+#else
+ if (nr != NULL && r == &pf_default_rule)
+#endif
+ tr = nr;
if (tr->src.addr.type == PF_ADDR_TABLE)
- pfr_update_stats(tr->src.addr.p.tbl, (s == NULL ||
- s->direction == dir) ? pd.src : pd.dst, pd.af,
- pd.tot_len, dir == PF_OUT, r->action == PF_PASS,
- tr->src.neg);
+ pfr_update_stats(tr->src.addr.p.tbl,
+ (s == NULL) ? pd.src :
+ &s->key[(s->direction == PF_IN)]->addr[0],
+ pd.af, pd.tot_len, dir == PF_OUT,
+ r->action == PF_PASS, tr->src.neg);
if (tr->dst.addr.type == PF_ADDR_TABLE)
- pfr_update_stats(tr->dst.addr.p.tbl, (s == NULL ||
- s->direction == dir) ? pd.dst : pd.src, pd.af,
- pd.tot_len, dir == PF_OUT, r->action == PF_PASS,
- tr->dst.neg);
+ pfr_update_stats(tr->dst.addr.p.tbl,
+ (s == NULL) ? pd.dst :
+ &s->key[(s->direction == PF_IN)]->addr[1],
+ pd.af, pd.tot_len, dir == PF_OUT,
+ r->action == PF_PASS, tr->dst.neg);
}
-
- if (action == PF_SYNPROXY_DROP) {
+ switch (action) {
+ case PF_SYNPROXY_DROP:
m_freem(*m0);
+ case PF_DEFER:
*m0 = NULL;
action = PF_PASS;
- } else if (r->rt)
+ break;
+ default:
/* pf_route6 can free the mbuf causing *m0 to become NULL */
- pf_route6(m0, r, dir, ifp, s, &pd);
+ if (r->rt)
+ pf_route6(m0, r, dir, kif->pfik_ifp, s, &pd);
+ break;
+ }
#ifdef __FreeBSD__
PF_UNLOCK();
@@ -7782,3 +7605,20 @@ pf_check_congestion(struct ifqueue *ifq)
return (0);
#endif
}
+
+/*
+ * must be called whenever any addressing information such as
+ * address, port, protocol has changed
+ */
+void
+pf_pkt_addr_changed(struct mbuf *m)
+{
+#ifdef __FreeBSD__
+ struct pf_mtag *pf_tag;
+
+ if ((pf_tag = pf_find_mtag(m)) != NULL)
+ pf_tag->statekey = NULL;
+#else
+ m->m_pkthdr.pf.statekey = NULL;
+#endif
+}
diff --git a/sys/contrib/pf/net/pf_if.c b/sys/contrib/pf/net/pf_if.c
index 156fb22..6336c79 100644
--- a/sys/contrib/pf/net/pf_if.c
+++ b/sys/contrib/pf/net/pf_if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_if.c,v 1.46 2006/12/13 09:01:59 itojun Exp $ */
+/* $OpenBSD: pf_if.c,v 1.54 2008/06/14 16:55:28 mk Exp $ */
/*
* Copyright 2005 Henning Brauer <henning@openbsd.org>
@@ -54,6 +54,9 @@ __FBSDID("$FreeBSD$");
#include <sys/device.h>
#endif
#include <sys/time.h>
+#ifndef __FreeBSD__
+#include <sys/pool.h>
+#endif
#include <net/if.h>
#include <net/if_types.h>
@@ -73,25 +76,35 @@ __FBSDID("$FreeBSD$");
#include <netinet/ip6.h>
#endif /* INET6 */
-struct pfi_kif *pfi_all = NULL;
-struct pfi_statehead pfi_statehead;
#ifdef __FreeBSD__
-uma_zone_t pfi_addr_pl;
+VNET_DEFINE(struct pfi_kif *, pfi_all);
+VNET_DEFINE(uma_zone_t, pfi_addr_pl);
+VNET_DEFINE(struct pfi_ifhead, pfi_ifs);
+#define V_pfi_ifs VNET(pfi_ifs)
+VNET_DEFINE(long, pfi_update);
+#define V_pfi_update VNET(pfi_update)
+VNET_DEFINE(struct pfr_addr *, pfi_buffer);
+#define V_pfi_buffer VNET(pfi_buffer)
+VNET_DEFINE(int, pfi_buffer_cnt);
+#define V_pfi_buffer_cnt VNET(pfi_buffer_cnt)
+VNET_DEFINE(int, pfi_buffer_max);
+#define V_pfi_buffer_max VNET(pfi_buffer_max)
#else
+struct pfi_kif *pfi_all = NULL;
struct pool pfi_addr_pl;
-#endif
struct pfi_ifhead pfi_ifs;
long pfi_update = 1;
struct pfr_addr *pfi_buffer;
int pfi_buffer_cnt;
int pfi_buffer_max;
+#endif
#ifdef __FreeBSD__
-eventhandler_tag pfi_attach_cookie = NULL;
-eventhandler_tag pfi_detach_cookie = NULL;
-eventhandler_tag pfi_attach_group_cookie = NULL;
-eventhandler_tag pfi_change_group_cookie = NULL;
-eventhandler_tag pfi_detach_group_cookie = NULL;
-eventhandler_tag pfi_ifaddr_event_cookie = NULL;
+eventhandler_tag pfi_attach_cookie;
+eventhandler_tag pfi_detach_cookie;
+eventhandler_tag pfi_attach_group_cookie;
+eventhandler_tag pfi_change_group_cookie;
+eventhandler_tag pfi_detach_group_cookie;
+eventhandler_tag pfi_ifaddr_event_cookie;
#endif
void pfi_kif_update(struct pfi_kif *);
@@ -107,11 +120,10 @@ int pfi_unmask(void *);
#ifdef __FreeBSD__
void pfi_attach_ifnet_event(void * __unused, struct ifnet *);
void pfi_detach_ifnet_event(void * __unused, struct ifnet *);
-void pfi_attach_group_event(void * __unused, struct ifg_group *);
-void pfi_change_group_event(void * __unused, char *);
-void pfi_detach_group_event(void * __unused, struct ifg_group *);
+void pfi_attach_group_event(void *, struct ifg_group *);
+void pfi_change_group_event(void *, char *);
+void pfi_detach_group_event(void *, struct ifg_group *);
void pfi_ifaddr_event(void * __unused, struct ifnet *);
-
#endif
RB_PROTOTYPE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
@@ -123,22 +135,31 @@ RB_GENERATE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
void
pfi_initialize(void)
{
-
+#ifdef __FreeBSD__
+ if (V_pfi_all != NULL) /* already initialized */
+#else
if (pfi_all != NULL) /* already initialized */
+#endif
return;
- TAILQ_INIT(&pfi_statehead);
#ifndef __FreeBSD__
- pool_init(&pfi_addr_pl, sizeof(struct pfi_dynaddr), 0, 0, 0,
+ pool_init(&V_pfi_addr_pl, sizeof(struct pfi_dynaddr), 0, 0, 0,
"pfiaddrpl", &pool_allocator_nointr);
#endif
+#ifdef __FreeBSD__
+ V_pfi_buffer_max = 64;
+ V_pfi_buffer = malloc(V_pfi_buffer_max * sizeof(*V_pfi_buffer),
+ PFI_MTYPE, M_WAITOK);
+
+ if ((V_pfi_all = pfi_kif_get(IFG_ALL)) == NULL)
+#else
pfi_buffer_max = 64;
pfi_buffer = malloc(pfi_buffer_max * sizeof(*pfi_buffer),
PFI_MTYPE, M_WAITOK);
if ((pfi_all = pfi_kif_get(IFG_ALL)) == NULL)
+#endif
panic("pfi_kif_get for pfi_all failed");
-
#ifdef __FreeBSD__
struct ifg_group *ifg;
struct ifnet *ifp;
@@ -155,11 +176,11 @@ pfi_initialize(void)
pfi_detach_cookie = EVENTHANDLER_REGISTER(ifnet_departure_event,
pfi_detach_ifnet_event, NULL, EVENTHANDLER_PRI_ANY);
pfi_attach_group_cookie = EVENTHANDLER_REGISTER(group_attach_event,
- pfi_attach_group_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_attach_group_event, curvnet, EVENTHANDLER_PRI_ANY);
pfi_change_group_cookie = EVENTHANDLER_REGISTER(group_change_event,
- pfi_change_group_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_change_group_event, curvnet, EVENTHANDLER_PRI_ANY);
pfi_detach_group_cookie = EVENTHANDLER_REGISTER(group_detach_event,
- pfi_detach_group_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_detach_group_event, curvnet, EVENTHANDLER_PRI_ANY);
pfi_ifaddr_event_cookie = EVENTHANDLER_REGISTER(ifaddr_event,
pfi_ifaddr_event, NULL, EVENTHANDLER_PRI_ANY);
#endif
@@ -180,18 +201,18 @@ pfi_cleanup(void)
EVENTHANDLER_DEREGISTER(ifaddr_event, pfi_ifaddr_event_cookie);
PF_LOCK();
- pfi_all = NULL;
- while ((p = RB_MIN(pfi_ifhead, &pfi_ifs))) {
+ V_pfi_all = NULL;
+ while ((p = RB_MIN(pfi_ifhead, &V_pfi_ifs))) {
if (p->pfik_rules || p->pfik_states) {
printf("pfi_cleanup: dangling refs for %s\n",
p->pfik_name);
}
- RB_REMOVE(pfi_ifhead, &pfi_ifs, p);
+ RB_REMOVE(pfi_ifhead, &V_pfi_ifs, p);
free(p, PFI_MTYPE);
}
- free(pfi_buffer, PFI_MTYPE);
+ free(V_pfi_buffer, PFI_MTYPE);
}
#endif
@@ -203,18 +224,21 @@ pfi_kif_get(const char *kif_name)
bzero(&s, sizeof(s));
strlcpy(s.pfik_name, kif_name, sizeof(s.pfik_name));
+#ifdef __FreeBSD__
+ if ((kif = RB_FIND(pfi_ifhead, &V_pfi_ifs, (struct pfi_kif *)&s)) != NULL)
+#else
if ((kif = RB_FIND(pfi_ifhead, &pfi_ifs, (struct pfi_kif *)&s)) != NULL)
+#endif
return (kif);
/* create new one */
#ifdef __FreeBSD__
- if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_NOWAIT)) == NULL)
+ if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_NOWAIT | M_ZERO)) == NULL)
#else
- if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_DONTWAIT)) == NULL)
+ if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_DONTWAIT|M_ZERO)) == NULL)
#endif
return (NULL);
- bzero(kif, sizeof(*kif));
strlcpy(kif->pfik_name, kif_name, sizeof(kif->pfik_name));
#ifdef __FreeBSD__
/*
@@ -230,7 +254,12 @@ pfi_kif_get(const char *kif_name)
#endif
TAILQ_INIT(&kif->pfik_dynaddrs);
+#ifdef __FreeBSD__
+ RB_INSERT(pfi_ifhead, &V_pfi_ifs, kif);
+#else
RB_INSERT(pfi_ifhead, &pfi_ifs, kif);
+#endif
+
return (kif);
}
@@ -242,8 +271,7 @@ pfi_kif_ref(struct pfi_kif *kif, enum pfi_kif_refs what)
kif->pfik_rules++;
break;
case PFI_KIF_REF_STATE:
- if (!kif->pfik_states++)
- TAILQ_INSERT_TAIL(&pfi_statehead, kif, pfik_w_states);
+ kif->pfik_states++;
break;
default:
panic("pfi_kif_ref with unknown type");
@@ -271,20 +299,27 @@ pfi_kif_unref(struct pfi_kif *kif, enum pfi_kif_refs what)
printf("pfi_kif_unref: state refcount <= 0\n");
return;
}
- if (!--kif->pfik_states)
- TAILQ_REMOVE(&pfi_statehead, kif, pfik_w_states);
+ kif->pfik_states--;
break;
default:
panic("pfi_kif_unref with unknown type");
}
+#ifdef __FreeBSD__
+ if (kif->pfik_ifp != NULL || kif->pfik_group != NULL || kif == V_pfi_all)
+#else
if (kif->pfik_ifp != NULL || kif->pfik_group != NULL || kif == pfi_all)
+#endif
return;
if (kif->pfik_rules || kif->pfik_states)
return;
+#ifdef __FreeBSD__
+ RB_REMOVE(pfi_ifhead, &V_pfi_ifs, kif);
+#else
RB_REMOVE(pfi_ifhead, &pfi_ifs, kif);
+#endif
free(kif, PFI_MTYPE);
}
@@ -312,7 +347,11 @@ pfi_attach_ifnet(struct ifnet *ifp)
pfi_initialize();
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
if ((kif = pfi_kif_get(ifp->if_xname)) == NULL)
panic("pfi_kif_get failed");
@@ -341,7 +380,11 @@ pfi_detach_ifnet(struct ifnet *ifp)
return;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
#ifndef __FreeBSD__
hook_disestablish(ifp->if_addrhooks, kif->pfik_ah_cookie);
#endif
@@ -361,7 +404,11 @@ pfi_attach_ifgroup(struct ifg_group *ifg)
pfi_initialize();
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
if ((kif = pfi_kif_get(ifg->ifg_group)) == NULL)
panic("pfi_kif_get failed");
@@ -381,7 +428,11 @@ pfi_detach_ifgroup(struct ifg_group *ifg)
return;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
kif->pfik_group = NULL;
ifg->ifg_pf_kif = NULL;
@@ -396,7 +447,11 @@ pfi_group_change(const char *group)
int s;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
if ((kif = pfi_kif_get(group)) == NULL)
panic("pfi_kif_get failed");
@@ -450,9 +505,14 @@ pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af)
if (aw->type != PF_ADDR_DYNIFTL)
return (0);
- if ((dyn = pool_get(&pfi_addr_pl, PR_NOWAIT)) == NULL)
+#ifdef __FreeBSD__
+ /* XXX: revisit! */
+ if ((dyn = pool_get(&V_pfi_addr_pl, PR_WAITOK | PR_ZERO))
+#else
+ if ((dyn = pool_get(&pfi_addr_pl, PR_WAITOK | PR_LIMITFAIL | PR_ZERO))
+#endif
+ == NULL)
return (1);
- bzero(dyn, sizeof(*dyn));
s = splsoftnet();
if (!strcmp(aw->v.ifname, "self"))
@@ -485,7 +545,7 @@ pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af)
goto _bad;
}
- if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname)) == NULL) {
+ if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname, 1)) == NULL) {
rv = 1;
goto _bad;
}
@@ -507,7 +567,11 @@ _bad:
pf_remove_if_empty_ruleset(ruleset);
if (dyn->pfid_kif != NULL)
pfi_kif_unref(dyn->pfid_kif, PFI_KIF_REF_RULE);
+#ifdef __FreeBSD__
+ pool_put(&V_pfi_addr_pl, dyn);
+#else
pool_put(&pfi_addr_pl, dyn);
+#endif
splx(s);
return (rv);
}
@@ -541,10 +605,18 @@ pfi_dynaddr_update(struct pfi_dynaddr *dyn)
kif = dyn->pfid_kif;
kt = dyn->pfid_kt;
+#ifdef __FreeBSD__
+ if (kt->pfrkt_larg != V_pfi_update) {
+#else
if (kt->pfrkt_larg != pfi_update) {
+#endif
/* this table needs to be brought up-to-date */
pfi_table_update(kt, kif, dyn->pfid_net, dyn->pfid_iflags);
+#ifdef __FreeBSD__
+ kt->pfrkt_larg = V_pfi_update;
+#else
kt->pfrkt_larg = pfi_update;
+#endif
}
pfr_dynaddr_update(kt, dyn);
}
@@ -555,7 +627,11 @@ pfi_table_update(struct pfr_ktable *kt, struct pfi_kif *kif, int net, int flags)
int e, size2 = 0;
struct ifg_member *ifgm;
+#ifdef __FreeBSD__
+ V_pfi_buffer_cnt = 0;
+#else
pfi_buffer_cnt = 0;
+#endif
if (kif->pfik_ifp != NULL)
pfi_instance_add(kif->pfik_ifp, net, flags);
@@ -563,10 +639,17 @@ pfi_table_update(struct pfr_ktable *kt, struct pfi_kif *kif, int net, int flags)
TAILQ_FOREACH(ifgm, &kif->pfik_group->ifg_members, ifgm_next)
pfi_instance_add(ifgm->ifgm_ifp, net, flags);
+#ifdef __FreeBSD__
+ if ((e = pfr_set_addrs(&kt->pfrkt_t, V_pfi_buffer, V_pfi_buffer_cnt, &size2,
+ NULL, NULL, NULL, 0, PFR_TFLAG_ALLMASK)))
+ printf("pfi_table_update: cannot set %d new addresses "
+ "into table %s: %d\n", V_pfi_buffer_cnt, kt->pfrkt_name, e);
+#else
if ((e = pfr_set_addrs(&kt->pfrkt_t, pfi_buffer, pfi_buffer_cnt, &size2,
NULL, NULL, NULL, 0, PFR_TFLAG_ALLMASK)))
printf("pfi_table_update: cannot set %d new addresses "
"into table %s: %d\n", pfi_buffer_cnt, kt->pfrkt_name, e);
+#endif
}
void
@@ -587,9 +670,9 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
#ifdef __FreeBSD__
/*
* XXX: For point-to-point interfaces, (ifname:0) and IPv4,
- * jump over addresses without a proper route to work
- * around a problem with ppp not fully removing the
- * address used during IPCP.
+ * jump over addresses without a proper route to work
+ * around a problem with ppp not fully removing the
+ * address used during IPCP.
*/
if ((ifp->if_flags & IFF_POINTOPOINT) &&
!(ia->ifa_flags & IFA_ROUTE) &&
@@ -644,15 +727,24 @@ pfi_address_add(struct sockaddr *sa, int af, int net)
struct pfr_addr *p;
int i;
+#ifdef __FreeBSD__
+ if (V_pfi_buffer_cnt >= V_pfi_buffer_max) {
+ int new_max = V_pfi_buffer_max * 2;
+#else
if (pfi_buffer_cnt >= pfi_buffer_max) {
int new_max = pfi_buffer_max * 2;
+#endif
if (new_max > PFI_BUFFER_MAX) {
printf("pfi_address_add: address buffer full (%d/%d)\n",
+#ifdef __FreeBSD__
+ V_pfi_buffer_cnt, PFI_BUFFER_MAX);
+#else
pfi_buffer_cnt, PFI_BUFFER_MAX);
+#endif
return;
}
- p = malloc(new_max * sizeof(*pfi_buffer), PFI_MTYPE,
+ p = malloc(new_max * sizeof(*V_pfi_buffer), PFI_MTYPE,
#ifdef __FreeBSD__
M_NOWAIT);
#else
@@ -660,18 +752,34 @@ pfi_address_add(struct sockaddr *sa, int af, int net)
#endif
if (p == NULL) {
printf("pfi_address_add: no memory to grow buffer "
+#ifdef __FreeBSD__
+ "(%d/%d)\n", V_pfi_buffer_cnt, PFI_BUFFER_MAX);
+#else
"(%d/%d)\n", pfi_buffer_cnt, PFI_BUFFER_MAX);
+#endif
return;
}
- memcpy(p, pfi_buffer, pfi_buffer_max * sizeof(*pfi_buffer));
+#ifdef __FreeBSD__
+ memcpy(V_pfi_buffer, p, V_pfi_buffer_cnt * sizeof(*V_pfi_buffer));
+ /* no need to zero buffer */
+ free(V_pfi_buffer, PFI_MTYPE);
+ V_pfi_buffer = p;
+ V_pfi_buffer_max = new_max;
+#else
+ memcpy(pfi_buffer, p, pfi_buffer_cnt * sizeof(*pfi_buffer));
/* no need to zero buffer */
free(pfi_buffer, PFI_MTYPE);
pfi_buffer = p;
pfi_buffer_max = new_max;
+#endif
}
if (af == AF_INET && net > 32)
net = 128;
+#ifdef __FreeBSD__
+ p = V_pfi_buffer + V_pfi_buffer_cnt++;
+#else
p = pfi_buffer + pfi_buffer_cnt++;
+#endif
bzero(p, sizeof(*p));
p->pfra_af = af;
p->pfra_net = net;
@@ -704,7 +812,11 @@ pfi_dynaddr_remove(struct pf_addr_wrap *aw)
aw->p.dyn->pfid_kif = NULL;
pfr_detach_table(aw->p.dyn->pfid_kt);
aw->p.dyn->pfid_kt = NULL;
+#ifdef __FreeBSD__
+ pool_put(&V_pfi_addr_pl, aw->p.dyn);
+#else
pool_put(&pfi_addr_pl, aw->p.dyn);
+#endif
aw->p.dyn = NULL;
splx(s);
}
@@ -725,7 +837,11 @@ pfi_kifaddr_update(void *v)
struct pfi_kif *kif = (struct pfi_kif *)v;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
pfi_kif_update(kif);
splx(s);
}
@@ -737,49 +853,61 @@ pfi_if_compare(struct pfi_kif *p, struct pfi_kif *q)
}
void
-pfi_fill_oldstatus(struct pf_status *pfs)
+pfi_update_status(const char *name, struct pf_status *pfs)
{
struct pfi_kif *p;
- struct pfi_kif_cmp key;
+ struct pfi_kif_cmp key;
+ struct ifg_member p_member, *ifgm;
+ TAILQ_HEAD(, ifg_member) ifg_members;
int i, j, k, s;
- strlcpy(key.pfik_name, pfs->ifname, sizeof(key.pfik_name));
+ strlcpy(key.pfik_name, name, sizeof(key.pfik_name));
s = splsoftnet();
+#ifdef __FreeBSD__
+ p = RB_FIND(pfi_ifhead, &V_pfi_ifs, (struct pfi_kif *)&key);
+#else
p = RB_FIND(pfi_ifhead, &pfi_ifs, (struct pfi_kif *)&key);
+#endif
if (p == NULL) {
splx(s);
return;
}
- bzero(pfs->pcounters, sizeof(pfs->pcounters));
- bzero(pfs->bcounters, sizeof(pfs->bcounters));
- for (i = 0; i < 2; i++)
- for (j = 0; j < 2; j++)
- for (k = 0; k < 2; k++) {
- pfs->pcounters[i][j][k] =
- p->pfik_packets[i][j][k];
- pfs->bcounters[i][j] +=
- p->pfik_bytes[i][j][k];
- }
- splx(s);
-}
-
-int
-pfi_clr_istats(const char *name)
-{
- struct pfi_kif *p;
- int s;
+ if (p->pfik_group != NULL) {
+ bcopy(&p->pfik_group->ifg_members, &ifg_members,
+ sizeof(ifg_members));
+ } else {
+ /* build a temporary list for p only */
+ bzero(&p_member, sizeof(p_member));
+ p_member.ifgm_ifp = p->pfik_ifp;
+ TAILQ_INIT(&ifg_members);
+ TAILQ_INSERT_TAIL(&ifg_members, &p_member, ifgm_next);
+ }
+ if (pfs) {
+ bzero(pfs->pcounters, sizeof(pfs->pcounters));
+ bzero(pfs->bcounters, sizeof(pfs->bcounters));
+ }
+ TAILQ_FOREACH(ifgm, &ifg_members, ifgm_next) {
+ if (ifgm->ifgm_ifp == NULL)
+ continue;
+ p = (struct pfi_kif *)ifgm->ifgm_ifp->if_pf_kif;
- s = splsoftnet();
- RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
- if (pfi_skip_if(name, p))
+ /* just clear statistics */
+ if (pfs == NULL) {
+ bzero(p->pfik_packets, sizeof(p->pfik_packets));
+ bzero(p->pfik_bytes, sizeof(p->pfik_bytes));
+ p->pfik_tzero = time_second;
continue;
- bzero(p->pfik_packets, sizeof(p->pfik_packets));
- bzero(p->pfik_bytes, sizeof(p->pfik_bytes));
- p->pfik_tzero = time_second;
+ }
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 2; k++) {
+ pfs->pcounters[i][j][k] +=
+ p->pfik_packets[i][j][k];
+ pfs->bcounters[i][j] +=
+ p->pfik_bytes[i][j][k];
+ }
}
splx(s);
-
- return (0);
}
int
@@ -792,8 +920,13 @@ pfi_get_ifaces(const char *name, struct pfi_kif *buf, int *size)
#endif
s = splsoftnet();
+#ifdef __FreeBSD__
+ for (p = RB_MIN(pfi_ifhead, &V_pfi_ifs); p; p = nextp) {
+ nextp = RB_NEXT(pfi_ifhead, &V_pfi_ifs, p);
+#else
for (p = RB_MIN(pfi_ifhead, &pfi_ifs); p; p = nextp) {
nextp = RB_NEXT(pfi_ifhead, &pfi_ifs, p);
+#endif
if (pfi_skip_if(name, p))
continue;
if (*size > n++) {
@@ -810,7 +943,11 @@ pfi_get_ifaces(const char *name, struct pfi_kif *buf, int *size)
splx(s);
return (EFAULT);
}
+#ifdef __FreeBSD__
+ nextp = RB_NEXT(pfi_ifhead, &V_pfi_ifs, p);
+#else
nextp = RB_NEXT(pfi_ifhead, &pfi_ifs, p);
+#endif
pfi_kif_unref(p, PFI_KIF_REF_RULE);
}
}
@@ -845,7 +982,11 @@ pfi_set_flags(const char *name, int flags)
int s;
s = splsoftnet();
+#ifdef __FreeBSD__
+ RB_FOREACH(p, pfi_ifhead, &V_pfi_ifs) {
+#else
RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+#endif
if (pfi_skip_if(name, p))
continue;
p->pfik_flags |= flags;
@@ -861,7 +1002,11 @@ pfi_clear_flags(const char *name, int flags)
int s;
s = splsoftnet();
+#ifdef __FreeBSD__
+ RB_FOREACH(p, pfi_ifhead, &V_pfi_ifs) {
+#else
RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+#endif
if (pfi_skip_if(name, p))
continue;
p->pfik_flags &= ~flags;
@@ -894,55 +1039,73 @@ pfi_unmask(void *addr)
void
pfi_attach_ifnet_event(void *arg __unused, struct ifnet *ifp)
{
+
+ CURVNET_SET(ifp->if_vnet);
PF_LOCK();
pfi_attach_ifnet(ifp);
#ifdef ALTQ
pf_altq_ifnet_event(ifp, 0);
#endif
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
pfi_detach_ifnet_event(void *arg __unused, struct ifnet *ifp)
{
+
+ CURVNET_SET(ifp->if_vnet);
PF_LOCK();
pfi_detach_ifnet(ifp);
#ifdef ALTQ
pf_altq_ifnet_event(ifp, 1);
#endif
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
-pfi_attach_group_event(void *arg __unused, struct ifg_group *ifg)
+pfi_attach_group_event(void *arg , struct ifg_group *ifg)
{
+
+ CURVNET_SET((struct vnet *)arg);
PF_LOCK();
pfi_attach_ifgroup(ifg);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
-pfi_change_group_event(void *arg __unused, char *gname)
+pfi_change_group_event(void *arg, char *gname)
{
+
+ CURVNET_SET((struct vnet *)arg);
PF_LOCK();
pfi_group_change(gname);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
-pfi_detach_group_event(void *arg __unused, struct ifg_group *ifg)
+pfi_detach_group_event(void *arg, struct ifg_group *ifg)
{
+
+ CURVNET_SET((struct vnet *)arg);
PF_LOCK();
pfi_detach_ifgroup(ifg);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
pfi_ifaddr_event(void *arg __unused, struct ifnet *ifp)
{
+
+ CURVNET_SET(ifp->if_vnet);
PF_LOCK();
if (ifp && ifp->if_pf_kif)
pfi_kifaddr_update(ifp->if_pf_kif);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
#endif /* __FreeBSD__ */
diff --git a/sys/contrib/pf/net/pf_ioctl.c b/sys/contrib/pf/net/pf_ioctl.c
index c41fcc6..2ca1630 100644
--- a/sys/contrib/pf/net/pf_ioctl.c
+++ b/sys/contrib/pf/net/pf_ioctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_ioctl.c,v 1.175 2007/02/26 22:47:43 deraadt Exp $ */
+/* $OpenBSD: pf_ioctl.c,v 1.213 2009/02/15 21:46:12 mbalmer Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -45,27 +45,26 @@ __FBSDID("$FreeBSD$");
#include "opt_pf.h"
#ifdef DEV_BPF
-#define NBPFILTER DEV_BPF
+#define NBPFILTER DEV_BPF
#else
-#define NBPFILTER 0
+#define NBPFILTER 0
#endif
#ifdef DEV_PFLOG
-#define NPFLOG DEV_PFLOG
+#define NPFLOG DEV_PFLOG
#else
-#define NPFLOG 0
+#define NPFLOG 0
#endif
#ifdef DEV_PFSYNC
-#define NPFSYNC DEV_PFSYNC
+#define NPFSYNC DEV_PFSYNC
#else
-#define NPFSYNC 0
+#define NPFSYNC 0
#endif
#else
-#include "bpfilter.h"
-#include "pflog.h"
#include "pfsync.h"
+#include "pflog.h"
#endif
#include <sys/param.h>
@@ -77,8 +76,9 @@ __FBSDID("$FreeBSD$");
#include <sys/socketvar.h>
#include <sys/kernel.h>
#include <sys/time.h>
-#include <sys/malloc.h>
#ifdef __FreeBSD__
+#include <sys/ucred.h>
+#include <sys/jail.h>
#include <sys/module.h>
#include <sys/conf.h>
#include <sys/proc.h>
@@ -100,6 +100,7 @@ __FBSDID("$FreeBSD$");
#ifdef __FreeBSD__
#include <net/vnet.h>
#endif
+#include <net/route.h>
#include <netinet/in.h>
#include <netinet/in_var.h>
@@ -116,11 +117,11 @@ __FBSDID("$FreeBSD$");
#endif
#include <net/pfvar.h>
-#if NPFSYNC > 0
#include <net/if_pfsync.h>
-#endif /* NPFSYNC > 0 */
+#if NPFLOG > 0
#include <net/if_pflog.h>
+#endif /* NPFLOG > 0 */
#ifdef INET6
#include <netinet/ip6.h>
@@ -156,7 +157,7 @@ void pf_empty_pool(struct pf_palist *);
#ifdef __FreeBSD__
int pfioctl(struct cdev *, u_long, caddr_t, int, struct thread *);
#else
-int pfioctl(struct cdev *, u_long, caddr_t, int, struct proc *);
+int pfioctl(dev_t, u_long, caddr_t, int, struct proc *);
#endif
#ifdef ALTQ
int pf_begin_altq(u_int32_t *);
@@ -171,25 +172,43 @@ int pf_setup_pfsync_matching(struct pf_ruleset *);
void pf_hash_rule(MD5_CTX *, struct pf_rule *);
void pf_hash_rule_addr(MD5_CTX *, struct pf_rule_addr *);
int pf_commit_rules(u_int32_t, int, char *);
+int pf_addr_setup(struct pf_ruleset *,
+ struct pf_addr_wrap *, sa_family_t);
+void pf_addr_copyout(struct pf_addr_wrap *);
+
+#define TAGID_MAX 50000
-struct pf_rule pf_default_rule;
#ifdef __FreeBSD__
-struct sx pf_consistency_lock;
-SX_SYSINIT(pf_consistency_lock, &pf_consistency_lock, "pf_statetbl_lock");
-#else
-struct rwlock pf_consistency_lock = RWLOCK_INITIALIZER;
+VNET_DEFINE(struct pf_rule, pf_default_rule);
+VNET_DEFINE(struct sx, pf_consistency_lock);
+
+#ifdef ALTQ
+static VNET_DEFINE(int, pf_altq_running);
+#define V_pf_altq_running VNET(pf_altq_running)
#endif
+
+TAILQ_HEAD(pf_tags, pf_tagname);
+
+#define V_pf_tags VNET(pf_tags)
+VNET_DEFINE(struct pf_tags, pf_tags);
+#define V_pf_qids VNET(pf_qids)
+VNET_DEFINE(struct pf_tags, pf_qids);
+
+#else /* !__FreeBSD__ */
+struct pf_rule pf_default_rule;
+struct rwlock pf_consistency_lock = RWLOCK_INITIALIZER("pfcnslk");
#ifdef ALTQ
static int pf_altq_running;
#endif
-#define TAGID_MAX 50000
TAILQ_HEAD(pf_tags, pf_tagname) pf_tags = TAILQ_HEAD_INITIALIZER(pf_tags),
pf_qids = TAILQ_HEAD_INITIALIZER(pf_qids);
+#endif /* __FreeBSD__ */
#if (PF_QNAME_SIZE != PF_TAG_NAME_SIZE)
#error PF_QNAME_SIZE must be equal to PF_TAG_NAME_SIZE
#endif
+
u_int16_t tagname2tag(struct pf_tags *, char *);
void tag2tagname(struct pf_tags *, u_int16_t, char *);
void tag_unref(struct pf_tags *, u_int16_t);
@@ -197,12 +216,15 @@ int pf_rtlabel_add(struct pf_addr_wrap *);
void pf_rtlabel_remove(struct pf_addr_wrap *);
void pf_rtlabel_copyout(struct pf_addr_wrap *);
+#ifdef __FreeBSD__
+#define DPFPRINTF(n, x) if (V_pf_status.debug >= (n)) printf x
+#else
#define DPFPRINTF(n, x) if (pf_status.debug >= (n)) printf x
-
+#endif
#ifdef __FreeBSD__
-static struct cdev *pf_dev;
-
+struct cdev *pf_dev;
+
/*
* XXX - These are new and need to be checked when moveing to a new version
*/
@@ -218,22 +240,22 @@ static void pf_clear_srcnodes(void);
*/
#ifdef INET
static int pf_check_in(void *arg, struct mbuf **m, struct ifnet *ifp,
- int dir, struct inpcb *inp);
+ int dir, struct inpcb *inp);
static int pf_check_out(void *arg, struct mbuf **m, struct ifnet *ifp,
- int dir, struct inpcb *inp);
+ int dir, struct inpcb *inp);
#endif
#ifdef INET6
static int pf_check6_in(void *arg, struct mbuf **m, struct ifnet *ifp,
- int dir, struct inpcb *inp);
+ int dir, struct inpcb *inp);
static int pf_check6_out(void *arg, struct mbuf **m, struct ifnet *ifp,
- int dir, struct inpcb *inp);
+ int dir, struct inpcb *inp);
#endif
-
-static int hook_pf(void);
-static int dehook_pf(void);
-static int shutdown_pf(void);
-static int pf_load(void);
-static int pf_unload(void);
+
+static int hook_pf(void);
+static int dehook_pf(void);
+static int shutdown_pf(void);
+static int pf_load(void);
+static int pf_unload(void);
static struct cdevsw pf_cdevsw = {
.d_ioctl = pfioctl,
@@ -241,78 +263,97 @@ static struct cdevsw pf_cdevsw = {
.d_version = D_VERSION,
};
-static volatile int pf_pfil_hooked = 0;
-int pf_end_threads = 0;
-struct mtx pf_task_mtx;
-pflog_packet_t *pflog_packet_ptr = NULL;
-
-int debug_pfugidhack = 0;
-SYSCTL_INT(_debug, OID_AUTO, pfugidhack, CTLFLAG_RW, &debug_pfugidhack, 0,
- "Enable/disable pf user/group rules mpsafe hack");
+static volatile VNET_DEFINE(int, pf_pfil_hooked);
+#define V_pf_pfil_hooked VNET(pf_pfil_hooked)
+VNET_DEFINE(int, pf_end_threads);
+VNET_DEFINE(struct mtx, pf_task_mtx);
+
+/* pfsync */
+pfsync_state_import_t *pfsync_state_import_ptr = NULL;
+pfsync_insert_state_t *pfsync_insert_state_ptr = NULL;
+pfsync_update_state_t *pfsync_update_state_ptr = NULL;
+pfsync_delete_state_t *pfsync_delete_state_ptr = NULL;
+pfsync_clear_states_t *pfsync_clear_states_ptr = NULL;
+pfsync_state_in_use_t *pfsync_state_in_use_ptr = NULL;
+pfsync_defer_t *pfsync_defer_ptr = NULL;
+pfsync_up_t *pfsync_up_ptr = NULL;
+/* pflow */
+export_pflow_t *export_pflow_ptr = NULL;
+/* pflog */
+pflog_packet_t *pflog_packet_ptr = NULL;
+
+VNET_DEFINE(int, debug_pfugidhack);
+SYSCTL_VNET_INT(_debug, OID_AUTO, pfugidhack, CTLFLAG_RW,
+ &VNET_NAME(debug_pfugidhack), 0,
+ "Enable/disable pf user/group rules mpsafe hack");
void
init_pf_mutex(void)
{
- mtx_init(&pf_task_mtx, "pf task mtx", NULL, MTX_DEF);
+
+ mtx_init(&V_pf_task_mtx, "pf task mtx", NULL, MTX_DEF);
}
void
destroy_pf_mutex(void)
{
- mtx_destroy(&pf_task_mtx);
-}
+ mtx_destroy(&V_pf_task_mtx);
+}
void
init_zone_var(void)
{
- pf_src_tree_pl = pf_rule_pl = NULL;
- pf_state_pl = pf_altq_pl = pf_pooladdr_pl = NULL;
- pf_frent_pl = pf_frag_pl = pf_cache_pl = pf_cent_pl = NULL;
- pf_state_scrub_pl = NULL;
- pfr_ktable_pl = pfr_kentry_pl = NULL;
+ V_pf_src_tree_pl = V_pf_rule_pl = NULL;
+ V_pf_state_pl = V_pf_state_key_pl = V_pf_state_item_pl = NULL;
+ V_pf_altq_pl = V_pf_pooladdr_pl = NULL;
+ V_pf_frent_pl = V_pf_frag_pl = V_pf_cache_pl = V_pf_cent_pl = NULL;
+ V_pf_state_scrub_pl = NULL;
+ V_pfr_ktable_pl = V_pfr_kentry_pl = NULL;
}
void
cleanup_pf_zone(void)
{
- UMA_DESTROY(pf_src_tree_pl);
- UMA_DESTROY(pf_rule_pl);
- UMA_DESTROY(pf_state_pl);
- UMA_DESTROY(pf_altq_pl);
- UMA_DESTROY(pf_pooladdr_pl);
- UMA_DESTROY(pf_frent_pl);
- UMA_DESTROY(pf_frag_pl);
- UMA_DESTROY(pf_cache_pl);
- UMA_DESTROY(pf_cent_pl);
- UMA_DESTROY(pfr_ktable_pl);
- UMA_DESTROY(pfr_kentry_pl2);
- UMA_DESTROY(pfr_kentry_pl);
- UMA_DESTROY(pf_state_scrub_pl);
- UMA_DESTROY(pfi_addr_pl);
+ UMA_DESTROY(V_pf_src_tree_pl);
+ UMA_DESTROY(V_pf_rule_pl);
+ UMA_DESTROY(V_pf_state_pl);
+ UMA_DESTROY(V_pf_state_key_pl);
+ UMA_DESTROY(V_pf_state_item_pl);
+ UMA_DESTROY(V_pf_altq_pl);
+ UMA_DESTROY(V_pf_pooladdr_pl);
+ UMA_DESTROY(V_pf_frent_pl);
+ UMA_DESTROY(V_pf_frag_pl);
+ UMA_DESTROY(V_pf_cache_pl);
+ UMA_DESTROY(V_pf_cent_pl);
+ UMA_DESTROY(V_pfr_ktable_pl);
+ UMA_DESTROY(V_pfr_kentry_pl);
+ UMA_DESTROY(V_pf_state_scrub_pl);
+ UMA_DESTROY(V_pfi_addr_pl);
}
int
pfattach(void)
{
- u_int32_t *my_timeout = pf_default_rule.timeout;
+ u_int32_t *my_timeout = V_pf_default_rule.timeout;
int error = 1;
do {
- UMA_CREATE(pf_src_tree_pl,struct pf_src_node, "pfsrctrpl");
- UMA_CREATE(pf_rule_pl, struct pf_rule, "pfrulepl");
- UMA_CREATE(pf_state_pl, struct pf_state, "pfstatepl");
- UMA_CREATE(pf_altq_pl, struct pf_altq, "pfaltqpl");
- UMA_CREATE(pf_pooladdr_pl, struct pf_pooladdr, "pfpooladdrpl");
- UMA_CREATE(pfr_ktable_pl, struct pfr_ktable, "pfrktable");
- UMA_CREATE(pfr_kentry_pl, struct pfr_kentry, "pfrkentry");
- UMA_CREATE(pfr_kentry_pl2, struct pfr_kentry, "pfrkentry2");
- UMA_CREATE(pf_frent_pl, struct pf_frent, "pffrent");
- UMA_CREATE(pf_frag_pl, struct pf_fragment, "pffrag");
- UMA_CREATE(pf_cache_pl, struct pf_fragment, "pffrcache");
- UMA_CREATE(pf_cent_pl, struct pf_frcache, "pffrcent");
- UMA_CREATE(pf_state_scrub_pl, struct pf_state_scrub,
+ UMA_CREATE(V_pf_src_tree_pl, struct pf_src_node, "pfsrctrpl");
+ UMA_CREATE(V_pf_rule_pl, struct pf_rule, "pfrulepl");
+ UMA_CREATE(V_pf_state_pl, struct pf_state, "pfstatepl");
+ UMA_CREATE(V_pf_state_key_pl, struct pf_state, "pfstatekeypl");
+ UMA_CREATE(V_pf_state_item_pl, struct pf_state, "pfstateitempl");
+ UMA_CREATE(V_pf_altq_pl, struct pf_altq, "pfaltqpl");
+ UMA_CREATE(V_pf_pooladdr_pl, struct pf_pooladdr, "pfpooladdrpl");
+ UMA_CREATE(V_pfr_ktable_pl, struct pfr_ktable, "pfrktable");
+ UMA_CREATE(V_pfr_kentry_pl, struct pfr_kentry, "pfrkentry");
+ UMA_CREATE(V_pf_frent_pl, struct pf_frent, "pffrent");
+ UMA_CREATE(V_pf_frag_pl, struct pf_fragment, "pffrag");
+ UMA_CREATE(V_pf_cache_pl, struct pf_fragment, "pffrcache");
+ UMA_CREATE(V_pf_cent_pl, struct pf_frcache, "pffrcent");
+ UMA_CREATE(V_pf_state_scrub_pl, struct pf_state_scrub,
"pfstatescrub");
- UMA_CREATE(pfi_addr_pl, struct pfi_dynaddr, "pfiaddrpl");
+ UMA_CREATE(V_pfi_addr_pl, struct pfi_dynaddr, "pfiaddrpl");
error = 0;
} while(0);
if (error) {
@@ -327,34 +368,35 @@ pfattach(void)
return (error);
}
- pf_pool_limits[PF_LIMIT_STATES].pp = pf_state_pl;
- pf_pool_limits[PF_LIMIT_STATES].limit = PFSTATE_HIWAT;
- pf_pool_limits[PF_LIMIT_SRC_NODES].pp = pf_src_tree_pl;
- pf_pool_limits[PF_LIMIT_SRC_NODES].limit = PFSNODE_HIWAT;
- pf_pool_limits[PF_LIMIT_FRAGS].pp = pf_frent_pl;
- pf_pool_limits[PF_LIMIT_FRAGS].limit = PFFRAG_FRENT_HIWAT;
- pf_pool_limits[PF_LIMIT_TABLES].pp = pfr_ktable_pl;
- pf_pool_limits[PF_LIMIT_TABLES].limit = PFR_KTABLE_HIWAT;
- pf_pool_limits[PF_LIMIT_TABLE_ENTRIES].pp = pfr_kentry_pl;
- pf_pool_limits[PF_LIMIT_TABLE_ENTRIES].limit = PFR_KENTRY_HIWAT;
- uma_zone_set_max(pf_pool_limits[PF_LIMIT_STATES].pp,
- pf_pool_limits[PF_LIMIT_STATES].limit);
-
- RB_INIT(&tree_src_tracking);
- RB_INIT(&pf_anchors);
+ V_pf_pool_limits[PF_LIMIT_STATES].pp = V_pf_state_pl;
+ V_pf_pool_limits[PF_LIMIT_STATES].limit = PFSTATE_HIWAT;
+ V_pf_pool_limits[PF_LIMIT_SRC_NODES].pp = V_pf_src_tree_pl;
+ V_pf_pool_limits[PF_LIMIT_SRC_NODES].limit = PFSNODE_HIWAT;
+ V_pf_pool_limits[PF_LIMIT_FRAGS].pp = V_pf_frent_pl;
+ V_pf_pool_limits[PF_LIMIT_FRAGS].limit = PFFRAG_FRENT_HIWAT;
+ V_pf_pool_limits[PF_LIMIT_TABLES].pp = V_pfr_ktable_pl;
+ V_pf_pool_limits[PF_LIMIT_TABLES].limit = PFR_KTABLE_HIWAT;
+ V_pf_pool_limits[PF_LIMIT_TABLE_ENTRIES].pp = V_pfr_kentry_pl;
+ V_pf_pool_limits[PF_LIMIT_TABLE_ENTRIES].limit = PFR_KENTRY_HIWAT;
+ uma_zone_set_max(V_pf_pool_limits[PF_LIMIT_STATES].pp,
+ V_pf_pool_limits[PF_LIMIT_STATES].limit);
+
+ RB_INIT(&V_tree_src_tracking);
+ RB_INIT(&V_pf_anchors);
pf_init_ruleset(&pf_main_ruleset);
- TAILQ_INIT(&pf_altqs[0]);
- TAILQ_INIT(&pf_altqs[1]);
- TAILQ_INIT(&pf_pabuf);
- pf_altqs_active = &pf_altqs[0];
- pf_altqs_inactive = &pf_altqs[1];
- TAILQ_INIT(&state_list);
+
+ TAILQ_INIT(&V_pf_altqs[0]);
+ TAILQ_INIT(&V_pf_altqs[1]);
+ TAILQ_INIT(&V_pf_pabuf);
+ V_pf_altqs_active = &V_pf_altqs[0];
+ V_pf_altqs_inactive = &V_pf_altqs[1];
+ TAILQ_INIT(&V_state_list);
/* default rule should never be garbage collected */
- pf_default_rule.entries.tqe_prev = &pf_default_rule.entries.tqe_next;
- pf_default_rule.action = PF_PASS;
- pf_default_rule.nr = -1;
- pf_default_rule.rtableid = -1;
+ V_pf_default_rule.entries.tqe_prev = &V_pf_default_rule.entries.tqe_next;
+ V_pf_default_rule.action = PF_PASS;
+ V_pf_default_rule.nr = -1;
+ V_pf_default_rule.rtableid = -1;
/* initialize default timeouts */
my_timeout[PFTM_TCP_FIRST_PACKET] = PFTM_TCP_FIRST_PACKET_VAL;
@@ -379,20 +421,24 @@ pfattach(void)
my_timeout[PFTM_ADAPTIVE_END] = PFSTATE_ADAPT_END;
pf_normalize_init();
- bzero(&pf_status, sizeof(pf_status));
- pf_status.debug = PF_DEBUG_URGENT;
- pf_pfil_hooked = 0;
+ bzero(&V_pf_status, sizeof(V_pf_status));
+ V_pf_status.debug = PF_DEBUG_URGENT;
+
+ V_pf_pfil_hooked = 0;
/* XXX do our best to avoid a conflict */
- pf_status.hostid = arc4random();
+ V_pf_status.hostid = arc4random();
- if (kproc_create(pf_purge_thread, NULL, NULL, 0, 0, "pfpurge"))
+ if (kproc_create(pf_purge_thread, curvnet, NULL, 0, 0, "pfpurge"))
return (ENXIO);
+ m_addr_chg_pf_p = pf_pkt_addr_changed;
+
return (error);
}
#else /* !__FreeBSD__ */
+
void
pfattach(int num)
{
@@ -404,6 +450,10 @@ pfattach(int num)
"pfsrctrpl", NULL);
pool_init(&pf_state_pl, sizeof(struct pf_state), 0, 0, 0, "pfstatepl",
NULL);
+ pool_init(&pf_state_key_pl, sizeof(struct pf_state_key), 0, 0, 0,
+ "pfstatekeypl", NULL);
+ pool_init(&pf_state_item_pl, sizeof(struct pf_state_item), 0, 0, 0,
+ "pfstateitempl", NULL);
pool_init(&pf_altq_pl, sizeof(struct pf_altq), 0, 0, 0, "pfaltqpl",
&pool_allocator_nointr);
pool_init(&pf_pooladdr_pl, sizeof(struct pf_pooladdr), 0, 0, 0,
@@ -415,7 +465,7 @@ pfattach(int num)
pool_sethardlimit(pf_pool_limits[PF_LIMIT_STATES].pp,
pf_pool_limits[PF_LIMIT_STATES].limit, NULL, 0);
- if (ctob(physmem) <= 100*1024*1024)
+ if (physmem <= atop(100*1024*1024))
pf_pool_limits[PF_LIMIT_TABLE_ENTRIES].limit =
PFR_KENTRY_HIWAT_SMALL;
@@ -465,32 +515,32 @@ pfattach(int num)
pf_status.hostid = arc4random();
/* require process context to purge states, so perform in a thread */
- kproc_create_deferred(pf_thread_create, NULL);
+ kthread_create_deferred(pf_thread_create, NULL);
}
void
pf_thread_create(void *v)
{
- if (kproc_create(pf_purge_thread, NULL, NULL, "pfpurge"))
+ if (kthread_create(pf_purge_thread, NULL, NULL, "pfpurge"))
panic("pfpurge thread");
}
int
-pfopen(struct cdev *dev, int flags, int fmt, struct proc *p)
+pfopen(dev_t dev, int flags, int fmt, struct proc *p)
{
- if (dev2unit(dev) >= 1)
+ if (minor(dev) >= 1)
return (ENXIO);
return (0);
}
int
-pfclose(struct cdev *dev, int flags, int fmt, struct proc *p)
+pfclose(dev_t dev, int flags, int fmt, struct proc *p)
{
- if (dev2unit(dev) >= 1)
+ if (minor(dev) >= 1)
return (ENXIO);
return (0);
}
-#endif /* __FreeBSD__ */
+#endif
struct pf_pool *
pf_get_pool(char *anchor, u_int32_t ticket, u_int8_t rule_action,
@@ -557,7 +607,11 @@ pf_empty_pool(struct pf_palist *poola)
pf_tbladdr_remove(&empty_pool_pa->addr);
pfi_kif_unref(empty_pool_pa->kif, PFI_KIF_REF_RULE);
TAILQ_REMOVE(poola, empty_pool_pa, entries);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, empty_pool_pa);
+#else
pool_put(&pf_pooladdr_pl, empty_pool_pa);
+#endif
}
}
@@ -565,7 +619,7 @@ void
pf_rm_rule(struct pf_rulequeue *rulequeue, struct pf_rule *rule)
{
if (rulequeue != NULL) {
- if (rule->states <= 0) {
+ if (rule->states_cur <= 0) {
/*
* XXX - we need to remove the table *before* detaching
* the rule to make sure the table code does not delete
@@ -581,7 +635,7 @@ pf_rm_rule(struct pf_rulequeue *rulequeue, struct pf_rule *rule)
rule->nr = -1;
}
- if (rule->states > 0 || rule->src_nodes > 0 ||
+ if (rule->states_cur > 0 || rule->src_nodes > 0 ||
rule->entries.tqe_prev != NULL)
return;
pf_tag_unref(rule->tag);
@@ -604,7 +658,11 @@ pf_rm_rule(struct pf_rulequeue *rulequeue, struct pf_rule *rule)
pfi_kif_unref(rule->kif, PFI_KIF_REF_RULE);
pf_anchor_remove(rule);
pf_empty_pool(&rule->rpool.list);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, rule);
+#else
pool_put(&pf_rule_pl, rule);
+#endif
}
u_int16_t
@@ -635,11 +693,9 @@ tagname2tag(struct pf_tags *head, char *tagname)
return (0);
/* allocate and fill new struct pf_tagname */
- tag = (struct pf_tagname *)malloc(sizeof(struct pf_tagname),
- M_TEMP, M_NOWAIT);
+ tag = malloc(sizeof(*tag), M_TEMP, M_NOWAIT|M_ZERO);
if (tag == NULL)
return (0);
- bzero(tag, sizeof(struct pf_tagname));
strlcpy(tag->name, tagname, sizeof(tag->name));
tag->tag = new_tagid;
tag->ref++;
@@ -687,13 +743,21 @@ tag_unref(struct pf_tags *head, u_int16_t tag)
u_int16_t
pf_tagname2tag(char *tagname)
{
+#ifdef __FreeBSD__
+ return (tagname2tag(&V_pf_tags, tagname));
+#else
return (tagname2tag(&pf_tags, tagname));
+#endif
}
void
pf_tag2tagname(u_int16_t tagid, char *p)
{
+#ifdef __FreeBSD__
+ tag2tagname(&V_pf_tags, tagid, p);
+#else
tag2tagname(&pf_tags, tagid, p);
+#endif
}
void
@@ -701,7 +765,11 @@ pf_tag_ref(u_int16_t tag)
{
struct pf_tagname *t;
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(t, &V_pf_tags, entries)
+#else
TAILQ_FOREACH(t, &pf_tags, entries)
+#endif
if (t->tag == tag)
break;
if (t != NULL)
@@ -711,7 +779,11 @@ pf_tag_ref(u_int16_t tag)
void
pf_tag_unref(u_int16_t tag)
{
+#ifdef __FreeBSD__
+ tag_unref(&V_pf_tags, tag);
+#else
tag_unref(&pf_tags, tag);
+#endif
}
int
@@ -764,19 +836,31 @@ pf_rtlabel_copyout(struct pf_addr_wrap *a)
u_int32_t
pf_qname2qid(char *qname)
{
+#ifdef __FreeBSD__
+ return ((u_int32_t)tagname2tag(&V_pf_qids, qname));
+#else
return ((u_int32_t)tagname2tag(&pf_qids, qname));
+#endif
}
void
pf_qid2qname(u_int32_t qid, char *p)
{
+#ifdef __FreeBSD__
+ tag2tagname(&V_pf_qids, (u_int16_t)qid, p);
+#else
tag2tagname(&pf_qids, (u_int16_t)qid, p);
+#endif
}
void
pf_qid_unref(u_int32_t qid)
{
+#ifdef __FreeBSD__
+ tag_unref(&V_pf_qids, (u_int16_t)qid);
+#else
tag_unref(&pf_qids, (u_int16_t)qid);
+#endif
}
int
@@ -786,24 +870,35 @@ pf_begin_altq(u_int32_t *ticket)
int error = 0;
/* Purge the old altq list */
- while ((altq = TAILQ_FIRST(pf_altqs_inactive)) != NULL) {
- TAILQ_REMOVE(pf_altqs_inactive, altq, entries);
#ifdef __FreeBSD__
+ while ((altq = TAILQ_FIRST(V_pf_altqs_inactive)) != NULL) {
+ TAILQ_REMOVE(V_pf_altqs_inactive, altq, entries);
if (altq->qname[0] == 0 &&
(altq->local_flags & PFALTQ_FLAG_IF_REMOVED) == 0) {
#else
+ while ((altq = TAILQ_FIRST(pf_altqs_inactive)) != NULL) {
+ TAILQ_REMOVE(pf_altqs_inactive, altq, entries);
if (altq->qname[0] == 0) {
#endif
/* detach and destroy the discipline */
error = altq_remove(altq);
} else
pf_qid_unref(altq->qid);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, altq);
+#else
pool_put(&pf_altq_pl, altq);
+#endif
}
if (error)
return (error);
+#ifdef __FreeBSD__
+ *ticket = ++V_ticket_altqs_inactive;
+ V_altqs_inactive_open = 1;
+#else
*ticket = ++ticket_altqs_inactive;
altqs_inactive_open = 1;
+#endif
return (0);
}
@@ -813,24 +908,37 @@ pf_rollback_altq(u_int32_t ticket)
struct pf_altq *altq;
int error = 0;
+#ifdef __FreeBSD__
+ if (!V_altqs_inactive_open || ticket != V_ticket_altqs_inactive)
+ return (0);
+ /* Purge the old altq list */
+ while ((altq = TAILQ_FIRST(V_pf_altqs_inactive)) != NULL) {
+ TAILQ_REMOVE(V_pf_altqs_inactive, altq, entries);
+ if (altq->qname[0] == 0 &&
+ (altq->local_flags & PFALTQ_FLAG_IF_REMOVED) == 0) {
+#else
if (!altqs_inactive_open || ticket != ticket_altqs_inactive)
return (0);
/* Purge the old altq list */
while ((altq = TAILQ_FIRST(pf_altqs_inactive)) != NULL) {
TAILQ_REMOVE(pf_altqs_inactive, altq, entries);
-#ifdef __FreeBSD__
- if (altq->qname[0] == 0 &&
- (altq->local_flags & PFALTQ_FLAG_IF_REMOVED) == 0) {
-#else
if (altq->qname[0] == 0) {
#endif
/* detach and destroy the discipline */
error = altq_remove(altq);
} else
pf_qid_unref(altq->qid);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, altq);
+#else
pool_put(&pf_altq_pl, altq);
+#endif
}
+#ifdef __FreeBSD__
+ V_altqs_inactive_open = 0;
+#else
altqs_inactive_open = 0;
+#endif
return (error);
}
@@ -841,27 +949,43 @@ pf_commit_altq(u_int32_t ticket)
struct pf_altq *altq;
int s, err, error = 0;
+#ifdef __FreeBSD__
+ if (!V_altqs_inactive_open || ticket != V_ticket_altqs_inactive)
+#else
if (!altqs_inactive_open || ticket != ticket_altqs_inactive)
+#endif
return (EBUSY);
/* swap altqs, keep the old. */
s = splsoftnet();
+#ifdef __FreeBSD__
+ old_altqs = V_pf_altqs_active;
+ V_pf_altqs_active = V_pf_altqs_inactive;
+ V_pf_altqs_inactive = old_altqs;
+ V_ticket_altqs_active = V_ticket_altqs_inactive;
+#else
old_altqs = pf_altqs_active;
pf_altqs_active = pf_altqs_inactive;
pf_altqs_inactive = old_altqs;
ticket_altqs_active = ticket_altqs_inactive;
+#endif
/* Attach new disciplines */
- TAILQ_FOREACH(altq, pf_altqs_active, entries) {
#ifdef __FreeBSD__
- if (altq->qname[0] == 0 &&
- (altq->local_flags & PFALTQ_FLAG_IF_REMOVED) == 0) {
+ TAILQ_FOREACH(altq, V_pf_altqs_active, entries) {
+ if (altq->qname[0] == 0 &&
+ (altq->local_flags & PFALTQ_FLAG_IF_REMOVED) == 0) {
#else
+ TAILQ_FOREACH(altq, pf_altqs_active, entries) {
if (altq->qname[0] == 0) {
#endif
/* attach the discipline */
error = altq_pfattach(altq);
+#ifdef __FreeBSD__
+ if (error == 0 && V_pf_altq_running)
+#else
if (error == 0 && pf_altq_running)
+#endif
error = pf_enable_altq(altq);
if (error != 0) {
splx(s);
@@ -871,16 +995,22 @@ pf_commit_altq(u_int32_t ticket)
}
/* Purge the old altq list */
- while ((altq = TAILQ_FIRST(pf_altqs_inactive)) != NULL) {
- TAILQ_REMOVE(pf_altqs_inactive, altq, entries);
#ifdef __FreeBSD__
+ while ((altq = TAILQ_FIRST(V_pf_altqs_inactive)) != NULL) {
+ TAILQ_REMOVE(V_pf_altqs_inactive, altq, entries);
if (altq->qname[0] == 0 &&
(altq->local_flags & PFALTQ_FLAG_IF_REMOVED) == 0) {
#else
+ while ((altq = TAILQ_FIRST(pf_altqs_inactive)) != NULL) {
+ TAILQ_REMOVE(pf_altqs_inactive, altq, entries);
if (altq->qname[0] == 0) {
#endif
/* detach and destroy the discipline */
+#ifdef __FreeBSD__
+ if (V_pf_altq_running)
+#else
if (pf_altq_running)
+#endif
error = pf_disable_altq(altq);
err = altq_pfdetach(altq);
if (err != 0 && error == 0)
@@ -890,11 +1020,19 @@ pf_commit_altq(u_int32_t ticket)
error = err;
} else
pf_qid_unref(altq->qid);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, altq);
+#else
pool_put(&pf_altq_pl, altq);
+#endif
}
splx(s);
+#ifdef __FreeBSD__
+ V_altqs_inactive_open = 0;
+#else
altqs_inactive_open = 0;
+#endif
return (error);
}
@@ -969,22 +1107,32 @@ pf_disable_altq(struct pf_altq *altq)
void
pf_altq_ifnet_event(struct ifnet *ifp, int remove)
{
- struct ifnet *ifp1;
- struct pf_altq *a1, *a2, *a3;
- u_int32_t ticket;
- int error = 0;
+ struct ifnet *ifp1;
+ struct pf_altq *a1, *a2, *a3;
+ u_int32_t ticket;
+ int error = 0;
/* Interrupt userland queue modifications */
+#ifdef __FreeBSD__
+ if (V_altqs_inactive_open)
+ pf_rollback_altq(V_ticket_altqs_inactive);
+#else
if (altqs_inactive_open)
pf_rollback_altq(ticket_altqs_inactive);
+#endif
/* Start new altq ruleset */
if (pf_begin_altq(&ticket))
return;
/* Copy the current active set */
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(a1, V_pf_altqs_active, entries) {
+ a2 = pool_get(&V_pf_altq_pl, PR_NOWAIT);
+#else
TAILQ_FOREACH(a1, pf_altqs_active, entries) {
a2 = pool_get(&pf_altq_pl, PR_NOWAIT);
+#endif
if (a2 == NULL) {
error = ENOMEM;
break;
@@ -994,11 +1142,19 @@ pf_altq_ifnet_event(struct ifnet *ifp, int remove)
if (a2->qname[0] != 0) {
if ((a2->qid = pf_qname2qid(a2->qname)) == 0) {
error = EBUSY;
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, a2);
+#else
pool_put(&pf_altq_pl, a2);
+#endif
break;
}
a2->altq_disc = NULL;
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(a3, V_pf_altqs_inactive, entries) {
+#else
TAILQ_FOREACH(a3, pf_altqs_inactive, entries) {
+#endif
if (strncmp(a3->ifname, a2->ifname,
IFNAMSIZ) == 0 && a3->qname[0] == 0) {
a2->altq_disc = a3->altq_disc;
@@ -1016,23 +1172,35 @@ pf_altq_ifnet_event(struct ifnet *ifp, int remove)
error = altq_add(a2);
PF_LOCK();
+#ifdef __FreeBSD__
+ if (ticket != V_ticket_altqs_inactive)
+#else
if (ticket != ticket_altqs_inactive)
+#endif
error = EBUSY;
if (error) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, a2);
+#else
pool_put(&pf_altq_pl, a2);
+#endif
break;
}
}
+#ifdef __FreeBSD__
+ TAILQ_INSERT_TAIL(V_pf_altqs_inactive, a2, entries);
+#else
TAILQ_INSERT_TAIL(pf_altqs_inactive, a2, entries);
+#endif
}
if (error != 0)
pf_rollback_altq(ticket);
else
pf_commit_altq(ticket);
-}
+ }
#endif
#endif /* ALTQ */
@@ -1252,11 +1420,34 @@ pf_setup_pfsync_matching(struct pf_ruleset *rs)
}
MD5Final(digest, &ctx);
+#ifdef __FreeBSD__
+ memcpy(V_pf_status.pf_chksum, digest, sizeof(V_pf_status.pf_chksum));
+#else
memcpy(pf_status.pf_chksum, digest, sizeof(pf_status.pf_chksum));
+#endif
return (0);
}
int
+pf_addr_setup(struct pf_ruleset *ruleset, struct pf_addr_wrap *addr,
+ sa_family_t af)
+{
+ if (pfi_dynaddr_setup(addr, af) ||
+ pf_tbladdr_setup(ruleset, addr))
+ return (EINVAL);
+
+ return (0);
+}
+
+void
+pf_addr_copyout(struct pf_addr_wrap *addr)
+{
+ pfi_dynaddr_copyout(addr);
+ pf_tbladdr_copyout(addr);
+ pf_rtlabel_copyout(addr);
+}
+
+int
#ifdef __FreeBSD__
pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
#else
@@ -1270,6 +1461,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
#endif
int error = 0;
+ CURVNET_SET(TD_TO_VNET(td));
+
/* XXX keep in sync with switch() below */
#ifdef __FreeBSD__
if (securelevel_gt(td->td_ucred, 2))
@@ -1373,7 +1566,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
return (EACCES);
case DIOCGETRULE:
- if (((struct pfioc_rule *)addr)->action == PF_GET_CLR_CNTR)
+ if (((struct pfioc_rule *)addr)->action ==
+ PF_GET_CLR_CNTR)
return (EACCES);
break;
default:
@@ -1382,9 +1576,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (flags & FWRITE)
#ifdef __FreeBSD__
- sx_xlock(&pf_consistency_lock);
+ sx_xlock(&V_pf_consistency_lock);
else
- sx_slock(&pf_consistency_lock);
+ sx_slock(&V_pf_consistency_lock);
#else
rw_enter_write(&pf_consistency_lock);
else
@@ -1399,7 +1593,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
switch (cmd) {
case DIOCSTART:
+#ifdef __FreeBSD__
+ if (V_pf_status.running)
+#else
if (pf_status.running)
+#endif
error = EEXIST;
else {
#ifdef __FreeBSD__
@@ -1411,33 +1609,48 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
("pf: pfil registeration fail\n"));
break;
}
-#endif
+ V_pf_status.running = 1;
+ V_pf_status.since = time_second;
+
+ if (V_pf_status.stateid == 0) {
+ V_pf_status.stateid = time_second;
+ V_pf_status.stateid = V_pf_status.stateid << 32;
+ }
+#else
pf_status.running = 1;
pf_status.since = time_second;
+
if (pf_status.stateid == 0) {
pf_status.stateid = time_second;
pf_status.stateid = pf_status.stateid << 32;
}
+#endif
DPFPRINTF(PF_DEBUG_MISC, ("pf: started\n"));
}
break;
case DIOCSTOP:
- if (!pf_status.running)
+#ifdef __FreeBSD__
+ if (!V_pf_status.running)
error = ENOENT;
else {
- pf_status.running = 0;
-#ifdef __FreeBSD__
+ V_pf_status.running = 0;
PF_UNLOCK();
error = dehook_pf();
PF_LOCK();
if (error) {
- pf_status.running = 1;
+ V_pf_status.running = 1;
DPFPRINTF(PF_DEBUG_MISC,
- ("pf: pfil unregisteration failed\n"));
+ ("pf: pfil unregisteration failed\n"));
}
-#endif
+ V_pf_status.since = time_second;
+#else
+ if (!pf_status.running)
+ error = ENOENT;
+ else {
+ pf_status.running = 0;
pf_status.since = time_second;
+#endif
DPFPRINTF(PF_DEBUG_MISC, ("pf: stopped\n"));
}
break;
@@ -1473,16 +1686,22 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
break;
}
- if (pr->pool_ticket != ticket_pabuf) {
#ifdef __FreeBSD__
+ if (pr->pool_ticket != V_ticket_pabuf) {
DPFPRINTF(PF_DEBUG_MISC,
("pool_ticket: %d != %d\n", pr->pool_ticket,
- ticket_pabuf));
+ V_ticket_pabuf));
+#else
+ if (pr->pool_ticket != ticket_pabuf) {
#endif
error = EBUSY;
break;
}
- rule = pool_get(&pf_rule_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ rule = pool_get(&V_pf_rule_pl, PR_NOWAIT);
+#else
+ rule = pool_get(&pf_rule_pl, PR_WAITOK|PR_LIMITFAIL);
+#endif
if (rule == NULL) {
error = ENOMEM;
break;
@@ -1499,19 +1718,27 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
rule->kif = NULL;
TAILQ_INIT(&rule->rpool.list);
/* initialize refcounting */
- rule->states = 0;
+ rule->states_cur = 0;
rule->src_nodes = 0;
rule->entries.tqe_prev = NULL;
#ifndef INET
if (rule->af == AF_INET) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, rule);
+#else
pool_put(&pf_rule_pl, rule);
+#endif
error = EAFNOSUPPORT;
break;
}
#endif /* INET */
#ifndef INET6
if (rule->af == AF_INET6) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, rule);
+#else
pool_put(&pf_rule_pl, rule);
+#endif
error = EAFNOSUPPORT;
break;
}
@@ -1525,7 +1752,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (rule->ifname[0]) {
rule->kif = pfi_kif_get(rule->ifname);
if (rule->kif == NULL) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, rule);
+#else
pool_put(&pf_rule_pl, rule);
+#endif
error = EINVAL;
break;
}
@@ -1562,40 +1793,42 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (rule->rt && !rule->direction)
error = EINVAL;
#if NPFLOG > 0
-#ifdef __FreeBSD__
if (!rule->log)
rule->logif = 0;
-#endif
if (rule->logif >= PFLOGIFS_MAX)
error = EINVAL;
#endif
if (pf_rtlabel_add(&rule->src.addr) ||
pf_rtlabel_add(&rule->dst.addr))
error = EBUSY;
- if (pfi_dynaddr_setup(&rule->src.addr, rule->af))
+ if (pf_addr_setup(ruleset, &rule->src.addr, rule->af))
error = EINVAL;
- if (pfi_dynaddr_setup(&rule->dst.addr, rule->af))
- error = EINVAL;
- if (pf_tbladdr_setup(ruleset, &rule->src.addr))
- error = EINVAL;
- if (pf_tbladdr_setup(ruleset, &rule->dst.addr))
+ if (pf_addr_setup(ruleset, &rule->dst.addr, rule->af))
error = EINVAL;
if (pf_anchor_setup(rule, ruleset, pr->anchor_call))
error = EINVAL;
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(pa, &V_pf_pabuf, entries)
+#else
TAILQ_FOREACH(pa, &pf_pabuf, entries)
+#endif
if (pf_tbladdr_setup(ruleset, &pa->addr))
error = EINVAL;
if (rule->overload_tblname[0]) {
if ((rule->overload_tbl = pfr_attach_table(ruleset,
- rule->overload_tblname)) == NULL)
+ rule->overload_tblname, 0)) == NULL)
error = EINVAL;
else
rule->overload_tbl->pfrkt_flags |=
PFR_TFLAG_ACTIVE;
}
+#ifdef __FreeBSD__
+ pf_mv_pool(&V_pf_pabuf, &rule->rpool.list);
+#else
pf_mv_pool(&pf_pabuf, &rule->rpool.list);
+#endif
if (((((rule->action == PF_NAT) || (rule->action == PF_RDR) ||
(rule->action == PF_BINAT)) && rule->anchor == NULL) ||
(rule->rt > PF_FASTROUTE)) &&
@@ -1608,14 +1841,13 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
#ifdef __FreeBSD__
- if (!debug_pfugidhack && (rule->uid.op || rule->gid.op ||
+ if (!V_debug_pfugidhack && (rule->uid.op || rule->gid.op ||
rule->log & PF_LOG_SOCKET_LOOKUP)) {
DPFPRINTF(PF_DEBUG_MISC,
("pf: debug.pfugidhack enabled\n"));
- debug_pfugidhack = 1;
+ V_debug_pfugidhack = 1;
}
#endif
-
rule->rpool.cur = TAILQ_FIRST(&rule->rpool.list);
rule->evaluations = rule->packets[0] = rule->packets[1] =
rule->bytes[0] = rule->bytes[1] = 0;
@@ -1685,12 +1917,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
break;
}
- pfi_dynaddr_copyout(&pr->rule.src.addr);
- pfi_dynaddr_copyout(&pr->rule.dst.addr);
- pf_tbladdr_copyout(&pr->rule.src.addr);
- pf_tbladdr_copyout(&pr->rule.dst.addr);
- pf_rtlabel_copyout(&pr->rule.src.addr);
- pf_rtlabel_copyout(&pr->rule.dst.addr);
+ pf_addr_copyout(&pr->rule.src.addr);
+ pf_addr_copyout(&pr->rule.dst.addr);
for (i = 0; i < PF_SKIP_COUNT; ++i)
if (rule->skip[i].ptr == NULL)
pr->rule.skip[i].nr = -1;
@@ -1702,6 +1930,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
rule->evaluations = 0;
rule->packets[0] = rule->packets[1] = 0;
rule->bytes[0] = rule->bytes[1] = 0;
+ rule->states_tot = 0;
}
break;
}
@@ -1715,7 +1944,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (!(pcr->action == PF_CHANGE_REMOVE ||
pcr->action == PF_CHANGE_GET_TICKET) &&
+#ifdef __FreeBSD__
+ pcr->pool_ticket != V_ticket_pabuf) {
+#else
pcr->pool_ticket != ticket_pabuf) {
+#endif
error = EBUSY;
break;
}
@@ -1752,7 +1985,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
if (pcr->action != PF_CHANGE_REMOVE) {
- newrule = pool_get(&pf_rule_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ newrule = pool_get(&V_pf_rule_pl, PR_NOWAIT);
+#else
+ newrule = pool_get(&pf_rule_pl, PR_WAITOK|PR_LIMITFAIL);
+#endif
if (newrule == NULL) {
error = ENOMEM;
break;
@@ -1767,18 +2004,26 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
#endif
TAILQ_INIT(&newrule->rpool.list);
/* initialize refcounting */
- newrule->states = 0;
+ newrule->states_cur = 0;
newrule->entries.tqe_prev = NULL;
#ifndef INET
if (newrule->af == AF_INET) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, newrule);
+#else
pool_put(&pf_rule_pl, newrule);
+#endif
error = EAFNOSUPPORT;
break;
}
#endif /* INET */
#ifndef INET6
if (newrule->af == AF_INET6) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, newrule);
+#else
pool_put(&pf_rule_pl, newrule);
+#endif
error = EAFNOSUPPORT;
break;
}
@@ -1786,7 +2031,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (newrule->ifname[0]) {
newrule->kif = pfi_kif_get(newrule->ifname);
if (newrule->kif == NULL) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_rule_pl, newrule);
+#else
pool_put(&pf_rule_pl, newrule);
+#endif
error = EINVAL;
break;
}
@@ -1826,34 +2075,32 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
if (newrule->rt && !newrule->direction)
error = EINVAL;
-#ifdef __FreeBSD__
#if NPFLOG > 0
if (!newrule->log)
newrule->logif = 0;
if (newrule->logif >= PFLOGIFS_MAX)
error = EINVAL;
#endif
-#endif
if (pf_rtlabel_add(&newrule->src.addr) ||
pf_rtlabel_add(&newrule->dst.addr))
error = EBUSY;
- if (pfi_dynaddr_setup(&newrule->src.addr, newrule->af))
- error = EINVAL;
- if (pfi_dynaddr_setup(&newrule->dst.addr, newrule->af))
+ if (pf_addr_setup(ruleset, &newrule->src.addr, newrule->af))
error = EINVAL;
- if (pf_tbladdr_setup(ruleset, &newrule->src.addr))
- error = EINVAL;
- if (pf_tbladdr_setup(ruleset, &newrule->dst.addr))
+ if (pf_addr_setup(ruleset, &newrule->dst.addr, newrule->af))
error = EINVAL;
if (pf_anchor_setup(newrule, ruleset, pcr->anchor_call))
error = EINVAL;
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(pa, &V_pf_pabuf, entries)
+#else
TAILQ_FOREACH(pa, &pf_pabuf, entries)
+#endif
if (pf_tbladdr_setup(ruleset, &pa->addr))
error = EINVAL;
if (newrule->overload_tblname[0]) {
if ((newrule->overload_tbl = pfr_attach_table(
- ruleset, newrule->overload_tblname)) ==
+ ruleset, newrule->overload_tblname, 0)) ==
NULL)
error = EINVAL;
else
@@ -1861,7 +2108,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
PFR_TFLAG_ACTIVE;
}
+#ifdef __FreeBSD__
+ pf_mv_pool(&V_pf_pabuf, &newrule->rpool.list);
+#else
pf_mv_pool(&pf_pabuf, &newrule->rpool.list);
+#endif
if (((((newrule->action == PF_NAT) ||
(newrule->action == PF_RDR) ||
(newrule->action == PF_BINAT) ||
@@ -1876,12 +2127,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
#ifdef __FreeBSD__
- if (!debug_pfugidhack && (newrule->uid.op ||
+ if (!V_debug_pfugidhack && (newrule->uid.op ||
newrule->gid.op ||
newrule->log & PF_LOG_SOCKET_LOOKUP)) {
DPFPRINTF(PF_DEBUG_MISC,
("pf: debug.pfugidhack enabled\n"));
- debug_pfugidhack = 1;
+ V_debug_pfugidhack = 1;
}
#endif
@@ -1890,7 +2141,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
newrule->packets[0] = newrule->packets[1] = 0;
newrule->bytes[0] = newrule->bytes[1] = 0;
}
+#ifdef __FreeBSD__
+ pf_empty_pool(&V_pf_pabuf);
+#else
pf_empty_pool(&pf_pabuf);
+#endif
if (pcr->action == PF_CHANGE_ADD_HEAD)
oldrule = TAILQ_FIRST(
@@ -1943,166 +2198,164 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
case DIOCCLRSTATES: {
- struct pf_state *state, *nexts;
+ struct pf_state *s, *nexts;
struct pfioc_state_kill *psk = (struct pfioc_state_kill *)addr;
- int killed = 0;
+ u_int killed = 0;
- for (state = RB_MIN(pf_state_tree_id, &tree_id); state;
- state = nexts) {
- nexts = RB_NEXT(pf_state_tree_id, &tree_id, state);
+#ifdef __FreeBSD__
+ for (s = RB_MIN(pf_state_tree_id, &V_tree_id); s; s = nexts) {
+ nexts = RB_NEXT(pf_state_tree_id, &V_tree_id, s);
+#else
+ for (s = RB_MIN(pf_state_tree_id, &tree_id); s; s = nexts) {
+ nexts = RB_NEXT(pf_state_tree_id, &tree_id, s);
+#endif
if (!psk->psk_ifname[0] || !strcmp(psk->psk_ifname,
- state->u.s.kif->pfik_name)) {
-#if NPFSYNC
+ s->kif->pfik_name)) {
+#if NPFSYNC > 0
/* don't send out individual delete messages */
- state->sync_flags = PFSTATE_NOSYNC;
+ SET(s->state_flags, PFSTATE_NOSYNC);
#endif
- pf_unlink_state(state);
+ pf_unlink_state(s);
killed++;
}
}
- psk->psk_af = killed;
-#if NPFSYNC
+ psk->psk_killed = killed;
+#if NPFSYNC > 0
+#ifdef __FreeBSD__
+ if (pfsync_clear_states_ptr != NULL)
+ pfsync_clear_states_ptr(V_pf_status.hostid, psk->psk_ifname);
+#else
pfsync_clear_states(pf_status.hostid, psk->psk_ifname);
#endif
+#endif
break;
}
case DIOCKILLSTATES: {
- struct pf_state *state, *nexts;
- struct pf_state_host *src, *dst;
+ struct pf_state *s, *nexts;
+ struct pf_state_key *sk;
+ struct pf_addr *srcaddr, *dstaddr;
+ u_int16_t srcport, dstport;
struct pfioc_state_kill *psk = (struct pfioc_state_kill *)addr;
- int killed = 0;
+ u_int killed = 0;
+
+ if (psk->psk_pfcmp.id) {
+ if (psk->psk_pfcmp.creatorid == 0)
+#ifdef __FreeBSD__
+ psk->psk_pfcmp.creatorid = V_pf_status.hostid;
+#else
+ psk->psk_pfcmp.creatorid = pf_status.hostid;
+#endif
+ if ((s = pf_find_state_byid(&psk->psk_pfcmp))) {
+ pf_unlink_state(s);
+ psk->psk_killed = 1;
+ }
+ break;
+ }
- for (state = RB_MIN(pf_state_tree_id, &tree_id); state;
- state = nexts) {
- nexts = RB_NEXT(pf_state_tree_id, &tree_id, state);
+#ifdef __FreeBSD__
+ for (s = RB_MIN(pf_state_tree_id, &V_tree_id); s;
+ s = nexts) {
+ nexts = RB_NEXT(pf_state_tree_id, &V_tree_id, s);
+#else
+ for (s = RB_MIN(pf_state_tree_id, &tree_id); s;
+ s = nexts) {
+ nexts = RB_NEXT(pf_state_tree_id, &tree_id, s);
+#endif
+ sk = s->key[PF_SK_WIRE];
- if (state->direction == PF_OUT) {
- src = &state->lan;
- dst = &state->ext;
+ if (s->direction == PF_OUT) {
+ srcaddr = &sk->addr[1];
+ dstaddr = &sk->addr[0];
+ srcport = sk->port[0];
+ dstport = sk->port[0];
} else {
- src = &state->ext;
- dst = &state->lan;
+ srcaddr = &sk->addr[0];
+ dstaddr = &sk->addr[1];
+ srcport = sk->port[0];
+ dstport = sk->port[0];
}
- if ((!psk->psk_af || state->af == psk->psk_af)
+ if ((!psk->psk_af || sk->af == psk->psk_af)
&& (!psk->psk_proto || psk->psk_proto ==
- state->proto) &&
+ sk->proto) &&
PF_MATCHA(psk->psk_src.neg,
&psk->psk_src.addr.v.a.addr,
&psk->psk_src.addr.v.a.mask,
- &src->addr, state->af) &&
+ srcaddr, sk->af) &&
PF_MATCHA(psk->psk_dst.neg,
&psk->psk_dst.addr.v.a.addr,
&psk->psk_dst.addr.v.a.mask,
- &dst->addr, state->af) &&
+ dstaddr, sk->af) &&
(psk->psk_src.port_op == 0 ||
pf_match_port(psk->psk_src.port_op,
psk->psk_src.port[0], psk->psk_src.port[1],
- src->port)) &&
+ srcport)) &&
(psk->psk_dst.port_op == 0 ||
pf_match_port(psk->psk_dst.port_op,
psk->psk_dst.port[0], psk->psk_dst.port[1],
- dst->port)) &&
+ dstport)) &&
+ (!psk->psk_label[0] || (s->rule.ptr->label[0] &&
+ !strcmp(psk->psk_label, s->rule.ptr->label))) &&
(!psk->psk_ifname[0] || !strcmp(psk->psk_ifname,
- state->u.s.kif->pfik_name))) {
-#if NPFSYNC > 0
- /* send immediate delete of state */
- pfsync_delete_state(state);
- state->sync_flags |= PFSTATE_NOSYNC;
-#endif
- pf_unlink_state(state);
+ s->kif->pfik_name))) {
+ pf_unlink_state(s);
killed++;
}
}
- psk->psk_af = killed;
+ psk->psk_killed = killed;
break;
}
case DIOCADDSTATE: {
struct pfioc_state *ps = (struct pfioc_state *)addr;
- struct pf_state *state;
- struct pfi_kif *kif;
+ struct pfsync_state *sp = &ps->state;
- if (ps->state.timeout >= PFTM_MAX &&
- ps->state.timeout != PFTM_UNTIL_PACKET) {
+ if (sp->timeout >= PFTM_MAX &&
+ sp->timeout != PFTM_UNTIL_PACKET) {
error = EINVAL;
break;
}
- state = pool_get(&pf_state_pl, PR_NOWAIT);
- if (state == NULL) {
- error = ENOMEM;
- break;
- }
- kif = pfi_kif_get(ps->state.u.ifname);
- if (kif == NULL) {
- pool_put(&pf_state_pl, state);
- error = ENOENT;
- break;
- }
- bcopy(&ps->state, state, sizeof(struct pf_state));
- bzero(&state->u, sizeof(state->u));
- state->rule.ptr = &pf_default_rule;
- state->nat_rule.ptr = NULL;
- state->anchor.ptr = NULL;
- state->rt_kif = NULL;
- state->creation = time_second;
- state->pfsync_time = 0;
- state->packets[0] = state->packets[1] = 0;
- state->bytes[0] = state->bytes[1] = 0;
-
- if (pf_insert_state(kif, state)) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
- pool_put(&pf_state_pl, state);
- error = ENOMEM;
- }
+#ifdef __FreeBSD__
+ if (pfsync_state_import_ptr != NULL)
+ error = pfsync_state_import_ptr(sp, PFSYNC_SI_IOCTL);
+#else
+ error = pfsync_state_import(sp, PFSYNC_SI_IOCTL);
+#endif
break;
}
case DIOCGETSTATE: {
struct pfioc_state *ps = (struct pfioc_state *)addr;
- struct pf_state *state;
- u_int32_t nr;
- int secs;
+ struct pf_state *s;
+ struct pf_state_cmp id_key;
- nr = 0;
- RB_FOREACH(state, pf_state_tree_id, &tree_id) {
- if (nr >= ps->nr)
- break;
- nr++;
- }
- if (state == NULL) {
- error = EBUSY;
+ bcopy(ps->state.id, &id_key.id, sizeof(id_key.id));
+ id_key.creatorid = ps->state.creatorid;
+
+ s = pf_find_state_byid(&id_key);
+ if (s == NULL) {
+ error = ENOENT;
break;
}
- secs = time_second;
- bcopy(state, &ps->state, sizeof(ps->state));
- strlcpy(ps->state.u.ifname, state->u.s.kif->pfik_name,
- sizeof(ps->state.u.ifname));
- ps->state.rule.nr = state->rule.ptr->nr;
- ps->state.nat_rule.nr = (state->nat_rule.ptr == NULL) ?
- -1 : state->nat_rule.ptr->nr;
- ps->state.anchor.nr = (state->anchor.ptr == NULL) ?
- -1 : state->anchor.ptr->nr;
- ps->state.creation = secs - ps->state.creation;
- ps->state.expire = pf_state_expires(state);
- if (ps->state.expire > secs)
- ps->state.expire -= secs;
- else
- ps->state.expire = 0;
+
+ pfsync_state_export(&ps->state, s);
break;
}
case DIOCGETSTATES: {
struct pfioc_states *ps = (struct pfioc_states *)addr;
struct pf_state *state;
- struct pf_state *p, *pstore;
+ struct pfsync_state *p, *pstore;
u_int32_t nr = 0;
- int space = ps->ps_len;
- if (space == 0) {
+ if (ps->ps_len == 0) {
+#ifdef __FreeBSD__
+ nr = V_pf_status.states;
+#else
nr = pf_status.states;
- ps->ps_len = sizeof(struct pf_state) * nr;
+#endif
+ ps->ps_len = sizeof(struct pfsync_state) * nr;
break;
}
@@ -2116,29 +2369,16 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
p = ps->ps_states;
+#ifdef __FreeBSD__
+ state = TAILQ_FIRST(&V_state_list);
+#else
state = TAILQ_FIRST(&state_list);
+#endif
while (state) {
if (state->timeout != PFTM_UNLINKED) {
- int secs = time_second;
-
if ((nr+1) * sizeof(*p) > (unsigned)ps->ps_len)
break;
-
- bcopy(state, pstore, sizeof(*pstore));
- strlcpy(pstore->u.ifname,
- state->u.s.kif->pfik_name,
- sizeof(pstore->u.ifname));
- pstore->rule.nr = state->rule.ptr->nr;
- pstore->nat_rule.nr = (state->nat_rule.ptr ==
- NULL) ? -1 : state->nat_rule.ptr->nr;
- pstore->anchor.nr = (state->anchor.ptr ==
- NULL) ? -1 : state->anchor.ptr->nr;
- pstore->creation = secs - pstore->creation;
- pstore->expire = pf_state_expires(state);
- if (pstore->expire > secs)
- pstore->expire -= secs;
- else
- pstore->expire = 0;
+ pfsync_state_export(pstore, state);
#ifdef __FreeBSD__
PF_COPYOUT(pstore, p, sizeof(*p), error);
#else
@@ -2151,10 +2391,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
p++;
nr++;
}
- state = TAILQ_NEXT(state, u.s.entry_list);
+ state = TAILQ_NEXT(state, entry_list);
}
- ps->ps_len = sizeof(struct pf_state) * nr;
+ ps->ps_len = sizeof(struct pfsync_state) * nr;
free(pstore, M_TEMP);
break;
@@ -2162,8 +2402,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCGETSTATUS: {
struct pf_status *s = (struct pf_status *)addr;
+#ifdef __FreeBSD__
+ bcopy(&V_pf_status, s, sizeof(struct pf_status));
+#else
bcopy(&pf_status, s, sizeof(struct pf_status));
- pfi_fill_oldstatus(s);
+#endif
+ pfi_update_status(s->ifname, s);
break;
}
@@ -2171,35 +2415,51 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pfioc_if *pi = (struct pfioc_if *)addr;
if (pi->ifname[0] == 0) {
+#ifdef __FreeBSD__
+ bzero(V_pf_status.ifname, IFNAMSIZ);
+#else
bzero(pf_status.ifname, IFNAMSIZ);
+#endif
break;
}
- if (ifunit(pi->ifname) == NULL) {
- error = EINVAL;
- break;
- }
+#ifdef __FreeBSD__
+ strlcpy(V_pf_status.ifname, pi->ifname, IFNAMSIZ);
+#else
strlcpy(pf_status.ifname, pi->ifname, IFNAMSIZ);
+#endif
break;
}
case DIOCCLRSTATUS: {
+#ifdef __FreeBSD__
+ bzero(V_pf_status.counters, sizeof(V_pf_status.counters));
+ bzero(V_pf_status.fcounters, sizeof(V_pf_status.fcounters));
+ bzero(V_pf_status.scounters, sizeof(V_pf_status.scounters));
+ V_pf_status.since = time_second;
+ if (*V_pf_status.ifname)
+ pfi_update_status(V_pf_status.ifname, NULL);
+#else
bzero(pf_status.counters, sizeof(pf_status.counters));
bzero(pf_status.fcounters, sizeof(pf_status.fcounters));
bzero(pf_status.scounters, sizeof(pf_status.scounters));
pf_status.since = time_second;
if (*pf_status.ifname)
- pfi_clr_istats(pf_status.ifname);
+ pfi_update_status(pf_status.ifname, NULL);
+#endif
break;
}
case DIOCNATLOOK: {
struct pfioc_natlook *pnl = (struct pfioc_natlook *)addr;
+ struct pf_state_key *sk;
struct pf_state *state;
- struct pf_state_cmp key;
+ struct pf_state_key_cmp key;
int m = 0, direction = pnl->direction;
+ int sidx, didx;
- key.af = pnl->af;
- key.proto = pnl->proto;
+ /* NATLOOK src and dst are reversed, so reverse sidx/didx */
+ sidx = (direction == PF_IN) ? 1 : 0;
+ didx = (direction == PF_IN) ? 0 : 1;
if (!pnl->proto ||
PF_AZERO(&pnl->saddr, pnl->af) ||
@@ -2209,43 +2469,23 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
(!pnl->dport || !pnl->sport)))
error = EINVAL;
else {
- /*
- * userland gives us source and dest of connection,
- * reverse the lookup so we ask for what happens with
- * the return traffic, enabling us to find it in the
- * state tree.
- */
- if (direction == PF_IN) {
- PF_ACPY(&key.ext.addr, &pnl->daddr, pnl->af);
- key.ext.port = pnl->dport;
- PF_ACPY(&key.gwy.addr, &pnl->saddr, pnl->af);
- key.gwy.port = pnl->sport;
- state = pf_find_state_all(&key, PF_EXT_GWY, &m);
- } else {
- PF_ACPY(&key.lan.addr, &pnl->daddr, pnl->af);
- key.lan.port = pnl->dport;
- PF_ACPY(&key.ext.addr, &pnl->saddr, pnl->af);
- key.ext.port = pnl->sport;
- state = pf_find_state_all(&key, PF_LAN_EXT, &m);
- }
+ key.af = pnl->af;
+ key.proto = pnl->proto;
+ PF_ACPY(&key.addr[sidx], &pnl->saddr, pnl->af);
+ key.port[sidx] = pnl->sport;
+ PF_ACPY(&key.addr[didx], &pnl->daddr, pnl->af);
+ key.port[didx] = pnl->dport;
+
+ state = pf_find_state_all(&key, direction, &m);
+
if (m > 1)
error = E2BIG; /* more than one state */
else if (state != NULL) {
- if (direction == PF_IN) {
- PF_ACPY(&pnl->rsaddr, &state->lan.addr,
- state->af);
- pnl->rsport = state->lan.port;
- PF_ACPY(&pnl->rdaddr, &pnl->daddr,
- pnl->af);
- pnl->rdport = pnl->dport;
- } else {
- PF_ACPY(&pnl->rdaddr, &state->gwy.addr,
- state->af);
- pnl->rdport = state->gwy.port;
- PF_ACPY(&pnl->rsaddr, &pnl->saddr,
- pnl->af);
- pnl->rsport = pnl->sport;
- }
+ sk = state->key[sidx];
+ PF_ACPY(&pnl->rsaddr, &sk->addr[sidx], sk->af);
+ pnl->rsport = sk->port[sidx];
+ PF_ACPY(&pnl->rdaddr, &sk->addr[didx], sk->af);
+ pnl->rdport = sk->port[didx];
} else
error = ENOENT;
}
@@ -2261,10 +2501,18 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EINVAL;
goto fail;
}
+#ifdef __FreeBSD__
+ old = V_pf_default_rule.timeout[pt->timeout];
+#else
old = pf_default_rule.timeout[pt->timeout];
+#endif
if (pt->timeout == PFTM_INTERVAL && pt->seconds == 0)
pt->seconds = 1;
+#ifdef __FreeBSD__
+ V_pf_default_rule.timeout[pt->timeout] = pt->seconds;
+#else
pf_default_rule.timeout[pt->timeout] = pt->seconds;
+#endif
if (pt->timeout == PFTM_INTERVAL && pt->seconds < old)
wakeup(pf_purge_thread);
pt->seconds = old;
@@ -2278,7 +2526,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EINVAL;
goto fail;
}
+#ifdef __FreeBSD__
+ pt->seconds = V_pf_default_rule.timeout[pt->timeout];
+#else
pt->seconds = pf_default_rule.timeout[pt->timeout];
+#endif
break;
}
@@ -2289,7 +2541,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EINVAL;
goto fail;
}
+#ifdef __FreeBSD__
+ pl->limit = V_pf_pool_limits[pl->index].limit;
+#else
pl->limit = pf_pool_limits[pl->index].limit;
+#endif
break;
}
@@ -2298,29 +2554,40 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
int old_limit;
if (pl->index < 0 || pl->index >= PF_LIMIT_MAX ||
+#ifdef __FreeBSD__
+ V_pf_pool_limits[pl->index].pp == NULL) {
+#else
pf_pool_limits[pl->index].pp == NULL) {
+#endif
error = EINVAL;
goto fail;
}
#ifdef __FreeBSD__
- uma_zone_set_max(pf_pool_limits[pl->index].pp, pl->limit);
+ uma_zone_set_max(V_pf_pool_limits[pl->index].pp, pl->limit);
+ old_limit = V_pf_pool_limits[pl->index].limit;
+ V_pf_pool_limits[pl->index].limit = pl->limit;
+ pl->limit = old_limit;
#else
if (pool_sethardlimit(pf_pool_limits[pl->index].pp,
pl->limit, NULL, 0) != 0) {
error = EBUSY;
goto fail;
}
-#endif
old_limit = pf_pool_limits[pl->index].limit;
pf_pool_limits[pl->index].limit = pl->limit;
pl->limit = old_limit;
+#endif
break;
}
case DIOCSETDEBUG: {
u_int32_t *level = (u_int32_t *)addr;
+#ifdef __FreeBSD__
+ V_pf_status.debug = *level;
+#else
pf_status.debug = *level;
+#endif
break;
}
@@ -2363,11 +2630,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pf_altq *altq;
/* enable all altq interfaces on active list */
- TAILQ_FOREACH(altq, pf_altqs_active, entries) {
#ifdef __FreeBSD__
+ TAILQ_FOREACH(altq, V_pf_altqs_active, entries) {
if (altq->qname[0] == 0 && (altq->local_flags &
PFALTQ_FLAG_IF_REMOVED) == 0) {
#else
+ TAILQ_FOREACH(altq, pf_altqs_active, entries) {
if (altq->qname[0] == 0) {
#endif
error = pf_enable_altq(altq);
@@ -2376,7 +2644,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
}
if (error == 0)
+#ifdef __FreeBSD__
+ V_pf_altq_running = 1;
+#else
pf_altq_running = 1;
+#endif
DPFPRINTF(PF_DEBUG_MISC, ("altq: started\n"));
break;
}
@@ -2385,11 +2657,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pf_altq *altq;
/* disable all altq interfaces on active list */
- TAILQ_FOREACH(altq, pf_altqs_active, entries) {
#ifdef __FreeBSD__
+ TAILQ_FOREACH(altq, V_pf_altqs_active, entries) {
if (altq->qname[0] == 0 && (altq->local_flags &
PFALTQ_FLAG_IF_REMOVED) == 0) {
#else
+ TAILQ_FOREACH(altq, pf_altqs_active, entries) {
if (altq->qname[0] == 0) {
#endif
error = pf_disable_altq(altq);
@@ -2398,7 +2671,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
}
if (error == 0)
+#ifdef __FreeBSD__
+ V_pf_altq_running = 0;
+#else
pf_altq_running = 0;
+#endif
DPFPRINTF(PF_DEBUG_MISC, ("altq: stopped\n"));
break;
}
@@ -2407,11 +2684,19 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pfioc_altq *pa = (struct pfioc_altq *)addr;
struct pf_altq *altq, *a;
+#ifdef __FreeBSD__
+ if (pa->ticket != V_ticket_altqs_inactive) {
+#else
if (pa->ticket != ticket_altqs_inactive) {
+#endif
error = EBUSY;
break;
}
- altq = pool_get(&pf_altq_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ altq = pool_get(&V_pf_altq_pl, PR_NOWAIT);
+#else
+ altq = pool_get(&pf_altq_pl, PR_WAITOK|PR_LIMITFAIL);
+#endif
if (altq == NULL) {
error = ENOMEM;
break;
@@ -2428,11 +2713,19 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (altq->qname[0] != 0) {
if ((altq->qid = pf_qname2qid(altq->qname)) == 0) {
error = EBUSY;
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, altq);
+#else
pool_put(&pf_altq_pl, altq);
+#endif
break;
}
altq->altq_disc = NULL;
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(a, V_pf_altqs_inactive, entries) {
+#else
TAILQ_FOREACH(a, pf_altqs_inactive, entries) {
+#endif
if (strncmp(a->ifname, altq->ifname,
IFNAMSIZ) == 0 && a->qname[0] == 0) {
altq->altq_disc = a->altq_disc;
@@ -2448,18 +2741,26 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
altq->local_flags |= PFALTQ_FLAG_IF_REMOVED;
} else {
PF_UNLOCK();
-#endif
+#endif
error = altq_add(altq);
#ifdef __FreeBSD__
PF_LOCK();
}
#endif
if (error) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_altq_pl, altq);
+#else
pool_put(&pf_altq_pl, altq);
+#endif
break;
}
+#ifdef __FreeBSD__
+ TAILQ_INSERT_TAIL(V_pf_altqs_inactive, altq, entries);
+#else
TAILQ_INSERT_TAIL(pf_altqs_inactive, altq, entries);
+#endif
bcopy(altq, &pa->altq, sizeof(struct pf_altq));
break;
}
@@ -2469,9 +2770,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pf_altq *altq;
pa->nr = 0;
+#ifdef __FreeBSD__
+ TAILQ_FOREACH(altq, V_pf_altqs_active, entries)
+ pa->nr++;
+ pa->ticket = V_ticket_altqs_active;
+#else
TAILQ_FOREACH(altq, pf_altqs_active, entries)
pa->nr++;
pa->ticket = ticket_altqs_active;
+#endif
break;
}
@@ -2480,12 +2787,20 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pf_altq *altq;
u_int32_t nr;
+#ifdef __FreeBSD__
+ if (pa->ticket != V_ticket_altqs_active) {
+#else
if (pa->ticket != ticket_altqs_active) {
+#endif
error = EBUSY;
break;
}
nr = 0;
+#ifdef __FreeBSD__
+ altq = TAILQ_FIRST(V_pf_altqs_active);
+#else
altq = TAILQ_FIRST(pf_altqs_active);
+#endif
while ((altq != NULL) && (nr < pa->nr)) {
altq = TAILQ_NEXT(altq, entries);
nr++;
@@ -2509,13 +2824,21 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
u_int32_t nr;
int nbytes;
+#ifdef __FreeBSD__
+ if (pq->ticket != V_ticket_altqs_active) {
+#else
if (pq->ticket != ticket_altqs_active) {
+#endif
error = EBUSY;
break;
}
nbytes = pq->nbytes;
nr = 0;
+#ifdef __FreeBSD__
+ altq = TAILQ_FIRST(V_pf_altqs_active);
+#else
altq = TAILQ_FIRST(pf_altqs_active);
+#endif
while ((altq != NULL) && (nr < pq->nr)) {
altq = TAILQ_NEXT(altq, entries);
nr++;
@@ -2524,6 +2847,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
break;
}
+
#ifdef __FreeBSD__
if ((altq->local_flags & PFALTQ_FLAG_IF_REMOVED) != 0) {
error = ENXIO;
@@ -2546,15 +2870,24 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCBEGINADDRS: {
struct pfioc_pooladdr *pp = (struct pfioc_pooladdr *)addr;
+#ifdef __FreeBSD__
+ pf_empty_pool(&V_pf_pabuf);
+ pp->ticket = ++V_ticket_pabuf;
+#else
pf_empty_pool(&pf_pabuf);
pp->ticket = ++ticket_pabuf;
+#endif
break;
}
case DIOCADDADDR: {
struct pfioc_pooladdr *pp = (struct pfioc_pooladdr *)addr;
+#ifdef __FreeBSD__
+ if (pp->ticket != V_ticket_pabuf) {
+#else
if (pp->ticket != ticket_pabuf) {
+#endif
error = EBUSY;
break;
}
@@ -2576,7 +2909,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EINVAL;
break;
}
- pa = pool_get(&pf_pooladdr_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ pa = pool_get(&V_pf_pooladdr_pl, PR_NOWAIT);
+#else
+ pa = pool_get(&pf_pooladdr_pl, PR_WAITOK|PR_LIMITFAIL);
+#endif
if (pa == NULL) {
error = ENOMEM;
break;
@@ -2585,7 +2922,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (pa->ifname[0]) {
pa->kif = pfi_kif_get(pa->ifname);
if (pa->kif == NULL) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, pa);
+#else
pool_put(&pf_pooladdr_pl, pa);
+#endif
error = EINVAL;
break;
}
@@ -2594,11 +2935,19 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (pfi_dynaddr_setup(&pa->addr, pp->af)) {
pfi_dynaddr_remove(&pa->addr);
pfi_kif_unref(pa->kif, PFI_KIF_REF_RULE);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, pa);
+#else
pool_put(&pf_pooladdr_pl, pa);
+#endif
error = EINVAL;
break;
}
+#ifdef __FreeBSD__
+ TAILQ_INSERT_TAIL(&V_pf_pabuf, pa, entries);
+#else
TAILQ_INSERT_TAIL(&pf_pabuf, pa, entries);
+#endif
break;
}
@@ -2637,9 +2986,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
bcopy(pa, &pp->addr, sizeof(struct pf_pooladdr));
- pfi_dynaddr_copyout(&pp->addr.addr);
- pf_tbladdr_copyout(&pp->addr.addr);
- pf_rtlabel_copyout(&pp->addr.addr);
+ pf_addr_copyout(&pp->addr.addr);
break;
}
@@ -2672,7 +3019,13 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
if (pca->action != PF_CHANGE_REMOVE) {
- newpa = pool_get(&pf_pooladdr_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ newpa = pool_get(&V_pf_pooladdr_pl,
+ PR_NOWAIT);
+#else
+ newpa = pool_get(&pf_pooladdr_pl,
+ PR_WAITOK|PR_LIMITFAIL);
+#endif
if (newpa == NULL) {
error = ENOMEM;
break;
@@ -2680,14 +3033,22 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
bcopy(&pca->addr, newpa, sizeof(struct pf_pooladdr));
#ifndef INET
if (pca->af == AF_INET) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, newpa);
+#else
pool_put(&pf_pooladdr_pl, newpa);
+#endif
error = EAFNOSUPPORT;
break;
}
#endif /* INET */
#ifndef INET6
if (pca->af == AF_INET6) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, newpa);
+#else
pool_put(&pf_pooladdr_pl, newpa);
+#endif
error = EAFNOSUPPORT;
break;
}
@@ -2695,7 +3056,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (newpa->ifname[0]) {
newpa->kif = pfi_kif_get(newpa->ifname);
if (newpa->kif == NULL) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, newpa);
+#else
pool_put(&pf_pooladdr_pl, newpa);
+#endif
error = EINVAL;
break;
}
@@ -2706,7 +3071,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
pf_tbladdr_setup(ruleset, &newpa->addr)) {
pfi_dynaddr_remove(&newpa->addr);
pfi_kif_unref(newpa->kif, PFI_KIF_REF_RULE);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, newpa);
+#else
pool_put(&pf_pooladdr_pl, newpa);
+#endif
error = EINVAL;
break;
}
@@ -2735,7 +3104,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
pfi_dynaddr_remove(&oldpa->addr);
pf_tbladdr_remove(&oldpa->addr);
pfi_kif_unref(oldpa->kif, PFI_KIF_REF_RULE);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_pooladdr_pl, oldpa);
+#else
pool_put(&pf_pooladdr_pl, oldpa);
+#endif
} else {
if (oldpa == NULL)
TAILQ_INSERT_TAIL(&pool->list, newpa, entries);
@@ -2766,7 +3139,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
pr->nr = 0;
if (ruleset->anchor == NULL) {
/* XXX kludge for pf_main_ruleset */
+#ifdef __FreeBSD__
+ RB_FOREACH(anchor, pf_anchor_global, &V_pf_anchors)
+#else
RB_FOREACH(anchor, pf_anchor_global, &pf_anchors)
+#endif
if (anchor->parent == NULL)
pr->nr++;
} else {
@@ -2791,7 +3168,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
pr->name[0] = 0;
if (ruleset->anchor == NULL) {
/* XXX kludge for pf_main_ruleset */
+#ifdef __FreeBSD__
+ RB_FOREACH(anchor, pf_anchor_global, &V_pf_anchors)
+#else
RB_FOREACH(anchor, pf_anchor_global, &pf_anchors)
+#endif
if (anchor->parent == NULL && nr++ == pr->nr) {
strlcpy(pr->name, anchor->name,
sizeof(pr->name));
@@ -3036,17 +3417,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
- ioe = (struct pfioc_trans_e *)malloc(sizeof(*ioe),
- M_TEMP, M_WAITOK);
- table = (struct pfr_table *)malloc(sizeof(*table),
- M_TEMP, M_WAITOK);
+ ioe = malloc(sizeof(*ioe), M_TEMP, M_WAITOK);
+ table = malloc(sizeof(*table), M_TEMP, M_WAITOK);
#ifdef __FreeBSD__
PF_LOCK();
#endif
for (i = 0; i < io->size; i++) {
#ifdef __FreeBSD__
- PF_COPYIN(io->array+i, ioe, sizeof(*ioe), error);
- if (error) {
+ PF_COPYIN(io->array+i, ioe, sizeof(*ioe), error);
+ if (error) {
#else
if (copyin(io->array+i, ioe, sizeof(*ioe))) {
#endif
@@ -3122,10 +3501,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
- ioe = (struct pfioc_trans_e *)malloc(sizeof(*ioe),
- M_TEMP, M_WAITOK);
- table = (struct pfr_table *)malloc(sizeof(*table),
- M_TEMP, M_WAITOK);
+ ioe = malloc(sizeof(*ioe), M_TEMP, M_WAITOK);
+ table = malloc(sizeof(*table), M_TEMP, M_WAITOK);
#ifdef __FreeBSD__
PF_LOCK();
#endif
@@ -3197,10 +3574,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
- ioe = (struct pfioc_trans_e *)malloc(sizeof(*ioe),
- M_TEMP, M_WAITOK);
- table = (struct pfr_table *)malloc(sizeof(*table),
- M_TEMP, M_WAITOK);
+ ioe = malloc(sizeof(*ioe), M_TEMP, M_WAITOK);
+ table = malloc(sizeof(*table), M_TEMP, M_WAITOK);
#ifdef __FreeBSD__
PF_LOCK();
#endif
@@ -3226,8 +3601,13 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EINVAL;
goto fail;
}
+#ifdef __FreeBSD__
+ if (!V_altqs_inactive_open || ioe->ticket !=
+ V_ticket_altqs_inactive) {
+#else
if (!altqs_inactive_open || ioe->ticket !=
ticket_altqs_inactive) {
+#endif
free(table, M_TEMP);
free(ioe, M_TEMP);
error = EBUSY;
@@ -3238,7 +3618,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case PF_RULESET_TABLE:
rs = pf_find_ruleset(ioe->anchor);
if (rs == NULL || !rs->topen || ioe->ticket !=
- rs->tticket) {
+ rs->tticket) {
free(table, M_TEMP);
free(ioe, M_TEMP);
error = EBUSY;
@@ -3322,7 +3702,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
int space = psn->psn_len;
if (space == 0) {
+#ifdef __FreeBSD__
+ RB_FOREACH(n, pf_src_tree, &V_tree_src_tracking)
+#else
RB_FOREACH(n, pf_src_tree, &tree_src_tracking)
+#endif
nr++;
psn->psn_len = sizeof(struct pf_src_node) * nr;
break;
@@ -3335,9 +3719,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
#ifdef __FreeBSD__
PF_LOCK();
#endif
-
p = psn->psn_src_nodes;
+#ifdef __FreeBSD__
+ RB_FOREACH(n, pf_src_tree, &V_tree_src_tracking) {
+#else
RB_FOREACH(n, pf_src_tree, &tree_src_tracking) {
+#endif
int secs = time_second, diff;
if ((nr + 1) * sizeof(*p) > (unsigned)psn->psn_len)
@@ -3383,39 +3770,59 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pf_src_node *n;
struct pf_state *state;
+#ifdef __FreeBSD__
+ RB_FOREACH(state, pf_state_tree_id, &V_tree_id) {
+#else
RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+#endif
state->src_node = NULL;
state->nat_src_node = NULL;
}
+#ifdef __FreeBSD__
+ RB_FOREACH(n, pf_src_tree, &V_tree_src_tracking) {
+#else
RB_FOREACH(n, pf_src_tree, &tree_src_tracking) {
+#endif
n->expire = 1;
n->states = 0;
}
pf_purge_expired_src_nodes(1);
+#ifdef __FreeBSD__
+ V_pf_status.src_nodes = 0;
+#else
pf_status.src_nodes = 0;
+#endif
break;
}
case DIOCKILLSRCNODES: {
struct pf_src_node *sn;
struct pf_state *s;
- struct pfioc_src_node_kill *psnk = \
- (struct pfioc_src_node_kill *) addr;
- int killed = 0;
+ struct pfioc_src_node_kill *psnk =
+ (struct pfioc_src_node_kill *)addr;
+ u_int killed = 0;
+#ifdef __FreeBSD__
+ RB_FOREACH(sn, pf_src_tree, &V_tree_src_tracking) {
+#else
RB_FOREACH(sn, pf_src_tree, &tree_src_tracking) {
- if (PF_MATCHA(psnk->psnk_src.neg, \
- &psnk->psnk_src.addr.v.a.addr, \
- &psnk->psnk_src.addr.v.a.mask, \
- &sn->addr, sn->af) &&
- PF_MATCHA(psnk->psnk_dst.neg, \
- &psnk->psnk_dst.addr.v.a.addr, \
- &psnk->psnk_dst.addr.v.a.mask, \
- &sn->raddr, sn->af)) {
+#endif
+ if (PF_MATCHA(psnk->psnk_src.neg,
+ &psnk->psnk_src.addr.v.a.addr,
+ &psnk->psnk_src.addr.v.a.mask,
+ &sn->addr, sn->af) &&
+ PF_MATCHA(psnk->psnk_dst.neg,
+ &psnk->psnk_dst.addr.v.a.addr,
+ &psnk->psnk_dst.addr.v.a.mask,
+ &sn->raddr, sn->af)) {
/* Handle state to src_node linkage */
if (sn->states != 0) {
- RB_FOREACH(s, pf_state_tree_id,
+ RB_FOREACH(s, pf_state_tree_id,
+#ifdef __FreeBSD__
+ &V_tree_id) {
+#else
&tree_id) {
+#endif
if (s->src_node == sn)
s->src_node = NULL;
if (s->nat_src_node == sn)
@@ -3431,17 +3838,24 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (killed > 0)
pf_purge_expired_src_nodes(1);
- psnk->psnk_af = killed;
+ psnk->psnk_killed = killed;
break;
}
case DIOCSETHOSTID: {
u_int32_t *hostid = (u_int32_t *)addr;
+#ifdef __FreeBSD__
+ if (*hostid == 0)
+ V_pf_status.hostid = arc4random();
+ else
+ V_pf_status.hostid = *hostid;
+#else
if (*hostid == 0)
pf_status.hostid = arc4random();
else
pf_status.hostid = *hostid;
+#endif
break;
}
@@ -3484,43 +3898,110 @@ fail:
PF_UNLOCK();
if (flags & FWRITE)
- sx_xunlock(&pf_consistency_lock);
+ sx_xunlock(&V_pf_consistency_lock);
else
- sx_sunlock(&pf_consistency_lock);
+ sx_sunlock(&V_pf_consistency_lock);
#else
splx(s);
- /* XXX: Lock order? */
if (flags & FWRITE)
rw_exit_write(&pf_consistency_lock);
else
rw_exit_read(&pf_consistency_lock);
#endif
+
+ CURVNET_RESTORE();
+
return (error);
}
#ifdef __FreeBSD__
+void
+pfsync_state_export(struct pfsync_state *sp, struct pf_state *st)
+{
+ bzero(sp, sizeof(struct pfsync_state));
+
+ /* copy from state key */
+ sp->key[PF_SK_WIRE].addr[0] = st->key[PF_SK_WIRE]->addr[0];
+ sp->key[PF_SK_WIRE].addr[1] = st->key[PF_SK_WIRE]->addr[1];
+ sp->key[PF_SK_WIRE].port[0] = st->key[PF_SK_WIRE]->port[0];
+ sp->key[PF_SK_WIRE].port[1] = st->key[PF_SK_WIRE]->port[1];
+ sp->key[PF_SK_STACK].addr[0] = st->key[PF_SK_STACK]->addr[0];
+ sp->key[PF_SK_STACK].addr[1] = st->key[PF_SK_STACK]->addr[1];
+ sp->key[PF_SK_STACK].port[0] = st->key[PF_SK_STACK]->port[0];
+ sp->key[PF_SK_STACK].port[1] = st->key[PF_SK_STACK]->port[1];
+ sp->proto = st->key[PF_SK_WIRE]->proto;
+ sp->af = st->key[PF_SK_WIRE]->af;
+
+ /* copy from state */
+ strlcpy(sp->ifname, st->kif->pfik_name, sizeof(sp->ifname));
+ bcopy(&st->rt_addr, &sp->rt_addr, sizeof(sp->rt_addr));
+ sp->creation = htonl(time_second - st->creation);
+ sp->expire = pf_state_expires(st);
+ if (sp->expire <= time_second)
+ sp->expire = htonl(0);
+ else
+ sp->expire = htonl(sp->expire - time_second);
+
+ sp->direction = st->direction;
+ sp->log = st->log;
+ sp->timeout = st->timeout;
+ sp->state_flags = st->state_flags;
+ if (st->src_node)
+ sp->sync_flags |= PFSYNC_FLAG_SRCNODE;
+ if (st->nat_src_node)
+ sp->sync_flags |= PFSYNC_FLAG_NATSRCNODE;
+
+ bcopy(&st->id, &sp->id, sizeof(sp->id));
+ sp->creatorid = st->creatorid;
+ pf_state_peer_hton(&st->src, &sp->src);
+ pf_state_peer_hton(&st->dst, &sp->dst);
+
+ if (st->rule.ptr == NULL)
+ sp->rule = htonl(-1);
+ else
+ sp->rule = htonl(st->rule.ptr->nr);
+ if (st->anchor.ptr == NULL)
+ sp->anchor = htonl(-1);
+ else
+ sp->anchor = htonl(st->anchor.ptr->nr);
+ if (st->nat_rule.ptr == NULL)
+ sp->nat_rule = htonl(-1);
+ else
+ sp->nat_rule = htonl(st->nat_rule.ptr->nr);
+
+ pf_state_counter_hton(st->packets[0], sp->packets[0]);
+ pf_state_counter_hton(st->packets[1], sp->packets[1]);
+ pf_state_counter_hton(st->bytes[0], sp->bytes[0]);
+ pf_state_counter_hton(st->bytes[1], sp->bytes[1]);
+
+}
+
/*
* XXX - Check for version missmatch!!!
*/
static void
pf_clear_states(void)
{
- struct pf_state *state;
-
+ struct pf_state *state;
+
+#ifdef __FreeBSD__
+ RB_FOREACH(state, pf_state_tree_id, &V_tree_id) {
+#else
RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+#endif
state->timeout = PFTM_PURGE;
#if NPFSYNC
/* don't send out individual delete messages */
- state->sync_flags = PFSTATE_NOSYNC;
+ state->sync_state = PFSTATE_NOSYNC;
#endif
pf_unlink_state(state);
}
-
+
#if 0 /* NPFSYNC */
/*
* XXX This is called on module unload, we do not want to sync that over? */
*/
- pfsync_clear_states(pf_status.hostid, psk->psk_ifname);
+ pfsync_clear_states(V_pf_status.hostid, psk->psk_ifname);
#endif
}
@@ -3544,11 +4025,19 @@ pf_clear_srcnodes(void)
struct pf_src_node *n;
struct pf_state *state;
+#ifdef __FreeBSD__
+ RB_FOREACH(state, pf_state_tree_id, &V_tree_id) {
+#else
RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+#endif
state->src_node = NULL;
state->nat_src_node = NULL;
}
+#ifdef __FreeBSD__
+ RB_FOREACH(n, pf_src_tree, &V_tree_src_tracking) {
+#else
RB_FOREACH(n, pf_src_tree, &tree_src_tracking) {
+#endif
n->expire = 1;
n->states = 0;
}
@@ -3566,8 +4055,8 @@ shutdown_pf(void)
int error = 0;
u_int32_t t[5];
char nn = '\0';
-
- pf_status.running = 0;
+
+ V_pf_status.running = 0;
do {
if ((error = pf_begin_rules(&t[0], PF_RULESET_SCRUB, &nn))
!= 0) {
@@ -3577,22 +4066,22 @@ shutdown_pf(void)
if ((error = pf_begin_rules(&t[1], PF_RULESET_FILTER, &nn))
!= 0) {
DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: FILTER\n"));
- break; /* XXX: rollback? */
+ break; /* XXX: rollback? */
}
if ((error = pf_begin_rules(&t[2], PF_RULESET_NAT, &nn))
!= 0) {
DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: NAT\n"));
- break; /* XXX: rollback? */
+ break; /* XXX: rollback? */
}
if ((error = pf_begin_rules(&t[3], PF_RULESET_BINAT, &nn))
!= 0) {
DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: BINAT\n"));
- break; /* XXX: rollback? */
+ break; /* XXX: rollback? */
}
if ((error = pf_begin_rules(&t[4], PF_RULESET_RDR, &nn))
!= 0) {
DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: RDR\n"));
- break; /* XXX: rollback? */
+ break; /* XXX: rollback? */
}
/* XXX: these should always succeed here */
@@ -3605,13 +4094,13 @@ shutdown_pf(void)
if ((error = pf_clear_tables()) != 0)
break;
-#ifdef ALTQ
+ #ifdef ALTQ
if ((error = pf_begin_altq(&t[0])) != 0) {
DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: ALTQ\n"));
break;
}
pf_commit_altq(t[0]);
-#endif
+ #endif
pf_clear_states();
@@ -3621,7 +4110,7 @@ shutdown_pf(void)
/* fingerprints and interfaces have thier own cleanup code */
} while(0);
- return (error);
+ return (error);
}
#ifdef INET
@@ -3643,10 +4132,12 @@ pf_check_in(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
if ((*m)->m_pkthdr.len >= (int)sizeof(struct ip)) {
/* if m_pkthdr.len is less than ip header, pf will handle. */
h = mtod(*m, struct ip *);
- HTONS(h->ip_len);
- HTONS(h->ip_off);
+ HTONS(h->ip_len);
+ HTONS(h->ip_off);
}
+ CURVNET_SET(ifp->if_vnet);
chk = pf_test(PF_IN, ifp, m, NULL, inp);
+ CURVNET_RESTORE();
if (chk && *m) {
m_freem(*m);
*m = NULL;
@@ -3683,10 +4174,12 @@ pf_check_out(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
if ((*m)->m_pkthdr.len >= (int)sizeof(*h)) {
/* if m_pkthdr.len is less than ip header, pf will handle. */
h = mtod(*m, struct ip *);
- HTONS(h->ip_len);
- HTONS(h->ip_off);
+ HTONS(h->ip_len);
+ HTONS(h->ip_off);
}
+ CURVNET_SET(ifp->if_vnet);
chk = pf_test(PF_OUT, ifp, m, NULL, inp);
+ CURVNET_RESTORE();
if (chk && *m) {
m_freem(*m);
*m = NULL;
@@ -3717,8 +4210,10 @@ pf_check6_in(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
* order to support scoped addresses. In order to support stateful
* filtering we have change this to lo0 as it is the case in IPv4.
*/
+ CURVNET_SET(ifp->if_vnet);
chk = pf_test6(PF_IN, (*m)->m_flags & M_LOOP ? V_loif : ifp, m,
NULL, inp);
+ CURVNET_RESTORE();
if (chk && *m) {
m_freem(*m);
*m = NULL;
@@ -3743,7 +4238,9 @@ pf_check6_out(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
#endif
(*m)->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
}
+ CURVNET_SET(ifp->if_vnet);
chk = pf_test6(PF_OUT, ifp, m, NULL, inp);
+ CURVNET_RESTORE();
if (chk && *m) {
m_freem(*m);
*m = NULL;
@@ -3755,20 +4252,22 @@ pf_check6_out(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
static int
hook_pf(void)
{
+#ifdef INET
struct pfil_head *pfh_inet;
+#endif
#ifdef INET6
struct pfil_head *pfh_inet6;
#endif
-
+
PF_ASSERT(MA_NOTOWNED);
- if (pf_pfil_hooked)
+ if (V_pf_pfil_hooked)
return (0);
-
+
+#ifdef INET
pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
if (pfh_inet == NULL)
return (ESRCH); /* XXX */
-#ifdef INET
pfil_add_hook(pf_check_in, NULL, PFIL_IN | PFIL_WAITOK, pfh_inet);
pfil_add_hook(pf_check_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet);
#endif
@@ -3787,27 +4286,29 @@ hook_pf(void)
pfil_add_hook(pf_check6_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet6);
#endif
- pf_pfil_hooked = 1;
+ V_pf_pfil_hooked = 1;
return (0);
}
static int
dehook_pf(void)
{
+#ifdef INET
struct pfil_head *pfh_inet;
+#endif
#ifdef INET6
struct pfil_head *pfh_inet6;
#endif
PF_ASSERT(MA_NOTOWNED);
- if (pf_pfil_hooked == 0)
+ if (V_pf_pfil_hooked == 0)
return (0);
+#ifdef INET
pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
if (pfh_inet == NULL)
return (ESRCH); /* XXX */
-#ifdef INET
pfil_remove_hook(pf_check_in, NULL, PFIL_IN | PFIL_WAITOK,
pfh_inet);
pfil_remove_hook(pf_check_out, NULL, PFIL_OUT | PFIL_WAITOK,
@@ -3823,21 +4324,69 @@ dehook_pf(void)
pfh_inet6);
#endif
- pf_pfil_hooked = 0;
+ V_pf_pfil_hooked = 0;
return (0);
}
+/* Vnet accessors */
+static int
+vnet_pf_init(const void *unused)
+{
+
+ V_pf_pfil_hooked = 0;
+ V_pf_end_threads = 0;
+
+ V_debug_pfugidhack = 0;
+
+ TAILQ_INIT(&V_pf_tags);
+ TAILQ_INIT(&V_pf_qids);
+
+ pf_load();
+
+ return (0);
+}
+
+static int
+vnet_pf_uninit(const void *unused)
+{
+
+ pf_unload();
+
+ return (0);
+}
+
+/* Define startup order. */
+#define PF_SYSINIT_ORDER SI_SUB_PROTO_BEGIN
+#define PF_MODEVENT_ORDER (SI_ORDER_FIRST) /* On boot slot in here. */
+#define PF_VNET_ORDER (PF_MODEVENT_ORDER + 2) /* Later still. */
+
+/*
+ * Starting up.
+ * VNET_SYSINIT is called for each existing vnet and each new vnet.
+ */
+VNET_SYSINIT(vnet_pf_init, PF_SYSINIT_ORDER, PF_VNET_ORDER,
+ vnet_pf_init, NULL);
+
+/*
+ * Closing up shop. These are done in REVERSE ORDER,
+ * Not called on reboot.
+ * VNET_SYSUNINIT is called for each exiting vnet as it exits.
+ */
+VNET_SYSUNINIT(vnet_pf_uninit, PF_SYSINIT_ORDER, PF_VNET_ORDER,
+ vnet_pf_uninit, NULL);
+
static int
pf_load(void)
{
+
init_zone_var();
+ sx_init(&V_pf_consistency_lock, "pf_statetbl_lock");
init_pf_mutex();
- pf_dev = make_dev(&pf_cdevsw, 0, 0, 0, 0600, PF_NAME);
if (pfattach() < 0) {
- destroy_dev(pf_dev);
destroy_pf_mutex();
return (ENOMEM);
}
+
return (0);
}
@@ -3847,7 +4396,7 @@ pf_unload(void)
int error = 0;
PF_LOCK();
- pf_status.running = 0;
+ V_pf_status.running = 0;
PF_UNLOCK();
error = dehook_pf();
if (error) {
@@ -3861,18 +4410,18 @@ pf_unload(void)
}
PF_LOCK();
shutdown_pf();
- pf_end_threads = 1;
- while (pf_end_threads < 2) {
+ V_pf_end_threads = 1;
+ while (V_pf_end_threads < 2) {
wakeup_one(pf_purge_thread);
- msleep(pf_purge_thread, &pf_task_mtx, 0, "pftmo", hz);
+ msleep(pf_purge_thread, &V_pf_task_mtx, 0, "pftmo", hz);
}
pfi_cleanup();
pf_osfp_flush();
pf_osfp_cleanup();
cleanup_pf_zone();
PF_UNLOCK();
- destroy_dev(pf_dev);
destroy_pf_mutex();
+ sx_destroy(&V_pf_consistency_lock);
return error;
}
@@ -3883,11 +4432,10 @@ pf_modevent(module_t mod, int type, void *data)
switch(type) {
case MOD_LOAD:
- error = pf_load();
+ pf_dev = make_dev(&pf_cdevsw, 0, 0, 0, 0600, PF_NAME);
break;
-
case MOD_UNLOAD:
- error = pf_unload();
+ destroy_dev(pf_dev);
break;
default:
error = EINVAL;
@@ -3895,7 +4443,7 @@ pf_modevent(module_t mod, int type, void *data)
}
return error;
}
-
+
static moduledata_t pf_mod = {
"pf",
pf_modevent,
@@ -3904,4 +4452,4 @@ static moduledata_t pf_mod = {
DECLARE_MODULE(pf, pf_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST);
MODULE_VERSION(pf, PF_MODVER);
-#endif /* __FreeBSD__ */
+#endif /* __FreeBSD__ */
diff --git a/sys/contrib/pf/net/pf_lb.c b/sys/contrib/pf/net/pf_lb.c
new file mode 100644
index 0000000..f4c9a00
--- /dev/null
+++ b/sys/contrib/pf/net/pf_lb.c
@@ -0,0 +1,792 @@
+/* $OpenBSD: pf_lb.c,v 1.2 2009/02/12 02:13:15 sthen Exp $ */
+
+/*
+ * Copyright (c) 2001 Daniel Hartmeier
+ * Copyright (c) 2002 - 2008 Henning Brauer
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Effort sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F30602-01-2-0537.
+ *
+ */
+
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#endif
+
+#ifdef __FreeBSD__
+#include "opt_bpf.h"
+#include "opt_pf.h"
+
+#ifdef DEV_BPF
+#define NBPFILTER DEV_BPF
+#else
+#define NBPFILTER 0
+#endif
+
+#ifdef DEV_PFLOG
+#define NPFLOG DEV_PFLOG
+#else
+#define NPFLOG 0
+#endif
+
+#ifdef DEV_PFSYNC
+#define NPFSYNC DEV_PFSYNC
+#else
+#define NPFSYNC 0
+#endif
+
+#ifdef DEV_PFLOW
+#define NPFLOW DEV_PFLOW
+#else
+#define NPFLOW 0
+#endif
+
+#else
+#include "bpfilter.h"
+#include "pflog.h"
+#include "pfsync.h"
+#include "pflow.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/mbuf.h>
+#include <sys/filio.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/kernel.h>
+#include <sys/time.h>
+#ifdef __FreeBSD__
+#include <sys/sysctl.h>
+#endif
+#ifndef __FreeBSD__
+#include <sys/pool.h>
+#endif
+#include <sys/proc.h>
+#ifdef __FreeBSD__
+#include <sys/kthread.h>
+#include <sys/lock.h>
+#include <sys/sx.h>
+#else
+#include <sys/rwlock.h>
+#endif
+
+#ifdef __FreeBSD__
+#include <sys/md5.h>
+#else
+#include <crypto/md5.h>
+#endif
+
+#include <net/if.h>
+#include <net/if_types.h>
+#include <net/bpf.h>
+#include <net/route.h>
+#include <net/radix_mpath.h>
+
+#include <netinet/in.h>
+#include <netinet/in_var.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/tcp.h>
+#include <netinet/tcp_seq.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/in_pcb.h>
+#include <netinet/tcp_timer.h>
+#include <netinet/tcp_var.h>
+#include <netinet/udp_var.h>
+#include <netinet/icmp_var.h>
+#include <netinet/if_ether.h>
+
+#ifndef __FreeBSD__
+#include <dev/rndvar.h>
+#endif
+#include <net/pfvar.h>
+#include <net/if_pflog.h>
+#include <net/if_pflow.h>
+
+#if NPFSYNC > 0
+#include <net/if_pfsync.h>
+#endif /* NPFSYNC > 0 */
+
+#ifdef INET6
+#include <netinet/ip6.h>
+#include <netinet/in_pcb.h>
+#include <netinet/icmp6.h>
+#include <netinet6/nd6.h>
+#endif /* INET6 */
+
+
+#ifdef __FreeBSD__
+#define DPFPRINTF(n, x) if (V_pf_status.debug >= (n)) printf x
+#else
+#define DPFPRINTF(n, x) if (pf_status.debug >= (n)) printf x
+#endif
+
+/*
+ * Global variables
+ */
+
+void pf_hash(struct pf_addr *, struct pf_addr *,
+ struct pf_poolhashkey *, sa_family_t);
+struct pf_rule *pf_match_translation(struct pf_pdesc *, struct mbuf *,
+ int, int, struct pfi_kif *,
+ struct pf_addr *, u_int16_t, struct pf_addr *,
+ u_int16_t, int);
+int pf_get_sport(sa_family_t, u_int8_t, struct pf_rule *,
+ struct pf_addr *, struct pf_addr *, u_int16_t,
+ struct pf_addr *, u_int16_t*, u_int16_t, u_int16_t,
+ struct pf_src_node **);
+
+#define mix(a,b,c) \
+ do { \
+ a -= b; a -= c; a ^= (c >> 13); \
+ b -= c; b -= a; b ^= (a << 8); \
+ c -= a; c -= b; c ^= (b >> 13); \
+ a -= b; a -= c; a ^= (c >> 12); \
+ b -= c; b -= a; b ^= (a << 16); \
+ c -= a; c -= b; c ^= (b >> 5); \
+ a -= b; a -= c; a ^= (c >> 3); \
+ b -= c; b -= a; b ^= (a << 10); \
+ c -= a; c -= b; c ^= (b >> 15); \
+ } while (0)
+
+/*
+ * hash function based on bridge_hash in if_bridge.c
+ */
+void
+pf_hash(struct pf_addr *inaddr, struct pf_addr *hash,
+ struct pf_poolhashkey *key, sa_family_t af)
+{
+ u_int32_t a = 0x9e3779b9, b = 0x9e3779b9, c = key->key32[0];
+
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ a += inaddr->addr32[0];
+ b += key->key32[1];
+ mix(a, b, c);
+ hash->addr32[0] = c + key->key32[2];
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ a += inaddr->addr32[0];
+ b += inaddr->addr32[2];
+ mix(a, b, c);
+ hash->addr32[0] = c;
+ a += inaddr->addr32[1];
+ b += inaddr->addr32[3];
+ c += key->key32[1];
+ mix(a, b, c);
+ hash->addr32[1] = c;
+ a += inaddr->addr32[2];
+ b += inaddr->addr32[1];
+ c += key->key32[2];
+ mix(a, b, c);
+ hash->addr32[2] = c;
+ a += inaddr->addr32[3];
+ b += inaddr->addr32[0];
+ c += key->key32[3];
+ mix(a, b, c);
+ hash->addr32[3] = c;
+ break;
+#endif /* INET6 */
+ }
+}
+
+struct pf_rule *
+pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
+ int direction, struct pfi_kif *kif, struct pf_addr *saddr, u_int16_t sport,
+ struct pf_addr *daddr, u_int16_t dport, int rs_num)
+{
+ struct pf_rule *r, *rm = NULL;
+ struct pf_ruleset *ruleset = NULL;
+ int tag = -1;
+ int rtableid = -1;
+ int asd = 0;
+
+ r = TAILQ_FIRST(pf_main_ruleset.rules[rs_num].active.ptr);
+ while (r && rm == NULL) {
+ struct pf_rule_addr *src = NULL, *dst = NULL;
+ struct pf_addr_wrap *xdst = NULL;
+
+ if (r->action == PF_BINAT && direction == PF_IN) {
+ src = &r->dst;
+ if (r->rpool.cur != NULL)
+ xdst = &r->rpool.cur->addr;
+ } else {
+ src = &r->src;
+ dst = &r->dst;
+ }
+
+ r->evaluations++;
+ if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ r = r->skip[PF_SKIP_IFP].ptr;
+ else if (r->direction && r->direction != direction)
+ r = r->skip[PF_SKIP_DIR].ptr;
+ else if (r->af && r->af != pd->af)
+ r = r->skip[PF_SKIP_AF].ptr;
+ else if (r->proto && r->proto != pd->proto)
+ r = r->skip[PF_SKIP_PROTO].ptr;
+ else if (PF_MISMATCHAW(&src->addr, saddr, pd->af,
+ src->neg, kif))
+ r = r->skip[src == &r->src ? PF_SKIP_SRC_ADDR :
+ PF_SKIP_DST_ADDR].ptr;
+ else if (src->port_op && !pf_match_port(src->port_op,
+ src->port[0], src->port[1], sport))
+ r = r->skip[src == &r->src ? PF_SKIP_SRC_PORT :
+ PF_SKIP_DST_PORT].ptr;
+ else if (dst != NULL &&
+ PF_MISMATCHAW(&dst->addr, daddr, pd->af, dst->neg, NULL))
+ r = r->skip[PF_SKIP_DST_ADDR].ptr;
+ else if (xdst != NULL && PF_MISMATCHAW(xdst, daddr, pd->af,
+ 0, NULL))
+ r = TAILQ_NEXT(r, entries);
+ else if (dst != NULL && dst->port_op &&
+ !pf_match_port(dst->port_op, dst->port[0],
+ dst->port[1], dport))
+ r = r->skip[PF_SKIP_DST_PORT].ptr;
+#ifdef __FreeBSD__
+ else if (r->match_tag && !pf_match_tag(m, r, &tag, pd->pf_mtag))
+#else
+ else if (r->match_tag && !pf_match_tag(m, r, &tag))
+#endif
+ r = TAILQ_NEXT(r, entries);
+ else if (r->os_fingerprint != PF_OSFP_ANY && (pd->proto !=
+ IPPROTO_TCP || !pf_osfp_match(pf_osfp_fingerprint(pd, m,
+ off, pd->hdr.tcp), r->os_fingerprint)))
+ r = TAILQ_NEXT(r, entries);
+ else {
+ if (r->tag)
+ tag = r->tag;
+ if (r->rtableid >= 0)
+ rtableid = r->rtableid;
+ if (r->anchor == NULL) {
+ rm = r;
+ } else
+ pf_step_into_anchor(&asd, &ruleset, rs_num,
+ &r, NULL, NULL);
+ }
+ if (r == NULL)
+ pf_step_out_of_anchor(&asd, &ruleset, rs_num, &r,
+ NULL, NULL);
+ }
+#ifdef __FreeBSD__
+ if (pf_tag_packet(m, tag, rtableid, pd->pf_mtag))
+#else
+ if (pf_tag_packet(m, tag, rtableid))
+#endif
+ return (NULL);
+ if (rm != NULL && (rm->action == PF_NONAT ||
+ rm->action == PF_NORDR || rm->action == PF_NOBINAT))
+ return (NULL);
+ return (rm);
+}
+
+int
+pf_get_sport(sa_family_t af, u_int8_t proto, struct pf_rule *r,
+ struct pf_addr *saddr, struct pf_addr *daddr, u_int16_t dport,
+ struct pf_addr *naddr, u_int16_t *nport, u_int16_t low, u_int16_t high,
+ struct pf_src_node **sn)
+{
+ struct pf_state_key_cmp key;
+ struct pf_addr init_addr;
+ u_int16_t cut;
+
+ bzero(&init_addr, sizeof(init_addr));
+ if (pf_map_addr(af, r, saddr, naddr, &init_addr, sn))
+ return (1);
+
+ if (proto == IPPROTO_ICMP) {
+ low = 1;
+ high = 65535;
+ }
+
+ do {
+ key.af = af;
+ key.proto = proto;
+ PF_ACPY(&key.addr[1], daddr, key.af);
+ PF_ACPY(&key.addr[0], naddr, key.af);
+ key.port[1] = dport;
+
+ /*
+ * port search; start random, step;
+ * similar 2 portloop in in_pcbbind
+ */
+ if (!(proto == IPPROTO_TCP || proto == IPPROTO_UDP ||
+ proto == IPPROTO_ICMP)) {
+ key.port[0] = dport;
+ if (pf_find_state_all(&key, PF_IN, NULL) == NULL)
+ return (0);
+ } else if (low == 0 && high == 0) {
+ key.port[0] = *nport;
+ if (pf_find_state_all(&key, PF_IN, NULL) == NULL)
+ return (0);
+ } else if (low == high) {
+ key.port[0] = htons(low);
+ if (pf_find_state_all(&key, PF_IN, NULL) == NULL) {
+ *nport = htons(low);
+ return (0);
+ }
+ } else {
+ u_int16_t tmp;
+
+ if (low > high) {
+ tmp = low;
+ low = high;
+ high = tmp;
+ }
+ /* low < high */
+#ifdef __FreeBSD__
+ cut = htonl(arc4random()) % (1 + high - low) + low;
+#else
+ cut = arc4random_uniform(1 + high - low) + low;
+#endif
+ /* low <= cut <= high */
+ for (tmp = cut; tmp <= high; ++(tmp)) {
+ key.port[0] = htons(tmp);
+ if (pf_find_state_all(&key, PF_IN, NULL) ==
+#ifdef __FreeBSD__
+ NULL) {
+#else
+ NULL && !in_baddynamic(tmp, proto)) {
+#endif
+ *nport = htons(tmp);
+ return (0);
+ }
+ }
+ for (tmp = cut - 1; tmp >= low; --(tmp)) {
+ key.port[0] = htons(tmp);
+ if (pf_find_state_all(&key, PF_IN, NULL) ==
+#ifdef __FreeBSD__
+ NULL) {
+#else
+ NULL && !in_baddynamic(tmp, proto)) {
+#endif
+ *nport = htons(tmp);
+ return (0);
+ }
+ }
+ }
+
+ switch (r->rpool.opts & PF_POOL_TYPEMASK) {
+ case PF_POOL_RANDOM:
+ case PF_POOL_ROUNDROBIN:
+ if (pf_map_addr(af, r, saddr, naddr, &init_addr, sn))
+ return (1);
+ break;
+ case PF_POOL_NONE:
+ case PF_POOL_SRCHASH:
+ case PF_POOL_BITMASK:
+ default:
+ return (1);
+ }
+ } while (! PF_AEQ(&init_addr, naddr, af) );
+ return (1); /* none available */
+}
+
+int
+pf_map_addr(sa_family_t af, struct pf_rule *r, struct pf_addr *saddr,
+ struct pf_addr *naddr, struct pf_addr *init_addr, struct pf_src_node **sn)
+{
+ unsigned char hash[16];
+ struct pf_pool *rpool = &r->rpool;
+ struct pf_addr *raddr = &rpool->cur->addr.v.a.addr;
+ struct pf_addr *rmask = &rpool->cur->addr.v.a.mask;
+ struct pf_pooladdr *acur = rpool->cur;
+ struct pf_src_node k;
+
+ if (*sn == NULL && r->rpool.opts & PF_POOL_STICKYADDR &&
+ (r->rpool.opts & PF_POOL_TYPEMASK) != PF_POOL_NONE) {
+ k.af = af;
+ PF_ACPY(&k.addr, saddr, af);
+ if (r->rule_flag & PFRULE_RULESRCTRACK ||
+ r->rpool.opts & PF_POOL_STICKYADDR)
+ k.rule.ptr = r;
+ else
+ k.rule.ptr = NULL;
+#ifdef __FreeBSD__
+ V_pf_status.scounters[SCNT_SRC_NODE_SEARCH]++;
+ *sn = RB_FIND(pf_src_tree, &V_tree_src_tracking, &k);
+#else
+ pf_status.scounters[SCNT_SRC_NODE_SEARCH]++;
+ *sn = RB_FIND(pf_src_tree, &tree_src_tracking, &k);
+#endif
+ if (*sn != NULL && !PF_AZERO(&(*sn)->raddr, af)) {
+ PF_ACPY(naddr, &(*sn)->raddr, af);
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
+ printf("pf_map_addr: src tracking maps ");
+ pf_print_host(&k.addr, 0, af);
+ printf(" to ");
+ pf_print_host(naddr, 0, af);
+ printf("\n");
+ }
+ return (0);
+ }
+ }
+
+ if (rpool->cur->addr.type == PF_ADDR_NOROUTE)
+ return (1);
+ if (rpool->cur->addr.type == PF_ADDR_DYNIFTL) {
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ if (rpool->cur->addr.p.dyn->pfid_acnt4 < 1 &&
+ (rpool->opts & PF_POOL_TYPEMASK) !=
+ PF_POOL_ROUNDROBIN)
+ return (1);
+ raddr = &rpool->cur->addr.p.dyn->pfid_addr4;
+ rmask = &rpool->cur->addr.p.dyn->pfid_mask4;
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (rpool->cur->addr.p.dyn->pfid_acnt6 < 1 &&
+ (rpool->opts & PF_POOL_TYPEMASK) !=
+ PF_POOL_ROUNDROBIN)
+ return (1);
+ raddr = &rpool->cur->addr.p.dyn->pfid_addr6;
+ rmask = &rpool->cur->addr.p.dyn->pfid_mask6;
+ break;
+#endif /* INET6 */
+ }
+ } else if (rpool->cur->addr.type == PF_ADDR_TABLE) {
+ if ((rpool->opts & PF_POOL_TYPEMASK) != PF_POOL_ROUNDROBIN)
+ return (1); /* unsupported */
+ } else {
+ raddr = &rpool->cur->addr.v.a.addr;
+ rmask = &rpool->cur->addr.v.a.mask;
+ }
+
+ switch (rpool->opts & PF_POOL_TYPEMASK) {
+ case PF_POOL_NONE:
+ PF_ACPY(naddr, raddr, af);
+ break;
+ case PF_POOL_BITMASK:
+ PF_POOLMASK(naddr, raddr, rmask, saddr, af);
+ break;
+ case PF_POOL_RANDOM:
+ if (init_addr != NULL && PF_AZERO(init_addr, af)) {
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ rpool->counter.addr32[0] = htonl(arc4random());
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (rmask->addr32[3] != 0xffffffff)
+ rpool->counter.addr32[3] =
+ htonl(arc4random());
+ else
+ break;
+ if (rmask->addr32[2] != 0xffffffff)
+ rpool->counter.addr32[2] =
+ htonl(arc4random());
+ else
+ break;
+ if (rmask->addr32[1] != 0xffffffff)
+ rpool->counter.addr32[1] =
+ htonl(arc4random());
+ else
+ break;
+ if (rmask->addr32[0] != 0xffffffff)
+ rpool->counter.addr32[0] =
+ htonl(arc4random());
+ break;
+#endif /* INET6 */
+ }
+ PF_POOLMASK(naddr, raddr, rmask, &rpool->counter, af);
+ PF_ACPY(init_addr, naddr, af);
+
+ } else {
+ PF_AINC(&rpool->counter, af);
+ PF_POOLMASK(naddr, raddr, rmask, &rpool->counter, af);
+ }
+ break;
+ case PF_POOL_SRCHASH:
+ pf_hash(saddr, (struct pf_addr *)&hash, &rpool->key, af);
+ PF_POOLMASK(naddr, raddr, rmask, (struct pf_addr *)&hash, af);
+ break;
+ case PF_POOL_ROUNDROBIN:
+ if (rpool->cur->addr.type == PF_ADDR_TABLE) {
+ if (!pfr_pool_get(rpool->cur->addr.p.tbl,
+ &rpool->tblidx, &rpool->counter,
+ &raddr, &rmask, af))
+ goto get_addr;
+ } else if (rpool->cur->addr.type == PF_ADDR_DYNIFTL) {
+ if (!pfr_pool_get(rpool->cur->addr.p.dyn->pfid_kt,
+ &rpool->tblidx, &rpool->counter,
+ &raddr, &rmask, af))
+ goto get_addr;
+ } else if (pf_match_addr(0, raddr, rmask, &rpool->counter, af))
+ goto get_addr;
+
+ try_next:
+ if ((rpool->cur = TAILQ_NEXT(rpool->cur, entries)) == NULL)
+ rpool->cur = TAILQ_FIRST(&rpool->list);
+ if (rpool->cur->addr.type == PF_ADDR_TABLE) {
+ rpool->tblidx = -1;
+ if (pfr_pool_get(rpool->cur->addr.p.tbl,
+ &rpool->tblidx, &rpool->counter,
+ &raddr, &rmask, af)) {
+ /* table contains no address of type 'af' */
+ if (rpool->cur != acur)
+ goto try_next;
+ return (1);
+ }
+ } else if (rpool->cur->addr.type == PF_ADDR_DYNIFTL) {
+ rpool->tblidx = -1;
+ if (pfr_pool_get(rpool->cur->addr.p.dyn->pfid_kt,
+ &rpool->tblidx, &rpool->counter,
+ &raddr, &rmask, af)) {
+ /* table contains no address of type 'af' */
+ if (rpool->cur != acur)
+ goto try_next;
+ return (1);
+ }
+ } else {
+ raddr = &rpool->cur->addr.v.a.addr;
+ rmask = &rpool->cur->addr.v.a.mask;
+ PF_ACPY(&rpool->counter, raddr, af);
+ }
+
+ get_addr:
+ PF_ACPY(naddr, &rpool->counter, af);
+ if (init_addr != NULL && PF_AZERO(init_addr, af))
+ PF_ACPY(init_addr, naddr, af);
+ PF_AINC(&rpool->counter, af);
+ break;
+ }
+ if (*sn != NULL)
+ PF_ACPY(&(*sn)->raddr, naddr, af);
+
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC &&
+#else
+ if (pf_status.debug >= PF_DEBUG_MISC &&
+#endif
+ (rpool->opts & PF_POOL_TYPEMASK) != PF_POOL_NONE) {
+ printf("pf_map_addr: selected address ");
+ pf_print_host(naddr, 0, af);
+ printf("\n");
+ }
+
+ return (0);
+}
+
+struct pf_rule *
+pf_get_translation(struct pf_pdesc *pd, struct mbuf *m, int off, int direction,
+ struct pfi_kif *kif, struct pf_src_node **sn,
+ struct pf_state_key **skw, struct pf_state_key **sks,
+ struct pf_state_key **skp, struct pf_state_key **nkp,
+ struct pf_addr *saddr, struct pf_addr *daddr,
+ u_int16_t sport, u_int16_t dport)
+{
+ struct pf_rule *r = NULL;
+
+
+ if (direction == PF_OUT) {
+ r = pf_match_translation(pd, m, off, direction, kif, saddr,
+ sport, daddr, dport, PF_RULESET_BINAT);
+ if (r == NULL)
+ r = pf_match_translation(pd, m, off, direction, kif,
+ saddr, sport, daddr, dport, PF_RULESET_NAT);
+ } else {
+ r = pf_match_translation(pd, m, off, direction, kif, saddr,
+ sport, daddr, dport, PF_RULESET_RDR);
+ if (r == NULL)
+ r = pf_match_translation(pd, m, off, direction, kif,
+ saddr, sport, daddr, dport, PF_RULESET_BINAT);
+ }
+
+ if (r != NULL) {
+ struct pf_addr *naddr;
+ u_int16_t *nport;
+
+ if (pf_state_key_setup(pd, r, skw, sks, skp, nkp,
+ saddr, daddr, sport, dport))
+ return r;
+
+ /* XXX We only modify one side for now. */
+ naddr = &(*nkp)->addr[1];
+ nport = &(*nkp)->port[1];
+
+ switch (r->action) {
+ case PF_NONAT:
+ case PF_NOBINAT:
+ case PF_NORDR:
+ return (NULL);
+ case PF_NAT:
+ if (pf_get_sport(pd->af, pd->proto, r, saddr,
+ daddr, dport, naddr, nport, r->rpool.proxy_port[0],
+ r->rpool.proxy_port[1], sn)) {
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: NAT proxy port allocation "
+ "(%u-%u) failed\n",
+ r->rpool.proxy_port[0],
+ r->rpool.proxy_port[1]));
+ return (NULL);
+ }
+ break;
+ case PF_BINAT:
+ switch (direction) {
+ case PF_OUT:
+ if (r->rpool.cur->addr.type == PF_ADDR_DYNIFTL){
+ switch (pd->af) {
+#ifdef INET
+ case AF_INET:
+ if (r->rpool.cur->addr.p.dyn->
+ pfid_acnt4 < 1)
+ return (NULL);
+ PF_POOLMASK(naddr,
+ &r->rpool.cur->addr.p.dyn->
+ pfid_addr4,
+ &r->rpool.cur->addr.p.dyn->
+ pfid_mask4,
+ saddr, AF_INET);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (r->rpool.cur->addr.p.dyn->
+ pfid_acnt6 < 1)
+ return (NULL);
+ PF_POOLMASK(naddr,
+ &r->rpool.cur->addr.p.dyn->
+ pfid_addr6,
+ &r->rpool.cur->addr.p.dyn->
+ pfid_mask6,
+ saddr, AF_INET6);
+ break;
+#endif /* INET6 */
+ }
+ } else
+ PF_POOLMASK(naddr,
+ &r->rpool.cur->addr.v.a.addr,
+ &r->rpool.cur->addr.v.a.mask,
+ saddr, pd->af);
+ break;
+ case PF_IN:
+ if (r->src.addr.type == PF_ADDR_DYNIFTL) {
+ switch (pd->af) {
+#ifdef INET
+ case AF_INET:
+ if (r->src.addr.p.dyn->
+ pfid_acnt4 < 1)
+ return (NULL);
+ PF_POOLMASK(naddr,
+ &r->src.addr.p.dyn->
+ pfid_addr4,
+ &r->src.addr.p.dyn->
+ pfid_mask4,
+ daddr, AF_INET);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (r->src.addr.p.dyn->
+ pfid_acnt6 < 1)
+ return (NULL);
+ PF_POOLMASK(naddr,
+ &r->src.addr.p.dyn->
+ pfid_addr6,
+ &r->src.addr.p.dyn->
+ pfid_mask6,
+ daddr, AF_INET6);
+ break;
+#endif /* INET6 */
+ }
+ } else
+ PF_POOLMASK(naddr,
+ &r->src.addr.v.a.addr,
+ &r->src.addr.v.a.mask, daddr,
+ pd->af);
+ break;
+ }
+ break;
+ case PF_RDR: {
+ if (pf_map_addr(pd->af, r, saddr, naddr, NULL, sn))
+ return (NULL);
+ if ((r->rpool.opts & PF_POOL_TYPEMASK) ==
+ PF_POOL_BITMASK)
+ PF_POOLMASK(naddr, naddr,
+ &r->rpool.cur->addr.v.a.mask, daddr,
+ pd->af);
+
+ if (r->rpool.proxy_port[1]) {
+ u_int32_t tmp_nport;
+
+ tmp_nport = ((ntohs(dport) -
+ ntohs(r->dst.port[0])) %
+ (r->rpool.proxy_port[1] -
+ r->rpool.proxy_port[0] + 1)) +
+ r->rpool.proxy_port[0];
+
+ /* wrap around if necessary */
+ if (tmp_nport > 65535)
+ tmp_nport -= 65535;
+ *nport = htons((u_int16_t)tmp_nport);
+ } else if (r->rpool.proxy_port[0])
+ *nport = htons(r->rpool.proxy_port[0]);
+ break;
+ }
+ default:
+ return (NULL);
+ }
+ /*
+ * Translation was a NOP.
+ * Pretend there was no match.
+ */
+ if (!bcmp(*skp, *nkp, sizeof(struct pf_state_key_cmp))) {
+#ifdef __FreeBSD__
+ pool_put(&V_pf_state_key_pl, *nkp);
+ pool_put(&V_pf_state_key_pl, *skp);
+#else
+ pool_put(&pf_state_key_pl, *nkp);
+ pool_put(&pf_state_key_pl, *skp);
+#endif
+ *skw = *sks = *nkp = *skp = NULL;
+ return (NULL);
+ }
+ }
+
+ return (r);
+}
+
diff --git a/sys/contrib/pf/net/pf_mtag.h b/sys/contrib/pf/net/pf_mtag.h
index a0ebf7e..141a867 100644
--- a/sys/contrib/pf/net/pf_mtag.h
+++ b/sys/contrib/pf/net/pf_mtag.h
@@ -37,15 +37,17 @@
#define PF_TAG_GENERATED 0x01
#define PF_TAG_FRAGCACHE 0x02
#define PF_TAG_TRANSLATE_LOCALHOST 0x04
+#define PF_PACKET_LOOPED 0x08
+#define PF_FASTFWD_OURS_PRESENT 0x10
struct pf_mtag {
void *hdr; /* saved hdr pos in mbuf, for ECN */
- u_int rtableid; /* alternate routing table id */
+ void *statekey; /* pf stackside statekey */
u_int32_t qid; /* queue id */
+ u_int rtableid; /* alternate routing table id */
u_int16_t tag; /* tag id */
u_int8_t flags;
u_int8_t routed;
- sa_family_t af; /* for ECN */
};
static __inline struct pf_mtag *pf_find_mtag(struct mbuf *);
diff --git a/sys/contrib/pf/net/pf_norm.c b/sys/contrib/pf/net/pf_norm.c
index cd6d65a..6c04eee 100644
--- a/sys/contrib/pf/net/pf_norm.c
+++ b/sys/contrib/pf/net/pf_norm.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_norm.c,v 1.107 2006/04/16 00:59:52 pascoe Exp $ */
+/* $OpenBSD: pf_norm.c,v 1.114 2009/01/29 14:11:45 henning Exp $ */
/*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
@@ -34,9 +34,9 @@
__FBSDID("$FreeBSD$");
#ifdef DEV_PFLOG
-#define NPFLOG DEV_PFLOG
+#define NPFLOG DEV_PFLOG
#else
-#define NPFLOG 0
+#define NPFLOG 0
#endif
#else
#include "pflog.h"
@@ -78,8 +78,6 @@ __FBSDID("$FreeBSD$");
#include <net/pfvar.h>
#ifndef __FreeBSD__
-#include <inttypes.h>
-
struct pf_frent {
LIST_ENTRY(pf_frent) fr_next;
struct ip *fr_ip;
@@ -118,17 +116,35 @@ struct pf_fragment {
};
#endif
+#ifdef __FreeBSD__
+TAILQ_HEAD(pf_fragqueue, pf_fragment);
+TAILQ_HEAD(pf_cachequeue, pf_fragment);
+VNET_DEFINE(struct pf_fragqueue, pf_fragqueue);
+#define V_pf_fragqueue VNET(pf_fragqueue)
+VNET_DEFINE(struct pf_cachequeue, pf_cachequeue);
+#define V_pf_cachequeue VNET(pf_cachequeue)
+#else
TAILQ_HEAD(pf_fragqueue, pf_fragment) pf_fragqueue;
TAILQ_HEAD(pf_cachequeue, pf_fragment) pf_cachequeue;
+#endif
#ifndef __FreeBSD__
static __inline int pf_frag_compare(struct pf_fragment *,
struct pf_fragment *);
#else
-static int pf_frag_compare(struct pf_fragment *,
+static int pf_frag_compare(struct pf_fragment *,
struct pf_fragment *);
#endif
+
+#ifdef __FreeBSD__
+RB_HEAD(pf_frag_tree, pf_fragment);
+VNET_DEFINE(struct pf_frag_tree, pf_frag_tree);
+#define V_pf_frag_tree VNET(pf_frag_tree)
+VNET_DEFINE(struct pf_frag_tree, pf_cache_tree);
+#define V_pf_cache_tree VNET(pf_cache_tree)
+#else
RB_HEAD(pf_frag_tree, pf_fragment) pf_frag_tree, pf_cache_tree;
+#endif
RB_PROTOTYPE(pf_frag_tree, pf_fragment, fr_entry, pf_frag_compare);
RB_GENERATE(pf_frag_tree, pf_fragment, fr_entry, pf_frag_compare);
@@ -143,24 +159,45 @@ struct mbuf *pf_reassemble(struct mbuf **, struct pf_fragment **,
struct mbuf *pf_fragcache(struct mbuf **, struct ip*,
struct pf_fragment **, int, int, int *);
int pf_normalize_tcpopt(struct pf_rule *, struct mbuf *,
- struct tcphdr *, int);
-
+ struct tcphdr *, int, sa_family_t);
+void pf_scrub_ip(struct mbuf **, u_int32_t, u_int8_t,
+ u_int8_t);
+#ifdef INET6
+void pf_scrub_ip6(struct mbuf **, u_int8_t);
+#endif
+#ifdef __FreeBSD__
+#define DPFPRINTF(x) do { \
+ if (V_pf_status.debug >= PF_DEBUG_MISC) { \
+ printf("%s: ", __func__); \
+ printf x ; \
+ } \
+} while(0)
+#else
#define DPFPRINTF(x) do { \
if (pf_status.debug >= PF_DEBUG_MISC) { \
printf("%s: ", __func__); \
printf x ; \
} \
} while(0)
+#endif
/* Globals */
#ifdef __FreeBSD__
-uma_zone_t pf_frent_pl, pf_frag_pl, pf_cache_pl, pf_cent_pl;
-uma_zone_t pf_state_scrub_pl;
+VNET_DEFINE(uma_zone_t, pf_frent_pl);
+VNET_DEFINE(uma_zone_t, pf_frag_pl);
+VNET_DEFINE(uma_zone_t, pf_cache_pl);
+VNET_DEFINE(uma_zone_t, pf_cent_pl);
+VNET_DEFINE(uma_zone_t, pf_state_scrub_pl);
+
+VNET_DEFINE(int, pf_nfrents);
+#define V_pf_nfrents VNET(pf_nfrents)
+VNET_DEFINE(int, pf_ncache);
+#define V_pf_ncache VNET(pf_ncache)
#else
struct pool pf_frent_pl, pf_frag_pl, pf_cache_pl, pf_cent_pl;
struct pool pf_state_scrub_pl;
-#endif
int pf_nfrents, pf_ncache;
+#endif
void
pf_normalize_init(void)
@@ -171,9 +208,9 @@ pf_normalize_init(void)
* No high water mark support(It's hint not hard limit).
* uma_zone_set_max(pf_frag_pl, PFFRAG_FRAG_HIWAT);
*/
- uma_zone_set_max(pf_frent_pl, PFFRAG_FRENT_HIWAT);
- uma_zone_set_max(pf_cache_pl, PFFRAG_FRCACHE_HIWAT);
- uma_zone_set_max(pf_cent_pl, PFFRAG_FRCENT_HIWAT);
+ uma_zone_set_max(V_pf_frent_pl, PFFRAG_FRENT_HIWAT);
+ uma_zone_set_max(V_pf_cache_pl, PFFRAG_FRCACHE_HIWAT);
+ uma_zone_set_max(V_pf_cent_pl, PFFRAG_FRCENT_HIWAT);
#else
pool_init(&pf_frent_pl, sizeof(struct pf_frent), 0, 0, 0, "pffrent",
NULL);
@@ -192,8 +229,13 @@ pf_normalize_init(void)
pool_sethardlimit(&pf_cent_pl, PFFRAG_FRCENT_HIWAT, NULL, 0);
#endif
+#ifdef __FreeBSD__
+ TAILQ_INIT(&V_pf_fragqueue);
+ TAILQ_INIT(&V_pf_cachequeue);
+#else
TAILQ_INIT(&pf_fragqueue);
TAILQ_INIT(&pf_cachequeue);
+#endif
}
#ifdef __FreeBSD__
@@ -224,14 +266,20 @@ void
pf_purge_expired_fragments(void)
{
struct pf_fragment *frag;
+#ifdef __FreeBSD__
+ u_int32_t expire = time_second -
+ V_pf_default_rule.timeout[PFTM_FRAG];
+#else
u_int32_t expire = time_second -
pf_default_rule.timeout[PFTM_FRAG];
+#endif
- while ((frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue)) != NULL) {
#ifdef __FreeBSD__
+ while ((frag = TAILQ_LAST(&V_pf_fragqueue, pf_fragqueue)) != NULL) {
KASSERT((BUFFER_FRAGMENTS(frag)),
- ("BUFFER_FRAGMENTS(frag) == 0: %s", __FUNCTION__));
+ ("BUFFER_FRAGMENTS(frag) == 0: %s", __FUNCTION__));
#else
+ while ((frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue)) != NULL) {
KASSERT(BUFFER_FRAGMENTS(frag));
#endif
if (frag->fr_timeout > expire)
@@ -241,11 +289,12 @@ pf_purge_expired_fragments(void)
pf_free_fragment(frag);
}
- while ((frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue)) != NULL) {
#ifdef __FreeBSD__
+ while ((frag = TAILQ_LAST(&V_pf_cachequeue, pf_cachequeue)) != NULL) {
KASSERT((!BUFFER_FRAGMENTS(frag)),
- ("BUFFER_FRAGMENTS(frag) != 0: %s", __FUNCTION__));
+ ("BUFFER_FRAGMENTS(frag) != 0: %s", __FUNCTION__));
#else
+ while ((frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue)) != NULL) {
KASSERT(!BUFFER_FRAGMENTS(frag));
#endif
if (frag->fr_timeout > expire)
@@ -254,8 +303,8 @@ pf_purge_expired_fragments(void)
DPFPRINTF(("expiring %d(%p)\n", frag->fr_id, frag));
pf_free_fragment(frag);
#ifdef __FreeBSD__
- KASSERT((TAILQ_EMPTY(&pf_cachequeue) ||
- TAILQ_LAST(&pf_cachequeue, pf_cachequeue) != frag),
+ KASSERT((TAILQ_EMPTY(&V_pf_cachequeue) ||
+ TAILQ_LAST(&V_pf_cachequeue, pf_cachequeue) != frag),
("!(TAILQ_EMPTY() || TAILQ_LAST() == farg): %s",
__FUNCTION__));
#else
@@ -275,22 +324,44 @@ pf_flush_fragments(void)
struct pf_fragment *frag;
int goal;
+#ifdef __FreeBSD__
+ goal = V_pf_nfrents * 9 / 10;
+ DPFPRINTF(("trying to free > %d frents\n",
+ V_pf_nfrents - goal));
+ while (goal < V_pf_nfrents) {
+#else
goal = pf_nfrents * 9 / 10;
DPFPRINTF(("trying to free > %d frents\n",
pf_nfrents - goal));
while (goal < pf_nfrents) {
+#endif
+#ifdef __FreeBSD__
+ frag = TAILQ_LAST(&V_pf_fragqueue, pf_fragqueue);
+#else
frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue);
+#endif
if (frag == NULL)
break;
pf_free_fragment(frag);
}
+#ifdef __FreeBSD__
+ goal = V_pf_ncache * 9 / 10;
+ DPFPRINTF(("trying to free > %d cache entries\n",
+ V_pf_ncache - goal));
+ while (goal < V_pf_ncache) {
+#else
goal = pf_ncache * 9 / 10;
DPFPRINTF(("trying to free > %d cache entries\n",
pf_ncache - goal));
while (goal < pf_ncache) {
+#endif
+#ifdef __FreeBSD__
+ frag = TAILQ_LAST(&V_pf_cachequeue, pf_cachequeue);
+#else
frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue);
+#endif
if (frag == NULL)
break;
pf_free_fragment(frag);
@@ -312,8 +383,13 @@ pf_free_fragment(struct pf_fragment *frag)
LIST_REMOVE(frent, fr_next);
m_freem(frent->fr_m);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_frent_pl, frent);
+ V_pf_nfrents--;
+#else
pool_put(&pf_frent_pl, frent);
pf_nfrents--;
+#endif
}
} else {
for (frcache = LIST_FIRST(&frag->fr_cache); frcache;
@@ -325,15 +401,18 @@ pf_free_fragment(struct pf_fragment *frag)
LIST_FIRST(&frag->fr_cache)->fr_off >
frcache->fr_end),
("! (LIST_EMPTY() || LIST_FIRST()->fr_off >"
- " frcache->fr_end): %s", __FUNCTION__));
+ " frcache->fr_end): %s", __FUNCTION__));
+
+ pool_put(&V_pf_cent_pl, frcache);
+ V_pf_ncache--;
#else
KASSERT(LIST_EMPTY(&frag->fr_cache) ||
LIST_FIRST(&frag->fr_cache)->fr_off >
frcache->fr_end);
-#endif
pool_put(&pf_cent_pl, frcache);
pf_ncache--;
+#endif
}
}
@@ -362,11 +441,21 @@ pf_find_fragment(struct ip *ip, struct pf_frag_tree *tree)
/* XXX Are we sure we want to update the timeout? */
frag->fr_timeout = time_second;
if (BUFFER_FRAGMENTS(frag)) {
+#ifdef __FreeBSD__
+ TAILQ_REMOVE(&V_pf_fragqueue, frag, frag_next);
+ TAILQ_INSERT_HEAD(&V_pf_fragqueue, frag, frag_next);
+#else
TAILQ_REMOVE(&pf_fragqueue, frag, frag_next);
TAILQ_INSERT_HEAD(&pf_fragqueue, frag, frag_next);
+#endif
} else {
+#ifdef __FreeBSD__
+ TAILQ_REMOVE(&V_pf_cachequeue, frag, frag_next);
+ TAILQ_INSERT_HEAD(&V_pf_cachequeue, frag, frag_next);
+#else
TAILQ_REMOVE(&pf_cachequeue, frag, frag_next);
TAILQ_INSERT_HEAD(&pf_cachequeue, frag, frag_next);
+#endif
}
}
@@ -379,13 +468,25 @@ void
pf_remove_fragment(struct pf_fragment *frag)
{
if (BUFFER_FRAGMENTS(frag)) {
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_frag_tree, &V_pf_frag_tree, frag);
+ TAILQ_REMOVE(&V_pf_fragqueue, frag, frag_next);
+ pool_put(&V_pf_frag_pl, frag);
+#else
RB_REMOVE(pf_frag_tree, &pf_frag_tree, frag);
TAILQ_REMOVE(&pf_fragqueue, frag, frag_next);
pool_put(&pf_frag_pl, frag);
+#endif
} else {
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_frag_tree, &V_pf_cache_tree, frag);
+ TAILQ_REMOVE(&V_pf_cachequeue, frag, frag_next);
+ pool_put(&V_pf_cache_pl, frag);
+#else
RB_REMOVE(pf_frag_tree, &pf_cache_tree, frag);
TAILQ_REMOVE(&pf_cachequeue, frag, frag_next);
pool_put(&pf_cache_pl, frag);
+#endif
}
}
@@ -416,10 +517,18 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
/* Create a new reassembly queue for this packet */
if (*frag == NULL) {
+#ifdef __FreeBSD__
+ *frag = pool_get(&V_pf_frag_pl, PR_NOWAIT);
+#else
*frag = pool_get(&pf_frag_pl, PR_NOWAIT);
+#endif
if (*frag == NULL) {
pf_flush_fragments();
+#ifdef __FreeBSD__
+ *frag = pool_get(&V_pf_frag_pl, PR_NOWAIT);
+#else
*frag = pool_get(&pf_frag_pl, PR_NOWAIT);
+#endif
if (*frag == NULL)
goto drop_fragment;
}
@@ -433,8 +542,13 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
(*frag)->fr_timeout = time_second;
LIST_INIT(&(*frag)->fr_queue);
+#ifdef __FreeBSD__
+ RB_INSERT(pf_frag_tree, &V_pf_frag_tree, *frag);
+ TAILQ_INSERT_HEAD(&V_pf_fragqueue, *frag, frag_next);
+#else
RB_INSERT(pf_frag_tree, &pf_frag_tree, *frag);
TAILQ_INSERT_HEAD(&pf_fragqueue, *frag, frag_next);
+#endif
/* We do not have a previous fragment */
frep = NULL;
@@ -499,8 +613,13 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
next = LIST_NEXT(frea, fr_next);
m_freem(frea->fr_m);
LIST_REMOVE(frea, fr_next);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_frent_pl, frea);
+ V_pf_nfrents--;
+#else
pool_put(&pf_frent_pl, frea);
pf_nfrents--;
+#endif
}
insert:
@@ -560,26 +679,36 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
m2 = m->m_next;
m->m_next = NULL;
m_cat(m, m2);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_frent_pl, frent);
+ V_pf_nfrents--;
+#else
pool_put(&pf_frent_pl, frent);
pf_nfrents--;
+#endif
for (frent = next; frent != NULL; frent = next) {
next = LIST_NEXT(frent, fr_next);
m2 = frent->fr_m;
+#ifdef __FreeBSD__
+ pool_put(&V_pf_frent_pl, frent);
+ V_pf_nfrents--;
+#else
pool_put(&pf_frent_pl, frent);
pf_nfrents--;
+#endif
#ifdef __FreeBSD__
m->m_pkthdr.csum_flags &= m2->m_pkthdr.csum_flags;
m->m_pkthdr.csum_data += m2->m_pkthdr.csum_data;
#endif
m_cat(m, m2);
}
+
#ifdef __FreeBSD__
while (m->m_pkthdr.csum_data & 0xffff0000)
m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) +
(m->m_pkthdr.csum_data >> 16);
#endif
-
ip->ip_src = (*frag)->fr_src;
ip->ip_dst = (*frag)->fr_dst;
@@ -606,8 +735,13 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
drop_fragment:
/* Oops - fail safe - drop packet */
+#ifdef __FreeBSD__
+ pool_put(&V_pf_frent_pl, frent);
+ V_pf_nfrents--;
+#else
pool_put(&pf_frent_pl, frent);
pf_nfrents--;
+#endif
m_freem(m);
return (NULL);
}
@@ -632,22 +766,40 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
/* Create a new range queue for this packet */
if (*frag == NULL) {
+#ifdef __FreeBSD__
+ *frag = pool_get(&V_pf_cache_pl, PR_NOWAIT);
+#else
*frag = pool_get(&pf_cache_pl, PR_NOWAIT);
+#endif
if (*frag == NULL) {
pf_flush_fragments();
+#ifdef __FreeBSD__
+ *frag = pool_get(&V_pf_cache_pl, PR_NOWAIT);
+#else
*frag = pool_get(&pf_cache_pl, PR_NOWAIT);
+#endif
if (*frag == NULL)
goto no_mem;
}
/* Get an entry for the queue */
+#ifdef __FreeBSD__
+ cur = pool_get(&V_pf_cent_pl, PR_NOWAIT);
+ if (cur == NULL) {
+ pool_put(&V_pf_cache_pl, *frag);
+#else
cur = pool_get(&pf_cent_pl, PR_NOWAIT);
if (cur == NULL) {
pool_put(&pf_cache_pl, *frag);
+#endif
*frag = NULL;
goto no_mem;
}
+#ifdef __FreeBSD__
+ V_pf_ncache++;
+#else
pf_ncache++;
+#endif
(*frag)->fr_flags = PFFRAG_NOBUFFER;
(*frag)->fr_max = 0;
@@ -662,8 +814,13 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
LIST_INIT(&(*frag)->fr_cache);
LIST_INSERT_HEAD(&(*frag)->fr_cache, cur, fr_next);
+#ifdef __FreeBSD__
+ RB_INSERT(pf_frag_tree, &V_pf_cache_tree, *frag);
+ TAILQ_INSERT_HEAD(&V_pf_cachequeue, *frag, frag_next);
+#else
RB_INSERT(pf_frag_tree, &pf_cache_tree, *frag);
TAILQ_INSERT_HEAD(&pf_cachequeue, *frag, frag_next);
+#endif
DPFPRINTF(("fragcache[%d]: new %d-%d\n", h->ip_id, off, max));
@@ -782,10 +939,18 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
h->ip_id, -precut, frp->fr_off, frp->fr_end, off,
max));
+#ifdef __FreeBSD__
+ cur = pool_get(&V_pf_cent_pl, PR_NOWAIT);
+#else
cur = pool_get(&pf_cent_pl, PR_NOWAIT);
+#endif
if (cur == NULL)
goto no_mem;
+#ifdef __FreeBSD__
+ V_pf_ncache++;
+#else
pf_ncache++;
+#endif
cur->fr_off = off;
cur->fr_end = max;
@@ -842,10 +1007,18 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
h->ip_id, -aftercut, off, max, fra->fr_off,
fra->fr_end));
+#ifdef __FreeBSD__
+ cur = pool_get(&V_pf_cent_pl, PR_NOWAIT);
+#else
cur = pool_get(&pf_cent_pl, PR_NOWAIT);
+#endif
if (cur == NULL)
goto no_mem;
+#ifdef __FreeBSD__
+ V_pf_ncache++;
+#else
pf_ncache++;
+#endif
cur->fr_off = off;
cur->fr_end = max;
@@ -863,8 +1036,13 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
max, fra->fr_off, fra->fr_end));
fra->fr_off = cur->fr_off;
LIST_REMOVE(cur, fr_next);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_cent_pl, cur);
+ V_pf_ncache--;
+#else
pool_put(&pf_cent_pl, cur);
pf_ncache--;
+#endif
cur = NULL;
} else if (frp && fra->fr_off <= frp->fr_end) {
@@ -881,8 +1059,13 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
max, fra->fr_off, fra->fr_end));
fra->fr_off = frp->fr_off;
LIST_REMOVE(frp, fr_next);
+#ifdef __FreeBSD__
+ pool_put(&V_pf_cent_pl, frp);
+ V_pf_ncache--;
+#else
pool_put(&pf_cent_pl, frp);
pf_ncache--;
+#endif
frp = NULL;
}
@@ -965,6 +1148,7 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
u_int16_t max;
int ip_len;
int ip_off;
+ int tag = -1;
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_SCRUB].active.ptr);
while (r != NULL) {
@@ -985,6 +1169,12 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
(struct pf_addr *)&h->ip_dst.s_addr, AF_INET,
r->dst.neg, NULL))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
+#ifdef __FreeBSD__
+ else if (r->match_tag && !pf_match_tag(m, r, &tag, pd->pf_mtag))
+#else
+ else if (r->match_tag && !pf_match_tag(m, r, &tag))
+#endif
+ r = TAILQ_NEXT(r, entries);
else
break;
}
@@ -1043,7 +1233,11 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
if ((r->rule_flag & (PFRULE_FRAGCROP|PFRULE_FRAGDROP)) == 0) {
/* Fully buffer all of the fragments */
+#ifdef __FreeBSD__
+ frag = pf_find_fragment(h, &V_pf_frag_tree);
+#else
frag = pf_find_fragment(h, &pf_frag_tree);
+#endif
/* Check if we saw the last fragment already */
if (frag != NULL && (frag->fr_flags & PFFRAG_SEENLAST) &&
@@ -1051,12 +1245,20 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
goto bad;
/* Get an entry for the fragment queue */
+#ifdef __FreeBSD__
+ frent = pool_get(&V_pf_frent_pl, PR_NOWAIT);
+#else
frent = pool_get(&pf_frent_pl, PR_NOWAIT);
+#endif
if (frent == NULL) {
REASON_SET(reason, PFRES_MEMORY);
return (PF_DROP);
}
+#ifdef __FreeBSD__
+ V_pf_nfrents++;
+#else
pf_nfrents++;
+#endif
frent->fr_ip = h;
frent->fr_m = m;
@@ -1087,7 +1289,11 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
/* non-buffering fragment cache (drops or masks overlaps) */
int nomem = 0;
+#ifdef __FreeBSD__
if (dir == PF_OUT && pd->pf_mtag->flags & PF_TAG_FRAGCACHE) {
+#else
+ if (dir == PF_OUT && m->m_pkthdr.pf.flags & PF_TAG_FRAGCACHE) {
+#endif
/*
* Already passed the fragment cache in the
* input direction. If we continued, it would
@@ -1096,7 +1302,11 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
goto fragment_pass;
}
+#ifdef __FreeBSD__
+ frag = pf_find_fragment(h, &V_pf_cache_tree);
+#else
frag = pf_find_fragment(h, &pf_cache_tree);
+#endif
/* Check if we saw the last fragment already */
if (frag != NULL && (frag->fr_flags & PFFRAG_SEENLAST) &&
@@ -1127,7 +1337,11 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
}
#endif
if (dir == PF_IN)
+#ifdef __FreeBSD__
pd->pf_mtag->flags |= PF_TAG_FRAGCACHE;
+#else
+ m->m_pkthdr.pf.flags |= PF_TAG_FRAGCACHE;
+#endif
if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
goto drop;
@@ -1143,33 +1357,11 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_off, h->ip_off, 0);
}
- /* Enforce a minimum ttl, may cause endless packet loops */
- if (r->min_ttl && h->ip_ttl < r->min_ttl) {
- u_int16_t ip_ttl = h->ip_ttl;
-
- h->ip_ttl = r->min_ttl;
- h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_ttl, h->ip_ttl, 0);
- }
-
- if (r->rule_flag & PFRULE_RANDOMID) {
- u_int16_t ip_id = h->ip_id;
-
- h->ip_id = ip_randomid();
- h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_id, h->ip_id, 0);
- }
- if ((r->rule_flag & (PFRULE_FRAGCROP|PFRULE_FRAGDROP)) == 0)
- pd->flags |= PFDESC_IP_REAS;
-
- return (PF_PASS);
+ /* not missing a return here */
fragment_pass:
- /* Enforce a minimum ttl, may cause endless packet loops */
- if (r->min_ttl && h->ip_ttl < r->min_ttl) {
- u_int16_t ip_ttl = h->ip_ttl;
+ pf_scrub_ip(&m, r->rule_flag, r->min_ttl, r->set_tos);
- h->ip_ttl = r->min_ttl;
- h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_ttl, h->ip_ttl, 0);
- }
if ((r->rule_flag & (PFRULE_FRAGCROP|PFRULE_FRAGDROP)) == 0)
pd->flags |= PFDESC_IP_REAS;
return (PF_PASS);
@@ -1339,9 +1531,7 @@ pf_normalize_ip6(struct mbuf **m0, int dir, struct pfi_kif *kif,
if (sizeof(struct ip6_hdr) + plen > m->m_pkthdr.len)
goto shortpkt;
- /* Enforce a minimum ttl, may cause endless packet loops */
- if (r->min_ttl && h->ip6_hlim < r->min_ttl)
- h->ip6_hlim = r->min_ttl;
+ pf_scrub_ip6(&m, r->min_ttl);
return (PF_PASS);
@@ -1479,12 +1669,16 @@ pf_normalize_tcp(int dir, struct pfi_kif *kif, struct mbuf *m, int ipoff,
}
/* Process options */
- if (r->max_mss && pf_normalize_tcpopt(r, m, th, off))
+ if (r->max_mss && pf_normalize_tcpopt(r, m, th, off, pd->af))
rewrite = 1;
/* copy back packet headers if we sanitized */
if (rewrite)
+#ifdef __FreeBSD__
m_copyback(m, off, sizeof(*th), (caddr_t)th);
+#else
+ m_copyback(m, off, sizeof(*th), th);
+#endif
return (PF_PASS);
@@ -1506,11 +1700,13 @@ pf_normalize_tcp_init(struct mbuf *m, int off, struct pf_pdesc *pd,
#ifdef __FreeBSD__
KASSERT((src->scrub == NULL),
("pf_normalize_tcp_init: src->scrub != NULL"));
+
+ src->scrub = pool_get(&V_pf_state_scrub_pl, PR_NOWAIT);
#else
KASSERT(src->scrub == NULL);
-#endif
src->scrub = pool_get(&pf_state_scrub_pl, PR_NOWAIT);
+#endif
if (src->scrub == NULL)
return (1);
bzero(src->scrub, sizeof(*src->scrub));
@@ -1586,10 +1782,17 @@ pf_normalize_tcp_init(struct mbuf *m, int off, struct pf_pdesc *pd,
void
pf_normalize_tcp_cleanup(struct pf_state *state)
{
+#ifdef __FreeBSD__
+ if (state->src.scrub)
+ pool_put(&V_pf_state_scrub_pl, state->src.scrub);
+ if (state->dst.scrub)
+ pool_put(&V_pf_state_scrub_pl, state->dst.scrub);
+#else
if (state->src.scrub)
pool_put(&pf_state_scrub_pl, state->src.scrub);
if (state->dst.scrub)
pool_put(&pf_state_scrub_pl, state->dst.scrub);
+#endif
/* Someday... flush the TCP segment reassembly descriptors. */
}
@@ -1667,7 +1870,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
if (got_ts) {
/* Huh? Multiple timestamps!? */
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
DPFPRINTF(("multiple TS??"));
pf_print_state(state);
printf("\n");
@@ -1736,7 +1943,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
if (src->scrub && (src->scrub->pfss_flags & PFSS_PAWS) &&
(uptime.tv_sec - src->scrub->pfss_last.tv_sec > TS_MAX_IDLE ||
time_second - state->creation > TS_MAX_CONN)) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
DPFPRINTF(("src idled out of PAWS\n"));
pf_print_state(state);
printf("\n");
@@ -1746,7 +1957,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
}
if (dst->scrub && (dst->scrub->pfss_flags & PFSS_PAWS) &&
uptime.tv_sec - dst->scrub->pfss_last.tv_sec > TS_MAX_IDLE) {
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
DPFPRINTF(("dst idled out of PAWS\n"));
pf_print_state(state);
printf("\n");
@@ -1807,7 +2022,7 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
* network conditions that re-order packets and
* cause our view of them to decrease. For now the
* only lowerbound we can safely determine is that
- * the TS echo will never be less than the orginal
+ * the TS echo will never be less than the original
* TS. XXX There is probably a better lowerbound.
* Remove TS_MAX_CONN with better lowerbound check.
* tescr >= other original TS
@@ -1830,7 +2045,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
* this packet.
*/
if ((ts_fudge = state->rule.ptr->timeout[PFTM_TS_DIFF]) == 0)
+#ifdef __FreeBSD__
+ ts_fudge = V_pf_default_rule.timeout[PFTM_TS_DIFF];
+#else
ts_fudge = pf_default_rule.timeout[PFTM_TS_DIFF];
+#endif
/* Calculate max ticks since the last timestamp */
@@ -1838,7 +2057,7 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
#define TS_MICROSECS 1000000 /* microseconds per second */
#ifdef __FreeBSD__
#ifndef timersub
-#define timersub(tvp, uvp, vvp) \
+#define timersub(tvp, uvp, vvp) \
do { \
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
@@ -1895,7 +2114,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
"\n", dst->scrub->pfss_tsval,
dst->scrub->pfss_tsecr, dst->scrub->pfss_tsval0));
#endif
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
pf_print_state(state);
pf_print_flags(th->th_flags);
printf("\n");
@@ -1943,7 +2166,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
* Hey! Someone tried to sneak a packet in. Or the
* stack changed its RFC1323 behavior?!?!
*/
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC) {
+#else
if (pf_status.debug >= PF_DEBUG_MISC) {
+#endif
DPFPRINTF(("Did not receive expected RFC1323 "
"timestamp\n"));
pf_print_state(state);
@@ -1970,7 +2197,11 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
src->scrub->pfss_flags |= PFSS_DATA_TS;
else {
src->scrub->pfss_flags |= PFSS_DATA_NOTS;
+#ifdef __FreeBSD__
+ if (V_pf_status.debug >= PF_DEBUG_MISC && dst->scrub &&
+#else
if (pf_status.debug >= PF_DEBUG_MISC && dst->scrub &&
+#endif
(dst->scrub->pfss_flags & PFSS_TIMESTAMP)) {
/* Don't warn if other host rejected RFC1323 */
DPFPRINTF(("Broken RFC1323 stack did not "
@@ -2018,17 +2249,25 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
int
pf_normalize_tcpopt(struct pf_rule *r, struct mbuf *m, struct tcphdr *th,
- int off)
+ int off, sa_family_t af)
{
u_int16_t *mss;
int thoff;
int opt, cnt, optlen = 0;
int rewrite = 0;
- u_char *optp;
+#ifdef __FreeBSD__
+ u_char opts[TCP_MAXOLEN];
+#else
+ u_char opts[MAX_TCPOPTLEN];
+#endif
+ u_char *optp = opts;
thoff = th->th_off << 2;
cnt = thoff - sizeof(struct tcphdr);
- optp = mtod(m, caddr_t) + off + sizeof(struct tcphdr);
+
+ if (cnt > 0 && !pf_pull_hdr(m, off + sizeof(*th), opts, cnt,
+ NULL, NULL, af))
+ return (rewrite);
for (; cnt > 0; cnt -= optlen, optp += optlen) {
opt = optp[0];
@@ -2058,5 +2297,63 @@ pf_normalize_tcpopt(struct pf_rule *r, struct mbuf *m, struct tcphdr *th,
}
}
+ if (rewrite)
+ m_copyback(m, off + sizeof(*th), thoff - sizeof(*th), opts);
+
return (rewrite);
}
+
+void
+pf_scrub_ip(struct mbuf **m0, u_int32_t flags, u_int8_t min_ttl, u_int8_t tos)
+{
+ struct mbuf *m = *m0;
+ struct ip *h = mtod(m, struct ip *);
+
+ /* Clear IP_DF if no-df was requested */
+ if (flags & PFRULE_NODF && h->ip_off & htons(IP_DF)) {
+ u_int16_t ip_off = h->ip_off;
+
+ h->ip_off &= htons(~IP_DF);
+ h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_off, h->ip_off, 0);
+ }
+
+ /* Enforce a minimum ttl, may cause endless packet loops */
+ if (min_ttl && h->ip_ttl < min_ttl) {
+ u_int16_t ip_ttl = h->ip_ttl;
+
+ h->ip_ttl = min_ttl;
+ h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_ttl, h->ip_ttl, 0);
+ }
+
+ /* Enforce tos */
+ if (flags & PFRULE_SET_TOS) {
+ u_int16_t ov, nv;
+
+ ov = *(u_int16_t *)h;
+ h->ip_tos = tos;
+ nv = *(u_int16_t *)h;
+
+ h->ip_sum = pf_cksum_fixup(h->ip_sum, ov, nv, 0);
+ }
+
+ /* random-id, but not for fragments */
+ if (flags & PFRULE_RANDOMID && !(h->ip_off & ~htons(IP_DF))) {
+ u_int16_t ip_id = h->ip_id;
+
+ h->ip_id = ip_randomid();
+ h->ip_sum = pf_cksum_fixup(h->ip_sum, ip_id, h->ip_id, 0);
+ }
+}
+
+#ifdef INET6
+void
+pf_scrub_ip6(struct mbuf **m0, u_int8_t min_ttl)
+{
+ struct mbuf *m = *m0;
+ struct ip6_hdr *h = mtod(m, struct ip6_hdr *);
+
+ /* Enforce a minimum ttl, may cause endless packet loops */
+ if (min_ttl && h->ip6_hlim < min_ttl)
+ h->ip6_hlim = min_ttl;
+}
+#endif
diff --git a/sys/contrib/pf/net/pf_osfp.c b/sys/contrib/pf/net/pf_osfp.c
index 225528d..dcd8af7 100644
--- a/sys/contrib/pf/net/pf_osfp.c
+++ b/sys/contrib/pf/net/pf_osfp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_osfp.c,v 1.12 2006/12/13 18:14:10 itojun Exp $ */
+/* $OpenBSD: pf_osfp.c,v 1.14 2008/06/12 18:17:01 henning Exp $ */
/*
* Copyright (c) 2003 Mike Frantzen <frantzen@w4g.org>
@@ -25,7 +25,10 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/socket.h>
#ifdef _KERNEL
-# include <sys/systm.h>
+#include <sys/systm.h>
+#ifndef __FreeBSD__
+#include <sys/pool.h>
+#endif
#endif /* _KERNEL */
#include <sys/mbuf.h>
@@ -42,10 +45,17 @@ __FBSDID("$FreeBSD$");
#include <netinet6/in6_var.h>
#endif
+
#ifdef _KERNEL
-# define DPFPRINTF(format, x...) \
+#ifdef __FreeBSD__
+#define DPFPRINTF(format, x...) \
+ if (V_pf_status.debug >= PF_DEBUG_NOISY) \
+ printf(format , ##x)
+#else
+#define DPFPRINTF(format, x...) \
if (pf_status.debug >= PF_DEBUG_NOISY) \
printf(format , ##x)
+#endif
#ifdef __FreeBSD__
typedef uma_zone_t pool_t;
#else
@@ -55,33 +65,43 @@ typedef struct pool pool_t;
#else
/* Userland equivalents so we can lend code to tcpdump et al. */
-# include <arpa/inet.h>
-# include <errno.h>
-# include <stdio.h>
-# include <stdlib.h>
-# include <string.h>
-# include <netdb.h>
-# define pool_t int
-# define pool_get(pool, flags) malloc(*(pool))
-# define pool_put(pool, item) free(item)
-# define pool_init(pool, size, a, ao, f, m, p) (*(pool)) = (size)
-
-# ifdef __FreeBSD__
-# define NTOHS(x) (x) = ntohs((u_int16_t)(x))
-# endif
-
-# ifdef PFDEBUG
-# include <sys/stdarg.h>
-# define DPFPRINTF(format, x...) fprintf(stderr, format , ##x)
-# else
-# define DPFPRINTF(format, x...) ((void)0)
-# endif /* PFDEBUG */
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+#define pool_t int
+#define pool_get(pool, flags) malloc(*(pool))
+#define pool_put(pool, item) free(item)
+#define pool_init(pool, size, a, ao, f, m, p) (*(pool)) = (size)
+
+#ifdef __FreeBSD__
+#define NTOHS(x) (x) = ntohs((u_int16_t)(x))
+#endif
+
+#ifdef PFDEBUG
+#include <sys/stdarg.h>
+#define DPFPRINTF(format, x...) fprintf(stderr, format , ##x)
+#else
+#define DPFPRINTF(format, x...) ((void)0)
+#endif /* PFDEBUG */
#endif /* _KERNEL */
+#ifdef __FreeBSD__
+SLIST_HEAD(pf_osfp_list, pf_os_fingerprint);
+VNET_DEFINE(struct pf_osfp_list, pf_osfp_list);
+#define V_pf_osfp_list VNET(pf_osfp_list)
+VNET_DEFINE(pool_t, pf_osfp_entry_pl);
+#define pf_osfp_entry_pl VNET(pf_osfp_entry_pl)
+VNET_DEFINE(pool_t, pf_osfp_pl);
+#define pf_osfp_pl VNET(pf_osfp_pl)
+#else
SLIST_HEAD(pf_osfp_list, pf_os_fingerprint) pf_osfp_list;
pool_t pf_osfp_entry_pl;
pool_t pf_osfp_pl;
+#endif
struct pf_os_fingerprint *pf_osfp_find(struct pf_osfp_list *,
struct pf_os_fingerprint *, u_int8_t);
@@ -264,7 +284,11 @@ pf_osfp_fingerprint_hdr(const struct ip *ip, const struct ip6_hdr *ip6, const st
(fp.fp_flags & PF_OSFP_WSCALE_DC) ? "*" : "",
fp.fp_wscale);
+#ifdef __FreeBSD__
+ if ((fpresult = pf_osfp_find(&V_pf_osfp_list, &fp,
+#else
if ((fpresult = pf_osfp_find(&pf_osfp_list, &fp,
+#endif
PF_OSFP_MAXTTL_OFFSET)))
return (&fpresult->fp_oses);
return (NULL);
@@ -310,20 +334,23 @@ pf_osfp_initialize(void)
{
#if defined(__FreeBSD__) && defined(_KERNEL)
int error = ENOMEM;
-
+
do {
pf_osfp_entry_pl = pf_osfp_pl = NULL;
UMA_CREATE(pf_osfp_entry_pl, struct pf_osfp_entry, "pfospfen");
UMA_CREATE(pf_osfp_pl, struct pf_os_fingerprint, "pfosfp");
error = 0;
} while(0);
+
+ SLIST_INIT(&V_pf_osfp_list);
#else
pool_init(&pf_osfp_entry_pl, sizeof(struct pf_osfp_entry), 0, 0, 0,
"pfosfpen", &pool_allocator_nointr);
pool_init(&pf_osfp_pl, sizeof(struct pf_os_fingerprint), 0, 0, 0,
"pfosfp", &pool_allocator_nointr);
-#endif
SLIST_INIT(&pf_osfp_list);
+#endif
+
#ifdef __FreeBSD__
#ifdef _KERNEL
return (error);
@@ -337,6 +364,7 @@ pf_osfp_initialize(void)
void
pf_osfp_cleanup(void)
{
+
UMA_DESTROY(pf_osfp_entry_pl);
UMA_DESTROY(pf_osfp_pl);
}
@@ -349,8 +377,13 @@ pf_osfp_flush(void)
struct pf_os_fingerprint *fp;
struct pf_osfp_entry *entry;
+#ifdef __FreeBSD__
+ while ((fp = SLIST_FIRST(&V_pf_osfp_list))) {
+ SLIST_REMOVE_HEAD(&V_pf_osfp_list, fp_next);
+#else
while ((fp = SLIST_FIRST(&pf_osfp_list))) {
SLIST_REMOVE_HEAD(&pf_osfp_list, fp_next);
+#endif
while ((entry = SLIST_FIRST(&fp->fp_oses))) {
SLIST_REMOVE_HEAD(&fp->fp_oses, fp_entry);
pool_put(&pf_osfp_entry_pl, entry);
@@ -377,6 +410,7 @@ pf_osfp_add(struct pf_osfp_ioctl *fpioc)
fpadd.fp_wscale = fpioc->fp_wscale;
fpadd.fp_ttl = fpioc->fp_ttl;
+#if 0 /* XXX RYAN wants to fix logging */
DPFPRINTF("adding osfp %s %s %s = %s%d:%d:%d:%s%d:0x%llx %d "
"(TS=%s,M=%s%d,W=%s%d) %x\n",
fpioc->fp_os.fp_class_nm, fpioc->fp_os.fp_version_nm,
@@ -400,17 +434,31 @@ pf_osfp_add(struct pf_osfp_ioctl *fpioc)
(fpadd.fp_flags & PF_OSFP_WSCALE_DC) ? "*" : "",
fpadd.fp_wscale,
fpioc->fp_os.fp_os);
+#endif
-
+#ifdef __FreeBSD__
+ if ((fp = pf_osfp_find_exact(&V_pf_osfp_list, &fpadd))) {
+#else
if ((fp = pf_osfp_find_exact(&pf_osfp_list, &fpadd))) {
+#endif
SLIST_FOREACH(entry, &fp->fp_oses, fp_entry) {
if (PF_OSFP_ENTRY_EQ(entry, &fpioc->fp_os))
return (EEXIST);
}
- if ((entry = pool_get(&pf_osfp_entry_pl, PR_NOWAIT)) == NULL)
+ if ((entry = pool_get(&pf_osfp_entry_pl,
+#ifdef __FreeBSD__
+ PR_NOWAIT)) == NULL)
+#else
+ PR_WAITOK|PR_LIMITFAIL)) == NULL)
+#endif
return (ENOMEM);
} else {
- if ((fp = pool_get(&pf_osfp_pl, PR_NOWAIT)) == NULL)
+ if ((fp = pool_get(&pf_osfp_pl,
+#ifdef __FreeBSD__
+ PR_NOWAIT)) == NULL)
+#else
+ PR_WAITOK|PR_LIMITFAIL)) == NULL)
+#endif
return (ENOMEM);
memset(fp, 0, sizeof(*fp));
fp->fp_tcpopts = fpioc->fp_tcpopts;
@@ -422,11 +470,20 @@ pf_osfp_add(struct pf_osfp_ioctl *fpioc)
fp->fp_wscale = fpioc->fp_wscale;
fp->fp_ttl = fpioc->fp_ttl;
SLIST_INIT(&fp->fp_oses);
- if ((entry = pool_get(&pf_osfp_entry_pl, PR_NOWAIT)) == NULL) {
+ if ((entry = pool_get(&pf_osfp_entry_pl,
+#ifdef __FreeBSD__
+ PR_NOWAIT)) == NULL) {
+#else
+ PR_WAITOK|PR_LIMITFAIL)) == NULL) {
+#endif
pool_put(&pf_osfp_pl, fp);
return (ENOMEM);
}
+#ifdef __FreeBSD__
+ pf_osfp_insert(&V_pf_osfp_list, fp);
+#else
pf_osfp_insert(&pf_osfp_list, fp);
+#endif
}
memcpy(entry, &fpioc->fp_os, sizeof(*entry));
@@ -452,7 +509,7 @@ pf_osfp_find(struct pf_osfp_list *list, struct pf_os_fingerprint *find,
{
struct pf_os_fingerprint *f;
-#define MATCH_INT(_MOD, _DC, _field) \
+#define MATCH_INT(_MOD, _DC, _field) \
if ((f->fp_flags & _DC) == 0) { \
if ((f->fp_flags & _MOD) == 0) { \
if (f->_field != find->_field) \
@@ -480,10 +537,11 @@ pf_osfp_find(struct pf_osfp_list *list, struct pf_os_fingerprint *find,
if (find->fp_mss == 0)
continue;
-/* Some "smart" NAT devices and DSL routers will tweak the MSS size and
+/*
+ * Some "smart" NAT devices and DSL routers will tweak the MSS size and
* will set it to whatever is suitable for the link type.
*/
-#define SMART_MSS 1460
+#define SMART_MSS 1460
if ((find->fp_wsize % find->fp_mss ||
find->fp_wsize / find->fp_mss !=
f->fp_wsize) &&
@@ -495,8 +553,8 @@ pf_osfp_find(struct pf_osfp_list *list, struct pf_os_fingerprint *find,
if (find->fp_mss == 0)
continue;
-#define MTUOFF (sizeof(struct ip) + sizeof(struct tcphdr))
-#define SMART_MTU (SMART_MSS + MTUOFF)
+#define MTUOFF (sizeof(struct ip) + sizeof(struct tcphdr))
+#define SMART_MTU (SMART_MSS + MTUOFF)
if ((find->fp_wsize % (find->fp_mss + MTUOFF) ||
find->fp_wsize / (find->fp_mss + MTUOFF) !=
f->fp_wsize) &&
@@ -567,7 +625,11 @@ pf_osfp_get(struct pf_osfp_ioctl *fpioc)
memset(fpioc, 0, sizeof(*fpioc));
+#ifdef __FreeBSD__
+ SLIST_FOREACH(fp, &V_pf_osfp_list, fp_next) {
+#else
SLIST_FOREACH(fp, &pf_osfp_list, fp_next) {
+#endif
SLIST_FOREACH(entry, &fp->fp_oses, fp_entry) {
if (i++ == num) {
fpioc->fp_mss = fp->fp_mss;
@@ -594,7 +656,11 @@ pf_osfp_validate(void)
{
struct pf_os_fingerprint *f, *f2, find;
+#ifdef __FreeBSD__
+ SLIST_FOREACH(f, &V_pf_osfp_list, fp_next) {
+#else
SLIST_FOREACH(f, &pf_osfp_list, fp_next) {
+#endif
memcpy(&find, f, sizeof(find));
/* We do a few MSS/th_win percolations to make things unique */
@@ -606,7 +672,11 @@ pf_osfp_validate(void)
find.fp_wsize *= (find.fp_mss + 40);
else if (f->fp_flags & PF_OSFP_WSIZE_MOD)
find.fp_wsize *= 2;
+#ifdef __FreeBSD__
+ if (f != (f2 = pf_osfp_find(&V_pf_osfp_list, &find, 0))) {
+#else
if (f != (f2 = pf_osfp_find(&pf_osfp_list, &find, 0))) {
+#endif
if (f2)
printf("Found \"%s %s %s\" instead of "
"\"%s %s %s\"\n",
diff --git a/sys/contrib/pf/net/pf_ruleset.c b/sys/contrib/pf/net/pf_ruleset.c
index 7ff6a77..ca8667c 100644
--- a/sys/contrib/pf/net/pf_ruleset.c
+++ b/sys/contrib/pf/net/pf_ruleset.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_ruleset.c,v 1.1 2006/10/27 13:56:51 mcbride Exp $ */
+/* $OpenBSD: pf_ruleset.c,v 1.2 2008/12/18 15:31:37 dhill Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -61,48 +61,55 @@ __FBSDID("$FreeBSD$");
#ifdef _KERNEL
-# define DPFPRINTF(format, x...) \
- if (pf_status.debug >= PF_DEBUG_NOISY) \
+#ifdef __FreeBSD__
+#define DPFPRINTF(format, x...) \
+ if (V_pf_status.debug >= PF_DEBUG_NOISY) \
+ printf(format , ##x)
+#else
+#define DPFPRINTF(format, x...) \
+ if (pf_status.debug >= PF_DEBUG_NOISY) \
printf(format , ##x)
+#endif
#ifdef __FreeBSD__
-#define rs_malloc(x) malloc(x, M_TEMP, M_NOWAIT)
+#define rs_malloc(x) malloc(x, M_TEMP, M_NOWAIT|M_ZERO)
#else
-#define rs_malloc(x) malloc(x, M_TEMP, M_WAITOK)
+#define rs_malloc(x) malloc(x, M_TEMP, M_WAITOK|M_CANFAIL|M_ZERO)
#endif
#define rs_free(x) free(x, M_TEMP)
#else
/* Userland equivalents so we can lend code to pfctl et al. */
-# include <arpa/inet.h>
-# include <errno.h>
-# include <stdio.h>
-# include <stdlib.h>
-# include <string.h>
-# define rs_malloc(x) malloc(x)
-# define rs_free(x) free(x)
-
-# ifdef PFDEBUG
-# include <sys/stdarg.h>
-# define DPFPRINTF(format, x...) fprintf(stderr, format , ##x)
-# else
-# define DPFPRINTF(format, x...) ((void)0)
-# endif /* PFDEBUG */
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define rs_malloc(x) calloc(1, x)
+#define rs_free(x) free(x)
+
+#ifdef PFDEBUG
+#include <sys/stdarg.h>
+#define DPFPRINTF(format, x...) fprintf(stderr, format , ##x)
+#else
+#define DPFPRINTF(format, x...) ((void)0)
+#endif /* PFDEBUG */
#endif /* _KERNEL */
+#if defined(__FreeBSD__) && !defined(_KERNEL)
+#undef V_pf_anchors
+#define V_pf_anchors pf_anchors
+
+#undef pf_main_ruleset
+#define pf_main_ruleset pf_main_anchor.ruleset
+#endif
+#if defined(__FreeBSD__) && defined(_KERNEL)
+VNET_DEFINE(struct pf_anchor_global, pf_anchors);
+VNET_DEFINE(struct pf_anchor, pf_main_anchor);
+#else
struct pf_anchor_global pf_anchors;
struct pf_anchor pf_main_anchor;
-
-#ifndef __FreeBSD__
-/* XXX: hum? */
-int pf_get_ruleset_number(u_int8_t);
-void pf_init_ruleset(struct pf_ruleset *);
-int pf_anchor_setup(struct pf_rule *,
- const struct pf_ruleset *, const char *);
-int pf_anchor_copyout(const struct pf_ruleset *,
- const struct pf_rule *, struct pfioc_rule *);
-void pf_anchor_remove(struct pf_rule *);
#endif
static __inline int pf_anchor_compare(struct pf_anchor *, struct pf_anchor *);
@@ -168,9 +175,14 @@ pf_find_anchor(const char *path)
struct pf_anchor *key, *found;
key = (struct pf_anchor *)rs_malloc(sizeof(*key));
- memset(key, 0, sizeof(*key));
+ if (key == NULL)
+ return (NULL);
strlcpy(key->path, path, sizeof(key->path));
+#ifdef __FreeBSD__
+ found = RB_FIND(pf_anchor_global, &V_pf_anchors, key);
+#else
found = RB_FIND(pf_anchor_global, &pf_anchors, key);
+#endif
rs_free(key);
return (found);
}
@@ -210,7 +222,8 @@ pf_find_or_create_ruleset(const char *path)
if (ruleset != NULL)
return (ruleset);
p = (char *)rs_malloc(MAXPATHLEN);
- bzero(p, MAXPATHLEN);
+ if (p == NULL)
+ return (NULL);
strlcpy(p, path, MAXPATHLEN);
while (parent == NULL && (q = strrchr(p, '/')) != NULL) {
*q = 0;
@@ -242,7 +255,6 @@ pf_find_or_create_ruleset(const char *path)
rs_free(p);
return (NULL);
}
- memset(anchor, 0, sizeof(*anchor));
RB_INIT(&anchor->children);
strlcpy(anchor->name, q, sizeof(anchor->name));
if (parent != NULL) {
@@ -251,7 +263,11 @@ pf_find_or_create_ruleset(const char *path)
strlcat(anchor->path, "/", sizeof(anchor->path));
}
strlcat(anchor->path, anchor->name, sizeof(anchor->path));
+#ifdef __FreeBSD__
+ if ((dup = RB_INSERT(pf_anchor_global, &V_pf_anchors, anchor)) !=
+#else
if ((dup = RB_INSERT(pf_anchor_global, &pf_anchors, anchor)) !=
+#endif
NULL) {
printf("pf_find_or_create_ruleset: RB_INSERT1 "
"'%s' '%s' collides with '%s' '%s'\n",
@@ -268,7 +284,11 @@ pf_find_or_create_ruleset(const char *path)
"RB_INSERT2 '%s' '%s' collides with "
"'%s' '%s'\n", anchor->path, anchor->name,
dup->path, dup->name);
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_anchor_global, &V_pf_anchors,
+#else
RB_REMOVE(pf_anchor_global, &pf_anchors,
+#endif
anchor);
rs_free(anchor);
rs_free(p);
@@ -304,7 +324,11 @@ pf_remove_if_empty_ruleset(struct pf_ruleset *ruleset)
!TAILQ_EMPTY(ruleset->rules[i].inactive.ptr) ||
ruleset->rules[i].inactive.open)
return;
+#ifdef __FreeBSD__
+ RB_REMOVE(pf_anchor_global, &V_pf_anchors, ruleset->anchor);
+#else
RB_REMOVE(pf_anchor_global, &pf_anchors, ruleset->anchor);
+#endif
if ((parent = ruleset->anchor->parent) != NULL)
RB_REMOVE(pf_anchor_node, &parent->children,
ruleset->anchor);
@@ -328,7 +352,8 @@ pf_anchor_setup(struct pf_rule *r, const struct pf_ruleset *s,
if (!name[0])
return (0);
path = (char *)rs_malloc(MAXPATHLEN);
- bzero(path, MAXPATHLEN);
+ if (path == NULL)
+ return (1);
if (name[0] == '/')
strlcpy(path, name + 1, MAXPATHLEN);
else {
@@ -386,7 +411,8 @@ pf_anchor_copyout(const struct pf_ruleset *rs, const struct pf_rule *r,
int i;
a = (char *)rs_malloc(MAXPATHLEN);
- bzero(a, MAXPATHLEN);
+ if (a == NULL)
+ return (1);
if (rs->anchor == NULL)
a[0] = 0;
else
diff --git a/sys/contrib/pf/net/pf_subr.c b/sys/contrib/pf/net/pf_subr.c
deleted file mode 100644
index 07f5295..0000000
--- a/sys/contrib/pf/net/pf_subr.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/*-
- * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include "opt_inet.h"
-#include "opt_inet6.h"
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/kernel.h>
-#include <sys/libkern.h>
-#include <sys/mbuf.h>
-#include <sys/md5.h>
-#include <sys/time.h>
-#include <sys/random.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/systm.h>
-#include <sys/time.h>
-
-#include <net/if.h>
-#include <net/if_types.h>
-#include <net/bpf.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-#include <netinet/in_var.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-#include <netinet/tcp.h>
-#include <netinet/tcp_seq.h>
-#include <netinet/udp.h>
-#include <netinet/ip_icmp.h>
-#include <netinet/in_pcb.h>
-#include <netinet/tcp_timer.h>
-#include <netinet/tcp_var.h>
-#include <netinet/if_ether.h>
-#include <net/pfvar.h>
-
-/*
- * Following is where TCP initial sequence number generation occurs.
- *
- * There are two places where we must use initial sequence numbers:
- * 1. In SYN-ACK packets.
- * 2. In SYN packets.
- *
- * All ISNs for SYN-ACK packets are generated by the syncache. See
- * tcp_syncache.c for details.
- *
- * The ISNs in SYN packets must be monotonic; TIME_WAIT recycling
- * depends on this property. In addition, these ISNs should be
- * unguessable so as to prevent connection hijacking. To satisfy
- * the requirements of this situation, the algorithm outlined in
- * RFC 1948 is used, with only small modifications.
- *
- * Implementation details:
- *
- * Time is based off the system timer, and is corrected so that it
- * increases by one megabyte per second. This allows for proper
- * recycling on high speed LANs while still leaving over an hour
- * before rollover.
- *
- * As reading the *exact* system time is too expensive to be done
- * whenever setting up a TCP connection, we increment the time
- * offset in two ways. First, a small random positive increment
- * is added to isn_offset for each connection that is set up.
- * Second, the function tcp_isn_tick fires once per clock tick
- * and increments isn_offset as necessary so that sequence numbers
- * are incremented at approximately ISN_BYTES_PER_SECOND. The
- * random positive increments serve only to ensure that the same
- * exact sequence number is never sent out twice (as could otherwise
- * happen when a port is recycled in less than the system tick
- * interval.)
- *
- * net.inet.tcp.isn_reseed_interval controls the number of seconds
- * between seeding of isn_secret. This is normally set to zero,
- * as reseeding should not be necessary.
- *
- * Locking of the global variables isn_secret, isn_last_reseed, isn_offset,
- * isn_offset_old, and isn_ctx is performed using the TCP pcbinfo lock. In
- * general, this means holding an exclusive (write) lock.
- */
-
-#define ISN_BYTES_PER_SECOND 1048576
-#define ISN_STATIC_INCREMENT 4096
-#define ISN_RANDOM_INCREMENT (4096 - 1)
-
-static u_char pf_isn_secret[32];
-static int pf_isn_last_reseed;
-static u_int32_t pf_isn_offset;
-
-u_int32_t
-pf_new_isn(struct pf_state *s)
-{
- MD5_CTX isn_ctx;
- u_int32_t md5_buffer[4];
- u_int32_t new_isn;
- struct pf_state_host *src, *dst;
-
- /* Seed if this is the first use, reseed if requested. */
- if (pf_isn_last_reseed == 0) {
- read_random(&pf_isn_secret, sizeof(pf_isn_secret));
- pf_isn_last_reseed = ticks;
- }
-
- if (s->direction == PF_IN) {
- src = &s->ext;
- dst = &s->gwy;
- } else {
- src = &s->lan;
- dst = &s->ext;
- }
-
- /* Compute the md5 hash and return the ISN. */
- MD5Init(&isn_ctx);
- MD5Update(&isn_ctx, (u_char *) &dst->port, sizeof(u_short));
- MD5Update(&isn_ctx, (u_char *) &src->port, sizeof(u_short));
-#ifdef INET6
- if (s->af == AF_INET6) {
- MD5Update(&isn_ctx, (u_char *) &dst->addr,
- sizeof(struct in6_addr));
- MD5Update(&isn_ctx, (u_char *) &src->addr,
- sizeof(struct in6_addr));
- } else
-#endif
- {
- MD5Update(&isn_ctx, (u_char *) &dst->addr,
- sizeof(struct in_addr));
- MD5Update(&isn_ctx, (u_char *) &src->addr,
- sizeof(struct in_addr));
- }
- MD5Update(&isn_ctx, (u_char *) &pf_isn_secret, sizeof(pf_isn_secret));
- MD5Final((u_char *) &md5_buffer, &isn_ctx);
- new_isn = (tcp_seq) md5_buffer[0];
- pf_isn_offset += ISN_STATIC_INCREMENT +
- (arc4random() & ISN_RANDOM_INCREMENT);
- new_isn += pf_isn_offset;
- return (new_isn);
-}
diff --git a/sys/contrib/pf/net/pf_table.c b/sys/contrib/pf/net/pf_table.c
index 40c9f67..010dc50 100644
--- a/sys/contrib/pf/net/pf_table.c
+++ b/sys/contrib/pf/net/pf_table.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pf_table.c,v 1.68 2006/05/02 10:08:45 dhartmei Exp $ */
+/* $OpenBSD: pf_table.c,v 1.79 2008/10/08 06:24:50 mcbride Exp $ */
/*
* Copyright (c) 2002 Cedric Berger
@@ -43,10 +43,10 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <sys/mbuf.h>
#include <sys/kernel.h>
-#include <sys/lock.h>
-#include <sys/rwlock.h>
#ifdef __FreeBSD__
#include <sys/malloc.h>
+#else
+#include <sys/pool.h>
#endif
#include <net/if.h>
@@ -55,10 +55,9 @@ __FBSDID("$FreeBSD$");
#ifndef __FreeBSD__
#include <netinet/ip_ipsp.h>
#endif
-
#include <net/pfvar.h>
-#define ACCEPT_FLAGS(oklist) \
+#define ACCEPT_FLAGS(flags, oklist) \
do { \
if ((flags & ~(oklist)) & \
PFR_FLAG_ALLMASK) \
@@ -90,28 +89,26 @@ _copyout(const void *uaddr, void *kaddr, size_t len)
return (r);
}
-#define COPYIN(from, to, size) \
+#define COPYIN(from, to, size, flags) \
((flags & PFR_FLAG_USERIOCTL) ? \
_copyin((from), (to), (size)) : \
(bcopy((from), (to), (size)), 0))
-#define COPYOUT(from, to, size) \
+#define COPYOUT(from, to, size, flags) \
((flags & PFR_FLAG_USERIOCTL) ? \
_copyout((from), (to), (size)) : \
(bcopy((from), (to), (size)), 0))
#else
-
-#define COPYIN(from, to, size) \
+#define COPYIN(from, to, size, flags) \
((flags & PFR_FLAG_USERIOCTL) ? \
copyin((from), (to), (size)) : \
(bcopy((from), (to), (size)), 0))
-#define COPYOUT(from, to, size) \
+#define COPYOUT(from, to, size, flags) \
((flags & PFR_FLAG_USERIOCTL) ? \
copyout((from), (to), (size)) : \
(bcopy((from), (to), (size)), 0))
-
#endif
#define FILLIN_SIN(sin, addr) \
@@ -128,26 +125,26 @@ _copyout(const void *uaddr, void *kaddr, size_t len)
(sin6).sin6_addr = (addr); \
} while (0)
-#define SWAP(type, a1, a2) \
+#define SWAP(type, a1, a2) \
do { \
type tmp = a1; \
a1 = a2; \
a2 = tmp; \
} while (0)
-#define SUNION2PF(su, af) (((af)==AF_INET) ? \
+#define SUNION2PF(su, af) (((af)==AF_INET) ? \
(struct pf_addr *)&(su)->sin.sin_addr : \
(struct pf_addr *)&(su)->sin6.sin6_addr)
#define AF_BITS(af) (((af)==AF_INET)?32:128)
#define ADDR_NETWORK(ad) ((ad)->pfra_net < AF_BITS((ad)->pfra_af))
#define KENTRY_NETWORK(ke) ((ke)->pfrke_net < AF_BITS((ke)->pfrke_af))
-#define KENTRY_RNF_ROOT(ke) \
+#define KENTRY_RNF_ROOT(ke) \
((((struct radix_node *)(ke))->rn_flags & RNF_ROOT) != 0)
-#define NO_ADDRESSES (-1)
-#define ENQUEUE_UNMARKED_ONLY (1)
-#define INVERT_NEG_FLAG (1)
+#define NO_ADDRESSES (-1)
+#define ENQUEUE_UNMARKED_ONLY (1)
+#define INVERT_NEG_FLAG (1)
struct pfr_walktree {
enum pfrw_op {
@@ -169,28 +166,37 @@ struct pfr_walktree {
int pfrw_free;
int pfrw_flags;
};
-#define pfrw_addr pfrw_1.pfrw1_addr
-#define pfrw_astats pfrw_1.pfrw1_astats
-#define pfrw_workq pfrw_1.pfrw1_workq
-#define pfrw_kentry pfrw_1.pfrw1_kentry
-#define pfrw_dyn pfrw_1.pfrw1_dyn
-#define pfrw_cnt pfrw_free
+#define pfrw_addr pfrw_1.pfrw1_addr
+#define pfrw_astats pfrw_1.pfrw1_astats
+#define pfrw_workq pfrw_1.pfrw1_workq
+#define pfrw_kentry pfrw_1.pfrw1_kentry
+#define pfrw_dyn pfrw_1.pfrw1_dyn
+#define pfrw_cnt pfrw_free
-#define senderr(e) do { rv = (e); goto _bad; } while (0)
+#define senderr(e) do { rv = (e); goto _bad; } while (0)
#ifdef __FreeBSD__
-uma_zone_t pfr_ktable_pl;
-uma_zone_t pfr_kentry_pl;
-uma_zone_t pfr_kentry_pl2;
+VNET_DEFINE(uma_zone_t, pfr_ktable_pl);
+VNET_DEFINE(uma_zone_t, pfr_kentry_pl);
+VNET_DEFINE(uma_zone_t, pfr_kcounters_pl);
+#define V_pfr_kcounters_pl VNET(pfr_kcounters_pl)
+VNET_DEFINE(struct sockaddr_in, pfr_sin);
+#define V_pfr_sin VNET(pfr_sin)
+VNET_DEFINE(struct sockaddr_in6, pfr_sin6);
+#define V_pfr_sin6 VNET(pfr_sin6)
+VNET_DEFINE(union sockaddr_union, pfr_mask);
+#define V_pfr_mask VNET(pfr_mask)
+VNET_DEFINE(struct pf_addr, pfr_ffaddr);
+#define V_pfr_ffaddr VNET(pfr_ffaddr)
#else
struct pool pfr_ktable_pl;
struct pool pfr_kentry_pl;
-struct pool pfr_kentry_pl2;
-#endif
+struct pool pfr_kcounters_pl;
struct sockaddr_in pfr_sin;
struct sockaddr_in6 pfr_sin6;
union sockaddr_union pfr_mask;
struct pf_addr pfr_ffaddr;
+#endif
void pfr_copyout_addr(struct pfr_addr *,
struct pfr_kentry *ke);
@@ -226,7 +232,7 @@ void pfr_setflags_ktable(struct pfr_ktable *, int);
void pfr_clstats_ktables(struct pfr_ktableworkq *, long,
int);
void pfr_clstats_ktable(struct pfr_ktable *, long, int);
-struct pfr_ktable *pfr_create_ktable(struct pfr_table *, long, int);
+struct pfr_ktable *pfr_create_ktable(struct pfr_table *, long, int, int);
void pfr_destroy_ktables(struct pfr_ktableworkq *, int);
void pfr_destroy_ktable(struct pfr_ktable *, int);
int pfr_ktable_compare(struct pfr_ktable *,
@@ -251,12 +257,11 @@ pfr_initialize(void)
{
#ifndef __FreeBSD__
pool_init(&pfr_ktable_pl, sizeof(struct pfr_ktable), 0, 0, 0,
- "pfrktable", &pool_allocator_oldnointr);
+ "pfrktable", NULL);
pool_init(&pfr_kentry_pl, sizeof(struct pfr_kentry), 0, 0, 0,
- "pfrkentry", &pool_allocator_oldnointr);
- pool_init(&pfr_kentry_pl2, sizeof(struct pfr_kentry), 0, 0, 0,
- "pfrkentry2", NULL);
-#endif
+ "pfrkentry", NULL);
+ pool_init(&pfr_kcounters_pl, sizeof(struct pfr_kcounters), 0, 0, 0,
+ "pfrkcounters", NULL);
pfr_sin.sin_len = sizeof(pfr_sin);
pfr_sin.sin_family = AF_INET;
@@ -264,6 +269,14 @@ pfr_initialize(void)
pfr_sin6.sin6_family = AF_INET6;
memset(&pfr_ffaddr, 0xff, sizeof(pfr_ffaddr));
+#else
+ V_pfr_sin.sin_len = sizeof(V_pfr_sin);
+ V_pfr_sin.sin_family = AF_INET;
+ V_pfr_sin6.sin6_len = sizeof(V_pfr_sin6);
+ V_pfr_sin6.sin6_family = AF_INET6;
+
+ memset(&V_pfr_ffaddr, 0xff, sizeof(V_pfr_ffaddr));
+#endif
}
int
@@ -273,7 +286,7 @@ pfr_clr_addrs(struct pfr_table *tbl, int *ndel, int flags)
struct pfr_kentryworkq workq;
int s;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY);
if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -284,7 +297,6 @@ pfr_clr_addrs(struct pfr_table *tbl, int *ndel, int flags)
pfr_enqueue_addrs(kt, &workq, ndel, 0);
if (!(flags & PFR_FLAG_DUMMY)) {
- s = 0;
if (flags & PFR_FLAG_ATOMIC)
s = splsoftnet();
pfr_remove_kentries(kt, &workq);
@@ -307,10 +319,11 @@ pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq workq;
struct pfr_kentry *p, *q;
struct pfr_addr ad;
- int i, rv, s = 0, xadd = 0;
+ int i, rv, s, xadd = 0;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY |
+ PFR_FLAG_FEEDBACK);
if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -318,12 +331,13 @@ pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
return (ESRCH);
if (kt->pfrkt_flags & PFR_TFLAG_CONST)
return (EPERM);
- tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
+ tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0,
+ !(flags & PFR_FLAG_USERIOCTL));
if (tmpkt == NULL)
return (ENOMEM);
SLIST_INIT(&workq);
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
senderr(EFAULT);
if (pfr_validate_addr(&ad))
senderr(EINVAL);
@@ -340,7 +354,8 @@ pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
ad.pfra_fback = PFR_FB_NONE;
}
if (p == NULL && q == NULL) {
- p = pfr_create_kentry(&ad, 0);
+ p = pfr_create_kentry(&ad,
+ !(flags & PFR_FLAG_USERIOCTL));
if (p == NULL)
senderr(ENOMEM);
if (pfr_route_kentry(tmpkt, p)) {
@@ -351,10 +366,9 @@ pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
xadd++;
}
}
- if (flags & PFR_FLAG_FEEDBACK) {
- if (COPYOUT(&ad, addr+i, sizeof(ad)))
+ if (flags & PFR_FLAG_FEEDBACK)
+ if (COPYOUT(&ad, addr+i, sizeof(ad), flags))
senderr(EFAULT);
- }
}
pfr_clean_node_mask(tmpkt, &workq);
if (!(flags & PFR_FLAG_DUMMY)) {
@@ -386,9 +400,10 @@ pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq workq;
struct pfr_kentry *p;
struct pfr_addr ad;
- int i, rv, s = 0, xdel = 0, log = 1;
+ int i, rv, s, xdel = 0, log = 1;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY |
+ PFR_FLAG_FEEDBACK);
if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -415,7 +430,7 @@ pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
} else {
/* iterate over addresses to delete */
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
return (EFAULT);
if (pfr_validate_addr(&ad))
return (EINVAL);
@@ -426,7 +441,7 @@ pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
}
SLIST_INIT(&workq);
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
senderr(EFAULT);
if (pfr_validate_addr(&ad))
senderr(EINVAL);
@@ -448,7 +463,7 @@ pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
xdel++;
}
if (flags & PFR_FLAG_FEEDBACK)
- if (COPYOUT(&ad, addr+i, sizeof(ad)))
+ if (COPYOUT(&ad, addr+i, sizeof(ad), flags))
senderr(EFAULT);
}
if (!(flags & PFR_FLAG_DUMMY)) {
@@ -476,10 +491,11 @@ pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq addq, delq, changeq;
struct pfr_kentry *p, *q;
struct pfr_addr ad;
- int i, rv, s = 0, xadd = 0, xdel = 0, xchange = 0;
+ int i, rv, s, xadd = 0, xdel = 0, xchange = 0;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY |
+ PFR_FLAG_FEEDBACK);
if (pfr_validate_table(tbl, ignore_pfrt_flags, flags &
PFR_FLAG_USERIOCTL))
return (EINVAL);
@@ -488,7 +504,8 @@ pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
return (ESRCH);
if (kt->pfrkt_flags & PFR_TFLAG_CONST)
return (EPERM);
- tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
+ tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0,
+ !(flags & PFR_FLAG_USERIOCTL));
if (tmpkt == NULL)
return (ENOMEM);
pfr_mark_addrs(kt);
@@ -496,7 +513,7 @@ pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
SLIST_INIT(&delq);
SLIST_INIT(&changeq);
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
senderr(EFAULT);
if (pfr_validate_addr(&ad))
senderr(EINVAL);
@@ -519,7 +536,8 @@ pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
ad.pfra_fback = PFR_FB_DUPLICATE;
goto _skip;
}
- p = pfr_create_kentry(&ad, 0);
+ p = pfr_create_kentry(&ad,
+ !(flags & PFR_FLAG_USERIOCTL));
if (p == NULL)
senderr(ENOMEM);
if (pfr_route_kentry(tmpkt, p)) {
@@ -533,7 +551,7 @@ pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
}
_skip:
if (flags & PFR_FLAG_FEEDBACK)
- if (COPYOUT(&ad, addr+i, sizeof(ad)))
+ if (COPYOUT(&ad, addr+i, sizeof(ad), flags))
senderr(EFAULT);
}
pfr_enqueue_addrs(kt, &delq, &xdel, ENQUEUE_UNMARKED_ONLY);
@@ -546,7 +564,7 @@ _skip:
SLIST_FOREACH(p, &delq, pfrke_workq) {
pfr_copyout_addr(&ad, p);
ad.pfra_fback = PFR_FB_DELETED;
- if (COPYOUT(&ad, addr+size+i, sizeof(ad)))
+ if (COPYOUT(&ad, addr+size+i, sizeof(ad), flags))
senderr(EFAULT);
i++;
}
@@ -590,7 +608,7 @@ pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_addr ad;
int i, xmatch = 0;
- ACCEPT_FLAGS(PFR_FLAG_REPLACE);
+ ACCEPT_FLAGS(flags, PFR_FLAG_REPLACE);
if (pfr_validate_table(tbl, 0, 0))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -598,7 +616,7 @@ pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
return (ESRCH);
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
return (EFAULT);
if (pfr_validate_addr(&ad))
return (EINVAL);
@@ -611,7 +629,7 @@ pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
(p->pfrke_not ? PFR_FB_NOTMATCH : PFR_FB_MATCH);
if (p != NULL && !p->pfrke_not)
xmatch++;
- if (COPYOUT(&ad, addr+i, sizeof(ad)))
+ if (COPYOUT(&ad, addr+i, sizeof(ad), flags))
return (EFAULT);
}
if (nmatch != NULL)
@@ -627,7 +645,7 @@ pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,
struct pfr_walktree w;
int rv;
- ACCEPT_FLAGS(0);
+ ACCEPT_FLAGS(flags, 0);
if (pfr_validate_table(tbl, 0, 0))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -650,7 +668,7 @@ pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,
#endif
if (!rv)
#ifdef __FreeBSD__
- rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
+ rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
&w);
#else
rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
@@ -674,10 +692,11 @@ pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size,
struct pfr_ktable *kt;
struct pfr_walktree w;
struct pfr_kentryworkq workq;
- int rv, s = 0;
+ int rv, s;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC); /* XXX PFR_FLAG_CLSTATS disabled */
+ /* XXX PFR_FLAG_CLSTATS disabled */
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC);
if (pfr_validate_table(tbl, 0, 0))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -733,9 +752,10 @@ pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq workq;
struct pfr_kentry *p;
struct pfr_addr ad;
- int i, rv, s = 0, xzero = 0;
+ int i, rv, s, xzero = 0;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY |
+ PFR_FLAG_FEEDBACK);
if (pfr_validate_table(tbl, 0, 0))
return (EINVAL);
kt = pfr_lookup_table(tbl);
@@ -743,7 +763,7 @@ pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
return (ESRCH);
SLIST_INIT(&workq);
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
senderr(EFAULT);
if (pfr_validate_addr(&ad))
senderr(EINVAL);
@@ -751,7 +771,7 @@ pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
if (flags & PFR_FLAG_FEEDBACK) {
ad.pfra_fback = (p != NULL) ?
PFR_FB_CLEARED : PFR_FB_NONE;
- if (COPYOUT(&ad, addr+i, sizeof(ad)))
+ if (COPYOUT(&ad, addr+i, sizeof(ad), flags))
senderr(EFAULT);
}
if (p != NULL) {
@@ -866,7 +886,11 @@ struct pfr_kentry *
pfr_lookup_addr(struct pfr_ktable *kt, struct pfr_addr *ad, int exact)
{
union sockaddr_union sa, mask;
- struct radix_node_head *head = NULL; /* make the compiler happy */
+#ifdef __FreeBSD__
+ struct radix_node_head *head = NULL;
+#else
+ struct radix_node_head *head;
+#endif
struct pfr_kentry *ke;
int s;
@@ -904,12 +928,19 @@ pfr_create_kentry(struct pfr_addr *ad, int intr)
struct pfr_kentry *ke;
if (intr)
- ke = pool_get(&pfr_kentry_pl2, PR_NOWAIT);
+#ifdef __FreeBSD__
+ ke = pool_get(&V_pfr_kentry_pl, PR_NOWAIT | PR_ZERO);
+#else
+ ke = pool_get(&pfr_kentry_pl, PR_NOWAIT | PR_ZERO);
+#endif
else
- ke = pool_get(&pfr_kentry_pl, PR_NOWAIT);
+#ifdef __FreeBSD__
+ ke = pool_get(&V_pfr_kentry_pl, PR_WAITOK|PR_ZERO);
+#else
+ ke = pool_get(&pfr_kentry_pl, PR_WAITOK|PR_ZERO|PR_LIMITFAIL);
+#endif
if (ke == NULL)
return (NULL);
- bzero(ke, sizeof(*ke));
if (ad->pfra_af == AF_INET)
FILLIN_SIN(ke->pfrke_sa.sin, ad->pfra_ip4addr);
@@ -918,7 +949,6 @@ pfr_create_kentry(struct pfr_addr *ad, int intr)
ke->pfrke_af = ad->pfra_af;
ke->pfrke_net = ad->pfra_net;
ke->pfrke_not = ad->pfra_not;
- ke->pfrke_intrpool = intr;
return (ke);
}
@@ -936,10 +966,14 @@ pfr_destroy_kentries(struct pfr_kentryworkq *workq)
void
pfr_destroy_kentry(struct pfr_kentry *ke)
{
- if (ke->pfrke_intrpool)
- pool_put(&pfr_kentry_pl2, ke);
- else
- pool_put(&pfr_kentry_pl, ke);
+ if (ke->pfrke_counters)
+#ifdef __FreeBSD__
+ pool_put(&V_pfr_kcounters_pl, ke->pfrke_counters);
+ pool_put(&V_pfr_kentry_pl, ke);
+#else
+ pool_put(&pfr_kcounters_pl, ke->pfrke_counters);
+ pool_put(&pfr_kentry_pl, ke);
+#endif
}
void
@@ -1020,8 +1054,14 @@ pfr_clstats_kentries(struct pfr_kentryworkq *workq, long tzero, int negchange)
s = splsoftnet();
if (negchange)
p->pfrke_not = !p->pfrke_not;
- bzero(p->pfrke_packets, sizeof(p->pfrke_packets));
- bzero(p->pfrke_bytes, sizeof(p->pfrke_bytes));
+ if (p->pfrke_counters) {
+#ifdef __FreeBSD__
+ pool_put(&V_pfr_kcounters_pl, p->pfrke_counters);
+#else
+ pool_put(&pfr_kcounters_pl, p->pfrke_counters);
+#endif
+ p->pfrke_counters = NULL;
+ }
splx(s);
p->pfrke_tzero = tzero;
}
@@ -1034,10 +1074,10 @@ pfr_reset_feedback(struct pfr_addr *addr, int size, int flags)
int i;
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
break;
ad.pfra_fback = PFR_FB_NONE;
- if (COPYOUT(&ad, addr+i, sizeof(ad)))
+ if (COPYOUT(&ad, addr+i, sizeof(ad), flags))
break;
}
}
@@ -1072,7 +1112,11 @@ pfr_route_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
{
union sockaddr_union mask;
struct radix_node *rn;
- struct radix_node_head *head = NULL; /* make the compiler happy */
+#ifdef __FreeBSD__
+ struct radix_node_head *head = NULL;
+#else
+ struct radix_node_head *head;
+#endif
int s;
bzero(ke->pfrke_node, sizeof(ke->pfrke_node));
@@ -1087,9 +1131,17 @@ pfr_route_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
#endif
if (KENTRY_NETWORK(ke)) {
pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
+#ifdef __FreeBSD__
rn = rn_addroute(&ke->pfrke_sa, &mask, head, ke->pfrke_node);
+#else
+ rn = rn_addroute(&ke->pfrke_sa, &mask, head, ke->pfrke_node, 0);
+#endif
} else
+#ifdef __FreeBSD__
rn = rn_addroute(&ke->pfrke_sa, NULL, head, ke->pfrke_node);
+#else
+ rn = rn_addroute(&ke->pfrke_sa, NULL, head, ke->pfrke_node, 0);
+#endif
splx(s);
return (rn == NULL ? -1 : 0);
@@ -1100,7 +1152,11 @@ pfr_unroute_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
{
union sockaddr_union mask;
struct radix_node *rn;
- struct radix_node_head *head = NULL; /* make the compiler happy */
+#ifdef __FreeBSD__
+ struct radix_node_head *head = NULL;
+#else
+ struct radix_node_head *head;
+#endif
int s;
if (ke->pfrke_af == AF_INET)
@@ -1173,7 +1229,7 @@ pfr_walktree(struct radix_node *rn, void *arg)
struct pfr_addr ad;
pfr_copyout_addr(&ad, ke);
- if (COPYOUT(&ad, w->pfrw_addr, sizeof(ad)))
+ if (copyout(&ad, w->pfrw_addr, sizeof(ad)))
return (EFAULT);
w->pfrw_addr++;
}
@@ -1185,14 +1241,20 @@ pfr_walktree(struct radix_node *rn, void *arg)
pfr_copyout_addr(&as.pfras_a, ke);
s = splsoftnet();
- bcopy(ke->pfrke_packets, as.pfras_packets,
- sizeof(as.pfras_packets));
- bcopy(ke->pfrke_bytes, as.pfras_bytes,
- sizeof(as.pfras_bytes));
+ if (ke->pfrke_counters) {
+ bcopy(ke->pfrke_counters->pfrkc_packets,
+ as.pfras_packets, sizeof(as.pfras_packets));
+ bcopy(ke->pfrke_counters->pfrkc_bytes,
+ as.pfras_bytes, sizeof(as.pfras_bytes));
+ } else {
+ bzero(as.pfras_packets, sizeof(as.pfras_packets));
+ bzero(as.pfras_bytes, sizeof(as.pfras_bytes));
+ as.pfras_a.pfra_fback = PFR_FB_NOCOUNT;
+ }
splx(s);
as.pfras_tzero = ke->pfrke_tzero;
- if (COPYOUT(&as, w->pfrw_astats, sizeof(as)))
+ if (COPYOUT(&as, w->pfrw_astats, sizeof(as), flags))
return (EFAULT);
w->pfrw_astats++;
}
@@ -1209,19 +1271,35 @@ pfr_walktree(struct radix_node *rn, void *arg)
if (ke->pfrke_af == AF_INET) {
if (w->pfrw_dyn->pfid_acnt4++ > 0)
break;
+#ifdef __FreeBSD__
+ pfr_prepare_network(&V_pfr_mask, AF_INET, ke->pfrke_net);
+#else
pfr_prepare_network(&pfr_mask, AF_INET, ke->pfrke_net);
+#endif
w->pfrw_dyn->pfid_addr4 = *SUNION2PF(
&ke->pfrke_sa, AF_INET);
w->pfrw_dyn->pfid_mask4 = *SUNION2PF(
+#ifdef __FreeBSD__
+ &V_pfr_mask, AF_INET);
+#else
&pfr_mask, AF_INET);
+#endif
} else if (ke->pfrke_af == AF_INET6){
if (w->pfrw_dyn->pfid_acnt6++ > 0)
break;
+#ifdef __FreeBSD__
+ pfr_prepare_network(&V_pfr_mask, AF_INET6, ke->pfrke_net);
+#else
pfr_prepare_network(&pfr_mask, AF_INET6, ke->pfrke_net);
+#endif
w->pfrw_dyn->pfid_addr6 = *SUNION2PF(
&ke->pfrke_sa, AF_INET6);
w->pfrw_dyn->pfid_mask6 = *SUNION2PF(
+#ifdef __FreeBSD__
+ &V_pfr_mask, AF_INET6);
+#else
&pfr_mask, AF_INET6);
+#endif
}
break;
}
@@ -1233,9 +1311,10 @@ pfr_clr_tables(struct pfr_table *filter, int *ndel, int flags)
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p;
- int s = 0, xdel = 0;
+ int s, xdel = 0;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ALLRSETS);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY |
+ PFR_FLAG_ALLRSETS);
if (pfr_fix_anchor(filter->pfrt_anchor))
return (EINVAL);
if (pfr_table_count(filter, flags) < 0)
@@ -1270,14 +1349,14 @@ pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
{
struct pfr_ktableworkq addq, changeq;
struct pfr_ktable *p, *q, *r, key;
- int i, rv, s = 0, xadd = 0;
+ int i, rv, s, xadd = 0;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY);
SLIST_INIT(&addq);
SLIST_INIT(&changeq);
for (i = 0; i < size; i++) {
- if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
+ if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), flags))
senderr(EFAULT);
if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK,
flags & PFR_FLAG_USERIOCTL))
@@ -1285,7 +1364,8 @@ pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
key.pfrkt_flags |= PFR_TFLAG_ACTIVE;
p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
if (p == NULL) {
- p = pfr_create_ktable(&key.pfrkt_t, tzero, 1);
+ p = pfr_create_ktable(&key.pfrkt_t, tzero, 1,
+ !(flags & PFR_FLAG_USERIOCTL));
if (p == NULL)
senderr(ENOMEM);
SLIST_FOREACH(q, &addq, pfrkt_workq) {
@@ -1311,7 +1391,8 @@ pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
}
}
key.pfrkt_flags = 0;
- r = pfr_create_ktable(&key.pfrkt_t, 0, 1);
+ r = pfr_create_ktable(&key.pfrkt_t, 0, 1,
+ !(flags & PFR_FLAG_USERIOCTL));
if (r == NULL)
senderr(ENOMEM);
SLIST_INSERT_HEAD(&addq, r, pfrkt_workq);
@@ -1350,12 +1431,12 @@ pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags)
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p, *q, key;
- int i, s = 0, xdel = 0;
+ int i, s, xdel = 0;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY);
SLIST_INIT(&workq);
for (i = 0; i < size; i++) {
- if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
+ if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), flags))
return (EFAULT);
if (pfr_validate_table(&key.pfrkt_t, 0,
flags & PFR_FLAG_USERIOCTL))
@@ -1392,7 +1473,7 @@ pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size,
struct pfr_ktable *p;
int n, nn;
- ACCEPT_FLAGS(PFR_FLAG_ALLRSETS);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ALLRSETS);
if (pfr_fix_anchor(filter->pfrt_anchor))
return (EINVAL);
n = nn = pfr_table_count(filter, flags);
@@ -1407,7 +1488,7 @@ pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size,
continue;
if (n-- <= 0)
continue;
- if (COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl)))
+ if (COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl), flags))
return (EFAULT);
}
if (n) {
@@ -1424,11 +1505,11 @@ pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
{
struct pfr_ktable *p;
struct pfr_ktableworkq workq;
- int s = 0, n, nn;
+ int s, n, nn;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC|PFR_FLAG_ALLRSETS);
- /* XXX PFR_FLAG_CLSTATS disabled */
+ /* XXX PFR_FLAG_CLSTATS disabled */
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_ALLRSETS);
if (pfr_fix_anchor(filter->pfrt_anchor))
return (EINVAL);
n = nn = pfr_table_count(filter, flags);
@@ -1448,9 +1529,8 @@ pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
continue;
if (!(flags & PFR_FLAG_ATOMIC))
s = splsoftnet();
- if (COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl))) {
- if (!(flags & PFR_FLAG_ATOMIC))
- splx(s);
+ if (COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl), flags)) {
+ splx(s);
return (EFAULT);
}
if (!(flags & PFR_FLAG_ATOMIC))
@@ -1475,13 +1555,14 @@ pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p, key;
- int i, s = 0, xzero = 0;
+ int i, s, xzero = 0;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY |
+ PFR_FLAG_ADDRSTOO);
SLIST_INIT(&workq);
for (i = 0; i < size; i++) {
- if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
+ if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), flags))
return (EFAULT);
if (pfr_validate_table(&key.pfrkt_t, 0, 0))
return (EINVAL);
@@ -1509,16 +1590,16 @@ pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p, *q, key;
- int i, s = 0, xchange = 0, xdel = 0;
+ int i, s, xchange = 0, xdel = 0;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY);
if ((setflag & ~PFR_TFLAG_USRMASK) ||
(clrflag & ~PFR_TFLAG_USRMASK) ||
(setflag & clrflag))
return (EINVAL);
SLIST_INIT(&workq);
for (i = 0; i < size; i++) {
- if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
+ if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), flags))
return (EFAULT);
if (pfr_validate_table(&key.pfrkt_t, 0,
flags & PFR_FLAG_USERIOCTL))
@@ -1565,7 +1646,7 @@ pfr_ina_begin(struct pfr_table *trs, u_int32_t *ticket, int *ndel, int flags)
struct pf_ruleset *rs;
int xdel = 0;
- ACCEPT_FLAGS(PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_DUMMY);
rs = pf_find_or_create_ruleset(trs->pfrt_anchor);
if (rs == NULL)
return (ENOMEM);
@@ -1602,7 +1683,7 @@ pfr_ina_define(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pf_ruleset *rs;
int i, rv, xadd = 0, xaddr = 0;
- ACCEPT_FLAGS(PFR_FLAG_DUMMY|PFR_FLAG_ADDRSTOO);
+ ACCEPT_FLAGS(flags, PFR_FLAG_DUMMY | PFR_FLAG_ADDRSTOO);
if (size && !(flags & PFR_FLAG_ADDRSTOO))
return (EINVAL);
if (pfr_validate_table(tbl, PFR_TFLAG_USRMASK,
@@ -1615,7 +1696,8 @@ pfr_ina_define(struct pfr_table *tbl, struct pfr_addr *addr, int size,
SLIST_INIT(&tableq);
kt = RB_FIND(pfr_ktablehead, &pfr_ktables, (struct pfr_ktable *)tbl);
if (kt == NULL) {
- kt = pfr_create_ktable(tbl, 0, 1);
+ kt = pfr_create_ktable(tbl, 0, 1,
+ !(flags & PFR_FLAG_USERIOCTL));
if (kt == NULL)
return (ENOMEM);
SLIST_INSERT_HEAD(&tableq, kt, pfrkt_workq);
@@ -1631,7 +1713,8 @@ pfr_ina_define(struct pfr_table *tbl, struct pfr_addr *addr, int size,
kt->pfrkt_root = rt;
goto _skip;
}
- rt = pfr_create_ktable(&key.pfrkt_t, 0, 1);
+ rt = pfr_create_ktable(&key.pfrkt_t, 0, 1,
+ !(flags & PFR_FLAG_USERIOCTL));
if (rt == NULL) {
pfr_destroy_ktables(&tableq, 0);
return (ENOMEM);
@@ -1641,14 +1724,14 @@ pfr_ina_define(struct pfr_table *tbl, struct pfr_addr *addr, int size,
} else if (!(kt->pfrkt_flags & PFR_TFLAG_INACTIVE))
xadd++;
_skip:
- shadow = pfr_create_ktable(tbl, 0, 0);
+ shadow = pfr_create_ktable(tbl, 0, 0, !(flags & PFR_FLAG_USERIOCTL));
if (shadow == NULL) {
pfr_destroy_ktables(&tableq, 0);
return (ENOMEM);
}
SLIST_INIT(&addrq);
for (i = 0; i < size; i++) {
- if (COPYIN(addr+i, &ad, sizeof(ad)))
+ if (COPYIN(addr+i, &ad, sizeof(ad), flags))
senderr(EFAULT);
if (pfr_validate_addr(&ad))
senderr(EINVAL);
@@ -1698,7 +1781,7 @@ pfr_ina_rollback(struct pfr_table *trs, u_int32_t ticket, int *ndel, int flags)
struct pf_ruleset *rs;
int xdel = 0;
- ACCEPT_FLAGS(PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_DUMMY);
rs = pf_find_ruleset(trs->pfrt_anchor);
if (rs == NULL || !rs->topen || ticket != rs->tticket)
return (0);
@@ -1728,10 +1811,10 @@ pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd,
struct pfr_ktable *p, *q;
struct pfr_ktableworkq workq;
struct pf_ruleset *rs;
- int s = 0, xadd = 0, xchange = 0;
+ int s, xadd = 0, xchange = 0;
long tzero = time_second;
- ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
+ ACCEPT_FLAGS(flags, PFR_FLAG_ATOMIC | PFR_FLAG_DUMMY);
rs = pf_find_ruleset(trs->pfrt_anchor);
if (rs == NULL || !rs->topen || ticket != rs->tticket)
return (EBUSY);
@@ -1992,15 +2075,26 @@ pfr_clstats_ktable(struct pfr_ktable *kt, long tzero, int recurse)
}
struct pfr_ktable *
-pfr_create_ktable(struct pfr_table *tbl, long tzero, int attachruleset)
+pfr_create_ktable(struct pfr_table *tbl, long tzero, int attachruleset,
+ int intr)
{
struct pfr_ktable *kt;
struct pf_ruleset *rs;
- kt = pool_get(&pfr_ktable_pl, PR_NOWAIT);
+ if (intr)
+#ifdef __FreeBSD__
+ kt = pool_get(&V_pfr_ktable_pl, PR_NOWAIT|PR_ZERO);
+#else
+ kt = pool_get(&pfr_ktable_pl, PR_NOWAIT|PR_ZERO|PR_LIMITFAIL);
+#endif
+ else
+#ifdef __FreeBSD__
+ kt = pool_get(&V_pfr_ktable_pl, PR_WAITOK|PR_ZERO);
+#else
+ kt = pool_get(&pfr_ktable_pl, PR_WAITOK|PR_ZERO|PR_LIMITFAIL);
+#endif
if (kt == NULL)
return (NULL);
- bzero(kt, sizeof(*kt));
kt->pfrkt_t = *tbl;
if (attachruleset) {
@@ -2067,7 +2161,11 @@ pfr_destroy_ktable(struct pfr_ktable *kt, int flushaddr)
kt->pfrkt_rs->tables--;
pf_remove_if_empty_ruleset(kt->pfrkt_rs);
}
+#ifdef __FreeBSD__
+ pool_put(&V_pfr_ktable_pl, kt);
+#else
pool_put(&pfr_ktable_pl, kt);
+#endif
}
int
@@ -2102,16 +2200,26 @@ pfr_match_addr(struct pfr_ktable *kt, struct pf_addr *a, sa_family_t af)
switch (af) {
#ifdef INET
case AF_INET:
+#ifdef __FreeBSD__
+ V_pfr_sin.sin_addr.s_addr = a->addr32[0];
+ ke = (struct pfr_kentry *)rn_match(&V_pfr_sin, kt->pfrkt_ip4);
+#else
pfr_sin.sin_addr.s_addr = a->addr32[0];
ke = (struct pfr_kentry *)rn_match(&pfr_sin, kt->pfrkt_ip4);
+#endif
if (ke && KENTRY_RNF_ROOT(ke))
ke = NULL;
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
+#ifdef __FreeBSD__
+ bcopy(a, &V_pfr_sin6.sin6_addr, sizeof(V_pfr_sin6.sin6_addr));
+ ke = (struct pfr_kentry *)rn_match(&V_pfr_sin6, kt->pfrkt_ip6);
+#else
bcopy(a, &pfr_sin6.sin6_addr, sizeof(pfr_sin6.sin6_addr));
ke = (struct pfr_kentry *)rn_match(&pfr_sin6, kt->pfrkt_ip6);
+#endif
if (ke && KENTRY_RNF_ROOT(ke))
ke = NULL;
break;
@@ -2139,16 +2247,26 @@ pfr_update_stats(struct pfr_ktable *kt, struct pf_addr *a, sa_family_t af,
switch (af) {
#ifdef INET
case AF_INET:
+#ifdef __FreeBSD__
+ V_pfr_sin.sin_addr.s_addr = a->addr32[0];
+ ke = (struct pfr_kentry *)rn_match(&V_pfr_sin, kt->pfrkt_ip4);
+#else
pfr_sin.sin_addr.s_addr = a->addr32[0];
ke = (struct pfr_kentry *)rn_match(&pfr_sin, kt->pfrkt_ip4);
+#endif
if (ke && KENTRY_RNF_ROOT(ke))
ke = NULL;
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
+#ifdef __FreeBSD__
+ bcopy(a, &V_pfr_sin6.sin6_addr, sizeof(V_pfr_sin6.sin6_addr));
+ ke = (struct pfr_kentry *)rn_match(&V_pfr_sin6, kt->pfrkt_ip6);
+#else
bcopy(a, &pfr_sin6.sin6_addr, sizeof(pfr_sin6.sin6_addr));
ke = (struct pfr_kentry *)rn_match(&pfr_sin6, kt->pfrkt_ip6);
+#endif
if (ke && KENTRY_RNF_ROOT(ke))
ke = NULL;
break;
@@ -2163,14 +2281,24 @@ pfr_update_stats(struct pfr_ktable *kt, struct pf_addr *a, sa_family_t af,
}
kt->pfrkt_packets[dir_out][op_pass]++;
kt->pfrkt_bytes[dir_out][op_pass] += len;
- if (ke != NULL && op_pass != PFR_OP_XPASS) {
- ke->pfrke_packets[dir_out][op_pass]++;
- ke->pfrke_bytes[dir_out][op_pass] += len;
+ if (ke != NULL && op_pass != PFR_OP_XPASS &&
+ (kt->pfrkt_flags & PFR_TFLAG_COUNTERS)) {
+ if (ke->pfrke_counters == NULL)
+#ifdef __FreeBSD__
+ ke->pfrke_counters = pool_get(&V_pfr_kcounters_pl,
+#else
+ ke->pfrke_counters = pool_get(&pfr_kcounters_pl,
+#endif
+ PR_NOWAIT | PR_ZERO);
+ if (ke->pfrke_counters != NULL) {
+ ke->pfrke_counters->pfrkc_packets[dir_out][op_pass]++;
+ ke->pfrke_counters->pfrkc_bytes[dir_out][op_pass] += len;
+ }
}
}
struct pfr_ktable *
-pfr_attach_table(struct pf_ruleset *rs, char *name)
+pfr_attach_table(struct pf_ruleset *rs, char *name, int intr)
{
struct pfr_ktable *kt, *rt;
struct pfr_table tbl;
@@ -2182,14 +2310,14 @@ pfr_attach_table(struct pf_ruleset *rs, char *name)
strlcpy(tbl.pfrt_anchor, ac->path, sizeof(tbl.pfrt_anchor));
kt = pfr_lookup_table(&tbl);
if (kt == NULL) {
- kt = pfr_create_ktable(&tbl, time_second, 1);
+ kt = pfr_create_ktable(&tbl, time_second, 1, intr);
if (kt == NULL)
return (NULL);
if (ac != NULL) {
bzero(tbl.pfrt_anchor, sizeof(tbl.pfrt_anchor));
rt = pfr_lookup_table(&tbl);
if (rt == NULL) {
- rt = pfr_create_ktable(&tbl, 0, 1);
+ rt = pfr_create_ktable(&tbl, 0, 1, intr);
if (rt == NULL) {
pfr_destroy_ktable(kt, 0);
return (NULL);
@@ -2215,20 +2343,31 @@ pfr_detach_table(struct pfr_ktable *kt)
pfr_setflags_ktable(kt, kt->pfrkt_flags&~PFR_TFLAG_REFERENCED);
}
-
int
pfr_pool_get(struct pfr_ktable *kt, int *pidx, struct pf_addr *counter,
struct pf_addr **raddr, struct pf_addr **rmask, sa_family_t af)
{
+#ifdef __FreeBSD__
struct pfr_kentry *ke, *ke2 = NULL;
struct pf_addr *addr = NULL;
+#else
+ struct pfr_kentry *ke, *ke2;
+ struct pf_addr *addr;
+#endif
union sockaddr_union mask;
int idx = -1, use_counter = 0;
+#ifdef __FreeBSD__
+ if (af == AF_INET)
+ addr = (struct pf_addr *)&V_pfr_sin.sin_addr;
+ else if (af == AF_INET6)
+ addr = (struct pf_addr *)&V_pfr_sin6.sin6_addr;
+#else
if (af == AF_INET)
addr = (struct pf_addr *)&pfr_sin.sin_addr;
else if (af == AF_INET6)
addr = (struct pf_addr *)&pfr_sin6.sin6_addr;
+#endif
if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE) && kt->pfrkt_root != NULL)
kt = kt->pfrkt_root;
if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
@@ -2243,11 +2382,21 @@ pfr_pool_get(struct pfr_ktable *kt, int *pidx, struct pf_addr *counter,
_next_block:
ke = pfr_kentry_byidx(kt, idx, af);
- if (ke == NULL)
+ if (ke == NULL) {
+ kt->pfrkt_nomatch++;
return (1);
+ }
+#ifdef __FreeBSD__
+ pfr_prepare_network(&V_pfr_mask, af, ke->pfrke_net);
+#else
pfr_prepare_network(&pfr_mask, af, ke->pfrke_net);
+#endif
*raddr = SUNION2PF(&ke->pfrke_sa, af);
+#ifdef __FreeBSD__
+ *rmask = SUNION2PF(&V_pfr_mask, af);
+#else
*rmask = SUNION2PF(&pfr_mask, af);
+#endif
if (use_counter) {
/* is supplied address within block? */
@@ -2267,27 +2416,42 @@ _next_block:
/* this is a single IP address - no possible nested block */
PF_ACPY(counter, addr, af);
*pidx = idx;
+ kt->pfrkt_match++;
return (0);
}
for (;;) {
/* we don't want to use a nested block */
+#ifdef __FreeBSD__
+ if (af == AF_INET)
+ ke2 = (struct pfr_kentry *)rn_match(&V_pfr_sin,
+ kt->pfrkt_ip4);
+ else if (af == AF_INET6)
+ ke2 = (struct pfr_kentry *)rn_match(&V_pfr_sin6,
+ kt->pfrkt_ip6);
+#else
if (af == AF_INET)
ke2 = (struct pfr_kentry *)rn_match(&pfr_sin,
kt->pfrkt_ip4);
else if (af == AF_INET6)
ke2 = (struct pfr_kentry *)rn_match(&pfr_sin6,
kt->pfrkt_ip6);
+#endif
/* no need to check KENTRY_RNF_ROOT() here */
if (ke2 == ke) {
/* lookup return the same block - perfect */
PF_ACPY(counter, addr, af);
*pidx = idx;
+ kt->pfrkt_match++;
return (0);
}
/* we need to increase the counter past the nested block */
pfr_prepare_network(&mask, AF_INET, ke2->pfrke_net);
+#ifdef __FreeBSD__
+ PF_POOLMASK(addr, addr, SUNION2PF(&mask, af), &V_pfr_ffaddr, af);
+#else
PF_POOLMASK(addr, addr, SUNION2PF(&mask, af), &pfr_ffaddr, af);
+#endif
PF_AINC(addr, af);
if (!PF_MATCHA(0, *raddr, *rmask, addr, af)) {
/* ok, we reached the end of our main block */
diff --git a/sys/contrib/pf/net/pfvar.h b/sys/contrib/pf/net/pfvar.h
index de175b1..2aa4bbf 100644
--- a/sys/contrib/pf/net/pfvar.h
+++ b/sys/contrib/pf/net/pfvar.h
@@ -1,5 +1,4 @@
-/* $FreeBSD$ */
-/* $OpenBSD: pfvar.h,v 1.244 2007/02/23 21:31:51 deraadt Exp $ */
+/* $OpenBSD: pfvar.h,v 1.282 2009/01/29 15:12:28 pyr Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -78,9 +77,8 @@ struct inpcb;
#endif
enum { PF_INOUT, PF_IN, PF_OUT };
-enum { PF_LAN_EXT, PF_EXT_GWY, PF_ID };
enum { PF_PASS, PF_DROP, PF_SCRUB, PF_NOSCRUB, PF_NAT, PF_NONAT,
- PF_BINAT, PF_NOBINAT, PF_RDR, PF_NORDR, PF_SYNPROXY_DROP };
+ PF_BINAT, PF_NOBINAT, PF_RDR, PF_NORDR, PF_SYNPROXY_DROP, PF_DEFER };
enum { PF_RULESET_SCRUB, PF_RULESET_FILTER, PF_RULESET_NAT,
PF_RULESET_BINAT, PF_RULESET_RDR, PF_RULESET_MAX };
enum { PF_OP_NONE, PF_OP_IRG, PF_OP_EQ, PF_OP_NE, PF_OP_LT,
@@ -90,6 +88,7 @@ enum { PF_CHANGE_NONE, PF_CHANGE_ADD_HEAD, PF_CHANGE_ADD_TAIL,
PF_CHANGE_ADD_BEFORE, PF_CHANGE_ADD_AFTER,
PF_CHANGE_REMOVE, PF_CHANGE_GET_TICKET };
enum { PF_GET_NONE, PF_GET_CLR_CNTR };
+enum { PF_SK_WIRE, PF_SK_STACK, PF_SK_BOTH };
/*
* Note about PFTM_*: real indices into pf_rule.timeout[] come before
@@ -132,7 +131,8 @@ enum { PF_LIMIT_STATES, PF_LIMIT_SRC_NODES, PF_LIMIT_FRAGS,
enum { PF_POOL_NONE, PF_POOL_BITMASK, PF_POOL_RANDOM,
PF_POOL_SRCHASH, PF_POOL_ROUNDROBIN };
enum { PF_ADDR_ADDRMASK, PF_ADDR_NOROUTE, PF_ADDR_DYNIFTL,
- PF_ADDR_TABLE, PF_ADDR_RTLABEL, PF_ADDR_URPFFAILED };
+ PF_ADDR_TABLE, PF_ADDR_RTLABEL, PF_ADDR_URPFFAILED,
+ PF_ADDR_RANGE };
#define PF_POOL_TYPEMASK 0x0f
#define PF_POOL_STICKYADDR 0x20
#define PF_WSCALE_FLAG 0x80
@@ -212,87 +212,106 @@ struct pfi_dynaddr {
*/
#ifdef __FreeBSD__
-#define splsoftnet() splnet()
+#define splsoftnet() splnet()
#define HTONL(x) (x) = htonl((__uint32_t)(x))
#define HTONS(x) (x) = htons((__uint16_t)(x))
#define NTOHL(x) (x) = ntohl((__uint32_t)(x))
#define NTOHS(x) (x) = ntohs((__uint16_t)(x))
-#define PF_NAME "pf"
+#define PF_NAME "pf"
-#define PR_NOWAIT M_NOWAIT
-#define pool_get(p, f) uma_zalloc(*(p), (f))
-#define pool_put(p, o) uma_zfree(*(p), (o))
+#define PR_NOWAIT M_NOWAIT
+#define PR_WAITOK M_WAIT
+#define PR_ZERO M_ZERO
+#define pool_get(p, f) uma_zalloc(*(p), (f))
+#define pool_put(p, o) uma_zfree(*(p), (o))
-#define UMA_CREATE(var, type, desc) \
- var = uma_zcreate(desc, sizeof(type), \
- NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); \
- if (var == NULL) break
-#define UMA_DESTROY(var) \
- if(var) uma_zdestroy(var)
+#define UMA_CREATE(var, type, desc) \
+ var = uma_zcreate(desc, sizeof(type), \
+ NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); \
+ if (var == NULL) \
+ break
+#define UMA_DESTROY(var) \
+ if (var) \
+ uma_zdestroy(var)
+#ifdef __FreeBSD__
+VNET_DECLARE(struct mtx, pf_task_mtx);
+#define V_pf_task_mtx VNET(pf_task_mtx)
+
+#define PF_ASSERT(h) mtx_assert(&V_pf_task_mtx, (h))
+
+#define PF_LOCK() do { \
+ PF_ASSERT(MA_NOTOWNED); \
+ mtx_lock(&V_pf_task_mtx); \
+} while(0)
+#define PF_UNLOCK() do { \
+ PF_ASSERT(MA_OWNED); \
+ mtx_unlock(&V_pf_task_mtx); \
+} while(0)
+#else
extern struct mtx pf_task_mtx;
-#define PF_ASSERT(h) mtx_assert(&pf_task_mtx, (h))
+#define PF_ASSERT(h) mtx_assert(&pf_task_mtx, (h))
-#define PF_LOCK() do { \
- PF_ASSERT(MA_NOTOWNED); \
- mtx_lock(&pf_task_mtx); \
+#define PF_LOCK() do { \
+ PF_ASSERT(MA_NOTOWNED); \
+ mtx_lock(&pf_task_mtx); \
} while(0)
-#define PF_UNLOCK() do { \
- PF_ASSERT(MA_OWNED); \
- mtx_unlock(&pf_task_mtx); \
+#define PF_UNLOCK() do { \
+ PF_ASSERT(MA_OWNED); \
+ mtx_unlock(&pf_task_mtx); \
} while(0)
+#endif
-#define PF_COPYIN(uaddr, kaddr, len, r) do { \
- PF_UNLOCK(); \
- r = copyin((uaddr), (kaddr), (len)); \
- PF_LOCK(); \
+#define PF_COPYIN(uaddr, kaddr, len, r) do { \
+ PF_UNLOCK(); \
+ r = copyin((uaddr), (kaddr), (len)); \
+ PF_LOCK(); \
} while(0)
-#define PF_COPYOUT(kaddr, uaddr, len, r) do { \
- PF_UNLOCK(); \
- r = copyout((kaddr), (uaddr), (len)); \
- PF_LOCK(); \
+#define PF_COPYOUT(kaddr, uaddr, len, r) do { \
+ PF_UNLOCK(); \
+ r = copyout((kaddr), (uaddr), (len)); \
+ PF_LOCK(); \
} while(0)
extern void init_pf_mutex(void);
extern void destroy_pf_mutex(void);
-#define PF_MODVER 1
-#define PFLOG_MODVER 1
-#define PFSYNC_MODVER 1
-
-#define PFLOG_MINVER 1
-#define PFLOG_PREFVER PFLOG_MODVER
-#define PFLOG_MAXVER 1
-#define PFSYNC_MINVER 1
-#define PFSYNC_PREFVER PFSYNC_MODVER
-#define PFSYNC_MAXVER 1
-#endif /* __FreeBSD__ */
-
+#define PF_MODVER 1
+#define PFLOG_MODVER 1
+#define PFSYNC_MODVER 1
+
+#define PFLOG_MINVER 1
+#define PFLOG_PREFVER PFLOG_MODVER
+#define PFLOG_MAXVER 1
+#define PFSYNC_MINVER 1
+#define PFSYNC_PREFVER PFSYNC_MODVER
+#define PFSYNC_MAXVER 1
+#endif /* __FreeBSD__ */
#ifdef INET
#ifndef INET6
-#define PF_INET_ONLY
+#define PF_INET_ONLY
#endif /* ! INET6 */
#endif /* INET */
#ifdef INET6
#ifndef INET
-#define PF_INET6_ONLY
+#define PF_INET6_ONLY
#endif /* ! INET */
#endif /* INET6 */
#ifdef INET
#ifdef INET6
-#define PF_INET_INET6
+#define PF_INET_INET6
#endif /* INET6 */
#endif /* INET */
#else
-#define PF_INET_INET6
+#define PF_INET_INET6
#endif /* _KERNEL */
@@ -412,7 +431,10 @@ extern void destroy_pf_mutex(void);
((aw)->type == PF_ADDR_TABLE && \
!pfr_match_addr((aw)->p.tbl, (x), (af))) || \
((aw)->type == PF_ADDR_DYNIFTL && \
- !pfi_match_addr((aw)->p.dyn, (x), (af))) || \
+ !pfi_match_addr((aw)->p.dyn, (x), (af))) || \
+ ((aw)->type == PF_ADDR_RANGE && \
+ !pf_match_addr_range(&(aw)->v.a.addr, \
+ &(aw)->v.a.mask, (x), (af))) || \
((aw)->type == PF_ADDR_ADDRMASK && \
!PF_AZERO(&(aw)->v.a.mask, (af)) && \
!PF_MATCHA(0, &(aw)->v.a.addr, \
@@ -619,12 +641,13 @@ struct pf_rule {
int rtableid;
u_int32_t timeout[PFTM_MAX];
- u_int32_t states;
+ u_int32_t states_cur;
+ u_int32_t states_tot;
u_int32_t max_states;
u_int32_t src_nodes;
u_int32_t max_src_nodes;
u_int32_t max_src_states;
- u_int32_t spare1; /* netgraph */
+ u_int32_t spare1; /* netgraph */
u_int32_t max_src_conn;
struct {
u_int32_t limit;
@@ -643,7 +666,7 @@ struct pf_rule {
u_int16_t max_mss;
u_int16_t tag;
u_int16_t match_tag;
- u_int16_t spare2; /* netgraph */
+ u_int16_t spare2; /* netgraph */
struct pf_rule_uid uid;
struct pf_rule_gid gid;
@@ -673,12 +696,18 @@ struct pf_rule {
u_int8_t rt;
u_int8_t return_ttl;
u_int8_t tos;
+ u_int8_t set_tos;
u_int8_t anchor_relative;
u_int8_t anchor_wildcard;
#define PF_FLUSH 0x01
#define PF_FLUSH_GLOBAL 0x02
u_int8_t flush;
+
+ struct {
+ struct pf_addr addr;
+ u_int16_t port;
+ } divert;
};
/* rule flags */
@@ -697,10 +726,12 @@ struct pf_rule {
#define PFRULE_FRAGDROP 0x0400 /* drop funny fragments */
#define PFRULE_RANDOMID 0x0800
#define PFRULE_REASSEMBLE_TCP 0x1000
+#define PFRULE_SET_TOS 0x2000
/* rule flags again */
#define PFRULE_IFBOUND 0x00010000 /* if-bound */
#define PFRULE_STATESLOPPY 0x00020000 /* sloppy state tracking */
+#define PFRULE_PFLOW 0x00040000
#define PFSTATE_HIWAT 10000 /* default state table size */
#define PFSTATE_ADAPT_START 6000 /* default adaptive timeout start */
@@ -758,83 +789,268 @@ struct pf_state_host {
};
struct pf_state_peer {
+ struct pf_state_scrub *scrub; /* state is scrubbed */
u_int32_t seqlo; /* Max sequence number sent */
u_int32_t seqhi; /* Max the other end ACKd + win */
u_int32_t seqdiff; /* Sequence number modulator */
u_int16_t max_win; /* largest window (pre scaling) */
+ u_int16_t mss; /* Maximum segment size option */
u_int8_t state; /* active state level */
u_int8_t wscale; /* window scaling factor */
- u_int16_t mss; /* Maximum segment size option */
u_int8_t tcp_est; /* Did we reach TCPS_ESTABLISHED */
- struct pf_state_scrub *scrub; /* state is scrubbed */
- u_int8_t pad[3];
+ u_int8_t pad[1];
};
TAILQ_HEAD(pf_state_queue, pf_state);
-/* keep synced with struct pf_state, used in RB_FIND */
-struct pf_state_cmp {
- u_int64_t id;
- u_int32_t creatorid;
- struct pf_state_host lan;
- struct pf_state_host gwy;
- struct pf_state_host ext;
+/* keep synced with struct pf_state_key, used in RB_FIND */
+struct pf_state_key_cmp {
+ struct pf_addr addr[2];
+ u_int16_t port[2];
sa_family_t af;
u_int8_t proto;
- u_int8_t direction;
- u_int8_t pad;
+ u_int8_t pad[2];
+};
+
+struct pf_state_item {
+ TAILQ_ENTRY(pf_state_item) entry;
+ struct pf_state *s;
+};
+
+TAILQ_HEAD(pf_statelisthead, pf_state_item);
+
+struct pf_state_key {
+ struct pf_addr addr[2];
+ u_int16_t port[2];
+ sa_family_t af;
+ u_int8_t proto;
+ u_int8_t pad[2];
+
+ RB_ENTRY(pf_state_key) entry;
+ struct pf_statelisthead states;
+ struct pf_state_key *reverse;
+ struct inpcb *inp;
+};
+
+/* keep synced with struct pf_state, used in RB_FIND */
+struct pf_state_cmp {
+ u_int64_t id;
+ u_int32_t creatorid;
+ u_int8_t direction;
+ u_int8_t pad[3];
};
struct pf_state {
- u_int64_t id;
+ u_int64_t id;
+ u_int32_t creatorid;
+ u_int8_t direction;
+#ifdef __FreeBSD__
+ u_int8_t pad[2];
+ u_int8_t local_flags;
+#define PFSTATE_EXPIRING 0x01
+#else
+ u_int8_t pad[3];
+#endif
+
+ TAILQ_ENTRY(pf_state) sync_list;
+ TAILQ_ENTRY(pf_state) entry_list;
+ RB_ENTRY(pf_state) entry_id;
+ struct pf_state_peer src;
+ struct pf_state_peer dst;
+ union pf_rule_ptr rule;
+ union pf_rule_ptr anchor;
+ union pf_rule_ptr nat_rule;
+ struct pf_addr rt_addr;
+ struct pf_state_key *key[2]; /* addresses stack and wire */
+ struct pfi_kif *kif;
+ struct pfi_kif *rt_kif;
+ struct pf_src_node *src_node;
+ struct pf_src_node *nat_src_node;
+ u_int64_t packets[2];
+ u_int64_t bytes[2];
+ u_int32_t creation;
+ u_int32_t expire;
+ u_int32_t pfsync_time;
+ u_int16_t tag;
+ u_int8_t log;
+ u_int8_t state_flags;
+#define PFSTATE_ALLOWOPTS 0x01
+#define PFSTATE_SLOPPY 0x02
+#define PFSTATE_PFLOW 0x04
+#define PFSTATE_NOSYNC 0x08
+#define PFSTATE_ACK 0x10
+ u_int8_t timeout;
+ u_int8_t sync_state; /* PFSYNC_S_x */
+
+ /* XXX */
+ u_int8_t sync_updates;
+ u_int8_t _tail[3];
+};
+
+/*
+ * Unified state structures for pulling states out of the kernel
+ * used by pfsync(4) and the pf(4) ioctl.
+ */
+struct pfsync_state_scrub {
+ u_int16_t pfss_flags;
+ u_int8_t pfss_ttl; /* stashed TTL */
+#define PFSYNC_SCRUB_FLAG_VALID 0x01
+ u_int8_t scrub_flag;
+ u_int32_t pfss_ts_mod; /* timestamp modulation */
+} __packed;
+
+struct pfsync_state_peer {
+ struct pfsync_state_scrub scrub; /* state is scrubbed */
+ u_int32_t seqlo; /* Max sequence number sent */
+ u_int32_t seqhi; /* Max the other end ACKd + win */
+ u_int32_t seqdiff; /* Sequence number modulator */
+ u_int16_t max_win; /* largest window (pre scaling) */
+ u_int16_t mss; /* Maximum segment size option */
+ u_int8_t state; /* active state level */
+ u_int8_t wscale; /* window scaling factor */
+ u_int8_t pad[6];
+} __packed;
+
+struct pfsync_state_key {
+ struct pf_addr addr[2];
+ u_int16_t port[2];
+};
+
+struct pfsync_state {
+ u_int32_t id[2];
+ char ifname[IFNAMSIZ];
+ struct pfsync_state_key key[2];
+ struct pfsync_state_peer src;
+ struct pfsync_state_peer dst;
+ struct pf_addr rt_addr;
+ u_int32_t rule;
+ u_int32_t anchor;
+ u_int32_t nat_rule;
+ u_int32_t creation;
+ u_int32_t expire;
+ u_int32_t packets[2][2];
+ u_int32_t bytes[2][2];
u_int32_t creatorid;
- struct pf_state_host lan;
- struct pf_state_host gwy;
- struct pf_state_host ext;
sa_family_t af;
u_int8_t proto;
u_int8_t direction;
#ifdef __FreeBSD__
u_int8_t local_flags;
-#define PFSTATE_EXPIRING 0x01
-#else
+#define PFSTATE_EXPIRING 0x01
u_int8_t pad;
#endif
u_int8_t log;
u_int8_t state_flags;
-#define PFSTATE_ALLOWOPTS 0x01
-#define PFSTATE_SLOPPY 0x02
u_int8_t timeout;
u_int8_t sync_flags;
-#define PFSTATE_NOSYNC 0x01
-#define PFSTATE_FROMSYNC 0x02
-#define PFSTATE_STALE 0x04
- union {
- struct {
- RB_ENTRY(pf_state) entry_lan_ext;
- RB_ENTRY(pf_state) entry_ext_gwy;
- RB_ENTRY(pf_state) entry_id;
- TAILQ_ENTRY(pf_state) entry_list;
- struct pfi_kif *kif;
- } s;
- char ifname[IFNAMSIZ];
- } u;
- struct pf_state_peer src;
- struct pf_state_peer dst;
- union pf_rule_ptr rule;
- union pf_rule_ptr anchor;
- union pf_rule_ptr nat_rule;
- struct pf_addr rt_addr;
- struct pfi_kif *rt_kif;
- struct pf_src_node *src_node;
- struct pf_src_node *nat_src_node;
- u_int64_t packets[2];
- u_int64_t bytes[2];
- u_int32_t creation;
- u_int32_t expire;
- u_int32_t pfsync_time;
- u_int16_t tag;
-};
+ u_int8_t updates;
+} __packed;
+
+#ifdef __FreeBSD__
+#ifdef _KERNEL
+/* pfsync */
+typedef int pfsync_state_import_t(struct pfsync_state *, u_int8_t);
+typedef void pfsync_insert_state_t(struct pf_state *);
+typedef void pfsync_update_state_t(struct pf_state *);
+typedef void pfsync_delete_state_t(struct pf_state *);
+typedef void pfsync_clear_states_t(u_int32_t, const char *);
+typedef int pfsync_state_in_use_t(struct pf_state *);
+typedef int pfsync_defer_t(struct pf_state *, struct mbuf *);
+typedef int pfsync_up_t(void);
+
+extern pfsync_state_import_t *pfsync_state_import_ptr;
+extern pfsync_insert_state_t *pfsync_insert_state_ptr;
+extern pfsync_update_state_t *pfsync_update_state_ptr;
+extern pfsync_delete_state_t *pfsync_delete_state_ptr;
+extern pfsync_clear_states_t *pfsync_clear_states_ptr;
+extern pfsync_state_in_use_t *pfsync_state_in_use_ptr;
+extern pfsync_defer_t *pfsync_defer_ptr;
+extern pfsync_up_t *pfsync_up_ptr;
+
+void pfsync_state_export(struct pfsync_state *,
+ struct pf_state *);
+
+/* pflow */
+typedef int export_pflow_t(struct pf_state *);
+
+extern export_pflow_t *export_pflow_ptr;
+
+/* pflog */
+struct pf_ruleset;
+struct pf_pdesc;
+typedef int pflog_packet_t(struct pfi_kif *, struct mbuf *, sa_family_t,
+ u_int8_t, u_int8_t, struct pf_rule *, struct pf_rule *,
+ struct pf_ruleset *, struct pf_pdesc *);
+
+extern pflog_packet_t *pflog_packet_ptr;
+
+/* pf uid hack */
+VNET_DECLARE(int, debug_pfugidhack);
+#define V_debug_pfugidhack VNET(debug_pfugidhack)
+
+#define V_pf_end_threads VNET(pf_end_threads)
+#endif
+
+/* Macros to set/clear/test flags. */
+#ifdef _KERNEL
+#define SET(t, f) ((t) |= (f))
+#define CLR(t, f) ((t) &= ~(f))
+#define ISSET(t, f) ((t) & (f))
+#endif
+#endif
+
+#define PFSYNC_FLAG_SRCNODE 0x04
+#define PFSYNC_FLAG_NATSRCNODE 0x08
+
+/* for copies to/from network byte order */
+/* ioctl interface also uses network byte order */
+#define pf_state_peer_hton(s,d) do { \
+ (d)->seqlo = htonl((s)->seqlo); \
+ (d)->seqhi = htonl((s)->seqhi); \
+ (d)->seqdiff = htonl((s)->seqdiff); \
+ (d)->max_win = htons((s)->max_win); \
+ (d)->mss = htons((s)->mss); \
+ (d)->state = (s)->state; \
+ (d)->wscale = (s)->wscale; \
+ if ((s)->scrub) { \
+ (d)->scrub.pfss_flags = \
+ htons((s)->scrub->pfss_flags & PFSS_TIMESTAMP); \
+ (d)->scrub.pfss_ttl = (s)->scrub->pfss_ttl; \
+ (d)->scrub.pfss_ts_mod = htonl((s)->scrub->pfss_ts_mod);\
+ (d)->scrub.scrub_flag = PFSYNC_SCRUB_FLAG_VALID; \
+ } \
+} while (0)
+
+#define pf_state_peer_ntoh(s,d) do { \
+ (d)->seqlo = ntohl((s)->seqlo); \
+ (d)->seqhi = ntohl((s)->seqhi); \
+ (d)->seqdiff = ntohl((s)->seqdiff); \
+ (d)->max_win = ntohs((s)->max_win); \
+ (d)->mss = ntohs((s)->mss); \
+ (d)->state = (s)->state; \
+ (d)->wscale = (s)->wscale; \
+ if ((s)->scrub.scrub_flag == PFSYNC_SCRUB_FLAG_VALID && \
+ (d)->scrub != NULL) { \
+ (d)->scrub->pfss_flags = \
+ ntohs((s)->scrub.pfss_flags) & PFSS_TIMESTAMP; \
+ (d)->scrub->pfss_ttl = (s)->scrub.pfss_ttl; \
+ (d)->scrub->pfss_ts_mod = ntohl((s)->scrub.pfss_ts_mod);\
+ } \
+} while (0)
+
+#define pf_state_counter_hton(s,d) do { \
+ d[0] = htonl((s>>32)&0xffffffff); \
+ d[1] = htonl(s&0xffffffff); \
+} while (0)
+
+#define pf_state_counter_from_pfsync(s) \
+ (((u_int64_t)(s[0])<<32) | (u_int64_t)(s[1]))
+
+#define pf_state_counter_ntoh(s,d) do { \
+ d = ntohl(s[0]); \
+ d = d<<32; \
+ d += ntohl(s[1]); \
+} while (0)
TAILQ_HEAD(pf_rulequeue, pf_rule);
@@ -881,9 +1097,11 @@ RB_PROTOTYPE(pf_anchor_node, pf_anchor, entry_node, pf_anchor_compare);
#define PFR_TFLAG_INACTIVE 0x00000008
#define PFR_TFLAG_REFERENCED 0x00000010
#define PFR_TFLAG_REFDANCHOR 0x00000020
-#define PFR_TFLAG_USRMASK 0x00000003
+#define PFR_TFLAG_COUNTERS 0x00000040
+/* Adjust masks below when adding flags. */
+#define PFR_TFLAG_USRMASK 0x00000043
#define PFR_TFLAG_SETMASK 0x0000003C
-#define PFR_TFLAG_ALLMASK 0x0000003F
+#define PFR_TFLAG_ALLMASK 0x0000007F
struct pfr_table {
char pfrt_anchor[MAXPATHLEN];
@@ -894,7 +1112,7 @@ struct pfr_table {
enum { PFR_FB_NONE, PFR_FB_MATCH, PFR_FB_ADDED, PFR_FB_DELETED,
PFR_FB_CHANGED, PFR_FB_CLEARED, PFR_FB_DUPLICATE,
- PFR_FB_NOTMATCH, PFR_FB_CONFLICT, PFR_FB_MAX };
+ PFR_FB_NOTMATCH, PFR_FB_CONFLICT, PFR_FB_NOCOUNT, PFR_FB_MAX };
struct pfr_addr {
union {
@@ -944,20 +1162,32 @@ union sockaddr_union {
};
#endif /* _SOCKADDR_UNION_DEFINED */
+struct pfr_kcounters {
+ u_int64_t pfrkc_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
+ u_int64_t pfrkc_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
+};
+
SLIST_HEAD(pfr_kentryworkq, pfr_kentry);
struct pfr_kentry {
struct radix_node pfrke_node[2];
union sockaddr_union pfrke_sa;
- u_int64_t pfrke_packets[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
- u_int64_t pfrke_bytes[PFR_DIR_MAX][PFR_OP_ADDR_MAX];
SLIST_ENTRY(pfr_kentry) pfrke_workq;
+ union {
+
+ struct pfr_kcounters *pfrke_counters;
+#if 0
+ struct pfr_kroute *pfrke_route;
+#endif
+ } u;
long pfrke_tzero;
u_int8_t pfrke_af;
u_int8_t pfrke_net;
u_int8_t pfrke_not;
u_int8_t pfrke_mark;
- u_int8_t pfrke_intrpool;
};
+#define pfrke_counters u.pfrke_counters
+#define pfrke_route u.pfrke_route
+
SLIST_HEAD(pfr_ktableworkq, pfr_ktable);
RB_HEAD(pfr_ktablehead, pfr_ktable);
@@ -986,17 +1216,25 @@ struct pfr_ktable {
#define pfrkt_nomatch pfrkt_ts.pfrts_nomatch
#define pfrkt_tzero pfrkt_ts.pfrts_tzero
-RB_HEAD(pf_state_tree_lan_ext, pf_state);
-RB_PROTOTYPE(pf_state_tree_lan_ext, pf_state,
- u.s.entry_lan_ext, pf_state_compare_lan_ext);
+RB_HEAD(pf_state_tree, pf_state_key);
+RB_PROTOTYPE(pf_state_tree, pf_state_key, entry, pf_state_compare_key);
-RB_HEAD(pf_state_tree_ext_gwy, pf_state);
-RB_PROTOTYPE(pf_state_tree_ext_gwy, pf_state,
- u.s.entry_ext_gwy, pf_state_compare_ext_gwy);
+RB_HEAD(pf_state_tree_ext_gwy, pf_state_key);
+RB_PROTOTYPE(pf_state_tree_ext_gwy, pf_state_key,
+ entry_ext_gwy, pf_state_compare_ext_gwy);
-TAILQ_HEAD(pfi_statehead, pfi_kif);
RB_HEAD(pfi_ifhead, pfi_kif);
+/* state tables */
+#ifdef __FreeBSD__
+#ifdef _KERNEL
+VNET_DECLARE(struct pf_state_tree, pf_statetbl);
+#define V_pf_statetbl VNET(pf_statetbl)
+#endif
+#else
+extern struct pf_state_tree pf_statetbl;
+#endif
+
/* keep synced with pfi_kif, used in RB_FIND */
struct pfi_kif_cmp {
char pfik_name[IFNAMSIZ];
@@ -1009,12 +1247,7 @@ struct pfi_kif {
u_int64_t pfik_bytes[2][2][2];
u_int32_t pfik_tzero;
int pfik_flags;
- struct pf_state_tree_lan_ext pfik_lan_ext;
- struct pf_state_tree_ext_gwy pfik_ext_gwy;
- TAILQ_ENTRY(pfi_kif) pfik_w_states;
-#ifndef __FreeBSD__
void *pfik_ah_cookie;
-#endif
struct ifnet *pfik_ifp;
struct ifg_group *pfik_group;
int pfik_states;
@@ -1029,9 +1262,6 @@ enum pfi_kif_refs {
};
#define PFI_IFLAG_SKIP 0x0100 /* skip filtering on interface */
-/* XXX: revisist */
-#define PFI_IFLAG_SETABLE_MASK 0x0100 /* setable via DIOC{SET,CLR}IFFLAG */
-#define PFI_IFLAG_PLACEHOLDER 0x8000 /* placeholder group/interface */
struct pf_pdesc {
struct {
@@ -1050,16 +1280,22 @@ struct pf_pdesc {
#endif /* INET6 */
void *any;
} hdr;
- struct pf_addr baddr; /* address before translation */
- struct pf_addr naddr; /* address after translation */
+
struct pf_rule *nat_rule; /* nat/rdr rule applied to packet */
- struct pf_addr *src;
- struct pf_addr *dst;
struct ether_header
*eh;
+ struct pf_addr *src; /* src address */
+ struct pf_addr *dst; /* dst address */
+ u_int16_t *sport;
+ u_int16_t *dport;
+#ifdef __FreeBSD__
struct pf_mtag *pf_mtag;
- u_int16_t *ip_sum;
+#endif
+
u_int32_t p_len; /* total length of payload */
+
+ u_int16_t *ip_sum;
+ u_int16_t *proto_sum;
u_int16_t flags; /* Let SCRUB trigger behavior in
* state code. Easier than tags */
#define PFDESC_TCP_NORM 0x0001 /* TCP shall be statefully scrubbed */
@@ -1067,6 +1303,9 @@ struct pf_pdesc {
sa_family_t af;
u_int8_t proto;
u_int8_t tos;
+ u_int8_t dir; /* direction */
+ u_int8_t sidx; /* key index for source */
+ u_int8_t didx; /* key index for destination */
};
/* flags for RDR options */
@@ -1175,6 +1414,15 @@ struct pf_pdesc {
*(a) = (x); \
} while (0)
+#ifdef __FreeBSD__
+#define REASON_SET(a, x) \
+ do { \
+ if ((a) != NULL) \
+ *(a) = (x); \
+ if (x < PFRES_MAX) \
+ V_pf_status.counters[x]++; \
+ } while (0)
+#else
#define REASON_SET(a, x) \
do { \
if ((a) != NULL) \
@@ -1182,6 +1430,7 @@ struct pf_pdesc {
if (x < PFRES_MAX) \
pf_status.counters[x]++; \
} while (0)
+#endif
struct pf_status {
u_int64_t counters[PFRES_MAX];
@@ -1265,27 +1514,6 @@ struct pf_altq {
u_int32_t qid; /* return value */
};
-#ifndef __FreeBSD__
-
-#define PF_TAG_GENERATED 0x01
-#define PF_TAG_FRAGCACHE 0x02
-#define PF_TAG_TRANSLATE_LOCALHOST 0x04
-
-struct pf_mtag {
- void *hdr; /* saved hdr pos in mbuf, for ECN */
- u_int rtableid; /* alternate routing table id */
- u_int32_t qid; /* queue id */
- u_int16_t tag; /* tag id */
- u_int8_t flags;
- u_int8_t routed;
- sa_family_t af; /* for ECN */
-};
-#endif
-
-struct pf_tag {
- u_int16_t tag; /* tag id */
-};
-
struct pf_tagname {
TAILQ_ENTRY(pf_tagname) entries;
char name[PF_TAG_NAME_SIZE];
@@ -1293,6 +1521,14 @@ struct pf_tagname {
int ref;
};
+struct pf_divert {
+ union {
+ struct in_addr ipv4;
+ struct in6_addr ipv6;
+ } addr;
+ u_int16_t port;
+};
+
#define PFFRAG_FRENT_HIWAT 5000 /* Number of fragment entries */
#define PFFRAG_FRAG_HIWAT 1000 /* Number of fragmented packets */
#define PFFRAG_FRCENT_HIWAT 50000 /* Number of fragment cache entries */
@@ -1343,31 +1579,32 @@ struct pfioc_natlook {
};
struct pfioc_state {
- u_int32_t nr;
- struct pf_state state;
+ struct pfsync_state state;
};
struct pfioc_src_node_kill {
- /* XXX returns the number of src nodes killed in psnk_af */
sa_family_t psnk_af;
struct pf_rule_addr psnk_src;
struct pf_rule_addr psnk_dst;
+ u_int psnk_killed;
};
struct pfioc_state_kill {
- /* XXX returns the number of states killed in psk_af */
+ struct pf_state_cmp psk_pfcmp;
sa_family_t psk_af;
int psk_proto;
struct pf_rule_addr psk_src;
struct pf_rule_addr psk_dst;
char psk_ifname[IFNAMSIZ];
+ char psk_label[PF_RULE_LABEL_SIZE];
+ u_int psk_killed;
};
struct pfioc_states {
int ps_len;
union {
- caddr_t psu_buf;
- struct pf_state *psu_states;
+ caddr_t psu_buf;
+ struct pfsync_state *psu_states;
} ps_u;
#define ps_buf ps_u.psu_buf
#define ps_states ps_u.psu_states
@@ -1518,55 +1755,97 @@ struct pfioc_iface {
#define DIOCRDELTABLES _IOWR('D', 62, struct pfioc_table)
#define DIOCRGETTABLES _IOWR('D', 63, struct pfioc_table)
#define DIOCRGETTSTATS _IOWR('D', 64, struct pfioc_table)
-#define DIOCRCLRTSTATS _IOWR('D', 65, struct pfioc_table)
+#define DIOCRCLRTSTATS _IOWR('D', 65, struct pfioc_table)
#define DIOCRCLRADDRS _IOWR('D', 66, struct pfioc_table)
#define DIOCRADDADDRS _IOWR('D', 67, struct pfioc_table)
#define DIOCRDELADDRS _IOWR('D', 68, struct pfioc_table)
#define DIOCRSETADDRS _IOWR('D', 69, struct pfioc_table)
#define DIOCRGETADDRS _IOWR('D', 70, struct pfioc_table)
#define DIOCRGETASTATS _IOWR('D', 71, struct pfioc_table)
-#define DIOCRCLRASTATS _IOWR('D', 72, struct pfioc_table)
+#define DIOCRCLRASTATS _IOWR('D', 72, struct pfioc_table)
#define DIOCRTSTADDRS _IOWR('D', 73, struct pfioc_table)
#define DIOCRSETTFLAGS _IOWR('D', 74, struct pfioc_table)
-#define DIOCRINADEFINE _IOWR('D', 77, struct pfioc_table)
-#define DIOCOSFPFLUSH _IO('D', 78)
-#define DIOCOSFPADD _IOWR('D', 79, struct pf_osfp_ioctl)
-#define DIOCOSFPGET _IOWR('D', 80, struct pf_osfp_ioctl)
-#define DIOCXBEGIN _IOWR('D', 81, struct pfioc_trans)
-#define DIOCXCOMMIT _IOWR('D', 82, struct pfioc_trans)
-#define DIOCXROLLBACK _IOWR('D', 83, struct pfioc_trans)
-#define DIOCGETSRCNODES _IOWR('D', 84, struct pfioc_src_nodes)
-#define DIOCCLRSRCNODES _IO('D', 85)
-#define DIOCSETHOSTID _IOWR('D', 86, u_int32_t)
-#define DIOCIGETIFACES _IOWR('D', 87, struct pfioc_iface)
-#define DIOCSETIFFLAG _IOWR('D', 89, struct pfioc_iface)
-#define DIOCCLRIFFLAG _IOWR('D', 90, struct pfioc_iface)
-#define DIOCKILLSRCNODES _IOWR('D', 91, struct pfioc_src_node_kill)
+#define DIOCRINADEFINE _IOWR('D', 77, struct pfioc_table)
+#define DIOCOSFPFLUSH _IO('D', 78)
+#define DIOCOSFPADD _IOWR('D', 79, struct pf_osfp_ioctl)
+#define DIOCOSFPGET _IOWR('D', 80, struct pf_osfp_ioctl)
+#define DIOCXBEGIN _IOWR('D', 81, struct pfioc_trans)
+#define DIOCXCOMMIT _IOWR('D', 82, struct pfioc_trans)
+#define DIOCXROLLBACK _IOWR('D', 83, struct pfioc_trans)
+#define DIOCGETSRCNODES _IOWR('D', 84, struct pfioc_src_nodes)
+#define DIOCCLRSRCNODES _IO('D', 85)
+#define DIOCSETHOSTID _IOWR('D', 86, u_int32_t)
+#define DIOCIGETIFACES _IOWR('D', 87, struct pfioc_iface)
+#define DIOCSETIFFLAG _IOWR('D', 89, struct pfioc_iface)
+#define DIOCCLRIFFLAG _IOWR('D', 90, struct pfioc_iface)
+#define DIOCKILLSRCNODES _IOWR('D', 91, struct pfioc_src_node_kill)
#ifdef __FreeBSD__
struct pf_ifspeed {
char ifname[IFNAMSIZ];
u_int32_t baudrate;
};
-#define DIOCGIFSPEED _IOWR('D', 92, struct pf_ifspeed)
+#define DIOCGIFSPEED _IOWR('D', 92, struct pf_ifspeed)
#endif
#ifdef _KERNEL
RB_HEAD(pf_src_tree, pf_src_node);
RB_PROTOTYPE(pf_src_tree, pf_src_node, entry, pf_src_compare);
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pf_src_tree, tree_src_tracking);
+#define V_tree_src_tracking VNET(tree_src_tracking)
+#else
extern struct pf_src_tree tree_src_tracking;
+#endif
RB_HEAD(pf_state_tree_id, pf_state);
RB_PROTOTYPE(pf_state_tree_id, pf_state,
entry_id, pf_state_compare_id);
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pf_state_tree_id, tree_id);
+#define V_tree_id VNET(tree_id)
+VNET_DECLARE(struct pf_state_queue, state_list);
+#define V_state_list VNET(state_list)
+#else
extern struct pf_state_tree_id tree_id;
extern struct pf_state_queue state_list;
+#endif
TAILQ_HEAD(pf_poolqueue, pf_pool);
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pf_poolqueue, pf_pools[2]);
+#define V_pf_pools VNET(pf_pools)
+#else
extern struct pf_poolqueue pf_pools[2];
+#endif
TAILQ_HEAD(pf_altqqueue, pf_altq);
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pf_altqqueue, pf_altqs[2]);
+#define V_pf_altqs VNET(pf_altqs)
+VNET_DECLARE(struct pf_palist, pf_pabuf);
+#define V_pf_pabuf VNET(pf_pabuf)
+#else
extern struct pf_altqqueue pf_altqs[2];
extern struct pf_palist pf_pabuf;
+#endif
+#ifdef __FreeBSD__
+VNET_DECLARE(u_int32_t, ticket_altqs_active);
+#define V_ticket_altqs_active VNET(ticket_altqs_active)
+VNET_DECLARE(u_int32_t, ticket_altqs_inactive);
+#define V_ticket_altqs_inactive VNET(ticket_altqs_inactive)
+VNET_DECLARE(int, altqs_inactive_open);
+#define V_altqs_inactive_open VNET(altqs_inactive_open)
+VNET_DECLARE(u_int32_t, ticket_pabuf);
+#define V_ticket_pabuf VNET(ticket_pabuf)
+VNET_DECLARE(struct pf_altqqueue *, pf_altqs_active);
+#define V_pf_altqs_active VNET(pf_altqs_active)
+VNET_DECLARE(struct pf_altqqueue *, pf_altqs_inactive);
+#define V_pf_altqs_inactive VNET(pf_altqs_inactive)
+VNET_DECLARE(struct pf_poolqueue *, pf_pools_active);
+#define V_pf_pools_active VNET(pf_pools_active)
+VNET_DECLARE(struct pf_poolqueue *, pf_pools_inactive);
+#define V_pf_pools_inactive VNET(pf_pools_inactive)
+#else
extern u_int32_t ticket_altqs_active;
extern u_int32_t ticket_altqs_inactive;
extern int altqs_inactive_open;
@@ -1575,6 +1854,7 @@ extern struct pf_altqqueue *pf_altqs_active;
extern struct pf_altqqueue *pf_altqs_inactive;
extern struct pf_poolqueue *pf_pools_active;
extern struct pf_poolqueue *pf_pools_inactive;
+#endif
extern int pf_tbladdr_setup(struct pf_ruleset *,
struct pf_addr_wrap *);
extern void pf_tbladdr_remove(struct pf_addr_wrap *);
@@ -1582,49 +1862,82 @@ extern void pf_tbladdr_copyout(struct pf_addr_wrap *);
extern void pf_calc_skip_steps(struct pf_rulequeue *);
#ifdef __FreeBSD__
#ifdef ALTQ
-extern void pf_altq_ifnet_event(struct ifnet *, int);
+extern void pf_altq_ifnet_event(struct ifnet *, int);
#endif
-extern uma_zone_t pf_src_tree_pl, pf_rule_pl;
-extern uma_zone_t pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
-extern uma_zone_t pfr_ktable_pl, pfr_kentry_pl, pfr_kentry_pl2;
-extern uma_zone_t pf_cache_pl, pf_cent_pl;
-extern uma_zone_t pf_state_scrub_pl;
-extern uma_zone_t pfi_addr_pl;
+VNET_DECLARE(uma_zone_t, pf_src_tree_pl);
+#define V_pf_src_tree_pl VNET(pf_src_tree_pl)
+VNET_DECLARE(uma_zone_t, pf_rule_pl);
+#define V_pf_rule_pl VNET(pf_rule_pl)
+VNET_DECLARE(uma_zone_t, pf_state_pl);
+#define V_pf_state_pl VNET(pf_state_pl)
+VNET_DECLARE(uma_zone_t, pf_state_key_pl);
+#define V_pf_state_key_pl VNET(pf_state_key_pl)
+VNET_DECLARE(uma_zone_t, pf_state_item_pl);
+#define V_pf_state_item_pl VNET(pf_state_item_pl)
+VNET_DECLARE(uma_zone_t, pf_altq_pl);
+#define V_pf_altq_pl VNET(pf_altq_pl)
+VNET_DECLARE(uma_zone_t, pf_pooladdr_pl);
+#define V_pf_pooladdr_pl VNET(pf_pooladdr_pl)
+VNET_DECLARE(uma_zone_t, pfr_ktable_pl);
+#define V_pfr_ktable_pl VNET(pfr_ktable_pl)
+VNET_DECLARE(uma_zone_t, pfr_kentry_pl);
+#define V_pfr_kentry_pl VNET(pfr_kentry_pl)
+VNET_DECLARE(uma_zone_t, pf_cache_pl);
+#define V_pf_cache_pl VNET(pf_cache_pl)
+VNET_DECLARE(uma_zone_t, pf_cent_pl);
+#define V_pf_cent_pl VNET(pf_cent_pl)
+VNET_DECLARE(uma_zone_t, pf_state_scrub_pl);
+#define V_pf_state_scrub_pl VNET(pf_state_scrub_pl)
+VNET_DECLARE(uma_zone_t, pfi_addr_pl);
+#define V_pfi_addr_pl VNET(pfi_addr_pl)
#else
extern struct pool pf_src_tree_pl, pf_rule_pl;
-extern struct pool pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
+extern struct pool pf_state_pl, pf_state_key_pl, pf_state_item_pl,
+ pf_altq_pl, pf_pooladdr_pl;
extern struct pool pf_state_scrub_pl;
#endif
extern void pf_purge_thread(void *);
#ifdef __FreeBSD__
extern int pf_purge_expired_src_nodes(int);
-extern int pf_purge_expired_states(u_int32_t, int);
+extern int pf_purge_expired_states(u_int32_t , int);
#else
extern void pf_purge_expired_src_nodes(int);
extern void pf_purge_expired_states(u_int32_t);
#endif
extern void pf_unlink_state(struct pf_state *);
extern void pf_free_state(struct pf_state *);
-extern int pf_insert_state(struct pfi_kif *,
+extern int pf_state_insert(struct pfi_kif *,
+ struct pf_state_key *,
+ struct pf_state_key *,
struct pf_state *);
extern int pf_insert_src_node(struct pf_src_node **,
struct pf_rule *, struct pf_addr *,
sa_family_t);
void pf_src_tree_remove_state(struct pf_state *);
extern struct pf_state *pf_find_state_byid(struct pf_state_cmp *);
-extern struct pf_state *pf_find_state_all(struct pf_state_cmp *key,
- u_int8_t tree, int *more);
+extern struct pf_state *pf_find_state_all(struct pf_state_key_cmp *,
+ u_int, int *);
extern void pf_print_state(struct pf_state *);
extern void pf_print_flags(u_int8_t);
extern u_int16_t pf_cksum_fixup(u_int16_t, u_int16_t, u_int16_t,
u_int8_t);
+#ifdef __FreeBSD__
+VNET_DECLARE(struct ifnet *, sync_ifp);
+#define V_sync_ifp VNET(sync_ifp);
+VNET_DECLARE(struct pf_rule, pf_default_rule);
+#define V_pf_default_rule VNET(pf_default_rule)
+#else
extern struct ifnet *sync_ifp;
extern struct pf_rule pf_default_rule;
+#endif
extern void pf_addrcpy(struct pf_addr *, struct pf_addr *,
u_int8_t);
void pf_rm_rule(struct pf_rulequeue *,
struct pf_rule *);
+#ifndef __FreeBSD__
+struct pf_divert *pf_find_divert(struct mbuf *);
+#endif
#ifdef INET
#ifdef __FreeBSD__
@@ -1656,8 +1969,11 @@ void pf_change_a(void *, u_int16_t *, u_int32_t, u_int8_t);
int pflog_packet(struct pfi_kif *, struct mbuf *, sa_family_t, u_int8_t,
u_int8_t, struct pf_rule *, struct pf_rule *, struct pf_ruleset *,
struct pf_pdesc *);
+void pf_send_deferred_syn(struct pf_state *);
int pf_match_addr(u_int8_t, struct pf_addr *, struct pf_addr *,
struct pf_addr *, sa_family_t);
+int pf_match_addr_range(struct pf_addr *, struct pf_addr *,
+ struct pf_addr *, sa_family_t);
int pf_match(u_int8_t, u_int32_t, u_int32_t, u_int32_t);
int pf_match_port(u_int8_t, u_int16_t, u_int16_t, u_int16_t);
int pf_match_uid(u_int8_t, uid_t, uid_t, uid_t);
@@ -1682,10 +1998,13 @@ void pf_purge_expired_fragments(void);
int pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *);
int pf_rtlabel_match(struct pf_addr *, sa_family_t, struct pf_addr_wrap *);
#ifdef __FreeBSD__
-int pf_socket_lookup(int, struct pf_pdesc *, struct inpcb *);
+int pf_socket_lookup(int, struct pf_pdesc *, struct inpcb *);
#else
int pf_socket_lookup(int, struct pf_pdesc *);
#endif
+struct pf_state_key *pf_alloc_state_key(int);
+void pf_pkt_addr_changed(struct mbuf *);
+int pf_state_key_attach(struct pf_state_key *, struct pf_state *, int);
void pfr_initialize(void);
int pfr_match_addr(struct pfr_ktable *, struct pf_addr *, sa_family_t);
void pfr_update_stats(struct pfr_ktable *, struct pf_addr *, sa_family_t,
@@ -1694,7 +2013,7 @@ int pfr_pool_get(struct pfr_ktable *, int *, struct pf_addr *,
struct pf_addr **, struct pf_addr **, sa_family_t);
void pfr_dynaddr_update(struct pfr_ktable *, struct pfi_dynaddr *);
struct pfr_ktable *
- pfr_attach_table(struct pf_ruleset *, char *);
+ pfr_attach_table(struct pf_ruleset *, char *, int);
void pfr_detach_table(struct pfr_ktable *);
int pfr_clr_tables(struct pfr_table *, int *, int);
int pfr_add_tables(struct pfr_table *, int, int *, int);
@@ -1723,8 +2042,12 @@ int pfr_ina_commit(struct pfr_table *, u_int32_t, int *, int *, int);
int pfr_ina_define(struct pfr_table *, struct pfr_addr *, int, int *,
int *, u_int32_t, int);
-extern struct pfi_statehead pfi_statehead;
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pfi_kif *, pfi_all);
+#define V_pfi_all VNET(pfi_all)
+#else
extern struct pfi_kif *pfi_all;
+#endif
void pfi_initialize(void);
#ifdef __FreeBSD__
@@ -1744,30 +2067,44 @@ int pfi_match_addr(struct pfi_dynaddr *, struct pf_addr *,
int pfi_dynaddr_setup(struct pf_addr_wrap *, sa_family_t);
void pfi_dynaddr_remove(struct pf_addr_wrap *);
void pfi_dynaddr_copyout(struct pf_addr_wrap *);
-void pfi_fill_oldstatus(struct pf_status *);
-int pfi_clr_istats(const char *);
+void pfi_update_status(const char *, struct pf_status *);
int pfi_get_ifaces(const char *, struct pfi_kif *, int *);
int pfi_set_flags(const char *, int);
int pfi_clear_flags(const char *, int);
+#ifdef __FreeBSD__
+int pf_match_tag(struct mbuf *, struct pf_rule *, int *,
+ struct pf_mtag *);
+#else
+int pf_match_tag(struct mbuf *, struct pf_rule *, int *);
+#endif
u_int16_t pf_tagname2tag(char *);
void pf_tag2tagname(u_int16_t, char *);
void pf_tag_ref(u_int16_t);
void pf_tag_unref(u_int16_t);
-int pf_tag_packet(struct mbuf *, struct pf_mtag *, int, int);
+#ifdef __FreeBSD__
+int pf_tag_packet(struct mbuf *, int, int, struct pf_mtag *);
+#else
+int pf_tag_packet(struct mbuf *, int, int);
+#endif
u_int32_t pf_qname2qid(char *);
void pf_qid2qname(u_int32_t, char *);
void pf_qid_unref(u_int32_t);
-#ifndef __FreeBSD__
-struct pf_mtag *pf_find_mtag(struct mbuf *);
-struct pf_mtag *pf_get_mtag(struct mbuf *);
-#endif
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pf_status, pf_status);
+#define V_pf_status VNET(pf_status)
+#else
extern struct pf_status pf_status;
+#endif
#ifdef __FreeBSD__
-extern uma_zone_t pf_frent_pl, pf_frag_pl;
-extern struct sx pf_consistency_lock;
+VNET_DECLARE(uma_zone_t, pf_frent_pl);
+#define V_pf_frent_pl VNET(pf_frent_pl)
+VNET_DECLARE(uma_zone_t, pf_frag_pl);
+#define V_pf_frag_pl VNET(pf_frag_pl)
+VNET_DECLARE(struct sx, pf_consistency_lock);
+#define V_pf_consistency_lock VNET(pf_consistency_lock)
#else
extern struct pool pf_frent_pl, pf_frag_pl;
extern struct rwlock pf_consistency_lock;
@@ -1777,7 +2114,12 @@ struct pf_pool_limit {
void *pp;
unsigned limit;
};
+#ifdef __FreeBSD__
+VNET_DECLARE(struct pf_pool_limit, pf_pool_limits[PF_LIMIT_MAX]);
+#define V_pf_pool_limits VNET(pf_pool_limits)
+#else
extern struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX];
+#endif
#ifdef __FreeBSD__
struct pf_frent {
@@ -1788,34 +2130,44 @@ struct pf_frent {
struct pf_frcache {
LIST_ENTRY(pf_frcache) fr_next;
- uint16_t fr_off;
- uint16_t fr_end;
+ uint16_t fr_off;
+ uint16_t fr_end;
};
struct pf_fragment {
RB_ENTRY(pf_fragment) fr_entry;
TAILQ_ENTRY(pf_fragment) frag_next;
- struct in_addr fr_src;
- struct in_addr fr_dst;
- u_int8_t fr_p; /* protocol of this fragment */
- u_int8_t fr_flags; /* status flags */
- u_int16_t fr_id; /* fragment id for reassemble */
- u_int16_t fr_max; /* fragment data max */
- u_int32_t fr_timeout;
-#define fr_queue fr_u.fru_queue
-#define fr_cache fr_u.fru_cache
+ struct in_addr fr_src;
+ struct in_addr fr_dst;
+ u_int8_t fr_p; /* protocol of this fragment */
+ u_int8_t fr_flags; /* status flags */
+ u_int16_t fr_id; /* fragment id for reassemble */
+ u_int16_t fr_max; /* fragment data max */
+ u_int32_t fr_timeout;
+#define fr_queue fr_u.fru_queue
+#define fr_cache fr_u.fru_cache
union {
- LIST_HEAD(pf_fragq, pf_frent) fru_queue; /* buffering */
- LIST_HEAD(pf_cacheq, pf_frcache) fru_cache; /* non-buf */
+ LIST_HEAD(pf_fragq, pf_frent) fru_queue; /* buffering */
+ LIST_HEAD(pf_cacheq, pf_frcache) fru_cache; /* non-buf */
} fr_u;
};
#endif /* (__FreeBSD__) */
#endif /* _KERNEL */
-extern struct pf_anchor_global pf_anchors;
-extern struct pf_anchor pf_main_anchor;
+#ifdef __FreeBSD__
+#ifdef _KERNEL
+VNET_DECLARE(struct pf_anchor_global, pf_anchors);
+#define V_pf_anchors VNET(pf_anchors)
+VNET_DECLARE(struct pf_anchor, pf_main_anchor);
+#define V_pf_main_anchor VNET(pf_main_anchor)
+#define pf_main_ruleset V_pf_main_anchor.ruleset
+#endif
+#else
+extern struct pf_anchor_global pf_anchors;
+extern struct pf_anchor pf_main_anchor;
#define pf_main_ruleset pf_main_anchor.ruleset
+#endif
/* these ruleset functions can be linked into userland programs (pfctl) */
int pf_get_ruleset_number(u_int8_t);
@@ -1832,7 +2184,6 @@ struct pf_ruleset *pf_find_or_create_ruleset(const char *);
void pf_rs_initialize(void);
#ifndef __FreeBSD__
-/* ?!? */
#ifdef _KERNEL
int pf_anchor_copyout(const struct pf_ruleset *,
const struct pf_rule *, struct pfioc_rule *);
@@ -1863,4 +2214,31 @@ int pf_osfp_match(struct pf_osfp_enlist *, pf_osfp_t);
struct pf_os_fingerprint *
pf_osfp_validate(void);
+#ifdef _KERNEL
+void pf_print_host(struct pf_addr *, u_int16_t, u_int8_t);
+
+void pf_step_into_anchor(int *, struct pf_ruleset **, int,
+ struct pf_rule **, struct pf_rule **, int *);
+int pf_step_out_of_anchor(int *, struct pf_ruleset **,
+ int, struct pf_rule **, struct pf_rule **,
+ int *);
+
+int pf_map_addr(u_int8_t, struct pf_rule *,
+ struct pf_addr *, struct pf_addr *,
+ struct pf_addr *, struct pf_src_node **);
+struct pf_rule *pf_get_translation(struct pf_pdesc *, struct mbuf *,
+ int, int, struct pfi_kif *, struct pf_src_node **,
+ struct pf_state_key **, struct pf_state_key **,
+ struct pf_state_key **, struct pf_state_key **,
+ struct pf_addr *, struct pf_addr *,
+ u_int16_t, u_int16_t);
+
+int pf_state_key_setup(struct pf_pdesc *, struct pf_rule *,
+ struct pf_state_key **, struct pf_state_key **,
+ struct pf_state_key **, struct pf_state_key **,
+ struct pf_addr *, struct pf_addr *,
+ u_int16_t, u_int16_t);
+#endif /* _KERNEL */
+
+
#endif /* _NET_PFVAR_H_ */
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index 3cef351..9352be9 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -151,6 +151,7 @@ static ACPI_STATUS acpi_sleep_disable(struct acpi_softc *sc);
static ACPI_STATUS acpi_EnterSleepState(struct acpi_softc *sc, int state);
static void acpi_shutdown_final(void *arg, int howto);
static void acpi_enable_fixed_events(struct acpi_softc *sc);
+static BOOLEAN acpi_has_hid(ACPI_HANDLE handle);
static int acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate);
static int acpi_wake_run_prep(ACPI_HANDLE handle, int sstate);
static int acpi_wake_prep_walk(int sstate);
@@ -1243,7 +1244,7 @@ acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
/*
* First attempt at allocating the resource. For direct children,
* use resource_list_alloc() to handle reserved resources. For
- * other dveices, pass the request up to our parent.
+ * other devices, pass the request up to our parent.
*/
if (bus == device_get_parent(child)) {
ad = device_get_ivars(child);
@@ -1855,6 +1856,13 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
break;
if (acpi_parse_prw(handle, &prw) == 0)
AcpiSetupGpeForWake(handle, prw.gpe_handle, prw.gpe_bit);
+
+ /*
+ * Ignore devices that do not have a _HID or _CID. They should
+ * be discovered by other buses (e.g. the PCI bus driver).
+ */
+ if (!acpi_has_hid(handle))
+ break;
/* FALLTHROUGH */
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_THERMAL:
@@ -2043,6 +2051,30 @@ acpi_BatteryIsPresent(device_t dev)
}
/*
+ * Returns true if a device has at least one valid device ID.
+ */
+static BOOLEAN
+acpi_has_hid(ACPI_HANDLE h)
+{
+ ACPI_DEVICE_INFO *devinfo;
+ BOOLEAN ret;
+
+ if (h == NULL ||
+ ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)))
+ return (FALSE);
+
+ ret = FALSE;
+ if ((devinfo->Valid & ACPI_VALID_HID) != 0)
+ ret = TRUE;
+ else if ((devinfo->Valid & ACPI_VALID_CID) != 0)
+ if (devinfo->CompatibleIdList.Count > 0)
+ ret = TRUE;
+
+ AcpiOsFree(devinfo);
+ return (ret);
+}
+
+/*
* Match a HID string against a handle
*/
BOOLEAN
diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c
index 8cb6858..d26903d 100644
--- a/sys/dev/acpica/acpi_cpu.c
+++ b/sys/dev/acpica/acpi_cpu.c
@@ -856,6 +856,8 @@ acpi_cpu_cx_list(struct acpi_cpu_softc *sc)
sbuf_printf(&sb, "C%d/%d ", i + 1, sc->cpu_cx_states[i].trans_lat);
if (sc->cpu_cx_states[i].type < ACPI_STATE_C3)
sc->cpu_non_c3 = i;
+ else
+ cpu_can_deep_sleep = 1;
}
sbuf_trim(&sb);
sbuf_finish(&sb);
@@ -925,11 +927,9 @@ acpi_cpu_idle()
/* Find the lowest state that has small enough latency. */
cx_next_idx = 0;
-#ifndef __ia64__
if (cpu_disable_deep_sleep)
i = min(sc->cpu_cx_lowest, sc->cpu_non_c3);
else
-#endif
i = sc->cpu_cx_lowest;
for (; i >= 0; i--) {
if (sc->cpu_cx_states[i].trans_lat * 3 <= sc->cpu_prev_sleep) {
diff --git a/sys/dev/acpica/acpi_pci.c b/sys/dev/acpica/acpi_pci.c
index 76cbacb..44db74a 100644
--- a/sys/dev/acpica/acpi_pci.c
+++ b/sys/dev/acpica/acpi_pci.c
@@ -209,38 +209,24 @@ acpi_pci_update_device(ACPI_HANDLE handle, device_t pci_child)
device_t child;
/*
- * Lookup and remove the unused device that acpi0 creates when it walks
- * the namespace creating devices.
+ * Occasionally a PCI device may show up as an ACPI device
+ * with a _HID. (For example, the TabletPC TC1000 has a
+ * second PCI-ISA bridge that has a _HID for an
+ * acpi_sysresource device.) In that case, leave ACPI-CA's
+ * device data pointing at the ACPI-enumerated device.
*/
child = acpi_get_device(handle);
if (child != NULL) {
- if (device_is_alive(child)) {
- /*
- * The TabletPC TC1000 has a second PCI-ISA bridge
- * that has a _HID for an acpi_sysresource device.
- * In that case, leave ACPI-CA's device data pointing
- * at the ACPI-enumerated device.
- */
- device_printf(child,
- "Conflicts with PCI device %d:%d:%d\n",
- pci_get_bus(pci_child), pci_get_slot(pci_child),
- pci_get_function(pci_child));
- return;
- }
KASSERT(device_get_parent(child) ==
devclass_get_device(devclass_find("acpi"), 0),
("%s: child (%s)'s parent is not acpi0", __func__,
acpi_name(handle)));
- device_delete_child(device_get_parent(child), child);
+ return;
}
/*
* Update ACPI-CA to use the PCI enumerated device_t for this handle.
*/
- status = AcpiDetachData(handle, acpi_fake_objhandler);
- if (ACPI_FAILURE(status))
- printf("WARNING: Unable to detach object data from %s - %s\n",
- acpi_name(handle), AcpiFormatException(status));
status = AcpiAttachData(handle, acpi_fake_objhandler, pci_child);
if (ACPI_FAILURE(status))
printf("WARNING: Unable to attach object data to %s - %s\n",
diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c
index e4efeff..99e3f1f 100644
--- a/sys/dev/acpica/acpi_pcib_acpi.c
+++ b/sys/dev/acpica/acpi_pcib_acpi.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/rman.h>
@@ -62,6 +63,9 @@ struct acpi_hpcib_softc {
int ap_bus; /* bios-assigned bus number */
ACPI_BUFFER ap_prt; /* interrupt routing table */
+#ifdef NEW_PCIB
+ struct pcib_host_resources ap_host_res;
+#endif
};
static int acpi_pcib_acpi_probe(device_t bus);
@@ -87,6 +91,11 @@ static struct resource *acpi_pcib_acpi_alloc_resource(device_t dev,
device_t child, int type, int *rid,
u_long start, u_long end, u_long count,
u_int flags);
+#ifdef NEW_PCIB
+static int acpi_pcib_acpi_adjust_resource(device_t dev,
+ device_t child, int type, struct resource *r,
+ u_long start, u_long end);
+#endif
static device_method_t acpi_pcib_acpi_methods[] = {
/* Device interface */
@@ -101,7 +110,11 @@ static device_method_t acpi_pcib_acpi_methods[] = {
DEVMETHOD(bus_read_ivar, acpi_pcib_read_ivar),
DEVMETHOD(bus_write_ivar, acpi_pcib_write_ivar),
DEVMETHOD(bus_alloc_resource, acpi_pcib_acpi_alloc_resource),
+#ifdef NEW_PCIB
+ DEVMETHOD(bus_adjust_resource, acpi_pcib_acpi_adjust_resource),
+#else
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
+#endif
DEVMETHOD(bus_release_resource, bus_generic_release_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
@@ -149,6 +162,113 @@ acpi_pcib_acpi_probe(device_t dev)
return (0);
}
+#ifdef NEW_PCIB
+static ACPI_STATUS
+acpi_pcib_producer_handler(ACPI_RESOURCE *res, void *context)
+{
+ struct acpi_hpcib_softc *sc;
+ UINT64 length, min, max;
+ u_int flags;
+ int error, type;
+
+ sc = context;
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+ case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+ panic("host bridge has depenedent resources");
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+ if (res->Data.Address.ProducerConsumer != ACPI_PRODUCER)
+ break;
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ min = res->Data.Address16.Minimum;
+ max = res->Data.Address16.Maximum;
+ length = res->Data.Address16.AddressLength;
+ break;
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ min = res->Data.Address32.Minimum;
+ max = res->Data.Address32.Maximum;
+ length = res->Data.Address32.AddressLength;
+ break;
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ min = res->Data.Address64.Minimum;
+ max = res->Data.Address64.Maximum;
+ length = res->Data.Address64.AddressLength;
+ break;
+ default:
+ KASSERT(res->Type ==
+ ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
+ ("should never happen"));
+ min = res->Data.ExtAddress64.Minimum;
+ max = res->Data.ExtAddress64.Maximum;
+ length = res->Data.ExtAddress64.AddressLength;
+ break;
+ }
+ if (length == 0 ||
+ res->Data.Address.MinAddressFixed != ACPI_ADDRESS_FIXED ||
+ res->Data.Address.MaxAddressFixed != ACPI_ADDRESS_FIXED)
+ break;
+ flags = 0;
+ switch (res->Data.Address.ResourceType) {
+ case ACPI_MEMORY_RANGE:
+ type = SYS_RES_MEMORY;
+ if (res->Type != ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64) {
+ if (res->Data.Address.Info.Mem.Caching ==
+ ACPI_PREFETCHABLE_MEMORY)
+ flags |= RF_PREFETCHABLE;
+ } else {
+ /*
+ * XXX: Parse prefetch flag out of
+ * TypeSpecific.
+ */
+ }
+ break;
+ case ACPI_IO_RANGE:
+ type = SYS_RES_IOPORT;
+ break;
+#ifdef PCI_RES_BUS
+ case ACPI_BUS_NUMBER_RANGE:
+ type = PCI_RES_BUS;
+ break;
+#endif
+ default:
+ return (AE_OK);
+ }
+
+ if (min + length - 1 != max)
+ device_printf(sc->ap_dev,
+ "Length mismatch for %d range: %jx vs %jx\n", type,
+ (uintmax_t)max - min + 1, (uintmax_t)length);
+#ifdef __i386__
+ if (min > ULONG_MAX) {
+ device_printf(sc->ap_dev,
+ "Ignoring %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)min, (uintmax_t)max);
+ break;
+ }
+ if (max > ULONG_MAX) {
+ device_printf(sc->ap_dev,
+ "Truncating end of %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)min, (uintmax_t)max);
+ max = ULONG_MAX;
+ }
+#endif
+ error = pcib_host_res_decodes(&sc->ap_host_res, type, min, max,
+ flags);
+ if (error)
+ panic("Failed to manage %d range (%#jx-%#jx): %d",
+ type, (uintmax_t)min, (uintmax_t)max, error);
+ break;
+ default:
+ break;
+ }
+ return (AE_OK);
+}
+#endif
+
static int
acpi_pcib_acpi_attach(device_t dev)
{
@@ -179,6 +299,22 @@ acpi_pcib_acpi_attach(device_t dev)
sc->ap_segment = 0;
}
+#ifdef NEW_PCIB
+ /*
+ * Determine which address ranges this bridge decodes and setup
+ * resource managers for those ranges.
+ */
+ if (pcib_host_res_init(sc->ap_dev, &sc->ap_host_res) != 0)
+ panic("failed to init hostb resources");
+ if (!acpi_disabled("hostres")) {
+ status = AcpiWalkResources(sc->ap_handle, "_CRS",
+ acpi_pcib_producer_handler, sc);
+ if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
+ device_printf(sc->ap_dev, "failed to parse resources: %s\n",
+ AcpiFormatException(status));
+ }
+#endif
+
/*
* Get our base bus number by evaluating _BBN.
* If this doesn't work, we assume we're bus number 0.
@@ -357,32 +493,37 @@ acpi_pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr,
return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data));
}
-static u_long acpi_host_mem_start = 0x80000000;
-TUNABLE_ULONG("hw.acpi.host_mem_start", &acpi_host_mem_start);
-
struct resource *
acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
- /*
- * If no memory preference is given, use upper 32MB slot most
- * bioses use for their memory window. Typically other bridges
- * before us get in the way to assert their preferences on memory.
- * Hardcoding like this sucks, so a more MD/MI way needs to be
- * found to do it. This is typically only used on older laptops
- * that don't have pci busses behind pci bridge, so assuming > 32MB
- * is likely OK.
- *
- * PCI-PCI bridges may allocate smaller ranges for their windows,
- * but the heuristics here should apply to those, so we allow
- * several different end addresses.
- */
- if (type == SYS_RES_MEMORY && start == 0UL && (end == ~0UL ||
- end == 0xffffffff))
- start = acpi_host_mem_start;
- if (type == SYS_RES_IOPORT && start == 0UL && (end == ~0UL ||
- end == 0xffff || end == 0xffffffff))
- start = 0x1000;
+#ifdef NEW_PCIB
+ struct acpi_hpcib_softc *sc;
+#endif
+
+#if defined(__i386__) || defined(__amd64__)
+ start = hostb_alloc_start(type, start, end, count);
+#endif
+
+#ifdef NEW_PCIB
+ sc = device_get_softc(dev);
+ return (pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end,
+ count, flags));
+#else
return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
count, flags));
+#endif
+}
+
+#ifdef NEW_PCIB
+int
+acpi_pcib_acpi_adjust_resource(device_t dev, device_t child, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct acpi_hpcib_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (pcib_host_res_adjust(&sc->ap_host_res, child, type, r, start,
+ end));
}
+#endif
diff --git a/sys/dev/acpica/acpi_resource.c b/sys/dev/acpica/acpi_resource.c
index c83b679..ce6732f 100644
--- a/sys/dev/acpica/acpi_resource.c
+++ b/sys/dev/acpica/acpi_resource.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/bus.h>
+#include <sys/limits.h>
#include <sys/malloc.h>
#include <sys/module.h>
@@ -139,332 +140,278 @@ acpi_config_intr(device_t dev, ACPI_RESOURCE *res)
INTR_POLARITY_HIGH : INTR_POLARITY_LOW);
}
-/*
- * Fetch a device's resources and associate them with the device.
- *
- * Note that it might be nice to also locate ACPI-specific resource items, such
- * as GPE bits.
- *
- * We really need to split the resource-fetching code out from the
- * resource-parsing code, since we may want to use the parsing
- * code for _PRS someday.
- */
-ACPI_STATUS
-acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
- struct acpi_parse_resource_set *set, void *arg)
-{
- ACPI_BUFFER buf;
- ACPI_RESOURCE *res;
- char *curr, *last;
- ACPI_STATUS status;
- void *context;
+struct acpi_resource_context {
+ struct acpi_parse_resource_set *set;
+ device_t dev;
+ void *context;
+};
- ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+#ifdef ACPI_DEBUG_OUTPUT
+static const char *
+acpi_address_range_name(UINT8 ResourceType)
+{
+ static char buf[16];
+
+ switch (ResourceType) {
+ case ACPI_MEMORY_RANGE:
+ return ("Memory");
+ case ACPI_IO_RANGE:
+ return ("IO");
+ case ACPI_BUS_NUMBER_RANGE:
+ return ("Bus Number");
+ default:
+ snprintf(buf, sizeof(buf), "type %u", ResourceType);
+ return (buf);
+ }
+}
+#endif
+
+static ACPI_STATUS
+acpi_parse_resource(ACPI_RESOURCE *res, void *context)
+{
+ struct acpi_parse_resource_set *set;
+ struct acpi_resource_context *arc;
+ UINT64 min, max, length, gran;
+ const char *name;
+ device_t dev;
- /*
- * Special-case some devices that abuse _PRS/_CRS to mean
- * something other than "I consume this resource".
- *
- * XXX do we really need this? It's only relevant once
- * we start always-allocating these resources, and even
- * then, the only special-cased device is likely to be
- * the PCI interrupt link.
- */
+ arc = context;
+ dev = arc->dev;
+ set = arc->set;
- /* Fetch the device's current resources. */
- buf.Length = ACPI_ALLOCATE_BUFFER;
- if (ACPI_FAILURE((status = AcpiGetCurrentResources(handle, &buf)))) {
- if (status != AE_NOT_FOUND && status != AE_TYPE)
- printf("can't fetch resources for %s - %s\n",
- acpi_name(handle), AcpiFormatException(status));
- return_ACPI_STATUS (status);
- }
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s - got %ld bytes of resources\n",
- acpi_name(handle), (long)buf.Length));
- set->set_init(dev, arg, &context);
-
- /* Iterate through the resources */
- curr = buf.Pointer;
- last = (char *)buf.Pointer + buf.Length;
- while (curr < last) {
- res = (ACPI_RESOURCE *)curr;
- curr += res->Length;
-
- /* Handle the individual resource types */
- switch(res->Type) {
- case ACPI_RESOURCE_TYPE_END_TAG:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n"));
- curr = last;
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_END_TAG:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "EndTag\n"));
+ break;
+ case ACPI_RESOURCE_TYPE_FIXED_IO:
+ if (res->Data.FixedIo.AddressLength <= 0)
break;
- case ACPI_RESOURCE_TYPE_FIXED_IO:
- if (res->Data.FixedIo.AddressLength <= 0)
- break;
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n",
- res->Data.FixedIo.Address,
- res->Data.FixedIo.AddressLength));
- set->set_ioport(dev, context,
- res->Data.FixedIo.Address,
- res->Data.FixedIo.AddressLength);
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedIo 0x%x/%d\n",
+ res->Data.FixedIo.Address, res->Data.FixedIo.AddressLength));
+ set->set_ioport(dev, arc->context, res->Data.FixedIo.Address,
+ res->Data.FixedIo.AddressLength);
+ break;
+ case ACPI_RESOURCE_TYPE_IO:
+ if (res->Data.Io.AddressLength <= 0)
break;
- case ACPI_RESOURCE_TYPE_IO:
- if (res->Data.Io.AddressLength <= 0)
- break;
- if (res->Data.Io.Minimum == res->Data.Io.Maximum) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n",
- res->Data.Io.Minimum,
- res->Data.Io.AddressLength));
- set->set_ioport(dev, context,
- res->Data.Io.Minimum,
- res->Data.Io.AddressLength);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x-0x%x/%d\n",
- res->Data.Io.Minimum,
- res->Data.Io.Maximum,
- res->Data.Io.AddressLength));
- set->set_iorange(dev, context,
- res->Data.Io.Minimum,
- res->Data.Io.Maximum,
- res->Data.Io.AddressLength,
- res->Data.Io.Alignment);
- }
+ if (res->Data.Io.Minimum == res->Data.Io.Maximum) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x/%d\n",
+ res->Data.Io.Minimum, res->Data.Io.AddressLength));
+ set->set_ioport(dev, arc->context, res->Data.Io.Minimum,
+ res->Data.Io.AddressLength);
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Io 0x%x-0x%x/%d\n",
+ res->Data.Io.Minimum, res->Data.Io.Maximum,
+ res->Data.Io.AddressLength));
+ set->set_iorange(dev, arc->context, res->Data.Io.Minimum,
+ res->Data.Io.Maximum, res->Data.Io.AddressLength,
+ res->Data.Io.Alignment);
+ }
+ break;
+ case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+ if (res->Data.FixedMemory32.AddressLength <= 0)
break;
- case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
- if (res->Data.FixedMemory32.AddressLength <= 0)
- break;
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n",
- res->Data.FixedMemory32.Address,
- res->Data.FixedMemory32.AddressLength));
- set->set_memory(dev, context,
- res->Data.FixedMemory32.Address,
- res->Data.FixedMemory32.AddressLength);
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "FixedMemory32 0x%x/%d\n",
+ res->Data.FixedMemory32.Address,
+ res->Data.FixedMemory32.AddressLength));
+ set->set_memory(dev, arc->context, res->Data.FixedMemory32.Address,
+ res->Data.FixedMemory32.AddressLength);
+ break;
+ case ACPI_RESOURCE_TYPE_MEMORY32:
+ if (res->Data.Memory32.AddressLength <= 0)
break;
- case ACPI_RESOURCE_TYPE_MEMORY32:
- if (res->Data.Memory32.AddressLength <= 0)
- break;
- if (res->Data.Memory32.Minimum ==
- res->Data.Memory32.Maximum) {
-
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n",
- res->Data.Memory32.Minimum,
- res->Data.Memory32.AddressLength));
- set->set_memory(dev, context,
- res->Data.Memory32.Minimum,
- res->Data.Memory32.AddressLength);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x-0x%x/%d\n",
- res->Data.Memory32.Minimum,
- res->Data.Memory32.Maximum,
- res->Data.Memory32.AddressLength));
- set->set_memoryrange(dev, context,
- res->Data.Memory32.Minimum,
- res->Data.Memory32.Maximum,
- res->Data.Memory32.AddressLength,
- res->Data.Memory32.Alignment);
- }
+ if (res->Data.Memory32.Minimum == res->Data.Memory32.Maximum) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x/%d\n",
+ res->Data.Memory32.Minimum, res->Data.Memory32.AddressLength));
+ set->set_memory(dev, arc->context, res->Data.Memory32.Minimum,
+ res->Data.Memory32.AddressLength);
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory32 0x%x-0x%x/%d\n",
+ res->Data.Memory32.Minimum, res->Data.Memory32.Maximum,
+ res->Data.Memory32.AddressLength));
+ set->set_memoryrange(dev, arc->context, res->Data.Memory32.Minimum,
+ res->Data.Memory32.Maximum, res->Data.Memory32.AddressLength,
+ res->Data.Memory32.Alignment);
+ }
+ break;
+ case ACPI_RESOURCE_TYPE_MEMORY24:
+ if (res->Data.Memory24.AddressLength <= 0)
break;
- case ACPI_RESOURCE_TYPE_MEMORY24:
- if (res->Data.Memory24.AddressLength <= 0)
- break;
- if (res->Data.Memory24.Minimum ==
- res->Data.Memory24.Maximum) {
-
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x/%d\n",
- res->Data.Memory24.Minimum,
- res->Data.Memory24.AddressLength));
- set->set_memory(dev, context, res->Data.Memory24.Minimum,
- res->Data.Memory24.AddressLength);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x-0x%x/%d\n",
- res->Data.Memory24.Minimum,
- res->Data.Memory24.Maximum,
- res->Data.Memory24.AddressLength));
- set->set_memoryrange(dev, context,
- res->Data.Memory24.Minimum,
- res->Data.Memory24.Maximum,
- res->Data.Memory24.AddressLength,
- res->Data.Memory24.Alignment);
- }
+ if (res->Data.Memory24.Minimum == res->Data.Memory24.Maximum) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x/%d\n",
+ res->Data.Memory24.Minimum, res->Data.Memory24.AddressLength));
+ set->set_memory(dev, arc->context, res->Data.Memory24.Minimum,
+ res->Data.Memory24.AddressLength);
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "Memory24 0x%x-0x%x/%d\n",
+ res->Data.Memory24.Minimum, res->Data.Memory24.Maximum,
+ res->Data.Memory24.AddressLength));
+ set->set_memoryrange(dev, arc->context, res->Data.Memory24.Minimum,
+ res->Data.Memory24.Maximum, res->Data.Memory24.AddressLength,
+ res->Data.Memory24.Alignment);
+ }
+ break;
+ case ACPI_RESOURCE_TYPE_IRQ:
+ /*
+ * from 1.0b 6.4.2
+ * "This structure is repeated for each separate interrupt
+ * required"
+ */
+ set->set_irq(dev, arc->context, res->Data.Irq.Interrupts,
+ res->Data.Irq.InterruptCount, res->Data.Irq.Triggering,
+ res->Data.Irq.Polarity);
+ break;
+ case ACPI_RESOURCE_TYPE_DMA:
+ /*
+ * from 1.0b 6.4.3
+ * "This structure is repeated for each separate DMA channel
+ * required"
+ */
+ set->set_drq(dev, arc->context, res->Data.Dma.Channels,
+ res->Data.Dma.ChannelCount);
+ break;
+ case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependent functions\n"));
+ set->set_start_dependent(dev, arc->context,
+ res->Data.StartDpf.CompatibilityPriority);
+ break;
+ case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "end dependent functions\n"));
+ set->set_end_dependent(dev, arc->context);
+ break;
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+ switch (res->Type) {
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ gran = res->Data.Address16.Granularity;
+ min = res->Data.Address16.Minimum;
+ max = res->Data.Address16.Maximum;
+ length = res->Data.Address16.AddressLength;
+ name = "Address16";
break;
- case ACPI_RESOURCE_TYPE_IRQ:
- /*
- * from 1.0b 6.4.2
- * "This structure is repeated for each separate interrupt
- * required"
- */
- set->set_irq(dev, context, res->Data.Irq.Interrupts,
- res->Data.Irq.InterruptCount, res->Data.Irq.Triggering,
- res->Data.Irq.Polarity);
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ gran = res->Data.Address32.Granularity;
+ min = res->Data.Address32.Minimum;
+ max = res->Data.Address32.Maximum;
+ length = res->Data.Address32.AddressLength;
+ name = "Address32";
break;
- case ACPI_RESOURCE_TYPE_DMA:
- /*
- * from 1.0b 6.4.3
- * "This structure is repeated for each separate dma channel
- * required"
- */
- set->set_drq(dev, context, res->Data.Dma.Channels,
- res->Data.Dma.ChannelCount);
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ gran = res->Data.Address64.Granularity;
+ min = res->Data.Address64.Minimum;
+ max = res->Data.Address64.Maximum;
+ length = res->Data.Address64.AddressLength;
+ name = "Address64";
break;
- case ACPI_RESOURCE_TYPE_START_DEPENDENT:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "start dependent functions\n"));
- set->set_start_dependent(dev, context,
- res->Data.StartDpf.CompatibilityPriority);
+ default:
+ KASSERT(res->Type == ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
+ ("should never happen"));
+ gran = res->Data.ExtAddress64.Granularity;
+ min = res->Data.ExtAddress64.Minimum;
+ max = res->Data.ExtAddress64.Maximum;
+ length = res->Data.ExtAddress64.AddressLength;
+ name = "ExtAddress64";
break;
- case ACPI_RESOURCE_TYPE_END_DEPENDENT:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "end dependent functions\n"));
- set->set_end_dependent(dev, context);
+ }
+ if (length <= 0)
break;
- case ACPI_RESOURCE_TYPE_ADDRESS32:
- if (res->Data.Address32.AddressLength <= 0)
- break;
- if (res->Data.Address32.ProducerConsumer != ACPI_CONSUMER) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "ignored Address32 %s producer\n",
- res->Data.Address32.ResourceType == ACPI_IO_RANGE ?
- "IO" : "Memory"));
- break;
- }
- if (res->Data.Address32.ResourceType != ACPI_MEMORY_RANGE &&
- res->Data.Address32.ResourceType != ACPI_IO_RANGE) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "ignored Address32 for non-memory, non-I/O\n"));
- break;
- }
+ if (res->Data.Address.ProducerConsumer != ACPI_CONSUMER) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
+ "ignored %s %s producer\n", name,
+ acpi_address_range_name(res->Data.Address.ResourceType)));
+ break;
+ }
+ if (res->Data.Address.ResourceType != ACPI_MEMORY_RANGE &&
+ res->Data.Address.ResourceType != ACPI_IO_RANGE) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
+ "ignored %s for non-memory, non-I/O\n", name));
+ break;
+ }
- if (res->Data.Address32.MinAddressFixed == ACPI_ADDRESS_FIXED &&
- res->Data.Address32.MaxAddressFixed == ACPI_ADDRESS_FIXED) {
-
- if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address32/Memory 0x%x/%d\n",
- res->Data.Address32.Minimum,
- res->Data.Address32.AddressLength));
- set->set_memory(dev, context,
- res->Data.Address32.Minimum,
- res->Data.Address32.AddressLength);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address32/IO 0x%x/%d\n",
- res->Data.Address32.Minimum,
- res->Data.Address32.AddressLength));
- set->set_ioport(dev, context,
- res->Data.Address32.Minimum,
- res->Data.Address32.AddressLength);
- }
- } else {
- if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address32/Memory 0x%x-0x%x/%d\n",
- res->Data.Address32.Minimum,
- res->Data.Address32.Maximum,
- res->Data.Address32.AddressLength));
- set->set_memoryrange(dev, context,
- res->Data.Address32.Minimum,
- res->Data.Address32.Maximum,
- res->Data.Address32.AddressLength,
- res->Data.Address32.Granularity);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address32/IO 0x%x-0x%x/%d\n",
- res->Data.Address32.Minimum,
- res->Data.Address32.Maximum,
- res->Data.Address32.AddressLength));
- set->set_iorange(dev, context,
- res->Data.Address32.Minimum,
- res->Data.Address32.Maximum,
- res->Data.Address32.AddressLength,
- res->Data.Address32.Granularity);
- }
- }
+#ifdef __i386__
+ if (min > ULONG_MAX || (res->Data.Address.MaxAddressFixed && max >
+ ULONG_MAX)) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored %s above 4G\n",
+ name));
break;
- case ACPI_RESOURCE_TYPE_ADDRESS16:
- if (res->Data.Address16.AddressLength <= 0)
- break;
- if (res->Data.Address16.ProducerConsumer != ACPI_CONSUMER) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "ignored Address16 %s producer\n",
- res->Data.Address16.ResourceType == ACPI_IO_RANGE ?
- "IO" : "Memory"));
- break;
+ }
+ if (max > ULONG_MAX)
+ max = ULONG_MAX;
+#endif
+ if (res->Data.Address.MinAddressFixed == ACPI_ADDRESS_FIXED &&
+ res->Data.Address.MaxAddressFixed == ACPI_ADDRESS_FIXED) {
+ if (res->Data.Address.ResourceType == ACPI_MEMORY_RANGE) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/Memory 0x%jx/%ju\n",
+ name, (uintmax_t)min, (uintmax_t)length));
+ set->set_memory(dev, arc->context, min, length);
+ } else {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%jx/%ju\n", name,
+ (uintmax_t)min, (uintmax_t)length));
+ set->set_ioport(dev, arc->context, min, length);
}
- if (res->Data.Address16.ResourceType != ACPI_MEMORY_RANGE &&
- res->Data.Address16.ResourceType != ACPI_IO_RANGE) {
+ } else {
+ if (res->Data.Address32.ResourceType == ACPI_MEMORY_RANGE) {
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "ignored Address16 for non-memory, non-I/O\n"));
- break;
- }
-
- if (res->Data.Address16.MinAddressFixed == ACPI_ADDRESS_FIXED &&
- res->Data.Address16.MaxAddressFixed == ACPI_ADDRESS_FIXED) {
-
- if (res->Data.Address16.ResourceType == ACPI_MEMORY_RANGE) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address16/Memory 0x%x/%d\n",
- res->Data.Address16.Minimum,
- res->Data.Address16.AddressLength));
- set->set_memory(dev, context,
- res->Data.Address16.Minimum,
- res->Data.Address16.AddressLength);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address16/IO 0x%x/%d\n",
- res->Data.Address16.Minimum,
- res->Data.Address16.AddressLength));
- set->set_ioport(dev, context,
- res->Data.Address16.Minimum,
- res->Data.Address16.AddressLength);
- }
+ "%s/Memory 0x%jx-0x%jx/%ju\n", name, (uintmax_t)min,
+ (uintmax_t)max, (uintmax_t)length));
+ set->set_memoryrange(dev, arc->context, min, max, length, gran);
} else {
- if (res->Data.Address16.ResourceType == ACPI_MEMORY_RANGE) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address16/Memory 0x%x-0x%x/%d\n",
- res->Data.Address16.Minimum,
- res->Data.Address16.Maximum,
- res->Data.Address16.AddressLength));
- set->set_memoryrange(dev, context,
- res->Data.Address16.Minimum,
- res->Data.Address16.Maximum,
- res->Data.Address16.AddressLength,
- res->Data.Address16.Granularity);
- } else {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "Address16/IO 0x%x-0x%x/%d\n",
- res->Data.Address16.Minimum,
- res->Data.Address16.Maximum,
- res->Data.Address16.AddressLength));
- set->set_iorange(dev, context,
- res->Data.Address16.Minimum,
- res->Data.Address16.Maximum,
- res->Data.Address16.AddressLength,
- res->Data.Address16.Granularity);
- }
- }
- break;
- case ACPI_RESOURCE_TYPE_ADDRESS64:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "unimplemented Address64 resource\n"));
- break;
- case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
- if (res->Data.ExtendedIrq.ProducerConsumer != ACPI_CONSUMER) {
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "ignored ExtIRQ producer\n"));
- break;
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s/IO 0x%jx-0x%jx/%ju\n",
+ name, (uintmax_t)min, (uintmax_t)max, (uintmax_t)length));
+ set->set_iorange(dev, arc->context, min, max, length, gran);
}
- set->set_ext_irq(dev, context, res->Data.ExtendedIrq.Interrupts,
- res->Data.ExtendedIrq.InterruptCount,
- res->Data.ExtendedIrq.Triggering,
- res->Data.ExtendedIrq.Polarity);
- break;
- case ACPI_RESOURCE_TYPE_VENDOR:
- ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
- "unimplemented VendorSpecific resource\n"));
- break;
- default:
+ }
+ break;
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ if (res->Data.ExtendedIrq.ProducerConsumer != ACPI_CONSUMER) {
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "ignored ExtIRQ producer\n"));
break;
}
- }
+ set->set_ext_irq(dev, arc->context, res->Data.ExtendedIrq.Interrupts,
+ res->Data.ExtendedIrq.InterruptCount,
+ res->Data.ExtendedIrq.Triggering, res->Data.ExtendedIrq.Polarity);
+ break;
+ case ACPI_RESOURCE_TYPE_VENDOR:
+ ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
+ "unimplemented VendorSpecific resource\n"));
+ break;
+ default:
+ break;
+ }
+ return (AE_OK);
+}
+
+/*
+ * Fetch a device's resources and associate them with the device.
+ *
+ * Note that it might be nice to also locate ACPI-specific resource items, such
+ * as GPE bits.
+ *
+ * We really need to split the resource-fetching code out from the
+ * resource-parsing code, since we may want to use the parsing
+ * code for _PRS someday.
+ */
+ACPI_STATUS
+acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
+ struct acpi_parse_resource_set *set, void *arg)
+{
+ struct acpi_resource_context arc;
+ ACPI_STATUS status;
- AcpiOsFree(buf.Pointer);
- set->set_done(dev, context);
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+
+ set->set_init(dev, arg, &arc.context);
+ arc.set = set;
+ arc.dev = dev;
+ status = AcpiWalkResources(handle, "_CRS", acpi_parse_resource, &arc);
+ if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
+ printf("can't fetch resources for %s - %s\n",
+ acpi_name(handle), AcpiFormatException(status));
+ return_ACPI_STATUS (status);
+ }
+ set->set_done(dev, arc.context);
return_ACPI_STATUS (AE_OK);
}
@@ -475,20 +422,20 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
static void acpi_res_set_init(device_t dev, void *arg, void **context);
static void acpi_res_set_done(device_t dev, void *context);
static void acpi_res_set_ioport(device_t dev, void *context,
- u_int32_t base, u_int32_t length);
+ uint64_t base, uint64_t length);
static void acpi_res_set_iorange(device_t dev, void *context,
- u_int32_t low, u_int32_t high,
- u_int32_t length, u_int32_t align);
+ uint64_t low, uint64_t high,
+ uint64_t length, uint64_t align);
static void acpi_res_set_memory(device_t dev, void *context,
- u_int32_t base, u_int32_t length);
+ uint64_t base, uint64_t length);
static void acpi_res_set_memoryrange(device_t dev, void *context,
- u_int32_t low, u_int32_t high,
- u_int32_t length, u_int32_t align);
-static void acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq,
+ uint64_t low, uint64_t high,
+ uint64_t length, uint64_t align);
+static void acpi_res_set_irq(device_t dev, void *context, uint8_t *irq,
int count, int trig, int pol);
static void acpi_res_set_ext_irq(device_t dev, void *context,
- u_int32_t *irq, int count, int trig, int pol);
-static void acpi_res_set_drq(device_t dev, void *context, u_int8_t *drq,
+ uint32_t *irq, int count, int trig, int pol);
+static void acpi_res_set_drq(device_t dev, void *context, uint8_t *drq,
int count);
static void acpi_res_set_start_dependent(device_t dev, void *context,
int preference);
@@ -539,8 +486,8 @@ acpi_res_set_done(device_t dev, void *context)
}
static void
-acpi_res_set_ioport(device_t dev, void *context, u_int32_t base,
- u_int32_t length)
+acpi_res_set_ioport(device_t dev, void *context, uint64_t base,
+ uint64_t length)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -550,8 +497,8 @@ acpi_res_set_ioport(device_t dev, void *context, u_int32_t base,
}
static void
-acpi_res_set_iorange(device_t dev, void *context, u_int32_t low,
- u_int32_t high, u_int32_t length, u_int32_t align)
+acpi_res_set_iorange(device_t dev, void *context, uint64_t low,
+ uint64_t high, uint64_t length, uint64_t align)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -561,8 +508,8 @@ acpi_res_set_iorange(device_t dev, void *context, u_int32_t low,
}
static void
-acpi_res_set_memory(device_t dev, void *context, u_int32_t base,
- u_int32_t length)
+acpi_res_set_memory(device_t dev, void *context, uint64_t base,
+ uint64_t length)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -573,8 +520,8 @@ acpi_res_set_memory(device_t dev, void *context, u_int32_t base,
}
static void
-acpi_res_set_memoryrange(device_t dev, void *context, u_int32_t low,
- u_int32_t high, u_int32_t length, u_int32_t align)
+acpi_res_set_memoryrange(device_t dev, void *context, uint64_t low,
+ uint64_t high, uint64_t length, uint64_t align)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -584,7 +531,7 @@ acpi_res_set_memoryrange(device_t dev, void *context, u_int32_t low,
}
static void
-acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq, int count,
+acpi_res_set_irq(device_t dev, void *context, uint8_t *irq, int count,
int trig, int pol)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -600,7 +547,7 @@ acpi_res_set_irq(device_t dev, void *context, u_int8_t *irq, int count,
}
static void
-acpi_res_set_ext_irq(device_t dev, void *context, u_int32_t *irq, int count,
+acpi_res_set_ext_irq(device_t dev, void *context, uint32_t *irq, int count,
int trig, int pol)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
@@ -616,7 +563,7 @@ acpi_res_set_ext_irq(device_t dev, void *context, u_int32_t *irq, int count,
}
static void
-acpi_res_set_drq(device_t dev, void *context, u_int8_t *drq, int count)
+acpi_res_set_drq(device_t dev, void *context, uint8_t *drq, int count)
{
struct acpi_res_context *cp = (struct acpi_res_context *)context;
diff --git a/sys/dev/acpica/acpi_thermal.c b/sys/dev/acpica/acpi_thermal.c
index 7226b6c..18996bd 100644
--- a/sys/dev/acpica/acpi_thermal.c
+++ b/sys/dev/acpica/acpi_thermal.c
@@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$");
#include <sys/kthread.h>
#include <sys/malloc.h>
#include <sys/module.h>
-#include <sys/bus.h>
#include <sys/proc.h>
#include <sys/reboot.h>
#include <sys/sysctl.h>
diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h
index a74cd75..8735776 100644
--- a/sys/dev/acpica/acpivar.h
+++ b/sys/dev/acpica/acpivar.h
@@ -355,19 +355,19 @@ BOOLEAN acpi_MatchHid(ACPI_HANDLE h, const char *hid);
struct acpi_parse_resource_set {
void (*set_init)(device_t dev, void *arg, void **context);
void (*set_done)(device_t dev, void *context);
- void (*set_ioport)(device_t dev, void *context, uint32_t base,
- uint32_t length);
- void (*set_iorange)(device_t dev, void *context, uint32_t low,
- uint32_t high, uint32_t length, uint32_t align);
- void (*set_memory)(device_t dev, void *context, uint32_t base,
- uint32_t length);
- void (*set_memoryrange)(device_t dev, void *context, uint32_t low,
- uint32_t high, uint32_t length, uint32_t align);
- void (*set_irq)(device_t dev, void *context, u_int8_t *irq,
+ void (*set_ioport)(device_t dev, void *context, uint64_t base,
+ uint64_t length);
+ void (*set_iorange)(device_t dev, void *context, uint64_t low,
+ uint64_t high, uint64_t length, uint64_t align);
+ void (*set_memory)(device_t dev, void *context, uint64_t base,
+ uint64_t length);
+ void (*set_memoryrange)(device_t dev, void *context, uint64_t low,
+ uint64_t high, uint64_t length, uint64_t align);
+ void (*set_irq)(device_t dev, void *context, uint8_t *irq,
int count, int trig, int pol);
- void (*set_ext_irq)(device_t dev, void *context, u_int32_t *irq,
+ void (*set_ext_irq)(device_t dev, void *context, uint32_t *irq,
int count, int trig, int pol);
- void (*set_drq)(device_t dev, void *context, u_int8_t *drq,
+ void (*set_drq)(device_t dev, void *context, uint8_t *drq,
int count);
void (*set_start_dependent)(device_t dev, void *context,
int preference);
diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c
index 22ab97d..e66b5b2 100644
--- a/sys/dev/adb/adb_kbd.c
+++ b/sys/dev/adb/adb_kbd.c
@@ -747,6 +747,7 @@ static int akbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
break;
case PIO_KEYMAP:
+ case OPIO_KEYMAP:
case PIO_KEYMAPENT:
case PIO_DEADKEYMAP:
default:
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index 136011c..0bc094e 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -195,6 +195,7 @@ static struct {
{0x91201b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_NOBSYRES},
{0x91231b4b, 0x11, "Marvell 88SE912x", AHCI_Q_NOBSYRES|AHCI_Q_ALTSIG},
{0x91231b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_SATA2|AHCI_Q_NOBSYRES},
+ {0x91251b4b, 0x00, "Marvell 88SE9125", AHCI_Q_NOBSYRES},
{0x91721b4b, 0x00, "Marvell 88SE9172", AHCI_Q_NOBSYRES},
{0x91821b4b, 0x00, "Marvell 88SE9182", AHCI_Q_NOBSYRES},
{0x06201103, 0x00, "HighPoint RocketRAID 620", AHCI_Q_NOBSYRES},
diff --git a/sys/dev/aic7xxx/aicasm/aicasm.c b/sys/dev/aic7xxx/aicasm/aicasm.c
index 6c88f90..1b88ba0 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm.c
+++ b/sys/dev/aic7xxx/aicasm/aicasm.c
@@ -53,7 +53,7 @@
#include <sysexits.h>
#include <unistd.h>
-#if linux
+#if defined(__linux__) || defined(__GLIBC__)
#include <endian.h>
#else
#include <machine/endian.h>
diff --git a/sys/dev/aic7xxx/aicasm/aicasm.h b/sys/dev/aic7xxx/aicasm/aicasm.h
index 440cb49..0cc1c2b 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm.h
+++ b/sys/dev/aic7xxx/aicasm/aicasm.h
@@ -42,11 +42,7 @@
* $FreeBSD$
*/
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#ifndef TRUE
#define TRUE 1
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_gram.y b/sys/dev/aic7xxx/aicasm/aicasm_gram.y
index d50d2b9..e4ee307 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_gram.y
+++ b/sys/dev/aic7xxx/aicasm/aicasm_gram.y
@@ -51,12 +51,7 @@
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
-
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y b/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y
index 95e20f1..923cd5d 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y
+++ b/sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y
@@ -51,12 +51,7 @@
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
-
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l
index ad06507..ac14c12 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l
+++ b/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l
@@ -51,11 +51,7 @@
#include <stdio.h>
#include <string.h>
#include <sysexits.h>
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_scan.l
index 2821862..acc74a4 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_scan.l
+++ b/sys/dev/aic7xxx/aicasm/aicasm_scan.l
@@ -51,11 +51,7 @@
#include <stdio.h>
#include <string.h>
#include <sysexits.h>
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
#include "aicasm.h"
#include "aicasm_symbol.h"
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c
index 2e5d5c4..53a2c5d 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c
+++ b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c
@@ -43,11 +43,11 @@
*/
#include <sys/types.h>
-
-#ifdef __linux__
-#include "aicdb.h"
-#else
+#include <sys/param.h>
+#ifdef BSD
#include <db.h>
+#else
+#include <db_185.h>
#endif
#include <ctype.h>
#include <fcntl.h>
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_symbol.h b/sys/dev/aic7xxx/aicasm/aicasm_symbol.h
index 7cdace8..3242152 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_symbol.h
+++ b/sys/dev/aic7xxx/aicasm/aicasm_symbol.h
@@ -42,11 +42,7 @@
* $FreeBSD$
*/
-#ifdef __linux__
-#include "../queue.h"
-#else
#include <sys/queue.h>
-#endif
typedef enum {
UNINITIALIZED,
diff --git a/sys/dev/an/if_an.c b/sys/dev/an/if_an.c
index 645fe41..0898961 100644
--- a/sys/dev/an/if_an.c
+++ b/sys/dev/an/if_an.c
@@ -102,7 +102,6 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/module.h>
-#include <sys/sysctl.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
diff --git a/sys/dev/ath/ah_osdep.c b/sys/dev/ath/ah_osdep.c
index b14bba0..cceb9a4 100644
--- a/sys/dev/ath/ah_osdep.c
+++ b/sys/dev/ath/ah_osdep.c
@@ -81,29 +81,10 @@ SYSCTL_NODE(_hw_ath, OID_AUTO, hal, CTLFLAG_RD, 0, "Atheros HAL parameters");
#ifdef AH_DEBUG
int ath_hal_debug = 0;
SYSCTL_INT(_hw_ath_hal, OID_AUTO, debug, CTLFLAG_RW, &ath_hal_debug,
- 0, "Atheros HAL debugging printfs");
+ 0, "Atheros HAL debugging printfs");
TUNABLE_INT("hw.ath.hal.debug", &ath_hal_debug);
#endif /* AH_DEBUG */
-int ath_hal_ar5416_biasadj = 0;
-SYSCTL_INT(_hw_ath_hal, OID_AUTO, ar5416_biasadj, CTLFLAG_RW,
- &ath_hal_ar5416_biasadj, 0, "Enable 2ghz AR5416 direction sensitivity"
- " bias adjust");
-
-/* NB: these are deprecated; they exist for now for compatibility */
-int ath_hal_dma_beacon_response_time = 2; /* in TU's */
-SYSCTL_INT(_hw_ath_hal, OID_AUTO, dma_brt, CTLFLAG_RW,
- &ath_hal_dma_beacon_response_time, 0,
- "Atheros HAL DMA beacon response time");
-int ath_hal_sw_beacon_response_time = 10; /* in TU's */
-SYSCTL_INT(_hw_ath_hal, OID_AUTO, sw_brt, CTLFLAG_RW,
- &ath_hal_sw_beacon_response_time, 0,
- "Atheros HAL software beacon response time");
-int ath_hal_additional_swba_backoff = 0; /* in TU's */
-SYSCTL_INT(_hw_ath_hal, OID_AUTO, swba_backoff, CTLFLAG_RW,
- &ath_hal_additional_swba_backoff, 0,
- "Atheros HAL additional SWBA backoff time");
-
MALLOC_DEFINE(M_ATH_HAL, "ath_hal", "ath hal data");
void*
@@ -146,7 +127,9 @@ ath_hal_ether_sprintf(const u_int8_t *mac)
void
DO_HALDEBUG(struct ath_hal *ah, u_int mask, const char* fmt, ...)
{
- if ((mask == HAL_DEBUG_UNMASKABLE) || (ath_hal_debug & mask)) {
+ if ((mask == HAL_DEBUG_UNMASKABLE) ||
+ (ah->ah_config.ah_debug & mask) ||
+ (ath_hal_debug & mask)) {
__va_list ap;
va_start(ap, fmt);
ath_hal_vprintf(ah, fmt, ap);
diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h
index 7a01be3..f81e6aa 100644
--- a/sys/dev/ath/ath_hal/ah.h
+++ b/sys/dev/ath/ath_hal/ah.h
@@ -756,6 +756,17 @@ struct dfs_event {
};
typedef struct dfs_event HAL_DFS_EVENT;
+typedef struct
+{
+ int ah_debug; /* only used if AH_DEBUG is defined */
+ int ah_ar5416_biasadj; /* enable AR2133 radio specific bias fiddling */
+
+ /* NB: these are deprecated; they exist for now for compatibility */
+ int ah_dma_beacon_response_time;/* in TU's */
+ int ah_sw_beacon_response_time; /* in TU's */
+ int ah_additional_swba_backoff; /* in TU's */
+}HAL_OPS_CONFIG;
+
/*
* Hardware Access Layer (HAL) API.
*
@@ -784,6 +795,7 @@ struct ath_hal {
uint16_t *ah_eepromdata; /* eeprom buffer, if needed */
+ HAL_OPS_CONFIG ah_config;
const HAL_RATE_TABLE *__ahdecl(*ah_getRateTable)(struct ath_hal *,
u_int mode);
void __ahdecl(*ah_detach)(struct ath_hal*);
diff --git a/sys/dev/ath/ath_hal/ah_eeprom_9287.h b/sys/dev/ath/ath_hal/ah_eeprom_9287.h
index d429c39..ff8080a 100644
--- a/sys/dev/ath/ath_hal/ah_eeprom_9287.h
+++ b/sys/dev/ath/ath_hal/ah_eeprom_9287.h
@@ -31,6 +31,8 @@
#define AR9287_EEP_MINOR_VER_b AR9287_EEP_MINOR_VER
#define AR9287_EEP_NO_BACK_VER AR9287_EEP_MINOR_VER_1
+#define AR9287_RDEXT_DEFAULT 0x1F
+
#define AR9287_EEP_START_LOC 128
#define AR9287_HTC_EEP_START_LOC 256
#define AR9287_NUM_2G_CAL_PIERS 3
diff --git a/sys/dev/ath/ath_hal/ah_internal.h b/sys/dev/ath/ath_hal/ah_internal.h
index d66c9d8..120620c 100644
--- a/sys/dev/ath/ath_hal/ah_internal.h
+++ b/sys/dev/ath/ath_hal/ah_internal.h
@@ -475,12 +475,6 @@ isBigEndian(void)
#define OS_A_REG_RMW_FIELD(_a, _r, _f, _v) \
do { OS_REG_WRITE(_a, _r, (OS_REG_READ(_a, _r) &~ (_f)) | (((_v) << _f##_S) & (_f))) ; OS_DELAY(100); } while (0)
-/* system-configurable parameters */
-extern int ath_hal_dma_beacon_response_time; /* in TU's */
-extern int ath_hal_sw_beacon_response_time; /* in TU's */
-extern int ath_hal_additional_swba_backoff; /* in TU's */
-extern int ath_hal_ar5416_biasadj; /* 1 or 0 */
-
/* wait for the register contents to have the specified value */
extern HAL_BOOL ath_hal_wait(struct ath_hal *, u_int reg,
uint32_t mask, uint32_t val);
@@ -504,11 +498,29 @@ extern void ath_hal_free(void *);
/* common debugging interfaces */
#ifdef AH_DEBUG
#include "ah_debug.h"
-extern int ath_hal_debug;
+extern int ath_hal_debug; /* Global debug flags */
+
+/*
+ * This is used for global debugging, when ahp doesn't yet have the
+ * related debugging state. For example, during probe/attach.
+ */
+#define HALDEBUG_G(_ah, __m, ...) \
+ do { \
+ if ((__m) == HAL_DEBUG_UNMASKABLE || \
+ ath_hal_debug & (__m)) { \
+ DO_HALDEBUG((_ah), (__m), __VA_ARGS__); \
+ } \
+ } while (0);
+
+/*
+ * This is used for local debugging, when ahp isn't NULL and
+ * thus may have debug flags set.
+ */
#define HALDEBUG(_ah, __m, ...) \
do { \
if ((__m) == HAL_DEBUG_UNMASKABLE || \
- (ath_hal_debug & (__m))) { \
+ ath_hal_debug & (__m) || \
+ (_ah)->ah_config.ah_debug & (__m)) { \
DO_HALDEBUG((_ah), (__m), __VA_ARGS__); \
} \
} while(0);
@@ -516,7 +528,8 @@ extern int ath_hal_debug;
extern void DO_HALDEBUG(struct ath_hal *ah, u_int mask, const char* fmt, ...)
__printflike(3,4);
#else
-#define HALDEBUG(_ah, __m, _fmt, ...)
+#define HALDEBUG(_ah, __m, ...)
+#define HALDEBUG_G(_ah, __m, ...)
#endif /* AH_DEBUG */
/*
diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c
index c17d0f6..9aae332 100644
--- a/sys/dev/ath/ath_hal/ah_regdomain.c
+++ b/sys/dev/ath/ath_hal/ah_regdomain.c
@@ -167,7 +167,7 @@ isEepromValid(struct ath_hal *ah)
if (regDomainPairs[i].regDmnEnum == rd)
return AH_TRUE;
}
- HALDEBUG(ah, HAL_DEBUG_REGDOMAIN,
+ HALDEBUG_G(ah, HAL_DEBUG_REGDOMAIN,
"%s: invalid regulatory domain/country code 0x%x\n", __func__, rd);
return AH_FALSE;
}
@@ -609,7 +609,7 @@ ath_hal_mapgsm(int sku, int freq)
return 1544 + freq;
if (sku == SKU_SR9)
return 3344 - freq;
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot map freq %u unknown gsm sku %u\n",
__func__, freq, sku);
return freq;
diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c
index 2068733..41d957a 100644
--- a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c
+++ b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c
@@ -181,14 +181,14 @@ ar5210Attach(uint16_t devid, HAL_SOFTC sc, HAL_BUS_TAG st, HAL_BUS_HANDLE sh,
HAL_STATUS ecode;
int i;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH,
"%s: devid 0x%x sc %p st %p sh %p\n", __func__, devid,
sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp = ath_hal_malloc(sizeof (struct ath_hal_5210));
if (ahp == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: no memory for state block\n", __func__);
ecode = HAL_ENOMEM;
goto bad;
diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c b/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c
index dbd059e..a613c9c 100644
--- a/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c
+++ b/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c
@@ -56,9 +56,9 @@ ar5210BeaconInit(struct ath_hal *ah,
if (AH_PRIVATE(ah)->ah_opmode != HAL_M_STA) {
bt.bt_nextdba = (next_beacon -
- ath_hal_dma_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_dma_beacon_response_time) << 3; /* 1/8 TU */
bt.bt_nextswba = (next_beacon -
- ath_hal_sw_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_sw_beacon_response_time) << 3; /* 1/8 TU */
/*
* The SWBA interrupt is not used for beacons in ad hoc mode
* as we don't yet support ATIMs. So since the beacon never
diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c
index 308ecc9..14daa0b 100644
--- a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c
+++ b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c
@@ -200,13 +200,13 @@ ar5211Attach(uint16_t devid, HAL_SOFTC sc,
uint16_t eeval;
HAL_STATUS ecode;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp = ath_hal_malloc(sizeof (struct ath_hal_5211));
if (ahp == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
ecode = HAL_ENOMEM;
goto bad;
diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c b/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c
index 669b8f6..31e9c5d 100644
--- a/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c
+++ b/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c
@@ -71,9 +71,9 @@ ar5211BeaconInit(struct ath_hal *ah,
case HAL_M_IBSS:
case HAL_M_HOSTAP:
bt.bt_nextdba = (next_beacon -
- ath_hal_dma_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_dma_beacon_response_time) << 3; /* 1/8 TU */
bt.bt_nextswba = (next_beacon -
- ath_hal_sw_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_sw_beacon_response_time) << 3; /* 1/8 TU */
break;
}
/*
diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_xmit.c b/sys/dev/ath/ath_hal/ar5211/ar5211_xmit.c
index 3af314f..e1e7f73 100644
--- a/sys/dev/ath/ath_hal/ar5211/ar5211_xmit.c
+++ b/sys/dev/ath/ath_hal/ar5211/ar5211_xmit.c
@@ -345,8 +345,9 @@ ar5211ResetTxQueue(struct ath_hal *ah, u_int q)
| AR_Q_MISC_CBR_INCR_DIS0 | AR_Q_MISC_RDYTIME_EXP_POLICY);
value = (ahp->ah_beaconInterval
- - (ath_hal_sw_beacon_response_time - ath_hal_dma_beacon_response_time)
- - ath_hal_additional_swba_backoff) * 1024;
+ - (ah->ah_config.ah_sw_beacon_response_time
+ - ah->ah_config.ah_dma_beacon_response_time)
+ - ah->ah_config.ah_additional_swba_backoff) * 1024;
OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), value | AR_Q_RDYTIMECFG_EN);
/* Configure DCU for CAB */
diff --git a/sys/dev/ath/ath_hal/ar5212/ar5112.c b/sys/dev/ath/ath_hal/ar5212/ar5112.c
index c1920b9..1003068 100644
--- a/sys/dev/ath/ath_hal/ar5212/ar5112.c
+++ b/sys/dev/ath/ath_hal/ar5212/ar5112.c
@@ -611,7 +611,7 @@ getFullPwrTable(uint16_t numPcdacs, uint16_t *pcdacs, int16_t *power, int16_t ma
uint16_t idxR = 1;
if (numPcdacs < 2) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: at least 2 pcdac values needed [%d]\n",
__func__, numPcdacs);
return AH_FALSE;
diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c
index 8e7f3cb..01c0e2c 100644
--- a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c
+++ b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c
@@ -317,13 +317,13 @@ ar5212Attach(uint16_t devid, HAL_SOFTC sc,
uint16_t eeval;
HAL_STATUS ecode;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp = ath_hal_malloc(sizeof (struct ath_hal_5212));
if (ahp == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c b/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c
index 538f8b8..bf0b38a 100644
--- a/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c
+++ b/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c
@@ -84,9 +84,9 @@ ar5212BeaconInit(struct ath_hal *ah,
case HAL_M_HOSTAP:
case HAL_M_IBSS:
bt.bt_nextdba = (next_beacon -
- ath_hal_dma_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_dma_beacon_response_time) << 3; /* 1/8 TU */
bt.bt_nextswba = (next_beacon -
- ath_hal_sw_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_sw_beacon_response_time) << 3; /* 1/8 TU */
break;
}
/*
diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c b/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c
index 4fbce31..3c6ddc0 100644
--- a/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c
+++ b/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c
@@ -416,9 +416,9 @@ ar5212ResetTxQueue(struct ath_hal *ah, u_int q)
* here solely for backwards compatibility.
*/
value = (ahp->ah_beaconInterval
- - (ath_hal_sw_beacon_response_time -
- ath_hal_dma_beacon_response_time)
- - ath_hal_additional_swba_backoff) * 1024;
+ - (ah->ah_config.ah_sw_beacon_response_time -
+ ah->ah_config.ah_dma_beacon_response_time)
+ - ah->ah_config.ah_additional_swba_backoff) * 1024;
OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), value | AR_Q_RDYTIMECFG_ENA);
}
dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,
diff --git a/sys/dev/ath/ath_hal/ar5312/ar5312_attach.c b/sys/dev/ath/ath_hal/ar5312/ar5312_attach.c
index 4ca1a4d..d1689d5 100644
--- a/sys/dev/ath/ath_hal/ar5312/ar5312_attach.c
+++ b/sys/dev/ath/ath_hal/ar5312/ar5312_attach.c
@@ -71,13 +71,13 @@ ar5312Attach(uint16_t devid, HAL_SOFTC sc,
uint16_t eeval;
HAL_STATUS ecode;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, st, (void*) sh);
/* NB: memory is returned zero'd */
ahp = ath_hal_malloc(sizeof (struct ath_hal_5212));
if (ahp == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar5416/ar2133.c b/sys/dev/ath/ath_hal/ar5416/ar2133.c
index f92ea00..f25c108 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar2133.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar2133.c
@@ -185,7 +185,7 @@ ar2133SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan)
}
/* Workaround for hw bug - AR5416 specific */
- if (AR_SREV_OWL(ah) && ath_hal_ar5416_biasadj)
+ if (AR_SREV_OWL(ah) && ah->ah_config.ah_ar5416_biasadj)
ar2133ForceBias(ah, freq);
reg32 = (channelSel << 8) | (aModeRefSel << 2) | (bModeSynth << 1) |
diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
index e636325..607f97a 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
@@ -241,7 +241,7 @@ ar5416Attach(uint16_t devid, HAL_SOFTC sc,
HAL_STATUS ecode;
HAL_BOOL rfStatus;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
@@ -250,7 +250,7 @@ ar5416Attach(uint16_t devid, HAL_SOFTC sc,
sizeof(ar5416Addac)
);
if (ahp5416 == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c
index 358a0ee..66b5053 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c
@@ -93,9 +93,9 @@ ar5416BeaconInit(struct ath_hal *ah,
/* fall thru... */
case HAL_M_HOSTAP:
bt.bt_nextdba = (next_beacon -
- ath_hal_dma_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_dma_beacon_response_time) << 3; /* 1/8 TU */
bt.bt_nextswba = (next_beacon -
- ath_hal_sw_beacon_response_time) << 3; /* 1/8 TU */
+ ah->ah_config.ah_sw_beacon_response_time) << 3; /* 1/8 TU */
bt.bt_flags |= AR_TIMER_MODE_TBTT
| AR_TIMER_MODE_DBA
| AR_TIMER_MODE_SWBA;
diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c
index 2332656..6266b58 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c
@@ -288,7 +288,7 @@ ar5416SetQuiet(struct ath_hal *ah, uint32_t period, uint32_t duration,
nextStart_us += OS_REG_READ(ah, AR_TSF_L32);
}
if (flag & HAL_QUIET_ADD_SWBA_RESP_TIME) {
- nextStart_us += ath_hal_sw_beacon_response_time;
+ nextStart_us += ah->ah_config.ah_sw_beacon_response_time;
}
OS_REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1);
OS_REG_WRITE(ah, AR_QUIET2, SM(duration, AR_QUIET2_QUIET_DUR));
diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c b/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c
index 48956c5..20791e8 100644
--- a/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c
+++ b/sys/dev/ath/ath_hal/ar5416/ar5416_xmit.c
@@ -1035,9 +1035,9 @@ ar5416ResetTxQueue(struct ath_hal *ah, u_int q)
* here solely for backwards compatibility.
*/
value = (ahp->ah_beaconInterval
- - (ath_hal_sw_beacon_response_time -
- ath_hal_dma_beacon_response_time)
- - ath_hal_additional_swba_backoff) * 1024;
+ - (ah->ah_config.ah_sw_beacon_response_time -
+ ah->ah_config.ah_dma_beacon_response_time)
+ - ah->ah_config.ah_additional_swba_backoff) * 1024;
OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), value | AR_Q_RDYTIMECFG_ENA);
}
dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,
diff --git a/sys/dev/ath/ath_hal/ar9001/ar9130_attach.c b/sys/dev/ath/ath_hal/ar9001/ar9130_attach.c
index 2a3f3f0..518ed85 100644
--- a/sys/dev/ath/ath_hal/ar9001/ar9130_attach.c
+++ b/sys/dev/ath/ath_hal/ar9001/ar9130_attach.c
@@ -78,13 +78,13 @@ ar9130Attach(uint16_t devid, HAL_SOFTC sc,
HAL_STATUS ecode;
HAL_BOOL rfStatus;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp5416 = ath_hal_malloc(sizeof (struct ath_hal_5416));
if (ahp5416 == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c b/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c
index 44a549d..a87d1ad 100644
--- a/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c
+++ b/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c
@@ -101,13 +101,13 @@ ar9160Attach(uint16_t devid, HAL_SOFTC sc,
HAL_STATUS ecode;
HAL_BOOL rfStatus;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp5416 = ath_hal_malloc(sizeof (struct ath_hal_5416));
if (ahp5416 == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
index ebe3be1..3743c21 100644
--- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
+++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c
@@ -120,13 +120,13 @@ ar9280Attach(uint16_t devid, HAL_SOFTC sc,
int8_t pwr_table_offset;
uint8_t pwr;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp9280 = ath_hal_malloc(sizeof (struct ath_hal_9280));
if (ahp9280 == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c
index 9120313..2547148 100644
--- a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c
+++ b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c
@@ -118,13 +118,13 @@ ar9285Attach(uint16_t devid, HAL_SOFTC sc,
HAL_STATUS ecode;
HAL_BOOL rfStatus;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp9285 = ath_hal_malloc(sizeof (struct ath_hal_9285));
if (ahp9285 == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
diff --git a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c
index 9cbe0a5..ed9feb8 100644
--- a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c
+++ b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c
@@ -119,13 +119,13 @@ ar9287Attach(uint16_t devid, HAL_SOFTC sc,
HAL_BOOL rfStatus;
int8_t pwr_table_offset;
- HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n",
__func__, sc, (void*) st, (void*) sh);
/* NB: memory is returned zero'd */
ahp9287 = ath_hal_malloc(sizeof (struct ath_hal_9287));
if (ahp9287 == AH_NULL) {
- HALDEBUG(AH_NULL, HAL_DEBUG_ANY,
+ HALDEBUG_G(AH_NULL, HAL_DEBUG_ANY,
"%s: cannot allocate memory for state block\n", __func__);
*status = HAL_ENOMEM;
return AH_NULL;
@@ -320,6 +320,7 @@ ar9287Attach(uint16_t devid, HAL_SOFTC sc,
/* Read Reg Domain */
AH_PRIVATE(ah)->ah_currentRD =
ath_hal_eepromGet(ah, AR_EEP_REGDMN_0, AH_NULL);
+ AH_PRIVATE(ah)->ah_currentRDext = AR9287_RDEXT_DEFAULT;
/*
* ah_miscMode is populated by ar5416FillCapabilityInfo()
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index 6c7b0e7..35592d9 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -528,6 +528,9 @@ ath_attach(u_int16_t devid, struct ath_softc *sc)
| IEEE80211_C_WPA /* capable of WPA1+WPA2 */
| IEEE80211_C_BGSCAN /* capable of bg scanning */
| IEEE80211_C_TXFRAG /* handle tx frags */
+#ifdef ATH_ENABLE_DFS
+ | IEEE80211_C_DFS /* Enable DFS radar detection */
+#endif
;
/*
* Query the hal to figure out h/w crypto support.
@@ -738,6 +741,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc)
*/
ath_sysctlattach(sc);
ath_sysctl_stats_attach(sc);
+ ath_sysctl_hal_attach(sc);
if (bootverbose)
ieee80211_announce(ic);
@@ -1286,6 +1290,8 @@ ath_resume(struct ath_softc *sc)
HAL_GPIO_MUX_MAC_NETWORK_LED);
ath_hal_gpioset(ah, sc->sc_ledpin, !sc->sc_ledon);
}
+
+ /* XXX beacons ? */
}
void
@@ -1588,6 +1594,12 @@ ath_init(void *arg)
sc->sc_lastani = 0;
sc->sc_lastshortcal = 0;
sc->sc_doresetcal = AH_FALSE;
+ /*
+ * Beacon timers were cleared here; give ath_newstate()
+ * a hint that the beacon timers should be poked when
+ * things transition to the RUN state.
+ */
+ sc->sc_beacons = 0;
/*
* Setup the hardware after reset: the key cache
@@ -4464,6 +4476,19 @@ ath_chan_set(struct ath_softc *sc, struct ieee80211_channel *chan)
ath_chan_change(sc, chan);
/*
+ * Reset clears the beacon timers; reset them
+ * here if needed.
+ */
+ if (sc->sc_beacons) { /* restart beacons */
+#ifdef IEEE80211_SUPPORT_TDMA
+ if (sc->sc_tdma)
+ ath_tdma_config(sc, NULL);
+ else
+#endif
+ ath_beacon_config(sc, NULL);
+ }
+
+ /*
* Re-enable interrupts.
*/
ath_hal_intrset(ah, sc->sc_imask);
@@ -4668,6 +4693,7 @@ ath_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
struct ieee80211_node *ni = NULL;
int i, error, stamode;
u_int32_t rfilt;
+ int csa_run_transition = 0;
static const HAL_LED_STATE leds[] = {
HAL_LED_INIT, /* IEEE80211_S_INIT */
HAL_LED_SCAN, /* IEEE80211_S_SCAN */
@@ -4683,6 +4709,9 @@ ath_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
ieee80211_state_name[vap->iv_state],
ieee80211_state_name[nstate]);
+ if (vap->iv_state == IEEE80211_S_CSA && nstate == IEEE80211_S_RUN)
+ csa_run_transition = 1;
+
callout_drain(&sc->sc_cal_ch);
ath_hal_setledstate(ah, leds[nstate]); /* set LED */
@@ -4789,8 +4818,14 @@ ath_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
* Defer beacon timer configuration to the next
* beacon frame so we have a current TSF to use
* (any TSF collected when scanning is likely old).
+ * However if it's due to a CSA -> RUN transition,
+ * force a beacon update so we pick up a lack of
+ * beacons from an AP in CAC and thus force a
+ * scan.
*/
sc->sc_syncbeacon = 1;
+ if (csa_run_transition)
+ ath_beacon_config(sc, vap);
break;
case IEEE80211_M_MONITOR:
/*
diff --git a/sys/dev/ath/if_ath_sysctl.c b/sys/dev/ath/if_ath_sysctl.c
index 6c1a6b2..e3c9966 100644
--- a/sys/dev/ath/if_ath_sysctl.c
+++ b/sys/dev/ath/if_ath_sysctl.c
@@ -719,3 +719,43 @@ ath_sysctl_stats_attach(struct ath_softc *sc)
/* Attach the RX phy error array */
ath_sysctl_stats_attach_rxphyerr(sc, child);
}
+
+/*
+ * This doesn't necessarily belong here (because it's HAL related, not
+ * driver related).
+ */
+void
+ath_sysctl_hal_attach(struct ath_softc *sc)
+{
+ struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
+ struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
+ struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
+
+ tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "hal", CTLFLAG_RD,
+ NULL, "Atheros HAL parameters");
+ child = SYSCTL_CHILDREN(tree);
+
+ sc->sc_ah->ah_config.ah_debug = 0;
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "debug", CTLFLAG_RW,
+ &sc->sc_ah->ah_config.ah_debug, 0, "Atheros HAL debugging printfs");
+
+ sc->sc_ah->ah_config.ah_ar5416_biasadj = 0;
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "ar5416_biasadj", CTLFLAG_RW,
+ &sc->sc_ah->ah_config.ah_ar5416_biasadj, 0,
+ "Enable 2ghz AR5416 direction sensitivity bias adjust");
+
+ sc->sc_ah->ah_config.ah_dma_beacon_response_time = 2;
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "dma_brt", CTLFLAG_RW,
+ &sc->sc_ah->ah_config.ah_dma_beacon_response_time, 0,
+ "Atheros HAL DMA beacon response time");
+
+ sc->sc_ah->ah_config.ah_sw_beacon_response_time = 10;
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "sw_brt", CTLFLAG_RW,
+ &sc->sc_ah->ah_config.ah_sw_beacon_response_time, 0,
+ "Atheros HAL software beacon response time");
+
+ sc->sc_ah->ah_config.ah_additional_swba_backoff = 0;
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "swba_backoff", CTLFLAG_RW,
+ &sc->sc_ah->ah_config.ah_additional_swba_backoff, 0,
+ "Atheros HAL additional SWBA backoff time");
+}
diff --git a/sys/dev/ath/if_ath_sysctl.h b/sys/dev/ath/if_ath_sysctl.h
index f96a73e..1fef2be 100644
--- a/sys/dev/ath/if_ath_sysctl.h
+++ b/sys/dev/ath/if_ath_sysctl.h
@@ -34,5 +34,5 @@
extern void ath_sysctlattach(struct ath_softc *);
extern void ath_sysctl_stats_attach(struct ath_softc *sc);
-
+extern void ath_sysctl_hal_attach(struct ath_softc *sc);
#endif
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c
index c48118c..e58ffc7 100644
--- a/sys/dev/atkbdc/atkbd.c
+++ b/sys/dev/atkbdc/atkbd.c
@@ -982,6 +982,7 @@ atkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
return error;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
state->ks_accents = 0;
@@ -1100,7 +1101,7 @@ get_typematic(keyboard_t *kbd)
/*
* Traditional entry points of int 0x15 and 0x16 are fixed
* and later BIOSes follow them. (U)EFI CSM specification
- * also mandate these fixed entry points.
+ * also mandates these fixed entry points.
*
* Validate the entry points here before we proceed further.
* It's known that some recent laptops does not have the
diff --git a/sys/dev/cardbus/cardbus_cis.c b/sys/dev/cardbus/cardbus_cis.c
index 3352a56..ca1ef4b 100644
--- a/sys/dev/cardbus/cardbus_cis.c
+++ b/sys/dev/cardbus/cardbus_cis.c
@@ -369,6 +369,14 @@ decode_tuple_end(device_t cbdev, device_t child, int id,
* Functions to read the a tuple from the card
*/
+/*
+ * Read CIS bytes out of the config space. We have to read it 4 bytes at a
+ * time and do the usual mask and shift to return the bytes. The standard
+ * defines the byte order to be little endian. pci_read_config converts it to
+ * host byte order. This is why we have no endian conversion functions: the
+ * shifts wind up being endian neutral. This is also why we avoid the obvious
+ * memcpy optimization.
+ */
static int
cardbus_read_tuple_conf(device_t cbdev, device_t child, uint32_t start,
uint32_t *off, int *tupleid, int *len, uint8_t *tupledata)
@@ -379,12 +387,11 @@ cardbus_read_tuple_conf(device_t cbdev, device_t child, uint32_t start,
loc = start + *off;
- e = pci_read_config(child, loc - loc % 4, 4);
- for (j = loc % 4; j > 0; j--)
- e >>= 8;
+ e = pci_read_config(child, loc & ~0x3, 4);
+ e >>= 8 * (loc & 0x3);
*len = 0;
for (i = loc, j = -2; j < *len; j++, i++) {
- if (i % 4 == 0)
+ if ((i & 0x3) == 0)
e = pci_read_config(child, i, 4);
if (j == -2)
*tupleid = 0xff & e;
@@ -398,6 +405,10 @@ cardbus_read_tuple_conf(device_t cbdev, device_t child, uint32_t start,
return (0);
}
+/*
+ * Read the CIS data out of memroy. We indirect through the bus space
+ * routines to ensure proper byte ordering conversions when necessary.
+ */
static int
cardbus_read_tuple_mem(device_t cbdev, struct resource *res, uint32_t start,
uint32_t *off, int *tupleid, int *len, uint8_t *tupledata)
@@ -580,7 +591,7 @@ cardbus_parse_cis(device_t cbdev, device_t child,
expect_linktarget = TRUE;
if ((start = pci_read_config(child, PCIR_CIS, 4)) == 0) {
DEVPRINTF((cbdev, "Warning: CIS pointer is 0: (no CIS)\n"));
- return (ENXIO);
+ return (0);
}
DEVPRINTF((cbdev, "CIS pointer is %#x\n", start));
off = 0;
diff --git a/sys/dev/cas/if_cas.c b/sys/dev/cas/if_cas.c
index e39b1b4..858c8bc 100644
--- a/sys/dev/cas/if_cas.c
+++ b/sys/dev/cas/if_cas.c
@@ -203,7 +203,7 @@ cas_attach(struct cas_softc *sc)
IFQ_SET_READY(&ifp->if_snd);
callout_init_mtx(&sc->sc_tick_ch, &sc->sc_mtx, 0);
- callout_init(&sc->sc_rx_ch, 1);
+ callout_init_mtx(&sc->sc_rx_ch, &sc->sc_mtx, 0);
/* Create local taskq. */
TASK_INIT(&sc->sc_intr_task, 0, cas_intr_task, sc);
TASK_INIT(&sc->sc_tx_task, 1, cas_tx_task, ifp);
@@ -759,7 +759,7 @@ cas_reset_rx(struct cas_softc *sc)
* Resetting while DMA is in progress can cause a bus hang, so we
* disable DMA first.
*/
- cas_disable_rx(sc);
+ (void)cas_disable_rx(sc);
CAS_WRITE_4(sc, CAS_RX_CONF, 0);
CAS_BARRIER(sc, CAS_RX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
@@ -771,7 +771,7 @@ cas_reset_rx(struct cas_softc *sc)
((sc->sc_flags & CAS_SERDES) != 0 ? CAS_RESET_PCS_DIS : 0));
CAS_BARRIER(sc, CAS_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_RX | CAS_RESET_TX, 0)) {
+ if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_RX, 0)) {
device_printf(sc->sc_dev, "cannot reset receiver\n");
return (1);
}
@@ -786,7 +786,7 @@ cas_reset_tx(struct cas_softc *sc)
* Resetting while DMA is in progress can cause a bus hang, so we
* disable DMA first.
*/
- cas_disable_tx(sc);
+ (void)cas_disable_tx(sc);
CAS_WRITE_4(sc, CAS_TX_CONF, 0);
CAS_BARRIER(sc, CAS_TX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
@@ -798,7 +798,7 @@ cas_reset_tx(struct cas_softc *sc)
((sc->sc_flags & CAS_SERDES) != 0 ? CAS_RESET_PCS_DIS : 0));
CAS_BARRIER(sc, CAS_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_RX | CAS_RESET_TX, 0)) {
+ if (!cas_bitwait(sc, CAS_RESET, CAS_RESET_TX, 0)) {
device_printf(sc->sc_dev, "cannot reset transmitter\n");
return (1);
}
@@ -813,7 +813,10 @@ cas_disable_rx(struct cas_softc *sc)
CAS_READ_4(sc, CAS_MAC_RX_CONF) & ~CAS_MAC_RX_CONF_EN);
CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- return (cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0));
+ if (cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0))
+ return (1);
+ device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+ return (0);
}
static int
@@ -824,7 +827,10 @@ cas_disable_tx(struct cas_softc *sc)
CAS_READ_4(sc, CAS_MAC_TX_CONF) & ~CAS_MAC_TX_CONF_EN);
CAS_BARRIER(sc, CAS_MAC_TX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- return (cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0));
+ if (cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0))
+ return (1);
+ device_printf(sc->sc_dev, "cannot disable TX MAC\n");
+ return (0);
}
static inline void
@@ -987,7 +993,6 @@ cas_init_locked(struct cas_softc *sc)
cas_init_regs(sc);
/* step 5. RX MAC registers & counters */
- cas_setladrf(sc);
/* step 6 & 7. Program Ring Base Addresses. */
CAS_WRITE_4(sc, CAS_TX_DESC3_BASE_HI,
@@ -1132,23 +1137,20 @@ cas_init_locked(struct cas_softc *sc)
/* step 11. Configure Media. */
/* step 12. RX_MAC Configuration Register */
- v = CAS_READ_4(sc, CAS_MAC_RX_CONF) & ~CAS_MAC_RX_CONF_STRPPAD;
- v |= CAS_MAC_RX_CONF_EN | CAS_MAC_RX_CONF_STRPFCS;
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot configure RX MAC\n");
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v);
+ v = CAS_READ_4(sc, CAS_MAC_RX_CONF);
+ v &= ~(CAS_MAC_RX_CONF_STRPPAD | CAS_MAC_RX_CONF_EN);
+ v |= CAS_MAC_RX_CONF_STRPFCS;
+ sc->sc_mac_rxcfg = v;
+ /*
+ * Clear the RX filter and reprogram it. This will also set the
+ * current RX MAC configuration and enable it.
+ */
+ cas_setladrf(sc);
/* step 13. TX_MAC Configuration Register */
v = CAS_READ_4(sc, CAS_MAC_TX_CONF);
v |= CAS_MAC_TX_CONF_EN;
- CAS_WRITE_4(sc, CAS_MAC_TX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_TX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot configure TX MAC\n");
+ (void)cas_disable_tx(sc);
CAS_WRITE_4(sc, CAS_MAC_TX_CONF, v);
/* step 14. Issue Transmit Pending command. */
@@ -1597,7 +1599,7 @@ cas_rint_timeout(void *arg)
{
struct cas_softc *sc = arg;
- CAS_LOCK_ASSERT(sc, MA_NOTOWNED);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
cas_rint(sc);
}
@@ -1612,7 +1614,7 @@ cas_rint(struct cas_softc *sc)
uint32_t rxhead;
u_int idx, idx2, len, off, skip;
- CAS_LOCK_ASSERT(sc, MA_NOTOWNED);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
callout_stop(&sc->sc_rx_ch);
@@ -1740,9 +1742,11 @@ cas_rint(struct cas_softc *sc)
cas_rxcksum(m, CAS_GET(word4,
CAS_RC4_TCP_CSUM));
/* Pass it on. */
+ CAS_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ CAS_LOCK(sc);
} else
- ifp->if_ierrors++;
+ ifp->if_iqdrops++;
if ((word1 & CAS_RC1_RELEASE_HDR) != 0 &&
refcount_release(&rxds->rxds_refcount) != 0)
@@ -1836,9 +1840,11 @@ cas_rint(struct cas_softc *sc)
cas_rxcksum(m, CAS_GET(word4,
CAS_RC4_TCP_CSUM));
/* Pass it on. */
+ CAS_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ CAS_LOCK(sc);
} else
- ifp->if_ierrors++;
+ ifp->if_iqdrops++;
if ((word1 & CAS_RC1_RELEASE_DATA) != 0 &&
refcount_release(&rxds->rxds_refcount) != 0)
@@ -1874,7 +1880,7 @@ cas_free(void *arg1, void *arg2)
{
struct cas_rxdsoft *rxds;
struct cas_softc *sc;
- u_int idx;
+ u_int idx, locked;
#if __FreeBSD_version < 800016
rxds = arg2;
@@ -1892,17 +1898,18 @@ cas_free(void *arg1, void *arg2)
* NB: this function can be called via m_freem(9) within
* this driver!
*/
-
+ if ((locked = CAS_LOCK_OWNED(sc)) == 0)
+ CAS_LOCK(sc);
cas_add_rxdesc(sc, idx);
+ if (locked == 0)
+ CAS_UNLOCK(sc);
}
static inline void
cas_add_rxdesc(struct cas_softc *sc, u_int idx)
{
- u_int locked;
- if ((locked = CAS_LOCK_OWNED(sc)) == 0)
- CAS_LOCK(sc);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
bus_dmamap_sync(sc->sc_rdmatag, sc->sc_rxdsoft[idx].rxds_dmamap,
BUS_DMASYNC_PREREAD);
@@ -1920,9 +1927,6 @@ cas_add_rxdesc(struct cas_softc *sc, u_int idx)
CAS_WRITE_4(sc, CAS_RX_KICK,
(sc->sc_rxdptr + CAS_NRXDESC - 4) & CAS_NRXDESC_MASK);
}
-
- if (locked == 0)
- CAS_UNLOCK(sc);
}
static void
@@ -1930,7 +1934,7 @@ cas_eint(struct cas_softc *sc, u_int status)
{
struct ifnet *ifp = sc->sc_ifp;
- CAS_LOCK_ASSERT(sc, MA_NOTOWNED);
+ CAS_LOCK_ASSERT(sc, MA_OWNED);
ifp->if_ierrors++;
@@ -1947,7 +1951,7 @@ cas_eint(struct cas_softc *sc, u_int status)
printf("\n");
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
- cas_init(sc);
+ cas_init_locked(sc);
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
taskqueue_enqueue(sc->sc_tq, &sc->sc_tx_task);
}
@@ -1984,6 +1988,7 @@ cas_intr_task(void *arg, int pending __unused)
if (__predict_false((status & CAS_INTR_SUMMARY) == 0))
goto done;
+ CAS_LOCK(sc);
#ifdef CAS_DEBUG
CTR4(KTR_CAS, "%s: %s: cplt %x, status %x",
device_get_name(sc->sc_dev), __func__,
@@ -2023,6 +2028,7 @@ cas_intr_task(void *arg, int pending __unused)
(CAS_INTR_TX_TAG_ERR | CAS_INTR_RX_TAG_ERR |
CAS_INTR_RX_LEN_MMATCH | CAS_INTR_PCI_ERROR_INT)) != 0)) {
cas_eint(sc, status);
+ CAS_UNLOCK(sc);
return;
}
@@ -2030,7 +2036,7 @@ cas_intr_task(void *arg, int pending __unused)
status2 = CAS_READ_4(sc, CAS_MAC_TX_STATUS);
if ((status2 &
(CAS_MAC_TX_UNDERRUN | CAS_MAC_TX_MAX_PKT_ERR)) != 0)
- sc->sc_ifp->if_oerrors++;
+ ifp->if_oerrors++;
else if ((status2 & ~CAS_MAC_TX_FRAME_XMTD) != 0)
device_printf(sc->sc_dev,
"MAC TX fault, status %x\n", status2);
@@ -2039,7 +2045,7 @@ cas_intr_task(void *arg, int pending __unused)
if (__predict_false(status & CAS_INTR_RX_MAC_INT)) {
status2 = CAS_READ_4(sc, CAS_MAC_RX_STATUS);
if ((status2 & CAS_MAC_RX_OVERFLOW) != 0)
- sc->sc_ifp->if_ierrors++;
+ ifp->if_ierrors++;
else if ((status2 & ~CAS_MAC_RX_FRAME_RCVD) != 0)
device_printf(sc->sc_dev,
"MAC RX fault, status %x\n", status2);
@@ -2059,16 +2065,15 @@ cas_intr_task(void *arg, int pending __unused)
}
if ((status &
- (CAS_INTR_TX_INT_ME | CAS_INTR_TX_ALL | CAS_INTR_TX_DONE)) != 0) {
- CAS_LOCK(sc);
+ (CAS_INTR_TX_INT_ME | CAS_INTR_TX_ALL | CAS_INTR_TX_DONE)) != 0)
cas_tint(sc);
- CAS_UNLOCK(sc);
- }
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
+ CAS_UNLOCK(sc);
return;
- else if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ } else if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
taskqueue_enqueue(sc->sc_tq, &sc->sc_tx_task);
+ CAS_UNLOCK(sc);
status = CAS_READ_4(sc, CAS_STATUS_ALIAS);
if (__predict_false((status & CAS_INTR_SUMMARY) != 0)) {
@@ -2330,8 +2335,8 @@ cas_mii_statchg(device_t dev)
* the Cassini+ ASIC Specification.
*/
- rxcfg = CAS_READ_4(sc, CAS_MAC_RX_CONF);
- rxcfg &= ~(CAS_MAC_RX_CONF_EN | CAS_MAC_RX_CONF_CARR);
+ rxcfg = sc->sc_mac_rxcfg;
+ rxcfg &= ~CAS_MAC_RX_CONF_CARR;
txcfg = CAS_MAC_TX_CONF_EN_IPG0 | CAS_MAC_TX_CONF_NGU |
CAS_MAC_TX_CONF_NGUL;
if ((IFM_OPTIONS(sc->sc_mii->mii_media_active) & IFM_FDX) != 0)
@@ -2340,17 +2345,9 @@ cas_mii_statchg(device_t dev)
rxcfg |= CAS_MAC_RX_CONF_CARR;
txcfg |= CAS_MAC_TX_CONF_CARR;
}
- CAS_WRITE_4(sc, CAS_MAC_TX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_TX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_TX_CONF, CAS_MAC_TX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot disable TX MAC\n");
+ (void)cas_disable_tx(sc);
CAS_WRITE_4(sc, CAS_MAC_TX_CONF, txcfg);
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, 0);
- CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_EN, 0))
- device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+ (void)cas_disable_rx(sc);
CAS_WRITE_4(sc, CAS_MAC_RX_CONF, rxcfg);
v = CAS_READ_4(sc, CAS_MAC_CTRL_CONF) &
@@ -2408,7 +2405,8 @@ cas_mii_statchg(device_t dev)
v |= CAS_MAC_XIF_CONF_FDXLED;
CAS_WRITE_4(sc, CAS_MAC_XIF_CONF, v);
- if ((sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
+ sc->sc_mac_rxcfg = rxcfg;
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
(sc->sc_flags & CAS_LINK) != 0) {
CAS_WRITE_4(sc, CAS_MAC_TX_CONF,
txcfg | CAS_MAC_TX_CONF_EN);
@@ -2522,23 +2520,21 @@ cas_setladrf(struct cas_softc *sc)
CAS_LOCK_ASSERT(sc, MA_OWNED);
- /* Get the current RX configuration. */
- v = CAS_READ_4(sc, CAS_MAC_RX_CONF);
-
/*
- * Turn off promiscuous mode, promiscuous group mode (all multicast),
- * and hash filter. Depending on the case, the right bit will be
- * enabled.
+ * Turn off the RX MAC and the hash filter as required by the Sun
+ * Cassini programming restrictions.
*/
- v &= ~(CAS_MAC_RX_CONF_PROMISC | CAS_MAC_RX_CONF_HFILTER |
- CAS_MAC_RX_CONF_PGRP);
-
+ v = sc->sc_mac_rxcfg & ~(CAS_MAC_RX_CONF_HFILTER |
+ CAS_MAC_RX_CONF_EN);
CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v);
CAS_BARRIER(sc, CAS_MAC_RX_CONF, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_HFILTER, 0))
- device_printf(sc->sc_dev, "cannot disable RX hash filter\n");
+ if (!cas_bitwait(sc, CAS_MAC_RX_CONF, CAS_MAC_RX_CONF_HFILTER |
+ CAS_MAC_RX_CONF_EN, 0))
+ device_printf(sc->sc_dev,
+ "cannot disable RX MAC or hash filter\n");
+ v &= ~(CAS_MAC_RX_CONF_PROMISC | CAS_MAC_RX_CONF_PGRP);
if ((ifp->if_flags & IFF_PROMISC) != 0) {
v |= CAS_MAC_RX_CONF_PROMISC;
goto chipit;
@@ -2584,7 +2580,8 @@ cas_setladrf(struct cas_softc *sc)
hash[i]);
chipit:
- CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v);
+ sc->sc_mac_rxcfg = v;
+ CAS_WRITE_4(sc, CAS_MAC_RX_CONF, v | CAS_MAC_RX_CONF_EN);
}
static int cas_pci_attach(device_t dev);
diff --git a/sys/dev/cas/if_casvar.h b/sys/dev/cas/if_casvar.h
index fa2e6af..10b81dd 100644
--- a/sys/dev/cas/if_casvar.h
+++ b/sys/dev/cas/if_casvar.h
@@ -196,6 +196,8 @@ struct cas_softc {
u_int sc_rxcptr; /* next ready RX completion */
u_int sc_rxdptr; /* next ready RX descriptor */
+ uint32_t sc_mac_rxcfg; /* RX MAC conf. % CAS_MAC_RX_CONF_EN */
+
int sc_ifflags;
};
diff --git a/sys/dev/dc/dcphy.c b/sys/dev/dc/dcphy.c
index f4fc512..5c60ad5 100644
--- a/sys/dev/dc/dcphy.c
+++ b/sys/dev/dc/dcphy.c
@@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/resource.h>
-#include <sys/bus.h>
#include <dev/pci/pcivar.h>
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c
index 772eede..b9567de 100644
--- a/sys/dev/dc/if_dc.c
+++ b/sys/dev/dc/if_dc.c
@@ -1385,7 +1385,7 @@ dc_netcfg_wait(struct dc_softc *sc)
break;
DELAY(10);
}
- if (i == DC_TIMEOUT) {
+ if (i == DC_TIMEOUT && bus_child_present(sc->dc_dev)) {
if (!(isr & DC_ISR_TX_IDLE) && !DC_IS_ASIX(sc))
device_printf(sc->dc_dev,
"%s: failed to force tx to idle state\n", __func__);
diff --git a/sys/dev/dc/pnphy.c b/sys/dev/dc/pnphy.c
index 6468fbf..6546acd 100644
--- a/sys/dev/dc/pnphy.c
+++ b/sys/dev/dc/pnphy.c
@@ -60,7 +60,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/resource.h>
-#include <sys/bus.h>
#include <dev/dc/if_dcreg.h>
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index 156f8b2..4d8ba65 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -330,42 +330,71 @@ MODULE_DEPEND(em, ether, 1, 1, 1);
#define CSUM_TSO 0
#endif
+SYSCTL_NODE(_hw, OID_AUTO, em, CTLFLAG_RD, 0, "EM driver parameters");
+
static int em_tx_int_delay_dflt = EM_TICKS_TO_USECS(EM_TIDV);
static int em_rx_int_delay_dflt = EM_TICKS_TO_USECS(EM_RDTR);
TUNABLE_INT("hw.em.tx_int_delay", &em_tx_int_delay_dflt);
TUNABLE_INT("hw.em.rx_int_delay", &em_rx_int_delay_dflt);
+SYSCTL_INT(_hw_em, OID_AUTO, tx_int_delay, CTLFLAG_RDTUN, &em_tx_int_delay_dflt,
+ 0, "Default transmit interrupt delay in usecs");
+SYSCTL_INT(_hw_em, OID_AUTO, rx_int_delay, CTLFLAG_RDTUN, &em_rx_int_delay_dflt,
+ 0, "Default receive interrupt delay in usecs");
static int em_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV);
static int em_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV);
TUNABLE_INT("hw.em.tx_abs_int_delay", &em_tx_abs_int_delay_dflt);
TUNABLE_INT("hw.em.rx_abs_int_delay", &em_rx_abs_int_delay_dflt);
+SYSCTL_INT(_hw_em, OID_AUTO, tx_abs_int_delay, CTLFLAG_RDTUN,
+ &em_tx_abs_int_delay_dflt, 0,
+ "Default transmit interrupt delay limit in usecs");
+SYSCTL_INT(_hw_em, OID_AUTO, rx_abs_int_delay, CTLFLAG_RDTUN,
+ &em_rx_abs_int_delay_dflt, 0,
+ "Default receive interrupt delay limit in usecs");
static int em_rxd = EM_DEFAULT_RXD;
static int em_txd = EM_DEFAULT_TXD;
TUNABLE_INT("hw.em.rxd", &em_rxd);
TUNABLE_INT("hw.em.txd", &em_txd);
+SYSCTL_INT(_hw_em, OID_AUTO, rxd, CTLFLAG_RDTUN, &em_rxd, 0,
+ "Number of receive descriptors per queue");
+SYSCTL_INT(_hw_em, OID_AUTO, txd, CTLFLAG_RDTUN, &em_txd, 0,
+ "Number of transmit descriptors per queue");
static int em_smart_pwr_down = FALSE;
TUNABLE_INT("hw.em.smart_pwr_down", &em_smart_pwr_down);
+SYSCTL_INT(_hw_em, OID_AUTO, smart_pwr_down, CTLFLAG_RDTUN, &em_smart_pwr_down,
+ 0, "Set to true to leave smart power down enabled on newer adapters");
/* Controls whether promiscuous also shows bad packets */
static int em_debug_sbp = FALSE;
TUNABLE_INT("hw.em.sbp", &em_debug_sbp);
+SYSCTL_INT(_hw_em, OID_AUTO, sbp, CTLFLAG_RDTUN, &em_debug_sbp, 0,
+ "Show bad packets in promiscuous mode");
static int em_enable_msix = TRUE;
TUNABLE_INT("hw.em.enable_msix", &em_enable_msix);
+SYSCTL_INT(_hw_em, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &em_enable_msix, 0,
+ "Enable MSI-X interrupts");
/* How many packets rxeof tries to clean at a time */
static int em_rx_process_limit = 100;
TUNABLE_INT("hw.em.rx_process_limit", &em_rx_process_limit);
+SYSCTL_INT(_hw_em, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
+ &em_rx_process_limit, 0,
+ "Maximum number of received packets to process at a time, -1 means unlimited");
/* Flow control setting - default to FULL */
static int em_fc_setting = e1000_fc_full;
TUNABLE_INT("hw.em.fc_setting", &em_fc_setting);
+SYSCTL_INT(_hw_em, OID_AUTO, fc_setting, CTLFLAG_RDTUN, &em_fc_setting, 0,
+ "Flow control");
/* Energy efficient ethernet - default to OFF */
static int eee_setting = 0;
TUNABLE_INT("hw.em.eee_setting", &eee_setting);
+SYSCTL_INT(_hw_em, OID_AUTO, eee_setting, CTLFLAG_RDTUN, &eee_setting, 0,
+ "Enable Energy Efficient Ethernet");
/* Global used in WOL setup with multiport cards */
static int global_quad_port_a = 0;
diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c
index 4aa08f6..ff2e424 100644
--- a/sys/dev/e1000/if_igb.c
+++ b/sys/dev/e1000/if_igb.c
@@ -36,6 +36,7 @@
#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_device_polling.h"
#include "opt_inet.h"
+#include "opt_inet6.h"
#include "opt_altq.h"
#endif
@@ -99,7 +100,7 @@ int igb_display_debug_stats = 0;
/*********************************************************************
* Driver version:
*********************************************************************/
-char igb_driver_version[] = "version - 2.2.3";
+char igb_driver_version[] = "version - 2.2.5";
/*********************************************************************
@@ -170,13 +171,15 @@ static int igb_detach(device_t);
static int igb_shutdown(device_t);
static int igb_suspend(device_t);
static int igb_resume(device_t);
-static void igb_start(struct ifnet *);
-static void igb_start_locked(struct tx_ring *, struct ifnet *ifp);
#if __FreeBSD_version >= 800000
static int igb_mq_start(struct ifnet *, struct mbuf *);
static int igb_mq_start_locked(struct ifnet *,
struct tx_ring *, struct mbuf *);
static void igb_qflush(struct ifnet *);
+static void igb_deferred_mq_start(void *, int);
+#else
+static void igb_start(struct ifnet *);
+static void igb_start_locked(struct tx_ring *, struct ifnet *ifp);
#endif
static int igb_ioctl(struct ifnet *, u_long, caddr_t);
static void igb_init(void *);
@@ -263,6 +266,7 @@ static void igb_handle_link(void *context, int pending);
static void igb_set_sysctl_value(struct adapter *, const char *,
const char *, int *, int);
static int igb_set_flowcntl(SYSCTL_HANDLER_ARGS);
+static int igb_sysctl_dmac(SYSCTL_HANDLER_ARGS);
#ifdef DEVICE_POLLING
static poll_handler_t igb_poll;
@@ -296,11 +300,17 @@ MODULE_DEPEND(igb, ether, 1, 1, 1);
* Tunable default values.
*********************************************************************/
+SYSCTL_NODE(_hw, OID_AUTO, igb, CTLFLAG_RD, 0, "IGB driver parameters");
+
/* Descriptor defaults */
static int igb_rxd = IGB_DEFAULT_RXD;
static int igb_txd = IGB_DEFAULT_TXD;
TUNABLE_INT("hw.igb.rxd", &igb_rxd);
TUNABLE_INT("hw.igb.txd", &igb_txd);
+SYSCTL_INT(_hw_igb, OID_AUTO, rxd, CTLFLAG_RDTUN, &igb_rxd, 0,
+ "Number of receive descriptors per queue");
+SYSCTL_INT(_hw_igb, OID_AUTO, txd, CTLFLAG_RDTUN, &igb_txd, 0,
+ "Number of transmit descriptors per queue");
/*
** AIM: Adaptive Interrupt Moderation
@@ -310,6 +320,8 @@ TUNABLE_INT("hw.igb.txd", &igb_txd);
*/
static int igb_enable_aim = TRUE;
TUNABLE_INT("hw.igb.enable_aim", &igb_enable_aim);
+SYSCTL_INT(_hw_igb, OID_AUTO, enable_aim, CTLFLAG_RW, &igb_enable_aim, 0,
+ "Enable adaptive interrupt moderation");
/*
* MSIX should be the default for best performance,
@@ -317,12 +329,16 @@ TUNABLE_INT("hw.igb.enable_aim", &igb_enable_aim);
*/
static int igb_enable_msix = 1;
TUNABLE_INT("hw.igb.enable_msix", &igb_enable_msix);
+SYSCTL_INT(_hw_igb, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &igb_enable_msix, 0,
+ "Enable MSI-X interrupts");
/*
** Tuneable Interrupt rate
*/
static int igb_max_interrupt_rate = 8000;
TUNABLE_INT("hw.igb.max_interrupt_rate", &igb_max_interrupt_rate);
+SYSCTL_INT(_hw_igb, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
+ &igb_max_interrupt_rate, 0, "Maximum interrupts per second");
/*
** Header split causes the packet header to
@@ -334,6 +350,8 @@ TUNABLE_INT("hw.igb.max_interrupt_rate", &igb_max_interrupt_rate);
*/
static bool igb_header_split = FALSE;
TUNABLE_INT("hw.igb.hdr_split", &igb_header_split);
+SYSCTL_INT(_hw_igb, OID_AUTO, header_split, CTLFLAG_RDTUN, &igb_header_split, 0,
+ "Enable receive mbuf header split");
/*
** This will autoconfigure based on
@@ -341,25 +359,15 @@ TUNABLE_INT("hw.igb.hdr_split", &igb_header_split);
*/
static int igb_num_queues = 0;
TUNABLE_INT("hw.igb.num_queues", &igb_num_queues);
+SYSCTL_INT(_hw_igb, OID_AUTO, num_queues, CTLFLAG_RDTUN, &igb_num_queues, 0,
+ "Number of queues to configure, 0 indicates autoconfigure");
/* How many packets rxeof tries to clean at a time */
static int igb_rx_process_limit = 100;
TUNABLE_INT("hw.igb.rx_process_limit", &igb_rx_process_limit);
-
-/* Flow control setting - default to FULL */
-static int igb_fc_setting = e1000_fc_full;
-TUNABLE_INT("hw.igb.fc_setting", &igb_fc_setting);
-
-/* Energy Efficient Ethernet - default to off */
-static int igb_eee_disabled = TRUE;
-TUNABLE_INT("hw.igb.eee_disabled", &igb_eee_disabled);
-
-/*
-** DMA Coalescing, only for i350 - default to off,
-** this feature is for power savings
-*/
-static int igb_dma_coalesce = FALSE;
-TUNABLE_INT("hw.igb.dma_coalesce", &igb_dma_coalesce);
+SYSCTL_INT(_hw_igb, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
+ &igb_rx_process_limit, 0,
+ "Maximum number of received packets to process at a time, -1 means unlimited");
/*********************************************************************
* Device identification routine
@@ -431,6 +439,11 @@ igb_attach(device_t dev)
INIT_DEBUGOUT("igb_attach: begin");
+ if (resource_disabled("igb", device_get_unit(dev))) {
+ device_printf(dev, "Disabled by device hint\n");
+ return (ENXIO);
+ }
+
adapter = device_get_softc(dev);
adapter->dev = adapter->osdep.dev = dev;
IGB_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
@@ -441,14 +454,13 @@ igb_attach(device_t dev)
OID_AUTO, "nvm", CTLTYPE_INT|CTLFLAG_RW, adapter, 0,
igb_sysctl_nvm_info, "I", "NVM Information");
- SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
- OID_AUTO, "enable_aim", CTLTYPE_INT|CTLFLAG_RW,
- &igb_enable_aim, 1, "Interrupt Moderation");
+ igb_set_sysctl_value(adapter, "enable_aim",
+ "Interrupt Moderation", &adapter->enable_aim,
+ igb_enable_aim);
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
- OID_AUTO, "flow_control", CTLTYPE_INT|CTLFLAG_RW,
+ OID_AUTO, "fc", CTLTYPE_INT|CTLFLAG_RW,
adapter, 0, igb_set_flowcntl, "I", "Flow Control");
callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
@@ -474,8 +486,8 @@ igb_attach(device_t dev)
/* Sysctl for limiting the amount of work done in the taskqueue */
igb_set_sysctl_value(adapter, "rx_processing_limit",
- "max number of rx packets to process", &adapter->rx_process_limit,
- igb_rx_process_limit);
+ "max number of rx packets to process",
+ &adapter->rx_process_limit, igb_rx_process_limit);
/*
* Validate number of transmit and receive descriptors. It
@@ -550,13 +562,14 @@ igb_attach(device_t dev)
/* Some adapter-specific advanced features */
if (adapter->hw.mac.type >= e1000_i350) {
- igb_set_sysctl_value(adapter, "dma_coalesce",
- "configure dma coalesce",
- &adapter->dma_coalesce, igb_dma_coalesce);
+ SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+ OID_AUTO, "dmac", CTLTYPE_INT|CTLFLAG_RW,
+ adapter, 0, igb_sysctl_dmac, "I", "DMA Coalesce");
igb_set_sysctl_value(adapter, "eee_disabled",
"enable Energy Efficient Ethernet",
&adapter->hw.dev_spec._82575.eee_disable,
- igb_eee_disabled);
+ TRUE);
e1000_set_eee_i350(&adapter->hw);
}
@@ -656,6 +669,7 @@ igb_attach(device_t dev)
return (0);
err_late:
+ igb_detach(dev);
igb_free_transmit_structures(adapter);
igb_free_receive_structures(adapter);
igb_release_hw_control(adapter);
@@ -693,6 +707,8 @@ igb_detach(device_t dev)
return (EBUSY);
}
+ ether_ifdetach(adapter->ifp);
+
if (adapter->led_dev != NULL)
led_destroy(adapter->led_dev);
@@ -724,8 +740,6 @@ igb_detach(device_t dev)
if (adapter->vlan_detach != NULL)
EVENTHANDLER_DEREGISTER(vlan_unconfig, adapter->vlan_detach);
- ether_ifdetach(adapter->ifp);
-
callout_drain(&adapter->timer);
igb_free_pci_resources(adapter);
@@ -734,7 +748,8 @@ igb_detach(device_t dev)
igb_free_transmit_structures(adapter);
igb_free_receive_structures(adapter);
- free(adapter->mta, M_DEVBUF);
+ if (adapter->mta != NULL)
+ free(adapter->mta, M_DEVBUF);
IGB_CORE_LOCK_DESTROY(adapter);
@@ -784,14 +799,27 @@ igb_resume(device_t dev)
{
struct adapter *adapter = device_get_softc(dev);
struct ifnet *ifp = adapter->ifp;
+#if __FreeBSD_version >= 800000
+ struct tx_ring *txr = adapter->tx_rings;
+#endif
IGB_CORE_LOCK(adapter);
igb_init_locked(adapter);
igb_init_manageability(adapter);
if ((ifp->if_flags & IFF_UP) &&
- (ifp->if_drv_flags & IFF_DRV_RUNNING))
+ (ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+#if __FreeBSD_version < 800000
igb_start(ifp);
+#else
+ for (int i = 0; i < adapter->num_queues; i++, txr++) {
+ IGB_TX_LOCK(txr);
+ if (!drbr_empty(ifp, txr->br))
+ igb_mq_start_locked(ifp, txr, NULL);
+ IGB_TX_UNLOCK(txr);
+ }
+#endif
+ }
IGB_CORE_UNLOCK(adapter);
@@ -799,6 +827,7 @@ igb_resume(device_t dev)
}
+#if __FreeBSD_version < 800000
/*********************************************************************
* Transmit entry point
*
@@ -875,7 +904,7 @@ igb_start(struct ifnet *ifp)
return;
}
-#if __FreeBSD_version >= 800000
+#else /* __FreeBSD_version >= 800000 */
/*
** Multiqueue Transmit driver
**
@@ -900,7 +929,7 @@ igb_mq_start(struct ifnet *ifp, struct mbuf *m)
IGB_TX_UNLOCK(txr);
} else {
err = drbr_enqueue(ifp, txr->br, m);
- taskqueue_enqueue(que->tq, &que->que_task);
+ taskqueue_enqueue(que->tq, &txr->txq_task);
}
return (err);
@@ -961,6 +990,22 @@ igb_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m)
}
/*
+ * Called from a taskqueue to drain queued transmit packets.
+ */
+static void
+igb_deferred_mq_start(void *arg, int pending)
+{
+ struct tx_ring *txr = arg;
+ struct adapter *adapter = txr->adapter;
+ struct ifnet *ifp = adapter->ifp;
+
+ IGB_TX_LOCK(txr);
+ if (!drbr_empty(ifp, txr->br))
+ igb_mq_start_locked(ifp, txr, NULL);
+ IGB_TX_UNLOCK(txr);
+}
+
+/*
** Flush all ring buffers
*/
static void
@@ -978,7 +1023,7 @@ igb_qflush(struct ifnet *ifp)
}
if_qflush(ifp);
}
-#endif /* __FreeBSD_version >= 800000 */
+#endif /* __FreeBSD_version < 800000 */
/*********************************************************************
* Ioctl entry point
@@ -993,11 +1038,12 @@ static int
igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
{
struct adapter *adapter = ifp->if_softc;
- struct ifreq *ifr = (struct ifreq *)data;
-#ifdef INET
- struct ifaddr *ifa = (struct ifaddr *)data;
+ struct ifreq *ifr = (struct ifreq *)data;
+#if defined(INET) || defined(INET6)
+ struct ifaddr *ifa = (struct ifaddr *)data;
#endif
- int error = 0;
+ bool avoid_reset = FALSE;
+ int error = 0;
if (adapter->in_detach)
return (error);
@@ -1005,24 +1051,26 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
switch (command) {
case SIOCSIFADDR:
#ifdef INET
- if (ifa->ifa_addr->sa_family == AF_INET) {
- /*
- * XXX
- * Since resetting hardware takes a very long time
- * and results in link renegotiation we only
- * initialize the hardware only when it is absolutely
- * required.
- */
+ if (ifa->ifa_addr->sa_family == AF_INET)
+ avoid_reset = TRUE;
+#endif
+#ifdef INET6
+ if (ifa->ifa_addr->sa_family == AF_INET6)
+ avoid_reset = TRUE;
+#endif
+ /*
+ ** Calling init results in link renegotiation,
+ ** so we avoid doing it when possible.
+ */
+ if (avoid_reset) {
ifp->if_flags |= IFF_UP;
- if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
- IGB_CORE_LOCK(adapter);
- igb_init_locked(adapter);
- IGB_CORE_UNLOCK(adapter);
- }
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ igb_init(adapter);
+#ifdef INET
if (!(ifp->if_flags & IFF_NOARP))
arp_ifinit(ifp, ifa);
- } else
#endif
+ } else
error = ether_ioctl(ifp, command, data);
break;
case SIOCSIFMTU:
@@ -1143,6 +1191,10 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
reinit = 1;
}
+ if (mask & IFCAP_VLAN_HWTSO) {
+ ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
+ reinit = 1;
+ }
if (mask & IFCAP_LRO) {
ifp->if_capenable ^= IFCAP_LRO;
reinit = 1;
@@ -1464,7 +1516,7 @@ igb_msix_que(void *arg)
more_rx = igb_rxeof(que, adapter->rx_process_limit, NULL);
- if (igb_enable_aim == FALSE)
+ if (adapter->enable_aim == FALSE)
goto no_calc;
/*
** Do Adaptive Interrupt Moderation:
@@ -2180,6 +2232,7 @@ igb_allocate_legacy(struct adapter *adapter)
{
device_t dev = adapter->dev;
struct igb_queue *que = adapter->queues;
+ struct tx_ring *txr = adapter->tx_rings;
int error, rid = 0;
/* Turn off all interrupts */
@@ -2198,6 +2251,10 @@ igb_allocate_legacy(struct adapter *adapter)
return (ENXIO);
}
+#if __FreeBSD_version >= 800000
+ TASK_INIT(&txr->txq_task, 0, igb_deferred_mq_start, txr);
+#endif
+
/*
* Try allocating a fast interrupt and the associated deferred
* processing contexts.
@@ -2268,9 +2325,13 @@ igb_allocate_msix(struct adapter *adapter)
*/
if (adapter->num_queues > 1)
bus_bind_intr(dev, que->res, i);
+#if __FreeBSD_version >= 800000
+ TASK_INIT(&que->txr->txq_task, 0, igb_deferred_mq_start,
+ que->txr);
+#endif
/* Make tasklet for deferred handling */
TASK_INIT(&que->que_task, 0, igb_handle_que, que);
- que->tq = taskqueue_create_fast("igb_que", M_NOWAIT,
+ que->tq = taskqueue_create("igb_que", M_NOWAIT,
taskqueue_thread_enqueue, &que->tq);
taskqueue_start_threads(&que->tq, 1, PI_NET, "%s que",
device_get_nameunit(adapter->dev));
@@ -2477,13 +2538,24 @@ igb_free_pci_resources(struct adapter *adapter)
else
(adapter->msix != 0) ? (rid = 1):(rid = 0);
+ que = adapter->queues;
if (adapter->tag != NULL) {
+ taskqueue_drain(que->tq, &adapter->link_task);
bus_teardown_intr(dev, adapter->res, adapter->tag);
adapter->tag = NULL;
}
if (adapter->res != NULL)
bus_release_resource(dev, SYS_RES_IRQ, rid, adapter->res);
+ for (int i = 0; i < adapter->num_queues; i++, que++) {
+ if (que->tq != NULL) {
+#if __FreeBSD_version >= 800000
+ taskqueue_drain(que->tq, &que->txr->txq_task);
+#endif
+ taskqueue_drain(que->tq, &que->que_task);
+ taskqueue_free(que->tq);
+ }
+ }
mem:
if (adapter->msix)
pci_release_msi(dev);
@@ -2669,6 +2741,12 @@ igb_reset(struct adapter *adapter)
fc->pause_time = IGB_FC_PAUSE_TIME;
fc->send_xon = TRUE;
+ if (fc->requested_mode)
+ fc->current_mode = fc->requested_mode;
+ else
+ fc->current_mode = e1000_fc_full;
+
+ adapter->fc = fc->current_mode;
/* Issue a global reset */
e1000_reset_hw(hw);
@@ -2678,9 +2756,13 @@ igb_reset(struct adapter *adapter)
device_printf(dev, "Hardware Initialization Failed\n");
/* Setup DMA Coalescing */
- if ((hw->mac.type == e1000_i350) &&
- (adapter->dma_coalesce == TRUE)) {
- u32 reg;
+ if (hw->mac.type == e1000_i350) {
+ u32 reg = ~E1000_DMACR_DMAC_EN;
+
+ if (adapter->dmac == 0) { /* Disabling it */
+ E1000_WRITE_REG(hw, E1000_DMACR, reg);
+ goto reset_out;
+ }
hwm = (pba - 4) << 10;
reg = (((pba-6) << E1000_DMACR_DMACTHR_SHIFT)
@@ -2689,8 +2771,8 @@ igb_reset(struct adapter *adapter)
/* transition to L0x or L1 if available..*/
reg |= (E1000_DMACR_DMAC_EN | E1000_DMACR_DMAC_LX_MASK);
- /* timer = +-1000 usec in 32usec intervals */
- reg |= (1000 >> 5);
+ /* timer = value in adapter->dmac in 32usec intervals */
+ reg |= (adapter->dmac >> 5);
E1000_WRITE_REG(hw, E1000_DMACR, reg);
/* No lower threshold */
@@ -2715,6 +2797,7 @@ igb_reset(struct adapter *adapter)
device_printf(dev, "DMA Coalescing enabled\n");
}
+reset_out:
E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN);
e1000_get_phy_info(hw);
e1000_check_for_link(hw);
@@ -2744,10 +2827,11 @@ igb_setup_interface(device_t dev, struct adapter *adapter)
ifp->if_softc = adapter;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = igb_ioctl;
- ifp->if_start = igb_start;
#if __FreeBSD_version >= 800000
ifp->if_transmit = igb_mq_start;
ifp->if_qflush = igb_qflush;
+#else
+ ifp->if_start = igb_start;
#endif
IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1);
ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1;
@@ -2774,15 +2858,19 @@ igb_setup_interface(device_t dev, struct adapter *adapter)
* support full VLAN capability.
*/
ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
- ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
- ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
+ ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING
+ | IFCAP_VLAN_HWTSO
+ | IFCAP_VLAN_MTU;
+ ifp->if_capenable |= IFCAP_VLAN_HWTAGGING
+ | IFCAP_VLAN_HWTSO
+ | IFCAP_VLAN_MTU;
/*
- ** Dont turn this on by default, if vlans are
+ ** Don't turn this on by default, if vlans are
** created on another pseudo device (eg. lagg)
** then vlan events are not passed thru, breaking
** operation, but with HW FILTER off it works. If
- ** using vlans directly on the em driver you can
+ ** using vlans directly on the igb driver you can
** enable this and get full hardware tag filtering.
*/
ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
@@ -5542,19 +5630,18 @@ static int
igb_set_flowcntl(SYSCTL_HANDLER_ARGS)
{
int error;
- struct adapter *adapter;
+ struct adapter *adapter = (struct adapter *) arg1;
- error = sysctl_handle_int(oidp, &igb_fc_setting, 0, req);
+ error = sysctl_handle_int(oidp, &adapter->fc, 0, req);
- if (error)
+ if ((error) || (req->newptr == NULL))
return (error);
- adapter = (struct adapter *) arg1;
- switch (igb_fc_setting) {
+ switch (adapter->fc) {
case e1000_fc_rx_pause:
case e1000_fc_tx_pause:
case e1000_fc_full:
- adapter->hw.fc.requested_mode = igb_fc_setting;
+ adapter->hw.fc.requested_mode = adapter->fc;
break;
case e1000_fc_none:
default:
@@ -5563,5 +5650,54 @@ igb_set_flowcntl(SYSCTL_HANDLER_ARGS)
adapter->hw.fc.current_mode = adapter->hw.fc.requested_mode;
e1000_force_mac_fc(&adapter->hw);
- return error;
+ return (error);
+}
+
+/*
+** Manage DMA Coalesce:
+** Control values:
+** 0/1 - off/on
+** Legal timer values are:
+** 250,500,1000-10000 in thousands
+*/
+static int
+igb_sysctl_dmac(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ int error;
+
+ error = sysctl_handle_int(oidp, &adapter->dmac, 0, req);
+
+ if ((error) || (req->newptr == NULL))
+ return (error);
+
+ switch (adapter->dmac) {
+ case 0:
+ /*Disabling */
+ break;
+ case 1: /* Just enable and use default */
+ adapter->dmac = 1000;
+ break;
+ case 250:
+ case 500:
+ case 1000:
+ case 2000:
+ case 3000:
+ case 4000:
+ case 5000:
+ case 6000:
+ case 7000:
+ case 8000:
+ case 9000:
+ case 10000:
+ /* Legal values - allow */
+ break;
+ default:
+ /* Do nothing, illegal value */
+ adapter->dmac = 0;
+ return (error);
+ }
+ /* Reinit the interface */
+ igb_init(adapter);
+ return (error);
}
diff --git a/sys/dev/e1000/if_igb.h b/sys/dev/e1000/if_igb.h
index 609d650..80abf6e 100644
--- a/sys/dev/e1000/if_igb.h
+++ b/sys/dev/e1000/if_igb.h
@@ -297,6 +297,7 @@ struct tx_ring {
struct buf_ring *br;
#endif
bus_dma_tag_t txtag;
+ struct task txq_task;
u32 bytes;
u32 packets;
@@ -395,11 +396,13 @@ struct adapter {
u32 shadow_vfta[IGB_VFTA_SIZE];
/* Info about the interface */
- u8 link_active;
+ u16 link_active;
+ u16 fc;
u16 link_speed;
u16 link_duplex;
u32 smartspeed;
- u32 dma_coalesce;
+ u32 dmac;
+ int enable_aim;
/* Interface queues */
struct igb_queue *queues;
diff --git a/sys/dev/en/if_en_pci.c b/sys/dev/en/if_en_pci.c
index 09ba8bc..3886c9e 100644
--- a/sys/dev/en/if_en_pci.c
+++ b/sys/dev/en/if_en_pci.c
@@ -44,9 +44,6 @@ __FBSDID("$FreeBSD$");
* thanks to Matt Thomas for figuring out FreeBSD vs NetBSD vs etc.. diffs.
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/module.h>
diff --git a/sys/dev/et/if_et.c b/sys/dev/et/if_et.c
index 82c6217..9bd68e8 100644
--- a/sys/dev/et/if_et.c
+++ b/sys/dev/et/if_et.c
@@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_types.h>
#include <net/bpf.h>
#include <net/if_arp.h>
-#include <net/if_dl.h>
#include <net/if_media.h>
#include <net/if_vlan_var.h>
diff --git a/sys/dev/fdc/fdc_pccard.c b/sys/dev/fdc/fdc_pccard.c
index 72a3568..d959060 100644
--- a/sys/dev/fdc/fdc_pccard.c
+++ b/sys/dev/fdc/fdc_pccard.c
@@ -38,8 +38,6 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <machine/bus.h>
-#include <machine/bus.h>
-
#include <dev/fdc/fdcvar.h>
#include <dev/pccard/pccardvar.h>
#include "pccarddevs.h"
diff --git a/sys/dev/firewire/fwohci.c b/sys/dev/firewire/fwohci.c
index cccbc8c..4b147b2 100644
--- a/sys/dev/firewire/fwohci.c
+++ b/sys/dev/firewire/fwohci.c
@@ -2072,8 +2072,9 @@ fwohci_check_stat(struct fwohci_softc *sc)
FW_GLOCK_ASSERT(&sc->fc);
stat = OREAD(sc, FWOHCI_INTSTAT);
if (stat == 0xffffffff) {
- device_printf(sc->fc.dev,
- "device physically ejected?\n");
+ if (!bus_child_present(sc->fc.dev))
+ return (FILTER_HANDLED);
+ device_printf(sc->fc.dev, "device physically ejected?\n");
return (FILTER_STRAY);
}
if (stat)
diff --git a/sys/dev/fxp/if_fxp.c b/sys/dev/fxp/if_fxp.c
index e02d580..62c8dc2 100644
--- a/sys/dev/fxp/if_fxp.c
+++ b/sys/dev/fxp/if_fxp.c
@@ -3012,8 +3012,10 @@ static uint32_t fxp_ucode_d101a[] = D101_A_RCVBUNDLE_UCODE;
static uint32_t fxp_ucode_d101b0[] = D101_B0_RCVBUNDLE_UCODE;
static uint32_t fxp_ucode_d101ma[] = D101M_B_RCVBUNDLE_UCODE;
static uint32_t fxp_ucode_d101s[] = D101S_RCVBUNDLE_UCODE;
+#ifdef notyet
static uint32_t fxp_ucode_d102[] = D102_B_RCVBUNDLE_UCODE;
static uint32_t fxp_ucode_d102c[] = D102_C_RCVBUNDLE_UCODE;
+#endif
static uint32_t fxp_ucode_d102e[] = D102_E_RCVBUNDLE_UCODE;
#define UCODE(x) x, sizeof(x)/sizeof(uint32_t)
@@ -3031,12 +3033,16 @@ static const struct ucode {
D101M_CPUSAVER_DWORD, D101M_CPUSAVER_BUNDLE_MAX_DWORD },
{ FXP_REV_82559S_A, UCODE(fxp_ucode_d101s),
D101S_CPUSAVER_DWORD, D101S_CPUSAVER_BUNDLE_MAX_DWORD },
+#ifdef notyet
{ FXP_REV_82550, UCODE(fxp_ucode_d102),
D102_B_CPUSAVER_DWORD, D102_B_CPUSAVER_BUNDLE_MAX_DWORD },
{ FXP_REV_82550_C, UCODE(fxp_ucode_d102c),
D102_C_CPUSAVER_DWORD, D102_C_CPUSAVER_BUNDLE_MAX_DWORD },
+#endif
{ FXP_REV_82551_F, UCODE(fxp_ucode_d102e),
D102_E_CPUSAVER_DWORD, D102_E_CPUSAVER_BUNDLE_MAX_DWORD },
+ { FXP_REV_82551_10, UCODE(fxp_ucode_d102e),
+ D102_E_CPUSAVER_DWORD, D102_E_CPUSAVER_BUNDLE_MAX_DWORD },
{ 0, NULL, 0, 0, 0 }
};
diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c
index 9ee43f2..d75e1ab 100644
--- a/sys/dev/gem/if_gem.c
+++ b/sys/dev/gem/if_gem.c
@@ -626,7 +626,9 @@ gem_reset(struct gem_softc *sc)
gem_reset_tx(sc);
/* Do a full reset. */
- GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX);
+ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX |
+ (sc->sc_variant == GEM_SUN_ERI ? GEM_ERI_CACHE_LINE_SIZE <<
+ GEM_RESET_CLSZ_SHFT : 0));
GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX, 0))
@@ -705,7 +707,7 @@ gem_reset_rx(struct gem_softc *sc)
* Resetting while DMA is in progress can cause a bus hang, so we
* disable DMA first.
*/
- gem_disable_rx(sc);
+ (void)gem_disable_rx(sc);
GEM_BANK1_WRITE_4(sc, GEM_RX_CONFIG, 0);
GEM_BANK1_BARRIER(sc, GEM_RX_CONFIG, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
@@ -715,15 +717,26 @@ gem_reset_rx(struct gem_softc *sc)
/* Wait 5ms extra. */
DELAY(5000);
- /* Finally, reset the ERX. */
- GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX);
+ /* Reset the ERX. */
+ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX |
+ (sc->sc_variant == GEM_SUN_ERI ? GEM_ERI_CACHE_LINE_SIZE <<
+ GEM_RESET_CLSZ_SHFT : 0));
GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX,
- 0)) {
+ if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX, 0)) {
device_printf(sc->sc_dev, "cannot reset receiver\n");
return (1);
}
+
+ /* Finally, reset RX MAC. */
+ GEM_BANK1_WRITE_4(sc, GEM_MAC_RXRESET, 1);
+ GEM_BANK1_BARRIER(sc, GEM_MAC_RXRESET, 4,
+ BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+ if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RXRESET, 1, 0)) {
+ device_printf(sc->sc_dev, "cannot reset RX MAC\n");
+ return (1);
+ }
+
return (0);
}
@@ -759,7 +772,7 @@ gem_reset_rxdma(struct gem_softc *sc)
GEM_RX_CONFIG_CXM_START_SHFT) |
(GEM_THRSH_1024 << GEM_RX_CONFIG_FIFO_THRS_SHIFT) |
(ETHER_ALIGN << GEM_RX_CONFIG_FBOFF_SHFT));
- /* Adjust for the SBus clock probably isn't worth the fuzz. */
+ /* Adjusting for the SBus clock probably isn't worth the fuzz. */
GEM_BANK1_WRITE_4(sc, GEM_RX_BLANKING,
((6 * (sc->sc_flags & GEM_PCI66) != 0 ? 2 : 1) <<
GEM_RX_BLANKING_TIME_SHIFT) | 6);
@@ -770,8 +783,11 @@ gem_reset_rxdma(struct gem_softc *sc)
GEM_BANK1_READ_4(sc, GEM_RX_CONFIG) | GEM_RX_CONFIG_RXDMA_EN);
GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_MASK,
GEM_MAC_RX_DONE | GEM_MAC_RX_FRAME_CNT);
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG,
- GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG) | GEM_MAC_RX_ENABLE);
+ /*
+ * Clear the RX filter and reprogram it. This will also set the
+ * current RX MAC configuration and enable it.
+ */
+ gem_setladrf(sc);
}
static int
@@ -782,7 +798,7 @@ gem_reset_tx(struct gem_softc *sc)
* Resetting while DMA is in progress can cause a bus hang, so we
* disable DMA first.
*/
- gem_disable_tx(sc);
+ (void)gem_disable_tx(sc);
GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG, 0);
GEM_BANK1_BARRIER(sc, GEM_TX_CONFIG, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
@@ -793,11 +809,12 @@ gem_reset_tx(struct gem_softc *sc)
DELAY(5000);
/* Finally, reset the ETX. */
- GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_TX);
+ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_TX |
+ (sc->sc_variant == GEM_SUN_ERI ? GEM_ERI_CACHE_LINE_SIZE <<
+ GEM_RESET_CLSZ_SHFT : 0));
GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX,
- 0)) {
+ if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_TX, 0)) {
device_printf(sc->sc_dev, "cannot reset transmitter\n");
return (1);
}
@@ -812,8 +829,10 @@ gem_disable_rx(struct gem_softc *sc)
GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG) & ~GEM_MAC_RX_ENABLE);
GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- return (GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE,
- 0));
+ if (GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0))
+ return (1);
+ device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+ return (0);
}
static int
@@ -824,8 +843,10 @@ gem_disable_tx(struct gem_softc *sc)
GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG) & ~GEM_MAC_TX_ENABLE);
GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- return (GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE,
- 0));
+ if (GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0))
+ return (1);
+ device_printf(sc->sc_dev, "cannot disable TX MAC\n");
+ return (0);
}
static int
@@ -960,7 +981,6 @@ gem_init_locked(struct gem_softc *sc)
gem_init_regs(sc);
/* step 5. RX MAC registers & counters */
- gem_setladrf(sc);
/* step 6 & 7. Program Descriptor Ring Base Addresses. */
/* NOTE: we use only 32-bit DMA addresses here. */
@@ -1032,7 +1052,7 @@ gem_init_locked(struct gem_softc *sc)
(ETHER_ALIGN << GEM_RX_CONFIG_FBOFF_SHFT) |
GEM_RX_CONFIG_RXDMA_EN);
- /* Adjust for the SBus clock probably isn't worth the fuzz. */
+ /* Adjusting for the SBus clock probably isn't worth the fuzz. */
GEM_BANK1_WRITE_4(sc, GEM_RX_BLANKING,
((6 * (sc->sc_flags & GEM_PCI66) != 0 ? 2 : 1) <<
GEM_RX_BLANKING_TIME_SHIFT) | 6);
@@ -1049,22 +1069,19 @@ gem_init_locked(struct gem_softc *sc)
/* step 12. RX_MAC Configuration Register */
v = GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG);
- v |= GEM_MAC_RX_ENABLE | GEM_MAC_RX_STRIP_CRC;
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, 0);
- GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0))
- device_printf(sc->sc_dev, "cannot configure RX MAC\n");
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
+ v &= ~GEM_MAC_RX_ENABLE;
+ v |= GEM_MAC_RX_STRIP_CRC;
+ sc->sc_mac_rxcfg = v;
+ /*
+ * Clear the RX filter and reprogram it. This will also set the
+ * current RX MAC configuration and enable it.
+ */
+ gem_setladrf(sc);
/* step 13. TX_MAC Configuration Register */
v = GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG);
v |= GEM_MAC_TX_ENABLE;
- GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, 0);
- GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0))
- device_printf(sc->sc_dev, "cannot configure TX MAC\n");
+ (void)gem_disable_tx(sc);
GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, v);
/* step 14. Issue Transmit Pending command. */
@@ -1588,7 +1605,7 @@ gem_rint(struct gem_softc *sc)
* the buffer that's already attached to this descriptor.
*/
if (gem_add_rxbuf(sc, sc->sc_rxptr) != 0) {
- ifp->if_ierrors++;
+ ifp->if_iqdrops++;
GEM_INIT_RXDESC(sc, sc->sc_rxptr);
m = NULL;
}
@@ -2028,8 +2045,8 @@ gem_mii_statchg(device_t dev)
* the GEM Gigabit Ethernet ASIC Specification.
*/
- rxcfg = GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG);
- rxcfg &= ~(GEM_MAC_RX_CARR_EXTEND | GEM_MAC_RX_ENABLE);
+ rxcfg = sc->sc_mac_rxcfg;
+ rxcfg &= ~GEM_MAC_RX_CARR_EXTEND;
txcfg = GEM_MAC_TX_ENA_IPG0 | GEM_MAC_TX_NGU | GEM_MAC_TX_NGU_LIMIT;
if ((IFM_OPTIONS(sc->sc_mii->mii_media_active) & IFM_FDX) != 0)
txcfg |= GEM_MAC_TX_IGN_CARRIER | GEM_MAC_TX_IGN_COLLIS;
@@ -2037,17 +2054,9 @@ gem_mii_statchg(device_t dev)
rxcfg |= GEM_MAC_RX_CARR_EXTEND;
txcfg |= GEM_MAC_TX_CARR_EXTEND;
}
- GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, 0);
- GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0))
- device_printf(sc->sc_dev, "cannot disable TX MAC\n");
+ (void)gem_disable_tx(sc);
GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, txcfg);
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, 0);
- GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
- BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0))
- device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+ (void)gem_disable_rx(sc);
GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, rxcfg);
v = GEM_BANK1_READ_4(sc, GEM_MAC_CONTROL_CONFIG) &
@@ -2092,6 +2101,7 @@ gem_mii_statchg(device_t dev)
v |= GEM_MAC_XIF_FDPLX_LED;
GEM_BANK1_WRITE_4(sc, GEM_MAC_XIF_CONFIG, v);
+ sc->sc_mac_rxcfg = rxcfg;
if ((sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 &&
(sc->sc_flags & GEM_LINK) != 0) {
GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG,
@@ -2164,7 +2174,8 @@ gem_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case SIOCADDMULTI:
case SIOCDELMULTI:
GEM_LOCK(sc);
- gem_setladrf(sc);
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+ gem_setladrf(sc);
GEM_UNLOCK(sc);
break;
case SIOCGIFMEDIA:
@@ -2199,24 +2210,20 @@ gem_setladrf(struct gem_softc *sc)
GEM_LOCK_ASSERT(sc, MA_OWNED);
- /* Get the current RX configuration. */
- v = GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG);
-
/*
- * Turn off promiscuous mode, promiscuous group mode (all multicast),
- * and hash filter. Depending on the case, the right bit will be
- * enabled.
+ * Turn off the RX MAC and the hash filter as required by the Sun GEM
+ * programming restrictions.
*/
- v &= ~(GEM_MAC_RX_PROMISCUOUS | GEM_MAC_RX_HASH_FILTER |
- GEM_MAC_RX_PROMISC_GRP);
-
+ v = sc->sc_mac_rxcfg & ~GEM_MAC_RX_HASH_FILTER;
GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
- if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_HASH_FILTER,
- 0))
- device_printf(sc->sc_dev, "cannot disable RX hash filter\n");
+ if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_HASH_FILTER |
+ GEM_MAC_RX_ENABLE, 0))
+ device_printf(sc->sc_dev,
+ "cannot disable RX MAC or hash filter\n");
+ v &= ~(GEM_MAC_RX_PROMISCUOUS | GEM_MAC_RX_PROMISC_GRP);
if ((ifp->if_flags & IFF_PROMISC) != 0) {
v |= GEM_MAC_RX_PROMISCUOUS;
goto chipit;
@@ -2262,5 +2269,6 @@ gem_setladrf(struct gem_softc *sc)
hash[i]);
chipit:
- GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
+ sc->sc_mac_rxcfg = v;
+ GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v | GEM_MAC_RX_ENABLE);
}
diff --git a/sys/dev/gem/if_gem_pci.c b/sys/dev/gem/if_gem_pci.c
index cfea337..c5e1acd 100644
--- a/sys/dev/gem/if_gem_pci.c
+++ b/sys/dev/gem/if_gem_pci.c
@@ -177,6 +177,10 @@ gem_pci_attach(device_t dev)
if (pci_get_intpin(dev) == 0)
pci_set_intpin(dev, 1);
+ /* Set the PCI latency timer for Sun ERIs. */
+ if (sc->sc_variant == GEM_SUN_ERI)
+ pci_write_config(dev, PCIR_LATTIMER, GEM_ERI_LATENCY_TIMER, 1);
+
sc->sc_dev = dev;
sc->sc_flags |= GEM_PCI;
diff --git a/sys/dev/gem/if_gemreg.h b/sys/dev/gem/if_gemreg.h
index effcaf5..394fd90 100644
--- a/sys/dev/gem/if_gemreg.h
+++ b/sys/dev/gem/if_gemreg.h
@@ -35,7 +35,7 @@
/* register definitions for Apple GMAC, Sun ERI and Sun GEM */
/*
- * First bank: this registers live at the start of the PCI
+ * First bank: these registers live at the start of the PCI
* mapping, and at the start of the second bank of the SBus
* version.
*/
@@ -93,7 +93,7 @@
"b\x10MAC_CONTROL\0b\x11MIF\0b\x12IBERR\0\0"
/*
- * Second bank: this registers live at offset 0x1000 of the PCI
+ * Second bank: these registers live at offset 0x1000 of the PCI
* mapping, and at the start of the first bank of the SBus
* version.
*/
@@ -128,7 +128,7 @@
/* GEM_PCI_BIF_DIAG register bits */
#define GEN_PCI_BIF_DIAG_BC_SM 0x007f0000 /* burst ctrl. state machine */
-#define GEN_PCI_BIF_DIAG_SM 0xff000000 /* BIF state machine */
+#define GEN_PCI_BIF_DIAG_SM 0xff000000 /* BIF state machine */
/* Bits in GEM_SBUS_CONFIG register */
#define GEM_SBUS_CFG_BURST_32 0x00000001 /* 32 byte bursts */
@@ -147,6 +147,8 @@
#define GEM_RESET_TX 0x00000001 /* Reset TX half. */
#define GEM_RESET_RX 0x00000002 /* Reset RX half. */
#define GEM_RESET_PCI_RSTOUT 0x00000004 /* Force PCI RSTOUT#. */
+#define GEM_RESET_CLSZ_MASK 0x00ff0000 /* ERI cache line size */
+#define GEM_RESET_CLSZ_SHFT 16
/* The rest of the registers live in the first bank again. */
@@ -586,6 +588,10 @@
#define GEM_PHYAD_INTERNAL 1
#define GEM_PHYAD_EXTERNAL 0
+/* Miscellaneous */
+#define GEM_ERI_CACHE_LINE_SIZE 16
+#define GEM_ERI_LATENCY_TIMER 64
+
/*
* descriptor table structures
*/
@@ -594,7 +600,11 @@ struct gem_desc {
uint64_t gd_addr;
};
-/* Transmit flags */
+/*
+ * Transmit flags
+ * GEM_TD_CXSUM_ENABLE, GEM_TD_CXSUM_START, GEM_TD_CXSUM_STUFF and
+ * GEM_TD_INTERRUPT_ME only need to be set in the first descriptor of a group.
+ */
#define GEM_TD_BUFSIZE 0x0000000000007fffULL
#define GEM_TD_CXSUM_START 0x00000000001f8000ULL /* Cxsum start offset */
#define GEM_TD_CXSUM_STARTSHFT 15
@@ -605,10 +615,6 @@ struct gem_desc {
#define GEM_TD_START_OF_PACKET 0x0000000080000000ULL
#define GEM_TD_INTERRUPT_ME 0x0000000100000000ULL /* Interrupt me now */
#define GEM_TD_NO_CRC 0x0000000200000000ULL /* do not insert crc */
-/*
- * Only need to set GEM_TD_CXSUM_ENABLE, GEM_TD_CXSUM_STUFF,
- * GEM_TD_CXSUM_START, and GEM_TD_INTERRUPT_ME in 1st descriptor of a group.
- */
/* Receive flags */
#define GEM_RD_CHECKSUM 0x000000000000ffffULL /* is the complement */
@@ -618,7 +624,6 @@ struct gem_desc {
#define GEM_RD_HASH_PASS 0x1000000000000000ULL /* passed hash filter */
#define GEM_RD_ALTERNATE_MAC 0x2000000000000000ULL /* Alternate MAC adrs */
#define GEM_RD_BAD_CRC 0x4000000000000000ULL
-
#define GEM_RD_BUFSHIFT 16
#define GEM_RD_BUFLEN(x) (((x) & GEM_RD_BUFSIZE) >> GEM_RD_BUFSHIFT)
diff --git a/sys/dev/gem/if_gemvar.h b/sys/dev/gem/if_gemvar.h
index 59cb582..d89a322 100644
--- a/sys/dev/gem/if_gemvar.h
+++ b/sys/dev/gem/if_gemvar.h
@@ -173,6 +173,8 @@ struct gem_softc {
u_int sc_rxptr; /* next ready RX descriptor/state */
u_int sc_rxfifosize; /* RX FIFO size (bytes) */
+ uint32_t sc_mac_rxcfg; /* RX MAC conf. % GEM_MAC_RX_ENABLE */
+
int sc_ifflags;
u_long sc_csum_features;
};
diff --git a/sys/dev/iicbus/ad7417.c b/sys/dev/iicbus/ad7417.c
index 084b9f5..6ae16be 100644
--- a/sys/dev/iicbus/ad7417.c
+++ b/sys/dev/iicbus/ad7417.c
@@ -51,8 +51,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus.h>
#include <powerpc/powermac/powermac_thermal.h>
-#define FCU_ZERO_C_TO_K 2732
-
/* CPU A/B sensors, temp and adc: AD7417. */
#define AD7417_TEMP 0x00
@@ -73,6 +71,16 @@ struct ad7417_sensor {
} type;
};
+struct write_data {
+ uint8_t reg;
+ uint8_t val;
+};
+
+struct read_data {
+ uint8_t reg;
+ uint16_t val;
+};
+
/* Regular bus attachment functions */
static int ad7417_probe(device_t);
static int ad7417_attach(device_t);
@@ -85,6 +93,8 @@ static int ad7417_read_1(device_t dev, uint32_t addr, uint8_t reg,
uint8_t *data);
static int ad7417_read_2(device_t dev, uint32_t addr, uint8_t reg,
uint16_t *data);
+static int ad7417_write_read(device_t dev, uint32_t addr,
+ struct write_data out, struct read_data *in);
static int ad7417_diode_read(struct ad7417_sensor *sens);
static int ad7417_adc_read(struct ad7417_sensor *sens);
static int ad7417_sensor_read(struct ad7417_sensor *sens);
@@ -118,6 +128,8 @@ static int
ad7417_write(device_t dev, uint32_t addr, uint8_t reg, uint8_t *buff, int len)
{
unsigned char buf[4];
+ int try = 0;
+
struct iic_msg msg[] = {
{ addr, IIC_M_WR, 0, buf }
};
@@ -126,76 +138,134 @@ ad7417_write(device_t dev, uint32_t addr, uint8_t reg, uint8_t *buff, int len)
buf[0] = reg;
memcpy(buf + 1, buff, len);
- if (iicbus_transfer(dev, msg, 1) != 0) {
- device_printf(dev, "iicbus write failed\n");
- return (EIO);
- }
-
- return (0);
+ for (;;)
+ {
+ if (iicbus_transfer(dev, msg, 1) == 0)
+ return (0);
+ if (++try > 5) {
+ device_printf(dev, "iicbus write failed\n");
+ return (-1);
+ }
+ pause("ad7417_write", hz);
+ }
}
static int
ad7417_read_1(device_t dev, uint32_t addr, uint8_t reg, uint8_t *data)
{
uint8_t buf[4];
+ int err, try = 0;
struct iic_msg msg[2] = {
{ addr, IIC_M_WR | IIC_M_NOSTOP, 1, &reg },
{ addr, IIC_M_RD, 1, buf },
};
- if (iicbus_transfer(dev, msg, 2) != 0) {
- device_printf(dev, "iicbus read failed\n");
- return (EIO);
+ for (;;)
+ {
+ err = iicbus_transfer(dev, msg, 2);
+ if (err != 0)
+ goto retry;
+
+ *data = *((uint8_t*)buf);
+ return (0);
+ retry:
+ if (++try > 5) {
+ device_printf(dev, "iicbus read failed\n");
+ return (-1);
+ }
+ pause("ad7417_read_1", hz);
}
-
- *data = *((uint8_t*)buf);
-
- return (0);
}
static int
ad7417_read_2(device_t dev, uint32_t addr, uint8_t reg, uint16_t *data)
{
uint8_t buf[4];
+ int err, try = 0;
struct iic_msg msg[2] = {
{ addr, IIC_M_WR | IIC_M_NOSTOP, 1, &reg },
{ addr, IIC_M_RD, 2, buf },
};
- if (iicbus_transfer(dev, msg, 2) != 0) {
- device_printf(dev, "iicbus read failed\n");
- return (EIO);
+ for (;;)
+ {
+ err = iicbus_transfer(dev, msg, 2);
+ if (err != 0)
+ goto retry;
+
+ *data = *((uint16_t*)buf);
+ return (0);
+ retry:
+ if (++try > 5) {
+ device_printf(dev, "iicbus read failed\n");
+ return (-1);
+ }
+ pause("ad7417_read_2", hz);
}
+}
- *data = *((uint16_t*)buf);
+static int
+ad7417_write_read(device_t dev, uint32_t addr, struct write_data out,
+ struct read_data *in)
+{
+ uint8_t buf[4];
+ int err, try = 0;
- return (0);
+ /* Do a combined write/read. */
+ struct iic_msg msg[3] = {
+ { addr, IIC_M_WR, 2, buf },
+ { addr, IIC_M_WR | IIC_M_NOSTOP, 1, &in->reg },
+ { addr, IIC_M_RD, 2, buf },
+ };
+
+ /* Prepare the write msg. */
+ buf[0] = out.reg;
+ buf[1] = out.val & 0xff;
+
+ for (;;)
+ {
+ err = iicbus_transfer(dev, msg, 3);
+ if (err != 0)
+ goto retry;
+
+ in->val = *((uint16_t*)buf);
+ return (0);
+ retry:
+ if (++try > 5) {
+ device_printf(dev, "iicbus write/read failed\n");
+ return (-1);
+ }
+ pause("ad7417_write_read", hz);
+ }
}
static int
ad7417_init_adc(device_t dev, uint32_t addr)
{
uint8_t buf;
+ int err;
adc741x_config = 0;
/* Clear Config2 */
buf = 0;
- ad7417_write(dev, addr, AD7417_CONFIG2, &buf, 1);
+
+ err = ad7417_write(dev, addr, AD7417_CONFIG2, &buf, 1);
/* Read & cache Config1 */
buf = 0;
- ad7417_write(dev, addr, AD7417_CONFIG, &buf, 1);
-
- ad7417_read_1(dev, addr, AD7417_CONFIG, &buf);
+ err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, 1);
+ err = ad7417_read_1(dev, addr, AD7417_CONFIG, &buf);
adc741x_config = (uint8_t)buf;
/* Disable shutdown mode */
adc741x_config &= 0xfe;
buf = adc741x_config;
- ad7417_write(dev, addr, AD7417_CONFIG, &buf, 1);
+ err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, 1);
+ if (err < 0)
+ return (-1);
return (0);
@@ -300,8 +370,8 @@ ad7417_fill_sensor_prop(device_t dev)
continue;
/* Make up some ranges */
- sc->sc_sensors[j].therm.target_temp = 500 + 2732;
- sc->sc_sensors[j].therm.max_temp = 900 + 2732;
+ sc->sc_sensors[j].therm.target_temp = 500 + ZERO_C_TO_K;
+ sc->sc_sensors[j].therm.max_temp = 900 + ZERO_C_TO_K;
pmac_thermal_sensor_register(&sc->sc_sensors[j].therm);
}
@@ -391,8 +461,13 @@ ad7417_get_temp(device_t dev, uint32_t addr, int *temp)
{
uint16_t buf[2];
uint16_t read;
+ int err;
+
+ err = ad7417_read_2(dev, addr, AD7417_TEMP, buf);
+
+ if (err < 0)
+ return (-1);
- ad7417_read_2(dev, addr, AD7417_TEMP, buf);
read = *((int16_t*)buf);
/* The ADC is 10 bit, the resolution is 0.25 C.
@@ -406,22 +481,25 @@ static int
ad7417_get_adc(device_t dev, uint32_t addr, unsigned int *value,
uint8_t chan)
{
- uint8_t cfg1, tmp;
- uint16_t read, buf[2];
-
- ad7417_read_1(dev, addr, AD7417_CONFIG, &cfg1);
+ uint8_t tmp;
+ int err;
+ struct write_data config;
+ struct read_data data;
tmp = chan << 5;
+ config.reg = AD7417_CONFIG;
+ data.reg = AD7417_ADC;
+ data.val = 0;
- cfg1 = (cfg1 & ~AD7417_CONFMASK) | (tmp & AD7417_CONFMASK);
+ err = ad7417_read_1(dev, addr, AD7417_CONFIG, &config.val);
- ad7417_write(dev, addr, AD7417_CONFIG, &cfg1, 1);
+ config.val = (config.val & ~AD7417_CONFMASK) | (tmp & AD7417_CONFMASK);
- ad7417_read_2(dev, addr, AD7417_ADC, buf);
+ err = ad7417_write_read(dev, addr, config, &data);
+ if (err < 0)
+ return (-1);
- read = *((uint16_t*)buf);
-
- *value = ((uint32_t)read) >> 6;
+ *value = ((uint32_t)data.val) >> 6;
return (0);
}
@@ -444,6 +522,9 @@ ad7417_diode_read(struct ad7417_sensor *sens)
}
rawval = ad7417_adc_read(sens);
+ if (rawval < 0)
+ return (-1);
+
if (strstr(sens->therm.name, "CPU B") != NULL) {
diode_slope = eeprom[1][0x11] >> 16;
diode_offset = (int16_t)(eeprom[1][0x11] & 0xffff) << 12;
@@ -455,7 +536,7 @@ ad7417_diode_read(struct ad7417_sensor *sens)
temp = (rawval*diode_slope + diode_offset) >> 2;
temp = (10*(temp >> 16)) + ((10*(temp & 0xffff)) >> 16);
- return (temp + FCU_ZERO_C_TO_K);
+ return (temp + ZERO_C_TO_K);
}
static int
@@ -488,7 +569,8 @@ ad7417_adc_read(struct ad7417_sensor *sens)
chan = 1;
}
- ad7417_get_adc(sc->sc_dev, sc->sc_addr, &temp, chan);
+ if (ad7417_get_adc(sc->sc_dev, sc->sc_addr, &temp, chan) < 0)
+ return (-1);
return (temp);
}
@@ -503,11 +585,13 @@ ad7417_sensor_read(struct ad7417_sensor *sens)
sc = device_get_softc(sens->dev);
/* Init the ADC. */
- ad7417_init_adc(sc->sc_dev, sc->sc_addr);
+ if (ad7417_init_adc(sc->sc_dev, sc->sc_addr) < 0)
+ return (-1);
if (sens->type == ADC7417_TEMP_SENSOR) {
- ad7417_get_temp(sc->sc_dev, sc->sc_addr, &temp);
- temp += FCU_ZERO_C_TO_K;
+ if (ad7417_get_temp(sc->sc_dev, sc->sc_addr, &temp) < 0)
+ return (-1);
+ temp += ZERO_C_TO_K;
} else {
temp = ad7417_adc_read(sens);
}
diff --git a/sys/dev/iicbus/if_ic.c b/sys/dev/iicbus/if_ic.c
index 4a05b16..fd072c1 100644
--- a/sys/dev/iicbus/if_ic.c
+++ b/sys/dev/iicbus/if_ic.c
@@ -49,9 +49,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_types.h>
#include <net/netisr.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <net/netisr.h>
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -311,6 +308,7 @@ icintr(device_t dev, int event, char *ptr)
top = m_devget(sc->ic_ifbuf + ICHDRLEN, len, 0, sc->ic_ifp, 0);
if (top) {
mtx_unlock(&sc->ic_lock);
+ M_SETFIB(top, sc->ic_ifp->if_fib);
netisr_dispatch(NETISR_IP, top);
mtx_lock(&sc->ic_lock);
}
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
index 21818cb..01e262e 100644
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -837,13 +837,12 @@ static int fkey_change_ok(fkeytab_t *, fkeyarg_t *, struct thread *);
int
genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
{
-#ifndef KBD_DISABLE_KEYMAP_LOAD
keymap_t *mapp;
-#endif
+ okeymap_t *omapp;
keyarg_t *keyp;
fkeyarg_t *fkeyp;
int s;
- int i;
+ int i, j;
int error;
s = spltty();
@@ -874,14 +873,39 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
sizeof(keymap_t));
splx(s);
return (error);
+ case OGIO_KEYMAP: /* get keyboard translation table (compat) */
+ mapp = kbd->kb_keymap;
+ omapp = (okeymap_t *)arg;
+ omapp->n_keys = mapp->n_keys;
+ for (i = 0; i < NUM_KEYS; i++) {
+ for (j = 0; j < NUM_STATES; j++)
+ omapp->key[i].map[j] =
+ mapp->key[i].map[j];
+ omapp->key[i].spcl = mapp->key[i].spcl;
+ omapp->key[i].flgs = mapp->key[i].flgs;
+ }
+ return (0);
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
#ifndef KBD_DISABLE_KEYMAP_LOAD
mapp = malloc(sizeof *mapp, M_TEMP, M_NOWAIT);
- error = copyin(*(void **)arg, mapp, sizeof *mapp);
- if (error != 0) {
- splx(s);
- free(mapp, M_TEMP);
- return (error);
+ if (cmd == OPIO_KEYMAP) {
+ omapp = (okeymap_t *)arg;
+ mapp->n_keys = omapp->n_keys;
+ for (i = 0; i < NUM_KEYS; i++) {
+ for (j = 0; j < NUM_STATES; j++)
+ mapp->key[i].map[j] =
+ omapp->key[i].map[j];
+ mapp->key[i].spcl = omapp->key[i].spcl;
+ mapp->key[i].flgs = omapp->key[i].flgs;
+ }
+ } else {
+ error = copyin(*(void **)arg, mapp, sizeof *mapp);
+ if (error != 0) {
+ splx(s);
+ free(mapp, M_TEMP);
+ return (error);
+ }
}
error = keymap_change_ok(kbd->kb_keymap, mapp, curthread);
diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c
index 64d5c24..a21b37c 100644
--- a/sys/dev/kbdmux/kbdmux.c
+++ b/sys/dev/kbdmux/kbdmux.c
@@ -1198,6 +1198,7 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
KBDMUX_LOCK(state);
diff --git a/sys/dev/lmc/if_lmc.c b/sys/dev/lmc/if_lmc.c
index 604e8df..d5fb9ba 100644
--- a/sys/dev/lmc/if_lmc.c
+++ b/sys/dev/lmc/if_lmc.c
@@ -2527,6 +2527,7 @@ lmc_raw_input(struct ifnet *ifp, struct mbuf *mbuf)
{
softc_t *sc = IFP2SC(ifp);
+ M_SETFIB(mbuf, ifp->if_fib);
# if INET
if (mbuf->m_data[0]>>4 == 4)
netisr_dispatch(NETISR_IP, mbuf);
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index c488728..078eca8 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -75,6 +75,7 @@
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/sched.h>
#include <sys/sf_buf.h>
#include <sys/sysctl.h>
diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c
index 1962648..f9bfffe 100644
--- a/sys/dev/mfi/mfi.c
+++ b/sys/dev/mfi/mfi.c
@@ -260,8 +260,12 @@ mfi_transition_firmware(struct mfi_softc *sc)
case MFI_FWSTATE_FLUSH_CACHE:
max_wait = 20;
break;
+ case MFI_FWSTATE_BOOT_MESSAGE_PENDING:
+ MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_HOTPLUG);
+ max_wait = 10;
+ break;
default:
- device_printf(sc->mfi_dev,"Unknown firmware state %d\n",
+ device_printf(sc->mfi_dev,"Unknown firmware state %#x\n",
fw_state);
return (ENXIO);
}
@@ -273,7 +277,7 @@ mfi_transition_firmware(struct mfi_softc *sc)
break;
}
if (fw_state == cur_state) {
- device_printf(sc->mfi_dev, "firmware stuck in state "
+ device_printf(sc->mfi_dev, "Firmware stuck in state "
"%#x\n", fw_state);
return (ENXIO);
}
@@ -1149,7 +1153,8 @@ mfi_aen_complete(struct mfi_command *cm)
if (sc->mfi_aen_cm == NULL)
return;
- if (sc->mfi_aen_cm->cm_aen_abort || hdr->cmd_status == 0xff) {
+ if (sc->mfi_aen_cm->cm_aen_abort ||
+ hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
sc->mfi_aen_cm->cm_aen_abort = 0;
aborted = 1;
} else {
@@ -1405,7 +1410,7 @@ mfi_bio_complete(struct mfi_command *cm)
hdr = &cm->cm_frame->header;
sc = cm->cm_sc;
- if ((hdr->cmd_status != 0) || (hdr->scsi_status != 0)) {
+ if ((hdr->cmd_status != MFI_STAT_OK) || (hdr->scsi_status != 0)) {
bio->bio_flags |= BIO_ERROR;
bio->bio_error = EIO;
device_printf(sc->mfi_dev, "I/O error, status= %d "
@@ -1549,7 +1554,7 @@ mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
cm->cm_timestamp = time_uptime;
mfi_enqueue_busy(cm);
} else {
- hdr->cmd_status = 0xff;
+ hdr->cmd_status = MFI_STAT_INVALID_STATUS;
hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
}
@@ -1574,14 +1579,14 @@ mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
return (0);
/* This is a polled command, so busy-wait for it to complete. */
- while (hdr->cmd_status == 0xff) {
+ while (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
DELAY(1000);
tm -= 1;
if (tm <= 0)
break;
}
- if (hdr->cmd_status == 0xff) {
+ if (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
device_printf(sc->mfi_dev, "Frame %p timed out "
"command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode);
return (ETIMEDOUT);
diff --git a/sys/dev/mfi/mfi_cam.c b/sys/dev/mfi/mfi_cam.c
index 5137c36..747b6c0 100644
--- a/sys/dev/mfi/mfi_cam.c
+++ b/sys/dev/mfi/mfi_cam.c
@@ -54,12 +54,9 @@ __FBSDID("$FreeBSD$");
#include <cam/scsi/scsi_all.h>
#include <cam/scsi/scsi_message.h>
-#include <sys/bus.h>
-#include <sys/conf.h>
#include <machine/md_var.h>
#include <machine/bus.h>
#include <machine/resource.h>
-#include <sys/rman.h>
#include <dev/mfi/mfireg.h>
#include <dev/mfi/mfi_ioctl.h>
diff --git a/sys/dev/mfi/mfireg.h b/sys/dev/mfi/mfireg.h
index efee827..f005c37 100644
--- a/sys/dev/mfi/mfireg.h
+++ b/sys/dev/mfi/mfireg.h
@@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$");
#define MFI_FWSTATE_WAIT_HANDSHAKE 0x60000000
#define MFI_FWSTATE_FW_INIT_2 0x70000000
#define MFI_FWSTATE_DEVICE_SCAN 0x80000000
+#define MFI_FWSTATE_BOOT_MESSAGE_PENDING 0x90000000
#define MFI_FWSTATE_FLUSH_CACHE 0xa0000000
#define MFI_FWSTATE_READY 0xb0000000
#define MFI_FWSTATE_OPERATIONAL 0xc0000000
@@ -127,6 +128,7 @@ __FBSDID("$FreeBSD$");
#define MFI_FWINIT_READY 0x00000002 /* Move from operational to ready */
#define MFI_FWINIT_MFIMODE 0x00000004 /* unknown */
#define MFI_FWINIT_CLEAR_HANDSHAKE 0x00000008 /* Respond to WAIT_HANDSHAKE */
+#define MFI_FWINIT_HOTPLUG 0x00000010
/* MFI Commands */
typedef enum {
diff --git a/sys/dev/mii/e1000phy.c b/sys/dev/mii/e1000phy.c
index b0d7069..e657592 100644
--- a/sys/dev/mii/e1000phy.c
+++ b/sys/dev/mii/e1000phy.c
@@ -107,6 +107,7 @@ static const struct mii_phydesc e1000phys[] = {
MII_PHY_DESC(xxMARVELL, E1116),
MII_PHY_DESC(xxMARVELL, E1116R),
MII_PHY_DESC(xxMARVELL, E1118),
+ MII_PHY_DESC(xxMARVELL, E1149R),
MII_PHY_DESC(xxMARVELL, E3016),
MII_PHY_DESC(xxMARVELL, PHYG65G),
MII_PHY_END
@@ -147,6 +148,7 @@ e1000phy_attach(device_t dev)
sc->mii_flags |= MIIF_HAVEFIBER;
break;
case MII_MODEL_xxMARVELL_E1149:
+ case MII_MODEL_xxMARVELL_E1149R:
/*
* Some 88E1149 PHY's page select is initialized to
* point to other bank instead of copper/fiber bank
@@ -208,6 +210,7 @@ e1000phy_reset(struct mii_softc *sc)
case MII_MODEL_xxMARVELL_E1116:
case MII_MODEL_xxMARVELL_E1118:
case MII_MODEL_xxMARVELL_E1149:
+ case MII_MODEL_xxMARVELL_E1149R:
case MII_MODEL_xxMARVELL_PHYG65G:
/* Disable energy detect mode. */
reg &= ~E1000_SCR_EN_DETECT_MASK;
@@ -240,7 +243,8 @@ e1000phy_reset(struct mii_softc *sc)
PHY_WRITE(sc, E1000_SCR, reg);
if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116 ||
- sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149) {
+ sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149 ||
+ sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149R) {
PHY_WRITE(sc, E1000_EADR, 2);
reg = PHY_READ(sc, E1000_SCR);
reg |= E1000_SCR_RGMII_POWER_UP;
diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs
index 5274940..1b98542 100644
--- a/sys/dev/mii/miidevs
+++ b/sys/dev/mii/miidevs
@@ -248,6 +248,7 @@ model xxMARVELL E1111 0x000c Marvell 88E1111 Gigabit PHY
model xxMARVELL E1116 0x0021 Marvell 88E1116 Gigabit PHY
model xxMARVELL E1116R 0x0024 Marvell 88E1116R Gigabit PHY
model xxMARVELL E1118 0x0022 Marvell 88E1118 Gigabit PHY
+model xxMARVELL E1149R 0x0025 Marvell 88E1149R Quad Gigabit PHY
model xxMARVELL E3016 0x0026 Marvell 88E3016 10/100 Fast Ethernet PHY
model xxMARVELL PHYG65G 0x0027 Marvell PHYG65G Gigabit PHY
model MARVELL E1000 0x0005 Marvell 88E1000 Gigabit PHY
diff --git a/sys/dev/mpt/mpt.h b/sys/dev/mpt/mpt.h
index 47af5ba..d12c307 100644
--- a/sys/dev/mpt/mpt.h
+++ b/sys/dev/mpt/mpt.h
@@ -721,11 +721,9 @@ struct mpt_softc {
* DMA Mapping Stuff
*/
struct resource * pci_reg; /* Register map for chip */
- int pci_mem_rid; /* Resource ID */
bus_space_tag_t pci_st; /* Bus tag for registers */
bus_space_handle_t pci_sh; /* Bus handle for registers */
/* PIO versions of above. */
- int pci_pio_rid;
struct resource * pci_pio_reg;
bus_space_tag_t pci_pio_st;
bus_space_handle_t pci_pio_sh;
diff --git a/sys/dev/mpt/mpt_pci.c b/sys/dev/mpt/mpt_pci.c
index a3cb611..f7201b6 100644
--- a/sys/dev/mpt/mpt_pci.c
+++ b/sys/dev/mpt/mpt_pci.c
@@ -193,8 +193,6 @@ __FBSDID("$FreeBSD$");
#define PCIM_CMD_SERRESPEN 0x0100
#endif
-
-
static int mpt_pci_probe(device_t);
static int mpt_pci_attach(device_t);
static void mpt_free_bus_resources(struct mpt_softc *mpt);
@@ -362,17 +360,17 @@ mpt_set_options(struct mpt_softc *mpt)
mpt->cfg_role = tval;
mpt->do_cfg_role = 1;
}
-
tval = 0;
mpt->msi_enable = 0;
- if (resource_int_value(device_get_name(mpt->dev),
- device_get_unit(mpt->dev), "msi_enable", &tval) == 0 && tval == 1) {
+ if (mpt->is_sas)
mpt->msi_enable = 1;
+ if (resource_int_value(device_get_name(mpt->dev),
+ device_get_unit(mpt->dev), "msi_enable", &tval) == 0) {
+ mpt->msi_enable = tval;
}
}
#endif
-
static void
mpt_link_peer(struct mpt_softc *mpt)
{
@@ -411,7 +409,6 @@ mpt_unlink_peer(struct mpt_softc *mpt)
}
}
-
static int
mpt_pci_attach(device_t dev)
{
@@ -522,9 +519,9 @@ mpt_pci_attach(device_t dev)
* certain reset operations (but must be disabled for
* some cards otherwise).
*/
- mpt->pci_pio_rid = PCIR_BAR(mpt_io_bar);
+ mpt_io_bar = PCIR_BAR(mpt_io_bar);
mpt->pci_pio_reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
- &mpt->pci_pio_rid, RF_ACTIVE);
+ &mpt_io_bar, RF_ACTIVE);
if (mpt->pci_pio_reg == NULL) {
device_printf(dev, "unable to map registers in PIO mode\n");
goto bad;
@@ -533,9 +530,9 @@ mpt_pci_attach(device_t dev)
mpt->pci_pio_sh = rman_get_bushandle(mpt->pci_pio_reg);
/* Allocate kernel virtual memory for the 9x9's Mem0 region */
- mpt->pci_mem_rid = PCIR_BAR(mpt_mem_bar);
+ mpt_mem_bar = PCIR_BAR(mpt_mem_bar);
mpt->pci_reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &mpt->pci_mem_rid, RF_ACTIVE);
+ &mpt_mem_bar, RF_ACTIVE);
if (mpt->pci_reg == NULL) {
device_printf(dev, "Unable to memory map registers.\n");
if (mpt->is_sas) {
@@ -575,7 +572,7 @@ mpt_pci_attach(device_t dev)
}
}
mpt->pci_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &iqd,
- RF_ACTIVE | RF_SHAREABLE);
+ RF_ACTIVE | (mpt->pci_msi_count ? 0 : RF_SHAREABLE));
if (mpt->pci_irq == NULL) {
device_printf(dev, "could not allocate interrupt\n");
goto bad;
@@ -594,7 +591,6 @@ mpt_pci_attach(device_t dev)
}
/* Allocate dma memory */
-/* XXX JGibbs -Should really be done based on IOCFacts. */
if (mpt_dma_mem_alloc(mpt)) {
mpt_prt(mpt, "Could not allocate DMA memory\n");
goto bad;
@@ -660,13 +656,13 @@ mpt_free_bus_resources(struct mpt_softc *mpt)
{
if (mpt->ih) {
bus_teardown_intr(mpt->dev, mpt->pci_irq, mpt->ih);
- mpt->ih = 0;
+ mpt->ih = NULL;
}
if (mpt->pci_irq) {
bus_release_resource(mpt->dev, SYS_RES_IRQ,
- mpt->pci_msi_count ? 1 : 0, mpt->pci_irq);
- mpt->pci_irq = 0;
+ rman_get_rid(mpt->pci_irq), mpt->pci_irq);
+ mpt->pci_irq = NULL;
}
if (mpt->pci_msi_count) {
@@ -675,19 +671,18 @@ mpt_free_bus_resources(struct mpt_softc *mpt)
}
if (mpt->pci_pio_reg) {
- bus_release_resource(mpt->dev, SYS_RES_IOPORT, mpt->pci_pio_rid,
- mpt->pci_pio_reg);
- mpt->pci_pio_reg = 0;
+ bus_release_resource(mpt->dev, SYS_RES_IOPORT,
+ rman_get_rid(mpt->pci_pio_reg), mpt->pci_pio_reg);
+ mpt->pci_pio_reg = NULL;
}
if (mpt->pci_reg) {
- bus_release_resource(mpt->dev, SYS_RES_MEMORY, mpt->pci_mem_rid,
- mpt->pci_reg);
- mpt->pci_reg = 0;
+ bus_release_resource(mpt->dev, SYS_RES_MEMORY,
+ rman_get_rid(mpt->pci_reg), mpt->pci_reg);
+ mpt->pci_reg = NULL;
}
MPT_LOCK_DESTROY(mpt);
}
-
/*
* Disconnect ourselves from the system.
*/
@@ -712,7 +707,6 @@ mpt_pci_detach(device_t dev)
return(0);
}
-
/*
* Disable the hardware
*/
@@ -808,8 +802,6 @@ mpt_dma_mem_alloc(struct mpt_softc *mpt)
return (0);
}
-
-
/* Deallocate memory that was allocated by mpt_dma_mem_alloc
*/
static void
@@ -826,14 +818,11 @@ mpt_dma_mem_free(struct mpt_softc *mpt)
bus_dmamem_free(mpt->reply_dmat, mpt->reply, mpt->reply_dmap);
bus_dma_tag_destroy(mpt->reply_dmat);
bus_dma_tag_destroy(mpt->parent_dmat);
- mpt->reply_dmat = 0;
+ mpt->reply_dmat = NULL;
free(mpt->request_pool, M_DEVBUF);
- mpt->request_pool = 0;
-
+ mpt->request_pool = NULL;
}
-
-
/* Reads modifiable (via PCI transactions) config registers */
static void
mpt_read_config_regs(struct mpt_softc *mpt)
diff --git a/sys/dev/mxge/eth_z8e.h b/sys/dev/mxge/eth_z8e.h
index 31e8488..ecd6bcf 100644
--- a/sys/dev/mxge/eth_z8e.h
+++ b/sys/dev/mxge/eth_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,7287 +28,7495 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int eth_z8e_uncompressed_length = 367564 ;
-static unsigned int eth_z8e_length = 116477 ;
-static unsigned char eth_z8e[116477 + 1] =
- "\x78\x9c\xec\xbd\x7f\x78\x54\x45\xb2\x37\x5e\x99\x0c\x32\x89\x81"
- "\x19\x31\xe2\x88\xb8\x0e\x8a\x1a\x5d\x90\xa8\xb8\x1b\x5d\xd0\x28"
- "\xe0\xa2\xf2\x23\xab\xe8\x46\x45\x03\x1a\x70\xd0\x88\x11\x02\x0c"
- "\x10\x32\x61\xc0\xdd\x04\xf9\xa5\x46\x8d\x10\x48\x80\xe0\xc5\x5d"
- "\x54\x44\xbc\x46\x05\x9c\xdd\x64\xbf\x0f\xf7\x5e\x92\x61\xf7\xb2"
- "\xef\x9b\xdd\x2f\x7b\x77\xc4\xc8\x8e\xbc\x01\x46\x32\x90\x31\x99"
- "\x39\xfd\xfd\x54\xf7\x39\xc9\xcc\x30\x41\x79\xef\x7d\x9e\xef\x3f"
- "\x9b\xe7\x99\x9c\x73\xfa\x74\x57\x57\x57\x57\x55\x57\x77\x57\xd7"
- "\x21\xba\xf0\x3f\x3f\x59\xf8\x92\x42\xa6\x86\xe0\xef\xfe\x2f\xca"
+static unsigned int eth_z8e_uncompressed_length = 375636 ;
+static unsigned int eth_z8e_length = 119802 ;
+static unsigned char eth_z8e[119802 + 1] =
+ "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x99\xc8\x24\x06"
+ "\x26\x62\xc4\x29\xc5\x76\xb0\x41\xa3\x05\x89\x16\xdb\xd4\x42\x0d"
+ "\x02\x1a\x2c\xbf\x14\x6c\xa3\xa2\x09\x1a\xe8\xa0\x11\x22\x44\x18"
+ "\x20\x64\xc2\x80\x36\x41\x20\xa9\xa0\x46\x09\x09\xbd\xf2\x23\x56"
+ "\xac\xd8\x02\x62\x45\x19\x24\xf6\x4b\x7b\x93\x0c\xed\x8b\xf7\x9b"
+ "\xdb\x17\x6f\x47\x6e\x84\x94\x1b\x60\x4a\x06\x32\x26\x33\x67\xbf"
+ "\x9f\xb5\xf7\x39\xc9\xcc\x30\x41\xb9\xf7\x3e\xcf\xfb\x4f\xf3\x3c"
+ "\x93\x73\xce\x3e\x7b\xaf\xbd\xf6\xda\x6b\xad\xbd\xf6\xde\x6b\xaf"
+ "\x43\x74\xe5\x7f\x3e\xb2\xf0\x25\x81\x4c\x07\x8a\x0f\xfd\x37\xca"
"\xff\xf3\xef\x9f\x7f\xff\xfc\xfb\xe7\xdf\x3f\xff\xfe\xf9\xf7\xcf"
- "\xbf\xff\x7f\xff\x82\x29\x34\xfa\xb4\xc9\x4c\xbf\x5f\x4f\xd4\xe9"
- "\xb1\x0c\xf5\x53\x57\xf1\x5b\xaf\x8b\x08\x5e\xa5\x60\x9c\x1f\xca"
- "\x57\xfe\xbd\x86\x34\xd3\x7a\xb2\x5c\x63\xa3\x8c\x71\x9b\x88\xaa"
- "\x06\x8b\xf6\xd7\xdf\x14\xc1\x15\x6f\x8a\xf6\xf1\xdb\x89\x9a\x86"
- "\x13\xbd\x3e\x58\x84\x00\x63\xba\x9f\x9e\x9a\xc6\x30\x56\xe0\x99"
- "\xdf\xaf\x1c\x2c\x82\x48\x2f\x41\xfa\x41\x4e\x5f\x3e\x18\xb0\x32"
- "\x89\x3c\x6f\x8a\x70\x0c\x5c\x0b\x97\x67\x98\xe3\x87\x49\x5c\xea"
- "\x13\xe0\x30\x8c\x06\x3f\x15\x8c\x3f\x0f\x8c\x0c\x03\xaf\x90\x89"
- "\x52\x18\x5e\x87\x87\xec\x21\x8f\xf7\x32\x94\x0d\xa1\x3d\x59\x5c"
- "\x76\x1d\xf2\x08\x0f\xa5\x36\xb9\x22\xe4\xb8\x86\x52\x8e\x51\xfa"
- "\x16\x5c\x4d\xb8\xbe\xc1\x6d\x5d\xa1\xca\x0d\x67\x18\x28\x9b\xd2"
- "\xe9\x49\xcb\xee\x29\x0b\xd8\x8e\x32\x32\x23\xef\x9c\x90\xc9\x6b"
- "\x52\x79\x6d\x69\x7a\x5e\x13\xf2\x4e\x37\xf2\xaa\x77\xa6\xfb\xf5"
- "\x77\x17\xe3\x9d\x2b\xfe\x9d\xf9\x35\xfd\x5d\x06\xde\x55\x25\xe0"
- "\x67\xf6\x75\x45\xe8\x18\xa5\xed\x04\x2e\x8e\x46\xf4\x08\x97\xd1"
- "\xf3\x5f\x82\xfc\x4d\xf1\xb0\x88\xf4\x77\x83\xf0\xce\x1f\xff\x6e"
- "\x7f\xb6\xfe\xee\x72\xbc\x8b\xc4\xbf\x4b\x31\xca\xd9\x3b\x3d\xe9"
- "\xf6\x24\xed\xe4\xfa\x53\x54\xdd\xdc\x86\xf4\x31\xc8\x53\xce\x79"
- "\xa6\x39\xca\x89\xfb\x8a\xdf\x35\xd6\xf5\xd4\xcf\x79\x66\x18\x70"
- "\xfc\x28\x1f\x43\x53\xd0\x32\xbd\xd4\x28\x3f\xde\xc1\x30\x48\xd2"
- "\x90\xe1\xf8\x29\x6d\x22\xc3\xe1\x67\xdc\x0f\xe5\x76\xeb\xf7\x0e"
- "\x6e\x5f\x6c\x9f\x13\x99\x01\xb6\x1f\x0c\xd1\x8b\xf0\xeb\x6f\x31"
- "\x78\x60\xbe\x5d\x68\xee\x2b\xc8\x2c\x56\x6d\xa9\xd3\x3c\x82\x7c"
- "\xae\x30\x39\x86\x90\xfb\x28\x5d\x6c\x07\x7e\xb4\x76\x09\x59\xdc"
- "\xc5\x22\xec\x73\xb5\x53\x4b\xb0\x9d\xdc\x41\x11\xf0\x45\xce\x50"
- "\xd9\x19\xb2\xf8\x22\x27\xa8\xec\x25\xb2\x37\x95\x7e\x4d\xc9\xf8"
- "\x4b\x33\x09\x72\x0f\xe5\xb2\x6d\xd4\x52\xd3\x46\xee\x9a\xf8\xb2"
- "\xee\xab\xc8\xde\x8c\x67\xf4\x9d\x95\xf1\x68\x72\x44\x28\x92\xbe"
- "\xa5\xae\xf4\x6d\x32\xbb\x87\x91\xa9\xb9\xd0\x6b\xe0\xe2\x67\x5c"
- "\x56\x1e\x27\xcb\xb6\xd9\xe0\xa1\xe3\x8c\xef\xbb\x75\x1f\x2c\x09"
- "\x9b\x1a\xed\x93\xa8\xd1\x7e\x84\x9a\xec\x63\xa9\xc9\x35\x9e\xd6"
- "\x1e\xa7\x8c\xc6\xf0\x18\x6a\x32\xdf\x07\x19\x1b\x4f\xbe\x76\xdc"
- "\x3b\xa2\xc8\x13\x22\xc7\x42\x02\x7f\x5c\x7c\xa8\xea\x39\xb2\xf8"
- "\x15\x4c\xd0\xf7\xe2\x23\xbf\x2b\x21\x62\xfa\xf2\x73\xb2\x76\xcc"
- "\xbf\x82\xec\xc0\x2f\x00\x5c\xee\x38\x4a\x19\x97\x0d\xb7\x53\x36"
- "\x70\xee\xef\xab\x8e\x90\xb9\x94\xd2\xfa\x90\xad\x4c\xcd\x23\x65"
- "\xbc\x7d\xf3\x9b\x22\xc0\x3c\xda\xb1\x34\x1f\x72\x9a\x31\x09\x75"
- "\xb7\x73\x7d\x6b\x21\xeb\xee\x2d\x64\xee\x58\x94\x9f\x52\xfb\xa6"
- "\x68\xc3\x3b\xa7\xf1\x0e\xfc\xd4\x86\xf7\x81\x51\x99\x64\xf3\x45"
- "\x72\xe9\x8b\xae\x80\x99\x61\x0c\x0c\x51\x0a\xc3\xb3\xba\x28\x15"
- "\xed\xe9\x07\x7c\xee\xa8\x45\xfa\xb5\xc8\x87\xf2\x3b\xfc\xf4\x9a"
- "\x9d\xcb\x8b\xcb\x9f\x08\x69\x97\x3f\x71\x46\x7b\xeb\x89\x0e\xf1"
- "\xd6\x13\xa7\xa3\x6f\x3d\xf1\xad\x7b\x31\x59\xa2\x97\x3f\x11\x6c"
- "\x29\x96\x7d\x60\x6b\x29\x46\x1f\x44\xc9\xb2\xec\x04\xd9\x9e\x7a"
- "\x09\x7d\x1f\xf9\x1b\x2d\x9b\x43\x76\x2d\x6d\x47\xbe\x2f\xf2\x67"
- "\x7a\xaa\x94\x04\xee\x9d\xc9\xda\xd7\x91\xfe\xae\x5f\xc9\x90\x05"
- "\x6d\x1a\xe0\xf0\x9b\xea\xaa\xb9\xde\x60\xda\x87\x7e\xfc\xda\xf0"
- "\x0b\xe0\xd7\x2e\xd2\xdf\x65\xd9\x74\x0f\x5c\x9e\x42\x9b\xbb\x88"
- "\x46\x69\x94\x72\x9c\x06\x8c\x01\xfe\xb6\x3e\xe8\x36\x54\x5b\xb5"
- "\xf7\xd0\x0d\xe5\x54\xd6\xd9\xe9\x24\xd6\x4d\xac\x97\x58\x4f\xa1"
- "\x9e\x0a\xd4\xd3\x2a\x65\xf1\x4d\x11\x12\xe9\x7b\x0f\x21\x3d\x10"
- "\x5a\xea\x4c\x09\x2e\x75\x9a\x3a\xd2\xf7\xfe\x27\xf2\xec\xf4\x9b"
- "\xb6\xd8\x74\x1a\x06\x18\x16\x64\x22\x38\x20\x42\xa9\x80\x59\xfc"
- "\xc9\xd9\x56\xf3\xa6\x37\xc5\x11\xe4\x3b\xdc\x03\x0b\xb0\x01\x07"
- "\xf4\x1f\x10\x30\xd2\x40\xeb\xb6\x35\xc8\xc7\xe5\x7d\xe1\x5c\xd6"
- "\xdf\x7e\x5f\x51\x80\xac\x11\x4a\x17\xdd\xaa\x3e\xe4\x09\xb0\x9e"
- "\x1d\x10\xa6\x8b\x3a\x3d\x94\xc7\xb0\xb9\x9c\xaf\x3d\x40\x28\xf7"
- "\x9f\xc2\xed\x84\x7e\xa3\x29\x9d\xc2\x99\x02\x9d\xde\xd6\x88\xf2"
- "\xaa\xee\x81\x79\x06\x8e\x5c\x07\xf7\xb5\xc4\x13\xfc\xd0\x58\x14"
- "\xa6\x01\xd5\x94\x8a\x72\x0f\x33\x3c\x86\x05\x3e\xf0\xa3\xad\xff"
- "\xd9\x58\x14\x24\x4d\xc4\xc1\xf4\xeb\xf0\xea\xe2\xe0\x21\x5d\x00"
- "\x1e\xf3\x5f\x13\xca\x0c\xa8\x93\xf0\x1e\xfa\x44\x63\x78\x61\x32"
- "\x3b\x24\xbe\x8f\x32\x8c\x4e\xd6\x31\x80\xe9\x5d\x78\x2f\xb5\x93"
- "\xd5\x12\x74\x3b\x53\x5b\x4a\x89\xb8\xfc\x07\x65\x81\x7e\xa2\x23"
- "\x3f\x95\x79\x8e\xdf\xfb\x22\xa7\x91\x67\xe0\x37\xa2\xc3\x99\x3a"
- "\xa0\x9d\xcc\x8c\x33\xca\xbb\x18\xcf\xd8\xbe\x7c\x68\xc2\xa3\x63"
- "\xe9\xd1\xf1\xf7\x8f\x1f\x4b\x93\xef\x19\x37\x96\xb2\xef\x18\x99"
- "\x7d\xdb\x4f\x73\x6e\xa3\xbc\x5f\x3e\x34\x96\xf2\xa6\x8c\xa5\x87"
- "\xf1\xcb\x7b\x78\xc2\x43\xe3\x27\x3c\x3c\x96\xf2\xef\xbb\x1f\x4f"
- "\xe3\xc6\xde\x92\xfd\xf3\x91\x79\xe3\xee\x9f\x40\xbf\x98\x76\x6b"
- "\xf6\xad\xb7\xd2\x3d\x13\x26\xdd\x92\x9d\xad\x5f\x6f\xc9\xe6\x2c"
- "\x8f\xe7\x4c\x78\x78\x64\xde\xbc\x17\x4b\x5e\x1c\x39\xe5\xfe\x71"
- "\x9c\xc2\x63\x72\x0c\xef\x64\x45\xcf\x6a\x4c\xe3\x90\x38\x35\x91"
- "\x34\xe8\x8c\xcd\xe8\x7b\xfc\xda\xbd\x65\x47\x21\xfb\xb6\x3f\x6f"
- "\xe6\x3e\x93\xba\xd5\xca\xe3\x95\xb9\xd3\x63\x3d\x02\xda\xe5\x31"
- "\xed\x30\xa6\x21\xcf\xe0\xc5\x78\x77\xa3\x3e\x76\xf4\xc3\xfb\x48"
- "\xfc\xfb\x41\xd0\xb3\xd6\x51\x2d\x0e\x22\x1f\x7e\xa0\x77\x08\x3a"
- "\x10\x74\x0d\x52\x87\x3b\xbf\x1f\xf8\x3a\x05\x75\xb4\x41\x26\x41"
- "\x1b\x5b\x4e\x8c\xac\xb7\xa1\x5f\x0e\x39\x96\x50\xea\x49\xb2\x5d"
- "\xd2\x52\x92\x4b\xdc\x3f\xbe\x12\x1d\xc6\x99\x1e\x18\xe9\x12\x06"
- "\xfa\x1c\x70\x0e\xeb\x70\xca\x63\xf4\x82\x9f\xe1\xac\xc5\x3b\x1d"
- "\xd6\x23\x2d\xd0\x0f\xd0\xdf\xbf\xd1\xdc\x59\x24\xd2\xb7\xec\xd0"
- "\xba\xb3\xe4\x98\x80\x72\x0d\x06\x3f\xa3\xfe\x50\x13\xea\x14\xdb"
- "\x26\xa6\xa0\xff\x53\x30\x56\xa1\x2d\xd6\x26\xf0\x35\xe4\xe8\xc3"
- "\xa0\xe8\xce\x27\x95\x76\x89\x39\xba\x0a\xcf\xab\x3e\xfc\x56\xb8"
- "\x91\xb6\x44\xa6\xf5\xc3\x33\xec\x09\xf0\x91\x70\x52\xf4\x14\xd2"
- "\xe7\x52\x2a\xd2\xff\x00\x5a\xb7\xca\xfc\xa7\x64\xf9\xfe\x48\xdb"
- "\x0e\x78\xdf\x6a\xe9\x1f\x9e\x06\xef\x70\x1a\xec\x84\x4b\x2a\x51"
- "\xbe\x83\xf5\x9d\xd2\xc1\x83\xdf\xe6\x31\x0e\xed\x08\x2a\xf8\xfa"
- "\x33\xe4\x55\xe1\x30\xf8\xed\x46\xd0\xa5\x11\xa3\x56\x53\x29\xdb"
- "\x36\x97\xa0\xfd\x03\xf2\xd5\xf8\x38\xb8\x9a\xf3\x6a\x22\x9f\x84"
- "\x25\x7a\x00\x70\x43\xde\x25\xed\x74\xac\x98\x4c\x7e\xba\x64\x8c"
- "\xe6\x76\x52\x4c\x5b\xb2\x18\x0f\xe0\x6d\xee\xec\x76\x62\xbc\xbc"
- "\x64\x84\x2c\x0b\xfc\x74\xdc\x38\x8f\x9d\xf1\x67\x1d\x81\x7e\x1d"
- "\x8d\x3e\x4f\x43\x7d\xc1\x84\x3e\xcf\x60\x7a\x00\xdf\x56\x0d\x57"
- "\xc0\xc9\x14\x8b\x9c\xc0\x8b\x4c\x4c\x0f\x7f\x2f\x8c\x90\xe2\xa9"
- "\x41\xd9\x09\x3c\xf5\x24\x60\x8f\x8d\x79\x9f\x97\xf0\xfe\x1e\xbc"
- "\xbf\x57\x7f\x0f\x59\x1d\x54\x9c\x50\xff\x6a\xbc\xbf\x8f\xfb\x10"
- "\xb2\x98\xea\x27\xdb\x8e\xcd\x6c\x4b\xf6\xe6\xaf\x4b\xc8\xbf\x17"
- "\xf9\x1f\x00\xbe\x21\x1e\x27\x38\x7f\xad\xce\xf7\xc8\x6f\x41\xfe"
- "\x43\x09\xf5\x0f\x43\xfe\x87\x63\xf0\x4b\x68\xff\xa5\x0d\x78\x9f"
- "\xcf\x7c\x8a\x6b\x21\xf2\xf4\x67\xf9\x67\xdd\xd3\x58\xc4\xfd\x73"
- "\xa9\x23\x21\x7f\x2e\xf2\x3d\xcf\x74\x96\x34\xea\x60\x1a\xd9\x76"
- "\xe8\x76\xcd\x11\x85\xc3\xa5\xd3\x12\xca\x94\xa0\xcc\x7c\xa6\xaf"
- "\xe4\xb3\xce\xa4\x65\x2a\x12\xca\xec\x90\x7c\xaa\xea\xd1\xfb\x58"
- "\x95\xd1\xf5\x5a\x2c\x0c\x6e\x1b\x6c\xad\x4b\x0f\xc6\xc3\xb8\x6c"
- "\x07\xea\x5d\xba\x46\xe9\x8c\x8b\xc1\x13\xb7\x22\xed\x6d\xc0\x3c"
- "\xc3\x7c\x04\x39\x0b\xf9\x82\x61\xe8\xdd\x89\x19\x8a\x77\x33\x47"
- "\x5a\x4b\x89\xef\x47\xf2\x3d\xc3\x16\xdd\x93\x74\x79\xca\x1c\x89"
- "\x2b\xa7\x67\x72\x3a\xcb\xb1\xe8\x7e\x50\x53\x30\x33\x7f\x01\x79"
- "\x37\xe1\x39\xaa\xd7\xf1\x2a\x9e\x53\x80\xff\x69\xe8\x74\xf0\xec"
- "\x44\xe6\xc7\xd1\x48\xaf\xd4\xdf\x2f\xe7\xfc\xb8\xbf\x45\xbf\x4f"
- "\x01\x8f\x9d\xd6\xe5\x0c\x32\x75\xd9\x62\x59\x37\xe4\xca\x28\xaf"
- "\x29\xbe\x1f\x87\x77\xb3\x70\xbd\x1f\xd7\x5f\xe0\xfa\x0b\x5c\x47"
- "\xba\xcf\x90\xdd\x1d\x95\xf2\xc5\xcf\x57\xe0\xfa\x10\xae\xfd\x70"
- "\x7d\x18\xb8\x7d\x0b\xba\x07\x83\xe0\xe9\x04\x9e\x69\x47\x1f\xb2"
- "\xdc\xf7\x57\x7d\x98\xe9\xe7\x3a\xa3\x86\x2e\x38\xd5\x9b\xa6\xeb"
- "\x07\x5d\x1e\xf4\xb4\xee\x89\x4c\x97\x3c\xc0\xdf\xcb\xf5\x0b\x05"
- "\xab\x9f\xea\x27\x95\x47\x53\xe5\xcc\xaa\xbf\xf5\x34\x95\x2f\x25"
- "\xb6\x4e\x5c\xd7\x97\x85\x84\xc0\xb5\x94\xe9\xea\xa7\xcb\xca\x41"
- "\x13\x33\x9e\xf3\x98\x4e\x32\xbf\x84\x7b\x69\x7b\x4c\x7f\xc3\xb6"
- "\xbf\x6c\x6f\x42\x7f\xb3\x9c\xaf\x91\xfd\x0d\xda\x19\x38\x33\xfe"
- "\xe0\x69\x1e\x27\x2f\x32\xf8\x06\xfc\xdd\xde\x2b\x63\x83\xcd\xf1"
- "\x70\x14\x5f\x31\x7f\x0c\x2c\xd6\x65\x12\xf4\x82\x0e\x0b\xa5\x96"
- "\x32\xaf\x0e\x1e\xed\xa7\xdf\x4e\x94\xb6\xd8\xaa\x0f\xcf\xf2\xfb"
- "\x10\x74\x13\xe7\x4f\x2d\x66\x19\x1b\x3c\xcd\x78\x2f\xdf\xa5\xed"
- "\xcb\x63\x9c\x52\x8b\xe4\xbb\x62\x3f\x58\xcc\x78\x27\xeb\xe1\x77"
- "\x25\xf2\xdd\xea\x5e\xb8\x5b\x0e\xe8\x70\x53\x93\xd9\x52\xa2\x62"
- "\x4b\x03\x18\xd4\x74\x53\x39\xf5\xf3\x45\x0e\xd3\xd4\x88\x88\x8e"
- "\x2c\xa7\x34\x5f\x64\x27\xdd\x48\x74\x89\x2f\x72\x84\x6e\x22\x1a"
- "\xe6\x8b\x54\x61\x6c\xaf\xe7\xf7\x5f\xdc\x40\x29\x29\xb8\xba\xaf"
- "\x2f\x37\xa5\xf8\x22\x25\x34\xbc\xdc\x8c\x6b\x11\xdd\xd7\x4f\x74"
- "\xfa\x22\x93\x90\xaf\x90\xa6\x46\xc5\xa9\xf1\xfd\xc4\xdf\x0b\xa2"
- "\x64\x9b\xf4\xb2\x70\xfb\x22\xb0\xb3\x23\x07\x91\xae\x89\xa9\xd1"
- "\xef\xf0\xeb\x14\x5a\xc5\x96\x03\x53\xa3\xa7\xc4\xb8\x97\xbf\xc0"
- "\xf3\xdf\x85\x30\x91\xf0\x45\xc6\x50\x4b\x28\x84\x7c\x6e\x21\x2a"
- "\xb7\x34\x3c\x75\xc6\x44\xdd\x18\xa3\xb5\xca\x2d\xd0\xe3\x5b\x5a"
- "\xbb\xd1\x0e\x8c\x5f\xff\xbb\x7b\x29\xae\xab\xb6\xfc\x2f\xf9\x5c"
- "\xb1\x25\x20\x2c\x5b\x5a\x6f\xc6\xa4\x85\xdb\xe0\x8b\xb4\x51\x01"
- "\xcc\xee\xa9\x8b\x83\x82\xf1\x1f\xb8\x9c\xe7\x2c\x63\x08\x7a\xd1"
- "\x3a\x75\xb1\x5b\xe0\x9d\x45\xa4\x6d\x69\xf5\x45\xda\x09\x75\x04"
- "\x00\xef\x6b\x09\xaf\x62\xab\x05\x79\x83\x9c\x2f\x16\x0e\xc3\xe0"
- "\xbc\x53\xa3\x64\x15\x95\x5b\x2d\xdd\x69\x5b\xc2\xdd\x69\x5b\xed"
- "\xf8\x4d\x14\xe9\x5b\x1f\x17\x9e\xcc\xdf\x09\x8c\xa7\x28\xef\xc4"
- "\xb3\x2b\x8c\x39\x82\xa4\x65\x94\xfa\x23\xbf\x13\xfc\x32\x1e\x7c"
- "\x07\x7c\xb7\x56\x4b\x7c\x57\x6d\x7d\x2b\x2c\xdb\xb1\xf5\x4d\xd5"
- "\x8e\xad\x6f\x70\x7a\x07\x6c\x09\xdc\x37\x74\xa8\x77\x9f\xa0\xdc"
- "\x34\x59\xae\x62\x6b\x83\xb0\x6c\x3d\x10\x86\x3c\x81\xae\xe5\x4c"
- "\x47\xd0\xb5\x9c\x69\x09\xf8\x0d\x3e\xd7\x6a\x12\x69\x5b\x0f\x00"
- "\x9f\x56\x94\x3f\xde\x2d\xc7\xf8\xad\xe1\xb0\x82\xdd\x09\x38\xd3"
- "\xc1\xaf\xa9\x80\x11\x16\x15\xdb\x2c\xdd\x1e\x07\x4d\x5d\x2c\xc2"
- "\x53\x23\xcb\x23\x05\x8b\x29\x75\x04\x95\x03\xdf\x7d\xa0\x51\x21"
- "\xda\xd9\x84\xeb\x78\xbc\xa7\x4b\x51\xd7\x17\x80\x1b\xe6\xfa\x44"
- "\xe5\x36\x8b\x48\xdf\x06\x5b\x87\x0a\x19\xa7\xef\x3c\x64\xc3\xb3"
- "\xfd\x3b\x89\xdf\xb6\x1c\xad\x62\x5b\xbe\x66\xd9\x36\xd1\xe0\x21"
- "\xe6\x1f\x45\xb7\x2a\x9a\x12\x12\x11\x5f\x64\x13\x81\xc7\x6c\x2d"
- "\xa1\x23\xfc\x1e\xf3\x8a\x9d\xe8\x67\xe6\xa9\x12\x5c\xeb\x89\xf9"
- "\xa7\xa5\xf8\x65\xce\xfb\x05\xf3\xd0\x94\xe2\xd0\xf2\x91\x54\x9c"
- "\x82\x67\x77\x41\xc4\x42\x4f\x15\x9b\xcb\xa3\x15\xdb\xb2\x5a\x8a"
- "\xb9\x5f\x0e\xa3\x0c\x97\x2b\x22\x6b\x0a\x6c\xeb\x14\x11\xb1\xba"
- "\x82\xe6\x01\x4e\xb7\x68\x09\x4d\x42\xde\x62\xe2\xf6\x30\x1f\x71"
- "\xfe\xc9\xed\xc2\x1f\xb5\x6c\x6b\xe5\xb6\x89\x81\xe5\xd4\xdc\x7e"
- "\x3b\xf1\xfc\xa6\xb9\xbd\x9e\xf9\x54\x13\x96\x6d\x3b\xc0\xa3\xdd"
- "\x93\xdb\xcb\xfb\x3d\x75\x86\x52\x90\x16\x6d\x76\xee\xc4\xfb\x26"
- "\xe4\x3b\x28\xf9\x76\xca\x99\x88\x35\x62\xd9\x66\x8f\x54\x6c\x6b"
- "\x98\x72\xa6\x5b\x34\x3b\xab\xe8\xc9\xf6\x72\xd0\x6a\x27\x4d\x3e"
- "\x11\x49\x6d\x29\x2e\x44\x9e\x4e\xa4\xd7\x4b\xfe\x9f\x7c\xa2\x43"
- "\x4c\x79\x49\x9c\x9a\x72\xe6\xef\x62\xb2\x53\x7c\x51\xe0\xa2\x81"
- "\x17\x2f\x17\x1a\xcb\xc5\xc1\xb6\x9d\x74\xf1\x11\x3f\xb1\x4c\x4c"
- "\x9a\xa9\x89\xc9\x27\x4e\x89\xa7\x5e\x62\xda\x8c\xa1\x66\x27\xe4"
- "\xc7\x55\xc5\xf4\xce\x69\x76\xee\x45\xfd\xe3\x01\xd7\x2d\x7c\xae"
- "\x4d\xc8\xeb\xb5\x3e\x79\xc2\x46\x07\xdb\xaa\x28\x92\xb6\xcd\x1e"
- "\xad\xdc\x96\xa5\xa5\x6d\x9b\xa8\x55\x6e\xcb\x17\x69\xdb\x76\x44"
- "\x2a\xb7\x35\x44\xd3\xb6\x81\x07\xea\xb3\xd0\x4f\x69\xdc\xe7\x5d"
- "\x98\xef\xe3\xf9\xfa\x2e\xee\xff\x8a\xfa\x1c\x61\xa9\xcf\x87\x2e"
- "\x14\x8a\xf7\xeb\x73\x78\xce\x2e\xd2\xea\xf3\xbb\xd3\xea\x27\x22"
- "\x5f\xbe\x92\xaf\x7a\x27\xf3\xa5\x1c\x8b\x56\xd5\x3f\x8b\xb1\x23"
- "\x15\xef\x5d\xf8\x55\xe0\x57\x8d\xb4\x00\xe0\x5f\xd2\xa9\x60\x06"
- "\xc4\x5d\xeb\x61\xa3\x62\x8e\x9e\xb6\xdd\x32\x35\x7a\xb7\x00\x0d"
- "\x21\x27\xf5\x01\xad\xb2\x3e\x2c\xd2\xb7\x67\x85\x25\xef\x6f\xbf"
- "\x81\x61\x77\x2f\xcd\xe2\xb9\xbc\x59\x54\x6e\xcf\x41\xda\x6f\xc2"
- "\xcc\xab\x96\xed\x3b\x34\xcb\x3b\xd0\x45\xdb\x1b\x1e\x7c\x59\x04"
- "\xa3\x15\xdb\x5b\xb5\x8a\xed\x07\x22\x17\xc1\xf6\x75\xed\x25\xd6"
- "\x4f\x91\xfd\x02\x34\xf8\x03\xe8\x51\x2f\xfb\xdf\xe7\x82\x0c\x2c"
- "\x1e\x52\xde\xdc\x0e\x5e\x28\x7e\x4f\xea\xa6\x96\xd0\x61\x49\x53"
- "\xe0\xb1\x83\x79\x8a\xfb\xf7\xa9\x62\x2a\x47\x5d\x0d\x5a\xe5\xf6"
- "\x03\xd1\x4a\xc0\x4d\x43\x3d\xe9\x3b\x1e\x08\x4b\x79\xdd\x01\x7e"
- "\xdd\x8b\x32\x7f\x20\xc5\xe3\x3b\x26\xf6\xa5\x23\x59\x57\xb1\x7e"
- "\x9a\x1a\x09\x33\xcf\xfc\x83\xf5\x9a\xd2\x53\x54\x60\xe8\x29\xd6"
- "\x51\x3c\x9f\x60\x3d\xa5\xe9\x7a\x4a\xd3\xf5\x94\x7c\xb6\x40\xd7"
- "\x54\x6c\x69\x65\x7d\x34\xd5\xa5\xf4\xcc\xd4\x68\xb6\x00\x6f\x64"
- "\x00\x46\xab\xea\x0b\xe4\x59\xb5\xe5\x6b\x99\x5f\xd2\x69\xab\x45"
- "\x83\xbe\xd1\xa0\x6f\x34\xa5\x6f\xf2\x75\x7d\x63\x32\xf4\x4d\x14"
- "\xe3\x1a\x64\x4a\x4b\xa6\x6f\x34\x5d\xdf\x44\x85\xd2\x37\x9a\xae"
- "\x6f\x38\x3d\xaa\xeb\x9b\x68\x12\x7d\xa3\x55\x6c\xe5\xf6\xa6\xea"
- "\x7a\xa6\x9c\xf5\x0c\xb7\x57\xab\xdc\x7a\x40\x53\x7a\x26\x80\xb9"
- "\x84\x89\xf5\x4c\x14\x65\x34\x43\xcf\x74\x4a\x7d\x60\x61\x5d\xd3"
- "\xfd\x2b\x82\xfe\x74\x10\xeb\x18\xa9\x4f\x22\xc3\x22\xac\x4f\x40"
- "\xbf\xbb\x13\xf5\x89\x58\xb5\xcd\x8e\x7b\x9b\xd2\x53\xdb\x26\x5a"
- "\x97\x8b\x08\xf4\x49\xd6\x54\x57\x08\x7d\xfd\x37\xcc\xa9\xa1\xb7"
- "\x5d\x25\xe5\x3e\x57\x84\xa0\x07\xf2\x45\x4b\x39\x41\xe7\x80\x7f"
- "\xa3\xd0\x15\x44\x90\xcb\x1d\x90\xcf\x56\xd4\xdd\xd0\x52\xfc\x67"
- "\x82\xbc\xdb\x27\xb7\x77\xf8\x9e\x0a\x65\xd9\x26\x9f\x10\x41\xd0"
- "\xc7\xff\x54\x71\x39\xf4\x4b\x56\xb0\xb9\x7d\x1f\x4d\x6a\x13\xda"
- "\xa4\x19\x7e\x07\xf0\x68\x98\x3c\xc7\x6b\x7d\xea\x25\x1b\xe4\x4c"
- "\x78\xa1\x17\xff\x73\xf2\x09\x9b\x75\x7a\x1b\xfd\x68\xd2\x4c\xa1"
- "\x41\x9e\x40\x77\xc8\x19\xe4\x11\x32\x36\x11\x32\x97\x0f\x39\xdb"
- "\x11\x49\x90\x33\xc8\xcc\xf5\xb8\x77\x28\xfa\xd5\xe7\x43\xce\x72"
- "\x34\x39\x9e\xb5\xc9\x39\x1c\xe4\x21\x9f\xd7\xb8\x20\x6b\x39\x90"
- "\x0b\x29\x6b\x9a\x2a\xe7\xd4\x98\x7e\x26\x5d\xd6\xd0\x17\x78\xef"
- "\xc2\xaf\x02\xbf\xe4\xb2\x56\x1c\x23\x6b\x2f\xe9\xb2\x96\xa6\x64"
- "\x0d\x7d\x9a\x1a\x5d\xaa\xe4\x8d\xe1\xf3\x3c\xaf\x47\xde\xd2\xb7"
- "\xef\x10\x6c\x4f\x4a\xde\x61\x99\xdb\x8e\x71\x65\x7b\x2b\xe4\xed"
- "\x80\x56\xf1\x0e\xe0\x89\x20\xeb\x4d\xf0\xe6\x7f\xf1\x58\x37\xa5"
- "\x58\xfc\x57\x41\x74\x48\x39\xea\x6a\x85\x2e\xfb\x3b\xf4\xe8\x7f"
- "\x3d\x15\xa2\x3a\xc0\xda\xa1\xa5\x6d\x6f\x80\x3c\x1d\xd0\x2a\xa5"
- "\x3c\x4d\x8c\x2e\x65\x98\x3b\x26\xf6\xc0\x90\x63\x65\xbc\x3c\xf5"
- "\xb5\xbe\xd8\xe9\xb9\x7a\x8c\x9f\x3e\x29\x61\x7b\x05\xf7\x13\xfd"
- "\xd4\x30\x51\xbf\x87\xfd\x53\x23\xd7\xa6\x59\x06\x8b\xcb\xe8\xb2"
- "\xe3\xe4\xb0\x80\xdf\x09\xf7\x19\xb8\xcf\x98\x7a\xe3\x17\xb0\x23"
- "\x02\xcc\x53\x9d\x2c\x87\xc2\x33\x9a\xe7\x5c\xb9\xe0\x43\x8b\xe8"
- "\xcc\xca\x10\xe9\xbb\xcb\x44\xb7\x9d\xd7\xb0\xac\x78\x1e\x88\xf6"
- "\x0f\xc7\x75\xd0\xa6\xb3\x94\x89\x9f\x7d\x93\x47\x2b\x67\xdb\x09"
- "\xf7\xd9\x62\x91\x3d\x7d\xed\x42\x1a\x61\x0d\x91\xa5\xd6\xa3\xe5"
- "\x5b\x97\xdb\x78\x2d\x27\x93\xef\x85\xa7\xce\x59\x7b\x96\xcc\x6c"
- "\x57\x6a\x69\xa8\xcf\x65\x15\x62\x7e\x16\xd5\xce\x83\x7e\xf0\x90"
- "\xbd\xd6\x23\x76\x45\x3b\x99\x06\x5b\x1a\x0c\x5c\x18\x37\xe0\x79"
- "\x15\xf0\x1c\xfa\xc8\xe2\x5c\xfa\x83\x8b\x92\xae\x81\x76\x7a\x1c"
- "\x3d\xed\xef\xe3\xfd\x74\x83\x26\x7d\xbc\x2f\x35\xe8\xd4\xc7\x7a"
- "\x99\x99\xc7\xe8\xe8\x42\x11\x5c\xf7\x1c\x31\x2d\xec\xee\x88\xf8"
- "\x0a\x74\x2c\x2f\x8b\xd2\x55\x53\x17\x5f\x2d\x7c\xed\xc2\xeb\x73"
- "\x9d\xa0\x5a\xbc\x2f\x2b\x15\x9a\x96\xb6\x7b\x86\xa8\xdc\x3d\xbd"
- "\x63\xa1\x88\xf0\x5a\x09\xea\xf0\xfb\xe9\xce\x72\xd5\x17\xdb\x72"
- "\xe4\x3c\xcf\xb2\x7b\x3a\x60\x5d\xc2\xb0\x9a\x51\x3e\x5a\xb9\xbb"
- "\xb0\xd3\x33\xcc\xe2\xa7\x3f\x4c\x97\xf9\x2c\xdb\x72\x8a\x97\xd0"
- "\x95\xc7\x69\x58\xae\xb4\xf5\x2b\x76\x97\xb0\x3e\x40\x9a\x0d\x69"
- "\x93\x00\xdf\x85\xfc\x39\x7e\xfa\xb0\x5a\xd9\xb1\xc3\x26\x19\xf9"
- "\x70\xef\xe0\xfb\x38\xfe\x49\x91\xdb\x2b\xe8\x2f\x47\xef\x66\x0b"
- "\xa7\x99\x63\x36\x5f\x6c\xf8\xe5\x26\x7f\xdd\xab\xcf\xb7\x35\xc0"
- "\xd6\x22\xf7\x32\x1a\x8a\xfe\x61\xfc\x7e\xe7\x76\x89\x63\xc2\x33"
- "\x2c\x7f\xdb\x92\x30\xe6\x09\xc3\x0e\xfa\xa9\xa2\xa6\x2f\x7a\x0a"
- "\xb6\x75\xce\x8a\xc0\xba\x85\x3d\xb4\xfc\x72\xea\x62\x4d\xf0\x3d"
- "\xeb\xa3\x5a\xa4\x33\xdd\x3a\x3d\xd7\x64\x1a\x34\xeb\xbb\x5f\x76"
- "\x17\xab\x79\xe1\x35\x25\xc2\x23\xc8\xfb\x23\xde\x9f\xb8\x66\x81"
- "\xa2\x43\xfd\xc4\x0e\xe8\x11\x5e\x7f\xad\x05\xbd\xe7\xdb\x45\x18"
- "\x30\x9d\x7e\xba\x29\xa8\xaf\xf3\x84\x7c\x91\x09\xac\x5b\x92\x8e"
- "\x5b\xbc\xff\xd3\x0b\xff\xda\xaa\x96\xa1\xd0\x43\x52\x37\xed\xab"
- "\x2a\x53\x78\x87\x19\xae\xb7\xec\x34\xb5\xe1\xfd\xfc\x90\xc0\xf8"
- "\xb4\xaf\x82\xe7\x11\xde\x85\x5d\x9c\xf6\x06\x78\x5b\x78\xe7\x31"
- "\x4e\xd7\xbe\xe1\xfd\x51\x17\x1d\xc3\xbc\xaf\xb6\x67\x4d\xe6\xda"
- "\x72\x5e\x83\x51\xeb\x48\xd7\x62\x3e\x34\xa2\xc1\xc0\x8b\x6d\x0c"
- "\xd0\xd7\xc2\x36\x07\xdb\x1a\xbc\xa6\x3f\xbf\x54\x84\xd9\xe6\x40"
- "\xde\x11\x46\x1b\xb8\x7d\xaa\x5d\xd7\xe6\xc6\xb6\x0b\x38\x04\x31"
- "\x87\x96\x34\x98\xbf\x98\x2c\x0e\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d"
- "\x96\x6d\x91\x3a\x16\x63\x44\xe4\x76\xd4\x2f\xd3\xf3\x01\x0b\xf3"
- "\x9f\x1f\x4f\x53\x3c\x75\x2d\x25\xf2\x51\x4f\x3f\x5a\xb6\x59\xdc"
- "\xdf\xd1\x8f\xdc\x9a\x38\x7a\x8c\x86\xf3\x7c\x37\x95\xaf\x1a\xdb"
- "\xd9\x61\xe6\xdf\x86\x7c\x1e\x93\x7d\xa5\xac\x6f\x65\xde\x4b\x91"
- "\xb7\x0d\x79\xd2\xf4\xbc\x69\x6a\x3f\x47\x5e\xfb\xf3\x15\xe3\x58"
- "\x3f\x3f\x0d\x77\x04\xe5\x78\xbf\x2f\xcf\x78\x16\x78\x06\x2e\xad"
- "\xa2\xb2\x21\x3f\x39\x2e\xef\x58\x78\x3c\x8b\x9e\x15\xed\xa8\xe7"
- "\x72\xe6\x29\xf7\x62\xba\x02\x7c\xf9\x65\xd9\x32\xba\x94\xf9\x49"
- "\xa4\xed\x2e\x55\x74\x1f\x5e\x24\x3c\xb0\x3d\xa1\x51\x8b\x17\xd2"
- "\x95\x90\xa3\x92\xe3\x34\x7c\x79\x41\xa9\x03\xb8\x12\xad\x3b\x49"
- "\x24\x75\x50\xda\x6e\x97\x2f\xf2\x35\xd5\x9e\xe4\xf5\x97\xe1\x75"
- "\x06\x2f\xe2\x7e\xe7\xf9\xf4\x05\xe8\x5a\xa1\xd6\x0f\xae\xbb\x82"
- "\xd7\xef\x8f\xd2\x75\x66\x6e\x2f\x7e\x29\xa8\xfb\x8c\x38\x2b\xa6"
- "\x0b\x35\xa6\xb9\xfc\x74\x5d\x36\xae\x15\xf2\xe7\xa1\x19\xfa\xb3"
- "\x0b\xf9\xda\xc4\x59\x8d\xf3\x54\xa0\xfd\x11\xe1\x49\x61\x99\xd8"
- "\xdb\xe9\xb9\x2e\xcb\x4f\x63\x75\x79\x1f\x1e\x62\x58\x7d\xe0\xe0"
- "\x42\xdf\x12\xf3\x26\xf0\x78\xd5\x51\x96\xc2\x78\xcc\x92\x72\x01"
- "\x58\xb5\x26\xa5\xb7\x35\xe0\xba\xd9\xa3\x39\xa1\xa3\x9d\xda\xaa"
- "\xcf\x1a\xe4\xbd\xfe\x4e\xe8\xe3\x68\x72\xf8\xfb\xaa\xbc\x43\x98"
- "\xc7\xaf\x6b\x57\x70\xf6\x55\x78\x87\x1c\xe7\xe7\x13\xfc\x1c\xb2"
- "\x7c\xde\xe0\xab\xce\x45\xfd\xc7\xb9\xde\x76\x35\x9f\xbf\xee\x44"
- "\x07\xea\x40\x1b\xda\xfd\x34\xb2\x49\xed\x65\x7c\xde\xd0\x87\xec"
- "\xd9\x58\x76\x58\xe6\x94\x4c\xdf\xf0\x5e\x73\x9d\x94\x3f\x27\x78"
- "\xbe\x42\xd7\x1b\xbc\xd6\x92\x71\x94\x6e\xd8\xd9\x6c\x97\xfc\x6d"
- "\x12\xa6\xeb\x27\xbd\xaf\x05\x4d\xbc\xdf\xa4\xd4\xd7\x0d\x3b\xcf"
- "\xfd\x5d\x8f\xf6\x5d\xbf\x1e\xbf\x1a\xfd\x19\xf3\xff\xeb\xf7\xe2"
- "\x3e\x03\xbf\x1a\x49\xbb\x8d\x85\x29\x7e\xbc\xeb\x80\xcd\xce\xcf"
- "\x7e\xba\xbe\x42\x6c\x1c\x6e\x82\x5d\x22\xef\x6b\xaf\xe0\x75\x82"
- "\xeb\xf7\xa0\xbf\xc6\xa8\xbe\xb8\x41\xee\x29\x02\x37\xa6\xbb\x70"
- "\x57\x8b\x70\x53\x59\x08\x78\x5f\xdf\xd6\x54\x1d\x22\xc7\xf5\xdc"
- "\xfe\xeb\x03\xdc\xa6\x10\xe8\xcf\xd7\xf9\xd5\x22\xd8\x58\x13\x21"
- "\xde\xf7\xea\xf4\xdc\x00\xf9\x73\x92\x5a\x73\xd8\xb7\x8b\xe1\xe9"
- "\x3c\x21\x8c\xf6\x2b\x9d\xf6\x79\x03\xf7\x25\x9e\x6f\x47\xdb\xad"
- "\x27\xe9\x86\x05\x22\xfd\xb3\x86\x46\x27\xd1\x26\xe8\x11\x8c\x35"
- "\x72\x2d\x1e\x7a\x89\x61\x62\xfc\xbf\xae\xc6\xd8\xa7\x59\x83\xf7"
- "\x6b\xf1\x0e\x63\x4f\xb0\xd9\x19\x26\x86\x15\xe5\xf6\xa1\xfc\x3e"
- "\x2d\x68\xc6\x58\x8d\x3e\xff\xbc\xa1\xac\x18\x7a\xa6\x47\x6f\xdd"
- "\x30\x74\xd9\x09\x11\x36\xda\xc7\x7b\xa1\x80\x0b\xfe\x7f\xce\xde"
- "\x27\xff\xf7\xe0\x9c\xf5\x6f\x8d\xc3\x55\x9f\x69\xa0\x4b\x7c\x9f"
- "\x65\x1d\x50\xfd\x75\x43\x24\xbe\xbf\xb2\x0e\xe0\x37\x1e\xbf\xe9"
- "\xf8\x15\xe9\xcf\xb1\xbf\xec\x98\x7b\x48\x6b\xd6\x9e\x4e\x4f\x16"
- "\xc6\xff\xe1\x0d\xaa\x1f\x38\x1d\xed\x60\x1e\xf9\x96\x2c\xbc\x5e"
- "\xc7\xfb\xa0\x9c\xce\xfc\xcc\xe9\x1a\xec\x19\x3c\xe7\xe1\xbd\x8d"
- "\x65\x75\x9d\x46\x71\xef\x7d\x2b\xc1\x73\x4b\xba\x18\xff\x2d\x72"
- "\x8d\x71\x79\x45\x05\xf3\x29\xf2\x4c\xb3\x46\x2a\x2a\x50\xdf\x4e"
- "\x83\xae\x48\xab\xe2\xf7\xcc\x93\x48\x6f\x02\x5d\xe4\x1a\x7a\x08"
- "\xf3\xbd\xe4\xb6\x46\x56\xa0\xc7\x26\xb3\xd4\x07\x58\x1f\xb5\xd3"
- "\x8d\x21\xe8\x2c\xf4\xed\x67\xbb\xd4\x58\x73\xe3\x19\x7e\x86\xae"
- "\xfc\x12\xf7\xc1\x66\xb4\xb2\x6b\xd5\x87\xfe\x6e\x13\xf5\xef\x32"
- "\x51\x6e\x64\xd5\x37\x43\x23\xe9\xef\xb6\xfb\x02\x7b\xa8\x25\xb2"
- "\x9b\x1c\xcf\x49\x18\xdf\xf8\xc0\x03\xee\xc5\x22\xfa\x41\xd7\x0e"
- "\xb3\x2f\x72\xca\x8b\xb1\xf9\xea\xe3\x74\xa3\xa4\xc7\x2b\x47\x31"
- "\xea\x3f\x25\x61\xeb\xf4\x09\x84\xd7\xce\x16\x91\xb5\xc7\x44\x08"
- "\xf6\x5d\xfa\x9a\x2e\x1a\xb1\x61\x09\x65\xd7\x74\xd1\xf0\xcd\x5d"
- "\x94\x25\xfe\x91\x65\xaa\x81\xdd\xf6\xd4\x19\x1b\x41\x27\xe4\x0f"
- "\x2c\x26\xcb\xe6\x25\x24\x79\x24\x5a\x09\xfb\x2d\x02\xfb\xed\x54"
- "\x16\xeb\xc6\x1e\xfb\xad\x5b\xda\xc5\xbb\xdb\x14\x1f\xed\x6e\x1b"
- "\xe0\xa4\x94\x8c\x19\x64\x03\x7e\xee\x93\x74\xe3\x8d\x19\x6d\xb0"
- "\x1d\xd1\x66\xbf\xde\x5e\x5c\xc7\x58\x9d\xd4\x5f\xb6\x15\xfa\x5a"
- "\x54\x7e\xb6\xab\xcf\x71\xd8\xc4\x3c\x15\x62\xb9\x41\x1b\x6e\xba"
- "\x87\xf7\x62\xf7\x0c\x09\x9b\xe7\xd7\x88\x30\xa7\x97\x0c\x13\x61"
- "\xa4\x67\x71\xdd\xbb\x90\xde\xe9\xb9\x29\xcf\x6f\xda\xb4\xb3\x2f"
- "\x1e\xc5\xfc\x48\xd7\x2b\x37\xfd\x51\x98\xca\xc1\xa3\xdb\xb3\x96"
- "\x45\x60\x7b\x9f\x64\x99\xbd\xe9\xd0\xd4\x22\x11\x71\xcc\xe5\x7d"
- "\xf1\x9b\xbc\xbc\x67\xcf\x7b\x75\xef\xc3\xb6\xf9\xbe\x7d\x7a\x1e"
- "\x2f\x78\xae\x60\x2d\x02\xcc\x55\xdb\xb3\x04\xe6\xe7\xf1\x36\x3c"
- "\x51\x5f\x76\x3c\xfb\x8a\xbc\x2e\xfd\x52\x7e\x9c\xe1\xa7\x07\x0b"
- "\x19\x77\xde\x93\x65\xdd\x09\x7b\xeb\xd2\x63\xf4\xe3\x89\x21\xd0"
- "\x01\xef\x31\xfe\x4f\xcc\xd1\xf7\x55\xa5\xbf\x0b\xd2\x30\xfe\xdf"
- "\x5f\xca\x69\x25\xc3\xc8\x5e\xe2\x10\x81\xbe\x6c\x26\xe9\x83\x62"
- "\xa2\xcb\x51\xa6\xc4\x80\x83\x71\xea\x37\x1d\xa6\x47\x1e\x41\x5a"
- "\x85\x01\x07\x79\x2e\xc3\x73\x75\x4f\x1e\x55\x66\x47\x4c\x99\x47"
- "\x3a\x4c\x37\xfd\x06\x69\x7b\x13\xca\x1c\x4c\x28\x73\x24\xa6\x4c"
- "\xb9\x5e\x4f\x30\xbe\xcc\x08\x8a\x2f\x33\xc2\x76\x2e\x6e\x23\x86"
- "\x27\x94\x19\x9d\x50\x66\xfc\xb9\xb8\x8d\xc8\x4f\x28\xe3\x4c\x28"
- "\xe3\x8a\xa1\x25\xfb\x83\x64\x23\x6d\x75\x42\x99\x9a\x84\x32\x3b"
- "\x8d\xe7\xbe\x7c\x7e\xe6\x6f\x22\x3b\x78\x33\xc0\xfd\xf9\x3a\xfa"
- "\xa7\xe3\xad\xe7\x3b\xf5\xb2\x81\x24\xed\x8a\xc4\xd7\x37\x32\x23"
- "\xbe\xbe\x91\x43\xcf\x6d\xd7\xc8\xec\x84\x32\xb9\x09\x65\xf2\x62"
- "\xca\xd4\xa9\x7a\x46\x16\x26\x94\x29\x49\x28\xb3\xf2\x5c\xbe\x1a"
- "\x59\x9d\x50\x66\x47\x42\x99\x86\xef\xa1\x05\x8f\xe3\xca\x37\x6b"
- "\x30\xdb\xca\xf7\xc2\x46\xb8\x79\x18\xfb\x1c\xf0\xde\xe4\xb6\xae"
- "\x70\x3f\xde\x0f\xe1\xf1\xaa\xd1\x15\xc6\xd8\x72\x33\xe6\x3f\xb7"
- "\x95\x1b\x63\x16\xfb\x63\xb0\x4c\x2b\x1b\x7b\x64\xa0\x2f\x5b\x94"
- "\xeb\x31\x7c\xb5\xb8\xae\xc6\xa1\x3c\x4e\xdd\x3c\xad\xc7\x26\x56"
- "\xfe\x4b\xa4\xe0\xdc\xfc\xae\xb1\x37\x5a\xab\xfc\x3c\x52\xd8\x26"
- "\x6f\x74\xc9\x32\x15\x31\x76\x34\xd7\x1f\xda\xb3\x24\x6c\x8e\xc7"
- "\xe3\x66\xe7\x79\xf0\xc8\x80\x6d\xe4\x6a\x81\x65\xc1\xfb\xd7\xcd"
- "\x35\xb0\x81\x60\xf7\x33\x6e\x47\xe9\xe6\xa0\xb4\xc9\xe6\x76\x11"
- "\xdf\xfb\x4a\xef\x94\xfb\xdb\xca\x26\x1d\x95\xd5\x84\xfa\xd9\x76"
- "\x6f\x2a\x3e\x4d\x1d\x72\xfc\x65\xdb\x6d\xd4\x23\x8d\xa5\x41\xe0"
- "\x35\xaa\xc7\xff\xc3\x4f\xa3\xa6\x49\x5b\xa3\x62\x5f\x31\xef\xbd"
- "\xf3\x1e\x52\x63\x28\x87\xf3\x80\xff\x6f\x1e\x61\xb4\x17\x63\x3d"
- "\x64\xec\xe6\xc8\xf9\x68\xa6\xfa\x70\x54\x69\x3c\x4f\xf6\x03\xaf"
- "\x8c\x5a\x1f\xdf\xef\xa3\xea\xe2\xfb\x7d\xd4\xae\x78\x9e\x34\x81"
- "\x27\x47\x35\x25\x94\x39\x9c\x50\xa6\x2d\xa6\xcc\x7a\xbd\x9e\x70"
- "\x7c\x99\x6c\x4b\x7c\x99\x6c\x7b\xcc\x33\xda\x98\x9d\xd5\x33\xf7"
- "\x91\xbe\x45\xd9\x39\x31\xcf\xa6\x2a\xa9\x3f\xb3\x27\x19\x69\xbc"
- "\x76\xb4\xf9\x4d\xe5\xdb\xa2\xc3\x73\x26\xc8\x3b\xe7\x2f\x4d\xc0"
- "\x61\x75\x02\x0e\x3d\xf2\xaf\xef\xa7\xff\xfe\x18\xdd\x52\xa2\xef"
- "\xa7\xb7\x63\xcc\x9e\xca\xcf\x80\x55\x8d\xfc\xa0\x43\xf6\xc1\x04"
- "\x78\x47\x12\xe0\xb5\xc7\x3c\xdb\xf0\x1c\x89\x69\x83\x2d\xd5\x2e"
- "\xfd\x04\x61\xbf\xdd\x92\x69\xa4\xf3\x9c\x12\xf8\x06\xdc\x72\xac"
- "\xc9\x65\x9f\xad\x41\x47\xe9\x16\xf6\x69\xd2\x75\xf9\x2d\xb1\xf2"
- "\x4f\xaa\x5d\xb7\x4c\x8b\xc7\xe3\x96\xc2\x78\x3c\x6e\x29\x89\x69"
- "\x57\xc8\xba\x9c\x7e\x61\x8d\x3c\xf4\x18\xdb\x3e\xec\x6b\x27\x7d"
- "\xa7\x96\xc1\x66\x3b\x43\x36\xf6\x59\x3b\x56\x42\xa9\x3e\x57\x00"
- "\x73\xb9\xdd\xfe\x3e\xf9\x29\x7d\x5f\xb9\xee\xf7\xe7\x00\xfc\xc3"
- "\x06\x3f\x6a\xab\xf6\x95\x6b\x95\x9f\xd6\x23\x0d\xfa\x6f\xd4\x0c"
- "\x65\xe7\x36\x04\x85\x3b\xbf\x1a\xf4\xc4\xbc\xe8\xd6\x3f\xeb\xf3"
- "\x88\x2a\xf6\xbd\x82\xee\x09\x60\x8c\xcf\x50\x7b\xe5\xb7\x0e\x8d"
- "\xe1\xeb\x90\x63\xc9\xdd\xe2\x28\xdd\xfa\x25\xdb\x00\x2c\xa3\xec"
- "\xc3\xd5\x18\x09\x12\xcf\xbd\x7d\x91\xe3\xd2\x76\xc3\x7b\xbf\x5e"
- "\x36\x3f\xa6\x6c\x50\x9f\x1b\x07\xf8\xdd\xa8\x08\x99\x1b\x43\x41"
- "\x02\x9c\x4c\x65\xef\xdd\xfa\x65\x23\xe4\x15\x65\x56\x1b\x65\x78"
- "\x1e\xcd\x65\xac\x25\x64\xbe\xb9\x94\xcc\xde\x25\x47\x25\x6c\xc3"
- "\x97\x02\xb6\x74\xbb\xaf\x34\x40\xbe\x50\x2b\xaf\x75\x99\x95\x0f"
- "\xcc\xad\xfe\xd4\x30\x59\x3a\x2a\xf7\x15\xfb\x71\x1f\xad\xdc\xe7"
- "\x02\x6e\x90\xa7\x5b\xcd\xac\x6f\x62\x69\x37\x61\x42\xde\x43\x53"
- "\x27\x8f\xfc\xe5\x43\xf7\x4f\x9b\x70\xa7\x63\xda\x9c\x17\x66\x15"
- "\x8e\x7c\x71\x41\x89\x63\xd1\xbc\x39\x25\x73\xe6\x3e\xeb\xc8\x76"
- "\x5d\xe7\x72\xcc\x2c\x51\xd7\xac\xa2\x99\xf3\x4b\xc6\xf2\xed\x08"
- "\x47\xf1\xbc\x59\x0b\xe5\xed\x8d\xe9\x14\x0f\x64\x4e\xc9\xac\x79"
- "\x8e\xeb\x0a\x47\x38\xee\x9b\x39\xa7\x68\xc1\xbc\x59\x49\x61\xdd"
- "\xe9\x98\x37\x6b\xde\xac\x99\x85\x8e\xb1\x8e\x6c\x86\x1c\x0b\x2e"
- "\xa6\x3f\xb3\x8d\x71\x8c\xc7\xaf\x75\x1e\x71\x48\x1f\xcf\xfc\x8a"
- "\x7f\x6e\xdb\x73\xee\x58\x76\xdb\x81\x78\x9e\xbb\xad\x35\x9e\xe7"
- "\x6e\x0b\x9c\x3b\x96\xdd\x96\x30\xfe\x8d\x4e\x18\xff\x46\x0f\x3d"
- "\x77\x2c\x1b\x9d\x30\xfe\x8d\x4e\x18\xff\x46\xf7\x8c\x7f\xe0\x25"
- "\xff\x0a\xa9\x17\x46\x27\x8c\x7f\xa3\x13\xc6\xbf\xd1\x2b\x13\x9e"
- "\xab\x62\x9e\x2f\xc5\x73\x7d\xec\xf8\x88\xe7\x3d\x86\x7c\xf6\xea"
- "\x97\xd1\x07\x8c\x3c\xac\xeb\xa1\x9b\xdb\xf4\xbc\xfe\x98\xbc\x01"
- "\x3d\x6f\xa8\x47\xfe\xc0\x47\xec\xeb\xa6\xe6\xeb\xb7\x3f\xc6\x3a"
- "\x9d\xfd\xdc\x78\x6c\x82\x7c\x5c\x7d\x92\x46\xff\x91\x61\x31\x0f"
- "\xb3\xdf\xa3\x78\xeb\x89\xce\xda\x41\x64\xe1\x32\xb5\xaf\x91\x59"
- "\x78\x6e\x6d\xc7\x95\x90\x96\x81\x1f\x74\xca\xed\xb0\x7f\x37\x97"
- "\xaa\xf1\xe2\xf6\x3a\x69\xf3\xa3\x8c\x0e\x5f\xce\x6b\x00\xc7\x8e"
- "\x32\x96\x75\x6a\x2c\x6e\xc3\x7d\x06\xf3\x34\xca\x9b\x85\xe9\xb6"
- "\x5b\x70\x25\xa4\xd9\xf0\xcb\x04\xbc\x3a\x03\xde\xca\xc1\xc9\x6d"
- "\xcb\x44\x3b\xb7\x67\x3e\x68\x22\xeb\x3a\x8f\xd6\xea\xd3\xd8\xb6"
- "\xbe\xfd\xb0\x5a\x5b\xd8\x0d\x5b\xfe\x8b\xfc\x5a\xa4\x27\x9f\x27"
- "\xfd\x04\xf6\xdf\xed\x07\xd4\x7a\xcb\x4f\xd0\xff\x0f\x86\xd4\xda"
- "\xe9\x6e\xf6\xbf\xe8\x3a\x46\x3f\xf9\x18\xd7\x6e\x5c\xdf\x36\xe0"
- "\x7b\xe5\x7c\xfb\x27\xa3\x85\x27\xe5\x61\x86\x9b\x90\x3e\x09\xfa"
- "\xad\xcb\x1a\x29\xcf\x4f\xf2\xce\x29\x3c\xa9\x0f\x25\x49\x2f\x87"
- "\xcd\xd0\xe5\xa7\x9f\xec\x61\x7c\x63\xd2\xab\x85\x67\xe0\x34\xce"
- "\xef\xe7\xfa\x50\xa6\x2f\x5b\xdb\xf0\x6b\x55\x7e\xe8\x3f\x69\x4b"
- "\x68\xc7\x77\xc7\xe8\xa7\x33\x55\x3b\x7e\xba\x2f\xa1\xee\x48\xf2"
- "\x76\xfc\x34\x13\xed\xf8\x2e\x79\x3b\x7e\x9a\x2d\x69\x6b\x42\x5b"
- "\x4c\xe7\xbc\x9b\x84\xb6\x7c\x27\xe9\x1e\x9f\x5e\xa8\xdb\x42\x3c"
- "\x27\xb3\xe1\x9d\x2c\xfb\x70\x69\x6f\xbf\xe9\xf9\x56\x5b\xab\x29"
- "\x2f\x49\x9d\xf5\xc2\xd3\xff\x61\x3f\xfd\xf4\x88\x84\xd3\x9b\xbe"
- "\x57\xe1\x02\x3a\x99\x24\x9d\x58\x1e\xac\x7d\xf5\xb7\x31\x2f\x51"
- "\x6b\x21\x39\x90\xff\x9f\x78\x8d\xb5\xcc\xf9\xa5\x22\x68\xd0\x11"
- "\xef\xb2\x12\xde\x85\x63\xde\x8d\x8f\x7b\xb7\xac\x27\x7d\xba\x91"
- "\xfe\xc3\xfa\x29\x67\x75\x42\x3f\xa1\x7f\xee\xb8\x2a\xbe\xdd\x39"
- "\x35\xaa\x7d\xe8\xa3\x73\x68\x9d\xd3\x80\x3e\xea\x4e\xde\x47\x39"
- "\x87\x93\xf3\x5a\x8e\x5c\x47\x13\x83\x28\x09\xbc\x3b\x78\x8e\xdd"
- "\x2d\x79\x50\xef\xa7\x73\xfb\xe7\x8e\x11\x46\xff\xfc\xb0\x36\xde"
- "\x51\x9c\xd0\xc6\x28\x60\x9c\x50\x6d\xbd\x73\x6c\x02\xec\x8a\xe4"
- "\xbc\x78\x47\x1d\xda\x19\x4d\xde\xce\x3b\xf6\xf6\xcd\x8b\x77\xb4"
- "\xa2\x3d\xd1\x73\x79\xf1\x8e\xa0\x2a\x43\x49\xca\xdc\x99\x21\x3c"
- "\xc9\xea\xb9\x73\xb8\x3b\xc2\x76\xee\x9d\xbc\x97\x62\x8f\x49\x1f"
- "\x13\xcf\x7f\x68\x03\x97\x63\xfa\x45\x94\x9e\xe5\x7e\x38\xe6\x20"
- "\xd3\xf7\xf1\x64\xa7\xe7\xce\x9a\x04\x5a\x9d\x3a\x46\x3f\xbb\xaa"
- "\xc3\x94\x52\xaf\xe8\xf5\xb3\x2f\x13\x70\x6a\x48\x4e\xaf\x3b\x0f"
- "\x81\x5e\xa7\x92\xd3\xeb\xce\xf6\xbe\xe9\xf5\x33\xee\xff\x53\xe7"
- "\xd2\xeb\x67\x8e\x58\x7a\xc1\xd6\x95\xed\xbb\xd6\x0e\xde\xe8\x2e"
- "\x10\xb5\xdc\xd6\x28\xd9\xac\xe0\x15\x55\xa6\x9d\xcb\x4c\xb3\x86"
- "\x15\x9f\xc0\x86\xb4\x9c\xa4\x9f\x8d\x31\xe4\x7f\x60\x35\xf5\x17"
- "\xdd\x4f\xb0\x1f\x51\x0a\x97\xf3\xb9\x4e\x79\x7d\x91\x6c\xe2\xf9"
- "\x47\x42\xbd\xd5\xc9\x75\xc1\xcf\x76\x81\xa6\xaf\x25\x49\x3f\xa0"
- "\xfc\xcb\xc6\x50\xbc\x8e\xf8\x99\x3f\xbe\x8f\x40\x37\x94\xd3\xb7"
- "\x9d\xbe\xf7\x77\xfe\x3e\x1b\x93\x77\x6e\x9f\x8d\xf9\x56\xf5\xd7"
- "\x98\x3f\xc6\xe3\x37\xc6\x99\xbc\xbf\xc6\x94\xf7\xdd\x5f\x63\x6a"
- "\xfa\xee\xaf\x31\x0d\xdc\x5f\x68\x6f\x30\x7e\xdc\x18\x73\x28\xbe"
- "\xbd\xa8\x17\xe5\x84\xe9\xa2\x4b\xf9\xf9\x87\xb6\xdb\xf8\xb1\x8e"
- "\xe3\xbe\xaa\x2d\x23\xf0\x72\xca\x30\xc6\xf1\x42\x61\xf4\x09\x1b"
- "\x34\x5c\xbf\x24\xf9\x7e\x2b\xcf\x71\x5b\xaa\x89\x78\x1f\xd9\xf1"
- "\x23\xb6\xdd\xc7\xfe\x41\x33\x51\x2b\xee\x4d\xc7\xe8\xee\x57\x35"
- "\x93\xa9\x94\xf7\x3c\xa5\x5f\xb8\x5c\x43\x18\x7b\x24\xb6\x2f\x78"
- "\xef\x93\xe7\xa6\x6b\xd5\xdc\xe9\xef\xc7\xe8\xae\x59\xaa\x5f\xee"
- "\x7e\x29\x9e\x8e\x77\x51\xf2\x7e\xb9\xcb\x8e\x7e\xf9\x7b\xf2\x7e"
- "\xb9\x6b\x74\xdf\xfd\x72\x57\x1e\xfa\xe5\xef\xe7\xca\xd1\x5d\x4e"
- "\x5d\x8e\x56\x70\x19\xc7\x5c\x9e\x8f\xdf\xf5\x17\xce\x83\x7b\xc8"
- "\xc8\x5d\x7c\xa4\x3c\x65\x64\xbb\x21\x47\xb2\x4c\x0d\x60\xc9\xfa"
- "\xf5\x3c\xd5\x3a\x8c\x58\xb8\x5e\x6b\x7b\x32\x39\xb9\x4b\xf6\xd3"
- "\xcd\xc5\xc4\x7b\xf1\xf9\x9b\x18\xc6\x3c\xa2\x93\x74\xf7\x48\xce"
- "\xc7\xe9\x37\x87\x62\xe5\xe4\xee\x9e\x7c\xac\xeb\xf4\xbc\x24\x3a"
- "\x9d\xc4\xf9\xe2\x61\xdf\xad\xb7\xbf\xbf\x1c\x47\x38\x3f\xe7\x4b"
- "\xc8\x93\xaf\xe4\xf1\xee\x9a\x78\x79\xbc\xbb\x38\x9e\x3f\xef\x92"
- "\xe5\x34\xe8\x39\x3f\x8d\x6d\x02\x0e\x3f\x98\xbf\xce\x2f\x9b\x77"
- "\xb7\x27\xc8\x26\x78\x20\x77\x8d\xe2\x81\xdc\x17\xe2\x71\xcd\x35"
- "\x27\xe7\x81\xdc\xa1\x7d\xf3\x40\x6e\x4e\xdf\x3c\x90\x3b\x8d\x79"
- "\xc0\x4f\xb9\xab\xe3\x65\x33\xb7\x28\xbe\xed\xa8\x57\xca\x26\x5d"
- "\x72\x21\xb2\x09\x5b\xe8\xd2\xbe\xe4\x90\x65\x8a\xfd\x47\x6a\xbb"
- "\x8c\xbd\x8e\x1f\x44\x33\x0b\xe4\x0a\xf8\xdd\xe3\xe0\x35\x25\xe8"
- "\xf8\x1c\xa6\xe1\x66\x79\xf6\xf0\x9e\xd1\xb1\x74\x5c\xab\xce\xc7"
- "\xb9\x91\xf7\x53\xde\x57\x56\xf4\xbc\x77\x79\x7c\xfb\xef\x99\x96"
- "\x9c\x9e\xf7\x14\x81\x9e\xee\xe4\xf4\xbc\xa7\xa2\x6f\x7a\xde\x53"
- "\xcf\x67\x8f\xce\x95\xa9\x7b\xf6\x3a\x16\x4a\x1b\x45\x96\x39\x49"
- "\xf7\x5e\xf6\xc3\xc6\xa7\x7b\x42\xf1\xe3\xd3\x3d\x47\x2e\x7c\x7c"
- "\xba\x37\x27\xf9\xf8\x74\x6f\x5e\xf2\xf1\xe9\x5e\xa7\x92\x87\x7b"
- "\xeb\xe2\xe5\xe1\xde\xf2\x78\x9e\x00\xed\xfe\xc7\xc6\xa7\x7b\x83"
- "\x09\x32\xb0\xee\x18\x8d\x7b\x09\x36\x45\xb9\xea\xb7\xf1\xb7\xc7"
- "\xe3\x38\x2e\x23\x79\xbf\x8d\x1b\x8e\x7e\x5b\x97\xbc\xdf\xc6\xe5"
- "\xf6\xdd\x6f\xe3\x78\x0f\x7a\xdd\xb9\xfd\x36\xae\xe4\xc2\x6d\x8a"
- "\x71\x3b\xe2\xfb\x6c\xdc\xfa\x0b\xef\xb3\x71\xed\xc9\xfb\x6c\xbc"
- "\x39\x79\x9f\x8d\x1f\xaa\xfa\x6c\xfc\xb4\xf8\x3e\x1b\x3f\x3a\xbe"
- "\xcf\x40\xb7\xff\x66\x9f\xa1\x7f\xcc\xca\x3f\x61\xfc\xc7\x98\xb7"
- "\xf7\xef\xf4\x8c\xdf\xe9\xa7\x09\x25\x6a\x6e\x3d\x41\x8d\x1d\xaa"
- "\x0f\x3f\x40\x9e\xba\x73\xc7\x81\xf1\x07\xf4\xb4\x5f\x9e\xdb\x0f"
- "\xe3\xdb\xa0\xa3\xdb\x9b\x4a\xe5\xde\x96\xea\x43\xa6\x39\xf2\x79"
- "\x97\xf0\xfe\xd4\x04\xde\x2c\x4a\x41\x1f\x0b\x5f\x38\x42\xac\xd7"
- "\x91\x3f\xc4\x70\xf8\xcc\x65\x3c\xac\x09\xd9\x17\x32\xc6\x9f\xc7"
- "\xa7\xc6\xec\x2d\xbb\x15\xf0\xee\x9b\xa0\x78\x75\x42\xa2\xfd\x5b"
- "\x8b\x77\x57\x28\x3e\xfd\xf9\xd7\x09\x38\xec\x49\xce\xa7\x13\x0e"
- "\xa2\x0d\xb5\xc9\xf9\x74\x42\xa0\x6f\x3e\xbd\x0f\xfd\x4f\xb5\x31"
- "\x73\x9f\x41\x4f\x45\xfc\x09\x73\x9f\xfb\xb2\xac\x21\xc5\x3b\xd2"
- "\x26\xaa\xdc\x6d\xee\xf4\xdc\x97\x68\xff\xa1\x6f\xee\x6b\xd6\x71"
- "\xfe\x43\x42\xf9\x3e\xec\xbf\xfb\xd8\xfe\xfb\x20\x39\xce\xf7\x9d"
- "\xc7\xfe\xbb\x8f\xed\xbf\x0f\xce\x95\xad\xfb\x74\xfb\x2f\xd9\x1c"
- "\xef\xbe\xf6\xe4\xfd\xff\xf3\x84\xfe\xa7\xfc\x12\xcc\x87\x65\xf9"
- "\xf8\x7c\x23\x62\xf3\xb1\x6f\x12\xe7\x65\x1e\x49\x92\x37\x3f\x11"
- "\x66\x1f\xf9\xca\xcf\xe1\x3d\xf6\xa5\x4a\xca\x7b\x3f\xdf\xa9\xe4"
- "\x71\xa2\x39\x5e\x1e\x7f\xde\x14\x2f\x8f\xf7\x39\x13\xca\xb5\xc5"
- "\xbf\x07\xff\xfc\x8f\xe9\xd8\x89\xd3\x12\x78\xe0\x8b\x63\x34\xf1"
- "\x8f\x8a\x07\xee\xbf\x31\x1e\x8f\x89\x45\xc9\x79\x60\xe2\x4a\xb4"
- "\xff\x8b\xe4\x3c\x30\xb1\xae\x6f\x1e\x98\xb8\x17\xb4\xfc\x22\x96"
- "\x6f\x1f\x2e\xcd\xed\x9f\x90\xc7\x9f\x5c\xe7\x4d\x0c\x27\x5f\x23"
- "\xb8\xdf\xa6\x68\x7c\xff\xc4\x78\x1a\xdf\x9f\x15\x4f\x43\xb4\xe5"
- "\xbf\x4f\xc3\x9e\xd8\x07\x9d\x9e\xfb\x13\xe5\xdf\x77\x8c\x1e\xd0"
- "\xe5\xff\xc1\x4b\x12\x70\xdc\xa3\x70\x49\xb6\x2e\x72\x3f\xcf\x7f"
- "\x7d\xc9\x69\x79\x7f\x7b\xf2\x36\x3f\x60\xc6\x18\xe4\xd3\xce\x91"
- "\xa5\x07\x86\x22\xfd\x61\x5e\x0f\xe5\xf5\x90\xcd\x48\x7f\x38\x42"
- "\x16\x39\x5e\xf5\x8c\x4b\x0f\xe4\xb2\x2f\x0a\xd3\x9f\xf9\xd7\x3a"
- "\x94\xf2\x78\x0c\x62\xbc\x0a\x4a\xa5\xdf\x82\x75\x25\xf3\xfa\x35"
- "\xcc\xeb\x0f\x48\xfb\x8f\xf7\x59\xd8\x8f\xd0\xea\xa2\x3c\x5f\x28"
- "\x42\x06\xbf\x73\xfe\x04\xd8\x35\x2c\x17\x9c\xdf\xc8\xab\xd6\xcd"
- "\xca\x13\x74\xd3\x03\x4d\xc9\xfb\xf8\x81\x23\x7d\xf3\xce\x03\x61"
- "\xd5\xcf\x0f\x8e\x88\xef\xe7\x07\x6d\x9a\x67\xe0\x34\x6e\x2b\x78"
- "\xe0\x82\xe4\xa4\xc4\x21\x82\x7d\xea\xfb\x15\x4f\xb4\x16\x97\xd1"
- "\x8f\x8e\xd3\x83\x55\xb2\x3e\x93\x08\x5b\x97\xa7\x50\x93\xd4\x01"
- "\x0f\x7e\x23\xf1\x44\x9e\x82\x08\x99\xc4\x8a\xe7\x5b\xf9\x5d\xad"
- "\x47\x84\x91\xef\x10\xef\x09\xf0\x99\x65\xf0\xc2\xa5\x47\xe9\xc1"
- "\xf7\xe2\xca\x43\x13\xf8\x14\x8c\x40\xad\x94\xc7\x07\xdb\x8c\x35"
- "\xdd\x95\x78\x4e\xbe\xee\x3b\xc9\x62\xf8\x3e\x28\x9f\xb1\x07\xfb"
- "\xdc\xbf\x64\x9c\xf8\xac\x0c\xe3\x74\x7e\x3d\x30\x69\xba\xc1\xbf"
- "\xca\xd7\x72\x52\x51\xaf\x2f\xdf\x24\x97\x9f\x26\x39\xce\xb3\x36"
- "\x18\x23\x07\x93\xea\x63\xe1\xa8\xf8\x1f\x93\x1a\x0c\x7f\x3c\xdc"
- "\x37\x7d\x0f\x2c\x03\x9f\xf6\x04\x7c\x60\x47\xdc\x7b\x58\xc1\x98"
- "\x6c\x39\x1f\x0c\xee\x73\xc5\xb3\xcc\x0f\x93\x1d\xe7\x5b\xf3\x4b"
- "\xb5\x53\xde\xeb\xe7\xf0\xd6\x64\x69\x2f\x31\x8c\xf3\xe3\x38\x79"
- "\x7d\xdc\xdc\x42\xee\xdd\xf3\xde\xd6\x94\x27\x95\xdc\x4f\x49\x58"
- "\x23\x9c\xbc\x53\xfa\x53\xe9\x72\xff\x54\x24\x51\x0e\x26\x1f\x34"
- "\xc6\xe8\x84\xf4\x36\x43\xee\x31\xaf\x65\xb8\x09\xeb\xac\x53\xcc"
- "\x4a\x16\xa6\x4c\xd7\xd2\x62\xe7\x6b\x53\xa4\xfd\x67\xac\x97\xe2"
- "\xbd\x39\xa1\x5c\xc2\xfa\xdf\xe4\x9d\xa2\xef\x75\xfa\x0c\xf4\x6f"
- "\x88\xf7\xb6\x54\x0c\x84\x29\xab\x13\xd6\x2b\x82\x6b\xe5\xf9\xf6"
- "\xbf\x02\xee\x54\x5d\xef\xe5\x25\xd8\x78\x53\x76\xba\x4f\x9c\xaf"
- "\xfd\x53\xfa\x68\xff\x94\xde\xf6\xcf\x65\xb8\x53\x13\xd6\x12\xa7"
- "\xca\xf6\x47\xcf\xd1\x7f\x53\x87\x42\x7f\x19\x74\x83\xcd\x3d\x75"
- "\x81\x61\xab\xf3\xfa\x41\xdf\xb6\xfa\xd4\xde\xf5\x3f\x55\xae\x77"
- "\xfd\x2f\x98\xcc\x56\xf7\x93\xdc\x5b\x8d\xaf\xbb\xda\x5a\x93\xac"
- "\x2d\x53\xfb\x58\xff\x9b\xaa\xaf\xff\xe5\x39\xe2\xf5\xd9\x54\x7f"
- "\x7c\x1f\x4e\x4d\xe8\xc3\x3c\x8a\xef\xc3\x29\x3b\xff\x6f\xc7\x35"
- "\x06\x94\x9a\x9a\x6a\x4a\x4d\x31\xa5\xa4\xe2\x35\x9a\x48\xfd\x53"
- "\xcd\xa9\xfd\xf0\xbb\x48\xbf\xf6\x37\xa5\x9a\xcc\xf8\xf5\xd3\xaf"
- "\x17\x25\x3c\xf7\xe7\xb2\xf8\x99\xf5\x6b\xbf\x84\xe7\x8b\xbe\xe7"
- "\x7d\x7f\xbd\x5e\xa3\x7e\x73\xc2\x73\xbf\xef\x79\x7f\xd1\x7f\xb3"
- "\x3c\x9d\xf3\x1c\xef\x87\x76\xff\xdc\x85\x33\x8b\xe6\x14\xca\xfd"
- "\xe2\x59\x8e\x99\xcf\x3c\x33\x6b\xfe\x7c\x47\xc9\x8b\x8e\x7b\xef"
- "\x79\xe8\xd6\x3b\x1d\x6a\xdb\xb9\x68\xec\x75\x85\xe9\x34\x79\xd1"
- "\x3c\x7e\x31\xf9\xe1\xfb\xf3\x1d\x79\xf7\xde\x13\xff\xd2\x00\x23"
- "\xb7\x97\xcf\x07\x25\x46\xfe\x72\x2b\x07\x13\xad\x7e\x53\xea\x9e"
- "\x36\xf6\xf3\x55\x6b\x1e\x8f\x2e\x3f\xc8\xfe\xa3\x5d\x6e\xe1\xbd"
- "\x86\xf7\xf4\x1f\xba\x8e\x1b\x31\xb2\xae\x9c\x8a\x9f\xe6\xf3\x2b"
- "\x0f\xdd\x23\xf6\x07\xc9\xf1\x00\x99\x8e\xd2\x13\xaf\x36\xc1\x2a"
- "\xe2\x67\x9f\x3f\x42\x0e\x37\x59\x50\xfe\x16\xbc\x4b\x11\x77\x69"
- "\x48\x0b\xe9\xbe\xd0\x8f\xdc\x23\xd3\xf6\x97\x1b\xf9\xac\xc7\xe8"
- "\xa1\xaf\xc5\x7e\x21\x9f\xf9\x7c\x90\xca\xf7\xd0\xa7\xc2\xf4\x0b"
- "\x17\xeb\x86\x9a\x41\x64\xe6\xbd\xd0\xb7\x07\x91\xe5\xed\xc1\x1c"
- "\x0b\xe4\xa1\x9d\xc6\x5e\x68\x25\x9e\xfd\xf4\xc4\x7a\xae\x9b\xf3"
- "\x6a\xa6\x5f\x6c\xe5\xfc\x9b\xe3\xf3\x1f\xe9\xdd\x8b\x7d\x68\xa7"
- "\x09\xf9\xa6\x7e\x49\x56\x6b\x54\x7c\x1b\x4e\x7f\xd7\x7f\xf3\x44"
- "\x4a\xf1\xa1\x2b\x0e\x46\xca\x49\xf9\xfc\x3c\x7c\xdd\xe2\xa8\x88"
- "\xb0\x7f\xfa\xe4\x76\xb7\x58\xf7\x02\x99\x21\xd3\x29\xde\x79\xec"
- "\xa3\xf0\x70\x46\xed\x2c\x32\xa3\xfd\x43\x8f\xd3\xb4\x31\x8e\x29"
- "\x44\xee\xc9\x64\xfe\x77\x17\xfb\x1b\xee\x2e\x5b\xfb\x27\x32\xff"
- "\xb6\xab\xdc\xd4\x25\xec\x54\x5a\x22\x02\x82\xe3\x03\x85\x44\x98"
- "\x7d\xfc\x0f\xce\x88\x72\x9e\xb9\x9d\x6e\x3b\xb5\x94\x84\x68\xd9"
- "\x11\x11\xae\xf8\x93\x3a\x1b\xd0\xdc\x1e\x62\xff\x45\xcb\xb2\xc9"
- "\x94\x7a\x2c\x9f\x4c\xcd\xce\x6a\xf2\x4d\x0f\x51\xe9\x11\x11\x38"
- "\x38\xe3\x6b\x6a\x71\xee\xa2\x82\x56\x32\x1d\x6c\xfb\x1b\xc9\x18"
- "\x37\xab\xbe\xb1\x95\x9d\x21\xfb\xb2\x39\x9c\x76\x86\x96\x2c\xa3"
- "\x01\x4b\xfe\x4c\x56\x5f\xa0\x15\xf5\x9c\xa0\xc7\x0f\x53\x0a\xe0"
- "\x99\x96\xfe\x8d\xec\x4b\x1f\x63\x3f\xdf\x5c\xaa\x29\x23\xbb\x70"
- "\x67\x65\x74\xb9\xb3\x6c\x5d\x22\x6b\x50\xa7\x3b\x2b\xb3\xa5\x18"
- "\xf9\xdb\xf6\xd1\xc0\x56\xca\xdc\x7f\xbc\xd5\x54\x7d\x9a\x86\x72"
- "\x9b\x8e\xa1\x6d\x35\xa7\x91\x7f\xd5\x7e\xaf\x86\xb2\xb1\x65\x22"
- "\x69\xfb\x5b\x7d\xf9\x61\xd2\x00\xab\xba\x8b\x86\xd6\x74\x91\x5d"
- "\xab\xdc\xef\xe5\x72\xed\xf4\xc8\x1d\xbe\x83\x44\xa5\xcb\x44\xb4"
- "\x7b\xd5\x87\x7e\xe8\xc4\xfe\x1f\x3c\xdd\x60\xf6\x1d\x6c\xa7\xe6"
- "\x50\x17\xb5\xd0\x5f\xc9\xe7\xfa\x87\xf7\xb7\x4f\x37\xf4\xd3\x20"
- "\x04\xde\x25\x6d\xa8\x4b\xf1\x8e\xbb\x99\xcf\x2a\x97\xd3\xba\x32"
- "\xca\x28\x5e\x42\xfd\x8f\x23\x5d\xcd\xed\xeb\x03\xbe\xc8\x3f\xbc"
- "\x4b\xa4\x3f\xee\x13\xeb\xcb\x9a\x29\xb5\x25\x54\xcd\x7e\x9f\xa6"
- "\x68\xfa\x37\x36\x5f\xe8\x10\xf9\x8a\xff\xee\xd5\x2c\x81\xf0\x6a"
- "\x8d\x2c\xef\x9d\x3d\x64\xf2\x99\xcf\x92\x2f\x3f\x44\x5f\xa0\x6e"
- "\xb1\xea\x9b\xa1\xd0\x5b\xb9\x2d\xa1\x30\x9f\x77\xca\x16\x1d\xf6"
- "\xf4\x75\xf3\x68\xc4\xe6\xd3\x34\x7c\xd3\x69\xca\x12\x9d\x59\x26"
- "\xf6\xb1\xe5\xb3\xa9\x9b\x70\xcd\x68\x23\x0b\xda\xae\xfc\xb1\xd3"
- "\x74\x5f\xdb\xee\x2c\xaa\xed\xea\xf5\xb5\xed\xea\xe8\xf5\xb5\x05"
- "\x4f\xed\x62\x7f\x5b\x3f\x4d\x1b\x6f\x3d\x48\xfd\x21\x27\x4e\xe6"
- "\xef\x75\x27\xc9\xbc\xe2\x24\xd1\xcd\xe5\x26\x72\xcc\xe6\x73\x16"
- "\x8f\x5e\xe7\x43\xdf\xf0\xfd\x51\x7a\xe4\x08\xae\x19\xf8\xa5\x40"
- "\x26\xfe\xc8\xed\x6c\xd3\xf9\x18\x69\x26\xa4\xfd\x01\xd7\x54\x5c"
- "\xf7\xb9\x6b\x44\x50\x54\x7c\x94\xd3\x61\xa2\x74\xe6\x67\xe5\xdf"
- "\xfb\x51\x4e\xa7\xe7\x91\x3d\x7e\x7a\x7e\xb8\xc1\xd7\x4a\xc7\x3f"
- "\xb4\xeb\x8b\xa3\x27\x38\x0e\x55\x50\xe2\xd5\xed\x4c\xe1\x98\x54"
- "\x7a\x3a\xe3\x70\x15\xd7\x7b\x94\x1e\xe5\x7a\xac\xf8\x41\x4e\x1f"
- "\xa9\x32\xca\x76\x74\x3b\x51\xe7\xa3\x97\x21\x5d\x18\xe9\x68\xb7"
- "\x99\xdf\x7d\x74\xf4\x84\x49\xe5\xc9\x32\x01\x66\x58\x87\x0f\xd9"
- "\x7f\x68\x1a\xcb\x78\x87\xc9\x2a\x1a\x67\x8c\xa6\x9a\x37\xc5\xc1"
- "\x4d\x6f\x8a\x26\x25\x7b\x8f\xe6\xfb\xa9\xc8\xc9\x38\x62\x1c\x6f"
- "\x5a\x8d\x77\x8d\x18\x85\x98\x2e\x4d\x85\xec\x4f\xf6\x28\xec\xbf"
- "\x8b\xe3\xda\x20\x3c\x79\x7c\xc6\xd7\xfa\x7e\xd9\x81\x7e\xd0\x01"
- "\xf9\x2d\x6d\xed\xf4\xdb\xae\x40\x3f\xf7\xbf\x91\xc9\x17\x39\x4a"
- "\xa3\x32\xc9\xce\xf6\x60\xed\x9b\xc2\x8f\x6b\x80\xfd\x3b\xc1\x2f"
- "\x57\x1d\xa7\x47\xff\xf0\xe3\x4c\xca\xfc\x0f\x17\xe9\xfa\xe9\xd1"
- "\xbf\xc5\xe8\xa7\x59\xcd\xfe\x86\x18\xdd\xf4\xc4\x65\xe7\xea\xa6"
- "\xc7\x2f\x51\xba\x09\xb2\x2f\x75\x51\xd4\xaf\xd2\x1f\x8b\x26\xa4"
- "\xeb\x7e\x22\x8f\x7d\x99\x90\x1e\xd6\xd3\x9b\x13\xd2\x83\x7a\xfa"
- "\x00\x43\xf7\xb5\x30\x1e\x8b\x58\xf7\xe5\x7f\xcb\xba\xaf\x65\x86"
- "\xae\xfb\xa4\xfe\xc9\xff\xb3\xd8\x0a\x5d\xb4\x90\xf5\x4d\xfe\x7b"
- "\x8c\xbf\xd8\x4f\x06\xee\x69\x48\x7b\x81\xd3\xd6\xff\x95\xcc\xf8"
- "\x19\x7a\xef\x0b\xd6\x7b\xac\xf3\x58\xf7\x6d\x1c\x2c\x5a\x37\xbe"
- "\x29\x0e\xd7\xc8\xd8\x3a\xbf\xec\xd1\x7f\xaf\x20\x6d\x35\xd2\x5e"
- "\xc1\x7b\xd6\x83\x4c\x93\xe6\xfc\x06\x9e\x23\xb7\x81\x9f\x4b\x35"
- "\x53\x36\xad\x45\x7f\xf3\x79\xc3\x95\xa0\xaf\x35\x85\x8a\x7d\x25"
- "\x7c\x86\x35\xca\x3e\x69\x6d\x2d\x25\x6d\x2c\x77\x83\x57\x40\xce"
- "\x7c\xae\xaf\xa9\x2c\x24\x8e\xf3\xb9\x3b\xc6\xa1\x60\xf1\x03\x1c"
- "\x8f\x28\xa5\xc9\x49\xc4\x7e\xe1\xac\xb3\x81\x8b\x79\x3d\x70\x52"
- "\x31\x54\xf2\x0b\xfd\x54\xb7\x53\xf5\xf5\x13\xeb\x39\xde\xd9\x51"
- "\xfa\xe5\x0e\xcc\xf7\xc2\xdc\x36\x6b\xb4\x9c\xf8\x1c\x0c\x64\x8c"
- "\xcf\x2f\x3a\x37\x9a\x34\xe7\x7a\xe3\x2c\x0c\xc7\xbe\x43\x1e\x5f"
- "\x6b\x98\x18\x67\x3f\xfd\x32\xd4\x5c\xda\xc0\xe5\xab\x99\x36\xc2"
- "\xe3\x36\x60\xa4\x48\x18\x26\x39\x6f\x74\xfa\x29\x5f\xad\x9d\xa7"
- "\x7f\xe8\x6f\x9e\x1e\x24\xd6\xfb\xbe\x00\x60\x94\x1e\x55\x30\x00"
- "\x4b\x60\x0c\x88\x7b\xa7\xc3\x1f\xb0\x4c\x7c\x0b\xf8\x85\xdc\x5f"
- "\x7c\x2e\x92\xf7\xdb\x40\x97\x0c\xf6\x95\x57\xb6\xe8\x2f\x4f\xd4"
- "\xfe\x95\x48\x3f\xdb\x09\x7e\xfb\x65\x3b\x9f\x5b\xe2\xf3\x9c\xe7"
- "\x3b\xcb\x09\x1a\x0d\x37\xce\x73\x6a\x8b\xfe\x67\xcf\x72\x02\xb6"
- "\x7d\xb3\x49\xec\x02\xfe\xed\x7c\x9e\x13\xf8\x4f\x62\x3e\xd4\xdb"
- "\x14\x7c\xe3\x71\x49\xf3\xd1\x9c\x86\xb9\xe3\x01\xa3\xff\xb9\xbd"
- "\xdc\x16\xbc\xb3\x2b\x1b\x51\x1c\xf2\xd3\x63\x41\x7e\x8f\x34\x33"
- "\xe7\x1f\x05\x3d\xe6\xc3\x18\xf6\xc1\xd1\xa8\x69\xdd\x12\x32\x2b"
- "\x9d\xf6\x44\x1a\x97\x57\x3a\xed\x71\x6f\xaf\x4e\x7b\xfc\x63\xa5"
- "\xd3\x14\x8d\x95\x4e\x7b\xfc\x5d\xa5\xd3\x1e\xdf\x22\xf7\xc5\xa0"
- "\xd3\xf8\x1d\xeb\x35\x43\xa7\x6d\x1a\x2c\x0e\xb0\xee\xe8\xf4\x3c"
- "\xbe\xde\xd0\x6d\x6b\x90\xc6\xba\x83\x71\x54\x7a\x2a\x3f\x20\xfe"
- "\xdf\x2c\x52\x7e\x07\x7c\xef\xe4\xf3\x0b\x01\xfd\x9e\xc7\x93\x14"
- "\xa5\xe3\x1e\x6f\xeb\xd5\x71\x8f\x3b\x7b\xcb\xb2\x8e\x7b\xfc\x3b"
- "\xa5\xe3\x54\x7a\xed\xe3\xac\xe3\xf2\x03\x4c\x03\x1d\xbe\x89\xd7"
- "\xf0\xf4\xfc\xa0\xe3\xa3\xc1\x58\x1d\x17\x2f\x5f\x4f\x8c\x31\x74"
- "\x1c\xeb\x36\x3c\x4f\xf2\x53\xba\x9c\x67\xb3\x9c\x55\x81\xe6\x86"
- "\xdc\x71\x1f\x70\x9b\x39\xae\x19\xd3\x6d\xdc\x09\xea\xaf\x9f\x1d"
- "\xd2\xdb\xfd\x44\x85\xe1\xfb\xe8\xa7\xc7\xd7\x27\xb3\xa3\x7b\x63"
- "\x0f\xd2\xd5\x7c\x76\xde\x57\x7e\x94\x7c\xd5\xa2\xbc\x25\x72\x84"
- "\x0a\x4a\xa0\x2b\x52\x9f\xff\x92\xfb\x16\xf3\x8e\x9f\xf1\x95\x75"
- "\x0f\xc6\xd2\xe6\x82\x10\x5d\x84\xb9\xfa\x97\xeb\x4c\x78\xe7\x8a"
- "\x7b\x27\xd7\x18\x6e\x9e\xc7\x71\xeb\x9e\xd8\xd5\xd7\x7c\xff\xc2"
- "\xea\x9b\x3e\xb6\xef\xfa\xa6\x3f\x26\xeb\x83\x4d\x85\x39\xd0\x25"
- "\x27\x69\xba\x9c\x97\xc8\xf8\x36\x2b\x92\xc2\xaa\xd4\xdf\xf7\xeb"
- "\xe3\xfd\xbb\xdf\x53\xfe\xdf\xbe\xa7\xfc\x37\xac\x8b\xd0\x3e\x6b"
- "\xd4\x13\x0f\x67\x60\xc4\xc8\x77\x1c\xf9\x9e\xbc\x44\x5f\x8b\xf9"
- "\xd2\x3d\x4c\xce\xd1\xec\x06\x4c\xe6\xbf\xb5\xc8\x27\x63\x86\x40"
- "\x57\x8e\x5f\x4c\x1c\xaf\x25\xb6\xec\xe4\x5e\x1a\x3f\x49\xe7\x59"
- "\xf7\xcb\xf0\x55\x93\x8c\xa1\xd9\x08\x9b\x14\x63\x1c\xc7\xed\xd3"
- "\xd7\x3f\x9e\xac\x87\xde\xac\x8b\xf1\x8b\x6d\x87\x9e\xbb\x9a\xe3"
- "\x1a\xb0\x7d\xb9\x4e\xcd\x37\x2f\x87\x7e\x1e\xc4\xe7\x61\xf8\x6c"
- "\x4c\x41\x34\xcf\xd4\x28\xe3\x8b\x3d\xe9\x37\xca\xf6\xb5\xce\xc2"
- "\xf5\xea\x75\xb2\x8f\x69\xa8\xd3\xf3\x54\xa6\x51\x86\x61\xb3\x9f"
- "\x22\xc6\xe5\xab\xe5\x99\xd2\x48\x3b\xeb\xc2\xcb\x61\x8b\x0e\x52"
- "\xf5\xcc\x20\x55\xcf\x53\x13\xfd\x34\xdd\x76\xbe\xb3\x19\x7d\xb7"
- "\xef\xa9\x95\x17\xde\x3e\xd2\xdb\xf7\x94\xf7\x7b\xda\x77\xbe\x7a"
- "\x23\x17\x5e\xaf\x4d\xaf\xb7\x20\xe7\xc2\xe9\x5a\x50\xf4\xc3\xe9"
- "\x9a\xad\xd3\xb5\xa0\xee\x7b\xe8\x9a\xac\x9e\xc3\x3f\xbc\x1e\x87"
- "\x5e\xcf\x0c\x4b\xb2\x7a\x48\xfe\xf5\x79\x6e\xca\x62\xc4\xb0\xe4"
- "\x78\xae\x2a\xbe\xdc\x8c\xbc\xd8\x58\xbd\x2a\xce\xeb\x8c\x42\x23"
- "\x56\xaf\x1e\x4b\x16\xba\x7a\xc6\xf2\x82\x3a\x1e\xdf\x85\xe6\xa7"
- "\x19\x2b\x39\x3e\xea\xf8\x65\xea\x4c\xb6\x5e\xa6\xfa\x7c\x31\x82"
- "\x39\xa6\x95\x10\xf9\xd4\x58\x2d\xf7\xdb\xa1\xd7\x67\xfc\x91\xfd"
- "\xef\xd5\x7e\xe1\x8c\x23\x4a\xee\x67\x60\x8e\x38\x23\xab\x6f\x18"
- "\xfb\x76\xd5\x97\x65\xf7\xeb\xcb\xa7\xbe\xd3\x33\x73\xa8\x9f\xe6"
- "\x66\x48\x3f\xfa\xf4\xcf\x0f\x60\xfe\xa0\xc7\xd5\x7b\xe6\xed\x98"
- "\x18\x82\x18\x0b\x9f\xfe\x9d\xee\xfb\x0f\x1a\x94\x83\x96\x33\xa7"
- "\x19\x34\x30\xd2\x91\xe6\x34\x68\x00\x9b\x26\xc3\x57\x17\xe1\xb3"
- "\x39\x21\x75\x0e\x7b\xe6\x1a\x51\xb9\xaf\x4e\xc1\x9e\xd9\xaa\xec"
- "\x16\xd4\xd7\x9d\x6f\x96\x73\xa5\x32\x9e\x2b\x3d\x5d\x1c\x4c\xdb"
- "\x57\x67\xe0\x21\xe6\xdb\x4d\x7c\xde\x7b\x54\x44\xc5\xe9\x62\x9b"
- "\x80\xcf\xc6\xc9\xf7\xf3\xb3\x4c\x98\x5b\x82\x26\x33\xbf\x15\x1d"
- "\x1c\x2f\x46\xc2\xce\x00\xde\xd5\x0c\xd7\x8f\x6b\x70\x69\x16\xc7"
- "\xba\xd0\xdb\x33\xf3\x2f\xda\xaa\xcf\x0f\x68\x9d\x76\x93\x81\xef"
- "\x66\x79\x8e\xf5\x69\xb4\xbf\x40\xda\x6d\x0a\x1f\xbb\x89\x7d\xf8"
- "\xb5\xf4\x7d\xbb\xc4\x52\x3b\xed\x99\x17\x90\x73\x25\xae\x73\x14"
- "\xc7\x83\xe3\xb9\x11\xec\x11\x94\x9b\xd6\x43\x37\xc0\x15\x9d\x06"
- "\xdd\x9e\x26\x35\x16\xab\x36\x86\x96\xda\x4d\x8d\x41\x79\xc6\x8e"
- "\x86\x3b\xdc\xdf\xa9\x58\xcf\x4f\xaf\x37\x68\xd7\x83\x13\xf0\xe1"
- "\x3c\xca\xa7\xe9\xe9\x5d\x06\x4e\x52\x5e\xd3\xf9\xcc\xee\xcc\x7a"
- "\x3e\x2b\xa4\xe8\xdf\x98\x81\x3c\x87\xcf\xa5\xff\xd3\x81\x18\xfa"
- "\xa7\x32\xbf\x31\xfd\x79\x7d\x03\x74\xb9\x04\xb4\xb4\xa8\x33\x0e"
- "\x6c\xc3\x3c\xc3\x67\xe9\x33\x18\x4f\xad\xd2\xa0\x79\xbe\x59\xad"
- "\x8d\x3d\x33\x29\xa6\x1f\xd0\x5e\x3b\xdb\x67\x29\x46\xfb\xb9\x0c"
- "\xd3\x80\xe3\x3b\x72\xdd\xc0\xe7\xe2\x4e\xcf\x33\x85\x89\x6d\x5a"
- "\xa1\xce\x8f\x90\xf2\x27\x79\x66\x65\x8f\x7c\x0c\x16\xc1\x12\x87"
- "\x08\xab\xb3\xc8\xcf\x8c\xd8\x53\x16\x34\xf7\x25\xf7\xcc\x83\x32"
- "\x56\xa4\x49\xae\x25\xc0\xce\x9a\xb5\x58\x00\x37\xd5\xf7\xb3\x7e"
- "\xa1\xd2\x0a\x37\xe1\x0a\x1e\x7b\xe6\x8c\x40\xdd\x41\xb7\x8c\xab"
- "\x82\xb6\xcd\xaa\x62\x9e\x33\xf8\x8c\xd7\x1e\x95\x9f\x78\xe1\x63"
- "\xac\x47\x0c\x9a\x03\xff\xf4\x4e\x4f\xe1\x70\x03\x7f\x23\x3f\xf7"
- "\x1d\xe7\xe1\x7d\x9a\x26\x47\x58\xea\x57\x75\x4e\xa8\x30\xcf\x90"
- "\x5b\xae\x83\xfb\x99\xf5\x0b\xd3\x43\xd1\xa2\xb0\x38\x1e\x96\xdd"
- "\xa4\xe2\x53\x32\xcf\x43\x1e\x97\x84\xfb\x21\x4f\x55\x2f\x8c\x42"
- "\x9b\x7a\xd7\x83\x27\xfb\xf6\x4b\xff\x3b\xd5\x1f\x85\x51\x6e\x57"
- "\x2f\xbe\x2c\x7f\x85\x3d\xfd\xcf\xef\x42\x6e\x3b\xc7\xb3\x95\x7a"
- "\xa5\x64\x18\xe3\x1b\xe4\x38\xb1\x92\xd7\x01\x7f\x3c\xe3\xce\x79"
- "\x8c\x3e\xeb\xe5\xc5\x59\x43\x63\xe1\x08\xb7\xdd\x64\xe8\x27\xa5"
- "\x3b\x82\x98\xa7\x92\x43\xed\xb1\xcc\x9a\x18\x83\xb3\xd7\xc0\xa7"
- "\x57\x27\xcc\x72\x26\xf2\x24\xd7\xcd\xf1\xf7\x74\xd8\xac\x4b\x6c"
- "\x47\x69\xd6\x34\x85\xd7\x33\x07\xb9\x1f\xfb\x1a\xd3\x8c\x38\x9f"
- "\xaf\x2b\x1d\x82\x7e\x9e\xfd\xe7\xd7\xd5\xd9\xa1\x90\x8a\xe5\x38"
- "\xeb\x2f\xc2\xb4\x85\x69\xc5\x6b\xe8\x41\x19\xa3\x43\x9e\x2b\x9f"
- "\x25\xcf\x98\x0f\x2c\xde\x22\xe3\xc7\xea\xfe\x80\xc1\xa6\xe2\x88"
- "\xdc\x6b\x70\x97\xf0\x39\xdb\x08\xcf\xef\xa4\xbf\x5b\x63\x49\x84"
- "\x1e\x0e\xb3\x4c\xcc\xce\xe2\xf3\xf3\x21\x29\x4b\xb3\x47\x1b\x67"
- "\xe6\x39\xa6\xa5\xe8\xcc\x27\xe8\xa1\x54\xb6\x8b\x1c\x6e\x8e\x77"
- "\xf0\x2c\x9f\x1f\x22\xbd\x7f\x69\xad\x49\x1c\x52\xf2\x3f\x7b\x99"
- "\x8c\x23\x28\xf7\xae\x8e\x42\x27\xa4\xfe\xe3\x28\xcd\x7e\x43\xad"
- "\xf5\x18\x3a\xea\xd9\x01\xbc\x7f\xe5\xd7\x61\xa0\x2e\x8c\x7f\x33"
- "\xcd\xe7\xea\x92\xd9\xcb\x8c\xf9\x0a\x9f\xb9\x53\x7b\x61\xbd\xf0"
- "\xfc\x34\xbb\x94\xaf\xbd\x7d\xf0\x7b\x86\xd5\x7e\xae\x5e\x78\x96"
- "\x0c\xd9\x2b\xbe\x86\xcf\x6d\xcf\x6a\xe2\xfa\xfb\x1a\x2f\x84\xfb"
- "\x31\xee\x27\xcb\x31\x47\xf2\xbe\x49\xbe\xb7\xf6\x6c\xa1\xd1\x06"
- "\x83\x26\xaa\x0d\xcf\xee\xeb\x48\xdf\x6d\x89\x69\xfb\x3e\x49\x8b"
- "\xde\xf7\x67\x62\x68\xc3\xcf\x21\x35\xae\x3d\xbb\x07\xfc\x51\xaf"
- "\x78\x4d\xa5\x41\x76\xb6\x89\xa5\xd0\x05\x12\xc7\x39\x64\xc8\x3a"
- "\xf2\xc2\xfe\xfb\x76\xa8\xda\xe3\x7a\x16\xed\x7f\x56\x8f\x9b\xf0"
- "\x6c\x05\xe3\x92\xb4\x9d\x71\x38\x3a\x8b\xd8\xbe\x50\x71\x14\x9c"
- "\x2f\x30\xbe\x8e\xeb\xb9\x8f\x9d\x77\x48\x1d\xce\x31\x15\xba\x9d"
- "\xfd\x42\xdd\x59\xd4\xd1\xed\x84\x5e\xc8\x32\x75\x7a\x9c\xd0\xff"
- "\xa7\xc2\xaa\x4e\xe7\x0c\x03\x57\xc6\x0d\x76\xb3\xa5\x53\xcc\x49"
- "\x4e\x5f\xae\x57\xc6\x79\x72\xf6\xc7\xcf\x82\xdf\x45\x3f\x24\x0e"
- "\x13\xec\xf2\x40\xb0\xb2\x61\xbd\xb6\x50\x1c\xe0\x78\x62\x98\x7b"
- "\x04\xd6\x81\x77\x07\x2e\xf7\xc2\x16\x7f\xd2\x54\xb0\x98\x72\x31"
- "\x47\x26\x71\x56\xe4\x6c\xd6\x70\x5d\x28\x46\x73\xbc\x6e\x3c\x67"
- "\xeb\xcf\x23\xf8\xb9\x63\xa1\x98\xde\xe9\x99\x63\x33\xf6\x04\x55"
- "\x2c\x9c\x39\x8e\x9e\xf8\x41\xa9\x4f\xf0\xf9\x21\x8e\x33\xa5\x61"
- "\xee\x13\xe0\x7a\x0b\x78\xfe\x8a\xfa\x90\x0f\xf2\x3f\x43\xb6\x33"
- "\x98\x7a\xd3\x20\xfc\xb2\xfa\xd8\x3b\x0d\x30\x5e\x1d\x69\x0d\xeb"
- "\x0d\x5c\x07\x86\x72\x4d\x3f\x10\xb7\x9d\x06\x6e\x48\x3f\xb0\x4e"
- "\xa5\x47\x38\xde\x21\xfb\x36\xe2\xfd\x41\x03\x57\x03\x07\xae\x8f"
- "\xcf\x6b\x8a\xf4\xdd\x76\x8e\x35\xc3\xf5\x05\x97\x72\x7c\xdf\x39"
- "\x61\x03\xdf\x1f\xca\xc7\x65\x35\x42\xf0\xd8\xc9\xba\xd7\x31\x84"
- "\xa8\x25\xc4\xfa\xe4\xb9\x49\x8d\x35\x21\x5e\xdf\x1e\x82\x3a\xae"
- "\xe8\x10\x4e\xd2\xba\x9d\x49\xfb\x97\xcb\x20\x7f\x85\xd4\x0d\xab"
- "\x76\x5f\xa1\x89\x89\xd0\x11\x28\xd7\x3d\x91\xd7\x96\x20\xb3\xcf"
- "\xed\x69\x2a\x0d\xf0\x19\x4b\xe8\x9b\xe7\xf6\x20\x8f\x9d\x6d\x2c"
- "\xcc\xaf\x58\x67\xa5\xb2\x5e\xf2\x2e\x1c\xcd\x30\x3e\x36\xbb\xc8"
- "\xdc\xe4\xfa\x61\xdf\x01\x00\xdc\x76\x25\x37\xcf\xb5\x1b\x76\x09"
- "\xee\xc3\xf1\xfb\xdd\xcf\xf9\x13\xe7\x66\x4f\xbf\xf8\x62\x49\xc1"
- "\xbc\x59\x7c\xc9\xba\x6e\xc1\x8d\xe9\xb1\x73\x70\xd6\xc1\x2a\x3e"
- "\xc2\xf3\x36\x5e\xef\x7a\x7d\x90\xb1\x7f\xfb\x7c\xcf\xf9\x2f\xdd"
- "\x4f\xfc\x6e\x9e\x4b\xb0\xcd\x8d\x77\x45\xbf\x2b\x5d\x26\x6d\xa0"
- "\x2f\x2d\x64\x4a\xac\x6f\xf6\xcc\x92\x99\x45\x77\xf2\x4e\x4d\x7a"
- "\xb2\x7a\xca\x13\xea\x69\xe8\xa9\x47\xe9\xc0\x90\x89\xf3\x55\x76"
- "\xef\x12\x69\x6d\x79\xea\x8c\xee\xf3\x47\x8c\xb5\x94\x3e\xfc\xeb"
- "\xf2\xa3\xab\xbe\x60\x7a\x73\x4c\x29\xd3\x47\x4b\x5a\x4d\x6c\xcb"
- "\x94\xe1\x9e\xe7\xb4\x72\x6d\x46\x8f\x53\xb4\xff\x74\x2b\xc6\x98"
- "\xa2\x6c\x51\xb9\x9b\xd7\x75\xb3\xfa\x9a\xc7\xc6\xfa\x26\xb0\x2f"
- "\x5b\x1b\x15\x4d\xec\xd3\x8f\xa0\xe2\xf3\x56\xa5\x63\x8a\x36\x35"
- "\xd9\x89\xf1\xf8\xf5\x51\x2a\x7a\xdb\x6c\xc7\x38\x32\x84\xfe\x05"
- "\xf7\x9b\xb8\x2c\xbf\x8b\xeb\xe7\xab\x4e\xd4\x99\xc1\x85\xe0\xc6"
- "\x14\xa1\xfe\xc8\xac\xdf\xa4\xe2\x67\x12\x29\x72\x97\x2d\x15\x14"
- "\xee\x7f\x91\x99\xac\x03\x33\x2c\x57\xff\x68\xa8\xfd\xee\xbb\xc6"
- "\xe4\xb8\xcb\x4a\x21\xbd\x91\xb0\x55\xc4\xc6\xd5\xfa\x2a\xfc\xc8"
- "\x8d\xe5\x24\xfd\x2c\x2a\xbf\x0a\x27\xc3\x75\x8d\x47\x14\xf3\x99"
- "\x66\x2d\xbd\xdb\xe1\x5e\x40\xa6\x0f\xba\xfc\x26\x8e\x1d\xcf\x36"
- "\x16\x7f\x5b\xe0\x28\xbd\x70\xe3\x17\x48\x43\xfb\x5d\xa2\xa2\xdb"
- "\xa1\x6c\x93\x17\xe6\x68\xab\xba\x1d\xbd\xf0\xcd\xc4\xf0\xdd\x6f"
- "\x93\xa9\xbe\x2c\x60\xf2\x99\xef\x22\x9f\x23\x44\x5f\xe0\x3e\x29"
- "\x2d\x51\x27\xdb\x3b\x0c\xa3\xd6\xa3\x55\xb8\xbf\x23\x93\x7e\x2e"
- "\xd1\x74\x92\x5e\xd8\xb2\xab\x8f\x72\x7c\x0e\xb8\x23\xbd\xe1\xd1"
- "\x4e\xcf\x0b\xe8\xff\x7b\xcc\xfa\x78\x07\xbd\xfc\x02\xf8\xbf\x48"
- "\xea\x7f\xbc\x7f\xa4\x43\xc6\x16\x9e\x4b\x46\x9e\xe4\x63\x1e\xaf"
- "\xcd\x0a\x2f\xf7\xab\x38\xfb\x4d\x80\xcf\x3c\xf4\xe1\x1f\xd1\xdf"
- "\xe7\xba\x95\xf7\xa8\xfa\x0d\x0c\x53\x86\xfb\x8c\xe8\x8e\x7a\x28"
- "\x13\xec\x6e\x8a\x62\x4e\x1d\x39\x2b\xf2\x9b\xdb\x4f\xcb\x58\x97"
- "\xac\x3f\xde\x9f\xfd\x7b\x93\x2f\x7c\xca\xeb\x5b\xa9\x51\x0b\x6c"
- "\x0f\x5f\xcd\x29\xaf\x8a\x89\x19\xa5\x66\xfa\x2b\x35\xbb\xfe\x77"
- "\xb9\xaf\xfc\xaf\x48\x17\xe5\x4c\xe7\xee\xb3\x62\x9a\xcf\xfc\xbf"
- "\x88\xbf\x7d\xc2\xba\x10\x74\x77\x9c\xa4\xb9\xff\xb6\x1f\x70\x3e"
- "\xf8\x2f\xc0\x92\xb1\xb4\xc6\xd2\x17\xb8\x47\x9b\x0e\x1b\x7a\x32"
- "\x69\x0c\x92\x14\xef\x1a\xab\xeb\x49\x93\x06\x9d\xcb\x31\xcf\xa0"
- "\x6b\x47\x73\xbb\xf0\x9c\xcd\xcf\xb8\x8e\xe0\xab\x75\xb9\x77\x93"
- "\x35\xf2\x24\xeb\xe0\x7c\xd6\xaf\x48\x9f\x56\x7b\x56\xea\xe4\x3c"
- "\xfd\x79\x92\xfe\x3c\x51\x7f\x1e\xaf\x3f\xe7\xea\xcf\x63\xf8\x59"
- "\xe9\xee\x17\x9d\x3d\xe3\x8a\xa9\xff\x21\x3c\xbb\x8c\xbe\x00\x3e"
- "\x03\xac\xae\x65\x72\x0c\xd0\xf1\x18\xad\xe3\x95\xad\x3f\x1b\xf8"
- "\x5c\x65\x8d\x2c\xfb\x9f\xc2\x27\x1c\x8f\x4f\xb1\x25\x06\x1f\xb2"
- "\xba\x72\x7f\x08\x3e\x36\x2b\xc7\xe7\xff\x6f\xe0\xc3\xb8\x70\x1a"
- "\xea\xaf\x48\xc0\xa7\xda\xc0\x27\x29\xbf\x2d\x14\x01\x1e\xff\xe6"
- "\x5f\x21\xe3\xfd\xf6\xe7\xb1\xad\xb6\xcb\x88\x5f\x57\x7c\xf8\x7c"
- "\xf1\xeb\x20\x0b\x76\xe4\x41\xfb\x8b\xeb\xf5\x71\x7e\xaf\xb2\x05"
- "\x5f\xca\x30\x7c\x8a\xd0\xd6\x1d\xeb\x54\x5b\x77\xae\xe4\x18\x6e"
- "\x8b\xe9\x4a\xb7\x4b\x04\x30\x37\xfb\x8a\xe7\x0f\xb1\x70\x8b\x4a"
- "\xe6\xcf\x7f\xe1\x4e\x47\xd1\xcc\xb9\xb3\x1c\xd7\x15\x3a\xe6\x3b"
- "\xe7\xcc\x2e\x99\x15\xbf\xcf\x6e\xd3\xbf\x97\x22\xcf\x0f\xb0\xbd"
- "\x2d\xe7\x5b\xe0\x7f\xd6\xdb\xca\xe7\xf3\xa5\x66\xe1\x79\x29\x87"
- "\x75\xfd\xe6\xd7\xc8\xcc\x67\x8a\x81\x4f\x8d\xa1\xe3\x8d\x39\x12"
- "\xeb\x78\xa4\xc3\xfe\x9b\x3b\x3a\x26\x9d\xf3\x1e\x30\xd2\x18\xbe"
- "\xae\x9b\xfa\x1f\xa5\x97\xe6\x70\x9d\x49\x69\x78\x56\xd4\x61\x7c"
- "\xe5\xef\x0d\x98\xa0\x53\x04\xc7\x63\xe2\x73\x79\x28\x27\x8e\xd1"
- "\xbc\x2b\x58\xf7\xf2\x37\x79\x94\x5d\x2f\x80\xe3\xbc\x91\x28\x53"
- "\x8f\x34\xf3\x5a\xe4\xc5\x5c\x81\xe3\x28\x71\xde\x09\x1c\x1f\x01"
- "\xe9\x16\x3d\xce\x14\xa7\x3d\xc6\xf1\x0b\x90\x66\x8b\x49\x7b\x81"
- "\x63\xa5\x23\xcd\xa1\xc3\x5b\xc6\x74\xc6\x73\xae\xbe\x96\xc2\x79"
- "\x5e\xd5\xeb\x2d\x8f\xc5\x99\x3f\x9e\x71\xeb\xcd\xd9\x8e\x69\x0f"
- "\xff\x64\xec\x5d\xcf\xbc\x38\x77\x76\x3a\x49\xb2\x67\x61\xb8\xcc"
- "\xbe\xd5\x75\xe3\x9d\x8e\xe2\x59\xb3\xe6\x39\x16\xcd\x9a\x5b\xe2"
- "\x98\xb9\x68\xe6\xe2\x74\x9a\xfd\xe2\xbc\x67\xf8\xf4\x3d\x77\xcb"
- "\xfc\x82\x67\x66\x3f\xcb\xce\x10\x2a\x77\x7a\xdc\x38\x3e\x8d\x75"
- "\x9b\x1e\xaf\xe2\xc0\x3a\xb6\x35\xd2\xf6\xd6\xe1\x9e\xe3\x38\xd9"
- "\x71\x6d\xc2\x6f\x2f\x7e\x0d\xf8\x1d\xc6\xef\xd0\x71\x72\x4d\xc7"
- "\x75\x4f\xa7\x67\xfe\x18\xc3\x9e\xe8\xe5\xa1\xf9\x79\x06\x0f\x61"
- "\xfc\xdf\xa3\xc6\xb7\xf9\xe5\x2d\x11\x29\x3f\x3d\x3c\xb5\xee\x6c"
- "\x2f\x4f\x71\x1c\xca\x16\xf6\xf5\x59\x88\xf7\xe0\x61\xd0\x9f\xe7"
- "\xd5\x69\x4c\xb7\x63\xb4\x70\x01\xe6\xe3\x07\x39\x86\x0a\xae\x4d"
- "\xe0\x97\x83\x2a\x6e\xc9\xfc\x08\xf2\x0d\x43\x1d\x7b\xf5\x3a\xd4"
- "\xf3\x60\x71\x80\xbf\x9d\x71\x54\x7f\x66\x58\x80\x31\x80\xef\xf9"
- "\xaa\xef\xa9\x59\xd9\x6f\x52\xcd\x1b\x8d\x77\x25\xdb\xf5\x3a\xbc"
- "\xa0\x45\xf9\x66\x8f\x5c\xfb\x93\xf3\x2b\x5e\x3b\xb4\xa6\xdc\x2d"
- "\x80\xcf\x29\x2d\xf5\x09\x19\x7f\xdc\x57\xde\x05\x1d\x71\xdb\x6d"
- "\x3e\x97\xcc\x9f\xc2\x6b\x8b\x53\x8a\x85\xc6\xf1\xa9\xb5\xd4\xe7"
- "\x5b\xb9\x9c\xb0\xec\xad\xd3\xd6\x0e\xc8\x55\xb6\x00\xc7\xa3\x2b"
- "\x29\xd7\x61\x86\x99\xb6\xc7\x69\xfe\x2d\x6a\xae\xe6\x9a\xae\xec"
- "\xb3\x92\xd5\x86\x0f\x1e\x64\x34\x0b\xcf\x35\x86\x0e\xf0\x53\x89"
- "\x53\xf7\x97\xf2\xaa\xf6\x97\x1c\xd6\x9f\x1b\x74\x1c\x53\x38\x46"
- "\x06\xf0\x3f\xc4\x7d\x87\x79\x6f\x03\xee\x0f\x83\x3e\x07\x15\x7d"
- "\x4a\xa4\x0d\x08\xbb\x86\xdf\x1f\xe6\xef\x8c\xe0\xdd\x61\x15\x7f"
- "\xa2\x24\x83\xdb\xdc\xeb\x53\x59\x93\x0b\x5c\x07\xf0\xde\x23\x64"
- "\xa9\xc1\x77\x96\xe5\xb3\x84\x63\x59\xee\x32\xf4\x0e\xeb\x99\x82"
- "\x28\xe4\x54\xda\xdd\x0b\xc6\x1b\xfa\xa6\x97\x0f\x16\xe4\x27\xd3"
- "\x25\xc9\xfa\x5d\xd1\x7f\xc1\xef\x84\x67\x5e\x0d\x70\xda\x25\xfb"
- "\x80\xe3\x74\x9e\xed\xb1\xef\xbb\x95\x8e\x5c\xb0\xb3\x67\x2e\xa2"
- "\xe3\xc1\x31\xbf\xfd\x8c\x5b\x97\xdc\x0f\xd6\xf5\xc6\x82\xc3\x86"
- "\xde\x30\xe0\x58\x53\x84\x66\x75\xe1\x5f\xc5\xee\x30\xaf\x9d\xf3"
- "\x78\x29\xed\x11\xc0\x19\x78\x46\x9d\x8d\xd2\x2a\x77\x43\x27\x2e"
- "\x58\x0d\x1d\x63\x96\x36\xa7\x67\xde\x07\xbd\xba\x68\x61\x56\x2c"
- "\x4c\x61\xd9\x1d\x66\xb8\xac\x8f\xd8\x26\x29\x88\x9a\x39\x3e\x49"
- "\x58\x1f\x5f\xa0\x83\x17\xe6\x1b\xb8\x82\x86\x07\x0c\x7c\xf5\x6f"
- "\x3c\x41\x57\x2d\x68\x98\x1a\xed\x66\x1f\xe1\x26\xd5\x9f\x2e\xa9"
- "\x6f\xf0\x6e\x27\xca\x56\xf9\xe9\xa5\x80\x2e\x43\x07\x51\x7e\x67"
- "\x63\xd9\x78\xe4\x59\xb8\x4b\xf7\x73\x3d\x84\xfe\x3d\x1c\xc3\xfb"
- "\xdb\x63\xd6\x02\x0e\xab\x3e\xbc\xab\xfc\x28\x2d\x0c\xc6\xa4\xeb"
- "\x7d\xdb\x98\x77\x94\x16\x6d\x57\xf3\xea\xdd\x0d\xaa\xfc\x22\x75"
- "\x76\x45\xc7\x91\x75\x01\x9f\xe3\x62\x19\x97\xb4\x97\x7d\xbc\x28"
- "\xcb\x18\x2f\x00\x6b\x8f\xa4\xf9\x60\xb1\x97\xe9\xa4\xe2\x40\xcc"
- "\x6b\x51\x74\x5a\x94\x17\x47\x7b\x1e\x37\x51\x0f\xd3\x69\xe0\x72"
- "\xa1\x0d\x0c\xa5\x88\x82\xc5\x66\x62\x79\x61\x19\xe7\x3d\x23\xf0"
- "\x87\xb4\xab\x14\xdd\x16\xad\x37\xe8\x66\xf4\x1d\xd3\xc9\x4f\x8b"
- "\x88\x69\x1b\xdf\xc6\xfe\x87\x8e\x1a\x6d\x07\x4d\x79\x1d\x1c\xcf"
- "\xf5\xba\x5c\x1c\xf4\x0e\x61\x9f\x82\xf9\xef\x36\x9a\x7f\x42\x8d"
- "\xae\xd1\xa4\x68\xbb\x28\x08\xda\xe6\xc5\xcc\x1b\x0e\x30\x7d\x59"
- "\x56\x80\x67\x48\x8f\xc9\x74\x40\xf9\xb7\xcc\xaf\x87\xbd\x1f\x92"
- "\xb2\xbc\x50\xc6\xce\x60\x19\x38\xc4\x34\x62\xbd\xc8\xb2\xc4\x32"
- "\xc0\xf2\xa4\x68\xe4\x9a\x14\x43\xa3\x26\xa6\x8f\x4e\xa7\x3d\x09"
- "\xba\x7c\x96\xa3\x68\xac\xd2\xc5\x8e\xac\xeb\x0a\x47\xc9\x00\x28"
- "\x8e\xfb\xc6\xdd\xe9\xc8\x1b\x7b\x9d\xcb\x39\x62\x8a\xba\x8c\xcb"
- "\x9b\xc4\xd7\xf4\xf8\x79\x97\x03\xf5\xec\x89\x9f\xbb\x95\xe5\x2a"
- "\xfd\xe1\x3a\xe8\x4f\xe9\xbf\x83\xd3\x39\x1e\xe9\xba\xb9\x44\x51"
- "\xe0\xbd\xf6\x38\xfa\xd4\xb2\xbb\x8a\xe3\xdf\x4e\xc5\x9c\x71\xca"
- "\x19\xf1\x5d\x2d\xde\x6d\x46\xfa\xc0\x62\x8e\x9b\xff\x77\xa1\xa5"
- "\xed\xae\xe2\xb9\xbd\xa8\xdc\x96\x1f\x4c\xfb\x2a\x8c\x9f\x37\x98"
- "\xd6\xe0\x9c\x70\xa3\x5b\x74\x7a\x16\x0f\x37\xda\xc5\x6b\x00\xa0"
- "\x53\xd5\x54\x97\x88\x32\x8d\x0a\x5c\x1c\xa3\x1a\xb0\x53\x79\x0d"
- "\x60\x31\xda\xff\x42\x85\x9a\x5f\x2e\x06\xff\xcf\x6b\xd7\x75\x59"
- "\x1e\x9e\x61\xff\xdd\xbe\x4b\xf6\xab\xc7\x2e\x63\x5b\x6b\x2b\x6e"
- "\x7a\x08\xf3\x01\xaf\x01\x13\xb0\x2e\xd2\x63\xf8\x49\x78\x3f\xd4"
- "\xdf\x52\x5b\xf5\x51\xbd\x35\x45\xc5\x0b\x84\x8c\x97\xd7\x9a\xb4"
- "\xfc\x1e\xff\x09\xbc\x1b\xb8\xdc\xc6\xfe\x15\xf9\xe0\xbd\x72\xce"
- "\x63\xbc\x5b\xe7\xd1\xfc\xeb\x4c\x5a\x18\xfd\x68\x53\xf6\x73\x3b"
- "\xeb\x4f\xcc\x2d\x97\x64\x1a\xe3\x9a\x1c\x0f\x4d\x54\xae\xe6\x33"
- "\x4b\x6e\xe7\x72\xa7\x3d\x66\xcc\x19\x5c\xf5\xd7\x64\xca\x39\x4a"
- "\x58\xf3\xa4\x90\xf2\x71\x5d\x92\x66\xe8\x58\xde\x47\xb3\x2e\x17"
- "\x41\x5e\x47\xb4\x46\x44\x50\xc6\x60\xe7\xb1\x83\x8e\x93\xaf\xb4"
- "\xb3\x9c\x7d\xec\xa4\x0d\x84\x7a\xd5\xb8\x11\x55\xe3\x06\xea\x0f"
- "\xa6\xde\x34\x03\xe3\x43\xca\x71\x5a\xdc\xca\xf8\x33\x6d\x78\x3d"
- "\x5e\x03\xad\x7c\x3c\x4e\x32\x7d\xd2\x3f\x1e\xce\xbe\x11\xdc\x56"
- "\x6b\x04\x6d\x8e\x6d\x97\x49\xf3\xaf\xf5\xa0\x5d\x26\xb4\xcb\x75"
- "\x82\x65\x26\xcc\x3e\x2b\x90\xb7\xc1\x32\xce\xb1\x9c\x3f\x2f\x09"
- "\xc7\xb6\x91\xf5\xbf\x6a\xc3\xd2\x2b\x92\xb5\x51\x98\xb8\x8d\x92"
- "\x06\x27\x74\x79\x93\x78\xb2\xfe\x68\xa7\x25\x3b\x07\x2e\x67\x5f"
- "\x91\xdd\x55\xd0\x6f\xe3\xb8\x0f\x31\x7e\xae\x67\x3c\x93\xf5\x17"
- "\xc3\x53\xb0\x96\x36\x58\x97\x97\xcf\xe8\xf4\x2c\x5d\x99\x9c\xde"
- "\x4b\xb7\x9f\x9f\xde\x4b\x17\x73\x79\xc6\x83\xf7\x00\xac\x11\x4c"
- "\xd6\xc1\xb7\x98\xaf\x55\x24\xab\x77\xe0\xf2\x3a\xc6\x2b\xe9\x3b"
- "\xc1\xf2\xa2\xeb\x20\xf0\xa1\x80\x9c\x08\xd6\x49\x9d\x9e\xd2\x9e"
- "\xf5\x2f\x6b\x8a\x23\x55\xea\x07\x93\x58\x9f\x0c\x86\x75\xf9\x7a"
- "\xde\x0b\x19\x87\xfa\x93\xbe\xd7\xf8\x9b\x0e\x15\xbb\xcb\xb5\x15"
- "\x3f\xbe\xc6\x9a\x42\x77\x07\x53\x7f\x9c\x6e\x75\x45\x86\x33\x0d"
- "\x01\xd3\x05\x39\x1e\xc9\xf3\x54\xb5\x76\x51\x0a\xfb\x7f\x8d\x8c"
- "\xc7\x1d\x4c\xdb\x5d\xae\xf6\x16\x4a\x31\xfe\x55\x4d\x32\xd6\x6f"
- "\xf1\x0c\xfd\xf2\x75\x91\x92\xcb\x2b\x37\x88\x55\x0d\xa3\x35\x8f"
- "\x55\x38\x96\x58\x61\x47\x2e\x7b\x44\x13\x1c\xe7\xbf\x61\x74\x2f"
- "\x9f\x28\x3f\x1a\x83\x4f\x50\x3e\x92\x9c\x07\x96\x5d\x75\x7e\x1e"
- "\x28\xfd\x96\xdf\x33\xdd\xd5\x5c\x65\xd9\x78\xc3\x4e\x11\x2b\xae"
- "\xdc\xe0\x28\xe3\xfa\x4b\x5b\x55\xdd\x4c\x93\x5c\xde\x57\x98\x04"
- "\xba\x94\x23\x6f\xb1\xa1\x07\x98\x5f\xac\x51\xfe\x06\x02\x49\x9e"
- "\xc6\x3b\xd8\x3f\xc5\x7e\xb5\x56\xda\x10\x94\xdf\x0b\xf4\xb8\x9c"
- "\x41\xb7\x73\x23\xc6\x61\x0a\xa5\xed\x86\x5e\x59\xb6\xcb\x4f\x5e"
- "\x19\xcf\x08\x63\x70\x08\x30\xc2\x55\xca\x4f\xd6\x22\xe3\x08\x41"
- "\xa6\x39\x76\x10\xcb\x35\xd2\x32\x81\x37\xc7\x11\xc2\x7c\x67\x59"
- "\xa0\x67\x5c\xf2\xe4\x42\x57\x08\xf9\xed\x1d\x8c\x4b\x43\x3b\x40"
- "\xbb\x37\x4c\xda\x8e\xb3\xa3\xec\xc4\x6d\x3e\xbb\x62\xc8\x8e\x5f"
- "\xdf\x4c\xe6\xff\xc7\xfe\x34\x15\xdf\x4a\x99\xcb\x7f\x62\xa6\xff"
- "\x93\x43\x26\xa6\x83\x9f\x96\x85\x15\xed\xca\x72\x8c\xfe\xf1\x53"
- "\x69\x9d\xd4\x9d\x2b\x9e\x08\x4c\x8d\x88\xef\xd4\x7a\x68\x19\xf4"
- "\xdf\x73\x87\xd4\x7b\x97\x37\x71\x0d\x88\xed\x79\xc7\x9c\xf9\x8e"
- "\xc2\x17\x17\xcd\x1d\x36\x2c\x6e\xae\x64\x96\x67\x63\x3c\x65\x45"
- "\x6a\x3c\x2d\xeb\x89\x7f\xc4\x76\x09\x9e\xd1\x7e\xd7\x39\x31\xce"
- "\x27\x15\xe8\xee\xcf\x05\xd9\xd4\x7b\x7f\x0b\x4d\xba\x25\xe6\xf1"
- "\x36\x9a\x74\xeb\x6d\x05\x0f\xcd\x9a\x59\xb8\x38\x26\xf5\xf6\xd8"
- "\x75\xbd\x75\x1b\x50\x77\xea\x90\x7b\xa1\x2b\x52\xa6\x2c\xe5\xb1"
- "\xc5\xfd\x46\x59\x44\xfc\x03\xfa\x3a\x07\x32\x56\xd0\x5c\x12\xa1"
- "\x66\xe8\x32\x71\x25\xeb\xf0\xfe\xea\xcc\x1f\xec\x29\xf0\x96\x15"
- "\x6d\x0f\xc2\xae\x3b\xc3\xeb\x33\x28\xf7\x69\x4b\x35\xc7\xfa\x6d"
- "\xd0\xe3\x98\xbb\x4b\x90\x7e\x09\xae\x9b\x70\xbd\x08\xd7\x2d\x8e"
- "\xb9\x98\xf7\xb0\x8f\xf5\x42\xf6\xb1\x76\x4b\x5f\x97\x9b\x43\xe5"
- "\xc4\xbe\x22\x78\x3f\x82\x6d\x10\x3f\xb9\xf9\xfb\x60\xfc\x4d\xba"
- "\x5c\xa4\x2d\x70\x3c\x47\xd9\x7c\x15\x72\xff\x08\x33\xb0\xca\x86"
- "\x62\xb1\x31\x9f\xbf\xa5\x35\x1c\xe9\x7f\x49\x4d\xf9\x92\x52\xed"
- "\xfd\xa3\x9d\x1e\x77\xab\x9f\x9e\x5f\xcd\x74\xea\xeb\xdb\x9f\x4c"
- "\xe7\x44\xfb\xb0\xd7\x36\x5c\x45\xd2\xbe\xd5\xed\xb9\xcd\x72\x5c"
- "\x28\x1f\x11\x63\xd3\xf1\xfe\x65\xba\xb2\x4f\x44\x54\xd9\xa7\xe5"
- "\x93\x0c\x39\xc0\x7d\xbe\xc1\xa7\x71\x71\xd7\xe6\x96\xcc\x9a\x37"
- "\xab\xd0\x71\xdd\xfc\x74\x8a\x89\xba\xe6\x9c\x35\xd7\x31\x6f\xd6"
- "\x4b\x0b\x66\xcd\x97\x11\xd3\xf8\x6d\xdc\x98\x9f\x29\xd2\xff\xb5"
- "\xde\x38\x0f\xe4\x18\xc2\xf4\x2d\xdf\xc7\xb1\xba\xc4\xaa\x4f\x86"
- "\xb3\x4f\x87\x9a\x6f\x74\xe7\xc4\xcf\x37\x3c\x79\xca\xce\x6b\x98"
- "\xa1\xe6\x3a\xcb\xbf\xe6\xe7\xa3\xb4\xdc\xd9\x1b\x17\x7c\xf9\x15"
- "\xa0\xa5\x49\xd1\xcd\x72\xac\xd3\xb3\xdc\x66\xd0\xcd\x4f\x9e\x6a"
- "\xdd\x96\x6a\x97\xfa\x03\x63\x2c\xf4\x5f\xdc\xf8\xaa\xbe\xf9\xb9"
- "\xdc\x0e\xde\x48\x95\xeb\xbd\x69\x0d\x85\x5c\x17\xc3\x3c\x86\xf2"
- "\xe8\x9f\x19\xd0\x9b\xac\xdf\x2a\x0c\x78\xa8\x93\xb8\x3e\x7d\x1e"
- "\x74\x39\xca\xcb\xfd\x70\xad\xa2\xa1\x90\x75\x0a\xc7\x96\xd0\x2a"
- "\x01\x47\xee\xe3\x79\xaa\xd9\xc6\x94\xb1\xe9\x01\x8b\xd7\x69\xa1"
- "\x1b\x4a\xf8\xfb\xb0\x9c\xa6\x62\x86\x95\x17\xf2\xda\x30\xea\x9a"
- "\x0e\xfc\x0f\xf5\xfa\xbc\x7b\xaa\xd9\xee\x64\xb8\x7e\x5a\x5e\xc5"
- "\xf0\x54\x4c\xb4\xe5\x21\x3f\x95\x45\x7a\xed\x27\x4f\x4e\xcc\xbc"
- "\x0c\xf8\x28\x3c\x43\xc0\x45\xc6\xdf\x54\x3e\x88\xb2\xdd\xac\x3f"
- "\xab\xf4\xb6\x1b\xed\xe9\xf4\x78\xa0\xff\xdc\x01\x63\x6f\xdd\xaf"
- "\xb7\x9b\xf1\x63\xdc\x63\x71\xd6\xf1\x2d\x66\x7c\x51\xae\x34\x46"
- "\xb6\x79\x5d\xa6\x1f\xd2\xd6\xf7\xfa\x36\x97\xb7\x26\xea\x8d\x17"
- "\xe7\x3a\x8a\xe6\xcc\x7d\xbe\x60\xd1\xcc\xe7\x67\x15\x2c\x28\x1e"
- "\xe1\x58\x30\xf7\xe9\xa2\x17\x9f\x79\x9e\xb9\x66\x7e\xc9\x82\x67"
- "\x9e\x77\xb0\x66\x29\x18\x3f\x69\x52\xc1\xbd\x8f\x3c\xfc\x58\x3a"
- "\xdd\x3b\x13\x69\x98\xf9\x4f\xca\x1e\xa1\x5e\x3d\x34\x61\xdc\xa3"
- "\x05\xe3\xa6\x3e\x32\x65\x9a\x3c\x0c\xd1\xf3\x7e\xfc\xdc\xe4\x19"
- "\xe2\xf8\xd0\x06\x5e\x9a\x8e\xfe\xed\x77\x94\x7e\x95\xa9\xe2\x68"
- "\xaf\x18\x1f\x1f\x47\x7b\x05\xe6\xb2\x2b\x60\x65\xae\xc0\xd8\xbf"
- "\xf2\x00\x7e\x98\xa7\xfe\xca\xa2\xf8\x2b\x6d\x6a\xa7\x67\x45\x71"
- "\x2f\x7f\xfd\x2a\x53\xee\x8f\x57\xcb\x7d\x67\x13\xde\x41\xff\x97"
- "\xaf\x8f\x7d\xd7\x3b\x9f\x5c\xb1\xa3\x67\x3e\xd9\xa3\x53\x56\x1c"
- "\x36\xe6\x96\x48\x73\x62\x5e\x99\xc6\xf3\x4a\xb5\x9e\xf4\xab\xcb"
- "\x24\x4f\xf5\x29\xdf\x16\x32\xe6\x95\x2c\xdb\xbc\x4f\xac\xe6\x1f"
- "\x2b\x6d\xb1\x32\x2e\x63\x37\xea\x32\xce\xe5\xe4\xfa\x9d\xa5\x7b"
- "\x38\xaf\x69\xc3\x3e\x9e\x0e\x5b\x01\xe3\x57\xa7\x10\x69\xdd\xc3"
- "\x15\x4e\x2b\xf3\x78\x8d\x9b\xed\x66\x9d\x9f\x06\x1e\xa7\x95\x6b"
- "\x84\xc7\x53\xaf\xe6\x94\x9e\x3f\xb3\x5e\x17\x2b\x86\xdc\xcb\xfe"
- "\x27\x3c\x77\x42\x9d\x2b\x7b\x79\xf6\x57\x99\xcc\x0b\xbd\x73\xd9"
- "\x95\x71\xfa\xbf\x43\x7e\xaf\x6e\xe5\x1e\x23\x0e\x40\xc9\x30\x32"
- "\x99\x87\xad\xa7\x2a\x93\x28\xf7\xd3\xca\x42\xae\x83\xe9\xe9\xa7"
- "\x15\x6c\x33\x98\x7b\xe9\xb7\x32\xd0\x43\x3f\x7d\x9d\xc5\x58\x63"
- "\x51\x78\xff\xea\xb2\xbe\x68\x95\x9c\x4e\x2f\xe7\x7c\x2f\x9d\x3c"
- "\xd4\x8f\x65\xd2\xa0\xd7\xb9\xb4\x7a\xb9\xf4\x5c\x5a\xbd\xdc\x1c"
- "\x43\xab\x33\xe7\xd2\xea\xe5\x5d\x31\xfb\x3e\xfa\x3a\xca\xaf\x2e"
- "\x63\x9a\x31\x8f\xa1\xdd\x85\xe0\xb3\xca\x5e\xfa\xbd\xec\x3f\x97"
- "\x7e\x2f\x87\x92\xd3\xef\xe5\xf5\xd7\xc4\xc3\x59\x97\x6c\xdc\x18"
- "\xb8\xdc\xa4\x9f\x13\xfa\xd5\x9c\xa6\xa1\x72\x4e\x1a\x7e\xdd\xa4"
- "\x39\x5f\xf7\xe0\x87\x2b\xcf\x23\x7a\x6d\x71\x11\xd6\xe9\xeb\x6c"
- "\xc2\x9c\x97\xd7\x95\xce\x33\x16\x1d\x31\xd6\x3c\x70\xdf\xca\x73"
- "\x67\xfe\x56\x10\xa7\x33\x3d\xf9\xdb\x53\xe0\xf7\x56\x65\x97\xfe"
- "\xaa\xa1\x67\xcd\xe5\xfa\x07\x8a\x53\x97\x93\xa3\xb1\xe6\x56\x4e"
- "\x3f\x04\x1e\x92\x6b\x48\xec\xdf\xd3\x17\xcc\x82\x68\x2e\x25\x87"
- "\xfb\xeb\x1e\xfe\xef\xeb\xac\x6c\x82\x3e\x72\xce\x9c\x5b\xf8\xe2"
- "\xec\xd9\xdf\xaf\x8a\x62\x7d\x77\xd6\x7b\xb4\x8a\x4e\xfe\x1e\xe3"
- "\x8a\xe7\x96\xa0\x4e\xd8\xff\x2f\x78\xd5\xb8\xf9\x6b\xe8\x3f\xa7"
- "\x4b\xd9\x92\x4f\x04\xd4\xf9\xe0\x5f\xb7\xc7\xe8\x67\xf0\xc8\xaf"
- "\xc3\xc2\xf3\xeb\xd1\xbd\x7d\xfc\xeb\xa6\x73\xfb\xf8\xd7\xad\xc9"
- "\xfb\xf8\xd7\x11\x6d\x21\x9f\xcf\xf8\x35\xcf\x7f\xa4\xad\xc9\xcf"
- "\xbc\x5f\x8e\x39\x73\x00\xf3\xe5\xf6\xa9\x8b\xbd\x77\x17\x2c\x4e"
- "\x61\xbf\x72\xf9\x4d\x8e\xc8\x59\xd1\xc6\x7b\xd6\xbc\x3f\xc6\xdf"
- "\xe4\xe0\x6f\xf1\xf0\xb7\x5a\x65\x1e\xdc\xaf\x3b\x46\x72\xee\x88"
- "\xf7\x8e\xda\x63\xf2\xbb\xc4\xb0\x15\x2a\xf2\x0d\xdb\xda\xba\xdc"
- "\x21\xcf\x2d\xaf\x55\xfd\xd1\xca\x7d\xc1\xf5\x15\x2c\xf6\xaa\x3a"
- "\xce\xf2\xf7\xb6\xc8\xaa\x6c\x88\x8a\xf5\xe7\x5d\xbb\x4f\xfb\xaa"
- "\xaf\x18\xb8\x90\x97\xf2\xfe\xaf\xab\x98\xd6\xec\xcb\x19\x34\x7c"
- "\x75\xd8\xaf\x10\x70\x03\x89\x7e\x89\xca\xbf\xa4\x92\x0c\xbf\x1d"
- "\xdc\x67\xf4\xcc\x07\xf8\x3b\x2e\x98\xc7\x39\xca\x96\x5f\x74\x92"
- "\x2a\x9a\x6b\xfb\x58\x43\x37\xce\x29\xeb\x7e\x3e\xfd\x01\xa3\xc7"
- "\xff\x11\xe3\x5c\x7f\xd6\x17\xbd\x3e\x8d\x95\x45\x31\xbe\x6b\x41"
- "\x1e\x7b\xf9\x5b\x31\xc7\xa8\x72\x8d\xfc\x36\xcd\x35\xbc\xfe\x5d"
- "\xb9\x53\x7d\x17\xb8\xb2\x3a\x16\x17\x85\x47\xe5\x63\xbc\x46\xcb"
- "\xef\x63\x71\x71\xcd\x5c\x30\x67\x94\x6b\xf6\x1c\xc7\x33\xce\x39"
- "\xc5\x05\x73\x64\x6c\x59\x19\xb6\xb6\x64\x71\x31\xef\x48\xdc\x98"
- "\x9e\x30\x86\xe9\xbe\x93\x86\x0f\x8c\xf2\x9f\x5c\x75\x09\xe8\x61"
- "\x52\xfe\x93\xaf\x98\xd5\xb8\xbe\x6a\xe8\xb9\xfe\x32\xab\xb2\x0d"
- "\x7f\x19\xf0\x95\xad\x4a\xc5\xb4\xd7\x7d\x6c\x98\xef\x56\xe5\x25"
- "\x29\xd3\xe3\xff\xc9\xdf\xb3\xe5\x6f\xcf\xf2\xbe\xb6\x8c\x3f\xfe"
- "\x1a\xf7\x5b\x65\x83\xcf\x35\x81\x63\xa8\xea\xfc\xbc\xaa\xca\xe0"
- "\x67\xc3\xcf\x92\x61\xf1\xb9\x95\x51\xe1\x58\x3f\xa3\x55\xdf\x61"
- "\xcc\xb3\xf7\xb4\x63\xa9\x89\x18\xf7\x90\xc9\xcb\x78\xb4\x26\xe2"
- "\x01\xfc\x86\x21\x3d\xd8\xeb\xa7\x65\xb4\xf3\x15\x33\xee\xf3\x13"
- "\x79\xee\x9e\x09\x93\x60\x94\xce\x9f\x55\x92\x4e\xe3\x66\x16\x15"
- "\xb1\x5c\xcf\x9c\x55\xb4\x60\xde\x8b\xf3\x0b\xe6\xcc\x9d\x83\xd4"
- "\x7b\x66\x73\xc8\x5f\x99\xe5\x4e\xfd\x8d\x63\xee\xac\x59\x85\x2a"
- "\x49\xef\x86\xf8\x7d\x20\xb5\x77\xff\x4a\x89\x9f\x2a\x47\xf4\xda"
- "\x5f\xaf\x1c\x14\xa6\x57\x6c\xf8\x5d\x29\x65\x5a\xda\x46\xaf\x54"
- "\xc7\xcf\x7b\x5e\xd9\x61\xf0\x83\xec\x3f\x37\xfb\xfa\x7c\xf8\x6d"
- "\x87\x90\xfb\x26\xe8\xb3\xd5\x51\xfe\xa6\xb7\x9f\x56\x4b\x7b\x3f"
- "\x06\x4e\x8f\xfe\xe7\x73\xfb\x2b\x94\x9f\x80\x99\xbf\x0f\xca\xe7"
- "\xf7\x3b\x3d\xab\xc1\xff\x15\x7b\x14\xff\xaf\xee\xe1\xff\x0e\x53"
- "\x2a\xe6\x70\xab\x87\x1a\xf6\x7c\xbc\xcc\xac\x1e\x7d\xae\x2c\xb1"
- "\x8f\xdb\xea\x49\x06\x6d\x8d\x7e\x56\xbc\xb5\xfa\x1b\x63\x1d\xb6"
- "\x56\x8f\x3f\xcf\xf7\x5c\x96\x6d\x75\x31\x70\xc0\xdd\xec\x8f\x7f"
- "\x94\x56\x37\x28\x7e\x59\x5d\x15\xe3\x93\x65\x3b\x4e\xab\xf7\xa8"
- "\x7e\x5a\xbd\xd3\xc0\x0f\xed\x94\xfb\x01\x0c\x43\xc9\xfe\x2b\xb7"
- "\x28\xde\x59\x7d\xc8\xa0\x2d\xcf\x8b\xf1\xec\xef\xb5\x2d\x5e\x29"
- "\x97\x3e\x12\x2a\x7e\x41\x37\xb7\x1f\x70\x66\x18\x70\x3a\x3d\x6b"
- "\xd0\x7e\x4b\x93\x41\x2b\x23\x4f\x2c\x4f\x8c\x9b\x59\x8c\x49\xeb"
- "\x9c\xd9\xb3\x67\xcd\x9b\x6f\xc4\x74\xce\x7a\xb1\xa8\x50\xc5\x70"
- "\xbe\x13\xdd\xbf\x08\x12\x38\x96\xc3\x40\x23\x55\xdd\x26\xd8\x90"
- "\x23\x78\x9d\x41\xfa\xed\xc9\x79\xcc\xab\xdf\x6c\xd6\xe7\x34\x47"
- "\x69\x6d\xa9\xf2\x7d\x59\x3b\x56\xd9\x8b\x17\x2f\x02\x4e\x75\x86"
- "\xbd\xc8\xeb\x97\x1d\x34\x2c\x9f\xcf\x23\xb1\xdf\xf6\xa6\x37\x45"
- "\x1b\xaf\x57\x22\x4f\x93\xf1\xdd\x2f\xb6\x45\xd6\xa8\xef\xb1\x07"
- "\xbd\x73\x39\x66\xfe\x6b\x69\x5a\xe5\xee\x62\x91\xbe\xa5\x0e\x36"
- "\x4f\x06\xcb\xc2\x80\x76\xf6\x9d\xe4\x38\x43\x6b\x6d\x6c\x2b\xb1"
- "\x7e\xe1\xd8\xf8\x6d\xb4\xc6\x8f\xf9\x0d\xc6\xbf\xd7\x32\x82\x69"
- "\xbb\x8b\x57\x2e\x21\x0b\xd7\x01\xdd\xe4\x6f\xaa\x63\xda\xae\x1d"
- "\xf1\x3b\xe8\x1e\x7d\x7d\xd7\xcf\xf5\xf8\x69\x4d\x58\x5f\x4b\x5f"
- "\xa9\xaf\x5d\xae\x44\xbe\x69\x7e\x1a\xa0\x7f\x53\x67\xdb\xe5\x37"
- "\x94\x93\x8b\xbf\x03\xa8\x62\x04\x7d\xce\xdf\x3a\xb4\xf3\xf7\xf6"
- "\x60\x5f\x61\x0e\xb1\xa6\x0e\x6d\xb0\xeb\xbe\xb7\xe0\x95\xb5\xdf"
- "\x29\x9f\xea\x35\xeb\x99\x06\x80\xbb\x5e\x87\xbb\x1e\x70\xd1\xff"
- "\x57\xea\xb1\x89\xd7\x36\x18\x75\x60\x4c\x09\xc2\x16\xcd\x67\x7b"
- "\x14\x78\x3b\xf1\x2b\x5a\x27\xf7\xa7\xfd\x98\xb7\x58\x05\xfb\x0d"
- "\xf5\x7e\xdb\x6c\x6d\xd0\x18\x5f\xb8\x6e\x1d\xf7\xd5\xbc\x7e\xc6"
- "\x6b\x67\x7a\x5d\xab\x79\x7e\x6d\xc0\xc4\xb3\x53\x3b\x7b\xa2\x0e"
- "\x30\x2d\x18\x2b\x83\xfa\x37\xad\x8a\xd6\x9d\x66\x1f\x33\x3f\xc6"
- "\xc2\xab\x45\x41\xc4\xc6\xfb\x3a\x03\x8c\x6f\x86\xd5\x9e\x66\x7a"
- "\xad\x9b\xde\xbb\x5f\x73\x42\xd2\x1f\xf2\x50\xde\x46\xeb\xe4\x77"
- "\xd2\x58\x16\xb8\x2f\xbb\xd0\x37\xfc\x6d\x7b\x71\xf6\xc4\x2e\xcc"
- "\xf3\x07\x1c\xa3\x75\x6f\x73\x1f\xf1\x1e\x2b\xfb\x7e\x21\xcd\xca"
- "\x31\xce\x8f\xd2\xba\x97\xb9\x7f\x18\x17\x51\xb1\xd5\x15\xe9\xcc"
- "\xff\x39\x9f\x6f\x65\x7d\xb8\xac\x14\x76\xec\x6c\xd6\x25\xaf\xa6"
- "\xf1\xbc\x98\xbf\x4d\xc3\xf7\xee\x42\xa1\xc9\xfe\x5d\xc2\xfd\xfb"
- "\x6a\xda\xb2\x80\xd0\xbe\xf3\x90\x38\x10\x22\xfa\xce\x44\x91\xb0"
- "\x29\x85\xf1\x36\xb9\x4f\xf0\x19\xdc\x3a\xf2\xb9\x2a\x08\xf5\x5a"
- "\xd6\x2e\x21\x1b\x9f\x5f\xe6\xef\xae\xb4\x84\x6a\xa8\xa5\xb8\x86"
- "\xfe\x3d\x52\x45\xde\x85\x1c\x8b\xe2\xd5\x5d\xff\xe1\xaa\xe2\x7d"
- "\xab\x34\xdc\xbf\xe4\x78\x94\xeb\x5a\x3f\xf1\x3f\x0e\xff\x89\xfe"
- "\xc3\xfb\x27\x72\x3c\x2e\x9f\xf3\x0f\xe6\xff\x3b\x1d\xcc\xfd\x77"
- "\x72\xb7\x09\x8d\xe7\x4a\x65\x2f\x70\x1d\x15\x80\x55\xc7\x67\x7d"
- "\x6d\x5a\x87\x3d\x1d\xed\x37\xf3\x9a\x7c\x4b\x28\x48\xde\xb9\x9f"
- "\x01\xc7\xf5\x7f\xd9\x7c\x9a\x2c\xde\xb9\xbf\x97\xf7\x6a\x0e\x73"
- "\xa2\xce\x57\xd8\xca\x76\x5a\x84\xcf\x39\xf3\x3e\x1f\xec\x76\x6d"
- "\x1d\xe3\x18\x55\x78\xf3\x37\xdb\x8d\xf2\xb0\xe3\x8c\xf2\x32\x56"
- "\xd4\x26\xa6\x07\x70\x6a\x9e\xa6\x68\x72\x10\xb3\x4a\x85\x33\xe8"
- "\x93\x1f\x4b\x9f\x75\x61\xa6\x0f\xc7\xc7\xd4\xd0\x5f\xc0\x2d\x17"
- "\x34\xd0\x8c\x3a\x80\xb3\x45\x5f\x17\xb5\xac\x3d\x4d\x19\xde\xb9"
- "\xfc\xdd\xad\x57\x9f\xb4\xe6\x99\x2d\xda\xd9\x93\xbb\xd6\x9d\x21"
- "\x33\xf7\x1b\xef\x85\xac\x93\xef\x25\xcd\x73\xb9\xcf\x82\x69\x1f"
- "\xfa\xf1\x6b\xc3\x2f\xc0\x7c\x87\x6b\x3b\xfa\xab\x02\x74\x6a\x45"
- "\x5f\xd5\xf1\x55\xf1\xe2\x36\x3b\xc7\x80\xd0\xe7\x25\xbd\xe9\x90"
- "\xa3\x88\x90\xdf\xb6\x85\xcc\xac\x6f\xd5\x20\x47\xbc\x2e\xb2\xf9"
- "\x35\xca\xd0\x3c\x6b\x86\x6f\x82\xae\xab\x79\x4d\x9e\x01\xb5\xf1"
- "\x5a\xe1\x06\xf9\x1d\x83\x57\x7b\xce\x7f\xae\x1a\xcc\xe7\xe4\x5e"
- "\xb5\x98\x78\x2d\xa5\x62\x77\x85\xce\xe7\xb0\x41\x5f\x83\xfe\x1f"
- "\xac\xfb\x92\xae\x95\xe7\x70\x59\xf6\xfb\xb2\xd1\x61\x1f\x1e\x14"
- "\x1b\xf3\x89\xf7\x54\x32\x96\x8b\x60\x46\x9b\x55\xb4\x84\x0e\xca"
- "\xf3\x91\x2d\xa1\xa8\xdc\x53\xc1\xfb\x94\x29\xa1\xa0\x15\xf6\xe4"
- "\x21\xa6\x9d\x91\xce\xfb\x31\xbc\x56\x35\x25\x24\x82\x53\x17\x5b"
- "\xf9\xbb\x83\x43\xe5\x7a\xbc\x9e\xde\x62\x87\x2d\xbe\x38\x68\x45"
- "\xdb\x23\x3d\xb0\x3a\xf2\x53\x59\xde\x90\x37\xb3\x27\x6f\x47\xbe"
- "\x99\xbf\xa3\xcb\x75\xc6\xa4\xf5\x9b\xea\x42\x59\xee\x2b\x3d\x4d"
- "\xd9\xa1\xaf\xf5\x7c\xff\x91\xed\x4f\xf6\x99\x16\xf3\xf3\x53\xb4"
- "\x8e\x7c\x53\x14\xb0\xc1\xfb\x36\xf9\xfd\xc3\x48\x50\xff\x9e\x50"
- "\x00\xf2\xdb\x4a\xa2\xb2\x3b\x17\xf9\xcc\x0c\x97\xcf\xdd\xf3\x77"
- "\x18\x44\x5a\x34\xb9\xbf\x6c\x45\x20\xec\x2d\x7b\x1c\xfc\xf4\x7a"
- "\x80\xe5\x39\x6a\xf9\xa8\xca\xf1\x1c\xdb\x27\xaf\xcf\x64\x7a\x46"
- "\x21\x63\xd1\xb4\x8f\xaa\x46\x05\x28\xa5\x0c\x7c\xab\xd6\x75\x5e"
- "\x5f\xee\x83\x0c\xba\x35\x01\x9b\xef\xf5\x12\xe6\x1b\x6b\x3b\xfb"
- "\x9f\x7d\x54\x2d\x7d\xbe\xd2\xdb\x82\xbe\x70\x80\x0e\x96\xff\x95"
- "\x0e\x46\x7c\xe5\x7b\x4f\x07\xcd\xca\xf7\xcb\xcc\x70\xdf\xe0\x77"
- "\x6e\xf0\x6a\x41\xb4\x8e\xfa\x5a\x6f\xe7\x39\x27\xc6\xb0\xbf\xab"
- "\xf9\xd7\xeb\x01\x63\xae\x79\xfe\x36\x54\xe5\x72\xac\x02\x21\xec"
- "\xa4\xad\x6a\x74\x00\x17\xb7\xe8\xcc\xa2\x51\x4b\x78\x9d\xab\xca"
- "\x0e\xbb\x3f\x57\x87\x7b\x4a\xc1\x45\xfe\xf3\xc0\x65\x9e\x39\x58"
- "\x2d\xf7\x7a\xd0\xa6\x46\x5b\x14\xb0\xa3\xe9\x8d\x79\xd0\xf1\x6e"
- "\xf7\x77\xbc\x0e\xfa\xc6\xcb\xa8\xc7\xd6\x12\x39\x44\x1c\xf3\x64"
- "\xb3\x86\xf1\xf1\x94\x9d\x74\x3f\x37\xf7\x49\xaa\x7a\x49\x13\x59"
- "\x36\xcc\x81\x79\x8f\xc3\xcd\x3a\x8e\xe7\xd7\x65\x51\xba\xc8\x07"
- "\x2b\x8a\xcf\xe9\x03\xc6\xe2\x3f\xf0\x7e\x12\xf4\x44\x54\xd8\x4d"
- "\xfb\xce\xfa\x89\x7d\x59\xe4\xb9\xfd\x15\x57\x6e\x18\xb8\x9c\xee"
- "\x16\x26\xab\xf4\x63\xd4\x2a\xbf\xca\x42\xdf\x4e\x54\x7e\x75\xbb"
- "\xab\x63\x7c\xea\x52\x51\xd7\x19\xf6\xa9\x13\x96\xdd\xd3\x6b\xe4"
- "\x5a\xde\x47\x55\x9d\x9e\x37\x1c\x7e\x7a\x3d\x9b\xf9\x67\x35\xfb"
- "\xd6\x4b\x1d\xfb\xc6\x9a\x60\xda\x7e\xf9\x4d\x19\x3e\x37\xa8\x2d"
- "\x8c\xee\x5a\xf7\x2d\x99\x15\x3d\xde\x78\xa1\xa5\xbd\xd3\x2b\x2a"
- "\xf6\x07\xf9\xcc\x98\x0e\xdb\x7a\x92\xde\x18\x2b\x2a\xf7\x63\xec"
- "\x79\x63\xb5\xea\x1b\x79\x9f\xcf\xef\x23\xdd\x59\x90\xc1\xaa\xc3"
- "\x35\x5d\xbc\xbe\x5e\x55\x2e\x3c\x57\x7b\x3b\x2c\xfb\x83\x0f\xdb"
- "\xd9\xa6\x7a\xa3\xce\x9f\xd2\xe0\xd5\xd7\xd6\x64\x0c\x82\xc4\x35"
- "\xb1\x9e\x3e\xdc\x68\x4f\xf7\x01\x08\xe6\x88\x99\xc7\xa9\xfa\x92"
- "\x2e\x0f\x99\xba\x61\x0b\x76\x99\x60\xf3\x6f\xcc\xcf\x58\x3b\x84"
- "\xb2\xf1\x6e\xc8\x71\x7a\xe3\x4c\xc4\x44\x99\xf8\xd9\x82\x57\x3a"
- "\xd3\x00\x37\x97\xd7\x1d\x9b\x4f\xf3\xba\xd1\x9b\x8f\x48\x5b\x6d"
- "\x03\x0d\xd7\x00\x8f\xf7\x50\xd6\x0d\xa1\xe1\xbc\xf6\x87\xb4\xac"
- "\x82\xa8\xda\x4b\x34\xe6\xf7\x2b\x86\xd0\x88\xf8\x7a\xdf\x38\xa2"
- "\xd6\x06\xab\x65\xcc\xb4\x45\x41\xfa\x51\xf1\x5d\xfc\x9d\xca\x37"
- "\x0f\x09\x4f\xaa\x10\x57\xda\x4d\x6a\xbf\xff\xcd\x4f\xad\xd5\x8a"
- "\xef\xe4\xde\x19\xf8\x8d\xf7\x26\xf5\x7d\x9a\x14\x19\x7b\x21\xbd"
- "\x61\x38\x7f\xf3\x37\x66\xed\xd5\x26\xf1\xd0\xcf\x4b\x47\x57\xdc"
- "\x34\x83\x61\x30\x3e\x05\x33\xd5\x1e\x0f\x9f\xa5\xf6\xd3\x9b\x32"
- "\x1e\xe3\xea\x0d\x94\xf1\xca\x06\xb2\x35\xcf\x96\xed\x0a\x28\x59"
- "\x34\x13\xe3\xab\x55\xb0\x9c\x81\x27\x80\x37\xd7\xc7\xbc\xd1\x12"
- "\x39\xe5\x75\x97\x08\xcd\xfb\x1c\xdb\xa2\x6f\xdd\xe8\x9d\xb7\x93"
- "\xa6\xb6\x45\xd4\xb9\xbf\xe9\x14\xac\x05\xbc\xda\x21\x64\x3b\x46"
- "\x6f\xdd\xee\x2b\x22\xde\x03\xb8\xc6\x3b\x6f\x0f\x60\xbf\x75\x3f"
- "\x8f\x05\x6b\x40\x1f\x35\x26\xbc\x15\xf1\x85\x5b\xa9\x19\xf2\x3d"
- "\xa5\x58\x44\x19\x0e\xf2\x2c\x97\xed\xdd\x68\x77\x14\xa8\xf3\xee"
- "\xb2\xad\x3d\x7b\x67\x7a\x3b\x7c\xa7\x25\xbc\x2a\x1f\xac\x52\xa3"
- "\x4d\x06\xad\x15\x7f\xbd\xf5\x47\xef\xbc\x7a\xe2\xfe\xe1\xfc\x78"
- "\xf6\xfa\xda\x91\xf7\x44\x7c\xbf\x70\x1e\xbc\xfb\x16\x70\x7f\xda"
- "\xbb\xff\xcb\xfb\x92\xbd\x79\x6a\x36\xf0\x39\xa0\x37\x47\x6f\x04"
- "\x8d\xd4\x7a\xf9\x5b\x4f\x32\xae\x7e\x7a\x6b\xba\xaf\xe4\xaf\xc9"
- "\xfd\x3c\x21\xfb\xe0\xfb\xe5\x2d\x72\x1f\xac\x7a\xf2\x94\x88\x26"
- "\x94\x3e\x7b\x9b\x65\x2b\xec\xc7\x95\x75\x81\xd4\x27\x37\xb3\x6f"
- "\xcd\xdb\x29\xd6\x14\xd5\xbf\xdc\x16\xb6\x57\x92\xf5\x71\xcc\x1e"
- "\x9d\x8d\x71\x35\xfa\x98\xbf\x97\xa7\xf1\x3e\xeb\x10\xd0\xbb\xdb"
- "\x4e\x8a\xff\xc4\x7a\xd4\xfd\xad\x6e\xbb\xb5\xea\x63\x59\x6b\x47"
- "\xda\x47\x75\x7c\x2e\xcd\xf0\xb7\x85\xfc\xd6\x14\x28\x1f\x66\x3b"
- "\xeb\xa8\x5a\x93\x92\x1d\xc6\x51\x2f\x7b\x58\xf9\x39\x54\x7b\x51"
- "\xfe\x70\xd2\xf6\xa6\x42\xef\x78\xa0\xa6\xd1\x1e\xb6\x23\x05\x74"
- "\x15\xc6\x83\x8b\x7c\xa1\x2e\xfd\x5b\x85\x6f\x2f\x83\x4d\x7d\x11"
- "\x9f\x4b\x31\x70\xbb\xb0\xfd\xb4\xb7\x27\xaa\xb9\xcd\xdb\x15\xc6"
- "\x7a\x8d\xb0\x80\xc6\x1e\xab\xe0\x33\x6a\x7c\xd6\x20\x94\xf6\x0d"
- "\x05\xd3\xba\xb3\x95\xdc\xbc\xbd\x0b\x76\xaa\xd4\xb7\x05\x61\xfe"
- "\x46\xfc\x57\x61\xde\x2f\xc5\xbc\xe9\x22\x6e\x33\xe0\x60\xfe\xf3"
- "\x42\xa6\x1a\xcf\xdf\xee\xd3\xf7\x5a\xce\x99\x8c\xb6\xa1\x4d\xb2"
- "\x6d\x68\xa3\x6c\x9b\xfe\x2d\x9f\x63\xb4\x41\x9e\x5d\xbe\xb0\xf6"
- "\x6c\xb0\x2b\xda\x7e\x43\xfc\x9d\xd2\x63\xb4\xf1\x6b\x79\xfe\x00"
- "\x7d\xa2\xf6\x16\x36\xc0\xd6\x7d\x25\xfd\x02\x61\xaa\x18\xd1\x15"
- "\xdd\xd9\x6f\x70\xdc\x3f\xfd\x7b\x60\x80\xdd\x0c\x5d\x9e\x2d\xcf"
- "\x76\xa1\x3e\xfe\x9e\x62\xaf\x1e\xda\x98\xc7\x7d\x75\xf3\x4e\xca"
- "\x55\x7c\xb8\x71\x02\xaf\xdf\xaa\x79\xde\x86\x10\x74\x6f\x83\x9a"
- "\x53\x19\xbe\xd9\x29\xd2\x37\x3b\x56\xc7\x5e\x18\x8e\x1b\xa5\xbe"
- "\x13\xe9\x47\x41\xff\x0d\x6d\xf2\x8c\x1a\xf0\x5d\x14\x31\xf4\xdf"
- "\x86\x36\xf6\xf3\xe9\xd9\x63\x5f\x0c\x5e\x29\x53\x67\x76\x3b\x3d"
- "\x1b\x57\x1a\x36\x8a\xfc\xfe\x93\x47\x1c\xe0\x7c\x53\x17\x9f\x92"
- "\x7b\xf0\xeb\xe4\xf9\xf2\xe3\xfa\xf9\xa6\x8d\x6f\xeb\xeb\x19\x59"
- "\xec\x17\x8f\xb2\x5e\x3f\xed\x93\xfe\x3c\x4c\x03\xae\x5b\xe2\x2e"
- "\xbf\xc1\xb4\xf1\x48\xef\x5e\xca\x86\x06\x99\x2e\x7d\x45\x37\x86"
- "\x0c\x1e\x41\x7b\x2f\x52\x71\x18\x37\x3c\xd9\x38\x82\x24\x0f\x74"
- "\x08\x7b\xfa\xb5\x35\xcc\x93\x35\x43\x63\xe9\x34\x35\xa2\xb9\x95"
- "\x0e\xda\x68\x16\x52\xd6\x37\x9a\xbf\xdf\x9e\xa8\x79\xc9\xb0\x45"
- "\x14\x9d\x6d\xc0\xb1\x76\x8c\xa4\x75\xc5\xd6\x06\x8e\x87\xb1\xb4"
- "\x8c\xe3\xfb\x6c\xba\x85\xe3\x28\x45\x2a\xb6\xb6\x46\xf9\x2c\x1c"
- "\xc6\x59\xad\x62\x6b\xe0\x58\x31\x99\x0a\x8a\x79\xff\x68\xbf\x97"
- "\xe7\x57\xc2\x0d\x5b\x20\x1d\xf6\x09\xe4\x7c\xd9\x1c\xb2\x3e\xe9"
- "\x04\x6c\x77\x56\x26\xc7\x39\xe2\x18\x47\x1c\xa7\x2c\xea\xce\x1a"
- "\x84\xfb\xc1\xb0\xe7\x6c\xc2\xb2\xf5\x00\xfb\xa0\x44\x3d\x02\xfa"
- "\xf8\x08\xc7\x5a\x32\xf9\x82\x61\x5a\x76\x82\x2c\x1c\x47\x29\x52"
- "\xb9\xbf\xb5\x25\xf4\x37\x39\xb7\x18\x58\x0c\x7b\x5a\xa3\xa1\xa0"
- "\xb9\x5d\x4b\xdb\xef\xc5\x18\xdf\xa4\xda\x7d\x4a\xa8\x76\x2b\xbc"
- "\x19\x7f\xa5\xe3\xea\x03\x65\x12\xf7\xcd\x7f\x8e\x00\xbe\x56\xf1"
- "\x6e\x5b\xb4\xe2\x5d\xbf\x3a\x43\x77\x90\xca\x4a\x44\xc0\x07\xdb"
- "\x98\x7d\x22\xf9\x9c\x24\xfb\xb8\x70\x1b\xb9\x7d\x5c\xf7\x7f\x9c"
- "\x3e\x21\xe3\x42\x45\xf0\xec\x2e\xd2\xcb\xb4\xa3\x4c\xfb\x41\xea"
- "\xaa\x78\x57\xb6\xbd\x25\xa4\xca\x16\xc8\x7b\x2e\x1f\x43\x07\xbd"
- "\xcd\x3d\x74\x40\xdb\xb9\x7d\xdc\xfe\x08\xd3\x04\x34\xd0\xdb\x6a"
- "\xef\xd6\xdb\xc9\x6d\xfc\x77\x8c\x3a\x1b\xd0\x4e\xb4\x55\xb6\xb3"
- "\x1b\xed\x3c\xe0\x24\x0a\xaf\xfa\xc6\xf6\x5d\xfa\xbb\x7e\x9e\x1f"
- "\xba\xff\x08\x3b\xba\x74\x3d\x61\x1e\x68\x7e\xaf\x6c\xbd\x69\x15"
- "\x6c\x93\xb2\x20\xe6\x83\x41\x11\x60\x7b\xdf\x57\x8c\x5f\xa4\x46"
- "\x7e\xe3\x55\xda\xc7\xfc\x3d\xce\x97\xd0\x26\xed\x6b\x2a\x0b\x88"
- "\x00\x6c\xd3\xb0\x2f\x82\x3c\x4e\xb4\x1f\xf3\xc7\x63\x3a\xfe\x9c"
- "\x77\xd9\xb7\xaa\x5d\xd6\x22\xca\xfc\xe2\xf1\x0a\x93\xaf\xb5\x82"
- "\x8c\xb6\x3c\x85\x7c\x68\x8f\x1d\xb0\x06\xc8\x18\xf8\x68\xe7\x46"
- "\xe0\x19\x8e\x69\x53\x73\x7b\x18\x30\xff\x4c\xe9\x79\x94\xb2\xe1"
- "\x24\xda\x71\x92\xec\xeb\xcb\x60\x7f\x3d\xc4\xf6\xe2\xe6\x01\x17"
- "\xe7\xd3\x70\x3f\x6d\xca\x54\x7c\x27\x63\xb4\x5c\x76\x9c\x6a\x6f"
- "\xef\x89\xc3\xc2\xb1\xad\xd2\xf6\x1f\x61\x3e\x92\xf1\x58\x78\xcc"
- "\xe8\x04\xcf\xb0\x7f\xca\x22\xd4\xd1\x99\x35\x58\xe2\xe3\x19\x4d"
- "\x78\xce\xc0\x33\x7f\x9f\x27\x93\xd7\x04\x50\xae\x55\x80\x66\x0c"
- "\x1f\xf6\x5c\x13\x5f\x99\x86\x49\xcf\x6f\xbc\x4f\x39\xa8\xa3\x9a"
- "\xe7\xbe\xbb\xca\x82\xa6\x97\xdf\xa7\x11\x17\xa6\x53\x6a\x0b\xfb"
- "\xd2\xdf\xbc\x17\xc0\xf0\xd0\xb6\x41\xc7\xa9\xee\xfe\x78\x19\x73"
- "\x48\x5d\xa6\xf4\x60\x9d\x8d\xd7\xdf\x2f\xb0\x5e\x69\xc3\xb1\x1f"
- "\xd1\x85\x95\xab\xcb\x34\xf0\x00\x8c\x43\x7d\xe1\x7e\xe1\x74\xa8"
- "\x2b\xea\x0b\xd6\x9a\x37\x65\x6c\x2e\xf7\xda\x37\xd9\xc7\x2f\x10"
- "\x6e\xb4\x73\xbc\x64\x8c\x9d\xf5\x21\x9a\xbf\x89\x2c\xee\x13\xbc"
- "\x26\x33\x99\x1a\x6b\xb2\x69\x33\xe6\xe4\xa2\x23\x6b\xd0\xeb\xa7"
- "\xd9\x9f\x40\xe9\x10\xb6\x49\xf9\x1c\x9b\x98\x9f\x65\x5b\xf7\xa6"
- "\x61\xc3\x6f\xb9\xbd\xf4\x0c\x99\xd4\xf7\x28\xb6\x8c\x1e\xef\x10"
- "\x91\x2a\x93\xe6\xac\xe1\xf8\x42\xe9\x5f\xb1\xfd\xe2\x34\x62\xf6"
- "\x48\xdb\xc7\x05\x99\xeb\xb0\xa7\xaf\x99\x47\x23\x38\xce\x98\x35"
- "\xa8\x6c\x39\x35\x5e\x6f\x29\x04\x7e\x36\x7d\x0f\xdd\xa6\xe2\xf8"
- "\xd4\xee\xac\x3d\x8d\xba\xd4\xfb\x37\xa2\x98\xc3\x48\xb8\xf3\x68"
- "\x78\xcd\x69\xca\x62\x3b\xa8\xe0\x6b\x65\xb3\xf1\xbc\x70\x72\xbb"
- "\x55\x44\xff\x4f\x16\x6d\x3a\xde\x1b\x87\x2c\x38\x9f\x63\x97\x09"
- "\x7b\x5f\xe7\x83\xd7\x0d\x96\x7e\x34\x32\xf6\x85\xfa\x5e\x19\x51"
- "\xd5\x6b\x64\xe6\xef\x73\xf2\x5a\x1e\xaf\x0d\xf3\x59\x1a\x35\x86"
- "\x6c\x35\x1b\xf1\x99\xfa\xdc\x9b\xab\x50\xf3\x1d\xed\x22\xcc\xbf"
- "\x82\x9d\x5e\xef\x42\x1e\x33\xb6\x4e\xe2\xf3\x3b\xbd\x73\x9c\xad"
- "\x23\xf9\x1d\xa7\xb1\x7f\x79\xae\xa4\xe5\xd6\x12\x9e\xf7\xe8\x73"
- "\xc6\x2f\x1c\x3d\x69\xca\x86\xe1\xb1\x8c\x71\xa8\x55\xeb\xc8\x03"
- "\x81\xcb\x7a\x63\x3c\xe3\x71\x5d\x7d\x1b\x74\x6b\xbd\x3f\xe5\xb3"
- "\xf0\x79\xf0\xb3\xe9\xdf\xd6\xe5\x33\xe9\xb9\xc8\x7f\xd8\x18\xdf"
- "\xe4\xb7\x1f\x56\x0c\xb9\x77\xfe\x62\x1a\xfa\xf0\x15\x16\x19\xf3"
- "\x80\xbf\xf1\xa8\xc6\xdd\xad\x91\xde\x3d\xaa\x5c\x49\x6f\xf9\x5d"
- "\x37\x9e\x63\x98\x30\x06\xab\x58\x63\xed\x6a\xfc\x35\xce\x17\x6f"
- "\xbb\xa2\xb7\x9e\x6d\x63\x7a\xc6\x51\xd4\xc1\xbe\x12\x0c\x5f\xd9"
- "\x26\x5b\xb9\x6c\x90\xe7\x56\x6a\x7c\xdd\x1a\x3c\x8f\x2d\x96\xc5"
- "\xf4\xd5\xf4\xf9\xa4\xaf\xfd\x1f\x8a\xbe\x2e\x4a\x1d\x55\x45\xf6"
- "\x2f\xca\xfc\xe6\x81\x2a\x66\x8e\x15\xf5\xaf\xe1\xf7\xcc\xeb\xde"
- "\x9b\x79\x2d\x6e\xdb\x37\x3e\x1e\xb7\xbb\xf3\x33\xa6\xf0\x5c\x5f"
- "\xda\xe2\xdb\x5a\x47\xa2\x1c\xd2\x06\xed\x3f\x19\x36\xaf\x5b\x42"
- "\x23\xf8\xfb\x89\x48\x97\xdf\x86\x0a\x5e\xfe\x7c\xe7\xb5\x99\x64"
- "\xbf\xb6\x8a\x7d\xec\xeb\xc9\x9f\xf2\xa9\x3c\x37\x22\xeb\x5f\xd5"
- "\x3d\x83\xe3\xac\x7d\xd0\xe5\xef\xa7\xfa\xaa\x7e\x13\x9e\xb3\x62"
- "\x9e\xef\x30\xd6\xf2\xfd\x54\x5f\x23\xf7\x03\xd9\x8f\x78\x2e\x8f"
- "\xd7\x5f\xf9\x7b\x7d\x6f\xea\x37\x29\x5c\xea\x37\x35\x16\x13\xaf"
- "\x55\x1f\xde\x2c\x63\x26\xd5\x17\xfb\x69\xeb\x2e\x7d\x3d\xe6\x90"
- "\xe4\x2b\xb6\x77\x7f\xc5\x73\xb0\x7f\x78\xd7\x20\x1f\x8f\x13\x05"
- "\x2e\xca\x55\x36\xfc\x57\x61\x0d\xfc\xd3\xdb\xfe\xfa\x34\x5e\xeb"
- "\x4b\xaa\x13\x37\x10\xc9\x32\x95\x5f\xe5\x48\x3f\xae\xca\xa8\x17"
- "\x57\x8b\xa8\x6c\xf3\xe3\x9a\x81\xf4\x20\xae\x36\x5c\x03\xb8\x42"
- "\x7f\x77\xd7\x31\x5f\x62\x0e\x6b\xc7\x3c\x81\xf7\x16\xb3\xfb\x3a"
- "\xff\xc7\xb4\xf1\xad\x7c\x94\x94\x5f\xea\xf6\xf2\x66\xf4\xe6\xd4"
- "\x4d\x44\xf3\x23\xa2\xcb\xf1\x23\x3e\x67\xb3\xbd\xdc\xbd\x89\xfd"
- "\x41\xb6\x4f\x8b\xf7\x07\xd9\x8e\xbb\xed\x7b\x88\xde\xb1\xe0\x97"
- "\x83\xfb\xf2\xde\xdf\x3b\x25\x9d\x9e\xed\x98\xaf\xd6\x4b\x1b\xeb"
- "\xc2\x74\xe2\x76\xb5\xbf\xce\xf3\xa2\xb4\x46\x52\xed\xed\xb6\xe1"
- "\xd9\x22\xd2\xba\xf3\x54\x7b\xdb\x08\xcf\x36\x87\x1b\xe3\x5a\x1a"
- "\x68\x32\x04\x6d\x4e\x8b\x7a\xb9\xbd\x8c\x6f\x47\x5a\x9b\x3f\xf6"
- "\xec\x23\xc3\xe4\xf6\x07\xd3\xda\x18\x1e\x89\xeb\x1f\x28\x36\xe8"
- "\xa9\xd3\x89\xf7\x8d\x4c\x1d\x80\xa1\xec\x20\xe4\x07\x0c\x23\x7f"
- "\x0f\xed\x87\xf0\xb7\x0c\xd0\xa7\xc8\x87\x39\xb1\xc5\x38\x57\xd9"
- "\xe9\x79\xa7\xe8\x77\x45\x6a\xff\x80\xcb\x86\x62\xca\x72\xac\x81"
- "\x64\xe5\x51\xa7\x45\xd5\xd9\xe6\x3f\x46\xdb\x97\xab\x7a\xdf\x99"
- "\xd1\x97\x2c\x95\x0d\x83\x7d\x57\xe3\xe7\x78\x04\x6c\x0f\x8d\xf1"
- "\x0d\x0d\x91\xaf\x46\xc3\x98\xdf\x66\xcb\x2d\x13\xde\x63\xf4\x2f"
- "\xc3\x5a\xc2\x81\x0b\x1c\x0f\xdf\x51\xdf\x08\xeb\x2a\x27\x5f\xe9"
- "\xad\xf2\xbb\xc1\x27\x69\xc7\x2f\x7c\x41\x19\x7f\x9b\xef\xc7\xf2"
- "\x7b\xf6\x7d\xe0\xb1\x01\x73\xec\x9e\xf8\x75\x1a\xf2\x6e\xe6\x74"
- "\xa4\xf9\x42\x41\x19\xe7\xae\xd7\x37\xfb\x2b\xbb\x92\xa9\x1d\x69"
- "\xf2\xdc\x3b\xe3\x1b\xf9\xb9\x97\x71\x86\x2c\xd9\xb9\x0d\x6e\xcc"
- "\xff\x7c\x91\x4e\x2f\xcb\x84\x63\x21\xaf\x15\xfe\xcb\xd7\xe0\x3b"
- "\x81\xb9\xb6\xfd\xc2\xda\xf0\x2f\x72\x4e\xe3\x8e\x88\x93\xc1\xb4"
- "\xaf\x78\x8d\xd9\xb4\xae\xac\x9f\x65\x5c\x8d\xf0\x76\xa4\xb7\xd9"
- "\x3a\x3d\x3b\x2c\xbf\x73\xa9\xbe\xb9\x30\xb8\x3b\x2c\x46\xdb\x37"
- "\xeb\x6d\x47\x5d\x72\x6f\x6e\x54\xb5\x8a\xeb\x87\x3c\xb9\x7d\xae"
- "\x59\xa1\x9f\xd9\x1e\x60\xbf\x51\x9d\x16\xeb\x7b\xc6\x86\x0b\xc3"
- "\xe3\x9c\x98\x69\x49\xea\xe8\xd6\xeb\x08\xfd\x5f\xd6\x11\x3a\x5f"
- "\x1d\xd0\x0d\x57\x1d\xa7\x77\xcb\x2f\x7c\xee\xf8\xee\x24\xc9\x2b"
- "\x15\x6d\xa4\x74\xe6\x6f\xbe\x8d\x62\xfe\x16\xb1\x74\xdb\xe4\x37"
- "\x7e\x4c\x54\xce\x31\x0e\x23\x15\x8d\xd4\xec\xea\x22\xef\xc2\x3f"
- "\x51\x1b\xbd\xfb\x29\x97\x69\x2e\xe1\x39\x5b\x77\x5e\xf7\xaa\xb6"
- "\x19\xdd\xa6\x1d\x87\x98\xde\x9b\xd0\x0f\x1b\x63\xf8\xac\x25\xf4"
- "\x27\xf2\xcd\xe0\xf5\xd5\x43\xbc\xae\x9d\x07\xfd\x60\xd3\xa0\x1b"
- "\x60\xa3\x47\x25\x3d\x60\xbf\xa8\xf9\x56\x20\x2c\xe7\x5b\x41\x79"
- "\xe6\x6f\x80\x8c\x5d\xe8\x29\x3a\xc8\x6b\xdf\xd1\xee\x7c\x47\xa7"
- "\x87\xf2\x38\xa6\x21\xaf\x3b\x0b\xcb\xee\x92\xa9\x91\x54\x21\xe7"
- "\x53\xb0\xfd\x39\xa6\xa1\x0f\xb3\xca\x28\xec\xe8\x9a\xb3\x94\x59"
- "\x03\xdb\x13\x3a\xdb\xc6\x7a\xbd\x56\x8f\x6b\xb8\xe6\x6c\x6f\x5c"
- "\xc3\xcd\xbc\xd6\xd3\x8a\xfb\xb3\x64\x8e\x56\x06\xc2\x1b\xcf\xd2"
- "\xf0\x4d\x0b\x29\x6b\x23\xaf\xe5\x7d\xa3\x6c\x1f\xb6\x2b\x64\x8c"
- "\xc3\x17\xb3\x78\x3d\xbf\xd7\xf6\x59\xc4\x31\x58\x7b\xf4\x96\x9c"
- "\x8b\x5e\x18\xbd\x7f\x23\xc7\xc1\x48\xc5\x57\x39\x11\x4b\xd4\x0b"
- "\xda\xf9\xd1\x07\x41\xd0\xaf\x28\x59\xdf\x1a\xbe\x4d\x55\x31\x71"
- "\x29\x7f\x37\x5c\xe9\x77\x3f\xfd\x76\x74\x5f\x3c\x11\xdd\x98\x4f"
- "\xa3\xda\x29\x5b\xf9\x2b\xa4\x61\x4c\xfc\x6d\x35\xef\x9f\x97\xbd"
- "\x40\xf6\xe8\xc6\xe9\x29\xee\x2d\x94\xca\xdf\x94\xe6\x5f\xd9\xb7"
- "\x22\x30\xaa\x88\xb2\x79\xff\x81\x7d\x1a\x1c\x4b\x65\xfe\x39\xc3"
- "\x4b\x29\x3b\x16\xf6\x44\xe5\x6c\x74\xa7\xe3\xfe\xb9\xcf\xbc\xf8"
- "\x42\xf1\xcc\x92\x39\x4f\xcf\x29\x9a\x53\xb2\x58\x86\x0d\x18\x21"
- "\xff\xdd\x77\x5d\xe1\x34\xb9\xe9\x1c\x63\x5f\x0c\xef\x5d\x8f\xdb"
- "\x39\x2c\xca\xeb\x07\x17\x44\xaf\xdf\xb6\xeb\xfb\x68\xc1\x4d\x72"
- "\x5f\x69\xe7\x68\xd8\x63\x16\xd6\x15\x6b\x54\x0c\x99\x80\xf2\x63"
- "\x50\xf9\xb4\x8a\x6e\x8e\x41\x34\xe6\x28\x7d\x60\xe3\xfd\x10\xf4"
- "\x55\xd0\x57\x7a\x9c\x60\x87\x8c\xe1\x7d\x96\x66\x5e\xcb\x90\xb6"
- "\xef\xce\x2d\x72\x0c\x3b\x29\xe3\x50\xd5\x1f\xc5\x33\xfb\xbd\x6b"
- "\x22\x7f\x63\xf4\x45\x7b\xbd\xf6\xa2\xfd\x1d\x21\xf2\x37\x68\xa7"
- "\x9c\x1b\xc5\x29\xe7\x06\x51\xb1\xcd\x02\x19\x1b\x7a\x9c\x76\x7e"
- "\x1c\xf1\xd0\xe5\xf8\xf5\xef\x8d\x21\xb0\xf3\xdf\x26\xb5\x89\x6e"
- "\xfc\x34\xcc\xcb\xb3\x62\xf6\xd0\xf8\x9d\x3c\xb3\x51\x3c\x8f\x7d"
- "\xa9\x76\x46\xb9\x6e\xb1\xaa\xfe\x86\xa0\xdb\x99\x8a\xfc\x51\x85"
- "\xcb\x7b\x57\xf8\x56\x1e\x23\xb5\x6f\xfa\x9e\xdd\x2b\xd7\x8c\xdf"
- "\xfb\x90\xcb\xf1\x3e\x1b\xdb\xd0\xbe\x36\x9e\x5b\xfc\xb6\x9e\xfd"
- "\xf0\xd8\x7e\xde\x34\x88\x6c\xeb\x07\x51\x46\xa7\xe7\xbd\xf1\x3d"
- "\x3e\x16\x16\x35\xa6\xf2\xb8\xc6\xb1\x88\xa1\x73\x3a\x79\x8c\x64"
- "\x3c\x98\x4f\x01\xb3\x98\xf7\xe0\xd4\xb9\xa2\xf7\x4a\xfd\x54\x14"
- "\xbc\x70\x9d\xfb\x9e\x8c\x6d\x23\x4c\x6e\x31\x6a\x35\xcd\x90\xfb"
- "\xa3\xca\xe7\xd0\x0c\xb9\x74\xaa\xf6\xbc\xff\x8d\xdc\x3f\x5f\x78"
- "\xa2\x0e\x72\x53\x5e\xdb\x45\x19\x5a\xc5\xee\x22\xb6\x63\x9a\x4b"
- "\xe5\xbe\xb2\x05\xe5\x76\xf1\xbe\xb3\x3c\x97\x27\xe3\x5c\xff\x89"
- "\x6a\xcf\x90\xb9\x8d\xde\x0b\xf3\x5a\x7b\x2f\x6d\xdf\x9f\xcc\x7b"
- "\x2b\x62\xd5\x96\x3a\x6b\xa9\xa9\x82\x61\x68\x67\x4f\xe6\x18\xe5"
- "\x30\x76\xf7\xe7\x72\x47\xe9\xfd\x5b\x64\x39\xce\x2b\xbf\x8f\x68"
- "\x9b\x8e\x71\x2c\x87\xf3\x47\xf0\xbc\x59\xb3\xe5\x09\xc8\x5b\x74"
- "\x61\x74\x17\xde\x4d\x83\xbe\xf3\x23\x2d\x5f\xae\xf1\x62\x5e\x2e"
- "\xe3\x9d\x58\xf6\x07\x7d\xfe\x7f\x78\x25\x3e\xec\xc7\x5a\x02\xdd"
- "\x24\xed\xbe\xf7\x5f\xde\xfc\x0d\x99\x8b\x67\x73\x1f\x7e\x60\xd7"
- "\xf9\x66\x87\xc2\xef\x83\x2b\x3a\x56\xbd\xeb\xef\xb0\x7c\x15\x0c"
- "\x99\x2c\xd4\x68\x67\xbf\xfb\xee\xba\x46\x7b\x17\xe6\x0e\xef\xfb"
- "\xfd\xa6\x2d\x36\x65\x73\xa8\x72\xbc\xb7\x03\x7b\xb4\x3d\xd5\x6e"
- "\x9b\xd2\xe9\xf9\x80\x0c\xff\x0a\xfe\xa6\x38\xef\xf1\x80\xbe\xad"
- "\x4c\x37\x3f\xed\x2c\x92\xeb\xfc\x2b\x9e\x08\xa0\x3d\x17\xb1\x0f"
- "\x1c\xd3\x99\xcf\x37\x58\x71\x2f\x16\x8a\x1c\x6b\x24\xd7\x54\x2b"
- "\xcf\x35\xca\xf3\xf2\xa3\xf5\x98\x2d\xd9\x7a\x0c\x97\x11\xfc\xac"
- "\xce\xdb\x7f\xd0\x73\xfe\x9f\xe3\xd4\xb0\xef\x40\x54\xf7\xab\x93"
- "\xf1\x5b\x4e\xab\xfd\x51\xf6\xab\xe3\xf5\x41\x3e\x1f\xc8\x7b\x98"
- "\x28\x57\xd7\xe3\xe7\x28\xcf\xc5\x7c\xb0\xcb\x88\xdb\x82\xfb\xbd"
- "\x3d\xfe\x3a\x68\x7b\x47\xc5\x57\x81\x90\xa5\xbb\x2e\x54\xf1\x55"
- "\x36\xde\xb5\x42\x6e\xcf\x17\x37\x90\xbf\xef\x42\x1c\xcb\x42\x4b"
- "\xdf\x5d\xcd\xf1\x2c\x1a\x43\xa4\x9f\x09\xde\x75\x87\x7e\x7e\x3c"
- "\xf5\x24\x7d\x70\xa6\x77\x2f\x31\xaa\xaf\x83\xed\x9a\xa1\xec\xb0"
- "\x5d\x33\xe4\x3a\xd8\xaa\xaf\x0e\x6d\x5b\x12\x36\xed\x5a\x02\x29"
- "\x90\xe7\x04\x76\x4d\xf3\x53\x43\x85\xe1\x8f\x82\x7c\x99\x7d\xc5"
- "\xb2\x12\x15\x0d\x45\x0a\xe6\x87\x72\x0d\xa3\x77\x5e\xf3\xa1\xda"
- "\x27\x5b\x31\x64\x86\xc6\x63\x60\x7a\xa3\x4d\xfa\x56\x14\x9f\xe6"
- "\xf5\xb0\x8b\xd4\x1c\x4b\xe5\xd1\xfd\x22\x2f\x3d\x1e\xff\x3c\x88"
- "\x9f\x15\xcd\x76\xb5\x19\x6b\xeb\x6b\x4d\x1a\xc7\x36\x16\xee\x3a"
- "\x11\xf2\x15\x87\x08\xf6\x55\xd0\x87\x31\x15\x75\x08\xe8\x87\xfe"
- "\x28\x73\x05\xd3\x5e\xc9\xd0\x87\x6b\x24\x4e\x9e\xbb\x85\x9b\xed"
- "\xca\x20\xfb\x76\x9c\x26\xe4\xbb\x04\xf9\x26\x34\x95\xb6\xb3\x7f"
- "\xca\x0c\x8e\x21\xd7\xa6\xd7\x1d\x4c\x6b\x28\xba\x36\x83\x66\x74"
- "\x7a\x3e\xcc\xf7\xd3\x0a\xfb\x85\xcb\xf6\x87\xf9\xe7\xb3\x31\xd4"
- "\x98\x97\x4b\x7d\xcd\x53\x78\x1e\x7a\x33\xea\x9f\x2c\x18\xff\xdd"
- "\x13\x22\xa6\x30\x75\x9b\xfa\x8b\x1f\x97\xbb\x28\xe2\xe9\x2f\xa2"
- "\x4b\xd0\x5f\x1d\x76\xd8\xb1\x07\xa9\x25\xd2\x24\x7d\x3f\x20\xb3"
- "\xd6\xb2\x90\x38\xed\x8b\xec\x91\xbe\xb0\xea\xcc\xf8\xee\xb1\xbe"
- "\xc8\x3e\x6a\x29\x0e\x12\xeb\x85\xa3\xb4\xfb\x46\xc6\xeb\xe6\xe2"
- "\x72\x1a\x79\x92\xdf\x7f\x18\x50\xe3\xdf\xee\xf1\xfa\x35\x93\x63"
- "\x0d\xc6\xe2\x74\xdf\x82\xb9\xcf\x94\xcc\x79\x71\xee\xc8\x49\xb3"
- "\x16\xce\x2a\x72\x3c\xa4\x5c\xe9\xe2\xc6\x25\x4b\x6f\x0c\xe5\x8f"
- "\xe4\x58\xc1\x36\x08\xc7\x52\x3e\x5f\x1c\x65\x23\x86\x32\xf4\xda"
- "\x70\x5e\xb7\xfb\x9f\x8c\xa3\x6c\xd8\x18\x1c\x43\xb9\x77\x0d\xfb"
- "\xa3\x43\x3d\x32\xa0\x7d\xd1\xc9\xcf\x7c\x4e\x52\xf3\xec\xce\x63"
- "\x39\xda\x2c\xfd\xce\x3e\x9a\x18\x1b\xf7\x87\x7d\xec\x78\xdd\x03"
- "\xe9\x33\x8c\x33\xa9\xe0\x45\x8c\x15\x1f\x15\xf7\x9e\x91\xf9\x08"
- "\xfa\xff\xc3\xbd\x4a\x7e\x65\xde\xd5\xc6\x5e\xaf\xfe\xed\x2a\xb9"
- "\x37\xad\x79\x3a\xc7\xab\xf5\x95\x8f\x5e\xdd\xac\xf5\xb7\xa8\xb5"
- "\xfd\x8f\x1a\x8c\xf3\x57\x4a\x36\xbf\xd0\x65\xf3\xa3\x43\xe7\xdb"
- "\x8f\xef\x95\x8d\x3d\x19\xbd\x72\xfd\x77\xbd\xec\x9e\x8c\xef\xdb"
- "\xcb\xd7\xed\xdc\xcb\x8e\xd3\xbf\x0e\xe3\x35\x17\xdc\x5f\x8d\x7b"
- "\x79\xee\x53\xf9\xa2\x7f\xfc\xb5\x7e\x8f\x3a\x3e\x6e\xd6\xef\xaf"
- "\xc4\xfd\xc7\xfa\xfd\x10\xdc\x6f\xd2\xef\x21\xb3\x1f\xbf\xac\xdf"
- "\x67\xe2\xfe\x05\xfd\x1e\x3a\xfe\xe3\x47\xf4\xfb\xc1\xb8\x1f\xab"
- "\xdf\x5f\x81\xfb\xeb\xf4\x7b\xc8\xe0\xc7\x03\xf4\x7d\x51\x0b\x70"
- "\xff\xee\xc2\xed\xee\x3d\x4d\x6a\xef\xed\x63\x33\x74\xa5\x7e\x56"
- "\xad\x27\xcd\x0e\x9e\x76\x1a\xf4\x45\x3a\x9f\x35\xb7\x20\x3d\xdb"
- "\x4f\x5b\x6d\x31\xe9\x3b\xf5\xfc\x13\x31\xbe\xb4\xc5\xa4\xd7\xe9"
- "\xe9\x33\x60\x5b\x8e\x8e\x49\xaf\xd2\xd3\x5d\xd0\x8b\x45\x31\xe9"
- "\x15\x7a\xfa\x7a\x3f\xd5\x8c\x8f\x49\x2f\xd5\xd3\x77\x18\x7e\x08"
- "\x7a\x7a\xb1\x9e\xee\x45\x7a\x28\x26\xbd\x50\x4f\x87\xfe\xff\xe8"
- "\x48\x4c\xba\xd4\x2b\xeb\xe4\xb9\x2d\xab\x68\x2c\x65\xd9\xfa\x98"
- "\xf7\x08\x63\x71\x9e\xa4\xca\xfe\x6b\x26\xd2\x33\x62\xd2\x73\xf5"
- "\xf4\x11\x7e\xfa\xba\x3e\x26\xbd\x4f\xdb\x37\xa5\x9a\x66\xf4\xb5"
- "\x36\xc9\xdf\xfa\x91\xfe\x8f\xd2\x66\xfc\x64\x0e\x9f\xe9\xb2\x6e"
- "\x12\x47\x1d\x65\x42\x1c\xa5\x4f\xf2\x74\xbf\xbf\xe9\xec\x87\xa5"
- "\xce\xc6\x7d\x92\x23\xcf\x4b\x71\x1c\x43\x3e\x2f\xb7\x84\xd3\xfe"
- "\x55\xc6\xca\x1b\xe5\x2a\x57\x31\x0e\x95\x5f\x69\xbb\x9c\xa3\xeb"
- "\xfb\x97\xc8\xc3\xdf\x48\xe4\xef\xb3\xb6\xf3\x3a\x9e\xaf\xa4\x4b"
- "\xfa\x3a\xf2\x1c\x89\xd3\x78\xae\x2a\xcf\x50\xc5\xcc\x95\x94\xde"
- "\xff\x64\x8e\xc6\x67\xdc\x3d\x6a\x3e\xcf\xb2\xc8\xf9\xd9\xe7\x26"
- "\x36\xaf\x9f\x3e\x91\xf3\xdc\x54\xfb\x25\xdb\x3b\x3d\x9f\x4c\xec"
- "\x3d\xd7\xf3\xaf\x75\x7a\x7a\x3d\xd2\x67\xc4\xa4\xaf\xee\x5b\xb7"
- "\x43\xdf\x59\xb6\x04\xba\xcf\x8a\x50\xe4\xac\x08\xaf\xfd\x2f\xe0"
- "\x3d\x5b\x9e\x51\xf9\x51\xb4\x62\x4b\x58\x8f\x17\xf1\x65\x64\xa1"
- "\x08\x42\x67\x73\x9c\xfe\x8b\xa7\x84\x82\x34\xa5\xb8\x53\xac\x79"
- "\x9a\xfd\xe7\xce\xc8\xd8\x49\xee\x76\x8e\x61\xcc\x3e\x59\x21\xde"
- "\xf7\xc9\x68\xc1\x18\xb7\x79\x36\xbf\xff\x1b\x4d\x76\xc2\xf6\x76"
- "\x46\x69\x33\x60\x6f\x7a\xda\xf0\x87\xe4\x18\xf0\xba\x8f\x22\x70"
- "\xe0\xfa\xdc\xf2\x7b\x1b\x0d\x32\x36\x07\x7f\x4f\x4c\x54\x46\x0f"
- "\x89\xdf\x4b\xfb\xd5\x61\x5d\x4e\x0e\x8c\xed\xbc\x0f\x66\x53\xbf"
- "\x28\xeb\x1b\x47\x5f\x6d\x52\xb2\xdc\xe0\x52\xba\x66\xab\x53\xe9"
- "\x8b\x06\x97\xd8\xca\x67\x74\x1a\xf8\xfc\xcb\x81\x60\xda\x57\x49"
- "\xfd\xaa\x96\x6d\x22\x53\xf7\x2a\xd8\x26\x27\x1b\x4c\x4a\x3f\x7d"
- "\xea\xd4\x4c\x96\xe5\xbc\x5e\x28\x63\xed\xaf\xda\xbd\x63\xe7\xdc"
- "\xb0\xa9\x79\x49\x1b\x9f\xda\xb6\x4f\x0f\xb3\xff\x77\xc3\x37\x03"
- "\x4b\x38\x6e\xd5\x57\x87\x60\x77\x9a\x3e\xc2\xfb\xfd\x73\x1b\x4c"
- "\x11\x69\xaf\x7c\xea\x94\x6b\x4c\x15\xbb\x4b\x79\x0c\xf1\xb5\x46"
- "\xd9\x66\xce\x80\xcd\x5c\x04\xfd\x6f\x89\x2e\x72\x0e\x8a\xcc\x77"
- "\x5e\xbc\x69\x1e\x65\x44\xe7\x67\x65\xbe\x7e\x96\x72\x8c\xf1\x07"
- "\x73\xd3\x6c\xd1\x69\x4f\x5f\x87\x31\x85\xe7\xae\x03\x53\x6c\x72"
- "\x2f\x8d\xef\x35\x53\x6d\xde\xe6\x85\xe7\xff\x6e\x48\x14\x73\x56"
- "\x8e\xe5\xcb\xb8\x24\x6b\xeb\xea\x0d\x98\x07\xeb\x67\x4a\xcb\xbe"
- "\xa6\xc1\xb0\x73\x4d\x03\xcf\x08\xef\xf1\x22\x32\xf1\xb7\x16\xca"
- "\x66\xc9\xf5\xa1\x7e\xcd\xce\x08\xf9\x5c\x7f\xa5\xb2\x79\xdc\x47"
- "\x9f\xee\x63\x3b\x8d\xfd\x21\x91\xdf\x76\x9c\x3e\x6d\xb6\x86\x31"
- "\x66\x84\x61\x3b\x3f\xc7\x73\xbd\x4f\xbf\x0c\xc9\x58\xa2\x9f\x0d"
- "\x67\x9f\x70\xef\xbc\x7b\x39\x2d\xea\xfe\x5a\xfa\x3e\xcc\x50\xb2"
- "\xf5\x69\x2b\x3f\xbb\xf9\x8c\x6b\xfa\x27\xf5\xef\x77\x85\xfb\xa9"
- "\x35\x88\x4f\xff\xa2\x8f\x0f\x5e\x35\xe7\xfa\xf4\x9c\xb3\x78\x3d"
- "\x6b\xa3\x15\xef\x70\x3b\xaf\xf6\xd5\x44\x68\x4a\x48\xf8\xe5\x3e"
- "\x25\x9f\xed\x77\xdd\xed\x15\x67\xd7\x93\x3a\x8f\xf6\xd9\x26\xad"
- "\xf2\x1d\x3d\x06\xe0\x67\x32\x46\xa7\x5a\xb3\x7c\xc7\xae\xd6\x68"
- "\xdf\xc9\x52\x6b\x96\xef\xe4\xac\x18\xc2\x3e\xc8\x9f\xd5\x74\xa4"
- "\xbd\x03\x99\xfa\xac\xb8\x23\xfd\xf3\xbe\xce\x7c\x60\x3c\xda\x96"
- "\xe3\xf8\x11\x65\xf2\x5a\x39\xfb\x13\xd7\x2a\x3f\x62\xd4\xf1\x39"
- "\xfb\x15\xf3\xbb\xab\x8f\x16\x53\x2a\xaf\x2f\xa2\xde\x13\xa3\x6a"
- "\xc8\x01\x5c\x07\x08\xcb\xf6\x80\xf4\xdd\xaa\xd8\x1e\xf6\xb5\x0b"
- "\x2f\xfb\x0c\xaa\x3d\x8d\xcf\x77\x8a\xb4\xed\x01\x95\xff\xf3\xb1"
- "\x2d\xed\x68\x83\x65\x7b\x83\x2f\x7c\x42\xb7\x09\x3f\x07\xef\x6f"
- "\x6f\x10\x15\xdb\x0f\xa8\xb3\xe2\x9f\xaf\x31\xf4\xaa\xe2\xd1\xcf"
- "\x97\x2b\xba\x6d\xcb\x51\x74\xfb\x7c\xa7\x3e\x5e\x5d\xcd\xf7\x18"
- "\xbb\xb3\xd5\x1e\xfc\xe7\x2e\xc3\x46\xf6\xeb\x79\xb8\x0c\xee\xf5"
- "\x58\x38\x9f\x57\xa3\xed\xd9\xfa\x7b\xf9\xad\x30\xb4\x0f\x63\xd6"
- "\x67\x87\xb9\x5d\x7d\xe9\x56\x49\x8b\x52\x4a\x05\xce\xfc\x0d\x61"
- "\xf6\x31\x0e\xf9\x42\x77\x7b\xd5\xf7\x00\xf7\xdd\x2e\xcf\xcc\xa2"
- "\x1e\xf4\x8f\x89\xf5\x26\x9f\xf1\x65\x78\xbd\xf8\xef\xbd\xc2\xc0"
- "\x85\xeb\xe3\x77\x68\x6b\x03\xf7\x27\x68\xc5\x31\x46\x88\xfb\xf5"
- "\x58\x31\xaf\x5d\x9c\x01\xcd\xd8\x0f\x68\xdf\x78\xa6\x89\xa2\xd9"
- "\x3e\x87\xa4\x47\x4f\x3f\xec\xbb\x2c\x9e\x1e\xea\x59\xb3\x40\x37"
- "\xcc\x63\x7f\x90\x7d\xe3\x75\xfa\xb5\xeb\xf5\x7f\xab\xcf\xd5\xf1"
- "\x6e\xef\xbb\x31\x65\xaf\xea\xc9\xab\xbe\x3d\x69\xe2\xbd\x55\x5e"
- "\x6b\x57\xfc\xba\xf7\x70\x4c\xb9\xc3\x05\xdf\xb2\x8d\xbc\xa5\x81"
- "\xbf\x15\xc8\x34\xef\xf4\xec\x0d\xf4\xd2\x5b\xc1\x49\x52\xc7\x8f"
- "\x8c\x3a\xfc\xb4\x77\x87\x81\x27\xee\xf5\x31\x78\xdf\x88\xde\x3e"
- "\xd9\x3b\xc9\x28\xc7\xfe\xfb\xe8\x23\x19\x57\x27\xa9\x1e\xe4\x3d"
- "\x9d\xa1\xd0\xc1\x91\xbb\xbd\x92\x1f\x69\x5f\x3d\xfb\xba\x82\xae"
- "\xfa\xb7\xe1\xf6\x55\xa8\xb1\x70\x9f\x8c\xdd\xc2\xfb\x25\x1c\x8b"
- "\x18\xf5\xd5\x00\x6e\x83\x8e\xf3\x2e\x1d\x07\xcc\xff\x3e\xdb\x91"
- "\x38\xaf\xbb\x77\x66\xa1\x3c\x18\x3b\x72\x41\x71\x62\x9c\x4a\x4b"
- "\xef\x19\xc8\x7d\xed\x31\x67\x48\xd7\x2b\x7a\xef\xcf\xc1\x3c\x75"
- "\xcf\xda\xff\x8f\xbd\xef\x81\x8b\xb2\xca\xfe\xbe\x33\x0c\x3a\xe8"
- "\x00\xa3\x91\x8d\x46\x3a\x95\xee\xa2\xa1\xb1\xbf\x9f\xf5\xb2\xad"
- "\x6d\x54\xda\xaa\xab\x40\xad\xee\xb2\x9b\x25\x26\x14\x16\xea\x84"
- "\x48\x64\x38\x33\x0c\x86\xc0\x02\xd2\xae\xdb\x4b\x8a\x7f\xea\xb5"
- "\xfd\xb1\xfb\xea\xe6\xaa\xbd\x8b\xfb\xa3\x76\x5c\xb5\xa5\x02\x06"
- "\x4b\x0b\x0d\x6b\x44\x34\x32\xb4\x11\x51\x46\x98\x79\xee\x7b\xce"
- "\xbd\xcf\xc3\xcc\x00\x03\xc3\x88\x7f\xda\x9f\x7c\x3e\xcf\x67\x78"
- "\xee\x73\x9f\xfb\xdc\x7b\xce\xf7\x9e\x73\xee\xbf\x73\xf8\xb8\xb5"
- "\xa2\x18\x78\x66\xb8\x48\xc6\x60\x8c\x0d\xbd\x8e\x9e\xa9\xd5\xc1"
- "\x58\x5a\xb9\xeb\x00\xc8\x8b\x2a\xfd\x45\x32\x0c\xf7\x52\xa0\xbc"
- "\xc1\xbd\x9a\x34\x08\xd2\xf3\x77\x55\xb9\xce\xa9\x99\x9b\x60\x6c"
- "\x5b\x5e\x04\x63\x59\xc3\x59\x32\x86\xef\x8d\x78\x7f\x25\xce\xe9"
- "\x50\x43\xc2\x06\x21\x6f\x57\x35\x9e\x81\xac\x85\x11\x21\x35\xa4"
- "\x6c\x10\xf2\x77\x55\x43\xb9\x0d\x86\xa5\x64\x24\xea\x37\x9c\x1b"
- "\xe2\x98\x31\x63\xb9\x0d\xe8\x9f\x4c\xa0\x09\x32\xaa\xdc\xad\x15"
- "\x94\x15\x29\x45\x02\x61\x7b\xbf\x01\x67\xf2\x46\xf2\xfe\x41\x1a"
- "\xb4\x5b\x8b\xb1\xff\x70\x9e\xc7\x62\x87\x7a\xe6\xef\xd6\xc2\xb3"
- "\x10\x78\x76\x1e\x7e\x05\xf4\x55\x86\xfe\xb1\xa1\x7c\x0d\x96\x4f"
- "\xf3\x76\x6b\x79\xdd\x6d\x2c\x6f\x23\xf9\xc7\x04\xcc\x23\xf9\x40"
- "\x13\x0c\x09\x01\xf8\x1c\xcf\xd4\x3a\xe1\x3d\x0b\xf4\x50\xfe\x4e"
- "\x7d\xd7\x3b\xa2\xfd\x0c\x7d\xd9\xfc\x1e\x2d\xf8\x6f\x3b\xe4\xad"
- "\xc0\xbd\xa6\xdc\x96\x35\x57\x88\x7d\x1d\xec\x63\xf3\x5e\xf1\x7f"
- "\x55\x57\x5e\x43\x02\xd1\x5f\x26\x1a\xb6\x5e\xfa\x52\x00\xc8\x5e"
- "\xb3\x1a\xe8\x40\xdc\xca\x3c\x85\xe5\x15\xa2\x6f\xb5\x64\xa2\x02"
- "\xb9\x3c\x1c\xea\x8d\x31\x26\x4e\xe0\x1c\xac\x48\x9b\x26\xe0\xd3"
- "\xce\x75\xdc\x7f\xde\x9e\x22\xc0\xbe\x7e\x35\xd8\x03\xab\x89\x6a"
- "\xb5\x93\x84\x63\x3b\x81\x6f\xcd\xb8\x5f\x1a\xc7\x6e\x48\x1b\xce"
- "\xc3\xdd\xd3\xa0\x2d\xd3\x57\xa7\xd0\xa6\xd5\x2d\xb4\xb9\x26\xa5"
- "\x9e\x80\x9e\x19\x59\xab\xab\x43\x5f\xcf\x27\xb0\xad\x38\xf7\x08"
- "\x34\x9d\x66\xc5\x6f\xe4\xef\x9e\x8e\x67\x60\xd8\x3c\x81\xfc\xbd"
- "\x4a\xe9\xbc\xd0\x66\x76\xa6\xc8\x3c\xb5\x6b\xbe\x2b\x83\x1e\x10"
- "\xeb\x52\x25\xe0\xff\x19\xec\x2c\xdf\x30\x1c\xff\xe0\x9c\xc6\xc2"
- "\x97\xb7\x76\x9d\xbd\xe0\x73\x03\x66\x9d\x9b\x0f\x2b\xf6\x2e\xce"
- "\x11\xe0\xbb\x71\x0e\x7a\x71\x9d\x98\x17\xdf\x8d\x7b\x79\x21\xc5"
- "\x77\xe1\x9d\x6d\x5d\xef\x78\x9c\xdd\xf9\x07\xb7\x2b\x80\xb6\xf8"
- "\xbf\x0d\x68\x29\xee\x8d\xd2\xf2\x75\x6d\x73\x83\xb4\x96\x6c\x25"
- "\xef\xaf\x47\x3c\xf5\xee\x9f\x79\x9f\xc2\xd3\x9f\xd0\xbe\xc3\xe8"
- "\xeb\x08\xd2\xc3\x25\xbf\x3f\xf0\x7f\x04\x94\xc5\xcf\x36\xb9\xf9"
- "\xf3\x2a\x76\xf3\x0d\x68\xb0\xd1\x93\x88\x13\x90\x2b\x01\x67\xc8"
- "\x3e\xf4\xcd\x90\xc2\xcf\x3f\xed\x3b\x88\xf5\x6c\x24\xfb\xd6\xc3"
- "\x7d\x28\xf7\x3b\xb0\xef\x55\x51\x7e\x24\xc4\x39\x1d\xa1\x56\xf8"
- "\x26\x9e\xe5\x71\xbb\xcf\x02\x79\xa2\x86\x7c\xef\x72\xdf\x79\x6c"
- "\x45\x51\xd6\xed\xb9\xb1\xdb\x7d\x4c\xb7\x7b\x6d\x1b\xf4\x1b\x6f"
- "\x6b\xe6\x45\x63\xd8\x7c\x61\x56\x48\x36\xd1\x19\xbe\x21\x01\x80"
- "\x95\x53\x58\xb7\xda\xe6\x16\x6c\x53\x28\x35\x45\x11\x4b\xb3\x83"
- "\xdb\x96\xa0\xd3\x1b\xc7\x43\x9e\x6f\xc8\x28\xdc\xcf\x8d\x71\x26"
- "\x20\xff\x19\xee\x17\x7a\xff\x53\x0b\x56\x0e\x23\xc2\x73\x09\xc3"
- "\xa9\x3c\x3e\x01\xd7\xec\x76\x74\x58\x03\x71\xfd\x4a\xff\x06\x60"
- "\xd2\x49\x46\x01\xc6\x9a\x30\xa6\x17\xc6\x5c\xff\x3f\x1d\xcd\x81"
- "\x16\xc7\x31\xa2\x7b\x9e\xc8\xcf\x90\xfd\xf1\x8a\x2c\xa2\x58\x77"
- "\x9a\xa8\x81\xaf\x8e\xfd\x8e\x68\x22\xf9\x0d\x28\x1b\xc9\xcf\x3c"
- "\x97\x81\x7c\x5d\xa1\xa1\xf6\x76\xd3\x3f\xb7\x5b\xc9\x9b\x66\x69"
- "\x8c\x5d\xc8\x63\x49\x28\xe0\xfb\xa3\xe5\xa2\x8f\x04\x4e\xdb\x7f"
- "\x7e\xc3\xcf\x4f\x85\xdd\x0f\xef\x58\x5d\xf6\xf7\x7e\x71\x1f\x61"
- "\x45\x21\x97\x7d\xfb\x53\xf7\xc3\x68\x69\x0d\xdf\x7b\x10\xd6\x6e"
- "\xda\xaf\xea\xda\x7b\xc0\xe6\xad\xf6\xa7\x02\x0f\x0b\xb9\x6d\x5e"
- "\x51\xb8\xd0\xa9\x14\xfb\x20\xa6\xbf\x59\x81\xef\xc2\x7b\xa1\x6d"
- "\x6c\x8e\x69\xff\x4c\x17\xd6\xf6\xe3\xba\x8d\x0c\xda\x04\xe5\xfd"
- "\x73\x0d\xb6\x0b\x69\x02\xf9\x00\x67\xff\xcc\xdb\xbf\xcd\x8b\x0f"
- "\x55\xe5\x5b\x29\x0e\x36\x07\x72\xb2\x0a\xf0\x74\x16\x78\x70\x0b"
- "\xfa\x49\xb2\xc0\x77\x6a\x36\x77\x90\x1a\xcd\x05\x52\x0b\xff\xe3"
- "\x1e\x63\xf3\xf3\x27\x49\x93\xb6\x77\x7d\x03\x3a\x0b\x64\xdd\x9b"
- "\x76\x2c\x0b\x65\x01\xee\xcb\xb2\x80\x06\xab\xb5\x41\x59\x4d\x84"
- "\x95\x51\x23\x34\x93\x9a\x4c\x1c\x67\x39\xeb\x6a\x37\x1f\x23\xb5"
- "\x9a\x4f\xd9\x77\xd0\x26\x34\xa7\x5d\xe8\xa3\xec\xb7\xc0\xae\x7f"
- "\x4b\x23\x96\xdd\x02\x65\x87\x79\x2f\xfb\xa4\x76\x60\x65\x0f\xa4"
- "\xde\x27\xd5\x03\x29\x1b\xf4\x4c\xaa\x45\xc3\xcf\x6b\xe9\x47\x93"
- "\x60\xe7\x25\xf4\x91\x39\x8e\xf2\x7d\xae\x07\x1f\x66\x67\xba\x4c"
- "\x6c\x1f\x71\x0a\x3b\xdb\x75\x8e\xb0\xbd\x8a\xfc\x3c\xd7\x29\x82"
- "\xfb\x1c\xda\x4d\x07\x23\x5d\x63\xa5\xae\xf5\x27\xb0\x55\x0f\xc6"
- "\xf3\xfd\x8c\xbb\x52\x38\xae\x0e\x06\x62\x59\xbd\xd7\x63\xf7\x7a"
- "\xbe\x2f\xf6\x60\xbe\x34\xff\x72\x21\x68\xf7\x7a\xb1\x2c\x6d\xf7"
- "\x79\x3d\x29\xa8\x67\x72\x66\xba\x14\x1f\x34\x5d\x3c\x56\xfa\x44"
- "\xf2\xe2\xe4\x25\x19\xc9\x49\xda\x79\x2b\xd3\x96\x4d\x5e\xfe\xec"
- "\xb3\xda\xb9\xc9\x2b\x56\x2c\x7a\x2e\x79\x18\x99\x97\xb6\x68\xd9"
- "\x8a\x25\x38\xf7\xa6\xd5\x4e\xff\xcf\x85\x29\xcb\xd3\x27\xff\x74"
- "\x7a\x54\xb7\xb9\x37\x3c\x83\xd8\x80\x36\x38\xe8\x8e\x51\x7a\x27"
- "\x19\x81\x3e\x6f\x42\x5f\xa6\xe6\x57\x60\xfc\x07\xf8\x3b\x83\x7a"
- "\x0a\x75\x03\x8e\x0d\xd0\xdf\x1e\xc8\xef\xea\x8d\xaf\xd3\xba\xd3"
- "\xa4\x1e\xed\xca\xfa\x2d\xdc\x77\x5c\x03\x8c\xc9\x6d\x3c\x66\xdd"
- "\xe7\xc7\xd1\x2f\xdc\x6f\x21\xcd\x16\x54\x51\xb8\xee\x4b\xa2\x00"
- "\xbd\x06\xe3\x92\x0f\xca\xa8\x7c\x28\x2d\x1c\x45\x0f\xd0\x93\x1a"
- "\x22\xfa\xc3\x96\x5b\xac\x76\x5c\xa7\x57\xc6\x39\x0c\x14\xe5\x29"
- "\xef\x5b\x1f\x6c\xe2\x74\xf9\xa3\x92\xef\x17\xfe\xfc\x3d\x1c\xc3"
- "\xe4\xb0\x98\x82\x1f\x40\xff\xdf\x9b\xee\x92\xd3\x96\x2a\xd1\x76"
- "\xc4\x75\x8a\x97\x1a\xe1\x9e\xfb\xe4\xf8\xa0\xde\x73\x0f\x46\x15"
- "\xe8\xe5\x4f\x5b\xf8\x85\xef\x1c\x56\xf1\x0b\xff\x77\xbf\x3e\xdf"
- "\xca\xaf\xee\xe9\x57\x7a\x49\xdf\xf7\xf7\xfd\x3a\x63\xdf\x97\x2f"
- "\xdf\xc7\xdf\xeb\xd9\xfe\x2b\x79\xbf\x2e\xaf\xaf\x0b\xf1\x06\xd8"
- "\x6a\xf8\xed\x97\x44\x09\xf8\x5c\x5f\xf4\x0c\x60\xfa\x38\xd1\x64"
- "\x39\x68\x93\xe1\x29\x12\xae\xff\x86\x60\x4c\xb7\xe6\xf4\x4c\xda"
- "\xa4\xbf\x84\x36\x69\x1d\xc6\x38\xa9\x28\x6e\x24\xaa\xa2\x46\xa2"
- "\xae\x4d\xc7\x78\xaf\xe8\x17\x0b\xbe\x86\x14\x82\xfb\xea\x0c\x3b"
- "\xf9\xd8\x76\x1e\xf7\x2d\x99\x6b\x13\x41\xee\x34\x10\x82\xf8\x55"
- "\x25\x92\xb0\xb2\x51\xb4\x92\x9a\x52\x2b\xa9\x3c\x75\x3b\xa4\x1d"
- "\x7e\x47\x88\x09\x7c\x67\x55\x55\xa0\xf6\x19\xd4\xf1\x1f\x3e\x25"
- "\x62\xf3\x43\x7e\x56\xc8\xc2\x62\x90\x41\x3f\x39\xcc\xe7\xd5\xeb"
- "\x66\x70\x7d\x5e\x77\xab\x38\xdf\x04\xff\x5b\x98\xad\x08\xed\xa8"
- "\xc0\x18\x98\x58\xe6\x5f\x84\x0a\x16\x03\xf3\x9d\x55\x31\x81\x59"
- "\x8b\x88\xbc\xd6\x0a\x9a\x12\xe4\x20\x6a\x30\xe8\x77\xdb\xa1\x9f"
- "\xed\xdc\x34\x8a\x96\x40\xfd\x0a\x37\x8f\xa2\x79\x50\xa7\xf2\x76"
- "\xd3\x87\xd5\xa0\x7b\xcc\xe2\xba\x8b\x19\xfa\xc5\xf6\x22\xc8\x13"
- "\xb7\x92\x8c\x2b\x82\x7c\xc5\x90\x0f\xed\x64\x5e\xbf\x9a\xd7\x80"
- "\x06\x7b\xe0\x9b\x75\xda\xa7\xf1\xfe\x63\xe6\x03\x08\xbf\x0d\xed"
- "\x00\xdb\xf8\xe3\x70\xd0\x6d\x0a\xfc\x86\xf4\xdd\x76\xd3\x47\x20"
- "\xff\x0e\x64\x8a\xeb\xbe\x25\xbc\x9c\x8f\x12\x78\x7f\xdd\xd5\xb2"
- "\xae\x2b\x46\xe9\xae\x96\xa2\x55\xa0\xd3\x3b\x98\xbf\xc8\xf5\x38"
- "\xdf\x82\x36\x06\xb3\x2b\x9c\x24\x94\xcf\x0f\x80\x6d\x91\x02\x72"
- "\x00\xec\x09\xb6\xc7\x19\x6c\x09\xa8\xcb\x7a\x8c\x95\x87\xcf\x61"
- "\xdc\xb6\x07\xf4\xf2\x4e\xb4\x03\x9e\xbe\x38\x9b\xe0\x1c\x3b\xc6"
- "\xb9\x5c\xb1\x80\xda\x79\x0c\x92\x8f\x2a\x24\x5b\x00\x65\x10\xea"
- "\x7f\xb0\x85\x15\x9d\xc0\x43\xc0\x40\x15\xd8\x16\x23\xce\x90\x8f"
- "\xda\x44\xda\x57\x31\x9d\x9f\xc1\xfc\x1b\x07\x70\x19\xfd\x31\xee"
- "\x85\x57\xc1\x37\xaa\xac\xa4\x9e\xcd\x85\x73\x19\xf3\xb1\x5a\xd2"
- "\xe3\x38\xe6\xb5\x42\x19\x14\x64\x99\xf8\x0c\xda\xbf\xaf\x49\xfa"
- "\x26\x3c\x33\x8b\x34\xab\x06\x9a\x61\x99\x6c\xec\x0f\x36\x57\xa1"
- "\x48\x9b\x6a\xb4\x2b\xc4\x77\x53\xa4\x72\x71\x5c\x2e\x80\x5d\x81"
- "\xf4\x42\x3a\x41\x39\xd5\xa2\x1c\x3b\xcc\xed\x97\x9a\x97\x09\x5f"
- "\x6f\x2f\x01\x5e\xaf\x71\xd1\xff\xe3\xed\xee\xf4\x87\xf7\xd7\x88"
- "\xbc\x9c\xe0\xc6\x3b\x18\x1b\x55\x3b\x70\x9e\x14\xea\x58\xc9\xe7"
- "\x78\x3e\x3e\x85\x7e\xc5\xd0\x8f\x31\xd0\xb8\xb2\x10\x7d\xe6\x82"
- "\x6c\xce\xf9\x12\x64\xee\x33\x68\x3f\x55\x8b\x7e\xb1\xaa\xd7\x20"
- "\x86\xe1\x9e\xcd\xc3\x37\x41\xbd\xb0\x3c\xb8\x9f\x0f\xbf\x60\xc7"
- "\x56\xcf\x75\x8f\x49\xeb\x8a\x47\x5b\x3d\xdd\x75\xce\xe0\x63\x1d"
- "\x1f\x3f\x7f\xac\xc3\x39\x30\x96\xbf\x33\x05\xeb\xd6\x80\xfd\x52"
- "\x6a\x2b\xc6\xa6\x85\x74\xb4\xfd\x1b\x90\x6f\x52\x3a\xfa\xdb\x05"
- "\x3e\xa9\xe0\x5b\xc7\xc5\x3a\xe1\xbd\x12\xee\x59\xcc\x01\x8c\x53"
- "\xbb\x0e\xdf\xd1\xbb\xde\xc1\x7e\x03\x18\x0e\x85\x3c\x47\xe0\x97"
- "\x4a\x79\x79\xfc\xda\xea\x05\xbf\xef\xc0\x39\xb0\xea\x74\x29\x7e"
- "\x2d\xc6\xae\x45\x99\x51\xf4\xb4\x07\xed\x91\x36\xdb\x81\x57\x0c"
- "\x77\xfb\x1d\x15\x40\xef\x1a\xb0\xff\xff\x9f\xe8\xe3\xae\x7a\x81"
- "\x58\x3f\x33\x8f\xc7\x70\x70\xfd\xe6\xdf\x49\x3e\x16\x6a\x5c\xeb"
- "\xff\x5d\xb6\x65\xf5\x02\xc4\x24\x94\x55\x8d\xfc\x47\x3b\x11\xf2"
- "\xa5\x76\x61\x8b\x9d\xe3\xad\x6e\x41\xfb\x52\xac\x3f\xe2\xa5\x46"
- "\xa4\xdd\x7a\xf7\x7e\xe7\xde\xcf\xa1\x0c\x18\xff\xef\xef\xc2\x80"
- "\xd4\xaf\x39\x0e\x6a\x4f\x89\x36\x45\x15\xfa\xbb\x85\x72\xcd\x68"
- "\x83\x73\xbd\x5a\x5b\xb1\xbf\xc1\x81\x73\xe8\x87\xe1\x1e\xfa\x77"
- "\xed\xfa\x0b\xc3\x2a\xd1\xf6\x05\xb9\x51\x0b\x74\x98\xc2\x7c\x40"
- "\x20\x5d\xa4\xfe\xba\xee\x69\x1c\xfb\x45\xf1\x3e\x9b\xd9\x44\x6a"
- "\xed\x2d\x44\xdc\xc3\x0f\x7d\xf6\x14\xae\x9d\x9e\x01\x0c\x29\xb1"
- "\xff\x02\x7f\xb7\xa3\x6f\x66\xa0\x63\xdd\x9a\xd7\x59\xbf\x55\x61"
- "\xbf\xed\x44\xdf\x10\xf0\x9d\x03\x89\x31\x50\x6b\x33\xeb\xc7\xe8"
- "\xf3\x63\x23\xd0\x0e\x63\xc5\xc2\xb7\x8d\xd2\xde\x63\xc4\x08\xfa"
- "\xf8\x10\x71\x52\x85\x7d\x59\xa4\x9d\x02\xf2\x95\x4b\x7d\xcf\x8d"
- "\xff\x2c\x4f\xb7\xfe\x16\xca\xfb\x5b\x6d\xbd\x44\x6b\x07\xeb\xc7"
- "\xd5\xe9\x0e\xe8\xc7\xee\x34\x45\x7a\x22\x5d\xdb\x4d\x16\x28\xeb"
- "\x40\xb8\x44\x53\x17\x3d\x2d\x2b\x45\x9e\xd7\xf1\x39\x26\x4b\xb4"
- "\x38\xff\xd4\x45\x43\x11\x7f\x18\xe3\x13\xe7\x9a\xea\x80\x9e\x95"
- "\xf8\x7d\xc4\xc8\x46\x51\x66\x1d\xb0\x21\x46\x2c\xd0\xff\x1f\x6f"
- "\x76\xc9\x8e\xea\x4c\x36\x66\x01\x3e\x71\xfe\x58\xde\x64\x7e\x34"
- "\x7a\x91\x1d\x56\x52\x93\xe8\x92\x4f\x96\x9d\x12\x1d\x24\x4c\x4a"
- "\xfd\x1e\xca\x70\x7a\xca\x1f\xcb\x09\x28\x63\x24\xca\x37\x97\x0d"
- "\x65\xb1\x79\xca\x37\x4b\x3d\xca\x37\xc4\xb5\x2e\x03\xe7\xd8\xb8"
- "\xbe\xb2\x92\x0f\x8d\x9e\x32\xe9\xc3\x95\x7c\x6f\x00\xb7\xb9\x10"
- "\x5b\xba\xa7\x79\x7e\xd4\x61\x90\x9f\x8d\xc5\x45\x9d\x87\xf3\x84"
- "\x98\x96\x2a\xd2\xab\x01\xf2\x1f\xc0\xf3\x90\xe8\x03\x61\x78\x03"
- "\x1f\xeb\x81\x9c\xae\x44\x5f\xd7\x90\x2f\xb2\x16\xec\xfc\xce\x5c"
- "\x2e\xbb\x25\x59\x41\x17\x27\x0c\x7f\xa9\x99\x04\xe9\x7e\x4a\x4f"
- "\x9e\x26\x87\xd0\x1f\xb7\x1d\xfd\x2d\x42\xd9\xda\xd3\xe4\xd3\x23"
- "\xf0\xdd\x30\xf1\x57\x03\xbf\xef\xc1\xef\x68\xf8\x7d\x1b\x7e\x6f"
- "\x87\xdf\x22\xc8\x2f\x88\xf9\xa3\xe0\x7e\x25\xa4\xff\xa7\xf8\x0b"
- "\x75\x3c\x84\xfb\xef\xe3\x45\xdb\x11\xd3\x67\xe1\x3d\xfc\xfe\x58"
- "\xe4\x79\x35\xe7\xf9\xa1\x1f\x41\x39\x99\x50\xff\x7a\x4b\x03\x2b"
- "\x4b\x77\x9a\x7c\x72\x19\xcb\xc6\xf3\xc9\xf0\xff\x0e\x37\x1b\x14"
- "\xca\x39\x74\x14\x7e\xa7\xc2\xef\x26\xf8\x4d\x87\xdf\x17\x45\x1a"
- "\xd4\xa1\x6c\x48\xca\x64\x34\x67\x32\x82\x7f\x8f\xf7\x79\xd4\xc3"
- "\x2e\xd9\xf1\x51\x75\xd2\x02\xce\x6f\x2b\xa9\x65\x38\x80\xbc\x0f"
- "\x63\x5e\xf8\x7d\x54\xfc\x8d\x11\x7f\x67\x88\xbf\x3f\x13\x7f\xa7"
- "\x8b\xbf\x30\x1e\x3d\x94\x2e\xda\x18\x40\x97\x43\xe9\x6c\xdf\x53"
- "\xde\xae\x6d\xfc\x1b\x9f\xac\xc7\x31\x32\xc8\xf1\xfb\xa0\xfc\x80"
- "\x76\xd3\x27\x4a\x69\x7e\x14\xe7\x7c\x3a\x4d\x07\xdf\xd9\xc8\xd6"
- "\xb5\x3f\xd1\xba\xc9\xb6\x05\x2a\x59\x0c\x01\x1b\xe8\xd6\x32\x39"
- "\x15\xe7\x0f\x3f\xc9\x94\x8b\xeb\xc2\xa2\x1f\xfd\x00\xf4\x2d\xc7"
- "\xc6\x43\x41\x9d\x38\xaf\xdc\xc0\xe6\x8e\xd1\x0f\x5a\x50\x45\x22"
- "\x5c\xa9\x30\x36\xd0\x49\xf2\x1b\xc7\x3d\xa2\xcf\xca\x03\xf0\xad"
- "\x42\xd7\x58\xfd\x93\x69\x7c\x0d\xed\xb6\x18\x48\xdf\xe6\x4a\x3f"
- "\x84\xe7\x1d\xef\x03\x7a\xd6\x43\x7b\xa6\x36\x92\x4f\xd0\x1f\xfe"
- "\x7f\x34\xf1\x36\x47\x49\x6d\x16\xf9\xa1\x93\xe8\xdb\x44\x0e\x65"
- "\x81\x2c\x4c\x43\x0c\x37\x76\xc9\xd9\x43\x6c\x5e\x57\xc4\x08\xf0"
- "\xf2\xd0\x7d\xc8\x53\xb7\x3e\xe8\x2e\x83\xc2\xda\x4d\x9f\x46\x7a"
- "\xca\x94\x8f\x23\x51\xa6\x20\x36\x40\x7e\x23\xaf\x55\xdd\xfa\x5f"
- "\x3d\xf6\x3f\xde\xef\x3e\x4d\xf1\x7c\xd7\x52\xef\xe0\xfd\xae\x1e"
- "\x70\x06\xf8\xac\x6b\x41\xfe\x58\xc9\xa7\x33\xc5\x3e\x5d\x0f\x7d"
- "\xfa\x3e\x48\x3f\xcc\xeb\xca\xd3\xc5\x6f\x01\xce\xea\xb0\xdd\xb7"
- "\x4b\xe9\x62\x7b\xb1\x1c\xf4\xa7\x3e\x5a\x4a\x17\xcb\x07\x3c\xd6"
- "\x55\x62\x3f\x91\xd2\xc5\x36\x81\x1d\x75\x98\x48\xf2\xa4\x90\xe3"
- "\x2d\x4f\x7a\x0f\xf9\x86\xfe\xa6\xf8\x1c\xff\xa7\xb8\x86\xba\x15"
- "\xf5\x43\xce\xd3\x44\xf5\x52\x29\x09\xe6\xfd\xf2\xd3\x16\x4f\x19"
- "\xf9\x59\x0d\x35\x85\x3a\xa8\xb2\x22\xa1\xc6\x31\x55\xb2\x57\xcb"
- "\xe0\x3b\x29\x52\xac\x64\x97\x4f\xfe\xc3\x9b\x6a\xb6\x76\xd1\x17"
- "\xeb\x52\x28\xd5\xc5\x4d\x3f\x33\x1e\x60\xdd\xb0\xac\x1c\xb0\xd7"
- "\xdb\x40\x2e\x70\xb9\x7d\xb8\x52\x8a\x21\x5f\x2c\xea\x2d\x8c\x5b"
- "\x5e\x9c\xc1\xe3\x98\xa3\x6e\xc4\x3d\x3e\x02\xce\x63\x65\x3a\x49"
- "\xad\x0e\xc6\xf2\x99\xa7\xc8\xc2\x97\x87\xa1\x4f\x95\x04\xa8\xeb"
- "\x5f\xa1\x6e\xdb\x9c\x38\xf7\xbf\x0c\xc7\xa9\x9f\x25\x3b\x33\xa8"
- "\x5d\xa4\x19\xf4\xa3\xcf\x66\x89\xb4\x45\xf9\xc5\x7c\xf2\xe5\xe8"
- "\x79\x7c\x1d\x9c\xcb\xc1\xfe\xf1\x7b\xd4\x63\x1a\x6a\x3f\x50\x86"
- "\x7d\xe5\xc8\x1c\xc9\x26\x85\xfa\x6e\xe5\x36\x61\xed\x9f\x98\xcf"
- "\xa1\xbc\x8a\x04\x3e\x17\x78\xe4\x28\x6f\xfb\x11\x33\x5f\xe7\x66"
- "\xfe\x24\xf1\x7e\x7b\x80\x66\xd4\x1f\xf9\xbe\xac\x83\x1f\xf1\x3d"
- "\x25\x47\xba\xe2\x7f\xb8\xd9\x8a\x07\xb8\x3f\xa8\x23\x15\xae\x3e"
- "\x71\x24\x0f\xdf\x83\xf7\xf7\x42\x7a\x9d\x2b\xbd\xb6\x5c\x9c\xef"
- "\x5a\x10\x92\x1d\x83\x7b\xcb\x6e\x45\xbf\xd4\xfc\x7b\x9f\x45\xb1"
- "\xef\xb3\x39\x0f\xe8\x9b\x62\xff\x45\x3a\xa3\xce\x66\x7d\x18\xfa"
- "\x2f\xf6\xe3\xce\xfc\x8a\x44\xb8\x78\xbf\xe5\xba\xf9\x00\xeb\xb7"
- "\xac\xcf\x7e\x16\xe3\x56\x0f\x3b\x9b\xf7\x42\x7e\xbe\xa2\x51\xc1"
- "\xb3\x05\xa0\x57\x0f\x8b\xcf\xd8\xde\x3b\xf4\x1b\xe2\xb8\x44\x6d"
- "\xb8\xb6\x8d\x6b\x9d\x78\xf6\x2a\x14\xd0\x8d\xbe\x3e\xa4\xb5\xea"
- "\xb9\x2d\x06\xea\xc4\x75\xa7\x4b\xb4\xad\xa4\xcb\x2f\xfe\x67\xe5"
- "\x2e\xbf\x3d\x47\x94\x62\xbb\xf0\xbc\x4e\x19\xdf\x0b\x76\xf8\x32"
- "\xb7\xa9\x0e\xdb\x11\xa7\x16\xc0\x1e\xfc\x96\xf2\xd8\xb6\x9f\x35"
- "\x49\xd8\x83\x7e\x99\x74\x9a\x7c\xbe\x72\xfd\x28\x5a\x0a\x3c\x2d"
- "\x85\xbe\x94\x0a\xf7\x8b\xe0\x37\x89\xff\xca\xd4\xf8\x2b\xf6\x91"
- "\xd2\x76\xd3\xe7\x5a\x29\xa6\x37\xd2\xa6\x2d\xe8\x64\x0c\xe2\xac"
- "\x18\xe8\x80\x58\x63\xeb\xc8\x50\x6f\xc4\x17\xe2\x0c\x31\x16\x9a"
- "\x3d\x9b\xe1\x8c\xf9\x15\x80\x74\xac\x2f\xe2\x0c\xca\x4a\x95\x7c"
- "\xe2\x5a\xc9\xe7\x6a\xbe\x9e\xf3\xb9\x51\xda\x4b\x8b\x6b\x49\xe9"
- "\x77\x92\x5b\xa1\x5c\xed\x01\x2d\xf3\x3b\xf9\x95\xc5\x31\x83\x60"
- "\x5e\x5c\x87\xe3\x72\xf2\xb6\xdf\xc3\x3b\x7b\x5c\x34\xff\x38\x92"
- "\xad\x19\x2d\x60\x73\x91\xb7\xc0\xb3\x3a\xf7\x71\x86\x95\x7c\x50"
- "\x86\x63\x0d\xdc\xdb\x77\x77\x18\xd1\x02\x6e\x41\x8e\x7d\xde\x26"
- "\xd9\xb5\xf7\x86\xe1\x7a\xfe\x07\x33\xa1\x7e\x0d\x3c\x4e\xf9\x07"
- "\x53\x61\x2c\xd9\xeb\x7a\x3c\x60\x6c\x2a\xce\xf5\x88\xb1\x6c\x1a"
- "\x70\x1e\x0b\x7d\xff\x9f\x26\x5f\xac\xac\x41\x1f\x1f\xcb\x7b\xfa"
- "\x44\xd6\x67\xd2\x8b\xe8\x17\x59\x9b\x46\x6e\x69\x24\x5f\x24\xe0"
- "\xbc\x91\xe1\x3c\xce\xd1\xd4\x67\x79\xce\xd1\xd4\x57\x8b\x97\x95"
- "\x90\xa3\xd3\xdd\xae\xc3\xe2\x6f\x7c\x3f\x57\x8b\x98\xd7\x4e\xc8"
- "\x31\x85\x48\xab\x4f\xdb\x4d\xf5\x5d\xf3\xbf\x88\x4b\xec\xdb\xb8"
- "\x8f\x03\xe7\x9c\x64\x0e\x82\x3e\x45\x80\x4f\x50\xef\x9c\x49\x4f"
- "\x98\x57\x21\x8e\x8e\xb2\x58\xdf\xe8\xaf\x77\x60\x7b\x89\x8e\x32"
- "\x7e\x72\xdf\x99\xf5\x87\xe1\xdb\x27\xd7\x9d\x23\x0a\x5d\x1a\xb9"
- "\x03\xe7\xbf\x43\x9d\xd4\x8c\x63\x5c\xc4\xc4\x16\x16\x43\xe6\xe8"
- "\x91\xf4\xd5\x44\x0e\xcf\xc7\xc1\xff\x07\x24\x3b\x09\xde\x51\x07"
- "\xd8\x49\x18\xda\x47\x8f\xae\x26\xe3\xda\x4d\x47\xb7\x4a\xbc\x42"
- "\x1b\x02\xe7\xe1\xc4\xb9\x04\xa8\x6b\xfd\x09\x7c\x0f\x7d\xba\x5b"
- "\x19\xdd\x98\x1c\xc6\x32\x54\x50\x9f\xc2\x80\x36\xa2\xe6\xba\xe7"
- "\x28\xe0\xff\xa0\x68\x33\x1e\x2d\x07\xec\x1f\x76\xd5\x53\x73\xab"
- "\xdb\xff\xf3\xf1\xfd\xd0\x36\xb4\xcf\xbc\xd1\xe7\xd8\x8f\x24\xfa"
- "\xe0\x7e\xd5\x50\x18\x27\x30\x7e\x3b\x68\x0b\xd4\xad\x5a\xb7\x8a"
- "\x28\xcf\x90\x2f\xee\xdc\xf2\x3a\x3b\x3f\x57\xc5\xe7\xe7\xbf\xb8"
- "\x55\x1a\x87\xf3\x7a\x1f\x3b\x11\x9a\x1d\x40\x70\x5e\x1d\xfd\x98"
- "\xb1\xbd\x7e\xdf\x69\xd8\x5c\xba\xc5\x31\x8d\x98\xf5\x0f\x60\x1e"
- "\xc9\xae\x6a\xb8\x60\xd0\x90\xfd\x9a\x69\xd0\x8f\x8f\x6d\x87\xbe"
- "\xa2\x1b\xf8\x9e\xca\x63\xdb\x45\xfa\x56\xf3\xbd\x08\xc7\x56\xa3"
- "\x2e\xc1\xb1\x3f\xe8\x91\x03\xa8\xa3\xdb\x4d\x5f\x28\xa5\x7e\x03"
- "\x7a\xe3\x00\xbc\xc3\xf7\x58\xe7\xe1\xfa\xef\xb1\x4c\xf4\xed\xc0"
- "\xc6\x0d\x3c\xbf\x8a\xcf\xf9\x7f\x31\xad\xcb\x96\x86\x7c\xf8\x1e"
- "\xdf\xa3\x76\x2c\x7e\xa1\x53\x06\x34\x3d\x16\x8f\x6d\xe3\x58\xd4"
- "\x3c\x09\xf9\x53\x5d\xfd\xf6\x28\x93\xcd\xfb\x5b\xdc\xfb\xe5\x17"
- "\x85\xae\xf1\x66\x7d\xcc\xe4\xf5\xa4\xd7\x7d\x35\xba\x10\xd4\x55"
- "\x5f\x38\xd7\xad\xa3\x5b\x4b\xe4\xc2\x23\x39\xc5\x44\x25\x2b\x04"
- "\xb2\x61\x3f\xcb\x48\xbc\xf5\x34\x69\x08\x0e\x55\xdd\x16\xff\x68"
- "\xfa\x50\xaa\xd7\x10\x79\x51\xeb\x50\xe5\x9d\xf6\xdb\xb6\xd2\x80"
- "\x49\x4f\xcc\x4d\xb7\x13\xed\xf3\x25\xe4\xeb\x54\x12\xf0\x28\x8c"
- "\x16\xee\x56\x11\x9d\x95\x7c\xa9\xc1\xb3\xa0\xfb\x55\x68\x7f\x7c"
- "\xa9\xc1\x32\xb3\xca\x88\x32\xab\x89\x36\x17\x3e\x1b\xa8\x04\x7d"
- "\xa0\xde\x08\x18\x1b\xae\xba\x6d\x6b\x27\x94\xb1\x2f\x91\xbd\xb7"
- "\xd3\x7b\xdd\x1a\xde\xe8\xbd\x6e\xba\x51\x50\xb7\x3f\x0d\xac\x6e"
- "\x5f\x55\xb8\xea\xf6\x55\xc5\x95\xd7\xed\xf8\x7d\x6e\x75\x53\xbb"
- "\xea\x96\x02\x75\x3b\x3e\x63\x60\x75\x3b\x91\xe0\xaa\xdb\x89\x04"
- "\x1f\xeb\xb6\xbd\x8f\xba\x1d\xea\xbd\x6e\x99\xb7\x41\xdd\x4e\x0c"
- "\xac\x6e\x8d\x76\x57\xdd\x1a\xed\x57\x52\x37\x1c\xcb\xeb\xc3\xe9"
- "\x29\xe6\x7b\x3d\x8d\xa8\x70\xef\xde\x69\xf2\xd5\xc3\xfa\x32\x76"
- "\x3f\xf2\x34\xf9\xd2\x29\xf6\x6f\x9b\xa1\x8d\x9e\xe4\x76\xce\x97"
- "\x4b\xa6\xe8\x70\xbf\xeb\x97\x89\x80\x65\x0d\xc7\xf4\x57\x6c\x7f"
- "\x83\xc1\x46\xc5\xfd\xa6\x5f\xe6\x6f\x66\xfb\x51\x2a\xc5\x7d\xfc"
- "\x5f\x56\x5f\x18\x56\xb1\x1e\xf7\x82\x08\xd0\x9f\xe9\xb0\x8a\xad"
- "\x18\x8b\xf2\x9d\x34\x9b\x9c\x9a\xd0\x27\x18\xfa\xf1\x53\x10\x5a"
- "\x50\xb1\xf3\x9d\x34\x3b\x8b\xc5\x9c\xc3\xce\xf1\x7e\x79\x40\x3a"
- "\xbb\x26\x7d\xc3\x16\x54\x59\x0e\xe9\x0d\x52\xec\x5b\x2a\x47\x7b"
- "\xa6\xa2\x14\xcb\x87\xf4\x36\x29\x3e\x2d\xe0\x3d\x4f\x94\x0d\x6d"
- "\xa1\xf6\xbe\xe4\xde\x57\x13\x25\xb9\xf7\x68\x3a\x09\xc5\x18\x8e"
- "\xeb\xf4\x43\x71\xcd\x11\xc6\xd3\x5f\x56\x20\xdd\xe3\xda\x86\xd2"
- "\xd0\x2c\x12\x80\x67\xf6\x70\x8f\x9e\x45\x63\x23\xe3\xb3\x48\x60"
- "\x5c\x26\x94\x69\x27\x89\xa1\x99\x50\x1e\xd0\x9a\x8f\x0d\xbe\x62"
- "\x73\x7c\xeb\xa1\x3c\x5c\xff\x0e\x48\x27\xaa\x47\x35\x06\x9a\xf3"
- "\x06\x51\xe0\xf9\x3e\x3c\xa7\xc7\xcf\xe8\x0d\x51\xb6\x9b\xbe\xda"
- "\x26\xb5\xcf\x07\xfe\x84\x70\xfe\x58\x4f\xb8\xf8\x63\xdd\xd4\x93"
- "\x3f\xd6\x20\xce\x1f\x2b\x71\xf1\xe7\xc4\x74\x4f\xfe\x58\x27\x7a"
- "\xf2\xc7\x9a\xea\x1f\x7f\xac\x49\x2e\xfe\xf0\x6f\x70\xfe\x58\xb3"
- "\x7a\xe7\x8f\x75\xbd\x8b\x3f\xd6\x08\xdf\xf8\x63\xfd\xd0\x3b\x7f"
- "\xac\x09\x7d\xf0\x67\x48\xef\xfc\x39\x31\xda\x77\xfe\x9c\x98\x3e"
- "\x00\xfe\x04\x73\xfe\x34\x66\xbb\xf8\xd3\xf8\x60\x4f\xfe\x9c\xf8"
- "\x13\xe7\xcf\x89\xad\x2e\xfe\x34\x36\x79\xf2\xe7\xc4\x87\x9e\xfc"
- "\x69\x54\xf9\xc7\x9f\x46\x85\x8b\x3f\xfc\x1b\x9c\x3f\x8d\xe1\xbd"
- "\xf3\xa7\x71\xaa\x8b\x3f\x27\xaa\x7c\xe3\x4f\xe3\x12\xef\xfc\x39"
- "\x61\x1f\x38\x7f\x1a\xf7\x76\xe3\x8f\xda\x3b\x7f\x1a\x9b\x06\xc0"
- "\x9f\x50\xce\x9f\xa6\x3b\x5d\xfc\x39\x79\xbc\x27\x7f\x4e\xce\xe2"
- "\xfc\x39\x19\xe3\xe2\x4f\xd3\x1a\x4f\xfe\x9c\x5c\xe2\xc9\x9f\x93"
- "\xdb\xfd\xe3\xcf\xc9\x6d\x2e\xfe\xf0\x6f\x70\xfe\x9c\xac\xec\x9d"
- "\x3f\x27\x0f\xbb\xf8\x73\x32\xc5\x37\xfe\x34\x05\x79\xe7\xcf\xc9"
- "\xd2\x3e\xf8\x33\xb4\x77\xfe\x34\xfd\xda\x77\xfe\x34\xad\xe9\x8b"
- "\x3f\x03\xb3\xf5\x9a\x58\x4c\x8a\x41\x28\xc7\xea\xad\x1c\xa4\x1d"
- "\xee\x3f\x14\x4c\x78\x7e\x6d\x88\x92\x9f\xd1\x68\x2a\xd5\xae\x22"
- "\x0f\x35\x92\x53\x93\x37\x0b\x81\x4a\x6a\x7a\x3b\x5c\x30\xfd\xf1"
- "\x00\xcd\x1e\xa2\x10\xb2\x87\x2a\xf0\xcc\xb5\xf7\x98\xd8\xa7\x8a"
- "\x02\x46\x93\xb1\x78\x6e\x2e\x07\xec\x65\xfc\xbf\xdd\x74\xaa\x14"
- "\x6c\xc1\xe9\x7d\x9d\xdf\xc2\xbd\x4e\xfb\xd7\xe0\xf8\xf6\xd4\x81"
- "\x2e\x7f\x17\x26\x9a\x89\x7e\xc3\x74\x77\xe1\x39\x8b\x53\x2d\xeb"
- "\x99\x1f\xaa\xdd\xe3\x63\xee\xa2\x5f\xe1\xd8\xe3\x34\x39\xfd\x0d"
- "\xcd\xdf\x3d\x1e\xf1\x00\xb6\xfa\x2d\x67\xc8\xe9\xa9\x5d\xfb\xf3"
- "\x68\xc2\x06\x71\x8e\xb0\x8e\xe7\x6d\xfe\x35\xcd\xdf\x55\x87\x31"
- "\x3b\x57\xe8\x31\x16\x65\xf3\xc3\x60\xfb\xfe\x00\xbf\x81\x3e\x91"
- "\xb6\xc0\x2f\xee\x93\xe1\x7b\x33\x4f\xcf\x63\xf6\x72\xce\xed\x1b"
- "\xf8\x5e\xb8\xe6\x89\x12\xee\xe0\x3b\xc3\xe0\x7e\x84\x68\xcf\x63"
- "\xfe\xe1\x67\xc8\xd7\x97\xdd\x9e\xab\xe0\xfe\x38\x94\x3d\x42\x7c"
- "\x1e\x0c\xf7\xfb\xd0\xce\x66\xfe\x3b\x8a\x8d\xe2\x1e\xe2\xaf\xb7"
- "\x41\x9a\x5a\xcc\x33\x02\xf2\xe4\xa3\xed\x2e\x96\x31\x12\xee\x97"
- "\xe2\x18\x58\x7c\x1e\x06\xf7\x8f\xe3\xda\x81\xf8\xfc\x56\xb8\xc7"
- "\xb9\xce\x1f\xf2\x33\x2f\x9d\x62\x1f\xfd\x9a\xf8\x77\x16\xfc\x6b"
- "\x36\x6e\x45\x1e\xf0\xb1\xc0\xd7\x6e\xfb\x7f\x4e\x37\x77\x7b\x96"
- "\xe4\xf6\xac\x5e\x7a\xc6\xf7\xa8\x7d\x6d\x74\x7b\x56\xd5\xed\x59"
- "\x99\xdb\xb3\x8a\x6e\x65\x56\xb8\x3d\x2b\xef\xf6\xde\x61\xb7\x67"
- "\xeb\xbb\x3d\xb3\xb9\x3d\x5b\x23\x3e\x0b\x68\x37\x35\x2b\x5d\x6b"
- "\x78\xa7\xd3\xc5\x74\x39\xa4\x6b\xdd\xd2\x93\xc4\x74\xf8\x7e\x73"
- "\xb4\x95\x94\x86\x8b\xe9\x8c\xf7\xbc\xfc\xe6\x78\xb7\xf2\xa7\xf2"
- "\x39\x8e\xe6\xa4\xae\xbd\x73\xc3\x2a\x6c\x42\x67\xc2\x06\x78\x16"
- "\x8e\xb8\x72\xc7\xf6\xb2\x0c\xed\x33\x2b\x9f\xd3\xa6\x25\xa7\xe3"
- "\xf6\x95\xa5\x4b\xd2\xb5\x4b\x97\x27\x25\x7b\xf8\x4f\x0f\x43\x5f"
- "\x82\x18\x7f\x0c\x7d\xb2\x88\xbe\xfe\x9b\xbb\xe2\x63\x80\x5c\x85"
- "\x6f\xd5\x59\xc9\x74\x36\x8f\xbd\x9e\xfb\x19\xc7\xb5\xb0\x66\xee"
- "\xbf\x85\xcc\x6e\x24\xcd\x47\x44\xff\x2d\x66\xc8\xeb\xf0\xee\xbf"
- "\xe5\x4c\x3d\xf3\x5b\x08\xf9\xb8\xff\x96\x33\x0d\xd0\xcf\x1f\xa5"
- "\xc3\x78\xbc\x0b\x1e\x07\xec\x1b\xc9\x36\xb1\x2d\xbc\xcc\x7c\xff"
- "\x19\xf9\x5c\x46\x77\x3f\xac\xbb\x15\xf8\x9e\xb8\x5e\xaa\x70\x7b"
- "\x3f\x85\x3f\x97\xf4\x83\xf8\xcd\xbc\xdd\x4a\xb8\x1f\xd6\x08\xf7"
- "\x6c\xfe\x9e\x3d\xfb\x86\xcf\xe5\xe5\xef\x56\x61\x9b\xb0\xdd\x9e"
- "\x6d\x93\xff\xaa\x91\x7c\xf3\x57\x57\xdb\xbe\xa9\x77\xf3\xf1\x26"
- "\xb5\x81\xf0\x3e\xda\xa3\xad\x6c\x7f\x22\x55\xee\x56\xe1\xb7\x51"
- "\x9e\xf1\xb3\x0c\x70\x9f\xbf\x5b\x29\xd5\xc7\xad\x7e\xe8\xc7\x5a"
- "\x01\xf5\x3b\xce\x69\x02\xf2\x03\x78\x2a\xb6\x61\x13\x35\x35\x1b"
- "\xd9\xde\x7c\x3c\x03\x8c\xf1\x4b\x98\xae\x3a\x93\x22\xcd\x65\xa2"
- "\x8e\xe2\x73\x98\x67\x5c\xf6\x1f\xfa\xde\xca\x97\xf4\xd7\x19\x37"
- "\xfb\x8f\x7f\x13\xd2\xca\xdd\x31\xe4\xf6\xbd\x23\xf8\x3d\xc8\x17"
- "\xcf\xcf\x03\xec\xc6\x35\x35\xb0\xef\xcf\x84\xe1\x5e\x4c\x7c\x17"
- "\xeb\xe8\x2d\x66\x9d\x37\xdf\x88\x2e\x3a\x7e\xab\x95\xe8\xb8\x9e"
- "\xc5\x4e\xfa\x36\x4a\x9a\xaf\x63\xe7\x91\x20\xcf\xfa\xae\x18\xce"
- "\xdf\x2e\x60\x71\xd0\xf2\x3a\xcb\xef\x55\x91\x44\x4e\xdb\x6f\x93"
- "\x51\xc6\x63\x9f\xe1\xb2\xfe\xdb\x03\x22\xcf\x8d\xbc\xfe\xdf\x16"
- "\x61\xba\x6b\xff\xfd\xb7\x4d\x52\x3e\x49\x2e\xf3\xf5\xaa\x6f\xdf"
- "\x63\xf9\x78\x5c\xdd\x3c\xce\xf3\x1f\xaa\x1b\xc9\xb7\x75\x62\x7e"
- "\x1e\x97\x90\xf9\xe5\xf9\xb6\x85\xe6\x57\xe6\x41\x5d\x61\xfc\xd3"
- "\x5c\xca\xe9\xc8\xbf\x0b\xbf\x75\x58\x17\xa4\x11\x9e\x1d\xa7\xf9"
- "\x9d\xe5\xc0\x1f\x63\xaf\x7a\x8e\xef\xeb\x1e\x77\x86\x9c\xe5\x36"
- "\x84\x9c\xb2\xf9\x5d\xde\xd6\xb3\x4b\xdc\xf6\x3e\xab\xa4\x3c\x5c"
- "\x76\xb3\x67\x6c\x4f\xb9\x2e\x03\xe7\x83\xc4\x67\x19\x78\xbe\xb6"
- "\xeb\xff\x21\x6e\xff\x07\xe2\xff\x6c\x5f\xf3\x2a\xa6\x5b\x15\xae"
- "\xb3\xfb\x67\x53\xe0\x5e\xd5\xed\x3e\xcc\xe3\xfe\x65\xbe\xef\x19"
- "\x6c\xb3\x26\xb6\x87\x5c\x4c\x17\xcb\x0e\x62\xf5\xc9\xa0\xd1\x80"
- "\x0d\x0d\x9e\xc5\x16\xfb\xa1\x06\xcf\x70\x87\x3a\x9e\x62\xe7\xb7"
- "\xe1\xf9\x54\xf1\x37\x4a\xfc\x8d\xe4\x31\x4d\xcf\x6a\x5d\x71\xc9"
- "\x71\x8e\xe6\x6c\x94\xb7\x38\xe9\x52\x1c\x79\x29\x4e\x3a\x9e\xff"
- "\x16\xe3\xba\x2e\x80\xf7\x52\xfa\x8a\x49\x0f\xcf\xf3\xa4\xb3\xdc"
- "\xce\xbc\x5d\x95\x42\x5e\x13\xda\x19\xe3\xd0\xff\x97\xa1\x05\x7d"
- "\xc0\xb4\x11\x0b\xe9\x20\x96\xf4\x76\x23\xc6\xd1\xac\xe5\xf1\x33"
- "\xf1\x0c\xac\x0c\xe7\xcd\xd1\x76\xac\xd5\x9d\x65\x31\x34\x5f\x6a"
- "\x21\xe1\xba\x9f\xd2\x26\xa0\x41\x8b\x33\x7f\x57\xa5\x88\xa3\x37"
- "\x40\x07\x8e\x3d\x43\xce\xb1\xf9\x62\x16\x03\xba\x85\xad\x7b\x29"
- "\x4f\x93\x73\x59\x2c\x0f\x4d\x78\x83\xd3\xee\x1c\x9b\xfb\xda\x62"
- "\x92\xe2\x24\x9e\x1b\x2f\xc5\x65\xb6\x92\x73\xc6\x8b\x41\xef\x37"
- "\x43\x5a\xb4\xe7\x9e\xe9\x73\x8f\x63\x99\x58\x77\x2b\x39\xdb\x86"
- "\x65\x43\x9e\x05\x5d\x7d\x16\xd2\x5f\x72\x90\x31\x50\xaf\xd3\x52"
- "\xf9\xf0\x1c\xfa\x7f\x0b\xeb\x4b\x58\xe6\xc5\xfc\x26\x2c\xb7\xc4"
- "\x2a\xcf\x8d\xe0\x7b\xae\xcf\x81\xfe\xfb\x3f\xba\xbe\x6c\x20\xe8"
- "\x0b\x15\xd0\x97\xcc\x42\x5e\xe5\x4e\xee\xa3\xbb\xb2\x82\xcf\x31"
- "\x9e\xfb\x06\xf7\x75\xad\xbb\x44\x14\xb8\x07\x82\x63\xf6\xbb\xc9"
- "\x0c\xc7\x90\x06\xb2\xba\x1c\xfa\x88\x99\xe9\xb3\x01\xe9\xfd\x73"
- "\x3c\x2e\x76\x2b\x51\x16\xa7\x49\x3e\xc6\xbf\x9b\xee\x16\x17\x41"
- "\x3c\xf7\xf2\xdd\xd2\xda\x4c\xb6\xde\xcd\xea\xd8\xbd\x0e\x58\x5f"
- "\x28\xab\xd9\xab\x8d\xa9\xac\xdc\xc9\xd6\x67\x0a\x2a\xcc\x7c\x8f"
- "\xea\x77\xef\x06\x68\x6e\xaf\x80\x6f\xed\xec\x8a\x07\x01\x79\x8a"
- "\x71\xef\x3d\x94\xdf\xd5\xce\x34\xf6\x8d\x7a\xde\xd7\xbf\x6b\x11"
- "\xf2\x2b\xf1\xac\x80\x42\x4c\x6f\xa9\x75\xd8\xd1\xf7\x43\xaf\xfe"
- "\xb3\x58\x9c\x39\xdc\x13\x5e\x50\x89\x31\xa8\xdb\xee\xb5\x4b\x75"
- "\xb6\xb5\xe0\x79\x15\xac\x33\xa7\xad\xed\x84\x44\xc7\xa2\x56\x28"
- "\x5b\x7f\x8c\x34\x11\xdb\x12\xdc\x37\x87\xe7\xaf\xb0\x0f\x73\x1a"
- "\xd8\xd8\x98\x8f\x7d\x9f\xe7\x61\x63\x7f\x16\xf3\x07\xca\xdf\xcc"
- "\xe2\x96\x41\x1b\x80\x17\x66\x3d\x9e\xf9\xb7\x31\x7f\x1b\x39\x69"
- "\x84\xb7\x9b\xed\x93\x3d\x2f\xae\x93\xd8\xca\x25\x5d\x61\x15\xd3"
- "\xd6\xe1\xb7\x33\x3a\xc8\x39\x62\xcb\xc7\x78\xe4\x40\x0f\x33\xfa"
- "\x9d\xab\x6d\x83\x7e\x92\xd9\x81\x58\x30\x63\x9c\x4b\x2b\xb1\xe5"
- "\x71\xfd\x86\x34\xb7\xa5\xe2\xf7\x91\xb6\xc0\x3b\x1b\xd0\xf4\x83"
- "\x76\xd3\x79\x85\x44\xd3\xe2\x51\x38\xde\xb1\x69\xfb\xd2\x0d\x4e"
- "\xa8\x73\x2d\x8c\x32\xcc\x63\x8e\x61\xfd\x6a\x84\x61\x95\x3b\x71"
- "\x4f\x36\xfc\x2f\xfa\x3a\xe5\xbc\xe3\x7d\xe9\xfc\xdb\xf0\x8d\xf3"
- "\xb8\xbf\x01\x65\x25\xfa\x46\x83\xb4\x39\x22\xfd\x58\x9c\x88\x92"
- "\x0c\x4e\x07\x9e\xbf\x55\x5c\x0f\xbf\xbd\x1d\xea\x55\xe6\x9a\x2f"
- "\x6e\x65\xba\x1b\xf1\xb6\x99\x8d\x09\xcf\x57\xb8\xd5\xb9\x8d\x9d"
- "\x7f\x6d\xc5\xb9\xbe\xf3\x89\xf8\xad\x22\xf4\x0b\x86\xb8\x38\xe3"
- "\x8e\xff\xf3\x0f\x63\x3d\x71\xcf\xaf\x33\xa8\xc2\x0c\xfa\x16\x75"
- "\x8c\x19\xde\xc9\x84\xbe\xd0\xeb\x9c\xa9\xa8\x0b\x59\x8c\xba\x76"
- "\x53\x6b\xa4\xa4\x0b\x61\x7c\x01\x7a\xe1\xc2\x04\x36\xee\x04\x7b"
- "\xda\x22\xa0\x3d\x73\x01\x63\x31\xe2\x78\x43\xb2\x75\xf0\x9d\x44"
- "\x69\xcd\xcb\x89\xe7\x26\xce\xb1\xf5\xde\x36\x29\xf6\x1a\xf7\xc3"
- "\xd7\xba\xc6\x75\xce\xa2\xb5\xa4\xc7\x39\x0b\x3c\xfb\xf3\x3a\x8b"
- "\xd1\xb5\x1d\x75\x4a\x4d\x4b\x13\xea\x08\xf6\x3e\x9e\xbd\xd0\xc3"
- "\x98\x9c\x9f\x1f\x6a\xc2\xf9\x79\x16\xcb\x04\xeb\xc2\x63\x4a\x34"
- "\xb2\xff\x01\xb7\x0a\xfc\xe5\x58\x6a\x6d\xeb\x8a\x2f\x0e\xfc\xc6"
- "\xb5\xb6\xfd\x8a\xc7\x88\xf9\x2e\xd4\xd7\x17\x26\x60\xac\xec\x76"
- "\xd3\x05\x8d\x14\x27\x9b\xc5\xc5\xe6\xfb\x1a\x7b\x8d\x07\xc6\xfc"
- "\x2d\x4e\x21\x51\xe8\x2f\x00\xcf\xd7\x31\x1a\x28\x3b\x67\xa2\x0f"
- "\x67\xf4\x47\x69\x5e\x85\xb1\x56\x2e\x1c\xf9\xfd\x28\x76\x46\xb9"
- "\xcd\x3c\xa5\x15\xf7\x61\xb5\x9c\xce\x62\x7e\x96\x94\x71\x99\x0e"
- "\x8a\xef\x31\x7b\x22\xa8\x73\x26\x3e\x63\x31\x0c\xb0\x4c\xbf\xfd"
- "\x11\x5f\xd8\x2a\xda\xa6\x2d\x20\xf7\x6f\x03\x5e\x31\xdb\x1d\xfe"
- "\x1f\x75\x86\xb4\x39\x79\xbc\x56\xee\x53\x5f\xdc\x8f\x3d\x84\xfb"
- "\xd8\x00\x9a\x31\x9f\x07\x6d\x2f\x6a\x27\x61\x6c\xe3\xb6\x95\xcc"
- "\xbf\x75\xde\x6e\xb5\xc8\x53\xf5\x3a\x5e\xaf\xd0\x85\x99\x72\x56"
- "\x47\xac\xdf\xc0\xea\xd6\x36\x4d\x1c\x47\x0c\x69\x37\xb5\x19\x25"
- "\xdf\x1c\xdc\x9e\xe2\x7e\xaf\x39\x2f\xda\xce\x8a\xf6\x73\x98\xf8"
- "\xed\xb0\x41\xf8\x76\x05\x2f\x73\x57\x33\xf7\xfd\x7d\x21\x09\xf8"
- "\x0a\x7a\xe7\xa2\x52\x1a\xcf\x88\x67\x88\x22\xf9\x38\xeb\xa2\xd6"
- "\x35\x9e\xb9\xd0\xc3\x1f\xeb\x23\xcb\x97\xa7\x6b\x93\x96\xac\xd0"
- "\x2d\x4a\x5f\x9c\xa2\x4d\x4e\x4b\x5b\x9e\xa6\x45\xe7\x4b\xee\xfd"
- "\x87\xc7\x27\xba\x38\x55\x8c\xe5\x57\xee\x8a\xe5\x77\xd1\x23\xfe"
- "\xa5\x95\x5c\x34\x0e\xce\xdc\xc5\xc5\x32\x6f\xe5\x94\xc8\x85\x9d"
- "\x70\xe1\x3a\x8a\x19\xae\x2a\x9c\xcb\x58\x68\x27\x31\xa0\xeb\x99"
- "\x8f\x0b\x97\xcf\x89\x8b\xf3\x70\x8f\x51\x23\xb9\x78\x79\xb3\xa0"
- "\x20\xcc\x87\x90\x49\xd8\x89\xf9\xb7\xc0\xfb\x70\x99\xe1\xaa\x82"
- "\x8b\xbd\x27\xfc\x93\x9d\x97\xdf\xe9\xfe\x8c\xef\x1f\xd1\xaf\xc1"
- "\x3c\x34\x5b\xc1\xe4\x97\xf0\x3b\x9e\xaf\x5b\x1d\xe4\xd4\x74\x6e"
- "\xa7\x98\x8f\xc5\xe4\x0a\xc9\x26\xda\x5e\xf2\x05\x50\xd3\xa9\xed"
- "\x62\x3e\xb6\x07\x40\x6a\x0f\xc6\x10\x80\xfc\x52\x3e\x05\x35\x5d"
- "\x88\x16\xf3\xb1\x3d\x39\x82\x49\xde\xdb\x77\x03\xa9\x69\x8f\x56"
- "\xcc\xa7\x76\x2f\xcf\x2d\xcf\x10\xc1\xf4\x45\x39\xe6\x11\xb2\x15"
- "\xdc\xbf\xad\xe9\x62\x19\xe4\xef\x75\x3e\x67\x60\x7c\x6a\x9f\xde"
- "\x9d\x4f\xba\xc5\x4b\x92\x1f\x58\xb2\x2c\x03\x23\x48\xa5\x2f\x5f"
- "\x99\x8e\xbf\xcb\x16\xbd\xc0\x7e\x96\x2f\x7c\x76\x31\xff\x27\x3d"
- "\x35\x0a\xff\x49\x05\xbc\xe1\x6f\xd2\x4a\x1d\xfe\x2c\x5e\x8e\xb7"
- "\x99\x29\x91\x2b\x17\xe3\x4f\xf7\x73\xa0\x11\xed\xa6\xf6\x16\xc0"
- "\x46\x03\x97\xb3\xed\x76\x2b\x39\xc5\x6c\x3a\x8c\x93\x74\x30\xc2"
- "\x41\xa4\x79\x2d\x4f\x9f\x23\xf6\x40\xf4\x39\x12\x9a\xad\x5b\x1c"
- "\xea\x58\x92\x0c\x3a\x03\xec\x1d\xfb\x54\x2b\x49\x11\x63\x58\xef"
- "\xd6\x32\xff\xa5\xa6\xf6\x35\xe2\xde\x4e\x85\x90\xb7\xeb\x30\xfa"
- "\xe5\x87\x7b\x16\x93\x5a\x00\x7d\x00\xf9\xc2\xe1\x1e\x63\x51\x87"
- "\xc1\xf3\x06\x9c\x93\x82\x7b\x0d\xdc\x87\x0b\x79\x6f\x37\xe3\x19"
- "\x63\xb8\xd7\xc2\xfd\x78\x28\xbf\x2b\xfe\x5b\xef\xb6\xb2\x7d\x8f"
- "\x14\x27\x9b\xc7\xc4\xb6\x1f\xe8\x8a\x89\x8d\x71\x9a\xf4\xea\x05"
- "\x4c\xff\x32\x1b\xc4\xde\x1c\xa0\xb9\xe3\x31\xc8\xd3\x2c\xe9\x4b"
- "\x3e\xdf\x61\xb7\x4b\xfe\x53\xf8\x7c\xc6\x65\xa5\x5b\x6c\x71\xbc"
- "\xd7\x48\xb1\xc5\x71\xbe\x8b\xc5\x36\x84\x5f\x6a\x42\x3f\xb1\xb4"
- "\xbc\xd7\xb9\x3c\x16\x13\xf3\xf2\x6a\xf4\xb9\x6b\x33\x24\xc9\xee"
- "\xde\x8c\x73\x68\x70\xcf\x7d\x46\xd2\x73\xe4\x32\xf3\xa7\x2f\xf9"
- "\x93\x73\xf7\x25\xd1\xeb\x79\xa8\x4f\xc0\x66\x60\x71\xac\x52\x97"
- "\x87\x3a\x16\x25\x73\x3b\xf0\xf2\x71\x2e\xbf\x2a\x9a\xb8\xbd\x70"
- "\xb9\x8a\x3e\xc1\x63\x9d\x58\x49\xc7\x1c\x1c\xb3\x84\xca\x52\x97"
- "\x53\x78\x37\x34\x73\x51\x32\x4b\x83\x7c\x39\x60\xab\x89\xf5\xdb"
- "\x61\x09\xc7\x33\xae\x82\xe8\x23\xe3\xf2\xf6\xa7\xef\x30\xe2\x77"
- "\x94\xcc\x0e\xf9\x84\xa8\x30\x36\x25\xd6\x6d\xb3\x9b\xbf\xbb\x75"
- "\x90\x86\x7b\x48\x2f\x3c\x41\x54\xe8\xdf\x57\xac\xcb\x76\x1e\x17"
- "\xac\x63\xba\xe4\x6b\xca\x0a\x69\xdd\xdb\xf3\xc4\x2f\x18\x2a\x27"
- "\x2c\x8e\x8c\x9f\x01\xff\x45\x8a\xe1\x9d\xdd\xb1\x19\x7e\x61\xd8"
- "\xdf\x77\x5e\xf8\xe3\xec\x97\x78\x0c\xcf\x0e\x18\xff\x5f\x8e\x66"
- "\x7b\x58\x70\x5c\xd2\x9e\x50\xca\xf7\xa0\x76\xd4\xa0\x3f\x5d\xc1"
- "\x84\xf6\x24\x9e\x9b\xee\xa8\x44\xcc\x52\x65\x45\xf3\x96\xd5\xe8"
- "\xbb\x59\x06\x34\xee\xf8\x2b\x3e\x13\x7d\x76\xc9\x99\x8f\x2b\x27"
- "\xd1\xb0\x33\xc2\x60\xa3\xe0\x19\xd4\xd3\xc4\xf9\x1e\xda\x1d\x38"
- "\x9f\x24\x98\x3a\x12\x10\xb7\xc0\x63\xf4\x21\xd2\x46\x87\xed\x32"
- "\xd3\xa0\xbd\x85\x88\x63\xb4\x75\x2d\x6a\xa4\x59\xe7\x78\xf8\xee"
- "\xa3\x70\xfd\x8a\xc7\x94\x79\xb2\x59\x2a\x13\xfd\xaa\x81\x0d\xd5"
- "\x06\xbf\xea\x76\x53\xe7\x1c\xb7\x58\x7b\xe2\x99\xe8\xce\xa5\xe8"
- "\xef\x0d\xcb\xe6\xb6\xb3\xf3\x4f\xdc\x06\xe9\xcc\xb4\x92\xd0\xf5"
- "\xbc\x2f\x76\x82\xfd\xb3\x36\x51\xfc\x1f\xec\x9f\x1f\xed\xec\x56"
- "\xc6\x51\x69\xae\x94\x63\xba\x73\x0f\x60\xf4\x51\xb8\x7e\x05\xf9"
- "\xcd\x52\x3c\xf9\x1c\x39\x3b\x27\x79\x3a\x40\x83\xe7\xdd\x3b\xeb"
- "\xa5\xf4\x40\x59\x0c\xd0\xb4\xb3\x59\xea\xfb\x17\x86\x55\x54\xc3"
- "\xbd\x5d\x9a\x63\xe1\x73\x2e\x0e\xa5\xdb\x7d\x3d\xdc\x6b\xa4\x7b"
- "\xf8\x7f\xbc\x24\x2b\x70\x9c\x78\x01\xc6\x92\x38\xee\x5c\xac\x01"
- "\xbb\x50\x83\xe3\x3c\x07\xf0\x7f\xad\x56\xcc\x1b\x6f\x25\xf9\xa2"
- "\x8c\x71\x2c\xb0\xca\xd7\xce\x91\xda\x22\x98\x02\x42\x79\x7b\x9c"
- "\xeb\x85\xfc\x26\xa5\x2d\x68\x97\x11\xf2\x80\xfe\xb7\x6f\x65\x79"
- "\x32\xce\x6e\x2d\xec\x50\xcf\xb3\xac\x01\x3b\xf9\x59\xc4\x97\x93"
- "\xed\xc3\x2a\x5a\xa5\x8e\x47\x1b\x13\x7d\x7e\x30\xff\x7c\xe8\xa3"
- "\xd2\x41\x86\xb0\xb8\x00\xf9\x27\xed\xcc\x1f\xfe\x4b\x11\x2a\xc9"
- "\x3f\x25\xc8\x9e\x74\x2a\x4f\xad\x46\x9f\x95\x2c\xfe\x47\x7b\x44"
- "\x08\xf3\x53\x29\xfa\xa7\xdc\x94\x41\xc2\xca\x04\xee\x9f\x92\xf9"
- "\x03\x19\x02\x63\x92\x8c\xde\x7d\x54\x52\x53\x79\xba\xe4\xa3\x92"
- "\x5e\x72\xda\xe1\x7f\xc4\x02\xc6\x45\x8f\x60\xf7\x2e\xdf\x52\x8a"
- "\x5e\x7d\x56\xca\x41\xc6\xc9\xb9\xcf\xca\x81\xe9\x06\x67\x22\xc7"
- "\x89\x73\xab\x14\xef\xde\x2d\x0d\xe4\xdf\x65\xd1\x97\x41\x67\xaa"
- "\x98\x56\x65\x25\xb9\xe9\xe2\xfe\x4a\x1b\xce\x91\xad\x67\xf3\x60"
- "\x1d\x78\xfe\xe2\x8d\xde\xe4\x4b\xeb\x30\xa7\xb9\x95\xf9\xa2\x10"
- "\xe0\x7b\x02\x93\x75\x7c\xdc\x28\x28\xbb\xf7\xe1\x67\x16\x2f\x4f"
- "\x4a\x5e\xf8\xfc\x52\x9d\xf6\x89\x79\x8f\xb2\x60\x87\x91\xda\x25"
- "\xe9\xc9\x4c\xfd\x68\x9f\x98\xf1\x48\x5c\xdc\xbc\x85\xbf\x98\xf7"
- "\xf0\xbc\xf9\xbf\x78\x90\x9f\x4e\x9c\x97\xf6\x32\x06\xcc\x4c\x5f"
- "\xae\xc5\x97\x9e\x11\xa3\x6c\xaf\x4a\x4e\x5b\xde\xbd\xef\x87\xb1"
- "\x39\x2d\x39\x9b\xbf\x6d\xc3\xff\xf9\xbc\x99\xb0\x4d\x9a\xcf\xe2"
- "\x72\x4e\xf8\x03\xd2\x96\xc5\x2f\x35\x09\xe1\x68\x4b\x89\xf1\xcf"
- "\x51\xc7\xe0\x9c\xaa\x0d\x75\x0d\xb4\xa5\xce\xdd\x0f\x97\xf8\x2e"
- "\xfa\xe3\x52\x4b\xfd\x96\xa7\xd1\x20\x3a\x66\x8c\x81\xfb\xd2\xa2"
- "\x0a\x69\x8e\x1b\xd3\xa4\x3a\x34\x62\x1e\x93\x30\xd7\x15\x67\x97"
- "\x46\xba\x62\x49\xb2\x3f\x0f\x1a\x11\x82\xa6\x4b\x20\xd0\x6e\x08"
- "\x5c\x43\xf1\x9a\xd9\x25\xcb\x33\x68\x3d\x8e\xcf\x42\x65\xa0\x6f"
- "\x33\x03\x78\x2c\xaa\xdc\xc3\x2c\x7e\x42\x9c\xd3\x11\xb0\xd0\x29"
- "\x87\xdf\x00\xba\xd0\xa9\x60\x63\x42\x9a\x41\x0f\xb3\x73\xf5\x19"
- "\xb4\x0e\x63\xae\x01\x8e\xf3\xe2\x1c\xfa\xbc\x38\x27\x75\x2c\x04"
- "\x5b\x1d\x7e\xbf\xc6\xf3\xe1\x71\xce\xaf\x29\x8b\x3b\x83\xe7\xe8"
- "\xb9\x4f\xc1\x2a\xdc\x2f\xf9\x34\x60\x78\x73\x2b\x8f\xd5\x1b\xf7"
- "\xf2\x77\x5f\x2d\x7c\xd9\xca\x63\xf5\x9e\xe3\xf1\xad\x79\x0c\x70"
- "\xa2\x87\x72\x3e\x5c\xe8\x0c\xd0\xc6\x39\x3b\x29\x3b\xe3\x9a\x4b"
- "\xd4\x7d\xc5\xdf\xed\x75\xae\x22\xf7\xd3\x0a\x5a\xa4\x5f\x4f\x73"
- "\x3f\xcb\xa3\x45\x86\x30\x9a\xb7\x17\xc7\xb2\x32\x9a\x7b\x34\x01"
- "\xee\x21\xbd\x21\x82\x16\x19\xc3\x68\xee\x97\x76\xf8\x85\xfb\x13"
- "\x55\xb4\x28\x1b\xee\x2b\x4b\xe0\xbd\x12\x9a\xfb\x1e\xbe\xa7\xa6"
- "\xb9\xef\x1b\xe1\x17\xee\xff\x91\x09\xf9\xe0\xde\xac\x83\x5f\xb8"
- "\xdf\x97\x72\x5a\x46\x0e\xc3\x3b\x90\xd6\x54\xca\xbf\xf5\x75\x29"
- "\xfb\x56\xee\x99\x52\xfe\x8d\xb3\xa5\xfc\x1b\xb6\x52\xfe\x8d\x0b"
- "\xa5\xfc\x1b\xff\x4c\x84\xfc\xa5\x34\x77\x7f\x1d\xe4\xd3\xd0\xdc"
- "\x83\x31\xf0\x0b\xf7\x1f\xec\x84\x7c\x70\x5f\xa5\x85\x5f\xb8\xff"
- "\x10\xea\x92\x0d\xf7\x1f\x13\xc8\x5f\x46\x73\xab\xd3\x21\x5f\x38"
- "\xcd\xad\x69\x86\x5f\xb8\xb7\x2c\x80\x7c\x70\x5f\x07\xe5\x18\xe1"
- "\xfe\x93\xe9\x90\x1f\xee\x2f\x61\x7d\xb6\xd2\x5c\x3b\x96\xab\xa5"
- "\xb9\x97\x31\x3f\xdc\x77\x42\x79\x46\xb8\x77\x46\xc3\x2f\xdc\x0b"
- "\x56\xc8\xaf\xa5\x05\x04\xda\xaa\xdf\x46\x0b\xe4\x53\x21\xdf\x78"
- "\x5a\x10\x00\xe9\x06\xb8\x0f\x2c\x84\x7c\x70\x3f\x14\xf3\xc3\xbd"
- "\xb2\x09\xf2\xc3\xfd\x30\xa4\x51\x39\x2d\x50\xd9\x20\x5f\x04\x2d"
- "\x08\x8d\x87\x5f\xb8\x1f\x81\xf5\x87\xfb\x30\x35\xfc\xc2\xfd\x28"
- "\xa0\x55\x36\xdc\x6b\xa0\x7e\xfa\xed\xb4\xe0\x76\x2c\x3f\x92\x16"
- "\xdc\x81\xf4\x81\xfb\x71\x0e\xc8\x07\xf7\x77\x01\x3d\x8c\x70\x3f"
- "\xfe\x00\xe4\x8f\xec\x95\x9f\x05\x3f\x04\xfb\x76\x08\xa1\x05\x51"
- "\x6a\x9a\x3d\x14\x7e\x7f\x64\xa6\xd9\x81\x50\xf6\x7d\x5a\x48\x87"
- "\xdf\xff\x28\x85\xfb\x48\xf1\x1e\x7e\xff\x53\x07\xf7\x51\xe2\x3d"
- "\xfc\x4e\x9d\x09\xf7\x53\xc5\x7b\xf8\xbd\x1f\xec\xeb\xc0\x68\x5a"
- "\xf0\xbf\xca\xe1\x1e\x7f\xa7\xc1\xfd\x34\xf1\x1e\x7e\x7f\x9c\x0a"
- "\xbf\x0e\xdb\x1d\xb3\x12\x6c\xc1\xb1\x6a\x5b\xb0\xc9\x88\x7a\xdb"
- "\x59\xac\x2f\x11\x42\x0c\x6a\xd0\x9b\x43\x0c\x17\xc9\xd0\xd3\xb2"
- "\x80\x7c\x94\x13\x96\x2c\x2b\x8b\xd1\x27\xfa\xa8\x1c\xd2\x28\x93"
- "\x6f\x02\x1b\x27\x1a\xe4\xb2\x1c\xda\x5e\x4d\x4d\x81\xad\xd0\xe6"
- "\x39\xd4\x34\xbc\x11\x7e\xe1\x7e\xc4\x27\xd0\x66\xb8\xbf\xbf\x00"
- "\x7e\xe1\xfe\xc9\x47\xa0\xed\x73\xda\x73\xe5\x0e\xab\x8c\x70\x9f"
- "\x6a\x7f\x9c\xad\x0b\x75\x18\x68\x9c\x03\xf4\xc1\x1b\xf9\x31\xa1"
- "\x8e\x44\xc0\x41\x8e\x36\x14\x63\x69\x6c\x9a\x55\x4a\x43\x62\x59"
- "\x9d\x30\x5e\x0e\xed\x1c\x2f\xe7\xdf\x1e\x4e\x1b\x65\x01\x13\x31"
- "\xae\x03\x0d\x79\xd6\xdb\xf3\x59\xec\xf9\x98\xfc\x78\xfe\x5c\x4d"
- "\x5c\xcf\x7f\x85\xcf\x97\x84\xa2\x7f\xf4\xb1\x3f\x8e\xb7\xca\x02"
- "\x4a\x30\x8f\x55\x26\xdf\x4e\x4d\x01\xc4\xd2\xd6\x2c\xb6\x71\x28"
- "\xe6\x7b\x0d\xdf\xf3\x36\x47\x23\x14\xae\xcd\x2c\x02\xb9\x85\x63"
- "\x56\xd0\x5f\x72\xad\x7e\x7c\x45\xa3\x2c\x30\x71\x13\xda\x34\xaa"
- "\x7c\x0d\x93\x67\x32\xc5\x84\xce\x82\xbd\x87\xb5\xab\x42\xa1\xbc"
- "\xc0\x45\x06\x3b\x6d\x33\xeb\x1f\x21\xa7\x59\xfa\xdf\xd5\xec\x7c"
- "\x0f\xcf\xe3\x60\xfb\x36\xf9\xff\xcd\x6c\x8e\x18\xca\xc2\x77\xdd"
- "\xc7\x08\xce\xdc\xc8\x16\x21\x24\x5f\xcb\xd6\xbd\x65\x8a\x89\xef"
- "\x09\x56\x79\x68\x3a\x09\xd4\xae\xfa\x07\x94\xaf\xd0\x79\x8c\x27"
- "\xbb\xf2\xb2\x67\xf3\xdf\x87\xbc\x1b\x71\xee\x27\x57\x61\xec\x8a"
- "\x6b\x0c\x6d\xf8\x2d\xea\x2e\x39\x89\x41\x7d\xca\xec\x53\x59\x20"
- "\xf3\x57\xeb\x50\xe5\x10\x47\x61\x2c\x71\x16\xe6\x6b\x68\x71\xbe"
- "\x36\xc4\x21\x23\x6c\x7f\xbd\x2c\xf0\xbe\x7b\xed\x68\x0f\x7e\x84"
- "\xed\x3b\x2b\x0c\xb9\x5f\x3b\x25\x93\xc8\xcd\x69\xc7\xf0\xdd\xc9"
- "\x34\xf7\x27\xa5\x96\x96\x7a\x62\x4e\x63\x65\x45\xd2\xdc\x9f\x85"
- "\x0b\x43\x1e\x1e\xbf\x19\xed\xea\x4c\x9c\x17\xfb\x04\xdf\xfb\x2b"
- "\xd0\x59\xd1\x9e\x1b\xe8\x8a\xff\x0d\xb4\x2c\x02\xda\xa1\xcd\x8b"
- "\xbe\x2a\x16\x3a\x9d\xe8\xfb\x2d\xcf\x0a\x74\x60\x3a\x52\xa6\xb0"
- "\x61\xbc\x72\xfe\xdd\xc0\x19\xc2\xb0\xbd\xe6\xda\x05\xb8\xc6\xa7"
- "\x46\x5f\x5a\x6d\xec\x7c\xbb\x03\xe3\x10\x82\xae\x10\xf3\xba\xf3"
- "\x6e\xe9\x62\xdd\xc2\x55\xba\xe5\x69\xe9\x0b\x57\xea\x1e\xd0\xc2"
- "\x40\x4f\xbb\xfc\x59\xed\xd2\xe4\xa5\xcb\xd3\x5e\xee\xe1\xbf\x07"
- "\xea\xb5\x0d\xb0\xc1\x6c\xb9\x0f\xc1\xde\x66\xf3\xed\xb2\xa1\xe9"
- "\xc8\xeb\x37\x5e\xe7\x71\x2f\x20\x0f\xe8\xff\x25\x6c\x3c\x23\x94"
- "\xe6\x47\xd3\xb2\x59\xa5\xf9\xe8\xa3\x63\x25\xc6\x55\xb0\x11\x0b"
- "\x69\xe5\xb1\x70\x59\x9c\x3b\xb0\xff\x33\x56\x53\x73\x46\x2b\x62"
- "\x5c\x43\x8b\x4c\x11\x80\x71\xeb\xe5\xa2\xd8\xcc\x46\xd9\xd0\x84"
- "\xcb\x45\x26\x8d\x14\xa7\xc8\x59\x68\xca\x14\x54\x6b\x4b\x30\x4e"
- "\x51\x27\xd5\x90\x1a\xa0\x65\x47\xde\xde\xed\x20\xe3\xcb\x37\x99"
- "\x68\x85\x13\xc6\x43\xcc\xbf\xcc\x1f\x67\xc7\x3b\x69\x84\xc2\x69"
- "\x22\x4a\xf8\x0d\xa1\x21\x79\xe6\x4e\x55\x8e\x1a\x9f\x63\x7c\x22"
- "\x67\x67\x04\xd1\x1f\xa6\xc2\x6f\x52\x00\x37\x26\x42\x59\x3c\xd6"
- "\x94\xb3\x04\xd2\x87\x09\xc5\xa6\xad\xa7\x67\x12\x39\xe6\x05\xfb"
- "\x8c\x2c\x80\xff\xb3\x16\x91\x60\xc8\x17\x9a\xf5\x21\xa4\xb7\x47"
- "\x0c\x73\x18\x22\x94\x1d\x86\x88\x61\x9d\x34\x42\x65\x69\xb2\x93"
- "\xce\x09\xb3\x13\x27\xdb\x88\xe2\x0d\xb0\xe3\x36\x09\xd0\xbf\xca"
- "\x66\x19\x9d\xaf\x44\x0c\x71\xbc\x12\xa1\xe8\xec\x8c\x50\x3a\x5e"
- "\x8a\x50\x74\xbc\x14\x31\xa4\xb3\x3d\x42\x69\x49\xb2\x91\x8f\x6c"
- "\x7f\x26\xb5\x4d\xcd\x6c\x4e\xb6\x33\x38\xaf\xba\x33\xd8\xb4\x5d"
- "\xd5\x44\xc2\xa6\xe8\xc0\x8e\x03\x5b\x76\x03\xd8\xf1\x80\x09\x95"
- "\xe3\xed\xd9\x20\x5f\xf3\x74\x40\xdf\x07\x67\x4c\xa4\xdf\x39\x73"
- "\x55\x0a\xed\x6c\x90\x45\x30\xde\x87\x34\xc0\x8f\x26\x9d\xe6\x86"
- "\x55\xc2\xf8\x3f\x1c\x2e\xad\x95\xf3\x81\xd0\xdc\x61\x15\x38\x27"
- "\x80\x79\x79\xbe\x11\x4a\x2b\xfb\x0d\x4e\x60\x71\x53\x73\x03\x53"
- "\x37\xa1\x0d\x91\x3b\x54\x27\xd9\x10\x07\x14\xbd\xfb\x01\x81\x3c"
- "\xeb\xbb\xc6\xd7\x02\xc8\x93\x22\x7d\xaf\xeb\x73\xdc\x37\x0f\x7c"
- "\xbb\x58\xbf\xb3\x44\xe8\xf2\xc5\x0c\xf2\x70\xe8\x7b\xd0\x7f\x8c"
- "\xec\x59\x61\x8e\x56\x7f\x9e\x04\xe0\xb3\x9d\x97\xec\x72\xbc\xd7"
- "\xa6\xc9\xa8\xa5\xcd\x4e\xe0\x1d\x05\x0d\x9f\x55\xba\xf3\x92\x4d"
- "\x8e\x78\xa9\x85\x34\x78\xf7\x48\xc9\x25\xb1\xdc\xd2\xfc\x18\xc3"
- "\x8b\x84\xc5\x1e\xc1\xf8\x45\x88\xa3\x12\x3d\x8c\x0f\x31\xd6\x52"
- "\x5a\x00\xf4\x63\xe5\x08\xf8\x5f\x89\xf9\xa8\x2a\x47\x2b\x40\x19"
- "\x80\xa5\x3c\x1a\x9c\xa3\x14\x8a\x4c\x25\x80\xa9\x78\x7a\xc7\x2c"
- "\xbb\xf0\x46\x7e\x44\x7b\xae\x32\x05\xe8\x61\x94\xe6\x1b\x6a\xcb"
- "\x1d\x04\x7d\x6b\xd1\x47\x1c\xe4\x60\xfa\x45\xf4\xbf\x1b\x60\x0b"
- "\xda\xbb\xd3\x16\xbc\x36\xd3\x16\x9c\xa7\x13\x8a\xd6\x56\xc0\x55"
- "\xa9\x4b\x23\xaa\x33\xb2\xa0\xc8\x2e\xdf\xb0\xe7\x6f\x10\xdf\xb0"
- "\x60\x97\x31\xfb\x0c\xb0\x83\xf6\x16\xb4\xd7\x8e\x31\x44\xd0\x0e"
- "\x43\x99\xdb\x9e\x1b\x94\x20\xd9\x51\x28\x47\x9c\xf9\x7b\x2b\xe1"
- "\xaa\x80\x74\x9d\x55\x16\xbe\x5e\x92\x31\xa0\x57\xa2\x84\x82\x47"
- "\x60\xac\x04\x36\x7c\x67\xca\x43\x98\x17\xe8\x86\x71\xf9\x02\x9c"
- "\x9d\x29\xd3\xe0\x7a\x10\xae\x9f\x3a\x8b\x72\x88\xb3\xc8\xa4\x75"
- "\x16\xe5\xc5\x3b\x8b\x62\xa7\xc2\x15\x0d\xd7\x34\xb8\x62\xe0\x9a"
- "\x0e\xd7\x4c\x5a\x14\x3b\x07\x7e\xf1\xf9\x3c\xb8\x12\xe0\x5a\x00"
- "\x57\x22\x5c\x49\xce\x37\xf2\xa3\x04\xc0\x27\x5c\x5a\xb8\xc2\x9d"
- "\x45\x6b\xf3\xbc\xf8\x18\x8e\x60\xb1\x12\x02\xbf\xa2\xa1\x18\x4b"
- "\x37\xeb\x22\xee\x8f\x89\x38\x18\xd1\x36\x30\x9f\xf1\xb2\x61\x5e"
- "\xd7\x50\xb0\x7c\xe8\x5b\x9d\x03\x2c\x4f\xe7\x75\x9e\x44\x93\x1f"
- "\xed\x08\x9f\x65\x75\x98\x88\x11\xfa\xb3\xac\x36\xb1\x89\xc4\xd9"
- "\x88\xa1\xba\xa9\x83\x18\x92\x44\xff\xee\x59\x78\xe6\x24\xb5\x1a"
- "\x31\xec\xa4\x09\xda\xce\x42\x53\x84\x53\xb5\x36\x9e\xaa\xd6\xe6"
- "\x31\x5f\x92\x20\x7b\x30\x36\x59\xd7\x18\x12\x31\x05\xe3\xc8\x9a"
- "\x96\x8b\xe4\x95\x24\x2a\xd4\xa4\xe0\x89\x3d\x00\x97\x8c\xbc\x89"
- "\xf8\x92\xc6\x91\x3f\x6f\xa0\x46\xc0\x4a\x90\x13\xe8\x26\xe0\xf8"
- "\x11\x70\x85\x63\x49\x09\x5b\xa0\xcb\xd4\x52\x3c\x27\x3a\x64\x98"
- "\x02\x9e\x29\x30\xde\x53\x19\x8c\x1f\xcb\x32\xc8\xf8\x32\x78\xc6"
- "\x62\x73\x42\xbd\x63\x75\xa1\x54\x78\x21\x82\x6c\x7e\x9e\x28\x83"
- "\xcf\xf2\x78\xaf\x4e\xa0\x7d\x57\xcc\x83\xc2\xd8\xcc\xb9\x67\xb5"
- "\xe4\x60\xc4\x71\xd0\x49\x3b\x41\x76\xc7\x66\x76\x82\xdc\x06\x5a"
- "\x3a\x07\x46\xcb\xe1\x95\x57\x8b\x96\x9d\xe1\xb3\x8c\x9c\x9e\x89"
- "\x04\x69\xd6\x9d\x9e\x48\xe3\x55\x4d\x40\x4f\xa0\xab\xe5\xb0\x93"
- "\x84\xc8\xc8\x22\x89\x9e\x1b\x81\x9e\x40\x53\x0d\xd2\x14\xe8\xc1"
- "\x68\x4a\x45\x9a\x6e\x76\xa3\x29\xc8\x26\xe6\x77\x13\x69\x2a\x00"
- "\x4d\x37\x7b\xa1\x69\xd7\x58\x1c\x68\xba\xc5\x27\x9a\x96\x5f\x01"
- "\x4d\x83\xd5\xde\x68\xea\x40\x7d\x59\x1c\xab\xa3\x20\xef\x2c\x8e"
- "\x8f\x98\x0f\x59\xb0\x75\x2a\xc1\x66\xab\x10\x54\xa6\x4c\xa0\x89"
- "\x0a\xd7\xef\x31\xbe\x18\xf3\xf7\x56\x4e\x2f\x3b\x8b\xf3\xea\x30"
- "\x0d\xe4\x56\xca\xbd\xe8\x33\x4f\x67\x25\x9b\xe5\xb4\xa2\xf6\x52"
- "\x1b\xe8\x17\xf5\xac\x0e\xb4\x25\x8b\xf3\x43\x05\x9a\x42\x50\x86"
- "\x3c\x3d\x91\x28\x3a\x40\x4e\xe8\x32\xc8\xb8\x12\x90\x75\x1d\x20"
- "\x3b\xcf\xc8\x82\x9b\x66\xe8\x04\x0a\x97\x01\x7d\xa1\x0a\xc1\x6b"
- "\x2b\x40\x56\x33\xfe\x22\xcf\x70\x5d\xb0\xe6\xe9\x7f\x42\x79\x21"
- "\x47\x3e\x4e\x74\x10\x43\x4a\x4f\xfe\x0a\x86\x04\xad\xb3\xb0\xff"
- "\x7e\x82\x31\x0e\xb3\x9a\x91\xaf\x3b\x89\xa5\xc9\xd5\x4f\x84\x97"
- "\xb8\x0c\x46\x5e\x60\xbf\xc0\x3e\xb2\xce\x4d\xf6\x82\x5c\x57\x6f"
- "\x12\x63\x7e\x38\x41\xf6\x6e\xc2\x18\x06\xc0\x4b\x8c\x05\xd2\x6b"
- "\xff\x78\x05\xfa\xc7\x2a\x16\x8f\x49\x03\xf4\xd8\xd9\xd1\xce\x79"
- "\x88\x3c\xb3\x38\xaa\x18\xff\x4a\x44\x59\xcf\xe9\xbe\xf6\xb7\x94"
- "\x26\x10\x27\xd4\x5d\x28\xce\x33\xd3\xf6\x94\x61\x38\x87\x08\x63"
- "\xdd\xa8\xd0\x24\xb0\x1b\xbe\x03\x5d\xb0\x0c\xf0\x75\x8e\x8c\xdf"
- "\xb2\x0c\x6c\x81\x76\x8c\xab\x06\xf5\x79\x99\xc7\xa3\x15\x72\x87"
- "\xa5\xc0\x33\xe6\xdb\x55\x90\x7c\xbb\x5e\x88\xc0\x31\xba\x6b\x6e"
- "\x67\x79\x84\xdc\xf5\xcd\xf7\xcd\x4e\x65\xb3\x9d\x9d\x83\x97\x85"
- "\x72\x5f\x46\xca\x6d\xcd\x48\xd7\x16\x59\xa8\xe8\x47\xfc\x4f\x2d"
- "\x3a\x3d\x19\x7a\x46\x16\xfa\x2a\x2d\xf8\xab\x55\x87\xb1\xb5\xa5"
- "\x67\x86\x04\xa4\x43\xe2\x14\x23\x31\x3a\xf3\xbf\xd1\x58\x32\xcf"
- "\xa2\xaf\xc4\x01\xca\xde\x50\xb6\xfe\xe3\xcc\x7b\xff\x00\xd0\x29"
- "\x46\x28\x78\xbf\x1a\x64\x4a\x14\x7d\x01\xda\xfa\x3c\xb4\xf5\x0c"
- "\xd0\xf5\x0c\xb4\xf5\x25\xb1\xad\x62\xac\x39\x01\xe8\x0f\xcf\x7a"
- "\xd7\x7d\x52\x5b\x5f\x40\xbf\xe8\x6f\x56\xac\x3e\x4b\x6e\xa1\x77"
- "\xe1\x5a\x2c\x3b\xa7\xd8\x6e\x71\x1c\x27\xf8\x5d\xa6\x9b\x0b\x63"
- "\x67\xce\x07\x3c\x22\xcd\xc1\x1e\xd8\x49\x43\x4c\x5b\x25\x3e\x60"
- "\x7d\x68\x67\xca\xb0\xcd\xcb\xa0\x3e\x48\xfb\x73\x24\x12\xfb\x33"
- "\xd0\x7e\xfc\x66\xa4\xbf\x67\xbc\xe7\x30\xc6\x83\x21\xc0\x83\x65"
- "\x22\x0f\xf2\x45\x1e\x80\x9d\x08\x7a\x5a\x09\xfa\x57\xb3\xd9\xc4"
- "\x79\x30\x30\x1a\xa9\xcd\x83\xdc\x5f\x0f\x7b\xef\xaf\xb7\x38\x3b"
- "\xf8\xd8\x50\x86\x3e\x66\x69\x48\xfe\x2d\x42\x27\xf4\xdb\x62\xb1"
- "\xdf\xd2\x94\x9f\x4a\x7d\xf6\xb4\x6c\xc4\x1b\xbe\xf5\xd9\x91\xf9"
- "\xff\x43\xfb\x6c\xd8\xd5\xed\xb3\xb7\x3c\xee\xd9\x67\x6f\x59\xe3"
- "\xd9\x67\x6f\xf9\xb1\xab\xcf\x8a\xcf\x06\xa5\xcf\xde\x12\x7f\x7d"
- "\xfa\xec\x2d\xf1\xbd\xf4\xd9\x3d\x3e\xf4\x59\x8d\x97\x3e\xab\xb9"
- "\x7a\x7d\x36\x2c\xfd\xda\xe9\xd8\xdb\xde\xed\x90\xf7\xa2\x63\x5f"
- "\x71\xd3\xb1\xc1\xa8\x63\x6f\x9d\xd9\x5b\x7f\xed\x2c\x83\xfe\xaa"
- "\x12\xfb\xeb\x6f\xfe\x0e\xe5\x8d\x7a\xf8\xa3\x86\xfe\xfb\xab\xa3"
- "\xcc\x65\x3f\x79\xed\xb3\x29\xd8\x67\xcb\x89\xc5\xca\xfa\xec\x22"
- "\xa9\xcf\x96\x89\x63\x9d\x3e\xfa\x6d\x98\xb7\x7e\x8b\xf1\xb7\x30"
- "\xf6\x56\x9f\xfd\x56\xb4\x97\x3a\xef\xc0\x7e\x6b\xbe\xc1\x74\xed"
- "\x6d\x41\x9e\xfd\xf6\xb6\x69\x9e\xfd\x76\xd4\x79\x57\xbf\x15\x9f"
- "\x0d\x4a\xbf\xbd\x4d\x79\x7d\xfa\xed\x6d\xca\xef\x8f\xae\xd5\x44"
- "\x5e\x3b\x5d\x7b\xfb\x8b\xac\xdf\x7a\xd3\xb5\x06\x51\xd7\x06\xa3"
- "\xae\x1d\x1d\xe8\x5b\xdf\x1d\xed\xfc\x1f\xde\x77\xaf\xb2\xce\x1d"
- "\x73\xd0\xb3\xef\x8e\xb1\x7b\xf6\xdd\x31\x3b\x5c\x7d\x57\x7c\x36"
- "\x28\x7d\x77\xcc\x81\xeb\xd3\x77\xc7\x1c\xf8\xfe\xe8\xdc\xdb\xbd"
- "\xee\x51\xd6\x8e\x25\xc6\x46\x59\xf8\xc3\x96\x32\xb6\x5f\xce\x68"
- "\x71\x3c\x40\xd8\x1e\x13\x59\xf8\x12\x8b\x26\x9a\x08\x05\x7f\x8f"
- "\xc0\x18\x2a\xb8\xd7\xe5\xf7\x6e\x7b\x49\xd8\xfa\xab\x2c\x3c\x5f"
- "\xda\x0b\xb3\x45\x8c\xb3\xd2\xd7\x5e\x18\x9a\xb7\xb7\x42\x7c\x4f"
- "\x3c\x3f\xb1\xb7\x52\xba\x67\x7e\x5f\x64\xe1\x55\x34\x7f\xef\x1e"
- "\x5b\xd0\xde\x3d\xde\xd6\x48\x42\xb2\x29\xc5\xfd\x1f\x17\xc6\xce"
- "\x26\x17\x0a\x08\x29\x61\xeb\x0f\x77\x00\x3f\xc2\x23\xf8\xbe\x07"
- "\xa7\xed\x82\x29\x9e\x40\x5a\x98\x94\xc6\x62\x5e\x9b\x02\xa8\x00"
- "\xcf\x68\xf1\xdc\x86\x2d\x7a\xa2\x44\x9f\xc4\x53\x2e\x21\x16\xef"
- "\x18\x0f\x32\x82\xed\xed\x60\x6b\xee\xb7\xdd\xde\xb6\xb9\x95\x28"
- "\x6a\xd7\xb0\x3d\x6e\xb8\x87\x66\x6b\x31\xe2\x3f\x60\x52\x29\x95"
- "\x2b\x88\xb0\x69\x56\x33\x0d\x5e\x6b\x66\x7b\x7e\x01\x2b\xd2\xbe"
- "\x1a\x8c\xe3\x27\xdc\x31\x2b\x4f\xf2\x8b\x4b\xa1\x7e\xef\xeb\xf1"
- "\x4c\x68\x00\xdd\x9c\x46\xd4\x70\xa9\x68\xd1\x5a\x33\xd4\x6b\xbb"
- "\x34\x77\xe8\x75\xff\x36\xc6\xed\xbd\x5d\xa3\x10\xf7\xf0\xa0\x7f"
- "\x00\x76\x1e\x72\x9d\x5c\xc8\x73\x42\x3a\x35\x19\xa8\x25\xd3\x41"
- "\x42\x81\x16\xb8\xde\x8e\xf1\xbf\x84\xcd\xb3\x49\xce\x18\x42\xfe"
- "\xb2\xaa\x59\x8e\x7b\x2f\x9c\xff\xfb\xf6\x36\xb3\xfe\x3f\x70\x3d"
- "\x9e\xf9\xfa\x3f\x2d\x1b\xfb\xa7\xb8\x6f\x78\x8c\x5e\xf8\xff\x5d"
- "\x5c\x77\x98\x0b\xf7\xb8\x9e\x2d\x5c\xd0\x28\x30\x2f\xa4\x2f\x32"
- "\x67\x1c\x23\xa1\x3a\xb6\x2f\x5e\x29\xe6\x8d\xc2\xbc\x56\xd9\xd8"
- "\x3d\x58\x07\xb8\x9f\x8e\x73\xe5\xb8\x77\x9e\x9d\xb1\x28\x9b\xd5"
- "\xcc\xe4\x43\xe1\x5a\x33\xb4\x9f\xed\xc7\xc4\x76\xae\x83\x36\x43"
- "\x1e\x15\xee\xad\x61\xbf\x7a\xa2\x5e\x0f\x69\x58\x0e\xfc\xaa\xd8"
- "\xfe\x5e\xd9\x58\xf4\x99\xe1\x6d\x8f\xb6\x02\xe4\xb1\x99\x02\xb6"
- "\xf9\x39\x19\xd9\xa1\x46\xd9\xb8\x79\xa1\x32\x4a\xe1\x9b\x79\x39"
- "\x38\x87\x8d\x7b\xb1\x71\x7f\xb9\x6c\xdc\x64\x28\x5f\xb1\x85\xcd"
- "\xd9\x8e\x53\x59\x65\x77\x54\x74\xed\x1d\x60\xeb\x2c\xe3\x92\xf0"
- "\x3b\xf8\x0e\xcf\x3f\x96\xed\x91\xc0\x3a\x6b\xf5\x01\x14\x9e\xcf"
- "\xe5\xfb\xb5\x95\x89\xf0\xfe\x9c\xae\xfd\xda\xfc\x3d\xc0\xd2\xb8"
- "\x44\xe0\x19\x3b\xf7\x81\xf7\x5e\xf7\x0f\x8b\x7c\xab\xd1\x00\x36"
- "\xba\xf3\x4e\xc2\x08\xe0\x42\xc2\x08\xd6\xf7\x1d\xbd\x55\xce\xf4"
- "\x91\x6c\x1c\xdb\x27\x5b\x0c\x3c\x74\x6e\xd4\x28\xd8\xbc\x74\x27"
- "\xf2\xa5\x11\x9e\x69\xdf\x46\xbe\xac\x03\x5d\x20\xe6\xad\x72\xd5"
- "\x1f\xef\xb5\x8c\x9f\x02\xf0\x82\xed\x4f\x92\x69\x5f\x66\xb1\x96"
- "\x40\x66\xe0\xbe\xf2\x03\x99\x04\xd7\x3f\x9b\x29\x60\xe4\x2f\x69"
- "\x76\xf9\xe6\x0c\x9e\xfe\x7e\xab\x5d\xbe\xee\x0c\x41\xd9\x42\x8a"
- "\x9e\x27\x0a\xd0\x43\x0a\x2c\x93\x86\xcf\xca\xbb\x57\xe2\xe3\x2a"
- "\xe0\x5d\x06\x60\x17\x68\xbe\x0e\xe8\xb7\xb9\x83\xad\xd3\xe4\x6d"
- "\x16\x88\x4a\x80\x7c\x56\x99\x76\x0f\x94\xa7\xc6\xb8\xa2\xb8\xff"
- "\x19\x68\x98\xde\x9e\xab\x2d\x91\x68\x88\x75\xc2\xfd\xcb\x18\x63"
- "\x14\xf2\xaa\x38\x86\xc6\x35\x48\x6d\xf6\x46\xcf\xa2\xbf\x90\xf0"
- "\xa2\x29\x24\x5a\x50\x9e\x8c\xa0\x01\xb7\x6f\xc5\xf9\xe6\xd8\x16"
- "\xf4\x2f\xd5\x4c\xe2\x5e\xfd\x8a\x5a\x6c\x4e\x22\x04\x9d\x8c\xc0"
- "\x35\x08\x67\xce\xa4\x91\x71\x2f\x03\xbd\x40\xdf\x1b\xec\x44\x6d"
- "\xd1\xdb\x78\x4c\x40\x72\x9e\x38\x57\x80\x0c\x07\xb9\x0e\x3a\x55"
- "\x61\x38\x4f\x46\x23\xbd\x84\x60\x53\xc4\x69\xd9\x9d\xc9\xf3\xd3"
- "\x89\x71\x60\x72\xf4\xce\x28\x46\x77\xb0\x2f\x40\xe6\xcb\x71\x0f"
- "\x9d\xc5\x06\xf6\x49\x91\x29\x62\x80\xe5\x64\x7a\x93\x91\xd8\x6e"
- "\x01\xe7\xa1\xc5\x36\xc7\x61\x9b\xdb\xec\x04\xe7\xf2\x63\x5f\x44"
- "\xbf\xc6\x17\x89\x90\x7f\x32\x02\xdb\x0c\xb6\x4e\xf9\xc0\xe7\xf4"
- "\xef\x6c\xeb\xeb\xdb\x14\xe8\x2d\xe4\xdc\xbe\x55\x50\xad\x2d\xc7"
- "\x6f\x63\x1d\xf0\x4c\x4e\xec\x45\xc2\xe8\x8e\xf4\xb7\xd8\x9d\x18"
- "\xd3\xdd\xad\x0e\x8e\x01\xd6\xe1\x2e\xef\xed\x9f\x42\xc2\x0b\xff"
- "\xc2\xf9\xee\xcc\x11\x69\x90\x82\x6b\x60\x6b\xcb\x31\x16\x46\x2c"
- "\xd6\xc1\x76\x96\xcc\x85\xde\x82\xfc\xb7\x44\xb4\x10\x67\xc0\xa4"
- "\x91\xb8\x97\x00\xf9\xaf\x77\x00\xff\x2f\xd9\xd1\x97\x91\xcd\x62"
- "\xbc\x4c\xd0\x7e\x71\x5c\x88\x90\xf7\xe4\xff\xdd\xc9\xf3\x33\x07"
- "\xca\xff\xbb\x07\x89\xff\x77\xdf\x00\xed\x1f\xef\x47\xfb\xc7\x0f"
- "\x52\xfb\xc7\xdf\x00\xed\x9f\xe0\x47\xfb\x27\x0c\x52\xfb\x27\x78"
- "\x6d\xff\xa3\xa3\x05\xca\xf6\x98\x84\xe8\x4b\x50\x07\x70\x7d\xf5"
- "\x83\xa7\x70\x0f\x09\x3b\x83\x25\xde\x13\x7e\x26\x4b\xd9\xed\x5e"
- "\xd5\xed\x5e\xdd\xed\x3e\xac\xdb\xbd\xa6\xdb\x7d\xb8\x74\x0f\x7a"
- "\x24\xf0\x9c\x6c\x42\x0d\xd8\xa5\x46\xab\xec\x07\x29\xe2\xf3\xf1"
- "\xe8\xeb\x0b\x74\xfa\xf8\x3e\xe2\x52\xde\x7e\x46\xf6\x03\xe6\xef"
- "\x92\xe6\x8c\x89\xa0\xab\x8c\x44\x28\x8c\x9d\x17\xbb\x1a\x64\x17"
- "\xf0\x8f\x76\x6a\x86\x80\x8d\x70\x1b\xfa\x93\xc3\x3d\x07\xda\x34"
- "\xdc\x4b\xf2\x83\x7d\xd8\xbe\x29\x3a\x33\x11\x02\x26\xb1\xb5\x7c"
- "\xa1\x28\x76\x9e\x2d\x60\xd2\x18\xfa\x46\x7e\x54\xb1\x5c\x50\x16"
- "\x9b\x04\xed\x6a\x1b\xb5\xcd\x39\x0f\x72\xe8\x22\xfa\x78\x07\x1e"
- "\xa7\x53\x9b\x39\xed\x2c\xd4\xf7\x87\x13\x6b\xb2\xa0\x6c\xf8\x0e"
- "\x7c\x0b\xc6\x71\xb1\x53\x59\x9c\x74\x28\xa3\xb6\xad\x8a\x60\xec"
- "\x1f\xb1\xcc\x78\x1a\x1c\x3b\x15\xcb\xec\xd5\x3e\x2d\xd4\x1f\x80"
- "\x6f\x3e\x30\x3f\x42\x41\x68\xb6\x22\x6c\x60\x3c\xfd\xe1\x1c\xaf"
- "\x76\x6f\xa1\x61\x3a\x2f\x57\xe9\x4f\xb9\xdb\xfa\x28\x57\xac\xaf"
- "\xda\x9f\x72\x1d\xde\xcb\x35\x8a\xf5\xd5\xfa\x51\x6e\xc4\xbc\x3e"
- "\xca\x15\xeb\x1b\xe3\x4f\xb9\x3d\xf6\xa4\xbb\xca\xcd\x16\xeb\x6b"
- "\xf4\xa3\xdc\x89\x0a\xef\xe5\xea\x0f\xf8\x87\x85\x89\xde\xe3\xff"
- "\x02\x16\xfc\xc3\xc1\xc4\x3e\xda\x6f\x38\xe0\x1f\x06\x26\xf5\xd8"
- "\xff\xea\x8e\x01\xff\xf8\x3f\xa9\x4f\xfe\xfb\xc7\xfb\x49\xe5\x7d"
- "\xf1\xde\x3f\xbe\x4f\xf2\x8a\x7f\xb4\xe5\x81\xf7\x46\x1a\x92\xaf"
- "\x15\x8a\x63\x8d\x42\x88\xde\x94\x23\xc4\x90\x47\x41\x86\x85\x96"
- "\x92\x11\x31\x6c\x7c\x7c\x4f\xc9\xea\x32\x22\x87\xf1\xae\x7c\xc7"
- "\xaa\x7a\xb9\xc5\x11\x8d\x3a\xc7\xb9\x2d\xc3\x2e\xbb\x1b\xd2\xf7"
- "\x81\xc4\x6c\x03\xbb\x93\x97\x13\x6b\x2c\xd6\xc7\x10\xd1\xbf\x45"
- "\x1b\xfa\x33\x8d\x03\x39\x66\x29\xb5\xe3\x9e\x95\x11\xf0\x9e\x03"
- "\xf0\x0b\x65\xd8\xc9\x3b\x82\x4d\x16\x93\xc6\xf2\xd9\xd8\x59\xba"
- "\x62\xbd\x89\x1a\x22\xd0\xcf\xa1\x0d\xbe\x79\x39\xc0\x46\xe4\xe8"
- "\x8f\xa8\x3d\xf7\x9e\x36\xab\x2c\xb2\x49\x3c\x3b\xda\xc2\xfc\x71"
- "\x42\x7d\xf1\x5c\x26\xe6\x45\xbf\x9c\x53\x74\x44\x8e\xbe\xd2\xdb"
- "\x73\x23\xb5\xe8\xa3\xb3\xaf\x33\xd8\xce\xc2\xb5\x49\xf8\x3e\x2d"
- "\x04\x1d\x7a\x96\xc8\xf1\xdc\x25\x8c\x03\xac\xc5\x30\x86\x98\x31"
- "\x11\xe7\x3c\x5a\x89\x7e\x35\x15\x70\xfe\x89\xaa\x4c\x1a\xdc\x17"
- "\xc7\xf6\x78\xcb\x22\x2b\x37\xf3\x3d\xdf\x76\x16\x17\x18\xee\xd9"
- "\x38\x06\xf7\xc5\xa8\x62\x95\xb4\x38\x38\xa6\xb6\xad\x95\xc5\xf6"
- "\x69\x94\x45\xbe\x87\xbe\x12\x2f\xa8\xd6\x26\xb6\xa9\xd6\xa6\x40"
- "\xbd\x2a\xa4\x36\xe0\xf7\xa5\x74\x1c\xb7\x61\x3e\x78\x5e\x2f\x9d"
- "\xc9\xf6\x12\x27\x7b\x64\x9c\x86\xda\xba\x7c\x60\xc8\xa6\x3c\x88"
- "\xb4\x07\x5b\x21\xa1\xcd\x10\x31\x96\xcf\x63\x4c\x4e\xc2\xf1\x30"
- "\xd4\x7b\x3a\x1f\x9b\xc6\x4e\x67\xfe\x72\x41\x07\xcc\x8f\x90\x0f"
- "\xd0\x6e\x9d\xcc\xf4\xbf\x79\x2c\xea\xc8\x29\x13\xa0\xfc\x9f\x34"
- "\xca\x26\xf3\x73\xc9\x85\xb1\x09\xec\x2c\xa2\x6c\xf2\x78\xf8\x46"
- "\x02\xdc\x13\xcc\x07\xcf\xcb\xc5\xe7\x89\x6e\xcf\x13\x71\x9f\xa4"
- "\xf8\x5c\x1c\xcb\xc5\x26\xb9\x3d\x4f\xd2\x8d\xc5\xb9\x89\xc9\x36"
- "\x6c\x03\xd0\x31\x06\x75\x5b\x97\x4f\x8f\xe0\xd8\x18\x31\xdf\xbc"
- "\x16\xd9\x94\xa0\x0b\x80\x2d\x78\xbe\xc0\xed\xfd\x05\xfb\x33\xa3"
- "\xc8\xa3\x9b\x90\x86\x53\xc2\xad\xf2\xb5\xdb\xf8\x78\x76\x32\xd3"
- "\xad\x50\x5e\xb4\x7b\x79\x90\xde\x0c\x65\x46\xb7\x81\x1d\x05\xff"
- "\xab\xf1\x9b\xee\xf4\x96\x4e\x44\x6a\x93\x96\x2e\xd2\x2e\x5e\xbe"
- "\x72\x19\x9e\x68\x1b\xe6\xb1\xbf\x51\x8d\x67\x3e\x85\xc2\x9c\x99"
- "\x96\x52\x3c\x83\xa6\x66\x67\xb7\xd7\x03\x1f\x1d\xc5\x79\x46\x67"
- "\x48\x9e\xda\x59\x6c\x8a\x32\x5c\x24\x72\xbd\x86\x9e\x30\xaf\x7a"
- "\x84\x9c\x93\x4d\x79\x97\xc5\x3d\xd5\x32\xbf\xd0\x6d\xe6\x55\xff"
- "\xc4\x34\xe6\xd3\xdb\x92\xc8\xd3\x76\xeb\xab\xe4\xff\xd0\xd7\xcb"
- "\xab\x13\x5b\xc9\x7e\x8d\x8d\x1c\xd0\xb6\x92\x32\x4c\x17\xea\xe4"
- "\xb8\x6f\xf4\x9c\xec\xde\x3b\xf0\x5b\x38\xc6\xc7\xff\xf9\x7c\xc5"
- "\x94\x37\xf1\x3b\xe8\x4f\x03\x68\xf3\x36\x7e\xcf\x2a\x9b\xb2\x2d"
- "\xa0\x8c\xed\x33\x56\x41\xbe\x45\x42\x51\xce\x4c\xd6\xc7\x73\xa7"
- "\xcc\x73\xc8\x55\xdb\xc4\x33\x6e\xcc\xcf\x7f\x7b\xee\xbd\x73\xdc"
- "\xce\x73\xaa\x2e\xc8\xc9\x43\x90\x96\x28\x9d\x2d\xc0\x38\x63\xde"
- "\x64\xc6\x65\x18\xcb\x5e\x2e\x9b\x95\x22\xa8\x72\x80\xbe\x39\x33"
- "\xab\x80\xb3\xa1\x3a\xdc\x9f\xda\x01\x75\xf9\x51\x0c\x0d\xce\x89"
- "\xd6\x63\x3f\x05\x5a\xfc\x5f\xdc\xc7\x17\x92\x67\xdc\x8e\xfb\xf6"
- "\x8a\xf3\xd4\x7f\xce\xb0\xcb\x3f\xaa\xae\x20\xda\x5f\xa2\x3d\x74"
- "\xef\xa1\x9f\x27\x51\xc7\xa4\xc3\x66\x52\xdd\xb4\x8b\x7c\xdc\x50"
- "\x45\x54\x0b\x48\x80\xc1\x4a\x9d\x6c\xbc\x9f\x4e\xe4\x71\x56\x12"
- "\xa0\xbf\x88\xfd\xd4\x49\x0c\x2b\xe1\xd7\x5e\x03\x36\x4e\x6a\xf5"
- "\x0e\x7d\x73\xa0\xf6\x09\x42\xa0\x3f\xb1\x75\x63\x76\xce\xc6\xc6"
- "\xce\x28\x07\xe3\x1c\xb6\xdb\xf9\x9a\xcc\xd5\x67\x89\xb2\x26\xe5"
- "\x38\xc9\x4a\xa4\x82\xf3\xa5\x88\x91\x71\x89\x01\x94\x9d\xb1\xc9"
- "\x84\xcc\x3a\xe0\xe9\x4b\x11\x21\x1b\x32\x48\x58\x6d\xba\x95\x58"
- "\x9a\xab\xc8\xc6\x34\x12\x46\xdb\x53\x82\xaa\xab\x3f\x22\xb4\xa0"
- "\xc9\xf6\x8e\xde\x1c\x28\xed\x99\x0a\xcd\x96\xe1\x9c\x65\x48\x21"
- "\xee\x9d\xba\x44\xa2\x16\x9e\x32\xb2\x79\x56\x9c\xd3\x76\xb4\x47"
- "\x68\x3b\xdb\x23\xee\xea\x68\x8f\x18\x2b\xcd\x85\x3f\xb5\x44\x4d"
- "\x36\xe1\xd9\x9c\xdc\xbb\xa6\xe1\x5e\x3d\xb4\xed\x1d\x41\xcd\x76"
- "\x9c\xf7\x46\x5c\xc2\xb7\xc3\x85\xc5\x11\xe4\x5e\x1b\x3b\xfb\x83"
- "\x73\xf1\xea\xcd\xcf\x40\x7d\x5b\x5a\x89\xfb\xfe\x9f\xcb\x2f\x45"
- "\xc8\x71\xef\x0f\xcd\xbd\x37\xb3\x63\xd3\xac\x14\xdc\x03\x04\xba"
- "\x60\xea\xc0\xfb\xf6\x8f\xd8\xdc\x04\xb6\x1f\xf8\x61\xdc\xde\x8a"
- "\xfc\x01\x3e\xb5\xda\xe4\xc8\x8b\x9a\x24\xe4\x43\x9d\x07\x1f\x18"
- "\xdf\xd2\xec\x72\xe4\x07\xf2\x02\x79\xe2\xe2\xc7\x11\xc6\x8f\xed"
- "\x02\xe7\x47\x07\xe8\x01\x89\x27\x97\xc3\x67\x65\xf6\xc5\x17\xe4"
- "\x07\xf2\xa6\xba\xe9\x38\xf1\xe0\x89\x8d\xf3\x04\xe8\x39\x52\xe2"
- "\x0b\xf2\xc4\xd2\x02\xb6\x2e\xf0\x65\xf6\x11\x42\x7e\x3e\x91\x0a"
- "\x35\x73\x3e\xe9\xe2\x8f\xc3\x1b\x7f\xbe\x71\xf1\x07\x78\xdf\x93"
- "\x3f\x67\xd5\xb8\x36\x83\xfc\x31\x0f\x84\x3f\xd5\x4d\x9c\x3f\x0e"
- "\x91\x3f\x13\x67\x12\xb9\xbd\x3d\x42\xfe\x46\x06\x89\x9e\x73\x4a"
- "\x4b\x0e\x26\xd4\x10\xa0\xb5\x52\x28\x5a\x9b\xe0\x5f\x3f\x9a\x9a"
- "\xe7\x7b\x3f\xfa\xcf\xd1\x37\xfb\xd1\x40\xfb\xd1\x7f\x98\xaf\xac"
- "\x1f\x4d\x9d\x77\xb3\x1f\x5d\xab\x7e\x34\x35\xbe\x7b\x3f\xea\xd2"
- "\xd5\x69\xc9\x4b\x17\x2d\x59\x86\xc7\xf7\x9e\x79\x39\x3d\x79\x05"
- "\xd7\xd8\x1e\x3a\x5b\xe3\xd4\xc7\xc8\xd1\xff\x5a\x75\x69\x1d\x79"
- "\x67\x4c\x9d\xdc\xf9\xb5\x46\x41\xf3\x3a\x63\x84\x3c\x67\x15\xfa"
- "\xd1\xc4\xfe\xb6\x1e\x7d\x5c\xc8\x1e\x38\x50\x1b\xce\x63\x56\xe2"
- "\xff\xcc\x5e\x09\x9f\x65\xc7\x35\x92\x9c\x0e\xb8\x56\x11\x45\xa8"
- "\x9d\x28\xcd\x63\xd9\xf3\x3b\xd1\xaf\x20\xdd\x34\xcb\xbe\x19\x9e"
- "\xa1\x9f\x9a\x36\x55\x2c\x59\x03\xe5\xd9\x82\x73\x66\x2a\xb4\x78"
- "\xce\xe1\xfe\x9d\xa0\x93\x53\xbb\xfc\x0e\xc9\x7e\xdc\x44\x87\xdc"
- "\x8f\xfb\xdc\x67\xe2\x99\xb3\x73\xb2\xfb\x4f\x5d\x36\x11\xf4\xaf"
- "\x61\x9b\x3f\x11\xbe\x75\xc7\xac\x4c\xe6\x87\x00\xfa\x3d\x7f\x1e"
- "\xcd\xd6\x9d\x3a\x55\xa6\x28\xb4\x15\x2f\xa8\xf2\x8c\x17\x0a\xf3"
- "\xd4\x1f\x65\xed\x24\xda\x27\xb0\xdf\xff\xaf\x11\xb3\x4b\xa1\xdf"
- "\xc7\x9b\x49\x8d\xe6\xcf\xe4\xe3\x04\xc0\x5b\x42\x7f\xfd\xde\x0d"
- "\x67\x63\x7d\xeb\xf7\x12\xbe\x10\x57\x88\x2f\xc4\xd6\x70\xc0\x16"
- "\xe2\x4d\xc2\xd7\xef\x2f\x71\x7c\x85\x36\x10\xf5\x86\x56\xc0\x98"
- "\x83\x63\x0c\xcf\x01\xd7\x64\x7e\xe2\xbd\xff\x5f\xea\x86\x2f\xb9"
- "\x88\xaf\x97\x00\x5f\x2f\xb9\xf0\xf5\xe4\x71\x35\xd9\xc8\xf0\x75"
- "\xa7\x0b\x5f\xf9\xcd\x76\x09\x5b\x88\x33\xc4\x94\xf0\x5c\x04\xc1"
- "\x3e\x2f\xe1\x6c\xf3\xb3\x7c\x9d\x93\xf5\x7f\x39\xf4\xff\x76\x37"
- "\x3d\x7a\xc7\x95\xf4\xff\x68\xd6\xff\x91\x27\xc8\x1f\xe4\x0b\xf2"
- "\xe2\xdf\x91\x0f\xe8\x03\x96\xb6\xf7\xc6\x0b\x6d\x55\x7f\xbc\x40"
- "\x3e\x20\x3f\x18\x1f\x80\x1f\xd2\x9a\x33\xae\x41\x22\x4f\x90\x17"
- "\x53\xb2\x88\x1c\xf9\xb2\x19\xfa\x3c\xf6\x73\xa0\x6d\x3c\xf2\x85"
- "\xd9\xae\xa6\xe0\xd4\xf5\x78\x6e\x56\x8c\xaf\xdb\x9e\xfb\x80\xa2"
- "\xa7\xdd\xfa\x80\xa6\xcb\xef\xa3\xec\x7e\x36\x2e\x33\x8f\x79\x00"
- "\xfa\xdb\xfd\xe2\x98\xc5\x64\xe7\xeb\x47\x3f\x59\x29\xf6\x69\x2b"
- "\x8e\xff\xd8\x58\xcf\x09\x63\x3d\x15\x8c\xf5\x0a\x61\xac\x97\xd9"
- "\xcc\x7d\x05\xc8\x1e\xe0\x71\x90\x70\x6c\x17\x6c\xd2\xc0\x38\x83"
- "\xf9\xe9\x63\xeb\xa6\xc1\x6b\x13\x71\x9d\x87\x16\xc1\x38\xf2\x2d"
- "\x39\x81\x7b\xc0\x90\x73\x80\xd8\x79\xa0\x44\x5c\x17\xde\xa3\x5b"
- "\x85\x7b\x06\x7e\x92\xc8\xeb\x77\x3f\xf3\x41\xc5\xd6\xd4\xe4\xc2"
- "\x56\x67\x8e\xe7\x9a\x9a\xfb\x9a\xeb\x3b\x7a\x9b\xb8\x9e\xf6\x93"
- "\x87\x59\x1e\x3c\xb7\x01\x72\x6d\x87\xbe\x4e\xee\x5a\x53\xfb\x04"
- "\x9f\xcf\xf2\x5c\x53\xfb\x49\x38\x3f\x13\xf6\x93\x74\xdc\x47\x02"
- "\xf7\x51\x3c\xfd\xfe\x14\xf7\x74\xd7\x9a\x35\x4f\x17\xe4\x2c\xc6"
- "\x08\x8e\xb9\x5b\xf8\x58\xfb\x27\x85\xd2\x98\xd6\x8b\x7d\x33\x00"
- "\xb9\x1b\x13\xef\x92\xbb\x31\x6c\x6f\x21\xd5\xe4\x47\xd4\xf4\x90"
- "\xbb\xc7\xe0\xf9\x43\x3b\x62\x51\xee\x16\x9a\xb4\xbc\x7e\xd3\x46"
- "\x03\x4d\x02\x30\x56\x24\xa6\xe3\xf9\x1d\x94\xbf\x9b\xf0\x6c\x0b"
- "\x93\xc9\xf9\x9a\x35\x6c\xed\x7c\xda\x34\x4f\x59\xfc\x90\xce\x53"
- "\x16\x4f\x7b\xb1\x6f\x59\xfc\xd3\x5b\xfb\x96\xc5\xd3\x36\xdd\x94"
- "\xc5\xfe\xca\x62\xb0\xc5\xae\x48\x16\x3f\x68\xbd\x29\x8b\xaf\x96"
- "\x2c\x7e\xb0\xc1\x4d\x16\xff\xca\x53\x16\x3f\x54\xd2\x53\x16\x3f"
- "\xb4\xcd\x25\x8b\xa7\xcd\x74\xc9\xe2\x69\xc4\x53\x16\x3f\x2c\xf3"
- "\x4d\x16\x3f\xe4\xbc\xba\xb2\x38\x26\xdc\x53\x16\xc7\xb4\x88\xba"
- "\xe2\xc4\xc0\x65\x71\x4c\x4d\xdf\xb2\x38\xe6\x88\xa7\x2c\x8e\x29"
- "\xe7\x32\xf7\x61\xc2\x65\x71\x4c\xa5\x28\xa3\xad\xee\xe9\x2e\x59"
- "\xcc\xd3\x7b\xca\xe2\x87\x35\xfd\xc8\xe2\x08\xa7\x20\xc9\xe2\x7a"
- "\x90\xc5\xf5\x72\xe1\x39\x6f\xb2\xf8\xb1\x99\x35\x28\x8b\xd3\x50"
- "\x16\x3f\x36\xb3\x6f\x59\xfc\xd8\x7d\x28\x73\x01\xaf\xa4\x0c\x7d"
- "\xfc\x02\xfe\xcc\xcf\x1e\xc3\x39\xdd\x26\xc4\xe7\x69\xd9\x8c\xa2"
- "\xd8\x2c\x77\x59\xfd\xf0\xc1\x2e\x59\x0d\xe9\xc2\x68\x4f\x59\x8d"
- "\x72\x1a\xe5\xf5\xa6\xd7\xa9\x75\xf3\xeb\xb4\x01\xda\x65\x93\x64"
- "\x76\x11\xa4\x61\xbc\x1f\xf4\xe1\xb3\xe9\x12\xbb\x14\x40\x83\xa6"
- "\x1c\xf8\x2e\xbe\xd3\x9e\xfb\x48\xb8\xa7\x7c\x9f\x11\xef\xc8\x75"
- "\x97\xef\x8f\x3c\x8e\xf2\xbd\x90\x9f\xd9\x66\x72\xdd\xb1\x69\x56"
- "\x26\xca\x7a\xfe\xfc\xd1\x8b\x7d\xcb\xf7\x47\x56\x5f\x2f\xf9\x8e"
- "\x32\x65\xb8\xdb\x58\xce\x9b\x5c\x81\xb6\xb5\xd5\x24\x5d\x1b\xf9"
- "\x8e\xf2\x04\xe5\x08\xca\x16\x49\xbe\xa3\x6c\x71\x88\x63\xed\x32"
- "\x93\x9b\x7c\x1f\xe2\x26\xdf\x65\xfe\xc8\xf7\x47\xcd\xdf\x2b\xf9"
- "\x8e\x7c\xc8\xba\xba\xf2\x5d\x1a\x57\x23\x1f\x90\x27\xc8\x0b\xf7"
- "\xb1\x35\xf2\x01\xf9\x81\x7c\x40\x9b\x46\x92\xef\x93\x33\xb9\x7c"
- "\xdf\xd4\x25\xdf\x1f\xad\xec\x92\xef\x72\x2e\xdf\xcb\xd0\x37\x1a"
- "\x9b\x23\x9e\xa1\xeb\x29\xdf\x67\xac\x71\xc9\xf7\x47\x22\x44\x79"
- "\xd7\x84\xbe\x05\xa0\x7f\x6f\xf7\x94\xf1\x8f\x5d\xf6\x4d\xc6\xcf"
- "\x38\xd1\x43\xc6\x03\x0d\x0b\xf9\xda\x10\xca\xf7\x44\x94\xef\x0e"
- "\x94\xf3\x7e\xc9\xf8\xc7\x88\x4b\x0f\x3d\x5c\xc8\x65\xeb\x8c\x32"
- "\x4f\xb9\xff\x58\x93\x28\xa3\x96\xba\xcb\x7d\x21\xc0\x17\xb9\xff"
- "\xd8\x41\x49\xee\xa3\x5c\xdd\x21\xd4\xbb\xc9\x7d\x26\x27\x6b\xcc"
- "\x19\x8d\x6e\x72\xff\xb1\xad\xbc\x0e\x8f\xd9\x9d\x4c\xee\x3f\xb6"
- "\x87\xa7\x3f\x9c\xea\x9e\xee\x92\xfb\x3c\xdd\xe9\x2e\xf7\x9b\x51"
- "\xee\xff\x4c\xdd\x8f\xdc\x9f\xea\xbb\xdc\x9f\x53\xe1\x92\xfb\x73"
- "\x2a\xfa\x96\xfb\x73\xde\x46\xb9\xcf\x7c\xc2\x02\xef\x01\xcf\x8a"
- "\xe2\x51\x5c\xe6\xe3\x9c\x08\xe8\x02\x2b\xfa\xb4\x80\x7c\xaf\x31"
- "\xdf\xef\x70\xc1\xf3\xe6\x42\xfc\x5f\x60\xef\x34\x84\xda\x88\x12"
- "\x75\x40\xe1\x69\xa2\xc0\xb8\x69\x9c\x4e\x3f\x3f\x5b\x86\xb1\x3c"
- "\xbb\xf4\xc5\xcf\x2e\xfa\xa8\x2f\x0e\x83\xbe\xa8\x6b\xcf\x9d\xa9"
- "\x75\xd3\x17\x18\x7b\xae\xae\x9b\xbe\xb0\x82\xbe\x68\x92\xde\x81"
- "\xfc\xf1\xee\xf9\xb1\x7e\x2c\xff\x69\x76\x61\xfe\x7a\xc8\xdf\xc0"
- "\xf5\xcb\xcc\x2c\x4f\xfd\xf2\xf3\x9d\x82\xc7\xf8\x61\xe6\x5f\x25"
- "\xfd\x82\xfa\x59\xe8\xa1\x5f\x66\xcf\xef\xd2\x2f\xa3\xdc\xf4\x4b"
- "\xa6\xa4\x5f\x66\x1e\xbf\xe1\xc7\x0f\x57\x20\xd7\xfc\xd5\x2f\x28"
- "\xd3\x50\x9e\xf5\xa5\x5f\x04\x37\xfd\x22\xf8\xa5\x5f\x66\x6b\xbf"
- "\x57\xfa\xe5\x1a\x8c\x1f\xdc\x79\x80\x7c\x61\xba\x05\x78\x83\x7c"
- "\x40\x1e\x20\xfd\xd1\xff\x34\xf2\x06\xf9\x82\x3c\x99\xac\x73\xe9"
- "\x16\xc6\x17\xa6\x5f\x66\x87\x77\xd7\x2f\x9b\x47\x4a\xfa\xe5\xe7"
- "\x75\x3d\xf5\xcb\xcf\x9b\x5c\xfa\x65\x26\x9b\xbf\x61\xfe\xf5\x64"
- "\x3f\x6b\xf0\xd4\x2d\x73\x97\xf8\xa6\x5b\xe6\x3c\xd8\x8b\x6e\x61"
- "\xbe\x8d\x0b\x5f\xf7\x18\x3b\x24\x82\x7e\xf1\x43\xb7\xcc\x59\xc0"
- "\xeb\x88\xfb\x97\x7f\xb6\x9d\xcb\xef\x9f\xdb\x5d\xfa\xe6\x67\x6b"
- "\xdc\xd3\x5c\xfa\x66\xee\x3c\x51\xc6\x25\x0f\x5c\xdf\xcc\xbd\x8f"
- "\xed\x3d\x80\x36\xec\x68\xe5\x32\xdd\x53\xdf\xcc\x7d\xd0\x53\xdf"
- "\xcc\x55\xf3\x3a\xcc\x4d\xe1\xfa\x66\xee\x78\x9e\xfe\xb3\x24\xf7"
- "\x74\x97\xbe\xe1\xe9\x3d\xf5\xcd\x5c\x63\x3f\xfa\x46\xd5\x19\x3e"
- "\x2b\xb3\xb3\x30\x2f\xd1\xb1\x6d\x36\x89\x4c\x78\xc8\xd9\xbd\xdf"
- "\xf0\xfe\xe2\x24\xd8\x7f\xba\xd6\x9f\x9e\xe6\xeb\x1d\x82\x78\x06"
- "\xb8\x23\x7c\x56\xca\xe9\x54\xe8\x3b\x2d\xde\xfb\x0e\xf4\x1b\xa5"
- "\xd4\x6f\x6a\x52\x4e\x11\xe8\x4b\x72\x5c\x93\xda\x08\x7d\xc6\xd2"
- "\x56\xcf\xfa\x90\xaa\x29\x86\xa0\xef\xc4\xe0\x16\xa2\x0e\x96\xc9"
- "\x86\xe0\x7a\x87\x13\xfa\xcf\x8c\x89\x54\xb8\xa7\x3e\x86\x04\xa7"
- "\x90\x10\xec\x43\x7f\x11\xd7\x3d\xd0\x7f\x03\xae\x77\x00\x7e\xa3"
- "\x16\x1e\x72\xad\x77\x74\xf8\xb0\xde\x61\xc9\xb4\xb2\xf5\x0e\x3c"
- "\xd3\x24\x40\x3f\x61\xe7\x6c\x70\xbd\xc3\xce\xd6\x88\x98\xfc\xda"
- "\xc2\xd6\x3b\x1a\x09\xae\x75\x48\xfe\x59\x70\x8d\xe3\x9e\x04\x22"
- "\x47\xff\x0e\x1b\xa1\xdf\x1c\x8c\xa8\x61\xfd\x66\xe0\x32\x2c\xb6"
- "\xa9\xaf\x7d\x3e\x0e\xa0\xa9\x53\x95\x97\x48\x37\xe4\xc7\xff\xdf"
- "\x46\xbb\x0c\x7d\x53\x3a\x81\x47\x02\xc8\x2a\xaa\xec\x26\xab\x3a"
- "\x45\x7a\x77\x72\x7a\x03\xaf\x94\x4f\xb7\x11\x0a\xe9\xdc\x37\xa5"
- "\xdd\x0a\x58\x8b\x18\xb9\x69\x15\xd2\x36\x8a\x6c\x12\xfd\x53\x0a"
- "\xaf\xa4\x04\x09\x40\x4f\x3c\xcb\xb0\xe3\x92\x3d\xd0\xa9\x3c\x19"
- "\x51\xd8\x41\x22\x41\x2e\x05\xa3\x5c\x02\x7c\x0e\xdb\xd2\x01\xb4"
- "\x3d\xc1\x69\x8b\xfe\xc5\xf0\xd7\xf1\x4a\x84\x16\xca\xbe\xab\xb3"
- "\x13\xe8\x6b\xe7\xf4\x7d\xfa\x45\x35\xd9\x2c\xad\xf7\x81\xae\xaf"
- "\x05\x9e\x32\xb9\xd4\x16\x4a\x31\xce\x84\xb3\x33\x22\x5c\xf8\x1a"
- "\xe8\xdb\x06\x7d\xaa\x33\x02\xf9\xaf\xde\x7c\x1a\xd7\x27\x8f\xf1"
- "\xf5\xbe\x20\xd1\x6f\xc6\x2b\xa0\x23\x96\x68\x89\xa5\x1c\x64\xf4"
- "\x90\xb9\xeb\x3b\x37\xcd\x4a\x61\x63\x90\xac\x81\xd2\x37\xbe\x87"
- "\xff\xe3\x6b\x43\x5f\xed\xf7\x88\xbe\x71\x91\xfe\xd3\xf7\x71\xaf"
- "\xfb\x3f\xaf\x2e\x7d\xd5\xdf\x23\xfa\xc6\x17\xfa\x4f\xdf\x5f\x78"
- "\xdd\xff\x89\xf4\xc5\x71\x82\x34\x46\x90\xc6\x07\xa8\x57\xb8\x0e"
- "\x9d\x9f\xe5\x1a\x1b\xcc\xcf\x92\xd6\x45\x81\x36\x8a\x22\xf4\xe1"
- "\x0c\x6d\xd6\x3d\x4b\xc6\x9d\x91\xcd\x3b\x2f\xad\x89\x96\x60\x2c"
- "\x11\xe4\xd5\x06\xe0\xd5\x32\x3c\xb3\x22\xf2\x09\xf4\xc0\xc2\x36"
- "\x90\xd5\x77\xcc\xca\x74\x16\x81\x9e\x78\x7b\x36\xf1\xc2\x33\x39"
- "\xca\xf8\xe0\x74\xa2\x7e\x5a\xc7\x79\x27\xbc\x02\x3c\xeb\x00\x9b"
- "\xc8\xde\x4c\xf0\x0c\x6a\x68\x33\xc8\xd5\xce\x94\xa0\x05\x60\x63"
- "\x4b\x7c\xfb\x4b\x86\x9d\xd9\x43\xbd\xf2\xed\x0d\x4f\xbe\x5d\xe8"
- "\x85\x6f\xae\x7d\x06\x60\x9b\x32\xbe\x59\x19\xdf\x98\x5c\x7f\x05"
- "\x6c\x53\xe0\x9f\xc4\x37\x26\xd7\x81\x77\x8c\x6f\x2d\x8d\xcc\x06"
- "\x92\xe4\x3a\xda\x3f\xc8\xbb\xea\x44\xb0\xe7\x72\x1f\x6f\x61\x7c"
- "\xc3\xb9\xed\xc4\x81\xf2\x6d\x5e\xa5\xa7\xdd\xf3\xcb\x89\xbe\xd9"
- "\x3d\xf3\x7f\x8c\x76\x8d\xbb\xdd\x83\xf7\x17\xc0\xce\x71\x06\xaf"
- "\x4d\x6a\xf3\x6b\x1c\x3d\x7f\xa6\xa7\x0d\xf3\xcb\x30\x5e\xa7\x5f"
- "\x64\x0f\xdc\x86\x99\xcf\xe6\xdb\x76\x6c\xe8\xcd\x7e\x99\xef\xf4"
- "\xb4\x5f\xe6\xd7\x71\x3b\xe5\x97\x11\x17\x4c\x68\xbf\xcc\x6f\xe2"
- "\xe9\xbf\x30\xba\xa7\xbb\xec\x17\x9e\x7e\x01\xfd\x94\xe5\xfe\x72"
- "\xea\xc0\x6c\x96\x7b\xaf\xb3\xcd\x12\xd5\x87\xcd\x12\xf5\x6f\x66"
- "\xb3\xfc\xca\x6b\xfc\xcb\x9b\x3a\x55\x92\xf9\xbf\x9c\xe9\xbf\xcc"
- "\x4f\xb0\xdf\xd4\xa9\xfd\xd1\xf7\x57\x56\xff\xe9\xfb\x1b\xaf\xe7"
- "\x1f\xfa\xd7\xa9\x0b\xea\x5c\x3a\x75\x41\x9d\x77\x9d\xba\x60\xc6"
- "\x4d\x9d\xda\x9b\x4e\xfd\x75\x8c\xff\x3a\x75\x81\xda\x53\xa7\x3e"
- "\xb5\xda\x37\x9d\xba\xa0\x68\xf0\x75\xea\x82\x6e\xf3\xd0\x4f\xa5"
- "\xf0\x3a\xfd\xe6\xc8\xc0\x75\xea\x53\xb3\xbc\xeb\xd4\xa7\x1e\xf7"
- "\xd4\xa9\x4f\x8d\xe7\xba\xf3\xa9\x2c\xae\x53\x9f\x8a\xe6\xe9\xbf"
- "\x39\xec\x9e\xee\xd2\xa9\x3c\x9d\xeb\xd4\xa7\xf2\x06\xa6\x53\xc7"
- "\x5d\x67\x9d\xaa\xed\x43\xa7\x6a\xff\xcd\x74\xea\xd3\x2d\x37\x65"
- "\x7e\x7f\x32\xff\xa9\x32\xff\x65\x7e\xa2\xd7\xf3\x8f\xfd\xcb\xfc"
- "\x67\x0e\xb8\x64\xfe\x33\x07\xbc\xcb\xfc\x67\x7e\x7c\x53\xe6\xf7"
- "\x26\xf3\x17\x4e\xf5\x5f\xe6\x3f\xa3\xf0\x94\xf9\x8b\x5f\xf4\x4d"
- "\xe6\x3f\x93\x3d\xf8\x32\xff\x99\x6e\xfb\xff\x16\x2f\xe0\x75\x4a"
- "\xfc\x70\xe0\x32\x7f\xf1\x83\xde\x65\xfe\xe2\x19\x9e\x32\x7f\xb1"
- "\x86\xcb\xf6\xc5\x3a\x2e\xf3\x17\x47\xf2\xf4\xc4\x2a\xf7\x74\x97"
- "\xcc\xe7\xe9\x5c\xe6\x2f\xce\x1a\x98\xcc\x0f\xbd\xce\x32\x5f\xdd"
- "\x87\xcc\x57\xff\x9b\xc9\xfc\x24\xab\xff\x32\xe9\xb9\x04\x97\x4c"
- "\x7a\x2e\xc1\xbb\x4c\x7a\xb6\xe6\xa6\x4c\xea\x4d\x26\x2d\x2e\xf1"
- "\x5f\x26\x3d\x5b\xea\x29\x93\x52\x02\x7d\x93\x49\xcf\xdd\x3a\xf8"
- "\x32\xe9\xb9\xf1\x9e\x32\xe9\x39\x1b\xaf\x53\xf2\x53\x03\x97\x49"
- "\xcf\x1d\xf2\x2e\x93\x9e\x3b\xea\x29\x93\x9e\x13\xd7\xcc\x52\x14"
- "\x5c\x26\x3d\x67\xe6\xe9\xc9\x0b\xdc\xd3\x5d\x32\x89\xa7\x73\x99"
- "\x94\xd2\xdf\xfe\x07\x86\xfd\x1a\x4d\x37\xec\xbf\x20\x61\xff\xf9"
- "\x94\x8f\xcb\x24\xec\x3f\xcf\xf7\x39\x97\xcd\xb2\xff\x36\x83\x28"
- "\x0a\x31\xe6\x06\xf4\x77\xdd\x6f\x10\xfb\x4b\x8e\xe3\xfe\x03\x55"
- "\x03\xc8\xb0\x26\x51\xa6\x65\x82\x4c\x6b\x82\x7b\xf4\x49\x75\xc7"
- "\x2c\x3b\xca\x22\x8c\x45\x80\xf7\x5c\xb6\xd9\x02\xf1\xec\xe6\x80"
- "\xce\x55\x35\x89\xe7\xaa\x92\x7a\x9e\xab\x2a\x73\x3b\xbf\x83\x7d"
- "\x23\x38\x5b\x16\x82\x6b\xc1\x20\xdf\x44\x39\x56\x15\xe8\x50\x8a"
- "\x72\xec\x12\xc8\xb1\x4b\xae\x3e\x81\x72\xec\x02\xc8\xb1\xb6\x97"
- "\x22\xc6\xa2\x2c\xeb\x79\xa6\x8a\xaf\xfd\x32\x39\x96\xdf\x4d\x8e"
- "\x3d\xd7\x4d\x8e\x3d\x0b\x72\x2c\x11\xe4\x58\x90\xab\x3f\xdc\xdd"
- "\x40\xe4\x73\x16\x41\x9f\x00\x39\xf6\xfb\x4b\x28\xc7\x0e\xfa\x29"
- "\xc7\x96\x94\x7b\xf6\x87\x17\x6e\xf5\xad\x3f\x3c\x3f\xc1\x5b\x7f"
- "\xe8\x2c\xf2\xb7\x3f\x3c\x3f\xd5\xb3\x3f\xbc\x40\xc4\x3e\xfa\xeb"
- "\x81\xf7\x87\xe7\x4f\x74\xf5\x87\x17\xba\xf7\x87\xe7\xbf\xf1\xec"
- "\x0f\xcf\x57\x72\xdc\xbf\x10\xc6\xfb\xc3\xf3\x75\x3c\x3d\x25\xc1"
- "\x3d\xdd\xd5\x1f\x78\x3a\xef\x0f\x2f\x68\x6f\xae\xcf\xde\xa8\x3a"
- "\x3a\x75\xcd\xcd\xf5\xd9\xfe\xc6\x65\x2f\x4c\xf5\x7f\x5c\xb6\xf4"
- "\x3a\xad\x7f\x7f\x9f\xe6\x92\x53\xab\xfd\xa7\xef\xf2\xeb\xb4\xfe"
- "\xfd\x7d\x9a\x57\x58\x76\x05\xeb\xdf\xba\x3e\xd7\xbf\xfb\xb6\x63"
- "\x56\x4c\xad\xee\xb2\xe1\x57\x4c\x95\xf6\x6e\xf6\xb4\xe1\xd3\xfe"
- "\xe4\x79\x76\xea\xc5\xf9\xdd\xcf\x4e\xf5\x67\xdb\x3b\xfe\x47\xd9"
- "\xf6\xcb\x0b\xfd\xb7\xed\xd3\xd2\x3d\x6d\x99\x15\x27\x7c\xb3\x65"
- "\xd2\xce\x7b\xb3\x65\x1c\x7e\xdb\xf6\x2b\x88\xa7\x2d\xb3\xa2\x5a"
- "\xe4\xff\x9d\x03\xb7\x65\x56\xec\xf0\x6e\xcb\xac\x78\xd7\xd3\x96"
- "\x59\x91\xc7\x6d\x96\x15\x56\x6e\xcb\xac\x28\xe3\xe9\x2f\x6a\xdd"
- "\xd3\x5d\xb6\x0c\x4f\xe7\xb6\xcc\x8a\x96\x9b\xeb\xb6\x37\xaa\x2d"
- "\xb3\x32\xfe\xa6\xae\xed\x4f\x17\xa4\x13\xff\x75\x41\xc6\xce\x9b"
- "\xba\xb6\x3f\xfa\xae\x2c\xf5\x9f\xbe\x99\x5e\xe3\x5f\xf5\xaf\x6b"
- "\x57\x6d\x75\xe9\xda\x55\x5b\xbd\xeb\xda\x55\xb7\x7a\xea\xda\xcc"
- "\x7d\x37\x75\x6d\x5f\xba\x36\xc3\xee\xbf\xae\x7d\xd9\xea\xa9\x6b"
- "\x5f\x99\xeb\x9b\xae\x5d\xf5\xd4\xe0\xeb\xda\x55\xa9\x9e\xba\xf6"
- "\x95\x68\x91\xff\x45\x03\xd7\xb5\xaf\x8c\xf6\xae\x6b\x5f\xb9\xd3"
- "\x53\xd7\xae\x6a\xe3\x3a\xf5\x95\x39\x5c\xd7\xbe\x22\xa6\x67\x16"
- "\xba\xa7\xbb\x74\x2d\x4f\xe7\xba\xf6\x95\x84\x9b\xeb\xb9\x37\xaa"
- "\xae\xcd\xf2\x1a\xff\xf0\xa6\x2e\x90\x74\xc1\x2b\xa9\xfe\xeb\x02"
- "\x7d\xb8\xff\xba\xc0\xb8\xdd\xa5\x0b\x8c\xdb\xbd\xeb\x02\xe3\x9d"
- "\x9e\xba\x40\x5f\x73\x53\x17\xf4\xa5\x0b\x56\x2b\xfc\xd7\x05\x86"
- "\x16\x4f\x5d\x90\xfd\x6b\xdf\x74\x81\x71\xc9\xe0\xeb\x02\x63\xa6"
- "\xa7\x2e\xc8\x9e\x2e\xf2\xff\x8d\x81\xeb\x82\xec\x09\xde\x75\x41"
- "\xf6\x64\x4f\x5d\x90\x4d\xb8\xcc\xcf\x4e\xe0\xba\x20\x3b\x8c\xa7"
- "\xeb\x4b\xdd\xd3\x5d\xba\x80\xa7\x73\x5d\x90\x9d\x74\x73\x9d\xf7"
- "\x46\xd5\x05\xa6\x2a\xff\x65\xd5\xab\x09\x2e\x59\xf5\x6a\x82\x77"
- "\x59\xb5\xa6\xc6\x53\x56\xe5\xbc\x7c\x53\x56\xf5\x25\xab\xb2\x33"
- "\xfd\x97\x55\x6b\xba\xad\xff\xe6\xfa\xb8\xfe\xfb\xaa\xd7\xf5\x5f"
- "\xff\x65\xd5\xab\xdd\xd6\x7f\x5f\x15\xd7\x7f\x73\x66\x0c\x5c\x56"
- "\xbd\x7a\xc8\xbb\xac\x7a\xb5\xdb\xfa\xef\xab\xe2\xfa\x6f\xae\xb8"
- "\xfe\xfb\xaa\xb8\xfe\x9b\x33\xdd\x3d\xdd\x25\xab\x78\x3a\x97\x55"
- "\xb9\x57\xb8\xfe\x9b\x67\x74\xad\xff\xe6\xb1\x33\x03\x42\x69\x7e"
- "\x44\xcf\xf5\xdf\xb5\x17\x3d\xfd\x98\xe4\xbe\xc6\xd6\x82\xb1\x5f"
- "\xb4\xf1\xb3\xe9\xbd\xae\x0b\x8f\xce\x8f\xb8\xb9\x2e\x3c\x18\xeb"
- "\xc2\x6b\xcd\x9e\xfd\x24\x7f\xb2\x6f\xfd\x24\xef\xc1\xc1\x5f\x17"
- "\xce\x9b\xe3\xd9\x4f\xf2\x35\x22\x26\xfc\x58\x17\xce\xbb\xec\xbd"
- "\x9f\xe4\xcb\x3c\xfb\x49\x9e\xb8\x2f\x37\x3f\x92\xf7\x93\xbc\x66"
- "\x9e\x9e\x9b\xe0\x9e\xee\xea\x27\xb9\x6e\xeb\xc2\xf9\xd1\xbe\xe8"
- "\x74\x87\x2a\x2f\x09\x75\x74\x64\xfd\x43\xce\x2e\x3c\xa7\x8b\x78"
- "\xee\x4d\xa7\x3f\xc3\x65\x3f\xe2\xb8\x73\xdb\x6c\x45\xbf\x3a\xbd"
- "\x49\xd4\xe9\x49\x3d\x75\xba\xa4\xcf\x11\xcf\x1b\x7d\x5a\x13\xee"
- "\x86\xeb\x01\xe9\xf3\xbb\xcd\x57\x82\x6b\xc4\xb4\xa7\x3e\xf7\x17"
- "\xd7\x05\xd7\xe9\xfc\xcb\xf7\x69\x4d\x38\x7f\x8e\xff\x63\xbb\xdf"
- "\x5e\xa7\xf3\x2f\xdf\xa7\x79\xea\x82\x2b\x38\xff\x52\xd4\xe7\xf9"
- "\x97\x9b\x73\x13\x48\xdf\xc2\x18\xff\xe9\x5b\x5c\xe1\xbf\xbd\xff"
- "\x5a\x8a\xcb\xde\x7f\x2d\x45\xb2\x6d\x50\x16\x32\xbf\x3b\x20\xff"
- "\x8a\xd2\xe0\xba\x44\xc8\x6f\xd3\x98\xdf\x71\xa5\xa5\xe9\x08\xd1"
- "\xe9\xd1\xde\x29\x39\x1e\x97\xe9\x6e\xef\xac\x5b\x2d\xd9\x3a\x71"
- "\x68\x07\x81\x5d\x83\x36\x8d\x64\xe3\x97\xb4\xf6\xb3\x1f\x74\xc2"
- "\x6c\x05\x8e\x09\x3a\x83\xf3\x92\xfe\xfd\xc7\x03\x45\x5b\xfd\x1f"
- "\x0f\x94\x74\xdb\xff\xf6\x3b\x1f\xf7\xbf\xbd\xe6\x75\xff\x9b\xff"
- "\xe3\x81\xd7\xba\xed\x7f\xfb\x9d\xb8\xff\x6d\xdd\x7d\x03\xb7\x73"
- "\x5e\xeb\x63\xff\xdb\x6b\xdd\xf6\xbf\xbd\x26\xee\x7f\xfb\x9d\xb8"
- "\xff\xed\x35\x71\xff\xdb\xba\xa9\xee\xe9\x2e\x3b\x87\xa7\x73\x3b"
- "\xe7\x77\x3e\xed\x7f\x03\x3b\x27\xe5\x0a\xec\x1c\xe5\xf7\xc7\xce"
- "\x19\x7f\x83\xd8\x39\xbf\x37\xfa\xa0\x27\x92\xba\xe9\x09\xc5\xff"
- "\x2c\x3d\xf1\xbb\x2b\xd8\xfb\xb6\xbe\xcf\xfd\xff\x8c\xbe\x85\x6e"
- "\xf4\x45\x19\x2d\xd2\xd6\x39\x7e\xb6\xc2\x2f\xfa\x82\x6c\xde\xa4"
- "\xff\xbe\xd0\xf6\xf7\x55\xfe\xd3\xf6\xf5\x69\x37\x6d\x9c\xfe\xe8"
- "\xfb\x87\x08\xff\xe9\xfb\xbf\xcb\xfc\xb7\x71\x36\xa4\x7e\xdc\x65"
- "\xe3\x6c\x48\xed\x6e\xe3\xa0\x4d\x33\xd7\xce\x6d\x9d\xdf\x82\x8d"
- "\x52\xb0\x0c\xec\x9d\x0c\x42\x2c\x4d\xef\x91\x42\xb0\x79\x0a\xce"
- "\x81\xdd\x93\x0a\x76\x8f\xe3\x6d\xd1\xee\x79\xe3\x84\xa7\xdd\x53"
- "\xba\xb2\x57\xbb\x27\xd8\x65\xf7\x38\xc0\xa6\xe9\x7c\x7b\xb6\xa2"
- "\xe4\x9c\x9b\x0d\xf4\x7c\x4f\x1b\xa8\xa3\x08\x74\xce\x84\xd9\xca"
- "\x4e\xb0\x83\xfa\xb2\x81\x18\xef\xbb\xd9\x41\xdf\x3f\x1b\xe8\xf5"
- "\x35\xfe\xdb\x40\x6f\x74\xf3\x21\xba\x71\xb4\x6f\x36\xd0\x86\x89"
- "\x5e\xe7\x7a\xfc\xb6\x81\x36\x44\x7b\xda\x40\x1b\x15\x22\x2e\x46"
- "\x0f\xdc\x06\xda\x70\xca\xbb\x0d\xb4\xe1\xac\xa7\x0d\xb4\xc1\xcc"
- "\x6d\x9d\x8d\x1a\x6e\x03\x6d\x38\xcc\xd3\x4b\x35\xee\xe9\x2e\x1b"
- "\x88\xa7\x73\x1b\x68\xe3\x78\x1f\xd7\x6f\x92\x1c\xa0\x63\xaf\xff"
- "\xbe\xb9\xbe\xd6\x6f\x06\x6b\xdf\xdc\xdd\x37\xc8\xfa\x4d\x59\xde"
- "\x4d\x3d\xdd\x97\x1e\xd9\x18\xed\xbf\x1e\xd9\x74\x9d\xf6\xff\x7f"
- "\x9f\xf4\x74\x59\x9d\xff\xf4\xdd\xd2\xe7\xfe\xff\xbe\xf5\xf4\x9b"
- "\x6d\xae\xb9\x88\x37\xdb\x06\x36\x17\xf1\xe6\x12\x4f\x9d\xbc\x35"
- "\xe8\xe6\x5c\x84\xaf\x7a\x78\x73\xa4\xff\x7a\xf8\xcd\xa9\x9e\x7a"
- "\xf8\xad\x37\x7d\xd3\xc3\x6f\xfe\x75\xf0\xe7\x22\xde\x34\x7b\xea"
- "\xe1\xb7\x0a\x79\x9d\xb6\xec\x1b\xb8\x1e\x7e\x6b\xa9\x77\x3d\xfc"
- "\xd6\x4a\x4f\x3d\xfc\xd6\x4c\xae\x6f\xdf\xda\xca\xf5\xf0\x5b\x0b"
- "\x78\xfa\x16\xb3\x7b\xba\x4b\x0f\xf3\x74\xae\x87\xdf\xda\x3e\xb0"
- "\x35\x97\x71\x37\xe8\x9a\x8b\xf6\xdf\x6c\xcd\x65\x9b\xea\xa6\x9e"
- "\xe8\x4f\x4f\xbc\x65\xf6\x5f\x4f\xbc\x9d\xea\xbf\x9e\x28\x0f\x77"
- "\xe9\x89\xf2\xf0\x81\xe9\x89\xff\x7a\xcd\x53\x4f\xfc\xf1\x47\x37"
- "\xf5\x84\xaf\x7a\x62\xdb\x3c\xff\xf5\xc4\x7f\x2d\xf0\xd4\x13\xe5"
- "\x1f\xfa\xa6\x27\xfe\xeb\xe8\xe0\xeb\x89\xff\x6a\xf6\xd4\x13\xe5"
- "\x7b\x78\x9d\xde\xfe\x66\xe0\x7a\xa2\xfc\x0f\xde\xf5\x44\xf9\x26"
- "\x4f\x3d\x51\xae\xe3\xfa\xa0\xbc\x8a\xeb\x89\xf2\x35\x3c\xfd\xed"
- "\x66\xf7\x74\x97\x9e\xe0\xe9\x5c\x4f\x94\x1f\xbe\xb9\xdf\xee\x46"
- "\xdd\x6f\xf7\xe7\x68\xff\x65\xd9\xf6\x2a\x97\x2c\xdb\x5e\xe5\x7d"
- "\xbf\xdd\xf6\x07\x3d\xf7\xdb\xfd\xf9\x9b\x9b\xfb\xed\xfa\x92\x55"
- "\xe5\xcd\xfe\xcb\xaa\xed\x4a\x4f\x59\xb5\xc3\xc7\x78\x90\xdb\x5f"
- "\x1d\x7c\x59\xb5\x7d\xbd\xa7\xac\xda\x21\xc6\x80\xfc\xf3\xbb\x03"
- "\x97\x55\x3b\x1e\xf6\x2e\xab\x76\xcc\xf2\x94\x55\x3b\xc4\xf8\x8f"
- "\x3b\xd2\xb9\xac\xda\x21\xc6\x7f\xfc\xf3\x1e\xf7\x74\x97\xac\xe2"
- "\xe9\x5c\x56\xed\xf0\xc9\xff\xbf\x6b\x7d\xcd\x2f\x9b\xf6\x1a\xac"
- "\xaf\x0d\x96\x4d\x7b\xa3\xac\xaf\xfd\xe5\xe6\xfa\x4f\x9f\xf6\xec"
- "\x8e\x2b\xf0\xfb\xbf\xb3\xcf\xf5\x9f\xbe\x75\xc0\x6e\x85\x4b\x07"
- "\xec\x56\x78\x5b\x9f\x28\x00\x0c\x15\x82\x3d\x9a\x7f\x8e\x28\x7e"
- "\x8b\xeb\x13\x87\x6b\x48\x11\xae\x4f\x2c\x93\xd6\x27\x36\x89\x36"
- "\xee\xae\x97\x3d\x6d\xdc\xbf\xde\xda\x9b\x8d\x8b\xb6\xad\x13\xec"
- "\x56\x47\xf7\x75\x89\xdf\xf4\xae\x3b\x3a\x82\xf3\x52\x2e\xbf\x3d"
- "\x5b\x39\x10\xdd\xb1\x71\x15\xd7\x1d\x1b\xbe\x57\xba\xe3\x9d\x08"
- "\xff\x75\xc7\xae\xe9\x9e\xba\x63\xf7\x5f\x7d\xd3\x1d\xbb\xf6\x0d"
- "\xbe\xee\xd8\x55\xe7\xa9\x3b\x76\x97\xf1\x3a\xed\xdc\x3b\x70\xdd"
- "\xb1\x7b\xb5\x77\xdd\xb1\xfb\x55\x4f\xdd\xb1\x5b\xdc\x6b\xba\x7b"
- "\x27\xd7\x1d\xbb\x53\x79\xfa\xce\x0a\xf7\x74\x97\xee\xe0\xe9\x5c"
- "\x77\xec\xae\x1c\xd8\x7c\x48\xe8\x0d\x3a\x1f\xa2\xfe\x37\x9b\x0f"
- "\x79\xf7\x0a\xce\xbf\xfd\xed\x40\x75\xd7\xfe\xf9\xbf\x1d\xe8\x31"
- "\x5e\xcf\x00\x5b\xb7\x95\xaf\xb9\x76\x8d\xd7\xad\xc7\x45\x59\xf6"
- "\xb7\x1f\x7b\xca\xb2\x77\x4f\x78\x93\x65\x7d\xad\xab\xe2\xf8\xdc"
- "\x09\x72\x0e\x63\xad\xf9\xb5\xae\x9a\xf1\x7d\x92\x5f\xbb\xeb\xfc"
- "\x97\x5f\x7f\xeb\xe6\xff\xb4\xc2\x47\xff\xa7\x7f\xf3\xea\xff\xd4"
- "\xe1\xf7\x1e\xfa\xbf\x75\xf3\x7f\x5a\x21\xfa\x3f\x7d\xd7\x8f\x73"
- "\x71\x15\x0f\x7a\x97\x5f\x15\xdd\xfc\x9f\x56\x88\xeb\xa7\x15\xa2"
- "\xff\xd3\x0a\xd1\xff\xe9\xbb\xa5\xee\xe9\x2e\xf9\xf5\xae\xdb\xb9"
- "\xb8\x8a\x3e\xfd\x9f\xd2\xc2\xd8\x94\x12\xb9\xb0\x13\xae\x0a\xa8"
- "\xe3\x68\xc0\x80\x19\xfe\xaf\x02\x3e\x8e\x80\xff\xeb\xbc\xf5\x31"
- "\x5b\x70\x6c\x8a\x60\x22\x18\xe7\x57\x66\xb1\x7d\x67\x36\x8f\x71"
- "\x60\x3d\x1d\x9c\x57\xb1\x29\xa1\x8e\xa1\x33\x05\x9a\x42\x80\x2f"
- "\x29\x2c\x3e\x1e\xe4\x0f\x01\xcc\x68\x33\x48\xc8\x39\xd9\xde\x70"
- "\x29\x1f\xd4\x37\xa4\x51\x56\x71\x14\xcb\x68\xcf\xdd\x1b\x01\x6d"
- "\xc9\xf3\x5a\x57\x28\x2b\xee\x4f\x63\xc9\x6a\x07\xfd\xda\xbc\xac"
- "\x95\x34\xc9\xf6\xbe\x18\xda\x32\x74\x26\x35\x24\x10\xb4\xb1\x76"
- "\x8e\xb1\x29\xb0\x4c\xf3\xb2\x0e\x7c\x36\x0f\x9f\x39\xa1\x8e\xfa"
- "\xa5\x44\x5e\xdc\x3a\x54\x09\xb2\x20\xd0\xd0\x46\x9b\x97\x3b\xa0"
- "\xce\x99\x0e\xf2\x8f\xb1\xf5\x8a\x77\x36\x40\x9a\x93\x68\x30\x26"
- "\x1e\x96\x01\x36\x26\xd4\x67\xef\xca\xcd\x90\xbf\xb7\x3a\xbc\xfa"
- "\x17\x12\x19\x38\x91\x5a\x07\x86\x9b\xbd\x5e\xcf\xbf\x85\x66\x8f"
- "\x25\xe6\x49\x40\x3b\x2d\x91\xf7\xf6\x7c\x60\xdf\xf9\x7b\x54\x1f"
- "\x32\x51\x89\xf1\x34\x0d\x6f\x10\xf9\x3a\x61\xa8\x72\x7f\x16\x8b"
- "\x67\x69\x6b\xcf\xfd\x7b\x99\x55\x36\xa1\x02\x69\x8e\x31\xd3\x30"
- "\xe6\x2a\xe0\x86\x40\xfa\x9e\x7d\x99\x84\x74\xe7\x45\x5a\xd2\xd2"
- "\x45\xda\xf4\x25\x4b\x93\x97\xaf\x4c\xd7\x4e\x48\x1a\x46\xe6\x2d"
- "\x5f\xae\x5d\xba\x68\xd9\xcb\x5a\xf7\x27\x0f\x68\x93\x96\xac\x58"
- "\xf4\x4c\x6a\xf2\xe4\xa5\x8b\x75\xc3\xa0\x4e\xc4\xad\x1e\x61\x58"
- "\x17\x21\xf7\xef\xe6\xcd\xbf\x23\xe4\xf7\x23\x89\x02\xeb\xd5\x9e"
- "\xfb\xdf\xe3\xa5\x98\x7a\xc5\xaf\xd3\x36\x39\xe4\x31\x80\x0c\x5c"
- "\xa7\x1f\x8a\x79\xa3\xb6\x40\xbd\x36\x43\xbd\xa1\x8e\x50\xe7\xff"
- "\x8e\x97\xea\x2c\x61\xc2\x80\x98\xd0\xb7\x02\x06\xff\xfb\xc5\x50"
- "\xfb\xd0\x9f\x51\x9a\x80\xed\x6b\x83\x7e\x22\x83\xb4\x7d\xa8\x97"
- "\x40\x06\xa4\xc0\xbb\x85\x12\xc6\xf0\x5d\x5a\x1c\x1b\xd5\x8e\xfd"
- "\x84\xa6\xfc\x94\xf7\xa9\xca\xa4\xf9\x11\x32\xc2\x63\xfa\xfd\x77"
- "\x85\x2b\xa6\x5f\x25\x8b\x2d\x07\xf5\x68\x81\xf4\x3a\x2b\x69\x3f"
- "\x8c\xe9\x18\x5b\x12\x63\xbd\x62\x9d\xa1\x5d\xa0\x17\xa9\x99\x9a"
- "\x44\xec\xe7\xbd\x59\x21\xe4\xbd\x6f\xb3\x28\x2e\x91\x38\x07\xed"
- "\xa4\xf9\x6f\x56\xd4\xb6\xb5\x91\xd0\x6c\xdd\x62\x3a\xe4\xef\x87"
- "\x42\x1d\x4b\x92\x31\x26\xb9\x90\xff\xbe\x8d\xe6\x57\xb4\xcd\x9f"
- "\x48\xd4\xed\xb9\x95\x91\x6e\xb1\x05\x15\x03\xe3\x7f\x25\xe3\x3f"
- "\xf2\x11\xea\x23\xf2\xb1\x32\x6b\x5f\x7a\x4f\x3e\x76\xe1\xef\x4f"
- "\x02\x39\x08\x58\xa0\x2a\xfd\xce\x38\x27\xa7\x23\xf6\xdd\x0b\x86"
- "\x14\x72\x2f\xa3\xdd\x7b\x53\x85\x62\x7d\x89\x50\xa8\xaf\xa2\x85"
- "\xfa\x3d\x40\xb3\x99\xc5\x19\x44\xbb\xd0\xa9\x26\x45\x97\x48\x94"
- "\xad\x48\xbf\x33\x58\x66\x94\x81\x6d\x21\x07\xbd\x11\x05\x32\x23"
- "\x4a\xec\xef\x33\x91\x8e\xff\x6a\x21\x24\x76\x05\x21\x5f\x4f\x23"
- "\x01\x9b\xe1\xbd\x81\xb5\xe7\x3d\xc2\xe4\x44\x6e\x65\xc5\x16\x78"
- "\x17\x63\x43\x0e\xf0\xfd\x18\xaf\xfd\xae\xab\xdd\x86\xa8\xde\xdb"
- "\xfd\x7e\xa4\x50\x6c\x50\x0b\x85\x86\x99\xb4\xd0\x30\xb5\x67\xbb"
- "\x0d\x51\xbc\xdd\x81\xad\x57\xa1\xdd\x3c\xe6\x62\xee\x7b\x3b\xfd"
- "\x6b\xf7\xfb\x5e\xe7\xff\xdc\xda\xed\x85\xdf\xff\x18\x0f\xed\x06"
- "\x7e\x1b\x80\xdf\x86\x5e\xf8\x6d\x10\xf9\x3d\xbc\x71\xf0\xdb\xfd"
- "\xbe\x8d\xb7\xfb\xfd\x72\xff\xda\xfd\x0f\xaf\xf2\xcf\xd5\x6e\xa3"
- "\x17\x7e\x9b\xc3\x85\x62\x23\xf0\xdb\x08\xfc\x36\xf6\xc2\x6f\xa3"
- "\xc8\xef\x11\x9f\x0c\x7e\xbb\xff\xc1\xe7\xff\x73\xff\xb1\xd5\xbf"
- "\x76\x9b\x23\x7c\x68\xb7\x17\x7e\xef\x0b\x83\x76\x03\xbf\x8d\xc0"
- "\x6f\x63\x2f\xfc\x36\x8a\xfc\xbe\xbf\x60\xf0\xdb\x6d\xb6\xf2\x76"
- "\x9b\x4b\xfd\x6b\xf7\x3e\x6d\xff\xed\xce\xf6\xc2\xef\x7f\xaa\x84"
- "\xe2\x6c\xe0\x77\x36\xf0\x3b\xbb\x17\x7e\x67\x8b\xfc\x7e\xf2\x91"
- "\xc1\x6f\xf7\xbe\x7a\xde\xee\x7d\x25\xfe\xb5\xfb\x9f\x9a\xfe\xdb"
- "\xad\xaf\x00\x99\xdd\x83\xe7\x96\xcc\x68\x32\xe5\x12\xb6\x7f\x7f"
- "\x16\x0d\xd6\x57\x0c\xcf\x36\xca\x1c\x2a\x7d\xe5\xf0\x06\x22\x87"
- "\xb1\x5f\x4a\xa8\x95\x04\x41\x5b\x41\x2f\xe6\xc4\xe3\xaf\x00\xe5"
- "\x38\x40\xf6\x3b\x55\xfa\x3d\x1d\x85\xb1\x33\x7f\xfb\x2c\xd1\x1a"
- "\x6c\x44\x5d\xab\xb7\x12\xbd\x8e\xda\x6a\xc9\x09\x12\x6c\x25\x72"
- "\x9c\xc7\xfa\xb8\xa5\x82\x2c\x4b\xa3\x14\xca\x4e\xc6\xf1\x62\xf1"
- "\x69\x12\x05\x36\xb1\x91\x82\xfe\x28\x11\x88\x16\xca\x8f\x42\x5a"
- "\x42\xd9\x4f\x84\xce\x23\xb2\xf7\x9f\xb1\x13\xa4\x27\xd2\x16\xc6"
- "\x96\x51\x8c\xae\x6d\x84\xfc\xfc\x49\x4e\xd7\x8d\xcf\x0e\x94\xae"
- "\xfb\xa3\xb8\x5d\xa9\xaf\xb3\x58\x3b\xf0\xdc\x87\x1a\xcf\x35\x03"
- "\xbd\x5a\x6a\x75\xad\x30\x0e\xf9\x67\x09\x2d\xd2\x9b\x05\xd0\x59"
- "\x03\x2c\xd7\xeb\xfe\x37\x37\x79\x1a\x0d\x32\xb3\x07\xd6\x5c\xf4"
- "\x3e\xd0\x42\x83\x0d\xd1\x9c\xde\x86\x69\xc3\x1b\x02\x5b\x7b\xa7"
- "\xb7\x21\xda\x01\x3a\xc7\xa9\x32\x4c\xf5\x9d\xde\x07\x8e\x78\xd2"
- "\xdb\xa0\xbe\x36\xf4\xc6\xa8\xe3\x48\x6f\x43\xbc\x27\xbd\x0f\x2c"
- "\xe0\xf4\x3e\x40\x68\x91\x21\x46\x00\x5d\x39\xc0\x72\xbd\x9e\x7f"
- "\x74\xa3\x37\xe0\xbb\xa7\x0e\x73\xd1\xfb\x83\x05\x40\x6f\x11\xdf"
- "\x06\xc0\xf7\xf0\x46\x2f\xf4\x06\x7c\x1b\x00\xdf\x86\x01\xe0\xfb"
- "\x83\x19\xdd\xe8\x7d\x8d\xf0\xfd\x81\x18\xff\xc9\xd0\x0d\xdf\x07"
- "\xab\x39\xbd\x0f\xea\x80\xde\x80\x6f\xc3\x00\xf1\xfd\x41\x8a\x0f"
- "\xfa\x03\xf0\xdd\x53\x77\xba\xe8\xfd\xaf\x6a\x1a\x6c\x14\xf1\x6d"
- "\x04\x7c\x8f\xf8\xa4\x77\x7a\x1b\x01\xdf\x46\xc0\xb7\x71\x00\xf8"
- "\xfe\xd7\xbb\x9e\xf4\x36\x5e\x23\x7c\xff\xcb\xc8\xe9\x6d\xec\x86"
- "\xef\x7f\x4d\xe3\xf4\xfe\xc0\x4a\x8b\x8c\x80\x6f\xe3\x00\xf1\xfd"
- "\xaf\x7a\x1f\xe8\x0d\xf8\xee\xa9\xb3\x5d\xf4\xfe\x70\x1a\xd0\x5b"
- "\xc4\xb7\x11\xf0\x7d\x7f\x81\x17\x7a\x03\xbe\x8d\x80\x6f\xe3\x00"
- "\xf0\xfd\xe1\x84\x6e\xf4\xbe\x46\xf8\xae\xb2\x89\xf4\xee\x86\xef"
- "\xaa\xed\x9c\xde\x55\xf1\x40\x6f\xc0\xb7\x71\x80\xf8\xfe\x70\xa6"
- "\x0f\x76\x02\xe0\xbb\xa7\xad\xe0\xa2\xf7\x47\xdb\x69\x70\xb6\x88"
- "\xef\x6c\xc0\xf7\x93\x8f\xf4\x4e\xef\x6c\xc0\x77\x36\xe0\x3b\x7b"
- "\x00\xf8\xfe\xe8\x0f\x9e\xf4\xce\xbe\x46\xf8\xfe\x28\x91\xd3\x3b"
- "\xbb\x1b\xbe\x3f\x0a\xe7\xf4\xfe\xd0\x4c\x8b\xb2\x01\xdf\xd9\x03"
- "\xc4\xf7\x47\x5e\xcf\xff\xf6\x65\x9f\xac\xd8\x44\x94\x9e\x34\xaf"
- "\xd6\x5e\x3d\x1b\xa5\x3a\xe8\xfa\xd8\x28\x1f\x1f\xee\xdd\x46\xf9"
- "\xb8\x84\xd3\xfc\xe3\xa9\xfe\xd9\x28\xd5\x91\xfe\xd8\x28\x3d\x69"
- "\x5e\xb3\xfe\xea\xd9\x29\x35\xab\xaf\x8f\x9d\x52\x33\xb3\x77\x3b"
- "\xa5\x46\xc1\x69\x5e\x5d\xee\x9f\x9d\x52\xb3\xd5\x1f\x3b\xa5\x27"
- "\xcd\x2d\xca\xab\x67\xab\xd4\x9e\xbf\x3e\xb6\x4a\x6d\x65\xef\xb6"
- "\x4a\x6d\x26\xa7\x79\x6d\xb8\x7f\xb6\x8a\x25\xcc\x1f\x5b\xa5\x27"
- "\xcd\xeb\xb2\xae\x9e\xbd\x52\x97\x7c\x7d\xec\x95\xba\xa8\xde\xed"
- "\x15\x8b\x38\xfe\xb1\x94\xf8\x67\xaf\xd4\xf9\x30\xfe\xe9\x69\xaf"
- "\xf4\xa4\xf9\x21\xdb\xd5\xb3\x59\x0e\x1d\xbd\x3e\x36\xcb\xa1\x6d"
- "\xbd\xdb\x2c\x87\x12\x39\xcd\x0f\x29\xfc\xb3\x59\x0e\x39\xfc\xb1"
- "\x59\x7a\xd2\xfc\xd3\xa4\xab\x67\xb7\x7c\x3a\xf7\xfa\xd8\x2d\x9f"
- "\x6a\x7a\xb7\x5b\x3e\x39\xcc\x69\xfe\x49\xa6\x7f\x76\xcb\xa7\x3a"
- "\x7f\xec\x16\xa4\x35\xd2\x1c\x6d\x15\x4e\xf3\xcf\xa6\xd2\x10\x7d"
- "\x49\x27\xd8\x23\xc1\x40\xf7\xe0\x16\x22\xdf\x84\x34\xaf\xe7\x34"
- "\x77\x86\xe4\xc4\x03\x7d\x52\x90\x66\xac\x1d\xdf\x6a\x42\x9c\x85"
- "\xfa\x4a\x2a\x27\xd0\x16\x25\x39\x2d\x3b\xfc\xb0\xc3\x44\x42\xb4"
- "\xfa\x6c\xf8\xff\x33\xe6\x3f\x53\xab\xcf\x3d\x0e\x6d\x0c\xc0\x35"
- "\x0a\x47\xd1\x5c\x9b\x33\xd8\xa4\x3b\x2d\x3b\x92\x4d\xef\x98\x65"
- "\xeb\x04\x5b\x82\xbe\xa0\x09\xb3\xb4\xec\x24\x16\xc7\x47\xa4\xb6"
- "\xfe\xef\x44\x08\xc9\x79\xe2\x5e\x07\x89\xa0\xdf\x46\x84\x55\xa7"
- "\x5b\x89\x73\xb1\x46\x65\xc9\xac\x02\x5c\xec\x22\x71\xcd\xf4\x12"
- "\x3d\x19\xa1\xea\x0c\x5e\xbb\xd3\x19\x9c\x13\xe5\x2c\xca\xcb\x74"
- "\x04\xaf\xdd\xba\x23\xc3\x2a\x57\xd9\x49\x44\x6a\x13\xa5\xc5\xcf"
- "\x10\x45\x71\x23\x51\xae\x7b\x86\xa8\xd6\x35\x12\x75\x75\x53\x3d"
- "\xa9\x39\x53\x45\x6a\x5a\x8f\x92\x9a\x4b\x70\x75\xc0\x25\xc0\x65"
- "\x3c\x4a\xaa\x5b\x08\x99\x7b\x96\x10\x43\x13\xb5\xdd\xd3\x40\xc2"
- "\xaa\x1d\xf5\x04\xf7\xf1\x9e\x93\x1d\xb9\x55\x95\x48\xc2\xe8\x49"
- "\x0d\xa1\x8b\x35\x72\x78\xa6\xc0\x74\x8b\xc3\x46\xaa\x9b\xec\xf0"
- "\xfc\x70\x1b\x3c\x57\x18\x9a\xa0\x7c\xa1\x0a\xfd\xc5\xd9\xaa\x8d"
- "\x1f\x12\x47\xbe\xd3\x0a\x74\xae\x92\x6c\xb2\xe2\x0e\x12\xb5\x0e"
- "\xd8\x8c\x98\x89\xa3\x1c\x33\x5b\x3a\x06\x8a\x99\x23\xdc\xff\xd9"
- "\x0b\x9a\x91\x40\xef\x31\xc2\x0b\x09\xea\xd8\xa3\x5f\x51\xdc\xa7"
- "\x85\xeb\x33\xb5\x6d\x1f\x11\xcb\x1a\x81\xc4\xbd\x4c\xc8\x1c\x27"
- "\x21\x48\x13\x5c\x4b\x8e\xd5\x91\x50\xdc\x3f\x26\x7c\x1b\x31\xd2"
- "\xd2\x64\x23\xab\x1d\x50\xd7\x73\xf6\xae\xba\xd6\xae\xa9\x25\xf0"
- "\x6c\x4c\x6d\x8a\x95\xa8\x74\x44\x8d\x74\x06\x5b\xb4\x22\xb6\x99"
- "\x04\x2d\x6b\xa3\x14\x69\x8c\xb4\x45\x3a\x63\x79\x12\xed\x2d\x49"
- "\x36\x62\xb0\x13\xb5\x45\x0f\xbf\x99\xd4\x66\x21\xe7\x09\xd4\x31"
- "\x82\x06\x39\xad\x80\x8f\x79\x88\x09\xab\xec\x70\x34\xe0\x60\x24"
- "\xcd\xfd\xb4\x65\x33\xb4\x17\xd7\xf0\x07\xd6\xe6\xcf\x7c\x59\xff"
- "\xe8\x61\x13\xba\xf0\x6c\x88\xe6\x78\x3e\xaa\xa0\x21\x06\x75\x27"
- "\xd8\x7a\x1c\xcf\x81\xad\xfd\xe3\xd9\x30\xcd\x85\xe7\xcf\x47\xb8"
- "\xf0\x5c\x7f\xd1\x3b\x9e\xeb\x1f\xe7\x78\x36\xc4\xdf\x98\x78\xfe"
- "\xfc\x54\xdf\x78\xfe\xfc\x80\x77\x3c\x1b\x66\x4a\xf6\xee\xe0\xe0"
- "\xb9\x3e\xfc\xda\xe1\xd9\x10\xed\x1f\x9e\x3f\xb7\x7b\xe2\xf9\x73"
- "\x25\xc7\xf3\x67\x95\xfe\xe1\xf9\xa8\xd7\xf8\x07\x7d\xd9\xdb\x6e"
- "\x78\x16\xe5\xf3\x17\x87\x01\xcf\x20\x9f\x0d\xa2\x7c\x1e\xde\xe8"
- "\x03\x9e\xdd\xe4\xf3\xd1\x13\x2e\x3c\x7f\x71\xd0\x3b\x9e\xbf\xb8"
- "\x53\xc4\xf3\x0d\x2a\x9f\x8f\xbd\xdb\x37\x9e\x8f\xad\xef\x03\xcf"
- "\x55\xd2\x58\x62\x70\xf0\x7c\xac\xe5\x1a\xe2\xd9\x4f\xf9\x7c\xac"
- "\xca\x13\xcf\x47\xeb\x39\x9e\x8f\x16\xfa\x87\xe7\x2f\xbc\xee\x7f"
- "\xee\x6b\x2c\xe3\xc2\xb3\x51\x94\xcf\x5f\x6e\xa3\x21\x46\x90\xcf"
- "\x46\x51\x3e\x8f\xf8\xa4\x7f\x3c\x1b\xdd\xe4\x73\xc3\x5f\x5d\x78"
- "\xfe\xf2\x0f\xde\xf1\x7c\xfc\x3c\xc7\xb3\xf1\x06\x95\xcf\xc7\x5f"
- "\xed\x1b\xcf\xc7\x93\xbc\xe3\xd9\x38\x53\x1a\xa7\x0d\x0e\x9e\x8f"
- "\x57\x5e\x3b\x3c\x1b\xfd\x94\xcf\xc7\x4b\x3d\xf1\xdc\x50\xce\xf1"
- "\xdc\xb0\xc0\x3f\x3c\x7f\xe9\x35\xfe\x4f\x5f\xe3\x44\x37\x3c\x8b"
- "\xf2\xf9\x44\x3a\xe0\x19\xe4\xb3\x51\x94\xcf\xf7\x17\xf8\x80\x67"
- "\x37\xf9\xfc\x55\xb6\x0b\xcf\x27\x92\xbd\xe3\xd9\xba\x4f\xc4\xf3"
- "\x0d\x2a\x9f\xad\xf3\xfb\xc6\xb3\x75\x6a\x1f\x78\xae\x92\xc6\xc0"
- "\x83\x83\x67\x6b\xe1\x35\xc4\xb3\x9f\xf2\xd9\x9a\xe2\x89\xe7\xaf"
- "\x32\x39\x9e\xbf\x8a\xf4\x0f\xcf\x27\x8c\xfe\x8c\xc1\x5d\x78\xce"
- "\x16\xe5\x73\xd3\x74\x1a\x92\x0d\xf2\x39\x5b\x94\xcf\x4f\x3e\xd2"
- "\x3f\x9e\xb3\xdd\xe4\x73\xe3\xe3\x2e\x3c\x37\xdd\xe7\x1d\xcf\x27"
- "\x5f\xe3\x78\xce\xbe\x41\xe5\xf3\xc9\x09\x7d\xe3\xf9\xa4\xc2\x3b"
- "\x9e\xb3\x67\x4a\xf3\x0b\x83\x83\xe7\x93\x0b\xae\x1d\x9e\xb3\xfd"
- "\x94\xcf\x27\xa3\x3d\xf1\xdc\x38\x93\xe3\xf9\x84\xc3\x3f\x3c\x37"
- "\x79\x8d\x7f\x37\xb0\xf9\x8d\xaf\xa7\xe3\xfc\x46\x07\xce\x6f\xb8"
- "\xf6\xfe\xa5\x84\xd6\x71\x3c\x77\x02\x9e\x37\xba\xe3\xf9\x8b\xee"
- "\xf3\x1b\xa7\xee\x14\xba\xf0\xfc\x75\x0f\x3c\x0b\x80\xe7\x4e\x86"
- "\xe7\xd3\x73\xa5\xf9\x0d\x4b\xcb\x56\xc0\xc9\x19\x62\x89\x07\x2c"
- "\x17\x8b\x58\xfe\x02\xb0\x0c\x34\x14\x80\xc6\xd5\x0d\xf5\x24\xce"
- "\xc6\x69\xd9\x01\x34\x16\xdc\x71\xdc\xd1\x2c\x47\xfc\x22\x6e\x25"
- "\x0c\xd7\x2c\x03\xec\xa6\x1d\x22\x35\x19\x70\xad\x82\x4b\x0f\x17"
- "\x39\x44\xaa\x9b\x01\xbb\x4b\xdc\xb1\x5b\x27\x62\xf7\xd4\x89\xbe"
- "\xb1\x7b\xca\x7c\xed\xe6\x32\x4e\xf3\xf9\xaf\x2f\x12\xd4\x71\x8f"
- "\x7f\x45\x2d\x99\xf5\x22\x3e\xcf\x90\x38\x07\x09\xa5\x4f\x46\x8c"
- "\x54\x25\x10\xf5\x2b\x4e\x22\x2f\x7a\x86\xa8\x8b\x8e\x41\xbb\xa5"
- "\xfe\xdb\x48\x54\x1f\xd9\xff\x4e\xaa\x5b\xeb\x49\xf5\xa5\x0f\x49"
- "\xb5\x00\xd7\x19\xb8\xa0\xae\x71\xc9\xee\xed\xb6\x89\xed\x3e\x7d"
- "\x14\xca\x1a\xef\xbd\xdd\xa7\x2b\x58\xbb\x93\xa0\xdd\x1d\xae\x76"
- "\x5b\xa0\x1f\x00\x7f\xc6\x08\xe2\x7c\x48\x9c\x8d\x04\x2d\x77\x50"
- "\xda\x21\xe2\x1f\xf9\xf3\xd1\x61\x3b\x89\xd3\x01\xcf\x16\x03\xfe"
- "\x9b\xca\x89\x21\x0b\xf0\xdf\x61\x47\xdc\xd9\x2c\xc6\xcb\x80\xff"
- "\x53\x6d\x14\xe8\xd7\x89\xf8\xff\x02\xf1\x7f\x4a\x23\x30\xfc\x37"
- "\x55\xfb\x87\xff\xaf\x7d\xc0\xbf\x2f\xf3\x21\x67\xa6\xe3\x7c\x48"
- "\x07\xce\x87\xb8\xf6\x80\xf6\x83\x7f\xf7\xf9\x90\x66\x37\xfc\x9f"
- "\xe9\x03\xff\xdf\xcc\x95\xe6\x43\xae\x3f\xfe\x9b\xfb\xc1\x7f\x73"
- "\x1f\xf8\x1f\xec\xb9\x8f\x6f\xae\x21\xfe\xbf\xe9\x07\xff\xdf\xf8"
- "\x80\x7f\x43\xb4\x7f\xf8\x6f\xee\x86\xff\x66\x11\xff\x5f\xfb\x89"
- "\xff\x33\xbe\xe0\xdf\x87\xf9\x93\xb3\x88\x7f\x90\xff\x86\x3d\x6e"
- "\x7b\x81\xfb\xc3\xbf\x9b\xfc\xff\xd6\x0d\xff\x67\xfb\xc0\x7f\x8b"
- "\x84\xff\x1b\x40\xfe\x7f\xdb\x0f\xfe\xbf\xed\x0b\xff\x83\x3c\x57"
- "\xd2\x72\x0d\xf1\xdf\xd2\x0f\xfe\x5b\x7c\xc1\xbf\x9f\xf2\xff\xdb"
- "\x6e\xf8\xff\x56\xc4\xff\x19\x3f\xf1\x7f\xd6\x07\xfc\xfb\x32\xdf"
- "\x62\x9b\x8e\xf3\x2d\x1d\x38\xdf\xe2\xda\x13\xde\x0f\xfe\xdd\xe7"
- "\x5b\xce\xb9\xe1\xdf\xd6\x07\xfe\xbf\x9b\x2b\xcd\xb7\x5c\x7f\xfc"
- "\x9f\xeb\x07\xff\xe7\xfa\xc0\xff\x60\xcf\xad\x7c\x77\x0d\xf1\xff"
- "\x5d\x3f\xf8\xff\xce\x07\xfc\x1b\xfd\x94\xff\xe7\xba\xe1\xff\x9c"
- "\x88\xff\xb3\x7e\xe2\xdf\xe6\x0b\xfe\x7d\x98\x9f\xb9\x80\xf8\x07"
- "\xf9\x6f\xdc\xe3\x76\x36\xa0\x3f\xfc\xbb\xc9\xff\xf3\x6e\xf8\xbf"
- "\xd0\x07\xfe\x5b\x25\xfc\xdf\x00\xf2\xff\x7c\x3f\xf8\x3f\xdf\x17"
- "\xfe\x07\x79\x2e\xa6\xf5\x1a\xe2\xbf\xb5\x1f\xfc\xb7\xfa\x82\x7f"
- "\x3f\xe5\xff\xf9\x6e\xf8\x3f\x2f\xe2\xdf\xe6\x27\xfe\x2f\xf8\x80"
- "\x7f\x5f\xe6\x73\x2e\xb1\xf9\x9c\x0e\x9c\xcf\x71\x9d\x11\xe9\x07"
- "\xff\xee\xf3\x39\x6d\x6e\xf8\xbf\xd4\x07\xfe\x2f\xce\x95\xe6\x73"
- "\xae\x3f\xfe\xdb\xfa\xc1\x7f\x5b\x1f\xf8\x1f\xec\xb9\x9b\x8b\xd7"
- "\x10\xff\x17\xfb\xc1\xff\x45\x1f\xf0\x9f\xed\xa7\xfc\x6f\xeb\x86"
- "\xff\x36\x11\xff\x17\xfc\xc4\xff\xa5\x41\x9a\xff\x69\x6f\xc1\xf9"
- "\x1f\x41\xa5\xdf\xd3\x59\x36\xcb\x26\x14\xae\xdd\x19\x2a\xd3\x12"
- "\x87\xca\xa4\xb3\xa4\xb7\x91\xd8\x8b\xc0\x13\xdd\x45\xf2\xf4\x45"
- "\x35\xc6\x0b\xdc\x4a\x61\xfc\xef\x71\x46\x14\x2e\x47\x9e\xd3\xba"
- "\x6e\x19\x51\x38\x43\x72\x9e\xc0\x34\xcb\x69\x3b\xc1\x36\xaf\x46"
- "\x1a\x9c\x71\xd1\x00\xe7\xe0\xe8\x77\x11\xea\xcd\x26\xc8\xd3\x61"
- "\x25\x4d\x80\x97\xea\x26\x2b\xd0\x7e\x15\xc3\x16\xf2\x02\xea\x53"
- "\xb8\xe5\x1c\x51\x38\x4e\x6a\xc6\x00\x8f\xc3\x82\x5f\x22\xb2\xf0"
- "\x26\x2a\x20\x2f\x91\x47\xc8\x57\xed\x2a\xdc\xaf\xd4\x7e\xaa\x16"
- "\xf0\xed\x38\x19\x31\x66\x33\xe4\x1b\xfc\x79\x99\x76\xb6\xfe\x01"
- "\xbf\x6b\xaa\x1b\x80\x96\xb9\x97\xfc\xe4\x53\xbb\x2f\xe7\x5f\x7c"
- "\x98\xa7\xb8\xbc\x1e\xe7\x29\x04\x95\x61\xaa\x6f\x7c\x32\x44\x7b"
- "\x9c\x69\x1d\x74\x3e\x5d\x9e\xea\x1b\x9f\x2e\x17\x79\xf2\x69\xb0"
- "\xe7\x0f\x2e\x8b\xfe\x60\x2e\x47\x72\x3e\xd9\xd3\xfd\xe3\xd3\x65"
- "\xbf\xf6\xff\xf6\x1c\x4f\x77\x4e\xc3\xf1\x34\xf0\xc9\xc7\xfe\x64"
- "\xa8\xf0\x38\x83\x3b\xe8\x7c\xea\x68\xf0\x8d\x4f\x9d\xf7\x75\xe3"
- "\xd3\x20\x8f\x73\x3b\x09\xe7\x53\xc7\x61\xce\xa7\x8e\x70\xff\xf8"
- "\xd4\xe9\xc3\xf9\x0f\x5f\xc6\x7d\x8e\x26\x1c\xf7\x09\x30\xee\xf3"
- "\x8d\x4f\xc6\x68\x8f\x33\xc3\x83\xce\x27\xc7\x1a\xdf\xf8\xe4\x38"
- "\xee\xc9\xa7\xc1\x1e\x8f\x39\xca\x39\x9f\x1c\x59\x9c\x4f\x9d\x07"
- "\xfc\xe3\x93\xc3\x36\x38\xe3\x13\xa1\x10\xc7\x27\xc0\x27\x1f\xfb"
- "\x93\xb1\xc2\xe3\x8c\xf3\xa0\xf3\x49\x88\xf4\x8d\x4f\xc2\xab\xdd"
- "\xf8\x34\xc8\xe3\x06\x21\x9e\xf3\x49\x18\xcf\xf9\xe4\x4c\xf5\x8f"
- "\x4f\x82\xd7\xf8\x9f\x03\xb2\xa3\xe5\x64\x2a\xda\xd1\x02\xd8\xd1"
- "\xbe\xf1\x29\x3b\xda\xe3\x4c\xf6\xa0\xf3\x89\x1e\xf6\x89\x4f\x72"
- "\x32\xd9\x93\x4f\x83\x6d\xdf\x52\x3b\xe7\x13\xad\xe6\x7c\xa2\x61"
- "\x7e\xf1\x49\x4e\x7c\xd8\xff\xd9\xfb\x39\xac\x1e\x36\x9f\x5c\x66"
- "\xbd\xa1\x6c\x3e\xb9\xcc\xe8\x1b\xaf\x64\x47\xaf\xaa\xcd\x27\x97"
- "\xb1\xfd\xff\xf0\x9b\xc9\x78\x55\x40\xcc\xfe\xf1\x4a\xd6\xe2\xef"
- "\xf9\xad\x1e\x76\x9f\x3c\xa0\xf0\x86\xb2\xfb\xe4\x01\xbe\xc9\x3f"
- "\x79\xc0\xab\x57\xd5\xee\x93\x07\x70\xf9\x27\x0f\xe0\xf2\xaf\x40"
- "\xee\x9f\xfc\x93\x07\xf8\x20\xff\x7a\x3f\xf7\xd5\xc3\xf6\x93\x07"
- "\x46\xdf\x50\xb6\x9f\x5c\x51\xef\x1b\xaf\x02\x7f\x74\x55\x6d\x3f"
- "\xb9\xc2\xc1\x79\xa5\xa8\xe3\xbc\x52\x68\xfc\xe3\x55\xa0\xd7\xf8"
- "\x2f\xfd\x9d\x17\xeb\x61\xff\xc9\x87\xdc\x58\xf6\x9f\x7c\x88\x6f"
- "\xf6\x9f\x7c\xc8\xd5\xb5\xff\xe4\x43\xb8\xfd\x27\x1f\xc2\xed\xbf"
- "\x82\x40\xff\xec\x3f\xf9\x10\xbf\xec\xbf\x6e\xbc\x12\xfb\x95\xb2"
- "\xe4\x86\xb2\x01\xe5\xca\x28\xdf\x78\xa5\xcc\xbf\xaa\x36\xa0\x5c"
- "\x39\x8f\xf3\x4a\x19\xc1\x79\x35\x54\xe7\x1f\xaf\x94\x5e\xe3\x1f"
- "\xf6\x77\x3e\xad\xa7\x1d\x38\x6c\xda\x0d\x65\x07\xca\x83\x7c\x1b"
- "\xff\xca\x87\xdd\x77\x55\xed\x40\xf9\x30\x3e\xfe\x95\x07\xf1\xf1"
- "\x6f\x41\x90\x7f\xe3\x5f\xf9\x30\x1f\xc6\xbf\x3e\xcc\xfb\xc9\x55"
- "\x65\x68\x03\x3a\x0b\xf5\x7b\x42\x81\xfe\xa1\x99\x44\xde\x11\x0e"
- "\xfc\x52\x01\xbf\xb2\xb5\xa4\xb3\x10\xf8\x65\x73\x90\xd8\x17\xbf"
- "\xa2\xb5\x2d\x4e\xd2\x01\xbc\xba\x0c\x76\xa0\xc5\xd6\x8c\x67\xf4"
- "\x7e\xd2\x28\x57\xdd\xf7\xe4\x8b\x6a\x82\xfc\x42\xfa\x3b\x95\x4e"
- "\xb0\x29\x73\x9e\x60\xfc\x53\xe5\x65\x3a\x0a\x73\xa2\xe6\x9e\xfd"
- "\x8a\x2e\xb7\x52\x5a\x93\x62\x87\x3a\xcd\xb5\xd5\xa4\xd4\x93\xb8"
- "\x26\x12\xa4\x7d\x02\xf9\x32\xfc\x14\xa6\x5b\x6c\xf5\x04\xfd\x7e"
- "\xb2\x39\xf0\xaf\x22\xc2\x1c\x9f\x47\xa8\xd0\x7f\x13\x9e\x2b\x94"
- "\x7c\x34\x59\xce\x94\x32\xfe\x77\x9f\x53\x65\xfc\xff\x3c\x42\xbd"
- "\x11\xcf\x27\x0e\xba\x2d\x38\x9c\xcd\xff\x09\x5f\x69\xc6\x48\x75"
- "\x5c\x9e\x4a\x29\xd4\x71\x64\x6d\x9b\x8d\x60\x3d\x6b\xdb\xcc\xc4"
- "\x90\x4e\xd4\xb5\x1d\xcd\x44\xdf\x46\x6d\xb5\xc6\x6f\x48\xdc\x45"
- "\x5c\x17\x40\x3c\xa9\x26\x73\x7e\x0f\x4f\x10\xbe\x8a\x18\x63\x95"
- "\xab\xc6\xd7\xd6\x11\x12\x9a\x0d\xb4\x76\x10\x39\x3b\xaf\x29\x27"
- "\x4a\xa0\x57\x8a\xc5\xd8\x48\x80\x76\x3b\x2d\x8e\x63\x48\xcf\x14"
- "\x78\x3e\xad\x6b\xbd\x21\x24\x67\x17\xa6\x21\x6d\x71\x9f\xa9\x45"
- "\x67\x63\x79\xa4\xe7\x9c\x77\x46\x62\xc9\xec\x20\xb5\xa0\x65\xe1"
- "\x7b\x8a\x8f\x13\xea\x01\x5f\xc3\xfc\x94\xdb\xaa\xf2\x41\x99\xaf"
- "\x94\x87\x38\xd0\x6e\x75\x16\x1a\xa6\xf2\x3a\x06\xb6\xf6\x8f\x2f"
- "\x43\xb4\x0b\x5f\x21\x7f\xb8\x32\x7c\x85\xcc\x18\x5c\x7c\x0d\xb6"
- "\xfd\x1a\xa2\xbe\x32\x7c\x85\x14\x71\x7c\x05\x57\x70\x7c\x85\xac"
- "\x71\xe1\x2b\xb0\xf5\xea\xe1\x2b\x38\x89\xe3\x2b\x78\xbc\x7f\xf8"
- "\x0a\x55\x0e\xca\x3c\xab\x7c\xc4\x02\xb4\xb5\x01\x5f\xa2\xfc\x1a"
- "\xde\xe8\x03\xbe\xdc\xe4\x97\xfa\xe2\x95\xe1\x4b\xfd\xf6\x20\xe3"
- "\x6b\x90\x6d\x6e\xb5\xee\xca\xf0\xa5\x3e\xcb\xf1\xa5\xd6\x70\x7c"
- "\xa9\x9b\x5c\xf8\x1a\xde\x78\xf5\xf0\x15\x7a\x80\xe3\x2b\x74\x8d"
- "\x7f\xf8\x1a\xe1\x97\xff\xab\x9e\xe3\x83\x5b\x2a\x71\x7c\xe0\x2c"
- "\x34\x8a\xf2\x6b\xc4\x27\xfd\xe3\xcb\xe8\x26\xbf\x6e\x99\x7f\x65"
- "\xf8\xba\x25\x70\x70\xf1\x35\xd8\xe3\x84\x91\x75\x57\x86\xaf\x5b"
- "\xe6\x72\x7c\x8d\xcc\xe4\xf8\xba\x65\xba\x0b\x5f\x23\x3e\xb9\x7a"
- "\xf8\x1a\x39\x9e\xe3\x6b\x44\x93\x7f\xf8\xba\xc5\xbb\xff\xe7\x81"
- "\xcc\x6b\xcb\x47\x85\xe3\x98\x06\xf0\x25\xca\xaf\xfb\x0b\x7c\xc0"
- "\x97\x9b\xfc\xba\xf5\xdd\x2b\xc3\xd7\xad\xc9\x83\x8c\xaf\x41\x1e"
- "\xdb\xdc\x1a\x75\x65\xf8\xba\x75\x07\xc7\x57\x58\x3d\xc7\xd7\xad"
- "\xdb\x5c\xf8\xba\xbf\xe0\xea\xe1\x2b\x6c\x0d\xc7\x57\xd8\x74\xff"
- "\xf0\x35\xca\x07\xff\xaf\xbe\xcc\xc7\x6b\xb2\x70\x1c\xe6\x2c\xcc"
- "\x16\xe5\xd7\x93\x8f\xf4\x8f\xaf\x6c\x37\xf9\xa5\xb9\xf5\xca\xf0"
- "\x75\xdb\xc1\xc1\xc5\xd7\x60\x8f\xc7\x6e\x2b\xb9\x32\x7c\x69\x82"
- "\x39\xbe\x6e\x8b\xe6\xf8\xd2\x28\x5c\xf8\x7a\xf2\x91\xab\x87\xaf"
- "\x51\x4d\x1c\x5f\xa3\xb6\xf9\x87\x2f\x8d\x0f\xfe\x7f\x7c\x5d\x47"
- "\x18\x63\xbd\xb2\x31\xe4\x98\x97\xaf\x0c\x63\x63\x26\xde\xd8\x63"
- "\xc8\xd1\x6d\x57\x86\xb1\x31\x2f\x72\x8c\x8d\x2e\xe3\x18\x1b\x93"
- "\x72\x6d\xc6\x90\xa3\x67\x72\x8c\x8d\x56\xfa\x87\xb1\x31\x83\xb8"
- "\xfe\x71\xc7\xf4\x2b\x1b\x47\x86\x1f\xbf\x32\x8c\x85\x17\xdd\xd8"
- "\xe3\xc8\xf0\x84\x2b\xc3\x58\xf8\x11\x8e\xb1\x70\xc2\x31\x16\x5e"
- "\x7d\x6d\xc6\x91\xb7\x6f\xe7\x18\xbb\xdd\xcf\x75\x9b\x3b\xfc\x3a"
- "\xff\xd2\xfb\xba\xcd\xb8\xf2\x2b\x1b\x4b\x8e\x7b\xf8\xca\x30\x36"
- "\xf6\xfc\x8d\x3d\x96\x1c\x5b\x79\x65\x18\x1b\xf7\x63\x8e\xb1\xb1"
- "\x49\x1c\x63\xe3\xa2\xae\xcd\x58\x72\xac\x9a\x63\xec\x8e\x3a\xff"
- "\x30\x36\x6e\xcf\xe0\xad\x37\xdd\xa5\xba\xb2\xf1\xe4\x9d\x6f\x5f"
- "\x19\xc6\xee\x9c\x7f\x63\x8f\x27\xef\xd4\x5e\x19\xc6\xee\xdc\xc4"
- "\x31\xa6\xad\xe2\x18\xbb\x73\xfd\xb5\x19\x4f\x6a\xd3\x39\xc6\xb4"
- "\x53\xfd\xc3\xd8\x5d\x3e\xf8\xff\xf7\x75\x9d\x6c\xbc\xee\xca\xc6"
- "\x94\xe3\x83\xae\x0c\x63\x77\xef\xbd\xb1\xc7\x94\x77\xaf\xb9\x32"
- "\x8c\x8d\x97\x71\x8c\xdd\x1d\xc9\x31\x76\xb7\xfd\xda\x8c\x29\xef"
- "\xaa\xe7\x18\xbb\xab\xd4\x3f\x8c\x8d\xcf\x1a\xbc\xf5\xbd\x1f\x1c"
- "\xbe\xb2\x71\xe5\x0f\x96\x5e\x19\xc6\x7e\x70\xc7\x8d\x3d\xae\x9c"
- "\xd0\x7c\x65\x18\xfb\x41\x32\xc7\xd8\x84\x12\x8e\xb1\x1f\x2c\xb8"
- "\x36\xe3\xca\x09\xd3\x38\xc6\xc6\xfb\xe7\x8f\x42\xfe\x03\x6b\x77"
- "\x8c\x2d\x59\x96\xb1\x28\x75\x49\x92\x76\xc9\xb2\xf4\xb4\x17\xb5"
- "\x2b\x96\xac\x4a\x7e\x70\xc2\xca\x48\x6d\x5a\xa6\x36\x6d\xc9\xb2"
- "\xe7\xc4\x84\xa4\x61\xe4\x89\xe4\xd4\x45\x99\x98\x02\xb9\x9f\x5b"
- "\xb6\x34\x79\x59\xba\x36\x2d\xf9\xc5\x95\x4b\xd2\x92\xf1\xff\x15"
- "\xda\x67\x97\xa7\x41\xc2\xe2\xe4\x25\x19\xc9\xda\x67\x56\x3e\xfb"
- "\x6c\x72\xda\x8a\x61\x64\xee\xca\xd4\xf4\x25\xba\xd4\x64\xed\xf4"
- "\xb9\x0f\x4f\x9e\x37\xe3\x17\xf3\x1e\x7a\x08\x57\x58\xdd\x62\x93"
- "\x85\xd3\xc2\x3c\x1d\x60\x4e\x71\x5a\x7e\xef\xbe\x5a\x90\xb2\x18"
- "\xcf\x76\x5d\x2b\x51\x17\xa4\x11\x45\x7e\x2b\x51\x16\xb5\x12\x95"
- "\xf6\x79\x12\x43\xf3\xf7\x93\xe2\x56\x12\x46\x8b\xe7\xda\x85\xfc"
- "\x4e\x35\xcd\xef\x8c\xb7\x05\x35\x61\x9a\x5a\xc8\x3f\x19\x0d\xef"
- "\x84\x01\x6d\x15\x34\xdf\x69\x6e\x94\xdf\x6b\x84\x67\x56\xc3\x37"
- "\x44\x4e\x87\x45\xa8\xff\x22\xd8\xe4\xfb\xd2\x09\x5b\xdb\x25\xf2"
- "\x89\x11\x70\x85\xc1\x75\x00\xae\xc3\x70\x59\x89\x7c\x92\x12\x2e"
- "\x35\x5c\xe3\xe1\x8a\x82\x6b\x1a\x5c\xd3\xe1\x9a\x03\xd7\x3c\xb8"
- "\x16\xc0\x55\x0f\x97\x9d\xc8\xef\x81\xbc\xf7\x68\x79\x39\xf7\x44"
- "\xc2\x95\x00\x97\x11\xae\x52\x22\x8f\x84\xfc\x91\xa9\x70\xb5\xc0"
- "\xb5\x06\xae\x12\xb8\x30\xbd\x12\x2e\x78\xff\x9e\x28\xfe\x6c\xf2"
- "\x7a\xb8\xea\x08\xd4\xb3\xff\x6b\xb2\x0d\x2e\xf8\xee\x94\x70\xb8"
- "\xb2\xe0\x82\xfa\xde\x1b\xd5\xc7\x3b\x99\xfd\x94\x59\x1a\x9a\x3d"
- "\xce\xca\x62\xe0\xc9\x27\xbe\x4a\x4d\x24\x80\xe6\x37\x59\x75\x93"
- "\x88\xec\x8c\x7c\xe2\xe3\x16\x90\xbe\x54\xd9\xa9\x66\x31\x1d\xe1"
- "\x1e\x69\xd6\x5e\x30\x31\xde\x4a\x52\x6d\x18\xd3\x6c\x60\x78\x9b"
- "\x18\x2f\xbe\x5f\x62\x95\x0d\x2d\x67\x31\xe0\x0a\x2a\x6c\xd4\x90"
- "\xb0\x91\xc5\x7e\x03\x1a\xe2\xb9\x2c\x9a\x57\x91\x42\x95\xbb\x1c"
- "\xd8\xe7\xcd\xab\x58\xbd\x26\xf2\xfe\x05\xcf\xa1\x6e\xb6\xe0\xb9"
- "\x76\xa8\xa7\x02\xef\xa1\xae\xa4\x23\x78\x6d\x3c\xfe\x7f\x79\xd3"
- "\x2c\x23\x2d\x5c\x9b\x89\xe3\x6c\xb3\xfe\x2d\xd2\x08\xef\x75\x04"
- "\xe7\x6b\xb4\x4f\x84\xd2\x46\x5e\xb6\x1c\xf2\x55\x4a\x65\x75\x04"
- "\xc7\x12\x5a\x9a\x1f\x43\x8b\x00\x43\x62\x79\x50\x3e\xa1\x85\x39"
- "\x5a\xab\x7c\x92\x06\xd3\x69\xd9\xac\x52\xe9\x7f\xf8\x05\xbc\xad"
- "\xad\xc0\xdf\xd0\x6c\xd2\xc6\xee\x4d\x31\x84\xff\xaa\x09\xca\xba"
- "\x16\xf9\xa4\xf7\xee\xad\x23\x32\xf3\x13\x58\xef\x49\x79\x86\x3a"
- "\x2a\x68\xf5\x01\xf0\xfd\x49\xf9\x5d\xdf\x1d\x9d\x1f\x8d\x31\x52"
- "\x85\x82\x1f\x6a\x31\x06\x1f\xbe\x8b\x75\xdb\x30\x92\x28\xb6\xfc"
- "\x8e\x28\xb1\x8d\xed\x05\x93\xf6\x48\x71\xe8\xf0\x1d\x39\xe4\x9f"
- "\xfd\xb8\x81\xba\x95\x9d\x4d\x79\x7b\xc6\x73\x9a\x4e\x6a\xb2\xca"
- "\x02\x0b\x31\xbf\xf6\x2e\x46\xcb\x89\xe2\x73\xa4\x91\x15\xcb\x17"
- "\x8a\xf2\x74\x78\x8f\x71\xee\x42\x01\x6d\x5a\xfd\xf8\x0a\x4e\xa3"
- "\xb5\x99\x58\x0e\xe6\x17\x8a\x4d\xf8\x7f\x95\x00\xed\x75\x9a\x48"
- "\x84\x76\x19\x89\x69\x94\xdf\xf3\xb8\x33\x7f\x6f\x39\x3c\x87\x7e"
- "\xb7\x77\x3b\xe4\x2f\x61\xf4\x2e\xca\x51\x5b\xe5\xf7\x4c\x87\x67"
- "\xdb\xbb\x62\x5f\x72\x3a\xcb\x84\xfc\xbd\x95\xed\x05\xf7\x64\x5a"
- "\x65\xe1\xeb\xa5\x36\x30\x19\xe7\xca\x27\xf2\xf4\x9e\x54\x5b\xd0"
- "\xde\xca\xce\x0c\x5a\xb7\xee\x18\x21\xf0\x4d\xda\x71\x89\x56\x67"
- "\xc5\x53\x7b\xf1\x2f\x09\xa9\x4e\x6c\x20\x86\x45\x24\x7c\x78\x36"
- "\xb5\xc5\x39\x49\xe8\xf0\x86\x50\x5a\x13\xdf\x00\x32\xfa\x22\xc9"
- "\xaa\xa3\xcd\xb5\xba\x4a\x92\x75\x8a\xa8\x56\x2f\x21\x61\x86\x78"
- "\x6a\xd3\x57\x53\xbb\x25\xb3\x81\xd4\xb6\xc1\xa5\xab\x81\x7c\x47"
- "\xe0\xaa\x24\x86\x97\x89\x22\x16\xe4\xa9\xfe\x22\x51\xd5\xea\x2e"
- "\x42\xda\x59\x92\x95\x48\x1d\x35\xd5\x98\xef\x20\x89\x73\xd8\x42"
- "\x57\x9f\x25\x8a\xcd\xbf\xc4\xb3\x65\xc7\xc9\x16\xa8\x4b\x47\x50"
- "\x67\xcc\xe5\x7c\x67\xd5\x85\x0c\xea\x68\x2f\x88\x9c\x6e\x25\x0f"
- "\x18\x3d\xda\x82\x75\xc6\xb8\xa1\xd0\x5e\xcc\x23\x14\x99\xec\x0b"
- "\x1d\x88\xf3\xc8\x68\x90\xc5\x44\x7a\x8e\xcf\x6c\xc1\x26\xc0\x4f"
- "\x64\x52\x9c\x83\xb6\x63\x7e\x6c\x37\xd0\xa8\x42\x6c\x7f\x45\x80"
- "\x8e\x28\xe0\x1b\xe5\x56\xd9\x38\x9d\x1b\x0f\x91\x27\x43\xa4\xef"
- "\x89\x79\xaa\xad\xb2\x3b\x58\xec\x45\x81\x3f\xdb\x83\x79\x21\x1d"
- "\xf8\x3f\xd6\xcc\xeb\x17\xb9\x1d\xd3\x44\x59\x8a\xe5\x54\x0a\xd8"
- "\xaf\xf3\x76\xd5\x39\x83\xd7\x1a\xa9\x9c\xda\x69\x51\xac\x86\x5e"
- "\xd0\xa8\x62\x1d\xd4\x0e\xf5\x56\x83\xbc\x54\x61\x9c\x54\x9e\x7f"
- "\xf2\x6a\x78\xae\xd5\x66\xb0\xff\x93\xf1\x3b\xc2\xa6\x59\x3a\x94"
- "\xad\x71\x75\x98\x3f\x56\x57\x9c\x06\xb2\xb7\x68\xad\x0e\xfb\xa1"
- "\x10\x9c\x13\x71\xf9\x8d\x7c\x2d\xf6\x6f\x0a\x18\xa3\x85\xb1\xda"
- "\xae\x72\x4c\x24\xd0\x2a\x9f\x3c\x8d\xc2\xfb\xb4\xd0\xa4\x16\xeb"
- "\x33\x81\x63\x73\x72\x34\xf6\x3b\xa8\xd7\x61\x48\x0f\x6c\x94\x4f"
- "\x3e\x80\x67\x34\x69\xde\x6e\x15\x8b\x25\x29\x9f\xfc\x21\xc7\xcc"
- "\xae\x3a\x8f\x7b\x39\xd2\x0f\xfa\x24\xc8\x01\x6e\x5f\x4c\xfe\xc6"
- "\xd5\x2f\x38\x8e\x79\xff\x36\x41\x9d\xee\x19\x2f\x98\x02\x04\xc8"
- "\x27\x6b\xe4\x74\x90\x77\x04\xed\xdd\xd9\x5e\x30\x25\xcc\x2a\x23"
- "\x51\x1e\xfc\x2c\xf8\xab\x0d\xe3\x56\x42\x5d\x02\x4e\xcb\xa7\x3c"
- "\x0c\xbf\x43\xe1\x77\xc6\xfe\x3a\xd4\xb5\xac\xdc\xe1\xf8\xff\x86"
- "\x51\xd4\x36\x7d\x2e\xc1\x18\x95\x40\xf7\x29\x0b\xac\xe4\xe9\x79"
- "\x58\x4e\x01\xc6\xee\x84\x34\xcc\x03\xe9\xe9\x56\xb2\x70\x3a\x2f"
- "\x7f\x92\xa6\x0d\x65\x96\x67\xf9\x6f\xf0\xf2\x79\xb9\x58\x9e\x54"
- "\xf6\xa6\xd7\x69\x8b\x58\x76\x85\x54\x76\x11\xa4\x49\xe5\x4f\x5f"
- "\xda\xf5\x8d\x7a\x78\x5e\xed\xde\x86\x37\x5e\xa7\x6d\x58\x06\x3c"
- "\x6b\xb3\x92\xe7\x34\xf8\x2c\x1f\xd2\xf0\x5d\x37\x4c\x05\xec\x07"
- "\x49\xbc\xbf\x1a\xcb\xb8\x37\xdc\x4a\x92\xb7\xba\xcb\x0d\xa0\x51"
- "\xb0\x24\x6b\x79\x59\xf7\xc6\x48\x65\xb9\x95\x23\x62\xea\xbd\xad"
- "\x22\x4f\xb1\x5c\x15\x96\x0b\xf9\x75\x56\x92\xd8\xec\xde\x76\x51"
- "\x76\xe6\x41\x1e\x99\x98\xff\x71\x94\x4b\x52\xbd\x31\x76\x27\x2d"
- "\xf8\xe1\x4c\xec\x1b\x20\x03\x89\x50\x94\x83\xe5\x54\x74\x93\x81"
- "\x0a\xcc\x07\x72\x73\x35\x8b\x5d\x3a\x8a\x36\x43\x9e\x06\x8f\x78"
- "\x9d\x72\xf2\x53\x48\xb3\x49\x71\x43\x8b\x21\x8f\x55\xfe\x43\xaf"
- "\x7e\x11\xf5\x77\x92\xff\xcf\xde\xfb\xc0\x37\x55\x65\x8b\xc2\x2b"
- "\xa7\x29\xa4\xb5\x90\x88\x88\xd5\x5b\x35\x68\xd1\xa8\xfc\x29\x50"
- "\x11\xb1\x48\x91\xa2\x45\x0b\xad\x82\x5a\x05\xa1\x60\x71\x82\x16"
- "\x88\xa5\x40\x81\xd2\xa4\x01\xc7\xd2\x29\x50\xb5\x62\x91\x42\xeb"
- "\x1d\xe6\xfb\x31\x73\x99\x91\x3b\x8f\xf9\x1e\x73\x7f\x38\x66\x86"
- "\xa2\x75\xa4\x0d\x73\x3f\xf8\x4d\x67\x1e\x8e\xb1\x53\x99\x0e\x13"
- "\x20\x63\x83\x0d\x6d\x92\xfd\xad\xb5\xf7\x39\xcd\x49\x9a\x40\xcb"
- "\x78\xdf\xbb\xe3\xb3\x1a\xce\x39\x7b\xaf\xbd\xf6\xde\xeb\xdf\x5e"
- "\x6b\x9f\xbd\xf7\x91\x9c\xf5\x2e\xf2\x49\x49\xae\x32\x9c\x29\x5e"
- "\x70\xd6\x07\x21\xb8\x6f\x4e\x63\x66\x39\x73\x9c\x95\xd2\x56\xd2"
- "\xf7\x9e\x07\x37\xce\xa5\xf1\xef\x3f\xb2\x1e\xf4\xd5\xca\x26\x01"
- "\x8d\x6d\x17\xa4\x89\x7b\x9d\x9e\xaf\xb8\x7e\xe1\x3d\x1f\x0b\xde"
- "\x42\xdf\x8e\xfc\x3b\xf4\xa9\xe9\x1b\xc0\xdc\xc7\x0b\x22\xec\x3e"
- "\x4a\x27\xff\x0f\x7d\xcf\x06\x55\x1e\xdb\x37\x27\x5f\xd0\x6e\xe2"
- "\xd3\x44\x47\xde\x5e\xff\x63\x0e\x6a\x73\xb0\x7e\x4e\x3e\xf5\xc1"
- "\x5a\xca\x82\x4e\x7f\xb7\x83\xbe\xa7\x6b\x5c\x47\xbe\xe9\xc4\x89"
- "\xb9\x7b\x81\xa1\xfe\xe6\x0f\xb2\x0f\x7c\xfd\x2f\xfa\xdf\x17\x3c"
- "\xb7\xce\xc9\xa7\xef\x27\xef\x2c\x8f\xd7\xcd\xaa\x67\x8e\xae\xdb"
- "\xe6\x34\x76\x57\x4d\x5c\xa0\x7c\x9f\x76\x70\x78\x27\x2e\x50\xfa"
- "\xbe\x4f\xee\x3b\xd6\xc5\xe7\x6c\x26\xd4\xf1\xef\x63\xe3\xf3\xc4"
- "\xea\x58\xfc\x42\x1b\x52\x49\x65\xb1\xef\x99\x0d\x0a\x9d\xfc\x1e"
- "\xfa\x36\xf8\xf5\xe7\xa4\x49\xa3\x73\xcb\x1c\xc0\xcf\xc2\xdf\x6e"
- "\xaf\x1c\x64\xbb\xf8\xfc\x77\x2b\xfa\xfe\xb9\xfe\x0f\x99\xb0\x7d"
- "\x93\xe6\xcc\x93\xf1\x51\x9e\xc2\xab\x7d\xb2\x4f\x3e\xf8\x3a\x26"
- "\xc5\x9c\xff\x54\xf5\xcb\x10\xa5\x5f\x97\xaf\xbd\x5f\x93\x9a\xfa"
- "\xf7\x6b\xf2\xe8\x6f\xb6\x5f\x93\x63\xbe\xff\x54\xf5\xcb\xd8\xbf"
- "\x5f\x93\x7f\x77\xed\xfd\x9a\x5c\x1f\xa5\x5f\x97\xbf\xd9\x7e\xa5"
- "\xc3\x00\xfa\x95\xd6\xbf\x5f\xe9\x3f\xbe\xf6\x7e\xa5\x97\xf4\xef"
- "\x57\xfa\xef\xbe\xe1\x7e\xc5\xfc\xfe\x59\x4c\x7b\xb8\xe3\xf5\x93"
- "\xc2\x1e\xde\xbf\x79\xf0\xf6\xf0\xfe\xec\xfe\xf6\x70\xca\x4f\x43"
- "\xf6\x70\xca\xee\x6b\xb2\x87\x3b\xe6\xc9\xfe\xc4\x94\xe5\xfd\xec"
- "\x61\xf5\x3c\x43\x74\x7b\x38\x65\x26\xb7\x87\xdb\xe7\x19\x06\xd7"
- "\x87\x29\x49\x7d\xf6\x70\xd8\x3c\x43\x98\x3d\x1c\xfe\xfa\xc9\xee"
- "\xaa\x29\x85\xd7\x66\x0f\xa7\x14\xf6\xb7\x87\xf7\x37\x85\xdb\xc3"
- "\x29\x31\xd7\x7a\x63\xac\xa2\x8b\x66\x0f\x73\xfd\x17\x99\x90\x8d"
- "\x2d\x83\xfb\x86\xb9\x34\xc5\x7b\x05\x99\xaf\xb9\x72\x5d\xf6\x9a"
- "\xc1\xd5\xf5\x40\x41\xcc\xba\x74\x3f\x27\x3f\xc3\xb0\xf9\x3d\x90"
- "\xce\x62\x94\xdb\x9a\xd2\x06\xce\x52\x1f\x8c\xb7\xa0\x4c\xd8\x21"
- "\xa3\xb5\xde\x0d\xad\x29\x67\x81\x25\xfc\xdc\xc3\xfe\x9f\xc7\x0d"
- "\x99\xc5\x24\x9b\x53\x6f\x76\x96\xf8\x06\x29\x9b\x0f\x74\x28\xb2"
- "\xd9\xea\x47\xd9\x5c\x47\xf2\xf8\xe0\x1c\xa7\xfb\x9c\x2c\x9b\x0f"
- "\xde\xdf\xc7\x1f\xbb\x90\xcf\xa8\xb2\x89\x3a\x11\x2e\x9b\x76\x9b"
- "\x90\xcd\x07\x35\xfd\x65\xd3\x6e\x8b\x2e\x9b\x53\x3f\x13\xb2\x69"
- "\xb7\x0d\xae\x0f\x53\x0f\x84\x64\xd3\x6e\x0b\x93\xcd\xbb\x1e\x37"
- "\x74\x57\x3d\x08\xd7\x26\x9b\x0f\x82\xd2\xf7\xbd\x72\xdf\xb1\xae"
- "\x82\x70\xd9\x7c\x30\xe6\xb7\xae\xe9\xfb\xeb\x68\x0f\x93\xce\x49"
- "\xd3\x74\x01\xf4\x5b\x83\x95\x9d\xbe\xdc\x00\xeb\xa6\xef\xb0\x33"
- "\xb4\xad\x6c\xbd\x29\xa9\x1b\x63\xca\xee\x6e\xb3\x8e\x25\xfe\xbc"
- "\x9c\xf5\x26\x03\xb6\x5d\xcf\xba\x4d\xc3\x91\x66\xa9\x78\x1d\xb1"
- "\x77\x1d\x8c\xc4\x5f\xf2\x5e\x99\xae\x78\x9f\xc6\xd6\x27\x27\xee"
- "\x58\x07\x63\xf5\x5e\xd0\x61\x1b\xf2\xf5\x15\x06\xc0\x98\x7f\x24"
- "\xdd\x33\x7b\xa3\xb9\xe1\x6b\xd0\xd2\x7c\x62\x30\x01\xeb\x2b\xd5"
- "\x33\xb6\xc6\x04\x0d\xc5\xd8\x1e\x09\x92\x1b\x24\x76\x28\xb0\xde"
- "\x24\xb1\xe1\xaf\xff\x80\x6d\xca\xe7\x6d\x0a\xa6\x3e\x9e\x87\x32"
- "\x94\xc7\xac\x66\xaa\x37\x93\xbe\x07\xcc\xee\x7a\x7c\x01\xeb\x4e"
- "\x4e\xdc\xfe\x35\x8c\x6d\x58\x07\xa9\xfb\xd6\x81\x89\xf5\x9a\x24"
- "\xa4\x41\xfe\xe2\x57\x0d\xc4\xf7\x7c\x26\x61\x5d\xeb\xb0\x2e\xe4"
- "\x65\x60\x1b\xd6\xe5\xc7\xba\x2e\x62\x5d\x17\xb0\x2e\x3b\xd6\x65"
- "\x17\x75\x0d\x8e\xe6\xd3\x4a\xae\x34\xef\x9b\xbb\xf9\x36\x3a\x9f"
- "\xf6\x2f\xfa\xd2\xa1\xd9\x34\x07\xdc\xb5\xc9\x3c\x48\x79\x9f\x76"
- "\x2a\x16\xfe\x9d\x3f\x83\x14\xa6\xfb\xb3\x69\xde\x6b\x9f\xb3\x5c"
- "\xf4\xfe\x5e\xfb\x19\x8c\x25\x9d\x6b\xf5\x9d\x47\x3d\xfb\xb3\xe9"
- "\xb8\xc9\x3d\xc8\xba\x1e\xca\x8c\x55\x57\x95\x9d\x9d\x0c\x26\x61"
- "\x2c\x9a\xf4\x7a\xdd\x4e\x3b\x2b\xed\x4d\x99\x63\xe9\x49\x99\x53"
- "\xb3\xc4\x6f\x40\xb9\x62\xa5\xc6\x62\x30\x9e\x95\x66\xbe\xf6\xdb"
- "\x53\x38\x46\x3c\x0f\xba\x76\x69\xe6\x51\xeb\x1f\x68\xfe\xee\xa1"
- "\x93\xe1\xf3\x77\x0f\x79\x41\x9a\x5e\x08\xd2\xc3\x25\x20\xcd\xa8"
- "\x03\x84\x0b\xff\x65\x1e\x16\xb8\xa6\xcf\xcc\xfd\xf1\x6d\x50\xee"
- "\x67\x7f\xc1\xf8\xd4\xbc\x03\x63\xe0\xdc\x7b\x34\x2e\xc7\x3a\x9a"
- "\xd7\x9a\xfe\x20\xd2\xf4\x6f\x38\x2e\xe9\xf1\x3e\x1e\x79\x07\x96"
- "\x62\xb8\xe1\x9c\x34\x5d\xeb\xc7\x7b\xbd\x77\x68\x76\xc0\x9a\x0f"
- "\xfe\xe4\x6d\xc6\xde\xea\xd7\x2d\x01\x8c\x63\x83\xba\x4e\x9f\xf5"
- "\xaf\x90\xe2\x74\x07\xa0\x1e\xe5\x6e\x49\x40\x47\xfa\x90\xef\x58"
- "\xf6\x5b\x38\x8b\x2d\xb1\x5e\x82\x61\xac\xcb\x94\xa4\xc8\xf5\x5c"
- "\xb7\xde\xb7\xd9\xcd\x82\x24\xdf\x34\xbf\x80\x79\xc3\xcb\x2f\xe1"
- "\x58\xeb\xe9\x84\x7a\x8c\xa5\x03\x6b\xcc\x23\x3c\x5d\xe6\x1b\xf6"
- "\x04\x61\xe4\x70\x2f\x18\xea\xbf\x42\x19\x5c\x83\xf2\xf7\x15\xca"
- "\xb9\x47\xc8\x39\xed\xbf\xd9\x47\x32\xfe\xfd\x5f\x3a\x1a\xbe\x12"
- "\x32\xce\xe5\x8e\x64\x7c\x35\xca\xdd\xaa\x90\xdc\xf9\xbb\x50\xc6"
- "\xab\xa6\x1d\xae\xb7\x33\xd8\xbc\x02\xa4\x86\x73\x43\x29\x4f\x13"
- "\x7f\x8f\x64\xfc\x6d\x9e\x0f\x42\x71\xd8\xcc\x0f\x7a\x6e\x9d\x53"
- "\x63\x7c\x8a\x5d\x6c\x97\xa6\xa7\x61\xba\xce\xf8\xcc\xdd\x06\xa4"
- "\xf7\x07\x62\x7e\x66\xe6\x51\x8a\xdd\x5d\x48\x0b\xa2\x0b\xc6\xd1"
- "\x77\xb7\x4b\x19\xf1\x44\xc7\xf5\x07\x20\xce\xf2\x30\xeb\x40\x9a"
- "\x25\x31\x3e\xa7\x91\xa1\xe5\xf3\xd4\x15\x46\xf8\x94\xcf\x27\x8a"
- "\x32\x01\xa4\x9b\x3f\x69\x9e\x11\xf9\x5d\xe9\x78\xb9\x87\xeb\x1c"
- "\xd1\xf1\x6c\x11\x48\x4b\xdc\x48\xab\x00\xd2\xaa\x9b\xdb\x82\x3c"
- "\x6e\x0b\x2a\x7f\x5e\x5a\xe6\x62\xc1\xdc\xc2\x38\x56\xfe\x2a\xbd"
- "\xcf\x08\xc0\x62\x0b\xb0\xcd\xe7\x91\x5e\xde\x36\xb2\x1b\xc3\x83"
- "\xeb\x85\x6d\x20\x7a\x0d\x73\x83\x81\x55\x75\x78\x7e\x56\xde\x1c"
- "\x1f\x40\xf9\x25\xfb\xa0\xaf\xd0\x24\xa0\x5e\x0e\xaf\x26\xfd\x45"
- "\x7d\xd6\x57\x70\x7b\x95\x5f\x8f\x7a\xeb\x5f\x6f\xba\xa3\x77\xbd"
- "\xc9\x88\xbf\xdb\x14\x1b\x42\xdf\xd1\xda\x4b\xb4\xad\x7a\x28\x85"
- "\xec\x87\xb3\xd4\x05\x7e\xa4\xed\x70\x1a\x6f\xd6\x9b\x52\x38\x8d"
- "\xbf\x67\x82\x09\x3e\xd0\x60\x9b\x0c\xd8\x5e\x68\x78\x09\x74\x2d"
- "\xe6\x76\x08\xa0\x6e\x28\x74\x9f\xbb\xc2\x08\x88\x57\x3a\x6e\x3a"
- "\x0d\x32\xcd\x34\xb1\xe5\x6e\xc6\x1b\x21\xb9\x9b\xf1\x06\xd1\x4e"
- "\xc8\xdd\x8c\x9a\x6f\xa3\xdc\x7d\x9a\xcf\xe5\x2e\xae\xf7\x56\x2e"
- "\x4f\x49\x4e\xff\xcf\x91\x46\x33\xca\x48\x46\x48\x66\x3e\xf9\x09"
- "\xc9\x4c\xe6\xfe\xff\xae\x32\x73\xb9\xdb\x64\xc4\xdf\x7f\x89\xcc"
- "\x20\x5e\x2e\x33\x44\xab\x4f\xf3\x7b\x40\xa1\x11\xd7\xd5\xca\x3f"
- "\x9b\x8c\x56\x98\x81\xba\x7a\x54\x5f\x71\x1b\xb4\x70\x3a\xcd\x3c"
- "\x6a\x7c\x86\x05\xdb\xa5\xcc\xcf\xac\xbf\x03\x43\x8f\x9d\x31\xa7"
- "\xff\xa7\x10\x4c\xda\x62\xe2\xf3\xd9\xd5\xf3\x2c\xf4\x6e\x84\xde"
- "\x8b\xd0\x1c\x9d\xde\x42\xef\x42\x3a\xe8\x9c\x2e\x0b\xbd\x1f\x61"
- "\x09\x01\x47\x00\xf5\x3a\xb8\xed\x18\x04\x13\x7a\xd1\x47\x98\x99"
- "\xea\x82\x0f\xf8\x5c\x12\xab\x7e\x9d\x7c\x17\xb2\xbf\x7c\xbd\x37"
- "\xbd\x3b\xc1\xfc\x2c\x65\xce\x9f\x6c\x82\x3c\x2f\x27\xcf\xdb\xcd"
- "\x24\x1e\x26\xd2\xbc\x9d\x6c\x53\xee\x57\xe6\xed\x94\x67\xca\xc7"
- "\x72\x53\x69\xce\x47\x55\xee\xb0\x80\x53\xca\x3d\xf4\x4b\xb2\xf5"
- "\xa1\x72\xe2\x19\xc7\x91\xc3\xbd\x12\xe8\xa2\xfa\x18\x49\x95\x16"
- "\xd4\x1f\xed\x59\xe9\x91\x5f\xe2\x55\xc2\xeb\xd3\x78\x8d\xc3\x2b"
- "\xff\x6e\xdb\xe0\xc6\xab\x99\xf2\xf7\x8f\x5f\x97\xe7\xa8\x67\xfe"
- "\x9d\xeb\xe4\xbd\x30\xec\x9c\x7c\xdf\x5d\xf5\x48\x8e\xf2\xee\xa2"
- "\x0f\x3e\xc4\x9f\x4e\xaa\x1b\x79\xa4\x15\xef\x53\xc4\xb3\x0a\xdf"
- "\x5f\xf9\x33\x68\x53\x30\x76\xe1\xdf\xe1\x43\xf9\xd5\x74\x33\xf3"
- "\xc3\xf2\x75\x3a\x7f\xff\x82\x3c\x22\x7f\x4d\xb6\xbf\x1e\xb9\xde"
- "\x26\xa4\x83\x4d\x5d\x6f\x34\x7a\xb8\xa4\x47\xfa\xbd\xd3\x53\xf2"
- "\x06\x47\x8b\x47\x62\x7e\xff\x70\xb6\x29\xc0\x06\x87\x6b\x56\xcc"
- "\xfd\x8f\x2c\x65\x4e\x5e\xee\x81\x80\x23\xd8\x9b\xaf\x3f\x5e\x76"
- "\x7e\x90\xfe\xc5\xac\xc6\x58\x78\x03\x49\x5b\x32\xfd\xf5\x73\x48"
- "\xf6\x93\x5a\x0f\xf8\xe1\xc7\xe7\x3a\xa5\xdc\x7b\x6e\x83\x61\x1d"
- "\x60\x20\xff\x69\xae\xfb\x43\x46\x3e\xd4\x8e\x73\x90\xda\x73\x31"
- "\x5f\xdf\x8b\xbe\xe0\x0f\xce\x41\x46\xf0\x7b\xc9\x89\xd5\x2f\x81"
- "\xb6\x07\xfd\xd5\x9e\xef\x99\xf5\x9f\x9e\xe9\x04\xd4\x93\xbc\x56"
- "\xaf\x0b\xf6\x21\x2c\xfb\x4b\xfe\xf0\x39\x05\xcc\x77\xa2\xe0\x4d"
- "\xc8\x35\x05\x1c\xe5\x5f\xc0\x30\xb4\x45\x06\x67\xe9\x4f\xf9\x3b"
- "\x85\xf8\x0d\x92\xd1\xe9\xff\x12\xb6\xbf\x84\x36\x0c\x6d\x96\xf5"
- "\x39\xb4\xd5\xfe\x4b\xb0\x47\x6d\xab\x5f\xfe\xd7\x90\xad\xbe\x88"
- "\xb6\xba\x0a\x6d\xb5\x35\x19\x5a\x2d\x0e\x40\xdb\x31\x74\x9e\x45"
- "\xef\x2b\xb7\xa0\xcd\xde\x80\x36\xbb\xf4\x4b\xe0\xf6\xda\xdd\x09"
- "\x68\x6b\x87\xef\x5d\x05\x23\x7b\x57\xa3\xcd\xbe\x68\xbe\x61\x77"
- "\xb9\xb0\xd9\xef\xae\x42\x9b\xbd\x1a\x7d\xe2\x55\x68\xb3\xdd\x51"
- "\x6c\xf6\x85\x18\xfe\xb0\x6c\x7f\x7a\x56\x9b\xa4\x77\x25\x06\x9b"
- "\x9e\x03\x69\xf7\x1f\x87\x0e\x52\x4e\x66\xa7\xc6\xe2\x01\xd1\x9b"
- "\xe8\x1f\x44\x3e\xb4\x20\x0f\xb8\xdf\xea\x1b\x9a\xdd\x8b\x63\x5a"
- "\x60\x78\x79\xcd\x4f\xce\xb5\x49\xc3\x4b\xc0\x30\xcf\xf2\x21\xeb"
- "\x59\x93\x8f\x7e\x7f\xfe\x30\x7f\xf5\x96\xcc\x6a\xf4\xa9\x03\xe8"
- "\x7b\xf7\x76\x27\xeb\x90\x06\x06\xcf\x7a\xb3\x9e\x68\x18\xbc\x15"
- "\xf9\x39\xe4\xee\x0c\xb4\xa1\xe9\x7b\x5f\x82\xa9\xbd\xdb\xcb\x8f"
- "\xb2\xed\xe5\x87\x02\xdb\xcb\x0f\x63\xd9\xe1\x4f\xb8\x88\x2f\xff"
- "\x01\x98\x76\x92\xed\xa8\xa8\x09\x0c\xdb\x92\xe9\x19\x56\x7e\x04"
- "\x9f\x9b\x29\xbf\x7c\x29\x0c\xcb\x35\x5d\x76\x08\x7e\xfd\x08\x88"
- "\x4f\x82\x5f\x9f\xc1\x76\x8c\xfb\x68\xcc\xe5\xe3\xab\xcc\x33\x8c"
- "\x17\xb8\xbf\x1f\xe2\x5b\xc4\x18\x2b\xf3\xad\xc5\xed\x00\x1c\x4f"
- "\x86\xf6\x8d\xb5\x9c\x6f\x9f\x81\x32\xce\x22\xbd\x87\xef\xc5\xb1"
- "\xb6\xf7\x9b\x1a\x6b\xe5\x38\x86\xc6\x5a\x1a\x67\x89\x6f\xef\x0e"
- "\x9a\x6f\x8f\x9e\xb9\x36\xbe\x59\x0d\xd7\xc8\xb7\xda\x10\xdf\xac"
- "\x19\x6c\xbb\x35\x2d\xb0\xdd\x9a\x1e\xce\x37\x6b\x5e\x88\x6f\xd6"
- "\xa9\xf8\x9c\x1d\xe2\xdb\xa5\x41\xf0\x2d\xfe\xab\x6f\x2f\xdf\xb2"
- "\x6b\xaf\x91\x6f\xd7\xaa\x6f\x6e\x15\xdf\x50\xdf\xac\xa8\x6f\xd6"
- "\x08\x7d\xb3\xaa\xf4\xcd\x8a\xfa\x66\x55\xe9\xdb\xf9\x41\xf0\xed"
- "\xba\xf6\x6f\x2f\xdf\x1e\xcf\xb9\x36\xbe\xd9\xae\x51\xdf\x4c\x59"
- "\x21\xbe\xd9\x50\xdf\x6c\xa8\x6f\xb6\x08\x7d\xb3\xa9\xf4\xcd\x86"
- "\xfa\x66\x53\xe9\xdb\x67\x83\xe0\xdb\xf5\xff\xf9\xed\xe5\x5b\x8e"
- "\xf6\x1a\xf9\x76\x8d\xfa\x66\xaa\x57\xf1\x0d\xf5\xcd\x86\xfa\x66"
- "\x8b\xd0\x37\x9b\x4a\xdf\x6c\xa8\x6f\x36\x95\xbe\x7d\x30\x08\xbe"
- "\x4d\xa9\xfa\xf6\xf2\x6d\xee\xd1\x6b\xe3\x5b\xc5\xb5\xea\x9b\x37"
- "\xc4\xb7\x0a\xd4\xb7\x0a\xd4\xb7\x8a\x08\x7d\xab\x50\xe9\x5b\x05"
- "\xea\x5b\x85\x4a\xdf\x36\x0f\x82\x6f\x0b\x1f\xf9\xf6\xf2\x2d\x37"
- "\xe6\xfc\xa7\xc2\x37\x85\x67\xc4\x3f\xce\x37\x96\x0f\x7e\xf4\x27"
- "\xff\x6d\x99\xe0\x1b\xf1\x8b\xf3\xae\x2b\x5f\xbf\x5d\xe6\x99\x5f"
- "\xe6\x19\xd1\x8f\xf8\x46\x7e\x24\xe7\x9b\x46\x3b\x92\x7c\x48\x3f"
- "\xfa\x92\x8a\x1f\xf9\xb8\x99\xf9\x5a\xcc\xff\xda\xe7\x47\xfa\x23"
- "\xfd\xc8\x15\x6a\x3f\xf2\xa7\x61\xfc\xaa\xfe\x1a\xf9\x25\xc9\xfc"
- "\x7a\x21\x86\x1f\xf9\xd2\x6f\x62\xf0\xeb\xe4\x55\xf9\x85\xbc\x19"
- "\xd9\xdb\x25\xf8\xf5\xae\xec\xff\xd7\x17\xff\x83\xfc\x5a\x83\xfc"
- "\x22\xff\xff\x33\x90\xf6\x2c\x1e\x2c\xbf\x9e\xbc\xaa\xff\x1f\x9d"
- "\x5f\x36\xc3\xe0\xf8\x65\xca\x0a\xf1\xcb\x96\xe6\xc7\x31\x4d\x19"
- "\xcf\x42\xfc\x12\xe3\x99\x3f\x72\x3c\x5b\xa1\x1e\xcf\x06\xc2\xaf"
- "\x88\xf1\xec\x5b\xc5\xaf\xa7\x62\xce\xff\x07\x30\x16\x0f\xa0\x9d"
- "\xa3\xf9\xca\xe1\x9d\x18\x27\xfb\xd9\x5f\xe6\x79\x31\x4e\xf6\x0f"
- "\xcd\xde\xb9\x0a\x52\x7b\xd7\x63\x9c\x8c\xbc\xab\x5e\x05\x19\x55"
- "\xab\x40\x1b\x7c\x05\x63\xe5\x73\x18\x2b\xa3\x7d\xea\xf9\x9b\x59"
- "\x7f\xa2\xc0\x03\x41\x8c\x95\x69\x1e\x0c\xdb\x9b\xca\xfe\x86\xb1"
- "\x72\x07\xda\xbe\x8e\x77\x45\xac\xfc\xa5\x12\x2b\xff\x22\x2c\x56"
- "\xfe\xc1\xcb\x72\xac\x2c\xd3\xbf\x5e\x4d\xfb\xe7\x7f\x12\x23\x56"
- "\x6e\xbe\x6a\xac\x4c\x31\xf2\x1e\x8a\x97\x2f\x9a\x47\xec\x96\x6d"
- "\xdb\xbb\x17\xfe\xc1\x58\xf9\x22\xc6\xca\x76\x41\xfb\x77\x07\x4d"
- "\xfb\x05\x31\xd7\x7f\x90\x6e\x90\xbe\xf4\x8d\x45\x48\x67\x65\x0c"
- "\xea\xc5\x31\x88\xe6\x33\x7a\xaa\xcb\x6b\x51\x5e\xb9\x7e\xf0\x31"
- "\x69\x7d\xb2\x8e\x74\x83\xf4\x84\x74\x83\x8f\x45\x68\x07\xd9\x90"
- "\x7b\x72\xf6\xbd\x0c\x53\x1b\x5e\x86\x74\xff\xb0\xf0\x18\xf9\xf1"
- "\x42\xe2\x47\xc8\xb6\x05\x23\x6d\xdb\x72\xb5\x6d\xfb\x45\xff\xb1"
- "\xe8\x6a\xb6\xed\xe5\x58\xba\xd2\x7c\x55\x5d\x21\x1d\xe1\xe3\x11"
- "\xea\xcb\x7f\x85\xae\xbc\xfb\xa7\xc1\xf2\xeb\x99\x98\xeb\x3f\x06"
- "\xc6\x2f\xeb\xc8\xab\xf3\xcb\x6a\x40\x7e\x35\x86\xf8\x15\x1e\x1b"
- "\x87\xf8\x25\x62\xe3\x60\x64\x6c\xbc\x5c\x1d\x1b\x0f\x84\x5f\x91"
- "\xb1\xf1\xb7\x89\x5f\xcf\xc6\x5c\xe7\x37\x40\x7e\x0d\x40\xbf\xac"
- "\xa4\x5f\x5e\x15\xbf\xc2\x62\x62\x15\xbf\x54\xfa\xa5\x8a\x89\x97"
- "\xab\x63\xe2\x81\xf0\x2b\x32\x26\xfe\x36\xf1\xeb\xb9\x98\xeb\x3f"
- "\x06\xc6\x2f\xdb\x00\xf4\xcb\x86\xfa\x75\x6f\x76\x88\x5f\xe1\xb1"
- "\x70\x88\x5f\x36\x95\x7e\xa9\x7c\x87\xe5\x6a\xdf\x61\x20\xfc\x8a"
- "\x8c\x85\xbf\x4d\xfc\x5a\x68\xf8\x07\xf9\x35\x00\xfd\xb2\xa1\x7e"
- "\xdd\x5b\xaf\xe2\x57\x58\x0c\xac\xe2\x97\x4a\xbf\x54\x31\xf0\x72"
- "\x75\x0c\x3c\x10\x7e\x45\xc6\xc0\xdf\x26\x7e\x2d\x72\xfc\x63\xfc"
- "\xaa\x18\x80\x7e\x55\x90\x7e\x79\x42\xfc\x0a\x8f\x7d\x43\xfc\xaa"
- "\x50\xe9\x97\x2a\xf6\x5d\xae\x8e\x7d\x07\xc2\xaf\xc8\xd8\xf7\xdb"
- "\xc4\xaf\xc5\x96\x2b\xc5\x52\xea\x18\xca\x6f\x0d\xf1\x8b\x78\xd3"
- "\x8b\xb1\x53\x6f\x52\x79\x6d\xec\xf8\xe9\x9e\x9c\x58\xf1\x2e\x9d"
- "\x07\xf3\x78\x27\xed\x09\x11\x3e\x21\x8b\xf0\x09\x5b\xcc\x3f\x81"
- "\xf0\x98\xf7\x83\x7e\x31\x54\xaf\x32\x47\xb1\x34\x56\xcc\xfb\x1f"
- "\xd7\x1c\x43\x11\x9f\x28\x8e\xf2\xaf\x41\x3e\xc9\x7e\xfc\x9e\x7f"
- "\x70\x8e\xa2\xb7\xcb\x24\xed\x41\x3f\xbe\x6c\x29\xc6\x50\xcb\x06"
- "\xcb\xa7\x82\x98\xfb\xbf\x69\x9e\x88\x62\x5e\x8a\xa5\xe8\xbd\x63"
- "\x6b\x47\x27\x54\xad\x03\x03\x7f\xf7\xd8\x19\xfe\xee\x71\xe7\x59"
- "\x8c\xa9\x56\x23\xdf\x7a\xf3\x61\xc7\x59\xc8\xa8\x7e\x59\xc4\x54"
- "\x4a\x3c\xd5\xea\xf5\xf1\x77\x8f\x4e\xbf\x0b\xe6\xb8\x98\xaf\x01"
- "\xe1\x29\x8e\x3a\x51\xf0\x2e\x90\xae\x58\xbf\x80\x61\xc4\x03\x8c"
- "\xc1\x38\x3f\xd4\x31\xd4\x3e\xf5\xfb\xc6\x97\x62\xc5\x50\x57\x7f"
- "\xdf\x58\x7f\x41\xc4\x4f\xfc\x7d\xe3\x7f\x8b\x18\x6a\x69\xcc\xf7"
- "\x1f\x73\x7f\x2c\xe6\x1b\x88\xf6\x4e\x93\x1f\x50\x9e\xfe\xa2\x77"
- "\x8b\x79\x3d\xff\x8e\xf2\x1a\x8a\x69\x29\x9e\x75\x96\x36\x43\xd5"
- "\x46\x30\xf4\x74\xe7\xeb\x31\x46\x1d\xe6\x47\x5b\xf7\x83\x73\x82"
- "\xf6\x9b\xcf\x83\xc1\xf3\x8a\x99\xaf\x95\xa1\x58\x96\x74\x85\xbf"
- "\x73\x5c\x06\xe9\xf5\xed\x30\x95\xeb\x07\xea\x85\x7f\xfb\x96\xcc"
- "\xe0\xb0\xf2\xc3\xa4\x27\x73\xce\x30\x1f\xf1\x80\xf4\xe3\xd3\x33"
- "\xc4\x9b\x9f\x82\xf5\x33\xc1\x1b\xce\x17\x29\xfc\x5d\x70\x7f\xdd"
- "\xf8\xcf\x18\xfc\x39\x32\x30\xfe\xac\x0e\xe7\xcf\xde\x6b\x7d\x1f"
- "\xac\xac\x8f\x5c\x6d\x92\xf6\xca\xef\x83\xdf\x7d\x7e\xb0\xfc\x79"
- "\x31\xfd\xda\xf8\x63\x35\x5c\x1b\x7f\xac\x69\xfc\xdd\x62\x18\x7f"
- "\xac\xd9\x82\x3f\xd6\x74\x8a\x95\x42\xfc\xb9\x34\x40\xfe\x44\xc4"
- "\x48\xdf\x2a\xfe\x14\xc6\x9c\xff\xb9\x0a\x7f\xae\x51\x7f\xac\x87"
- "\xf8\x3b\xc4\x70\xfe\xc8\xfa\x63\x3d\x4c\xb1\x51\x88\x3f\xe7\x07"
- "\xc8\x9f\x88\x98\xe8\x5b\xc5\x9f\x97\x62\xce\x7f\x5f\x99\x3f\xb6"
- "\x6b\xd4\x1f\x5b\x1a\x7f\x57\x18\xc6\x1f\x9b\xac\x3f\xb6\x74\x8a"
- "\x85\x42\xfc\xf9\x6c\x80\xfc\x89\x9c\x3f\xfd\x36\xf1\xc7\x3c\xf2"
- "\x1a\xf9\x73\x8d\xfa\x63\x3b\xc4\xdf\x09\x86\xf3\x47\xd6\x1f\xdb"
- "\x61\x8a\x7d\x42\xfc\xf9\x60\x80\xfc\x89\x88\x79\xbe\x55\xfc\x59"
- "\x11\xf3\xfc\xa7\x2b\xf3\xa7\xe2\x1a\xf5\xa7\x22\x8d\xbf\xfb\x0b"
- "\xe3\x4f\x85\xac\x3f\x15\xe9\x14\xeb\x84\xf8\xb3\x79\x80\xfc\x89"
- "\x88\x71\xbe\x55\xfc\x79\x65\xc1\xd5\xde\x17\x29\xbe\xb3\xfa\xbd"
- "\x6c\x2f\xfa\x6f\xe4\x3f\x93\xef\xdc\xea\x3d\x02\xfe\xd5\x82\x37"
- "\x55\x5f\x83\xa1\x5a\xe6\x0d\x7f\x27\xfb\x8a\x78\x27\xcb\xfd\xb6"
- "\xef\xdf\x9d\xc1\x2a\xb4\x23\xc9\x2f\xe3\xef\x5d\xf9\xbb\x89\xe3"
- "\x94\xd7\xdc\xab\xf2\xdf\x28\x46\x45\xdf\x1b\x28\x4e\xb5\x7e\x39"
- "\x08\xbf\x6d\x59\x2c\xbe\x5c\xfd\xdd\x44\xbd\x6a\x1d\x9f\x12\x7b"
- "\x7e\xa3\x7c\x19\xf4\x7b\xd7\xa2\x98\xe7\x3f\x5e\x99\x2f\x36\xc3"
- "\xe0\xf8\x82\xe3\xcd\xf7\x4d\x59\x82\x2f\x9f\x45\xf0\xc5\x96\xdd"
- "\xab\x1a\x77\x06\xce\x97\x88\xf1\xe6\x5b\xc5\x97\x55\x5b\x63\xc6"
- "\x9a\x68\x97\x88\x27\xb4\xbe\x7b\xe7\x32\x48\xad\x6a\x87\x8c\xde"
- "\xbf\x25\x27\xce\x43\x3b\xd7\xfb\x4a\xb2\xae\x15\x6d\x5c\xb9\x97"
- "\xfd\x65\xb8\x77\x68\xf6\x6f\x4f\x79\xa0\xb5\xc0\x05\x3d\xeb\xf3"
- "\x61\xfb\x39\x5a\xab\x7e\x04\xb6\x15\x53\x2c\xff\x73\xf8\xf4\xcc"
- "\x57\x30\xef\x00\xeb\x75\xba\x8f\x80\x63\xe3\xcf\x81\xbd\x62\x4a"
- "\x6c\x40\x98\x25\x48\xc3\x0b\xd2\xea\x8c\xcb\x18\x8f\x4e\x28\x05"
- "\x43\x8e\x9b\xf9\x5a\xdd\xbf\x85\x3d\x58\xd7\xf1\x52\x00\xa2\x2f"
- "\xf1\x64\xfb\xcb\x14\x7f\x7e\x20\x78\xf2\xa4\xe0\xc9\xbb\xaa\xf8"
- "\xd3\x88\xf9\x67\x2d\xc8\x8f\xbf\x47\xf0\xe3\x4c\x27\x20\x7d\x87"
- "\xce\xf3\x22\x3f\xbc\x0a\x3f\xce\x43\xf9\xab\xc4\x0f\x57\xdf\x7a"
- "\xd7\x1e\x99\x1f\xf5\x64\xbf\x2c\x60\xd8\xad\xc4\x9f\x17\x54\xfc"
- "\x50\xf6\x64\xa9\xf9\xa1\xc4\xfe\xeb\x91\x1f\xeb\x42\xf1\xe7\x65"
- "\x8c\x3f\x77\x63\xfc\x69\xfd\x1d\x48\xbb\xcb\x07\xcb\x0f\x4b\xcc"
- "\xf1\x5f\xe1\x05\x8d\x2d\xbd\xc3\xcb\x6b\x88\x0f\xce\xd2\x43\x40"
- "\x3c\xa1\xf1\x24\xf0\xb7\x64\x5d\x59\x09\xea\x8e\x6b\x68\x76\x0f"
- "\xc3\x98\x1f\xe3\x7d\xe7\xa2\x3f\x02\xcd\x19\x08\x1e\xf4\xf6\x3a"
- "\x3d\x47\x80\x68\xef\xd8\xf8\x47\xce\x87\x0b\x92\xe5\xe8\x62\x2f"
- "\x48\xe3\x51\x0e\x31\xde\x37\x2c\xa1\x7d\xb9\x68\xdb\xf6\xbc\x04"
- "\x53\x73\x2c\xcc\x47\xb1\x29\xe9\x10\xad\x3d\x21\xbb\xd6\x6a\xf9"
- "\x0d\xd0\xbc\x4e\xef\xb0\x2d\x99\xc7\xd1\x93\x24\xfb\x46\x74\x8f"
- "\x5f\x1b\xe2\x13\xad\x27\xe1\xbc\x7a\x7a\x00\xeb\x5c\xd5\xfc\x5a"
- "\xe4\x1a\xd0\xfa\xe4\x1e\x79\xbe\xa0\x5e\x99\x53\xbb\xd6\xf9\x02"
- "\x65\x4e\xed\xa2\x58\x4f\x62\x3d\x8d\xfa\x33\x68\x7e\xbd\xda\x34"
- "\x30\x7e\x59\x0d\x83\xe7\x57\x77\x14\x7e\x15\x17\xf5\xe7\x97\x35"
- "\x4d\xc5\xaf\xda\x10\xbf\xac\xd9\x82\x5f\xd6\xf4\x10\xbf\xac\x53"
- "\xaf\xce\xaf\x2b\xac\x6f\xfd\xa7\xe7\xd7\x9a\x98\xf1\x4f\x04\xbf"
- "\xae\x41\xbf\x2e\x46\xe1\x57\x49\x4a\x14\x7e\xa9\xf5\xcb\xad\xe2"
- "\x97\xac\x5f\x56\x95\x7e\x59\x07\xa0\x5f\x57\x58\xd7\xfa\x4f\xcf"
- "\xaf\xb5\x31\xd7\xff\x84\xf3\xcb\x76\x0d\xfa\xf5\x79\x14\x7e\xad"
- "\x3d\xd1\x9f\x5f\x36\x95\x7e\xa1\x6f\xd1\xc7\x2f\x9b\xac\x5f\x36"
- "\x95\x7e\xd9\x06\xa0\x5f\x57\x58\xcf\xfa\x4f\xcf\xaf\x75\x57\x5c"
- "\xff\xa3\xe2\xd7\x35\xe8\xd7\x87\x51\xf8\xb5\xbe\x2c\x0a\xbf\x54"
- "\xfa\x65\xaa\x57\xf1\x4b\xd6\x2f\x9b\x4a\xbf\x6c\x03\xd0\xaf\x2b"
- "\xac\x63\xfd\xa7\xe7\x57\x69\x4c\xff\x2f\x9c\x5f\x15\xd7\xa0\x5f"
- "\xd6\x28\xfc\xda\x30\xb6\x3f\xbf\x2a\xd4\xfa\xe5\x0d\xf1\xab\x42"
- "\xd6\xaf\x0a\x95\x7e\x55\x0c\x40\xbf\xae\xb0\x7e\xf5\x9f\x9e\x5f"
- "\x1b\x63\xce\x7f\xab\xf9\xd5\xb3\x43\xf1\x0f\x0f\x84\xf3\x0b\xfd"
- "\x75\x7d\x87\x88\xad\x14\x7e\xc5\xf6\x0d\x37\xb6\xf5\xf1\xea\xcb"
- "\x90\x6f\xc8\xf9\x24\xbf\xa7\x20\xfe\x90\x8f\x48\x3e\x61\xcf\x76"
- "\xc1\x23\x7a\x07\x78\x45\xbf\x70\x20\xfb\x9f\xae\x81\x4f\x4a\x5c"
- "\xf5\x8d\xf3\xe9\x0f\xd7\xc2\xa7\x4d\x31\xf7\x3f\x85\xf3\x49\x19"
- "\xb7\x06\xca\xa7\x68\x63\x56\x99\xad\x3f\x9f\x6c\x69\x21\x3e\x89"
- "\x71\x8a\xc6\x2e\x1a\xab\xc2\xf9\x74\x85\xf1\x6a\x20\xfb\x2f\xfe"
- "\xe9\xf9\xb4\x39\xb6\xfd\x93\xf8\xb7\xcd\x0f\xd5\x48\xc1\x23\xf8"
- "\x73\xe0\xaf\x19\xd3\xe2\x31\x8d\x7f\xe7\xaa\x46\xce\x0b\x54\x01"
- "\xed\xd3\x76\xe8\x35\x05\x74\x9e\x2e\xc1\x0c\x51\x60\xf4\x15\x90"
- "\x89\xfd\x11\x70\x12\xd8\x30\xdd\x31\xac\x22\x73\x08\xc2\x37\xb3"
- "\xaa\x47\xfc\x98\x36\x94\x60\x59\x85\x96\xbf\xf3\xd5\x6b\xf8\xd9"
- "\x37\x32\xbc\x06\x08\x9e\x60\x11\x4e\x27\xc3\xa5\xf0\x3d\xc1\x92"
- "\x04\x0d\xfd\xdb\x96\x20\xc3\x18\x83\x76\x30\xaa\xdb\x38\x4c\x93"
- "\xc9\x71\xc9\x70\x89\x01\xfb\xff\x3a\x40\xb0\x81\x0a\x6d\xaa\x1a"
- "\x8e\x3d\x02\x84\x57\x81\xbb\x4e\xc6\x67\x0a\xeb\xef\x1d\x00\xc3"
- "\x2a\x8c\x1c\xdf\x30\xb7\x04\x72\xfb\x92\x58\xe2\xcc\x93\x1c\x5e"
- "\xa3\x1d\x1b\x06\x3f\x04\xd4\xfd\x18\xc6\x86\x8c\x4d\x97\xe1\xd2"
- "\x82\x12\xf0\x6f\x3a\x61\xba\x56\x4d\x6b\x19\x76\xb8\x42\x47\xe4"
- "\xb5\x56\xdd\xdf\x00\xf6\x7f\xaf\x68\xa3\x3e\xf0\xfd\xfb\xb2\xe4"
- "\xbe\x4c\x55\xd7\x4b\x70\x58\x6e\xa2\xcc\x13\x03\xf6\x23\xa3\x0f"
- "\x5f\xf5\x3c\xb3\x02\x67\x0d\xc0\xcd\xc8\x23\x87\xd3\x0c\x20\xf7"
- "\xfb\x7a\x56\x35\xab\x46\xee\x7b\x66\x38\x1d\x35\x2e\x85\x8e\x08"
- "\x93\x85\xb0\x23\x10\x26\x4b\xc1\x1b\xb0\xf3\x3d\xfb\xa2\xdf\x76"
- "\xff\x0d\x24\x17\x2d\x9d\x40\xb2\x4c\x78\x6f\x90\x71\x66\x8b\x3e"
- "\x1b\x60\x6f\x1f\xaf\xb5\x94\xe7\x90\xe1\x46\xf2\xfe\x24\xe6\x1e"
- "\x0d\x68\xb4\x39\xfd\x61\x75\x6a\xd8\x1b\x05\xec\xec\x22\x84\xcd"
- "\xeb\x0f\x6b\x50\xc3\x8e\x12\xb0\x8f\xa5\x22\xec\x82\xfe\xb0\xfe"
- "\x11\x2a\xd8\x9b\x04\x6c\xf6\x19\x84\xcd\xef\x0f\x6b\x54\xc3\x26"
- "\x0b\xd8\x27\xa9\x0d\x8b\xfa\xc3\x66\xaa\x61\x6f\x16\xb0\x8f\xd7"
- "\x22\x6c\x41\x7f\x58\x9b\x1a\xf6\x16\x01\x9b\x93\x83\xb0\x85\x91"
- "\xb0\x0d\x5c\x0e\xe0\x0e\x59\x0e\xfe\x45\xc0\xce\xd3\x22\xac\x39"
- "\x4a\xdf\xe2\x38\x5e\x01\x9b\x22\x60\x67\x75\x22\x6c\x51\x14\x5e"
- "\xa8\x61\x6f\x15\xb0\x8b\x8f\x20\xac\x25\x0a\x2f\xd4\xb0\xb7\x09"
- "\xd8\x05\x75\x08\x5b\x12\x85\x17\x6a\xd8\xdb\x05\xec\x33\xd9\x08"
- "\x5b\x1a\x85\xbe\x21\xd8\xc4\x67\x7d\x08\x53\x86\x34\x39\x19\x85"
- "\xb6\x6a\x9c\xa3\x05\xce\xe7\x0e\x20\xbc\x2d\x0a\x6d\xd5\xb0\x77"
- "\x08\xd8\x85\xf9\x08\xbb\xb5\x3f\x2c\x68\xf6\x0a\xfa\x4e\x92\xe9"
- "\x7b\xa7\x80\x7f\x41\x87\xf0\x95\x51\xe8\x4b\xf9\x0e\x59\xd7\x52"
- "\x05\xec\xfc\x14\x84\xad\x8e\x42\x5f\x35\xec\x18\x01\xfb\x4a\x3d"
- "\xc2\xd6\x44\xa1\xaf\x1a\xf6\x2e\x01\xbb\x94\x64\xb2\x36\x0a\x7d"
- "\xd5\xb0\x77\x0b\xd8\x17\xcb\x10\xb6\x2e\x4a\x7b\xef\x50\xc1\x9a"
- "\x04\xec\x72\x6a\x6f\x7d\x14\x5e\xa8\x61\xef\x11\xb0\x2b\xd3\x11"
- "\xb6\x31\x0a\x3f\xd4\xb0\xf7\x0a\xd8\x97\x48\x8f\xf7\x47\xe1\x87"
- "\x1a\xf6\x3e\x96\x68\x5e\x24\xdb\xc5\x03\x91\xb0\xc8\x7b\x61\x13"
- "\xed\x30\x96\x25\xae\xf0\xe3\x3d\xc1\x1d\xe4\x67\x56\x49\x7d\xf6"
- "\x66\x32\xd9\x1b\xd9\x86\x8d\x63\x89\x05\x05\x32\xbe\x43\xfd\xea"
- "\xb6\x6b\xd5\xb0\xe3\x59\xe2\xc6\x32\x19\xf6\x70\x7f\x58\x9d\x1a"
- "\x76\x02\x4b\xb4\x28\xed\x3c\xd2\x1f\xd6\xd0\x07\xcb\x12\x8b\x93"
- "\x10\xe6\xe8\x3e\xd9\x36\xaa\xda\x39\x49\x85\x6f\x22\x4b\x5c\x73"
- "\x54\xc6\xe7\xe8\x8f\xcf\xa8\x86\x9d\xc4\x12\xcb\x52\x65\xd8\xa6"
- "\xfe\xb0\x99\x6a\xd8\xc9\x2c\x71\x6d\x91\x0c\xdb\xdc\x1f\xd6\xa6"
- "\x86\x4d\x67\x89\xeb\x53\x64\xd8\x13\xfd\x68\x4f\x7a\x60\x47\x5f"
- "\x40\xd8\xa4\xfb\x59\x62\xe9\x09\x19\x36\xcc\x0f\x50\x8d\xc3\x53"
- "\x04\xdf\x57\x9d\x40\xbe\xf3\x78\x18\x6d\x7e\x5b\x34\x1f\xc3\x72"
- "\x2f\x5c\x77\x4e\xfa\x7e\xa9\x18\x93\x94\xb3\xe9\x5f\xe7\x63\x4e"
- "\xb0\x7e\x8e\x25\xd7\xcb\xfc\xea\xb4\x9d\x12\x3b\x39\xc1\x0b\x5a"
- "\x7e\xde\xf1\xb0\xd7\xeb\x5c\x98\xee\xb9\x75\x4e\x4d\x77\xd5\xf7"
- "\xb7\xba\x34\x77\x95\xd0\xf9\x1d\x78\x5f\xe3\x82\x97\xb5\x74\xbf"
- "\xd3\xce\xe8\xec\x71\x4d\x60\xc7\xbc\x34\x67\xd0\x4d\x67\x5f\xf9"
- "\x10\x87\xef\xac\x05\xe2\x8c\xc5\x40\xef\x5a\x7a\x9c\xa5\x6e\x38"
- "\x2b\x7d\xff\x34\x5b\x6d\xce\xc0\x36\xe4\x61\x7d\x85\xed\xf8\xcc"
- "\xdb\x80\x3e\x10\x8e\x95\x39\x8e\x62\x3a\x4f\xe8\xf5\x78\xcf\xb0"
- "\xca\x3c\xb6\x65\x61\xa7\xa5\x1c\x6e\x3f\x27\xbd\xce\xf7\xae\xf2"
- "\xb3\x45\x2e\x9a\x1f\x0e\x0e\x9b\x97\x43\x67\x8e\xb0\xba\x6d\x69"
- "\xe2\x3c\x92\xd7\x67\xf2\x36\xdb\xd9\x49\x96\x32\xa7\x20\xd8\xb3"
- "\xd5\x46\xdf\x3e\x70\x94\x9f\x83\x76\x55\x9e\xe7\xe6\x6d\xfc\xac"
- "\x12\xec\x53\x41\xd4\x33\x3c\xec\xa0\x67\xdb\xe7\x99\xbb\xab\x5e"
- "\x37\xa3\xbf\xd6\x24\xfa\xf8\x7a\x89\x0b\xd8\x02\xf9\xde\xe6\xd2"
- "\x48\x20\xdf\x57\xbb\x34\x29\xa7\xe4\xfb\x3a\xe5\x2c\x95\xe8\x67"
- "\xbb\xcc\xc3\xfe\xce\x5b\x10\xdc\x93\xaf\x23\xff\x92\xce\x59\x63"
- "\xc3\xe6\x65\x18\x6f\xa3\x6f\x5a\x54\xa6\x61\x9d\x0b\xc4\xf9\x98"
- "\xaf\x5f\xc2\xab\x5e\xbe\x7a\xe4\x2b\x23\x18\xce\xb7\x94\x39\x2e"
- "\x56\x6d\x37\x51\xdf\xca\x03\x2c\x88\x78\x4b\x59\xe5\xd1\x66\x67"
- "\x69\x27\x88\x73\xa5\x2b\x47\xf3\x73\x6e\x88\x76\x48\x5f\x96\x70"
- "\xb4\x99\xd7\xb5\xbd\x32\x4f\xdd\x2e\xda\x0c\x92\x36\x71\xd2\xe4"
- "\xf4\xfb\xa7\x3c\x30\xf5\xc1\xa5\xcb\x5e\x2c\x5c\xfe\xd2\xf7\xcc"
- "\x2b\x5e\x7e\xa5\x68\xe5\xaa\xd5\x96\x57\x8b\xd7\x94\xac\x5d\xb7"
- "\xbe\x74\xc3\x46\x82\xeb\xeb\xc3\x9e\x2c\x8d\x57\x02\xac\xe7\x11"
- "\xaa\xe7\x6d\xde\x1e\x4c\x13\xf4\xaf\xdc\xaa\x35\x46\xf7\x6d\x9d"
- "\xe8\x6d\xd2\x39\xcb\x6e\xa9\xf2\x0b\x3a\xf3\x19\xf9\xac\x71\xd6"
- "\x3f\xe6\xa0\x73\xf8\x3b\xa4\xca\x53\xad\x9e\xc7\x1c\xf4\x1d\x88"
- "\x63\xc9\x9d\x90\x7a\x07\x9d\xd5\x5f\xe9\xa0\xfc\x86\xbb\x00\x9a"
- "\xb0\x6c\x34\x9c\x77\x18\x20\xf9\xad\x51\xcc\x53\x3b\x8a\xb9\x09"
- "\x7f\xed\x2e\xd6\xe9\xd9\x64\x86\x1d\xf8\x8c\xb2\x66\x38\x2b\x6d"
- "\x7b\xfb\x58\x0a\x3f\xcf\x3c\x65\xdf\x2e\xd6\xb1\x75\x14\xeb\xd8"
- "\xb2\x8b\xb9\x1b\x46\x31\x57\x6a\x2d\x24\x75\x57\x6d\xcb\x76\x49"
- "\x95\xfc\xac\xe8\x9d\x98\x1f\x4c\xac\xcc\xdc\x89\x79\x13\xfc\x10"
- "\xd7\x80\xcf\x98\xe6\x3d\x66\x14\xed\x7e\xff\x2b\x5f\x3c\xe2\x1b"
- "\xcb\x7a\x8b\x34\x3b\xb0\x1e\xc1\xa7\x6d\xbf\x6c\x42\x4d\xc2\xfa"
- "\x3c\x4e\x5f\x3b\xb8\xa4\x6d\x47\x1a\xbe\xe6\xf5\xe9\x9d\x75\x6e"
- "\x20\x7c\x3f\x2b\xf6\xc5\xaf\xb9\x85\xf9\x11\xb6\x2e\xb8\xa9\x48"
- "\x83\x30\x25\x88\xdb\xab\xee\x8f\xe9\xa5\x95\x25\xc6\x55\x6b\x8b"
- "\x8a\xee\x49\x04\x13\xbf\x86\x7d\x43\xa2\x04\xf1\xc1\x5b\xbb\x58"
- "\x13\xf6\xd3\x81\xfd\x6d\x6e\x41\x0f\x1a\x65\x06\xb0\x4f\x35\x67"
- "\xa5\xaa\x61\x98\x7e\x14\xef\x8f\x62\xdb\x9b\xc5\x77\x07\xf6\x3c"
- "\xc8\xaa\xb6\x35\x61\x3b\x9b\xe9\x9c\x5a\x3a\x7f\xaa\x6b\xfd\x02"
- "\x0d\xf6\xbb\x16\xe1\x9a\x8d\xb7\xc0\x18\x2c\xf7\x36\xb6\x63\x3f"
- "\xde\x13\x3c\xd7\x0d\x84\x6f\x12\xfd\xda\xc3\xcf\xb2\x47\x5a\x39"
- "\xf6\x8e\x62\xd5\xdd\x55\x55\x16\x3a\x9f\x8e\x9f\xdb\x8d\xcf\x48"
- "\x97\x66\x84\xad\xe9\xb2\x2e\xd0\x60\x3c\xa5\x69\x08\xe1\xcc\xa4"
- "\x36\x51\x3b\x28\xa6\xfb\x14\x3d\xa8\x60\x6f\x3e\x8c\xf3\x81\xe6"
- "\xd3\x0e\x80\xfa\x5d\xac\x11\x7f\xf5\xf8\xab\xfb\x2d\xe6\x7d\x82"
- "\xbf\x66\x4c\x3f\x81\xd7\xdf\xe2\xf5\x93\x0e\xfe\x0e\x2e\x99\xda"
- "\xbd\xa6\x8c\x75\x4e\xa8\x83\x3b\x09\x3f\xca\xd6\xb3\xed\xd2\xbb"
- "\x35\xd4\x76\x3a\x0b\x92\x25\xfe\x40\x1b\x7e\x66\x5e\x75\x29\x46"
- "\x62\x35\x78\xad\x16\x57\xf5\xaf\xfa\x14\xfe\xbc\xe2\x7e\x7b\x06"
- "\xde\x17\xca\xf7\x79\xf8\x5b\x74\xf5\x5f\x24\xbe\x58\xbf\xed\xcd"
- "\x03\x87\x1d\xc8\x6f\x8f\x76\x60\x70\x3b\x6d\x20\xbd\xd1\x06\xd2"
- "\x9b\x86\xf0\xf4\x37\x3a\x45\xda\xae\xc3\xe2\x79\x97\x43\xbe\xba"
- "\x41\x7a\x07\xe9\x54\x87\xf8\xeb\x4c\x22\xad\x2e\x1d\xaf\x65\xf8"
- "\xab\x0c\xaf\x7f\x0f\x96\xdf\x93\x42\xfc\xec\xa5\x6f\x20\x20\x2f"
- "\x5d\x52\xd5\x29\xe2\xd1\x4e\x21\x5b\x9a\x20\xe3\x69\x27\x51\xb6"
- "\xea\x43\xf2\x53\x7d\x3c\x5c\x7e\xaa\x0f\x45\xc8\x4f\x0d\xd9\x23"
- "\x2c\x97\xd2\x20\xe4\xe5\x68\xd7\xa6\x42\x7c\xae\x3e\x8c\x78\x8e"
- "\x1a\x17\x13\x8e\xed\x3c\x06\xdc\x79\x0e\x63\x3f\x33\x68\xc9\xbe"
- "\xb8\xa5\xed\xf1\x24\xb3\x54\xb7\x5c\xaf\x68\x0b\xb6\x0f\xd3\x1a"
- "\xa9\x7d\xab\x11\x2f\x3e\xef\x47\xb8\x46\x27\x7c\xa5\xb4\x8d\x97"
- "\xa9\x7a\x19\xe5\x51\x6e\x2f\xe1\xa4\x72\x2c\xd4\xaf\x93\x54\x46"
- "\xae\xfb\x97\x98\x4e\xb1\x22\x58\xff\x0e\x71\xb4\x5e\x99\x64\x92"
- "\xae\x4e\x7f\x1a\xea\x52\x36\x04\xbb\xf3\x01\xc3\xfd\x34\xd4\xb7"
- "\x84\x76\x69\x7b\xfd\xf8\x32\x48\x23\x7c\x64\xd7\x5d\xd2\xf6\x82"
- "\x06\xd2\x45\x81\xeb\xdf\x81\x9f\x7b\x55\x75\xf2\xb7\x16\xe0\xf5"
- "\xec\xa3\xf6\x60\xbe\xaa\xde\x5a\x8a\x05\x77\x6e\x14\x7d\xc5\xba"
- "\xf6\x63\xf9\x43\xd4\x77\xa2\x27\xe6\x1f\x41\x3c\x3e\xca\xe3\xe7"
- "\x69\x8b\xfe\xec\xa7\x33\x57\x89\x1e\x04\x4f\xdf\x35\x11\x67\xf0"
- "\x55\xdd\xca\xe9\x86\xe5\x89\x1f\x0c\xeb\x20\x1c\x56\x3f\xf3\x33"
- "\xb4\x47\x3f\xdc\xe8\xc3\xb1\x7d\xe7\xab\xe1\xfc\xd9\x91\xa7\xe6"
- "\x0f\x96\x3b\x84\xe5\x9b\x18\xf6\x91\xec\x09\xd6\xa9\xa7\x6f\x29"
- "\x60\x5a\x4d\xb0\x0a\x71\xac\xf3\xf1\xf9\x11\xc4\xb3\x14\xdb\x52"
- "\x43\x78\xb0\x3d\x4d\x32\xae\xfa\x5f\x97\x85\xf3\x5a\xc6\xb7\x9f"
- "\x78\xce\xf5\x79\x23\xef\x13\xda\xae\x9d\x13\xf7\x89\xbc\x23\x08"
- "\x73\x84\xf5\x66\x03\x9d\x61\x2a\xc6\x12\x9e\x77\xd8\x7a\x99\xf3"
- "\xb7\x49\xd8\xb5\x9d\x4f\xae\xd9\xcc\x3a\x43\xed\xde\xa9\x53\xce"
- "\x81\x95\xdb\x7d\x98\xea\x63\xeb\x17\xf1\xb1\x95\xea\xa0\xf2\x02"
- "\xdf\x8e\x0e\xc2\xa7\xd0\x6a\x3c\xb6\x43\xd0\x6b\x47\x32\xa6\xef"
- "\x27\x59\xe4\x74\x43\x3b\xda\x65\x25\x59\xdc\x99\x84\xe5\x8f\xee"
- "\xa0\xe7\xf5\xf4\xbc\xa3\x91\xdb\xd8\xbe\xfc\x1d\x0b\x28\xdf\x89"
- "\xb1\xf6\xce\x57\x50\x96\x82\x00\x77\x8e\x84\x34\xaf\x9d\xf7\xed"
- "\xa0\x77\x53\x96\xe6\x98\x1f\x80\xda\x89\x34\x3a\x82\x6d\x3d\x8c"
- "\x63\x8d\x97\xda\x8a\xf6\xfa\x30\xfb\x61\x3e\x50\x9b\xd1\x9e\xc9"
- "\xed\xab\x19\x23\xf3\xfe\x30\xf5\x91\xe8\x39\x5e\xd8\x3e\xcc\x7b"
- "\xe3\x13\x6a\x7b\xa8\xdf\x35\xa0\xa6\x31\xef\x37\xf2\x81\xf8\x45"
- "\x7c\x09\xe1\xdc\x49\xb2\x5f\x83\xb8\x0e\x8a\x67\x21\x1b\x44\xeb"
- "\x9a\x51\xec\x04\xc1\x87\x60\xdf\xe0\xdf\x47\x2c\xc7\xba\x27\x58"
- "\x80\x9f\xf1\x4b\x67\xf9\x22\xde\x83\xf4\xcd\x1a\xc4\x71\x84\x68"
- "\x8a\x70\xdb\x49\x1e\xf1\xf9\x84\xdc\xee\x6a\x1c\xcf\xc7\xe2\x2f"
- "\x23\xa4\xff\x6f\x6c\x0e\x97\xaf\x9a\x48\xfd\x27\x7e\xd7\x04\xad"
- "\xd9\xc0\xe5\xa1\x18\x8c\x17\xa4\x37\x6e\x96\xc7\x0e\x99\xd7\x6f"
- "\xac\x3c\x86\xfa\xa2\xc2\xe1\x8d\xe0\xf5\x11\x2e\x8f\xeb\x73\xe8"
- "\x9b\xbf\x1a\x2c\x7b\x44\xe0\xa9\xe1\x7d\xe6\xf2\x64\xe7\x32\x70"
- "\x82\xad\xc7\x7e\xf6\xc9\x41\x4d\x9e\xcc\xe7\x13\x11\x34\x51\x6c"
- "\x57\x3d\x7d\x73\x81\x6c\x12\xfa\x99\x0f\x77\xf7\x86\xec\x12\xf1"
- "\x3e\xc8\x79\x5f\xe3\x6b\x10\xe3\xad\x6c\xb7\x6a\x44\xfe\xa8\x30"
- "\x19\xa6\x3e\x8d\xe3\xf2\x4b\x6d\xb1\x2e\xa2\xb6\x1c\xe1\xed\xb0"
- "\x1a\x01\xf3\xf6\x53\xfd\x2e\xe9\x8d\x34\x59\x5f\x15\x5c\x5a\xc2"
- "\xb5\x05\x6d\x15\xb5\x09\xeb\xae\xe1\xf6\xef\x51\x6a\xdb\x9b\xf1"
- "\x72\xdb\x9b\x7d\x76\x2a\x5b\xed\xbb\x2c\xf1\xb2\xcd\x78\x5f\xe4"
- "\x13\xe7\x32\x27\x62\xf9\x03\xc6\x65\x04\xbf\xab\x90\x6c\xb4\xf1"
- "\x79\x7e\x3f\xd7\xf8\x0c\xca\xea\x39\xd0\x22\x3e\x1d\xc9\xa8\x22"
- "\x17\x6e\x69\xd7\x74\xf2\xd9\x91\xd6\x07\xd1\x47\x3a\x40\xf4\x26"
- "\x59\x46\x1f\x29\xbd\xbb\xea\xcd\x22\x45\x6e\xb1\x9e\x7a\xa2\xbd"
- "\xe0\xcf\x9b\xff\x8e\x72\x7c\x24\x24\x5b\x6f\xfe\xbb\x4c\xc7\x03"
- "\x48\x47\x1d\xd6\x37\x51\xee\xd7\x01\x84\x47\x5f\x6c\xd7\x68\xb9"
- "\xed\x75\x32\x7c\x8b\xc2\x07\x59\x57\x4f\xec\x20\xfb\xcb\x79\xf0"
- "\x56\xa1\x5c\x76\xbf\xa8\xeb\xad\xe5\x0a\x2c\xf9\x88\xe2\xbc\xf5"
- "\xb7\x96\x93\x1d\x9c\x80\xbc\xe7\xb6\x8f\x7f\xcf\x49\xa4\x91\xee"
- "\x88\x3a\x76\xf1\xef\x63\x6f\x41\xbf\x27\x24\x47\x6f\x65\x44\xd8"
- "\x27\xb2\xc5\x35\xad\x88\x83\xec\x29\xc9\x12\xd9\x54\x8a\x19\x10"
- "\xdf\x48\x59\x7f\xe4\x36\xbf\xf5\xe3\x70\x59\x79\xfb\x32\xca\xca"
- "\x38\x15\xee\xba\x68\xe3\x5c\x83\xb0\x81\xf5\x72\xdf\xfe\x2a\xf7"
- "\xed\xa0\xdc\xb7\xbf\xca\x7d\x3b\x80\x75\x20\xdd\xde\xfe\xa9\x8a"
- "\x8e\x48\xb7\xb7\x6f\x96\xe1\x8f\x90\x2d\x0f\xe9\x6b\xed\xd3\x8a"
- "\x2e\xf7\xb7\x17\x6f\x27\x90\x3e\x84\xda\x55\x9b\x16\x61\x2f\x8e"
- "\x44\xb7\x17\xb5\x20\xf7\xb7\x31\x42\x37\xf6\x8b\xb6\xcb\x63\x0b"
- "\xf2\xa1\xd5\xdb\x23\x9f\x2d\x5e\x75\x2b\xd9\x4f\xaa\x5b\x3d\x06"
- "\xed\x13\x74\x95\x75\xb9\xf6\x52\x7f\x3e\xd4\x36\xa9\xf5\x99\x78"
- "\x4d\x36\x81\x70\x10\x4f\xb9\x5f\x89\x69\x82\xaf\xb5\xf5\x64\x1b"
- "\xd4\x36\x1a\x61\x6b\x83\x8c\xf4\xa5\xb6\x39\x5c\x17\x6b\xd3\x65"
- "\x5d\x94\xeb\x7e\x7b\x37\xf2\x28\x2d\x54\xef\xdb\x19\x11\xf5\x12"
- "\x6f\x9a\x88\x0e\x32\x4f\x5f\x53\xc6\x34\x82\xc7\xb2\xa5\x58\xc6"
- "\x12\x31\x3e\xd6\x50\xfb\x5c\xd2\x5b\x9d\xdc\x66\xed\xe2\xb6\xa2"
- "\xb4\x9b\xb7\xe7\xed\x92\x06\x79\x9c\xc0\xb4\x34\x39\x2d\x53\x1e"
- "\x4b\x14\xb9\xf9\x32\xa2\x4d\x27\xa3\xfb\x47\x6f\x75\x2a\xfe\x11"
- "\xc7\xc5\x6d\xd1\xdb\xa7\xe4\xfe\x51\xda\x38\x91\xf6\x56\x3d\xa5"
- "\xed\x10\x74\xa8\x65\x7c\xbc\x7a\x2b\x53\x1e\xaf\x48\xbf\x24\x97"
- "\xf4\xe6\x21\xd2\x31\x7a\x76\x49\xbb\x4c\x84\xdf\x69\xeb\xa1\x18"
- "\x02\x63\xfa\x37\x73\xc8\x1e\x90\xbd\x30\xbe\x24\xec\x86\x71\x1e"
- "\xbf\xae\x25\xbb\x43\x7e\x08\xe5\x23\x5c\x06\xd9\x22\x4c\xdf\x66"
- "\x7c\x1c\xfd\x82\xbf\xe9\x10\xef\xae\x22\xb9\xec\x5e\xee\x2b\xfc"
- "\x2d\x3b\x4e\x49\x53\xca\xa1\xae\xcf\xa5\x72\x54\x5e\xb1\x5f\x64"
- "\xbb\xfc\x64\x9b\x44\x7d\x5f\xc8\x32\xce\xe3\x06\xc5\x2f\xea\x95"
- "\x54\xb0\x74\xbe\x33\xb7\x69\xef\x8c\x15\xf6\xec\x9d\x5b\xa9\x2c"
- "\xe7\x1f\xda\xca\xf2\xcb\xec\x8b\x86\x62\xd0\xee\xfb\x8a\xfb\x58"
- "\x29\xa2\x9d\xef\x94\x8a\x7e\xbc\x33\x93\xf7\x43\xd8\xd4\x1a\xd1"
- "\x96\xaa\x94\x7d\x3d\x3c\xef\x05\xea\x0b\xe5\xed\x54\xe5\xb1\x5e"
- "\x13\xe5\x6d\xe0\xed\x8a\x28\x17\xec\x35\xf7\x83\x6f\x10\xdf\xcd"
- "\xd2\xed\xdb\xa5\xd8\xde\x77\x7c\x72\x3b\x7f\xa1\xd8\x5d\xa4\x4b"
- "\x16\xd9\x5e\x9e\xf7\x92\x0c\x33\x4f\xbe\x72\xfb\xfe\xce\x97\x82"
- "\xae\xc9\x92\x4c\xef\x1c\xb9\x1f\x97\x79\x9c\xfd\xb7\x7c\xa4\xed"
- "\x3b\x67\x14\xda\xaa\xef\x49\x7f\xb0\x7e\x03\x3d\x73\xb9\x2f\xe3"
- "\x31\x6c\x3d\xc1\x50\x9b\xc4\x18\xb1\xeb\x54\xa4\x4f\x7d\x56\x7a"
- "\xf7\x55\x1a\x97\x84\xaf\xfa\xee\x93\xf2\x1c\x0c\x38\x8a\xff\x15"
- "\xc7\x85\xba\x7a\xc5\xc6\xb0\xee\x6c\x8c\xf9\xdb\x11\xa6\x8e\x7f"
- "\xe3\x96\xce\x04\x56\xc3\x90\x7d\x7a\xbf\xc7\x25\xe3\xac\x2b\x55"
- "\xec\x06\xd9\x92\x56\x6f\xbb\xec\xd3\xed\x36\xed\x93\x6d\xc9\x05"
- "\x69\xf7\x3d\xe1\x7e\xd8\xee\x7b\xc2\x6d\xc6\xbb\xd3\x23\x6d\x06"
- "\xfa\xcd\x5b\xbb\xab\xea\xfc\x61\x7e\x00\xa6\x5d\xd9\x76\xd4\x9d"
- "\x24\x1d\xa5\xef\x2c\x70\xfb\xc4\xe7\x95\x76\xbf\xa1\xb4\x99\xec"
- "\x66\xd7\x26\x65\xfe\xe2\xdd\x71\xe4\xab\x85\xd7\xb7\xbb\x28\xcc"
- "\x76\x52\x7d\x0a\x3e\x2d\xd0\x39\xfd\x48\x07\x9a\x73\xd9\x9d\x21"
- "\xdb\xf9\xc6\x30\x5b\x29\x8f\x61\x64\x27\xc3\xc7\xaa\xaa\x5b\xc3"
- "\xc7\xaa\x77\x6f\xee\x6f\x23\x77\x77\x0e\x7c\xac\xda\xed\x20\xbb"
- "\xa5\xd8\xc8\x70\x5b\xb0\xdb\xbd\x2f\xcc\x97\xdd\x5d\xa2\xf8\xb2"
- "\x21\x3b\xba\x5b\x4b\x36\x0a\xeb\x3f\x22\xea\x7e\xb7\x10\xc7\x7d"
- "\xb3\x52\xb7\x0b\xf9\xdc\x6a\x44\xd9\xac\xda\x76\x12\xef\xb3\x65"
- "\x1f\x90\xeb\x66\x0f\x3f\x2b\xfd\x9d\x1a\x94\xbf\x44\x92\x33\xc7"
- "\xaa\xaf\xa0\x23\x34\x56\x34\x75\xad\xee\xa3\xef\x25\xb5\x5f\xb8"
- "\x77\x17\xab\xc4\x7a\x4e\xa8\xfb\xb8\x1d\xd3\x76\xca\x73\x08\x9c"
- "\xb6\x1c\xd7\xbb\x8d\x0d\xbb\xc2\xfb\x26\xfa\xf1\xee\x29\xea\x07"
- "\xc5\x44\x58\x7f\x2d\xf9\x3d\xe8\xf3\xe1\xfd\x9b\xc9\x0d\x7d\x32"
- "\x5f\x5d\x74\xd9\xae\xf6\xaf\xaa\x4a\xc8\x56\xca\xb1\x67\x33\xfa"
- "\x3b\x35\xea\xb9\x98\xb9\xb3\xf2\x8c\x96\xe2\x15\xab\x4a\x5e\x9a"
- "\x64\x5c\xb1\x6a\x45\xc9\x8a\xa5\x45\x2b\x36\x2e\x2d\x59\xb1\x7a"
- "\xd5\xd8\x95\x4b\xbf\xb7\xe2\x45\xe3\xfa\xa5\x6b\x8c\x69\xa5\x63"
- "\x4a\x13\x21\x04\x3a\xcd\xb8\x74\xcd\x9a\xb5\x2b\x97\x17\x1a\x57"
- "\xad\x78\x71\x5c\xf1\xf2\x35\xcb\x4b\x8c\x4b\x8b\x57\xaf\x5d\x55"
- "\x68\x1c\x53\x38\x7e\x4c\xda\x94\xc2\x44\xf5\x1c\xda\x1d\x06\x70"
- "\x07\xbf\xfe\x6b\xe7\xce\xaf\x41\xa7\xd7\x58\x8a\xf5\xa5\x2b\x56"
- "\x89\x79\xbb\xfa\xe9\x13\x6a\xc1\x42\xdf\x52\xa4\x6f\x86\xb1\xaa"
- "\x3d\x79\x78\xd5\x12\x1c\xf6\xd3\x48\xdf\x52\xc4\xb6\xa7\x74\x57"
- "\xd5\xa3\xee\x37\xf0\xef\x91\x21\x2d\x8c\xd8\xb7\x14\xf6\xf5\x27"
- "\x9d\xe8\xb3\x59\x68\x5d\x70\xc3\xd7\x30\xb2\x66\x1d\x68\xf1\x97"
- "\x84\x3f\x03\x7d\x6b\x11\xcb\xa4\xbb\xa4\xbd\x79\xe2\xbc\xe5\xfa"
- "\x53\x9e\x84\xff\x38\xc0\x2a\xff\xe3\x80\xe0\x4b\xfd\xef\x94\xb9"
- "\xde\xdc\xd7\x20\x97\xe4\xb3\x5d\xaa\xe7\x73\xcd\x5b\x50\x96\x69"
- "\xce\xb4\xeb\x57\x8f\x64\xa2\x3f\x78\xc6\x71\x0b\xcf\xfb\x9d\x57"
- "\x82\x24\x6c\x97\xf6\x58\x59\x1a\xbc\x85\x75\xad\x49\x66\x0c\xeb"
- "\xa8\x53\xe6\xd3\xb0\x0f\x06\xec\x4b\x9b\xdc\x8f\x4d\xbc\x1f\xbb"
- "\x58\x6a\xed\x08\x6c\xdf\x9b\xbc\x3d\x4d\x4a\x1f\xb0\xdd\x6d\xd8"
- "\x26\xfa\x1e\x9a\x81\xda\x15\x6d\xae\x8f\xe6\xbb\xce\x4a\x7b\x87"
- "\x05\xd7\x21\xdd\x6e\x13\xdf\x89\xd8\xb9\x4f\xe8\x1f\xf6\x2b\xab"
- "\x01\xef\x77\x7c\x05\x49\xdb\xe9\x3b\x7e\xf6\xdb\x59\x8b\xd7\x0f"
- "\x4e\x73\x1b\xe8\x37\x30\x0f\xfb\x7f\xff\xda\x29\xfa\xb4\x77\x2a"
- "\xd9\x86\xff\xf1\x72\x9b\x96\xfa\x84\x63\x45\x52\xc3\x57\x31\xe7"
- "\x16\xb5\x6f\x8d\x62\x5e\xb6\x47\xed\x73\xed\x7d\x8f\x68\x42\xfe"
- "\x56\x97\x9d\xbe\x0b\xb7\xb7\x12\xdb\xed\x92\x7d\x63\x2f\xeb\x5d"
- "\xa4\xf2\xa5\xf6\x92\x9c\x79\x63\xe0\xd6\x29\xb8\xe9\xfb\x80\x54"
- "\x46\xf0\x7f\xdf\x30\x2c\xe3\x51\xe1\xef\x8c\xc4\x4f\x38\xf1\xde"
- "\xa3\xd4\x23\xe2\xf0\xbd\xe4\x13\x78\x50\x96\x3d\x31\xea\x4b\x7d"
- "\x73\x17\x3b\xe5\xc4\xf4\x9d\x97\x81\xe2\x8b\x53\x0d\xbb\x08\xff"
- "\xbe\x6c\x97\xb4\xe7\x20\xe1\xdf\x32\x0a\x60\x2b\xc2\x74\x55\xd5"
- "\xbb\xbc\xfc\x5b\x7d\xfb\x50\xff\xb7\xb5\x45\xce\x65\xcb\xf2\x3c"
- "\x2d\x42\x9e\x33\xdf\x24\x9f\xb0\x16\xf1\xa3\x0c\xed\xbc\x84\xe3"
- "\x30\x3e\x8f\xaf\x05\x13\xd5\x83\xf7\x14\x93\x35\x23\xce\x23\x4a"
- "\x7d\x0c\xe5\x7f\x47\x50\xcc\xc1\xc8\xb2\x35\x96\xe6\xaf\xad\xa5"
- "\x8c\x1d\x43\xfb\x4e\x6d\x24\x19\xc3\x32\x6e\x45\xa6\x50\xd6\x4f"
- "\x71\xb9\x1a\x09\x26\x56\xb5\xcf\xd2\x30\x02\xe1\x50\xae\xf6\xa1"
- "\x3c\x91\x5c\x75\x57\x35\x24\x2b\x32\x85\xb2\x76\x92\xe0\xb0\x0d"
- "\x89\x87\x36\x66\x6a\xc9\x46\x76\x48\x0d\xdb\x49\xc6\xd8\x3b\x4f"
- "\xb4\xb1\x9b\x16\xb6\x09\x3e\x35\x6c\x77\xfa\x04\x0f\x42\x74\x6f"
- "\x28\x50\xd1\xfd\x24\xca\x71\x22\xd1\x59\xcc\x55\x37\x6c\xc7\xb6"
- "\x9d\xe4\xbe\xf8\x66\xe4\x01\x1f\xab\x1a\x72\xa8\xbc\x4c\xc3\x13"
- "\x21\x1a\x36\x1c\x88\x46\xc3\x08\xda\x69\xc5\xb7\x02\x1b\x0e\x93"
- "\xae\x60\x99\xbe\xef\xff\x45\xe3\x25\xd6\xa1\xd5\xd6\x82\x8e\xea"
- "\x68\x1a\x49\xf0\x8d\x49\x4a\x1d\x3b\x91\xd6\x1e\xab\xf9\x8a\xf2"
- "\xdc\xd4\x08\x40\x73\xe2\x54\x3e\x75\x24\xd1\xb7\x31\x27\x54\x9e"
- "\x79\x23\xcb\x8f\x79\x31\xac\xad\xfc\xc7\xaa\x1a\x0b\xde\x12\xdf"
- "\x76\xa5\xfa\xab\xaf\xd4\xde\x54\xa3\x18\x27\x1d\x77\x90\x7c\x37"
- "\x1e\x77\xd6\x01\x50\x9a\xfc\x7c\xb8\x0b\xc7\x9e\xc8\xf9\xfd\xd8"
- "\xef\x1b\xde\x8b\x0f\x7f\xdf\xd0\xe8\x8d\xf5\xbe\x21\xbc\xde\xf7"
- "\x66\x52\xbd\xc1\x86\x05\x9a\x50\xdd\xef\x8d\x0d\x46\xa9\x5b\x29"
- "\x3f\xbe\x51\x1d\xcf\xbc\xf7\x06\xb5\xa1\x95\xbe\x51\xfe\x2f\x0b"
- "\x34\x0c\xf1\x34\xf1\x31\xfc\xbd\x1a\xe1\xbf\x90\x5f\xf4\x9e\x85"
- "\x60\x22\xfb\xd1\xf7\xa7\x1b\xf9\x6b\xba\x5c\xe6\x0f\xf1\x8f\x02"
- "\x9d\x3c\x03\xb7\x9b\x94\x6c\x29\x0c\x18\x58\x94\x87\x24\x00\x23"
- "\x87\x67\xf8\x27\x92\xe4\x67\x0f\x7f\xd0\xf6\xc1\xf7\xe5\xff\x03"
- "\x7f\x09\xa2\xbd\x1c\x9f\x0f\x34\x72\x7d\xd9\x2a\x88\xac\x2b\x94"
- "\x66\xa0\x14\x89\xf6\x47\xb3\x8f\xb6\x05\xc8\x4b\xa3\x99\x03\x33"
- "\xe6\x97\xf1\x2b\xcf\x4c\xfd\x4c\x29\xe1\xcf\xf8\x17\xb7\x48\x55"
- "\xc1\xed\x71\x85\x7c\xf9\xd1\x9d\x8d\x7d\x49\x52\xa3\x41\x5d\xa5"
- "\x01\x6c\xf1\xfc\x46\x4f\xff\xf8\x10\x9f\x09\xf3\x8d\x95\x7d\x00"
- "\x37\x78\x2b\x54\xe0\x9f\x8a\xe6\x8f\x6e\xbb\x42\x1f\x07\xfb\x77"
- "\x9b\xea\xfe\x76\x71\x19\x5d\xf7\x0d\xe2\xbf\xf2\x9f\xf1\x64\x82"
- "\x72\x1b\x12\x8f\x3b\x8c\xd1\x40\x43\xf4\xbf\xc3\xa6\x24\xa9\x25"
- "\x34\x94\x3f\xc6\x1f\xfe\x7c\xf7\x91\xf0\xe7\x7b\x75\xdf\x40\xcb"
- "\xc1\x41\xff\x58\x5d\xd7\x23\xcf\x4e\xf5\x25\xea\x23\x54\x46\x5f"
- "\x13\xa1\x42\xa1\x3f\xb9\x35\x71\xd8\x9e\x45\xaa\x64\x6d\x74\xe8"
- "\xff\x9a\xbf\x5b\x2a\x64\x85\xb8\xdd\x63\xe8\x97\x39\x23\x22\x8d"
- "\x9e\x87\x18\xe5\xb4\x89\xbf\xee\x07\xcf\xd3\x8c\xaa\x67\x4d\x26"
- "\xfe\xd3\x88\x96\x75\xec\x37\xd1\xd6\xef\xfe\xfe\x2f\xfc\xd3\x90"
- "\x7e\x7c\xf7\xf7\x5f\xf4\xc7\xc4\x28\x8e\x96\x88\x5f\xe8\x3f\xd6"
- "\x67\x28\x99\x9c\xc1\xe4\x04\x26\xdf\x7c\x23\xe3\xf8\x77\x7f\xdf"
- "\xfd\x7d\xf7\xf7\xdd\xdf\x77\x7f\xdf\xfd\x7d\xf7\xf7\x2d\xf8\xd3"
- "\xf0\x38\x82\xc9\x7f\xca\xbd\xc8\xa3\x10\xe8\x7b\x79\x3c\x4d\xd2"
- "\x40\x08\x02\xc3\xed\xfb\x41\xa3\x83\x21\xda\x6f\xce\xcb\x33\xf6"
- "\x35\x68\x80\x05\x68\x9d\x03\xad\x09\x98\x8c\xbf\x7f\x51\xa5\xdf"
- "\xf1\x4d\xb5\xe8\x1f\xfe\xd3\x20\x01\xe3\x30\x2e\x8c\x87\x21\x30"
- "\x14\x74\x90\x00\x89\x70\x1d\x24\xc1\x30\x18\x8e\xf1\xa6\x01\xae"
- "\x87\x11\x70\x03\x8c\x84\x1b\x61\x14\xdc\x04\xc9\x70\x33\xdc\x82"
- "\x3d\x49\x81\x5b\x31\xb6\xbf\x1d\x09\x32\x3a\x7a\x5f\x6c\x90\x99"
- "\x8c\xff\xe0\xff\x79\x90\xc9\x9f\x0b\xbe\x4b\xff\xdf\x9a\xee\x90"
- "\xd3\x4f\xca\xe9\xae\xef\xd2\xff\xb7\xa6\x1b\xff\x0f\x5f\x47\xff"
- "\x1f\xbd\x6a\xd0\x64\x0b\xab\xad\x89\x6a\x2b\x23\x53\x35\xf2\x5f"
- "\xdf\x33\x5c\xa5\x7c\x3f\x7c\xe1\xe5\x23\xff\x32\xf1\x97\x2e\x6e"
- "\xad\x00\x62\x9e\x97\xa9\xff\xfc\xb1\x4a\x2a\x7f\xe5\x47\xf1\xd7"
- "\x8c\xbf\x53\xf8\xfb\x3d\xfe\xfe\x8c\xbf\xf3\x0a\x1e\x01\x43\x53"
- "\x7f\x7f\xc3\xdf\xff\x3a\x00\x70\xc6\x85\xbf\x2c\x80\xcf\xca\x00"
- "\xfe\x64\x00\xf8\x02\xc7\xa8\xcf\x0f\x01\xb4\x7b\x42\x38\x2f\x6e"
- "\x0d\xb5\xee\xbc\x58\xd9\xcd\xf9\xf7\x55\x12\xdd\xb9\x20\xa0\xc0"
- "\x1e\x99\xbd\x20\xdb\x38\x71\x7c\xfa\xf8\xfb\xd3\x8c\xe3\xc6\x19"
- "\x27\xa5\x4d\x4c\x9b\x90\x96\x3e\x61\xe2\x14\xe3\xc4\xc9\xd3\x26"
- "\xa7\x4d\x4b\x7b\xc0\xb8\x72\x43\xf1\x8a\x89\x69\xdf\x5b\x6e\x7c"
- "\x69\x45\xf1\xca\xf5\x4b\x8b\x97\x5f\xad\x43\xd7\xf6\x47\xcd\xbb"
- "\x35\x08\x9c\x03\xe1\xd4\xbe\x1d\xa4\x1f\xbb\x40\xfa\x8f\x43\x10"
- "\xca\x31\xc9\xbf\xf0\x3f\x8d\x39\x15\x34\xcb\x4d\xa0\x29\xa8\x05"
- "\xcd\xf3\x8d\xa0\x99\x9f\x03\x9a\xef\x63\xda\x16\x03\x68\xca\x0b"
- "\x41\x53\x9a\x0f\x1a\x8b\xbb\x7f\xda\x4e\x10\x69\x3f\xb1\x81\xe6"
- "\x47\x87\x41\xd3\x50\x0d\x9a\x77\x3a\x44\xda\x2f\x10\xe6\xd0\xd6"
- "\xff\x9a\x4e\x5f\xf3\xdf\x40\xfd\x84\x7e\x7f\x2e\x2e\x4b\x34\x3a"
- "\x7f\x3e\x36\xca\x64\xe8\x77\x7f\xdf\xfd\x7d\xf7\xf7\xdd\xdf\x77"
- "\x7f\xdf\xfd\x7d\xf7\xf7\xdf\xfc\xcf\xa3\x81\xf4\xaf\x24\x2d\xfc"
- "\xa6\x06\xa0\xdb\xae\x4b\x71\x69\x52\x4e\xd0\xda\x11\xa0\x3d\x52"
- "\xa0\xe3\xeb\xfb\xe8\xa7\x5a\x73\x92\x34\x6b\x2f\x00\xed\xf1\x7c"
- "\x6b\x17\xf3\xd0\xfe\xcd\xac\x1f\x01\x34\xa5\x02\xd0\x7a\x16\xc4"
- "\xb1\xc8\x05\xaf\x26\x89\x35\x4c\xcc\x4b\xf9\xb4\x0e\x0a\xd3\x4b"
- "\x30\x7d\x6b\xac\x75\x29\xca\x1a\x2c\xc2\x99\x35\x9a\xb7\x65\x7f"
- "\x04\x1e\xc2\x71\x04\xd3\xfc\x57\xc0\x91\xa4\xb4\xcb\x2b\x81\x86"
- "\xf0\x75\xd9\x21\xd9\x6b\x77\xdc\x88\x65\xbd\xd8\x1f\x93\xbc\x86"
- "\xc8\xcd\xec\x10\xd7\x54\xea\xa7\xbd\xa4\x9a\xb3\x90\xf8\x1e\x5e"
- "\x25\xbc\xf2\xfd\xb3\x5b\x44\xb9\x54\xc2\x81\x65\x35\xdd\xf6\x84"
- "\xb4\xbe\xb2\x88\x9b\xef\xc7\x86\xc4\x15\x5e\xc9\x21\x09\x58\x43"
- "\x82\x0c\x2b\x21\xec\x22\x05\x56\xe4\x49\x73\xe4\xbc\xeb\x30\xaf"
- "\x34\x3c\x4f\xfb\xa6\x9c\x97\x84\x79\xb5\x11\xed\xd3\x3a\x7b\xfc"
- "\x70\x16\x12\x0e\x62\x5b\x8c\xb4\x77\x89\xca\xc8\xf0\xd7\x23\x7c"
- "\x53\x38\x2e\x00\x39\x6f\x04\xe6\xb9\xc2\xf3\x7e\x95\x26\xe7\xdd"
- "\x84\x79\xfe\xf0\x3c\x8d\x52\x2e\xb9\xdb\x9e\x98\x1c\xa5\x9f\x54"
- "\xbf\x46\xd4\x4d\x7d\x48\xcc\x40\x18\x1b\xc1\x2c\x30\xda\x80\x78"
- "\x45\x79\xc7\x1a\xfb\xea\x27\x98\x02\x05\x8f\x0b\xcb\xab\x68\x8a"
- "\xb4\x4c\x2c\x53\xca\x67\x19\x09\x07\x70\x1a\x12\x1e\x17\x24\x64"
- "\x13\x1e\x7a\xc6\xfb\x14\xea\xb7\x7c\x6f\xa4\xfe\x85\xaf\xe5\xd1"
- "\x22\xda\x78\x74\x44\x87\xe0\x6f\xa8\x4e\x91\x81\x35\xc9\x2c\x68"
- "\xbd\x99\xd6\x6f\x1d\x37\x05\xed\x0c\x9c\xa5\x3e\x30\xde\x02\xd6"
- "\x76\xb8\x2e\x99\xd6\x03\xed\xd8\x08\x3a\xab\x85\xf9\x68\xcf\x7b"
- "\xab\xc7\x0d\x56\x0f\xeb\xa4\x33\x8e\xca\x2f\x81\x8e\xbe\x19\x59"
- "\xfe\x2a\x24\x37\x95\x7d\x19\x75\x0d\x52\x50\x62\x60\x4d\xa1\xb2"
- "\x1d\xd0\x5a\xdf\x01\xd6\xfa\xf0\xb2\xd6\x5b\x21\xb9\x85\xce\x4b"
- "\xb2\x83\x9e\xda\xd1\x64\xf4\x83\x3f\xf1\xb8\xa9\x6c\x37\x68\xad"
- "\xa3\x41\x6a\x29\x74\x28\x6d\xe1\xeb\xd1\xb6\x9e\x03\xdd\x0f\x5f"
- "\x42\x19\x3a\x47\xed\x6d\x31\xbd\xbf\xd1\x27\x1d\x4b\xce\x81\x63"
- "\xc9\x67\xa0\x29\x79\x3a\x34\x95\x66\xc1\x8e\x73\x90\x74\xcc\x97"
- "\x01\x4d\xda\x47\x51\xc7\xb2\xc0\xe9\xc6\x7b\x63\x00\x61\xbc\x7c"
- "\xbf\xc7\x59\xb8\xee\x64\xed\xcb\xa0\x73\x09\x9c\x48\xdf\xeb\xce"
- "\x28\x7b\x17\xe8\x39\x5a\x3f\xd6\xdc\x0c\xc9\xd8\xbe\x4e\x6c\xcb"
- "\x83\xed\x90\x74\x63\x6a\x32\xa4\x61\x9b\x87\x3a\xeb\xfc\xa0\x2d"
- "\x83\x84\x18\xba\x35\x92\xef\x7b\x46\xd9\xdc\xb7\x8b\x75\x92\x8c"
- "\x76\x6d\xca\x47\x3d\x4d\xca\xc1\xba\xdd\xf2\x7a\x40\xb7\xf5\x3d"
- "\xd0\x76\xad\xcf\xa7\x75\xd0\x1d\x98\x67\x56\xf2\x68\x3f\x37\xed"
- "\xd3\x9e\x30\x92\xbe\x19\x94\x09\x1f\xf6\x74\xd2\x5a\x43\x37\xad"
- "\xff\x24\x7c\xfa\x52\x88\xc3\xfe\xc4\x63\x7b\x1e\x6c\xc0\xf4\x3b"
- "\x11\x0e\xcb\x1f\x70\xc1\xe1\x34\xbe\x3e\xf1\xa6\x85\xde\xe0\x4d"
- "\x0b\x2f\x05\xdf\x59\xd8\xc5\xde\x59\xf8\x55\xe0\x9d\x85\x7f\xb7"
- "\x6e\x00\x5d\xe0\xa6\x85\x9e\x56\x0b\xe7\x81\xa1\xd5\x72\x9e\xd6"
- "\x0d\xea\xe8\x0c\xf5\xc5\xaf\x22\xef\xfd\x9f\xc1\xe6\x15\x90\x1c"
- "\x4c\xf8\xd4\xe5\xf4\x9f\x86\xc5\x65\xc0\xf0\x3e\xea\x9a\xcc\xae"
- "\xc4\x16\xb3\xd0\x21\x1d\xf6\x69\x98\xd1\x25\x35\x19\xa9\x5e\x4f"
- "\xc2\x69\x33\xfe\x8a\xf0\x67\xc1\x5f\x09\x4b\x6c\x29\x41\x5a\x59"
- "\x87\x57\x68\x80\xf6\x2b\x4c\x08\x82\xe6\x1c\x0c\xcb\xc0\xf6\x1b"
- "\x62\xd0\x2d\x25\x58\xf5\xe7\x9a\xbb\x6d\x50\xde\xdd\x6d\xa6\x7d"
- "\xe3\x1e\xb2\x4b\x64\xa7\xb0\x9e\x4a\xac\xa7\x80\xeb\xe2\x2e\xe6"
- "\x65\x89\x7f\xae\xc1\xf4\x4e\xef\x26\xb3\xc6\xb3\xc9\x2c\x75\x25"
- "\xfe\xf9\x2d\x84\x39\x88\x30\x75\x32\x0d\x3b\x09\x17\xea\x84\x67"
- "\x98\x1f\xe2\x10\xa7\xe5\x7f\x7e\xdd\xa6\xdd\xbb\x8b\x9d\x41\xb8"
- "\x53\x7d\xb8\x10\x37\xe2\x41\xfa\x0f\xeb\x54\xd2\x90\xd6\x1d\xdb"
- "\x11\x8e\xca\x3b\x7d\x99\x64\xbf\x5d\xce\xa2\x4e\x5a\xaf\x9b\xc8"
- "\x7a\x45\x7d\x08\x43\x7b\x39\x3d\xc3\x7c\x30\xa4\xdb\x0e\x79\x84"
- "\x9b\xca\xd1\xd9\x5d\x58\xee\x2d\x66\x35\xa3\x7d\x83\x79\xdd\xcc"
- "\xac\xa1\xbd\xfb\xc7\xb0\xbc\xa8\x7b\x78\x9e\xd2\x46\xaa\x83\xef"
- "\xdd\xa7\x76\xa2\x3c\x1c\x2b\xf2\xc1\xb0\x3a\x88\xc3\x72\xf3\x09"
- "\x1f\xe1\x42\x39\x70\x61\x5f\xdf\x3a\x56\xe4\x81\x20\x0b\xc3\xe9"
- "\x92\xf1\x35\x86\xe1\xc3\x74\x86\xf8\x48\xfe\x9a\xb0\xcc\xb0\x46"
- "\x8e\xef\xa9\xff\x19\x24\x7c\x3e\xd0\x1a\x79\x7b\x9f\x21\x1c\xfc"
- "\x2c\x0a\xc4\xe9\x58\xf7\x08\xb8\x41\xaf\xf3\x58\xcd\x71\x7c\x9d"
- "\x20\x96\x7f\xbf\xbc\x33\x9e\x75\xe5\xc7\x0d\xe7\x6b\x04\x1f\x01"
- "\x3a\xaf\xc1\x0d\xc3\xff\xca\xba\xcc\x71\xc3\xdc\xa0\xa5\x36\xd3"
- "\xbe\x21\x6a\xa7\x9a\x97\x4f\xcd\x7e\x66\x3a\x3c\x93\x35\x27\x6b"
- "\x3a\xcc\x9d\x39\x6b\x3a\xa4\x3d\x38\x2e\x6d\xf2\x03\x53\x27\x43"
- "\xde\xb3\x4f\x4d\x87\xbc\x79\xd3\x61\x3e\xfe\xf2\xe6\xcf\x7e\x2a"
- "\x6b\xf6\xfc\xe9\x90\xff\xe8\x1c\x7c\x9a\x35\x7d\x62\xda\x63\xe3"
- "\xf2\x66\xcd\x99\x0d\x4f\x2e\x98\x94\x36\x69\x12\xcc\x9c\x9d\x33"
- "\x31\x2d\x4d\xbe\x4e\x4c\x23\x90\xe7\xa7\xce\x9e\x3f\x2e\xaf\x78"
- "\x75\xc9\xea\x71\xf3\xe6\xcc\xa2\x14\x98\x3d\x7b\x3a\xbd\x30\x50"
- "\xc9\x8f\x29\xf0\x75\x80\xe8\xec\x65\x17\xb3\xe9\x9c\x06\xd8\x87"
- "\xfc\xc7\x9f\x9b\xef\xff\x00\xc3\x1f\xf6\x11\xdf\xb8\x7d\xd5\xd3"
- "\x98\xa5\xed\xb6\xeb\x5d\x48\x3f\xbe\x86\x94\xce\x4a\x38\x0b\xa3"
- "\x7e\x84\x79\xf7\xc8\xe3\x47\x7c\xb7\xdd\x00\xe1\xf9\x23\xd0\xbe"
- "\xea\x27\xd0\x7e\x02\x27\xfe\x90\xe6\x5e\xb4\x83\x48\x5b\x0f\x74"
- "\x59\xf3\xe3\xf9\x7e\x4e\xe4\x37\xad\xb3\xc5\xb2\x19\x2a\x7d\xef"
- "\xa0\xf5\xb8\xc6\x8d\x10\x77\x01\x0c\x37\xb6\x96\x64\xd2\x9e\x1b"
- "\x70\x96\xc8\x38\x2e\xf5\xe1\x48\x94\xf7\x84\xba\xf6\xd1\x5a\x67"
- "\x81\x67\xab\xca\x36\xb8\x08\xcf\x0e\xcc\x93\x71\x3d\xd7\x8a\x36"
- "\x02\x6d\xf8\xa4\xa0\xd5\x04\x2c\xf1\x78\x5a\xb0\xd7\xc4\xc7\x05"
- "\x2c\x77\x54\x91\x69\xac\xdf\xdb\x84\x75\xb2\x1f\x66\x6b\x68\xdd"
- "\x29\x5f\x83\x0a\xfa\xe6\x5a\x5a\x9b\x9d\x78\xba\x94\xef\xb5\xe6"
- "\x69\xd7\xeb\x02\x55\xf8\x5c\x75\x7a\x03\xb3\x8a\x3d\xd4\x98\x96"
- "\x80\xcf\xa5\xc8\xef\x38\x94\x17\x08\x5c\xc4\xf4\x55\x10\x87\xe9"
- "\x9f\x20\xad\xdb\x38\xfc\x45\x5e\x7e\x28\xa6\xfd\x18\xf1\x6d\x08"
- "\x26\x9e\xde\x88\xf2\x43\x69\xe8\x2b\x5c\xbf\x1d\xcb\x6f\x22\x9b"
- "\x27\xec\xf0\x28\xbe\xc7\x9e\xd6\x82\x0b\xfc\xf2\x33\x9d\x4d\x51"
- "\x2e\x9e\x8f\x21\x5d\x8e\xe1\xc8\xd5\x54\x46\xfe\xcd\xf5\xd8\xff"
- "\x61\xf9\x62\x8c\x1c\xd5\x44\xb0\xb4\x17\x9e\x25\xdd\x51\x83\x78"
- "\xcb\x1c\x1b\xdd\xfc\x4c\x73\x17\x5c\x9f\x19\xb4\x9a\x41\xd5\x97"
- "\xb1\xd4\x0e\x6c\xb7\xb6\xbb\xd7\x8c\x63\xe6\xf5\x7c\xbf\x2a\xa6"
- "\x6d\x90\xdb\x46\x30\x29\xd4\x7e\xb2\x13\xc8\xd7\x74\xe4\x79\x02"
- "\xd6\xe7\x8d\xe0\xb9\x81\xe8\x81\xed\x6d\x0b\xe2\x15\xf1\x24\xb3"
- "\xf5\x66\x6c\x17\x48\x44\x0f\x57\x08\x87\x57\xc8\xd4\x88\xf4\x08"
- "\x99\xda\x86\xb8\xa7\xab\xf2\x17\x44\xe4\xaf\xc4\xfc\x47\xe4\x7c"
- "\xd4\xd7\x11\x25\x11\xf5\xd7\x60\xfe\xa3\xc4\x43\xd4\xc7\x38\x17"
- "\x18\x0e\xee\x23\x7f\x32\x04\xbf\x3f\x02\xde\x81\xf0\x8f\xd3\xba"
- "\x7b\x1a\x2b\x08\xbe\x41\x96\x7b\x84\xd7\x21\xfc\xa9\x88\xfa\xe7"
- "\x22\xfc\x7c\x55\xfb\x22\xfa\x7f\xc3\x51\xcc\xcf\x27\x39\xc5\x6b"
- "\x21\xc2\x0c\x25\x1b\x40\xf6\xe7\x58\x11\xf1\xe7\x86\xd4\x08\xf8"
- "\x2c\x84\x7b\x85\xe8\xcc\x69\xd4\x45\x34\x32\x28\xbe\xcd\x19\xd1"
- "\x86\x1b\xf2\x23\xca\x94\x62\x99\x35\x44\x5f\x2e\x67\xdd\x51\xcb"
- "\x54\x47\x94\x39\xc8\xe5\x54\xd4\x23\xf3\x58\x94\x91\x6d\x9b\x1a"
- "\x07\xf5\x0d\xfd\xad\x1b\x4e\x86\xe3\xb8\x11\x7d\x36\xfd\xa6\xed"
- "\xc2\x66\x5c\x87\x32\x31\x09\xd3\xf6\x22\xce\xcd\x24\x47\xa8\x67"
- "\x5e\xa7\xc7\x87\xb6\x37\x3b\x49\xc8\xee\xc8\x89\xfa\x32\xa0\xfb"
- "\x71\x74\x4f\xb8\x59\x6f\x8e\xac\x4f\x23\x27\xe2\x95\xd2\xc5\xf9"
- "\x84\xa5\x94\xf7\x44\x50\xe0\x1c\xf9\x34\xea\xbb\x84\xcf\x01\xb9"
- "\x8e\xb7\x69\xdf\x32\xb6\x7f\x23\xda\x75\xa0\xbd\xd7\x98\x9e\x8e"
- "\xe9\xdb\xe5\xfc\xd7\x08\x1e\xef\x27\xca\xf7\x1a\x94\xb1\x8d\xb2"
- "\x9e\xa1\x4e\xdd\xc8\xf7\xa9\x93\x5e\x29\xe5\x83\x42\xee\x67\x61"
- "\xde\x0a\xbc\xce\xc1\xeb\xd3\x78\x7d\x12\xaf\x13\xe9\xac\x09\x6b"
- "\x80\xeb\x17\x3d\xdf\x8a\xd7\xa7\xf0\x9a\x80\xd7\xf9\xd8\xb6\x4b"
- "\x48\xf7\x52\x0f\xca\x74\x84\xcc\xb8\x91\x87\xa4\xf7\x43\x05\x0f"
- "\x47\x76\x50\x9d\x01\xc5\x16\x5c\x0c\xa5\xc9\xf6\x41\xd6\x07\x39"
- "\xad\x37\x9b\xe8\x92\x87\xf8\x1d\x54\x3f\x13\xb8\xe2\x05\x9f\x04"
- "\x4c\x50\x94\xd3\x0a\x7e\xcb\x69\x02\x4e\xa3\xae\x13\xaf\xb5\xe5"
- "\x5e\xc6\xf0\x6a\xe3\xe7\x54\xc0\x8d\x5b\x91\x26\x5a\x7c\x5e\x40"
- "\x74\xe2\xf0\x1c\xef\x0d\x1e\x15\xbf\xd1\xbf\xbf\xd1\x11\xc1\x6f"
- "\x92\xe1\xed\x9c\xdf\x48\x3b\xa5\xcd\xd4\x7e\x94\x69\x1a\x2b\x87"
- "\x28\x72\x83\xf2\xed\x0e\xe9\xd8\x28\x5d\x84\xce\xa4\x22\x9e\x37"
- "\x48\x3e\x86\x5b\x64\x9d\x1c\xd5\x07\x8f\xe3\xc6\xa8\xa9\xe1\xf0"
- "\x06\x92\x55\x37\xb6\xef\xa0\x6c\xeb\xbc\x71\x65\x24\xd3\xa3\xd0"
- "\xff\x6f\xe9\xe0\x7e\x5b\xd5\xe9\x72\xc2\xe3\xb5\xf2\x73\x80\xbc"
- "\x71\x16\xd2\xc5\x51\x36\x25\x9f\xe7\x25\x74\x18\xa8\xed\x71\x45"
- "\x3c\xaf\xde\x85\xa2\xa8\xe4\x81\xd8\x5f\xe6\x8d\x2b\xe1\x79\x47"
- "\x42\x78\x8f\xe7\xc9\x78\xe3\xa2\x9e\xed\x54\x79\x3c\x73\x1c\x80"
- "\x74\xaf\x0d\xe2\x9d\xfe\x53\x90\xeb\x67\x81\x71\x36\x48\x70\xfa"
- "\x0f\xc2\x3d\x00\xd7\x3b\xfd\x67\xe0\x5e\x80\xd1\x4e\x7f\x2d\xfa"
- "\x01\xfb\x29\xff\xc3\xbb\x41\xa3\xc1\xab\xf5\x2e\x9b\xa4\x71\xfa"
- "\x4b\x20\xd5\xa6\xc5\x6b\x11\x3c\x1a\xcf\xba\x9d\xfe\x1c\x84\x2b"
- "\x84\xdc\x00\xbb\x98\x15\xcf\x3e\x5f\x12\x00\x43\xce\x6b\xcc\xea"
- "\xf4\xa3\x4f\xee\x3f\x81\xe9\x41\x96\x1b\xb8\x8c\xbf\x6e\x16\xac"
- "\x3c\x9e\x97\x1b\xb8\xc8\x66\xbd\xf6\x21\x3e\x7f\xce\x98\x04\xcc"
- "\xe9\xcf\x80\x56\xaf\x17\xe1\xac\x8c\x6d\x3b\x9e\xb9\xf8\x92\x04"
- "\xbd\x74\xee\xd2\xb6\xe3\x79\xd8\x97\x82\x5e\xec\x07\x8e\x73\x4b"
- "\x7a\x37\xe1\xb5\xea\xf8\x62\xfe\x5c\x79\xdc\xc2\x74\xc7\x0b\xc6"
- "\x63\x80\x43\x7d\x70\xfa\x3b\x60\x09\xba\xe8\xb9\x1b\x3c\x8c\xda"
- "\x3f\xbc\x82\xe2\x9b\x0c\x3a\xb3\x41\x9f\xbb\xc1\xca\x30\x4f\xc7"
- "\x12\x8e\x17\x38\xfd\x6e\xc0\x3a\x2c\x88\x6f\x25\xc7\x57\x79\xbc"
- "\x06\x61\x3d\x04\xa7\xc6\x43\x38\x08\x36\x37\x00\x7a\x84\xaf\xe9"
- "\x4d\x38\x6e\xc3\x5f\x23\xfe\x4e\x62\xd9\x76\x66\x1f\xf9\x6b\xda"
- "\x77\x8b\xe5\x3d\x2c\xf1\x23\xf0\xd1\x19\x51\x44\xcb\x00\x0c\x45"
- "\x78\x8c\xc7\x21\x0b\xe5\x13\xdb\xfb\x91\x91\xb7\xb7\xea\xa3\xdb"
- "\x7d\xbc\x1f\x1f\xdd\x26\xfa\xf1\xd1\xad\x94\xde\x85\xb2\x83\xf7"
- "\x99\x5d\x22\x6f\x06\x96\x5b\xc0\xcb\x55\x7e\x94\xc9\x74\x1f\xe5"
- "\xf9\x50\xef\x90\xae\x36\xa2\x23\xd2\xd5\x46\xb4\x64\xdb\x3e\xca"
- "\x74\x96\x56\x03\x4b\xf8\x28\xaf\x37\xe1\xa3\x02\x2c\x5f\xdc\xcb"
- "\x7d\x81\x8f\x6c\x3e\x81\xdb\x8a\x78\x16\xa1\x5c\xc7\x21\x0e\x1b"
- "\xe2\xaa\xe9\xb5\x1b\x21\x77\x03\xf3\xe5\xfa\x2b\xfc\x4b\x36\x40"
- "\xdc\x58\xb0\x69\xe8\x3c\x5b\x67\x69\x21\xf6\xb3\x09\xaf\x59\x98"
- "\x0f\x37\x60\x5d\x1f\x22\x5e\x5e\x1f\xd6\x53\x83\x38\xb7\x23\xae"
- "\x42\x6a\xd3\x65\x3b\x18\xf0\xb9\xf1\xb2\x68\x9f\x23\x58\xf9\x91"
- "\x2b\xa8\xfb\xe8\xa4\x22\x43\x24\x3f\x82\x6e\xb5\x30\xcf\xcb\xfc"
- "\x4e\xff\x5e\x40\x19\x33\xb4\x7a\xcf\x50\x3e\xc6\x20\x07\x91\xcf"
- "\x24\x53\x25\x78\xdd\x0f\x24\x3f\xad\x96\xd7\x08\xf6\x43\x92\xa1"
- "\x79\x16\x6f\xc5\x38\xb0\x68\xf0\xd9\xba\xc4\xaf\x83\xc5\x16\xad"
- "\x2d\x50\xf9\xd1\xa1\x56\x0b\xf1\xe5\x14\x96\xa1\x72\x45\xa0\xd7"
- "\xa0\x1f\xae\x61\x7e\x7d\xa9\x47\x3b\xcc\x6c\x65\xad\xde\x1c\x84"
- "\xb5\xf0\xf3\x79\x49\x8e\x08\x7e\xae\x9b\xb9\x02\xba\x8f\x0b\xa8"
- "\x6f\x6c\xb8\x0d\x5a\xdc\xf7\x03\xc5\x42\x2d\xee\xfd\x24\xa7\x41"
- "\xa6\xfb\x38\x0d\x65\xb4\x77\xae\xdb\x16\xbf\xf8\x12\x68\x30\x2d"
- "\xd0\x62\x3e\x88\xf9\x4d\x08\x77\x82\xcb\xed\xbc\x4b\x7e\xbd\x5f"
- "\xf7\x51\xa3\xbf\xf2\xe3\xcc\x79\x97\x7a\x59\x8b\xb9\x16\x5e\x70"
- "\xdb\x90\x56\x07\x61\xee\x79\x7f\x5c\xab\xa5\x10\x61\xba\x31\x7d"
- "\x3f\x97\xff\xb9\xe7\xbb\xd8\xbc\x57\xd9\xc5\x79\x97\x3e\x67\x73"
- "\xcd\xec\xc3\x25\xa5\x30\xfc\xba\x0a\x16\x24\xbd\x38\xd1\x71\x10"
- "\xae\x3b\x43\x67\xf2\x64\x41\xce\xd2\x20\x9b\x7b\xfe\x22\x5b\xfc"
- "\x2a\xd1\x26\x03\x5a\xcc\xa8\x3f\xa5\xb5\x44\x6f\x47\x8b\xf9\x28"
- "\xd6\x9f\x85\x78\xad\xcc\x59\xba\x17\x61\x1d\xfa\x17\xce\x1b\xe0"
- "\x44\x47\x2d\xf8\x13\x3e\x6a\x0c\x6c\xfb\xe8\x50\x30\xe1\xa3\x93"
- "\xc1\x6d\x1f\xb9\x58\xc2\xc7\x69\xfe\x6d\x1f\x67\x06\x12\x3e\x46"
- "\x19\xf8\xf8\x10\xf2\x29\x81\x78\xde\x63\x07\x23\x3e\xff\xac\x87"
- "\xf8\x5f\xf9\xb1\x03\xfb\xea\x42\x9b\xc9\x84\xec\x7f\xec\xa0\xf8"
- "\x1e\xcb\xba\x7a\x13\x3e\x3e\x89\x70\x2e\xa1\x5f\x1f\x7b\x48\x2e"
- "\xf9\x98\x55\xf5\xf1\x45\x1c\x63\xe2\x7a\x13\x9a\x01\x7f\x06\xfc"
- "\x21\xbe\x66\x0b\xe2\xbf\x9e\xcb\x54\x65\xb3\x85\x3d\x5c\x83\xbe"
- "\x2c\xc6\xf3\x09\xcd\x35\xb9\x81\x19\x0c\x69\x88\x7a\xd2\x6c\x09"
- "\x6e\x6b\xb6\xb1\xc4\xe6\x43\x3e\x2e\xfb\xcd\xef\x13\xee\xde\x4d"
- "\x26\x8a\xfb\xb5\x98\xef\x60\x55\x9f\x4c\xf2\x91\xac\xea\x3e\x49"
- "\x0b\xea\x3e\xa9\x61\x95\x9f\x64\x3e\xf1\x1a\xf3\x04\x2a\x3f\x29"
- "\x08\x56\x7e\x92\xe7\x1f\x82\x3e\x72\xe9\x51\x20\xfb\xe4\xff\x15"
- "\x63\xf4\x6d\xa2\x56\xcb\x7e\xce\x7f\x67\x29\xea\xc0\x86\x5b\x6c"
- "\x2d\x6e\x94\x05\xcb\x4f\xb9\x6d\x6a\xf5\x9e\xe2\x34\x65\x09\x9f"
- "\xa4\x91\x4c\x11\x7f\x17\x5b\xc0\xc6\xb6\x7d\x92\x19\xdc\xf6\x49"
- "\x5e\x60\x1b\xe2\x4d\xc0\x7a\x12\x3f\xfd\x4f\x1f\xd7\xd7\x4f\x51"
- "\x5e\x8f\x62\x99\xe3\x20\x64\xfc\xd3\x93\xb1\x6c\x24\xd9\x2a\xb2"
- "\x4f\xb9\x7e\x1f\xc9\xcc\x5f\xc8\xae\x09\x3b\x05\x4b\x14\x3b\x45"
- "\x36\x8a\xe2\x0e\xb2\x53\x41\xd9\x4e\x05\x65\x3b\xc5\x9f\x75\x68"
- "\x6b\x2a\x8f\x17\x90\x3d\xca\x2d\x15\x76\x26\x37\x90\xc6\x50\x36"
- "\x92\x10\x47\x81\xe0\x05\xc2\x54\x1d\x5f\xc9\xe1\x39\x9d\x8e\xd7"
- "\x04\xd1\xde\xe0\xaf\x31\x28\xec\x8d\x4b\xb6\x37\x92\x62\x6f\x02"
- "\x38\xfe\xa1\x4e\x05\xa3\xd9\x9b\xa0\x6c\x6f\x02\x4c\xd8\x9b\xa0"
- "\x6c\x6f\x28\x3d\x20\xdb\x9b\x40\x14\x7b\x83\xfa\x4c\xfd\x8d\x93"
- "\xed\x8c\x8d\xec\x0c\xf5\x17\x65\x2d\x2f\x28\xec\x8c\x05\x63\x0e"
- "\x89\xec\x4c\x00\xcb\x04\x15\x3b\xd3\xcd\xcb\xd7\x90\xad\xe9\xfd"
- "\x3e\xa0\xfd\x34\x02\xd9\x18\x6e\x4f\xfc\xa3\xfd\x64\x4f\x90\x7e"
- "\x33\x22\xed\x09\xe2\x6b\xc4\x7b\x83\x6c\xa7\x4e\xea\x2b\x98\x1f"
- "\xed\xc9\xa1\xdc\x52\x2f\xd0\x77\x88\xf5\x7e\xb4\xdb\xa5\x25\x36"
- "\x67\xa9\x1f\xd0\x0e\xb8\x58\xab\x0d\xb0\x8d\x28\xbf\x01\xb4\x15"
- "\x00\xa8\x97\x69\x7e\xd4\x71\x94\xf1\xcc\x56\xcb\x69\x08\xa0\xae"
- "\xce\x75\x77\x39\x17\x7b\x4d\x86\xb9\xe7\x99\x07\xe9\xe3\x5a\x6c"
- "\xb1\xa1\x7d\x31\x79\x5a\xdc\x1f\x40\x4e\x07\x0b\xe6\x14\xb8\x8c"
- "\xa8\x03\x99\x73\x57\x38\xf4\xf4\xdd\xa2\x79\x97\x98\x03\xed\xe2"
- "\xff\x37\xf7\xbc\x41\xbf\xa8\x03\x6e\xcb\x59\xca\x82\x01\xd4\x33"
- "\xec\xef\x21\xec\xb7\x03\xdb\x7e\x12\x75\xce\x85\x7a\x96\xe6\x8f"
- "\xd0\x33\xd4\x99\x9f\xe1\xbd\x51\xd0\xef\x63\x17\xea\x99\x23\xc8"
- "\xc7\xb3\x0e\x1e\xeb\x61\x3d\x2e\x9a\x0f\x43\x5d\x73\x04\xb7\x09"
- "\x5d\x0b\x8a\x72\x9e\x20\xd1\x4f\x92\x75\x0d\x79\x81\x7a\x83\x74"
- "\x6e\x36\xe0\x2f\xba\xae\x59\x54\xba\xf6\xaa\xac\x6b\x09\x42\xd7"
- "\x90\xa7\x71\x81\x4d\x42\xdf\x08\x3f\xc5\x83\x7d\xfa\x96\xf8\x09"
- "\xcd\x5f\x69\x84\xec\x70\x9d\xc3\x71\xe5\x93\x02\xd4\xb7\x3c\xd4"
- "\x37\xc4\xc7\x3c\x64\x37\x51\x36\xff\x44\x63\xdd\x3c\x0b\xfb\xd3"
- "\x92\xc0\x2d\x36\xd4\xa7\x02\xb4\x65\x9f\xa3\x1d\xfd\xd3\x62\x2f"
- "\x34\xa2\x3e\xa5\xa1\x1e\x65\xa2\x3e\xe5\xa1\x5e\x91\x3e\x9d\x0c"
- "\x6c\x22\x9c\x9f\x9e\xec\xc3\xc1\xc7\xca\x70\x7d\x12\x33\xe9\xd1"
- "\xe7\x23\xbb\xed\xb7\x17\xb9\xe0\x33\x1d\x3f\x8f\xd2\x7e\x7b\x29"
- "\xde\x9f\x91\xef\x31\xfe\xfb\x15\xdf\xd3\x4a\x7a\x68\x29\x87\x1b"
- "\xcf\x81\x71\x2a\xca\x3c\xe0\x7d\x12\xde\x67\xe4\xde\xf3\x21\x0b"
- "\x56\xeb\x9b\xb1\xee\x6e\xd2\x45\x66\x4f\xa7\xf8\x2c\x13\x65\x51"
- "\xc7\xba\x4d\x49\x2c\xb1\xcd\xce\x7a\x93\x69\xce\x4b\x8f\xcf\xc3"
- "\x91\x06\xa9\x78\x1d\xb1\xf7\x6b\x18\x89\xbf\xe4\xbd\xf6\xa0\x8d"
- "\xfc\x27\xbc\x4f\x63\xeb\x93\x13\x77\xac\x83\xb1\x7a\xaf\x38\x5f"
- "\x5d\x5f\x61\xa0\xb9\x9f\x91\x74\xcf\xec\xc7\xb4\x0d\x5f\xcb\x67"
- "\xac\x0f\xc3\xfa\xa2\x7c\x53\x39\xd0\xcd\xf5\x32\x53\x69\x0b\xb5"
- "\x0d\xdb\x79\x2b\xb6\x33\xe7\xe9\x0d\x99\x40\xdf\xeb\x8a\x66\x63"
- "\xba\xed\xc6\xbe\xfe\xc7\xc8\xaf\x56\x68\x12\x23\xff\xa0\x42\xa7"
- "\x58\xfb\x68\x69\x9c\x0e\xac\x63\x6e\x3a\x03\x84\xf6\xfd\x5a\xfd"
- "\xec\xcf\x48\x47\x5b\x79\x00\x74\xb9\xa5\x3e\xe6\x74\x33\x07\x7d"
- "\xf7\xab\x81\xce\x25\x29\x63\xc1\x60\x42\x5b\x21\xdb\xd6\x56\xd0"
- "\xb5\x8e\xf9\x69\x5e\xa5\xdb\x3e\xda\xe0\x82\x2c\x9d\xe0\xc5\x47"
- "\x0e\x1e\x13\xea\xda\x0a\x10\xd7\xf5\x84\xab\x05\xcb\x07\xb6\xb5"
- "\x99\x11\x6e\xaa\x0b\xdc\x7c\xcf\x3e\xea\xb2\xc3\xb2\x11\xfe\xe5"
- "\x1c\x8c\xe6\x67\x42\xb3\xca\xb6\x52\xb2\x09\x98\x66\xc0\xb4\x32"
- "\xc4\x5f\x86\xf0\x66\x17\xfc\x7e\xac\xf0\x65\x47\x97\x29\x70\x78"
- "\xcf\xcf\xbc\x0a\x93\x21\xb1\x1a\xc3\x16\xb6\x8f\x4c\x03\xe1\xbb"
- "\xe2\x68\x07\x5a\x66\xf4\xec\x90\x4d\xff\x38\x93\xce\xf3\xb4\x6e"
- "\x86\x14\xe4\x0f\xb5\xef\xef\xd6\x52\x76\x96\xd9\x47\x57\xfe\x70"
- "\xa3\x0f\x63\x8a\xd1\xd8\x96\x9f\xc5\xdc\x1f\x1c\xfc\x9a\x75\x20"
- "\x0d\x5c\x3b\x31\x2e\x24\xfa\x10\x3d\x51\x6f\x82\x48\x87\x2f\xc8"
- "\x26\x35\xac\xa3\xd8\xf8\x8e\x4c\x85\x5e\xb1\x79\xd2\x56\x22\xe2"
- "\xc7\x3b\x1a\x99\x9d\x81\xe3\x36\x7a\x97\x71\xc7\x7b\x82\x06\x1f"
- "\x9f\xec\x42\x3b\x42\x73\xb5\x74\xf6\xe6\x9a\x64\xe6\x43\x9c\xb5"
- "\x2e\xb8\x2f\x4d\xd9\xf7\xec\xf4\xcf\x26\xdb\x12\x75\xdc\xe2\x7b"
- "\x9e\xfb\xf0\xdf\xe9\x68\x4d\x41\x3b\xc4\x6d\x53\xc7\x82\x72\xc1"
- "\x7f\x3a\x0f\xcc\x4b\x7b\xf8\x3b\x30\x7f\x8d\x97\x75\xb2\xca\x8e"
- "\x6c\x8a\x23\x68\xff\x30\xa6\xfd\x1a\xe5\x9a\x39\x8a\xa9\x4d\x77"
- "\xfe\xda\x71\x5b\x0f\x9c\xc5\xf8\xb0\xa1\x6f\xee\xe6\xce\x83\x34"
- "\x57\x23\xe6\x9b\xee\x1c\xeb\x82\x71\x27\x94\x76\x91\x8f\x81\xb4"
- "\x25\x3a\x3b\xc8\xd7\xa0\xf9\xff\x35\x65\xcc\x47\x3e\x07\xc2\xe6"
- "\x2b\x7d\xa0\xfe\x89\x7e\xdd\x59\xa4\xee\x17\xb6\xc1\x83\xb1\x36"
- "\xa7\xc1\x9a\x0d\xa0\xe3\x67\x01\x06\xe8\xfd\xc1\x6c\xde\x17\xea"
- "\x33\xef\x0b\xb7\xb1\x38\x46\xf8\xef\xc7\xb8\x8d\xa7\xbb\x10\x17"
- "\xc6\x3f\x63\xa7\x0a\x79\xba\x73\x6c\xa4\x0c\xf5\xc9\x80\xee\x23"
- "\x3a\x67\xef\x36\x6b\x90\xb5\x9f\x85\xd4\xd9\x48\xa7\x38\xba\x06"
- "\xc9\xcf\xf6\x91\xec\xfe\xa9\x84\xc6\x64\x67\x19\xd9\x5b\x0e\x7b"
- "\x03\xc2\x76\x20\xcc\xfd\x32\xec\xfd\xe2\xdd\x0f\xbf\x0e\xa5\x2b"
- "\x8e\x63\xdb\x5d\x90\x9a\xe3\xe1\xe3\x7d\x87\x41\x79\x66\xf8\x8c"
- "\x57\xb4\xc3\x7f\x2a\x89\xde\x96\x4f\x6a\x68\x3c\x0b\x7c\xcd\xdc"
- "\x58\xcf\x4d\x24\x47\xd6\x0d\x70\x33\xca\xe4\x17\xe5\x9b\xe1\x46"
- "\x92\x31\x96\xd0\x66\x13\x74\x4f\xad\x63\x76\xf4\x3d\xd1\xa2\x5a"
- "\xd6\xc1\xbf\xa0\x0e\x95\x9e\x83\xd4\x9f\x2e\x29\x33\x62\x5b\x01"
- "\x76\x5e\x00\xf2\x51\x3e\x47\xf8\x32\xfa\x4e\x63\xc3\x05\x92\xc5"
- "\xd4\x13\x8a\x2c\xe2\x7d\xdb\x95\x6c\x05\x8e\x33\x06\x31\xcf\x30"
- "\x66\x36\xcd\xf5\xb7\xc3\x18\x3a\xa7\x38\x0e\x7f\x1a\x4c\x1b\xcd"
- "\xbe\x66\x29\x8c\x8f\x69\xcd\x48\xf3\x31\x8b\xf0\x6a\xe0\x3f\xb4"
- "\x25\xf2\x33\xb6\x71\x8c\x81\x7d\x1d\x20\x18\xb4\x19\x63\x4c\xcc"
- "\xae\x21\x3d\xa9\xef\xb6\x8f\x59\xe0\x82\xc7\xe4\xb8\x75\x8c\x91"
- "\x70\xc5\x68\x03\x3f\x63\x82\x9f\x2f\x01\x63\x3e\x30\x96\x6b\xa8"
- "\x1d\xfc\xfc\x1b\xc2\xd5\x20\x09\x9b\x1d\xc4\xb6\xee\xb3\x07\xcd"
- "\x68\x9f\xcd\xc1\xaa\x2f\x8c\xfc\x5e\xce\x63\xf2\x38\x1a\x1d\x7f"
- "\xc7\x02\x3a\x13\xa4\x03\xee\x4a\x16\x78\x3a\xb2\x1d\xb7\x9c\xa3"
- "\x67\x7e\x9e\x8d\x57\xd7\x6e\x74\xd6\x65\x8a\x33\x98\x11\x46\xc4"
- "\xf1\x77\xdd\xdc\x85\x75\x74\xdb\xef\x4a\x76\xc1\x04\x9d\x78\xef"
- "\xd1\x6e\x8c\xa1\x7b\x44\x0f\x46\x3a\x27\x74\xfa\xee\xf3\x2d\x8d"
- "\x5c\xff\x3c\x5d\xba\x66\x83\x6c\x7f\x69\x4e\x26\xa9\x1d\xee\x76"
- "\xb7\x24\x73\xf9\x96\x98\x74\x57\x69\xd8\x19\xb1\x98\xd7\xff\x77"
- "\x17\xc6\xfb\x77\x1d\xc5\x5f\xb3\xfc\x7c\x0a\x7f\x9d\x78\x3f\x15"
- "\x7f\x67\x38\xed\xf6\x14\x6a\x5c\x98\xd7\x85\x3e\x3b\x3d\xbb\xe0"
- "\xae\xc3\x6c\x4f\xaa\xa4\xdc\x37\xec\xa6\x79\x82\xbb\x5c\xc8\x03"
- "\xb3\xe0\xc5\xdd\xfc\xbb\xa3\xd8\x36\xa2\x3b\xb3\xd6\x31\x5f\x53"
- "\xb9\x97\xda\x6d\x68\xaa\xf3\x82\xf1\x2e\xea\xff\xdd\x23\xa9\x4f"
- "\x5e\xa4\x3f\x5d\xd7\xd4\x31\xcf\xb1\x7a\x3f\xd0\x3b\xb2\x6e\xfb"
- "\xdd\xa8\xff\xaf\xe7\x88\x39\x87\x0e\x1b\xe1\x93\x65\x82\x29\xfd"
- "\x17\x74\x6e\x37\x1a\xd7\x69\xe8\x79\xc3\x3e\x31\x0f\xe3\x0e\xcd"
- "\x35\xdf\xfd\x2a\xea\xf9\x0c\x3a\x43\xfa\x02\xdc\xfd\x0b\x86\xb4"
- "\x3e\x66\xe6\x67\x51\x7a\x68\x3e\x86\xe6\xef\xb1\x1e\xb4\x7f\x63"
- "\x9a\xe5\x73\x77\x3c\xdc\xd6\x20\xce\x1d\x98\x87\xe3\x91\xbb\xc5"
- "\xec\x83\x00\xf5\x19\xcb\x7e\xf0\xb5\x4f\xab\x2f\x01\x4d\x39\x7d"
- "\xdf\x05\xdb\xc1\x90\x57\xc2\x96\xdd\x9d\xbd\xf9\x3c\xf3\x29\x7d"
- "\xa6\x77\xa9\x88\xd7\xed\x82\x9a\xfc\x98\x3a\xd1\xd7\x8f\x7b\x12"
- "\x8e\xa5\x0a\x3e\x06\x91\x56\xe1\x7c\xbc\x47\x27\x78\x68\xca\x08"
- "\xe7\xe1\x3d\xe8\xeb\x98\xb6\xe2\xaf\x1e\x7f\x07\xc5\xb3\xfa\x67"
- "\xb2\xa8\xee\x91\xaf\x26\xb4\xa7\xa6\x32\xb4\x17\xf2\xdc\x0f\xa5"
- "\xa3\x3c\x93\xdc\xfc\x1d\xc7\x9e\xde\x7c\xa0\xf7\xa8\x94\x4e\x32"
- "\x4e\xe9\x41\xf4\x6f\x5c\x60\xaa\xc1\x7c\xe2\xb7\x81\xce\xf5\x54"
- "\xe7\xf7\x9d\xdf\x04\x26\x7e\x66\x99\xbe\xa2\xb2\x92\x64\x17\xcb"
- "\xd4\xea\xfd\x95\x95\x58\x9f\x5b\xa1\x2b\xa6\x9d\xa2\x7c\x92\xd3"
- "\x6e\xfb\x3d\x5a\xa4\x0b\x7f\xc7\xe4\xc5\x18\x30\xba\xef\x71\x8f"
- "\xa9\xcf\x47\xd3\x35\x5b\x88\x97\x6e\xb8\x37\x1d\xed\x18\xda\xef"
- "\x2f\xc4\xb9\x32\x70\xef\xfd\xf4\x8c\xf6\xf3\x0b\xbc\x4f\x6b\x41"
- "\x3b\xd5\x53\x75\xda\xdc\x2b\xc1\xd0\x1e\x09\x32\xfd\x3b\xf4\x6e"
- "\x7f\x62\x4b\x89\xb3\xf3\x30\xb4\xfa\x7f\x0e\xf4\xad\x52\xc4\x71"
- "\x0f\x9d\x2f\x6b\xdd\xc0\x02\xef\xf7\x1c\xd0\x3a\xfd\x17\x1d\xfc"
- "\x3c\x75\xb1\x3f\x5f\xf3\x83\x76\xf4\x02\x16\x73\xdc\x82\x3e\x49"
- "\xfa\xe6\x1d\x2f\x31\xff\x8e\xb3\x74\xe6\x4c\x72\xe2\xf6\x1e\x18"
- "\xfb\xee\x46\x48\xab\xef\x81\xd4\x7d\x3d\x60\x62\x7f\xa1\xef\xdf"
- "\x84\xbe\x99\x33\xdc\x02\xba\x7d\x1b\xd1\x9f\xf3\x83\x26\xb0\x1d"
- "\xfd\x39\x3f\xfa\x73\x17\x4d\x64\x2f\xfb\xfc\xb9\x5e\xee\x2b\xb7"
- "\xb9\xf9\x39\xe4\xdb\xda\xdc\xc3\xcc\xa0\x49\x2a\x00\x03\xb6\xcf"
- "\x7a\x01\xee\x59\x91\xd4\x81\xbe\x24\xf6\xd9\x25\xf7\x17\x69\x5e"
- "\xa6\x37\xc3\x50\xde\x57\xb4\xe1\x6c\xdb\x17\xc9\x31\xc7\x66\x89"
- "\x64\xca\x4b\xba\x44\x7d\xa8\xa0\x77\xb9\x87\x6f\xf1\x69\xd7\xd4"
- "\x33\x1f\xa5\x97\x8c\x66\x3e\x4c\x37\x53\xdd\x87\x30\xbd\xdb\x7e"
- "\x6f\x8d\x4b\xfa\x75\x7a\x2c\x19\xc5\x98\x49\xb6\x35\xf7\x5d\xcf"
- "\x24\x1b\xca\x68\xf3\xa1\xcd\x7e\xf4\xc7\x2f\x90\x1e\xdf\x67\xc8"
- "\x2d\x62\x7e\xe3\x2a\x7a\xaf\x7e\x1f\xd0\x3b\x7f\x7a\xd7\xf7\x33"
- "\xf4\x75\xae\xf6\x9e\x9f\xc6\x10\x8a\x1f\xf4\x45\x88\xb3\xaa\xf9"
- "\x10\xc3\x98\x7d\xa0\x7e\x3d\xad\x35\x79\x8b\xaf\x6b\xb9\x2f\xc7"
- "\x05\xcf\x34\xca\xe7\xc8\xba\x85\x3d\x1d\x3b\xd6\x8b\x34\x08\xb7"
- "\x01\x63\x81\xce\x3f\xe9\xaa\x3c\xed\x75\xdc\x46\xb6\xff\x3e\x71"
- "\x86\x5c\xe5\x69\x8f\x18\x0b\xee\xfb\x83\x98\xe3\xbf\xaf\xde\x05"
- "\x0f\xf1\x31\xde\x72\x07\xc9\xc4\x7d\xa7\x58\xe2\xe9\x2e\x82\x1b"
- "\x6f\x03\xdb\x6a\x3f\x14\xb0\x6d\xa7\x3d\x8c\xeb\xca\x05\x60\xef"
- "\xbc\xd2\x4d\x6b\x35\xbc\x37\x2d\xec\x46\xdf\x60\x2c\xe6\x79\xa9"
- "\x0e\x0f\xc2\x20\xdd\x13\xc4\x9a\x80\xfb\x3c\x2e\x78\x50\xb6\x87"
- "\xf7\x35\x89\xb9\xe7\xfb\x9a\xba\xb0\x2c\xfa\x8a\x37\x74\xdb\xc7"
- "\xe2\x58\x36\xbf\x44\x7e\x77\xcc\xd7\xf4\x60\x5a\xaa\x0b\x16\x1c"
- "\xa1\xb4\x92\xd1\x90\x5c\x62\x64\x9d\x31\x7d\xbd\xb0\x7e\x8e\xfb"
- "\x31\x5f\x77\x23\xc1\x4d\x88\xc3\xac\xe0\xc5\xf1\xf6\x27\x5d\xd2"
- "\xd3\x4f\x63\x5a\x99\x82\x17\x61\x6e\xc4\xe7\xea\x3e\x18\x51\xa6"
- "\x5e\x55\xe6\xe9\x2e\xe9\xde\x9f\x60\xda\xa1\x88\x32\x8e\x88\x32"
- "\x27\x55\x65\x6c\x72\x3d\x1d\x11\x65\xbc\xe1\x65\xc6\x69\xfb\xb7"
- "\x6d\x5c\x72\x78\x99\x71\xa6\x88\x32\x53\xfb\xb7\x6d\x5c\x4e\x44"
- "\x99\x45\x11\x65\x8a\x54\xb4\xa5\x35\x30\x69\x98\x66\x8b\x28\x53"
- "\x13\x51\xa6\x51\x79\x46\xdf\xd3\x21\x7c\x03\x94\x27\xe4\x29\xf2"
- "\x15\x6d\xe8\x38\xec\xff\xf4\x53\x57\x5a\x07\x85\x32\xe3\xb6\xee"
- "\x15\xe7\xf1\x93\x5d\xa5\xf7\xfa\x64\xcf\xd1\x2f\x76\x93\x4c\x90"
- "\xdf\x49\x75\x9d\x85\xf1\xe7\x49\x86\xba\xed\xe3\x47\xf6\xa7\xc7"
- "\x78\x53\x78\x3b\xc7\x4f\x0d\x6f\xe7\xf8\xec\xfe\xf4\x18\xbf\x28"
- "\xa2\x4c\x51\x44\x99\x32\x55\x99\x46\xb9\x9e\x9a\x88\x32\x8d\x11"
- "\x65\x0e\xf5\x97\xcf\xf1\x4d\x11\x65\x4e\x45\x94\xe9\x08\xd1\x70"
- "\x3c\x5f\xcf\x46\xfa\x80\xe9\xf8\x9c\x91\x7a\x05\xda\x19\x14\x79"
- "\x56\xd6\xa3\x09\xb9\x9e\x50\x51\x2b\xd6\x65\xf1\xb3\x8f\x3a\x60"
- "\xc2\xdb\xca\xfb\xde\x1f\xf6\xf8\xe2\xe9\x1d\x13\xd2\xb6\xf3\x58"
- "\xa9\x0f\xc7\xdc\x09\x05\x2e\xb8\xbf\x6f\xcd\x06\xad\x73\xe1\x67"
- "\xe7\xf1\x78\x64\x42\xa6\xd0\xbf\x09\xb5\xf2\x3b\x1d\xea\x0f\xf2"
- "\x74\x42\xed\xb5\xb5\x2b\xed\x7e\x6a\x17\x9d\x21\x85\x38\xda\xfa"
- "\x62\x8d\xbe\xb6\x52\x9d\x69\x33\x95\xb6\x36\x88\xb5\x36\x74\x6e"
- "\x99\x87\xce\xf5\xea\xb6\xa7\x25\xa9\xe2\x13\x6a\xab\xf7\xf0\x46"
- "\x9f\x36\xa2\xcd\x6e\xd1\xe6\xb4\x4c\x61\xa3\xd2\x32\x15\x7b\x12"
- "\x53\xfe\x2a\x3b\xa6\xb6\xa2\x57\x40\x6b\x0a\x5a\xea\xd1\xdf\xc4"
- "\x18\x8b\xda\xdd\x0e\x69\x95\xdc\xff\x5d\xd5\x03\x74\xef\x2c\x9b"
- "\xc6\xd7\x1c\xc8\x7d\x71\xd0\xf7\x1b\xc8\xf7\x69\xb2\x7c\x05\x5d"
- "\x3c\x46\x23\xdb\x98\x76\xfe\x58\x99\x87\xda\x7a\x44\x59\x97\x83"
- "\x6d\x11\x7e\x5d\x65\x47\x1a\xad\x87\xa0\xf7\x7a\xc7\xbc\x53\x09"
- "\xe6\x0c\xd2\xb6\x51\xa1\x01\x7d\x0b\x02\x61\x6b\x63\xc5\x4a\x6a"
- "\xba\x8a\x36\x4c\x7e\x4e\xc8\xcf\xc4\xd4\x70\x7d\x88\x47\x39\x9d"
- "\x38\x35\x5c\xe6\x26\x66\x87\xcb\xdc\xc4\xfc\x70\x7d\x90\x50\x1f"
- "\x26\x16\x45\x94\x29\x8b\x28\x53\xad\x2a\x53\x23\xd7\xd3\x18\x51"
- "\xe6\x50\x44\x19\xb5\xfd\xc3\x3e\x4f\x3c\xd9\x17\x77\x72\x7b\x3f"
- "\xd1\xa5\x7a\x96\x6a\xf9\x38\x35\xd1\xab\xa4\xd1\xbc\x1d\xf9\xa8"
- "\x24\x37\x02\xdf\x24\x43\x84\x8d\x42\xf8\x49\xa9\xe1\x6d\x98\x94"
- "\x1e\xde\x86\x49\x59\xca\xb3\xbc\xe6\xe1\x37\x67\x61\xd2\x36\x59"
- "\xce\xbc\xfa\x0a\x78\x52\xef\x7f\xea\x39\xf2\xcd\x68\x7c\xe2\x6b"
- "\xc3\x36\xa3\x4f\x79\x89\xbe\x09\xef\xa3\xef\x07\xc6\xd1\xf9\x72"
- "\x2e\x98\x7c\x14\xe3\x39\x3a\x2f\xd9\x8d\xfe\x54\x2e\xe2\x58\x80"
- "\xf5\xd7\x61\x1d\x48\xbb\x49\x07\x22\xda\x70\x24\xa2\x0d\xcd\xaa"
- "\x67\xf4\xe9\x26\xb5\xa9\xfa\x6d\x88\x4b\xe6\x6b\x40\xd1\xb7\x9e"
- "\xe4\x51\xd2\x69\x0e\x00\xfb\xd8\x69\xe5\x7e\x40\x26\xad\xc7\x1b"
- "\xd1\x0e\x93\x3e\xa3\xf9\x02\x81\x73\x72\x8a\x9a\xb6\x82\x16\x93"
- "\xd3\xc2\xdb\x31\x39\x33\xbc\x1d\x93\xf3\x42\xb6\x66\xd2\x02\xa1"
- "\x23\x93\x0b\x5d\xf0\x70\x0d\xa5\x21\x2d\x8c\x7a\xbf\xf1\x06\xc7"
- "\x1d\xe4\xa7\x4e\xfe\x77\x2f\xf6\x97\x7d\x5f\x1a\x21\x3f\xff\x82"
- "\xdd\x41\x7e\x77\x5b\x27\xda\x67\x5a\x73\x79\x3b\xa6\x1d\x15\x7c"
- "\x9d\x8c\xfd\x7f\xe8\x80\xc0\x3b\xf9\x28\x1f\x07\xee\x20\xff\x77"
- "\x72\x25\x4b\xe8\xc8\x8e\x25\xcf\x5d\x89\x1d\x99\xf2\x7a\x50\x8c"
- "\xe9\x26\xbb\x15\x7d\x08\x56\x75\x64\x06\xb7\x7d\xee\xea\xb6\xa7"
- "\x23\x8e\x34\x9f\x88\x69\x3e\x1f\x8b\xb2\x5f\x87\xfc\xc3\x18\x38"
- "\x5d\x8e\x65\x3a\x16\xd0\x9a\x3c\xb4\x4b\x74\x86\x65\x92\x58\x3f"
- "\x91\x9e\xae\xd2\x2b\xaf\x71\xe3\x0c\xd6\x0e\xe9\x97\xc9\xb7\x23"
- "\xbb\x41\x6b\xfb\x8e\xf9\x3d\x40\xf3\x2c\x4e\xff\x39\xee\x93\x63"
- "\xbe\x4f\x2e\x6b\x51\x95\xf5\xc8\xf3\x20\x9d\x94\x37\xc1\x0f\xda"
- "\x63\x5e\x0f\x9d\xd5\x3f\x52\xf8\xf1\xe9\x97\x8f\xa1\xbd\xc0\x32"
- "\xfb\x95\x32\x34\x67\x42\x65\x30\xe6\xd1\x8e\x2f\xa3\xef\x5e\xb6"
- "\x73\xdc\xca\xfa\x1a\x8a\x8f\x9c\x65\x9d\xe0\xf4\xb6\xd1\x9c\xa6"
- "\x56\xac\x8b\x4a\xf7\xc5\xf9\x40\xd7\xb5\xad\x03\x79\x97\xee\x0b"
- "\x6c\xeb\x98\x8a\x6d\x43\x3e\xa5\xd3\x39\xa3\x61\xbe\xcc\xec\xd9"
- "\x79\x4f\xe5\xce\x1d\xf7\xec\x53\x73\x16\xcc\x9e\x66\x5c\xb0\x62"
- "\xe5\xf2\xc2\x71\xab\xd7\x96\x18\xd7\x17\xaf\x28\x59\xb1\xea\x7b"
- "\xfc\x78\x51\xe3\xd2\x12\x71\x35\x15\x2d\x5d\x53\x32\x9d\x6e\xc7"
- "\x1a\x2d\xc5\xcb\xd7\xf1\xdb\x7b\x12\x21\x1c\xc9\x8a\x92\xe5\xc5"
- "\xc6\x31\x85\x63\x8d\x8f\x2e\x5d\x51\xb4\xb6\x78\x79\x54\x5c\xd3"
- "\x8c\xc5\xcb\x8b\x97\x2f\x2d\x34\x4e\x37\xa6\x11\x66\x35\x3a\x15"
- "\x3f\xd3\x14\xfb\xb4\x06\xc7\x73\xf4\xa1\x3b\xc9\x4e\xd1\xb8\x7e"
- "\x16\x1e\xf8\x8c\x7c\x38\x7e\x1e\x28\xca\x21\x8e\x09\xc8\xdb\xfb"
- "\xcf\xf4\x1f\xc7\xef\xf7\x84\xcb\xef\x14\x08\x97\xdf\x29\x86\xfe"
- "\xe3\xf8\x94\x08\xfd\x9f\x12\xa1\xff\x53\xb2\xfa\x8f\xe3\x53\xf2"
- "\x23\xca\x98\x23\xca\x94\xf6\xd9\x19\x6c\xeb\x16\x6e\x97\xa6\x54"
- "\x47\x94\xa9\x8f\x28\x73\x30\xe2\xf9\xa8\xea\x19\x7d\xd7\x29\x27"
- "\xd4\xbe\x01\x3e\x9f\x51\x74\x3d\x64\xdf\xa6\x78\x14\x18\x1a\x7b"
- "\x1a\xe8\xbb\x43\x1c\xf6\x01\x9d\x0a\xb6\x53\xc0\x3e\xd0\xa7\xff"
- "\x64\x93\x68\x4d\xa4\xf0\xcf\x1f\xd8\x2e\xdb\x36\xfa\x0e\x91\x32"
- "\x86\x76\x20\x2f\x6e\xbf\x00\x53\x2e\x37\x08\x58\x0f\xad\x93\x65"
- "\xef\x2c\xec\x6e\x18\x01\x3a\x2a\x4b\xe7\x61\x32\xfb\xfd\xfc\x6c"
- "\x46\x4c\x4b\xc2\x1f\xda\xa9\x07\x6c\x2e\xe9\x37\xfc\xfb\x5c\x5b"
- "\x11\xc6\x05\x0f\x70\x59\xa6\x72\x5b\xf9\xba\x3e\x5e\xdf\x65\xfa"
- "\x9e\x12\x9d\x31\x4b\xf6\x93\xea\xa5\x73\x5a\xa9\x6e\xc4\xa1\x65"
- "\xd2\xfd\x73\xe4\xf3\x36\x0d\xf8\x1b\x89\x38\x4f\x29\x38\x11\x1f"
- "\x9f\x27\xda\x22\xaf\x83\x17\x7e\xcf\x03\x5e\xc5\xbf\xa0\x58\x21"
- "\x9a\xed\x88\xbe\xe6\x19\xf4\x3b\xed\xc1\x36\x47\x79\x07\xb6\x69"
- "\x6a\x2a\xf9\xa1\xce\x64\x3f\xb4\xd6\xfb\x31\x7e\x05\x03\x8f\xa7"
- "\x4a\xcf\x83\xb3\xd1\x0f\x34\x3f\xbc\xa4\x14\x6c\x0d\x52\xb0\x8d"
- "\xf5\x95\xa3\x18\x6d\x2a\xff\x26\xe4\x56\x4a\xc7\xf2\x18\x4b\x78"
- "\x68\x6d\x74\xac\x6f\x7d\x11\x9c\xe3\x0e\x8a\xf7\xa6\xd6\xca\xbe"
- "\x6f\x65\x03\xe2\x8a\xba\x6e\x57\x02\x67\xb7\x7d\x2a\x8e\x7f\x05"
- "\x53\x15\x9b\x7d\xac\x8e\xdb\x3e\x09\xd3\x91\xb6\x53\x93\x63\xf9"
- "\x29\xb2\x7d\xa7\x73\x22\x87\x76\xdb\x1f\x1c\x79\x25\x58\x6a\xf7"
- "\x31\xec\x37\xea\xa2\xef\x87\xe5\x69\xf1\xb2\x7d\xd5\x61\xb9\x1c"
- "\xa5\xdc\x40\xfa\x27\xef\x51\xf0\xa0\xae\x7a\x45\xac\x38\xed\xd7"
- "\x6f\xf1\xb5\xc0\x0f\xa2\xff\x37\x55\xd1\x83\xeb\xf0\x19\xed\xdf"
- "\x83\xdc\xd7\xa1\x75\x33\x14\x53\xaf\xb1\xa0\xcf\x96\xec\x45\xdb"
- "\xf8\xa0\x43\xc9\xe3\xf3\x44\x94\x57\xc6\x7c\xc7\x92\x3b\x28\xef"
- "\x4c\x5f\x1e\x95\xa3\x76\x97\xfa\x29\xdd\xab\xa4\x8b\xb1\x65\x9a"
- "\x36\xe2\x79\xa4\xf2\x8c\xf7\x46\x6c\x4b\xa5\x8c\xdf\x83\x36\x97"
- "\xd6\x3c\x69\xda\x61\x5a\xc5\x3e\xae\x37\xd3\x32\x95\x7c\x3e\xa7"
- "\xf6\x1e\xbd\x1b\xf3\x42\x30\xf1\xb4\x8f\xfb\x5c\x58\x86\xbe\xcf"
- "\x85\x31\x86\x86\xf5\xf2\xf5\x57\x6e\xc2\x43\x3a\xc3\xbf\x91\x83"
- "\xcf\x88\x2b\xbd\x81\xe4\x1a\xf9\xba\xde\x0f\x29\x96\x87\x69\xfe"
- "\x79\x1a\x97\x5b\x4a\x23\xbc\x84\x8f\xc6\x44\xc2\x4d\xf8\xe8\x3b"
- "\x62\xac\x8b\xd6\x28\x4e\xc3\xfe\x4f\xf5\xc6\xe2\x15\xe6\xbb\x54"
- "\xb4\x8c\xc7\x67\x4f\x78\x5f\x1f\x82\x88\x67\x83\xf2\x4c\x73\xbd"
- "\x42\xf6\x1e\xd2\xca\x79\x63\xaf\x54\x17\xc5\xbf\x08\x93\x17\x5e"
- "\xdf\x43\x05\x11\xf8\x2d\x11\xcf\x36\xe5\xb9\x96\xbf\x63\x78\xa8"
- "\x46\xa9\x83\xf3\x0c\x65\x6c\x7f\xb9\x27\xfe\x4a\xe7\xc6\x62\x99"
- "\x26\x55\x9d\x43\xf0\xf9\x54\x88\x7f\x0f\xb9\x14\x7c\x78\xef\x56"
- "\xc1\xa1\x5f\xf2\x90\x5f\x81\x13\xef\x37\x32\x92\x42\xe5\x32\x92"
- "\xaf\xd2\xd7\x08\xd9\x9d\xbe\x5c\xc8\x6e\x46\x5e\x78\x5b\x32\x0a"
- "\x54\x38\x8b\x42\x6d\xc9\x28\x55\xc1\xa1\x7e\x66\x54\x46\xca\xea"
- "\x9a\x52\x92\x71\x92\xd7\x8c\xfd\x51\xf2\x7c\x72\x9e\x23\xba\x8c"
- "\x67\xb4\xa9\xd2\xe5\xf8\x68\xfa\x74\xd9\x4f\x20\xfb\xec\xa5\x6f"
- "\xa4\xc9\xe7\xb4\x73\x99\xa4\xf3\x9b\xe5\xef\x36\xa1\x5c\x4f\x4f"
- "\x8e\xc4\x4b\xdf\xda\xe9\xc3\xd1\x87\x33\xa3\x53\xf8\x78\xd3\xb3"
- "\x43\x7d\x9b\xbe\xc0\x05\xd3\x94\xf7\x44\x1e\x31\x37\x98\x91\x15"
- "\x2b\xee\x40\xf8\xad\xe1\x34\x9b\x5e\x1b\xa2\xd9\xf4\x46\x15\xde"
- "\x83\x2a\xb8\x8f\xf1\xf9\xa8\x0a\xae\xf9\x6a\xb2\x29\x64\x65\xba"
- "\x27\xbc\xae\x87\x21\x84\xe3\xe1\xa4\x50\x5d\x0f\x27\xab\xe0\xda"
- "\xf0\xd9\x14\x9b\x3f\x0f\x67\xc5\xe6\xcf\xc3\x05\xd1\xf9\xf3\x70"
- "\xa9\xaa\xde\xad\x57\xd7\xab\x87\x0f\xa8\xda\xd3\x80\xcf\x47\xc2"
- "\xf5\xe8\xe1\xe6\x88\xe7\x3e\xfe\x33\xb4\x1d\xfb\x37\x66\xc6\x53"
- "\x7a\xc9\x68\x30\x08\x3d\x7b\xd8\xa7\xce\x7f\xbf\x47\xe4\x53\x1b"
- "\xf9\x3b\x38\x7a\xbf\xc9\xe1\x66\x18\x23\xe1\x08\x46\x95\x9f\xa9"
- "\xb4\x7d\x6b\x8c\x33\xc5\x95\xf1\xcf\x19\xa4\xf1\x6f\xc6\x22\xf1"
- "\xde\xe6\xf7\x63\x99\xfd\xc3\xfc\x58\x63\x19\xe2\xad\x73\xc1\x8c"
- "\x3c\x41\x9f\x19\x28\xff\xcf\x8a\xbd\x2f\x95\xbf\x1f\x8b\xf2\xd4"
- "\x73\x16\x32\xa7\xe3\xb5\x17\xaf\xa3\xc3\xc7\xd7\x19\x47\x99\x5d"
- "\x33\xbf\xc1\x1e\x39\xee\xce\x38\x85\xb1\x47\x8f\xde\x6f\xcb\x8f"
- "\x92\xe7\x61\xf6\xb8\xa7\xfa\xa7\x67\xd2\x58\xd7\xe3\x82\xcc\x0c"
- "\x6a\xaf\x2a\xdd\xc8\xec\xc3\x17\x10\xbc\x8b\xea\xc3\x32\xb1\xf8"
- "\xa6\xec\x2f\x12\xb2\x97\x59\x14\xd1\x8f\xcb\x88\xeb\xaf\xa2\x1f"
- "\x33\x67\x47\xd4\xbd\x35\x7a\x3f\x32\xeb\xb1\x1f\x97\xa3\xf7\x23"
- "\x93\x7f\x83\x96\x49\xd8\x97\x7e\x7e\x47\xe6\x29\xec\xcb\x65\x4e"
- "\xf7\xf0\x74\xb7\x12\xa7\x5a\x2f\x63\xfc\x2f\x01\x2f\x3b\xbf\x2c"
- "\xc4\x37\x01\x37\x73\xa4\xbe\x0e\xf2\xfa\xd7\x39\x13\xf9\x38\x74"
- "\xbe\x0b\x66\x16\x2a\xe3\x95\x9c\x9e\x25\xda\x82\x74\x92\x88\x4e"
- "\xd8\x1f\x2c\x17\x8b\xdf\x8a\x7e\x8a\xf7\x4c\x33\x51\xff\x33\xb3"
- "\x95\x31\x1d\xc7\x73\x8f\x42\x47\xcc\x3b\x14\x91\xe7\x53\xe5\x9d"
- "\x08\xcb\xdb\xdc\x97\xde\xa1\xa4\x0f\x8c\x4f\x8f\x8c\x8c\xe0\x13"
- "\xf2\xe7\x91\x1f\x85\xf7\xfb\x91\x54\xd1\x3f\xe4\x51\x3f\x5a\x3f"
- "\x92\x89\x3c\xea\x8d\xce\xa3\x47\x16\x45\x97\xb5\x47\xf8\x37\xb2"
- "\xd9\x08\x88\x86\xaf\x06\x79\xd7\xcb\x65\x50\xe6\x53\x7f\xfe\x3c"
- "\x72\x58\xe1\xcf\x00\xfb\xe8\x8b\xe8\x63\xe0\x2c\xcc\x5a\x2b\xfa"
- "\x3a\xeb\x78\x38\xee\x59\x86\xe8\xb2\x38\xcb\x84\xfd\x0c\x44\xef"
- "\xe7\xac\xac\xd8\xb2\x38\xab\x00\xfb\x13\xe8\x2f\x8b\xb3\xc4\xb7"
- "\x7f\x65\x19\x8c\xc8\xab\x65\xf6\xa8\xf5\x1c\x24\xbf\xc8\x05\xb3"
- "\x3a\xe8\x3d\x9d\x2a\xbd\x29\x5c\xfe\x66\x19\x78\x39\xa2\x9f\x5f"
- "\xc4\x31\xc4\x87\xb3\x46\x90\xae\x26\x93\xdd\xf6\xac\xd4\x08\x5a"
- "\x5d\x3c\x0b\x59\x3f\xea\x92\xa4\x47\x05\xbd\x66\xaf\x08\x6f\x53"
- "\x56\x66\x74\x7a\x65\xe5\x23\xbd\x2e\x46\xa7\x57\x56\x49\x6c\x7a"
- "\x65\x11\xff\x2f\xf6\xa7\x57\xd6\x01\x35\xbd\xe8\xdb\xae\xd4\xbf"
- "\x3b\x93\x51\x36\x7a\x97\xb0\x06\x61\xcb\x0d\x7a\x94\x15\x51\xc6"
- "\x4d\x65\xce\xe8\x7d\x42\x4e\x8c\xb7\x80\xee\x02\x64\x35\x29\xfa"
- "\x3f\xbc\x0e\x86\xb2\xde\x85\xb4\x46\x9b\xbe\x15\x61\x70\x96\x5e"
- "\x74\xd0\x37\x25\x69\xbe\x31\xbc\xde\xd9\xc6\xe8\xb6\x60\xf6\x54"
- "\xa4\xe9\x9b\x51\xd2\xf3\xc4\x9c\xe9\xec\xca\x70\x1b\x31\xdb\x1c"
- "\xce\x23\xa4\x9b\xc4\x4f\x41\xd7\x0c\xe4\x77\x65\x9e\xcd\x6e\xeb"
- "\xcf\xb3\x47\x37\x08\x7e\x3d\xfa\x5c\x44\xfb\x3c\xd1\xf9\xf5\xa8"
- "\x2e\x36\xbf\x1e\x4d\x8d\xcd\xaf\x47\x33\x89\x5f\x2e\x78\xb4\x34"
- "\x7c\xdc\x78\x34\x3f\xbc\xbf\x58\x2f\x96\x63\xd2\x90\x1b\xe8\x79"
- "\xa0\xfd\x56\x7e\x64\xe3\x88\x57\x0d\xe8\x5f\x61\xfb\x47\x53\x1b"
- "\x07\x8b\x23\x26\x6e\xa4\x61\xcd\xc6\x98\xdf\x1f\x49\x6a\xc5\xb8"
- "\x92\xd6\xe7\xf1\xef\x43\xc3\x63\x73\x83\x92\x66\x1a\xde\x4b\x67"
- "\x61\xce\xcd\x41\x29\xce\x46\x6b\xc9\xf8\xde\x3c\xfe\x7e\xe2\xb1"
- "\x42\x35\x2f\x68\x4d\x19\xcd\x45\xef\x10\xf3\x9c\x9f\x63\xf9\xf3"
- "\x82\x2f\xd9\x97\xc3\xe9\xf8\x58\x65\x74\xbe\x3c\xd6\x88\x7c\xf9"
- "\x3c\x3a\x5f\x1e\x3b\x1a\x9b\x2f\x8f\x51\x4c\xfa\x79\x7f\x3d\x7a"
- "\xcc\x23\xeb\xd1\x16\x2a\x63\x5c\x45\xfe\x6a\xf6\x52\x82\xc1\x7b"
- "\xd4\x91\xec\x39\x94\x3f\xce\xad\xe8\x11\x95\xc9\xa6\xf8\x9f\xd7"
- "\x2f\xc3\x18\x65\x1c\x2a\xbc\xd9\xd9\x7a\x77\x34\x3d\xc9\x2e\x20"
- "\xd8\xf1\x16\xd0\x21\x0d\xf3\xf7\x12\x8e\x62\x00\xc4\xf1\x0b\x82"
- "\xa3\x74\xfa\x76\x83\x0a\xbe\x46\x81\xe3\xf3\xa2\x02\xb6\x92\x75"
- "\x9b\xf9\x37\xaa\x22\x70\xcb\xfd\x1f\xca\xc7\x11\x82\x27\xb8\x08"
- "\x18\x97\xd0\xc7\x39\xa9\xe1\xfa\x98\xed\x0b\x97\xcf\xc7\xe8\xfd"
- "\x84\x3e\x88\x76\x0e\xef\x73\x02\x76\xcd\xb4\x6f\x46\x37\xe7\x94"
- "\x44\xe8\x26\xca\xc0\xe3\x37\x0a\x19\x98\x73\x29\xbc\xad\x73\xaa"
- "\xa3\xcb\xc0\x9c\xfd\xb1\x65\x60\x8e\x23\xb6\x0c\xcc\x39\x43\x32"
- "\xe0\x82\xc7\x47\x86\xeb\xe6\x1c\x6f\x78\xdf\xb1\x5e\xae\x9b\x70"
- "\xfd\x60\x74\x13\x7d\xa1\x1b\x62\xe9\xa1\xec\xff\x6b\xe8\x7b\x6c"
- "\x83\xa0\x99\xf8\xbe\x10\x3c\x7e\x80\xde\x21\xa1\x8d\x37\x13\x0d"
- "\xf7\xf1\x18\xed\xf1\xa3\x6a\x3a\xee\x10\xb1\x96\xf5\x2c\x3c\x31"
- "\x93\xd6\xec\x09\x7a\xe6\x24\x84\xf7\xff\xf1\x33\xd1\xe9\xf9\x38"
- "\xbd\xa7\xb0\x46\xa7\xe7\x13\x86\xd8\xf4\x7c\x62\x2c\xed\x01\xef"
- "\xaf\x53\x4f\x64\xd1\xb7\x36\x95\xb1\xe9\x02\x3c\xb1\x77\x60\xe3"
- "\xd3\x13\x65\xe1\xe3\xd3\x13\x85\x83\x1f\x9f\x9e\x70\x44\x1f\x9f"
- "\x9e\x68\x8b\x3e\x3e\x3d\xe1\x11\xfa\x90\x63\x0a\xd7\x87\x1c\x5d"
- "\xb8\x4c\x20\xed\xbe\xb1\xf1\x29\xa7\x34\x42\x07\x76\x62\x7d\x97"
- "\xd1\xa7\x78\x4d\xf0\x6d\xee\x07\xe1\x6d\xcc\xa9\x8d\xce\xb7\x9c"
- "\x83\xc8\xb7\x9d\xd1\xf9\x96\xd3\x1c\x9b\x6f\x39\x1d\xc8\xb7\x9d"
- "\xfd\xf9\x96\xe3\x1f\xbc\x4f\x31\x37\x2d\x9c\x67\x73\x93\x07\xcf"
- "\xb3\xb9\x25\xd1\x79\x36\xb7\x3a\x3a\xcf\xe6\xee\x17\x3c\x9b\x7b"
- "\x26\x9c\x67\x73\x8f\x86\xf3\x0c\xe9\xf6\x8d\xf1\x6c\xde\xd8\x08"
- "\x9e\xad\x3e\x0b\xf3\x7e\x8a\x3c\x3b\x29\x78\x96\xfb\x6a\x78\x1b"
- "\xe7\x65\x47\xe7\xd9\xbc\x02\xe4\xd9\xea\xe8\x3c\x9b\x57\x16\x9b"
- "\x67\xf3\xea\x90\x67\xab\xfb\xf3\x6c\xde\xa1\xc1\xf3\x6c\x5e\x47"
- "\x38\xcf\xe6\x9d\x18\x3c\xcf\x72\x4d\xd1\x79\x96\x9b\x19\x9d\x67"
- "\xb9\xf9\x82\x67\xb9\x35\xe1\x3c\xcb\xb5\x84\xf3\x0c\xe9\xf6\x0f"
- "\xf2\x0c\xf9\x93\x26\xd6\xeb\xe6\xfe\xbd\x8b\xcf\x69\xe7\x76\xba"
- "\x20\xef\x90\x78\x27\x90\xc7\x65\x47\xe6\xe1\xfb\x08\x73\xa6\xff"
- "\xd8\x9d\xa7\x95\xd3\x9e\xed\xcf\x87\x3c\x23\x8e\xab\xee\xa6\x32"
- "\xbe\xae\x4b\xf0\x90\x68\x8e\x70\x62\x8e\x2c\x2f\x93\xca\x22\x8f"
- "\x99\xd3\xe7\x07\x1a\x8b\x11\xde\x4b\x78\xe8\xbc\x92\x08\x5c\x45"
- "\x83\xf1\xcb\x62\xaf\x31\xff\x7d\x9a\xa3\x7c\x12\xe2\x7b\xb2\x42"
- "\xc8\x6a\x5e\xa4\xff\xdb\x80\x79\x4f\x0b\x39\x9d\x1f\x31\x67\x92"
- "\x17\xc3\xff\x7d\x92\xfc\xdf\x86\xe8\x72\xfa\xe4\x15\xfc\xdf\x27"
- "\xc9\xff\x6d\x50\xc5\xab\x23\x16\xfb\x5d\x11\xf1\xea\x93\x85\x7a"
- "\xaf\x90\x1d\xee\xc7\x6e\xfb\x7d\x5a\xb7\xfd\xc9\xea\x88\x36\x23"
- "\x6f\x9e\x4a\x90\xdb\x1c\xc1\x9f\x27\xf7\xc7\x68\xf3\x51\x6c\xf3"
- "\xfb\x31\xda\xdc\x76\x85\x36\xd3\xd8\xfc\x7e\x7f\xdd\x7a\x2a\x49"
- "\x96\x83\x28\x71\xf9\x53\xa6\xe8\xfc\x7f\x2a\x82\xff\x90\x5f\x52"
- "\xc6\x3c\xbc\x7c\x38\x9c\x59\x0d\x47\x6b\xf5\x09\x96\x64\x24\x0a"
- "\x6c\x6d\x24\xce\x18\x70\x47\xfb\xc9\x1e\xed\x2d\x88\x2a\x7b\x4f"
- "\x75\x0a\x7d\x9c\x9f\x19\xae\x8f\xf3\x21\x5c\x1f\x91\xd6\x61\xe5"
- "\xe6\x1b\xc3\xf3\xf3\x3c\xdf\x9c\x8d\x9d\x5f\x13\x21\x03\x1f\x9e"
- "\x85\x05\xc3\x84\x0c\x2c\x58\x1e\xd1\x8e\x03\xd1\x65\x60\xbe\x03"
- "\xfb\xff\x61\x74\x19\x98\x7f\x26\xb6\x0c\xcc\xa7\x35\xc4\x1f\xaa"
- "\xe5\x76\x7e\x59\xe6\xd0\x70\x98\x05\x29\xd1\x6d\xde\x82\xf4\xe8"
- "\xf3\x3a\x0b\x72\x04\x8d\x17\x6c\x0d\xa7\xf1\x82\xc2\x70\x1a\x62"
- "\x5f\xfe\x71\x1a\xf6\x9d\x1b\xd6\x6d\x5f\x10\xa9\xff\xce\xb3\xf0"
- "\xb4\xac\xff\xcf\xcc\x8d\x68\xa3\x1c\xff\x44\x9b\xcb\x7a\x3a\x09"
- "\x69\xe9\x8c\x4e\xcb\xa7\x4d\xd1\xfb\xfc\x74\x26\x8e\x41\xce\x60"
- "\x3f\x5d\x7a\x3a\x1f\xd3\xe7\xf3\x6f\x44\x5e\x06\x5a\xd3\xdf\x36"
- "\xdf\x0f\x3a\x3e\x5e\xf5\x8d\x4b\x4f\x97\xd1\x1c\x39\x9f\x63\x46"
- "\xf9\xd5\xa7\x40\x1e\x8d\x41\xd4\xae\x25\x65\x91\xef\x44\x9f\xe6"
- "\xf3\x1f\xb4\x8e\x85\xf6\xd5\xe8\x4b\x21\xcf\xe9\xf5\x83\x22\xef"
- "\x04\x1f\x81\xbb\x8d\xf4\x82\xe0\x15\x58\x31\xd7\x69\x8b\xb0\x4d"
- "\xcf\x40\x74\x1e\x3f\x93\x1c\x5b\x76\x9e\x49\x17\x7c\x7e\xc6\x1c"
- "\xce\xe7\x67\x72\x82\xf6\xe1\x0b\xa8\xaf\x28\x03\x83\xd2\x13\x7a"
- "\x77\x1a\xd3\xde\x6f\x59\xd8\x66\x29\x87\xdb\xce\xc1\x33\xfc\x5b"
- "\xa8\x3b\x25\xe6\xd3\x57\x68\xa0\x89\xdb\x80\x67\xc7\xf0\x76\x22"
- "\xcc\x12\x3f\x48\x6c\xcb\x2b\x6d\x94\xd7\x60\x67\x3e\xfe\x0d\x4c"
- "\x3b\x3b\x49\xe7\xfd\xa0\x2c\xdc\xd0\x0e\xcf\xfc\x35\xac\x3c\x8e"
- "\x7a\x4e\x81\x23\x55\xcc\xef\x3f\x6b\x54\xe6\xe1\x63\xcd\xef\x23"
- "\x4c\x96\xb2\xee\x57\xbc\x0b\x7b\x76\x6a\xcc\x71\x19\xdb\x44\x7b"
- "\xc7\xa9\x4d\x57\xb6\x03\xcf\xd6\x29\xf2\x2b\xde\xcd\x3d\x7b\x20"
- "\xb4\xb7\xe5\xd9\xc3\x98\xb7\xe8\x0a\xf3\xb9\x2a\x3d\x78\xd6\xa5"
- "\xc6\x23\xce\xce\x7b\xd6\xab\xec\x4f\xe9\xb6\xe7\xc3\x55\x70\xc9"
- "\xed\xc9\x37\x85\xb7\x27\x7f\x2a\xfa\x96\x8b\x64\x1c\x59\x57\xc1"
- "\x31\xd2\xb9\x7f\x1a\x8c\x0f\x42\xdc\x39\x78\xfe\x8d\x5a\x5a\xa3"
- "\x53\xdf\x09\x49\x7e\xd0\x8a\xd8\x2e\x7f\x37\xed\x0d\xa1\xd8\xd0"
- "\xe9\x9f\xe1\xa0\x77\x70\x7c\x0d\x41\xf2\x0c\x47\x4b\x69\x40\x3e"
- "\xdb\x2c\xff\xc7\x44\xd3\x16\xf3\x45\x47\xfd\x2e\xd6\xb9\x97\x9f"
- "\x69\x95\x1f\x16\xff\x55\xd3\xfa\x1f\x5a\x87\x51\x0e\x33\xce\xc2"
- "\x73\x33\x85\xae\x3f\x1f\xe1\x93\xe6\xc7\x88\xff\xf2\x29\xfe\x9b"
- "\x11\x5d\xcf\x9f\xbb\x42\xfc\xf7\x1c\xc5\x7f\x33\xd4\xe3\xa6\x78"
- "\xcf\xf3\x5c\x96\xda\x27\xa5\x73\xa7\x8c\x2f\x91\x9f\xf9\xdc\x2f"
- "\xef\xab\x05\x83\x9f\xde\x69\xa3\x6e\x3a\x3b\x9b\x48\x5f\x0d\x2d"
- "\x9e\x23\x74\x0e\x83\x8e\xbe\xdd\x2d\xc6\x32\xd2\xd7\xe7\xf8\x7c"
- "\xa1\xde\x2f\x74\xd1\x5a\xca\x3c\x63\x3b\x50\x86\x56\x9b\x15\x5c"
- "\x25\x9b\xcd\x62\xdf\xc7\xf0\x0e\x18\xea\xec\xe4\xe3\xa2\x86\xfc"
- "\x55\xee\xb7\xfa\x2f\x01\xe1\x3d\x56\xd6\x02\x84\x37\xd8\x37\x4e"
- "\x72\xdc\x1d\xa4\xe3\x84\x93\x70\xb7\x22\x1c\xe1\x25\x38\xa5\x1f"
- "\x62\x6f\xcc\xf3\x49\xea\xbe\xf3\xf9\x17\xac\x1b\xd3\xe7\xd0\xbc"
- "\x8a\x93\xca\x59\x17\xb2\xf1\x1d\xf4\xce\xec\xa2\x83\x59\x5f\x61"
- "\xe3\x8b\x69\x4e\xec\xf9\xdd\x54\xee\xfd\x3f\xb9\xe2\x4b\x46\x83"
- "\x4e\x4e\x5b\xd0\x64\xf4\xa1\xbc\x3d\x5f\x17\x6e\x23\x9e\x8f\xf0"
- "\x7f\xf3\x79\x9c\x89\xd7\x22\x5a\x9f\x28\xaf\x5f\x25\x7b\xc0\x9c"
- "\xfe\x6e\x2e\x1f\x57\x5a\x53\x41\xef\xa4\x69\x4d\x94\x38\x57\xed"
- "\x79\x57\xc4\xdc\x9b\x67\x07\x5f\x57\xf3\x47\xac\x77\xe1\x4a\x21"
- "\x23\x8b\x56\x86\xf3\x74\x21\x58\xcf\xd3\xbb\x20\x31\x1e\x2c\xf6"
- "\x47\xda\xc7\x85\x46\xc5\x77\x8b\x48\x9f\xaa\x8c\x07\xc6\x55\x1c"
- "\x6f\xc4\x38\xb3\x90\xfb\xff\x81\x7e\xe3\xc2\x42\x0b\xf6\x2f\x4c"
- "\x26\x5b\xb9\x0c\x2d\xac\x6c\xf1\xa2\xdc\x14\x93\xfc\x2f\xa2\xb5"
- "\x2f\x15\xb4\xe7\x10\x9f\x87\x5e\x80\x85\x47\x02\x76\xd0\xb5\x78"
- "\xf8\x9e\x2a\x03\xca\x08\x97\x5b\x1a\x37\x26\x88\xf5\x48\xde\x88"
- "\x3a\x4e\x29\x34\x27\x98\xd6\xe2\x3f\x82\x58\x4f\x41\xb2\xb0\xf0"
- "\x00\xad\xcd\x18\xee\x86\xa1\x84\x4b\x91\x21\xa7\xbf\x0d\x5a\xfd"
- "\x91\x31\xcf\xa2\x94\xe8\x7d\x5f\x44\xe3\xff\x9b\x2e\x58\x54\x1d"
- "\xce\xdb\x45\x7c\xfc\x57\xde\xeb\xb8\x90\x06\x11\xe5\x8a\xc2\x79"
- "\xbf\x90\xd7\x17\x73\x8d\x4f\xe5\xef\xd3\x31\x9e\x59\xe2\xe5\xeb"
- "\xbd\x16\xa1\xfe\x3f\x7f\xf4\x4a\x76\x90\xe9\x7e\x9f\x1e\x44\x58"
- "\x79\x5d\x30\xda\xad\x45\x9e\xb0\x39\xa3\x51\x7c\xce\x68\xc9\x59"
- "\x78\x41\x7e\xf7\xb3\xf8\xfe\xf0\xf6\xbd\x90\x14\xdb\x37\x78\x81"
- "\xde\xff\x2c\x89\x6e\x33\x5e\xc8\x8a\xee\x1b\xbc\xb0\x48\xb6\x0b"
- "\x4b\x58\x42\xa4\x1c\xbc\x50\x8a\x3c\xe6\x65\x94\x18\x96\xe6\x42"
- "\x63\xc7\xb0\x2f\x1c\xe8\x8b\x61\x8b\xc9\x1e\xbc\x50\xd3\x17\xc3"
- "\x7a\xa2\xc5\xb0\xae\x28\xfc\x7c\xc1\x1d\x9d\x9f\x8b\xb5\xd1\x63"
- "\xd8\xc5\x29\x62\x9c\x5f\x9c\x17\xce\xe7\xc5\xe9\xa1\x77\xc2\x2f"
- "\x24\x7d\x73\xfe\xf0\xe2\xc6\xfe\xfe\xf0\x92\x5b\x05\xaf\x96\xbc"
- "\x10\xd1\xb6\x23\xd1\x6d\xfb\xe2\x93\xb1\xfd\xe1\xc5\xee\xd8\xb6"
- "\x7d\x89\xae\xbf\x3f\x6c\x1c\x12\x01\x33\xb6\xcf\x57\x0a\xf3\xcd"
- "\x96\x64\x09\x3a\x2d\x21\x7f\x2e\x4e\x05\xbf\x28\x5c\xde\xb1\xcd"
- "\x88\x0f\x6d\xdb\x39\xb2\x69\x8a\xcc\xc4\xa2\x09\x9d\xbd\x74\x67"
- "\x2d\x24\xa0\x0e\x7c\xd8\x6d\x5f\xd2\x27\xff\xb4\x8e\x8f\xea\x21"
- "\x1b\x19\x73\x3d\x9d\xa4\xb4\x8f\xb7\xa3\xe3\x4a\xef\x4b\xe3\x92"
- "\x21\xef\xad\x7e\xf4\x28\xe0\xfe\x1f\xe1\xb8\x32\xcf\x0a\x16\x44"
- "\xe8\x98\x57\xac\xc3\x5d\x3a\x5a\xf0\x6d\x69\x44\x2c\x5b\x60\xe1"
- "\x7b\xfa\x62\xda\xdb\x82\x9a\xe8\x32\x5a\x70\xa0\xcf\xde\x16\x13"
- "\xde\x82\x2f\x22\xf2\x9b\x05\x0f\x96\x1a\x83\x09\xea\xb9\xee\x02"
- "\x57\xb8\x4d\x2a\x68\x0e\x2f\xb7\x34\x22\xfe\x2b\xb0\x50\xfe\xc0"
- "\xc6\x9b\xa5\x79\xb1\xc7\x9b\xa5\x9f\x89\xfe\x2f\x8b\x78\xbf\xbc"
- "\xd4\x72\xe5\xf1\x66\x69\x8c\xfe\x2f\x3d\x10\x3e\xde\x2c\x8b\x78"
- "\x47\xbf\xb4\x39\xfa\x78\xb3\xd4\xa5\xd8\x19\x61\x37\x96\x3d\x38"
- "\x30\x7b\xb3\x2c\x39\xdc\xde\x2c\x83\xab\xd9\x9b\x63\xfd\xec\xcd"
- "\xb2\x45\xfa\xfa\x68\x7d\x59\x56\x12\xdd\xde\x2c\xab\x16\x3c\x5c"
- "\xd6\x11\x6e\x6f\x96\xed\x0f\xe7\xe1\xd2\x08\x1e\x2e\x8b\x78\xff"
- "\xbd\xd4\x72\xad\x36\x29\x2e\x2e\x4e\x8a\xd3\x48\x9a\x38\xa0\x8f"
- "\x50\x69\x60\x68\x9c\x36\x2e\x1e\x7f\x43\xe4\xeb\x50\x29\x4e\xd2"
- "\xe2\x2f\x5e\xbe\x0e\x89\x78\x1e\x4a\x65\xf1\xa7\x95\xaf\xf1\x11"
- "\xcf\x43\xae\x92\x3f\x54\xae\x57\xa9\x5f\x1b\xf1\x1c\x7f\x95\xfc"
- "\x21\xff\x60\x79\xe8\xf7\x1c\xbe\x0f\x72\xce\xaa\x75\x4b\x8b\x56"
- "\x14\xf2\x75\xed\xcb\x8d\x4b\x5f\x7c\x71\xf9\x9a\x35\xc6\x92\xd5"
- "\xc6\x47\x66\x3e\x35\x69\x9a\x51\x2c\x8f\x2f\x9a\x3e\xa6\x30\x11"
- "\xe6\xae\x2f\xa6\x8c\xb9\xf3\xe7\xe4\x1b\xf3\x1e\x99\x19\x9e\xa9"
- "\xa0\xe1\xcb\xe0\xaf\x84\x45\xa5\x7b\x99\xdb\x46\x01\x54\xef\xe2"
- "\x76\xa7\x83\xf6\x9e\x8b\x78\x62\xc5\xcc\x13\xb4\x7f\xb9\xc7\xca"
- "\x68\x5f\x45\x3b\x14\x7e\x49\x9d\x18\xd7\x68\x03\xcb\x32\x3a\x4f"
- "\x65\xb9\x86\xfd\xca\x03\xc6\xc7\x41\x6a\x87\x55\x4f\x36\x65\x23"
- "\x2c\x3e\x3b\x5d\x7e\x30\x5a\xc9\xb7\x35\xff\x1d\xf3\x34\xec\xe1"
- "\x20\xa6\x79\xe5\xfd\xf9\x66\x0d\x4f\xfb\x95\x4d\x81\xd3\x9f\x85"
- "\xe5\x3f\x62\xbf\x62\xfc\x99\xce\xac\x11\x70\xcb\x37\x30\xa9\x70"
- "\x2a\xd9\x85\xfa\x11\xa0\xa5\x75\xd9\xbb\x47\x80\x6e\xf7\x28\x3a"
- "\xcb\x76\x79\x91\xb2\x2e\x7b\x1b\x3e\xbb\x60\x55\x1e\xd5\x4d\xb0"
- "\x41\xa9\x70\x19\xc1\xef\x0b\x87\xaf\x0f\xad\xe3\x5e\x5e\x24\x21"
- "\x5c\xee\x17\xa0\xd7\x07\xd8\xdf\x7d\x89\x2d\xe6\xf1\xd9\xe8\xa7"
- "\x21\x2b\x4e\xf8\x6d\x20\xf6\x46\x2d\xff\x72\x43\x80\xf9\xe9\xcc"
- "\x84\xb9\x6e\x2b\xdb\xb9\x12\xb4\xa8\xcf\x1a\x47\x31\xed\xa5\x58"
- "\x7e\xa2\x61\x39\x68\xb1\xff\x29\xe7\xe0\x25\xbf\x71\x1e\xfa\x8d"
- "\x73\x41\xfb\xdb\x52\xda\xef\xda\x66\xdf\xf1\x9f\xa0\xfd\xb7\x1e"
- "\x9b\xd4\xc3\x92\xa1\xac\x84\x75\x32\x3a\xdf\xda\xcb\x7c\xb4\xde"
- "\xf6\x44\x41\x80\x60\x8a\xbb\xad\xc9\xd0\x5a\xe2\x85\xcd\x67\x98"
- "\xaf\xf2\x3f\xc5\x79\x15\x2d\x6e\x2f\xed\x9f\xd5\x6d\x9e\x0b\x71"
- "\x67\xf3\x41\x6a\x31\xd7\x81\x73\x91\x17\xca\xce\xb0\xce\x13\x05"
- "\x5f\x42\xab\xf9\x10\x2c\x69\x03\xe9\x44\xc7\x67\xc0\xcf\x68\xde"
- "\xa1\x77\x95\x5f\x82\xe4\xcd\x2b\x28\xed\x12\x6c\xdc\x0c\xc3\x36"
- "\x9e\xa6\x38\xa8\x0d\xeb\x39\x0f\xcf\x9f\x02\x0d\xe2\x93\x36\x7d"
- "\x06\xc9\x9b\x9e\xa3\x7d\xe6\x99\x50\x5f\x0e\xc9\xcc\x6a\x4a\xea"
- "\xb1\x9a\x0c\x3d\xcc\x34\xa2\xdb\x6a\x1a\xd9\x6a\x41\xf8\x8e\x0f"
- "\x60\x78\x1b\x8c\xfc\xd5\xb9\x36\xa9\xee\x2b\x48\xa1\x3e\x9d\xc5"
- "\xbe\xd5\x7f\x85\xf0\x55\x5f\xd6\x04\xb1\xac\xba\x8c\x3f\xe1\xcb"
- "\x03\xce\x7c\x1f\x04\x11\x57\x5d\x0f\xa4\xd4\xf7\x40\x72\x70\xdb"
- "\x97\x35\x54\xce\x0d\xdf\xbb\xec\x3c\x01\x50\xb6\x99\x05\x7a\xab"
- "\x4e\x9b\xd1\x1e\x0e\x7d\x7f\xd9\x11\xad\xf3\x84\x1b\x5a\xbc\x3d"
- "\xd0\x0a\x7f\x04\x67\xe9\x5f\x1c\xff\xb6\xec\x48\x3c\xfa\x93\x1a"
- "\xc7\x46\x5a\x03\x2f\x64\xc7\xda\x42\xe7\xe7\xd9\x60\x67\x39\x24"
- "\x59\x36\xc2\xd0\x73\x98\xce\x6d\x4f\x65\xb3\xc5\xe9\xff\x8b\x63"
- "\x23\xdf\x0f\xbe\x2a\xaf\xbc\x05\xe2\x5a\xbd\x75\xb4\xef\x58\x0a"
- "\x0c\xd7\xbb\x9c\xde\x93\xe0\xb4\x7c\xee\x08\x26\xe9\x9b\xab\x83"
- "\xa0\xfb\xe9\xd7\x27\x25\xa7\xf6\x6b\x70\xe6\x7b\xe1\x43\xac\x9b"
- "\xed\xd0\xbb\xd1\x66\x65\xb6\x7a\x7d\x74\xfe\x4e\x1a\xeb\x4a\x4e"
- "\xdc\x59\x0c\x63\xf7\x7d\x05\xa9\x7b\xbf\x02\x13\xeb\x36\x49\xb4"
- "\xc7\x9b\xce\x4b\xdb\x8b\xd7\x24\x8c\xc1\xb0\xef\x7c\xaf\x37\x1b"
- "\x26\xef\xf5\xee\x35\x41\x43\x4f\x68\xaf\x77\x4f\x57\x68\xaf\x37"
- "\xca\x94\x85\xf6\x7b\xbb\xe0\x7b\x5a\xfd\x09\x18\xda\x0e\xcb\x4d"
- "\x24\xdf\x3b\x2f\x80\x76\xcb\x05\x80\xf1\x36\x89\xe2\x4c\x2d\xca"
- "\xfe\x97\x4e\xe4\x0d\xdd\xb7\x83\xb9\x1e\xaf\x49\xf8\xc3\x78\xce"
- "\xcc\xcf\xaa\xe8\x90\xe5\x18\xd3\x24\x4c\x7b\x0d\xaf\x71\x78\xdd"
- "\x6c\xad\x67\x1e\x56\xf9\x07\x3a\x83\x26\x91\xe4\x59\xec\x2f\xff"
- "\x43\x66\xb7\xdd\x5c\xe2\x82\x37\xca\x14\xb9\x16\xf6\x7d\xb9\xe5"
- "\xc3\xf6\xf3\x74\x8e\xba\x87\xb7\xab\xd7\xac\xa1\x33\xd5\xe5\x74"
- "\x6a\xc3\x67\x54\x2f\xd6\xef\xc0\xab\x5e\xc4\xa0\xe6\x05\x4a\xd9"
- "\xae\x5e\x33\xd5\x79\x1a\xd3\x99\x92\x8e\xfd\xd6\x52\xde\xff\x68"
- "\x3f\x2f\x09\x18\x93\x84\x38\x7d\x32\x7e\xd4\xfd\xe5\x23\x49\xc7"
- "\xbb\x24\x3d\x3b\x56\x90\x0e\xf5\xbb\xd8\x89\xbd\xbb\x58\x93\xd0"
- "\xbd\x15\xc9\x2e\x78\xd3\x41\x6d\xc4\x31\xbc\xa9\x1a\xf3\x8e\x19"
- "\x01\x88\x2e\x4d\x85\xb4\xbe\x74\xc5\x54\x17\x5c\x97\xaa\xee\x03"
- "\xb3\xbf\x98\x4c\xe3\xe8\xcf\xca\x9b\xe3\xd1\x06\x24\xb7\x76\xb8"
- "\xe1\xdf\x7a\x3a\xe3\xad\x9f\x80\xe4\xf4\xb7\xc3\x84\x91\x90\x4c"
- "\x73\x32\x0d\xbb\x98\x0b\xaf\x9d\xf8\x73\xa3\xbc\xdc\x7a\x0e\x56"
- "\xbc\x76\xdf\x48\x18\xf9\x69\x29\xc8\xf6\x69\xc5\x5e\x95\x7d\x1a"
- "\xd3\xe2\x3a\xa2\xb2\x4d\x2b\x4f\xf7\xb7\x4d\x45\xbf\x13\xb6\x09"
- "\x75\x9f\xdb\xa2\x80\x4b\x4e\xff\x20\x22\x5d\xde\xbf\x52\xf4\x5e"
- "\x44\xba\x4f\x4e\xdf\x1e\x91\x2e\xef\x47\x7f\xa5\x45\xb1\x7d\xad"
- "\xd4\x8e\xf5\x64\xfb\x5e\xf9\x77\xb2\x7d\xad\x05\xb2\xed\xe3\xf6"
- "\xe7\x95\xb7\xd9\xbf\xa2\x2d\x5a\x47\xf6\xe6\x95\x95\xd4\x7e\xf6"
- "\x2b\x50\xda\x9e\x80\x69\xe3\x28\xad\xe6\x8f\xa0\xc5\x9f\x62\xf7"
- "\xac\x64\xf7\xc8\xe6\x91\xed\xdb\x33\x8a\xb5\xed\xd9\xc5\x4e\xd5"
- "\xf3\x73\xa1\x5f\xee\xb3\x7f\x3f\xc0\xb4\x6a\x4c\xfb\x01\xe6\x93"
- "\x1d\x24\x9a\xb4\xe4\x1f\xa1\xb9\x81\x0e\x94\x67\x5b\x50\x4a\x83"
- "\x1d\xc8\x6f\x3a\xff\x6a\x2b\xd2\x57\xaf\x01\x8b\xb3\xc4\xcb\xf7"
- "\xa1\xd0\x19\xe4\xad\x25\x1d\xa4\x77\xa3\xb6\x04\x69\x9e\xe2\x4b"
- "\x28\xf7\xb2\x73\xb4\x57\x85\xda\xb0\x64\xc3\xe3\x74\x96\xb6\xa6"
- "\xc9\x0c\x40\xe7\x12\x90\xcd\xc6\xb6\x68\x6b\xb0\x4d\xe2\xfc\xdf"
- "\x57\x52\xd1\x93\xc9\x16\xbc\x5e\x95\x47\xe7\xf5\xb7\xc3\xcb\x66"
- "\x66\x47\xfb\x88\x7d\xd3\x07\x6c\x40\x67\xb3\xa0\x8e\xd1\x79\x5a"
- "\xe6\x3d\x52\xd0\x5c\xa3\x9c\xcf\x42\xdf\x6e\x40\x18\x67\x9b\x0f"
- "\xa8\xcd\x2e\x78\xf9\x70\x4b\xd9\x11\x2a\x9f\x4f\xb4\x61\x76\xab"
- "\x82\x43\xc3\x71\x48\x7c\xee\xd6\xec\x82\x57\xb2\x79\xf9\xc4\xd3"
- "\xe6\x96\x45\x1e\x20\xbb\xef\xec\x44\x1c\x65\xed\x02\x07\xe2\x62"
- "\x38\x06\x84\xe5\xc9\xf8\x87\x6d\x66\x7f\x47\xfc\xa9\xc4\x2f\x3a"
- "\xa7\x8b\xd6\x29\x21\x5d\x92\xe8\xac\x06\xe1\x87\xbe\xfc\xd3\x86"
- "\x3f\x02\xc8\x67\x8d\xa1\xbc\xbd\x7c\x90\xce\xf2\xa2\xf3\xc5\xae"
- "\x74\xb6\x18\xd2\x28\x55\x39\x5f\x2c\xb8\xfe\x9b\x3d\x5b\x0c\x71"
- "\x27\xef\x93\xd8\x21\x6c\xff\x41\x3a\x5f\x0c\xdb\x9f\x44\x72\x28"
- "\xf7\xe9\xd0\xdb\xcf\x13\xcd\x57\x78\x29\x6d\xa7\x9d\x35\x2b\xfc"
- "\xa7\xfe\x52\x5f\x30\xaf\x4d\xf8\x87\xec\xa4\x0b\x8a\x0e\x51\x3e"
- "\xa6\x35\x11\xfc\x04\xb4\x63\x4e\x1c\xc3\xde\x6f\x0f\x48\x3b\x37"
- "\x82\x56\xd8\xb4\x95\x9f\x50\x79\x61\xd3\x56\xda\x42\x36\x6d\xe5"
- "\x5a\x61\xd3\x04\x8d\x85\x4d\x5b\xb9\x42\xd8\xb4\x95\x4b\xf9\x7a"
- "\x22\xb4\x69\x94\x47\x76\x4d\xb1\x69\x7b\x47\xb1\x66\xb2\x1d\xdd"
- "\xf6\x95\x79\x8a\x6d\xdb\x8e\x69\x64\x3b\xa8\x8d\xc2\x4e\xbd\x72"
- "\x80\xfd\x2f\x13\x88\xf5\x9a\x74\x6f\xa6\xf3\x33\x3a\xe5\x7b\xe4"
- "\xcb\xca\x5f\x0b\x1b\xb7\x72\x7f\xc8\xc6\xad\x34\x85\xca\x92\x8d"
- "\x5b\xf9\x4b\x61\xe3\x44\x7a\xc3\xf3\x64\xe3\x5e\x39\x40\x34\x90"
- "\xf1\x4b\xf4\x1e\x4d\x86\x47\x3a\xae\x38\xa4\xb6\x71\xe1\xfa\xb5"
- "\xd2\xaf\xd8\x38\xb2\x6d\xdd\xf6\x55\x49\x2e\x48\xe4\xe7\xa3\x90"
- "\x9e\xd5\x22\xcd\x15\xbd\x23\x1e\x50\x9f\xe9\x5c\x7e\xa2\xdb\xac"
- "\xf3\x30\x54\x3e\xb7\x46\xee\xf7\xaa\x6c\x65\x8f\xa6\x0b\x56\xf6"
- "\x3f\xd3\x0c\x42\xe7\x92\x21\xaf\x6f\xa7\xf3\x1c\x9d\xb6\x76\x70"
- "\xd6\x31\x5b\xab\xff\x0c\x04\xb7\xbc\xf2\x05\xf1\x15\xe3\x8d\x87"
- "\xe8\x4a\x76\x07\xc7\xd1\x6d\x4b\xbc\x7c\xfe\xfe\x8b\x9d\x12\xe6"
- "\x95\x86\xe5\xfd\x88\xea\xa0\x79\x45\xbc\xb7\xc4\x9a\x47\x18\x44"
- "\x5d\x97\x62\xd7\xb5\xfa\x7a\x5e\x17\xfa\x52\x18\xf7\x5c\x7f\x01"
- "\x56\xf1\x77\x68\xfc\x4c\xe6\xa8\xb8\x56\xcf\x94\xf3\xe3\x62\xe4"
- "\x2f\xbd\x4a\xf9\x8a\xab\x94\x7f\x8f\x6c\x10\xed\xc7\x0b\xd8\xc3"
- "\xf1\x0c\xf7\x2b\x70\xe7\x08\xee\x13\xf9\x3d\xc8\x17\xd6\xd1\x3c"
- "\x2e\x4b\x56\x70\x92\xdc\xed\x40\x38\x7e\x7e\x2d\xda\xc8\xac\x0d"
- "\x40\x67\x07\xab\xca\x5a\xe2\x43\xf4\x5d\x7d\xe4\x0a\xf3\x34\x49"
- "\xce\x3a\xe0\xdf\x7e\x39\x86\xbe\x28\xed\xa5\xa9\xed\x7b\xf7\x60"
- "\x59\x84\xf6\x52\x39\x9f\x9f\xf6\xed\x92\x3f\x73\x3b\x9d\xb1\x49"
- "\x7e\xa5\xbc\xd7\xe2\x26\xb4\xcb\x23\xe8\x1c\x16\x9a\xaf\x5e\x12"
- "\xc8\x93\x8e\xf1\x33\xf1\x2d\x75\x4a\xd9\x58\x73\x7b\x54\xaf\x5c"
- "\x27\xdf\x87\x84\x65\x4e\x28\x65\x08\x37\xed\xbd\xc1\xf1\xf8\x76"
- "\x7e\xbe\x99\xdf\x4d\x36\xf0\x26\xf4\x41\x47\x88\x7a\x0a\x40\xd4"
- "\xf3\x2a\xea\xcd\xaa\x13\x57\xda\xe7\x14\xbb\x7f\xaf\x66\x0c\xbe"
- "\x7f\x20\xf7\xef\xd5\xd2\xab\xf4\xef\x4a\xf5\x1e\x1e\x7c\xbd\x06"
- "\xa5\x5e\xcf\xe0\xe9\x5a\x9c\x3a\x70\xba\xa6\xc9\x74\x2d\xce\xbf"
- "\x0a\x5d\xa3\xd5\x53\x3d\xf0\x7a\x8c\x4a\x3d\x8e\x68\xf5\x00\xff"
- "\x8b\x79\x5e\x8f\x4e\xf9\xf6\x0a\x7d\x87\x48\x7c\x13\x61\x8d\x4e"
- "\xfd\x8d\x29\xf1\x7d\xa2\x35\x29\xca\x37\xa6\x42\xfb\xb8\xd6\x3c"
- "\xb8\xa4\x91\xc6\x75\x16\x74\xc1\x9a\x0c\x9a\x6b\xcb\xda\x2c\xce"
- "\x07\x94\xcb\xe4\x5d\xe5\xdb\x56\x74\x46\x4e\x29\xd5\xcd\x18\x3f"
- "\x8b\xc5\x2b\xce\xd9\x5b\xf3\x06\xed\xc9\x13\x6b\x76\xd6\x38\x84"
- "\xfe\xaf\xa9\x77\x41\xb1\x38\x73\xaa\xea\xf4\xa6\x2e\xab\x0c\x7f"
- "\x0b\x8d\x49\x7d\x30\x0e\x05\x26\xea\x9c\x5f\x55\x87\x6d\x7f\x79"
- "\x5a\xd8\xfe\xc1\xd9\xc5\xc5\xab\x8b\xa7\x19\xd7\xac\x5c\x36\x6e"
- "\x4d\xc9\xd2\x92\xb5\x6b\xf8\x46\xf3\x44\xc0\x04\x63\xc9\x8a\x95"
- "\xcb\x57\xaf\x2d\x31\xad\x5f\xba\x42\x6c\x4c\xbf\x07\x01\xd5\x40"
- "\x10\xf6\x3d\x92\x64\xb4\x21\x27\x99\xc4\xcf\x90\x70\x53\x9f\xe8"
- "\x2c\x11\x65\xdf\x6d\x53\x32\x80\xd7\x4e\x36\xa7\xa4\xd0\x05\xf9"
- "\x79\x0a\x1d\xe9\x7c\x43\xf4\x3b\x92\xcf\x41\x49\x05\xf1\x3e\x17"
- "\x5d\xc8\x06\x71\x2e\x04\xdf\xdb\xef\x2c\xc1\x84\x56\xd0\x39\xd6"
- "\xd1\x3c\x6a\x89\x2f\x68\x5f\xd3\xc9\xcf\x6b\xdc\x78\x0e\x9f\xd7"
- "\xde\xaa\x8c\xf3\xf4\x5e\x48\xbc\xc7\xbd\x7d\x46\x3b\x94\xcc\xa5"
- "\x7a\x49\x6f\xf6\xbd\x09\x5a\xc2\xc5\xec\x25\xb4\x27\x1a\xf0\x59"
- "\x87\x6d\xe8\x54\x7c\x49\x6c\x6f\x12\x4b\xe8\xb0\xb8\x60\x6d\xca"
- "\x6f\x0c\x1e\x90\xf7\x6a\xeb\xf6\x89\x7d\xd9\xda\x6e\xfb\xda\x91"
- "\x7d\xb0\x76\x3a\xb7\xb8\xc3\x42\xdf\x2d\x8b\x4a\xdf\xc4\xf6\xcc"
- "\x60\x6f\x7e\xbc\xba\xcf\x18\x17\x23\x7f\xd6\xb6\x60\xdf\x47\x12"
- "\xaf\xe5\xf3\x44\x86\x60\xda\x2f\xc4\xd9\xc9\xed\x99\x98\x36\x04"
- "\xaf\xf9\xc4\x53\x3a\xc3\x00\xf3\x2a\xe9\x1d\x57\x6b\xd9\x45\xc7"
- "\xb1\xe4\x76\x94\xeb\xb5\x68\xff\x16\x6f\x15\xfb\xce\x10\x1e\xeb"
- "\x70\xda\x7a\xa0\xc9\xc8\x1c\x34\xc7\x86\x6d\xef\x68\x32\x7a\x81"
- "\xc5\x2d\xfc\x82\xca\xa1\x5e\x24\x5b\x4b\xc9\x97\xc0\x74\xbe\xbf"
- "\x6e\x6d\x9b\x42\xf3\x12\x23\x3b\x4f\x30\xb1\xe6\x85\x69\xbc\xdb"
- "\xc9\xc7\x82\xaf\x80\xd6\x50\x75\xc0\x5a\x7f\xa4\xbd\x1f\x53\x38"
- "\xcd\x58\xb8\xb4\xc4\x58\xb4\x62\xd5\x72\x63\xe1\x8a\x42\xe3\xaa"
- "\xd5\x25\xc6\xef\xad\xa6\x09\x1a\x9a\x92\x09\x93\x89\x20\xf5\x6f"
- "\x7d\x7e\xbc\xf2\x0e\xba\x6b\xbd\x79\x08\xf6\x1f\x69\xb2\xfe\xe9"
- "\xae\x6e\xf3\xd0\x70\x9a\xac\x7f\x50\xc8\xf1\xba\x4a\x6c\xfb\x58"
- "\xb1\x7f\x2f\xae\x13\x9f\xb1\xff\x6b\x3d\xe1\xba\xb7\xfe\x35\x19"
- "\xf6\xb0\x02\xcb\xe5\xe2\x8e\x73\x7d\x79\x3b\x65\x79\x6c\x10\xfb"
- "\x8c\x79\x9c\xdb\xc0\xd7\xe0\xaf\xeb\x8c\x59\x86\xce\xea\xda\x08"
- "\x2f\x5e\x80\x75\xbf\x63\xf6\x75\x29\xb2\x0c\xe9\x82\x95\xed\x79"
- "\xb2\xfc\xa0\x4c\xac\x37\xf5\x97\x9f\xf5\x5b\x49\x7e\x58\x77\xbe"
- "\x8e\xaf\xd7\xf0\xfb\xd0\x4e\xe1\x33\x8e\xaf\x2e\x58\x57\x4d\xfd"
- "\xf0\xae\xcf\xd7\x59\x77\xf3\xf3\xf3\xfe\x4a\xef\x3e\xe9\x9b\x2f"
- "\x28\x2b\x09\x28\x1b\xc8\xa3\xf5\x65\x0a\x8f\x14\xf8\xe8\x3a\xcc"
- "\xe5\x25\x5c\xc6\x04\x3d\x4f\x73\x19\xc3\xf1\x1d\xdb\x24\x29\xe7"
- "\xf4\xd1\x18\x80\x6d\x73\x97\x6c\x66\x0c\xeb\x70\xa9\xe4\xe0\x42"
- "\x34\x39\x40\xde\xbe\x58\xb4\xfa\xc5\x57\x50\xd1\x8b\x97\x97\xbc"
- "\x68\xa6\xb3\x29\xc8\x0e\xf0\x83\x2f\xc6\x14\x1a\xd7\xae\x59\xfe"
- "\x62\x22\x44\x83\xea\xcb\x54\xf3\xdf\x10\x44\x79\xed\xea\xca\x8f"
- "\xa7\x3d\x12\x62\x4f\xc4\x86\x1f\x75\xad\xc1\x58\x22\x8c\xef\x1b"
- "\x76\x3b\x93\xd3\xd0\x27\x4b\x03\xee\x43\x23\xcd\xc4\x7b\xfe\x0d"
- "\x9f\x11\x1d\xba\x24\x0d\x8e\x07\xa5\xf5\x8a\x0c\xe0\xfd\x01\xec"
- "\x53\x4d\x68\x8d\xc5\x86\x33\x5d\x52\xfc\x19\xb2\x3f\x62\x3d\xc7"
- "\x39\xb4\x03\xfa\x86\x76\xd8\xc0\xe7\xa4\xf7\xf1\xf1\xa4\xf4\x8c"
- "\x52\x66\x47\xdf\x3e\xe5\x0d\x59\x8a\x9c\x84\xca\x94\xb6\x50\x1a"
- "\x3f\xab\xc8\xbe\xde\x47\x3c\x67\x82\xf7\x5a\x05\x0e\xe9\xca\x1a"
- "\xb8\x1d\xd9\x90\x16\x69\x1b\x7e\x63\xa0\x77\xda\xa2\x3d\x5c\xfe"
- "\x74\xed\x26\x7e\xee\x09\xfa\x6a\xd8\x9e\xe9\xf2\xfa\x92\x93\x7c"
- "\x4c\x2f\x45\x5c\x3e\x81\x8b\xd9\x4b\x6f\x53\xea\x62\x09\xed\xa6"
- "\x06\x2e\x67\x1b\x6a\x42\x73\x7e\x1b\x32\x28\xd6\x65\x5d\xf9\x43"
- "\x5c\x50\x5a\xc6\x65\x0b\xef\x4b\x6e\x16\x67\xb0\x91\xbc\x51\x3f"
- "\x49\xae\x42\x32\xb5\xe1\xa4\xc2\x6f\xea\x33\x96\xdb\x6a\xe4\xe7"
- "\xf4\x6e\xe8\x54\x68\x19\xeb\xac\x18\xae\xb7\x3a\x6c\x4b\xb7\xd0"
- "\x5d\x1e\xa7\x89\xf3\x81\x68\x9f\x4a\x1c\xb6\x31\xef\x2c\x6c\xbc"
- "\x4c\x6b\xef\xf5\x3e\x8a\x7b\xda\xf3\xe8\xec\x03\xb1\x97\x7c\x23"
- "\xfa\xff\xeb\x32\x42\x7b\xcb\x37\xe2\xf8\x5f\x9a\x21\x78\xb7\xb1"
- "\x50\xa5\x7b\x1e\xf9\x7d\xfe\x50\xa2\x11\xd9\x33\x67\xe9\x6c\xae"
- "\xaf\x62\xdf\xee\xc6\x1a\xa5\x1c\x3f\x27\xc0\x2f\xc6\xc4\x0b\xb0"
- "\xf1\x10\x8d\x11\xd4\x3e\x17\x6c\xa4\xf5\xd6\x7c\xdd\x13\x8d\xb9"
- "\x5c\x6e\x92\xe9\x1b\x26\x1b\x4f\x44\xb4\xe1\x8c\x82\x4b\xc6\xed"
- "\x56\x9e\xe9\xdc\x30\x17\x94\x95\x36\xa5\xa0\x4e\x79\x79\x1f\xae"
- "\x6b\x2a\x41\xdd\xf2\x12\xdc\xa6\x91\x0a\x0d\x31\xdd\x86\xcf\xe8"
- "\xff\x94\x98\xc4\x3b\x9d\x0e\x8b\xb0\x45\x65\x25\x74\x26\x95\xd5"
- "\x48\xe7\x0a\x66\x08\x7b\xc3\xcf\xc2\xe1\x79\x13\x65\x9d\x4d\xa0"
- "\x3d\x3e\x7c\x5d\x8b\xd7\xcf\x6d\x83\x38\x3b\x01\xf3\x51\x47\xba"
- "\xe9\xdb\x2c\xbd\xe6\x04\xd1\xb6\x4d\x95\x7d\x75\xa0\x4c\x34\xf1"
- "\x77\x88\x9b\x4a\xc5\x59\x24\x43\x31\x56\xdb\x74\x40\xe1\xdf\xd6"
- "\x5d\x98\x86\x38\xb1\x9c\xae\x89\x9f\xf5\xb5\xa9\x49\x69\xaf\x9c"
- "\x27\x71\x79\xe0\x34\xd8\xd4\xa7\xff\x5d\x23\x38\xac\x47\xa9\x87"
- "\xc3\x22\x1c\xc1\xd3\x37\x3b\xbb\xed\x65\x49\x7d\x78\xc4\x19\x28"
- "\x3a\xaa\xa7\xa9\x91\xe7\x99\x42\xb6\x6a\x23\x7f\x67\xca\xd7\x9d"
- "\x61\x3f\x3c\x9b\xcc\x09\x9c\x07\x46\xa0\xef\x7b\x68\x09\x9f\x90"
- "\xc5\xb2\x45\x4a\x99\x38\x0d\xd1\xb1\xac\x48\xa9\x5b\xc1\x41\xed"
- "\xbf\xa2\xcd\x13\x7d\xd1\x92\x8e\x10\x2c\xe1\xe5\x32\xb1\x91\x7c"
- "\xa6\xb2\x4b\x5c\x06\x79\x3f\xcb\x9a\xd5\xbc\x16\xbe\x58\xd9\x19"
- "\x95\x3c\x50\x7b\xfa\xf8\xef\x82\xcd\x29\x62\x2c\xd9\x0c\xaa\x36"
- "\x22\x4f\x36\x1b\xfa\xf8\x50\xc5\x79\x44\xdf\x59\x8a\xfa\x1d\x44"
- "\xae\x2b\x08\x13\xfc\xff\x89\x7b\x1f\xf8\x28\xab\x2b\x7f\xf8\xce"
- "\x64\x80\xc9\x30\xc9\x04\x8d\x38\x62\x94\x81\x46\x7f\xd1\x46\x8d"
- "\x7f\xba\x4b\xfb\x6a\x8d\x8a\xbb\xb8\x2f\x0a\x6b\xb1\x9b\xb6\xac"
- "\x01\x49\x68\xa8\x08\x63\x12\xc2\x80\x21\x93\x0c\x98\x86\x98\x7f"
- "\x2a\xda\x00\x21\xc4\x15\x35\xb6\x41\xe3\x96\xb6\xb1\x45\x1d\x4b"
- "\xb0\x41\x21\x13\x2d\xae\x89\x8d\x30\x84\x10\x02\x1b\x70\x20\x43"
- "\x32\x90\x99\xe7\xfe\xbe\xe7\xde\xe7\x99\x99\x60\x42\x4b\x77\xdf"
- "\xcf\x9b\xcf\x67\xf2\x3c\xcf\x7d\xee\x73\xff\x9c\x7b\xee\xb9\xe7"
- "\x9c\x7b\xee\x39\x5c\xb4\x93\xc6\x03\xb2\xd4\x2c\xd6\x0a\xba\x47"
- "\x73\x05\x30\x41\x1b\xd7\xbd\x44\x78\x85\x72\x73\x46\xe3\xe6\x3a"
- "\x47\x54\x7b\x75\x44\xd7\x91\x56\xa1\xe5\x41\xfb\x84\xcc\xa5\xc1"
- "\x13\xef\x1a\xc3\xe3\x78\x87\xc8\xdb\xa2\xb5\xf3\xaf\xac\x19\x2a"
- "\xac\xd6\x9d\x51\xeb\xf0\x69\x75\xe0\x1e\xf5\x14\x7e\x83\x57\x7d"
- "\x62\x4d\x7e\xb6\x74\x4e\x44\x8b\xfc\xe2\x25\x4f\x66\x67\xa5\xda"
- "\x16\x2f\x25\x37\x46\x79\xcb\xb3\xb3\xed\x62\x13\x66\x34\x1f\x98"
- "\x28\xea\x03\x1c\x24\x2f\xeb\x5c\xf3\xa2\xb4\x3f\xa1\x79\x41\xf3"
- "\xdd\x47\xf3\x7d\x4f\xe1\x59\x21\x9b\x78\x8a\xef\x60\x9e\x00\x2f"
- "\x26\xfe\x5d\xd0\x3e\xea\xbf\xd5\x2f\xd7\x01\x8c\x27\xad\x91\xc3"
- "\xae\xa2\xda\xd1\xf0\x2a\x6a\x1c\x3d\x97\x8b\x5a\xc6\xa6\x13\x45"
- "\x3f\x12\x74\xa2\x4c\xe2\x05\xd1\x27\xb2\xdd\xa7\x72\xf1\xcd\xc0"
- "\x45\x65\x06\x23\x34\xca\x69\xd4\x68\x94\x5c\x27\x9c\xa9\x58\x83"
- "\x6a\x64\x5d\xce\xe4\x08\xde\x38\x77\x48\xbc\x71\xce\xf2\xb2\x17"
- "\x36\x69\xb2\x8a\x5c\x3b\x8a\x8c\xc4\x3f\x12\x4d\xc7\xfb\x0c\xad"
- "\xbc\x4d\x57\xd0\xba\xe1\xcc\xf9\x26\xff\xe0\x4c\x24\xfe\x81\xec"
- "\x0a\x09\x16\x68\xab\x51\xce\x1b\xe7\xa6\x28\xfa\x93\x80\xe7\x1d"
- "\x63\x8d\xf5\x13\xb4\x1c\xdf\x42\xdb\x65\xb7\x2c\x59\x91\x7f\x0f"
- "\xb9\x98\xca\x76\xd8\xb3\x97\xe4\x67\x67\x5d\xbc\x4f\x96\xa2\xf1"
- "\x62\xb4\x47\xbd\x09\xf3\xde\x17\x4b\xf0\x70\xa2\x3f\xae\x64\xad"
- "\x0f\x82\x4e\x81\x77\x54\x69\x9c\xb9\x8f\x95\x9c\xd9\x2e\xec\xec"
- "\x8a\x93\x35\x3c\xa1\x7c\x0f\x38\xb8\x82\x34\xf4\xbf\x48\xb3\x07"
- "\x84\x4c\x5a\x3c\x47\x7b\x8e\x7c\x5f\x2c\xfd\x24\xbd\x2c\x6c\xf2"
- "\x00\xd3\x12\x73\x14\xbf\x85\xe7\xe2\x5e\xf5\x59\xf8\x51\x22\x9f"
- "\x5f\x03\xac\xf8\x15\x09\xdf\x62\x8c\xff\x3a\x95\x56\x94\xf8\x64"
- "\x39\x8c\xbd\x5a\xe4\x9b\xb0\x5d\xe8\xe7\x8b\x5b\xb4\xfa\xf0\x7d"
- "\x77\x74\x9d\xb4\x6e\x5d\x5c\x9e\x97\x15\x8b\x7d\xe4\xf5\xc2\x07"
- "\x5c\xb1\x7f\x8c\xb6\x3a\xa2\xf3\x0d\xbb\x4a\xac\xa8\xbf\x55\xeb"
- "\xf3\x0f\x1c\x22\x2d\xf5\x12\x7d\x1c\x50\xfb\xd8\x48\xb8\x45\xf5"
- "\x13\xfe\xab\x6d\xa8\x50\xfd\x8a\x78\x29\xbe\x21\xb5\x5f\xf8\x37"
- "\xb3\xd2\xbc\x2e\x29\xc6\x3a\xaf\xf9\x7b\xe9\xa6\x3e\xee\x2a\xf2"
- "\x19\x34\xbf\x52\xf2\xfb\x92\xec\x8b\xda\xb6\x2b\xea\x9b\x7e\xf7"
- "\x4c\xd2\xbd\x97\x3c\xcc\x5d\xce\x66\xc2\x43\xf2\x37\xb5\x29\x8c"
- "\x87\x25\xde\x6f\xe2\x5d\xc9\x5c\xc2\xbb\x68\x5c\x5a\x76\xc7\x12"
- "\x60\x52\x5e\x76\xfe\xf7\x04\x77\x0f\xc6\x8e\xdc\x96\x2d\xce\x5f"
- "\xb6\x72\x45\x5e\xaa\x2d\x2f\x6b\xb1\x3a\xe9\x47\xcd\x79\x97\x90"
- "\xdd\xfd\xda\x3c\x1b\x76\xb9\xe6\x46\x68\x8b\x2b\x82\xff\x64\x63"
- "\x25\x62\x2b\xbb\x5e\x91\xf3\xc9\x95\x1f\x35\x77\xc5\xf7\x34\x47"
- "\xb7\x0b\x9e\xcd\x15\xbd\xfe\x93\x6c\x1c\x7b\x9a\xb9\xee\x51\x61"
- "\xea\x97\x30\x76\x9d\x10\xfd\x14\xfe\xb4\x4a\x82\xd4\x4f\xe1\xbf"
- "\x45\xf0\x67\xae\x0e\xad\xbf\x11\xb9\xc1\xd5\x2f\xf8\x28\x95\x5f"
- "\xbb\x94\x5c\x1e\xe1\x4f\xd7\x6f\x50\x75\x67\x9d\x9a\x8c\xa7\xf1"
- "\xd7\x68\x4b\x96\xe4\x55\xd7\xdf\x33\xaf\x90\x8f\x64\x3a\xc8\xcf"
- "\x1c\x8d\xc1\xfa\x65\x1a\x6f\x29\xec\xef\x36\xf6\xa4\x0d\xbb\xd6"
- "\x2f\x8a\xa6\x13\x3c\xe6\xc9\x4e\x95\x47\x4c\x93\xb2\xeb\xe4\xdf"
- "\xf5\xa0\x2e\xda\x3b\xb8\x44\xdb\xd0\xaf\xf5\xa0\x7f\x9b\xb2\xa8"
- "\x1c\xe2\xaf\xf9\xa0\x55\x8d\xef\xb8\x41\xec\x35\xd6\xa3\x6c\x1f"
- "\xc6\x16\xf9\xc0\xff\xb9\x04\x6e\x28\xc0\x51\xb2\xbd\xf1\x6b\x3c"
- "\x12\x5b\x1f\xa2\xb5\x08\xf7\xc0\xdb\x0d\xea\x99\xf4\x0d\xf3\x7d"
- "\x79\x29\x6c\x70\xd0\xaa\x1f\xcc\xcb\x30\x90\xbe\x80\x60\xe1\xa9"
- "\x0b\x30\x89\x3f\x1b\x6c\xa0\x53\x1d\xd1\xe5\xa9\x65\x11\x4c\x0d"
- "\xd4\x0e\x9e\x67\xd5\x13\x7e\x8b\x78\x80\x83\x29\x58\x4f\xd7\xf7"
- "\xf3\xbc\x14\xfd\x38\xbe\xb3\x2e\xd5\x4f\xb3\x16\xbb\x92\xe8\x95"
- "\xf4\xcf\xff\xec\xce\x17\xa5\x6e\x40\xad\x77\xc3\x3b\x5c\xff\x8a"
- "\x58\x57\xaa\xc4\xba\xc2\x99\xf4\x77\xbe\xa1\x43\xd8\xc1\xda\x5f"
- "\x11\x31\x51\xd5\xf3\xd5\xbe\x56\x7b\x50\xc4\x9a\x73\xe6\x13\x9f"
- "\x16\xa4\x7d\x1f\x71\x7e\x78\x4f\x7e\x90\xfd\x20\x40\x38\xf9\x2c"
- "\x23\x5f\xef\x7e\xc1\x2f\x3c\x6b\xd6\xfc\xbb\x53\x9c\x46\xf0\xc1"
- "\x0c\xfd\x8a\xa1\x71\xb7\x39\xc9\x37\xff\xb3\xbd\xa4\x77\x95\xf2"
- "\xb8\x95\x55\x81\xa7\x97\x63\xf0\xec\x63\x14\x1b\x4f\xca\x0a\x3d"
- "\x18\x97\x98\xe3\xc8\xfb\x94\xdc\x03\xd6\xe8\xc4\xb3\xc7\xc8\xb6"
- "\xdc\xab\x96\x81\xba\xb0\xfe\xaf\xaf\x91\x75\xa1\xbc\x61\x6d\x3c"
- "\x9f\x7d\xec\x9b\xfa\x8d\x48\x79\xf8\x7e\x81\xca\x17\x30\xa9\xbb"
- "\xfa\x23\x95\xd5\xaa\xe9\xae\x22\xbc\xcf\xb3\x9d\x9a\xee\x4a\xfa"
- "\x8e\xde\x50\x47\xf5\x8f\xa7\x23\xe2\xce\x1f\x11\xde\x1b\x89\x87"
- "\x1b\x97\x9f\xc0\xfa\x4e\x6d\xd7\xf8\x42\x39\x3e\xa5\x4f\x13\x7f"
- "\x48\x71\x4c\x35\x5e\x52\xf2\x00\xa5\x85\x72\x2d\x2b\x5d\xa4\xad"
- "\x65\xf8\x76\x97\x4a\x2b\xd4\x75\xae\x34\x2c\xff\x8e\x6d\x57\x5f"
- "\x5a\xa7\xc1\x48\x83\xb9\x84\x51\xe9\xb9\x41\xd3\x17\x3b\x22\xb0"
- "\x2d\x3d\x27\x60\x1d\x7e\xff\xf3\x5b\xa2\x60\x4f\xcf\xa9\x92\x6e"
- "\x96\x62\xfd\xdf\xb0\x50\xae\x29\x32\x8d\x9b\x7a\xf3\xf8\x33\x19"
- "\x4c\xc2\x60\x99\xd0\xcd\xf8\x9c\x29\x68\xdb\xcf\xad\x5e\xdd\x95"
- "\x2d\x92\x96\xfd\x1c\xeb\x5f\x69\xa2\xfc\xae\xd4\x4d\x6d\x89\x6e"
- "\xef\x63\x2b\x9e\x5c\xb1\x72\xf5\x0a\x52\xa8\xad\xca\xb3\x2d\x59"
- "\x99\x95\x6d\x1a\x43\x1f\x62\xa5\x78\xcf\xfe\x4d\x61\xbf\x51\xe5"
- "\x69\x64\x07\x2f\x63\x0e\x94\xdf\x6e\xbb\x91\xf0\xeb\xe7\x2f\x91"
- "\xae\x40\xc4\x7e\x20\x1f\xa9\x52\x6f\xd0\x4f\xdf\x4b\x58\x97\x5f"
- "\x37\xb8\x3a\x47\xe5\xb1\x36\x76\x11\x1c\x55\x99\x83\xf7\xb1\xb2"
- "\x29\xda\x3a\x44\xed\x13\xbc\xf9\x48\x8a\xa0\x8b\xca\x48\x8e\x41"
- "\xc0\x6b\x24\x05\xeb\xcd\xcf\x7d\x5e\xdd\x15\x9b\xd4\x7e\x05\x35"
- "\x78\x50\xff\xc1\xeb\x1a\x87\xf9\x32\xe0\x68\x79\x9a\x5a\x16\xd1"
- "\x4f\x94\xfd\xf3\x56\xcd\x0e\x9b\x7c\x81\xba\x0b\xc8\x0f\x70\x59"
- "\x48\xd9\x48\xf4\xa6\x2c\x5d\xa3\x4b\xb4\x16\x29\x28\xe7\xed\x21"
- "\xdf\x04\xcc\x1b\xb2\xbf\x9f\xda\xc3\x36\x56\xc8\x78\x01\x65\xcb"
- "\x47\xc7\x0b\xd8\x38\x07\xbf\x0a\xf5\xd7\x14\x75\x7f\xa9\x9f\xf6"
- "\x8d\x23\x92\x56\xd6\x76\x51\x9e\x26\xb4\xe9\x60\x98\x5f\x91\xfe"
- "\x48\x55\xff\xc5\x14\xfb\x62\xe3\x14\xf2\xf9\x19\xc1\x8d\xb2\xef"
- "\xa8\x3c\x88\xf0\x3b\x4b\xeb\x2d\xf2\x88\xb3\x2c\x80\x49\x1e\xe9"
- "\x68\xa9\x4f\x7c\x78\x19\x70\x62\x63\x6a\x04\x0f\x24\x8c\x90\x96"
- "\x1e\xe1\x53\x36\x26\xd2\x37\xd1\x70\x40\x1d\xf7\x49\xd9\x74\x63"
- "\x8e\xb6\x66\x93\xbf\x53\x19\x3f\xa2\xec\xe0\xae\xa2\x7e\xc8\xfc"
- "\x1b\x37\x44\xca\x28\x3b\xa8\xea\x22\x0c\x5c\xff\xf3\x59\xdb\x85"
- "\xcc\xb6\x71\x47\x44\x27\x50\x76\x90\xe8\xae\x28\xc3\xd4\x5b\xec"
- "\xf1\x8b\x98\xca\x3a\x2d\x76\x3a\xf2\x76\x68\x3c\x8a\x56\x56\xab"
- "\xd4\x39\x09\x1f\x95\x98\x83\x35\xc8\xe3\x0f\xeb\x63\x91\x16\x96"
- "\x01\x01\xd5\x56\xc1\x7b\x97\x27\x46\x64\xbd\x9f\x8b\xbd\x4b\x21"
- "\x07\xca\x72\xc0\x27\x97\x1b\x2f\x96\xdb\xc0\x3f\xd8\x96\xad\x58"
- "\x06\xf6\xe1\xa7\xf6\x95\xf7\x40\x74\xf8\xa9\x7d\xd9\x3d\x64\xb2"
- "\xf5\xf0\xec\x87\xc4\x15\x93\xe3\x9e\x31\xf4\xc7\x32\xbe\x6b\x86"
- "\xa0\xa9\x24\xe7\x92\xee\x74\x58\xc6\x3a\x9d\xa4\x5e\x8d\xea\x75"
- "\x22\xd6\xbd\x0c\xcc\x81\xdf\x50\xec\x1a\xb4\xa1\x4d\x8d\x2f\xab"
- "\xad\xd9\xa0\xe5\xe5\x3b\xb5\xfd\x2e\x61\xc3\x4e\x7e\x08\x07\x73"
- "\x84\x3e\x0e\x7d\x0a\xeb\x3f\xa4\x7e\x51\xee\x99\x0d\xbb\x9e\x63"
- "\x5a\xba\xa6\x8f\x45\x5a\xa2\xa6\x7b\x95\x79\x9f\x4b\x8e\x7c\x3b"
- "\x4a\xb7\x9d\xa8\xed\xa7\x21\xcf\x1c\x0d\x66\x5a\x39\x4e\x1b\x3f"
- "\xad\xf2\x49\x31\x82\xaf\x76\x95\xdf\x2d\x7c\x7f\x12\x2f\x2e\xf4"
- "\xcc\xcf\x15\x6a\xf5\x90\x8c\x40\xed\x56\xf7\x6e\xc4\xbc\x27\x1f"
- "\x9f\xd2\x47\xe8\x73\xe1\xf1\x1f\xbd\xc7\x31\xf6\xfe\xc6\x48\x01"
- "\x6f\x0d\x0e\xf1\x96\xaa\x2f\x31\x67\x97\x32\x16\x2c\xe0\xcd\x23"
- "\x43\x7c\x97\x88\x51\xfd\x04\x63\x95\x87\x18\x0b\xc5\xfc\xe4\xc4"
- "\x05\xc0\xfd\x91\x73\xca\x69\x8a\x5d\xb7\x1d\xf9\x1e\xf1\x7f\xcd"
- "\xeb\xf1\xcd\x23\x76\x7e\xba\x1e\xf9\x1e\x3e\x75\x9a\x6f\x43\xde"
- "\x87\x73\xd0\xef\x02\x1e\x0c\xc5\x3c\x79\xc2\xf6\x43\xa2\x43\x15"
- "\xb3\x7c\x1b\x0f\x35\x71\x97\xbe\x9a\xaf\xff\xf6\xcd\xc3\xae\x8a"
- "\xd9\xe1\x98\x59\x28\x97\x60\x34\xcf\x41\xf7\x4f\x9e\x40\x9f\x4e"
- "\x64\x62\x0d\xc5\x18\x9c\x40\x3e\xc8\xff\x79\x82\xde\xf8\x62\x6e"
- "\xbe\x02\xbf\x94\xb1\xe8\x3e\xda\xda\x1a\x2a\xe0\x2d\xd5\x8f\xa3"
- "\xfd\x27\xd1\xfe\x21\xde\x8c\x3e\xec\xaa\xea\x63\x8c\xda\x1f\xa2"
- "\x32\x43\x2c\x26\x73\x8d\x6e\xca\x76\xbc\xcf\x74\x24\xb0\xed\xc8"
- "\xfb\xb8\x9f\x4d\xa9\x47\x9e\xc7\x9f\x9e\xc2\x44\xfb\x07\xd0\xee"
- "\xd8\x43\x4d\x21\xd4\x4d\xed\x47\xfd\x03\x5a\x3b\xb5\xfa\xa9\xbd"
- "\x1a\x0e\x66\x92\xbe\xcb\xf4\x45\x2f\xb5\x5b\xea\xf0\x2b\x6f\xf0"
- "\xe5\xe5\x30\x5f\xcc\xb7\x6f\xf6\xb2\x4a\xb2\x63\x22\xdc\x3a\xe1"
- "\x03\x4e\xa9\xe7\xca\x4e\x68\x30\x90\xf2\x64\xe5\x5c\xad\x7f\xd1"
- "\xfd\x9a\xbf\x32\x57\xe8\x51\x17\x2f\xc9\x5f\x56\xb0\x18\xd2\x99"
- "\x89\xd9\x29\x49\xc8\x6f\xd9\x59\xb6\x95\x2b\x6c\x4b\x17\x2f\x5b"
- "\xbe\xb2\x20\x3b\x37\x55\x88\xdc\x79\xd9\x2b\xb2\x48\xbd\x9a\xbb"
- "\x38\xd7\x6e\xba\x88\xe7\x2e\x3b\xd4\xd4\x4e\x71\x4e\x8a\x48\x7f"
- "\x5d\xf3\xb0\xaa\x5b\x0c\x70\x57\xba\x90\xdd\xe4\x3c\xa8\x82\xcc"
- "\x9f\x4e\xef\xef\x93\x6b\x4d\xcd\x5c\x5e\xfe\xc5\x31\xce\x45\x0c"
- "\x66\xdd\x69\x56\xf3\x5d\xd1\xcf\xc1\x39\x5a\x39\xe2\x8c\x86\xe0"
- "\x59\x29\x7d\x64\x0e\x8b\xd8\x6c\xd7\x3c\xcc\xf5\xe8\x23\x60\xa0"
- "\xf2\xad\x8b\xd4\xb3\x73\x7f\xea\x61\x35\x37\xa0\xdf\xb4\x77\xd0"
- "\x21\xf8\x42\x71\xc6\xa7\xe6\x2a\xf0\xbd\x8b\xb8\x6b\xa2\x99\xe0"
- "\x52\x25\xe5\x4a\xbd\x45\x47\xf1\x57\x7b\xe8\xbc\x61\x1a\xed\x11"
- "\x6e\x77\x29\x69\x11\x1b\x99\xca\x0c\xe2\x71\x85\xae\x5d\xcc\x8b"
- "\xaa\x4d\x1a\xbe\xeb\xe9\x0c\xc7\xfa\x69\xdf\x93\xb4\xba\x4a\x9c"
- "\x29\xc2\xb8\x7d\x4f\xb6\x5f\xc4\x83\xc6\xfa\x54\xfd\x0e\xfa\xd7"
- "\xc7\x9d\x73\x54\xbf\xed\xd5\xef\x28\xf1\x33\x13\x42\x79\x56\x35"
- "\x86\xfa\x17\x8a\x52\xfe\xc5\xe9\x10\xd6\x75\x05\xbc\x2a\xaf\x9a"
- "\xf9\x62\xa8\xfc\x8b\x7e\x65\x75\x8a\x9e\xe8\xbb\xd3\x01\xf8\xad"
- "\xcc\x31\xf1\xaf\x73\x26\x87\x56\xa7\x80\x07\xf8\xc2\xc7\x39\xbe"
- "\x35\x75\x32\x11\xf3\xb6\xfc\x8b\xb3\xea\xb3\x9e\x9e\x15\xf0\x6a"
- "\xbc\xbc\xd3\x88\x67\x93\xc2\xa3\xf2\x8f\xce\x6b\xa6\x67\x8b\x4e"
- "\xd8\xe6\xa5\x81\x37\xbe\x9b\xfa\xae\xf5\x59\xc8\x08\xa4\xa7\x08"
- "\xf7\xad\xba\x49\x4b\x27\xde\x55\xf2\x91\x6c\x49\x0f\xab\x76\x4b"
- "\x9a\x16\xce\xf7\xac\x06\x03\x01\xdb\xf2\x2f\x7a\xbd\x18\x3f\x11"
- "\x17\x7e\xfd\xb5\x37\x73\x7d\xe5\x93\xb4\x76\xcc\x0b\x89\xbd\x2c"
- "\x26\xf7\x3e\xaa\x7b\x35\x78\x92\x2d\x3a\xad\x1f\x18\xb7\x94\x4c"
- "\x1f\x33\xc9\xf9\x5b\x63\x88\x92\x51\x06\xb8\xc0\xf7\xea\x3a\x51"
- "\xaf\xde\xb8\x5e\x3e\x57\xa9\xbe\xcc\x6b\xd2\xb4\xbc\x48\x9b\x25"
- "\x79\xd2\x2a\x03\xc9\x6e\xb4\xb7\x45\xf7\xf5\xe3\x9c\x93\x2c\xaa"
- "\xe3\x9c\x68\x21\xd1\x66\xdb\x34\xc6\xda\xfd\xc4\xb7\xd7\x54\xec"
- "\xa9\xf3\x33\x31\x7e\xa6\x2f\x8e\x0d\xf2\x1c\x06\x7e\x65\x4c\x3e"
- "\x95\xbe\x41\xfe\x36\xc1\x83\x03\x9f\x15\xe0\x33\xbe\xe9\x23\x7c"
- "\x2d\x3a\x47\xed\x78\xde\xd8\x5a\xd8\x4f\x7e\xdc\x81\x87\xcf\x1b"
- "\x09\x36\xb4\x36\x54\xb9\xc4\x19\x39\x41\x83\xdd\x05\x77\x51\x19"
- "\xe7\xe2\x03\xcc\xd0\x0e\x0a\x0a\x78\x07\xec\x45\x6c\xca\x49\xe4"
- "\x37\xe4\x33\x23\xc9\x47\x7f\xeb\x3e\x32\xea\x9b\x2d\x61\xf2\xfc"
- "\x6c\x8d\x07\xc2\xfd\xfc\xd1\x67\x41\x9f\xff\xc6\x59\xd0\x27\x56"
- "\xae\xcc\xcf\xcc\xcd\xa6\x4b\xca\x0d\xab\x6e\xba\x78\x4d\x34\xcb"
- "\xb8\x39\xcf\xe7\xd0\xf8\xd1\x3a\x21\xcf\x54\x3c\xdf\x18\x25\xd7"
- "\x92\x6e\xed\x5e\x5a\xdf\x68\x4f\x1c\xef\x5a\x3f\x2c\x5c\x27\xf8"
- "\xaa\x23\x46\xa6\xbf\xb8\xbe\xa5\x8b\xf3\x17\x2f\xff\x9e\xdc\xbe"
- "\x1d\xa3\x9e\xce\xd1\xf5\xbc\x90\x10\xae\x47\xca\x20\x7e\x31\x07"
- "\x2b\x67\x16\xf3\xb8\xc9\x36\x49\xe7\x5e\xb8\x4b\xb3\x71\x1a\xdb"
- "\xf7\x44\xe7\xc2\x50\xf9\xb1\x0e\x1a\x2f\xe7\x3a\xa6\xff\xf5\xda"
- "\x4e\x3d\xf1\x5f\x45\xb8\x27\x9b\x13\xa1\xe7\x53\x63\xda\xbd\x7f"
- "\xb6\x13\x74\xf6\x85\x32\xbe\xb1\x73\x21\xf0\xaa\x78\x3c\x3b\x93"
- "\xe8\x73\xbb\x72\x8f\xf2\x85\x86\xf1\xf2\xf2\xb2\x9e\x1c\x39\x57"
- "\x5e\x38\x27\xf6\xca\xa6\xb1\x9f\xf7\xb0\x17\xce\x18\xac\x90\xe3"
- "\xa6\xb1\x37\x70\x2f\xe4\x05\x7a\x37\x6a\xac\xaf\x1b\x68\x30\x00"
- "\x3b\x81\xa5\x3a\x2e\xff\xc0\x84\xc9\xbf\x18\xfc\xf4\x5c\x27\xac"
- "\xdf\x63\x00\xe1\x49\x13\x0d\xcc\x12\x6f\x36\x4e\xbf\x3e\xc9\x7a"
- "\xef\xf7\xef\x9e\xe5\x2c\x2a\x74\x70\x25\x18\xb0\xf0\xa8\xf8\x8b"
- "\x15\xa6\xb6\xc7\x6e\x2a\x96\x6b\x45\xa5\xa9\x6d\xac\xb6\x56\xba"
- "\xb8\x9d\x78\x6b\x25\x7e\x86\xcf\xb9\x8a\xe9\xdf\xbe\xe0\xd5\x13"
- "\x2f\x47\xeb\x8f\x27\xf8\x15\x64\x82\x17\x4b\x3e\x40\x1a\xfa\xef"
- "\xe0\x15\x33\x7c\xf2\x6c\xc3\x8b\x1f\x2a\x55\x33\x7c\x91\xf2\x0d"
- "\x8c\xca\x87\xbc\xa0\xdf\x51\xd4\xaf\xf7\x18\xbe\xcf\x3c\x36\x3f"
- "\xfb\x00\xf7\x63\xc2\x12\x75\x92\x6e\x8a\xca\x00\x1d\x2e\x73\x9e"
- "\x07\x7d\x76\x08\x3d\xb1\xfe\x34\x7b\xf1\x7c\xf3\x38\xdf\x89\xbd"
- "\x1e\xd3\xa1\xc7\x87\x5d\x9b\x30\xfe\xff\x52\xa1\xf2\x43\xe0\xd7"
- "\x36\xcd\xd6\x68\x02\xde\xff\xbb\xd4\x57\x6f\xca\xd0\xf2\x8c\x2d"
- "\x4f\x92\xcd\x24\x77\xd3\xb8\xf2\xa1\xfe\x7e\xf2\xe1\x36\x8e\x4e"
- "\x60\x36\xd6\xe7\x75\x34\x8f\xe3\x4a\x12\x26\xc6\x97\xa4\x3d\xb5"
- "\x1f\xeb\x5f\xdc\xc0\x55\x2c\xde\xff\xef\xd4\x66\xb2\xdb\xed\xd8"
- "\x06\xde\x97\xf6\xa9\x2c\xba\xb4\x65\x96\x92\xb4\xc5\x21\xd7\xdd"
- "\x77\xd2\x3a\x69\x71\x3c\xa4\xb3\x04\xef\xd3\x05\x5d\x77\xdd\xb9"
- "\x5d\xc6\x3c\xf1\xd7\x4c\xe5\x9d\xf8\xa6\x1b\xdf\x78\xf1\xeb\xc5"
- "\x77\xfb\xfb\xd8\x4b\xd7\xe0\xda\x66\xd1\xf1\xed\x16\x8c\xe4\x6d"
- "\xc5\x22\x06\x24\xd1\xe8\xfd\xdc\x04\x1e\x73\x44\xe8\x02\x26\x44"
- "\x74\x01\x2f\xdd\x8d\x71\x9b\x38\xf7\x59\xfe\x01\xca\x6a\x0b\x0d"
- "\x29\x6d\xf5\xa7\x19\x53\x75\xde\x07\x31\x47\x0f\xa6\x6e\x62\x56"
- "\xd5\xf6\x52\xbf\x3f\xd8\x46\xb4\x98\xce\x2e\xb7\xa2\xce\xdd\xf8"
- "\xb5\xd8\x56\xb0\x98\xd3\xec\xa5\x4a\xe2\x3f\x22\x3c\xec\x2f\x26"
- "\xa8\xf2\x88\xfb\x56\x7c\xbf\xee\x29\xc2\x89\x7e\x7d\x10\xe5\x83"
- "\xe7\x6f\xf3\xe4\xb4\x09\x5b\x18\xb2\x6d\xa6\x3c\xa8\x23\xc5\x13"
- "\x68\x63\x0a\xb7\xea\xf1\xdc\x42\x76\xca\x1c\x79\xdb\x1d\x9d\xac"
- "\xdd\x1e\x00\x8d\xdd\x0f\x1e\x38\x25\x19\xed\x11\xe5\xe1\xfd\xc1"
- "\xb7\x31\xbe\x36\xf0\x7b\x28\xaf\x83\x6c\x6b\xe8\x0c\x30\xcf\x4b"
- "\xb9\x11\xdf\xb7\x42\x86\xd6\x53\xf9\xa7\xd9\xcb\x2f\xf1\xc1\x94"
- "\x94\xdb\x06\x64\x4c\xc4\x1e\xf6\xf2\x72\xb4\xb3\x28\xd2\xce\x97"
- "\xcf\xa1\xfd\x06\xd0\x55\x37\xca\xdc\xcd\x0b\x50\x67\x2f\xea\x84"
- "\x3c\x02\xfc\x4d\x86\xbc\x6b\xa0\x36\xb7\x53\x7b\x1d\x21\xc6\x57"
- "\xa7\x18\xaa\xcf\x32\x03\xe6\x82\x7b\x3b\xae\xe8\xff\x2e\xf0\x64"
- "\x49\xc3\xae\x97\x8b\xb5\x73\xe4\xc4\x4b\xe0\xb9\x46\xc3\xa5\x4a"
- "\xe4\x41\x1b\x5b\xd0\xae\xdd\x71\x03\x8c\x64\x9c\x09\xc0\xd3\x09"
- "\xa8\x77\x12\xc6\xaa\x05\xb0\x7b\x1a\xb0\xde\x4d\x7d\x52\x86\x94"
- "\x7e\x05\xe5\x55\x0f\xa1\x4d\x79\x56\x83\xb9\x97\xe2\x45\x0f\x73"
- "\xc0\xfb\xe0\x3c\xc7\x30\x27\xbb\x53\xb2\xe1\xc4\x37\x0f\xa3\xaf"
- "\x58\xef\x7e\x91\x4a\xf2\x06\xfa\x71\x97\x8c\xe9\xf8\xf2\x2c\x75"
- "\x4f\xeb\xa0\xd4\x33\xbd\x54\x49\xb0\xa7\x7e\x99\x4b\x12\x4a\x3d"
- "\xfd\x3e\x66\xee\xbd\x0a\xeb\xdb\x4b\xcd\x75\x0a\xf1\x28\xbf\x08"
- "\xeb\xff\xc7\x99\x63\x01\x0f\xe8\x8b\x32\xc4\xfb\x89\xf7\x94\xf6"
- "\x2e\xbf\x58\x9e\xe9\x88\x49\x07\x9f\xa9\x47\x3b\xe9\x3c\xc4\x54"
- "\xac\xd3\xf7\x92\x3d\x13\xda\x07\xb9\xe3\x17\x15\x97\x8a\xa5\x0a"
- "\xf8\x58\x91\xa7\x19\x6d\x9f\x2d\xe0\x55\xc0\xeb\xa4\xae\xe7\x17"
- "\xad\xda\x79\x7e\x3e\xc4\x0b\xab\x8b\x44\xbd\xc5\x1b\x0a\x44\x1d"
- "\x14\x5f\xb3\x3f\xdf\xc6\x8f\xb4\xda\x7c\xe3\x9e\x99\x8e\xb2\xe3"
- "\xf1\xa9\x31\xbb\xc4\x9e\xe6\x68\x3b\x9e\xda\xd4\x28\xb9\x91\xf6"
- "\x35\x8b\x69\xef\x56\xfa\x5d\xa9\x15\xf6\xca\xf3\x1c\xd2\xbf\x84"
- "\x27\x30\xa0\xf2\x96\xb5\x6b\x44\x1c\x1f\xe2\x6b\x84\xed\xcf\x49"
- "\xd5\x5e\xa7\x76\x0a\xd5\xd1\x7a\x51\xac\xe0\xec\x15\x8b\x9f\x58"
- "\x9e\x2d\x55\x29\xb7\xfc\x2c\x7f\xf1\x4f\x47\xf3\xbf\x06\x21\x17"
- "\xbb\x6a\x37\x48\xdd\x64\xed\xee\x28\x3e\xd1\x10\xd6\x2d\xe9\xd9"
- "\x2e\xa9\x5f\xaa\xed\x1e\x4b\xbf\xf4\xd0\x4f\x57\xac\xcc\x15\x75"
- "\x08\xd3\xa6\x6c\x79\xba\xc8\xc4\x1e\x9b\xfd\xd0\xec\x5b\xf2\xb2"
- "\xf3\x45\x70\x0e\xa9\xcc\x59\x9c\x95\x95\xab\x1a\x3e\x2d\xa3\xaf"
- "\xe8\xcd\xd2\xd5\xe2\x53\xfb\x93\xf9\xd2\x64\x2a\x6f\xf9\xe2\x82"
- "\x6c\xb5\x88\xe8\xb6\x26\x11\xbd\x6c\xad\x13\x32\xb3\x49\xee\xd3"
- "\x6e\x5e\x1e\xb5\xaf\x13\x2d\x47\x5e\x83\x77\x65\xda\x3b\xfb\x4c"
- "\xc2\x95\x2d\xd7\xb4\x37\x08\x9f\x08\x86\x3d\xff\x41\xf0\xdd\x7c"
- "\x8e\xfc\xc9\x63\x6d\x2b\xa3\xf8\xa7\xea\x1e\x28\xe8\xf5\xe6\x4f"
- "\xc1\x6f\x97\x01\xbe\x8e\x79\x21\x85\x83\xa6\x3a\xbc\x6c\x5b\xab"
- "\xaa\x43\x30\x2a\xfa\xda\x7e\xb2\x5f\xa9\x17\x7a\x84\xcd\x03\x11"
- "\x3d\xc2\xb6\x56\x5a\xd7\x31\xde\xbd\xd4\x36\x6a\xe7\xb0\x6b\x8b"
- "\x39\xca\x76\x00\x7c\xe5\x66\xb1\xd7\x45\x7b\xdc\x22\xd6\x03\xf8"
- "\x27\xf5\x5c\xb9\xbe\xfd\x3f\x68\x1d\xaa\xbb\x8b\x68\xae\x52\xd6"
- "\x53\x2c\xe7\xcc\xd6\x87\x79\xf9\xa1\xcc\xdb\xfc\x2c\x51\xd2\x8c"
- "\x2d\x9b\x91\x7e\xe5\x69\xb6\x25\x1f\xe9\x8b\x40\x77\x26\x10\xef"
- "\x22\x75\xe5\x5b\x36\xab\x7a\x05\x82\xcf\x84\xa8\x36\xd4\x44\x74"
- "\x0f\xdb\x5a\x7d\xb1\x3d\xc5\x1b\xa4\x6d\x80\xd8\x07\x95\x7b\xd1"
- "\x5b\x76\x85\x65\x6d\xd4\xad\xee\xfd\x25\xf6\x21\x3f\x60\x51\xac"
- "\xee\xc7\xa1\xef\x9b\x49\x9e\x50\x6d\xba\xb6\xf4\x47\xf3\xc0\xd2"
- "\xb7\xfe\xa1\x4c\xe2\x9b\xa5\xcc\xb0\xf5\x2a\xc1\xe7\x90\x9e\xe3"
- "\x02\xc1\x7b\xeb\x4d\x78\x8f\xb5\x6e\xab\xcd\xcb\x6a\x6b\xb5\xf6"
- "\x50\x9b\xf3\x1d\x60\x06\xf0\x1d\xad\x7d\x68\xd3\x24\xe4\x99\x1d"
- "\x69\xf3\xd6\x44\xc1\x37\xf3\x0c\x55\x17\xb9\xb5\x45\xea\x9b\x7a"
- "\x6a\xa2\xc6\xcd\x70\x9a\x6d\xdd\x8c\xb6\xd6\xac\x97\x7b\xf0\x13"
- "\xb4\xbd\x6d\x94\x35\xaa\xff\x11\x5d\xd0\xe6\xeb\xa5\x2e\x68\x6b"
- "\x73\x64\x0c\xb7\xe6\x13\xde\x93\xfd\x82\x66\xbb\x40\xe3\x29\xe3"
- "\x0e\x6c\x0d\xdb\x7f\x29\xa6\x1e\x3b\xc9\x4a\x55\x72\x1f\x0e\xe3"
- "\x52\x77\x4d\x8c\xee\x88\xd8\x8b\xbd\x2d\xc0\x1a\x90\x36\x11\x69"
- "\x71\x94\x8f\xea\x14\x3a\x13\xc0\x86\xfa\xa2\x80\x1f\x8f\xb1\x4e"
- "\xbc\x6f\xd8\x55\x97\x02\x9e\xaf\x37\x82\x1b\x5b\xc5\x9e\x5c\x95"
- "\x0a\x6b\xee\xda\x7c\x67\x44\x7e\xab\x5b\x10\xde\x73\x42\x39\x91"
- "\x35\xa3\x6e\x0d\xc1\x98\xea\xb5\xaf\x25\x9d\xf4\xb6\x26\xd1\x0e"
- "\xb9\xaf\xf3\x47\x8c\xdf\x36\x0e\xfe\x82\xd6\x5a\x92\x25\x68\xec"
- "\x29\xaf\x8c\x05\xb4\x8d\x74\xec\xa4\x3b\x7d\x19\xf7\x3f\x52\xf4"
- "\x63\xe1\x4e\xdd\xfe\x68\x3b\x43\x09\xff\x6d\x89\x0a\x95\x89\xfe"
- "\x53\x59\x58\x7f\x74\x9a\x7e\x45\x2d\x77\x02\xca\xfc\x45\x9f\x0a"
- "\x6b\xb1\xa7\x50\xae\xc2\x81\xc6\x58\xc0\x7c\x5b\x32\x68\xae\xd0"
- "\xff\x38\x1b\xf8\xa9\x95\x28\x43\xc6\xe8\xdc\x36\x9b\x13\x6c\xd5"
- "\xfc\x3e\x92\xc1\xd0\x76\x79\xb6\x0a\xb8\x08\x39\x86\xda\xa9\x94"
- "\xf7\x38\xa8\xed\xb4\x9f\x10\x91\xab\xb7\xad\xa1\x6f\x7d\xcf\xc8"
- "\x6f\xaa\xe5\x7e\x07\x8d\xcd\x3b\x7c\x75\x0e\x53\xf5\xec\x58\xa7"
- "\xb6\x16\x13\xde\x53\x39\x7e\x21\x5f\x6d\xab\x51\x00\x17\x8c\x09"
- "\xe0\xbc\x6d\xb7\x36\x26\x5e\x56\xe7\x18\x8f\x1f\x96\xfe\xf3\xb7"
- "\xf5\x6b\x3e\x5a\x68\x6d\xc2\x1c\x2e\x96\xbc\x64\xfd\x9b\x96\x92"
- "\x7b\xb9\x25\x78\xe7\x9d\xc4\x1b\x6d\xd7\xf3\x40\x94\x1d\xdd\x74"
- "\xc0\xe9\x6b\xcd\xa6\x58\x59\xff\x93\x4e\xb2\x41\xf4\x04\xa4\x0d"
- "\x22\xa5\x3f\xe2\xe7\x4a\xbb\x3f\x44\x36\xf5\x9d\xc3\xae\xfa\xb9"
- "\x9a\x1c\x44\xf4\x2d\xa6\x44\x07\xd8\xd5\x2f\xf2\xb2\x17\x97\xab"
- "\x74\x6d\xd2\x49\x56\xbf\x51\x2d\x3f\xba\x0d\x06\x29\x47\xd6\x37"
- "\x4a\x79\xaa\x7e\x13\x68\xcf\x6c\x29\x4f\xd5\x37\x68\xed\xc6\xfb"
- "\xe5\x17\xf7\x71\xfe\x03\x0f\x65\xdb\x96\x13\x89\x4e\xbb\xc3\x61"
- "\x4b\xb9\x21\xeb\x36\x61\xb4\x6a\xfb\xa7\x07\xbe\x67\x9b\x7f\xcf"
- "\x0d\x8e\x9c\xd4\x47\xe4\xe5\x81\xf9\x73\xe9\x7a\xd1\x1e\xa6\x6d"
- "\xd8\xb5\x9d\x8d\x96\xd7\x76\xa8\x6d\xd8\x6e\xf5\xea\x6e\xea\x14"
- "\x38\x6c\xec\xac\xa5\x38\xe8\x58\x53\x07\x88\x4f\x9e\x17\x3a\xcc"
- "\xf9\xc6\x8f\xbc\x3c\xb6\xb3\xd6\x17\x67\x6a\xc3\xaf\xc6\x17\x7b"
- "\x68\x03\xc5\x49\xb7\x94\xf0\x80\x25\x38\x49\xd2\x4a\x3c\x83\x27"
- "\xe9\x07\xdf\x43\x63\xc9\x1e\xbc\xc9\xc9\xe7\x85\xb8\x07\xfc\x0f"
- "\xe0\xb2\xdd\xa1\xad\xe3\x42\x07\x55\xd6\x59\x3b\x0f\x5c\x26\xe1"
- "\x0e\xf8\x03\x23\xe4\xa1\x5a\xd2\x43\x21\x1f\xfa\xff\xa2\x57\xc2"
- "\x62\x7b\x13\xc6\xbf\x43\x85\xef\x7c\x3c\x63\xfc\x67\x89\x79\xa6"
- "\xb8\xac\x62\xad\x50\xd6\xdf\xfc\x28\x64\x81\x1a\xad\x4c\x94\x65"
- "\x56\xe3\xba\x8a\xf2\xd8\xdf\x78\xfe\x59\x29\xef\x6a\x22\xdd\x05"
- "\x9d\x2f\xb4\x38\x74\x14\xc7\x27\x23\xac\xaf\xc1\xbb\xf8\x92\x04"
- "\xd2\xe1\x64\xc4\xfb\x75\xc5\x94\x27\xa2\xd7\x50\xbc\xd5\x7a\x25"
- "\x00\x7e\x22\x41\xc6\x2c\x1f\x50\xf7\x75\x1b\x72\xc2\xfb\x04\xa3"
- "\xc6\xbe\x41\xe0\xc3\x59\x97\x01\xe3\x50\xef\x9b\x99\x28\x79\x27"
- "\xc5\xa5\x63\xf2\xcc\x79\xc3\xbf\x8b\x79\xa9\xe2\x23\xe0\xeb\xa3"
- "\x3d\x3c\x4b\x90\xfb\xc8\xde\x5d\x89\x01\x4e\xb2\x93\xcc\x53\x38"
- "\x5c\x4c\xe7\x5e\xc3\x78\x69\x07\x5e\xda\x81\x97\xb4\xdf\x8a\xfa"
- "\x7d\x31\x37\x2f\xc2\x9c\xd5\x9d\x64\x0d\xa9\xd4\x7e\x82\x0d\xf8"
- "\x77\xb3\x02\x58\x09\xbb\x3a\x82\x8f\xe9\x2f\xa9\x74\x5e\x89\xfa"
- "\x6a\x09\xa2\xcf\xd1\xfd\xd2\x2b\xde\x2a\x17\xfa\xa5\x47\xbf\x1c"
- "\xa7\x84\xde\x80\xce\x91\x81\x96\x4c\x8d\xc4\x82\x78\x65\x6e\x74"
- "\x1f\x15\x8a\x1f\x23\xfa\xf0\xca\x53\x63\xf5\x91\xeb\xa9\x8f\x04"
- "\x83\x57\xee\x53\xf7\x5b\x44\x3b\x89\x6e\x0d\xb0\x57\x58\x7c\x09"
- "\x9d\xdf\xea\xac\x05\xdf\xfb\x00\x8d\x61\xbd\x8b\xd7\x50\x3b\xc7"
- "\x1a\x2f\x2a\x4f\x96\xf5\x1f\x66\x4b\x49\xf1\x22\xb4\xa5\x73\x6c"
- "\x78\xbf\x72\xfe\xd2\xf0\x7e\xe5\x00\x7d\x4f\xed\xa0\xb3\x68\x16"
- "\x72\x54\x04\xfc\x06\x5f\x51\x36\x56\xbd\xf1\x25\x0d\xd4\xae\x31"
- "\xdf\x01\xf7\x07\xaa\x73\x47\xcf\x09\xa5\x3e\xc0\x08\x7e\xdb\x91"
- "\x2e\x75\xb2\xff\x51\x1c\xd6\x1d\x97\x75\xba\x2d\x3a\x5b\x0c\xcd"
- "\x31\xc1\x13\xa3\xbf\x63\x95\x6b\xd1\xd5\x90\xaf\xb3\x07\x40\xab"
- "\xc6\x7c\x8f\x79\x60\xe3\xeb\xbf\x3d\x13\xe5\x6d\x88\x2f\xd1\x71"
- "\x5f\xcc\xb7\x4d\xf1\xfe\x60\x32\xc1\x15\x6d\x75\x60\x8e\xbf\x24"
- "\xd6\x6e\xa1\xcb\x78\x15\x70\x78\x5b\xc4\xaf\xf4\xc5\x76\x6e\x90"
- "\xf6\x09\xaf\x26\x7a\xd9\x6f\xfb\x23\xb6\x46\xaf\x26\x7b\x75\x93"
- "\x25\x7f\x1d\x73\xed\x16\xac\x69\x90\xfd\x2c\xdc\xb6\xd6\xc2\xfb"
- "\xd8\xab\xef\x29\x3c\x45\x8f\x75\xeb\xee\x08\xee\xc8\xf3\x6e\x1a"
- "\xee\xe0\xfb\xac\xb1\xf1\xe2\xd5\x67\x2f\x8d\x17\xaf\xfe\x48\xd5"
- "\xf5\x2d\x92\x36\x80\xaf\x36\x69\x32\x07\x5f\x7f\xed\x16\x5b\x91"
- "\xa8\x3f\x5d\xd6\x0d\x98\x04\xd3\x89\xce\xcc\x05\xdc\x8a\x91\xb7"
- "\x53\xa3\x0d\x84\x43\x96\x10\xc9\x43\x4c\xe0\x39\xde\xf9\x41\x7b"
- "\x6a\xe5\xfa\x7c\x38\x95\x78\x55\xc5\x55\xbf\x0b\xeb\xd7\x56\xb2"
- "\x81\xf7\xc7\x76\x61\xbd\xd8\x61\xf5\xb2\xe3\x6a\xbc\xeb\x4e\x94"
- "\xd1\xc5\x36\xc9\xf3\xec\x46\x11\x7b\x0c\xf3\x9c\xe2\x8d\xd1\x5c"
- "\x47\x5a\x22\xda\x4d\xb1\xc7\x20\x23\xec\x98\xaf\xad\xfd\x8a\x2b"
- "\x9d\xe0\x2d\xe8\xa9\x9e\xf8\x61\xc0\xee\x25\xbd\xd2\x38\x74\x9b"
- "\x95\x51\x9f\x87\xd6\x4f\x6b\xfc\xf9\xad\xcc\xf0\x91\xf5\x09\x66"
- "\xbf\x83\x25\x96\xfc\x83\x81\xfd\xf7\x2c\xa6\x27\x38\x78\xd9\x8e"
- "\x45\x12\x76\x3b\x1a\xb4\xf1\xf1\xb2\x57\x45\x9c\x2e\xd2\xc1\xcf"
- "\x0b\xf2\x41\xb9\xa7\xb0\xc3\x8d\x35\x50\xdd\x3b\xdb\x6e\x1e\x63"
- "\x7d\x78\xd0\xb6\x2c\xcf\x96\xb5\x72\xf5\x8a\x19\x33\x4c\x63\xc8"
- "\x12\x3b\x0e\x4a\x59\xe2\x35\x63\xb4\x2c\x81\x67\xf4\xbf\xbe\xff"
- "\x62\xd9\x61\x6e\xa6\xea\xa6\x20\x33\x8d\x45\xee\x6f\x67\x73\x6f"
- "\x8f\x7a\xbc\x93\xcd\xbd\xe3\xce\xcc\x47\xb3\x17\x67\xad\x89\x4a"
- "\xfd\x4e\xb4\x9e\xaf\x7a\x0b\xea\x8e\x99\x76\x3f\xe8\x87\xee\x91"
- "\x67\x68\xdd\x79\x2d\x54\x14\xe4\xc7\x81\xbb\xb3\xc8\x37\xd0\x81"
- "\xfc\x20\x3b\x00\xfa\xc6\xaf\x25\xba\x3e\x49\xfa\xc7\x0c\x31\xd2"
- "\xa3\x59\xd0\x77\x1f\x64\xba\x73\xd2\x06\xfc\xf5\x19\xed\xb5\x01"
- "\xd0\x89\x43\x15\x92\xdf\x79\xad\x1b\xe9\x53\x90\x3e\x41\xda\xb1"
- "\xbc\x1e\x0b\x79\x39\x5d\xf8\x42\x28\x20\x5f\x08\xaf\x9d\x21\x18"
- "\xdd\xea\x2f\x66\xd2\x27\xd7\x6b\x9b\xc8\x57\xb6\x97\xbd\x3e\x9b"
- "\xf8\x0b\xca\x8b\xb4\xaf\x6c\x3f\x63\x69\x74\x25\x7e\xd8\x8b\x32"
- "\xf9\xc6\x43\x15\x7c\x6b\x06\xed\xed\x27\xa3\xcc\xfb\x88\x6f\x8b"
- "\xb1\x4e\x0a\x0d\xbb\x5e\x4f\xd7\x78\x10\xb2\x37\x1d\x8f\xff\xd0"
- "\xd6\xc1\x78\xd0\xef\x78\xbf\x85\x67\x92\x6f\x11\x1d\x4b\xa6\xf5"
- "\xc1\xe2\x98\x2f\xce\x28\xd1\xba\x48\x34\xa1\x5e\xd0\xd2\xd7\x6b"
- "\x35\xba\x50\x25\xe5\x51\x13\x7d\x8f\xf5\xf3\x6b\xb9\x7e\xbe\xde"
- "\xa2\xcd\x05\xdc\xb7\x6a\xb8\x3a\xea\x9c\xcb\x8a\xfc\xec\xdc\xec"
- "\x2c\xdb\x0d\x79\x26\x16\x15\xc9\x31\x27\x7b\x85\x2d\x37\xfb\xe9"
- "\x55\xd9\x79\x42\xd0\xa3\xb7\xa3\xf7\x58\x40\x83\x22\x71\x75\xc5"
- "\x59\x9b\x37\x6e\x22\x59\xd8\x52\x32\x43\xe8\xd3\x05\x6f\x64\x9e"
- "\x69\x54\xaa\xe2\xd2\xa5\x3e\xf2\x24\xe0\xda\xa8\xfa\xd4\x3d\x54"
- "\x48\x7c\x5c\x1f\x6b\xbc\x47\xee\xd9\xbf\xb1\x4a\xc2\xca\xf8\xec"
- "\xb0\xeb\x8d\xe5\x11\x7e\xad\x51\xd8\xbf\x4a\xdb\xb9\x37\x36\x00"
- "\xc6\x59\x11\x1e\xa4\xf1\x14\xd1\x41\x41\x0f\xff\x0a\x2d\x54\x79"
- "\x67\xd4\xd3\x78\x3b\x2f\xe0\xbd\xd5\x17\x98\xd0\x07\x92\x8f\x75"
- "\x49\x5f\xdf\xf0\x6a\x70\x04\xff\xd2\x4b\x7a\x07\x4d\x3e\x9a\x17"
- "\x3c\xcf\x8b\xd6\x30\x3d\xe9\x1e\x40\x43\x6a\xde\xca\xf5\xe9\xb9"
- "\xeb\xf5\x0e\xf0\x32\x85\x94\xa7\x5e\xb5\x21\xe3\xb1\x87\x1c\xc3"
- "\xae\xc6\x94\x88\xdc\xd1\x38\x20\xf8\xf8\x0b\x84\x37\x6f\xec\xcf"
- "\xa4\x35\x42\xd2\xee\xc9\x7f\xad\xbd\xdc\x24\x75\xee\x92\xbe\x35"
- "\xe6\xa8\x7d\x18\x20\x9a\xa5\xda\x20\xea\x25\x5e\x37\x0e\x00\xe7"
- "\x0a\x69\x2c\x40\xe7\xcb\x34\x78\x51\x7f\xa9\xed\xa4\x57\x06\x1d"
- "\xae\x79\x7b\x6d\x40\x2f\x63\x20\xbe\xde\x2d\xe5\xa3\xc6\x8e\xa8"
- "\x79\x6c\x94\xb2\x50\x63\x6f\xc4\xdf\xc0\x1b\xdf\x88\xc3\xb5\x72"
- "\x05\x1d\x6b\x79\x32\x73\xf5\xe2\x27\xb3\x33\x57\xd9\x53\x6d\xab"
- "\x56\x88\xad\x39\xa1\x06\xc8\x5f\xb5\xe4\x49\x1b\x51\x91\xcc\xd9"
- "\x73\xe7\x66\xde\xff\xd8\x0f\x7e\x64\x62\xf7\x2f\x46\x5a\xfe\x4a"
- "\xdb\xdc\xb4\x54\xf9\xea\xd1\x07\x1f\xf8\x61\xe6\x03\xf3\x1e\x7b"
- "\x64\xc1\x18\xb6\xb1\x66\xe0\x84\x03\x63\x34\xa1\x87\xfd\xea\x6e"
- "\x69\x0b\xf1\xa6\x63\xb4\x2d\xc4\x9b\x80\xd5\x9b\x4d\xf8\xb5\x31"
- "\xf6\xab\x64\xfc\xee\xc6\x2f\x4d\xe2\x4d\x2c\x68\xe0\x9b\x3b\x22"
- "\x78\x43\xef\xa4\xbd\xb0\xd4\xbd\xbe\x09\xfa\xf7\x7a\x30\xfa\x5d"
- "\x84\x16\xfc\x72\xa7\xa0\x97\x2a\x5e\x10\x3e\x64\x06\x8d\x02\x37"
- "\x24\xbf\xf2\x66\x50\xc3\x0d\x71\xde\x0e\xe9\xa4\x33\xa3\xf7\xdc"
- "\x3c\xc3\x4f\xfa\x65\xe0\x82\x83\xf6\x45\x29\x9d\xc7\xcd\x50\xed"
- "\xef\x7e\x79\x17\xe9\x9b\x89\x9f\x55\xf7\x4f\xe2\x4f\xb2\x5f\x3e"
- "\xcd\x5d\x8d\x01\x29\x0b\xbe\x79\x93\xc0\x9b\xf5\xd3\xee\x17\xfb"
- "\x50\xe2\x5c\xc3\x2f\x73\x22\xf8\xf3\x2b\x3a\xd7\x20\xe8\x82\xa4"
- "\xbd\xbf\xdc\x70\x91\x1e\x27\x06\x69\xb5\x9a\xbf\xea\xfc\x19\x4c"
- "\x6f\x98\x51\xc3\x36\xe9\x39\x78\x85\x5f\xce\x91\xf6\x70\xbf\x6c"
- "\xd1\xf8\x67\xdc\x63\xfe\x1f\xb5\x5f\xac\xff\xaa\x8a\xd2\x7f\x15"
- "\xd9\xf9\x91\x76\xbb\x8f\x78\x64\xb7\xc7\x27\xfc\x24\xde\xdb\x6e"
- "\xf7\x93\x6f\x3d\x53\x1f\xfb\x55\x9c\x33\xc4\x2f\xe0\x7e\x1a\xfa"
- "\x26\xd6\x90\xdb\xa4\x4e\x01\xf2\xd8\xaf\xee\x91\xb2\x89\x4c\x27"
- "\xb8\x7b\xd9\x9b\x64\xc7\x64\xa0\xf1\xc1\x7d\x2d\xc6\x28\x7d\x2c"
- "\xba\x17\x5f\xa2\x57\xfd\xd1\xfc\xea\x79\x92\x51\x09\x56\x2f\xea"
- "\x95\x9c\x17\x5d\xf8\xe1\x4a\xb4\x2f\xc2\x5f\xf2\x80\x84\xed\xaf"
- "\x6a\x5a\x1d\x03\xb4\x6e\x06\xc6\xb5\x53\x2c\xe0\xdd\xda\x78\xce"
- "\x0b\xf9\xee\xa5\xf1\x1a\x76\xfd\xaa\x4d\x1b\xcb\xc1\x1b\x57\xa6"
- "\xc5\x94\x30\xdb\x9e\xba\x3b\x28\x1d\xf3\xff\x57\x73\x54\x3b\x4c"
- "\xff\xc5\xdf\x82\x0e\xa7\xcb\xef\x9b\x8c\xda\xf7\x17\xfb\x39\x15"
- "\x07\x05\x49\xc9\xf5\x3d\xa1\x0a\x4b\x51\xc3\xd2\x8e\x3a\xf3\x43"
- "\x67\x39\x5b\x25\x4e\x6a\x3a\xb8\x04\xd9\x9f\x9d\x90\x25\x20\x7f"
- "\x97\x7f\xbe\x56\xd5\x03\x60\x6e\x37\xbd\x76\x2b\x63\xcb\xfd\xab"
- "\x33\xc2\x3a\x14\xd2\x7d\x90\xef\x32\xb4\xa3\x26\x4a\x47\x16\xb6"
- "\x15\xf3\xb2\x9d\x24\x13\xd7\xa0\x9c\x42\x2a\x87\xe6\x95\xd4\xdb"
- "\x34\xb9\x3d\x7e\xc6\x50\xde\x0a\xb1\x07\xea\x6a\xb2\x0a\xdc\x83"
- "\xac\x2d\xe4\xfc\x42\x7e\x5c\xb5\xa5\x10\xbc\x8b\x3c\x17\xd4\xe4"
- "\x0f\xeb\x82\xc4\x19\x99\x26\x3b\xd9\x87\x0e\xbb\x76\x9a\xc7\xd2"
- "\x17\x82\x3e\xe4\x2c\x5e\x91\xb5\x72\xe9\xd2\xbf\x4e\x1a\xa2\x6d"
- "\x36\x6b\x5c\x4a\x19\xca\x84\xfc\xbb\xc9\x2a\xf1\x74\x27\xe8\x7f"
- "\x79\x8e\xe4\xdf\x7e\x72\x02\xf3\xe6\xba\x93\x6c\x67\x9b\xc6\xbf"
- "\xcb\x79\xb4\xf3\x20\x77\xed\xb4\x46\xe6\xc6\xce\x86\x6f\xce\x8d"
- "\x9d\xbb\xc6\x9e\x1b\x3b\x3b\xb1\xce\x76\xe3\xfd\x41\xd4\x29\xf6"
- "\x5e\xe8\x59\xe5\xc1\xdd\x96\xe0\xbd\x82\x07\xcf\x5c\xc3\x74\xc4"
- "\x7f\x93\x6e\x9a\xd6\x83\x10\xe4\xda\x10\x68\x44\x66\x90\x25\xd0"
- "\x5a\x50\xbd\x82\xf4\x8e\xd3\x79\x70\x88\x7b\x33\xd7\x80\x5e\xe0"
- "\xb9\xea\xa4\xdc\xaf\x7d\xfc\x1c\xe4\x10\xdc\x57\xf7\x11\xad\x50"
- "\xc8\xa9\x3a\x93\xeb\xf5\x5b\x73\x34\x1e\xd7\x52\x62\x13\xbe\x76"
- "\xc5\xba\x0d\x3c\xa3\x75\x3b\x33\x64\x71\xcb\x75\xfb\x2d\xfb\x25"
- "\x75\xdc\x71\xa6\xe6\xb1\xd2\xd1\xc6\x56\x6a\x17\xda\xd9\x8c\x76"
- "\xed\xa2\xf6\x54\x2d\xa5\x7e\xc5\xdc\x69\x09\xa6\x89\x3d\x06\x6a"
- "\xe7\xe3\x7e\x76\x27\xb5\xef\xf1\xa7\xef\x64\xf5\x4b\x69\x9f\x58"
- "\xda\x07\xa9\xb8\x64\x00\xce\x4c\xea\x63\x6f\x27\xfb\x45\xec\xc3"
- "\xb7\x40\x8b\x8c\xad\x92\x0f\x96\x7b\x30\x94\x87\xde\x49\x3c\x7d"
- "\x3b\x79\x8f\x83\xda\xfc\x76\xb2\x96\x2f\xba\x6d\x0f\x2c\xb6\x83"
- "\xb1\x5c\xb6\x74\x69\x76\x6e\x9e\x16\xc7\x39\x65\xe5\xf2\xac\x7b"
- "\xd4\x73\xb3\x2b\xb2\x57\x67\x2e\xcb\x12\x76\xf9\x48\x95\xb7\x17"
- "\xf1\x1a\xa9\x24\x0b\x08\x5b\x57\xc1\x67\xec\x22\x1b\x2e\xc1\x73"
- "\xf4\xb0\xe6\x1a\xb9\x8f\xdd\xfc\x90\x5c\x07\x26\xaf\x46\x3b\x9a"
- "\xb4\x75\x80\xf4\x11\x83\x6c\x46\x19\xed\x2f\xd1\x59\x68\xda\xc7"
- "\x22\x9d\x04\xf2\x74\x78\xd9\x5b\x85\x1a\x6e\x57\x22\x9d\xce\x5f"
- "\xb8\x57\x90\xcd\xde\xae\x19\xca\xc6\xce\x7c\x6e\xda\x9b\x02\x1a"
- "\x60\xa6\xb5\x81\xf6\x55\xa4\xdf\xfc\xe6\x24\xa2\x6d\xa4\x37\x73"
- "\xaf\x20\x1b\xb8\xb7\x49\xd7\x91\xe0\x65\xbb\x92\x21\x17\xe5\x6f"
- "\x58\xcb\x8c\x54\x07\xd6\x0d\xaf\xd4\xc1\x36\xcf\xfa\xb0\x90\x31"
- "\x75\xed\xf0\x56\x0a\x9d\x60\xb3\x8c\x19\x50\xd6\x59\xa6\xea\x1c"
- "\x80\xff\xcd\xc0\xff\x38\x26\xdb\xbc\x77\xbe\xd8\x3f\x13\x74\xa1"
- "\x79\x03\x2f\xdf\xeb\x15\x76\x8a\xe5\x7b\xe7\x2b\x3c\x27\x86\x9e"
- "\x41\x97\x4d\xe0\xf7\x9b\xb8\x33\x85\xa9\xb6\x8d\x31\x7d\xec\x9d"
- "\x38\xd2\x99\x62\x3c\xea\x08\x16\x28\x7f\x93\x5a\xfe\x26\x94\x8f"
- "\xf5\xef\x5a\x35\x66\x65\xf3\x7e\xad\x2e\xe0\xb6\x0f\x6b\x57\x3e"
- "\xad\x5f\x68\xff\x72\xfc\xec\x52\x3f\x13\x80\x9c\x34\x3d\xac\x9f"
- "\x91\x3c\xd2\x3b\x06\x0d\x27\xa9\x6e\xb5\x0f\x35\x8a\x4b\xf8\x4c"
- "\xd4\xa9\x75\xd5\x90\xae\x40\x2b\x93\xa3\x4c\x3e\x34\xd0\x80\xb5"
- "\xc6\x88\x39\xe6\x8b\x2f\xc1\x9a\x42\x75\x10\x8f\xeb\x9f\xce\xb1"
- "\xe6\x84\x32\x43\x06\x79\x6e\x7d\x0d\x8b\x8b\xe6\x6f\x51\x5f\x7e"
- "\x84\x27\x43\x19\x43\xa0\x65\x45\x74\x18\xe2\x1d\x71\x96\x80\xec"
- "\x42\x68\x5c\x2f\x60\x9c\x30\x56\x69\xa8\xa7\x19\x7c\x79\x1c\xe0"
- "\xf0\x0e\x8d\x57\x95\x82\x39\x77\x41\xf0\xea\x16\x8a\x71\xde\xc3"
- "\xde\xd9\x46\x63\x45\x65\x01\x2f\x58\x70\x38\xe3\x9f\xc9\x6f\x14"
- "\xc1\x7a\x5d\x21\xef\xa7\xbd\xbe\x3e\xf6\xeb\x19\xc4\xc3\x82\xaf"
- "\x17\xf7\xce\x2c\xae\x88\xb1\x16\xf6\x8e\xbf\x9e\xb1\xae\x9f\x2b"
- "\xe7\x5d\x8c\xb7\x81\x96\x9e\xd7\xb3\x60\x00\x32\x28\xda\xad\x77"
- "\x9e\x22\xdf\x56\x0d\x98\x5f\x65\x0c\xf5\x1a\xab\xd6\xb2\x04\xf2"
- "\x0b\xe6\xb4\xf3\x40\xbb\xbf\x8e\xb5\xdb\xeb\xd8\xc7\xc1\x4d\xcc"
- "\x5d\x40\x3a\xcd\x5f\xb7\x7d\xe2\xd8\x44\xf6\xe5\xb1\xb8\xdf\x68"
- "\xfb\x21\xd5\xf5\x9f\x8b\x3e\x39\xf8\x19\xfb\xc4\xfd\x19\xb3\xfd"
- "\x58\x3c\xdb\xf7\x67\x7c\xcc\xf6\xa7\x7f\xcc\x9c\xbd\x5c\x21\x7e"
- "\xa8\xe8\x29\xaa\xa3\x0c\x65\x35\x90\x0f\xad\x04\x65\xd0\x6a\x42"
- "\xff\x0d\xf3\x1c\x4c\xec\x27\xba\x57\xfc\x1e\x6d\xfc\xcf\x33\xf5"
- "\x67\x99\xd1\xbd\xe2\x8f\xe2\x5e\xe8\x17\xd0\x5f\x4f\x56\xa7\xb0"
- "\x35\x23\xff\x61\x1e\x47\x3f\x9d\xd3\x54\xaa\xa9\x8d\x21\xd9\x6e"
- "\xc0\xcb\xa0\x7d\xbf\xbd\x28\xfc\xbd\xb0\x69\xdc\x46\xf0\x40\x9b"
- "\x0e\x2c\x90\x30\xd9\xdf\x09\x98\xfe\x50\x85\x4f\x46\x34\x7c\xfe"
- "\x33\x81\xe0\x43\x76\xa4\x4a\xc1\x40\x03\xda\x96\x0e\x18\x28\x5a"
- "\x1d\x84\x03\xb4\xef\x45\xe5\x57\x9d\x65\x66\xf7\x0a\xb2\x33\xfd"
- "\xf5\x2a\xcb\x7c\x83\x51\x19\x3a\xd5\x5c\x7d\x8e\x19\x68\xdc\x68"
- "\x9d\xad\x16\xef\x05\xcc\x33\x68\xcc\x7c\xb1\x9f\xe7\xe0\x07\xfc"
- "\xfc\xdc\x4e\xb8\x87\x6b\x3e\xc6\xab\x0c\x70\xf2\x61\xac\x1a\xe8"
- "\x2a\xf1\xf1\xa3\x06\xf2\xab\x48\x6b\x19\x70\x25\x92\x5e\xfe\xd1"
- "\xf6\x20\xe6\x8e\x22\xe4\xb4\xff\xf4\x29\x1b\x7b\x72\xa4\xcd\xe1"
- "\xdb\x69\xdb\xc0\x17\xd7\xbd\x20\xce\xb5\x9b\xc1\xcb\x93\x7c\xce"
- "\xb6\x88\xf3\x2f\xbf\x0e\xaf\x7f\xe5\x22\xe6\xf8\xaf\x6d\x7a\x61"
- "\x5b\xd6\x59\xa1\xe2\x7a\xc5\xb0\x6b\x17\xe4\xdf\xa9\x1d\x72\x4e"
- "\x34\xbb\x85\x1e\x02\x74\x60\x3c\x9e\x04\x74\x79\x3f\xd9\xea\xf1"
- "\x6b\x33\x98\x59\xc7\x7d\xe6\x45\x16\xee\x09\xb6\x12\x0e\x99\x05"
- "\xee\xcb\x77\xe0\x23\x7d\x16\xd0\xf2\x0e\xa4\x1b\xb4\x74\xa2\xeb"
- "\x0a\x64\x4b\x92\x6b\xe7\xad\xb1\xf0\xa2\x73\x2c\x49\xe8\x88\xb4"
- "\xf4\x35\x3e\x4b\xbb\x95\x91\xed\x7e\x90\xfc\x59\xd0\x37\x48\x8f"
- "\xc1\x3a\xb0\x1b\xf5\xba\x91\x3f\x51\xcb\xcf\x07\x33\x0c\x1e\x47"
- "\xab\x98\x67\xe4\xf3\x48\x5b\x17\x90\x3e\x61\x9e\xc3\x67\x11\x63"
- "\xa6\xa5\xe5\x65\x88\x75\x8c\xce\xce\x83\x4f\xe5\xa2\x3d\x7d\x22"
- "\x5d\x07\x39\x53\xc4\x34\x8f\x4a\xd3\x93\x9f\x02\xf2\x61\x17\x95"
- "\x16\x83\x36\xb3\xf0\x33\xea\xae\xfe\x99\xd8\xef\xb7\xce\x5b\x43"
- "\xfb\x65\xa8\xe7\x67\x6a\xdd\x6b\x38\x93\x7e\x31\x65\x9a\x5c\x33"
- "\x7f\x53\x18\x2d\xe3\xd2\x1e\x05\xd5\xad\x0c\x66\xe8\x43\x83\x19"
- "\x31\x54\x3f\x95\x45\xfa\x49\x11\x5b\x3d\xd8\xcf\xc8\x27\x33\xaf"
- "\x9c\x99\xc0\xe9\xac\x06\xca\x15\xed\x71\x40\xfe\x8f\x9b\x59\x33"
- "\xa6\x9d\x45\x85\xa5\xcd\x5d\xf4\x63\xe0\xf4\x6f\x37\x10\x4d\x09"
- "\x19\xbb\xea\x6c\x3f\x23\xfb\x85\xdf\x84\x68\x4c\x43\x98\xe7\xa1"
- "\xd8\xae\xba\xdb\xfa\x99\xae\x08\x73\x47\xee\xe3\xfd\xf6\x3a\xe2"
- "\xa9\x9c\x0a\xe7\xb8\x4f\x20\xdc\xb5\x0c\x40\x6e\xd9\xd8\xd5\x20"
- "\xec\x46\xe2\x27\xbb\x3d\x81\x7e\xb6\xbf\xf8\x4b\xb6\x3f\xe8\x29"
- "\xde\x7d\xd6\x67\x90\xf6\x23\x06\x94\xfb\xdb\xdb\xe9\x9d\x13\xf3"
- "\x25\x33\xd4\x30\xbe\x1c\x08\xd9\x02\xb0\x3b\x2c\xd7\x82\xdf\x6e"
- "\xd0\xe4\x89\xbf\xd2\x87\x6e\xf2\x43\x48\xf6\x75\x4a\xf9\x09\x8a"
- "\x25\xe0\xe4\xc3\x29\xec\xb6\xb5\xa4\xd7\xfd\xed\xae\x78\x3f\x4b"
- "\x57\xcb\xfd\x5a\x2d\xb7\xfb\x52\xe5\x12\xde\xee\xaf\x95\x36\x1b"
- "\x8a\xe9\x84\x37\x84\xb2\x43\xa6\x93\x36\xac\x35\x4e\xe7\x79\xd2"
- "\x9d\xb4\xcc\x40\x3d\xde\xf6\x60\x07\x23\x5f\xa6\xf5\x0a\xd6\xeb"
- "\xaf\xad\x4c\xb5\x95\x71\x9e\x66\xbf\x8b\x53\x78\x4a\x02\xe4\x1c"
- "\xd2\x95\x3a\x89\xce\x92\xee\xb9\x28\xc4\x26\x7a\x40\xe1\xc9\x07"
- "\x1f\xca\xb8\x6a\x2f\xe9\xa5\x41\xab\x42\xdc\xaa\x7f\x6f\xc8\xcb"
- "\xaa\x41\xbf\x85\x4f\xbe\xf5\xd7\x6e\x89\x2f\x61\xf7\x72\xbd\x45"
- "\xd8\x42\x29\x95\xb1\x01\x8c\xad\x55\xb4\xa7\xbc\xb3\x2e\xca\x2e"
- "\x27\x06\x75\x3d\x4f\x76\x39\xdc\xd8\xb9\xa8\x8e\xd6\x4c\x8c\xd9"
- "\xb0\xeb\x77\xbb\xbd\xec\x37\xc2\xf7\x49\x05\xe9\x01\x04\x9d\x6f"
- "\xb9\xc9\x17\x7b\x8c\xf6\x67\x28\x3e\xa1\x4e\x29\x08\x36\x57\x9f"
- "\x01\xdf\x23\xe0\xd1\x12\xdb\x3e\x30\xec\xe6\x65\xc7\xdc\x34\x8f"
- "\xd4\xb2\x2d\x28\xbb\x8b\x6f\x3c\x86\x75\xb4\x25\x45\xd2\x1a\xba"
- "\xff\x9d\x38\xff\x1d\x1c\xa1\xf3\x3c\xbf\xb3\xd7\x5d\x20\x9d\xdc"
- "\xef\x92\xc0\x17\xba\x07\x8d\xc7\xdc\x3f\xb0\x16\x83\x07\x68\xb9"
- "\xdb\xab\xfb\x8b\xd8\xdb\xd1\xfc\x0b\x8e\xb7\x07\xc5\xb7\x5a\x4d"
- "\x1e\x14\x02\x1e\x37\xf1\x24\xfb\xfd\xce\x0b\x90\xf3\x47\xb0\xb6"
- "\x5e\x80\x9c\xc0\xb7\x66\x98\xab\xa6\xb1\x34\xbc\x9b\x76\x92\xb5"
- "\x3c\x1f\xd4\xb3\x44\xfc\x12\x7c\xd7\xe6\xc4\xa2\xdc\x74\xd2\x7f"
- "\x1e\x38\x4b\x7b\xb2\x2d\x82\xee\x57\x6f\x61\xc9\x0a\xca\x23\xbd"
- "\x6b\xf5\x34\x96\x4c\x3a\x57\xa4\xa5\x64\x86\xe4\x9e\x84\x26\x53"
- "\xad\x9f\xc6\x52\x47\xd7\xdb\xa2\x9e\xf1\xfb\xbd\x58\xe3\x57\xfb"
- "\xd8\xf5\xf6\xef\xf3\x9e\x3e\xf6\xee\x72\xee\x8a\xe1\xfc\x5a\xab"
- "\x5e\xca\x14\xef\x3e\x66\xa9\x95\x78\x27\x74\xf0\xc0\x37\xda\xe3"
- "\x50\x75\xbb\x3a\xe1\x57\xd1\x74\x28\x95\xce\x53\x88\x34\x5d\x02"
- "\xc1\x32\x41\xb4\x43\xf5\x85\x16\x5a\x7f\xf3\x22\x2a\x83\xda\x93"
- "\xb9\x58\xea\x85\xc9\x4f\x1a\x60\x2c\xe2\x4c\x55\x6c\x61\xe6\xe7"
- "\xb6\xb0\x84\x03\x4b\xa9\x5f\xef\x6e\x90\x73\xd1\xc0\xa8\xbd\x4a"
- "\x19\xcd\x33\xe0\x04\xda\x4d\xf5\x11\x6e\xb4\x07\xbf\x76\x3b\xf3"
- "\xb9\xe2\xfe\x19\xf9\x14\x78\x77\xaf\x3b\xb7\x89\xcd\xeb\x0d\x4a"
- "\xdf\x3e\x0b\x99\x6f\x3b\xca\xdb\x3e\x8d\x25\xa0\xac\x4f\x3d\xcb"
- "\x89\xd6\x5a\x67\xba\x73\x77\x51\xd9\xc7\x68\x3d\xaa\x04\x7c\xe4"
- "\xba\xf4\xfb\x5a\x4f\xa0\x93\x91\x5f\xf9\x47\xec\x3c\x44\xe5\xf4"
- "\xb1\xdf\x5f\x27\xfa\xbb\xd5\x6a\xcb\x94\xbe\xec\x44\x5f\xc3\xfa"
- "\x76\xb5\x1f\x9e\xb3\x54\xde\xef\xd3\x3c\x8b\xc0\x73\xaa\x7d\xd2"
- "\x60\x2d\xf1\xeb\xf7\x4f\xb9\x73\x77\x30\x1a\x1f\xca\x8f\xe7\x85"
- "\x9e\x01\xe4\x3d\x35\x7a\x5c\x28\x0f\xde\x55\xa2\xdc\x7f\x8c\xec"
- "\x23\xd1\xfe\x46\x24\x4f\x1d\xfa\x03\x58\x75\x6c\x05\x8c\xa4\x7e"
- "\xed\xdd\xf3\xd4\x56\x2f\x7b\x37\xe0\xc9\xff\x72\xec\x73\x4c\x98"
- "\xfb\xc0\xfb\x92\x76\xa1\x5b\xfa\xfd\x89\x47\x82\x0a\x97\xf4\xec"
- "\x0f\x75\xe0\xdd\x20\x1f\xff\xa1\x8e\x68\x81\xa0\x27\xb7\xd2\xde"
- "\xef\x1f\xb6\x59\x74\x72\x7c\xa9\x2f\xc4\x33\x8d\x35\xc6\x51\x7a"
- "\xfd\x04\x6a\xab\x36\xc6\xdc\x6c\x69\x53\x68\xbf\x66\x1a\xe0\x3d"
- "\x62\x65\x12\xff\x78\x0d\xca\xad\x54\x79\x48\xaf\xba\x9e\x7a\x07"
- "\x63\xbb\x1a\xf9\x33\x56\xa6\xd9\xec\x61\xfe\xee\xc8\x94\x76\x90"
- "\x56\xa2\x51\xdb\xf5\x72\xee\x50\x1b\xd5\x6f\xbb\xe5\x3e\xf2\x1f"
- "\x16\xe2\xfb\xee\x31\xfb\x1b\x33\x8d\xe2\x08\x3b\xc9\x6f\x9f\x38"
- "\x5f\x00\x5a\x85\xf5\x60\xa2\xc7\x7f\x81\xc9\xbd\xed\xdd\xd7\x50"
- "\x8c\x77\x3a\x5b\xa6\xb5\xed\xf2\x74\xf0\x7f\xe8\x95\x3a\xf8\xdd"
- "\xc9\x9a\xbc\xc9\xcd\x80\xb1\xcb\x22\x7c\x8c\x83\xef\x52\xfc\x71"
- "\x96\x0e\x5f\xdc\x4c\xd5\x86\x62\xf7\x5c\x1e\x27\xe9\x6d\x66\x80"
- "\x15\x53\xbf\x54\xb9\x6b\x22\xf5\x19\xe5\x2c\xd7\xf6\x82\xb5\xb2"
- "\xc7\xf5\xdb\xaf\xf5\x0d\x7d\x12\x7d\x43\x1f\x45\xdf\xc8\xaf\x86"
- "\xec\x9b\xd8\xcb\xbc\xbc\xfe\xec\xde\x25\xd7\x1e\x4b\x87\x7b\x1a"
- "\x95\xf1\x7e\x89\xb0\xe9\xc7\x98\x80\x3e\x5c\x7d\x92\xbd\x77\x37"
- "\x37\x3d\x67\xba\xbc\x32\xdf\x93\x31\x12\x2b\x66\xb2\x97\x40\x83"
- "\xe5\x39\x23\xb2\x6f\x79\x7f\x19\x68\xb9\x90\x61\x06\x51\x1f\xf0"
- "\x23\x8a\x0e\xbd\x37\x40\x63\x75\x6b\x13\x4b\x97\x78\xf8\xde\x11"
- "\xd2\x4b\xc8\xb8\x2a\xef\xd5\x00\xef\x17\x08\x58\x87\xed\x3b\x75"
- "\xc2\xbe\x33\x9a\xc6\x5e\x66\x1b\xa5\x4c\x13\x1f\xdb\x80\xfb\x62"
- "\x61\xc3\x83\xf6\xae\x0e\x6a\xf4\xef\xbd\x62\x4e\xba\xe1\x22\x55"
- "\x47\x48\xb4\xac\x48\xfa\xe5\x1a\x76\xbd\x6f\x0b\xeb\x08\xe9\x1c"
- "\xa6\x8b\xb7\x51\x3e\x8c\xfd\xd7\x94\x47\xfa\x0d\x3a\xa9\x9e\x51"
- "\x7c\xff\x3b\xea\xf9\xc3\x14\xb2\x6b\xc2\xb7\x0b\xbd\xac\x47\xc8"
- "\xab\x04\x03\xaa\x5b\xb4\x5d\x4f\xfa\xc0\xf7\x1d\x11\x9d\xec\x7b"
- "\xf2\x4c\xa3\xb0\x7f\x79\xbf\x46\xc3\x11\xf4\x77\xa2\xf4\xa5\xbf"
- "\xfb\xfc\x9e\x54\x26\x70\x60\x90\x5b\x4d\xdf\xaa\x23\x9c\x7c\xbf"
- "\x25\x1a\x4e\xf3\x82\x8a\x53\xd2\xa0\xf7\x1a\xb8\x98\xeb\xef\x35"
- "\xfc\x75\x7e\xe2\x83\x38\x8d\x17\x91\x70\x4e\x00\x7d\xf9\xb0\x53"
- "\xc0\xba\xec\x23\x92\x9f\x2c\xcf\x14\x91\xef\xde\x0f\x0e\x90\x8f"
- "\xe4\x60\xd9\x47\x8b\x42\x4e\x2b\xf9\x84\x64\x4a\xd9\x47\xf6\x3e"
- "\x3b\xd3\x67\xda\x49\x0f\x7d\xac\x86\x64\x3c\xc8\xac\x09\xdc\x04"
- "\xfe\x04\xf3\x7c\xdd\x32\x66\xf9\xf7\x1c\x94\xed\x4c\x49\x24\x1f"
- "\xc6\xe4\xbf\x98\xfc\x8f\x87\x9c\x29\x57\xe0\x7e\x2a\xf8\xb9\x04"
- "\x6e\xfc\x68\x3e\xed\x65\x87\x5c\x1c\xf4\xb8\x9b\xfc\x28\xeb\x3d"
- "\xbe\x00\x5b\x77\x8a\x19\xc9\x47\x72\x70\xe3\xb1\xc6\x76\xff\x57"
- "\x42\xbe\x89\xb7\xb3\x44\xf0\x1f\x49\x80\xb9\x55\x89\x3d\x06\x39"
- "\xf4\xd8\x26\xd9\xef\xaf\xb9\xec\xb7\x6c\x37\xb5\x5f\xd0\xb8\x32"
- "\xa0\xb4\x68\xfb\x87\x4f\x07\x51\xbe\x52\x76\x60\x79\xa8\xec\x40"
- "\x8e\x3c\x07\xbb\x9f\x15\xe5\xf3\x7e\x8f\x7f\x3f\x64\xae\x73\x22"
- "\x5e\x14\xed\x95\x53\x1f\xa9\x7f\x54\xf7\x27\x67\x4f\x09\x9f\xcf"
- "\x41\x3c\x3b\x97\xab\xdf\x0c\xe0\x9b\x81\xfd\xec\x42\xd9\x01\xd1"
- "\xf7\x76\xbf\xfc\x36\x53\xdc\xd3\xf7\x51\x70\x50\xfb\x1c\x86\x03"
- "\xfa\x4e\xfd\xa3\xfe\x07\x09\x26\x80\x81\xda\x57\xeb\x88\xda\x4f"
- "\xea\xe3\xc7\x58\x75\xb6\xa0\x9f\xe8\xab\xe8\xe7\x08\xfa\xd9\x96"
- "\xc3\x58\xa0\xca\xe2\x3d\x6f\x3a\x90\x43\x32\xaa\xf3\x53\xf0\xf0"
- "\x85\x35\x0c\xb2\xa8\x61\x67\x51\x8d\xbe\x1c\xbc\x49\x91\x0f\x32"
- "\xa9\x8f\xf7\x93\xbd\xab\xc7\x8e\x5f\xb0\x8e\x11\x8f\xa3\xf1\xeb"
- "\xa8\xdb\xfa\x89\x72\x8c\x15\xf5\xf3\x7e\xf0\xa6\x01\x4f\x10\x79"
- "\x72\xd0\x7f\xc8\xb0\x7d\x6a\xfb\x29\xef\xba\x33\xb2\x5f\x96\xe5"
- "\x2c\xf1\x83\x1f\x97\xe9\x3d\x9d\x65\x4c\xeb\xcb\xe3\xc8\x87\xfe"
- "\x58\x51\x56\x1c\xf5\x47\x41\x3f\xb7\xa2\x9d\x81\xa8\x3e\x1d\x18"
- "\x20\x9b\xdb\xcf\x99\x69\x3e\xd3\x6d\x39\x8d\x7e\x9c\x66\xd6\x9a"
- "\x22\xf0\x5f\x8f\x12\xbf\xe8\x7e\x73\x72\x06\x03\x2d\xfd\x40\xc6"
- "\xab\x94\xfe\x57\xaf\x3a\xc9\x3e\xfc\x34\xec\x63\x95\xfc\x56\xc7"
- "\x1e\x6b\x22\x3c\x12\xbe\x56\x69\xcd\x18\x06\xce\xd0\x9e\xf6\x6a"
- "\xd4\x31\x9c\x32\x55\xb4\xc7\x75\x17\xd9\xd4\x9a\xf1\x4c\xf1\x5a"
- "\xe8\x8c\x99\x0e\xdf\x35\x72\xc0\x8c\xca\x07\x3f\xb7\x89\xae\x04"
- "\xc3\x31\xed\x53\xdf\x62\xb3\x50\x47\x1d\xc9\xdf\xcd\x45\x3e\xfd"
- "\xb3\x6f\xb1\xd4\xcb\xa3\x29\x7f\x64\xe3\xd1\x6f\xd2\x65\x52\x79"
- "\xe8\xdb\x15\x27\xd9\x1f\x8f\x8d\x9e\x63\x36\x41\xcb\x24\x1d\xfc"
- "\x63\x13\xe9\x0a\x2f\xb3\x5e\xc1\xc3\x91\x3d\xc2\x65\x7e\xd7\xac"
- "\xb5\x03\xf7\xdf\xb0\x23\xd2\xda\x7e\xf9\x70\xd8\x63\x1c\xaf\xac"
- "\xca\x97\x85\x3d\xa1\xb3\xea\x65\xd0\x0b\xf0\x0a\x7b\xac\xb4\xef"
- "\x80\xb5\x73\x87\x9f\xe5\x6d\x63\x46\xe7\x29\xd2\x0b\x3d\xcc\xf6"
- "\xd4\xa5\xb1\xfa\xb3\xe4\xe7\x29\xe5\x8a\x17\xcf\x62\x2c\x55\x1a"
- "\x42\x3c\x29\xe9\x5c\x79\x5e\x4a\x42\xf5\xcb\x1a\x0f\xbf\xe7\xd3"
- "\xc2\x73\x4c\x2f\x63\x74\xef\xe9\x98\x6d\xe3\xc1\x4d\x7a\x25\xa7"
- "\x8e\x7c\x07\xc7\x9b\x88\x07\xcd\xd1\xfc\xf1\x0a\xde\xc7\x81\x39"
- "\x37\x68\x35\x55\xe6\xb2\x54\xf2\x21\x6e\xf1\x49\x5e\x4e\xae\xd7"
- "\xad\xb4\x1f\x92\xa0\xfa\xe8\x4d\x90\x3e\x7a\xff\x38\x87\xec\xb3"
- "\xd5\xf7\xb7\x87\x20\xc3\x88\x72\x73\x59\x72\xdd\x59\x96\x42\x7c"
- "\x50\xe6\x31\xc9\xb3\x91\x5c\xf8\xf0\x80\x85\x87\xfe\x3b\x85\x6d"
- "\x3b\x19\xf1\x31\xee\xcb\x23\xbf\xe4\xdc\x3a\x9e\xad\x71\xf5\x54"
- "\xb1\xf7\x2e\xfc\x5b\x92\x4e\x1e\xcf\x6c\xd3\x0b\xcc\xb0\x87\xec"
- "\xf8\x1a\xe4\xb9\xa5\x3d\x41\x69\x1b\x3b\xec\x6a\x6d\xd0\x7c\x2f"
- "\x8f\xbb\xb7\x5c\x26\xe5\x1d\x65\x22\xe4\x2f\xdf\xb0\x5b\xfa\x0d"
- "\x6c\xed\xf7\x6c\x50\xa2\x64\x9c\xd6\x7d\xf4\x8e\xd2\xc8\x17\x53"
- "\xba\x80\xe5\xde\x04\x92\x7b\x54\x99\xf1\x03\x9b\x96\xa6\xca\x8c"
- "\xc2\x3e\xd9\x2a\xf7\xca\xb0\x36\xc5\x0f\xbb\xf6\xa6\x6a\xeb\x19"
- "\xad\xeb\x52\x37\xbc\x37\xdd\xab\xfb\x6a\xc7\x25\xda\x97\xa0\xda"
- "\x53\xd3\x3e\x47\x3a\xf2\xdb\xb5\xf5\x4d\xec\x77\xae\x9f\x76\x7f"
- "\xde\x1a\x96\xf4\x83\x6b\x8c\x8c\xf6\xca\x90\xb7\x5f\xae\xbb\x7b"
- "\x6b\x23\xfa\xf4\x74\x01\x6f\x3a\x57\x2c\x64\x0c\xf2\xd7\x27\xfd"
- "\x88\x0f\x68\x7e\xfb\xe4\xfa\xbb\xf7\x37\x51\xf5\x74\x86\xd7\x51"
- "\xd4\x41\xf6\xda\x54\xbe\xe4\x4d\xf6\x56\x88\xb3\x67\xc8\x27\xd7"
- "\xd7\xbd\x15\x97\xe0\xc5\x52\x08\xbe\x8a\x2a\x4f\x7a\x06\x8e\x4b"
- "\xf8\x3a\x58\xcc\x6d\x9b\x98\xf5\x83\x22\xaf\x21\x5e\xfa\xc5\xb5"
- "\xf4\xb0\x8f\x6e\xa2\xf7\x84\xeb\xee\x5b\x49\x1f\xf8\xd1\xb3\x1e"
- "\x5a\xb7\x47\x32\xcc\x8f\x90\xac\x2f\x78\xf1\x8f\xf2\x6f\xc1\x77"
- "\x48\xbb\xe2\xfd\xd3\x01\x43\xf5\x5a\x96\x2a\xfd\x1f\x7e\x24\xe4"
- "\x0d\xdf\xd5\x4f\x0e\x7f\x2b\x91\x59\xbf\xb5\x89\xa5\x0c\xbb\x3e"
- "\xaa\x83\x7c\x29\xf6\xf5\x45\xfd\x55\x33\xd3\xc8\x87\xfa\xdb\x17"
- "\xbc\x13\xe4\x58\xfd\xe9\xbb\x78\x4e\x89\x3c\x7f\xf4\xb9\xba\x97"
- "\x02\x5e\xe3\x4f\xb3\xb6\x9f\x96\x76\xe7\x42\xbf\x54\x61\x6a\x8e"
- "\xec\xd5\xff\xe9\xbb\xb2\x2d\x7f\xfa\xee\x1e\x3b\x23\xdd\xf9\xc1"
- "\x7a\xe1\x0f\xf9\x4f\x90\x39\xf6\xce\x55\xf5\x31\x1d\x02\xaf\x88"
- "\xdf\x2d\x25\x19\xec\xb8\xbb\x12\xf9\x68\x9d\x00\x7f\x94\x2e\x78"
- "\x78\xf0\xba\x0a\xf0\x27\xaa\xff\xaf\x91\xbe\x71\x4c\x9a\xb8\x85"
- "\x31\xf1\x4d\xa5\x49\xda\x7e\x54\xce\x2c\xc3\xd5\xc8\x2b\x27\x37"
- "\xe3\x6a\x46\xba\x1b\x57\xc2\xbd\x16\x5c\x13\xf1\xde\x4e\x78\x09"
- "\x19\xd6\x4a\x71\xe1\x06\xe3\x4c\x6c\xbc\x33\x44\x04\x1b\xcf\x86"
- "\x1f\x32\x69\xdf\xd6\x96\x44\x31\xc1\xe6\x6d\x63\x2c\x2f\xc8\x2f"
- "\xd8\xae\x27\xbf\xfe\x6d\x49\xce\x6d\xb4\xef\xfc\x27\xdf\xe8\x7d"
- "\xe7\xb6\x04\xfc\xe6\xe3\xb7\x03\xbf\x83\xf8\x25\x45\x7e\xfb\x12"
- "\x86\x5d\x6d\x49\x80\xa3\xe0\xb1\x2e\x8f\x26\xb6\x09\xdf\x5a\xd5"
- "\x24\x17\xc5\x9e\xe8\x90\xfd\x9d\xe1\xc5\xb3\x91\xc7\xcd\xb4\xa9"
- "\xfd\xed\xc0\x73\x82\xcd\x89\x75\x2d\x0e\x30\x99\x86\x3e\xc7\xcd"
- "\x2c\xa3\xfe\x52\x7b\x07\xe3\x26\x37\x47\x9f\x9f\xa2\x32\xa9\xff"
- "\xbe\x38\x13\x95\xc7\xf8\x8d\x2b\xd3\x34\x78\xaa\x70\xa2\xb3\x25"
- "\xfa\x41\x94\x21\xf9\x20\xe4\x47\x19\x5a\xfe\x30\xec\x91\x4f\xc8"
- "\x89\xc8\x07\x99\xd8\xa8\x9d\xcd\x1a\x76\xed\x33\x7e\xb8\x5c\xee"
- "\x67\xd0\xb7\xfe\xa8\x6f\xc9\x5f\xc8\x58\xdf\xa3\x4e\xa3\xac\x73"
- "\x72\x73\x1f\x6b\xbb\x4e\xad\xf7\x1b\xbe\x33\xc3\xe7\x1f\x67\x80"
- "\xbf\xab\xf3\xd2\x39\x22\xe2\x87\xee\xf6\x24\xf9\x99\xa7\x4e\x61"
- "\x4a\x95\xc9\x9b\x5e\xc4\xdd\x7d\x6c\xdf\x7b\xed\x81\xfe\xcb\x5c"
- "\x0f\xf7\x09\xdb\x3b\x7e\xa1\x98\x79\x0a\xef\x10\x72\xd8\x69\xf6"
- "\xf1\x29\x8f\x4f\x9c\xd1\xa5\xfb\x2e\x7a\x4f\xfb\xcd\xb4\x36\x40"
- "\xc6\x0e\xfb\xa6\x57\x90\xb7\x9e\xd2\x91\x46\x7e\x04\xb6\x47\xbd"
- "\xe3\x55\xb1\xfd\x72\x4e\x7d\xfc\x1a\xf1\x16\xa2\xbd\xc1\x7f\x76"
- "\x53\x9b\x95\x8a\xd8\x7e\xea\x83\x13\xf2\x1f\xc5\xe3\xa3\x39\x61"
- "\x2b\x20\x5d\xe1\xc7\x25\xc0\x3b\xae\x54\xc6\xf6\x5f\x5e\x1f\x3e"
- "\x16\xe7\x8f\x9d\x41\x7e\xda\x17\x17\xdb\x4f\x3c\x49\x75\xd1\x04"
- "\xe3\x03\x75\xdc\x3d\x18\x6f\xf2\x0e\xbb\x3e\xde\xf1\xa1\x43\x8e"
- "\xcd\x65\x96\xbb\x43\xeb\x7b\xbd\xda\x77\xa4\x89\x3d\xaa\xdb\x6a"
- "\xa5\xcf\x7e\x3c\x77\x8f\xab\xb3\xc2\x38\x13\x3f\x80\xb5\xe1\xbc"
- "\x84\xc5\x27\xa9\xe1\xb5\xe1\xb2\xda\xf1\x49\xea\xdf\x50\xc7\x88"
- "\x5a\x47\xcd\xdf\x59\x47\xcd\xa5\xea\x90\x7b\xcd\xfb\x93\x2e\x5f"
- "\x76\xfc\x44\xc4\x48\x06\xfd\xec\x90\x34\xf3\x40\x65\x08\xf2\x5b"
- "\xd0\x3c\x83\x62\x48\x39\xc9\xae\x94\xe2\x17\x04\xcb\x4e\x74\x1c"
- "\x70\x5c\x60\xee\x82\xcf\x58\x2f\xdb\x2f\x7c\xd8\x1c\xc8\x27\x99"
- "\x6d\xa6\x6d\xa4\x6a\x72\xda\x88\xfe\x93\xe5\x04\xef\x6d\x18\x87"
- "\xad\x51\x78\xd6\xee\xff\x8c\x79\x16\x91\x7e\xb5\x83\xf4\xda\xa0"
- "\x05\x33\xbc\x0a\x68\x03\x78\xf4\x90\x80\x07\xf8\x17\x21\x6f\x41"
- "\x66\x13\xf2\x96\x4f\xf8\x39\x8d\x13\x71\x09\x5c\x2f\x26\x93\xee"
- "\x3b\x34\x92\x61\x1b\x76\xb1\xf9\x14\xaf\x80\xf4\xce\xdc\xd8\xe9"
- "\x98\x17\x8c\xe1\x42\x9e\x02\xef\x4f\xf1\x0a\x3c\x7e\x2f\x0b\x81"
- "\x8f\xae\x1b\x62\x89\x75\xe0\x3d\x41\xb3\x13\x88\xae\x6f\x57\x63"
- "\x16\x54\x0e\x45\x62\x16\xd4\x93\xae\xa7\x13\xf7\x43\xcc\x10\xaa"
- "\xb4\xb4\x6d\x1d\x62\xc9\xdb\x0a\x58\xca\x56\xd2\xe5\x9d\x90\xbc"
- "\x8f\xb0\x03\xa7\xf8\x05\x2b\x53\x68\x2f\x21\xc2\xfb\xd0\x99\xf2"
- "\x08\xdd\x32\x08\x1d\xc8\x65\xc1\xfb\x80\x58\x07\x83\x15\x26\x63"
- "\xd0\x3c\xb3\x0c\xb0\x6b\xf6\xb2\xfd\x15\x80\x9f\x71\xac\xb1\xd5"
- "\xec\x49\x36\x45\xc5\x9c\xf8\x30\x59\xd2\x77\x94\xd5\x31\x1e\x4e"
- "\x84\xb6\x66\xb0\xdb\x06\x58\x9a\x3c\xcf\x18\x8b\x35\xb1\xfd\x2e"
- "\xb2\xff\x2b\x7a\x8a\x59\x43\x5b\x17\xea\x9c\xaf\xb0\x18\x4f\x30"
- "\x9d\xd1\xaf\xe8\x0c\xef\xbf\x6d\x39\x4b\xa3\xfd\x07\xda\x2b\xb1"
- "\x3d\x23\xf2\x4f\x48\x2e\x64\x69\xd1\x65\x3f\xb5\x26\x77\xd9\xed"
- "\x69\x3f\xcd\xb6\x2d\x5d\x96\xfb\xd4\xea\xc5\xb9\xd9\x6c\x8e\x34"
- "\x9b\x10\x2e\xa4\xd7\x90\xcd\xc4\xea\x65\xf9\x39\xb6\x25\xab\x72"
- "\x73\xb3\x57\xe4\xdb\x1e\x7e\x60\xfe\x37\xfd\x08\x6e\xb5\xee\x10"
- "\x7e\x63\x85\x0d\x9d\xe7\x18\xff\xc5\xb7\x87\xaa\x0a\x98\xc1\x52"
- "\xf2\xe0\x02\x4b\x70\x8e\x4d\xc6\x32\xea\x30\x92\xdd\x2a\x77\x66"
- "\xd4\x4a\x3e\xb5\x23\x56\xca\x53\x87\xd3\xe4\xd9\x8a\x0e\xa9\x93"
- "\x19\x9e\x93\x24\xe7\x94\xe7\x9a\x98\x7c\x46\xf7\x4f\xd1\xbd\x25"
- "\x9f\x95\xb9\xa7\xd1\x7e\xb8\xe7\x1a\x91\x6f\xeb\x5c\x9d\x96\x4f"
- "\xcb\x23\xdf\xb7\x8b\xb3\x10\xf5\xc2\xa7\x66\x7b\x3a\xe0\x73\xc5"
- "\xb0\xcb\x93\xe6\xd5\xb7\x76\xaa\xfb\xeb\xfd\xd2\x5e\xaf\xc3\x48"
- "\x7e\xf5\xf8\x2f\xae\x1d\x52\xcb\xc9\x41\x7d\x93\x91\x77\x21\xc6"
- "\xa0\x57\xb5\xeb\x9b\xde\xa3\xb6\x4b\xda\x9d\xb6\x3f\x2a\xed\x3b"
- "\x3c\xc5\x51\xe7\xba\xc5\xd9\x7c\x5a\x1b\x55\x9e\x74\x58\x2d\x6f"
- "\x87\x46\x13\x90\x1f\xf8\xf0\xe2\x9c\xcb\xa7\x85\x1e\x29\xff\x8c"
- "\xf2\x97\xa2\xc2\x69\xab\xf5\x75\xd0\x87\xa4\x93\xac\xbd\xf6\x62"
- "\x7c\x09\x8f\xe0\x43\x2b\x96\xac\x7c\xca\xbe\x38\x7f\xd9\x13\xcb"
- "\x96\x2f\xcb\x5f\x23\x8e\x93\xa7\x8a\x7f\xff\x74\x43\xd6\x82\x8b"
- "\x7d\x40\xa7\x92\x8e\x45\xf5\x1d\xeb\x27\x9b\x06\xa9\xe7\xea\xd8"
- "\x16\x74\xb1\xe9\x97\xd7\xee\x0e\x61\x23\x58\x27\xfc\x18\x74\x34"
- "\x79\x75\xdd\xbb\xd4\xfd\x8e\x01\x15\xf6\xe2\xfd\xa0\x79\xa6\xdd"
- "\x36\x8d\xdd\xdd\xc3\x0e\xce\xa5\x7d\x2e\xc0\xcf\x4d\xeb\x61\xd5"
- "\x5a\x5a\xb7\x30\x0a\xc1\x3b\xd4\x38\xaa\x9f\xbe\x4b\x30\x20\x9e"
- "\x10\x30\xd8\xd1\xc3\x3e\x9d\x21\x60\xf0\xb5\x75\x87\xf0\x61\xf0"
- "\xb5\xf5\x75\xc2\x2d\x6a\xb3\xc2\x33\xb6\x72\x9e\xb1\x45\xf9\x3a"
- "\x67\x2b\xff\x3a\x67\x4b\xc4\xff\xdc\xa7\x15\xf8\xb6\x09\xdf\x3e"
- "\x4f\xf1\x61\xaa\x4e\xb3\x26\xda\xff\xa6\x67\x4b\x7e\x02\x0b\x99"
- "\x4d\x2d\xd4\x1e\x4f\x7f\x9a\xe0\xb7\x7b\x91\xdf\xe3\xbf\x83\x81"
- "\x97\x74\x8b\xb3\x91\x62\xbf\x0e\xfc\x1e\xbe\xf3\xa0\x5d\x9e\xfe"
- "\x0b\xc4\x5b\xb4\x28\xe0\xf9\xd0\xdf\xdd\xa0\x7f\x8c\xca\xa5\x3e"
- "\x8b\xf3\xc9\x53\x39\xd6\xc0\x4f\x1b\xbd\xac\xdd\xa1\xf2\xa6\xc2"
- "\xde\x82\x60\x30\x7a\x3c\x3f\x15\x7e\x8c\x01\xe3\xab\x79\xd9\x47"
- "\x35\x72\x4c\x3f\x3d\x42\x69\x73\x7b\xf9\xd7\x91\x73\xf1\x9f\x9e"
- "\xc3\xf3\x08\x7e\x0a\x2f\xfb\x53\x73\xd4\xbe\x32\xde\x7d\x26\xfd"
- "\xab\x4f\xe5\x3e\xfb\x5a\x8a\xaf\xfd\xd9\x4d\x12\x6f\xfe\xf4\xb6"
- "\xcf\x99\x13\x83\x6f\x42\x74\x8e\x53\xc2\xf2\xb3\x87\x3c\x1b\x4e"
- "\x6b\x76\x1a\xa8\xff\xb3\x13\xee\xa5\x41\x26\xe2\x3d\xf7\x06\x85"
- "\xdd\x9f\xea\xab\x40\xa7\xb8\x3a\x12\xc9\x5e\x1c\xb2\x1d\xed\x45"
- "\x0b\x5f\xeb\xc3\xae\xcf\x0a\xc3\xe7\xc4\xcc\x92\xdf\x23\x9e\x8b"
- "\x62\x60\x11\xee\x13\xff\x46\x6d\x22\xdc\x47\xd9\x8d\xb4\x47\x2d"
- "\xe7\xc0\x67\xbb\xfe\xbe\x39\xf0\x99\xd0\xff\xa2\xac\x39\x5c\xef"
- "\xe4\xb7\x55\xb0\x45\xc2\x86\x20\xe8\xa7\xf3\xb7\x06\xac\x1b\xcb"
- "\x25\x3d\x39\x78\x83\xb0\x33\x29\x18\x68\xa0\x33\xae\xdb\x2f\x30"
- "\xb3\x52\xd6\x69\x27\x3e\xfb\x40\xa1\xb0\xbd\x30\xe2\xbb\x66\xb2"
- "\xcd\x20\x5b\xba\x78\x11\x63\xed\x33\xb6\xfd\x1c\x33\xf4\xb2\x3f"
- "\xdf\x45\x7b\x41\x11\x58\xff\x79\x23\xed\xfd\xf1\xf2\xbd\x29\x96"
- "\x42\x7d\x19\x95\xa1\x0c\x9d\x9a\xa5\x7d\x47\xb1\x7c\xe9\xbb\x1e"
- "\xf6\xe7\xa7\xc4\x77\x94\x97\x7c\x35\x15\x25\x2c\xc4\x9a\x2b\x78"
- "\xfb\x20\x9e\xeb\x95\x84\xf9\x1c\xeb\x41\xa8\x20\xd8\x8c\x77\x0b"
- "\x94\x8a\xc9\xcd\x48\xcb\x10\x7b\x10\x23\x56\xda\x9b\x64\xdc\x78"
- "\xcc\xed\xf1\x1e\x17\xf2\x88\x38\x93\x9b\x8f\xb5\x53\xc8\x25\x7f"
- "\xfe\xb0\xfe\x04\x33\xd8\x97\xd2\x78\x1e\x14\xba\x56\xe0\x5e\xa3"
- "\x6c\xdf\xc1\xc7\x06\xcb\x0f\xe4\x0c\x02\x37\xfd\x7a\x23\xdb\x63"
- "\x0d\xd0\x9a\x6d\xdf\x63\xbd\x80\xf1\x39\x98\x04\x5a\xa7\x9e\x7d"
- "\x94\xdf\x69\x38\x19\x63\x4d\x78\x04\xef\xef\xd6\xec\x91\x34\x7c"
- "\xf4\xb2\x3f\x27\x12\xdc\x80\xc7\xde\xf6\xe5\x11\x9f\xa6\x83\xf2"
- "\xfc\x1a\x64\x8a\x83\x76\xcd\xc6\x2e\x34\xa4\xec\x47\x3b\xc8\x3f"
- "\x87\x23\x54\xa0\x74\xd3\xde\xf9\x23\xe7\x14\x4e\xb6\xfd\x74\x4e"
- "\x83\xe4\x9e\x79\x0e\x3e\x48\x72\x1c\x9d\x89\xa2\x7d\x73\x3a\x33"
- "\xbe\x0d\x72\x30\xb5\x01\x65\xed\xd6\xce\x8e\x57\x22\x8d\xda\x40"
- "\xe7\x9e\xaa\x7e\x26\xe6\x24\xe9\x36\xcc\x62\xef\x20\xe6\xc9\x13"
- "\x8f\xf8\x51\xe6\x69\xb1\xe7\x35\x58\xaf\x96\x43\x7e\x7d\x86\x5d"
- "\x9f\x33\xad\x0c\x85\xec\x64\x73\x85\x3d\x9c\x57\x7e\x2f\xed\x84"
- "\x1e\xf1\x2b\xe2\xbc\x0a\x7d\x2f\xed\x77\x3e\xbf\x2b\x6c\x6b\x29"
- "\xce\x90\x7c\x3e\x5b\xf3\xfb\x83\xfb\xf9\xe1\x33\x70\x80\xe9\x60"
- "\x85\xa9\xc5\x0f\x5a\xe0\xaf\x30\x01\x9e\x9f\x2f\x07\x25\x6a\xba"
- "\xa4\x2e\x83\xfc\x05\xac\x62\x7a\xc5\xd4\x59\x47\xbe\x20\xe8\x6c"
- "\xa7\xb4\xef\xfe\xfc\x80\xea\x17\x22\xe6\x34\xfb\x7c\x63\x64\x0f"
- "\x3d\xa4\xea\x7f\x3f\xf7\x4b\xf9\xe3\x73\xbf\xd0\xff\x56\x99\x1a"
- "\x5e\x5d\x1b\xd0\x37\xaf\xf5\xea\xa5\xcd\xe3\xe7\xfd\x5e\x76\x28"
- "\x29\x62\xf3\xf8\x79\x23\x95\x35\xb6\xff\x8c\x43\x65\xb2\xcc\xff"
- "\xfa\x4a\xf0\x7e\x61\x79\xfe\x0b\x9b\xa8\x77\xfd\xb4\x45\x0a\xf1"
- "\x7e\xa6\x13\x5e\xb2\x6f\xf2\xd8\xcf\x92\x1e\x78\xa2\xd4\x2d\xc8"
- "\x3c\xaa\x3d\xe3\x95\x27\x47\x3f\x5f\x41\xcf\x12\x66\xff\xe5\xd0"
- "\xf6\x94\xaa\xf4\x0a\xc5\xeb\xe2\xce\x06\xd0\x46\xbb\x5f\xf8\x23"
- "\xf0\x80\x97\xa4\x58\xd7\xf6\x5c\x3a\x33\xf8\x5f\x3b\xc9\x4f\x81"
- "\x9c\x9b\x5f\x08\x7a\xad\xb8\xee\xe5\x4e\x92\xa7\x7c\x14\x1b\xe4"
- "\x2c\x43\xbe\x29\xc8\xd7\xd5\x5a\x38\x40\xf6\x61\x59\x14\xf7\xb1"
- "\x57\xad\xdb\x17\x7b\xa8\xec\x5b\x66\xb6\x08\x75\x02\x3f\xdf\x9c"
- "\x7b\xf9\x74\xe3\xbf\x06\x2e\xc5\x5b\x4b\x5e\x2f\x7d\x5c\xf9\x9c"
- "\xf4\x2f\xb7\xa2\xfe\x87\xb9\x68\x7f\x57\x50\x1f\x60\x23\xfa\x49"
- "\xfc\xdb\xc5\x0e\x16\x74\x4d\xe2\xa1\xb5\x18\xaf\x41\x2b\xe4\xb7"
- "\xfd\xac\x5d\xda\xcc\xd0\xbe\xbf\xa5\xc8\xcf\xcf\x7a\x82\xbb\x48"
- "\xff\xef\xc3\x58\x81\x6e\x7d\xf1\xa9\x27\xf8\x1e\x23\x3b\x66\xa2"
- "\x37\x3d\xec\x8b\xf7\xa8\x5d\xb7\xda\x8b\xd9\x2d\xa7\xc5\xfb\x42"
- "\xc9\xf7\x7d\xd1\xa9\x5e\x1b\xc9\x1f\x67\x74\x9b\xfe\x69\xd5\x8a"
- "\x25\xe4\xd4\xf5\x96\xb9\xd9\x05\xd9\xcb\x6d\x8f\x92\xcb\xd7\x8b"
- "\x6c\x12\x8d\x91\xb8\x60\x9d\x3b\x68\x2d\x25\xde\x9b\xe2\x83\x5d"
- "\x2a\x36\x98\x16\x17\x0c\x73\x2e\x99\xf4\xd5\xff\x9b\xb1\xc1\x34"
- "\xde\x9a\xe2\x82\x45\xf6\x6e\xba\xb2\xc2\x73\x40\xf9\x60\x98\x9e"
- "\xc5\xfa\xed\xfa\xa2\x97\xe6\x91\x5c\x5f\x3a\xbb\xa3\x7d\xe6\x08"
- "\xde\x6a\xe3\x31\x37\xd2\xfd\xda\xd9\x4e\xe0\xa2\x79\xd8\xd5\x65"
- "\x88\x9c\x25\xe9\x4a\x00\xdc\xa4\xfd\xb1\x91\xf2\x76\xd9\x34\x1b"
- "\x07\x35\x06\xb4\xb0\xc9\x50\x4a\xaf\x49\x94\x7a\xc5\xae\x1b\xea"
- "\x95\x49\x46\xb9\xa7\xd5\x35\x57\x3b\xab\x24\xe7\xe6\x07\xea\xdc"
- "\xec\xca\xba\x94\x1d\x4a\x64\x6e\x74\x35\x44\xe6\xf5\x61\xed\xdb"
- "\x86\xbf\x66\xc3\xa2\xca\x77\x57\x9d\x64\x7f\xf9\x0d\xe9\x1a\xe5"
- "\xd9\xe4\xbf\x6c\xa3\xb2\xa4\xdf\x89\xbf\xac\x51\xef\x51\xc7\x5f"
- "\x16\xab\xf7\xd7\xe2\xfe\x21\xf5\x7e\x1a\xee\x6f\x57\xef\x31\x67"
- "\xff\x72\x8d\x7a\x9f\x88\x7b\x9d\x7a\x8f\xb5\xe3\xcb\x13\xea\xfd"
- "\x54\xdc\x7f\xaa\xde\x5f\x83\xfb\x77\xd5\x7b\xcc\xc1\x2f\x85\xbf"
- "\x65\xb4\xdd\xd8\xc7\xbe\xac\xbc\x7c\x79\xf3\xcb\x0c\xb9\xe7\xfc"
- "\x65\x2d\xd6\x90\x74\xb9\xf6\x84\xd3\x9a\x30\x36\x41\x0d\xbe\x48"
- "\x9f\x4f\xf5\x20\xbd\xd5\xcb\x5a\x9b\xa2\xd2\xd3\xd5\xfc\xdd\xa0"
- "\x73\x8e\xa8\xf4\xbb\xd4\x74\xd0\xbf\x4f\x3a\xa2\xd2\x53\x64\xfa"
- "\x5f\xcc\x98\xeb\x2c\x2a\x5d\xf5\x11\xff\x97\x64\x2f\x7b\xdf\x1b"
- "\x95\x9e\xa0\xa6\xdf\xad\xd9\xdf\xa8\xe9\x06\x35\x7d\x81\x97\xfd"
- "\xb6\x26\x92\xde\x15\x50\xd3\x41\xff\xbb\xec\x51\xe9\xe1\x33\x2d"
- "\x22\x3e\x5b\x21\xcd\xad\xbf\xd4\x78\xd9\xee\xe2\xa8\x3c\x5e\xf5"
- "\x5b\xf0\x7f\x7f\x68\x8c\x4a\x3f\xa8\xa6\xbb\xbd\xba\xc9\xd1\x65"
- "\xb6\x8d\x47\xab\x74\xb5\x6c\xd1\x78\x3a\x79\x92\x5f\x84\x1d\xb2"
- "\xe0\xa9\xbb\x43\x74\xf6\xc9\xb2\x8d\xf7\xd8\x8a\x38\xef\x61\xdd"
- "\xbd\xaa\xdd\xed\x22\xb2\x81\x94\xe7\xc8\xba\xf7\xab\x3e\x04\x7c"
- "\xe2\x6c\xd9\x5a\x91\x26\x7c\x11\xdf\xe6\x28\x96\xfe\x79\xb5\x58"
- "\x0f\xa4\x9b\x52\xf7\xed\x91\x67\x0d\xe9\xea\xa9\x1c\xd2\x5f\x7b"
- "\xf2\x2f\x48\xdf\xcd\x90\x61\x29\x8d\x74\x34\x04\x8f\x68\x5d\x94"
- "\xa4\xfb\xdd\x21\xe5\x02\x9d\xdf\x94\x7a\x2c\x9a\x8b\x94\x9f\x6c"
- "\xcd\xa2\xf3\x7a\x59\xb7\xd0\xbf\xc5\x58\xa7\xbc\x36\xec\xea\xee"
- "\x8e\x9c\x9b\xe9\xbe\x4b\x4d\xdf\x81\x74\x7f\x54\xba\x6d\x5c\xda"
- "\x0e\x3a\xc8\x8d\x7b\xed\x23\x43\xdc\x1f\x1c\xe2\x81\xaa\x43\xd2"
- "\xe6\x1c\xb4\xee\xfa\x50\xd9\xde\x62\x3a\x57\x42\x31\x15\x83\x05"
- "\xdc\x47\xf6\x8c\x48\x9f\xfc\x88\xdf\x07\x1e\x63\x98\x57\x3e\x41"
- "\xb6\xab\xe7\x18\xed\xab\x3a\x07\x28\x3e\x97\x85\xd3\x79\xe5\x75"
- "\xa7\x98\x99\xce\x9d\x90\x6d\x3a\xed\x79\x3e\x9c\xe3\x63\x07\x72"
- "\x42\xac\x1e\x65\x6f\x7b\x42\xe3\x2f\xbe\xda\x14\x39\x13\xbb\x97"
- "\xf6\xa1\xaf\x77\x8a\x18\xb2\x5f\xed\xa5\xb6\x5a\x4a\xc8\x1e\x60"
- "\x66\x2d\xff\x23\xf1\xc6\xb1\x3e\x4b\x09\xb3\x79\xd9\x57\x1d\xb8"
- "\xf7\xca\x1f\xde\x21\x7d\xbc\x3e\xc9\xb9\x7c\xc8\x2c\x65\xe6\xbd"
- "\x3e\x49\x2f\x0e\x99\xf9\x7f\xd0\x39\x8b\x43\xa4\x83\xa6\x73\xed"
- "\xb5\x63\x7d\xbf\x6e\x1b\xd3\x8f\x94\x83\x37\x39\xdd\xa2\x97\xf4"
- "\xe9\x50\x50\xd1\x1b\x4b\x48\x4f\x2e\xe2\x47\x96\x77\x36\x35\xad"
- "\x08\xe8\x0f\xac\xed\x65\xcf\x5c\xc3\xac\x0b\x03\x7a\xca\xb3\x2e"
- "\x3e\x1f\x75\x83\x27\x01\x3f\xab\xff\x35\xde\xbf\xbf\xa2\x45\x1f"
- "\x14\xfc\xca\xa1\xa0\xd0\xad\x96\x75\x16\xd3\x1a\xe2\xe9\x0c\x11"
- "\x2f\x6e\x06\x2f\x6e\x07\xfd\x37\x86\x56\xe7\x5c\x11\xcc\xcb\x99"
- "\xbc\x2d\x97\x99\x43\x79\x29\x89\x2f\x0e\xb1\x59\xda\xfa\xb3\xad"
- "\x00\x6b\xca\xb0\xd5\x54\x8d\x35\x85\x74\x36\xf1\xba\x04\xb1\x87"
- "\x4c\xf7\x8a\xfe\xc3\x81\xfa\x82\x4b\xc7\xc2\x0d\xad\x4e\x11\x7e"
- "\x15\xa8\x2d\x63\xf5\xb5\x62\x0b\x33\x84\xd4\xf3\x97\x45\xc7\xd8"
- "\x54\xf0\xcf\xfa\xf8\x73\xdc\x7d\x72\x39\xd3\x53\xfc\xd0\xa2\x6c"
- "\xa1\x17\x9d\x70\x20\x27\xc8\x3c\x8e\x2f\x59\x51\x2e\x8d\xd1\xe1"
- "\x7f\x25\x3e\x8d\x6c\x91\x91\x3f\xe1\x24\x3b\xbc\xd8\x12\xc0\x9a"
- "\x11\x00\x4f\xfe\x33\x92\x81\x0f\xaf\x92\x7e\x1c\x0e\xb7\xd0\x79"
- "\x49\x77\xee\xfd\x94\xf6\xbc\xf3\x98\xb0\xf9\xc9\x92\x73\xeb\xf0"
- "\x72\x7a\x76\xd2\x79\x50\xd3\x57\x4d\x6f\x5d\x08\x4c\x90\xba\xb7"
- "\xc3\x4f\xa9\xeb\x83\x2a\xdb\x1d\x1e\x77\x1f\x53\x29\xdb\x57\xc3"
- "\x29\x76\x5a\x1d\xf1\xaf\xdc\x2b\xf6\xe7\xe9\x6c\xbc\xe3\x5e\x37"
- "\x1f\xaa\x51\x7d\xf6\x78\x6f\x57\x36\xee\xab\x91\x7e\xf5\xbc\x42"
- "\xce\x13\xba\xfa\x8d\xfb\x1a\xc4\xde\xc4\xc6\x7d\x72\x6f\x62\xe3"
- "\x3e\xf7\xfa\x69\x74\x16\xc0\x9b\x36\x18\xbb\xaf\x03\x57\xc3\xa0"
- "\xa9\x67\x4c\xfc\x10\xeb\x51\xd9\x47\x6e\xdb\xf5\x2c\x91\xf6\x88"
- "\x32\x43\xd2\xaf\xa4\x9c\xc3\x47\xee\xe2\x1b\xc5\xbb\xe9\x3d\x76"
- "\x16\x23\x65\x48\x6f\xc9\x6d\x75\xcc\x86\xb6\xc6\x71\xe3\x3e\xbb"
- "\xb0\x59\x2c\xdb\x57\xec\x19\xa0\xb8\x30\x21\x26\xf7\xf2\x8e\xa4"
- "\xf3\xd8\x7d\x76\x35\xff\xa7\xed\x03\xe8\x83\x71\x5f\xba\x27\x70"
- "\x4a\xe5\x09\xbd\x1d\x68\x63\x3a\x2f\xdb\x37\x5f\x9e\xab\x3e\x32"
- "\x43\xa3\xab\x12\x47\x8f\x5c\x25\x71\xfd\x23\xb7\x84\xdb\x91\x74"
- "\x75\xbd\x9a\x4e\xf7\x58\xbb\xd3\xa4\xed\xc9\x11\xb3\xc6\x23\x7b"
- "\xd5\x3c\xf4\x0d\xfa\xeb\x93\xb4\xf6\x48\x2a\xc6\xad\x55\xbe\xf7"
- "\x0a\xdd\x1a\xfa\x87\x35\xcb\x9b\x43\xfd\x1a\x8f\xb6\x0a\x58\x14"
- "\xb2\x18\xb4\x99\xf8\x66\xb2\xef\xf7\x7b\xfc\xf7\xba\x3d\x62\x0c"
- "\x7a\xf6\x91\x5d\x3e\xd5\x43\x7e\x75\x88\x6e\xa2\x4c\x03\x95\x17"
- "\xd5\xfe\x9d\x5a\x5b\xa8\x3e\x7a\x87\xbe\xa6\x0b\xb9\x1a\x7d\xa6"
- "\x3c\x34\xae\x7d\x76\xd2\xd9\x9d\x03\xcc\xc8\xfe\xad\xa7\x93\x60"
- "\x22\x61\xd6\xb3\x4b\x95\xe9\xd5\x71\xe8\x79\x73\x34\x3c\xe4\xb3"
- "\x62\x04\x6d\xc8\x25\x3b\xa8\x9e\x4e\x15\x7e\x6a\x4c\x83\x1e\x71"
- "\x4e\x5d\x7d\x77\x4f\xd4\xb7\xd7\x85\xf3\xa2\xdd\xc4\x1b\x91\x4d"
- "\x01\xed\x31\x49\x7c\xed\xc9\x89\xfa\x2e\x27\xf3\x0c\x78\x64\xf0"
- "\x90\xeb\x5f\x16\x31\xe2\xd2\x86\x5d\x3d\x85\x11\x78\xcb\x72\xc6"
- "\xa8\xe3\x7a\xad\x0e\xe4\xb9\x5b\x6b\x27\xee\xd5\x35\xb8\xc7\x1d"
- "\x19\x93\x23\x5e\xed\x3b\xd2\xdf\xe0\xb9\x82\xe2\x2d\x8e\xe3\x87"
- "\x5e\xe7\xc1\xea\xde\x1e\xbc\x57\xe2\x23\x3b\x3a\x8b\x6c\xcc\x01"
- "\xd7\x45\x12\x87\x8e\x26\xc9\xb5\xf0\xa8\xf0\x0b\x46\xfb\x84\x32"
- "\x2e\xc9\xd1\x34\x94\x3b\x57\xd6\x77\x54\xf5\xff\x78\x14\xf2\x9f"
- "\xf7\xee\x8b\xe5\xba\xfb\x17\x67\xd9\xe6\xdf\x2e\xce\x96\xde\xb2"
- "\xca\x4e\xc7\x46\xb3\x22\x0f\xa3\x79\xee\x84\x88\x2f\xaf\xa3\x35"
- "\x61\x5f\x5e\x65\x87\x9a\x24\xfc\x8f\x76\xf3\x21\xbe\x89\xce\x7d"
- "\xf0\x02\x5e\x5b\x85\x31\x74\x9e\x63\x57\x53\x1c\xd9\x22\x3b\x3f"
- "\x4e\x7e\xde\x40\x2f\xf7\x83\x7e\x74\x14\x9d\x63\x93\xc8\xa6\x88"
- "\xe8\x0f\xe9\xbd\x78\x2c\xd2\x37\x76\x76\x44\xce\x9b\x1d\x3f\x48"
- "\x67\x24\xb9\x33\x83\xe2\x80\xf7\x12\x3e\x90\x7d\x79\x1f\x3b\xbe"
- "\x0b\xf9\x7a\xf1\x2e\xbf\x52\xe8\x12\xba\x52\x42\xc6\x43\x1b\x9c"
- "\xa7\xd8\x44\x11\x53\xcc\x11\x60\xb6\x9f\xd1\xb9\xa4\xde\x7b\x78"
- "\x6c\x57\x0a\xd2\xe3\x45\x7a\x00\x75\x6f\xec\x4a\xc1\xbb\x78\xbc"
- "\x5b\x83\xab\x82\x32\x1c\x55\x68\x77\xd1\x29\x76\x3d\xda\xd2\xcf"
- "\xcb\xba\x52\xd0\xce\x3e\xe7\x53\x6c\x6a\xbb\xbd\x9f\xe4\x3b\x94"
- "\xe7\x95\xb1\xd2\xf0\x2d\xbe\x3b\x80\x7e\x39\x48\x27\x82\x6b\x61"
- "\x25\xae\x45\x21\x16\x5f\xb4\x0e\xeb\xde\x3a\xd4\x4f\xe7\x37\x51"
- "\x0e\xf9\xda\x90\x6d\x41\xdf\x48\x87\x86\x72\xd7\x0d\xf0\x3e\x94"
- "\xdd\x7f\x00\x92\x9d\xc7\xd1\x19\x2e\x53\xe5\xa9\x31\xbf\x8f\xef"
- "\xe4\xe5\x3d\xcd\x68\x53\x2d\xd9\x5d\x23\x0d\x34\xf9\x78\x63\x84"
- "\x1f\x3e\xfe\xa6\x7a\x1f\x1b\xce\xeb\xcc\x60\x45\xe7\x99\x55\xd8"
- "\x0e\xac\x8e\x01\x3d\x3e\x3e\x8b\xfc\x3d\x45\xca\x3c\xf6\x1b\x2a"
- "\xaf\x02\xe5\x39\xb3\x59\x2c\x68\xb5\x11\x6d\xa4\x98\xaa\x47\x04"
- "\x9c\xc4\x1c\x3b\xb6\x0b\x7d\xa9\xa1\x3e\x29\x18\xbb\x4a\xcc\x07"
- "\xf4\x47\x87\xfe\xc4\xae\x0b\x85\xcf\xa4\x52\x9f\xa6\x90\x3c\x47"
- "\xfd\x92\xe3\xd8\x35\x1b\xfd\x9a\xbb\x2e\x87\x1f\x41\xdf\xfa\x0f"
- "\xe4\x74\x32\xac\x3d\x96\x76\x7b\x07\x9d\x7f\x38\x22\xe1\xd6\x4f"
- "\xf6\xa3\xb3\xd1\xcf\xb9\x11\xff\xa5\xc7\x29\xe6\x54\x0b\xda\x55"
- "\xa1\xf6\x93\xd2\x52\x23\x3c\xfd\xf1\x5b\xd4\x7b\x53\x38\xef\x37"
- "\xfa\xd9\xd7\x10\xd5\x4f\xfa\xfe\x73\x2a\x4f\xed\xa7\x09\xfd\x8c"
- "\xfd\x66\x3f\x81\x4f\x05\x7c\x83\xda\xcf\x32\xb5\x9f\x7a\xf4\xd3"
- "\x84\x7e\x4e\x8b\xea\xe7\x15\x17\xf5\x73\x0e\xfa\x39\x1f\xfd\xec"
- "\x89\xea\x67\xc2\x18\xfd\x9c\xe3\xa5\x3a\x36\x76\xcd\x97\x7e\xb0"
- "\x8e\xce\x97\xe7\xbc\xfb\x5a\xc2\x7e\x26\x86\x78\x33\x9d\x63\x54"
- "\x0a\xf8\x2e\xd2\xdf\x90\xde\x88\x64\x3d\x3a\xcb\x98\xb9\xa6\xac"
- "\x58\xe8\x6e\xa6\x4a\x3d\xb4\xe4\xaf\xfa\xfc\xe1\x73\x17\x2f\x8b"
- "\x58\x11\xf2\x9c\x22\x9d\x7d\xcc\x65\x42\xf7\x38\x6f\xcd\x6a\x27"
- "\x7d\x4f\xdf\x0e\xbb\x8e\x27\x47\xce\x87\xf5\x49\x9d\x39\xe0\x47"
- "\xf7\xe4\xf3\x49\xea\xf3\x8f\x2e\x92\xfa\xfc\xe3\x61\xff\x17\x80"
- "\x4b\x2b\xc1\x45\x9c\xdb\x24\xbb\xca\x10\x2b\xcb\x0c\x96\x69\xe7"
- "\xaf\x07\x90\xb7\x30\xea\xfc\xf5\x80\x68\xc3\x05\xe1\xe3\x60\xf5"
- "\xbc\xe0\x6a\x2e\xcf\xe5\x1e\x6f\x88\xd4\x7d\xcc\xa6\xd6\xdd\x4c"
- "\xf7\x3e\xe9\x83\x8c\x74\x6c\x36\x69\x2b\x73\x7c\xbf\x66\x9f\xe2"
- "\x65\xbd\x46\x9a\xcb\x63\xc7\x55\x38\xee\x1f\xed\xf3\xa8\xbf\x95"
- "\xfc\xba\x0f\xbb\xfa\xcd\x91\x33\xd5\xfd\xd6\xbf\x76\xa6\xda\xe9"
- "\xc3\x38\x61\xbe\xd9\x45\x8c\xe0\xfe\x2c\xbe\xf1\xd0\x06\x19\x9b"
- "\xa0\xff\x37\xd4\xce\x1e\xd6\x4f\xcf\x16\xb9\x97\xd3\xbf\x4a\xa5"
- "\xcd\xde\x79\xa1\xa0\xc5\x8b\x3a\x85\x0f\xa5\xc8\xf3\x72\xf2\x09"
- "\x81\x7c\xaf\x49\x9f\xce\xfd\x59\x17\xe5\xa7\xf7\xc5\x17\x3d\xa7"
- "\x5f\xf4\x6c\xf3\x83\x66\x8d\x67\x87\x53\x39\x4d\xe8\x78\x8b\xe3"
- "\x4b\x98\xdd\x79\x82\xc5\x00\x17\x8f\x51\xdb\xda\xfb\xc5\x19\x3d"
- "\x0b\x77\xa5\x31\x4f\x7f\x50\xf2\xed\xe0\x97\x7a\x92\x91\xe7\x04"
- "\x9b\x4a\x67\x44\x28\x76\x03\xf2\x9f\x94\xf1\x1a\x4e\x3e\xbc\x70"
- "\x95\x89\x29\x3f\xcd\x98\xcc\xf5\x4b\xac\x64\x07\xb0\xf3\x82\x97"
- "\x62\x1e\xe8\x8a\x36\xb3\x24\xa2\x53\xc0\xe1\x5e\xae\xcf\x22\x3f"
- "\x63\x03\xaf\x5e\xe8\x9f\xe0\x09\x7e\xc9\xec\xa0\x9f\x27\xd9\xc9"
- "\x74\x43\x21\x33\x54\xf7\xb1\x04\xe0\x59\x70\x4f\x70\x16\xd3\x7c"
- "\x1a\xd4\x5d\x21\xcf\xca\xd7\x01\x27\xf3\xac\x3c\x30\xec\x3a\x51"
- "\x07\xb9\x76\xa1\xa6\xbf\xa8\x90\x3e\xcd\x0c\xa8\x3f\x56\xf8\x5f"
- "\x90\xfc\x01\x60\x7b\xa2\x4b\x9e\x11\x4d\xfc\x07\x7c\xd3\x11\x91"
- "\x6d\x4e\x2e\x94\x30\x3c\xa4\xea\x7a\x4f\x2e\xdc\x03\xa8\x6e\x90"
- "\xf6\x4c\x89\xc8\x1b\x0c\xdb\x33\x09\x9d\xe0\xc9\x85\x18\xc3\x46"
- "\x29\xf7\x1c\x6a\xcc\x0c\x19\xd5\x39\x4e\xe9\x7b\xd3\xe9\x5b\x7c"
- "\x67\x91\x71\xe5\x4e\xce\x8a\xe0\xda\x49\xd2\xb5\xea\xd0\x27\xe0"
- "\xcf\x89\x7c\xea\x17\xc1\xc4\x2f\xfc\x97\x9d\x70\xec\xd9\x31\x4e"
- "\xdc\x11\xe3\x5e\x5f\x50\xe8\x97\x4c\xb5\xc0\xa7\x53\x18\x83\x2b"
- "\xc9\x87\x93\x07\xf5\x1c\xa8\xbf\xc0\x0e\x58\x07\x59\x3b\xee\xe9"
- "\xdc\x82\xfb\x67\x47\x59\xaf\x6d\xec\xb5\x1c\xfc\x80\x1d\x6d\x2e"
- "\xa6\xb2\x88\xd6\x90\xad\x27\xf9\xda\x6b\x07\xd7\xe6\xe9\x65\xa2"
- "\x8c\x03\x4a\x3f\x3b\xe0\x38\x42\xba\xed\xda\xf6\xfa\x2f\x59\xbb"
- "\xf5\xcf\xa2\x1e\xe2\xb7\xdd\xb9\x83\x97\x2a\xbb\x06\x65\x37\xa8"
- "\x65\x0f\xa0\xec\xc4\xf1\xcb\x8e\xf5\x5d\x66\xd9\x97\xd1\xee\x58"
- "\xef\xe5\x94\xed\xac\xe5\x21\xd0\xe1\x38\xac\xf1\x76\xf2\x43\x4a"
- "\xe7\x53\x43\x43\xe4\x7b\x65\x3a\x97\xf6\xf3\x03\xdf\x21\x7a\x23"
- "\x6c\x3b\x36\x76\x2e\x17\x67\x57\x49\xcf\xae\x9e\x59\xf5\x04\x8f"
- "\x31\xd2\xbb\x0f\xbb\x06\xc2\xf6\xdf\x51\xfb\xda\x90\x05\x06\x66"
- "\x4b\x3b\xe9\xce\xe5\x12\xb7\xfe\xfb\x3c\x95\x35\xb6\xcc\xd9\x55"
- "\x27\xed\xed\x07\xd6\x69\xfa\xad\xc1\xd8\xae\x3a\xb5\x2c\xdb\xc5"
- "\x7a\x53\xd5\x61\x8e\x2d\xdb\x91\x6f\x5b\x9d\xbb\x2c\x3f\x5b\x3b"
- "\x5c\x6d\x62\x8f\x66\x2f\xc9\x5e\x56\x90\x9d\x65\x5b\xb0\x2a\x77"
- "\xc5\x2d\x2b\x97\x2e\xb5\x3d\x9c\x9d\x97\xb7\xf8\xa7\xd9\x26\xb6"
- "\x20\x77\xf1\x8a\xbc\x65\xa4\xdb\xb4\xd9\x66\xdf\x99\x99\xb3\x32"
- "\xff\x96\xef\xcf\x4e\xbb\x48\xb7\x49\x67\xad\xbb\x49\xc6\xc1\xfa"
- "\x34\x15\x3c\xc6\x14\xf2\xbf\x63\x59\xc3\xdd\xcf\x40\xbe\x06\x0e"
- "\x9e\xa4\xb5\x90\xd6\x1f\x92\xbd\xc8\x8f\x2f\xf9\x06\xde\xfa\x32"
- "\xef\xe8\x63\xfc\x3b\xe0\xdb\x3b\x91\x46\x7e\x78\xbb\xf9\x05\xa7"
- "\x8f\xc6\x00\xe9\x53\x90\xa7\xf5\x39\xa4\xf9\x62\x0f\x35\x56\x1f"
- "\x62\x06\xc9\x63\x9c\xaa\xe1\xfa\x49\xbc\x82\x7c\xea\x1e\xb5\x32"
- "\xd5\x57\xb7\xde\xe3\x0d\x90\xfd\x8f\x71\x5e\xd0\xc9\x89\xa6\xca"
- "\xf9\x75\xea\x79\x39\x4f\xf7\xd5\xc8\x73\x08\xca\x19\x92\x11\xd7"
- "\x8b\x38\x67\xa7\x40\xff\x0f\x1b\x23\xb4\x7a\x48\xe3\xcd\x3b\x01"
- "\xf7\xd5\x3d\x78\x96\x3e\x45\x4e\xed\x1f\x6d\xdb\xf5\x75\x13\x63"
- "\x23\x89\xf2\x47\xdf\x8c\xd8\xe4\x8f\xee\xa3\x7f\xca\x41\xf9\xbb"
- "\x38\xfd\x7f\xfa\xd3\xea\xff\x7b\xbf\x1f\xae\xb9\xf4\xef\x6f\xa9"
- "\x5f\xf4\xfb\xff\xc7\xfe\xff\x4f\xbe\x1f\xae\xbd\xd4\x8f\xf0\x0d"
- "\xb8\xd5\xfd\xdc\x21\x66\x04\x7e\x6e\xaa\x7c\x02\x38\xfd\x15\xb3"
- "\x16\x06\x79\xaf\xf3\xdf\x59\x52\xd1\x09\xf0\x60\xe0\xb5\xf2\x1d"
- "\xbc\xb7\x68\x88\xf4\x12\xc3\xcb\x80\xbf\x2d\x55\x3d\xcc\x5c\xd9"
- "\x03\x3e\x2b\x5f\xc6\xc7\xa0\xfd\x26\x3a\xa3\xe5\xc1\xf3\xfe\x82"
- "\x00\xfb\xc4\x77\x86\xec\x21\xdd\xed\x8b\x40\x7b\xba\x19\x23\xfc"
- "\x35\x2f\x62\x89\x75\x53\xf9\x6e\xee\x7a\x31\x91\xeb\x5f\x34\x20"
- "\xed\xe0\xdb\x4a\xfa\x84\xb7\xd7\xb6\x4d\xb0\x3d\x41\xeb\xbc\xef"
- "\x5f\x55\xdc\xec\x92\x67\x10\x87\x84\xcd\x99\xea\x4b\x19\xeb\xd3"
- "\xf0\x63\x72\x4d\x1f\xbe\x41\xd5\xe7\xe1\x7e\x68\x1f\xdd\xa3\x1f"
- "\x2d\xdc\xb5\xc4\x4a\x65\xbe\xa5\xb4\x4c\xa0\x35\xf3\xed\xb5\xe9"
- "\x13\x0a\x17\x33\x7d\xbb\xf7\x24\xdb\x03\x5a\x48\x7b\xe1\x98\x77"
- "\x4d\x98\x67\xcd\xdb\xa6\xf2\x1a\xb4\xaf\x02\xfc\x5c\x19\xda\xd4"
- "\x38\xec\xf2\x41\xfe\x3b\xd9\xac\xf2\x72\x24\x33\x37\x55\x22\xcf"
- "\xbc\x55\x6c\x7a\x25\xf2\x81\xb7\x2b\x23\x19\x45\xb6\xcf\xff\x2e"
- "\x60\xb0\x0b\x75\x76\xd8\x1e\xa7\xe7\xb3\x82\xc7\xa0\xba\xd1\x0f"
- "\x5b\x0f\x3b\x2b\x64\x7e\xaa\x43\xab\x77\xd8\x75\x06\xf4\xef\xbf"
- "\x73\xd4\x3d\xc6\x1a\x59\xce\x99\xb9\x72\xbe\x76\xfa\x29\x66\x9f"
- "\x7a\xc6\xcb\x5f\xb9\x16\xeb\xfa\x05\x66\x44\x1d\x9b\x50\x87\xdb"
- "\x52\xc2\xb8\x85\xce\x07\x77\x07\x21\xd7\x28\xaa\xed\xed\xd9\xdb"
- "\xd5\x6f\x05\x1f\x22\x78\x8f\x10\xf8\x7b\xa1\x9f\x01\xff\x91\x03"
- "\x3a\x01\x9e\x43\x9c\xad\x00\xbf\x41\xe9\xa8\x63\x13\xfa\xd5\x01"
- "\xb9\x79\x17\xd6\x6e\x8a\xf1\x67\x7c\xfc\xdc\xbf\x30\x11\xaf\x1c"
- "\xfc\x42\x9e\x83\x07\x64\xfc\xb2\x33\xfb\x35\x7e\x81\xf0\x83\x78"
- "\x84\xca\xc7\x99\x61\x04\x63\x0c\x1c\x69\x03\xff\x01\x9e\xfe\xac"
- "\x51\x1d\x9b\x36\xc1\x17\xa8\x71\x5b\x25\x0d\x3f\x7b\x15\xd6\x77"
- "\x33\xea\x68\x83\xe4\x28\x60\x21\x69\xd0\xd9\x64\x6d\xad\x97\xb1"
- "\xc7\xcf\x1a\x39\x68\x1d\xe0\xb6\x2b\x75\x91\x8e\x79\xd9\x99\xe5"
- "\x18\x8b\x5d\x94\x97\xfc\x67\x20\xff\x02\xf0\x63\x07\xd5\x31\xe9"
- "\x86\x4c\x00\x3e\xe0\x4c\x37\xb5\x03\xdf\xec\x07\xac\x69\x2c\x2a"
- "\x54\x3a\x76\x50\xf2\x30\xfe\x55\x1a\xec\x31\xd6\x1b\x22\xf0\x3f"
- "\xdb\x10\x0d\x7f\xc0\x62\x83\x3a\x96\x33\xa2\xc6\x0e\x72\xe9\x60"
- "\x80\xf4\xd0\xa8\x6f\xb7\xd4\xa1\x9d\xed\x22\x1f\x67\xc0\x99\xdd"
- "\x80\xc5\x6e\xe4\x6b\x21\xda\xbc\xfe\x10\x68\xee\x13\xc4\x43\x0d"
- "\x1e\x91\x3c\xea\x60\x31\xe1\x30\x9e\x45\xec\xbe\x5e\x76\xc6\x4b"
- "\xe5\xe1\xf9\x5f\x71\x05\x2f\x3b\xf8\x90\xb3\x8e\xe2\x89\x76\x91"
- "\x9e\xc8\x24\xc7\xba\x2b\x7d\xd8\x35\x38\x4b\x3b\xbf\x44\x38\x40"
- "\x63\x8f\x3e\x7a\xa5\x9e\x62\x70\x16\xe9\x1a\xc5\x77\x23\x39\xd4"
- "\xc6\x6e\x9a\x9f\xda\x7b\xa4\xf7\x93\x6f\xd8\x28\xd8\x78\xd5\x31"
- "\x69\x91\xb1\xf9\x06\xbb\xd4\xb6\xed\xc2\xb3\x11\xcf\xd2\x6e\x6f"
- "\x24\x27\xa6\x9a\xbe\x29\x8a\x7c\x43\xf3\x07\xb8\x6c\x41\x9e\x4f"
- "\x71\xe5\x5a\x5e\xf2\x0f\x8f\x76\x64\xbc\x28\x7c\x74\x0d\xda\x07"
- "\x47\x52\xf4\xa8\x37\x80\x7a\xf5\x84\x1b\x84\x17\x5a\x19\xd5\x12"
- "\x46\x4d\x18\x3f\x81\x5f\x7b\x82\x2d\x80\xbb\x1f\xfc\xff\x5f\x7c"
- "\x92\xbf\x1b\xcc\x50\xdb\xe7\x96\x31\x23\x06\xca\xea\xa5\x3f\x1d"
- "\xca\x97\x1e\x96\x77\xc2\x7c\xe6\x60\x06\xe1\x1e\xca\xda\xaf\xe2"
- "\x84\x05\xf9\x72\xc2\x38\x24\x7c\x15\x0c\xf6\x13\xaf\xa9\xb6\x9f"
- "\xe6\xd4\x11\x09\xbb\xb3\x65\x84\x03\xe0\xe3\x1b\xd5\xb9\xe6\x25"
- "\x5e\x55\xe2\xa1\xbf\x49\x2b\x43\xfa\x3b\x18\x9c\xa5\xa0\x0c\x0d"
- "\x57\xa2\x69\x03\xf2\x76\x82\x2e\x84\xf1\x46\xa3\x05\x2a\x9d\x9a"
- "\xa2\xf2\x21\xb5\x18\x1b\xf2\x4b\xee\x16\xfe\x9e\x04\x5e\x9e\xeb"
- "\xdd\xe3\x0f\xb2\xe7\x08\x2f\x1f\x27\x9a\x70\xee\xbe\x41\x53\x8f"
- "\x3b\x82\xdb\xe7\xd2\x34\xdc\x8e\x1a\x57\x81\xdb\x1b\x04\x3d\x3a"
- "\x37\xdf\xcb\xd2\xe6\x6a\xb8\x4f\xf3\x5c\xc1\xbc\xae\x2e\x10\xfb"
- "\x03\x16\xd2\x07\x8a\x79\x1f\x18\x10\x32\x06\x8d\x67\xbb\xa3\x57"
- "\xf8\x82\x5f\xaf\x30\x63\xbb\xff\x18\xe9\x47\x4e\xd2\xfc\xd7\xe6"
- "\x38\x8d\x0d\xea\x22\xdb\xa1\x8e\x0d\xa0\x81\x34\x07\xfd\x68\x13"
- "\xc5\xa8\x27\xdf\x67\xad\x0b\xd3\x59\x1e\xc6\x76\xcf\x22\x1a\xb7"
- "\x73\x1d\xda\x79\x89\x6a\x49\x03\xcc\x2a\xbe\x88\x36\x5e\x04\x57"
- "\x8b\x84\xeb\x90\x61\xf4\xfc\x1e\xdc\x41\xf3\x3b\x1a\xae\x04\x53"
- "\x82\x2d\xf2\xa2\xff\xff\x6d\xd6\xe0\x1a\x05\xd3\x57\x54\x7c\x54"
- "\x69\xeb\xd0\x98\xb4\xb5\x5a\xc6\x46\x68\x59\x4f\x7d\xc1\x9a\x42"
- "\xf5\x8b\xd8\x3f\xaa\xec\xd3\xea\x23\x9c\x1a\xda\xe4\x65\x59\x8d"
- "\x1a\x1d\x43\x7b\x84\xbf\x39\x1a\x2b\x8d\x76\x90\xae\x4c\x6d\xbb"
- "\x5b\x1b\x0f\x6a\x77\x34\x4d\xc0\x7a\x23\xce\xf7\x45\xfa\x3c\x74"
- "\x06\xdf\x5d\x41\xb4\x2d\xc2\x5f\x0d\xb3\xd1\x7d\x1f\xea\xa7\xbe"
- "\x13\x4e\xd8\x0b\x48\x5f\x26\xd7\x32\x2f\xf3\xe5\x8f\xa6\x57\xbe"
- "\x65\xd2\x2e\x43\xf2\x63\x44\xef\xed\x8f\xcb\xfc\xb4\xbe\x21\xbf"
- "\xd0\xcd\xab\xeb\x21\xf1\x6a\x94\xb6\x48\x85\x41\x37\xf2\xb7\xd2"
- "\x19\x6c\xf2\xc3\x33\xb9\x5b\xca\x82\xa0\xd1\xbb\x29\x46\x04\xf2"
- "\xd9\xda\x21\x07\x04\x27\x32\x56\xa7\xf2\x9b\x44\x27\xf8\xea\x8c"
- "\xc9\xab\xfb\x59\xac\xfd\xfb\xfc\x68\x1f\x0b\x5c\x87\x79\x14\x20"
- "\xbf\x90\x28\xdb\xd6\xc7\x2e\x84\x50\x6f\xa2\x7a\xb5\xe2\x7a\x0c"
- "\xd7\x6b\x70\x3d\x80\xeb\xb5\xb8\xfe\x06\xf9\x15\x35\x7f\x1a\x9e"
- "\xb7\x21\xfd\x4e\xf5\x8a\x36\x06\x68\x3f\x7b\xfe\x73\xc4\x57\x3e"
- "\x2e\xd2\x9f\xa6\x67\x5c\x17\xab\xfd\xde\x2f\xe7\x76\xe0\x3e\x94"
- "\xe3\xa0\x7c\xb4\xae\x21\xcd\x8e\x3c\x37\x50\xd9\xe4\x13\xa1\x8f"
- "\x9d\xef\x8a\xe2\x4f\x51\xce\x79\x3a\x9b\x71\x17\xbe\xdb\x87\x6b"
- "\x3e\xae\x95\x54\x2e\x60\xd0\x11\xa1\x17\x67\xbc\x59\x0e\x39\x9e"
- "\x5e\xe6\x5f\x48\xf3\x5d\xa3\x07\x84\x4f\xa3\xf2\x2d\x94\xf9\xa4"
- "\xfc\x1a\xd8\xad\x8d\x5d\x50\xe2\xad\x3d\x88\xb1\x43\xf9\xf7\xd1"
- "\xf7\xb8\x3e\xa0\x5e\xd3\xd5\xeb\x83\xea\xf5\x9f\xd5\xeb\x6c\xf5"
- "\x3a\xc7\xcb\x02\x15\x2a\x6f\x02\x98\x05\xc8\xbe\x8f\xf6\xa4\xd4"
- "\x7a\xcf\xbb\x49\xbe\x06\xfd\xff\xce\x20\xc5\x7b\x73\x9d\xbf\x4b"
- "\xd3\x5b\x93\xee\x67\xc4\x35\xf0\xea\x56\xa1\xfb\x39\x3f\x37\x8a"
- "\x16\x3a\xcc\xba\x74\x06\xde\x69\x62\x9d\x1e\x7c\x83\x2c\x67\x87"
- "\x5e\xdd\xaf\xa7\xb8\x27\x14\xc7\x8e\xfc\xf1\x09\x39\x2a\x6e\x26"
- "\xc9\xf3\xdd\x42\xa7\xbf\x91\xfc\x0b\x1d\x2a\xc4\xaf\x0c\x32\x45"
- "\x85\x46\xef\x49\x5e\x52\xfd\x6e\xb6\xa2\xae\x96\x88\x9c\x7f\x3e"
- "\x47\xee\x6d\x5e\x8d\x75\xe9\x7c\x94\xfc\x7f\x3e\x99\xda\x0c\x58"
- "\x77\xa2\x3f\x77\xf5\xb0\xf3\x01\x5c\xef\xe8\x95\x7d\x4e\xd3\xfa"
- "\xac\x8e\x95\x5d\x83\x79\x2f\x0b\x6c\x02\x3d\xcc\x25\xfc\xee\x09"
- "\xd3\xe5\xc0\x26\xba\xaa\xf8\x83\x71\x0e\x3c\x48\xe3\x1d\x45\x4f"
- "\x3a\x23\x74\xfa\xc2\x82\xd1\xe3\x72\x76\x41\x50\xf2\x0b\x9d\x98"
- "\x97\x84\x03\x49\x17\xcd\x4b\x8a\x59\x7f\x85\xfa\x6d\xcd\x68\x1a"
- "\x3f\xd4\x4f\x34\x5e\x6d\x23\xf0\x76\x38\x48\x63\xe3\x65\x17\xec"
- "\xea\x9a\xd4\x89\x35\xf2\x3b\x48\xef\x95\xed\x94\xe9\x6a\x5d\xc0"
- "\xbf\x61\xf2\x87\x7a\xad\x96\xae\xe2\x37\x95\x73\x90\xc6\x5a\x4b"
- "\x57\xcb\x07\x9e\x0e\xef\xa7\xf9\xa3\xa5\x4b\x9c\x3c\x97\x4c\xf4"
- "\x86\xbe\x0d\x0a\x5b\x46\xc8\xdf\x8f\xb7\xa2\xdd\x23\xf3\xc1\x5f"
- "\x34\xd0\x7c\x5e\xbf\x96\x99\x57\xd7\xb2\x38\x39\x37\x47\x9e\xd6"
- "\xbe\x95\x3a\xfd\x91\x2c\x8d\x46\x55\x0b\x7a\x76\xae\x73\x34\xad"
- "\x54\x74\xdc\x65\x09\x06\x8d\x87\xf2\x0f\x04\xef\x92\xb6\x9f\x53"
- "\x79\x1d\xbe\xab\xf3\xb2\x17\xdc\xea\x5a\xb2\x5f\xee\xa9\x8c\x7c"
- "\x7a\xa0\x41\xd2\x2e\xb5\xec\x30\xfd\x8b\xe2\x43\x04\xad\xa7\xba"
- "\xa8\x2c\xac\x2b\x09\x7e\x67\xc6\x64\x49\xbf\x47\x7c\x5e\x36\x39"
- "\x59\xa3\xad\xb4\x3e\x59\x74\xcc\x5e\xf5\xb8\x5c\x9f\x14\xd2\x81"
- "\xd9\xfd\xc2\x9f\x5a\xbb\x7d\x80\xd1\xba\x49\x7e\xae\x33\xd7\x98"
- "\xc8\xdf\x54\x46\x1f\x0b\x1d\x03\x7f\xb6\x43\xdd\x9b\x81\x9c\x1b"
- "\x7a\x89\x64\x59\x15\xae\x98\x4f\xa1\x35\xea\xb8\x74\xa3\x3d\x3b"
- "\x88\xb6\xaf\x2f\x90\xb1\x83\x48\x1f\x24\x62\x4d\x11\xcf\x6a\xe5"
- "\x01\xe9\xb3\x3f\x58\x1c\xa5\xe3\x6a\x90\xf3\x64\x24\x5b\xc4\x62"
- "\x28\x3b\x94\x2f\xf5\x89\xa1\x38\x99\x1e\xf4\x49\x3b\x04\xe1\x4f"
- "\x93\x9e\xbb\x63\xac\x53\x5f\x97\x7a\xe1\x81\xf7\x25\x3f\x12\x8c"
- "\x8e\xff\x2c\x60\x2d\xfd\xf9\x06\xfb\x23\xf3\x22\xb8\x9b\xbe\xc1"
- "\xb7\xef\x0e\xbb\x42\x4c\x4b\x97\x6b\xcd\x99\x83\xaa\xce\xcc\x31"
- "\xb9\x24\x9d\x81\x36\x4f\xdc\xea\xd2\xe6\x6f\x68\x91\xa8\x5f\x9d"
- "\xbf\xd4\x47\xc2\x07\x9a\xc3\x41\xf2\x09\x86\x39\x4c\x73\x19\xf7"
- "\x85\x41\x6d\xee\x4a\xfe\xae\x53\xcc\x5d\x31\x6f\x43\xf6\x48\x3b"
- "\x42\x29\x2a\xae\x76\x0f\x2e\xb1\x9a\xf1\xae\x02\x6b\xab\xba\x97"
- "\x15\x94\x32\xc6\xc6\x8f\xdc\xca\x10\x0f\x90\x6e\x9a\xf4\x09\xa4"
- "\xb3\x51\xed\x55\x69\xaf\xc4\x4f\x7e\xce\x6a\x30\x1f\x22\xbe\xcd"
- "\x12\x98\xe6\xdb\x0c\xe5\x75\x47\x74\xc7\x41\xcd\x37\x68\x3e\xea"
- "\xab\x73\x17\xfd\x91\xe0\x77\x8b\x9c\x63\x41\xb2\x77\x6e\xf0\x00"
- "\xf7\xb0\xfe\xd4\x52\x2c\xfa\x61\x97\x62\xd5\x70\x0f\x73\x34\x0b"
- "\x38\xfa\xe6\xa6\xa9\xbc\x16\x63\x4a\x36\xf7\xcb\xf1\xfc\x12\xae"
- "\x59\xf2\xaa\x4b\xa0\xab\x8a\xf3\xb5\xf8\x16\xf3\xdf\xd4\xa6\x8d"
- "\x81\x3f\xce\x94\x20\x70\xac\x88\xec\x1b\xd3\xc4\x5e\x3f\xe1\x18"
- "\xe1\x97\xd8\xf3\x07\xae\x59\x4a\xfe\x85\x11\x9e\x09\x7f\x27\x0e"
- "\x1a\x93\xe0\xdd\x84\x67\x28\xab\x41\xf3\xed\xeb\x65\x8a\xba\xdf"
- "\xa6\xec\xd2\xec\xc0\x09\x0f\xf3\x67\xb0\xab\x50\xbe\xad\xd5\xe6"
- "\x27\xdd\xf9\x61\x4f\xf0\x41\x46\x79\x09\x76\x92\x5e\x5e\xfd\x22"
- "\xbe\x89\x1a\xff\xb3\xc2\x96\x75\xcf\x42\xa1\xcf\xbc\x72\xd8\xc5"
- "\x0d\xa3\x69\xce\xa9\x1a\xc1\x57\x62\x7d\xfe\x56\x22\xb3\x01\x6f"
- "\xb1\xd6\xf0\x14\x8d\x1f\xbe\x2d\x91\xec\x2d\x4e\x51\xfb\x48\x06"
- "\x07\xbd\x3d\x95\x42\xeb\xf4\x38\x7a\xe7\xbb\x48\x57\x44\x34\x83"
- "\x74\x4f\xa4\x07\x03\xac\x0f\xf6\xe9\xf4\x6f\x1e\x80\x24\xcf\x57"
- "\x7e\xd3\xbf\x73\x91\x83\x9f\x23\x5f\x58\xb6\x5c\x76\x65\x8f\x4e"
- "\x4f\x67\x35\x3b\x9d\x67\x48\xc7\xc3\x9b\x47\xe9\x78\x22\x1e\x95"
- "\x12\xf1\x73\x44\x7e\x3a\xa3\x7a\xbf\xe1\xd2\x3f\x9d\x4d\xe6\xd5"
- "\xa5\xe2\x37\x4b\x85\xd5\x9f\x87\x4b\x59\xa2\x06\x2b\xa2\x29\x44"
- "\x63\xc9\xce\x86\xe6\xb9\x2e\xc8\xc8\xd7\x11\xc6\x09\xed\x5e\x7f"
- "\xf3\xa3\xee\xb5\x90\x69\x75\xec\x41\x21\x73\xe8\x2f\xf3\x4c\xb6"
- "\x8e\x89\xf1\x14\x7e\x54\x75\xcc\x88\xba\x8f\x56\x9f\x66\x06\x7b"
- "\x2e\xbb\x8e\x74\xe8\x96\x10\x77\x93\x0c\x4c\x38\x01\x18\x74\x9c"
- "\xd4\xe9\x62\xf3\xd7\x31\x3d\xde\x4f\x3f\xa9\x63\x01\x8d\x97\xc2"
- "\x37\x09\x31\x01\x96\x48\x3c\xd4\x03\xeb\xd8\x74\xb4\xff\xa0\x36"
- "\x56\xc4\x67\x90\x1e\x2f\x1c\xd7\x49\xc7\x84\x2d\x00\xf9\xac\xf7"
- "\x12\xdc\x34\x5a\x75\x9a\x99\xf1\xec\x8e\xf1\xb3\x04\xb1\x0e\x95"
- "\xea\x80\xff\x03\xc2\x46\x10\xe9\xdd\xc0\xfd\x83\x91\x76\x5a\xaf"
- "\x8a\xba\x7f\x8c\xbe\xb7\xf8\x89\x87\x1b\x0f\x3e\xba\x6c\x0d\x3e"
- "\x74\xee\xc0\x02\xfe\x5f\x8c\x77\x90\x0f\xa0\x6d\xfb\xed\x6b\x99"
- "\xf1\xa4\x4e\xff\x18\xfa\x48\xe7\x7a\xdb\x84\x8e\x5f\xa7\x7f\x48"
- "\x93\xd3\x65\xbb\xf5\x57\x59\x4a\x62\x18\xe9\xe6\xc9\xdf\xa3\xb0"
- "\xc5\xfc\xda\x2a\xf4\xf1\x1e\x4c\x6d\x77\xd1\xf7\xa8\x9e\x23\xea"
- "\x5a\xd6\x3d\xe8\xb4\xb2\x3d\xd6\xbb\x19\xfa\xe1\xf5\xea\xbe\x4a"
- "\xba\x6c\x9b\x57\x9d\xce\xab\xc2\x77\xbf\xb0\x15\xd1\xe9\xde\xa1"
- "\xb5\x84\x74\x03\x58\x47\x5a\x69\xbd\x1e\x2e\xd5\xdf\xad\xcd\x1b"
- "\xac\x13\xad\xf8\x26\xec\xd7\x00\xf7\x4d\xe4\x73\x46\xc8\x0f\x32"
- "\xbf\x59\xec\x1b\x94\xea\xed\x61\x7e\x1b\xf9\xe8\x3b\x61\x43\xa8"
- "\xd3\x6d\xc8\x0c\xe9\x00\x53\xdd\x06\xea\x9b\xc4\x45\xeb\x4f\x90"
- "\xbf\x21\x3c\x6f\x31\x0e\x62\xde\x0e\x44\xcd\xcb\x52\xbd\x3b\x22"
- "\xa7\x72\x3a\x5b\x6c\x1b\x6b\x1e\xda\xe3\xb1\x56\xe9\x62\x6e\xaf"
- "\xae\xe6\x0d\x35\x7a\xe5\xfe\xf5\x55\xcc\xac\xab\x00\xd8\x68\x9e"
- "\x15\x2c\xba\xaa\x4f\x17\x73\x9f\xc5\x7c\xf5\xfc\x07\xf2\x27\xf1"
- "\x22\x2b\xd3\x57\x9e\x9d\x64\x9c\x11\xb8\xba\x81\xc7\xdc\xfc\xe8"
- "\xc3\xf9\xb4\xf7\x5d\xc3\x8e\x2f\x67\x31\x0f\x84\x50\xb7\x99\xd9"
- "\xbd\xba\x09\x73\xe9\x8c\xfa\x1e\x33\x78\x11\xdc\x53\x99\x85\x75"
- "\xcc\x58\xd8\xcb\xfb\x2b\x96\x4e\x30\x62\xfd\x4d\xc0\xba\x51\x36"
- "\xd9\x7c\x75\xc3\x08\xca\xf8\x70\x91\xf8\x6e\x4c\xdf\xa6\x6a\xdb"
- "\x0e\x8c\xdd\x36\xfb\x54\xb4\xed\xab\xcb\x6b\xdb\xc4\x8a\x48\xdb"
- "\x26\x56\xfc\xcf\xdb\x66\x58\x16\xd5\xb6\x84\x48\xdb\x72\xd0\x36"
- "\xc3\x9a\xcb\x6b\xdb\xa4\xfd\x91\xb6\x4d\xda\xff\x37\xb6\xad\x69"
- "\xfc\xb6\x4d\x98\x30\x76\xdb\x1c\x57\xf7\xe9\x26\x5c\x75\x79\x6d"
- "\x8b\x35\x47\xda\x16\x6b\xfe\x9f\xb4\xad\xa8\x8e\x1f\x6b\x07\x97"
- "\x4b\xfa\x1c\xa2\xf3\x7d\xba\x89\xd7\xac\x4b\x12\x76\xdc\x57\xa0"
- "\x5d\x07\x9c\x75\xfc\xa8\xe0\x6d\x74\x13\x84\xee\x7f\xb8\x74\x42"
- "\x19\xf0\x57\xda\x95\xe8\x26\x3a\x28\x4d\x89\x99\xd6\xc8\x5d\x3c"
- "\x78\xab\x9f\x6c\x06\x83\xe4\x97\x85\x7c\x9e\x37\xbf\x3d\x14\xa0"
- "\x78\x13\xee\xed\x67\x0d\xec\xed\x21\x9f\x1e\xdf\xb6\x6a\xbe\x58"
- "\xb5\x6f\x2d\xb5\x97\xa2\x47\x13\xce\x3f\x90\xc3\x2c\x44\x8f\xe8"
- "\x4a\x71\x23\xab\x8b\x26\x19\x1f\x38\x83\x75\xbf\x74\x62\x82\x76"
- "\xd6\x56\x2b\x6b\x5e\xff\x24\x6e\x29\x64\x31\x74\xde\x57\xf8\x6d"
- "\xb4\xfa\x58\x72\x21\x9b\x30\xcf\x81\xf2\x03\x6c\x91\xc5\x81\xb2"
- "\x01\x0f\xc1\xcb\xeb\x26\x3e\x16\xb3\x9c\x99\x37\xa1\x6c\xba\x3e"
- "\x60\x75\xf2\xf5\x9b\x99\x81\xce\x05\xd3\xf9\x5e\x79\xb6\x77\xa2"
- "\x11\xf5\x38\xb4\x7a\xfe\x0a\xfc\xe2\x25\xfc\x26\xfd\x28\x02\xbf"
- "\x49\x71\x11\xf8\x4d\xfc\x54\xc2\x6f\x62\x5b\x04\x7e\x93\x5a\x2e"
- "\x0f\x7e\x93\x0c\x11\xf8\xc9\x6f\x2f\x0d\xbf\x49\xdf\x1d\x1f\x7e"
- "\x93\xe6\x47\xe0\x27\xcb\x1a\x07\x7e\x13\xc7\x86\xdf\xa4\x97\xfe"
- "\x36\xf8\x4d\x6a\xf9\x1b\xe1\x17\x27\xe1\x67\xdc\x1c\x81\x9f\xf1"
- "\xe1\x08\xfc\x8c\x53\x24\xfc\x8c\xc6\x08\xfc\x8c\x81\xcb\x83\x9f"
- "\x71\x76\x04\x7e\xf2\xdb\x4b\xc3\xcf\xb8\x66\x7c\xf8\x19\x6b\x22"
- "\xf0\x93\x65\x5d\x1e\xfc\x8c\x9f\x03\x6e\x09\x2a\xfc\x12\xc6\x87"
- "\x9f\x31\xf0\x37\xc2\xcf\x22\xe1\x17\xdb\x15\x81\x5f\x6c\x65\x04"
- "\x7e\xb1\xff\x2a\xe1\x17\x3b\x27\x02\x3f\xd3\xac\xcb\x83\x5f\xec"
- "\x86\x08\xfc\xe4\xb7\x97\x86\x5f\xec\xbb\xe3\xc3\x2f\xb6\x23\x02"
- "\x3f\x59\xd6\x38\xf0\x9b\x34\x36\xfc\x4c\x57\xfd\x6d\xf0\x33\xcd"
- "\xba\x14\xfc\x2e\x8f\xd7\x30\x09\x59\xe7\x7f\xa1\x9c\x4d\xe3\x95"
- "\x43\x30\x24\xfb\x44\xa5\xd4\xb4\xa9\x5e\x99\x68\x94\x67\x38\x4c"
- "\x73\x21\xc3\xdc\xdb\xa3\x33\x1d\xa9\x57\x26\x18\xb9\xeb\x4f\x2d"
- "\x8a\x6b\xdf\x22\x5e\x32\xd1\xa0\x94\x4c\x32\x90\x2f\x82\x71\xe3"
- "\x50\xeb\x26\xdf\x17\x73\x0d\xbb\x9e\xce\xeb\xad\x07\xbf\x46\xf7"
- "\xc3\xa5\x93\xe7\x82\x17\xe9\xbc\x18\x26\x59\xcb\xf2\x44\x50\xcb"
- "\xdc\xec\xac\x55\x2b\xb2\x16\xaf\xc8\xb7\x2d\x5e\xf2\x64\xde\x68"
- "\x5f\xf1\x22\x1e\xe4\x06\x1a\xbf\xc9\x61\xff\x67\x14\xd3\x91\xfc"
- "\xec\xd9\x67\xb2\xd8\x93\xba\xc9\x1d\xc2\x7f\xbf\xe9\x70\x2a\x1f"
- "\xc9\xd8\x92\xfe\x2d\xfe\x81\xf0\x1f\x38\x92\xb3\x05\xf2\xd4\x41"
- "\xf2\x09\xa3\xee\x43\x41\xb6\x88\x3b\xc1\x63\x8f\x2e\x22\x9b\x0e"
- "\x71\xb6\x43\x67\xb6\x09\x5e\xce\xc5\xdb\xb8\xb1\x2b\x55\x29\x3b"
- "\xba\x88\x6f\x3c\x2a\xce\xb0\xb7\x93\xef\xb6\x82\x98\xe9\x3d\x3a"
- "\x4b\x13\x8f\xed\x4a\xe5\x65\x5d\x69\xea\x1e\x47\x1a\xd9\x8b\xa6"
- "\xaf\xe5\x87\xa9\x3c\x95\x17\xa4\xf8\x1c\x6e\xc9\x0f\x9a\xb3\x2d"
- "\x25\xb6\x18\xca\x4b\x3e\x14\xc9\xb7\xa0\x16\x93\x89\xda\x4d\x79"
- "\xc1\x8f\xdf\x8b\xef\xef\xa5\x98\x94\xe1\x32\x64\x9b\xae\x44\x9b"
- "\xea\x44\x5f\xca\x3a\x3b\x07\x9f\xc9\xd8\x22\xe2\x22\x0a\xb8\x5a"
- "\x9e\x47\x1f\x3a\x45\x3c\xcb\xe0\xd7\x22\x9e\xa5\xfa\xcd\x75\xf8"
- "\x46\xd0\x53\xf2\x9b\x2a\xcb\xb0\xac\xd1\xda\x05\x1e\xda\x84\xe7"
- "\xc5\x51\x75\x4c\xc6\xf3\x43\x51\xef\xcd\x78\xbe\x05\x7c\xe8\x14"
- "\xf5\x7d\x1c\x9e\xa7\x10\x5f\x2a\xfa\x55\x55\x2c\x6d\xa2\x75\xf1"
- "\x64\x1b\x93\xa0\xe6\x99\x72\x52\x17\xdf\x45\xbc\xae\x5a\xc6\x15"
- "\x78\x7e\x8f\x64\x46\xf5\x7d\x22\x9e\x5f\xa1\x7d\x01\xf5\xfd\x55"
- "\x78\x7e\x16\xcf\xff\x47\x7d\x0f\xbe\x3e\x6e\xb7\x68\xb3\xb1\x2b"
- "\x99\xfa\x04\xd8\xa7\x13\xdc\x01\xeb\x64\x6e\xec\x3c\x08\x79\xd5"
- "\x49\xe3\x48\xfd\x74\xaf\x3d\xc9\x7a\x74\x71\xef\xd0\xb9\x3c\x39"
- "\x56\x47\x17\x49\xdf\x3e\xfa\x0c\xa4\x37\x53\x3a\xd9\x96\x2b\x1b"
- "\x8f\xa6\xd3\x3d\xda\xfa\x10\xc1\x50\xad\x0b\x32\x51\x5c\xa7\x3a"
- "\xce\x80\x1d\xf9\xdf\x65\xc5\xdb\xd5\xb1\x40\xdb\x26\xa1\x6d\xdf"
- "\x51\xf7\x3d\xda\xe6\x05\x47\xe4\xf9\x22\x5d\x3c\xfb\xbb\xfc\x4d"
- "\xe0\x3b\x49\xf7\xe2\xd3\xb5\x58\x7d\x5e\x5d\x9c\xf0\x15\x41\xf8"
- "\x49\xfa\x15\x5f\x6c\xa7\x5b\xf8\x57\x01\x8e\x6a\xb8\x42\x78\xc2"
- "\x27\x4e\xce\x10\xba\x9a\xd2\xf8\xf0\xf9\x5f\x7c\xdb\xa2\xc6\x37"
- "\x60\x52\x4e\x88\xaf\x0d\xdb\x17\xe9\xe2\x04\x7d\x88\x7a\xb7\x2b"
- "\xea\xdd\xdd\xda\x3b\x61\x03\x57\x1a\xdf\x11\xf5\x2e\xf5\xa2\x77"
- "\x03\x51\xef\x92\x46\x97\x69\x31\x46\xbd\x33\x8f\xfe\xce\x92\x1c"
- "\x79\x67\x0e\x5c\xf4\x2e\x3d\xea\x5d\xbf\xfa\x2e\x06\xe9\x19\x61"
- "\xff\x86\x3a\x73\xa7\x9a\x0e\x5a\x6f\xb1\x47\xa5\xb7\xa9\xe9\x54"
- "\x3f\xf8\xbf\xdf\xb7\xa8\xe9\x02\xcf\x81\x47\x37\xaa\x75\xec\x88"
- "\xaa\xa3\x56\xca\x58\x9d\x6e\x39\x7e\xe6\x04\x8b\xce\x36\x89\x70"
- "\xca\x52\x52\x4c\xb1\x72\x6a\xa4\x2f\x2f\x39\x0f\x45\xbc\x65\x8a"
- "\x09\x8b\x7c\xe3\xd1\xc6\x31\x6d\x04\x4b\x13\xac\xda\x39\xd6\x50"
- "\x59\x67\xab\x52\x61\xea\xa4\xf8\x7b\xe4\xf3\xcb\x39\x40\x7e\x5f"
- "\xb4\xd8\x7b\x17\x98\x27\x7f\xb8\x98\x3c\x25\xa8\x7e\x62\xe2\xc9"
- "\x67\x59\xbb\xd0\xef\x9c\x92\xf1\xf7\xe8\x7c\xef\xc6\xce\xd6\xd5"
- "\x03\x2c\xc9\xfe\x7d\xde\x4b\x72\x9e\xa4\x09\x09\x15\xf8\xc6\xa2"
- "\xfa\x72\xd8\x2c\xce\x9b\xeb\x12\xc8\xcf\xa5\xc5\x33\x20\xf4\xcc"
- "\xc6\x3e\xdd\x14\xab\x78\xcf\x33\x36\xcb\xfe\x4e\xb1\x0a\x59\x5a"
- "\x3d\x57\x88\x76\xba\xc3\xf1\x21\x75\x53\x92\xce\xc5\x1e\x6b\x41"
- "\xda\xc1\x51\xf6\x8d\xba\x84\x53\x54\x26\xf5\xc3\xab\x4b\xa8\xa1"
- "\xb2\x91\x27\x10\xb6\x6f\x44\xfa\xea\x20\x9b\x86\xb6\xf5\x69\xe5"
- "\x0f\x97\x4e\xb1\x7a\x75\x16\x21\x57\x52\x99\xe7\x2a\x27\xa3\xdc"
- "\x29\xa9\x5e\xfd\x9b\x22\xae\x06\xee\x67\x79\xd9\x47\xe6\xf1\xd6"
- "\x3f\xa1\x93\x34\x1e\x75\xf0\xb2\xa3\xc5\x98\xf3\x76\x61\xaf\x1c"
- "\x7b\xd4\x21\x65\xf9\x29\xcf\x92\xfd\x05\xc5\xaa\xa6\x7d\x47\x49"
- "\x77\xa6\x08\x7b\x08\x4a\x03\x6c\x1a\x41\x9f\x45\xff\x2e\x6f\x4e"
- "\x4e\x11\xeb\x5f\xf5\x59\x66\xac\x52\x6d\x5e\xd1\x4e\x6f\x54\x9c"
- "\x06\x69\xff\xaf\xbb\x22\xb6\xdd\x21\xf6\x9e\x44\x1b\x2f\x6e\x03"
- "\xb5\x17\x65\x6d\x18\x77\x2d\x35\x1e\xb5\x0b\x3d\x68\xf9\xa1\x0e"
- "\x61\x4b\xa6\xbb\xe2\x5f\x63\xac\xd7\x02\x3e\x57\xcc\x0d\xc7\xa7"
- "\x40\x9e\x2a\xb2\x09\x46\xf9\xe1\x7e\xe6\x52\x1d\x57\x88\x7d\x34"
- "\xaf\xee\x8a\x32\xd0\x31\x3b\xb5\x41\x4d\x2f\x6b\x0f\x06\xe8\x6c"
- "\xfd\x98\xfe\xb3\x68\x8d\x14\xbe\x97\xca\x8f\xda\xe9\xfc\xc4\x6d"
- "\x01\xad\xcd\x57\x96\x91\xdd\x3e\xb5\x59\xc2\xf6\xca\x75\x1a\x1c"
- "\x2b\xcf\xa2\xec\xa2\x2f\x59\xaf\xee\xca\x09\x64\xdf\x42\xe7\x50"
- "\xaa\xd7\xaa\x36\x57\x48\x13\xf9\x2e\x68\x79\xae\x10\xfa\x0e\xb2"
- "\xf7\x25\x7a\x5a\x4f\x7e\x07\x50\x66\x15\xc6\x42\xf8\x14\xd1\x5d"
- "\xf9\xb0\xd0\x6f\xe6\x32\xd9\x6f\xb2\x67\xd3\x5d\xd9\x24\x71\xe5"
- "\xca\xd9\x5e\xdd\x95\xea\xdc\x95\x69\x14\xeb\x9c\xec\x10\x4e\xeb"
- "\xae\xbc\x81\x62\xa6\x02\x1e\xc5\xe4\x77\xae\xdd\x8f\xf9\xe2\xb8"
- "\x40\xb8\x50\x4c\xb1\xf1\x90\x3f\x59\xae\x0f\x04\xf3\x2b\x8d\x54"
- "\x3f\xc1\x96\xe2\xc5\x02\xa6\x1f\xa1\xec\xb0\xfe\x83\x62\xd3\x02"
- "\x6e\xbb\xc7\x1b\x17\x82\x51\x08\x6d\x26\x2f\x1e\xee\x69\x5f\xa2"
- "\x7d\x89\xcb\x14\xd3\x51\x3b\xd9\x4f\xe2\x5e\xfa\x3a\x2d\x93\x63"
- "\x27\xe7\x52\xe2\x7d\xa8\xe3\x0c\xed\x35\x92\xcd\xb8\x88\xd7\xad"
- "\xbb\xb2\x5f\x85\x9f\x88\x57\x51\x53\x20\xe1\xa0\xe6\xaf\x93\x7a"
- "\x99\x6b\x87\x87\x4b\x13\x67\x45\xf4\x32\x89\xc2\x67\xb1\x66\x63"
- "\x8d\x77\x0b\xa2\xda\xec\x17\xe7\x00\xcf\x92\x4c\x7d\x65\x90\xea"
- "\xaa\x24\xbf\x60\x84\x17\x27\xa3\xf1\xff\xca\xaf\xa8\x9d\x64\x9b"
- "\x17\x8a\x3d\xd4\xc1\x37\x1e\x3a\x48\x70\x46\xd9\x89\x98\x0b\xf6"
- "\x71\xe2\xa1\x8b\x78\x4c\xa8\xaf\x35\x2a\xc6\x2c\xd6\xc1\xc4\x73"
- "\xda\x3a\x47\x6b\x34\xf9\x79\x08\xa7\x55\xce\xc4\x9c\xec\x32\xaa"
- "\x3c\xce\x98\xb4\x4f\xf8\x28\xbc\x95\xa5\xd1\x59\x63\xb2\xd3\x26"
- "\x7c\xe3\xe6\x99\x56\xf2\x7b\x4c\x3e\x1c\xdd\x6b\xef\x40\x7b\xaf"
- "\x7a\xed\xc5\xa9\xe2\x7c\xa3\xdf\x7d\xeb\x59\xb2\xd1\x19\xe8\x2b"
- "\x14\xbe\x89\x8c\xf3\x1c\x41\xbe\x5d\xc6\x98\xf6\xf1\xb8\x99\x56"
- "\x7a\x27\xfc\xfe\x53\x99\x7f\xaf\x0f\x5f\xdd\x55\x76\x95\x97\x19"
- "\x00\x9d\xbc\xfa\xa4\xee\x2a\x71\x9e\x11\xf7\x53\x4f\xea\xa6\x1e"
- "\x90\x71\x11\xa5\x1f\x7a\xd5\xd6\x70\xa2\x3c\x9f\xef\x63\xe2\xbc"
- "\xb4\x6e\xea\x7d\xb6\x9b\x19\x1b\xd0\x4d\x7d\x50\xf8\x84\x2e\xeb"
- "\xb2\xaa\x30\xb0\x56\xcb\x76\x59\x32\x1d\x7a\xd1\x46\x6a\xdf\xe5"
- "\xb5\x6d\xaa\xb6\x5e\x4e\x1c\x2e\x9d\x3a\x5f\x3b\xd7\x2f\xfa\xaf"
- "\xfa\x8a\x76\xcf\x24\xb9\x65\xea\x7b\x12\x07\xbb\x92\xd4\xba\x93"
- "\xfe\x17\xea\x2e\x53\xd7\x43\x9f\xf0\x97\x0d\xb8\x80\x7f\x04\x0e"
- "\x4e\xed\xd4\xd6\x53\xd5\x46\x3e\x55\xae\xf3\x53\x7d\x91\xb5\x54"
- "\xc2\x70\xd4\x99\x9d\x95\x2b\xf3\x6d\x60\xd8\xed\x8b\xf3\x97\xe4"
- "\xd8\xb2\x73\x73\x57\xe6\xda\xc8\xb9\x4d\xf4\x1c\x13\x36\x30\xa5"
- "\x57\x1b\xd4\x18\x67\x8d\xe1\x18\x67\xa5\x57\x87\xf7\x7f\x69\xff"
- "\xca\xab\xbb\x7a\xfe\xff\x8e\x5c\x73\xf5\xb8\xe7\xfc\x6a\xf4\x4a"
- "\x33\x7e\x2d\xf8\xb9\xf1\x23\xff\xe7\x2c\x33\xc0\xd2\xb1\x3e\x8a"
- "\xf3\x69\x91\xf3\xea\x57\x27\xd3\x3e\x78\x8f\xee\xea\x7d\xf5\x8a"
- "\x81\x09\xbf\x26\x2e\x85\x6c\x49\xc8\xb7\x79\x0b\x7e\x6e\xfc\xda"
- "\xf0\x13\xdf\x29\x7f\x14\x67\x6d\x9b\xa3\xdf\xd1\xde\x34\x77\xed"
- "\x18\xa0\x3c\xbc\xc4\x20\xf8\x3f\xe5\x05\x99\xef\xa2\x36\xe8\x79"
- "\xe9\x94\xb9\x6a\x3e\x71\x26\x3a\xbe\x84\xd9\xc6\xc8\x17\xc3\x4b"
- "\x27\x3b\xd4\x7c\xc2\x2e\x4d\xeb\x0f\xf9\xdd\x47\x7e\x2d\x9f\x81"
- "\x97\x5e\x65\x54\xf3\x09\x5c\x53\x5c\xfa\xb1\xea\x9d\xc0\x5d\x5d"
- "\xbb\xd4\x7c\x09\xd1\xe5\x45\xe5\x99\xa8\x94\xea\xbb\x29\x8f\x52"
- "\x62\x10\xfa\x7f\x8c\xe5\x72\xe4\x1f\xd3\x5f\xe9\xe5\x8d\xd3\x35"
- "\x89\x17\x8f\x93\x7d\xc9\xb2\xec\xef\x2d\x5b\x51\x40\x51\xa0\xf2"
- "\x57\xae\xca\xa7\xeb\x8a\xc5\x4f\x8a\xcb\xca\xcc\xa5\x4b\xe4\x4d"
- "\xfe\xf2\x34\xba\x59\x0e\x7c\xa3\x6b\xd6\x2a\x3b\x5d\x96\xac\xa4"
- "\x47\x47\x4e\xea\xaa\x25\x5a\xe8\xea\x68\x3c\x4c\x19\x2e\xbd\x66"
- "\x37\x70\xa3\x49\xf2\x23\xd7\xb4\x41\xfe\x15\xfb\xc0\x96\x12\x2f"
- "\xdb\x9b\x22\x62\xdc\xb1\x6f\xf8\x2b\xd0\x5d\xf3\x39\xf9\x2b\xb0"
- "\x94\xd8\x97\x58\x82\xcb\xb2\xf9\xc6\xc3\x69\xc3\xa5\xd3\x0c\x5e"
- "\xf6\x9c\x5b\xf2\x42\x5d\x29\xc2\xe7\x67\xe9\x35\x0b\x34\xfb\x42"
- "\xa5\xac\x93\xf6\x89\xbd\xc2\xde\xe8\x05\xf2\x85\xd3\x45\x36\xdd"
- "\xc9\xf5\x2f\x88\x98\x32\x89\x78\xdf\x8b\xe7\x54\x3c\x53\xec\xb5"
- "\x24\xa5\x6c\x9f\x9d\xce\x27\xe2\xd9\x86\xe7\x64\x94\x9f\xa5\xcd"
- "\x8b\x68\xd8\xa8\x41\xd5\xbe\x37\xa6\x7c\x3c\xda\x9f\x14\xe6\xd6"
- "\xb4\x46\x2d\x66\xad\x88\x4f\x5b\x3a\xad\x25\x1c\x9f\x56\xc4\x61"
- "\x4a\x58\x28\xd6\x35\xb1\xb6\x5f\xfb\x9d\x18\xeb\x75\xff\x24\xf9"
- "\xf0\x69\x5e\xcd\x27\x83\xe4\xb3\xa7\xf9\xa2\x62\xfb\xe2\xf9\x5a"
- "\x16\x8e\xed\x2b\xf9\xd0\x2d\x92\x0f\xbd\x76\x0e\x2f\x9d\x66\x0f"
- "\xc7\x61\x2b\xbd\x36\x25\x6a\x6e\x1b\xbc\x78\x4f\xf2\x0d\xd2\xd3"
- "\x23\xeb\xe0\xb4\x83\x54\xe7\x58\x71\x8c\x21\x9f\x3b\x32\xd7\x80"
- "\x17\xc7\x55\xf0\xe5\x2a\x0f\x4c\xe9\xdc\x95\x4e\xfe\x6d\x6c\xf4"
- "\x8e\x78\xbf\x31\x75\x0e\xd7\x8b\x7e\x75\x91\xcf\x5c\x9f\x33\x4b"
- "\xf7\xad\x7a\xa6\x13\xcf\xd2\xe7\x23\x3f\xad\xbb\x56\x9c\x63\xd3"
- "\xfc\xc1\x45\x9f\x89\x1f\xf3\xec\xc1\x67\xda\x9e\xf1\xf2\x95\x96"
- "\xe0\xe2\x6c\xc9\xc7\x25\x7d\x57\xdd\x23\x96\xe7\x4e\x75\x49\xc9"
- "\xfc\x51\x19\xab\xc4\xab\x4b\x6a\xa4\xf3\x48\x16\xdd\xf2\x95\x1c"
- "\xdf\x5a\x1c\x8b\xb3\x45\x1a\xf2\xad\x07\xaf\x25\xdb\x97\x14\xeb"
- "\x49\xea\x67\x7c\x28\x24\xcf\xfa\xeb\x92\x8c\x8f\x5f\x57\x4c\xf5"
- "\x18\x05\x1f\xf1\x19\x33\x53\x4c\x3c\x6a\x5b\x7d\x94\xbf\xba\x6a"
- "\xa4\x89\x78\xf7\x8f\x32\x33\xf9\xe7\x55\xdb\x62\x14\x71\xc6\x4a"
- "\x93\x1a\x34\x9f\x39\xa8\xef\x1b\xbe\x96\x1f\xfd\x81\x98\x21\x37"
- "\x2c\x49\x9d\xff\x20\xee\x52\xd5\x70\xae\xd1\xb8\x93\x34\x68\x3a"
- "\x62\x1d\x7c\x7d\xe5\x3f\x8a\x78\x88\xa5\x49\xe0\xa1\xae\x55\x63"
- "\x28\xff\xe4\x04\xd1\x16\x11\x27\x90\xce\x15\x2a\x7e\xd4\x3b\xfd"
- "\x80\xf0\x8d\xab\x97\xfc\xa2\xf0\x49\x57\x9a\xb4\x8b\x9b\x3a\xdb"
- "\x64\x2c\xd4\xc3\x6d\x18\x3f\xb1\xee\xd3\xdc\x10\xe7\x27\x13\xa8"
- "\xef\xd7\xcd\x01\x4d\x7d\x00\xbf\x7f\x93\xb1\x5d\x7e\x72\x42\x2b"
- "\x97\xfc\x47\x01\xb7\xd2\x70\x4d\x18\x2e\xbd\xce\x1e\xb6\x11\xd2"
- "\xce\x64\xea\xae\x7b\x9e\x7c\x5b\x45\xf8\xf3\xe9\xef\x4a\xbe\xf2"
- "\xba\x3a\x2f\xb3\xd4\xca\xf9\x7d\x1d\xf0\x7f\xe7\x6c\xf5\x1e\xf2"
- "\xef\x9d\x6d\x17\x95\x11\xd2\x74\x1f\x72\xec\xae\xeb\x04\x2e\x3e"
- "\x80\xdf\xbf\x21\x7f\xaf\x16\x0b\x7a\xbd\x5e\x9c\x2d\xea\x8b\xb1"
- "\x32\xcc\xfb\xeb\x82\x5a\xfa\x04\x5d\x3a\x60\x73\xbd\x59\xa3\x27"
- "\x83\xa6\x43\xdd\x78\x4e\x02\xbf\xb9\x49\x7d\xee\xc7\x73\xaa\xf6"
- "\x8c\xfb\x59\x1a\xbd\x21\x1d\xc4\xe0\x33\x19\x9b\x49\xfe\x5b\x62"
- "\x05\x4f\x66\x25\xf9\xea\x7a\xc8\xbf\x4d\x69\x6a\xde\x2c\x2f\x7b"
- "\x4b\xfb\x0e\xfd\xff\xe5\xc1\x08\xfc\x63\x2c\xb2\xfd\xd3\x77\xf0"
- "\x38\x53\x27\xc5\xe0\x46\x9e\x4d\x98\x4b\xd2\x7f\x46\xc1\x40\x43"
- "\xc5\x85\x84\x05\x1e\x48\x23\xee\xa5\x84\x17\xd3\x85\x6d\x4d\xe5"
- "\xda\x84\xf9\xc4\xdf\x91\xcf\x01\x11\xd3\x8c\x7c\x43\x06\xd9\x44"
- "\xe1\x8f\xbf\xd2\xd4\x26\xfc\xd0\xaf\x4e\x31\x6b\x7e\x21\x31\x27"
- "\x1d\x5c\xff\x62\x32\xf9\x8a\x14\x7a\xb3\xe1\x94\x78\xe1\x1f\x52"
- "\xf5\x0b\xb9\xad\x80\x25\xd6\x29\xd2\x2f\xa4\xf0\x47\x70\x09\xdf"
- "\x90\xdc\xf5\x49\x82\xe6\x1b\x12\x7d\xa6\x73\x86\x29\x7c\x28\x18"
- "\xc0\x35\x39\xca\xaf\x8d\x61\x4c\x3f\x91\x7a\xd0\x48\xbd\xf4\x13"
- "\x79\x79\x6b\xcb\x74\xbb\xc4\x89\xe9\xcd\x5a\x5c\xea\xa8\x34\xc8"
- "\xb5\xd7\xaa\x34\xe8\xba\x1a\x35\x0d\xfc\xcf\xaf\xea\xc2\x7c\x18"
- "\x68\x1b\xe9\x0f\xf1\x3e\x91\x3b\x73\x36\x47\xcf\x21\xc6\x68\x89"
- "\x9e\x80\xb9\x35\x11\xbf\x49\xf4\x9b\x13\xa6\x13\x43\xbc\x93\x64"
- "\x01\x8b\x0e\xeb\x8a\x23\x86\xcf\x0b\x06\x63\x32\x83\xba\x83\xc4"
- "\x63\xd2\xd9\xea\x79\xa1\x20\x9d\xf1\x37\xcc\x0b\x0d\x52\xbc\xc8"
- "\x83\x74\x66\xac\x7a\x29\x9d\x61\x9c\xce\x29\x96\xcc\xbc\xd0\xd7"
- "\x7c\xbb\x3c\x9b\xd9\x41\x32\x40\x68\x88\xef\x0f\x15\xf0\x36\x8c"
- "\x81\x99\xe4\x0b\xf2\xb3\x15\xaf\x0b\xb0\x78\x7b\xcc\x07\x8f\x9c"
- "\xfb\x80\x93\x8f\x2d\x8a\x23\xa6\x94\x06\x40\x13\x6d\xba\xcc\x60"
- "\x4c\xb1\x27\xd8\x2b\x7c\xf9\xcf\x0b\x4d\xe2\xf3\x1c\xf7\x70\x11"
- "\xff\xab\x80\xb7\x82\x9e\xc6\x88\x98\xd0\x6b\xf8\x20\xee\x8d\xf3"
- "\xd6\x0c\x72\x8a\x57\x89\xb2\x29\x1e\xc4\x85\x79\x0e\xc5\x99\xe9"
- "\xd0\xe1\xbb\xa3\xf8\xee\x28\xda\x93\x86\x32\x13\xf0\x7c\x2f\xdf"
- "\xbe\x94\xce\x3a\x15\x0b\x19\x07\x7d\x74\xab\xe7\x47\x5b\xd0\xbe"
- "\x5d\xe4\x0b\x3c\x33\xe8\x2e\xde\xae\x9e\x07\x15\xb1\x52\x1d\x23"
- "\x5c\xad\x67\xd6\xbc\x35\xec\xde\xcc\x35\xd3\xc5\xb9\x52\x3a\x33"
- "\x35\x2f\x68\x43\x9d\xc5\x04\x0f\xb3\x88\x4f\x4d\xe7\xa6\x4a\x67"
- "\x64\x5c\x2a\xce\xe5\x98\x72\x75\xe9\x50\x16\xaf\x7c\x75\x01\x2f"
- "\x3d\x7f\x17\xae\x07\x79\xd9\x61\x3a\x7f\x0f\xfe\x24\x68\xe0\x95"
- "\x3b\x90\xae\x1c\xc4\x15\x72\x91\x6e\x07\xaf\x7c\x6d\x01\x2f\x37"
- "\xe4\xe3\x7a\x90\x97\x1e\xbe\x1b\xf9\xe7\xf3\x52\x2f\x7d\xd7\xc1"
- "\x4b\x8f\xa4\x22\x1f\x9e\x7b\x92\x71\xc5\xf3\xd1\x24\xe4\xc3\x73"
- "\x6f\x62\x9f\x6e\x26\xdd\x77\xf0\xf2\x49\xb3\x45\x5d\xe5\xa6\xd9"
- "\xa2\xae\xf2\xb8\xd9\xa2\x8e\xf2\x84\xd9\xb2\x8e\x2b\x67\xcb\x3a"
- "\xa6\xce\x96\x75\x1c\x33\x23\x5f\x06\x2f\xed\x2b\xc4\xb5\x93\x97"
- "\x1e\x1f\x40\x3e\x3c\x9f\x58\x88\x2b\x9e\x4f\xee\x47\x3e\x3c\x0f"
- "\xa0\x2d\xaf\xe1\xf9\x54\x13\xf2\x2d\xe4\xa5\x5f\xdb\x70\xed\xe6"
- "\xa5\xbe\x4d\xc8\x87\xe7\xb3\x46\x5c\xf1\x3c\x88\x72\x5e\xc3\xb3"
- "\xdf\x87\x6b\x37\x2f\xbf\x86\xda\xb1\x88\x97\x4f\x43\xb9\xaf\x7a"
- "\x79\x79\x12\xe5\xc7\xf3\xf5\x28\x6f\x07\x9e\xa7\xf7\x22\x1f\x9e"
- "\x67\x54\xe0\x8a\xe7\x6f\x51\x5f\xb3\x78\x79\xb2\x17\xd7\x5e\x5e"
- "\x7e\x23\xd2\x77\xe0\x39\x65\x16\xae\x78\xbe\x89\xf2\xe3\xf9\xdb"
- "\x35\xb8\xe2\xf9\x16\x82\x51\x0e\x2f\xbf\xad\x0e\xd7\x7e\x5e\x7e"
- "\x7b\x10\xf9\xf0\x7c\x17\xb5\x1f\xcf\xff\xb0\x1b\xf9\xf0\xfc\x5d"
- "\x82\x0f\x9e\xff\x1f\xea\xe7\x72\x5e\x7e\x0f\x95\x3f\xc0\xcb\xd3"
- "\x09\x2e\x78\xbe\xbf\x11\x57\x3c\x3f\x08\x78\xbc\x86\xe7\x7f\xb6"
- "\xe3\x3a\x30\xe6\x78\x96\xff\xcb\x1c\x5e\x32\x91\xf1\xf2\x1f\xe4"
- "\xf0\x92\x49\xb8\x3e\x66\xe5\x25\x13\x52\x78\x79\x86\x03\xe9\xb8"
- "\x3e\xe6\xc3\x73\xaa\xfa\x8c\xeb\x0f\xdb\xf0\x9c\xa6\x3e\xe3\xfa"
- "\x6f\x0d\x78\xbe\x4b\x7d\xc6\xf5\xc7\x29\x78\x9e\xc5\xcb\x7f\xc2"
- "\xf0\x8c\xeb\x8f\x37\xe1\xf9\x6e\xf5\x19\xd7\x85\xad\xb8\x06\x7d"
- "\xd7\xad\xb0\xfa\xe2\x72\x3b\x7c\x71\x6f\xa4\x93\xdd\x51\xa8\xea"
- "\xd5\xf9\x4a\xfc\xab\xe4\xbf\x77\xa2\xf3\x1c\x9b\xd4\xa7\x4b\xfe"
- "\x94\xd6\x37\x4f\xa1\x57\xc4\x93\x53\xfd\xca\x4d\xec\xd1\x7d\xeb"
- "\x18\xd6\xf3\x59\x14\x83\x1b\x7d\xae\xe0\xae\x09\x67\xd1\x57\x33"
- "\x77\x4d\xee\xc1\x15\xcf\x53\x3e\x43\x5f\xf1\xfc\x0f\xe5\xb8\xe2"
- "\xf9\x27\xf7\xf3\xca\xd7\xcd\xc3\xa5\xc9\xb3\xbd\xba\x19\xd2\xcf"
- "\xd2\xeb\x2b\xd3\x2c\x41\x27\xe8\x04\x68\xe8\xe6\xb7\x40\x07\x17"
- "\x31\x5e\xf9\x86\xd7\x42\x71\x1f\xb6\xad\xc8\xe0\xf1\x79\xa2\x4d"
- "\x14\xdb\x85\x8f\x24\xeb\x65\xdd\x93\x79\x8f\x2e\xf9\x69\xd2\x5b"
- "\xf2\xf8\xe7\xc6\x7b\xff\xbc\x78\x3f\xed\xad\x04\xf9\x3e\x81\x45"
- "\xde\xff\x1b\xbd\x7f\xc7\x42\xba\xe6\xeb\x1f\x4f\xf0\xea\x92\x3b"
- "\x29\x8f\x57\xf7\x2d\x3f\x77\xc5\x30\x8f\xbf\x5f\xed\xe3\x24\xca"
- "\xd7\x45\xdf\x8d\xa7\x3f\x51\x2a\x9a\x66\x55\xba\x78\x07\xc9\x8a"
- "\xa0\xf9\x7a\x5b\x51\x72\x4b\x8f\xee\xc6\xc6\x6d\x42\x07\xb0\xb3"
- "\x93\xce\xf0\xf4\xe8\x6e\x78\x6a\xa4\xdc\x9b\x60\x5b\x6b\x41\x79"
- "\x37\xbe\xe9\x0c\x70\xbf\xbb\xe8\x7e\xac\x4d\x22\x7d\xae\xb0\x0b"
- "\x97\xf7\xb3\xa4\x2d\x8f\xb8\x4f\x96\xfa\xcc\x1b\x1b\xe9\xdb\x68"
- "\xde\x3c\x54\x3a\xaf\x56\x89\xdf\xe9\x95\x7b\x51\x37\x3c\xfd\x9e"
- "\xe2\xd5\x5b\xf2\xd9\x04\xdb\xda\x0f\x50\xfe\x0d\x2d\xa3\xe5\x38"
- "\x2d\xaf\x78\xb7\xed\x7d\xe4\xdd\x2a\x74\x2e\x37\xb4\x69\xfa\x5a"
- "\x8e\x3e\x3c\x27\x79\x98\x74\x5a\x87\x24\x2f\x76\xe3\x1c\xf2\x5d"
- "\x19\x34\xbf\xe1\x0e\x56\xe4\xba\x43\x15\x3b\x3b\x79\xd5\x4e\x6f"
- "\x7c\x50\xc7\x84\x4d\xbd\xee\xc6\x75\xb7\x05\x48\x17\xf6\x31\xe5"
- "\xfd\x8e\x32\x31\x63\xff\xad\x0e\xa6\x77\xe7\x7e\x49\xcf\xab\x78"
- "\xe9\xe3\xb3\x3d\x03\x9d\x8c\xfc\xef\xe2\x39\x9f\x97\x2e\x6b\x53"
- "\x26\x2e\xe9\xa8\x27\x1e\xd2\x41\x3a\x9c\xcf\x08\x2e\xe7\x01\x67"
- "\xf0\xe6\x37\x2e\xd0\xda\x42\xfe\xf7\x2b\x01\x3b\xe2\xef\xe8\x0c"
- "\x74\x66\x28\x44\xfe\x9a\xca\xbc\x80\x83\xd4\x03\xde\x38\x8b\xe8"
- "\xac\x5a\x6f\xa5\x62\x3a\x1c\x6c\x5f\x48\xfb\x9d\x09\xe4\xff\xc6"
- "\x2f\xce\x4c\x06\x29\x66\x1e\xad\x6d\x32\xef\x28\x9f\xc3\x4b\xec"
- "\x99\x6b\xed\x2b\x73\xf3\x33\x57\xd9\xbf\x67\x83\x80\x65\x5b\xb9"
- "\xd4\xf6\x54\xf6\x53\x2b\x73\xd7\x5c\xcc\x07\x1a\xd1\xae\x01\xe0"
- "\x46\x80\xda\xb5\x0f\xbc\xa5\xd4\x0d\xa7\xec\xa6\xb1\xde\xfc\xb2"
- "\x8c\xd1\x30\x5c\xfa\x7f\x12\xbc\xac\x42\xf8\xdf\x52\x6a\x77\x06"
- "\x78\xdd\x8a\x8c\x8d\x74\xf6\x7b\x15\xf1\xf2\x3e\xe6\x61\x67\xd1"
- "\x36\x19\xaf\xaf\x9d\xfc\x13\x14\x14\x72\x77\xc1\x59\xc2\xf1\x4e"
- "\xcc\x85\x7e\xe0\x78\xc3\xf9\xca\xbc\x59\x3d\xba\x14\x5c\x5f\xef"
- "\xd4\x62\xea\x84\x2a\xde\x98\xa5\x98\x9b\xe6\x53\x4c\x9d\x11\x6e"
- "\x65\x07\x00\xcb\x0b\x65\x87\xfb\x41\xe3\x7b\xb7\xb9\xb0\xee\x40"
- "\x06\x10\x7e\x11\x5e\x5f\x99\x10\xe2\x29\x86\x90\x8b\x19\x71\x8d"
- "\xe7\xf1\x3b\x8b\x47\xcc\x6f\x74\xd0\x7b\x8a\xa5\x13\x1a\x49\x61"
- "\x45\x07\xb9\xf2\xe3\x1c\xe0\x8d\x8b\x71\x11\xbf\x34\xe7\x14\x43"
- "\xba\x49\xa9\x7a\x63\x51\xdf\x1c\xa6\xa7\xbc\xe0\x69\xd8\x42\xdc"
- "\x17\x2e\x66\x71\xc8\x67\x29\xdc\x87\xf4\xe1\x14\x53\xd0\x99\x62"
- "\xbc\xe0\x4c\x31\x8d\xf0\x14\xb3\xa7\x37\xc0\x46\x6e\x58\x69\xbb"
- "\xc5\xc7\x0c\x9b\xc1\xfb\x6c\x53\x30\xbf\xea\x56\xa4\x87\x9e\x49"
- "\x99\x18\x7c\x26\xc5\x30\x32\x92\x62\x0c\xae\x4e\x31\x5c\x58\x9d"
- "\x32\x71\x64\x38\xc5\xe8\xc9\xf2\xb1\x8f\x7d\xbf\x64\xed\xbd\xfd"
- "\x42\x7f\x38\x12\xb7\xb3\x62\x24\xee\x8d\xe5\xe6\x5e\x96\x78\xab"
- "\x1d\x3c\x10\xf8\xbf\x2d\xe0\x75\x81\x13\xe6\xe0\x6b\x2b\x13\x78"
- "\xe5\xce\x34\xc0\xf7\xd9\x07\x6f\xe2\x5f\x87\x4a\x6f\x5d\x60\xfb"
- "\x17\xd0\xa2\x12\x43\x12\xd2\x80\x3f\xdf\x6b\xe5\xa5\xff\x68\x86"
- "\xdc\x6d\xc3\x2f\xd9\x2b\xc7\x01\x7c\xd7\x2d\x46\x3c\x27\x51\x5e"
- "\x99\xef\xce\x0c\xaf\xb8\xde\xd6\x28\xe2\x8c\x96\xde\xb8\x6b\x9b"
- "\x90\xc7\x52\xc2\xfe\x1f\x5a\x0d\x63\x9f\x2f\x47\x9e\xee\xb0\x5c"
- "\xab\x80\x9e\x54\xbe\x3a\x66\x9c\x76\x5e\xfe\x45\x2f\xed\x3d\x2a"
- "\x80\x5b\x9f\xee\xa6\x87\xc9\x27\x14\x77\xce\x51\x65\xc9\x9b\xc4"
- "\xde\x29\x9d\xc9\x26\x7d\x83\x9a\x26\xf4\x46\x8a\x3e\x9d\xfc\xe7"
- "\xb7\x90\x1f\x2e\xd2\x2f\x00\xaf\x21\x83\xdf\x44\x71\xcb\x26\x40"
- "\x0e\x6b\xc6\xaf\x05\x3f\xf7\x8b\xa4\x77\x70\xb1\x07\x35\x9d\xcc"
- "\xd8\x6d\xbd\xa9\xcc\xcb\x2a\x6b\x23\x72\xe9\x4d\xb5\xe8\xb7\xef"
- "\xf2\xed\xf6\x6e\xaa\xbd\x84\x7e\xd8\x40\xfe\x64\x79\xd5\xab\xf6"
- "\x1a\x25\xec\x7f\x16\x74\xff\xa6\x53\xa0\x13\xc5\xe2\x5d\xc5\x1b"
- "\xde\xa2\x33\x2c\x86\xde\x35\x93\x9d\x02\x9e\x6d\xb9\x3a\xee\xf1"
- "\x07\x18\xbe\x31\xf0\xa4\x15\x19\xcd\x43\x3e\x3d\xcd\x8b\x76\xa4"
- "\xf5\xe8\x6e\x9e\x50\x33\xa4\x96\x5b\xfb\x16\x73\x3e\xcd\x44\x3c"
- "\x10\x8a\x29\x44\xf3\xa5\xa6\x08\x32\x1f\xc5\x3f\xca\x8d\x01\xbd"
- "\xba\xf9\x3e\xdc\x1b\x29\x1f\x37\xbf\xe1\x55\x50\x06\xe6\xcd\x1c"
- "\x1e\xf7\x46\x9b\x52\xf9\xc6\x7c\xcc\x9d\x04\x7e\xdd\x8a\x16\x65"
- "\xf3\x4e\xc8\x1a\x37\x53\xff\x85\x8c\x43\xfe\x7e\x48\xa7\x11\x82"
- "\x6c\xdd\xde\x18\x64\xfc\xfe\x20\xdb\x9b\x7f\x8e\xf9\x62\x0f\x0f"
- "\xf8\xe2\x9a\x66\xf9\xe2\x76\xa6\x85\xe2\x9a\x1c\xf8\x15\xda\x73"
- "\x69\x9f\xf7\xdb\x0b\xc3\x7e\x2b\xcf\x5c\xda\x6f\x25\xca\x4c\xd6"
- "\x7c\x57\x86\x56\x5f\xbe\xdf\xca\x90\x7e\x8f\x61\x5b\xc1\x5f\xf7"
- "\x5b\x09\x1e\xb3\x03\xfc\xa5\x5b\xf3\x31\x12\x12\x76\xe3\xcc\x1c"
- "\x8a\x7b\xa3\x45\xf8\x29\x71\xb8\x85\xaf\x11\xe2\x35\x69\xad\x19"
- "\x2e\xfd\x76\xad\xc6\x3f\x12\xfd\x0c\x6d\x3c\x1c\xc0\x8f\xd2\x9b"
- "\xbd\xba\xef\xf7\x6a\xb4\x95\xc7\xe7\xfa\x42\xa6\xa5\x0b\x86\xe9"
- "\x2c\xc0\x48\xce\xbd\x94\x17\x70\x24\x7f\x5a\x31\xa1\x91\x9c\xbb"
- "\xf1\xbb\x07\xbf\xef\x87\x2a\x5f\xf7\x86\x2a\x77\x26\x84\x2a\x73"
- "\xfd\xf8\x05\xf0\x0b\x86\x2a\xf3\x18\x7e\x90\x63\xf2\xc0\x93\xe5"
- "\x99\x71\xc5\xfb\xbc\x44\xfc\xac\xf8\x25\xe1\x67\xc3\x2f\x39\xb4"
- "\x79\xa7\x2f\xa4\x33\x24\xe1\x97\x8c\x1f\xd2\x9a\xe6\x84\x2a\xdf"
- "\x70\x8b\xf3\x99\xa5\xa9\xe9\x1a\x9e\x8e\xed\x1f\x35\x56\xc4\x82"
- "\x9a\x37\xe1\x30\xb7\x50\xec\xdd\xc2\x73\xe4\xb3\x2e\xb0\x37\xc5"
- "\x7f\x79\x71\x2e\x74\xa9\xf6\xf1\xf0\x9a\xca\x07\x8d\x19\xb9\xcc"
- "\xf2\xdc\xe3\xea\x46\xac\x3b\x03\xc1\xa4\x15\xe4\xf3\xa1\x18\x74"
- "\x4d\xd7\xbe\xa8\x97\xcd\xf3\x31\xe7\xfe\xde\x0b\xcc\x99\xc5\x43"
- "\x82\x06\x14\x92\x3d\xf6\x8b\xc9\x84\xe3\x21\x9e\x61\x1b\xa9\x78"
- "\xbd\x3f\x64\x6e\x4a\xe0\xe6\xa6\x39\xc2\x0f\x1e\x68\x09\xc5\x13"
- "\x0b\xcb\x9f\x84\x73\x90\x41\x0f\x0c\x9c\x63\xcf\x64\x71\xe5\x40"
- "\x0e\x78\xaf\x4e\x20\x9e\x8e\xbd\x22\x70\x4f\x95\x41\xff\xdf\x6e"
- "\x5e\x0c\x5c\x8a\x0d\x01\x6e\x0a\xc9\x9e\xc0\xbb\xed\x05\x2c\x4d"
- "\xc3\x3d\xac\xe9\x09\x5a\x0c\x26\x3e\x31\x75\x01\xde\x19\x28\x46"
- "\x53\x1d\x64\xd0\xba\x02\x96\x5c\x87\x77\x22\x9e\x26\xda\xfd\x88"
- "\xdd\xc2\x95\x27\x53\x58\xfd\xcf\x98\x31\xee\x94\x8c\xd1\x1a\x02"
- "\xec\x23\x71\x0a\xf2\x66\x3d\x7c\xca\xc6\xf6\xa6\x7c\x85\xb5\xb9"
- "\x19\xe3\x92\x37\x6b\x04\xeb\x17\x60\x19\xba\x3c\x58\xde\x6a\xfe"
- "\xff\x0a\x96\x23\x49\x2b\xd2\x25\x3c\x17\x31\x82\xd9\xc5\xf0\x24"
- "\x18\xaf\xed\x05\x3c\x01\x57\xcf\xc1\x10\x64\x49\xb6\x58\x83\xe7"
- "\x56\xc0\x13\x30\xb5\x12\x4c\x01\x0f\x01\x53\xae\xc2\xb4\x3e\x0a"
- "\xa6\xa0\x5d\xc2\x67\x20\xc1\x54\x01\x4c\xeb\xc7\x81\x69\x58\x96"
- "\x07\x4c\xb7\xff\x4d\x30\x6d\xfc\x1f\xc0\xf4\xb6\x45\xe3\xc1\x34"
- "\x48\x7c\x43\x55\x5e\x1a\x07\x5d\xf4\x04\x3f\x16\xfe\x2f\xc1\xf3"
- "\x15\x82\x77\x75\x28\xe6\x37\x66\x51\xcc\x6d\xda\x83\xa7\x98\x60"
- "\xc2\x5f\x53\x23\x3f\x1f\xaa\xfa\xbf\xec\x7d\x0d\x40\x54\x55\xda"
- "\xff\x99\xeb\xa8\xa3\x0e\x30\xba\xd4\x92\xa1\x4d\x2e\xed\x8e\xad"
- "\x15\x95\xb5\xd6\x5a\x61\x59\x51\xa9\x60\x6b\xbb\xb8\x99\xa9\xa1"
- "\xa1\xe9\x48\x40\x4a\x8a\x80\x64\xbe\x4a\x0c\x52\x99\xeb\x07\x1f"
- "\xb6\x0e\x4a\x05\x45\x65\xbb\x54\x5a\x63\xe1\xff\xa5\x04\x86\x7a"
- "\x75\x5f\x6a\x6d\x9d\x8c\x8c\x0c\x6d\xd2\x49\x46\x98\x99\xf3\x7f"
- "\x9e\x73\xee\x65\xee\x0c\x0c\xcc\x0c\xf8\x91\xaf\xee\x4e\xcc\x9c"
- "\x7b\xee\xb9\xe7\x3c\xbf\xdf\xf3\x71\x3e\xee\x39\x15\x05\x98\x06"
- "\x76\x2d\xe9\x3a\x5c\xf7\x93\x6c\x01\xdf\x45\xab\xea\x4f\xe1\x98"
- "\xd7\x0d\x9b\xda\x30\xa6\xce\xaf\x30\xbb\x68\x12\x41\x9b\x32\x73"
- "\x34\x51\xb6\x81\xdd\x48\x5e\x42\xae\x28\x00\x5b\xd8\x66\x28\xcf"
- "\x38\xaa\x88\x1e\x7b\x77\xb2\x8b\xc2\x27\x0b\xf7\x71\x74\x81\xcd"
- "\xa5\x1b\x39\xbe\x88\x19\xce\xe5\xd5\xcd\xfc\x08\xca\xbb\xfe\xaa"
- "\x7d\xb3\x1c\x24\x2b\xa9\x33\xbe\xae\xac\x04\xad\x33\xaf\x67\x3d"
- "\xc1\x73\x09\x33\x9a\x11\xd7\x4a\x62\x6e\x72\xeb\x89\x4b\xb4\xd1"
- "\x88\x05\xea\x05\xea\xc8\x3a\x99\x6d\x06\xbb\xaf\x29\x12\xcf\xe9"
- "\x70\xe6\x80\x6d\xc6\x7d\xdd\x01\x4b\x3c\xbf\xa3\x4b\xfd\x58\x0e"
- "\xfa\xb1\x8c\x9d\xa1\x14\x01\xf2\xa8\x6c\x6b\xe5\x18\x22\x66\x66"
- "\x47\x0d\xc3\xaf\x40\xf4\x05\x5c\xee\xe5\x0f\x50\x9a\x00\xf1\x5c"
- "\x58\x8d\x2b\xbf\x22\x9b\xb6\x26\x0d\xc6\x73\xb4\xa0\xcf\x1f\x1d"
- "\x96\x08\xf1\xd3\x8f\xe0\x2b\xf4\xc0\xaf\xe3\x24\xaa\x44\x0f\x31"
- "\x51\x2b\x9e\x85\x06\xf5\x79\x9a\x9f\x21\xeb\x5a\x3d\xa6\x0a\xae"
- "\xb1\x7d\x29\x5d\xd2\xbe\x94\x27\x75\x38\x0e\xe1\x1e\x1b\x5a\xac"
- "\x13\xdc\xcf\xfc\xb6\xc0\xa9\x0e\xab\x61\xef\x91\x2a\xae\x3f\xc6"
- "\xe7\x8a\x6b\x92\x51\xae\x2d\x8a\x1b\xb4\x7c\xbc\xb6\x2e\x2d\x39"
- "\x13\xd7\xf7\x5c\x7f\x80\xe6\x1e\x48\x4a\xc6\xf3\xb0\xa5\x6b\x59"
- "\x50\xd7\x9c\x8f\x1c\xd7\x66\x93\x6c\xa7\x21\xac\x19\xcf\x49\xc7"
- "\x3d\xbe\x02\xe3\xe2\xf5\x6c\x9f\x5a\xe7\x9a\x6f\xd7\x83\x9c\x62"
- "\x5c\xb9\xdf\x16\x82\x4d\x89\xa6\x4f\x40\x5b\x17\x40\x5b\x8f\x82"
- "\x5c\x8f\x42\x5b\x97\x8a\x6d\x15\xcf\x87\x73\x81\xfc\xe1\x5a\xd7"
- "\xbe\x51\x6a\xeb\x13\x20\xef\x35\x7b\x63\x56\x1c\x23\xbf\xa2\x10"
- "\x8f\xd7\xb5\xb0\x77\x78\x5a\xcd\x8e\xaf\x08\x3e\x97\xf9\xee\xbc"
- "\x54\xd5\x43\xc0\x47\x94\x39\xc4\x0b\xc9\x34\x74\xc7\x2c\x09\x07"
- "\xac\x0f\x6d\x4f\x1a\x5c\xac\x87\xfa\xa0\xec\x8f\x93\x31\xa8\xcf"
- "\x20\xfb\xa8\x62\x94\xbf\xe7\x19\xcd\xe1\x0c\x83\x01\x80\x81\x5e"
- "\xc4\xc0\x20\x62\x00\xf1\x32\xf8\x61\x15\xf4\x1b\x23\x8a\x73\x38"
- "\x06\x81\xc9\xe8\x46\x9f\xeb\x6b\x82\xd4\xd7\xf5\xbe\xf5\xf5\xe6"
- "\xc9\x6d\xbc\x8f\xac\xc0\xfd\x31\xa1\x8f\xf0\x3f\xae\x76\xd0\xdb"
- "\x7c\x51\x6f\x69\xd2\xed\x92\xce\x1e\x51\xdc\xf8\xbd\x7f\x3a\x3b"
- "\xf6\x8b\xff\xa3\x3a\x1b\x7e\x66\x75\xf6\xa6\x97\x3d\x75\xf6\xa6"
- "\xfd\x9e\x3a\x7b\xd3\x5a\xb7\xce\x8a\xd7\xfa\x44\x67\x6f\xda\x7a"
- "\x6e\x74\xf6\xa6\xad\x5d\xe8\x6c\x9a\x1f\x3a\x1b\xe1\x43\x67\x23"
- "\xce\x9c\xce\xde\x5c\x7d\xf6\x7c\xec\xad\xfd\xdb\x84\x2e\x7c\xec"
- "\x72\x99\x8f\x0d\x41\x1f\xfb\x87\x8d\x5d\xe9\x6b\x7b\x21\xe8\xab"
- "\x5a\xd4\xd7\xbf\xbe\x07\xe5\x8d\x7b\xfe\xd3\x83\x3d\xeb\xab\xa3"
- "\xd0\x1d\x3f\xf9\xd4\xd9\x24\xd4\xd9\x32\x62\xb6\x30\x9d\x9d\x2d"
- "\xe9\x6c\xa1\xd8\x17\xea\x46\x6f\xc3\x7d\xe9\x2d\x9e\x99\x85\xe7"
- "\x65\x75\xab\xb7\x62\xbc\xd4\x3e\x02\xf5\xd6\x74\x9e\xf9\xda\x5b"
- "\xa6\x7b\xea\xed\x2d\x79\x9e\x7a\x7b\xcb\x04\xb7\xde\x8a\xd7\xfa"
- "\x44\x6f\x6f\x49\x38\x37\x7a\x7b\x4b\xc2\x2f\xc7\xd7\xde\x9a\x71"
- "\xf6\x7c\xed\x6d\x7b\x98\xde\xfa\xf2\xb5\x59\xa2\xaf\x0d\x41\x5f"
- "\xfb\xc7\x87\xfc\xd3\xdd\xf1\x93\xff\x8f\xeb\xee\x19\xf6\xb9\xb7"
- "\x5d\xe2\xa9\xbb\xb7\xc5\x7a\xea\xee\x78\xa7\x5b\x77\xc5\x6b\x7d"
- "\xa2\xbb\xb7\x85\x9f\x1b\xdd\xbd\x2d\xfc\x97\xe3\x73\x6f\x1f\xe7"
- "\x4b\x77\xb5\x23\x49\xf6\x61\xc5\xed\xcf\x9b\x0b\xd9\x7a\xbd\x6c"
- "\xb3\xe3\x56\xc2\xd7\x95\xdc\xfe\xae\x39\x62\x1c\x71\xe5\x5a\x66"
- "\xe1\xf9\x0f\xb8\xbe\xe5\x45\xd9\xfa\x11\xbe\xde\xe1\x76\xf7\x39"
- "\xa7\xe2\x19\x11\xdd\xad\x7f\xa1\x6b\x0e\x89\xeb\x24\xee\xe0\x6b"
- "\xc0\xd6\x1c\xb2\x4b\xbf\xd9\xfe\x54\x8a\x3b\x22\xe8\xda\x43\x56"
- "\xeb\xa0\x43\x5d\x9e\xa3\x80\xf3\x09\xa1\x2b\x29\xc5\xb3\x95\x4e"
- "\x8e\xd4\x9b\x4e\xe6\x12\x52\xc0\xe6\x61\xee\x88\x87\x36\xb2\xb9"
- "\xb0\x93\xa1\xa3\x2a\x4f\xe6\xc4\x13\x48\x4b\x94\xd2\xd8\x39\xd5"
- "\x39\xfd\xa8\x0b\xae\x81\x0d\x29\x2c\xc9\x24\x2a\xdc\xf3\xf3\xda"
- "\x53\xc8\xc5\x3b\xd2\xc0\x46\x84\xe3\xf9\x4c\x78\x26\x06\xfd\xf5"
- "\xe5\xb6\xe2\x13\x44\x59\xbf\x8a\x8d\x3d\xe3\xba\x99\xad\xf9\xc8"
- "\xff\x7e\x57\x6f\xa4\x82\x92\xb8\x8a\xf4\x65\x34\xa4\x3c\x9b\xad"
- "\xd3\x05\xae\x48\x6b\x69\xf0\x6c\x33\xd7\x08\x7d\xac\xb4\xe7\x24"
- "\x85\xfa\x7d\x90\x69\x15\xf0\x3c\xf1\xe2\x14\xa2\x81\x8f\x9a\x1a"
- "\xca\xb3\xa1\x5e\x0e\x69\x2c\xd1\xe7\x9a\x6b\x3c\x6b\xf7\xf2\x08"
- "\xa5\xb8\x6e\x07\xdf\x9d\x65\xe3\xcb\xeb\x04\xd7\x1a\x27\xa4\xd3"
- "\x9c\x2c\x76\x46\x56\x18\xc8\x02\xd7\xc9\xe2\xd9\x45\xae\x62\x3d"
- "\x9e\x17\x40\x5e\x5f\xd6\x2c\xe0\xba\x0d\xe7\xdf\x2e\xb7\x99\x32"
- "\x6f\xc0\xbd\x25\xd8\xbe\xe4\x47\x14\x31\xa7\xe3\xbe\xe7\xe7\xea"
- "\x1e\x51\x4c\xe8\x8f\xf3\x2f\x93\xe1\x37\xce\xe5\xbb\x4e\x46\x28"
- "\x31\x2f\xe4\x79\xd3\xb4\xe4\x4b\x12\x96\xcc\xd6\xb2\xab\x78\xde"
- "\x98\x6c\xcc\x6b\x51\x4c\x60\x6b\x0a\xe1\xf7\x7a\x9c\x33\xc0\xf5"
- "\xee\xb8\x36\x89\x16\xea\xcb\x98\x7d\xc8\x2b\xcf\x86\xf6\x97\xb1"
- "\x35\xa6\xd0\xce\x75\xd0\x66\xc8\xa3\xc6\x75\x38\xec\x6f\x26\xd1"
- "\xac\x87\x34\x2c\x07\xfe\xaa\x4d\x7a\x5c\x57\x12\x93\x8c\x65\xfb"
- "\x5c\xcb\xaf\x2e\xcf\xa6\x39\x4a\xc2\xdf\xc7\x51\x7c\x76\x58\x31"
- "\xc1\x18\xa6\xa0\x14\x9e\x19\xfb\x0c\x8e\x71\xe3\xfa\x69\xb6\x26"
- "\x7c\xc2\x0a\x28\x5f\x59\xc2\xc6\x70\x27\xcc\xb0\x28\x62\x54\xe2"
- "\x3e\x18\xfc\x6c\x15\xc5\x84\x9d\xf8\x1c\xbc\x47\xcc\xcf\xf7\xf9"
- "\x80\x3a\x6b\x33\xfb\x51\xf8\x5d\xc4\xd7\x58\xab\x66\xc1\xfd\x85"
- "\xee\xb5\x65\xec\x3e\xe0\xd2\x84\x4a\xe0\x26\xdb\xbf\x05\x7f\xfb"
- "\x5c\xbf\x2c\xe2\x56\x17\x01\xdc\xf0\xc6\x4e\xe2\x08\xf0\x42\xe2"
- "\x08\xd6\xf7\x8d\x4c\x8b\xc0\xe7\x37\xee\x64\xfb\xef\xe7\x03\x86"
- "\xce\x2d\x11\x4a\xb6\xb7\x77\x3b\xe2\x82\xeb\xe0\xef\xfc\x19\x71"
- "\x59\x07\xbe\x40\xcc\x1b\xe1\xae\x3f\xfe\xbe\x8b\xe1\xe9\x02\x2c"
- "\xf8\x7a\xfc\x3b\x3f\x61\xe7\xc4\x80\xcd\xc0\xb5\xe0\xd5\xe9\x04"
- "\xe7\x81\xcb\x28\x70\xe4\xf5\x14\xbb\x50\xbc\x84\xa7\x7f\x70\xc2"
- "\x2e\xe0\xba\x0f\x1c\x0b\x37\x2c\x20\x6c\x4c\x1d\xcb\xa4\x91\xfa"
- "\xd8\xeb\x24\x1c\x97\x01\x76\x4b\x80\xbb\x20\xf3\x75\x20\xbf\xe2"
- "\x36\x36\x5f\x15\x5b\xec\x22\x6a\x17\xe4\xb3\x28\xee\x52\x42\x79"
- "\x9a\xa2\x4b\xa9\x15\xd7\x5f\x83\x0c\xd3\x5a\x57\xdf\x69\x91\x64"
- "\x88\x75\xc2\xf5\xd3\x06\xb6\x8e\xfe\xce\x19\x9c\x43\x77\x8e\x91"
- "\xda\xec\x4b\x9e\x86\xd7\x49\xa4\xe1\x5a\x32\xce\xa5\x1e\x64\xa7"
- "\xfd\x2e\xdf\x8a\xe3\xcd\x53\x5a\x08\xc1\xbd\xec\xe3\x9e\x3d\x44"
- "\xcd\x56\x27\x71\x85\x0c\xb2\xe3\xdc\x84\xf3\x99\xab\x87\xc5\x3d"
- "\x0d\xf2\x02\x7f\x9f\x65\x27\x1a\x73\xa6\x95\x9f\x67\x46\x7e\x22"
- "\xce\x54\xb0\xe1\x60\xd7\xc1\xa7\x2a\xb3\x7e\x22\x78\xd6\x28\xdc"
- "\xb7\xbd\x19\x64\xf6\xce\x43\x69\x24\x3b\x30\x3b\x7a\x17\xb3\x6d"
- "\x18\x5f\x80\xcd\x17\xd8\xb9\xf6\x56\x88\x4f\x0c\xdb\x03\x3b\x7b"
- "\x59\x71\x97\xcf\xf3\x82\xb0\xdd\x2e\x1c\x87\x16\xdb\x1c\x87\x6d"
- "\xb6\xd9\x09\x8e\xe5\x4f\x79\x12\xf7\x0c\xfd\x99\xb8\x0c\x83\xec"
- "\xd8\x66\x88\x75\x92\x02\x1f\xd3\x9f\x38\xb1\xbb\x67\x53\x90\xb7"
- "\xeb\x99\xcb\xb7\xba\xd4\xe5\x49\xf8\x6c\xac\x03\xbe\x47\x33\xe5"
- "\x67\xc2\xe4\x8e\xf2\x37\xdb\x9d\x84\x86\xc8\xeb\xe0\x08\xb4\x0e"
- "\xbe\xdb\x7f\x2d\x89\xcc\x7b\x9d\xe3\xee\x7c\x46\x94\x41\x12\xce"
- "\x91\x95\x27\xe1\x5e\xf6\x53\xb0\x0e\xd6\x63\x64\xf2\x31\xc2\xf0"
- "\x37\xeb\x5a\x88\xb3\xdf\xd5\xc3\x70\x4d\x05\xe2\x9f\xe9\x00\xfc"
- "\x4f\xd9\x71\x9f\x0f\xab\x39\xfb\x34\xc1\xf8\xc5\x71\x52\x27\x74"
- "\xc6\xff\xee\x77\x1e\x4a\x0f\x14\xff\xbb\xfb\x08\xff\xbb\xcf\x83"
- "\xf6\xdf\x13\x44\xfb\xef\xe9\xa3\xf6\xdf\x73\x1e\xb4\xff\xde\x20"
- "\xda\x7f\x6f\x1f\xb5\xff\x5e\x9f\xed\xbf\xeb\x32\x17\x65\x6b\x6d"
- "\x42\xb7\xc5\xa3\x0f\xe0\xfe\x2a\xb6\x02\xd7\xd2\xb0\xf7\xa6\xc4"
- "\xdf\x84\xbf\x47\xa5\xf2\xfa\xad\xf6\xfa\xad\xf1\xfa\x1d\xee\xf5"
- "\x3b\xc2\xeb\x77\xa4\xf4\x1b\xfc\x48\xff\xe3\x8a\xd8\x11\x10\x97"
- "\x66\x5b\x14\xb1\x55\xe2\xf5\x28\xdc\x07\x07\x7c\x7a\x94\xaf\x33"
- "\xf5\x42\x14\x84\xb6\x0b\x94\xb0\xb3\xee\x14\xf7\x8d\x69\xcb\x21"
- "\x94\xf6\x1b\xae\xc3\xf3\xc8\x5c\x79\xa9\xe1\x53\xc0\x4e\x9b\xad"
- "\x76\x88\xf3\x23\x06\x40\xd9\xbf\xc6\x73\x16\x11\x57\x6d\x0a\xae"
- "\xad\xb9\xef\x32\x6c\xe7\xb5\xc9\x26\xe2\xea\x77\x35\x5b\xdb\xe0"
- "\x32\xa4\x86\x5b\xfb\x5d\x3d\x9c\x6e\xaa\xb0\x1a\x72\x5c\x2a\x73"
- "\xcb\x7e\x92\x2f\xb8\xb4\x19\x19\x80\x6f\xcb\x4e\xb2\xbc\x85\x36"
- "\x67\x38\xa8\xdd\x3c\xc3\x44\xb2\xac\x78\x4e\x49\x0d\xa9\xb7\xee"
- "\x67\x67\x95\xb0\x33\x59\xac\x3b\x09\xc6\x3f\x59\x98\x07\xd2\xea"
- "\xad\xe5\xa4\x0e\x7e\x9b\xf4\xdf\x42\x3b\xef\xfb\xc4\xdc\x52\x0e"
- "\xfd\xa5\x54\x8d\x4b\x9d\x62\xa3\xea\x14\x7b\x5d\x0b\x9e\xc5\x9a"
- "\xe2\xc0\xba\xd6\x43\x3d\xcc\x8e\x2a\xc0\x37\xc5\xc1\xca\xb5\x35"
- "\xb0\x3e\x29\xce\xd9\xba\x42\x20\x7f\x48\x8a\x1d\xeb\x87\x75\xeb"
- "\x7a\x1e\x76\xdb\x2a\xa8\xfb\xad\x0f\xe9\x94\x04\xdf\x75\x08\x8c"
- "\x23\xf7\x75\x73\xfe\xa5\x51\xc9\xcb\x55\x05\x51\xee\xfd\x3e\xed"
- "\x3f\x94\x2b\xd6\x57\x13\x4c\xb9\x85\xbe\xcb\x2d\x15\xeb\xab\x0d"
- "\xa6\x5c\x5b\x37\xe5\x8a\xf5\x8d\x09\xa2\xdc\x07\x7c\xee\x7f\x40"
- "\xf3\xb6\x8b\xf5\xcd\x0e\xa6\x5c\xa3\xef\x72\xb7\xad\x0a\x8e\x0b"
- "\x0f\xd8\xbb\xe3\x42\x70\x3c\x98\xd4\x4d\xfb\x8d\xab\x82\xe3\xc0"
- "\xa4\xad\xdd\x71\x20\x38\xfc\x27\x75\x8b\x7f\x70\xd8\x4f\x8e\xed"
- "\x0e\xfb\xe0\x70\x9f\xec\x93\xff\xd8\x37\x00\xec\x63\x68\x68\x85"
- "\xc5\x95\x9f\x1a\xe3\x0a\xdd\x76\xe7\x33\xae\x18\x72\xd7\x0a\x42"
- "\xc2\x36\x92\xa1\x77\x15\x1d\xa2\x31\xac\xcf\x3d\x65\xec\x8a\x42"
- "\x22\x40\x1f\x5a\xa8\x58\xd6\x28\x98\x1d\xe3\xd0\x6e\x39\x8d\x4b"
- "\xec\x8a\xdf\x40\xfa\x1e\xf0\x83\x36\x88\x65\x79\x59\xa9\x31\xf9"
- "\x99\x31\x84\xbd\x07\x07\xfd\x88\x29\x4f\x1e\xa2\xb8\x87\x60\xdc"
- "\x4f\x60\x5f\x37\xe2\x9e\x84\x64\x28\xdc\xeb\x00\x1e\x43\x39\x76"
- "\xf2\x86\xcb\xaa\x98\x62\x65\x79\xad\x6c\x6d\x7a\xfe\xb6\x3b\xb1"
- "\xaf\x40\xb3\x74\xb8\xbf\x98\x15\x9e\x5d\xda\xcf\x4a\x84\x62\x3c"
- "\x23\x67\xf5\x94\xad\x16\x45\x5c\x81\xf8\x2e\x69\x0b\xdb\x07\x0f"
- "\xea\x8e\xfb\xe0\x3d\x03\xfd\x06\xcc\x7f\x6d\x32\x11\x70\xaf\x62"
- "\xc8\x5b\x8b\x7b\xe3\x75\xf7\x4e\xb6\x33\xaf\x3c\x0a\xef\x07\xd9"
- "\x36\x67\x1e\x23\x42\xbd\xcd\x4a\xa0\x8f\xb1\x35\x1f\xfa\x27\x77"
- "\x8f\xc6\xf1\x94\x13\x24\x73\x05\x75\xe1\xd8\x16\x55\x6f\x6f\xc4"
- "\xb5\x87\x6c\xdf\x76\x45\x5c\x12\xf6\xf5\xc5\xb3\x91\x86\x1f\x55"
- "\xc4\xb1\x3d\x57\xf3\x71\x0d\x8e\x3a\xa5\x86\xe6\x87\xc4\xd4\xdb"
- "\x4e\xb0\x73\x39\x0e\x2b\xe2\xe6\xe3\x1e\x65\x27\xd5\xe5\x5a\x9b"
- "\xba\x5c\xd7\xba\x3a\x2e\x51\x6a\x03\x3e\x5f\x4a\xc7\x3e\x21\xe6"
- "\x83\xeb\x1d\xfb\xbf\xf8\x38\x3f\x78\x58\x5c\x04\xb5\xa2\x7c\x79"
- "\x5d\xe2\xbf\x47\x0c\x20\x0e\x89\xb0\x65\xe9\x46\xf2\x31\x92\x78"
- "\x0d\xf6\xb5\xa1\xde\xfc\xcc\x43\x43\xaa\x92\xbd\x8f\x0f\xfe\xe0"
- "\x21\x9d\x10\x60\x4c\x1c\xc7\xf6\x59\x33\x8d\x44\xff\x1b\xff\x19"
- "\x94\xff\xc7\xc3\x8a\xf8\xb1\xbc\x9f\x97\x1a\xc1\xdf\xb3\x8c\x6b"
- "\x80\x67\x44\x80\x7f\x32\x61\x3e\xb8\x3e\x4d\xbc\xae\x95\x5d\xd7"
- "\xe2\x5a\x54\xf1\x7a\x9a\x78\x3d\x4a\x76\x3d\x2a\x79\x24\x8e\x7b"
- "\xc4\x17\x62\x1b\xa8\x3a\x15\xeb\xcf\xe6\x09\xf9\xb9\x8d\xa9\x44"
- "\xcc\x17\xde\xa2\x88\x7f\xe7\x24\x70\x0c\xae\x47\xca\xee\x8f\xfc"
- "\x38\x3d\x9a\xdc\x55\x84\x32\x8c\xaf\xb1\x08\xaf\x8d\xe1\x7d\xe5"
- "\xb8\xfd\xac\xed\xe0\x43\xe5\xe5\x59\x14\xf1\xeb\xd1\x4f\xda\x20"
- "\x46\x83\x3c\xbb\xf0\x99\x72\x79\x4b\x6f\x7b\x6a\x13\x17\xcd\xd6"
- "\x3e\xb6\xf8\x29\x3d\xbe\xad\xe7\xf9\x1e\x9a\x06\xdf\x67\x75\xe5"
- "\x95\xa9\xcc\x1b\xf1\xfd\x3a\x0d\x7b\x97\x7b\x3d\xe0\xe8\xc8\xaf"
- "\x88\x71\x86\x96\x37\x38\xf3\xb7\x5b\xb3\x7e\x26\x42\x66\x04\xfd"
- "\xda\xb4\xec\x4e\x72\x5c\x31\x75\x36\x3b\x0f\x52\xcb\xf6\xbe\xb7"
- "\x99\x96\x7d\x84\x69\x6c\xdf\x12\xf3\x2c\x9e\xf6\x76\x66\x8d\xf0"
- "\x61\x66\xa3\x50\x3b\xeb\x04\xf9\x38\xc2\x4a\xaa\xb5\x27\x70\xff"
- "\x57\xdb\xdb\xae\x06\x01\xd7\xe6\x42\xfe\x4f\xf0\x59\x38\x7e\x80"
- "\xdf\xf9\x58\xc8\xd4\xc9\xf8\x1c\x5c\xb7\xd8\xa2\x98\x3a\x15\x9f"
- "\x67\x51\x4c\x8d\xef\x57\xc8\xd6\x72\xab\x8f\x2b\x1e\x0c\x71\x19"
- "\xca\xb8\xbe\xaf\x9e\x4a\x1c\x82\xda\x28\xbe\xbf\x47\x0a\x87\xe1"
- "\x1a\xdd\xa9\x76\xd9\xfb\x6c\xea\x93\x02\xb9\xa3\x75\xf5\x83\x6a"
- "\x69\x6f\x0a\x3c\x23\xc8\x97\xfd\x38\x0d\xfd\xe4\xd3\x85\x7a\x9d"
- "\x4b\xbd\x03\xe4\x5b\xa6\xaa\x81\x08\x32\x8c\x9d\x39\xdf\x06\x75"
- "\xf9\x53\x0b\x0d\xd9\x61\xcf\x44\x3d\x05\x59\xbc\x86\x6b\x08\x43"
- "\x2b\x62\xca\x71\xcd\x60\x7e\x79\xc3\xab\x4b\xec\xc2\xa7\xb5\x55"
- "\x44\xfb\x67\x8c\xb1\x1e\x5c\xf1\x40\x22\x75\x5c\xbd\xdf\x44\x6a"
- "\x9b\xde\x22\xfb\x0e\xd6\x10\xf5\x0c\xd2\x2f\xcb\x42\x9d\x6c\x2c"
- "\x21\x8d\x08\x71\x16\xd2\x0f\xf7\x4d\xc2\xbd\xd2\xf1\x5c\xf4\x7a"
- "\x7b\x1d\xc4\x3d\x2f\x46\x55\x64\x36\xf7\xd7\x3e\x48\x20\x5e\xe2"
- "\x73\xd2\xec\xfd\x1f\x2b\x7b\xff\x3a\x04\xc7\xc7\x65\xef\xfd\x64"
- "\xac\x38\x46\x54\x75\x49\x5f\x91\x8c\x59\xd4\x85\x6b\xfc\xe2\x66"
- "\xf5\xa3\xec\xdd\x9f\x74\xc8\x9c\x0c\x98\x2e\xd5\x85\x6e\x5e\x42"
- "\xc2\xeb\xd3\x2c\xc4\xdc\x5c\x43\xb6\xa4\x90\x70\xda\x9a\x34\xa8"
- "\xb6\xf6\x53\x42\xf3\x87\x98\xde\xc8\x34\xf5\x97\xd6\x63\x85\xad"
- "\x54\xa0\x7e\x85\xe6\xe1\xba\xac\x53\x24\xfa\xd1\x6f\xb3\xd9\x18"
- "\x2e\x8e\x97\x3b\x5a\x75\xda\xf6\x56\xdd\xa8\xb6\x56\xdd\x48\x69"
- "\x9c\xfd\x91\xf9\x1a\x52\x84\xef\x0c\xad\x9e\x98\x87\xef\x0c\x61"
- "\x7c\xe9\x08\x09\xab\xc1\x31\x75\xb6\x0f\xcc\x52\x5d\xa4\xeb\x31"
- "\x1d\xb9\xce\xca\xde\x49\xc2\x71\x7e\x4d\xf1\x1c\xa8\x6f\xcb\x09"
- "\x22\x5f\x5b\x74\x7a\xa9\x4e\xc0\x75\x45\x74\xf5\x83\x51\x6d\x45"
- "\x7a\x1d\xae\x2f\x02\xbf\x30\x2e\x70\xdd\xfe\x13\x8b\x9f\xb1\xfd"
- "\x14\x38\x5b\x7e\x02\xf1\x01\x9c\x4e\x58\x05\xc4\xa2\x2e\x11\x71"
- "\x68\xf0\xc0\x81\xe1\x96\x62\x17\x10\x0f\xc4\x02\x31\x71\xe3\x71"
- "\x80\xe1\x51\xee\xe2\x78\xb4\x81\x3f\x90\x30\x39\x1d\xa9\x1f\xd7"
- "\x1d\x2e\x88\x07\x62\x53\xdb\xf4\x15\xf1\xc0\xc4\xca\x31\x01\x79"
- "\x0e\x93\x70\x41\x4c\xcc\x2d\x10\xf3\x02\x2e\xf7\x1f\x20\xe4\x81"
- "\xd1\xd4\x55\x37\xe9\xf3\x0e\x7c\x1c\xbe\xf0\xf9\xde\x8d\x0f\x60"
- "\xdf\x19\x9f\x63\x1a\x9c\xf7\x01\x7c\xee\xd6\x04\x82\x4f\x6d\x13"
- "\xc7\xc7\x21\xe2\x33\x3a\x96\x08\xf6\x56\x9d\xb0\x69\x09\x19\x37"
- "\xe9\x5b\x2d\xd9\x9b\x50\x07\xb6\xeb\x4f\x3b\x5d\x86\xf2\x2e\xdf"
- "\x2b\xee\x59\x8f\xfe\x32\xd6\x7f\x3d\x7a\x68\xef\x45\x3d\x0a\x54"
- "\x8f\x1e\x5a\xd8\x3b\x3d\xfa\x0b\xb9\xa8\x47\x67\x4b\x8f\xfe\xec"
- "\xf0\xd6\xa3\x0e\x5f\x9d\x32\x77\xd1\xec\xf9\xfa\xf9\xfa\xc7\xb5"
- "\x73\x9e\x4e\x9b\x9b\xca\x3d\xb6\x87\xcf\x8e\x70\x66\xc6\x08\x78"
- "\xb6\x79\xed\xc6\x06\xf2\xc6\xf0\x06\xc1\xf9\x5d\x84\x92\xe6\x8d"
- "\xd2\xb8\xf2\x46\x15\xe0\x39\xe7\xa8\x6f\x78\xfe\xf9\x11\xc5\x23"
- "\xc9\xb8\xe7\x1f\xdf\x2f\xe5\x11\xb6\xde\x18\x62\xc3\x2a\x9c\x7f"
- "\x79\xa6\x0d\x3e\xcb\x88\x32\xcc\x4e\x54\xa6\x91\x78\x7d\x46\x1d"
- "\xee\x4f\x46\x8b\xf4\x55\xc5\x78\x2e\x79\x1b\x51\xda\xd4\x29\xa6"
- "\x55\x50\x9e\x35\xa4\x4c\xa5\xd4\xe2\xbb\x24\xd3\x67\x80\x4f\x8e"
- "\x70\xef\x43\x34\xa3\x80\x0e\x48\x28\x47\x5d\xc7\xf7\xfa\x8e\x2b"
- "\xa6\x3f\x7f\x1a\xf7\x69\x87\x18\xf6\xa1\xd1\xf0\xac\x11\xfa\x71"
- "\x6c\x8f\x05\xd0\x7b\x7e\xfd\x61\xb6\x5f\x57\xbb\x7a\xbb\x95\x9d"
- "\x11\xaf\xae\x88\x39\x99\x57\xde\xf0\x69\x46\x25\xd1\x3e\x88\x7a"
- "\x3f\x7d\xf7\xfd\x1b\x41\xef\xe3\x4d\xa4\x2e\xe2\x55\xb2\x2f\x01"
- "\xf8\x96\xd0\x93\xde\xcb\x78\x36\xd2\x3f\xbd\x97\xf8\x85\xbc\x42"
- "\x7e\x21\xb7\x86\x00\xb7\x90\x6f\x12\xbf\x5e\x3c\xc5\xf9\x15\x76"
- "\x90\x68\x36\x9f\x00\x8e\x39\x38\xc7\xf0\x9d\xe6\xba\xf4\xcf\x7d"
- "\xeb\xff\x29\x2f\x7e\x09\x22\xbf\x96\x02\xbf\x96\xba\xf9\xf5\xf0"
- "\x57\x1a\xb2\x85\xf1\x6b\xa2\x9b\x5f\x86\xb0\x1a\x89\x5b\xc8\x33"
- "\xe4\x94\xeb\x71\x1d\x41\x9d\x97\x78\x56\x3c\x8f\xcf\xa1\x32\xfd"
- "\x17\x40\xff\x5b\x65\x7e\x74\x44\x6f\xf4\xff\x61\xa6\xff\x88\x09"
- "\xe2\x83\xb8\x20\x16\x17\x22\x0e\x78\x0e\x34\x6d\xed\x0a\x8b\xbb"
- "\x22\x7a\xc2\x02\x71\x40\x3c\x18\x0e\x80\x87\x34\x9f\x8d\xf3\x9b"
- "\x88\x09\x62\x71\x6d\x06\x11\x10\x97\x62\xd0\x79\xd4\x73\x8b\xe2"
- "\xaf\x0e\xc4\x85\xc5\xae\x39\x21\x0b\xd7\x0f\x73\x9f\x0f\xd3\xba"
- "\x7a\x46\x65\xe7\xb8\x75\x46\xb5\x7b\x4f\xb5\xe9\xac\x5f\x66\x1a"
- "\x8e\xfb\x61\x4f\x17\xfb\x2c\x3b\xaa\xf8\xdc\xd4\xcc\x2b\x45\x9d"
- "\xde\x8a\xfd\x3f\xd6\xd7\x73\x42\x5f\x4f\x0d\x7d\xbd\x3c\xe8\xeb"
- "\xe1\x58\x1c\xdb\x7b\xe0\x91\x11\x7c\x9e\x0c\xfa\x76\x21\xdb\x1b"
- "\xa9\x21\xa5\x06\xe5\xc7\xe6\x64\x43\xca\xb5\x38\x87\x44\x0d\xd0"
- "\x8f\xfc\xbb\x40\xe0\x37\x70\xc8\x19\x20\x77\x1e\x11\xf7\xe2\x3f"
- "\x64\xe5\xfb\xf2\xcd\x54\xf3\xfa\x4d\x67\xeb\x16\xd8\x7c\x9d\xe0"
- "\xda\xea\x7c\xc6\x73\xbe\x4e\x3e\x9f\xfb\x46\xa6\x55\x9c\xab\x7b"
- "\x84\xad\x09\x46\xfb\x80\x76\xad\x22\xb3\x41\x70\xcf\xd7\x7d\x8e"
- "\xd7\xbd\xe6\xeb\x1e\x61\xe3\xbd\x16\xc5\x4c\x2d\xae\x51\x81\xdf"
- "\x07\x79\xfa\xf4\x70\x79\xba\x7b\x3e\x9c\xa7\xe3\x3b\x51\x62\x7f"
- "\xbb\x85\xf7\xb5\x67\x8e\x93\xfa\xb4\x3e\xe2\x9b\x00\xec\xee\x1c"
- "\x87\xdb\xee\xce\x71\x30\xd9\x44\x54\x34\xd7\x75\xb2\xbb\xb8\xa7"
- "\xd5\x9c\xe9\x53\xd0\xee\xe6\x6d\xb7\x88\x98\xee\x05\x99\xf4\xc3"
- "\x33\xde\x30\x1d\xdf\x1d\x42\xfb\x5b\x04\xf7\x15\x31\x9b\x5c\xd1"
- "\xb8\x8a\xcd\xcb\xcf\x6c\xf6\xb4\xc5\x73\x22\x3d\x6d\xf1\xa3\x23"
- "\xba\xb7\xc5\xb3\xf6\x74\x6f\x8b\x1f\xbd\xef\xa2\x2d\x0e\xd6\x16"
- "\x43\x2c\xd6\x2b\x5b\x3c\x2b\xef\xa2\x2d\x3e\x53\xb6\x78\xd6\x1a"
- "\x99\x2d\xfe\x8b\xa7\x2d\x9e\x33\xbe\xb3\x2d\x9e\x13\xef\xb6\xc5"
- "\x33\x6d\x6e\x5b\x3c\xb3\xdc\xd3\x16\x3f\x56\xe1\x9f\x2d\x9e\xf3"
- "\xca\x99\xb5\xc5\x73\x6a\x3c\x6d\xf1\x63\x1b\x45\xbb\x62\x08\xdc"
- "\x16\x3f\xf6\x74\xf7\xb6\xf8\xb1\x95\x9e\xb6\xf8\xb1\x69\xdc\xe6"
- "\x3e\x56\xce\x6d\xf1\x63\x49\x3c\x7d\x66\x9e\x3c\xdd\x6d\x8b\x79"
- "\x7a\x67\x5b\xfc\x58\x75\x0f\xb6\x58\xe7\x74\x49\xb6\xb8\x11\x6c"
- "\x71\xa3\xe0\x7a\xdc\x97\x2d\x4e\xb2\xd5\xa1\x2d\x4e\x41\x5b\x9c"
- "\x64\xeb\xde\x16\x27\x7d\x8d\x36\x17\xf8\x4a\x0a\x37\xd0\x66\xdc"
- "\x73\xd1\x34\xef\x4b\x1c\xd7\x6d\x42\x7e\xc2\xf5\x5b\xa6\x64\xc8"
- "\x6d\x75\xe2\x93\x1d\xb6\x1a\xd2\x5d\x97\x79\xda\x6a\xb4\xd3\x68"
- "\xaf\x8b\x36\x50\x4b\xf1\x06\x3c\x83\x23\xb1\x50\xb2\xd9\x06\x48"
- "\xc3\x73\x36\x70\x4f\xa0\xa2\x53\xec\xa3\x04\x19\x34\x3d\x03\xcf"
- "\xc5\x7b\x20\x6f\x8d\xa7\x7d\x7f\xdc\xe1\x58\x2d\xb7\xef\x89\x4e"
- "\xb4\xef\x79\xfc\xbd\x78\x66\xd7\x1d\x45\xfa\x71\x68\xeb\xf9\xf5"
- "\x79\x2f\x77\x6f\xdf\xe7\x8e\x3e\x57\xf6\x1d\x6d\xca\x10\x59\x5f"
- "\xce\x97\x5d\x81\xb6\xd9\xea\x12\xcf\x8e\x7d\x47\x7b\x82\x76\x04"
- "\x6d\x8b\x64\xdf\xd1\xb6\x38\xc4\xbe\x76\x61\x8e\xcc\xbe\x0f\x90"
- "\xd9\x77\x45\x30\xf6\x7d\xde\xc2\x5f\x94\x7d\x47\x1c\x32\xce\xac"
- "\x7d\x97\xfa\xd5\x88\x03\x62\x82\x58\xc8\xfb\xd6\x88\x03\xe2\x81"
- "\x38\x60\x4c\x23\xd9\xf7\x6b\xd2\xb9\x7d\x2f\xea\xb0\xef\xf3\x92"
- "\x3a\xec\xbb\xc0\xed\x7b\x21\xee\xfb\xc6\xc6\x88\x93\x22\x3b\xdb"
- "\xf7\xa4\x68\xb7\x7d\x4f\xdc\x2f\xda\xbb\x26\xdc\xbf\x01\xf4\x3b"
- "\xc1\xd3\xc6\xcf\x2f\xf5\xcf\xc6\x27\x19\x3a\xd9\x78\xf1\xbc\x7b"
- "\xd1\xbe\x6b\xd1\xbe\x3b\xd0\xce\x07\x65\xe3\x93\xca\xdd\x7e\x28"
- "\x71\x1c\xb7\xad\x49\xb1\x9e\x76\x7f\x7e\x81\x68\xa3\x2e\x93\xdb"
- "\x7d\x57\x3f\x7f\xec\xfe\xfc\x27\x25\xbb\x8f\x76\xb5\xc2\xd5\x28"
- "\xb3\xfb\x68\x27\xe7\x3f\x6d\x5a\x72\x58\x66\xf7\xe7\x4f\xe2\x75"
- "\x98\x6f\x74\x32\xbb\x3f\x7f\x16\x4f\x4f\x8c\x90\xa7\xbb\xed\x3e"
- "\x4f\x77\xca\xed\x7e\x33\xda\xfd\xf9\xbb\x7a\xb0\xfb\x63\xfd\xb7"
- "\xfb\x8b\x13\xdd\x76\x7f\x71\x62\xf7\x76\x7f\xf1\x54\xb4\xfb\x6c"
- "\x8f\x58\xc0\x1e\xf8\xac\xcc\xbf\x94\xdb\x7c\x1c\x13\x01\x5f\x60"
- "\xc1\x7d\x43\x20\xdf\x6d\x25\xe8\x17\xe0\x03\xd7\x9b\xf3\xf0\xbb"
- "\x8b\xdd\x73\x30\xcc\x4a\x54\xe8\x03\xf2\x8e\x10\x25\x9e\x57\xc4"
- "\xe5\xa4\xdf\x04\xf7\x36\xba\xfd\xc5\x82\x97\xfd\xf4\x17\x78\x4e"
- "\x7b\x43\xeb\xea\x05\xb5\x32\x7f\x81\x67\x3e\x35\x78\xf9\x0b\x0b"
- "\xf8\x8b\x26\xe9\x1e\xc8\xef\x90\xe7\xc7\xfa\xb1\xfc\x47\xd8\x07"
- "\xf3\x37\x3e\x83\xe7\x97\x31\xff\xf2\x84\xce\xd3\xbf\xe8\x67\xb8"
- "\x3c\xfa\x0f\x4f\x3c\x22\xf9\x17\xf4\xcf\xae\x4e\xfe\x65\x91\xa2"
- "\xc3\xbf\x5c\x2a\xf3\x2f\xe9\x92\x7f\x79\x62\xed\x79\xdf\x7f\xe8"
- "\x85\x5d\x0b\xd6\xbf\xa0\x4d\x43\x7b\xd6\x9d\x7f\x71\xc9\xfc\x8b"
- "\x2b\x28\xff\xb2\xb0\xf6\x17\xe5\x5f\xce\x42\xff\x41\x8e\x01\xe2"
- "\xc2\x7c\x0b\x60\x83\x38\x20\x06\x28\x7f\xdc\x8f\x1a\xb1\x41\x5c"
- "\x10\x93\x6b\x92\xdd\xbe\x85\xe1\xc2\xfc\xcb\xc2\x1a\x6f\xff\x52"
- "\x3c\x4c\xf2\x2f\xfa\x8c\xce\xfe\x45\x5f\xe0\xf6\x2f\x4f\xb0\xf1"
- "\x1b\xbe\xef\xdf\x82\x35\x9e\xbe\x25\xf9\x12\xff\x7c\x8b\xfe\xfb"
- "\x2e\x7c\x0b\xd3\xc1\xbc\x0d\x1e\x7d\x07\x2d\xf8\x97\x20\x7c\xcb"
- "\x62\x15\xaf\x23\xae\x8d\x5e\x90\xc0\xed\xb7\xde\xe8\xf6\x37\x0b"
- "\xa2\xe5\x69\x6e\x7f\x93\x2c\xee\xc1\xbd\x60\x68\xe0\xfe\x66\x31"
- "\x3b\xe7\x0d\xd7\x4d\x57\x9c\xe0\x36\xdd\xd3\xdf\x2c\xfe\xde\xd3"
- "\xdf\x2c\xde\xc5\xeb\x90\x1c\xce\xfd\xcd\xe2\x06\x9e\xbe\x40\x23"
- "\x4f\x77\xfb\x1b\x9e\xde\xd9\xdf\x24\x8f\xe9\xc1\xdf\xa8\xdb\x23"
- "\xf5\xe3\xda\xf3\x2a\xb4\x0e\xa3\xde\x34\x26\xe1\x0e\xa7\xb7\xde"
- "\x70\x7d\x71\xf2\xb3\x70\xa4\xf9\xa7\x99\x7c\xbe\xc3\x25\xbe\x5f"
- "\xdc\x16\xa9\xd7\x1d\x59\x08\xba\xd3\xe2\x5b\x77\x40\x6f\x54\x92"
- "\xde\xd4\x25\x7d\x4b\x40\x97\x04\x9c\x93\xda\x02\x3a\x63\xb6\x35"
- "\x32\x1d\x52\x37\xc5\x10\xdc\xd3\x31\xa4\x85\x68\x42\x14\x8a\x01"
- "\x38\xdf\xe1\x04\xfd\xb9\x7b\x34\x75\xfd\xbe\x31\x86\x84\x24\x91"
- "\x50\xd4\xa1\xd7\xc5\x79\x0f\xdc\x1b\x02\xe7\x3b\x80\xbf\xd1\x8f"
- "\x7e\xe6\x9e\xef\x68\xf3\x63\xbe\xc3\x9c\x6e\x61\xf3\x1d\xf8\xbe"
- "\x94\x0b\xf4\x84\xbd\xc3\x83\xf3\x1d\x76\x36\x47\xc4\xec\x57\x09"
- "\x9b\xef\x38\x4c\x70\xae\x43\xda\x1b\x06\xe7\x38\x7e\x9f\x40\x04"
- "\xdc\x3b\x62\x0b\xe8\xcd\x5e\x5d\x1d\xd3\x9b\xc0\x6d\xd8\x93\x05"
- "\xdd\xad\xf9\x71\x80\x4c\x9d\xea\x0a\x2d\xdd\xfc\xba\xe6\xb5\xc3"
- "\x76\x05\xee\x99\xe9\x04\x8c\x5c\x60\xab\xa8\xda\xcb\x56\xb5\x8b"
- "\xf2\x6e\xe7\xf2\x06\xac\x54\xd0\x93\xa7\x90\xce\xf7\xcc\xb4\x5b"
- "\x80\x6b\xba\x61\x45\xcb\x50\xb6\xd1\xa4\x48\xdc\x37\xd3\xb5\x3c"
- "\x69\x90\x0b\xe4\x89\xef\x49\x54\x9c\xb2\xf7\x77\xaa\x07\xd9\xf3"
- "\xda\xc8\x18\xb0\x4b\x21\x68\x97\x80\x9f\x83\x4b\xda\x40\xb6\x5f"
- "\x73\xd9\xe2\x1e\x6e\xf8\xd7\xb1\x5c\xa7\x85\xb2\x47\xb5\xb7\x83"
- "\x7c\xed\x5c\xbe\x33\x9f\xd4\x90\x62\x69\xbe\x0f\x7c\x7d\x3d\x60"
- "\xca\xec\x92\x2d\x8c\xe2\x19\x14\xce\x76\x5d\xa4\xeb\x3b\x90\xaf"
- "\x0d\xcf\x1b\xd1\x21\xfe\x9a\xe2\x23\x38\x3f\xf9\x25\x9f\xef\x0b"
- "\x11\xf7\xe4\x58\x0e\x3e\x62\xbe\x96\x98\xcb\xc0\x46\x0f\x48\x8e"
- "\x69\x2f\xd2\xeb\x58\x1f\x24\x23\x50\xf9\xa6\x58\xcf\x8d\x7c\xb5"
- "\xbf\x20\xf9\x3e\xd9\x18\xbc\x7c\xd3\x7c\xee\x95\x7e\x66\xe5\xab"
- "\xf9\x05\xc9\x97\xed\x71\x10\xa4\x7c\x9f\xaa\xec\x4e\xbe\xd8\x4f"
- "\x90\xfa\x08\x52\xff\x00\xfd\x0a\xf7\xa1\xe9\x3a\x77\xdf\x20\x5d"
- "\x27\xcd\x8b\x82\x6c\x94\x06\xdc\x13\x1a\xda\x9c\x3c\x0f\xcf\x5d"
- "\x58\x5a\x24\xcd\x89\x16\xe0\xd9\x22\x88\xd5\x66\xc0\x4a\x8f\xef"
- "\xc3\x88\x38\x81\x1f\x78\xd4\x06\xb6\x7a\x84\x7e\x9c\xd3\x00\x7e"
- "\xa2\x54\x6f\xf2\x81\x99\x80\x36\x3e\x24\x8d\x68\x66\x26\x73\xec"
- "\x5c\xcb\x01\xb3\x36\x88\x89\xec\xcd\x04\xdf\x6f\x0d\x6b\x06\xbb"
- "\xda\x9e\x34\x68\x06\xc4\xd8\x12\x6e\xaf\x2f\xb1\xb3\x78\xa8\x4b"
- "\xdc\x36\x79\xe2\x76\xb2\x0b\xdc\x64\xeb\x0c\x34\x1c\x37\x0b\xc3"
- "\x8d\xd9\xf5\xe5\x10\x9b\x02\x7e\x12\x6e\xcc\xae\x03\x76\x0c\xb7"
- "\x96\xc3\x2c\x06\x92\xec\x3a\xc6\x3f\x88\x5d\xed\x2c\x88\xe7\x56"
- "\xa7\x6d\x64\xb8\xe1\xd8\xf6\xac\x40\x71\x5b\x9a\xe4\x19\xf7\xa4"
- "\x1f\xf0\x2f\xee\x59\xfa\x2d\xc6\x35\xf2\xb8\x07\x7f\x9f\x84\x38"
- "\xc7\x19\x52\x1e\x65\x0b\xaa\x1f\xbd\xd4\xe6\x19\xc3\xa4\x8b\x67"
- "\x10\x2d\xb9\x26\xf0\x18\x26\x9d\x8d\xb7\x55\x6c\xee\x2a\x7e\x49"
- "\x7f\xc5\x33\x7e\x49\xcf\xe0\x71\x4a\xfa\xfe\x93\x39\x18\xbf\xa4"
- "\x17\xf0\xf4\x25\x63\xe4\xe9\xee\xf8\x85\xa7\xb3\xf3\xd1\x57\xa7"
- "\x5b\x02\x8b\x59\xae\x3b\xc7\x31\x4b\x74\x37\x31\x4b\xf4\x05\x16"
- "\xb3\x2c\xf3\xb9\xfe\xff\xa2\x4f\x95\x6c\x7e\xba\x2d\x78\x9b\xbf"
- "\xdc\xe7\xfa\xff\x8b\x3e\x55\x92\xef\xb2\xbc\xe0\xe5\xbb\x42\x19"
- "\xbc\x4f\xcd\xca\x70\xfb\xd4\xac\x0c\xdf\x3e\x35\xf3\xa7\x8b\x3e"
- "\xb5\x2b\x9f\xba\xbc\x25\x78\x9f\x9a\xb9\xcb\xd3\xa7\x66\x8f\xf6"
- "\xcf\xa7\x66\xdd\xd2\xf7\x3e\x35\xcb\x6b\x1c\x3a\x3b\x9c\xd7\x69"
- "\xc5\xca\xc0\x7d\x6a\xd6\xcf\xbe\x7d\x6a\x96\xd3\xd3\xa7\x66\x35"
- "\x70\xdf\x99\xad\xe3\x3e\x35\xab\x89\xa7\xaf\xc8\x96\xa7\xbb\x7d"
- "\x2a\x4f\xe7\x3e\x35\x7b\x6c\x60\x3e\xf5\x8a\x73\xec\x53\xb5\xdd"
- "\xf8\x54\xed\x05\xe6\x53\x57\x76\xb7\xff\xef\x45\x9b\xcf\x6c\x7e"
- "\x76\x6c\xf0\x36\x3f\xc7\xe7\xfb\x6f\x3d\xdb\xfc\x67\x93\xdd\x36"
- "\xff\xd9\x64\xdf\x36\x7f\xd5\xb7\x17\x6d\x7e\x57\x36\x7f\xa5\x25"
- "\x78\x9b\xbf\xaa\xd2\xd3\xe6\xaf\x1e\xe1\x9f\xcd\x7f\xf6\x9a\xbe"
- "\xb7\xf9\xcf\x7a\xad\xff\x5b\xad\xe2\x75\x7a\xe6\xa9\xc0\x6d\xfe"
- "\xb3\xdf\xfb\xb6\xf9\xcf\xfe\xe4\x69\xf3\x9f\xad\xe6\xb6\x7d\x75"
- "\x24\xb7\xf9\xcf\x36\xf2\xf4\x67\xd2\xe4\xe9\x6e\x9b\xcf\xd3\xb9"
- "\xcd\x5f\xad\x0b\xcc\xe6\x87\x9d\x63\x9b\xaf\xe9\xc6\xe6\x6b\x2e"
- "\x30\x9b\xff\x5f\x79\xc1\xdb\xa4\x5c\xa5\xdb\x26\xe5\x2a\x7d\xdb"
- "\xa4\xb5\x4f\x5f\xb4\x49\x5d\xd9\xa4\xd5\xe3\x83\xb7\x49\x6b\x27"
- "\x7a\xda\xa4\xdc\x37\xfd\xb3\x49\x6b\xf7\xf4\xbd\x4d\x5a\xdb\xe0"
- "\x69\x93\x72\x0b\x79\x9d\xd6\x0c\x0a\xdc\x26\xe5\xae\xf0\x6d\x93"
- "\x72\x9f\xf5\xb4\x49\xb9\xe2\x9c\x59\x6e\x25\xb7\x49\xb9\x0b\x79"
- "\xfa\x1a\x95\x3c\xdd\x6d\x93\x78\x3a\xb7\x49\xb9\x3d\xad\x7f\x60"
- "\xdc\xaf\x8b\xf0\xe2\xfe\x13\x12\xf7\x0d\xe1\xfb\x0a\x25\xee\x1b"
- "\xf8\x3a\xe7\x42\x7d\xd5\x73\x4b\x88\x32\x0f\xcf\x35\x01\x7d\x4f"
- "\xfe\x2b\x72\x3f\x6f\x2d\xae\x3f\x50\x1f\x04\x1b\xd6\x24\xda\xb4"
- "\x74\xb0\x69\x4d\xf0\x1b\xf7\xbb\x1a\xa1\xaf\x42\x5b\x84\xe7\x20"
- "\xe0\x6f\x6e\xdb\xac\xfd\xf1\xdd\xcd\x80\xde\xab\x6a\x12\xdf\xab"
- "\x4a\xec\xfc\x5e\x55\xa1\xec\xfd\x1d\xd4\x8d\x90\x95\x8a\x50\x9c"
- "\x0b\x06\xfb\x26\xda\xb1\x9a\xfe\x0e\xb5\x68\xc7\x4e\x81\x1d\x3b"
- "\xe5\xd6\x09\xb4\x63\x27\xc1\x8e\xd9\x96\xea\x46\xa2\x2d\xeb\xfc"
- "\x4e\x15\x9f\xfb\x65\x76\xcc\xe0\x65\xc7\x1e\xf7\xb2\x63\xf3\xc0"
- "\x8e\xcd\x02\x3b\x16\xe2\xd6\x87\xdf\x1c\x24\xc2\xa4\xd9\xa0\x13"
- "\x60\xc7\x5e\x3c\x85\x76\x6c\x6f\x90\x76\x2c\x6f\x9a\xa7\x3e\x18"
- "\xf6\xf8\xa7\x0f\x79\x9f\xf9\xd2\x87\x76\x43\xb0\xfa\x90\x67\xf1"
- "\xd4\x07\x43\x39\xaf\xd3\x73\xfd\x03\xd7\x07\x83\xa1\x43\x1f\x9e"
- "\xf0\xd6\x07\xc3\x4b\x9e\xfa\x60\x48\xe2\xbc\x37\x98\xb8\x3e\x18"
- "\x32\x78\xfa\x73\x4a\x79\xba\x5b\x1f\x78\x3a\xd7\x07\x43\xed\xc5"
- "\xf9\xd9\xf3\xd5\x47\xaf\x8b\xbe\x38\x3f\xdb\x53\xbf\xcc\x60\x09"
- "\xbe\x5f\x56\x70\x8e\xe6\xbf\x7f\x49\x63\xc9\xeb\xd2\x83\x97\xef"
- "\xf3\xe7\x68\xfe\xfb\x97\x34\xae\x50\xd0\x8b\xf9\xef\x17\xbb\x9d"
- "\xff\xee\x3e\x8e\x79\xc9\x52\xdb\x11\xc3\xbf\x64\x91\xd6\x6e\x76"
- "\x8e\xe1\x5f\x7a\xc8\xf3\xdd\xa9\xf5\x0a\xef\x77\xa7\x7a\x8a\xed"
- "\x1d\xff\xa7\x62\xfb\x17\xc6\x05\x1f\xdb\xbf\xa4\xf5\x8c\x65\x36"
- "\x18\xfc\x8b\x65\x5e\x2a\xf2\x15\xcb\x38\x82\x8e\xed\x5f\x2a\xf7"
- "\x8c\x65\x36\xa4\xf3\x3a\xbd\x58\x17\x78\x2c\xb3\x61\xba\xef\x58"
- "\x66\xc3\x6c\xcf\x58\x66\xc3\x58\x1e\xb3\x6c\xc8\xe3\xb1\xcc\x86"
- "\x58\x9e\xfe\x62\xad\x3c\xdd\x1d\xcb\xf0\x74\x1e\xcb\x6c\xd8\x78"
- "\x71\xde\xf6\x7c\x8d\x65\xfe\xe6\xb8\xe8\x6b\x7b\xf2\x05\x1b\xca"
- "\x83\xf7\x05\x9b\x66\x5c\xf4\xb5\x3d\xc9\x77\xe3\xc4\xe0\xe5\xbb"
- "\x79\x57\xf0\xbe\xb6\x68\x92\xdb\xd7\x16\x4d\xf2\xed\x6b\x0b\xf7"
- "\x78\xfa\xda\x2d\x8b\x2e\xfa\xda\xee\x7c\xed\x26\x63\xf0\xbe\xb6"
- "\x30\xcf\xd3\xd7\x16\x9d\xf6\xcf\xd7\x16\x0d\xea\x7b\x5f\x5b\x14"
- "\xe1\xe9\x6b\x8b\x9a\x44\xfc\x6f\x09\xdc\xd7\x16\xed\xf5\xed\x6b"
- "\x8b\xea\x3c\x7d\x6d\xd1\x56\xee\x53\x8b\xec\xdc\xd7\x16\xed\xe4"
- "\xe9\x5b\xc6\xc9\xd3\xdd\xbe\x96\xa7\x73\x5f\x5b\xac\xbc\x38\x9f"
- "\x7b\xbe\xfa\xda\x92\xa4\x8b\xbe\xa0\x27\x5f\x50\x1c\x11\xbc\x2f"
- "\xd8\xea\x73\xff\xe3\x9e\x7d\xc1\xb6\x04\xb7\x2f\xd8\x96\xe0\xdb"
- "\x17\xfc\xbd\xce\xd3\x17\xbc\xfc\xf4\x45\x5f\xd0\x9d\x2f\x28\xa9"
- "\x0c\xde\x17\xfc\x7d\xa3\xa7\x2f\x30\xf6\xf7\xcf\x17\x6c\xbb\xa4"
- "\xef\x7d\xc1\xb6\x28\x4f\x5f\xb0\xcd\x2a\xe2\x7f\x77\xe0\xbe\x60"
- "\xdb\x67\xbe\x7d\xc1\xb6\x2f\x3c\x7d\xc1\xb6\x72\x6e\xf3\x8d\x4a"
- "\xee\x0b\xb6\x99\x78\xfa\xcb\x13\xe5\xe9\x6e\x5f\xc0\xd3\xb9\x2f"
- "\x30\x6a\x2e\xce\xf3\x9e\xaf\xbe\xa0\x34\x2d\x78\x5b\x55\xa6\x74"
- "\xdb\xaa\x32\xa5\x6f\x5b\xb5\xe3\x69\x4f\x5b\xb5\xfd\xaa\x8b\xb6"
- "\xaa\x3b\x5b\x65\x8c\x0a\xde\x56\xed\xf0\x9a\xff\x2d\xf3\x73\xfe"
- "\x77\x87\xcf\xf9\xdf\xe0\x6d\xd5\x0e\xaf\xf9\xdf\x32\x71\xfe\xb7"
- "\xf4\xa7\xc0\x6d\x55\xd9\x0a\xdf\xb6\xaa\xcc\x6b\xfe\xb7\x4c\x9c"
- "\xff\x2d\x13\xe7\x7f\xcb\xc4\xf9\xdf\x52\xab\x3c\xdd\x6d\xab\x78"
- "\x3a\xb7\x55\x65\xbd\x9c\xff\x7d\x6d\x8c\x7b\xfe\xf7\x35\xf6\xce"
- "\x80\x6b\x63\x45\x73\xe7\xf9\xdf\x57\x5f\xf6\xdc\xc7\xe4\x95\xdb"
- "\xd8\x5c\x30\xea\x85\x8d\xbf\x9b\xde\xe5\xbc\xf0\x65\x15\xcd\x17"
- "\xe7\x85\xfb\x62\x5e\xf8\xd5\x85\x9e\x7a\xf2\xda\x17\xfe\xe9\xc9"
- "\xab\xdf\xf7\xfd\xbc\xf0\xab\x76\x4f\x3d\x79\xad\x5a\xe4\x44\x10"
- "\xf3\xc2\xaf\x95\xfa\xd6\x93\xd7\x2a\x3c\xf5\xe4\x35\x71\x5d\xee"
- "\x6b\x8d\x5c\x4f\x5e\x5b\xcf\xd3\x5f\x51\xca\xd3\xdd\x7a\xf2\x8a"
- "\x6c\x5e\xf8\xb5\x26\x7f\x7c\xba\x43\x5d\x11\x85\x3e\x7a\x4c\xe3"
- "\x1d\xce\x0e\x3e\xa7\x89\x7c\xee\xca\xa7\xcf\xe1\xb6\x1f\x79\xdc"
- "\x6e\xd4\x57\xf7\xe8\xd3\x9b\x44\x9f\x9e\xd8\xd9\xa7\x4b\xfe\x1c"
- "\xf9\xbc\xc5\xaf\x39\x61\x2f\x5e\x07\xe4\xcf\xef\xd1\xf4\x86\xd7"
- "\xc8\x69\x4f\x7f\x1e\x2c\xaf\x2b\xce\xd1\xfb\x2f\xbf\xa4\x39\xe1"
- "\xd7\xec\xc1\xf7\xed\x5e\x3f\x47\xef\xbf\xfc\x92\xc6\xa9\x2b\x7a"
- "\xf1\xfe\x4b\x65\xb7\xef\xbf\x5c\x1c\x9b\x40\xf9\xbe\xde\x12\xbc"
- "\x7c\xdf\x4c\x0c\x3e\xde\xdf\x19\xee\x8e\xf7\x77\x86\x4b\xb1\x0d"
- "\xda\x42\xb6\xef\x0e\xd8\x3f\x43\x0a\x7c\x4e\x11\xf2\x5c\x0a\xdb"
- "\x77\x5c\x65\x6e\x3a\x80\x67\x25\x41\xbc\xf3\xf6\xda\xb8\x74\x79"
- "\xbc\xf3\xd6\x68\x29\xd6\x89\xc3\x38\x08\xe2\x1a\x8c\x69\xa4\x18"
- "\xbf\xe0\x44\x0f\xeb\x41\xaf\xd2\x57\x63\x9f\xa0\x3d\xa4\x22\xea"
- "\xc2\xef\x0f\x54\x4e\x0a\xbe\x3f\xf0\xb6\xd7\xfa\xb7\x9d\x7e\xae"
- "\x7f\x7b\xdb\xe7\xfa\xb7\xe0\xfb\x03\x6f\x7b\xad\x7f\xdb\x29\xae"
- "\x7f\x7b\xf3\xeb\xc0\xe3\x9c\x9d\xdd\xac\x7f\xdb\xe9\xb5\xfe\x6d"
- "\xa7\xb8\xfe\x6d\xa7\xb8\xfe\x6d\xa7\xb8\xfe\xed\x4d\x8b\x3c\xdd"
- "\x1d\xe7\xf0\x74\x1e\xe7\xec\xf4\x6b\xfd\x1b\xc4\x39\xba\x5e\xc4"
- "\x39\x3d\x8f\x5d\x9c\x37\x71\xce\xbd\xe7\x49\x9c\xf3\x8f\x31\x7e"
- "\xf8\x89\x28\x2f\x3f\x51\xfd\x7f\xcb\x4f\xec\xec\xc5\xda\xb7\x7f"
- "\x76\xbb\xfe\x9f\xc9\x37\x4f\x26\x5f\xb4\xd1\xa2\x6c\x9d\x51\xfa"
- "\xea\xa0\xe4\x0b\xb6\xb9\x28\xf3\x97\x22\xdb\x7f\xa4\x05\x2f\xdb"
- "\xaa\xe6\x8b\x31\x4e\x4f\xf2\xfd\xe7\xfe\xe0\xe5\xfb\x9e\xcf\xf3"
- "\xcf\x7a\x8e\x71\x76\x47\xec\xeb\x88\x71\x76\x47\x78\xc7\x38\x18"
- "\xd3\x4c\xb6\xf3\x58\xe7\x39\x88\x51\x72\xf5\x10\xef\x2c\x21\xc4"
- "\xdc\xb4\x9b\xe4\x41\xcc\x93\x7b\x1c\xe2\x9e\x85\x10\xf7\x38\x4a"
- "\xc5\xb8\x67\x97\xc1\x33\xee\x79\xff\xca\x2e\xe3\x9e\x10\x77\xdc"
- "\xe3\x80\x98\xa6\xbd\x54\x5f\x5d\x70\x5c\x16\x03\x2d\xe8\x1c\x03"
- "\xb5\x19\xc0\xe7\x5c\xa5\xaf\x69\x87\x38\xa8\xbb\x18\x88\x61\xef"
- "\x15\x07\xfd\xf2\x62\xa0\x77\xa3\x83\x8f\x81\x76\x79\xed\x21\xba"
- "\x7b\xaf\x7f\x31\xd0\xae\x03\x3e\xc7\x7a\x82\x8e\x81\x76\x35\x79"
- "\xc6\x40\xbb\x2b\x79\x9d\xde\xdb\x1b\x78\x0c\xb4\xfb\x79\xdf\x31"
- "\xd0\xee\x4d\x9e\x31\xd0\xee\x85\x3c\xd6\xd9\x5d\xcd\x63\xa0\xdd"
- "\xd9\x3c\xfd\xbd\x6a\x79\xba\x3b\x06\xe2\xe9\x3c\x06\xda\xdd\xe0"
- "\xe7\xfc\x4d\x94\x03\x7c\xec\xb9\x5f\x37\xd7\xdd\xfc\x4d\x5f\xad"
- "\x9b\xbb\xe7\x3c\x99\xbf\xf9\x70\xec\x45\x3f\xdd\x9d\x1f\xd9\xdd"
- "\x14\xbc\x1f\x31\x9d\xa3\xf5\xff\xbf\x24\x3f\xfd\x61\x46\xf0\xf2"
- "\xdd\xd3\xed\xfa\xff\xee\xfd\x74\xf5\x56\xf7\x58\x44\xf5\xd6\xc0"
- "\xc6\x22\xaa\x2f\xf1\xf4\xc9\x1f\xbd\x73\x71\x2c\xc2\x5f\x3f\x6c"
- "\x6a\x0c\xde\x0f\x7f\x6c\xf1\xf4\xc3\x7b\x27\xfb\xe7\x87\xab\x1f"
- "\xe9\xfb\xb1\x88\xea\x85\x9e\x7e\x78\xef\x38\x91\x0b\x8b\x02\xf7"
- "\xc3\x7b\x2f\xf3\xed\x87\xf7\x5e\xe9\xe9\x87\xab\x6d\xdc\xdf\xee"
- "\x9d\xc4\xfd\xf0\x5e\x31\xfd\xa3\x85\xf2\x74\xb7\x1f\xe6\xe9\xdc"
- "\x0f\xef\x4d\x08\x6c\xce\xe5\x8a\xf3\x74\xce\x45\x7b\x81\xcd\xb9"
- "\xfc\xbf\xaa\x8b\x7e\xa2\x27\x3f\xb1\x77\x61\xf0\x7e\xa2\x26\x22"
- "\x78\x3f\xf1\x69\x8d\xdb\x4f\x7c\x5a\x13\x98\x9f\xf8\xf4\x36\x4f"
- "\x3f\x51\xf3\xd5\x45\x3f\xe1\xaf\x9f\xf8\x6f\x12\xbc\x9f\xf8\x54"
- "\xe5\xe9\x27\xf6\x3d\xe5\x9f\x9f\xf8\xf4\xd9\xbe\xf7\x13\x9f\xae"
- "\xf7\xf4\x13\xfb\x66\x89\x5c\x78\x29\x70\x3f\xb1\x6f\x82\x6f\x3f"
- "\xb1\xef\x3e\x4f\x3f\x81\xa3\x10\xe8\x0f\xf6\xa5\x71\x3f\xb1\x2f"
- "\x9a\xa7\xd7\xac\x97\xa7\xbb\xfd\x04\x4f\xe7\x7e\x62\x5f\xf6\xc5"
- "\xf5\x76\xe7\xeb\x7a\xbb\xda\xa6\xe0\x6d\x99\x39\xcd\x6d\xcb\xcc"
- "\x69\xbe\xd7\xdb\xd5\x7f\xef\xb9\xde\xae\xee\xa5\x8b\xeb\xed\xba"
- "\xb3\x55\xfb\xd6\x07\x6f\xab\xea\x77\x7a\xda\xaa\x06\x3f\xcf\x83"
- "\x34\x5f\xdf\xf7\xb6\xca\x1c\xe3\x69\xab\x1a\xc4\x33\x20\xeb\x66"
- "\x07\x6e\xab\xcc\xc7\x7c\xdb\x2a\xf3\xcf\x9e\xb6\xca\x2c\x9e\xff"
- "\xd8\xa0\xe5\xb6\xca\x2c\x9e\xff\x58\x37\x4b\x9e\xee\xb6\x55\x3c"
- "\x9d\xdb\xaa\x06\xbf\xf6\xff\x77\xcf\xaf\x05\x15\xd3\x9e\x85\xf9"
- "\xb5\xbe\x8a\x69\xcf\x97\xf9\xb5\xcf\x2e\xce\xff\x74\x1b\xcf\x36"
- "\xf4\x62\xdf\xff\xcf\xbb\x9d\xff\xe9\xde\x07\x1c\xa8\x74\xfb\x80"
- "\x03\x95\xbe\xe6\x27\x72\x81\x43\x79\x10\x8f\xae\x3d\x4e\x94\xcf"
- "\xe1\xfc\xc4\xfe\x3a\x62\xc0\xf9\x09\xbd\x34\x3f\x51\x24\xc6\xb8"
- "\x07\xae\xf2\x8c\x71\xff\x67\x4f\x57\x31\x2e\xc6\xb6\x4e\x88\x5b"
- "\x1d\xde\xf3\x12\x7f\xed\xda\x77\xb4\x85\x54\xe8\x4e\x97\xea\x6b"
- "\x02\xf1\x1d\x5b\x96\x71\xdf\xb1\xf9\x17\xe5\x3b\x3e\xdb\x1f\xbc"
- "\xef\xd8\x6f\xf5\xf4\x1d\xff\x7a\xc4\x3f\xdf\x71\x60\x51\xdf\xfb"
- "\x8e\x03\x19\x9e\xbe\xe3\x5f\xb1\x22\x1f\xe6\x06\xee\x3b\xfe\x35"
- "\xda\xb7\xef\xf8\xd7\xf5\x9e\xbe\xe3\x5f\xe2\x5a\xd3\x7f\xcd\xe0"
- "\xbe\xe3\x5f\x11\x3c\xfd\x7f\x12\xe5\xe9\x6e\xdf\xc1\xd3\xb9\xef"
- "\xf8\x57\x52\x60\xe3\x21\x61\xe7\xe9\x78\x88\xe6\x02\x1b\x0f\xf9"
- "\xdf\x5e\xbc\xff\xf6\x65\x72\x6d\xc7\xfa\xf9\x2f\x93\x3b\xf5\xd7"
- "\x97\x40\xac\x7b\x82\xcf\xb9\x76\xf4\xd7\x2d\x5f\x89\xb6\xec\x8b"
- "\x6f\x3d\x6d\x59\xa3\xc1\x97\x2d\xeb\x6e\x5e\x15\xfb\xe7\x4e\xb0"
- "\x73\x78\xd6\x5a\x50\xf3\xaa\x4b\x7e\x49\xf6\xeb\x5f\x19\xc1\xdb"
- "\xaf\x2f\xbc\xf6\x3f\xfd\xb7\x9f\xfb\x9f\x7e\xe9\x73\xff\x53\x47"
- "\xd0\x6b\xe8\xbf\xf4\xda\xff\xf4\xdf\xe2\xfe\xa7\x8d\x41\xbc\x17"
- "\xf7\xe5\xf7\xbe\xed\xd7\x97\x5e\xfb\x9f\x7e\x29\xce\x9f\xfe\x5b"
- "\xdc\xff\xf4\x4b\x71\xff\xd3\xc6\x89\xf2\x74\xb7\xfd\x6a\x94\xbd"
- "\x17\xf7\xef\x6e\xf7\x3f\xa5\x79\xa9\xba\x02\xc1\x55\x09\x9f\x2a"
- "\xa8\xe3\x65\xc0\x01\x13\x7c\xaf\x01\x1c\x87\xc1\xf7\x06\x5f\x3a"
- "\x66\x0d\x49\xd5\xb9\x72\xa0\xce\x02\x51\x98\xad\x3f\x9a\x4c\xc3"
- "\x1d\x88\x4d\x19\xc7\x2a\x55\x17\xe6\x18\x18\xeb\xa2\x49\x04\x70"
- "\xd1\xb1\xf3\xf1\x20\x7f\x28\x70\x46\xbb\x84\x84\x1e\x57\xfc\xbb"
- "\x46\xca\x07\xf5\x0d\x3d\xac\xf8\xf7\xb3\x58\x06\xd4\x75\x3f\xb4"
- "\x65\xac\xcf\xba\x42\x59\x71\xaf\x8c\x24\x2b\x1c\xf4\x3b\x93\xfe"
- "\x04\x69\x52\x1c\x1c\x11\xd6\x32\x30\x96\x66\x25\x10\x8c\xb1\x2a"
- "\x87\x5b\x95\x58\xa6\x49\xdf\x86\xd7\x08\x5e\x73\x42\x1d\x33\x17"
- "\x11\x21\xff\xc4\x40\x15\xd8\x82\xfe\x59\x36\xda\xbc\xd8\x01\x75"
- "\x4e\x77\x90\x0f\x47\x36\x2a\xdf\xd8\x0c\x69\x4e\x12\x81\x67\xe2"
- "\x61\x19\x10\x63\x42\x7d\x0e\x5e\x59\x0c\xf9\xbb\xaa\xc3\xb3\xaf"
- "\x93\x31\xfd\x47\x53\x4b\x60\xbc\x39\xe8\xf3\xfd\xb7\xb0\x95\x23"
- "\x89\xe9\x6a\x90\x9d\x96\x08\x5d\x5d\x0f\xf0\x39\x07\xbb\xb1\x89"
- "\x2a\x3c\x4f\x33\x6b\x13\x11\xd6\xb9\x06\xaa\x3e\xce\x60\xe7\x59"
- "\x5a\x5b\x57\x7f\x15\x6b\x51\xc4\xaa\x50\xe6\x78\x66\x1a\x9e\xb9"
- "\x0a\xbc\x21\x90\x3e\x6b\x4f\x3a\x21\xde\x58\xa4\x24\x2e\x9a\xad"
- "\x4d\x9b\xbf\x68\xee\xe2\xa7\xd2\xb4\x57\x25\x0e\x26\xd3\x16\x2f"
- "\xd6\x2e\x9a\xad\x7f\x5a\x2b\xbf\x72\xab\x36\x71\x7e\xea\xec\x39"
- "\x0b\xe7\x5e\xb3\xe8\xb1\xe4\xc1\x50\x27\x22\xab\x47\x38\xd6\xc5"
- "\xb5\xfa\xab\x85\xc5\x2f\x10\xf2\xe2\x30\xa2\xc4\x7a\xc1\xf3\x1a"
- "\xa4\x33\xf5\xf2\x37\x50\x9b\x00\x79\xb2\xc0\x06\xae\xcb\x1c\x08"
- "\x79\x0f\x1e\x2c\x81\x7a\x15\x43\xbd\xa1\x8e\x58\x67\x87\x54\x67"
- "\x89\x13\x59\xc8\x89\xcc\x13\xc0\xc1\xff\x8c\x08\xb3\x0f\xbc\x97"
- "\xd2\x04\x6c\x9f\x0d\xf4\x44\x01\x69\x8b\xd0\x2f\x51\x43\xaa\xae"
- "\x75\xf5\x7f\xc6\x49\x1c\xc3\x7b\x69\x7e\x8a\xb5\x15\xf5\x84\x26"
- "\xdd\xce\x75\xea\x90\xe6\x21\x9d\x82\xf0\x33\xfd\xfe\x93\xe8\x3e"
- "\xd3\xef\x10\x3b\x5b\x0e\xea\xd1\x02\xe9\x19\x16\xc5\x65\x46\x4c"
- "\xc7\xb3\x25\xf1\xac\x57\xac\x33\xb4\x0b\xfc\x22\x05\x3b\x2c\x72"
- "\x7f\xcd\xde\x18\xd7\x9a\x6f\x4d\x66\xe5\x29\x12\xe7\xa0\xed\x74"
- "\xed\xde\x98\x7a\x9b\x8d\x84\xad\x4c\x7e\x8c\x0e\xf8\x6a\x45\x98"
- "\x63\xfe\x5c\x3c\x93\xdc\xb5\xf6\x5b\x13\x5d\x7b\x28\xfa\xa1\xd1"
- "\x44\x03\x65\x37\xca\xce\x16\x54\x06\x86\xff\x7f\x18\xfe\x88\x23"
- "\xd4\x47\xc4\xf1\x90\x6e\x4f\x5a\x67\x1c\x3b\xf8\xf7\x8a\x8b\xec"
- "\x05\x2e\x50\xf5\xb6\xe4\x38\x27\x97\x23\xea\xee\xc9\xac\x24\x72"
- "\x1d\x93\xdd\x21\x8b\x2b\x7f\x5b\xbc\x2b\x6f\xdb\x1a\x9a\xb7\x2d"
- "\x0d\x64\xa6\xca\x5f\x42\xb4\x8f\x3a\x35\xc4\x70\x8a\x44\x5b\x0d"
- "\xdb\x92\x43\x14\xd9\x0a\x88\x2d\x04\xf0\x1b\xd1\x60\x33\xa2\x45"
- "\x7d\x57\xa1\x1c\xff\xbb\x85\x90\x29\xa9\x84\x7c\x37\x9e\xf4\x2b"
- "\x86\xfb\x02\x6b\xcf\x21\xbe\xff\xd3\xea\x43\x89\x25\x70\x2f\x9e"
- "\x0d\x19\xe0\xfd\x2d\x3e\xf5\xce\xdd\x6e\x6b\xd7\xed\xb6\x34\x42"
- "\xbb\x1b\x5c\x79\x46\xb0\x91\xdb\x6c\x5d\xb4\xdb\xca\xdb\xdd\xff"
- "\x44\xdf\xb7\xdb\xc2\xcf\x5c\x5c\x6d\x99\x11\x5c\xbb\x2d\x3e\xc7"
- "\xff\xdc\xed\x36\xfa\xc0\xfb\xeb\x06\x57\xbe\x11\xf0\x36\x02\xde"
- "\xc6\x2e\xf0\x36\x8a\x78\x0f\x39\xdc\xf7\xed\xfe\xba\x90\xb7\xfb"
- "\xeb\x69\xc1\xb5\xfb\x6b\x9f\xf6\x4f\xd6\x6e\x1f\x78\x1f\xae\x81"
- "\x76\x03\xde\xa5\x80\xb7\xb1\x0b\xbc\x8d\x22\xde\x43\x3f\xef\xfb"
- "\x76\x1f\xe6\xe3\xff\xab\x0f\x4f\x0a\xae\xdd\x87\xf7\xf7\xdc\xee"
- "\x52\x1f\x78\x7f\x63\x72\xe5\x97\x02\xde\xa5\x80\x77\x69\x17\x78"
- "\x97\x8a\x78\xdf\x9c\xdb\xf7\xed\xfe\x86\xef\x7f\xb3\xfa\x9b\x89"
- "\xc1\xb5\xfb\x9b\x5a\x3f\xda\xed\x03\xef\xa6\x2a\x68\x37\xe0\xbd"
- "\x1d\xf0\x2e\xed\x02\xef\x52\x11\xef\x87\xef\xec\xfb\x76\x37\xad"
- "\xe2\xed\x6e\x1a\x1f\x5c\xbb\x9b\xaa\xfd\xb0\x6b\xe9\x60\xb3\x3b"
- "\x61\x6e\x4e\x1f\x47\xae\x3d\x85\xed\x3f\xa2\xa3\x21\xdb\xd2\x87"
- "\xac\xcc\x56\x38\xd4\xdb\x32\x86\x1c\x24\x02\xf4\xfd\x92\xc2\x2c"
- "\x64\x10\xb4\x35\x89\xe6\x97\x69\xf0\xaf\x0b\xca\x71\x80\xed\x77"
- "\xaa\xb7\xa5\xb5\xe5\xa5\xaa\x9e\x9b\x47\xb4\x59\x56\xa2\xa9\xcf"
- "\xb4\x90\xcc\x64\x6a\xad\x27\x5f\x93\x10\x0b\x11\x70\x1c\x6b\x5f"
- "\x4b\x15\xd1\xa7\x50\x0a\x65\x0f\xc5\xfe\x62\xfe\x11\x12\x0d\x31"
- "\x71\x36\x05\xff\x51\xe0\x22\x5a\x28\x3f\x1a\x65\x09\x65\x0f\x0b"
- "\x9b\x46\x14\x1f\xcc\xb1\x13\x94\x27\xca\x16\xfa\x96\xd1\x4c\xae"
- "\x36\x42\x1e\x78\x98\xcb\x75\xcb\xbc\x40\xe5\xfa\xed\x41\x1e\x57"
- "\x6e\x2b\x30\x5b\xda\xf0\x9c\x5a\x0d\xbe\xd7\x0c\xe9\x1b\xeb\x93"
- "\x4f\x40\x3f\xe4\xdb\xf1\xd4\xb0\x2d\xdb\x05\x3e\x2b\xb0\x72\x8f"
- "\xf8\x5c\xff\x26\x93\xb7\x1d\xe4\xdd\x89\x6b\x6e\x79\x7f\xb7\x11"
- "\xe4\x6d\x17\xe5\xed\x18\x72\xb0\xff\x09\x1f\xf2\xb6\x3b\xc0\xe7"
- "\x80\xbc\x6d\xfe\xcb\xfb\xbb\x95\x5e\xf2\x6e\x38\x3b\xf2\xfe\x8e"
- "\xef\x23\x96\x67\xd4\x78\xca\xfb\x3b\x15\x97\xf7\x91\x72\x6a\x30"
- "\x42\xff\x7e\x9b\x35\xc0\x72\x7d\xbe\xff\x28\xb3\xe3\xc0\xef\xce"
- "\x3e\xcc\x2d\xef\xef\x55\x34\xc4\x28\xf2\xdb\x08\xfc\x1e\x72\xb8"
- "\x6b\x79\x1b\x81\xdf\x46\xe0\xb7\x31\x00\x7e\x37\xff\xe4\x29\x6f"
- "\xe3\x59\xe2\x77\xb3\x78\xfe\x93\xd1\x8b\xdf\xcd\xe9\x5c\xde\xcd"
- "\x91\x20\x6f\xe0\xb7\x31\x40\x7e\x7f\x1f\xee\x87\xbc\x81\xdf\x9d"
- "\x7d\xa7\x5b\xde\x47\xd3\x41\xde\x22\xbf\x8d\xc0\xef\xa1\x9f\xfb"
- "\x90\x37\xf0\xbb\x14\xf8\x6d\x0c\x80\xdf\x47\x67\x7b\xc9\xfb\x2c"
- "\xf1\xfb\xe8\x18\x2e\xef\x52\x2f\x7e\x7f\xdf\xcc\xe5\xfd\x7d\x1e"
- "\x35\x94\x02\xbf\x8d\x01\xf2\xfb\xe8\x2a\x3f\xfc\x16\xf0\xbb\xb3"
- "\xcf\x76\xcb\xfb\x87\x66\x1a\x52\x2a\xf2\xbb\x14\xf8\x7d\x73\x6e"
- "\xd7\xf2\x2e\x05\x7e\x97\x02\xbf\x4b\x03\xe0\xf7\x0f\x9f\x79\xca"
- "\xbb\xf4\x2c\xf1\xfb\x87\x42\x51\xde\x5e\xfc\xfe\x21\x81\xcb\xfb"
- "\xa8\x03\xe4\x0d\xfc\x2e\x0d\x90\xdf\x3f\xd8\xfc\x90\x37\xf0\xbb"
- "\x73\xac\xe0\x96\xf7\xb1\x04\x90\xb7\xc8\xef\x52\xe0\xf7\xc3\x77"
- "\xfa\x90\x37\xf0\x7b\x3b\xf0\xbb\x34\x00\x7e\x1f\x9b\xe0\x25\xef"
- "\xb3\xc4\xef\x63\x6a\x2e\xef\xed\x5e\xfc\x6e\xa9\xe1\xf2\x6e\x59"
- "\x48\x0d\xdb\x81\xdf\xa5\x01\xf2\xfb\x98\xcf\xf7\x7f\xbb\x8b\x4f"
- "\x52\x8b\x88\xca\x53\xe6\xc7\x6b\xcf\x5c\x8c\x72\xfc\x9d\x73\x13"
- "\xa3\x1c\xcf\xee\x3a\x46\x39\x3e\x9e\xcb\xfc\x98\x25\xb8\x18\xe5"
- "\x78\x63\x30\x31\x4a\x67\x99\x5b\x63\xce\x5c\x9c\x62\x1d\x7d\x6e"
- "\xe2\x94\x1f\x6d\x5d\xc7\x29\x3f\x56\x72\x99\xff\x38\x2d\xb8\x38"
- "\xc5\x3a\x29\x98\x38\xa5\xb3\xcc\x7f\xda\x79\xe6\x62\x95\x9f\x8a"
- "\xce\x4d\xac\xf2\x53\x52\xd7\xb1\xca\x4f\x51\x5c\xe6\xd6\x9a\xe0"
- "\x62\x95\x9f\x4c\xc1\xc4\x2a\x9d\x65\x7e\x52\x77\xe6\xe2\x95\x93"
- "\x43\xcf\x4d\xbc\x72\xe2\x60\xd7\xf1\xca\x09\xb1\xff\x73\x62\x7c"
- "\x70\xf1\xca\x49\x3f\xfa\x3f\x9d\xe3\x95\xce\x32\xb7\x15\x9e\xb9"
- "\x98\xc5\xf6\xec\xb9\x89\x59\x6c\xf1\x5d\xc7\x2c\x36\x35\x97\xf9"
- "\xc9\xca\xe0\x62\x16\x5b\x59\x30\x31\x4b\x67\x99\x9f\xd2\x9c\xb9"
- "\xb8\xe5\xe7\xd3\xe7\x26\x6e\xf9\xb9\xba\xeb\xb8\xe5\xe7\x6c\x2e"
- "\xf3\x9f\xa3\x82\x8b\x5b\x4e\x45\x06\x13\xb7\xa0\xac\x51\xe6\x18"
- "\xab\x70\x99\xdb\x2d\x34\x74\x5b\x7c\x3b\xc4\x23\x21\x20\xf7\x90"
- "\x16\x22\x14\xa1\xcc\x1b\xb9\xcc\x9d\xa1\x65\x1a\x90\x4f\x12\xca"
- "\x8c\xb5\xe3\x87\x88\x50\x67\xde\xb6\x0c\x2a\x10\x68\x8b\x8a\x00"
- "\x66\xc7\x1c\x39\x24\x54\x9b\xb9\x12\xbe\xdb\xd9\xfe\x99\xda\xcc"
- "\xd5\x5f\x41\x1b\xfb\xe1\x1c\x85\xc3\x90\x52\xe9\x0c\xd9\x11\x0d"
- "\xd7\xae\xa1\x23\xf4\x95\xed\x10\x4b\xd0\x27\x22\xc2\xcd\x2d\x95"
- "\xc4\xec\xf8\x94\xd4\x37\xbe\x47\x5c\xa1\x65\xc3\xae\x73\x10\x1d"
- "\xfd\x41\x17\x5e\x9b\x66\x21\xce\xc7\x22\xd4\xe6\xf4\x1a\xe0\xc5"
- "\x5b\x24\xae\x99\x9e\xa2\xdf\xe8\xd4\xed\x21\xe5\xc9\x50\x8e\xd5"
- "\x69\xa8\x18\xe7\x08\x29\x9f\x55\xb1\xc4\x22\xa8\xed\x44\xb7\xb0"
- "\x89\xd2\xfc\x39\x44\x99\x7f\x98\xa8\xd6\xcd\x21\xea\x75\x87\x89"
- "\xa6\xb6\xa9\x91\xd4\x1d\xad\x21\x75\x27\xbe\x20\x75\xa7\xe0\xd3"
- "\x06\x1f\x17\x7c\xb2\xbf\x20\xb5\x2d\x84\x4c\x3e\x46\x48\x56\x13"
- "\xb5\xfe\xfe\x20\x09\xaf\x75\x34\x12\x5c\xc7\x7b\x5c\xd1\xba\x47"
- "\x3d\x8b\x84\xd3\x6f\x22\x08\x7d\x2c\x42\x80\x6b\x4a\x4c\x37\x3b"
- "\xac\xa4\xb6\xc9\x8e\xd7\xb7\xc2\x75\x65\x56\x13\x94\xef\xaa\xc1"
- "\xfd\xe2\xac\xb5\xd9\x9f\x40\xfb\x46\x6d\x05\x39\xaf\x91\x62\xb2"
- "\xfc\x36\x12\xbd\x0e\x60\x46\xce\xc4\x51\xce\x99\x92\xb6\x40\x39"
- "\xd3\xca\xf7\x3f\x7b\x22\x62\x18\xc8\x7b\xb8\xeb\x89\x04\xcd\x94"
- "\x2f\x0e\x51\x5c\xa7\x85\xf3\x33\xf5\xb6\x4f\x89\x79\x95\x8b\xc4"
- "\x3d\x4d\xc8\x24\x27\x21\x28\x13\x9c\x4b\x9e\x92\x4c\xc2\x70\xfd"
- "\x98\xeb\x07\xdd\x30\x73\x93\x95\xac\x70\x40\x5d\x8f\xdb\x3b\xea"
- "\x5a\xbf\xaa\x9e\xc0\xb5\xe1\xf5\x49\x16\xa2\x4e\x26\x1a\x94\x33"
- "\xc4\xa2\xe9\x53\x9a\xc9\x20\xbd\x8d\x52\x94\x31\xca\x16\xe5\x8c"
- "\xe5\x49\xb2\x37\x27\x5a\x49\x96\x9d\x68\xcc\x99\xf0\x37\x9d\x5a"
- "\xcd\xe4\x27\x02\x75\xdc\x4f\x43\x46\x6d\x05\x7e\x84\x23\x27\x80"
- "\x8f\x4d\xc0\x83\x61\x74\xf5\xa9\x8d\xc5\xd0\x5e\x9c\xc3\x0f\xac"
- "\xcd\x76\x7f\xe6\x3f\x3a\xc5\x84\x32\x3e\xdb\x39\x9f\xdb\x2b\x81"
- "\xcf\x0d\xc0\x67\x1b\xe7\x73\xff\x13\x7e\xf0\xd9\xe1\xe6\xf3\xe9"
- "\xdd\x6e\x3e\xb7\xbf\xec\x9b\xcf\x6d\x4e\xce\x67\xa3\xe6\xfc\xe4"
- "\x73\xdb\xf3\xdd\xf3\xb9\x2d\xd9\x37\x9f\x8d\x2a\x29\xde\xed\x1b"
- "\x3e\xb7\xd5\x9c\x45\x3e\xdb\x83\xe3\x73\x9b\xd1\x93\xcf\xa7\x77"
- "\x72\x3e\x9f\x4e\x0a\x8e\xcf\xed\x3e\xcf\x3f\xe8\x2e\xde\x76\xf3"
- "\xd9\x28\xda\x67\xf0\x55\xa1\x46\xb0\xcf\x46\xd1\x3e\x0f\x39\xdc"
- "\x33\x9f\x8d\x32\xfb\xec\x30\xb8\xf9\xec\x7a\xd2\x37\x9f\x9d\x75"
- "\x22\x9f\xcf\x53\xfb\xec\x9c\xdd\x3d\x9f\x9d\x31\xdd\xf0\x79\x8d"
- "\xd4\x97\xe8\x1b\x3e\x3b\x37\x9e\x3d\x3e\x1b\x83\xb4\xcf\xce\x34"
- "\x4f\x3e\x3b\x56\x71\x3e\x3b\xc6\x05\xc7\x67\x97\xcf\xf5\xcf\xdd"
- "\xf5\x65\x64\x7c\xe6\xf6\x59\x50\xc4\x03\x9f\xc1\x3e\x1b\x45\xfb"
- "\x3c\xf4\x73\x3f\xf8\x2c\xb3\xcf\xf4\x91\x0e\x3e\x0b\x8a\x09\x3e"
- "\xf9\x2c\x90\x22\xce\xe7\xd2\xf3\xd3\x3e\x0b\xe4\xfa\x6e\xf9\x2c"
- "\x10\x8d\x6f\x3e\x97\xaa\xa4\x7e\x5a\x9f\xf0\x59\x20\x49\x67\x91"
- "\xcf\xc1\xd9\x67\x81\x4c\xf4\xe4\x33\x9d\xc6\xf9\x4c\x55\x41\xf1"
- "\x59\x50\xf8\x3c\xff\xa7\xbb\x7e\xa2\x9b\xcf\xa5\xdc\x3e\x0b\x4a"
- "\x2d\x0d\x2d\x05\xfb\x5c\x2a\xda\xe7\x9b\x73\x7b\xe6\x73\xa9\xdb"
- "\x3e\x0b\xc2\x35\x6e\x3e\x2b\x87\xfa\xe6\x73\xbf\x45\x22\x9f\xcf"
- "\x4f\xfb\x2c\xf4\x53\x74\xcf\x67\xc1\xd2\x0d\x9f\xd7\x48\x7d\xe0"
- "\xbe\xe1\x73\xbf\x71\x67\x8f\xcf\xa5\xc1\xd9\x67\xa1\x5f\xb8\x07"
- "\x9f\x05\x21\x8a\xf1\x39\x57\xd1\x18\x1c\x9f\x95\x3e\xf7\x7f\xeb"
- "\xae\x0f\x2e\xe3\xb3\x68\x9f\x07\x58\x81\xcf\x60\x9f\x4b\x45\xfb"
- "\xfc\xf0\x9d\x7e\xf0\xd9\x6d\x9f\x05\xa5\xd3\xcd\xe7\x01\x5f\xfb"
- "\xe6\xf3\x80\xdb\x38\x9f\xb7\x9f\xa7\xf6\xb9\xff\x67\xdd\xf3\xb9"
- "\x7f\xa5\x6f\x3e\x6f\x57\x49\xe3\x0b\x7d\xc3\xe7\x01\xaa\xb3\xc8"
- "\xe7\x20\xed\x73\xff\x26\x4f\x3e\x2b\x6d\x9c\xcf\xca\xb2\xe0\xf8"
- "\x3c\xc0\xe7\xf9\x77\x01\x8d\x6f\x08\x83\xac\x38\xbe\xd1\x86\xe3"
- "\x1b\xee\xb5\x7f\x49\x61\x0d\x9c\xcf\xed\xc0\xe7\x2d\x72\x3e\xff"
- "\xdb\x6b\x7c\x43\x18\x58\xe7\xea\xe0\xf3\xa0\x4e\x7c\x76\x01\x9f"
- "\xdb\x19\x9f\x55\xa7\xa5\xf1\x0d\x73\xcb\x56\xe0\xc9\x51\x62\x8e"
- "\x07\x2e\xe7\x8b\x5c\xfe\x37\x70\x19\x64\xe8\x02\x19\xd7\x1e\x6c"
- "\x24\x71\x56\x2e\xcb\x36\x90\xb1\x4b\xce\xe3\xb6\x66\x01\xf9\x8b"
- "\xbc\x95\x38\x5c\xa7\x07\xee\xa6\x7c\x46\xea\x96\xc0\x67\x19\x7c"
- "\x32\xe1\x43\x3e\x23\xb5\xcd\xc0\xdd\xf9\x72\xee\x36\x88\xdc\x55"
- "\x19\xba\xe7\xae\x6a\xe1\x59\x1b\xcb\x10\x54\x7c\xfc\xeb\xdf\x09"
- "\x9a\xb8\xa9\x87\xa8\x39\xbd\x51\xe4\xe7\x51\x12\xe7\x20\x61\xf4"
- "\x61\xdd\x30\x75\x02\xd1\x2c\x77\x12\xc1\x30\x87\x68\x0c\x5f\x42"
- "\xbb\x25\xfd\x3d\x4c\xd4\x9f\xda\xdf\x23\xb5\x27\x1a\x49\xed\xa9"
- "\x4f\x48\xad\x0b\x3e\x47\xe1\x03\x75\x8d\x9b\x2b\x6f\xb7\x55\x6c"
- "\xf7\xa0\x67\xa1\xac\x28\xdf\xed\x1e\x94\xc8\xda\x9d\x08\xed\x6e"
- "\x73\xb7\xdb\x0c\x7a\x00\xf8\x0c\x77\x89\xe3\x21\x71\x56\x32\x68"
- "\xb1\x83\xd2\x36\x91\xff\x88\xcf\xa7\xfb\xed\x24\x2e\x19\x30\x7b"
- "\x0c\xf8\xdf\x54\x46\xb2\x32\x80\xff\x6d\x76\xe4\x9d\xd5\x9c\x7d"
- "\x1a\xf8\xaf\xda\x4a\x41\x7e\xed\xc8\xff\x7f\x23\xff\x07\x56\xbb"
- "\x18\xff\x07\xa6\x07\xc7\xff\x41\xfe\xf0\xbf\xe7\xf1\x10\x41\x8d"
- "\xfc\x6f\x68\xc3\xf1\x10\xf7\x1a\xd0\x9e\xf8\x2f\xb3\xe7\x83\x65"
- "\xfc\x57\x77\xc3\xff\x21\xa7\xa5\xf1\x90\x73\xcf\xff\x21\x3d\xf0"
- "\x7f\x48\x37\xfc\xef\xe3\xb1\x0f\x61\xc8\x59\xe4\xbf\xba\x07\xfe"
- "\xab\xfd\xe1\xbf\x3d\x38\xfe\x0f\xf1\xe2\xff\x60\x91\xff\x83\x83"
- "\xe4\xbf\xda\x0f\xfe\xfb\x31\x7e\x22\x84\x59\x71\xfc\xa4\x0d\xc7"
- "\x4f\xdc\x6b\x81\x7b\xe0\xbf\x6c\xfc\x44\x08\x91\xf1\x3f\xac\x1b"
- "\xfe\x87\x4a\xfc\x3f\x0f\xec\x7f\x68\x0f\xfc\x0f\xed\x8e\xff\x7d"
- "\x3b\x56\x22\x84\x9e\x45\xfe\x87\xf5\xc0\xff\x30\x3f\xf8\x6f\x0c"
- "\xd2\xfe\x87\x7a\xf1\x3f\x44\xe4\x7f\x48\x90\xfc\x0f\xf3\x87\xff"
- "\x7e\x8c\xb7\x0c\x43\xfe\x83\xfd\x37\xda\x64\x6b\xc2\x7b\xe2\xbf"
- "\xcc\xfe\x6b\x64\xfc\x1f\xd6\x0d\xff\x87\x9e\x96\xc6\x5b\xce\x3d"
- "\xff\x87\xf6\xc0\xff\xa1\xdd\xf0\xbf\xaf\xc7\x56\x86\x9e\x45\xfe"
- "\x0f\xeb\x81\xff\xc3\xfc\xe1\x7f\x90\xf6\x7f\xa8\x17\xff\x35\x22"
- "\xff\x35\x41\xf2\x7f\x98\x1f\xfc\xf7\x67\x7c\xe6\x12\xec\xcf\x82"
- "\xfd\x2f\x4d\x93\xbd\x1b\xd0\x03\xff\xe5\xe3\x33\xbf\x92\xf1\xff"
- "\x92\x6e\xf8\x1f\x2e\xf1\xff\x3c\xb0\xff\xe1\x3d\xf0\x3f\xbc\x3b"
- "\xfe\xf7\xf1\x58\x4c\xf8\x59\xe4\xff\x25\x3d\xf0\xff\x12\x3f\xf8"
- "\x5f\x1a\xa4\xfd\x0f\xf7\xe2\xff\xaf\x44\xfe\xff\x2a\x48\xfe\x5f"
- "\xe2\x0f\xff\xfd\x18\xcf\x89\x60\xe3\x39\x6d\x38\x9e\xe3\x7e\x47"
- "\xa4\x27\xfe\xcb\xec\xff\xa5\x32\xfe\x47\x74\xc3\xff\x5f\x9f\x96"
- "\xc6\x73\xce\x3d\xff\x7f\xdd\x03\xff\x7f\xdd\x0d\xff\xfb\x7a\xec"
- "\xe6\xd7\x67\x91\xff\x11\x3d\xf0\x3f\xc2\x1f\xfe\x07\x69\xff\x7f"
- "\xed\xc5\xff\x4b\x45\xfe\x5f\x1a\x24\xff\x23\xfa\x68\xfc\x67\xf8"
- "\x46\x1c\xff\x71\xa9\xb7\xa5\xb5\x17\xea\x2b\x5d\x79\xe5\xc9\x61"
- "\x0a\x2d\x71\xa8\x77\x44\x9b\xd3\x6c\x64\xca\xcf\x80\x49\xf2\xcf"
- "\x64\xe6\xcf\x1a\x3c\x2f\x70\x16\x85\xfe\xbf\xc7\x3b\xa2\xf0\x71"
- "\xe4\x8d\xda\xba\x4e\x4f\x94\xce\xd0\xb2\x61\x98\x66\x3e\x62\x27"
- "\xd8\xe6\x15\x28\x83\xa3\x6e\x19\xe0\x18\x1c\xfd\x51\xa7\x29\xce"
- "\x81\x3c\x6d\x16\xd2\x04\x7c\xa9\x6d\xb2\x80\xec\x97\x31\x6e\x21"
- "\x16\x50\x9f\x71\x25\xc7\x89\xd2\xf1\x4d\xc4\x70\xc0\x38\x3c\x64"
- "\x29\x51\x44\x36\x51\x17\x62\x89\x18\x21\xae\xda\x65\x94\x42\xbe"
- "\xe7\xeb\x81\xdf\x8e\x6f\x74\xc3\x8b\x21\x5f\xdf\x8f\xcb\x0c\x67"
- "\xf3\x1f\xf0\x37\xba\xf6\x20\xc8\x32\xf7\xb2\x20\x71\x1a\xee\xc7"
- "\xfb\x2f\xfe\x8c\x53\x44\xc6\xe0\x38\x05\xe0\x64\xf3\x13\x27\xbb"
- "\xc7\x3b\xad\x7d\x8e\xd3\xe5\x16\xff\x70\x8a\xbc\xc5\x13\xa7\xbe"
- "\x1e\x3f\x88\xe4\xfb\xc1\x08\x97\x37\x72\x9c\x2e\xd7\x06\x87\x53"
- "\x64\x50\xeb\x7f\x3b\xf7\xa7\x47\x34\x63\x7f\xda\x05\xfd\x69\xff"
- "\x70\x32\xa6\x7b\xbc\x83\xdb\xe7\x38\x8d\x58\xe3\x1f\x4e\x23\xbe"
- "\xf6\xc2\xa9\x8f\xfb\xb9\x23\xf8\x79\xd0\xc2\x88\x6c\x8e\x53\x64"
- "\x4d\x70\x38\x8d\xf0\xe3\xfd\x0f\x7f\xfa\x7d\x57\x14\x60\xbf\x0f"
- "\x70\xf2\x53\x9f\x8c\x76\x8f\x77\x86\xfb\x1c\xa7\x2b\xa2\xfd\xc3"
- "\xe9\x8a\xb5\x9e\x38\xf5\x75\x7f\xec\x8a\x69\x1c\xa7\x2b\x74\x1c"
- "\xa7\x91\xc9\xc1\xe1\x74\x45\x61\xdf\xf4\x4f\xae\x1c\x87\xfd\x13"
- "\x17\xf4\x4f\xfc\xc3\xa9\x34\xdd\xe3\x1d\xe7\x3e\xc7\x49\xdb\xe8"
- "\x1f\x4e\x57\x5e\xef\x85\x53\x1f\xf7\x1b\xb4\x0e\x8e\x93\xb6\x81"
- "\xe3\xa4\x8d\x08\x0e\xa7\x2b\x7d\x9e\xff\x19\x58\x1c\x3d\xca\x82"
- "\x71\x34\xe0\xe4\xa7\x3e\x95\xda\x3d\xde\xc9\xee\x73\x9c\x46\x65"
- "\xfb\x87\xd3\xa8\x2f\x3c\x71\xea\xeb\xf8\x76\x94\x91\xe3\x34\x2a"
- "\x9d\xe3\x74\xa5\x29\x38\x9c\x46\xf9\xb3\xfe\xb3\xcb\xf7\xb0\x3a"
- "\xc7\x7c\x51\x79\xe7\x57\xcc\x17\x35\xc6\x3f\xac\xa2\x9e\x3d\xb3"
- "\x31\x5f\x54\x3c\xc7\x2a\x2a\x8a\x63\xf5\x9b\x85\xc1\x61\x15\xb5"
- "\x31\xd8\xf7\xb7\x3a\xc7\x7d\xbf\x1d\x77\x7e\xc5\x7d\x57\xf9\x69"
- "\xff\x7e\x7b\xfd\x99\x8d\xfb\xae\x12\xed\xdf\x55\xa2\xfd\xbb\x2a"
- "\x48\xfb\xf7\x5b\x3f\xec\x5f\xd7\xef\x7d\x75\x8e\xfd\x7e\xd7\x74"
- "\x7e\xc5\x7e\xbf\x5b\xe5\x1f\x56\xbf\xfb\xea\xcc\xc6\x7e\xbf\x2b"
- "\xe3\x58\xfd\x2e\x83\x63\xf5\xdb\xea\xe0\xb0\xfa\x9d\xcf\xf3\x5f"
- "\x7a\x7a\x5f\xac\x73\xfc\x37\xfa\x3c\x8b\xff\x46\xfb\x19\xff\x8d"
- "\x3e\xc3\xf1\xdf\x68\x31\xfe\x1b\x2d\xc6\x7f\xba\x20\xe3\xbf\xd1"
- "\x41\xc5\x7f\x9e\x58\x49\x31\xe0\xef\xc7\x9f\x5f\x31\xe0\xd5\x07"
- "\xfd\xc3\xea\xf7\x37\x9d\xd9\x18\xf0\xf7\x84\x63\x75\xf5\x7e\x8e"
- "\xd5\xd5\x91\xc1\x61\xf5\x7b\x9f\xe7\x1f\xf6\xf4\x7e\x5a\xe7\x38"
- "\x70\x4c\xf3\xf9\x15\x07\x8e\xf1\xb3\xff\x3b\xe6\xeb\x33\x1b\x07"
- "\x8e\x11\xfb\xbf\x63\xc4\xfe\xef\xef\x83\xec\xff\x8e\xf1\xa3\xff"
- "\xeb\xcf\xb8\xdf\x75\xb1\x18\x03\x3a\xf3\xb6\xa5\x85\x81\xfc\xc3"
- "\xd2\x89\xd0\x16\x09\x78\xa9\x01\xaf\x95\x5a\xd2\x9e\x07\x78\x59"
- "\x1d\x64\xca\x93\x87\x68\x7d\x8b\x93\xb4\x01\x56\xa7\x21\x0e\x34"
- "\x5b\x9b\xf1\x1d\xbd\x3f\x1e\x16\xae\xfd\xfa\xe1\x27\x35\x04\xf1"
- "\x42\xf9\x3b\xd5\xa3\xb6\x52\xc0\x8b\xe1\xa7\xae\x18\xe7\xc8\xdb"
- "\x61\x9d\x7c\xec\x10\x5d\x6c\xa1\xb4\x2e\xc9\x0e\x75\x4a\xa9\xac"
- "\x4b\x6a\x24\x71\x4d\x64\x90\xf6\x41\xc4\xe5\xda\xe7\x31\xdd\x6c"
- "\x6d\x24\xb8\xef\x27\x1b\x03\x3f\xa4\x0b\x77\xfc\xaf\x4e\x8d\xfb"
- "\x37\xe1\x7b\x85\xd2\x1e\x4d\xe6\xa3\x1b\x19\xfe\xde\x63\xaa\x0c"
- "\xff\xff\xd5\xe1\xf8\x7c\x74\xdf\xc7\x82\xd7\xb2\xf1\x3f\xd7\xa1"
- "\x88\xe1\x52\x1d\x17\x2f\xa4\x14\xea\x38\xac\xde\x66\x25\x58\xcf"
- "\x7a\x9b\x89\x64\xa5\x11\x4d\x7d\x5b\x33\xc9\xb4\x51\x6b\x7d\xf6"
- "\xf7\x24\xee\x67\x9c\x17\x40\x3e\x5d\xfb\x05\xc7\xfb\x5a\xa5\xeb"
- "\x90\x6e\x38\xfc\x6d\xa8\x6f\x20\x24\x6c\x25\xc8\xda\x41\x04\xf6"
- "\xbe\xa6\x40\x54\x20\xaf\x24\x73\xf6\x61\x02\xb2\x4b\x36\x3b\xbe"
- "\x44\x79\x26\xc1\xf5\xf1\x1d\xf3\x0d\xa1\x65\x29\x98\x86\xb2\xc5"
- "\x75\xa6\xe6\x64\x2b\xcb\x23\x5d\xe7\xd8\x65\x13\x73\x7a\x1b\xa9"
- "\x87\x88\xc8\x22\x5c\x53\xb9\x2f\xa1\x11\xf8\x75\x4d\x90\x76\xfb"
- "\xba\x69\x7d\x33\x5e\x79\x7d\x19\xc6\xad\xc0\x2f\x1b\xaf\x63\xff"
- "\x13\x7e\xf0\xcb\xee\xe6\xd7\xf5\x13\x7a\xc7\xaf\xe8\x9f\xfa\x96"
- "\x5f\x7d\x1d\xbf\x46\xef\xea\x1d\xbf\xae\xbf\x85\xf3\x2b\x3a\x91"
- "\xf3\xeb\xfa\x68\x37\xbf\xfa\x9f\x38\x73\xfc\x8a\xd6\x70\x7e\x5d"
- "\xd7\x10\x1c\xbf\xae\xdf\xd9\x37\xe3\xac\x63\x55\x18\x6b\x3b\xf3"
- "\x8c\xa2\xfd\x1a\x72\xb8\x67\x7e\x19\x65\xf6\xeb\xc6\x97\x7b\xc7"
- "\xaf\x1b\xa7\xf6\x31\xbf\xfa\x38\xe6\xbe\x31\xb2\x77\xfc\xba\x71"
- "\x13\xe7\xd7\x0d\xd5\x9c\x5f\x37\x16\xb8\xf9\x35\xe4\xf0\x99\xe3"
- "\xd7\x0d\xc9\x9c\x5f\x37\x44\x07\xc7\xaf\xb1\x41\xed\x7f\xd5\xb9"
- "\x7f\x70\x73\x12\xf6\x0f\x80\x5f\xa2\xfd\x1a\xfa\xb9\x1f\xfc\x92"
- "\xd9\xaf\x9b\x15\xbd\xe3\xd7\x4d\x6f\xf6\x2d\xbf\xfa\xba\x9f\x70"
- "\x53\x46\xef\xf8\x75\xd3\x69\xce\xaf\x9b\xa2\x38\xbf\x6e\xb2\xba"
- "\xf9\x35\xf4\xf3\x33\xc7\xaf\xb1\x0d\x9c\x5f\x63\x0b\x82\xe3\xd7"
- "\xcd\xbe\xf7\x7f\x0e\x68\x5c\x7b\x5c\x0d\xf6\x69\x9c\x79\xa5\xa2"
- "\xfd\xba\x39\xb7\x67\x7e\x95\xca\xec\xd7\xb8\xd9\xbd\xe3\xd7\xb8"
- "\xa1\x7d\xcc\xaf\x3e\xee\xdb\xfc\xe1\x60\xef\xf8\x35\x6e\x3a\xe7"
- "\xd7\x1f\x56\x71\x7e\x8d\x8b\x77\xf3\xeb\xe6\xdc\x33\xc7\xaf\x3f"
- "\x44\x73\x7e\xdd\x6c\x0d\x8e\x5f\xe3\xfc\xd9\xff\xd5\x8f\xf1\xf8"
- "\x3f\xea\xb0\x1f\x06\xfc\x12\xed\xd7\xc3\x77\xfa\xc1\x2f\x99\xfd"
- "\xba\x75\x4f\xef\xf8\x75\xeb\x93\x7d\xcb\xaf\xbe\xee\x8f\xdd\x3a"
- "\xbe\x77\xfc\xba\xf5\x5d\xce\xaf\x5b\x9a\x38\xbf\x6e\xad\x74\xf3"
- "\xeb\xe1\x3b\xcf\x1c\xbf\x6e\x29\xe0\xfc\xba\x25\x3e\x38\x7e\xfd"
- "\xd1\x9f\xfd\x4f\xfd\x9c\x47\xb8\x2d\xaf\x77\x7d\xc8\xdb\xae\xea"
- "\x1d\xc7\xc6\x1f\x38\xbf\xfb\x90\xe3\xb7\xf6\x8e\x63\xb7\x8d\xe0"
- "\x1c\x1b\x1f\xcb\x39\x76\x5b\xf8\xd9\xe9\x43\xfe\xd1\xc6\x39\xf6"
- "\xc7\x9d\xc1\x71\xec\xb6\x3e\x9c\xff\xb8\xc3\xda\xbb\x7e\xe4\x1d"
- "\x6b\x7b\xc7\xb1\x3b\x6e\x39\xbf\xfb\x91\x77\x28\x7b\xc7\xb1\x3b"
- "\x56\x72\x8e\xdd\x5e\xce\x39\x76\x47\xfa\xd9\xe9\x47\xde\x9e\xc0"
- "\x39\x76\x7b\x90\xf3\x36\x77\x04\xf5\xfe\x4b\xd7\xf3\x36\x77\x4e"
- "\xeb\x5d\x5f\x72\xc2\xb1\xde\x71\x6c\x42\xd1\xf9\xdd\x97\x9c\x90"
- "\xd4\x3b\x8e\x4d\xf8\x96\x73\x6c\x82\x86\x73\x6c\xc2\xc1\xb3\xd3"
- "\x97\x8c\xd9\xc5\x39\x16\x93\x11\x1c\xc7\xee\x9c\xd5\x77\xf3\x4d"
- "\x13\xab\x7a\xd7\x9f\x9c\x38\xb5\x77\x1c\x9b\xa8\x38\xbf\xfb\x93"
- "\x77\xd5\xf6\x8e\x63\x13\xef\xe3\x1c\xbb\x2b\x8d\x73\x6c\x62\xcc"
- "\xd9\xe9\x4f\xde\xa5\xe5\x1c\xbb\xd3\x12\x1c\xc7\x26\xfa\xb1\xff"
- "\xbf\xbf\xf3\x64\xf7\x46\xf6\xae\x4f\x79\xcf\x3b\xbd\xe3\xd8\x3d"
- "\x73\xcf\xef\x3e\xe5\x3d\xd1\xbd\xe3\xd8\x3d\x15\x9c\x63\x77\x37"
- "\x72\x8e\xdd\x63\x3c\x3b\x7d\xca\xbb\x57\x71\x8e\xdd\x3d\x31\x38"
- "\x8e\xdd\xab\xeb\xbb\xf9\xbd\xfb\xb2\x7b\xd7\xaf\xbc\xef\xb2\xde"
- "\x71\x2c\xf6\x93\xf3\xbb\x5f\x19\xbb\xbe\x77\x1c\xbb\x6f\x28\xe7"
- "\x58\xec\x78\xce\xb1\xfb\x54\x67\xa7\x5f\x79\x6f\x33\xe7\xd8\xbd"
- "\x41\xee\x47\x71\x5f\xa7\xfd\xaf\xe6\xeb\x97\xcc\x5e\x38\x3f\x51"
- "\x3b\x5f\x9f\x96\xf2\xa4\x36\x75\xfe\xb2\xb9\xb7\x5d\xf5\xd4\x18"
- "\x6d\x4a\xba\x36\x65\xbe\xfe\x71\x31\x21\x71\x30\x79\x70\xee\xc2"
- "\xd9\xe9\x98\x02\xb9\x1f\xd7\x2f\x9a\xab\x4f\xd3\xa6\xcc\x7d\xf2"
- "\xa9\xf9\x29\x73\xf1\x7b\xaa\x76\xde\xe2\x14\x48\x78\x6c\xee\xfc"
- "\x25\x73\xb5\x73\x9e\x9a\x37\x6f\x6e\x4a\xea\x60\x32\xf9\xa9\x85"
- "\x69\xf3\x93\x17\xce\xd5\x4e\x9c\x3c\xe1\x9a\x69\x77\xff\x69\xda"
- "\x1d\x77\xe0\xe1\x64\xb2\xb3\xc9\x22\x69\x5e\x45\x34\x70\x4e\x79"
- "\x44\xf8\xd3\x65\xf5\x11\x84\x9d\x67\xbb\xee\x04\xd1\xac\x4d\x21"
- "\xca\x35\x27\x88\xca\x70\x82\xa8\xb5\x0b\x48\x0c\x5d\xfb\x7d\x03"
- "\xa4\x87\x53\xc3\x95\x16\x9a\x9f\x52\x45\x0d\xa3\xb4\xd6\x90\xc1"
- "\x98\xa6\xa1\x86\xc1\x2a\xbc\x06\xb2\x55\x42\xfa\x9a\xc3\xc2\x83"
- "\x8d\xd6\x90\x21\x95\x59\xdf\x13\x81\x0e\xbe\x7f\xd7\xeb\x2e\xab"
- "\xb0\x07\x47\x04\xa1\xed\x44\x78\x60\x3f\x7c\x4c\x44\x98\x94\x0c"
- "\x9f\x6c\xf8\xe4\xc1\x67\x27\x7c\x76\xc1\xa7\x01\x3e\x07\xe1\xd3"
- "\x0c\x1f\x2b\x7c\xec\x44\x98\x4c\xe0\xa3\x82\xcf\x2a\xf8\x18\xe1"
- "\x03\x79\x27\xd7\xf2\x72\x26\x37\x12\x61\x8a\x12\x3e\x93\xe0\x03"
- "\x65\xc5\x65\xc0\xa7\x8c\x08\xf1\xb1\xf0\xb7\x86\x9d\x46\x2a\xc4"
- "\xb5\xc0\x6f\x0d\x7c\xc6\x42\xfe\x83\xfc\x5a\x3c\xa4\x4d\xd5\x11"
- "\xa8\x67\xcf\x9f\xa9\x90\x7f\x6a\x3c\x7c\xd2\xe0\x03\xcf\x7c\x10"
- "\xd0\x7c\x70\x4d\x37\xf7\x34\xf4\x50\xa6\x35\x6c\xe5\x15\x16\x76"
- "\x06\x9e\x30\xe9\x7a\x67\x0e\xe9\xe7\x34\x0c\xa9\x4c\xbe\x9a\x28"
- "\x8e\x0a\x0f\x38\xcd\xab\xd0\xce\x5c\x69\x61\x67\x3a\xc2\x6f\x94"
- "\x59\x6b\xee\x03\x0e\x0b\x79\x31\x16\xcf\x34\x0b\x8c\x6f\x0f\x38"
- "\xf8\xfd\x93\xc6\x5b\x14\xa3\x1b\xd9\x19\x70\xb9\x87\xc6\xd0\xac"
- "\x84\x2d\xec\xec\x37\x94\x21\xea\xc1\x9a\xff\xac\xa2\xaa\x2f\x94"
- "\xa8\xf3\xa6\x65\x58\xaf\x07\x0e\xd0\x1c\x12\x0a\xf7\xef\xa7\x50"
- "\x37\x6b\x48\x4a\x15\xd4\x53\x89\xbf\x9d\x86\xc1\x0d\xa7\x43\xca"
- "\x35\xf8\xdd\x5e\xa4\x8f\xa1\x79\xe5\xe3\xb0\x9f\x6d\xca\x7c\x81"
- "\x1c\x86\xfb\x4e\x87\x54\x34\x6a\xef\x0f\xa3\x87\xf1\xde\x1c\x22"
- "\x58\x84\x49\x49\x5c\x57\x1f\xd8\x7f\x3a\x24\xc5\xe4\xdc\xf8\x3a"
- "\x9e\xff\xac\x74\x1a\x52\xaa\x78\xf9\x83\xc1\x4e\xee\xb0\x40\xbe"
- "\x6a\x96\x5e\xa8\x4f\x90\xbe\xc3\x5f\x93\x33\xbf\x3c\x1d\xff\x86"
- "\xac\x24\x36\xf6\x3b\x27\x86\xf0\xbf\x1a\xa2\xbd\x9f\x90\x16\x61"
- "\xf2\xfc\xeb\x6a\x88\xc2\x74\x3f\xd6\x7b\xf2\xd8\xac\x1a\xea\xd2"
- "\x66\xf6\x83\xe7\x4f\xbe\xa9\xe3\xb9\x97\x55\xd8\xf1\x8c\x54\x9a"
- "\x7b\x5f\x6d\xc9\x0b\x84\xe0\xbd\x58\xb7\x4d\xc3\x88\xb2\xe8\x05"
- "\xa2\xc2\x36\xb6\xe6\x4e\x9e\x25\x9d\x43\x87\xf7\x08\x90\xff\xbe"
- "\xfb\xb2\xa8\xac\xec\x6b\x9c\xac\x3d\x0f\x34\x70\x99\x4e\x2e\xb0"
- "\x28\x7e\xbb\x1f\xf3\x6b\x47\x31\x59\x1e\x10\xaf\xef\x47\x3c\xb1"
- "\x7c\x6a\xa8\x88\xc6\xdf\x78\xce\x5d\x18\xb0\x51\x9b\x19\x55\xc5"
- "\x65\x54\x3e\x0e\xcb\xc1\xfc\x34\x7f\x07\x7c\x9f\x94\x46\x0d\x4c"
- "\xc6\x3a\xad\x9e\xc4\x40\xdd\x9d\xce\xb5\x87\x9a\xa0\x0c\xd0\xbb"
- "\x43\xcd\x90\x3f\x9e\xc9\xdb\xb0\xa3\xc1\x22\x4c\xb6\xc2\xb5\xe6"
- "\x8e\xb3\x2f\xb9\x9c\x15\x90\xcf\xde\x9a\x3b\x25\xca\xa2\xb8\xbd"
- "\x89\xe1\xbc\x84\xee\xc7\x33\x36\x4f\x2e\xa1\x8e\x38\xc7\x21\x17"
- "\xd8\x2a\x02\xd7\x27\x5a\xc8\x44\x95\xd4\x46\x8e\x7d\x47\x39\x07"
- "\xf0\xb7\x75\x10\x2b\x67\x61\x57\xe5\x58\x84\x29\x63\x1f\x75\x68"
- "\x15\x6d\xa7\x68\xc3\xba\x3f\xa3\x1c\x09\x6d\x5b\x42\x6b\x57\xc4"
- "\x52\x7b\xfe\xe7\x84\xd4\x25\x1d\x24\xa0\xf3\x91\xa1\x0a\x6a\x8d"
- "\x7b\x9a\x84\x85\x26\x87\xd1\x4f\x6a\x0e\x92\xe5\xb1\xb4\x19\xcf"
- "\xf0\xad\xb7\x35\x91\x8c\x2f\x88\x3a\xab\x8e\x84\x67\xc4\x52\x6b"
- "\xed\xac\x83\x84\xa7\xd7\x91\xac\xaf\x89\x72\x79\x35\xb5\x4f\x01"
- "\xfb\xbf\xef\x20\xa6\x37\x11\x3c\xa3\x32\xab\x99\x3a\x32\x1f\x21"
- "\x6a\xfc\x5e\x57\x8d\xe9\xdf\x92\xac\x63\x44\x19\x97\x6e\x0d\x2b"
- "\x86\x67\xe2\xfd\x25\x50\x17\xd7\x29\xba\x6b\xdd\x29\x42\x96\x4f"
- "\x27\x11\x19\xb3\x89\x26\xce\x49\xa8\xd9\xf1\x0e\x89\x73\x52\xf0"
- "\x2f\x7b\xc9\x8a\xf9\x44\x15\xe7\xc0\xf7\xd8\x0e\x10\x3c\xa7\xbb"
- "\x04\xf2\x42\xdb\x4c\xd8\xb6\xe5\x5f\x91\x08\x3c\x9f\x9c\xdf\xb3"
- "\x5b\xbc\xe7\x2b\x82\x32\x3b\x1d\x32\x4a\x63\x37\x8c\x2a\x80\xb6"
- "\x8f\x43\x19\xc0\x73\x1a\x5c\x78\x1f\xdc\xbf\x2e\x85\xc9\x40\xf1"
- "\xa8\x83\xa8\x9d\x86\x1d\x55\x8f\xa6\x9b\x58\xb9\x16\x21\x2e\xad"
- "\x24\x85\xd5\xc9\x23\x6f\x9c\x83\x9e\xb4\x86\xec\x00\xde\xc7\x15"
- "\xc6\xa5\xdf\x41\xf1\x5e\xc0\xd2\xd6\x9a\x1b\x77\x50\x92\xb7\x84"
- "\x0b\xe4\x69\x00\x2c\x6c\xfd\x92\x89\x12\xae\x3b\x2c\x8a\x09\x26"
- "\x37\xd7\x26\x25\x01\xe6\x03\xa4\xbc\x3c\x4f\xbc\xd6\xa2\x88\x51"
- "\xc9\xf8\x88\xfc\xea\xc8\x03\xd7\x63\xa0\x0c\x0d\x7f\x46\x3c\xc1"
- "\x3c\xa2\xed\x97\xf2\xf6\xa3\x6b\x1a\x1b\x9d\x21\xe5\x31\x54\xa0"
- "\x76\xe0\x63\x23\x3d\x19\xa1\x9e\xe2\xa0\x76\x97\x61\x3b\xda\x79"
- "\x35\x9e\xeb\xca\xf3\xc7\x7f\x06\xd7\x2d\xda\x25\xec\x7b\x13\x3e"
- "\x87\xe6\xa5\x58\x3a\xae\xe5\x90\xfe\xb4\x48\x1f\x0d\xbe\x43\x13"
- "\x57\x43\xed\x4e\x43\x6a\x74\x7e\x0a\xfa\x8e\xf2\x68\xd4\x6b\x57"
- "\xc8\x8e\x66\xfb\xa6\x0a\x0b\xda\x27\xd4\x11\x9a\xb7\xbd\x81\xdf"
- "\x3b\x69\x3e\xea\x0d\xb7\x35\xf1\x65\x4e\x28\x03\xea\x74\x10\xae"
- "\xf5\x3f\x2c\x4c\x8d\xc4\xf7\x49\xe9\x9a\x2f\xc2\xd9\xb9\x97\xc2"
- "\xd4\x2b\x39\x7f\x1b\x1b\x3d\x7e\x0b\x28\x3b\xd0\x27\xb0\x59\x68"
- "\x1f\x20\x7d\x82\x5b\x87\x99\xdc\x04\x6e\x8b\xb6\x5b\xb8\x1d\xe9"
- "\xe7\x82\x7c\x8a\xc3\xa2\x3e\x9e\x1e\x74\xa8\xa5\x35\x77\x2a\xf0"
- "\xff\xca\x74\x0f\x3d\xc9\x3d\x90\x8e\x67\x6c\x42\x5d\xfa\x41\x99"
- "\x9b\xe0\xef\x40\xf8\x5b\xf4\x71\x0d\xe2\xcd\xca\x1d\x82\xdf\x37"
- "\x5d\x4a\xad\x13\xef\x26\x78\x9e\x26\xe8\xdb\xd4\x9d\x16\xf2\xa4"
- "\x1a\xcb\x59\x8b\xe7\x8c\x42\x1a\xe6\x81\xf4\x5a\x48\x77\xf0\xf2"
- "\x27\xa5\xd9\xa0\xae\x5e\xe5\xff\xc4\xcb\xe7\xe5\x62\x79\x52\xd9"
- "\x45\x1b\x68\x0b\x2f\xfb\x41\x8d\x54\xb6\x01\xd2\xa4\xf2\x27\x2e"
- "\x92\x9e\xf1\x60\x34\x5c\x5f\x25\x6f\xc3\xc6\x0d\xd4\x86\x65\xc0"
- "\xb5\x49\x16\xf2\xac\x15\xaf\xad\x81\x34\xbc\x57\xc6\xab\x7e\x1f"
- "\xc7\x42\x19\xd5\xac\x8c\x34\x0b\x59\x95\xee\x65\xe3\x42\x24\x1b"
- "\x27\x96\xb5\x51\x2a\xcb\x5d\x8e\xc4\xa7\xa6\x64\x11\x57\x2c\x57"
- "\x8d\xe5\x42\xfe\x1a\x0b\x49\xad\x95\xb7\x1d\x6c\x5a\x03\xcd\x2f"
- "\x8f\x45\x3b\x26\xf2\xd1\x89\x36\x59\xaa\x37\x9e\x33\x0a\xb6\xdb"
- "\x86\xfa\xc2\xec\xb7\x61\x87\xa9\x35\xf7\x4f\x1a\x2f\x7b\xad\xc4"
- "\x7c\xce\xdc\xfb\x47\x17\xe1\x39\xab\x97\xd2\x66\xc8\x33\xd6\xe3"
- "\x6c\x51\x81\xdc\x0e\x69\xb1\xd2\x19\xa7\xf9\x90\xc7\x22\xdc\xef"
- "\x73\x0f\xc7\xcc\x2b\x89\x60\x2e\xb4\x60\xfc\x8c\xbc\x1a\x6f\x8e"
- "\xb4\x11\x73\xa1\x8b\xb8\x8a\xf5\xb3\x62\x32\xa9\x09\x62\xa6\xbd"
- "\x78\x36\x75\x60\x3e\xf9\x4f\x05\x8c\x4f\x6d\x10\x57\x66\xdc\x40"
- "\xd0\x0f\x1f\x17\xa6\xfd\x6c\xb6\x9e\x60\xba\x05\xdf\xd9\xfb\xd1"
- "\x2f\x42\x1c\x8a\xb1\x28\xc4\xff\x49\x05\x02\x8f\x47\x5d\x90\xb7"
- "\x18\xd3\x31\x56\x05\x3b\x59\x22\xbb\x46\x8b\xf5\x11\x5c\x76\xd3"
- "\x2a\x98\x3f\xc0\xfa\x3a\xee\x35\x61\x9d\x5d\x85\xfa\x08\x6c\x43"
- "\x56\x3a\x75\x99\x1d\xad\x26\xb4\xa5\xda\x25\x18\x47\x4f\x5b\x1b"
- "\x57\x44\xa8\xab\x48\x1f\x11\x58\x1b\xa6\xb1\xf5\x4f\xd0\x57\x38"
- "\x6e\x1d\xa1\x8f\xc0\xb3\x9e\xd7\x65\xf6\x57\xdd\x55\x48\x4d\x27"
- "\x47\xea\x67\xb5\xe6\x4e\x2b\x97\xce\xd2\x0d\xb0\xdc\x72\xa9\xed"
- "\xc5\x62\xdb\x21\x8d\x9d\xd9\x73\xdd\x46\x76\x96\x37\xfe\xf6\x79"
- "\xd6\x27\xcd\xdb\x11\x8b\xf7\x42\xdb\x63\x4a\x24\x39\x39\xac\x78"
- "\x8e\xf9\xd0\xa3\xc2\x43\x4f\xc7\x65\x98\x08\xdb\xb7\xdf\xb0\x23"
- "\x36\xb0\x7a\x3d\xc4\xd6\xbf\xd7\x43\x3f\x25\xce\xf1\x21\xe5\x76"
- "\xef\xa1\x97\xa7\x88\xe5\xe1\x35\x09\xab\x62\xb1\xff\x10\xc4\x33"
- "\x7c\x9e\x7f\x20\x6b\x97\xa6\x73\xbb\xfe\x3c\x35\xf8\x76\xfd\x39"
- "\xb2\x73\xbb\xfe\xfc\x74\xdf\xb6\xeb\xcf\xd9\x7e\xb4\x4b\xdb\xb9"
- "\x5d\x7f\x19\xdd\x8b\x76\xd9\x3a\xb7\xeb\x2f\x53\xfb\xb6\x5d\x7f"
- "\x49\xf0\xa3\x5d\xd1\x9d\xdb\x95\xa0\x08\xbe\x5d\x7f\xa9\xed\xdc"
- "\xae\x84\xd1\x7d\xdb\xae\x84\xe8\x80\xed\x61\x7e\x79\x01\xb7\x87"
- "\x09\x07\x02\xb7\x87\x09\x5b\x3b\xdb\xc3\xbf\xf6\x77\xdb\xc3\xe9"
- "\x3f\x05\x65\x0f\xf3\x53\xc4\x98\x62\xfa\xee\x4e\xf6\x30\x2f\xa5"
- "\xa1\x6b\x7b\x38\x7d\x13\xb3\x87\x86\x94\x86\xc0\xda\x30\x3d\xb1"
- "\xc3\x1e\x86\xa4\x34\x78\xd8\xc3\xd0\xf2\x82\xd6\xdc\xe9\xbb\x82"
- "\xb3\x87\xd3\x77\x75\xb6\x87\xd3\x23\x3d\xed\xe1\x74\x9f\x6b\x9d"
- "\x81\x87\x35\x5d\xd9\xc3\x38\xc7\x8f\x54\xe4\x46\x4d\x60\xf5\xf9"
- "\xab\xcf\xf7\xbf\xe1\x59\xf1\x3d\x3c\x2b\x3e\xc0\x67\x55\xf9\x7c"
- "\x96\xaa\xd1\x0e\x71\x86\x66\xc5\xcb\x44\x38\x02\x3d\xfe\xfa\xc8"
- "\x46\xe8\x07\xd8\xc9\xb5\xc9\xc0\x89\x1c\x32\xbe\xbe\xb0\x85\xd4"
- "\x47\x1e\x21\x74\x50\xa3\x9d\x6e\xd7\x37\xc4\xa4\x20\x37\x1f\x7e"
- "\xd2\x9c\x66\x0f\x90\x9b\x0f\x8f\x97\xb8\x59\xef\x00\x6e\x2e\x41"
- "\x3e\xce\x78\xd9\xdc\x72\x54\xe4\xe6\x0c\x43\x07\x3e\x39\x9c\x9f"
- "\x5d\x72\x13\x74\xc2\x93\x9b\x3b\x62\x38\x37\x67\x4c\xef\xcc\xcd"
- "\x1d\x31\x5d\x73\x73\xc6\x4d\x9c\x9b\x3b\x62\x02\x6b\xc3\x0c\xe2"
- "\xe6\xe6\x8e\x18\x0f\x6e\xfe\x56\xdf\xd0\x9a\x3b\x23\x21\x38\x6e"
- "\xce\x48\x90\xda\x5e\x24\xb6\x1d\xe4\x55\xe5\xc9\xcd\x19\x05\x3e"
- "\x31\x5c\xb3\x37\x06\xec\xa1\xfa\xa8\xf0\xc8\x2c\x27\xc4\xad\xae"
- "\xbc\xb0\x1a\xe8\x77\xb5\xe2\x99\xf1\x54\x18\x4b\xe8\x52\x9d\xba"
- "\x15\xfa\xbf\xad\xad\x49\x2a\x3a\xb8\x31\x87\xb6\x47\x10\xa8\x7b"
- "\x18\x6d\xd5\x85\x82\xcc\xa2\xe0\xef\xb0\xa2\x25\x24\x1c\x3e\x11"
- "\x45\xa2\x5c\xe1\x7b\x34\x5d\x1a\x31\x38\x7f\x09\x19\x13\x66\x23"
- "\x78\xfe\x4e\x42\xd8\x4a\x0d\x09\x73\x90\x70\xfc\x4e\x73\x3e\x56"
- "\x42\xff\x4c\x89\x63\x9f\xae\x10\x78\x5e\x7a\x18\xa5\xa9\x3a\x02"
- "\x7d\x35\x15\x60\x10\x51\x22\xd0\x4a\xe7\x52\x9d\x40\x43\xcb\x1f"
- "\xa0\xcb\x13\x58\x9d\x5c\x51\x8b\x35\x74\x3b\x7c\xb2\x92\xf0\xb9"
- "\x31\x78\x76\x31\xfd\xed\xe2\x70\xda\x1a\x31\xd8\x70\x8a\x8c\x29"
- "\x59\x42\xa2\x8a\x97\x10\x1d\x6d\xd7\x09\x20\x83\x84\x99\x4f\x6a"
- "\x10\xf7\x04\x2a\xc0\xb3\x96\xc0\xb3\x00\x4b\xa7\x01\x9e\xe5\x80"
- "\x67\xfd\x08\xcf\x3a\x0e\xcf\xca\x81\x67\xe5\xf0\x67\x05\x26\xf3"
- "\x47\xba\x3d\xff\x39\x6e\xc5\x48\xdc\x4b\xf7\xbb\xb0\xf4\x81\xb1"
- "\x38\x5e\x7d\x72\x79\x52\x80\x7c\x9f\xe9\x73\xff\xe7\x75\xaf\x93"
- "\x48\xaa\x1e\x64\x9f\xf2\xec\x21\x8a\xfd\xe8\x67\x5f\x27\x63\x50"
- "\xe7\xea\xed\xc7\x08\x0d\x19\x64\xdf\xab\x6b\x09\xf4\x59\x3e\xd7"
- "\x3f\xe4\xe6\x40\xbf\x59\x0d\xfd\x50\x75\x79\xc2\xba\x1c\x9a\xde"
- "\x1e\xa9\x8f\x6e\x8b\xd4\xc7\x3f\xea\xd0\x00\xaf\x68\xba\x36\x85"
- "\x68\x8f\x08\x89\x5f\x7d\xba\x1f\x7c\xc4\x5f\x89\xea\xb0\x30\x37"
- "\x3c\xeb\x0b\x1c\x6b\x7c\x54\xe7\x39\xd6\xf8\xe8\x24\x22\xcc\xda"
- "\x45\x84\xd9\xb5\x44\x98\x63\x25\x90\xcf\xf3\x93\xa8\xe6\x65\xcd"
- "\xda\x14\xf7\xca\x48\x92\xe9\xa0\xdf\xd1\xbc\x54\x5d\x3e\xf4\x7f"
- "\xe3\x46\x2b\x2c\xa6\x25\x38\x06\x37\xeb\x79\x90\xe9\x0f\xe0\x97"
- "\xc2\xe0\xfb\x23\x80\x1d\x49\x4e\x21\xbf\x3a\x2a\xcc\x9a\xe1\x80"
- "\xef\x61\xb6\x81\xb1\xce\xac\x04\xe2\x88\xa8\xb0\xb4\xe7\x95\x47"
- "\x3b\xa1\x2f\xeb\x52\x87\xd5\xe0\x38\x88\xb9\xc5\x49\x0a\x81\x77"
- "\x8f\x3a\x55\xa8\x0f\x09\xa6\x39\x9f\x92\x23\x69\x44\xc8\xfa\x99"
- "\x84\xd0\x93\x3a\xb5\xc4\xeb\xc9\x2d\x61\xf6\x15\x2d\xd4\x85\xfc"
- "\xc6\x71\x07\xb8\x16\x9a\xf9\x33\xf8\x5a\x6b\x33\x29\x84\x7e\xb3"
- "\x33\x35\x69\x98\xf5\x64\xd2\xaf\xb6\xb8\x48\x78\xa8\x8d\x68\x0a"
- "\x4f\x00\x07\x53\x81\x7f\x27\x80\xe7\x56\xce\x73\x7c\x57\xa8\x18"
- "\x39\xbe\xfa\xe0\xc2\x92\x13\x9c\xe3\x8c\x77\xc8\xf1\xc5\xc0\x3b"
- "\xbd\x9b\x77\x8e\x93\xc0\xf1\xdc\x99\xea\xc2\x1c\x8a\xe3\x22\x42"
- "\xc9\xd1\x81\x78\x4d\xd1\x7f\xb4\xa0\xfd\x34\xde\x4e\xdc\xfd\xb0"
- "\xb9\x97\xb4\x8d\xd0\xc7\x6b\x1f\xa4\x3f\x1e\x16\x66\xad\x81\x74"
- "\x95\xf6\xcf\xbf\xd3\x80\xbc\x2f\xe1\x63\x14\x73\xc3\xb1\x9f\x6f"
- "\x01\x59\xa0\x5c\xb4\x0f\x92\xdf\x1d\x16\x1e\x7d\x04\xe5\xb8\xb4"
- "\x8c\xf4\x4b\xbe\x9d\x36\x81\xcc\x12\xb1\x3c\x8b\xf0\x28\xeb\x67"
- "\xe1\xfc\xc7\x3e\x36\xf6\xc9\xef\x71\x82\xdc\x1c\xea\x14\x0b\xe0"
- "\x1d\x6b\x5a\xd0\xc6\x74\x0e\xe5\x78\x64\x21\xa0\xd7\x02\xb2\x72"
- "\x82\xac\x5a\x99\x2d\x88\x67\xb6\x60\x4d\x63\x46\x86\x85\xba\xe2"
- "\x12\xfb\xd1\xcc\x27\x71\xee\xc5\x49\x66\x26\x13\xba\xe2\x18\xc8"
- "\xcb\xd6\x88\x76\x23\xd4\xb5\x94\xdb\x06\x94\x57\x48\x0b\xd1\xd0"
- "\xfc\x21\xa6\xd7\x33\x6b\xfa\x3b\x81\xbf\x68\x1f\xc2\x56\x2a\x06"
- "\x81\x5e\x86\xe6\xa1\xfe\x82\x3e\x87\xad\x64\xf6\x2a\xa1\x10\xf4"
- "\xd6\xb1\x54\x37\xaa\x7d\xa9\x4e\x0b\x9f\x91\x92\x0d\xc1\x33\xbf"
- "\x8a\x50\xb6\xb9\x33\xd3\xd0\x7e\x98\xd3\x2d\xc4\x01\xb2\x0d\x45"
- "\x7f\xb3\x54\x17\xc9\x64\xfc\xb8\x8e\x5c\x67\x27\x0a\xa8\x93\x06"
- "\xea\x4b\x4a\xe6\x11\x55\x5d\xd2\x61\xe2\x04\xdd\x90\xe4\x3e\x79"
- "\xbe\x96\x40\xb9\xc2\x5e\xdd\x01\x22\xca\x4c\xe1\x9b\x77\x73\xbe"
- "\x77\xf3\x6e\xce\xf7\x28\x3b\xce\xbb\x39\xcd\x17\x22\xef\xf6\x25"
- "\x30\xde\xf5\x6b\x1f\xc1\xf8\x94\x68\x76\xbc\x05\x32\x9a\x83\x63"
- "\x9b\x04\x39\xf3\xc9\xab\xc8\x99\xc7\x1c\xe7\x2b\x67\x4e\xb7\xea"
- "\xb4\xf0\x39\x23\x9c\x81\x72\x19\x67\x50\x56\xfb\x12\xda\x88\x24"
- "\x23\xa6\xab\x79\x83\xec\xda\x2c\x72\x07\xe8\x6a\x78\xd8\xca\x91"
- "\xa4\x8e\xc9\x69\x6e\xb8\xf6\xcf\xd4\x75\x58\x48\xbc\x29\xeb\x33"
- "\xa2\x69\xcb\xa1\xd4\xec\xa8\x20\x2e\xf5\x8e\x66\x1c\x67\x76\xe5"
- "\xa5\x46\x4b\x73\x38\x38\x1e\x17\x96\x8c\xf3\x36\x83\x1b\x9c\x86"
- "\x8a\x68\x97\x61\xb0\x8a\x86\x8c\x5a\x83\x63\x6f\xae\xb5\xdf\x37"
- "\xb8\x42\xae\xb4\xb4\xe6\x26\x66\x58\xc8\x37\xc9\x6c\x3c\x38\xaf"
- "\x1c\x63\x17\xb4\xbf\xa5\x6c\xbc\x38\x04\xc7\xce\x13\x0b\xa5\xf9"
- "\x09\xb4\x09\xe2\xb8\x9c\x38\x6e\x97\x88\x18\x0e\xc6\x71\x3b\x6e"
- "\x53\x12\x0d\xd2\xb8\x9d\xf4\x1b\xaf\x5b\x84\xc4\x02\x1c\xf3\x71"
- "\xdf\x37\x97\x9f\xd5\xdb\x71\xdf\xa3\x43\xd1\xd6\xbb\xef\xe3\xbf"
- "\xc1\xae\xa8\xdb\x05\xa2\xea\x32\xc6\x50\x57\x44\x83\xfe\x28\x8f"
- "\x08\xf3\x86\xc2\x5f\x01\xe4\x52\x01\x7f\xfb\xc1\xdf\x15\x58\x76"
- "\x60\xfe\x6a\x2e\x7b\xff\x13\xda\x9f\x21\xda\x46\xb6\x96\x22\xf9"
- "\x6a\x12\x72\x54\xfc\xde\x9a\x3b\xd7\x28\xcd\xb3\xb8\xf3\x77\xe0"
- "\x13\x83\xcf\x06\x8c\x94\x7c\xee\x87\xff\x96\x95\x37\x81\xfd\x26"
- "\x4a\x2d\x60\x63\xc5\x39\x5a\xe0\xaf\xa2\x95\x26\xdd\x2e\xfe\xbd"
- "\x0d\xf5\x03\xc7\x4b\x31\x5e\x13\xed\x6f\x2c\x7f\xee\xbc\x48\xf0"
- "\xa7\x1e\xcf\xed\x4a\x1e\x16\x61\xde\x38\x5f\xd7\x02\x93\xc5\x3c"
- "\x9f\xef\xbf\xdd\xad\x73\xd2\x00\xcb\xda\xea\x33\x46\x8c\xd4\x6b"
- "\xe2\xca\x9c\x26\x57\x7b\x42\xd8\xde\x8c\x63\x01\xc6\x17\xf3\xec"
- "\xbe\xca\x75\xaa\xcb\x88\xa3\x50\xaf\xc1\x31\xc9\xfa\x32\x07\x79"
- "\xe5\x68\xb3\x10\x37\x7a\x24\x09\x69\x22\x1a\x8c\x9f\x26\xb7\x7c"
- "\x48\x31\x86\xca\x3f\x4a\xa2\xda\x7e\x4c\x08\x6b\x87\x58\xf0\xb9"
- "\xa3\x64\xbc\xeb\xf1\x88\xc1\x79\xf3\x88\xb2\x0d\xe2\xd5\xb6\xc7"
- "\x93\xc2\xf6\x1d\x6c\x26\xa0\x27\x9a\x7a\x9b\x85\x14\x43\x5e\xfa"
- "\x5d\x42\xe8\x7d\xb3\xa8\xbd\x76\xd6\x0b\x24\x4e\xe7\x34\x65\x7e"
- "\x4d\x42\xc0\x16\x69\xcc\xe9\x15\xc4\xec\x38\x46\xfa\x3f\x2d\x68"
- "\xcd\x8e\x6f\x89\x61\x1e\xd8\x30\xb0\x59\x59\xd3\xc1\x56\x3b\x7e"
- "\x26\x5b\xe4\xb6\x7a\xc1\xdf\xdd\xb6\xfa\x47\xb0\xd5\xb9\x60\xab"
- "\xb3\x22\x48\x7d\xb2\x89\x80\xed\x18\x38\x25\x39\xcc\x9e\x99\x0c"
- "\x36\xfb\x69\xb0\xd9\xe9\xdf\x12\x66\xaf\x5b\x9a\x09\xd8\xda\xd0"
- "\x22\x3d\x09\x6f\x5f\x0c\x36\xfb\xc7\xa4\x5f\x6d\xca\xe4\x36\x7b"
- "\xb3\x1e\x6c\xf6\x62\x88\x89\xf5\x60\xb3\x5b\xba\xb0\xd9\xc7\x7d"
- "\xc4\xc3\xa2\xfd\x69\x5b\xac\x13\x36\x0b\x14\xe7\x55\x84\x4d\x5f"
- "\x0e\x0c\x90\x27\x49\x19\xbe\x30\x40\x79\xa3\xfc\x5d\x80\x43\x1d"
- "\x60\xc0\xe2\x56\xfb\xc0\xd8\x76\xf0\x69\xce\xd0\x6d\xf1\xaf\x1e"
- "\x6d\x14\x42\xd3\x88\x66\x4a\xf2\x87\xb4\x2d\x35\x01\xe2\xfe\x84"
- "\x10\x47\x5e\x19\xc9\x83\x98\xda\x09\xb1\x77\x7b\x6b\x84\x0a\x64"
- "\xa0\xb1\x2e\x4d\x0a\x43\x19\xba\x46\x00\x9e\x03\xee\x3b\x08\x36"
- "\x74\x6c\xd1\x3c\x32\xae\xdd\xb0\x2d\x83\x1a\xb6\x25\x3b\x0d\xdb"
- "\xd2\xe0\xde\xd0\x07\x2c\x88\xcb\x7b\x04\xd2\x0a\x68\xfe\xf6\x78"
- "\x67\x48\x19\xb1\x86\x6c\x4b\x87\xdf\x6b\xf0\x7a\xe6\x6c\x12\x12"
- "\xa7\x3b\x6d\xe2\x78\x95\x12\xc4\x89\xe3\xf5\x15\x31\x40\xbf\x0f"
- "\x7d\x2e\xf3\xaf\x22\x66\xd0\x5f\x60\xf1\xbe\x1b\x37\x2f\x1f\x2b"
- "\xe2\x56\xd7\x62\x22\xe0\x4f\x06\x76\xf8\x5a\x86\xdb\x57\x44\xf2"
- "\xb3\x20\xef\xd0\x22\xf0\xb5\xed\x7d\xe5\x6b\xc5\x7e\x0c\xfa\x5a"
- "\xf4\xb3\x88\xdb\xe6\x80\x71\x5b\xe0\x73\xfd\x7b\x0f\xb8\x35\x04"
- "\x87\xdb\xfd\x63\x65\xb8\x39\x00\x13\x2b\xe0\x66\xf3\xc4\xcd\xa8"
- "\x91\xe1\x66\x87\xdf\x2a\x37\x6e\x3f\x07\x80\x5b\xff\x13\x17\x2e"
- "\x6e\x4f\xf8\xdc\xff\xa8\x7b\xdc\x8c\x41\xea\xdb\xfd\x79\x6e\xdc"
- "\x8c\xa0\x6f\x46\xd0\x37\xa3\x97\xbe\x19\x65\xfa\x66\x04\x7d\x33"
- "\xca\xf4\xed\x58\x00\xb8\x0d\x39\x7c\xe1\xe2\xb6\xc8\xe7\xfe\x97"
- "\x3d\xe0\x16\xac\xbe\x35\xc9\x70\x03\x7d\x33\x82\xbe\x19\xbd\xf4"
- "\xad\x54\xa6\x6f\x46\xd0\xb7\x52\x99\xbe\x7d\x15\x00\x6e\x43\x3f"
- "\xbf\x70\x71\x5b\xec\x73\xee\xb0\x7b\xdc\x4a\x83\xd4\xb7\x07\xc6"
- "\xbb\x71\x2b\x05\x7d\x2b\x05\x7d\x2b\xf5\xd2\xb7\x52\x99\xbe\x95"
- "\x82\xbe\x95\xca\xf4\x6d\x77\x00\xb8\xdd\x9c\x7b\xe1\xe2\xf6\xa4"
- "\xcf\xf7\x9f\x7b\xc0\x2d\x48\x7d\x7b\x60\xbd\x0c\x37\xd0\xb7\x52"
- "\xd0\xb7\x52\x2f\x7d\xdb\x2e\xd3\xb7\x52\xd0\xb7\xed\x32\x7d\x5b"
- "\x11\x00\x6e\x0f\xdf\x79\xe1\xe2\x96\xe2\x73\xfc\x53\xc2\x4d\xc2"
- "\x0c\xf1\x63\xb8\xd1\x04\xe2\x80\x78\xf2\xb5\x39\x1c\x37\xc4\x8b"
- "\x61\x77\x32\x21\xcc\x20\x62\xe6\x10\x31\x43\xf9\x21\x6e\x18\x47"
- "\x32\xdc\x14\xca\x08\x8c\x21\x1d\x10\x4b\x4a\x71\xe4\xfd\x49\xd4"
- "\x5e\x97\xf4\xf7\x8e\x38\xd2\xe1\x1d\x47\xce\x97\xc7\x91\x15\x1e"
- "\x78\xe5\x9d\x02\xbc\x04\x11\xaf\x47\x7c\xc4\x91\xf3\x3e\xf2\x81"
- "\x57\x43\x8f\x78\x01\x36\xe1\xed\x27\x39\x5e\x9b\xc5\xf8\xbf\x30"
- "\xa5\x97\x78\xa5\x02\x5e\x18\xff\x7f\x45\x84\x2d\x33\x03\xc5\x2b"
- "\xad\xc7\xf8\xbf\x6b\xbc\x8c\x0d\x81\xe1\x75\x7f\x93\x1b\x2f\xa3"
- "\xd5\x01\x3e\x4d\xf2\x67\x6e\xbc\xb8\x3f\x73\x78\xfb\xb3\xf9\x72"
- "\x7f\xe6\x0f\x5e\x5e\xfe\xec\x82\xc2\x6b\x89\xcf\xf1\x7f\x27\xf4"
- "\xc5\x9d\x60\xe7\x70\xbc\x32\xb4\x19\xfa\xc9\x0e\xfa\xdd\x14\x1b"
- "\xf4\x93\x1d\x03\x63\xd7\xe9\x49\x54\xfb\x52\xe8\x27\x03\x76\x79"
- "\x7a\x32\x3e\x57\x4f\x94\xae\x27\xa0\xaf\x7c\x14\xfa\xca\x60\x9f"
- "\xda\x7e\x48\x0a\xab\x9d\x65\x25\x2e\xe8\x2b\xe3\x38\x18\xd4\x37"
- "\x8a\xfe\x00\x7d\xe5\x26\xb0\x7d\x4d\x9b\x79\x5f\xf9\x5b\xa9\xaf"
- "\xfc\x8e\x47\x5f\xf9\xb9\x05\x62\x5f\x59\x94\x7f\xa1\x5c\xf6\x7f"
- "\x7d\xd5\x47\x5f\xb9\xa6\xc7\xbe\x32\xf6\x91\xb7\x60\x7f\xf9\xc7"
- "\xa4\x61\x9b\x44\xdb\xb6\xf9\x78\x2f\xfb\xca\x3f\x42\x5f\x39\x87"
- "\xcb\x7e\x73\xc0\xb2\x5f\xea\x73\xfd\x07\xea\x06\xea\x4b\x87\x2f"
- "\x02\x39\x4b\x3e\xa8\x1d\x7c\x10\x8e\x67\xb4\xe5\x6d\x9b\x06\x7c"
- "\x65\xfa\xc1\x7c\xd2\xd2\x08\x15\xea\x06\xea\x09\xea\x06\xf3\x45"
- "\x60\x07\xc1\x17\xb5\x14\x2f\x20\xe3\x4a\x16\x90\xb1\x8e\x10\xcf"
- "\x3e\xf2\xfd\x89\x88\x87\xdb\xb6\xb9\xbc\x6d\xdb\x5c\xb9\x6d\x7b"
- "\xa7\xb3\x2f\xea\xc9\xb6\x2d\xf0\xa5\x2b\x35\x3d\xea\x0a\xea\x08"
- "\xf3\x47\xa0\x2f\x67\x42\x57\x36\xff\x27\x50\xbc\x9e\xf6\xb9\xfe"
- "\xc3\x4f\xbc\xf6\xfb\x81\x57\x03\x1d\x30\x29\x46\x86\x97\x47\xdf"
- "\xd8\x8d\x17\xef\x1b\xbb\xbc\xfb\xc6\x73\xe5\x7d\x63\x7f\xf0\xf2"
- "\xee\x1b\x5f\x48\x78\x2d\x57\xf5\x0e\x2f\xa3\x1f\xfa\x65\x04\xfd"
- "\x9a\xb4\xde\x8d\x97\x67\x9f\x58\x86\x97\x4c\xbf\x64\x7d\xe2\xb9"
- "\xf2\x3e\xb1\x3f\x78\x79\xf7\x89\x2f\x24\xbc\x32\x7c\xae\xff\xf0"
- "\x13\x2f\x3f\xf4\xcb\x88\xfa\xd5\x2c\xc3\xcb\xa3\x2f\xec\xc6\xab"
- "\x54\xa6\x5f\xb2\xd8\x61\xae\x3c\x76\xf0\x07\x2f\xef\xbe\xf0\x85"
- "\x84\x57\x66\x52\xef\xf0\x2a\xf5\x43\xbf\x4a\x41\xbf\x26\x8f\x77"
- "\xe3\xe5\xd9\x07\x96\xe1\x25\xd3\x2f\x59\x1f\x78\xae\xbc\x0f\xec"
- "\x0f\x5e\xde\x7d\xe0\x0b\x09\xaf\xec\x88\x5e\xe2\xe5\x87\x7e\x95"
- "\x82\x7e\x4d\x2e\x90\xe1\xe5\xd1\xf7\x75\xe3\xb5\x5d\xa6\x5f\xb2"
- "\xbe\xef\x5c\x79\xdf\xd7\x1f\xbc\xbc\xfb\xbe\x17\x12\x5e\x2b\x6b"
- "\xba\xeb\x4b\xc9\xfb\x50\x8e\x2c\x37\x5e\x88\x4d\x3b\xf4\x9d\xda"
- "\xd5\xdb\xa6\xf9\xee\x3f\x3d\xd0\xe2\xab\xbf\x8b\x7b\xd7\xdc\xdf"
- "\x8c\xef\x83\xf0\x98\x90\x7a\xc5\x84\x75\x49\xaf\x12\xcf\x3e\xef"
- "\xee\x4e\x7d\xa8\x76\x69\x8c\x62\xb6\xaf\x3e\xef\x7b\x41\xf7\xa1"
- "\x10\x27\xec\x47\x39\x52\x01\x27\x31\x8e\xdf\xd2\xcb\x31\x8a\xf6"
- "\x93\x3a\x61\x0b\xc4\xf1\x19\xb3\xa1\x0f\x35\x27\x50\x9c\x9e\x49"
- "\xf6\x85\x13\x8e\x13\x61\x9f\x17\xfb\x52\x38\xef\x58\xdf\xd4\x4c"
- "\x72\x97\x10\xa6\x6b\x21\xcd\x9e\x73\x8f\xeb\x8e\x40\x9f\x6a\x31"
- "\xe0\xd6\x9e\x40\xf2\x8f\x90\xf1\x79\x0b\x78\x9f\x4a\xea\x4f\xd5"
- "\xdb\xec\x6c\xee\xd1\xec\xb0\x90\xfb\x2c\xd4\x5e\x02\xf9\xb1\x1f"
- "\x55\x3b\x6b\x33\x41\x5d\xc9\xfa\x9a\x84\x20\x06\xd0\x07\x63\x78"
- "\xc8\xfb\x50\xc5\xf2\xf9\xc6\x79\xbe\xfa\x50\x3d\xcf\x37\x16\x1e"
- "\xe7\xfd\x27\x36\xdf\x78\x5e\xf4\xa1\x56\xf9\x9c\xff\x98\xfc\xca"
- "\xc8\x0e\xd9\x9b\x75\x0e\x02\x7c\xfa\x2e\xac\x85\x8f\xeb\x39\xf2"
- "\xb7\xc5\x63\x9f\x16\xfb\xb3\xe6\xf4\x1a\x92\xbb\x8c\x68\xda\x5a"
- "\x13\xc2\xa0\x8f\x1a\xe2\x00\x5b\xf7\xdc\x51\x2e\x7b\x7c\x47\xcc"
- "\xfa\x44\x12\x5b\x2b\x83\x7d\x59\xd4\x15\x36\xe7\x38\x87\x8c\x2d"
- "\x3c\x4c\xc6\x31\xfd\x00\xbd\x70\x18\xca\x88\x2b\x64\x5b\x1a\xea"
- "\xc9\x7d\x07\xa9\x1d\x31\x40\xfd\xd8\x77\x10\xb1\xa9\x20\x59\x5f"
- "\x71\x6c\x18\x2e\x82\xe7\x5c\x70\x67\xdd\xf8\xdc\x07\x3e\x55\xfe"
- "\xe1\xb3\xd8\x13\x9f\xa2\x60\xe7\x83\xa5\xf5\x91\x8b\x75\x42\x91"
- "\x38\x1f\xbc\xf9\xaf\x81\xe2\xb3\xba\xd3\xfb\xcf\x7e\xe2\xd3\x10"
- "\x24\x3e\x56\x36\xb7\xe8\x81\x8f\x51\x25\xe2\x63\xc3\xbe\x92\x1b"
- "\x9f\x9f\xfd\xc4\xc7\xab\x8f\x74\x41\xe1\xb3\xc6\xe7\xf8\x4f\xf7"
- "\xf8\x18\x83\xd4\x1f\x63\x32\x9b\x43\xf4\xc4\x47\xd4\x1f\x63\x1a"
- "\xf6\x8d\xdc\xf8\x1c\xf3\x13\x1f\xaf\x3e\xd1\x05\x85\xcf\x5a\x9f"
- "\xe3\xdf\x3d\xe0\x13\xa4\xfe\x18\xad\x6c\xae\xd0\x03\x9f\x52\x51"
- "\x7f\x8c\x36\xec\x0b\xb9\xf1\xf9\xca\x4f\x7c\xbc\xc7\x4f\x2f\x24"
- "\x7c\x9e\x5b\x18\x1c\x3e\xa5\x41\xea\x4f\x69\x32\x9b\x13\xf4\xc4"
- "\x47\xd4\x9f\xd2\x34\xec\xfb\xb8\xf1\xd9\xed\x27\x3e\x5e\x7d\x9e"
- "\x0b\x0a\x1f\x83\x3a\x48\x7c\x82\xd4\x9f\x52\x2b\x9b\xfb\xf3\xc0"
- "\x67\xbb\xa8\x3f\xa5\x36\xec\xeb\xb8\xf1\x59\xe1\x27\x3e\x5e\x7d"
- "\x9c\x0b\x0a\x9f\xfc\xf2\x9e\xe6\x8b\xa4\xd8\x59\x3e\x2f\xdb\x0e"
- "\xf1\x1b\xc6\xcf\x18\x3b\xd7\xdb\xaa\x88\x63\x31\xc7\x26\xf7\x14"
- "\xd1\xe4\x89\xd8\xb0\x39\xd9\x27\xf8\x9c\x2c\x8b\xdb\x56\x83\xe4"
- "\x57\x2a\x23\x30\x2e\x63\xf3\xae\x6c\x6e\x62\x2f\x5e\x5b\xd3\x2e"
- "\x8b\xdf\xb0\x8f\x0a\xb1\x37\xc1\x7e\x6a\xd6\xb7\x01\xc4\x6d\x73"
- "\x7c\xe1\xd2\xf3\xdc\x44\xa1\x6c\x1d\x9f\xd4\xf7\xec\x53\x5c\x02"
- "\x9e\x77\x2d\xf0\x79\xfe\x53\xf7\xb8\x18\x1b\x02\xc3\x05\xfc\xcd"
- "\xea\xfb\x9b\x38\x2e\x5f\x79\xe1\x52\xaa\x6a\x97\xf9\x1d\xff\x71"
- "\xf1\xf2\x37\x17\x14\x2e\xcf\x1f\xf4\xd9\xd7\x04\xbb\x84\x98\xe0"
- "\xfa\xee\x75\x73\x48\x54\xee\x61\x32\xbe\xfd\x87\x88\xc1\x53\xc0"
- "\xce\xb5\x3f\x11\xa1\xaa\x07\x1b\x97\x69\xa3\xdf\x85\xda\x06\xc6"
- "\x7e\xba\xdf\x4a\xea\x67\x59\x48\xdb\xd2\x04\x62\x38\x8a\x6b\xd5"
- "\xab\xc8\xda\x14\xec\xcb\xbf\x45\xf6\x1d\x3c\x41\xa6\x94\xd1\x76"
- "\x73\x4b\x15\x31\x2d\x7b\x8b\xd0\x27\x74\x83\x4b\x20\xcf\xa3\x20"
- "\xc3\xe3\xc2\x0b\xeb\x4f\x43\x7f\xf4\xba\x74\xa2\x99\xd4\x42\xed"
- "\xf5\x2d\x9f\x92\x2d\xf0\xac\xbd\xe9\x84\xa0\x7c\x11\x13\xc3\x02"
- "\xec\x7f\xee\xe6\x98\x4c\xe5\x98\x6c\x96\xf5\x3f\xb5\x70\xfd\x48"
- "\x32\xe0\xf1\x93\x17\x1e\x07\x9b\x09\xc8\x77\xe0\x14\x1b\xe0\x61"
- "\x93\xf0\x38\x46\x32\x9f\x44\x3c\x2c\x1d\xeb\x5d\xdb\x44\x3c\x0a"
- "\xd1\x7e\x25\x13\xcd\x26\xa9\xff\x79\x5c\x86\x87\xf4\x4e\x96\x1c"
- "\x0f\xa9\xef\xbf\x14\xf0\x58\xe2\xee\x7f\x9e\x86\xfe\xe7\x26\xe8"
- "\x7f\x66\x7d\x46\x84\x4d\x99\x81\xe2\xf1\xa2\x4f\xff\x2f\x61\x81"
- "\xbe\xa5\x3d\x74\x5b\x3c\xe2\x60\x4e\xaf\x24\x88\x09\xfa\x13\xe7"
- "\x0f\x11\xaa\x8c\x34\xd0\x1d\xcb\xc0\xd8\x36\x0a\x7d\x7e\xe8\xef"
- "\x9b\x67\x7c\x49\x70\xcc\x80\x63\xd0\xde\x6e\xb6\x56\x11\x94\xbd"
- "\x69\xd9\x97\x0c\x87\xe3\xc2\xfa\xf0\x99\x36\x22\x5c\x0b\x3c\x84"
- "\xfe\xbe\xe6\x51\x7c\x2f\x17\x6c\xdb\x96\x79\x64\xdc\xa4\x64\x6a"
- "\xc7\xbe\x29\xea\x10\xae\x3d\x41\xbb\x56\x9f\xfc\x11\xc1\x71\x9d"
- "\xf6\x90\x32\xb2\x37\x8d\xb0\x71\x1c\x94\x7b\xff\xa7\xdc\x38\xe1"
- "\x7a\x12\x86\xd5\x43\x7e\xac\x73\x95\xe3\x35\xc3\xe2\xd7\xfa\xe4"
- "\x36\x71\xbc\xa0\x50\x1a\x53\x0b\x76\xbc\x40\x1a\x53\xfb\x91\xaf"
- "\x27\xc9\x3a\x00\xfa\x13\x30\x5e\x2f\x45\xfa\x89\x57\x43\xe0\x78"
- "\xb5\x76\x81\xd7\x4b\xd5\x5d\xe0\x65\x75\xe3\x75\xff\x58\x37\x5e"
- "\x46\x95\x88\x97\x4d\x86\x97\xbd\x67\xbc\xba\x59\xdf\xfa\x8b\xc7"
- "\x6b\x83\xcf\xfe\x8f\x27\x5e\xc6\x20\xf4\xeb\xc7\x2e\xf0\xfa\x5b"
- "\x5a\x67\xbc\x8c\x32\xfd\xba\x3f\x4f\x86\x97\xa8\x5f\x46\x99\x7e"
- "\x19\xfd\xd0\xaf\x6e\xd6\xb5\xfe\xe2\xf1\xda\xe8\x73\xfd\x8f\x17"
- "\x5e\x41\xe8\xd7\xa1\x2e\xf0\xda\x14\xd5\x05\x5e\x72\xfd\x6a\x72"
- "\xe3\x55\x2a\xea\x97\x51\xa6\x5f\x46\x3f\xf4\xab\x9b\xf5\xac\xbf"
- "\x78\xbc\x36\x77\xbb\xfe\xc7\x8d\x57\x69\x10\xfa\xf5\x61\x17\x78"
- "\x6d\xde\xdf\x19\xaf\x52\x99\x7e\x3d\x30\x5e\x86\x97\xa8\x5f\xa5"
- "\x32\xfd\x2a\xf5\x43\xbf\xba\x59\xc7\xfa\x8b\xc7\x6b\x8b\xcf\xf8"
- "\xcf\x0b\xaf\x20\xf4\x2b\xab\x0b\xbc\x0a\x57\x75\x81\x97\x4c\xbf"
- "\x1e\x58\xef\xc6\x6b\xbb\xa8\x5f\xa5\x32\xfd\x2a\xf5\x43\xbf\xba"
- "\x59\xbf\xfa\x8b\xc7\xab\xc8\xe7\xf8\xb7\x1c\xaf\xb6\x7c\x29\x3e"
- "\x2c\xf3\xc4\x0b\xe2\xf5\xb0\x26\xde\xb7\x92\xf0\xf2\x1d\x1b\x16"
- "\x47\x77\x60\xf5\xad\x3b\x36\x64\x38\x89\xf3\x14\x88\x0f\xc6\x88"
- "\x18\x13\xb6\x19\x38\x46\x38\x07\xd8\x6d\x5c\xe8\xcf\xfb\x4f\x41"
- "\xe0\x24\xf5\xab\xfa\x1c\xa7\x2f\x82\xc1\xa9\xc4\xe7\xfb\x4f\x9e"
- "\x38\x49\x7e\xcb\x5f\x9c\xba\xf2\x59\x25\x8d\x9d\x71\x32\x5a\xdd"
- "\x38\x71\x3f\x85\xbe\x0b\x7d\x95\x27\x4e\xdd\xf8\x2b\x7f\xde\xbf"
- "\xf8\xc5\xe3\xb4\xd5\xa7\xfd\x2b\x10\x5c\x95\xf0\xa9\x82\x8f\x09"
- "\x3e\x35\x4e\x81\xdc\x5d\x24\xb8\xd8\xde\x9d\xb8\xcf\x5f\x51\x4e"
- "\xa7\xeb\x03\xe8\x80\xd1\x19\x98\x07\x64\xcb\xde\x0f\x90\xca\xa0"
- "\xb9\x04\x65\x67\x0a\x51\xcc\x22\x45\x3c\xef\x40\xa9\xac\x90\x95"
- "\x24\x46\x2a\x0b\xda\x94\x0d\xb2\x36\x85\xad\x8c\x19\x00\xf9\x6b"
- "\x68\xee\xbc\x69\x90\x57\xc5\xca\x5c\xa9\x64\x7d\x0d\x29\xaf\x33"
- "\x47\x81\xef\x87\x9b\xc2\x14\x90\x97\x97\x39\x48\xcc\xa7\x75\xe5"
- "\x10\x2d\xab\xa7\x20\xe0\xf3\xbc\xeb\x39\x58\xcc\x17\x25\xaf\x63"
- "\xc8\xca\x18\x56\x9e\x98\x67\x08\x1d\x20\x1c\x14\xdb\xa2\x93\xe7"
- "\x73\xde\x49\xb0\x4c\x29\x9f\x5a\x2c\x6b\x8c\x47\x9e\xbf\x13\x82"
- "\xe7\xd1\xb2\xfa\xa5\x0b\x44\xac\x5f\x08\xe6\x75\x0e\x9e\xab\x73"
- "\x2a\x94\xd1\x2e\x81\x44\x7b\xdc\xb3\x9a\xb0\xfc\x62\xde\x50\x96"
- "\x77\xc0\x14\x0b\xe4\x1d\x2b\xca\x5c\x29\x97\xb9\x98\x2f\x4c\x92"
- "\xa3\xfc\x9a\x33\x47\xc0\xb2\xf0\xba\x86\x0e\x98\xdc\x04\x6d\x18"
- "\x2f\xe5\x93\x9e\x67\x4e\x22\x84\xe5\x15\xc8\xf5\x22\x26\x43\xa1"
- "\x1d\x31\x52\x3e\xdc\x4f\x41\xca\x9b\xe5\x24\x97\x95\xb8\x65\x33"
- "\xcc\x99\x3b\xaf\xd9\xb9\x52\x39\xd1\xbb\xcc\xb0\x95\x0a\x0b\xe6"
- "\xab\x6b\x66\x65\x23\x7e\x85\x90\xff\x57\xa2\x8c\x62\x39\x26\x9a"
- "\x0e\x4c\x9c\x82\x03\xaf\x99\x8a\x79\x5d\xc3\xc5\x7c\x93\x3a\xe7"
- "\x53\xca\xf3\x5d\xc2\xe5\x98\x1a\x0e\xb2\x89\xef\x9c\x57\x25\xcf"
- "\x7b\x29\xcf\x9b\x54\x0d\x79\xa7\x75\xce\xab\x91\xe7\xfd\x35\xcf"
- "\xbb\x20\x03\xf2\x26\x74\x51\xd7\x61\xb2\xbc\x11\x3c\xef\xc2\xb1"
- "\x90\x77\x46\xe7\xbc\x5a\x79\xde\xcb\x78\xde\x34\xac\xc3\xac\xce"
- "\x79\x63\xe4\x79\x87\xf3\xbc\x8b\x5a\x20\x6f\x62\xe7\xbc\xd9\xf2"
- "\xbc\x97\xf3\xbc\x8b\x8d\x90\x37\xc9\x3b\x6f\x09\xc7\x76\x94\x88"
- "\x6d\x24\xcf\xfb\xe4\x0c\xc8\xbb\xb0\x8b\xb6\xf5\x63\xe5\xf2\xbc"
- "\x23\x78\xde\xc7\x63\x20\x6f\x72\x17\x58\xc8\xf3\x8e\xe4\x79\x73"
- "\x34\x90\x37\xad\x0b\x2c\xe4\x79\xaf\xe0\x79\x97\x5a\x21\x6f\x7a"
- "\x17\x58\xb8\xf3\x0e\x7e\x7a\x2b\xe4\xc9\x80\x76\x36\x74\x21\x5b"
- "\x79\x99\x57\xf2\x32\x97\xc7\x43\xfe\xec\x2e\x64\x2b\xcf\x3b\x8a"
- "\xe7\x5d\x41\x20\xef\xaa\x2e\x64\x2b\xcf\xfb\x1b\x9e\x37\xb3\x12"
- "\xf2\xae\xe9\x9c\x17\xf4\x8d\xcb\xf7\x06\x51\xbe\x51\x3c\x7f\xf6"
- "\x2c\xc8\x9f\xd7\x85\x7c\xb1\x3c\x49\x67\xaf\xe2\x79\x97\xa4\x41"
- "\xde\x82\x2e\xe4\x2b\xcf\xfb\x5b\x9e\x37\xdf\x06\x79\xd7\x77\x21"
- "\x5f\x79\xde\xdf\xf1\xbc\xcf\x22\x27\x37\x76\x21\x5f\x79\x5e\x1d"
- "\xcf\xbb\x7a\x3f\xe4\x2d\xec\xa2\xbe\xa3\x64\x79\x47\xf3\xbc\x6b"
- "\xb0\xbe\x5b\xbb\xc0\x43\x9e\xf7\x6a\x9e\xb7\x20\x0f\xf2\x1a\xbb"
- "\xc0\x43\x9e\xf7\xf7\x3c\x6f\x2e\xea\x71\x59\x17\x78\x74\xe4\x05"
- "\xbf\x30\xc6\x39\xf8\xb9\x9d\x25\x98\x5f\xa1\x64\x73\x1c\x54\x60"
- "\xfb\xfb\xb3\xbc\xc0\x13\x93\x68\xef\xae\xe1\x65\x1a\xa6\x41\xbe"
- "\x4a\xc2\xf7\xf3\xab\xac\xb3\x33\x7b\x04\xfe\xc5\x71\x63\x89\xdb"
- "\x76\x5f\xcb\xf3\x3e\x53\x05\x79\x77\xca\x6d\x28\x15\x94\xf2\x7c"
- "\xd7\xf1\x7c\x45\x28\xab\x2a\xcf\x7c\x2a\x77\xbe\xc1\x2f\xee\x84"
- "\xeb\xbb\x8a\xbd\xec\x31\xd4\x53\x5e\xd6\xf5\xbc\xac\x97\x12\x21"
- "\xaf\xc9\x33\x9f\xe3\x06\x59\xbe\x1b\x78\xbe\xbf\xa1\x6c\xaa\x3d"
- "\xf3\x69\xe5\xf9\x6e\xe4\xf9\x4a\xd0\x66\xd5\x78\xe6\x8b\x91\xe7"
- "\x1b\xeb\xcc\xdd\x58\xcd\xf2\xae\x54\xd6\x7a\xcb\x0f\x64\x7d\x83"
- "\xcc\xa7\xdd\xe4\xcc\xdd\x9c\x26\xe6\x6d\x90\x64\xc8\xe4\xcc\x39"
- "\x2f\x88\x9c\xbf\xd9\x99\x5b\x18\x25\xe6\xdb\x2f\xf7\x03\x32\x5f"
- "\xfb\x07\x3a\xf8\x85\x28\xd1\x8f\x36\xb2\xe7\xae\x54\x1e\xec\x2a"
- "\xde\x48\xbe\x9a\x0c\x39\x2a\xbc\x72\x90\xfb\x1e\x69\x4f\xfd\x57"
- "\x59\x9b\x5c\x85\xfa\xe8\x38\x1b\x75\xc8\xd3\xd6\x09\xb4\xe1\x3a"
- "\x1b\x51\xe2\xfe\x49\x34\xa4\x3c\xc1\x02\xe9\xd6\x11\xfa\xf8\xd6"
- "\xdc\x57\x9a\x2d\x8a\xd8\x6a\xdc\xcb\x03\xbe\xdb\x2c\xc4\xb0\x11"
- "\xbf\xaf\xcb\x81\x78\x50\x88\x51\xe0\x1e\xcc\x25\xf0\x3d\x1f\x3e"
- "\x6c\xdf\xe3\x64\x22\xd0\xd5\x24\xc6\xb4\xc4\x41\x8e\xa4\x13\xc1"
- "\x95\x9f\x62\xd5\xa6\xe0\x7e\x22\xaf\x4e\xa0\x4b\x93\xc6\x43\x5d"
- "\x34\xf0\xdc\xc4\xc3\xf0\x9b\xd5\x05\xda\x0f\xbe\x51\x6d\x4a\xc1"
- "\x3d\x86\x5e\x7d\xca\x1a\x52\xa1\xa1\xcf\x3c\xfc\x7d\x72\x26\xb9"
- "\xe2\xa8\xf0\x6a\xda\x49\xb0\x0d\x27\x97\x26\xdd\x8e\x65\xb8\x42"
- "\x52\xd5\x90\x67\x27\xee\x45\x42\x37\x56\x58\xf9\x3e\x25\xaf\x7e"
- "\xc2\xea\x9f\x43\x1b\x68\xa4\x5e\xeb\x6a\x5b\x95\x8d\xe7\x37\x98"
- "\x32\x8f\x92\xc3\xb2\x6b\xd6\xcb\x2a\xd8\x1e\x26\xd8\x2e\x68\xa3"
- "\xb6\x35\xf7\x55\x93\x45\xa1\xb3\xf2\x3d\x4a\x5e\xf5\x79\x3e\x28"
- "\xc4\xd6\x61\xd4\x90\xaa\x83\xfc\x56\x8b\xf0\x72\x24\x97\xc3\xab"
- "\x0e\x8b\x42\xab\xe6\xdf\x5f\x53\x59\x14\xbf\x89\x15\xbf\x87\x5b"
- "\x14\x77\x44\x89\xdf\xb5\xd2\xde\x2b\x5d\xef\x05\x93\xe2\x80\x76"
- "\x87\xbb\xb6\x24\xa8\x30\x1e\xc5\x7d\xd9\x68\x48\x8a\x43\x3b\x12"
- "\xcf\xeb\x78\xad\x0a\x9e\x19\xce\xf7\xd3\x7c\x6d\x05\xfc\x0d\x13"
- "\xff\x5a\xc5\xbf\x14\xf3\x30\x6c\x23\xf5\x5b\x69\xde\xf6\x66\x6c"
- "\x73\xa6\x93\xba\xa8\x3a\x75\x1c\x5d\xf3\xcd\x1a\x73\x7a\x33\xe1"
- "\xfb\x50\xbf\xf6\x0a\xdf\x17\x07\xe4\x0a\xb2\xa7\x83\xbe\x59\xc3"
- "\x9e\x65\xa8\xd0\xc8\xeb\x85\x1b\xb8\x44\x5f\x7f\xc3\x8d\x63\x6f"
- "\xba\xf9\x0f\xe3\x6e\x99\x3d\xe7\xb1\xc4\xb9\xf3\x1e\x4f\x9a\xbf"
- "\xe0\x89\x85\x8b\xf4\x8b\x93\x9f\x4c\x49\x4d\x7b\x6a\xc9\xd2\xf4"
- "\xa7\x97\x61\xbe\x8e\x36\x6c\x99\xa8\xb0\x09\x04\x9e\x73\x27\x3c"
- "\xa7\x9c\x9d\x7b\x87\x69\x1c\x97\x72\xb5\x52\xdb\xb5\x4c\xcd\x11"
- "\x84\xed\xf7\xdd\x22\x94\xcf\xc7\x3d\xa2\x81\x03\x0a\x73\xe1\xbd"
- "\x26\x3c\x63\xa0\x49\x28\x9f\x51\x6f\xbd\xd7\x84\x67\x5c\x7c\x1c"
- "\xd1\x4c\xa2\x46\xe1\x39\x04\xe5\xb1\x78\xbd\xe4\xb7\x84\x54\xc3"
- "\xbd\x5d\x95\x39\x4a\x43\x22\x5e\xbc\x94\x5a\xd7\x5f\x4a\x5b\xb0"
- "\xfc\xf5\x1b\x68\xb3\x75\x79\x12\xc9\x87\xdf\xc0\x1d\xcd\x11\xa1"
- "\x62\xc4\xc7\x10\xf1\x42\x2c\x1b\x59\xbc\x81\x36\xad\xba\x94\x36"
- "\x3d\xb3\x81\xb6\x94\x5c\x4a\x2d\x51\xeb\x89\xba\x35\xb7\xbc\xc1"
- "\x22\x94\xeb\x18\xb7\xe1\xba\x6b\xf0\x6b\x35\xeb\xe0\xda\x75\x0e"
- "\xd2\xaf\x04\x7e\x43\x9a\xed\x63\x2d\xaf\xf7\x1b\x27\xec\xfd\xa1"
- "\x7d\x3b\x69\xfb\x42\x45\x3e\x3c\x87\xe3\x54\x31\xa1\x1a\xbc\x30"
- "\x3c\xcf\x6a\xb6\x1f\x06\x9e\x55\xe0\xde\x7c\xf8\xbc\x30\xf3\xc6"
- "\x16\x82\xe5\xbd\x9e\x62\xef\x9f\x3a\x9c\x3a\x20\xaf\xd6\xb5\x7c"
- "\xa1\x02\x9e\xe7\x80\xb2\x6d\xf2\xf6\xe8\xe6\x2d\x4a\xd3\xea\x9f"
- "\x5a\xb8\x70\xf4\x60\xa2\x63\x7f\x3d\xce\xc7\x48\x83\xf2\xc8\x8b"
- "\x1b\x68\x35\xb4\xd3\x04\xed\xad\xa9\x83\xa8\x1b\x38\x43\xa0\x4d"
- "\x05\x50\xee\x4b\x90\xbe\x0b\xbe\xef\x82\xba\xd7\xf0\x33\x15\x3e"
- "\xd8\x43\x73\x2b\x26\x41\x3d\xd1\xee\xe3\xfe\x4a\xe4\xe4\xd2\x69"
- "\x0a\x68\xf7\x7a\xc8\x57\xa3\x1d\x4e\xae\x3a\x22\xbc\x3e\x02\xea"
- "\x61\x84\xef\x98\x9f\xe9\x0c\xe4\xaf\xe6\xed\xfa\xe0\x4d\xfc\x0d"
- "\xb2\x32\x15\x5d\x4a\xf3\x5a\x73\x2b\xec\xb8\x9f\x1d\xdb\xe7\x1b"
- "\x7e\x83\x5c\x6a\x20\x6f\xc1\xc9\xac\x69\x0a\xe8\x7f\x29\x4a\x3a"
- "\xca\xac\xa8\xc1\x3a\x61\x3d\xb0\x0f\xb8\x0f\xa2\x2f\x57\x7b\x02"
- "\xb9\xc6\x4e\x14\xfb\x9a\x08\x29\xdc\x40\xb7\xc2\xa7\x10\x3e\x1b"
- "\x3f\x85\x6b\x9f\xc0\xa7\x06\xd2\x6b\xe1\xef\xa7\xf0\xf7\x93\x26"
- "\x36\x67\x17\x81\xf5\x4e\xcd\xa0\xcd\xd7\x6d\x24\xbf\xc1\xf2\x81"
- "\x5b\x7f\x39\x2c\x7c\x10\x81\x75\xc7\xbd\x23\xe9\xe0\xd7\xf3\x3c"
- "\xf7\xd8\x03\x37\x05\xd7\xe1\x6f\x38\xff\x2b\xff\x54\xce\x80\x4f"
- "\x86\xf8\xbd\x9a\x08\x6f\xb4\x88\xdf\x1b\xe1\xd3\xd4\xf3\xc7\xbb"
- "\x3c\x5f\x9f\x37\xe3\xfd\xcf\xeb\xd7\x27\xcf\xbf\x7c\x6f\xab\x88"
- "\xf0\xce\x2c\xf8\x6c\xf4\x4c\x7f\x27\x99\xa7\xbd\x37\x9e\xff\x7e"
- "\x2f\x56\xfc\x0b\x3d\xef\xf7\x41\x4e\xef\x43\xf9\xef\x57\xf2\xb4"
- "\xf7\x77\xc1\x5f\x25\x7c\x34\x5e\xcf\xc7\x32\x8d\x88\x67\x7b\x0e"
- "\xd8\x6d\xc0\xd2\x22\xbc\x3e\x03\x31\x5a\xc7\xb9\xa5\x70\x51\x96"
- "\x96\x00\xdc\x2a\x74\xf3\xa7\x72\xb2\x27\x7f\x2a\xc7\x79\xf1\xa7"
- "\x00\xed\x11\xe8\x8b\xb1\x84\xf3\x65\xd7\xc9\xe5\x89\xf0\xbb\x72"
- "\x3c\x94\xb3\x4b\x3b\x93\x95\xc1\x62\x8f\x75\x47\x09\x09\x49\x22"
- "\x4a\xb4\x2f\x2d\x42\xa5\x01\x39\x8b\xcf\x16\x9f\xcb\xeb\x02\xf5"
- "\x83\xb4\xad\x58\xbf\xc5\x50\x2e\xfc\xc6\x72\xb7\x9a\xc9\x09\xa9"
- "\x6e\xec\x9e\xdc\x05\xc0\x47\xb1\xbe\x58\x26\xde\x47\xdd\xed\x4a"
- "\xc0\x7b\xf8\xb3\xdf\x9c\x00\xe9\xd8\xbf\x24\x59\x3f\x91\x7e\xb8"
- "\xbe\x19\x39\x89\x7f\xcd\x8e\x68\xd0\xa5\x58\xe2\x6a\x4d\x20\xd7"
- "\x45\x10\xdc\xdb\x6b\xd0\x61\xe1\xcd\xa8\x6b\x33\x48\x34\x96\x87"
- "\x76\x1d\xda\xd1\x5c\x82\xba\xc8\xcb\xba\x85\xef\x93\xf5\x7a\xc2"
- "\xa7\xc9\x84\x3d\xa7\x18\xeb\x03\xd7\x65\xcf\x5d\x8f\x7d\xc9\x75"
- "\xcb\x78\x5b\xe1\x59\x46\xb8\xbf\x12\xdb\x8e\xf2\x84\xeb\x55\x50"
- "\x4e\x36\x5e\x63\xfb\x6f\xf3\xf6\x18\x71\x8f\x56\x94\x07\xe6\xc7"
- "\x33\x5b\xf8\x9e\x7d\x15\x6c\x4f\x34\x28\xbf\x12\xf1\xa0\xf0\x0c"
- "\x2c\x23\xcb\x41\x1d\x14\xec\xd1\xb6\x65\x76\xf0\xff\x6f\x9d\xf6"
- "\xc4\xe7\xcd\x46\x39\x3e\x70\x5f\x25\xdc\x5f\x4d\xa1\x8d\x68\x4f"
- "\xe0\x99\x61\xe8\xf3\x21\xad\xc0\x95\x0b\x65\x2c\xb1\xb3\xf1\x14"
- "\x28\xe7\x7b\xa8\x4b\x01\x96\x03\xf5\xa9\xe6\x65\xbd\x15\xb5\x27"
- "\xc3\x13\x6b\xb1\x3c\x23\x62\xce\xf4\x79\x19\x6b\x13\xd8\xae\xb7"
- "\xde\x2d\xe6\xd7\xaa\x20\x4f\x15\x6d\x8f\x25\xb8\xe7\x29\xf7\x25"
- "\xec\xda\xce\xac\xd3\x0c\xdf\x6a\x6e\xd7\xde\xfa\x22\x75\x05\x6d"
- "\x76\xd7\xfb\xad\x02\x69\xdf\x58\xb1\xde\x3b\xf1\x79\x74\xe9\x0c"
- "\xe6\x5b\xf1\x19\x78\xbf\x58\xde\x42\x2c\x4f\x92\xd5\xb5\x50\x0f"
- "\x2e\xaf\x37\xb7\x42\xba\x11\xb9\xc8\xe4\x06\x76\xf4\x64\x16\x72"
- "\xf1\xad\xf5\x70\xff\xae\x7c\xfc\xbd\x94\xfd\xd6\x31\x1b\xdb\x71"
- "\xfd\xcd\x83\x78\xdd\x0c\xfd\xf4\x75\x4f\x00\x97\x5c\x84\xfc\x26"
- "\x9c\x44\xdb\x72\x58\xdb\xca\x6d\xcb\x27\x2a\x3e\x76\x10\x82\xf5"
- "\x04\x19\x55\xb5\xe6\xbe\x3d\x1e\x6c\x3f\xdb\xf3\x1f\xec\xf5\x4e"
- "\xba\x2d\x81\x60\x9d\xc1\x9e\x89\xf5\x7b\xbb\x42\xc4\x7e\x27\xb6"
- "\x11\xe5\x79\x2d\xb7\x7d\x70\xed\x9d\xa9\x58\x77\x77\xbb\xdf\x5e"
- "\x23\x97\x31\x6b\x37\xe0\x80\x78\x21\x2e\xb2\x32\x91\xfb\x05\x50"
- "\x56\x39\xff\xcd\xb9\x81\xb2\x2e\xb8\x94\xd6\x62\x7e\x77\xde\x9d"
- "\x7b\xf0\x5a\x26\x3c\xfb\xba\x64\xf0\xe9\xa0\x17\xb8\xf7\x2f\x94"
- "\x5b\x8e\xe7\xf1\x40\x19\x55\x28\x53\xa8\xcb\x25\xc8\x47\xf8\x5d"
- "\x2b\xde\x17\x0e\xfe\x7c\x0c\x7c\xc6\xbb\xf5\xff\x9d\xfe\x9e\xfc"
- "\xda\xe9\xad\xff\x88\x77\x81\x2b\x2b\x96\x30\x3e\xa4\x10\xed\x71"
- "\x61\xe7\xcb\xa2\xef\x10\xb1\xde\xf9\xf3\xc7\xa0\x2f\xb2\x32\x32"
- "\xbc\xb0\xae\x62\x7c\x5c\x3a\x09\xcf\x33\x56\xc0\xbd\x55\x62\x39"
- "\xac\xcd\x8c\x4f\x39\x8c\x03\xb5\x74\x29\xb4\xb3\x83\x07\x6f\x37"
- "\x8a\x38\xd7\x7a\xc9\x44\xb2\x5d\x51\x78\x46\x03\xda\xa4\xd6\x1c"
- "\x72\x7b\x6b\xbb\xdb\x2e\x21\xf6\x2e\x86\xfd\xce\xec\x12\xee\x6f"
- "\x45\xbb\xb5\x93\x5f\xbf\xd4\x83\xc3\x58\x97\x77\x18\x7f\xb1\x2e"
- "\x59\x33\xb0\x2e\x55\xac\x1e\x59\x5a\x72\x5c\x78\x67\x0c\x3e\x1f"
- "\xee\xad\x12\xf5\x55\x2c\xeb\x6d\xe4\xcb\xae\x67\xc0\x56\x61\x9d"
- "\xe0\xd9\x11\xcc\xfe\xdd\xc3\xe4\x6a\x10\xeb\x5e\x63\xcf\xc1\x7b"
- "\x2b\xb3\x4f\x0b\xec\xde\x1a\x8b\xf0\x86\xcd\xce\xf7\x71\x1e\x0c"
- "\xf7\x97\x69\xe7\x60\xfe\x77\x5b\xd0\x46\x6b\xff\xca\xbe\x1f\xd0"
- "\xfe\x19\xb8\x7a\x94\x28\xa1\x3c\x15\x72\x54\xe2\x45\x8b\xf0\xee"
- "\x5e\x88\x31\x10\xaf\x72\x88\x91\xca\x50\xde\xc8\x65\x88\x91\xc6"
- "\xb6\xe6\xbe\x63\x93\x78\x0b\xcf\x29\x44\xd9\x73\x7c\xfe\x71\x0b"
- "\xf0\xb8\xca\xcd\xad\x7f\xdc\x22\xca\xb1\x0c\xe4\xa8\x82\xe7\xbd"
- "\x2b\xb6\xab\x0c\xf2\x43\x2c\xf6\xee\x2b\x62\xdd\x37\x8a\xf9\x1f"
- "\x92\x70\x10\x75\xb5\x36\x1f\xed\x2f\xc3\xe0\x1f\x2d\xe2\xbd\x46"
- "\xf1\x59\xc7\xa4\xbc\x18\x23\xf2\xfd\xd9\xff\x71\x0c\xed\xe0\x75"
- "\x80\x3d\xb3\x7d\xec\xac\x2a\x9e\x86\xba\xc3\x9f\xf1\xee\x4b\x8c"
- "\x87\x10\xf7\xb8\x79\xf4\x8f\x6a\x2f\xfb\x84\xb6\xb8\xa0\x1e\xca"
- "\x40\x7b\x8a\x5c\x42\x9b\x8a\x7d\x09\x28\xaf\x50\xd4\x1f\xb1\xce"
- "\xff\xbc\xde\x93\x2b\xef\xae\x04\xae\x5c\xe3\x2e\xfb\x9f\xda\xae"
- "\xfc\x5c\x09\xb7\x81\x85\xfc\x9e\x7f\x3e\x29\xb6\xad\x9c\xb7\x4d"
- "\xfc\x8d\x72\xcb\x64\x72\xbb\x49\x26\x47\x90\x5b\xd5\xcb\x62\xfe"
- "\x2a\xb4\xe5\x6e\x7d\xfd\xe7\x57\x92\x2e\x77\xb6\x17\x55\xcf\xa3"
- "\x3e\xc8\xea\x55\xe5\x65\x2f\xaa\xba\xb6\x17\xff\x5c\x23\xb6\x77"
- "\xab\x97\x6e\x18\xc5\x78\xb7\x54\xc2\xa1\xde\xd6\x26\xee\x45\x5e"
- "\x51\x8a\xf6\x13\x9f\x2d\xf7\x41\xc5\x5c\xae\xa2\x2e\x57\xad\xe8"
- "\x8c\x43\xd5\x24\xb9\x3e\x23\xd6\x68\x13\xb0\x0c\xc4\x94\xc5\x95"
- "\x90\xc6\x71\xad\x8a\x42\xdb\x20\xb7\xd1\x90\x77\xbd\x8b\xa2\xbe"
- "\x54\xc5\x7b\xea\xe2\x3f\x77\x89\xba\x28\x3e\xfb\xdd\x2b\x01\xa3"
- "\x68\xd9\x73\xab\xbd\x9e\x8b\xd8\x54\xa3\x1c\x44\x4c\x43\x24\x9f"
- "\x86\xf9\xe1\xde\x74\xb8\xc7\xee\xe5\x1f\x0b\xb0\x7e\xf0\xac\x64"
- "\x66\xb3\x36\x30\x5b\x91\xde\xca\xeb\xe3\x28\x11\xfd\x04\xa4\x45"
- "\x8b\x69\x35\xa2\x2f\x91\x78\xb3\xc8\xb3\x4e\xef\x26\x74\x1d\x1f"
- "\xfd\x33\x59\x8a\x8f\x58\x59\xcc\x16\xbd\x3b\x43\x6c\x1f\xa6\x5d"
- "\xc3\xd3\xfe\x19\x85\x69\xf9\x5c\x0e\xeb\x29\xf3\x57\xff\xa8\x11"
- "\xfd\x15\xea\x97\x00\xbf\xc7\xa1\x8e\xe1\x6f\x28\xa3\x12\xcb\x37"
- "\x67\xb7\x61\x1f\x62\xa3\x45\x78\x67\x3f\xda\x03\xb4\x17\xda\x79"
- "\xdc\x6e\x68\xa7\xb0\xbf\x4e\xb4\x3b\x18\x87\xe0\x75\xc8\x57\x8d"
- "\xb6\xe8\x88\xf0\xde\x50\x3c\xd7\x88\xfe\xa0\x82\x72\xdf\xb5\xf1"
- "\x7b\xdf\xbb\x8a\xc5\x0a\x3f\xc4\xf6\x93\xd2\xa4\xfb\xc0\x6e\x1d"
- "\xc0\xfb\xf0\x7e\xc9\x7e\xa1\xed\x72\xa0\x6d\x62\xcf\x7b\x6f\xbe"
- "\xc8\x71\xd6\x6f\x90\xe2\xa2\x76\x41\x96\x17\xf7\x83\x66\x36\xed"
- "\xbd\x9d\xdc\x9e\xbd\x57\x8a\xf7\x32\xfc\xc0\x56\x66\x9e\xa6\x5f"
- "\x97\xa4\x10\x65\xf1\x09\xb4\x8b\x15\x46\x5e\xcf\xf7\x09\x6f\xc7"
- "\x7b\x9f\xb0\x76\x70\x9b\x5a\xc0\xeb\x52\x61\x2c\x6e\x63\xd7\xbe"
- "\xc5\xb6\xe0\xb5\x75\xb2\x6b\xb4\x5d\x07\xd7\xde\x57\xb0\x7a\x79"
- "\xdd\xe7\x6a\x4f\xea\x94\x1f\xcf\xe9\x02\x1b\xaa\x2a\xde\x20\xd9"
- "\xde\xf7\xb3\x79\x3d\xdf\xbf\x4d\xb2\xbb\x20\x97\x5a\xb4\xbd\xec"
- "\xda\x3c\x31\xcf\x14\xf1\x2f\xb3\xef\xef\x2f\xe2\x72\x8d\x10\x44"
- "\x79\xef\x17\xdb\xc1\xce\xfe\xa6\x3f\x24\x80\x6c\xdf\x4f\x94\x64"
- "\x2b\xff\x8e\xfa\x03\xcf\xd7\xe0\x6f\xc6\xfb\x0c\xd6\x87\x2d\xc4"
- "\x3c\x58\x27\xee\x23\xde\x9b\xe1\x1d\x53\x1f\x11\x76\x9f\x46\xbf"
- "\xc4\x63\xd5\xdd\x5f\x88\xe3\x33\xc4\x94\xf2\x77\xf0\x0b\xbb\xa2"
- "\x24\x1b\x43\x5b\x63\xa1\xcf\x7f\x18\xf2\xec\xba\x0a\xd3\x70\x0f"
- "\x61\x79\x1e\xb4\x4f\x6f\xb4\x59\xc4\x32\x77\x11\xc9\x6e\xa0\x2d"
- "\xa9\xb7\x1d\x16\x63\xba\x5d\x95\xc5\xa2\x2d\x39\x2e\xec\x7a\xd3"
- "\x33\x0e\xdb\xf5\xa6\xa7\xcd\xd8\xbd\xd7\xdb\x66\x40\xdc\xbc\xaa"
- "\x35\x77\xd7\x2a\x8f\x38\x00\xd2\xba\xb7\x1d\xbb\x12\x50\x47\xf1"
- "\x5c\x06\x66\x9f\xd8\x98\xd3\xee\xcb\xa4\x3a\xa3\xdd\x3c\xb9\x5c"
- "\x1a\xbf\xd8\xfd\x0e\xc6\x6a\x5e\xcf\xb3\x79\xd8\x4e\x7c\x9e\x54"
- "\x9e\x92\xe0\xbe\xfe\x20\x07\x1c\x73\xd9\x55\x2d\xda\xf9\xad\x1e"
- "\xb6\x52\xf4\x61\x68\x27\x3d\x7d\x55\x45\xa9\xa7\xaf\xda\xfd\x72"
- "\x67\x1b\xb9\x3b\xd9\x7f\x5f\xb5\x3b\x16\xed\x96\x64\x23\x3d\x6d"
- "\xc1\xee\xb4\x62\x8f\x58\x76\x97\x43\x8a\x65\xdd\x76\x74\x57\x1e"
- "\xda\x28\x78\x7e\x95\xf8\xec\x16\x8b\xf0\x9a\x55\x7a\x36\x5c\x8f"
- "\xaa\xd7\x02\x37\x73\x2b\x12\x80\x53\x0d\x62\x0c\xc8\x74\xb3\x8d"
- "\xed\xad\xfe\x7e\x04\xf0\x6f\x30\xf2\xcc\xa4\x3f\x41\x9a\xdc\xbe"
- "\xa2\xfa\xe4\x62\x49\xbe\x1f\xac\x90\xc7\x85\x45\x1b\xe8\x9a\xd6"
- "\xdc\x0f\xa6\xc9\xdb\x68\x80\xb4\x75\xe2\x18\x02\x93\x2d\x2b\xeb"
- "\x03\x5d\xc9\x06\xcf\xb6\xf1\x76\x7c\x30\x03\xdb\x81\x7d\x22\x78"
- "\x7e\x24\xc6\x3d\x10\xf3\xc1\xf7\x77\xb6\x96\x74\x70\xfe\x0d\xdb"
- "\xe9\x1c\x79\x7c\x55\xe1\x40\x5b\x29\xf6\x3d\x6b\x20\xde\x29\x90"
- "\x8f\xc5\x4c\xbe\x2b\x5e\x9b\x9c\x32\x5f\x9f\x36\xef\x06\xed\x7c"
- "\xfd\xfc\xb4\xf9\xb3\x17\xce\x5f\x36\x3b\x6d\xfe\x62\xfd\x98\x45"
- "\xb3\x1f\x9f\xff\x98\x76\xe9\xec\x54\x6d\x74\xfa\x55\xe9\x83\x89"
- "\x3b\xeb\xad\xda\xd9\xa9\xa9\x4f\x2d\x9a\x9b\xa8\xd5\xcf\x7f\xec"
- "\x9a\x94\xb9\xa9\x73\xd3\xb4\xb3\x53\x16\x3f\xa5\x4f\xd4\x5e\x95"
- "\x78\xed\x55\xd1\x37\x27\x0e\x96\x8f\xa1\x8d\xd2\x90\x16\xd7\xa9"
- "\xe6\xe6\x75\xa7\x88\x2a\x4c\x91\x9c\x12\x96\x3e\x5f\xcf\xc7\xed"
- "\x3e\xdc\x7b\xdd\x7a\x92\x8c\xe7\x44\xe2\x19\x63\x34\xf7\x83\x46"
- "\xf8\xab\xc4\x7c\xd0\x4e\x2d\x7c\x57\x41\xdd\x23\x5b\x73\x3f\x5c"
- "\x63\x11\x3e\x66\x7b\x61\x83\x2c\xb4\xd0\xb6\x48\x7a\xaa\xa6\x19"
- "\x62\xb6\x64\x5c\x47\x5c\x72\x8a\x84\x17\x2c\x21\x4a\xf8\xa8\xe1"
- "\xa3\xc1\x73\x24\xe1\x1e\x68\xb3\x49\xdc\x9f\xd9\x34\xc3\x3a\xe8"
- "\xeb\x70\xba\xe6\x6b\x71\x5f\x6b\xd3\x74\x69\x3c\x38\xee\x59\x12"
- "\x87\xfc\x3c\x2c\x98\xd8\xfc\xdd\x33\xc0\x65\x1c\x4b\x3d\xf9\xc1"
- "\x9d\x31\x10\x0f\x1e\x34\x0d\x67\xd7\xa6\xdb\x04\xa2\x86\x7a\x29"
- "\x3f\xce\x88\x26\x2f\xc2\xb3\x52\x23\x28\x6d\xcd\x35\x69\xa5\xf1"
- "\x34\x68\x83\x06\xda\xd2\xc8\xdb\xf1\x61\x3f\xd6\x8e\x0d\x34\x6a"
- "\xfd\x30\xa8\xdf\x0b\x58\x1f\xd3\x24\xa9\x0d\x50\xef\x46\x8b\xf0"
- "\x61\x25\xd4\x53\x83\xf5\xea\x6a\xac\x0f\xc7\xbb\xa0\x9e\x2f\xb9"
- "\x96\x80\xdc\x46\xf2\x73\x25\xd6\x15\x73\xfd\x83\xf6\xd4\x96\xc0"
- "\xf7\xfc\x13\x44\x6d\xc0\x33\xfe\x72\xae\xa0\x75\x36\x07\x31\x27"
- "\x35\x92\xb0\xa7\xa9\x95\xfe\xa3\xb9\x59\x6c\x93\x09\x6d\xc3\xdb"
- "\x0b\x1a\x95\xd8\x26\xf0\x15\xea\x92\x13\x3e\xc7\x16\x95\x2f\x5e"
- "\x4a\x6d\x74\x8b\x3c\xe6\xda\x33\x1a\x65\x82\xf1\xd6\xc9\x1c\x3c"
- "\x47\x6e\x0f\x70\xcd\x94\x24\xc6\xc6\x36\xda\x3e\x43\x16\x4b\x99"
- "\x90\x67\x36\x1f\x65\xab\xa4\xb2\xf1\x3c\x41\xbc\x87\xe3\xbf\xe7"
- "\x25\xb8\xc7\x2a\x2b\x3f\xd9\xbb\x7c\x2c\x13\xbe\x5b\xa5\xe7\xf0"
- "\x7e\xf8\x1e\x8c\x09\xac\xc0\x65\xab\x8f\xe7\x45\xbd\xb0\x81\xee"
- "\x37\x43\xfa\xba\xd3\x44\x09\x79\xc1\xdf\xb3\xf2\x1b\x40\xee\x63"
- "\xb1\xfc\x67\x2e\x25\x64\x15\xe4\x39\x99\x6b\x4a\xb2\xb1\xb3\xfd"
- "\xf6\x80\xfe\x57\xcc\xf2\x1e\xcb\x16\xf9\x7c\xab\x17\x9f\x63\x5e"
- "\xc0\x98\x70\x3d\x94\x0f\x1c\x5a\xf7\x33\xf8\x61\xf8\x7d\xed\x7a"
- "\xa2\xc3\xe7\xc0\xf7\x06\x1c\x0f\x69\xcd\xfd\x28\x46\x7a\x1e\x05"
- "\xfe\xe7\xbb\xf8\x18\x8c\xc8\xad\x31\x38\x7e\x9d\x95\x4e\xe9\xc7"
- "\x60\xdf\xb1\x8e\xc8\x31\xb8\x27\x4d\xe2\x14\x70\x7d\x3f\xe3\x55"
- "\x38\xd1\xd1\xdc\x3d\xf6\x92\x61\x90\x0f\x78\x55\x0c\x7c\x42\x5e"
- "\x41\xde\xad\x12\xa7\x80\x6b\x0d\x98\x0f\xea\x30\xb8\x72\x59\x8c"
- "\x12\x6d\x64\x93\xf0\xf1\x25\xc8\x31\xfa\xb7\x07\x1a\xe9\xaf\x1f"
- "\x16\xf7\x70\xff\xf8\x12\xb3\x9d\x63\xe0\x96\xfb\x47\xcd\x32\xb9"
- "\x37\x00\x8f\x07\xa3\x9c\xf9\x58\xf5\xc7\x97\x40\xdd\x1a\x58\x2c"
- "\xbe\x02\x30\x60\xbe\xea\xa3\xfd\x78\xbf\x28\xc3\x5a\xb7\x0c\x3f"
- "\x8e\xee\x4a\x86\x5e\xb2\x53\xf2\xb3\x05\x3f\x1e\x8f\xba\x02\xf7"
- "\x24\x4a\xe7\x05\x76\x85\x25\x3c\x43\xa9\x5c\x4f\x54\xf8\x8c\xea"
- "\x70\x96\x7f\xbd\xf4\x8c\x75\x20\x6b\x6b\x56\x52\xb7\x7c\xae\xde"
- "\x4a\x08\x8e\x89\xe3\xfd\x51\xe1\x28\xdf\x8f\xf7\xbb\xef\xa7\x36"
- "\xef\xfb\xaf\x7a\xcc\xa3\xae\xec\x03\x75\x6d\x7e\x71\x18\xf0\x88"
- "\xd5\xb7\x3a\xbc\xbb\xfa\x46\x69\xb9\x9f\x34\x8d\x42\x7e\x57\x4f"
- "\x36\x6f\x24\x04\xd3\xc4\xdf\xe3\x4f\x82\xef\xf1\x1e\xdf\xf7\x3d"
- "\xdf\x50\x6d\xf0\x9c\x6f\xa8\xce\xf0\x35\xdf\xe0\xf5\xdc\x4f\xf0"
- "\xb9\xae\x92\x69\x0a\xd9\xb3\x77\xba\xba\x78\xb6\x74\xff\xb5\x5b"
- "\xe5\xfd\x99\xbd\x97\x61\x1d\xea\xf1\xfc\xf5\xcb\xa7\x29\x28\x94"
- "\x53\xcd\x7c\xf8\xde\x08\x1e\xbf\x60\x5c\x54\x6d\xc7\x3c\xde\xed"
- "\xe8\xf8\xa7\x0a\xc7\xf1\x15\x72\x9a\xfd\xe8\x7f\x0f\xd1\xe0\xdf"
- "\x2b\x12\xa4\xcb\x82\x47\x66\x42\xbb\xf8\xa1\x26\x44\xcb\xf2\x53"
- "\xf8\xc7\x93\xc4\xdf\x56\xf6\x43\xd9\x91\xbf\xe3\x7a\x2f\xfe\x0d"
- "\xe2\xf5\x65\xe5\xd9\x89\x42\x7c\x5e\xba\x2c\xc7\xc4\x6e\xee\xa6"
- "\x44\xba\xa5\xab\x7f\xd8\xe3\xcd\x9e\xd6\x1f\xca\xdb\xc8\x32\x53"
- "\xea\x10\xcb\x97\x7e\x53\xf9\x6f\x4c\xf1\xfc\x0d\xff\xfa\xcd\x90"
- "\x3d\xe0\x8a\x7e\x89\x6c\xb9\xd2\x6f\x6a\x3b\x92\x84\xad\x1a\xf9"
- "\x23\x35\x24\xbb\x3f\xfb\x12\x86\xff\xb1\x43\x79\x3a\xb8\xae\xad"
- "\xea\xc8\xf0\x2b\xdb\x4a\x59\xf6\x7d\xbc\xfa\xa3\x54\xdd\xb4\x31"
- "\xd0\x7f\x23\x65\xdf\xaf\xe0\x7f\xae\xac\xe9\xc3\xf2\xbb\xff\xa7"
- "\x6d\x18\x24\x7d\x75\xd3\x63\xd4\xa4\xae\xb2\xba\xe5\x3f\xaa\x5c"
- "\x4a\x92\x33\xd4\x7d\xfd\xb7\x3a\xcf\xdf\xbf\xb3\x7b\xfe\xbe\x3a"
- "\xb6\x2f\xaa\x6e\xc2\xff\x64\x59\x86\x12\x32\x3a\xbc\x23\x31\xcc"
- "\x4b\x65\xc2\x0a\xbc\x54\xc8\xfd\x4f\xac\x4d\x3f\xa8\x4f\xa1\x2c"
- "\x59\xd9\x75\xee\x33\xf3\x6f\xf8\x4a\x51\x21\xae\xb0\x6a\x3a\x5d"
- "\xbc\xc3\x2b\x0d\x7f\x0f\xd0\x8a\x69\xd7\xef\xe9\x94\x9f\xa5\x69"
- "\x65\xbf\x15\x31\xf0\x9f\xad\x60\x59\x13\x3a\xe7\xbd\xf8\xef\xe2"
- "\x3f\x3f\xfe\x29\x50\x3f\x2e\xfe\x3b\x43\xff\x28\xf7\xe2\x60\x89"
- "\xd8\x1f\xfc\x1f\xed\x30\x94\x54\xbc\x40\xc5\x04\x2a\x7e\xe9\x13"
- "\x3f\x7e\xf1\xdf\xc5\x7f\x17\xff\x5d\xfc\x77\xf1\xdf\xc5\x7f\x17"
- "\xff\x5d\x00\xff\x14\xf2\x8e\x35\xf6\x4f\x07\x8a\x7f\xe5\xfd\x1f"
- "\x85\xf8\x91\xa7\x09\xbd\xb9\x8f\x8a\xff\x48\x76\x8c\x49\xbb\x75"
- "\x96\x45\x53\x10\xdf\x10\x5d\x99\x6c\x55\xad\x89\xad\xd1\x95\x25"
- "\x35\x47\x6c\x4c\x68\x1c\x57\x95\x6e\x57\xae\x9a\x58\x1d\x65\x4c"
- "\x6c\x0a\x5f\x3f\x6d\xff\xd8\x9d\x69\x36\x75\xde\xa4\xda\x31\xe5"
- "\x0b\x5b\x22\x0b\x67\x1c\x1c\xbf\x2b\xc3\x21\xe4\xdc\xf9\xd1\xa8"
- "\xbf\xcf\x39\x3c\xec\x85\x07\x3f\xbf\xe1\xad\x94\x13\x83\x73\xef"
- "\xff\xf4\xea\x57\x17\x1c\x1d\xbe\xf9\xaf\x5f\xde\xfa\xde\xb2\xb6"
- "\x01\xab\xef\xf9\x7f\xbf\xdd\x3e\xef\xc8\xa5\x1b\xfe\xfc\xaf\x9b"
- "\xff\xb1\xe4\x54\x68\xfe\x94\xfa\x6b\x5f\xd7\x1f\x1f\x59\x3c\xf3"
- "\x3f\xb7\x7f\x90\xe9\x52\xac\x9c\xb0\xe7\xca\x97\x67\x7f\x3d\xf4"
- "\xf9\xa9\x9f\x5d\xff\xe6\x93\x3f\x0d\x5a\x7b\xdf\x27\xa3\x5f\x99"
- "\xff\xfd\x65\x9b\xa6\x7f\x71\xcb\xbb\x4f\x9f\xee\xff\xec\xdd\x7b"
- "\xaf\x2a\x9d\xfb\xed\x25\x2f\x3d\x74\xe0\xa6\x77\x9e\xfa\x39\xc4"
- "\x30\xb9\xee\x9a\x8a\x45\xc7\x46\x14\x3d\xf2\xd5\x6d\xbb\x57\x38"
- "\xfb\x3d\x73\xd7\xc7\xbf\xd9\xf6\xd8\x37\xbf\x7a\xf1\x4f\xff\x73"
- "\xe3\xdb\xa9\x27\x87\x3c\xf7\xc0\xbe\xdf\xbf\xf6\xc4\x0f\x97\x6f"
- "\x79\xf8\xdf\x7f\x7c\x7f\x79\xfb\xc0\xff\xba\xf7\xbf\x7f\xb7\xe3"
- "\xf1\xef\x7e\xfd\xb7\xbf\xfc\xef\x1f\xfe\xb9\xb4\x35\x6c\x5d\x9c"
- "\xf9\xba\x37\x16\xff\x78\x45\xc9\xa3\x87\xee\xf8\x30\x8b\xf6\x46"
- "\x7e\x44\x68\x7a\xec\x6c\xe3\xc6\xff\xac\x5e\x13\xcc\xfd\x54\x50"
- "\x88\xb8\xf3\x84\xec\x9b\x88\x42\x45\x06\x28\x83\xe8\x29\x04\xdb"
- "\x5e\x1f\xff\xb4\xf2\xfb\xfd\xf9\x87\xef\x89\xe1\xda\x8d\x1b\xe1"
- "\x73\x39\x4b\x71\xf7\xfe\x47\xf9\x59\xc6\x99\xff\xa7\x80\xb6\xf7"
- "\x83\x9a\xf5\x27\x03\x40\x5a\x2a\x32\x88\x0c\x26\x43\x88\x9a\x84"
- "\x90\x50\x12\x46\x34\x64\x28\x19\x46\x7e\x45\xc2\xc9\x25\xe4\x52"
- "\xf2\x6b\x12\x41\x2e\x23\xc3\xa1\x35\x91\x64\x04\x19\x49\xae\x00"
- "\xa1\x5c\xd9\x75\x5b\xb2\x49\x4c\x04\xfc\x07\xfe\x1f\x4f\x62\xd8"
- "\xef\x59\x17\xd3\xcf\x6a\xba\x49\x4c\x6f\x10\xd3\x2d\x17\xd3\xcf"
- "\x6a\xba\xf6\x1c\xff\xbd\xf2\x9c\xfe\x55\x40\xc8\xc0\xa3\x06\x8f"
- "\xd8\xa1\xe3\x9f\x77\xaa\x42\xfc\xd7\xf1\x9b\xf4\x70\x7f\xa7\xf2"
- "\x3c\xef\xf7\xfe\x17\x03\x9f\xb1\xfc\x6b\x16\x21\x7c\x9e\x81\xca"
- "\xff\x39\x36\x28\x3e\x52\x0e\xcd\xc6\x29\x13\x15\x09\x67\xff\xed"
- "\xf9\x5f\x69\xd4\xff\x1f\x10\x03\xcb\xf9\xa5\x36\x40\x6c\x0f\xc4"
- "\xde\x40\x1c\x0a\x33\x9b\x81\x91\xe9\x0e\x03\x68\x4f\x35\x23\x73"
- "\x05\x03\x68\x5f\x1b\x23\xab\x0b\x03\x23\xfb\x11\x06\x46\xb6\x16"
- "\x06\x46\x4e\x16\x84\xe3\x85\x14\xe0\xae\x64\x14\x80\x8a\x03\x85"
- "\x18\x45\x56\x20\x59\x46\x6a\x7d\xb6\xc3\x35\xc4\x43\xc1\x50\xcf"
- "\x44\xcf\xd4\x40\x41\x57\x57\xc1\xc8\xc0\xd0\x40\xdf\xc0\x44\xdf"
- "\xd0\x4c\xc1\xd0\xd8\xca\xd8\xc0\xca\xc0\x5c\x21\xb7\xb2\x28\xd3"
- "\xd0\x20\x3d\x55\x21\x2d\xb3\x28\xb7\x3c\xb1\x28\x95\x08\x3f\x93"
- "\x01\x40\xbe\x93\xfd\x0b\x71\x26\x72\x0c\x31\x02\x6b\x10\xa6\xb3"
- "\x19\x0c\x4c\x0f\x25\x18\x10\x32\x1a\x50\x8c\x0a\x18\xbb\x2e\x30"
- "\x30\xb6\x5f\x61\x60\x6c\x76\x60\x60\xac\xf5\x61\x60\x2c\xfd\xc1"
- "\xc0\xb8\x02\x28\xb6\x74\x0f\x03\xe3\x42\x01\x06\xc6\xd9\x2c\x0c"
- "\x8c\x93\x67\x60\x8a\x6d\x5c\x03\x11\x3b\xab\xc3\xc0\x78\x22\x81"
- "\x81\xf1\x90\x05\x03\xe3\xae\x09\x10\xb1\x1b\x40\x35\x97\x0d\x68"
- "\xe3\x69\xb2\x01\xa9\xf1\xcc\x08\x00\x88\x5b\xe8\x95"
+ "\xbf\xff\x7f\xff\xfc\x09\x34\xe6\xbc\xc9\x4c\x1f\x57\x13\x75\xb9"
+ "\x2d\xc3\x7c\xa4\x15\xbd\xba\x51\x84\xf0\x2a\x01\xe3\xfc\x30\xbe"
+ "\xf2\xef\x25\xa4\x99\xaa\xc9\x72\x63\x1a\xa5\x89\x57\x6d\xa6\x09"
+ "\x5b\x88\x36\x0d\x11\x1d\x1b\x5f\x11\xfe\xc6\x52\xa2\xc3\xdb\xf0"
+ "\xfc\x8a\x68\xdf\x38\x44\x04\x00\xa7\xc0\x47\xf9\x9b\x18\xce\x6a"
+ "\x3c\xaf\x46\x3a\xd2\x4a\x7c\x54\xb0\x86\xd3\xaa\x50\xce\x48\xf7"
+ "\xae\xb9\x48\x8d\xf6\x10\x55\x31\x1c\x7b\x98\x26\x0e\x97\x78\x6c"
+ "\x45\xde\x54\xce\xbb\x6a\x08\xea\x4d\x27\x72\xbf\x22\x82\x11\x38"
+ "\x58\xb8\x1e\xae\x5b\xcf\x7f\x34\xa6\x3e\x3f\xd2\xda\x8c\xfa\xfa"
+ "\x81\x91\xc6\xe5\xb9\x0d\xf6\x6f\x51\xe2\x49\xba\xfa\x3a\x86\xc9"
+ "\xb8\x09\x37\x59\xbc\xdd\x21\x3a\x49\xc9\x99\x9d\x6e\x4a\x3c\x0c"
+ "\x6a\x6c\x78\x45\xa6\x27\x7a\x03\x21\xb2\x97\x51\x02\xde\x4d\xc5"
+ "\xd5\x84\x72\x03\x99\x3e\x33\x6b\x29\x83\xeb\x06\x5c\xb3\x30\x79"
+ "\x12\xea\x07\x13\x31\x8d\x02\x26\xba\x39\xe0\xa6\x84\x2e\x77\x32"
+ "\xda\x6f\xc9\x94\xed\x47\xbd\x28\x6b\x3e\x49\x29\xff\x30\x21\x3f"
+ "\xea\xf4\xdb\x97\x33\x0e\x29\x9f\x08\xb7\xc7\x64\xc0\xd1\xdc\x9e"
+ "\xab\xeb\x5e\x22\xea\x74\x9b\x26\x07\x4c\x56\xa1\xc3\x39\x60\xc0"
+ "\xe1\x7c\xa8\x2b\x95\xeb\xea\x74\x9b\x5f\x8a\xc8\xe3\x33\xf2\x00"
+ "\x6f\xff\xe8\x00\x25\x32\xce\x27\x28\x25\x9b\xeb\xd3\xdb\x62\xe6"
+ "\x3a\xbc\x4b\x42\xe4\x45\xdf\xa3\xee\x74\xb4\xd5\x7e\x38\x48\x04"
+ "\x98\xd7\xd4\x97\x11\x31\x7c\xe0\x6f\x57\x30\x53\xc6\x18\x30\x19"
+ "\x46\x6f\x5b\xdd\x9e\xc1\xf5\x12\x47\x6e\xab\x85\xf4\xbc\x05\x91"
+ "\x38\x32\x5c\xb4\xe5\x7a\x6e\x4b\x23\x38\x4a\xcf\xb3\xa6\x97\x1e"
+ "\xbd\xed\xbf\x3a\x27\x06\xb6\x4d\xc1\x4e\x00\xec\x04\x8f\x5e\xae"
+ "\xb7\xfd\xbe\x98\xfc\x2a\x6f\x5a\x72\xc0\x24\x74\x3a\xa4\xb4\xf7"
+ "\xe5\x4d\xde\x14\x99\x17\xf8\x98\x14\x6d\xc9\xe4\xa3\x94\x56\xb4"
+ "\x33\x11\x79\xa6\xa0\x1f\xed\xfa\xfb\xeb\xf4\xf7\x36\xbc\xbb\x5b"
+ "\xc1\xbb\x3a\x3b\x02\x5e\x1a\xc3\x8b\xe4\x2d\x25\x51\x66\xfc\x92"
+ "\x60\x20\x5f\x85\xdf\x00\x8b\xc1\x6f\x8b\x6d\x42\x73\x7d\x03\x6d"
+ "\x5a\xbb\x1d\xb4\x10\xe4\x75\x06\xc9\x3e\x94\x5c\x27\xe8\xea\xdd"
+ "\x80\x4f\x1b\x96\x93\xc5\x55\x2c\x82\x5e\x67\x07\xb5\xf8\x3b\xc8"
+ "\xe5\x87\x6c\x84\x2e\x50\xd9\x05\xf0\x62\xe8\x0c\x95\x3d\x4b\xb6"
+ "\xc6\xd2\x2f\x28\x1e\x2f\x6b\x26\x41\xae\x61\x5c\xb6\x8d\x5a\x6a"
+ "\xdb\xc8\x55\x1b\x5d\xd6\x75\x03\xd9\x9a\xf1\x8c\x3e\xb7\x32\x1e"
+ "\x2c\x6f\xa1\x94\xed\xf6\xd2\xd7\xc8\xec\x1a\x4e\xa6\xe6\x42\x8f"
+ "\x8e\x4b\xaa\x93\x71\x59\x73\x9a\x2c\x6f\xcc\x03\x1f\x9e\x66\x7c"
+ "\xdf\xb6\xbf\xb3\x3c\x68\x3a\x6c\x9b\x42\x87\x6d\xc7\xa9\xd1\x36"
+ "\x8e\x1a\x9d\x13\x69\xc3\x69\x4a\x3d\x1c\x1c\x4b\x8d\xe6\x7b\xa9"
+ "\x31\x63\x22\x79\x3b\x70\x0f\xf9\x3d\x6c\x0b\x90\x7d\x09\xf3\x53"
+ "\xaa\x63\xd3\x53\x64\xf1\x29\x98\xa0\x5d\x6a\xc9\xa1\x12\x22\xa6"
+ "\x1d\x3f\xc7\x6b\xc7\xe2\x6f\x90\x0d\xf8\xb5\x03\x97\x1f\x02\x97"
+ "\xb7\x33\x6c\x94\x05\x9c\x07\x78\x6b\x42\x64\x2e\xa5\xe4\x7e\xe4"
+ "\x38\x5d\x03\xef\x41\x76\x3b\xea\xa0\x4f\x58\x7e\x3b\x57\xe4\x41"
+ "\x27\xa4\x42\xfe\x53\xd7\xe8\x32\xd0\xe1\xfa\x15\x99\x3b\x97\xe6"
+ "\x25\xd4\xbf\x22\xda\xba\xdc\x03\xc9\x78\x07\x59\x6c\xc3\xfb\xf6"
+ "\xd1\xe9\x94\xe6\x0d\xe5\xd0\xc1\xee\x76\x96\xc7\x8e\x41\x01\x4a"
+ "\x60\x78\x56\x27\x64\x67\x09\x25\x01\x9f\x3f\xd7\x23\xfd\x3b\xc8"
+ "\x87\xf2\x39\x3e\x7a\xb9\x83\xcb\x8b\xeb\x1f\x0d\x68\xd7\x3f\x7a"
+ "\x41\x7b\xf5\xd1\x4e\xf1\xea\xa3\xe7\xc3\xaf\x3e\xfa\x0f\xd7\x32"
+ "\xb2\x84\xaf\x7f\xd4\xdf\x52\x2c\xfb\x20\xad\xa5\x18\x7d\x10\x26"
+ "\xcb\xca\x33\x94\xf6\xf8\xb3\xe8\xfb\xd0\x67\xb4\x72\x3e\xd9\xb4"
+ "\xe4\xb7\x5a\xbd\xa1\x4f\xe9\xf1\x52\x12\xb8\x6f\x8f\xd7\xbe\xce"
+ "\x94\xb7\x0b\x0c\xd9\x42\xbd\xfb\x7d\xa6\x6d\x36\xae\xd7\x9f\xbc"
+ "\xb7\x00\xbf\x42\xfc\x1c\xf8\x15\x89\x94\xb7\x8b\x40\x2b\xd7\xa0"
+ "\x55\x09\x54\xd7\x4d\x34\x5a\xa3\x84\xd3\x34\xf0\x18\xf0\x4f\xeb"
+ "\x87\x6e\xc3\xb4\xb5\x9e\xea\x9b\xcb\xa9\xac\xab\xcb\x41\xac\x0b"
+ "\x59\xff\xb1\x3e\xec\x72\x0f\xb2\xa3\x9e\x3c\x29\xbf\xaf\x40\xc7"
+ "\xa4\x78\xaa\x91\xde\x1e\x58\xe1\x48\xf0\xaf\x70\x98\x3a\x53\x3c"
+ "\x1b\x91\x67\x22\xf2\x54\xeb\x34\x6c\x67\x58\x90\x2d\xff\xc0\x10"
+ "\x25\x02\x66\xf1\x7b\x17\x5b\xcd\x5b\x5e\x11\xc7\x91\xaf\xa8\x17"
+ "\x16\x60\x03\x0e\xe8\x3f\xa8\xdc\x48\x03\xad\xdb\xd6\x23\x1f\x97"
+ "\xf7\x06\x73\x78\x4c\xf1\x79\x8b\xda\xc9\x1a\xa2\x14\xd1\xa3\xea"
+ "\x43\x9e\x76\xd6\xe9\x03\x83\x74\x55\x97\x9b\x66\x30\x6c\x2e\xe7"
+ "\xed\x68\x27\x94\xdb\x28\x5c\x0e\x13\xd2\xa7\x75\x09\x47\xc2\x1a"
+ "\xa4\x1f\x46\x79\xbd\xee\x76\x03\x47\xae\x83\xfb\x5a\xe2\x09\x7e"
+ "\x38\x5c\x14\xa4\x81\x35\x94\x88\x72\x33\x19\x1e\xc3\x02\x1f\xf8"
+ "\xd0\xd6\x8d\x87\x8b\xfc\xa4\x89\x28\x98\x3e\x05\xcf\x9a\x1d\x05"
+ "\x0f\xe9\x02\xf0\x98\xff\x1a\x51\x66\xe0\x56\x09\xef\xc1\xf7\x34"
+ "\x86\x17\x24\xb3\x5d\xe2\xfb\x53\x86\xd1\xc5\xfa\x03\x30\x3d\x4b"
+ "\xee\xa1\x0e\xb2\x6e\xf5\xbb\x1c\x89\x2d\x18\x37\xb9\xfc\x3b\x65"
+ "\xed\x49\xa2\x33\x2f\x91\x79\x8e\xdf\x7b\x43\xe7\x39\xcf\x2a\xd1"
+ "\xe9\x48\x1c\xd8\x01\x5d\x84\x3c\x28\xef\x64\x3c\x23\xfb\xf2\xc1"
+ "\x49\x3f\x1d\x47\x3f\x9d\x38\x79\xe2\x38\x9a\x3a\x7e\xc2\x38\xca"
+ "\xfa\xe1\xa8\xac\x31\xdf\xfb\xc1\xf7\xe4\xcd\xf7\x7e\x90\xfd\x3d"
+ "\x9a\xf1\xb3\x07\xc7\xd1\x8c\x69\xe3\x68\x26\x7e\x33\x66\x4e\x7a"
+ "\x70\xe2\xa4\x99\xe3\x28\xef\xde\xc9\x78\x9a\x30\xee\xf6\xac\xfb"
+ "\x46\xcd\x98\x30\x79\x12\x3d\x30\xeb\x8e\xac\x3b\xee\xa0\xf1\x93"
+ "\xa6\xdc\x9e\x95\xa5\x5f\x6f\xcf\xe2\x2c\x8f\x64\x4f\x9a\x39\x6a"
+ "\xc6\xa2\x85\x25\x0b\x47\x4d\x9b\x3c\x81\x53\xa0\xdd\x22\x78\x28"
+ "\x33\x7c\x51\x63\x5a\x07\xc4\xb9\x5c\xd2\xa0\x3b\xea\xc0\x03\xf8"
+ "\x75\x78\xca\x4e\x40\x07\x5c\xf3\x5c\x1d\xf7\x9d\x1c\x03\xac\x07"
+ "\x20\xf7\xe6\x2e\x77\x5a\x29\x68\x78\x94\x69\x68\xbf\x91\xf5\xc4"
+ "\xf5\xef\xe3\xdd\x21\x7d\xac\x49\xc2\xfb\xda\xe8\xf7\xd7\x42\x07"
+ "\x5b\xff\x4f\x8b\x9d\xc8\x8b\x1f\xe8\x1e\x80\x2e\x04\x7d\xfd\xd4"
+ "\xe9\xca\x4b\x02\x7f\x27\xa0\x8e\x36\xc8\xe6\x51\x94\x6d\x8d\x90"
+ "\xf9\x36\xf4\xcf\x51\x1e\x57\xce\x52\xda\xbb\x2d\x25\x39\xc4\xfd"
+ "\xe4\x2d\xd1\x61\x5c\xe8\x85\x91\x22\x61\xa0\xef\x01\xe7\x98\x82"
+ "\x73\x8d\x3d\x42\x3f\xf8\x18\xce\x06\xbc\xd3\x61\x5d\x68\x81\x9e"
+ "\x80\x1e\xbf\x55\x73\x65\x92\x48\xd9\x9e\xa9\xf5\x64\xca\xb1\x12"
+ "\xe5\xf2\x22\xf8\x3a\xd0\xe8\x44\xbe\x37\x72\x13\xc0\x07\x09\x18"
+ "\x7f\xd1\x96\xb4\x42\xf0\x77\x20\xbc\x76\xef\xb3\xe2\x5c\x1e\xdb"
+ "\x11\x57\x9d\xa4\xc1\x7f\x46\xfb\x9a\xb4\xb5\x7b\x8b\x45\x97\x4c"
+ "\x63\xba\xed\x17\xfc\x9c\x82\x7c\x3d\xbd\x69\xef\x73\x1a\xf8\x20"
+ "\x91\xe5\x55\x08\x99\x8e\x31\x73\xf0\x32\xe8\xb4\x56\xe4\x2d\xe6"
+ "\xbc\xa3\x43\x34\x00\xba\xc6\x66\x77\x25\xd0\x09\x1a\x4c\x5a\xca"
+ "\xde\x45\x11\xf5\x01\xce\x60\x1e\xa4\x98\x1f\xcd\x5d\xe7\x00\xa7"
+ "\x53\xa6\xc3\x8e\x19\xfc\x18\xe0\x2f\x66\x5d\xa9\xf4\xf7\xf5\xff"
+ "\xce\xf9\xf4\xb1\xb9\xef\x19\xb2\xae\xe0\x5c\xff\xef\x87\x41\x4b"
+ "\xb6\x17\xd8\xfe\xeb\x72\x0f\x9e\xe5\xa3\x81\x7e\x35\x36\x5e\xdf"
+ "\xca\x79\x35\xe0\x28\x52\x93\xb8\x2d\x25\x9e\xe5\x1d\x74\xb2\x98"
+ "\xc7\xda\xc1\x69\x9a\xcb\x41\xd1\x38\x5d\xd3\xc4\xf8\xb3\xfe\x00"
+ "\x2d\x3e\x05\x1f\x24\x03\xde\xb6\x68\x3e\x18\xec\x01\x9c\x67\x81"
+ "\x5f\x2b\xda\xf4\xac\x8f\xae\x39\xa2\x75\x3a\x50\x2f\x99\x20\x57"
+ "\xd0\xe7\x7d\x30\xf4\xf2\x6d\xd1\xe5\xaf\xa9\xe0\x72\xc8\x9f\xd4"
+ "\xd5\x29\xf3\xaf\x63\x9a\xeb\x7c\x07\xbe\xbc\x36\x3d\x86\x2f\xb7"
+ "\x00\x97\xff\x88\x78\x3f\x26\xe6\xfd\x2a\xbc\xff\x4f\xfd\x3d\xe4"
+ "\xfe\xda\x59\x31\x7c\x5b\x8c\xf7\xa7\x80\x6f\x00\x72\x0d\xdb\xe2"
+ "\x9a\x5c\xf0\x98\x3f\x22\xff\x9a\x98\xfc\x5b\x91\xff\xbf\x98\x6f"
+ "\x78\xcc\xe1\xfc\xf5\xba\xec\x20\xbf\x05\xf9\xf7\xc4\xd4\x3f\x07"
+ "\xf9\x03\x11\xf8\x1d\x8b\x7e\x9f\x5e\x8b\xf7\x5f\x32\xaf\xc3\x26"
+ "\x4a\x42\x9e\x01\xac\x4b\x58\x8f\x1d\x2e\xe2\xfe\x4a\x37\xc7\xe4"
+ "\xcf\x40\xbe\x54\x9d\x46\x26\x9d\x46\xb9\xdc\x8f\xa8\xe3\xb8\xc2"
+ "\x21\x3d\x3b\xa6\x4c\x1e\xca\xa4\x83\x8e\xcf\x1a\x7c\x19\xa7\x4c"
+ "\x51\x4c\x99\x75\xdc\x8f\x42\xd5\x63\xee\xea\xe9\x2b\xa3\xeb\xc8"
+ "\x48\x18\xdc\xb6\xab\x01\x63\x77\x34\x8c\x21\xed\xa8\x77\xd8\x7a"
+ "\xa5\x77\xae\x06\x0f\xdd\x81\xb4\x7f\x07\xcc\xe7\x58\x06\x20\xab"
+ "\x01\xaf\x3f\x48\xc2\x95\x9b\xaa\x78\xf7\xba\x6b\x06\x85\x88\xef"
+ "\x47\xf1\x3d\xc3\x16\x5d\x53\x74\x99\xbc\xee\x1a\x5c\x91\x9e\xce"
+ "\xf6\x5b\x02\xeb\x60\xd1\xf5\x13\x4d\xc1\xbc\xee\x4e\x61\x22\x13"
+ "\x9e\xc3\x7a\x1d\x7f\xc6\x73\x02\xf0\x5f\x84\x31\x87\xc4\x52\xe4"
+ "\x5b\x4e\x13\x90\x7e\x48\xca\xaa\xca\x27\x9f\x55\x1d\xb9\xcc\xdf"
+ "\x63\xf0\xfc\xbe\x5e\xfe\x5d\x86\x87\xfb\xdb\xf5\xfb\x84\x30\xc3"
+ "\x3a\x67\xc8\xe0\x90\x37\x65\x39\xc8\xa1\x84\x8f\xf2\x62\xa9\x7c"
+ "\xc7\x30\x5f\xc6\x75\x32\xae\xab\x70\x7d\x00\xd7\xc7\x5c\x5f\x92"
+ "\xcd\x15\x96\xf2\xc8\xcf\x93\x71\x7d\x10\xd7\x3b\x71\x9d\x89\xeb"
+ "\x70\x5c\xef\x41\x1b\xc2\x2c\x17\x18\x47\x79\x8e\x15\xc0\xb8\xaa"
+ "\x78\x8b\xe7\x00\x5d\xb9\x4c\x83\x49\xc8\xd3\x2e\xe5\x55\xe9\x17"
+ "\x8b\xea\xc7\xeb\x3a\x64\x5a\x8a\x4c\x1b\xa0\xf8\x41\xa5\x85\x0d"
+ "\x3d\x74\xae\x2f\x4d\xd7\x4d\xba\x2c\xea\x69\x0a\xfe\x0c\xc0\xf7"
+ "\x30\xae\x42\xc1\x4a\x52\x7d\xae\xc3\x57\xe5\xcc\x71\xea\x4c\x88"
+ "\xac\x13\xd7\x4d\x2e\xa7\x10\xb8\x96\x73\x1f\xf9\x68\xc8\x6e\x21"
+ "\xf9\x1e\x63\xac\x82\x37\x5b\xcf\x37\x86\x69\x2c\xcb\xcb\xf4\xf4"
+ "\xa3\x11\xbc\x34\xb8\xcb\x3d\x24\x14\x23\x47\x59\xe0\xa5\xdb\x98"
+ "\x67\x98\xee\xdc\xb6\x41\xc5\x72\x1c\x97\x6d\x91\xf0\xcf\x29\x9e"
+ "\xac\xd3\xe7\xad\x4a\x7e\xaf\x9f\x18\xa3\x5f\x24\xcf\xc6\xc8\x7b"
+ "\x07\xd3\x3c\xb1\x94\xe5\xe0\x7a\xcc\xff\xde\x19\x26\x6d\xc6\xb5"
+ "\x7b\x97\xf0\xfb\x00\xfa\x98\xeb\x4d\x2c\xe6\x76\x5c\xbf\xc9\x78"
+ "\x2f\xdf\x25\x1f\x4a\x63\xfe\x4e\x2c\x92\xef\x76\x63\x3c\xda\x6f"
+ "\xbc\x33\xea\x49\x2c\x91\xef\x9a\xfa\xe0\x6e\xcf\xd5\xe1\x26\xc6"
+ "\xb3\xf9\x44\xc5\xf6\xec\x51\x44\xa6\x5b\xcb\x29\xc9\x1b\x3a\x46"
+ "\xd3\x43\x22\x3c\xaa\x9c\x92\xbd\xa1\x5d\x74\x0b\xd1\x35\xde\xd0"
+ "\x71\xba\x95\x68\xb8\x37\xb4\x09\x36\xc8\x36\x7e\x7f\xf0\x66\x4a"
+ "\x48\xc0\xd5\x75\x53\xb9\x29\xc1\x1b\x2a\xa1\x8c\x72\x33\xae\x45"
+ "\x74\x6f\x92\xe8\xf2\x86\xa6\x20\x5f\x21\x4d\x0f\x8b\x73\x13\x93"
+ "\xc4\xdf\xf2\xc3\x94\x36\xe5\x79\xe1\xf2\x86\x30\x1f\x08\x35\x21"
+ "\x5d\x13\xd3\xc3\x5f\xe2\xd7\x25\xb4\x8a\xed\xb9\xd3\xc3\xe7\xc4"
+ "\x84\xe7\x0f\xe2\xf9\x6f\x02\x7d\x24\xbc\xa1\xb1\xd4\x12\x08\x20"
+ "\x9f\x4b\x88\xca\xed\xd9\x8f\x5f\x30\x51\x0f\x6c\x08\xad\x72\x7b"
+ "\x2e\xda\x92\xd7\x83\x76\x60\x7c\xfd\x59\xcf\x0a\x5c\xd7\x6e\xff"
+ "\xa9\x7c\xae\xd8\xee\x10\x96\xed\x79\xb7\x61\x72\xc5\x6d\xf0\x86"
+ "\xda\x28\x1f\xd3\x83\xe9\xcb\xfc\x82\xf1\x1f\xb4\x8a\xe7\x56\x63"
+ "\x09\x7d\x60\x9d\xbe\xcc\x25\xf0\xce\x22\x92\xb7\xe7\x79\x43\x1d"
+ "\x84\x3a\x1c\x80\x37\x57\xc2\xab\xd8\x5e\x81\xbc\x7e\xce\x17\x09"
+ "\x87\x61\x70\xde\xe9\x61\xb2\x22\x7f\x45\x4f\xf2\x76\x27\x7e\x35"
+ "\xf8\x1d\x41\xd9\xbf\x0a\x77\xfa\x21\x81\xf1\x1e\xe5\xdb\xf1\x1c"
+ "\x0c\x42\x86\x25\x2d\xc3\x34\x00\xf9\xdb\xc1\x2f\x13\xc1\x77\xc0"
+ "\x77\x87\x4d\xe2\xbb\x76\xc7\xf5\x41\xd9\x8e\x1d\x43\x54\x3b\x76"
+ "\x5c\xc7\xe9\x9d\xb0\x75\x70\x9f\xdd\xa9\xde\xfd\x00\xe5\x66\xc9"
+ "\x72\x15\x3b\xb2\x85\x65\x47\x6e\x10\xf2\x05\xba\x96\x33\x1d\x41"
+ "\xd7\x72\xa6\xa5\xa8\xdc\x91\xed\x75\xae\x23\x91\xbc\x23\xb7\x27"
+ "\x79\x47\x1e\xca\x3f\xd5\x23\x6d\x90\x1d\xce\xa0\x82\xbd\x14\x70"
+ "\x66\x83\x6f\x13\x01\xc3\x09\x58\x15\x3d\x6e\x3b\x4d\x5f\x26\x82"
+ "\xd3\x43\xab\x42\xf9\xcb\x28\x71\x24\x95\x03\xdf\x0f\x41\xa3\x42"
+ "\xb4\xb3\x11\xd7\x89\x78\x4f\xd7\xa2\xae\x83\x80\xeb\xe4\xfa\x50"
+ "\x4f\x05\x60\x3e\x0f\x58\x85\x8c\xd3\x97\x6e\x4a\xc3\x73\xcd\x97"
+ "\x0a\xbf\xfd\x5a\xc5\x8e\x56\xcd\xb2\xe3\x88\xc1\x43\xcc\x3f\x8a"
+ "\x6e\x9b\x68\x5a\x40\x84\xbc\xa1\x2d\x04\x1e\x4b\x6b\x09\x1c\xe7"
+ "\xf7\x98\xff\xec\x42\x3f\x33\x4f\x95\xe0\xba\x8d\x98\x7f\x5a\x8a"
+ "\x9f\xe7\xbc\x07\x99\x87\xa6\x15\x07\x56\x8d\xa2\xe2\x04\x3c\xbb"
+ "\xf2\x43\x16\x7a\xbc\xd8\x5c\x1e\xae\xd8\xd1\xd0\x52\xcc\xfd\x72"
+ "\x0c\x65\xb8\x5c\x11\x59\x13\x30\x07\x48\x10\x21\xab\xd3\x6f\x1e"
+ "\xe8\x70\x89\x96\xc0\x14\xe4\x2d\x26\x6e\x0f\xf3\x11\xe7\x9f\xda"
+ "\x21\x7c\x61\xcb\xce\x3c\x6e\x9b\x18\x54\x4e\xcd\x1d\x77\x12\xcf"
+ "\xc3\x9a\x3b\xb6\x31\x9f\x6a\xc2\xb2\x33\x13\x3c\xda\x33\xb5\xa3"
+ "\x3c\xe9\xf1\x0b\x94\x80\xb4\x70\xb3\x63\x17\xde\x37\x22\x5f\x93"
+ "\xe4\xdb\x69\x17\x42\xd6\x90\x65\x47\x4d\xa8\x62\x67\xf6\xb4\x0b"
+ "\x3d\xa2\xd9\xb1\x89\x1e\xeb\x28\x07\xad\x76\xd1\xd4\x33\xa1\xc4"
+ "\x96\xe2\x42\xe4\xe9\x42\xfa\x36\xc9\xff\x53\xcf\x74\x8a\x69\xb0"
+ "\x66\xa6\x5d\xf8\x9b\x98\xea\x10\x07\xf3\x9d\x34\xe8\xea\x55\x42"
+ "\x63\xb9\x68\x6a\xdb\x45\x57\x1f\xf7\x11\xcb\xc4\x94\x39\x9a\x98"
+ "\x7a\xe6\x9c\x78\xfc\x59\xa6\xcd\x58\x6a\x76\x40\x7e\x9c\x9b\x98"
+ "\xde\xfb\x9b\x1d\x07\x50\xff\x44\xc0\x75\x09\xaf\x73\x0b\xf2\x7a"
+ "\xac\x8f\x9d\x49\xa3\xa6\xb6\x4d\x14\x4a\xde\x51\x13\xae\xdc\xd1"
+ "\xa0\x25\xef\x38\xa2\x55\xee\x68\x15\xc9\x3b\x33\x43\x95\x3b\xb3"
+ "\xc3\xc9\x3b\xc1\x03\x3b\x1b\xd0\x4f\xc9\xdc\xe7\xdd\x6e\xb2\xe3"
+ "\x79\x47\x37\xf7\x7f\xc5\xce\xfd\x68\x6b\x2b\x6c\x5e\xa1\x78\x7f"
+ "\xe7\x7e\x5e\x5b\x40\xd9\xd6\x9e\xe4\x9d\x47\x90\xaf\x55\xc9\xd7"
+ "\xce\x76\xe6\x4b\xe4\x33\x21\xed\x14\xe6\x3d\x89\x78\x1f\xec\x49"
+ "\x6e\xb0\xe0\x67\x13\x6b\x1b\x1c\x80\x7f\x8d\xe4\xa9\x8a\x06\x87"
+ "\xf8\x71\x35\x6c\xe8\x0b\x80\xd3\x50\x31\x3d\x7c\xb7\x00\x0d\x21"
+ "\x27\x0d\x0e\xad\xb2\xc1\x29\x52\x1a\x1a\x82\x92\xf7\x1b\x76\x32"
+ "\xec\x9e\x15\x99\xbc\xe6\x60\xc6\x7b\xd8\x80\x6f\xde\x1a\x64\x5e"
+ "\xb5\xbc\x99\xa9\x59\xde\xac\x10\x15\x6f\x66\xff\xe4\x79\xe1\x0f"
+ "\x57\xbc\x99\xa7\x55\xbc\x99\x1b\xba\x0a\xb6\xb9\xf3\x00\xb1\x7e"
+ "\x0a\x7d\x24\x40\x83\x4f\x40\x8f\x6d\xb2\xff\xbd\x4e\xc8\xc0\xb2"
+ "\xa1\xe5\xcd\x1d\xe0\x85\xe2\xb7\xa5\x6e\x6a\x09\x1c\x93\x34\x15"
+ "\xc9\x6f\x66\x32\x4f\x71\xff\x3e\x5e\x4c\xe5\xa2\xf2\xcd\x6c\xad"
+ "\xf2\xcd\xdc\x70\x25\xe0\x26\xa3\x9e\x94\xb7\xfe\x14\x94\xf2\xfa"
+ "\x16\xf8\xf5\x00\xca\x7c\x42\x8a\xc7\xdf\x3a\xd2\x9f\x8e\x64\x5d"
+ "\xc5\xfa\x69\x7a\x28\xc8\x3c\x73\x8a\xf5\x9a\xd2\x53\x94\x6f\xe8"
+ "\x29\xd6\x51\x3c\xdf\x61\x3d\xa5\xe9\x7a\x4a\xd3\xf5\x94\x7c\xb6"
+ "\x40\xd7\x54\x6c\xcf\x63\x7d\x34\xdd\xa9\xf4\xcc\xf4\x70\x96\x00"
+ "\x6f\xa4\x02\x46\x9e\xea\x0b\xe4\x59\xbb\x7d\xae\xcc\x2f\xe9\xb4"
+ "\xbd\x42\x83\xbe\xc1\xaf\x46\x53\xfa\xa6\x55\xd7\x37\x26\x43\xdf"
+ "\x84\x31\xae\x41\xa6\xb4\x78\xfa\x46\xd3\xf5\x4d\x58\x28\x7d\xa3"
+ "\xe9\xfa\x86\xd3\xc3\xba\xbe\x09\xc7\xd1\x37\x90\x67\x6e\x6f\xa2"
+ "\xae\x67\xca\x59\xcf\x70\x7b\xc1\x6b\xb9\x9a\xd2\x33\x0e\xcc\x75"
+ "\x4c\xac\x67\xc2\x28\xa3\x19\x7a\xa6\x4b\x96\xaf\x60\x5d\xd3\xf3"
+ "\x02\x41\x7f\xda\x89\x75\x8c\xd4\x27\xa1\xe1\x21\xd6\x27\xa0\xdf"
+ "\xdd\xb1\xfa\x04\xf0\x6a\x70\x9f\xa6\xeb\xa9\x23\x98\xe9\x86\xa0"
+ "\x4f\x1a\xa6\x3b\x03\xe8\xeb\xcf\x30\xf7\x87\xde\x76\x96\x94\x7b"
+ "\x9d\x21\x82\x1e\x68\x15\x2d\xe5\x04\x1c\xc1\xbf\x61\xe8\x0a\x22"
+ "\xc8\x65\x66\x08\x32\x0e\x1e\xcf\x6e\x29\xfe\x94\xc2\x90\xd5\xa9"
+ "\x1d\x9d\xde\xc7\x03\x99\x69\x53\xcf\x08\x3f\xe8\xe3\x7b\xbc\xb8"
+ "\x1c\xfa\x25\xd3\xdf\xdc\xf1\x21\x4d\x69\x13\xda\x94\x02\x9f\x1d"
+ "\x32\x90\x3d\x75\xbe\xc7\xfa\xf8\xb3\x69\x90\x33\xe1\x81\x5e\xfc"
+ "\x7f\xa6\x9e\x49\xb3\xce\x6e\xa3\x6f\x4d\x99\x23\xb4\x30\xe4\x0c"
+ "\xed\x6d\x40\xbb\xf7\x03\xf7\x23\x90\xb9\x56\xc8\x59\x66\x28\x46"
+ "\xce\x20\x33\x3b\x70\x6f\x57\xf4\xdb\xd9\x0a\x39\xdb\xaf\xc9\xf1"
+ "\xac\x4d\xce\x31\x51\x4f\x2b\xaf\xc5\x41\xd6\xf6\x6b\x95\x4a\xd6"
+ "\x34\x55\xae\x5d\x63\xfa\x99\x74\x59\x43\x5f\xe0\x7d\x10\xb2\x63"
+ "\xc1\x2f\xbe\xac\x15\x47\xc8\xda\xb3\xba\xac\x25\x2b\x59\x43\x9f"
+ "\x26\x86\x57\x28\x79\x63\xf8\x3c\x0f\xed\x95\xb7\x94\x37\x33\x71"
+ "\x9f\xa0\x78\x47\xca\x1c\xc6\x95\x37\xf3\x20\x6f\xb9\x90\x37\xc0"
+ "\x13\x7e\xd6\x9b\xe0\xcd\xff\xe0\xb1\x6e\x5a\xb1\xf8\x8f\xfc\xf0"
+ "\xd0\x72\xc8\x53\x1e\x74\xd9\xdf\xa0\x47\xff\xe3\xf1\x00\x6d\x85"
+ "\x3c\x65\x42\x8e\xb2\x21\x4f\xb9\x90\x2b\x96\xa7\x23\xe1\x15\x0c"
+ "\xf3\xad\x23\xbd\x30\xe4\x58\x19\x2d\x4f\xfd\xad\x83\x76\xb9\xed"
+ "\xa5\x3e\xfa\xa0\x98\xed\x15\xdc\x57\xf8\xe8\xc0\x44\xfd\x1e\xf6"
+ "\xcf\x56\xb9\xb6\xc5\x32\x58\x5c\x46\xd7\x9d\xa6\xe1\xb9\xe0\x77"
+ "\xc2\x7d\x2a\xee\xa7\x4c\xbf\xe5\x20\xec\x88\x8e\x76\xd4\xdb\xc5"
+ "\x72\x28\xdc\x63\xd8\x3e\xcb\x01\x1f\x5a\x44\x57\x66\x2a\xec\x4b"
+ "\x4d\xf4\xd8\x78\xad\xcd\x8a\xe7\x41\x68\x7f\x06\xae\x83\xb7\x5c"
+ "\xa4\x74\xfc\x6c\x5b\xdc\x5a\x39\xdb\x4e\xb8\xcf\x12\x4b\x6d\x29"
+ "\x1b\x96\xd0\x48\x6b\x80\x2c\xf5\x6e\x2d\xcf\xba\x2a\x8d\xd7\x9c"
+ "\xd2\xf9\x5e\xb8\xb7\x8d\xad\xbf\x48\x66\x5e\x17\xd0\x92\x51\x9f"
+ "\xd3\x2a\xc4\xe2\x4c\xaa\x5f\x04\xfd\xe0\x26\x5b\xbd\x5b\xec\x0e"
+ "\x77\x49\x99\xcc\x36\x70\x61\xdc\x80\xe7\x0d\xc0\x73\xf6\x43\xcb"
+ "\x72\xe8\x13\x27\xc5\x5d\xab\xed\x72\x0f\xef\x6d\x7f\x3f\xef\x6b"
+ "\x0d\x9a\xf4\xf3\xfe\x80\x41\xa7\x7e\xd6\xf5\xcc\x3c\x46\x87\x97"
+ "\x08\x7f\xd5\x53\xc4\xb4\xb0\xb9\x42\xe2\x3f\x41\xc7\xf2\xb2\x30"
+ "\xdd\x30\x7d\xd9\xb7\x85\xb7\x43\x78\xbc\xce\x33\x54\x8f\xf7\x65"
+ "\xa5\x42\xd3\x92\xf7\xfa\x44\xe5\xde\xe3\x9d\x4b\x44\x88\xd7\x72"
+ "\xba\xdc\x37\xda\x7d\xf4\x23\x8f\xea\x8b\x1d\xfb\xe5\x1c\xd2\xb2"
+ "\xf7\x38\x60\x5d\xc3\xb0\x9a\x51\x3e\x5c\xb9\xb7\x0d\xf9\x60\x6f"
+ "\xfe\x51\xae\x77\x40\x8e\xf7\x17\x2f\xa7\x6f\x9e\xa6\x1b\x25\x8d"
+ "\x45\xc5\xde\x00\xeb\x03\xa4\xa5\x21\x6d\x1d\xe0\x07\x91\xdf\xe9"
+ "\xa3\xbd\x9b\x94\x1d\x7b\xe3\x3a\x23\x1f\xee\x0b\xf8\x3e\x8a\x7f"
+ "\x12\xe4\x62\x3a\x60\xd9\xfb\x36\xab\x12\xf4\xe5\x75\xe3\x2f\x0d"
+ "\xbf\x9c\xf8\xaf\xfb\xf4\xf9\xce\x6c\xd8\x5a\xe4\x5a\x49\xc3\xd0"
+ "\x3f\xc0\xef\x3b\x09\x98\x47\x9c\x14\xee\x1b\x6b\xde\x58\x1e\xc4"
+ "\x3c\xe1\x3b\xa9\x3e\x7a\xb1\xb1\x3f\x7a\x0a\xb6\x75\x2e\x8a\xf6"
+ "\xaa\x25\xbd\xb4\xfc\x7c\xfa\x32\x4d\xf0\x3d\xeb\xa3\x7a\xa4\x33"
+ "\xdd\x00\x67\x96\x41\xb3\xfe\xfb\x65\xaf\x5f\xcd\x39\xbf\xb3\x47"
+ "\xb8\x05\x79\xbe\xc5\x7b\x4c\xdf\xd9\xab\xe8\xb0\xf3\x48\x27\xf4"
+ "\x08\xaf\x13\x63\x6e\x16\x58\x6c\x13\xa0\xd7\x77\x1a\x7c\x34\x32"
+ "\x4b\x5f\x87\x0a\x78\x43\x93\x58\xb7\xc4\x1d\xb7\x78\x4f\xac\x0f"
+ "\x7e\xc6\xb1\x96\x61\xd0\x43\x52\x37\x1d\x9a\x55\xa6\xf0\x0e\x32"
+ "\x5c\x4f\xd9\x79\x6a\xc3\xfb\xc5\x01\xd1\x2e\x2a\x0e\xe5\xf2\x3c"
+ "\xc2\xb3\xa4\x9b\xd3\x3e\x05\x6f\x0b\xcf\x22\xc6\x29\xe3\x53\xcf"
+ "\xb7\xba\xe9\xa4\x93\x12\xeb\x7b\xd7\x7f\x32\x3c\xbc\xde\xa3\xd6"
+ "\xb9\x32\x72\x7c\x34\x2a\x68\xe0\xc5\x36\x06\xe8\xcb\xb4\xde\xcf"
+ "\xb6\x06\xef\x3d\x2c\x2e\x15\x41\xb6\x39\x90\xb7\xc8\x68\x03\xb7"
+ "\x4f\xb5\x2b\xa3\x3c\xb2\x5d\xbc\x47\x65\x2d\x55\x34\x58\xbc\x8c"
+ "\x2c\x76\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d\x96\x6d\x91\x3a\x16\x63"
+ "\x44\xe8\x4e\xcc\xc7\x64\x7a\x2b\x60\x61\xfe\x33\x52\xe7\xa9\x8c"
+ "\x9c\x58\x3e\xea\xed\x47\xcb\x8e\x0a\xcc\x41\xbf\xe5\xd2\xc4\x89"
+ "\x93\x34\xe2\x61\xb5\x76\x36\xe2\x61\x8d\xed\xec\x20\xf3\xef\x07"
+ "\xad\x3c\x26\x7b\x4b\x59\xdf\xca\xbc\xd7\x22\x6f\x1b\xf2\x4c\xd6"
+ "\xf3\x4e\x56\x7b\x76\xf2\x3a\x80\xaf\x18\xc7\x9e\xf7\xd1\x88\x02"
+ "\xbf\x1c\xef\x0f\xa5\x19\xcf\x98\xbb\x63\xfe\x37\xc2\x26\x2a\x3f"
+ "\x68\x8d\x8f\xcb\x9b\x15\x3c\x9e\x85\x2f\x8a\x0e\xd4\x73\x3d\xf3"
+ "\x94\x6b\x19\x7d\x03\x7c\xf9\x79\xd9\x4a\xba\x96\xf9\x49\x24\xef"
+ "\x0d\x29\xba\x8f\xd8\x25\xdc\xb0\x3d\xa1\x51\x8b\x97\xd0\x37\x21"
+ "\x47\x81\xd3\x34\xe2\x50\x7e\xa9\x1d\xb8\x12\x55\x9d\x25\x92\x3a"
+ "\x28\x79\x6f\xd0\x1b\xfa\x82\xea\xcf\xf2\xda\xce\x08\x9f\xc1\x8b"
+ "\xb8\xef\xb8\x9c\xbe\xc0\x38\x63\x51\x6b\x0f\x37\x3d\xcc\xfb\x0c"
+ "\x27\xe8\xa6\x89\xdc\x5e\xb5\xc7\x79\xd3\x9d\xe2\xa2\x98\x2d\xd4"
+ "\x98\x16\xf4\xd1\x4d\xc5\x18\x5b\x2c\xf2\xe7\xa6\x02\xf5\xbc\x33"
+ "\x88\x7c\x19\xe2\xa2\x46\x9c\x8e\xb4\xb1\xc2\x9d\xc0\x32\x71\xa0"
+ "\xcb\x7d\x93\xc3\x47\x3f\x6e\x55\x7d\x73\xd3\x18\x86\x15\x1f\x87"
+ "\x9d\x41\xf4\x2d\x31\x6f\x02\xd6\x9f\xed\x65\xbc\x76\x79\xd3\x76"
+ "\x29\x17\x80\x55\x6f\x52\x7a\x5b\x03\xae\x75\x6e\xcd\x01\x1d\xed"
+ "\xd0\xd6\x7e\x94\x23\xef\xf5\x77\x42\x1f\x47\xe3\xc3\x3f\x34\xcb"
+ "\x33\x94\x79\xfc\xe6\x91\x0a\xce\xa1\x5c\xcf\xd0\xd3\xfc\x3c\x8a"
+ "\x9f\x03\x96\x83\x39\xde\x9a\x1c\xd4\x7f\x1a\xf5\xde\x3c\x52\xcd"
+ "\xe7\x6f\x1e\xd5\x89\x3a\xba\xdc\x37\x8f\xf4\xd1\x68\xb3\xda\x73"
+ "\x39\x98\xd3\xdf\x5e\x32\xcb\x0e\xcb\x9c\x92\xe9\xcc\x33\xcd\x5b"
+ "\xa5\xfc\xb5\x77\x5a\x1a\x2c\xba\xde\xe0\x75\x9a\xd4\x13\x94\xd9"
+ "\xd1\x6c\x93\xfc\x6d\x12\xa6\x9b\xd7\xfd\x46\xf3\x9b\x78\x5f\x4c"
+ "\xa9\xaf\xcc\x8e\x4b\x7f\x37\x7b\xf0\x3b\x8a\xdf\x71\xfd\xb9\x1d"
+ "\xbf\x10\xee\xa7\xe0\x77\x5c\xd2\x6e\x73\x61\x82\x0f\xef\x3a\x61"
+ "\xb3\xf3\xb3\x8f\x6e\x3e\x22\x36\x67\x98\x60\x97\xc8\xfb\xfa\x6f"
+ "\xf0\x3a\xc1\xcd\xd0\xb3\x37\x95\xaa\xbe\xc8\x94\x6b\x2a\x90\x47"
+ "\xa6\xbb\x70\xd5\x88\x60\x63\x59\x80\xf1\xce\x68\xac\x09\x90\xfd"
+ "\x26\x6e\x7f\x26\xdb\x0f\x22\x00\xfa\xf3\x75\x71\x8d\xf0\x1f\xae"
+ "\x0d\x11\xef\xcf\x75\xb9\x33\x21\xff\xf3\xa7\xa8\x35\x87\x43\xc5"
+ "\x0c\x4f\xe7\x09\x61\xb4\x5f\xe9\xb4\x83\x39\xdc\x97\x78\x7e\x0e"
+ "\x6d\xb7\x9e\xa5\xcc\xbd\x22\xe5\xa3\x9c\xc3\x0e\xa2\x2d\xd0\x23"
+ "\x18\x6b\xe4\x5e\x41\xbd\xf4\x0f\xc8\xc4\xf8\x7f\xd3\x71\x63\x3f"
+ "\x69\x3d\xde\x6f\xc0\x3b\x8c\x3d\xfe\x66\x47\x90\x18\x56\x98\xdb"
+ "\x87\xf2\x1f\x6a\x7e\x33\xc6\x6a\xf4\xf9\xc1\x9c\xb2\x62\xe8\x99"
+ "\x5e\xbd\x95\x39\x7b\xe5\x19\x11\x34\xda\x77\x78\x2b\xcb\x42\x26"
+ "\xf8\xff\x69\x47\xbf\xfc\xdf\x8b\xf3\xad\xc9\x87\x33\x54\x9f\x69"
+ "\xa0\x4b\x74\x9f\xdd\x6a\x51\xfd\x75\xcb\xd8\xe8\xfe\xba\x15\xb6"
+ "\xcd\x2d\x6b\xf0\xab\xc5\x6f\x97\x7a\x8e\xfc\xdd\x52\x1c\x71\x7f"
+ "\x00\x3f\xe8\xce\x5b\x30\xfe\x8f\x08\xaa\x7e\xe0\x74\xb4\x83\x79"
+ "\xe4\x1f\x64\xd1\x7a\xf2\x88\xf7\x6b\x39\x9d\xf9\x99\xd3\x35\xd8"
+ "\x33\x3e\xba\xa5\x1a\xef\xd3\x58\x56\xab\x34\x8a\x7a\xef\x45\xed"
+ "\x9e\xe5\xd0\xd5\x74\xcb\xe7\x0c\xcb\xba\xaa\xa2\x82\xf9\x14\x65"
+ "\x36\x59\x43\x15\x15\xa8\xaf\xc3\xa0\x2b\xd2\x8e\xf1\x7b\xe6\xc9"
+ "\x2e\xf7\xad\x66\xd0\xa5\x41\xee\xc7\x62\xbe\x17\xdf\xd6\xb8\x35"
+ "\xb3\xd7\x26\xb3\x34\x38\x58\x1f\x75\xd0\x77\xc7\x40\x67\xa1\x6f"
+ "\x3f\xca\x56\x63\xcd\x77\xef\xe4\x67\xe8\xca\xcf\x71\x9f\xd5\x0c"
+ "\x9d\xd4\xbd\x76\x6f\x41\x8f\x89\x06\x74\x9b\x28\x27\xb4\xf6\x4c"
+ "\x6a\x28\xe5\xed\x22\x6f\xfb\x1e\x6a\x09\xfd\x96\xec\x4f\x49\x18"
+ "\xb7\x78\xc1\x03\xae\x65\x22\xfc\x4e\x77\x83\xd9\x1b\x3a\xe7\xc1"
+ "\xd8\xfc\xed\xd3\xf4\x5d\x49\x8f\x17\x4f\x60\xd4\x7f\x5c\xc2\xd6"
+ "\xe9\xd3\xd1\xbe\x61\x9e\x08\x6d\x38\x29\x02\xb0\xef\x52\xd6\x77"
+ "\xd3\xc8\xd7\x97\x53\x56\x6d\x37\x65\xd4\x75\x53\xa6\x38\x95\x69"
+ "\xaa\x85\xdd\xf6\xf8\x85\x34\x82\x4e\xc8\x1b\x54\x4c\x96\xba\xe5"
+ "\x24\x79\x24\x5c\x09\xfb\x2d\x04\xfb\xed\x5c\x26\xeb\xc6\x5e\xfb"
+ "\xad\x47\xda\xc5\xfb\x0a\x15\x1f\xed\x2b\x1c\xe8\xa0\x84\xd4\x02"
+ "\x4a\x03\x7e\xae\xb3\x74\xeb\xfc\x54\x0c\x88\xdc\x66\x9f\xde\x5e"
+ "\xd0\xbc\xd4\xea\xa0\x01\xb2\xad\xd0\xd7\xa2\xf2\xa3\xec\x7e\xc7"
+ "\x61\x13\xf3\x54\x80\xe5\x86\xdb\xb0\x8a\xf7\x8c\xf7\x0c\x0d\x9a"
+ "\x17\xd7\x8a\x20\xa7\x97\x0c\x17\xd0\x99\xdf\x75\x70\xdd\xbb\x91"
+ "\xde\xe5\xfe\x6e\xb5\xcf\xf4\xab\x91\xfd\xf1\x28\xe6\x47\xba\x5e"
+ "\x19\x79\x8d\x30\x95\x83\x47\x1b\x1a\x56\x86\x60\x7b\x9f\x65\x99"
+ "\x1d\x99\x36\xbd\x48\x84\xec\x0b\x78\xff\x7e\x24\xb1\x6f\x01\xef"
+ "\x29\xfe\x06\xb6\xcd\x57\xf9\x13\xf0\x78\xc1\x73\x05\x6b\x11\x60"
+ "\xae\x6d\x68\x10\x98\x9f\x7f\x5d\x7f\x06\xb4\x33\x75\xe3\x10\xf6"
+ "\xb3\x19\x39\xc5\x47\x53\xb6\x31\xee\xd2\x97\x06\xba\x13\xf6\xd6"
+ "\xb5\xc0\xab\x22\x00\x3a\xe0\x3d\xc6\xff\xc9\x4e\x7d\xff\xd7\xcf"
+ "\x7b\xaf\x48\xc3\xf8\x7f\xff\x01\x4e\x2b\x19\x4e\xb6\x12\xbb\x88"
+ "\xbb\xf7\xcd\x36\x13\xef\x49\x03\xde\xf5\x28\xb3\xc7\x80\x83\x71"
+ "\xea\xd7\x9d\xa6\x87\x1e\x42\xda\x11\x03\x0e\xf2\x5c\x87\xe7\xd6"
+ "\xde\x3c\xaa\x4c\x7b\x44\x99\x87\x3a\x4d\xb7\xfe\x1a\x69\xa1\xe8"
+ "\x32\xa3\x52\xa3\xcb\x8c\x1a\x16\x51\xa6\x5c\xd5\x33\x2a\x2b\xa6"
+ "\x4c\x4e\x4c\x99\x19\x97\xe2\x36\xaa\x30\xa6\x4c\x49\x4c\x99\x35"
+ "\x97\xe2\x36\xaa\x26\xa6\x4c\x43\x4c\x99\xfd\x11\xb4\x64\xbf\x9a"
+ "\x2c\xa4\x35\xc5\x94\x39\x1e\x53\xa6\xc3\x78\xee\x87\xc6\xa9\x8b"
+ "\xb7\x90\x0d\xbc\xc9\xbe\x5b\xfe\x8d\xe8\x9f\xce\x57\x9f\xee\x52"
+ "\x65\x6f\xcb\xbc\xb4\x5d\xb7\x8d\x8d\xae\xef\xb6\x29\xd1\xf5\xdd"
+ "\x36\xfb\xd2\x76\xdd\x56\x1c\x53\xa6\x3c\xa6\x4c\x75\x44\x99\xad"
+ "\x7a\x3d\xdb\x62\xca\xec\x89\x29\xd3\x78\x29\x5f\xdd\xd6\x1a\x53"
+ "\xa6\x3d\xa6\x4c\xf0\x2b\x68\xc1\xe3\xb8\xf2\x6b\x1b\xc2\xb6\xf2"
+ "\x3d\xb0\x11\x46\xcf\x61\xdf\x08\xde\x07\x7d\xa3\x3b\x98\xc4\xfb"
+ "\x73\x3c\x5e\x1d\x76\x06\x31\xb6\x8c\xc6\xfc\x67\x8c\xc7\x18\xb3"
+ "\xd8\x6f\x84\x65\x5a\xd9\xd8\xa3\x33\xfb\xb3\x45\xa5\xef\x99\xee"
+ "\xbf\xc6\x75\x1d\x1e\xc6\xe3\xd4\xe8\x4d\xbd\x36\xb1\xf2\x41\x23"
+ "\x1d\xce\xdf\x8d\x7d\xd8\x7a\xe5\x8f\x92\xc0\x36\xf9\x61\xa7\x2c"
+ "\x73\x24\xc2\x8e\xe6\xfa\x03\x7b\x96\x07\xcd\x31\x78\x34\x5c\x06"
+ "\x8f\x54\xd8\x46\xd9\x2d\x18\xbd\x78\x7f\xbd\xb9\x16\x36\x10\xec"
+ "\x7e\xc6\xed\x04\x65\x65\x49\x9b\x6c\x41\x37\xf1\xbd\xb7\xf4\x2e"
+ "\xb9\xff\xae\x6c\xd2\x2c\x47\x23\xea\x67\xdb\xbd\xb1\xf8\x3c\xfb"
+ "\x48\x61\xfc\x65\xdb\x2d\xeb\xe5\xc3\xa5\x7e\xe0\x95\x55\x60\xf8"
+ "\xa9\xf8\x28\x6b\x93\xb4\x35\x2a\x0e\x65\xb1\x6f\x00\xfb\xd0\x1c"
+ "\x0e\x64\x73\x1e\xf0\xff\xe8\x22\xa3\xbd\x18\xeb\xfd\xc8\x3b\xf6"
+ "\x72\x34\x53\x7d\x98\x75\x20\x9a\x27\x93\xc0\x2b\x59\x47\xa3\xfb"
+ "\x3d\xcb\x17\xdd\xef\x59\xfe\x68\x9e\x34\x81\x27\x6f\x37\x47\x97"
+ "\xb9\x3d\x3d\xba\xcc\xed\x19\x11\x65\xaa\x55\x3d\xb7\x67\xc7\x94"
+ "\xc9\x8d\x29\x93\x17\xf1\x8c\x36\xde\xee\xe8\x9d\xfb\x48\x1f\xa8"
+ "\xdb\x9d\x11\xcf\xa6\x4d\x52\x7f\xde\xbe\xce\x48\xe3\xb5\xa3\xba"
+ "\x57\x94\x0f\x8e\x0e\xaf\x21\x46\xde\x39\xff\x81\x18\x1c\x9a\x62"
+ "\x70\xe8\x95\x7f\x7d\xef\xfe\xe3\x93\x74\xc7\x1e\x7d\xef\xbe\x03"
+ "\x63\xf6\x74\x7e\x06\xac\x1a\xe4\x07\x1d\xee\x48\x8d\x86\x77\xc7"
+ "\xb0\x68\x78\x77\x8c\x8c\x78\x4e\xc3\xf3\xd8\x88\x36\xa4\x25\xda"
+ "\x28\x01\xfc\x02\xfb\xed\x8e\x59\x46\x3a\xcf\x29\x81\x6f\xbb\x4b"
+ "\x8e\x35\x39\xec\x5b\x36\xf8\x04\xdd\x31\x9e\xe7\x9f\x3a\xcc\x48"
+ "\xf9\x27\xd5\xae\x3b\x36\xc5\xe0\xb1\x2d\x06\x8f\x3d\x11\xed\x0a"
+ "\x58\x57\xd1\x03\xd6\xd0\x83\x0f\xb3\xed\xc3\xfe\x94\xd2\xc7\x6b"
+ "\x25\x6c\xb6\x0b\x94\xc6\xbe\x75\x27\x4b\x28\xd1\xeb\x6c\xc7\x5c"
+ "\x6e\x5f\x41\xbf\xfc\x94\x72\x28\x47\xf9\x56\x91\xbd\xcb\xfd\xbd"
+ "\x74\x83\x1f\xb5\xb5\x87\x72\xb4\xca\x0f\x33\x90\x06\xfd\x97\xb5"
+ "\x55\xd9\xb9\x07\x8a\x85\x2b\xaf\x06\xf4\xc4\xbc\x68\xcc\x75\xfa"
+ "\x3c\x62\x16\xfb\x88\xb1\x1f\x2b\xc6\xf8\x54\xb5\x0f\xff\xbd\xd9"
+ "\x11\x7c\x1d\xb0\x2f\xbf\x5b\x9c\xa0\x31\xc3\xd9\x06\x60\x19\x65"
+ "\x5f\xb3\xc3\x21\x3f\xf1\xdc\xdb\x1b\x3a\x2d\x6d\x37\xbc\xb7\xeb"
+ "\x65\x6b\x22\xca\xfa\xf5\xb9\x71\x3b\xbf\x1b\x1d\x22\xf3\xe1\x80"
+ "\x9f\x00\x27\x5d\xd9\x7b\x63\x86\x1f\x86\xbc\xa2\x4c\x93\x51\x86"
+ "\xe7\xd1\x72\x8f\xb7\x84\xcc\xb7\x95\x92\xd9\xb3\xfc\x84\x84\x6d"
+ "\xf8\x6d\xc0\x96\xee\xf0\x96\xb6\x93\x37\xd0\xca\x6b\x5d\x66\xe5"
+ "\xa3\x33\xc6\x9e\x18\x24\x4b\x67\xe5\x21\x8c\x71\x63\xec\xe1\xca"
+ "\x43\xd9\xc0\x0d\xe3\xd9\xf7\x26\xb2\xbe\x89\xa4\xdd\xa4\x49\x33"
+ "\x1e\x9c\x3e\x75\xd4\xcf\x1e\x9c\x3c\x6b\xd2\x5d\xf6\x59\xf3\x9f"
+ "\x99\x5b\x38\x6a\xe1\x73\x25\xf6\xa5\x8b\xe6\x97\xcc\x5f\xf0\x73"
+ "\x7b\x96\x73\x84\xd3\x3e\xa7\x44\x5d\x33\x8b\xe6\x2c\x2e\x19\xc7"
+ "\xb7\x23\xed\xc5\x8b\xe6\x2e\x91\xb7\xb7\xa4\x50\x34\x90\xf9\x25"
+ "\x73\x17\xd9\x47\x14\x8e\xb4\xdf\x3b\x67\x7e\xd1\x73\x8b\xe6\xc6"
+ "\x85\x75\x97\x7d\xd1\xdc\x45\x73\xe7\x14\xda\xc7\xd9\xb3\x18\x72"
+ "\x24\xb8\x88\xfe\xcc\x32\xc6\x31\x1e\xbf\xaa\xdc\xe2\xa8\x3e\x9e"
+ "\xf9\x14\xff\x8c\x09\x5c\x3a\x96\xdd\x69\x89\xe6\xb9\x3b\x6d\xd1"
+ "\x3c\x77\x67\xe6\xa5\x63\xd9\x9d\x31\xe3\xdf\x9d\x31\xe3\xdf\x9d"
+ "\xb3\x2f\x1d\xcb\xee\x8c\x19\xff\xee\x8c\x19\xff\xee\xec\x1d\xff"
+ "\xc0\x4b\xbe\xd5\x52\x2f\xdc\x19\x33\xfe\xdd\x19\x33\xfe\xdd\xd9"
+ "\x18\xf3\x7c\x2c\xe2\xf9\x5a\x3c\xb7\x45\x8e\x8f\x78\x0e\x18\xf2"
+ "\xd9\xa7\x5f\xbe\x6f\x31\xf2\xb0\xae\x87\x6e\x6e\x53\x79\xbf\x6f"
+ "\x8f\xc8\xdb\xae\xe7\x1d\xd3\x2b\x7f\xbc\xaf\x8d\x74\x35\x5f\xff"
+ "\xfe\x6b\xac\xd3\xd9\x1f\x8f\xc7\x26\xc8\xc7\xb7\xcf\xd2\xf7\xaf"
+ "\x61\x58\xcc\xc3\xec\x9f\x29\x5e\x7d\xb4\xab\x7e\x30\x59\xb8\x4c"
+ "\xfd\x4b\xec\xd7\x3b\x66\x24\xfb\xea\x22\x8d\x7d\x97\xa1\x53\xbe"
+ "\xcf\xf6\x6f\x48\x8d\x17\xdf\xf7\x49\x9b\x1f\x65\x74\xf8\x72\x5e"
+ "\x03\x38\xec\x0b\x6c\xa9\x52\x63\x71\x1b\xee\x53\x99\xa7\x51\xde"
+ "\x2c\x4c\x63\x9e\x65\x1f\x68\xa4\xa5\xe1\x97\x0e\x78\x3e\x03\xde"
+ "\x9a\x21\xf1\x6d\xcb\x58\x3b\xb7\x77\x3e\x68\x22\x6b\x95\x5b\x6b"
+ "\xf5\x6a\x6c\x5b\xff\x20\x5d\xad\x2d\xec\x2d\x17\xee\x83\x79\xf5"
+ "\x48\x8f\x3f\x4f\xfa\x01\xe4\xe5\x07\x16\xb5\xde\xf2\x03\xf4\xff"
+ "\xd4\x31\x6a\xed\x74\x6f\x39\xf4\x6d\x37\xe0\x5c\xc0\xb5\x07\xd7"
+ "\x7f\x37\xe0\x7b\xe4\x7c\xfb\x07\x25\xc2\x9d\x30\x93\xe1\xc6\xa4"
+ "\xaf\x83\x7e\xeb\xb6\x86\xca\xf3\xe2\xbc\x6b\x10\xee\xc4\x07\xe3"
+ "\xa4\x7b\x60\x33\x74\x03\x8f\x00\xe3\x1b\x91\xde\x2a\xdc\x83\x66"
+ "\x71\x7e\x1f\xd7\x87\x32\xfd\xd9\xda\x86\xff\xad\xf2\xe1\xcf\xce"
+ "\x88\x69\xc7\x97\x27\x29\xfb\x57\xaa\x1d\xd9\xe1\xe8\xba\xb3\xc7"
+ "\xc6\x6f\x47\xf6\x2c\xb4\xe3\xcb\xf8\xed\xc8\x2e\x96\xb4\x35\xa1"
+ "\x2d\xa6\x4b\xde\xad\x43\x5b\xbe\x94\x74\x8f\x4e\xdf\xa6\xdb\x42"
+ "\x01\xcc\xc3\xd2\xf0\x4e\x96\x9d\x59\xda\xd7\x6f\x7a\xbe\x26\x6b"
+ "\x0d\xcd\x88\x53\x67\x9b\x70\x0f\x98\xe9\xa3\x1f\xca\x73\x0d\x11"
+ "\xe9\x21\x85\x0b\xe8\x64\x62\x3a\xa1\x3d\x28\xd7\x5f\x7f\x1b\xf3"
+ "\x12\xb5\x16\xf2\x43\xc8\x7f\x36\x19\x6b\x99\x8b\x4b\x85\xdf\xa0"
+ "\x23\xde\x39\x62\xde\x05\x23\xde\xad\x89\x7a\xb7\xb2\x37\xbd\xd6"
+ "\x48\xff\x7a\xfd\xf4\xc3\xa6\x98\x7e\x42\xff\xdc\xf5\x58\x74\xbb"
+ "\x7f\x78\x5c\xb5\x0f\x7d\x74\x09\xad\x7f\x18\x44\x1f\xf5\xc4\xef"
+ "\xa3\xbb\xd2\xe3\xf3\xda\x5d\x72\x1d\x4d\x0c\xa6\x38\xf0\xee\xca"
+ "\x45\xdf\xf5\x48\x1e\xd4\xfb\xe9\xd2\xfe\xb9\xab\xc8\xe8\x9f\xaf"
+ "\xd7\xc6\xbb\x76\xc7\xb4\x31\x7c\x92\x7e\x34\x4a\xb5\xf5\x47\x2b"
+ "\x63\x60\x1f\x89\xcf\x8b\x77\xf9\xd0\xce\x70\x3f\xed\x0c\xf5\xcf"
+ "\x8b\x3f\xb2\xa1\x3d\xe1\x4b\x79\xf1\x47\x59\xaa\x0c\xc5\x2b\x33"
+ "\x45\xb8\xe3\xd5\xf3\xa3\x42\x57\x88\xed\xdc\x1f\xd5\xf2\xfa\x52"
+ "\x44\x7a\x69\x34\xff\xa1\x0d\x5c\x8e\xe9\x17\x52\x7a\x96\xfb\xe1"
+ "\xa4\x9d\x4c\x5f\xc5\x93\x5d\xee\x1f\x1d\x8f\xa1\xd5\xb9\x93\x34"
+ "\xf6\xb1\x4e\x53\xc2\x36\x45\xaf\x71\xc3\x63\x70\x0a\xc6\xa7\xd7"
+ "\xd8\x34\xd0\xeb\x5c\x7c\x7a\x8d\x1d\xd9\x3f\xbd\xc6\x72\xff\x9f"
+ "\xbb\x94\x5e\x63\x0b\x22\xe9\x05\x5b\x57\xb6\xef\x3b\x36\xf0\x46"
+ "\x4f\xbe\xa8\xe7\xb6\x86\x29\xcd\x0a\x5e\x51\x65\x3a\xb8\xcc\x26"
+ "\x6b\x50\xf1\x09\x6c\x48\xcb\x59\x1a\x5b\x6a\xc8\xff\xa0\x1a\x1a"
+ "\x20\x7a\x1e\x65\x3f\xa2\x04\x2e\xe7\x75\x9e\xf3\x78\x43\x59\xc4"
+ "\xf3\x8f\x98\x7a\x5b\xe3\xeb\x82\xb1\x7e\xd0\xf4\xa5\x4b\xd3\xc7"
+ "\x59\x94\x1f\xd9\xb8\x9c\x68\x1d\x31\xce\x1e\xdd\x47\x3f\xe2\xb5"
+ "\x53\xab\xbe\xed\xf4\x95\xbf\xcb\xf7\xd9\xb8\xea\x4b\xfb\xec\xc7"
+ "\xb7\xab\xfe\xfa\xf1\x35\x31\xf8\x35\xc4\xef\xaf\x71\x9e\xfe\xfb"
+ "\x6b\xdc\xf1\xfe\xfb\x6b\x1c\xaf\x9f\x9e\xf3\xd1\x8f\xb3\xa2\xc7"
+ "\x8d\x1f\xa7\x45\xb7\x17\xf5\xa2\x9c\x30\x5d\x75\x2d\x3f\x7f\xdd"
+ "\x76\x1b\x3f\xd6\x71\xdc\x57\x7c\xae\x08\xf8\x0f\x67\x1c\xaf\x14"
+ "\x46\xbf\xb0\x41\xc3\xea\xe5\xf1\xf7\x5b\x79\x8e\xdb\x52\x43\xc4"
+ "\xfb\xc8\xf6\x6f\xb1\xed\x7e\x77\x92\x66\xa2\x56\xdc\x9b\x4e\x52"
+ "\xce\x9f\x35\x93\xa9\x94\xf7\x3c\xa5\xdf\xba\x5c\x43\xb8\x7b\x58"
+ "\x64\x5f\xf0\xde\x27\xcf\x4d\x37\xa8\xb9\xd3\xdf\x50\x7e\xbb\xea"
+ "\x97\x9c\x77\xa3\xe9\x78\x77\x4e\xfc\x7e\xb9\x3b\x0f\xfd\xf2\xb7"
+ "\xf8\xfd\x72\x77\x49\xff\xfd\x72\x77\x35\xfa\xe5\x6f\x97\xca\xd1"
+ "\xdd\x0d\xba\x1c\xad\xe6\x32\xf6\x05\x3c\x1f\xcf\xf9\x06\xe7\xc1"
+ "\x3d\x64\x24\x47\xd2\x64\x54\x87\x21\x47\xb2\xcc\x71\xc0\x92\xf5"
+ "\xab\x3c\x77\xb7\xea\x30\x22\xe0\xe6\x90\xb5\x23\x9e\x9c\xe4\xd8"
+ "\x38\xef\x6d\xc5\x64\x01\x0d\xf3\xb6\x30\x8c\x45\x44\xa8\xe7\x19"
+ "\xce\xc7\xe9\xb7\x05\x22\xe5\x24\x27\xd7\xc8\xc7\xba\x4e\xcf\x9b"
+ "\x23\xba\x1c\xc4\xf9\x62\x60\xeb\xed\x1f\x20\xc7\x11\xce\xcf\xf9"
+ "\x62\xf2\xd4\x28\x79\xcc\x39\x1e\x2d\x8f\x39\xbb\xa3\xf9\x13\xf4"
+ "\x47\x39\x0d\x7a\x0e\xf7\x66\xe0\xf0\xb5\xf9\xeb\xf2\xb2\x39\x7e"
+ "\x64\x8c\x6c\x82\x07\xc6\x37\x2b\x1e\x18\xff\x76\x34\xae\xe3\x27"
+ "\xc6\xe7\x81\xf1\xb3\xfb\xe7\x81\xf1\xce\xfe\x79\x60\xfc\x26\xe6"
+ "\x01\x1f\x8d\x6f\x8a\x96\xcd\xf1\xbb\xa2\xdb\x8e\x7a\xa5\x6c\xd2"
+ "\x35\x57\x22\x9b\xb0\x85\xae\xed\x4f\x0e\x59\xa6\xd8\x7f\xa4\xbe"
+ "\xdb\xd8\xeb\xf8\x5a\x34\xb3\x40\xae\x80\xdf\x3d\x05\xbc\xa6\x04"
+ "\x1d\x9f\xcd\x34\xac\x93\xe7\x31\xef\x29\x89\xa4\xe3\x06\x75\x06"
+ "\xd2\x85\xbc\x5f\xf2\xbe\xb2\xa2\xe7\x84\x43\xd1\xed\xbf\x67\x53"
+ "\x7c\x7a\xde\xb3\x0b\xf4\x74\xc5\xa7\xe7\x3d\x47\xfa\xa7\xe7\x3d"
+ "\x6d\x7c\x46\xea\x52\x99\xba\x27\x64\x5f\x22\x6d\x14\x59\xe6\x2c"
+ "\x4d\x78\xe8\xeb\x8d\x4f\x13\xc6\x44\x8f\x4f\x13\x86\x5d\xf9\xf8"
+ "\x34\xc1\x19\x7f\x7c\x9a\x50\x1d\x7f\x7c\x9a\xd0\xa0\xe4\x61\x82"
+ "\x2f\x5a\x1e\x26\x78\xa2\x79\x02\xb4\xfb\x5f\x1b\x9f\x26\x66\xc5"
+ "\xc8\x40\xd5\x49\x9a\xf8\x2e\x6c\x0a\xdd\xde\x9c\xf4\x5c\x34\x8e"
+ "\x13\xa7\xc4\xef\xb7\x89\x85\xe8\xb7\xaa\xf8\xfd\x36\xb1\xbc\xff"
+ "\x7e\x9b\x58\x8b\x7e\xab\xba\xb4\xdf\x26\xee\xb9\x72\x9b\x62\x62"
+ "\x7b\x74\x9f\x4d\x3c\x7a\xe5\x7d\x36\x69\x64\xfc\x3e\x9b\x34\x31"
+ "\x7e\x9f\x4d\xd2\x7d\xd3\x27\x6d\x8a\xee\xb3\x49\x25\xd1\x7d\x06"
+ "\xba\xfd\x0f\xfb\x0c\xfd\xb3\x46\xf9\x27\x4c\xba\x80\x79\xfb\x80"
+ "\x2e\xf7\xa4\x0e\x1f\xdd\xbb\x47\xcd\xad\xef\x55\x63\x87\xea\xc3"
+ "\x77\x90\xc7\x77\xe9\x38\x70\xaf\x45\x4f\xfb\xd9\xa5\xfd\x70\x6f"
+ "\x06\x74\x74\x47\x63\xa9\xdc\xdb\x52\x7d\xc8\x34\x47\x3e\xcf\x72"
+ "\xde\x9f\xba\x77\x22\x97\x45\x1f\x0b\x6f\x30\x44\xac\xd7\x91\x3f"
+ "\xc0\x70\xf8\x6c\x68\x0c\xac\xe2\x2b\x19\xe3\x2f\xe3\x53\xb3\xc6"
+ "\x53\x76\x07\xe0\xdd\xf7\xbc\xe2\xd5\x7b\x63\xed\xdf\x7a\xbc\x7b"
+ "\x58\xf1\xe9\xe4\x11\x31\x38\x04\xe2\xf3\xe9\x7d\xa9\x68\x43\x7d"
+ "\x7c\x3e\xbd\x2f\xb3\x7f\x3e\xbd\x0f\xfd\x4f\xf5\x11\x73\x9f\xc1"
+ "\x8f\x87\x7c\x31\x73\x9f\xfb\x1c\xd6\x80\xe2\x1d\x69\x13\x55\xee"
+ "\x5d\xd3\xe5\xbe\x2f\xd6\xfe\x43\xdf\xe4\x0e\xd4\x71\x4e\x8a\x29"
+ "\xdf\x8f\xfd\x77\x1f\xdb\x7f\xef\xf4\x83\xf3\x65\xec\xbf\xfb\xd8"
+ "\xfe\x7b\xe7\x52\xd9\xca\xd5\xed\xbf\x78\x73\xbc\xdc\x91\xf1\xfb"
+ "\x3f\x37\xa6\xff\x29\xaf\x04\xf3\x61\x59\x3e\x3a\x5f\x51\x64\x3e"
+ "\xf6\x4d\xe2\xbc\xcc\x23\x71\xf2\xd6\xc4\xc2\xec\x27\x9f\xe7\x12"
+ "\xde\x63\x5f\xaa\xb8\xbc\x97\xab\x9f\x29\x99\x3c\x31\x5a\x1e\x27"
+ "\x9b\xa3\xe5\xf1\xbe\x86\xe8\x72\x93\x33\xa2\xdf\xdf\x1b\xf8\xdf"
+ "\xd3\xb1\x93\x37\xc5\xf0\xc0\xc1\x93\x74\xff\x35\x8a\x07\xee\x9f"
+ "\x1f\x83\xc7\xae\xf8\x3c\x30\xb9\x11\xed\x3f\x18\x9f\x07\x26\xfb"
+ "\xfa\xe7\x81\xc9\x21\xd0\xf2\x60\x24\xdf\xce\x2c\xcd\x19\x10\x9d"
+ "\xe7\x7e\x7b\x7c\x9d\x77\x7f\x76\xfc\x35\x82\xfb\x67\x28\x1a\xdf"
+ "\x5f\x11\x4d\xe3\xfb\x1d\xd1\x34\x44\x5b\xfe\xe7\x34\xec\x8d\x07"
+ "\xd1\xe5\xbe\x3f\x56\xfe\xbd\x27\xe9\x27\xba\xfc\x4f\x79\x20\x06"
+ "\xc7\x80\xc2\x25\xde\xba\xc8\x4f\x78\xfe\xeb\x8d\x4f\xcb\x9f\x8c"
+ "\x8c\xdf\xe6\x9f\x4c\xc4\x18\xe4\xd5\x2e\x91\xa5\x9f\xcc\x46\xfa"
+ "\x4c\x5e\x0f\xe5\xf5\x90\x3a\xa4\xcf\x0c\x91\x45\x8e\x57\xbd\xe3"
+ "\xd2\x4f\xca\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x46\x33\x78\x0c\x62"
+ "\xbc\xf2\x4b\xa5\xdf\x82\x75\x0d\xf3\xfa\x8d\xcc\xeb\x3f\x91\xf6"
+ "\x1f\xef\xb3\xb0\x1f\xa1\xd5\x49\x33\x38\x2e\x85\xc1\xef\x9c\x3f"
+ "\x06\xf6\x71\x96\x0b\xce\x6f\xe4\x55\xeb\x66\xe5\x31\xba\x69\x8a"
+ "\x39\x7e\x1f\x4f\x19\xd6\x3f\xef\x4c\xc9\x56\xfd\x3c\xa5\x28\xba"
+ "\x9f\xa7\xcc\xd0\xdc\x83\x66\x71\x5b\xc1\x03\x57\x24\x27\x25\x76"
+ "\xe1\xef\x57\xdf\xaf\x7e\xb4\xb5\xb8\x8c\xbe\x75\x9a\xa6\x1c\x93"
+ "\xf5\x99\x44\xd0\xba\x2a\x81\x1a\xa5\x0e\x98\x7a\x8b\xc4\x13\x79"
+ "\xf2\x43\x64\x12\xab\x9f\x6e\xe5\x77\xf5\x6e\x11\x44\xbe\xa3\xbc"
+ "\x27\xc0\x67\xab\xc1\x0b\xd7\x9e\xa0\x29\x67\xa2\xca\x43\xf2\xbd"
+ "\x0a\x46\x66\xbd\x94\xc7\xa9\x19\xc6\x9a\xee\x1a\x3c\xc7\x5f\xf7"
+ "\x9d\x9a\x6b\xf8\x3e\x28\x9f\xb1\xa9\xfd\xee\x5f\x32\x4e\x7c\x56"
+ "\x86\x71\xba\xbc\x1e\x98\x5a\x6b\xf0\xaf\xf2\xb5\x9c\xba\xab\xcf"
+ "\x97\x6f\xea\x7e\xbc\x2b\xb8\xcc\xda\x60\x84\x1c\x4c\x6d\x8b\x84"
+ "\xa3\x62\xa2\x4c\x0d\x1a\xfe\x78\x5d\xee\x69\xe6\xaf\x80\xa5\xe3"
+ "\x33\x6d\x64\x34\x3e\xd3\xc6\xc2\x4e\x49\xd7\x61\xe4\x5e\x0e\x06"
+ "\xf7\xb9\xe2\x59\xe6\x87\x69\x05\x97\x5b\xf3\x4b\xb4\xd1\x8c\x8d"
+ "\x97\xf0\xd6\x34\x69\x2f\x31\x8c\xaf\xc0\xf1\x68\xd4\xdc\x42\xee"
+ "\xdd\xf3\xde\xd6\xf4\x2d\x4a\xee\xa7\xc7\xac\x11\x4e\xeb\x90\xfe"
+ "\x54\xba\xdc\x3f\x1e\x8a\x95\x83\xe9\xa9\xc6\x18\x1d\x93\x9e\x61"
+ "\xc8\x3d\xe6\xb5\x0c\x37\x66\x9d\x75\xfa\x44\x25\x0b\xd3\x6b\xb5"
+ "\xe4\xc8\xf9\xda\x74\x69\xff\x19\xeb\xa5\x78\x3f\x31\xa6\x5c\xcc"
+ "\xfa\xdf\xb4\x0e\xd1\xff\x3a\x7d\x2a\xfa\x37\xc0\x7b\x5b\x2a\x56"
+ "\xc3\xf4\xa6\x98\xf5\x0a\xff\x06\x79\xfe\xfe\xaf\x80\x3b\x43\xd7"
+ "\x7b\x0f\x8c\x8f\xa9\xaf\xc3\x75\xe6\x72\xed\x9f\xd1\x4f\xfb\x67"
+ "\xf4\xb5\x7f\x81\x84\x1b\xb3\x96\x38\x43\xb6\x3f\x7c\x89\xfe\x9b"
+ "\xc1\x3e\xa4\x06\xdd\x60\x73\xcf\xd8\x6b\xd8\xea\xbc\x7e\xd0\xbf"
+ "\xad\x3e\xa3\x6f\xfd\x4f\x95\xeb\x5b\xff\xf3\xc7\xb3\xd5\x7d\x24"
+ "\xf7\x56\xa3\xeb\x6e\xb5\xd6\xc6\x6d\x4b\x3f\xeb\x7f\x0f\xe8\xeb"
+ "\x7f\x0f\x14\x44\xeb\xb3\x07\xec\xd1\x7d\x38\x23\xa6\x0f\x1f\xc8"
+ "\x89\xee\xc3\xe9\x1d\xff\xdd\x71\x0d\xcf\x94\x98\x98\x68\x4a\x4c"
+ "\x30\x25\x24\xe2\x35\x9a\x48\x03\x12\xcd\x89\x49\xf8\x5d\xa5\x5f"
+ "\x07\x98\x12\x4d\x66\xfc\x92\xf4\xeb\x55\x31\xcf\x03\xb8\x2c\x7e"
+ "\x66\xfd\x9a\x14\xf3\x7c\xd5\x57\xbc\x1f\xa0\xd7\x6b\xd4\x6f\x8e"
+ "\x79\x4e\xfa\x8a\xf7\x57\xfd\x0f\xcb\xd3\x25\xcf\xd1\x7e\x68\x93"
+ "\x17\x2c\x99\x53\x34\xbf\x50\xee\x17\xcf\xb5\xcf\x79\xf2\xc9\xb9"
+ "\x8b\x17\xdb\x4b\x16\xda\xef\x19\xff\xe0\x1d\x77\xd9\xd5\xb6\x73"
+ "\xd1\xb8\x11\x85\x29\x34\x75\xe9\x22\x7e\x31\x75\xe6\xe4\x3c\xfb"
+ "\x8c\x7b\xc6\x47\xbf\x34\xc0\xc8\xed\xe5\xcb\x41\x89\x90\xbf\x9c"
+ "\xca\x21\x44\xeb\x5e\x91\xba\xa7\x8d\xfd\x7c\xd5\x9a\xc7\xcf\x0e"
+ "\x35\xb1\xff\x68\xb7\x4b\x78\x6e\xe4\x3d\xfd\x99\x73\xb9\x11\xa3"
+ "\xb6\x96\x53\xf1\x13\x7c\x7e\x65\xe6\x2a\xf1\x91\x9f\xec\xf7\x93"
+ "\xe9\x04\xcd\xfe\x73\x63\x2e\xf2\xe2\xd9\xeb\x0b\x91\xdd\x45\x16"
+ "\x94\x7f\x16\xef\x12\xc4\x8f\x35\xa4\x05\x74\x5f\xe8\x9f\xae\x92"
+ "\x69\x1f\x95\x1b\xf9\xac\x27\x69\xd6\x08\xf1\x91\x90\xcf\x7c\x3e"
+ "\x48\xe5\x9b\xf9\xa5\x30\x3d\xb8\x9f\x75\x43\xed\x60\x32\xf3\x5e"
+ "\xe8\x6b\x83\xc9\xf2\xda\x10\x8e\x59\x32\xb3\xc3\xd8\x0b\xad\xc4"
+ "\xb3\x8f\x66\x1f\xe5\xba\x39\xaf\x66\x7a\xf0\x04\xe7\xaf\x8b\xca"
+ "\x3f\x6b\x58\xdf\x5e\xec\xcc\x0e\x13\xf2\x4d\xff\x9c\xac\xd6\xb0"
+ "\xf8\x47\x30\xe5\xed\x82\xdb\x72\x29\xc1\x8b\xae\x68\x0a\x95\x93"
+ "\xf2\xf9\x99\x35\x77\x59\x58\x84\xd8\x3f\x7d\x6a\x87\x4b\x54\x3d"
+ "\x43\x66\xc8\x74\x82\x67\x11\xfb\x28\xcc\x9a\x52\x3f\x97\xcc\x68"
+ "\xff\xb0\xd3\xf4\x50\xa9\x7d\x1a\x91\x6b\x2a\x99\xff\xe4\x64\x7f"
+ "\xc3\xbd\xda\x86\xbf\x90\xf9\xad\xee\x72\x53\xb7\xb0\x51\x69\x89"
+ "\x68\x17\x1c\xc7\x28\x20\x82\xec\xe3\xdf\x54\x10\xe6\x3c\x67\xbb"
+ "\x5c\x36\x6a\x29\x09\xd0\xca\xe3\x22\x58\xf1\x17\x75\x36\xa0\xb9"
+ "\x23\xc0\xfe\x8b\x96\x95\x53\x29\xf1\x64\x1e\x99\x9a\x1d\x35\xe4"
+ "\x9d\x1d\xa0\xd2\xe3\xa2\xbd\xa9\xe0\x0b\x6a\x71\xec\xa6\xfc\x56"
+ "\x32\x35\xb5\x7d\x46\x32\x16\xcf\xda\x33\xec\xf7\x68\x5b\x39\x9f"
+ "\xd3\x2e\xd0\xf2\x95\x34\x70\xf9\xa7\x64\xf5\xb6\xb7\xa2\x9e\x33"
+ "\xf4\xc8\x31\x4a\x00\x3c\xd3\x8a\xcf\xc8\xb6\xe2\x61\xf6\xf3\xcd"
+ "\xa1\xda\x32\xb2\x09\x57\x66\x6a\xb7\x2b\x33\xad\x5b\x64\x0e\xee"
+ "\x72\x65\xa6\xb7\x14\x23\x7f\xdb\x87\x34\xa8\x95\xd2\x3f\x3a\xdd"
+ "\x6a\xaa\x39\x4f\xc3\xb8\x4d\x27\xd1\xb6\xda\xf3\xc8\xbf\xf6\xe3"
+ "\x72\x0d\x65\x23\xcb\x84\x92\x3f\xae\xf1\xe6\x05\x49\x03\xac\x9a"
+ "\x6e\x1a\x56\xdb\x4d\x36\xad\xf2\xe3\x72\x2e\xd7\x41\x3f\x5d\xe6"
+ "\x6d\x22\x2a\x5d\x29\xc2\x3d\x6b\xf7\x16\x40\x27\x0e\x78\xe7\x89"
+ "\xfd\x66\x6f\x53\x07\x35\x07\xba\xa9\x85\xfe\x4a\x5e\xe7\x29\xcf"
+ "\x5b\x4f\xec\xe7\x35\xeb\x04\xcf\xf2\x36\xd4\xa5\x78\xc7\xd5\xcc"
+ "\x67\x95\xcb\xa9\xaa\x8c\x52\x8b\x97\xd3\x80\xd3\x48\x57\x73\xfb"
+ "\x06\x87\x37\x74\xca\xb3\x5c\xfa\xe3\xce\x3e\x5a\xd6\x4c\x89\x2d"
+ "\x81\x1a\x6e\xbf\x29\x9c\x72\x86\xbc\x81\xa3\xe4\x2d\xfe\x9b\x47"
+ "\xb3\x74\xb4\xaf\xd3\xc8\xf2\xf6\xc5\xa3\x26\xaf\xf9\x22\x79\xf3"
+ "\x02\x74\x10\x75\x8b\xb5\x67\x52\xa1\xb7\x72\x5a\x02\x41\x3e\xef"
+ "\x94\x25\x3a\x6d\x29\x55\x8b\x68\x64\xdd\x79\xca\xd8\x72\x9e\x32"
+ "\x45\x57\xa6\x89\x7d\x6c\xf9\x6c\xea\x16\x5c\x53\xdb\xc8\x82\xb6"
+ "\x2b\x7f\xec\x64\xdd\xd7\xb6\x27\x93\xea\xbb\xfb\x7c\x6d\xbb\x3b"
+ "\xfb\x7c\x6d\xc1\x53\x7e\xf6\xb7\xf5\xd1\x43\x6b\xac\x4d\x34\x00"
+ "\x72\xd2\xc0\xfc\x5d\x75\x96\xcc\xab\xcf\x12\xdd\x56\x6e\x22\xfb"
+ "\x3c\x3e\x67\xf1\xb3\xb9\x5e\xf4\x0d\xdf\x9f\xa0\x9f\x0d\xc3\x35"
+ "\x15\xbf\x04\xa4\xcb\xf8\x0d\x6d\x3a\x1f\x23\xcd\x84\xb4\x24\x5c"
+ "\x13\x21\x2f\x61\x57\xad\xf0\xa3\xae\xfd\x9d\x26\x4a\x61\x7e\xd6"
+ "\xfd\x7b\xf7\x77\xb9\x7f\x1a\xf0\xd1\x33\x1d\x06\x5f\x2b\x1d\x3f"
+ "\xd3\x7f\xf0\xc4\x19\x8e\x97\xe5\x97\x78\xf5\x38\x12\x38\x76\x96"
+ "\x9e\xce\x38\x3c\xc6\xf5\xa2\xfe\x1c\x5c\xad\xf8\x41\x4e\x7f\x7a"
+ "\xcc\x28\xdb\xd9\xe3\x40\x9d\x3f\x7b\x08\xe9\xc2\x48\x47\xbb\xcd"
+ "\xfc\xee\x77\x27\xce\x98\x54\x9e\x4c\x13\x60\x06\x75\xf8\x90\xfd"
+ "\x99\x9b\x58\xc6\x3b\x4d\x56\x71\xb8\x60\x0c\xd5\xbe\x22\x9a\xb6"
+ "\xbc\x22\x1a\x95\xec\xfd\xac\xc6\x47\x0b\x8d\xf8\x42\x8d\xeb\xf0"
+ "\xee\x30\x46\x1d\xa6\x4b\x63\x21\xfb\x93\xfd\x0c\xf6\xdf\xd5\x07"
+ "\x22\xdb\x20\xdc\x0f\xd4\xf0\x58\xfa\x9b\xb2\x23\x49\xd0\x01\x35"
+ "\x2d\x6d\x1d\xf4\x56\x77\x7b\x92\xeb\x8f\x64\xf2\x86\x4e\xd0\xe8"
+ "\x74\xb2\xb1\x3d\x58\xff\x8a\xf0\x6d\xe4\xf8\x7c\xaf\x88\x0e\xf0"
+ "\xcb\x0d\xa7\x29\x2f\xe9\xbb\xe9\x94\xfe\xaf\x4e\xd2\xf5\x53\xde"
+ "\x0d\x11\xfa\x69\x7b\xb3\x6f\x7f\x84\x6e\x9a\xfd\xd0\xa5\xba\xe9"
+ "\xd1\x07\x94\x6e\x82\xec\x4b\x5d\x14\xf6\xe9\xe9\xe3\x62\xd2\x75"
+ "\x3f\x91\x47\x87\xc7\xa4\x07\xf5\xf4\x81\x31\xe9\x7e\x95\xfe\xc8"
+ "\x54\x43\xf7\xb5\x30\x1e\x4b\x59\xf7\x3d\x72\x3b\xeb\xbe\x96\x02"
+ "\x5d\xf7\x49\xfd\xf3\xc8\x75\xe2\x5f\xa0\x8b\x96\xb0\xbe\x79\xf8"
+ "\x0c\xe3\x2f\x3e\x22\x03\xf7\x64\xa4\xbd\xcd\x69\xd5\x7f\x25\x33"
+ "\x7e\x86\xde\x13\xac\xf7\x58\xe7\xb1\xee\xdb\x3c\x44\xb4\x6e\x7e"
+ "\x45\x1c\xab\x95\xb1\x7f\x1e\xee\xd5\x7f\x2f\x22\x6d\x1d\xd2\x5e"
+ "\xc4\x7b\xd6\x83\x4c\x93\xe6\xbc\xfd\xc4\xfe\x27\xb0\xb5\x42\x9a"
+ "\x29\x8b\x36\xa0\xbf\xf9\xbc\xe1\x1a\xd0\xd7\x9a\x40\xc5\xde\x12"
+ "\x3e\xc3\x1a\x66\x9f\xb4\xb6\x96\x92\x36\x96\xbb\x21\xab\x21\x67"
+ "\x5e\xe7\x17\x54\x16\x10\xa7\xf9\xdc\x1d\xe3\x90\xbf\xec\x7e\x8e"
+ "\x97\x94\xd0\x88\xd9\x30\xfb\x85\xb3\xce\x06\x2e\xe6\x6a\xe0\xa4"
+ "\xe2\xb3\x3c\xbc\xcd\x47\xdb\xca\x55\x5f\xcf\x3e\xca\x71\xd9\x4e"
+ "\x50\x5e\x3b\xe6\x7b\x41\x6e\x9b\x35\x5c\x4e\x7c\x0e\x86\x63\x15"
+ "\xf2\x75\xb3\x49\x73\x54\x1b\x67\x61\xdc\xd0\x0d\xc8\xe3\x6d\x0d"
+ "\x12\xe3\xec\xa3\x87\xc7\x34\x97\xee\xe7\xf2\xad\x4c\x1b\xe1\x76"
+ "\x19\x30\x12\x24\x0c\x93\x9c\x37\x3a\x90\x4f\xad\x9d\xa7\xec\x2d"
+ "\x68\x9e\xed\x27\xd6\xfb\xde\x76\xc0\x28\x3d\xa1\x60\x00\x96\xc0"
+ "\x18\x10\xf5\x4e\x87\x3f\x70\xa5\xf8\x07\xe0\x6f\xe3\xfe\xe2\x73"
+ "\x91\xbc\xdf\x06\xba\xa4\xb2\xaf\xbc\xb2\x45\x1f\x1e\x55\xff\x57"
+ "\x22\xfd\x6c\x27\xf8\xed\xe1\x91\x7c\x6e\x89\xcf\x73\x5e\xee\x2c"
+ "\x27\x68\x94\x61\x9c\xe7\xd4\x96\xfe\xef\x9e\xe5\x04\x6c\x5b\x9d"
+ "\x49\xec\x06\xfe\x23\xf9\x3c\x27\xf0\x5f\xc7\x7c\xa8\xb7\x29\xeb"
+ "\xe5\x47\x24\xcd\x4b\x38\x0d\x73\xc7\x23\x46\xff\x73\x7b\xb9\x2d"
+ "\x78\x97\xa7\x6c\x44\x81\xf9\xc7\xa3\x59\xfc\x1e\x69\x13\x39\xff"
+ "\x68\xe8\x31\x2f\xc6\xb0\x77\x4e\x84\x4d\x55\xcb\xc9\xac\x74\xda"
+ "\xec\xc9\x5c\x5e\xe9\xb4\xd9\xd4\xa7\xd3\x1e\xbd\xa0\x74\x9a\xa2"
+ "\xb1\xd2\x69\x8f\xfe\x5d\xe9\xb4\x47\x3f\x97\xfb\x62\xd0\x69\xfc"
+ "\x8e\xf5\x9a\xa1\xd3\xb6\x0c\x11\x47\x58\x77\x74\xb9\x1f\x3d\x6a"
+ "\xe8\xb6\xf5\x48\x63\xdd\xc1\x38\x2a\x3d\xf5\x48\xa6\xf8\x7f\x33"
+ "\x49\xf9\x1d\xf0\xbd\x83\xcf\x2f\xb4\xeb\xf7\x3c\x9e\x8c\x57\x3a"
+ "\x6e\x76\x46\x9f\x8e\x7b\xb4\xa1\xaf\x2c\xeb\xb8\xd9\x3f\x54\x3a"
+ "\x4e\xa5\xd7\x3f\xc2\x3a\xee\x91\x4c\xa6\x81\x0e\xdf\xc4\x6b\x78"
+ "\x7a\x7e\xa6\x63\x56\xa4\x8e\x8b\x96\xaf\xd9\xa5\x86\x8e\x63\xdd"
+ "\x86\xe7\x75\xd0\x69\x72\x0e\xc9\x72\xb6\x09\x34\x37\xe4\x8e\xfb"
+ "\x80\xdb\xcc\xf1\xd7\x98\x6e\x13\xce\xd0\x00\xfd\xec\x90\xde\xee"
+ "\xd9\x47\x0c\xdf\x47\xd0\xff\x68\x3c\x3b\xba\x2f\x46\x22\x7d\x9b"
+ "\xcf\xce\x7b\xcb\x4f\x90\xb7\x46\x94\xb7\x84\x8e\x53\x7e\x09\x74"
+ "\x45\xe2\xd3\x9f\x73\xdf\x62\xde\xf1\x23\xbe\xb2\xee\x39\x4d\x8f"
+ "\x0d\xcc\x0f\xd0\x55\x98\xab\x7f\x5e\x65\xc2\x3b\x67\xd4\x3b\xb9"
+ "\xc6\x70\xdb\x22\x8e\xaf\x07\x41\xe8\x67\xbe\x7f\x85\xf5\xad\xbc"
+ "\x4c\x7d\xaf\xc9\xfa\x60\x53\x61\x0e\x74\xcd\x59\x7a\x4c\xce\x4b"
+ "\x64\x7c\x9b\xd5\x71\x61\xfd\x51\x7f\x9f\xd4\xcf\xfb\xbf\x5f\xbe"
+ "\xfc\xe3\xc9\x97\x2f\xff\xf8\x2d\xac\x8b\xd0\x3e\x6b\xd8\x1d\x0d"
+ "\x67\x50\xc8\xc8\x77\x9a\xf3\x3d\xa0\xaf\xc5\x7c\xee\x1a\x2e\xe7"
+ "\x68\x36\x03\x26\xf3\xdf\x06\xe4\x93\x31\x43\xa0\x2b\x27\x2e\x23"
+ "\x8e\xd7\x12\x59\x76\x7d\x1f\x8d\x1f\xcf\xb9\xcc\xba\x5f\xaa\xb7"
+ "\x86\x64\xcc\xd8\xc3\xb0\x49\x39\xa6\xd1\xa6\xde\xf5\x8f\xc7\xdb"
+ "\xa0\x37\x7d\x11\x7e\xb1\x3c\x1f\xfb\x36\xc7\x35\x60\xfb\xb2\x4a"
+ "\xcd\x37\xaf\x87\x7e\x1e\xcc\xe7\x61\xf8\x6c\x4c\x7e\x78\x86\xe9"
+ "\xb0\x8c\x65\x96\x6f\x37\xca\xf6\xb7\xce\xc2\xf5\xea\x75\xb2\x8f"
+ "\x69\x00\x65\x66\x19\x65\x18\x36\xfb\x29\x62\x5c\xfe\xb6\x3c\x53"
+ "\x1a\xea\x60\x5d\x78\x3d\x6c\xd1\xc1\xaa\x9e\x02\xd2\xeb\xa9\xf0"
+ "\xd1\x63\x33\x2e\x77\x36\xa3\xff\xf6\xe5\x37\x5e\x79\xfb\x48\x6f"
+ "\x5f\x01\x7d\x45\xfb\x2e\x53\x6f\xc1\xd8\x2b\xaf\x37\xcd\xa8\xd7"
+ "\x79\xe5\x74\x2d\xd8\xf5\xf5\xe9\x9a\xa5\xd3\xb5\xc0\xf7\x15\x74"
+ "\x8d\x53\xcf\x9c\xf4\xaf\x5f\x8f\x5d\xaf\x67\x4e\x6e\xbc\x7a\x48"
+ "\xfe\xf5\x7b\x6e\xca\x62\xc4\xda\xec\x84\xec\xa8\x58\x75\x73\xaa"
+ "\x23\xe3\x17\x77\x4a\xb9\x9a\xb3\xad\x37\x5e\xb2\xda\x2b\x87\xae"
+ "\x9e\x73\x28\x7f\x2b\x8f\xef\x42\xf3\xd1\x9c\x46\x8e\xe3\x3a\x71"
+ "\xa5\x3a\x93\xad\x97\x69\xbd\x5c\xdc\x64\x8e\xd1\xc5\x31\xf9\xbc"
+ "\x36\xb4\xbd\x86\x63\x97\x1c\x2a\x60\xff\x7b\xcc\xa9\xa0\xe3\x9f"
+ "\xb8\x81\x63\x8e\xe1\x7e\x00\xee\x33\x95\x0e\x78\x22\x13\xf5\xf4"
+ "\x7f\x76\x72\xed\xa1\xe2\x6d\x65\x59\x49\xfd\xf9\xd7\xa3\x3c\x6c"
+ "\x8a\x67\xe5\xda\x94\x96\x72\x70\x06\xe6\x12\x7a\xbc\xbf\xc2\x2f"
+ "\x64\x0c\x38\x57\x1e\x9f\x27\xc1\xb8\x58\x38\x50\x3f\x07\x00\x7a"
+ "\x94\x83\xae\x4f\x6c\x35\xe8\x61\xa4\x23\x6d\x8f\x41\x0f\xd8\x37"
+ "\xa9\xde\xad\x21\x3e\xa7\x13\x50\x67\xb2\x9f\xf8\x77\x51\x79\xc8"
+ "\xa1\x60\x3f\xa9\xf6\x68\xb8\xbe\x9e\x3c\xb3\x9c\x37\x95\xf1\xbc"
+ "\xe9\xc9\x03\xfe\xe4\x43\x0e\x03\x0f\xb1\xd8\x66\xe2\xb3\xdf\xa3"
+ "\x31\x96\x6e\x50\x31\xf7\x12\xf8\x9c\x9c\x7c\xbf\x38\xd3\xa4\x68"
+ "\xf2\xe4\x38\xd1\xc9\xb1\x63\x24\xec\x54\xe0\xd9\xc6\x70\x7d\xb8"
+ "\xfa\x57\x64\x72\xdc\x0b\xbd\x3d\x4f\x8e\xd0\xd6\x1e\x9c\xa1\x75"
+ "\xd9\x4c\x06\xbe\x75\xf2\x4c\xeb\x93\x68\x7f\x81\x8a\x13\x2b\xf1"
+ "\xb1\x99\xd8\x9f\x5f\x4b\x39\x54\x2c\x56\xd8\x68\xcf\xa2\x76\x39"
+ "\x6f\xe2\x3a\x47\xa3\x7e\xc1\xf3\x24\xd8\x26\x28\xb7\xb5\x97\x6e"
+ "\x80\x2b\xba\x0c\xba\x3d\x39\x45\x8d\xcb\xaa\x8d\x81\x15\x36\xd3"
+ "\x61\xbf\x3c\x6f\x47\x19\x76\xd7\x97\x2a\x16\xf6\x93\xc7\x0d\xda"
+ "\xf5\xe2\x04\x7c\x38\x8f\xf2\x6f\x7a\x32\x64\xe0\x24\x65\x37\x85"
+ "\xcf\xef\x3e\xe1\xe7\x73\x43\x8a\xfe\x87\x53\xbb\xdc\x85\xf6\x4b"
+ "\xe9\x5f\x38\x26\x82\xfe\x89\xcc\x7b\x4c\x7f\x5e\xeb\x00\x5d\x1e"
+ "\x03\x2d\x2d\xea\xbc\x03\xdb\x33\x85\x73\xf1\x9c\xca\x78\x6a\x95"
+ "\x06\xcd\xf3\xcc\x6a\x9d\xac\xb0\x26\xa2\x1f\xd0\x5e\x1b\xdb\x6a"
+ "\x09\x46\xfb\xb9\x0c\xd3\x80\xe3\x4a\x72\xdd\xc0\xe7\x6a\xd4\xbd"
+ "\x3b\xb6\x4d\xab\xd5\x59\x12\x52\xbe\x25\x85\x47\x23\x62\x8b\xfb"
+ "\x4b\xec\x22\xa8\xce\x25\x17\x3a\xf7\x94\xf9\xcd\xfd\xe9\x00\xe6"
+ "\x41\x19\xa3\xd2\x24\xd7\x15\x60\x73\xcd\xfb\x44\x00\x37\xd5\xf7"
+ "\xf3\xb6\xa8\xb4\xb9\x7f\xc7\x15\x3c\x36\x77\xbc\x40\xdd\x7e\x97"
+ "\x8c\xb1\x82\xb6\xcd\xf3\x31\xcf\x19\x7c\xc6\xeb\x90\xca\x67\x7c"
+ "\xee\x76\xd6\x29\x06\xcd\x81\x7f\x4a\x97\x7b\x6e\xb1\x81\xbf\x91"
+ "\x9f\xfb\x8e\xf3\xf0\x9e\x4d\xa3\x3d\x28\x75\xad\x3a\x33\x34\xb7"
+ "\xd6\x90\x61\xae\x83\xfb\x99\x75\x0d\xd3\x43\xd1\x62\xee\x81\x68"
+ "\x58\x36\x93\x8a\x9b\xc9\x3c\x0f\x79\x5c\x1e\x4c\x42\x1e\x5f\x1f"
+ "\x8c\xb9\xb3\xd5\xbb\x5e\x3c\xd9\xcf\x5f\xfa\xe2\xa9\xfe\x98\x37"
+ "\x99\xdb\xd5\x87\x2f\xcb\xdf\xbc\xde\xfe\xe7\x77\x01\x97\x8d\x63"
+ "\xf0\x4a\x1d\x53\x32\x9c\xf1\xf5\x73\x6c\x5b\xc9\xeb\x80\x5f\xcd"
+ "\xb8\x73\x1e\xa3\xcf\xfa\x78\x71\x9e\x23\x12\x8e\x70\x49\x5c\x25"
+ "\x1c\xa5\x3b\xfc\xbc\xb7\x6d\x57\xfb\x2d\xf3\x36\x45\xb4\x3b\xd5"
+ "\xc0\xa7\x4f\x27\xcc\xdb\x13\xcb\x93\x5c\x37\xc7\xe2\xd3\x61\xb3"
+ "\x2e\x49\x3b\x41\xf3\xb6\xea\x78\xd9\xb8\x1f\xfb\x1b\xdf\x38\xce"
+ "\x25\xc7\x3e\xdd\xa8\x74\x08\xfa\xd9\x31\x7c\xa3\x3a\x47\x14\x50"
+ "\xf1\x4f\x7f\x3e\x42\x98\x7e\xc5\xb4\xe2\xf5\x74\xbf\x8c\xd7\x21"
+ "\xcf\x98\xff\x9c\xf7\xf8\xc5\xa0\xe2\x5f\xc9\x58\xb7\xba\x6f\xa0"
+ "\xbf\xb1\x38\x24\x63\xf9\xb9\x4a\xf8\xcc\x6d\x88\xe7\x7a\xd2\xf7"
+ "\xed\x70\x49\x88\x66\x06\x59\x26\x7e\x5e\xc2\x67\xe9\x55\x1c\xf1"
+ "\x9f\x97\x1b\xe7\xe7\x39\x76\x26\xc7\x7d\x85\x1e\x4a\xec\x8b\xdb"
+ "\xea\xc8\x63\x1b\x4b\xef\x5f\xda\x60\x12\x47\x95\xfc\xff\xfc\x8f"
+ "\x7c\x5e\x5e\xed\x63\x9d\x80\x4e\x48\x3c\x75\x82\x7e\xfe\xb9\x5a"
+ "\xf7\x31\x74\x94\xe3\x61\xde\xcb\xf2\xe9\x30\x50\x57\x07\xe4\x7b"
+ "\xc6\xa5\xba\xe4\xe7\x7f\x34\xe6\x2e\x7c\xfe\x4e\xed\x8b\xf5\xc1"
+ "\xf3\xd1\xcf\xe5\x5c\xb0\xaf\x0f\x3e\x06\x2c\x47\xf6\xa5\x7a\xc1"
+ "\x31\xc5\x90\xbd\xe2\x1b\xf9\x0c\xf7\xcf\xd3\xb8\xfe\xfe\xc6\x0b"
+ "\xe1\x7a\x98\xfb\xc9\x72\xd2\x1e\xbf\x6f\xe2\xef\xb3\x39\x76\x1b"
+ "\x6d\x30\x68\xa2\xda\x30\x3f\xb9\x33\x65\xef\xba\xbe\xb6\xcf\x97"
+ "\xb6\x6b\xc4\xfb\xf1\x11\xb4\xe1\xe7\x1c\x35\xae\xcd\x07\x7d\x0a"
+ "\xf5\x58\xb5\x2a\x0d\xb2\xf3\xb4\x58\x91\x47\x0a\xc7\xf9\x64\xc8"
+ "\x3a\xf2\x8e\xf4\xd1\x05\x9b\xda\xef\x9a\x8f\xf6\x3b\x2a\x54\x39"
+ "\xc7\x31\xc6\x25\x6e\x3b\xa3\x71\xdc\xcf\xb6\x86\x8a\xa9\x30\xff"
+ "\x7d\xc6\xd7\x7e\x13\xf7\xf1\xfc\xe7\xa5\x0e\xe7\xf8\x0a\x3d\x8e"
+ "\xa4\x40\x4f\x26\x75\xf6\x38\xa0\x17\x32\x4d\xa8\x07\xfa\xbf\x33"
+ "\xa0\xd7\xb9\xcb\xc0\x95\x71\x93\xf1\x39\xc5\xfc\xf8\xf4\xe5\x7a"
+ "\x65\xcc\x27\xc7\x00\xfc\x2c\xf8\x5d\xf5\x75\xed\x12\xd8\xe9\xed"
+ "\xfe\xca\x03\x69\xda\x12\x71\x84\xe3\x8b\x61\x2e\xd2\x5e\x05\xfe"
+ "\x1d\xb4\xca\x03\xdb\xfc\x31\x53\xfe\x32\xca\xc1\x9c\x99\xc4\x45"
+ "\x91\x5d\xa7\xe1\xba\x44\x8c\xe1\x38\xe3\x78\xce\xd2\x9f\x47\xf2"
+ "\x73\xe7\x12\x31\xbb\xcb\xfd\x54\x81\xb1\x47\xa8\x62\xe3\x3c\x55"
+ "\xdc\x1b\x4f\x28\xf1\x51\x3e\x4f\xc4\x71\xa7\x34\xcc\x85\xda\xb9"
+ "\xde\x7c\x9e\xcf\xa2\x3e\xe4\xab\x81\xbd\xd1\xc6\xf9\xfc\x89\xb7"
+ "\x0e\xc6\x2f\xb3\x9f\xbd\xd4\x76\xc6\xab\x33\xf9\x40\x9a\x81\xeb"
+ "\xa0\x40\x8e\xe9\x6b\xe2\x16\x32\x70\x43\xfa\x91\x2a\x95\x1e\xe2"
+ "\xf8\x87\xec\xeb\xd8\xe5\x7e\x7a\x98\x81\xab\x81\x03\xd7\xc7\xe7"
+ "\x37\x45\xca\xde\x1a\x8e\x3d\xc3\xf5\x71\x3c\x55\xe4\xcd\x35\xf0"
+ "\xfd\xba\xbc\x5c\x56\x2b\x04\x8f\x9f\xac\x7f\xed\x43\x89\x5a\x02"
+ "\xac\x53\x9e\xae\x3d\x5c\x1b\xe0\xf5\xee\xd7\x51\xc7\x6b\x9d\xc2"
+ "\x41\x5a\x8f\x23\x6e\x1f\x73\x19\xe4\x6f\x95\xfa\x61\xed\xde\xd7"
+ "\x34\x91\x0b\x3d\x81\x72\x3d\xb9\xbc\xd6\x04\xb9\x2d\x32\x37\x96"
+ "\xb6\xf3\x99\x4b\xe8\x9c\x22\x33\xf2\xd4\xb0\x9d\x85\xf9\x56\x50"
+ "\x7e\xbf\x02\xba\xc9\xb3\x64\x0c\x60\x14\x25\x99\x9d\x64\x6e\x8c"
+ "\x89\x53\xd5\x1f\x7f\x74\x5a\x0e\x56\x74\xae\x3d\x58\xd0\xe5\x2e"
+ "\x82\xfd\xff\x4c\xbf\x7b\xbe\xab\x87\x80\x9e\xc8\x57\x3d\x94\xe7"
+ "\x7b\x45\x8e\xcb\xe5\x35\xf6\xab\x59\x07\x8d\xb6\x51\xaa\x48\x3e"
+ "\x58\xc1\xfa\xb6\x33\xe5\x60\x01\x8f\x25\x28\xdf\x60\x94\xe7\x71"
+ "\x9d\xc7\x0e\xf4\x97\xad\xaa\x57\x1f\x16\x1d\x55\xf2\x5c\x74\xd4"
+ "\x90\xd1\x78\xf5\x94\x6c\x13\x9a\x6b\x04\x99\xbc\x18\xb7\x6e\x0b"
+ "\x52\x6a\xdd\xeb\x44\xd5\xcb\x45\x70\xe3\x72\xcc\x61\x86\xf2\xf7"
+ "\x2e\x8a\x72\x59\x46\x99\xbf\x37\x80\x5f\x12\x81\xcb\xc6\x8b\xa8"
+ "\xb3\x4c\xe5\xd3\xfd\xd6\x6d\xc8\x57\x82\x6b\xba\x30\x99\x68\x53"
+ "\x19\x59\x36\x69\x64\xae\x2e\xa3\x61\x48\x83\xad\xfb\xcc\x2c\x43"
+ "\x66\xe3\xe1\x50\x55\x47\xf4\x12\xea\x5d\x55\x26\x42\x1f\x63\x3c"
+ "\x77\x6b\x22\xf8\x75\xe8\x8e\xf6\xef\x51\x6d\x7c\x66\x8f\x61\x13"
+ "\xe2\xde\x13\xed\x77\xf0\xcc\x25\x67\xbc\x9f\x58\xb8\xb0\x24\x7f"
+ "\xd1\x5c\xbe\x64\x8e\x78\xee\x96\x94\xc8\xb5\x10\x1e\xff\x54\x9c"
+ "\x8a\x67\x5a\x79\xdd\x71\xe3\x60\x63\x1f\x7d\x81\xcd\x58\xfb\xd4"
+ "\xfd\xf5\xef\xe6\x39\x1d\xcf\x7d\xf0\x6e\xcc\xa1\xd2\x95\x0c\x26"
+ "\xe1\x73\x0b\x99\x62\xeb\x9b\x37\xa7\x64\x4e\xd1\x5d\xbc\x63\x96"
+ "\x12\xa7\x9e\x05\xb9\x31\xf5\x94\xf7\xd6\xa3\xc6\x9f\x80\x89\xf3"
+ "\xad\x4f\xdc\x2a\x92\xdb\x73\xd4\x59\xe9\x05\xdb\x8c\x35\xad\x7e"
+ "\xfc\x1c\x5b\xc3\x6b\x3f\xf6\xb0\x3c\xb8\x56\x92\xe9\x77\xcb\x5b"
+ "\x4d\x6c\x47\x96\xe1\x9e\xd7\x16\xe4\x1a\x99\x1e\x2f\xea\xa3\xf3"
+ "\xad\x18\xdf\x17\x04\x45\xe5\x5e\xcc\x8f\x16\xf4\xbb\x66\x13\xe9"
+ "\x23\xc2\x3e\x85\x6d\xb4\x30\xed\x72\x3e\x47\x9c\x9f\xdb\xc3\x3c"
+ "\x1b\x53\xee\x79\xd5\x67\x0b\xc1\xff\x45\xf6\xde\xf3\xbc\x7a\x9e"
+ "\xaa\x21\x46\x1c\xae\x85\xb3\xfb\xf5\x17\xa9\x38\x58\xad\x78\x7c"
+ "\xe1\x27\x8d\x98\xaf\xa1\x9d\xbf\x38\x41\x0b\x0f\x99\x6d\xb0\x11"
+ "\x86\xd2\x4e\xdc\x7f\xc2\x65\xf9\x5d\x14\x1f\xdd\x70\x66\xab\x19"
+ "\xda\x05\x5a\x26\x41\xa8\x3f\x32\xeb\x37\x89\xf8\x99\x44\x82\xdc"
+ "\x4d\x4d\x44\x0f\x0e\xb8\xca\x4c\xd6\x41\xa9\x96\x6f\x7f\x6b\x98"
+ "\xed\xee\x1f\x8f\xcd\x76\x95\x95\x42\x2b\x87\x82\x56\x11\x19\x3f"
+ "\xed\x54\xfb\x43\xb7\x94\x93\xf4\xa7\xa9\x3c\x15\xf7\x2c\xe5\x7a"
+ "\xb7\x28\xe6\xb3\xeb\x5a\x8a\x48\x73\x3d\x47\xa6\x77\xba\x7d\x26"
+ "\x8e\xd1\xcc\xf6\x33\x7f\xeb\xe2\x04\x15\x3f\x70\x10\x69\xa0\x97"
+ "\x53\x54\x88\x34\x65\x77\x16\xff\x52\x5b\x2b\xd2\xfa\xe0\x9b\x89"
+ "\xe1\xbb\x5e\x23\xd3\xb6\xb2\x76\x93\xd7\xfc\x63\xf2\xda\x03\x74"
+ "\x10\xf7\x71\xfb\x0a\x75\xb2\x2d\xcb\x30\xea\xdd\x1a\xc7\xeb\x32"
+ "\xe9\xe7\x4f\x4d\x67\xa9\xf8\x8f\xbb\xfb\x29\xc7\xe7\xbd\x3b\x53"
+ "\x3e\xf8\xb7\x2e\xf7\xb3\x66\x1f\xdd\x33\x51\xb7\x65\x30\xe6\x3e"
+ "\x8b\xf9\xff\x42\x19\xe7\x09\xef\x3f\xe5\xef\xc2\x20\x2d\xd3\xc8"
+ "\x13\xdf\x9e\xe1\x35\x78\xe1\x61\x3e\x10\x17\xff\xde\xce\x67\x5b"
+ "\xfa\xf1\x83\x19\xe0\x75\xde\xc1\x7b\x91\x49\x83\xa0\x7f\x5c\x17"
+ "\x44\x4f\xd8\x4d\xe9\x10\x27\x53\xd8\x44\xdf\x0e\x5d\x14\x79\xcd"
+ "\x1d\xe7\x65\x4c\x53\xd6\x35\xbf\x99\xf7\xb1\xc9\x1b\x3c\xe7\xf1"
+ "\xae\xd1\xa8\x05\x76\xa5\xb7\xf6\x9c\x47\xc5\x3e\x0d\x53\x33\xfd"
+ "\x95\x9a\x9d\xff\xb7\xdc\x5b\xfe\x57\xa4\x0b\x19\x0b\xbb\xe7\xa2"
+ "\x98\xe5\x35\xff\x1b\xf1\x77\x8a\x78\x8c\x03\xdd\xed\x67\xe9\xd9"
+ "\x7f\x7c\x04\x38\xef\xfc\x07\x60\xc9\x98\x69\xe3\xe8\x20\xee\xd1"
+ "\xa6\xde\xf1\x2f\x6e\xac\x99\x04\xcf\x7a\xab\xf3\x31\x93\x86\xb1"
+ "\x94\x63\xdb\x61\x0c\x1d\xc3\xed\xc2\x73\x16\x3f\xe3\x3a\x92\xaf"
+ "\xd6\x55\x9e\x2d\xd6\xd0\x63\x3c\xb6\xe6\xf1\xb8\x89\xf4\x59\xf5"
+ "\x17\xe5\x58\x3b\x43\x7f\x9e\xa2\x3f\xe7\xea\xcf\x13\xf5\xe7\x1c"
+ "\xfd\x99\xd7\xe5\xf5\x31\x79\x51\x75\xaf\xbd\x60\x1a\x70\x14\xcf"
+ "\x5b\x8d\xbe\x00\x3e\x03\xad\xce\x95\x72\x6c\xd7\xf1\x18\xa3\xe3"
+ "\x95\xa5\x3f\x1b\xf8\xdc\x60\x0d\xad\xfc\x5f\xc2\x67\xb1\x3d\x1a"
+ "\x9f\xc5\x59\x11\xf8\x90\xd5\x99\xf3\x75\xf0\x49\xb3\xf2\x77\x22"
+ "\xfe\x07\xf8\x30\x2e\x9c\x86\xfa\x77\xc7\xe0\xe3\x31\xf0\x89\xcb"
+ "\x6f\x4b\x44\x3b\xdb\x35\x8b\xbf\x21\xe3\x3a\x0f\x60\x9b\xa5\xbe"
+ "\xdb\x88\x53\xb8\x38\x74\xb9\x38\x85\x90\x05\x8c\xdb\x25\x68\xff"
+ "\xe2\x26\xdd\x7e\x3b\xa0\xec\xfc\x92\x31\x86\xef\x18\xda\xda\x50"
+ "\xa5\xda\xba\x6b\x0d\xc7\xea\x5b\x46\xdf\x74\x39\x45\x3b\xe6\xdd"
+ "\xff\xc9\x73\xc3\x48\xb8\x45\x25\x8b\x17\x3f\x73\x97\xbd\x68\xce"
+ "\x82\xb9\xf6\x11\x85\xf6\xc5\x8e\xf9\xf3\x4a\xe6\x46\xfb\x53\xa4"
+ "\xe9\xdf\xef\x91\xe7\x44\x78\x2e\x25\xe7\xd2\xe0\x7f\xa9\x27\xa5"
+ "\x4f\x5e\xc9\x05\xe1\x2e\x29\x60\x9d\x5b\xf7\x92\xfa\xce\x13\xf0"
+ "\x69\x34\xc6\x10\x63\xfe\xcb\x63\x08\xd2\x8f\x63\x9c\x9c\x1d\x91"
+ "\xce\x79\xfd\x46\x1a\xc3\xd7\x75\xd3\x80\x13\x54\xf2\x4b\xae\x33"
+ "\x2e\x0d\x2f\x8a\xad\xb0\x9b\xf8\x1b\x16\x26\xe8\x14\xc1\x71\xb7"
+ "\xf8\xfc\x25\xca\x89\x93\xf4\x9c\x9c\x57\xcc\xc2\xb3\x9a\xb3\x09"
+ "\xe0\xf8\xdc\x43\x28\xb3\x0d\x69\x66\xb6\x21\x30\x0f\x6c\xe7\x72"
+ "\x48\x7f\x86\xe3\x60\x20\xdd\xa2\xc7\x13\xe3\xb4\x55\x1c\xa7\x02"
+ "\x69\x69\x11\x69\x2f\x23\xcd\x86\x34\xbb\x0e\x6f\x3b\xd3\x19\xcf"
+ "\x39\xfa\x3a\x19\xe7\x79\x5f\xaf\xb7\x3c\x12\x67\xfe\x86\xcb\x1d"
+ "\xb7\x65\xd9\x67\xcd\xfc\xfe\xb8\x1f\x3f\xb9\x70\xc1\xbc\x14\x92"
+ "\x64\xcf\xc4\x70\x9c\x75\x87\xf3\x96\xbb\xec\xc5\x73\xe7\x2e\xb2"
+ "\x2f\x9d\xbb\xa0\xc4\x3e\x67\xe9\x9c\x65\x29\x34\x6f\xe1\xa2\x27"
+ "\x39\xca\x02\x77\xcb\xe2\xfc\x27\xe7\xfd\x9c\x9d\x5e\x54\xee\x94"
+ "\x28\x3b\x61\x16\xeb\x36\x3d\x2e\xc9\x91\x2a\xb6\x21\x93\x3d\x79"
+ "\xb8\xe7\x78\x5d\x36\x5c\x1b\xf1\x3b\x80\xdf\x7e\xfc\x8e\xe1\x77"
+ "\xf4\x34\xad\x58\x83\xeb\x9e\x2e\xf7\x92\x42\xc3\x5e\xe9\xe3\xa1"
+ "\x25\x4e\x83\x87\x60\x5f\xec\x51\xe3\xdb\x92\x86\x96\x90\x94\x9f"
+ "\x5e\x9e\xaa\xba\xd8\xc7\x53\x1c\x6f\xb4\x85\x7d\xba\x96\xe0\x7d"
+ "\xb7\x5c\xab\xe4\x35\x93\x64\xa6\xdb\x49\x5a\xb6\xa5\xfe\x15\xd1"
+ "\xc4\xb1\x72\x70\x6d\x04\xbf\x34\xa9\xf8\x34\x4b\x33\x90\x6f\x38"
+ "\xea\x38\xa0\xea\xd0\x9f\x87\x88\x23\xfc\x0d\x97\x13\xfa\x33\xc3"
+ "\x02\x8c\x3b\xf9\x9e\xaf\xfa\xde\xa9\x55\xff\xc6\x9b\xa9\xef\xdd"
+ "\xd2\x66\xbd\x0e\x0f\x68\x51\x5e\xe7\x96\x73\x29\x39\x77\xe6\x35"
+ "\x62\x6b\xc2\xdd\x02\xf8\x9c\xd3\x12\x1f\x6d\x95\xf1\x2f\xcb\xbb"
+ "\xa1\x23\xbe\xf7\x3d\xaf\x53\xe6\x4f\xe0\x35\xe4\x69\xc5\x42\xe3"
+ "\x38\xe4\x5a\xe2\xd3\xad\x5c\x4e\x58\x3c\x79\xda\x86\x81\x39\xca"
+ "\x66\xe0\xb8\x83\x4b\x1b\x74\x98\x41\xa6\xed\x69\x5a\xf2\xb0\x9a"
+ "\x87\xaf\x58\xa3\x6c\x89\xa5\x7b\x0c\x5f\x4b\xc8\x68\x26\x9e\x1b"
+ "\x0d\x1d\xe0\xa3\xa5\xd5\xba\x5f\x9c\x47\x6f\x7f\x48\x7f\xde\xaf"
+ "\xe3\x98\xc0\xb1\x50\x80\xff\x51\xee\x3b\xd8\x2b\xfb\x71\x7f\x0c"
+ "\xf4\x69\x52\xf4\x71\xca\x38\x07\xb0\x9b\xf8\xfd\x31\xfe\xde\x0d"
+ "\xde\x1d\x53\x71\x46\x96\x8e\xe1\x36\xf7\xf9\xce\xd6\xe6\x00\xd7"
+ "\x3b\x79\x8f\x19\xb2\xb4\xdf\x7b\x91\xe5\x73\x69\x16\xe0\xed\x36"
+ "\xf4\x0e\xeb\x99\xfc\x30\xe4\x54\xce\xa7\x9c\x45\x86\xbe\xe9\xe3"
+ "\x03\x67\x79\x3c\x5d\x12\xaf\xdf\x15\xfd\x9d\x7f\x17\xee\xe7\x1a"
+ "\x81\xd3\x6e\xd9\x07\x1c\x8f\xf5\x62\xef\xbc\xad\x47\xe9\x48\xe7"
+ "\xb1\xde\x39\xa6\x8e\x07\xc7\x76\xf7\x31\x6e\xdd\x72\xdf\x5f\xd7"
+ "\x1b\xce\x90\xa1\x37\x0c\x38\xd6\x04\xa1\x59\x9d\xf8\x57\xb1\xcf"
+ "\xc9\x7b\x24\x3c\x5e\x4a\x7b\x04\x70\x06\x5d\x50\x67\xe0\xb4\xca"
+ "\x7d\xe0\x5d\xe7\x1e\xfe\xe6\x9b\xb4\x69\xdd\xcf\xfd\xdf\x3e\x5d"
+ "\xb4\x6c\x46\x24\x4c\x61\xd9\xe7\x64\xb8\xac\x8f\xd8\x26\xc9\x0f"
+ "\x9b\x39\x0e\x8d\x53\x1f\x5f\xa0\x83\x97\x95\x1b\xb8\x82\x86\x47"
+ "\x0c\x7c\xf5\x6f\x8e\x1d\x41\x3d\xbe\xe9\xe1\x1e\xf6\x05\x6f\x54"
+ "\xfd\xb9\x42\xea\x1b\xbc\xdb\x85\xb2\x07\x7c\xf4\x5c\x9a\x2e\x43"
+ "\x4d\x28\xbf\xeb\x70\xd9\x44\xe4\x59\xd6\xaa\xfb\x33\x1f\x45\xff"
+ "\x1e\xeb\xe3\xfd\x25\xcd\x11\xeb\x3c\xc7\x54\x1f\xfe\xb8\xfc\x04"
+ "\x2d\xb7\x45\xa4\xeb\x7d\x7b\x78\x06\xd2\x9b\xd5\x9a\xc9\x3e\x3d"
+ "\xbe\xdf\x72\xe5\xbb\xaa\xe3\xc8\xba\x80\xcf\xeb\xb1\x8c\x4b\xda"
+ "\xcb\x3e\x5e\x3e\xc3\x18\x2f\x00\x6b\x8f\xa4\xf9\x10\x71\x80\xe9"
+ "\xa4\xe2\x7d\x3c\x77\x51\xd1\x69\xb9\x33\x8a\xf6\x3c\x6e\xa2\x1e"
+ "\xa6\xd3\xa0\x55\x42\x1b\x14\x48\x10\xf9\xcb\xcc\xc4\xf2\xc2\x32"
+ "\xce\x7b\x83\xe0\x0f\x69\x57\x29\xba\x2d\xdf\x6f\xd0\xcd\xe8\x3b"
+ "\xa6\x93\x8f\x96\x67\x32\x6d\xa3\xdb\x38\xe0\xe8\x09\xa3\xed\xa0"
+ "\x29\xc7\x34\xc5\x73\x93\x2e\x17\x4d\x9e\xa1\xec\x3b\xb2\xe4\xcf"
+ "\x87\xcd\xdf\xa7\xc3\xce\x31\xa4\x68\xbb\xc2\xe6\xa3\x12\x67\xc4"
+ "\xbc\xe4\x08\xd3\x97\x65\x05\x78\x96\xe8\xb1\xb7\x8e\x28\x3f\xa6"
+ "\x25\x4d\xa2\x72\x5f\x89\x94\xe5\x25\x32\x46\x0a\xc7\xed\x3d\xca"
+ "\x34\x62\xbd\xc8\xb2\xc4\x32\xc0\xf2\xa4\x68\xb4\xa2\x24\x82\x46"
+ "\x8d\x4c\x1f\x9d\x4e\x7b\x62\x74\xf9\x5c\x7b\xd1\x38\xa5\x8b\xed"
+ "\x99\x23\x0a\x47\xcb\x40\x37\xf6\x7b\x27\xdc\x65\x9f\x31\x6e\x84"
+ "\xd3\x31\x72\x9a\xba\x4c\x98\x31\x85\xaf\x29\xd1\xf3\x3a\x3b\xea"
+ "\x39\x1e\x3d\x37\x5c\xe5\x50\xfa\x63\x45\xc0\x97\x70\xb5\xfc\x86"
+ "\x08\xc7\x9d\xad\x5a\x40\x14\x06\xde\x1b\x4e\xa3\x4f\x2d\xfb\xd2"
+ "\x39\xce\xf1\x74\x27\x71\x5c\xf4\x2f\xeb\xf1\xae\x0e\xe9\x83\x8a"
+ "\xf9\xfb\x08\x7f\x13\x5a\xf2\xbe\x74\x5e\xb3\x11\x95\x3b\x5a\xfd"
+ "\xc9\xa7\xda\xf1\xdb\xed\x4f\xfe\xa0\x7d\xd2\x2d\x2e\xd1\xe5\x2e"
+ "\x9d\x62\xb4\x8b\xd7\x76\x40\xa7\xf4\xe9\x4e\x11\x66\x1a\xe5\x3b"
+ "\x39\x16\x39\x60\x27\xf2\xda\x4e\x29\xda\x5f\xbc\x5b\xcd\x5f\x4b"
+ "\xc1\xff\x4b\x74\x7b\x86\x66\xe0\x19\xf6\xdf\xf7\xe5\x1a\x97\xe6"
+ "\xb6\xc9\x18\xe6\xda\xea\x5b\x1f\xc4\x7c\x60\xb7\x01\x13\xb0\xae"
+ "\xd2\xfd\x1e\x24\xbc\xaf\xeb\x57\xab\xad\x7d\x2f\xc3\x9a\xa0\xe2"
+ "\x42\x42\xc6\xcb\xeb\x4d\x5a\x5e\xaf\x9f\x0c\xde\x0d\x5a\x95\xc6"
+ "\x7e\x34\x79\xe0\xbd\x72\xce\x63\xbc\xab\x72\x6b\xbe\x2a\x93\x16"
+ "\x44\x3f\xa6\x29\xfb\xb9\x83\xf5\x27\xe6\xae\x2b\xc7\x1a\xe3\x9a"
+ "\x1c\x0f\x4d\x54\xae\xe6\x33\x2b\x1f\xe3\x72\xe7\xdd\x66\x82\xce"
+ "\x6e\xba\x31\x5d\xce\x51\x82\x9a\x3b\x81\x94\x2f\xf3\xca\xdb\x0d"
+ "\x1d\xcb\xfb\xa5\xd6\x55\xc2\xcf\x6b\xc4\xd6\x90\xf0\xcb\x58\xfb"
+ "\x3c\x76\xd0\x69\xf2\x96\x76\x95\x7b\xe5\x37\x38\xf9\xbb\x22\x01"
+ "\x7d\xdc\x08\xab\x71\x03\xf5\xfb\x13\x6f\x2d\xc0\xf8\x90\x70\x9a"
+ "\x60\xeb\x02\x7f\xa6\x0d\xef\xb5\x68\xa0\x95\x97\xc7\x49\xa6\x4f"
+ "\xca\xfe\x6d\xec\x03\xc3\x6d\xb5\x86\xd0\xe6\xc8\x76\x99\x34\xdf"
+ "\x06\x37\xda\x65\x42\xbb\x9c\x67\x58\x66\x82\xec\x9b\x04\x79\x1b"
+ "\x22\xe3\x59\xcb\xf9\x79\x99\x3d\xb2\x8d\xac\xff\x55\x1b\xca\xc6"
+ "\xc7\x6b\xa3\x30\x71\x1b\x99\x06\x65\xd7\xe9\xf2\x26\xf1\x64\xfd"
+ "\xd1\x41\x2b\x8f\x0d\x5a\xc5\x3e\x41\xfb\xd2\xa1\xdf\x26\x70\x1f"
+ "\x62\xfc\xac\x66\x3c\xe3\xf5\x17\xc3\xd3\x61\xf9\xac\xab\xca\x0b"
+ "\x80\xcb\xae\xf8\xf4\x2e\x6b\xbe\x3c\xbd\xcb\x7e\xc5\xe5\x19\x0f"
+ "\xde\xdf\xb1\x86\x4c\xd0\xc1\xa7\x76\x63\xbe\x56\x11\xaf\xde\x41"
+ "\xab\xb6\x32\x5e\x71\xdf\x09\x96\x17\x5d\x07\x81\x0f\x05\xe4\x44"
+ "\xb0\x4e\xea\x72\xbb\x72\x0d\x7d\x64\x4d\xb0\x27\x4a\xfd\x60\x12"
+ "\xd5\xf1\x60\x58\x57\x55\xf3\x3e\xd7\x04\xd4\x1f\xf7\xbd\xc6\xdf"
+ "\xee\xa8\xd8\x47\xda\xea\xef\xde\x68\x4d\xa0\xbb\xfd\x89\xdf\x4d"
+ "\xb1\x3a\x43\x19\x4c\x43\xc0\x74\x42\x8e\x1f\xe2\x79\xaa\x5a\x1b"
+ "\x71\xc1\xfe\xff\xa5\x8c\xcf\xe4\x4f\xde\xa7\xef\x1b\xb9\x30\xfe"
+ "\xd5\xd8\x8d\xb5\x79\x3c\xb7\xf9\xe8\xef\x0e\x25\x97\xdf\x7c\x5d"
+ "\xac\xfd\x60\x8f\xe6\xb6\x0a\xfb\x72\x2b\xec\xc8\xf2\x95\x9a\xe0"
+ "\xef\x39\x7c\xb0\xa7\x8f\x4f\x94\xbf\x94\xc1\x27\x5d\xee\xf2\x8c"
+ "\xf8\x3c\x50\x3e\xe9\xf2\x3c\x50\xfe\x0d\x7e\xcf\x74\x57\x73\x95"
+ "\xf2\x22\xc3\x4e\x11\xab\xbf\xf9\xba\xbd\x4c\xd6\x4f\xaa\x6e\xa6"
+ "\x49\x0e\xe3\x3f\x05\x74\x29\x47\xde\x1a\x43\x0f\x30\xbf\x58\xc3"
+ "\xfc\xad\x0b\x92\x3c\x8d\x77\x18\x57\x4a\x2c\x6a\x1d\xfc\x40\xb1"
+ "\xfc\x7e\xa5\x7b\x45\xb5\xdf\xe5\xd8\xcc\xdf\x69\x0d\x24\xef\x2b"
+ "\x45\x9e\x56\x1f\x35\xaa\xfd\x56\xcb\xbe\x12\xc0\x70\x6e\x52\xfe"
+ "\xd0\x16\x19\x2f\x0a\x32\xcd\x31\xa2\x58\xae\x91\x96\x0e\xbc\x39"
+ "\x5e\x14\xe6\x3b\xab\xd2\x7a\xc7\x25\x77\x0e\x74\x85\x90\xb6\x18"
+ "\xc6\xa5\x61\x9d\xa0\xdd\xcb\x26\xad\xe1\xe2\x68\x1b\x71\x9b\x2f"
+ "\xae\x1e\xda\xf0\x8b\xdb\xc8\xfc\x07\xdb\x13\x54\x7c\x07\xa5\xaf"
+ "\xfa\xbe\x99\xfe\x2b\x9b\x4c\x4c\x07\x1f\xad\xb2\x2b\xda\xad\x2a"
+ "\x30\xfa\xc7\x47\xae\x23\x52\x77\xae\x7e\xb4\x7d\x7a\x48\x7c\xa9"
+ "\xd6\xb9\x57\x41\xff\x3d\x53\xa3\xde\xaf\x68\x8f\x5d\x03\x62\x7b"
+ "\xde\x3e\x7f\xb1\xbd\x70\xe1\xd2\x05\xc3\x87\x47\xcd\x95\xcc\xea"
+ "\xbb\xb8\xab\x36\xa9\xf1\x74\xd5\x11\x03\x6f\xb6\x4b\xf0\x8c\xf6"
+ "\xaf\xb8\x24\x96\xfd\x94\x7c\xdd\xcd\x3d\x3f\x8b\xfa\xee\x6f\xa7"
+ "\x29\xb7\x47\x3c\x7e\x8f\xa6\xdc\xf1\xbd\xfc\x07\xe7\xce\x29\x5c"
+ "\x16\x91\x7a\x67\xe4\xba\x61\xd5\xeb\xa8\x3b\x71\xe8\x3d\xd0\x15"
+ "\x09\xd3\x56\xf0\xd8\xe2\xfe\xb0\x2c\x24\x4e\x41\x5f\x67\x43\xc6"
+ "\xf2\x9b\x4b\x42\xd4\x0c\x5d\x26\xbe\xc9\x3a\x7c\x80\x3a\xdb\x09"
+ "\x7b\x0a\xbc\x65\x45\xdb\xfd\xb0\xeb\x2e\xf0\xfa\x0c\xca\x7d\xde"
+ "\x52\xc3\x31\x9d\x3f\xd0\xfd\x1a\xdc\xb5\x48\xbf\x06\xd7\x4f\x70"
+ "\xbd\x0a\xd7\x3f\xda\x17\x60\xde\xc3\xbe\xf4\x4b\xd8\x97\xde\xfd"
+ "\xae\xf4\x07\x0a\x94\x13\xfb\x04\xe1\xfd\x2c\xb6\x41\x7c\xb4\xda"
+ "\xcc\xeb\xe0\x9c\x17\x69\x5b\xec\x4f\x51\x16\x5f\x85\xdc\x1b\x74"
+ "\xd7\x8a\xca\x0f\xfc\x62\x73\x1e\x7f\x6f\x2d\xe3\x24\xad\x4e\x48"
+ "\x4c\xf8\x9c\x12\x6d\x96\xd4\x2e\xf7\x6a\x94\x5d\x30\x8b\xe9\xd4"
+ "\xdf\xb7\x68\xe5\x37\x80\x63\xec\xc3\x3e\xdb\x70\x2d\x49\xfb\x56"
+ "\xb7\xe7\xea\xe4\xb8\xb0\x7a\x56\x84\x4d\xc7\x7b\xd3\x29\xca\x3e"
+ "\x11\x61\x65\x9f\xae\x2e\x31\xe4\x00\xf7\xe5\x06\x9f\x46\xc5\xd7"
+ "\x5b\x50\x32\x77\xd1\xdc\x42\xfb\x88\xc5\x29\x14\x11\x5d\xcf\x31"
+ "\x77\x81\x7d\xd1\xdc\x67\x9f\x9b\xbb\x58\x46\xc6\xe3\xb7\x51\x63"
+ "\x3e\xf4\xfd\xef\x33\x8c\x73\x5f\xf6\xa1\x4c\xdf\xd5\x5f\x70\x4c"
+ "\x36\xb1\xf6\xf7\xdb\xd8\x77\x47\xcd\x37\x44\x66\xf4\x7c\xe3\x79"
+ "\x15\x77\xa2\xe2\x03\x9f\x9a\xeb\x3c\x2f\xbf\x63\x7d\x82\xd6\x54"
+ "\xf7\xc5\x7f\x5f\x33\x1e\xb4\x34\xe9\x74\xbb\xd0\xe5\x5e\x93\x6d"
+ "\xd0\xcd\x47\xcf\x7b\x74\x5b\xaa\x43\xea\x0f\x8c\xb1\xd0\x7f\x51"
+ "\xe3\xab\xfa\x06\xed\x1a\x8e\xcb\x91\x28\xd7\x93\x93\x3f\x68\xe3"
+ "\xba\x18\x26\xea\xf3\xa0\x7f\x7c\xd0\x9b\xac\xdf\x2a\x0c\x78\xa8"
+ "\x33\x93\xeb\xd3\xe7\x41\xd7\x9f\xa6\xe7\xe5\x9a\xb3\x56\xf1\x41"
+ "\x1b\xeb\x14\x8e\x21\xa2\x55\x02\x8e\xdc\xa3\x7d\xde\x23\xd7\x61"
+ "\xf9\x1b\x04\x80\xc5\xeb\xc0\xd0\x73\x01\xfe\x5e\x31\xa7\xa9\xd8"
+ "\x70\xab\xd7\xf1\xda\x33\xea\x3a\x0e\xfc\x83\x7d\x67\x1b\x9e\xf7"
+ "\xb0\xdd\xc9\x70\x7d\xb4\xe6\x00\xc3\x53\xb1\xef\x9e\x1f\x06\xde"
+ "\xc9\xe8\xb3\x9f\x9e\x2f\x88\x98\x97\x31\x3e\x12\xcf\x00\x70\x91"
+ "\x71\x56\x95\xaf\xa9\x6c\x37\xeb\xcf\x4d\x7a\xdb\x8d\xf6\x00\x1e"
+ "\xf4\xdf\xea\x34\xc3\x6f\xc2\xa7\xb7\x9b\xf1\x63\xdc\x23\x71\xd6"
+ "\xf1\xad\x61\x7c\x51\x6e\x5b\x84\x6c\xf3\xba\x4c\x12\xd2\xf6\xf7"
+ "\xf9\xb0\xaf\xa1\x58\xbd\xb1\x70\x81\xbd\x68\xfe\x82\xa7\xf3\x97"
+ "\xce\x79\x7a\x6e\xfe\x73\xc5\x23\xed\xcf\x2d\x78\xa2\x68\xe1\x93"
+ "\x4f\x33\xd7\x2c\x2e\x79\xee\xc9\xa7\xed\xac\x59\xf2\x27\x4e\x99"
+ "\x92\x7f\xcf\x43\x33\x1f\x4e\xa1\x7b\xe6\x20\x0d\x33\xff\x29\x59"
+ "\x23\xd5\xab\x07\x27\x4d\xf8\x69\xfe\x84\xe9\x0f\x4d\x9b\x25\x0f"
+ "\xbd\xf4\xbe\x9f\xb8\x20\x7e\x86\x28\x3e\x4c\x03\x2f\x1d\x47\xff"
+ "\x26\x9d\xa0\xca\xb1\x2a\x5e\xfa\x0b\x45\xd1\xf1\xd2\x5f\x00\xd2"
+ "\x2f\x6c\xc5\xef\x00\xd1\x2f\xfc\xf8\x41\xbb\x57\x66\x29\xfe\x4a"
+ "\x7e\xbc\xcb\xfd\x42\x4d\x1f\x7f\x55\xca\xb3\x94\xec\xa7\xa4\xd6"
+ "\x67\x5f\x80\xfe\x5f\xbd\x3f\xf2\x5d\xdf\x7c\xf2\x85\xa3\xbd\xf3"
+ "\xc9\x5e\x9d\xf2\x42\xef\xdc\x12\x69\xed\x98\x57\x26\xf3\xbc\x52"
+ "\xad\x27\x55\x8e\x93\x3c\xd5\xaf\x7c\x5b\xc8\x98\x57\xb2\x6c\xcb"
+ "\x3d\x29\x39\xff\xf8\x45\x76\xa4\x8c\xcb\x35\x7d\x5d\xc6\xb9\x9c"
+ "\x5c\xbf\xb3\x88\x74\x5e\xd3\x86\x7d\x7c\x1c\xb6\x02\xc6\xaf\x2e"
+ "\x21\x92\x45\xba\xc2\xe9\x17\x4e\x5e\xe3\x66\xbb\x59\xe7\xa7\x41"
+ "\xa7\xe9\x17\x7b\x85\xfb\xf9\x26\x35\xa7\x7c\x3e\xcc\x7a\x5d\xac"
+ "\x1e\x7a\x0f\xfb\x16\xf1\xdc\x09\x75\xee\xea\xe3\xd9\xca\xb1\xcc"
+ "\x0b\x7d\x73\xd9\x5f\x44\xe9\xff\x4e\xf9\x5d\xc2\x5f\x1c\x37\xe2"
+ "\x3d\x94\x0c\x27\x93\x79\x78\x35\x6d\x32\x09\xe8\x9b\x5f\xac\xe3"
+ "\x3a\x98\x9e\x3e\x7a\xa1\x01\x79\xcd\x7d\xf4\xab\x48\xeb\xa5\x9f"
+ "\xbe\xce\x62\xac\xb1\x28\xbc\x2b\xc7\xf5\x47\xab\xf8\x74\xaa\x28"
+ "\xf8\x4a\x3a\xb9\x29\x89\x65\xd2\xa0\xd7\xa5\xb4\xaa\xd8\x76\x29"
+ "\xad\x2a\x2e\xf4\xd1\xea\x85\x1b\x2e\xa5\x55\x45\x6b\xc4\xbe\x92"
+ "\xbe\x8e\x52\x39\x8e\x69\xc6\x3c\x86\x76\xaf\x03\x9f\xd5\xf4\xd1"
+ "\xaf\xd2\x72\x29\xfd\x2a\x87\xc5\xa7\x5f\x05\x9f\xaf\x8a\x84\x53"
+ "\x17\x6f\xdc\x18\xb4\xca\xa4\x9f\x07\xab\xfc\x25\x7f\xeb\x9e\xf1"
+ "\xd8\x68\xd2\x1c\x1b\xdd\xf8\xe1\xca\xf3\x88\x3e\x5b\x5c\x04\x75"
+ "\xfa\x56\x37\x62\xce\xcb\xeb\x4a\x97\x19\x8b\x8e\x1b\x6b\x1e\xb8"
+ "\x6f\xe5\xb9\x33\x7f\x13\x8a\xd3\x99\x9e\xfc\x8d\x31\xf0\x7b\xab"
+ "\xb2\x4b\x2b\x7b\xbf\xff\xd1\x79\xd3\x83\x05\x89\xab\xc8\x7e\xb8"
+ "\xf6\x0e\x4e\x0f\x82\x87\x72\x39\x9d\x7d\xb7\xfa\x83\x99\x1f\xce"
+ "\xa1\xf8\x70\xd7\xf6\xf2\x7f\x7f\x67\xa2\x63\xf4\x91\x63\xce\x82"
+ "\xc2\x85\xf3\xe6\x7d\xb5\x2a\x8a\xdc\x57\xab\x76\x6b\x15\x5d\xfc"
+ "\xdd\xcd\xd5\x4f\x2d\x47\x9d\xb0\xff\x8b\xdb\xd5\xb8\xb9\x16\xfa"
+ "\x6f\x7e\xa3\xb2\x25\x1f\x6d\x57\xe7\xc0\x5f\x4c\x8f\xd0\xcf\xe0"
+ "\x91\x17\xed\xc2\xbd\x76\x76\x5f\x1f\xaf\xed\xb8\xb4\x8f\x5f\xa4"
+ "\xf8\x7d\xfc\x62\x86\xb6\x84\xcf\xe1\xbc\x88\xf9\xcf\x22\x69\x6b"
+ "\xf2\x33\xfb\x41\x60\xce\xdc\x8e\xf9\x72\xc7\xf4\x65\x9e\xbb\xf3"
+ "\x97\x25\xc8\xbd\x62\xfe\xf6\x4a\xe8\xa2\x68\x63\x5f\x04\xde\x1f"
+ "\xe3\x6f\xaf\xf0\x37\x97\xf8\xfb\x9f\x32\x0f\xee\xab\x4e\x92\x9c"
+ "\x3b\xe2\xbd\xbd\xfe\xa4\xfc\x3e\x36\x6c\x85\x17\xcb\x0d\xdb\xda"
+ "\x0a\x93\x91\xcf\xa7\x6f\x50\xfd\xd1\xca\x7d\xc1\xf5\xe5\x2f\xf3"
+ "\xa8\x3a\x2e\xf2\x77\xd5\xc8\xaa\x6c\x88\x17\xf7\x5f\x76\xed\x3e"
+ "\xf9\xd4\xd1\xfe\xbf\x49\x50\x3e\xa0\x77\xaf\x52\xff\x0e\x31\xcb"
+ "\x3e\xfb\x8f\x76\xb9\xd7\xa5\xc5\xfa\x9f\x2a\xdf\xa1\x75\x99\x86"
+ "\x4f\x56\x95\xf4\x81\x22\x2b\xeb\x4f\x9e\xe7\x9c\xa4\x75\x53\xea"
+ "\xe5\x78\xb9\x6e\x4a\xe4\x1e\xa7\x7d\xf9\xaa\xab\xce\xd2\x8b\x17"
+ "\x2e\xb3\x6f\x9a\xda\xe7\xfb\x5a\x3e\x00\xe5\xd7\xf5\xfa\x88\xb9"
+ "\xcb\x07\xd4\x47\xe0\x86\x77\x0d\x11\xbe\x8a\x7e\x1e\x8f\x79\xfe"
+ "\x58\xaf\xbe\xab\xea\x07\x0e\xcd\x48\xc3\x7c\x62\xbd\x8c\x47\xb8"
+ "\x34\x44\xc3\x8a\x7f\xcc\xdf\xec\x59\x77\x41\x9f\x87\x76\xd8\xcb"
+ "\x18\x9f\x75\x2f\x33\x5c\x1f\xf2\x09\xb9\x1f\xb0\x9e\x7a\x71\x8e"
+ "\xa8\xcf\x80\xad\x68\xb2\x3e\xc3\xc0\xcb\x47\xeb\x64\xfc\x14\xfe"
+ "\xce\x75\x64\x9b\x9c\xf3\xe6\xe7\x17\x3b\x96\xe5\xcf\x5f\x30\xbf"
+ "\x24\x85\x9c\x73\x9e\x9b\x3f\x1a\x49\xf6\x27\x1d\xf3\x8b\xf3\xe7"
+ "\xcb\x68\xc5\x32\x10\x72\xc9\xb2\x62\xde\xfb\xb8\x64\x0f\x3e\x4d"
+ "\xda\xf2\xa6\xf5\x63\xd5\x78\xbf\x7e\x93\xc1\xa7\xf2\xdb\xdf\x22"
+ "\x8f\xfa\x7c\xaf\xe4\x37\x83\x13\xd1\xce\x43\xcc\xc3\x2a\xbe\xcf"
+ "\x86\x56\x65\x5f\xac\x6f\xba\xd4\x27\x6b\xbd\xcf\xf0\xc9\x02\x7f"
+ "\xa7\xb1\xac\x47\xc0\x02\xff\x6f\xa0\x4b\xcb\x6c\x48\xef\xf5\xef"
+ "\xd4\xbf\x3b\xce\x7d\x25\xe3\xdd\xbf\xc4\xfa\x76\xfd\xfd\x5e\xe7"
+ "\x24\x8e\xd9\xab\xcb\xd5\x86\x89\x11\xf8\x4a\x5f\x5e\x86\xc5\xe7"
+ "\xa4\x46\x07\x23\x7d\xd9\x36\x7c\x82\xb1\xd7\x66\xd4\x63\x5f\x61"
+ "\x82\xbe\xdb\xf0\x5a\xc0\xe4\x49\x94\xfe\xc7\x28\x07\x58\xd5\x86"
+ "\x1f\x8d\xaf\xb7\x5d\x1b\xb6\xc5\xe2\x08\xdc\x87\x23\xfd\x40\x9f"
+ "\x9f\xe0\x86\x72\x86\x81\x34\x8c\xff\x55\x23\x23\xd3\x22\xfb\x69"
+ "\xfc\xa4\x29\x30\xa0\x17\xcf\x45\x27\x4d\x98\x53\x54\xc4\x3a\x68"
+ "\xce\xdc\xa2\xe7\x16\x2d\x5c\xac\x77\xdd\xf8\x79\x1c\x86\x5a\x66"
+ "\xb9\x4b\x7f\x63\x5f\x30\x77\x6e\xa1\x4a\xd2\x3b\x32\x7a\xcf\x4a"
+ "\xf9\x31\x54\x61\xfe\xbf\xce\xd1\x67\x2b\x56\x6d\x15\xa6\x0d\x6d"
+ "\xf8\x9d\x93\xfa\x47\xf6\x6b\x55\x51\xf4\x1c\xad\xaa\xd4\x90\x7d"
+ "\xd9\xcf\x2e\xf6\x39\xdb\xfb\x6c\xa7\x90\x7b\x3c\xe8\xd7\xea\x3f"
+ "\xa3\x9d\x49\x3e\xaa\xe6\x33\x5f\x09\x11\x70\xf6\xf4\xd2\x7b\xf5"
+ "\xa3\xad\xab\x95\xcf\x84\x99\xbf\x59\xcb\x31\x25\xf0\x1e\xf3\xff"
+ "\x17\x8f\x2b\x3d\x59\xe5\xeb\xdd\x7b\x31\x25\x62\xbe\x59\x05\xde"
+ "\x5f\x98\x75\xa9\x7c\x57\x5b\x2e\x95\x7b\xf6\xb5\xac\xb6\x1b\x34"
+ "\x8e\xf8\x06\x3d\xf8\xaf\xfa\x43\x63\xcd\xb8\x5e\xff\x26\x02\xdf"
+ "\x73\x59\x9e\x57\x88\x41\x03\xef\x66\xbf\x86\x13\x54\xbd\x4e\xf1"
+ "\x54\xb5\x23\xc2\x37\x30\xed\x34\x55\x57\xa8\xbe\xad\x2e\x37\xe4"
+ "\x0f\xed\x94\xb6\x1c\xc3\x50\xe3\x7a\x55\x92\xe2\xaf\xea\x6d\x06"
+ "\x6d\x79\x0e\x8f\xe7\x3d\x7d\x76\x50\xd5\x2c\xe9\x2f\xa2\x62\x6a"
+ "\xf4\x70\xfb\x01\x67\x8c\x01\x07\x79\xd1\x7e\x8b\xdf\xa0\x95\x91"
+ "\x27\x92\x27\x26\xcc\x29\xc6\x04\x7b\xfe\xbc\x79\x73\x17\x2d\x36"
+ "\xe2\x8c\x67\x2e\x2c\x2a\x54\x71\xc5\xef\x42\xf7\x2f\x85\x0c\x8f"
+ "\xe3\xd0\xe4\x48\x55\xb7\x31\xf6\xee\x48\x5e\x13\x91\xfe\xa3\x72"
+ "\xce\xf5\xf2\x87\x75\xfa\xfc\xeb\x04\xbd\x34\x43\xf9\x5f\xbd\x74"
+ "\x8d\xb2\x6d\xaf\x7e\xa3\xcb\xfd\xcb\x12\xc3\xb6\xe5\xb5\xd6\x4e"
+ "\xba\xb1\x86\xcf\xc8\xf1\x59\x82\x2d\xaf\x88\x36\x5e\x5b\x45\x9e"
+ "\x1a\xe3\x5b\x74\x6c\x37\xad\x7f\x45\xc5\xd0\xf6\x2c\x60\x5f\x91"
+ "\x97\x3f\xd3\x2a\xf7\xfa\x45\xca\x76\x3b\xec\xb3\x54\x96\x89\x81"
+ "\x1d\xec\xc3\xcb\xb1\xaf\x7e\xd9\xc6\x76\x1d\xeb\x32\xfe\x5e\x43"
+ "\x1b\xfd\x72\x0f\x74\x34\x74\xfa\xcb\x3e\x7f\xf2\x5e\xff\x9a\xe5"
+ "\x64\xe1\x3a\xa0\xaf\x7d\x8d\x5b\x99\xb6\x2f\xd1\x21\xe8\x32\x5d"
+ "\x67\xfb\xb8\x1e\x1f\xfd\xb2\x49\x5f\xf7\xd7\xbf\xad\xb4\x0f\x34"
+ "\x7f\x09\xfa\x7f\x60\x8d\xe2\xd5\x1d\xaf\xde\x5c\x4e\x4e\xfe\x36"
+ "\xa5\x8a\x5b\x75\xb0\x1a\xed\xa8\xe1\x6f\x40\xc2\x16\xc4\x7c\xe7"
+ "\x97\x25\x68\x43\x8d\xee\x03\x0e\x5e\x79\xa9\x59\xf9\xf6\xff\xb2"
+ "\x90\x69\x00\xb8\x69\x3a\xdc\x34\xc0\x45\xff\xdf\xa0\xc7\xcb\x7e"
+ "\x69\x9d\x51\x07\xc6\x3f\x3f\xec\xe6\x56\xb6\x9d\x81\x37\x6c\xe8"
+ "\xbd\x1d\x55\x72\x2f\xdd\x07\xbd\x6f\x15\xec\xbb\xd6\xf7\xbd\xbd"
+ "\x97\x1a\x8d\xb1\x90\xeb\xd6\x71\xe7\xb3\xcb\x16\x5e\xe7\xd3\xeb"
+ "\x4a\xe5\xb5\x00\x03\xa6\xa8\xdc\xdb\xae\x5d\x3c\xb3\x15\x30\x2d"
+ "\x18\xd7\xfd\xfa\x77\xd6\x3a\xaa\xce\xb3\x9f\xa3\x0f\xe3\xf6\xb7"
+ "\x45\x7e\x28\x8d\xf7\xa0\x06\x1a\xdf\xb1\xab\x3f\xcf\xf4\xda\x98"
+ "\xd5\xb7\xb7\x84\xf2\xa0\x3f\xe4\xa1\xbc\x8d\x36\x4e\xe6\x7a\x59"
+ "\x16\xb8\x2f\xbb\xd1\x37\xe8\x9f\x4c\x71\xf1\xcc\x6e\xfb\x02\x1a"
+ "\x78\x92\x36\x3e\xc3\x7d\xc4\xfb\xc1\xec\x7f\x88\x34\x2b\xc7\xdd"
+ "\x3f\x41\x1b\x1f\xe6\xfe\x61\x5c\x44\xc5\xf6\x60\xa8\x2b\xef\x3e"
+ "\x3e\x73\xcd\x3a\x73\x65\x29\x6c\xee\x79\xac\x4b\x36\x7d\xc6\x73"
+ "\x78\xfe\x5e\x12\xdf\xbb\x0a\x85\x26\xfb\x77\x39\xf7\xef\xa6\xcf"
+ "\x56\xb6\x0b\xed\x4b\x37\x89\x23\x01\xa2\x2f\x4d\x14\x0a\x9a\x12"
+ "\x18\x6f\x93\xeb\x0c\x9f\x0b\xdf\x4a\x5e\x67\x05\xfb\xb2\x59\x36"
+ "\x2c\xa7\x34\x3e\x53\xcf\xdf\x02\x6a\x09\xd4\x52\x4b\x71\x2d\xfd"
+ "\x29\xb4\x89\x3c\x4b\x38\x3e\xca\xcb\x6b\xfe\xd5\xb9\x89\xf7\xd8"
+ "\x92\x71\x3f\xc9\xfe\x53\x59\xd7\xb0\x7f\x3d\xf6\x17\xfa\x57\xcf"
+ "\x5f\xc8\xfe\x88\x7c\x1e\xd9\x94\xf7\x27\x6a\xca\xf9\x13\xb9\xda"
+ "\x84\xc6\xf3\xba\xb2\x67\xb8\x8e\x0a\xc0\xda\xca\xe7\xcf\xd3\xb4"
+ "\x4e\x5b\x0a\xda\x6f\xe6\xfd\x83\x96\x80\x9f\x3c\x0b\x7e\xcf\x38"
+ "\xbe\x5d\x77\x9e\x2c\x9e\x05\x1f\xcb\x7b\x35\xdf\x3a\xb3\xd5\x5b"
+ "\xd8\xca\x36\x65\x88\xcf\xde\xf3\x9e\x24\xe6\x18\x5a\x15\xe3\x18"
+ "\x56\x78\x83\x5e\x66\xa3\x3c\x6c\x4e\xa3\xbc\x8c\x15\xb7\x85\xe9"
+ "\x01\x9c\x9a\x67\x29\x9a\x34\x61\xa4\xd0\x71\xfe\xcc\x95\x17\x49"
+ "\x9f\x8d\x4d\x4c\x1f\x8e\xd9\xaa\xa1\xbf\x80\x5b\x0e\x68\xa0\x19"
+ "\x75\x00\x67\x8b\xbe\x86\x6b\xd9\x70\x9e\x52\x3d\x0b\xf8\x5b\x70"
+ "\x2f\xdf\x6e\x9d\x61\xb6\x68\x17\xcf\xee\xae\xba\x40\x66\xee\x37"
+ "\xde\xb7\xa9\x92\xef\x19\xe6\xcb\xe9\xdc\x67\xe0\xc9\x02\xfc\x0a"
+ "\xf1\x73\x30\xdf\xe1\x5a\x84\xfe\xaa\x00\x0e\xbb\xd0\x57\x5b\xf9"
+ "\xaa\x78\x71\x47\x0d\xc7\x25\xd1\xe7\x50\x7d\xe9\x90\xa3\x90\x90"
+ "\xdf\x5b\x86\xcc\x6c\xda\xa5\x41\x8e\x78\x0d\xa7\xee\x25\x4a\xd5"
+ "\xdc\xd5\xc1\x2d\xd0\x75\xb5\x2f\xc9\x73\xc9\x69\xbc\xae\xf9\xba"
+ "\xfc\xb6\xc6\xcb\xbb\x0d\xdd\xb7\x76\x08\x9f\xdd\xdc\x74\xdc\xc4"
+ "\xeb\x3e\x15\xfb\x2c\x3a\x9f\x5b\x90\x07\xfa\xff\x7a\x7d\x0c\x7d"
+ "\x49\xce\x2f\x58\xf6\xfb\x9b\x4f\xc0\x96\x6d\x12\x9b\xf3\x88\xf7"
+ "\x7f\x52\x57\x09\x7f\x6a\x9b\x55\xb4\x04\x9a\xe4\x99\xdd\x96\x40"
+ "\x58\xee\xff\xe0\x7d\xc2\xb4\x80\xdf\x0a\xdb\xf7\x28\xd3\xce\x48"
+ "\xe7\xbd\x23\x5e\x57\x9b\x16\x10\xfe\xe9\xcb\xac\xfc\x2d\xcc\x61"
+ "\x72\xef\x40\x4f\x6f\xb1\x61\xde\xb0\xcc\x6f\x45\xdb\x43\xbd\xb0"
+ "\x3a\xf3\x12\x59\xde\x90\x37\xbd\x37\x6f\x67\x9e\x99\xbf\xed\xcc"
+ "\x75\x46\xa4\x25\x4d\x77\xa2\x2c\xf7\x95\x9e\xa6\x6c\xe6\x57\xf6"
+ "\xf4\xce\x29\xf9\xfc\x42\x27\xc6\xcd\xc5\x79\x09\x5a\x67\x9e\x29"
+ "\x0c\xd8\xe0\xfd\x34\xf9\x4d\xce\x90\x5f\xff\xc6\x55\x3b\xe4\xb7"
+ "\x95\xc4\xfa\xc4\x2c\xe4\x33\x33\x5c\x8e\x05\xc1\xdf\x06\x11\x03"
+ "\x93\xf6\xc7\xf7\xb9\xeb\x68\xf7\x94\x3d\x02\x7e\x7a\xf5\x00\xcb"
+ "\x73\xd8\xf2\x5e\xba\xfd\x29\xb6\x61\x5e\x95\xbe\x01\x61\xc8\x58"
+ "\x38\xf9\xbd\xf4\xd1\xed\x94\x50\x06\xbe\x55\x6b\x50\xaf\x3e\xe4"
+ "\x85\x0c\xba\x34\x01\x3b\xf4\xd5\x5c\xe6\x1b\x6b\x07\xfb\xca\xbd"
+ "\x67\x93\xfe\x69\x29\xed\x3e\x6f\xb0\x9d\x9a\xca\xff\x4a\x4d\x21"
+ "\x6f\xf9\x81\xf3\x7e\xb3\xf2\x53\x33\x33\xdc\xf9\xfc\xce\x05\x5e"
+ "\xcd\x0f\x6f\xa5\xfe\xf6\x06\x78\x7e\x8c\x31\xec\x6f\x6a\xae\xf8"
+ "\xea\x01\x63\x5e\x7c\xf9\x36\xd4\xa4\x73\xfc\x0c\x21\x6c\xa4\xad"
+ "\xfd\x83\x0f\xb8\xb8\x44\x57\x26\x8d\x5e\xce\x6b\x72\xaf\x76\x60"
+ "\x8e\x92\xa3\xc3\x3d\xa7\xe0\x22\xff\x65\xe0\x32\xcf\x34\xd5\xc8"
+ "\x7d\x29\xb4\xe9\x0f\x47\xc3\x80\x1d\x4e\xf9\x3f\x69\xd0\xf1\x2e"
+ "\xd7\x97\xbc\x66\xfb\xda\xc3\xa8\xe7\x68\x4b\xe8\x28\x71\x1c\x9e"
+ "\x3a\x0d\xe3\xe3\x39\x1b\xe9\x3e\x79\xae\xb3\x54\x33\x49\x13\x99"
+ "\x69\x98\xaf\xf3\x7e\x8c\x8b\x75\x1c\xaf\x05\x94\x85\xe9\x2a\x2f"
+ "\x46\x46\x8e\x1d\x01\x18\x53\x3f\xe1\xbd\x2f\xe8\x89\xb0\xb0\x99"
+ "\x3e\xbc\x88\x91\x1e\xba\x53\xc6\x92\x58\xfd\xcd\xd7\x07\xad\xa2"
+ "\xbb\x85\xc9\x2a\x7d\x3a\xb5\xca\x93\xed\xe8\xdb\x6c\xe5\x03\xb8"
+ "\xcf\x16\xe1\xff\x97\x88\xba\xa4\xff\x9f\xb0\xec\x3d\x5e\x2b\xd7"
+ "\x1d\xdf\x4b\xef\x72\xd7\x04\x7c\xf4\xaa\x5c\x7f\x5d\xc7\x67\x3c"
+ "\xa4\x8e\x7d\x6d\x8e\x3f\xf9\xe3\xdd\x0c\x83\xcf\xb2\x6a\x4b\xc2"
+ "\xbb\xab\xfe\x21\xed\x6b\x7e\x37\xbe\xa5\xa3\xcb\x23\x2a\x3e\xde"
+ "\xcd\xe7\x18\x75\xd8\xd6\xb3\xf4\xda\x35\xa2\xf2\xe3\xdd\x3e\x7a"
+ "\xad\x40\xf5\x8d\xbc\x1f\xc9\xef\x43\x3d\x99\xb0\xab\x6b\x1a\x6a"
+ "\xbb\x79\x2f\xa0\x66\x96\x70\x7f\xdb\xd3\x69\xf9\x78\xf7\x4c\x1b"
+ "\xdb\x54\xaf\x95\xf8\x12\xd4\x77\x7d\x8d\xb8\x18\xfd\xcd\x91\xc4"
+ "\x66\x5b\x8a\x17\x40\x30\x9f\x4d\x3f\x4d\x9b\xbf\xe8\x76\x93\xa9"
+ "\x07\xb6\x60\xb7\x89\xd2\x20\x5f\xa9\x1b\x86\x52\x16\xde\x0d\x3d"
+ "\x4d\xaf\xfd\x31\x64\xa2\x74\xfc\xd2\xfc\xdf\x74\x24\x03\x6e\x0e"
+ "\xaf\x91\x36\x9f\xe7\x35\xae\xd7\xe5\x39\xe5\xaa\xd7\x29\x43\x03"
+ "\x3c\xde\xef\xa9\x1a\x4a\x19\xbc\x4e\x89\xb4\xcc\xfc\xb0\xda\xf7"
+ "\x34\xd6\x22\x56\x0f\xa5\x91\xd1\xf5\xbe\xb6\x5b\xad\x63\x6e\x6e"
+ "\x93\x73\x2b\x3f\x7d\x0b\x73\xab\x13\x80\xbb\x4d\xb8\x13\x85\xf8"
+ "\xa6\xcd\xa4\x7c\x13\x5e\x5f\x6f\xad\x51\x7c\x27\xf7\xf9\xc0\x6f"
+ "\xbc\x8f\xaa\xef\x29\x25\xc8\x78\x20\x29\x1f\x6c\xe3\xef\x50\x47"
+ "\xac\x13\xa7\x49\x3c\xf4\x33\xfc\xe1\xd5\xb7\x72\x6c\x30\x79\x76"
+ "\x3f\x7f\x8e\xda\x8f\xe2\xf3\xfd\x3e\x7a\x5d\xc6\x63\x5c\xf7\x3a"
+ "\xa5\xbe\xf8\x3a\xa5\x35\xcf\x93\xed\x3a\xa0\x64\xd1\x4c\x8c\xaf"
+ "\x56\xc1\x72\x06\x9e\x00\xde\x5c\x1f\xf3\x46\x4b\xe8\x9c\xc7\x55"
+ "\x22\x34\xcf\x53\x6c\x8b\xbe\x1e\xf6\x2c\xda\x45\xd3\xdb\x42\xea"
+ "\x2c\xea\x6c\xf2\xd7\x03\x5e\xfd\x50\x4a\x3b\x49\x9b\x93\xbd\x45"
+ "\xc4\xfb\x15\x37\x7a\x16\xed\x01\xec\xcd\x37\xf0\x58\xb0\x1e\xf4"
+ "\x51\x63\xc2\xe6\xa3\xde\x60\x2b\x35\x43\xbe\xa7\x15\x0b\x09\x07"
+ "\x79\x1e\x92\xed\xdd\x6c\xb3\xe7\xab\x18\x0c\xb2\xad\xbd\xfb\x7c"
+ "\x7a\x3b\xbc\xe7\x25\x3c\x87\x17\x5c\x62\xb4\xc9\xa0\xb5\xe2\xaf"
+ "\xcd\xdb\x3d\x8b\xb6\x11\xf7\x0f\xe7\xc7\xf3\x26\x6f\x07\xf2\x9e"
+ "\x89\xee\x17\xce\x83\x77\x9f\x00\xee\x0f\xfa\xf6\xaa\x79\x0f\xb5"
+ "\x2f\x4f\xed\xeb\x7c\x1e\xed\x75\xcb\x66\xd0\x48\xad\xed\x6f\xbe"
+ "\x9d\x71\x45\xdf\x65\x79\x4b\xfe\x1a\xdf\x27\x15\xb2\x0f\xbe\x5f"
+ "\xd5\x22\xf7\xec\x6a\x87\x4f\x0b\x69\x42\xe9\xb3\xda\x63\x1a\xf4"
+ "\x80\x0f\x57\xd6\x05\x52\x9f\xdc\xc6\x7e\x40\xb5\x9f\x5a\x13\x54"
+ "\xff\x72\x5b\xd8\x5e\x89\xd7\xc7\x11\xfb\x89\xec\x97\xdb\xdb\xc7"
+ "\xfc\x0d\x47\x8d\xf7\x84\xd9\xdf\xbe\xc7\x46\x8a\xff\x44\x35\xe0"
+ "\x7e\xa2\xdb\x6e\x79\xfa\x58\x96\xd7\x99\xfc\x9e\x9d\xcf\x47\x1a"
+ "\xbe\xc1\x90\xdf\x61\xf9\xca\x9f\xdb\xc6\x3a\xaa\xde\x24\x74\xde"
+ "\xac\x3d\xa6\x97\x9d\xa5\x7c\x32\x6a\x37\xa1\xfc\xac\xb8\xed\x4d"
+ "\x84\xde\x71\x43\x4d\xa3\x3d\x6c\x47\x0a\xe8\x2a\x8c\x07\x57\x79"
+ "\x03\xdd\xfa\xf7\x33\xb7\x3c\x00\x9b\xfa\x2a\x3e\x1f\x65\xe0\x76"
+ "\x65\x7b\x7f\x5b\x86\xa9\xb9\xcd\x96\xd9\xc6\xda\x92\xb0\x80\xc6"
+ "\x6e\xab\xe0\xb3\x92\x7c\xde\x25\x90\xdc\x01\xfb\x56\xd8\x95\xdc"
+ "\x6c\x59\x03\x3b\x55\xea\xdb\xfc\x20\x95\x73\xbb\x78\x6f\x17\xf3"
+ "\xa6\xab\xb8\xcd\x80\x83\xf9\x4f\xf1\x58\x35\x9e\x2b\xd8\xfd\xae"
+ "\xed\x18\x6d\x43\x9b\x64\xdb\xd0\x46\xd9\x36\xfd\xfb\x52\x27\xa9"
+ "\x6e\xb8\x5c\x2f\xbf\xb2\xf6\xa8\xf8\x32\x15\x1d\x7e\xfe\x76\xee"
+ "\x49\xaa\x7f\x5f\x9e\x81\x41\x9f\xa8\x7d\x90\xba\x12\x91\xf2\x62"
+ "\xca\x95\xc1\xac\xcb\x51\x30\x85\xfd\x65\x8e\x45\xa9\x7f\xa3\x0e"
+ "\xb0\x7f\x25\x2a\x85\x5d\x9e\x31\x44\x7d\xfc\x8d\xcf\x3e\x3d\x54"
+ "\x9f\xc1\x7d\x75\xdb\x2e\xca\x51\x7c\x58\xff\x0d\x5e\x6b\x56\xf3"
+ "\xbc\xba\x23\xd0\xbd\xeb\xd4\x9c\xca\xf0\x23\x4f\x90\x7e\xe4\x91"
+ "\x3a\xf6\x0a\x71\x94\xfa\x4e\xa4\x9c\xac\xc6\xfd\x7e\x79\x56\x12"
+ "\xf8\x2e\x0d\x19\xfa\xaf\x6e\x3f\xfb\x24\xf5\xfa\x03\x2c\x03\xaf"
+ "\x94\xa9\x73\xe4\x5d\xee\xfa\x3c\xc3\x46\x91\xdf\x24\x73\x8b\x23"
+ "\x9c\x6f\xfa\xb2\x73\xd2\x5f\xa0\x4a\xc6\x3c\x38\xad\x9f\xb3\xab"
+ "\x7f\x46\x5f\xd7\xc8\x64\x1f\x7e\x94\xdd\xe4\xa3\x43\xf2\x4c\x20"
+ "\xd3\x80\xeb\x96\xb8\xcb\xef\x82\xd5\xef\xee\xdb\xf7\xa9\x93\xdf"
+ "\x4d\x57\x7e\xad\xf5\x47\x0c\x1e\x41\x7b\xaf\x52\xb1\x41\xeb\x6e"
+ "\x3f\x3c\x92\x24\x0f\x74\x0a\x5b\xca\x77\x6a\x99\x27\xeb\xfd\x91"
+ "\x74\x9a\x1e\xd2\x5c\x4a\x07\xd5\xb5\x0a\x29\xeb\x75\xad\x5f\x6d"
+ "\x4f\x6c\x9d\x64\xd8\x22\x8a\xce\x69\xd0\x2f\x6f\xa4\x49\x5a\x57"
+ "\xec\xc8\xe6\x18\x2d\x2b\xca\x38\xe6\xd4\xaf\x92\x38\xb6\x57\xa8"
+ "\x62\x47\x5e\x98\xcf\x64\x62\x9c\xd5\x2a\x76\x38\x4e\x16\x93\x29"
+ "\xbf\x98\xf7\xba\x3e\x2e\xe7\xf9\x95\x70\xc1\x16\x48\x81\x7d\x02"
+ "\x39\x5f\x39\x9f\xac\x8f\x39\x00\xdb\x95\x99\xce\xb1\xb7\x38\xee"
+ "\x16\xc7\xce\x0b\xbb\x32\x07\xe3\x7e\x08\xec\xb9\x34\x61\xd9\x91"
+ "\xcb\xfe\x32\x61\xb7\x80\x3e\x3e\xce\xf1\xbf\x4c\x5e\x7f\x90\x56"
+ "\x9e\x21\x0b\xc7\xf6\x0a\x55\x7e\x5c\xd3\x12\xf8\x4c\xce\x2d\x06"
+ "\x15\xc3\x9e\xd6\xe4\xb9\x1c\x9b\x96\xfc\x71\x39\xc6\xf8\x35\xaa"
+ "\xdd\xe7\x84\x6a\xb7\xc2\x9b\xf1\x57\x3a\xae\xc1\x51\x26\x71\xff"
+ "\x97\x37\x43\x80\xaf\x55\xbc\x5d\x18\xae\x78\xbb\x40\x9d\xe5\x6c"
+ "\xa2\xb2\x12\xd1\xee\x85\x6d\xcc\xfe\x9b\x7c\x5e\x97\xfd\x71\xb8"
+ "\x8d\xdc\x3e\xae\xfb\x5f\xcf\x9f\x91\xb1\xca\x42\x78\x76\x15\xe9"
+ "\x65\x3a\x50\xa6\xa3\x89\xba\x2b\xde\x96\x6d\x6f\x09\xa8\xb2\xf9"
+ "\xf2\x9e\xcb\x47\xd0\x41\x6f\x73\x2f\x1d\xd0\x76\x6e\x1f\xb7\x3f"
+ "\xc4\x34\x01\x0d\xf4\xb6\xda\x7a\xf4\x76\x72\x1b\xff\x84\x51\xe7"
+ "\x75\xb4\x13\x6d\x95\xed\xec\x41\x3b\x8f\x38\x88\x82\x6b\xcf\xd0"
+ "\x97\x29\x6f\x17\xf0\xfc\xd0\xf5\x67\xd8\xd1\xa5\xd5\x84\x79\xa0"
+ "\xf9\xed\xb2\x6a\xd3\x5a\xd8\x26\x65\x7e\xcc\x07\xfd\xa2\x9d\xed"
+ "\x7d\x6f\x31\x7e\xa1\x5a\xf9\xdd\x61\x69\x1f\xf3\x37\x62\x9f\x45"
+ "\x9b\xb4\x2f\xa8\xac\x5d\xb4\xc3\x36\x0d\x7a\x43\xc8\xe3\x40\xfb"
+ "\x31\x7f\x3c\xa9\xe3\xcf\x79\x57\xfe\x43\xb5\xcb\x5a\x44\xe9\x07"
+ "\x1f\xa9\x30\x79\x5b\x2b\xc8\x68\xcb\xe3\xc8\x87\xf6\xd8\x00\x6b"
+ "\xa0\xfc\x2e\x03\xda\xb9\x19\x78\x06\x23\xda\xd4\xdc\x11\x04\xcc"
+ "\x4f\x29\x65\x06\x25\xbc\x7e\x16\xed\x38\x4b\xb6\xea\x32\xd8\x5f"
+ "\x0f\xb2\xbd\xf8\xab\xcf\xaf\xce\xa3\x0c\x1f\x6d\x6d\x57\x7c\x27"
+ "\xe3\x06\x5d\x77\x9a\xde\x48\xee\x8d\x0d\xc4\xf1\xd6\x92\x3f\xae"
+ "\x65\x3e\x92\x31\x82\x78\xcc\xe8\x02\xcf\xb0\x2f\xcd\x52\xd4\xd1"
+ "\x95\x39\x44\xe2\xe3\x1e\x43\x78\x4e\xc5\x33\x7f\x33\x2a\x9d\xd7"
+ "\x04\x50\xae\x46\x80\x66\x0c\x1f\xf6\xdc\x1a\xbe\x32\x0d\xe3\x9e"
+ "\x35\xf9\x0d\x65\x8b\x14\xd8\x98\x98\xfb\xee\x2e\xf3\x9b\x9e\xff"
+ "\x0d\x8d\xbc\x32\x9d\xf2\x46\x76\x7f\xfa\x9b\xf7\x2d\x18\x1e\xda"
+ "\x36\xf8\x34\x6d\xbb\x21\x5a\xc6\xec\x52\x97\x29\x3d\xf8\x46\x1b"
+ "\xef\x15\x5c\x61\xbd\x52\xff\xb1\xcf\xd3\x15\x96\x6b\x37\xf0\xc0"
+ "\xfd\xb6\xfe\x70\xbf\x72\x3a\x6c\xcb\xe9\x0f\xd6\xfa\x57\x64\xbc"
+ "\x38\xd7\x86\x57\xd8\x1f\xb1\xa3\xfd\xb0\x8d\x63\x78\x63\xec\xdc"
+ "\x16\xa0\xc5\x5b\xc8\xe2\x3a\xc3\x6b\x32\x53\xe9\x70\x6d\x16\xd5"
+ "\x61\x4e\x2e\x3a\x33\x07\x6f\x3c\xcf\xbe\x0f\x4a\x87\xb0\x4d\xca"
+ "\x67\x29\xc5\xe2\xcc\xb4\xaa\x57\x0c\x1b\x7e\x7b\x72\xe9\x05\x32"
+ "\xa9\x6f\xa4\x6c\xb7\x4c\xb4\x8b\xd0\x26\x93\xe6\xa8\xe5\x98\x57"
+ "\x29\xa7\xb2\x38\xe6\x95\x11\x47\x4a\xda\x3e\x4e\xc8\x5c\xa7\x2d"
+ "\x65\xfd\x22\x1a\xc9\xb1\xef\xac\x7e\x65\xcb\xa9\xf1\x9a\x63\x54"
+ "\x51\x9a\xbe\xdf\x9f\xa6\x62\x4b\xbd\x51\x5e\x7f\x1e\x75\xa9\xf7"
+ "\xf3\xc3\x98\xc3\x48\xb8\x8b\x28\xa3\xf6\x3c\x65\xb2\x1d\x94\xff"
+ "\x85\xb2\xd9\x78\x5e\x38\xb5\xc3\x2a\xc2\xff\x95\x49\x5b\x4e\xf7"
+ "\xc5\xc6\xf3\x2f\xe6\x78\x7a\xc2\xd6\xdf\x5e\x49\xd5\x10\xe9\xf3"
+ "\x23\xe3\xb1\xa8\x6f\xe8\x11\x6d\x7a\x89\xcc\xfc\xcd\x58\x5e\xcb"
+ "\xe3\xb5\x61\x3e\xf7\xa3\xc6\x90\xed\xad\x46\xcc\xb0\x7e\xf7\x11"
+ "\x2b\xd4\x7c\x47\xbb\x0a\xf3\x2f\x7f\x97\xc7\xb3\x84\xc7\x8c\x1d"
+ "\x76\x3e\x6b\xd4\x37\xc7\xd9\x91\xc0\xef\x38\x8d\x7d\xe1\x73\x24"
+ "\x2d\x77\xe4\xf2\xbc\x47\x9f\x33\x1e\xb4\xf7\xa6\x29\x1b\x86\xc7"
+ "\x32\xc6\xa1\x5e\xad\x23\x0f\xea\x72\xef\x28\x34\xc6\x33\x1e\xd7"
+ "\xd5\xf7\x6a\x77\x38\x7d\x09\x1f\x95\x5e\x06\xbf\x34\xfd\x7b\xcf"
+ "\x1c\x1b\x21\x07\xf9\x1b\x8c\xf1\x4d\x7e\x8f\x64\xf5\xd0\x7b\x16"
+ "\x2f\xa3\x61\x33\xbf\x61\x91\xb1\x37\xf8\xbb\xa3\x6a\xdc\xdd\x71"
+ "\xb4\x6f\x3f\x2d\x47\xd2\x5b\x7e\x6b\x90\xe7\x18\x26\x8c\xc1\x2a"
+ "\xfe\x5d\x87\x1a\x7f\x8d\x73\xee\x3b\xce\xf4\xd5\xb3\x33\xad\x77"
+ "\x1c\x45\x1d\xec\xd7\xc1\xf0\x95\x6d\xb2\xa3\x91\xeb\xe0\xb9\x95"
+ "\x1a\x5f\x77\x34\x5e\xc6\x16\xcb\x64\xfa\x6a\xfa\x7c\xd2\xdb\x71"
+ "\x4a\xd1\xd7\x49\x89\xa3\x37\x91\xed\x60\x99\xcf\x3c\x48\xc5\x71"
+ "\xb2\x9e\xa0\x9d\x73\xf8\x3d\xf3\xba\xe7\x36\x5e\x8b\xdb\xf9\xa1"
+ "\x97\xc7\xed\x9e\xbc\xd4\x69\x3c\xd7\x97\xb6\xf8\xce\x5d\xa3\x50"
+ "\x0e\x69\x83\x3f\x3a\x1b\x34\x57\x2d\xa7\x91\xfc\x4d\x4f\xa4\xcb"
+ "\x75\x02\xff\xf5\x4f\x77\x7d\x27\x9d\x6c\xdf\xd9\xc4\xe7\x01\x76"
+ "\x1e\xc3\xfc\x52\xfa\x47\xc8\xfa\x37\x24\xce\xe0\xd8\x7f\xef\x74"
+ "\xfb\x92\x54\x5f\x35\x3c\x8b\xe7\xcc\x88\xe7\x81\xc6\x5a\xbe\x8f"
+ "\x1a\x8a\xe5\xde\x25\xfb\x3c\x2f\xe0\xf1\xfa\xd4\xd1\x3e\x3f\xa1"
+ "\x86\x67\x15\x2e\x0d\xcf\x1e\x2e\x26\x5e\xab\x3e\x56\x27\xe3\x78"
+ "\x35\x4c\xf4\xd1\x8e\x35\xfa\x7a\xcc\x51\xc9\x57\x6c\xef\xbe\xc0"
+ "\x73\xb0\x53\x9e\xf5\xc8\xc7\xe3\x44\xbe\x93\x72\x94\x0d\x7f\xaa"
+ "\x5d\x03\xff\x44\xb4\xff\x33\x5e\xeb\x8b\xab\x13\x5f\x27\x92\x65"
+ "\x2a\x4f\xd9\xa5\xcf\xd9\xfa\xa4\xdd\xb8\x5a\x44\x65\xfb\x51\x5c"
+ "\x53\x91\xee\xc3\x95\xc7\xf0\x56\x5c\xd3\xc5\xfa\xc4\x6a\xe6\x4b"
+ "\xcc\x61\x6d\x98\x27\xf0\x3e\xa8\xad\xbf\xb3\x8a\x4c\x1b\xef\x9a"
+ "\x9f\x92\xf2\xa1\x7d\x73\x56\xb3\x1f\xf6\xd9\x16\xa2\xc5\x21\xd1"
+ "\x6d\xff\x16\x9f\x09\x7a\x73\x96\x6b\x0b\xfb\xae\xbc\x99\x19\xed"
+ "\xbb\xf2\x66\x2e\x7e\x15\xf8\x1d\x27\xfa\x75\x2a\xae\xb3\xfa\x7e"
+ "\xbf\xce\xed\x72\xbf\x39\x0b\x74\x94\x36\xd6\x95\xe9\x44\x2e\x8f"
+ "\x7e\xe0\x79\x51\xf2\x1f\x3c\xb2\xbd\x95\x82\xf0\x6c\x11\x03\x13"
+ "\x73\xf4\xf6\xfa\xf1\x9c\x66\x77\x61\x5c\x4b\x06\x4d\x86\xa2\xcd"
+ "\x03\x93\x76\x73\x7b\x19\xdf\xce\xe4\xf6\xa3\x91\xe7\x34\x19\x26"
+ "\xb7\xdf\x9f\x8c\x72\xa0\xa5\xb8\xe9\xc1\x02\x83\x9e\x3a\x9d\x78"
+ "\xdf\xc8\xd4\x09\x18\xca\x0e\x42\x7e\xc0\x30\xf2\xf7\xd2\x7e\x28"
+ "\x7f\x5f\x03\x7d\x8a\x7c\x98\x13\x5b\x8c\x33\xa0\x5d\xee\x5f\xe7"
+ "\x1c\x2a\x52\xfb\x07\x5c\x36\x10\x51\x96\x63\x5e\xc4\x2b\x8f\x3a"
+ "\x65\x79\xc6\xf5\x24\xbd\xf9\x90\xaa\xf7\xd7\x63\xfa\x93\xa5\xb2"
+ "\xe1\xb0\xef\x6a\x7d\x1c\x17\x83\xed\xa1\xb1\xde\x61\x01\xf2\xd6"
+ "\x6a\x18\xf3\xdb\xa1\x8f\x84\xe7\x24\xfd\xfa\x42\x4b\xb0\xfd\x0a"
+ "\xc7\xc3\x5f\x4b\x9f\x2c\xd1\x5d\x4e\xde\xd2\x3b\xe4\xb7\xac\xcf"
+ "\xd2\xae\x11\x5e\xbf\x8c\x09\xcf\xf7\x32\xb6\x28\xfb\x69\xf0\xd8"
+ "\x80\x39\x76\x6f\x4c\x45\x0d\x79\xeb\x38\x1d\x69\xde\x80\x5f\xc6"
+ "\x5e\xec\xf3\x23\x3f\xd9\xaa\x64\xea\xad\xcf\x64\xfc\x05\xc6\x37"
+ "\x74\x9f\x87\x71\xd6\x2a\x4e\xb6\x72\x1b\x5c\x98\xff\x79\x43\x5d"
+ "\x1e\x96\x09\xfb\x12\x5e\x2b\x7c\xeb\x7d\xf0\x9d\xd0\x2a\x4f\xb6"
+ "\x5e\x59\x1b\xde\x92\xe7\x81\x5c\x21\x71\xd6\x9f\x7c\xb2\x95\x6d"
+ "\x92\xaa\xb2\x24\xcb\x84\x5a\xe1\xe9\x4c\x69\x87\x8e\x7d\xeb\xf8"
+ "\x21\xa7\xea\x9b\x2b\x84\x7b\xdc\x68\x7b\x9d\xde\x76\xa4\xc9\xbd"
+ "\xb9\xd1\x35\x2a\xd6\xa4\x8f\x76\xa5\xf7\xbb\x66\x85\x7e\x66\x7b"
+ "\x80\x7d\x5c\x15\x2d\x76\x15\xf6\x8e\x0d\x57\x84\xc7\xae\xc2\xaf"
+ "\x51\x47\x8f\x5e\xc7\x91\xff\x66\x1d\x47\x2e\x57\x07\x74\xc3\x0d"
+ "\xa7\xe9\xed\x59\x57\x3e\x77\x7c\xdb\x2e\x79\xa5\xe2\x94\x5f\xe9"
+ "\xcc\xdf\x7c\x12\xc6\xfc\x2d\x64\x11\x24\xbf\x3b\x65\xa2\x72\x8e"
+ "\xbb\x19\xaa\xf8\x83\xa7\xd9\xd9\x4d\x9e\x25\x7f\xa1\x36\x7a\x5b"
+ "\xc6\xba\x6b\x86\x9e\x11\xeb\x12\x73\x7a\xd6\xb6\xcf\xe8\x31\xed"
+ "\xda\xc6\xf4\xde\x82\x7e\xd8\x1c\xc1\x67\x2d\x81\xbf\x90\xb7\x80"
+ "\xd7\x57\x8f\xf2\xba\x76\x8e\x48\xc6\x5c\x05\xba\x01\x36\x7a\x58"
+ "\xd2\x03\xf6\x8b\x9a\x6f\x75\xb4\xcb\xf9\x96\x5f\x9e\x4f\x1c\x28"
+ "\xe3\x69\xba\x17\x06\x78\xed\x3b\xdc\x93\x67\xef\x72\xd3\x0c\x8e"
+ "\xb3\xc9\xeb\xce\xc2\xb2\x37\x30\x3d\x94\x28\xe4\x7c\x0a\xb6\x3f"
+ "\xc7\xd9\xf4\x06\x7c\x14\x86\x1d\x5d\x7b\x91\xd2\x6b\x61\x7b\x42"
+ "\x67\xa7\xb1\x5e\xaf\xd7\x63\x6d\xae\xbf\xd8\x17\x6b\xb3\x8e\xd7"
+ "\x7a\x5a\x71\x7f\x91\xcc\xe1\xca\x8e\xf6\xcd\x17\x29\x63\xcb\x12"
+ "\xca\xdc\xcc\x6b\x79\x7f\x57\xb6\x0f\xdb\x15\x32\xee\xe6\xc2\x4c"
+ "\x5e\xcf\xef\xb3\x7d\x96\x72\x5c\xe0\x5e\xbd\x65\x96\x6b\x20\x57"
+ "\x44\xef\xdf\xc8\x71\x30\x54\x71\xca\x1e\x4a\x4d\xda\x0d\xda\x61"
+ "\x2c\x7b\xbb\x11\xf4\xcb\x89\xd7\xb7\x86\x1f\xd6\xa6\x88\x58\xa9"
+ "\x87\x32\x94\x7e\xf7\xd1\x3b\x96\xfe\x78\x22\xbc\x39\x8f\x46\x77"
+ "\x50\x96\xf2\x69\x48\xc6\x98\xf8\x4e\x11\xef\x9f\x97\x3d\x43\xb6"
+ "\xf0\xe6\xd9\x09\xae\x5f\x51\x22\x7f\xe7\x9c\x7f\x65\xff\x10\xed"
+ "\xa3\x8b\x28\x8b\xf7\x1f\xd8\xef\xc1\xbe\x42\xe6\x1f\x97\x51\x4a"
+ "\x59\x91\xb0\x73\x95\x63\xd4\x5d\xf6\xc9\x0b\x9e\x5c\xf8\x4c\xf1"
+ "\x9c\x92\xf9\x4f\xcc\x2f\x9a\x5f\xb2\x4c\x86\x50\x18\x29\xff\xdd"
+ "\x3b\xa2\x70\x96\xdc\x74\x8e\xb0\x2f\x32\xfa\xd6\xe3\xde\xb9\x10"
+ "\xe2\xf5\x83\x2b\xa2\xd7\x3b\x52\xff\xd5\xc2\x96\xaa\x95\xbe\x3b"
+ "\xbb\x2d\xbe\x84\x0f\xe5\x98\xb5\x0e\x69\xeb\x74\x1f\x9b\x93\x7a"
+ "\x3e\x6d\x5d\x62\x35\xf8\x78\xec\x09\xfa\x6d\x88\xf7\x43\xd0\x57"
+ "\x3e\x6f\xe9\x69\x9e\x4b\x8e\xe5\x35\xfe\x66\x5e\xcb\x58\xc4\xf9"
+ "\x77\xaf\x64\x1f\x06\xf6\x87\x02\x1f\x6e\x3b\xa1\x3f\xeb\xdf\x4c"
+ "\xdf\x1c\x5a\x68\xdb\x16\x3a\x67\xdb\x21\x44\xde\xeb\x62\xa1\x63"
+ "\xb3\x38\xe7\x78\x3d\x22\xfe\xdb\x55\x28\xff\x4b\xc8\xc9\x0f\xf0"
+ "\xbb\x5e\x54\xec\xa8\x80\xfc\x0d\x3b\x4d\xbb\xb7\x33\x0e\x53\x1d"
+ "\xe2\x5c\x5f\x2c\x84\xdd\xef\xe3\xb9\x07\x3f\x4d\x54\xec\x6c\x88"
+ "\xd8\x5f\xe3\x77\x9f\x71\xfe\xe2\x79\xec\x13\xb6\xfb\x0c\xe3\x25"
+ "\xd6\xee\xdc\xe9\x77\x39\x12\x91\x3f\xac\xf0\x7c\x37\xd9\xbb\xa6"
+ "\x85\xec\x4f\xc8\x7b\x8b\xe7\x29\xb6\xe7\xde\xfd\x95\x30\xb9\x04"
+ "\xef\xc1\x79\xdb\x43\xa4\xce\xab\xbd\xe3\x64\x1f\x84\x3a\xd8\xdb"
+ "\xb5\x83\x29\xad\x7a\x30\xa5\x76\xb9\xdf\x1d\xd3\xeb\x7f\x61\x51"
+ "\xe3\x2d\x8f\x79\x1c\x3b\x1b\xfa\xa8\x8b\xc7\x4f\xc6\x83\x79\x18"
+ "\x30\x0b\x78\x7f\x4e\x9d\x8f\x7a\xb7\x08\xb6\xa5\xed\xca\xf5\xf1"
+ "\xbb\xf2\x7b\x2a\xa3\xd7\x51\x01\xaf\x69\xf3\xbe\x33\xc7\x96\x86"
+ "\xbc\xb6\xab\xf9\xc6\x6f\x3f\x95\xfb\xea\xd0\x29\xbc\x5f\x52\x5f"
+ "\x06\x3b\xc1\xb2\xb7\x83\xed\x9b\x90\x9b\xca\x79\x6f\x53\xbb\x78"
+ "\x66\x37\xef\x47\xcb\xb3\x85\x32\x26\xfb\x9f\xa8\xfe\x02\x99\xdb"
+ "\xe8\x5d\xfe\x56\x77\x5a\x1f\x5d\x7f\xfb\x43\x86\x21\xd6\x6e\xb7"
+ "\x5b\x4b\x4d\x15\x0c\x43\xbb\x78\x36\xdb\x28\x07\xda\x0d\xe0\x72"
+ "\xe0\x83\x1b\x64\x39\xce\x2b\x63\xa2\xa4\xcd\x86\xcd\x67\x97\x75"
+ "\xaa\xe7\x19\x02\x72\x18\xba\x18\xde\x8d\xfb\x59\x4c\x27\x5c\xf3"
+ "\xe4\xda\x2f\xe6\xeb\x32\x16\x8f\xe5\xe3\xdd\x5e\xdf\x29\x8f\xc4"
+ "\x87\x7d\x71\x4b\xa0\xb3\xa4\x3d\xf8\xdb\x67\xeb\xbe\x20\x73\xf1"
+ "\x53\xdc\x7f\xbf\x93\xeb\xfe\xe0\xa7\x06\x85\xdf\xef\x92\x3a\xd7"
+ "\xbe\x5d\xd0\x69\x39\xe5\x0b\x98\x2c\x74\xd8\x16\x64\x5d\x59\x7d"
+ "\xd8\xd6\x8d\xf1\xee\xb7\x4d\x3e\xd3\xb6\x6a\x65\x8b\xa8\x72\xbc"
+ "\x4f\x0c\x3b\xb5\x3d\xd1\x96\xe6\xc2\xfb\x0e\xc3\xef\x02\x36\x69"
+ "\xfb\x7a\xbc\x03\x6d\x1b\x99\x6e\x3e\xda\x9d\xd3\x52\xa4\xce\x66"
+ "\xe0\xf9\x2a\x3e\x6f\x2f\x69\xbd\xfa\xe9\x76\xeb\x2a\x0f\x9f\xff"
+ "\xcc\xb6\x86\x72\x4c\xbc\x0f\xcc\xe7\xfe\x39\x16\x02\x9f\xfd\xe7"
+ "\xb5\x3c\xfd\x7d\x56\xcc\xfb\x91\xc6\xfb\x2e\xf7\xef\x0a\x8d\x33"
+ "\xfb\x1c\x53\x89\x7d\x0c\xc2\xba\xaf\xa0\x8c\x35\x74\x5e\xed\xa3"
+ "\xb2\xaf\x20\xaf\x23\xf2\x99\x47\xde\xeb\x44\xb9\xda\x5e\xdf\x4d"
+ "\x79\xd6\xe7\x77\xbb\x0c\xdf\x28\xdc\xef\xef\xf5\xeb\x01\x2d\x3a"
+ "\x2b\x4e\xb5\x06\x52\x13\xab\x03\x15\xa7\x6c\x78\x77\x0c\xfa\xb0"
+ "\xdf\x58\x44\x72\xee\xc7\x31\x99\x9f\x23\x93\x96\xb2\x8f\xe7\x05"
+ "\xa6\xc3\x01\xd2\xcf\x39\xef\xb9\x53\x3f\x13\x9f\x78\x96\x7e\xf7"
+ "\x8f\xbe\x3d\xc7\xb0\xbe\x5e\xb6\x67\xb6\xb2\xd7\xf6\xcc\x96\xeb"
+ "\x65\x6b\x4f\x79\xde\x58\x1e\x34\xed\x5e\xee\x33\xa9\xb3\x0f\x7b"
+ "\x66\xf8\xe8\xc0\x1a\xc3\x6f\x05\xf9\xd2\xfa\x8b\xbd\x26\x2a\x3e"
+ "\xe8\x50\x30\xf7\xca\xf5\xc4\xbe\xf9\xcf\x5e\xe9\x1b\xc4\xfb\x83"
+ "\x1a\x8f\x95\x29\x7f\x38\x2a\x7d\x30\x8a\xcf\xf3\xba\xd9\x55\x6a"
+ "\x2e\xb6\x57\xff\x96\x94\xf4\xf5\xbc\xf6\x74\xf4\xf3\x60\x7e\x56"
+ "\x34\xdb\xe3\x33\xd6\xe0\x37\x98\x34\x8e\xcb\x2d\x5c\x5b\x45\xc0"
+ "\x5b\x1c\x20\xd8\x61\x7e\x2f\xc6\x5e\xd4\x21\x8a\x17\x71\xdc\xfc"
+ "\xbd\xd7\x31\xed\x95\x4c\xed\xad\x94\x38\xb9\xef\x16\x2e\xb6\x3f"
+ "\xfd\xec\x03\x72\x9e\x90\xef\x1a\xe4\x1b\xdf\x58\xda\x01\x1d\xb8"
+ "\xd7\xc7\x31\x0f\xdb\xf4\xba\xfd\xc9\x1f\x74\x7c\x27\x95\x0a\xba"
+ "\xdc\x7b\x61\xff\xbf\x90\x73\xe5\x72\xbe\x77\xd6\xe5\x6c\x11\x35"
+ "\x36\xe6\x50\x7f\xf3\x19\x9e\xaf\xde\x86\xfa\xa7\x0a\xc6\x7f\xdf"
+ "\xf8\x90\x29\x48\x3d\xa6\x01\xe2\xbb\xe5\x4e\xe8\x81\x01\x22\xbc"
+ "\x1c\xfd\xd5\x69\x83\xbd\xdb\x44\x2d\xa1\x46\xe9\x23\x02\x19\xb6"
+ "\x96\x05\xc4\x79\x6f\x68\x8f\xf4\xef\x55\xe7\xe0\xf7\xfd\xd0\x1b"
+ "\xfa\x90\x5a\x8a\xfd\xe4\x59\xf4\x17\x8c\x59\xfb\x46\x30\x5e\xb7"
+ "\x15\x97\xd3\xa8\xb3\xfc\x7e\x6f\x9b\x1a\x27\xf7\xe5\xe8\xd7\x34"
+ "\x8e\x8d\x19\x89\xd3\xbd\xcf\x2d\x78\xb2\x64\xfe\xc2\x05\xa3\xa6"
+ "\xcc\x5d\x32\xb7\xc8\xfe\xa0\x72\xb9\x8b\x1a\xbf\x2c\x7d\xf1\xbf"
+ "\xdf\x4b\xe5\x31\x85\x6d\x15\x8e\x03\x7e\xb9\x18\xe0\x46\xfc\x6f"
+ "\xd8\x0d\x19\xbc\xbe\xf7\xbf\x19\x03\xdc\xb0\x45\x38\xfe\x77\xdf"
+ "\x5a\xf7\x7b\x4d\xbd\x32\xa0\x1d\xec\xe2\x67\x3e\xfb\xa9\xb9\xf7"
+ "\x4d\x61\x39\xaa\x93\xfe\x69\xef\x4d\x8c\x8c\x95\xc4\xbe\x78\xbc"
+ "\x3e\x82\xf4\xd9\xc6\x39\x5b\xf0\x22\xc6\x8d\xf7\x8a\xfa\xce\xfd"
+ "\xbc\xe7\x44\x7f\xab\x77\x16\x99\xb7\xc2\xd8\x13\xd6\xbf\xbb\x26"
+ "\xf7\xb0\x35\x77\x4f\x8e\x5a\x87\x79\x6f\x7d\x9d\x36\xc0\xa2\xf6"
+ "\x00\xde\xdb\x63\x9c\x29\x53\xb2\x79\x50\x97\xcd\xf7\x9a\x2e\xb7"
+ "\x6f\xdf\x27\x1b\xfb\x2d\x7d\x72\xfd\x37\xbd\xec\x7e\xcb\x57\xed"
+ "\xf9\xeb\xf6\xf0\x75\xa7\xe9\xf7\x37\xf0\xda\x0c\xee\xbf\x8d\xfb"
+ "\x24\x39\xd6\x4a\xff\xfa\xf7\x3f\xd7\xef\x51\xc7\xfb\x7f\xd4\xef"
+ "\xbf\x89\xfb\x77\xf5\xfb\xa1\xb8\x7f\x4d\xbf\x87\xcc\xbe\xbf\x4a"
+ "\xbf\x4f\xc7\xfd\x7c\xfd\x1e\x3a\xff\xfd\x07\xf4\xfb\x21\xb8\xff"
+ "\xa1\x7e\xff\x0d\xdc\x0f\xd7\xef\x21\x83\xef\x27\xeb\xfb\xa7\x16"
+ "\xe0\x7e\xe1\xca\xed\xf3\xfd\x1e\xb5\x47\xf7\x3e\xc1\x16\xda\xa6"
+ "\xc6\x8c\xde\xb4\x74\xf0\x74\xa1\x41\x5f\xa4\xef\xe7\x7a\x90\x3e"
+ "\xd2\x47\xdb\xdb\x22\xd2\x1b\xf4\xfc\x13\x31\xde\xf8\x22\xd2\x6b"
+ "\xf5\xf4\xd9\xb0\x41\x2d\x11\xe9\xd5\x7a\x7a\x09\xf4\xa2\x23\x22"
+ "\x5d\x8f\xeb\xf0\xfe\x3a\x1f\x6d\xb5\x45\xa4\x3b\xf5\xf4\x6d\x86"
+ "\xbf\x82\x9e\x5e\xa4\xa7\x1f\x40\xfa\x91\x88\xf4\x02\x3d\x1d\xfa"
+ "\xff\xbd\xd6\x88\x74\xb5\xae\x20\xcf\xa2\x59\xc5\xe1\x52\x96\xad"
+ "\xf7\x83\x3e\xda\xb2\x3f\x22\x4f\xae\x2a\xfb\xfb\x34\x1f\xd5\x46"
+ "\xb6\x65\xac\x9e\x9e\xe9\xa3\xbf\x6f\x8d\x48\xcf\xea\x4f\x57\x25"
+ "\xd4\x50\x41\x7f\x6b\x98\xfc\x9d\x2a\xe9\x27\x29\x6d\xcb\x0f\xe6"
+ "\xf2\x39\x35\xeb\x16\x71\xc2\x5e\x26\xc4\x09\xfa\x60\x8a\xf2\x0f"
+ "\xdc\x7b\x9c\xfd\xb5\xd4\x79\xbf\x0f\xc6\xc8\x33\x60\xec\x73\xce"
+ "\x67\x00\x97\x73\xda\xef\x65\xec\x93\xd1\xce\x72\x15\x93\x53\xf9"
+ "\x9f\x76\xc8\xb9\xbc\xbe\xcf\x89\x3c\x9f\xf3\xda\x26\xc3\xe1\xf5"
+ "\x3e\x6f\x49\xb7\xf4\x89\xe4\xb9\x14\xa7\xf1\x9c\x56\x9e\x0b\x8b"
+ "\x98\x53\x29\xbd\xff\xc1\x5c\x8d\xcf\xed\xbb\xd5\xbc\x9f\x65\x91"
+ "\xf3\xb3\x6f\x4e\x64\x5e\x1f\x7d\x20\xe7\xa6\x89\xb6\x6b\xfe\xad"
+ "\xcb\xfd\xc1\xc4\xbe\xb3\x4a\xbf\xaf\xd5\xd3\x3f\x45\xfa\xec\x88"
+ "\xf4\x8a\xfe\x75\x3b\xf4\x9d\x65\xbb\xa3\xe7\xa2\x08\x84\x2e\x8a"
+ "\xe0\x86\xff\x00\xde\xf3\xe4\xb9\x9b\x6f\x85\x2b\xb6\x3b\xf5\x18"
+ "\x18\x9f\x87\x96\x08\x3f\x74\x36\x7f\x63\xe2\xea\x69\x01\x3f\x4d"
+ "\x2b\xee\x12\xeb\x9f\x60\x3f\xbb\x0b\x32\x1e\x94\xab\x83\xe3\x6f"
+ "\xb3\xef\x56\x80\xf7\x87\x52\x5b\x30\xc6\xd5\xcd\xe3\xf7\x9f\xd1"
+ "\x54\x87\x9f\x9a\x1d\x61\xaa\x03\xec\x2d\x4f\x18\x7e\x93\x1f\xf4"
+ "\xc6\xff\x61\x1c\xb8\x3e\x97\xfc\x56\xcc\x81\x51\x8c\x2b\x7f\x0b"
+ "\x4f\xac\x4f\xf2\x88\x8f\xd9\x96\x3d\xe9\xb3\xae\x22\x3b\xc6\xf6"
+ "\x6c\xdc\x1f\x95\x3f\x7e\x87\xf4\xfe\xda\xa4\x64\xf9\x80\xee\x8f"
+ "\xb9\xbd\x5d\xe9\x8b\x03\x25\xe2\x5f\xf8\xdc\xd1\x01\x3e\xff\xb4"
+ "\x1f\x76\x73\x5c\xff\xab\x95\x5b\xc8\xd4\xb3\x16\xb6\xc9\xd9\xfd"
+ "\x26\xa5\x9f\x3e\x2c\xd4\x4c\x96\x55\xbc\xae\x28\xbf\x13\xb1\x76"
+ "\x5f\xe6\xae\x05\x41\x53\xf3\xf2\x36\x5a\xf1\x0d\xb2\xcd\x0e\xb2"
+ "\x2f\xf9\x81\x2f\x06\x95\x70\x2c\xae\x53\x1e\xd8\xa1\xa6\xdf\xe1"
+ "\xfd\x47\x0b\xf6\x9b\x42\xd2\x5e\xf9\xb0\x50\xae\x45\x55\xec\x65"
+ "\xbf\x33\xab\xb7\x35\xcc\x67\x8f\xa4\x9d\x0c\xfd\x6f\x09\x2f\x75"
+ "\x0c\x0e\x2d\x76\x5c\xbd\x65\x11\xa5\x86\x17\x67\xa6\x6f\xbc\x48"
+ "\xd9\xc6\xf8\x83\x39\x6c\x96\xe8\xb2\xa5\x54\x61\x4c\xe1\x39\xee"
+ "\xa0\x84\x34\xb9\xe7\xc6\xf7\x9a\xe9\x8d\x8c\xba\x25\x97\xff\xe6"
+ "\x4d\x18\x73\x5b\x8e\x3d\xcd\xb8\xc4\x6b\xeb\xba\xd7\x31\x5f\xd6"
+ "\xcf\xc9\x96\x7d\x41\x43\x30\x6f\x31\x0d\xba\x20\x3c\xa7\x8b\xc8"
+ "\xc4\xdf\x09\x29\x9b\x2b\xd7\x91\x92\x9a\x1d\x21\xf2\x3a\xff\x4a"
+ "\x65\x8b\xb8\x8f\x3e\x7c\x9f\xed\x34\xf6\x9b\x44\xfe\xb4\xd3\xf4"
+ "\xe1\x1f\xad\x41\x8c\x19\x41\xd8\xd2\x4f\xf1\x9c\xf0\xc3\xcf\x02"
+ "\x32\xf6\xed\x47\x76\xf6\x1d\xf7\x2c\xba\x87\xd3\xbe\x74\x7d\x21"
+ "\xbf\xf9\xeb\x53\xb2\xf5\xe1\x31\x7e\x76\xf1\xb9\xdd\x94\x0f\x32"
+ "\x7e\xd3\x1d\x4c\x52\x6b\x15\x1f\x7e\xaa\x8f\x0f\xbb\xd5\xfc\xeb"
+ "\xc3\x63\xfd\xf1\xae\x56\xf1\x66\x85\xf8\xff\xd8\xfb\x1e\xb8\x28"
+ "\xab\xac\xff\x3b\xc3\xa0\x83\x0e\x30\x1a\xd5\x68\x68\x53\xd9\x36"
+ "\xb6\x66\xd4\xda\xfe\xd8\x5e\xdb\xa8\x74\x5f\xb7\xb5\x90\x56\x5d"
+ "\x7a\xb3\xc4\x02\x1b\xcb\x3f\x13\x21\xa2\x21\x20\xba\x38\x20\xff"
+ "\xdc\xb5\x7d\xb1\x90\xd8\xf7\xd5\xfd\xe1\xae\x6d\xec\xfb\x33\x97"
+ "\x36\x4c\x2c\xdd\xb0\x80\x41\xc3\xc2\xc2\x9c\x08\x71\x34\xb4\x11"
+ "\x47\x19\x61\xe6\xb9\xbf\x73\xee\x7d\x1e\x66\x06\x18\x18\x46\xfc"
+ "\xd3\xbe\xf2\xf9\x3c\x9f\xe1\xb9\xcf\x7d\xee\x73\xef\x39\xdf\x7b"
+ "\xce\xb9\xff\xce\x41\xdf\xe8\xc5\x0e\xf2\xa4\x8d\x9a\xd9\x7a\x26"
+ "\xfa\x2b\x48\x79\xb8\x8a\x5e\x28\x24\xfc\x8c\xdd\x07\x9b\x85\xec"
+ "\xed\x46\xee\xaf\xf2\x83\x8d\x84\xef\x45\x02\x1d\xb9\xbd\x88\xcf"
+ "\xe5\x6e\x2f\xe3\x73\x9b\xdb\x2b\xd6\x8e\xc5\xbd\xca\x1f\x14\x9d"
+ "\x0b\xda\x5e\x0d\xbf\x8b\xcf\x8d\xd8\x53\xe4\x5d\x1f\xfd\xa9\x42"
+ "\x3b\x9e\x84\xe1\x9c\x3a\xee\x3b\x7e\x8b\xef\x37\x86\x6f\xec\x29"
+ "\xa6\xd9\xec\xd9\xad\xcd\x06\x12\xc0\xc7\x7b\x1f\x9c\xbc\xb7\x98"
+ "\x68\xa1\xae\xc1\x54\xb9\x5d\xcf\xf6\x78\x19\xb7\xa7\x98\xda\x68"
+ "\x15\xee\x2d\xe4\x6b\x1f\x7b\xca\x68\xd0\x76\x3d\xcf\xbf\xe7\x67"
+ "\x75\x6d\xd0\x06\xe5\xf6\x48\x93\xfd\xb4\x68\x13\xee\x01\xec\x6f"
+ "\x8f\xa4\xc6\xed\x33\xf8\xf9\xf7\x3d\xd9\x92\x5c\xe5\x18\xdd\xb3"
+ "\x9a\xd3\xed\x4f\x15\x9c\x6e\x7b\xca\x44\x7d\x75\x2b\xfe\x0f\xba"
+ "\x3b\x82\xaf\xd5\xef\x49\x92\x6c\x64\xb3\x98\x07\xdf\x81\xff\x63"
+ "\xb9\xac\xdd\xb3\x09\xda\x2e\x9e\x61\xd8\xc3\xd6\x0b\xa1\x7d\xa0"
+ "\xb3\x3e\xa8\xc7\x76\x79\x93\xad\x8c\x16\xa9\x24\x00\xea\x1c\x8b"
+ "\x7b\x4a\xd1\x4e\x31\xd9\x1e\xae\xe2\xb1\x2c\xf7\xde\xc7\xce\x01"
+ "\xc3\x77\x80\x3f\x72\x94\x9b\x78\x6e\x19\xcb\x73\xd5\xbf\xea\x46"
+ "\xa9\x2e\xf8\x3d\x7c\x06\x6d\xc5\x7d\x75\x48\xab\x19\x98\x07\xf9"
+ "\xda\x6a\xc0\x39\x8e\xf3\x40\x33\xdc\x2f\xb4\x37\x0a\x69\xc2\x69"
+ "\xb6\xb7\x3b\xe6\x39\xa7\xd7\xde\x51\x9e\xf4\xe0\xf7\x82\x12\x64"
+ "\x43\x22\xee\x1b\xd9\x1b\x25\xd2\x4f\x1c\x07\x54\xb1\x38\x9c\xfc"
+ "\x59\xd5\x36\xb7\x77\xc7\x75\xe7\xe5\x71\x53\xe5\xb8\x06\x8b\x73"
+ "\xf2\x1c\xaf\x55\xf5\x6e\xef\xd5\xcf\x3f\x8b\x36\xf2\xb6\x48\x8c"
+ "\x73\x89\x34\xef\xc8\xac\x6a\x71\xd1\x9b\x97\xd3\xc7\x37\xc6\x4b"
+ "\xdf\x30\x93\xaa\xad\x52\x3d\xe1\x7f\x51\x07\xef\xd5\xb9\x78\x52"
+ "\x35\x43\x7a\xaf\x84\x9d\x25\xda\x63\xc3\x33\x90\x7d\xca\x41\x5c"
+ "\xfb\x01\xaa\xd4\x39\x1e\xae\x62\x78\x24\x7b\x4b\x71\x4f\x2c\xd0"
+ "\x35\x96\x63\x68\xef\x3a\xae\x0b\xf7\x96\x62\x99\xb8\xae\xc2\xfd"
+ "\x9d\xee\x2d\x82\x72\xc5\x58\xdd\x7b\x77\x88\x75\x80\xf1\xdf\x07"
+ "\x5b\x7b\x8e\xeb\x1e\x5d\x10\xcf\x0e\xfb\xde\xb3\xdc\xd0\xf3\x5c"
+ "\x91\xd2\x75\xae\x73\xaf\xc5\x75\x2e\xb6\x52\xcd\xe9\xfd\xe1\x14"
+ "\x18\xa7\xee\xcc\xe7\x7e\x71\x2b\xf2\x81\x67\xe9\xe7\xc9\x58\x8c"
+ "\x0f\x93\x66\xa0\xa7\xea\x0c\x30\xb6\x56\xee\x9a\x46\x8d\xbb\x66"
+ "\xa4\x9d\x27\x23\x70\xcf\x05\xca\x1b\x9c\xef\xa1\x41\x90\x9e\xbd"
+ "\x6b\x86\xeb\xec\xdd\x3e\x33\x8c\x6d\xcb\xf2\x60\x2c\x9b\x7e\x9a"
+ "\x8c\xe5\x7b\x28\x3e\x94\xe6\x7d\xde\x10\x8c\xbb\x66\xe2\xb9\xce"
+ "\x3a\x18\x11\xd2\x74\xfd\x1b\x42\xf6\xae\x99\x50\xee\xbc\xf4\x25"
+ "\x64\x34\xea\x37\xdc\xab\xcb\x31\xb3\x0f\x74\xca\xae\x79\xe8\x73"
+ "\x4d\xa0\xb1\x32\xf8\x7e\xa9\xa0\x7c\xdf\x92\x27\x10\xb6\x47\x1c"
+ "\x70\x26\x6f\x26\x1f\xee\x85\xef\x97\x62\xdc\x4a\x9c\xf3\x31\xd9"
+ "\xed\xe8\x17\xa2\x14\x9e\x85\xc0\x33\x9c\xef\x11\xd0\xff\x1a\xfa"
+ "\x73\x87\xf2\x35\x58\x3e\x7c\xab\x94\xd7\x9d\xf9\x45\x29\x6d\x26"
+ "\x1f\xdd\x86\x79\x24\xbf\x6e\x42\x7a\x6c\x00\x3e\xc7\x73\xc2\x4e"
+ "\x8c\x8b\x00\xd6\x39\x7f\xa7\xb1\xfb\x1d\xd1\x7e\x86\xbe\xbc\xef"
+ "\x3d\x9a\xb3\xa7\x1c\xf2\x56\xe0\x9e\x54\x6e\xcb\xee\xdb\x29\xf6"
+ "\x75\xb0\x8f\xf7\xbd\x2b\xfe\xaf\xea\xce\x9b\x1e\x4b\xd2\x2e\x12"
+ "\x0d\x5b\x57\x5d\x11\x00\xb2\x77\x9f\x0a\x63\x2c\xb8\x95\xf9\x0d"
+ "\x96\x97\x8b\xfe\xe2\x12\x88\x0a\xe4\xf2\x48\xa8\x37\xc6\x47\xf9"
+ "\x06\xe7\x6a\x45\xda\x98\x81\x4f\xe5\x05\xdc\x27\xe0\xce\x3c\xc0"
+ "\x7e\xda\x6a\xb0\x07\x56\x13\xd5\x6a\x27\x09\xc7\x76\x02\xdf\x2c"
+ "\xb8\xaf\x1a\xc7\x6e\x48\x1b\x91\x87\x95\xd0\x96\x7d\xab\xf5\xb4"
+ "\x65\x75\x1b\xb5\xd4\xea\x1b\x09\xe8\x99\xd1\x75\x86\x7a\xf4\x4d"
+ "\xfe\x0d\xb6\x15\xe7\x28\x81\xa6\x60\x4f\xc2\x37\xb2\x77\xed\xc3"
+ "\xb3\x32\x6c\x9e\x40\xbe\xb7\x42\x3a\x57\x54\xc2\xce\x1e\xed\x8b"
+ "\xe8\x9e\xfb\x4a\xa6\xfb\xc4\xba\x54\x0b\xf8\x7f\x32\x3b\x9f\x38"
+ "\x02\xc7\x3f\x38\xa7\x31\x7f\x65\x69\xf7\x19\x0d\x3e\x37\xb0\x6f"
+ "\xb1\x9b\x5f\x2e\xf6\x2e\xce\x11\xe0\xbb\xd1\x0e\x7a\xbe\x40\xcc"
+ "\x8b\xef\x46\xaf\x9c\x4f\xf1\x5d\x78\xa7\xb4\xfb\x1d\x8f\x33\x3e"
+ "\x1f\x71\xbb\x02\x68\x8b\xff\x5b\x81\x96\xe2\x1e\x2a\x2d\x5f\xff"
+ "\xde\xd7\x28\xad\x39\x9b\xc9\x87\x85\x88\xa7\xbe\xfd\x89\xef\x27"
+ "\x9e\x3e\x92\xf6\xd7\xa3\xff\x26\x48\xd7\x48\xbe\x8c\xe0\xff\x09"
+ "\x50\x16\xb7\xb3\xdd\x7c\x94\xe5\xbb\xf9\x3b\x4c\xb7\xd2\x6f\x11"
+ "\x27\x20\x57\x02\x4e\x91\xfd\x06\x9a\xfd\xbe\x85\x9f\x93\xda\xbf"
+ "\x17\xeb\xd9\x4c\xf6\xe3\xfc\x5a\x28\xf7\xa5\xb0\x7f\x8d\x28\x3f"
+ "\x1a\xa3\x9d\x8e\x50\x33\x7c\x13\xcf\xfc\xb8\xdd\xa3\xef\x31\x35"
+ "\xe4\xfb\x1b\xf7\x07\xb8\xdf\xd0\x23\x3f\x3e\xcf\xe8\x71\x1f\xd5"
+ "\xe3\x5e\x6b\x83\x7e\xe3\x6d\x6d\x3d\x6f\x2c\x9b\x3f\x74\x84\xac"
+ "\x21\x86\xf4\x93\x24\x00\xb0\x72\x1c\xeb\x56\x67\x69\xc3\x36\x85"
+ "\xd2\xcc\x08\x82\x73\xa0\xcc\xb6\x04\x9d\xde\x3c\x01\xf2\x9c\x24"
+ "\x37\xe1\xbe\x6f\x8c\x91\x02\xf9\x4f\x71\x3f\xe6\x1f\x3f\x3d\x6f"
+ "\xf9\x08\x22\xbc\x18\x3b\x92\xca\x63\x8a\x70\x6d\xef\xed\x4e\x73"
+ "\x20\xae\x73\xa5\x6d\x06\x4c\x3a\xc9\x4d\x80\xb1\x16\x8c\x47\x07"
+ "\xef\xb4\xfd\x77\xa7\x25\xd0\xe4\xf8\x92\x18\x5e\x22\xf2\x53\xe4"
+ "\xe3\x99\x8a\x54\xa2\x28\x68\x25\xe8\xbb\xdb\xf1\x91\x23\x92\x48"
+ "\xbe\x10\x8a\x47\xf3\x73\xdc\xc5\x20\x5f\x5f\xd5\x50\x7b\x47\xe6"
+ "\x3f\xcb\x60\xec\xb5\x49\x1a\x63\xe7\xf2\x38\x28\x0a\xf8\xfe\x8d"
+ "\x72\xd1\xef\x03\xa7\xed\x3f\x8f\xf3\x73\x56\x61\x2f\xc2\x3b\x4d"
+ "\x2e\xfb\xfb\x63\x1e\x6b\xdc\x58\xa9\xe2\xb2\xef\x63\xfd\x47\x60"
+ "\xc1\xaf\xe3\x7b\x14\xc2\x3a\x32\x3f\x56\x76\xef\x51\x60\xf3\x56"
+ "\x1f\xeb\x69\x76\xa5\x8a\xdb\xe6\x95\xaa\xf9\x4e\xa5\xd8\x07\x31"
+ "\x7d\x5b\x24\xbe\x0b\xef\x85\xda\xd8\x1c\xd3\xc7\xd3\x5c\x58\xfb"
+ "\x98\x9d\x33\x82\x36\xa9\xcc\xe4\x9f\x19\xd8\x2e\xa4\x09\xe4\x53"
+ "\xc0\xfd\xba\x8f\xb6\x7a\xf1\x0b\xab\xdc\x66\x71\xb0\x39\x90\x13"
+ "\x15\x80\xa7\xd3\xc0\x83\x1b\xd0\xf7\x93\x09\xbe\x53\x5b\xd2\x49"
+ "\x6a\x35\xe7\x48\x1d\xfc\x8f\x7b\x91\xab\x5e\xfa\x96\xb4\x68\xfb"
+ "\xd6\x37\xa0\xb3\xf4\x50\xe7\x14\x2c\x0b\x65\x01\xee\xdf\x32\xa5"
+ "\x82\xfe\xb1\x42\x59\x2d\x84\x95\x51\x2b\x58\x48\x6d\x0a\x8c\xb3"
+ "\x72\x03\xab\xea\x4a\xbe\x24\x75\x9a\xcf\xd8\x77\xd0\x26\xac\x4a"
+ "\x3c\xd7\x5f\xd9\x46\x28\xbb\x48\x2c\xbb\x0d\xca\x0e\xf3\x5a\xb6"
+ "\xb1\xd5\x3c\xc8\xb2\x7d\xaf\xb7\xb1\xb5\x7e\x30\x65\x83\xbd\xdb"
+ "\x86\x71\x6e\xf0\x5c\x57\xda\x18\x12\xec\xbc\x80\x7e\x3f\x6f\xa5"
+ "\x7c\x3f\xec\x81\x87\xd8\xd9\x2f\x5c\xab\xcd\x7e\xd7\xc2\xce\x80"
+ "\x9d\x21\x6c\x4f\x23\x3f\xf7\x75\x9c\xe0\x7e\x88\x8e\xcc\x03\x3a"
+ "\xd7\x58\xa9\x7b\x9d\x0a\x6c\xd5\x03\x33\xf9\xbe\xc7\x77\xc5\xb5"
+ "\x87\x03\xe8\x37\xd2\xcb\x38\xef\xef\x61\x7c\xff\xec\x81\xdf\x4a"
+ "\xf3\x2f\xe7\x82\xfe\x1e\x26\x96\xa5\xed\x39\xaf\x27\x05\xa4\x4d"
+ "\x48\x49\x92\x62\xdb\x26\x89\xc7\x4f\x9f\x4a\x78\x21\x61\x51\x72"
+ "\x42\xbc\x76\xf6\xf2\xc4\xa5\xf7\x2c\x5b\xb8\x50\xfb\x44\xc2\xab"
+ "\xaf\x2e\x78\x31\x61\x04\x99\x9d\xb8\x60\xe9\xab\x8b\x70\xee\x4d"
+ "\xab\x9d\xf6\x93\xf9\xfa\x65\x49\xf7\xfc\x7c\x5a\x44\x8f\xb9\x37"
+ "\x3c\xab\xd8\x84\x36\x38\xe8\x8e\x9b\xd2\x9c\x64\x14\xfa\xf1\x09"
+ "\x5d\x49\xab\x5e\x83\xf1\x1f\xe0\xef\x14\xea\x29\xd4\x0d\x38\x36"
+ "\x40\x1f\x82\x20\xbf\x6b\xde\xfc\x03\xad\x6f\x25\x5f\x39\xc1\xae"
+ "\x6c\x7c\x8b\xfb\xc3\x6b\x82\x31\xb9\x95\xc7\x5b\xfc\xea\x08\xfa"
+ "\xba\xdb\x00\x69\xd6\xa0\x4a\x55\xc1\xd7\x44\x01\x7a\x0d\xc6\x25"
+ "\x9f\x14\x51\xf9\x70\x9a\x7b\x13\xdd\x47\xbf\xd5\x10\xd1\x87\xb8"
+ "\xdc\x64\xb6\xe3\x7a\xbe\x32\xda\x91\x4e\x51\x9e\xf2\xbe\xf5\xc9"
+ "\x66\x4e\x97\xed\x46\xbe\xaf\xf8\xab\xf7\x70\x0c\xb3\x96\xc5\xc3"
+ "\xfc\x04\xfa\xff\x6e\x83\x4b\x4e\x7f\xb6\x4f\xb4\x1d\x71\xbd\x7d"
+ "\x45\x33\xdc\x73\x3f\x23\x9f\x34\x78\xee\xd5\xa8\x01\xbd\xfc\x85"
+ "\x85\x5f\xf8\x4e\xa3\x92\x5f\xf8\xbf\xfb\xf5\x55\x31\xbf\x7a\xa6"
+ "\x5f\xea\x25\x7d\xdf\xdf\xf7\x1b\x52\xfb\xbf\x7c\xf9\x3e\xfe\x5e"
+ "\xcd\xf6\x5f\xca\xfb\x0d\xeb\xfa\xbb\x10\x6f\x80\xad\xa6\x0d\x5f"
+ "\x13\x25\xe0\x73\x53\xde\xf3\x80\xe9\xa3\x44\x93\xea\xa0\x2d\xe9"
+ "\xcf\x92\xf0\xb4\x93\x04\xe3\x11\x5a\x92\x52\x68\x4b\xda\x05\xb4"
+ "\x49\x1b\xe6\x00\x7e\x2b\xf2\x9b\x89\x2a\xaf\x99\xa8\xeb\x92\x30"
+ "\x56\x31\xfa\xfa\x02\x39\xd3\x06\x17\xdc\xd7\x24\xdb\xc9\xa7\xd6"
+ "\xb3\xb8\xbf\xa9\xaa\x2e\x0e\xe4\x4e\x13\x21\x88\x5f\x55\x1c\x09"
+ "\x2b\xbe\x89\x56\xd2\xcc\x65\xa0\xcf\x96\x61\x5c\xc2\x86\x77\x84"
+ "\xa8\xc0\x77\x56\x55\x07\x6a\x9f\x47\x1d\x5f\xfb\xb4\x88\xcd\xfd"
+ "\xfc\x4c\xd1\x67\xec\x3c\x03\xf4\x93\x06\x3e\xaf\xde\xf0\x08\xd7"
+ "\xe7\x0d\xa3\xc4\xf9\x26\xf8\xff\x33\x66\x2b\x42\x3b\x2a\x30\x7e"
+ "\x2b\x96\xf9\x57\xa1\x82\xc5\x6f\x7d\x67\x55\x54\x60\xea\x02\x22"
+ "\xaf\x33\x9f\x22\x18\xdb\x09\x63\x81\x42\xbf\xdb\x01\xfd\xac\x7c"
+ "\xcb\x4d\xb4\x10\xea\x97\x5b\x72\x13\x35\x42\x9d\xca\x3a\x32\x6b"
+ "\x61\xbc\xfc\x71\xa5\xb8\xee\x52\x05\xfd\x62\x47\x1e\xe4\x89\x5e"
+ "\x4e\x6e\xcd\x83\x7c\xf9\x90\x0f\xed\x64\x5e\xbf\x83\x79\x40\x83"
+ "\x9d\xf0\xcd\x7a\xed\x73\x78\x6f\x62\x7b\x6f\xf0\xdb\xd0\x0e\x6d"
+ "\x33\x31\x69\x40\xb7\x29\xf0\x1b\xd2\x77\x3b\x32\xeb\x40\xfe\x55"
+ "\x27\xb1\xb5\x33\x48\xe7\xe5\xd4\xcd\xe6\xfd\x75\xd7\xe2\x02\x57"
+ "\x7c\xdd\xc5\x79\xab\x40\xa7\x77\x32\x1f\x98\x9b\x70\xbe\x05\x6d"
+ "\x0c\x66\x57\x38\x49\x28\x9f\x1f\x00\xdb\x42\x0f\x72\x00\xec\x09"
+ "\xb6\x17\x1a\x6c\x09\xa8\xcb\x26\x8c\xf3\x88\xcf\x61\xdc\xb6\x13"
+ "\xf4\x72\x39\xda\x01\xcf\x9d\x7f\x9c\xe0\x1c\x3b\xc6\x68\x7d\x75"
+ "\x1e\xb5\xf3\x98\x39\x75\x3b\x25\x5b\x00\x65\x10\xea\x7f\xb0\x85"
+ "\x15\x5d\xc0\x43\xc0\x40\x35\xd8\x16\xa3\x4e\x31\xcd\xc1\x68\x5f"
+ "\xcd\x74\x7e\x32\xf3\xd9\x1c\xc0\x65\x74\x9d\x13\xda\xa7\x82\x6f"
+ "\x00\xcd\x9a\xd8\x5c\x38\x97\x31\x26\x95\xa4\xc7\x71\xcc\x6b\x86"
+ "\x32\x28\xc8\x32\xf1\x19\xb4\x7f\xbf\x14\xeb\x0e\xec\x8a\xba\x4a"
+ "\x91\x66\x35\x7c\x0d\xd9\xc4\xc6\xfe\x36\xb0\x15\x44\xda\x54\xa3"
+ "\x5d\x21\xbe\xdb\xbd\xff\x11\xc7\xe5\x02\xd8\x15\x48\x2f\xa4\x13"
+ "\x94\x53\x2d\xca\xb1\x06\x6e\xbf\x1c\x5c\x2e\xae\x5b\x16\x02\xaf"
+ "\xd7\xb9\xe8\x6f\x2a\x73\xa7\x3f\xbc\x2f\x8e\x1b\x0f\xde\xe6\xc6"
+ "\x3b\x18\x1b\xd5\xdb\x71\x9e\x14\xea\x58\xc9\xe7\x78\x4c\xdf\xa0"
+ "\xaf\x34\xf4\xcd\x0c\x34\xae\xcc\x45\x3f\xc0\x20\x9b\xd7\x7e\x4d"
+ "\x70\xed\x1b\xec\xa7\xfa\x6f\xb8\x7d\x5a\x9f\x81\x18\x86\x7b\x36"
+ "\x0f\xdf\x02\xf5\xc2\xf2\xe0\x3e\x06\x7e\xc1\x8e\xad\xff\xa5\x7b"
+ "\x3c\x65\x57\x2c\xe5\xfa\x28\xd7\x79\x04\xd3\x62\x3e\x7e\x36\x2d"
+ "\xc6\x39\x30\x96\xbf\x4b\x8f\x75\x6b\xc2\x7e\x29\xb5\x15\xe3\x2a"
+ "\x43\x3a\xda\xfe\x4d\xc8\x37\x29\x1d\x7d\x08\x03\x9f\x54\xf0\xad"
+ "\x23\x62\x9d\x76\xc2\xbd\x12\xee\x27\xb0\xf9\xfd\x2e\x76\xde\xbc"
+ "\x29\x2f\xcd\xf5\x0e\xf6\x1b\xc0\x70\x28\xe4\x39\x08\xbf\x54\xca"
+ "\xcb\x63\x2f\xd7\xc7\xfe\xbe\x13\xe7\xc0\xea\x0d\x52\xec\x65\x8c"
+ "\xbb\x8c\x32\x23\xef\x39\x0f\xda\x23\x6d\x76\x00\xaf\x18\xee\x3e"
+ "\x72\x54\x00\xbd\x0f\x82\xfd\xff\x8f\x58\xde\xae\xfa\x58\xb1\x7e"
+ "\x55\xdc\x7f\xca\x81\x42\xe6\xef\x97\x8d\x87\x0e\x46\x75\x8f\x87"
+ "\xba\x6d\xcb\xfa\x58\xc4\x24\x94\x55\x83\xfc\x47\x3b\x11\xf2\xe9"
+ "\xbb\xb1\xc5\xce\xfb\xd6\x5b\xd0\xbe\x14\xeb\x8f\x78\x39\x20\xd2"
+ "\xae\xd0\xbd\xdf\xb9\xf7\x73\x28\x03\xc6\xff\x1f\x77\x63\x40\xea"
+ "\xd7\x1c\x07\x87\xc4\xd8\x4f\x27\x2a\xd0\x87\x2f\x94\x5b\x85\x36"
+ "\x38\xd7\xab\x87\x76\x7e\xd4\xe4\xc0\x39\xf4\x06\xb8\x87\xfe\x7d"
+ "\xa8\xf0\xdc\x88\x3d\x15\xeb\x98\xdc\x38\x04\xf4\xb9\x97\xc5\x2a"
+ "\x41\xba\x48\xfd\xb5\xe0\x39\x1c\xfb\x45\xf0\x3e\x9b\x02\x68\xb0"
+ "\xb7\x11\x71\xaf\x3f\xf4\xd9\xe3\xb8\x76\x7a\x0a\x30\xa4\xc4\xfe"
+ "\x0b\xfc\xdd\x81\xfe\xa6\x81\x8e\xf5\xeb\xfe\xc0\xfa\xad\x0a\xfb"
+ "\x6d\x17\xfa\x90\x80\xef\xec\x8b\x8b\x22\x1f\xa5\x54\xb1\x7e\x8c"
+ "\xfe\x43\xde\x04\xda\x61\x9c\x63\xf8\x76\xaa\xb4\x47\x19\x31\x82"
+ "\xfe\x42\x44\x9c\xec\xc3\xbe\x2c\xd2\x4e\x01\xf9\xb6\x4a\x7d\xcf"
+ "\x8d\xff\x2c\x4f\x8f\xfe\x16\xca\xfb\xdb\xa1\x06\x89\xd6\x0e\xd6"
+ "\x8f\xeb\x0d\x0e\xe8\xc7\xee\x34\x45\x7a\x22\x5d\x3b\x32\x3f\x83"
+ "\xf6\x57\x6b\x24\x9a\xba\xe8\xf9\xd9\x2b\x22\xcf\xeb\xf9\x1c\xd3"
+ "\x67\x53\xc4\xf9\xa7\x6e\x1a\x8a\xf8\x43\x3d\x50\xb1\x16\xdb\x0e"
+ "\xba\x01\xbf\x8f\x18\x79\x53\x94\x59\xfb\xac\x88\x91\xcf\xa0\xff"
+ "\xff\x5a\xe7\x92\x1d\xf5\x49\x6c\xcc\x02\x7c\xe2\xfc\xf9\x6c\x0b"
+ "\xf3\xb7\xd1\x87\xec\x30\x93\x83\xf3\x5c\xf2\xe9\xb3\x1d\x12\x1d"
+ "\x24\x4c\x4a\xfd\x1e\xca\xb8\xe8\x29\x7f\x3e\x3b\x0a\x65\x8c\x46"
+ "\xf9\xe6\xb2\xa1\x3e\x6b\xf3\x94\x6f\x9f\x35\xa0\x7c\x43\x5c\x1b"
+ "\x92\x71\x8e\x8d\xeb\x2b\x33\xa9\x4d\xf5\x94\x49\xb5\xaf\xf0\xbd"
+ "\x01\xdc\xe6\x42\x6c\x19\x9e\xe3\xf9\x51\x87\x41\x7e\x36\x16\x17"
+ "\x75\xde\x3e\xd4\x71\x90\xa6\x17\xe9\xd5\x04\xf9\xf7\xe1\xb9\x49"
+ "\xf4\x95\x30\xb2\x89\x8f\xf5\x40\x4e\x57\xa2\xff\x6e\xc8\xa7\xab"
+ "\x83\xaf\x75\x65\x71\xd9\x2d\xc9\x0a\xfa\x42\xec\xc8\x15\x16\x12"
+ "\x64\xf8\x39\xfd\xb6\x95\x1c\xc6\xf3\xac\x76\xf4\x21\x09\x65\x6b"
+ "\x5b\xc9\x17\x07\xe1\xbb\x61\xe2\xaf\x06\x7e\xdf\x83\xdf\x31\xf0"
+ "\xfb\x47\xf8\xbd\x05\x7e\xb3\x21\xbf\x20\xe6\x8f\x80\xfb\x57\x20"
+ "\xfd\x27\xe2\x2f\xd4\xf1\x30\xda\x9b\xb3\x44\xdb\x11\xd3\xa7\xe3"
+ "\x3d\xfc\x3e\x20\xf2\xbc\x86\xf3\xfc\xf0\x3d\x50\x4e\x0a\xd4\xbf"
+ "\xd1\xd4\xc4\xca\x32\xb4\x92\xcf\xcf\x63\xd9\x78\x8e\x19\xfe\xdf"
+ "\xee\x66\x83\x42\x39\x87\x0f\xc3\xef\x14\xf8\xdd\x0c\xbf\x49\xf0"
+ "\xbb\x44\xa4\x41\x3d\xca\x86\xf8\x14\x46\x73\xa3\x96\xdb\xbb\xb3"
+ "\xa4\x3e\x8f\x7a\xd8\x25\x3b\xea\xaa\xe3\xe7\x71\x7e\x9b\xc9\x21"
+ "\x86\x03\xc8\xfb\x08\xe6\x85\xdf\xc7\xc4\xdf\x28\xf1\x77\xba\xf8"
+ "\xfb\xef\xe2\xef\x34\xf1\x77\x86\x99\x1c\x36\x88\x36\x06\xd0\xe5"
+ "\xb0\x01\xdb\x0d\xb2\x7b\x02\xff\xc6\xe7\x85\x38\x46\x06\x39\xfe"
+ "\x00\x94\x1f\xd0\x91\xf9\xb9\x42\x9a\x1f\xc5\x39\x9f\xae\xcc\x03"
+ "\x7f\x79\x93\xad\x6b\x7f\x1e\xee\x92\x6d\xef\x37\xa9\x64\x51\x04"
+ "\x6c\xa0\x1b\x8b\xe5\x54\xdc\x2b\xf4\x79\x92\x5c\x5c\x17\x16\x63"
+ "\x03\x04\xa0\xbf\x3c\x36\x1e\x0a\xa2\x3a\xec\xab\x6c\xee\x18\x7d"
+ "\xbb\x05\xbd\x6f\x86\xab\xcd\x1a\xf4\xbe\x55\x92\xdf\x38\xee\xe1"
+ "\x63\xf5\xe1\x9f\xc1\xb7\x8c\xae\xb1\xfa\xe7\x91\x7c\x0d\xed\xe6"
+ "\x57\x20\xbd\xd4\x95\x7e\x18\xcf\x03\x3c\x00\xf4\x6c\x84\xf6\x4c"
+ "\x69\x26\x9f\xa3\x0f\xff\xfb\x5b\x78\x9b\x23\xa4\x36\x8b\xfc\x30"
+ "\x48\xf4\x6d\x21\x87\x53\x40\x16\x26\x22\x86\x9b\xbb\xe5\xec\x61"
+ "\x36\xaf\x2b\x62\x04\x78\x79\xf8\x3e\xe4\xa9\x5b\x1f\x74\x97\x41"
+ "\x61\x1d\x99\x5f\xe8\x3c\x65\x8a\x49\x87\x32\x05\xb1\x01\xf2\x1b"
+ "\x79\xad\xec\xd1\xff\x1a\xb0\xff\xf1\x7e\xf7\x45\xbc\xe7\xbb\x9f"
+ "\x35\x38\x78\xbf\x6b\x04\x9c\x01\x3e\x1b\xd8\x3e\x2e\x33\xf9\x62"
+ "\x9a\xd8\xa7\x1b\xa1\x4f\x3f\x00\xe9\xf5\xbc\xae\x3c\x5d\xfc\x16"
+ "\xe0\xac\x01\xdb\x7d\x8b\x94\x2e\xb6\x17\xcb\x41\x9f\xff\x63\xa4"
+ "\x74\xb1\x7c\xc0\x63\x43\x05\xf6\x13\x29\x5d\x6c\x13\xd8\x51\x5f"
+ "\x38\x24\x79\x92\xcb\xf1\xb6\x4e\x7a\x0f\xf9\x86\xfe\xb1\xf8\x1c"
+ "\xff\x17\x78\xb6\xa2\x14\xf5\xc3\xda\xe7\x88\x6a\x45\x11\x09\xe6"
+ "\xfd\xf2\x0b\x8b\xa7\x8c\xfc\xf2\x00\xcd\x0c\x75\x50\xe5\xfb\x8d"
+ "\xb5\x8e\x29\x92\xbd\x5a\xdc\x91\xd9\x18\x2f\xc5\xf9\x76\xc5\x19"
+ "\x68\xdc\x5c\x5b\xda\x4d\x5f\xa8\x4b\xa3\x51\xaa\x8b\x9b\x7e\x66"
+ "\x3c\xc0\xba\x61\x59\x6b\xc1\x5e\xb7\x81\x5c\xe0\x72\xbb\xb1\xc2"
+ "\x4c\x46\x4a\xf6\x2e\xd3\x5b\xa1\x32\x62\xc8\x4f\x66\xeb\xa3\xa1"
+ "\xa8\x1b\x71\x8f\x8f\x80\xf3\x58\x29\x4e\x52\x67\x80\xb1\x7c\xca"
+ "\x71\x32\x7f\xe5\x08\xf4\xbd\x12\x0b\x75\x7d\x1b\xea\xb6\xd5\x89"
+ "\x73\xff\x4b\x71\x9c\xfa\xe5\x02\x67\x32\xb5\x8b\x34\x83\x7e\xf4"
+ "\xe5\x74\x91\xb6\x28\xbf\xb6\xa2\x4c\x5f\x9b\xc6\x63\x06\xe1\x5c"
+ "\x0e\xf6\x8f\xdf\xa3\x1e\xd3\x50\xfb\xbe\x62\xec\x2b\x47\x66\x48"
+ "\x36\x29\xd4\xb7\x94\xdb\x84\x87\xb6\x31\xdf\x44\xc6\xf7\x1b\xf9"
+ "\x5c\xe0\x91\xc3\xbc\xed\x47\x2a\xf9\x3a\x37\xf3\x91\x89\xf7\x65"
+ "\x01\x9a\x9b\xbe\xe0\xfb\xb2\x0e\xfc\x93\xef\x29\x39\x52\xd4\xbd"
+ "\xa7\xc4\x65\x2b\x56\x71\xbf\x51\x47\x76\xba\xfa\xc4\x91\x75\xf8"
+ "\x1e\xbc\x7f\x0a\xd2\x6b\x5c\xe9\x87\xb6\x72\x7b\xe0\xfd\xa6\x90"
+ "\x35\x51\xb8\xb7\xec\x46\xf4\xb5\xcd\xbf\xf7\xe5\x24\xf6\x7d\x36"
+ "\xe7\x01\x7d\x53\xec\xbf\x48\x67\xd4\xd9\xac\x0f\x43\xff\xc5\x7e"
+ "\xdc\x95\xfd\xbe\x19\x2e\xde\x6f\xb9\x6e\xae\x62\xfd\x96\xf5\xd9"
+ "\x2f\xa7\xba\xd5\xc3\xc6\xe6\xbd\x90\x9f\xaf\x69\x54\xf0\x2c\x16"
+ "\xf4\x6a\xbd\xf8\x8c\xc7\x94\x38\xc5\x7c\xe4\x59\x71\x6d\x1b\xd7"
+ "\x3a\xf1\x8c\x56\x28\xa0\x1b\x7d\x82\x48\x6b\xd5\x4f\xb4\xa5\x53"
+ "\x27\xae\x3b\x5d\xa0\xb6\xc2\x6e\x5f\xff\x5f\x6e\x75\xf9\xf7\x39"
+ "\xa2\x10\xdb\xd5\x08\xdf\x2a\xe6\x7b\xc1\x1a\xcf\x73\x9b\xaa\xd1"
+ "\x86\x38\x35\x01\xf6\xe0\xb7\x88\xc7\x65\xfe\xd2\x2c\x61\x0f\xfa"
+ "\x65\x7c\x2b\xf9\xea\x95\x4d\x37\xd1\x22\xe0\x69\x11\xf4\xa5\xc5"
+ "\x70\xff\x2c\xfc\xc6\xf3\x5f\x99\x1a\x7f\xc5\x3e\x52\xd4\x91\xf9"
+ "\x55\xb8\x14\x8f\x1e\x69\x63\x0b\x3a\x11\x81\x38\xcb\x07\x3a\x20"
+ "\xd6\xd8\x3a\x32\xd4\x1b\xf1\x85\x38\x43\x8c\x85\xae\x79\x9c\xe1"
+ "\x8c\xf9\x1f\x80\x74\xac\x2f\xe2\x0c\xca\xd2\x4b\x7e\x7e\xcd\xe4"
+ "\x2b\x15\x5f\xcf\xf9\x2a\x55\xda\x73\x8b\x6b\x49\x49\xb7\x91\x1b"
+ "\xa1\x5c\xed\x3e\x2d\xf3\xa5\x79\xcc\xe4\x98\x4e\x30\x2f\xae\xc3"
+ "\x71\x39\x79\xf3\x3e\x78\xa7\xdc\x45\x73\x13\x8b\xcd\xfc\xd1\x3c"
+ "\x36\x17\x79\x03\x3c\xab\x71\x1f\x67\x98\xc9\x27\x45\x38\xd6\xc0"
+ "\xbd\x7d\x77\x84\x11\x5c\x07\x06\x39\xf6\x95\x55\xb2\x6b\xef\x0d"
+ "\xc3\xf5\xfc\x4f\xa6\x41\xfd\x70\x0c\x5d\x0f\xff\x47\xc0\x58\xb2"
+ "\xda\xcb\x9c\xf1\x14\x9c\xeb\x11\xe3\xf3\x34\xe1\x3c\x16\xc6\x33"
+ "\x68\x25\xc7\x5e\xa9\x45\x5f\x20\xcb\x7a\xfb\x79\x4e\x4b\xa1\xe7"
+ "\xd1\xd7\xb3\x36\x91\xdc\xd0\x4c\x8e\xcd\xc6\x79\xa3\xf4\xb3\x38"
+ "\x47\xd3\x94\xe2\x39\x47\xd3\x54\x2d\x5e\x30\xd2\x3e\x1a\xe5\x76"
+ "\xd5\x8b\xbf\x33\x07\xb8\x2c\x62\x5e\x68\xe9\xd7\xa2\x4e\xd1\x40"
+ "\x3f\x69\xea\x9e\xff\x45\x5c\x62\xdf\xc6\x7d\x1c\x38\xe7\x24\x73"
+ "\x10\xf4\x3d\x02\x7c\x82\x7a\xaf\xbd\xfb\xa9\xaa\x55\x88\xa3\xa3"
+ "\xec\x1c\x14\xfa\x20\x1e\xdc\x5e\xa2\xa3\x8c\x9f\xdc\x1f\x68\x53"
+ "\x3d\x7c\x3b\xac\xe0\x0c\x51\x18\x12\xc9\x38\x9c\xff\x0e\x75\xd2"
+ "\x2a\x1c\xe3\x8a\x3e\x05\xeb\x4f\x91\xa3\x07\x93\x56\x13\x39\x3c"
+ "\xbf\x15\xfe\xaf\x92\xec\x24\x78\x47\x1d\x60\x27\x61\x68\x1f\x3d"
+ "\xb6\x9a\xdc\xda\x91\x79\xb4\x58\xe2\x15\xda\x10\x38\x0f\x27\xce"
+ "\x25\x40\x5d\x9b\xd8\x1e\x67\xf4\x53\x6f\x66\x74\x63\x72\x18\xcb"
+ "\x80\x31\xec\x51\x63\x80\x8d\xa8\xb9\xee\x39\x0a\xf8\x3f\x20\xda"
+ "\x8c\x47\xb7\x02\xf6\x1b\xdc\xea\xf9\x0b\xb7\xff\xb3\xf0\xfd\x50"
+ "\x1b\xda\x67\xde\xe8\xf3\xf5\x3d\x12\x7d\x70\xbf\x6a\x28\x8c\x13"
+ "\x18\xbf\x1d\xb4\x0d\xea\x56\x63\x58\x45\x94\xa7\xc8\xb1\x71\x6f"
+ "\xfd\x81\x9d\xb3\xab\xe6\xf3\xf3\xc7\x46\x49\xe3\x70\x5e\xef\xaf"
+ "\x8f\x86\xae\x09\x20\x38\xaf\x8e\xfe\xce\xd8\x5e\xbf\xef\x35\x6c"
+ "\x2e\xdd\xe4\x98\x4a\xaa\xd2\x1e\xc4\x3c\x92\x5d\xd5\x74\x2e\x5d"
+ "\x43\x3e\xd2\x4c\x85\x7e\xfc\x75\x19\xf4\x15\xdb\xe0\xf7\x54\x7e"
+ "\x5d\x26\xd2\xb7\x86\xef\x45\xf8\x7a\x25\xea\x12\x1c\xfb\x83\x1e"
+ "\xd9\x87\x3a\xba\x23\xf3\x98\x42\xea\x37\xa0\x37\xf6\xc1\x3b\xa2"
+ "\x3f\x6c\x5c\xff\xfd\x3a\x09\x7d\x40\xb0\x71\x03\xcf\xaf\xe2\x73"
+ "\xfe\xc7\x22\xbb\x6d\x69\xc8\x87\xef\xf1\x3d\x6a\x5f\xcf\x9c\xef"
+ "\x94\x01\x4d\xbf\x9e\x89\x6d\x13\xb1\x08\xfa\xea\x98\xde\xd5\x6f"
+ "\x8f\x32\xd9\xfc\x51\x9b\x7b\xbf\x3c\x66\x74\x8d\x37\x9b\xa6\xde"
+ "\xb3\x89\x68\xfb\xea\x87\x86\x10\xd4\x55\xc7\x2e\x16\x14\xd0\xd2"
+ "\x42\xb9\xf0\xe8\xda\x7c\xa2\x92\xe5\x02\xd9\xb0\x9f\x25\xc7\xdd"
+ "\xd8\x4a\xcc\x41\xa1\xaa\x9b\x67\x3d\x96\x34\x9c\xa6\x69\x88\x3c"
+ "\xaf\x7d\xb8\xf2\x36\xfb\xcd\xa5\x34\xe0\xee\xa7\x9e\x48\xb2\x13"
+ "\xed\x4b\x85\xe4\xc4\x62\x12\xf0\x98\x13\xbe\xad\x22\x06\x33\x69"
+ "\x0e\xc3\x33\xa3\x1f\xa9\xd0\xfe\x68\x0e\xc3\x32\x53\x8b\x89\x32"
+ "\xb5\x85\x5a\x72\x17\x06\x2a\x41\x1f\xa8\xdf\x04\x8c\x8d\x54\xdd"
+ "\x5c\xda\x05\x65\xec\x8d\x63\xef\x95\x7b\xaf\x9b\xf9\xf5\xbe\xeb"
+ "\x66\xb8\x09\xea\xb6\x6d\x70\x75\xfb\x76\xa7\xab\x6e\xdf\xee\xbc"
+ "\xf4\xba\x7d\x73\x9f\x5b\xdd\xd4\xae\xba\xe9\xa1\x6e\xdf\x3c\x32"
+ "\xb8\xba\x1d\x9f\xed\xaa\xdb\xf1\xd9\x3e\xd6\x6d\x47\x3f\x75\xab"
+ "\xed\xbb\x6e\x29\x37\x43\xdd\x8e\x0e\xae\x6e\xad\x36\x57\xdd\x5a"
+ "\x6d\x97\x52\x37\x1c\xcb\xa7\x85\xd3\xe3\xcc\x9f\x7c\x22\xf7\xd7"
+ "\xda\x4a\xbe\x7d\x28\xad\x98\xdd\x8f\x6e\x25\xcd\x17\xc5\xfe\x6d"
+ "\x4d\xb7\xd1\x6f\xb9\x9d\xd3\x9c\x30\xd9\x80\xfb\x5d\x9b\xe7\x01"
+ "\x96\xc3\x38\xa6\xbf\x65\xfb\x1b\xd2\xad\x54\xdc\x6f\xda\xfc\xdb"
+ "\x12\xb6\x1f\xa5\x2a\x4e\xbc\xaf\x3e\x37\xa2\x32\x0c\xf7\x82\x08"
+ "\xd0\x9f\xe9\x88\x4a\x2d\xc6\xef\x7c\x27\xd1\x2a\xa7\x99\xe8\x3b"
+ "\x0c\xfd\xfd\x29\x08\xcd\xa9\x8c\x78\x27\xd1\xce\x62\x87\xaf\x65"
+ "\xe7\x7d\x9b\xab\xa4\x33\x6e\xd2\x37\xac\x41\x55\x71\x90\xde\x28"
+ "\xc5\x81\xa5\x72\xb4\x67\x2a\x35\x58\x3e\xa4\x5b\xa5\xd8\xac\x80"
+ "\xf7\x75\xa2\x6c\xb0\x85\xda\xfb\x93\x7b\xdf\xde\x29\xc9\xbd\xc7"
+ "\x92\x48\x28\xc6\xa5\x2c\x48\x1b\x8e\x6b\x8e\x50\x56\xf3\x4e\xa4"
+ "\x7b\xb4\x6d\x38\x0d\x4d\x25\x01\x78\xb6\x0f\xf7\xe8\x99\x34\x56"
+ "\x32\x21\x95\x04\x46\xa7\x40\x99\x76\x12\x17\x9a\x02\xe5\x01\xad"
+ "\xf9\xd8\xe0\x5b\x36\xc7\xb7\x09\xca\xc3\xf5\xef\x80\x24\xa2\x7a"
+ "\x4c\x93\x4e\xd7\x6e\x26\x0a\x3c\x07\x88\xe7\xf9\xf8\x59\xbe\x61"
+ "\xca\x8e\xcc\x6f\x4b\xa5\xf6\xf9\xc0\x9f\x10\xce\x9f\x96\xa3\x2e"
+ "\xfe\xb4\x6c\xee\xcd\x9f\x96\x40\xce\x9f\x6f\x1d\x2e\xfe\x1c\x8f"
+ "\xf2\xe4\x4f\xcb\x9d\x9e\xfc\x69\xd1\xfb\xc7\x9f\x96\x38\x17\x7f"
+ "\xf8\x37\x38\x7f\x5a\x52\xfa\xe6\x4f\x4b\xa1\x8b\x3f\x2d\x13\x7c"
+ "\xe3\x4f\xcb\x7e\xef\xfc\x69\x99\xdd\x0f\x7f\x86\xf5\xcd\x9f\xe3"
+ "\x37\xfa\xce\x9f\xe3\x51\x83\xe0\x4f\x30\xe7\x4f\xeb\x6a\x17\x7f"
+ "\x5a\x7f\xd6\x9b\x3f\xc7\xb7\x71\xfe\x1c\x2f\x76\xf1\xa7\xd5\xec"
+ "\xc9\x9f\xe3\xfb\x3d\xf9\xd3\xaa\xf4\x8f\x3f\xad\xc4\xc5\x1f\xfe"
+ "\x0d\xce\x9f\x56\x4d\xdf\xfc\x69\x8d\x70\xf1\xe7\xf8\x3e\xdf\xf8"
+ "\xd3\x9a\xe0\x9d\x3f\xc7\x6d\x83\xe7\x4f\xeb\xbb\x3d\xf8\xa3\xf6"
+ "\xce\x9f\x56\xf3\x20\xf8\x13\xca\xf9\x63\x19\xe7\xe2\xcf\x89\x23"
+ "\xbd\xf9\x73\x62\x3a\xe7\xcf\x89\xa9\x2e\xfe\x58\x32\x3c\xf9\x73"
+ "\x22\xc1\x93\x3f\x27\xca\xfc\xe3\xcf\x89\x52\x17\x7f\xf8\x37\x38"
+ "\x7f\x4e\x54\xf4\xcd\x9f\x13\xf5\x2e\xfe\x9c\x88\xf7\x8d\x3f\x96"
+ "\x40\xef\xfc\x39\xb1\xa9\x1f\xfe\x0c\xef\x9b\x3f\x96\x39\xbe\xf3"
+ "\xc7\x92\xd1\x1f\x7f\x06\x67\xeb\x59\x36\xe1\x77\x87\xa0\x9c\x26"
+ "\x6f\xe5\x20\xed\x70\xff\xa1\x90\x69\x69\x2a\x11\x86\x29\xf9\x19"
+ "\x0d\xcb\x26\xed\x2a\xf2\x70\x33\x39\x39\xb1\x44\x08\x54\xd2\xcc"
+ "\x32\x18\x27\xfd\xb9\x88\xae\x19\xa6\x10\xd6\x0c\x57\xe0\xd9\x6c"
+ "\xef\xf1\xdb\x4f\x66\x07\x8c\x21\xe3\xf1\x1c\xdd\x5a\xb0\x97\xf1"
+ "\xff\x8e\xcc\x93\x9b\xc0\x16\x8c\xea\xef\xfc\x16\xee\x75\xfa\x68"
+ "\x1d\x8e\x6f\x4f\x56\x75\xfb\xc5\xc8\xa4\x29\xe8\x5f\xcc\x70\x3b"
+ "\x9e\xb3\x38\x69\xd9\xc4\xfc\x55\xed\xda\x1a\x75\x3b\x3d\x86\x63"
+ "\x8f\x56\x72\xea\x38\xcd\xde\xb5\x15\xf1\x00\xb6\xfa\x0d\xa7\xc8"
+ "\xa9\x88\xee\xfd\x79\x34\xf6\x0d\x71\x8e\x70\x16\xcf\xdb\x36\x07"
+ "\xf2\xce\xc2\x38\xa4\xaf\xa6\x61\x7c\xcd\xb6\x87\xc0\xf6\xfd\x11"
+ "\x7e\x03\x7d\x27\xbd\x05\xbf\xb8\x4f\x86\xef\xcd\x3c\x35\x8b\xd9"
+ "\xcb\x6b\x6f\x79\x83\xef\x85\x6b\xbb\x53\xc2\x1d\x7c\x67\x04\xdc"
+ "\x07\x8b\xf6\x3c\xe6\x1f\x79\x8a\x7c\x77\xde\xed\xb9\x0a\xee\x8f"
+ "\x40\xd9\xa3\xc4\xe7\xc1\x70\xbf\x1b\xed\x6c\xe6\xe7\x23\x3f\x43"
+ "\xdc\x43\xfc\x5d\x29\xa4\xa9\xc5\x3c\xa3\x20\xcf\x6f\xd1\x76\x17"
+ "\xcb\x18\x0d\xf7\x8b\x70\x0c\x2c\x3e\x0f\x83\xfb\x27\x70\xed\x40"
+ "\x7c\x7e\x23\xdc\xdf\x07\xf7\x77\xf1\x33\x2f\x5d\x62\x1f\x3d\xe5"
+ "\xf0\xef\xcc\xf8\x29\x16\x53\x13\x79\xc0\xc7\x02\xdf\xb9\xed\xff"
+ "\x39\xd5\xd2\xe3\x59\x9c\xdb\xb3\x06\xe9\x19\xdf\xa3\xf6\x5d\xaa"
+ "\xdb\xb3\x7d\x3d\x9e\x15\xb9\x3d\xdb\xd9\xa3\xcc\x9d\x6e\xcf\xb6"
+ "\xf6\x78\xaf\xde\xed\x59\x61\x8f\x67\x6d\x6e\xcf\x32\xc4\x67\x01"
+ "\x1d\x99\x6d\x0a\xd7\x1a\xde\x29\x83\x98\x2e\x87\xf4\x70\xb7\xf4"
+ "\x38\x31\x1d\xbe\xdf\x36\xc5\x4c\xde\xb4\x8a\xe9\x8c\xf7\xbc\xfc"
+ "\xb6\x99\x6e\xe5\x47\xf0\x39\x8e\xb6\xb8\xee\xbd\x73\x23\x2a\x0d"
+ "\x42\x57\xec\x1b\xf0\x4c\x83\xb8\x72\xc7\xf6\xd2\x64\xed\xf3\xcb"
+ "\x5f\xd4\x26\x26\x24\xe1\xf6\x95\x25\x8b\x92\xb4\x4b\x96\xc5\x27"
+ "\x78\xf8\x59\x0f\x43\x9f\x83\x18\x53\x0d\x7d\xb7\xb0\xf8\x05\x7f"
+ "\xa0\x96\xee\x98\x1f\x20\x57\xe1\x5b\x35\x66\x32\x9d\x7d\x6b\x13"
+ "\xf7\x47\x5e\x8d\xbe\x5f\xb8\x9f\x17\xf2\x78\x33\x69\x3b\x28\xfa"
+ "\x79\xa9\x82\xbc\x76\xef\x7e\x5e\xce\x34\x30\xff\x86\x90\x8f\xfb"
+ "\x79\x39\xd3\x08\xfd\xfc\x31\x3a\x82\xc7\xf0\xe0\xb1\xcd\x4e\x4b"
+ "\xb6\x89\x75\xfe\x45\xe6\x23\x30\x83\xcf\x65\xf4\xf4\xd7\xba\x6b"
+ "\x1d\xbe\x27\xae\x97\xae\x73\x7b\x3f\x9e\x3f\x97\xf4\x83\xf8\x4d"
+ "\xe3\x2e\x5c\x1f\x18\xd1\x0c\xf7\x6c\xfe\x9e\x3d\x3b\xcd\xe7\xf2"
+ "\xb2\x77\xe5\x62\x9b\xb0\xdd\x9e\x6d\x93\xff\xa6\x99\x9c\x7e\xdb"
+ "\xd5\xb6\xd3\x0d\x6e\xbe\xe0\xc4\x36\x9c\x76\xf0\x3e\xda\xab\xad"
+ "\x6c\x7f\x22\x55\xee\xca\xc5\x6f\xa3\x3c\xe3\x67\x19\xe0\x3e\x7b"
+ "\x97\x51\xaa\x8f\x5b\xfd\x72\x71\x5c\x0f\xf5\x3b\xc2\x69\x02\xf2"
+ "\x03\x78\x2a\xb6\x61\x33\xcd\x6c\x4b\xe5\xb1\x0c\x40\x9f\x60\x4c"
+ "\x16\xa6\xab\xce\xc4\x4b\x73\x99\xa8\xa3\xf8\x1c\xe6\x19\x97\xfd"
+ "\x87\x3e\xba\xb2\x25\xfd\x75\xc6\xcd\xfe\xe3\xdf\x84\xb4\xad\xee"
+ "\x18\x72\xfb\xde\x41\xfc\x1e\xe4\x9b\xc9\xcf\x03\xec\x32\x62\x7f"
+ "\x87\x7b\x35\xee\xc5\xc4\x77\xb1\x8e\xde\xe2\xf0\x79\xf3\xa1\xe8"
+ "\xa2\xe3\xf7\xe1\x12\x1d\x37\xb1\x33\xf2\xdf\x4f\x92\xe6\xeb\xc4"
+ "\x18\x18\x55\x9b\xba\xe3\x52\x7f\x1f\xcb\x62\xbb\xe5\x06\x14\xdd"
+ "\xab\x22\x71\x9c\xb6\xdf\x2f\x40\x19\x8f\x7d\x86\xcb\xfa\xef\xab"
+ "\x44\x9e\x8b\xf1\x54\xbf\xcf\xc6\x74\xd7\xfe\xfb\xef\xcd\x52\x3e"
+ "\x49\x2e\xf3\xf5\xaa\xef\xdf\x63\xf9\x78\xac\xe0\x28\xce\xf3\xbb"
+ "\xd4\xcd\xe4\xfb\x1a\x31\xff\x49\x86\x45\xe6\xbf\xe7\x7b\x0b\xcd"
+ "\xae\x8a\x82\xba\xc2\xf8\xa7\x4d\x8c\x59\xc1\xbf\x0b\xbf\x35\x58"
+ "\x17\xa4\x11\x9e\x25\xa7\x79\x01\x45\xc0\x9f\xc8\xbe\xcf\x92\x3e"
+ "\x23\x9e\xd7\x39\xcb\x6d\x08\x39\xb5\xe3\x1c\x2b\x6f\xeb\xd9\x04"
+ "\xb7\xbd\xcf\x2a\x29\x0f\x97\xdd\xec\x19\xdb\x53\x6e\x48\xc6\xf9"
+ "\x20\xf1\x59\x32\x9e\xaf\xed\xfe\x7f\x98\xdb\xff\x81\xf8\x3f\xdb"
+ "\xd7\xbc\x8a\xe9\x56\x85\xeb\x1c\xff\xd9\x78\xb8\x57\xf5\xb8\x0f"
+ "\xf3\xb8\x5f\xc9\xf7\x3d\x83\x6d\xd6\xc2\xf6\x90\x8b\xe9\x62\xd9"
+ "\x41\xac\x3e\xc9\x34\x12\xb0\x51\x84\x67\xba\xc5\x7e\x58\x84\x67"
+ "\xb6\x43\x1d\xcf\xb2\xf3\xda\xf0\x7c\x8a\xf8\x1b\x21\xfe\x4e\xe2"
+ "\x71\x5a\xcf\x86\xbb\x62\xad\xe3\x1c\xcd\xd9\x49\xde\x62\xbf\xe3"
+ "\x79\x70\xf1\x37\x42\xfc\x9d\x24\xc6\xaa\x9d\x07\xef\x75\x9f\xff"
+ "\xee\x7b\x0f\xf2\xd9\x75\xd2\x59\x6e\xa7\x71\xd7\x54\xc1\xb8\x5b"
+ "\x87\x71\x41\xd1\x4f\x58\x7a\x1b\xfa\x8a\xb1\x11\x13\xe9\x24\xa6"
+ "\xa4\x8e\x0c\x8c\x0d\x5a\xc7\x63\x82\xe2\x19\x58\x19\xce\x9b\xa3"
+ "\xed\x58\x67\x38\xcd\xe2\x82\xae\x68\x93\xe2\x9e\x9c\xb5\x38\xb3"
+ "\x77\x4d\x15\xfb\xcb\x66\xbe\x47\xbf\x9d\xcd\x17\xb3\xb8\xd6\x6d"
+ "\x6c\xdd\x4b\xd9\x4a\xda\x53\xa4\x3c\x9c\x76\xed\x6c\xee\xeb\xad"
+ "\x4c\x29\xf6\x63\xbb\x56\x8a\x35\x6d\x26\xed\xa9\xe7\x83\x3e\x2c"
+ "\x83\xb4\x29\x9e\x7b\xa6\xdb\x9f\xc0\x32\xb1\xee\x66\x72\xd6\x8a"
+ "\x65\x43\x9e\xd8\xee\x3e\x0b\xe9\x2b\x1c\x64\x2c\xd4\xab\x55\x2a"
+ "\x1f\x9e\x43\xff\xb7\x32\x5a\x62\x99\xe7\xb3\x2d\x8d\x90\x96\x6b"
+ "\x96\x67\xef\xe0\x7b\xae\xdb\x41\xff\xfd\xdf\x69\xfd\xd9\x40\xd0"
+ "\x17\x0c\xd0\x97\x52\x04\x63\x95\x9e\xf9\xf2\x0e\xaa\x32\xf0\x39"
+ "\xc6\xf6\xe3\xb8\x3b\xbc\xe0\x02\x51\xe0\x1e\x08\x8e\xd9\x73\xdc"
+ "\x07\x32\xa4\x81\xac\x2e\x83\x3e\xc2\xea\x31\x38\xbd\xdf\x6e\x63"
+ "\x65\x8c\xe5\xbe\xcd\xf0\xec\x52\x47\xe6\xb9\xa8\xee\xf8\x09\xdd"
+ "\xfd\xf8\xdc\x22\x5c\x7b\x80\xfe\xc1\xea\xd8\xb3\x0e\x58\x5f\x28"
+ "\xab\xc5\xab\x8d\xa9\xac\xd2\xb3\xf5\x99\x9c\xca\x28\xbe\x47\xf5"
+ "\xdc\xdf\x02\x34\xb7\x58\xe0\x5b\x3b\xba\xe3\x46\x40\x9e\x7c\xdc"
+ "\x7b\x0f\xe5\x77\xb7\x33\x91\x7d\xa3\x81\xf7\xf5\x73\x16\x21\xbb"
+ "\x4a\x5f\xd0\x49\x14\x62\xba\xa5\xce\x61\xc7\xd8\x03\x7d\xfa\xd9"
+ "\x62\xb1\xf3\x70\x4f\x78\x4e\x95\x1e\xcf\x0d\xdd\x6b\x97\xea\x6c"
+ "\xb3\xe0\x79\x15\xac\x33\xa7\xad\xed\xa8\x44\xc7\xbc\x76\x28\x3b"
+ "\xed\x4b\xd2\x42\x6c\x09\xb8\x6f\x8e\xd1\x64\x95\xb4\x97\xd3\xc6"
+ "\xc6\x7c\xec\xfb\x3c\x0f\x1b\xfb\xb3\x38\x46\x50\x7e\x09\x8b\xc5"
+ "\x06\x6d\x00\x5e\x54\xa5\xe1\x99\x7f\x1b\x8b\x0b\xb0\x96\xf9\xea"
+ "\x80\x76\xb3\x7d\xb2\xe7\xc5\x75\x12\xdb\x56\x49\x57\x98\xc5\xb4"
+ "\x02\xfc\x76\x72\x27\x39\x43\x6c\xbf\xc5\x18\xeb\x40\x8f\x14\xf4"
+ "\x4f\x57\x67\x83\x7e\x92\xd2\x89\x58\x48\xc1\xd8\x9d\x66\x62\x5b"
+ "\xc7\xf5\x1b\xd2\xdc\xa6\xc7\xef\x23\x6d\x61\x6c\x66\x05\x9a\x5e"
+ "\xe8\xc8\x3c\xdf\x1d\xff\x31\xff\x26\x1c\xef\xd8\xfa\xf5\xaf\xeb"
+ "\x84\x3a\xd7\x15\x81\xee\x1c\xfb\x25\xd6\xef\x80\x30\xa2\x4a\x8f"
+ "\x7b\xb2\xe1\xff\x25\xa2\x6c\x67\xbc\xe3\x38\x38\xff\xc7\x00\x4d"
+ "\xf8\x6d\x75\x1c\x0b\xcc\x87\x1a\xa4\xcd\x10\xe9\xc7\xe2\x49\x14"
+ "\x26\x73\x3a\x88\xf9\x1d\x7c\xbe\x38\xfc\x2e\xa8\x97\x5b\xfc\xbb"
+ "\xf3\x4c\x77\xa3\xef\xfb\x12\x36\x26\x3c\xbf\xd3\xad\xce\x36\x76"
+ "\xfe\xb5\x1d\xe7\xfa\xce\xcf\xc3\x6f\xe5\xa1\xff\x30\xc4\xc5\x29"
+ "\x77\xfc\x9f\x7f\x08\xeb\x89\x7b\x7e\x9d\x41\x95\x51\xa0\x6f\xa7"
+ "\x21\x9d\xe1\x9d\x24\xe8\x0b\xfa\x7e\x74\x21\x8b\xbb\xd7\x91\x79"
+ "\x41\x27\xe9\x42\x18\x5f\x80\x5e\xe8\xb8\x8d\x8d\x3b\xc1\x9e\x36"
+ "\x09\x68\xcf\x74\x68\x11\x37\xd0\xd7\x33\x44\x19\x9b\x01\xef\xcc"
+ "\x93\xd6\xbc\x9c\x78\x6e\xe2\x0c\x5b\xef\xb5\x49\xf1\xe4\xb8\xbf"
+ "\xbe\x0b\x19\xae\x73\x16\x17\x72\x7b\x9d\xb3\xc0\xb3\x3f\x7f\x60"
+ "\x71\xc7\x76\xa0\x4e\xa9\x6d\x6b\x41\x1d\xc1\xde\xc7\xb3\x17\x69"
+ "\x30\x26\xe7\xe7\x87\x5a\x70\x7e\x9e\xc5\x3c\xc1\xba\xf0\xd8\x13"
+ "\xcd\xec\x7f\xc0\xad\x02\x7f\x39\x96\x2e\x58\xbb\x63\xa6\x03\xbf"
+ "\x71\xad\xed\x23\xc5\x2f\x48\xd5\xed\xa8\xaf\x3b\x6e\xc3\xf8\xdf"
+ "\x1d\x99\x1d\x61\x52\xec\x6f\x16\xeb\x9b\xb7\x27\xc9\xab\x5f\xc6"
+ "\xc9\x24\x02\xfd\x05\xe0\xf9\x3a\x46\x03\x55\x40\x24\xfa\x7a\x46"
+ "\xbf\x95\x55\xab\x30\x26\x4b\xc7\xc1\xdf\xdf\xc4\xce\x28\xdb\xaa"
+ "\x26\xb7\xe3\x3e\xac\xb6\xd6\x54\xe6\x8f\x49\x19\x9d\xe2\xa0\xf8"
+ "\x1e\xb3\x27\x82\x03\x22\xf1\x19\x8b\x75\x80\x65\xfa\xed\xb7\xb8"
+ "\xa3\x58\xb4\x4d\xdb\x60\xec\x73\x33\xf0\x8a\xd9\xee\xf0\xff\x4d"
+ "\xa7\x88\xfd\x22\x8f\x41\xcb\x7d\xef\x8b\xfb\xb1\x87\x71\x1f\x1b"
+ "\x40\x33\xe6\xf3\xc0\xbe\x44\x7b\x37\xc6\x6b\xb6\xbf\xc2\xfc\x60"
+ "\x1b\x77\x15\x8a\x34\x28\x2c\xe0\xf5\x0a\x9d\x9f\x22\x67\x75\xc4"
+ "\xfa\x0d\xae\x6e\xf6\x48\x71\x1c\x31\xac\x23\xd3\x9e\x2a\xf9\xe6"
+ "\xe0\xf6\x14\xf7\x8f\xcd\x79\x61\x3f\x29\xda\xcf\x9b\xc4\x6f\x6f"
+ "\x1a\x82\x6f\xef\x14\xcb\xd4\x73\x1f\xe1\x1d\x71\x50\xae\xbe\x23"
+ "\xf3\xa2\x42\x1a\xcf\x88\x67\x88\x26\xf1\x71\xd6\xc5\x70\xd7\x78"
+ "\x86\xd3\xd0\xe3\xdc\xdd\xb2\x65\x49\xda\xf8\x45\xaf\x1a\x16\x24"
+ "\xbd\xa0\xd7\x26\x24\x26\x2e\x4b\xd4\xa2\x93\x26\xf7\xfe\xc3\xe3"
+ "\x18\x5d\x8c\x10\xe3\x13\x96\xb9\xe2\x13\x5e\x4c\x71\x8f\xe9\x69"
+ "\x26\x17\x53\x87\x66\xee\xe2\x62\x91\xb7\x72\x0a\xe5\x42\x39\x5c"
+ "\x15\x70\x55\xc1\x55\x8d\x73\x19\xf3\xed\x24\x0a\x74\x3d\xdb\x67"
+ "\xe2\xf2\x39\x71\x71\x16\xee\x31\x6a\x26\x17\xcf\x97\x08\x0a\x1c"
+ "\x07\x61\xdc\x70\xe6\x2b\xf4\x2d\x78\x1f\xae\x2a\xb8\xaa\xe1\x62"
+ "\xef\x09\x1f\xb2\xf3\xf2\xe5\xee\xcf\xf8\xfe\x91\x35\x3b\x30\x0f"
+ "\x5d\x83\x4b\xf6\x90\xef\x77\x3c\x5f\x8f\x3a\xc8\x69\x66\xbb\x94"
+ "\x8f\xad\xed\x87\xac\x21\xda\x3e\xf2\x05\xd0\xcc\x93\x65\x62\x3e"
+ "\xb6\xd7\x46\x6a\x0f\xc6\x1a\x80\xfc\x52\x3e\x05\xcd\xec\x98\x22"
+ "\xe6\x63\xba\x42\xc8\x94\xf7\xf5\xdd\x40\x9a\x59\x11\x2e\xe6\x53"
+ "\xbb\x97\xe7\x96\x67\x98\x90\x79\x6c\x2b\xe6\x11\xd6\x28\xc2\xb8"
+ "\xed\x74\xb1\x08\xf2\xf7\xe9\xa3\x75\x70\x7c\xea\x8a\xea\xc9\x27"
+ "\xc3\x0b\x8b\x12\x1e\x5c\xb4\x34\x19\x23\x4d\x25\x2d\x5b\x9e\x84"
+ "\xbf\x4b\x17\xbc\xcc\x7e\x96\xcd\x5f\xf8\x02\xff\x27\x69\x71\x04"
+ "\xfe\xb3\x18\xf0\x86\xbf\xf1\xcb\x0d\xf8\xf3\xc2\x32\xbc\x4d\xd1"
+ "\x4f\x5a\xfe\x02\xfe\xf4\x3c\x07\xaa\xeb\xc8\xec\xb2\x00\x36\x1a"
+ "\xb9\x9c\xed\x82\x31\xd2\xc9\x70\x66\xc7\xae\x31\x93\xfd\x3a\x07"
+ "\x91\xe6\xb5\x3c\x7d\x8e\x38\x64\xe8\x73\x24\x74\x8d\xe1\x85\x50"
+ "\xc7\xa2\x04\xd0\x19\x49\x1d\x99\x8e\x08\x33\x79\x89\x88\xb2\xb1"
+ "\x94\xf9\x39\xcd\xec\xca\x10\xf7\x76\x2a\x04\xe3\xae\xd9\xe8\xbf"
+ "\x1f\xee\x59\x9c\x6d\xb8\xcf\x80\xfb\x62\xb8\xc7\xf8\xda\x61\x70"
+ "\x3f\x0f\xe7\xa4\xe0\x5e\x03\xf7\xe1\x82\x71\xbb\x1e\xcf\x18\xc3"
+ "\xbd\x16\xee\x27\x40\xf9\x85\x52\xbf\xe8\xdb\x56\x76\x94\x4b\xb1"
+ "\xbf\x79\x9c\x6f\x47\x55\x77\x9c\x6f\x8c\xe7\x94\xa6\x9e\xc7\xf4"
+ "\x2f\xb3\x41\x1c\x2d\x01\x9a\x71\xc9\x90\xa7\x45\xd2\x97\x7c\xbe"
+ "\xc3\x61\x93\xfc\xa7\xf0\xf9\x0c\xa7\xc2\x2d\x5e\x3a\xde\x87\x49"
+ "\xf1\xd2\x71\xbe\x8b\xc5\x6b\x84\x5f\x9a\x89\xfe\x64\x69\x59\x9f"
+ "\x73\x79\x2c\xce\xa7\x73\x25\xfa\xe6\xb5\xa6\xc7\xcb\xee\x28\xc1"
+ "\x39\x34\xb8\xe7\xbe\x25\xe9\x19\xe2\x64\xf1\xa1\x24\xbf\x73\xee"
+ "\xbe\x24\xfa\x3c\x0f\x75\x08\x6c\x06\x16\xef\x6a\xf1\xb2\x50\xc7"
+ "\x82\x04\x6e\x07\x3a\x8f\x70\xf9\x55\x19\xcf\xed\x05\xe7\x3e\xfa"
+ "\x14\x8f\x89\x62\x26\xc2\x0c\xee\x7b\x6a\xf1\x32\x0a\xef\x86\xa6"
+ "\x2c\x48\x60\x69\x90\x6f\x2d\xd8\x6a\x62\xfd\xb6\x9b\xc2\xf1\x8c"
+ "\xab\x20\xfa\xc8\x70\x96\x3d\x37\x2e\x03\xbf\xa3\x64\x76\xc8\x21"
+ "\xa2\xc2\x78\x9b\x58\xb7\x12\x37\xbf\x78\x05\x90\x86\x7b\x48\xcf"
+ "\x3d\x45\x54\xe8\x07\x58\xac\x4b\x19\x8f\x1f\x26\x44\x49\xbe\xa6"
+ "\xcc\x90\xd6\xb3\x3d\x4f\xfd\x9a\xa1\xf2\xce\x17\x26\xcd\x9a\x0e"
+ "\xff\x4d\x12\x43\x56\xbb\x63\x33\xfc\xdc\x88\x0f\x22\xcf\xfd\xe9"
+ "\xa9\x17\x79\x5c\x52\x01\xc6\xff\x4e\x36\x16\x12\x70\x0c\xdc\x11"
+ "\x5b\xc4\xf7\xa0\x0a\x07\xd0\xef\xae\x90\x89\xf6\x24\x9e\x9b\x16"
+ "\xf0\x1c\x3b\xd8\x39\x95\xfa\xb7\x56\xa3\x8f\x67\x19\xd0\x58\x78"
+ "\x1b\x9f\x89\x3e\xbc\xe4\xcc\xc7\x95\x93\x68\xd8\x19\x61\xb0\x51"
+ "\xf0\x0c\x6a\xab\x4c\x56\x8b\x76\x07\xce\x27\x09\x99\xc2\x6c\xc4"
+ "\x2d\xf0\x18\x7d\x88\xd8\xe8\x88\x5d\x51\x34\x68\xb7\x0a\x71\x8c"
+ "\xb6\xae\x49\x8d\x34\xa3\xe8\x33\xe0\x31\xb8\x7e\xc3\x63\xcf\x3c"
+ "\x63\x91\xca\x84\x7b\x15\xd8\x50\x49\xf0\xab\xee\xc8\xa4\x33\xdc"
+ "\x62\xf2\x89\x67\xa2\xe9\x22\xf4\xfd\x86\x65\x33\xdb\x59\x26\x7b"
+ "\x8f\xdb\x20\x34\xc9\x4c\xd4\x53\x78\x5f\xc4\x58\xa3\x39\x46\xf1"
+ "\x7f\xb0\x7f\xee\xb7\xf6\x28\xe3\xb0\x34\x57\xca\x31\x0d\x3a\x4f"
+ "\x4e\x1e\x83\xeb\x37\x90\xbf\xd2\x4c\x7e\xca\xf2\xaf\x95\xb3\x73"
+ "\x92\xad\x01\x1a\x3c\xef\x4e\x1b\xa4\xf4\x40\x59\x14\xd0\x14\x63"
+ "\xba\xf1\xbe\x7f\x6e\x44\xe5\x4c\xb8\xb7\x49\x73\x2c\x6c\xce\x25"
+ "\x0b\xf7\x75\x75\xdf\xc7\xc2\x7d\x98\x74\x0f\xff\x6b\x25\x59\x81"
+ "\x73\x12\xe7\xd2\x63\x37\xe3\xb8\xf3\x05\x0d\xd8\x85\x60\xdf\xc0"
+ "\x73\xe0\x7f\xce\x0c\xfe\x6e\xab\xf5\x5c\x66\x9e\xc1\x36\x82\x46"
+ "\xd8\x40\xfe\xc1\x33\xb0\xff\x16\x37\x89\xe5\xe8\xcd\xf2\x9c\x7a"
+ "\xa9\x6d\x42\x66\x40\xa8\x90\xbd\x5b\xc7\xda\x28\x93\x6d\x85\xff"
+ "\x27\x59\x83\x76\xe1\x3b\xc0\x7f\x47\x31\xcb\x97\x7c\xba\x34\xb7"
+ "\x53\x3d\xdb\x04\x16\x7c\xd5\xc2\x4e\xa4\x1f\xdb\x93\x9d\xb7\x4a"
+ "\x3d\x0b\xed\x4e\xf4\x03\xc2\x62\xa2\xa1\x7f\x4b\x07\x19\xc6\x62"
+ "\x0a\x64\x9f\xb0\x30\x5f\xfa\x2b\x74\x2a\xc9\xb7\x25\x35\xbe\x6b"
+ "\xa3\xf2\x65\x36\xf4\x77\xc9\x62\x87\x74\xe8\x42\x98\x8f\x4b\xd1"
+ "\xb7\xe5\x96\x64\x12\x56\x2c\x70\xdf\x96\xcc\x47\xc8\x30\x18\xa7"
+ "\x24\xf7\xed\xdf\x92\x66\xee\x98\x21\xf9\xb7\xa4\x17\x9c\x76\xf8"
+ "\x7f\x02\xd0\x03\xe3\xbf\xeb\xd8\xbd\xcb\xdf\x94\xa2\x4f\x7f\x97"
+ "\x72\x90\x7b\x72\xee\xef\x72\x50\xfa\x42\x26\x63\xf3\xb2\x1d\x59"
+ "\x32\x90\x7f\xaf\xb1\xb8\x80\x6e\x69\xfb\xa0\x25\xa2\x7f\x03\xaa"
+ "\x17\xd3\x1a\xcd\x24\xbb\x58\x1c\x97\x5a\x71\x8c\xbf\x89\xcd\x8d"
+ "\x09\x6d\xb4\x4b\xbf\xb9\x2f\x99\xd3\x1e\x12\x58\xde\x8e\xfe\x29"
+ "\xb2\xe4\x1a\xb3\x4c\xce\x7c\x73\xb3\xb1\xa4\x4c\xae\xe9\xd9\xaf"
+ "\x9f\x7f\x61\x59\x7c\xc2\xfc\x97\x96\x18\xb4\x4f\xcd\x7e\x8c\x05"
+ "\x4a\x9c\xa4\x5d\x94\x94\xc0\x54\x92\xf6\xa9\xe9\x8f\x46\x47\xcf"
+ "\x9e\xff\xeb\xd9\x8f\xcc\x9e\xf3\xeb\x87\xf8\x89\xc5\xd9\x89\x2b"
+ "\x31\xd8\x66\xd2\x32\x2d\xbe\xf4\xbc\x18\x4d\x7c\x55\x42\xe2\xb2"
+ "\x9e\xf2\x20\x8c\xcd\x73\xc9\xd9\x9c\xae\x0d\xff\x67\x73\x69\x32"
+ "\xf9\x4e\x69\x8e\x8b\xc9\x3e\x99\x7c\x1b\xd2\x96\xc5\x1a\xcf\x92"
+ "\x4f\x42\xfb\x4a\x8c\xf3\x8e\x7a\x47\x81\x7d\x1a\xf5\x0f\xb4\xc5"
+ "\xec\xee\x9b\x8b\xbf\x1b\xa0\x90\xe3\x7b\x62\x5f\x16\xd3\xc6\xd0"
+ "\xb1\x63\xd3\x99\x7f\xad\xac\x80\x30\x69\xde\x1b\xd3\xa4\x3a\x34"
+ "\x63\x9e\x2c\xf9\xb3\xdd\xf1\x84\xb3\x02\xa6\xba\xe2\x50\xb2\x3f"
+ "\x0f\x1a\x11\x82\xe6\x4c\x20\xd8\x2a\xc3\xe0\x1a\x8e\xd7\x8c\x6e"
+ "\xf9\x9e\x4c\x1b\x71\xcc\x16\x2a\x03\x1d\x9c\x12\xc0\xe3\x58\x65"
+ "\x35\xb0\xd8\x0b\xd1\x4e\x47\xc0\x7c\xa7\x1c\x7e\x03\xe8\x7c\xa7"
+ "\x82\x8d\x13\x69\x32\x6d\x60\x67\xed\x93\x69\x3d\xc6\x6b\x03\x1c"
+ "\x1b\xa3\x1d\x69\xc6\x68\x27\x75\xcc\x07\xfb\x1d\x7e\x4f\xe0\x99"
+ "\xf1\x68\xe7\x09\xca\x62\xd6\xe0\xd9\x7a\xee\x67\xb0\x1a\xf7\x50"
+ "\x3e\x07\x18\x2e\x69\xe7\x31\x89\xa3\x57\x7e\x7f\x6c\xfe\x4a\x33"
+ "\x8f\x49\x7c\x86\xc7\xf1\xe6\xb1\xce\x49\x1a\x94\x73\x60\xbe\x33"
+ "\x40\x1b\xed\xec\xa2\xec\xdc\x6b\x96\x42\xdb\x5f\x9c\xe1\x3e\xe7"
+ "\x2f\xb2\xbe\x98\x4a\xf3\xb2\xd6\xd1\xac\x2f\x55\x34\x6f\xbd\x82"
+ "\x1a\x77\xe3\x7c\xa7\x8c\x66\x35\x35\xc1\x3d\xa4\x1f\xdb\x41\xf3"
+ "\x8c\x0a\x9a\xd5\x9c\x0a\xbf\x70\x7f\x7c\x26\xcd\xcb\x86\xfb\xaa"
+ "\x30\x78\x2f\x83\x66\xed\xc5\xf7\x08\xcd\xfa\x50\x01\xbf\x70\xff"
+ "\xa1\x03\xf2\xc1\xfd\x47\x36\xf8\x85\xfb\x7d\x6d\xad\x32\x45\x0b"
+ "\xbc\x03\x69\x96\x70\xfe\xad\xef\xc2\xd9\xb7\xb2\xce\x84\xf3\x6f"
+ "\x9c\x0d\xe7\xdf\xb0\x85\xf3\x6f\x74\x84\xf3\x6f\xec\x87\xf7\xb2"
+ "\x8c\x34\xeb\xe3\xd9\x90\x0f\xea\x5a\xbd\x0f\x7e\xe1\xfe\x93\x29"
+ "\x90\x0f\xee\x3f\xdd\x0a\xbf\x70\x5f\x0b\x75\xc9\x86\xfb\xba\x75"
+ "\x90\x3f\x97\x66\x99\xec\x90\x4f\x45\xb3\x0e\x2e\x86\x5f\xb8\x3f"
+ "\x64\x86\x7c\x70\xdf\x00\xe5\x18\xe1\xfe\x70\x35\xe4\x87\xfb\x4e"
+ "\xac\x4f\x21\xcd\xea\xc2\x72\x01\x9b\x4e\xcc\x0f\xf7\x14\xca\x33"
+ "\xaa\x69\x0e\xa9\x84\xdf\x42\x9a\x23\x8f\x87\xfc\x70\xaf\x80\xb6"
+ "\x66\x6d\xa2\x39\x81\x15\x90\x2f\x8c\xe6\x0c\x87\xf4\xf5\x70\x1f"
+ "\xa4\x86\x7c\x70\x3f\x02\xf3\xc3\xbd\x4a\x0f\xf9\xe1\x3e\x04\x69"
+ "\x54\x44\x73\xd4\x49\x90\x4f\x43\x73\x46\x37\xc0\x2f\xdc\xdf\x88"
+ "\xf5\x87\xfb\x9b\x37\xc1\x2f\xdc\x8f\x01\x5a\x65\xc3\x7d\x38\xd4"
+ "\x2f\xab\x98\xe6\x8c\xc7\xf2\xc3\x69\xce\x6d\x48\x1f\xb8\xbf\x23"
+ "\x03\xf2\xc1\xfd\x9d\x40\x0f\x23\xdc\xeb\x66\x40\xfe\xf0\x3e\xf9"
+ "\x99\xf3\x63\x2d\x5d\x33\x8c\xd0\x9c\x9f\x6c\xa2\x6b\x86\xc3\xef"
+ "\x03\xd3\xe8\x9a\x40\x1d\xcd\x89\xdc\x0a\xe9\xf0\xfb\xd3\x70\xb8"
+ "\x9f\x24\xde\xc3\xef\x4f\x6d\x70\x1f\x21\xde\xc3\xef\xff\xa9\x81"
+ "\xfb\x29\xe2\x3d\xfc\x3e\x38\x1b\xee\x23\x69\xce\xbf\x4d\x82\x7b"
+ "\xf8\x7d\xb0\x0a\xee\xa7\x8a\xf7\xf0\x3b\xd5\x0a\xbf\x0e\xeb\xb8"
+ "\x98\x19\xd6\xe0\xb9\xc4\x1a\x9c\x63\x40\x5d\xee\xcc\xcf\xca\x10"
+ "\x42\xd6\x63\x8c\xca\x61\xe9\xe7\xc9\xf0\x56\xd9\xf0\xcd\x28\x27"
+ "\x4c\xa9\x66\x16\xdf\x4f\xf4\x5b\x39\xac\x59\x36\x0c\xe3\x45\x62"
+ "\x8c\x06\x39\xb4\xbd\x92\x66\x06\xb6\x43\x9b\xa7\xd2\xcc\x91\xcd"
+ "\xf0\x0b\xf7\xa3\x0e\x41\x9b\xe1\xfe\xa7\x39\xf0\x0b\xf7\xcf\x3c"
+ "\x0a\x6d\x9f\xda\x91\x35\x5c\x65\x96\x29\xd8\xba\x2b\xfd\xd3\x53"
+ "\x71\xa1\x8e\x74\x1a\xed\x00\x7d\xb0\x79\x63\x44\xa8\x23\x8e\xd0"
+ "\xbc\x0d\xea\x50\x8c\xc3\xb1\x25\xc6\x48\x43\xe6\xb2\x3a\x61\xac"
+ "\x1d\xda\x35\x41\xce\xbf\x3d\x92\x36\xcb\x86\xff\x0c\x63\x42\xd0"
+ "\x90\xa5\xde\x9e\x3f\xcd\x9e\x8f\xdd\x18\xc5\x9f\xab\x89\xeb\xf9"
+ "\x6f\xf0\xf9\xca\x50\xf4\xad\x3e\xfe\x91\x28\xb3\x6c\x78\x29\xe6"
+ "\x31\xcb\x86\x41\x1d\x03\x88\xc9\x66\x11\xdb\x38\x1c\xf3\xfd\x11"
+ "\xdf\xf3\x36\x6f\x23\xe4\x16\xe8\xf3\x40\x6e\xe1\x38\x16\xf4\x97"
+ "\x5c\x9b\x36\xa1\xa2\x59\x16\x64\xd8\xc2\xe6\x27\x36\x2a\xb9\x3c"
+ "\x53\x3e\xd0\x95\xb3\x7b\x9e\x76\x55\x28\x94\x17\xf4\x4a\xba\x9d"
+ "\xda\xaa\xd2\x1e\x05\x59\xc8\xd2\x8b\xd8\x99\x1f\xfe\xff\x3a\xb6"
+ "\x97\x93\xff\x6f\x60\xf3\xc6\x50\x16\xbe\xeb\x3e\x6e\x70\x66\x45"
+ "\x38\x84\x90\x8d\x6a\xb6\x16\x2e\x53\xfe\x6c\xb7\x60\x96\x87\x26"
+ "\x91\x40\xed\xaa\x3d\x50\xbe\x32\xc3\x63\x8c\xd9\x9d\x97\x3d\x4b"
+ "\xf8\x00\xf2\xbe\x89\xf3\x41\x59\xca\xc2\xee\x98\xc8\xd0\x86\x0d"
+ "\xa8\xbb\xe4\x24\x0a\xf5\x29\xb3\x59\x65\x41\x6a\x3c\x9d\xe4\x50"
+ "\xe5\x58\x1d\xb9\x73\xac\xce\xdc\x8d\x4a\x9a\xbf\x51\x1d\xe2\x90"
+ "\x71\x5f\xbe\xb2\xa0\xe9\xf7\xda\xd1\x46\xfc\x04\xdb\xe7\x14\x86"
+ "\x3d\x18\x31\x39\x85\xc8\xab\x12\xbf\xc4\x77\x1f\xa2\x59\x0f\x17"
+ "\x99\xda\x1a\x49\x55\x22\x2b\x6b\x2a\xcd\x7a\xdc\x22\x0c\x9b\x1e"
+ "\x56\x82\xb6\x76\x0a\xce\x95\x1d\xc2\xf7\xf6\x02\x9d\x41\x0f\x04"
+ "\x85\x4b\x75\x41\x1d\x90\x07\xb4\x43\x3b\x18\xfd\x57\xcc\x77\x3a"
+ "\xd1\x1f\x9c\xd1\x0c\x74\xe0\x3a\x32\x08\xfd\x89\x11\xfe\xdd\xa0"
+ "\x39\xc2\x88\xdd\x33\xea\xe6\xe1\xba\x9f\x1a\xfd\x6b\xd9\xd8\x99"
+ "\x77\x8c\x56\x2c\xa0\xde\xe6\x79\xdd\x79\xb7\xe4\x05\xc3\xfc\x55"
+ "\x86\x65\x89\x49\xf3\x97\x1b\x1e\xd4\xc2\xe0\x4f\xbb\x6c\xa1\x76"
+ "\x49\xc2\x92\x65\x89\x2b\x7b\xf9\xf4\x81\x7a\xed\x04\x6c\x30\x99"
+ "\x7c\x00\x6c\x70\x36\x07\x2f\x1b\xb9\x0e\x79\xbd\xf9\x0f\x3c\x66"
+ "\x06\xe4\x01\xfd\xff\x12\x9b\x4b\x17\x8a\x36\xea\x68\x71\x8c\x31"
+ "\x1b\xfd\x76\x2c\xc7\x98\x0c\x56\x62\x22\xed\x3c\x8e\x2e\x8b\x91"
+ "\x07\x63\x82\xe4\xd5\xb4\x2a\xb9\x1d\x31\xae\xa4\x79\x39\x1a\xc0"
+ "\x78\xfd\xc5\xbc\xb9\xfa\x66\xd9\x48\xfd\xc5\xbc\x1c\xa5\x14\xe3"
+ "\xc8\x99\x9b\xa3\x17\x54\x05\x19\x18\xe3\xa8\x8b\x6a\x48\x2d\xd0"
+ "\xb2\xd3\xb8\x7b\x0a\xc8\xf8\x88\x2d\x99\xb4\xc2\x09\x63\x24\xe6"
+ "\x73\xe6\x4f\x4f\x45\x39\xa9\x4e\xe1\xcc\x24\x4a\xf8\x0d\xa1\x21"
+ "\x85\xe5\x5d\xaa\x0d\x04\x9f\x63\x6c\x23\x67\x97\x8e\xa4\x35\x50"
+ "\xe1\x3f\xf4\x80\x9b\x4c\x30\xb2\x31\x96\xab\xfe\x34\x81\xf4\x11"
+ "\x42\x7e\x4e\x61\xeb\x0c\x22\xc7\xbc\x60\x9f\x91\x79\xf0\x7f\xea"
+ "\x02\x12\x0c\xf9\x42\x53\x0f\x40\x7a\x87\x6e\x84\x23\x5d\xa7\xec"
+ "\x4c\xd7\x8d\xe8\xa2\x3a\x95\xa9\xc5\x4e\xba\xee\x7c\x6a\xd6\x3d"
+ "\x56\xa2\xd8\x0c\x76\xdc\x16\x01\xfa\x57\x71\x8c\xc1\xf9\x9a\x6e"
+ "\x98\xe3\x35\x9d\xa2\xab\x4b\xa7\x74\xac\xd0\x29\x3a\x57\xe8\x86"
+ "\x75\x75\xe8\x94\xa6\x78\x2b\xf9\xc4\xfa\x67\x52\xd7\x62\x61\xf3"
+ "\xb4\x5d\xc1\x85\x95\x5d\xc1\x39\xc5\xaa\x16\x12\x36\xd9\x00\x76"
+ "\x1c\xd8\xb7\x6f\x80\x6d\x0f\x98\x50\x39\xb6\x3d\x15\x45\xf3\x0a"
+ "\xe3\x80\xbe\x4f\x4c\x9f\x48\xbf\x77\x66\xa9\xc3\xb4\x8f\x83\x2c"
+ "\x5a\xa3\xd0\x40\x1a\xe0\x27\x1c\x74\x8b\x06\xe4\x9b\x02\x64\x20"
+ "\xe8\x4a\xce\x07\xd0\x4b\x21\xd5\x38\x4f\x80\x79\x79\xbe\x1b\xc1"
+ "\xa6\xc2\xdf\x51\x7a\x16\x73\x35\x2b\x28\x75\x0b\xb3\x21\x46\x66"
+ "\x48\x36\xc4\x3e\x45\xdf\xbe\x41\x20\xcf\xd6\xee\x31\xb7\x00\xf2"
+ "\x24\x2f\xcb\xe0\xd5\xaf\x2f\x7e\x3b\x3f\xab\xb4\x50\xe8\xf6\xd7"
+ "\x0c\xf2\x70\x64\x2d\xf4\x9f\x0c\xf6\x2c\x77\x83\x3a\xed\x2c\x09"
+ "\xc0\x67\xe5\x17\xec\x72\xbc\xd7\x26\xca\xa8\xc9\x66\x27\x85\xb8"
+ "\x5e\x11\x1e\x63\x2c\xbf\x60\x95\x23\x5e\xea\x20\x0d\xde\x3d\x5e"
+ "\x78\x41\x2c\xb7\x68\x63\x44\xfa\x2b\x84\xc5\x2d\xc1\xd8\x47\x88"
+ "\xa3\xc2\x34\x18\x33\x62\x9c\xa6\xc4\x00\xe8\xc7\xaa\xdb\xe0\x7f"
+ "\x25\xe6\xa3\xaa\x0d\x6a\x01\xca\x00\x2c\xa5\xd0\xe0\x1c\xbb\x90"
+ "\x97\x93\x01\x98\x8a\xa2\xe3\x62\x2c\xc2\xe6\x8d\x9a\x8e\x2c\x55"
+ "\x0a\xd0\xa3\x50\x9a\x83\xa8\x2b\x73\x10\xf4\xb7\x45\x1f\x75\x90"
+ "\xfd\x49\xe7\xd1\x27\x6f\x80\x35\x68\x77\xa4\x35\xb8\x40\x6f\x0d"
+ "\x2e\x8c\x13\xf2\x0a\xca\xe0\xda\x61\x48\x24\xaa\x53\xb2\xe0\xa9"
+ "\xdd\xfe\x62\xcf\x5e\x23\xfe\x62\xc1\x2e\x63\xf6\x19\x60\x07\xed"
+ "\x2d\x68\xaf\x05\xe3\x8f\xa0\x1d\x86\x32\xb7\x23\x2b\x58\x2f\xd9"
+ "\x51\x28\x47\x9c\xd9\xbb\xa7\xc1\x15\x05\xe9\x19\x66\x99\x76\xab"
+ "\x24\x63\x40\xaf\x68\x85\x9c\x5f\x64\x74\xe0\x99\xa8\x2e\xfd\xc3"
+ "\x98\x17\xe8\x36\x0b\xbe\x15\xe0\xec\xd2\x4f\x85\xeb\x21\xb8\x7e"
+ "\xee\xcc\xcb\xb1\xc2\xa5\x76\xe6\x15\x46\x39\xf3\xe6\x4e\x80\x4b"
+ "\x07\xd7\x24\xb8\x22\xe0\x9a\x02\x57\x24\xcd\x9b\x3b\x15\x7e\xf1"
+ "\xf9\x34\xb8\x66\xc0\x35\x13\xae\x59\x70\xcd\x76\x6e\xde\xa8\x15"
+ "\x00\x9f\x70\xe1\x6f\xb8\x33\xaf\x20\xa5\x6f\x9f\x25\xad\x3c\xce"
+ "\x42\xe0\x31\x1a\x8a\x71\x78\x53\xcf\xa3\x2f\x48\xcb\x7e\x9d\x6d"
+ "\x70\xfe\xe6\x65\x21\x5e\xfd\x85\x62\xf9\xd0\xb7\xba\x06\x59\x9e"
+ "\xf7\xb9\x13\xcd\x46\x9d\x23\x3c\xa6\x1e\x7d\x9f\x43\x7f\x96\xd5"
+ "\xc5\xb5\x90\x68\x2b\x49\xaf\x69\xe9\x24\xe9\xf1\xd4\xc9\xc6\xd1"
+ "\xa9\x78\x0e\x65\x99\x0d\x31\xec\xa4\xb1\xda\xae\xdc\x1c\x8d\x53"
+ "\x55\x10\x45\x55\x05\x29\xcc\xbf\x24\xc8\x1e\x8c\x6b\xd6\x3d\x86"
+ "\x44\x4c\xc1\x38\xb2\xb6\xed\x3c\x79\x2d\x9e\x0a\xb5\xc0\x4d\xf4"
+ "\x21\x19\x2a\x23\x7f\x44\x7c\x49\xe3\xc8\x5f\x35\xd1\x0c\xc0\x4a"
+ "\x90\x13\xe8\x26\xe0\xf8\x11\x70\x85\x63\x49\x09\x5b\xa0\xcb\xd4"
+ "\x52\x2c\x28\x3a\x2c\x24\x0c\x9e\x29\x30\x56\x54\x31\x8c\x1f\x8b"
+ "\x93\xc9\x84\x62\x78\xc6\xe2\x7a\x42\xbd\x9f\x34\x84\x52\xe1\x65"
+ "\x1d\x29\x79\x89\x28\x83\x4f\xf3\x58\xb1\x4e\xa0\x7d\x77\xbc\x84"
+ "\xdc\xb9\xfa\x27\x4e\x6b\xc9\x7e\xdd\x51\xd0\x49\xe5\x20\xbb\xe7"
+ "\xea\xbb\x40\x6e\x03\x2d\x9d\x83\xa3\x65\x68\xcd\xe5\xa2\x65\x57"
+ "\x78\x8c\x81\xd3\x33\x8e\x20\xcd\x7a\xd2\x13\x69\xbc\xaa\x05\xe8"
+ "\x09\x74\x35\x35\x38\x49\x88\x8c\x2c\x90\xe8\xf9\x26\xd0\x13\x68"
+ "\xaa\x41\x9a\x02\x3d\x18\x4d\xa9\x48\xd3\x12\x37\x9a\x82\x6c\x62"
+ "\xbe\x38\x91\xa6\x02\xd0\xb4\xc4\x0b\x4d\xbb\xc7\xe2\x40\xd3\xb7"
+ "\x7c\xa2\x69\xd9\x25\xd0\x74\x94\xd6\x1b\x4d\x1d\xa8\x2f\xf3\xe7"
+ "\xc6\x51\x90\x77\x26\xc7\x27\xcc\xaf\x2c\xd8\x3a\x3b\xc0\x66\x2b"
+ "\x13\x54\x39\x7a\xa0\x89\x0a\xd7\xf4\x31\x36\x19\xf3\x01\x57\x46"
+ "\x2f\x3a\xf3\x0b\xab\x30\x0d\xe4\x96\xfe\x5e\xf4\xa3\x67\x30\x93"
+ "\x12\x39\xad\xa8\xbb\x60\x03\xfd\x12\xf6\x74\x27\xda\x92\xf9\x85"
+ "\x54\x80\xe1\x3f\xca\x90\xe7\x26\x12\x45\x27\xc8\x09\x43\x32\xb9"
+ "\xb5\x10\x64\x5d\x27\xc8\xce\x53\xb2\x51\xb6\xe9\x06\x81\xc2\x95"
+ "\x8e\xfe\x51\x85\xe0\x82\x32\x90\xd5\x8c\xbf\xc8\x33\x5c\x2b\xac"
+ "\x7d\xee\x43\x28\x6f\xf4\xf1\x4f\xe3\x1c\x24\x5d\xdf\x9b\xbf\x42"
+ "\x7a\xac\xd6\x99\x3b\x70\x3f\xc1\xf8\x88\xa9\x16\xe4\x6b\x39\x31"
+ "\xb5\xb8\xfa\x89\xb0\x82\xcb\x60\xe4\x05\xf6\x0b\xec\x23\x05\x6e"
+ "\xb2\x17\xe4\xba\x7a\x8b\x18\x2f\xc4\x09\xb2\x17\xf2\x2a\xd0\xaf"
+ "\x2a\xc6\x11\xe9\xb3\x7f\xbc\x06\xfd\x63\x15\x8b\xe5\xa4\x01\x7a"
+ "\x94\x77\x76\x70\x1e\x22\xcf\x4c\x8e\x6a\xc6\xbf\x42\x51\xd6\x73"
+ "\xba\x17\xbc\x46\x69\x2c\x71\x42\xdd\x85\xfc\xc2\x72\xda\xa1\x1f"
+ "\x81\xf3\x8a\x30\xd6\x8d\x08\x8d\x07\xbb\xe1\x7b\xd0\x05\x4b\x01"
+ "\x5f\x67\xc8\x84\xb7\x96\x82\x2d\xd0\x81\x31\xd9\xa0\x3e\x2b\x79"
+ "\x2c\x5b\x21\x2b\x24\x05\x9e\x31\x7f\xaf\x82\xe4\xef\xf5\x9c\x0e"
+ "\xc7\xe8\xae\xb9\x9d\x65\x3a\xb9\xeb\x9b\x1f\x66\x38\x95\x6d\x16"
+ "\x76\x36\x5e\x76\xc3\xdb\x7c\x2d\xba\x4c\x8f\x74\x6d\x93\xdd\x60"
+ "\xe6\xf3\xb9\x6f\x2f\x36\xa4\x91\xe1\xa7\x64\x37\xbc\x0e\x76\x55"
+ "\x9c\x01\xe3\x72\x4b\xcf\xd2\x63\x91\x0e\x53\x26\x67\x90\x0c\x67"
+ "\xf6\x69\xa5\x29\xe5\x34\xfa\x4f\x1c\xa4\xec\xbd\x81\xf9\x8f\x74"
+ "\x1a\x3f\x5c\x07\x74\x8a\x12\x72\x3e\xcc\x05\x99\x12\x41\x5f\x86"
+ "\xb6\xbe\x04\x6d\x3d\x05\x74\x3d\x05\x6d\x5d\x21\xb6\x55\x8c\x53"
+ "\x27\x00\xfd\xe1\x59\xdf\xba\x4f\x6a\xeb\xcb\xe8\x2b\x7d\x5b\xe4"
+ "\xea\xd3\xe4\x06\x7a\x3b\xae\xcf\xb2\xb3\x8b\x1d\x26\xc7\x51\x82"
+ "\xdf\x65\xba\x39\x77\x6e\xe4\x1c\xc0\x23\xd2\x1c\xec\x81\x52\x1a"
+ "\x92\x53\x28\xf1\x01\xeb\x43\xbb\xf4\x23\x4a\x96\x42\x7d\x90\xf6"
+ "\x67\xc8\x24\xec\xcf\x40\xfb\x09\x25\x48\x7f\xcf\x58\xd1\x61\x8c"
+ "\x07\xc3\x80\x07\x4b\x45\x1e\x64\x8b\x3c\x00\x3b\x11\xf4\xb4\x12"
+ "\xf4\xaf\xa6\x24\x93\xf3\x60\x70\x34\x0a\xab\x1f\xe2\xfe\xba\xcf"
+ "\x7b\x7f\xd5\x04\x77\xf2\xb1\xa1\x0c\xfd\xce\xd2\x90\x8d\x01\x42"
+ "\x17\xf4\xdb\x7c\xb1\xdf\x52\xfd\xcf\xa5\x3e\xdb\x2a\xbb\x71\xbb"
+ "\x6f\x7d\xf6\xa6\xcd\xff\x4b\xfb\x6c\xd8\xe5\xed\xb3\x37\x2f\xf0"
+ "\xec\xb3\x37\x6f\xf2\xec\xb3\x37\xff\xd2\xd5\x67\xc5\x67\x43\xd2"
+ "\x67\x6f\x8e\xbb\x3a\x7d\xf6\xe6\xb8\x3e\xfa\xec\x56\x1f\xfa\xac"
+ "\xc6\x4b\x9f\xd5\x5c\xbe\x3e\xab\x59\x77\xe5\x74\xec\x2d\xfb\x3b"
+ "\xe5\x7d\xe8\xd8\xd7\xdc\x74\x6c\x30\xea\xd8\x31\xb1\x7d\xf5\xd7"
+ "\xae\x62\xe8\xaf\x2a\xb1\xbf\xfe\xc7\x3f\xa0\xbc\xb1\x31\x9f\x34"
+ "\x0d\xdc\x5f\x1d\xc5\x2e\xfb\xc9\x6b\x9f\xd5\x63\x9f\x2d\x23\x26"
+ "\x33\xeb\xb3\x0b\xa4\x3e\x5b\x2c\x8e\x75\xfa\xe9\xb7\x61\xde\xfa"
+ "\x2d\xc6\xee\xc2\xb8\x5d\xfd\xf6\x5b\xd1\x5e\xea\x1a\x87\xfd\xb6"
+ "\xea\x1a\xd3\xb5\xb7\x8c\xf1\xec\xb7\xb7\xcc\xf4\xec\xb7\xb7\xc8"
+ "\x5c\xfd\x56\x7c\x36\x24\xfd\xf6\x16\xcd\xd5\xe9\xb7\xb7\x68\x7e"
+ "\x38\xba\x36\x7c\xea\x95\xd3\xb5\xb7\xae\x61\xfd\xd6\x9b\xae\x4d"
+ "\x17\x75\x6d\x30\xea\xda\x71\x37\xfa\xd6\x77\xc7\x07\xff\x2f\xef"
+ "\xbb\x97\x59\xe7\x8e\x3f\xec\xd9\x77\x6f\x55\x7a\xf6\xdd\xf1\xbb"
+ "\x5d\x7d\x57\x7c\x36\x24\x7d\x77\x7c\xc3\xd5\xe9\xbb\xe3\x1b\x7e"
+ "\x38\x3a\xf7\x56\xbb\xb7\xbe\xab\x1d\x4f\x32\x9a\x65\xda\x18\x53"
+ "\x31\xdb\x43\x97\x61\x72\x3c\x48\xd8\xbe\x13\x99\x76\xa5\x49\x13"
+ "\x49\x84\x9c\xdd\xe5\x18\x57\x05\xf7\xbf\xfc\xde\x6d\x7f\x09\x5f"
+ "\x7f\xd5\x6e\x96\xf6\xc7\xbc\x25\xc6\x5e\xe9\x6f\x7f\x0c\x35\xee"
+ "\x8e\x12\xdf\x6b\xe0\xd8\xd8\x3d\x4d\xba\x67\xbe\x60\x64\xda\x46"
+ "\x9a\xbd\x7b\xaa\x35\x68\xf7\x54\x6f\x6b\x24\x21\x6b\x28\xc5\x3d"
+ "\x21\xe7\xc6\xc7\x58\xcf\xe5\x10\x52\xc8\xd6\x1f\x6e\x53\xc3\xbb"
+ "\x91\x6c\x3f\x43\x48\xa0\xf9\x5c\xe6\x2c\x02\x69\x13\xa4\x34\x16"
+ "\x2f\x3b\x33\x80\x0a\xf0\x8c\xe6\xcf\xa9\xc1\xd8\x7a\xe8\xa7\x78"
+ "\xf2\x05\xc4\xe2\x6d\x53\x40\x46\xb0\xfd\x1e\x6c\xcd\xfd\xe6\x5b"
+ "\x6c\x25\xed\x44\x51\xb7\x8e\xed\x7b\xc3\x7d\x35\xa5\xf9\x88\xff"
+ "\x80\xbb\x8b\xa8\x5c\x41\x84\x2d\x31\x8d\x34\xb8\xa0\x9c\xed\x03"
+ "\x06\xac\x48\x7b\x6d\x30\x06\xa1\x30\x2e\x26\x45\xf2\x95\x4b\xa1"
+ "\x7e\x1f\xa4\xe1\x39\xd1\x00\x5a\x92\x48\xd4\x70\xa9\x68\x5e\x41"
+ "\x39\xd4\xab\x52\x9a\x3b\xf4\xba\xa7\x1b\x63\xfe\xde\xa2\x51\x88"
+ "\xfb\x7a\xd0\x67\x00\xdb\x1f\x58\x20\x17\x8c\x4e\x48\xa7\x99\xe9"
+ "\xd4\x94\xe2\x20\xa1\x40\x0b\x5c\x6f\xc7\x98\x60\x42\x49\x8c\x75"
+ "\xed\x58\x42\xfe\xba\xca\x22\xc7\xbd\x17\xce\xff\xbc\xc5\x56\x95"
+ "\x76\x3f\xae\xc7\x33\xff\xff\xad\xb2\xdb\xdf\x8b\x3e\xc9\xe3\xfb"
+ "\xc2\xff\xfb\x71\xdd\xe1\x09\xb8\xc7\xf5\x6c\xe1\x9c\x46\x81\x79"
+ "\x21\xfd\x95\xaa\xe4\x2f\x49\xa8\x81\x28\xf3\xa1\x6d\x62\xde\x28"
+ "\xcc\x6b\x96\xdd\xce\xce\xba\xc1\xfd\x6c\x9c\x2b\x87\xf7\xd8\x3c"
+ "\x29\x2d\x8e\x69\x64\xf2\x21\xb7\xa0\x1c\xda\xdf\xc8\xf6\x7d\x42"
+ "\x3b\x0b\xa0\xcd\x90\x47\x85\xfb\x6d\xd8\x6f\x1a\x51\x6f\x82\x34"
+ "\x2c\x07\x7e\x55\x6c\xcf\xaf\xec\xf6\x08\x2c\xdb\xeb\x59\x01\x55"
+ "\x41\x39\x05\x6c\xf3\xb3\x33\xb2\x83\xcd\xb2\x3b\xe2\x43\x65\x94"
+ "\xc2\x37\x53\xd6\xe2\x1c\x36\xee\xcf\xc6\x3d\xe7\xb2\x3b\x1e\x82"
+ "\xf2\x15\x6f\xb1\x39\xdb\x3b\xc2\xcd\xb2\xdb\xaa\xbb\xf7\x0e\xb0"
+ "\x75\x96\x3b\x92\xf0\x3b\xf8\x8e\x98\x9f\xed\x31\xc4\x3a\x6b\xd3"
+ "\x02\x28\xdc\x3f\xcb\xf7\x70\x2b\x17\xc2\xfb\xae\xf8\x3f\xfc\x3d"
+ "\xc0\xd2\x1d\x06\xe0\x19\xdb\x2f\x85\xf7\x5e\xf7\x14\x8b\x7c\xab"
+ "\x05\x6b\xa2\x17\xef\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\x49\x33"
+ "\xcb\x99\x3e\x92\xdd\xe1\xc4\x7c\xf9\xc0\x43\xe7\x9b\x1a\x05\x9b"
+ "\x97\xee\x42\xbe\x34\xc3\xb3\x09\xef\x22\x5f\x0a\x40\x17\x88\x79"
+ "\x1b\x5d\xf5\xc7\xfb\x09\x8c\x9f\x02\xf0\x82\xef\x59\x9a\x90\xcd"
+ "\xe2\x2f\x81\xcc\xc0\xbd\xe6\xfb\x52\x08\xae\x7f\x36\x52\xc0\xc8"
+ "\x5f\x13\xed\xf2\x92\x64\x9e\xfe\x41\xbb\x5d\x5e\x70\x8a\xb0\x75"
+ "\xad\xbc\x97\x88\x02\xf4\x90\x02\xcb\xa4\xe1\x31\x29\xf7\x4a\x7c"
+ "\x5c\x05\xbc\x4b\x06\xec\x02\xcd\x0b\x80\x7e\x25\x9d\x6c\x9d\x26"
+ "\xa5\x44\x20\x2a\x01\xf2\x99\x65\x13\xf6\x41\x79\xea\x2d\x37\x51"
+ "\x2b\xee\x89\x06\x1a\xae\xea\xc8\x9a\xd0\xed\xff\x0d\xeb\x84\x7b"
+ "\x9a\xf3\x70\x9f\xbe\x6c\x42\x38\xc7\xd0\x1d\x6d\x52\x9b\xbd\xd1"
+ "\x33\xef\xaf\x24\x3c\x6f\x32\x89\x14\x94\xad\x16\x1a\x70\x4b\x29"
+ "\xce\x37\x3f\xd9\x86\x3e\xa7\x2c\x24\xfa\xb7\xc7\xa8\xc9\xea\x24"
+ "\x42\x50\xab\x05\xd7\x20\x9c\x6b\xef\x1e\x1d\xbd\x12\xe8\x05\xfa"
+ "\x3e\xdd\x4e\xd4\xa6\x34\x2b\x8f\x13\x48\xce\x12\xe7\xab\x20\xc3"
+ "\x41\xae\x83\x4e\x55\xa4\x9f\x25\x63\x90\x5e\x42\x70\x8e\xa6\x55"
+ "\x76\xe7\xf2\x39\x49\x24\x63\x70\x72\xf4\x4e\xb6\xff\x13\xed\x0b"
+ "\x90\xf9\x72\xdc\x57\x67\xb2\x82\x7d\x92\x97\xa3\x19\x64\x39\x5e"
+ "\xe3\x4a\x61\xbb\x05\x9c\x87\x16\xdb\x1c\x8d\x6d\xb6\xd9\x09\xce"
+ "\xe5\x3f\xf9\x0a\xfa\x3a\x3e\x4f\x84\xec\x56\x0b\xb6\x19\x6c\x9d"
+ "\xa2\xc1\xcf\xe9\xff\x48\xd1\xdf\xb7\x29\xd0\x5b\x58\x7b\x4b\xa9"
+ "\xa0\x2a\x28\xc2\x6f\x63\x1d\xf0\x9c\xce\x93\xe7\x09\xa3\x3b\xd2"
+ "\xdf\x64\x77\x12\x1a\xe4\x5e\x07\xc7\x60\xeb\xe0\xbd\xfd\x93\x49"
+ "\x78\xee\x5f\x39\xdf\x9d\x6b\x45\x1a\xe8\x71\x0d\xac\xa0\x08\xe3"
+ "\x63\x3c\x89\x75\xb0\x9e\x26\x4f\x9c\x26\x8c\xff\x26\x5d\x1b\x71"
+ "\x06\xdc\x3d\x1a\xf7\x12\x20\xff\xd3\x1c\xc0\xff\x0b\x76\xf4\x6f"
+ "\x64\x35\x65\x5c\x24\x68\xbf\x38\xce\xe9\xe4\xbd\xf9\x7f\xd7\xf2"
+ "\x39\x29\x83\xe5\xff\x5d\x43\xc4\xff\xbb\xae\x81\xf6\xeb\xfc\x68"
+ "\xbf\x6e\x88\xda\xaf\xbb\x06\xda\x3f\xd1\x8f\xf6\x4f\x1c\xa2\xf6"
+ "\x4f\xf4\xda\xfe\xc7\xc6\x08\x94\xed\x31\x09\xc9\xca\x40\x1d\xc0"
+ "\xf5\xd5\xdd\x4b\x70\x0f\x09\x3b\x97\x25\xde\x13\x7e\x4e\x4b\xd9"
+ "\xe3\x5e\xd5\xe3\x5e\xdd\xe3\x3e\xac\xc7\xbd\xa6\xc7\x7d\xb8\x74"
+ "\x0f\x7a\x24\xf0\x8c\x6c\xe2\x51\xb0\x4b\x33\xcc\xb2\xbb\x53\xc4"
+ "\xe7\x13\xd0\xff\x17\xe8\xf4\x09\xfd\xc4\xaa\xbc\xe5\x94\xec\x6e"
+ "\x76\x4e\x8e\xae\x1d\xab\xa3\xab\x32\x88\x90\x3b\x77\xda\x93\xab"
+ "\x41\x76\x01\xff\x68\x97\x66\x18\xd8\x08\x37\xa3\x8f\x39\xdc\x73"
+ "\xa0\x4d\xc4\xbd\x24\x77\x1f\xc4\xf6\x4d\x36\x54\x11\x21\xe0\x6e"
+ "\xb6\x96\x2f\xe4\xcd\x9d\x66\x0d\xb8\x7b\x2c\xdd\xbc\x51\x9b\x2f"
+ "\x17\x94\xf9\x99\x82\x76\xb5\x95\x5a\x67\x9e\x05\x39\x74\x1e\xfd"
+ "\xbe\x03\x8f\x93\xa8\xb5\x2a\xf1\x34\xd4\xf7\xc7\x3f\xab\x4d\x85"
+ "\xb2\xe1\x3b\xf0\x2d\x18\xc7\xcd\x9d\xc0\x63\xac\xcf\x9d\x56\x67"
+ "\xab\x26\x18\x0f\x48\x2c\x33\x8a\x06\xcf\x9d\x80\x65\xf6\x69\x9f"
+ "\xe6\x66\xed\x84\x6f\x3e\x38\x47\xa7\x20\x74\x8d\x22\x6c\x70\x3c"
+ "\xfd\xf1\x3c\xaf\x76\x6f\xee\xfa\x29\xbc\x5c\xa5\x3f\xe5\xee\xec"
+ "\xa7\x5c\xb1\xbe\x6a\x3f\xca\x9d\xa4\xf2\x5e\xae\x51\xac\xaf\xd6"
+ "\x9f\x72\xe3\xfb\x29\x57\xac\x6f\x94\x3f\xe5\x56\x7a\x2f\x37\x5b"
+ "\xac\x6f\x86\x1f\xe5\xde\x13\xe6\xbd\xdc\xac\x9d\xfe\x61\xe1\x1e"
+ "\x7d\x7f\x58\xf0\x0f\x07\xf7\xf4\xd3\xfe\xf5\x3b\xfd\xc3\xc0\x64"
+ "\x75\x7f\x18\xf0\x8f\xff\x93\xfb\xe5\xbf\x7f\xbc\x9f\x5c\xd1\x1f"
+ "\xef\xfd\xe3\xfb\xbd\x5e\xf1\x8f\xb6\x3c\xf0\xde\x40\x43\x36\xaa"
+ "\x85\xfc\xb9\x06\x21\x24\x2b\x71\xad\x10\x45\x1e\x03\x19\x16\x5a"
+ "\x44\x46\x45\xb1\xf1\xf1\xbd\xa5\xab\x8b\x89\x1c\xc6\xbb\xf2\xb7"
+ "\x57\x35\xca\x4d\x8e\x48\xd4\x39\xce\xad\xc9\x76\xd9\x1d\x90\xbe"
+ "\x17\x10\x60\x03\xbb\x93\x97\x33\xd7\x90\x9f\x16\x45\x44\x9f\x17"
+ "\x36\x3c\x67\x1c\x0d\x72\xcc\x54\x64\xc7\x3d\x2b\xa3\xe0\x3d\x07"
+ "\xe0\x17\xca\xb0\x93\x77\x04\xab\x2c\x2a\x91\xe5\xb3\xb2\xf3\x75"
+ "\xf9\x59\x89\x34\x5d\x87\xbe\x0f\xad\xad\xb2\x88\xa0\x00\x2b\x91"
+ "\xa3\x8f\xa2\x8e\xac\x08\x85\x59\x16\x61\x13\xcf\x93\xb6\x31\x1f"
+ "\x9d\x50\x5f\x3c\xab\x89\x79\xd1\x57\xe7\x64\x03\x91\xa3\xff\x74"
+ "\xc8\x1b\x81\x7e\x3b\xfb\x3b\x97\xed\xcc\x2d\x98\x8d\xef\xd3\x5c"
+ "\xd0\xa1\xa7\x89\x1c\xcf\x62\xc2\x38\xa0\x3e\x1f\xc6\x10\xd3\x27"
+ "\xe2\x9c\x47\x3b\x49\x5b\x4d\x05\x9c\x7f\xa2\xaa\x1c\x25\xee\x8b"
+ "\xe3\x7b\xbc\x23\x6a\x4a\xf8\x9e\x6f\x3b\x8b\x15\x0c\xf7\x6c\x1c"
+ "\x83\xfb\x62\x54\x73\xec\x34\x3f\x38\xaa\xce\xd6\xce\xe2\xfd\x34"
+ "\xcb\x22\x6a\xd1\x7f\xe2\x39\x55\xc1\x2c\x9b\xaa\x20\x16\xea\x55"
+ "\x2d\xb5\x01\xbf\x2f\xa5\xe3\xb8\x0d\xf3\xc1\x73\x8b\x74\x4e\xdb"
+ "\x4b\xec\xec\xd1\xd1\x1a\x6a\xed\xf6\x8b\x21\xbb\xff\x09\xa4\x3d"
+ "\xd8\x0a\x33\x6c\xe9\xba\xf1\x7c\x1e\xe3\xbe\x24\x1c\x0f\x43\xbd"
+ "\xa7\xf0\xb1\xe9\xdc\x29\xcc\x87\x2e\xe8\x80\x39\x3a\xf9\x20\xed"
+ "\xd6\xfb\x98\xfe\xaf\x1a\x8f\x3a\xf2\xfe\x07\xa0\xfc\x7f\x6b\x96"
+ "\xdd\x57\xc4\xc7\x62\x73\x67\xb0\xf3\x89\xb2\xfb\xa6\xc0\x37\x66"
+ "\xd0\xdc\x39\x56\xcc\x07\xcf\x2b\xc4\xe7\xb3\xdc\x9e\xcf\xc2\x7d"
+ "\x92\xe2\x73\x71\x2c\x37\x77\xb6\xdb\xf3\xd9\x86\xf1\x38\x37\x71"
+ "\x3f\x9b\x8b\x01\x7d\x16\x81\xba\xad\xdb\xcf\x47\xf0\xdc\x08\x31"
+ "\xdf\xb4\x36\xd9\xfd\x63\xce\x01\xb6\xe0\xf9\x4c\xb7\xf7\x67\x7e"
+ "\x94\x12\x41\x1e\xdb\x82\x34\xbc\x7f\x92\x59\xbe\x41\xc7\xc7\xb3"
+ "\xf7\x45\xb2\xb6\xab\xe6\xea\xdc\xcb\x83\x74\x3b\x94\xa9\xb3\x81"
+ "\x1d\x05\xff\x6b\xf1\x9b\xee\xf4\x96\x4e\x49\x6a\xe3\x97\x2c\xd0"
+ "\xbe\xb0\x6c\xf9\x52\x3c\xe5\x36\xc2\x63\x7f\xa3\x1a\xcf\x81\x0a"
+ "\xb9\x1b\x22\x4d\x45\x78\x2e\x4d\xcd\xce\x73\x6f\x02\x3e\x3a\xf2"
+ "\x0b\x0d\xce\x90\x42\xe2\xcc\xcf\xd1\xa6\x9f\x27\xf2\x34\x0d\xfd"
+ "\xa6\x6a\xd5\xa3\xe4\x8c\xec\xfe\xfd\x2c\x16\xaa\x96\xf9\x8a\xb6"
+ "\x55\xad\xfa\x10\xd3\xd8\x39\x75\x53\x1c\x4f\xfb\x7f\x69\xd5\xf2"
+ "\x3d\x69\x8d\xf2\x9a\xb8\x76\xf2\x91\xc6\x4a\xf6\x69\xdb\x49\x31"
+ "\xa6\x0b\xf5\x72\xdc\x37\x7a\x46\xf6\x93\x7b\xf0\x5b\x38\xc6\xc7"
+ "\xff\xf9\x7c\xc5\xfd\x7f\xc3\xef\xa0\x8f\x0d\xa0\xcd\xbb\xf8\x3d"
+ "\xb3\xec\xfe\x9d\x01\xc5\xb8\x07\x97\xa8\x20\xdf\x2b\x42\xde\x86"
+ "\x48\xd6\xc7\xb3\xee\x8f\x77\xc8\x55\x7f\x16\xcf\xbd\x31\xdf\xff"
+ "\x1d\x59\x3f\x99\xe7\x76\xc6\x53\x75\x4e\x4e\x1e\x86\x34\x83\x74"
+ "\xb6\x00\x63\x8f\x79\x93\x19\x17\x61\x2c\x7b\xb1\x38\x26\x56\x50"
+ "\x6d\x00\xfa\x6e\x88\xac\xae\x26\x38\x97\x22\xc3\x3d\xb0\x6d\xb2"
+ "\x07\x66\xd1\xe0\x0d\xba\x34\xec\xa7\x40\x8b\xbf\xe0\x3e\xbe\x90"
+ "\x42\xc3\x0e\xdc\xb7\x97\x5f\x48\xfe\x9c\x6c\x97\x7f\x52\x53\x41"
+ "\xb4\x73\xd1\x1e\xfa\xc9\x37\xbf\x8a\xa7\x8e\xbb\x1b\xaa\x48\x4d"
+ "\xcb\xff\x90\x4f\x9b\xaa\x89\x6a\x1e\x09\x48\x37\x53\x27\x1b\xef"
+ "\x27\x11\x79\xb4\x99\x04\xa4\x9d\xc7\x7e\xea\x24\xe9\xcb\xe1\xd7"
+ "\x5e\x0b\x36\xce\x32\xdb\xdb\x69\x96\x40\xed\x53\x84\x40\x7f\x62"
+ "\xeb\xc6\xec\x9c\x8d\x95\x9d\x5b\x0e\xc6\x39\x6c\xb7\xf3\x35\xf6"
+ "\xd5\xa7\x89\xb2\x56\x7f\x94\xa4\xc6\x51\xc1\xb9\x42\x37\x3a\x3a"
+ "\x2e\x80\xb2\x33\x36\x29\x90\xd9\x00\x3c\x5d\xa1\x0b\x79\x23\x99"
+ "\x84\xd5\x25\x99\x89\xc9\x52\x4d\xde\x4c\x24\x61\xb4\x43\x1f\x54"
+ "\x53\xf3\x09\xa1\x39\x16\xf3\x3b\x69\x55\x81\xd2\x9e\xa9\xd0\x35"
+ "\x32\x9c\xb3\x0c\xc9\xc5\xbd\x53\x17\x48\xc4\xfc\xe3\x19\x6c\x9e"
+ "\x15\xe7\xb4\x1d\x1d\x3a\x6d\x57\x87\xee\xf6\xce\x0e\xdd\x78\x69"
+ "\x2e\xfc\xd9\x45\x6a\xb2\x05\xcf\xe6\x64\xfd\x68\x26\xee\xd5\x43"
+ "\xdb\xde\x11\xd4\x66\xc1\x79\x6f\xc4\x25\x7c\x3b\x5c\x78\x41\x47"
+ "\xee\xb5\xb2\xb3\x3f\x38\x17\xaf\x2e\x79\x1e\xea\xdb\xd6\x4e\xdc"
+ "\xf7\xff\x5c\x5c\xa1\x93\xe3\xde\x1f\x9a\xf5\x13\x63\xe7\x96\x98"
+ "\x58\xdc\x03\x04\xba\x60\xca\xe0\xfb\xf6\x03\x6c\x6e\x02\xdb\x0f"
+ "\xfc\x30\xec\x68\x47\xfe\x00\x9f\xda\xad\x72\xe4\x45\x6d\x3c\xf2"
+ "\xa1\xde\x83\x0f\x8c\x6f\x89\x76\x39\xf2\x03\x79\x81\x3c\x71\xf1"
+ "\xe3\x30\xe3\xc7\x0e\x81\xf3\xa3\x13\xf4\x80\xc4\x93\x8b\xe1\x31"
+ "\xfa\xfe\xf8\x82\xfc\x40\xde\xd4\xb4\x1c\x25\x1e\x3c\xb1\x72\x9e"
+ "\x00\x3d\x47\x4b\x7c\x41\x9e\x98\xda\xc0\xd6\x05\xbe\x3c\x7e\x98"
+ "\x90\x5f\x4d\xa4\x42\xed\xcc\x43\xdd\xfc\x71\x78\xe3\xcf\x49\x17"
+ "\x7f\x80\xf7\xbd\xf9\x73\x5a\x8d\x6b\x33\xc8\x9f\xfa\xc1\xf0\xa7"
+ "\xa6\x85\xf3\xc7\x21\xf2\x67\xe2\x0c\x22\xb7\x77\xe8\xe4\x9b\x93"
+ "\x49\xe4\xcc\xe3\x5a\xb2\x3f\xb6\x96\x00\xad\x35\x42\x5e\xc1\x0c"
+ "\xff\xfa\x51\x64\x91\xef\xfd\xe8\xff\x4c\xbc\xde\x8f\x06\xdb\x8f"
+ "\x7e\x5a\x7f\x69\xfd\x28\x32\xfe\x7a\x3f\xba\x52\xfd\x28\x32\xae"
+ "\x67\x3f\xea\xd6\xd5\x89\x09\x4b\x16\x2c\x5a\x8a\xc7\xf7\x9e\x5f"
+ "\x99\x94\xf0\x2a\xd7\xd8\x1e\x3a\x5b\xe3\x4c\x8b\x92\xa3\x4f\xb6"
+ "\x9a\xa2\x7a\xf2\xce\xd8\x7a\xb9\xf3\x84\x46\x41\x73\x03\x22\x84"
+ "\xdc\xc0\x0a\xf4\xad\x89\xfd\x6d\x13\xfa\xbd\x90\xfd\x7c\x5f\x5d"
+ "\x38\x8f\x63\x89\xff\x33\x7b\x25\x3c\xc6\x82\x6b\x24\x6b\x57\x11"
+ "\xc5\x5a\x3c\xc3\x6c\xc7\xb9\x08\xf6\xfc\x1e\xf4\x35\x48\xb7\xc4"
+ "\x58\xd0\x6f\x8d\x4d\x35\xc7\xba\x0e\xca\xb2\x06\x6f\x88\x54\x68"
+ "\xf1\x8c\xc3\x83\x95\xa0\x8f\x53\xbb\xfd\x10\xc9\x1e\xb2\xd2\x61"
+ "\x0f\xaa\xb1\x9f\xe3\x79\xb3\x33\xb2\x07\xcf\x5e\xcc\x24\xe8\x6f"
+ "\xc3\x3a\x67\x22\x7c\x67\x5c\x8c\x9e\xf9\x25\x80\x3e\xcf\x9f\x4f"
+ "\x7d\x1d\xbf\xdf\xa5\xca\xd1\xa2\x9d\x78\x4e\x55\x68\x38\x97\x5b"
+ "\x48\x3e\x49\x2d\x27\xda\xa7\xb0\xcf\xff\xdb\xb8\xc7\x8b\xa0\xcf"
+ "\xcf\xaa\x22\xb5\x9a\x3f\x93\x4f\x63\x01\x6b\xb1\x03\xf5\x79\x37"
+ "\x8c\x8d\xf7\xad\xcf\x4b\xd8\x42\x4c\x21\xb6\x10\x57\x23\x01\x57"
+ "\x88\x35\x09\x5b\xbf\xbf\xc0\xb1\x15\xda\x44\xd4\x6f\xb4\x03\xbe"
+ "\x1c\x1c\x5f\x78\x2e\xb8\x36\xe5\x90\xf7\xbe\x7f\xa1\x07\xb6\xe4"
+ "\x22\xb6\x56\x00\xb6\x56\xb8\xb0\xf5\xcc\x51\x35\x79\x93\x61\xeb"
+ "\x4e\x17\xb6\xb2\xdb\x2c\x12\xae\x10\x63\x88\x27\xe1\x45\x1d\xc1"
+ "\xfe\x2e\x61\xac\x64\x21\x5f\xe3\x64\x7d\x5f\x0e\x7d\xbf\xc3\x4d"
+ "\x87\x8e\xbb\x94\xbe\x3f\x95\xed\x7f\x42\x9e\x20\x7f\x90\x2f\xc8"
+ "\x8b\x7f\x45\x3e\xa0\x4f\x58\xda\xd1\x17\x2f\x26\x34\x0e\xc4\x0b"
+ "\xe4\x03\xf2\x83\xf1\x01\xf8\x21\xad\x37\xe3\xfa\x23\xf2\x04\x79"
+ "\x31\x39\x95\xc8\x91\x2f\x25\xd0\xdf\xb1\x8f\x03\x6d\xe7\x21\x5f"
+ "\x98\xdd\x9a\x19\xfc\xe2\x26\x3c\x33\x2b\xc6\xdb\xed\xc8\xfa\xb9"
+ "\xba\xb7\xcd\xfa\xf3\x09\xdd\x7e\x20\x65\x0f\x56\xf3\x31\x46\x0e"
+ "\xf7\xc1\x26\x7b\x78\xb9\xd8\x87\xeb\x71\xbc\xc7\xc6\x76\x4e\x18"
+ "\xdb\xa9\x60\x6c\x97\x0b\x63\xbb\x14\x0b\xf7\x17\x20\xfb\xf9\x2b"
+ "\x44\x3c\xbf\x4b\x83\x73\x94\x34\x6f\x8e\x1d\x69\xc6\xd6\x49\x83"
+ "\x0b\x66\xe1\xba\x0e\xcd\x83\x71\xe3\x7f\xc9\x09\xdc\x03\x6e\x9c"
+ "\x83\xc4\xcb\xcf\x0b\xc5\x75\xe0\xa9\x86\x55\xb8\x47\xe0\x61\xee"
+ "\x57\x51\xf6\xe0\x4a\x4c\x67\x6b\x68\x72\xa1\xd4\xb9\xd6\x73\x0d"
+ "\xcd\x7d\x8d\xf5\x9d\x34\xab\xb8\x7e\xf6\xf0\x23\x2c\x0f\x9e\xd3"
+ "\x00\x39\xf6\x76\x5a\xbd\xdc\xb5\x86\x76\x08\x9f\xff\xd2\x73\x0d"
+ "\xed\x61\x66\xef\x99\x65\x0f\x27\xe1\xbe\x11\xb8\x8f\xe0\xe9\x0f"
+ "\xa6\xb8\xa7\xbb\xd6\xa8\x79\xba\x20\x67\x71\x46\x70\x8c\xdd\xc6"
+ "\xc7\xd6\x0f\xe7\x4a\x63\x58\x2f\xf6\xcc\x20\xe4\xec\xb4\x28\x97"
+ "\x9c\x9d\xc6\xe7\x9a\x35\x1b\x35\xb5\xbd\xe4\xec\x97\xf0\xfc\xb1"
+ "\xed\x4f\xa2\x9c\xcd\xcd\xe1\x71\xe1\x65\x51\x63\x80\x26\x01\x18"
+ "\x2f\x12\xd3\xf1\xbc\x0e\xca\xdc\x2d\x4c\x06\x6f\x54\xae\x63\xeb"
+ "\xe4\x51\x91\x9e\xb2\xf7\xb1\xc5\x9e\xb2\x37\x6a\x49\xff\xb2\xf7"
+ "\xd1\x51\xfd\xcb\xde\xa8\xcd\xd7\x65\xaf\xbf\xb2\x17\xec\xae\x4b"
+ "\x92\xbd\x8f\x34\x5d\x97\xbd\x97\x4b\xf6\x3e\xd2\xe8\x26\x7b\x67"
+ "\x7b\xca\xde\xc7\x72\x7b\xcb\xde\xc7\x4a\x5d\xb2\x37\x6a\x9a\xa7"
+ "\xec\x9d\x76\xd6\x37\xd9\xfb\xd8\xe9\xcb\x2b\x7b\xa7\xa9\x3c\x65"
+ "\xef\xb4\x26\x51\x37\x7c\x33\x78\xd9\x3b\x6d\x77\xff\xb2\x77\xda"
+ "\x7e\x4f\xd9\x3b\xad\x88\xcb\xd8\x69\x56\x2e\x7b\xa7\xed\x10\x65"
+ "\xb2\xd9\x3d\xdd\x25\x7b\x79\x7a\x6f\xd9\x3b\x5d\x39\x80\xec\xd5"
+ "\x39\x05\x49\xf6\x36\x82\xec\x6d\x94\x0b\x2f\x7a\x93\xbd\x8f\x87"
+ "\xd5\xa2\xec\x4d\x44\xd9\xfb\x78\x58\xff\xb2\xf7\x97\xab\x51\xc6"
+ "\x32\xbf\x94\x7f\xa0\x2d\xcc\x2f\xe0\x1f\xa8\x05\xf1\xf8\x64\x2a"
+ "\xa4\x43\x1a\xfa\x4f\xc4\x7c\x22\xef\x45\x19\x3d\x7d\x77\xb7\x8c"
+ "\x86\x7c\xc2\x18\x97\x8c\x46\xf9\x8c\x72\x7a\xcb\x1f\xa8\xb9\xe4"
+ "\x0f\xb4\x09\xda\xd6\x22\xc9\xea\x3c\x48\xc3\x38\x3f\xe8\xbb\x07"
+ "\xf7\x0c\x02\x0d\x5a\xd6\xc2\xf7\x30\x7f\x47\xd6\x2f\x54\x9e\x32"
+ "\xfd\x97\x51\x9e\x32\xfd\x17\x8f\xf4\x2f\xd3\xff\xfd\x78\xff\x32"
+ "\xfd\x17\x4b\xae\xcb\xf4\xab\x25\xd3\xff\xbd\xfc\xba\x4c\x1f\x58"
+ "\xa6\xf7\xc5\x8b\x9e\x32\xfd\x1e\x51\xa6\x6f\xe9\x96\xe9\xff\xbe"
+ "\xc3\xbb\x4c\xff\x65\x5c\x6f\x99\xfe\xcb\x24\x97\x4c\xff\x85\xc6"
+ "\x53\xa6\x3f\xbe\xdf\x37\x99\xfe\xcb\xbd\x97\x57\xa6\xff\xd2\xec"
+ "\x29\xd3\x1f\x17\xf7\x87\x4d\x7f\xd6\x5d\xa6\x0b\x01\xbe\xc8\xf4"
+ "\xc7\x37\x4a\x32\x1d\x65\xe6\xdb\x42\xa3\x9b\x4c\x47\xd9\xf6\xf8"
+ "\xe6\xaa\xe4\x66\x37\x99\xfe\x38\x8f\x23\x2d\x7b\x7c\x9f\x93\xc9"
+ "\xf4\xc7\x33\x78\xfa\xf4\x79\xee\xe9\x2e\x99\xce\xd3\x9d\xee\x32"
+ "\xdd\x82\x32\xfd\xf1\xa6\x01\x64\x7a\x84\xef\x32\x7d\xd6\x54\x97"
+ "\x4c\x9f\x35\x55\x92\xe9\x28\xc7\x51\xa6\xa3\x0c\x46\xb9\xce\x7c"
+ "\x55\xb1\x7d\x0f\xd1\xdb\x42\xad\x44\x89\x3e\x72\x71\x0e\x03\x65"
+ "\x31\xfa\xe3\x41\xd9\xce\xf2\x2c\xe5\x79\x40\x3e\xb7\x80\x4c\xb6"
+ "\x80\x4c\xb6\xe4\x9d\x21\x0a\xc8\xd7\x98\x8f\x7b\xe8\xe0\x1e\x65"
+ "\x77\x68\x1b\xe8\x01\x07\xd3\x03\x8d\xa8\x3f\x38\xbd\xa2\xb7\x79"
+ "\xea\x82\x5f\x1d\xe8\xcb\x5e\x2f\x74\xd3\x05\x25\x37\xd1\x86\x8e"
+ "\xac\x5f\xb5\x49\xf2\x3d\x1f\xee\x51\x07\x14\xb6\x33\x1d\x60\x06"
+ "\x1d\xd0\xc2\x75\xc0\x4c\x75\x77\x1e\xa8\x03\xcb\xc3\xf5\x44\x23"
+ "\xe4\x69\x12\xf3\x4c\xf1\xd4\x13\xd1\x7a\x4f\x3d\x31\x73\x11\xea"
+ "\x09\xf4\xdb\xca\xe2\x9d\xe7\x6d\xd0\x39\xb7\xc4\xe8\x51\x67\xf0"
+ "\xe7\x4f\x06\x77\xeb\x89\x9b\xdc\xf4\x44\x8a\xa4\x27\x66\xbe\x7e"
+ "\xcd\xeb\x09\xc0\x72\x6d\xea\xbf\xa2\x9e\x78\xa2\xf1\x5a\xd0\x13"
+ "\xc8\x83\x91\x6e\x73\xab\xde\xf8\x80\xfe\x11\x6a\x17\xff\x50\xf4"
+ "\xc4\x13\x0d\xde\xf5\x44\xb4\xb1\xb7\x9e\x88\x2e\x76\xe9\x89\x99"
+ "\x51\x9e\x7a\x62\xd6\x69\xdf\xf4\x44\xf4\xc9\x9e\x7a\x02\x69\x96"
+ "\xcf\xf7\x04\xb4\xa1\x7e\x70\xe6\x15\xcc\x12\x50\x57\xf8\xa5\x27"
+ "\x66\x29\x3d\xf5\xc4\xac\x46\x51\x26\xdd\x37\x78\x3d\x31\x8b\xf9"
+ "\x47\xcc\x97\xf4\xc4\x85\x9e\x7a\x62\xd6\x5e\x4f\x3d\x31\x6b\x13"
+ "\xd7\x07\xb3\xda\xb8\x9e\x98\x55\xc6\xd3\x7f\x15\xe1\x9e\xee\xd2"
+ "\x13\x3c\xbd\xb7\x9e\x88\x51\x0c\xa0\x27\x54\x5d\xe1\x31\xfa\xae"
+ "\xdc\xc2\x59\x8e\xad\x31\xd6\x49\xb1\x0f\x3b\x7b\xf6\x01\x8e\x7d"
+ "\x27\xc1\xbe\xd0\xbd\xe6\xf3\x1c\x5f\x63\x10\xc4\x73\xb7\x9d\xe1"
+ "\x31\xb1\xad\x8b\xa1\x1f\xb4\x79\xef\x07\xd0\x07\x94\x52\x1f\xa8"
+ "\xd5\x1f\x27\xd0\x2f\xe4\xb8\x0e\xf4\x26\xe0\xdf\x64\x6b\x64\x72"
+ "\x49\xd5\x12\x45\xd0\x5f\x61\x70\x1b\x51\x07\xcb\x64\xc3\x70\x8d"
+ "\xc1\x09\x7d\x61\xfa\x44\x2a\xfc\xb8\x31\x8a\x04\xeb\x49\x08\xf6"
+ "\x87\xbf\x8a\x6b\x0d\xe8\x33\x01\xd7\x18\x00\x87\x11\xf3\x0f\xba"
+ "\xd6\x18\x3a\x7d\x58\x63\x30\xa5\x98\xd9\x1a\x03\x9e\x23\x12\xa0"
+ "\x0f\xb0\xb3\x2d\xb8\xc6\x60\x67\xeb\x32\x6a\x76\x9e\x84\xad\x31"
+ "\x34\x13\x5c\x5f\x90\x7c\xa2\xe0\xba\xc2\x8f\x63\x89\x1c\x7d\x2a"
+ "\xbc\x09\xf8\xdf\xaf\xab\x25\xd8\x07\x06\x2f\x8f\x9e\xf2\xba\xff"
+ "\x09\xf9\xe2\x00\x9a\x3a\x55\x85\xb3\xe8\x1b\x1b\xa3\xfe\xd2\x6c"
+ "\x97\xa1\x3f\x48\x27\xf0\x48\x00\xb9\x43\x95\x3d\xe4\x4e\x97\x48"
+ "\xef\x2e\x4e\x6f\xe0\x95\xf2\x39\x1b\xa1\x90\xce\xfd\x41\xda\xcd"
+ "\x80\x35\xdd\xe8\x2d\xab\x90\xb6\x11\x64\x8b\xe8\x13\x52\x78\x4d"
+ "\x1f\x24\x00\x3d\xf1\xfc\xc0\xdb\x17\xec\x81\x4e\x65\xab\x25\xb7"
+ "\x93\x4c\x02\x19\x13\x8c\x32\x06\xf0\x39\xe2\xad\x4e\xa0\xed\x37"
+ "\x9c\xb6\xe8\xd3\x0b\x7f\x1d\xaf\xe9\xb4\x50\xf6\xed\x5d\x5d\x40"
+ "\x5f\x3b\xa7\xef\x73\xaf\xa8\x49\x89\xb4\xc6\x06\xfa\xb9\x0e\x78"
+ "\x8a\x32\xe6\x49\x5b\x28\xc5\x78\x0f\xce\x2e\x5d\xb8\x70\x02\xe8"
+ "\x6b\x83\x3e\xd5\xa5\x43\xfe\xab\x4b\x5a\x71\x4d\xf0\x4b\xbe\xc6"
+ "\x16\x24\xfa\xaa\x78\x0d\xe4\xfd\x22\x2d\x31\x95\x81\xbc\x1d\x16"
+ "\xa3\xe9\xda\x12\x13\x4b\x65\x20\xef\x53\x07\x4b\xdf\x5f\x57\x5f"
+ "\x1d\xfa\x6a\x7f\x40\xf4\x7d\xaa\xdc\x7f\xfa\xce\xd1\x5d\x1d\xfa"
+ "\xaa\x7f\x40\xf4\x9d\xad\xf6\x9f\xbe\x73\xbd\xee\x7f\x46\xfa\xa2"
+ "\x7d\x2f\xd9\xf6\x92\x5d\x8f\xba\x85\xeb\xc6\xa7\x89\xcb\xa6\x7f"
+ "\x9a\x48\x6b\x91\x40\x1b\x45\x9e\x38\x47\x63\x58\x48\x6e\x3d\x25"
+ "\x8b\x5d\x2e\xad\x43\xa2\x4d\xcd\x78\xf5\x06\xf0\x6a\x29\x9e\x13"
+ "\x11\xf9\x04\x7a\x60\xbe\x0d\x64\xf5\xb8\x18\xbd\x33\x0f\xf4\xc4"
+ "\xb6\x18\xab\x17\x9e\xc9\x51\xc6\x07\x27\x11\xf5\x73\x06\xce\x3b"
+ "\xe1\x35\xe0\x59\x27\xd8\x37\x76\x0b\xc1\x73\x9f\xa1\x16\x90\xab"
+ "\x5d\xfa\xa0\x79\x60\x2f\x4b\x7c\xfb\x6b\xb2\x9d\xd9\x36\x7d\xf2"
+ "\x6d\xb3\x27\xdf\xce\xf5\xc1\x37\xd7\xda\x3e\xd8\x99\x8c\x6f\x66"
+ "\xc6\x37\x26\xd7\x5f\x03\xdb\x06\xf8\x27\xf1\x8d\xc9\x75\xe0\x1d"
+ "\xe3\x5b\x5b\x33\x71\xba\xc9\x75\xb4\x6b\x90\x77\x35\x71\x60\x5f"
+ "\x66\xcd\x31\x30\xbe\xa1\x9d\x19\x37\x58\xbe\xc5\xf6\xb0\x67\x9e"
+ "\x7e\xdb\x37\x7b\x26\x76\x37\xda\x2c\xee\xf6\x0c\xde\x9f\x83\x31"
+ "\xaf\x33\xb8\x60\xb6\xcd\x2f\x1b\x26\xb6\xc6\xd3\x86\x79\xba\x88"
+ "\xd7\xe9\x37\x81\x83\xb7\x61\x9e\x66\xeb\x4d\x6f\xbf\xc1\xc7\x92"
+ "\x9e\xf6\xcb\xd3\x6b\x3c\xed\x97\xa7\x67\x73\x3b\xe5\xe9\x1d\xe7"
+ "\x32\xd1\x7e\x79\x5a\xcf\xd3\x7f\xa3\x70\x4f\x77\xd9\x2f\x3c\xfd"
+ "\x1c\xfa\x06\xcb\x7a\xba\x62\x70\x36\xcb\xbd\x57\xd9\x66\x89\xe8"
+ "\xc7\x66\x89\xf8\x17\xb3\x59\x9e\xe9\x2f\x86\xcc\x75\x9d\xca\x64"
+ "\xfe\xd3\x35\xfe\xcb\xfc\x79\x5e\x63\x65\x5c\xd7\xa9\x12\x7d\x9f"
+ "\x89\xf7\x9f\xbe\xcf\x7a\x8d\x7f\x3a\xb0\x4e\x8d\x9b\xed\xd2\xa9"
+ "\x71\xb3\xbd\xeb\xd4\xf9\x07\xae\xeb\xd4\xbe\x74\xea\xbc\x7d\xfe"
+ "\xeb\xd4\xf9\x9b\x3c\x75\xea\x02\x99\x6f\x3a\x35\x6e\xd4\xd0\xeb"
+ "\xd4\x38\xad\xa7\x4e\x8d\x6b\xe3\x75\x7a\xee\xe9\xc1\xeb\xd4\xb8"
+ "\x5a\xef\x3a\x35\xee\xb0\xa7\x4e\x8d\x2b\xe3\xba\x73\x01\xe1\x3a"
+ "\x35\xae\x92\xa7\x3f\x17\xeb\x9e\xee\xd2\xa9\x3c\x9d\xeb\xd4\x05"
+ "\xaa\xc1\xe9\xd4\x5b\xaf\xb2\x4e\xd5\xf6\xa3\x53\xb5\xff\x62\x3a"
+ "\xf5\x79\xc3\x75\x99\x3f\x90\xcc\x5f\xa0\xf5\x5f\xe6\xbf\xe0\xd5"
+ "\xff\xdd\xc0\x32\x7f\xe1\x0c\x97\xcc\x5f\x38\xc3\xbb\xcc\x4f\xd8"
+ "\x7d\x5d\xe6\xf7\x25\xf3\x9f\xaf\xf0\x5f\xe6\x27\x18\x3d\x65\xfe"
+ "\xc2\xf3\xbe\xc9\xfc\x85\x81\x43\x2f\xf3\x17\x86\x79\xca\xfc\x85"
+ "\x66\x5e\xa7\xf8\x27\x06\x2f\xf3\x17\xee\xf5\x2e\xf3\x17\x1e\xf0"
+ "\x94\xf9\x0b\x8b\xb9\x6c\x5f\x68\xe3\x32\x7f\x61\x39\x4f\x8f\x9f"
+ "\xe9\x9e\xee\x92\xf9\x3c\x9d\xcb\xfc\x17\xc9\xe0\x64\x7e\xe8\x55"
+ "\x96\xf9\xea\x7e\x64\xbe\xfa\x5f\x4c\xe6\xeb\xbd\x9e\xff\x1c\x58"
+ "\x26\xbd\xd4\xe4\x92\x49\x2f\x35\x79\x97\x49\x2f\xc5\x5c\x97\x49"
+ "\x7d\xc9\xa4\x17\xc3\xfc\x97\x49\x2f\x85\x7b\xca\xa4\x97\xb3\x7d"
+ "\x93\x49\x2f\x6d\x1e\x7a\x99\xf4\x52\x99\xa7\x4c\x7a\x39\x89\xd7"
+ "\x49\xff\xcd\xe0\x65\xd2\xcb\x73\xbc\xcb\xa4\x97\x9f\xf5\x94\x49"
+ "\x2f\x8b\x6b\x50\x2f\x1b\xb9\x4c\x7a\x79\x1a\x4f\xd7\x9b\xdd\xd3"
+ "\x5d\x32\x89\xa7\x73\x99\xf4\xf2\xa6\x81\x64\x12\x62\xbf\x56\xd3"
+ "\x03\xfb\x2f\x4b\xd8\x5f\xd2\xf6\x69\xb1\x84\xfd\x25\x6d\x6c\xbf"
+ "\x5b\x71\x8c\x65\x43\x32\x51\xe4\x62\x9c\x0b\xe8\xef\x86\xff\x40"
+ "\xec\x2f\x59\x80\xfb\x16\x54\x4d\x20\xc3\x5a\x44\x99\x96\x02\x32"
+ "\xad\x05\xee\xd1\x0f\xd4\xb8\x18\x0b\xca\x22\x5c\xff\xc7\x7b\x2e"
+ "\xdb\xac\x81\x78\x5e\x72\x50\x67\x99\x5a\xc4\xb3\x4c\xf1\xbd\xcf"
+ "\x32\x15\xbb\x9d\x99\xc1\xbe\x11\xbc\x46\x16\x82\xeb\xba\x20\xdf"
+ "\x44\x39\x56\x1d\xe8\x50\x8a\x72\xec\x02\xc8\xb1\x0b\xae\x3e\x81"
+ "\x72\xec\x1c\xc8\x31\xdb\x0a\xdd\x78\x94\x65\xbd\xcf\x31\xf1\x75"
+ "\x5c\x26\xc7\xb2\x7b\xc8\xb1\x17\x7b\xc8\xb1\x85\x20\xc7\xe2\x40"
+ "\x8e\x05\xb9\xfa\xc3\x1d\x4d\x44\x3e\x73\x01\xf4\x09\x90\x63\xbf"
+ "\xbf\x80\x72\x6c\xbf\x9f\x72\x6c\xc9\x24\xcf\xfe\xb0\x74\xb3\x6f"
+ "\xfd\x61\xc9\x76\x6f\xfd\xa1\x2b\xcf\xdf\xfe\xb0\xa4\xc2\xb3\x3f"
+ "\x2c\x5d\x27\xf6\xd1\xa3\x83\xef\x0f\x4b\x13\xba\xfb\xc3\xcb\x3d"
+ "\xfb\xc3\xd2\x25\x9e\xfd\x61\x69\x14\xc7\xfd\xd2\x22\xde\x1f\x96"
+ "\xce\x16\xfb\x49\x93\x7b\xba\xab\x3f\xf0\x74\xde\x1f\x96\x6e\xbd"
+ "\xbe\x3e\x7b\xad\xea\x68\x83\xf2\xfa\xfa\xec\x40\xe3\xb2\xa5\x15"
+ "\xfe\x8f\xcb\x5e\xb9\x4a\xeb\xdf\x3f\xa4\xb9\x64\xc3\x2c\xff\xe9"
+ "\x9b\x78\x95\xd6\xbf\x7f\x48\xf3\x0a\xaf\x5c\xc2\xfa\x77\x52\xbf"
+ "\xeb\xdf\xfd\xdb\x31\xc9\x15\x35\xdd\x36\x7c\x72\x85\xb4\xe7\xb2"
+ "\xb7\x0d\x9f\x7c\x8f\xe7\xf9\xa5\xa4\x23\x3d\xf7\x43\x0e\x64\xdb"
+ "\x3b\xfe\x57\xd9\xf6\xaf\xaa\xfd\xb7\xed\x97\xdb\x3d\x6d\x99\x15"
+ "\x09\xbe\xd9\x32\xc9\xcb\xbd\xd9\x32\x0e\xbf\x6d\xfb\xe4\x75\x9e"
+ "\xb6\xcc\x8a\x59\x22\xff\xb7\x0d\xde\x96\x59\x71\x9f\x77\x5b\x66"
+ "\xc5\xcf\x3c\x6d\x99\x15\x2a\x6e\xb3\xac\x88\xe7\xb6\xcc\x0a\x2d"
+ "\x4f\x4f\xda\xea\x9e\xee\xb2\x65\x78\x3a\xb7\x65\x56\x18\xae\xaf"
+ "\xdb\x5e\xab\xb6\x4c\x4a\xc3\x75\x5d\x3b\x90\x2e\x58\xb1\xce\x7f"
+ "\x5d\xb0\x6a\xca\x75\x5d\x3b\x10\x7d\x57\x86\xfb\x4f\xdf\xd7\x36"
+ "\xf9\xaf\x6b\xd3\x26\xb8\x74\x6d\xda\x04\xef\xba\x76\xf5\x66\x4f"
+ "\x5d\x9b\x3a\xfd\xba\xae\xed\x4f\xd7\xae\x4a\xf5\x5f\xd7\xae\x8e"
+ "\xf7\xd4\xb5\x69\x07\x7d\xd3\xb5\xab\xbf\x19\x7a\x5d\xbb\xda\xea"
+ "\xa9\x6b\xd3\x2a\x45\xfe\x8f\x1a\xbc\xae\x4d\xdb\xe2\x5d\xd7\xa6"
+ "\x6d\xf3\xd4\xb5\x69\xe2\x19\xfa\xb4\x7a\xae\x6b\xd3\x72\x79\x7a"
+ "\xaa\xda\x3d\xdd\xa5\x6b\x79\x3a\xd7\xb5\x69\x03\x9d\xff\xb9\xbe"
+ "\x9e\x7b\xd5\x74\x6d\x46\xd4\x75\x5d\x30\x90\x2e\x48\xb3\xfa\xaf"
+ "\x0b\xd6\x94\xfa\xaf\x0b\xd6\x45\xb8\x74\xc1\xba\x08\xef\xba\x60"
+ "\xed\x36\x4f\x5d\x90\x19\x73\x5d\x17\xf4\xa7\x0b\x32\x8c\xfe\xeb"
+ "\x82\xb5\x06\x4f\x5d\xb0\xee\xa8\x6f\xba\x60\xed\xe9\xa1\xd7\x05"
+ "\x6b\x1d\x9e\xba\x60\x5d\xb5\xc8\xff\x71\x83\xd7\x05\xeb\xb6\x7b"
+ "\xd7\x05\xeb\xfe\xe6\xa9\x0b\xd6\xad\xe3\x32\x7f\x5d\x13\xd7\x05"
+ "\xeb\x8a\x78\x7a\x66\xb8\x7b\xba\x4b\x17\xf0\x74\xae\x0b\xd6\x59"
+ "\xae\xaf\xf3\x5e\xab\xba\x20\x6b\xa6\xff\xb2\xca\xd8\xe4\x92\x55"
+ "\xc6\x26\xef\xb2\xca\x18\xe3\x29\xab\xb2\x9c\xd7\x65\x55\x7f\xb2"
+ "\x6a\x9d\xc3\x7f\x59\x65\xec\xb1\xfe\x9b\xed\xe3\xfa\xaf\xd1\xeb"
+ "\xfa\xaf\xff\xb2\xca\xd8\x63\xfd\x37\x5b\x5c\xff\xcd\x3a\x30\x78"
+ "\x59\x95\x3d\xc7\xbb\xac\xca\xee\xb1\xfe\x9b\x2d\xae\xff\x66\x8b"
+ "\xeb\xbf\xd9\xe2\xfa\x6f\x56\xb5\x7b\xba\x4b\x56\xf1\x74\x2e\xab"
+ "\xb2\x2f\x71\xfd\x37\x57\xe1\x5a\xff\xcd\x65\x67\x06\x84\xa2\x8d"
+ "\x9a\xde\xeb\xbf\x1b\x56\xe2\xfa\xaf\xab\x4f\xe4\xdc\xc8\xd6\x82"
+ "\xb1\x5f\xd8\xb8\x5f\x91\x3e\xd7\x85\xc7\x6c\xd4\x5c\x5f\x17\x1e"
+ "\x8a\x75\xe1\x0d\x3d\xfc\xf9\xe4\xfe\xcd\xb7\x7e\xb2\x61\xef\xd0"
+ "\xaf\x0b\x6f\xa8\xf7\xec\x27\xb9\xc5\x62\xdf\xf5\x63\x5d\x38\x77"
+ "\xb5\xf7\x7e\x92\xfb\x5b\xcf\x7e\x92\x2b\xee\xcb\xcd\x2d\xe7\xfd"
+ "\x24\x77\xb1\xd8\x7f\x9a\xdc\xd3\x5d\xfd\x24\xdb\x6d\x5d\x38\xb7"
+ "\xd2\x17\x9d\xee\x50\x15\xce\x46\x1d\x3d\xa9\xf1\x61\x67\x37\x9e"
+ "\x93\x44\x3c\xf7\xa5\xd3\x9f\xe7\xb2\x1f\x71\xdc\xb5\x35\xc6\x36"
+ "\xa0\x4e\x6f\x11\x75\x7a\x7c\x6f\x9d\x2e\xe9\x73\xc4\xf3\x9b\x3e"
+ "\xad\x09\xf7\xc0\xf5\xa0\xf4\xf9\x5d\xf5\x97\x82\x6b\xc4\xb4\xa7"
+ "\x3e\xf7\x17\xd7\xf9\x57\xe9\xfc\xcb\x0f\x69\x4d\x38\xb7\xde\xff"
+ "\xb1\x5d\xc1\x55\x3a\xff\xf2\x43\x9a\xa7\xce\xbf\x84\xf3\x2f\x85"
+ "\xfd\x9e\x7f\xb9\x3e\x37\x81\xf4\x2d\xd8\xe7\x3f\x7d\x7f\xe7\x35"
+ "\xfe\xeb\xc0\xb6\xcd\xa6\x36\x97\xbd\xbf\xa9\x4d\xb2\x6d\x24\x7f"
+ "\x69\x20\x33\x15\x79\x89\x70\x5d\x20\x64\x43\x22\xf3\xf5\xad\x34"
+ "\xb5\x1c\x26\x86\x34\xb4\x77\x36\x2d\x88\x4e\x71\xb7\x77\x7e\x2f"
+ "\x93\x6c\x9d\x68\xb4\x83\xc0\xae\x41\x9b\x46\xb2\xf1\xd1\x37\x4e"
+ "\xbf\xfb\x41\xef\x8c\xb1\xe1\x98\xa0\x2b\xb8\x70\xf6\xbf\xfe\x78"
+ "\x60\xe3\x04\xff\xc7\x03\x9b\x7a\xec\x7f\x7b\xdd\xc7\xfd\x6f\x9b"
+ "\xbc\xee\x7f\xf3\x7f\x3c\xb0\xa9\xc7\xfe\xb7\xd7\xc5\xfd\x6f\xbf"
+ "\x7b\x6f\xf0\x76\xce\xeb\xfd\xec\x7f\x7b\xbd\xc7\xfe\xb7\xd7\xc5"
+ "\xfd\x6f\xaf\x8b\xfb\xdf\x5e\x17\xf7\xbf\xfd\xae\xc2\x3d\xdd\x65"
+ "\xe7\xf0\x74\x6e\xe7\xbc\xee\xd3\xfe\x37\xb0\x73\x62\x2f\xc1\xce"
+ "\xb1\xff\x70\xec\x1c\xdd\x35\x62\xe7\xfc\xa7\xd7\xf8\x87\x6e\x7a"
+ "\x62\x76\x0f\x3d\x61\xfb\xdf\xa5\x27\x5e\xbf\x84\xbd\x6f\x45\xfd"
+ "\xee\xff\x67\xf4\xcd\x75\xa3\x2f\xca\x68\x91\xb6\xce\x09\x31\x36"
+ "\xbf\xe8\x0b\xb2\x79\x4b\xda\x0f\x85\xb6\xff\x39\xd3\x7f\xda\x6e"
+ "\xae\xba\x6e\xe3\x0c\x44\xdf\xa2\x1d\xfe\xd3\xf7\x4d\xad\xff\x36"
+ "\xce\x16\xeb\xa7\xdd\x36\xce\x16\x6b\x4f\x1b\x07\x6d\x9a\x27\xec"
+ "\xdc\xd6\xd9\x00\x36\x4a\xce\x52\xb0\x77\x92\x09\x31\xb5\xec\x26"
+ "\xb9\x60\xf3\xe4\x9c\x01\xbb\x67\x31\xd8\x3d\x8e\x6d\xa2\xdd\xb3"
+ "\x25\xc1\xd3\xee\x79\xf3\x62\x9f\x76\x4f\xb0\xcb\xee\x71\x80\x4d"
+ "\xd3\xb5\x2d\xc6\x56\x78\xc6\xcd\x06\x7a\xa9\xb7\x0d\xd4\x99\x07"
+ "\x3a\xe7\xce\x18\x7b\x17\xd8\x41\xfd\xd9\x40\x8c\xf7\x3d\xec\xa0"
+ "\x1f\x9e\x0d\xf4\x86\xd2\x7f\x1b\x68\x4b\x84\xa7\x0d\x54\xb2\xc5"
+ "\x37\x1b\x68\xcb\xdb\x5e\xe7\x7a\xfc\xb6\x81\xb6\x54\x7a\xda\x40"
+ "\x25\x46\x11\x17\x5b\x06\x6f\x03\x95\x2c\xf2\x6e\x03\x95\xbc\xe2"
+ "\x69\x03\x95\x4c\xe3\xb6\x4e\x49\x31\xb7\x81\x4a\x62\x79\xfa\x9b"
+ "\xc5\xee\xe9\x2e\x1b\x88\xa7\x73\x1b\xa8\xa4\xcc\xc7\xf5\x9b\xd9"
+ "\x0e\xd0\xb1\x57\x7f\xdf\x5c\x7f\xeb\x37\x43\xb5\x6f\xee\xae\x6b"
+ "\x64\xfd\xa6\xb4\xdf\xf8\x87\xd7\xf5\x74\x49\xa5\xff\x7a\xe4\x8f"
+ "\x57\x69\xff\xff\x0f\x49\x4f\x97\xce\xf6\x9f\xbe\xff\xd5\xef\xfe"
+ "\xff\xfe\xf5\xf4\xb6\x14\xd7\x5c\xc4\xb6\x94\xc1\xcd\x45\x6c\x3d"
+ "\xed\xa9\x93\xff\x3b\xef\xfa\x5c\x84\xaf\x7a\xf8\x8f\xe5\xfe\xeb"
+ "\xe1\xad\x15\x9e\x7a\xf8\x4f\x77\xfa\xa6\x87\xb7\x3d\x30\xf4\x73"
+ "\x11\xdb\xa6\x79\xea\xe1\x3f\x49\x58\x98\x3e\x78\x3d\xbc\xed\xac"
+ "\x77\x3d\xbc\xed\xa2\xa7\x1e\xde\x56\xc3\xf5\xed\x9f\x26\x70\x3d"
+ "\xbc\xcd\xcc\xd3\xff\x7b\x9a\x7b\xba\x4b\x0f\xf3\x74\xae\x87\xff"
+ "\x14\x31\xb8\x35\x97\x5b\xaf\xd1\x35\x17\xed\xbf\xd8\x9a\xcb\xff"
+ "\x2d\xbc\xae\x27\x06\xd2\x13\x7f\x9a\xe6\xbf\x9e\x28\xb3\xfa\xaf"
+ "\x27\xfe\x52\xea\xd2\x13\x7f\x29\x1d\x9c\x9e\xf8\xcb\x8d\x9e\x7a"
+ "\x62\xfb\xbb\xd7\xf5\x84\xaf\x7a\xe2\xff\x36\xfa\xaf\x27\xfe\x6c"
+ "\xf6\xd4\x13\x3b\x9e\xf0\x4d\x4f\xfc\xe5\xd9\xa1\xd7\x13\x7f\x59"
+ "\xec\xa9\x27\x76\x44\x8a\x58\x58\x32\x78\x3d\xb1\x63\x8c\x77\x3d"
+ "\xb1\xe3\x36\x4f\x3d\xf1\x17\x1b\xd7\x07\x3b\x66\x72\x3d\xb1\x43"
+ "\x4c\xdf\xbe\xd8\x3d\xdd\xa5\x27\x78\x3a\xd7\x13\x3b\x62\xaf\xef"
+ "\xb7\xbb\x56\xf7\xdb\xbd\x5d\xe9\xbf\x2c\x2b\x9f\xe9\x92\x65\xe5"
+ "\x33\xbd\xef\xb7\x7b\x67\xaf\xe7\x7e\xbb\xbf\x2e\xb9\xbe\xdf\xae"
+ "\x3f\x59\xb5\x63\xb1\xff\xb2\xea\x9d\x5c\x4f\x59\x55\x7e\xd1\x37"
+ "\x59\x55\x1e\x34\xf4\xb2\xaa\x5c\xe3\x29\xab\xca\x5b\x44\xfe\xff"
+ "\x6c\xf0\xb2\xaa\x7c\xbf\x77\x59\x55\x5e\xeb\x29\xab\xca\x4b\xb9"
+ "\x4c\x2a\xb7\x73\x59\x55\xbe\x93\xa7\xff\x35\xd2\x3d\xdd\x25\xab"
+ "\x78\x3a\x97\x55\x7f\xf3\xc9\xff\xbf\x6b\x7d\xcd\x2f\x9b\xf6\x0a"
+ "\xac\xaf\x0d\x95\x4d\x7b\xad\xac\xaf\xfd\xcf\xf5\xf5\x9f\x7e\xed"
+ "\xd9\xbf\x5d\x82\xdf\xff\xff\xd7\xef\xfa\x4f\xff\x3a\x60\x97\xd1"
+ "\xa5\x03\x76\x19\xbd\xad\x4f\xe4\x00\x86\x72\xc1\x1e\xcd\x3e\x43"
+ "\x14\x1b\x70\x7d\xa2\xa1\x96\xe4\xe1\xfa\xc4\x52\x69\x7d\x62\x8b"
+ "\x68\xe3\xbe\xeb\xf4\xb4\x71\x77\x6e\xee\xcb\xc6\x45\xdb\xd6\x09"
+ "\x76\xab\xa3\xe7\xba\xc4\x7f\xf4\xad\x3b\x3a\x83\x0b\x63\x2f\x6e"
+ "\x8b\xb1\x0f\x46\x77\xbc\xb9\x8a\xeb\x8e\x37\x7e\x50\xba\xe3\x7f"
+ "\x76\xf8\xaf\x3b\xde\xed\x11\xcf\xf7\xef\x0f\xf8\xa6\x3b\x76\x4d"
+ "\x1f\x7a\xdd\xb1\x6b\xb6\xa7\xee\xf8\xbb\x56\xc4\xc3\x43\x83\xd7"
+ "\x1d\x7f\x97\x79\xd7\x1d\x7f\x0f\xf2\xd4\x1d\xbb\xc4\xbd\xa6\x7f"
+ "\x9f\xc2\x75\xc7\x2e\x2b\x4f\xdf\x39\xd5\x3d\xdd\xa5\x3b\x78\x3a"
+ "\xd7\x1d\x7f\x8f\x1a\xdc\x7c\x48\xe8\x35\x3a\x1f\xa2\xfe\x17\x9b"
+ "\x0f\xa9\xb8\x84\xf3\x6f\xef\xcf\xa8\xe9\xde\x3f\xff\xfe\x8c\x5e"
+ "\xe3\xf5\x64\xb0\x75\xdb\xf9\x9a\x6b\xf7\x78\xdd\x7c\x54\x94\x65"
+ "\xff\xd8\xed\x29\xcb\xde\x4b\xf0\x26\xcb\xfa\x5b\x57\xc5\xf1\xb9"
+ "\x13\xe4\x9c\x63\x8b\x9f\xeb\xaa\xc9\x3f\x24\xf9\xf5\xf7\xd9\xfe"
+ "\xcb\xaf\x7f\xf4\xf0\x7f\xfa\xbe\x8f\xfe\x4f\xdf\xf7\xea\xff\xd4"
+ "\xe1\xf7\x1e\xfa\xf7\x7b\xf8\x3f\x7d\x5f\xf4\x7f\xfa\x9e\x1f\xe7"
+ "\xe2\xde\xdf\xeb\x5d\x7e\xbd\xdf\xc3\xff\xe9\xfb\xe2\xfa\xe9\xfb"
+ "\xa2\xff\xd3\xf7\x45\xff\xa7\xef\x85\xbb\xa7\xbb\xe4\xd7\x7b\x6e"
+ "\xe7\xe2\x2a\xfb\xf5\x7f\x4a\x73\xe7\xc6\x16\xca\x85\x72\xb8\x2a"
+ "\xa0\x8e\x63\x00\x03\x55\xf0\x7f\x35\xf0\x71\x14\xfc\xef\xd5\x67"
+ "\xb0\x35\x78\x6e\xac\x90\x09\x75\x96\x13\x99\xc9\xfa\x7d\x55\xd5"
+ "\x58\x07\x7c\xb7\x32\x83\xf3\x6a\x6e\x6c\xa8\x63\xf8\x0c\x81\xea"
+ "\x09\xf0\x25\x96\xc5\x57\x83\xfc\x21\x80\x19\x6d\x32\x09\x39\x23"
+ "\xab\x2c\x95\xf2\x41\x7d\x43\x9a\x65\x95\xcf\x62\x19\x50\xd7\x1d"
+ "\x66\x59\xa5\xca\x6b\x5d\xa1\xac\xe8\xed\xe3\xc9\x6a\x07\x3d\x51"
+ "\xb5\xb4\x9d\xb4\xc8\x2a\xcf\x87\xb6\x0d\x9f\x41\xd3\x63\x09\xda"
+ "\x58\xe5\x63\xad\x0a\x2c\x13\x63\x2f\xc2\xb3\x46\x7c\xe6\x84\x3a"
+ "\xa6\x2d\x21\xf2\xfc\xf6\xe1\x4a\x90\x05\x81\xe9\x36\x6a\x59\xe6"
+ "\x80\x3a\xa7\x38\xc8\x9e\xf1\x8d\x8a\x77\xde\x80\x34\x27\xd1\x60"
+ "\x7c\x3b\x2c\x03\x6c\x4c\xac\xcf\xc5\x12\xc8\xdf\x57\x1d\x7e\xfb"
+ "\x57\x32\x29\x70\x22\x35\x0f\x0e\x37\xbb\xbd\x9e\x7f\x0b\x5d\x33"
+ "\x9e\x54\xdd\x0d\xb4\xd3\x12\x79\x5f\xcf\x07\xf9\x9d\x9d\xfd\xc8"
+ "\x44\x25\xc6\xc1\x4c\xdf\x4c\xe4\x05\xc2\x70\xe5\x47\xa9\x2c\x56"
+ "\xa5\xb5\x23\xeb\x03\xad\x59\x36\xb1\x1a\x69\x8e\x31\xd3\x30\xf6"
+ "\x2f\xe0\x86\x40\x7a\xe4\xde\x14\x42\x7a\xf2\x22\x31\x7e\xc9\x02"
+ "\x6d\xd2\xa2\x25\x09\xcb\x96\x27\x69\xef\x8c\x1f\x41\x66\x2f\x5b"
+ "\xa6\x5d\xb2\x60\xe9\x4a\xad\xfb\x93\x07\xb5\xf1\x8b\x5e\x5d\xf0"
+ "\xfc\xe2\x84\x7b\x96\xbc\x60\x18\x01\x75\x22\x6e\xf5\x08\xc3\xba"
+ "\x08\x59\x1f\x4c\x2b\xf9\x1d\x21\xbf\x1f\x4d\x14\x58\x2f\xf8\x5e"
+ "\x99\x14\x1f\x0f\xe3\xc3\xc9\x21\x4f\x3a\xc8\xc0\x82\xb4\xe1\x90"
+ "\x77\xf7\xce\xb7\xa0\x5e\x25\x50\x6f\xa8\x23\xd6\xb9\x41\xaa\xb3"
+ "\x84\x89\x74\xc4\x44\x5a\x3b\x60\xf0\x83\xf3\xa1\xf6\xe1\xff\x4e"
+ "\x69\x2c\xb6\xcf\x06\xfd\x44\xd6\x2a\xdb\x33\x1d\xf5\x12\xcd\x9b"
+ "\x1b\xdb\x91\xb5\x47\x2d\x61\x0c\xdf\xa5\xf9\x73\xb5\x1d\xd8\x4f"
+ "\xa8\xfe\xe7\xbc\x4f\xed\xb1\xcc\xd1\xc9\x08\x8f\xcf\xb7\x67\xaa"
+ "\x2b\x3e\xdf\x1e\x0b\xd2\x16\xea\xd1\x06\xe9\xb3\xcd\xa4\xab\x1e"
+ "\xd3\x31\x4e\x24\xc6\xd9\xc3\x3a\x43\xbb\x40\x2f\xd2\x2a\x9a\x29"
+ "\x62\xdf\xb8\x2d\x52\x30\x7e\x58\x6e\x52\x5c\x20\xd1\x0e\xda\x45"
+ "\xb3\xb7\x45\xd6\xd9\x6c\x24\x74\x8d\xe1\x05\x3a\xec\x83\x39\xa1"
+ "\x8e\x45\x09\x18\x1f\x50\xc8\xfe\xb0\x9c\x66\x57\x26\xcd\x99\x48"
+ "\xd4\x50\x76\xb9\x5b\x9c\x40\xc5\xe0\xf8\xbf\x87\xf1\x1f\xf9\x88"
+ "\xf1\xff\x38\x1f\xab\xc8\xde\xa4\xde\x7c\xec\xc6\xdf\x76\x81\xec"
+ "\x07\x2c\x50\x55\x56\x69\xb4\x93\xd3\x11\xfb\xee\xb9\x74\x3d\xb9"
+ "\x97\xd1\xae\xaa\x42\xc8\xcf\xca\x10\x72\xb3\x2a\x68\x6e\xd6\x56"
+ "\xa0\x59\x64\x7e\x32\xd1\xce\x77\xaa\x49\xde\x05\x12\x61\xcd\xcb"
+ "\x2a\x0d\x96\x65\xc8\xc0\xb6\x90\x83\xde\x88\x00\x99\x11\x21\xf6"
+ "\xf7\x48\xa4\xe3\xc7\x6d\x84\x3c\xf9\x2a\x21\x27\xa6\x92\x80\x12"
+ "\x78\x6f\x70\xed\xa9\xe2\xfe\x9f\xb2\xaa\xa6\xbe\x05\xef\x62\x9c"
+ "\xc7\x41\xbe\xbf\xcf\x6b\xbf\xeb\x6e\xf7\x7a\x6d\xdf\xed\xde\x5b"
+ "\x2e\xe4\xaf\x87\xf1\xe6\xfa\x48\x9a\xbb\x7e\x42\xef\x76\xaf\xd7"
+ "\xf2\x76\x07\xb6\x0f\x7d\xbb\xf7\xa6\xf2\x76\xef\x9d\xe2\x5f\xbb"
+ "\xf7\x7a\x9d\xff\x73\x6b\xb7\x17\x7e\x7f\x58\x06\xed\x06\x7e\xaf"
+ "\x07\x7e\xaf\xef\x83\xdf\xeb\x45\x7e\x8f\x6c\x1e\xfa\x76\x7f\x98"
+ "\xc4\xdb\xfd\xe1\x24\xff\xda\xfd\xa1\x57\xf9\xe7\x6a\xb7\xd1\x0b"
+ "\xbf\x3f\x2a\x15\xf2\x8d\xc0\x6f\x23\xf0\xdb\xd8\x07\xbf\x8d\x22"
+ "\xbf\x47\x1d\x1a\xfa\x76\x7f\xc4\xe7\xff\xb3\x3e\x9a\xe0\x5f\xbb"
+ "\x3f\xda\xe1\x43\xbb\xbd\xf0\x7b\x5f\x11\xb4\x1b\xf8\x6d\x04\x7e"
+ "\x1b\xfb\xe0\xb7\x51\xe4\xf7\x4f\x73\x86\xbe\xdd\xfb\xb8\xff\x9b"
+ "\xac\x7d\xe1\xfe\xb5\x7b\xdf\xd6\x81\xdb\x9d\xed\x85\xdf\xfb\x0b"
+ "\x85\xfc\x6c\xe0\x77\x36\xf0\x3b\xbb\x0f\x7e\x67\x8b\xfc\x7e\xe6"
+ "\xd1\xa1\x6f\xf7\xfe\x79\xbc\xdd\xfb\xc3\xfc\x6b\xf7\xfe\xe2\x81"
+ "\xdb\x9d\x55\x06\x32\xbb\x17\xcf\x4d\x29\x91\x64\xf2\x05\x6c\xff"
+ "\xc7\x84\x06\x67\x95\x8d\x5c\x93\x21\x73\xa8\xb2\x76\x8c\x6c\x22"
+ "\x72\x18\xfb\xe9\x43\xcd\x24\x08\xda\xaa\xa7\xf9\x1b\xa2\xf0\x57"
+ "\x80\x72\x1c\x20\xfb\x9d\xaa\xac\xad\x9d\xb9\x73\x23\x37\x2c\x24"
+ "\xda\x74\x2b\x51\xd7\xa5\x99\x49\x9a\x81\x5a\xeb\xc8\x37\x24\xd8"
+ "\x4c\xe4\x38\x8f\xf5\x69\x5b\x05\x59\x9a\x48\x69\xab\xec\x9f\x27"
+ "\x71\xbc\x98\xdf\x4a\x22\xc0\x26\xce\xa0\xa0\x3f\x0a\x05\xa2\x85"
+ "\xf2\x23\x90\x96\x50\xf6\xa3\xa1\xb3\x89\xec\x83\xe7\xed\x04\xe9"
+ "\x89\xb4\x85\xb1\x65\x04\xa3\xab\x8d\x90\x5f\x3d\xc3\xe9\xfa\xe6"
+ "\xc2\xc1\xd2\xf5\x9f\x3b\xb9\x5d\x99\x55\x65\x32\x77\x12\xb0\x2d"
+ "\xd5\x78\xae\x19\xd2\x0d\x75\x86\x76\x18\x87\xfc\x33\x8c\xe6\x65"
+ "\x95\x0b\xa0\xb3\x06\x57\xee\xc7\x5e\xf7\xbf\xb9\xc9\x53\x1d\xc8"
+ "\xcc\x5e\x58\x73\xd1\xbb\xda\x40\x83\xd7\xeb\x38\xbd\xd7\x4f\x1a"
+ "\xd9\x14\xd8\xde\x37\xbd\xd7\xeb\x1c\xa0\x73\x9c\xaa\xf5\x13\x7c"
+ "\xa7\x77\xf5\xd3\x9e\xf4\x5e\x4f\xae\x0c\xbd\xab\xb9\x1f\xb1\xdc"
+ "\xf5\x51\x9e\xf4\xfe\xd8\xcc\xe9\xfd\xf1\x3a\x9a\xb7\x3e\x42\x00"
+ "\x5d\x39\xc8\x72\xbd\x9e\x7f\x74\xa3\x37\xe0\xbb\xb7\x0e\x73\xd1"
+ "\xfb\x80\x19\xe8\x2d\xe2\x7b\x3d\xe0\x7b\x64\xb3\x17\x7a\x03\xbe"
+ "\xd7\x03\xbe\xd7\x0f\x02\xdf\x07\x0e\xf4\xa0\xf7\x15\xc2\xf7\x01"
+ "\x31\xfe\xd3\xfa\x1e\xf8\x3e\x30\x8b\xd3\xbb\xda\x06\xf4\x06\x7c"
+ "\xaf\x1f\x24\xbe\x0f\xb4\xf9\xa0\x3f\x00\xdf\xbd\x75\xa7\x8b\xde"
+ "\x9f\xce\xa2\xc1\x46\x11\xdf\x46\xc0\xf7\xa8\x43\x7d\xd3\xdb\x08"
+ "\xf8\x36\x02\xbe\x8d\x83\xc0\xf7\xa7\x3f\xf3\xa4\xb7\xf1\x0a\xe1"
+ "\xfb\x53\x05\xa7\xb7\xb1\x07\xbe\x3f\xa9\xe2\xf4\xfe\x24\x9e\xe6"
+ "\x19\x01\xdf\xc6\xc1\x96\x3b\xcf\x07\x7a\x03\xbe\x7b\xeb\x6c\x17"
+ "\xbd\x6b\xaa\x80\xde\x22\xbe\x8d\x80\xef\x9f\xe6\x78\xa1\x37\xe0"
+ "\xdb\x08\xf8\x36\x0e\x02\xdf\x35\xdb\x7b\xd0\xfb\x0a\xe1\xbb\x26"
+ "\x49\xa4\x77\x0f\x7c\xd7\x44\x70\x7a\x7f\xda\x00\xf4\x06\x7c\x1b"
+ "\x07\x89\xef\x9a\x1a\x1f\xec\x04\xc0\x77\x6f\x5b\xc1\x45\xef\xba"
+ "\x08\x1a\x9c\x2d\xe2\x3b\x1b\xf0\xfd\xcc\xa3\x7d\xd3\x3b\x1b\xf0"
+ "\x9d\x0d\xf8\xce\x1e\x04\xbe\xeb\xc6\x78\xd2\x3b\xfb\x0a\xe1\xbb"
+ "\xb6\x85\xd3\x3b\xbb\x07\xbe\x6b\x4b\x39\xbd\x6b\xa7\xd1\xbc\x6c"
+ "\xc0\x77\xf6\x20\xcb\xad\xf3\x7a\xfe\xb7\x3f\xfb\xe4\xd5\x2d\x44"
+ "\xe9\x49\x73\xd3\xd6\xcb\x67\xa3\x98\xf2\xae\x8e\x8d\x62\x8a\xed"
+ "\xdb\x46\x31\x85\x71\x9a\xd7\x55\xf8\x67\xa3\x98\xca\xfd\xb1\x51"
+ "\x7a\xd3\xfc\xa0\xe6\xf2\xd9\x29\x07\x65\x57\xc7\x4e\xa9\xaf\xe9"
+ "\xdb\x4e\xa9\x37\x72\x9a\xd7\x4f\xf2\xcf\x4e\x39\x38\xc1\x1f\x3b"
+ "\xa5\x37\xcd\x0f\xe5\x5e\x3e\x5b\xe5\xd0\xf2\xab\x63\xab\x1c\x8a"
+ "\xea\xdb\x56\x39\xe8\xe0\x34\x3f\x58\xea\x9f\xad\x72\xa8\xc8\x1f"
+ "\x5b\xa5\x37\xcd\x1b\xc8\xe5\xb3\x57\x3e\x3b\x79\x75\xec\x95\xcf"
+ "\x76\xf6\x6d\xaf\x7c\x26\x8e\x7f\x3e\x0b\xf3\xcf\x5e\x69\xf0\x61"
+ "\xfc\xd3\xdb\x5e\xe9\x4d\xf3\xc3\x49\x97\xcf\x66\x39\xfc\xec\xd5"
+ "\xb1\x59\x0e\xeb\xfa\xb6\x59\x1a\x5a\x38\xcd\x1b\x8c\xfe\xd9\x2c"
+ "\x87\x33\xfc\xb1\x59\x7a\xd3\xfc\x73\xcb\xe5\xb3\x5b\x3e\x3f\x78"
+ "\x75\xec\x96\xcf\x8b\xfb\xb6\x5b\x3e\x8f\xe5\x34\x3f\xec\xf0\xcf"
+ "\x6e\xf9\xdc\xe6\x8f\xdd\x82\xb4\x46\x9a\xa3\xad\xc2\x69\x7e\xa4"
+ "\x82\x86\x64\x65\x74\x81\x3d\x12\x0c\x74\x0f\x6e\x23\xf2\x2d\x48"
+ "\xf3\x46\x4e\x73\x67\xc8\x86\x28\xa0\x8f\x1e\x69\xc6\xda\xf1\x9d"
+ "\x26\xc4\x99\x9b\xb5\x83\xca\x09\xb4\x45\x49\x5a\x65\x5f\xec\x77"
+ "\x64\x92\x10\x6d\xda\x1a\xf8\xff\x08\xf3\x9f\xa9\x4d\xcb\x3a\x0a"
+ "\x6d\x0c\xc0\x35\x0a\x47\xde\x1c\xb3\x33\x38\x27\x0e\x9e\x05\xd2"
+ "\x71\x31\xe6\x2e\xb0\x25\xe8\xcb\x9a\x30\x53\x5b\x39\x31\x39\x3e"
+ "\x21\x75\x8d\xff\x20\x42\xc8\x86\x47\xef\x75\x10\x1d\xfd\x4e\x17"
+ "\x56\x93\x64\x26\xce\x17\x34\x2a\x53\x4a\x35\xe0\xe2\x7f\x48\xb4"
+ "\x85\x5e\xa0\xdf\xea\x54\x5d\xc1\x05\xa5\xce\xe0\x0d\x5a\x67\x5e"
+ "\xa1\xde\x11\x5c\x50\xf8\x76\xb2\x59\xae\xb2\x13\xdd\xe2\x16\x4a"
+ "\xf3\x9f\x27\x8a\xfc\x66\xa2\x2c\x78\x9e\xa8\x0a\x9a\x89\xba\xa6"
+ "\xa5\x91\xd4\x9e\xaa\x26\xb5\xed\x47\x48\xed\x05\xb8\x3a\xe1\x12"
+ "\xe0\xca\x38\x42\x6a\x60\xf4\xf8\xc4\x69\x42\xd2\x5b\xa8\xf5\xc7"
+ "\x4d\x24\xac\xc6\xd1\x48\x70\x1f\xef\x19\x59\xe3\x66\x55\x1c\x09"
+ "\xa3\xdf\x6a\x08\x7d\x41\x23\x87\x67\x0a\x4c\x37\x39\xac\xa4\xa6"
+ "\xc5\x8e\xcf\x53\xe0\xb9\x22\xbd\x05\xca\x17\xaa\xd1\x5f\x9c\xb5"
+ "\x26\xe3\x00\xb4\x2f\xb0\x1e\xe8\x5c\x21\xd9\x64\xf9\x9d\x24\xa2"
+ "\x00\xd8\x8c\x98\x89\xa6\x1c\x33\x6f\x75\x0e\x16\x33\x8d\xdc\xff"
+ "\xd9\xcb\x9a\xd1\x40\xef\xb1\xc2\xcb\xb1\xea\x27\x8f\x1c\xa3\xb8"
+ "\x4f\x0b\xd7\x67\xea\x6c\x9f\x10\xd3\x3a\x81\x44\xaf\x24\x64\xa6"
+ "\x93\x10\xa4\x09\xae\x25\x3f\x69\x20\xa1\xb8\x7f\x4c\xf8\x4e\x37"
+ "\xda\xd4\x62\x25\xab\x1d\x50\xd7\x33\xf6\xee\xba\xd6\xad\xab\x23"
+ "\xf0\x6c\x6c\x9d\xde\x4c\x54\x06\xa2\x46\x3a\x83\x2d\x5a\xf6\xa4"
+ "\x85\x04\x2d\xb5\x51\x8a\x34\x46\xda\x22\x9d\xb1\x3c\x89\xf6\xa6"
+ "\x78\x2b\x49\xb7\x13\xb5\x29\x0d\x7e\x53\xa8\xd5\x44\xce\x12\xa8"
+ "\xe3\x0e\x1a\x1c\x58\x0f\xf8\x98\x86\x98\x30\xcb\xbe\xa8\x04\x1c"
+ "\x8c\xa6\x59\x5f\x18\x4a\xa0\xbd\xb8\x86\x3f\xb8\x36\x1f\xf1\x65"
+ "\xfd\xa3\x97\x4d\xe8\xc2\xf3\x7a\x1d\xc7\x73\x93\x91\x86\xac\x27"
+ "\x5d\x60\xeb\x71\x3c\x07\xb6\x0f\x8c\xe7\xf5\x93\x5c\x78\xfe\xf2"
+ "\x75\x17\x9e\x9b\x56\x7a\xc7\xf3\x57\x87\x39\x9e\xd7\x47\x5d\x9b"
+ "\x78\xfe\x6a\x51\xff\x78\xfe\x6a\x86\x77\x3c\xaf\x8f\x94\xec\xdd"
+ "\xa1\xc1\xf3\x57\xa5\x57\x0e\xcf\xeb\x75\xfe\xe1\xf9\xab\x54\x4f"
+ "\x3c\x7f\x99\xcb\xf1\xfc\x65\x94\x7f\x78\x6e\xf2\x1a\xff\xa0\x3f"
+ "\x7b\xdb\x0d\xcf\xa2\x7c\x3e\x16\x0b\x78\x06\xf9\xbc\x5e\x94\xcf"
+ "\x23\x9b\x7d\xc0\xb3\x9b\x7c\x3e\x9a\xe0\xc2\xf3\xb1\x5f\x7a\xc7"
+ "\xf3\xd7\xdb\x44\x3c\x5f\xa3\xf2\xf9\xeb\x9f\xf5\x8f\xe7\xaf\x35"
+ "\xfd\xe0\xb9\x42\x1a\x4b\x0c\x0d\x9e\xbf\x36\x5c\x41\x3c\xfb\x29"
+ "\x9f\xbf\x9e\xe9\x89\xe7\xa3\xf3\x38\x9e\x8f\xaa\xfd\xc3\xf3\x31"
+ "\xaf\xfb\x9f\xfb\x1b\xcb\xb8\xf0\x6c\x14\xe5\x73\xb3\x8e\x86\x18"
+ "\x41\x3e\x1b\x45\xf9\x3c\xea\xd0\xc0\x78\x36\xba\xc9\x67\xf3\x03"
+ "\x2e\x3c\x37\x8f\xf1\x8e\xe7\x6f\x96\x73\x3c\x1b\xaf\x51\xf9\xfc"
+ "\x4d\x50\xff\x78\x36\x5b\xbc\xe3\xd9\x18\x29\x8d\xd3\x86\x06\xcf"
+ "\xdf\x44\x5d\x39\x3c\x1b\xfd\x94\xcf\xdf\x84\x7b\xe2\xd9\x3c\x89"
+ "\xe3\xf9\x98\xd9\x3f\x3c\x37\x7b\x8d\xff\xd3\xdf\x38\xd1\x0d\xcf"
+ "\xa2\x7c\x6e\xb1\x03\x9e\x41\x3e\x1b\x45\xf9\xfc\xd3\x1c\x1f\xf0"
+ "\xec\x26\x9f\xbf\x0d\x74\xe1\xb9\xe5\xa4\x77\x3c\xb7\x4c\x17\xf1"
+ "\x7c\x8d\xca\xe7\x6f\x8f\xf4\x8f\xe7\x6f\x2b\xfa\xc1\x73\x85\x34"
+ "\x06\x1e\x1a\x3c\xb7\xa8\xaf\x20\x9e\xfd\x94\xcf\xdf\xb6\x79\xe2"
+ "\xb9\xd9\xc1\xf1\xdc\x5c\xee\x1f\x9e\x8f\x7b\xf5\xff\xd6\xdf\x18"
+ "\xdc\x85\xe7\x6c\x51\x3e\x9f\xa8\xa6\x21\xd9\x20\x9f\xb3\x45\xf9"
+ "\xfc\xcc\xa3\x03\xe3\x39\xdb\x4d\x3e\x1f\x3f\xec\xc2\xf3\x89\xf7"
+ "\xbc\xe3\xf9\xc4\x8d\x1c\xcf\xd9\xd7\xa8\x7c\x6e\xdd\xde\x3f\x9e"
+ "\x5b\x8d\xde\xf1\x9c\x1d\x29\xcd\x2f\x0c\x0d\x9e\x5b\xcd\x57\x0e"
+ "\xcf\xd9\x7e\xca\xe7\xd6\x4a\x4f\x3c\x1f\xaf\xe1\x78\x3e\x9e\xe1"
+ "\x1f\x9e\x4f\x78\x8d\x7f\x37\xb8\xf9\x8d\x53\xd5\x38\xbf\xd1\x89"
+ "\xf3\x1b\xae\xbd\x7f\xfa\xd0\x7a\x8e\xe7\x2e\xc0\xf3\x9b\xee\x78"
+ "\xfe\xaa\xe7\xfc\x86\x65\x9b\xd0\x8d\xe7\x53\xbd\xf0\x2c\x00\x9e"
+ "\xbb\x18\x9e\x4f\x1e\x94\xe6\x37\x4c\x6d\xa5\x80\x93\x53\xc4\x34"
+ "\x0b\xb0\x9c\x2f\x62\xf9\x2b\xc0\x32\xd0\x50\x00\x1a\xd7\x34\x35"
+ "\x92\x68\x2b\xa7\x65\x27\xd0\x58\x70\xc7\x71\xa7\x45\x8e\xf8\x45"
+ "\xdc\x4a\x18\xae\x5d\x0a\xd8\x4d\x3c\x48\x6a\x93\xe1\x5a\x05\x57"
+ "\x1a\x5c\xe4\x20\xa9\xb1\x00\x76\x17\xb9\x63\xb7\x5e\xc4\xee\xc9"
+ "\x84\xfe\xb1\x7b\x72\xda\x95\x9b\xcb\x38\xc9\xe7\xbf\xbe\x8a\x55"
+ "\x47\xc7\x1c\xa3\xa6\x94\x46\x11\x9f\xa7\x48\xb4\x83\x84\xd2\x67"
+ "\x74\xa3\x55\xb1\x44\xfd\x9a\x93\xc8\xf3\x9e\x27\xea\xbc\x2f\xa1"
+ "\xdd\x52\xff\x6d\x26\xaa\x4f\xec\xff\x20\x35\xed\x8d\xa4\xe6\xc2"
+ "\x01\x52\x23\xc0\x75\x0a\x2e\xa8\x6b\x74\x82\x7b\xbb\xad\x62\xbb"
+ "\x4f\x3d\x0b\x65\x4d\xf0\xde\xee\x53\x53\x59\xbb\xe3\xa1\xdd\x9d"
+ "\xae\x76\x9b\xa0\x1f\x00\x7f\xc6\x0a\xe2\x7c\x48\xb4\x95\x04\x2d"
+ "\x73\x50\xda\x29\xe2\x1f\xf9\xf3\x49\x83\x9d\x44\x1b\x80\x67\x2f"
+ "\x00\xfe\x5b\xca\x48\x7a\x2a\xe0\xbf\xd3\x8e\xb8\xb3\x9a\x32\x2e"
+ "\x02\xfe\x4f\xa6\x50\xa0\x5f\x17\xe2\xff\x2b\xc4\xbf\xa5\x58\x60"
+ "\xf8\xb7\xcc\xf2\x0f\xff\xa7\x7c\xc0\xbf\x2f\xf3\x21\xa7\xab\x71"
+ "\x3e\xa4\x13\xe7\x43\x5c\x7b\x40\x07\xc0\xbf\xfb\x7c\xc8\x77\x6e"
+ "\xf8\x3f\xdd\x0f\xfe\xdb\x0e\x4a\xf3\x21\x57\x1f\xff\x6d\x03\xe0"
+ "\xbf\xad\x1f\xfc\x0f\xf5\xdc\x47\xdb\x15\xc4\xff\xe9\x01\xf0\x7f"
+ "\xda\x07\xfc\xaf\xd7\xf9\x87\xff\xb6\x1e\xf8\xff\x4e\xc4\xff\x77"
+ "\x7e\xe2\xff\xb4\x2f\xf8\xf7\x61\xfe\xc4\x8a\xf8\x07\xf9\xbf\x7e"
+ "\xab\xdb\x5e\xe0\x81\xf0\xef\x26\xff\xcf\xb8\xe1\xdf\xda\x0f\xfe"
+ "\xbf\x97\xf0\x7f\x0d\xc8\xff\xef\x07\xc0\xff\xf7\xfd\xe1\x7f\x88"
+ "\xe7\x4a\xbe\xbf\x82\xf8\xb7\x0e\x80\x7f\xab\x2f\xf8\xf7\x53\xfe"
+ "\x7f\xdf\x03\xff\x67\x44\xfc\x9f\xf1\x13\xff\x56\x1f\xf0\xef\xcb"
+ "\x7c\xcb\xb9\x6a\x9c\x6f\xe9\xc4\xf9\x16\xd7\x9e\xf0\x01\xf0\xef"
+ "\x3e\xdf\x72\xd6\x0d\xff\xe7\xfa\xc1\x7f\xfb\x41\x69\xbe\xe5\xea"
+ "\xe3\xbf\x7d\x00\xfc\xb7\xf7\x83\xff\xa1\x9e\x5b\x69\xbf\x82\xf8"
+ "\x3f\x37\x00\xfe\xcf\xf9\x80\x7f\xa3\x9f\xf2\xbf\xbd\x07\xfe\xcf"
+ "\x8a\xf8\x3f\xeb\x27\xfe\xcf\xf9\x82\x7f\x1f\xe6\x67\x2e\x20\xfe"
+ "\x41\xfe\x1b\xb7\xba\x9d\x0d\x18\x08\xff\x6e\xf2\xdf\xe6\x86\xff"
+ "\x0b\xfd\xe0\xff\xbc\x84\xff\x6b\x40\xfe\x9f\x1f\x00\xff\xe7\xfb"
+ "\xc3\xff\x10\xcf\xc5\x9c\xbf\x82\xf8\xbf\x30\x00\xfe\x2f\xf8\x82"
+ "\x7f\x3f\xe5\xff\xf9\x1e\xf8\xb7\x89\xf8\xb7\xf9\x89\xff\x0b\x3e"
+ "\xe0\xdf\x97\xf9\x9c\x8b\x6c\x3e\xa7\x13\xe7\x73\x5c\x67\x44\x06"
+ "\xc0\xbf\xfb\x7c\x4e\x87\x1b\xfe\x2f\xf6\x83\x7f\xfb\x41\x69\x3e"
+ "\xe7\xea\xe3\xdf\x3e\x00\xfe\xed\xfd\xe0\x7f\xa8\xe7\x6e\xec\x57"
+ "\x10\xff\x17\x07\xc0\xff\x45\x1f\xf0\x9f\xed\xa7\xfc\xb7\xf7\xc0"
+ "\x7f\x87\x88\xff\x0e\x3f\xf1\x7f\x71\x88\xe6\x7f\xba\x0c\x38\xff"
+ "\x23\xa8\xb2\xb6\x76\x15\xc7\x98\x85\xdc\x82\xd2\x50\x99\x96\x38"
+ "\x54\x39\x71\xa6\x24\x1b\x79\xf2\x3c\xf0\xc4\x70\x9e\x3c\x77\x5e"
+ "\x8d\xf1\x02\x0b\x29\x8c\xff\x3d\xce\x88\xc2\xe5\xc8\x0d\xac\x2f"
+ "\x58\x4a\x14\xce\x90\x0d\xec\x7c\x95\xa9\xd5\x4e\xb0\xcd\xab\x91"
+ "\x06\xa7\x5c\x34\xc0\x39\x38\xfa\xbd\x4e\x5d\x92\x09\x79\x3a\xcd"
+ "\xa4\x05\xf0\x52\xd3\x62\x06\xda\xaf\x62\xd8\x42\x5e\x40\x7d\xd4"
+ "\x6f\x9d\x21\x0a\xc7\xb7\x9a\xb1\xc0\xe3\xb0\xe0\x15\x44\x16\xde"
+ "\x42\x05\xe4\x25\xf2\x08\xf9\xaa\x5d\x85\xfb\x95\xba\x16\xd5\x01"
+ "\xbe\x1d\xdf\xea\xc6\x96\x40\xbe\xa1\x9f\x97\xe9\x62\xeb\x1f\xf0"
+ "\xab\xac\x69\x02\x5a\x66\x75\xfa\xc9\xa7\x2e\x5f\xce\xbf\xf8\x30"
+ "\x4f\xe1\xd4\xe0\x3c\x85\xa0\x5a\x3f\xc1\x37\x3e\xad\xd7\x79\x9c"
+ "\x69\x1d\x72\x3e\x39\x2a\x7c\xe3\x93\x73\x94\x27\x9f\x86\x7a\xfe"
+ "\xc0\x21\xfa\x83\x71\x94\x73\x3e\x75\xd9\xfd\xe3\x93\xd3\xaf\xfd"
+ "\xbf\xbd\xc7\xd3\x42\x15\x8e\xa7\x81\x4f\x3e\xf6\xa7\xf5\x65\x1e"
+ "\x67\x70\x87\x9c\x4f\x42\x9c\x6f\x7c\x12\xde\xeb\xc1\xa7\x21\x1e"
+ "\xe7\x0a\x62\x3c\x68\x21\x96\xf3\xc9\x59\xea\x1f\x9f\x04\x1f\xce"
+ "\x7f\xf8\x30\xee\x93\x13\x3d\x8e\xfb\x04\x18\xf7\xf9\xc6\x27\xa3"
+ "\xce\xe3\xcc\xf0\x50\xf3\x49\x4e\x94\x3e\xf1\x49\x4e\x16\x78\xf2"
+ "\x69\x88\xc7\x63\x72\xc2\xe2\x7f\xc1\x2f\xe1\x7c\xa2\x33\xfc\xe2"
+ "\x93\x9c\x24\x0d\xc9\xf8\x44\x2e\x57\xe3\xf8\x04\xf8\xe4\x63\x7f"
+ "\x32\x96\x79\x9c\x71\x1e\x72\x3e\xc9\xca\x7d\xe3\x93\x3c\xa8\x07"
+ "\x9f\x86\x76\xdc\x20\x97\x35\x70\x3e\xc9\xca\x18\x9f\x72\x88\xd5"
+ "\x3f\x3e\xc9\xbd\xc6\xff\x1c\x94\x1d\x2d\x0f\xa8\x40\x3b\x5a\x00"
+ "\x3b\xda\x37\x3e\x65\xeb\x3c\xce\x64\x0f\x39\x9f\x02\x62\x7d\xe3"
+ "\x53\xc0\xdf\x3c\xf9\x34\xc4\xf6\xad\x3c\x20\x95\xf3\x29\x60\x16"
+ "\xe7\x93\xbc\xc8\x3f\x3e\x05\xf8\xb0\xff\xb3\xef\x73\x58\xbd\x6c"
+ "\x3e\x79\x60\xfc\x35\x65\xf3\xc9\x03\x15\xbe\xf1\x2a\xf0\xd9\xcb"
+ "\x6a\xf3\xc9\x03\x75\x9c\x57\x0a\x07\xe7\x95\x62\x9a\x7f\xbc\x0a"
+ "\x34\xf8\x7b\x7e\xab\x97\xdd\x27\x1f\xae\xbe\xa6\xec\x3e\xf9\x30"
+ "\x1f\xe5\xdf\xf0\xa0\xcb\x6a\xf7\xc9\x87\x89\xf2\x6f\x98\x28\xff"
+ "\x02\xfd\x94\x7f\xc3\x7d\x90\x7f\x7d\x9f\xfb\xea\x65\xfb\xc9\x95"
+ "\x95\xd7\x94\xed\x27\x57\xce\xf3\x8d\x57\xca\x77\x2f\xab\xed\x27"
+ "\x57\x66\x70\x5e\x29\x67\x73\x5e\x0d\x2f\xf6\x8f\x57\x4a\xaf\xf1"
+ "\x5f\x06\x3a\x2f\xd6\xdb\xfe\x1b\x71\x8d\xd9\x7f\x23\x7c\xb4\xff"
+ "\x46\x5c\x66\xfb\x6f\x84\x68\xff\x8d\xe0\xf6\x5f\x4e\x90\x9f\xf6"
+ "\xdf\x08\xbf\xec\xbf\x1e\xbc\x12\xfb\x95\x2a\xec\xda\xb2\x01\x47"
+ "\xee\xf4\x8d\x57\xaa\xe0\xcb\x6b\x03\x8e\x6c\xe4\xbc\x1a\xb9\x83"
+ "\xf3\x6a\x84\xcd\x3f\x5e\xa9\xb4\xfe\x9e\x4f\xeb\x6d\x07\x06\x57"
+ "\x5d\x5b\x76\x60\xb0\x6f\xe3\x5f\x79\xf0\x7b\x97\xd7\x0e\x0c\xe6"
+ "\xe3\x5f\x79\x30\x1f\xff\xe6\xa8\xfc\x1b\xff\xca\x83\x7d\x18\xff"
+ "\xfa\x30\xef\x27\x57\x6b\xd1\x06\x74\xe6\x66\x6d\x0d\x05\xfa\x87"
+ "\xa6\x10\x79\x67\x38\xf0\x4b\x05\xfc\x5a\xa3\x25\x5d\xb9\xc0\x2f"
+ "\xab\x83\x3c\xf9\xca\x31\x5a\xd7\xe6\x24\x9d\xc0\xab\x8b\x60\x07"
+ "\x9a\xac\x16\x3c\xa3\xf7\x6f\xcd\xf2\xd0\xf7\x9e\x79\x45\x4d\x90"
+ "\x5f\x48\x7f\xa7\x2a\xb0\x9e\x02\xbf\x18\xff\x54\x85\x7a\x47\xee"
+ "\x06\xed\x13\xa7\x8f\xd1\x65\x66\x4a\x6b\xf5\x76\xa8\xd3\x1c\x73"
+ "\xad\xbe\x91\x44\xb7\x90\x20\xed\x53\xc8\x97\xd0\x45\x98\x6e\xb2"
+ "\x36\x12\xf4\xfb\xc9\xe6\xc0\x8f\xe9\xc2\x1c\x5f\xe8\x54\xe8\xbf"
+ "\x09\xcf\x15\x4a\x3e\x9a\x4c\xa7\x8a\x18\xff\x7b\xce\xa9\x32\xfe"
+ "\x7f\xa1\x53\xbf\x89\xe7\x13\x87\xdc\x16\x0c\x65\xf3\x7f\xc2\x31"
+ "\xcd\x58\xa9\x8e\xcb\x16\x53\x0a\x75\x1c\x5d\x67\xb3\x12\xac\x67"
+ "\x9d\xad\x8a\xa4\x27\x11\x75\x5d\xa7\x85\xa4\xd9\xa8\xb5\x2e\xe3"
+ "\x24\x89\x3e\x8f\xeb\x02\x88\xa7\xd0\xbf\x71\x7e\x87\x34\x09\xc7"
+ "\x74\x63\xa1\xbc\xb2\xba\x7a\x42\x42\xd7\x00\xad\x1d\x44\xce\xce"
+ "\x6b\xe2\x98\x5f\x2e\xe8\x4d\x19\xcd\x04\x68\x57\x6a\x72\x7c\x89"
+ "\xf4\xd4\xc3\xf3\xa9\xdd\xeb\x0d\x21\x1b\xfe\x0b\xd3\x90\xb6\xb8"
+ "\xcf\xd4\x64\xb0\xb2\x3c\xd2\x73\xce\xbb\x0c\x62\x4a\xe9\x24\x75"
+ "\x0e\x42\xe0\x7b\xc6\x4f\x63\x1b\x01\x5f\x21\x7e\xca\x6d\xf5\xa4"
+ "\x21\x99\xaf\x94\x8f\xce\x40\xbb\xd5\x99\xbb\x7e\x02\xaf\x63\x60"
+ "\xfb\xc0\xf8\x5a\xaf\x73\xe1\x6b\xf4\x98\x4b\xc3\xd7\xa8\x03\x43"
+ "\x8b\xaf\xa1\xb6\x5f\x47\x6d\xba\x34\x7c\x8d\x1e\xc5\xf1\x35\x6a"
+ "\x2a\xc7\xd7\x68\xa5\x0b\x5f\x81\xed\x97\x0f\x5f\x6a\x0b\xc7\x97"
+ "\xba\xcc\x3f\x7c\x8d\xce\x1d\x92\x79\x56\x79\x98\x19\x6d\x6d\xc0"
+ "\x97\x28\xbf\x46\x36\xfb\x80\x2f\x37\xf9\x15\xb6\xf2\xd2\xf0\x15"
+ "\x36\x71\x88\xf1\x35\xc4\x36\xf7\x0d\xb6\x4b\xc3\x57\xd8\x2b\x1c"
+ "\x5f\x37\x14\x73\x7c\x85\xe9\x5d\xf8\x1a\xd9\x7c\xf9\xf0\x75\xc3"
+ "\x0c\x8e\xaf\x1b\x94\xfe\xe1\x2b\xcc\x2f\xff\x57\xbd\xc7\x07\x37"
+ "\x47\xe1\xf8\xc0\x99\x6b\x14\xe5\xd7\xa8\x43\x03\xe3\xcb\xe8\x26"
+ "\xbf\x6e\x3a\x72\x69\xf8\xba\x29\x7b\x68\xf1\x35\xd4\xe3\x84\x9b"
+ "\x66\x5f\x1a\xbe\x6e\x3a\xc8\xf1\x75\xa3\x83\xe3\xeb\xa6\x6a\x17"
+ "\xbe\x46\x1d\xba\x7c\xf8\xba\xb1\x8c\xe3\xeb\x46\xbd\x7f\xf8\xba"
+ "\xd9\xbb\xff\xe7\x41\xcd\x6b\x8f\x29\xc5\x31\x0d\xe0\x4b\x94\x5f"
+ "\x3f\xcd\xf1\x01\x5f\x6e\xf2\x6b\xcc\xcf\x2e\x0d\x5f\x9a\x93\x43"
+ "\x8c\xaf\x21\x1e\xdb\x68\x76\x5e\x1a\xbe\xc6\xdc\xc7\xf1\xa5\x99"
+ "\xc7\xf1\x35\x46\xe7\xc2\xd7\x4f\x73\x2e\x1f\xbe\x34\x4a\x8e\xaf"
+ "\x9b\xab\xfd\xc3\xd7\x18\x1f\xfc\xbf\xfa\x32\x1f\x1f\x4e\x70\x1c"
+ "\xe6\xcc\xcd\x16\xe5\xd7\x33\x8f\x0e\x8c\xaf\x6c\x37\xf9\x75\xcb"
+ "\xe6\x4b\xc3\xd7\x2d\xbf\x1c\x5a\x7c\x0d\xf5\x78\xec\x96\xb0\x4b"
+ "\xc3\xd7\x2d\x1b\x39\xbe\xc6\x56\x72\x7c\xdd\x62\x74\xe1\xeb\x99"
+ "\x47\x2f\x1f\xbe\xc6\xea\x39\xbe\xc6\xea\xfc\xc3\x57\xb8\x0f\xfe"
+ "\x7f\x7c\x5d\x47\x18\x1f\x7f\x69\x63\xc8\x71\xce\x4b\xc3\xd8\xb8"
+ "\xb7\xaf\xed\x31\xe4\xb8\x94\x4b\xc3\xd8\xb8\xf3\x1c\x63\xe3\xb4"
+ "\x1c\x63\xe3\xda\xae\xcc\x18\x32\xbc\x86\x63\x2c\x3c\xd7\x3f\x8c"
+ "\x8d\x1f\xc2\xf5\x0f\x6d\xf5\xa5\x8d\x23\xb5\x0b\x2e\x0d\x63\xda"
+ "\x51\xd7\xf6\x38\xf2\xd6\xa6\x4b\xc3\x98\xf6\x69\x8e\xb1\x5b\xd7"
+ "\x71\x8c\x69\x67\x5d\x99\x71\xe4\xad\x11\x1c\x63\xe3\xfd\x5c\xb7"
+ "\xd1\xfa\x75\xfe\xa5\xef\x75\x9b\x3b\x26\x5d\xda\x58\xf2\xf6\xfd"
+ "\x97\x86\xb1\xdb\x97\x5f\xdb\x63\xc9\xdb\xa3\x2e\x0d\x63\xb7\xef"
+ "\xe6\x18\xbb\xcd\xc2\x31\x76\xfb\xce\x2b\x33\x96\xbc\x6d\x13\xc7"
+ "\xd8\x6d\xb3\xfd\xc3\xd8\x1d\x91\x43\xb7\xde\x74\x67\xe1\xa5\x8d"
+ "\x27\xef\x9c\x78\x69\x18\x9b\x70\xe4\xda\x1e\x4f\x4e\xd8\x7a\x69"
+ "\x18\xbb\xf3\x36\x8e\xb1\x09\x33\x39\xc6\xee\xd4\x5c\x99\xf1\xe4"
+ "\x1d\x76\x8e\xb1\x3b\x2a\xfc\xc3\xd8\x9d\x3e\xf8\xff\xf7\x75\x9d"
+ "\xec\x2e\xdb\xa5\x8d\x29\xef\xca\xbb\x34\x8c\xdd\xf5\xd0\xb5\x3d"
+ "\xa6\xbc\x4b\x79\x69\x18\xbb\xeb\xb7\x1c\x63\x3f\x2a\xe7\x18\xbb"
+ "\x2b\xf5\xca\x8c\x29\x7f\x34\x8f\x63\xec\x47\xe1\xfe\x61\x0c\xb7"
+ "\xb5\x0c\xd5\xfa\xde\xdd\xb1\x97\x36\xae\x9c\x78\xf6\xd2\x30\x36"
+ "\xf1\x8f\xd7\xf6\xb8\x72\xe2\xe2\x4b\xc3\xd8\xc4\x93\x1c\x63\x13"
+ "\xc3\x38\xc6\x26\x9a\xaf\xcc\xb8\x52\x57\xc5\x31\xa6\xf3\xcf\x1f"
+ "\x85\xfc\xee\x5e\xfe\xaf\x16\x2d\x4d\x5e\xb0\x78\x51\xbc\x76\xd1"
+ "\xd2\xa4\xc4\x57\xb4\xaf\x2e\x5a\x95\xf0\xd0\x9d\xcb\x27\x69\x13"
+ "\x53\xb4\x89\x8b\x96\xbe\x28\x26\xc4\x8f\x20\x4f\x25\x2c\x5e\x90"
+ "\x82\x29\x90\xfb\xc5\xa5\x4b\x12\x96\x26\x69\x13\x13\x5e\x59\xbe"
+ "\x28\x31\x01\xff\x7f\x55\xbb\x70\x59\x22\x24\xbc\x90\xb0\x28\x39"
+ "\x41\xfb\xfc\xf2\x85\x0b\x13\x12\x5f\x1d\x41\x9e\x58\xbe\x38\x69"
+ "\x91\x61\x71\x82\x76\xda\x13\x8f\xdc\x33\x7b\xfa\xaf\x67\x3f\xfc"
+ "\x30\x06\x27\x73\x8b\x4d\x16\x4e\x73\x0b\xe3\x00\x73\x8a\x56\xf9"
+ "\x4f\xa6\xd7\x69\x08\x8b\x67\x5b\xd0\x4e\xd4\x39\x89\x44\x91\xdd"
+ "\x4e\x94\x79\xed\x44\xa5\x7d\x89\x44\xd1\xec\x7f\x56\xe5\xb7\x93"
+ "\x30\x9a\x3f\xc7\x22\x64\x53\x42\xf3\x02\xa2\xac\x41\x27\xac\x90"
+ "\xa6\x16\xb2\x4f\x68\xe1\x9d\x30\xa0\xad\x82\xe6\x05\x96\x37\xcb"
+ "\x7f\xa2\xb0\x06\x59\xea\xd3\x4f\x12\x39\x1d\xf1\xe3\x4d\x7f\x15"
+ "\xac\xf2\xbd\xb8\xd3\x01\xda\x4e\xe4\x93\x76\xc0\x55\x44\xe4\xf7"
+ "\xcc\x80\x2b\x16\xae\x78\xb8\x72\xe1\xda\x04\x57\x19\x5c\x3b\xe1"
+ "\xaa\x82\xab\x1a\xae\x7a\xb8\x1a\xe1\x32\x13\xf9\xe4\x79\x70\xa5"
+ "\xc2\x05\x79\x27\x6f\xe5\xe5\x4c\x2e\x87\xab\x89\xc8\xef\x55\xc0"
+ "\x15\x0e\x17\xe4\xbf\xd7\x4a\xe4\x11\x06\xb8\x94\x70\x85\xc1\x05"
+ "\xe9\x11\x51\x70\xe1\xfb\x3b\xf9\xb3\xfb\x34\x70\xcd\x26\x50\xcf"
+ "\x81\xaf\xfb\x92\xe0\x82\xef\xde\x57\x4a\xe4\xf7\x13\xb8\xa0\xbe"
+ "\xf7\xef\xf4\x9e\xff\x7e\xc7\x00\x65\x86\x87\xae\xb9\xd5\xcc\x62"
+ "\xe0\xc9\xef\x09\xa2\x99\x24\x80\x66\x5b\xea\x0d\x77\x13\xd9\x29"
+ "\xf9\xa4\xc3\xa6\x75\x20\x67\x94\x94\xc7\x74\x84\x7b\xa4\x59\x47"
+ "\xce\xa4\x06\x33\x31\x68\x30\xa6\xd9\xe0\xf0\x36\xa9\x81\xbf\x7f"
+ "\x4f\x98\x59\x36\xb2\x82\xc5\x80\xcb\xa9\x34\xd0\xf4\xd8\x37\x59"
+ "\xec\x37\xa0\x21\x9e\xcb\xa2\xc6\xf7\x2d\x54\xb9\x2b\x15\xfb\x7c"
+ "\xd5\x2a\xac\xd7\xa4\xb7\x79\xff\x82\xe7\x50\x37\x6b\xf0\x1c\x8c"
+ "\x73\xa9\xc0\x7b\x9a\x7d\xc2\xda\x19\x5c\x10\x85\xff\x5f\xdc\x12"
+ "\x63\xa0\xb9\x05\xd8\xa7\xe4\x55\x69\xff\x45\x9a\xe1\xbd\xce\xe0"
+ "\x8d\x4a\xed\x53\xa1\xb4\x99\x97\x2d\x37\xcb\xef\x89\x92\xca\xea"
+ "\x0c\x9e\x63\xa5\x45\x1b\x23\x68\x1e\x60\x48\x2c\x0f\xb0\x63\xa5"
+ "\xb9\x1b\xd4\x90\xaf\x18\xd3\x69\x71\x8c\x51\xfa\x1f\x7e\x8b\x68"
+ "\x7e\x41\x19\xfe\x86\xae\x21\x36\x76\x9f\x19\x45\xf8\xaf\x9a\xa0"
+ "\xac\x6b\x93\x4f\x7e\x04\xb8\x2e\xab\x7a\x0a\xeb\x3d\x59\x95\x5e"
+ "\x4f\x05\x6d\x5a\x00\x7c\x7f\x72\x70\xf7\x77\xc7\x6c\xd4\x61\x8c"
+ "\x54\x21\xe7\xee\xad\x18\x83\x0f\xdf\xc5\xba\xbd\x31\x9a\x28\xde"
+ "\xfa\x1d\x51\x62\x1b\x3b\x72\x26\x47\x4a\x71\xe8\xf0\x1d\x39\xe4"
+ "\x7f\x3c\x26\x9d\xba\x95\x1d\x48\x59\x7b\x26\x95\x71\x9a\x4e\xd6"
+ "\x9b\x65\x41\xc5\x98\x5f\x7b\x3b\xa3\xe5\xdb\xe2\xf3\x1d\xc8\x4f"
+ "\x2c\x5f\xc8\x2b\x8c\xc3\x7b\x8c\x73\x17\x0a\xc8\xd4\xa6\x4d\xa8"
+ "\xe0\x34\x2a\xd0\x63\x39\x98\x5f\xc8\xcf\x81\xff\xef\x99\x29\x40"
+ "\x7b\x9d\x99\x44\xa7\x5d\x4a\xa2\xa0\xee\x87\x9d\xd9\xbb\x23\xe0"
+ "\x39\xf4\xbb\xdd\x53\x20\x7f\x06\xa3\x77\xde\x06\x68\xfb\xe4\x6a"
+ "\x78\x36\xa5\x3b\xf6\x25\xa7\xb3\x4c\xc8\xde\x3d\x0d\xea\xe4\x30"
+ "\xcb\xb4\x5b\xa5\x36\x30\x19\xe7\xca\x27\xf2\x74\xb2\xd5\x1a\xb4"
+ "\x7b\x5a\x57\x32\xad\x2f\xf8\x92\x10\xf8\x26\xed\xbc\x40\x6b\x52"
+ "\x67\x51\x7b\xfe\x5c\x42\x6a\xe2\x9a\x48\xfa\x02\x12\x3e\x72\x0d"
+ "\xb5\x46\x3b\x49\xe8\xc8\xa6\x50\x5a\x3b\xab\x09\x64\xf4\x79\x92"
+ "\x5a\x4f\x2d\x75\x86\x4a\x92\x7a\x9c\xa8\x56\x2f\x22\x61\xe9\xb3"
+ "\xa8\x35\xad\x86\xda\x4d\x29\x4d\xa4\xce\x06\x97\xa1\x16\xf2\x1d"
+ "\x86\xab\x92\xa4\xaf\x24\x8a\x27\x41\x9e\xa6\x9d\x27\xaa\x3a\xc3"
+ "\x79\x48\x3b\x4d\x52\xe3\xa8\xa3\xb6\x06\xf3\xed\x27\xd1\x0e\x6b"
+ "\xe8\xea\xd3\x44\x51\x32\x17\xcf\x96\x1d\x25\x6f\x41\x5d\x3a\x83"
+ "\x03\x22\x2e\xe6\x05\x56\x9c\x4b\xa6\x8e\x8e\x9c\x7b\xab\xcd\xe4"
+ "\xdf\xaa\x3c\xda\x82\x75\xc6\xb8\xa1\xd0\x5e\xcc\x23\xe4\xe5\x58"
+ "\xe6\x3b\x10\xe7\xf7\x56\x82\x2c\x26\xd2\x73\x7c\x66\x0d\xce\x01"
+ "\xfc\xdc\x6b\x89\x76\xd0\x0e\xcc\x8f\xed\x06\x1a\x45\x89\xed\x8f"
+ "\x0a\x30\x10\x45\x47\x4e\xc4\x24\xb3\xec\x8e\x0c\x37\x1e\x22\x4f"
+ "\x86\x49\xdf\x13\xf3\xcc\x32\xcb\x6e\x63\xb1\x17\x05\xf6\xec\x9e"
+ "\x48\xcc\x0b\xe9\xc0\xff\xdb\xeb\x79\xfd\x22\x22\x30\x4d\x94\xa5"
+ "\xd8\xaf\xa3\x04\xec\xd7\xc6\x5d\xb3\x9c\xc1\x05\x06\x2a\xa7\x76"
+ "\x9a\x37\x57\x49\xcf\x69\x54\x4f\x3a\xa8\x1d\xea\x8d\x32\x56\x85"
+ "\x71\x52\x79\xfe\xfb\x30\x56\xa3\x5a\x9b\x8c\xff\x47\x9c\xc4\xef"
+ "\x08\x5b\x62\xe2\x50\xb6\x46\xd7\x63\xfe\xb9\x71\xf9\x89\x20\x7b"
+ "\xf3\x0a\xe2\xb0\x1f\x0a\xc1\x1b\x34\x17\x37\x6f\x54\x63\xff\xa6"
+ "\x80\x31\x9a\x3b\x57\xdd\x5d\x4e\x26\x09\x84\xfa\xfc\x7f\xf6\xde"
+ "\x07\x2e\xca\x2a\x5d\x1c\x7f\xe6\x65\xd0\x81\xf8\x33\x1a\x15\x15"
+ "\xd9\x68\x54\x54\xa8\x58\xd6\x5a\x8b\x39\x25\x1a\xb6\x2a\xa8\x64"
+ "\x94\xa6\x58\x68\x63\xa2\x4e\x88\x8a\x86\x82\x93\x29\x10\x28\x95"
+ "\x6b\x98\x08\xb4\xb1\xbf\xeb\xee\xcf\xdd\x75\xf7\xeb\xde\xeb\xde"
+ "\x8f\x6d\x53\x50\x97\x2d\x65\xd8\xbd\xed\xe7\xeb\xde\x9f\xdd\x46"
+ "\x42\x62\x5d\xd2\x31\xa6\x98\x60\x66\xce\xef\x79\xce\x79\x5f\xe6"
+ "\x9d\x97\x19\x15\xb7\xfb\xbd\x77\xfb\x46\xbd\xce\xfb\x9e\xf3\x9c"
+ "\xe7\x9c\xf3\xfc\x3b\xcf\x73\xde\xf3\x9e\x63\x67\x58\x9e\x55\x55"
+ "\xca\xf8\x53\x7f\x26\x64\x33\xed\x18\xe9\x1d\xb6\x2b\x07\xd3\x23"
+ "\x3b\xa4\x49\x99\xf4\x8d\x26\x3e\x57\xf1\xb3\x24\xa5\x49\x73\x84"
+ "\xcc\xfc\x73\x76\xd0\xb3\x44\xf4\x43\x9d\x44\x3b\x20\xfc\x8b\x49"
+ "\xab\x03\x7a\x21\xe4\x58\xe8\x77\x25\xb6\x69\xc2\x41\xbf\x2d\xc2"
+ "\x8f\x70\xba\x0e\x41\x07\xa9\x3f\xea\xed\x29\x7d\x95\x93\x6a\x9d"
+ "\x3a\xbd\x39\x88\x9f\x95\xbf\xb5\xd2\xb9\x95\xd8\x96\x08\xc4\xf9"
+ "\x3e\xfe\x8e\xc4\xdf\x3f\x34\xb7\xd3\x58\xcb\xf1\x5e\x45\xf7\x6f"
+ "\x5c\xcb\x5c\x19\xd8\x92\x5e\x89\xe8\x3e\xc9\xe9\x84\xa5\x7b\x08"
+ "\x4f\x25\x9d\xdd\x89\x69\x04\x83\xe9\x1e\x27\xe4\x6d\x17\xf8\xc7"
+ "\xd7\xb9\xc9\x66\x05\xe1\xbf\xfb\x26\x81\x5f\xe0\x25\x7c\x0a\xee"
+ "\x03\x7b\x59\x8f\xc0\x7d\x77\xba\x82\xbb\x1a\xd3\x14\xfc\x19\xab"
+ "\x95\x3a\xee\x5e\x8c\x75\xc4\xa8\xfb\xb0\x6f\x2f\x73\x13\x0e\xcc"
+ "\x2b\x76\x82\x25\x9f\xf2\x2a\x30\x8d\xca\xaa\x64\x2a\xa2\x39\x1b"
+ "\x71\x1c\xe7\x38\x1a\x9d\xb0\xa2\x47\x6d\x37\x90\x46\xb1\x8a\xad"
+ "\x95\x71\xb5\x28\xb8\x02\x78\x14\x99\x7a\xd7\x22\xf3\x94\xf0\xc6"
+ "\x10\x5e\x84\x77\x3b\xe1\xe9\xc9\xea\xbe\xcb\xb6\xb3\x18\x61\x74"
+ "\x32\xfc\x9f\xc9\x2e\x29\xed\xa6\xb3\x3b\x59\xe5\x9d\xc7\x49\x37"
+ "\xd0\x06\x02\xca\x24\xd6\x7b\x4f\xba\xc6\x06\xea\x09\xce\x5f\x79"
+ "\x97\x8e\x9f\x5d\x7a\x2d\xeb\x46\x98\xbc\xa0\xf3\x3a\x25\x78\x10"
+ "\xd3\x8a\x94\x73\x43\x77\x21\x8c\x53\xba\x2b\xec\xbe\x88\x5b\xc7"
+ "\x82\xe4\xa8\x73\x92\x4f\x4a\x72\x95\xee\x48\x72\x83\xa3\xce\x0f"
+ "\xfe\xfa\x79\x35\xe6\xad\xcc\x8e\x7e\xc8\x05\x3a\xef\x79\x78\xe3"
+ "\xdc\x3d\xfc\xfc\x47\xd6\x8f\xbe\x5a\xc9\xdd\x40\x63\xdb\x39\xe9"
+ "\xde\xb1\x0e\xd7\x97\x5c\xfe\xf1\x9e\x8f\x05\xaf\xa1\x6f\x47\xfe"
+ "\x1d\xfa\xd4\x96\x1a\x49\xf8\x78\x7e\x84\xad\xa7\x74\xf2\xff\xd0"
+ "\xf7\x6c\x50\xe5\xb1\xfa\x79\x99\x82\x76\x93\xff\x42\x74\xe4\xed"
+ "\xf5\x3e\x62\xa7\x36\xfb\xeb\xe6\x65\x52\x1f\x4a\x8b\x99\xdf\xe1"
+ "\xed\xb3\xd3\x79\xba\xa6\x0d\xe4\x9b\x4e\xfe\x6d\xd6\x01\x60\xa8"
+ "\xbf\x99\xc3\xeb\xc3\x64\x5e\x27\xfa\xdf\xe7\x5c\x37\xcd\xcb\xa4"
+ "\xf3\x93\x77\x6f\x8d\x34\x4c\xaf\x63\xf6\xde\x31\xf3\x6a\xfa\x2a"
+ "\x27\x9f\x54\xce\xa7\x1d\x26\xde\x93\x4a\xdf\xeb\xe5\xbe\x63\x1a"
+ "\x9f\xb3\x99\x58\xcb\xcf\xc7\xc6\xe7\x7b\x8d\xe1\xf8\x85\x36\xa4"
+ "\x98\xca\x62\xdf\xcd\x0d\x0a\x9d\xbc\x2e\x3a\x1b\x7c\xd4\x59\xe9"
+ "\xde\x9f\x66\x95\xd8\x81\xef\x85\x5f\x5d\x59\x3c\xbc\x76\xdd\xcb"
+ "\xe7\xbf\xdb\xd0\xf7\xcf\xf2\xbe\xc3\x84\xed\xbb\xf7\xc4\x5c\x19"
+ "\x1f\xe5\x29\xbc\xaa\x97\x7d\xf2\x2b\xa8\x23\xec\xfc\xa7\xaa\x5f"
+ "\xc6\xa1\xfd\xba\x6f\xcb\x95\xf7\xeb\xbe\xcc\xa1\xfd\xba\xef\xa7"
+ "\xdf\x6e\xbf\xee\x0b\xfb\xfe\x53\xd5\x2f\xd3\xd0\x7e\xfd\xe0\xb1"
+ "\x2b\xef\xd7\x0f\x4c\x43\xfb\xf5\x83\x2d\xdf\x6e\xbf\x7e\xb0\xfd"
+ "\x32\xfa\x95\x36\xb4\x5f\x53\xc6\xff\x1d\xfd\xf2\x0c\xed\xd7\x94"
+ "\xc7\xbe\xdd\x7e\x4d\x09\x7b\xfe\x59\x58\x7b\xb8\x6b\xb7\x5d\xd8"
+ "\xc3\xfb\x75\xc3\xb7\x87\x53\x8e\x0f\xb5\x87\x0f\x4c\x0a\xd8\xc3"
+ "\x07\x6e\xba\x22\x7b\x88\x0e\xa2\xb0\x87\xf7\xff\x75\x88\x3d\xac"
+ "\x5a\x08\xa1\xed\xe1\xfd\xef\x73\x7b\x58\xbd\x70\x98\x7d\xb8\xbf"
+ "\x66\xd0\x1e\xc6\x2e\x84\x20\x7b\x18\xb7\xdb\xde\x57\x79\x7f\xf7"
+ "\x95\xd9\xc3\xfb\xbb\x87\xda\xc3\xfb\x33\x83\xed\xe1\x03\xa6\x8b"
+ "\xc8\xa1\x27\x94\x3d\xcc\xf2\x9e\x67\xb2\x6c\x78\x86\xd7\x9e\x07"
+ "\x8a\x2f\x52\x57\xd9\x25\xea\x2a\x1b\x66\x5d\x9d\x61\xeb\x32\xfc"
+ "\xb3\x15\xfd\x0c\xe3\x96\x37\x41\xea\xc2\x68\xb7\x2d\xe9\x24\x38"
+ "\x8a\x3d\x30\xc1\x8a\x32\x61\x83\xf4\xb6\xba\x1e\x68\x4b\xea\x02"
+ "\x16\xf5\xcf\x56\xf6\xff\xcc\x07\x73\x21\xc9\xe6\x0f\x0f\x38\x8a"
+ "\x3c\xc3\xe4\xeb\x0f\x2d\x8a\x6c\xb6\x79\x51\x36\x37\x90\x3c\xa6"
+ "\x9f\x70\xf4\x9c\x95\x65\x33\xfd\x77\x83\xfc\xb1\x09\xf9\x0c\x29"
+ "\x9b\xa8\x13\xc1\xb2\x59\x69\x15\xb2\x99\xfe\xd2\x50\xd9\xac\xb4"
+ "\x86\x96\xcd\xf4\x65\x42\x36\x2b\xad\xc3\xeb\x43\x7a\x6a\x40\x36"
+ "\x2b\xad\x41\xb2\x79\xdb\x7c\xf4\xc7\xd2\xb7\x5f\x99\x6c\xa6\x6f"
+ "\x57\xfa\x7e\x40\xee\x3b\xd2\xab\x33\x58\x36\xd3\xc3\x9e\x75\x4d"
+ "\xe7\xaf\xa3\x3d\x8c\x39\x2b\x4d\xad\xf2\xa1\xdf\xea\x2f\xef\xe9"
+ "\xce\xf2\xb1\x3e\x3a\x87\x9d\x49\x93\x81\x6d\x4c\x89\xe9\xc3\x98"
+ "\xb2\xaf\xcf\x62\x60\xd1\xbf\xf5\xb3\x81\x44\xd2\xab\x78\xd6\x97"
+ "\x12\x87\x34\x4b\xc6\xdf\xd1\x07\x36\x40\x02\x5e\x89\x07\x64\xba"
+ "\xe2\x7d\x1a\xdb\x98\x18\xbd\x6b\x03\xa4\xc6\xbb\xc1\x80\x6d\xc8"
+ "\x8d\xdf\x66\x04\x8c\xf9\x13\xe8\x9e\xd9\x9a\xd2\x1b\xbe\x06\x3d"
+ "\xcd\x27\xfa\xa3\xb0\xbe\xe2\x78\xc6\xd6\xa5\x40\x43\x21\xb6\x47"
+ "\x82\xc4\x06\x89\x1d\xf6\x6d\x4c\x91\x58\xdc\xee\x17\xd8\x0b\xb9"
+ "\xbc\x4d\xfe\xe4\xf9\x66\x94\x21\x33\x2b\xb5\x50\xbd\x66\x3a\x0f"
+ "\x98\xdd\x36\x3f\x83\xf5\x25\x46\x57\x7f\x0d\x74\x16\x76\x72\xfd"
+ "\x06\x48\x61\x03\x29\x12\xd2\x20\x77\xc9\xf3\x46\xe2\x7b\x2e\x93"
+ "\x9a\xe8\x5c\x74\x3d\xd6\xad\xf3\x55\x60\x5d\x5e\xac\xeb\x3c\xd6"
+ "\x75\x0e\xeb\xb2\x61\x5d\x36\x51\xd7\xf0\x68\x3e\xd5\x73\xb1\x79"
+ "\xdf\xac\x2d\x63\x68\x7f\xda\xcf\xe3\x8b\x47\x66\xd2\x1c\x70\xef"
+ "\x0b\x96\x61\xca\xfb\x83\xb9\xe1\xf0\xef\xfe\x25\x24\x31\x43\x57"
+ "\xf7\xdc\x97\x3e\x65\x59\x5e\x80\x97\x7e\x09\xa9\xa4\x73\x6d\x9e"
+ "\x2f\x50\xcf\xba\xba\xdf\x4f\xe9\x19\x6e\x5d\x61\xbf\x7f\xad\xb4"
+ "\xb1\x76\x7f\x0c\xc6\xa2\x31\xbb\xcb\x77\xdb\x58\xf1\x40\xd2\xbc"
+ "\xbc\xfe\xa4\x79\x65\x4b\xbd\x46\x94\x2b\x56\x6c\x2a\x04\x53\x97"
+ "\x34\x23\xea\xc3\x8f\x71\x8c\x78\x12\x0c\x1d\xd2\x0c\x73\xe9\x5f"
+ "\x68\xfe\x6e\x5a\x4e\xf0\xfc\xdd\xb4\x62\x90\xcc\xdd\x20\x3d\xe4"
+ "\x01\x69\x7a\x12\x20\x5c\xf0\x95\x31\x45\xe0\x32\xbf\x9f\xf5\xb3"
+ "\x31\xb0\xd5\xcb\x3e\xc7\xf8\x34\x77\x17\xc6\xc0\x59\x77\xe8\x9c"
+ "\xf6\x0d\x34\xaf\x65\x7e\x1b\x69\xfa\x37\x1c\x97\xe2\xf1\xbe\x02"
+ "\x79\x07\xd6\x42\xb8\xfa\xac\x64\x2e\xf7\xe2\x7d\xbc\x7b\x64\xa6"
+ "\xaf\x34\x17\xbc\x89\xaf\x18\x07\xaa\x76\xe7\xf9\x30\x8e\xf5\x1b"
+ "\x7a\xba\x4b\xff\x0a\x49\x8e\x1e\x1f\xd4\xa1\xdc\x2d\xf5\x19\x48"
+ "\x1f\x72\xed\x4f\x7f\x08\x5d\x45\x20\x95\x7e\x05\xb1\xac\x37\x25"
+ "\x46\x91\xeb\x39\x3d\xf1\x9e\x2d\x3d\xcc\x4f\xf2\x4d\xf3\x0b\x98"
+ "\x17\xb7\xf5\x2b\x1c\x6b\x5d\xdd\x50\x87\xb1\xb4\x6f\x9d\x65\xb4"
+ "\xab\xd7\x72\xf5\x7e\x3f\x24\xc4\xb9\xc1\x58\xf7\x25\xca\xe0\x3a"
+ "\x94\xbf\x2f\x51\xce\x5d\x42\xce\xe9\xfb\x9b\x7a\x92\xf1\x1d\x6f"
+ "\x67\x34\x7c\x29\x64\x9c\xcb\x1d\xc9\xf8\x5a\x94\xbb\x35\x01\xb9"
+ "\xf3\xf6\xa2\x8c\x57\x3e\x38\xa5\xce\xc6\x60\xcb\x4a\x90\x1a\xce"
+ "\x8e\xa4\x3c\x5d\xe4\x1d\x92\xe9\xc3\x6c\x0f\x04\xe2\xb0\x19\x0f"
+ "\xf5\xdf\x34\xaf\xcc\x34\x9f\x9d\xef\x90\xcc\x47\x30\xdd\x60\x5a"
+ "\x78\xbb\x11\xe9\xfd\x90\x98\x9f\x99\x61\xa6\xd8\xdd\x89\xb4\x20"
+ "\xba\x60\x1c\x7d\x7b\x87\x34\xad\x82\xe8\xb8\xf1\x20\x44\x58\x1f"
+ "\x64\x9d\x48\xb3\x1a\xc6\xe7\x34\xa6\x95\xf3\x79\xea\x6d\x26\xf8"
+ "\x88\xcf\x27\x8a\x32\x3e\xa4\x9b\x37\x66\xa1\x11\xf9\x5d\x6c\x7f"
+ "\xae\x9f\xeb\x1c\xd1\xb1\xab\x00\xa4\xa5\x3d\x48\x2b\x1f\xd2\xaa"
+ "\x8f\xdb\x82\x6c\x6e\x0b\xca\x7f\xeb\x29\x71\x32\x7f\x56\x7e\x04"
+ "\xdb\xfa\x3c\xbd\xcf\xf0\xc1\x12\x2b\xb0\x2d\x5f\x20\xbd\xdc\x27"
+ "\xc9\x6e\xc4\xf9\x37\x0a\xdb\x40\xf4\x8a\xed\x01\x23\xab\xec\x76"
+ "\xfe\x72\x6b\x6b\xa4\x0f\xe5\x97\xec\x43\xfc\x36\x5d\x14\xea\x65"
+ "\x5c\x15\xe9\x2f\xea\x73\xfc\x36\x6e\xaf\x72\xeb\x50\x6f\xbd\x1b"
+ "\x53\xc6\x0d\x6c\x4c\x31\xe1\x35\x46\xb1\x21\x74\x8e\xd6\x01\xa2"
+ "\x6d\xe5\x83\x8d\x64\x3f\x1c\x18\x3d\x7b\x91\xb6\x71\x34\xde\x6c"
+ "\x4c\x49\xe2\x34\x7e\x36\x05\x26\x7a\x40\x87\x6d\x32\x62\x7b\xa1"
+ "\x61\x05\x18\x4e\x58\x3a\xc0\x87\xba\xa1\xd0\x7d\xce\x4a\x13\x20"
+ "\x5e\xe9\xfd\x94\x3f\x83\x4c\x33\x5d\x78\xb9\x9b\x7e\x4d\x40\xee"
+ "\xa6\x5f\x43\xb4\x13\x72\x37\x3d\xe1\xbb\x28\x77\x1f\xe5\x72\xb9"
+ "\x8b\x18\xb8\x89\xcb\x53\x8d\xc3\xfb\x1b\xa4\xd1\x74\x4a\x03\x92"
+ "\x99\x3f\xfc\x9c\x64\x26\x23\xe5\x7f\xaa\xcc\x7c\xd3\x97\x62\xc2"
+ "\xeb\xbf\x44\x66\x10\x2f\x97\x19\xa2\xd5\x47\xb9\xfd\xa0\xd0\x88"
+ "\xeb\x6a\x79\x57\xb7\xa9\x14\xa6\xa1\xae\x9a\xe3\xb7\x8d\x81\x13"
+ "\x9c\x4e\x33\xcc\xa6\x85\xcc\xdf\x21\x65\x2c\x2b\xfd\x23\x18\xfb"
+ "\x6d\x8c\x39\xbc\xbf\x00\x7f\xcc\xcb\x89\x7c\x3e\xbb\x6a\x61\x1e"
+ "\xbd\x1b\xa1\xf7\x22\x34\x47\x17\x6f\x05\x3d\xcd\x95\xfb\xaa\x6b"
+ "\xf2\xe8\xfd\x08\x8b\x8d\x3c\xec\x43\xbd\xf6\x57\x7c\x60\xf7\x47"
+ "\x31\xf4\x11\x32\x0e\x3a\xe1\x5d\x3e\xaf\xc8\xaa\x76\x93\xef\x82"
+ "\x36\x33\x83\xaf\xf7\xa6\x77\x27\x98\xdf\xaa\xcc\xf9\x93\x4d\x90"
+ "\xe7\xe5\xe4\x79\xbb\x19\xd4\xee\x68\x9a\xb7\x13\x36\x25\xe3\x77"
+ "\xca\xbc\x9d\xf2\x4c\xf9\x4e\x29\xe3\x18\xcd\xf9\xa8\xca\x4d\x91"
+ "\xe1\xe4\x72\xd3\xa6\x92\xad\x0f\x94\x13\xcf\x68\x57\xa6\x0c\x48"
+ "\x60\x08\xe9\x63\xc4\xd4\xe4\xa1\xfe\xe8\xbb\xa4\x99\x53\xf1\x57"
+ "\x42\xba\xfc\x05\x7f\x23\xf0\x97\x9f\xdb\x36\xbc\xf1\x6a\x06\xff"
+ "\xfe\x15\xfb\x7f\x48\xb6\x8d\xeb\xb9\x4e\xde\x09\xb1\x67\xe5\xfb"
+ "\xbe\xca\x19\xed\xca\xbb\x8b\x41\xf8\x00\x7f\x0a\xa8\x6e\xe4\x91"
+ "\x5e\xbc\x4f\x11\xcf\x2a\x7c\xab\xf9\x33\xe8\x93\x30\x76\x31\xd1"
+ "\x7b\x4f\x94\x5f\x5d\x1f\xb3\x3c\x28\xff\x4e\xe5\xef\x5f\x90\x47"
+ "\xe4\xaf\xc9\xf6\xb7\x48\xd4\x3b\x33\x13\xe9\xa0\x57\xd7\x1b\x8a"
+ "\x1e\x4e\x69\x66\xd8\x33\x6d\x86\x47\x8b\x99\x65\xe1\xf0\xcc\x48"
+ "\xf1\xb1\x61\xe2\x0a\xfb\xfd\x23\x4b\x9a\x67\xce\x3a\xe8\xb3\xfb"
+ "\x07\x72\xe3\xdf\x2f\xf9\x62\x98\xfe\xc5\x23\x61\xf7\x7f\xf2\xc5"
+ "\xbc\x9c\xe6\xad\x9b\x47\xb2\x1f\xd3\x76\xd0\x0b\x3f\x3b\xdb\x2d"
+ "\x65\xdd\x31\x06\x62\x3b\xc1\x48\xfe\xd3\x9c\x9e\x77\x18\xf9\x50"
+ "\xbb\xce\x42\x72\xff\xf9\xdc\xf8\x01\xf4\x05\x5f\x3e\x0b\xe9\xfe"
+ "\x67\x13\xa3\xab\x56\x80\xbe\x1f\xfd\xd5\xfe\x67\x2d\xf1\x1f\x9d"
+ "\xea\x06\xd4\x13\x73\x9b\xdb\x09\xf5\x08\xcb\x3e\xcf\x8d\x9b\x95"
+ "\xc7\x3c\xc7\xf3\x5e\x85\xac\x14\x9f\x7d\xeb\x69\x88\x45\x5b\x64"
+ "\x74\x14\xff\x82\xbf\x53\x88\xdc\x24\x99\x1c\xde\x33\x50\xbd\x02"
+ "\x6d\x18\xda\xac\xd2\x27\xd0\x56\x7b\xbf\x82\xfd\x6a\x5b\xfd\xdc"
+ "\x4f\x02\xb6\xfa\x3c\xda\xea\x4a\xb4\xd5\xa5\x89\xd0\x66\xb5\x03"
+ "\xda\x8e\x91\x73\xad\xf1\x9e\xad\x56\xb4\xd9\x9b\xd0\x66\x17\x9f"
+ "\x01\x6e\xaf\x7b\xba\x01\x6d\x6d\xdc\x81\x35\x90\x30\xb0\x16\x6d"
+ "\xf6\x79\xcb\xd5\xfb\xb6\x0a\x9b\xfd\xc6\x1a\xb4\xd9\x6b\xd1\x27"
+ "\x5e\x83\x36\xbb\x27\x84\xcd\x3e\x17\xc6\x1f\x96\xed\x4f\xff\xda"
+ "\x14\xe9\x0d\x89\xc1\x0b\x4f\x80\xb4\xef\x3f\x46\x0e\x53\x4e\x32"
+ "\x0f\x86\xe3\x01\xd1\x9b\xe8\xef\x47\x3e\x9c\x40\x1e\x70\xbf\xd5"
+ "\x33\x32\x73\x00\xc7\x34\x5f\xdc\x8e\xb2\x9f\x9f\x3d\x29\xc5\x15"
+ "\x81\x71\xae\xf5\x1d\xd6\xbf\x2e\x17\xfd\xfe\xdc\x58\x6f\xd5\xcb"
+ "\x69\x55\xe8\x53\xfb\xd0\xf7\x1e\xe8\x4b\x34\x20\x0d\x8c\xae\x8d"
+ "\x96\x78\xa2\xa1\xff\x26\xe4\xe7\x88\xbb\x66\xa3\x0d\x9d\x7c\x60"
+ "\x05\x4c\x19\xa8\xde\x71\x88\x55\xef\x68\xf4\x55\xef\x68\xc2\xb2"
+ "\x71\x3f\x72\x12\x5f\xfe\x15\x30\xcd\xce\x76\x55\x94\xf9\x62\x5f"
+ "\x4e\x73\xc5\xee\x38\x88\xcf\x47\x29\x7f\xeb\x32\x88\xcd\x4a\xf9"
+ "\xc6\x2e\xf8\xf5\x53\x20\x3e\x09\x7e\x7d\x02\xd5\x18\xf7\xd1\x98"
+ "\xcb\xc7\x57\x99\x67\x18\x2f\x70\x7f\x3f\xc0\x37\xcd\x18\x2b\xf3"
+ "\xed\x44\x8f\x1d\x70\x3c\x19\x39\x38\xd6\x72\xbe\x7d\x02\xca\x38"
+ "\x8b\xf4\x8e\x3b\x80\x63\xed\xc0\xb7\x35\xd6\xca\x71\x0c\x8d\xb5"
+ "\x34\xce\x12\xdf\xde\x18\x36\xdf\x1e\xcd\xbb\x32\xbe\xed\x84\x2b"
+ "\xe4\x5b\x53\x80\x6f\x3b\xe9\xbc\x67\x93\xaf\x7a\x67\x72\x30\xdf"
+ "\x76\x9a\x03\x7c\xdb\x99\x82\xcf\x53\x02\x7c\xfb\x6a\x18\x7c\x8b"
+ "\xfc\xf2\xbb\xcb\xb7\xd9\x89\x57\xc8\xb7\x2b\xd5\x37\xaf\x8a\x6f"
+ "\xa8\x6f\x3b\x51\xdf\x76\x6a\xf4\x6d\xa7\x4a\xdf\x76\xa2\xbe\xed"
+ "\x54\xe9\xdb\x17\xc3\xe0\xdb\x55\x1d\xdf\x5d\xbe\xcd\x69\xbf\x32"
+ "\xbe\x95\x5f\xa1\xbe\xa5\xe6\x04\xf8\x56\x8e\xfa\x56\x8e\xfa\x56"
+ "\xae\xd1\xb7\x72\x95\xbe\x95\xa3\xbe\x95\xab\xf4\xed\x93\x61\xf0"
+ "\x6d\xd4\x9f\xbe\xbb\x7c\xcb\x2a\xbf\x42\xbe\x5d\xa1\xbe\xa5\x1e"
+ "\x52\xf1\x0d\xf5\xad\x1c\xf5\xad\x5c\xa3\x6f\xe5\x2a\x7d\x2b\x47"
+ "\x7d\x2b\x57\xe9\xdb\xdb\xc3\xe0\xdb\x7d\x95\xdf\x5d\xbe\xcd\x33"
+ "\x5f\x19\xdf\x2a\xae\x50\xdf\xc6\xeb\x03\x7c\xab\x40\x7d\xab\x40"
+ "\x7d\xab\xd0\xe8\x5b\x85\x4a\xdf\x2a\x50\xdf\x2a\x54\xfa\xb6\x65"
+ "\x18\x7c\x5b\xf4\xf0\x77\x97\x6f\xf3\xc3\xce\x7f\x2a\x7c\x53\x78"
+ "\x46\xfc\xe3\x7c\x63\xb9\xe0\x45\x7f\xf2\xff\x7d\x5a\xf0\x8d\xf8"
+ "\xc5\x79\xd7\x9b\x1b\x5f\x2d\xf3\xcc\x2b\xf3\x8c\xe8\x47\x7c\x23"
+ "\x3f\x92\xf3\x4d\xa7\x4f\x20\x1f\xd2\x8b\xbe\xa4\xe2\x47\x3e\x6a"
+ "\x61\x9e\x13\x96\x9f\x0c\xfa\x91\x5e\xad\x1f\xb9\x52\xed\x47\xfe"
+ "\x22\x88\x5f\x55\x5f\x23\xbf\x24\x99\x5f\x4f\x85\xf1\x23\x57\xbc"
+ "\x17\x86\x5f\xed\x97\xe4\x17\xf2\x26\x61\xa0\x57\xf0\xeb\x0d\xd9"
+ "\xff\xaf\x2b\xfc\x3b\xf9\xb5\x0e\xf9\x45\xfe\xff\x27\x20\xed\x5f"
+ "\x32\x5c\x7e\xe5\x5c\xd2\xff\x0f\xcd\xaf\x72\x18\x1e\xbf\x52\x73"
+ "\x02\xfc\x2a\x37\x79\x71\x4c\x53\xc6\xb3\x00\xbf\xc4\x78\xe6\xd5"
+ "\x8e\x67\x2b\xd5\xe3\xd9\xe5\xf0\x4b\x33\x9e\x7d\xa7\xf8\xb5\x30"
+ "\xec\xfc\xbf\x0f\x63\x71\x1f\xda\x39\x9a\xaf\x8c\xeb\xc6\x38\xd9"
+ "\xcb\x3e\x9f\xeb\xc6\x38\xd9\x3b\x32\x73\xf7\x1a\x48\x1e\xd8\x88"
+ "\x71\x32\xf2\xae\x6a\x0d\xa4\x57\xae\x01\xbd\x7f\x15\xc6\xca\x67"
+ "\x31\x56\x46\xfb\xd4\xff\x37\x4b\xfc\xf1\x3c\x17\xf8\x31\x56\xa6"
+ "\x79\x30\x6c\x6f\x32\xfb\x1b\xc6\xca\x9d\x68\xfb\x3a\xdf\x10\xb1"
+ "\xf2\x19\x25\x56\xfe\x6d\x50\xac\xfc\xf2\x73\x72\xac\x2c\xd3\xbf"
+ "\x4e\x4d\xfb\x27\x7f\x1e\x26\x56\x6e\xbd\x64\xac\x4c\x31\xf2\x7e"
+ "\x8a\x97\xcf\x5b\x46\xef\x93\x6d\xdb\x1b\xe7\xfe\xce\x58\xf9\x3c"
+ "\xc6\xca\x36\x41\xfb\x37\x86\x4d\xfb\xc7\xc3\xae\xff\x20\xdd\x20"
+ "\x7d\x19\x1c\x8b\x90\xce\xca\x18\x34\x80\x63\x10\xcd\x67\xf4\x57"
+ "\xed\xd8\x8e\xf2\xca\xf5\x83\x8f\x49\x1b\x13\x0d\xa4\x1b\xa4\x27"
+ "\xa4\x1b\x7c\x2c\x42\x3b\x88\x63\xd1\xe2\xfa\xe7\x60\x4a\xc3\x73"
+ "\x30\xd9\x1b\x1b\x1c\x23\x3f\x9a\x4f\xfc\x08\xd8\x36\xbf\xd6\xb6"
+ "\x2d\x57\xdb\xb6\xdf\x0e\x1d\x8b\x2e\x65\xdb\x9e\x0b\xa7\x2b\xad"
+ "\x97\xd4\x15\xd2\x11\x3e\x1e\xa1\xbe\xfc\x57\xe8\xca\x1b\xff\x39"
+ "\x5c\x7e\x3d\x11\x76\xfd\xc7\xe5\xf1\x6b\xa7\xfe\xd2\xfc\xda\x09"
+ "\xc8\xaf\xc3\x01\x7e\x05\xc7\xc6\x01\x7e\x89\xd8\xd8\xaf\x8d\x8d"
+ "\x97\xab\x63\xe3\xcb\xe1\x97\x36\x36\xfe\x2e\xf1\x6b\x51\xd8\x75"
+ "\x7e\x97\xc9\xaf\xcb\xd0\xaf\x9d\xa8\x5f\x13\xf4\x2a\x7e\x05\xc5"
+ "\xc4\x2a\x7e\xa9\xf4\x4b\x15\x13\x2f\x57\xc7\xc4\x97\xc3\x2f\x6d"
+ "\x4c\xfc\x5d\xe2\xd7\xe2\xb0\xeb\x3f\x2e\x8f\x5f\xe5\x97\xa1\x5f"
+ "\xe5\xa8\x5f\x13\x72\x03\xfc\x0a\x8e\x85\x03\xfc\x2a\x57\xe9\x97"
+ "\xca\x77\x58\xae\xf6\x1d\x2e\x87\x5f\xda\x58\xf8\xbb\xc4\xaf\x25"
+ "\x7b\xfe\x4e\x7e\x5d\x86\x7e\x95\x93\x7e\x1d\x52\xf1\x2b\x28\x06"
+ "\x56\xf1\x4b\xa5\x5f\xaa\x18\x78\xb9\x3a\x06\xbe\x1c\x7e\x69\x63"
+ "\xe0\xef\x12\xbf\xf2\x32\xfe\x3e\x7e\x55\x5c\x86\x7e\x55\xa0\x7e"
+ "\x4d\x84\x00\xbf\x82\x63\xdf\x00\xbf\x2a\x54\xfa\xa5\x8a\x7d\x97"
+ "\xab\x63\xdf\xcb\xe1\x97\x36\xf6\xfd\x2e\xf1\x6b\x99\xfb\x62\xb1"
+ "\x94\x3a\x86\xf2\x96\x06\xf8\x45\xbc\x19\xc0\xd8\x69\x20\x66\xc7"
+ "\xf6\xf0\xf1\xd3\xf8\xc5\xe1\xe2\x5d\xda\x0f\xe6\xd1\x6e\xfa\x26"
+ "\x44\xf8\x84\x4c\xe3\x13\x9e\xb0\xfc\x1c\x82\x63\xde\xb7\x87\xc4"
+ "\x50\x03\xca\x1c\xc5\xb2\x70\x31\xef\xbf\x5e\x71\x0c\x45\x7c\xa2"
+ "\x38\xca\xbb\x0e\xf9\x24\xfb\xf1\xfb\xff\xce\x39\x8a\x81\xde\x14"
+ "\x69\x3f\xfa\xf1\x25\xcb\x30\x86\x7a\x7a\xb8\x7c\x7a\x26\xec\xf7"
+ "\xdf\x34\x4f\x44\x31\x2f\xc5\x52\xf4\xde\xb1\xad\xb3\x1b\x2a\x37"
+ "\x80\x91\xbf\x7b\xec\x0e\x7e\xf7\xb8\xbb\x0b\x63\xaa\xb5\xc8\xb7"
+ "\x81\x5c\xd8\xd5\x05\xe9\x55\xcf\x89\x98\x4a\x89\xa7\xda\xdc\x1e"
+ "\xfe\xee\xd1\xe1\x75\xc2\x2c\x27\xf3\x34\x20\x3c\xc5\x51\xc7\xf3"
+ "\xde\x00\xd2\x95\xd2\xd3\x10\x4b\x3c\xc0\x18\x8c\xf3\x43\x1d\x43"
+ "\xd5\xab\xdf\x37\xae\x08\x17\x43\x5d\xfa\x7d\x63\xdd\x39\x11\x3f"
+ "\xf1\xf7\x8d\xff\x23\x62\xa8\xe5\x61\xdf\x7f\xcc\xf9\x99\x98\x6f"
+ "\x20\xda\x3b\x52\xbc\x80\xf2\xf4\x79\x7c\x8f\x98\xd7\xf3\xee\xda"
+ "\x51\x46\x31\x2d\xc5\xb3\x8e\xe2\x56\xa8\xdc\x0c\xc6\xfe\xbe\xdc"
+ "\x78\x8c\x51\x63\xbd\x68\xeb\x5e\x3e\x2b\x68\xbf\xe5\x0b\x30\xba"
+ "\x56\x59\xf8\x5a\x19\x8a\x65\x49\x57\xf8\x3b\xc7\xa7\x61\x72\x5d"
+ "\x07\x4c\xe1\xfa\x81\x7a\xe1\xad\x7e\x39\xcd\x1f\xbb\xa3\x89\xf4"
+ "\x64\xd6\x29\xe6\x21\x1e\x90\x7e\x7c\x74\x8a\x78\xf3\x0b\x28\xfd"
+ "\x44\xf0\x86\xf3\x45\x0a\x7e\x17\x3c\x54\x37\xfe\x14\x86\x3f\x47"
+ "\x2f\x8f\x3f\x6b\x83\xf9\x73\xe0\x4a\xdf\x07\x2b\xeb\x23\xd7\xa6"
+ "\x48\x07\xe4\xf7\xc1\x6f\x3c\x39\x5c\xfe\xac\x38\x7a\x65\xfc\xd9"
+ "\x09\x57\xc6\x9f\x9d\x26\xfe\x6e\x31\x88\x3f\x3b\xa7\x08\xfe\xec"
+ "\x4c\xa6\x58\x29\xc0\x9f\xaf\x2e\x93\x3f\x9a\x18\xe9\x3b\xc5\x1f"
+ "\x4b\xd8\xf9\x9f\x4b\xf0\xe7\x0a\xf5\x67\x67\x23\x7f\x87\x18\xcc"
+ "\x1f\x59\x7f\x76\x36\x51\x6c\x14\xe0\xcf\x17\x97\xc9\x1f\x4d\x4c"
+ "\xf4\x9d\xe2\xcf\xca\xb0\xf3\xdf\x17\xe7\x4f\xf9\x15\xea\x4f\xb9"
+ "\x89\xbf\x2b\x0c\xe2\x4f\xb9\xac\x3f\xe5\xc9\x14\x0b\x05\xf8\xf3"
+ "\xc9\x65\xf2\x47\x3b\x7f\xfa\x5d\xe2\xcf\xaa\xda\x2b\xe4\xcf\x15"
+ "\xea\x4f\x79\x23\x7f\x27\x18\xcc\x1f\x59\x7f\xca\x9b\x28\xf6\x09"
+ "\xf0\xe7\xed\xcb\xe4\x8f\x26\xe6\xf9\x4e\xf1\x67\x75\xd8\xfd\x9f"
+ "\x2e\xce\x9f\x8a\x2b\xd4\x9f\x0a\x13\x7f\xf7\x17\xc4\x9f\x0a\x59"
+ "\x7f\x2a\x92\x29\xd6\x09\xf0\x67\xcb\x65\xf2\x47\x13\xe3\x7c\xa7"
+ "\xf8\xb3\xe6\xe4\xa5\xde\x17\x29\xbe\xb3\xfa\xbd\xec\x00\xfa\x6f"
+ "\xe4\x3f\x93\xef\xdc\xe6\x3e\x0a\xde\xb5\x82\x37\x95\x5f\x83\xb1"
+ "\x4a\xe6\x0d\x7f\x27\xbb\x4a\xbc\x93\xe5\x7e\xdb\x8e\xbb\x66\xb3"
+ "\x6d\xfa\x04\xf2\xcb\xf8\x7b\x57\xfe\x6e\xe2\x7d\xca\x3b\x3a\xa0"
+ "\xf2\xdf\x28\x46\x45\xdf\x1b\x28\x4e\x2d\x3d\x33\x0c\xbf\xed\xe9"
+ "\x70\x7c\xb9\xf4\xbb\x89\x3a\xd5\x3a\x3e\x25\xf6\xfc\x56\xf9\x32"
+ "\xec\xf7\xae\xd6\xb0\xfb\x3f\x5e\x9c\x2f\xe5\x30\x3c\xbe\xe0\x78"
+ "\xb3\x23\x35\x47\xf0\xe5\x13\x0d\x5f\xca\xa7\x0c\xa8\xc6\x9d\xcb"
+ "\xe7\x8b\x66\xbc\xf9\x4e\xf1\xa5\xd0\x10\x36\xd6\x44\xbb\x44\x3c"
+ "\xa1\xf5\xdd\xbb\x9f\x86\xe4\xca\x0e\x48\x1f\xf8\x5b\x62\xf4\x5c"
+ "\xb4\x73\x03\xab\x12\x0d\x6d\x68\xe3\xb6\xba\xd9\xe7\x71\xee\x91"
+ "\x99\x1f\x7e\xec\x82\xb6\x3c\x27\xf4\x6f\xcc\x85\xea\xb3\xb4\x56"
+ "\xfd\x28\x54\x14\x52\x2c\xff\x1b\xf8\xe8\xd4\x97\x30\xf7\x20\x1b"
+ "\x70\xf4\x1c\x05\xfb\xe6\xdf\x00\x5b\x95\x12\xdd\x80\x30\x4b\x91"
+ "\x86\xe7\xa4\x42\xfb\x37\x18\x8f\x4e\x2c\x06\xe3\xec\x1e\xe6\x69"
+ "\xeb\xf9\x10\xf6\x63\x5d\xef\x17\x03\x10\x7d\x89\x27\xd5\xcf\x51"
+ "\xfc\xf9\xb6\xe0\xc9\x3c\xc1\x93\x37\x54\xf1\xa7\x09\xf3\xbb\xac"
+ "\xc8\x8f\x0b\x1a\x7e\x9c\xea\x06\xa4\xef\xc8\xb9\x6e\xe4\x87\x5b"
+ "\xe1\xc7\x17\xb0\xf5\x79\xe2\x87\x73\x70\xbd\x6b\xbf\xcc\x8f\x3a"
+ "\xb2\x5f\x56\x30\xee\x53\xe2\xcf\x73\x2a\x7e\x28\xdf\x64\xa9\xf9"
+ "\xa1\xc4\xfe\x1b\x91\x1f\x1b\x02\xf1\xe7\x37\x18\x7f\xee\xc3\xf8"
+ "\xb3\xf4\x8f\x20\xed\xdb\x3a\x5c\x7e\xac\x0b\x3b\xfe\x2b\xbc\xa0"
+ "\xb1\x65\x20\x6e\x47\x19\xf1\xc1\x51\x7c\x18\x88\x27\x34\x9e\xf8"
+ "\xfe\x96\x68\x28\x29\x42\xdd\x71\x8e\xcc\xec\x67\x18\xf3\x63\xbc"
+ "\xef\x58\xfc\x1f\x40\x73\x06\x82\x07\x03\x03\x0e\xd7\x51\x20\xda"
+ "\xdb\x37\xff\x07\xe7\xc3\x39\xa9\xc8\xbc\xc4\x0d\xd2\x04\x94\x43"
+ "\x8c\xf7\x8d\x4b\xe9\xbb\x5c\xb4\x6d\xfb\x57\xc0\x94\xd9\x56\xe6"
+ "\xa1\xd8\x94\x74\x88\xd6\x9e\x90\x5d\x6b\xb3\xbe\x07\x34\xaf\x33"
+ "\x10\xfb\x72\xda\xfb\x45\x00\x64\xdf\x88\xee\x91\xeb\x03\x7c\xa2"
+ "\xf5\x24\x9c\x57\x8f\x5d\xc6\x3a\x57\x35\xbf\x16\x3b\x2f\x6b\x7d"
+ "\x72\xbf\x3c\x5f\x50\xa7\xcc\xa9\x5d\xe9\x7c\x81\x32\xa7\x76\x5e"
+ "\xac\x27\x29\xfd\x33\xea\xcf\xb0\xf9\xb5\x3e\xf3\xf2\xf8\xb5\x13"
+ "\x86\xcf\xaf\xbe\x10\xfc\x5a\xef\x1a\xca\xaf\x9d\x26\x15\xbf\x9a"
+ "\x02\xfc\xda\x39\x45\xf0\x6b\x67\x72\x80\x5f\x3b\x53\x2e\xcd\xaf"
+ "\x8b\xac\x6f\xfd\x87\xe7\xd7\x86\xb0\xf1\x8f\x86\x5f\x57\xa0\x5f"
+ "\xe7\x43\xf0\x6b\x63\x63\x08\x7e\xa9\xf5\xcb\xab\xe2\x97\xac\x5f"
+ "\x3b\x55\xfa\xb5\xf3\x32\xf4\xeb\x22\xeb\x5a\xff\xe1\xf9\x55\x1c"
+ "\x76\xfd\x4f\x30\xbf\xca\xaf\x40\xbf\x3e\x0d\xc1\xaf\x4d\xd9\x43"
+ "\xf9\x55\xae\xd2\x2f\xf4\x2d\x06\xf9\x55\x2e\xeb\x57\xb9\x4a\xbf"
+ "\xca\x2f\x43\xbf\x2e\xb2\x9e\xf5\x1f\x9e\x5f\x9b\x2f\xba\xfe\x47"
+ "\xc5\xaf\x2b\xd0\xaf\x77\x42\xf0\xeb\x05\x08\xc1\x2f\x95\x7e\xa5"
+ "\x1e\x52\xf1\x4b\xd6\xaf\x72\x95\x7e\x95\x5f\x86\x7e\x5d\x64\x1d"
+ "\xeb\x3f\x3c\xbf\x4a\xc2\xfa\x7f\xc1\xfc\xaa\xb8\x02\xfd\x2a\x0d"
+ "\xc1\xaf\x92\xc3\x43\xf9\x55\xa1\xd2\xaf\xf1\xfa\x00\xbf\x2a\x64"
+ "\xfd\xaa\x50\xe9\x57\xc5\x65\xe8\xd7\x45\xd6\xaf\xfe\xc3\xf3\x6b"
+ "\x4b\xd8\xf9\x6f\x35\xbf\xfa\x77\x29\xfe\xe1\xc1\x60\x7e\xa1\xbf"
+ "\x1e\xdf\x29\x62\x2b\x85\x5f\xe1\x7d\xc3\xad\x8b\x07\x79\x75\x26"
+ "\xe0\x1b\x72\x3e\xc9\xef\x29\x88\x3f\xe4\x23\x92\x4f\xd8\x5f\x2d"
+ "\x78\x44\xef\x00\x2f\xea\x17\x5e\xce\xf7\x4f\x57\xc0\x27\x25\xae"
+ "\xfa\xd6\xf9\xf4\x97\x2b\xe1\x53\x69\xd8\xef\x9f\x82\xf9\xa4\x8c"
+ "\x5b\x97\xcb\xa7\x50\x63\x56\x99\x7e\x28\x9f\xca\x4d\x01\x3e\x89"
+ "\x71\x8a\xc6\x2e\x1a\xab\x82\xf9\x74\x91\xf1\xea\x72\xbe\xbf\xf8"
+ "\x87\xe7\xd3\xb6\xf0\xf6\x4f\xe2\x67\x9b\x1f\xae\x91\xfc\x47\xf1"
+ "\xb2\xe3\xd5\x8a\x69\x91\x98\xc6\xbf\xb5\xa9\x91\xf3\x7c\x95\x40"
+ "\xdf\x69\xdb\xe3\x75\x79\xb4\x9f\x2e\xc1\x8c\x50\x60\xe2\xb7\x81"
+ "\x19\xfb\x23\xe0\x24\x28\xc3\x74\x7b\xec\x36\xf3\x08\x84\x6f\x65"
+ "\x95\x33\xcb\x30\x6d\x24\xc1\xb2\x6d\x7a\xfe\xde\x31\x5e\xc7\xf7"
+ "\xbe\x91\xe1\x75\x40\xf0\x04\x8b\x70\x06\x19\x8e\x9f\x4d\xcd\x24"
+ "\x09\x1a\x86\xb6\x2d\x4a\x86\x31\xf9\x6d\x60\x52\xb7\x31\x56\x67"
+ "\xe6\xb8\x64\xb8\x68\x9f\xed\xd3\x26\x82\xf5\x6d\xd3\x27\xab\xe1"
+ "\xd8\xc3\x40\x78\x15\xb8\xab\x64\x7c\x29\x41\xfd\x1d\x07\x10\xbb"
+ "\xcd\xc4\xf1\xc5\xf6\x48\x20\xb7\x2f\x86\x45\xcf\xc8\xe1\xf0\x3a"
+ "\x7d\x6a\x10\xfc\x08\x50\xf7\x23\x96\x8d\x48\xcb\x90\xe1\xd2\xfc"
+ "\x12\xa4\x11\x2c\xa6\xeb\xd5\xb4\x96\x61\xe3\x14\x3a\x22\xaf\xf5"
+ "\xea\xfe\xfa\xb0\xff\x07\x44\x1b\xe3\x7d\x3b\x26\xe6\xc8\x7d\x99"
+ "\xa2\xae\x97\xe0\xb0\xdc\x24\x99\x27\x46\xec\x47\xfa\x20\xbe\xaa"
+ "\x85\xb9\x0a\x5c\xa9\x0f\xae\x47\x1e\xd9\x1d\x16\x00\xb9\xdf\xa3"
+ "\x58\xe5\x23\x09\x72\xdf\xcd\xc1\x74\xd4\x39\x15\x3a\x22\xff\x08"
+ "\x76\x34\xc2\x64\x28\x78\x7d\x36\xfe\xcd\xbe\xe8\xb7\xcd\x7b\x35"
+ "\xc9\xc5\x89\x6e\x20\x59\x26\xd8\xab\x65\x9c\x99\xa2\xcf\x46\x38"
+ "\x30\xc8\x6b\x3d\xe5\xd9\x65\x38\x5e\xb7\x2f\x7a\x81\xd9\xa7\xd3"
+ "\xcf\x1e\x0a\x6b\x50\xc3\x5e\x23\x60\x33\x5d\x08\x9b\x3d\x14\xd6"
+ "\xa8\x86\xbd\x56\xc0\x3e\x7a\x10\x61\x73\x86\xc2\x7a\x47\xab\x60"
+ "\xaf\x13\xb0\xb3\xf3\x10\x36\x77\x28\xac\x49\x0d\x9b\x28\x60\x73"
+ "\xa8\x0d\x8b\x87\xc2\x9a\xd5\xb0\xd7\x0b\xd8\xb9\x89\x08\x9b\x37"
+ "\x14\xb6\x4c\x0d\x7b\x83\x80\xcd\x6a\x47\xd8\x7c\x2d\x6c\x03\x97"
+ "\x03\x18\x27\xcb\xc1\x8d\x02\x76\x5e\x39\xc2\x5a\x42\xf4\x2d\x82"
+ "\xe3\x15\xb0\x49\x02\xf6\x91\x02\x84\x2d\x08\xc1\x0b\x35\xec\x4d"
+ "\x02\xf6\xe9\x74\x84\xb5\x86\xe0\x85\x1a\x76\x8c\x80\xcd\x4d\x42"
+ "\xd8\xa2\x10\xbc\x50\xc3\xde\x2c\x60\x9f\x38\x8e\xb0\xc5\x21\xe8"
+ "\x1b\x80\x8d\x5e\x54\x82\x30\x25\x48\x93\xf6\x10\xb4\x55\xe3\x1c"
+ "\x2b\x70\x3e\x95\x8a\xf0\x65\x21\x68\xab\x86\x1d\x27\x60\x97\x9c"
+ "\x42\xd8\xed\x43\x61\x41\x77\x40\xd0\xf7\x6e\x99\xbe\xb7\x08\xf8"
+ "\xbc\x2a\x84\x2f\x0f\x41\x5f\xca\xb7\xcb\xba\x96\x2c\x60\x17\x36"
+ "\x22\x6c\x55\x08\xfa\xaa\x61\x6f\x15\xb0\x6b\x4d\x08\x5b\x13\x82"
+ "\xbe\x6a\xd8\xdb\x04\xec\x72\x92\xc9\x3d\x21\xe8\xab\x86\xbd\x5d"
+ "\xc0\x3e\x0b\x08\x5b\x1b\xa2\xbd\xe3\x54\xb0\x29\x02\xd6\x42\xed"
+ "\xad\x0b\xc1\x0b\x35\xec\x1d\x02\xd6\x7a\x14\x61\x1b\x43\xf0\x43"
+ "\x0d\x7b\xa7\x80\x7d\x8e\xf4\xb8\x29\x04\x3f\xd4\xb0\x77\xb1\xe8"
+ "\x55\x4e\xd9\x2e\x1e\xd4\xc2\x22\xef\x85\x4d\xb4\x41\x2a\x8b\x5e"
+ "\x5d\x86\xf7\x04\xc7\xf7\x45\x1c\xc4\x67\xf3\xde\x43\xf6\x46\xb6"
+ "\x61\xe3\x59\xf4\x33\x9d\x32\xbe\xc3\x43\xea\xb6\xe9\xd5\xb0\x13"
+ "\x58\xf4\x56\x90\x61\x8f\x0c\x85\x35\xa8\x61\x27\xb2\xe8\x75\x4a"
+ "\x3b\x8f\x0e\x85\x35\x0e\xc2\xb2\xe8\xf5\x35\x08\x73\xac\x5e\xb6"
+ "\x8d\xaa\x76\xde\xad\xc2\x37\x89\x45\x6f\x34\xcb\xf8\xec\x43\xf1"
+ "\x99\xd4\xb0\x77\xb3\xe8\xd2\x83\x32\x6c\xcb\x50\x58\xb3\x1a\xf6"
+ "\x1e\x16\x5d\xec\x92\x61\x5b\x87\xc2\x96\xa9\x61\x27\xb3\xe8\xcd"
+ "\x8d\x32\xec\xf1\x21\xb4\x27\x3d\xb0\xa1\x2f\x20\x6c\xd2\xbd\x2c"
+ "\xba\x24\x5b\x86\x0d\xf2\x03\x54\xe3\xf0\x7d\x82\xef\x85\xd9\xc8"
+ "\x77\xfe\x4d\x06\xda\xfc\x93\xa1\x7c\x0c\xeb\x9d\x70\xd5\x59\xa9"
+ "\xc2\x2b\xc6\x24\x65\x6f\xfa\x4a\xde\x37\x7f\xdd\xbc\xbc\x2c\x37"
+ "\xf3\xaa\xd3\x76\x4b\xac\x7d\xa2\x1b\xf4\x7c\xbf\xe3\xd8\xdd\xe5"
+ "\x4e\x4c\x77\xdd\x34\xaf\xac\xaf\xb2\xd2\xe0\xd4\xdd\xc9\xf7\x03"
+ "\xc6\xfb\x04\x27\xac\xca\xa1\xfb\xdd\x36\xe6\xa1\x3d\x6f\x7d\xbb"
+ "\x16\x9a\x1c\xfe\x1e\xda\xfb\xca\x83\x38\x3c\x5d\x56\x88\x30\x15"
+ "\x02\xbd\x6b\xe9\x77\x14\xf7\x00\xe2\x7f\x82\xad\xb5\xa4\x63\x1b"
+ "\xcc\x58\x5f\x7e\x07\x3e\xf3\x36\xa0\x0f\x84\x63\x65\xba\xbd\x90"
+ "\xf6\x13\xaa\xac\x70\xc5\xd6\x98\xd9\x8b\x8b\xba\xad\x5b\xe1\xe6"
+ "\xb3\x52\x25\xb7\x03\x7c\x6f\x91\xf3\x96\x07\xfd\xb1\x0b\xd3\x69"
+ "\xcf\x11\x56\xfb\x8a\x49\xec\x47\x52\xf9\x3e\x6f\xb3\x8d\xb5\xb3"
+ "\xa4\x79\xd9\xfe\xfe\xed\x65\x74\xf6\x81\x7d\xeb\x59\xe8\x50\xe5"
+ "\xb9\xae\x7f\x85\xef\x55\x82\x7d\xca\x0e\xb9\x87\x87\x0d\xe2\x59"
+ "\xf5\xc2\x5c\xec\x57\x0f\xfa\x6b\x99\x72\x1f\x3d\x4e\x5d\x44\xbe"
+ "\xb8\x7f\x59\xef\xd4\x8d\x30\xca\xf7\x46\xa7\xce\xd4\x29\xdf\x27"
+ "\x29\x7b\xa9\x84\xde\xdb\x65\x61\x2a\xf6\x2d\xc3\xbf\x3f\xd7\x40"
+ "\xfe\x25\xed\xb3\xc6\x62\x17\xa6\x9a\xc6\xd0\x99\x16\x2f\x1f\xc1"
+ "\x3a\x33\xc4\xfe\x98\x2f\x6f\xc2\xdf\x78\xf9\xd7\x25\xff\x32\x82"
+ "\xe1\x7c\x4b\x9a\xd7\xce\xaa\x2a\x13\xa9\x6f\x5b\x7d\xcc\x8f\x78"
+ "\x2d\xac\xdc\x5e\xe6\x28\xee\x06\xb1\xaf\xf4\xcb\x3f\xe5\xfb\xdc"
+ "\x10\xed\x90\xbe\x2c\xca\x5e\xc6\xeb\xaa\xae\x31\xab\xdb\x95\x36"
+ "\xe9\xee\x7b\x26\xdf\x7b\xdf\x0f\xa6\xdc\xbf\xec\xe9\x67\xf2\x97"
+ "\xaf\x78\xd6\xb2\xf2\xb9\x55\x05\xab\xd7\xac\xb5\x3e\x5f\xb8\xae"
+ "\x68\xfd\x86\x8d\xc5\x9b\x36\xd3\xa6\x2d\x83\xed\xdf\x9f\xa1\x73"
+ "\x4b\x80\x75\x3c\x8c\x75\x54\xf1\xfd\x9d\x28\x4d\xd0\xbe\x4a\xaf"
+ "\x37\x85\xf6\x6b\x1d\xe8\x69\xd2\x1e\xcb\x3d\x52\xd5\x32\xda\xef"
+ "\x19\x79\xac\x73\xd4\x3d\x62\xa7\x3d\xf8\x3b\xa5\xaa\x9c\x36\xd7"
+ "\x23\x76\x3a\x03\xa2\x39\xb1\x1b\x92\xc7\xd1\x3e\xfd\x55\x66\xca"
+ "\x6f\xb8\x0d\xa0\x05\xcb\x86\xc2\x39\xce\x08\x89\xaf\x5d\xcb\x5c"
+ "\x7b\xae\x65\x3d\x84\x7f\xcf\x5e\xd6\xed\x7a\xc1\x02\xbb\xf0\x19"
+ "\xe5\xcc\xd8\x25\x55\x5f\xd3\x9c\xc4\xf7\x32\x4f\xaa\xdf\xcb\x3a"
+ "\xb7\x5f\xcb\x3a\x5f\xdc\xcb\x7a\x1a\xae\x65\xce\xe4\x3d\x10\xd3"
+ "\x57\x59\xd5\xea\x94\xaa\x4c\x5c\x66\x31\xdf\x1f\xfd\xb2\x7d\x37"
+ "\xe6\x4d\xf4\x42\x44\x03\x3e\x63\x9a\xbb\xd9\x24\xda\xfd\xab\x2f"
+ "\x3d\x91\xd8\xbf\x43\x6c\xa0\x40\xb7\x0b\xeb\x11\x3c\xaa\xbe\xbf"
+ "\x05\x47\x51\xac\xcf\xe5\xf0\x74\x80\x53\xaa\x9e\xd2\xf0\x35\xaf"
+ "\x2f\xde\x51\xdb\x03\x84\xef\x97\x85\x9e\xc8\x75\x37\x30\x2f\xc2"
+ "\x26\xfa\x5f\x28\xd0\x61\x7d\x6e\xc4\xed\x56\xf7\x27\x65\xc5\xea"
+ "\x22\xd3\x9a\xf5\x05\x05\x77\x44\x43\x0a\xff\x0d\x3a\x3f\xa2\x08"
+ "\xf1\xc1\x6b\x7b\x59\x0b\xf6\xd3\x8e\xfd\x6d\x3d\x81\xde\x33\xca"
+ "\x0b\x60\x9f\x6a\x10\x6f\x35\xa6\x1f\xc3\xfb\x63\xd8\xf6\x56\x71"
+ "\xe6\x40\xfd\xef\x58\x65\x75\x06\xb6\xb3\x95\xf6\xa8\xa5\xbd\xa7"
+ "\x7a\x37\xe6\xe8\xb0\xdf\x7b\x10\xae\xd5\x74\x03\xdc\xda\x25\xed"
+ "\xba\x06\xdb\xd1\x84\xf7\x04\xff\x2e\xf1\x11\xe1\x5b\x44\xbf\xea"
+ "\xf9\x3e\x43\x48\x2b\xfb\x81\x6b\x59\x55\x5f\x65\xb5\x8b\xf6\xa6"
+ "\xe3\x7b\x76\xe3\x33\xd2\xa5\x15\x61\x6b\x7a\x4b\x73\x74\x18\x4b"
+ "\xe9\x1a\x06\x71\x56\xdb\xa9\x4d\xd4\x0e\x8a\xe7\x3e\x42\xef\xc9"
+ "\x3f\x90\x0b\xe3\x3d\xa0\xfb\xa8\x13\xa0\x6e\x2f\x6b\xc4\xab\x0e"
+ "\xaf\xda\x0f\x31\xef\x0f\x78\xb5\x62\xfa\x71\xfc\xfd\x10\x7f\xff"
+ "\xd0\xc9\xdf\xbf\x25\x52\xbb\xd7\x95\xb0\xee\x89\xb5\x70\x0b\xe1"
+ "\x47\xd9\x7a\xbc\x43\xaa\x37\x52\xdb\x69\x1f\x48\x16\xbd\x6b\x7b"
+ "\xf0\x7e\x79\xbb\x3d\x80\xf9\x20\xd5\xc4\x88\x5f\xf5\x55\x93\x83"
+ "\x57\x91\x7c\x7f\x0c\x61\x3b\xe5\xfb\x76\xbc\x4e\x5d\xfa\xd2\xe2"
+ "\x0b\x77\xbd\x92\x79\xf9\xb0\x97\x75\x6d\xbf\x3c\xb8\xd7\x00\xa4"
+ "\x1f\xe7\xe2\x55\x13\x9c\xfe\x63\x8b\x48\x7b\x63\xb2\x78\x7e\xc3"
+ "\x2c\xff\x16\x80\xb4\x1f\xe9\xb4\x1f\xf1\xef\x3f\x28\xd2\xf6\x1f"
+ "\xc1\x91\xc6\x8b\xf7\x06\x4d\xfd\x84\xb3\x8e\xf8\x39\x40\xe7\x1f"
+ "\x20\x2f\x9d\xd2\xae\x1c\xe2\xd1\x6e\x21\x5b\x3a\x3f\xe3\x69\xd9"
+ "\x28\x5b\x75\x01\xf9\xa9\x99\x11\x2c\x3f\x35\x69\x1a\xf9\xa9\x21"
+ "\x5b\x84\xfa\x52\xd7\x20\xe4\xe5\x58\xef\x0b\xf9\xf8\x5c\x33\x19"
+ "\xf1\x1c\x33\x2d\xe1\x38\xb8\x3f\xb2\xfb\x2c\xc6\x7d\x16\xd0\x93"
+ "\x7d\xe9\x91\x6a\x5e\x22\x99\xa5\xba\xe5\x7a\x45\x5b\xb0\x7d\x98"
+ "\xd6\x48\xed\x5b\x8b\x78\xf1\xb9\x09\xe1\x1a\x1d\xf0\xa5\xd2\x36"
+ "\x5e\xa6\xf2\x39\x94\x47\xb9\xbd\x84\x93\xca\xb1\x40\xbf\xb2\xa9"
+ "\x8c\xa8\xfb\x95\xfb\x31\x9d\xe2\x44\x28\xbd\x00\x11\xb4\x56\x99"
+ "\x64\x92\x7e\x1d\xde\x34\xd4\xa5\x4c\xf0\xf7\xe5\x02\x86\xfa\x69"
+ "\xa8\x6f\x51\x1d\xd2\x2b\x49\x13\x4a\x20\x8d\xf0\x91\x4d\xc7\x7e"
+ "\x38\x1b\x48\x17\x05\x2e\xf9\xfc\xdf\x5d\xd9\x1f\x5a\x81\xd7\x53"
+ "\x4f\xed\xc1\x7c\x55\xbd\x7b\x28\x0e\xdc\xbd\x59\xf4\x15\xeb\x6a"
+ "\xc2\xf2\x87\xa9\xef\x44\x4f\xcc\x3f\x8a\x78\x8a\x29\x8f\xef\xa5"
+ "\x2d\xfa\xd3\x44\xfb\xad\x12\x3d\x08\x9e\xce\x34\x11\xfb\xef\x55"
+ "\x1f\xe0\x74\xc3\xf2\xc4\x0f\x86\x75\x10\x8e\x52\x2f\xf3\x32\xb4"
+ "\x47\x6f\x6d\xf6\xe0\xb8\xfe\xea\x85\x60\xfe\xbc\xd2\xae\xe6\x0f"
+ "\x96\x3b\x8c\xe5\x5b\x18\xf6\x91\xec\x09\xd6\x19\x4f\xe7\x28\x60"
+ "\x5a\x8d\xbf\x12\x71\x6c\xf0\xf0\xb9\x11\xc4\x73\x1a\xdb\x52\x43"
+ "\x78\xb0\x3d\x2d\x02\xd7\xab\x49\xef\x96\x04\xf3\x5a\xc6\xd7\x44"
+ "\x3c\xe7\xfa\xbc\x99\xf7\x09\x6d\xd7\xab\xbf\xae\x17\x79\x47\x11"
+ "\xe6\x28\x1b\xc8\x04\xda\xbf\x54\x8c\x25\x3c\xef\x48\xe9\x37\x9c"
+ "\xbf\x2d\xc2\xae\xbd\xfa\xc7\x75\x5b\x58\x77\xa0\xdd\xaf\x96\x2b"
+ "\x7b\xc0\xca\xed\x3e\x42\xf5\xb1\x8d\x8b\xf9\xb8\x4a\x75\x50\x79"
+ "\x19\x5f\x3e\xe1\x53\x68\x35\x01\xdb\x21\xe8\xf5\x4a\x2d\xa6\x37"
+ "\x91\x2c\x72\xba\xa1\x1d\xed\x2d\x25\x59\x7c\xb5\x0a\xcb\x1f\xdb"
+ "\x45\xcf\x1b\xf9\xb3\x89\xdb\xd8\xc1\xfc\x57\x3e\xa6\x7c\x07\xc6"
+ "\xd9\xbb\x57\xa1\x2c\xf9\x01\x6e\x49\x80\x34\xb7\x8d\xf7\xed\x90"
+ "\xfb\x85\x0c\x5d\x33\x7a\x58\xd4\x4e\xa4\xd1\xd1\xbe\xca\xd7\x26"
+ "\xa3\xed\x2f\xa2\xb6\xa2\xbd\x3e\xc2\xde\xca\x05\x6a\x33\xda\x33"
+ "\xb9\x7d\xaf\xfd\x54\xe6\xfd\x11\xea\x23\xd1\x73\x82\xb0\x7d\x98"
+ "\xf7\xe3\x59\xd4\xf6\x40\xbf\x5f\x2b\x53\xd3\x98\xf7\x1b\xf9\x40"
+ "\xfc\x22\xbe\xa8\x70\x92\xec\xd7\x20\x2e\x79\xaf\x36\x21\x1b\x44"
+ "\xeb\x9a\x6b\xd9\x71\x82\x0f\xc0\xee\xe1\xfb\xdb\x6d\xc5\xba\x27"
+ "\x5a\x81\xce\xb8\xd0\xd1\x3e\xbe\x88\xf7\x10\x9d\x57\x83\x38\x8e"
+ "\x12\x4d\xb1\x2d\xb1\x24\x8f\xf8\x7c\x5c\x2e\x17\x83\xe3\x79\x2a"
+ "\x5e\xe9\x01\xfd\xdf\xe3\x0b\x96\xaf\x3d\x5a\xfd\x27\x7e\xd7\xf8"
+ "\x4b\x33\x81\xcb\x43\x21\x98\xce\x49\x7b\xf6\xc9\x63\x87\xcc\xeb"
+ "\x3d\x5f\x34\xa3\xbe\xa8\x70\x14\x69\x78\x7d\x94\xcb\xe3\xc6\xd9"
+ "\x74\xde\xaf\x0e\xcb\x1e\x95\xf1\xf0\x3e\x73\x79\xb2\x71\x19\x38"
+ "\xce\x36\x62\x3f\x07\xe5\xe0\xb5\x76\x99\xcf\xc7\x35\x34\x51\x6c"
+ "\x57\x12\x9d\xb7\x40\x36\x09\x7d\xcc\x07\xfb\x06\x02\x76\x89\x78"
+ "\xef\xe7\xbc\xdf\x53\xdc\x20\xc6\x5b\xd9\x6e\xed\x11\xf9\xd7\x06"
+ "\xc9\x30\xb5\xe5\x17\x5c\x7e\xa9\x2d\xa5\x8b\xa9\x2d\x47\x79\x3b"
+ "\x4a\x4d\x70\x4e\xfa\x71\x32\xd5\x8f\x65\x0f\xcb\xfa\x2a\xe3\x7a"
+ "\x6d\x3b\xe1\x7a\x11\x6d\x15\xb5\x09\xeb\x36\x72\xfb\x37\x93\xcb"
+ "\xc1\x4b\x72\xdb\x5b\x3d\x36\x2a\x5b\x53\xfc\x8d\xc4\xcb\xa2\x1f"
+ "\xb3\xbb\xc7\x23\xf6\x64\x8e\xc6\xf2\x07\x4d\x4f\x13\xfc\xbe\x4e"
+ "\xb2\xd1\xa6\x27\xf9\xfd\x09\xd3\x42\x94\xd5\xb3\xa0\x47\x7c\x06"
+ "\x92\x51\x45\x2e\x7a\xa4\x7d\x6f\x93\xbf\x8e\xb4\x3e\x84\x3e\xd2"
+ "\x41\xa2\x37\xc9\x32\xfa\x48\x93\xfb\x2a\x7f\xdc\xa3\xc8\x2d\xd6"
+ "\x53\x47\xb4\x17\xfc\xd9\x3b\x09\xe5\xf8\x68\x40\xb6\xf6\x4e\x92"
+ "\xe9\x78\x10\xe9\x68\xc0\xfa\x7e\x2d\xf7\xeb\x20\xc2\xa3\x2f\xb6"
+ "\xef\x4d\xb9\xed\xb5\x32\xfc\x1c\x85\x0f\xb2\xae\x1e\xdf\x45\xf6"
+ "\x97\xf3\x60\x6f\xa7\x5c\xb6\x49\xae\xeb\x8c\x02\x4b\x3e\xa2\xd8"
+ "\x6b\x7d\xef\x19\xb2\x83\x13\x91\xf7\xdc\xf6\xf1\xb3\x9c\x44\x1a"
+ "\xe9\x8e\xa8\x63\x5f\x35\x97\x43\xf4\x7b\x02\x72\xb4\xf7\x98\xc6"
+ "\x3e\x91\x2d\xae\x69\x43\x1c\x64\x4f\x49\x96\xc8\xa6\x52\xbc\x80"
+ "\xf8\xf6\xc8\xfa\x23\xb7\xf9\xf5\x3b\x82\x65\x65\xdf\x26\x94\x95"
+ "\xf1\x01\xdc\xaf\x27\x86\x1a\xe7\x1a\x84\x0d\xac\x13\x65\x5e\x5f"
+ "\x29\xf7\xed\x90\xe8\x9b\xfc\x4c\x74\xdb\xca\xe9\x36\x5e\x45\x47"
+ "\xa4\x5b\xed\x3e\x19\xfe\x28\xd9\xf2\x80\xbe\xbe\xfe\x67\x45\x97"
+ "\x87\xda\x8b\xda\x0a\xd2\x07\x55\xbb\x0e\x6b\xec\xc5\xd1\xd0\xf6"
+ "\xe2\xf5\x32\xb9\xbf\x8d\x1a\xdd\x68\x92\xfd\xdd\x03\x0a\x1f\xda"
+ "\xdc\xfd\xf2\xbe\xe2\xd5\x07\xc8\x7e\x52\xdd\xea\x31\xa8\x5e\xd0"
+ "\x55\xd6\xe5\xda\xf5\x43\xf9\x50\x9b\xa1\xd6\x67\xe2\x35\xd9\x04"
+ "\xc2\x41\x3c\xe5\x7e\x25\xa6\x09\xbe\xd6\x92\xff\x5e\xa3\xb6\xd1"
+ "\x08\xbb\xc7\xcf\x48\x5f\x6a\x33\x83\x75\xf1\xf5\x23\xb2\x2e\xca"
+ "\x75\xef\xbb\x1e\x79\x94\xa6\xaa\xf7\x98\xa6\x5e\xe2\x4d\x0b\xd1"
+ "\x41\xe6\x69\xa4\x32\xa6\x11\x3c\x96\x2d\xc6\x32\x2e\xcd\xf8\x58"
+ "\x43\xed\xc3\xba\x2c\xdc\x66\xed\xe5\xb6\xa2\xb8\x4f\xb4\xc7\xdd"
+ "\x20\x8f\x13\x98\x96\x26\xa7\xd9\xe5\xb1\x44\x91\x9b\xe5\xc1\x6d"
+ "\xda\x97\x1d\xda\x3f\x7a\xdd\xa2\xf8\x47\x1c\x17\xb7\x45\xfb\x72"
+ "\xe4\xfe\x51\xda\x78\x91\xf6\x7a\x12\xa5\xed\x12\x74\xd8\xc3\xf8"
+ "\x78\xb5\xd7\x2e\x8f\x57\xa4\x5f\x12\x3e\xa7\x91\x8e\xd1\x33\xe2"
+ "\x38\x48\xf8\x1d\x65\xfd\x14\x43\xd4\x3a\xa5\x1f\x1f\x27\x7b\x40"
+ "\xf6\xc2\xb4\x42\xd8\x0d\xd3\x5c\xfe\xfb\x15\xd9\x1d\xf2\x43\x28"
+ "\x1f\xe1\x8e\x91\x2d\xea\x92\xde\x88\x32\x3d\x8a\x7e\xc1\xdf\x0c"
+ "\x88\x77\x5f\x8f\x28\xfb\xc6\x4d\xdc\x57\xf8\x5b\x66\x84\x92\xa6"
+ "\x94\x43\xbb\x75\x82\xca\x51\x79\xc5\x7e\x91\xed\xf2\x92\x6d\xe2"
+ "\xf5\xbd\xb1\x4c\x96\x71\x1e\x37\x28\x7e\xd1\x80\xa4\x82\xa5\xbd"
+ "\x9d\xb9\x4d\x7b\xe3\x90\xb0\x67\x6f\x1c\xa0\xb2\x9c\x7f\x68\x2b"
+ "\xb7\x7e\xc3\x4e\x37\x14\x82\xbe\xfe\x4b\xb2\x8b\xd5\x75\x72\x3b"
+ "\x3d\xa2\x1f\x6f\xbc\xcb\xfb\x21\x6c\x6a\x8d\x68\x4b\x75\x5d\x7d"
+ "\x3f\xcf\xfb\x84\xfa\x42\x79\xbb\x55\x79\x6c\x20\x85\xf2\xbe\xe1"
+ "\xed\xd2\x94\xf3\x0f\x58\x86\xc0\x37\x88\x33\xb3\x0c\xf5\x7b\x15"
+ "\xdb\xbb\xbf\x58\xb4\x73\xff\xbd\x8a\xdd\x45\xba\xb4\x90\xed\xe5"
+ "\x79\x2b\x64\x98\xb9\xf2\x2f\xb7\xef\xfb\x97\x0b\xba\x26\x4a\x32"
+ "\xbd\x8f\x8b\x7e\xec\xdf\xc4\xe3\xec\xbf\xe5\x22\x6d\xf7\x2f\x56"
+ "\x68\xab\xbe\x27\xfd\xc1\xfa\x8d\xf4\xcc\xe5\xbe\x84\xc7\xb0\x75"
+ "\x04\x43\x6d\x12\x63\xc4\x1b\x39\x5a\x9f\xba\x4b\x3a\x70\x81\xc6"
+ "\x25\xe1\xab\x1e\xf8\xa3\x3c\xff\x02\xf6\xc2\x9f\xe0\xb8\x50\x97"
+ "\xa4\xd8\x18\xd6\x97\x89\x31\x7f\x07\xc2\xd4\xf1\x73\x2d\x68\x3f"
+ "\x60\x35\x0c\xd9\xa7\x5f\xf5\x3b\x65\x9c\xfb\x3d\x8a\xdd\x20\x5b"
+ "\xd2\xe6\xee\x90\x7d\xba\xba\x83\xf5\xb2\x2d\x39\x27\xd5\xfd\x2c"
+ "\xd8\x0f\xab\xfb\x59\xb0\xcd\x38\xf0\xb6\xd6\x66\xa0\xdf\xbc\xbd"
+ "\xaf\xb2\xae\x24\xc8\x0f\xc0\xb4\x8b\xdb\x8e\xba\x6c\xd2\x51\x3a"
+ "\x63\x81\xdb\x27\x3e\xa7\x74\x60\x94\xd2\x66\xb2\x9b\xbd\x2f\x28"
+ "\xf3\x17\x07\x7e\x41\xbe\x9a\xa6\xbe\x9e\x20\xdb\x49\xf5\x29\xf8"
+ "\xf4\x40\x7b\xf4\x23\x1d\x68\xbe\xa5\xee\x98\x6c\xe7\x1b\x83\x6c"
+ "\xa5\x3c\x86\x91\x9d\x0c\x1e\xab\xaa\x0f\x04\x8f\x55\x07\xf6\x0d"
+ "\xb5\x91\x07\x2c\x97\x3f\x56\x1d\x30\x93\xdd\x52\x6c\x64\xb0\x2d"
+ "\x38\x50\x50\x1f\xe4\xcb\xd6\xb9\x15\x5f\x36\x60\x47\xeb\xb6\x93"
+ "\x8d\xc2\xfa\x8f\xca\x75\x77\x3a\xa5\x97\xbb\x95\xba\x31\x3f\xa9"
+ "\xcd\x84\xb2\x59\x59\x9d\x8d\x32\xd5\x2a\xfb\x80\x5c\x37\xfb\xf9"
+ "\x3e\xe9\xfb\x8d\x28\x7f\xd1\x24\x67\xf6\x35\x5f\x42\x67\x60\xac"
+ "\x68\xe9\x5d\xab\xd0\xb7\x7e\xbd\xda\x2f\x3c\xb0\x97\x95\xf7\x55"
+ "\xd6\xcf\x56\xf7\xb1\x1a\xd3\x76\xcb\x73\x08\x9c\xb6\x1c\x57\xbd"
+ "\xa9\x61\x6f\x70\xdf\x44\x3f\xea\x73\xa8\x1f\x14\x13\x61\xfd\x09"
+ "\xe4\xf7\xa0\xcf\x87\xf7\x3f\xae\x6d\x18\x94\xf9\xdd\x3d\xdf\xd8"
+ "\xd4\xfe\x55\xb5\x9b\x6c\xa5\x1c\x7b\xb6\xa2\xbf\x53\xa3\x9e\x8b"
+ "\x99\x33\x3d\xdb\x64\x2d\x5c\xb9\xa6\x68\xc5\xdd\xa6\x95\x6b\x56"
+ "\x16\xad\x5c\x56\xb0\x72\xf3\xb2\xa2\x95\x6b\xd7\xa4\xae\x5e\xf6"
+ "\xec\xca\x67\x4c\x1b\x97\xad\x33\xa5\x15\xdf\x5a\x1c\x0d\x01\xd0"
+ "\x07\x4c\xcb\xd6\xad\x5b\xbf\x7a\x79\xbe\x69\xcd\xca\x67\xc6\x17"
+ "\x2e\x5f\xb7\xbc\xc8\xb4\xac\x70\xed\xfa\x35\xf9\xa6\x5b\xf3\x27"
+ "\xdc\x9a\x76\x5f\x7e\xb4\x7a\x0e\x6d\x9c\x11\x7a\xfc\x5f\xff\xb5"
+ "\x7b\xf7\xd7\x60\x88\xd7\x59\x0b\xe3\x8b\x57\xae\x11\x73\x76\x0d"
+ "\x6f\x4f\xdc\x03\x56\x3a\x47\x91\xce\x0b\x63\x95\xf5\xed\xf8\xab"
+ "\x27\x38\xec\xa7\x89\xce\x51\xc4\xb6\x27\xf5\x55\x36\x94\x39\xa5"
+ "\xb7\x2c\xfc\x2c\x30\x4c\xc7\xbe\x25\xb1\xaf\xff\xd0\x8d\x3e\x9b"
+ "\x95\xd6\x04\x37\x7c\x0d\x09\x35\x1b\x40\x8f\x57\x0c\x5e\x46\x3a"
+ "\x67\x11\xcb\x1c\x71\x4a\x8d\xf2\x59\x7a\x8d\x39\xae\xa8\xdf\xa7"
+ "\xb1\xf2\xdf\xa7\x09\xbe\x34\xce\x53\xe6\x79\xb3\x5e\x82\x2c\x92"
+ "\xcf\x0e\xa9\x91\xbf\xd7\x7b\x11\x65\x99\xe6\x4b\x7b\x7f\xff\xb0"
+ "\x19\xfd\xc1\x53\xf6\x1b\x78\xde\x3c\xb7\x04\x31\xd8\x2e\x7d\x73"
+ "\x49\x1a\xbc\x86\x75\xad\x4b\x64\xac\xaf\xb2\x31\x51\x99\x4f\xc3"
+ "\x3e\x18\xb1\x2f\x27\xe5\x7e\x0c\xf0\x7e\xec\x65\xc9\x7b\x46\x63"
+ "\xfb\x5e\xa5\xf6\x34\x66\x28\x7d\xc0\x76\x9f\x74\x4a\x0d\x07\xb1"
+ "\x9d\x46\x6a\x57\xa8\xb9\x3e\x9a\xef\xc2\x76\x56\xfb\x37\x20\xdd"
+ "\xc6\x88\x33\x22\x76\xd7\x0b\xfd\xc3\xfe\xb4\x34\xe0\xfd\xae\x2f"
+ "\x21\xa6\x9a\xce\xf0\xb3\xdd\xcc\x4e\xb8\xbd\xe0\xb0\x9c\x84\xf8"
+ "\x4d\xcc\xc5\xfe\xf9\xaf\xdd\x72\x9f\x8e\x92\x6d\xf8\x5f\xcf\x9d"
+ "\xd4\x53\x9f\x70\xac\x88\x69\xf8\x32\xec\xdc\xa2\xfe\xb5\x6b\x99"
+ "\x9b\xed\x57\xfb\x5c\x6f\xf2\xb3\xbd\xc9\xdf\xea\xb5\xd1\x99\x70"
+ "\x6f\x1a\xb0\xee\x3c\xd9\x37\x76\xb3\x81\xc5\x2a\x5f\xaa\x91\xe4"
+ "\xcc\x1d\x06\xb7\x41\xc1\x4d\x67\x03\x52\x19\xc1\xff\x37\xab\xb1"
+ "\x8c\x4b\x85\xdf\xa2\xc5\x4f\x38\xf1\xde\xa5\xd4\x23\xe2\xf0\x37"
+ "\xc9\x27\x70\xa1\x2c\xbb\xc2\xd4\x97\xfc\xea\x5e\xf6\xb1\x03\xd3"
+ "\x77\x7f\x03\x7a\x84\xc5\xd8\x95\xe3\x47\xfd\x68\x48\x25\xfc\x2f"
+ "\x5e\x0b\xb0\x1d\x61\x7a\x2b\x1b\xf3\xdc\xfc\x9c\xbe\x37\x51\xff"
+ "\xab\x73\xb5\xf3\xd8\xb2\x3c\x3f\xa0\x91\x67\xf3\xab\xe4\x13\xee"
+ "\x41\xfc\x28\x43\xbb\xbf\xc2\x71\x18\x9f\x27\xec\x81\x14\xaa\x07"
+ "\xef\xdb\x69\x3e\xa4\xaf\xf2\x27\x53\x94\xfa\x18\xca\xff\x2e\xbf"
+ "\x98\x83\x91\x65\x2b\x95\xe6\xae\x4b\x8b\x19\x6b\x46\xfb\x4e\x6d"
+ "\x24\x19\xc3\x32\x05\x8a\x4c\xa1\xac\x7f\xcc\xe5\x2a\x01\x52\x58"
+ "\xe5\x9b\xae\x86\xd1\x08\x87\x72\x55\x8f\xf2\x44\x72\x85\xb0\xb5"
+ "\x8a\x4c\xa1\xac\xb5\x13\x1c\xb6\x21\xfa\xf0\x66\xb3\x9e\x6c\x64"
+ "\xa7\xf4\x56\x2c\xc9\x18\x7b\xfd\x47\x27\xd9\x75\x8b\x4e\x0a\x3e"
+ "\xbd\x15\xeb\xf0\x08\x1e\x04\xe8\xfe\x13\xa7\x8a\xee\xed\x28\xc7"
+ "\xd1\x44\x67\x31\x57\xfd\x56\x2c\xb6\xad\x9d\xfb\xe2\x5b\x90\x07"
+ "\x7c\xac\xfa\xc9\x71\x2a\x2f\xd3\xf0\x78\x80\x86\x6f\xa5\x84\xa2"
+ "\xa1\x86\x76\x7a\x71\x4e\xe0\x5b\x93\x49\x57\xb0\xcc\x62\xe5\xec"
+ "\xbf\x50\xbc\xc4\x3a\xf4\xfa\x3d\x60\xa0\x3a\x5a\x12\x38\x7c\x95"
+ "\x52\xc7\x6e\xa4\xb5\xab\xd4\x72\x51\x79\x6e\x69\x04\xa0\x39\x71"
+ "\x2a\x9f\x9c\x40\xf4\x7d\xeb\x78\xa0\x3c\x73\x6b\xcb\xdf\xfa\x4c"
+ "\x50\x5b\xf9\x85\x6d\x75\xbe\x26\xce\x75\xc5\xfa\x9b\x62\x2e\xd6"
+ "\xde\x64\x93\x18\x27\xed\xe3\x48\xbe\x9b\x66\x38\x6a\x01\x28\x4d"
+ "\x7e\x9e\xdc\x8b\x63\x8f\x76\x7e\x3f\xfc\xfb\x86\xa6\x97\x82\xdf"
+ "\x37\x34\x15\x85\x7b\xdf\xa0\xa9\xf7\x5d\xaa\xd7\xdf\x90\xa3\x53"
+ "\xd5\x7d\xc8\x1f\xa2\x6e\xa5\xfc\x84\x46\x75\x3c\xf3\xd3\x51\xd4"
+ "\x86\x36\x3a\x9f\xfc\xc6\x1c\x1d\x43\x3c\x2d\x7c\x0c\xff\xa9\x51"
+ "\xf8\x2f\xe4\x17\x35\xb9\x08\x46\xdb\x8f\xc1\x3f\x43\x02\xcd\xb1"
+ "\xc3\x37\xfc\x21\x72\x26\xd0\x69\x80\x60\xb2\x28\xd9\x52\x10\x30"
+ "\xb0\x10\x0f\x31\x00\x63\x39\x3c\xc3\x3f\x91\x24\x3f\xbb\xf8\x83"
+ "\x7e\x10\x7e\x30\xff\xef\xf8\x8b\x12\xed\xe5\xf8\x3c\xa0\x93\xeb"
+ "\x2b\x57\x41\x64\x5c\xa4\x34\x03\xa5\x48\xa8\xbf\xe7\xf1\x2a\xcb"
+ "\x89\x44\x7c\x07\x39\x30\x63\x5e\x19\xbf\xf2\xcc\xd4\xcf\x94\x12"
+ "\xfc\x8c\x7f\x11\x8b\x55\x15\xdc\x1c\x91\xcf\x97\x1e\x25\x3b\x07"
+ "\x93\xa4\x46\xa3\xba\x4a\x23\x94\x45\xf2\x9b\x78\xfa\xc7\x83\xf8"
+ "\x52\x30\x7f\x6c\xeb\x20\xc0\xd5\xee\x6d\x2a\xf0\x8f\x44\xf3\x6f"
+ "\x49\xbc\x48\x1f\x87\xfb\x37\x46\x75\x7f\xb3\xf8\x19\x77\xf2\x5b"
+ "\xc4\x7f\xf1\x3f\x53\x7b\x94\x72\x1b\x10\x8f\x5b\xf2\x42\x81\x06"
+ "\xe8\x7f\x8b\x5d\x49\x52\x4b\x68\x20\xff\xf6\xf4\xe0\xe7\x14\x4f"
+ "\xf0\xf3\x5d\x99\x7f\x7f\xc3\x51\x07\xe9\x9f\x52\x27\xfa\xec\x77"
+ "\x26\x0c\x26\xc6\x6b\x54\x26\xbe\x46\xa3\x42\x81\x3f\xb9\x35\x11"
+ "\xd8\x9e\x3a\x55\xb2\x3e\x34\xf4\x7f\xcd\xdf\x0d\xdb\x64\x85\xb8"
+ "\xd9\x65\x1c\x92\x39\x4d\x93\x46\xcf\x23\x4c\x72\xda\xa4\x77\x87"
+ "\xc0\xf3\x34\x93\xea\x59\x67\xc6\x7f\x1a\x01\x6e\x2d\xf8\x36\xda"
+ "\xfa\xfd\xdf\xff\x85\x7f\x3a\xd2\x8f\xef\xff\xfe\x8b\xfe\x98\x18"
+ "\xc5\xd1\x12\xf1\x1f\xfa\x8f\x0d\x1a\x4a\x26\x67\x30\x39\x81\xc9"
+ "\x37\xdf\xca\x38\xfe\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf"
+ "\xf7\x7f\xdf\xff\x7d\x07\xfe\x74\x3c\x8e\x60\xf2\xdf\xe0\xfd\x60"
+ "\x3e\x85\x41\x96\x3a\x26\xe9\x80\xa9\x32\xca\xee\x05\x9d\x01\x46"
+ "\xe8\xbf\x3d\x2f\xcf\x34\xd8\xa0\xcb\x2c\x40\xdf\xdc\xd0\x1a\x81"
+ "\x7b\xf0\xba\x51\x95\x3e\xee\xdb\x6a\xd1\xdf\xfd\xa7\x43\xe2\x45"
+ "\x60\x5c\x18\x09\x23\x60\x24\x18\x20\x0a\xa2\xe1\x2a\x88\x81\x58"
+ "\x88\xc3\x78\xd3\x08\xa3\x60\x34\x5c\x0d\x09\x70\x0d\x5c\x0b\xd7"
+ "\x41\x22\x5c\x0f\x37\x60\x4f\x92\xe0\x26\x8c\xed\x6f\x46\x82\x8c"
+ "\x0d\xdd\x97\x32\x30\x27\xe2\x3f\xf8\x7f\x36\x98\xf9\x73\xde\xf7"
+ "\xe9\xff\x47\xd3\xed\x72\x7a\xbb\x9c\xee\xfc\x3e\xfd\xff\x68\xba"
+ "\xe9\xbf\xf9\x77\xec\x7f\xeb\xaf\x0e\x4d\xb6\xb0\xda\xba\x90\xb6"
+ "\x52\x9b\xaa\x93\xff\x06\x9f\xe1\x12\xe5\x87\xe0\x0b\x2e\xaf\xfd"
+ "\x33\xe3\x35\x59\xdc\x96\x02\x88\x79\x5e\xa6\xfe\xf3\x86\x2b\xa9"
+ "\xfc\x6d\xeb\xc4\xcb\x85\x17\x42\x6e\xc3\x11\xc6\x76\x15\x5e\xd7"
+ "\x28\x78\x04\x0c\x7d\xe2\x7a\x0e\xf3\x3f\x6d\x02\x70\x9e\xc2\x0b"
+ "\xab\x3d\x5d\x0c\xd0\x11\x03\x70\x66\x36\xc0\x67\x87\x00\xba\x7a"
+ "\x02\x38\x7b\xcb\x02\xad\xbb\x60\x15\xf7\x26\xbc\xbe\x26\x44\xe0"
+ "\xd4\x0d\x4e\xef\xd9\x67\xe4\x64\x9a\x26\x4d\x98\x3c\xe1\xde\x7b"
+ "\x96\x99\xc6\x8f\x37\xdd\x9d\x36\x69\xd2\xc4\xb4\xfb\x26\x4e\xfa"
+ "\x81\xe9\xee\xbb\x1f\x98\x94\xf6\x40\x5a\x9a\x69\xf5\xa6\xc2\x95"
+ "\x93\xd2\x9e\x5d\x6e\x5a\xb1\xb2\x70\xf5\xc6\x65\x85\xcb\x2f\xd5"
+ "\xa3\x2b\xfa\xa3\xe6\xdd\xe4\x07\xce\x81\x60\x6a\x4f\x03\xe9\x17"
+ "\x79\x20\xfd\x7e\x0a\x0c\x65\x4f\x8a\x7c\x05\xff\xe9\x56\x1d\x04"
+ "\x9d\xe5\x10\xe8\xf2\x13\x41\xb7\x24\x19\x74\x0b\xdb\x41\x57\x81"
+ "\x69\x3b\xf6\x80\x6e\x5b\x37\xe8\x5e\x38\x05\xba\x22\xeb\xd0\xb4"
+ "\x57\xb7\x8b\xb4\x5f\xea\x41\xf7\xb3\x29\xa0\x7b\xcb\x08\xba\xfd"
+ "\x16\x91\x76\x14\x61\x8e\x18\xfe\x4b\xfa\x7e\xe5\x7f\x97\xeb\x2f"
+ "\x0c\xf9\x73\x72\x99\xa2\x51\x7a\x20\x39\xc4\xa4\xe8\xf7\x7f\xdf"
+ "\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\x3f\xfc\xcf"
+ "\xa5\x83\xc9\x5f\x4a\x7a\x78\xaf\x06\xa0\xcf\x66\x48\x72\xea\xee"
+ "\x9f\x4c\x6b\x48\x80\xbe\x95\x02\x03\x5f\x53\x2a\x2e\x3d\xfe\x44"
+ "\xe2\xc0\x3f\x02\xaf\x91\x06\xf5\x5a\x14\x5a\x6b\xd4\x9c\x98\x06"
+ "\x11\x89\x20\xd6\x45\xd9\x58\xbb\xf8\xd6\xf7\x6e\xe8\x01\x03\xff"
+ "\x56\x9f\xbe\x0f\x45\xfc\xc5\x4e\xf8\x79\xa3\xb2\x8e\x4a\x81\xa3"
+ "\x75\x54\xb4\xee\x0a\x61\x57\x13\x6c\x98\x75\x33\x46\xf6\x7a\xa2"
+ "\x34\xfd\x00\x00\x7d\x67\xfa\xda\x5e\xe6\x6a\x29\x01\x68\x6e\x12"
+ "\xdf\x9b\xd2\x9a\x1a\xc4\x7f\xd2\x09\xe5\x4d\x62\x1d\x15\x73\xbf"
+ "\x88\xe9\x98\xd6\xe3\x84\x8a\x3d\x72\x9d\x3d\x4a\xba\x63\xfb\xd7"
+ "\xd0\x62\xe2\xdf\xd3\xb8\x5a\x4c\x3e\xc8\x18\x4b\xfd\x8f\x4a\x44"
+ "\xd8\xa4\x70\x6b\x68\x94\xf5\x62\x54\xb7\x0c\x9f\xa9\xa9\x0f\xfb"
+ "\x18\xb5\x58\xa9\x2f\x0c\x8e\x18\x2a\xab\xe0\xc1\xb6\xf7\x60\x99"
+ "\x1a\x05\x0f\xb6\x47\x69\xa3\x2b\x63\x0b\xaf\xe3\x50\xa8\x36\x99"
+ "\xde\x4f\x8f\x5c\x7e\xdf\xc4\xce\xf4\x8f\x57\x24\x9b\xae\x99\x34"
+ "\x63\x79\xf2\xed\x2c\x2d\x3e\xf5\xe5\xb4\xab\xcc\x51\xe6\xb8\x89"
+ "\xf3\xd3\x24\xa3\x34\x4e\x4a\x1b\x6d\x94\x6e\x7b\x9a\xfe\x6d\x1f"
+ "\x93\xc2\x7f\x4d\xfa\xf4\xed\xf9\xf7\x99\x46\x4e\xdb\xb9\x63\x83"
+ "\xf9\x5f\xfe\x69\xa6\xf9\x91\x85\xeb\xee\x78\x2f\x4d\xba\xfa\x4f"
+ "\x2f\xbf\x9d\xf2\x25\x41\x8c\x1d\x47\xff\x2e\x6e\x8e\x48\xb8\xc3"
+ "\x46\x58\xda\xaf\x37\xbd\x47\x29\x77\xea\xd3\x8b\xf2\xef\x9d\xd8"
+ "\x44\x35\x3e\xf6\xcc\x78\x1b\x95\x99\x39\x47\x94\x11\x10\x13\x8f"
+ "\xa8\xf3\x26\xfc\x86\x4a\x9b\x78\x1b\x40\x2f\x70\x0d\xe2\xbe\x4e"
+ "\xb4\x50\xa4\x8e\x3b\x91\x76\x93\x5c\xf7\x4f\xe8\xdf\x27\xdf\x9a"
+ "\x20\x21\x86\xd1\xe3\x1f\xa6\xdc\x89\x7d\x69\x7d\xa6\x96\x74\xfd"
+ "\xb3\xc9\x29\x23\x27\xfd\x13\xde\x25\x3f\x9b\x6c\x94\xf0\x7e\xa7"
+ "\xb8\x27\x1a\xe4\xff\x40\x40\x18\xa5\x5b\x13\xd2\xf3\xf3\xef\xfb"
+ "\xd4\x9d\x7f\x9f\x51\x32\x37\xe5\xa7\x9b\xaf\xad\x2a\xb8\x2b\x39"
+ "\x3d\x39\xff\x5e\xa3\xc4\x7f\x1f\x30\xdf\x5a\xf9\xa4\x51\xba\xfd"
+ "\xdd\xb4\x51\x46\xdd\xbf\x35\xea\xe0\x7d\x69\xc1\xa1\xf7\x23\xfe"
+ "\xfc\xe7\x0f\xe0\xce\xd5\x1f\xe8\xee\x9c\xfd\x81\xa4\x1b\xf5\x41"
+ "\xcc\x13\xf0\x6f\xc6\x91\xf0\x6f\x89\x78\x99\x1e\x81\x56\x5d\x69"
+ "\x76\xab\xb4\x31\xaf\x35\xa2\xb4\xad\x55\xff\x38\xb4\x46\x2e\x1d"
+ "\xd5\x3a\xe2\x91\x79\xad\x23\x1f\x3f\xdd\x6a\xb8\x1d\x5a\xa3\x00"
+ "\x5a\xc7\x82\xd4\x3a\x0e\x12\x5a\xef\x1e\xb5\xa3\xf5\x91\x31\x92"
+ "\xfd\xea\xde\x87\xec\x37\xe8\x67\xda\x93\x8d\x60\xbf\x35\x1a\xec"
+ "\xb7\xc5\xc4\xd8\x6f\xc7\xeb\x0e\x68\xb4\xa7\xe1\x73\x3a\x24\xd9"
+ "\x23\x37\x8f\x00\x10\x6d\xf9\xc0\x04\xf0\xc1\x58\x98\xf6\xc1\x38"
+ "\xfc\xbd\x05\xaf\x64\xbc\x6e\xc5\xeb\x76\xbc\x30\x4e\xf9\x80\xf6"
+ "\xd5\x81\x94\x11\xe9\xff\xfc\xee\xb2\x65\x93\x97\xdd\x9b\x33\x3d"
+ "\x22\x62\x79\x32\x5c\x85\x54\xd3\xa7\x27\x8f\x8d\x9c\x12\xb9\x3c"
+ "\xf9\x53\xb7\x19\xff\x35\x4a\x4f\xfd\x7b\xc4\x88\x89\x7d\x53\xfa"
+ "\xf2\xfe\xe5\x53\x1f\x44\x23\xfd\x41\x2b\xc3\xbd\x36\xd0\xb9\xb1"
+ "\x8d\x6e\x5b\xef\x43\x7d\xb6\x18\xa3\x13\xa2\x2c\x8a\x1c\x8b\xbc"
+ "\xf7\x8c\x6e\x5b\x19\xca\x5f\x4c\x6a\xe8\xbc\x6d\x94\x97\x79\x91"
+ "\x72\xf9\xa1\xf3\x48\xa6\x63\xca\x94\xbc\x5e\xa9\x39\x1b\x9f\x51"
+ "\xfe\x0d\x53\x82\x61\xed\x11\x6e\x9b\x6e\x1b\xe6\x1d\x1a\x8a\xc7"
+ "\x8e\x78\x32\x2a\x31\xaf\x35\x44\xde\xa3\x6e\xdb\x7c\xaa\xa3\x53"
+ "\x53\x87\x5b\xa9\x83\xbe\xe3\xae\x47\xfd\x22\xbb\xe3\xb7\x45\x1d"
+ "\xa5\xb2\x0e\x8f\x0b\x9a\xfc\xdd\x3a\x7d\xf1\x71\x20\x3c\x7d\xb6"
+ "\xd8\x64\xa5\x3c\xc1\xd1\x3e\x04\xf4\xfd\x1d\x5f\xe7\x09\xb1\x8f"
+ "\xd1\x3a\xcf\x5d\x88\xc3\xb4\x41\x77\x5d\x07\xc4\xf8\xa8\x8c\x13"
+ "\x62\x2d\x6e\xe9\x43\xac\x3b\x36\x4f\xb1\x73\x98\x46\x6b\x73\x68"
+ "\x3d\xb9\x1b\xfb\x5e\x86\x79\x25\x43\xdb\xfc\xe1\x68\x41\x97\xd8"
+ "\x5a\x25\xef\x62\x6b\x07\x45\x19\xc6\xdc\xb6\x0f\xfd\x58\xe6\xf8"
+ "\x50\x7c\xac\xcc\x6d\x93\x76\x60\x5e\x77\x88\xbc\x6d\xa2\xae\x38"
+ "\x7d\x88\x3c\x1b\xe6\x49\x98\x67\x0a\x93\x17\x81\x79\xe9\xa1\xf2"
+ "\x5a\xea\x38\xce\xdc\x41\x9a\xc7\xc5\x9a\xf1\xd9\xa2\xd0\xfc\xd2"
+ "\xfd\x21\x7e\x4f\x42\xba\xc7\xd5\x69\xf1\x13\x6e\xb7\x74\x82\xf0"
+ "\x1d\x1d\x5a\xf7\x71\x9d\xdb\x96\x89\xb2\x10\xf7\xf1\xd0\xbc\x8f"
+ "\x6e\x44\x3a\x50\xbb\x5c\x21\xf2\x92\xb0\x3f\x68\xaf\xe3\x63\x42"
+ "\xe0\x1c\x81\x79\x4e\xcc\x4b\xb9\x04\x3f\x8c\xdc\x86\xd3\x3e\x07"
+ "\x63\x20\xb2\x0b\x46\x4f\xa5\xfe\x08\xb9\x80\x11\x5d\x30\xea\x44"
+ "\xaf\x58\xf3\xee\x32\x6d\x86\x08\x7c\x7e\x93\xd9\xec\xd7\x60\x7e"
+ "\x0f\xca\x93\xc1\xf1\xb5\x17\xba\x20\xbe\x0a\x61\x22\xe8\x1b\x55"
+ "\x1a\x9f\x30\x3d\xc2\xe1\xf1\xd2\x77\x1a\x28\x67\xf1\xbf\xc6\x5f"
+ "\x09\xcb\xf1\x6f\x12\x16\xd4\x41\x32\xb5\x91\xaf\x53\xb5\xd9\x75"
+ "\xb4\xee\x93\xc6\x43\xb7\x04\xb7\xbb\xb9\xcc\xc6\xe3\xf8\x67\x68"
+ "\x94\xd7\xe8\x52\x1b\xf4\x58\x76\x8b\x64\xe4\x6b\xbe\x5d\x88\x8b"
+ "\xda\x30\xcf\x6f\xb3\x4b\x83\x78\x24\xfb\x55\xb4\x7e\xb7\xd7\x26"
+ "\xcd\x72\x4b\xf1\x4c\xe0\x31\x9a\x14\x3c\x04\x87\x75\xf1\x75\xf0"
+ "\xbd\x36\xfd\xab\x2a\x98\x0c\x75\x5d\x13\xdd\x10\x41\x6d\xee\x00"
+ "\x63\x1d\xd5\x27\xf7\x91\xaf\xa9\x75\x6c\xf0\x82\x03\xfd\x8b\x2e"
+ "\x30\x16\x63\x5f\x4d\xcd\x1e\xfa\x96\xd9\x3e\xaa\x61\x2b\x00\xd7"
+ "\x0b\x09\x4c\x32\xce\x5a\x05\x27\xe1\x50\xf5\x75\xb4\xa8\x9f\xfa"
+ "\x6a\x00\x19\xb6\x45\xdd\x46\xc2\x8b\xfd\xba\xae\x1e\xe1\x5a\xd0"
+ "\x6b\x91\x61\xba\x15\x18\x15\x0f\xc6\xca\xed\x23\xfa\x10\xcf\x16"
+ "\x2b\xfa\xd9\x67\x1b\x85\xe3\xff\x55\xdd\x42\x6f\x03\xe9\x72\x1b"
+ "\x12\x45\x1b\x74\xd8\x06\x9d\x5d\xe0\x1f\x95\xa9\xe0\x77\x82\xd1"
+ "\xa3\x6e\x73\x3d\x87\x35\x46\x09\x3d\xe5\xb0\x45\x01\xd8\xf8\x20"
+ "\x58\xa4\x85\x24\x78\x00\x92\x13\x46\xe5\x23\x3d\x22\x10\xe6\x30"
+ "\xf2\xdb\xa4\xc0\xc8\xfd\x4f\xc4\xbc\x69\x32\xbe\x16\x15\xbe\x22"
+ "\xc2\x47\xeb\x5e\x85\xed\x1d\xe5\x0c\xd8\x3e\x68\xc5\x67\xd7\x50"
+ "\xfb\x4a\xfa\x3a\xda\x80\x70\xc9\x94\x6e\x1d\x07\xc6\xb3\x30\xea"
+ "\x4c\xaf\x14\xd1\x2d\x68\x31\x1a\xed\x5f\xec\xa0\x6f\x83\xcf\x93"
+ "\x9d\x60\xf2\xc8\xf5\xe5\x13\x6d\x02\xf6\x96\xea\x1c\x9d\xa3\xd4"
+ "\xa9\xe4\xab\x75\xc6\x1c\x35\x11\xfd\x13\xf3\xcf\xcd\x49\xe6\x31"
+ "\x8a\xef\x32\xb5\x65\x45\xf2\x44\xf7\xd4\x16\xd3\xbd\x69\x3f\x5d"
+ "\x9e\x9c\xca\xc7\xfe\xdb\x3b\xd2\xc6\xe1\xe8\xfe\x27\xfe\xef\xab"
+ "\x94\x92\xcc\x53\x30\x9d\xee\xc7\xd1\xbd\xec\x2f\xe0\xdd\x63\x0b"
+ "\x22\x46\xde\x5a\x48\x77\xc2\x73\x30\x5f\xbb\xe4\x99\x88\x0c\xf9"
+ "\x3e\x4e\xe4\xdc\xc5\x7d\x8e\x94\x87\xe9\xfe\x36\x8e\x6b\x62\x13"
+ "\xd5\x3c\xe1\xe5\xb4\x1f\x2e\xfc\x5f\x11\x1f\xec\x58\x65\x8e\xb9"
+ "\xdd\x46\x30\xa9\x3f\x4a\xdb\x8f\x29\xcd\x94\x32\xee\x27\xbc\x05"
+ "\xea\x52\x47\xa8\x94\x9c\x9f\x94\x3a\x23\xed\xc7\x8b\x16\xdc\xf2"
+ "\xa7\xb4\xd1\x57\xbf\xb7\xb8\x99\xca\x5f\x3d\x3a\xa8\xa6\x71\x81"
+ "\x56\x3d\xbd\xfb\x8e\x97\xee\xf9\xa9\xc0\xb2\x70\x41\xc4\x9f\xcc"
+ "\x63\xd6\x16\x52\xea\x2d\xdc\x17\x23\x5f\x65\xe2\x57\x69\x91\x3b"
+ "\x16\x7e\xfa\xaf\x0b\xdf\x6a\x7f\xf2\x0e\xec\xe9\xd5\xaf\xb6\x3f"
+ "\xb9\xf0\xad\x4f\xff\x35\xe2\x45\x82\xbc\x33\x3f\x2d\xc1\x14\x39"
+ "\x75\x7d\xcb\xbc\x3b\x78\xab\xae\xab\x4a\xac\xbd\xbe\xe9\x86\xc3"
+ "\x37\x1e\x4b\x6a\xbd\xe9\xdf\xc7\xfc\xe7\xcd\x7f\x35\xb9\xc7\x32"
+ "\xf4\x23\x1e\x4a\x1b\x3b\xe8\x47\x00\xfa\x11\x1d\xe8\x47\x94\xa2"
+ "\x1f\xd1\xa6\xf6\x23\xfe\x10\xfd\x40\x89\xf0\x25\x04\xbc\xf0\x7f"
+ "\x52\xff\x1d\xfd\x9f\x35\xe8\xff\xa4\x7e\x10\xf9\xd8\xe3\x1f\xc4"
+ "\xe4\x08\xff\x67\x54\xfc\x08\xee\x03\x5d\x8f\xbf\xe8\x07\xfd\xdb"
+ "\x58\xfc\x4d\xc1\xe7\x3b\x46\x8f\x0c\xf6\x89\xe6\xc7\xb5\x46\x2e"
+ "\x46\x9f\x28\x1d\x7d\x22\xf3\xb2\x56\xc3\xac\x77\x5b\xa3\xa6\x98"
+ "\x5b\xa3\x07\xfd\xa2\x99\xad\x19\x89\x13\x5b\x67\xe9\xa1\xf5\x51"
+ "\x10\xbe\xd1\x76\x48\xfb\x83\x3e\x41\xf7\x51\x0c\xe8\x3f\x8a\x6b"
+ "\x8c\xfe\x28\xde\x6e\xff\xc8\x88\xd7\x28\x68\xfc\x68\x34\x8c\x7c"
+ "\xef\xa1\x46\x78\x6f\x7a\xa9\xf3\x03\x3d\xc4\x7d\x10\x05\x5f\x7d"
+ "\x30\x0a\x7f\xf3\xf6\xc2\x07\x3b\x41\xff\x41\xb4\xfe\xab\x40\x7f"
+ "\x13\xce\x7c\x30\xf6\xfd\xa9\x1f\x8c\x4b\xff\xfd\x07\xb7\x64\xcc"
+ "\xff\x20\xf9\xfd\xf7\x3f\xb8\xd5\x39\x46\xed\x37\x51\x9f\x01\xee"
+ "\xda\x4e\x1e\x2c\xd2\xfb\xde\x94\x11\x69\x23\x5e\x5a\xce\xfd\xc1"
+ "\xfb\x64\xbf\xf0\x3e\xf3\x8c\x1d\x0b\x17\x3e\x13\x21\x99\xc7\x70"
+ "\xef\x52\xf6\x34\x03\xde\x67\xb0\xcf\x39\xb5\x25\xe0\x73\x26\xbb"
+ "\x03\x3e\xa7\x69\xc4\xd4\x0d\x41\xfe\xd9\x00\xa6\x7d\x9c\x9e\x6c"
+ "\xba\x35\x8d\x7b\x66\xed\xd7\x6b\xbd\xb5\x09\xd5\x69\x53\x93\x0d"
+ "\xf7\x9e\x44\x9f\x6d\x64\xf9\xce\x67\xfe\x89\x2e\xf4\xda\xbe\x31"
+ "\x4a\x3b\x9e\x5b\x36\x25\xf7\xc5\x3b\x91\xe7\x57\x93\x17\x3c\x72"
+ "\xe7\x4b\x47\x77\xee\xdc\x71\xf4\x83\x27\x17\xdc\xf1\x1b\x4c\x7b"
+ "\x2f\xb9\x08\xe5\xe7\x7f\xe7\xff\xef\x89\x5f\xa5\x47\xee\x7c\xfc"
+ "\xe8\x8e\xd7\x9f\x7d\xb6\x85\xe4\x85\x78\xab\x8c\x51\xbd\xb6\xd1"
+ "\xe8\x93\xe8\xfe\xa5\xcf\x76\x0d\xfa\x3f\xd7\xb7\x6a\xc7\xb2\xef"
+ "\xf5\xf2\x7b\xbd\xfc\x5e\x2f\xff\x3b\xf4\xf2\x5a\x10\x7a\x79\x7d"
+ "\x55\x28\xbd\x9c\x35\x77\x66\xd6\x03\xa6\xf5\xcf\x98\xac\x85\x6b"
+ "\x9f\x2d\x5c\xb6\xda\x54\xb0\x76\x59\xfe\xf2\xfc\x68\x18\xcc\x58"
+ "\xf6\x4c\xd1\xca\x0d\xcb\x8a\x96\x0f\xf9\xa6\x31\x51\xf1\x49\x87"
+ "\xfa\xd6\xd7\x7b\xc2\xfb\xd6\x37\x24\x84\x8e\x4b\x74\x38\xb6\xdf"
+ "\x90\x16\x22\x6f\x9c\x9c\x37\x3b\x44\xde\xc3\x72\x9e\x25\x44\x0c"
+ "\x18\x2b\x62\x8c\x1b\xb6\x87\xca\xc3\xf4\x3a\xc5\x27\xc1\x38\x4d"
+ "\x6a\x19\xd7\x03\xe4\x93\x74\xc1\x0d\xef\x63\x9f\xba\x31\xff\x98"
+ "\xe2\xcb\x38\xe1\x86\xed\x8a\x8f\x26\xc7\x21\x29\x6e\x9b\x19\xfb"
+ "\x79\x83\x33\x44\x8c\x72\xa7\x5c\xaf\x37\xe0\x1b\xcd\x35\xf5\xd9"
+ "\x6e\x8c\x19\xea\x1b\xb5\x83\x88\x21\x6f\x4c\xd1\xc0\x4e\x51\x60"
+ "\xd1\x9f\xa4\xbd\x1e\x7a\xe8\x5b\xb4\x1e\xb8\xf1\x18\xb3\x5d\x5f"
+ "\x4b\x3e\x25\xc5\x91\x84\x47\xc4\x92\x27\x79\x2c\x89\xb1\x62\x27"
+ "\x96\x2d\x52\xc5\x93\x9d\xe8\x1b\x8f\xa4\x78\xb2\x0b\x6e\x7c\x93"
+ "\x62\xca\x5d\x1c\xd7\x59\xc2\x35\x87\x70\x39\xe1\x46\x3b\xf7\xfb"
+ "\x44\xd9\xc3\xaa\x79\x33\x8c\x6b\x6f\xe4\x7b\xef\x29\x7e\x21\xe6"
+ "\xb7\x3b\xa5\x4f\xdc\x4a\x1f\xc8\x17\x94\xfb\x51\x26\xf8\x70\x63"
+ "\x88\xf8\xa7\xfd\x55\x11\x07\x26\x0d\xc6\x3f\x84\xcf\x6f\xbb\xfe"
+ "\xd7\xf5\x1c\x67\x52\xb2\x82\x53\x2d\x97\xcf\xac\x5d\xb3\x62\xe5"
+ "\xb3\xeb\x0b\x97\x9b\xd6\xcd\x9e\x6d\x5a\xbd\x36\x7f\xf9\x84\x09"
+ "\x13\xa2\x83\xe4\x2f\x46\xf8\xb4\x1f\x9a\x49\x0e\xc9\xaf\x95\xe5"
+ "\xd0\x8c\x3e\xa7\xec\x37\x27\x95\x05\xc7\x17\x1f\x9a\x65\xff\xd6"
+ "\x88\x30\x69\x32\x4c\x53\x10\x0c\xe2\x93\x7d\x64\xf2\x73\xe3\x64"
+ "\x98\x56\x2d\x1e\xcc\xe3\x71\x11\x7d\x5f\xd7\x2b\xfa\xd7\xa3\xc1"
+ "\xf3\x90\x1c\xef\xa0\xdc\x8f\x90\xe3\x84\x9b\x8c\x1a\x3c\x0f\x05"
+ "\xe2\x0d\x9d\x02\x33\x59\x1d\x9b\xe0\x73\x86\xc2\x93\x80\x1f\xdf"
+ "\xdc\x2d\x70\xeb\x8c\x01\xbf\xff\xa6\x02\x4d\x2c\x75\x6d\x00\x37"
+ "\x18\x65\x98\x9a\xe0\x36\x36\x9f\x95\xfb\x6a\x50\xe1\x39\x12\x8c"
+ "\xa7\xf9\x6f\x32\x9e\x08\x15\xcc\x49\x4d\x1b\xbb\x87\xb6\xd1\x1e"
+ "\x27\x70\x37\x62\xfd\x4e\xb9\x6f\x63\x34\xfd\x47\x18\x8e\x3b\x01"
+ "\x61\x92\x14\x98\xc9\xea\x58\x8a\xe2\x39\xfe\xcd\x25\x8c\x99\x4d"
+ "\xf2\x84\xd7\x08\x6c\xf7\xe7\xaa\x98\x6e\xa4\x5c\x4e\xdb\xff\xd8"
+ "\x5e\x8c\x17\x1a\x82\xe2\xb4\x31\x9a\xfe\x63\x6c\x38\x5a\xa1\x91"
+ "\x5e\x81\xd1\xf6\xdf\x29\xda\x38\x6a\x54\xa0\xff\x63\x4e\x6a\xf0"
+ "\x5c\x4b\x32\x45\xb8\x54\x75\x79\x35\x78\x3a\x64\x3a\xaa\x68\x7d"
+ "\xb3\x49\xc3\x8f\xcf\xe4\xf6\xa8\x68\x7d\x73\x86\x06\xcf\x79\xca"
+ "\x0f\xee\xd7\xcd\x16\x0d\x9e\xf3\x81\x7e\xa1\x1c\x0b\x98\x2a\x4d"
+ "\x1c\x2b\x31\xdb\x7b\xb1\x1a\x3c\x87\x15\x98\xde\x11\x3b\x1a\x05"
+ "\x6f\x6f\x6e\x51\x6c\x91\xe0\x6b\x52\x1a\xe1\xc6\xf4\x53\x6a\x5b"
+ "\x80\xed\xea\x1e\x4a\x27\x13\x68\xe9\xa4\x6a\x97\x1c\x8b\x9b\x92"
+ "\x35\xfd\x3b\x2b\xd3\x29\x5a\x85\x27\x53\xd3\xbf\xbf\xc9\x78\x22"
+ "\x55\x30\x1a\xfe\x37\xf7\xc8\x78\xf4\x2a\x18\xad\xfc\x7f\x21\xe3"
+ "\x51\xd7\x75\xe4\xd2\x74\x32\x05\xc9\x3f\xd1\x0a\xd3\x7a\x2e\x31"
+ "\x07\x65\x10\xef\x0e\xc6\xe2\xf8\xf7\x56\x1d\xff\x26\x3a\xba\x77"
+ "\x0f\xed\x1d\x85\x36\xda\xcc\xe7\x06\xfb\xc9\x4e\x8f\xa5\xbd\xa6"
+ "\x5c\xa2\x0f\x90\x26\x6c\xf7\x58\xbe\x5f\x0a\x96\xcd\x76\x42\x5c"
+ "\x91\xfa\x3d\x80\x13\xc6\x56\xc9\x79\xd8\xff\x6b\x4e\x2a\x79\x94"
+ "\x2e\xe6\x17\xc7\xe2\xf8\x77\xbd\x55\x8c\x63\x63\x0b\x64\x58\xb4"
+ "\xfb\x49\x99\xa1\xbe\x53\x0e\xf7\xfe\x65\x5d\x22\xf3\x97\x5e\x4f"
+ "\xdf\x2d\x9f\x4e\xf4\xdb\x18\x38\x8a\x3d\x60\xba\x01\x4a\x3b\x60"
+ "\x9c\x81\x62\xfc\x5d\x9b\xc1\x50\x6a\x65\x1e\xda\xe7\xb5\xcd\xd5"
+ "\x03\xa5\x2e\xd6\x4d\xfb\xfa\x6f\xfd\x0a\x0c\x0e\x2f\x3f\x0f\x2d"
+ "\xb1\xa5\xe4\x4c\xc8\x6f\x6f\xfd\x12\x83\xd2\x24\x2a\xdb\x09\x6d"
+ "\x75\x9d\x50\x5a\x17\x5c\xb6\xf4\x26\x48\x3c\x41\x67\x04\xd8\x20"
+ "\x9e\xda\x41\xef\x53\xbc\xd1\xa7\x13\x4b\xf6\x81\xbe\x14\xbd\xcb"
+ "\x13\xf9\x76\xa5\x2d\xed\xd4\x96\xed\x67\xc1\xf0\xd6\x0a\xbb\xf4"
+ "\xe2\x59\x6a\xef\x5f\x13\x7f\xb5\xd9\x23\x35\x27\xce\x86\xe6\xc4"
+ "\x53\xd0\x92\x38\x15\x5a\x8a\x33\x60\xd7\x59\x88\x69\xf6\xa4\x43"
+ "\x8b\x7e\x26\xb4\x24\x67\x80\xa3\x07\xef\x4d\x3e\x84\x71\xf3\x7d"
+ "\x8e\xba\x60\x9c\x7d\xcf\x73\x60\x70\x0a\x9c\x48\xb3\x71\xc7\x95"
+ "\x3d\x7b\xe8\x39\x54\x3f\xd6\x5d\x0f\x89\xd8\xbe\x6e\x6c\xcb\xfd"
+ "\x1d\x70\x4b\x64\x72\x22\xd0\x39\xea\x23\x1d\xb5\x5e\xd0\x97\x40"
+ "\x54\x18\xb9\x48\xe0\xfb\x7d\xa2\x1f\x55\xbf\x17\xc7\x7a\xfc\xed"
+ "\x45\x99\xe8\xb3\xdd\x92\x8e\x75\x9f\x92\xe7\xbd\x7a\x4a\xdf\x44"
+ "\x39\xdb\x98\x4b\xfb\x7f\xe0\x38\x7d\x4b\xae\x92\x47\xfb\x98\xd2"
+ "\xfe\xa4\x13\x13\xc0\xe8\xf0\x9a\xe1\x9d\xfe\x6e\xfa\xc6\xbe\x87"
+ "\xf6\x3d\x20\x7c\x38\xe6\x47\xd0\xfc\x13\xb6\xe7\x0e\x1c\xe3\x7b"
+ "\x6e\x41\x38\x2c\x8f\xfc\x6f\xe7\x7b\xf7\xb2\xeb\x16\xb9\xfd\xd7"
+ "\x2d\xfa\xca\xff\xfa\xa2\x5e\xf6\xfa\xa2\x2f\x7d\xaf\x2f\xba\x50"
+ "\xba\x09\x0c\xbe\xeb\x16\xb9\xda\xac\x9c\x07\xc6\x36\xeb\x17\xf4"
+ "\xbd\xbc\x81\xce\x0d\x5d\xf2\x3c\xf2\xde\xfb\x09\x6c\x59\x09\x89"
+ "\xfe\xa8\xcf\xdb\x1d\xde\x3f\xc3\x92\x12\x60\x78\xef\x0c\xd5\xbf"
+ "\xde\xe8\xbf\xe6\x2a\xf3\x69\x7d\xb6\x64\xa3\x53\x72\xf2\x3d\x74"
+ "\x5d\x51\x17\x72\xf1\x5a\x8c\x57\x1e\x5e\xf9\x2c\xfa\xaf\xf9\x48"
+ "\xab\xd2\xb8\x6d\x3a\xa0\x7d\x7a\x26\xfa\x41\x77\x16\x92\x53\xb1"
+ "\xfd\xc6\x30\x74\x4b\xf2\x57\x32\xfb\xed\x65\xb0\xb5\xaf\xcf\x42"
+ "\xfb\xa5\xba\x48\xbf\xc8\x1f\xc5\x7a\x8a\xb1\x9e\x6c\xae\x0b\x7b"
+ "\x51\x8f\xa2\x99\x9d\x7c\x3a\xf7\x0b\x16\x9d\xeb\x05\x8b\xd4\x1b"
+ "\xcd\x9a\x11\xa6\x0e\x61\xca\x65\x1a\x76\x13\x2e\xd4\x1b\x57\xac"
+ "\x17\x22\x10\xa7\xf5\x5f\xbe\x3e\xa9\x3f\xb0\x97\x9d\x42\xb8\x96"
+ "\x41\x5c\x88\x7b\x0f\xf7\x93\x92\x4f\x2a\x69\xe4\x27\x55\x23\x1c"
+ "\x95\x77\x78\xcc\xf4\xce\xd0\xe9\x28\xe8\xa6\x7d\x2a\xa2\xd9\x80"
+ "\xa8\x8f\x7c\x38\xd2\xd5\x58\x0f\x8c\xe8\xb3\x41\x36\xe1\xa6\x72"
+ "\x74\x5e\x05\x96\x6b\x66\xa5\x16\xf4\x17\x61\x6e\x1f\xb3\xe8\x68"
+ "\xcf\xda\x66\x2c\x2f\xea\xbe\xd5\xac\xb4\x91\xea\xe0\x7b\xd6\x52"
+ "\x3b\x51\x1e\x9a\x0b\x3c\x10\x5b\x4b\xf3\xe4\xb0\x80\xf0\x11\x2e"
+ "\x94\x03\x27\xf6\xb5\xb9\xb9\xc0\x05\x7e\x16\x84\xd3\x29\xe3\xab"
+ "\x09\xc2\x87\xe9\x0c\xf1\x91\xfc\xb5\x60\x99\xd8\x46\x8e\x6f\xfe"
+ "\xbf\xf8\x09\x9f\x07\xf4\x26\xde\xde\x85\x84\x83\xef\xbf\x8c\x38"
+ "\xed\x1b\x1e\x46\xdf\xf1\x56\x8f\xab\xd4\x12\xc1\xbf\x8f\xc7\xf2"
+ "\xbf\xda\xda\x1d\xc9\x7a\x73\x23\xe2\xf8\xb7\xf1\x0f\x03\xbd\x6b"
+ "\x45\x98\xbf\xb0\x5e\x4b\x44\x6c\x0f\xfa\x7a\x08\x43\xfb\x65\x51"
+ "\x3b\xd5\xbc\x9c\x3f\x63\xe1\x54\x58\x98\x31\x2b\x63\x2a\xcc\x79"
+ "\x68\xfa\x54\x48\xbb\x7f\x7c\xda\xe4\x7b\x7e\x70\x0f\xbf\xb9\xe7"
+ "\x07\x53\xee\x81\xec\xc7\xe7\x4f\x85\xec\xb9\x53\x61\x01\x5e\xd9"
+ "\x0b\x66\xcc\xcf\x98\xb1\x60\x2a\xe4\xce\x9c\x85\x4f\xd3\xa7\x4e"
+ "\x4a\x7b\x64\x7c\xf6\xf4\x59\x33\x60\x5e\xce\xdd\x69\x77\xdf\x0d"
+ "\x0f\xcd\x98\x3d\x29\x2d\x4d\xfe\x9d\x94\x46\x20\x4f\x4e\x99\xb1"
+ "\x60\x7c\x76\xe1\xda\xa2\xb5\xe3\xe7\xce\x9a\x4e\x29\x30\x63\xc6"
+ "\xd4\xec\x20\x3f\x32\xc5\xf7\xb5\x8f\xe8\xed\x66\xe7\x33\x69\x9f"
+ "\x62\xa8\x47\x39\xc0\xab\x87\xef\x7f\x04\xb7\xff\xb1\x9e\xf8\xc7"
+ "\xc7\x82\xdb\x12\x68\x3c\xed\xb3\xdd\x46\xfc\xe7\xb1\x14\xed\x15"
+ "\xdc\x05\x13\xa6\x62\xde\xf5\xb2\x3f\x12\x89\xf9\x9e\xe0\xfc\x3b"
+ "\x16\x63\xfe\xcd\xb4\x9f\x8e\x03\x2f\xa4\xbd\x1b\xed\x21\xd2\xd8"
+ "\x05\xbd\xa5\xb9\x91\x7c\x3f\x43\xe4\x3b\xed\x33\xd1\x67\xbb\x7d"
+ "\xb2\x4a\xef\x3b\x69\x3f\x0a\x9a\x4f\x3e\x07\xb7\xc7\xb6\x15\x99"
+ "\x69\xcf\x29\x70\x14\xc9\x38\xbe\x1a\xc4\x11\x2d\xef\x89\xe8\xac"
+ "\xa7\xbd\x3e\x04\x9e\x12\x95\x8d\x70\x12\x9e\x5d\x98\x27\xe3\x9a"
+ "\xd7\x86\xb6\x02\x6d\xf9\x38\x7f\x69\x0a\xb0\xe8\xd3\x26\xff\x40"
+ "\x0a\x88\xf9\xd7\xdb\x8f\xa8\x64\xdb\xdd\x52\x8c\x70\x6f\x65\xea"
+ "\x68\xdf\x05\xbe\x07\x03\xdc\x46\xba\xe4\xf6\x55\x5e\x58\xc9\xce"
+ "\xf3\x7d\x0f\x47\x60\xff\xc6\x63\xff\x92\xfd\x95\x17\x2c\x7c\x0f"
+ "\x51\x0e\x97\x92\xc0\xe8\x39\x1a\xe1\x06\x06\xd3\xae\xa1\xb4\x3e"
+ "\x7a\xbf\x83\x3a\xcb\x18\x4f\x8f\xc0\xf4\x3f\xa3\x5d\x3b\x89\xb0"
+ "\x16\x82\x9d\xe8\x85\x91\x7c\xbf\x93\x52\x1d\x74\x40\xca\x62\x7f"
+ "\xf4\x85\xe7\x54\xf5\x11\x9e\xc5\x62\x1c\x43\x5e\x9c\x47\x3c\xbd"
+ "\x3c\x5d\xc2\xf4\xdf\x21\xfe\x55\x64\x2f\x85\x0d\x9f\xf0\x14\xc0"
+ "\xe0\x7b\x91\xc0\x33\xed\xe7\xbc\x55\x3c\x37\x23\x2d\xe9\x3d\x01"
+ "\xbd\xe3\xef\xb3\xa5\xa0\xff\x93\x9c\x29\xc6\xca\x09\xbc\x0e\xda"
+ "\x3f\x96\xc5\x3c\xec\x42\xbc\x05\xf6\xcd\x3d\xfc\x0c\x50\x27\xa4"
+ "\x14\xf8\x4b\x2d\xa0\x69\x53\x0a\xb5\x9f\x6c\x08\xd2\x62\x3c\xca"
+ "\x41\x54\x9f\xed\x0e\xd0\xc8\x41\x12\xe2\x59\x89\xed\x3b\x89\x7d"
+ "\x5a\x89\x78\x92\xfd\xbd\x16\xac\x17\xe3\x45\x66\x41\x5f\x29\x80"
+ "\x43\x2e\x6f\x0e\x2e\x7f\x7b\x27\x95\x43\xf8\xc8\xbe\x5e\x82\xbf"
+ "\xbd\x9b\x68\x2e\xcb\x1d\xca\xe5\x1d\x56\x8d\x5c\x8e\xc5\xb6\xdc"
+ "\xa7\xca\xaf\xd1\xe4\x47\x62\xfe\x0f\xe5\x7c\xd4\xfd\x3b\x0e\x6b"
+ "\xda\x7b\x1c\xf3\xa7\x61\x7b\xdd\xa8\xdb\x11\x58\x5f\x53\xbd\xec"
+ "\x9b\xc8\xf0\x4e\x0d\xbc\x17\xe1\xa7\x93\xdc\xd0\xb8\x43\xf0\x0d"
+ "\xb2\xee\x20\xbc\xa1\xcf\x76\xa7\x31\x18\x7e\xfc\x19\x84\x9f\x1d"
+ "\x68\xdf\x9d\x69\xc1\xf9\x77\x7a\x30\x7f\x1e\xc9\x3a\xfe\x3e\x45"
+ "\xbe\x3e\xd9\x13\xb2\x65\xcd\x05\xc4\xaf\x3b\xf3\x34\xf0\x65\x08"
+ "\x97\x2f\xd3\x48\x92\x69\xd4\x24\xc7\xee\xa7\xe4\x36\xec\xd1\x94"
+ "\x39\x82\x65\x0a\x90\x8e\x2b\x15\xb9\x0c\x51\xa6\x55\x53\xa6\x9b"
+ "\xf8\xc8\x44\x3d\xfa\xbe\x81\x40\x19\xd9\x4e\xaa\x71\x50\xdf\xae"
+ "\xea\xb3\xdd\x15\xa3\xe9\x7b\x06\xd6\x5b\x54\x2d\xec\xce\x55\x28"
+ "\x43\x77\x63\xda\xbd\x88\x73\x35\xe9\xc0\x2e\xf2\x07\x5d\x1e\x60"
+ "\xa5\x99\x31\x42\x76\xef\x5a\x1d\xe7\x05\xba\x1f\x4f\xf7\x84\x9b"
+ "\xf5\xcd\x96\x75\xf2\xae\xd5\xf8\x4b\xe9\x7c\xbf\x37\xb2\xc3\xac"
+ "\xef\x47\x7e\x81\xf3\xae\x57\xe8\x0c\x2c\x7c\xf6\xc9\x75\x8c\xa7"
+ "\x3d\x42\xb1\xfd\xcf\xe1\xb8\x03\x6c\x23\xc2\x6d\x86\xe9\x98\x7e"
+ "\x13\xd7\x55\x01\xc7\x9f\x45\x1d\x99\x24\xdf\x93\xf1\xf9\x1a\xb9"
+ "\x7c\x2c\xe1\xc3\xfb\x49\xf2\xbd\xce\x47\xb8\xce\x2b\x3a\x38\x3e"
+ "\x92\x97\x43\x3d\xe4\xf8\xb1\x3c\xed\xc7\x2a\x70\xa6\x5e\xc0\xdf"
+ "\x59\xf8\xfb\x09\xfe\xce\xc3\xdf\xdf\xd1\xfe\xa8\xa5\x3e\xae\x8f"
+ "\xf4\xfc\x53\xfc\x9d\x8f\xbf\xaf\xe0\xef\x02\xfc\xdd\x82\xbf\x0f"
+ "\xe3\xef\x13\xa4\x17\xb4\xd7\x3b\xed\x59\x83\x63\xab\x90\x2d\x7a"
+ "\xf7\xd7\x97\x49\x34\x98\x81\x30\x19\x5c\x5f\x85\x7d\x31\x08\x3e"
+ "\xa6\xf2\x33\x70\x50\x1e\x28\x6d\xa4\x90\x07\x91\xe6\x53\xec\xd0"
+ "\xf9\x40\x9a\x6c\x9b\x64\x5d\x94\xd3\x04\xfe\x6c\xc4\x9f\x44\x6d"
+ "\x65\x02\x57\xa4\xe0\xb9\x8c\x5f\x94\xd3\x87\xa8\x53\xa7\xae\xd3"
+ "\x09\x77\xb9\x68\xbf\x23\xfc\x3d\xc5\xf7\x93\x84\xf1\x31\x8c\xcb"
+ "\x3d\x8e\xb3\x1c\xdf\x5d\x47\x65\xb8\x1a\xa2\x31\x2f\x2f\xd2\x53"
+ "\x55\xb2\x34\xba\xcf\x36\x3e\x57\x23\x4b\xe8\xeb\xdf\xb6\x83\x64"
+ "\x86\xe8\x4e\x7d\x8b\xb3\xf2\xb1\x9c\xf7\x85\xe3\x3f\x2f\x64\xb2"
+ "\x5e\x5e\x9b\x24\xf4\x77\x7c\xa3\x06\xcf\x31\xc4\x53\xa9\xd1\xf7"
+ "\x9e\xc0\xb8\x36\xbe\x5d\x63\x8f\x9a\xb0\xbe\x53\x4e\xd4\x07\xd9"
+ "\xae\xba\x23\x4a\x48\x5f\xc6\x7b\x9c\x70\xd6\xc0\xfd\xcb\xca\x0b"
+ "\x6b\x08\x8f\xbb\x94\xef\xd3\xef\x8e\xb0\x52\x7f\x27\x24\x2a\xf9"
+ "\x3c\x2f\x16\xcc\xa4\x07\x11\x05\x3c\x0f\xc7\xbf\x5b\x8c\x4a\x1e"
+ "\x88\xfd\xdf\xdc\x11\x45\x3c\x2f\x3b\x80\xf7\xb4\x59\xc6\x1b\x11"
+ "\xf2\xdc\x85\xf2\xd3\x69\xe3\x01\xa4\x3b\xcb\x20\xd2\xe1\xfd\x18"
+ "\xb2\xbc\xcc\x37\xbe\x0c\xa2\x1c\xde\x43\x70\x07\xc0\x28\x87\xf7"
+ "\x14\xdc\x09\x30\xd6\xe1\xdd\x83\xfe\x4a\x13\xe5\xbf\x73\x3b\xe8"
+ "\x74\xf8\x5b\x7a\x5b\x99\xa4\x73\x78\x8b\x20\xb9\x4c\x8f\xbf\x05"
+ "\x30\x33\x92\xf5\x39\xbc\xb3\x11\x2e\x1f\xb2\x7c\xec\x7c\x46\x24"
+ "\xfb\x74\xa9\x0f\x8c\xb3\x5f\x62\xa5\x0e\x2f\xc6\x0e\xde\xe3\x98"
+ "\xee\x67\x59\xbe\x6f\xf0\xea\x63\xfe\xf2\xd3\xe6\x2c\xdf\x79\x36"
+ "\xfd\xa5\x77\xf0\xf9\x53\x86\xbc\x64\x0e\x6f\x3a\xb4\xb9\xdd\x08"
+ "\x57\xca\x58\xc5\xe9\xb4\x25\x5f\x49\x30\x40\xe7\x22\x54\x9c\x36"
+ "\x63\x5f\xb2\x07\xb0\x1f\x38\x0e\x67\x0d\xbc\x80\xbf\x95\xa7\xe7"
+ "\xf2\xe7\xf2\xd3\x79\xcc\x70\x3a\x7b\x02\x06\x62\xd4\x07\x87\xb7"
+ "\x13\x96\x62\x28\x91\xb5\xc9\xc5\xa8\xfd\x71\xdb\x28\x0e\x4b\xa7"
+ "\x3d\x95\xe3\xb3\x36\x95\x32\xcc\x33\xb0\xa8\xd3\xd9\x0e\x6f\x0f"
+ "\x60\x1d\x79\x88\xef\x29\x8e\xaf\xfc\x74\x19\xc2\xba\x08\x4e\x8d"
+ "\x87\x70\x10\x6c\x96\x0f\xe2\x11\xbe\x6c\x20\xea\xb4\x15\xaf\x1a"
+ "\xbc\xec\x58\xf6\x4f\xcc\x96\xf0\x2e\xed\x8b\x89\xe5\xd1\xaf\x3c"
+ "\xed\xf2\xd0\x19\x0e\x44\x4b\x1f\x8c\x44\x78\x27\xca\x55\x06\xca"
+ "\x27\xb6\xb7\xc3\xc8\xdb\x5b\xd9\x11\xef\xe1\xfd\xe8\x88\x13\xfd"
+ "\xe8\x88\xa5\xf4\x5e\x94\x1d\xbc\x4f\xeb\x15\x79\x13\xb1\x5c\x0e"
+ "\x2f\x57\xde\x91\xc6\x0c\x1d\x66\x0f\xea\x21\xd2\xb5\x8c\xe8\x88"
+ "\x74\x2d\x23\x5a\xb2\x8a\x8e\x34\x47\x71\x15\xb0\xa8\x0e\xf3\x40"
+ "\x54\x47\x36\x96\x7f\x7a\x80\xfb\x2a\x1d\x56\x8f\xc0\xbd\x16\xf1"
+ "\x2c\x46\xf9\x8e\x40\x1c\x56\xc4\x55\x36\x60\x33\x41\xd6\x26\xe6"
+ "\xc9\xf2\x6e\xf3\x2e\xdd\x04\x11\xa9\x50\xa6\xa3\xb3\xe6\x1c\xc5"
+ "\xf9\xd8\xcf\x16\xfc\xcd\xc0\x7c\xb8\x1a\xeb\x7a\x07\xf1\x5a\xa9"
+ "\x3e\xac\xa7\x0c\x71\x6e\x41\x5c\xf9\xd4\xa6\x6f\x6c\x60\xc4\xe7"
+ "\x9a\x6f\x44\xfb\x0e\xfb\xcb\x3b\xda\xfd\x86\x0e\xbb\x22\x43\x24"
+ "\x3f\x82\x6e\x7b\x60\xae\x9b\x79\x1d\xde\x03\x38\xea\x60\x8c\xe4"
+ "\x3e\x45\xf9\x18\x2b\x1d\x42\x3e\x93\x4c\x15\xe1\x6f\x13\x90\xfc"
+ "\xb4\x59\x5f\x22\xd8\x77\x48\x86\xe6\x5a\xdd\xdb\xc6\x83\x55\x87"
+ "\xcf\xa5\x4b\xbd\x06\x58\x62\xd5\x97\xf9\xca\x3b\x1a\xdb\xac\xc4"
+ "\x97\x8f\xb1\x0c\x95\x2b\x80\x78\x1d\xc6\x0b\x3a\xe6\x8d\x2f\x76"
+ "\xe9\x63\x2d\xa5\xac\xcd\x3d\x1b\x61\xad\xfc\xec\x3c\x92\x23\x82"
+ "\x9f\xd3\xc3\x9c\x3e\xc3\x67\xd9\xd4\x37\x16\x57\x06\x27\x7a\xee"
+ "\x05\x8a\xd9\x4e\xf4\x34\x91\x9c\xfa\x99\xe1\x33\x13\xca\xe8\xc0"
+ "\x9c\x9e\xb2\xc8\x25\x5f\x81\x0e\xd3\x7c\x27\x2c\x87\x30\xbf\x05"
+ "\xe1\x8e\x73\xb9\x9d\xfb\x95\x37\xde\x6b\xe8\xa8\xf1\x96\x7f\x96"
+ "\x36\xf7\xab\x01\x76\xc2\xb2\x07\x9e\xea\x29\x43\x5a\x1d\x82\x39"
+ "\x5f\x78\x23\xda\xac\xf9\x08\xd3\x87\xe9\x4d\x5c\xfe\xe7\x7c\xd1"
+ "\xcb\xe6\x3e\xcf\xce\xcf\xfd\xea\x53\x36\xc7\xc2\xde\x59\x5a\x0c"
+ "\x71\x57\x6d\x63\x7e\xd2\x8b\xe3\x9d\x87\xe0\xaa\x53\xb4\x67\x7e"
+ "\x06\xcc\x5e\xe6\x67\x73\xbe\x38\xcf\x96\x3c\x4f\xb4\x49\x87\x13"
+ "\x16\xd4\x9f\xe2\x3d\x44\xef\xc3\x27\x2c\xc7\xb0\xfe\x0c\xc4\x5b"
+ "\xca\x1c\xc5\x07\x10\xd6\x1e\xff\xd4\x17\x46\x38\xde\xb9\x07\xbc"
+ "\x51\x1d\x35\xbe\x8a\x8e\x46\x7f\x54\x87\xdd\x5f\xd1\xd1\xce\xa2"
+ "\x3e\x33\x79\x2b\x3e\x4b\xf3\x45\x7d\x86\x32\xf0\x59\x23\xf2\x29"
+ "\x8a\x78\xde\x6f\x03\x13\x3e\xd7\xf7\x13\xff\xcb\x3f\x3b\x8c\x7d"
+ "\x6d\x47\xdf\x98\x09\xd9\xff\xec\x30\xcd\x43\x60\xd9\xf6\x81\xa8"
+ "\xcf\xec\x08\xd7\x2e\xf4\xeb\x33\x27\xc9\x25\xcd\xf7\x63\xda\xa7"
+ "\x18\x23\x45\x60\xbe\x6b\x20\xaa\x13\xf0\x32\xb2\xca\xce\x3c\xc4"
+ "\x3f\x8a\xcb\x54\x79\x67\x1e\x7b\xb0\x06\x7d\xed\xaf\x10\x4f\x27"
+ "\xca\xe4\x34\x86\x34\x44\x3d\xe9\xcc\xf3\x57\x74\x5a\x59\x74\x67"
+ "\xa3\x87\xcb\x7e\x67\x03\xe1\x1e\x78\x21\x85\xe6\x27\xf4\x98\x7f"
+ "\x98\x55\x9e\x19\xe7\x21\x59\x35\x9c\x31\xf9\x0d\x67\xca\x58\xf9"
+ "\x99\xb4\x1f\xbd\xc4\x5c\xbe\xf2\x33\xd9\xfe\xf2\x33\x66\xef\x08"
+ "\xf4\xe1\x8b\x8f\x01\xd9\x27\xef\xef\x19\xd2\xe0\x7d\xa4\x47\x13"
+ "\xe7\xbf\xa3\x18\x75\x60\xd3\x0d\x65\x27\x7a\x50\x16\xac\xbf\xe0"
+ "\xb6\xa9\xcd\xfd\x31\xa7\x29\x8b\x3a\x63\x22\x99\x22\xfe\x2e\xb1"
+ "\x42\x19\xab\x38\x93\xe6\xaf\x38\x63\xf6\x55\x20\xde\x28\xac\x27"
+ "\xfa\xf3\xf7\x3c\x5c\x5f\x3f\x47\x79\x3d\x86\x65\xde\x07\x21\xe3"
+ "\x9f\xdb\xc3\xd9\x48\xb2\x55\x64\x9f\xb2\xbc\x1e\x92\x99\xcf\xc9"
+ "\xae\x09\x3b\x05\x4b\x15\x3b\x45\x36\x8a\xe2\x22\xb2\x53\x7e\xd9"
+ "\x4e\xf9\x65\x3b\xc5\x9f\x0d\x68\x6b\xca\x4f\x67\x93\x3d\xca\x2a"
+ "\x16\x76\x26\xcb\x97\xc6\x50\x36\x62\x10\x47\xb6\xe0\x05\xc2\x54"
+ "\x9e\x7e\x8a\xc3\x73\x3a\x9d\x2e\xf3\xa3\xbd\xc1\xab\xc6\x2f\xec"
+ "\x4d\xbb\x6c\x6f\x24\xc5\xde\xf8\x70\xfc\x43\x9d\xf2\x87\xb2\x37"
+ "\x7e\xd9\xde\xf8\x98\xb0\x37\x7e\xd9\xde\x50\xba\x4f\xb6\x37\xbe"
+ "\x10\xf6\x06\xf5\x99\xfa\x1b\x21\xdb\x99\x32\xb2\x33\xd4\x5f\x94"
+ "\x35\xb3\x5f\xd8\x99\x3c\x8c\x89\x24\xb2\x33\x3e\x2c\xe3\x57\xec"
+ "\x4c\x1f\x2f\x5f\x46\xb6\x66\x60\x07\xa0\xfd\x34\x01\xd9\x18\x6e"
+ "\x4f\xbc\x63\xbd\x64\x4f\x90\x7e\xd3\xb4\xf6\x04\xf1\xd5\xe0\xbd"
+ "\x51\xb6\x53\xf6\xf8\x6d\xcc\x8b\xf6\xa4\x31\xab\xd8\x8d\xbc\xfe"
+ "\x04\xe2\xbd\x68\xb7\x8b\x8b\xca\x1c\xc5\x5e\x40\x3b\xd0\xce\xda"
+ "\xca\x00\xdb\x88\xf2\xeb\x43\x5b\x01\x80\x7a\x69\xf2\xa2\x8e\xa3"
+ "\x8c\xa7\xb5\x59\xff\x0c\x3e\xd4\xd5\x39\x3d\xbd\x8e\x25\xee\x14"
+ "\xe3\x9c\x2f\x98\x0b\xe9\xe3\x5c\x62\x2d\x43\xfb\x92\xe2\x3a\xd1"
+ "\xf3\x36\xcc\xee\x64\xfe\xd9\x79\x4e\x13\xea\x40\xda\x9c\x95\xf6"
+ "\xf8\x25\xcf\x1b\x51\xcf\x98\x1d\xed\xe2\xbf\xcf\xf9\xc2\x18\xbf"
+ "\xb8\x13\xc6\xcc\x5e\xc6\xfc\x3e\xd4\x33\xec\x6f\x23\xf6\xfb\x30"
+ "\xb6\xdd\x8e\x3a\xd7\x8e\x7a\x66\xf2\x6a\xf4\x0c\x75\xa6\x1e\xef"
+ "\x4d\x82\x7e\x9f\xb5\xa3\x9e\x1d\xf6\xf3\xf1\xac\x93\xc7\xa2\x58"
+ "\x4f\x3b\xcd\xdb\xa1\xae\x1d\xf6\x57\x08\x5d\xf3\x8b\x72\x4e\x3f"
+ "\xd1\x4f\x92\x75\x0d\x79\x81\xf9\x2e\xd4\x1d\xa4\x75\x18\x5d\xb3"
+ "\xaa\x74\xed\x79\x59\xd7\xa2\x84\xae\x21\x4f\x23\x7c\x2f\x08\x7d"
+ "\x23\xfc\x14\xaf\x0e\xea\x5b\xf4\x19\x3a\xf3\x46\x27\x64\x87\xeb"
+ "\x1c\x8e\x2b\x67\xb2\x51\xdf\xcc\xa8\x6f\x88\x8f\xb9\xc8\x6e\xa2"
+ "\x6c\xfe\x27\x8d\x75\x73\xad\xec\x3f\x97\xfa\x6e\x28\x43\x7d\xca"
+ "\x46\x5b\xf6\x29\xda\xd1\xff\x5c\xe2\x86\x46\xd4\x27\x13\xea\x51"
+ "\x1a\xea\x93\x19\xf5\x8a\xf4\xc9\xee\x7b\x81\x70\x7e\x6e\x1f\xc4"
+ "\xc1\xc7\xca\x60\x7d\xba\xd8\xbc\x69\x9f\xed\x07\x7a\x27\x7c\xc3"
+ "\xe7\x5f\xf1\xde\xe8\x84\xfe\x0c\xf9\x3e\xc9\x09\xff\x9f\x9e\xfb"
+ "\x32\xa8\x87\xd6\xad\x70\xcd\x59\xf8\x41\x3b\xca\x3c\xe0\x7d\x0c"
+ "\xde\x7f\x9c\x75\xc7\x3b\xcc\x5f\x95\x9a\x82\x75\xf7\x91\x2e\x32"
+ "\xdb\x64\xf2\xe5\xcc\x28\x8b\x06\xd6\x97\x12\xc3\xa2\xdd\x9b\xd9"
+ "\x40\x22\xcd\xcd\xc5\xe3\x73\x1c\xd2\x20\x19\x7f\x47\x1f\xf8\x1a"
+ "\x12\xf0\x4a\x3c\x60\xf3\x97\x91\xff\x84\xf7\x69\x6c\x63\x62\xf4"
+ "\xae\x0d\x90\x1a\xef\x16\x67\x9f\xc6\x6f\x33\xd2\x1c\x55\x02\xdd"
+ "\x33\xdb\xa7\x29\x0d\x5f\xcb\xe7\x9f\xc6\x62\x7d\xea\xf3\x4f\x6d"
+ "\x90\xd8\x60\x63\x87\x7d\x7d\x5c\x2f\xd3\x94\xb6\x50\xdb\xb0\x9d"
+ "\x37\x61\x3b\x3b\x1f\xdb\x64\x86\xf7\x8b\x43\xef\xab\xd8\x67\x9b"
+ "\x32\xd8\xff\x30\xf9\xc9\x0a\x4d\xc2\xe4\x67\x28\x74\x0a\xb7\xb6"
+ "\x93\xc6\x69\xdf\x06\xd6\x43\x7b\x74\xd3\xbc\x41\xa9\x97\x7d\x86"
+ "\x74\x2c\xdb\xea\x03\x43\x56\xb1\x87\x39\x7a\x98\xdd\x51\xfc\x05"
+ "\x34\xd0\xbe\xe1\x25\xcc\xef\x8f\x72\x2f\x66\x15\xee\xdc\xde\x0d"
+ "\xcc\x4b\xf3\x3e\x58\xc7\x41\x27\x2c\x6a\x14\xbc\xe8\x38\xcc\xe3"
+ "\x4d\x83\x3b\x17\x71\x8d\x22\x5c\x27\xb0\xbc\xaf\xc2\x8d\xf2\x3a"
+ "\xa5\xdd\xa9\x33\xf0\xb3\xbe\x50\x97\x0f\x5b\x37\xc3\x8d\x67\xe1"
+ "\x7e\x7e\xb6\x2b\x2b\x77\x5b\xc9\x26\x60\x9a\x11\xd3\x12\x10\x7f"
+ "\x51\x9f\xed\x7e\xf4\xb9\x7b\xf7\x08\x5f\xf6\xfe\x04\x05\xce\x09"
+ "\x53\xba\xb5\xeb\xd6\xe4\xaf\x24\xcb\x82\xf6\x79\xd3\x41\xf0\xae"
+ "\x75\xb4\x43\x9c\x39\x74\x76\xc0\xa6\x7f\x96\x46\xe7\x6d\x95\x6e"
+ "\x81\x24\xe4\x0f\xb5\xaf\x02\x63\x8e\x2e\x66\xbb\xdf\xf4\xd6\x66"
+ "\x0f\xc6\x14\xf7\xef\x71\xc2\x87\x61\xe9\xe9\xff\x9a\x75\x22\x0d"
+ "\xda\x77\x6f\x00\x20\xfa\x10\x3d\x51\x6f\xfc\x48\x87\xd3\x64\x93"
+ "\x1a\x36\x50\xdc\x7d\xff\x49\x85\x5e\xe1\x79\xe2\x2e\x10\xb1\xe9"
+ "\x03\x53\x98\x8d\x81\x7d\x0c\xbd\xc7\x78\xe0\x7e\x41\x83\xcf\xec"
+ "\xbd\x68\x47\x68\x4e\x99\xce\xc6\x5a\x97\xc8\x3c\x7d\xb6\x07\x52"
+ "\x9d\xf0\x70\xab\x3c\x5f\xe5\x76\x78\x67\x90\x6d\x09\x39\x6e\xf1"
+ "\x3d\x49\x07\xf1\xff\x30\xb7\x2d\x09\xed\x10\xd9\xa6\x18\xd8\xbe"
+ "\x55\xf0\xdf\x43\x78\xe9\x5b\x8f\x4e\xcc\x5f\xe7\x66\xdd\xac\x0a"
+ "\x8a\x29\x8e\xa0\xfd\x3d\x31\xed\x09\x94\x6b\x66\x2f\xa4\x36\xfd"
+ "\xf0\x09\xfb\x98\x7e\xe8\x2a\x86\x88\x86\xc1\x79\xa2\x1f\x66\xd0"
+ "\xbc\x90\x98\x0f\x7b\xa0\xc5\x09\x33\xf2\x95\x76\x91\x8f\x81\xb4"
+ "\x25\x3a\x1f\x26\x5f\x83\xde\x53\xac\x2b\x61\x1e\xf2\x39\x10\xd6"
+ "\xa5\xf4\x81\xfa\x27\xfa\xf5\x43\xbd\xba\x5f\xf4\xee\x3e\xbe\x44"
+ "\xd0\x60\xdd\x26\x30\xf0\xb3\x7a\x7c\xf4\x9e\x63\x06\xef\x0b\xf5"
+ "\x99\xf7\x85\xdb\x58\x1c\x23\xbc\xf7\xa2\x0c\xf1\xf4\x76\xc4\x85"
+ "\xf1\xcf\x74\xb1\xa7\x33\x3c\xd0\x12\xee\x1b\x16\x94\xcd\x32\x8c"
+ "\x55\xc7\x94\xfa\x59\x07\xe2\xfc\x44\xcc\xb1\xfd\xf0\x13\x3f\xf9"
+ "\xd9\x1e\x92\xdd\xfe\x02\x1a\x93\x1d\x25\x64\x6f\x39\xec\xd5\x08"
+ "\xdb\x89\x30\x27\x64\xd8\x13\xfc\x3c\x40\xf1\x3b\x92\x7e\x71\x1c"
+ "\xdb\x82\xed\xe8\xa4\x79\x5f\xa4\xb3\x59\x79\xc6\x18\x1f\xe3\xc4"
+ "\x1f\xd6\xb1\x8a\xfe\x82\xd0\x6d\x39\x53\x46\xe3\x99\xef\x6b\xd6"
+ "\x83\xf5\x5c\x47\x72\x54\xba\x09\xae\x47\x99\x3c\xbd\x75\x0b\x5c"
+ "\x43\x32\xc6\xa2\xdc\xc5\x82\xee\xe9\x68\xe3\xd0\xf7\x44\x8b\x6a"
+ "\xdd\x00\x37\xa2\x0e\x59\xcf\x42\xfa\x8c\xa5\x25\x26\x6c\x2b\xc0"
+ "\xee\x73\x40\x3e\xca\xa7\x08\x5f\xe4\xf0\x9e\x81\x86\x73\x24\x8b"
+ "\xe9\xf9\x8a\x2c\xe2\xbd\xf5\x62\xb6\x02\xc7\x19\x79\x8e\x22\xfd"
+ "\x13\x7a\x27\xd1\x01\xe9\xad\xd4\x5f\xb1\x06\x3a\xfd\x77\xec\x6b"
+ "\x96\xc4\xc4\x98\x86\x7c\x4c\x77\xe3\xd8\x02\xfc\x42\x5b\x22\x9e"
+ "\x3f\x73\x21\xdc\x41\xf6\xb5\x8f\xa7\x63\x9a\x9d\xd9\x74\xa4\x27"
+ "\x75\x58\x77\x8f\x13\x96\x1c\x15\xbc\x49\x3f\x4a\xb8\x42\xb7\xe1"
+ "\x33\x17\xe3\xfb\xdb\x7e\x89\xfd\x9d\xfa\x98\x69\x2b\xcd\x71\x4e"
+ "\xe5\xe7\x8c\x10\xae\x06\x49\xd8\x6c\x3f\xb6\xb5\xde\xe6\xb7\xa0"
+ "\x7d\xb6\xf8\x2b\x7d\x26\x7e\x2f\xe7\x31\x79\x1c\x0d\x89\xbf\x0a"
+ "\xb6\xd3\x9e\xdd\x9d\x30\x95\x9f\x33\xe3\x47\xb9\xb7\xdf\x70\x96"
+ "\x9e\xf9\xf9\x2c\x6e\x83\xdf\xe4\xa8\x35\x8b\xf3\x11\x11\x46\xc4"
+ "\xf1\x53\x7f\xdd\x8b\x75\xf4\xd9\xa6\x1e\x76\xc2\xcc\x46\xf1\x7e"
+ "\xc6\x6f\x0a\xfb\x7d\x14\xea\x00\xe9\x9c\xd0\xe9\x69\x2f\x9d\x68"
+ "\xe4\xfa\xe7\xec\x35\x74\x2a\xf6\x97\xe6\x73\x62\x3a\x60\xda\xf6"
+ "\x13\x89\x5c\xbe\x25\x26\x3d\x68\x0c\x3a\xc3\x0d\xf3\x86\x5e\x0f"
+ "\x66\xe0\x95\x83\x57\x9e\xfc\x5c\x80\x17\xf6\xf9\xc1\x76\x7c\x2e"
+ "\xe2\xb4\xdb\x9f\xaf\x73\x62\x5e\x2f\xfa\xec\xf4\xec\x84\x07\x67"
+ "\xb3\xfd\xc9\x92\x72\xdf\xb0\x8f\xe6\x09\x1e\x2c\x76\xc2\x54\x10"
+ "\xbc\x98\xc6\xd7\xee\xa0\x3e\x12\xdd\x59\x69\x2d\xf3\xb4\x6c\x75"
+ "\x63\xbb\x1f\x3c\xd8\x52\xeb\x06\xd3\x6d\xd4\xff\x07\x0f\x51\x9f"
+ "\x68\x0d\x0b\xfd\xae\xab\x65\xae\xe6\x3a\x2f\xd0\xbb\x3c\xc4\x85"
+ "\xfa\xdf\xc0\xd7\x09\xb1\x5d\x70\x98\xf0\xc9\x32\xc1\x94\xfe\x0b"
+ "\x7e\xf9\x4d\xa6\x0d\x3a\x7a\x1e\x55\xbf\x97\xcf\xc3\x9c\x62\xa5"
+ "\xb9\xf2\xda\x85\x69\x51\xa8\xe7\xd3\xe8\x7c\xc7\x73\x30\x6d\x0e"
+ "\x43\x5a\x37\x5b\xf8\x59\x51\x2e\x1c\x7f\x7a\xea\xf9\x7a\xa3\x69"
+ "\x68\xff\xa6\xf2\x3d\xa8\xab\x31\x9d\xdb\x1a\xc4\xb9\x0b\xf3\x70"
+ "\x3c\xea\x39\x61\xf1\x80\x8f\xfa\x8c\x65\xdf\xfe\xda\xa3\x8f\x2f"
+ "\x02\xdd\x56\x3a\x7b\x1d\xdb\xc1\x90\x57\xc2\x96\x3d\xe8\xdc\xf2"
+ "\x05\xf3\x28\x7d\x6e\x6e\x24\xfd\x98\xb6\xdd\x09\x3f\xfb\x38\xac"
+ "\x4e\x0c\xf6\xc3\xfc\x66\x73\xb2\xe0\xa3\x1f\x69\x15\xcc\x47\x73"
+ "\xa3\xe0\xe1\xb4\x8f\x83\x79\x68\xc6\x1a\xcc\x28\x09\xe6\xc9\x78"
+ "\x65\xc8\xcf\xea\xcb\xa0\xba\x47\xbe\x9a\xab\xfa\x6c\xe6\x04\xd4"
+ "\x8f\x12\xc1\x1b\x4a\x47\x79\x26\xb9\xb9\x80\x63\xcf\x40\x2e\xd0"
+ "\xfb\x5e\x4a\x27\x19\xa7\x74\x3f\xfa\x37\xf8\x4c\xe7\xc7\x1b\x49"
+ "\x7f\xe9\xdc\x2d\x75\xfe\xe0\xf9\x0a\x60\xe6\x67\x66\xc4\x6f\x2b"
+ "\x2f\x27\xd9\x45\x98\xd4\x78\x6f\x79\x39\xd6\xb7\x5d\xa1\x2b\xa6"
+ "\x15\x50\x3e\xc9\x29\xa6\xd7\x39\xe1\xe7\x09\xfc\x7d\x2e\xc6\x80"
+ "\xa1\x7d\x0f\xb3\x7d\xd0\x47\x33\x74\xe6\x11\x2f\x7b\xe0\xa1\xe3"
+ "\x68\xc7\xd0\x7e\xfb\xc4\xbe\xef\xf0\xd0\x09\x7a\x46\xfb\x79\x1a"
+ "\xef\x5b\x4f\xa0\x9d\xea\xaf\xbc\x90\x3b\x20\xc1\xc8\x7e\x09\xcc"
+ "\xde\x5d\xa9\xb3\xbd\xd1\x7f\xcd\x77\x74\x1f\x81\x36\xef\x6f\xc0"
+ "\xf4\x1c\xc7\xf1\x2e\x9d\xff\x56\xba\x89\xf9\x7e\xd5\x7f\x50\xef"
+ "\xf0\x9e\xb7\xf3\xb3\x4e\xe1\x21\x4e\x8f\x97\x3b\xd0\x0b\x58\xc2"
+ "\x71\x0b\xfa\xc4\xa4\xa6\xec\x5a\xc1\xbc\xbb\xba\x68\x4f\xf8\xc4"
+ "\xe8\xea\x7e\x48\x7d\x63\x33\xa4\xd5\xf5\x43\x72\x7d\x3f\xa4\xb0"
+ "\xcf\xe9\x6c\xfa\xc0\x79\xf6\x71\x56\x30\xd4\x6f\x46\x7f\xce\x0b"
+ "\x3a\x5f\x35\xfa\x73\x5e\xf4\xe7\xce\xa7\x90\xbd\x1c\xf4\xe7\x06"
+ "\xb8\xaf\xec\xee\xe4\x67\x84\x56\xb8\x3b\x63\x2d\xa0\x8b\xc9\x03"
+ "\x23\xb6\xaf\xf4\x1c\x3c\xa4\x8b\xe9\x44\x5f\x12\xfb\xec\x94\xfb"
+ "\x8b\xbf\x09\xf1\x16\x18\xc9\xfb\x8a\x36\x9c\x55\xf8\x12\xc3\x8e"
+ "\xcd\x12\xc9\x94\x9b\x74\x04\xfb\xf0\xf0\xf5\xf4\xce\xf9\xc8\x0d"
+ "\x1e\xfd\xba\x3a\xe6\xa1\xf4\xa2\xb1\xcc\x83\xe9\x7c\x2f\xff\xc3"
+ "\x98\xde\x67\x7b\x38\xc5\x29\x7d\x92\x1c\x4e\x46\x31\x66\x92\x6d"
+ "\xcd\xc3\x3f\x63\x52\x19\xca\x68\x67\xe3\x16\x2f\xfa\xe3\xe7\x48"
+ "\x8f\x1f\x3e\x98\x55\xc0\xbc\xa6\x35\xf4\xfe\xff\xe1\x5a\x5a\x9b"
+ "\x40\xef\x24\x7f\x89\xbe\xce\xa5\xd6\x23\xd0\x18\x42\xf1\x43\x7c"
+ "\x01\xe2\xac\xec\x6c\x64\x18\xb3\x5f\xae\x5f\x4f\xeb\xcf\xc4\xb7"
+ "\xa6\x0f\x77\x3a\x61\x0d\x5f\xf7\xc1\xbf\xcf\xe1\xf6\x74\x7a\x8b"
+ "\x1b\x69\x10\x6c\x03\xa6\xd7\xd2\xfe\xe4\xbd\xe5\x17\x3a\xed\x63"
+ "\xc8\xf6\x4f\x7f\x45\xf8\x42\x17\x9c\x62\x2c\x98\xfe\xbc\x78\x7f"
+ "\x30\x7d\xb2\x13\xe6\xf3\x31\xde\x3a\x8e\x64\x62\x7a\x01\x8b\xbe"
+ "\xf0\x19\xc1\x4d\x28\x83\xb2\xb5\x5e\xc8\x63\x15\x17\x9c\x8c\xeb"
+ "\xca\x39\x60\xaf\xaf\xea\xa3\x6f\x6e\xdc\xd7\x2d\xea\x43\xdf\xa0"
+ "\x05\xf3\x3a\xa9\x0e\x17\xc2\x20\xdd\xa3\xc4\xda\x85\xe9\xe5\x4e"
+ "\x98\x27\xdb\xc3\xe9\x8b\xc5\x1c\xf3\xf4\xc5\xbd\x58\x16\x7d\xc5"
+ "\xab\x31\x1f\xfd\xdf\x55\x31\xf2\x3b\x6e\xd7\x8b\xfc\x5b\xd1\xe9"
+ "\xc7\x9c\x50\xc0\xdf\x03\x16\x8d\x85\xc4\x22\x13\xeb\x0e\xeb\xeb"
+ "\x05\xf5\x73\xc6\x43\x7c\x1d\x9e\x04\xd7\xf5\xd9\x32\x40\xc1\x8b"
+ "\xe3\xed\xcf\x7b\xa5\xc7\x1e\xc3\xb4\x04\x05\x2f\xc2\x5c\x83\xcf"
+ "\xc9\x83\x30\xa2\xcc\x64\x55\x99\xc7\x7a\xa5\x3b\x7f\x8e\x69\x99"
+ "\x9a\x32\xb9\x9a\x32\x16\x55\x99\x32\xb9\x9e\x12\x4d\x99\x2a\x4d"
+ "\x99\xba\x10\x6d\x3b\xac\x29\x63\xd7\x94\x69\x0f\xd1\xb6\x4e\x4d"
+ "\x19\x77\x70\x99\x19\x7a\x15\x6d\x69\x3d\x51\x1a\xa6\x25\x06\x97"
+ "\x99\x91\xa2\x29\x33\x45\x79\x46\xdf\x33\x57\xf8\x06\x28\x4f\xc8"
+ "\x53\xe4\x6b\x27\xe6\x63\xff\x1f\x2b\xb8\x88\xff\x8d\xb1\xe1\x85"
+ "\x53\xa5\x07\xc4\x79\xb9\x64\x57\x69\xfd\x01\xd9\x73\x7a\x67\x42"
+ "\x32\x41\x7e\x27\xd5\xd5\x05\x33\x5f\x22\x19\x42\x9c\x87\x86\xd2"
+ "\x63\x86\x5d\xd3\xce\x76\x4d\x3b\x9d\x43\xe9\x31\xc3\x1d\x5c\x66"
+ "\xa6\x3e\xb8\xcc\xcc\x04\x55\x99\x46\x51\xcf\xcc\x14\x4d\x99\x29"
+ "\x9a\x32\x99\x43\xe5\x73\xe6\x62\x4d\x99\x02\x4d\x99\x92\x00\x0d"
+ "\x67\xf2\x6f\xc3\x49\x1f\x30\x1d\xe3\x9f\x05\xc7\x2e\x42\x3b\xa3"
+ "\x22\xcf\xca\xb7\xd3\x42\xae\x1f\xb9\x7e\x8f\xf8\x6e\x8e\x9f\x4d"
+ "\xd0\x09\x8f\x8c\x57\xde\x2d\xbf\xd5\xef\x89\xa4\x77\x9e\x48\xdb"
+ "\xee\xe6\x62\x0f\x8e\x2d\x33\x71\x0c\x9e\x93\xa6\xac\x2d\xa1\xf5"
+ "\x38\xfc\x6c\x1b\x1e\x8f\xcc\x3c\x29\xf4\xef\x11\xe5\x9d\x0e\xf5"
+ "\x07\xe3\x8c\x47\x52\xaf\xb0\x5d\x27\xa8\x5d\x74\xc6\x03\xe2\xb0"
+ "\x0e\xc6\x1a\x83\x6d\xa5\x3a\x1f\xf9\x8b\xd2\xd6\x06\xb1\x26\x88"
+ "\xd6\x0a\xbb\xe8\xdc\x0d\x2c\xd3\xa4\x8a\x4f\xa8\xad\xee\x23\x9b"
+ "\x3d\xfa\xe0\x36\x3f\xb2\x5d\x6e\xf3\x49\x61\xa3\x1e\x39\xa9\xd8"
+ "\x93\xb0\xf2\x57\x05\x96\xb6\x3a\x00\x5a\xf3\x70\xa2\x0e\xfd\x4d"
+ "\x8c\xb1\xa8\xdd\x1d\x90\x69\xe2\xfe\xef\x9a\x7e\xa0\x7b\x47\xc9"
+ "\x03\x7c\x4d\x84\xe8\x4b\x66\x2e\x9d\xaf\x4c\xbe\x4f\x8b\xf5\x4b"
+ "\x5a\x97\xc7\xf8\x59\x4b\x90\xf9\x52\x73\x89\x0b\xdb\x9a\x99\xad"
+ "\xac\x1f\x72\x42\xa6\xf0\xeb\xaa\x20\x8f\xd6\x6b\xd0\xda\xa6\x66"
+ "\xf7\x14\x82\x29\xc2\x76\x2a\x6b\xa7\x7b\xe8\xac\x66\x84\x4d\x0d"
+ "\x17\x2b\xa9\xe9\x2a\xda\xf0\xe8\x05\x21\x3f\x99\xc7\x82\xf5\x21"
+ "\x12\xe5\x34\xb3\x3d\x58\xe6\x32\x9d\xc1\x32\x97\xe9\x0a\xd6\x07"
+ "\x09\xf5\x61\x96\x3e\xb8\xcc\xac\x84\xe0\x32\xb3\x92\x55\x65\x6a"
+ "\x44\x3d\xb3\xa6\x68\xca\x64\x6a\xca\xa8\xed\x1f\xf6\x79\x96\x65"
+ "\x30\xee\xe4\xf6\x7e\x56\xb1\xea\x59\xda\xc3\xc7\xa9\x59\x55\x4a"
+ "\x9a\xfc\x5d\x32\x5f\x2b\x25\xe3\x3b\xa8\xb1\x51\x04\x7f\x4c\xd3"
+ "\x86\xe3\x9a\x36\x9c\x52\x9e\xe5\xf5\x15\xef\x21\xed\xc6\xca\x72"
+ "\xe6\x8e\xdf\x06\xf3\xe2\xbd\xf3\x9f\x20\xdf\x8c\xc6\x27\xbe\x86"
+ "\x6d\x0b\xfa\x94\x5f\x81\x91\xd6\x0e\x76\x15\x41\x04\x9d\xff\xe2"
+ "\x84\x1f\xe5\x60\x3c\xe7\xa4\x35\xee\xe8\x4f\x65\x75\xc1\xac\x1e"
+ "\xac\xbf\x16\xeb\x40\xda\x3d\x6a\x0e\x6e\xc3\xa3\xd9\xc1\x6d\x78"
+ "\x34\x4f\xf5\x6c\xc4\x67\xab\xaa\xdf\x46\xda\x27\xe2\x35\xee\x5b"
+ "\x3f\x5a\xae\xa4\xd3\x1c\x00\xf6\xb1\xbb\x94\xfb\x01\x66\x5a\x37"
+ "\x38\xba\x03\x1e\x5d\x4f\xf3\x05\x32\xce\x23\x6a\xda\x0a\x5a\x3c"
+ "\xda\xaa\x69\xc7\x49\x4d\x3b\xba\x03\xb6\x66\x56\x8f\xd0\x91\x47"
+ "\xf1\x7e\x61\x0a\xa5\x21\x2d\x4c\xf1\x5e\xd3\xd5\xf6\x71\xe4\xa7"
+ "\xfe\x68\x96\x1b\xfb\xcb\x76\x48\xa3\xe5\xe7\x39\x6c\x1c\xf9\xdd"
+ "\x6e\x27\xda\x67\xfa\x76\xf6\x66\x4c\xcb\x11\x7c\xfd\x11\xf6\x7f"
+ "\x81\x59\xe0\xfd\x11\x7f\xb7\x4f\xb0\x78\x6f\x62\xb1\x50\x1c\x4e"
+ "\x9e\x7b\xe3\xc0\xaa\xac\xb1\x45\x1c\xdb\x15\x7d\xf0\xef\x02\xab"
+ "\xbf\x62\xe0\x24\xa6\xd5\xa2\x4e\xd4\x88\xf7\xa8\x03\xc9\x28\xfb"
+ "\xb5\xc8\x3f\x8c\x81\x67\xbf\x24\xc7\x8c\xdb\x69\xed\x20\xed\x5f"
+ "\x81\x36\x33\x46\xac\xcd\xf8\xd1\x71\x95\x5e\xb9\x4d\x9b\xa7\xb1"
+ "\x0e\x98\xfd\x0a\xf9\x76\x64\x37\x68\x0d\x62\xb3\xd7\x05\x34\xcf"
+ "\xe2\xf0\x9e\xe5\x3e\x39\xe6\xd7\x88\xb2\xb3\x0d\xaa\xb2\x2e\x79"
+ "\x1e\xa4\x9b\xf2\x26\x7a\x41\xdf\xec\x76\xd1\x59\xba\x09\xc2\x8f"
+ "\x9f\xfd\x4a\x33\xda\x0b\x2c\x93\xae\x94\xa1\x39\x13\xfe\xde\xbf"
+ "\x08\xf4\x13\x4a\x40\x6f\xdf\xdc\xc1\x71\xcb\xef\x9c\x79\x7c\xe4"
+ "\x28\xe9\x06\x87\xfb\x24\xf9\x94\x7a\xb1\x6e\x6b\x76\x4d\x84\x07"
+ "\x0c\xbd\xd5\x80\x32\x32\xbb\xc6\x57\x0d\x16\x6c\x1b\xc6\xf1\x3f"
+ "\x3a\x42\x36\x50\x4d\xbb\x19\x33\xb2\xe7\x67\xcd\x19\xff\xf8\xfc"
+ "\x59\x39\x33\x1e\x30\xe5\xac\x5c\xbd\x3c\x7f\xfc\xda\xf5\x45\xa6"
+ "\x8d\x85\x2b\x8b\x56\xae\x79\x96\x1f\xff\x65\x5a\x56\x24\x7e\x53"
+ "\x0a\x96\xad\x2b\x9a\x4a\xb7\xa9\x26\x6b\xe1\xf2\x0d\xfc\xf6\x8e"
+ "\x68\x08\x46\xb2\xb2\x68\x79\xa1\xe9\xd6\xfc\x54\xd3\xcc\x65\x2b"
+ "\x0b\xe8\x2b\x86\x50\xb8\x1e\x30\x15\x2e\x2f\x5c\xbe\x2c\xdf\x34"
+ "\xd5\x94\x46\x98\xd5\xe8\x54\xfc\x4c\x53\xec\xd3\x3a\x1c\xcf\xd1"
+ "\x87\xee\x26\x3b\x45\xe3\x7a\x17\x64\xad\x27\x1f\x8e\x9f\xd7\x85"
+ "\x72\x88\x63\x82\xb3\xcf\x36\xa7\x68\xe8\x38\x3e\xa7\x3c\x58\x7e"
+ "\xe7\xd4\x06\xcb\xef\x9c\x83\x43\xc7\xf1\x39\x1a\xfd\x9f\xa3\xd1"
+ "\xff\x39\xa7\x86\x8e\xe3\x73\x5c\xc1\x65\xe6\x42\x70\x99\xb9\xc6"
+ "\x41\x3b\x83\x6d\x7d\x91\xdb\xa5\xb9\xc9\x9a\x32\x93\x35\x65\x32"
+ "\x34\xcf\x39\xaa\x67\xf4\x5d\xe7\xe6\xab\x7d\x03\x7c\x2e\x52\x74"
+ "\x3d\x60\xdf\xe6\x96\x2b\x30\x34\xf6\xd0\xb7\x2e\x32\x6c\xa3\x0a"
+ "\xb6\x5b\x86\x1d\xd4\x7f\xb2\x49\xb4\x76\x53\xf8\xe7\x59\xb7\xca"
+ "\xb6\xad\x73\x77\x60\x0c\xed\x44\x5e\xdc\x7c\x0e\xe6\xbe\xd2\x20"
+ "\x60\x5d\xb4\x9e\x97\xbd\xbe\xa8\xaf\x61\x34\x18\xa8\x2c\x9d\x57"
+ "\xc5\x6c\xb3\xeb\x68\xfd\x38\xa6\xc5\xe0\x85\x76\x2a\x2b\x51\x59"
+ "\x3b\xbf\x1d\x61\x9c\x90\xc5\x65\x99\xca\x6d\xe7\xeb\x0e\x79\x7d"
+ "\xaf\xd0\x37\x56\x74\x06\xdc\x6e\xb1\x87\x44\x27\x9d\xa3\x46\x75"
+ "\x23\x0e\x3d\x93\x66\x9f\x96\xcf\xc3\x32\xe2\x95\x80\x38\x0b\x14"
+ "\x9c\x88\x2f\x11\xc4\xb9\x7b\xb4\x8e\x4c\xf6\x7b\xb2\xaa\x14\xff"
+ "\x82\x62\x85\x50\xb6\x23\xf4\xda\x6c\x88\xdf\x6d\xf3\x9f\xb4\x6f"
+ "\xed\xa4\x36\x1d\x23\x3f\xd4\x91\xe8\x85\xb6\x3a\x2f\xc6\xaf\x60"
+ "\xe4\xf1\x54\xf1\x17\xe0\x68\xf4\x02\xcd\x0f\x2f\x2d\x86\xb2\x06"
+ "\xc9\x7f\x92\x0d\x96\xa3\x18\x2d\xcb\x4d\xed\xd9\x4e\xe9\x58\x1e"
+ "\x63\x09\x17\xad\xe1\x0e\x33\x1f\x11\x4f\x70\xf6\x71\x14\xef\x65"
+ "\xa7\xca\xbe\x6f\x79\x03\xe2\x0a\xb9\xbe\x58\x02\x47\x9f\x2d\x1b"
+ "\xc7\xbf\x8d\xed\x8a\xcd\x6e\xae\xe5\xb6\x4f\xc2\x74\xd4\xf7\xac"
+ "\xc3\xe1\xfc\x14\xd9\xbe\x5b\x69\x5d\x19\xc2\x1e\xba\x18\x2c\xb5"
+ "\xbb\x19\xfb\x8d\xba\xd8\xfd\xd6\xd6\xb4\x48\xd9\xbe\x1a\xb0\x5c"
+ "\xa7\x52\xee\x72\xfa\x47\xbe\x11\x8d\xc7\xa8\xab\x6e\x11\x2b\xce"
+ "\x7f\xe2\x35\xbe\x66\x79\x1e\xfa\x7f\xd9\x8a\x1e\x5c\x85\xcf\x68"
+ "\xff\xb2\xf9\x7c\x22\x5f\xd7\x83\xf1\xe4\x3a\x2b\xfa\x6c\x89\x6e"
+ "\xb4\x8d\xf3\x72\x95\x3c\x3e\x4f\x44\x79\x25\xcc\xd3\x9c\x48\xf3"
+ "\x1a\xf3\x8a\x06\xf3\xc4\x37\x04\xac\xb9\xd8\x4b\xe9\x55\x4a\xba"
+ "\x18\x5b\xe6\xd5\x69\x9e\x0f\x29\xcf\x78\x7f\x14\xef\x4d\x32\x7e"
+ "\x17\xda\x5c\x9d\xd8\x73\x61\xfe\xf5\xf5\x5c\x6f\xe6\x9d\x54\xf2"
+ "\xf9\x9c\xda\x9b\xf4\x6e\xcc\x0d\xfe\xe8\x0b\xdc\xd7\x25\x7b\xfd"
+ "\xab\x2f\x3d\x91\x18\x63\xe8\x18\x9d\x9d\x8a\x69\x84\x87\x74\x86"
+ "\x9f\x61\x8f\xcf\x1d\x30\x8f\xce\xa0\x75\x91\x8c\x6c\xf4\x42\x92"
+ "\xf5\x41\x9a\x7f\x9e\xcf\xe5\x96\xd2\x08\x2f\xe1\xa3\x31\x91\x70"
+ "\x13\xbe\x5d\xe4\xd3\xf2\xf5\x92\xf3\xa9\xff\x55\xe1\x78\x85\xf9"
+ "\xc5\x2a\x5a\x46\xe2\x73\x79\x70\x5f\xe7\xd7\x6a\x9e\x0f\x2a\xcf"
+ "\x34\xd7\x2b\x64\x6f\x7e\x9d\x9c\xd7\x72\xb1\xba\xc6\xf1\x6f\x64"
+ "\xe6\x77\x6b\xea\xf3\x04\xe3\x5f\x60\xd0\x3c\x27\x2a\xcf\x7b\xf8"
+ "\x3b\x86\x05\x29\x4a\x1d\xbb\xc5\x1a\xae\xee\xa6\xad\xae\xc8\x8b"
+ "\xed\x65\x82\x65\x16\xab\xea\x1c\x81\xcf\x05\x01\xfe\x2d\x28\x56"
+ "\xf0\xe1\xfd\x76\x15\x1c\xfa\x25\x0b\xf6\x28\x70\xe2\xfd\xc6\x82"
+ "\x26\x55\xb9\xc3\x97\xe8\xab\x46\x76\x73\x7c\x42\x76\x17\x74\x6b"
+ "\xda\xe2\x09\xe0\xcc\xd1\x07\xda\x92\x63\x54\xc1\xa1\x7e\xe6\x98"
+ "\xb4\xb2\xba\xae\x98\x64\x9c\xe4\x35\x27\x3d\x44\x9e\x47\xce\xcb"
+ "\x0d\x2d\xe3\x39\x56\x55\xba\x1c\x1f\xe5\xfc\x59\xf6\x13\xc8\x3e"
+ "\xbb\x7b\x4b\x73\x94\x73\x54\xb9\x4c\xd2\x3e\x62\x13\xc5\x99\xdd"
+ "\x28\xd7\x39\x87\xb5\x78\xc5\xf7\x37\x32\x8e\x00\xce\x32\xe1\xe3"
+ "\xe5\x38\x55\x7d\xeb\x71\xc2\x7c\xe5\x3d\x91\x4b\xcc\x0d\x2e\x38"
+ "\x15\x2e\xee\xe8\xb3\x3d\x96\x14\x4c\xb3\xc7\x52\x03\x34\x7b\x6c"
+ "\x4a\x00\xef\x63\x19\x2a\xb8\x7f\xc3\xe7\x1c\x15\x5c\xde\xa5\x64"
+ "\x53\xc8\xca\x63\xe5\x9a\xba\x6a\x55\x38\x9a\x54\x75\x1d\x56\xc1"
+ "\xa1\x9f\xf8\x98\x3d\x3c\x7f\x1e\x3b\x15\x9e\x3f\x8f\x79\x42\xf3"
+ "\x67\xa1\x31\x50\xef\xc2\xa4\x4b\xeb\xd5\x42\xb3\xaa\x3d\x0d\xf8"
+ "\x9c\x1d\xac\x47\x0b\xf3\x34\xcf\x83\xfc\x67\x68\x3b\x9a\x36\x9b"
+ "\x23\x29\xbd\x68\x2c\x18\x85\x9e\x2d\xac\x51\xe7\xff\xaa\x5f\xe4"
+ "\x53\x1b\xf9\x3b\x38\x7a\xbf\x29\xe0\x8e\x6a\xe1\x08\x46\x95\x7f"
+ "\x52\x69\x3b\x8e\xd7\x21\xcf\xfc\x54\xc6\x3f\x87\x9f\xc6\xbf\x85"
+ "\x6e\xf1\xde\xa6\x37\x89\xd9\xde\xc9\x0d\x37\x96\xf5\xd9\x1e\x4f"
+ "\xc3\x98\xa1\x5b\xd0\xe7\x71\x94\xff\x35\xdc\x37\x61\xe5\xbd\x49"
+ "\x28\x4f\xfd\x5d\xf0\xf8\x9f\xf1\x77\x00\x7f\x7f\x17\x3c\xbe\x3e"
+ "\x9e\xc3\x6c\xba\x05\x0d\x36\xed\xb8\xfb\x78\x01\xc6\x1e\xfd\xf1"
+ "\xde\xb2\xdc\x10\x79\xe5\xcc\x16\x31\x3f\x44\x7a\x23\xf2\xab\xdf"
+ "\x09\x8f\x7f\x4c\xed\x55\xa5\x1f\x65\xb6\xb8\x1c\x82\x77\x52\x7d"
+ "\x58\x26\x1c\xdf\x94\xef\xa0\x84\xec\xe5\xea\x35\xfd\xf8\xa6\x0b"
+ "\x72\xb7\x89\x7e\xe4\x7e\x12\x5c\x77\x6e\x52\xe8\x7e\xe4\x4e\xc6"
+ "\x7e\x7c\x13\xba\x1f\xb9\xfc\xdc\x5a\x26\x61\x5f\x86\xf8\x1d\xb9"
+ "\x05\xd8\x97\x6f\x38\xdd\x83\xd3\xb7\x2b\x71\x6a\xe9\x37\x18\xff"
+ "\x4b\xc0\xcb\x2e\x28\x09\xf0\x4d\x86\x3b\x14\x5f\x0b\xd9\x21\xea"
+ "\x6c\x61\xb6\x91\x0b\x9c\x90\xeb\x55\xc6\x2b\x39\xfd\x94\x68\x0b"
+ "\xd2\x49\x22\x3a\xe5\xf2\x7a\xc3\xf1\x5b\xd1\x4f\xf1\x9e\xe9\x09"
+ "\xd4\xff\xc7\x9d\xca\x98\x8e\xe3\xb9\x4b\xa1\x23\xe6\x65\x6a\xf2"
+ "\x3c\xaa\xbc\xfc\xa0\xbc\x2d\x83\xe9\x25\x4a\xfa\xe5\xf1\xe9\x89"
+ "\x43\x1a\x3e\x21\x7f\x9e\x9c\x1a\xdc\xef\x27\x8e\x89\xfe\x21\x8f"
+ "\x86\xd0\xfa\x89\x93\xc8\xa3\x81\xd0\x3c\x7a\xc2\x1d\x5a\xd6\x9e"
+ "\x8c\xe1\xf8\x46\x43\x08\x7c\x4f\xa6\x20\xef\x06\xb8\x0c\xca\x7c"
+ "\x1a\xca\x9f\x27\x67\x2b\xfc\xb9\xbc\x3e\x3e\x59\xa3\xe9\xa3\xaf"
+ "\x0b\x16\xc5\x8a\xbe\x2e\x7a\x4a\x83\xfb\x60\x68\x59\x7c\xd2\x8e"
+ "\xfd\xf4\x85\xee\xe7\x93\xa7\xc2\xcb\xe2\x93\xf4\xae\xce\x37\x54"
+ "\x16\x17\x19\x45\x19\x08\x51\x66\x51\x2a\xb3\x85\xaa\x67\x51\x06"
+ "\xf9\x45\x4e\x58\x54\x42\xef\xe9\x54\xe9\x8b\x83\xe5\x0f\xfb\x40"
+ "\xe5\x88\x7e\x5e\x11\xc7\x10\x1f\xba\x4c\x20\x5d\x4a\x26\xfb\x6c"
+ "\x8b\x8e\x69\x68\x75\xbe\x0b\x16\x4f\xed\x95\xa4\x99\x82\x5e\x4f"
+ "\xe9\x34\x6d\x3a\x19\x9a\x5e\x8b\x5c\x48\xaf\xf3\xa1\xe9\xb5\x38"
+ "\x26\x3c\xbd\x16\x13\xff\xcf\x0f\xa5\xd7\x62\xb3\x9a\x5e\x7e\x9b"
+ "\xe8\xdf\x2d\x89\x28\x1b\x03\x4b\x59\x83\xb0\xe5\xc6\x78\x94\x15"
+ "\x51\xa6\x87\xca\x14\xc5\x7b\x84\x9c\x98\x6e\x00\xc3\x39\x58\xbc"
+ "\x58\xd1\xff\xb8\x5a\x18\xc9\x06\x16\xd1\x1a\x6d\x3a\xcb\xd9\xe8"
+ "\x28\x3e\x6f\x77\x78\xd3\x80\xe6\x1b\x35\xf5\x1e\x0d\x6d\x0b\x16"
+ "\xb7\x23\x4d\x5f\x0d\x91\xde\x2d\xe6\x4c\x9f\x32\x05\xdb\x88\xa7"
+ "\x20\x98\x47\x8b\x78\x39\x18\xdc\xff\xf4\xe2\xd7\xc5\x79\xf6\x94"
+ "\x75\x28\xcf\x96\x8c\x92\xf9\x75\x21\xb8\x7d\x4f\x95\x87\xe6\xd7"
+ "\x53\x8d\xe1\xf9\xf5\xd4\xb1\xf0\xfc\x7a\x8a\x62\x9f\xf3\x4e\x58"
+ "\x62\x0c\x1e\x37\x9e\x72\x05\xf7\x17\xeb\xc5\x72\x4c\x1a\x71\x35"
+ "\x3d\x5f\x6e\xbf\x95\x8b\x6c\x1c\xf1\x8a\xbe\xff\xc7\xf6\x8f\xa5"
+ "\x36\x0e\x17\x47\x58\xdc\x48\xc3\x9a\xcd\x61\xcf\x07\x8f\x69\xc3"
+ "\xb8\x92\xd6\xe7\x99\xc6\xd0\x5c\xd9\x92\x33\x7e\x49\xf7\x00\xde"
+ "\x4b\x5d\x90\xf7\x6b\xbf\x14\x51\x46\x6b\xc9\xf8\xb7\x83\xfc\xfd"
+ "\xc4\x12\xaf\x9a\x17\xb4\xa6\x6c\x97\xd8\xcb\x91\xe6\x39\x3f\xed"
+ "\x82\xa5\x2f\x09\xbe\xe4\xbd\x12\x4c\xc7\xa5\xa6\xd0\x7c\x59\x3a"
+ "\x05\xf9\xf2\x69\x68\xbe\x2c\xcd\x09\xcf\x97\xa5\x56\xe4\xcb\xa7"
+ "\x43\xf5\x68\x69\xb9\xac\x47\x2f\x52\x19\xd3\x1a\xf2\x57\x97\x7e"
+ "\x43\x30\x78\x8f\x3a\xb2\xf4\x34\xe5\x8f\xef\x51\xf4\x88\x97\xa1"
+ "\xf8\x9f\xd7\x2f\xc3\x1c\x95\x71\xa8\xf1\x3a\xe3\x7b\x42\xe9\xc9"
+ "\x52\x7a\x9f\xaa\x9b\x60\x05\x03\xd2\x30\xf7\x00\xe1\x28\x04\x38"
+ "\x07\x79\x73\x08\x8e\xd2\xe9\x6c\xe5\x00\x7c\x5e\x8a\x02\xc7\xe7"
+ "\x45\x05\xac\x89\xf5\x59\x80\xe0\x82\x71\xe7\xc9\xfd\x1f\xc9\xc7"
+ "\x11\x82\x27\x38\x0d\x4c\xb1\xd0\xc7\xbc\x63\xc1\xfa\x98\x57\x13"
+ "\x2c\x9f\x4b\xe9\xfd\x44\xbc\x1f\xed\x1c\xca\x72\xa7\xcf\xa6\x7b"
+ "\xe0\xdb\xd1\xcd\x65\x31\x1a\xdd\x44\x19\x58\xf6\x0b\x21\x03\xcb"
+ "\xaa\x83\xdb\xba\x2c\x39\xb4\x0c\x2c\x4b\x0f\x2f\x03\xcb\x72\xc3"
+ "\xcb\xc0\xb2\x22\x92\x01\x27\x2c\x3b\x14\xac\x9b\xcb\xaa\x82\xfb"
+ "\x8e\xf5\x72\xdd\x84\x51\xc3\xd1\x4d\xf4\x85\xae\x0e\xa7\x87\xb2"
+ "\xff\xaf\x6b\xe8\x07\x18\x06\xcd\x0c\xa8\x57\xd8\xbe\xa7\xcd\xf4"
+ "\x0e\x09\x6d\xbc\x85\x68\x58\xcf\x63\xb4\xa7\x73\xd4\x74\xdc\x25"
+ "\x62\xad\x52\x84\xfd\x0b\xad\xd9\x13\xf4\x7c\xe6\xcd\xe0\xfe\x3f"
+ "\x5d\x14\x9a\x9e\x4f\x57\x21\x3d\x4b\x43\xd3\xf3\xe9\x83\xe1\xe9"
+ "\xf9\x74\x0b\x7d\xab\x3e\x54\xa7\x9e\x3e\x65\xda\xc0\x7d\x14\x5e"
+ "\xe6\x1c\x3c\x73\xef\xe5\x8d\x4f\xcf\x24\x04\x8f\x4f\x4f\x7b\x87"
+ "\x3f\x3e\x3d\x93\x1b\x7a\x7c\x7a\xc6\x1a\x7a\x7c\x7a\xa6\x5c\xe8"
+ "\xc3\x33\xf6\x60\x7d\x78\xa6\x31\x58\x26\x90\x76\xdf\xda\xf8\x94"
+ "\x6f\xd4\xe8\xc0\xee\x2e\xc8\x7f\x05\x7d\x0a\xd9\x16\x2e\x7f\x2c"
+ "\xb8\x8d\xf9\xa9\xa1\xf9\x96\x9f\x81\x7c\xdb\x1d\x9a\x6f\xf9\x79"
+ "\xe1\xf9\x96\x5f\x82\x7c\xdb\x3d\x94\x6f\xf9\x7b\x86\xef\x53\xe4"
+ "\xb7\x06\xf3\x2c\xff\xf0\xf0\x79\xb6\x3c\x26\x34\xcf\x96\x27\x87"
+ "\xe6\xd9\xf2\x74\xc1\xb3\xe5\x45\xc1\x3c\x5b\x9e\x13\xcc\x33\xa4"
+ "\xdb\xb7\xc6\xb3\xe5\x2d\x1a\x9e\xad\xed\x82\x15\x33\x90\x67\xed"
+ "\x82\x67\xcf\x46\x69\xda\xe8\x0c\xcd\xb3\xe5\x1e\xe4\xd9\xda\xd0"
+ "\x3c\x5b\x91\x10\x9e\x67\x2b\x68\x0f\x8d\xb5\x43\x79\xb6\x22\x73"
+ "\xf8\x3c\x5b\x51\x12\xcc\xb3\x15\xf9\xc3\xe7\xd9\x0a\x7b\x68\x9e"
+ "\xad\x38\x19\x9a\x67\x2b\x5c\x82\x67\xcf\xa6\x04\xf3\xec\x59\x43"
+ "\x30\xcf\x90\x6e\x7f\x27\xcf\x90\x3f\x26\xb1\x5e\xf7\xd9\x8a\x5e"
+ "\x3e\xa7\xfd\x6c\x99\x13\x2c\xf2\xf7\xec\x16\x2e\x3b\x32\x0f\x7f"
+ "\x85\x30\x45\x43\xc7\xee\x67\xeb\xe4\xb4\xc7\x87\xf2\xe1\xd9\xa3"
+ "\x38\xae\xf6\xb4\x94\xf0\x75\x5d\x82\x87\x44\x73\x84\x13\x73\x64"
+ "\xcf\x72\xfb\x8f\x3c\x66\xb4\xaf\x30\x8d\xc5\x08\xef\x26\x3c\xb4"
+ "\xaf\x4a\x30\x2e\x8b\x7e\x38\x7e\x59\xf8\x35\xe6\xbd\x26\xda\xfb"
+ "\xbf\x0b\x56\x5e\x2f\x64\xd5\xa2\xf5\x7f\x1b\xb0\xae\x2f\x84\x9c"
+ "\x3e\xa7\x99\x33\xb1\x84\xf1\x7f\x2d\xe4\xff\x36\x84\x96\x53\xcb"
+ "\x45\xfc\x5f\x0b\xd1\xa3\x41\x15\xaf\x8e\x46\x0f\x50\x13\xaf\x5a"
+ "\xbc\xf1\x6e\x21\x3b\xdc\x8f\xad\xe8\x35\xf5\xd9\x56\x26\x6b\xda"
+ "\x8c\xbc\x59\xf9\xa6\xdc\xe6\x7d\xc1\xe5\x57\xa6\x87\x6e\xf3\xca"
+ "\x1c\x6c\xf3\xaf\x42\xb7\x79\xa5\x35\x7c\x9b\x57\x56\x61\x9b\x7f"
+ "\x35\x54\xb7\x56\x36\xc9\x72\x10\x22\x2e\x5f\x69\x0f\xcd\xff\x95"
+ "\x1a\xfe\x43\x6e\x51\x09\x73\xf1\xf2\x41\x70\xcf\x81\x1a\x8e\xd6"
+ "\xea\x13\x2c\xc9\x48\x08\xd8\x54\x2d\xce\x30\x70\x39\x43\x64\x8f"
+ "\xbe\x2d\x08\x29\x7b\xcf\x95\x09\x7d\x7c\xee\x64\xb0\x3e\x3e\x57"
+ "\x1b\xac\x8f\x48\xeb\xe0\x72\x47\x83\xf3\x2d\xe5\xdf\x9e\x8d\x5d"
+ "\x95\xa2\x91\x81\x77\xba\x60\xd5\x4f\x85\x0c\xac\xf2\x05\xb7\x63"
+ "\x95\x39\xb4\x0c\xac\xca\xc5\xfe\xbf\x13\x5a\x06\x56\x15\x85\x97"
+ "\x81\x55\x35\x48\xcb\x77\xd4\x72\xbb\xa0\xc4\x3c\x52\x03\x73\x24"
+ "\xb4\xcd\x5b\x75\x3c\xf4\xbc\xce\xaa\x4e\x41\xe3\x82\xa4\x60\x1a"
+ "\xaf\xf2\x06\xd3\x70\x95\xf9\x5b\xa0\xe1\xe0\x59\x19\x7d\xb6\x02"
+ "\xad\xfe\x3b\xba\xa0\x40\xd6\xff\xd5\x67\x82\xdb\x58\x20\xc7\x3f"
+ "\xa1\xe6\xb2\x0a\x9a\x90\x96\x8e\xd0\xb4\x2c\xb0\x87\xee\x73\x01"
+ "\x8d\x41\x0e\xff\x10\x5d\x2a\x70\x61\xfa\x02\x7a\x77\x40\x73\x58"
+ "\xf5\x98\xbe\xc0\x0b\x06\x3e\x5e\x0d\x8e\x4b\xab\x13\x68\x8e\x9c"
+ "\xcf\x31\xa3\xfc\xc6\x27\x41\x36\x8d\x41\xd4\xae\xa5\x25\xda\x77"
+ "\xa2\xab\xcd\xd4\x6e\x5a\xc7\x42\xdf\xd5\xc4\x17\x43\xb6\xc3\xed"
+ "\x05\x45\xde\x09\x5e\x83\xdb\x4a\x7a\x41\xf0\x0a\xac\x98\xeb\x2c"
+ "\xd3\xd8\xa6\xd5\xb5\xa1\x79\xbc\xfa\x70\x78\xd9\x59\x7d\x5c\xf0"
+ "\x79\x0d\x04\xf3\x79\x75\xa7\xdf\x16\x97\x43\x7d\x45\x19\x18\x96"
+ "\x9e\xd0\xbb\xd3\xb0\xf6\xfe\xc5\x45\x27\xad\x5b\x61\xcc\x59\x58"
+ "\x63\xe1\xf5\x49\x0c\x7d\x0a\x1d\xb4\x70\x1b\xb0\xe6\x6d\xde\x4e"
+ "\x84\x59\xea\x05\x89\xbd\xb8\xea\x24\xe5\x35\xd8\x98\x87\xce\x8d"
+ "\x51\xce\x80\x41\x59\xb8\xba\x03\xd6\x6c\x0b\x2a\x8f\xa3\x91\x43"
+ "\xe0\x38\x26\xe6\xf7\xd7\x1c\x55\xe6\xe1\xc3\xcd\xef\x23\xcc\x29"
+ "\x65\xdd\xaf\x78\x17\xb6\xa6\x3d\xec\xb8\x8c\x6d\xa2\x6f\xc7\xa9"
+ "\x4d\x17\xb7\x03\x6b\xd3\x14\xf9\x15\xef\xe6\xd6\x9a\x03\xdf\xb6"
+ "\xac\x9d\x8d\x79\x43\xf6\xc9\x0c\xad\x07\x6b\x8b\xd5\x78\xc4\x79"
+ "\x31\x6b\xab\x94\xef\x53\xf0\xbe\xf6\x12\xb8\x94\xf6\xd8\x35\xed"
+ "\x69\xc7\x78\xc1\x2d\xe3\x38\x75\x09\x1c\x09\x8e\xa6\x07\x60\x82"
+ "\x1f\x22\xce\x42\xe1\x1d\x74\xfe\x8c\xa3\xae\x1b\x62\xbc\xa0\x17"
+ "\xb1\x9d\x75\x12\x7d\x1b\x42\xb1\xa1\xc3\x3b\xcd\x4e\xef\xe0\xf8"
+ "\x1a\x82\xc4\x69\xf6\x13\xc5\x3e\x79\x0f\x36\xeb\x43\x44\xd3\x13"
+ "\x96\xf3\xf6\xba\xbd\xac\xfb\x00\xdf\x7b\xcb\x1a\x14\xff\x55\xd1"
+ "\xfa\x1f\x5a\x87\xb1\x15\xa6\x21\xfc\x5f\x84\xae\x17\x6a\x7c\x52"
+ "\x6b\x98\xf8\xcf\x4a\xf1\xdf\xb4\xd0\x7a\x6e\xbd\x48\xfc\x67\xa5"
+ "\xf8\x6f\x9a\x7a\xdc\x14\xef\x79\xac\xa7\xd4\x3e\x29\xed\x8f\x65"
+ "\x5a\x41\x7e\xe6\xf3\xf3\xee\xda\x03\x46\x2f\xbd\xd3\x46\xdd\x74"
+ "\x74\xb7\x90\xbe\x1a\x4f\xb8\x8e\xd2\x3e\x0c\x86\x38\x2b\xc9\x22"
+ "\x8d\x65\xa4\xaf\xcf\x9b\xf8\x58\xe6\x15\xba\x58\x5a\xcc\x5c\xa9"
+ "\x9d\x28\x43\x6b\x2d\x0a\xae\x98\x2d\x16\xf1\xdd\x47\x5c\x27\x8c"
+ "\x74\x74\xf3\x71\x51\x47\xfe\x2a\xf7\x5b\xbd\x5f\x01\xe1\x6d\x2e"
+ "\x39\x01\x84\xd7\x3f\x38\x4e\x72\xdc\x25\xa4\xe3\x84\x93\x70\xb7"
+ "\x21\x1c\xe1\x25\x38\xa5\x1f\xe2\xdb\x98\xe7\x9b\xd4\x7d\xe7\xf3"
+ "\x2f\x58\x37\xa6\x9f\xa6\x79\x15\x07\x95\x2b\x5d\xc4\x26\x74\xd2"
+ "\x3b\xb3\xf3\x76\x56\xba\x8a\x4d\x28\xa4\x39\xb1\x42\x3a\xef\x59"
+ "\xf7\xab\xff\x74\x46\x16\x8d\x05\x83\x48\x7b\xbe\xa7\xc5\xe4\x01"
+ "\x27\x14\xa6\x05\xdb\x88\x42\x8d\xff\x6b\xe5\x71\x26\xfe\xea\x69"
+ "\x7d\xa2\xbc\x7e\x95\xec\x01\x73\x78\xfb\xb8\x7c\x5c\x6c\x4d\x05"
+ "\xbd\x93\xa6\x35\x51\x62\xff\xb7\xc2\x62\xcd\xdc\x9b\x6b\x17\x5f"
+ "\x57\xf3\x1f\x58\xef\xba\x48\x21\x23\x45\x91\xc1\x3c\x2d\xac\x2d"
+ "\xfd\x82\xde\x05\x89\xf1\x60\x89\x57\x6b\x1f\x0b\x8f\x2a\xbe\x9b"
+ "\x26\xbd\x5d\x19\x0f\x4c\x6b\x08\xef\x3a\xcd\x38\x53\xc8\xfd\x7f"
+ "\xdf\x90\x71\x61\x1d\xd9\xf5\x20\x99\x6c\xe3\x32\xb4\xce\x74\xc2"
+ "\x8d\x72\x53\x48\xf2\xbf\x6e\x1f\xc2\x6c\xa3\x6f\x0e\xf1\x79\xe4"
+ "\x39\x58\x97\xed\xb3\x81\xe1\x84\x8b\x7f\x53\x65\x44\x19\xe1\x72"
+ "\x4b\xe3\xc6\x44\xb1\x1e\xc9\xad\xa9\xa3\x40\xa1\x39\xc1\xb4\x15"
+ "\xfe\x07\x88\xf5\x14\x24\x0b\xeb\xcc\xb4\x36\x23\xae\x87\xef\xb5"
+ "\x65\x54\x64\xc8\xe1\x3d\x09\x6d\x5e\x6d\xcc\xb3\xee\x48\xe8\xbe"
+ "\xaf\xa3\xf1\xff\x55\x27\x14\x25\x07\xf3\x76\x1d\x1f\xff\x95\xf7"
+ "\x3a\xc8\x7b\x57\x70\xb9\x22\x7d\x30\xef\x0b\x6b\x29\x3f\xec\x1a"
+ "\x9f\xf2\xde\x64\x8c\x67\x96\xba\xf9\x7a\xaf\x22\xd4\xff\xc2\x9c"
+ "\x8b\xd9\x41\x66\xe8\x4d\xf6\x23\xac\xbc\x2e\x18\xed\x56\x51\x79"
+ "\xd0\x9c\xd1\xb5\x7c\xce\x68\x69\x17\xac\x97\xdf\xfd\xac\x3f\xa1"
+ "\x69\x5f\x53\x78\xdf\xa0\x88\xde\xff\x2c\x0d\x6d\x33\x8a\x4e\x85"
+ "\xf6\x0d\x8a\xdc\xb2\x5d\x58\xca\xa2\xb4\x72\xb0\x9e\xbe\xa7\xe3"
+ "\x65\x94\x18\x96\xe6\x42\xc3\xc7\xb0\xeb\xcd\x83\x31\x6c\x21\xd9"
+ "\x83\xf5\x29\x83\x31\xac\x2b\x54\x0c\xeb\x0c\xc1\xcf\xf5\xdb\x43"
+ "\xf3\x73\x7d\x5d\xe8\x18\x76\xfd\x11\x31\xce\xaf\xef\x0e\xe6\xf3"
+ "\xfa\xe3\x81\x77\xc2\x45\x4d\xdf\x9e\x3f\xbc\x61\xca\x50\x7f\x78"
+ "\xc3\x6f\x05\xaf\x36\x7c\x15\xdc\xb6\x0d\xd9\xa1\x6d\xfb\x06\x4b"
+ "\x78\x7f\x78\xc3\xf6\xf0\xb6\x7d\x43\xe3\x50\x7f\xd8\x34\x42\x03"
+ "\xd3\x32\xe8\x2b\x05\xf9\x66\x1b\x4e\x09\x3a\x6d\x24\x7f\x2e\x42"
+ "\x05\xef\x0e\x96\x77\x6c\x33\xe2\x43\xdb\x76\x96\x6c\x9a\x22\x33"
+ "\xe1\x68\x42\x7b\x2f\xdd\xb2\x07\xa2\x50\x07\xde\xe9\xb3\x6d\x1c"
+ "\x94\x7f\x5a\xc7\x47\xf5\x90\x8d\x0c\xbb\x9e\x4e\x52\xda\x47\xed"
+ "\xd8\x58\x72\xb1\xf7\xa5\x11\x89\x90\xfd\xda\x10\x7a\x6c\xe4\xfe"
+ "\x1f\xe1\xb8\x38\xcf\x36\xf6\x68\x74\xcc\x2d\xd6\xe1\x16\xff\x4e"
+ "\xf0\xad\x58\x13\xcb\x16\x1b\xf8\x37\x7d\x61\xed\x6d\x71\x4a\x68"
+ "\x19\x2d\x36\x0f\xda\xdb\x42\x8e\x77\x93\x26\x3f\x4f\xf0\xa0\xf8"
+ "\xa8\x3f\x4a\x3d\xd7\x5d\x5c\x1c\x6c\x93\x8a\xf3\x34\xe5\x34\xf1"
+ "\x5f\x31\x6f\xcf\xe5\x8d\x37\xc5\xdd\xe1\xc7\x9b\x4d\xeb\x45\xff"
+ "\x37\x6b\xde\x2f\x6f\x32\x5c\x7c\xbc\xd9\x14\xa6\xff\x9b\xcc\xc1"
+ "\xe3\xcd\x66\xcd\x3b\xfa\x4d\x79\xa1\xc7\x9b\x4d\xc5\x8a\x9d\x11"
+ "\x76\x63\xd3\x1f\x2f\xcf\xde\x6c\x3a\x1c\x6c\x6f\x36\xd5\x5e\xca"
+ "\xde\x34\x0f\xb1\x37\x9b\xdc\xf1\x75\xa1\xfa\xb2\x39\x26\xb4\xbd"
+ "\xd9\x9c\x2c\x78\xb8\xb9\x24\xd8\xde\x6c\x4e\x0f\xe6\xe1\x26\x0d"
+ "\x0f\x37\x6b\xde\x7f\x6f\x32\x5c\xa9\x4d\x8a\x88\x88\x90\x22\x74"
+ "\x92\x2e\x02\xb3\xb0\x7b\x30\x32\x42\x1f\x11\x89\xd7\x08\xf9\x77"
+ "\xa4\x14\x21\xe9\xf1\x8a\x94\x7f\x47\x68\x9e\x47\x52\x59\xbc\xf4"
+ "\xf2\x6f\xa4\xe6\x79\xc4\x25\xf2\x47\xca\xf5\x2a\xf5\xeb\x35\xcf"
+ "\x91\x97\xc8\x1f\xf1\x77\x96\x87\x21\xcf\xc1\xdf\x41\xce\x5a\xb3"
+ "\x61\x59\xc1\xca\x7c\xbe\xae\x7d\xb9\x69\xd9\x33\xcf\x2c\x5f\xb7"
+ "\xce\x54\xb4\xd6\xf4\xf0\x43\xf3\xef\x7e\xc0\x24\x96\xc7\x17\x4c"
+ "\xbd\x35\x3f\x1a\xe6\x6c\x2c\xa4\x8c\x39\x0b\x66\xe5\x9a\xb2\x1f"
+ "\x7e\x28\x38\x53\x41\xc3\x97\xc1\x5f\x0c\x8b\x4a\xf7\xcc\x15\xd7"
+ "\x02\x54\xed\xe5\x76\xa7\x93\xbe\x3d\x17\xf1\x44\xd9\x5f\x8e\xd3"
+ "\xf7\xcb\xfd\xa5\x8c\xbe\xab\xe8\x80\x92\x2d\xd4\x89\xf1\x8d\x65"
+ "\x60\x7d\x9a\xf6\x53\x29\xd9\xc7\x7e\xef\x02\xd3\xa3\x20\x75\xc0"
+ "\x4b\x7f\x6d\xc9\x44\x58\x7c\x76\x38\xbd\x60\x2a\x25\xdf\xb6\xac"
+ "\x02\xf3\x74\xec\x41\x3f\xa6\xb9\xe5\xef\xf3\x4b\xf7\xf1\xb4\xdf"
+ "\x97\x29\x70\xf1\x5d\xb0\x65\x2a\xfb\x3d\xe3\xcf\xb4\x67\x8d\x80"
+ "\xdb\x32\x8a\x49\x2f\xb4\x93\x5d\xa8\x1b\x0d\x7a\x5a\x97\xbd\x6f"
+ "\x34\x18\xf6\x5d\x4b\x7b\xee\x6e\xd1\x2b\xeb\xb2\x2b\xf0\xd9\x09"
+ "\x2f\x75\x53\xdd\x04\xeb\x97\x5e\xe8\x27\xf8\xfa\x60\xf8\xc9\x81"
+ "\x75\xdc\x5b\xf4\x12\xc2\x65\x9d\x86\xf8\x78\x1f\xbb\xe0\x89\xfe"
+ "\x6b\xee\x84\x4c\xf4\xd3\x90\x15\xc7\xbd\x65\x20\xbe\x8d\xda\xb2"
+ "\x65\x93\xef\xff\x27\xee\x7d\xe0\xa2\xae\xd2\xfd\xf1\xf3\x19\x46"
+ "\x1c\x08\x98\xd1\xc8\x26\xd3\x1c\x0b\x75\x2a\x4c\x2a\xfb\x7d\xdd"
+ "\xfd\x59\x91\xd9\xbd\x76\x5f\x96\xec\x5e\xbb\x5f\x76\xaf\x05\x16"
+ "\xb4\x58\xa6\xb3\x48\x8a\x86\x80\xa3\xb9\x68\xfc\xab\xa8\x48\x11"
+ "\xa8\xdc\x5d\xdd\xb5\xb2\x8d\x76\x69\xaf\xd5\x94\xd4\xa5\x42\x86"
+ "\x5a\xdb\xa5\xae\xd5\x48\x48\xc8\xa2\x4e\x32\xc0\x08\x33\x9f\xf3"
+ "\x7b\xde\xe7\x7c\x3e\x33\x03\x81\xad\xf7\xde\xd7\xeb\xe7\xeb\x85"
+ "\xf3\xf9\x9c\xcf\xf9\xfb\x9c\xe7\x3c\xe7\x79\x9e\xf3\x9c\xe7\xe1"
+ "\x01\xf8\x4c\xb8\xab\xb7\x88\x57\x3c\xc2\x8c\xb4\x9e\x15\x57\x2e"
+ "\xee\x52\x6c\xce\xaa\xcb\x66\x46\x1a\xff\xb4\x1e\x56\x58\x65\xbb"
+ "\x9b\xf8\xc6\xbb\x98\xf1\xa3\x7c\xdc\x77\xf5\x6d\x2a\xff\x94\x19"
+ "\x7f\x3f\x54\x6c\x18\xe2\x56\x56\x90\xc7\xbb\x39\xfc\x70\xfb\xb8"
+ "\x1f\xf6\xb6\x2d\x99\x41\xe4\x79\x68\xb0\xc8\xca\x5a\x89\x7d\xd9"
+ "\x7c\x8c\xfb\x4b\x3e\x95\xfe\x2a\x8e\xf4\xfa\x70\x7f\xd6\xb4\xf9"
+ "\x2e\x16\xd5\x95\xce\x0c\x47\x72\xaa\x99\x7b\x85\x8f\x15\x1c\xe3"
+ "\xdd\x2d\x99\x27\x58\x6b\xce\x41\x96\xd1\xce\x0c\x2d\x9d\x5f\x32"
+ "\xe1\x4b\xba\x3c\x39\xb5\xb0\x9f\x59\x37\xaf\x42\x5a\x3f\xdb\xb4"
+ "\x99\xc5\x6f\xfa\x0c\x72\x50\x3b\xb5\x73\x8a\xfd\xfc\x28\x53\xa8"
+ "\x3e\xc3\x63\x5f\x32\xeb\x63\x3f\xc3\x3d\xf3\x54\x56\x53\xc8\xac"
+ "\xbc\xc8\x1e\x37\x54\x64\xb7\x0c\x71\xfb\xe4\xc1\x22\x7b\x62\xab"
+ "\x83\xf2\x77\xbe\xc5\x12\xda\x59\xe2\xdb\x3d\xed\x86\xea\xb3\x6c"
+ "\x1a\xc6\xd4\x45\x63\xab\x39\x4b\xf9\xcb\x15\x97\x4a\x65\x23\xcb"
+ "\x04\xe2\x95\x76\x77\xba\x9f\xa9\x54\x57\xf5\x10\x9b\x56\x33\xc4"
+ "\xac\x6a\x99\xe2\x42\xb9\x5e\x56\xf4\xa4\xbb\x85\x11\xa6\xf0\xe0"
+ "\xf0\xce\xef\xd2\x89\x1e\x4e\x7c\xf5\xfe\x46\xa3\xbb\xa5\x97\x1d"
+ "\xf1\x0d\xb1\x56\xf6\x05\x73\xe7\x7f\xeb\xfa\xfd\xfd\x8d\x13\x88"
+ "\x9f\x54\x5c\x9b\x60\x03\x2f\x71\xa7\xe8\x08\xfc\xe7\x15\xb3\x8a"
+ "\x42\x16\xe7\xd8\xc4\x26\xf6\x50\xba\xa0\x3d\x25\x9d\x99\xee\xc0"
+ "\xb7\xae\x4d\xe2\x3e\xf8\xe3\xdd\x85\x47\x58\x54\xab\xaf\x1a\xf7"
+ "\x8e\x0d\xc1\x84\xe4\x54\xb7\xaf\x8d\xb9\x1d\x5f\xbb\xd4\xb8\x64"
+ "\x7b\xa9\xca\x4c\x2f\x0f\xb4\x19\xdc\xc6\x01\xe6\x4e\xf7\xb1\x77"
+ "\xa8\x6d\x5e\x9e\xbc\x94\x68\x56\x6a\xab\xcf\x0f\xff\x3b\x29\xbc"
+ "\xcf\x1a\x5b\x91\xcb\x92\x6b\xcf\xb2\xa4\x3d\x67\x99\x9d\x0f\xda"
+ "\x0d\xb8\xe3\x0d\x7f\x69\x7b\xe8\x37\x8e\x64\x30\x1a\xbb\xb8\xeb"
+ "\xcd\xe3\xb5\xbb\xde\xc3\x76\x56\x37\x14\xbe\xeb\x3d\xd4\x17\xbe"
+ "\xeb\x4d\x38\x65\xc2\x7d\x6f\x0f\x2b\xac\x31\xb7\xb0\x89\xb4\x4e"
+ "\x5c\xc0\xef\x8a\xd3\xcc\xb8\xf5\x34\x63\xd7\x15\x1b\x20\x67\x1a"
+ "\x69\x3d\x6c\x76\xd3\xdc\xe0\xb9\x83\x15\xcf\xa7\xdf\x38\xfa\x23"
+ "\x79\xae\x58\xf8\xaa\xe8\xd4\xf0\x98\xd2\x0c\x94\x36\x9d\x7e\xa3"
+ "\xe8\xf7\x92\xa2\x1a\xee\xe5\x25\xfd\x0b\x88\x57\x89\x05\x3e\xcb"
+ "\xfb\xe5\xfd\x0b\x06\x9d\xc5\x71\x1e\x76\x60\xb5\x8e\xd7\x92\xbe"
+ "\x6f\x36\xbd\xd3\x71\x0a\xfe\xde\xbd\xa2\x5f\xc3\x39\x0a\x7c\xbf"
+ "\x6b\xe9\xe8\xc3\xa3\x68\x97\xda\x4f\xa7\x5f\xb3\x94\x41\x8b\x7a"
+ "\xf5\xb2\x7d\xc3\x39\x68\xf3\x11\x4a\xe7\x7a\x3a\x8d\xdb\x88\x6f"
+ "\xaf\x77\x9c\x32\xc8\x3c\x76\x03\xd5\xe9\xd7\xea\xa7\xb5\x5f\x70"
+ "\x00\x6b\xbc\xcf\x60\xe6\x87\x33\xe7\xb3\x9a\x67\x79\xcb\x9e\x67"
+ "\x79\x93\x5c\x7b\xc5\x07\x3d\xec\x15\x71\xbf\x90\xf6\xf0\xa6\x52"
+ "\xfa\x76\x98\xa4\x71\xc0\xa5\x29\x0b\xf6\xa5\xc5\x6d\x1e\x76\x65"
+ "\x62\xe4\x18\xb8\x73\xd3\x41\xec\xa3\xaf\x14\x36\x93\x3c\xf9\xd8"
+ "\xc1\xd6\xce\x5e\xf6\xfb\xa1\xee\x09\x45\x1f\x32\x83\x3b\xd0\xc1"
+ "\xe6\x25\xca\x38\x39\x75\xcf\x72\xcf\xd3\x88\x1f\xfc\x2c\xef\x25"
+ "\x7c\x99\xde\xc3\xb6\x4c\xbf\x36\x91\x25\x7e\x4c\x5c\x89\xa4\x4f"
+ "\x5b\x6e\x8a\xa0\x4f\x6f\x1d\xf1\x34\x46\xd0\xa6\xc7\x1f\xf9\x3e"
+ "\x6d\xda\xb6\x4a\xd2\x26\x5a\xfb\x82\x16\x05\xb5\x7b\xe4\xdb\xee"
+ "\x19\x95\xae\xdd\x5f\xd9\xf6\xa3\x51\xe9\x7e\x2d\x7d\xd6\xa8\x74"
+ "\xaf\x4c\xdf\x9a\xad\xd3\xbe\x56\xf4\x63\x03\x68\xdf\xd6\x3b\x41"
+ "\xfb\x5a\x33\x35\xda\x27\xe8\xcf\xd6\xb9\xfc\x45\xa2\x45\xeb\x41"
+ "\x6f\xb6\x4e\x40\xff\xf9\xdb\x4c\xef\x7b\x4c\x17\x73\xbe\x8f\xb4"
+ "\xca\x2f\x98\x91\xfe\x34\xba\x57\x70\x29\xe8\x1e\x68\x1e\x68\xdf"
+ "\xee\x29\xbc\x7d\xf7\xb3\xfc\x68\x8d\xf0\x5b\xed\x0c\xd1\xbf\x27"
+ "\x28\xad\x94\xd2\x9e\xa0\xef\xa0\x83\x80\xc9\x91\xf4\x46\x26\xe2"
+ "\xda\x94\xf8\xf2\x55\x43\x0a\x2b\xa7\xf9\x86\xff\xab\x6d\x04\x5f"
+ "\xb3\xc2\x1c\xee\x3c\x9f\xb8\x87\x02\x5f\xe9\xad\x79\x9d\x58\x77"
+ "\x53\xb6\xaa\xd0\x53\x9c\x60\x85\x3e\xde\x83\xbb\x2a\xe8\x43\xc6"
+ "\xc6\x7f\x81\xaf\x6f\xa5\x29\x87\x31\xf8\x25\x00\xcd\xa6\xbe\x18"
+ "\x2b\xa9\x4f\xd2\xb7\xb0\xf3\x90\x87\x7d\xad\xe1\xeb\xe3\xb8\xab"
+ "\x46\x7b\x0a\x09\xe2\x4e\xa2\x8f\x34\x36\x73\xb0\x98\xc1\x37\x0b"
+ "\xe2\x6b\xe2\x77\xb7\x41\xcd\xa9\xd4\xfd\xb3\x38\x89\x36\x50\x1e"
+ "\x77\xbb\x9f\xa1\xcf\x1e\xe6\x5c\x7a\xa4\xa0\x91\xca\x6f\xf1\x02"
+ "\x36\xdc\x59\xa4\xd7\xa1\x88\x3a\x0c\x42\x77\x9b\x43\xf9\x3c\xa2"
+ "\x7c\xec\x77\xe9\x47\x56\x78\x19\xe8\xbe\xbb\x9b\xea\x28\xe8\x90"
+ "\x75\x50\x5d\x9c\xf6\x80\x11\xdf\xb4\xfa\xe3\x37\xf3\xef\xa8\xfe"
+ "\x43\x98\x2f\xf8\xe9\x82\x9d\x12\xc1\x25\x0e\xbe\x1a\x24\x1f\xea"
+ "\xbc\xa3\xee\x0b\xc6\x34\x5f\x63\x84\x6f\xce\xc5\xf0\xe5\x05\xff"
+ "\x62\xe7\xf3\x2d\x46\x30\x4a\xd2\xfd\x8b\xa9\x1b\xfe\x77\x7d\x8b"
+ "\x51\xdd\xd6\x5a\x03\xa7\x35\xe7\x5c\x0c\xff\x62\xd4\xff\xbd\xc0"
+ "\x43\x6d\x4c\x4b\x9e\xf9\x39\x60\xbe\xa5\x14\x69\x15\x4e\xde\xac"
+ "\xcf\x3f\xc6\x8b\xb1\xd0\x37\x87\xe4\x0f\x39\xad\xcb\x6d\x4b\xf0"
+ "\x9d\xd2\x56\x20\xff\x3c\xa2\x63\x6e\xda\xc3\x5e\xed\x08\x1a\x2a"
+ "\x36\x31\xa3\xa4\x69\x8f\xaf\x44\x79\x49\xd3\x1e\xb7\x86\x69\xda"
+ "\xe3\xf1\x92\xa6\x49\x18\x4b\x9a\xf6\xb8\x22\x69\xda\xb6\x73\xc2"
+ "\x9e\x88\x68\x1a\xbe\x81\xae\xe9\x34\x6d\xcf\x14\xde\x0c\xda\x31"
+ "\xe8\xdc\xd6\xad\xd3\xb6\x32\x4a\x03\xed\x40\x1f\x25\x9d\xda\x9a"
+ "\xca\xff\xcb\xce\xa4\xbd\x26\x9e\x73\xe0\x3f\xa3\x5b\x7b\xc6\x7e"
+ "\xf2\x33\x49\xe3\x1e\x5f\x18\xa6\x71\xdb\x5c\xe1\xb2\xa0\x71\x8f"
+ "\xff\x44\xd2\x38\x99\x5e\xf7\x73\xd0\xb8\xad\xa9\x80\x81\x56\xbf"
+ "\x01\xe7\x68\x5a\x7e\xc0\x71\x49\x24\x8d\x1b\xb9\xbe\x1e\xaf\xd2"
+ "\x69\x1c\x68\x1b\xbd\xef\xf5\xb0\x99\x42\x2f\x8c\x75\x56\x45\x30"
+ "\xd7\xd7\x1d\xe6\x00\x63\x46\xfc\x00\xc0\xed\xf6\x53\x6c\xa2\xe6"
+ "\xb7\x46\x1b\xf7\xe3\x1e\xfd\x8e\x26\xc1\xff\xfb\x3e\xcd\x58\xd8"
+ "\x2f\x19\xcd\xf5\x0c\xf8\x73\x74\x17\x77\x30\x77\x35\x2f\x6e\x0d"
+ "\x1c\x63\xea\xd6\x87\x8f\x63\x5e\x49\xde\xf8\x7f\xf1\x0b\xba\xd3"
+ "\xc3\xb6\xcf\xcc\xf0\x09\xfd\xfd\xf1\x0a\x03\x7d\xcb\x1f\xf1\xed"
+ "\x66\xb4\x01\xbd\x22\x3d\x9b\xc6\xd3\x23\x5c\x40\x5b\x65\xe7\x69"
+ "\x6b\xbf\x68\x8b\x78\x29\x92\x7b\x26\x9d\x66\xdb\xc5\x19\x9a\xf0"
+ "\xc9\x3c\x76\x5d\x9f\x6b\xdf\xa3\xc6\xf9\x7e\xee\xfc\xe5\x7f\x75"
+ "\xd9\xf9\xcb\xff\xea\x47\xa0\x41\xb8\x8f\x17\x74\x8e\xac\x27\x21"
+ "\xa0\xe7\xeb\x41\xbe\x95\xda\x39\xc8\xf1\xa2\x99\x42\x2e\xb3\xea"
+ "\x75\x02\xef\xca\x29\x9f\xf0\x5f\x4b\x34\x72\xf1\x46\x06\xdf\xc1"
+ "\x91\x65\xf7\x84\xe1\xfb\xab\xb4\xf3\xe8\x69\xe2\xdc\x24\x05\x22"
+ "\xbe\xfc\x61\xda\x05\x71\x97\xa6\x2a\x74\xf6\xf0\x2b\x1f\xd1\x4b"
+ "\x11\xbf\x55\xbb\xb7\xdb\x4b\xf4\x6d\x06\x7c\x6c\x82\xaf\xd4\xee"
+ "\x5a\x5c\x4a\x74\x79\x32\xfc\xb0\x40\x5f\x9d\x11\x4c\x33\x1c\x16"
+ "\xfe\xf7\x4b\x52\xf4\xb2\xe3\xe9\xf6\xd0\xae\xd6\xa6\xb8\x87\x44"
+ "\x65\xb2\xf4\x32\xa8\x1b\x77\x6f\x68\x3f\x9e\x21\xfc\x9b\x05\x7a"
+ "\x41\x03\x2f\x25\x1e\x74\xb2\x6c\x27\x93\x69\xed\x54\x7b\xd8\xf6"
+ "\xac\xf3\xdd\x73\x1a\x7f\x7c\x25\x47\x2f\x7c\x7c\x4c\x1b\xdf\x0e"
+ "\xcb\x0f\x8c\xef\x3c\xed\xee\x58\x7a\xe1\xed\x5a\xf4\x76\x4b\x2e"
+ "\x1c\xae\x3b\x0e\xfd\xe3\x70\x4d\xd1\xe0\xba\xc3\xfb\x03\x70\x1d"
+ "\xa3\x9d\x9d\x49\xff\x78\x3b\x36\xad\x9d\x9d\xe9\x63\xb5\xc3\xc4"
+ "\xbf\x71\xfd\xf5\x98\xf4\x18\x31\x5a\x5c\xe2\x18\xaa\xa7\xde\xc3"
+ "\x4a\x42\xb1\x87\x65\xbc\xa4\x9d\x0d\x1e\xb6\xa3\x6a\xe4\x3d\xae"
+ "\x9d\x9f\x64\xd4\x63\x5f\xe7\xaa\x87\xed\x3c\x0a\x5d\xdb\xe2\xcd"
+ "\xd2\x3f\xa0\x56\x86\xe8\xf9\x8e\x69\xe7\x3b\x4f\x13\xb1\x30\x34"
+ "\xdf\x1d\xb8\x9f\xca\xcb\x59\x7d\x5f\x51\x0e\x93\xb1\xa2\x9f\xb8"
+ "\x1e\xf7\x90\xe8\x79\x22\x3d\x4b\x3d\x14\xe2\x0b\x48\x9f\x14\xd1"
+ "\x94\xb6\x05\xf1\x27\xe4\xfd\xbd\x27\x96\x53\x1f\xf2\x85\xae\x49"
+ "\xf8\xd8\x17\xbe\x5d\x7c\x94\xcf\x80\xb2\xd2\xa7\xc7\x13\xf9\x7a"
+ "\x1e\x8f\x5e\x5f\xc8\xbf\xc5\x13\x77\xca\xbd\xe5\x89\x25\x7d\xe3"
+ "\xc4\x31\x82\x9f\xb3\xbd\x85\x29\x23\xee\x1f\xde\x91\x9b\xbb\x36"
+ "\xf7\xc7\xb6\x75\x8f\xdc\x3f\x77\x5d\xde\xca\xbc\x47\xd7\x89\x8b"
+ "\xea\xb1\x8c\x12\x6c\x79\xab\x1e\xc9\x5e\xfb\x68\x9e\x7d\xc3\xca"
+ "\x55\xf2\x62\xfb\xd5\x94\x31\x32\x13\x1b\x19\x37\x92\x68\x10\xfc"
+ "\x1b\xc2\x07\x85\x88\x1d\x09\x5f\x24\xfa\xbd\xdd\x26\xab\x88\xb1"
+ "\x45\x34\xab\x74\xa1\x87\xad\xed\xd6\xe7\x01\xfe\x11\x89\x6f\xb1"
+ "\xf6\xb0\xd2\x9f\x01\x77\x96\x11\x0b\x5a\x27\xfd\x4a\x08\xdf\x00"
+ "\xee\x3c\x4a\x68\x65\x26\xd7\x7a\xe8\x61\x4b\xdb\x54\xe7\x13\x2e"
+ "\xe1\xef\x71\x53\x0f\xde\xfb\x75\x3e\x01\xe7\x4a\xf2\x1c\x78\xc6"
+ "\xad\x1d\xac\x74\x16\xda\xc5\xba\xab\x7d\x4a\xc6\xea\xe6\xce\x27"
+ "\xda\x71\x57\x9b\xde\x4d\xd4\x07\x97\xce\x8b\x52\x7f\xe3\x78\x3c"
+ "\xdb\xe7\x61\xa5\xbe\xf7\x2c\x5e\xa6\xdd\xf5\x36\xd5\xca\x7b\xdd"
+ "\x46\xca\xdb\x1b\xca\xeb\xa4\xbc\x65\x6c\x1f\xed\x9b\x63\x9e\x65"
+ "\xf3\x58\x35\x55\x1d\x4e\x9f\x10\x39\x66\x92\xab\x69\xfe\xca\x7e"
+ "\x4d\x63\x4f\xd4\x71\x45\xce\x7d\x59\x99\xf4\xbd\xac\xa6\x52\x5a"
+ "\x34\xfd\xa6\xf7\xd1\x37\xf8\x40\xa0\x6f\x99\x38\x23\x6b\x2d\x38"
+ "\xe3\x3a\x6c\xed\xa0\x79\x2f\x73\x78\xd8\xfa\x69\xf2\xde\x1a\xe5"
+ "\xa7\x36\xdc\xc5\x43\xac\xc9\xc6\x5d\xd0\xd1\x79\x58\xd9\xa1\x26"
+ "\x9b\x8f\xf1\xa8\x7f\x3f\x8e\x72\xb4\xae\xac\x45\xf9\xe0\x45\x28"
+ "\x5d\xdc\xcf\x2b\x3b\xa8\xc3\x3c\xcf\xc6\x4f\x21\xcf\x78\x7a\x65"
+ "\xec\x97\x15\x62\x2f\x39\xcb\x60\x83\xd5\xc9\xca\x8e\x8e\xde\x2f"
+ "\x66\x65\xfd\xd8\x96\xb5\x32\xcf\xb6\x7a\xd5\x9a\x6c\x5b\xd6\xaa"
+ "\x2c\xdb\x9a\xb5\x79\xb6\x5f\xac\x85\x82\x07\x2a\x9d\x11\x38\xa1"
+ "\x62\x7c\x1b\xd2\x27\xe8\x67\xd8\x7d\x1b\x72\xa2\x25\x4e\x57\xcc"
+ "\xed\x1b\xcc\x99\x38\x12\x26\x15\x93\xe4\x5e\x59\x9e\x49\x7d\x37"
+ "\xca\xfb\x7f\x51\xdd\xf4\x4e\xe3\x2f\x6b\x1e\xb9\x76\x2b\xee\xd5"
+ "\xf2\x96\xea\x79\x05\x5e\x5c\xd9\x13\xfa\x56\xa1\xe1\x63\x9d\xbc"
+ "\xa7\x2c\xfc\xde\xd4\x09\x1b\xfe\x72\xd7\xb8\x65\xe0\xeb\x6b\x13"
+ "\x7b\xe0\x34\x2b\xdf\xcf\x9d\x65\x3e\x0d\x87\x4c\x6a\x89\x9a\xa6"
+ "\xe1\x0f\xe1\x44\x05\xfb\x3e\xfe\x54\xac\x00\xfe\xf0\xc1\x74\x93"
+ "\xb0\xf7\x08\xf8\x89\xce\xd1\x3b\xed\xcf\x1e\x56\x9e\x85\x71\xf8"
+ "\x36\xa4\x9b\x8a\x9e\x17\xfe\xf7\x4e\xe2\xec\x14\xf1\x69\x08\x57"
+ "\x62\x64\x1c\xcd\x8a\xe5\xfa\x1c\xe9\xf9\xc7\xc4\x31\x89\x2f\x23"
+ "\x71\x4c\xc2\xf3\x65\x81\x63\xc4\x1f\x50\x9f\x0c\xba\x9f\x3f\xec"
+ "\x21\xd4\xb7\xa6\xbc\xcd\x9c\x53\x1b\x8d\x11\x78\x70\x7a\x2c\x3c"
+ "\xa0\xb9\x7d\x60\xf5\xda\x07\x1e\xa6\x85\x9e\x9b\x9d\xf7\x40\x0e"
+ "\x7c\x5b\x80\x0e\x08\xc7\x19\xb3\xb2\x6c\x8f\xae\xcb\x7e\x20\x96"
+ "\x8d\x95\x2b\xf4\x31\x72\xfe\x2d\x2a\xe1\x6b\x5f\x5f\xfa\x04\xdc"
+ "\xb1\x90\x77\x2a\x9e\xdc\xdc\xb7\x8e\x64\x91\x11\xf3\xfe\xe4\x2f"
+ "\xdd\xd6\x14\xe2\xe9\x52\x84\xef\x38\xc0\x4c\xda\x09\x3c\xf9\x06"
+ "\xe0\xd0\x67\x50\x68\x3f\xa9\xcc\xd3\x71\x80\x9e\x8b\x69\x4c\x39"
+ "\x61\x1b\x8d\x27\x1b\xfa\x0c\x13\x8e\x81\xfe\x48\x7b\x90\x1e\xa2"
+ "\x03\xe6\xba\x0e\x56\x29\x6c\xc1\x6a\xc5\x7e\x54\xd9\xa0\x97\x29"
+ "\x0f\xdd\x73\x7e\x72\x9a\x8e\x27\x11\x65\x7e\x8d\x34\xe1\xeb\xc8"
+ "\x59\xd1\x86\x39\xe7\x72\xee\x8d\x7a\x3e\x82\x2b\xaf\x13\x74\xe4"
+ "\x49\xd3\x68\xda\xf0\x9e\x05\x67\xe2\xb2\x3f\x02\xff\x4c\xaa\x5d"
+ "\xf8\x4d\x21\x5e\xaf\x83\x3d\x79\x89\x66\x9f\x22\x74\x8a\xee\x7c"
+ "\xaa\xcb\x2f\xeb\xa2\xb6\x06\xf4\xb6\x78\x8c\x6a\xaf\x13\x78\xf6"
+ "\x64\x4e\x58\x67\xf8\x64\x22\x64\x65\xde\x97\x1e\xed\x61\x95\xcb"
+ "\x05\x6e\xd1\x73\xde\x65\xd2\x87\x1b\xf0\x0d\xe3\x04\x5e\x85\x71"
+ "\xea\xc9\x7d\xfa\x7c\x63\xcc\x54\x6e\x85\x4d\xf8\xf9\x7d\xd2\xa5"
+ "\xc3\x72\x3c\x5f\x33\x62\xdd\x9a\xa8\x2f\x83\x72\xed\x0a\x39\x4f"
+ "\xfa\x17\xc2\x3d\x97\x28\xea\x63\x5a\x17\x7b\xea\x13\xd8\xee\x9b"
+ "\xfd\x90\x9b\xd4\x34\xf8\x4e\x90\x7b\xd9\x53\x36\xc2\xe1\xc4\xf0"
+ "\xdd\xf4\xa7\x88\xff\xab\x4c\x94\x73\xf7\xd4\xc2\x88\xb5\xe7\xd5"
+ "\xec\x01\x26\x02\x46\xa0\x67\xee\xfc\x3b\xc4\x7a\x95\xf7\x7e\x9f"
+ "\xca\xd1\xcb\x09\x3f\x03\x84\x1b\xb0\x83\x3d\xcd\x9e\x2a\xc1\x1e"
+ "\x81\xfe\x79\xd8\x53\x26\xb4\x8f\xf1\x61\xcf\x16\x78\x63\x45\x0c"
+ "\x94\xa7\xf6\x8e\xea\x43\x83\x5e\x97\x56\x77\x93\xfe\x0e\xbf\x63"
+ "\x1e\x56\x95\x86\x38\x90\x87\x7d\x62\x0c\x17\x35\x91\x54\xd0\xe4"
+ "\x13\xf9\x7a\x75\x18\x52\x7a\x31\xbd\xd3\x5c\x94\x0a\x1f\x59\xbc"
+ "\x94\xed\x93\xb4\xa8\x0a\x31\x4c\x79\x91\x0d\x7e\x09\x17\x4a\x7a"
+ "\x23\x7c\xe9\x88\x6f\x31\xda\x9a\x8d\xc1\x1d\x21\x61\x17\xe3\x0b"
+ "\x08\xda\x20\x7d\x2f\xd0\x77\x5a\x23\x83\x88\xe9\x32\x9c\x13\x23"
+ "\xfb\xf6\x74\x66\xa8\x0d\xc4\xa7\x14\x67\x90\x4f\xa7\x49\x5f\x26"
+ "\x13\x49\xd6\x7b\xba\x58\x9f\xbf\x6d\xcf\x52\x1a\xe2\xa7\x1a\x98"
+ "\xa9\x49\xf8\x0a\x7b\xba\x46\xef\xaf\xf6\xcd\x20\xf0\x41\xc0\xe0"
+ "\xe9\xd0\xfa\xef\x13\xb1\x3e\x9f\x6e\xd6\xdb\x11\x79\x29\x1f\xf2"
+ "\x37\x25\x89\x6f\x9d\xa1\x7a\xa4\x0f\x15\x93\x88\xf7\x5c\x8f\x6f"
+ "\x55\x2c\x4c\xab\x9e\x12\xfe\x8a\x85\xdd\x1a\x8d\xc3\xfb\x58\x4e"
+ "\x8c\x98\x03\x1b\x43\x7c\x10\xc4\x11\x36\x48\x5c\xac\x9a\xaf\x97"
+ "\x89\x52\x00\xc7\xaa\xc5\x7a\xdb\x7a\x1d\xe8\xff\x79\x69\x9e\x1c"
+ "\x8b\x11\x6b\x44\x8b\xd9\x29\xe8\x85\xe4\xb5\xaa\x8e\x08\x1c\x14"
+ "\xe3\xac\xaa\x8f\x9c\x6b\xc9\xcb\x55\x35\x44\xe0\x03\xfa\x13\x9a"
+ "\x7f\x9a\x7b\x9f\xdc\x4b\xaa\xda\x23\xfa\x48\x73\x52\xd5\x1d\x9a"
+ "\x87\x9d\x62\x8e\x10\x03\x6a\xcc\x78\x8f\x62\xad\x50\x1e\x95\x8b"
+ "\x7e\x62\x3e\x48\x16\x5b\xc0\x9a\xc0\x13\xd2\x5a\x21\x98\x50\x1f"
+ "\x9f\x79\x04\x78\x35\xe8\x7c\x26\x75\x24\x6e\x3e\x93\x16\xd1\x5f"
+ "\x05\x74\x9d\xd2\xb2\xf4\x3c\x1e\xf6\x8c\xb8\xcb\xa4\xc3\x93\xbe"
+ "\x15\x87\xe6\xf1\x06\x91\xb7\x52\xef\xe7\x0f\xec\x19\x1a\xac\x9e"
+ "\xf9\x50\x6b\xa3\x59\x6f\x83\x9e\x49\xfe\xa9\x5a\x31\xba\x8e\xfb"
+ "\x37\xe6\x65\x4b\xe7\x46\xd8\xe4\x57\x3e\xf0\x70\x76\x56\xb2\x6d"
+ "\xe5\x83\x70\x83\xb4\x6e\x75\x76\xb6\x43\x1c\xe2\x8c\xe4\x03\x13"
+ "\x45\x7b\x04\x07\xe9\x73\xfa\xb9\x9f\x3c\x2d\xed\x57\xb0\x2e\xb0"
+ "\xde\xbd\x58\xef\x87\x0b\xce\x0a\xd9\xc6\x5d\x7c\x03\x73\xfb\x79"
+ "\x31\xf8\x7f\x41\xfb\x30\x7e\xab\x4f\xee\x03\x34\x9f\xd8\x23\x07"
+ "\x9d\xcf\x3a\x46\xc2\xeb\xd9\xe2\x91\x6b\xf9\xd9\xca\xb1\xe9\xc4"
+ "\xb3\xd7\x0b\x3a\x51\x22\xf1\x02\xf4\x09\xb6\xff\xa8\x97\xca\x34"
+ "\x8d\xaa\xf3\x68\x98\x46\x3d\xeb\xd1\x69\x94\xdc\x27\x9e\x33\xd2"
+ "\x1e\x54\xa9\xb5\x15\x08\xe3\xcd\x73\x05\x12\x6f\x9e\x23\xf9\xef"
+ "\xe5\x6d\xba\xac\x23\xf7\x8e\x67\x3c\xe0\x1f\x65\x7c\xed\xe7\x52"
+ "\xf4\xfa\xaa\x26\x63\xdf\x78\x2e\xf5\xfb\xfc\xc3\xb3\xbd\xe0\x1f"
+ "\x60\x97\x08\x58\x88\x78\xc2\x62\xdd\x3c\xb7\x3a\x82\xfe\x58\xe8"
+ "\xbd\x60\xac\xb9\xbe\x1f\xdb\xf1\x5c\x1c\xb7\xcd\x7d\x60\x4d\xde"
+ "\xcd\x70\x51\x95\x9d\xef\xc8\x7e\x20\x2f\x3b\x6b\xf4\x39\x9b\x5d"
+ "\xe7\xc5\x70\xc6\x5d\x45\xeb\xde\x1b\x03\x78\x3c\x47\xe3\x7f\x3e"
+ "\xa0\x8f\x41\xd0\x29\xe2\x1d\x35\x1a\x17\xd7\xc5\x9e\xff\x50\xc6"
+ "\x12\x7f\x2e\xa0\xe3\x09\xf2\xdd\x9e\xcf\xd5\x41\x67\x35\x8d\xff"
+ "\x59\x93\x26\x6f\x91\x4c\x5b\x6d\xd3\xdf\xc3\xe5\xab\xb3\xc5\xde"
+ "\xf7\xac\xb0\xe9\x23\x98\x56\x77\x46\xf0\x5b\x78\x3f\xa4\xbd\x0b"
+ "\x3f\x4c\x32\x2e\x7a\xf5\x46\x09\xdf\x6a\x9a\xff\x67\x34\x5a\xf1"
+ "\x7c\xb3\xac\x87\xb1\x97\x0a\xbd\x13\xea\x84\x7e\xbf\xba\x52\x6f"
+ "\x8f\xca\x1f\x8b\x6c\x13\xfb\xd6\xe8\xfa\x3c\xac\x5a\xdc\x0f\xd9"
+ "\x2a\x7c\xc8\x55\xb7\x8c\xd1\xd7\xb4\xc8\x7c\x94\x87\xe4\xdf\x67"
+ "\x6a\xf4\x31\xff\x6b\x3e\xd2\x9e\x37\x9e\x67\x8c\xbd\x72\x8c\xcf"
+ "\x17\x03\xb7\xd0\x3e\xf0\x5f\xeb\x43\x96\xe6\x97\x04\xbe\xf1\x3c"
+ "\xe8\xbf\xf0\x8f\x66\xc5\xba\x7e\x9e\xe4\xdf\x27\x5b\xf4\x71\x60"
+ "\x8c\x0d\x85\x5e\xa3\xee\x97\x4a\x96\x7f\xfe\xe6\x91\x7d\x7b\xbe"
+ "\x34\xa2\x4c\xb7\xeb\x4a\xe8\xee\x9f\x9f\xc5\x9d\xcf\x95\x00\x0f"
+ "\xe1\xaf\xaa\x2a\x84\x87\xcf\x37\x7e\x1f\xef\x9e\x4f\x02\xde\x45"
+ "\xe2\xd2\xaa\x1b\x1e\x20\x4c\x5a\x97\x9d\xf7\x63\xc1\xdd\x13\x63"
+ "\x07\xb7\x67\x2b\xf3\x56\xad\x5d\xb3\x2e\xd9\xb6\x2e\x6b\xa5\xb6"
+ "\xe8\x47\xac\x79\xa7\x90\xfd\x7d\xfa\x3a\x1b\x74\xee\x4a\x0a\xd3"
+ "\x96\x5d\x61\xfc\x87\x8d\xd6\x95\xd0\xcd\xee\xda\x28\xd7\xd3\xae"
+ "\xa5\x11\x6b\x57\x94\xc7\x1a\xad\x13\x3c\xdb\xae\xc8\xfd\xdf\x47"
+ "\x30\x8d\x39\xcd\x76\x5d\xa2\xc1\xd4\x27\x61\xbc\xeb\x5d\x31\x4e"
+ "\xe1\x8f\xeb\xf9\xa3\x18\xa7\xf0\xff\x22\xf8\xb3\x5d\xfb\xf4\xf1"
+ "\x86\xe5\x86\x5d\x2e\xc1\x47\x69\xfc\xda\x0f\xc9\xf5\x92\x3f\xdd"
+ "\xbd\x42\xd3\xbd\xb5\xeb\x32\x9e\xce\x5f\x53\x5f\xb2\x24\xaf\xba"
+ "\xfb\x92\x65\x05\x7c\x38\x23\x1f\x7e\xea\x30\x07\xbb\x6f\xd3\x79"
+ "\x4b\x61\xbf\xb7\x43\x4d\x19\x74\xee\x5e\x10\x49\x27\x78\xd4\xc3"
+ "\xed\x1a\x8f\x98\x22\x65\xd7\x8b\xfe\xd4\x41\x6d\xe1\xec\xe1\x3c"
+ "\x7d\xa3\x71\xed\x26\xfa\xf7\x6a\x03\xea\x01\x7f\xcd\xfb\xac\x5a"
+ "\xac\xca\x1a\x71\x86\x57\x4b\x75\x7b\x69\x6e\x29\x1f\xcd\xef\x2e"
+ "\x81\x1b\x2a\xe1\x28\x6c\x77\x7c\x3a\x8f\xc4\x76\x7f\x86\xbd\x88"
+ "\x9e\x09\x6f\x6b\xec\x12\xa7\x6a\xec\xde\x75\x76\xd6\xd7\x67\x35"
+ "\xf4\xad\x4b\x37\x42\x5f\x00\x58\xb8\x6b\xfc\x4c\xe2\xcf\x6e\x3f"
+ "\xd1\xbc\x7d\x91\xf5\x69\x75\x01\xa6\x46\xf4\x83\xaf\xb3\x1a\x80"
+ "\xdf\xc0\x57\xde\x67\x27\x3e\x61\xb7\x8b\xaf\xb3\x1b\xc6\xf1\xbd"
+ "\x75\xbe\x71\xc6\x21\xde\x23\x62\x80\x82\x5e\x49\xff\xfe\x7b\x1e"
+ "\x7f\x5a\xea\x06\xb4\x76\x6b\x76\x70\xc3\x0b\x62\x5f\x29\x17\xfb"
+ "\x0a\x67\xd2\x5f\x7a\xcd\x3e\x61\x47\xeb\x78\x41\xc4\x7c\xd5\xee"
+ "\x67\x7b\x9b\x1c\x01\x11\xab\xae\x28\x0f\x7c\x5a\x00\xe7\x46\xe2"
+ "\xfe\xf1\xe1\xbc\x00\xfb\x57\x3f\x70\xb2\xa6\x1d\xbe\xe2\x65\x2c"
+ "\xf0\x9a\x4e\xdd\x3f\x3c\x62\x48\x22\xfe\x29\x8d\x2b\x2a\x1c\xbf"
+ "\x74\xcf\x21\xe8\x6d\xa5\x3c\x6e\x65\xe5\xc4\xd3\xcb\x39\xd8\x33"
+ "\x17\xb1\xf8\xa4\xac\xd0\x41\xf3\x12\xf5\x2d\xe5\xbd\x43\xe0\x4f"
+ "\x88\x4e\xec\x79\x0b\xb6\xe9\x1e\xad\x8e\x41\xe7\x1e\xda\xff\x77"
+ "\xe7\xc8\xb6\xa8\xbe\x41\x7d\x3e\xf7\xcc\xfd\xbe\x7e\x23\x5c\x1f"
+ "\x95\x4f\xd6\xf8\x02\x26\x75\x5f\xef\xa1\xae\x1a\x5d\xf7\x15\xe6"
+ "\x7d\xf6\x1c\xd4\x75\x5f\xd2\xf7\x74\x4d\x1e\xda\x1f\x4f\x47\xc4"
+ "\x8b\x7e\x06\xbc\x37\x81\x87\x1b\x97\x9f\xa0\xfd\x1d\x7d\xd7\xf9"
+ "\x42\x39\x3f\xb5\x77\x82\x3f\x44\xcc\x55\x9d\x97\x94\x3c\x40\xed"
+ "\x72\xb9\x97\xd5\x2e\xd0\xf7\x32\x2a\xdb\xa0\xd1\x0a\x6d\x9f\xab"
+ "\x0d\xc9\xbf\x63\xdb\xe5\xd7\xe6\xe9\x30\xd2\x61\x2e\x61\x54\x7b"
+ "\xa4\x2f\xb6\xaf\x3a\x0c\xdb\xda\x23\x02\xd6\xa1\xef\x75\x13\x22"
+ "\x60\x8f\x77\xa3\xa4\x9b\xb5\xb4\xff\xd7\xcc\x97\x7b\x8a\x4c\xe3"
+ "\x09\xec\xf7\x22\x6e\xbb\x80\xc1\x2a\xa1\x9b\xf1\x16\xd9\xd1\x37"
+ "\xaf\x47\x49\xb1\x49\x5a\x56\x4b\xf9\xf7\xf4\xca\x72\xb5\xd5\xe8"
+ "\x4b\x64\x7f\xef\x59\xf3\xf0\x9a\xb5\x1b\xd6\x40\xa1\xf6\xe8\x3a"
+ "\xdb\x03\x6b\xb3\xb2\x63\xc7\xd0\x87\x58\x11\xd7\xda\x57\x15\xf2"
+ "\x3b\xf5\xa2\x09\x76\xf4\x32\x66\xc1\x8b\x31\xb6\xd9\xc0\xaf\xba"
+ "\x47\xa0\x2b\x10\xb1\x23\xe0\x63\x55\xea\x0d\xba\x51\x5e\xc2\xfa"
+ "\x85\xfe\xbe\x0d\x39\x1a\x8f\xf5\xc2\x6b\x80\xa3\x26\x73\x70\x1a"
+ "\xe3\x49\x7d\x1f\x42\xff\x04\x6f\x3e\x6c\x17\x74\x51\x1d\xce\x31"
+ "\x0a\x78\x0d\xdb\x69\xbf\xa9\x6b\xf6\x28\xd7\x05\xe4\xb8\xea\x8e"
+ "\xea\xf0\xc0\xf8\x07\x11\x6b\x93\xaf\x22\x1c\x7d\xd1\xa4\xd5\x05"
+ "\xfa\x89\xba\x6b\x74\x3b\x6e\xf8\x12\x75\xad\x87\x1f\xe1\xfa\xcf"
+ "\xd4\x32\xd0\x9b\x7a\xab\x4e\x97\xb0\x17\xa9\x54\xcf\xab\x03\xde"
+ "\x09\xb4\x6e\x6e\xa3\xb2\x53\x3a\xd8\x0b\x59\x32\xde\x40\xfd\xe2"
+ "\x91\xf1\x06\x5e\xb0\xd1\x5f\x96\xf6\xb7\x2d\xe2\xf9\x7c\x7f\x7a"
+ "\x99\xb4\x70\x5a\x7d\xfd\xa8\x3c\xdb\xa8\x4f\x07\x42\xfc\x8a\xf4"
+ "\x67\xaa\xf9\x3f\x46\xec\x8c\xfa\x93\xf0\x19\x1a\xc6\x8d\xfa\x78"
+ "\x8d\x07\xe9\x06\xec\xb0\xdf\x76\xb2\x17\xa4\x2f\x93\x72\xc2\x0d"
+ "\x9e\xce\x30\x26\x3e\xb8\x8a\x70\xe2\x05\x63\x18\x0f\x24\x8c\x28"
+ "\xcd\x1a\xe6\x53\xea\x7b\x51\x26\x12\x0e\xd4\xc6\x6d\x52\x36\x7d"
+ "\x21\x55\xdf\xb3\xe1\x2f\x55\xc6\x9f\xa8\x3f\xd0\x50\xd8\x4d\x32"
+ "\xff\x0b\x2b\x22\xea\x38\xa0\xe9\x22\x8c\xdc\x50\x67\xa9\x13\x32"
+ "\xdb\x0b\x05\x61\x9d\x40\xfd\x01\xd0\x5d\x51\x47\x02\x3b\xe8\xf6"
+ "\x89\x98\xd1\x8a\x1e\x23\x9e\xf2\xee\xd3\x79\x14\xbd\xae\x26\xa9"
+ "\x73\x12\x3e\x2e\x69\x0d\x56\x52\x9e\x96\x90\x3e\x96\xd2\x42\x32"
+ "\x60\x3e\xad\x63\xc1\x7b\xbf\xd0\x1b\x96\xf5\xea\x84\x5f\x01\x21"
+ "\x07\xca\x7a\x4c\x1e\xf6\x82\x67\xb4\xdc\x46\xfc\x83\x6d\xd5\x9a"
+ "\x55\xc4\x3e\xfc\xc2\xb1\xf6\x66\x12\x1d\x7e\xe1\x58\x75\x33\x4c"
+ "\xbe\xee\x5a\x7c\xa7\xf8\xa5\xc5\x71\xf3\x18\xfa\x63\xe8\xbd\x45"
+ "\x5c\x66\xe8\x8c\x48\xce\x85\xee\x74\x50\xc6\x4a\x9d\xa8\xfd\x9a"
+ "\xb4\xdf\x68\xda\xf7\xd2\x69\xad\x94\x21\xf6\x0d\xc1\xbf\x5e\x75"
+ "\xca\x38\xaf\xda\x9e\x4d\xb4\xfc\xc5\xc7\xf5\xf3\x32\x61\x03\x0f"
+ "\x3f\x86\x7d\x39\x42\x1f\x37\xe8\x7c\x31\xa4\xff\x90\xfa\x45\x79"
+ "\xe6\x46\xe9\xed\x7a\xba\xae\x8f\xa5\xb4\x5e\x5d\xf7\x2a\xf3\xbe"
+ "\x18\x08\x97\x1d\xa1\xdb\x4e\xd4\xcf\xe3\x06\x9d\x2f\xd9\x74\x98"
+ "\xe9\xf5\x14\xd9\xf8\x69\x8d\x4f\x8a\x12\x7c\xb5\xf3\xc5\x44\xe1"
+ "\x3b\x14\xbc\xb8\xd0\x33\xbf\xb4\x5c\x6f\x07\x32\x02\xfa\xad\x9d"
+ "\xfd\x88\x75\x0f\x1f\xa1\xd2\xc7\xe8\x4b\xa1\xf9\x1f\x05\x73\xfb"
+ "\x8d\x57\x0b\xbd\xbc\x7d\x1d\xf1\x67\x57\x8f\xd2\xc3\x01\x87\xe6"
+ "\x55\xb1\x18\xa1\x63\x92\x72\xfa\x04\xf0\x08\x34\x86\x17\x68\x3e"
+ "\xa3\x40\xcb\xe5\xbe\xf7\xd2\xb1\xd0\x1e\x1f\xc7\xf6\xf1\xd8\xbe"
+ "\x2a\xf8\x99\x97\xf7\x16\x5e\x3a\x07\x7c\xf3\x5e\xfa\xf0\x20\x87"
+ "\x8d\xf2\x73\xff\x3e\x28\xf5\xf0\x7b\x6f\x0a\xeb\xcc\x5e\x2a\xd1"
+ "\x7c\xa2\xc2\xfe\x8d\xe6\x6b\x6f\x72\x88\xe7\xa4\xfc\x82\xf7\xa2"
+ "\x3a\x71\x47\x01\xed\x5f\xc0\x39\x8f\x91\x97\xce\x5e\x22\xd7\xe9"
+ "\x5e\x97\xa8\x83\x68\xb5\xbc\x07\xb0\x97\xf8\xff\x97\x6a\xe4\xde"
+ "\x80\xba\xd3\x59\x5f\xc2\xec\x94\x3e\xe7\x47\xc9\x80\xa1\x2f\xe1"
+ "\x16\x87\xf4\x41\xbc\xf7\x5d\x9f\xd3\x48\x73\xba\x97\xe6\xff\xf7"
+ "\xdf\x93\x75\xf5\xb6\x86\xd7\xf3\xa6\xc0\x00\x6f\x2c\xff\x82\xe8"
+ "\xdc\x83\x8c\x05\xd6\xf3\x83\xc3\x03\xbc\x41\xc4\x20\xbf\x9f\xb1"
+ "\xb2\xaf\x18\x0b\x46\xfd\xfb\xc9\x21\xc2\xd5\xbb\xfb\xd5\xd3\x88"
+ "\x17\x58\x47\xf9\xee\xf6\x9d\xe1\xb5\x54\xe6\x6e\x07\x3f\x5d\x4b"
+ "\xf9\xee\x3a\x75\x9a\xef\xa1\xbc\x77\xe5\x10\xae\xac\xe7\x81\x60"
+ "\xd4\xc3\x27\x6d\xff\x06\xda\xfd\xeb\xc5\xde\x1d\x43\x7b\xb9\xd3"
+ "\x50\xc1\xb7\x5e\x7b\xcd\xa0\xf3\xd7\x69\xa1\x38\x65\x54\x2f\xf0"
+ "\x6a\x59\x3e\x9e\x1f\x3e\x49\x78\x70\x32\x83\xf8\x0e\xc2\xdb\x93"
+ "\x94\x0f\xe7\x3f\x02\x96\xde\xa8\x6b\x26\xd3\x9f\x7d\xcc\xfe\x0f"
+ "\xf0\xa6\xe0\x7a\xde\x58\x71\x1f\xf5\xbf\x87\xfa\x3f\xc0\x0f\xd2"
+ "\x18\x1a\xca\xbb\x18\x43\xff\x83\xa8\x33\xc8\xa2\x32\x36\x2a\x93"
+ "\xea\xe8\x7b\x46\xbe\x85\xd5\x51\xde\xfb\x7c\x6c\x52\x2d\xe5\xb9"
+ "\xef\x97\x93\x98\xe8\x7f\x2f\xf5\x3b\x66\x68\x6f\x90\xda\x46\xff"
+ "\xa9\x7d\xbf\xde\x4f\xbd\x7d\xf4\x57\x5f\xb7\x19\xd0\x11\xc6\xf6"
+ "\x1d\x43\xbf\xe5\xb9\xc7\x6f\x56\x7a\xd7\xd1\x3c\x47\x5d\x7b\x8d"
+ "\x94\xb1\x7f\xb3\x40\xef\xff\xc8\x73\xb0\xdf\x14\x4b\xfa\xf9\x1b"
+ "\x92\x7f\xf6\x6a\x31\x5d\x64\x1a\xc6\xef\xa5\x75\xab\xdd\xfd\x3b"
+ "\xa9\xc3\x8c\xbe\x27\x8f\x3e\xe7\x4a\x5b\x9b\x2b\x74\xd4\x2b\x1f"
+ "\xc8\x5b\xb5\x7e\x25\x49\xbe\xb1\xcc\x81\x24\x21\x1b\x67\x67\xd9"
+ "\xd6\xae\xb1\x3d\xb8\x72\xd5\xea\xb5\xeb\xb3\x73\x93\x85\x3a\x63"
+ "\x5d\xf6\x9a\x2c\xa8\xae\x73\x57\xe6\x3a\x62\x47\xc9\x33\x25\x43"
+ "\x7b\x5b\x11\x83\xa6\x10\xf8\xbd\xff\x43\x4d\x6f\xeb\xe7\xce\x54"
+ "\x21\x17\x4b\x1a\xf3\xdb\x9b\x6c\x9b\x52\xf1\xfd\x2d\xb9\x8f\xef"
+ "\x6f\xe6\x3b\xfb\xbe\xe4\x5c\xc4\xd6\x56\x4e\xb3\xfd\x6f\x08\x78"
+ "\xf4\x2d\xd1\xeb\x11\xb2\x2b\x70\xd6\xb1\x09\x7c\xd8\x6f\x57\x70"
+ "\x7c\x1f\x01\x8b\xfd\x65\xd2\x56\x88\xd2\x87\x97\xb0\xb0\xbd\xfd"
+ "\xfe\x0f\xb9\x81\xc6\x4e\xb0\xd4\x64\x86\x4c\xed\xde\xe3\x7f\x76"
+ "\xb0\xfd\x90\xa5\x70\x6e\xd3\x26\x78\x72\x71\x3f\x6b\xff\x2a\x92"
+ "\x39\x32\xb9\x33\x3a\x0e\xf0\x2a\x97\x32\xbd\xc1\xac\x20\x76\x6e"
+ "\x07\xee\x8a\xa6\xe0\x7c\xb7\xce\xa9\xa6\x84\xed\x9b\x7e\x53\x0a"
+ "\xf9\x42\x9c\x73\x08\x9a\xf4\xdb\x6e\x7d\xed\x1a\x70\xff\x66\xeb"
+ "\xd4\x1f\xcb\xf5\xf7\xdb\x53\xc8\x4f\xf3\xff\x63\x39\x3e\x11\x07"
+ "\x9c\x78\x83\xfd\x13\x68\xfc\x5f\xf1\xa2\x25\xda\x99\xe4\xfe\x09"
+ "\x6a\xc2\x22\x47\x70\x1d\xc9\x05\x71\x8b\xbc\xf4\x6d\x40\xdd\xd9"
+ "\xd7\x15\x24\x9e\x4a\x25\x39\x81\x97\x2f\xea\x0b\xee\xec\xf3\xa8"
+ "\x1b\xec\x06\xec\xad\x45\xf9\x04\xdf\xb5\x39\xb1\xfc\x4c\xce\x45"
+ "\xc1\x0d\x76\xe2\xbf\xfa\xba\x39\xa7\xb2\xb1\x7d\x7e\x11\xaf\x78"
+ "\x67\x5f\x8f\xf6\x3e\x84\x77\x95\xf8\x64\xbe\xd3\x47\xef\x3e\x83"
+ "\xca\x23\xf2\x8f\xc8\xeb\x33\xe2\xdd\xac\x08\xbb\xca\x14\x92\x4b"
+ "\x16\x62\xec\xfa\x98\x85\x7c\x06\x1d\x51\x68\x6c\xfb\x99\x9e\x0e"
+ "\xb9\x41\xf2\xf0\xec\x01\x82\xb1\xf4\x65\x11\xca\xb7\xef\x73\x1d"
+ "\x06\x32\x3e\x77\x1f\xd1\xcd\xfd\xcd\x2a\x62\xa3\x6f\xbd\xfc\x1a"
+ "\x6e\xf8\x4d\x1d\x68\xd6\xb2\xa0\xa0\x85\x4c\x9e\x3b\xed\x5f\xa0"
+ "\xc3\x13\xf7\x08\x40\x4b\x69\xde\xec\x19\x5e\x16\x2b\xe9\xc0\xfe"
+ "\xf4\x08\xf9\xb0\x17\x73\xed\x61\xfb\x34\x3f\x5b\xa6\xad\xf2\xfd"
+ "\xb7\xfb\xe4\x5a\xd9\xbf\x4d\xcf\x4b\x69\xd2\xdf\x4f\x89\xef\xd0"
+ "\x86\x00\x9b\xea\xb8\x85\x77\xd1\x1c\xa5\x6b\xf9\x0e\x84\xd7\x94"
+ "\xc4\x37\xfa\x5d\x00\xf9\x1a\xe7\x8f\x78\xae\x1d\xe7\x2e\x6c\x61"
+ "\x0d\xe7\xd8\xaf\xb0\x7f\xda\xa6\x32\xd6\xea\x83\x6c\xf5\x3b\xd3"
+ "\xe1\x1a\x1f\x13\xf3\x1c\xdb\xf7\x65\x1f\xcf\x61\xc4\x53\x8e\x29"
+ "\x4b\xa0\x0c\xe5\x5f\x2c\xe4\x24\x5a\x17\x2a\xad\x0b\x2a\xf3\x15"
+ "\xf0\xba\xb0\x1f\xf2\xcb\xef\xb6\x35\x15\x74\xc3\x57\x3f\xe1\xeb"
+ "\xef\xb6\x01\x86\x58\x07\xe5\x4e\x71\x0f\x52\xec\x93\xae\xf5\xf3"
+ "\x51\xc7\x2f\x13\xfc\xcc\xd8\x4a\x3b\x04\xcd\x8b\xdf\x51\xc8\x26"
+ "\xf5\x50\x7e\x63\x1e\x33\x41\x86\x1d\xb9\x87\x8c\xbd\x7f\xf4\x99"
+ "\xd4\xca\xbe\x9d\x6a\xce\xa0\xf3\x77\x87\x88\xf6\x8f\xeb\x3f\x71"
+ "\xeb\x14\xe2\x6b\x28\x5f\xe5\x54\x9c\x55\xff\xae\xfb\x7c\x79\xf5"
+ "\xbb\xb9\xc0\x95\x79\x56\xda\xd7\x62\xd4\x4a\x71\xe6\x1d\xab\xe6"
+ "\x48\xbd\xe5\xef\xed\x7a\x79\xe8\x3d\x61\x57\x50\x31\xc4\xac\x15"
+ "\x21\x59\xf1\xf7\x69\x72\x8e\x7e\x9f\xa6\xcb\x17\x63\xb5\x93\xb7"
+ "\x97\xab\x45\xb3\x98\xc1\x6d\xf3\xb2\xeb\xfc\x2c\xae\x76\x17\x63"
+ "\x95\x9b\xb8\xff\xe9\x4d\x84\x47\x04\x63\x6e\xf8\x5d\x33\xec\x2f"
+ "\xea\x68\x8f\x2e\x57\x19\x8b\xa2\xbe\x3c\x3d\x40\x6d\x16\xca\x7c"
+ "\x5c\xfa\x55\xb3\x52\x3e\x1f\xfd\x26\x12\x1d\x61\x55\x85\xcc\x54"
+ "\xa5\x32\x63\x65\x21\x9b\x46\x69\xc4\x57\xfc\xfe\xa8\x2e\x0b\x8c"
+ "\x79\x2e\x5c\x4b\xf4\x91\xda\xdd\x52\xc8\x03\xef\x91\x7c\xe7\x54"
+ "\xb9\xff\x1f\x81\xbb\x87\x1d\x98\x2f\xc7\x78\x60\xbe\x2e\x1b\xd0"
+ "\x73\xea\xc8\x3b\xd6\x07\xec\xa3\xcf\x98\xef\x5f\xbb\x36\x2f\x23"
+ "\x37\x1b\x3f\xf6\x59\x8f\x5e\x3d\x9a\x57\x8c\x93\xf1\xa8\x0e\xa4"
+ "\x63\x6d\x81\x7f\x92\x77\x95\x0e\x54\x47\xe8\x7b\xa0\x73\xbe\x15"
+ "\x7c\x1f\x6c\x4d\xe8\x5b\xc3\xbb\xe2\xea\x00\x53\x8e\x9b\x98\x61"
+ "\x74\x7b\x0f\xae\xcc\x5b\xb9\xfa\xc7\xd2\xac\x61\x8c\x76\x9a\x47"
+ "\xb6\xf3\x72\xe8\xfc\x57\x93\xcd\x7d\x82\x3e\x96\x2d\xf2\xf0\xf8"
+ "\x39\xc5\x72\xaf\x7b\x39\x49\xb7\x1d\x1c\xdb\xa7\x8b\x6f\x79\xb0"
+ "\xdc\x00\xdc\x47\x4c\x4f\xc3\xeb\x9b\xda\x0d\x90\x4b\x0a\xe9\x19"
+ "\xb6\x5c\x42\xff\xad\xc5\x8a\x7c\xfb\x6c\x3b\xed\xa5\x2f\xe7\xf3"
+ "\x1d\x3e\xe2\x11\x5f\x76\x8c\x67\xbf\x15\x79\x1f\x5e\x9e\xdd\xbf"
+ "\x5c\x79\x1e\x5b\x2f\x91\x5f\xb7\xd3\x18\x59\xee\x95\x09\x72\xce"
+ "\x5e\x26\xfc\xff\x5d\xbd\x8e\xbf\x7a\x9e\x8a\x29\x7a\x0c\xce\x97"
+ "\xc7\xf5\x83\xcc\x4b\xd4\x6a\x89\xe3\xaf\xdc\x21\xce\xa8\xa7\xb2"
+ "\x5f\x75\xb0\x57\x6e\x33\x5a\x99\x95\x9e\x7f\x4b\xcf\x42\x87\x81"
+ "\x6f\x23\xf0\x68\x7a\x6f\xbd\x91\x28\x0e\x51\x1e\x85\xcb\x7f\xc4"
+ "\xf8\xc9\x7f\x51\xf4\x67\xe0\x8a\xb8\xb5\x12\x45\x33\x38\x31\xda"
+ "\xc8\xcc\x09\x71\xa6\x19\x57\x4c\xb3\xde\x7a\xcb\xc2\x05\x45\x85"
+ "\x05\xf9\x5c\x0d\xf8\xcd\x3c\x22\x6e\x6a\xe9\x1c\xfb\x3d\x57\x17"
+ "\x4b\xfe\xa1\x6c\xce\x98\xfc\x52\x99\x93\x3b\x20\xd3\xaa\x09\xb7"
+ "\xa4\x15\x3d\xca\x0c\xaf\x0e\x79\x0c\x90\xa1\xc0\xc3\xb8\x03\x5f"
+ "\x92\x2c\xfe\xca\x27\xef\x50\x1a\xc1\x2b\x9f\x97\xde\x92\x26\xef"
+ "\x24\xbd\x3a\x49\x2d\xbf\x25\x2d\x5c\xbf\x91\xa1\x7e\x92\xd3\x0d"
+ "\x7b\x0b\xbb\x0d\x6e\xe3\x2d\xcc\x6d\xf3\xb1\x77\xe8\x79\xcc\xb9"
+ "\xa2\x36\xa1\x13\x46\x1d\xb4\x07\x97\x14\x9d\xa3\xbd\x39\x5f\x9c"
+ "\xcf\x18\x4e\xb3\x57\xef\x3c\x38\x4e\x39\x71\xc6\x1a\x3b\xf4\x6f"
+ "\x83\xce\x57\x89\xfe\xdf\x9f\xa4\xc9\x21\x24\x27\xbd\x5a\xa5\xef"
+ "\x07\xf4\xfd\x1e\x79\x4e\xf4\xea\x3e\x3d\xcf\xd8\x7a\x1c\xd8\x3a"
+ "\x73\x17\xf0\x80\x0f\x74\x77\xc3\xf7\xe2\x38\xb8\xb2\x98\x78\x94"
+ "\x47\x40\x9b\xe3\xb7\x58\xa2\x13\xb6\xa4\x3c\xd2\x42\xbc\x51\x7c"
+ "\xef\x25\x2c\xc1\x77\x2f\xfa\x0c\x7b\xfb\xb6\x3d\x24\x73\xe2\x7c"
+ "\xd8\xac\xa4\xac\x32\x6f\x49\x59\x19\x74\x2e\xbc\x11\x3c\x94\x39"
+ "\xff\x4e\xc5\x1c\xb8\x4d\x09\x38\xe7\xdf\x58\x27\x63\x15\xf9\x2a"
+ "\xa7\xf0\x76\x2a\x73\x8c\xca\x78\xe8\xaf\x93\xca\xb5\x74\xb1\x83"
+ "\xab\xe8\xb7\xd9\xac\xf0\x3a\x33\xcd\xe4\xbc\x62\x11\xbb\x15\xfb"
+ "\x73\x0b\x8f\x25\xd9\x6e\x58\xe8\xe0\x26\x84\x75\x70\x07\x4b\x69"
+ "\xde\xa2\x97\x3e\xce\xdf\xa1\xba\x9a\x83\x03\x6a\x73\xed\x69\xd0"
+ "\x43\x21\x57\x1d\x25\x1a\x70\x34\xb9\x8a\x59\x35\x9b\x69\x43\x4b"
+ "\xa0\x19\xfb\x30\x7c\x0e\x34\x51\x9b\x87\xe8\xaf\xd1\xb6\x86\x45"
+ "\x9d\x66\x07\xbf\xd4\x6d\xae\x24\x5f\xf7\x87\x7b\x34\x3d\x80\xeb"
+ "\x3a\x2a\xbf\xf9\x11\xe0\x44\xb7\x21\x40\xf5\x93\xac\xdd\xec\xce"
+ "\x69\x16\x36\x6c\xb8\x93\x80\x3c\xd4\x86\xdd\xed\x6f\x66\x2a\xb7"
+ "\x1a\xe8\xbd\x11\xf7\x0b\x38\xe5\x6d\xcd\x6f\x67\xad\x0e\x3f\xed"
+ "\x9b\x2d\x24\x7b\xda\x93\xa8\x3f\xa2\x3e\xfa\x7e\xf4\x55\x9a\x5f"
+ "\x1b\xc9\x0c\x54\x5f\x1b\x6c\xe2\x70\x77\x9f\xaf\xb3\xcf\xa6\xf2"
+ "\x4d\x7c\xd8\x6a\x40\xfd\xa7\xd9\x6b\x27\x78\x9f\xdd\x3e\xaf\x57"
+ "\xc6\x32\xed\x60\xaf\x1d\xa2\x7e\xae\x89\xe8\xe7\x1d\xd4\x7f\x23"
+ "\xed\x95\x2e\xaa\xf3\x10\x5f\x4f\x6d\x76\x52\x9b\x3e\x2f\xec\x3f"
+ "\x93\xf8\x06\xab\x11\x7d\x6e\x45\x7f\xf3\x83\x8c\x6f\xb0\x1b\x2b"
+ "\xce\x32\x23\xad\x05\x57\x1d\xfd\xd2\xf8\x1b\x88\xaf\x9f\x36\xe8"
+ "\x7c\x2d\xe4\xff\x01\x7c\x24\xbd\x7b\x74\x5c\x2a\xa3\x3c\xd4\xc7"
+ "\x46\xea\xd7\xa1\xf8\x5e\x06\xdd\xc2\x04\xc2\xd3\x09\xd4\xee\x44"
+ "\x9a\xab\x46\x82\xdd\xbb\x04\xeb\x43\x18\x93\x3a\xa0\x76\xab\x54"
+ "\x5f\xc5\x00\xf5\x69\x9d\xd5\x18\xd7\x89\x38\xef\x83\x9c\xe0\x7d"
+ "\x74\x59\xfe\x20\x87\xbd\x38\x6c\xaf\xa9\xcc\x1e\x1a\xab\xd1\xc3"
+ "\xfe\x50\x00\x39\xbf\x8b\xbd\xb6\x4d\xc6\x62\x7d\xad\x44\x3b\x4b"
+ "\x3e\x2a\xf5\xbb\x07\xbf\x04\xec\x31\xae\xb8\x2d\x96\xed\xee\x6e"
+ "\x2f\x8b\xeb\xbc\x84\x78\x96\xd7\x58\x8d\x0a\xfe\xf4\x0f\x25\x7a"
+ "\x3f\xc7\x59\x63\x7e\x37\xd1\x17\x75\x80\x77\x43\x7e\x91\x76\x66"
+ "\x7f\x38\x94\x91\x1f\x95\x4a\xb2\x8a\x81\xfa\x89\x7b\x4c\x53\x88"
+ "\x47\xbb\x15\x76\x88\xd4\x3f\xda\xb3\xff\x70\xec\x7c\x31\x90\x09"
+ "\x3e\xc4\x17\xbc\x4e\x7d\xf8\x83\xd0\xa7\x22\x46\xac\xd4\xb1\xbe"
+ "\x9e\xa8\xfb\xe1\xe0\x03\xbc\x00\x7b\x2f\xb5\x5b\xbc\x6d\xbd\x68"
+ "\x03\x71\x71\xbb\xf3\x6c\xfc\x78\x93\xcd\x3b\xae\xaf\x83\x08\xfb"
+ "\x39\xaf\x16\x6b\x4f\xd8\x12\x8c\xb4\x9f\x7b\xbd\x20\x42\x5f\x03"
+ "\x7b\x82\x62\xd8\x4c\x48\x7f\x49\xaf\x0b\x9b\xc0\x65\xf9\xd2\x2f"
+ "\x8c\xdb\xdf\xab\xc9\x1d\xaf\x7f\x28\xe2\x6f\x81\xa7\x15\x36\x77"
+ "\x3d\x9a\x9d\xdc\xeb\x2b\xd1\x46\xd3\xa8\x18\xdf\xd9\x6b\x56\xde"
+ "\xbf\x3a\x5b\xaa\x30\xe7\x3e\x94\xb7\xf2\x17\x23\x65\x23\xa3\x90"
+ "\xc5\x9d\xaf\x1f\x95\x67\x02\x0d\x71\x11\x32\x82\x31\xa4\xd3\x35"
+ "\xb0\x06\xa9\xd7\x6d\x48\x1e\x4b\xaf\x7b\xe7\x2f\xd6\xac\xcd\x15"
+ "\x6d\x08\x93\xc2\x6c\x79\x2b\x30\x96\xdd\xb3\xf8\xce\xc5\x73\xd7"
+ "\x65\xe7\x89\xa0\x3a\x52\x89\xba\x32\x2b\x2b\x57\x33\x38\x5c\x85"
+ "\x52\xf8\xf2\xe0\x06\x51\xd4\xf1\x70\x9e\x34\x55\x5c\xb7\x7a\xe5"
+ "\xfa\x6c\xad\x8a\xc8\xbe\x4e\x03\xbd\x6c\xaa\x11\xba\xaa\x58\x69"
+ "\x1f\xd1\x70\x28\xe2\x3c\x35\x52\x7f\x73\x19\x7d\x0b\x9d\xff\x3b"
+ "\xae\x04\xae\xbc\xb1\xaa\xb5\x5e\xf8\x32\x31\x1e\x7e\x11\xf0\x7d"
+ "\xe3\x0e\xc4\x81\xa0\xbd\xad\x11\x71\x8b\x35\xdb\x03\xa2\xd7\x6f"
+ "\xcc\x24\x59\xab\x91\xe0\x9b\xbf\x2c\xa8\x72\xa2\xa9\x24\xa7\xbf"
+ "\x99\xa8\xe9\x44\x4c\xaa\xa1\x61\x01\xec\xc6\x6a\x85\xfe\xee\x8d"
+ "\x85\x61\xfd\xdd\x9b\xb0\xe9\x31\xd1\x7c\x77\xa2\x6f\xe8\x27\x7d"
+ "\x5f\x11\x61\xb3\xd3\xe9\x21\x30\xa2\x1e\xd8\x96\x88\x18\x2d\xc4"
+ "\x13\x6b\xfe\x20\x0c\xad\x2f\x62\x1f\xfa\x13\x62\x3a\xf5\xaa\x25"
+ "\xea\x41\xb9\x66\xfe\xb8\x87\xef\x1c\xfa\xbf\xf3\x7c\x2c\x51\xd2"
+ "\x8c\x37\x20\x8b\x5f\x4c\x7d\x6c\xa2\xf4\x74\xa2\x3b\x13\xc0\x1b"
+ "\xc9\x33\xaa\x37\x4e\x6a\xfa\x3c\xc0\x67\x42\x44\x1f\x3c\x61\x9d"
+ "\xdf\x9b\x89\xde\x18\xf5\xe0\x36\x69\x93\x23\xec\x0f\xa4\x0d\xc8"
+ "\x1f\x8d\x21\x1d\x17\xb5\xad\x9d\xb9\x27\x76\x51\x7e\x82\xc5\x41"
+ "\xed\x1c\x1c\x63\x4f\xc3\xb8\xa5\x2d\xe5\x1f\x47\xc8\x3f\x32\x26"
+ "\xc6\xd0\xff\x55\xa5\xbd\x2c\xfa\x9e\x2d\xf8\x28\xe8\x17\x87\x00"
+ "\xef\x3f\x6e\xa4\xef\xb4\xd7\xfd\xd1\xe1\x61\xaf\x87\xfa\x83\x3e"
+ "\xe7\xe5\x13\x33\x40\xe5\xb0\xf7\x51\x9f\x26\x52\x9e\xaa\x70\x9f"
+ "\xff\x28\xce\x46\x21\x53\x4a\x1e\xe4\x4f\x26\xa1\xe7\x2d\x51\x5d"
+ "\x11\xf3\x66\x3c\xcd\xfe\x78\x92\xfa\xea\xda\x2a\x6d\x5f\x26\xe8"
+ "\x36\x25\x54\xd7\x88\xf1\x87\x75\xb0\x0d\x6b\xa4\x0e\xf6\x4f\x2c"
+ "\x3c\x87\x7f\x6c\x02\xde\xc3\x6e\x48\xb7\x19\xc2\x7c\xca\x78\x21"
+ "\x7f\xb2\xeb\xf5\xa8\xb1\x6a\x3d\xe4\xe4\x72\x79\xfe\x4d\xf3\xf2"
+ "\xa7\x55\x51\xca\x71\xc1\x4b\xcd\xf3\xb3\x7a\x4a\x8b\xa6\xb4\x7b"
+ "\x91\x0f\x6d\x0a\x5d\x25\xc1\x06\x63\x51\x49\xc6\x8a\xb2\x46\x2f"
+ "\xa3\xfa\x08\xaf\x0e\x1c\x0d\xe3\xc6\x9f\x52\x05\xbd\xd4\x60\xcd"
+ "\x9d\x0d\x5b\xc3\xb2\xfb\x9f\xf6\x86\xf4\x6e\x54\x4f\x78\xcf\xf8"
+ "\xd3\x87\x80\x71\x45\x48\x07\xd1\x18\x10\xfd\x90\xe7\xa9\xef\x75"
+ "\xb1\xc6\x53\x9c\xf8\x0b\xec\xb5\x90\x0f\x31\xf7\x82\xdf\x13\xfa"
+ "\xb3\xc6\x5f\xd7\xca\x33\x8b\x67\xe9\x79\xbf\x6a\x18\x0b\x77\x1a"
+ "\xa7\x45\xda\xf7\x4a\xf8\x37\x66\xa9\xa8\x93\xc6\x8f\xba\x68\xff"
+ "\x51\x74\xbd\xa6\x56\xef\x3d\x54\xe7\x73\x5d\x1a\xac\xc5\x59\xde"
+ "\x4e\x0d\x0e\x98\x63\x01\xf3\xc6\x3c\xc2\x01\x11\x33\xad\xa8\x9e"
+ "\x9f\x5a\x4b\x75\xc8\xd8\xba\x8d\x55\x1c\xb0\xd5\xf2\x7b\x21\x7f"
+ "\x53\xdf\xe5\x9d\x48\xc2\x45\x92\x4d\xd1\x4f\x75\xa7\xba\x0f\x7d"
+ "\xc7\x39\x5e\x58\xa7\xd2\xf8\x21\xca\x7a\x1f\x93\x65\x2a\xe4\x39"
+ "\x23\xcd\x4d\xa3\xc2\x37\xe4\x30\xed\x7c\x8b\xf0\xfc\x8f\x6d\xc0"
+ "\x7b\xd4\xe3\x13\x32\x73\xa3\x47\x25\xb8\xd0\x9c\x4c\x1e\x74\xbe"
+ "\x19\xa7\xcf\x09\xcd\x47\xf3\x79\xf8\x6d\x9a\x93\x37\x17\xe8\xbe"
+ "\x95\xb0\x37\xd1\x1a\x2e\x96\xbc\xe4\x9b\xe7\xcc\x5b\x6e\xe5\xe6"
+ "\xc0\x8d\x37\x82\x37\xaa\x33\x08\x5d\xa8\x6e\xbf\x3a\x83\xe0\x74"
+ "\x46\xbf\x0b\xa0\x6e\xfd\xf7\x76\xd8\xfe\xba\xfd\xd2\xf6\x17\xe9"
+ "\x77\xfb\xb8\xda\xea\x0b\xe2\x2e\x4c\x3b\xb5\x51\xa3\xcb\x59\xa0"
+ "\x6f\x51\x5b\x14\x82\xdd\x9b\xb8\xff\x78\x48\xa3\x6b\x13\x7b\xd8"
+ "\x9b\x9f\x6b\xf5\x47\xf6\x61\xb9\x3c\x53\x7c\xd3\x2f\x79\xff\x37"
+ "\x41\x7b\xaa\xa4\xbc\xf6\xa6\x57\xef\x37\x7d\x3f\x34\x7a\x8c\x69"
+ "\xb7\xdf\x99\x6d\x5b\x0d\x12\x9d\x72\x43\xbe\xcd\x3e\x2b\x6b\x9e"
+ "\x30\x16\xb7\xfd\xd3\xed\x3f\xb6\xa5\xdd\x3c\x2b\x3f\x27\xf9\x6e"
+ "\xf9\x73\x7b\xda\x52\xfc\x8e\xb2\x1d\xb0\x0d\x3a\xff\x9c\x36\x52"
+ "\x1e\x7c\x47\xeb\xc3\x9f\x73\x3c\xca\x3f\xa5\x0b\x1c\x36\xf9\x2a"
+ "\x79\x49\x47\x1b\xed\xa9\xbd\xe0\x93\x97\x05\xbf\xe6\x7c\x47\x47"
+ "\x1b\x8f\xf1\x55\x7a\xe3\xe7\xd8\xbd\xf1\xb3\xbd\xde\x98\xa1\x82"
+ "\x0a\xa2\x81\xe6\x2d\xdc\x6f\x0e\x4c\x94\xb4\x92\xde\x89\x27\xe9"
+ "\x26\xbe\x07\x73\xc9\xee\xb8\xba\x88\x2f\x0b\x72\x37\xf1\x3f\x04"
+ "\x97\x3f\x37\xeb\xfb\xb8\xd0\x63\x96\xf8\x2a\x97\xe5\xf3\x61\xe0"
+ "\x0e\xf1\x07\xb8\x4f\x5b\x09\x5d\x26\xe5\xa3\xf1\xbf\x9a\x22\x61"
+ "\xf1\x67\xc0\xc0\xa6\xc1\x37\x6d\xd0\xf9\x1f\x34\xff\xcb\x84\xee"
+ "\x59\x75\x5a\xc5\x5e\xa1\x6e\xbd\xe6\xa7\xbc\x6c\xb6\x57\xaf\x93"
+ "\xea\x8a\xd3\xe2\x31\x8b\xfa\x58\x84\x6f\x82\xf3\xfd\xa9\x3b\xfb"
+ "\xf7\x42\x6f\x85\x7b\xc1\xe6\x7c\x05\xf1\xb7\xd2\x43\xba\x3a\xfa"
+ "\x96\xb0\xc5\x02\xfd\x5d\x7a\x82\x4f\x29\x46\x9e\xb0\x4e\x4b\xf5"
+ "\x54\x18\x54\x3f\xf1\x13\x16\xe0\x87\xe0\x55\x85\x3d\xc5\x7f\x34"
+ "\x86\xce\xe7\x46\xcc\xfd\x7f\x08\x7c\x38\xeb\x34\x12\x6e\xff\x39"
+ "\xf5\xca\x44\xc9\x3b\xa9\x4e\x85\x49\x5f\x11\xff\xf1\xb2\x58\x97"
+ "\x1a\x3e\x12\x7c\xbd\x38\x3b\x37\x07\xb8\x17\xf7\x54\xd4\x28\xc2"
+ "\x49\xd6\xc3\xdc\x05\x83\xc5\xb8\xaf\x1e\xc2\x4b\x07\xe1\xa5\x83"
+ "\xf0\x12\x76\x0e\xd4\xbe\x37\xea\x9a\x4c\x5a\xb3\x4a\x0f\xfb\x8f"
+ "\x02\xf4\x1f\xb0\x21\xfe\x3d\x4e\x25\x58\x09\x7b\x56\xc0\x27\x76"
+ "\x30\x09\xf7\x0c\x31\x56\x73\x80\xc6\x1c\x39\x2e\x83\xea\x29\x77"
+ "\xd2\xb8\x0c\x34\xae\xfc\x53\x42\x17\x84\xfb\x9f\x44\x4b\xa6\x84"
+ "\x63\xb8\x1c\xaa\x89\x1c\xa3\x8a\xb8\x4f\x62\x0c\x87\xde\x1a\x6b"
+ "\x8c\xdc\x80\x31\x02\x06\x87\x9e\xd4\xce\x39\x45\x3f\x41\xb7\x7a"
+ "\xd9\xa1\xb4\x84\x2d\xb8\x77\xe9\xab\x24\xbe\xf7\x76\xcc\x61\xad"
+ "\x93\x57\xa2\x9f\x63\xcd\x17\xea\x93\x75\xbd\xb5\xc2\xbc\xa5\x38"
+ "\x73\xd0\xf9\x96\x7d\x6c\x78\xbf\x75\xe7\xf9\xe1\xfd\xd6\x74\x94"
+ "\x47\x3f\x70\x87\xd4\x0c\x07\x63\x84\xdf\xc4\x57\x94\x8c\xd5\x6e"
+ "\xc2\x96\x7a\xf4\x6b\xcc\x6f\x84\xfb\xbd\x15\xb9\x23\xd7\x84\x5a"
+ "\xeb\x67\x80\x1f\xf4\x45\x52\xaf\xff\x56\x5b\xe8\xfc\xa1\xc4\xd7"
+ "\x68\x56\x6c\x51\x58\x63\x82\x27\xa6\xf1\x8e\x55\xaf\x59\xa9\x84"
+ "\x8f\xc2\xdb\x89\x56\x8d\xf9\x9d\xd6\x81\x8d\x6f\xbd\xf6\x4a\xaa"
+ "\xaf\x20\x61\x8b\xc2\xbd\x51\xd7\xc6\x26\xf8\x02\x49\x80\x2b\xf5"
+ "\x35\x9f\xd6\xf8\x09\xb1\x77\x0b\x5d\xc9\xdb\xb4\xfe\x3f\x16\x71"
+ "\x77\xbc\x31\xbe\x02\x69\x17\xf4\x76\x96\x87\xfd\x25\x22\x16\xea"
+ "\xdb\x79\x1e\x65\x4e\x89\x5c\xab\x97\xef\xa2\x3d\x6d\xbe\xea\x34"
+ "\x73\xdb\x26\x33\xa7\xba\xe2\x55\x6e\x37\xd0\xbe\x35\x3f\x8c\x3b"
+ "\xf2\x9e\xaa\x8e\x3b\x54\xbe\x61\x6c\xbc\x78\xfb\xb3\xf3\xe3\xc5"
+ "\xdb\xfb\x35\x3d\x6f\xa6\xb4\xbd\x7d\x3b\xa0\xcb\x1c\x7c\xeb\xe5"
+ "\xbb\x6c\x85\x68\xff\xed\x4a\xd9\x36\xc1\x24\x90\x0a\x3a\xb3\x94"
+ "\xe0\x56\x3c\xe8\x7c\xc7\xae\xd3\x06\xe0\x90\x39\x08\x79\x88\x09"
+ "\x3c\xa7\x6f\x8b\x89\xf6\x68\x67\x84\xc3\x49\xe0\x55\x55\xe7\x9f"
+ "\x8d\xb4\x7f\xed\xc6\xdd\x13\x5f\x8c\x8f\xe6\xe5\x1d\xa2\x7f\xc6"
+ "\x25\x1a\xfd\xf3\x51\x1d\xfe\x2a\xe9\x87\xc2\x24\x62\x06\xd2\x3a"
+ "\x47\x9c\x40\xac\x75\x4a\x4b\xa4\x7e\x23\x66\x20\xc9\x08\xef\xd4"
+ "\xeb\x7b\xbf\xea\x4c\x05\xbc\x85\xce\xd8\x00\x7e\x98\x60\xf7\x8c"
+ "\x41\xdd\x37\x30\xcf\xca\x30\xe6\x81\xad\x53\xf7\xfd\xea\x3a\x66"
+ "\xfc\xc0\x7a\x3f\x73\xdc\xc0\x12\xb7\xfc\x3f\x46\xf6\xf7\x05\xcc"
+ "\x00\x38\x78\xd8\x3b\x07\x25\xec\xde\xf1\xea\xf3\xe3\x61\x6f\xa7"
+ "\x63\x3e\x70\x2e\xb3\x2c\xc0\xfb\xe4\xb9\x94\xcb\x42\x7b\xa0\x55"
+ "\x7e\xff\xf3\x8a\x31\xf6\x87\x3b\x6c\xab\xd6\xd9\xb2\xd6\x6e\x58"
+ "\x33\x73\x66\xec\x18\xb2\x84\x2b\x49\xca\x12\xae\xf4\x48\x59\x82"
+ "\xde\x73\xa8\xbe\x05\xa3\x65\x87\xa5\x19\x9a\x7b\x91\x8c\x14\x16"
+ "\x7e\xbe\x9e\x2d\xbd\x3e\xe2\xf5\x46\xb6\xf4\x86\x1b\x33\x7e\x9a"
+ "\xbd\x32\x6b\x63\x44\xea\x4d\x91\x7a\xc4\x8a\x5d\xd4\x76\xd4\xd4"
+ "\x45\x44\x3f\x94\xbb\x1f\xc3\xbe\xf3\xee\x5d\x85\x01\xfe\x2d\xe1"
+ "\xee\x02\xf8\xf4\x3a\x92\x17\x60\x47\x88\xbe\xf1\xcb\x41\xd7\x27"
+ "\x4a\xbf\xb6\x41\x06\x3d\x9d\x99\xc6\xee\x25\x99\xae\x5f\xde\xbd"
+ "\x78\xf7\x97\xad\xd5\x7e\xa2\x13\x43\xdb\x24\xbf\xf3\x6e\x32\xa5"
+ "\x4f\xa2\xdf\x7b\xe4\x99\xce\xbb\x3f\x23\x79\x39\x55\xf8\x30\x59"
+ "\x0f\x1f\x26\xef\x0a\xdb\xb0\xeb\x7c\xc5\x4c\xfa\xd2\x73\x75\xc2"
+ "\xc7\xbd\x87\xbd\x5b\x05\xfe\x02\x79\xa9\xcc\x5c\xdb\x43\x2c\x05"
+ "\xbf\xe0\x87\xe9\x5b\x32\xdf\x31\xb4\x8d\xef\x4e\x87\x4d\x4d\x12"
+ "\xa5\x3f\x09\xbe\x2d\xca\x6a\x8a\x1b\x74\xbe\x5b\xa9\xf3\x20\xbe"
+ "\x71\xee\x7e\x01\xce\xfa\x3e\x98\x40\xf4\x3b\xc1\x67\xe6\x19\xf0"
+ "\x09\xa4\xb0\x24\xec\x0f\xe6\xfc\x34\x71\xb7\x10\xfb\x22\x68\x42"
+ "\xad\xa0\xa5\xef\x76\xeb\x74\xa1\x5c\xca\xa3\xb1\x28\x4f\xfb\xe7"
+ "\x19\xb9\x7f\xbe\x67\xd2\xd7\x02\x3d\x27\xea\xb8\x3a\xe2\x7e\xd9"
+ "\x9a\xbc\xec\xdc\xec\x2c\xdb\xac\x75\xb1\x2c\x22\x02\x6b\x4e\xf6"
+ "\x1a\x5b\x6e\xf6\x2f\x1f\xcd\x5e\x27\x04\x3d\x7c\x1d\x79\xfe\x46"
+ "\x34\x28\x1c\x0f\x7b\x2a\x60\xfc\xde\x46\xc8\xc2\xe6\x2d\x33\xc5"
+ "\x59\x8a\xe0\x8d\xe2\x6e\xc9\x51\xcb\xe3\x53\xa5\xde\xb2\x87\xe0"
+ "\x7a\x58\xfa\xe3\x2a\x19\xca\x03\x1f\xd7\xc5\x0e\x97\x49\x5b\x99"
+ "\xf7\xde\xd7\x60\x55\x45\xfd\x3c\x14\xe6\xd7\x9a\x84\xdf\x21\x69"
+ "\xb3\xfa\xde\x51\x0f\x73\x35\x84\x79\x90\xa6\x9b\x41\x07\x05\x3d"
+ "\xfc\x01\x5a\xa8\xf1\xce\xd4\xce\xe1\x2d\x7c\x3d\xef\xac\x18\x62"
+ "\x42\x1f\x88\xd8\x08\x92\xbe\x1e\x4e\xd1\xe1\x48\xfc\x4b\x27\xf4"
+ "\x0e\xba\x7c\xb4\x2c\x70\x8e\x17\x6e\x64\x06\xe8\x1e\x88\x86\x94"
+ "\xbc\x92\xeb\x35\x70\xe7\x7b\x36\xe2\x65\xf2\x90\xa7\x56\xb3\xdd"
+ "\xe4\x31\x43\x0e\xaa\x27\x3f\x2c\x77\x34\x2d\x14\x7c\xfc\x10\xf0"
+ "\xe6\xf0\xb4\x0c\xec\x11\x92\x76\x5f\xf4\x43\xfd\xe5\xb1\xf2\x1c"
+ "\x45\xd2\xb7\xc3\x8d\xda\x18\x7a\x41\xb3\x34\xdb\x5f\x83\xc4\xeb"
+ "\xa6\x85\x84\x73\x79\x98\x0b\xa2\xf3\x25\x3a\xbc\x30\x5e\xf4\x1d"
+ "\x7a\x6b\xa2\xc3\x25\xaf\x6e\xf2\x1b\x64\xec\xd2\xf7\x92\xa5\x7c"
+ "\xd4\x64\x8b\x3c\x37\x94\xb2\x50\xd3\xfc\xb0\x9f\x90\xf7\xaa\x46"
+ "\xd3\x88\xb5\x6b\x70\x9d\xec\xe1\x8c\x0d\x2b\x1f\xce\xce\x78\xd4"
+ "\x91\x6c\x7b\x74\x8d\x38\xb6\x15\x6a\x80\xbc\x47\x1f\x78\xd8\x06"
+ "\x2a\x92\xb1\x78\xe9\xd2\x8c\x45\xf7\xfc\xeb\xcf\x62\xd9\xa2\x95"
+ "\x94\x96\xb7\xd6\xb6\x34\x25\x59\x7e\xfa\xe9\x1d\xb7\xff\x5b\xc6"
+ "\xed\xcb\xee\xb9\x7b\xf9\x18\x36\xe9\x71\x84\x13\x0e\x9a\xa3\x09"
+ "\x1d\xec\x83\x52\x69\x83\xd4\xd4\x3c\xd2\x06\xa9\xc9\x43\x7f\x44"
+ "\x9d\xdf\xb7\x32\xf6\x01\xa5\x7e\x50\x4a\x7f\xc5\x12\x6f\x62\x2c"
+ "\xd4\x7f\x5f\x18\x6f\x3e\x10\xe7\x6d\xd0\x1d\x48\xdd\xeb\xfb\x44"
+ "\xff\xde\x5b\x1a\xf9\x2d\x4c\x0b\xde\x0f\x0a\x7a\xa9\xe1\x05\xf0"
+ "\x21\x23\x60\x12\xb8\x21\xf9\x95\xf7\x97\xea\xb8\x51\x21\xcf\x87"
+ "\x18\x74\x66\xf8\x4e\xf8\xbd\x1c\xfa\x65\xc2\x05\x07\xce\xd6\x91"
+ "\xce\xe3\x6f\x59\xae\xd5\xbb\x0d\xfa\x66\xf0\xb3\xda\x99\x58\x42"
+ "\x0f\x7b\xff\x5d\xee\x6c\x5a\x22\x65\xc1\xa6\x8d\x02\x6f\xb6\x4e"
+ "\x5d\x24\xce\x20\xc5\x7d\xa2\xf7\x1b\xc3\xf8\xf3\x41\x29\xe6\x06"
+ "\x74\x41\xd2\xde\xf7\x8f\x8e\xd2\xe3\x44\x51\x5a\xb7\xee\x67\x3e"
+ "\x6f\x26\x33\x18\x67\x56\xb2\x2a\x03\x2f\xf6\xb0\xf7\xab\xa5\x1d"
+ "\xea\x07\x26\x9d\x7f\xa6\xe7\x44\x0f\xe3\xed\xa3\xf5\x5f\xe5\x11"
+ "\xfa\xaf\x42\x07\x3f\xde\xea\xf0\x82\x47\x76\xb9\xbd\xc2\xbf\xe9"
+ "\xad\xad\x0e\x1f\x6c\x4b\x62\xbb\xd8\x07\xf7\x16\x05\xf9\x10\x3d"
+ "\x4f\xa5\xb1\x89\x3d\x64\x9e\xd4\x29\x90\x3c\xf6\x41\x99\x94\x4d"
+ "\x64\x3a\xe0\x4e\xcf\xe8\xa3\x11\xf3\x43\x78\xd9\x4d\x73\xb4\x6c"
+ "\x2c\xba\x97\xb0\xc5\xa0\xf9\x91\xfa\xe0\x38\x64\x54\xc0\xea\x69"
+ "\x83\x9a\xf3\xb4\x93\xfe\xe8\x17\xb4\x2f\xcc\x5f\x72\xbf\x84\xed"
+ "\x07\x9e\xa6\xfc\x5e\xec\x9b\xfe\xf1\x68\x29\xcd\xe7\x31\x7d\x3e"
+ "\x97\x05\xbd\xb7\x62\xbe\x06\x9d\xff\x69\xd5\xe7\xb2\x6f\x76\x45"
+ "\x65\xd4\x16\x66\x3b\x5c\x73\x03\xd2\x69\xfd\x7f\x50\x2d\x6c\x7b"
+ "\xb0\xbe\x46\x95\x25\x3a\x9c\xaa\x95\x4f\xd7\xcb\x8f\xf6\x4f\x2c"
+ "\x2e\xe8\x42\xc9\xf5\x63\x69\xe3\xa3\x85\x93\x1e\x61\xe3\x83\x33"
+ "\xc0\x26\x89\x93\xba\x0e\xce\x22\xc7\xd3\xfc\x13\x75\x27\xc9\xdf"
+ "\x3b\xbf\x7b\x48\xd3\x03\xd0\xda\xfe\xcf\xfe\xeb\x18\x5b\xed\xdb"
+ "\x90\x1e\xd2\xa1\x40\xf7\x01\x9f\x83\xd4\x0f\x4f\x84\x8e\x2c\x64"
+ "\xa3\xe9\x61\xcd\x69\xb0\x19\xc3\x9d\x65\xd4\x83\x75\x25\xf5\x36"
+ "\xcd\x16\x37\x51\x5e\xaa\x6f\x8d\x38\xff\x76\xfe\x67\x8e\xc0\x3d"
+ "\x92\xb5\x85\x9c\x5f\xc0\xbf\xd5\x6c\x98\x04\xef\x22\xef\xe3\x35"
+ "\x2f\x0e\xe9\x82\xc4\xdd\xb4\xff\x14\x76\xd9\x94\xbe\x62\x2c\x7d"
+ "\x21\xd1\x87\x9c\x95\x6b\xb2\xd6\x3e\xf8\xe0\x0f\x93\x86\xc8\x33"
+ "\xae\x4a\xa7\x5a\x42\x75\x92\xfc\xfb\x6a\x8e\xc4\xd3\x66\xa2\xff"
+ "\x2f\xa6\x4a\xfe\xed\xdf\x4f\xd2\xba\x99\xde\xc3\x3e\xb4\xea\xfc"
+ "\xbb\x5c\x47\x1f\x26\x71\x67\x73\x4e\x78\x6d\x34\x7b\xbf\xbf\x36"
+ "\x3e\x34\x8e\xbd\x36\x3e\xb4\xd3\x3e\x7b\x8c\xbe\x27\x51\x9b\xc7"
+ "\x04\xcd\xc7\x7c\x4b\x1e\xdc\x65\x0e\xdc\x2a\x78\xf0\x8c\x8d\x4c"
+ "\x01\xff\x0d\xdd\x34\xf6\x83\x20\xc9\xb5\x41\xa2\x11\x19\x01\x66"
+ "\xc1\x5e\x50\xb1\x06\x7a\xc7\x19\x3c\x30\xc0\x3d\x19\x1b\x89\x5e"
+ "\xd0\x7b\x79\x8f\x3c\x83\xbf\xaf\x9f\xe4\x10\x7a\xae\xe8\x02\xad"
+ "\x50\x11\x0c\x81\xc9\xfd\xfa\xc3\x6a\x9d\xc7\x35\x6f\xb1\x09\x1f"
+ "\xd9\xd8\xb7\x83\xd2\x9e\xe9\x20\xf6\x6e\x6a\xa7\x41\xd0\xa0\xa0"
+ "\x19\x67\x00\xac\xe2\x21\xaa\x17\x76\x41\x6b\xd0\xbf\xa8\x1b\xcd"
+ "\x81\x14\x71\x56\x50\xf7\x90\xb0\x07\xba\x51\xda\x03\xdd\xc8\x6a"
+ "\xd7\x00\x0e\x1f\xfa\xcf\xab\x1b\x8f\x9f\x63\x89\x4c\xcf\x7f\x70"
+ "\x55\x86\x23\x67\x63\x06\x6c\x01\x47\xed\xef\x72\x0d\x39\x3f\x9a"
+ "\x26\xe1\xfb\x51\x5a\x58\x57\x25\x6d\xf8\x40\x33\xe7\xf9\x85\x0f"
+ "\x5b\xed\xac\xe7\xe3\xf9\x80\x7d\xd1\x39\xbc\x9b\x08\xe7\x3e\x9e"
+ "\x8b\xb3\x9f\x3e\xd8\xce\xd4\xa5\xb3\x4a\x27\x77\x41\x87\x46\xe9"
+ "\x97\xe8\x77\xea\xfb\x28\x9d\xd6\x3e\xd2\x62\xc4\x59\x63\x9e\xd0"
+ "\xcd\x11\x9c\x3e\x72\x79\x98\x79\xbe\xd6\xde\xc3\xb0\xcf\x13\x36"
+ "\xe5\x82\xcf\xf8\xe8\x94\xbc\xa3\xf5\x51\xa7\x0e\x4b\xe2\x7d\x17"
+ "\xe0\x5e\x3f\xec\x74\xfa\x38\x6c\x02\x3f\x66\x7a\x79\x0f\xfb\x48"
+ "\xdc\x31\xbd\xdb\x27\x9e\x0f\xdc\xe7\x8b\xbc\x93\xff\x51\xb5\xa4"
+ "\x5b\x1f\xd5\x50\x3a\xd1\xca\x8f\x8a\xa9\xcf\x09\xd2\x47\x80\xa8"
+ "\x67\x89\x6e\x0f\x15\x09\xb7\xdb\x57\x3a\x88\x59\x5e\xf5\xe0\x83"
+ "\xd9\xb9\xeb\xf4\x98\xf2\xf6\xb5\xab\xb3\x6e\xd6\xee\xe0\xaf\xc9"
+ "\xde\x90\xb1\x2a\x4b\xdc\xf1\xa1\x54\xf9\x38\x0a\xbe\xc9\x90\x6f"
+ "\x84\xdd\xbc\x18\x53\xdb\xac\x5a\x8d\x8f\xea\x60\x2d\x0d\xd2\xde"
+ "\xa2\xe5\x11\xb9\xb7\x5d\xf4\x12\xf5\xa3\x4d\xdf\xdb\xa0\x63\xe9"
+ "\x63\x3f\xb2\xe1\xcc\x0c\x7e\x19\x70\x36\x07\x3d\x0b\xe5\xa1\x35"
+ "\xfa\x51\xe8\xce\x74\x19\xa5\xe3\x4c\xd8\xb5\x06\xe7\xc0\x6d\x77"
+ "\xa8\x3b\x7c\xab\x79\xec\x71\x2b\xd1\xb5\x38\xcc\x1d\xce\x8a\x64"
+ "\x0c\x8f\x96\x54\xd0\x6b\xe8\x02\x5d\x6b\x60\x4f\xdb\x62\x21\xfe"
+ "\x84\xf6\xcb\xb6\x25\x24\xeb\xad\xde\xb6\x89\x99\xd0\x06\xed\x85"
+ "\x1e\xa9\x57\x6e\x59\xf1\x6e\x01\x63\xda\x7e\xe8\x29\x13\x7a\xce"
+ "\x16\xbb\xdc\x53\x7d\xc5\x9a\x1e\x85\x64\xab\x96\x6d\x1e\x76\x95"
+ "\x57\xf6\xf9\x78\xaa\xc0\x13\x41\xeb\x5a\xf6\xf1\x9d\xc7\xdb\x84"
+ "\xcd\xf3\xce\xe3\xa9\x2a\xcf\x89\xc2\x3b\xed\x35\xb1\x34\x8f\x6d"
+ "\xbc\xc8\xce\x34\x3b\xe9\xa8\x2e\x76\xe4\x7a\xe8\x81\x09\x3f\x5c"
+ "\x80\x05\xd5\x5f\xaa\xd5\x5f\x4a\xf5\x53\xbb\x37\x6a\xf1\x73\x5b"
+ "\xbc\x7a\x5b\xb4\x5e\xa1\x67\x5a\x8d\x3d\x99\xfa\x9f\x45\x7f\x39"
+ "\x52\xe7\xe4\x27\xd9\x6f\x46\x48\xe7\x24\xf9\xbe\x23\x76\x7d\xbd"
+ "\xa0\x6d\x6d\x0c\x25\xaa\x53\xf8\x6f\x55\xb4\xb6\x4a\xa0\xff\xd0"
+ "\xeb\xe4\x54\x27\x1f\xe8\xad\xa7\xfd\xd3\x44\x74\xc3\x9b\xb0\x85"
+ "\xf6\x49\xb4\x01\xbe\xdd\x37\x83\xd3\x3e\x1a\xcc\x08\x1a\xa5\x0f"
+ "\x8d\x8d\x2c\x3e\x92\x67\xa7\xf6\xaa\xc3\x7c\x26\xd5\x31\x40\xf4"
+ "\xb9\x90\x15\x77\xb2\x23\xaf\xa1\x6d\xd8\x39\x61\x5e\x87\x68\x9e"
+ "\x68\xae\x6c\xd4\xce\x41\x92\x35\xe2\x09\x0e\x9f\x61\xbe\x60\x3b"
+ "\x52\x3b\x24\xe4\x0f\x33\xf5\xcd\xd8\xc1\x8e\xbc\x8b\xb9\x42\x5d"
+ "\x04\x63\x6f\x60\x30\xfd\x9f\xe1\xc3\x0e\xb0\xde\x5c\xc0\xbb\x71"
+ "\x7e\xd9\xc5\xdc\x77\x80\x2f\x27\x59\x45\x3c\x17\x65\x71\x55\xcc"
+ "\xb5\xb0\x9d\x76\xdf\xb1\xb9\x9b\xab\xe7\x9c\x8c\x37\xd3\xfe\x70"
+ "\xce\xc0\x02\x7e\x92\xab\xa9\xdf\x86\xa2\x53\xf0\xb3\x57\x4f\xb4"
+ "\xa6\x04\x36\x2b\xa6\xf2\x4d\xcc\x02\x1f\x85\x45\x0e\xee\x6f\xf5"
+ "\xd5\xb0\x56\x47\x0d\xfb\x28\x50\xc5\x5c\xeb\xa1\xa7\x75\xf7\x7e"
+ "\x9c\x5f\x85\xbb\x2a\x31\xf4\xfc\xb2\xed\xdf\xd0\x56\xeb\xb6\x8f"
+ "\x8f\x7e\x4a\x33\xf7\x29\xb3\xfd\x5c\xbc\x57\xb5\xa4\x7f\x44\xd8"
+ "\xf6\x11\x2b\xea\xe4\x2a\x78\xbc\xc2\x47\xd0\x46\x09\xd5\x55\x0f"
+ "\x7f\x7e\x16\xb5\xcf\x1a\x4b\xe3\x37\x2e\xcb\x67\xe2\x8c\xd4\xb5"
+ "\xe6\xcf\xe8\xe3\x25\xb5\x67\x99\xc9\xb5\xe6\x3d\xf1\x2c\x74\x26"
+ "\x34\x5e\x77\x56\xbb\xb0\xc1\x84\x2f\x43\x77\x7e\x37\xee\x7c\xab"
+ "\x15\xe8\x63\x50\xf6\x9b\xe0\x65\xd4\xcb\xd7\x15\xea\xe5\x5b\x05"
+ "\x2d\xd8\x03\x78\x50\x9f\x8e\x2c\x97\x30\x69\xa1\x54\xd9\x67\x82"
+ "\x4f\x7a\x24\x7c\x5a\xe7\x03\x3e\xb0\x49\x57\xd7\xf7\xd6\x53\xdf"
+ "\x52\x09\x06\xaa\xde\x06\x70\x00\x67\x79\xa8\xbf\xfc\x2c\x8b\x73"
+ "\xad\x81\xcd\xba\xfb\x79\x73\x9a\xd1\xa4\x0e\x9c\x3a\x58\xd1\xcf"
+ "\x8c\x98\x37\xf0\x0e\x15\xe2\xbb\x80\x79\x01\xe6\xcc\x1b\xf3\x5d"
+ "\x3a\xfd\xad\xa0\xbf\x4c\xe0\x1e\xfd\x66\xd1\x7c\x95\x50\x1f\x12"
+ "\x69\xae\xea\xf1\x2b\xf1\xb1\xa3\x12\x3e\x5e\xb1\x3f\x13\xae\x84"
+ "\xd3\x77\x76\x54\x04\x68\xed\xa8\x42\xf6\x74\x27\xaa\x3b\xd4\x6a"
+ "\x69\xbf\xfc\xf1\xf2\x3d\xc4\xeb\xd7\x3c\x25\x7c\x64\xc4\x91\x7c"
+ "\x02\x9d\x03\xdb\x25\xee\xd2\xb5\x59\x75\x3a\xbe\x73\x0a\xfc\x4f"
+ "\xb8\x17\x1b\x84\x2d\xa5\x6f\x9b\x86\xeb\xdb\x28\xcf\x42\x0f\xbb"
+ "\x2e\x47\xae\x89\x16\x71\x07\x10\x74\x60\x3c\x3e\x8b\xf6\xae\x16"
+ "\xd8\xb0\xf2\xcb\xd3\x59\x9c\xc2\xbd\x71\x99\x66\xee\x0e\x34\x01"
+ "\x87\xe2\x04\xee\xcb\x6f\xc4\x1b\x7b\xcd\xb4\xb7\xb5\x51\xba\x51"
+ "\x4f\xc7\x1e\xaa\x92\xbc\x0c\x59\x7d\xd9\x46\x33\x2f\xec\x67\xd3"
+ "\x84\xde\x4b\x4f\xdf\xe8\x35\xb7\xd2\xce\x5f\x48\xb4\x1b\xbe\x75"
+ "\x50\x86\xd2\xa3\x68\xaf\x3c\x44\xed\xba\x28\x7f\xa2\x9e\x9f\xf7"
+ "\xa5\x1b\xdd\xf9\x4d\x62\x9d\xc1\xff\x9a\xd8\x23\x65\xfa\x84\x65"
+ "\xf9\x5e\xb3\x98\x33\x3d\x6d\x5d\xba\xd8\x9b\xe1\x87\x83\x78\x6f"
+ "\x2e\xfa\xd3\x25\xd2\x15\x92\x9d\x91\x6e\x89\x48\x33\xc0\xe7\x09"
+ "\xfc\x69\x46\xa4\x45\x51\x9f\x59\xe8\x9d\xda\xc6\x3e\x8d\x75\xb7"
+ "\x6c\x23\xce\x00\xe5\xfe\x2c\xda\xde\xc8\x99\xf4\xd1\x2b\xd3\x24"
+ "\x1f\xf0\x49\x7d\xa4\xdc\x8e\x73\x17\xb4\xad\xf6\xa5\x1b\x82\x7d"
+ "\xe9\x51\x68\x1f\x75\x41\xe7\x4a\x63\xa4\x76\xbb\x19\xfc\xc3\xf3"
+ "\xb2\x45\x0e\x8e\x7b\x5f\x54\xaf\xe8\x4f\xbe\x9f\xf1\xf8\x45\x63"
+ "\xfb\x3a\x29\x4d\xb6\xbb\x0a\x7f\x4e\x38\xfd\xe9\x3e\xd0\x94\xa0"
+ "\xa9\xbf\xca\xf6\x10\xf6\xe9\x4f\x67\x62\x4e\x83\xb4\xce\x83\x31"
+ "\xfd\x55\xf3\xba\x99\x52\x48\x6b\x47\x9e\x4d\x7e\x7a\x1b\xf8\xc4"
+ "\x22\x95\x73\x7a\x9e\x0f\xdc\x35\xf7\x92\x2c\xb6\xa3\xbf\x5a\xd8"
+ "\xc2\x24\xd8\x6d\x6e\x7f\x37\x6b\x29\xfe\x82\xb5\x04\xdc\xc5\x87"
+ "\xce\x7a\x8d\xd2\x26\xc6\x88\x7a\xef\xc1\xb7\x22\x5a\x2f\x19\xc1"
+ "\xfa\xf1\x65\x5b\x92\x97\x08\x76\x5f\xcb\xbd\xe0\xd3\x7d\xba\x8c"
+ "\x74\xfe\x31\xfc\x45\xf8\x44\x85\xbd\xa8\x5a\x1e\x8d\x38\x91\x45"
+ "\x7c\xd0\xce\xe6\x6d\x82\xae\xfa\xd3\xf6\x04\x1f\x4b\xd5\xea\x3d"
+ "\x23\xeb\xfd\x0b\x3b\x5f\xbd\xc0\xdb\x96\x6a\x69\x87\xa2\x26\x44"
+ "\x5b\x82\x54\x77\x30\x21\x3a\x8d\xf6\x9a\x22\xe2\x5f\x88\x1f\x39"
+ "\x7a\x07\xb5\x63\x69\x0d\xb4\x31\xf8\x55\xae\x55\x69\xbf\x3e\x63"
+ "\x65\x9a\xfd\x4f\xd1\x69\xf6\x97\xeb\x55\x6e\xb7\x90\xec\x06\xfd"
+ "\x6f\x11\xe8\x2c\xf4\xe9\x85\x41\x16\xed\xce\x23\x29\x2b\x3e\xd9"
+ "\x4e\x75\xfc\xe8\x7d\xe8\xda\x89\x56\x05\xb9\xd5\xf0\xd6\x80\x87"
+ "\x55\x10\xfd\x16\xfe\x41\xb7\x5e\xbe\x2b\x61\x0b\xbb\x95\x1b\xcc"
+ "\xc2\x7e\x8c\xf6\x17\x3b\xcd\x6d\xbe\xe8\xcf\x4e\x5f\x55\x84\xad"
+ "\x51\x14\xb5\xf5\x06\x6c\x8d\xb8\xc9\x97\x5e\x83\x3d\x93\xe6\x6c"
+ "\xd0\xf9\x17\xe2\xff\x3f\x11\xfb\x5d\x29\xf8\x22\x41\xe7\x8f\xde"
+ "\xe5\x8d\x57\xe0\xef\x1f\xb1\x52\x15\x75\x7d\xe0\x60\xc5\x77\xcc"
+ "\x28\xe1\x71\x74\x6e\x6b\xef\xa0\x8b\x97\x2a\x5e\xac\x23\xad\x6e"
+ "\x33\xd5\x1d\xe4\x65\x0a\xed\x9d\x47\x97\xca\xb9\x11\xcf\x56\x7c"
+ "\x0f\x0c\xe3\x6e\xe0\x5f\xaa\x6a\x86\xc0\x17\xfd\x25\x95\x78\x5d"
+ "\x57\x5f\x9c\xe2\xfd\x57\x6b\x31\xf1\x00\x47\x33\x3d\xca\xa0\xb0"
+ "\x59\xd5\x7d\x9d\x8e\x77\xae\xc6\x77\x5b\x63\xdd\x54\x09\xf1\xed"
+ "\x89\x3d\xec\xaf\x9f\x0c\x39\x99\x61\x98\xf6\xd6\x21\x92\x7d\xf8"
+ "\xee\xf4\xb8\xf2\xa9\x0c\x7e\x11\xa7\xf6\xb0\xa3\x6f\x04\x0c\x2c"
+ "\x91\xfe\x2c\xde\xcb\x73\x62\xa8\xde\x54\xe8\x74\x8f\x9c\xc5\x39"
+ "\xf3\x67\xd2\x2f\xc7\x2e\x96\xa4\x52\x7d\xd0\x25\x57\x4c\x65\x49"
+ "\xd0\x23\x53\x9a\x3d\x23\x28\xcf\x59\x74\x39\x71\xeb\x54\x96\x3c"
+ "\xb2\xdd\xa3\x35\x92\xcf\xfb\xab\xd8\xe3\x37\x78\xd9\x15\x8e\x5b"
+ "\x78\x07\xd5\x5b\xc9\x9d\x51\x9c\x5f\x6e\x35\x48\x7e\xf0\xb3\x8d"
+ "\xe6\x6a\x89\x77\xe2\x5c\x81\xf0\x0d\xe7\x36\x9a\xbe\x5a\x11\x3e"
+ "\x5e\x63\x87\x92\x70\x37\x4b\xa4\x29\x16\xc0\xd2\x22\xfa\xa1\xf9"
+ "\x65\x0c\x6e\xbd\x26\x13\x75\xa0\x3f\x19\x2b\xa5\xae\x1b\x3e\x1b"
+ "\x09\xae\xc2\x4e\xb8\x74\x17\x8b\x7b\x62\x17\xb3\x1c\x79\x50\x8c"
+ "\x6b\x9f\x5c\x8b\x46\x86\xfe\xaa\x25\x58\x67\x84\x13\xd4\x6f\xb4"
+ "\x07\xdc\x68\x0d\x9c\x71\x15\xe5\x71\xd5\xf5\x10\xfc\x93\x7c\x76"
+ "\xd2\x95\x7b\x80\x2d\xeb\x0c\x48\x3f\x63\x2b\x98\xb7\x8e\xea\xab"
+ "\x9b\xca\x2c\x54\x57\xbf\x7b\x35\x68\xad\xf5\x4a\x57\x6e\x03\xd5"
+ "\xfd\xd7\x18\xec\x47\x65\x04\x1f\xb9\x2f\xfd\xf5\x90\xdb\xdf\xce"
+ "\x10\xe3\xe2\x6e\x07\x0f\xa2\x1e\xca\x73\x9b\x18\xef\x6e\xab\x2d"
+ "\x43\xfa\xd5\x14\x63\x0d\x9d\x21\x68\xe3\x70\x9f\x15\xf5\x2d\x77"
+ "\x67\x12\xcf\xa9\x8d\x49\x87\xb5\xc4\xaf\xbf\x3e\xe9\xca\xdd\xcb"
+ "\x30\x3f\xc8\x4f\xef\xc5\xee\x5e\xca\x7b\x6a\xe4\xbc\x20\x0f\x7d"
+ "\x7b\x8d\xea\xfd\x3f\xe1\xb3\x31\x9c\xd9\x84\xf3\xd4\xd0\x78\x08"
+ "\x56\xbe\xdd\x04\x23\xa9\x33\xfc\xeb\x74\xf4\x95\xe6\x6e\x9a\x3b"
+ "\xef\x8b\xb1\xef\x44\xd2\xda\x27\xbc\xdf\xd2\x2a\xf4\x65\x7f\x8b"
+ "\xbf\x3b\xa0\x72\x49\xcf\xfe\xe6\x52\x89\x0e\x78\xe8\x17\xb4\x40"
+ "\xd0\x93\xeb\x70\x9e\xfd\xb7\x77\xcd\x8a\x9c\x5f\x8c\x05\x3c\xd3"
+ "\x58\x73\x1c\x71\x56\x61\x41\x5f\xf5\x39\xe6\x71\xc9\x76\x15\x67"
+ "\x50\xb0\xed\x1d\xb6\x32\x89\x7f\xbc\x92\xea\x7d\x4d\xe3\x21\xdb"
+ "\xb5\xfd\xb4\xbd\x2f\xa6\xbf\x9e\x3f\x66\x65\xba\x1d\x22\xad\xdf"
+ "\x9a\x0c\x69\x3b\x6a\x05\x8d\xaa\x33\xc8\xb5\x83\x3e\x6a\x65\x8f"
+ "\xca\xb3\xf1\xbf\x15\x53\xf9\xa3\x63\x8e\x37\x6a\x2a\xfc\x4f\x15"
+ "\xc1\x87\xa8\xb8\xab\x44\xb4\x8a\xf6\x83\x68\xb7\x6f\x88\xc9\xf3"
+ "\xfa\xf6\x9b\x89\xc7\x8f\xc6\x3d\x55\xbd\x6f\x17\x76\xae\xd0\xae"
+ "\xdd\x97\x6b\x5f\xa2\xcb\xd0\x3c\x8e\x60\xec\x34\x8b\x78\x07\xc4"
+ "\x77\xa9\xbe\xf8\xe4\x14\x6f\xfc\x2d\x99\x72\xdd\xb4\x3b\x78\xbc"
+ "\xa4\xb7\x19\x7e\x56\x8c\x71\x69\x7a\x89\x68\x8c\x99\xea\xa9\xd4"
+ "\xcf\xb7\xf5\xba\xc7\x8d\x21\xa2\x8f\x8d\xc6\x24\xfd\x1b\x24\xdb"
+ "\xc5\xd8\xe0\xa3\x47\x8c\xed\x73\x71\x07\xf0\x02\xc7\xd3\x2e\xe9"
+ "\x5b\x72\x8a\x6b\x2a\xea\xf8\xe2\xd7\xe8\x1f\xe6\x84\xe8\xc3\xa5"
+ "\x3d\xec\xf3\x4c\x1e\xfb\x44\xec\x85\xd5\xf9\x79\xb2\xac\xf3\x96"
+ "\xcc\x67\x88\x06\xcb\x3b\x8b\xb0\xd9\xf9\xa2\x8c\x97\xdd\x92\x09"
+ "\x19\xa6\x8f\xda\x23\xfc\x88\xa0\x43\x5f\x58\x30\x57\xd7\x1d\x60"
+ "\xa9\x12\x0f\xbf\x98\x00\x79\x57\xc6\x78\xfa\xbc\x81\xf0\x5e\xfa"
+ "\x97\x0b\xd9\xac\x2a\x62\x1f\x8b\xa4\xb1\x17\xd8\x47\x29\xd3\x24"
+ "\xcc\x22\xf9\xf1\xf3\xbd\xc2\x2e\x89\xfa\xbb\x21\xa0\xd3\xbf\xcf"
+ "\xf7\x72\xe8\xbb\x0b\x35\xbd\x27\x68\x59\xa1\xf4\x11\x38\xe8\xfc"
+ "\x62\x71\x48\xef\x89\x3b\xdd\x4e\xde\x8c\x7c\x34\xf7\x67\x90\x47"
+ "\xfa\x20\xeb\xd1\xee\x3b\x7f\xf1\x33\xed\x2e\xb3\x1d\xb6\x5a\x54"
+ "\x96\xe8\x1d\x17\xfa\x56\xc0\x00\x6d\x8b\xbe\x1b\xa0\xe3\xfc\xa2"
+ "\x26\xac\x67\xfe\x5c\xc4\x86\x90\xfe\x08\xbe\x68\xd0\x71\x84\xc6"
+ "\x1b\x2d\xe3\x7a\x7c\x3e\xfd\x30\x41\x19\x38\xd0\xc7\xad\xb1\x57"
+ "\xd5\x00\x27\xbf\x38\x16\x09\xa7\x65\x01\xb5\x48\xd2\xa0\xcf\x9b"
+ "\xb8\x58\xeb\x9f\x37\xfd\x30\x3f\xf1\x5f\xd7\xeb\xbc\x88\x84\xb3"
+ "\x85\xe8\xcb\x97\x01\x01\xeb\x92\x8e\x14\xf8\xdd\x7d\xac\x10\x7e"
+ "\xc4\xff\xeb\x3b\xf8\x6b\x0f\x94\x74\xa4\x05\x8b\xac\xf0\x4f\xcb"
+ "\xd4\x92\x8e\xcc\x2e\x07\x33\x64\xd0\x1f\xfc\x9e\x43\xc6\x23\x99"
+ "\xd5\xc2\x63\x89\x3f\xa1\x75\xbe\x79\x15\x33\xdf\x9b\x03\x1d\x83"
+ "\x3d\x11\xfe\xd4\xe1\x4b\x1d\xb1\x10\x82\x45\xf6\xc9\xf4\x3c\x85"
+ "\xf8\x39\x0b\x37\x75\xa4\xe2\x7c\x3e\xe8\xe4\x44\x8f\x8f\xc1\xa7"
+ "\xbb\xc1\xed\xf5\xb3\xcd\xa7\x98\x09\xfe\xda\x03\x65\x4a\x7b\xab"
+ "\xef\x4b\x21\xdf\x24\x38\x58\x22\xf1\x1f\xb8\x03\x60\x55\xe3\x15"
+ "\x17\xed\xf1\x4d\x72\xdc\x67\xb8\x1c\xb7\xec\x37\xfa\x2f\x68\x5c"
+ "\x49\x67\x66\xa1\xe8\xfb\x97\xcf\x04\xa8\x7e\xb5\xe4\xe4\x8a\x60"
+ "\xc9\xc9\x74\x79\xa7\xbe\x85\x15\xe6\xf1\x6e\xb7\xaf\x85\x64\xae"
+ "\x7e\x11\xbb\x0e\xe7\xff\x18\x23\xc6\x87\xb6\x3f\x3e\x7b\x4a\xf0"
+ "\x5a\x01\x7a\x2f\x5a\xad\x95\xe9\xa5\x32\xbd\x2d\x6c\xa8\xe4\xa4"
+ "\x18\x7b\xab\x4f\x96\xcd\x10\xcf\x54\x3e\x12\x0e\xda\x98\x43\x70"
+ "\xa0\xb1\x63\x7c\x18\x7f\x00\x30\x21\x18\x68\x63\xb5\x0e\x6b\xe3"
+ "\xc4\x18\x3f\xa2\x5d\x67\x17\x8d\x93\xc6\x2a\xc6\x39\x4c\xe3\x6c"
+ "\xce\x61\xcc\x5f\x9e\x9c\x7a\x2e\xf6\x64\x3a\x64\xd4\xa2\x4f\x88"
+ "\x87\x2f\xa8\x64\x24\x8b\x1a\x5f\x2e\xac\x34\xec\x24\xde\xa4\xd0"
+ "\x4b\x32\xa9\x97\x77\xc3\x86\xd7\xed\xa0\xbf\x40\x0d\x03\x8f\xa3"
+ "\xf3\xeb\xd4\xb6\xf5\x63\xf5\x04\x2b\xec\xe6\xdd\xc4\x9b\xfa\xdd"
+ "\x01\xca\x93\x43\xe3\x27\x19\xb6\x4b\xeb\x3f\xf2\x6e\xfe\x4e\x8e"
+ "\xcb\xbc\x9a\x25\xbe\xf3\xf3\x12\x83\xbb\xbd\x84\xe9\x63\xb9\x8f"
+ "\xf2\xd1\x78\xac\x54\x57\x3c\xc6\xa3\xd2\x38\x77\x53\x3f\xfd\x11"
+ "\x63\x3a\xd2\x0b\x3b\xe2\xcf\x58\x6c\x1a\x53\x76\x9d\xa6\x71\x9c"
+ "\x66\xd6\xca\x42\xe2\xbf\x7e\x0a\x7e\xf1\xd8\x91\x8b\xd2\x59\x92"
+ "\x87\xfd\xd7\x51\x49\xe3\x85\x2f\xe8\x4b\x7a\xd8\x97\xfd\x21\x7f"
+ "\xcf\xf0\xa1\x1f\xaf\x1c\x03\x1e\x09\xbf\xcf\xd8\x33\x06\x09\x67"
+ "\x70\x4e\xbf\x81\xda\x18\xb4\x4f\x11\xfd\x71\xce\x87\x9d\x70\x1c"
+ "\xbd\x23\x76\x14\xee\xab\x2a\x54\xae\x9d\x13\xcc\x50\x3f\xf1\x73"
+ "\x4d\xf8\x05\x0c\xc7\xb4\xb9\x7d\x85\x2d\xa0\x36\xaa\x20\x7f\x1f"
+ "\x2c\xf4\x1a\x1e\x7f\x85\x25\x5f\x18\x4d\xf9\x2a\x69\x3c\xfa\x0d"
+ "\xfd\x2c\xea\xa3\xb1\x4d\xee\x61\x5f\xc7\x8c\x5c\x63\x36\x41\xcb"
+ "\x24\x1d\xfc\xaa\x0d\xfa\xcf\x0b\x6c\x57\xf0\x70\xb0\xb1\xb8\xc0"
+ "\x72\x47\xf5\x7e\xd0\xf3\xb8\xf7\x2d\x2e\x1c\x0e\x5f\x27\x8f\x57"
+ "\x57\xd9\xb3\xc2\x46\xb2\xa8\xfc\x59\xa2\x17\xc4\x2b\x1c\xb6\xe2"
+ "\x2c\x85\xf6\xce\xbd\x3e\xb6\x6e\x0f\x43\xfc\x99\x78\x77\xe0\x2e"
+ "\x76\xb8\x26\x85\xd5\x9e\x85\xcf\x38\xfb\xe4\xa7\xcf\xd2\x5c\x6a"
+ "\x34\x04\x3c\x29\xf4\xc8\x7c\x9d\xdd\x52\xf1\xac\xce\xc3\x7f\xdd"
+ "\x5f\xd0\xcf\x0c\xb6\x35\xe2\xd9\xb7\xd8\xc6\x03\x55\x06\x35\xa7"
+ "\x06\x7e\xcc\x13\x66\x3b\xe0\xc7\x5c\xf7\x0d\x2e\x78\x9f\x7c\x5a"
+ "\x73\x7d\xd6\xd8\xb2\x5c\x96\x8c\x78\x06\x66\xaf\xe4\xe5\xe4\x7e"
+ "\xed\x49\xa2\xfe\x59\x34\x7f\xe1\x16\xe9\x2f\xfc\xab\xd5\xb0\x39"
+ "\xd7\xbe\xdf\x13\x24\x19\x46\xd4\x9b\xcb\x92\x6a\xce\x32\x3b\xf8"
+ "\xa0\x8c\x13\x92\x67\x83\x5c\x78\x57\xaf\x99\x07\xff\x6e\x67\x7b"
+ "\x7a\xc2\xf1\x0e\xbc\xeb\x10\x23\x81\x5b\xc7\xb3\x9f\xae\x98\x22"
+ "\xec\x09\x84\xaf\x5d\x9c\x33\xd0\x3b\xab\x7a\x8a\x19\x0f\xc3\x36"
+ "\xb1\x5e\xde\xc3\x3b\x1c\x90\xf6\xbe\x83\x4e\x4f\x93\xee\x07\x7e"
+ "\xdc\xf3\xf2\x52\x29\xef\xa8\xd1\x24\x7f\x79\x07\x5d\xd2\x07\xe9"
+ "\xf1\x38\xf7\x36\x35\x42\xc6\xf1\x9c\xc2\x37\xa4\xc1\xaf\x5b\xaa"
+ "\x80\xe5\xf1\xf9\x90\x7b\x34\x99\xf1\x1d\x5b\x28\x4d\xf2\x30\xc2"
+ "\xe6\xda\x2a\xcf\xff\x68\x6f\x4a\x18\x74\x1e\x4f\xd3\xf7\x33\xec"
+ "\xeb\xd2\xd7\xeb\xf1\x2c\x8f\x72\xae\xfa\x3c\xfd\xb3\x68\x36\xe2"
+ "\x38\xbb\x49\xa5\xfc\x55\xfa\xfe\x26\xce\x70\xb7\x4e\x5d\xb4\x6e"
+ "\x23\x9b\xf6\xaf\x97\x99\x18\xce\xff\x28\x6f\xb7\xdc\x77\x8f\x1f"
+ "\x0a\x9f\x11\xa4\x0a\x78\xc3\x47\x81\x90\x31\xe0\xfb\x53\xc6\x34"
+ "\xe8\xd5\x7d\x80\xca\xfd\xf7\xf8\xe7\x11\xed\x04\x42\xfb\x28\xb5"
+ "\x01\x1b\x74\xd4\x2f\x79\x93\xe3\x07\xc5\x5d\x4a\xca\x27\xf7\xd7"
+ "\xe3\xe3\xca\x6d\xf0\x43\x05\xf8\xaa\x9a\x3c\xe9\xee\xfd\x56\xc2"
+ "\x37\x9f\x45\xcd\xab\x62\xd6\x77\x0a\x3d\xc6\x04\xe9\xa3\xdb\xdc"
+ "\xc1\x3a\xee\xc2\x77\xe0\xba\xeb\x3a\xe8\x03\x3b\xf6\xbb\xb1\x6f"
+ "\x0f\xa7\xc7\xdd\x0d\x59\x5f\xf0\xe2\x1d\xd5\x73\xa9\x1c\xa5\x4d"
+ "\x7e\xfb\xb4\xdf\x58\xb1\x89\x25\x4b\x5f\xaa\x1d\xc2\x47\x17\xee"
+ "\xac\x5f\x95\xc8\xac\x57\x55\x31\xfb\xa0\xb3\xc3\x45\xf2\xa5\xd0"
+ "\x77\x8b\xf6\xcb\x17\x55\x22\x9e\xc3\xab\x43\x9e\x09\x72\xae\xbe"
+ "\xb9\x97\xde\xed\xe1\xf7\x8e\x73\xda\xf9\x10\xf1\x39\xdf\xac\xa8"
+ "\x3b\x2d\x6d\xe9\x85\x7e\xa9\x74\x8e\x25\x6c\x7f\xf0\xcd\xbd\xb2"
+ "\x2f\xdf\xdc\x7b\xd8\xc1\xa0\x3b\x3f\x5a\x2b\x7c\xb3\x7f\x43\x3c"
+ "\xca\x71\x87\xa6\x8f\x69\x13\x78\x05\x7e\x77\x3b\x64\xb0\x6f\x5d"
+ "\x65\x94\x0f\xfb\x04\xf1\x47\xa9\x82\x87\x27\x5e\x57\x25\xfc\x89"
+ "\x18\xff\x87\xd0\x37\x8e\x49\x13\x77\x31\x26\xca\x94\xcd\xce\x14"
+ "\xf6\x2c\x65\x8b\xba\xe9\xd7\xc4\xcb\x68\x6d\xef\x82\x8f\xa3\x39"
+ "\x36\xfa\xb5\xd0\xaf\x95\x7e\x13\xe9\x7b\x1b\xf0\x92\x64\x58\x2b"
+ "\x62\x54\xf6\xc5\xcf\x4e\x1f\xef\x5e\x14\x60\xe3\xde\xf6\x6f\x4c"
+ "\xda\xec\x75\xa6\x22\x3e\xe1\xb2\x3d\x8c\xad\x0b\xf0\x21\xdb\x15"
+ "\x88\x31\xd2\x99\x5a\xb4\x07\x67\xe9\x9d\x89\x23\xcf\xd2\x3b\xe7"
+ "\xd3\x1f\xbd\x75\x36\xd3\x9f\x9f\xfe\x52\xc3\x7f\x27\xe6\x0f\x3a"
+ "\x3b\x53\x09\x8e\x82\xc7\xba\x30\x9a\x88\xf2\x34\x0f\x90\x8b\xe2"
+ "\xa3\x99\x1c\xef\x2d\xa9\xf4\x6e\xe2\xf1\x8b\x8a\xb5\xf1\xa6\xd0"
+ "\xbb\xc5\x56\x44\xfb\x5a\x3c\xc1\x64\x2a\x8d\x39\x7e\x51\x37\xc6"
+ "\x8b\xfe\xf6\xc5\xd3\xbe\x16\x71\x27\x0c\x75\x62\xfc\xde\x78\x2a"
+ "\x47\xb0\xe4\xb3\x2b\x2a\x75\x78\x6a\x70\xc2\x7d\x19\x43\x1f\xd5"
+ "\x21\xf9\x20\xca\x4f\x75\xe8\xf9\x43\xb0\x9f\x0a\xff\x04\x34\xa7"
+ "\x94\x8f\x64\x62\x93\x7e\xdf\x6c\xd0\x79\x22\xf9\xdd\xd5\x4c\xf3"
+ "\xe7\xd1\x99\xea\x8b\x28\x0b\x9f\x0a\x63\x95\xa7\x36\x4d\xb2\x4d"
+ "\x3b\xc9\xdd\x9d\xb7\xc9\x76\x4f\xd8\xc6\x5b\x4b\x85\x33\x89\xbf"
+ "\x23\xae\x77\x9e\x94\xfb\x16\xba\xa7\xf9\x98\xbb\x46\xa5\x3d\x7f"
+ "\x4e\x6a\x6a\x21\x77\x75\xb1\x13\xc7\x5b\xfd\xdd\x17\xb8\x1f\x9e"
+ "\x10\xfe\x42\xf8\x50\x31\x73\x17\xdc\x20\xce\xb3\x4e\xb3\x6f\x27"
+ "\xb9\xbd\xe2\xce\x39\x3d\x77\x05\xf1\x1d\x67\xe8\xd8\x1b\x48\xc6"
+ "\x0e\xc5\xc9\x50\x29\x6f\x2d\xd2\x29\x0d\x3e\x49\xea\x22\xbe\xf1"
+ "\xf2\xd9\xda\x39\x4d\xd7\x87\xe0\x2d\x44\x7f\x03\xff\xec\x42\x9f"
+ "\xd5\xd2\xd9\x56\x8c\xa1\x88\xe4\x3f\xc4\x06\xc5\x9a\xb0\xad\x87"
+ "\xae\xb0\xeb\xd7\x84\x77\x5c\x2d\x9b\x6d\xbd\xb0\x31\x74\x89\xbb"
+ "\x92\x45\x01\x7e\xda\x1b\x3f\xdb\x0a\x9e\xa4\xa2\x70\x82\xe9\xf6"
+ "\x1a\xee\xea\x4b\x98\x43\xb4\xac\xab\xf9\xdd\x7c\x39\x37\x17\x58"
+ "\x6f\xb3\x3e\xf6\x5a\x6d\xec\x94\x26\xce\xa8\xe6\x55\xcb\xf8\x21"
+ "\x1e\xf6\x2d\x1b\x57\x67\x45\xf3\x0c\x7e\x80\xf6\x86\x73\x12\x16"
+ "\xdf\xa6\x85\xf6\x86\x0b\xea\xc7\xb7\xe3\xfa\xf2\x8f\x68\x63\x58"
+ "\x6b\xa3\xe1\xbf\xd9\x46\xc3\xf9\xda\x90\xe7\xe7\xdd\xa9\x17\x2e"
+ "\x3b\x76\x0b\xbf\x3a\x44\x3f\x53\x24\xcd\x3c\xf9\x5a\x90\xe4\xb7"
+ "\x40\xdc\x2d\xa9\xe0\x6d\x60\x2b\x8b\x58\x2a\x81\xd2\x68\x76\x24"
+ "\x7f\x88\xb9\xd6\x7f\xca\x3a\x59\xb7\xf0\xdf\x77\x24\x0f\x32\xdb"
+ "\xa2\xe2\xe1\xf2\x39\x95\xc3\x86\x6f\x2b\x01\xef\x3d\x34\x0f\xbb"
+ "\x23\xf0\xac\xd5\xf7\x29\x73\x67\x42\xbf\xda\x06\xbd\x76\x31\x8f"
+ "\xbf\x25\x55\x25\xda\x40\x3c\x7a\x50\xc0\x83\xf8\x17\x21\x6f\x91"
+ "\xcc\x26\xe4\x2d\xaf\xf0\x99\x1c\x2f\x62\xa4\x38\x5f\xc9\x83\xee"
+ "\x3b\x38\x9c\x6e\x1b\x74\xb2\x34\xc4\x4e\x81\xde\x99\x9b\x7c\x8e"
+ "\x65\x81\x28\x2e\xe4\x29\xe2\xfd\x11\x3b\xc5\xed\xf3\xb0\x20\xf1"
+ "\xd1\x35\x03\x2c\xb1\x86\x78\x4f\xa2\xd9\x16\xd0\xf5\x3a\x2d\x7e"
+ "\x4a\xd9\x40\x38\x7e\x4a\x2d\x74\x3d\xed\xf4\x3c\xc0\x8c\xc1\xb2"
+ "\x64\xfb\xee\x01\x96\xb4\x67\x3d\xb3\xef\x86\x2e\xef\xa4\xe4\x7d"
+ "\x84\x6d\x3b\x62\xa9\xac\xb5\xe3\x2c\x21\xcc\xfb\xc0\x47\x42\x98"
+ "\x6e\x19\x85\x0e\xe4\x82\xe0\x7d\x52\xec\x83\x81\xd2\xd9\x99\x81"
+ "\xb8\x45\xdd\xc3\xe5\x76\x0b\xcd\xc1\x41\x82\x5f\xf2\x58\x73\xab"
+ "\xdb\xc8\x54\x45\xc4\xbf\x79\x37\x49\xd2\x77\xaa\xcb\x37\x1e\x4e"
+ "\x04\x77\xa7\xb3\x79\xbd\x2c\x45\x9e\xdb\xc7\xd0\x9e\xd8\x93\x0e"
+ "\x9b\xc6\xc2\x47\x98\x35\xb8\x7b\x85\x52\xf4\x02\x8b\x72\x07\x52"
+ "\x19\xfe\x0a\xbf\xe3\xdd\xf3\x56\xb3\x14\x9c\x3f\xe0\xac\xc4\xf6"
+ "\x98\xc8\x7f\x75\x52\x01\x4b\x89\xac\xfb\x91\x8d\xb9\xab\xae\x4f"
+ "\xf9\x45\xb6\xed\xc1\x55\xb9\x8f\x6c\x58\x99\x9b\xcd\x96\x48\x53"
+ "\x10\xe1\x8e\x7e\x23\xec\x40\x36\xac\xca\xcb\xb1\x3d\xf0\x68\x6e"
+ "\x6e\xf6\x9a\x3c\xdb\x5d\xb7\xa7\x7d\xdf\x27\xe9\x6e\xeb\x5e\x9c"
+ "\xf5\x48\xbb\xc0\xde\x18\xfe\xdc\xb5\x03\xe5\x88\xaf\xb5\xe5\x8e"
+ "\xe5\xe6\xc0\x12\x9b\x8c\x73\xd4\xbb\x02\xb6\xb8\xbc\x28\xbd\x5a"
+ "\xf2\xa9\xbd\xf7\x4a\x79\x6a\xd8\x2e\xef\xd1\xf5\x4a\x3f\x80\x7d"
+ "\x4b\xa6\xc9\x35\xf5\xf7\x9b\xa3\x1c\x0c\xcf\x8f\xe0\xd9\xec\x60"
+ "\x25\xae\xa9\x38\x0f\xff\xbb\xf0\xd1\xc8\x77\x2f\x55\xf4\x7c\x7a"
+ "\x1e\xed\xbb\xf0\x3b\x5d\x0b\xbf\xba\xce\x9e\x2c\x82\xcf\xe4\x41"
+ "\xe7\xdf\x97\x7b\x0c\x9e\x66\x8d\x47\xe8\x96\x36\x88\xbd\x2b\xe0"
+ "\xa3\x93\x3f\x77\xf9\x80\x56\x4f\x29\xb5\x77\x11\xe5\x2d\xf6\xb0"
+ "\x1e\x93\x66\xab\x38\xa3\x43\xeb\x97\xb4\xa9\xe8\x59\x2f\x6d\x2a"
+ "\xfe\xbe\x37\xe2\x2e\xbc\xf0\x35\x81\xbd\x51\xe3\x49\x07\xb5\xfa"
+ "\x9a\x75\x9a\x40\xf9\x8f\x12\x5f\x57\x7d\xe1\xb4\xf0\xef\x52\xfe"
+ "\x19\xe1\x7b\xa9\xf7\x8e\x91\x3e\x4d\x74\xb8\x59\x7f\x23\x75\xf1"
+ "\x12\xae\x34\x86\x43\x12\x4e\x22\x7d\x5a\x0f\xbd\xa3\x9c\x87\xf5"
+ "\x4e\x1b\x8d\x5f\xa1\x19\xbf\x73\xcd\x03\x6b\x1f\x71\xac\xcc\x5b"
+ "\x75\xff\xaa\xd5\xab\xf2\x36\x8a\x2b\xfb\xc9\xe2\xbf\x7f\x9a\x95"
+ "\xb5\x7c\xb4\xff\x79\x3b\x74\x32\x9a\xdf\x6a\x1f\x6c\x20\xa4\x5e"
+ "\xac\xf7\xbb\x80\x93\xdd\x7a\x61\xe3\xec\x15\x7d\xad\x11\x7e\x3c"
+ "\x4e\x31\x8f\xe2\xdf\xa7\x9d\x8f\xf4\x6a\x73\x25\xbe\xf7\xc5\x2d"
+ "\x6a\xb3\x4d\x65\x0b\x3b\x98\xb7\x01\xe7\x62\x04\x6f\x1b\xf6\xcf"
+ "\xb2\x4d\xd8\xe7\xda\xd8\x91\x00\xed\xa5\xe2\xac\xfc\x74\x3c\x60"
+ "\x06\x1e\x92\x60\xb4\xb7\x83\x9d\x7a\x54\xc0\xe2\x8c\x75\xaf\xf0"
+ "\xcd\x71\xc6\xfa\x1b\xe0\x22\xfa\xac\xf2\xf4\xdd\x9c\xa7\xef\x52"
+ "\xcf\xe4\xec\xe6\x67\x72\x76\x85\x7d\x5f\x9e\xf2\x50\xd9\x03\x54"
+ "\xf6\x04\x62\x5b\x95\x9f\x66\x07\x40\x27\xf1\x6e\xce\xb3\x90\x6c"
+ "\x38\xc7\x8a\xfe\xb8\xbd\x29\x4c\xde\xd7\x3f\xe5\x71\xfb\x6e\x60"
+ "\xc4\x7b\xda\xc4\xfd\x50\x71\xbe\x47\xfc\x21\x95\x73\x53\xbf\xdc"
+ "\xde\x21\xc8\xd0\x56\x95\x78\x44\x0f\x3b\x65\xa1\xfd\x36\x1d\xf5"
+ "\x62\xcc\x7b\x08\x27\x61\xa7\x41\x63\x27\x3e\xa6\xa7\x46\xbb\x1b"
+ "\xdc\x59\x46\xe9\x80\xc1\xc8\xf9\x3f\x3d\x13\xf3\x48\x30\xfe\x3f"
+ "\x61\x1c\x38\x2d\x7c\x44\x2d\xed\xe4\x5f\xf3\x92\x8e\x62\x39\xdf"
+ "\xa7\xef\xd4\xd2\xce\x84\xfd\x05\x9c\xbe\x97\xde\x87\xe9\x4f\xe5"
+ "\x25\xdf\xd4\x47\x9c\x4d\xe3\x9b\xf0\xe9\x05\xbb\x13\xc7\x26\x76"
+ "\x05\x95\x7f\x52\xe2\xde\x37\x75\xde\xa2\x9c\x28\x2a\x13\xc4\xfd"
+ "\x56\x0d\xbe\xaf\xb9\xb7\x9d\xd6\x6d\x3d\xa8\x4f\x67\x7e\xe2\x7a"
+ "\x30\xc0\x44\xfc\xfa\xce\x80\xb0\x87\xd4\x7c\x44\x28\xaa\xb3\x17"
+ "\xf6\x6a\xf0\xaf\x16\xb7\x67\xb2\x8c\xfd\x30\xe8\x3c\xdd\x19\xb2"
+ "\x49\x8a\x93\x3c\x23\xf8\x36\xc4\xf4\xc3\xfa\x01\x0f\x88\x3e\x61"
+ "\xfd\x50\xdd\x16\x9c\x73\xcb\x75\x74\x66\xda\x7f\x6f\x1d\x9d\x11"
+ "\x38\x4f\xfd\x3e\xc8\x0d\x45\x7c\x5e\x29\xcb\x14\x76\x08\x01\x1f"
+ "\xee\x25\x1b\x69\xef\xc9\x92\x34\xc9\x5b\x26\x6c\x55\xd6\xf7\x22"
+ "\x9e\x71\x71\xdd\x10\x8b\x53\x4b\x7c\x39\xe0\xd5\x8f\x14\x08\xfb"
+ "\x0d\x13\x95\x3b\x08\xfb\x0e\xd8\x18\x26\x88\x98\x91\x9f\xb2\xba"
+ "\x7e\x66\xec\x64\x67\x6a\x70\x9e\x14\x86\xf5\x99\xef\x70\x7e\xc8"
+ "\x77\x1e\xb7\x9a\x0b\x0c\x25\xa8\x43\x1d\x38\xb5\x40\x2f\x87\xd8"
+ "\xe4\x28\xd7\xc1\xce\x7c\x26\xca\x21\xaf\xf0\x25\x62\x59\x41\xbc"
+ "\x5a\x26\xf2\x07\xe8\xbd\x56\xb5\xa4\x71\xda\x53\x82\xeb\x03\x07"
+ "\xe9\xdb\x72\xb5\xd4\x6e\xa1\xb4\x74\x71\x8e\x31\x6c\xc5\xf9\x26"
+ "\xe1\x9c\xe2\x75\x7b\xbe\x75\x89\xfe\xe0\xae\x72\x1e\xed\xbf\x42"
+ "\xb6\xf1\x5e\x5d\x7b\x92\x19\x1d\x0f\x62\x3e\xbd\xd2\x07\xf0\x69"
+ "\xdd\x1f\x9f\xf7\xad\xbe\x9d\x27\xd3\xfb\x08\x5f\x7d\x06\x13\x3b"
+ "\x6c\xf5\x63\xdf\x6f\x3b\x6c\x1d\xa2\xf9\xf1\x6e\x23\x7a\x59\x22"
+ "\xf9\x6a\x6f\x68\x6d\x02\x47\xa3\xac\x96\x22\xfa\xbe\x57\xb7\x69"
+ "\x02\x9e\x96\x0a\x1f\xef\x67\x0a\x00\x37\xc2\xed\xf9\x47\x56\x87"
+ "\x7d\x2c\xf7\xc9\x7b\x7d\x16\x2a\x13\xba\xff\x1b\x1c\x50\x5b\xa8"
+ "\x1f\xf0\x45\x93\x1f\x5c\xaf\x1e\xc3\xf9\xfb\xdd\xfd\x2a\xc7\x9d"
+ "\x07\xdc\x5f\x81\xec\xb4\x2c\x9f\xf7\x41\x16\xc4\x5d\x31\x9c\xbd"
+ "\xe3\x2e\x7d\x78\x9d\x7c\x97\xa4\xdf\xa9\xc7\x1a\x41\x1f\x70\x1f"
+ "\xac\xfc\x21\xb1\x4e\x61\x03\x1b\x27\xce\x1f\xa2\x1e\x3e\x79\xb7"
+ "\x8f\xea\x3c\x2d\xce\xcd\xfa\x6a\xb5\x7a\xe0\x33\x8b\xea\xc8\xd1"
+ "\xeb\x50\x61\x3f\x9c\x2b\xec\xf7\x3c\xb2\xbc\xb4\x35\xba\xdb\xa7"
+ "\x8a\x7b\x3c\x28\x2f\x6d\x80\xbe\xab\x09\xd9\xa0\x8a\xbb\x35\xdf"
+ "\x1d\xd0\x6d\xcc\xe8\x39\x74\xff\x0b\x30\xed\x2b\x9d\x63\xf5\x11"
+ "\x7d\xf0\x95\xce\x4e\xa7\x6f\x44\xff\x4f\xb6\x9d\x57\x1f\x02\x3f"
+ "\x0a\x8f\x32\x83\x1a\xeb\xab\x82\x8f\x0c\x58\xdb\x4b\xbb\xf7\xb3"
+ "\x37\x69\xfe\x32\xa2\x4e\xb3\xef\xbe\x0b\x9f\xc3\x07\x35\x1d\xf2"
+ "\xd9\x15\x52\x86\x39\xbb\x42\xe8\x90\xcb\xe7\xb0\x97\x36\xf9\x0d"
+ "\x07\x37\x79\x0c\xd2\x1e\xef\x6c\x9a\x87\x0d\x6d\x0b\xdb\x82\x9e"
+ "\xb5\xa0\xae\xb1\xfd\x8a\x0c\x15\xcb\x3a\xfb\x84\xff\x90\xb0\x4e"
+ "\xa0\x4f\xdc\x7f\xc2\x99\xb9\x0a\xfe\x31\x21\xda\x02\x1b\x29\xb7"
+ "\xe3\x2c\x74\xc9\xd1\x52\x3f\x21\xf3\x68\x76\x9e\x17\xf7\x8c\x7c"
+ "\x9f\x8c\x77\x09\xb3\xb3\x1e\xfd\x5c\xaa\xdc\xa0\x22\xfe\x20\x2f"
+ "\xaa\x27\x7a\xe9\xf0\x09\x3f\x0d\x6e\xe2\x47\xa9\x0d\xee\xc8\xc5"
+ "\x5d\xca\xbe\x4b\xe0\xbf\x41\xae\xcd\xbe\x1d\xa2\x4f\xce\x5b\x79"
+ "\x11\x64\x32\x2f\x62\x1d\x9d\x65\x94\x6f\x12\xe5\xbb\xad\xa9\xa0"
+ "\x17\x36\x66\x2b\x10\xc7\xb6\x53\x6b\xdb\x1b\x33\x54\x7c\x55\x1c"
+ "\xcb\x1c\x74\xf6\x2d\xf7\xb0\xa6\x9a\x0b\xa7\x1b\x7d\xcb\xcf\xc7"
+ "\x9f\x4b\x7e\x31\x95\x8d\x27\xe3\x43\x87\x73\x1d\xb5\x7f\x17\x47"
+ "\xff\x7d\xb7\x05\x0c\x7e\x36\x6c\x98\xc8\xaf\x2d\xce\x67\x01\xe7"
+ "\x44\x1e\xdc\x44\xf3\xd5\x67\x25\x19\xb0\x85\xb5\x4a\xbb\x1b\xd8"
+ "\x0e\x98\x0b\x7d\xfc\xac\x3b\xd0\x80\x33\x04\x2f\xcd\x15\xd1\x2d"
+ "\xdf\x8f\xdc\x81\xb7\x18\xec\xbb\x41\x6f\x3a\x98\x6f\x16\xfa\x75"
+ "\x9d\xa3\x98\xcd\x3d\x8d\xef\x7d\x9d\x72\xcf\xf7\xa5\x6a\xbf\x16"
+ "\xf8\x07\x8e\xec\xd3\x3f\x3d\xba\xe6\x01\x38\x99\x9e\xbb\x34\x7b"
+ "\x7d\xf6\x6a\xdb\x4f\xe1\x82\x7a\xb4\xdd\x68\x38\xce\x61\x7f\x1c"
+ "\xf6\x57\xf0\xef\x88\x77\x78\xbe\x58\x87\x7a\x9c\x43\x5a\x73\x49"
+ "\xd0\x79\xff\x6f\xc6\x3a\xd4\xf9\x73\xc4\x39\x0c\x9f\xff\xf4\xb7"
+ "\x84\xd6\x80\xfa\xce\x20\xde\xc5\x9e\xee\xf4\x2d\xc5\x3a\x92\xfb"
+ "\x4b\xff\xe2\x48\x5f\x45\x92\x3f\x53\xbc\x94\xbe\x42\xbf\xf3\x4a"
+ "\xb8\x18\x47\xef\xab\xc3\x77\x6c\xfa\xf3\x69\xbe\x1b\xe5\xfa\x15"
+ "\x79\x4b\x74\x3b\x09\x2d\xa6\xbd\xb0\xeb\x50\xb7\xdf\x54\x20\x75"
+ "\x93\xfd\x65\xb5\xea\x44\x93\x3c\x17\xeb\x6f\xd0\xef\x70\xc9\xb5"
+ "\xf9\x8e\xb6\x36\xfb\x5b\xce\x67\xcb\x12\x5e\x1b\x03\xa6\xf0\xba"
+ "\xfe\x5a\x2b\x3b\x60\xfa\x21\x3b\x18\x4d\x46\xbc\xa4\x87\xf9\xa7"
+ "\x43\x5f\x29\xef\x6c\xfb\x85\x7f\x21\xe9\x8f\x63\xf0\xb8\xf6\x4c"
+ "\x6d\x0c\x7e\xa8\x3d\x5f\x4e\xcf\xaf\x69\xcf\xc4\x2f\x0e\x3e\xaf"
+ "\x3d\xd3\x9a\x1d\xdc\xa2\x3d\x27\xd2\xf3\x2a\xed\x99\xf6\x8e\xc1"
+ "\x9f\x68\xcf\x53\xe8\xf9\x47\xda\xf3\x65\xf4\x3c\x53\x7b\xa6\x35"
+ "\x38\x28\xce\x0c\xa8\xef\x26\xea\x7b\xff\x85\xcb\xac\x03\x2e\x79"
+ "\x6e\x3d\xc8\x88\x1f\xac\x92\x7b\x4f\x28\x2d\x91\x70\x3a\x4b\x87"
+ "\x2f\xa5\x37\xa2\x1d\x4a\x4f\xf6\x30\x4f\x5b\x44\xba\xe6\xbf\x6d"
+ "\x70\xb1\x87\x7d\xe7\x89\x48\xaf\xd1\xd2\x57\x90\xcc\xed\x8b\x48"
+ "\xaf\xd4\xd2\xf3\x88\x2e\xe6\x44\xa4\x6f\xd3\xd2\x4b\x3d\xec\xbf"
+ "\x8c\x11\xe9\xf9\x5a\xfa\x5e\xdd\x86\x47\x4b\x5f\xad\xa5\x1f\xf2"
+ "\xb0\x4f\x1b\x22\xd2\x33\xb5\x74\xa2\xff\xfd\xed\x11\xe9\x82\xae"
+ "\x48\x9f\xec\x66\x7e\xb8\x00\x6b\x6b\xd0\xef\x61\xed\x7b\x23\xf2"
+ "\x2c\x91\x65\xfd\x24\x4b\xfe\xad\x25\x22\x7d\xa1\x96\x6e\xf7\x28"
+ "\x73\x22\xeb\x4c\x19\x8f\x56\x29\xd5\x2c\x73\x3c\xbd\x3e\x64\x20"
+ "\x61\xcb\x2c\xf8\xec\x73\xd9\xb8\x13\x66\xde\xc3\x3b\x6c\x85\x9c"
+ "\x77\xb0\x73\x4b\x35\xdb\xdd\x74\xd8\x51\xca\xfb\x75\xe7\xe6\x6b"
+ "\xbe\x15\xbc\xe2\xce\xdd\x26\xa4\xf9\xdf\x14\xfa\x99\xfc\x62\xe9"
+ "\x2f\x5c\x8f\x3d\x03\xfd\x96\x76\xf6\x4f\x79\xe0\x2b\x16\xb6\xe0"
+ "\xbd\xd0\x81\xbb\xf3\x86\xa4\x2f\x79\x92\x83\x91\x06\x3d\x0f\xe0"
+ "\x11\xa9\xcf\x92\x74\xff\x5c\xb6\x3a\x84\x7b\xad\x52\x17\x86\xb5"
+ "\x88\xfc\xb0\x57\x8b\xcc\xeb\x61\xe7\x84\x5f\x8a\x28\xeb\xa4\xbf"
+ "\x0e\x3a\xcf\x2d\x0e\xdf\x27\xf2\xd7\x68\xe9\x9f\x51\xfa\x8a\x88"
+ "\xf4\x92\x71\x69\x3b\xd1\x41\x6e\x3a\x9e\x39\x3c\xc0\x7d\x81\x01"
+ "\xee\x2f\xff\x8a\xfa\xfd\xa0\xb0\x11\xbc\x22\x58\x72\xdc\x81\xfb"
+ "\x36\x88\x11\x1b\x58\xcf\xbd\xb0\x89\xa4\xf4\x8b\xee\xf6\x79\x89"
+ "\xc7\x18\xe4\x65\xf7\xc3\xfe\xb5\x9f\xe1\x6c\xb6\xa8\x17\xf1\x06"
+ "\xcd\x1c\xf7\xb8\x37\x9f\x62\x71\xb8\x8f\x53\xfb\x20\xbe\x7f\xc9"
+ "\xee\xca\xf1\xb2\x23\x39\x41\x56\x4b\x75\xef\xb9\x5f\xe7\x2f\xce"
+ "\x05\xc2\x77\x85\x8f\x43\xce\xbf\xa2\x48\xc4\xc4\x1e\x12\xbe\xca"
+ "\xcd\x5b\x60\x53\xb0\xc8\xcf\xdf\x03\x6f\x3c\xdb\x66\xde\xc2\x6c"
+ "\xb4\xb7\x2f\xa0\x67\x8b\xfc\xa3\x6f\x94\x3e\xde\x98\xe4\x5a\x1e"
+ "\xca\x93\x72\xf7\x71\x8f\xa4\x17\x43\x79\xfc\x45\xdc\x3f\x19\xca"
+ "\xa7\xb2\x7e\x6f\xfc\xec\x31\xef\xe5\x6c\xde\xc3\x0c\xc3\x3b\x89"
+ "\x37\x39\xdd\x68\x90\xf4\x69\x38\x4b\x35\x98\xb6\x40\xd7\x2e\xe2"
+ "\xe1\xee\xf4\xed\x3d\xb0\xc6\x6f\x38\xb2\xa9\x93\x3d\x76\x19\xb3"
+ "\xae\xf0\x1b\x28\xcf\xd0\x89\x84\x3c\xf8\x3d\x9f\x03\x3f\x11\x86"
+ "\xd7\xe9\xfb\xdb\x6b\x1a\x0d\x01\xc1\xaf\x0c\x67\x09\xfd\x6c\x89"
+ "\x2f\x1f\x7b\x88\xbb\x3d\x08\x5e\x3c\x8e\x78\xf1\x1c\xa2\xff\xa6"
+ "\xe0\x86\x9c\xc9\x81\x75\x39\x17\xed\xc9\x65\x71\xc1\x75\xf6\xc4"
+ "\xa7\x07\xd8\x02\x7d\xff\xd9\xb3\x9e\xf6\x94\x41\x6b\x6c\x05\xed"
+ "\x29\xd0\xfb\x24\x28\x16\x71\x0e\x8d\x67\xd5\xf0\x95\xa5\x76\xfd"
+ "\xf9\x63\x7b\x07\x37\xd8\x85\xbf\x09\xf4\x65\xac\xb1\x96\xee\x62"
+ "\xc6\xa0\x76\x2f\xb5\xf0\x04\x9b\x42\xfc\xb3\x21\xa1\x9f\xbb\x7a"
+ "\x56\x33\x03\xe2\x21\x17\x66\x0b\xdd\xea\x84\x23\x39\x01\xe6\xce"
+ "\xff\x82\x15\xe6\x62\x8e\x86\xdf\x04\x9f\x06\x7b\x66\xca\x6f\xe9"
+ "\x61\xc3\x1f\x9a\xfd\xb4\x67\xf8\x89\x27\x7f\x08\x72\xf1\xf0\x97"
+ "\xd2\xbf\x45\xc0\x86\x7b\xa4\xae\xdc\x45\x48\x3b\x57\x74\x42\xd8"
+ "\x0d\xad\x90\x6b\x6b\xf8\x28\xde\x8b\x70\x4f\x36\xf6\xdc\xde\x57"
+ "\x86\xfc\x13\xa4\xfe\x6e\xf8\x33\xb9\x3f\xcc\xf6\x4a\xd9\x6e\xf8"
+ "\xe8\x78\xb8\xab\x96\x9c\x28\xe6\x88\x05\x59\x03\xfe\x95\x7b\xc4"
+ "\x19\x3f\x7c\x06\xe4\xdf\xea\xe2\x44\xee\xa4\x2f\xa3\xc0\xf3\xea"
+ "\x8e\x13\xc5\xd2\x87\x64\x40\xde\xcd\x87\xbe\x7f\xc7\x89\x4a\x71"
+ "\xbe\xb1\xe3\x44\xbd\xd0\xf7\xef\x38\x71\x70\xeb\x54\xdc\x27\x08"
+ "\x54\xf7\xc5\x9c\x70\xd1\xef\xea\xbe\x58\xb5\x79\xdc\xfd\xa8\xa4"
+ "\xe3\xa0\xed\x0a\x96\x88\x73\xa6\x8c\xa0\xf4\xc5\x2a\xd7\x70\xb0"
+ "\x86\xef\x10\xdf\x66\x74\x38\x58\x94\xf4\x77\x1c\x38\x39\xaf\x86"
+ "\xd9\xa8\xaf\xf1\xdc\x74\x22\x53\xd8\x3d\x96\x9c\x70\xb8\x7b\x11"
+ "\xa7\x2a\xc8\xe4\x79\x60\x70\x1f\x8f\x39\x91\x29\xf3\x07\x7f\xd4"
+ "\xda\x4b\x63\x30\x9d\x48\x71\xfb\x4f\x69\x3c\x61\x70\x01\xf5\x31"
+ "\x85\x97\x9c\x48\x95\xf7\xcd\x83\x3b\x74\xba\x2a\x71\x34\xb8\x59"
+ "\xe2\x7a\xc7\x41\x09\xb7\xe0\x3e\x6d\xbf\x9a\x81\x67\xda\xbb\x53"
+ "\xa4\xfd\x4a\x30\x4f\xe7\x91\x3d\x5a\x1e\x94\xa1\x67\xcd\xcf\x67"
+ "\xb0\x8a\xc6\x9e\xac\x7d\x5f\x80\x34\x1a\x1f\xed\x59\x81\x36\x8c"
+ "\x6b\x3c\xda\x2a\x60\x51\xc0\xa2\xa8\xcf\x69\xb0\xf5\x06\x9f\xe2"
+ "\xf6\xdd\xea\x72\x8b\x39\xe0\xd7\xc3\xb6\x1f\xed\xc0\xdf\x10\xe8"
+ "\x26\xd5\x69\x44\x7d\xe1\xfe\xab\x97\xe8\x7d\x41\x7b\xf8\x46\x63"
+ "\x4d\x11\x72\x35\x8d\x19\x79\x30\xaf\x5d\x0e\xe8\xfd\xfa\x09\x66"
+ "\xb0\xa1\xe3\xa9\x80\x89\x84\x19\x9f\xa6\xc9\xf4\xda\x3c\xf0\x49"
+ "\x23\xe1\x21\xdf\x55\x13\xd1\x86\x5c\xd8\x52\xf1\x54\x0d\x7e\x5a"
+ "\x8c\x15\x55\xf8\xa2\x95\xdf\xd4\x5f\x47\x94\x9d\x1e\xca\x4b\xfd"
+ "\x06\x6f\x04\xbb\x04\x9c\x53\x49\x7c\x55\xdb\x22\xca\xb5\x65\x7c"
+ "\x47\x3c\x32\xf1\x90\x5b\x9f\x15\x31\x2b\x53\x06\x9d\x6a\x67\x18"
+ "\xde\xb2\x9e\x31\xda\xb8\x42\x6f\xc3\xc3\xd4\xbd\x7a\x3f\xe9\x59"
+ "\xdb\x83\xb9\x3d\x3c\x27\xea\x12\xbd\x1c\x74\x3a\x34\x47\x3e\xc4"
+ "\x8f\x1d\x27\x2e\x86\xe2\x26\xa8\xb4\x06\x6e\x75\x09\x7c\x64\xbc"
+ "\x1e\xba\x4b\x82\x6b\x9a\xc4\x21\xbe\x4d\xee\x85\xbc\x1e\x75\xe2"
+ "\xac\x51\xfa\x1b\xe5\xd5\x54\xaf\x76\x67\x89\x1f\xd0\xfa\x40\xf2"
+ "\x5f\x60\xef\x68\xb9\x6e\xd1\xca\x2c\x5b\xda\xf5\xe2\xce\xed\xdc"
+ "\x47\x1d\xb8\x4e\x9b\x15\x7e\x19\xc9\x73\x5b\xc2\x3e\xce\x10\x8b"
+ "\x5a\xf3\x71\x56\x32\xb4\x57\xc0\x5f\x61\x8b\xf9\x00\xaf\xc2\xdd"
+ "\x11\xbe\x9e\x57\x97\xd3\x1c\x16\xf5\xb3\x4b\x11\x17\xbb\xd0\xc1"
+ "\xbf\x85\xff\x3b\xa2\x97\x4d\x44\x3f\x9a\x0b\xfb\xd9\x44\xd8\x25"
+ "\x81\xfe\xc0\xee\x99\xc7\x50\xfa\x0e\x5f\x73\xe8\x1e\x9e\x62\x5c"
+ "\x88\xbb\xa3\xbc\x28\xdd\x40\xf9\x8f\x01\x1f\x60\xa3\xde\xa5\x18"
+ "\xa7\x51\xbe\x63\xf4\x2d\xaf\x0c\xed\x98\xfa\x6d\x41\xd3\x50\x41"
+ "\xd1\x29\x16\x2d\x62\x1c\xe6\xfb\xa1\x53\x33\x74\x28\xec\xd7\x3c"
+ "\xa6\xdf\x46\xe9\x09\x22\xdd\x4f\x6d\xef\xe8\xb7\xd1\xb7\x04\xfa"
+ "\x76\x9c\x7e\x55\xaa\x23\xbf\x9c\xfa\x5d\x78\x8a\x5d\x41\x7d\xe9"
+ "\xe6\x25\xfd\x36\xea\x67\x57\xd1\x23\x6c\x4a\xab\xa3\x1b\xf2\x1d"
+ "\xd5\xe7\x91\xb1\x1b\xa9\x6c\x87\xa2\xdc\x44\xe3\xca\x87\x4e\x84"
+ "\x7e\x0b\xca\xe8\xb7\x30\xc8\x12\x0a\x37\xd3\xbe\xb7\x99\xda\xc7"
+ "\xbd\x56\xaa\x07\x3e\x48\x64\x5f\x68\x6c\xd0\xab\x51\xbd\x9b\x7b"
+ "\x79\x17\xd5\xdd\x7d\xa4\x97\xea\xcb\x6f\x0f\xd5\xa9\xf1\xd4\x33"
+ "\x68\xbc\x97\xf0\x9d\xaa\x87\xfa\x54\x0d\xdb\x6d\x4a\xb3\x50\x9a"
+ "\x25\xc4\x0f\x2b\xc6\x49\xda\x73\x4c\x28\x6f\x51\x3a\x2b\x3c\xc7"
+ "\x84\x0d\xb5\x6d\x43\x14\xeb\x50\xa2\xea\xe1\x07\x2b\x5c\xa7\x61"
+ "\x3a\xea\x2b\xa5\xfa\x8a\xb2\x59\x0c\xd1\x6a\x13\xf5\x11\x31\xa2"
+ "\x8f\x0b\x38\x61\x8d\x29\x86\x69\x34\x96\x4a\x8c\x49\xa5\xb9\x2b"
+ "\xa3\xf5\x40\xe3\x51\x68\x3c\x31\x9b\x83\xa1\xbb\xba\x18\xd3\x24"
+ "\xc8\x73\x18\x97\x9c\xc7\xfe\x85\x34\xae\xc5\x9b\x73\xf8\x71\x1a"
+ "\x5b\xf7\x91\x9c\x76\x46\x7b\x8f\xb9\xd5\xd1\x86\x3b\x14\xc7\x25"
+ "\xdc\xba\x61\x83\xba\x90\xc6\xb9\x38\xe4\xab\x57\x89\x7a\x9e\xfa"
+ "\xde\x4d\xfd\x2a\xd5\xc6\x89\xb4\xaa\x10\x4f\xaf\x44\x3d\xa3\x3d"
+ "\xc7\x86\xf2\x7e\x7f\x9c\xa6\x88\x71\x52\x79\xe3\xcd\xa8\x4f\x1b"
+ "\x67\x2c\x8d\x33\xe6\xfb\xe3\x24\x7c\x5a\xcf\xb7\x69\xe3\x2c\xd1"
+ "\xc6\x69\xa0\x71\xc6\xd2\x38\xa7\x46\x8c\x73\xf2\xa8\x71\xa6\xd2"
+ "\x38\x97\xd0\x38\x3b\x22\xc6\x69\x19\x63\x9c\xa9\x1e\xb4\xb1\xa3"
+ "\x7f\x89\xf4\x0f\xc6\x1b\xc5\xfd\xf7\xed\x51\xa1\xfb\xef\x2a\xee"
+ "\x5d\x0e\x08\x1f\x44\x0d\xd0\xdf\x40\x6f\x04\x59\x0f\x77\x3c\x33"
+ "\x36\x96\x14\x0b\xdd\xcd\x14\xa9\x9b\x16\xfc\xd5\xf6\xa8\x15\xa1"
+ "\xbb\x1b\xcf\x8a\xd8\x35\x3e\xa4\x0b\x9f\x01\xb9\x4c\xe8\x1e\x97"
+ "\x6d\xdc\x50\x84\xf2\x28\x4b\xf9\x4b\x43\x77\xcc\x14\x83\x43\xea"
+ "\x43\xd5\x6e\x3c\xc3\x17\x96\x3c\x13\xe0\xcd\xe2\x4c\x60\x7b\x54"
+ "\x38\xfe\xd3\x7a\xde\x04\xb8\x88\xfb\xac\xe2\x3e\x28\x2b\xc9\x08"
+ "\x94\xe8\xf7\xd2\x7b\x29\x6f\x67\xc4\xbd\xf4\x5e\xd1\x87\x21\xe1"
+ "\xfb\x61\xc3\xb2\xc0\x06\x71\x3f\x7d\x70\xbb\xd1\x14\x6e\x5b\x29"
+ "\xd1\xda\xf6\xe0\xd9\x2b\x7d\xb3\x41\xc7\x66\x13\xf6\x36\xdb\x8d"
+ "\xf3\x75\x1b\x17\x8f\xc2\x1c\x58\xcb\x63\xc6\x79\xd9\x6e\x5c\x31"
+ "\xc2\x17\x94\x32\x01\x7e\xde\x91\x9e\x17\xba\x6b\xbe\xdd\x58\xfc"
+ "\x43\x77\xcd\x8b\xbc\x34\x4f\xb4\xde\x1c\x88\x79\xae\x18\x5b\xf8"
+ "\x8e\xa1\x02\x11\x2b\x45\x99\x30\x1d\xfd\xec\x50\x8c\xd8\x3f\xcc"
+ "\xe2\x3c\x48\x31\x7e\xa9\xd1\xe6\xb6\x65\xc1\x80\xd9\x43\x6d\x0a"
+ "\xdf\x52\xa1\x77\xe3\x51\xf8\xca\xa0\xb2\xf1\xc2\xcf\x39\xd5\x37"
+ "\x32\xbf\xf8\x5e\x3c\xea\x3d\x75\xd4\xbb\xcd\x47\x34\x6b\x3c\x5b"
+ "\x9e\xb2\xa9\x42\xc7\x9b\x9f\xb0\x85\x39\x8a\x4e\xb2\x28\xc2\xc5"
+ "\x13\xe8\x5b\x6b\xb7\xb8\xe7\x67\xe6\xce\x14\xe6\xee\x0e\x48\xbe"
+ "\x9d\xf8\xa5\x8e\x24\xca\x73\x92\x4d\xc1\x3d\x13\xc4\x92\xa1\xfc"
+ "\x3d\x22\x7e\x8c\x12\xfd\xc6\x8a\x47\x63\x99\xfa\x8b\xf4\x8b\xb8"
+ "\x61\x13\x78\x23\xd3\xcb\x43\x1e\xc4\x60\x51\x0a\x9f\x67\xd3\x40"
+ "\xa7\x08\x87\x3b\xb9\xe1\xb1\x83\x54\xa6\xf7\xa5\xa1\xee\x09\xee"
+ "\xc0\x17\xcc\x41\xf4\xb3\x47\x89\xde\x67\x2c\x60\xc6\x8a\x2e\x66"
+ "\x21\x3c\x0b\x1c\x0e\x2c\x60\xba\xaf\x87\x9a\xc9\xd2\x87\x40\x0d"
+ "\xe1\xe4\x3a\x2b\xf7\x0f\x6e\x8f\x36\x92\x5c\x5b\xac\xeb\x2f\x4a"
+ "\xa5\xaf\x37\x23\xb5\xff\x4b\xe1\x97\x42\xf2\x07\x04\xdb\xe8\xdb"
+ "\xe4\x3d\xd3\xc4\x5f\x50\x99\x05\x21\xd9\x46\x89\x6e\x92\x30\x1c"
+ "\xaa\x97\xfb\x48\x74\xd3\x61\x92\x8e\xb6\x49\x9b\xa8\x44\xca\x9b"
+ "\x15\xb2\x89\x82\x4e\x90\xbe\xd3\x1c\xd6\x4b\xb9\x67\xa8\x3e\x23"
+ "\x68\xd2\xd6\x38\xd2\x8f\xa7\xa0\x2c\x95\x33\x8b\x38\x97\xdb\xa3"
+ "\xeb\xc3\xb8\x16\x9d\x83\xfd\x94\xc6\x14\x47\xf3\x7a\x0c\xe3\x02"
+ "\x4c\x7c\xf0\xeb\xa6\x4c\xf0\x1c\xde\x3b\x4e\x1c\x24\xd3\x71\x4f"
+ "\x40\xe8\x97\x66\xfb\x09\x9f\x4e\xd1\x1c\x5c\x0c\xdf\x56\x6e\x6a"
+ "\xe7\x48\xed\x10\x3b\x62\xed\x63\xad\xf4\x8c\xbb\x0f\xae\x87\xbe"
+ "\x61\x9d\xb6\xb1\xf7\x72\xe2\x07\x32\xa9\xcf\x0e\xd4\x05\x5a\x03"
+ "\x7b\x51\xf8\x20\x6c\xf5\x52\x5d\x9d\x4c\xd4\x71\x44\xed\x66\x47"
+ "\xf2\x8f\x43\xb7\xed\x6f\xad\xfd\x82\xb5\x5a\xff\x22\xda\x01\xbf"
+ "\xed\xca\xed\x3b\x5f\xdd\x84\x73\xc7\x2b\xb5\xba\x7b\xa9\xee\xc4"
+ "\xf1\xeb\x9e\x6d\xbb\xc0\xba\x2f\xa0\xdf\xb3\x2d\x17\x52\x77\x51"
+ "\x35\x0f\x12\x1d\x8e\xa7\x3d\x3e\x07\xfe\x59\x71\xc7\x35\x38\x00"
+ "\x9f\x34\x33\x84\xac\xde\xa5\x98\xf6\x80\xde\x08\xfb\x90\x1d\xbe"
+ "\x2c\x71\xff\x15\x7a\x76\xed\xde\xab\x3b\x70\x82\x41\xef\x3e\xb8"
+ "\xdd\x54\x12\x92\x45\xc3\x67\xe3\x16\x8f\x62\x3a\x20\x6d\xad\x7d"
+ "\x59\x12\xb7\x4c\x2b\x51\xd7\xd8\x32\x67\x7f\x95\xb0\xd9\x57\x4c"
+ "\x27\x74\xfd\x56\x5f\x4c\x7f\x95\x56\x97\x6d\xb4\xde\x54\x73\x24"
+ "\x64\xcb\xce\xcf\xb3\x6d\xc8\x5d\x95\x97\xad\x5f\xd0\x8e\x65\x3f"
+ "\xcd\x7e\x20\x7b\xd5\xfa\xec\x2c\xdb\xf2\x47\x73\xd7\xcc\x5d\xfb"
+ "\xe0\x83\xb6\xbb\xb2\xd7\xad\x5b\xf9\x8b\xec\x58\xb6\x3c\x77\xe5"
+ "\x9a\x75\xab\xa0\xdb\xb4\xd9\x16\xdf\x98\x91\xb3\x36\x6f\xee\x2d"
+ "\x8b\x53\x46\xe9\x36\x71\x5f\xfb\x18\x64\x1c\xda\x9f\xa6\x10\x8f"
+ "\x31\x09\x7e\x89\xcc\x1b\xb9\xeb\x31\x92\xaf\x09\x07\x7b\xb0\x17"
+ "\x62\xff\x81\xec\x05\xff\xc6\xf0\x99\xbc\xfb\x59\xde\xd6\xa5\x5c"
+ "\xbe\x87\xf8\xf6\x76\x4a\x83\x7f\xe2\x63\x7c\xa8\xc8\x2b\xce\xb3"
+ "\x95\xcb\x37\x52\x9e\xa6\x27\x28\xcd\x1b\x33\x54\x5f\xf1\x15\x33"
+ "\x4a\x1e\x23\xc6\xcf\x0d\x13\x79\x29\x7c\x0d\x7f\x63\x65\x9a\x8f"
+ "\x74\x83\xdb\xe3\x87\x0d\x91\x69\x59\xa0\x88\x83\xa6\xca\xf5\x15"
+ "\x73\x4e\xae\xd3\x13\xc5\xe2\x2e\x83\x72\xf9\xcf\x20\x23\x6e\x45"
+ "\xdc\xc5\xed\xb1\x44\xff\x87\x1d\x61\x5a\x7d\xb1\xce\x9b\xb7\x13"
+ "\xdc\x37\x74\xd0\xbb\xf0\xb5\x12\x1d\x3b\x7f\x84\x7d\x98\x12\x97"
+ "\xc8\x94\x4b\x0b\xe4\x1f\x95\x51\x2e\x2d\x91\x7f\x78\x8e\xfc\xbb"
+ "\x7c\xa1\xfc\x1b\x9d\xfe\x3f\xfd\xd3\xdb\xff\x6f\xd7\xe1\xff\x81"
+ "\xbf\x7f\xa0\x7d\x31\xee\xff\x1f\xc7\xff\x3f\x29\x4f\x8b\xe1\x3c"
+ "\x7f\xc0\x37\xc2\xad\x63\x4f\x7c\xc5\x4c\x84\x9f\x55\x65\xf7\x13"
+ "\x4e\x7f\xc9\xac\x05\x01\xde\x59\x74\x2f\x9b\x56\x78\x92\x78\x30"
+ "\xe2\xb5\xf2\xf2\x79\x67\xe1\x00\x3f\x4e\x78\xf3\x09\xe1\x6f\x63"
+ "\x79\x07\x8b\x2b\xeb\x20\x3e\x2b\x4f\xc6\x9e\xc1\x79\x13\xee\x79"
+ "\xb9\xe9\xbd\x65\xbd\x9f\x7d\xec\xfd\x0e\x36\x95\xae\xd6\x4c\xa2"
+ "\x3d\xc7\x18\x03\xfe\xc6\x65\xb2\xc4\x9a\x29\xfc\x10\x77\xbe\x92"
+ "\xc5\x0d\xaf\x2c\xa7\xb4\xa3\xaf\xaa\xa9\x13\x5e\xdd\xd4\x3c\xc1"
+ "\x76\x3f\xf6\xf9\xb8\x37\x35\xdc\xbc\x4d\xdc\x63\xa4\x5f\xe0\xa0"
+ "\xe6\x63\x9a\xf6\xa7\x8b\xdf\x92\x7b\xfa\xc5\x65\x9a\x3e\x0f\xcf"
+ "\xe2\xfe\x06\x8d\xa3\x91\x3b\x37\x1d\x44\x9d\xaf\xa8\x8d\x13\xb0"
+ "\x67\xbe\xba\x29\x75\x42\xc1\x4a\x66\x68\xf5\xf4\xb0\xc3\x44\x0b"
+ "\x71\x3e\x4e\xeb\xee\x00\xad\xb3\x83\x7b\xa6\xf0\x4a\xea\x5f\x29"
+ "\xf1\x73\x25\xd4\xa7\x7d\x83\xdb\xe3\xed\x1e\x65\xa2\x55\xe3\xe5"
+ "\x5c\xb4\x2e\x0e\x94\x51\x9e\x65\x8f\xb2\x19\x65\x94\x8f\x78\xbb"
+ "\x12\xc8\x28\xb2\x7f\x93\x66\x12\x0c\x1a\xa8\xcd\x36\xdb\x7d\x78"
+ "\x4f\x10\x3c\x06\xda\xa6\x71\x90\x1c\x92\x20\x64\x7e\xb4\xa1\xb7"
+ "\x4b\xf5\x97\x50\xfd\x6d\xda\x19\x63\xa5\xac\x27\xbe\x41\xae\x57"
+ "\x1f\xfc\xeb\x1e\xd3\xee\x89\xf5\x96\x6d\xa2\x7d\x7d\x88\xc1\x0f"
+ "\x6e\x15\xb5\xe1\x32\x6f\x61\xdc\x8c\x3b\xc6\xc7\x02\x24\xd7\xa8"
+ "\xd2\x7e\x57\x49\x78\x5e\x2b\x2b\xf8\x10\xc1\x7b\x04\x89\xbf\x17"
+ "\xfa\x19\xe2\x3f\x72\x88\x4e\x10\xcf\x21\xee\x67\x10\xbf\x81\x74"
+ "\x6a\xa3\x8a\xc6\xd5\x46\x72\x73\x03\xed\xdd\x88\x17\x69\xba\xaf"
+ "\xff\x5f\x18\xce\x38\xc0\x2f\xac\xcb\xe7\x7e\x11\x57\x6a\x7b\xc2"
+ "\x7c\x9d\x5f\x00\x7e\x80\x47\x28\xbb\x8f\x19\x87\x69\x8e\x09\x47"
+ "\x9a\x89\xff\x20\x9e\x3e\xc1\xa1\xcd\x4d\xb3\xe0\x0b\xb4\x38\xd2"
+ "\x92\x86\x27\x6c\xa6\xfd\x3d\x8e\xda\x68\xf6\x28\x97\x0b\x58\x48"
+ "\x1a\x94\x50\xaa\xef\xf5\xd0\x39\x78\xa8\x0e\x4e\xb4\x8e\xe0\xd6"
+ "\x90\x9c\xa9\x30\x8f\x12\x7f\x94\xe6\xa2\x01\x79\xa9\xbc\x91\xf2"
+ "\x1f\xa2\x7d\x7f\xa1\x36\x27\xc7\x48\x26\x20\x3e\x20\x61\x31\xfa"
+ "\x41\x65\x5a\x08\xd6\xd4\x96\xc5\xa7\xd1\xb1\xa3\x92\x87\xb1\x7c"
+ "\xa9\xc3\x9e\xe6\x7a\x5b\x18\xfe\x66\x53\x24\xfc\x09\x16\x52\x2e"
+ "\x57\x2c\x3b\x22\xe6\x8e\xe4\x52\x4b\x26\xf4\xd0\xd4\xde\x21\xa1"
+ "\x43\x53\xcc\xb7\xc1\xf7\x1b\xe1\xcc\x21\x82\xc5\x21\xca\xd7\x08"
+ "\xda\xbc\xf5\x2b\xa2\xb9\xf7\x83\x87\xb2\xdc\x29\x79\x54\x73\x37"
+ "\x70\xb8\x4b\x31\x7f\x82\xf7\x4e\x25\x61\x09\xea\xa3\xf7\x37\xe9"
+ "\x97\x78\x59\xf3\x6b\x45\x35\x88\x6f\xdc\xbf\x00\xbe\xd9\xe4\x5c"
+ "\xf7\x2f\xa0\x7e\xd5\xeb\x77\xa0\x80\x03\x98\x7b\x1a\xa3\xd0\x3f"
+ "\x78\x14\x73\x3d\x74\x8d\xa2\xdc\x70\x0e\xfa\x78\x0c\xeb\x53\xff"
+ "\x4e\xe9\xdd\xf0\x99\x1b\x01\x9b\x25\xda\x9c\x34\x8a\x58\xa1\x8a"
+ "\xe5\x36\xd9\x37\xcb\x34\x7a\x37\x51\x1f\xc4\x39\x44\xdf\x70\x4e"
+ "\x54\x05\xca\x14\x86\xcb\x60\xfd\x10\x2e\x9b\xa9\xcc\x8f\xe8\x97"
+ "\xeb\x79\xe1\x37\x9f\xfa\xe1\x7a\x1a\xbe\xcb\x14\x73\x7b\xdf\xb0"
+ "\xdd\x40\xed\xfa\xa9\x5d\x03\x70\x03\x78\xa1\xd7\x51\x21\x61\x74"
+ "\x80\xe6\x4f\xe0\xd7\xe1\x40\x23\xc1\xdd\x42\xfc\xbf\x3f\x5d\xf2"
+ "\x77\x66\x97\xd6\x3f\x97\x38\x1f\x8c\x36\x79\x6b\xa5\x9f\x21\xe4"
+ "\x0b\xc5\x7f\x0d\xf3\x99\x66\xf8\x19\x32\x51\x5d\x2d\x1a\x4e\x98"
+ "\x29\x5f\x5b\x08\x87\xe0\xef\x40\xb1\xa4\x81\xd7\xd4\xfa\x0f\xdc"
+ "\xbb\x53\xc2\x2e\xc1\x0b\x1c\x20\x3e\xbe\x5e\xce\x73\xc2\x12\xf0"
+ "\xaa\x12\x0f\x27\x25\xea\x75\x08\x9f\x09\x04\x67\x95\xea\xd0\x71"
+ "\x25\x92\x36\x50\x5e\x92\x1b\xa3\x43\x78\xa3\xd3\x02\x59\xe7\xe4"
+ "\x8d\x9a\x1e\xd5\x4f\x73\x03\x3f\x26\x2e\xe1\x07\x4b\xe0\xe5\xe4"
+ "\xa5\x87\x7d\x01\xd0\xd7\xa3\xd4\x2f\xa2\x09\x93\xf6\xf7\xc5\xaa"
+ "\xde\x30\x6e\x4f\xaa\xd6\x71\x3b\x62\x5e\x05\x6e\x6f\x13\xf4\x68"
+ "\x52\xa3\x87\xfd\x73\xa7\x8e\xfb\x58\xe7\x2a\xad\xeb\x8a\xf5\xe2"
+ "\x7c\xc0\x0c\x7d\xa0\x58\xf7\xfe\x5e\x21\x63\x60\x3e\x5b\xf3\x3b"
+ "\x85\x8f\xfc\xad\x2a\x33\xb5\xfa\x4e\x40\x3f\xd2\x83\xf5\xaf\xaf"
+ "\x71\xcc\x0d\xb5\xe5\x42\x1c\x83\x6d\x44\x03\xb1\x06\x7d\xd4\x27"
+ "\xfa\x66\x82\x4f\xb8\xa6\x15\xa9\x6c\x1d\xcd\xed\xe1\x4c\xcc\xdb"
+ "\xe4\x05\xfa\x9d\x8b\x0a\x49\x03\xe2\x34\x7c\x11\x7d\x1c\x05\x57"
+ "\xb3\x84\xeb\xe4\xd5\x23\xd7\xb7\x25\x0e\xeb\x3b\x12\xae\x80\x29"
+ "\x60\x4b\x79\x69\xfc\x13\xf3\x74\xb8\x86\x61\x7a\x71\x8c\x86\x8f"
+ "\x1a\x6d\x9d\x3c\x26\x6d\xad\x90\x31\x23\x1a\xb7\x62\x2c\xb4\xa7"
+ "\xa0\x7d\x11\x0f\x4b\x93\x7d\x9a\xbc\xc0\xa9\xc9\x01\x0f\x2b\x48"
+ "\xd5\xe9\x18\xf5\x67\x39\xf0\x09\x73\xa5\xd3\x0e\xe8\xca\x64\xdf"
+ "\x2f\xb6\xeb\xf3\x81\x7e\x47\xd2\x04\xea\x93\xb0\xf7\x0a\x8f\xf9"
+ "\xe2\x9f\x51\xb9\xc9\xa0\x6d\x61\xfe\xea\xe2\x9c\x91\x63\xbf\x38"
+ "\x0d\x63\x07\x4e\x38\xd6\x43\x5f\x26\xf7\x32\x8f\x12\x77\x6c\x24"
+ "\xbd\x8a\xfb\x44\xd8\x65\x68\xfc\x18\xe8\xbd\xe3\x3e\x99\x1f\xfb"
+ "\x1b\xe5\x17\xba\x79\x6d\x3f\x84\x8e\x16\x69\xcd\x1a\x0c\x8e\x51"
+ "\xfe\x26\xdc\xe3\x86\x2f\x9f\x8b\x8e\x49\x59\x90\x68\xf4\x21\xc4"
+ "\xce\xa0\x7c\x25\xad\x24\x07\x04\xa2\x19\xab\xd1\xf8\x4d\xd0\x09"
+ "\xbe\x21\xfd\xa2\x0d\xdd\x2c\xc6\x71\x0b\xff\xa6\x4b\x49\x7c\x9c"
+ "\xd6\x91\x1f\xfe\x32\xa9\x6e\x5b\x97\x72\x69\x36\xb5\x9b\xa8\xfd"
+ "\x5a\xe9\xf7\x2e\xfa\xbd\x8c\x7e\x6f\xa2\xdf\xcb\xe9\x77\x3a\xe5"
+ "\x57\xb5\xfc\x29\xf4\x3e\x81\xd2\x6f\xd4\x7e\xa9\x8f\x89\x38\xcf"
+ "\x4e\x7b\x02\x7c\xe5\x7d\x48\x9f\xf2\x39\xde\xe9\xf7\x43\x6d\xdc"
+ "\x2d\x72\x6d\x27\xee\xa7\x7a\xf2\x91\x0f\xfb\x1a\xa5\x39\x28\x4f"
+ "\x19\xea\x86\x5f\x05\x7a\xbe\x2d\x82\x3f\xa5\x7a\x2e\x79\x84\x7e"
+ "\xe7\xd3\xef\xf5\xf4\x9b\x47\xe5\xe1\xcf\x33\x8d\x60\xd0\x16\xa6"
+ "\x17\x09\x4b\xb2\xf2\xe5\x7c\xd2\x1c\x36\x61\xbd\xeb\xf4\x00\xf8"
+ "\x34\x22\xdf\x0a\x99\x4f\xca\xaf\x97\x24\xe9\x73\x17\x10\x73\x67"
+ "\x6e\x0f\xd0\xdc\x51\xfd\xb7\xa1\x3c\xfd\xde\xae\xfd\xa6\x6a\xbf"
+ "\x77\x68\xbf\xff\xac\xfd\x2e\xd6\x7e\x97\x78\x94\x44\x9f\xc6\x9b"
+ "\x10\xcc\x12\x85\x9e\x9c\xd6\xae\xd6\xee\x14\x3b\xe4\x6b\xa2\xff"
+ "\x37\x21\x8e\x23\xb5\x5b\xa3\xeb\xad\xa1\xfb\x19\xde\x1e\x73\xd1"
+ "\x6e\xa1\xfb\xb9\xa4\x21\x82\x16\x3a\xe2\x94\x54\x46\xbc\x53\x74"
+ "\x8d\x81\xf8\x06\x59\x4f\x9c\x41\x3b\xaf\x47\x3c\x18\xc4\xd5\x84"
+ "\x9f\x42\x21\x47\xc5\xdf\x82\x73\xcf\x63\x42\xa7\xbf\x03\x3e\x8a"
+ "\x86\xf2\xe8\xaf\x98\x64\x8a\x6d\x3a\xbd\x87\xbc\x24\xe5\xfc\x89"
+ "\x7f\x19\xdc\x3e\xc5\x16\x96\xf3\x2f\x69\x93\x67\x9b\x97\xfe\x92"
+ "\xd2\x23\xe4\xff\x4b\x4a\xd1\x67\x82\x75\x3b\x8d\x67\x7e\x87\x32"
+ "\x05\x77\xbd\x6f\xe8\x94\x63\x4e\xd1\xc7\xac\xcd\x95\x43\x87\x79"
+ "\xa7\x92\x18\x20\x7a\x98\x0b\xfc\xee\x08\xd1\xe5\xc4\x00\x7e\x35"
+ "\xfc\xa1\x79\x4e\x7c\x19\xf3\x1d\x41\x4f\x52\xc3\x74\x7a\xca\xa1"
+ "\x91\xf3\x92\x70\x28\x20\xf9\x85\x76\x5a\x97\xc0\x81\x6d\xa3\xd6"
+ "\x65\x1a\xd6\xa5\x56\xd6\x3f\x92\xc6\x5f\x9c\x06\x1a\xaf\xf5\x91"
+ "\xf0\x36\x51\xd8\xe8\x79\x94\x29\xed\xda\x9e\xd4\x4e\x7b\xe4\x4d"
+ "\x94\xbe\x54\xf6\x53\xa6\x6b\x6d\x11\xfe\x25\x2e\x06\xfe\xeb\xe9"
+ "\x1a\x7e\xa3\x9e\x85\x98\x6b\x3d\x5d\xab\x9f\xf0\x34\x71\x3e\xd6"
+ "\x8f\x9e\x2e\x71\x72\x52\x29\xe8\x0d\xca\x06\x84\x2d\x23\xc9\xdf"
+ "\xf7\x35\x51\xbf\x2f\x6d\x24\xfe\xa2\x1e\xeb\x79\xeb\x26\x16\xb7"
+ "\xa1\x9a\xc5\xcb\xb5\x79\xe9\xe7\x7a\x59\xa1\xd3\xdf\x7e\x69\x8b"
+ "\x4e\xa3\x2a\x04\x3d\x9b\x9c\x3a\x92\x56\x4e\x5d\xc5\x9d\xe6\x40"
+ "\xc0\x34\xb4\xfa\x48\x60\xbe\xa0\xb9\xb4\xee\x6b\x06\xb7\x5b\x8d"
+ "\x1e\xf6\x8a\x45\xdb\x4b\x5a\x04\xaf\xa6\x58\x7f\x74\xa4\x5e\xd2"
+ "\x2e\x59\xb7\x35\x44\xff\x22\xf8\x10\x41\xeb\xd1\x16\xea\xa2\x7d"
+ "\xc5\xe2\x2b\x4a\xbf\x48\xd2\x6f\x6b\xba\x87\x5d\x99\xa8\xd3\x56"
+ "\xec\x4f\x66\x85\x39\xca\xef\x93\xfb\x93\x0a\x1d\x98\xc3\x27\xfc"
+ "\xd3\xb5\x3a\x7a\x19\xf6\x4d\xf8\xff\xce\xd8\x18\x0b\x9f\x55\xe9"
+ "\xd4\xd7\xbb\x88\x3f\xdb\xab\x9d\xcd\x90\x9c\x7b\x59\x10\xb2\xac"
+ "\x06\x57\x5a\x4f\x97\x1d\xd7\xe6\xe5\x18\xf5\x67\x2f\x68\xfb\xd6"
+ "\xf5\x32\xa6\x12\xf4\x41\x22\xc6\x17\x78\x56\x2b\xf7\x8b\x58\x06"
+ "\xdb\xad\xdd\x11\x3a\x2e\x6d\xbd\x5d\x7a\x44\xc4\xa8\x28\x19\x5a"
+ "\x2d\xf5\x89\x97\x3d\x2a\xd3\x2f\x4b\x97\x76\x08\xc2\xcf\x28\xde"
+ "\x17\x47\x59\xa7\xfc\x4d\xe8\x5f\xa3\x63\x66\x4b\x7e\xe4\xb2\x05"
+ "\x11\x36\x3f\x02\xd6\xc2\xcf\xf1\xf6\xcb\xd2\xc2\xeb\xe2\x32\xf8"
+ "\x82\x36\x52\xd9\x1e\x4a\xcf\xd1\xd3\xe5\x5e\x93\xb0\x50\xd3\x99"
+ "\x39\x2e\xda\x92\xca\x88\x36\x47\xef\x76\xea\xeb\xf7\xb2\x66\xd1"
+ "\xbe\xb6\x7e\x31\x46\xe0\x03\xd6\x70\x00\x7e\xc5\x68\x0d\x63\x2d"
+ "\xd3\x73\x5e\x40\x5f\xbb\x92\xbf\x13\x77\xce\xe4\xba\xbd\xac\x3d"
+ "\xa2\x1f\x95\x1a\xae\x1e\xeb\x7b\xc0\x1a\x47\xdf\x7c\x1e\xc5\x24"
+ "\xcf\xb2\x14\xab\x94\x31\x76\x74\x1c\x54\x07\xb8\x1f\xba\x69\xe8"
+ "\x13\xa0\xb3\xd1\xec\x55\x71\x56\xe2\x83\xaf\xb4\x4a\x5a\x0f\x61"
+ "\xff\x68\x16\xa6\xfb\x47\x1b\xdc\x3e\x75\x71\x58\x77\x6c\xdd\xab"
+ "\x8d\x6b\x35\xb5\x57\xe3\x2a\x7c\x0f\xb8\xf4\x8c\x5c\x63\xd6\x2a"
+ "\xe0\xb1\x9b\x70\x8f\xf6\x9f\xea\xc3\x05\xa2\x6c\xb1\x8e\x7b\xb4"
+ "\x46\xb3\xba\x94\xcb\x27\x55\x4d\xe1\xd5\x34\xa7\xb0\xdb\x5f\x4d"
+ "\x78\x10\xa4\xdf\x2c\xf9\xab\x58\xf0\xab\xe1\x7c\x35\x95\xa5\xf5"
+ "\x3f\xb3\x51\x9f\x03\x5f\xfc\x6c\x87\xc0\xb1\x42\xd8\x37\xa6\x88"
+ "\xb3\x7e\xe0\x18\xf0\x4b\x9c\xf9\x13\xae\x99\xb7\xfc\x0b\x03\x9e"
+ "\x09\x9f\x29\xf4\x8e\xfe\x02\xcf\x06\xb7\x5f\x6e\xd2\x7d\x1e\x7b"
+ "\x94\xa9\xf2\xbc\x6d\xfb\xe5\xd3\x74\xdb\x70\xe0\x61\xde\x4c\x76"
+ "\x09\xd5\x6f\x6b\xb2\xf9\xa0\x3b\xff\xda\x1d\xb8\x83\x21\x2f\x60"
+ "\x27\xe9\xe5\xa5\x4d\x54\x26\x62\xfe\x13\x84\x2d\xeb\xe1\x15\x42"
+ "\x9f\x79\x31\x7d\x5b\x3d\x92\xe6\xc4\xf8\x05\x5f\x49\xd4\xf1\xaa"
+ "\x44\x86\x73\x7a\xda\x6b\x2e\xaf\xd4\xf9\xe1\x79\x94\x46\x79\xd0"
+ "\x3f\xc8\xe0\x6d\xf4\x5c\x89\x7d\x7a\x1c\xbd\xf3\x7c\xe8\x8a\x40"
+ "\x33\xa0\x7b\x82\x1e\x8c\x60\x7d\xb4\x4b\x99\x31\xe9\x08\xfc\x17"
+ "\xad\xfd\xbe\xdf\xeb\xc2\x7c\xde\x0f\x7f\x5a\xb6\x5c\x76\x71\x87"
+ "\x72\x85\x0f\x7a\xa7\xa2\xef\xa0\xe3\x99\x66\x1d\xa9\xe3\x99\x96"
+ "\xa3\xfd\x15\xd0\x9f\x27\xfc\x37\xdd\xa1\x3d\xf7\x9e\xff\x6f\x7a"
+ "\x89\xcc\x3b\xbd\x8a\xfe\xea\x25\xac\xac\xb4\x56\xa6\x15\xe8\xb0"
+ "\x02\x4d\x01\x8d\x85\x9d\x0d\xd6\xb9\x12\x60\xf0\x97\x44\xf3\x44"
+ "\xfd\xde\x7a\xcd\x4f\x5d\x9b\x20\xd3\x4e\x13\xb1\x0b\xe0\xbf\xf8"
+ "\x82\x6c\xbd\x94\x69\x62\x3e\x85\x7f\x59\x65\x9a\x83\xda\x4e\xac"
+ "\x38\xcd\x8c\x8e\x5c\x36\x1d\x3a\x74\x73\x90\xbb\x20\x03\x03\x27"
+ "\x08\x06\x6d\x3d\xca\xf4\x5f\xe6\x6d\x66\x06\xfa\x3e\x83\x9e\x33"
+ "\x75\x5e\x8a\xca\x58\xa2\xfc\x2c\x11\x3c\xd4\xed\x9b\xd9\x8c\xc1"
+ "\xed\xd3\x17\xea\x73\x05\x3e\x03\x7a\xbc\x50\xbc\x2b\x65\x9a\xb0"
+ "\x05\x80\x2f\x7f\x0f\xe0\xa6\xd3\xaa\xd3\xd0\x5d\x4f\xb7\x47\xf9"
+ "\x98\x45\xee\x43\xd3\x8b\x69\x5e\x53\x25\xbe\x4c\x5f\x4c\xb8\x7f"
+ "\x34\xa2\x9f\xff\x14\xf1\xbc\x1d\xe5\xcd\x3e\xf0\x70\xe3\xc1\x67"
+ "\xfa\x11\x1d\x3e\x15\xc2\x07\x28\x73\x88\xf9\x0e\xf0\x5e\xea\x5b"
+ "\x8b\x63\x13\x33\xf5\x28\x57\xbc\x45\x63\xc4\xdd\xe0\x66\xa9\xe3"
+ "\xbf\xe2\x35\x5d\x4e\x97\xfd\xbe\x62\xb3\x79\x4b\x14\x83\x6e\x1e"
+ "\x3e\x23\x85\x2d\xe6\x19\xab\xd0\xc7\xbb\x03\x0b\x99\xab\xf0\xc7"
+ "\xc8\x73\xa7\xb6\x97\x1d\xeb\x2b\xb2\xb2\xc3\xd6\x85\xb4\x8e\xaf"
+ "\x20\xde\xe6\x9c\xe5\x82\x6d\x5e\x95\x2b\x96\x68\xf0\x6d\x11\xb6"
+ "\x22\xca\x15\x97\x61\x2f\x81\x6e\x80\xf6\x11\xf0\x68\x93\xa9\xee"
+ "\xbd\xfa\xba\xa1\x7d\xa2\x89\xca\x58\x25\x8d\x39\x4e\xbc\xc5\x15"
+ "\x89\xf0\x5b\x23\xe4\x07\x99\x3f\x4e\x9e\x1b\x5c\xd1\x1e\xe2\xb7"
+ "\x29\x1f\xca\x09\x1b\x42\x65\x7a\x6f\x46\x10\xba\x84\xe9\xbd\x18"
+ "\x9b\x86\x8b\xb4\x5f\xcd\x30\x85\xd7\xed\xf4\xc5\x62\xdd\xf6\x46"
+ "\xae\xcb\x19\xf6\xb0\x9c\x7a\xf9\xb1\xb9\x55\x6c\x4c\xbb\x27\x47"
+ "\x02\xf6\xaa\x19\xcf\x57\x54\xf0\xfa\x4a\x83\xba\x68\x6b\x39\x8b"
+ "\x53\x4a\x09\x6c\x58\x67\xeb\x33\x2f\xa1\xf5\xb8\xdf\x1c\x77\x69"
+ "\xda\xed\x79\x13\x79\xa1\x95\x19\xca\xce\x4e\x34\xcd\xf4\x5f\x5a"
+ "\xcf\xa3\xae\xf9\xe9\x5d\x79\x38\xfb\xae\x64\xdf\xae\x66\x51\xb7"
+ "\x13\x95\xbb\x2a\x8e\x39\x3c\xca\xcc\x06\xdc\x73\x3f\x1c\x07\x5e"
+ "\x64\x66\x03\xea\x2c\xa8\x61\xa6\x82\x4e\xde\x5d\xfa\xe0\x04\x13"
+ "\xed\xbf\x16\xda\x37\x4a\x2e\x8a\xbb\xb4\x7e\x98\xea\x78\x37\x53"
+ "\x94\x1b\xd3\x46\x44\xf6\xcd\x76\xd3\xd8\x7d\x73\x4c\xe9\x52\x6c"
+ "\x77\x5c\x58\xdf\xae\xf4\x85\xfb\x76\xa5\xef\x7f\xa1\x6f\x9f\x44"
+ "\xf4\xcd\x12\xee\x5b\x0e\xfa\x76\xfc\xc2\xfa\x96\x34\x3f\xdc\xb7"
+ "\xa4\xf9\xff\x60\xdf\x0e\x8c\xdf\xb7\x99\x8f\x8c\xdd\xb7\xfc\x4b"
+ "\xbb\x94\x99\x9b\x2f\xac\x6f\xb3\xf2\xc2\x7d\x9b\x95\xf7\x3f\xe9"
+ "\x5b\x61\x0d\x3f\xd1\x3a\x8d\xc1\x9f\x66\x1c\xe8\x7c\x97\x72\xe5"
+ "\x96\xcd\xd3\x84\x1d\xf7\x64\x7a\xbe\xa9\xa8\x86\x7f\x23\x79\x9b"
+ "\x99\xe7\xe4\x9e\x36\xd3\x4b\xf8\x2b\xed\x4a\x94\x2b\x3d\xc2\xce"
+ "\x25\x6a\xea\x3e\xee\xe4\x81\xeb\x7c\xb0\x19\x0c\xc0\xb7\x0b\x7c"
+ "\xc1\xef\x7b\x75\xc0\x8f\x38\x1c\x8d\x75\x67\x8d\xec\xd5\x01\xaf"
+ "\x61\x70\xfb\x95\xc9\xba\x3f\x57\xbd\xac\xb9\xfa\x7c\xf4\xe8\xca"
+ "\x95\xb7\xe7\x30\x33\xe8\x11\x7e\x11\x4f\xb3\xa2\x70\xa2\xe9\xf6"
+ "\xef\xb0\xef\x5f\x99\xaf\xdf\xd7\xd5\xeb\x5a\xd6\x3d\x91\x9b\x0b"
+ "\x58\x14\xee\x0c\x0b\xdf\x8f\x56\x2f\x4b\x2a\x60\x13\x96\xe5\x53"
+ "\xfd\x7e\x96\x69\xce\xa7\xba\x09\x1e\x92\x97\xbf\xf2\xad\xa8\xd5"
+ "\x2c\xae\x8a\xea\xc6\xef\xed\xd6\x22\xbe\xf5\x79\x66\xc4\xdd\x62"
+ "\xdc\x11\x96\xf7\x83\xa3\x4d\xd4\x8e\x47\x6f\xe7\x07\xe0\x97\x20"
+ "\xe1\x77\xd5\xbb\x61\xf8\x5d\xf5\x68\x18\x7e\x57\xfd\x48\xc2\xef"
+ "\xaa\x94\x30\xfc\x92\x6c\x17\x06\xbf\xab\x56\x87\xe1\x27\xcb\x9e"
+ "\x1f\x7e\x57\xbd\x30\x3e\xfc\xae\x6a\x0c\xc3\x4f\xd6\x35\x0e\xfc"
+ "\xa2\xc7\x86\xdf\x55\xc1\x7f\x0c\x7e\x49\xb6\x7f\x10\x7e\xf1\x12"
+ "\x7e\xb3\x94\x30\xfc\x92\xde\x08\xc3\x2f\x69\xa3\x84\x5f\x92\x23"
+ "\x0c\xbf\x59\x99\x17\x06\xbf\xa4\x03\x61\xf8\xc9\xb2\xe7\x87\x5f"
+ "\xd2\xf1\xf1\xe1\x97\xe4\x0f\xc3\x4f\xd6\x75\x61\xf0\x9b\x75\x33"
+ "\xc1\xcd\xa2\xc1\xcf\x32\x3e\xfc\x66\x65\xfe\x83\xf0\x33\x4b\xf8"
+ "\xcd\xbe\x2d\x0c\xbf\x59\xfd\x61\xf8\xcd\x7a\x53\xc2\x6f\xd6\xc1"
+ "\x30\xfc\x66\xd7\x5f\x18\xfc\x66\xf5\x86\xe1\x27\xcb\x9e\x1f\x7e"
+ "\xb3\x67\x8e\x0f\xbf\xd9\x0b\xc2\xf0\x93\x75\x8d\x03\xbf\x89\x63"
+ "\xc3\x6f\xf6\xe6\x7f\x0c\x7e\xb3\xeb\xcf\x07\xbf\x0b\xe3\x35\x66"
+ "\x8f\x7b\xff\xfd\x02\xeb\x09\x8c\x57\x0f\x60\x08\xfb\x44\x75\xfb"
+ "\xec\x40\xad\x1a\x6d\x92\x77\x38\x66\x37\x90\x0c\x73\x6b\x87\x32"
+ "\xe7\xce\x5a\x75\x82\x89\x3b\xbf\x39\xa6\x3a\x4f\x6c\xe3\x5b\xa2"
+ "\x8d\xea\x96\x89\x46\xf8\x33\x18\x37\xe6\xba\x32\x67\x7f\xd4\x65"
+ "\xec\x0a\xdc\xd7\xdb\x4a\xfc\x1a\x9e\x07\xb7\xcf\x69\x20\x5e\x24"
+ "\x75\x34\x4c\xb2\x56\xad\x13\xc1\x3e\x73\xb3\xb3\x1e\x5d\x93\xb5"
+ "\x72\x4d\x9e\x6d\xe5\x03\x0f\xaf\x1b\xe9\x43\x5f\xc4\xc9\xdc\x86"
+ "\xf9\x9b\xe3\x0f\xf9\x98\x71\xf2\x7c\xf8\xea\x73\x5c\x09\xdb\x34"
+ "\xfb\x02\x11\xd7\x20\x76\x38\x89\x0f\xa7\xef\x4a\xbd\x8a\xbf\x23"
+ "\x7c\x10\x0e\xe7\xec\x22\x79\xaa\x05\x7e\x65\xb4\x73\xa8\x96\x2e"
+ "\xe5\x9a\x9f\xf0\x18\x5e\x09\x9b\x0e\x71\xb7\x43\xb1\xeb\x77\xb0"
+ "\x9a\xb9\xa9\x3f\x49\x2d\x41\x7c\x2d\x5e\x02\x18\xb4\xc2\xff\xdb"
+ "\xfa\xa8\x19\x1d\x4a\x72\x22\x8f\xe9\x4f\xe2\x25\xfd\x76\xed\x8c"
+ "\xc3\x0e\x7b\xd1\xd4\x4d\xfc\x6b\xd4\xa7\xf1\x82\x88\x5b\xe2\x92"
+ "\xfc\xa0\xfd\x88\x79\x8b\x2d\x0a\x79\xe1\x87\x11\xfe\x09\xf5\x58"
+ "\x55\xe8\x37\xf2\x12\x3f\x7e\x2b\x95\xbf\x15\xb1\x3a\x43\x75\xc8"
+ "\x3e\x5d\xdc\xa3\x5c\x6d\x14\x63\x29\xf1\xb5\xf5\x3d\x96\xbe\x4b"
+ "\xc4\x8b\x14\x70\xbd\xf6\x1c\x8d\xa1\x4d\xc4\xf9\x0c\x9c\x11\x71"
+ "\x3e\xb5\x32\xd3\xa9\x8c\xa0\xa7\xf0\xbd\x2a\xeb\xb8\xf6\xb8\xde"
+ "\x2f\xe2\xa1\x63\xe9\xfd\xc3\x88\x36\x2e\xa2\xf7\xd7\x22\xbe\xc7"
+ "\xd1\xfb\x33\xc4\x87\x4e\xd2\xbe\xc7\xd3\xfb\x46\xf0\xa5\x62\x5c"
+ "\xe5\xc5\xd2\x26\x5a\xb9\x76\x05\xa5\x59\xb4\x3c\x93\x28\xcf\x6d"
+ "\xe0\x75\xb5\x3a\x26\xd3\xfb\x2c\xc8\x8c\xda\xf7\x44\x7a\x8f\xc1"
+ "\xb9\x80\xf6\xfd\x92\x1e\xe5\x9a\x53\xf4\x3e\x47\xfb\x4e\x7c\xfd"
+ "\x35\xc2\xd7\x16\xc1\x7d\x1a\xc6\x44\xb0\x77\x00\xee\x04\xeb\x69"
+ "\xdc\xe4\x6b\x21\x79\xb5\x08\xf3\x88\x71\xba\x36\xf5\xb0\x0e\xe5"
+ "\x9a\xcb\x70\x2f\x4f\xce\x15\xaf\x94\xfe\x81\x0c\xe9\x94\x6e\x45"
+ "\x3a\x6c\xcb\xd5\x1d\xdc\x81\x67\x82\xe9\x6b\x80\xa1\xd6\x16\xc9"
+ "\x44\xd7\xa4\x6a\xf3\x4c\xb0\x83\x0f\x5f\x56\x5c\xa7\xcd\x05\xf5"
+ "\x6d\x22\x7d\xdf\x23\xcf\x3d\x70\xbf\x68\x58\xde\x2f\x52\xae\xc9"
+ "\xf9\x6f\xf9\xac\xa0\x72\x92\xee\x5d\xb3\x4f\x8f\x61\x48\x69\xc2"
+ "\x57\x06\xf0\x13\xfa\x15\x6f\x8c\xaf\x51\xf8\x68\x21\x1c\xd5\x71"
+ "\x05\x78\xc2\xa3\xe7\xb8\xa4\xae\xe6\x9a\xd0\xfd\x5f\x2a\x6b\xd3"
+ "\xe2\x3e\x30\x29\x27\x5c\xcb\xc2\xf6\x45\x57\x0b\xfa\x10\xf1\x6d"
+ "\x5a\xc4\x37\xdd\x2f\xa1\xf4\x39\xb5\xfd\xda\x05\x11\xdf\xaa\x46"
+ "\x7d\x5b\x1e\xf1\x6d\xdb\xa8\x3a\x1d\x11\xdf\xf2\x46\x95\x2b\x8d"
+ "\xf8\x96\x39\xea\xdb\xbe\x88\x6f\x69\xda\xb7\x28\x4a\x77\x85\x7c"
+ "\x24\x2a\x57\xa7\x6a\xe9\x44\xeb\xaf\x6d\x8f\x48\x4f\xd1\xd2\xd1"
+ "\xbe\xd7\xc3\xfe\x7a\x4c\x4b\x17\x78\x4e\x78\x34\x5b\xb6\x91\x1c"
+ "\x17\xd1\x06\x93\x32\x96\xaf\x51\xce\x9f\x3d\xdf\xac\xd8\x26\x02"
+ "\xa7\xcc\x5b\x8a\x11\x43\xa8\x52\xfa\x03\x93\xeb\x50\xc4\xa1\x46"
+ "\xac\x5c\xca\x37\x1e\x6d\x1c\xdb\x46\x30\xb9\x58\xbf\xc7\x1a\x2c"
+ "\xf1\x1d\x52\x4b\x86\xa1\x9b\x9e\x01\xbf\x61\x45\xbd\xf0\x1d\xa3"
+ "\xc7\x24\x1c\x62\xee\xbc\xc1\xe2\x56\xbf\xb8\x6f\x8b\xfb\x10\x09"
+ "\xf0\x7b\xd6\x2a\xf4\x3b\xa7\x64\x5c\x42\xdc\xef\xdd\xe1\x3b\xb4"
+ "\xa1\x97\x4d\x73\xdc\xc2\x3b\x21\xe7\x49\x9a\x90\x0c\x7a\x62\xd6"
+ "\x68\xda\xf3\xc2\xd6\x5b\x99\x9b\x82\x34\x77\xaf\xd0\x33\x9b\xba"
+ "\x94\xb9\xc5\xfa\x77\x39\xde\xb9\xc5\x42\x96\xd6\xee\x15\x0e\x6e"
+ "\x9f\x6b\x0f\xc5\xcd\x54\xe6\x6e\xeb\x8f\x57\xba\x29\x6d\xe1\x48"
+ "\xfb\xc6\xb9\xf7\xa0\x4e\x8c\xc3\xa3\x24\xfb\x51\x37\xe5\xc9\x0c"
+ "\xd9\x37\x52\xfa\x86\x00\x9b\x4a\x7d\xeb\xd2\xeb\xa7\xef\x24\xff"
+ "\x27\x0b\xb9\x12\x75\xf6\x97\xd9\xad\x94\x56\xe5\x31\xbc\x5f\x2c"
+ "\xed\x23\xe7\xd6\x7b\x58\x47\xca\x78\xfb\x9f\xd0\x49\x9a\xf8\x3e"
+ "\x5e\xc2\x0f\xd2\x9a\xaf\x17\xf6\xca\x31\x7c\x9f\x94\xe5\xe7\x9e"
+ "\x42\x2c\x32\xc4\xf0\xc6\xb9\xa3\xa4\x3b\xd7\x09\x7b\x08\xa4\x11"
+ "\x6c\xf6\x11\x7d\xbe\x70\x5f\xa1\xca\x5c\xb1\xff\xc1\x77\x13\xee"
+ "\x5c\xe0\x0e\xc7\xe0\xf6\xeb\x96\x84\x62\x3d\xe8\xf7\x09\x94\xeb"
+ "\x7e\x09\x1d\x5f\x85\x2a\xfb\x38\xba\x0f\xe8\x2f\xd5\xd5\x3b\xee"
+ "\x5e\x6a\xe2\x42\x57\x44\xbc\x4c\xb3\xb4\x25\xbb\xee\xcd\x28\xeb"
+ "\xe5\x04\xf7\xeb\x1a\x42\x31\x2e\x28\x4f\x39\x6c\x82\xa9\xfe\xd0"
+ "\x38\x73\x45\x1b\xc7\xa4\x9e\xfe\x3a\x2f\xd1\xb1\xfa\x8a\x21\x66"
+ "\xd4\xd2\xbd\xad\x01\x3f\xee\xd6\x8f\xe9\x83\x0b\x7b\xa4\xf0\xdf"
+ "\xb4\x93\xd7\xe3\xfe\xc4\x3c\xbf\xde\xe7\x79\x5e\xd8\xed\xa3\xcf"
+ "\x12\xb6\xf3\x4e\xe8\x70\x2c\x3b\x4b\x75\x17\x7e\xc1\x3a\x95\x79"
+ "\x8f\xc0\xbe\x45\xc0\x64\x93\x6e\x73\x35\xef\x11\x91\x6f\x28\x94"
+ "\x47\xe8\x3b\x60\xef\x0b\x38\xd5\xc2\xef\x00\xd5\x59\x4e\x73\x21"
+ "\xe2\xd8\x2a\xf3\xde\x10\xfa\x4d\xfa\x2e\xc6\x2d\xec\xd9\x52\x12"
+ "\x25\xae\xcc\x3b\xe0\x51\x52\x6c\x12\x07\x65\x1a\x62\xc0\xc3\x0e"
+ "\xe1\xb4\x32\xaf\x0c\xb1\x64\x09\x1e\x07\xe1\xbb\xae\xd5\x47\xeb"
+ "\x25\x7f\x08\xb8\x70\x10\x31\x03\x3d\xca\x3c\x19\xcb\xca\x04\x98"
+ "\xcf\x83\xaf\x3e\x71\xc6\x83\x38\xba\x04\xd3\x81\xc1\xed\x29\x21"
+ "\xfd\x07\x62\xf6\x52\x9e\x71\x7d\x37\x02\x46\x41\xea\x73\x2b\xf1"
+ "\xab\xae\xa9\x5f\xa0\x7f\x9f\xa8\xb1\xbc\x1e\xf6\x93\xf4\x2c\x7d"
+ "\x5f\x94\xc8\xb9\x93\x78\x90\xb2\x3f\xca\x3a\x6d\x66\xab\xc4\x05"
+ "\x19\xc7\x5c\x49\x49\xd3\xe0\x27\x62\x5e\x54\xae\x97\x70\x90\xf9"
+ "\xaf\x37\x4a\xbd\xcc\xb4\x39\xd4\xaf\xfa\xb0\x5e\xe6\x7a\xa3\xd0"
+ "\xa9\x69\x36\xd6\xf4\xed\x50\x44\x9f\x7d\xe2\x1e\xe0\x59\xc8\xd4"
+ "\x29\x59\x68\xab\x0c\xbe\xc5\x80\x17\x3d\x91\xf8\x9f\x72\x07\xfa"
+ "\x09\xdb\xbc\x60\xcc\x50\x33\xdf\x31\xd4\x02\x38\x53\x99\x02\x5a"
+ "\x0b\xf5\xe3\xc4\x89\x17\x71\xaa\x06\xb7\x5f\x9f\x1c\x11\x7b\x97"
+ "\xf6\xc1\xeb\xef\xd5\xf7\x39\xec\xd1\xf0\xf3\x10\x4a\x2b\x5b\xd4"
+ "\x4e\x3c\x0e\xd3\x78\x9c\x71\xe3\xc4\x57\x5c\xc7\x52\x70\xd7\x18"
+ "\x76\xda\xc0\x37\x1e\xb7\x28\x1f\xbe\x93\xe1\x07\xd2\xb5\xe9\x06"
+ "\xea\xef\x0d\xf1\x4f\x4f\x11\xf7\x1b\x7d\xae\xeb\xce\xc2\x46\xa7"
+ "\xb7\xab\x40\xf8\x37\x32\x2d\xcb\x0f\xf0\x3a\x19\x7b\xdb\xcb\xe3"
+ "\x17\x61\xff\xed\x15\xb1\x03\x50\xe7\x7f\xd7\x0f\xb0\x72\x7d\xbb"
+ "\xc6\xcb\xf4\xd2\x5e\x7e\x29\x8d\x47\xdc\x67\xa4\xe7\x29\x3d\xca"
+ "\x8d\x37\xc9\x78\x91\xd2\x97\xbd\x66\x6b\x18\x2d\xef\xe7\x7b\x99"
+ "\xb8\x2f\xad\xdc\xb0\xdf\x76\x0d\x63\xbd\xca\x0d\x2f\x0b\xbf\xd2"
+ "\x25\xfd\x16\x0d\x06\x96\x0a\xd9\x2f\x73\x46\xbe\x41\xf4\x11\xfd"
+ "\xbb\xb0\xbe\xdd\xa0\xef\x97\xd1\x83\xdb\x6f\x68\xd4\xef\xf5\x8b"
+ "\xf1\x6b\xfe\xa6\x5d\x57\x42\x6e\xb9\x71\x96\xc4\xc1\xfe\x44\xad"
+ "\xed\xc4\xff\x85\xb6\xbd\xda\x7e\xd8\x2d\x7c\x6e\x13\x5c\x88\x7f"
+ "\x24\x5a\x74\x63\xaa\xbe\x9f\x6a\x36\xf2\xc9\x72\x9f\xbf\x31\x3d"
+ "\xbc\x97\x4a\x18\x8e\xb8\xb3\xb3\x76\x6d\x9e\x8d\x18\x76\xc7\xca"
+ "\xbc\x07\x72\x6c\xd9\xb9\xff\x1f\x7b\x5f\x03\x17\x55\x99\xef\xff"
+ "\xcc\x01\x15\x6d\x06\x26\xd7\x6d\xa9\x45\x9b\x5a\xaa\xb1\xb5\xa2"
+ "\xcd\x8a\xca\x8a\x34\x77\xa9\x55\xb1\x56\x77\x29\x4d\x51\x51\xc7"
+ "\x44\x1d\x11\x11\x15\x79\x4b\x59\x22\x66\x60\xc3\xed\xa2\x02\x5a"
+ "\xd7\xfa\xdb\x6e\x2f\xd4\xb5\x7b\x69\xaf\x6d\xd3\x65\x06\x46\x1b"
+ "\x18\xb6\x3f\xdd\x8b\xbb\xfa\x6f\x72\xc9\xc8\xd0\x26\x45\x19\x99"
+ "\x99\xf3\xfc\x7f\xbf\xf3\x9c\x61\xce\x00\x03\x33\x03\xbe\xe4\x95"
+ "\xcf\xe7\x7c\x0e\xe7\x39\xcf\x3c\xe7\x79\x7e\xbf\xef\xef\xed\x79"
+ "\x4d\x5f\x93\xae\xc2\x0d\x6f\x7a\x9d\xab\x14\x41\x0b\xef\x49\x13"
+ "\xcf\x7e\xdb\xd7\x73\xf6\x5b\xe1\x3d\xfb\xa5\x67\xf2\xd9\x64\xf7"
+ "\xd4\x0e\x4f\x5c\x73\x8f\xdf\x75\x7e\x65\x1c\x5f\x03\x57\x2d\x5c"
+ "\x06\xb8\xcc\x18\xe7\x2c\x74\x90\x04\xb0\x8f\xc2\x98\xb0\x77\xbd"
+ "\xfa\x3d\x25\x38\x0e\x7e\x4c\x36\xf9\xee\x6a\x3e\x9c\x08\xfb\x9a"
+ "\x14\xf0\x38\x97\x04\xf7\x47\xaf\x85\xcb\x00\x97\x19\x2e\xe1\x77"
+ "\xfc\x7f\x09\x6b\x6d\x6b\xa4\xef\x70\x6c\x9a\x16\x18\xa6\x60\x1e"
+ "\x9a\x1f\x2e\xf8\x21\xfc\xcb\x2c\x5f\xaf\x3a\x70\xb4\xf0\x8e\xfd"
+ "\x62\x3e\x41\x37\x44\xe6\x13\x55\x3f\xf9\xc2\x68\xe1\x6d\x36\x31"
+ "\x9f\xb0\xf6\xdd\xd3\x1e\xdc\xbb\x1f\xf2\x7b\xf2\x85\xd3\xc2\xbb"
+ "\xb5\x62\x3e\xb6\xa7\x59\x01\xd7\xdf\x77\x47\xd0\x82\x73\x31\x62"
+ "\x3e\xa5\xb4\x3c\x49\x9e\x91\x7c\xe1\x8d\x8f\x63\x1e\x3e\x3f\x9c"
+ "\x9d\xc3\x52\x78\x4f\x0b\xe4\xef\x37\xd6\x0b\x8e\x4f\xf7\x66\xf7"
+ "\xe6\x93\x76\xc9\x8a\xa5\x0f\xae\x58\x9d\x89\x27\x49\x65\xac\x59"
+ "\x9f\x81\xf7\xd5\x8b\x56\x0a\xb7\x35\x0b\x97\x2d\x61\xff\x64\xa4"
+ "\xc5\xe1\x3f\x69\x80\x37\xbc\xa7\xae\xd7\xe2\x6d\xc9\x1a\x7c\xcc"
+ "\xd2\x4c\x5a\xbf\xc4\x73\xa4\xb7\xcf\xbe\x4b\x5d\x85\xf7\xc5\xda"
+ "\x64\x93\xc7\x31\x7f\xe4\xbe\x38\x9b\xec\x36\x61\x1c\x38\x2a\xdf"
+ "\x46\x4c\x6a\xe1\xec\x3f\xd2\x67\xbf\x02\xd9\x7d\x0f\xe3\x7e\x05"
+ "\x51\xf9\xda\x25\x51\xae\x15\x4b\xe9\x8b\x4e\x2c\x27\xcd\x46\xf6"
+ "\xb2\xb5\xe5\x45\x67\x55\xc2\xbe\xa1\x85\xf7\x1e\xf0\xcc\x2f\xe4"
+ "\x8b\x3a\x5b\x70\x3f\x7c\x61\xbe\xd1\xcb\xb8\x17\xce\x59\x5c\x7b"
+ "\x15\x53\xfd\xb2\x70\x2e\xcd\x38\x78\x7f\x04\x9e\x63\xe1\x39\x1a"
+ "\x9e\x63\xf8\xa2\xaf\x52\x70\x7d\x22\x3c\xab\xe0\x39\x16\xca\xb7"
+ "\x78\xe4\x42\x4a\x1b\xf1\xb0\xb9\x07\xfb\x8d\x8f\x7d\xf7\x98\x02"
+ "\xd9\xba\x5f\xe9\x39\xcb\x57\x38\xb7\xb7\xf0\x7e\x55\xcf\xb9\xbd"
+ "\xc2\x59\x4e\xca\xf9\x82\x5d\x13\x6c\xfb\xfd\x55\x61\xd1\xe3\x33"
+ "\x99\x1f\x7e\x7f\xa2\x67\x4f\x06\xe6\x67\xdf\x9f\x2c\x39\xf3\x18"
+ "\x9f\x35\x3d\x67\x1e\xb3\x7d\xc9\x76\x0a\xfb\x1e\xc9\xee\xaf\xa1"
+ "\x85\xf7\xb5\xf6\x9c\x4f\x57\x78\x7f\x99\xf4\x7c\x3a\x1b\xbc\xc7"
+ "\xf8\x06\xd2\xf7\x79\xed\xe0\xfd\x53\xf0\x9b\xfd\x9d\xef\x0c\xf1"
+ "\x79\xd6\xc2\x8d\xe0\x8b\xc3\x5d\xf0\xcb\x45\x1f\x18\xd3\x69\x41"
+ "\x02\xee\x6f\xa3\xc2\x77\xe8\xfb\xf5\xdb\xe7\x80\xe7\x2b\xca\xe2"
+ "\x1f\xc3\x7d\x77\xed\xb9\xa9\xb2\x9f\x55\xe3\x1c\x24\x78\x66\xfb"
+ "\x46\xd2\x53\xb2\x78\x61\x1d\x9b\x67\x4f\x39\xe9\x9a\xf8\x7e\xd7"
+ "\x1e\x7c\xe6\x19\x33\x4e\x5b\x13\xe5\x5a\xb4\x94\xf9\x71\xf1\xaf"
+ "\x32\x5d\xda\xcd\xd6\x7d\xca\xe2\x4b\xe8\xd3\xec\xbc\x13\x9b\xec"
+ "\x01\x25\xae\x47\x8a\x92\xa5\xad\xa1\xf0\xdb\xa8\xac\x45\x4b\x85"
+ "\x34\xc8\xf7\x02\xf8\x5a\x62\xfd\xd6\x5a\x63\xda\x09\x3d\xe7\x66"
+ "\x6b\xfd\x65\xf1\xda\x05\xe3\xf3\xf0\x3b\x11\x82\x1f\xf1\x19\x91"
+ "\xe3\x59\x81\x58\xb7\x6a\xc9\x9e\x77\xa5\x90\x86\xf3\xb1\xce\x3c"
+ "\x4d\x84\x7d\x7f\xc5\xba\x68\x85\xb3\xca\x0a\x1f\x88\xf0\xec\x99"
+ "\x63\x83\xb4\xde\xed\x79\xfa\x37\x82\x84\xdc\xb2\x64\xd2\xec\xe9"
+ "\xf0\xdf\x24\xf1\x98\x5b\x29\x76\x62\xce\x8c\x71\x47\x9f\x79\xa3"
+ "\xf4\x5f\x84\x73\x22\x0b\x1f\x48\x06\x3e\xb9\x04\x7e\xbf\x30\xef"
+ "\x1b\xd4\x2d\xc2\xf9\x89\xb8\xae\x90\xef\x84\xef\x4e\x79\x42\xd8"
+ "\x5f\x97\x63\xfe\xa2\xb0\xaf\x5d\xe1\x03\x31\x74\x4c\xa7\x81\x9d"
+ "\x11\xeb\x34\x00\xff\x04\xbb\x8f\xb2\x21\xac\x9f\x54\x62\xdb\x1f"
+ "\xa8\x01\x9d\x3a\x0d\xae\xdf\xb1\xf3\x61\xe6\x7d\xe3\x29\x17\xf7"
+ "\x8f\x02\x6c\xa9\xe1\xae\x84\xef\xb7\xf6\xcc\x11\xea\x59\x93\xf9"
+ "\xc0\x79\xdc\xdb\xaa\x67\x7d\xae\x6c\xca\xbd\xcc\xaf\x7c\x30\xdc"
+ "\x46\x6e\x2d\x63\xf2\xfd\x20\xe0\xdf\x2c\xae\xcd\x7a\x10\xe2\xdf"
+ "\x5f\xa7\xf8\x96\xf1\xe0\x52\x4f\xdf\x07\xe3\xdd\x83\x09\x80\xc5"
+ "\x69\x70\xfd\x0e\xf2\xcf\xf0\x9c\x91\xfd\x02\x27\xac\x2d\x3a\x1e"
+ "\x16\x4d\xe2\x20\x3d\xd5\x93\x3e\x42\x96\x00\xb4\x79\x30\xc3\xa3"
+ "\x4f\xce\x8c\xe9\x6e\x81\xe7\xad\xe0\xa7\xbb\xc4\x67\x1b\x3c\x6f"
+ "\xf7\x3c\xc3\xff\x7b\x3c\xfa\x06\xe3\xb3\x33\x9b\x93\x77\x60\xfc"
+ "\xb7\x24\x1a\x7c\xb2\x68\x8c\xaf\x1e\x84\xf8\xb7\x41\x88\x95\xce"
+ "\x44\xde\x1a\x77\xa6\xe0\xd0\xa4\xce\xc8\x47\xb4\x9d\xa0\x43\xe1"
+ "\xdd\x11\x1b\xf9\xf3\x7c\xb1\x9c\x76\x1b\x57\x6f\xf6\xf2\x23\x2c"
+ "\x0a\x68\x7c\x84\xb5\x69\x8a\x0a\xfe\xb7\xe1\x79\xe5\x5d\x85\x0f"
+ "\x29\x6d\xb2\xfb\x1c\x42\xbe\xcc\x8e\x3d\x25\xdd\xca\x39\x56\x88"
+ "\xe0\x0d\xcb\x10\x2b\x0f\x09\xeb\x93\x75\x9b\x94\xb3\xd1\xe7\xc3"
+ "\x7d\x08\x84\xfd\xc9\x70\xcf\x49\x17\x19\x29\xec\xf3\xaf\xbb\x4d"
+ "\x2d\xec\x6f\xbf\x41\x2d\xf7\xec\x37\x09\x72\xaa\xa5\xdc\x3b\x19"
+ "\xb8\x07\xa5\xd0\x97\xd6\xa5\x8e\x14\xf6\x9d\x14\xf7\x9b\xac\xca"
+ "\x24\xe3\x2a\x79\xb6\xdf\xa4\xb0\x47\xc1\x00\x7b\x4e\xd2\x82\xaf"
+ "\x27\x7b\xf6\x9c\x04\x3a\xe0\xda\x43\x35\x3d\xe7\x72\xc0\x3d\x56"
+ "\xb2\xd7\x4d\x78\xbf\xfb\x4f\x72\xa0\x37\x39\xb6\xff\x64\x70\xf6"
+ "\xe6\xa1\x0e\x86\x93\x29\x93\x3c\x67\x78\x4b\xd2\x12\x40\x5e\x44"
+ "\x3f\xe7\x01\x87\x98\x36\xc7\x46\xea\x3b\x7a\x7c\x33\xd0\x77\xd8"
+ "\xa7\x08\xef\xb3\x69\xae\x66\x87\x54\xae\x88\xf0\x87\xa6\x7b\x04"
+ "\xd8\xe5\x91\x70\x8d\xc2\x2b\xb1\x47\x7f\x9c\xa3\xad\x18\x23\x44"
+ "\xc9\xc0\xde\x64\x85\xd1\x24\x97\x2b\x6c\xa1\x4b\xd6\x82\xbe\x27"
+ "\xae\xb9\x4e\x72\xbb\x70\xed\x7f\x78\x92\xfb\x0c\x9e\xaf\xd9\x82"
+ "\x6b\xc9\x4a\x97\xe1\xda\xc6\x1b\x29\x9e\x53\x93\xe4\xfe\x8e\xee"
+ "\x66\x6b\x36\x9b\xc5\x33\x33\x2d\xee\x4c\x6a\x06\x3e\xc8\x31\xee"
+ "\xc0\xfd\xb7\x22\x65\x0e\x12\xa9\x0d\xfb\x78\xd6\xd9\x8f\x29\xee"
+ "\xbd\x85\x67\x94\xf1\x85\x0e\xd0\x95\x2a\xd9\x42\x57\x58\x9e\xd5"
+ "\xd5\x26\x9c\x13\x90\xe4\x1e\x45\x93\xb2\x1e\xa6\xc2\xd9\x62\x99"
+ "\xd4\x08\x7a\x36\x4c\x38\x43\x7b\x23\x3d\x03\xff\x47\x24\x6d\x3c"
+ "\x43\xf1\x7c\x4f\x28\xdb\x9c\xe4\xe2\xbb\x93\xb2\xf8\xdc\x85\x59"
+ "\x32\xf8\xdd\x3f\xe1\x77\xff\x84\xfa\xc4\x41\x99\x4a\x78\x7e\x94"
+ "\xee\x5e\x86\x6b\xa0\xf2\x84\xd8\x07\xda\x68\x10\xd7\x95\xd6\xe2"
+ "\x99\x9e\xb8\xcf\xf8\x42\x97\x21\x6f\xb7\xb8\x4e\x54\x38\x5b\x36"
+ "\xcb\x49\xc5\xef\xc4\x27\x6d\x24\x8f\x2e\xdc\x78\xa3\xb0\xde\x14"
+ "\xd7\x52\x25\xb9\x54\xf0\xcd\x3c\xa4\x87\x5c\x38\xcf\x5b\x58\x4f"
+ "\xf5\x70\xeb\x40\xe7\x7b\xf6\x1b\x6f\x17\x8f\x4d\xa6\xba\xba\xfd"
+ "\xb4\xf8\xc7\x6a\xaa\x33\x4e\xa6\x45\x4e\xd4\xcf\x32\x5a\xfc\x13"
+ "\x07\x3c\x43\xfa\x0d\x66\xaa\x33\x4d\xa6\xc5\xe3\x2b\xe0\x0e\xcf"
+ "\x2a\x0d\xd5\xd5\x4f\xa6\x85\xce\x38\xf8\x1d\xd8\x31\x17\xfe\x2e"
+ "\x8e\x16\xba\x55\x70\x87\x67\x3e\x1a\xf2\xc1\x33\x55\xc2\xbd\x86"
+ "\x16\x63\x3f\xcb\x23\x95\xf0\x9b\x38\x5a\xfc\xb3\x78\xf6\xad\x5b"
+ "\xe3\x85\x6f\x15\x4f\x8c\x67\xdf\x98\x14\xcf\xbe\x71\x57\x3c\xfb"
+ "\xc6\x2f\xe2\x85\x6f\x14\xe3\x5e\x24\x75\xb5\xb4\x98\xd3\x42\xbe"
+ "\x78\x5a\x1c\x66\x83\x3b\x3c\x8f\x98\x0d\xf9\xe0\x79\xa4\x01\xee"
+ "\xf0\x1c\x01\x75\xa9\x87\xe7\xd1\x7b\x20\xff\x01\x5a\x7c\xcd\x38"
+ "\xc8\x37\x85\x16\xcb\x8b\xe0\x0e\xcf\x0a\x17\xe4\x83\xe7\x28\x28"
+ "\xc7\x04\xcf\xca\x36\xc8\x0f\xcf\xf7\x62\x7d\x0c\xb4\xf8\x3e\x2c"
+ "\x37\x81\x16\xc7\x63\x7e\x78\x7e\x10\xca\x33\xc1\xf3\x43\xad\x70"
+ "\x87\xe7\x87\xf3\x20\x3f\x3c\x3f\x0a\x6d\xad\x33\xd2\xe2\x84\x16"
+ "\xc8\xf7\x38\x2d\x9e\x0a\xe9\x46\x78\x7e\x7c\x12\xe4\x83\xe7\xe9"
+ "\x98\x1f\x9e\x7f\xb5\x15\xf2\xc3\xf3\x13\x48\x23\x33\x2d\xfe\x75"
+ "\x19\xe4\x4b\xa4\xc5\x33\xed\x70\x87\xe7\xd9\x58\x7f\x78\x7e\xba"
+ "\x06\xee\xf0\x3c\x17\x68\x55\x0f\xcf\xbf\x83\xfa\xd5\x41\x6c\xfa"
+ "\x0c\x96\x3f\x83\x16\xcf\x47\xfa\xc0\xf3\x02\xa0\x9f\x09\x9e\x17"
+ "\x01\x3d\x4c\xf0\xbc\x24\x15\xf2\xcf\xe8\x9f\x9f\xcb\xa6\xd0\xfc"
+ "\x91\x84\x16\xaf\x99\x4f\xf3\x47\xc1\x7d\xad\x9c\xe6\x8f\x50\xd3"
+ "\xe2\x8c\x34\x48\x87\xfb\xda\x36\x78\x9e\x24\x3e\xc3\x3d\xfd\x00"
+ "\x3c\xc7\x89\xcf\x70\x5f\xb7\x1d\x9e\x27\x8b\xcf\x70\xcf\x8c\x81"
+ "\x67\xa0\x6d\x66\x27\x3c\xe3\xbd\x08\x9e\xa7\x88\xcf\x70\xcf\xaa"
+ "\x85\xbb\xcb\x3e\x5e\x9f\x65\x57\x94\xc7\xd9\x15\x0d\x7b\x70\x3e"
+ "\x92\x5b\x5f\x57\xc3\x47\x1a\x71\x6f\xe0\x91\xb9\x67\xc9\xa8\xe3"
+ "\xb2\xc7\x9e\x42\xbb\x67\xcd\xb6\x09\x67\xd5\x89\xfb\xcd\x8d\x3c"
+ "\x26\x4b\x58\x0a\x76\x3e\x1e\xcf\x2c\x87\xb6\x77\xd0\x82\x11\xa7"
+ "\xa1\xcd\x69\xb4\xe0\x9a\x63\x70\x87\xe7\x6b\x3f\x83\x36\xc3\xf3"
+ "\x7d\xc5\x70\x87\xe7\x79\x53\xa1\xed\x69\x5d\x85\x09\x46\x9b\xec"
+ "\x61\xa6\xb3\xdf\x28\x2d\x8b\x72\xe5\x82\x9e\x00\x3d\xba\xa3\x29"
+ "\x25\xca\x95\x02\x74\x32\x27\x44\xe1\x99\x12\x55\xfa\x5a\x1a\x59"
+ "\x2e\xd4\x09\xcf\x8d\xa1\xce\x58\x8e\x7d\xfb\x1a\x0a\xdf\xfe\x1e"
+ "\xfb\x33\x69\xe4\x9f\xfd\xbc\x7f\xec\x5a\xe1\xfd\x0d\x4d\x5a\xf6"
+ "\x5e\x49\xbc\xef\x7f\x87\xef\xef\x8e\xc2\x3e\xe8\x09\x39\x5a\x9b"
+ "\xec\xb1\x64\xcc\x63\x93\x25\x64\xd0\x82\x30\x62\xed\x6c\x17\xdb"
+ "\x38\x0a\xf3\x3d\x83\xbf\xf3\xd7\xaf\xc2\x97\x58\x2a\x74\x05\xb4"
+ "\x19\x63\x48\xd0\xfb\x9c\x2a\x27\xb6\xf6\x98\x6c\x9a\xba\x4a\xe8"
+ "\x1b\x68\x8a\xc7\xb5\x3d\x50\xc6\x49\x67\xb1\x4b\xa9\xda\x14\x05"
+ "\xe5\x4d\x9b\x98\xeb\xa0\x9d\x86\x9c\xa9\x60\x9f\x84\xf4\x19\x6c"
+ "\xbe\xb8\xf0\x7f\x3c\x9b\xe3\x23\xfc\x1f\xcb\xfa\x39\xa7\xa9\xf1"
+ "\xb7\x52\x9f\xdd\x5d\x98\x16\xcd\x47\x36\x25\xb0\x31\xaa\xc7\xbe"
+ "\xff\x88\xb7\x71\x51\x19\x64\x84\x6a\xd3\xc7\x50\xfe\xd4\x78\xdf"
+ "\xf8\xce\x93\x57\x78\x37\xfe\xaf\x90\x77\x97\xd0\x17\x33\x35\xd1"
+ "\xd3\x8f\x4b\xa1\x0d\x2f\x31\xdf\x26\x01\x6d\x11\xf3\xd1\xa6\x9a"
+ "\x71\x4f\x4b\x97\xdc\xac\x72\x95\x94\xab\xdc\x25\x4d\xf1\x54\xdf"
+ "\x94\x10\xe9\x92\x11\x36\xd7\x7e\xaa\xfb\x2e\x07\xf6\x91\x1d\xc2"
+ "\xbc\x1f\xf0\x23\xd7\xcf\xb8\x33\x8b\x70\x86\xf4\xbf\xe3\xf3\x59"
+ "\x5a\xb8\x69\xbf\xb5\xa3\x95\x18\xd2\x85\xb2\x3a\x69\x61\x61\x38"
+ "\x3f\x32\x2f\xae\x1a\x7d\xcb\x2c\xec\xdb\xf9\x0c\xd3\x37\x02\x9d"
+ "\xc1\x87\x9f\xda\xe2\xa9\x0b\xee\xed\xaf\x03\xda\xa1\xdf\x87\x6b"
+ "\xa3\x17\xba\xdd\xb8\x8f\x53\x91\x0d\xe8\xc0\xfa\x07\xa7\xd6\xa2"
+ "\x9e\x65\xdf\x9d\xa6\xe0\xc7\x38\x5d\x4d\xf3\x71\x1c\x54\x89\xfb"
+ "\xe2\x74\x0a\x6b\x29\x5d\x78\x1e\x1f\xda\x37\x96\xd7\x67\x3f\xe3"
+ "\x25\xda\x85\x9b\xb4\x6b\xd2\x33\x16\xae\xd7\x3e\xa8\x82\xc0\x4b"
+ "\xb5\x66\x99\x6a\xd5\xd2\x55\x6b\xd2\x37\xf6\xf6\x0f\x23\xba\x0a"
+ "\xa7\xa5\x01\x36\x84\xbd\xf2\x0f\x82\xcf\xc9\xfa\x8c\xa7\x4f\x41"
+ "\x5e\xef\x78\x85\x9d\xff\x00\x79\xca\x6c\xe4\x75\x21\x8e\xe0\x2b"
+ "\x9a\x92\x69\xa5\xbe\xf6\x45\x5c\x13\xbe\x1e\x7d\x7c\x3b\xb1\x92"
+ "\xd3\x50\x37\x76\x16\x60\x13\xee\x5b\x90\x99\x4d\x0d\x99\xa7\x11"
+ "\xe3\xa0\x1f\x1a\x12\x69\x55\x29\x39\xaf\x2b\xaf\x38\x26\x9b\xae"
+ "\x3a\xaf\x6b\x88\xf7\x9c\xd7\xe3\x2e\x69\xa8\xe0\xe5\x96\x1a\x3c"
+ "\xaf\xc7\x49\xa3\x49\x23\xd0\xb2\xbb\xc8\xd9\x0e\x3a\xbe\xad\xaa"
+ "\x00\xec\x0e\xc4\x06\xc2\x7e\x09\x6f\x94\x6a\xdd\x54\x1d\xee\x2e"
+ "\x20\x11\x70\x8f\xa4\x91\x8d\x36\xa7\xdc\x1c\x87\xef\xf1\x9c\x1e"
+ "\xb7\x53\x4d\x72\x5a\x28\xff\xac\x06\x70\x53\x40\xa8\x70\x36\xaa"
+ "\xe6\x24\x81\xf4\x31\xbc\xbe\xc1\x70\x3c\x91\x70\x98\x17\xfc\x1a"
+ "\x32\x1f\xfe\xcf\x5e\x44\x14\x90\x2f\x2a\xfb\x20\xa4\x77\xa9\xc7"
+ "\xb8\x72\xd5\x11\xdd\xb9\xea\x31\x4e\xaa\x96\x5b\xdb\x1c\xc4\x79"
+ "\x4b\x69\xde\x1d\x76\x12\xbe\x03\xfc\x9f\x2a\x1e\xe4\xab\x52\xbf"
+ "\xc7\xbd\x59\x3d\xd2\xb5\x59\x1d\xee\x74\xaa\x23\x5c\x1b\xd4\xe1"
+ "\xdd\x1b\xd4\x23\x9d\x5d\xea\x08\x6b\xaa\x9d\x1c\xb2\xff\x89\x34"
+ "\xb5\xb5\x0b\xfd\x8a\x4e\x45\x63\x87\x53\xd1\x60\x91\xb7\x91\x71"
+ "\x77\x6a\x09\xfa\x43\xb2\x9d\xe0\x03\x03\x26\xe4\xae\xd7\x4b\x41"
+ "\x7f\x36\x96\x01\x7d\x47\x4c\x9f\x48\xbf\x73\x17\x3e\xd9\xa2\x7a"
+ "\x12\x74\x51\x7e\x78\xcc\x71\xd9\xe3\x80\x9f\xdf\x3d\x4e\x0b\x7f"
+ "\x53\x02\xf1\xb8\x0a\x2e\x88\x6f\x05\x3e\x80\xef\xf5\x04\xe8\xb4"
+ "\xf0\x18\xcc\xcb\xf2\x25\xb5\xda\x84\xfb\x0c\xb5\x70\x86\x69\xe1"
+ "\xb4\xc9\x55\x42\x9c\x36\xbd\x67\xfe\xaf\x31\xbc\xff\x75\xe7\x90"
+ "\x67\x7e\x4f\xbc\xcb\x83\x3e\xd1\xd5\xf5\xdb\xbf\x48\x8b\xcf\x1c"
+ "\xc1\x31\x49\x1e\xe8\x06\xf5\x6d\xc4\xbd\xa2\x68\x6e\xa2\x18\x63"
+ "\x4e\x17\xc6\xd6\x71\xad\x36\xf6\x43\x88\x69\xc2\x38\x15\xcf\x25"
+ "\xe0\xde\xfc\xb5\xb8\x3f\x17\xf6\x3b\x00\xae\xcd\xd0\x0e\x1b\xd0"
+ "\x61\x04\xc4\x67\x35\x70\xd5\xc2\x65\x28\xc7\xfe\x88\x02\x32\xdd"
+ "\xd3\x57\xd3\x7f\x5d\x7f\x09\xf1\xcf\x1b\x16\x6f\xbc\xfa\xcb\x68"
+ "\x28\x4b\x1b\xfc\x7c\xbe\x5f\x46\x0f\xd0\x6f\x1c\x8e\xfb\xcc\x52"
+ "\x7d\x5d\x73\x19\xdf\xb3\x2f\x2d\xe8\xfd\x5f\xae\x02\x3d\x91\x27"
+ "\xbc\x2b\x31\x27\xe4\x7c\x4f\xc2\xf0\x5d\x0d\xce\x5f\x80\x67\x55"
+ "\xba\x8c\x5a\x3b\x1d\xa4\x0c\xc7\x11\x62\xf4\xb5\x35\xe7\xec\x1c"
+ "\xca\x45\x13\xa4\xc1\x6f\xb7\x95\x9d\x13\xcb\xad\x68\x4a\xc9\x5d"
+ "\x4b\x84\xb3\x46\xf0\xbc\x22\x94\x97\xb2\x1c\x88\x05\xf1\x6c\xa5"
+ "\xf4\x30\xd0\x57\xbf\xfc\x04\xfe\x8f\xc0\x7c\x54\x6e\x4e\xe0\xa1"
+ "\x0c\x90\x99\x7d\x54\x61\x56\xf3\xba\x86\x1a\xb0\x0f\x5a\x3a\xbe"
+ "\x34\x9a\xdf\xd1\x94\xd8\x55\xf8\x2b\x6c\xbf\x10\xf7\xe3\x3e\x40"
+ "\xd8\xd7\xe1\x86\x98\xbb\x69\x9f\x8b\xd0\xa9\x2e\x62\xca\x38\x4b"
+ "\xec\xa3\x9d\x1d\x76\x85\xa5\xc2\xae\x68\x2c\x73\x2b\x2c\xad\x70"
+ "\x1d\xd1\xa6\xe3\xf8\xef\xaf\x8e\xf4\xec\x67\xf9\xfd\xc0\xfb\x59"
+ "\x42\x99\xb1\x9e\x3d\x2d\xdd\x1b\x82\xdf\xcf\xd2\xcd\x7d\xa1\xae"
+ "\xca\x1c\x7c\x3f\x4b\xf0\x31\x9b\xc1\xbf\x34\x78\xf6\x1e\x71\x0b"
+ "\xf3\xc9\x89\xdc\xad\x30\x47\x0b\xfb\x97\x64\x19\x84\x3d\x48\xd0"
+ "\xd7\x44\x5b\xd3\x55\x98\x18\xed\xf1\x1f\x51\x7f\xba\x5f\x74\x3a"
+ "\xe0\xc2\xf4\x38\x9b\x6c\x5e\xaa\x47\xb7\x82\x3d\x9d\xed\x1e\x53"
+ "\x90\xd8\x85\x6b\x04\x9c\x9a\x47\x31\x2f\xd0\x11\xf7\x04\x0b\x73"
+ "\x3b\x35\x53\xe0\x7a\x18\xae\x47\xdc\xba\x86\x04\xb7\xae\x51\xeb"
+ "\xd6\x95\xcf\x81\x2b\x19\xae\xf9\x70\xa5\xc0\x95\x0a\x17\xf8\x91"
+ "\xe5\x69\x70\xc7\xf7\x19\x70\x65\xc1\x95\x0d\x57\x1e\x5c\x5b\xdd"
+ "\x3b\x9a\x66\xbb\x65\xe1\x31\x70\xc5\xc2\xa5\x72\xeb\x2c\xfb\xdc"
+ "\x3a\xb3\x8a\xad\xdb\x4c\x34\x78\x70\xda\xff\xbe\xa9\xb7\xb2\xb3"
+ "\x13\x46\x7c\x41\xa3\xf0\x5c\xdf\xec\xb3\xb8\x97\x9d\xda\xa4\xee"
+ "\x0c\xee\x0c\x0d\x59\xa2\xdd\x1f\xae\xb1\x7c\xd0\x31\xce\xe0\xca"
+ "\x7b\x22\xc1\x6f\x9f\x49\x74\x53\xb2\x2b\xa6\x94\xb8\x0a\x48\x1e"
+ "\xe8\x35\x59\x53\x4a\x1b\x49\xb2\x93\x5c\x4b\x5b\x37\xc9\x4d\xa5"
+ "\x6e\x41\x07\x64\xe3\x59\x2d\xef\x64\x20\xc6\xdd\x34\x59\xe5\x2c"
+ "\x69\x48\x74\xcb\x2d\x5a\x2a\xb7\xec\x13\xf6\xc7\x03\x5d\x82\x67"
+ "\x95\xf5\xc4\xa0\x88\x39\x88\x43\x1b\x3b\xce\x92\xcd\xa9\x94\x6f"
+ "\xd4\x80\xef\xd5\x0a\xc0\x93\x91\x57\x05\xec\x89\x71\xe8\xaf\x8f"
+ "\xd0\x3c\xc0\xd2\x68\x37\xd0\x8d\xc7\xf8\x13\x70\xb7\x3b\x93\xc4"
+ "\x79\xb0\x07\x36\x5d\xe9\x39\xdf\x89\x8e\x4c\x6c\x81\x77\xe1\x78"
+ "\xfe\x53\x25\xc4\xa1\x95\x99\x24\xb6\x12\xde\x09\x67\x75\x42\xbd"
+ "\x67\x69\xa3\x28\xbf\x52\x4d\xaa\x9f\x27\x11\x8a\x93\xec\xfc\x57"
+ "\x37\xd0\xde\x7b\x06\x42\x79\xc5\xcc\x93\x2a\x62\x52\x1f\x05\xdb"
+ "\x5c\x03\x7c\x29\xaf\x70\x82\xfd\x02\x5a\xba\x83\xa3\xe5\x93\x25"
+ "\x17\x8a\x96\xce\x18\xfd\x1e\x46\xcf\x14\x82\x34\xeb\x4d\x4f\xa4"
+ "\xf1\xa6\x36\xa0\x27\xd0\xd5\xda\xe2\x86\x58\x92\x2c\xf2\xd0\x73"
+ "\x17\xd0\x13\x68\x1a\x8d\x34\x05\x7a\x08\x34\xa5\x22\x4d\xab\x25"
+ "\x34\x05\xdd\x25\xec\x25\x88\x34\xe5\x81\xa6\xd5\x7e\x68\xda\x13"
+ "\xcf\x03\x4d\x77\x07\x44\xd3\x7d\x43\xa0\xe9\xaf\x6d\xfe\x68\xea"
+ "\x42\xbf\x41\x5f\x5e\x46\x41\x2f\x5a\x5d\x87\x84\x7d\x31\xc1\xe7"
+ "\x3b\x02\xbe\x6b\x2b\x2f\x6f\xa8\xc0\xf3\xbc\x71\x6c\x1e\xcf\x1b"
+ "\x13\xf6\x71\xda\x47\xcf\xbb\xf5\x8d\x76\x4c\x03\xbd\xa6\xb9\x0b"
+ "\xe7\x03\x69\x6d\x60\xbb\x68\x6d\xd3\x39\xec\x0b\x4b\xba\xbe\x1b"
+ "\x7d\x6a\x7d\xd3\x5d\x3c\xd5\x10\xd4\x29\x0b\x26\x92\xf0\x6e\xd0"
+ "\x1b\xda\x4c\x72\x63\x19\xe8\xc2\x6e\x9d\xe5\xc8\x09\xd9\x8c\xfd"
+ "\xd3\xb5\x3c\x85\x2b\x17\xf7\x77\xe4\x41\xe7\x82\x2e\x17\xf8\x8b"
+ "\x3c\xc3\x31\xbe\xc6\x05\xb8\xde\x64\xe6\xeb\x9f\xa6\xb8\x48\xae"
+ "\xa6\x2f\x7f\xf9\xdc\x64\xf0\x3d\x07\x97\x13\x3c\xf3\x30\xbb\x1d"
+ "\xf9\x5a\x43\xac\x6d\x5e\x39\xe1\x45\x1d\x8d\xbc\x40\xb9\x40\x19"
+ "\x29\x95\xe8\x66\xd0\xfb\xca\x2a\xf1\x0c\x10\x77\x01\xe8\x66\xdc"
+ "\xef\x1d\x78\x89\x67\x83\xf4\x2b\x1f\x9b\x41\x3e\x36\x09\xe7\x33"
+ "\x45\x03\x3d\x6a\xba\xbb\x18\x0f\x91\x67\x56\x97\x59\xe0\x5f\x99"
+ "\x68\x0b\x18\xdd\x2d\x7f\xa6\x34\x19\xfc\xb9\x49\x6a\x5e\xdf\x68"
+ "\xa3\x5d\x9a\x31\x78\x46\x17\xc4\xfc\x71\x51\xa9\xe0\x3f\x7d\x07"
+ "\xb6\x62\x35\xe0\xeb\x14\x89\xdd\xbd\x1a\x7c\xa2\x2e\x3c\x67\x0d"
+ "\xea\xb3\x91\x9d\x4f\xcb\x17\x3e\x11\x0f\xef\x84\xfd\x2a\x79\xcf"
+ "\x7e\x95\x67\xd4\xd8\x0f\xe1\xed\x1f\x5a\xa3\xe6\x7a\xbe\x59\x22"
+ "\x33\xb8\xe5\x93\xd4\x6c\x7d\xe9\xac\x55\x6c\x0c\xb9\x4d\x38\xcb"
+ "\xb5\x43\x36\x6b\x0f\xeb\xc7\xfd\x26\x55\x9b\x83\xf3\x7e\x66\xcd"
+ "\xa5\xc5\xdf\x27\x6b\xf1\xac\x6d\xcf\xbb\xdc\x64\xa4\x83\xea\xce"
+ "\x3c\x02\xba\x7c\x52\x22\x9e\xc1\x8e\x7b\x7f\x05\x87\xc5\x59\xc2"
+ "\x7e\xb7\xee\x12\x99\x11\xe8\x94\xc0\xeb\x65\x16\xd0\x29\x71\x74"
+ "\x25\xb4\xf5\x79\x68\xeb\x09\xa0\xeb\x09\x68\xeb\x06\xb1\xad\xe2"
+ "\xd9\x73\x3c\xd0\x1f\xde\xf5\x6f\x1b\x3d\x6d\x5d\x09\xf4\x2e\xfa"
+ "\x32\x6e\xcb\x49\xf2\x23\x0a\xfe\x78\x63\x87\xb0\xb6\xa7\xcb\xea"
+ "\x3a\x4a\xf0\xbb\x82\xed\x2e\x29\xd7\xcc\x05\x3c\x22\xcd\xc1\x5f"
+ "\x00\x9b\xd7\x60\xf0\xf0\x01\xeb\x43\x9d\x9a\x31\xd5\xab\x49\x9c"
+ "\x40\xfb\x53\x64\x12\xca\x33\xd0\x3e\xb6\x1a\xe9\xef\x7b\xfe\xf3"
+ "\x38\x81\x07\x23\x81\x07\xab\x45\x1e\xe8\x44\x1e\x80\xbf\x0c\x76"
+ "\x38\x02\xe2\xc6\xe8\xea\x02\xc6\x83\xe0\x68\x94\xe4\xf7\xbc\xc2"
+ "\x10\xe5\xb5\xd3\xbf\xbc\x3e\xdd\xd8\xcd\x62\x64\x19\xee\x9b\x49"
+ "\x23\x9b\xee\xe1\x9d\x20\xb7\x7a\x51\x6e\xa9\xe6\x11\x8f\xcc\x1e"
+ "\x97\xcd\x5e\x11\x98\xcc\x3e\xf5\xcc\xff\x52\x99\x1d\x77\x61\x65"
+ "\xf6\xe9\x9b\x7c\x65\xf6\xe9\x39\xbe\x32\xfb\xf4\x68\xaf\xcc\x8a"
+ "\xef\x86\x45\x66\x9f\x56\x5d\x1a\x99\x7d\x5a\xd5\x8f\xcc\xb6\x04"
+ "\x20\xb3\xd1\x7e\x64\x36\xfa\xc2\xc9\xec\x6f\x1e\xbf\x78\x36\xf6"
+ "\xb7\xdb\xba\xb9\x7e\x6c\xec\x66\x89\x8d\x55\xa0\x8d\x9d\x13\xdd"
+ "\x9f\xbc\x3a\x2b\x41\x5e\xe5\xa2\xbc\x3e\xfb\x17\x28\x6f\xee\xb5"
+ "\x87\x8e\x0c\x2e\xaf\xae\x4a\xaf\xff\xe4\x57\x66\x35\x28\xb3\xfb"
+ "\x88\xd5\x26\xc8\xec\x22\x8f\xcc\x56\x8a\xb1\xd0\x00\x72\x3b\xce"
+ "\x9f\xdc\xe2\x79\x5c\x78\x16\xd7\x80\x72\x2b\xfa\x4b\xce\xf1\x28"
+ "\xb7\x86\xcb\xcc\xd6\xce\x3d\xec\x2b\xb7\xbf\x95\xfb\xca\xed\xdc"
+ "\x4f\xbc\x72\x2b\xbe\x1b\x16\xb9\x9d\xdb\x7a\x69\xe4\x76\x6e\xeb"
+ "\x0f\xc7\xd6\xfe\xd6\xef\xfc\xff\xe1\xb7\xb5\xcf\x3e\x26\xc8\xad"
+ "\x3f\x5b\x9b\x2b\xda\x5a\x05\xda\xda\xdf\x7d\x1e\x98\xec\x26\x37"
+ "\xfe\x2f\x97\xdd\x0b\x6c\x73\x9f\xf9\xa3\xaf\xec\x3e\x63\xf6\x95"
+ "\xdd\x67\xb6\x78\x65\x57\x7c\x37\x2c\xb2\xfb\xcc\xf6\x4b\x23\xbb"
+ "\xcf\x6c\xff\xe1\xd8\xdc\x67\xfd\xce\x95\x53\x4d\x20\x79\xc7\x64"
+ "\xf3\xae\xb5\x56\x0a\xf3\xf8\xf2\xac\xae\x07\x09\x9b\x6f\x32\xef"
+ "\x01\x6b\x74\x3c\xe1\x8b\x5d\x29\x78\x2e\x04\xce\x7b\x29\x97\xcc"
+ "\x2b\x61\xf3\x20\xe6\x3d\xe3\x99\x17\xb3\x5b\x3c\x3b\x62\xa0\x79"
+ "\x31\xb4\xc8\x29\xce\x9f\x98\xb7\x9d\x61\xc3\xe9\xf0\x3c\xb3\x7d"
+ "\xab\xe6\x55\xd0\x17\x9d\x76\xfb\x68\xa7\xdd\xdf\x58\x51\x64\x3e"
+ "\xa5\x78\xe6\xd2\x99\x09\xa5\xaa\x33\xc5\x84\x94\x09\xe3\x30\xf3"
+ "\x9a\xa1\x8d\x0e\x36\x1f\x62\x9a\xf2\x4c\xc1\x6c\x02\x69\x6d\x9e"
+ "\x34\xe1\x0c\xec\x82\x30\xca\xc3\x3b\xaa\x7f\xd9\xb5\x3b\x87\x44"
+ "\xe0\x5e\xa0\x77\x9e\x43\x2c\xce\xeb\x04\x1d\x31\x0e\xcf\x6d\xc2"
+ "\xb3\x32\xe8\x4f\x7e\xda\x59\x7d\x9a\x84\x37\x6d\x15\xfa\x9e\x71"
+ "\x3e\xcd\x1e\x3d\xe2\x3f\xec\xf6\x0a\xca\x85\x13\xbe\xaa\x34\x82"
+ "\x2a\x2c\x36\x61\xfe\x2e\x60\xc5\x33\xc7\x06\xcf\x3c\xe3\xc7\xeb"
+ "\xf7\x79\xf6\xa2\xa4\x50\xbf\xbf\xe6\xd8\x39\x3c\xab\xbc\x3a\x9d"
+ "\x28\xe1\x92\x53\x9d\xc5\xd6\x55\x38\x3f\xdb\xd3\x97\xe8\x77\x2e"
+ "\x36\x9e\xe3\xfb\xd3\xe8\x70\x71\x3e\x0f\xae\xa9\xad\x10\xbe\xc3"
+ "\xf1\x45\x6e\x48\xa7\x05\xb9\xc2\xd9\x59\x51\x40\x0b\x9c\x3f\x8b"
+ "\x67\x1a\xf1\xd5\xa5\xaa\x17\x6e\x20\xe4\x9d\x4d\xed\x1c\xce\xdd"
+ "\x70\xff\xcb\x4f\x3b\x0d\x39\xbf\xc0\x3d\x27\x84\xfd\xca\x8f\xcb"
+ "\x9e\xdb\x98\xf4\x0d\x3b\xb3\x17\xfe\xdf\x86\xe3\x2f\x33\xe1\x19"
+ "\xc7\xf2\xf9\x33\xd1\xe1\x98\x17\xd2\xef\x36\x64\xfe\x9d\x44\x69"
+ "\x49\x84\x1e\xda\x26\xe6\x15\xd6\x70\xd8\x64\xcf\x09\x6b\x3a\xe0"
+ "\x79\x1c\x8e\x19\xc0\xef\x22\x70\xce\x12\xad\x2c\x8d\x10\xf4\x43"
+ "\x89\xc5\xc6\x8f\x2f\x8d\x10\xe6\x9e\x42\x3b\x4b\xa1\xcd\x90\x47"
+ "\x8e\xf3\x73\x84\x7b\x0e\x51\x6e\x4f\xc7\xbd\x4d\x9f\xdb\x0a\x77"
+ "\xb9\x61\x35\xce\x2d\x99\x6f\xc7\xb2\xfd\xce\xf1\x97\x5b\x6c\xb4"
+ "\x20\x9c\xb0\x75\x3a\xb2\xbf\x1d\x93\x2d\x88\x8d\x92\x51\x4a\x2b"
+ "\xf5\xfb\x5e\xc0\x3e\x6e\x9c\x57\x2d\xcc\x15\x7f\xce\x0d\xe5\x87"
+ "\xef\x16\xfa\x70\x9f\x3b\x62\x93\xcd\x2f\xea\x99\x93\x2f\x8c\x37"
+ "\x2d\x98\x8c\xdf\xc1\xdf\x88\xf9\xc5\xf3\x8d\x2c\x36\x55\x4e\x18"
+ "\x85\xf7\xe3\xd9\xdc\xeb\x88\x65\x5d\x85\x0b\x62\xbc\x73\xce\x84"
+ "\xdf\x01\x96\x16\x60\xff\xaf\xb0\x07\x3d\x3e\xfb\x9d\xd7\x2c\xf2"
+ "\xad\x31\x1a\xb0\xd1\x9b\x77\x1e\x8c\x00\x2e\x3c\x18\xc1\xfa\xbe"
+ "\x9b\x63\xe3\xd8\xf8\xc6\x82\x8f\x30\x9f\x1e\x78\xe8\xde\x15\x1d"
+ "\x2e\xec\xf9\xed\x44\xbe\xe0\xfc\xf8\x85\xeb\x91\x2f\xa5\x60\x0b"
+ "\xc4\xbc\x15\xde\xfa\xe3\xf3\x42\x81\x9f\x3c\xf0\x82\xcd\xd3\x5f"
+ "\xf8\x84\x70\x7e\x0c\xe8\x0c\x9c\x23\x6e\xcc\x82\x7a\x21\x6e\x01"
+ "\x23\xef\xa4\x3b\xb8\xea\x4c\x96\xfe\xd7\xd3\x0e\x0e\xe7\x7d\x60"
+ "\x5f\xb8\xee\x79\x12\x8e\x7d\xea\x58\x26\x8d\xd1\x0b\xeb\x16\x04"
+ "\x3e\x6e\x02\xde\x65\x02\x76\x81\xe6\xa5\x40\xbf\xea\x6e\x61\xbc"
+ "\x6a\x5f\x35\x4f\xe4\x3c\xe4\xb3\xc9\x16\x6e\x85\xf2\x94\x55\xd7"
+ "\x51\x3b\xce\xcb\x06\x1a\x6e\xea\x2a\x5c\x98\xe2\xa1\x21\xd6\x09"
+ "\xe7\x55\xeb\x84\xf9\xf5\x0b\x8e\x30\x0c\x2d\x78\xcb\xd3\x66\x7f"
+ "\xf4\xd4\xbd\x43\x62\x74\x77\x92\x78\x5e\x7e\xab\x9a\x86\xfd\x74"
+ "\x0f\xf6\x37\xcf\xea\x20\x04\xf7\xb8\x4f\xda\xf6\x05\xb5\xda\xdd"
+ "\x84\x57\xdc\xaa\xc6\xb1\x09\xf7\x0b\xb7\x8f\x4d\xda\x08\xf4\x02"
+ "\x7b\x9f\xeb\x20\x4a\x6b\x8e\x9d\x9d\x73\x46\xbe\x27\xee\x75\xa0"
+ "\xc3\x41\xaf\x83\x4d\x0d\xcf\xfd\x9e\x5c\x8f\xf4\xe2\x15\x0d\x89"
+ "\xc7\x65\x29\xf7\xce\xcd\x20\x79\xc1\xe9\xd1\x14\x61\x5e\x2e\xfa"
+ "\x17\xa0\xf3\x39\x9c\x4f\x67\xb5\x83\x7f\xa2\x6b\x48\x0c\xb2\x9c"
+ "\x44\x7f\x3a\x12\xdb\xcd\x63\x3f\xb4\xd8\xe6\x24\x6c\x73\xa7\x83"
+ "\x60\x5f\xfe\xac\xb5\xb8\x97\xe8\x59\xc2\xeb\x6e\x55\x63\x9b\xc1"
+ "\xd7\x31\x07\xdf\xa7\x9f\x62\x1c\xe8\xdb\x14\xe8\xcd\xbf\xf0\xd3"
+ "\x3d\xbc\xdc\x62\xc6\x6f\x63\x1d\x70\x7d\xcd\xac\xb3\x44\xa0\x3b"
+ "\xd2\xdf\xea\x70\x13\xaa\x90\xd6\xc1\x15\x64\x1d\x16\xf9\x6f\xff"
+ "\x9d\x24\xa6\xe4\x1d\xc6\x77\xf7\x0b\x22\x0d\x34\x38\x46\x66\x31"
+ "\xe3\x1e\xf7\xb3\xb0\x0e\xf6\x93\x64\xe6\x49\x22\xf0\xdf\xaa\xee"
+ "\x20\xee\xb0\xdb\xc7\xe2\x9c\x0a\xe4\x7f\x8e\x0b\xf8\x7f\xce\x81"
+ "\xfb\x7f\xd8\xad\x79\xe7\x09\xfa\x2f\xae\x33\x6a\xae\x2f\xff\x17"
+ "\xdf\x3b\x37\x2b\x58\xfe\x2f\x1e\x26\xfe\x2f\xbe\x0c\xda\xbf\x24"
+ "\x84\xf6\x2f\x19\xa6\xf6\x2f\xb9\x0c\xda\x9f\x1a\x42\xfb\x53\x87"
+ "\xa9\xfd\xa9\x7e\xdb\x3f\xed\x7a\x9e\x0a\x73\x6d\x22\xeb\x6a\xd0"
+ "\x06\x30\x7b\xb5\xf4\x0e\x9c\x4b\x23\xac\xa7\x12\x9f\x09\x5b\x5f"
+ "\x15\xd1\xeb\x59\xde\xeb\x59\xd9\xeb\x79\x5c\xaf\xe7\xe8\x5e\xcf"
+ "\x31\x9e\x67\xb0\x23\x23\x4e\xc9\x52\xab\xc0\x2f\xcd\xb3\xc9\x96"
+ "\xc6\x8b\xef\x63\x71\x7f\x1c\xb0\xe9\xb1\xfe\xce\xda\x53\xc8\x08"
+ "\x75\x72\x94\x08\x67\xe0\xc9\x96\xbe\xd5\x5d\x40\x28\x0d\xbb\x41"
+ "\x8d\xe7\x94\xf1\x25\xe5\x19\xb3\x40\x4f\x5b\xed\x0e\xf0\xf3\xa3"
+ "\x47\x42\xd9\x3f\xc1\xf3\x17\x91\xaf\xaa\x74\x9c\x5b\xb3\x74\x07"
+ "\xb6\xf3\x4e\xad\x81\xf0\x61\xb7\x0b\x73\x1b\x78\x5d\x79\x86\x3d"
+ "\xec\xf6\x1b\xe8\x8e\xa6\xd9\xba\x02\x3e\xc2\xda\xd1\x42\xf4\x1c"
+ "\xaf\xca\xce\x06\xfe\x76\xec\x27\x9b\x3b\x68\x7b\xb6\x8b\x3a\xac"
+ "\xf3\x0d\x24\xd7\x8e\xe7\x97\x98\x49\x93\xbd\x45\x38\xc3\x44\x38"
+ "\xab\xc5\xbe\x9f\xa0\xff\x93\x8b\x79\x20\xad\xc9\xfe\x16\x69\x84"
+ "\x67\xc3\xea\xaf\xa0\x9d\xcb\x9e\xb0\x76\xbc\x05\xf1\x52\xb9\x96"
+ "\x97\x97\xcf\xa1\xf2\xf2\xe4\xc6\x0e\x3c\xa3\xb5\x7c\x3e\xd6\xb5"
+ "\x09\xea\x61\x75\xd5\x62\x9c\x35\x5f\x28\xb7\xb3\x59\x88\x49\x71"
+ "\xcc\x96\x57\x40\x7e\x45\x79\x32\xd6\x0f\xeb\xd6\xff\x38\x6c\x5d"
+ "\x1b\xd4\xfd\xc1\xb9\xea\x70\x82\x6b\x20\x82\xc3\xc8\xb2\x34\xbf"
+ "\x7e\x74\x89\x31\x95\x95\x1b\x11\x4a\xb9\x7e\xf5\x3f\x94\x2b\xd6"
+ "\x57\x19\x42\xb9\xcb\xfb\x9c\x79\xed\x2d\xd7\x24\xd6\x57\x15\x4a"
+ "\xb9\x19\x03\x94\x2b\xd6\x37\x21\x94\x72\x2d\xfe\xcb\xad\x17\xeb"
+ "\x9b\x17\x42\xb9\x1a\xbf\x6b\x08\x11\x0f\xa1\x61\x41\xe3\x77\x7d"
+ "\x31\x62\x21\x34\x1c\x68\x06\x68\xbf\xb1\x2d\x34\x0c\xac\x50\x0d"
+ "\x84\x81\xd0\xf8\xbf\x62\x40\xfe\x87\xc6\xfb\x15\xe6\x81\x78\x1f"
+ "\x1a\xdf\x9f\xf7\x8b\x7f\x8c\x0d\x80\xf7\x7b\x68\x64\x53\x02\xaf"
+ "\x2f\xdf\xc3\x47\xd6\xbd\xf6\x02\x9f\x40\xa6\x6d\x21\x24\xaa\x82"
+ "\x5c\x3b\xad\xea\x0b\x9a\x20\xc4\xdc\xcf\xef\xdf\x52\x49\x38\x88"
+ "\xa1\xb9\xb7\x37\xb5\x72\x56\x57\x3c\xea\x2d\xf7\xde\x4c\x87\xec"
+ "\x67\x90\xfe\x09\xd8\xc1\x4e\xf0\x65\x59\x59\xe5\x7b\xf4\x39\x09"
+ "\x44\x58\x1f\x07\x71\xc4\xac\xb5\x5f\x50\x5c\x77\x9c\xf4\x3d\xe8"
+ "\xd7\x0a\xdc\xab\x90\x5c\x0b\xbf\x75\x01\x8e\xa1\x1c\x07\x79\x97"
+ "\xb7\xcb\x66\xd9\x85\xbc\x76\x61\x7e\xba\xbe\xee\x35\x8c\x15\x68"
+ "\xae\x1a\xf7\x1d\xb3\x1f\x97\xad\xbc\x25\xcc\x4e\xb8\x6a\xe1\xec"
+ "\x9c\x95\x2a\x9b\x2c\x4d\x29\xae\x31\xed\x10\xf6\xc7\x83\xba\xe3"
+ "\xfe\x78\x2f\x40\xdc\x80\xf9\xef\xd4\x12\xae\x4e\xd8\x4f\x78\xe5"
+ "\x0c\xdc\x33\x6f\xa0\xb5\xda\xee\x12\xcb\x56\xfc\x3d\x2d\x01\xfb"
+ "\x7c\x92\x70\x4d\x9d\x76\x42\x63\x4a\x89\x1e\xe2\x93\xe9\x13\xb1"
+ "\x3f\xe5\x34\xc9\xd9\x42\x79\xec\xdb\xa2\xf2\x86\x78\x9c\x7b\xc8"
+ "\xf6\x73\x5f\xd9\x8e\xb1\xbe\x78\x66\xd2\x0d\x27\xe0\x59\x88\x91"
+ "\x70\x0e\x8e\xbc\x5c\x4d\xf5\x8a\x84\xa6\xce\xd3\x84\xed\x49\xbe"
+ "\xf2\x1b\xdc\xbb\xec\x8c\xdc\x92\xd7\x29\xb7\x14\x41\xbd\xda\x3c"
+ "\x6d\xc0\xef\x7b\xd2\x31\x26\xc4\x7c\x5d\x85\x69\xe1\x9e\xb5\xdb"
+ "\x7e\xce\x15\x1e\x9b\x14\x4d\xed\x48\x5f\x56\x97\x55\x2b\x90\x07"
+ "\xe0\x87\x64\x75\xe6\xaa\x27\xb0\x3e\x92\xb4\x32\x8c\xb5\xa1\xde"
+ "\xa9\x2c\xee\x2d\x4f\x15\xd6\xe9\x83\x3d\x98\xab\xe6\x82\xf4\x89"
+ "\xd3\xe6\x63\xdb\x0c\x13\xd0\xfe\xae\x7a\x0a\xca\x7f\xe8\x98\x2c"
+ "\x8d\xed\x53\x59\x52\x9e\xc5\xd6\x5f\xa6\xcd\x86\x6f\x64\xc1\xb3"
+ "\x0a\xf3\xc1\xfb\x16\xf1\x7d\x9e\xe4\x7d\x1e\xce\x45\x15\xdf\x77"
+ "\x8a\xef\xb7\x4a\xde\x6f\xd5\x4e\xc0\x7e\x8f\x55\x31\xd8\x06\xa0"
+ "\x63\x0a\xbc\xcf\x10\xf6\x38\x10\xce\x73\x2c\x4f\x11\xf3\x65\x74"
+ "\xc8\x56\xdd\x7b\x06\x30\x06\xef\xb3\x25\xbf\xcf\xae\xcb\x8a\x23"
+ "\xd3\xaa\x90\x86\xab\x12\x6d\x5c\x83\xb8\x36\x3b\x6d\x8e\xd0\x76"
+ "\xb0\xa1\xd2\xf2\x6c\xb2\x55\xe3\xd0\x4e\x76\x82\x8f\x06\x79\xa6"
+ "\xe0\x37\xa5\xf4\xf6\xac\x02\x55\xa5\xae\x5a\xa4\x5a\xb2\x66\xfd"
+ "\x6a\x5c\xc5\xe7\xbb\x3e\x4d\x89\xeb\x5c\xf9\x12\xb3\xc6\x5a\x81"
+ "\xeb\xee\x94\xc2\x1a\xef\xed\xc0\x47\x97\xbe\x71\x8f\x3b\xb2\x31"
+ "\xce\xad\x6f\x98\x9d\x7b\x96\x70\x39\xd1\xf4\x4b\xc3\xa6\xa9\xe4"
+ "\x94\x6c\xd5\x97\xc2\x39\x91\x2a\x61\x4f\xfc\x4e\xc3\xa6\xff\xc2"
+ "\x34\x61\x2f\x30\x6b\x0a\x4b\xfb\xb7\x1c\x33\xf7\x71\x4e\x2b\x67"
+ "\x49\x39\x4d\xea\xa2\xed\xc4\xa8\x3a\x8d\xfb\xc2\x76\xfe\x1b\xdf"
+ "\xcc\xe1\xdc\xdc\x53\xb2\xd5\x4f\xe0\xb7\xb0\xff\x00\xff\x67\x7d"
+ "\x21\xab\x1a\xf1\x3b\x38\x6f\x11\x68\xf3\x37\xfc\x1e\xb4\xaf\x39"
+ "\xac\x12\xe7\x39\x13\x39\xe4\xd3\xf1\x3a\xb3\x46\x90\xf7\xc2\x55"
+ "\x79\x2e\x4e\xfe\x27\x71\x5d\x1f\xa9\x1c\x8b\x73\x74\x57\x67\x49"
+ "\xd6\xb9\xc9\xcf\x70\xe4\x51\x48\x2b\xf1\xec\x59\x81\x67\x07\xf9"
+ "\xd3\x1f\xe7\x21\x4e\x3e\x5f\xa9\x2f\xe2\xe5\x66\xa0\xaf\x59\x63"
+ "\x06\x0d\x16\x25\x9c\x45\xdf\x0d\x75\xd1\xa6\x51\x85\x39\x39\x07"
+ "\xe5\x14\x68\xf1\x67\x9c\x43\x18\xd9\xb8\xe7\x2d\x9c\x33\xa8\x6f"
+ "\x8c\xfb\x53\xa6\x83\x3b\x64\xa9\x25\xaa\xdf\xa2\x8f\xb5\xda\xfd"
+ "\xeb\x54\xea\xba\xbd\xc5\x40\x2c\x6d\xef\x93\x4f\x8f\x98\x89\x7c"
+ "\x3e\x09\xcb\xb5\x51\xb7\xd0\x97\x90\x41\xb8\x24\x1b\x09\xc3\xfd"
+ "\x94\x70\x0f\x75\x3c\x2f\xbd\xc9\xd1\x08\x7e\xcf\x3b\x19\x6f\xe7"
+ "\xb4\x8f\x50\x3d\x4d\xc0\x5f\x62\x63\xd2\xc2\x1a\x20\xbb\xb0\x2e"
+ "\x5b\x81\xfd\xe3\x92\xb5\x3f\x19\x5b\x4e\x92\x88\x46\xcd\x51\x92"
+ "\x9d\x42\x79\x9c\xe3\x97\x94\x12\x46\x85\xf5\x3f\x59\x90\x59\x0b"
+ "\x3c\xdd\xa0\x8e\xdc\x99\x49\xc6\x35\x65\xd8\x88\xb5\xdd\x4c\x76"
+ "\xa5\x93\x71\xb4\x4b\x33\xda\x62\x39\x44\xa8\x5e\xad\x7a\x37\xc7"
+ "\x30\xc2\x33\x1f\x2b\x2a\x5f\x86\xfd\xa1\x91\x25\x38\x2f\xeb\x1c"
+ "\x89\x5b\xf8\x55\x9e\xd0\x87\x8b\xfd\xe5\xae\x2e\xb5\xca\xd9\xa5"
+ "\xbe\xb9\xbb\x4b\x3d\xc1\xd3\xcf\xfe\xdc\x0a\x25\xa9\xc2\x75\x43"
+ "\x85\x8b\xe4\xb8\x6e\x08\xfd\x4b\x97\x62\x92\x1a\xfb\xd4\x85\xfd"
+ "\x61\x36\xa8\x63\xf8\x25\x6a\x72\x97\x5d\x58\x97\x84\xfd\xfc\xca"
+ "\xea\xc5\x50\xdf\x8e\xd3\x44\x3a\xb7\xe8\xfc\x06\x35\x87\xf3\x8a"
+ "\x68\xe1\xea\xbd\xdd\x55\xfa\x22\x9c\x5f\x04\x76\x21\x3e\x78\xd9"
+ "\xd6\x0a\xfe\x33\xb6\x1f\xf8\xb1\xe7\xad\xd3\xc8\x1f\xe0\xd3\x69"
+ "\x3b\x87\xbc\x68\x4c\x45\x3e\x34\xfb\xf0\x41\xe0\x5b\xba\x83\x43"
+ "\x7e\x20\x2f\x90\x27\x5e\x7e\x7c\x2e\xf0\xe3\x2d\x9e\xf1\xa3\x1b"
+ "\xec\x81\x87\x27\xe7\x63\xf4\x15\x03\xf1\x05\xf9\x81\xbc\xb1\xb4"
+ "\x1d\x25\x3e\x3c\xb1\x33\x9e\x00\x3d\xc7\x7a\xf8\x82\x3c\xb1\x76"
+ "\x80\xcf\x0b\x7c\x79\xf2\x73\x42\x7e\x3d\x91\xf2\x8d\x33\x3e\xeb"
+ "\xe1\x8f\xcb\x1f\x7f\xbe\xf1\xf2\x07\x78\xdf\x97\x3f\x27\x95\x38"
+ "\xee\x83\xfc\x29\x0b\x86\x3f\x96\x36\xc6\x1f\x97\xc8\x9f\x89\x89"
+ "\x84\x73\x74\xa9\xb9\x1d\x99\x24\x7e\xc6\x57\x2a\x62\x4a\x6e\x24"
+ "\x40\xeb\xc9\xbc\xce\x92\x15\x9a\x1c\xad\xdb\x1f\xb8\x1c\xa5\x4f"
+ "\xbf\x2a\x47\xc1\xca\xd1\xda\x8e\xa1\xc9\xd1\xba\xbc\xab\x72\x74"
+ "\xb1\xe4\x68\x5d\x76\x6f\x39\xea\xb1\xd5\xe9\x4b\x57\x2d\x5a\xb1"
+ "\x7a\xc5\xea\xe5\xaa\xc5\x1b\x33\x96\xae\x63\x16\xdb\xc7\x66\x47"
+ "\xbb\x73\x12\x38\x3c\xf3\xdc\x52\xd1\x4c\xde\xbd\xa1\x99\x73\x7f"
+ "\x1d\x1d\x4e\x4b\xa6\x6a\xf9\x92\xa9\x76\x3c\xff\x1c\xe5\x0d\xcf"
+ "\x45\x3f\x2e\xdb\x68\xc3\xbd\x00\xd9\x3e\x2a\x1b\x85\xf9\x97\xe0"
+ "\x1b\x46\xe3\xf8\xcb\x0b\x9b\x48\xf8\x0b\xb8\x2e\xda\x81\xfd\x1c"
+ "\xc2\xfb\x27\x70\xdf\x32\x5a\x55\x1a\x8d\x7b\xd9\x74\xca\xcb\x55"
+ "\x5b\xa1\x2c\xbb\xc2\xac\x09\x57\xe1\x3a\x92\xf5\xad\x60\x8f\x2b"
+ "\xbc\x7b\x13\x6d\x94\xd3\x91\xeb\x27\xa1\x9c\xe3\x9a\xbe\x53\xb2"
+ "\x4c\xc5\x79\xdc\xbb\x1d\xfc\xd7\xb9\x13\xe1\x3b\xe3\xf5\x15\xc2"
+ "\xbe\x0b\x20\xf3\xec\xfd\x06\x61\x4f\x33\xa7\xbc\x61\xb6\x70\x6e"
+ "\xbc\xbc\x71\xcf\x99\x92\xc6\xb8\x43\xd9\x35\x44\xf5\x34\xca\x7c"
+ "\xe6\x03\x4f\x56\x80\xcc\xcf\x36\x90\xc6\xe8\x3f\x91\x4f\x93\x01"
+ "\x6b\xc9\x83\xc9\xbc\x04\x63\x13\x02\x93\x79\x0f\xb6\x10\x53\x88"
+ "\x2d\xc4\xd5\x35\x80\x2b\xc4\x9a\x07\x5b\xe5\xe7\x18\xb6\xa2\x8e"
+ "\x10\xe5\xce\xd3\x80\x2f\x17\xc3\x17\xae\x73\x6e\xcc\xfa\xcc\xbf"
+ "\xec\x9f\xeb\x85\x2d\x4e\xc4\xd6\x06\xc0\xd6\x06\x2f\xb6\xe6\x1d"
+ "\x55\x92\x5d\x02\xb6\x52\xbc\xd8\xd2\x4d\x52\x7b\x70\x85\x18\x43"
+ "\x3c\xf1\xcb\xd5\x04\xe5\xdd\x83\xb1\xea\x65\x6c\xfc\x54\x90\x7d"
+ "\x0e\x64\xbf\x4b\x62\x43\xc7\x0f\x45\xf6\x37\x08\xfb\x3f\x20\x4f"
+ "\x90\x3f\xc8\x17\xe4\xc5\x95\xc8\x07\x3c\x1b\x9a\x76\xf5\xc7\x8b"
+ "\x85\x15\x83\xf1\x02\xf9\x80\xfc\x10\xf8\x00\xfc\xf0\x8c\x65\xe3"
+ "\xd8\x26\xf2\x04\x79\x71\x67\x36\xe1\x90\x2f\xd5\x20\xef\x28\xe3"
+ "\x40\xdb\x2c\xe4\x8b\xe0\xb7\x16\x28\x96\x6f\x1f\xeb\x3d\x33\xa6"
+ "\xab\x70\xe3\xa4\xbe\x3e\xeb\xc6\x04\xef\x3e\x6b\xeb\xdb\x58\x8c"
+ "\x61\x8e\x66\x63\x51\x9b\xfe\x20\xca\x30\xc1\x78\x4f\x88\xed\xdc"
+ "\x10\xdb\xc9\x21\xb6\x2b\x81\xd8\x0e\xfb\xde\x84\x3d\x08\x36\xea"
+ "\xd8\xb8\x18\xc4\x72\x8a\x86\x78\x88\x2b\x84\x3d\x11\x85\x31\x58"
+ "\x85\x25\x0f\xc7\x8c\xa8\x0e\xe2\xc6\xd7\x38\x02\xcf\x80\x1b\x77"
+ "\x90\x78\xd9\xf8\x96\x38\xc6\x6c\x67\xfb\xf3\x6d\xca\x66\xf5\x5b"
+ "\x2f\xcc\x53\x10\xc6\xe7\x38\x7e\x8f\xfb\x05\xdf\xf1\x39\xe9\xf8"
+ "\xed\xbb\x39\x76\x71\x6c\x6e\x93\xb0\xbf\x11\xea\x04\xd4\x63\x6f"
+ "\xe7\x34\x73\xde\xf1\xb9\xcf\xf0\xfd\x52\xdf\xf1\xb9\x4d\x82\xbf"
+ "\x67\x93\x6d\x2a\xc3\x39\x29\xf0\x3c\x83\xa5\xaf\xdf\x2e\x4d\xf7"
+ "\x8e\x7f\xb3\x74\x5c\x03\x25\xc6\xd7\x1d\x2c\xb6\xde\xb4\xcf\x13"
+ "\xc3\xfa\xf1\x67\x82\xd0\xb3\xb9\xf3\xbd\x7a\x36\x57\x88\x35\x69"
+ "\x74\x53\x62\x63\x1f\x3d\x8b\x7b\x5b\xe5\x98\x66\xa1\x9e\x2d\x69"
+ "\x48\x60\xf5\xdb\x7c\x2f\xd0\x24\x0c\xcf\x7a\xc3\x74\x5c\x2b\x84"
+ "\x3a\xb7\x4a\xd0\xc1\x4d\xf1\x5b\x85\x31\xf8\xcd\x73\x7c\x75\x6f"
+ "\x4e\x91\xaf\xee\xdd\xfc\xe2\xc0\xba\x77\xcb\x1d\x03\xeb\xde\xcd"
+ "\x1f\x5c\xd5\xbd\xa1\xea\x5e\xf0\xbb\x86\xa4\x7b\xb3\x1d\x57\x75"
+ "\xef\x85\xd2\xbd\xd9\x9d\x12\xdd\x3b\xc7\x57\xf7\xe6\xec\xeb\xab"
+ "\x7b\x73\x0e\x78\x75\xef\xe6\x14\x5f\xdd\x9b\xa7\x08\x4c\xf7\xe6"
+ "\x8e\xbe\xb0\xba\x37\x57\xed\xab\x7b\x73\x45\x3d\xb7\xc9\x1d\xbc"
+ "\xee\xcd\x3d\x3c\xb0\xee\xcd\xfd\xd2\x57\xf7\xe6\xee\x67\x3a\x36"
+ "\x4f\xce\x74\x6f\xae\x59\xd4\xc9\x2e\x69\xba\x57\xf7\xb2\xf4\xbe"
+ "\xba\x37\x2f\x76\x10\xdd\xab\x76\xf3\x1e\xdd\xdb\x0a\xba\xb7\x95"
+ "\xe3\x97\xfb\xd3\xbd\xdb\xe2\x1a\x51\xf7\xa6\xa3\xee\xdd\x16\x37"
+ "\xb0\xee\xdd\xba\x03\x75\xac\xb0\x57\xe5\x2b\xb4\x4d\xd8\x2b\xf0"
+ "\x15\xda\x8e\x78\x9c\x95\x0d\xe9\x90\x86\x7b\x2a\x62\x3e\xc6\x7b"
+ "\x8f\x8e\xce\x3b\xdc\xa3\xa3\x21\x1f\x7f\xbd\x57\x47\xa3\x7e\x46"
+ "\x3d\x5d\xf5\x0a\xb5\x55\xbf\x82\xe7\x6f\xe4\x13\x8f\xae\xd6\x41"
+ "\x1a\x9e\xb1\x81\xfb\x01\xe1\x7c\x44\xa0\x41\xdb\x0b\xf0\x3d\xcc"
+ "\x0f\xf9\xd4\xbe\x3a\x7d\xeb\x7c\x5f\x9d\x9e\xff\xdc\xc0\x3a\xfd"
+ "\x05\xd9\xc0\x3a\x3d\xff\xc5\xab\x3a\xfd\x52\xe9\xf4\x02\xcb\x55"
+ "\x9d\x3e\xb8\x4e\xef\x8f\x17\xbd\x75\xfa\x1d\xa2\x4e\xaf\xea\xd1"
+ "\xe9\x05\x66\xff\x3a\x7d\x6b\x76\x5f\x9d\xbe\xb5\xcc\xab\xd3\xf3"
+ "\x27\xfb\xea\xf4\x6d\x5f\x06\xa6\xd3\xb7\x1e\xbd\xb0\x3a\x7d\xab"
+ "\xcb\x57\xa7\x6f\x13\xcf\x2c\xcc\xdb\x28\xd5\xe9\x7c\x58\x20\x3a"
+ "\x7d\xdb\xdb\x1e\x9d\x8e\x3a\xf3\x6d\xbe\x55\xa2\xd3\x51\xb7\x6d"
+ "\xfb\xc0\x90\x79\x4c\xa2\xd3\xb7\x15\x31\xdd\xbd\xcd\xe6\x16\x74"
+ "\xfa\xb6\x4a\x96\x9e\x97\x25\x4d\xf7\xea\x74\x96\xee\x96\xea\xf4"
+ "\x76\xd4\xe9\xdb\x1c\x83\xe8\xf4\xb8\xc0\x75\xfa\x4b\xc9\x5e\x9d"
+ "\xfe\x52\xb2\x47\xa7\xa3\x1e\x47\x9d\x8e\x3a\x18\xf5\xba\xb0\x8f"
+ "\x96\x30\xa7\xa2\xf8\x93\x28\x3b\x89\xc0\x7d\x73\xb1\x0f\x03\x75"
+ "\xb1\xfe\x34\xd3\xed\x42\x9e\xd5\x2c\x0f\xe8\xe7\x36\xd0\xc9\xed"
+ "\xa0\x93\xdb\x75\xa7\x48\x38\xe4\x6b\xd5\xe3\xfc\x3c\x78\x46\xdd"
+ "\x1d\xd5\x01\x76\xc0\x25\xd8\x81\x56\xb4\x1f\x8c\x5e\xc5\x9f\xf8"
+ "\xda\x82\xc2\xaf\xfa\xf3\xd7\xcb\x24\xb6\xa0\xfa\x3a\xda\xd2\x55"
+ "\xf8\xfb\x08\x8f\x7e\xd7\xc3\x33\xda\x80\xb2\xd3\x82\x0d\xb0\x81"
+ "\x0d\x68\x63\x36\xe0\xf7\x93\x7a\xf2\x40\x1d\x84\x3c\xcc\x4e\xb4"
+ "\xbe\x80\xe7\x8f\xb1\x3c\xb3\x7d\xed\x44\xf1\x56\x5f\x3b\xf1\xfb"
+ "\x6d\x68\x27\xa0\x0d\x78\x56\x97\x8c\xd7\x99\x93\xdd\x55\xfa\x0a"
+ "\xb4\x19\xec\xfd\x8b\x13\x7b\xec\xc4\x75\x12\x3b\x91\xe5\xb1\x13"
+ "\xbf\x7f\xef\xb2\xb7\x13\x80\xe5\xc6\xec\x2b\xd1\x4e\x14\x75\x5e"
+ "\x0e\x76\x02\x79\x70\x8d\xa4\x6f\xd5\x1f\x1f\x70\x2f\x86\xc6\xb4"
+ "\x1f\x8a\x9d\x28\xb2\xfb\xb7\x13\xc5\x7b\xfb\xda\x89\xe2\x5a\xaf"
+ "\x9d\xf8\xfd\x7c\x5f\x3b\x51\x32\x3a\x30\x3b\xf1\xd2\x88\xde\x76"
+ "\x02\x69\xa6\x67\xf3\x02\x3a\xd0\x3e\xb8\x75\x96\x3c\x1e\x6d\x45"
+ "\x48\x76\xe2\xa5\x58\x5f\x3b\xf1\x92\x38\xe7\xbf\x70\x66\xf0\x76"
+ "\xe2\xa5\xcf\x85\xf1\x7e\x8f\x9d\x38\xd7\xdb\x4e\xbc\x74\xd4\xd7"
+ "\x4e\xbc\x54\xc3\xec\x41\x49\x04\xb3\x13\x2f\x19\x59\x7a\xe1\x0c"
+ "\x69\xba\xd7\x4e\xb0\xf4\xbe\x76\xa2\x44\x35\x88\x9d\x90\x3b\x63"
+ "\xf4\x15\xce\x92\xc6\x3c\xd7\xde\x52\xd5\xa4\xe4\x47\xdd\xbd\x65"
+ "\x80\x61\xdf\xcd\xce\xa5\xf1\x8c\xf9\x2c\x60\x63\x0c\xbc\xb8\xa6"
+ "\xb7\x3b\x46\x5f\x74\x3c\x0d\xe4\xa0\xc3\xbf\x1c\x80\x0c\x44\x78"
+ "\x64\xa0\x51\xf3\x15\x01\xb9\xe0\x70\x1c\x68\x17\xe0\xdf\xda\xd9"
+ "\x2a\xe8\x25\x79\x5b\x02\xc1\xbd\x14\x15\x1d\x44\xa9\x90\xc9\x46"
+ "\xe2\x18\x83\x1b\x64\x61\xfa\x44\xca\xff\xbc\x35\x81\x28\x34\x24"
+ "\x12\xe5\xe1\x1d\x71\xac\x01\xf7\x63\xc0\x31\x06\xc0\x61\xdc\xc2"
+ "\xbf\x79\xc7\x18\xba\x03\x18\x63\xb0\x66\xd9\x84\x31\x06\x5c\xa3"
+ "\xc4\x83\x0c\x08\xeb\x66\x70\x8c\xc1\x21\x8c\xcb\x28\x85\xb5\x2a"
+ "\xc2\x18\xc3\x31\x82\xe3\x0b\x9e\xfd\x58\x70\x5c\xe1\xe7\xc9\x84"
+ "\xc3\xfd\x1a\x76\x01\xfe\x4d\xea\x46\x82\x32\x10\xbc\x3e\xd2\x6d"
+ "\x1d\x68\x9e\x8d\x0b\x68\xea\x96\x37\xe6\xd1\x9d\x4d\xda\x3f\x1f"
+ "\x73\xc8\x70\xaf\x4a\x37\xf0\x88\x07\xbd\x43\xe5\xbd\xf4\x8e\x53"
+ "\xa4\xb7\x93\xd1\x1b\x78\x15\xb1\xa0\x93\x50\x48\x67\x7b\x55\x3a"
+ "\x6c\x80\x35\xf5\xd8\xaa\x4d\x48\xdb\x38\x52\x25\xee\x57\xc9\x6f"
+ "\xd6\x8c\xe6\x81\x9e\xb8\x36\xe1\xed\x73\x8e\x11\x6e\xf9\xad\xea"
+ "\x92\x6e\x32\x09\x74\x8c\x02\x75\x0c\xe0\x73\xcc\xee\x6e\xa0\xed"
+ "\x97\x8c\xb6\xb8\x6f\x1a\xde\x5d\x9b\xe1\x37\x4e\xf5\xcd\x4e\x27"
+ "\xd0\xd7\xc1\xe8\xbb\x60\xad\x92\x54\x7b\xc6\xd8\xc0\x3e\x37\x01"
+ "\x4f\x51\xc7\xcc\xea\x8c\xa2\x78\x1e\x84\xdb\xa9\x8e\xe1\xbf\x06"
+ "\xfa\x76\xe2\xd9\x1f\x6a\xe4\xbf\xb2\xfa\x38\x8e\x09\xfe\x9d\x8d"
+ "\xb1\x29\xc4\x7d\x30\x36\x83\xbe\x5f\xa1\x22\xd6\x7d\xa0\x6f\x47"
+ "\x96\x4c\x76\x56\xe9\x8b\xa8\x0c\xf4\x7d\x76\xb0\xf4\xd5\xb7\x5d"
+ "\x1a\xfa\xaa\x7e\x40\xf4\xd5\x59\x42\xa7\x6f\x99\xdf\xf5\xcf\x17"
+ "\x96\xbe\xca\x1f\x10\x7d\x4b\x27\x85\x4e\xdf\x3f\xec\x1d\x88\xbe"
+ "\xe8\xdf\x7b\x7c\x7b\x8f\x5f\x8f\xb6\x85\xd9\xc6\xed\x31\x5e\x9f"
+ "\x7e\x7b\x8c\x67\x2c\x12\x68\x13\xae\x13\xfb\x68\xb4\xcb\xf0\x0c"
+ "\x84\xf2\x3f\x78\xc6\x21\xd1\xa7\x16\x78\xb5\x13\x78\xb5\x1a\xd7"
+ "\xa0\x88\x7c\x02\x3b\xb0\xb0\x13\x74\xf5\x78\x7d\x85\x5b\x07\x76"
+ "\xe2\xf5\x52\x95\x1f\x9e\x71\xa8\xe3\x15\x19\x44\xb9\x40\xcb\x78"
+ "\xc7\x6f\x06\x9e\x75\x83\x7f\xe3\x68\x27\xb8\xa6\x34\xaa\x1d\xf4"
+ "\xaa\x53\x33\x7a\x3e\xf8\xcb\x1e\xbe\xbd\x93\xe9\x10\x7c\x9b\x7e"
+ "\xf9\xb6\xc3\x97\x6f\x67\xfa\xe1\x9b\x77\x6c\x1f\xfc\x4c\x81\x6f"
+ "\x36\x81\x6f\x82\x5e\xdf\x0c\xbe\x0d\xf0\xcf\xc3\x37\x41\xaf\x03"
+ "\xef\x04\xbe\x75\x1c\x23\x6e\x89\x5e\x47\xbf\x06\x79\x67\x49\x01"
+ "\xff\xb2\xb0\xac\x44\xe0\x1b\xfa\x99\x29\xc1\xf2\xad\xbc\x97\x3f"
+ "\xb3\xfd\x60\x60\xfe\x4c\xf9\x61\xf4\x59\xa4\xfe\x0c\x3e\x9f\x81"
+ "\x98\xd7\xad\xb0\x6c\xed\x0c\xc9\x87\x29\x6f\xf7\xf5\x61\xb6\xef"
+ "\x67\x75\x7a\xf9\xa6\xe0\x7d\x98\xed\xc2\x78\xd3\xdb\x3b\x59\x2c"
+ "\xe9\xeb\xbf\x6c\xaf\xf2\xf5\x5f\xb6\x6b\x99\x9f\xb2\xdd\x7c\xa6"
+ "\x00\xfd\x97\xed\x5b\x59\xfa\xcb\x2a\x69\xba\xd7\x7f\x61\xe9\xec"
+ "\xac\xf2\xed\x2d\xc1\xf9\x2c\x77\x5d\x62\x9f\x25\x6e\x00\x9f\x25"
+ "\xee\x0a\xf3\x59\x5e\x89\xbf\x6a\x53\x07\xd3\xf9\xdb\xdb\x43\xd7"
+ "\xf9\xff\x52\x71\xd5\xa6\x0e\x46\xdf\x57\xf2\x42\xa7\x6f\x85\x23"
+ "\x74\x9b\xba\x4b\xeb\xb5\xa9\xbb\xb4\xfe\x6d\xea\xce\xaf\xae\xda"
+ "\xd4\xfe\x6c\xea\xbf\xd8\x42\xb7\xa9\x3b\x6b\x7c\x6d\x6a\xe5\xf8"
+ "\xc0\x6c\xea\xae\x3b\x86\xdf\xa6\xee\x9a\xe2\x6b\x53\x2b\x23\x58"
+ "\x9d\x76\xac\x0f\xde\xa6\xee\xfa\xc6\xbf\x4d\xdd\xf5\xbd\xaf\x4d"
+ "\xdd\x65\x64\xb6\xb3\x32\x86\xd9\xd4\x5d\xad\x2c\x7d\x47\x86\x34"
+ "\xdd\x6b\x53\x59\x3a\xb3\xa9\x95\xea\xe0\x6c\xea\x8d\x97\xd8\xa6"
+ "\xaa\x06\xb0\xa9\xaa\x2b\xcc\xa6\x56\xf9\xdd\xff\xf2\xaa\xce\xf7"
+ "\xe8\xfc\xca\x29\xa1\xeb\xfc\x6a\xbf\x67\x14\x0e\xae\xf3\x5f\x4d"
+ "\xf5\xea\xfc\x57\x53\xfd\xeb\xfc\x3d\x87\xaf\xea\xfc\xfe\x74\x7e"
+ "\x55\x4b\xe8\x3a\x7f\xcf\x5e\x5f\x9d\xff\xda\xb5\x81\xe9\xfc\x57"
+ "\x6f\x1a\x7e\x9d\xff\x6a\x9c\xaf\xce\x7f\xd5\xc5\xea\xb4\x7b\x45"
+ "\xf0\x3a\xff\xd5\xa3\xfe\x75\xfe\xab\x5f\xf9\xea\xfc\x57\x6b\x99"
+ "\x6e\x7f\x4d\xc9\x74\xfe\xab\x16\x96\xbe\x5b\x23\x4d\xf7\xea\x7c"
+ "\x96\xce\x74\xfe\x6b\x31\xc1\xe9\xfc\xa8\x4b\xac\xf3\x95\x03\xe8"
+ "\x7c\xe5\x15\xa6\xf3\xff\x35\x2f\x74\x9d\xf4\xba\xc3\xab\x93\x5e"
+ "\x77\xf8\xd7\x49\xaf\xaf\xba\xaa\x93\xfa\xd3\x49\xaf\xc5\x85\xae"
+ "\x93\x5e\x8f\xf7\xd5\x49\x6f\xbc\x1e\x98\x4e\x7a\xfd\x83\xe1\xd7"
+ "\x49\xaf\x1b\x7d\x75\xd2\x1b\x65\xac\x4e\xff\xea\x0e\x5e\x27\xbd"
+ "\xb1\xd6\xbf\x4e\x7a\x63\xa3\xaf\x4e\x7a\x43\x1c\x83\x7a\x63\x2f"
+ "\xd3\x49\x6f\xa4\xb0\xf4\x7f\x75\x49\xd3\xbd\x3a\x89\xa5\x33\x9d"
+ "\xf4\x46\xcd\x60\x3a\x09\xb1\xdf\x18\xdd\x0b\xfb\x2b\x3d\xd8\x7f"
+ "\x33\xe2\xd3\x4a\x0f\xf6\xdf\x14\xf6\xac\xe2\x2b\x4b\xa3\x5f\xca"
+ "\x24\xe1\x25\x78\x96\x08\xc8\xbb\xf6\x59\xc4\xfe\xbe\x2d\x38\x6f"
+ "\x41\x7e\x04\x74\x58\x9b\xa8\xd3\xb2\x40\xa7\xb5\xc1\x33\xee\x31"
+ "\x35\xbe\x34\x1a\x75\x11\x8e\xff\xe3\x33\xd3\x6d\xf6\x11\xb8\x5e"
+ "\x32\xa8\xb5\x4c\x6d\xe2\x5a\xa6\xd4\xbe\x6b\x99\x2a\x25\x6b\x66"
+ "\x50\x36\x14\xf9\xb2\x48\x1c\xd7\x05\xfd\x26\xea\x31\xf3\x08\x97"
+ "\x5c\xd4\x63\xe7\x40\x8f\x9d\xf3\xca\x04\xea\xb1\x33\xa0\xc7\x3a"
+ "\x37\xa8\x27\xa0\x2e\xeb\xbb\x8e\x89\x8d\xe3\x0a\x7a\x4c\xd7\x4b"
+ "\x8f\x2d\xef\xa5\xc7\x96\x81\x1e\x4b\x01\x3d\xa6\xf0\xca\xc3\xcf"
+ "\x8e\x10\x6e\xc6\x22\x90\x09\xd0\x63\xe5\xe7\x50\x8f\x99\x42\xd4"
+ "\x63\xfb\x12\x7d\xe5\xe1\xcd\x0f\x02\x93\x87\x7d\x26\x7f\xf2\xe0"
+ "\xd4\x85\x2a\x0f\xfb\x5a\x7c\xe5\xe1\x4d\xf1\x3c\xe2\x37\xce\x07"
+ "\x2f\x0f\x6f\xe6\xf7\xc8\xc3\xca\xde\xf2\xf0\xe6\x8b\xbe\xf2\xf0"
+ "\xe6\x7c\x86\xfb\x37\xf7\x33\x79\x78\x53\x2b\xca\x89\x43\x9a\xee"
+ "\x95\x07\x96\xce\xe4\xe1\x4d\xc3\xd5\xf1\xd9\xcb\xd5\x46\xff\x79"
+ "\xa0\x33\xb4\xaf\x8e\xcf\x0a\x71\xd9\x9b\x2d\xa1\xc7\x65\x6f\x5d"
+ "\xa2\xf1\xef\x1f\x52\x5f\xf2\x9f\xd3\x42\xa7\xef\xdb\x97\x68\xfc"
+ "\xfb\x87\xd4\xaf\xf0\xd6\x10\xc6\xbf\xdf\x1d\x70\xfc\x7b\x60\x3f"
+ "\xe6\xbd\x16\x4b\x8f\x0f\xff\x5e\x8b\x67\xce\x65\x5f\x1f\xfe\xbd"
+ "\x27\x7c\xd7\x2f\xbd\x7b\xb6\xf7\x7c\xc8\xc1\x7c\x7b\xd7\xff\x2a"
+ "\xdf\xfe\x9d\x49\xa1\xfb\xf6\xef\x8d\xf3\xf5\x65\xde\xcf\x0f\xcc"
+ "\x97\x79\xef\x0f\xfe\x7c\x19\x57\xc8\xbe\xfd\x7b\x7b\x7c\x7d\x99"
+ "\xf7\xd3\x44\xfe\x7f\x12\xbc\x2f\xf3\xfe\x4c\xff\xbe\xcc\xfb\x73"
+ "\x7d\x7d\x99\xf7\xc5\x73\xf5\xde\xcf\x63\xbe\xcc\xfb\x53\x58\xfa"
+ "\xbb\x06\x69\xba\xd7\x97\x61\xe9\xcc\x97\x79\xbf\xe4\xea\xb8\xed"
+ "\xe5\xea\xcb\xfc\x9b\xdf\xf3\xaf\xae\xda\x5a\x8f\x2d\x78\x7f\x4f"
+ "\xe8\xb6\xe0\x83\xd9\x57\x6d\xed\x60\xf4\xdd\x1f\x1f\x3a\x7d\xff"
+ "\xbd\x26\x74\x5b\xfb\x61\x82\xd7\xd6\x7e\x98\xe0\xdf\xd6\xd6\x7e"
+ "\xe0\x6b\x6b\xff\x63\xd1\x55\x5b\x3b\x90\xad\xfd\xa0\x22\x74\x5b"
+ "\x5b\x9b\xe7\x6b\x6b\x3f\x3c\x19\x98\xad\xad\x75\x0f\xbf\xad\xfd"
+ "\x50\xee\x6b\x6b\x3f\x6c\x15\xf9\x7f\x47\xf0\xb6\xf6\xc3\x0f\xfd"
+ "\xdb\xda\x0f\x3f\xf1\xb5\xb5\x1f\x8a\x6b\xe8\x3f\xec\x60\xb6\xf6"
+ "\xc3\x7d\x2c\xfd\x3f\x26\x49\xd3\xbd\xb6\x96\xa5\x33\x5b\xfb\xe1"
+ "\x60\xeb\x7f\xae\x8e\xe7\x5e\x32\x5b\xfb\x9f\xf3\xaf\xda\x82\xc1"
+ "\x6c\xc1\x5f\xe4\xa1\xdb\x82\x03\x07\x42\xb7\x05\x1f\xcf\xf0\xda"
+ "\x82\x8f\x67\xf8\xb7\x05\x7f\xfd\xc4\xd7\x16\x7c\xb4\xea\xaa\x2d"
+ "\x18\xc8\x16\xfc\xe7\xde\xd0\x6d\xc1\x5f\x4b\x7c\x6d\xc1\xc7\xe7"
+ "\x03\xb3\x05\x1f\x8f\x1e\x7e\x5b\xf0\x71\xb4\xaf\x2d\xf8\xb8\x4d"
+ "\xe4\xff\x03\xc1\xdb\x82\x8f\x4d\xfe\x6d\xc1\xc7\x8d\xbe\xb6\xe0"
+ "\xe3\x3d\x4c\xe7\x7f\xec\x60\xb6\xe0\xe3\xfd\x2c\xfd\xa3\x78\x69"
+ "\xba\xd7\x16\xb0\x74\x66\x0b\x0c\xe1\x57\xc7\x79\x2f\x57\x5b\xf0"
+ "\x89\x26\x74\x5d\x55\xe7\xf0\xea\xaa\x3a\x87\x7f\x5d\x55\xb7\xca"
+ "\x57\x57\xfd\xd7\xf5\x57\x75\xd5\x40\xba\xca\x10\x1d\xba\xae\xaa"
+ "\xeb\x35\xfe\x6b\x0c\x70\xfc\xb7\xce\xef\xf8\x6f\xe8\xba\xaa\xae"
+ "\xd7\xf8\xaf\x51\x1c\xff\xfd\xe4\xab\xe0\x75\x95\x71\xad\x7f\x5d"
+ "\x65\xec\x35\xfe\x6b\x14\xc7\x7f\x8d\xe2\xf8\xaf\x51\x1c\xff\xfd"
+ "\xa4\x4d\x9a\xee\xd5\x55\x2c\x9d\xe9\x2a\xe3\x10\xc7\x7f\x1b\x54"
+ "\xde\xf1\xdf\x06\x61\xcd\x00\x5f\xd1\x94\xd8\x77\xfc\xb7\xfe\x8f"
+ "\x38\xfe\xeb\x95\x09\xd3\xdd\xc2\x58\x30\xca\x45\x27\xdb\x57\xa4"
+ "\xdf\x71\xe1\xeb\x9b\x12\xaf\x8e\x0b\x0f\xc7\xb8\x70\x7d\x8a\xaf"
+ "\x9c\x34\x34\x06\x26\x27\xf5\x47\x87\x7f\x5c\xb8\xbe\xc3\x57\x4e"
+ "\x1a\x6a\x45\xd9\x0d\x61\x5c\xb8\x61\x87\x7f\x39\x69\x78\xd5\x57"
+ "\x4e\x1a\xc4\x79\xb9\x0d\x16\x26\x27\x0d\x45\xa2\xfc\x38\xa4\xe9"
+ "\x5e\x39\x31\x4a\xc6\x85\x1b\x5a\x03\xb1\xe9\x2e\x79\xe3\x56\xb4"
+ "\xd1\x93\x5a\x1f\x75\xf7\xe0\x39\x43\xc4\x73\x7f\x36\x7d\x31\xd3"
+ "\xfd\x88\x63\xe7\xde\xd2\xd8\x41\x6d\x7a\x9b\x68\xd3\x53\xfb\xda"
+ "\x74\x8f\x3d\x47\x3c\xef\x0a\x68\x4c\xb8\x17\xae\x83\xb2\xe7\x8b"
+ "\xcb\x86\x82\x6b\xc4\xb4\xaf\x3d\x0f\x15\xd7\x07\x2f\xd1\xfa\x97"
+ "\x1f\xd2\x98\x70\x43\x47\xe8\xb1\xdd\xa1\x4b\xb4\xfe\xe5\x87\xd4"
+ "\x4f\x7d\x70\x08\xeb\x5f\x3e\x1d\x70\xfd\xcb\xd5\xbe\x09\xa4\xef"
+ "\x21\x5b\xe8\xf4\x6d\x4c\x0e\xdd\xdf\x6f\x8e\xf0\xfa\xfb\xcd\x11"
+ "\x1e\xdf\xc6\xb3\x5f\x1a\xe8\xcc\x70\x5d\x3a\x5c\xe7\x08\x79\x29"
+ "\x5d\xd8\xeb\x3b\xc2\xda\xf6\x39\x9e\x4f\x04\xfe\x8e\x75\x4b\x52"
+ "\x96\xd4\xdf\x69\x1a\xef\xf1\x75\x92\xd0\x0f\x02\xbf\x06\x7d\x1a"
+ "\x8f\x8f\x8f\x7b\xe3\x0c\x38\x1f\xf4\x96\xd2\x58\x8c\x09\x9c\x8a"
+ "\xc6\xad\x57\x7e\x3c\x60\x49\x08\x3d\x1e\xb0\xf6\x9a\xff\xd6\x1c"
+ "\xe0\xfc\x37\xab\xdf\xf9\x6f\xa1\xc7\x03\xd6\x5e\xf3\xdf\x9a\xc5"
+ "\xf9\x6f\x8d\x9f\x07\xef\xe7\x34\x0f\x30\xff\xad\xb9\xd7\xfc\xb7"
+ "\x66\x71\xfe\x5b\xb3\x38\xff\xad\x59\x9c\xff\xd6\xd8\x22\x4d\xf7"
+ "\xfa\x39\x2c\x9d\xf9\x39\xcd\x01\xcd\x7f\x03\x3f\xa7\x68\x08\x7e"
+ "\xce\xe0\x7d\x17\x97\x8d\x9f\xb3\xe4\x32\xf1\x73\x3e\x53\x05\x60"
+ "\x27\xb6\xf6\xb2\x13\xb1\xff\xbb\xec\x44\xf3\x10\xe6\xbe\xfd\xdf"
+ "\x01\xe7\xff\x0b\xf4\x2d\x91\xd0\x17\x75\xb4\x48\x5b\x77\x6c\x69"
+ "\x6c\x48\xf4\x05\xdd\x5c\x95\xf3\x43\xa1\xed\x67\x9a\xd0\x69\xdb"
+ "\x72\xe4\xaa\x8f\x33\x18\x7d\xff\xaf\x39\x74\xfa\xfe\xf7\x94\xd0"
+ "\x7d\x9c\xc3\xf2\x4f\x7b\x7c\x9c\xc3\xf2\xde\x3e\x0e\xfa\x34\x33"
+ "\x1d\xcc\xd7\x79\x09\x7c\x94\xe2\xd5\xe0\xef\x64\x12\x62\x6d\xfb"
+ "\x88\x94\x80\xcf\x53\x7c\x0a\xfc\x9e\x34\xf0\x7b\x5c\xaf\x8b\x7e"
+ "\x4f\x6b\xbe\xaf\xdf\xf3\x3f\x3f\xee\xd7\xef\x51\x78\xfd\x1e\x17"
+ "\xf8\x34\xce\xd7\x4b\x63\xcb\x4e\x49\x7c\xa0\xe7\xfb\xfa\x40\xdd"
+ "\x3a\xb0\x39\xb7\x94\xaa\x9d\xe0\x07\x0d\xe4\x03\x09\xbc\xef\xe5"
+ "\x07\xfd\xf0\x7c\xa0\xcf\x63\x43\xf7\x81\x5a\x67\xf8\xfa\x40\x87"
+ "\x3f\x0c\xcc\x07\x6a\x3d\xe8\xb7\xaf\x27\x64\x1f\xa8\xb5\xd5\xd7"
+ "\x07\x3a\xbc\x97\xd5\xe9\xbf\x3f\x0c\xde\x07\x3a\xbc\xcd\xbf\x0f"
+ "\x74\x58\xe7\xeb\x03\x1d\x4e\x61\xbe\xce\xe1\x5a\xe6\x03\x1d\xce"
+ "\x60\xe9\xff\x5d\x2b\x4d\xf7\xfa\x40\x2c\x9d\xf9\x40\x87\x8d\x01"
+ "\x8e\xdf\x6c\x75\x81\x8d\xbd\xf4\xf3\xe6\x06\x1a\xbf\x19\xae\x79"
+ "\x73\x8b\x2f\x93\xf1\x9b\x7f\xa8\xaf\xda\xe9\x81\xec\xc8\xe1\xd6"
+ "\xd0\xed\xc8\x91\x4b\x34\xff\xff\x87\x64\xa7\xff\xa1\x0d\x9d\xbe"
+ "\x47\x07\x9c\xff\x3f\xb0\x9d\xb6\x6d\xf7\xf6\x45\xd8\xb6\x07\xd7"
+ "\x17\x61\x1b\xed\x6b\x93\xff\xdf\x9b\x57\xfb\x22\x02\xb5\xc3\x47"
+ "\x2c\xa1\xdb\xe1\x2f\x5a\x7c\xed\xf0\x97\x8f\x05\x66\x87\x6d\x4f"
+ "\x0d\x7f\x5f\x84\x2d\xc5\xd7\x0e\x7f\x39\x49\xc4\xc2\xa2\xe0\xed"
+ "\xf0\x97\x0a\xff\x76\xf8\xcb\x1f\xfb\xda\x61\x5b\x3b\xb3\xb7\x5f"
+ "\x26\x30\x3b\x6c\x73\xb1\xf4\xff\x97\x22\x4d\xf7\xda\x61\x96\xce"
+ "\xec\xf0\x97\x33\x82\x1b\x73\xb9\xf1\x32\x1d\x73\x51\x5d\x61\x63"
+ "\x2e\xc7\xde\xba\x6a\x27\x06\xb3\x13\x5f\xa6\x84\x6e\x27\xda\xe4"
+ "\xa1\xdb\x89\xe3\x07\xbc\x76\xe2\xf8\x81\xe0\xec\xc4\xf1\xbb\x7d"
+ "\xed\x44\xdb\xdf\xae\xda\x89\x40\xed\xc4\xb1\xce\xd0\xed\xc4\x57"
+ "\x2e\x5f\x3b\xf1\xf5\x8a\xc0\xec\xc4\xf1\x8d\xc3\x6f\x27\x8e\x17"
+ "\xf9\xda\x89\xaf\xe7\x88\x58\x78\x31\x78\x3b\xf1\xf5\xbd\xfe\xed"
+ "\xc4\xd7\x0f\xfb\xda\x89\xaf\x95\xcc\x1e\x7c\xad\x61\x76\xe2\xeb"
+ "\x58\x96\xde\x56\x24\x4d\xf7\xda\x09\x96\xce\xec\xc4\xd7\x19\x57"
+ "\xe7\xdb\x5d\xae\xf3\xed\xda\x5b\x43\xd7\x65\xdf\x6a\xbc\xba\xec"
+ "\x5b\x8d\xff\xf9\x76\x27\x8e\xfa\xce\xb7\xfb\xe6\xc5\xab\xf3\xed"
+ "\x06\xd2\x55\x5f\x17\x85\xae\xab\x4e\xec\xf3\xd5\x55\x1d\x3f\x0e"
+ "\x4c\x57\x7d\x7b\xcb\xf0\xeb\xaa\x6f\x27\xfb\xea\xaa\x0e\x22\xf2"
+ "\x7f\x6e\xf0\xba\xea\xdb\x2f\xfd\xeb\xaa\x6f\xbf\xf1\xd5\x55\xdf"
+ "\x1e\x60\x3a\xa9\x63\x1c\xd3\x55\xdf\x36\xb3\xf4\x6f\xe6\x48\xd3"
+ "\xbd\xba\x8a\xa5\x33\x5d\xd5\x11\xd0\xfe\xff\xde\xf1\xb5\x90\x7c"
+ "\xda\x8b\x30\xbe\x36\x5c\x3e\xed\xe5\x32\xbe\x76\xf2\xea\xf8\xcf"
+ "\x80\xfe\x6c\xc7\x10\xf6\xfd\x3f\x35\xe0\xf8\xcf\xc0\x36\xe0\xfb"
+ "\xbd\x5e\x1b\xf0\xfd\x5e\x7f\xe3\x13\xc5\x80\xa1\x12\xf0\x47\x5f"
+ "\x3c\x45\xc2\x5f\xc2\xf1\x89\x96\x46\xa2\xc3\xf1\x89\xd5\x9e\xf1"
+ "\x89\x2a\xd1\xc7\xfd\xfe\x7a\x5f\x1f\xf7\xbb\x0f\xfa\xf3\x71\xd1"
+ "\xb7\x75\x83\xdf\xea\xea\x3d\x2e\xf1\x6c\xff\xb6\xa3\x5b\xd1\x58"
+ "\x74\xfe\xf5\x52\x75\x30\xb6\x63\xd7\x26\x66\x3b\x76\xfe\xa0\x6c"
+ "\xc7\x49\x73\xe8\xb6\xc3\xde\xeb\x3c\xdf\xd3\x4f\x05\x66\x3b\xbe"
+ "\x5f\x34\xfc\xb6\xe3\x7b\xad\xaf\xed\x38\x3d\x45\xc4\xc3\x33\xc1"
+ "\xdb\x8e\xd3\xe3\xfd\xdb\x8e\xd3\xb7\xf8\xda\x8e\xef\xc5\xb9\xa6"
+ "\xa7\x67\x33\xdb\x71\x5a\xce\xd2\xbf\x4b\x96\xa6\x7b\x6d\x07\x4b"
+ "\x67\xb6\xe3\xf4\xfc\xe0\xfa\x43\xa2\x2e\xd3\xfe\x10\xe5\x15\xd6"
+ "\x1f\x72\x66\x08\xeb\xdf\xce\xa5\x5a\x7a\xe6\xcf\x9f\x4b\xed\x13"
+ "\xaf\x67\x82\xaf\x7b\x9a\x8d\xb9\xf6\xc4\xeb\xb6\xa3\xa2\x2e\x3b"
+ "\x7b\xd8\x57\x97\x75\xe6\xfb\xd3\x65\x03\x8d\xab\x62\x7c\xee\x06"
+ "\x3d\xe7\xaa\x0a\x71\x5c\x35\xf3\x87\xa4\xbf\x4e\x6b\x43\xd7\x5f"
+ "\x67\x7b\xed\x7f\xda\x15\xe0\xfe\xa7\xe7\xfc\xee\x7f\xea\x0a\x79"
+ "\x0e\xfd\xb9\x5e\xfb\x9f\x9e\x13\xf7\x3f\xed\x0c\x61\x5d\xdc\xb9"
+ "\xa3\xfe\xf5\xd7\xb9\x5e\xfb\x9f\x9e\x13\xc7\x4f\xbb\xc4\xfd\x4f"
+ "\xcf\x89\xfb\x9f\x76\xc6\x4b\xd3\xbd\xfa\xab\x53\xb2\x2e\xae\x6b"
+ "\xc0\xfd\x4f\x69\x49\x79\x51\x19\xc7\xd7\xc0\x55\x0b\x75\xbc\x1e"
+ "\x30\x60\x80\xff\xcd\xc0\xc7\xb1\xf0\x7f\xb3\x3f\x19\xb3\x2b\xca"
+ "\x8b\xf8\x02\xa8\x33\x47\x64\x56\xfb\x77\x06\xc3\x0d\x2e\xe4\x4d"
+ "\x25\xe3\x55\x79\x51\x94\x6b\x54\x22\x4f\x35\x04\xf8\x52\x24\x9c"
+ "\xaf\x06\xf9\x23\x01\x33\xaa\x4c\x12\x79\x4a\xd6\x75\xc0\x93\x0f"
+ "\xea\x1b\x79\x4c\xd6\xb5\x11\xcb\x80\xba\x9a\xa1\x2d\x6a\xbf\x75"
+ "\x85\xb2\x92\xde\x9c\x40\xb6\xb8\xe8\xd7\x86\xd5\xa7\x49\x9b\xcc"
+ "\x71\x6d\x54\xc7\xa8\x44\x9a\x9b\x4c\xd0\xc7\xaa\xb9\xc1\x1e\x8e"
+ "\x65\xe2\xd9\x8b\x6d\xb2\xae\x4e\x7c\xe7\x86\x3a\xe6\xac\x22\x9c"
+ "\xfe\xf4\xa8\x08\xd0\x05\x23\x72\x3b\x69\xfb\x1a\x17\xd4\x39\xcb"
+ "\x45\x3e\x9e\xd0\x1a\xfe\xee\x4e\x48\x73\x93\x68\x3c\xdf\x0e\xcb"
+ "\x00\x1f\x13\xea\xe3\xf8\x71\x35\xe4\xef\xaf\x0e\xdb\xde\x21\x93"
+ "\x46\x4c\xa4\xb6\xe0\x70\xe3\xf0\xbb\xfe\x2d\x2a\x7f\x02\x31\xdc"
+ "\x0e\xb4\x53\x11\xae\xbf\xf7\x41\x7e\xc7\x2f\xbf\x40\x27\x46\xe0"
+ "\x39\x98\xb9\x3b\x08\x57\xca\x8f\x8a\xa8\xcb\x16\xce\xaa\xb4\x77"
+ "\x15\x9e\x9f\x62\x93\xa5\x16\x21\xcd\xf1\xcc\x34\x3c\xfb\x17\x70"
+ "\x43\x20\x7d\xce\x27\x59\x84\xf4\xe6\x45\x7a\xea\xaa\x45\xaa\x8c"
+ "\x15\xab\x96\xae\x59\x9f\xa1\xba\x25\x75\x0c\x99\xb3\x66\x8d\x6a"
+ "\xd5\xa2\xd5\x1b\x55\xd2\x37\x0f\xaa\x52\x57\xac\x5b\xb4\x38\x6d"
+ "\xe9\x1d\xab\x96\x68\xc7\x40\x9d\x88\xa4\x1e\xe3\xb0\x2e\x7c\xe1"
+ "\xf9\x94\xea\x97\x09\x29\x1f\x4b\xc2\xb1\x5e\xf0\x3d\xa3\xe7\x7c"
+ "\x3c\x3c\x1f\x8e\x83\x3c\xb9\xa0\x03\x4b\x73\x46\x41\x5e\x47\xf3"
+ "\x6e\xa8\x57\x35\xd4\x1b\xea\x88\x75\xb6\x7b\xea\xec\xc1\x44\x2e"
+ "\x62\x22\xe7\x34\x60\xb0\xfb\xda\x28\xc7\xa8\x5f\x51\x9a\x8c\xed"
+ "\xeb\x04\x39\x91\x41\xda\x22\xb4\x4b\xa0\x03\x8a\xba\x0a\xbb\x27"
+ "\x79\x30\x86\xbf\xa5\xfa\xf2\xd9\x5d\x28\x27\x54\xf3\x08\x93\x29"
+ "\x67\xf8\x5c\xb5\x8c\xb0\xf3\xf9\xba\x93\xbd\xe7\xf3\x39\xc3\x91"
+ "\xb6\x50\x8f\x0e\x48\xd7\xda\x64\xf7\xc9\x31\x1d\xcf\x89\xc4\x73"
+ "\xf6\xb0\xce\xd0\x2e\xb0\x8b\xd4\x40\x0b\x44\xec\x17\x7d\x19\xc7"
+ "\x97\xc8\xec\xd6\xf0\x73\x24\xc9\x45\x9d\xf4\xc5\x2f\xe3\x9a\x3a"
+ "\x3b\x49\x54\xbe\x76\x09\x1d\x79\x7e\x6d\x94\x6b\xc5\x52\x3c\x1f"
+ "\x90\xd7\xc9\xec\xf4\x45\xa7\x7a\xee\x44\xa2\x84\xb2\x2d\x92\x73"
+ "\x02\xc3\x83\xe3\x7f\xb7\xc0\x7f\xe4\x23\x9e\xff\xc7\xf8\xe8\x8c"
+ "\xf9\x24\xa3\x2f\x1f\x7b\xf0\xf7\x26\x4f\x4c\x80\x05\x2a\xaf\x6b"
+ "\x4e\x72\x33\x3a\xa2\xec\x9e\xc9\xd5\x90\xbb\x04\xda\x39\x5b\x78"
+ "\x7d\x5d\x0d\x5f\x52\xd7\x4e\x4b\xea\x5a\x80\x66\x1a\x7d\x26\x51"
+ "\x2d\x74\x2b\x89\xee\x1c\x89\xb3\xeb\xea\x9a\x15\xb2\x3c\x19\xf8"
+ "\x16\x1c\xd8\x8d\x38\xd0\x19\x71\xa2\xbc\x6b\x90\x8e\x0d\x1d\x84"
+ "\xcc\x5a\x47\xc8\xd7\x53\x48\x58\x35\xfc\x2e\xb8\xf6\x38\xf7\x08"
+ "\x7a\xa2\xd0\x99\xbc\x1b\x7e\x8b\xe7\x3c\x06\xf9\x7b\x9b\x5f\xb9"
+ "\xeb\x69\xb7\x71\x76\xff\xed\x76\x59\x78\xbd\x11\xf8\x67\xd4\xd0"
+ "\x12\xe3\x9c\xbe\xed\x36\xce\x66\xed\x1e\x71\x7a\xf8\xdb\xed\xaa"
+ "\x60\xed\x76\xcd\x0e\xad\xdd\x2e\xbf\xfd\x7f\x92\x76\xfb\xe1\xb7"
+ "\xdb\x08\xed\x06\x7e\x1b\x81\xdf\xc6\x7e\xf8\x6d\x14\xf9\x7d\xcd"
+ "\xb1\xe1\x6f\xb7\xbb\x8c\xb5\xdb\x9d\x18\x5a\xbb\xdd\x7e\xf5\x9f"
+ "\xb7\xdd\x26\x3f\xfc\xe6\x0f\xf0\x7a\x13\xf0\xdb\x04\xfc\x36\xf5"
+ "\xc3\x6f\x93\xc8\xef\x6b\x3f\x1b\xfe\x76\xf3\xac\xff\xbf\x90\x4f"
+ "\x08\xad\xdd\xbc\x39\x80\x76\xfb\xe1\x37\xdd\x0f\xed\x06\x7e\x9b"
+ "\x80\xdf\xa6\x7e\xf8\x6d\x12\xf9\x7d\x5f\xf1\xf0\xb7\x9b\xe6\xb1"
+ "\x76\xd3\xf8\xd0\xda\x4d\x0d\x83\xb7\xbb\xbe\x7f\x7e\x73\xe4\x2d"
+ "\x5e\x5f\x0f\xfc\xae\x07\x7e\xd7\xf7\xc3\xef\x7a\x91\xdf\xf3\xa6"
+ "\x0e\x7b\xbb\x39\x22\x9c\x67\x4d\x8b\x49\x5c\x48\xed\xe6\x48\xed"
+ "\xe0\xed\xae\x6b\x05\x9d\xdd\x87\xe7\xd6\xac\x78\x72\xe7\x39\x6c"
+ "\x3f\x17\x43\x15\x75\xad\xd7\xe4\xe7\xc9\x5c\xf2\xba\x23\xd7\x1c"
+ "\x21\x1c\xc4\x7e\x9a\x28\x1b\x19\x0d\x6d\xd5\x50\xbd\x59\x8b\x77"
+ "\x1e\xca\x71\x81\xee\x77\xcb\xeb\x5a\xba\x4b\xca\x35\x2f\x2d\x23"
+ "\xaa\x5c\x3b\x51\x36\xe5\xd8\x48\x8e\x96\xda\x9b\xc8\x97\x44\x61"
+ "\x23\x1c\xf6\x63\x7d\xda\x51\x4b\x56\xa7\x53\x0a\x65\x8f\xc0\x78"
+ "\x51\x7f\x9c\xc4\x81\x4f\x9c\x47\xc1\x7e\x94\xf1\x44\x05\xe5\xc7"
+ "\x21\x2d\xa1\xec\xf4\xa8\x39\x44\xf6\xd7\xc5\x0e\x82\xf4\x44\xda"
+ "\x42\x6c\x19\x27\xd0\xb5\x93\x90\x5f\xcf\x63\x74\xdd\xb5\x2c\x58"
+ "\xba\xca\x9a\x99\x5f\x59\x67\xb7\xda\xba\xb1\x5f\x5a\x89\xeb\x9a"
+ "\x21\xbd\xa4\x49\x7b\x9a\xd0\x62\x59\x1c\xd5\xd5\xd9\x78\xb0\x59"
+ "\xc1\x95\xcb\xf9\x9d\xff\x26\xd1\xa7\xc9\xa0\x33\xfb\x60\xcd\x4b"
+ "\xef\xb0\x12\xaa\x30\x26\x33\x7a\x1b\xe7\x5f\x73\x64\xc4\xe9\xfe"
+ "\xe9\x6d\x4c\x76\x81\xcd\x71\xcb\x8d\x73\x02\xa7\x77\xd8\x7a\x5f"
+ "\x7a\x1b\xe3\x2e\x0e\xbd\xc3\x12\x18\xbd\x8d\x5a\x5f\x7a\x73\x2e"
+ "\x46\x6f\x6e\x0f\xd5\x19\x53\x78\xb0\x95\x41\x96\xeb\x77\xfd\xa3"
+ "\x84\xde\x80\xef\xbe\x36\xcc\x4b\xef\x70\x17\xd0\x5b\xc4\xb7\x11"
+ "\xf0\x7d\xcd\x31\x3f\xf4\x06\x7c\x1b\x01\xdf\xc6\x20\xf0\x1d\xfe"
+ "\x55\x2f\x7a\x5f\x24\x7c\x87\x8b\xe7\x3f\x19\x7b\xe1\x3b\x3c\x8d"
+ "\xd1\x3b\x5c\x09\xf4\x06\x7c\x1b\x83\xc4\xf7\x88\x88\x00\xec\x07"
+ "\xe0\xbb\xaf\xed\xf4\xd2\x7b\x64\x1a\x55\x98\x44\x7c\x9b\x00\xdf"
+ "\xd7\x7e\xd6\x3f\xbd\x4d\x80\x6f\x13\xe0\xdb\x14\x04\xbe\x47\xce"
+ "\xf5\xa5\xb7\xe9\x22\xe1\x7b\xa4\x8a\xd1\xdb\xd4\x0b\xdf\x23\x8e"
+ "\x30\x7a\x8f\xc8\xa3\x3a\x13\xe0\xdb\x14\x24\xbe\x47\x66\x05\x40"
+ "\x6f\xc0\x77\x5f\x9b\xed\xa5\xf7\xa8\x23\x40\x6f\x11\xdf\x26\xc0"
+ "\xf7\x7d\xc5\x7e\xe8\x0d\xf8\x36\x01\xbe\x4d\x41\xe0\x7b\x94\xa9"
+ "\x17\xbd\x2f\x12\xbe\x47\x95\x89\xf4\xee\x85\xef\x51\x33\x18\xbd"
+ "\x47\xda\x81\xde\x80\x6f\x53\x90\xf8\x1e\xd5\x1e\x80\x9f\x00\xf8"
+ "\xee\xeb\x2b\x78\xe9\x3d\x7a\x06\x55\xd4\x8b\xf8\xae\x07\x7c\xcf"
+ "\x9b\xda\x3f\xbd\xeb\x01\xdf\xf5\x80\xef\xfa\x20\xf0\x3d\xfa\x5e"
+ "\x5f\x7a\xd7\x5f\x24\x7c\xe3\x11\xf3\x48\xef\xfa\x5e\xf8\x8e\x38"
+ "\xc0\xe8\x1d\x91\x42\x75\xf5\x80\xef\xfa\x20\xf1\x3d\xda\xef\xfa"
+ "\xdf\x81\xfc\x93\x75\x55\x24\xc2\x97\xe6\x63\x0c\x17\xce\x47\x19"
+ "\xf3\xe6\xa5\xf1\x51\xc6\x64\xf4\xef\xa3\x8c\x89\x63\x34\x1f\xdd"
+ "\x12\x9a\x8f\x32\xc6\x12\x8a\x8f\xd2\x97\xe6\xf2\xc9\x17\xce\x4f"
+ "\x91\x8f\xbf\x34\x7e\xca\x35\xed\xfd\xfb\x29\xd7\xec\x65\x34\xbf"
+ "\x26\x31\x34\x3f\x45\x9e\x10\x8a\x9f\xd2\x97\xe6\x8a\x7d\x17\xce"
+ "\x57\x51\xfc\xe1\xd2\xf8\x2a\x8a\xf9\xfd\xfb\x2a\x8a\x68\x46\x73"
+ "\xf9\x81\xd0\x7c\x15\xc5\xfe\x50\x7c\x95\xbe\x34\x8f\x8a\xb9\x70"
+ "\xfe\x4a\xd4\x88\x4b\xe3\xaf\x44\x36\xf7\xef\xaf\x44\x8a\xf1\x4f"
+ "\x64\x5c\x68\xfe\x4a\x54\x00\xf1\x4f\x5f\x7f\xa5\x2f\xcd\x95\x65"
+ "\x17\xce\x67\x51\x6e\xbc\x34\x3e\x8b\xf2\xf1\xfe\x7d\x16\x25\x61"
+ "\x34\x8f\xda\x1b\x9a\xcf\xa2\xac\x0c\xc5\x67\xe9\x4b\xf3\xb1\xe1"
+ "\x17\xce\x6f\xb9\xf6\xe4\xa5\xf1\x5b\xae\xad\xed\xdf\x6f\xb9\x36"
+ "\x83\xd1\xfc\xda\xe8\xd0\xfc\x96\xb1\xca\x50\xfc\x16\xa4\x35\xd2"
+ "\x1c\x7d\x15\x46\xf3\x71\x2d\x34\xb2\xae\xc6\x09\xfe\x88\x02\xe8"
+ "\xae\xe8\x20\x5c\x15\xd2\xbc\x95\xd1\xdc\x1d\x69\xd6\x02\x7d\x34"
+ "\x48\x33\xa1\x1d\xdf\x46\x47\xba\x4b\xea\x8e\x50\x8e\x40\x5b\x22"
+ "\x08\xf0\xec\x4b\x57\x01\x89\x54\xe5\xe4\xc3\xff\xe3\x84\xfd\x33"
+ "\x55\x39\x85\x47\xa1\x8d\x61\x38\x46\xe1\xd2\x95\x2b\xdd\x8a\x86"
+ "\x32\x78\x77\x13\x1d\x5f\xaa\x74\x82\x2f\x41\x57\x46\x8f\xb3\x76"
+ "\xd4\x10\xab\xeb\x10\x69\x6a\xfd\x0b\xe1\x23\xcd\xe9\x77\xb9\x88"
+ "\x9a\x7e\xab\x1e\x67\xc9\xb0\x11\xf7\x92\x68\xb9\x35\xcb\x0c\xb8"
+ "\x78\x9f\x24\xb5\xd3\x73\xf4\x9f\x6a\xb9\x53\x61\x69\x76\x2b\xcc"
+ "\xb3\xdd\xba\xc6\x0a\x97\xc2\x62\x78\x3b\x13\x2c\x9a\x83\xa8\xd3"
+ "\xda\x28\xd5\x2f\x26\xe1\xfa\x63\x24\xa2\x74\x31\x91\x97\x1e\x23"
+ "\x4a\x4b\x5b\x2b\x69\x3c\x61\x26\x8d\xa7\x0f\x93\xc6\x73\x70\x75"
+ "\xc3\xc5\xc3\x95\x77\x98\x58\x3a\x08\x99\x79\x92\x90\xdc\x36\x6a"
+ "\xff\xf9\x11\x32\xce\xe2\x6a\x25\x38\x8f\xf7\x14\xf7\xa3\x0f\xe4"
+ "\x29\x64\x1c\xfd\x67\x34\xa1\x4b\xa2\x39\x78\x17\x8e\xe9\x56\x97"
+ "\x9d\x58\xda\x1c\xf8\x7e\x3b\xbc\x0f\xcf\x6d\x83\xf2\x79\x33\xee"
+ "\x17\x67\xb7\xe4\x1d\x84\xf6\x4d\x43\x3a\xb7\x7b\x7c\x32\x7d\x37"
+ "\x89\x2b\x05\x36\x23\x66\x92\x28\xc3\xcc\xee\xee\x60\x31\xf3\x23"
+ "\xb6\xff\xd9\xca\xe8\xb1\x40\xef\x1b\xf8\x95\xc9\xca\x59\x87\xbf"
+ "\xa0\x38\x4f\x0b\xc7\x67\x9a\x3a\x0f\x11\xeb\x56\x9e\x24\x6d\x24"
+ "\x64\x86\x9b\x10\xa4\x09\x8e\x25\xcf\xd2\x92\x28\x9c\x3f\xc6\x7f"
+ "\xab\x1e\x6b\x6d\xb3\x93\x2d\x2e\xa8\xeb\x29\x47\x4f\x5d\x9b\xb6"
+ "\x36\x11\x78\x77\x43\x93\xc6\x46\xe4\x5a\xa2\x44\x3a\x83\x2f\xda"
+ "\x3a\xab\x9d\x8c\x5e\xdd\x49\x29\xd2\x18\x69\x8b\x74\xc6\xf2\x3c"
+ "\xb4\xb7\xa6\xda\x49\xae\x83\x28\xad\x39\x70\xcf\xa2\x76\x2b\xf9"
+ "\x9e\x40\x1d\xcd\x54\x31\x8d\x00\x3e\x32\x10\x13\x80\xc7\x56\xc0"
+ "\xc1\x58\x5a\x3c\xb6\xa4\x1a\xda\x8b\x63\xf8\xc1\xb5\x79\x5c\x20"
+ "\xe3\x1f\x7d\x7c\x42\x2f\x9e\x8d\xc9\x0c\xcf\x3f\xd9\x4b\x23\x8d"
+ "\x71\x4e\xf0\xf5\x18\x9e\x47\x9c\x1e\x1c\xcf\xc6\xf9\x5e\x3c\xff"
+ "\xf8\x3d\x2f\x9e\x7f\xf2\x47\xff\x78\xbe\xee\x7b\x86\x67\xa3\xf6"
+ "\xf2\xc4\xf3\x75\xdb\x06\xc6\xf3\x75\xa9\xfe\xf1\x6c\xd4\x78\xfc"
+ "\xdd\xe1\xc1\xf3\x75\x07\x2e\x1e\x9e\x8d\xc9\xa1\xe1\xf9\xba\x0a"
+ "\x5f\x3c\xff\x78\x1f\xc3\xf3\x8f\xe7\x87\x86\xe7\x9f\xf8\x3d\xff"
+ "\x60\x20\x7f\x5b\x82\x67\x51\x3f\xdf\x90\x01\x78\x06\xfd\x6c\x14"
+ "\xf5\xf3\x35\xc7\x02\xc0\xb3\x44\x3f\x47\xe7\x7b\xf1\x7c\xc3\x52"
+ "\xff\x78\xbe\xfe\x13\x11\xcf\x97\xa9\x7e\xbe\x7e\xee\xc0\x78\xbe"
+ "\x7e\xf2\x00\x78\x6e\xf7\xc4\x12\xc3\x83\xe7\xeb\x4b\x2e\x22\x9e"
+ "\x43\xd4\xcf\xd7\x6b\x7c\xf1\x1c\x9d\xc5\xf0\x1c\x3d\x29\x34\x3c"
+ "\xdf\xe0\x77\xfe\xf3\x40\xb1\x8c\x17\xcf\x26\x51\x3f\x8f\x7f\x9c"
+ "\x46\x9a\x40\x3f\x9b\x44\xfd\x7c\xed\x67\x83\xe3\xd9\x24\xd1\xcf"
+ "\x3f\x7d\xca\x8b\xe7\xf1\xf7\xfa\xc7\x73\xcc\x1f\x18\x9e\x4d\x97"
+ "\xa9\x7e\x8e\xb9\x65\x60\x3c\xc7\x84\xfb\xc7\xb3\x49\xe3\x89\xd3"
+ "\x86\x07\xcf\x31\xf3\x2f\x1e\x9e\x4d\x21\xea\xe7\x98\x78\x5f\x3c"
+ "\xff\x34\x91\xe1\xf9\x06\x57\x68\x78\x1e\xef\xf7\xfc\x9f\x81\xe2"
+ "\x44\x09\x9e\x45\xfd\xac\x1a\x07\x78\x06\xfd\x6c\x12\xf5\xf3\x7d"
+ "\xc5\x01\xe0\x59\xa2\x9f\x27\xdc\xe4\xc5\xb3\x6a\x84\x7f\x3c\xdf"
+ "\xb8\x48\xc4\xf3\x65\xaa\x9f\x27\x9c\x1d\x18\xcf\x13\x5a\x06\xc0"
+ "\x73\xbb\x27\x06\x1e\x1e\x3c\xdf\x38\xe9\x22\xe2\x39\x44\xfd\x7c"
+ "\x63\x84\x2f\x9e\x27\x44\x33\x3c\x8f\xb7\x84\x86\x67\x95\x2a\x94"
+ "\x18\xdc\x8b\xe7\x7a\x51\x3f\xdf\xdc\x46\x23\xeb\x41\x3f\xd7\x8b"
+ "\xfa\x79\xde\xd4\xc1\xf1\x5c\x2f\xd1\xcf\xaa\xef\xbd\x78\xbe\xf9"
+ "\x73\xff\x78\xbe\xf9\x6e\x86\xe7\xfa\xcb\x54\x3f\xdf\x64\x1a\x18"
+ "\xcf\x37\xed\xf5\x8f\xe7\x7a\x8d\xa7\x7f\x61\x78\xf0\x7c\x93\xeb"
+ "\xe2\xe1\xb9\x3e\x44\xfd\x7c\x53\xab\x2f\x9e\x55\xed\x0c\xcf\xaa"
+ "\xca\xd0\xf0\x7c\xb3\xdf\xf3\xef\x82\xeb\xdf\xb8\xa5\x0d\xfb\x37"
+ "\xba\xb1\x7f\xc3\x3b\xf7\x4f\x13\xd5\xcc\xf0\xec\x04\x3c\xef\x92"
+ "\xe2\xf9\x1f\xbd\xfb\x37\x7e\xf6\x09\xdf\x83\xe7\x5b\xfa\xe0\x99"
+ "\x07\x3c\x3b\x05\x3c\xc7\x9e\xf4\xf4\x6f\x58\x3b\xf6\x00\x4e\x4e"
+ "\x10\xeb\x6c\xc0\xb2\x5e\xc4\xf2\x3f\x00\xcb\x40\x43\x1e\x68\x6c"
+ "\x39\xd2\x4a\x92\xec\x8c\x96\xdd\x40\x63\x5e\x8a\xe3\xee\x76\x0e"
+ "\xf1\x8b\xb8\xf5\x60\xb8\x71\x35\x60\x37\xfd\x6f\xa4\x31\x13\xae"
+ "\x4d\x70\xe5\xc0\x45\xfe\x46\x2c\xed\x80\xdd\x15\x52\xec\x36\x8b"
+ "\xd8\x8d\xcd\x1f\x18\xbb\xb1\x29\x17\xaf\x2f\x23\x96\xf5\x7f\xfd"
+ "\x23\x59\x99\xf4\xd4\x17\xd4\x9a\xd5\x2a\xe2\xf3\x04\x49\x72\x91"
+ "\x28\x3a\x4f\x3d\x56\x9e\x4c\x94\x9b\xdd\x84\xd3\x2d\x26\x4a\xdd"
+ "\xdf\xa1\xdd\x1e\xf9\x3d\x46\xe4\x87\x1c\x7f\x21\x96\xd3\xad\xc4"
+ "\x72\xee\x20\xb1\xf0\x70\x9d\x80\x0b\xea\x9a\xb4\x54\xda\x6e\xbb"
+ "\xd8\xee\x5b\x36\x42\x59\xb1\xfe\xdb\x7d\x4b\xb2\xd0\xee\x54\x68"
+ "\x77\xb7\xb7\xdd\x56\x90\x03\xe0\xcf\x0d\xbc\xd8\x1f\x92\x64\x27"
+ "\xa3\xd7\xb8\x28\xed\x16\xf1\x8f\xfc\x39\xd4\xe2\x20\x49\x5a\xe0"
+ "\xd9\x12\xc0\x7f\xdb\x3e\x92\x9b\x0d\xf8\xef\x76\x20\xee\xec\xd6"
+ "\xbc\xf3\x80\xff\xd8\xed\x14\xe8\xe7\x44\xfc\xff\x03\xf1\xff\xb3"
+ "\x5a\x5e\xc0\xff\xcf\xd2\x42\xc3\xff\x2d\x01\xe0\x3f\x90\xfe\x10"
+ "\x75\x1b\xf6\x87\x74\x63\x7f\x88\x77\x0e\xe8\x20\xf8\x97\xf6\x87"
+ "\xdc\x2a\xc1\xbf\x7a\x00\xfc\xdf\x76\xd2\xd3\x1f\x72\xe9\xf1\x7f"
+ "\xdb\x20\xf8\xbf\x6d\x00\xfc\x0f\x77\xdf\xc7\x6d\x17\x11\xff\xea"
+ "\x41\xf0\xaf\x0e\x00\xff\xc6\xe4\xd0\xf0\x7f\x5b\x2f\xfc\xdf\x2a"
+ "\xe2\xff\xd6\x10\xf1\xaf\x0e\x04\xff\x01\xf4\x9f\xfc\x1c\xf1\x0f"
+ "\xfa\xdf\xd8\x22\x99\x0b\x3c\x18\xfe\x25\xfa\x7f\xa2\x04\xff\x3f"
+ "\x1f\x00\xff\xb7\x7b\xf0\x7f\x19\xe8\xff\xdb\x07\xc1\xff\xed\x03"
+ "\xe1\x7f\x98\xfb\x4a\x6e\xbf\x88\xf8\xff\xf9\x20\xf8\xff\x79\x20"
+ "\xf8\x0f\x51\xff\xdf\xde\x0b\xff\x13\x45\xfc\x4f\x0c\x11\xff\x3f"
+ "\x0f\x00\xff\x81\xf4\xb7\xdc\xd9\x86\xfd\x2d\xdd\xd8\xdf\xe2\x9d"
+ "\x13\x3e\x08\xfe\xa5\xfd\x2d\x93\x24\xf8\xbf\x73\x00\xfc\xdf\x71"
+ "\xd2\xd3\xdf\x72\xe9\xf1\x7f\xc7\x20\xf8\xbf\x63\x00\xfc\x0f\x77"
+ "\xdf\xca\x1d\x17\x11\xff\x77\x0e\x82\xff\x3b\x03\xc0\xbf\x29\x44"
+ "\xfd\x7f\x47\x2f\xfc\x4f\x12\xf1\x3f\x29\x44\xfc\xdf\x19\x08\xfe"
+ "\x03\xe8\x9f\xb9\x1b\xf1\x0f\xfa\xdf\xd4\x22\x59\x1b\x30\x18\xfe"
+ "\x25\xfa\xff\x2e\x09\xfe\xef\x1e\x00\xff\x71\x1e\xfc\x5f\x06\xfa"
+ "\x3f\x6e\x10\xfc\xc7\x0d\x84\xff\x61\xee\x8b\x89\xbb\x88\xf8\xbf"
+ "\x7b\x10\xfc\xdf\x1d\x08\xfe\x43\xd4\xff\x71\xbd\xf0\x7f\x97\x88"
+ "\xff\xbb\x42\xc4\xff\xdd\x01\xe0\x3f\x90\xfe\x9c\xc9\x42\x7f\x4e"
+ "\x37\xf6\xe7\x78\xd7\x88\x0c\x82\x7f\x69\x7f\xce\x2f\x24\xf8\x9f"
+ "\x3c\x00\xfe\xef\x39\xe9\xe9\xcf\xb9\xf4\xf8\xbf\x67\x10\xfc\xdf"
+ "\x33\x00\xfe\x87\xbb\xef\xe6\x9e\x8b\x88\xff\xc9\x83\xe0\x7f\x72"
+ "\x00\xf8\xaf\x0f\x51\xff\xdf\xd3\x0b\xff\xbf\x10\xf1\xff\x8b\x10"
+ "\xf1\x3f\x79\x98\xfa\x7f\xee\x2b\xc1\xfe\x1f\x5e\x5e\xd7\xe2\xac"
+ "\x2c\x55\xf2\x25\x96\xe6\x28\x99\x8a\xb8\xe4\x0d\x65\xd6\x8c\x4e"
+ "\x32\xeb\x2c\xf0\x44\x7b\x96\x2c\x38\xab\xc4\xf3\x02\x0d\x14\xe2"
+ "\x7f\x9f\x35\xa2\x70\xb9\x4a\xa6\x91\xd2\xd5\x24\xdc\x1d\x69\x4e"
+ "\xc7\x34\xeb\x71\x07\xc1\x36\x6f\x41\x1a\x9c\xf0\xd2\x00\xfb\xe0"
+ "\xe8\x77\x6a\x65\x75\x01\xe4\xe9\xb6\x91\x36\xc0\x8b\xa5\xcd\x06"
+ "\xb4\xdf\x24\x60\x0b\x79\x01\xf5\x99\xb4\xfb\x14\x09\x77\xfd\x33"
+ "\xfa\x06\xe0\xf1\x38\xc5\x06\x22\x8b\x69\xa3\x3c\xf2\x12\x79\x84"
+ "\x7c\x55\x6d\xc2\xf9\x4a\xf7\x6d\x6b\x02\x7c\xbb\xfe\xa9\xbe\xa1"
+ "\x1a\xf2\x0d\x7f\xbf\xcc\x7d\xc2\xf8\x07\xdc\x63\x2d\x47\x80\x96"
+ "\xc5\xf7\x86\xc8\xa7\xfb\x02\x59\xff\x12\x40\x3f\x45\xfc\x64\xec"
+ "\xa7\xe0\xe5\xc6\x39\x81\xf1\xc9\x98\xec\xb3\xa6\x75\xd8\xf9\x74"
+ "\x7f\x4b\x60\x7c\x8a\xbf\xc3\x97\x4f\xc3\xdd\x7f\x70\x3f\xdb\x0f"
+ "\x86\xbb\xdf\xc2\xf8\x74\xff\xb8\xd0\xf8\x14\x1f\xd2\xfc\xdf\xbe"
+ "\xf1\xf4\x03\x47\x30\x9e\x06\x3e\x05\x28\x4f\xc6\x56\x9f\x35\xb8"
+ "\xc3\xce\xa7\x07\xb2\x03\xe3\xd3\x03\x9f\xf7\xe2\xd3\x30\xc7\xb9"
+ "\x0f\xec\x61\x7c\x7a\x20\x83\xf1\x29\xfe\x40\x68\x7c\x7a\x20\x80"
+ "\xf5\x1f\x81\xc4\x7d\x0f\x6d\xc5\xb8\x8f\x87\xb8\x2f\x30\x3e\x99"
+ "\x92\x7d\xd6\x0c\x0f\x3b\x9f\x1e\x8a\x0d\x8c\x4f\x0f\x6d\xf1\xe5"
+ "\xd3\x70\xc7\x63\x0f\x25\x32\x3e\x3d\x14\xc3\xf8\xf4\x60\x6a\x68"
+ "\x7c\x7a\xa8\x6c\x78\xe2\x93\x87\x27\x61\x7c\x02\x7c\x0a\x50\x9e"
+ "\x4c\xad\x3e\x6b\x9c\x87\x9d\x4f\x53\x2c\x81\xf1\xe9\xe1\x5b\x7a"
+ "\xf1\x69\x98\xe3\x86\x29\x76\xc6\xa7\x29\x46\xc6\xa7\x29\xf2\xd0"
+ "\xf8\xf4\xb0\xdf\xf3\x3f\x83\xf3\xa3\x1f\x69\x41\x3f\x9a\x07\x3f"
+ "\x3a\x30\x3e\xd5\x27\xfb\xac\xc9\x1e\x76\x3e\x3d\x92\x11\x18\x9f"
+ "\x1e\x69\xf4\xe5\xd3\x70\xfb\xb7\x8f\x54\x30\x3e\x3d\x92\xc6\xf8"
+ "\xf4\xf0\xfe\xd0\xf8\xf4\x48\x00\xf3\x3f\xfb\x5f\x87\xd5\xd7\xe7"
+ "\x4b\xc8\xbb\xbc\x7c\xbe\x04\x55\x60\xbc\x4a\xd8\x78\x61\x7d\xbe"
+ "\x84\xc7\x19\xaf\x12\xa2\x19\xaf\x1e\x4d\x09\x8d\x57\x09\x25\xa1"
+ "\xae\xdf\xea\xeb\xf7\x4d\x9d\x74\x79\xf9\x7d\x8f\x05\xa8\xff\xa6"
+ "\xde\x72\x61\xfd\xbe\xc7\x44\xfd\xf7\x98\xa8\xff\x1e\x0b\x51\xff"
+ "\x4d\x0d\x40\xff\xf5\xbf\xee\xab\xaf\xef\x37\xad\xf5\xf2\xf2\xfd"
+ "\xa6\x65\x05\xc6\xab\x69\x7f\xbb\xb0\xbe\xdf\xb4\x4a\xc6\xab\x69"
+ "\x5a\xc6\xab\xa9\xb5\xa1\xf1\x6a\x9a\xdf\xf3\x5f\x06\x5b\x2f\xd6"
+ "\xd7\xff\x9b\x7e\x99\xf9\x7f\xd3\x03\xf4\xff\xa6\x5f\x60\xff\x6f"
+ "\xba\xe8\xff\x4d\x17\xfd\xbf\xc7\x43\xf4\xff\xa6\x87\xe4\xff\xf5"
+ "\xe2\x95\x28\x57\xbf\x8a\xbb\xbc\x7c\xc0\x5f\x36\x07\xc6\xab\x5f"
+ "\x4d\xbc\xb0\x3e\xe0\x2f\x3b\x19\xaf\x7e\x69\x66\xbc\xfa\xa5\x32"
+ "\x34\x5e\xfd\xca\xef\xf9\x87\x83\xad\x4f\xeb\xeb\x07\x26\x1e\xb9"
+ "\xbc\xfc\xc0\xc4\x00\xe3\xdf\xc4\xcf\x2f\xac\x1f\x98\x28\xc6\xbf"
+ "\x89\x62\xfc\xfb\xab\x10\xe3\xdf\xc4\x00\xe2\xdf\x40\xfa\xfd\x7e"
+ "\x3d\x05\x7d\x40\x77\x49\x5d\x4b\x14\xd0\x3f\x2a\x8b\x70\xdd\x31"
+ "\xc0\x2f\x39\xf0\x2b\x5f\x45\x9c\x25\xc0\x2f\xbb\x8b\xcc\x5a\xfb"
+ "\x05\x6d\xea\x70\x93\x6e\xe0\xd5\x79\xf0\x03\xad\xf6\x76\x5c\xa3"
+ "\xf7\xd0\x31\xee\xc9\xcf\xe7\xad\x55\x12\xe4\x17\xd2\xdf\x2d\x9f"
+ "\x46\x28\xf0\x4b\xe0\x9f\xbc\xb1\xc2\x55\x62\x9e\x3d\xf3\xe4\x17"
+ "\x74\x8d\x8d\xd2\x46\x8d\x03\xf7\x8e\x54\x36\x6a\x5a\x49\x52\x1b"
+ "\x19\xad\x7a\x1a\xf9\xf2\xe4\x36\x4c\xb7\xda\x5b\x09\xee\xfb\x29"
+ "\xf4\x81\x7f\xa1\x1e\xe7\xfa\x1f\xb5\x1c\xf7\x6f\xc2\x75\x85\x9e"
+ "\x3d\x9a\xac\x27\x2a\x04\xfe\xf7\xee\x53\x15\xf8\xff\x3f\x6a\xe5"
+ "\x2e\x5c\x9f\x38\xec\xbe\xe0\x93\x42\xff\x1f\xff\x45\xf4\x0d\x9e"
+ "\x3a\xae\x49\xa3\x14\xea\x38\xb6\xa9\xd3\x4e\xb0\x9e\x4d\x9d\x06"
+ "\x92\x9b\x41\x94\x4d\xdd\xed\x24\xa7\x93\xda\x9b\xf2\xbe\x21\x49"
+ "\x67\x71\x5c\x00\xf1\xf4\x64\x23\xe3\xf7\x13\x0e\xfe\x0b\xf5\x0d"
+ "\x50\x9e\xb1\xa9\x99\x90\xa8\x7c\xa0\xb5\x8b\x70\xc2\x7a\x4d\x8e"
+ "\x44\x00\xbd\x34\xd6\xbc\x63\x48\xbb\x66\xab\xeb\xef\x48\x4f\x0d"
+ "\xbc\x9f\xd2\x33\xde\x10\x69\xfe\x0c\xd3\x90\xb6\x38\xcf\xd4\xaa"
+ "\xb5\x0b\x79\x3c\xef\x19\xef\xf2\x88\x35\xab\x9b\x34\xb9\x08\x81"
+ "\xef\xed\xfd\x34\xb9\x15\xf0\xf5\x44\x88\x7a\xfb\xd7\x89\xc3\xd3"
+ "\x5f\x39\xb3\x12\xfd\x56\x77\x89\x71\x0e\xab\xe3\x88\xd3\x83\xe3"
+ "\xcb\x98\xec\xc5\xd7\xcc\x7b\x87\x86\xaf\x19\x5f\x0d\x2f\xbe\x86"
+ "\xdb\x7f\x9d\x51\x33\x34\x7c\xcd\xbc\x83\xe1\x6b\x46\x32\xc3\xd7"
+ "\xcc\x58\x2f\xbe\x46\x9c\xbe\x70\xf8\x9a\x11\xce\xf0\xf5\x6b\x63"
+ "\x68\xf8\x9a\xb9\x6f\x78\xfa\x59\x93\x5c\xe8\x6b\x03\xbe\x44\xfd"
+ "\x75\xcd\xb1\x00\xf0\x25\xd1\x5f\x49\x7f\x1c\x1a\xbe\x92\xa6\x0f"
+ "\x33\xbe\x86\xd9\xe7\x4e\x52\x0e\x0d\x5f\x49\x3a\x86\xaf\x59\xb5"
+ "\x0c\x5f\x49\x5b\xbd\xf8\xba\xe6\xd8\x85\xc3\xd7\xac\x54\x86\xaf"
+ "\x59\xb1\xa1\xe1\x6b\x76\x48\xfb\x5f\xf5\x8d\x0f\x9e\x9e\x8f\xf1"
+ "\x81\xbb\xc4\x24\xea\xaf\x6b\x3f\x1b\x1c\x5f\x26\x89\xfe\x7a\xea"
+ "\xec\xd0\xf0\xf5\xd4\xeb\xc3\x8b\xaf\xe1\x8e\x13\x9e\xd2\x0e\x0d"
+ "\x5f\x4f\x9d\x64\xf8\x7a\x2a\x9a\xe1\xeb\xa9\x36\x2f\xbe\xae\xfd"
+ "\xec\xc2\xe1\x6b\xb6\x91\xe1\x6b\xf6\xd6\xd0\xf0\xf5\xb4\xff\xfd"
+ "\x9f\x83\xea\xd7\x9e\x73\x00\x63\x1a\xc0\x97\xa8\xbf\xee\x2b\x0e"
+ "\x00\x5f\x12\xfd\x35\x67\xee\xd0\xf0\x35\x67\xc4\x30\xe3\x6b\x98"
+ "\x63\x9b\xdf\x34\x0f\x0d\x5f\x73\x66\x32\x7c\xfd\x26\x8b\xe1\x6b"
+ "\xce\xe3\x5e\x7c\xdd\x57\x7c\xe1\xf0\xf5\x9b\x58\x86\xaf\xa7\xdb"
+ "\x42\xc3\xd7\x9c\x00\xf6\x7f\x0d\xa4\x3f\xfe\x77\x31\x18\x87\xb9"
+ "\x4b\xea\x45\xfd\x35\x6f\xea\xe0\xf8\xaa\x97\xe8\xaf\xdf\x7e\x30"
+ "\x34\x7c\xfd\x76\xe9\xf0\xe2\x6b\xb8\xe3\xb1\xdf\xc6\x0d\x0d\x5f"
+ "\xbf\x7d\x9b\xe1\x6b\x6e\x2b\xc3\xd7\x6f\xf7\x7a\xf1\x35\x6f\xea"
+ "\x85\xc3\xd7\xdc\xad\x0c\x5f\x73\x1f\x0f\x0d\x5f\xbf\x0b\x60\xff"
+ "\x9f\x40\xc7\x11\x9e\xc9\x1b\x5a\x0c\xf9\xcc\xf5\x43\xc3\x58\xf2"
+ "\xc1\xcb\x3b\x86\x4c\xde\x3e\x34\x8c\x3d\x73\x2d\xc3\x58\xf2\x14"
+ "\x86\xb1\x67\x22\x2e\x4e\x0c\xf9\xbb\x76\x86\xb1\xdf\xed\x0b\x0d"
+ "\x63\xcf\x0c\xe3\xf8\xc7\xbc\xb6\xa1\xc5\x91\xf3\xb6\x0c\x0d\x63"
+ "\xf3\xee\xb8\xbc\xe3\xc8\x67\x1d\x43\xc3\xd8\xbc\xf5\x0c\x63\xcf"
+ "\xee\x61\x18\x9b\x97\x76\x71\xe2\xc8\x67\x67\x30\x8c\x3d\x1b\xe2"
+ "\xb8\xcd\xbc\x90\xd6\xbf\xf4\x3f\x6e\xb3\x20\x71\x68\xb1\xe4\x73"
+ "\x5f\x0e\x0d\x63\xcf\xfd\xe1\xf2\x8e\x25\x9f\x9b\x3f\x34\x8c\x3d"
+ "\x77\x98\x61\xec\xb9\x70\x86\xb1\xe7\x9a\x2f\x4e\x2c\x39\xbf\x86"
+ "\x61\x6c\xbe\x36\x34\x8c\x2d\x98\x33\x7c\xe3\x4d\x29\x6f\x0d\x2d"
+ "\x9e\x4c\x99\x3e\x34\x8c\x2d\x3c\x7b\x79\xc7\x93\x0b\x0d\x43\xc3"
+ "\x58\xca\xc3\x0c\x63\x0b\x35\x0c\x63\x29\x93\x2f\x4e\x3c\xb9\x70"
+ "\x1c\xc3\xd8\x82\x96\xd0\x30\x96\x12\xc0\xfe\xff\x81\x8e\x93\x2d"
+ "\x51\x0e\x2d\xa6\x5c\xfc\xe6\xd0\x30\xb6\xf8\x99\xcb\x3b\xa6\x5c"
+ "\x1c\x3b\x34\x8c\x2d\x7e\x95\x61\x6c\x91\x85\x61\x6c\x71\xc5\xc5"
+ "\x89\x29\x17\x65\x31\x8c\x2d\x8a\x0f\x0d\x63\x4b\x62\x86\x6f\x7c"
+ "\x6f\x69\xc6\xd0\xe2\xca\xa5\x8a\xa1\x61\x2c\xf5\xa3\xcb\x3b\xae"
+ "\x4c\x2d\x1a\x1a\xc6\x96\x8e\x60\x18\x4b\x8d\x63\x18\x4b\x75\x5d"
+ "\x9c\xb8\x72\xc9\x11\x86\xb1\x25\x21\xee\x47\xb1\x34\xaf\x37\xc6"
+ "\x56\xac\xce\x5c\x94\xb6\x22\x55\xb5\x62\x75\x46\xfa\x5a\xd5\xba"
+ "\x15\x9b\x96\x3e\x7c\xcb\xfa\x49\xaa\xf4\x2c\x55\xfa\x8a\xd5\xcb"
+ "\xc5\x84\xd4\x31\xe4\xe9\xa5\x69\x8b\xb2\x30\x05\x72\x2f\x5f\xbd"
+ "\x6a\xe9\xea\x0c\x55\xfa\xd2\xb5\xeb\x57\xa4\x2f\xc5\xff\xd7\xa9"
+ "\x96\xad\x49\x87\x84\x25\x4b\x57\x64\x2e\x55\x2d\x5e\xbf\x6c\xd9"
+ "\xd2\xf4\x75\x63\xc8\xcc\xf5\x69\x19\x2b\xb4\x69\x4b\x55\x8f\xcf"
+ "\x7c\xec\x8e\x39\xd3\x7f\x33\xe7\xd1\x47\xf1\x70\x32\xc9\xd9\x64"
+ "\x31\xb4\xa4\xb1\x0c\x30\x17\x7e\x9c\x5b\xa3\x68\x8a\x26\xc2\x79"
+ "\xb6\xa5\xa7\x89\xf2\xc5\x74\x12\x5e\x74\x9a\x44\xe8\x4e\x13\xb9"
+ "\xea\x79\x92\x40\x75\x23\x31\x7d\x1c\xd5\x3d\x92\x40\xf5\xe5\xd1"
+ "\x54\x37\x35\xcf\xae\xb8\x2d\x0e\xf3\x52\xdd\xad\x29\xf8\x0e\x68"
+ "\x1b\x0e\xe9\xed\xc7\xb8\xd5\x16\xbb\x42\xad\xcc\xfd\x86\x70\x74"
+ "\xcc\xb2\x9a\x77\x78\x3b\xf7\x09\xee\x02\x0e\x6d\x27\xdc\x72\x33"
+ "\x5c\xfb\x09\xa7\x49\x85\x2b\x03\xae\x3c\xb8\xf6\xc1\x55\x03\x97"
+ "\x11\xae\x66\xb8\x8e\xc0\xd5\x06\x57\x07\x5c\x9d\x70\x41\x24\xb7"
+ "\x02\x22\xe7\x15\x15\x70\x41\xde\x15\x06\x56\xce\x0a\x0b\x5c\x0e"
+ "\xc2\x3d\x9f\x00\x17\x94\xb5\x52\x0b\x57\x25\xe1\xd2\xa6\xc0\xfd"
+ "\x00\x5c\xad\x70\xd9\xe0\x39\x1c\x2e\x35\xe4\x6d\x66\xef\xd2\x20"
+ "\x6d\x55\x0c\x81\x7a\x0e\x7e\xad\x82\xfc\xab\x1e\x87\x4b\x03\x17"
+ "\x7c\x73\xf5\x24\xb8\xb2\x07\xf8\x8d\x71\x90\x32\xdb\xa2\xf2\x6f"
+ "\xb4\x09\x67\xe0\x71\x9a\x5b\xdc\x05\x24\xcc\xad\x53\x2b\xb5\xb7"
+ "\x13\xd9\x09\x6e\xf9\xf7\xd6\xad\xa8\x67\x1e\x49\x10\xce\x74\x84"
+ "\x67\xa4\x59\x57\xf1\x72\xbb\x8d\xbc\x53\x81\x67\x9a\x05\x87\xb7"
+ "\xe5\x76\xf6\x7b\x4d\x9c\x4d\xf6\xcb\x64\xe1\x0c\xb8\x62\x67\x2c"
+ "\xcd\x4d\xde\x25\x9c\xfd\x86\x34\x44\x39\x28\xea\xce\xa6\x11\x9d"
+ "\x2e\x94\x79\xc3\x26\xac\xd7\xf2\x83\xb4\x80\x44\xc2\xef\xcd\x14"
+ "\xea\x66\x57\x94\x47\x43\x3d\xc3\xf1\xd9\xad\xbb\x2d\xee\xbc\xc2"
+ "\xa2\xc5\xff\x1d\x55\xfa\x3d\xb4\xc4\x52\x81\x71\xb6\x21\xe7\x65"
+ "\x72\x0c\x7e\x77\x5e\xd1\x14\xaf\x7a\x32\x8a\x1e\xc3\xdf\x16\xe0"
+ "\x1e\xb5\x9a\xf9\x4c\x56\x97\x9b\xcf\x2b\xca\x55\xee\x8a\xa6\x14"
+ "\x48\x0f\x77\xeb\xca\xa3\x59\xf9\xb7\x81\x9e\x34\x27\x40\xbe\x5a"
+ "\x21\xbd\x52\x5f\xeb\xf9\x1f\xee\xfb\xdd\x7a\x4b\x2b\xde\x15\xf9"
+ "\xa4\x53\x78\x2e\x48\x20\xec\xae\x24\xaa\x27\x09\xe9\xe0\x56\x3c"
+ "\x77\x97\x99\xc8\x0c\x4f\x62\xbd\x57\xa8\x73\xcd\x94\x57\xe5\x84"
+ "\xc1\xf7\x57\x4c\xec\xf9\xee\xf5\x4d\xc9\x78\x46\x2a\x2d\x5e\x6a"
+ "\xd8\xfd\x32\x21\xf8\x5b\xac\xdb\x8e\xb1\x24\xbc\xea\x65\x12\x81"
+ "\x6d\xec\x2a\x5e\x31\xc7\x73\x0e\x1d\xfe\x86\x83\xfc\x4f\x3c\x91"
+ "\x4b\x25\x65\xdf\xe4\x16\xda\xb3\xdc\xc8\x68\xba\x62\xab\x4d\x36"
+ "\x6d\x0e\xe6\x57\xdd\x2c\xd0\xf2\xa0\xf8\xde\x8c\xfc\xc4\xf2\xa9"
+ "\xae\xb1\x0c\x9f\xf1\x9c\xbb\x28\x40\x8e\x2a\x27\xb6\x96\xd1\xc8"
+ "\x52\x81\xe5\x60\x7e\xaa\x6f\x80\xff\x35\x1a\xaa\x13\x68\xac\x56"
+ "\xad\x26\x09\x50\xf7\xef\xdd\x2f\x3a\xdb\xa0\x8c\x04\xfa\xa2\xb3"
+ "\x1d\xf2\xd7\x08\xf4\xd6\x99\xe3\x6c\xdc\x8a\x36\x78\xd7\xde\x73"
+ "\xf6\x25\xa3\xb3\x0c\xf2\x39\xba\x8a\x9f\x8f\xb6\xc9\xe6\xa5\x0a"
+ "\x7c\xce\xa4\x2d\x78\xc6\xe6\x99\x4c\xea\x4a\x72\x7d\xc1\x83\xae"
+ "\x22\xf0\x3e\xde\x46\xe6\xed\xf1\xb4\x91\xf1\xbe\xa7\x9c\x83\xf8"
+ "\x6c\x1f\x2d\x94\x93\xd2\x5f\x39\x36\xee\x79\xf5\x42\x97\x4a\xd6"
+ "\x7d\x8e\x36\x97\xfe\x16\xe9\x48\x68\x77\x26\xb5\x6c\x49\xa4\x0e"
+ "\xfd\x67\x84\x34\x82\xd8\x82\xcc\xc7\x44\xca\xa8\x3d\x69\x23\x89"
+ "\x8a\xd4\x46\xd1\x83\xe6\x23\x64\x73\x22\x6d\xc7\x33\x7c\x9b\x3a"
+ "\xdb\x48\xf6\x61\x22\xcf\x6d\x24\xe3\xb2\x13\xa9\xdd\x92\x72\x84"
+ "\xb0\xf4\x46\x92\xfb\x25\x09\xdf\x6c\xa4\x8e\x59\xa0\xff\x3f\x3d"
+ "\x82\xe9\x6d\x04\xcf\xa8\xcc\x6d\xa7\xae\x9c\xe7\x88\x1c\xff\x6f"
+ "\x34\x62\xfa\x57\x24\xf7\x24\x09\x4f\xca\xb2\x47\x55\xc3\x37\xf1"
+ "\xf7\xbb\xa1\x2e\xfc\x39\x7a\xa0\xf4\x1c\x21\x9b\x9f\x21\xd1\xd9"
+ "\x8b\x88\x32\xc9\x4d\xa8\xd5\xf5\x01\x49\x72\x53\xb0\x2f\x26\xb2"
+ "\x65\x05\x89\x48\x72\xe1\x3a\xb6\xcf\x09\x9e\xd3\xbd\x1b\xf2\x42"
+ "\xdb\x0c\xd8\xb6\xcd\x47\x49\x34\x9e\x4f\xce\x7e\xf3\x91\xf8\x9b"
+ "\xa3\x04\x69\x76\x5e\x31\x55\xeb\xd0\x4d\xb5\x43\xdb\x27\x21\x0d"
+ "\xe0\x3b\xcd\x3c\xfe\x0e\x7e\x5f\x9a\x2e\xd0\x40\xb6\xd0\x45\xe4"
+ "\x6e\x9d\x39\x7a\x61\x96\x41\x28\xd7\xc6\xad\xd4\xec\x4e\x17\xea"
+ "\xe4\x93\x37\xc9\x45\xcf\xd8\x15\x66\xc0\xfd\xca\xb2\xa4\xac\x47"
+ "\x29\xfe\x16\x78\xd9\xd9\x55\xbc\xb2\xd9\x43\x6f\x0f\x5f\x20\x8f"
+ "\x11\x78\xd1\x19\xa6\x25\xe1\xf0\xde\x6e\x93\x2d\x48\xf0\x62\x4d"
+ "\x33\x1f\x78\x3e\xd2\x93\x97\xe5\x49\x1b\x67\x93\xcd\x2f\x92\xe0"
+ "\x11\xf1\xd5\x93\x07\xde\x4f\xb6\xc9\x9e\x2b\x63\xdf\x58\xd9\x89"
+ "\x79\x44\xdd\xef\xc9\x1b\x46\x8b\x3a\x9b\xdd\x0a\xcb\x1e\xca\x51"
+ "\x07\xe0\x31\x9e\x9e\x89\x96\xcf\x72\x51\x07\xaf\x6b\x40\x3d\x2f"
+ "\xc7\x73\x5d\x59\xfe\x34\x13\xbc\x4f\x50\x65\x0a\xff\xb7\xe2\x77"
+ "\x68\x49\x79\x42\xcf\xbb\x02\x32\x82\x56\xe9\xcb\xc0\x76\x28\x93"
+ "\xcc\xd4\x01\xb2\x5e\xa6\x4f\x47\xdb\x61\x29\x43\xb9\xe6\x15\xe6"
+ "\x44\xc7\x8e\xa6\x04\xd4\x4f\x28\x23\xb4\xa4\x21\x8e\xfd\x56\xf3"
+ "\x1c\xca\x0d\xd3\x35\x69\x95\x6e\x28\x03\xea\xd4\x02\xef\x46\x1c"
+ "\xe3\x56\x29\x71\x3d\x29\x2d\x3a\x2b\x17\xce\xbd\xe4\x56\xfd\x98"
+ "\xe1\xb7\xb3\xd9\xe7\x99\x43\xda\x81\x3c\x81\xce\x42\xfd\x00\xe9"
+ "\xf7\x7a\x65\x58\xa0\x1b\xc7\x74\x51\x43\x02\xd3\x23\x61\x3c\xe4"
+ "\x93\x1d\x13\xe5\xf1\xfc\x68\x67\x47\x57\xf1\x2a\xc0\xff\xc3\x0e"
+ "\x1f\x39\x29\xfe\x5e\x83\x67\x6c\x42\x5d\xc2\xa0\x4c\x1d\xdc\x47"
+ "\xc1\xfd\x0f\x75\x66\xe4\xb7\x50\xee\x35\xf8\xff\x8e\xeb\xa8\xfd"
+ "\xf1\xe9\x04\xcf\xd3\x04\x79\x5b\xb5\xcf\x46\x8a\xf6\x62\x39\x2f"
+ "\xe2\x39\xa3\x90\x86\x79\x20\xdd\x60\x23\x2f\x6e\x67\xe5\x6b\x34"
+ "\x9d\x50\xd7\x5e\xe5\x7f\xc5\xca\x67\xe5\x62\x79\x9e\xb2\xab\x5e"
+ "\xa1\x1d\xac\xec\xd5\xe1\x9e\xb2\x75\x90\xe6\x29\xff\xf1\x55\x9e"
+ "\x6f\xac\x8e\x85\x6f\xc4\x48\xdb\x50\xf1\x0a\xed\xc4\x32\xe0\x5d"
+ "\x82\x8d\x54\x99\xf1\x5d\x11\xa4\xe1\x6f\x25\xb8\x0a\xab\x4b\x84"
+ "\x32\x8c\x42\x19\x1a\x1b\xa9\x9c\xdd\x4b\xc7\x29\x3c\x3a\x4e\x2c"
+ "\xab\xc4\x53\x96\xb7\x1c\x11\x4f\x25\x64\x9f\xc8\x57\x2c\x57\x8e"
+ "\xe5\x42\xfe\x03\x36\xf2\xd2\x5e\x69\xdb\x41\xa7\x19\xa9\xde\xb2"
+ "\x0f\xf5\x98\x88\xc7\xef\x51\x27\x7b\xea\x8d\xe7\x8c\x82\xee\x6e"
+ "\x47\x79\x11\xf4\xb7\xce\xac\xea\x2a\x5e\x13\xde\x4b\x5f\x87\x63"
+ "\x3e\x77\xf1\xb2\xf1\x55\x78\xce\xea\x75\xb4\x1d\xf2\xa8\x7d\xce"
+ "\x16\xe5\xc8\x23\x90\x36\xc5\x73\xc6\xa9\x1e\xf2\xd8\xb8\x65\x7e"
+ "\xf7\x70\xcc\xb9\x89\x70\xd6\x4a\x1b\xfa\xcf\x88\xab\x29\xd6\x98"
+ "\x4e\x62\xad\xe4\x09\x5f\xad\x37\x24\xe4\x50\x03\xf8\x4c\x1f\xe2"
+ "\xd9\xd4\xc1\xd9\xe4\x35\x5b\x05\x3c\x75\x83\x5f\x99\xfd\x0b\x82"
+ "\x76\xf8\x14\xa7\xfd\xc6\x6a\x3f\x2d\xc8\x16\xfc\x2f\xac\x8f\x2e"
+ "\x07\x3f\x14\x7d\x51\xf0\xff\x35\x65\x1c\xf3\x47\x79\xc8\x5b\x8d"
+ "\xe9\xe8\xab\x82\x9e\xdc\x2d\x79\x47\xab\xf5\x59\x8c\x76\xda\x57"
+ "\x05\x7b\x80\xf5\x75\xfd\xca\x80\x75\xe6\x2b\xf5\x59\xd8\x86\xdc"
+ "\x2c\xca\x5b\x5d\x5d\x06\xd4\xa5\xaa\x4c\xf4\xa3\xb5\x5b\x92\xaa"
+ "\x08\xe5\xab\xf4\x59\xc1\xb5\x41\x2b\xcc\x7f\x82\x58\xe1\x94\x7d"
+ "\xbc\x3e\x0b\xcf\x7a\x2e\xcd\x19\x11\x31\xad\x92\x1a\xce\x4c\xd0"
+ "\x1b\xba\x8a\xb5\x7b\x3c\x67\xe9\x06\x59\xee\x1e\x4f\xdb\xab\xc5"
+ "\xb6\x43\x9a\xe0\x37\xde\x55\x21\x9c\xe5\x8d\xcf\x7e\xcf\xfa\x04"
+ "\x3d\xb2\x0f\x7f\x0b\x6d\x4f\xd8\xed\xa1\x93\xcb\x8e\xe7\x98\x5f"
+ "\x7b\x82\x5b\xbb\x2a\x29\xdb\x40\x84\x7d\xfb\x75\x0d\xfb\x82\xab"
+ "\xd7\x5a\x61\xfe\x7b\x13\xc4\x29\x49\xae\x8f\x29\xd3\x7b\x6b\xff"
+ "\x38\x4b\x2c\x0f\xdf\x79\x78\x55\x2d\xc6\x0f\x21\x7c\xc3\xef\xf9"
+ "\x07\x92\x76\x29\xfb\xb6\x2b\x7d\x7a\xe8\xed\x4a\x57\xf6\x6d\x57"
+ "\xfa\xaa\xe1\x6d\x57\x7a\x46\x00\xed\x52\xf5\x6d\xd7\xba\xf1\x43"
+ "\x68\x57\x7b\xdf\x76\xad\x9b\x3e\xbc\xed\x5a\x37\x23\x80\x76\xc5"
+ "\xf5\xd3\xae\xb3\xa1\xb7\x6b\x9d\xa1\x6f\xbb\x32\xc6\x0f\x6f\xbb"
+ "\x32\x62\x83\xd6\x87\x7a\x8b\x9d\xe9\xc3\x8c\x83\xc1\xeb\xc3\x8c"
+ "\xed\x7d\xf5\xe1\xfa\xf3\x5e\x7d\xb8\xfe\xab\x90\xf4\xa1\xbe\x5c"
+ "\xf4\x29\xd6\xbf\xd7\x47\x1f\x96\x94\xc7\xf5\xaf\x0f\xd7\xeb\x04"
+ "\x7d\xa8\x2b\x0f\x32\xae\x5f\x9f\xdc\xa3\x0f\x15\xe5\x71\x3e\xfa"
+ "\x30\xd2\x02\x36\x72\x7d\x4d\x68\xfa\x70\x7d\x4d\x5f\x7d\xb8\x5e"
+ "\xe9\xab\x0f\xd7\xfb\x9d\xeb\x4c\x4b\xcc\xea\xfe\xf4\x61\x92\xeb"
+ "\x3b\xca\xb0\x61\x56\x07\x57\x9f\xcc\x84\x01\x30\x5f\x33\xf0\xb7"
+ "\x1a\x6a\x82\xfc\xd6\x5b\x7e\xbf\x15\xd1\x89\x7e\x86\x72\xcb\xab"
+ "\x84\x3b\x0e\x91\x78\x53\x4c\x2b\xc4\x01\x0e\x72\xa7\x16\x30\x51"
+ "\x40\xa6\x34\x55\x76\x90\xa6\x98\xe3\x84\x8e\xee\xb4\xd3\x37\x4a"
+ "\xe3\x12\xd2\x11\x9b\x1b\x96\x5a\x33\x1c\x41\x62\x73\x43\x9c\x07"
+ "\x9b\x4d\x2e\xc0\x66\x26\xe2\x31\xeb\x8f\xd6\x8e\x13\x22\x36\xb3"
+ "\xf2\x7b\xf8\x53\xc0\xf0\xd9\x2f\x36\x41\x26\x7c\xb1\xd9\xb0\x87"
+ "\x61\x33\x6b\x66\x5f\x6c\x36\xec\xe9\x1f\x9b\x59\x13\x19\x36\x1b"
+ "\xf6\x04\xd9\x86\x4e\x2f\x36\x1b\xf6\xf8\x60\xf3\xd6\xd2\xb8\xae"
+ "\xe2\xac\x19\xa1\x61\x33\x6b\x86\xa7\xed\x55\x62\xdb\xe1\x5b\x6f"
+ "\xf9\x62\x33\x6b\xab\x5f\x1e\x16\x7d\x19\x07\xfa\x50\x7e\x82\xdb"
+ "\x38\xc7\x0d\x7e\x2b\x5f\x32\x49\x0d\x71\x57\x17\x9e\x19\x4f\xb9"
+ "\xc9\x84\x6e\x50\xcb\xbb\x20\xfe\xed\xea\xd2\x44\xd0\x31\x9d\x9b"
+ "\xa8\x33\x9a\x40\xdd\xa3\x68\x97\x3a\x12\x68\x16\x0b\xf7\xb1\x55"
+ "\x99\x64\x1c\x5c\xd1\x55\x22\x5d\xe1\xff\x38\xba\x21\x7a\x8c\x3e"
+ "\x93\x4c\x8a\xea\x24\x11\x50\x87\xe4\xa8\x7c\x25\x89\x72\x91\x71"
+ "\xf8\x3f\x2d\xf8\x42\x0d\xf1\x59\x38\xf6\x7d\xf2\x0a\xf8\x5e\x56"
+ "\x14\xa5\xeb\xd4\x04\x62\xb5\x08\xe0\x41\xf4\x6e\x8e\xd6\xb8\x37"
+ "\xa8\x39\x1a\x69\xf9\x33\xdd\x9c\x2c\xd4\x89\x8f\x2d\xd5\x02\x86"
+ "\xb4\x34\x57\x83\xdf\x4d\xc0\xb3\x8b\xe9\xad\xa5\x19\xb4\x2b\x7a"
+ "\x8c\xee\x1c\x99\xb4\x3b\x93\xc4\x56\x67\x12\x35\x75\xaa\x39\xa0"
+ "\x41\xf2\x82\xb5\x4a\xe4\x7b\x32\xe5\xe0\x5b\x99\xf0\x2d\xe0\xa5"
+ "\x5b\x07\xdf\x72\xc1\xb7\xbe\x83\x6f\x9d\x82\x6f\x15\xc0\xb7\x0a"
+ "\xd8\xb7\x82\xa3\xf9\x46\xc3\x40\x7d\xd4\x49\x5b\x26\xe0\x5e\xba"
+ "\x5f\x47\x65\x8d\x4a\xc4\xfe\xea\x33\x9b\x35\x41\xe2\x7d\x93\xca"
+ "\x5f\xf9\xa5\xef\x90\x18\x2a\xbf\x55\x3d\x6b\xdb\x17\x14\xe3\xe8"
+ "\x6d\xef\x90\x49\x28\x73\x4d\x8e\x93\x84\x2a\x6e\x55\x9b\xd4\x1d"
+ "\xc1\x7e\xcb\xef\xfc\x87\xe2\x02\x88\x9b\xe5\x10\x87\xca\x2d\xb5"
+ "\xa5\x05\x34\xcb\x19\xa3\x2f\xeb\x8e\xd1\xd7\x2c\x74\x29\x01\x57"
+ "\x34\x4b\x95\x4e\x54\xc7\xb9\xbc\xbf\x1d\x6a\x01\x1b\xf1\x2c\x89"
+ "\x38\xc6\xe5\x47\xe4\x1e\xc6\xbe\xc6\xcd\x31\xbe\x7d\x8d\x9b\x13"
+ "\x08\x97\x5d\x43\xb8\x2d\x06\xc2\xe5\xb4\x11\xc8\xe7\x7b\xe5\x11"
+ "\x56\x56\xb6\x2e\xe9\xcd\x09\x24\xc7\x45\xbf\x86\x38\xb6\x48\x0f"
+ "\xf1\x6f\xd2\x44\x99\xcd\x90\x89\x7d\x70\xd9\xdb\x80\xa6\xdf\x82"
+ "\x5d\x8a\x82\xff\x9f\x02\xde\x11\x6d\x3a\xf9\xd1\x09\x2e\x7b\xb6"
+ "\x0b\xfe\x8f\xea\x1c\x95\xe8\xce\x4d\x26\xae\xe8\xa6\x04\x67\x89"
+ "\xa5\xcc\x0d\xb1\x2c\x2f\x9f\xa4\xc6\x7e\x10\x6b\x87\x9b\x54\x02"
+ "\xee\x16\xba\x23\x50\x1e\x92\x0d\x8b\x0f\x91\xe3\x19\x84\xcb\x3d"
+ "\x4b\x14\xf4\x8c\x5a\xee\xc1\xf5\xcc\x8e\x28\xc7\x96\x0e\xca\x23"
+ "\xbe\xb1\xdf\x01\xde\x45\xe6\x9c\x05\x5b\x6b\x6f\x27\x95\x10\x37"
+ "\xbb\xd7\x69\xc6\xda\xcf\x68\x7e\xb4\x8b\x27\xe3\x22\x3b\x89\xb2"
+ "\xf2\x34\x60\x70\x1d\xe0\xef\x34\xe0\xdc\xce\x70\x8e\x6b\x85\xaa"
+ "\x11\xe3\x85\x8e\x94\xdd\xa7\x19\xc6\x05\xdc\x21\xc6\xd7\x00\xee"
+ "\x56\x7b\x71\xe7\x3a\x03\x18\x2f\xde\x04\x75\xa3\xd8\x2f\xc2\xed"
+ "\x3e\x31\x0a\xdf\xc9\x46\x4c\xe4\x54\x87\x66\x3b\x88\x37\x0e\xcb"
+ "\x1f\xdd\x3d\x5e\x5f\xa3\x7a\x9a\x7e\x77\x8c\xcb\xce\x86\xf4\x08"
+ "\xd5\x6f\x6f\x53\x02\xbd\x47\xb3\x3e\x8a\xfc\x08\x8c\xf3\x6d\x40"
+ "\x0b\xa4\x8b\xea\x69\x72\xdb\x31\x6e\xf3\x53\x48\xc7\x0d\xfb\x48"
+ "\x98\xf6\x11\xda\x06\x34\x4b\xc6\xf2\x6c\xdc\x66\x21\xce\xc2\xf1"
+ "\x8f\x4f\x85\xbe\x4f\xf6\x1b\x37\xd0\xcd\x25\x2f\x4f\x00\x7e\xef"
+ "\x33\x3c\xdf\x2d\xc8\x1c\xd2\xf1\x78\x1a\xe1\x16\x76\x00\xad\xdc"
+ "\x40\xab\x2e\x41\x17\xcc\x16\x74\x41\x51\x67\x46\xb6\x8d\xf2\x49"
+ "\xa9\x61\x34\x67\x2d\x8e\xbd\xb8\xc9\x02\x2d\xa1\x5b\x4e\x02\xbd"
+ "\x3a\x5b\x51\x6f\x44\xf2\x1b\x98\x6e\x40\x7a\x29\x3a\x88\x92\xea"
+ "\xd5\xaa\x77\x72\xcc\x23\xdc\x80\x5f\xd4\x0f\x51\xf9\xb2\xd1\x20"
+ "\x97\x91\x25\x28\xbf\x20\xcf\x51\xf9\x82\xbe\x4a\xae\x04\xb9\x75"
+ "\x6d\x50\xdf\xec\xdc\xa0\x56\xc1\x35\xc1\xa3\x43\xf0\xcc\xaf\x2a"
+ "\xa4\x6d\xf1\x26\x0d\xea\x0f\x6b\x96\x8d\xb8\x80\xb6\x91\x68\x6f"
+ "\x36\xa8\x63\x04\x1a\x2f\x57\x93\xbb\x1c\x44\x06\x75\x52\x42\x7d"
+ "\xc9\xee\x65\x24\xa2\x51\x73\x8c\xb8\x41\x36\x3c\x74\x9f\xb9\x42"
+ "\x45\xa0\x5c\xce\xa4\xfe\x9c\x88\x34\x93\xf9\xc7\x5d\xce\x51\x2f"
+ "\xee\x72\x8e\x22\xed\x18\xee\x72\x8e\x5c\x89\xb8\xfb\x34\x59\xc0"
+ "\x5d\x98\x73\xbc\x80\xa7\x64\xab\xeb\x7d\xa0\x51\x0e\xf6\x6d\x12"
+ "\xc4\xcc\xc1\x3f\x21\x66\x72\xed\x97\x2b\x66\xce\x77\xa9\x55\x70"
+ "\x5d\x10\xcc\x40\xb9\x02\x66\x90\x56\x9f\x26\x77\x13\x0f\x8d\x04"
+ "\x59\x2d\xb9\x55\xad\xca\x25\x8f\x82\xac\x46\x44\xe5\x4f\x20\x8d"
+ "\x02\x9d\xf2\x41\x4e\x29\x7f\x8c\xcb\x9b\x98\xfb\x37\xa2\xec\x2e"
+ "\xa0\xd4\xea\x7a\x9b\xf0\x72\x73\x22\xf6\x33\x83\xff\x5b\xe6\x19"
+ "\xc3\xc1\xfe\xb8\x28\x2d\x8e\xdb\xdc\x16\xe7\xd6\x35\x96\xf1\xba"
+ "\x5b\x53\xa8\x62\x6a\x3b\xf6\xbd\xf1\xba\x91\x84\x57\x3c\x92\xd0"
+ "\x55\x9c\xa7\xb5\x11\xda\x2a\xf4\x07\x97\x58\xd0\x77\x41\xfd\xbb"
+ "\x43\xe8\x2f\x56\x60\xdf\x79\x5e\x99\x67\x7c\x02\x75\x82\xd8\x2f"
+ "\x27\xf6\xdb\xe5\x21\x0f\xc7\x60\xbf\x1d\xd3\x29\x79\xf9\x9e\x7e"
+ "\x3b\xcf\x33\xbe\xb7\x71\x79\x5b\xb1\xcf\xc7\xfb\xbb\x7c\xc2\xf2"
+ "\x79\x7e\xb7\x79\x04\xea\x7a\xef\xef\xd8\x33\xe8\x15\xe2\xe4\x48"
+ "\x44\xbf\x3e\x86\xbc\xb1\x0c\xe4\x27\xfc\x38\x57\x30\x02\xee\x1c"
+ "\xd0\xe5\x55\xb8\x87\xc1\x7d\x2d\x96\x1d\x9c\xbd\xca\x17\xd6\x7f"
+ "\x42\xfb\x8f\x88\xba\x51\x98\x4b\xa1\xbd\x9d\x28\x4e\x88\xff\x77"
+ "\x15\xe7\x57\x78\xc6\x59\xbc\xf9\x7b\xf8\x33\x19\xbf\x0d\x3c\x0a"
+ "\x67\x63\x3f\xec\x59\x52\xde\xbd\xc2\x33\x09\x57\x01\x6f\x66\xe3"
+ "\x18\x2d\xe0\x57\xd6\x45\x35\x8f\x88\xf7\x87\x51\x3e\xb0\xbf\x14"
+ "\xfd\x35\x51\xff\x4e\x61\xdf\x2d\x50\x82\x3d\xb5\x48\xbf\xdb\x1f"
+ "\x3d\x6c\x5c\xc1\x24\x7f\xef\x82\xa3\x45\x81\xdf\xf5\x6f\xd3\xd5"
+ "\x6e\x1a\x64\x59\xdb\xfd\xfa\x88\x31\x7a\x6d\xd2\x3e\xb7\x81\x77"
+ "\x26\x47\x99\xb2\x4f\x06\xe9\x5f\x14\x74\xf8\x2b\xd7\x2d\x37\xa7"
+ "\xb8\x2a\xf5\x5a\xec\x93\x6c\xda\xe7\x22\x6f\x9e\x68\xe7\x92\x26"
+ "\x4e\x20\x8a\x36\xa2\x44\xff\x69\x66\xc7\xc7\x14\x7d\x28\xfd\x09"
+ "\x12\xdb\xfd\x5d\x72\x94\x13\x7c\xc1\x97\x4e\x90\x29\xfc\xf2\xe8"
+ "\x31\x25\xcb\x48\x78\x37\xf8\xab\xdd\xcb\x35\x51\x9f\x1e\x69\x27"
+ "\x20\x27\xda\xa6\x4e\x1b\xa9\x86\xbc\xf4\xeb\xe4\xc8\x27\x52\xa8"
+ "\xc3\x92\xf2\x32\x49\x52\xbb\x0d\x39\x5f\x12\x05\xe8\x22\xa5\x35"
+ "\xeb\x6d\x62\x75\x9d\x24\x23\x36\x72\x2a\xab\xeb\x2b\xa2\x5b\x06"
+ "\x3a\x0c\x74\x56\xee\x33\xa0\xab\x5d\x67\xc9\x2e\xa9\xae\x7e\xfe"
+ "\x35\xaf\xae\xfe\x0e\x74\x75\x31\xe8\xea\xdc\x68\xd2\xa4\x35\x10"
+ "\xd0\x1d\xa3\x66\x69\xa3\x1c\x39\x5a\xd0\xd9\x1b\x41\x67\x67\x7d"
+ "\x45\x04\x7d\xdd\xd1\x4e\x40\xd7\x46\x56\xad\x26\xe3\x9c\x6b\x40"
+ "\x67\x7f\xa7\xf9\xd1\x8e\x1c\xa6\xb3\x77\xae\x06\x9d\xbd\x06\x7c"
+ "\xe2\xd5\xa0\xb3\x3b\xfa\xd1\xd9\xa7\xfc\xf8\xc3\xa2\xfe\xe9\x5e"
+ "\xa3\xe6\x76\x72\x14\xc7\x55\xb8\x1d\x7f\x1f\x15\x24\x4e\xb6\x6a"
+ "\xfd\xf1\x00\xe9\x8d\xf4\xe7\x81\x0f\x8d\xc0\x03\xc1\x6f\x75\x8c"
+ "\x4a\x74\x82\x4d\x73\x47\xd6\xd5\xfc\xe9\x44\x2b\x17\x99\x41\x94"
+ "\xb3\xb4\x1f\xd3\xee\x75\xc9\xe0\xf7\x27\x2b\x5c\x25\xe6\x94\x12"
+ "\xf0\xa9\xdd\xe0\x7b\x3b\xbb\xa2\x23\x80\x06\x4a\xfb\x06\x4d\x14"
+ "\xd2\x90\x1f\x0f\xfc\x1c\xb9\x6c\x3e\xe8\xd0\xc9\x55\xcb\x48\xbc"
+ "\x53\x57\x77\x84\xea\xea\x9a\xdd\xba\xba\x16\xf8\x6d\xe4\xaf\x6d"
+ "\xc8\x97\xbf\x10\x48\xb3\x53\x7d\x7d\x8d\x5b\x61\x4e\xb1\x2b\xea"
+ "\x5a\xe1\xb9\x1d\xdf\xe7\x2c\x22\x8a\x24\xf5\x79\x03\xe3\xd7\xeb"
+ "\x04\xf9\xc4\xf8\x75\x94\xe8\x20\xee\x43\x9b\x2b\xd8\x57\x91\x67"
+ "\x10\x2f\x08\xfe\xbe\x97\x6f\xbd\x6c\xac\xc8\xb7\xc6\x0e\x03\x01"
+ "\x7b\x32\xaa\xc7\xd6\x0a\x7c\x3b\x4a\x3c\x76\x16\xe8\x1d\x59\x05"
+ "\xb6\xd6\x39\x5c\xb6\x56\x8c\x63\xd0\xd6\xa2\x9d\x45\xbe\xed\x0c"
+ "\x9a\x6f\x85\x7e\xe7\xbf\x0f\xcc\x37\x63\x5c\x88\x7c\xdb\xef\xe5"
+ "\x9b\x71\x3e\xd5\x19\x67\xbb\x75\xc6\x39\xbe\x7c\x33\x6a\xbd\x7c"
+ "\x33\x26\xc3\xb3\xc6\xcb\xb7\xb3\x41\xf0\x6d\xc4\xe9\x2b\x97\x6f"
+ "\xbf\xb7\x85\xc8\xb7\x10\xe5\x6d\xb9\x5c\xc2\x37\x90\x37\x23\xc8"
+ "\x9b\xb1\x97\xbc\x19\x25\xf2\x66\x04\x79\x33\x4a\xe4\xed\x64\x10"
+ "\x7c\xbb\xe6\xd8\x95\xcb\xb7\x17\xfd\xee\x7f\x39\x30\xdf\x4c\x21"
+ "\xca\xdb\xf2\x54\x2f\xdf\x4c\x20\x6f\x26\x90\x37\x53\x2f\x79\x33"
+ "\x49\xe4\xcd\x04\xf2\x66\x92\xc8\xdb\xd1\x20\xf8\x76\xed\x67\x57"
+ "\x2e\xdf\x5e\xf2\x3b\x76\x38\x08\xdf\x42\x95\xb7\x03\x12\xbe\x81"
+ "\xbc\x99\x40\xde\x4c\xbd\xe4\xcd\x24\x91\x37\x13\xc8\x9b\x49\x22"
+ "\x6f\x1f\x05\xc1\xb7\xfb\x8a\xaf\x5c\xbe\xe9\xfc\xae\x7f\x1e\x98"
+ "\x6f\xf5\x21\xca\x9b\x66\x9c\x97\x6f\xf5\x20\x6f\xf5\x20\x6f\xf5"
+ "\xbd\xe4\xad\x5e\x22\x6f\xf5\x20\x6f\xf5\x12\x79\xdb\x12\x04\xdf"
+ "\xe6\x4d\xbd\x72\xf9\xa6\xf7\xdb\xff\xe9\xe1\x9b\x87\x67\xc8\x3f"
+ "\x81\x6f\x34\x99\xb8\xc0\x9f\xfc\xf3\x62\xc6\x37\xe4\x97\xc0\xbb"
+ "\x33\xc9\x51\x3a\x91\x67\x2e\x91\x67\x48\x3f\xe4\x1b\xfa\x91\x02"
+ "\xdf\x64\xe1\xd1\xe8\x43\xba\xc0\x97\xf4\xf8\x91\x4f\x6a\xa8\xa3"
+ "\x51\xf3\x5a\x8f\x1f\xe9\xea\xed\x47\xae\x90\xfa\x91\x6f\xfb\xf0"
+ "\xab\xe4\x1c\xf0\x8b\x13\xf9\xf5\x9c\x1f\x3f\x72\xd9\x7f\xf9\xe1"
+ "\x57\xf3\xa0\xfc\x02\xde\x8c\x73\x9e\x61\xfc\xda\x29\xfa\xff\x95"
+ "\xe9\x43\xe4\xd7\x3a\xe0\x17\xfa\xff\x47\x09\xb7\x6b\x41\xb0\xfc"
+ "\x2a\x1b\xd4\xff\xef\x9f\x5f\xa6\xb8\xe0\xf8\xb5\x3c\xd5\xcb\x2f"
+ "\xd3\x6c\x17\xd8\x34\x8f\x3d\xf3\xf2\x8b\xd9\x33\x57\x6f\x7b\xb6"
+ "\x42\x6a\xcf\x02\xe1\x57\x2f\x7b\x76\x45\xf1\xeb\x65\xbf\xfd\xff"
+ "\x6e\x88\xc5\xdd\xa0\xe7\xb0\xbf\x32\xb2\x1d\xe2\x64\x17\xfd\x7a"
+ "\x56\x27\xc4\xc9\xae\x51\x89\xa5\xab\x49\xac\x73\x03\xc4\xc9\xc0"
+ "\xbb\x92\xd5\x64\x4a\xf1\x6a\x12\xce\xaf\x84\x58\xf9\x04\xc4\xca"
+ "\xa0\x9f\xba\xbf\xd5\x44\x59\x52\xec\x84\x87\x58\x19\xfb\xc1\xa0"
+ "\xbe\xb1\xf4\x5b\x88\x95\xdb\x40\xf7\xb5\xed\x64\xb1\xf2\x57\x9e"
+ "\x58\xf9\x03\x9f\x58\xf9\xa5\xe7\xc5\x58\x59\xa4\x7f\xa5\x94\xf6"
+ "\xcf\xfe\xc9\x4f\xac\x6c\x1e\x34\x56\xc6\x18\x79\x17\xc6\xcb\xdf"
+ "\x69\xc6\xee\x10\x75\xdb\xce\x53\x43\x8c\x95\xbf\x83\x58\xb9\x80"
+ "\xd1\x7e\x67\xd0\xb4\x2f\xf7\x3b\xff\x03\x65\x03\xe5\xa5\xc7\x16"
+ "\x01\x9d\x3d\x36\xc8\x09\x36\x08\xfb\x33\xba\x4b\xea\xf6\x03\x5e"
+ "\x05\xf9\x10\x6c\xd2\x86\xe8\x08\x94\x0d\x94\x13\x94\x0d\xc1\x16"
+ "\x81\x1e\x04\x5b\x94\x56\xfd\x3c\x89\xdf\xfd\x3c\x99\xec\x52\xf8"
+ "\xc6\xc8\x4f\xa6\x22\x3f\xbc\xba\x8d\xef\xad\xdb\x96\x4a\x75\xdb"
+ "\x07\x7d\x6d\xd1\x60\xba\xed\x79\x7f\xb2\x62\x1e\x54\x56\x50\x46"
+ "\x04\x7b\x04\xf2\x72\x21\x64\x65\xe7\xff\x0b\x96\x5f\x7f\xf4\x3b"
+ "\xff\x23\x30\x7e\x19\x27\x0f\xce\x2f\x63\x1c\xf0\xcb\xe0\xe5\x97"
+ "\x6f\x6c\xec\xe5\x17\x8b\x8d\xf9\xde\xb1\xf1\x52\x69\x6c\x1c\x08"
+ "\xbf\x7a\xc7\xc6\x57\x12\xbf\x5e\x71\x0d\x91\x5f\x01\xc8\x97\x11"
+ "\xe4\x6b\xc5\x38\x09\xbf\x7c\x62\x62\x09\xbf\x24\xf2\x25\x89\x89"
+ "\x97\x4a\x63\xe2\x40\xf8\xd5\x3b\x26\xbe\x92\xf8\x55\xe1\x77\xfe"
+ "\x47\x60\xfc\x32\x05\x20\x5f\x26\x90\xaf\x15\x1a\x2f\xbf\x7c\x63"
+ "\x61\x2f\xbf\x4c\x12\xf9\x92\xf8\x0e\x4b\xa5\xbe\x43\x20\xfc\xea"
+ "\x1d\x0b\x5f\x49\xfc\xda\x39\x7f\x88\xfc\x0a\x40\xbe\x4c\x28\x5f"
+ "\x07\x24\xfc\xf2\x89\x81\x25\xfc\x92\xc8\x97\x24\x06\x5e\x2a\x8d"
+ "\x81\x03\xe1\x57\xef\x18\xf8\x4a\xe2\x57\xa5\x7c\x68\xfc\xaa\x0f"
+ "\x40\xbe\xea\x41\xbe\x9e\x57\x7a\xf9\xe5\x1b\xfb\x7a\xf9\x55\x2f"
+ "\x91\x2f\x49\xec\xbb\x54\x1a\xfb\x06\xc2\xaf\xde\xb1\xef\x95\xc4"
+ "\xaf\xaa\x03\x03\xc5\x52\xd2\x18\xca\x95\xeb\xe5\x17\xf2\xc6\x09"
+ "\xb1\x93\x53\x5e\xb7\xdf\x7f\xfc\xa4\x49\xf3\x17\xef\xe2\xde\x35"
+ "\x4f\xb6\xe3\x7a\x10\xe6\x13\xd2\x5e\x3e\x61\xa3\xe6\x4f\xc4\x37"
+ "\xe6\xfd\xa8\x4f\x0c\xe5\xf4\xf4\x51\x2c\xf2\x17\xf3\xfe\x25\xe4"
+ "\x18\x0a\xf9\x84\x71\x94\x6b\x1d\xf0\x49\xf4\xe3\x77\x0d\xb1\x8f"
+ "\xc2\x79\x46\xcd\xed\x02\x3f\x3e\x7b\x11\xc4\x50\x8b\x83\xe5\xd3"
+ "\xee\x54\x7f\x7c\xc2\x7e\x22\x8c\x79\x31\x96\xc2\x71\xc7\xa6\xb6"
+ "\x76\x52\x9c\x49\x94\xc2\xd8\x63\xbb\xef\xd8\x63\xe9\x71\x88\xa9"
+ "\xd6\x00\xdf\x9c\xc9\x44\x7f\x9c\x4c\x29\x79\x9e\xc5\x54\x9e\x78"
+ "\xaa\xa9\xd3\x21\x8c\x3d\x5a\x5d\x36\xf2\x84\x8d\x3a\x76\x43\x7e"
+ "\x8c\xa3\x2c\x29\x3b\x09\xca\x4a\xee\x97\x44\x81\x3c\x80\x18\x4c"
+ "\xe0\x87\x34\x86\xaa\x96\x8e\x37\x2e\xf3\x17\x43\x0d\x3e\xde\x58"
+ "\x79\x8a\xc5\x4f\xc2\x78\xe3\x65\x11\x43\xed\xf1\x3b\xfe\x31\xf3"
+ "\x4d\xd6\xdf\x80\xb4\xb7\xaa\x5d\x04\xf0\xf4\x75\x54\x07\xeb\xd7"
+ "\x73\xe9\xeb\x6a\x30\xa6\xc5\x78\xd6\x9a\x65\x26\xc5\x9b\x88\xb2"
+ "\xbb\x2b\x39\x0a\x62\x54\x85\x0b\x74\xdd\x4b\x27\x18\xed\x71\x8d"
+ "\x98\x7d\xa5\x46\x98\x2b\x83\xb1\x2c\xca\x8a\x30\xe6\xb8\x98\x4c"
+ "\xae\x3c\x46\xe2\x05\xf9\x00\xb9\x70\xe9\xcc\x29\xbc\xa2\xae\x05"
+ "\xe5\xe4\x89\x23\xd4\x81\x3c\x40\xf9\xf8\xf4\x08\xf2\xe6\x6d\x92"
+ "\x7b\x94\xf1\x46\xe0\x0b\xe7\x3b\x16\xdc\x57\x36\x3e\xf3\xc3\x9f"
+ "\xda\xc0\xf8\xb3\xc6\x97\x3f\x55\xa1\x8e\x07\x7b\xe6\x47\xae\x51"
+ "\x73\x55\xe2\x78\xf0\xce\x67\x83\xe5\xcf\x6b\x79\xa1\xf1\xc7\x18"
+ "\x17\x1a\x7f\x8c\xb3\x85\xb1\x45\x1f\xfe\x18\x35\x8c\x3f\xc6\x39"
+ "\x18\x2b\x79\xf9\x73\x36\x40\xfe\xf4\x8a\x91\xae\x28\xfe\xec\xf5"
+ "\xdb\xff\x33\x08\x7f\x42\x94\x1f\x63\xb3\x30\x86\xe8\xcb\x1f\x51"
+ "\x7e\x8c\x2d\x18\x1b\x79\xf9\x73\x32\x40\xfe\xf4\x8a\x89\xae\x28"
+ "\xfe\xbc\xee\xb7\xff\x7b\x60\xfe\x98\x42\x94\x1f\xd3\x6c\x61\xac"
+ "\xd0\x87\x3f\x26\x51\x7e\x4c\x73\x30\x16\xf2\xf2\xe7\x68\x80\xfc"
+ "\xe9\xdd\x7f\x7a\x25\xf1\xe7\xff\xa4\x84\xc8\x9f\x10\xe5\xc7\xd4"
+ "\x2c\x8c\x09\xfa\xf2\x47\x94\x1f\x53\x0b\xc6\x3e\x5e\xfe\x7c\x14"
+ "\x20\x7f\x7a\xc5\x3c\x57\x14\x7f\xde\x24\xa1\xf1\xa7\x3e\x44\xf9"
+ "\xa9\x9f\x2d\x8c\xfd\xf9\xf0\xa7\x5e\x94\x9f\xfa\x39\x18\xeb\x78"
+ "\xf9\xb3\x25\x40\xfe\xf4\x8a\x71\xae\x28\xfe\xfc\x69\xcf\x60\xe3"
+ "\x45\x1e\xdf\x59\x3a\x2e\xeb\x04\xff\x0d\xfd\x67\xf4\x9d\x9b\x3a"
+ "\x6b\x89\x6b\x0d\xe3\x4d\xf1\x39\xa2\x2c\x11\x79\x23\x8c\xc9\xae"
+ "\x64\x63\xb2\x82\xdf\x56\xb8\x6c\x3e\xcd\x0f\x8f\x46\xbf\x4c\x18"
+ "\x77\x15\xc6\x26\x4c\xf8\xae\xdd\x29\xf1\xdf\x30\x46\x05\xdf\x9b"
+ "\x60\x9c\x9a\xfb\x55\x10\x7e\xdb\x62\x7f\x7c\x19\x7c\x6c\xa2\x52"
+ "\x32\x8f\xcf\x13\x7b\x0e\x2b\x5f\x82\x1e\x77\x7d\xcb\xef\xf9\x4f"
+ "\x03\xf3\xc5\x14\x17\x1c\x5f\xc0\xde\x14\x2e\x4f\x65\x7c\x39\xda"
+ "\x8b\x2f\x26\x8d\x53\x62\x77\x02\xe7\x4b\x2f\x7b\x73\x45\xf1\xe5"
+ "\xed\x66\xbf\xb1\x26\xe8\x25\xe4\x09\xce\xef\x2e\x5d\x4c\x62\x8b"
+ "\x8f\x91\x29\xce\x6f\xa3\xc7\xcc\x02\x3d\xe7\x5c\x19\x1d\xd1\x04"
+ "\x3a\x2e\xa7\x93\x7e\x1d\xd9\x39\x2a\xf1\x50\x8b\x9d\x34\xa5\xd8"
+ "\x48\xf7\x86\x64\xa2\x3b\x81\x73\xd5\x6b\xc9\x8b\xe9\x18\xcb\xbf"
+ "\x4f\x3e\x3d\x72\x9a\xcc\xda\x47\x9d\xd6\x8e\x5a\x62\xd8\xf4\x3e"
+ "\xa1\x2b\xd5\x63\x76\x43\x9e\x85\x40\xc3\x53\xdc\x3b\x45\xe7\x21"
+ "\x1e\xbd\x2b\x8b\x28\x67\x74\x50\x47\x53\xc7\x21\xb2\x0b\xbe\x65"
+ "\xca\x22\x04\xe9\x8b\x3c\xd1\x3d\x8f\xf1\xe7\x47\x8c\x27\x4f\x31"
+ "\x9e\xec\x94\xc4\x9f\x2a\x78\x7f\x5c\x0b\xfc\xf8\xbe\x17\x3f\x8e"
+ "\xb4\x13\xa0\xef\xa8\x59\x9d\xc0\x8f\x4e\x0f\x3f\x4e\x92\x9c\xb5"
+ "\xc8\x0f\x5b\xcf\x7c\xd7\x6e\x91\x1f\x95\xa8\xbf\xb4\x44\xb9\xc3"
+ "\x13\x7f\x9e\x92\xf0\xc3\xb3\x26\x4b\xca\x0f\x4f\xec\xbf\x01\xf8"
+ "\x91\xe9\x8d\x3f\xcf\x43\xfc\xb9\x03\xe2\xcf\xdc\xbf\x11\x6e\x47"
+ "\x4e\xb0\xfc\x78\xd7\xaf\xfd\xf7\xf0\x02\x6d\x8b\x33\xb2\xae\x06"
+ "\xf9\x60\xcd\xaa\x21\xc8\x13\xb4\x27\xee\x6f\xa3\x23\xb2\x33\x40"
+ "\x76\x6c\xa3\x12\xbb\x29\xc4\xfc\x10\xef\x5b\xe7\xff\x9d\x60\x9f"
+ "\x01\xe3\x81\xd3\x69\xb5\xd7\x12\xa4\xbd\x61\xd3\xdf\x05\x3e\x9c"
+ "\xe2\x6a\x22\x16\x74\x12\xee\x4e\xc0\x21\xc4\xfb\xca\x85\xb8\x2e"
+ "\x17\x74\xdb\xae\x65\x24\x7e\x86\x96\x3a\x30\x36\x45\x19\xc2\xb9"
+ "\x27\xa8\xd7\x9a\xb4\xff\x45\xb0\x5f\xc7\xa9\x30\xa7\x98\x32\x08"
+ "\x41\xfd\x86\x74\x1f\xb1\xde\xcb\x27\x9c\x4f\x22\xf0\x6a\x6e\x00"
+ "\xf3\x5c\xa5\xfc\x9a\x6f\x0b\x68\x7e\x72\xb7\xd8\x5f\x50\xe9\xe9"
+ "\x53\x0b\xb5\xbf\xc0\xd3\xa7\xf6\x1d\x9b\x4f\x92\xfb\x39\xc8\x4f"
+ "\xd0\xfc\x7a\x4f\x19\x18\xbf\x8c\x71\xc1\xf3\xab\xab\x1f\x7e\xbd"
+ "\x57\xdb\x97\x5f\xc6\xd9\x12\x7e\xed\xf7\xf2\xcb\xa8\x61\xfc\x32"
+ "\xce\xf1\xf2\xcb\x98\x3c\x38\xbf\x06\x98\xdf\xfa\x83\xe7\xd7\xfb"
+ "\x7e\xe3\x9f\x5e\xfc\x0a\x41\xbe\xbe\xeb\x87\x5f\xff\xa6\xe9\x87"
+ "\x5f\x12\xf9\x5a\x2e\x97\xf0\x4b\x94\x2f\xa3\x44\xbe\x8c\x01\xc8"
+ "\xd7\x00\xf3\x5a\x7f\xf0\xfc\xda\xef\x77\xfe\x8f\x2f\xbf\x4c\x21"
+ "\xc8\xd7\x17\xfd\xf0\xeb\x83\xe8\xbe\xfc\x32\x49\xe4\x0b\x7c\x8b"
+ "\x1e\x7e\x99\x44\xf9\x32\x49\xe4\xcb\x14\x80\x7c\x0d\x30\x9f\xf5"
+ "\x07\xcf\xaf\x7f\x1f\x70\xfe\x8f\x84\x5f\x21\xc8\xd7\xc7\xfd\xf0"
+ "\xeb\xdf\xcd\xfd\xf0\x4b\x2a\x5f\x07\x24\xfc\x12\xe5\xcb\x24\x91"
+ "\x2f\x53\x00\xf2\x35\xc0\x3c\xd6\x1f\x3c\xbf\xfe\xc3\xaf\xff\xe7"
+ "\xcb\xaf\xfa\x10\xe4\x2b\xb7\x1f\x7e\xd5\x66\xf5\xe5\x57\xbd\x44"
+ "\xbe\x34\xe3\xbc\xfc\xaa\x17\xe5\xab\x5e\x22\x5f\xf5\x01\xc8\xd7"
+ "\x00\xf3\x57\x7f\xf0\xfc\xfa\xd0\x6f\xff\xb7\x94\x5f\xdd\x7a\x8f"
+ "\x7f\xb8\xcf\x97\x5f\xe0\xaf\x47\xb5\xb1\xd8\xca\xc3\x2f\xff\xbe"
+ "\xe1\x5f\x62\x7b\x78\xf5\x95\xd7\x37\x14\xf8\x24\x8e\x53\x20\x7f"
+ "\xd0\x47\x44\x9f\xb0\x5b\xc7\x78\x84\x63\x80\x03\xfa\x85\x81\xac"
+ "\x7f\x0a\x81\x4f\x9e\xb8\x6a\xd8\xf9\x74\x38\x14\x3e\xfd\xa7\xdf"
+ "\xf5\x4f\xbe\x7c\xf2\xd8\xad\x40\xf9\xd4\x9f\xcd\xfa\x4f\x4b\x5f"
+ "\x3e\x99\x66\x7b\xf9\xc4\xec\x14\xda\x2e\xb4\x55\xbe\x7c\x1a\xc0"
+ "\x5e\x05\xb2\xfe\xe2\x07\xcf\xa7\x03\x7e\xf5\x5f\x19\xc7\xd7\xc0"
+ "\x55\x0b\x97\x01\x2e\xb3\x9b\x23\xd3\xab\x38\x5e\xc8\x8f\xfb\xfc"
+ "\x55\x15\xf4\x79\x3f\x92\x8e\x9c\xee\xc2\x3c\x40\xdb\x71\x98\xcf"
+ "\x53\x06\x2d\x26\x48\x3b\x83\x42\x96\x42\xaa\x58\xde\x51\x9e\xb2"
+ "\x14\xf9\x24\xc1\x53\x16\xb4\x29\x0f\x68\x6d\x88\xca\x4f\x18\x09"
+ "\xf9\xcd\xb4\xb8\x20\x11\xf2\x46\x08\x65\xe6\x87\x0b\xfb\x4b\x7b"
+ "\xf2\xba\x0b\x64\xb8\x3e\xdc\x10\x25\x83\xbc\xac\xcc\xd1\x62\x3e"
+ "\x15\x5f\x40\x04\x3b\xec\xe6\x38\xfc\x5e\xef\x7a\x8e\x11\xf3\xc5"
+ "\x4a\xeb\xa8\xc8\x4f\x10\xca\x13\xf3\x5c\x43\x47\xde\xf8\xb8\xd8"
+ "\x16\xb5\x34\x9f\x7b\x2a\xc1\x32\x3d\xf9\xe4\x62\x59\x93\x7c\xf2"
+ "\xbc\x46\x08\x9e\x47\x2b\xd4\x2f\x8b\x23\x62\xfd\x14\x98\xd7\x3d"
+ "\x26\x3f\xc6\x2d\x0b\x8f\xe3\x39\x12\xe7\xf3\x9b\x42\x22\xe4\x17"
+ "\xf3\x46\x0a\x79\x47\xae\x4c\x81\xbc\x93\x45\x9a\x87\x4b\x69\x2e"
+ "\xe6\x8b\xf2\xd0\x51\xfa\xce\x5d\xc0\x61\x59\xf8\x5e\x49\x47\x3e"
+ "\x9f\x0a\x6d\x98\xe2\xc9\xe7\xf9\x9e\x55\x43\x88\x90\x97\x23\x77"
+ "\x8b\x3c\xb9\x16\xda\x91\xe0\xc9\x87\xfb\x29\x78\xf2\xe6\xba\xc9"
+ "\xf5\xbb\xbd\xb4\x19\xeb\x2e\x2e\x38\xe2\xce\x0f\x7f\xbc\x77\x99"
+ "\x51\xf9\x32\x1b\xe6\x6b\x6c\x17\xca\x46\xfe\x95\x41\xfe\x1f\x89"
+ "\x34\x4a\x64\x3c\x51\xf6\xf0\xc4\xcd\xb9\xf0\x9d\xa1\x9a\xd5\x75"
+ "\x9c\x98\x6f\x46\xdf\x7c\xe1\xd2\x7c\x3f\x66\x74\x2c\x8d\x00\xda"
+ "\xcc\xee\x9b\x37\x42\x9a\xf7\x3a\x96\x77\x6b\x2d\xe4\x9d\xd3\x37"
+ "\xaf\x52\x9a\xf7\x27\x2c\x6f\xa1\x16\xf2\x26\xf7\x53\xd7\xb1\x92"
+ "\xbc\xd1\x2c\x6f\x91\x1a\xf2\xce\xef\x9b\x57\x25\xcd\x7b\x3d\xcb"
+ "\x5b\x86\x75\x48\xe9\x9b\x37\x41\x9a\xf7\x06\x96\xf7\x45\x1b\xe4"
+ "\x4d\xed\x9b\x37\x4f\x9a\xf7\xa7\x2c\xef\x4b\x15\x90\x57\xd3\x3b"
+ "\xef\x6e\xc6\xdb\x9b\x45\xde\xc6\xb0\xbc\xba\xd9\x90\x37\xad\x9f"
+ "\xb6\x85\x09\xe5\xb2\xbc\xe3\x59\xde\x17\x26\x43\x5e\x6d\x3f\xbc"
+ "\x90\xe6\x9d\xc0\xf2\x56\x87\x43\xde\x8c\x7e\x78\x21\xcd\x7b\x23"
+ "\xcb\x5b\xde\x06\x79\xb3\xfa\xe1\x85\x37\xef\x98\x3f\x6e\x87\x3c"
+ "\xd9\xd0\xce\xe6\x7e\x68\x2b\x2d\xf3\x26\x56\xe6\xbf\x3c\x0e\xf9"
+ "\xf3\xfa\xa1\xad\x34\xef\xcd\x2c\x6f\x45\x27\xe4\xdd\xda\x0f\x6d"
+ "\xa5\x79\x7f\xc6\xf2\xee\xdc\x0b\x79\x8b\xfa\xe6\x05\x79\x63\xf4"
+ "\xfd\x85\x48\xdf\x58\x96\xbf\x72\x0e\xe4\x2f\xe9\x87\xbe\x58\x9e"
+ "\x47\x66\x6f\x61\x79\x5f\xd6\x40\xde\xb2\x7e\xe8\x2b\xcd\x7b\x2b"
+ "\xcb\xfb\xa7\x76\xc8\xbb\xbd\x1f\xfa\x4a\xf3\xde\xc6\xf2\xbe\x8a"
+ "\x98\xac\xe8\x87\xbe\xd2\xbc\x6a\x96\xf7\x35\x33\xe4\xad\xec\xa7"
+ "\xbe\x37\x4b\xf2\x4e\x64\x79\xf7\x62\x7d\xf7\xf4\xc3\x0f\x69\xde"
+ "\xdb\x59\xde\xb7\xf2\x20\xef\xde\x7e\xf8\x21\xcd\xfb\x73\x96\xf7"
+ "\x0d\x94\xe3\x7d\xfd\xf0\xa3\x27\x2f\xd8\x85\x49\xee\x31\xff\x67"
+ "\xdf\x6e\xcc\x2f\x0b\x17\xe6\xb5\x52\x4e\xd8\xdf\x5f\xc8\x0b\x38"
+ "\x31\x88\xfa\xee\x0e\x56\xe6\x9b\x89\x90\x4f\xd8\xfb\x0d\xf3\x34"
+ "\x3a\x04\x7d\x04\xf6\xc5\x75\xcf\x6e\xaf\xee\xbe\x93\xe5\xdd\xfd"
+ "\x16\xe4\xdd\x2f\xd5\xa1\x94\x0b\x97\xe6\xbb\x8b\xe5\xfb\x10\x69"
+ "\x55\xeb\x9b\x2f\xc2\x9b\x6f\xcc\xbb\xfb\xe0\xfd\x81\xea\x5e\xfa"
+ "\x18\xea\x29\x2d\xeb\x6e\x56\xd6\x7b\xc9\x90\xd7\xe0\x9b\xcf\xf5"
+ "\x0b\x49\xbe\x5f\xb0\x7c\xff\x86\xb4\x31\xfa\xe6\x53\x49\xf3\xdd"
+ "\xc3\xf2\xfd\x27\xea\x2c\xb3\x6f\xbe\x04\x69\xbe\xc9\xee\xe2\xfd"
+ "\xb5\x42\xde\xfc\x70\x4b\x6f\xfa\x01\xad\x7f\x21\xb1\x69\xf7\xba"
+ "\x8b\xff\x5d\x23\xe6\x6d\xf6\xd0\x50\xa0\x33\xc3\x3c\x27\x62\xfe"
+ "\x3e\x77\x71\x6d\xb4\x98\xaf\x45\x6a\x07\x24\xb6\xf6\x7e\x3a\xe6"
+ "\x9d\x68\xd1\x8e\x0a\xfb\x8e\x82\x7e\x3f\xd2\x9f\xbf\xa1\xbd\x9d"
+ "\x5c\x73\x82\x33\x89\xb6\xc7\xb3\xa7\x7e\xbd\x30\x67\x8f\xaf\xd4"
+ "\x97\x25\x75\x52\x97\x34\xad\x94\xa3\xcd\x77\x75\x92\x70\xdc\x3f"
+ "\x89\x2a\x2c\xb5\x36\x48\xb7\x8f\xd7\xd7\x74\x15\x9b\x8e\xd8\x64"
+ "\x4b\x1f\xc7\xbd\x3c\xe0\xff\x76\x1b\x79\x43\xd8\xd7\xa3\xb4\x00"
+ "\xfc\x41\x2e\x41\x86\x7b\x30\xef\x86\xff\xf5\x70\x09\xfb\x1e\x6b"
+ "\x09\x47\x0b\x49\x82\x21\xd3\x45\x8e\x67\x11\x8e\xd7\x97\xcf\x56"
+ "\xa5\xe3\x7e\x22\xf5\xf7\xd2\x0d\x9a\x29\x50\x17\x2d\x7c\x37\xf5"
+ "\x18\x3c\x0b\x75\x81\xf6\x83\x6d\x4c\x33\xa4\xe3\x1e\x43\xf5\x2b"
+ "\xec\x8a\x46\x2d\x7d\x61\xde\x37\xda\x1c\x72\xe3\x09\xae\x5e\x73"
+ "\x06\x74\xc3\x99\x0d\x9a\x47\xb0\x0c\x5e\x51\x9e\x06\x79\xf6\xe1"
+ "\x5e\x24\xb4\xa2\x69\x36\xdb\xa7\xa4\xfe\x23\xa1\xfe\x05\xb4\x99"
+ "\xc6\xe8\xf3\xf8\xee\xad\x79\x78\x7e\x83\x21\xe7\x04\x39\x26\x79"
+ "\x67\xbf\xbe\x49\xd8\xc3\x04\xdb\x05\x6d\xcc\xeb\x2a\xae\xdf\x6f"
+ "\x93\x4d\xd7\xb2\x3d\x4a\xea\xfd\x9e\x0f\x0a\xbe\x75\x14\xd5\x95"
+ "\x17\x41\xfe\x36\x1b\xf7\x91\x92\xd1\xa1\xde\x6e\x93\x4d\x29\x11"
+ "\xff\x77\xd9\x64\x8f\x9a\xd9\xff\x0d\x11\x36\xd9\xbc\xbd\xe2\xff"
+ "\xe3\x3c\x7b\xaf\xf4\xbf\x17\x4c\xf9\x7c\x68\x77\x06\xbf\x2b\x39"
+ "\x02\xfd\x51\xdc\x97\x8d\x2a\xca\xe7\xab\x26\xe0\x79\x1d\x0d\x6f"
+ "\xc1\x37\x33\xd8\x7e\x9a\x0d\x6b\xe1\x1e\x25\xde\xed\xe2\x9d\x62"
+ "\x1e\x81\xb7\x31\xa5\x84\x96\x34\x24\x62\x9b\x73\xdc\x94\x87\x72"
+ "\x2b\x68\x11\xad\xb5\x66\xb5\x13\xb6\x0f\x75\x43\x15\x11\xf6\xc5"
+ "\x01\xba\x02\xed\xe9\x68\x5a\x2b\x7c\x4b\xd7\xa8\x95\xd6\x2b\xee"
+ "\xee\x5f\xdc\x33\xf9\xde\xfb\xee\x8f\x7f\x60\xd1\xe2\x25\xa9\x4b"
+ "\x97\x2d\xd7\xac\x78\x7e\x65\xda\xaa\xd5\x6b\xb4\x6b\xd3\xd7\x65"
+ "\xac\xcf\xdc\x90\xb5\x71\x13\x0e\x56\xf7\xd4\x7f\xd7\xe3\xb2\x4e"
+ "\x8e\xc0\x37\xa6\xc2\x37\xcc\x0a\xa1\x2e\x90\xc6\x78\xd2\xe0\x0a"
+ "\x57\xf5\x4f\x4f\x6b\x34\x21\xb8\x27\x73\x07\x67\x7e\x06\xf7\x87"
+ "\x06\xfe\xcb\xac\x95\xbf\x32\xe0\xf9\x02\x6d\x9c\x79\x46\x93\xfd"
+ "\x57\x06\x3c\xdf\xa2\x2e\xba\x9d\xc4\xde\x8c\x67\x10\x98\xe3\xf1"
+ "\xfd\xee\x5b\x09\x31\xc2\x6f\xfb\x2b\xf3\x66\x25\x89\x2e\xbf\x8e"
+ "\xda\xb7\x5f\x47\x3b\xb0\xfc\xed\xaf\xd0\x76\xfb\x66\x0d\xd1\xc3"
+ "\x33\xe0\x46\x79\x9c\x3b\xa8\xa8\x03\x6f\x17\xfc\xd8\x98\xea\x57"
+ "\x68\xdb\xd6\xeb\x68\xdb\x0b\xaf\xd0\x8e\xdd\xd7\x51\x5b\xec\x76"
+ "\x22\xef\x2a\x36\x1b\x6c\x9c\x39\x5a\xc0\x35\xbc\xe7\xc7\x34\xd4"
+ "\x96\xc2\xbb\xbb\x5c\x24\x6c\x37\x3c\x43\x5a\x67\x9d\x8a\xd5\xfb"
+ "\xdd\xd3\x8e\x11\xd0\xde\xbd\xd4\x99\x26\xd3\xc3\x77\x18\x8f\x0e"
+ "\xde\x6d\x04\x0b\x0c\xdf\xb3\x5b\x1d\xc7\x00\x63\x07\xe3\x70\xdf"
+ "\x75\xf8\x5e\x94\xb5\xa2\x83\x60\x79\xef\xa4\x3b\x46\xac\xbb\x81"
+ "\xba\x20\xaf\x92\xdf\x9c\x26\x83\xef\x75\x40\xd9\x9d\xd2\xf6\xa8"
+ "\x97\xad\xca\x50\xad\x5e\x9f\x96\x36\x71\x0c\x51\x0b\x77\x9f\xb3"
+ "\x31\x32\xa0\x3c\x52\xfe\x0a\x35\x42\x3b\x0d\xd0\x5e\x73\x23\x78"
+ "\xdc\x80\x17\x02\x6d\x2a\x83\x72\xb7\x41\xfa\x01\xf8\xff\x00\xd4"
+ "\xdd\xcc\xce\x53\xf8\xfb\x7b\xb4\xf8\xe0\x14\xa8\x27\xea\x7c\x15"
+ "\xee\x55\x75\x66\xc3\x1c\x19\xb4\x7b\x3b\xe4\x33\xab\x6e\x20\xb7"
+ "\x1c\xe7\x0e\x29\xa0\x1e\x7b\xe1\x7f\xcc\xff\x21\xf2\x11\xf2\x1b"
+ "\x59\xbb\xfe\x2e\x9c\x9d\x03\xb4\x32\x54\x5d\x47\x4b\xba\x8a\x0f"
+ "\xb6\xe3\x5e\x76\xc2\x1e\xdf\xf0\x0c\x74\x31\x43\xde\xb2\x33\xb9"
+ "\x73\x64\x10\x7b\xc9\x76\xf7\x94\x79\xb0\x16\xeb\x84\xf5\xc0\xf8"
+ "\xef\x53\xf0\xbc\x78\x67\x32\xb9\xc3\x41\x64\x9f\xb6\x11\x52\xf9"
+ "\x0a\xdd\x03\x57\x25\x5c\x15\x87\xe0\xdd\x41\xb8\xcc\x90\x6e\x81"
+ "\xfb\x21\xb8\x1f\x6c\x13\xc6\xeb\xa2\xb1\xde\xeb\xb2\x69\xfb\x5d"
+ "\x15\xe4\x67\x58\x3e\x60\xeb\x77\xc7\xb8\xbf\x47\x60\xdd\x71\xdf"
+ "\x48\x3a\xe6\x50\xb6\xef\xfe\x7a\x9f\xda\x09\xbc\xff\xff\xed\x1d"
+ "\x0f\x5c\x55\xd5\xf9\xbb\xd7\x87\x01\x51\xa0\xbd\x8c\xcc\xf4\x6a"
+ "\xb8\xd1\x86\xf8\x30\x33\x35\x4d\x2c\x6b\xb4\xa8\xdc\xe6\x9a\x95"
+ "\x35\x48\x34\x29\x45\x42\x53\x52\x14\x44\xdd\x1c\x33\x79\x2a\x92"
+ "\x2d\xe3\xbd\x12\x9b\x6d\x6c\xd9\xc2\x46\x9b\x35\xcc\xd7\x02\xe5"
+ "\xaf\xfc\x7b\xe8\x43\x9e\x8e\x1a\xa6\x19\x09\x09\x0a\x72\xf7\x7d"
+ "\xe7\x9c\xcb\xbb\xef\x81\x86\x96\xf5\xfb\xed\xc7\xd1\xcb\xbd\xe7"
+ "\x3b\xe7\x7c\xff\xcf\x77\xbe\x7b\xe0\x77\x0f\xc8\x45\x06\x7e\xd7"
+ "\x5f\x45\x91\x78\xcd\x17\xcf\xb9\xd8\xd7\x21\x9e\x0b\xf0\xaa\xfc"
+ "\xfa\xcb\x13\xdf\x85\xae\xe2\xf0\xde\xf7\xed\xd5\x95\xd4\xbb\x7e"
+ "\x25\x6d\x20\x97\x4f\xc7\x6b\x9d\x3b\xbc\x3c\x8a\xc3\xaa\x43\x78"
+ "\xbd\x7a\xbc\xb8\xc7\x80\x5c\x83\x7a\xaa\x41\xfc\x35\x56\x0e\xab"
+ "\xc9\x01\xb9\x16\xdf\xfe\x0f\x81\x07\x7d\xc2\x99\x41\xf6\x6c\x4f"
+ "\xc5\x98\x8d\xb6\x74\xca\xfb\x23\xc9\x46\xe9\xdc\xb7\xa4\x4e\x95"
+ "\xc1\x22\xd0\xb7\xb6\xb9\xfc\xa7\x68\xb2\xbb\xff\x14\x05\x7b\xf8"
+ "\x8f\x99\x62\x11\xce\x97\x0c\x0b\xf7\x97\x3d\xcd\xcb\x63\xb0\x5e"
+ "\x14\x82\x78\xf6\x28\x4f\x32\x1c\x2c\x47\x4a\xff\x0c\xe0\x9a\x79"
+ "\x60\xa0\xf8\x72\x52\x2e\x5a\x41\x3e\x4b\xb4\x05\x5d\xce\x0b\xf2"
+ "\x87\x30\x2b\xf1\xb7\x10\xf1\x62\x3d\x1b\xfb\x59\x4b\xe1\xb4\xc6"
+ "\x1b\x1b\x93\xf6\x0c\xfa\xa3\xe0\x97\x70\xd2\x38\xd5\x25\x57\x04"
+ "\x8d\xe1\xb4\x8b\xc3\x10\x4e\xef\x96\x90\xfc\x25\xf4\xa3\xbf\x6d"
+ "\x26\x9f\xa4\x7b\x69\x87\x09\xe7\x52\x04\x74\xb6\xce\x84\xd1\x81"
+ "\x60\xc2\xf9\xe6\x73\x4c\x2e\x36\x86\x26\x81\x89\xf0\x51\x4c\x47"
+ "\x39\xec\x16\x9a\x8b\x1c\x97\x38\xff\x63\x7f\xc4\xfe\x78\x60\x74"
+ "\xb2\x88\x1f\x6c\xd7\xd1\xcd\xa0\xf7\xc8\xf4\x65\x5c\x56\xa4\x95"
+ "\x8d\xe3\x77\x91\xec\xa4\x4f\x6c\xcf\x43\x3c\xf1\xd4\xc6\xbe\xbd"
+ "\xcd\xe5\xc9\xa6\xef\xb3\x92\x3e\xa8\x3f\x9d\xd7\xc2\xbf\xd7\x57"
+ "\xb8\x85\xe9\x0d\xc7\x93\x3d\x54\xa4\x41\x38\x92\x3b\xd4\x0e\x15"
+ "\xe3\xd1\xf6\x65\x6d\xb8\xf6\x97\x1c\x77\xb7\x4f\x71\x81\xde\x3e"
+ "\x38\x6e\x17\x8e\xb7\xa9\x28\x23\xc5\x13\xa4\xe9\x4f\xeb\x3d\xc2"
+ "\xcc\x9d\x69\x88\x63\x49\x1b\xdb\x4b\x41\x3c\xb5\xc8\x8b\x99\xf0"
+ "\x20\x3f\x36\x8e\xab\xc4\xb8\x37\xc9\xdd\xd6\x02\x5f\x36\xd9\x9c"
+ "\xcd\xe7\x65\x4c\x26\x8c\x5d\x25\x6f\x66\xf1\xb6\x3c\xec\x93\xa7"
+ "\xb6\x47\x00\x7d\xef\x94\xaf\x25\xac\x2d\x37\xf9\x2c\xb3\xaf\x8d"
+ "\xc7\xb5\x92\xc2\x45\x2b\xd4\x46\x17\xdf\x25\x29\xda\x37\x63\x05"
+ "\xdf\xb9\x44\x4f\x5d\x3a\x8b\xad\xab\x44\x83\xc6\x0b\x7c\xb3\x08"
+ "\x9f\xa6\xab\x50\xe4\x83\xeb\xab\xd8\x8c\xf0\x6c\xf2\x45\xa6\x37"
+ "\x8c\xa3\xcd\xc9\xe4\x8b\x25\x6b\x70\xfc\x9e\x0d\x54\x5f\xca\xea"
+ "\x81\x2c\xc6\x76\xb5\x17\x17\x51\x7b\x29\xbe\xa3\xa7\x3f\x8b\xbe"
+ "\xd4\x09\x70\x8b\x11\x4c\x2d\xa9\x4c\xb6\x9c\x96\xe5\xd3\xa4\x7d"
+ "\x1d\x00\xc4\x27\xea\x28\xaf\x35\xad\x34\x04\x63\x3f\xfb\xde\x3f"
+ "\xc6\xeb\x5c\x75\xfb\x4c\x20\x9e\x31\x9e\x09\xfe\x4a\x5f\x15\xb6"
+ "\xcf\x25\x19\x49\x9f\xa1\x3c\xf6\x61\x5b\xf9\x54\xe2\xdd\x25\x77"
+ "\x69\xa2\x5e\xc7\x4c\x6e\xb4\x03\xd9\x8b\xec\xa2\xc3\x49\xbe\x6f"
+ "\x46\x5c\x39\xbc\xce\x7d\x83\x74\x6d\x1e\xa4\x16\x51\x7f\x57\xdf"
+ "\xb2\xb7\xa9\x6d\x25\xd2\x1e\x1d\x8f\x6b\x3a\xce\x0b\xfa\xee\x2f"
+ "\xe2\xcd\xa1\xb3\x78\x10\x07\xcb\x1f\x90\x17\x2f\xf2\x47\xac\x17"
+ "\x89\x71\x74\x9e\x41\x08\x5e\x93\x5c\xf3\xbf\xec\x2b\x77\xff\x2a"
+ "\xf3\x9c\xff\x64\x6f\x73\x67\x72\x04\x30\x7f\x48\x00\xe5\x94\x5c"
+ "\xb6\x51\xac\x1d\xc2\xd6\x65\x9f\xec\xc3\xf9\xa2\xc3\x31\xdf\xc3"
+ "\xd6\x79\xcc\x1f\x97\x46\xd2\x59\xc6\x12\x8e\xcd\x13\x78\x98\xcc"
+ "\xcc\x9f\x52\x99\x0f\x14\xa9\x4b\x51\xce\x2e\x3f\x28\x2d\x10\x76"
+ "\x2e\xf2\xd0\x89\x16\xbb\x8c\x74\x3e\x03\xc5\xa4\xd6\x54\xb8\xab"
+ "\xb5\xdd\x15\x97\xc8\xf6\x9d\xcc\xf6\x65\xf1\x16\xbe\xde\x8a\xb8"
+ "\x55\xc6\xdb\x07\xb9\xf9\x30\xf1\xb2\x83\xf9\x2f\xf1\x92\x3c\x8b"
+ "\x78\xc9\x63\x7c\x24\x2b\x70\x4a\x2e\x1f\x42\xf4\x71\xec\x4e\x31"
+ "\x5f\x05\xae\xd2\x24\xc2\xb5\x1a\x63\x15\xf1\x84\xb4\xbd\x59\xfc"
+ "\xbb\x8f\xf9\xc1\x0a\xc1\x7b\x41\x5b\x2a\x8d\x2d\x8a\x3f\x2b\xb3"
+ "\xb1\x05\x4e\xf9\x40\x43\x1b\xff\x86\xb3\x2f\x8e\xdf\xa9\x3c\x45"
+ "\xfd\xab\x1c\x14\xa3\x95\xc7\xd8\xf3\x47\xca\x23\xe8\xab\x9f\x81"
+ "\x01\xf1\x79\x93\x8f\x6a\x7e\x71\x52\xae\xda\x8d\x39\x06\xd9\x2b"
+ "\x07\x73\xa4\x9d\xa4\x6f\xf2\x65\xcc\x91\xc6\xb6\xa6\x95\x37\x68"
+ "\x7e\x8b\x74\xb6\x91\xee\xb9\x7d\x0e\xde\x8a\x7e\x9c\xe7\xf2\xad"
+ "\x83\xb7\x0a\x3d\xee\x44\x3d\x7a\x23\xbd\x37\x85\x5c\x3b\xb1\x3f"
+ "\xe6\x62\x55\x2f\x0b\xde\xb7\x8a\xfe\xf7\x6a\x76\x10\x73\xb5\x68"
+ "\x03\xc5\x5f\x66\x83\x83\x0e\x31\x36\x5b\xd0\xaa\xd3\xfa\x52\x8e"
+ "\xc8\xbf\xcd\x7e\xb0\x8e\xe2\xe0\x68\xb4\x3d\x8b\x7d\xec\x9c\x2a"
+ "\x0e\xa3\xb9\xc3\x69\x54\xad\x65\x7e\x88\x79\x8f\xcb\x8f\x0e\xe6"
+ "\x7a\xc4\x27\x8a\xc5\xe6\x12\xc4\x41\xf1\x94\x7c\x89\x62\x2a\xbd"
+ "\x47\x20\xbe\xf5\x62\xfe\x08\x9e\x2b\x86\xbb\xfb\x4a\xd5\x73\xe8"
+ "\x2b\xa3\x5c\xb8\x2b\x02\x7a\x5a\xe7\x2c\x3c\x06\x6e\xe3\x63\x2a"
+ "\xa2\x85\x6c\x39\x5c\x36\x51\x27\xbd\xad\x64\x7a\x1b\xa9\xd3\x23"
+ "\xea\xad\x72\xa3\xe8\x9f\x47\xb1\xdc\x35\x5f\x2b\x8a\xb5\xb9\xdc"
+ "\x3d\x5e\x54\xae\xa2\xf9\xa0\xe3\x6b\xa7\x47\xbc\xc8\xeb\x39\x5e"
+ "\x54\x24\x0a\x79\xad\x1e\x73\x23\x5b\xe4\xbb\x5b\x34\x3b\x94\xb4"
+ "\x9c\x13\xdf\x21\x2f\xdc\x42\xf1\x93\x68\xeb\xd7\xa0\x2c\xae\x57"
+ "\x31\x97\x2b\x17\x74\xb7\x43\xe5\x24\xfd\x7c\x26\x5b\x53\x4c\x20"
+ "\x1c\x64\x53\x96\x57\x22\x8c\xdb\xb5\xd2\x48\xb1\x41\x1f\xa3\xb1"
+ "\x6f\x46\xa7\x4a\xf3\xa5\x32\xdc\x7d\x2e\x56\xe4\x88\xb9\x28\x68"
+ "\x57\x0d\x40\x1b\x99\x74\x74\x73\x3d\xe8\x92\x6d\x6c\xa4\x07\x2e"
+ "\x63\xe5\x79\x6d\x4d\xa3\xfe\x38\x36\x11\xc7\x34\x7a\xac\x8f\x66"
+ "\xe2\x0f\x69\x45\xb1\x98\x95\xc9\x62\x45\x62\x2b\xe7\xe7\xa4\x45"
+ "\xac\x13\x08\x33\x09\x58\x9e\x58\x4b\x34\xbf\x79\xc2\x9d\xa7\xaa"
+ "\x88\x9e\xf3\xa3\x8a\x28\x2d\x3f\x62\xb8\x58\x2c\xaa\x8a\x14\xf2"
+ "\x11\x6c\x14\x87\x55\x18\x09\xb6\x81\xeb\x21\x43\x65\xeb\xd5\xc1"
+ "\x3c\xb1\x5e\xd1\xfc\x92\xb1\x1e\x4c\x73\x8c\xea\x88\xc3\x4a\xf8"
+ "\x4b\x53\xce\xd1\x3b\xc4\x56\xa7\x5c\x6e\xa3\x78\x40\xf1\x42\x99"
+ "\xcb\xe3\x86\xf2\x10\xbb\x7f\x4e\x71\x87\xf2\x10\x6a\xc7\x7e\xb9"
+ "\x14\x8b\x3e\x95\xab\x25\x3a\xd3\x48\x3d\xe1\x8d\x78\xab\x1a\xf8"
+ "\xd8\xea\xeb\x59\xae\x70\x22\xa2\x9f\x06\xd3\xc6\x61\xdc\xfa\x88"
+ "\xc6\xd1\x78\x2d\x7e\x51\xec\xea\xa0\xd8\xc4\xe8\x55\x3f\x2a\x7c"
+ "\x9c\xbd\x37\x68\x79\x51\xbb\xac\xeb\x4b\xdf\x82\x66\x31\xad\x3a"
+ "\x9b\xc7\xb3\xea\x2d\x34\x96\xd9\x0f\x63\xe5\xca\xb3\xea\x51\x4b"
+ "\x02\x18\xb2\x4e\x53\x5c\x2c\xcc\x10\x7c\x36\x71\x39\xaa\xdf\x63"
+ "\x72\xf0\x98\x6a\xe6\xbc\x14\x66\x64\x9d\x63\x6d\x55\x24\x0b\xb5"
+ "\xa5\xeb\xda\xd4\xf6\x60\x6a\x63\xe7\xde\x79\x8e\xeb\x6c\x9f\xd7"
+ "\xad\x3f\x9d\xd1\x85\x31\x94\xde\x51\x44\xec\xad\x89\xe7\x7c\xd6"
+ "\x8c\xd2\xe2\x2e\xea\x65\x0f\xc5\x5e\xd6\x36\x57\xf4\x79\x48\xdc"
+ "\x59\x7c\xaf\x79\x82\xeb\x35\x50\x16\xfa\xb6\x71\x39\x6a\xd8\x77"
+ "\x62\xd5\x13\x33\x51\xb7\x35\x33\x34\xdd\xea\x9f\x69\xfe\x20\xfd"
+ "\x00\xaa\x33\xbf\x4f\x62\xef\xb0\xdb\xa8\x0f\xf1\xc4\xd7\x88\xea"
+ "\x48\xcf\x9c\xfa\x53\xb9\xf6\x38\xad\x4b\x3c\x57\xad\x2d\x14\x7b"
+ "\x33\x90\x9f\xf0\x3a\xae\x0b\x76\xa3\x16\x63\xd4\xd6\x08\x7c\xe7"
+ "\x3f\x86\x7d\xec\xec\x7c\x2b\xfa\x7e\xb0\xbe\x0f\xc5\xa7\xb7\xce"
+ "\x39\x05\xce\x9a\x26\x2d\x6e\x50\x2c\x29\x69\x39\x26\x72\x3a\xbb"
+ "\x35\x4b\xc4\x92\x53\xb2\xfd\x35\xf7\x3c\xcc\xfe\x9a\x7b\xcc\xa8"
+ "\xdd\xed\x19\x33\x30\x6f\x5e\xd3\x9a\x66\x5f\xec\x96\x07\x20\xec"
+ "\xe2\xb1\xc3\x1e\x41\x73\x94\xce\x64\x60\xf1\x89\xed\x37\xd5\xfa"
+ "\x68\x3c\x53\xdc\x6c\x5e\xae\xed\x5f\xd4\xee\xa0\x5c\xcd\x83\x5e"
+ "\x83\x5b\xec\x24\x7a\x1a\x3e\x03\xd0\x37\xfd\x51\x0f\xb4\xdf\x62"
+ "\xcf\x15\x71\xde\xea\x16\x2b\xc5\x1a\x46\x71\xd2\x7d\xad\x2a\xdc"
+ "\xe2\xbe\x56\xd5\x6e\xec\x1e\x23\x6b\xa3\x7a\xbf\x56\xd5\x8e\xa7"
+ "\xb8\xa5\xc5\x48\xf7\x58\x50\x1b\x93\xe5\x96\xcb\xda\x4f\x6a\xb9"
+ "\xac\x2b\x8e\xda\x93\x28\x46\x21\xfd\x3c\x41\xdb\xe1\x94\x3f\x76"
+ "\x6a\xb4\xb1\xdd\x58\xa2\xa0\x6f\xa6\x15\x46\xa0\x4f\xe5\x8b\x1c"
+ "\x90\xcd\xcd\x73\xec\xbb\xea\x35\xde\xe8\x7f\xbe\xe4\x67\xf9\x71"
+ "\xa7\xa1\xc1\xb5\x56\xd8\x9a\x17\x6a\xfa\x3d\xb4\x40\x9f\x17\xbe"
+ "\x9a\xa9\xae\x6b\x4d\x3b\x34\x4d\x2f\xe3\x8b\x08\x4b\x17\x7b\x08"
+ "\x4c\xb7\x0c\xd7\xa1\x40\x4b\xa6\xbb\x6c\x5c\x8e\x43\x91\x24\x07"
+ "\xbd\x13\x21\x7d\x3f\xca\x7b\x30\xe7\xc3\xe7\x72\xb3\xa5\xcb\xe7"
+ "\x0f\x34\x9c\x4d\xd5\xe7\x57\x85\xb4\xff\xb3\x47\xbc\x7b\x16\x60"
+ "\xbe\x63\xd6\xef\xc5\x3c\x78\xcf\x74\x25\x3e\x21\x36\x6e\xf1\xdc"
+ "\x31\x4a\x6c\x5c\xec\xe2\xd8\xe8\xf9\xb1\xcb\xa2\x17\xc7\x2e\x8c"
+ "\x0b\x59\x10\xfd\x74\xec\x6c\x65\x69\xf4\x22\xc5\x94\x38\x32\xd1"
+ "\x17\x5c\x5d\x27\x2a\xd1\x8b\x16\x3d\xbf\x60\x4e\x8c\x12\x17\x3b"
+ "\x7b\x54\xc2\x9c\x45\x73\x16\x2b\xd1\x09\x0b\x9f\x8f\x8b\x51\x46"
+ "\xc6\x84\x8e\x34\x8d\x8b\xf1\xd5\xef\xa1\x8d\x08\x80\x93\x9d\x67"
+ "\x1a\x1b\xd3\xcf\x80\xb7\xbf\x14\x9f\xe0\x9f\x18\x1b\xc7\xf7\xec"
+ "\x0e\xef\x1e\x9d\x01\xf1\x74\x46\x24\x9d\x2f\xa6\xa6\x1d\x2a\xc0"
+ "\xbb\x81\xfa\xa1\x9c\x0a\x3e\x7b\x23\xef\x43\x5a\xd3\x0e\x27\x3a"
+ "\xe5\xfa\x28\x76\x76\x18\xc2\x51\xb6\x21\xea\x99\x82\x46\xcc\xd9"
+ "\xe2\xe9\x6f\x88\x2d\x67\xc0\x68\x5e\x02\x06\xbc\xfc\xf0\x0a\xa0"
+ "\x33\x24\x71\x0c\xc6\x13\x47\x01\xdf\xf7\x74\x44\x36\xf9\x9c\x37"
+ "\xaa\xeb\xce\x1b\xb9\x5d\x1c\xf7\x6b\x7b\xc1\x0f\xaf\x85\x87\xc9"
+ "\x3f\x8f\xc9\x0e\xf6\x7b\xc6\xd5\xe8\xcb\xb4\x8f\xda\xfc\xc1\xdd"
+ "\xe1\x98\x0f\x3a\xf2\x07\xb3\xb6\xfb\x5b\x64\xf0\x43\xbe\x0c\xfb"
+ "\x92\x4c\xb0\x19\x69\x2d\x0a\x54\xd5\xd6\x34\x47\x80\xb6\x9f\x86"
+ "\x32\x04\xa0\x2c\x76\x21\x47\x33\x93\x23\x53\x0d\xca\x18\x88\xfc"
+ "\x6d\x22\x7e\x1c\x93\x34\x19\x90\x6f\xbb\x53\x3e\x6c\x45\x3e\x03"
+ "\x88\xaf\x9e\xf6\xfa\x68\xbf\x0b\xf9\x5c\xdb\xb9\x04\xf5\x36\x94"
+ "\x9f\x29\x91\x9e\xc5\xe7\x1f\xca\xb3\xc7\x82\xcf\x1b\x4e\x83\xdf"
+ "\x8b\x74\xbe\x5f\xea\x30\xb5\xb8\xa5\x03\x4a\xe7\xd9\xc1\xff\x05"
+ "\xb5\x49\x7d\xb7\xb1\x51\xc8\xb4\x8b\x62\xc3\x3b\xcf\xd8\x0d\x24"
+ "\x13\xae\x15\x7e\x96\xd3\x17\xdc\x5b\x34\x6c\x1e\xa4\xb6\xa8\xaf"
+ "\xe8\x73\xae\xba\x1b\x49\x27\x94\x6f\x35\xa7\xd2\x19\x72\x75\x18"
+ "\x83\x1d\x33\x45\x6e\xdc\xa2\xb6\xcf\xd2\xe5\x52\x0e\xf2\xb3\x96"
+ "\x0b\xe0\xf6\xd6\x70\xd3\x59\x82\x34\x86\xdb\xbf\x6e\x2d\x8e\x69"
+ "\xd2\xe1\x8f\xf2\xc4\x4f\x38\xf1\xb9\x49\xa3\xc3\xdf\xc3\xeb\x28"
+ "\x27\x68\x42\x5f\x6e\xba\x00\xbd\xa0\x4d\x99\x6a\x65\x29\xc2\xd3"
+ "\xcf\x82\x01\xfb\x56\x5a\x32\x19\xfe\x7c\xd4\x7b\x10\xe1\x5f\x3d"
+ "\x08\x60\x0d\xf6\x69\x4e\x73\xcc\x6c\x61\xe7\xfa\xd5\xe1\xfc\x2f"
+ "\x9c\xee\xb9\x8f\x2d\xfc\x79\xa2\x87\x3f\x87\x6f\xa2\x9c\x10\x67"
+ "\x27\xf9\x50\xfa\x57\xb8\x0e\x63\x3d\x34\x03\x82\x89\x0e\x3e\x97"
+ "\xd1\x7e\x48\x6b\xda\x11\x93\x46\x4f\x45\xff\xdf\xd0\xc9\xf7\x60"
+ "\x84\x6f\x85\xd0\xde\x75\x72\xa2\xaa\xee\xc3\xf8\x4e\x3c\x92\x8f"
+ "\xe1\x98\x18\xcd\xa7\xd0\xd7\x2b\x99\x5f\x19\x21\x58\x4d\xab\x6b"
+ "\xb4\x0c\xc4\x7e\xe8\x57\x59\xe8\x4f\xe4\x57\xd8\xd7\xac\xf9\x14"
+ "\xfa\x5a\x19\xf5\x43\x1e\x7c\x77\x2d\x0b\x37\x50\x8c\x6c\x90\xeb"
+ "\xbd\xc8\xc7\xd4\x97\x1e\xb0\xab\x37\x3c\x6e\xe7\x76\xaa\xf7\x2a"
+ "\x6d\xe3\x36\x70\xe9\xfd\x88\x5d\xa7\xf7\x32\xf4\x63\x5f\xd2\x33"
+ "\xdf\xab\xae\xf7\x42\xde\xca\x58\x2e\xbe\x02\x6d\xc0\xd6\xaa\x23"
+ "\x36\x1a\x2f\x74\x58\xe4\xd2\x61\xbd\xd2\x93\x0e\x3d\x74\x67\xe0"
+ "\xe7\x0a\xd6\x87\xd0\x5c\xc1\x31\x5d\xe7\xbf\xf6\x64\x4b\xa4\x61"
+ "\x30\x64\x80\x37\xd1\xb0\x19\x59\xff\x35\x1a\x8d\x74\xd4\x75\x53"
+ "\xf2\xbc\x8b\xfa\xb3\xcd\x0a\x40\x7b\xe2\x34\x3e\xc8\x48\xfa\xad"
+ "\xb7\xb9\xc6\xab\x2d\x9e\xe3\x47\xce\x76\xe3\x95\x5d\xc8\xab\x7d"
+ "\xf3\x40\xf4\x23\xc6\xaf\xd3\x70\x31\x7e\x83\x14\xbe\x4e\xe6\x8f"
+ "\x20\xff\x76\x4e\x2e\xdd\x0a\x40\x30\x51\x0f\x69\xc6\xb5\xc7\x73"
+ "\x7f\xff\xc2\xbf\x6f\x70\xae\x70\xff\x7d\x83\x73\xfe\x85\x7e\xdf"
+ "\xe0\x41\xf7\x3d\xa2\xdb\x69\x99\x21\xe9\x68\x67\x77\xf6\x40\x5b"
+ "\x1b\x1f\x6a\xd5\xbf\xcf\x1c\xf5\x21\x1e\x4a\xe8\xec\xf5\x9b\x66"
+ "\x48\x2a\xe2\xb1\xb1\x35\xfc\xa8\x37\xcf\x5f\x28\x2f\x72\x36\x52"
+ "\x1f\x4f\x39\xba\x8a\xb7\x71\x2f\xdd\xce\xb2\x8a\xd7\x7d\x40\x7f"
+ "\xf1\x0f\xe3\x9a\xb4\x66\xd9\xad\x33\xa8\x3d\x54\xfc\x00\xee\x60"
+ "\xfd\x55\x2c\x1c\x24\xea\x1c\x8b\xa1\xab\x7f\x57\xfb\x37\x28\x3e"
+ "\x9c\x5f\x86\xaf\x0d\x24\xfe\x34\x3e\x40\xd7\x63\xda\x45\x46\xab"
+ "\xa0\x0d\xe9\xa9\x50\x36\x9b\x32\xc3\x0b\xf1\x99\x58\x67\x55\xed"
+ "\x10\xf8\xb5\xba\xaa\xaf\x13\xc4\xbd\x8e\xa5\xdf\x2c\x1d\x81\x61"
+ "\xfd\x62\xd8\x9f\x2a\xdd\x19\xd3\x05\x92\xad\x7a\x5e\x51\xdd\x29"
+ "\x5e\xec\xc1\x9f\x7e\xb4\x21\xbe\x60\x6c\x1f\x3f\xbd\xab\xc3\x75"
+ "\x2d\xab\x74\xdd\x0f\x70\xf6\x27\x58\x2f\x22\xe3\xa5\x96\xa1\xba"
+ "\xe7\x61\xfc\x36\x21\xea\x5b\xc4\x7f\xf1\xa2\x94\xf9\x68\x8f\x2e"
+ "\xf7\x98\xd0\xd0\x53\x57\x97\xfe\x27\x6a\x36\x56\xf5\x1e\xea\x6a"
+ "\x9f\x9c\xef\x5e\x9f\x62\x76\xaf\x4f\x75\x7e\x0b\x9c\x03\x23\x92"
+ "\xec\x1c\x00\x10\x9e\xd3\x05\xf4\xf7\x98\x32\xfe\x66\x8f\x29\xe4"
+ "\x2a\x82\x9b\x7e\x00\x77\x8f\xd5\x81\x0d\x3d\xf7\xbe\x32\x65\xf0"
+ "\x2a\x31\x21\x86\x35\x05\x74\x6b\x9c\xe2\x01\xa3\x7a\x7f\x45\xc0"
+ "\xc2\xf6\x76\xeb\xcf\x60\x8a\xae\x2e\x85\xe3\x0f\x2b\xfa\x7f\x53"
+ "\xf7\xbe\x7d\xa5\xaf\xf4\xa2\x48\x34\x3f\xfa\xca\x15\x2a\x2a\x5f"
+ "\xc5\x31\x12\xb1\x1b\xfd\x53\xbb\x02\xa5\x2a\x1a\x54\x01\x50\xc5"
+ "\xc3\xb7\xb2\x8e\xf7\x95\xbe\xd2\x57\xfa\x4a\x5f\xe9\x2b\x7d\xe5"
+ "\xff\xa0\x48\xfa\x17\x6b\x3a\x3f\xe4\x2a\x71\xd7\xbf\xff\x48\xe2"
+ "\xd2\xc3\xe4\x6f\x32\x4e\x15\x05\x52\xc2\xf3\x15\x6b\x94\x33\xc0"
+ "\x3c\xbd\xcc\xb4\x2b\xbe\xc9\x7b\x5d\x44\x41\xf0\xce\x79\x8d\x81"
+ "\x5b\x67\xda\xc7\xe7\x25\xb6\x19\xd6\x4c\xb3\x05\x65\xc7\x34\x18"
+ "\x33\x66\x54\x8e\xcd\x5d\xdc\xe2\xb7\x3e\xb2\x28\x24\x67\xfe\xc9"
+ "\x21\xdb\x66\x39\x26\xed\x49\xea\x90\x53\xef\xfe\x70\xc4\xeb\x4f"
+ "\x1d\x1b\xb8\xe9\xe7\x07\xc7\xfc\x2d\xe1\xb4\x6f\xda\x4f\xf7\xff"
+ "\xe8\x4f\xcf\x7c\x36\xf8\x0f\x8f\x1d\x9a\xf8\x8f\x65\xe7\xfa\xff"
+ "\xe6\xbe\x7f\xff\xe0\x8d\xb9\x9f\x0e\xca\x7c\xa4\x7a\xdc\xbb\x4b"
+ "\xce\x5c\xbb\xe1\xa1\x92\xd0\xbf\xc6\x9d\x1a\x9a\xf5\xe4\x91\xbb"
+ "\x3e\x58\xd9\x29\xad\x9a\xba\x77\xf8\x6b\xd1\x47\x07\x6c\xfc\x59"
+ "\x79\xd8\xdb\xcf\x7d\xe9\xf3\xbb\xfb\x0b\x6f\x7d\x33\xf6\xf8\x8d"
+ "\x2f\x3f\x5a\x3b\xe1\xbd\x17\xce\x7a\xad\xbd\xf7\xa3\x91\x3b\xe6"
+ "\x7c\x72\xfd\x96\x5f\x56\xdd\xbe\xfb\xf9\xaf\xae\x79\xf1\xc1\xe2"
+ "\x51\x7f\x59\xf0\xf9\xcd\xaf\x3e\x51\x37\xf9\xfd\x15\xe7\xfb\xad"
+ "\xbe\x67\xdf\x2d\xdb\x67\xff\xe7\xba\xcd\xbf\xa8\xb8\xed\x9d\x45"
+ "\xcd\x57\xff\xfe\x81\x03\x3f\xfe\xf3\xb3\x27\x6e\x7a\xe5\xf1\xc3"
+ "\x77\xfe\x73\x79\xfb\x55\xbf\xfd\xc9\xc7\x3f\xfc\xe3\xd3\xff\xbd"
+ "\xe1\xa5\x5f\xd5\xdc\xf1\xf7\xa5\xad\xfe\xe9\x0f\x97\x8e\x7e\x6b"
+ "\xe1\x17\xc3\x2c\xbf\xae\x9f\xf2\xaf\x64\xf5\x9b\xe8\x0f\x33\xec"
+ "\xcd\xdf\xa5\xdd\x5c\xc9\x23\x81\xb3\xa2\x2e\x1b\x8f\x2c\x09\xfb"
+ "\x73\x40\xca\xed\x20\x79\x43\x7f\xc3\x65\xbc\x31\x5c\xae\xdc\x17"
+ "\x28\x8a\x7e\x7c\x6f\x0a\xed\x1f\x85\xe1\x75\x1b\x5e\x37\x31\x88"
+ "\x6b\x17\x60\x44\x2f\x71\x5c\xf9\x22\xa1\xec\xfd\x90\x33\x2f\xe8"
+ "\x8f\xda\xf2\x06\x1f\xf0\x85\xab\xc1\x0f\xae\x81\x6b\xc1\x1f\x02"
+ "\x60\x00\x0c\x84\xeb\xc0\x08\xd7\xc3\x20\xb8\x01\x02\xe1\x46\x18"
+ "\x8c\xd2\x0c\x81\x9b\x61\x28\x0c\x43\xa5\x0c\xef\x59\x96\x14\x08"
+ "\x0f\xc4\x1f\xf8\x7f\x3a\x84\xb3\x7a\x54\x1f\xfc\x3b\x85\xe7\x0b"
+ "\x78\x99\x80\x3b\xfb\xe0\xdf\x29\x5c\xf9\x9e\xef\xc3\xbf\xd7\xbb"
+ "\x84\xa9\x03\xcf\x1e\xdc\x72\x88\xae\xe2\x09\x95\x44\xe9\xaa\xc3"
+ "\xd7\x8c\xef\x86\xcf\x7d\xbc\x67\x09\xc7\x4b\x6c\xc8\x26\x03\xf0"
+ "\xdf\x37\xa8\xfa\xd2\x91\x29\x7d\x68\x18\x90\x42\xbf\x3a\xf1\x06"
+ "\x23\xfb\xf9\xf5\x25\x7f\x31\x5e\x29\x78\xad\xc7\x2b\x1d\xaf\x57"
+ "\xf0\xda\xa1\xe1\x06\x69\xd8\x34\x90\x94\x24\xbc\x3b\x41\x1a\x1e"
+ "\x88\x57\x0e\x48\x41\x21\x20\x8d\x38\x09\xd2\xc8\xf9\x2e\xe6\x43"
+ "\xd7\x75\x71\x29\x85\x08\xb8\x82\xcf\x61\xfa\xbd\xda\x4b\x5d\xcf"
+ "\xf2\xef\x9d\x11\xa1\x84\x85\x8e\x0d\xbd\xfd\xb6\x68\x65\xd4\x28"
+ "\x65\x8c\x29\x2c\x6c\xb4\x69\xdc\xe8\xb0\x3b\x94\x31\x63\x26\x86"
+ "\x99\x26\x9a\x4c\xca\x82\x17\x12\x62\xc3\x4c\x4f\xcf\x51\xe6\xc6"
+ "\x26\x2c\x58\x1a\x9d\x30\xa7\x17\x42\x5f\x7a\x41\x51\xe0\xe6\xf3"
+ "\x9c\x4d\xbd\x85\x24\x98\x02\xf2\xf1\x99\x20\x9f\x0f\x84\xee\x26"
+ "\x0d\x16\x97\x7b\x91\xde\xb0\x81\xb4\xbd\x00\x24\xcb\x58\x90\x5e"
+ "\x0e\x07\x69\x23\xea\xd2\x86\xb0\xbd\xbb\x40\x7a\xdf\x00\xd2\xbb"
+ "\x6d\x20\xbd\xb5\xbe\x3b\xac\xd8\xca\x61\xc7\x15\x90\x1a\x66\x80"
+ "\x74\x04\xed\x50\xbd\x86\xc3\x5a\xb0\xcf\x17\x41\x57\x44\xf6\xcb"
+ "\x2f\x97\x6a\x6f\xe9\x7f\xa8\x4a\x69\x9a"
;
diff --git a/sys/dev/mxge/ethp_z8e.h b/sys/dev/mxge/ethp_z8e.h
index a245a8a..de63bbe 100644
--- a/sys/dev/mxge/ethp_z8e.h
+++ b/sys/dev/mxge/ethp_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,7326 +28,7535 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int ethp_z8e_uncompressed_length = 377876 ;
-static unsigned int ethp_z8e_length = 117102 ;
-static unsigned char ethp_z8e[117102 + 1] =
- "\x78\x9c\xec\xbd\x7f\x7c\x54\xc5\xd5\x3f\x7e\xb2\x59\x60\x13\x03"
- "\x1b\x30\xd2\x15\xb1\x2e\x8a\x36\x5a\x90\xa8\xd8\x46\x0b\x1a\x05"
- "\x2c\xd6\x00\xa9\xa2\x8d\x8a\x06\x34\xd0\x45\x23\x46\x08\xb0\x40"
- "\xc8\x86\x05\xeb\x06\x81\x44\x45\x8d\x10\x48\xb4\xd8\x87\x3e\x45"
- "\xa5\x95\x1f\xc1\x82\xc6\x92\x22\x6d\x93\x2c\x54\xfa\x6d\xda\x2f"
- "\x7d\xba\xf2\x89\x34\xf2\x09\xb0\x92\x85\x5d\x93\xdd\x3b\xdf\xf7"
- "\x99\xb9\x37\xd9\x5d\x36\x28\xcf\xf3\xbc\x5e\xdf\x7f\x9a\xd7\x6b"
- "\x73\xef\x9d\x3b\x73\xe6\xcc\x99\x73\xce\x9c\x99\x39\x73\x2e\xd1"
- "\xc5\xff\xf9\xc8\xc2\x97\x24\x32\x35\xa7\x7f\xfc\xdf\x28\xff\xef"
- "\xbf\x7f\xff\xfd\xfb\xef\xdf\x7f\xff\xfe\xfb\xf7\xdf\xbf\xff\xfe"
- "\xff\xfd\xf3\x27\xd1\xd8\x33\x26\x33\xfd\xae\x8a\x28\xe8\xb6\x0c"
- "\xf7\x51\x57\xf1\xeb\xaf\x88\x30\x5e\x25\x61\x9c\x1f\xce\x57\xfe"
- "\xbd\x8c\x34\x53\x15\x59\xae\x4e\xa7\xb4\x09\x9b\x88\xd6\x0f\x15"
- "\x1d\xaf\xbc\x26\xfc\x2b\x5f\x13\x1d\x13\xdf\x26\x6a\x1c\x49\xf4"
- "\xca\x50\x11\x00\x8c\x19\x3e\x7a\x7c\x3a\xc3\x58\x89\x67\x7e\xbf"
- "\x6a\xa8\xf0\x23\xbd\x04\xe9\x4d\x9c\xbe\x62\x28\x60\x65\x10\xb9"
- "\x5f\x13\xa1\x28\xb8\x16\x2e\xcf\x30\x27\x8e\x90\xb8\x6c\x89\x83"
- "\xc3\x30\xea\x7d\x54\x30\xf1\x02\x30\xd2\x0c\xbc\x02\x26\x4a\x62"
- "\x78\x9d\x6e\xb2\x05\xdc\x0d\x97\xa1\x6c\x00\xed\xc9\xe4\xb2\x95"
- "\xc8\x23\xdc\x94\xdc\xe8\x0c\x93\xfd\x6a\x4a\x3a\x4e\xa9\x6f\xe2"
- "\x6a\xc2\xf5\x55\x6e\xeb\x4a\x55\x6e\x24\xc3\x40\xd9\xa4\xa0\x3b"
- "\x25\xab\xa7\x2c\x60\xdb\xcb\xc8\x8c\xbc\x73\x03\xa6\x06\x93\xca"
- "\x9b\x9e\xa2\xe7\x35\x21\xef\x0c\x23\xaf\x7a\x67\xba\x57\x7f\x77"
- "\x09\xde\x39\x63\xdf\x99\x5f\xd6\xdf\xa5\xe1\xdd\xfa\x38\xfc\xcc"
- "\xde\xae\x30\x1d\xa7\x94\x6d\xc0\xc5\xbe\x1f\x3d\xc2\x65\xf4\xfc"
- "\x83\x91\xbf\x31\x16\x16\x91\xfe\x6e\x08\xde\xf9\x62\xdf\x7d\x98"
- "\xa5\xbf\xfb\x16\xde\x85\x63\xdf\x25\x19\xe5\x6c\x41\x77\xaa\x2d"
- "\x41\x3b\xb9\xfe\x24\x55\x37\xb7\x21\x75\x1c\xf2\x94\x73\x9e\xe9"
- "\xf6\x72\xe2\xbe\xe2\x77\xfb\xeb\x7a\xea\xe7\x3c\x33\x0d\x38\x3e"
- "\x94\x8f\xa2\x29\x68\x99\x5a\x6a\x94\x9f\x68\x67\x18\x24\x69\xc8"
- "\x70\x7c\x94\x32\x99\xe1\xf0\x33\xee\x87\x73\xbb\xf5\x7b\x3b\xb7"
- "\x2f\xba\xcf\x89\xcc\x00\xdb\x0f\x86\x68\x7f\xfc\x06\x58\x0c\x1e"
- "\x58\x60\x13\x9a\xeb\x72\x32\x8b\xd5\x3b\x1b\x34\xb7\x20\xaf\x33"
- "\x44\xf6\x61\xe4\x3a\x46\x97\xd8\x80\x1f\xad\x5b\x4a\x16\x57\xb1"
- "\x08\x79\x9d\x1d\xd4\xe2\xef\x20\x97\x5f\xb4\x7b\xc3\x67\xa9\xec"
- "\x2c\x59\xbc\xe1\x93\x54\xf6\x1c\xd9\x1a\x4b\x3f\xa7\x44\xfc\xa5"
- "\x99\x04\xb9\x86\x73\xd9\x36\x6a\xa9\x69\x23\x57\x4d\x6c\x59\xd7"
- "\x95\x64\x6b\xc6\x33\xfa\xce\xca\x78\x34\xda\xc3\x14\x4e\xdd\xd9"
- "\x50\xfa\x06\x99\x5d\x23\x60\x2d\x17\x36\x18\xb8\xf8\x18\x97\x55"
- "\x27\xc8\xf2\xf3\x39\xe0\xa1\x13\x8c\xef\xbe\x86\xf7\x96\x86\x4c"
- "\xfb\x6d\xb9\xb4\xdf\x76\x94\x1a\x6d\xe3\xa9\xd1\x39\x91\xd6\x9d"
- "\xa0\xb4\xfd\xa1\x71\xd4\x68\xbe\x07\x32\x36\x91\xbc\x1d\xb8\xb7"
- "\x47\x90\x27\x40\xf6\x45\x04\xfe\xb8\xe4\xd0\xfa\xa7\xc8\xe2\x53"
- "\x30\x41\xdf\x4b\x8e\x7e\x5c\x42\xc4\xf4\xe5\xe7\x44\xed\x58\x70"
- "\x39\xd9\x80\x5f\x3b\x70\xb9\xed\x18\xa5\x5d\x36\xd2\x46\x59\xc0"
- "\x79\x80\xb7\x3a\x4c\xe6\x52\x4a\xe9\x43\xb6\x32\x34\xb7\x94\xf1"
- "\x8e\xcd\xaf\x89\x76\xe6\xd1\xce\x65\xf9\x90\xd3\xb4\x5c\xd4\xdd"
- "\xc1\xf5\xad\x83\xac\xbb\xde\x24\x73\xe7\xe2\xfc\xa4\xda\xd7\x44"
- "\x1b\xde\x39\x8c\x77\xe0\xa7\x36\xbc\x6f\x1f\x93\x41\xe9\xde\x70"
- "\x0e\x7d\xd4\xd5\x6e\x66\x18\x83\x02\x94\xc4\xf0\xac\x4e\x4a\x46"
- "\x7b\xfa\x01\x9f\xdb\x6a\x91\x7e\x0d\xf2\xa1\xfc\x56\x1f\xbd\x6c"
- "\xe3\xf2\xe2\x5b\x8f\x06\xb4\x6f\x3d\x7a\x56\x7b\xfd\xd1\x4e\xf1"
- "\xfa\xa3\x67\x22\xaf\x3f\xfa\xa5\x6b\x09\x59\x22\xdf\x7a\xd4\xdf"
- "\x52\x2c\xfb\x20\xbd\xa5\x18\x7d\x10\x21\xcb\xf2\x93\x94\xfe\xf8"
- "\x73\xe8\xfb\xf0\x3f\x68\xf9\x5c\xb2\x69\x29\x7b\x9d\xde\xf0\x5f"
- "\xe8\xf1\x52\x12\xb8\xf7\x24\x6a\x5f\x67\xea\x87\xa4\x64\xc8\x82"
- "\x36\x0d\xb4\xfb\x4c\x3b\xea\xb9\x5e\x7f\xca\x01\xc2\xcf\x8c\x9f"
- "\x05\xbf\x34\x91\xfa\x61\x1a\x68\xe5\x1a\xb4\x22\x89\x36\x77\x11"
- "\x8d\xd1\x28\xe9\x04\x0d\x1c\x07\xfc\xd3\xfb\xa0\xdb\x70\x6d\xf5"
- "\xe1\xf4\xef\x94\x53\x59\x30\xe8\x20\xd6\x4d\xac\x97\x58\x4f\xa1"
- "\x1e\x0f\xea\x09\x49\x59\x7c\x4d\x04\x44\xea\xe1\x74\xa4\xb7\x07"
- "\x96\x39\x92\xfc\xcb\x1c\xa6\xce\xd4\xc3\x97\x22\xcf\x36\x9f\x69"
- "\x67\x96\x4e\xc3\x76\x86\x05\x99\xf0\x0f\x0c\x53\x32\x60\x16\xef"
- "\x3e\xd7\x6a\xde\xf4\x9a\x38\x8a\x7c\x47\x7a\x60\x01\x36\xe0\x80"
- "\xfe\x03\xdb\x8d\x34\xd0\xba\x6d\x2d\xf2\x71\x79\x6f\x28\x87\xf5"
- "\xb7\xcf\x5b\xd4\x4e\xd6\x30\xa5\x8a\x6e\x55\x1f\xf2\xb4\xb3\x9e"
- "\x1d\x18\xa2\xfe\x41\x37\xe5\x31\x6c\x2e\xe7\xed\x68\x27\x94\xbb"
- "\x54\xb8\x1c\xd0\x6f\x34\x35\x28\x1c\x49\xd0\xe9\x6d\xfb\x51\x5e"
- "\xd5\x3d\x28\xcf\xc0\x91\xeb\xe0\xbe\x96\x78\x82\x1f\xf6\x17\x85"
- "\x68\x60\x35\x25\xa3\xdc\x03\x0c\x8f\x61\x81\x0f\x7c\x68\xeb\xa5"
- "\xfb\x8b\xfc\xa4\x89\x18\x98\x3e\x1d\x5e\x5d\x0c\x3c\xa4\x0b\xc0"
- "\x63\xfe\x6b\x44\x99\x81\x75\x12\xde\xfd\xbb\x35\x86\x17\x22\xb3"
- "\x5d\xe2\xfb\x10\xc3\x08\xb2\x8e\x01\xcc\x86\x45\x77\x53\x07\x59"
- "\x2d\x7e\x97\x23\xb9\xa5\x94\x88\xcb\xbf\x57\xd6\xde\x4f\x74\xe6"
- "\x27\x33\xcf\xf1\x7b\x6f\xf8\x0c\xf2\x0c\xfa\x42\x74\x3a\x92\x07"
- "\x76\x90\x99\x71\x46\x79\x27\xe3\x19\xdd\x97\xf7\x4f\x7a\x68\x3c"
- "\x3d\x34\xf1\xde\x89\xe3\x69\xca\x5d\x13\xc6\x53\xd6\x6d\xa3\xb3"
- "\x6e\xf9\x7e\xf6\x2d\x94\xf7\x93\xfb\xc7\x53\xde\xd4\xf1\xf4\x00"
- "\x7e\x79\x0f\x4c\xba\x7f\xe2\xa4\x07\xc6\x53\xfe\x3d\xf7\xe2\x69"
- "\xc2\xf8\x9b\xb2\x7e\x38\x3a\x6f\xc2\xbd\x93\xe8\xc7\xd3\x6f\xce"
- "\xba\xf9\x66\xba\x6b\x52\xee\x4d\x59\x59\xfa\xf5\xa6\x2c\xce\xf2"
- "\x48\xf6\xa4\x07\x46\xe7\xcd\x7f\xb6\xe4\xd9\xd1\x53\xef\x9d\xc0"
- "\x29\x3c\x26\x47\xf1\x4e\x66\xe4\x9c\xc6\x34\x0e\x88\xd3\x93\x49"
- "\x83\xce\xd8\x8c\xbe\xc7\xaf\xa3\xa1\xec\x18\x64\x3f\xfd\x2f\x9b"
- "\xb9\xcf\xa4\x6e\xb5\xf2\x78\x65\x0e\xba\xad\x47\x41\x3b\x39\x86"
- "\x63\x4c\x43\x9e\xa1\x4b\xf0\xee\x7a\x7d\xec\xe8\x87\xf7\xe1\xd8"
- "\xf7\x43\xa0\x67\xad\x63\x5a\xec\x44\x5e\xfc\x40\xef\x00\x74\x20"
- "\xe8\xea\xa7\x4e\x57\x7e\x3f\xf0\x75\x12\xea\x68\x83\x4c\x1e\x0a"
- "\xba\xd3\xb3\xa3\x64\xbd\x0d\xfd\x72\xc8\xbe\x94\x92\x4f\x51\xfa"
- "\xe0\x96\x92\x1c\xe2\xfe\xf1\x96\xe8\x30\xce\xf6\xc0\x48\x95\x30"
- "\xd0\xe7\x80\x73\x44\x87\x53\x1e\xa5\x17\x7c\x0c\x67\x1d\xde\xe9"
- "\xb0\x1e\x6c\x81\x7e\x80\xfe\xfe\xa3\xe6\xca\x24\x91\xba\xf3\xa0"
- "\xd6\x9d\x29\xc7\x04\x94\xab\x37\xf8\x19\xf5\x07\x1a\x51\xa7\xf8"
- "\xf9\xe4\x24\xf4\x7f\x12\xc6\x2a\xb4\xc5\xda\x08\xbe\x86\x1c\x1d"
- "\x48\x17\xdd\xf9\xa4\xd2\x06\x9b\x23\xab\xf1\xbc\xfa\xc0\x60\xe1"
- "\x42\xda\x52\x99\xd6\x0f\xcf\xdc\xd7\xc9\xe0\x15\x8a\x9c\x46\xfa"
- "\x3c\x4a\x46\xfa\xef\x41\xeb\x56\x99\xff\xb4\x2c\x3f\x00\x69\x6f"
- "\x03\xde\x60\x2d\xf5\xc0\x10\xf0\x0e\xa7\xc1\x4e\x18\x5c\x81\xf2"
- "\x97\xb2\xbe\x53\x3a\x78\xe8\x1b\x3c\xc6\xa1\x1d\x7e\x05\x5f\x7f"
- "\x86\xbc\x2a\x1c\x86\xbe\xb1\x1f\x74\xd9\x8f\x51\xab\xb1\x94\x6d"
- "\x9b\xc1\x68\xff\xc0\x7c\x35\x3e\x0e\xad\xe6\xbc\x9a\xc8\x27\x91"
- "\x36\xc4\x02\xb8\x19\x0d\x4b\x3b\xe8\x78\x31\x99\x7c\x34\x78\x9c"
- "\xe6\x72\x50\x54\x5b\x32\x19\x0f\xe0\x6d\x0e\x76\x3b\x30\x5e\x0e"
- "\x1e\x25\xcb\x02\x3f\x1d\x37\xce\x63\x63\xfc\x59\x47\xa0\x5f\xc7"
- "\xa2\xcf\x53\x50\x9f\x3f\xae\xcf\xd3\x98\x1e\xc0\xb7\x55\xc3\x15"
- "\x70\x32\xc4\x62\x07\xf0\x22\x13\xd3\xc3\xd7\x0b\x23\xa0\x78\x6a"
- "\x48\x56\x1c\x4f\x3d\x06\xd8\xe3\xa3\xde\xe7\xc5\xbd\xbf\x0b\xef"
- "\xef\xd6\xdf\x43\x56\x87\x14\xc7\xd5\xbf\x06\xef\xef\xe1\x3e\x84"
- "\x2c\x26\xfb\x28\x7d\xeb\x66\xb6\x25\x7b\xf3\xd7\xc5\xe5\xdf\x8b"
- "\xfc\x3f\x02\xbe\x01\x1e\x27\x38\x7f\xad\xce\xf7\xc8\x6f\x41\xfe"
- "\x43\x71\xf5\x8f\x40\xfe\x07\xa2\xf0\x8b\x6b\xff\xa5\xf5\x78\x9f"
- "\xcf\x7c\x8a\x6b\x21\xf2\x0c\x60\xf9\x67\xdd\xb3\xbf\x88\xfb\xe7"
- "\x52\x7b\x5c\xfe\x1c\xe4\x7b\x9a\xe9\x2c\x69\xd4\xc9\x34\x4a\xdf"
- "\xaa\xdb\x35\x47\x15\x0e\x97\x4e\x8f\x2b\x53\x82\x32\x0b\x98\xbe"
- "\x92\xcf\x82\x09\xcb\x78\xe2\xca\x6c\x95\x7c\xaa\xea\xd1\xfb\x58"
- "\x95\xd1\xf5\x5a\x34\x0c\x6e\x1b\x6c\xad\x4b\x9b\x62\x61\x5c\xb6"
- "\x15\xf5\x2e\x5b\xab\x74\xc6\x25\xe0\x89\x9b\x91\xf6\x06\x60\x5e"
- "\xc6\x7c\x04\x39\x0b\x78\xfd\x21\xe8\xdd\xc9\x69\x8a\x77\x33\x46"
- "\x5b\x4b\x89\xef\x47\xf3\x3d\xc3\x16\xdd\xb9\xba\x3c\x65\x8c\xc6"
- "\x95\xd3\x33\x38\x9d\xe5\x58\x74\xdf\xa7\x29\x98\x19\x3f\x86\xbc"
- "\x9b\xf0\x1c\xd1\xeb\x78\x09\xcf\x49\xc0\x7f\x08\x74\x3a\x78\x76"
- "\x32\xf3\xe3\x58\xa4\x57\xe8\xef\x57\x70\x7e\xdc\xdf\xa4\xdf\x27"
- "\x81\xc7\x86\xe8\x72\x06\x99\xba\x6c\x89\xac\x1b\x72\x65\x94\xd7"
- "\x14\xdf\x4f\xc0\xbb\xd9\xb8\xde\x8b\xeb\x8f\x71\xfd\x31\xae\xa3"
- "\x5d\x67\xc9\xe6\x8a\x48\xf9\xe2\xe7\xcb\x71\xbd\x1f\xd7\x7e\xb8"
- "\x3e\x00\xdc\xbe\x04\xdd\xd3\xfd\xe0\xe9\x38\x9e\xe9\x40\x1f\xb2"
- "\xdc\x0f\x50\x7d\x98\xe1\xe3\x3a\x23\x86\x2e\x38\xdd\x9b\xa6\xeb"
- "\x07\x5d\x1e\xf4\xb4\xee\xc9\x4c\x97\x3c\xc0\xdf\xcb\xf5\x0b\x05"
- "\xab\x9f\xea\x27\x95\x47\x53\xe5\xcc\xaa\xbf\xf5\x34\x95\x2f\x29"
- "\xba\x4e\x5c\xab\xca\x02\x42\xe0\x5a\xca\x74\xf5\xd1\x65\xe5\xa0"
- "\x89\x19\xcf\x79\x4c\x27\x99\x5f\xc2\xbd\xb4\x23\xaa\xbf\x21\xfb"
- "\x97\xed\x8d\xeb\x6f\x96\xf3\xb5\xb2\xbf\x41\x3b\x03\x67\xc6\x1f"
- "\x3c\xcd\xe3\x64\x7f\x83\x6f\xc0\xdf\x1d\xbd\x32\x36\xd4\x1c\x0b"
- "\x47\xf1\x15\xf3\xc7\xa0\x62\x5d\x26\x41\x2f\xe8\xb0\x40\x72\x29"
- "\xf3\xea\xd0\xb1\x3e\xfa\xd5\x64\x69\x8b\xad\x3e\x30\x94\xdf\x07"
- "\xa0\x9b\x38\x7f\x72\x31\xcb\xd8\xd0\xe9\xc6\x7b\xf9\x2e\xe5\x70"
- "\x15\xe3\x94\x5c\x24\xdf\x15\xfb\xc0\x62\xc6\x3b\x59\x0f\xbf\x2b"
- "\x91\xef\xd6\xf4\xc2\xdd\xd9\xae\xc3\x4d\x4e\x64\x4b\x09\xcf\xce"
- "\x56\x30\xa8\xe9\x86\x72\xea\xe7\x0d\x1f\xa1\x69\x61\x11\x19\x5d"
- "\x4e\x29\xde\xf0\x36\xba\x9e\x68\xb0\x37\x7c\x94\x6e\x20\x1a\xe1"
- "\x0d\xaf\xc7\xd8\xbe\x85\xdf\x7f\xf4\x1d\x4a\x4a\xc2\xd5\x75\x5d"
- "\xb9\x29\xc9\x1b\x2e\xa1\x91\xe5\x66\x5c\x8b\xe8\x9e\x7e\x22\xe8"
- "\x0d\xe7\x22\x5f\x21\x4d\x8b\x88\xd3\x13\xfb\x89\x7f\x16\x44\x28"
- "\x3d\xf7\x79\xe1\xf2\x86\x61\x67\x87\x9b\x90\xae\x89\x69\x91\xaf"
- "\xf0\x0b\x0a\xcd\xb3\xb3\x7d\x5a\xe4\xb4\x98\xf0\xfc\x47\x78\xfe"
- "\xa7\x10\x26\x12\xde\xf0\x38\x6a\x09\x04\x90\xcf\x25\x44\xc5\xce"
- "\xd6\xc7\xcf\x9a\xa8\x1b\x63\xb4\x56\xb1\xb3\x1d\x6d\x09\x75\xa3"
- "\x1d\x18\xbf\x82\xdd\xcb\x70\x5d\xbd\xf3\x9c\x7c\xf6\xec\xb2\x08"
- "\xcb\xce\xd0\x8d\x98\xb4\x70\x1b\xbc\xe1\x36\x2a\x80\xd9\x3d\x6d"
- "\x89\x5f\x30\xfe\x83\x56\xf0\x9c\x65\x1c\x41\x2f\x5a\xa7\x2d\x71"
- "\x09\xbc\xb3\x88\x94\x9d\x21\x6f\xb8\x83\x44\x05\xca\xa6\xee\xea"
- "\x27\xe1\x79\x76\x65\x22\xaf\x9f\xf3\x45\xc3\x61\x18\x9c\x77\x5a"
- "\x84\xac\xc8\x9f\xd9\x9d\xb2\xcb\x86\x5f\x36\x7e\x0e\x94\x5d\x2a"
- "\xdc\x19\x1f\x0b\x8c\xa7\x28\xef\xc1\x73\x75\x08\x73\x04\x49\xcb"
- "\x08\x0d\x40\x7e\x0f\xf8\x65\x22\xf8\x0e\xf8\xee\xaa\x97\xf8\xae"
- "\xde\xb5\x3b\x24\xdb\xb1\x6b\x97\x6a\xc7\xae\x9d\x9c\xde\x09\x5b"
- "\x02\xf7\xad\x9d\xea\xdd\x5f\x51\x6e\xba\x2c\xe7\xd9\xd5\x2a\x2c"
- "\xbb\xda\x43\x90\x27\xd0\xb5\x9c\xe9\x08\xba\x96\x33\x2d\x01\xbf"
- "\xd5\xeb\x5c\x43\x22\x65\x57\x3b\xf0\x09\x89\xd5\xbb\x53\xbb\xe5"
- "\x18\xbf\xdb\x16\x92\xb0\x77\x63\x7e\x4a\x33\xc0\xaf\xc9\xc2\xb2"
- "\xdb\x26\x3c\xbb\x33\xbb\xdd\x76\x9a\xb6\x44\x84\xa6\x85\x57\x84"
- "\x0b\x96\x50\xf2\x28\x2a\x07\xbe\xfb\x40\xa3\x42\xb4\xb3\x11\xd7"
- "\x89\x78\x4f\x97\xa2\xae\x8f\x44\xca\x6e\x1b\xd7\x27\x2a\x76\x67"
- "\x02\xe6\xb5\x80\x55\xc8\x38\x7d\xe5\xa6\x74\x3c\x67\x7f\x25\xf1"
- "\xdb\x9d\xaf\x79\x76\x3b\x35\xcb\x6e\x87\xc1\x43\xcc\x3f\x8a\x6e"
- "\xeb\x69\x6a\x40\x84\xbd\xe1\x4d\x04\x1e\x4b\x6f\x09\x1c\xe5\xf7"
- "\x98\x57\x6c\x43\x3f\x33\x4f\x95\xe0\xba\x85\x98\x7f\x5a\x8a\x9f"
- "\xe7\xbc\x1f\x31\x0f\x4d\x2d\x0e\xac\x18\x4d\xc5\x49\x78\x76\x15"
- "\x84\x2d\xf4\x78\xb1\xb9\x3c\xe2\xd9\x3d\xb9\xa5\x98\xfb\xe5\x08"
- "\xca\x70\xb9\x22\xb2\x26\xc1\xb6\x4e\x12\x61\xab\xd3\x6f\x1e\xe8"
- "\x70\x89\x96\x40\x2e\xf2\x16\x13\xb7\x87\xf9\x88\xf3\x4f\xe9\x10"
- "\xbe\x88\x65\x77\x88\xdb\x26\x06\x95\x53\x73\xc7\xad\xc4\xf3\x9b"
- "\xe6\x8e\x2d\xcc\xa7\x1a\xe8\x72\x10\x3c\xda\x3d\xa5\xa3\xbc\xdf"
- "\xe3\x67\x29\x09\x69\x91\x66\xc7\x36\xbc\x6f\x44\xbe\x26\xc9\xb7"
- "\x53\xcf\x86\xad\x61\xcb\xee\xec\xb0\x67\x77\xeb\xd4\xb3\xdd\xa2"
- "\xd9\xb1\x9e\x1e\xeb\x28\x07\xad\xb6\xd1\x94\x93\xe1\xe4\x96\xe2"
- "\x42\xe4\x09\x22\x7d\x8b\xe4\xff\x29\x27\x3b\xc5\xd4\xe7\xc4\xe9"
- "\xa9\x67\xff\x29\xa6\x38\xc4\x47\x05\x4e\x1a\x74\xc9\x0a\xa1\xb1"
- "\x5c\x34\xb5\x6d\xa3\x4b\x8e\xfa\x88\x65\x22\x77\x96\x26\xa6\x9c"
- "\x3c\x2d\x1e\x7f\x8e\x69\x33\x8e\x9a\x1d\x90\x1f\xe7\x7a\xa6\x77"
- "\x7e\xb3\x63\x2f\xea\x9f\x08\xb8\x2e\xe1\x75\x6e\x42\xde\x06\xeb"
- "\x63\x27\xd3\xa9\xa9\x6d\x3d\x85\x53\x76\x67\x47\x2a\x76\x4f\xd6"
- "\x52\x76\x3b\xb4\x8a\xdd\x4e\xf4\xd3\xc1\x70\xc5\xee\xd6\x48\xca"
- "\x6e\xf0\x40\xfd\x64\xf4\x53\x0a\xf7\x79\x17\xe6\xfb\x78\xbe\xa7"
- "\x8b\xfb\xdf\x53\x9f\x2f\x2c\xf5\x4e\xe8\x42\xa1\x78\xbf\x3e\x9f"
- "\xe7\xec\x22\xa5\xde\xd9\x9d\x52\xef\x40\x3e\xa7\x92\xaf\x7a\x0f"
- "\xf3\xa5\x1c\x8b\x56\xd7\xbf\x80\xb1\x23\x19\xef\xab\xf1\xdb\x8a"
- "\x5f\xbd\x58\xbd\x07\xba\x8b\x06\x4b\x9e\xf2\xec\xb1\x88\x3b\xaa"
- "\x60\xa3\x62\x8e\x9e\xb2\x27\x73\x5a\xe4\x4e\x01\x1a\x42\x4e\xf6"
- "\x58\xb4\x8a\x3d\xd0\xe7\x7b\x26\x87\x24\xef\xef\xf9\x21\xc3\xee"
- "\x5e\x96\xc9\x73\x79\x33\xde\xe7\x23\xed\x8f\x21\xe6\x55\xcb\x9e"
- "\x83\x9a\xe5\x83\x4c\xc0\x6a\xbd\xef\x79\xe1\x8f\x78\xf6\x84\x34"
- "\xcf\x9e\xf6\x70\x7f\xd8\xbe\xce\xbd\xc4\xfa\x29\xfc\xa1\x00\x0d"
- "\x7e\x0f\x7a\x6c\x91\xfd\xef\x75\x42\x06\x96\x0c\x2b\x6f\xee\x00"
- "\x2f\x14\xbf\x23\x75\x53\x4b\xe0\x88\xa4\x29\xf0\x38\xc8\x3c\xc5"
- "\xfd\xfb\x78\x31\x95\xa3\xae\x56\xe0\xd2\x1e\xa9\x00\xdc\x14\xd4"
- "\x93\xba\xf7\xa9\x90\x94\xd7\xbd\xe0\xd7\xbd\x28\xf3\x7b\x52\x3c"
- "\xbe\xd7\xd1\x97\x8e\x64\x5d\xc5\xfa\x69\x5a\x38\xc4\x3c\xf3\x2f"
- "\xd6\x6b\x4a\x4f\x51\x81\xa1\xa7\x58\x47\xf1\x7c\x82\xf5\x94\xa6"
- "\xeb\x29\x4d\xd7\x53\xf2\xd9\xb2\x8b\x61\x85\x58\x1f\x4d\x73\x2a"
- "\x3d\x33\x2d\x92\x25\xc0\x1b\x69\x80\x11\x52\x7d\x81\x3c\xab\x77"
- "\xf5\x93\xf9\x25\x9d\x76\x65\x6a\xd0\x37\xf8\x65\x6b\x4a\xdf\x38"
- "\x75\x7d\x63\x32\xf4\x4d\x04\xe3\x1a\x64\x4a\x4b\xa4\x6f\x34\x5d"
- "\xdf\x44\x84\xd2\x37\x9a\xae\x6f\x38\x3d\xa2\xeb\x9b\x48\x02\x7d"
- "\xa3\x79\x76\x71\x7b\x93\x75\x3d\x53\xce\x7a\x86\xdb\xab\x55\xec"
- "\x6a\xd7\x94\x9e\xb1\x60\x2e\x61\x62\x3d\x13\x41\x19\xcd\xd0\x33"
- "\x41\xa9\x0f\x32\x59\xd7\x74\xff\x8c\xa0\x3f\xed\xc4\x3a\x46\xea"
- "\x93\xf0\x88\x30\xeb\x13\xd0\xef\xce\x78\x7d\x02\x78\xd9\xb8\x4f"
- "\xd7\xf5\x94\xc3\xba\x42\x84\xa1\x4f\x26\x4f\x73\x06\xd0\xd7\xff"
- "\xc0\x9c\x1a\x7a\xdb\x59\x52\xee\x75\x86\x09\x7a\xc0\x29\x5a\xca"
- "\x09\x3a\x07\xfc\x1b\x81\xae\x20\x82\x5c\x1e\x84\x7c\x86\x50\x77"
- "\x6b\x4b\xf1\x5f\x08\xf2\x9e\x3d\xa5\xa3\xd3\xfb\x78\x20\x33\x7d"
- "\xca\x49\xe1\x07\x7d\x7c\x8f\x17\x97\x43\xbf\x64\xfa\x9b\x3b\xf6"
- "\x51\x6e\x9b\xd0\x72\x67\xfa\xec\xc0\xa3\x75\xca\xdc\x06\xeb\xe3"
- "\xcf\xa5\x43\xce\x44\x03\xf4\xe2\xa7\x53\x4e\xa6\x5b\x67\xb4\xd1"
- "\xb7\x73\x67\x09\x0d\xf2\x04\xba\x43\xce\x20\x8f\xc0\xdd\x01\x99"
- "\x73\x42\xce\x0e\x86\xe3\xe4\x0c\x32\x73\x0f\xee\xed\x8a\x7e\xf5"
- "\x4e\xc8\x59\xbe\x26\xc7\xb3\x36\x39\x87\x83\xac\x39\x79\x8d\x0b"
- "\xb2\x96\xaf\x55\x28\x59\xd3\x54\x39\x8f\xc6\xf4\x33\xe9\xb2\x86"
- "\xbe\xc0\xfb\x6a\xfc\xb6\xe2\x97\x58\xd6\x8a\xa3\x64\xed\x39\x5d"
- "\xd6\x52\x94\xac\xa1\x4f\x93\x23\xcb\x94\xbc\x31\x7c\x9e\xe7\xf5"
- "\xc8\x5b\xea\x9e\x83\x82\xed\x49\xc9\x3b\x2c\x73\x7b\x30\xae\xec"
- "\x09\x41\xde\xda\x35\xcf\x07\x80\x27\xfc\xac\x37\xc1\x9b\xff\xc5"
- "\x63\xdd\xd4\x62\xf1\x5f\x05\x91\x61\xe5\xa8\x2b\x04\x5d\xf6\x4f"
- "\xe8\xd1\xff\x7a\x3c\x40\x75\x80\x75\x10\xf5\xb5\x42\x9e\xda\xb5"
- "\x0a\x29\x4f\x8e\xc8\x32\x86\xb9\xd7\xd1\x03\x43\x8e\x95\xb1\xf2"
- "\xd4\xd7\xfa\x62\xd0\x7d\xd5\x38\x1f\xed\x2e\x61\x7b\x05\xf7\x93"
- "\x7d\x54\x3f\x59\xbf\x87\xfd\x53\x23\xd7\xa6\x59\x06\x8b\xcb\xe8"
- "\xb2\x13\x64\xb7\x80\xdf\x09\xf7\x69\xb8\x4f\x9b\x76\xfd\x47\xb0"
- "\x23\x22\xd9\xa8\x37\xc8\x72\x28\xdc\x63\x79\xce\x95\x03\x3e\xb4"
- "\x88\x60\x66\x1a\xec\xc9\xcd\xa2\xdb\xc6\x6b\x58\x56\x3c\x0f\x42"
- "\xfb\x47\xe2\x3a\x64\xd3\x39\xca\xc0\xcf\xb6\xc9\xad\x95\xb3\xed"
- "\x84\xfb\x2c\xb1\xd8\x96\xba\x6e\x11\x8d\xb2\x06\xc8\x52\xeb\xd6"
- "\xf2\xad\x2b\xd2\x79\x2d\x27\x83\xef\x85\xbb\xce\x51\x7b\x8e\xcc"
- "\x6c\x57\x6a\x29\xa8\xcf\x69\x15\x62\x41\x26\xd5\xce\x87\x7e\x70"
- "\x93\xad\xd6\x2d\xb6\x47\x82\x4c\x83\x9d\xad\x06\x2e\x8c\x1b\xf0"
- "\xbc\x12\x78\x0e\x7f\x70\x49\x0e\xfd\xde\x49\x09\xd7\x40\x83\x6e"
- "\x7b\x4f\xfb\xfb\x78\x3f\xc3\xa0\x49\x1f\xef\x4b\x0d\x3a\xf5\xb1"
- "\x5e\x66\xe6\x31\x3a\xb2\x48\xf8\x2b\x9f\x22\xa6\x85\xcd\x15\x16"
- "\xff\x07\x74\x2c\x2f\x8b\xd0\x95\xd3\x96\x5c\x25\xbc\x1d\xa2\xc1"
- "\xeb\x3c\x49\xb5\x78\x5f\x56\x2a\x34\x2d\xe5\x00\x64\xfe\x40\x69"
- "\xe7\x22\x11\xe6\xb5\x12\xd4\xe1\xf3\xd1\xed\xe5\xaa\x2f\x76\xab"
- "\x79\x9e\xe5\x40\x29\x60\x0d\x66\x58\xcd\x28\x1f\xa9\x38\xb0\x2a"
- "\xe8\x1e\x61\xf1\xd1\xef\x67\xc8\x7c\x96\xdd\xf9\xc5\x4b\xe9\x8a"
- "\x13\x34\x22\x47\xda\xfa\x9e\x03\xeb\x59\x1f\x20\x2d\x1d\x69\xb9"
- "\x80\x5f\x8d\xfc\xd9\x3e\xfa\x75\xb5\xb2\x63\x47\xe4\x1a\xf9\x70"
- "\x6f\xe7\xfb\x18\xfe\x49\x92\xdb\x2b\xe8\x2f\x7b\xef\x66\x0b\xa7"
- "\x99\xa3\x36\x5f\xd2\xf1\xcb\x49\xfc\xba\x57\x9f\xef\x6e\x85\xad"
- "\x45\xae\xe5\x34\x1c\xfd\xc3\xf8\x7d\xec\x72\x8a\xe3\xc2\x3d\x22"
- "\xff\xe7\x4b\x43\x98\x27\x8c\x68\xf2\x91\xa7\xa6\x2f\x7a\x0a\xb6"
- "\x75\xce\x89\xf6\xca\x45\x3d\xb4\xfc\x6c\xda\x12\x4d\xf0\x3d\xeb"
- "\xa3\x5a\xa4\x33\xdd\x82\xee\xab\x33\x0c\x9a\xf5\xdd\x2f\x07\xaa"
- "\xd4\xbc\xf0\xea\x12\xe1\x16\xd4\xf0\x6d\xde\x9f\xb8\x7a\xa1\xa2"
- "\x43\xbd\xa3\x13\x7a\x84\xd7\x5f\x6b\x41\xef\x05\x36\x11\x02\x4c"
- "\x87\x8f\x6e\xf0\xeb\xeb\x3c\x01\x6f\x78\x12\xeb\x96\x84\xe3\x16"
- "\xef\xff\xf4\xc2\xbf\x66\x7d\xcb\x70\xe8\x21\xa9\x9b\x0e\x1f\x29"
- "\x53\x78\x87\x18\x6e\x43\xd9\x19\x6a\xc3\xfb\x05\x01\xd1\x2e\x3c"
- "\x87\x0f\xf2\x3c\xa2\x61\x51\x17\xa7\xbd\x0a\xde\x16\x0d\xf3\x19"
- "\xa7\x6b\x5e\x6d\xf8\x76\x17\x1d\xc7\xbc\xaf\xb6\x67\x4d\xe6\x9a"
- "\x72\x5e\x83\x51\xeb\x48\xd7\x60\x3e\x34\xaa\xde\xc0\x8b\x6d\x0c"
- "\xd0\xd7\xc2\x36\x07\xdb\x1a\xbc\xa6\xbf\xa0\x54\x84\xd8\xe6\x40"
- "\xde\x51\x46\x1b\xb8\x7d\xaa\x5d\xd7\xe4\x44\xb7\x0b\x38\xf8\x31"
- "\x87\x96\x34\x58\xb0\x84\x2c\x76\x45\x6b\x0b\xb7\x97\xdb\xc2\x6d"
- "\x96\x6d\x91\x3a\x16\x63\x44\xf8\x56\xd4\x2f\xd3\x9d\x80\x85\xf9"
- "\xcf\x77\xa7\x2b\x9e\xba\x86\xe2\xf9\xa8\xa7\x1f\x2d\xbb\x33\x5d"
- "\x5f\xd1\xb7\x5d\x9a\x38\x76\x9c\x46\xf2\x7c\x37\x99\xaf\x1a\xdb"
- "\xd9\x21\xe6\xdf\x26\x27\x8f\xc9\xde\x52\xd6\xb7\x32\xef\xa5\xc8"
- "\xdb\x86\x3c\x29\x7a\xde\x14\xb5\x9f\x23\xaf\x03\xf8\x8a\x71\xec"
- "\x5a\x1f\x8d\xb4\xfb\xe5\x78\x7f\xb8\xca\x78\x16\x78\x06\x2e\xad"
- "\xa2\xa2\xc9\x99\x18\x97\x0f\x32\x79\x3c\x8b\x9c\x13\x1d\xa8\xe7"
- "\x5b\xcc\x53\xae\x25\x74\x39\xf8\xf2\xb3\xb2\xe5\x74\x29\xf3\x93"
- "\x48\x39\x50\xa3\xe8\x3e\xb2\x48\xb8\x61\x7b\x42\xa3\x16\x2f\xa2"
- "\x2b\x20\x47\xeb\x4f\xd0\xc8\x15\x05\xa5\x76\xe0\x4a\x54\x79\x8a"
- "\x48\xea\xa0\x94\x03\xd5\xde\xf0\xe7\x54\x7b\x8a\xd7\x5f\x46\xd6"
- "\x19\xbc\x88\xfb\x6d\x17\xd2\x17\xa0\xeb\x56\xb5\x7e\x70\xed\xe5"
- "\xbc\x7e\x7f\x8c\xae\x35\x73\x7b\xf1\x4b\x42\xdd\x67\xc5\x39\x31"
- "\x43\xa8\x31\xad\xda\x47\xd7\x66\xe1\xba\x55\xfe\xdc\x34\x53\x7f"
- "\xae\x46\xbe\x36\x71\x4e\xe3\x3c\x5b\xd1\xfe\xb0\x70\x27\xb1\x4c"
- "\xec\x0d\xba\xaf\xcd\xf4\xd1\x78\x5d\xde\x47\x06\x18\x56\x1f\x38"
- "\x54\xa3\x6f\x89\x79\x13\x78\xbc\x64\x2f\x4b\x62\x3c\x66\x4b\xb9"
- "\x00\xac\x5a\x93\xd2\xdb\x1a\x70\xdd\xec\xd6\x1c\xd0\xd1\x0e\x6d"
- "\x75\x8b\x4f\xde\xeb\xef\x84\x3e\x8e\x26\x86\x7f\xf8\x48\xc3\x30"
- "\xe6\xf1\x6b\x3b\x14\x9c\xc3\x07\x1b\x86\x9d\xe0\xe7\x93\xfc\x1c"
- "\xb0\x78\x7d\xde\xea\x1c\xd4\x7f\x82\xeb\xed\x50\xf3\xf9\x6b\x4f"
- "\x76\xa2\x0e\xb4\xa1\xc3\x47\xa3\x1b\xd5\x5e\x86\xd7\xd7\x87\xec"
- "\xa5\xb3\xec\xb0\xcc\x29\x99\xfe\xce\x3b\xcd\x75\x52\xfe\x3c\xe0"
- "\xf9\xad\xba\xde\xe0\xb5\x96\xb4\x63\xf4\x9d\x6d\xcd\x36\xc9\xdf"
- "\x26\x61\xba\x2e\xf7\x5d\xcd\x6f\xe2\xfd\x26\xa5\xbe\xbe\xb3\xed"
- "\xfc\xdf\x75\x68\xdf\x75\x55\xf8\xd5\xe8\xcf\x98\xff\x5f\xb7\x17"
- "\xf7\x69\xf8\xd5\x48\xda\x6d\x2c\x4c\xf2\xe1\x5d\x27\x6c\x76\x7e"
- "\xf6\xd1\x75\x1e\xb1\x71\xa4\x09\x76\x89\xbc\xaf\xbd\x9c\xd7\x09"
- "\xae\xdb\x81\xfe\x1a\xa7\xfa\xe2\x3b\x72\x4f\x11\xb8\x31\xdd\x85"
- "\xab\x5a\x84\x1a\xcb\x02\xc0\xfb\xba\xb6\xc6\xea\x00\xd9\xaf\xe3"
- "\xf6\x5f\xd7\xce\x6d\x0a\x80\xfe\x7c\x5d\x50\x2d\xfc\xfb\x6b\xc2"
- "\xc4\xfb\x5e\x41\xf7\x77\x20\x7f\x0e\x52\x6b\x0e\x87\xfd\x0c\x4f"
- "\xe7\x09\x61\xb4\x5f\xe9\x34\xaf\x8f\xfb\x12\xcf\xb7\xa2\xed\xd6"
- "\x53\xf4\x9d\x85\x22\xb5\xc5\xb7\xdf\x41\xb4\x09\x7a\x04\x63\x8d"
- "\x5c\x8b\x87\x5e\x62\x98\x18\xff\xaf\xad\x31\xf6\x69\xd6\xe2\xfd"
- "\x3a\xbc\xc3\xd8\xe3\x6f\x76\x84\x88\x61\x45\xb8\x7d\x28\xbf\x4f"
- "\xf3\x9b\x31\x56\xa3\xcf\xbd\xbe\xb2\x62\xe8\x99\x1e\xbd\xf5\x9d"
- "\xe1\xcb\x4f\x8a\x90\xd1\x3e\xde\x0b\x05\x5c\xf0\xff\x53\xb6\x3e"
- "\xf9\xbf\x07\xe7\xcc\x3f\xec\x1f\xa9\xfa\x4c\x03\x5d\x62\xfb\x2c"
- "\xf3\xa0\xea\xaf\xef\x84\x63\xfb\x2b\xf3\x20\x7e\x13\xf1\x9b\x81"
- "\x5f\x91\xfe\x1c\xfd\xcb\x8a\xba\x87\xb4\x66\xee\x08\xba\x33\x31"
- "\xfe\x8f\xac\x57\xfd\xc0\xe9\x68\x07\xf3\xc8\x97\x64\xe1\xf5\x3a"
- "\xde\x07\xe5\x74\xe6\x67\x4e\xd7\x60\xcf\xe0\x39\x0f\xef\xd3\x59"
- "\x56\x2b\x35\x8a\x79\xef\x5d\x05\x9e\x5b\xda\xc5\xf8\xbf\x29\xd7"
- "\x18\x57\x78\x3c\xcc\xa7\xc8\x33\xdd\x1a\xf6\x60\x7e\x90\xb9\xcd"
- "\xa0\x2b\xd2\xd6\xf3\x7b\xe6\x49\xa4\x37\x82\x2e\x72\x0d\x3d\x80"
- "\xf9\x5e\x62\x5b\x23\xb3\xbd\xc7\x26\xb3\xec\xb1\xb0\x3e\xea\xa0"
- "\xeb\x03\xd0\x59\xe8\xdb\x96\x56\x35\xd6\x5c\x7f\x96\x9f\xa1\x2b"
- "\x3f\xc3\xbd\xbf\x19\xad\xec\x5a\x7d\x80\xd7\x71\x06\x74\x99\x28"
- "\x27\xbc\x3a\x32\x23\x9c\xfa\x61\x9a\xb7\x7d\x07\xb5\x84\x7f\x43"
- "\xf6\xa7\x24\x8c\x2f\xbc\xe0\x01\xd7\x12\x11\x79\xaf\x6b\xab\xd9"
- "\x1b\x3e\xdd\x80\xb1\xf9\xaa\x13\x74\xbd\xa4\xc7\x8b\xc7\x30\xea"
- "\x3f\x2e\x61\xeb\xf4\x89\x64\xaf\x9b\x23\xc2\xeb\x8e\x8b\x00\xec"
- "\xbb\xd4\xb5\x5d\x34\x6a\xc3\x52\xca\xaa\xe9\xa2\x91\x9b\xbb\x28"
- "\x53\xfc\x2b\xd3\x54\x03\xbb\xed\xf1\xb3\xe9\x04\x9d\x90\x3f\xa8"
- "\x98\x2c\x9b\x97\x92\xe4\x91\x48\x05\xec\xb7\x30\xec\xb7\xd3\x99"
- "\xac\x1b\x7b\xec\xb7\x6e\x69\x17\x7f\xa2\xf3\xd1\x27\xe6\x81\x0e"
- "\x4a\x4a\x9b\x49\xe9\xc0\xcf\x75\x8a\xae\xbf\x3e\xad\x0d\xb6\x23"
- "\xda\xec\xd3\xdb\x8b\xeb\x38\xab\x83\x06\xc8\xb6\x42\x5f\x8b\x8a"
- "\x96\xd6\x3e\xc7\x61\x13\xf3\x54\x80\xe5\x06\x6d\xb8\xe1\x2e\xde"
- "\x8b\xdd\x31\x2c\x64\x5e\x50\x23\x42\x9c\x5e\x32\x42\x84\x90\x9e"
- "\xc9\x75\x6f\x47\x7a\xd0\x7d\x43\x9e\xcf\xf4\xeb\x3e\x7d\x3b\x30"
- "\x3f\xd2\xf5\xca\x0d\x87\x85\xa9\x1c\x3c\xba\x67\xf2\xf2\x30\x6c"
- "\xef\x53\x2c\xb3\x37\x1c\x9a\x56\x24\xc2\xf6\x79\xbc\x2f\x7e\x83"
- "\xdc\xb3\xe7\xbd\xba\x77\x61\xdb\x7c\xdd\x3e\x3d\x8f\x17\x3c\x57"
- "\xb0\x16\x01\xe6\xea\x3d\x93\x05\xe6\xe7\xb1\x36\x3c\x51\x5f\x76"
- "\x3c\xfb\x8a\xbc\x22\xfd\x52\xbe\x9b\xe6\xa3\xfb\x0a\x19\x77\xde"
- "\x93\x65\xdd\x09\x7b\xeb\xd2\xe3\xf4\xdd\xc9\x01\xd0\x01\xef\x31"
- "\xfe\x4f\xce\xd6\xf7\x55\xa5\xbf\x0b\xd2\x30\xfe\xdf\x5b\xca\x69"
- "\x25\x23\xc8\x56\x62\x17\xed\x7d\xd9\x4c\xd2\x07\xc5\x44\x98\x6f"
- "\x7e\xb7\xc4\x80\x83\x71\xea\x3f\x3b\x4d\x0f\x3e\x88\x34\x8f\x01"
- "\x07\x79\x2e\xc3\x73\x75\x4f\x1e\x55\x66\x6b\x54\x99\x07\x3b\x4d"
- "\x37\xfc\x27\xd2\xf6\xc6\x95\x69\x8a\x2b\x73\x34\xaa\x4c\xb9\x5e"
- "\x8f\x3f\xb6\xcc\x28\x8a\x2d\x33\x2a\xfd\x7c\xdc\x46\x8d\x8c\x2b"
- "\x33\x36\xae\xcc\xc4\xf3\x71\x1b\x95\x1f\x57\xc6\x11\x57\xc6\x19"
- "\x45\x4b\xf6\x07\xc9\x42\xda\x9a\xb8\x32\x35\x71\x65\xb6\x19\xcf"
- "\x7d\xf9\xfc\x2c\xd8\x44\x36\xf0\x66\x3b\xf7\xe7\x2b\xe8\x9f\xce"
- "\xd7\x9f\x0e\xea\x65\xdb\x13\xb4\x2b\x1c\x5b\xdf\xe8\xb4\xd8\xfa"
- "\x46\x0f\x3f\xbf\x5d\xa3\xb3\xe2\xca\xe4\xc4\x95\xc9\x8b\x2a\x53"
- "\xa7\xea\x19\x5d\x18\x57\xa6\x24\xae\xcc\xaa\xf3\xf9\x6a\x74\x75"
- "\x5c\x99\xad\x71\x65\xea\xbf\x86\x16\x3c\x8e\x2b\xdf\xac\xa1\x6c"
- "\x2b\xdf\x0d\x1b\xe1\xc6\x11\xec\x73\xc0\x7b\x93\x3f\xef\x0a\xf5"
- "\xe3\xfd\x10\x1e\xaf\xf6\x3b\x43\x18\x5b\x6e\x84\x7e\xb8\xa5\xdc"
- "\x18\xb3\xd8\x1f\x83\x65\x5a\xd9\xd8\xa3\xdb\xfb\xb2\x45\xb9\x1e"
- "\xc3\x57\x8b\xeb\xda\x3f\x9c\xc7\xa9\x1b\xa7\xf7\xd8\xc4\xca\x7f"
- "\x89\x14\x9c\x1b\x7f\x69\xec\x8d\xd6\x2a\x3f\x8f\x24\xb6\xc9\xf7"
- "\x3b\x65\x19\x4f\x94\x1d\xcd\xf5\x07\x76\x2c\x0d\x99\x63\xf1\xb8"
- "\xd1\x71\x01\x3c\xd2\x60\x1b\xd5\xb7\xc0\xb2\xe0\xfd\xeb\xe6\x1a"
- "\xd8\x40\xb0\xfb\x19\xb7\x63\x74\xa3\x5f\xda\x64\xf3\xba\x88\xef"
- "\xbd\xa5\xb7\xcb\xfd\x6d\x65\x93\x8e\xc9\x6c\x44\xfd\x6c\xbb\x37"
- "\x16\x9f\x61\xbf\x0f\x8c\xbf\x6c\xbb\x8d\x79\x70\x7f\xa9\x1f\x78"
- "\x8d\xe9\xf1\xff\xf0\xd1\x98\xe9\xd2\xd6\xf0\x1c\xde\xce\x7b\xef"
- "\xbc\x87\xb4\x3f\x90\xcd\x79\xc0\xff\x37\x8e\x32\xda\x8b\xb1\x1e"
- "\x32\x76\x63\xf8\x42\x34\x53\x7d\x38\xa6\x34\x96\x27\xfb\x81\x57"
- "\xc6\x54\xc5\xf6\xfb\x98\xba\xd8\x7e\x1f\xb3\x3d\x96\x27\x4d\xe0"
- "\xc9\x31\x8d\x71\x65\x8e\xc4\x95\x69\x8b\x2a\x53\xa5\xd7\x13\x8a"
- "\x2d\x93\x65\x89\x2d\x93\x65\x8b\x7a\x46\x1b\xb3\x32\x7b\xe6\x3e"
- "\xd2\xb7\x28\x2b\x3b\xea\xd9\xb4\x5e\xea\xcf\xac\x5c\x23\x8d\xd7"
- "\x8e\x36\xbf\xa6\x7c\x5b\x74\x78\x8e\x38\x79\xe7\xfc\xa5\x71\x38"
- "\xac\x89\xc3\xa1\x47\xfe\xf5\xfd\xf4\xdf\x1d\xa7\x9b\x4a\xf4\xfd"
- "\xf4\x0e\x8c\xd9\xd3\xf8\x19\xb0\xaa\x91\x1f\x74\xc8\x6a\x8a\x83"
- "\x77\x34\x0e\x5e\x47\xd4\x73\x3a\x9e\xc3\x51\x6d\x48\x4f\xb6\x49"
- "\x3f\x41\xd8\x6f\x37\x65\x18\xe9\x3c\xa7\x04\xbe\xed\x2e\x39\xd6"
- "\xe4\xb0\xcf\xd6\x90\x63\x74\x13\xfb\x34\xe9\xba\xfc\xa6\x68\xf9"
- "\x27\xd5\xae\x9b\xa6\xc7\xe2\x71\x53\x61\x2c\x1e\x37\x95\x44\xb5"
- "\x2b\x60\x5d\x41\x3f\xb6\x86\xef\x7f\x98\x6d\x1f\xf6\xb5\x93\xbe"
- "\x53\xcb\x61\xb3\x9d\xa5\x74\xf6\x59\x3b\x5e\x42\xc9\x5e\x67\x3b"
- "\xe6\x72\x9f\x24\x5c\x87\x91\xfc\x94\x7a\xb8\x41\xf7\xfb\xb3\x03"
- "\xfe\x11\x83\x1f\xb5\xd5\x87\x1b\xb4\x8a\xe6\x46\xa4\x41\xff\x8d"
- "\x99\xa9\xec\xdc\xe6\x74\xe1\xca\xaf\x06\x3d\x31\x2f\xba\xf9\x2f"
- "\xfa\x3c\xe2\x08\xfb\x5e\x41\xf7\xb4\x63\x8c\x4f\x53\x7b\xe5\x37"
- "\x0f\x8f\xe2\xeb\x80\x7d\xe9\x9d\xe2\x18\xdd\xfc\x19\xdb\x00\x2c"
- "\xa3\xec\xc3\xb5\x3f\xec\x27\x9e\x7b\x7b\xc3\x27\xa4\xed\x86\xf7"
- "\x3e\xbd\x6c\x7e\x54\x59\xbf\x3e\x37\x6e\xe7\x77\x63\xc2\x64\xde"
- "\x1f\xf0\x13\xe0\x64\x28\x7b\xef\xe6\xcf\xf6\x43\x5e\x51\x66\x8d"
- "\x51\x86\xe7\xd1\x5c\xc6\x5a\x42\xe6\x1b\x4b\xc9\xdc\xb0\xf4\x98"
- "\x84\x6d\xf8\x52\xc0\x96\xee\xf0\x96\xb6\x93\x37\xd0\xca\x6b\x5d"
- "\x66\xe5\x03\x73\xb3\x2f\x39\x44\x96\xce\x8a\xc3\x90\x91\x9b\x7d"
- "\x91\x8a\xc3\xf5\xc0\xed\x10\xee\xcd\xac\x6f\xa2\x69\x37\x69\x52"
- "\xde\xfd\xd3\xa6\x8c\xfe\xc9\xfd\xf7\x4e\x9f\x74\xbb\x7d\xfa\xdc"
- "\x67\x66\x17\x8e\x7e\x76\x61\x89\x7d\xf1\xfc\xb9\x25\x73\xe7\xfd"
- "\xd4\x9e\xe5\xbc\xd6\x69\x9f\x55\xa2\xae\x99\x45\xb3\x16\x94\x8c"
- "\xe7\xdb\x51\xf6\xe2\xf9\xb3\x17\xc9\xdb\xeb\x53\x29\x16\xc8\xdc"
- "\x92\xd9\xf3\xed\xd7\x16\x8e\xb2\xdf\x33\x6b\x6e\xd1\xc2\xf9\xb3"
- "\x13\xc2\xba\xdd\x3e\x7f\xf6\xfc\xd9\xb3\x0a\xed\xe3\xed\x59\x0c"
- "\x39\x1a\x5c\x54\x7f\x66\x19\xe3\x18\x8f\x5f\x95\x6e\x71\x48\x1f"
- "\xcf\x7c\x8a\x7f\x6e\xd9\x71\xfe\x58\x76\xcb\xc1\x58\x9e\xbb\xa5"
- "\x35\x96\xe7\x6e\x69\x3f\x7f\x2c\xbb\x25\x6e\xfc\x1b\x1b\x37\xfe"
- "\x8d\x1d\x7e\xfe\x58\x36\x36\x6e\xfc\x1b\x1b\x37\xfe\x8d\xed\x19"
- "\xff\xc0\x4b\xbe\x95\x52\x2f\x8c\x8d\x1b\xff\xc6\xc6\x8d\x7f\x63"
- "\x57\xc5\x3d\xaf\x8f\x7a\xbe\x14\xcf\x5b\xa2\xc7\x47\x3c\xef\x30"
- "\xe4\xb3\x57\xbf\x8c\x3d\x68\xe4\x61\x5d\x0f\xdd\xdc\xa6\xe7\xf5"
- "\x45\xe5\x6d\xd7\xf3\x06\x7a\xe4\x0f\x7c\xc4\xbe\x6e\x6a\xbe\x7e"
- "\xeb\xc3\xac\xd3\xd9\xcf\x8d\xc7\x26\xc8\xc7\x55\xa7\x68\xec\x61"
- "\x86\xc5\x3c\xcc\x7e\x8f\xe2\xf5\x47\x83\xb5\x43\xc8\xc2\x65\x6a"
- "\x5f\x26\xb3\x70\xdf\xdc\x81\x2b\x21\x2d\x0d\x3f\xe8\x94\x5b\x61"
- "\xff\xfe\x46\x9f\xa3\xdc\x5a\x27\x6d\x7e\x94\xd1\xe1\xcb\x79\x0d"
- "\xe0\xd8\x50\xc6\x52\xa9\xc6\xe2\x36\xdc\xa7\x31\x4f\xa3\xbc\x59"
- "\x98\x6e\xb9\x09\x57\x42\x5a\x3a\x7e\x19\x80\x57\x67\xc0\x5b\x35"
- "\x34\xb1\x6d\x19\x6f\xe7\xf6\xcc\x07\x4d\x64\xad\x74\x6b\xad\x5e"
- "\x8d\x6d\xeb\x5b\x8f\xa8\xb5\x85\x03\x76\xe1\xfe\x28\xbf\x16\xe9"
- "\x89\xe7\x49\xdf\x83\xfd\x77\xeb\x41\xb5\xde\xf2\x3d\xf4\xff\x7d"
- "\x01\xb5\x76\x7a\xc0\x0e\x7d\xdb\x75\x9c\xbe\xb7\x13\xd7\x6e\x5c"
- "\xdf\x30\xe0\x37\xc8\xf9\xf6\xf7\xc6\x0a\x77\xd2\x03\x0c\x37\x2e"
- "\x3d\x17\xfa\xad\xcb\x1a\x2e\xcf\x4f\xf0\xce\x21\xdc\xc9\xf7\x27"
- "\x48\x2f\x87\xcd\xd0\xe5\xa3\xef\xed\x60\x7c\xa3\xd2\xab\x85\x7b"
- "\xd0\x74\xce\xef\xe3\xfa\x50\xa6\x2f\x5b\xdb\xf0\x6b\x55\x7e\xe8"
- "\xdf\x6b\x8b\x6b\xc7\x57\xc7\xe9\xfb\xb3\x54\x3b\xbe\xbf\x2f\xae"
- "\xee\x70\xe2\x76\x7c\x3f\x03\xed\xf8\x2a\x71\x3b\xbe\x9f\x25\x69"
- "\x6b\x42\x5b\x4c\xe7\xbd\xcb\x45\x5b\xbe\x92\x74\x8f\x4d\x2f\xd4"
- "\x6d\x21\x9e\x93\xa5\xe3\x9d\x2c\xfb\x40\x69\x6f\xbf\xe9\xf9\xd6"
- "\x58\xab\x29\x2f\x41\x9d\x5b\x84\x7b\xc0\x03\x3e\xfa\xfe\x51\x09"
- "\xa7\x37\x7d\xaf\xc2\x05\x74\x32\x49\x3a\xb1\x3c\x58\xfb\xea\x6f"
- "\x63\x5e\xa2\xd6\x42\xb2\x21\xff\xdf\x6b\x30\xd6\x32\x17\x94\x0a"
- "\xbf\x41\x47\xbc\xcb\x8c\x7b\x17\x8a\x7a\x37\x31\xe6\xdd\xf2\x9e"
- "\xf4\x19\x46\xfa\x37\xeb\xa7\xec\x35\x71\xfd\x84\xfe\xb9\xed\xca"
- "\xd8\x76\x67\xd7\xa8\xf6\xa1\x8f\xce\xa3\x75\x76\x3d\xfa\xa8\x3b"
- "\x71\x1f\x65\x1f\x49\xcc\x6b\xd9\x72\x1d\x4d\x0c\xa1\x04\xf0\x6e"
- "\xe3\x39\x76\xb7\xe4\x41\xbd\x9f\xce\xef\x9f\xdb\x46\x19\xfd\xf3"
- "\xcd\xda\x78\x5b\x71\x5c\x1b\x23\x80\x71\x52\xb5\xf5\xf6\xf1\x71"
- "\xb0\x3d\x89\x79\xf1\xb6\x3a\xb4\x33\x92\xb8\x9d\xb7\xed\xed\x9b"
- "\x17\x6f\x6b\x45\x7b\x22\xe7\xf3\xe2\x6d\x7e\x55\x86\x12\x94\xb9"
- "\x3d\x4d\xb8\x13\xd5\x73\xfb\x48\x57\x98\xed\xdc\xdb\x67\xf0\xfa"
- "\x52\x54\xfa\xb8\x58\xfe\x43\x1b\xb8\x1c\xd3\x2f\xac\xf4\x2c\xf7"
- "\xc3\x71\x3b\x99\xbe\x8e\x27\x83\xee\xdb\x6b\xe2\x68\x75\xfa\x38"
- "\xfd\xe0\xca\x4e\x53\xd2\x16\x45\xaf\x1f\x7c\x16\x87\x53\x7d\x62"
- "\x7a\xdd\x7e\x08\xf4\x3a\x9d\x98\x5e\xb7\x77\xf4\x4d\xaf\x1f\x70"
- "\xff\x9f\x3e\x9f\x5e\x3f\xb0\x47\xd3\x0b\xb6\xae\x6c\xdf\x35\x36"
- "\xf0\x46\x77\x81\xa8\xe5\xb6\x46\x28\xdd\x0a\x5e\x51\x65\x3a\xb8"
- "\xcc\x74\x6b\x48\xf1\x09\x6c\x48\xcb\x29\xfa\xc1\x38\x43\xfe\x07"
- "\x55\xd3\x00\xd1\xfd\x28\xfb\x11\x25\x71\x39\xaf\xf3\x74\x83\x37"
- "\x9c\x45\x3c\xff\x88\xab\xb7\x3a\xb1\x2e\xf8\xc1\x76\xd0\xf4\xe5"
- "\x04\xe9\x07\x95\x7f\xd9\x38\x8a\xd5\x11\x3f\xf0\xc5\xf6\x11\xe8"
- "\x86\x72\xfa\xb6\xd3\xd7\xfe\x2e\xdc\x67\xe3\xf2\xce\xef\xb3\x71"
- "\x5f\xaa\xfe\x1a\x77\x38\x16\xbf\x71\x8e\xc4\xfd\x35\xae\xbc\xef"
- "\xfe\x1a\x57\xd3\x77\x7f\x8d\xab\xe7\xfe\x42\x7b\xfd\xb1\xe3\xc6"
- "\xb8\x43\xb1\xed\x45\xbd\x28\x27\x4c\xfd\x2f\xe5\xe7\x6f\xda\x6e"
- "\xe3\xc7\x3a\x8e\xfb\xaa\xb6\x8c\xc0\xcb\x49\x23\x18\xc7\x8b\x85"
- "\xd1\x27\x6c\xd0\xb0\x6a\x69\xe2\xfd\x56\x9e\xe3\xb6\x54\x13\xf1"
- "\x3e\xb2\xfd\xdb\x6c\xbb\x8f\xff\xbd\x66\xa2\x56\xdc\x9b\x8e\xd3"
- "\x9d\x2f\x69\x26\x53\x29\xef\x79\x4a\xbf\x70\xb9\x86\x30\xfe\x68"
- "\x74\x5f\xf0\xde\x27\xcf\x4d\xd7\xa9\xb9\xd3\x3f\x8f\xd3\x1d\xb3"
- "\x55\xbf\xdc\xf9\x5c\x2c\x1d\xef\xa0\xc4\xfd\x72\x87\x0d\xfd\xf2"
- "\xcf\xc4\xfd\x72\xc7\xd8\xbe\xfb\xe5\x8e\x3c\xf4\xcb\x3f\xcf\x97"
- "\xa3\x3b\x1c\xba\x1c\xad\xe4\x32\xf6\x79\x3c\x1f\xbf\xe3\x6f\x9c"
- "\x07\xf7\x90\x91\x3b\xf8\x48\x79\xd2\xe8\x0e\x43\x8e\x64\x99\x1a"
- "\xc0\x92\xf5\xeb\x79\xaa\x75\x18\xd1\x70\x1b\xac\x1d\x89\xe4\xe4"
- "\x0e\xd9\x4f\x37\x16\x13\xef\xc5\xe7\x6f\x62\x18\xf3\x89\x4e\xd1"
- "\x9d\xa3\x39\x1f\xa7\xdf\x18\x88\x96\x93\x3b\x7b\xf2\xb1\xae\xd3"
- "\xf3\x92\x08\x3a\x88\xf3\xc5\xc2\xbe\x53\x6f\xff\x00\x39\x8e\x70"
- "\x7e\xce\x17\x97\x27\x5f\xc9\xe3\x9d\x35\xb1\xf2\x78\x67\x71\x2c"
- "\x7f\xde\x21\xcb\x69\xd0\x73\x3e\x1a\xdf\x08\x1c\xbe\x31\x7f\x5d"
- "\x58\x36\xef\xec\x88\x93\x4d\xf0\x40\xce\x5a\xc5\x03\x39\xcf\xc4"
- "\xe2\x9a\x63\x4e\xcc\x03\x39\xc3\xfb\xe6\x81\x9c\xec\xbe\x79\x20"
- "\x67\x3a\xf3\x80\x8f\x72\xd6\xc4\xca\x66\x4e\x51\x6c\xdb\x51\xaf"
- "\x94\x4d\x1a\x7c\x31\xb2\x09\x5b\xe8\xd2\xbe\xe4\x90\x65\x8a\xfd"
- "\x47\x6a\xbb\x8c\xbd\x8e\x6f\x44\x33\x0b\xe4\x0a\xf8\xdd\x65\xe7"
- "\x35\x25\xe8\xf8\x6c\xa6\xe1\x66\x79\xf6\xf0\xae\xb1\xd1\x74\x5c"
- "\xa7\xce\xc7\xb9\x90\x77\x0f\xef\x2b\x2b\x7a\xde\xbd\x22\xb6\xfd"
- "\x77\x4d\x4f\x4c\xcf\xbb\x8a\x40\x4f\x57\x62\x7a\xde\xe5\xe9\x9b"
- "\x9e\x77\x6d\xe1\xb3\x47\xe7\xcb\xd4\x5d\x7b\xed\x8b\xa4\x8d\x22"
- "\xcb\x9c\xa2\xbb\x2f\xfb\x66\xe3\xd3\x5d\x81\xd8\xf1\xe9\xae\xa3"
- "\x17\x3f\x3e\xdd\x9d\x9d\x78\x7c\xba\x3b\x2f\xf1\xf8\x74\xb7\x43"
- "\xc9\xc3\xdd\x75\xb1\xf2\x70\x77\x79\x2c\x4f\x80\x76\xff\x6b\xe3"
- "\xd3\xdd\xfe\x38\x19\xa8\x3c\x4e\x13\x9e\x83\x4d\x51\xae\xfa\x6d"
- "\xe2\xad\xb1\x38\x4e\x48\x4b\xdc\x6f\x13\x46\xa2\xdf\x2a\x13\xf7"
- "\xdb\x84\x9c\xbe\xfb\x6d\x02\xef\x41\x57\x9e\xdf\x6f\x13\x4a\x2e"
- "\xde\xa6\x98\xb0\x35\xb6\xcf\x26\x54\x5d\x7c\x9f\x4d\xe8\x48\xdc"
- "\x67\x13\xcd\x89\xfb\x6c\xe2\x70\xd5\x67\x13\xa7\xc7\xf6\xd9\xc4"
- "\xb1\xb1\x7d\x06\xba\xfd\x0f\xfb\x0c\xfd\x33\x52\xf9\x27\x4c\xdc"
- "\x89\x79\xfb\x80\xa0\x7b\xe2\x36\x1f\x4d\x2a\x51\x73\xeb\x49\x6a"
- "\xec\x50\x7d\xf8\x1e\xf2\xd4\x9d\x3f\x0e\x4c\x3c\xa8\xa7\xfd\xe4"
- "\xfc\x7e\x98\xd8\x06\x1d\xdd\xd1\x58\x2a\xf7\xb6\x54\x1f\x32\xcd"
- "\x91\xaf\x61\x29\xef\x4f\x4d\xe2\xcd\xa2\x24\xf4\xb1\xf0\x86\xc2"
- "\xc4\x7a\x1d\xf9\x03\x0c\x87\xcf\x5c\xc6\xc2\x9a\x94\x75\x31\x63"
- "\xfc\x05\x7c\x6a\x46\x36\x94\xdd\x0c\x78\xf7\x4c\x52\xbc\x3a\x29"
- "\xde\xfe\xad\xc5\xbb\xcb\x15\x9f\xfe\xf0\xf3\x38\x1c\x76\x24\xe6"
- "\xd3\x49\x4d\x68\x43\x6d\x62\x3e\x9d\xd4\xde\x37\x9f\xde\x83\xfe"
- "\xa7\xda\xa8\xb9\xcf\x90\xc7\xc3\xbe\xb8\xb9\xcf\x3d\x99\xd6\x80"
- "\xe2\x1d\x69\x13\x55\x1c\x18\x19\x74\xdf\x13\x6f\xff\xa1\x6f\xee"
- "\x69\xd6\x71\xfe\x7d\x5c\xf9\x3e\xec\xbf\x7b\xd8\xfe\x7b\x2f\x31"
- "\xce\xf7\x5c\xc0\xfe\xbb\x87\xed\xbf\xf7\xce\x97\xad\x7b\x74\xfb"
- "\x2f\xd1\x1c\xef\x9e\x8e\xc4\xfd\xff\xc3\xb8\xfe\xa7\xfc\x12\xcc"
- "\x87\x65\xf9\xd8\x7c\xa3\xa2\xf3\xb1\x6f\x12\xe7\x65\x1e\x49\x90"
- "\x37\x3f\x1e\x66\x1f\xf9\xca\xcf\xe3\x3d\xf6\xa5\x4a\xc8\x7b\x3f"
- "\xdc\xa6\xe4\x71\xb2\x39\x56\x1e\x7f\xd8\x18\x2b\x8f\xf7\x38\xe2"
- "\xca\xb5\xc5\xbe\x07\xff\xfc\xaf\xe9\xd8\xc9\xd3\xe3\x78\xe0\xa3"
- "\xe3\x34\xf9\xb0\xe2\x81\x7b\xaf\x8f\xc5\x63\x72\x51\x62\x1e\x98"
- "\xbc\x0a\xed\xff\x28\x31\x0f\x4c\xae\xeb\x9b\x07\x26\xef\x05\x2d"
- "\x3f\x8a\xe6\xdb\x07\x4a\x73\x06\xc4\xe5\xf1\x25\xd6\x79\x93\x43"
- "\x89\xd7\x08\xee\x4d\x57\x34\xbe\x77\x72\x2c\x8d\xef\xcd\x8c\xa5"
- "\x21\xda\xf2\x3f\xa7\x61\x4f\xec\x83\xa0\xfb\xde\x78\xf9\xf7\x1e"
- "\xa7\x1f\xe9\xf2\x7f\xdf\xe0\x38\x1c\x77\x28\x5c\x12\xad\x8b\xdc"
- "\xcb\xf3\x5f\x6f\x62\x5a\xde\xdb\x91\xb8\xcd\x3f\x32\x63\x0c\xf2"
- "\x6a\xe7\xc9\xd2\x8f\x86\x23\xfd\x01\x5e\x0f\xe5\xf5\x90\xcd\x48"
- "\x7f\x20\x4c\x16\x39\x5e\xf5\x8c\x4b\x3f\xca\x61\x5f\x14\xa6\x3f"
- "\xf3\xaf\x75\x38\xe5\xf1\x18\xc4\x78\x15\x94\x4a\xbf\x05\xeb\x2a"
- "\xe6\xf5\xab\x99\xd7\x7f\x24\xed\x3f\xde\x67\x61\x3f\x42\xab\x93"
- "\xf2\xbc\x81\x30\x19\xfc\xce\xf9\xe3\x60\xd7\xb0\x5c\x70\x7e\x23"
- "\xaf\x5a\x37\x2b\x8f\xd3\x4d\x3f\x6a\x4c\xdc\xc7\x3f\x3a\xda\x37"
- "\xef\xfc\x28\xa4\xfa\xf9\xbe\x51\xb1\xfd\x7c\x5f\xba\xe6\x1e\x34"
- "\x9d\xdb\x0a\x1e\xb8\x28\x39\x29\xb1\x0b\x7f\x9f\xfa\x7e\xe5\xa3"
- "\xec\x1b\xfc\xed\x13\x74\xdf\x7a\x59\x9f\x49\x84\xac\x2b\x92\xa8"
- "\x51\xea\x80\xfb\xbe\x90\x78\x22\x4f\x41\x98\x4c\x62\xe5\xd3\xad"
- "\xfc\xae\xd6\x2d\x42\xc8\x77\x88\xf7\x04\xf8\xcc\x32\x78\xe1\xd2"
- "\x63\x74\xdf\x3b\x31\xe5\xa1\x09\xbc\x0a\x46\x7b\xad\x94\xc7\xfb"
- "\xda\x8c\x35\xdd\x55\x78\x4e\xbc\xee\x9b\x6b\x31\x7c\x1f\x94\xcf"
- "\xd8\x7d\x7d\xee\x5f\x32\x4e\x7c\x56\x86\x71\xba\xb0\x1e\xc8\x9d"
- "\x61\xf0\xaf\xf2\xb5\xcc\x2d\xea\xf5\xe5\xcb\x75\xfa\x28\xd7\x7e"
- "\x81\xb5\xc1\x28\x39\xc8\xdd\x12\x0d\x47\xc5\xff\xc8\xad\x37\xfc"
- "\xf1\x70\xdf\xf8\x35\xb0\x0c\x7c\x3a\xe2\xf0\x81\x1d\x71\xf7\x11"
- "\x05\x63\x8a\xe5\x42\x30\xb8\xcf\x15\xcf\x32\x3f\x4c\xb1\x5f\x68"
- "\xcd\x2f\xd9\x46\x79\xaf\x9c\xc7\x5b\x53\xa4\xbd\xc4\x30\x2e\x8c"
- "\xe3\x94\xaa\x98\xb9\x85\xdc\xbb\xe7\xbd\xad\xa9\x8f\x29\xb9\x9f"
- "\x1a\xb7\x46\x38\x65\x9b\xf4\xa7\xd2\xe5\xfe\xf1\x70\xbc\x1c\x4c"
- "\x69\x32\xc6\xe8\xb8\xf4\x36\x43\xee\x31\xaf\x65\xb8\x71\xeb\xac"
- "\x53\xcd\x4a\x16\xa6\xce\xd0\x52\xa2\xe7\x6b\x53\xa5\xfd\x67\xac"
- "\x97\xe2\xbd\x39\xae\x5c\xdc\xfa\xdf\x94\x6d\xa2\xef\x75\xfa\x34"
- "\xf4\x6f\x80\xf7\xb6\x54\x0c\x84\xa9\x6b\xe2\xd6\x2b\xfc\xeb\xe4"
- "\xf9\xf6\xbf\x03\xee\x34\x5d\xef\xe5\xc5\xd9\x78\x53\xb7\xb9\x4e"
- "\x5e\xa8\xfd\x53\xfb\x68\xff\xd4\xde\xf6\xcf\x63\xb8\xd3\xe2\xd6"
- "\x12\xa7\xc9\xf6\x47\xce\xd3\x7f\xd3\x86\x43\x7f\x19\x74\x83\xcd"
- "\x3d\x6d\xa1\x61\xab\xf3\xfa\x41\xdf\xb6\xfa\xb4\xde\xf5\x3f\x55"
- "\xae\x77\xfd\xcf\x9f\xc8\x56\xf7\x91\xdc\x5b\x8d\xad\xbb\xda\x5a"
- "\x93\xa8\x2d\xd3\xfa\x58\xff\x9b\xa6\xaf\xff\xe5\xd9\x63\xf5\xd9"
- "\x34\x5f\x6c\x1f\x4e\x8b\xeb\xc3\x3c\x8a\xed\xc3\xa9\xdb\xfe\xbb"
- "\xe3\x1a\x03\x4a\x4e\x4e\x36\x25\x27\x99\x92\x92\xf1\x1a\x4d\xa4"
- "\x01\xc9\xe6\xe4\x7e\xf8\xf5\xd7\xaf\x03\x4c\xc9\x26\x33\x7e\xfd"
- "\xf4\x6b\xff\xb8\xe7\x01\x5c\x16\x3f\xb3\x7e\xed\x17\xf7\xdc\xff"
- "\x6b\xde\x0f\xd0\xeb\x35\xea\x37\xc7\x3d\xf7\xfb\x9a\xf7\xfd\xff"
- "\x87\xe5\xe9\xbc\xe7\x58\x3f\xb4\x7b\xe7\x2d\x9a\x55\x34\xb7\x50"
- "\xee\x17\xcf\xb6\xcf\x7a\xf2\xc9\xd9\x0b\x16\xd8\x4b\x9e\xb5\xdf"
- "\x7d\xd7\xfd\x37\xdf\x6e\x57\xdb\xce\x45\xe3\xaf\x2d\x4c\xa5\x29"
- "\x8b\xe7\xf3\x8b\x29\x0f\xdc\x9b\x6f\xcf\xbb\xfb\xae\xd8\x97\x06"
- "\x18\xb9\xbd\x7c\x21\x28\x51\xf2\x97\x53\x31\x94\x68\xcd\x6b\x52"
- "\xf7\xb4\xb1\x9f\xaf\x5a\xf3\x78\x68\x45\x13\xfb\x8f\x76\xb9\x44"
- "\xc3\xd5\xbc\xa7\x7f\xff\xb5\xdc\x88\xd1\x75\xe5\x54\xfc\x04\x9f"
- "\x5f\xb9\xff\x2e\xf1\xa1\x9f\xec\x3f\x22\xd3\x31\x7a\xf4\xa5\x46"
- "\x58\x45\xfc\xec\xf5\x85\xc9\xee\x22\x0b\xca\xdf\x84\x77\x49\xe2"
- "\x0e\x0d\x69\x01\xdd\x17\xfa\xc1\xbb\x64\xda\x87\xe5\x46\x3e\xeb"
- "\x71\xba\xff\x73\xf1\xa1\x90\xcf\x7c\x3e\x48\xe5\xbb\x7f\x8f\x30"
- "\xfd\xd8\xc9\xba\xa1\x66\x08\x99\x79\x2f\xf4\x8d\x21\x64\x79\x63"
- "\x28\xc7\x02\xb9\x7f\x9b\xb1\x17\x5a\x81\x67\x1f\x3d\x5a\xc5\x75"
- "\x73\x5e\xcd\xf4\xe3\xb7\x38\xff\xe6\xd8\xfc\x47\x7b\xf7\x62\xef"
- "\xdf\x66\x42\xbe\x69\x9f\x91\xd5\x1a\x11\x5f\x86\x52\x3f\xa4\x1b"
- "\x27\x53\x92\x17\x5d\xd1\x14\x2e\x27\xe5\xf3\xf3\xc0\xb5\x4b\x22"
- "\x22\xcc\xfe\xe9\x53\x3a\x5c\xa2\xf2\x19\x32\x43\xa6\x93\x1a\xe6"
- "\xb3\x8f\xc2\x03\x69\xb5\xb3\xc9\x8c\xf6\x0f\x3f\x41\xd3\xc7\xd9"
- "\xa7\x12\xb9\xa6\x90\xf9\x8f\x4e\xf6\x37\x3c\xb0\x79\xdd\x9f\xc9"
- "\xfc\xab\xae\x72\x53\x97\xb0\x51\x69\x89\x68\x17\x1c\x1f\x28\x20"
- "\x42\xec\xe3\xdf\x34\x33\xc2\x79\xd6\x05\x5d\x36\x6a\x29\x09\xd0"
- "\xf2\xa3\x22\xe4\xf9\xb3\x3a\x1b\xd0\xdc\x11\x60\xff\x45\xcb\xf2"
- "\x29\x94\x7c\x3c\x9f\x4c\xcd\x8e\x6a\xf2\xce\x08\x50\xe9\x51\xd1"
- "\xde\x34\xf3\x73\x6a\x71\x6c\xa7\x82\x56\x32\x35\xb5\xfd\x83\x64"
- "\x8c\x9b\xd5\x91\xbc\xb2\xb3\x64\x5b\x3e\x97\xd3\xce\xd2\xd2\xe5"
- "\x34\x70\xe9\x5f\xc8\xea\x6d\x6f\x45\x3d\x27\xe9\x91\x23\x94\x04"
- "\x78\xa6\x65\xff\x20\xdb\xb2\x87\xd9\xcf\x37\x87\x6a\xca\xc8\x26"
- "\x5c\x99\x69\x5d\xae\xcc\xf4\x2e\x91\x39\x24\xe8\xca\xcc\x68\x29"
- "\x46\xfe\xb6\x7d\x34\xa8\x95\x32\x3e\x3c\xd1\x6a\xaa\x3e\x43\xc3"
- "\xb9\x4d\xc7\xd1\xb6\x9a\x33\xc8\xbf\xfa\x53\xd2\x50\x36\xba\x4c"
- "\x38\xe5\x53\x9b\x37\x3f\x44\x1a\x60\x55\x77\xd1\xf0\x9a\x2e\xb2"
- "\x69\x15\x9f\x12\x97\xeb\xa0\x07\x6f\xf3\x36\x11\x95\x2e\x17\x91"
- "\xee\xd5\x07\x78\xbd\x6c\xc0\x7b\x4f\xd4\x9b\xbd\x4d\x1d\xd4\x1c"
- "\xe8\xa2\x16\xfa\x3b\x79\x9d\xff\x6a\xf8\xd5\x13\xf5\xfd\x34\x08"
- "\x41\xc3\xd2\x36\xd4\xa5\x78\xc7\xd5\xcc\x67\x95\xcb\xa9\xb2\x8c"
- "\xd2\x8a\x97\xd2\x80\x13\x48\x57\x73\xfb\x3d\x16\x6f\xf8\x5f\x0d"
- "\x4b\xa5\x3f\xee\xa3\x55\x65\xcd\x94\xdc\x12\xa8\x66\xbf\x4f\x53"
- "\x24\x35\x02\xdb\xef\x10\x79\x8b\xff\xd9\xa0\x59\x22\xd9\x6b\x34"
- "\xb2\xbc\x73\xee\x90\xc9\x6b\x3e\x47\xde\xfc\x00\x7d\x84\xba\xc5"
- "\xea\xc8\x0c\xe8\xad\x9c\x96\x40\x88\xcf\x3b\x65\x89\x4e\x5b\x6a"
- "\xe5\x7c\x1a\xb5\xf9\x0c\x8d\xdc\x74\x86\x32\x45\x30\xd3\xc4\x3e"
- "\xb6\x7c\x36\x75\x13\xae\x69\x6d\x64\x41\xdb\x95\x1f\x6d\x8a\xee"
- "\x6b\xdb\x9d\x49\xb5\x5d\xbd\xbe\xb6\x5d\x9d\xbd\xbe\xb6\xe0\xa9"
- "\xed\xec\x6f\xeb\xa3\xe9\x13\xad\x4d\x34\x00\x72\xe2\x60\xfe\xae"
- "\x3c\x45\xe6\x95\xa7\x88\x6e\x2c\x37\x91\x7d\x0e\x9f\xb3\x78\xe8"
- "\x5a\x2f\xfa\x86\xef\x8f\xd1\x83\x47\x71\x4d\xc3\x2f\x09\x32\x71"
- "\x98\xdb\xd9\xa6\xf3\x31\xd2\x4c\x48\xfb\x3d\xae\xc9\xb8\xee\x73"
- "\xd5\x08\x3f\xea\xca\xef\x34\x51\x2a\xf3\xb3\xee\xdf\x9b\x1f\x74"
- "\x3f\xb8\xc3\x47\x4f\x8f\x34\xf8\x5a\xe9\xf8\xfb\xb7\x7f\x74\xec"
- "\x24\xc7\xa1\xf2\x4b\xbc\xba\x1d\x49\x1c\x93\x4a\x4f\x67\x1c\xae"
- "\xe4\x7a\x8f\xd1\x43\x5c\x8f\x15\x3f\xc8\xe9\x83\xeb\x8d\xb2\x9d"
- "\xdd\x0e\xd4\xf9\xd0\x65\x48\x17\x46\x3a\xda\x6d\xe6\x77\xef\x1f"
- "\x3b\x69\x52\x79\x32\x4d\x80\x19\xd2\xe1\x43\xf6\xef\x9f\xce\x32"
- "\xde\x69\xb2\x8a\xfd\x33\xc7\x52\xcd\x6b\xa2\x69\xd3\x6b\xa2\x51"
- "\xc9\xde\x43\xf9\x3e\x2a\x72\x30\x8e\x18\xc7\x1b\xd7\xe0\xdd\x7e"
- "\x8c\x42\x4c\x97\xc6\x42\xf6\x27\x7b\x08\xf6\xdf\x25\x31\x6d\x10"
- "\xee\xbc\x7c\x1e\x4b\xdf\x2d\x3b\xd8\x0f\x3a\x20\xbf\xa5\xad\x83"
- "\x7e\xd5\xd5\xde\xcf\xf5\x07\x32\x79\xc3\xc7\x68\x4c\x06\xd9\xd8"
- "\x1e\xac\x7d\x4d\xf8\x70\x6d\x67\xff\x4e\xf0\xcb\x95\x27\xe8\xa1"
- "\xdf\x7f\x37\x83\x32\xfe\xe4\x24\x5d\x3f\x3d\xf4\x8f\x28\xfd\x34"
- "\xbb\xd9\x57\x1f\xa5\x9b\x1e\xbd\xec\x7c\xdd\xf4\xc8\x60\xa5\x9b"
- "\x20\xfb\x52\x17\x45\x7c\x2a\xfd\xe1\x48\x5c\xba\xee\x27\xf2\xf0"
- "\x67\x71\xe9\x21\x3d\xbd\x39\x2e\xdd\xaf\xa7\x0f\x34\x74\x5f\x0b"
- "\xe3\xb1\x98\x75\x5f\xfe\x97\xac\xfb\x5a\x66\xea\xba\x4f\xea\x9f"
- "\xfc\xbf\x88\xb7\xa0\x8b\x16\xb1\xbe\xc9\x7f\x87\xf1\x17\x1f\x92"
- "\x81\x7b\x0a\xd2\x9e\xe1\xb4\xaa\xbf\x93\x19\x3f\x43\xef\x7d\xc4"
- "\x7a\x8f\x75\x1e\xeb\xbe\x8d\x43\x45\xeb\xc6\xd7\xc4\x91\x1a\x19"
- "\x5b\xe7\x27\x3d\xfa\xef\x45\xa4\xad\x41\xda\x8b\x78\xcf\x7a\x90"
- "\x69\xd2\x9c\x5f\xcf\x31\x31\xda\x60\x6b\xd5\x68\xa6\x2c\x5a\x87"
- "\xfe\xe6\xf3\x86\xab\x40\x5f\x6b\x12\x15\x7b\x4b\xf8\x0c\x6b\x84"
- "\x7d\xd2\xda\x5a\x4a\xda\x58\xee\x86\xae\x84\x9c\x79\x9d\x9f\x53"
- "\x59\x40\x9c\xe0\x73\x77\x8c\x43\xc1\x92\x1f\x71\x3c\xa2\xa4\x46"
- "\x07\x11\xfb\x85\xb3\xce\x06\x2e\xe6\x2a\xe0\xa4\x62\xa8\xe4\x17"
- "\xfa\xa8\x6e\x9b\xea\xeb\x47\xab\x38\xde\xd9\x31\xfa\xc9\x56\xcc"
- "\xf7\x42\xdc\x36\x6b\xa4\x9c\xf8\x1c\x0c\x64\x8c\xcf\x2f\x3a\x36"
- "\x9a\x34\x47\x95\x71\x16\x86\x63\xdf\x21\x8f\xb7\x35\x44\x8c\xb3"
- "\x8f\x7e\x12\x68\x2e\xad\xe7\xf2\xd5\x4c\x1b\xe1\x76\x19\x30\x92"
- "\x24\x0c\x93\x9c\x37\x3a\x7c\x94\xaf\xd6\xce\x53\x0f\x50\xf3\x0c"
- "\x3f\xb1\xde\xf7\xb6\x03\x46\xe9\x31\x05\x03\xb0\x04\xc6\x80\x98"
- "\x77\x3a\xfc\x81\xcb\xc5\x97\x80\x5f\xc8\xfd\xc5\xe7\x22\x79\xbf"
- "\x0d\x74\x49\x63\x5f\x79\x65\x8b\xfe\xe4\x64\xed\xdf\x89\xf4\xb3"
- "\x9d\xe0\xb7\x9f\x74\xf0\xb9\x25\x3e\xcf\x79\xa1\xb3\x9c\xa0\xd1"
- "\x48\xe3\x3c\xa7\xb6\xf8\x7f\xf7\x2c\x27\x60\xdb\x36\x9b\xc4\x76"
- "\xe0\xdf\xc1\xe7\x39\x81\x7f\x2e\xf3\xa1\xde\x26\xff\xab\x8f\x48"
- "\x9a\x8f\xe5\x34\xcc\x1d\x0f\x1a\xfd\xcf\xed\xe5\xb6\xe0\x9d\x4d"
- "\xd9\x88\xe2\x90\x8f\x1e\xf6\xf3\x7b\xa4\x99\x39\xff\x18\xe8\x31"
- "\x2f\xc6\xb0\xf7\x8e\x45\x4c\x95\x4b\xc9\xac\x74\xda\xa3\x29\x5c"
- "\x5e\xe9\xb4\x47\x1a\x7a\x75\xda\x23\x3b\x95\x4e\x53\x34\x56\x3a"
- "\xed\x91\x5f\x2a\x9d\xf6\xc8\x9b\x72\x5f\x0c\x3a\x8d\xdf\xb1\x5e"
- "\x33\x74\xda\xa6\xa1\xe2\x20\xeb\x8e\xa0\xfb\x91\x2a\x43\xb7\xad"
- "\x45\x1a\xeb\x0e\xc6\x51\xe9\xa9\xfc\x76\xf1\xff\x66\x92\xf2\x3b"
- "\xe0\x7b\x07\x9f\x5f\x68\xd7\xef\x79\x3c\x49\x52\x3a\xee\x91\xb6"
- "\x5e\x1d\xf7\x88\xa3\xb7\x2c\xeb\xb8\x47\xbe\x52\x3a\x4e\xa5\xd7"
- "\x3e\xc2\x3a\x2e\xbf\x9d\x69\xa0\xc3\x37\xf1\x1a\x9e\x9e\x1f\x74"
- "\x7c\xc8\x1f\xad\xe3\x62\xe5\xeb\xd1\x71\x86\x8e\x63\xdd\x86\xe7"
- "\x5c\x1f\xa5\xca\x79\x36\xcb\xd9\x7a\xd0\xdc\x90\x3b\xee\x03\x6e"
- "\x33\xc7\x35\x63\xba\x4d\x38\x49\x03\xf4\xb3\x43\x7a\xbb\x1f\xf5"
- "\x18\xbe\x8f\x3e\x7a\xa4\x2a\x91\x1d\xdd\x1b\x7b\x90\xae\xe2\xb3"
- "\xf3\xde\xf2\x63\xe4\xad\x16\xe5\x2d\xe1\xa3\x54\x50\x02\x5d\x91"
- "\xfc\xf4\x67\xdc\xb7\x98\x77\xfc\x80\xaf\xac\x7b\x30\x96\x36\x17"
- "\x04\xa8\x3f\xe6\xea\x9f\x55\x9a\xf0\xce\x19\xf3\x4e\xae\x31\xdc"
- "\x38\x9f\xe3\xd6\x3d\xba\xbd\xaf\xf9\xfe\xc5\xd5\x37\x63\x7c\xdf"
- "\xf5\xcd\x78\x58\xd6\x07\x9b\x0a\x73\xa0\xc1\xa7\x68\x86\x9c\x97"
- "\xc8\xf8\x36\x2b\x13\xc2\xaa\xd0\xdf\xf7\xeb\xe3\xfd\x2f\xbf\xa6"
- "\xfc\x1f\xbe\xa6\xfc\x17\xac\x8b\xd0\x3e\x6b\xc4\x1d\x0b\x67\x50"
- "\xd8\xc8\x77\x02\xf9\x1e\x1b\xac\xaf\xc5\x7c\xe6\x1a\x21\xe7\x68"
- "\x36\x03\x26\xf3\xdf\x3a\xe4\x93\x31\x43\xa0\x2b\x27\x2e\x21\x8e"
- "\xd7\x12\x5d\x76\x4a\x2f\x8d\x1f\xa3\x0b\xac\xfb\xa5\x79\xab\x49"
- "\xc6\xd0\xdc\x0f\x9b\x14\x63\x1c\xc7\xed\xd3\xd7\x3f\x1e\xdb\x02"
- "\xbd\x59\x17\xe5\x17\xdb\x01\x3d\x77\x15\xc7\x35\x60\xfb\xb2\x52"
- "\xcd\x37\xbf\x05\xfd\x3c\x84\xcf\xc3\xf0\xd9\x98\x82\x48\x9e\x69"
- "\xbf\x8c\x2f\xf6\x98\xcf\x28\xdb\xd7\x3a\x0b\xd7\xab\xd7\xc9\x3e"
- "\xa6\x81\xa0\xfb\xf1\x0c\xa3\x0c\xc3\x66\x3f\x45\x8c\xcb\x57\xc9"
- "\x33\xa5\xe1\x0e\xd6\x85\xdf\x82\x2d\x3a\x44\xd5\x33\x93\x54\x3d"
- "\x8f\x4f\xf6\xd1\x8c\xf4\x0b\x9d\xcd\xe8\xbb\x7d\x8f\xaf\xba\xf8"
- "\xf6\x91\xde\xbe\xc7\x1b\xbe\xa6\x7d\x17\xaa\x37\x7c\xf1\xf5\xa6"
- "\xeb\xf5\x16\x64\x5f\x3c\x5d\x0b\x8a\xbe\x39\x5d\xb3\x74\xba\x16"
- "\xd4\x7d\x0d\x5d\x13\xd5\x73\xe4\x9b\xd7\x63\xd7\xeb\x99\x69\x49"
- "\x54\x0f\xc9\xbf\x3e\xcf\x4d\x59\x8c\x18\x96\x1c\xcf\x55\xc5\x97"
- "\x9b\x99\x17\x1d\xab\x57\xc5\x79\x9d\x59\x68\xc4\xea\xd5\x63\xc9"
- "\x42\x57\xcf\x5c\x51\x50\xc7\xe3\xbb\xd0\x7c\x34\x73\x15\xc7\x47"
- "\x9d\xb8\x5c\x9d\xc9\xd6\xcb\x54\x5f\x28\x46\x30\xc7\xb4\x12\x22"
- "\x9f\xf6\x57\xcb\xfd\x76\xe8\xf5\x99\x87\xd9\xff\x5e\xed\x17\xce"
- "\x3c\xaa\xe4\x7e\x26\xe6\x88\x33\x33\xfb\x86\x71\xd8\xbf\xa5\x2c"
- "\xab\x5f\x5f\x3e\xf5\x41\xf7\xac\xe1\x3e\x9a\x97\x26\xfd\xe8\x53"
- "\xbd\x7e\xcc\x1f\xf4\xb8\x7a\x4f\xbe\x11\x15\x43\x10\x63\xe1\x13"
- "\x1f\xeb\xbe\xff\xa0\x41\x39\x68\x39\x6b\xba\x41\x03\x23\x1d\x69"
- "\x0e\x83\x06\xb0\x69\xd2\xbc\x75\x61\x3e\x9b\x13\x50\xe7\xb0\x67"
- "\xad\x15\x15\x87\x7d\x0a\xf6\xac\x56\x65\xb7\xa0\xbe\xee\x7c\xb3"
- "\x9c\x2b\x95\xf1\x5c\xe9\x89\x62\x7f\xca\x61\x9f\x81\x87\x58\x60"
- "\x33\xf1\x79\xef\x31\x61\x15\xa7\x8b\x6d\x02\x3e\x1b\x27\xdf\x2f"
- "\xc8\x34\x61\x6e\x09\x9a\xcc\xfa\x52\x74\x72\xbc\x18\x09\x3b\x0d"
- "\x78\x57\x33\x5c\x1f\xae\xfe\x65\x99\x1c\xeb\x42\x6f\xcf\xac\xbf"
- "\x69\xab\xbd\x7e\x2d\x68\x33\x19\xf8\x6e\x96\xe7\x58\x9f\x40\xfb"
- "\x0b\xa4\xdd\xa6\xf0\xb1\x99\xd8\x87\x5f\x4b\x3d\xec\x17\xcb\x6c"
- "\xb4\x63\x7e\xbb\x9c\x07\x71\x9d\x63\x38\x1e\x1c\xcf\x8d\x60\x8f"
- "\xa0\xdc\xf4\x1e\xba\x01\xae\x08\x1a\x74\x7b\x82\xd4\x58\xac\xda"
- "\x18\x58\x66\x33\xed\xf7\xcb\x33\x76\x34\xd2\xee\xfa\x4a\xc5\x7a"
- "\x7e\xa2\xca\xa0\x5d\x0f\x4e\xc0\x87\xf3\x28\x9f\xa6\x27\xb6\x1b"
- "\x38\x49\x79\x4d\xe5\x33\xbb\xb3\xb6\xf0\x59\x21\x45\xff\xfd\x69"
- "\xc8\x73\xe4\x7c\xfa\x3f\xd1\x1e\x45\xff\x64\xe6\x37\xa6\x3f\xaf"
- "\x6f\x80\x2e\x83\x41\x4b\x8b\x3a\xe3\xc0\x36\xcc\x93\x7c\x96\x3e"
- "\x8d\xf1\xd4\x2a\x0c\x9a\xe7\x9b\xd5\xda\xd8\x93\xb9\x51\xfd\x80"
- "\xf6\xda\xd8\x3e\x4b\x32\xda\xcf\x65\x98\x06\x1c\xdf\x91\xeb\x06"
- "\x3e\x97\x04\xdd\x4f\x16\xc6\xb7\x69\xa5\x3a\x3f\x42\xca\x9f\xe4"
- "\xc9\x55\x3d\xf2\x31\x54\xf8\x4b\xec\x22\xa4\xce\x22\x3f\x39\x6a"
- "\x47\x99\xdf\xdc\x97\xdc\x33\x0f\xca\x58\x91\x26\xb9\x96\x00\x3b"
- "\x6b\xf6\x12\x01\xdc\x54\xdf\xcf\xfe\xb1\x4a\x2b\xdc\x84\x2b\x78"
- "\xec\xc9\xb3\x02\x75\xfb\x5d\x32\xae\x0a\xda\x36\x7b\x3d\xf3\x9c"
- "\xc1\x67\xbc\xf6\xa8\xfc\xc4\x0b\x1f\x66\x3d\x62\xd0\x1c\xf8\xa7"
- "\x06\xdd\x85\x23\x0d\xfc\x8d\xfc\xdc\x77\x9c\x87\xf7\x69\x1a\xed"
- "\x21\xa9\x5f\xd5\x39\xa1\xc2\x3c\x43\x6e\xb9\x0e\xee\x67\xd6\x2f"
- "\x4c\x0f\x45\x8b\xc2\xe2\x58\x58\x36\x93\x8a\x4f\xc9\x3c\x0f\x79"
- "\x5c\x1a\xea\x87\x3c\xeb\x7b\x61\x14\xa6\xab\x77\x3d\x78\xb2\x6f"
- "\xbf\xf4\xbf\x53\xfd\x51\x18\xe1\x76\xf5\xe2\xcb\xf2\x57\xd8\xd3"
- "\xff\xfc\x2e\xe0\xb2\x71\x3c\x5b\xa9\x57\x4a\x46\x30\xbe\x7e\x8e"
- "\x13\x2b\x79\x1d\xf0\x27\x32\xee\x9c\xc7\xe8\xb3\x5e\x5e\x9c\x3d"
- "\x3c\x1a\x8e\x70\xd9\x4c\x86\x7e\x52\xba\xc3\x8f\x79\x2a\xd9\xd5"
- "\x1e\xcb\xec\xc9\x51\x38\x37\x18\xf8\xf4\xea\x84\xd9\x8e\x78\x9e"
- "\xe4\xba\x39\xfe\x9e\x0e\x9b\x75\x49\xfa\x31\x9a\x3d\x5d\xe1\xf5"
- "\x64\x13\xf7\x63\x5f\x63\x9a\x11\xe7\xf3\x15\xa5\x43\xd0\xcf\x73"
- "\xfe\xf2\x8a\x3a\x3b\x14\x50\xb1\x1c\x67\xff\x4d\x98\xde\x64\x5a"
- "\xf1\x1a\xba\x5f\xc6\xe8\x90\xe7\xca\x67\xcb\x33\xe6\x83\x8a\xdf"
- "\x94\xf1\x63\x75\x7f\x40\x7f\x63\x71\x58\xc6\xef\x73\x95\xf0\x39"
- "\xdb\x30\xcf\xef\xa4\xbf\xdb\xfe\x92\x30\x3d\x10\x62\x99\x98\x93"
- "\xc9\xe7\xe7\x03\x52\x96\xe6\x8c\x35\xce\xcc\x73\x4c\x4b\x11\xcc"
- "\x27\xe8\xa1\x64\xb6\x8b\xec\x2e\x8e\x77\xf0\x53\x3e\x3f\x44\x7a"
- "\xff\xd2\x3a\x93\x38\xa4\xe4\x7f\xce\x72\x19\x47\x50\xee\x5d\x1d"
- "\x83\x4e\x48\xfe\xd7\x31\x9a\xf3\xaa\x5a\xeb\x31\x74\xd4\x4f\x07"
- "\xf2\xfe\x95\x4f\x87\x81\xba\x30\xfe\xcd\x32\x9f\xaf\x4b\xe6\x2c"
- "\x37\xe6\x2b\x7c\xe6\x4e\xed\x85\xf5\xc2\xf3\xd1\x9c\x52\xbe\xf6"
- "\xf6\xc1\xef\x18\x56\xc7\xf9\x7a\xe1\xa7\x64\xc8\x5e\xf1\xd5\x7c"
- "\x6e\x7b\x76\x23\xd7\xdf\xd7\x78\x21\x5c\x0f\x73\x3f\x59\x8e\xdb"
- "\x13\xf7\x4d\xe2\xbd\xb5\x9f\x16\x1a\x6d\x30\x68\xa2\xda\xf0\xd3"
- "\x7d\x9d\xa9\x07\x32\xa3\xda\xbe\x4f\xd2\xa2\xf7\xfd\xd9\x28\xda"
- "\xf0\x73\x40\x8d\x6b\x3f\xdd\x01\xfe\xd8\xa2\x78\x4d\xa5\x41\x76"
- "\xfe\x8f\x58\x96\x4f\x0a\xc7\xb9\x64\xc8\x3a\xf2\xc2\xfe\xfb\x72"
- "\xb8\xda\xe3\xfa\x29\xda\xff\x53\x3d\x6e\xc2\x4f\x3d\x8c\x4b\xc2"
- "\x76\xc6\xe0\xe8\x28\x62\xfb\x42\xc5\x51\x70\x3c\xc3\xf8\xda\xaf"
- "\xe3\x3e\x76\xdc\x26\x75\x38\xc7\x54\xe8\x76\xf4\x0b\x74\x67\x52"
- "\x67\xb7\x03\x7a\x21\xd3\x14\x74\x3b\xa0\xff\x4f\x87\x54\x9d\x8e"
- "\x99\x06\xae\x8c\x1b\xec\x66\x4b\x50\xcc\x4d\x4c\x5f\xae\x57\xc6"
- "\x79\x72\x0c\xc0\xcf\x82\x5f\xff\x6f\x12\x87\x09\x76\x79\xbb\xbf"
- "\xa2\x69\xbb\xb6\x48\x1c\xe4\x78\x62\x98\x7b\xb4\x57\x82\x77\x07"
- "\xad\x68\x80\x2d\xfe\x98\xa9\x60\x09\xe5\x60\x8e\x4c\xe2\x9c\xc8"
- "\xde\xac\xe1\xba\x48\x8c\xe5\x78\xdd\x78\xce\xd2\x9f\x47\xf1\x73"
- "\xe7\x22\x31\x23\xe8\x9e\x9b\x6e\xec\x09\xaa\x58\x38\x73\xed\x3d"
- "\xf1\x83\x92\x1f\xe5\xf3\x43\x1c\x67\x4a\xc3\xdc\xa7\x9d\xeb\x2d"
- "\xe0\xf9\x2b\xea\x43\x3e\xc8\xff\x4c\xd9\x4e\x7f\xf2\x0d\x43\xf0"
- "\xcb\xec\x63\xef\xb4\x9d\xf1\xea\x4c\x69\xda\x6e\xe0\x3a\x28\x90"
- "\x63\xfa\x86\xb8\x6d\x33\x70\x43\xfa\xc1\x4a\x95\x1e\xe6\x78\x87"
- "\xec\xdb\x88\xf7\x4d\x06\xae\x06\x0e\x5c\x1f\x9f\xd7\x14\xa9\x07"
- "\xb2\x39\xd6\x0c\xd7\xe7\x5f\xc6\xf1\x7d\xe7\x86\x0c\x7c\xbf\x29"
- "\x1f\x97\xd5\x08\xc1\x63\x27\xeb\x5e\xfb\x30\xa2\x96\x00\xeb\x93"
- "\xa7\x72\xf7\xd7\x04\x78\x7d\xfb\x76\xd4\x71\x5b\xa7\x70\x90\xd6"
- "\xed\x48\xd8\xbf\x5c\x06\xf9\x3d\x52\x37\xac\x3e\x70\x9b\x26\x26"
- "\x43\x47\xa0\x5c\xf7\x64\x5e\x5b\x82\xcc\x3e\xb5\xa3\xb1\xb4\x9d"
- "\xcf\x58\x42\xdf\x3c\xb5\x03\x79\xb2\xd9\xc6\xc2\xfc\x8a\x75\x56"
- "\x32\xeb\xa5\x86\x45\x63\x19\xc6\x4e\xb3\x93\xcc\x8d\xce\x6f\xf6"
- "\x1d\x00\xc0\xed\x50\x72\xf3\x54\x87\x61\x97\xe0\x3e\x14\xbb\xdf"
- "\xfd\x94\x2f\x7e\x6e\xf6\xc4\xb3\xcf\x96\x14\xcc\x9f\xcd\x97\xcc"
- "\x6b\x17\x5e\x9f\x1a\x3d\x07\x67\x1d\xac\xe2\x23\x3c\x9d\xce\xeb"
- "\x5d\xaf\x0c\x31\xf6\x6f\x9f\xee\x39\xff\xa5\xfb\x89\xdf\xc9\x73"
- "\x09\xb6\xb9\xf1\xae\xe8\xe3\xd2\xe5\xd2\x06\xfa\xcc\x42\xa6\xf8"
- "\xfa\xe6\xcc\x2a\x99\x55\x74\x3b\xef\xd4\xa4\x26\xaa\xa7\x3c\xae"
- "\x9e\xfa\x9e\x7a\x94\x0e\x0c\x98\x38\xdf\x5a\xab\x5f\xa4\x84\xaa"
- "\xd4\x19\xdd\xa7\x8f\x1a\x6b\x29\x7d\xf8\xd7\x39\x23\xab\x3f\xcd"
- "\xe1\x7e\x71\x2d\x27\xd3\xfb\x4b\x5b\x4d\x6c\xcb\x94\xe1\x9e\xe7"
- "\xb4\x72\x6d\x46\x8f\x53\xf4\xe1\x99\x56\x8c\x31\x45\x59\xa2\xe2"
- "\x80\xd3\x47\x45\x99\x7d\xcd\x63\xa3\x7d\x13\xd8\x97\xad\x8d\x8a"
- "\x26\xf7\xe9\x47\xe0\x39\xa4\xeb\x98\xa2\x4d\x8d\x36\xe2\x7e\x7f"
- "\xe1\x18\x15\xbd\x61\xb6\x61\x1c\x19\x46\xff\x81\xfb\x4d\x5c\x96"
- "\xdf\xc5\xf4\xf3\x95\x27\xeb\xcc\xe0\x42\x70\x63\x92\x50\x7f\x64"
- "\xd6\x6f\x92\xf1\x33\x89\x24\xb9\xcb\x96\x0c\x0a\x0f\xe8\x6f\x26"
- "\xeb\xa0\x34\xcb\x55\xdf\x1e\x6e\xbb\xf3\x8e\x71\xd9\xae\xb2\x52"
- "\x48\x6f\x38\x64\x15\xd1\x71\xb5\x42\xd9\x0f\x5e\x5f\x4e\xd2\xcf"
- "\xa2\x22\x94\x9d\x08\xd7\xb5\x6e\x51\xcc\x67\x9a\xb5\x41\xd6\x99"
- "\xae\x85\x64\x7a\xaf\xcb\x67\xe2\xd8\xf1\x6c\x63\xf1\xb7\x05\x8e"
- "\xd1\x33\xd7\x7f\x84\x34\xb4\xdf\x29\xd6\x58\x67\x2a\xdb\xe4\x99"
- "\xb9\xda\x3a\xeb\xcc\x5e\xf8\x66\x62\xf8\xae\x37\xc8\xb4\xa5\xac"
- "\xdd\xe4\x35\xdf\x41\x5e\x7b\x80\x3e\xc2\x7d\x42\x5a\xa2\x4e\xb6"
- "\x77\x18\x46\xad\x5b\xf3\xb8\xbe\x22\x93\x7e\x2e\xd1\x74\x8a\x9e"
- "\x79\x73\x7b\x1f\xe5\xf8\x1c\x70\x67\x6a\xd3\xa2\xa0\xfb\x19\xf4"
- "\xff\x5d\x66\x7d\xbc\x83\x5e\x7e\x06\xfc\x5f\x24\xf5\x3f\xde\x2f"
- "\xec\x94\xb1\x85\xe7\x91\x91\x27\xf1\x98\xc7\x6b\xb3\xa2\x81\xfb"
- "\x55\x9c\xfb\xa2\x9d\xcf\x3c\xf4\xe1\x1f\x31\xc0\xeb\xbc\x99\xf7"
- "\xa8\xfa\x0d\x0a\x51\x9a\xeb\xac\xe8\x8e\xb8\x29\x03\xec\x6e\x8a"
- "\x60\x4e\x1d\x3e\x27\xf2\x9b\x3b\xce\xc8\x58\x97\xac\x3f\xde\x9d"
- "\xf3\x3b\x93\x37\x74\xba\xc1\xbb\x4a\xa3\x16\xd8\x1e\xde\x9a\xd3"
- "\x0d\x2a\x26\x66\x84\x9a\xe9\xef\xd4\xec\xfc\x6b\xb9\xb7\xfc\xef"
- "\x48\x17\xe5\x4c\xe7\xee\x73\x62\xba\xd7\xfc\xff\x10\x7f\xfb\x84"
- "\x75\x21\xe8\x6e\x3f\x45\xf3\xfe\xf0\x21\xe0\xbc\xf7\x5f\x80\x25"
- "\x63\x69\x8d\xa7\x8f\x70\x8f\x36\x1d\x31\xf4\x64\xc2\x18\x24\x49"
- "\x0d\x6b\xad\xce\xc7\x4c\x1a\x74\x2e\xc7\x3c\x83\xae\x1d\xcb\xed"
- "\xc2\x73\x16\x3f\xe3\x3a\x8a\xaf\xd6\x15\x0d\x9b\xac\xe1\xc7\x58"
- "\x07\xe7\xb3\x7e\x45\xfa\xf4\xda\x73\x52\x27\xe7\xe9\xcf\xb9\xfa"
- "\xf3\x64\xfd\x79\xa2\xfe\x9c\xa3\x3f\x8f\xe3\x67\xa5\xbb\x9f\x75"
- "\xf4\x8c\x2b\xa6\x01\x87\xf0\xec\x34\xfa\x02\xf8\x0c\xb4\x3a\x97"
- "\xcb\x31\x40\xc7\x63\xac\x8e\x57\x96\xfe\x6c\xe0\x73\xa5\x35\xbc"
- "\xfc\x7f\x0b\x9f\x50\x2c\x3e\xc5\x96\x28\x7c\xc8\xea\xcc\xf9\x26"
- "\xf8\xa4\x5b\x39\x3e\xff\xff\x00\x1f\xc6\x85\xd3\x50\xbf\x27\x0e"
- "\x9f\x6a\x03\x9f\x84\xfc\xb6\x48\xb4\xf3\xf8\xb7\xe0\x72\x19\xef"
- "\x77\x00\x8f\x6d\xb5\x5d\x46\xfc\xba\xe2\x23\x17\x8a\x5f\x07\x59"
- "\xb0\x21\x0f\xda\x5f\xbc\x45\x1f\xe7\xf7\x2a\x5b\xf0\xb9\x34\xc3"
- "\xa7\x08\x6d\xdd\x5a\xa9\xda\xba\x6d\x15\xc7\x70\x5b\x42\x57\xb8"
- "\x9c\xa2\x1d\x73\xb3\xff\xc3\xf3\x87\x68\xb8\x45\x25\x0b\x16\x3c"
- "\x73\xbb\xbd\x68\xd6\xbc\xd9\xf6\x6b\x0b\xed\x0b\x1c\x73\xe7\x94"
- "\xcc\x8e\xdd\x67\x4f\xd7\xbf\x97\x22\xcf\x0f\xb0\xbd\x2d\xe7\x5b"
- "\xe0\x7f\xd6\xdb\xca\xe7\xf3\xb9\x66\xe1\x7e\x2e\x9b\x75\xfd\xe6"
- "\x97\xc9\xcc\x67\x8a\x81\x4f\x8d\xa1\xe3\x8d\x39\x12\xeb\x78\xa4"
- "\xc3\xfe\x9b\x37\x36\x2a\x9d\xf3\x1e\x34\xd2\x18\xbe\xae\x9b\x06"
- "\x1c\xa3\xe7\xe6\x72\x9d\x09\x69\x78\x4e\xd4\x61\x7c\xe5\xef\x0d"
- "\x98\xa0\x53\x04\xc7\x63\xe2\x73\x79\x28\x27\x8e\xd3\xfc\xcb\x59"
- "\xf7\xf2\x37\x79\x94\x5d\x2f\x80\xe3\xfc\xd1\x28\xb3\x05\x69\xe6"
- "\x75\xc8\x8b\xb9\x42\x3b\x97\x43\xfa\x24\x8e\x8f\x80\x74\x8b\x1e"
- "\x67\x8a\xd3\x1e\xe6\xf8\x05\x48\x4b\x8f\x4a\x7b\x86\x63\xa5\x23"
- "\xcd\xae\xc3\x5b\xce\x74\xc6\x73\x8e\xbe\x96\xc2\x79\x5e\xd2\xeb"
- "\x2d\x8f\xc6\x99\x3f\x9e\x71\xf3\x8d\x59\xf6\xe9\x0f\x7c\x6f\xfc"
- "\x1d\x4f\x3e\x3b\x6f\x4e\x2a\x49\xb2\x67\x62\xb8\xcc\xba\xd9\x79"
- "\xfd\xed\xf6\xe2\xd9\xb3\xe7\xdb\x17\xcf\x9e\x57\x62\x9f\xb5\x78"
- "\xd6\x92\x54\x9a\xf3\xec\xfc\x27\xf9\xf4\x3d\x77\xcb\x82\x82\x27"
- "\xe7\xfc\x94\x9d\x21\x54\xee\xd4\x98\x71\x7c\x3a\xeb\x36\x3d\x5e"
- "\xc5\xc1\x4a\xb6\x35\x52\x0e\x1d\xc4\x3d\xc7\x71\xb2\xe1\xda\x88"
- "\xdf\x5e\xfc\xea\xf1\xe3\x18\x09\x87\x4e\x90\x73\x06\xae\x3b\x82"
- "\xee\x05\xe3\x0c\x7b\xa2\x97\x87\x16\xe4\x19\x3c\x84\xf1\x7f\x87"
- "\x1a\xdf\x16\x94\xb7\x84\xa5\xfc\xf4\xf0\x54\xe5\xb9\x5e\x9e\xe2"
- "\x38\x94\x2d\xec\xeb\xb3\x08\xef\xc1\xc3\xa0\x3f\xcf\xab\x53\x98"
- "\x6e\xc7\x69\xd1\x42\xcc\xc7\x9b\x38\x86\x0a\xae\x8d\xe0\x97\x26"
- "\x15\xb7\x64\x41\x18\xf9\x46\xa0\x8e\xbd\x7a\x1d\xea\x79\xa8\x38"
- "\xc8\xdf\xce\x38\xa6\x3f\x33\x2c\xc0\x18\xc8\xf7\x7c\xd5\xf7\xd4"
- "\xac\xec\x37\xa9\xe6\x8d\xc6\xbb\x92\xb7\xf5\x3a\x1a\x40\x8b\xf2"
- "\xcd\x6e\xb9\xf6\x27\xe7\x57\xbc\x76\x68\x4d\xba\x53\x00\x9f\xd3"
- "\x5a\xf2\xa3\xad\x32\x2e\x62\x79\x17\x74\xc4\x2d\xb7\x78\x9d\x32"
- "\x7f\x12\xaf\x2d\x4e\x2d\x16\x1a\xc7\xa7\xd6\x92\x9f\x6e\xe5\x72"
- "\xc2\x72\xe8\xa0\xb6\x6e\x60\x8e\xb2\x05\x38\x1e\x5d\x49\xb9\x0e"
- "\x33\xc4\xb4\x3d\x41\x0b\x6e\x52\x73\x35\xe7\x0c\x65\x9f\x95\xac"
- "\x31\x7c\xf0\x20\xa3\x99\x78\xae\x31\x74\x80\x8f\x4a\x1c\xba\xbf"
- "\x54\x83\x6a\x7f\xc9\x11\xfd\xb9\x5e\xc7\x31\x89\x63\x64\x00\xff"
- "\x43\xdc\x77\x98\xf7\xd6\xe3\xfe\x08\xe8\xd3\xa4\xe8\x53\x22\x6d"
- "\x40\xd8\x35\xfc\xfe\x08\x7f\x67\x04\xef\x8e\xa8\xf8\x13\x25\x69"
- "\xdc\xe6\x5e\x9f\xca\x9a\x1c\xe0\x3a\x90\xf7\x1e\x21\x4b\xf5\xde"
- "\x73\x2c\x9f\x25\x1c\xcb\x72\xbb\xa1\x77\x58\xcf\x14\x44\x20\xa7"
- "\xd2\xee\x5e\x38\xd1\xd0\x37\xbd\x7c\xb0\x30\x3f\x91\x2e\x49\xd4"
- "\xef\x8a\xfe\x0b\x3f\x16\xee\xf9\x35\xc0\x69\xbb\xec\x03\x8e\xd3"
- "\x79\xae\xc7\xbe\xef\x56\x3a\x72\xe1\xb6\x9e\xb9\x88\x8e\x07\xc7"
- "\xfc\xf6\x31\x6e\x5d\x72\x3f\x58\xd7\x1b\x0b\x8f\x18\x7a\xc3\x80"
- "\x63\x4d\x12\x9a\xd5\x89\x7f\x9e\x4f\x6c\xbc\x76\xce\xe3\xa5\xb4"
- "\x47\x00\x67\xd0\x59\x75\x36\x4a\xab\xf8\xc4\xe6\xa3\x85\x6b\xa0"
- "\x63\xcc\xd2\xe6\x74\xcf\x7f\xaf\x57\x17\x2d\xca\x8c\x86\x29\x2c"
- "\x9f\xd8\x18\x2e\xeb\x23\xb6\x49\x0a\x22\x66\x8e\x4f\x62\xd3\xc7"
- "\x17\xe8\xe0\x45\xf9\x06\xae\xa0\xe1\x41\x03\x5f\xfd\x1b\x4f\xd0"
- "\x55\x0b\xeb\xa7\x45\xba\xd9\x47\xb8\x51\xf5\xa7\x53\xea\x1b\xbc"
- "\xdb\x86\xb2\xeb\x7d\xf4\x5c\xbb\x2e\x43\x4d\x28\xbf\x6d\x7f\xd9"
- "\x44\xe4\x59\xb4\x5d\xf7\x73\x3d\x84\xfe\x3d\x12\xc5\xfb\x6f\x47"
- "\xad\x05\x1c\x51\x7d\x78\x47\xf9\x31\x5a\xe4\x8f\x4a\xd7\xfb\x76"
- "\x7f\xde\x31\x5a\xfc\xb6\x9a\x57\x1f\xd0\xe3\xbe\x2d\x56\x67\x57"
- "\x74\x1c\x59\x17\xf0\x39\x2e\x96\x71\x49\x7b\xd9\xc7\x8b\x33\x8d"
- "\xf1\x02\xb0\x76\x48\x9a\x0f\x15\x7b\x99\x4e\x2a\x0e\xc4\xfc\x16"
- "\x45\xa7\xc5\x79\x31\xb4\xe7\x71\x13\xf5\x30\x9d\x06\xad\x10\xda"
- "\xa0\x40\x92\x28\x58\x62\x26\x96\x17\x96\x71\xde\x33\x02\x7f\x48"
- "\xbb\x4a\xd1\x6d\x71\x95\x41\x37\xa3\xef\x98\x4e\x3e\x5a\x4c\x4c"
- "\xdb\xd8\x36\x0e\x38\x74\xcc\x68\x3b\x68\xca\xeb\xe0\x78\xde\xa2"
- "\xcb\x45\x53\xc3\x30\xf6\x29\x58\xf0\xcb\xfd\xe6\xef\xd1\x7e\xe7"
- "\x58\x52\xb4\x5d\xec\x07\x6d\xf3\xa2\xe6\x0d\x1c\x37\x75\x1b\xcb"
- "\x8a\xf0\x7c\x92\xa1\xc7\x64\x3a\xa8\xfc\x5b\x16\x6c\x11\x15\x9f"
- "\x64\x48\x59\x5e\x24\x63\x67\xb0\x0c\x1c\x62\x1a\xb1\x5e\x64\x59"
- "\x62\x19\x60\x79\x52\x34\x72\xe6\x46\xd1\xa8\x91\xe9\xa3\xd3\x69"
- "\x47\x9c\x2e\x9f\x6d\x2f\x1a\xaf\x74\xb1\x3d\xf3\xda\xc2\x31\x32"
- "\x00\x8a\xfd\x9e\x09\xb7\xdb\xf3\xc6\x5f\xeb\x74\x8c\x9a\xaa\x2e"
- "\x13\xf2\x72\xf9\x9a\x1a\x3b\xef\xb2\xa3\x9e\x1d\xb1\x73\xb7\xb2"
- "\x1c\xa5\x3f\x9c\x4d\xbe\xa4\x01\x72\xdd\x81\xe3\x91\x56\xce\x23"
- "\x8a\x00\xef\x75\x27\xd0\xa7\x96\x03\x3b\x38\xfe\xed\x34\xcc\x19"
- "\xa7\x9e\x15\x5f\xd5\xe2\xdd\x66\xa4\x0f\x2a\xe6\xb8\xf9\xff\x14"
- "\x5a\xca\x81\x1d\x3c\xb7\x17\x15\xbb\x9d\xfe\x94\x50\x36\x7e\xe4"
- "\x4f\x69\xf2\x4c\xba\xde\x25\x82\xee\x25\x23\x8d\x76\xf1\x1a\x00"
- "\xfa\x73\xc7\x34\xa7\x88\x30\x8d\x0a\x9c\x1c\xa3\x1a\xb0\x93\x79"
- "\x0d\x60\x09\xda\xff\x8c\x47\xcd\x2f\x97\x80\xff\xe7\x77\xe8\xba"
- "\x2c\x0f\xcf\xb0\xff\x6e\xdd\x2e\xfb\xd5\x6d\x93\xb1\xad\xb5\x95"
- "\x37\xdc\x8f\xf9\x00\x19\x30\x01\xab\xbf\xda\x0f\x57\xf0\xbe\xa9"
- "\xbf\xa5\xb6\xfa\x93\x46\x6b\x92\x8a\x17\x08\x19\x2f\xaf\x35\x69"
- "\xf9\x3d\xfe\x13\x78\x37\x68\x45\x3a\xfb\x57\xe4\x83\xf7\xca\x39"
- "\x8f\xf1\xae\xd2\xad\xf9\x2a\x4d\x5a\x08\xfd\x98\xae\xec\xe7\x0e"
- "\xd6\x9f\x98\x5b\x2e\xcd\x30\xc6\x35\x39\x1e\x9a\xa8\x5c\xcd\x67"
- "\x96\xde\xca\xe5\xce\xb8\xcd\x98\x33\x38\xb7\x5c\x9d\x21\xe7\x28"
- "\x21\xcd\x9d\x44\xca\xc7\x75\x69\x8a\xa1\x63\x79\x1f\xcd\xba\x42"
- "\xf8\x79\x1d\xd1\x1a\x16\x7e\x19\x83\x9d\xc7\x0e\x3a\x41\xde\xd2"
- "\x60\x39\xfb\xd8\x49\x1b\x08\xf5\xaa\x71\x23\xa2\xc6\x0d\xd4\xef"
- "\x4f\xbe\x61\x26\xc6\x87\xa4\x13\xb4\xa4\x95\xf1\x67\xda\xf0\x7a"
- "\xbc\x06\x5a\x79\x79\x9c\x64\xfa\xa4\xfe\x61\x22\xfb\x46\x70\x5b"
- "\xad\x61\xb4\x39\xba\x5d\x26\xcd\xb7\xce\x8d\x76\x99\xd0\x2e\xe7"
- "\x49\x96\x99\x10\xfb\xac\x40\xde\x86\xca\x38\xc7\x72\xfe\xbc\x34"
- "\x14\xdd\x46\xd6\xff\xaa\x0d\xcb\x2e\x4f\xd4\x46\x61\xe2\x36\x4a"
- "\x1a\x9c\xd4\xe5\x4d\xe2\xc9\xfa\xa3\x83\x96\x6e\x1b\xb4\x82\x7d"
- "\x45\x0e\xec\x80\x7e\x9b\xc0\x7d\x88\xf1\xb3\x8a\xf1\x4c\xd4\x5f"
- "\x0c\x4f\xc1\x5a\x56\x6f\x5d\x51\x3e\x33\xe8\x5e\xb6\x2a\x31\xbd"
- "\x97\xbd\x7d\x61\x7a\x2f\x5b\xc2\xe5\x19\x0f\xde\x03\xb0\x86\x31"
- "\x59\x07\xdf\x62\xbe\xe6\x49\x54\xef\xa0\x15\x75\x8c\x57\xc2\x77"
- "\x82\xe5\x45\xd7\x41\xe0\x43\x01\x39\x11\xac\x93\x82\xee\xd2\x9e"
- "\xf5\x2f\x6b\x92\x3d\x59\xea\x07\x93\xa8\x4a\x04\xc3\xba\xa2\x8a"
- "\xf7\x42\x26\xa0\xfe\x84\xef\x35\xfe\xa6\x83\xe7\x40\x9d\xb6\xf2"
- "\xbb\x57\x5b\x93\xe8\x4e\x7f\xf2\x77\x53\xad\xce\x30\x9f\xf1\x43"
- "\x3f\x0a\x27\xe4\x78\x34\xcf\x53\xd5\xda\x45\x29\xec\xff\xb5\x32"
- "\x1e\xb7\x3f\xe5\x40\x9d\xda\x5b\x28\xc5\xf8\xb7\x3e\xd7\x58\xbf"
- "\xc5\x33\xf4\xcb\xe7\x45\x4a\x2e\xaf\xd8\x20\x56\x37\x4d\xd7\xdc"
- "\x56\x61\x5f\x6a\x85\x1d\xb9\xfc\x41\x4d\x70\x9c\xff\xa6\xe9\xbd"
- "\x7c\xa2\xfc\x68\x0c\x3e\x41\xf9\x70\x62\x1e\x58\x7e\xe5\x85\x79"
- "\xa0\xf4\x4b\x7e\xcf\x74\x57\x73\x95\xe5\x13\x0d\x3b\x45\xac\xbc"
- "\x62\x83\xbd\x8c\xeb\x2f\x6d\x55\x75\x33\x4d\x72\x78\x5f\x21\x17"
- "\x74\x29\x47\xde\x62\x43\x0f\x30\xbf\x58\x23\xfc\x0d\x04\x92\x3c"
- "\x8d\x77\xb0\x7f\x8a\x7d\x6a\xad\xb4\x39\x5d\x7e\x2f\xd0\xed\x74"
- "\xf8\x5d\x8e\x8d\x18\x87\x29\x90\xf2\xc9\x70\xe4\xd9\xee\xa3\x06"
- "\x19\xcf\x08\x63\x70\x06\x74\xb6\x6d\xbd\xf2\x93\xb5\xc8\x38\x42"
- "\x90\x69\x8e\x1d\xc4\x72\x8d\x34\xd6\xdd\x1c\x47\x08\xf3\x9d\xe5"
- "\xed\x3d\xe3\x92\x3b\x07\xba\x42\xc8\x6f\xef\x60\x5c\x1a\xde\x09"
- "\xda\xbd\x6a\xd2\xb6\x9e\x1b\x63\x23\x6e\xf3\xb9\x95\xc3\xb6\xbe"
- "\x70\x23\x99\x0f\xd8\x9e\xa0\xe2\x9b\x29\x63\xc5\xf7\xcc\xf4\x7f"
- "\xb3\xc9\xc4\x74\xf0\xd1\xf2\x90\xa2\x5d\x59\xb6\xd1\x3f\x3e\x2a"
- "\x95\xfd\xc3\x6b\x8d\xd3\xc2\xe2\x2b\xb5\x1e\x5a\x06\xfd\xf7\xd4"
- "\x21\xf5\xde\xd9\x10\xbf\x06\xc4\xf6\xbc\x7d\xee\x02\x7b\xe1\xb3"
- "\x8b\xe7\x8d\x18\x11\x33\x57\x32\xcb\xb3\x31\xee\xb2\x22\x35\x9e"
- "\x96\xf5\xc4\x3f\x62\xbb\x04\xcf\x68\xbf\xf3\xbc\x18\xe7\xb9\x05"
- "\xba\xfb\x73\x41\x16\xf5\xde\xdf\x44\xb9\x37\x45\x3d\xde\x42\xb9"
- "\x37\xdf\x52\x70\xff\xec\x59\x85\x4b\xa2\x52\x6f\x8d\x5e\xd7\xab"
- "\xdc\x80\xba\x93\x87\xdd\x0d\x5d\x91\x34\x75\x19\x8f\x2d\xae\x57"
- "\xcb\xc2\xe2\x5f\xd0\xd7\xd9\x90\xb1\x82\xe6\x92\x30\x35\x43\x97"
- "\x89\x2b\x58\x87\x0f\x50\x67\xfe\x60\x4f\x81\xb7\xac\x68\xbb\x1f"
- "\x76\xdd\x59\x5e\x9f\x41\xb9\x3d\x2d\xd5\x1c\xeb\xb7\x49\x8f\x63"
- "\xee\x2a\x41\xfa\x60\x5c\x37\xe1\xda\x1f\xd7\x37\xed\xf3\x30\xef"
- "\x61\x1f\xeb\x45\xec\x63\xed\x92\xbe\x2e\x37\x06\xca\x89\x7d\x45"
- "\xf0\x7e\x14\xdb\x20\x3e\x72\xf1\xf7\xc1\xf8\x9b\x74\x39\x48\x5b"
- "\x68\x7f\x8a\xb2\xf8\x2a\xe4\xfe\x11\x66\x60\x15\x4d\x55\x62\x63"
- "\x3e\x7f\x4b\x6b\x24\xd2\xff\x96\x9c\xf4\x19\x25\xdb\x06\x44\x82"
- "\x6e\x57\xab\x8f\x9e\x5e\xc3\x74\xea\xeb\xdb\x9f\x4c\xe7\x78\xfb"
- "\xb0\xd7\x36\x5c\x4d\xd2\xbe\xd5\xed\xb9\xcd\x72\x5c\x28\x1f\x15"
- "\x65\xd3\xf1\xfe\x65\xaa\xb2\x4f\x44\x44\xd9\xa7\xe5\xb9\x86\x1c"
- "\xe0\x3e\xdf\xe0\xd3\x98\xb8\x6b\xf3\x4a\x66\xcf\x9f\x5d\x68\xbf"
- "\x76\x41\x2a\x45\x45\x5d\x73\xcc\x9e\x67\x9f\x3f\xfb\xb9\x85\xb3"
- "\x17\xc8\x88\x69\xfc\x36\x66\xcc\xcf\x10\xa9\x7f\x6c\x34\xce\x03"
- "\xd9\x87\x31\x7d\xcb\xf7\x71\xac\x2e\xb1\xfa\x4f\x13\xd9\xa7\x43"
- "\xda\x28\x69\x56\x67\xec\x7c\xc3\x9d\xa7\xec\xbc\xa6\x72\x35\xd7"
- "\x59\xf1\x39\x3f\x1f\xa3\x15\x8e\xde\xb8\xe0\x2b\x2e\x07\x2d\x4d"
- "\x8a\x6e\x96\xe3\x41\xf7\x8a\x74\x83\x6e\x3e\x72\x57\xeb\xb6\x54"
- "\x87\xd4\x1f\x18\x63\xa1\xff\x62\xc6\x57\xf5\xcd\xcf\x15\x36\xf0"
- "\x46\xb2\x5c\xef\x4d\x69\x5a\xc5\x75\x31\xcc\xe3\x28\x8f\xfe\x29"
- "\x87\xde\x64\xfd\xe6\x31\xe0\xa1\x4e\xe2\xfa\xf4\x79\xd0\xb7\x50"
- "\x5e\xee\x87\x6b\x9e\xa6\x55\xac\x53\x38\xb6\x84\x56\x01\x38\x72"
- "\x1f\xcf\x5d\xcd\x36\xa6\x8c\x4d\x0f\x58\xbc\x4e\x0b\x3d\xb7\x9e"
- "\xbf\x0f\xcb\x69\x2a\x66\x58\x79\x21\xaf\x0d\xa3\xae\x52\xe0\x7f"
- "\xa8\xd7\xe7\xdd\x5d\xcd\x76\x27\xc3\xf5\xd1\x8a\xf5\x0c\x4f\xc5"
- "\x44\x5b\x11\xf0\x51\x59\xb8\xd7\x7e\x72\x67\x47\xcd\xcb\x80\x8f"
- "\xc2\x33\x00\x5c\x64\xfc\x4d\xe5\x83\x28\xdb\xcd\xfa\x73\xbd\xde"
- "\x76\xa3\x3d\x41\xb7\x1b\xfa\xcf\xd5\x6e\xec\xad\xfb\xf4\x76\x33"
- "\x7e\x8c\x7b\x34\xce\x3a\xbe\xc5\x8c\x2f\xca\x95\x46\xc9\x36\xaf"
- "\xcb\xf4\x43\x5a\x55\xaf\x6f\x73\x79\x6b\xbc\xde\x78\x76\x9e\xbd"
- "\x68\xee\xbc\xa7\x0b\x16\xcf\x7a\x7a\x76\xc1\xc2\xe2\x51\xf6\x85"
- "\xf3\x9e\x28\x7a\xf6\xc9\xa7\x99\x6b\x16\x94\x2c\x7c\xf2\x69\x3b"
- "\x6b\x96\x82\x89\xb9\xb9\x05\x77\x3f\xf8\xc0\xc3\xa9\x74\xf7\x2c"
- "\xa4\x61\xe6\x9f\x9b\x35\x4a\xbd\xba\x7f\xd2\x84\x87\x0a\x26\x4c"
- "\x7b\x70\xea\x74\x79\x18\xa2\xe7\xfd\xc4\x79\x89\x33\xc4\xf0\x61"
- "\x3a\x78\xa9\x14\xfd\xdb\xef\x18\xfd\x2c\x43\xc5\xd1\x5e\x39\x31"
- "\x36\x8e\xf6\x4a\xcc\x65\x57\xc2\xca\x5c\xb9\x9e\x68\xd5\x41\xfc"
- "\x30\x4f\xfd\x99\x45\xf1\x57\xca\xb4\xa0\x7b\x65\x71\x2f\x7f\xfd"
- "\x2c\x43\xee\x8f\x57\xcb\x7d\x67\x13\xde\x41\xff\x97\x57\x45\xbf"
- "\xeb\x9d\x4f\xae\xdc\xda\x33\x9f\xec\xd1\x29\x2b\x8f\x18\x73\x4b"
- "\xa4\x79\x30\xaf\x4c\xe1\x79\xa5\x5a\x4f\xfa\xd9\x65\x92\xa7\xfa"
- "\x94\x6f\x0b\x19\xf3\x4a\x96\x6d\xde\x27\x56\xf3\x8f\x55\xe9\xd1"
- "\x32\x2e\x63\x37\xea\x32\xce\xe5\xe4\xfa\x5d\x9a\xb5\x90\xd7\xb4"
- "\x61\x1f\x97\xc2\x56\xc0\xf8\x15\x14\x62\xa0\xb5\x50\xe1\xb4\x2a"
- "\x8f\xd7\xb8\xd9\x6e\xd6\xf9\x69\xd0\x09\x5a\xb5\x56\xb8\xdd\x5b"
- "\xd4\x9c\xd2\xfd\x17\xd6\xeb\x62\xe5\xb0\xbb\xd9\xff\x84\xe7\x4e"
- "\xa8\x73\x55\x2f\xcf\xfe\x2c\x83\x79\xa1\x77\x2e\xbb\x2a\x46\xff"
- "\x77\xca\xef\xd5\xad\xda\x61\xc4\x01\x28\x19\x41\x26\xf3\x88\x2a"
- "\x5a\x6f\x12\xe5\x3e\x5a\x55\xc8\x75\x30\x3d\x7d\xb4\xb2\x1c\x79"
- "\xcd\xbd\xf4\x5b\xd5\xde\x43\x3f\x7d\x9d\xc5\x58\x63\x51\x78\xff"
- "\xec\xb2\xbe\x68\x95\x98\x4e\xcf\x67\x7f\x2d\x9d\xdc\xd4\x8f\x65"
- "\xd2\xa0\xd7\xf9\xb4\x7a\xbe\xf4\x7c\x5a\x3d\xdf\x1c\x45\xab\xb3"
- "\xe7\xd3\xea\xf9\xed\x51\xfb\x3e\xfa\x3a\xca\xcf\x2e\x63\x9a\x31"
- "\x8f\xa1\xdd\x85\xe0\xb3\x8a\x5e\xfa\x3d\xef\x3b\x9f\x7e\xcf\x07"
- "\x12\xd3\xef\xf9\xaa\xab\x63\xe1\x54\x26\x1a\x37\x06\xad\x30\xe9"
- "\xe7\x84\x7e\x36\xb7\x71\xb8\x9c\x93\x86\x5e\x31\x69\x8e\x57\xdc"
- "\xf8\xe1\xca\xf3\x88\x5e\x5b\x5c\x84\x74\xfa\x3a\x1a\x31\xe7\xe5"
- "\x75\xa5\x0b\x8c\x45\x47\x8d\x35\x0f\xdc\xb7\xf2\xdc\x99\xbf\x15"
- "\xc4\xe9\x4c\x4f\xfe\xf6\x14\xf8\xbd\x55\xd9\xa5\x3f\xab\xef\x59"
- "\x73\xb9\x6e\x5e\x43\xf2\x0a\xb2\xef\xaf\xb9\x99\xd3\x0f\x81\x87"
- "\xe4\x1a\x12\xfb\xf7\xf4\x05\xb3\x20\x92\x43\x89\xe1\xbe\xd0\xc3"
- "\xff\x7d\x9d\x95\x8d\xd3\x47\x8e\x59\xf3\x0a\x9f\x9d\x33\xe7\xeb"
- "\x55\x51\xb4\xef\x4e\x95\x5b\xe3\xef\x5d\xf5\x0f\xae\x7c\x6a\x29"
- "\xea\x84\x7e\x7e\xa6\x41\x8d\x9b\x2f\x40\xff\x39\x9c\xca\x96\x7c"
- "\xb4\x5d\x9d\x0f\x7e\xa1\x23\x4a\x3f\x83\x47\x5e\x08\x09\xf7\x0b"
- "\x63\x7b\xfb\xf8\x85\xc6\xf3\xfb\xf8\x85\xd6\xc4\x7d\xfc\x42\x58"
- "\x5b\xc4\xe7\x33\x5e\xe0\xf9\x8f\xb4\x35\xf9\x99\xf7\xcb\x31\x67"
- "\x6e\xc7\x7c\xb9\x63\xda\x92\x86\x3b\x0b\x96\x24\xb1\x5f\xb9\xfc"
- "\x26\x47\xf8\x9c\x68\xe3\x3d\x6b\xde\x1f\xe3\x6f\x72\xf0\xb7\x78"
- "\xf8\x5b\xad\x32\x0f\xee\x2b\x8f\x93\x9c\x3b\xe2\xbd\xbd\xf6\xb8"
- "\xfc\x2e\x31\x6c\x05\x4f\xbe\x61\x5b\x5b\x57\xd8\xe5\xb9\xe5\x75"
- "\xaa\x3f\x5a\xb9\x2f\xb8\xbe\x82\x25\x0d\xaa\x8e\x73\xfc\xbd\x2d"
- "\xb2\x2a\x1b\xc2\x53\x75\xc1\xb5\xfb\x94\x90\xbd\x4f\x7f\x28\x77"
- "\xf9\x80\x57\x54\x4c\x6b\xf6\xe5\xf4\x1b\xbe\x3a\xec\x57\x08\xb8"
- "\xed\xf1\x7e\x89\xca\xbf\xa4\x82\x0c\xbf\x1d\xdc\xa7\xf5\xcc\x07"
- "\xf8\x3b\x2e\x98\xc7\xd9\xcb\x56\xf4\x3f\x45\x9e\xe6\xda\x3e\xd6"
- "\xd0\x8d\x73\xca\xba\x9f\xcf\x00\xc0\xe8\xf1\x7f\xc4\x38\x37\x80"
- "\xf5\x45\xaf\x4f\x63\x45\x51\x94\xef\x9a\x9f\xc7\x5e\xfe\x56\xcc"
- "\x71\xaa\x58\x2b\xbf\x4d\x73\x35\xaf\x7f\x57\x6c\x53\xdf\x05\xae"
- "\xa8\x8e\xc6\x45\xe1\x51\xf1\x30\xaf\xd1\xf2\xfb\x68\x5c\x9c\xb3"
- "\x16\xce\x1d\xe3\x9c\x33\xd7\xfe\xa4\x63\x6e\x71\xc1\x5c\x19\x5b"
- "\x56\x86\xad\x2d\x59\x52\xcc\x3b\x12\xd7\xa7\xc6\x8d\x61\xba\xef"
- "\xa4\xe1\x03\xa3\xfc\x27\x57\x0f\x06\x3d\x4c\xca\x7f\xf2\x45\xb3"
- "\x1a\xd7\x57\x0f\x3f\xdf\x5f\x66\x75\x96\xe1\x2f\x03\xbe\xe2\x6f"
- "\x94\x07\x7a\x7d\x6c\x98\xef\x56\xe7\x25\x28\xd3\xe3\xff\xc9\xdf"
- "\xb3\xe5\x6f\xcf\xf2\xbe\xb6\x8c\x3f\xfe\x32\xf7\x5b\x45\xbd\xd7"
- "\x39\x89\x63\xa8\xea\xfc\xbc\x7a\xbd\xc1\xcf\x86\x9f\x25\xc3\xe2"
- "\x73\x2b\x63\x42\xd1\x7e\x46\xab\xbf\xc2\x98\x67\xeb\x69\xc7\x32"
- "\x13\x31\xee\x01\x53\x03\xe3\xd1\x1a\x8f\x07\xf0\x1b\x81\x74\x7f"
- "\xaf\x9f\x96\xd1\xce\x17\xcd\xb8\xcf\x8f\xe7\xb9\xbb\x26\xe5\xc2"
- "\x28\x5d\x30\xbb\x24\x95\x26\xcc\x2a\x2a\x62\xb9\x9e\x35\xbb\x68"
- "\xe1\xfc\x67\x17\x14\xcc\x9d\x37\x17\xa9\x77\xcd\xe1\x90\xbf\x32"
- "\xcb\xed\xfa\x1b\xfb\xbc\xd9\xb3\x0b\x55\x92\xde\x0d\xb1\xfb\x40"
- "\x6a\xef\xfe\xc5\x12\x1f\x55\x8c\xea\xb5\xbf\x5e\x6c\x12\xa6\x17"
- "\xd3\xf1\xbb\x42\xca\xb4\xb4\x8d\x5e\xac\x8e\x9d\xf7\xbc\xb8\xd5"
- "\xe0\x07\xd9\x7f\x2e\xf6\xf5\x39\x30\xb8\x53\xc8\x7d\x13\xf4\xd9"
- "\x9a\x08\x7f\xd3\xdb\x47\x6b\xa4\xbd\x1f\x05\xa7\x47\xff\xf3\xb9"
- "\xfd\x95\xca\x4f\xc0\xcc\xdf\x07\xe5\xf3\xfb\x41\xf7\x1a\xf0\xbf"
- "\x67\x87\xe2\xff\x35\x3d\xfc\xdf\x69\x4a\xc6\x1c\x6e\xcd\x70\xc3"
- "\x9e\x8f\x95\x99\x35\x63\xcf\x97\x25\xf6\x71\x5b\x93\x6b\xd0\xd6"
- "\xe8\x67\xc5\x5b\x6b\xbe\x30\xd6\x61\x6b\xf5\xf8\xf3\x7c\xcf\x65"
- "\xd9\x56\x17\x83\x06\xde\xc9\xfe\xf8\xc7\x68\x4d\xbd\xe2\x97\x35"
- "\xeb\xa3\x7c\xb2\xd2\x4f\xd0\x9a\x1d\xaa\x9f\xd6\x6c\x33\xf0\x43"
- "\x3b\xe5\x7e\x00\xc3\x50\xb2\xff\xe2\x4d\x8a\x77\xd6\x1c\x32\x68"
- "\xcb\xf3\x62\x3c\xfb\x7a\x6d\x8b\x17\xcb\xa5\x8f\x84\x8a\x5f\xd0"
- "\xcd\xed\x07\x9c\x99\x06\x9c\xa0\x7b\x2d\xda\x6f\x69\x34\x68\x65"
- "\xe4\x89\xe6\x89\x09\xb3\x8a\x31\x69\x9d\x3b\x67\xce\xec\xf9\x0b"
- "\x8c\x98\xce\x99\xcf\x16\x15\xaa\x18\xce\xb7\xa3\xfb\x17\x43\x02"
- "\xc7\x73\x18\x68\xa4\xaa\xdb\x38\x1b\x72\x14\xaf\x33\x48\xbf\x3d"
- "\x39\x8f\x79\xe9\x8b\xcd\xfa\x9c\xe6\x18\xad\x2b\x55\xbe\x2f\xeb"
- "\xc6\x2b\x7b\xf1\x92\xc5\xc0\xa9\xce\xb0\x17\x79\xfd\xb2\x93\x46"
- "\xe4\xf3\x79\x24\xf6\xdb\xde\xf4\x9a\x68\xe3\xf5\x4a\xe4\x69\x34"
- "\xbe\xfb\xc5\xb6\xc8\x5a\xf5\x3d\x76\x7f\xc3\x3c\x8e\x99\xff\x72"
- "\x8a\x56\x71\xa0\x4a\xa4\xee\x6c\x80\xcd\x93\xc6\xb2\x30\xb0\x83"
- "\x7d\x27\x39\xce\xd0\xba\x74\xb6\x95\x58\xbf\x70\x6c\xfc\x36\x5a"
- "\xeb\xc3\xfc\x06\xe3\xdf\xcb\x69\xfe\x94\x03\x55\xab\x96\x92\x85"
- "\xeb\x80\x6e\xf2\x35\xd6\x31\x6d\xd7\x8d\xfa\x18\xba\x47\x5f\xdf"
- "\xf5\x71\x3d\x3e\x5a\x1b\xd2\xd7\xd2\xb7\xe8\x6b\x97\x5b\x90\x6f"
- "\xba\x8f\x06\xea\xdf\xd4\xd9\xfd\xfd\xef\x94\x93\x93\xbf\x03\xa8"
- "\x62\x04\x1d\x82\xad\xba\x9b\xbf\x7b\xe7\x87\x7d\x85\x39\xc4\xda"
- "\x3a\xb4\x21\x5b\xf7\xbd\x05\xaf\xac\xfb\x4a\xf9\x54\xaf\xad\x62"
- "\x1a\x00\xee\x76\x1d\xee\x76\xc0\x45\xff\x5f\xa1\xc7\x26\x5e\x57"
- "\x6f\xd4\x81\x31\xc5\x0f\x5b\xd4\xc9\xf6\x28\xf0\xf6\xe0\xb7\xa6"
- "\x52\xee\x4f\xfb\x30\x6f\xb1\x0a\xf6\x1b\xea\xfd\xb6\xd9\x3a\xbf"
- "\x31\xbe\x70\xdd\x3a\xee\x7c\xbe\xdd\xc2\x6b\x67\x7a\x5d\xdb\x78"
- "\x7e\x6d\xc0\xc4\xb3\x47\x3b\x77\xb2\x0e\x30\x2d\x18\x2b\xfd\xfa"
- "\x37\xad\xd6\x54\x9e\x61\x1f\x33\x1f\xc6\xc2\xab\x44\x41\x38\x9d"
- "\xf7\x75\x06\x1a\xdf\x0c\xab\x3d\xc3\xf4\xaa\x9c\xd1\xbb\x5f\x83"
- "\xf2\xa0\x3f\xe4\xa1\xbc\x8d\x2a\xe5\x77\xd2\x58\x16\xb8\x2f\xbb"
- "\xd0\x37\xfc\x6d\x7b\x71\xee\xe4\x76\xcc\xf3\x07\x1e\xa7\xca\x37"
- "\xb8\x8f\x78\x8f\x95\x7d\xbf\x90\x66\xe5\x18\xe7\xc7\xa8\xf2\x79"
- "\xee\x1f\xc6\x45\x78\x76\x55\x87\x83\xf9\x3f\xe4\xf3\xad\xac\x0f"
- "\x97\x97\xc2\x8e\x9d\xc3\xba\xe4\xa5\x14\x9e\x17\xf3\xb7\x69\xf8"
- "\xde\x55\x28\x34\xd9\xbf\x4b\xb9\x7f\x5f\x4a\x59\xde\x2e\xb4\xaf"
- "\xdc\x24\x0e\x06\x88\xbe\x32\x51\x38\x64\x4a\x62\xbc\x4d\xae\x93"
- "\x7c\x06\xb7\x8e\xbc\x4e\x0f\xa1\x5e\xcb\xba\xa5\x94\xce\xe7\x97"
- "\xf9\xbb\x2b\x2d\x81\x1a\x6a\x29\xae\xa1\x3f\x86\xd7\x53\xc3\x22"
- "\x8e\x45\xf1\xd2\xf6\x3f\x39\xd7\xf3\xbe\x55\x0a\xee\x9f\xb3\x3f"
- "\xc4\x75\x55\x4d\xfe\xd3\x91\x3f\xd3\x9f\x1a\xfe\x4c\xf6\x47\xe4"
- "\x73\x7e\x53\xfe\x1f\xa9\x29\xe7\x8f\xe4\x6a\x13\x1a\xcf\x95\xca"
- "\x9e\xe1\x3a\x3c\x80\x55\xc7\x67\x7d\xd3\xb5\x4e\x5b\x2a\xda\x6f"
- "\xe6\x35\xf9\x96\x80\x9f\x1a\xe6\x7d\x00\x1c\xab\xfe\xb6\xf9\x0c"
- "\x59\x1a\xe6\xfd\x4e\xde\xab\x39\xcc\xc9\x3a\x6f\x61\x2b\xdb\x69"
- "\x61\x3e\xe7\xcc\xfb\x7c\xb0\xdb\xb5\x4a\xc6\x31\xa2\xf0\xe6\x6f"
- "\xb6\x1b\xe5\x61\xc7\x19\xe5\x65\xac\xa8\x4d\x4c\x0f\xe0\xd4\x3c"
- "\x5d\xd1\xa4\x09\xb3\x4a\x85\x33\xe8\x93\x1f\x4d\x9f\xca\x10\xd3"
- "\x87\xe3\x63\x6a\xe8\x2f\xe0\x96\x03\x1a\x68\x46\x1d\xc0\xd9\xa2"
- "\xaf\x8b\x5a\xd6\x9d\xa1\xb4\x86\x79\xfc\xdd\xad\x97\x1e\xb3\xe6"
- "\x99\x2d\xda\xb9\x53\xdb\x2b\xcf\x92\x99\xfb\x8d\xf7\x42\x2a\xe5"
- "\x7b\x49\xf3\x1c\xee\x33\xf0\x24\xe1\x67\xc6\xcf\xc2\x7c\x87\x2b"
- "\x9f\x97\xf3\x80\x4e\xad\xe8\xab\x3a\xbe\x2a\x5e\xdc\x9d\xcd\x31"
- "\x20\xf4\x79\x49\x6f\x3a\xe4\x28\x2c\xe4\xb7\x6d\x21\x33\x55\xad"
- "\x1a\xe4\x88\xd7\x45\x36\xbf\x4c\x69\x9a\x7b\xed\xc8\x4d\xd0\x75"
- "\x35\x2f\xcb\x33\xa0\xe9\xbc\x56\xb8\x41\x7e\xc7\xe0\xa5\x9e\xf3"
- "\x9f\xab\x87\xf2\x39\xb9\x97\x2c\x26\x5e\x4b\xf1\x1c\xd8\xaa\xf3"
- "\xf9\xd6\xa0\xfb\x65\xe8\xff\xa1\xba\x2f\xe9\x3a\x79\x0e\x97\x65"
- "\xbf\x2f\x1b\x1d\xf6\x61\x93\xd8\x98\x4f\xbc\xa7\x92\xb6\x42\xf8"
- "\xd3\xda\xac\xa2\x25\xd0\x24\xcf\x47\xb6\x04\x22\x72\x4f\x05\xef"
- "\x93\xa6\x06\xfc\x56\xd8\x93\x87\x98\x76\x46\x3a\xef\xc7\xf0\x5a"
- "\xd5\xd4\x80\xf0\x4f\x5b\x62\xe5\xef\x0e\x0e\x97\xeb\xf1\x7a\x7a"
- "\x8b\x0d\xb6\xf8\x12\xbf\x15\x6d\x0f\xf7\xc0\xea\xcc\x4f\x66\x79"
- "\x43\xde\x8c\x9e\xbc\x9d\xf9\x66\xfe\x8e\x2e\xd7\x19\x95\xd6\x6f"
- "\x9a\x13\x65\xb9\xaf\xf4\x34\x65\x87\xbe\xdc\xf3\xfd\x47\xb6\x3f"
- "\xd9\x67\x5a\x2c\xc8\x4f\xd2\x3a\xf3\x4d\x11\xc0\x06\xef\xa7\xcb"
- "\xef\x1f\x86\xfd\xfa\xf7\x84\xda\x21\xbf\xad\x24\xd6\x5a\xcb\x91"
- "\xcf\xcc\x70\xf9\xdc\x3d\x7f\x87\x41\x0c\x1c\x92\xd0\x2f\x52\x78"
- "\x22\xd9\x0d\x65\x8f\x80\x9f\x5e\x69\x67\x79\x8e\x58\x3e\xd9\x61"
- "\x7f\x8a\xed\x93\x57\x66\x31\x3d\x23\x90\xb1\x48\xca\x27\x3b\xc6"
- "\xb4\x53\x52\x19\xf8\x56\xad\xeb\xbc\xb2\xc2\x0b\x19\x74\x69\x02"
- "\x36\xdf\x2b\x25\xcc\x37\xd6\x0e\xf6\x3f\xfb\xa4\x5e\xfa\x7c\xa5"
- "\x7e\x95\xe5\x0d\xb5\x53\x53\xf9\xdf\xa9\x29\xec\x2d\xdf\x7b\xc6"
- "\x6f\x56\xbe\x5f\x66\x86\xfb\x2a\xbf\x73\x81\x57\x0b\x22\x75\xd4"
- "\xd7\x7a\x3b\xcf\x39\x31\x86\xfd\x53\xcd\xbf\x5e\x69\x37\xe6\x9a"
- "\x17\x6e\xc3\xfa\x1c\x8e\x55\x20\x84\x8d\xb4\xd5\x7f\xe5\x7d\x05"
- "\x97\x08\x66\xd2\x98\xa5\xbc\xce\xb5\xde\x06\xbb\x3f\x47\x87\x7b"
- "\x5a\xc1\x45\xfe\x0b\xc0\x65\x9e\x69\xaa\x96\x7b\x3d\x68\xd3\x5f"
- "\xf3\x22\x80\x1d\x49\xfd\x6b\x15\x74\xbc\xcb\xf5\x15\xaf\x83\xbe"
- "\xfa\x3c\xea\xc9\x6b\x09\x1f\x22\x8e\x79\xb2\x59\xc3\xf8\x78\xda"
- "\x46\xba\x9f\x9b\xeb\x14\xad\x7f\x4e\x13\x99\xe9\x98\x03\x4b\x5c"
- "\x58\xc7\xf1\xfc\xba\x2c\x42\xfd\xbd\xb0\xa2\xf8\x9c\x3e\x60\x2c"
- "\xf9\x3d\xef\x27\x41\x4f\x44\x84\xcd\xb4\xef\x9c\x8f\xd8\x97\x45"
- "\x9e\xdb\x5f\x79\xc5\x86\x41\x2b\xe8\x4e\x61\xb2\x4a\x3f\x46\xad"
- "\x22\xe8\x40\xdf\x7a\x24\x3e\xab\x0f\xd4\x47\xf9\xd4\x25\xa3\xae"
- "\xb3\xec\x53\x27\x2c\x07\x4a\x6b\xe4\x5a\xde\x27\x3b\x82\xee\x57"
- "\xed\x3e\x7a\x25\x8b\xf9\x67\x0d\xfb\xd6\x4b\x1d\xfb\xea\x5a\x7f"
- "\xca\xa7\x59\x0c\x83\xcf\x0d\x6a\x8b\x22\xdb\x2b\xbf\x24\xb3\xa2"
- "\xc7\xab\xcf\xb4\x74\x04\x1b\x84\xe7\xd3\x2c\x3e\x33\xa6\xc3\xb6"
- "\x9e\xa2\x57\xc7\x8b\x8a\x4f\x61\x3b\xbf\xba\x46\xf5\x8d\xbc\xcf"
- "\xe7\xf7\xe1\xee\x4c\xc8\xe0\xfa\x23\x35\x5d\xbc\xbe\xbe\xbe\x5c"
- "\xb8\xaf\x6a\xe8\xb4\x7c\x9a\xf5\x80\x8d\x6d\xaa\x57\xeb\x7c\x49"
- "\x0d\x66\x7d\x6d\x4d\xc6\x20\x88\x5f\x13\xeb\xe9\xc3\x8d\xb6\x54"
- "\x2f\x80\x60\x8e\x98\x71\x82\xaa\x07\x77\xb9\xc9\xd4\x0d\x5b\xb0"
- "\xcb\x04\x9b\x7f\x63\x7e\xda\xba\x61\x94\x85\x77\xc3\x4e\xd0\xab"
- "\x67\xc3\x26\xca\xc0\x2f\xdd\x7f\x85\x23\x05\x70\x73\x78\xdd\xb1"
- "\xf9\x0c\xaf\x1b\xbd\xf6\xa0\xb4\xd5\x36\xd0\x48\x0d\xf0\x78\x0f"
- "\xa5\x72\x18\x8d\xe4\xb5\x3f\xa4\x65\x16\x44\xd4\x5e\xa2\x31\xbf"
- "\x5f\x39\x8c\x46\xc5\xd6\xfb\xea\x51\xb5\x36\x58\x2d\x63\xa6\x2d"
- "\xf6\xd3\xb7\x8b\xef\xe0\xef\x54\xbe\x76\x48\xb8\x93\x85\xb8\xc2"
- "\x66\x52\xfb\xfd\xaf\xed\xb1\x56\x2b\xbe\x93\x7b\x67\xe0\x37\xde"
- "\x9b\xd4\xf7\x69\x92\x64\xec\x85\xd4\xa6\x89\xfc\xcd\xdf\xa8\xb5"
- "\xd7\x74\x89\x87\x7e\x5e\x3a\xb2\xf2\x86\x99\x0c\x83\xf1\x29\x98"
- "\xa5\xf6\x78\xf8\x2c\xb5\x8f\x5e\x93\xf1\x18\xd7\x6c\xa0\xb4\x17"
- "\x37\x50\x7a\xf3\x1c\xd9\xae\x76\x25\x8b\x66\x62\x7c\x35\x0f\xcb"
- "\x19\x78\x02\x78\x73\x7d\xcc\x1b\x2d\xe1\xd3\x0d\xae\x12\xa1\x35"
- "\x3c\xc5\xb6\xe8\xeb\xd7\x37\xcc\xdf\x46\xd3\xda\xc2\xea\xdc\xdf"
- "\x0c\xf2\xd7\x02\x5e\xed\x30\x4a\x3f\x4e\xaf\xdf\xea\x2d\x22\xde"
- "\x03\xb8\xba\x61\xfe\x0e\xc0\x7e\xfd\x5e\x1e\x0b\xd6\x82\x3e\x6a"
- "\x4c\x78\x3d\xec\x0d\xb5\x52\x33\xe4\x7b\x6a\xb1\x88\x30\x1c\xe4"
- "\x59\x21\xdb\xbb\xd1\x66\x2f\x50\xe7\xdd\x65\x5b\x7b\xf6\xce\xf4"
- "\x76\x78\xcf\x48\x78\xeb\xbd\xb0\x4a\x8d\x36\x19\xb4\x56\xfc\xf5"
- "\xfa\xe1\x86\xf9\x5b\x88\xfb\x87\xf3\xe3\xb9\xc1\xdb\x81\xbc\x27"
- "\x63\xfb\x85\xf3\xe0\xdd\x97\x80\xfb\xfd\xde\xfd\x5f\xde\x97\xec"
- "\xcd\x53\xb3\x81\xcf\x01\xbd\x36\x76\x23\x68\xa4\xd6\xcb\x5f\x7f"
- "\x8c\x71\xf5\xd1\xeb\x33\xbc\x25\x7f\x4f\xec\xe7\x09\xd9\x07\xdf"
- "\xaf\x68\x91\xfb\x60\xd5\x53\xa6\x86\x35\xa1\xf4\xd9\x1b\x90\xad"
- "\x50\xb6\x0f\x57\xd6\x05\x52\x9f\xdc\xc8\xbe\x35\x6f\x24\x59\x93"
- "\x54\xff\x72\x5b\xd8\x5e\x49\xd4\xc7\x51\x7b\x74\xe9\x8c\xab\xd1"
- "\xc7\xfc\xbd\x3c\x8d\xf7\x59\x87\x81\xde\xdd\x36\x52\xfc\x27\xaa"
- "\x50\xf7\x97\xba\xed\x16\xd2\xc7\xb2\x50\x67\xca\x27\x0d\x7c\x2e"
- "\xcd\xf0\xb7\x85\xfc\xee\x2d\x50\x3e\xcc\x36\xd6\x51\xb5\x26\x25"
- "\x3b\x8c\xa3\x5e\x36\xa0\xfc\x1c\xaa\x1b\x50\x3e\xe1\x5a\x8f\x48"
- "\x86\xde\x71\x43\x4d\xa3\x3d\x6c\x47\x0a\xe8\x2a\x8c\x07\xfd\xbd"
- "\x81\x2e\xfd\x5b\x85\x6f\x2c\x87\x4d\xdd\x9f\xcf\xa5\x18\xb8\x5d"
- "\xdc\x7e\xda\x1b\x93\xd5\xdc\xe6\x0d\x8f\xb1\x5e\x23\x2c\xa0\xb1"
- "\xdb\x2a\xf8\x8c\x1a\x9f\x35\x08\xa4\x44\x72\xfc\x03\xad\xc5\x4a"
- "\x6e\xde\xd8\x0e\x3b\x55\xea\xdb\x82\x10\x7f\x23\x3e\x94\xcd\xfb"
- "\xa5\x98\x37\xf5\xe7\x36\x03\x0e\xe6\x3f\xcf\x64\xa8\xf1\xfc\x8d"
- "\x3e\x7d\xaf\xe5\x9c\xc9\x68\x1b\xda\x24\xdb\x86\x36\xca\xb6\xe9"
- "\xdf\xf2\x39\x4e\x1b\xe4\xd9\xe5\x8b\x6b\xcf\x06\x9b\xa2\x6d\x24"
- "\x87\xbf\x53\x7a\x9c\x36\x7e\x2e\xcf\x1f\xa0\x4f\xd4\xde\xc2\x86"
- "\x3a\x91\xfa\x62\xea\x45\xc2\x54\x31\xa2\xd7\x58\x8b\x5f\xe5\xb8"
- "\x7f\xfa\xf7\xc0\x00\xbb\x19\xba\xbc\x58\x9e\xed\x42\x7d\xfc\x3d"
- "\xc5\x5e\x3d\xb4\x31\x8f\xfb\xea\xc6\x6d\x94\xa3\xf8\x70\xe3\x24"
- "\x5e\xbf\x55\xf3\xbc\x0d\x01\xe8\xde\x7a\x35\xa7\x32\x7c\xb3\x93"
- "\xa4\x6f\x76\xb4\x8e\xbd\x38\x1c\x37\x4a\x7d\x27\x52\x83\x98\x3f"
- "\x6d\x68\x93\x67\xd4\x80\xef\xe2\xb0\xa1\xff\x36\xb4\xb1\x9f\x4f"
- "\xcf\x1e\xfb\x12\xf0\x4a\x99\x3a\xb3\x1b\x74\x6f\x5c\x65\xd8\x28"
- "\xf2\xfb\x4f\x6e\x71\x90\xf3\x4d\x5b\x72\x5a\xee\xc1\x57\xca\xf3"
- "\xe5\x27\xf4\xf3\x4d\x1b\xdf\xd0\xd7\x33\x32\xd9\x2f\x1e\x65\x1b"
- "\x7c\xb4\x4f\xfa\xf3\x30\x0d\xb8\x6e\x89\xbb\xfc\x06\xd3\xc6\xa3"
- "\xbd\x7b\x29\x1b\xea\x65\xba\xf4\x15\xdd\x18\x30\x78\x04\xed\xed"
- "\xaf\xe2\x30\x6e\x78\x6c\xff\x28\x92\x3c\xd0\x29\x6c\xa9\xd7\xd4"
- "\x30\x4f\xd6\x0c\x8f\xa6\xd3\xb4\xb0\xe6\x52\x3a\x68\xa3\x59\x48"
- "\x59\xdf\x68\xfe\x7a\x7b\xa2\xe6\x39\xc3\x16\x51\x74\x4e\x87\x7e"
- "\xa9\x1d\x27\x69\xed\xd9\xd5\xca\xf1\x30\x96\x95\x71\x7c\x9f\x4d"
- "\x37\x71\x1c\xa5\xb0\x67\x57\x28\xc2\x67\xe1\x30\xce\x6a\x9e\xdd"
- "\x96\xe3\xc5\x64\x2a\x28\xe6\xfd\xa3\x4f\xe5\xfc\x4a\xb8\x60\x0b"
- "\xa4\xc2\x3e\x81\x9c\x2f\x9f\x4b\xd6\xc7\x1c\x80\xed\xca\xcc\xe0"
- "\x38\x47\x1c\xe3\x88\xe3\x94\x45\x5c\x99\x43\x70\x3f\x14\xf6\x5c"
- "\xba\xb0\xec\x6a\x67\x1f\x94\x88\x5b\x40\x1f\x1f\xe5\x58\x4b\x26"
- "\xaf\x3f\x44\xcb\x4f\x92\x85\xe3\x28\x85\x2b\x3e\xb5\xb5\x04\xfe"
- "\x21\xe7\x16\x83\x8a\x61\x4f\x6b\x34\x1c\x34\xb7\x69\x29\x9f\xc2"
- "\x5e\xff\xd4\xac\xda\x7d\x5a\xa8\x76\x2b\xbc\x19\x7f\xa5\xe3\xf6"
- "\x58\xca\x24\xee\x9b\xff\x12\x06\x7c\xcd\xf3\xa1\x39\xe2\xf9\x90"
- "\xd4\x19\xba\x26\x2a\x2b\x11\xed\x5e\xd8\xc6\xec\x13\xc9\xe7\x24"
- "\xd9\xc7\x85\xdb\xc8\xed\xe3\xba\xff\x74\xe6\xa4\x8c\x0b\x15\xc6"
- "\xb3\xab\x48\x2f\xd3\x81\x32\x1d\x4d\xd4\xe5\xf9\x50\xb6\xbd\x25"
- "\xa0\xca\x16\xc8\x7b\x2e\x1f\x45\x07\xbd\xcd\x3d\x74\x40\xdb\xb9"
- "\x7d\xdc\xfe\x30\xd3\x04\x34\xd0\xdb\x6a\xeb\xd6\xdb\xc9\x6d\xfc"
- "\x23\x46\x9d\x0d\x68\x27\xda\x2a\xdb\xd9\x8d\x76\x1e\x74\x10\x85"
- "\x56\x47\xf2\xbe\x4a\xfd\x90\x78\x7e\xe8\x3a\x0c\x3b\xba\xb4\x8a"
- "\x30\x0f\x34\xbf\x53\x56\x65\x5a\x0d\xdb\xa4\xcc\x8f\xf9\xa0\x5f"
- "\xb4\xb3\xbd\xef\x2d\xc6\x2f\x5c\x23\xbf\xf1\x2a\xed\x63\xfe\x1e"
- "\xe7\x73\x68\x93\xf6\x39\x95\xb5\x8b\x76\xd8\xa6\x21\x6f\x18\x79"
- "\x1c\x68\x3f\xe6\x8f\xc7\x75\xfc\x39\xef\xf2\x2f\x55\xbb\xac\x45"
- "\x94\xf1\xd1\x23\x1e\x93\xb7\xd5\x43\x46\x5b\x1e\x47\x3e\xb4\xc7"
- "\x06\x58\x03\x65\x0c\x7c\xb4\x73\x23\xf0\x0c\x45\xb5\xa9\xb9\x23"
- "\x04\x98\x7f\xa1\xd4\x3c\x4a\xda\x70\x0a\xed\x38\x45\xb6\xaa\x32"
- "\xd8\x5f\xf7\xb3\xbd\xb8\x79\xe0\x25\xf9\x34\xd2\x47\x9b\x32\x14"
- "\xdf\xc9\x18\x2d\x97\x9d\xa0\xda\x5b\x7b\xe2\xb0\x70\x6c\xab\x94"
- "\x4f\x87\x33\x1f\xc9\x78\x2c\x3c\x66\x04\xc1\x33\xec\x9f\xb2\x18"
- "\x75\x04\x33\x87\x4a\x7c\xdc\x63\x09\xcf\x69\x78\xe6\xef\xf3\x64"
- "\xf0\x9a\x00\xca\xd9\x04\x68\xc6\xf0\x61\xcf\x99\xf9\xca\x34\x4c"
- "\x78\x7e\xe3\x5d\xca\x46\x1d\xf5\x3c\xf7\xdd\x5e\xe6\x37\x3d\xff"
- "\x2e\x8d\xba\x38\x9d\x52\x5b\xd8\x97\xfe\xe6\xbd\x00\x86\x87\xb6"
- "\x0d\x39\x41\x75\xf7\xc6\xca\x98\x5d\xea\x32\xa5\x07\xeb\xd2\x79"
- "\xfd\xfd\x22\xeb\x95\x36\x1c\xfb\x11\x5d\x5c\xb9\xba\x0c\x03\x0f"
- "\xc0\x38\xd4\x17\xee\x17\x4f\x87\xba\xa2\xbe\x60\xad\x7d\x4d\xc6"
- "\xe6\x72\xad\x7b\x8d\x7d\xfc\x22\xd9\xfb\x6d\x1c\x2f\x19\x63\xe7"
- "\x96\x00\x2d\xd8\x44\x16\xd7\x49\x5e\x93\x99\x42\xfb\x6b\xb2\x68"
- "\x33\xe6\xe4\xa2\x33\x73\xc8\x2b\x67\xd8\x9f\x40\xe9\x10\xb6\x49"
- "\xf9\x1c\x9b\x58\x90\x99\x5e\xf9\x9a\x61\xc3\xbf\x79\x6b\xe9\x59"
- "\x32\xa9\xef\x51\xbc\x39\x76\xa2\x5d\x84\xd7\x9b\x34\x47\x0d\xc7"
- "\x17\x4a\x0d\xf2\x3e\xb8\xc3\x88\xd9\x23\x6d\x1f\x27\x64\xae\xd3"
- "\x96\xba\x76\x3e\x8d\xe2\x38\x63\x56\xbf\xb2\xe5\xd4\x78\xfd\x66"
- "\x21\xf0\x4b\xd7\xf7\xd0\xd3\x55\x1c\x9f\xda\x6d\xb5\x67\x50\x97"
- "\x7a\xff\x6a\x04\x73\x18\x09\x77\x3e\x8d\xac\x39\x43\x99\x6c\x07"
- "\x15\x7c\xae\x6c\x36\x9e\x17\x4e\xe9\xb0\x8a\xc8\xff\xcd\xa4\x4d"
- "\x27\x7a\xe3\x90\xf9\x17\x70\xec\x32\x61\xeb\xeb\x7c\x70\xe5\x50"
- "\xe9\x47\x23\x63\x5f\xa8\xef\x95\x11\xad\x7f\x99\xcc\xfc\x7d\x4e"
- "\x5e\xcb\xe3\xb5\x61\x3e\x4b\xa3\xc6\x90\xb7\xcc\x46\x7c\xa6\x3e"
- "\xf7\xe6\x3c\x6a\xbe\xa3\xf5\xc7\xfc\xcb\x1f\x6c\x68\x58\xc4\x63"
- "\xc6\x5b\xb9\x7c\x7e\xa7\x77\x8e\xf3\xd6\x68\x7e\xc7\x69\xec\x5f"
- "\x9e\x23\x69\xf9\x56\x09\xcf\x7b\xf4\x39\xe3\x47\xf6\x9e\x34\x65"
- "\xc3\xf0\x58\xc6\x38\xd4\xaa\x75\xe4\x41\xc0\xa5\xca\x18\xcf\x78"
- "\x5c\x57\xdf\x06\x7d\x6b\x8b\x2f\xe9\x77\x7d\x9e\x05\x31\xd6\xd5"
- "\xa5\xef\x18\xc7\x5d\x72\xbf\x75\xc4\x18\xdf\xe4\xb7\x1f\x56\x0e"
- "\xbb\x7b\xc1\x12\x1a\xfe\xc0\xe5\x16\x19\xf3\x80\xbf\xf1\xa8\xc6"
- "\xdd\xb7\xc2\xbd\x7b\x54\x39\x92\xde\xf2\xbb\x6e\x3c\xc7\x30\x61"
- "\x0c\x56\xb1\xc6\x3a\xd4\xf8\x6b\x9c\x2f\xfe\xf9\xe5\xbd\xf5\xfc"
- "\x7c\x5c\xcf\x38\x8a\x3a\xd8\x57\x82\xe1\x2b\xdb\xe4\x2d\x2e\xcb"
- "\xe7\x59\x73\xd4\xf8\xfa\x96\xff\x02\xb6\x58\x26\xd3\x57\xd3\xe7"
- "\x93\xde\x8e\x7f\x29\xfa\x3a\x29\x79\xcc\x7a\xb2\x7d\x54\xe6\x33"
- "\x0f\x52\x31\x73\xac\xa8\x7f\x2d\xbf\x67\x5e\x6f\xb8\x91\xd7\xe2"
- "\x7e\xfe\x85\x97\xc7\xed\xee\xfc\xb4\xa9\x3c\xd7\x97\xb6\xf8\xcf"
- "\x5b\x47\xa3\x1c\xd2\x86\x7c\x78\x2a\x64\xae\x5c\x4a\xa3\xf8\xfb"
- "\x89\x48\x97\xdf\x86\xf2\x7f\xeb\xe9\xe0\x35\x19\x64\xbb\x66\x3d"
- "\xfb\xd8\x6f\x21\xcc\x2f\xe5\x7e\xa3\xac\x7f\x9d\xb5\x8e\xe3\xac"
- "\xbd\xd7\xe5\xeb\xa7\xfa\x6a\xcb\x26\x3c\x67\x46\x3d\xdf\x66\xac"
- "\xe5\xfb\x68\x4b\x8d\xdc\x0f\x64\x3f\xe2\x79\x3c\x5e\x87\xec\xbd"
- "\xbe\x37\x5b\x36\x29\x5c\xb6\x6c\xda\x5f\x4c\xbc\x56\x7d\x64\xb3"
- "\x8c\x99\xb4\xa5\xd8\x47\x6f\x6d\xd7\xd7\x63\x0e\x49\xbe\x62\x7b"
- "\xf7\x67\x3c\x07\xfb\x57\xc3\x5a\xe4\xe3\x71\xa2\xc0\x49\x39\xca"
- "\x86\x0f\x65\x6b\xe0\x9f\xde\xf6\x6f\x49\xe1\xb5\xbe\x84\x3a\x71"
- "\x03\x91\x2c\x53\x11\x74\x4a\x3f\xae\xb5\x43\x78\x9e\x64\x11\x15"
- "\x5f\xd9\x71\x4d\x03\xcf\x65\xe1\x9a\x8e\x6b\x26\xae\x19\xb0\x1d"
- "\x7d\xcc\x97\x98\xc3\xda\x30\x4f\xb0\x74\xa6\x04\x8b\xfb\x3a\xff"
- "\xc7\xb4\xf1\xae\x7a\x88\x94\x5f\xea\xdb\xe5\xcd\xe8\xcd\x69\x9b"
- "\x88\x16\x84\x45\x97\xfd\xdb\x7c\xce\xe6\xed\x72\xd7\x26\xf6\x07"
- "\x79\x7b\x7a\xac\x3f\xc8\xdb\xb8\x7b\x7b\x07\xd1\x2f\x2c\xf8\x65"
- "\xe3\xbe\xbc\xf7\xf7\x8b\x92\xa0\xfb\x6d\xcc\x57\xb7\x48\x1b\xeb"
- "\xe2\x74\xe2\xdb\x6a\x7f\x9d\xe7\x45\x29\x7f\xcd\x51\xed\xb5\xe6"
- "\xe1\xd9\x22\x06\x5a\xab\xf4\xf6\xe6\xe0\x39\xdd\xee\xc2\xb8\x96"
- "\x02\x9a\x0c\x43\x9b\x07\x0e\x21\x6e\x2f\xe3\xdb\x99\xf2\x95\x3d"
- "\xfa\xec\x23\xc3\xe4\xf6\xfb\x53\x42\x0c\x8f\xc4\x75\xf3\x1a\x0c"
- "\x7a\xea\x74\xe2\x7d\x23\x53\x27\x60\x28\x3b\x08\xf9\x01\xc3\xc8"
- "\xdf\x43\xfb\x61\x24\xed\x26\xae\x0b\x73\x62\x8b\x71\xae\x32\xe8"
- "\xfe\x45\xd1\xc7\x45\x6a\xff\x80\xcb\x06\xa2\xca\x72\xac\x81\x44"
- "\xe5\x51\xa7\x2c\xcf\xb8\x1e\xa7\xb7\x57\xa8\x7a\x7f\x31\xb3\x2f"
- "\x59\x2a\x1b\x01\xfb\xae\xc6\xc7\xf1\x08\xd8\x1e\x1a\xe7\x1d\x1e"
- "\x20\x6f\x8d\x86\x31\x3f\x94\x97\x53\x26\x1a\x8e\xd3\x7f\x8c\x68"
- "\x09\xb5\x5f\xe4\x78\xf8\x0b\xf5\x8d\xb0\xae\x72\xf2\x96\xde\x2c"
- "\xbf\x1b\x7c\x8a\xb6\xfe\xd8\xeb\x97\xf1\xb7\xf9\x7e\x3c\xbf\x67"
- "\xdf\x07\x1e\x1b\x30\xc7\xee\x89\x5f\xa7\x21\xef\x66\x4e\x47\x9a"
- "\x37\xe0\x97\x71\xee\x7a\x7d\xb3\x83\xf9\x4a\xa6\xb6\xa6\xc8\x73"
- "\xef\x8c\x6f\xf8\x87\x0d\x8c\xb3\xe6\x09\xe6\x73\x1b\x5c\x98\xff"
- "\x79\xc3\xc1\x06\x96\x09\xfb\x22\x5e\x2b\xfc\x8f\xcf\xc1\x77\x42"
- "\xab\x08\xe6\x5f\x5c\x1b\xfe\x43\xce\x69\x5c\x61\x71\xca\x9f\x12"
- "\xcc\x67\x9b\xa4\xb2\xac\x9f\x65\x42\x8d\x68\xe8\x4c\x0d\xe5\x05"
- "\xdd\x5b\x2d\x1f\x3b\x55\xdf\x5c\x1c\xdc\xad\x16\xa3\xed\x9b\xf5"
- "\xb6\xa3\x2e\xb9\x37\x37\xa6\x5a\xc5\xf5\x43\x9e\x9c\x3e\xd7\xac"
- "\xd0\xcf\x6c\x0f\xb0\xdf\xa8\x4e\x8b\xaa\x9e\xb1\xe1\xe2\xf0\x38"
- "\x2f\x66\x5a\x82\x3a\xba\xf5\x3a\x02\xff\xcd\x3a\x02\x17\xaa\x03"
- "\xba\xe1\xca\x13\xf4\xcb\xf2\x8b\x9f\x3b\xfe\x32\x57\xf2\x8a\x27"
- "\x94\xa3\x74\xe6\x7f\x7e\x19\xc1\xfc\x2d\x9c\x66\xcd\x93\xdf\xf8"
- "\x31\x51\x39\xc7\x38\x0c\x7b\xfe\x9a\xd3\xec\xec\xa2\x86\x45\x7f"
- "\xa6\x36\xfa\xe5\x1e\x2e\xd3\x0c\xed\x82\x79\x66\x55\xf7\xea\x50"
- "\x5d\xb7\x69\xeb\x21\xa6\xf7\x26\xf4\xc3\xc6\x28\x3e\x6b\x09\xfc"
- "\x99\xbc\x33\x79\x7d\xf5\x10\xaf\x6b\x57\x41\x3f\xe4\x69\xd0\x0d"
- "\xb0\xd1\x23\x92\x1e\xb0\x5f\xd4\x7c\x2b\x92\x2d\xe7\x5b\x7e\x79"
- "\xe6\x6f\xa0\x8c\x5d\xe8\x2e\x6a\xe2\xb5\xef\x48\x77\xbe\x3d\xe8"
- "\xa6\x3c\x8e\x69\xc8\xeb\xce\xc2\x72\x60\xfd\xb4\x70\xb2\x90\xf3"
- "\x29\xd8\xfe\x1c\xd3\xd0\x8b\x59\x65\x04\x76\x74\xcd\x39\xca\xa8"
- "\x81\xed\x09\x9d\x9d\xce\x7a\xbd\x56\x8f\x6b\xb8\xf6\x5c\x6f\x5c"
- "\xc3\xcd\xbc\xd6\xd3\x8a\xfb\x73\x64\x8e\x54\x44\xb2\x37\x9e\xa3"
- "\x91\x9b\x16\x51\xe6\x46\x5e\xcb\xfb\x42\xd9\x3e\x6c\x57\xc8\x18"
- "\x87\xcf\x66\xf2\x7a\x7e\xaf\xed\xb3\x98\x63\xb0\xf6\xe8\x2d\x39"
- "\x17\xbd\x38\x7a\xff\xa7\x1c\x07\xc3\x9e\xa0\x33\x9c\x36\x84\xba"
- "\x57\x7f\x65\x47\x1f\xf8\x41\xbf\xa2\x44\x7d\x6b\xf8\x36\xad\x8f"
- "\x8a\x4b\xf9\xf1\x48\xa5\xdf\x7d\xf4\xab\xb1\x7d\xf1\x44\x64\x63"
- "\x3e\x8d\xe9\xa0\x2c\xe5\xaf\x90\x82\x31\xf1\x57\xd5\xbc\x7f\x5e"
- "\xf6\x0c\xd9\x22\x1b\x67\x24\xb9\xde\xa4\x64\xfe\xa6\x34\xff\xca"
- "\xbe\x14\xed\x63\x8a\x28\x8b\xf7\x1f\xd8\xa7\xc1\xbe\x4c\xe6\x9f"
- "\x3b\xb2\x94\xb2\xa2\x61\x4f\x56\xce\x46\xb7\xdb\xef\x9d\xf7\xe4"
- "\xb3\xcf\x14\xcf\x2a\x99\xfb\xc4\xdc\xa2\xb9\x25\x4b\x64\xd8\x80"
- "\x51\xf2\xdf\x3d\xd7\x16\x4e\x97\x9b\xce\x51\xf6\xc5\xc8\xde\xf5"
- "\xb8\x6d\x23\x22\xbc\x7e\x70\x51\xf4\xfa\x55\x87\xbe\x8f\xe6\xdf"
- "\x24\xf7\x95\xb6\x8d\xf5\x25\x7d\x2c\xfd\xf0\xd7\xaa\x18\x32\xed"
- "\xca\x8f\x41\xe5\xd3\xd6\x58\x39\x06\xd1\xb8\x63\xf4\x5e\x3a\xef"
- "\x87\xa0\xaf\xb2\xbc\xa5\x27\x08\x76\xc8\x38\xde\x67\x69\xe6\xb5"
- "\x0c\x69\xfb\x6e\x7b\x53\x8e\x61\xa7\x64\x1c\xaa\x2d\xc7\xf0\xcc"
- "\x7e\xef\x9a\xc8\xdf\x18\x79\xd6\xb6\x45\x7b\xd6\xf6\x0b\x21\xf2"
- "\x37\x68\xa7\x1d\x1b\xc5\x69\xc7\x06\xe1\xd9\x9d\x09\x19\x1b\x7e"
- "\x82\xb6\xed\x0c\xbb\xe9\x5b\xf8\x0d\xe8\x8d\x21\xb0\xed\x0f\xb9"
- "\x6d\xa2\x1b\x3f\x4d\x78\xea\x27\x47\xed\xa1\xf1\x3b\x79\x66\xa3"
- "\x78\x3e\xfb\x52\x6d\x8b\x70\xdd\x62\x75\xfd\x0f\xfd\x2e\x47\x32"
- "\xf2\x47\x14\x2e\xef\x5c\xee\x5d\x75\x9c\xd4\xbe\xe9\x3b\xb6\x06"
- "\xb9\x66\xfc\xce\xaf\xb9\x1c\xef\xb3\xb1\x0d\xed\x6d\xe3\xb9\xc5"
- "\xaf\xb6\xb0\x1f\x1e\xdb\xcf\x9b\x86\x50\x7a\xd5\x10\x4a\x0b\xba"
- "\xdf\x99\xd8\xe3\x63\x61\x51\x63\x2a\x8f\x6b\x1c\x8b\x18\x3a\x27"
- "\xc8\x63\x24\xe3\xc1\x7c\x0a\x98\xc5\xbc\x07\xa7\xce\x15\xbd\x53"
- "\xea\xa3\x22\xff\xc5\xeb\xdc\x77\x64\x6c\x1b\x61\x72\x89\x31\x6b"
- "\x68\xa6\xdc\x1f\x55\x3e\x87\x66\xc8\xa5\x47\xb5\xe7\xdd\x2f\xe4"
- "\xfe\xf9\xa2\x93\x75\x90\x9b\xf2\xda\x2e\x4a\xd3\x3c\x07\xd6\xb0"
- "\x1d\xd3\x5c\x2a\xf7\x95\x2d\x28\xb7\x9d\xf7\x9d\xe5\xb9\x3c\x19"
- "\xe7\xfa\xcf\x54\x7b\x96\xcc\x6d\xf4\x4e\x88\xd7\xda\x7b\x69\xfb"
- "\xee\x14\xde\x5b\x11\xab\x77\x36\x58\x4b\x4d\x1e\x86\xa1\x9d\x3b"
- "\x95\x6d\x94\xc3\xd8\x3d\x80\xcb\x1d\xa3\x77\x6f\x92\xe5\x38\xaf"
- "\xfc\x3e\x62\xfa\x0c\x8c\x63\x4e\xce\x1f\xc6\xf3\x66\x2d\x3d\x4f"
- "\x40\xde\x22\x8b\x22\xdb\xf1\x6e\xba\xe6\xf9\xca\x8e\xb4\x7c\xb9"
- "\xc6\x8b\x79\xb9\x8c\x77\x62\xf9\x34\xcb\xeb\xfb\x57\x83\xc4\x87"
- "\xfd\x58\x4b\xa0\x9b\xa4\xdd\xf7\xee\xf3\x9b\xbf\x20\x73\xf1\x1c"
- "\xee\xc3\xf7\x6c\x3a\xdf\x6c\x55\xf8\xbd\x77\x79\xe7\xea\x0f\xa9"
- "\xd3\x12\xca\x0a\x98\x2c\xb4\xdf\x16\x62\x9d\xe8\xdb\x6f\xeb\xc2"
- "\xdc\xe1\x5d\x9f\xcf\xb4\x33\x4b\xd9\x1c\xaa\x1c\xef\xed\xc0\x1e"
- "\xed\x48\xb6\xa5\x4f\x0d\xba\xdf\x23\xc3\xbf\x82\xbf\x29\xce\x7b"
- "\x3c\xa0\x6f\x2b\xd3\xcd\x47\xdb\x8a\xe4\x3a\xff\xca\x47\xdb\xd1"
- "\x9e\xfe\xec\x03\xc7\x74\xe6\xf3\x0d\x56\xdc\x8b\x45\x22\xdb\x1a"
- "\xce\x31\xd5\xca\x73\x8d\xf2\xbc\xfc\x58\x3d\x66\x4b\x96\x1e\xc3"
- "\x65\x14\x3f\xab\xf3\xf6\xef\xf5\x9c\xff\xe7\x38\x35\xec\x3b\x10"
- "\xd1\xfd\xea\x64\xfc\x96\x33\x6a\x7f\x94\xfd\xea\x78\x7d\x90\xcf"
- "\x07\xf2\x1e\x26\xca\xd5\xf5\xf8\x39\xca\x73\x31\xef\x6d\x37\xe2"
- "\xb6\xe0\x7e\x6f\x8f\xbf\x0e\xda\xde\xe9\x09\x65\x06\xd2\xac\xbe"
- "\x80\x27\x58\x8c\x77\xad\x90\xdb\x0b\xc5\x0d\xe4\xef\xbb\x10\xc7"
- "\xb2\xd0\x52\x0f\xd4\x73\x3c\x8b\xfd\x01\xd2\xcf\x04\x6f\xbf\x4d"
- "\x3f\x3f\x9e\x7c\x8a\xde\x3b\xdb\xbb\x97\x18\xd1\xd7\xc1\xb6\xcf"
- "\x54\x76\xd8\xf6\x99\x72\x1d\x6c\x75\x28\xfd\xe7\x4b\x43\xa6\xed"
- "\x4b\x7d\x26\x75\x4e\x60\xfb\x74\x1f\xd5\x7b\x0c\x7f\x14\xe4\xcb"
- "\xe8\x2b\x96\x95\xf0\x34\xad\x51\x30\x7f\x2d\xd7\x30\x7a\xe7\x35"
- "\xbf\x56\xfb\x64\x2b\x87\xcd\xd4\x78\x0c\x4c\xfd\x6b\x9e\xf4\xad"
- "\x28\x3e\xc3\xeb\x61\xfd\xd5\x1c\x4b\xe5\xd1\xfd\x22\x2f\x3d\x11"
- "\xfb\x3c\x84\x9f\x15\xcd\xb6\xb7\x19\x6b\xeb\xeb\x4c\x1a\xc7\x36"
- "\x16\xae\x3a\x11\xf0\x16\x07\x08\xf6\x95\xdf\x8b\x31\x15\x75\x08"
- "\xe8\x87\x01\x28\x73\x39\xd3\x5e\xc9\xd0\xaf\xd7\x4a\x9c\xdc\x77"
- "\x0a\x17\xdb\x95\x7e\xf6\xed\x38\x43\xc8\x37\x18\xf9\x26\x35\x96"
- "\x76\xb0\x7f\x4a\x39\xc7\x90\x6b\xd3\xeb\xf6\xa7\x34\xad\xb9\x26"
- "\x8d\x66\x06\xdd\xbf\xce\xf7\xd1\x4a\xdb\xc5\xcb\xf6\xaf\xf3\x2f"
- "\x64\x63\xa8\x31\x2f\x87\xfa\x9a\xa7\xf0\x3c\xf4\x46\xd4\x3f\x45"
- "\x30\xfe\xbf\x99\x14\x36\x85\xa8\xdb\x34\x40\x7c\xb7\xdc\x49\x61"
- "\xf7\x00\x11\x59\x8a\xfe\xea\xb4\xc1\x8e\x6d\xa2\x96\x70\xa3\xf4"
- "\xfd\x80\xcc\x5a\xcb\x02\xe2\x8c\x37\xbc\x43\xfa\xc2\xaa\x33\xe3"
- "\xbf\x19\xef\x0d\xef\xa3\x96\x62\x3f\xb1\x5e\x38\x46\xbf\xb9\x9e"
- "\xf1\xba\xb1\xb8\x9c\x46\x9f\xe2\xf7\xbf\x6e\x57\xe3\xdf\x6f\x26"
- "\xea\xd7\x0c\x8e\x35\x18\x8d\xd3\x3d\x0b\xe7\x3d\x59\x32\xf7\xd9"
- "\x79\xa3\x73\x67\x2f\x9a\x5d\x64\xbf\x5f\xb9\xd2\xc5\x8c\x4b\x96"
- "\xde\x18\xca\xef\xcb\xb1\x82\x6d\x10\x8e\xa5\x7c\xa1\x38\xca\x46"
- "\x0c\x65\xe8\xb5\x91\xbc\x6e\xf7\xbf\x19\x47\xd9\xb0\x31\x38\x86"
- "\x72\xef\x1a\xf6\xfb\x87\x7a\x64\x40\xfb\x28\xc8\xcf\x7c\x4e\x52"
- "\x73\xff\x26\x8f\xe5\x68\xb3\xf4\x3b\x7b\x7f\x72\x74\xdc\x1f\xf6"
- "\xb1\xe3\x75\x0f\xa4\xcf\x34\xce\xa4\x82\x17\x31\x56\xbc\x5f\xdc"
- "\x7b\x46\xe6\x7d\xe8\xff\x5f\xef\x55\xf2\x2b\xf3\xae\x31\xf6\x7a"
- "\xf5\x6f\x57\xc9\xbd\x69\xcd\x1d\x9c\xa8\xd6\x57\xde\x7f\x69\xb3"
- "\x36\xc0\xa2\xd6\xf6\xdf\xaf\x37\xce\x5f\x29\xd9\xfc\x48\x97\xcd"
- "\xf7\x0f\x5d\x68\x3f\xbe\x57\x36\x76\xa4\xf5\xca\xf5\x3f\xf5\xb2"
- "\x3b\xd2\xbe\x6e\x2f\x5f\xb7\x73\x2f\x3b\x41\xbb\x46\xf0\x9a\x0b"
- "\xee\xaf\xc2\xbd\x3c\xf7\xa9\x7c\xd1\x77\x7e\xae\xdf\xa3\x8e\x9d"
- "\xcd\xfa\xfd\x15\xb8\xdf\xa9\xdf\x0f\xc3\xfd\x26\xfd\x1e\x32\xbb"
- "\xf3\x79\xfd\x3e\x03\xf7\xcf\xe8\xf7\xd0\xf1\x3b\x1f\xd4\xef\x87"
- "\xe2\x7e\xbc\x7e\x7f\x39\xee\xaf\xd5\xef\x21\x83\x3b\x07\xea\xfb"
- "\xa2\x16\xe0\xfe\xd5\xc5\xdb\xdd\x3b\x1a\xd5\xde\xdb\x4e\x33\x74"
- "\xa5\x7e\x56\xad\x27\xcd\x06\x9e\x76\x18\xf4\x45\x3a\x9f\x35\xb7"
- "\x20\x3d\xcb\x47\x6f\xa5\x47\xa5\x6f\xd3\xf3\x4f\xc6\xf8\xd2\x16"
- "\x95\x5e\xa7\xa7\xcf\x84\x6d\x39\x36\x2a\x7d\xbd\x9e\xee\x84\x5e"
- "\x2c\x8a\x4a\xf7\xe8\xe9\x55\x3e\xaa\x99\x18\x95\x5e\xaa\xa7\x6f"
- "\x35\xfc\x10\xf4\xf4\x62\x3d\xbd\x01\xe9\x81\xa8\xf4\x42\x3d\x1d"
- "\xfa\xff\xfd\xa3\x51\xe9\x52\xaf\x54\xca\x73\x5b\x56\xb1\xbf\x94"
- "\x65\x6b\x27\xef\x11\x46\xe3\x9c\xab\xca\xee\xca\x40\x7a\x5a\x54"
- "\x7a\x8e\x9e\x3e\xca\x47\x9f\x6f\x89\x4a\xef\xd3\xf6\x4d\xaa\xa6"
- "\x99\x7d\xad\x4d\xf2\xb7\x7e\xa4\xff\xa3\xb4\x19\x77\xcf\xe5\x33"
- "\x5d\xd6\x4d\xe2\x98\xbd\x4c\x88\x63\xb4\x3b\x4f\xf7\xfb\x2b\x65"
- "\x3f\x2c\x75\x36\x6e\x77\xb6\x3c\x2f\xc5\x71\x0c\xf9\xbc\xdc\x52"
- "\x4e\xdb\x25\x63\xe5\x8d\x71\x96\xab\x18\x87\xca\xaf\xb4\x43\xce"
- "\xd1\xf5\xfd\x4b\xe4\xe1\x6f\x24\x12\xc3\xe1\x75\x3c\x6f\x49\x97"
- "\xf4\x75\xe4\x39\x12\xa7\xf1\x5c\x55\x9e\xa1\x8a\x9a\x2b\x29\xbd"
- "\xbf\x7b\xae\xc6\x67\xdc\xdd\x6a\x3e\xcf\xb2\xc8\xf9\xd9\xe7\x26"
- "\x3a\xaf\x8f\x76\xcb\x79\x6e\xb2\x6d\xf0\xdb\x41\xf7\xee\xc9\xbd"
- "\xe7\x7a\x76\xd5\xe9\xe9\x5b\x90\x3e\x33\x2a\x7d\x4d\xdf\xba\x1d"
- "\xfa\xce\xb2\xcb\xd2\x7d\x4e\x04\xc2\xe7\x44\x68\xdd\x7f\x01\xef"
- "\x39\xf2\x8c\xca\xb7\x23\x9e\x5d\x36\x3d\x5e\xc4\x67\xe1\x45\xc2"
- "\x0f\x9d\xcd\x71\xfa\x2f\x99\x1a\xf0\xd3\xd4\xe2\xa0\x58\xfb\x04"
- "\xfb\xcf\x9d\x95\xb1\x93\x5c\x1d\x1c\xc3\x98\x7d\xb2\x02\xbc\xef"
- "\x93\xd6\x82\x31\x6e\xf3\x1c\x7e\xff\x0f\x9a\xe2\x80\xed\xed\x88"
- "\xd0\x66\xc0\xde\xf4\x84\xe1\x0f\xc9\x31\xe0\x75\x1f\x45\xe0\xc0"
- "\xf5\xb9\xe4\xf7\x36\xea\x65\x6c\x0e\xfe\x9e\x98\x58\x3b\x24\x5d"
- "\xfc\x8e\xed\xd7\xe0\x4c\xeb\x0a\xc2\x5c\xa9\x7e\x1c\xee\xf3\xe4"
- "\x8f\xdf\x21\xbd\xaf\x36\x29\x59\xae\x77\x2a\x5d\xb3\xcb\xa3\xf4"
- "\x45\xbd\x53\xbc\xc5\x67\x74\xea\xf9\xfc\x8b\x05\xb6\x72\x42\xbf"
- "\xaa\xe5\x9b\xc8\xd4\xbd\x1a\xb6\xc9\xa9\x7a\x93\xd2\x4f\x7b\x1c"
- "\x9a\xc9\xb2\x82\xd7\x0b\x65\xac\xfd\xd5\x07\x0e\x6e\x9b\x17\x32"
- "\x35\x2f\x6d\xe3\x53\xdb\xb6\x19\x21\xf6\xff\xae\xff\x62\x50\x09"
- "\xc7\xad\x0a\xa5\xc3\xee\x34\xbd\x8f\xf7\x1f\xce\xab\x37\x85\xa5"
- "\xbd\xb2\xc7\x21\xd7\x98\x3c\x07\x6a\x78\x0c\xf1\xb6\x46\xd8\x66"
- "\x4e\x83\xcd\xbc\x06\xfa\xdf\x12\x59\xec\x18\x12\x5e\xe0\xb8\x64"
- "\xd3\x7c\x4a\x8b\x2c\xc8\xcc\x78\xe5\x1c\x65\x1b\xe3\x0f\xe6\xa6"
- "\x59\x22\x68\x4b\xad\xc4\x98\xc2\x73\xd7\x41\x49\xe9\x72\x2f\x8d"
- "\xef\x35\x53\x6d\xde\xe6\x45\x17\xfe\x6e\x48\x04\x73\x56\x8e\xe5"
- "\xcb\xb8\x24\x6a\xeb\x9a\x0d\x98\x07\xeb\x67\x4a\xcb\x3e\xa7\xa1"
- "\xb0\x73\x4d\x83\xce\x8a\x86\x13\x45\x64\xe2\x6f\x2d\x94\xcd\x96"
- "\xeb\x43\xfd\x9a\x1d\x61\xf2\x3a\xff\x4e\x65\xf3\xb9\x8f\xf6\xec"
- "\x63\x3b\x8d\xfd\x21\x91\x3f\xfd\x04\xed\x69\xb6\x86\x30\x66\x84"
- "\x60\x3b\x3f\xc5\x73\xbd\x3d\x9f\x05\x64\x2c\xd1\x0f\x46\xb2\x4f"
- "\x78\xc3\xfc\xbb\x39\x2d\xe2\xfa\x5c\xfa\x3e\x94\x2b\xd9\xda\xd3"
- "\xca\xcf\x2e\x3e\xe3\x9a\xfa\xa7\xc6\x77\xbb\x42\xfd\xd4\x1a\xc4"
- "\x9e\xbf\xe9\xe3\x03\xa9\x39\xd7\x9e\xf3\xce\xe2\xf5\xac\x8d\x7a"
- "\x3e\xc8\x14\x1c\x5f\xba\x26\x4c\x53\x03\xc2\x27\xf7\x29\xf9\x6c"
- "\xbf\xf3\xce\x06\x71\xae\x8a\xd4\x79\xb4\x0f\x36\x69\x15\x1f\x64"
- "\xaa\x18\x80\x1f\xc8\x18\x9d\x72\xcd\xb2\xe2\x83\x6c\xb5\x46\xfb"
- "\xc1\x64\xb5\x66\xf9\x41\xfe\xca\x61\xec\x83\xfc\x41\x4d\x67\xca"
- "\x07\xb0\x99\x3f\x28\xee\x4c\x3d\x94\x90\x3f\xd4\x78\xb4\x3b\xdf"
- "\xfe\x6d\xca\xe0\xb5\x72\xf6\x27\xae\x55\x7e\xc4\xa8\xe3\xb7\xec"
- "\x57\xcc\xef\xae\x3a\x56\x4c\xc9\xbc\xbe\x88\x7a\x4f\x8e\xa9\x21"
- "\x3b\x70\x1d\x28\x2c\x1f\x58\xa4\xef\x96\xe7\x03\x9b\xb7\x43\x34"
- "\xb0\xcf\xa0\xda\xd3\xf8\xed\x36\x91\xf2\x81\x45\xe5\xff\xed\xf8"
- "\x96\x0e\xb4\xc1\xb2\xa7\xd5\x1b\x3a\xa9\xdb\x84\xbf\x05\xef\xef"
- "\x69\x15\x9e\x3d\xed\xea\xac\xf8\x6f\xd7\x1a\x7a\x55\xf1\xe8\x6f"
- "\x57\x28\xba\xed\xce\x57\x74\xfb\xed\x36\x7d\xbc\xba\x8a\xef\x31"
- "\x76\x67\xa9\x3d\xf8\xdf\x3a\x0d\x1b\xd9\xa7\xe7\xe1\x32\xb8\xd7"
- "\x63\xe1\xfc\xb6\x1a\x6d\xd7\xe7\x2d\xbf\x95\xdf\x0a\x43\xfb\x30"
- "\x66\x7d\x70\x84\xdb\xd5\x97\x6e\x95\xb4\x28\xa5\x64\xe0\xcc\xe7"
- "\xd9\xd9\xc7\x38\xe0\x0d\xdc\xd9\xa0\xbe\x07\xb8\xef\x56\x79\x66"
- "\x16\xf5\xa0\x7f\x4c\xac\x37\xf9\x8c\x2f\xc3\xeb\xc5\x7f\xef\xe5"
- "\x06\x2e\x5c\x1f\xbf\x43\x5b\xf9\xbb\x62\xa0\xd5\x1e\x39\x9f\xe6"
- "\x7e\x3d\x5e\xcc\x6b\x17\x67\x41\x33\xf6\x03\xda\x37\x91\x69\xa2"
- "\x68\xb6\xcf\x2e\xe9\xd1\xd3\x0f\xfb\x2e\x8b\xa5\x87\x7a\xd6\x2c"
- "\xd0\x0d\xf3\xd9\x1f\x64\xdf\x44\x9d\x7e\x1d\x7a\xfd\x5f\xea\x73"
- "\x75\xbc\xdb\xfb\xcb\xa8\xb2\x57\xf6\xe4\x55\xdf\x9e\x34\xf1\xde"
- "\x2a\xaf\xb5\x2b\x7e\xdd\x7b\x24\xaa\xdc\x91\x82\x2f\xd9\x46\xde"
- "\xd9\xca\xdf\x0a\x64\x9a\x07\xdd\x7b\xdb\x7b\xe9\xad\xe0\x24\xa8"
- "\xe3\xdb\x46\x1d\x3e\xda\xbb\xd5\xc0\x13\xf7\xfa\x18\xbc\x6f\x54"
- "\x6f\x9f\xec\xcd\x35\xca\xb1\xff\x3e\xfa\x28\xc4\xe7\x05\x13\xea"
- "\x41\xde\xd3\x19\x0e\x1d\x1c\xbe\xb3\x41\xf2\x23\xed\xdb\xc2\xbe"
- "\xae\xa0\x6b\x48\xf1\xd0\x3e\x8f\x1a\x0b\xf7\xc9\xd8\x2d\xbc\x5f"
- "\xc2\xb1\x88\x51\x5f\x0d\xe0\xd6\xeb\x38\x6f\xd7\x71\xc0\xfc\xef"
- "\x83\xad\xf1\xf3\xba\xbb\x67\x15\xca\x83\xb1\xa3\x17\x16\xc7\xc7"
- "\xa9\xb4\xf4\x9e\x81\xdc\xd7\x11\x75\x86\x74\xbb\xa2\xf7\x87\xd9"
- "\x98\xa7\xee\x58\xa7\xe6\xad\xf5\xeb\xd0\x67\xae\xb3\xff\x1f\x7b"
- "\xef\x03\x17\x75\x95\xee\x8f\x9f\x19\x06\x1d\x74\x60\xd0\xa8\x26"
- "\x43\x9d\x4a\xdb\xb1\x55\xa3\xcd\x76\xdd\x5d\xdb\xa5\xb2\x5d\xb7"
- "\x4d\xa1\xd6\xee\xb2\x37\xff\x20\x82\x8b\xa5\x38\x21\x22\x1a\x02"
- "\xa2\x71\x81\x1d\x90\x55\xf0\x4f\xfc\x91\xbd\xd7\xf6\xd2\x5e\x2b"
- "\xbb\x6b\xf7\x4b\xbd\xac\xa6\xfc\x87\x09\x0c\x16\x16\x1a\xe6\x88"
- "\x68\x64\x68\x23\xa0\x8c\x30\xf3\x39\xbf\xe7\x39\xe7\xf3\x61\x66"
- "\x80\x81\x61\x40\xb3\xdf\xca\xeb\xf5\x79\x7d\xf8\x9c\xcf\x99\xf3"
- "\x39\xe7\x79\xde\xe7\x79\x9e\xf3\xef\x79\xc8\x18\x8c\xb1\x91\xa2"
- "\xa7\x17\xaa\xf5\x30\x96\x56\x1e\xc2\x18\x31\x4d\x29\x57\xc8\x08"
- "\xdc\x4b\x81\xf2\x06\xf7\x6a\x52\x3f\x48\xcf\x3a\xd4\xe4\x38\xa7"
- "\x66\x6c\x84\xb1\x6d\x59\x0e\x8c\x65\x53\x2f\x92\x31\x7c\x6f\xc4"
- "\x07\xab\x70\x4e\x87\xa6\x46\xbc\x2a\x64\x1e\x6a\xc6\x33\x90\xd5"
- "\x30\x22\xa4\xa9\xb1\xaf\x0a\x59\x87\x00\x8b\x87\x6c\xa9\xcb\xc9"
- "\x68\xd4\x6f\x38\x37\xc4\x31\x63\x3c\x00\xe5\xa2\xdf\xa4\x52\x81"
- "\x46\xc8\xa8\xf2\x70\xa8\xa0\xac\xcc\xcc\x11\x08\xdb\xfb\x0d\x38"
- "\x93\x37\x90\x0f\x0e\x52\xbf\xc3\xa1\x18\xfb\x0f\xe7\x79\x4c\x56"
- "\xa8\x67\xd6\xe1\x50\x78\x17\x00\xef\x2e\xc3\x5d\x40\x5f\x65\xe8"
- "\x1f\x1b\xca\x67\xfa\x93\x66\x1e\x0e\xe5\x75\xb7\xb0\xbc\x0d\xe4"
- "\xc3\x89\x98\x47\xf2\x81\x26\xa4\x46\xf8\xe0\x7b\x3c\x53\x6b\x87"
- "\xdf\x99\xa0\x87\xf2\xdf\xd4\x75\xfd\x46\xb4\x9f\xa1\x2f\x1b\xdf"
- "\xa7\xd9\x35\x5a\xc8\x5b\x8e\x7b\x4d\xb9\x2d\x6b\x2c\x17\xfb\x3a"
- "\xd8\xc7\xc6\x77\xc5\xff\x55\x5d\x79\x53\x23\x48\xca\x35\xa2\x61"
- "\xeb\xa5\xab\x7d\x40\xf6\x1a\x81\x2e\xb1\xc4\xa9\xcc\x73\x58\x9e"
- "\x01\x7d\xab\xc5\x10\x15\xc8\xe5\x91\x50\x6f\x8c\x31\x71\x06\xe7"
- "\x60\x45\xda\x34\x02\x9f\xf6\x6c\xe2\xfe\xf3\xf6\xe6\x00\xf6\x53"
- "\xd6\x81\x3d\xb0\x8e\xa8\xd6\xd9\x49\x30\xb6\x13\xf8\xd6\x84\xfb"
- "\xa5\x71\xec\x86\xb4\xe1\x3c\x3c\x3c\x0f\xda\x12\xbd\x2e\x96\x36"
- "\xae\x6b\xa6\x4d\x55\xb1\x75\x04\xf4\xcc\xe8\x6a\x7d\x0d\xfa\x7a"
- "\x3e\x83\x6d\xc5\xb9\x47\xa0\xe9\x3c\x33\x7e\x23\xeb\x70\x34\x9e"
- "\x81\x61\xf3\x04\xf2\xf7\xf7\x49\xe7\x85\x4a\xd8\x99\x22\xe3\xb4"
- "\xae\xf9\xae\x44\x7a\x40\xac\x4b\x85\x80\xff\x27\xb2\xb3\x7c\x23"
- "\x70\xfc\x83\x73\x1a\x0b\xd7\x94\x76\x9d\xbd\xe0\x73\x03\x46\xbd"
- "\x93\x0f\x2b\xf6\x5b\x9c\x23\xc0\xdf\x86\xd9\xe8\x95\x4d\x62\x5e"
- "\xfc\x6d\xd8\x9a\x85\x14\x7f\x0b\xbf\xd9\xd5\xf5\x1b\x97\xb3\x3b"
- "\x1f\x72\xbb\x02\x68\x8b\xff\x5b\x80\x96\xe2\xde\x28\x2d\x5f\xd7"
- "\x36\xd6\x4b\x6b\xc9\x66\xf2\x41\x3e\xe2\xa9\x77\xff\xcc\x1f\x29"
- "\x5c\xfd\x09\x7d\x54\x8b\xbe\x8e\x20\x3d\x58\xf2\xfb\x03\xff\xeb"
- "\xa0\x2c\x7e\xb6\xc9\xc9\x9f\x57\xae\x93\x6f\xc0\x54\x0b\x3d\x8b"
- "\x38\x01\xb9\xe2\x73\x81\x7c\x84\xbe\x19\x32\xf9\xf9\xa7\x8f\x0e"
- "\x62\x3d\x1b\xc8\x47\xf9\xf0\xac\xe6\x7e\x07\x3e\x7a\x45\x94\x1f"
- "\x49\x61\x76\x9b\xda\x0c\xdf\xc4\xb3\x3c\x4e\xcf\xc9\x20\x4f\x02"
- "\x21\xdf\x3b\xdc\x77\x1e\x5b\x51\x94\x75\x7b\x9f\xd6\xed\x39\xb4"
- "\xdb\xb3\xb6\x0d\xfa\x8d\xbb\x35\xf3\x9c\x31\x6c\xbe\xb0\x28\x60"
- "\x3d\xd1\xa7\x7e\x43\x7c\x00\x2b\xe7\xb0\x6e\xd5\x4d\xcd\xd8\x26"
- "\x35\x4d\x0f\x21\xa6\x26\x1b\xb7\x2d\x41\xa7\x37\x4c\x80\x3c\xdf"
- "\x90\x3b\x70\x3f\x37\xc6\x99\x80\xfc\x17\xb8\x5f\xe8\xfd\xf3\xe7"
- "\xad\x1a\x41\x84\x3f\x47\x8c\xa4\xf2\x70\xd4\xdf\xca\x37\x3a\xcc"
- "\xbe\xb8\x7e\x95\xb2\x03\x30\x69\x27\x77\x00\xc6\x1a\x31\xa6\x17"
- "\xc6\x5c\xff\xaf\x8e\x26\x5f\x93\xed\x24\xd1\xbf\x40\xe4\x17\xc8"
- "\xfe\x70\x45\x32\x51\x6c\x3a\x4f\x02\x81\xaf\xb6\xfd\xb6\xe9\x44"
- "\xf2\x1b\x50\x34\x9a\x9f\x79\x2e\x02\xf9\xba\x52\x43\xad\xed\xe9"
- "\x1f\xef\x36\x93\xbf\x19\xa5\x31\xb6\x81\xc7\x92\x50\xc0\xf7\xef"
- "\x92\x8b\x3e\x12\x38\x6d\x3f\xfe\x86\x9f\x9f\x0a\xfa\x29\xfc\xc6"
- "\xec\xb0\xbf\xf7\xf3\x7d\x84\x99\x95\xbb\xb9\xec\xdb\xbf\x6c\x3f"
- "\x8c\x96\x36\xf2\xbd\x07\x41\xed\xe9\xfb\x55\x5d\x7b\x0f\xd8\xbc"
- "\xd5\xfe\x65\xc0\xc3\xdd\xdc\x36\xaf\xdc\xbd\xd0\xae\x14\xfb\x20"
- "\xa6\xbf\x53\x87\xbf\x85\xdf\xa9\xdb\xd8\x1c\xd3\xfe\x59\x0e\xac"
- "\xed\x0f\x44\x99\x0f\x6d\x82\xf2\x3e\xde\x88\xed\x42\x9a\x40\x3e"
- "\xc0\xd9\xc7\x99\xfb\x77\xb9\xf1\xa1\xaa\xfc\xbf\x4c\x1b\x9b\x03"
- "\xb1\x2a\x01\x4f\x17\x81\x07\xb7\xa1\x9f\x24\x13\x7c\xa7\xaa\xa4"
- "\x83\x54\x69\x5a\x49\x35\xfc\x8f\x7b\x8c\x8d\x2f\x9c\x25\x8d\xda"
- "\xde\xf5\x8d\x00\xe3\x08\xb0\xb5\x35\x58\x16\xca\x02\xdc\x97\x65"
- "\x02\x0d\x56\x6d\x81\xb2\x1a\x09\x2b\xa3\x4a\x68\x22\x55\x49\x30"
- "\xce\x32\x8c\x0e\xac\x2e\x39\x49\xaa\x35\x9f\xb1\xef\xa0\x4d\x68"
- "\x8c\x6f\xed\xab\x6c\x1d\x94\x3d\x5d\x2c\xbb\x19\xca\x0e\x72\x5b"
- "\x76\x66\x7b\xe4\x00\xcb\xf6\xbc\xde\x99\xed\xe1\x03\x29\x1b\xf4"
- "\x8c\xc1\xa4\xe1\xe7\xb5\x52\xee\x22\xfe\xf6\xab\xe8\x23\x73\x3c"
- "\xe5\xfb\x5c\x0f\x3e\xc6\xce\x74\xa5\xb3\x7d\xc4\x99\xec\x6c\xd7"
- "\x25\xc2\xf6\x2a\xf2\xf3\x5c\xe7\x08\xee\x73\x68\x4f\x3f\x38\xd9"
- "\x31\x56\xea\x5a\x7f\x02\x5b\xf5\x60\x38\xdf\xcf\x78\x28\x93\xe3"
- "\xea\xa0\x2f\x96\xd5\x7b\x3d\x0e\xef\xe5\xfb\x62\x0f\x66\x49\xf3"
- "\x2f\xad\x7e\x87\xf7\x8a\x65\x69\xbb\xcf\xeb\x49\x41\x3d\x63\x92"
- "\x12\xa4\xf8\xa0\x09\xe2\xb1\xd2\x67\x63\x16\xc7\x2c\x4d\x8c\x89"
- "\xd6\xce\x5d\x15\x1f\x37\x65\xc5\x92\x25\xda\xd9\x31\x2b\x57\x2e"
- "\xfa\x73\xcc\x08\x32\x37\x7e\x51\xdc\xca\xa5\x38\xf7\xa6\xd5\xce"
- "\x7c\x78\x61\xec\x8a\x84\x29\xbf\x9a\x19\xd2\x6d\xee\x0d\xcf\x20"
- "\xd6\xa3\x0d\x0e\xba\xe3\x8e\x14\x3b\x19\x85\x3e\x6f\xd4\x6b\xa8"
- "\xf1\x65\x18\xff\x01\xfe\x2e\xa0\x9e\x42\xdd\x80\x63\x03\xf4\xb7"
- "\x07\xf2\xbb\xb2\x70\x2b\xad\x39\x4f\xea\xd0\xae\xac\xdb\xc9\x7d"
- "\xc7\xd5\xc3\x98\xdc\xc2\x63\xd6\x7d\x71\x0a\xfd\xc2\xfd\x05\xd2"
- "\x2c\x7e\x95\xbb\x37\x7d\x45\x14\xa0\xd7\x60\x5c\x72\xa8\x88\xca"
- "\x87\x53\xc3\x1d\xf4\x00\x3d\xab\x21\xa2\x3f\x6c\xb9\xc9\x6c\xc5"
- "\x75\x7a\x65\x98\x2d\x95\xa2\x3c\xe5\x7d\xeb\x50\x31\xa7\xcb\x7b"
- "\x3a\xbe\x5f\xf8\x8b\xf7\x71\x0c\xb3\x81\xc5\x14\x3c\x04\xfd\xff"
- "\xdd\x04\x87\x9c\x36\x55\x88\xb6\x23\xfa\xf1\x5b\xdd\x00\xcf\xdc"
- "\x27\xc7\xa1\x3a\xd7\x3d\x18\x15\xa0\x97\x3f\x6b\xe6\x17\xfe\xa6"
- "\x56\xc5\x2f\xfc\xdf\xf9\xfa\xa2\x94\x5f\xdd\xd3\x07\x7b\x49\xdf"
- "\xf7\xf6\xf7\x35\x69\x7d\x5f\x9e\x7c\x1f\xef\xdf\x67\xfb\x07\xf3"
- "\xfb\x9a\xcc\xbe\x2e\xc4\x1b\x60\xab\xfe\x2f\x5f\x11\x25\xe0\x33"
- "\x3f\x27\x0a\x30\x7d\x8a\x68\x92\x6d\xb4\x31\x75\x3e\x09\x4e\xf9"
- "\x86\x60\x4c\xb7\xa6\x84\x24\xda\x98\x72\x15\x6d\xd2\x1a\x8c\x71"
- "\x52\x9e\xdb\x40\x54\x39\x0d\x24\xb0\x3a\x01\xe3\xbd\xa2\x5f\x2c"
- "\xf8\x1a\x52\x08\x9e\x2b\x13\xad\xe4\xa8\xe5\x32\xee\x5b\x32\x56"
- "\x47\x82\xdc\xa9\x27\x04\xf1\xab\x8a\x24\x41\x45\x77\xd0\x7d\x34"
- "\x7d\xd9\x3e\x2a\x5f\xb6\x1b\xd2\x6a\xdf\x12\x42\x7d\xdf\x5a\x5b"
- "\xe1\xab\x8d\x42\x1d\x7f\x64\xbe\x88\xcd\x23\xfc\xac\x90\x89\xc5"
- "\x20\x83\x7e\x52\xcb\xe7\xd5\x6b\x9e\xe4\xfa\xbc\xe6\x76\x71\xbe"
- "\x09\xfe\x37\x31\x5b\x11\xda\x51\x8e\x31\x30\xb1\xcc\x37\x85\x72"
- "\x16\x03\xf3\xad\xb5\xa1\xbe\xc9\x8b\x88\xbc\xda\x0c\x9a\x12\xe4"
- "\x20\x6a\x30\xe8\x77\xbb\xa1\x9f\xed\x29\xbe\x83\xe6\x41\xfd\x0c"
- "\x25\x77\xd0\x4c\xa8\x53\x59\x7b\xfa\x91\x4a\xd0\x3d\x46\x71\xdd"
- "\xc5\x08\xfd\x62\x77\x0e\xe4\x09\x5b\x45\xc6\xe7\x40\xbe\x5c\xc8"
- "\x87\x76\x32\xaf\x5f\xd5\x5f\x81\x06\x7b\xe1\x9b\x35\xda\x05\xf8"
- "\x7c\x94\xf9\x00\xc2\x6f\x43\x3b\xb4\x0d\xe4\x68\x30\xe8\x36\x05"
- "\x7e\x43\xfa\x6e\x7b\xfa\x27\x20\xff\x0e\x24\x89\xeb\xbe\x79\xbc"
- "\x9c\x4f\x22\x78\x7f\x3d\x8c\xe7\xf9\xa5\x18\xa5\xaa\x9c\xb5\xa0"
- "\xd3\x3b\x98\xbf\xc8\x7c\x9c\x6f\x41\x1b\x83\xd9\x15\x76\xa2\xe6"
- "\xf3\x03\x60\x5b\xc4\x82\x1c\x00\x7b\x82\xed\x71\x06\x5b\x02\xea"
- "\x92\x8f\xb1\xf2\xf0\x3d\x8c\xdb\xf6\x82\x5e\xde\x83\x76\xc0\x82"
- "\x2b\x4f\x11\x9c\x63\xc7\x38\x97\x2b\xe7\x51\x2b\x8f\x41\xf2\x49"
- "\xb9\x64\x0b\xa0\x0c\x42\xfd\x0f\xb6\xb0\xa2\x13\x78\x08\x18\xa8"
- "\x00\xdb\x62\xd4\x05\xf2\x49\x9b\x48\xfb\x0a\xa6\xf3\x13\x99\x7f"
- "\x63\x1f\x2e\xa3\x8f\xe2\x5e\x78\x15\x7c\xa3\xc2\x4c\xea\xd8\x5c"
- "\x38\x97\x31\x47\x03\x25\x3d\x8e\x63\x5e\x33\x94\x41\x41\x96\x89"
- "\xef\xa0\xfd\x1f\x35\x4a\xdf\x84\x77\x46\x91\x66\x95\x40\x33\x2c"
- "\x93\x8d\xfd\xc1\xe6\xda\x2d\xd2\xa6\x12\xed\x0a\xf1\xb7\xb1\x52"
- "\xb9\x38\x2e\x17\xc0\xae\x40\x7a\x21\x9d\xa0\x9c\x4a\x51\x8e\xd5"
- "\x72\xfb\xa5\x6a\x0d\xe1\xeb\xed\x79\xc0\xeb\x8d\x0e\xfa\x1f\xdd"
- "\xed\x4c\x7f\xf8\xfd\x46\x91\x97\x13\x9d\x78\x07\x63\xa3\x4a\x1b"
- "\xce\x93\x42\x1d\xf7\xf1\x39\x9e\xa3\xe7\xd0\xaf\x18\xfa\x31\x06"
- "\x1a\xef\x33\xa0\xcf\x5c\x90\xcd\x1b\xbe\x02\x99\x1b\x85\xf6\x53"
- "\xa5\xe8\x17\xab\x72\x23\x62\x18\x9e\xd9\x3c\x7c\x23\xd4\x0b\xcb"
- "\x83\xe7\xe7\xe0\x0e\x76\x6c\xe5\x6c\xe7\x98\xb4\x8e\x78\xb4\x95"
- "\x33\x1d\xe7\x0c\x8e\xea\xf9\xf8\xf9\xa8\x1e\xe7\xc0\x58\xfe\xce"
- "\x58\xac\x5b\x3d\xf6\x4b\xa9\xad\x18\x9b\x16\xd2\xd1\xf6\xaf\x47"
- "\xbe\x49\xe9\xe8\x6f\x17\xf8\xa4\x82\x6f\x9d\x12\xeb\x84\xcf\x4a"
- "\x78\x66\x31\x07\x30\x4e\xed\x26\xfc\x4d\x8a\xe3\x37\xd8\x6f\x00"
- "\xc3\x6a\xc8\x73\x1c\xee\x54\xca\xcb\xe3\xd7\x56\xce\xdb\xd2\x81"
- "\x73\x60\x95\x09\x52\xfc\x5a\x8c\x5d\x8b\x32\x23\x67\x81\x0b\xed"
- "\x91\x36\xc8\x67\x86\xbb\xfd\xb6\x72\xa0\x77\x15\xd8\xff\xff\x27"
- "\xfa\xb8\xab\x9c\x27\xd6\xcf\xc8\xe3\x31\x1c\xcc\x2f\xd9\x2c\xf9"
- "\x58\xa8\x72\xac\xff\x77\xd9\x96\x95\xf3\x10\x93\x50\x56\x25\xf2"
- "\x1f\xed\x44\xc8\xb7\xac\x0b\x5b\xec\x1c\x6f\x65\x33\xda\x97\x62"
- "\xfd\x11\x2f\x55\x22\xed\xf2\x9d\xfb\x9d\x73\x3f\x87\x32\x60\xfc"
- "\xbf\xbf\x0b\x03\x52\xbf\xe6\x38\xa8\x3e\x27\xda\x14\x18\xcb\xaa"
- "\x06\xca\x35\xa2\x0d\xce\xf5\x6a\x75\xf9\xfe\x7a\x1b\xce\xa1\xd7"
- "\xc2\x33\xf4\xef\xea\xfc\xd6\x11\x35\xba\x8d\x4c\x6e\x54\x03\x1d"
- "\xa6\x32\x1f\x10\x48\x17\xa9\xbf\x6e\x5a\x80\x63\xbf\x10\xde\x67"
- "\x93\x1a\x49\xb5\xb5\x99\x88\x7b\xf8\xa1\xcf\x9e\xc3\xb5\xd3\x0b"
- "\x80\x21\x25\xf6\x5f\xe0\x2f\xe2\x19\x65\x4e\xcd\xc6\xad\xac\xdf"
- "\xaa\xb0\xdf\x76\xa2\x6f\x08\xf8\xce\x81\xc8\x50\xa8\xb5\x91\xf5"
- "\x63\xf4\xf9\x51\x08\xb4\xc3\x58\xb1\xf0\xed\x34\x69\xef\x31\x62"
- "\x04\x7d\x7c\x88\x38\xa9\xc0\xbe\x2c\xd2\x4e\x01\xf9\xca\xa4\xbe"
- "\xe7\xc4\x7f\x96\xa7\x5b\x7f\x53\xf3\xfe\x56\x5d\x27\xd1\xda\xc6"
- "\xfa\x71\x65\x82\x0d\xfa\xb1\x33\x4d\x91\x9e\x48\xd7\xf6\x74\x13"
- "\x94\x75\x20\x58\xa2\xa9\x83\x9e\xa6\x55\x22\xcf\x6b\xf8\x1c\x93"
- "\x69\xba\x38\xff\xd4\x45\x43\x11\x7f\x18\xe3\xb3\x7c\x03\xb6\x1d"
- "\x74\x03\x7e\x1f\x31\x52\x28\xca\xac\x03\x16\xc4\x88\x09\xfa\xff"
- "\x33\x4d\x0e\xd9\x51\x99\xc4\xc6\x2c\xc0\x27\xce\x1f\xd3\xdf\x98"
- "\x1f\x8d\x5e\x64\x87\x99\x54\x45\x3a\xe4\x93\x69\x8f\x44\x07\x09"
- "\x93\x52\xbf\x87\x32\xec\xae\xf2\xc7\x74\x06\xca\x18\x8d\xf2\xcd"
- "\x61\x43\x61\xfc\x37\x67\xf9\x66\xaa\x43\xf9\x86\xb8\xd6\x27\xe2"
- "\x1c\x1b\xd7\x57\x66\x72\x24\xcd\x55\x26\x1d\x59\xc5\xf7\x06\x70"
- "\x9b\x0b\xb1\xa5\x5f\xc0\xf3\xa3\x0e\x83\xfc\x6c\x2c\x2e\xea\x3c"
- "\xf4\x45\x8c\x69\xcb\x44\x7a\xd5\x43\xfe\x03\x78\x1e\x12\x7d\x20"
- "\x8c\xac\xe7\x63\x3d\x90\xd3\xfb\xd0\xd7\x35\xe4\x9b\x5c\x0d\x76"
- "\x7e\x67\x06\x97\xdd\x92\xac\xa0\x8b\x23\x46\xae\x6e\x22\x7e\xfa"
- "\x5f\xd1\xb3\xe7\xc9\x31\xf4\xc7\x6d\x45\x7f\x8b\x50\xb6\xf6\x3c"
- "\xf9\xec\x38\x7c\x37\x48\xbc\x6b\xe0\xfe\x3e\xdc\xef\x82\xfb\x6b"
- "\x70\xbf\x1b\xee\x39\x90\x5f\x10\xf3\x87\xc0\xf3\x2a\x48\x7f\x58"
- "\xbc\x43\x1d\x8f\xe1\xfe\xfb\x70\xd1\x76\xc4\xf4\xdf\xe1\x33\xdc"
- "\x7f\x2e\xf2\xbc\x92\xf3\xfc\xd8\x43\x50\x4e\x12\xd4\xbf\xce\x54"
- "\xcf\xca\xd2\x9f\x27\x9f\x5e\xc3\xb2\xf1\x7c\x32\xfc\xff\x86\x93"
- "\x0d\x0a\xe5\x1c\x3b\x01\xf7\x69\x70\x2f\x86\x7b\x02\xdc\x5f\x12"
- "\x69\x50\x83\xb2\x21\x3a\x89\xd1\x9c\xed\x79\xe0\xdf\xe3\x7d\x1e"
- "\xf5\xb0\x43\x76\x7c\x52\x19\x3d\x8f\xf3\xdb\x4c\xaa\x19\x0e\x20"
- "\xef\x63\x98\x17\xee\x4f\x88\xf7\x50\xf1\xfe\xa4\x78\xff\xad\x78"
- "\x9f\x29\xde\x61\x3c\x7a\x2c\x41\xb4\x31\x80\x2e\xc7\x12\xd8\xbe"
- "\xa7\xcc\x43\x07\xf8\x37\x3e\xcd\xc7\x31\x32\xc8\xf1\x47\xa0\x7c"
- "\x9f\xf6\xf4\x4f\x95\xd2\xfc\x28\xce\xf9\x74\xa6\x1f\x7c\xab\x90"
- "\xad\x6b\x7f\xaa\x75\x92\x6d\xc9\x2a\x59\x28\x01\x1b\xe8\xf6\x22"
- "\x39\x15\x7d\xd0\x7d\x9a\x24\x17\xd7\x85\x45\x3f\xfa\x3e\xe8\x5b"
- "\x8e\x8d\x87\xfc\xd5\x49\xd8\x57\xd9\xdc\x31\xfa\x41\xf3\xab\x4c"
- "\x83\xcb\x00\x63\x83\x3c\x49\x7e\xe3\xb8\x47\xf4\x59\x79\x00\xbe"
- "\x65\x70\x8c\xd5\x3f\x9d\xc1\xd7\xd0\xee\x0c\x85\xf4\x5d\x8e\xf4"
- "\x63\x56\xac\x33\xd0\xb3\x0e\xda\x33\xad\x81\x7c\x8a\xfe\xf0\x7f"
- "\xd2\xc8\xdb\x1c\x22\xb5\x59\xe4\x87\x5e\xa2\x6f\x23\x39\x96\x0c"
- "\xb2\x30\x1e\x31\xdc\xd0\x25\x67\x8f\xb1\x79\x5d\x11\x23\xc0\xcb"
- "\x63\x8f\x20\x4f\x9d\xfa\xa0\xb3\x0c\x0a\x6a\x4f\xff\x6c\xb2\xab"
- "\x4c\x39\x3a\x19\x65\x0a\x62\x03\xe4\x37\xf2\x5a\xd5\xad\xff\xd5"
- "\x61\xff\xe3\xfd\xee\xb3\x58\xd7\xdf\x9a\xea\x6c\xbc\xdf\xd5\x01"
- "\xce\x00\x9f\x35\xcd\xc8\x1f\x33\xf9\x6c\x96\xd8\xa7\xeb\xa0\x4f"
- "\x3f\x02\xe9\xb5\xbc\xae\x3c\x5d\xfc\x16\xe0\xac\x06\xdb\x7d\xb7"
- "\x94\x2e\xb6\x17\xcb\x41\x7f\xea\x77\x49\xe9\x62\xf9\x80\xc7\x9a"
- "\x7d\xd8\x4f\xa4\x74\xb1\x4d\x60\x47\xd5\x12\x49\x9e\x18\x38\xde"
- "\x32\xa5\xdf\x21\xdf\xd0\xdf\x14\x9f\xe3\xff\x0c\xd7\x50\x4b\x51"
- "\x3f\x6c\x58\x40\x54\xab\xb7\x13\x7f\xde\x2f\x3f\x6b\x76\x95\x91"
- "\x9f\x57\xd1\x74\xb5\x8d\x2a\x2b\x93\xaa\x6c\xd3\x24\x7b\xb5\x08"
- "\xbe\x13\x2b\xc5\x4a\x76\xf8\xe4\xaf\x2d\xae\x2a\xed\xa2\x2f\xd6"
- "\xc5\x20\xd5\xc5\x49\x3f\x33\x1e\x60\xdd\xb0\xac\x0d\x60\xaf\xb7"
- "\x81\x5c\xe0\x72\xbb\x76\x9f\x14\x43\x3e\x57\xd4\x5b\x18\xb7\x3c"
- "\x37\x91\xc7\x31\x47\xdd\x88\x7b\x7c\x04\x9c\xc7\x4a\xb2\x93\x6a"
- "\x3d\x8c\xe5\x93\xce\x91\x85\x6b\x46\xa0\x4f\x95\x08\xa8\xeb\xdb"
- "\x50\xb7\x5d\x76\x9c\xfb\x8f\xc3\x71\xea\xe7\x31\xf6\x44\x6a\x15"
- "\x69\x06\xfd\xe8\xf3\xdf\x89\xb4\x45\xf9\xc5\x7c\xf2\x6d\x48\xe1"
- "\xf1\x75\x70\x2e\x07\xfb\xc7\x16\xd4\x63\x1a\x6a\x3d\x50\x84\x7d"
- "\xe5\xf8\xd3\x92\x4d\x0a\xf5\x2d\xe5\x36\x61\xf5\xeb\xcc\xe7\x50"
- "\x66\x65\x12\x9f\x0b\x3c\x7e\x82\xb7\xfd\xb8\x91\xaf\x73\x33\x7f"
- "\x92\xf8\xbc\xdb\x47\x73\xc7\xdf\xf9\xbe\xac\x83\x9f\xf0\x3d\x25"
- "\xc7\xbb\xe2\x7f\x38\xd9\x8a\x07\xb8\x3f\xa8\xe3\xe5\x8e\x3e\x71"
- "\x3c\x13\x7f\x07\xbf\x7f\x17\xd2\x6b\x1c\xe9\xd5\x65\xe2\x7c\x57"
- "\x72\xc0\xfa\x50\xdc\x5b\x76\x3b\xfa\xa5\xe6\xdf\xfb\x3c\x84\x7d"
- "\x9f\xcd\x79\x40\xdf\x14\xfb\x2f\xd2\x19\x75\x36\xeb\xc3\xd0\x7f"
- "\xb1\x1f\x77\x66\x55\xa6\xc1\xc5\xfb\x2d\xd7\xcd\x07\x58\xbf\x65"
- "\x7d\xf6\xf3\x50\xa7\x7a\x58\xd9\xbc\x17\xf2\xf3\x65\x8d\x0a\xde"
- "\xcd\x03\xbd\x5a\x2b\xbe\x63\x7b\xef\xd0\x6f\x88\xed\x2a\xb5\xe0"
- "\xda\x36\xae\x75\xe2\xd9\x2b\x35\xa0\x1b\x7d\x7d\x48\x6b\xd5\xb3"
- "\x9b\x53\xa9\x1d\xd7\x9d\xae\xd2\xb6\xbc\x2e\xbf\xf8\x9f\x97\x39"
- "\xfc\xf6\x1c\x57\x8a\xed\x4a\x82\x6f\x15\xf1\xbd\x60\xb5\xd7\xb8"
- "\x4d\x55\x6b\x45\x9c\x9a\x00\x7b\x70\xdf\xce\x63\xdb\x7e\xde\x28"
- "\x61\x0f\xfa\x65\xf4\x79\xf2\xc5\xaa\xfc\x3b\xe8\x76\xe0\xe9\x76"
- "\xe8\x4b\xcb\xe0\x79\x11\xdc\xa3\xf9\x5d\x16\x88\x77\xb1\x8f\x6c"
- "\x6f\x4f\xff\x42\x2b\xc5\xf4\x46\xda\xb4\xf9\xb5\xa7\x21\xce\x72"
- "\x81\x0e\x88\x35\xb6\x8e\x0c\xf5\x46\x7c\x21\xce\x10\x63\xea\xf5"
- "\x4f\x31\x9c\x31\xbf\x02\x90\x8e\xf5\x45\x9c\x41\x59\xcb\x24\x9f"
- "\xb8\x66\xf2\x45\x20\x5f\xcf\xf9\x22\x4d\xda\x4b\x8b\x6b\x49\x09"
- "\xf7\x90\xdb\xa1\x5c\xed\x01\x2d\xf3\x3b\x79\xda\x64\x7b\x92\x60"
- "\x5e\x5c\x87\xe3\x72\xf2\xce\x2d\xf0\x9b\xbd\x0e\x9a\x1f\x9d\xcc"
- "\xd6\x8c\xe6\xb1\xb9\xc8\xdb\xe0\x5d\x8d\xf3\x38\xc3\x4c\x0e\x15"
- "\xe1\x58\x03\xf7\xf6\xdd\x17\x44\xb4\x80\x5b\x90\x63\x5f\xb4\x49"
- "\x76\xed\x83\x41\xb8\x9e\x7f\x68\x16\xd4\xaf\x9e\xc7\x29\x3f\x34"
- "\x0d\xc6\x92\x15\x6e\xe6\x8c\xa7\xe1\x5c\x8f\x18\xcb\xa6\x1e\xe7"
- "\xb1\xd0\xf7\xff\x79\xf2\xe5\xaa\x2a\xf4\xf1\xb1\xa2\xa7\x4f\xe4"
- "\x94\x24\x7a\x05\xfd\x22\x6b\xe3\xc9\x6d\x0d\xe4\xcb\x08\x9c\x37"
- "\x4a\xbd\x8c\x73\x34\x75\xc9\xae\x73\x34\x75\x95\xe2\x65\x26\xe4"
- "\xc4\x4c\xa7\xab\x56\xbc\x87\xf7\x73\x35\x8b\x79\xad\x84\x9c\x54"
- "\x88\xb4\xfa\xac\x3d\xbd\xae\x6b\xfe\x17\x71\x89\x7d\x1b\xf7\x71"
- "\xe0\x9c\x93\xcc\x46\xd0\xa7\x08\xf0\x09\xea\xbd\xe1\x81\x67\x8d"
- "\x6b\x11\x47\x27\x58\xac\x6f\xf4\xd7\x3b\xb0\xbd\x44\x27\x18\x3f"
- "\xb9\xef\xcc\xba\x5a\xf8\xf6\xd9\x4d\x97\x88\x42\x1f\x4f\xc6\xe2"
- "\xfc\xb7\xda\x4e\x8d\x38\xc6\x45\x4c\xec\x64\x31\x64\x4e\x1c\x4f"
- "\x58\x47\xe4\xf0\x7e\x3c\xfc\x7f\x40\xb2\x93\xe0\x37\x81\x3e\x56"
- "\x12\x84\xf6\xd1\x13\xeb\xc8\xf8\xf6\xf4\x13\xa5\x12\xaf\xd0\x86"
- "\xc0\x79\x38\x71\x2e\x01\xea\x5a\x77\x06\x7f\x87\x3e\xdd\xcd\x8c"
- "\x6e\x4c\x0e\x63\x19\x2a\xa8\x8f\xc1\xa7\x8d\x04\x72\xdd\x73\x02"
- "\xf0\x7f\x50\xb4\x19\x4f\x94\x01\xf6\x6b\x1d\xf5\xd4\xdc\xee\xf4"
- "\xff\x73\xf8\x7b\x75\x1b\xda\x67\xee\xe8\x73\xf2\x21\x89\x3e\xb8"
- "\x5f\x55\x0d\xe3\x04\xc6\x6f\x1b\x6d\x86\xba\x55\xea\xd7\x12\xe5"
- "\x05\xf2\xe5\x3d\x3b\xb7\xb2\xf3\x73\x15\x7c\x7e\xfe\xcb\xdb\xa5"
- "\x71\x38\xaf\xf7\xc9\x33\xea\xf5\x3e\x04\xe7\xd5\xd1\x8f\x19\xdb"
- "\xeb\xf7\x9d\x86\xcd\xa5\x9b\x6c\x33\x88\x31\xe5\x17\x98\x47\xb2"
- "\xab\xea\x5b\x53\x35\x64\xbf\x66\x06\xf4\xe3\x93\xbb\xa1\xaf\xec"
- "\x1d\xf8\x9e\xca\x93\xbb\x45\xfa\x56\xf2\xbd\x08\x27\xd7\xa1\x2e"
- "\xc1\xb1\x3f\xe8\x91\x03\xa8\xa3\xdb\xd3\xbf\x54\x4a\xfd\x06\xf4"
- "\xc6\x01\xf8\x0d\xdf\x63\x9d\x89\xeb\xbf\x27\x93\xd0\xb7\x03\x1b"
- "\x37\xf0\xfc\x2a\x3e\xe7\xff\xe5\x8c\x2e\x5b\x1a\xf2\xe1\xef\xf8"
- "\x1e\xb5\x93\xe1\x0b\xed\x32\xa0\xe9\xc9\x70\x6c\x1b\xc7\xa2\xe6"
- "\x79\xc8\xbf\xcc\xd1\x6f\x4f\x30\xd9\xbc\xbf\xd9\xb9\x5f\x7e\x69"
- "\x70\x8c\x37\xeb\x42\xa7\xe4\x93\x5e\x7d\x5d\xea\x03\x50\x57\x7d"
- "\x69\xdf\xb4\x89\x96\xe6\xc9\x85\xc7\x37\xe4\x12\x95\xcc\x00\x64"
- "\xc3\x7e\x96\x18\x79\xfb\x79\x52\xef\xaf\x56\xdd\x19\xfe\x44\xc2"
- "\x70\x9a\xa2\x21\xf2\x9c\x96\xe1\xca\x7b\xac\x77\x96\x52\x9f\x07"
- "\x9e\x9d\x9d\x60\x25\xda\x17\xf2\xc8\xd7\xcb\x88\xcf\x13\x30\x5a"
- "\xb8\x4f\x45\xf4\x66\xf2\x95\x06\xcf\x82\xee\x57\xa1\xfd\xf1\x95"
- "\x06\xcb\x4c\x2e\x22\xca\xe4\x46\xda\x64\x58\xe2\xab\x04\x7d\x10"
- "\x58\x08\x18\x1b\xa9\xba\xb3\xb4\x13\xca\xf8\x28\x92\xfd\x6e\x8f"
- "\xfb\xba\xd5\xef\xe8\xbd\x6e\xfa\x3b\xa0\x6e\xaf\x0f\xac\x6e\xa7"
- "\xcb\x1d\x75\x3b\x5d\x3e\xf8\xba\x9d\x7a\xc4\xa9\x6e\x81\x8e\xba"
- "\xc5\x42\xdd\x4e\x3d\x39\xb0\xba\x9d\x89\x70\xd4\xed\x4c\x84\x87"
- "\x75\xdb\xdd\x47\xdd\x8e\xf5\x5e\xb7\xa4\x3b\xa1\x6e\x67\x06\x56"
- "\xb7\x06\xab\xa3\x6e\x0d\xd6\xc1\xd4\x0d\xc7\xf2\x29\xc1\xf4\x1c"
- "\xf3\xbd\x1e\x4f\x54\xb8\x77\xef\x3c\x39\xfd\x58\x4a\x11\x7b\x1e"
- "\x7d\x9e\x7c\x65\x17\xfb\xb7\x25\xb5\x8d\x9e\xe5\x76\xce\x57\x4b"
- "\xa7\xea\x71\xbf\xeb\x57\x91\x80\x65\x0d\xc7\xf4\x69\xb6\xbf\x21"
- "\xd5\x42\xc5\xfd\xa6\x5f\x65\x95\xb0\xfd\x28\x35\x62\x7c\xe0\xaf"
- "\x2a\x5b\x47\x54\xee\xc5\xbd\x20\x02\xf4\x67\x3a\xa2\xd2\x88\xb1"
- "\x28\xdf\x8a\xb7\xc8\x69\x3a\xfa\x04\x43\x3f\x7e\x0a\x42\xb3\x2b"
- "\x6b\xde\x8a\xb7\xb2\x58\xcc\x1b\xd8\x39\xde\xaf\x0e\x48\x67\xd7"
- "\xa4\x6f\x58\xfc\x6a\x6a\x20\xbd\x5e\x8a\x7d\x4b\xe5\x60\xcf\xf8"
- "\x55\x96\x63\xf9\x90\xde\x26\xc5\xa7\x05\xbc\x67\x8a\xb2\xa1\x4d"
- "\x6d\xed\x4b\xee\x9d\x9e\x24\xc9\xbd\x27\x12\x88\x1a\x63\x38\x6e"
- "\x4a\x19\x8e\x6b\x8e\x30\x9e\xfe\xaa\x1c\xe9\x1e\xd6\x36\x9c\xaa"
- "\x93\x89\x0f\x9e\xd9\xc3\x3d\x7a\x26\x8d\x85\x4c\x48\x26\xbe\x61"
- "\x49\x50\xa6\x95\x44\xaa\x93\xa0\x3c\xa0\x35\x1f\x1b\x9c\x66\x73"
- "\x7c\xf9\x50\x1e\xae\x7f\xfb\x24\x10\xd5\x13\x9a\x54\xba\x61\x07"
- "\x51\xe0\xf9\x3e\x3c\xa7\xc7\xcf\xe8\x0d\x53\xb6\xa7\x9f\xde\x25"
- "\xb5\xcf\x03\xfe\x04\x70\xfe\x98\xcf\x38\xf8\x63\x2e\xee\xc9\x1f"
- "\xb3\x1f\xe7\x8f\x99\x38\xf8\x73\x66\xa6\x2b\x7f\xcc\x93\x5c\xf9"
- "\x63\x5e\xe6\x1d\x7f\xcc\xd1\x0e\xfe\xf0\x6f\x70\xfe\x98\x93\x7b"
- "\xe7\x8f\x39\xdf\xc1\x1f\xb3\xce\x33\xfe\x98\x8f\xb8\xe7\x8f\x39"
- "\xa2\x0f\xfe\x0c\xeb\x9d\x3f\x67\xee\xf2\x9c\x3f\x67\x66\x0e\x80"
- "\x3f\xfe\x9c\x3f\x0d\xeb\x1d\xfc\x69\x78\xb4\x27\x7f\xce\xbc\xce"
- "\xf9\x73\xa6\xd4\xc1\x9f\x86\x46\x57\xfe\x9c\x39\xe2\xca\x9f\x06"
- "\x95\x77\xfc\x69\x50\x38\xf8\xc3\xbf\xc1\xf9\xd3\x10\xdc\x3b\x7f"
- "\x1a\xa6\x39\xf8\x73\xa6\xc2\x33\xfe\x34\x2c\x75\xcf\x9f\x33\xd6"
- "\x81\xf3\xa7\xe1\xdd\x6e\xfc\x09\x74\xcf\x9f\x86\xc6\x01\xf0\x47"
- "\xcd\xf9\xd3\x78\x8f\x83\x3f\x67\x4f\xf5\xe4\xcf\xd9\xdf\x71\xfe"
- "\x9c\x0d\x75\xf0\xa7\x71\xa3\x2b\x7f\xce\x2e\x75\xe5\xcf\xd9\xdd"
- "\xde\xf1\xe7\xec\x2e\x07\x7f\xf8\x37\x38\x7f\xce\xee\xeb\x9d\x3f"
- "\x67\x6b\x1d\xfc\x39\x1b\xeb\x19\x7f\x1a\xfd\xdc\xf3\xe7\xec\xf6"
- "\x3e\xf8\x33\xbc\x77\xfe\x34\xfe\xc9\x73\xfe\x34\x6e\xec\x8b\x3f"
- "\x03\xb3\xf5\x1a\x59\x4c\x8a\x21\x28\xc7\xec\xae\x1c\xa4\x1d\xee"
- "\x3f\x14\xd2\x1b\xcd\x25\xc2\x30\x25\x3f\xa3\xd1\xb8\x5d\xbb\x96"
- "\xfc\xba\x81\x9c\x9b\x52\x22\xf8\x2a\x69\xfa\x6b\xc1\x42\xfa\xdf"
- "\x0f\xd0\xf5\xc3\x14\xc2\xfa\xe1\x0a\x3c\x73\xed\x3e\x26\xf6\xb9"
- "\x1c\x9f\xbb\xc8\x38\x3c\x37\xb7\x01\xec\x65\xfc\xbf\x3d\xfd\xdc"
- "\x76\xb0\x05\x67\xf6\x75\x7e\x0b\xf7\x3a\xed\xdf\x88\xe3\xdb\x73"
- "\x07\xba\xfc\x5d\xa4\xd3\x24\xf4\x1b\xa6\xbf\x17\xcf\x59\x9c\x6b"
- "\x46\xff\xdc\x34\xf3\xf0\xcc\xd0\x7b\xe9\x69\x1c\x7b\x9c\x27\xe7"
- "\xbf\xa1\x59\x87\x67\x22\x1e\xc0\x56\xbf\xed\x02\x39\x3f\xad\x6b"
- "\x7f\x1e\x8d\x78\x55\x9c\x23\xb4\xf0\xbc\x4d\x7f\xa2\x59\x87\x2c"
- "\x18\xb3\x73\x65\x0a\xc6\xa2\x6c\x7a\x0c\x6c\xdf\xfb\xf1\x1b\xe8"
- "\x13\x69\x27\xdc\x71\x9f\x0c\xdf\x9b\x79\x7e\x2e\xb3\x97\x37\xdc"
- "\xfd\x2a\xdf\x0b\xd7\x34\x49\xc2\x1d\x7c\x67\x04\x3c\x8f\x12\xed"
- "\x79\xcc\x3f\xf2\x02\xf9\xfa\x9a\xd3\x7b\x15\x3c\x9f\x82\xb2\x47"
- "\x89\xef\xfd\xe1\xf9\x23\xb4\xb3\x99\xff\x8e\xdc\x34\x71\x0f\xf1"
- "\xd7\xbb\x20\x2d\x50\xcc\x33\x0a\xf2\x64\xa1\xed\x2e\x96\x31\x1a"
- "\x9e\x97\xe3\x18\x58\x7c\x1f\x04\xcf\xcf\xe0\xda\x81\xf8\xfe\x76"
- "\x78\xc6\xb9\xce\x1f\xf1\x33\x2f\x9d\x62\x1f\xfd\x9a\x78\x77\x16"
- "\xfc\x6b\x36\x6e\x45\x1e\xf0\xb1\xc0\xd7\x4e\xfb\x7f\xce\x37\x75"
- "\x7b\x17\xed\xf4\xae\x4e\x7a\xc7\xf7\xa8\x7d\x9d\xe6\xf4\xae\xa2"
- "\xdb\xbb\x22\xa7\x77\xe5\xdd\xca\x2c\x77\x7a\x57\xd6\xed\x77\xb5"
- "\x4e\xef\xf2\xbb\xbd\xb3\x38\xbd\xdb\x28\xbe\xf3\x69\x4f\x6f\x52"
- "\x3a\xd6\xf0\xce\x27\x88\xe9\x72\x48\xd7\x3a\xa5\x47\x8b\xe9\xf0"
- "\xfd\xa6\xe9\x66\xb2\x3d\x58\x4c\x67\xbc\xe7\xe5\x37\x85\x3b\x95"
- "\x3f\x8d\xcf\x71\x34\x45\x77\xed\x9d\x1b\x51\x15\x28\x74\x46\xbc"
- "\x0a\xef\x82\x11\x57\xce\xd8\x8e\x4b\xd4\x46\xad\xfa\xb3\x36\x3e"
- "\x26\x01\xb7\xaf\x2c\x5f\x9a\xa0\x5d\xbe\x22\x3a\xc6\xc5\x7f\x7a"
- "\x10\xfa\x12\xc4\xf8\x63\xe8\x93\x45\xf4\xf5\xdf\xd4\x15\x1f\x03"
- "\xe4\x2a\x7c\xab\xc6\x4c\x66\xb2\x79\xec\x7c\xee\x67\xbc\x02\x7d"
- "\xba\x70\xff\x2d\xe4\xa9\x06\xd2\x74\x5c\xf4\xdf\x62\x84\xbc\x36"
- "\xf7\xfe\x5b\x2e\xd4\x31\xbf\x85\x90\x8f\xfb\x6f\xb9\x50\x0f\xfd"
- "\xfc\x09\x3a\x82\xc7\xbb\xe0\x71\xc0\xbe\x91\x6c\x13\xcb\xc2\x6b"
- "\xcc\xf7\x5f\x1a\x9f\xcb\xe8\xee\x87\xf5\xf0\x04\xfc\x9d\xb8\x5e"
- "\x3a\xc1\xe9\xf7\xb1\xfc\xbd\xa4\x1f\xc4\x6f\x66\x1e\xd6\xc1\xf3"
- "\x88\x06\x78\x66\xf3\xf7\xec\xdd\x37\x7c\x2e\x2f\xeb\xf0\x64\x6c"
- "\x13\xb6\xdb\xb5\x6d\xf2\x3f\x36\x90\x6f\xde\x76\xb4\xed\x9b\x3a"
- "\x27\x1f\x6f\x52\x1b\x08\xef\xa3\x3d\xda\xca\xf6\x27\x52\xe5\xe1"
- "\xc9\xf8\x6d\x94\x67\xfc\x2c\x03\x3c\x67\x1d\xd6\x49\xf5\x71\xaa"
- "\xdf\x64\x1c\xd7\x43\xfd\x4e\x71\x9a\x80\xfc\x00\x9e\x8a\x6d\x28"
- "\xa6\xe9\x4d\x69\x6c\x6f\x3e\x9e\x01\xc6\xf8\x25\x4c\x57\x5d\x88"
- "\x95\xe6\x32\x51\x47\xf1\x39\xcc\x0b\x0e\xfb\x0f\x7d\x6f\x65\x49"
- "\xfa\xeb\x82\x93\xfd\xc7\xbf\x09\x69\x65\xce\x18\x72\xfa\xde\x71"
- "\xfc\x1e\xe4\x0b\xe7\xe7\x01\x0e\xeb\xb0\xbf\xc3\x73\x10\xee\xc5"
- "\xc4\xdf\x62\x1d\xdd\xc5\xac\x73\xe7\x1b\xd1\x41\xc7\x6f\xb5\x12"
- "\x1d\xf3\x59\xec\xa4\x6f\x43\xa4\xf9\x3a\x76\x1e\x09\xf2\xe4\x77"
- "\xc5\x70\xfe\x76\x1e\x8b\x83\x66\x50\x37\x3d\xa8\x22\x91\x9c\xb6"
- "\xdf\xc6\xa0\x8c\xc7\x3e\xc3\x65\xfd\xb7\x07\x44\x9e\x8b\x67\x97"
- "\xbf\xcd\xc1\x74\xc7\xfe\xfb\x6f\x1b\xa5\x7c\x92\x5c\xe6\xeb\x55"
- "\xdf\xbe\xcf\xf2\xf1\xb8\xba\x7b\x38\xcf\x7f\x14\xd8\x40\xbe\xad"
- "\x11\xf3\xf3\xb8\x84\xcc\x2f\xcf\xb7\xcd\x34\xab\x66\x0f\xd4\x15"
- "\xc6\x3f\x4d\xdb\x39\x1d\xf9\x77\xe1\x5e\x83\x75\x41\x1a\xe1\xd9"
- "\x71\x9a\xa3\x6e\x02\xfe\x94\xf5\x7e\x96\x94\xed\xeb\x1e\x7f\x81"
- "\x5c\xe4\x36\x84\x9c\xb2\xf9\x5d\xde\xd6\x8b\x4b\x9d\xf6\x3e\xab"
- "\xa4\x3c\x5c\x76\xb3\x77\x6c\x4f\xb9\x3e\x11\xe7\x83\xc4\x77\x89"
- "\x78\xbe\xb6\xeb\xff\x61\x4e\xff\xfb\xe2\xff\x6c\x5f\xf3\x5a\xa6"
- "\x5b\x15\x8e\xb3\xfb\x17\x63\xe1\x59\xd5\xed\x39\xc8\xe5\x79\x0d"
- "\xdf\xf7\x0c\xb6\x59\x23\xdb\x43\x2e\xa6\x8b\x65\xfb\xb1\xfa\x24"
- "\xd2\xe9\x80\x8d\xe9\x78\x16\x5b\xec\x87\xd3\xf1\x0c\xb7\xda\x36"
- "\x9f\x9d\xdf\x86\xf7\xd3\xc4\x7b\x88\x78\x9f\xcc\x63\x9a\x5e\xd4"
- "\x3a\xe2\x92\xe3\x1c\xcd\xc5\x10\x77\x71\xd2\xa5\x38\xf2\x52\x9c"
- "\x74\x3c\xff\x2d\xc6\x75\x9d\x07\xbf\x8b\xed\x2b\x26\x3d\xbc\xcf"
- "\x94\xce\x72\xdb\x33\x0f\xd5\x0b\x99\xd6\x59\x18\x43\x13\xfd\x7f"
- "\xa5\x36\xa3\x0f\x98\x36\x62\x22\x1d\xc4\x94\xd0\x9e\x86\x71\x34"
- "\xab\x79\xfc\x4c\x3c\x03\x2b\xc3\x79\x73\xb4\x1d\xab\xf5\x17\x59"
- "\x0c\xcd\xd5\xcd\x24\x58\xff\x2b\xda\x08\x34\x68\xb6\x67\x1d\xaa"
- "\x17\x71\xb4\x03\x74\xe0\xb8\x0b\xe4\x12\x9b\x2f\x66\x31\xa0\x9b"
- "\xd9\xba\x97\xf2\x3c\xb9\x94\xcc\xf2\xd0\x88\x1d\x9c\x76\x97\xd8"
- "\xdc\xd7\xce\x74\x29\x4e\xe2\xa5\x09\x52\x5c\x66\x33\xb9\x94\x76"
- "\xc5\xef\x33\x1d\xa4\x4d\x77\xdd\x33\x7d\xe9\x19\x2c\x13\xeb\x6e"
- "\x26\x17\xdb\xb0\x6c\xc8\x33\xaf\xab\xcf\x42\xfa\x6a\x1b\x19\x03"
- "\xf5\x3a\x2f\x95\x0f\xef\xa1\xff\x37\x2b\xf1\x3d\x96\x79\x25\xeb"
- "\x1a\x96\x9b\x67\x96\xef\x10\x7d\xfc\x5f\x02\xfd\xf7\x5f\xfa\xbe"
- "\x6c\x20\xe8\x0b\x66\xe8\x4b\x4d\x42\x66\x4d\x1d\xf3\xd1\xed\x57"
- "\x63\xe6\x73\x8c\x97\xbe\xc1\x7d\x5d\x9b\xae\x12\x05\xee\x81\xe0"
- "\x98\xfd\x6e\x0a\xc3\x31\xa4\x81\xac\x2e\x83\x3e\xc2\xf5\xf4\x80"
- "\xf4\xfe\x25\x1e\x17\xbb\x85\x28\x73\xe3\x25\x1f\xe3\xdf\xcd\x74"
- "\x8a\x8b\x20\x9e\x7b\xf9\x6e\x79\x75\x12\x5b\xef\x66\x75\xec\x5e"
- "\x07\xac\x2f\x94\xd5\xe4\xd6\xc6\x54\xd6\xb0\x79\x43\x18\x0b\x98"
- "\xf9\x1e\xd5\xef\xde\xf1\xd1\xdc\x5d\x0e\xdf\xda\xd3\x15\x0f\x02"
- "\xf2\xe4\xe2\xde\x7b\x28\xbf\xab\x9d\xf1\xec\x1b\x75\xbc\xaf\x7f"
- "\xd7\x2c\x64\xd5\xd4\x61\x1d\xc4\xf4\xe6\x6a\x9b\x15\x7d\x3f\xf4"
- "\xea\x3f\x8b\xc5\x99\xc3\x3d\xe1\xd9\x35\x75\x78\x6e\xe8\x41\xab"
- "\x54\x67\x4b\x33\x9e\x57\xc1\x3a\x73\xda\x5a\xce\x48\x74\xcc\x69"
- "\x81\xb2\x53\x4e\x92\x46\x62\x59\x8a\xfb\xe6\xf0\xfc\x15\xf6\x61"
- "\x4e\x03\x0b\x1b\xf3\xb1\xef\xf3\x3c\x6c\xec\xcf\x62\xfe\x40\xf9"
- "\x25\x2c\x6e\x19\xb4\x01\x78\x61\x4c\xc1\x33\xff\x16\xe6\x6f\x63"
- "\x43\x3c\xe1\xed\x66\xfb\x64\x2f\x8b\xeb\x24\x96\x32\x49\x57\x98"
- "\xc5\xb4\x4d\xf8\xed\xc4\x0e\x72\x89\x58\xb2\x30\x1e\x39\xd0\xa3"
- "\x09\xfd\xce\x55\xb7\x41\x3f\x49\xea\x40\x2c\x34\x61\x9c\x4b\x33"
- "\xb1\x64\x72\xfd\x86\x34\xb7\x2c\xc3\xef\x23\x6d\x81\x77\x16\xa0"
- "\xe9\xa1\xf6\xf4\xcb\x0a\x89\xa6\xb9\x77\xe0\x78\xc7\xa2\xed\x4b"
- "\x37\xd8\xa1\xce\xd5\x30\xca\x30\x8e\x39\x89\xf5\xab\x12\x46\xd4"
- "\xd4\xe1\x9e\x6c\xf8\x5f\xf4\x75\xca\x79\xc7\xfb\xd2\xe5\xd7\xe0"
- "\x1b\x97\x71\x7f\x03\xca\x4a\xf4\x8d\x06\x69\x4f\x8b\xf4\x63\x71"
- "\x22\xf2\x12\x39\x1d\x78\xfe\x16\x71\x3d\xfc\xee\x76\xa8\x57\x91"
- "\x63\xbe\xb8\x85\xe9\x6e\xc4\x5b\x09\x1b\x13\x5e\x2e\x77\xaa\x73"
- "\x1b\x3b\xff\xda\x82\x73\x7d\x97\x23\xf1\x5b\x39\xe8\x17\x0c\x71"
- "\x71\xc1\x19\xff\x97\x1f\xc3\x7a\xe2\x9e\x5f\xbb\x5f\xa5\x19\xf4"
- "\x6d\x23\xd2\x19\x7e\x93\x04\x7d\xa1\xae\x0f\x5d\xc8\x62\xd4\xb5"
- "\xa7\xb7\x4c\x96\x74\x21\x8c\x2f\x40\x2f\xb4\x4e\x64\xe3\x4e\xb0"
- "\xa7\x4d\x02\xda\x33\xad\x13\x10\x37\x20\x67\xb5\xa2\x8c\xd5\xc2"
- "\x6f\x22\xa5\x35\x2f\x3b\x9e\x9b\xb8\xc4\xd6\x7b\xdb\xa4\xd8\x6b"
- "\xdc\x0f\x5f\xcb\x46\xc7\x39\x8b\x96\xbc\x1e\xe7\x2c\xf0\xec\xcf"
- "\x56\x16\xa3\x6b\x37\xea\x94\xaa\xe6\x46\xd4\x11\xec\xf7\x78\xf6"
- "\x22\x05\xc6\xe4\xfc\xfc\x50\x23\xce\xcf\xb3\x58\x26\x58\x17\x1e"
- "\x53\xa2\x81\xfd\x0f\xb8\x55\xe0\x9d\x63\xa9\xa5\xad\x2b\xbe\x38"
- "\xf0\x1b\xd7\xda\xf6\x2b\x7e\x43\x8c\xf7\xa2\xbe\x6e\x9d\x88\xb1"
- "\xb2\xdb\xd3\x5b\x35\x52\x9c\x6c\x16\x17\x9b\xb7\x27\xc8\xad\xbf"
- "\xc5\xa9\x24\x04\xfd\x05\xe0\xf9\x3a\x46\x03\x95\x3a\x13\x7d\x38"
- "\xa3\x3f\x4a\xe3\x5a\x8c\xb5\xd2\x7a\x7c\xcb\x1d\xec\x8c\x72\x9b"
- "\x71\x6a\x0b\xee\xc3\x6a\x3e\x9f\xcc\xfc\x2c\x29\xc3\x92\x6c\x14"
- "\x7f\xc7\xec\x09\x7f\x75\x26\xbe\x63\x31\x0c\xb0\x4c\xaf\xfd\x11"
- "\xb7\x96\x8a\xb6\x69\x33\xc8\xfd\x3b\x81\x57\xcc\x76\x87\xff\xef"
- "\xb8\x40\xda\xec\x3c\x5e\x2b\xf7\xa9\x2f\xee\xc7\x1e\xc6\x7d\x6c"
- "\x00\xcd\x98\xcf\x83\xb6\x97\xb4\x0f\x60\x6c\xe3\xb6\x55\xcc\xbf"
- "\x75\xe6\xe1\x10\x91\x06\x21\x9b\x78\xbd\xd4\x0b\x93\xe4\xac\x8e"
- "\x58\xbf\x81\xd5\xad\x6d\x86\x38\x8e\x18\xd6\x9e\xde\x96\x26\xf9"
- "\xe6\xe0\xf6\x14\xf7\x7b\xcd\x79\xd1\x76\x51\xb4\x9f\xa7\x89\xdf"
- "\x9e\x36\x04\xdf\x2e\x17\xcb\x54\x72\xdf\xdf\xad\xd1\x50\x2e\xe8"
- "\xdf\x2b\x4a\x69\x3c\x23\x9e\x21\x9a\xcc\xc7\x59\x57\xb4\x8e\xf1"
- "\x4c\x6b\x0f\x7f\xac\x8f\xaf\x58\x91\xa0\x8d\x5e\xba\x52\xbf\x28"
- "\x61\x71\xac\x36\x26\x3e\x7e\x45\xbc\x16\x9d\x2f\x39\xf7\x1f\x1e"
- "\x9f\xe8\xca\x34\x31\x96\x5f\x99\x23\x96\xdf\x15\x97\xf8\x97\x66"
- "\x72\x25\x6d\x68\xe6\x2e\xae\x14\xb9\x2b\x27\x4f\x2e\xec\x81\x0b"
- "\xd7\x51\x8c\x70\x55\xe0\x5c\xc6\x42\x2b\x09\x05\x5d\xcf\x7c\x5c"
- "\x38\x7c\x4e\x5c\x99\x8b\x7b\x8c\x1a\xc8\x95\x6b\x25\x82\x82\x30"
- "\x1f\x42\xe9\xc2\x1e\xcc\xbf\x13\x7e\x0f\x97\x11\xae\x0a\xb8\xd8"
- "\xef\x84\x8f\xd9\x79\xf9\x3d\xce\xef\xf8\xfe\x91\x94\x8d\x98\x87"
- "\xae\x57\x30\xf9\x25\x6c\xe6\xf9\xba\xd5\x41\x4e\xd3\x2f\xed\x11"
- "\xf3\xb1\x98\x5c\x01\xeb\x89\xb6\x97\x7c\x3e\x34\xfd\xdc\x6e\x31"
- "\x1f\xdb\x03\x20\xb5\x07\x63\x08\x40\x7e\x29\x9f\x82\xa6\xb7\x4e"
- "\x17\xf3\xb1\x3d\x39\x42\xba\xbc\xb7\xef\xfa\xd2\xf4\xbd\x5a\x31"
- "\x5f\xa0\x73\x79\x4e\x79\x86\x09\xe9\x5f\x96\x61\x1e\x61\xbd\x82"
- "\xfb\xb7\x4d\xbf\x52\x04\xf9\x7b\xf5\xbd\x3a\x30\x3e\xb5\xcf\xec"
- "\xce\x27\xfd\xe2\xa5\x31\xbf\x58\x1a\x97\x88\x11\xa4\x12\x56\xac"
- "\x4a\xc0\x7b\xdc\xa2\x17\xd9\x6d\xc5\xc2\x25\x8b\xf9\x3f\x09\xcb"
- "\x42\xf0\x9f\x65\x80\x37\xbc\x47\xaf\xd2\xe3\x6d\xf1\x0a\x7c\x4c"
- "\x8a\x9d\xbc\x6a\x31\xde\xba\x9f\x03\x05\xdb\xaa\xbd\x19\xb0\x51"
- "\xcf\xe5\x6c\xbb\xd5\x4c\xce\x31\x9b\x0e\xe3\x24\x1d\xd4\xd9\x88"
- "\x34\xaf\xe5\xea\x73\xc4\xea\x8b\x3e\x47\xd4\xeb\xf5\x8b\xd5\xb6"
- "\xa5\x31\x34\xab\x0a\x6c\x60\xeb\x34\x33\x89\x15\x63\x58\x1f\x0e"
- "\x65\xfe\x4b\xd3\xdb\x37\x8a\x7b\x3b\x15\x42\xe6\xa1\x36\xf4\xcb"
- "\x0f\xcf\x2c\x26\xb5\x00\xfa\x00\xf2\xcd\x80\x67\x8c\x45\x1d\x04"
- "\xef\xf1\x77\x33\xe1\x59\x03\xcf\xc1\x42\xe6\x7b\x4a\x3c\x63\x0c"
- "\xcf\x5a\x78\x9e\x00\xe5\x77\xc5\x7f\xeb\xdd\x56\xb6\xee\x95\xe2"
- "\x64\xf3\x98\xd8\xd6\x03\x5d\x31\xb1\x31\x4e\x53\x4a\xe0\x3c\xa6"
- "\x7f\x99\x0d\x62\x6d\xf2\xd1\x8c\xfd\x0d\xe4\x69\x92\xf4\x25\x9f"
- "\xef\xb0\x5a\x25\xff\x29\x7c\x3e\xe3\x9a\xd2\x29\xb6\x38\x3e\x6b"
- "\xa4\xd8\xe2\x38\xdf\xc5\x62\x1b\xc2\x9d\xa6\xa3\x9f\x58\xda\xeb"
- "\x78\x89\xc7\xc4\xbc\xb6\x0e\x7d\xee\x5a\x52\xa3\x65\xf7\x95\xe0"
- "\x1c\x1a\x3c\x73\x9f\x91\xf4\x12\xb9\xc6\xfc\xe9\x4b\xfe\xe4\x9c"
- "\x7d\x49\xf4\x7a\x1e\xea\x53\xb0\x19\x58\x1c\xab\x65\x2b\xd4\xb6"
- "\x45\x31\xdc\x0e\xbc\x76\x8a\xcb\xaf\x2a\xd1\x57\xf1\xb5\x0a\xfa"
- "\x2c\x8f\x75\x62\x26\x1d\x4f\xe3\x98\x45\x2d\x5b\xb6\x82\xc2\x6f"
- "\xd5\x49\x8b\x62\x58\x1a\xe4\xdb\x00\xb6\x9a\x58\xbf\x37\x4c\xc1"
- "\x78\xc6\x55\x10\x7d\x64\x5c\xdb\xbd\x60\x6c\x1a\x7e\x47\xc9\xec"
- "\x90\x4f\x89\x0a\x63\x53\x62\xdd\x4a\x9c\xfc\xdd\x6d\x82\x34\xdc"
- "\x43\xda\xfa\x2c\x51\xa1\x7f\x5f\xb1\x2e\xbb\x79\x5c\xb0\x8e\x99"
- "\x92\xaf\x29\x33\xa4\x75\x6f\xcf\xb3\x7f\x60\xa8\x9c\xb8\x78\x72"
- "\xf8\x93\xf0\xdf\x64\x31\xbc\xb3\x33\x36\x83\x5b\x47\x54\xd7\xb5"
- "\xfe\x3d\xee\x30\x8f\xe1\xd9\x01\xe3\xff\x6b\xd3\xd9\x1e\x16\x1c"
- "\x97\xb4\x47\x6c\xe7\x7b\x50\x3b\xaa\xd0\x9f\xae\x90\x8e\xf6\x24"
- "\x9e\x9b\xee\xd8\x87\x98\xa5\xca\x2a\xe5\xce\x75\xe8\xbb\x59\x06"
- "\x34\xee\x78\x1b\xdf\x89\x3e\xbb\xe4\xcc\xc7\x95\x9d\x68\xd8\x19"
- "\x61\xb0\x51\xf0\x0c\xea\x79\x62\x7f\x1f\xed\x0e\x9c\x4f\x12\xd2"
- "\x3b\x22\x10\xb7\xc0\x63\xf4\x21\xd2\x46\x47\x1c\x32\x53\xbf\xaa"
- "\xdd\x88\x63\xb4\x75\x4d\x81\x48\xb3\xce\x09\xf0\xdd\x27\xe0\xfa"
- "\x23\x8f\x29\xf3\x7c\x93\x54\x26\xfa\x55\x83\xb1\x53\x10\xdc\x03"
- "\xdb\xd3\x3b\x9f\x76\x8a\xb5\x27\x9e\x89\xee\x5c\x8e\xfe\xde\xb0"
- "\x6c\x6e\x3b\xdb\x5f\xe7\x36\x48\x67\x92\x99\xa8\xf3\x79\x5f\xec"
- "\x04\xfb\xe7\x3f\x22\xc5\xff\xc1\xfe\x79\x68\x4f\xb7\x32\x4e\x48"
- "\x73\xa5\x1c\xd3\x9d\x7b\x01\xa3\x4f\xc0\xf5\x47\xc8\x6f\x94\xe2"
- "\xc9\x6f\x90\xb3\x73\x92\xe7\x7d\x34\x78\xde\xbd\xb3\x4e\x4a\xf7"
- "\x95\x85\x02\x4d\x3b\x9b\xa4\xbe\xdf\x3a\xa2\xb2\x19\x9e\xad\xd2"
- "\x1c\x0b\x9f\x73\xb1\x29\x9d\x9e\xad\xf0\xac\x91\x9e\xe1\xff\x09"
- "\x92\xac\xc0\x71\x62\x2b\x8c\x25\x71\xdc\xb9\x58\x03\x76\xa1\x06"
- "\xc7\x79\x36\xe0\xff\x7f\x68\xc5\xbc\xe1\x66\x92\x25\xca\x18\xdb"
- "\x3c\xb3\xbc\x70\x99\xd4\x16\x21\xdd\x47\xcd\xdb\x63\xcf\x17\xb2"
- "\xac\xb3\x2c\x7e\x87\x4a\x21\x0f\xe8\x7f\x6b\x29\xcb\x93\x78\xb1"
- "\xd4\xd0\x11\x38\xd7\xb4\x11\xec\xe4\x25\x88\x2f\x3b\xdb\x87\x95"
- "\xb3\x36\x30\x1c\x6d\x4c\xf4\xf9\xc1\xfc\xf3\xa1\x8f\x4a\x1b\x19"
- "\xc6\xe2\x02\x64\x59\xa7\x33\x7f\xf8\xab\x75\x2a\xc9\x3f\x25\xc8"
- "\x9e\x7c\x2a\x5f\x56\x89\x3e\x2b\x59\xfc\x8f\x76\x5d\x00\xf3\x53"
- "\x29\xfa\xa7\x2c\x4e\x24\x41\x45\x02\xf7\x4f\xc9\xfc\x81\x0c\x83"
- "\x31\x49\x62\xef\x3e\x2a\x69\x7a\x59\x82\xe4\xa3\x92\x5e\xb5\x5b"
- "\xe1\x7f\xc4\x02\xc6\x45\xd7\xb1\x67\x87\x6f\x29\x45\xaf\x3e\x2b"
- "\xe5\x20\xe3\xe4\xdc\x67\xe5\xc0\x74\x83\x3d\x92\xe3\xc4\x5e\x2a"
- "\xc5\xbb\x77\x4a\x03\xf9\x77\x4d\xf4\x65\xd0\xb9\x4c\x4c\xab\x30"
- "\x93\x8c\x04\x71\x7f\xa5\x05\xe7\xc8\xf2\xd9\x3c\x58\x07\x9e\xbf"
- "\xd8\xd1\x9b\x7c\x69\x09\x18\x0d\xf5\xc0\xfe\x2b\xc0\xf7\x04\xc6"
- "\x27\x3e\x6e\x14\x94\xdd\xfb\x70\xd4\xe2\x15\xd1\x31\x0b\x5f\x58"
- "\xae\xd7\x3e\x3b\xf7\x09\x16\xec\x70\xb2\x76\x69\x42\x0c\x53\x3f"
- "\xda\x67\x9f\x7c\x3c\x2c\x6c\xee\xc2\x3f\xcc\x7d\x6c\xee\x73\x7f"
- "\x78\x94\x9f\x4e\x9c\x1b\xbf\x06\x03\x66\x26\xac\xd0\xe2\x8f\xa2"
- "\xc4\x28\xdb\x6b\x63\xe2\x57\x74\xef\xfb\x41\x6c\x4e\x4b\xce\xe6"
- "\x6f\xdb\xf0\x7f\x3e\x6f\x26\xec\x92\xe6\xb3\xb8\x9c\x13\x0a\x90"
- "\xb6\x2c\x7e\x69\xba\x10\x8c\xb6\x94\x18\xff\x1c\x75\x8c\x02\xfb"
- "\x2f\xea\x1a\x68\x4b\x8d\xb3\x1f\x2e\xf1\xb7\xe8\x8f\x2b\x50\xea"
- "\xb7\x3c\x8d\xfa\xd1\x31\x63\x52\xb9\x2f\x2d\xaa\x90\xe6\xb8\x31"
- "\x4d\xaa\x43\x03\xe6\x49\x17\x66\x3b\xe2\xec\xd2\xc9\x8e\x58\x92"
- "\xec\xcf\x85\x46\x84\xa0\xe9\xe2\x0b\xb4\x1b\x06\xd7\x70\xbc\x66"
- "\x75\xc9\xf2\x44\x5a\x87\xe3\x33\xb5\x0c\xf4\x6d\x92\x0f\x8f\x45"
- "\x95\x51\xcb\xe2\x27\x84\xd9\x6d\x3e\x0b\xed\x72\xb8\xfb\xd0\x85"
- "\x76\x05\x1b\x13\xd2\x44\x5a\xcb\xce\xd5\x27\xd2\x1a\x8c\xb9\x06"
- "\x38\xce\x0c\xb3\xa5\x64\x86\xd9\xa9\x6d\x21\xd8\xea\x70\xff\x1a"
- "\xcf\x87\x87\xd9\xbf\xa6\x2c\xee\x0c\x9e\xa3\xe7\x3e\x05\x2b\x70"
- "\xbf\xe4\x02\xc0\x70\x49\x0b\x8f\xd5\x1b\xb6\xe6\xbb\xd3\x0b\xd7"
- "\x98\x79\xac\xde\x4b\x3c\xbe\x35\x8f\x01\x4e\x52\xa0\x9c\x23\x0b"
- "\xed\x3e\xda\x30\x7b\x27\x65\x67\x5c\x33\x48\x60\x5f\xf1\x77\x51"
- "\x9e\xae\xbc\x8b\xc8\x71\x6e\xc5\x5e\xb2\x20\x14\xfd\x07\xa6\x5a"
- "\xa8\x15\xfd\xd0\x7c\xd8\x51\x27\xd7\x26\x2a\x48\x83\x8c\x3c\x52"
- "\xad\x0f\xe9\xfd\x8c\x73\xc6\x49\x1b\xcd\xd9\x5c\x4b\x33\x4e\x55"
- "\xd2\x9c\x2d\x73\x41\x8f\xe1\xb8\x57\x46\x33\xcc\x45\xf0\x0c\xe9"
- "\x67\x97\xd1\x9c\xfc\xb9\x34\xe3\xfc\x0c\xb8\xc3\xf3\x37\x2a\x9a"
- "\x53\x00\xcf\xfb\x6b\xe1\x77\x35\x34\xe3\x00\xfe\x2e\x9c\x66\x1c"
- "\x3c\x00\x77\x78\x3e\xb4\x0f\xf2\xc1\xf3\xe1\xbd\x70\x87\xe7\x8a"
- "\xdd\xe7\x65\xe8\xb3\xa8\x00\xd2\xbe\xad\xe7\xdf\xba\x54\xcf\xbe"
- "\x95\x71\xb9\x9e\x7f\xa3\xad\x9e\x7f\xa3\xbd\x9e\x7f\xa3\xa3\x9e"
- "\x7f\xe3\xc8\x2e\xc8\x5f\x47\x33\x8e\x06\x41\xbe\x08\x9a\x51\xb9"
- "\x11\xee\xf0\x5c\xd5\x06\xf9\xe0\xd9\x14\x0d\x77\x78\xae\x81\xba"
- "\x14\xc0\xf3\xa7\x33\x21\x7f\x3d\xcd\xf8\xac\x1c\xf2\xcd\xa3\x19"
- "\xc7\x27\xc3\x1d\x9e\x3f\x2f\x85\x7c\xf0\x5c\x07\xe5\xe4\xc3\xf3"
- "\x89\x4c\xc8\x0f\xcf\x76\xac\x8f\x99\x66\x50\x2c\x37\x92\x66\xcb"
- "\x30\xbf\x99\x66\xcb\xa1\xbc\x7c\x78\x56\x24\xc3\x1d\x9e\x87\x4d"
- "\x80\xfc\xf0\x3c\x1c\xda\xba\x19\xc6\xe8\x7e\x49\x90\x2f\x9a\x66"
- "\x8f\x84\xf4\x2d\xf0\xac\xaa\x81\x7c\xf0\x1c\x80\xf9\xe1\x39\x50"
- "\x07\xf9\xe1\x79\x14\xd2\xa8\x89\x66\x07\x4d\x83\x7c\xb1\x34\xfb"
- "\x8e\x7c\xb8\xc3\xb3\x06\xeb\x0f\xcf\x77\xcf\x85\x3b\x3c\x8f\x05"
- "\x5a\x15\xc0\xb3\x16\xea\xb7\xb9\x99\x66\xdf\x8b\xe5\x2f\xa3\xd9"
- "\x13\x90\x3e\xf0\xfc\xa3\x50\xc8\x07\xcf\x93\x80\x1e\xf9\xf0\x3c"
- "\x59\x09\xf9\x7b\xf5\x8d\x4b\xb3\xa7\x9a\xe9\xfa\x61\x84\x66\xff"
- "\x4c\x4f\xd7\x0f\x87\xfb\xcf\xb5\x74\xbd\xaf\x8e\x66\xcf\x48\x83"
- "\x74\xb8\xff\xdc\x0a\xcf\x93\xc5\x67\xb8\xff\x02\x6c\x6d\xdf\x10"
- "\xf1\x19\xee\xbf\x2c\x83\xe7\x69\xe2\x33\xdc\x7f\x15\x02\xcf\xd3"
- "\x69\xf6\xaf\x95\xf0\x0c\xf7\x5f\x81\xad\xed\x3b\x43\x7c\x86\x7b"
- "\x68\x25\xdc\x6d\x96\xb1\xf3\xb7\x5b\xfc\xa3\xc2\x2d\xfe\x5b\x8d"
- "\x88\x49\x7b\xee\xe6\x1a\x21\x60\x4b\x38\xe8\xd8\x61\xa9\x57\xc8"
- "\xf0\xf3\x32\x9f\x2a\x94\x29\xa6\x64\x33\x8b\xe7\x27\xfa\xb3\x1c"
- "\xd6\x20\x93\x1f\x01\x7b\x08\xe3\xfc\xc8\xa1\xad\x2a\x9a\xee\xdb"
- "\x02\x77\x03\x4d\x1f\xd9\x00\x6d\x85\xe7\x51\x9f\xc2\x1d\x9e\x7f"
- "\x9a\x0d\x6d\x86\xe7\xe7\x1f\x87\xbb\xa1\x3d\xc3\x47\x67\x96\x11"
- "\xee\x6f\xef\xef\x71\x46\xb5\x2d\x95\x86\xd9\x40\x77\xec\x28\x4e"
- "\x53\xdb\x22\x01\x6f\xdb\x22\xd5\x18\x77\xa3\x78\x7e\x1d\x0d\x88"
- "\x62\x75\xc2\xd8\x3a\xb4\x73\x82\x9c\x7f\x7b\x24\x6d\x90\xf9\x3c"
- "\x87\x31\x20\x68\xc0\x5a\x77\xef\x57\xb1\xf7\x63\x8a\xf3\xf8\x7b"
- "\x25\x71\xbc\x7f\x1e\xdf\x17\xa8\xd1\x97\xfa\xb8\xe7\xd8\x7b\x53"
- "\x5b\x93\xd8\x2e\x1f\x7c\xf7\x36\xe6\x35\xcb\x7c\xf8\x79\x01\x99"
- "\xbc\x8e\xa6\xfb\x90\x56\x65\x55\x05\xd4\xbd\x11\xea\x1e\x2c\xce"
- "\xc3\xb6\x51\xe5\x21\x2b\xf7\x67\x72\xac\xd7\x3e\x8a\xe3\x55\xc1"
- "\x50\x58\x9e\x03\x72\x10\xc7\xc0\xa0\x0f\xe5\xda\x94\x09\xe5\x0d"
- "\x32\xdf\x3d\xc5\x6c\x6e\xa3\x38\x82\xc9\x47\x99\x62\x55\x67\x76"
- "\x95\x4d\xbb\x56\x0d\xdf\xf7\x7d\x3b\xd5\x4a\xaf\x18\x53\x1e\x27"
- "\xe7\x59\x7a\xf5\x74\x76\x5e\x88\xff\x3f\x81\xed\x03\xe5\xff\x07"
- "\xb2\x39\x67\x28\x0b\x7f\xeb\x3c\xe6\xb0\x67\x4c\x09\x15\x02\x8a"
- "\x23\xd9\x3a\xba\x4c\xb1\xe6\x7d\xc1\x2c\x57\x27\x10\x5f\xed\xda"
- "\x0f\xa1\x7c\x85\xd1\x65\x7c\xda\x95\x97\xbd\x7b\xed\x03\xc8\x5b"
- "\x88\x73\x49\x19\x8a\x9a\xae\x38\xc9\xd0\x86\xbf\xa0\x2e\x94\x93"
- "\x50\xd4\xcf\xcc\xde\x95\xf9\x86\xa3\xff\x5b\x9b\x6a\x5b\xa8\xcd"
- "\x10\x15\x6a\x37\x14\x47\xd0\xdc\xe2\xc8\x00\x9b\x8c\xb0\xfd\xfa"
- "\x32\xdf\x57\x1e\xb4\xa2\x7d\xf9\x09\xe6\x7d\x54\x18\xf6\x33\x32"
- "\x35\x89\xc8\x8d\xf1\x27\xf1\x79\x1d\xcd\x98\x51\x66\x6a\xae\x23"
- "\xc6\x78\x56\x56\x32\xcd\x98\x65\x10\x86\x3d\x1e\x5d\x82\x76\x7a"
- "\x12\xce\xb3\x7d\x8a\xe9\x32\xe0\x8b\xa2\x3d\xc3\x77\x5e\x57\x0c"
- "\x6f\xa0\x65\x0e\xd0\x0e\x6d\x68\xf4\x7d\xb1\xd0\x6e\x47\x5f\x72"
- "\x99\x66\xa0\x03\xe7\x97\x6f\x28\xc6\x3f\x17\xbf\x5b\x20\x8c\xa8"
- "\x6a\xaa\x9e\x87\x6b\x86\x4a\xf4\xcd\x75\x85\x9d\x97\xb7\x61\x5c"
- "\x43\xd0\x3d\x62\x5e\x67\xde\x2d\x5f\xac\x5f\xb8\x56\xbf\x22\x3e"
- "\x61\xe1\x2a\xfd\x2f\xb4\x30\x70\xd4\xae\x58\xa2\x5d\x1e\xb3\x7c"
- "\x45\xfc\x9a\x1e\xfe\x80\xa0\x5e\x6d\x66\x99\x82\xcd\x57\x1f\x01"
- "\xfb\x9d\xcd\xdf\xcb\x86\x1f\x40\x5e\xef\xd8\xca\xe3\x68\xb4\x67"
- "\x0c\x03\xfb\x6f\x29\xc3\xbb\xb0\xbd\x38\x89\x16\xcd\xaf\xcb\x42"
- "\x9f\x1f\xab\x30\x4e\x83\x85\x98\x48\x0b\x8f\xad\xcb\xe2\xe6\xc1"
- "\x78\x22\x71\x1d\x35\x26\xb6\x60\x3f\x88\xa0\x39\x5b\x63\x69\xf1"
- "\x02\xed\xb5\x9c\x28\xc0\xcc\xf0\xb2\x6b\x39\x5b\x23\xa4\xb8\x47"
- "\x76\xc3\xd6\x72\x41\x55\x58\x83\x71\x8f\x3a\xa9\x86\x54\x01\x2d"
- "\x3b\x32\xab\x6a\x41\x0f\xd4\x14\xa7\xd3\x72\x3b\x8c\xaf\x98\xbf"
- "\x9a\xbf\xc7\x95\xda\xa9\x4e\x61\x4f\x27\x4a\xb8\x07\xd0\x80\x62"
- "\xd2\xa9\xda\x16\x8e\xef\x31\xde\x91\xbd\x53\x47\x52\x6a\xa9\xf0"
- "\xef\xb1\x80\x9b\x74\x42\x59\x7c\xd7\xd8\x8b\x04\xd2\x47\x08\xb9"
- "\x5b\xcd\xe7\x67\x11\x39\xe6\x05\x7b\x8f\xcc\x83\xff\x93\x17\x11"
- "\x7f\xc8\xa7\x4e\x3e\x02\xe9\xed\xba\x11\xb6\x54\x9d\xb2\x23\x55"
- "\x37\xa2\x93\xea\x54\xa6\x46\x2b\xe9\x9c\x18\xb7\x67\x8a\x85\x28"
- "\x76\x80\x5d\x58\x2c\x40\x1f\x2c\x9a\x6f\xb4\xbf\xac\x1b\x66\x7b"
- "\x59\xa7\xe8\xec\xd4\x29\x6d\xab\x75\x8a\x8e\xd5\xba\x61\x9d\xed"
- "\x3a\xa5\x29\xda\x42\x3e\xb1\xfc\x83\x54\x37\x36\xb1\x39\xde\x4e"
- "\xff\x62\x55\xa7\xff\xd6\x66\x55\x23\x09\x9a\xaa\x27\xe8\x0b\x4d"
- "\xf6\x2a\x8c\x0b\x00\x13\x2a\xdb\x6b\x71\xa0\x0b\x8a\xf6\x00\x7d"
- "\x73\x9e\x9c\x44\xbf\xb3\x67\xa8\x22\xb4\x4f\x81\xbc\x5a\xaf\xd0"
- "\x40\x1a\xe0\x47\x53\x41\x33\x6e\x0f\xa4\xeb\x15\xc1\x70\x69\xcd"
- "\x9c\x0f\x84\x66\x8c\x54\xe1\x1c\x03\xe6\xe5\xf9\x46\xcd\x33\xb3"
- "\xbb\xff\x6e\x16\x87\x35\xc3\x77\x5f\x31\xda\x24\x19\xc3\x8d\x92"
- "\x4d\x72\x40\xd1\xbb\x5f\x11\xc8\xd3\xd8\x35\x5e\x17\x40\xe6\xe4"
- "\x6c\x36\xba\xf5\x09\x8c\xdf\xce\xdd\x6c\xc9\x13\xba\x7c\x3b\x83"
- "\xcc\x54\xfa\x43\xff\x49\x63\xef\x0c\xdb\x22\x53\x2e\x13\x1f\x7c"
- "\xb7\xe7\xaa\x55\x8e\xcf\xda\x78\x19\x35\xb5\x59\x09\xfc\x46\x41"
- "\x83\xe7\xd7\xed\xb9\x6a\x91\x23\x5e\xaa\x21\x0d\x7e\x3b\x31\xef"
- "\xaa\x58\xee\xf6\xe2\xb4\xd4\x97\x08\x8b\x65\x82\xf1\x90\x10\x47"
- "\x79\x29\x30\xde\xc4\xd8\x4d\xf1\x28\xc3\x94\x8b\xe0\x7f\x25\xe6"
- "\xa3\xaa\x6d\x91\x02\x94\x01\x58\xaa\xa0\xfe\xdb\x66\x09\x39\x5b"
- "\x6b\x40\xb6\xe6\xd1\xb1\x0b\xa6\x0b\x3b\x8a\x63\xdb\x33\x94\xe5"
- "\x40\x8f\x1a\x69\xfe\xa2\xba\xcc\x46\xd0\x57\x17\x7d\xdc\x46\x0e"
- "\x26\x5c\x41\x7f\xbe\x3e\x16\xbf\xaa\x3a\x8b\x7f\x61\xb9\xc5\xbf"
- "\x68\x8f\x90\x53\x44\xe0\xc2\xfd\xf8\xaa\x0b\x32\xbf\xe4\x2e\x5f"
- "\xb3\x97\x6f\x12\x5f\xb3\x60\xe7\x31\x7b\x0f\xb0\x83\xf6\x9b\x90"
- "\xb3\x6d\x3a\xc6\x24\x41\xbb\x0e\x65\x6e\x7b\x86\x5f\xd7\xf9\x17"
- "\x94\x23\xf6\xac\xaa\x46\xb8\xcc\x90\x6e\x34\xcb\x82\x9b\x24\x19"
- "\x03\xba\x47\x2f\x64\x3f\x95\xdf\x8e\xe7\xa9\x3a\x63\x7f\x8d\x79"
- "\x81\x6e\xe8\x03\xdc\xc7\xde\x19\x3b\x03\xae\x47\xe1\xfa\x95\x3d"
- "\x67\x5b\xa8\x3d\x67\x6b\xa4\x3d\xa7\x28\xcf\x9e\x13\x95\x00\x57"
- "\x12\x5c\xc9\x70\xa5\xc1\xb5\x11\x2e\xb0\x59\xa2\x0c\x70\xc7\xf7"
- "\xf9\x70\x6d\x87\xab\x08\xae\x52\xb8\x76\xd9\x77\x14\xeb\x05\xc0"
- "\x27\x5c\x5a\xb8\x82\xed\x39\x85\x56\xb8\x7a\x3d\x37\x42\x33\xdb"
- "\x63\x59\xfc\x05\xdf\xd3\x54\x8d\xf1\x79\x93\xaf\xa0\x2f\xc9\xd8"
- "\x83\xba\xb6\x81\xf9\xa1\x97\x8d\x48\x70\x37\x57\x82\xe5\x43\xff"
- "\xea\x1c\x60\x79\x07\xdc\xce\xbd\x68\x8a\x93\x6c\xc1\x0b\xb4\xb6"
- "\x74\x92\x06\x7d\x5a\x56\x1d\xd9\x48\xc2\x2c\x24\xb5\xb2\xb1\x83"
- "\xa4\x46\x8b\x3e\xe3\x93\xf1\x1c\xcb\xb2\x4a\xc4\xb1\x9d\x46\x68"
- "\x3b\x0d\x5b\x63\xed\xaa\xc2\x3c\xaa\x2a\xac\x60\xfe\x29\x41\xfe"
- "\x60\xbc\xb3\xae\x71\x29\xe2\x0a\xc6\xa6\x55\xcd\x57\xc8\xcb\xd1"
- "\x54\xa8\x8a\xc5\x53\x80\x00\x30\x19\xf9\x1b\x62\x4c\x1a\x9b\xfe"
- "\xbe\x9e\xa6\x01\x5e\xfc\xec\x40\x37\x01\xc7\xa4\x80\x2d\x1c\x9f"
- "\x4a\xf8\x02\x7d\x16\x28\xc5\x88\xa2\xc3\x46\x44\xc0\x3b\x05\xc6"
- "\x90\x2a\x82\x31\x69\x51\x22\x99\x50\x04\xef\x58\xbc\x4f\xa8\xf7"
- "\x1c\xbd\x9a\x0a\x2f\xea\x48\xc9\x0b\x44\xe9\x7f\x91\xc7\x90\xb5"
- "\x03\xed\xbb\xe2\x28\x18\xa2\xca\x67\x5f\xd4\x92\x83\xba\x53\xa0"
- "\x97\xf6\x80\xfc\x8e\x2a\xef\x04\xd9\x0d\xb4\xb4\x0f\x8c\x96\xaa"
- "\xc0\xeb\x45\xcb\xce\xe0\xf9\x46\x4e\xcf\x48\x82\x34\xeb\x4e\x4f"
- "\xa4\xf1\xda\x46\xa0\x27\xd0\xd5\x54\x6b\x27\x01\x32\xb2\x48\xa2"
- "\x67\x21\xd0\x13\x68\xaa\x41\x9a\x02\x3d\x18\x4d\xa9\x48\xd3\x12"
- "\x27\x9a\x82\x7c\x62\xbe\x3c\x91\xa6\x02\xd0\xb4\xc4\x0d\x4d\xbb"
- "\xc6\xf7\x40\xd3\x9d\x1e\xd1\xb4\x6c\x10\x34\xf5\x77\x1b\xff\xcd"
- "\x86\x3a\x33\x37\x6a\x0f\x05\x99\x67\xb2\x7d\xc2\xfc\xd2\x52\x43"
- "\x91\x42\x30\x80\x9c\x53\x6d\x2d\x07\x9a\xa8\x70\x4f\x00\xc6\x2c"
- "\x63\x3e\xe4\xca\xe8\x35\x7b\x6e\x71\x20\xa6\x81\xec\x8a\x7d\x10"
- "\xfd\xf0\xe9\xcd\xa4\x44\x4e\xcb\xab\xaf\xb6\x81\x8e\x09\x2c\xee"
- "\x40\x9b\x33\xb7\x38\x4c\xa0\xb1\x04\xe5\xc8\x82\x49\x44\xd1\x01"
- "\xb2\x42\x9f\x48\xc6\xe7\x81\xbc\xeb\x00\xf9\x79\x41\x16\x30\xfd"
- "\x49\xbd\x40\xe1\x4a\x45\xff\xaa\x82\x7f\x11\xca\x75\xc6\x5f\xe4"
- "\x19\xae\x35\x56\x2d\xf8\x18\xca\x53\x4f\x3a\x1a\x69\x23\xa9\xb1"
- "\x3d\xf9\x2b\xa4\x46\x68\xed\x86\xfe\xfb\x09\xc6\x4d\x4c\x6e\x42"
- "\xbe\xee\x21\xa6\x46\x47\x3f\x11\x56\x73\x39\x8c\xbc\xc0\x7e\x81"
- "\x7d\x64\x93\x93\xfc\x05\xd9\x1e\x58\x2c\xc6\x11\xb1\x83\xfc\x2d"
- "\xc6\xb8\x08\xc0\x4b\x8c\x2f\xd2\x6b\xff\x78\x19\xfa\xc7\x5a\x16"
- "\xe3\x49\x03\xf4\xd8\xd3\xd1\xce\x79\x88\x3c\x33\xd9\x2a\x18\xff"
- "\xf2\x44\x79\xcf\xe9\x5e\x78\x94\xd2\x08\x62\x87\xba\x0b\xb9\xc5"
- "\x84\xb6\xc7\x8e\xc0\x79\x49\x18\x3f\x87\xa8\xa3\xc1\x76\xf8\x0e"
- "\xf4\x41\x1c\xe0\xeb\x12\x99\xb0\x33\x0e\xec\x81\x76\x8c\xd5\x06"
- "\xf5\x59\xc3\x63\xdc\x0a\x19\x23\xf6\xc1\x3b\xe6\x2f\x56\x90\xfc"
- "\xc5\xb6\xea\x70\xdc\xef\x98\x2f\x5a\xa1\x93\x3b\xbe\xf9\x19\xb1"
- "\x2b\xed\xd3\xd9\xd9\x7a\x99\x9a\xc7\xbd\x55\xbe\xab\x44\xba\x36"
- "\xcb\x02\x27\xf0\xf9\xe0\x0f\x54\xfa\x14\x32\xfc\x82\x4c\x7d\x02"
- "\x6c\x2b\xa2\xc7\x78\xdd\xd2\xbb\xd4\x08\xa4\x43\xe4\xd4\x34\x92"
- "\x66\xcf\xb2\x47\x98\x92\x2e\xa2\xff\xc5\x01\xca\x5e\x35\x8b\x5f"
- "\x66\xcf\xfc\x0c\x75\x79\xa8\x90\xfd\x99\x0a\x64\x4a\x08\x7d\x11"
- "\xda\xfa\x02\xb4\xf5\x02\xd0\xf5\x02\xb4\x75\xb5\xd8\x56\x31\x7e"
- "\x9d\x00\xf4\x87\x77\xbd\xeb\x3f\xa9\xad\x2f\xa2\xaf\xf5\x77\xea"
- "\xd6\x5d\x24\xb7\xd1\x7b\x71\x7d\x97\x9d\x7d\x6c\x37\xd9\x4e\x11"
- "\xfc\x2e\xd3\xcf\x86\xa8\xcc\xe7\x00\x8f\x48\x73\xb0\x09\x2c\x34"
- "\x60\xab\x59\xe2\x03\xd6\x87\x76\xc6\x8e\x28\x89\x83\xfa\x20\xed"
- "\x2f\x91\xc9\xd8\x9f\x81\xf6\x13\x4a\x90\xfe\xae\x31\xa4\x83\x18"
- "\x0f\x86\x01\x0f\xe2\x44\x1e\x64\x89\x3c\x00\x5b\x11\x74\x35\xce"
- "\x71\x68\x4a\xd2\x39\x0f\x06\x46\xa3\x51\x41\x43\xdc\x5f\x83\xdc"
- "\xf7\xd7\xa0\x67\x3a\xf8\x18\x52\x86\x7e\x6b\xc1\x3e\xfe\x83\xd0"
- "\x09\xfd\x36\x57\xec\xb7\x34\xf6\x57\x52\x9f\x3d\x2f\x1b\x75\xd1"
- "\xb3\x3e\x3b\xfa\xd4\xbf\x68\x9f\x0d\xba\xbe\x7d\xf6\xb6\xd7\x5c"
- "\xfb\xec\x6d\x75\xae\x7d\xf6\xb6\x1c\x47\x9f\x15\xdf\x0d\x49\x9f"
- "\xbd\x6d\xd7\xf7\xd3\x67\x6f\xdb\xd5\x4b\x9f\x6d\xf3\xa0\xcf\x6a"
- "\xdc\xf4\x59\xcd\xf5\xeb\xb3\x41\x15\x37\x4e\xc7\x6a\xfc\x3a\xe4"
- "\xbd\xe8\xd8\x97\x9d\x74\xac\x3f\xea\xd8\xdb\x8b\x7a\xeb\xaf\x9d"
- "\x45\xd0\x5f\x55\x62\x7f\xfd\xf7\xf7\xa0\xbc\x3b\x0a\x3e\xa9\xef"
- "\xbf\xbf\xda\x8a\x1c\xf6\x93\xdb\x3e\x1b\x8b\x7d\xb6\x8c\x98\xcc"
- "\xac\xcf\x2e\x92\xfa\x6c\x91\x38\xde\xe9\xa3\xdf\x06\xb9\xeb\xb7"
- "\x18\xd3\x0b\xe3\x79\xf5\xd9\x6f\x45\x7b\xa9\x73\x2c\xf6\x5b\xe3"
- "\x4d\xa6\x6b\xef\x9c\xef\xda\x6f\xef\xcc\x73\xed\xb7\x77\x3e\xe9"
- "\xe8\xb7\xe2\xbb\x21\xe9\xb7\x77\xce\xfb\x7e\xfa\xed\x9d\xf3\x7e"
- "\x38\xba\x56\xe3\x76\xdd\x7c\xe8\x75\xed\xdd\x07\x59\xbf\x75\xa7"
- "\x6b\x53\x45\x5d\xeb\x8f\xba\xf6\xae\x3f\x79\xd6\x77\xc7\x3c\xf3"
- "\x2f\xde\x77\xaf\xb3\xce\xbd\xfb\x2e\xd7\xbe\x7b\xf7\xd3\xae\x7d"
- "\xf7\x6e\x99\xa3\xef\x8a\xef\x86\xa4\xef\xde\xad\xf9\x7e\xfa\xee"
- "\xdd\x9a\x1f\x8e\xce\x0d\x9e\xe1\xae\xef\x6a\xc7\x91\xb4\x06\x59"
- "\x70\x81\xa9\x88\xed\xc1\x4b\x33\xd9\x7e\x41\xd8\xbe\x15\x59\xf0"
- "\xfb\x26\xcd\x74\x22\x64\x57\x87\x63\x5c\x16\xdc\x3f\xb3\xc5\x69"
- "\x7f\x0a\x5b\xd3\x95\x05\x9f\x92\xf6\xd7\xec\x14\x63\xb7\xf4\xb5"
- "\xbf\x86\x66\x56\x99\xf9\xef\xc6\x6a\xc4\x3d\x35\x8d\xd2\x33\xf3"
- "\x25\x23\x1b\x1b\x4c\xb3\xaa\xea\x2d\x7e\x55\xf5\xee\xd6\x49\x02"
- "\xd6\x53\x8a\x7b\x4a\x5a\xc7\xc5\x85\xb7\x66\x13\x92\xc7\xd6\x20"
- "\xc6\xce\x85\x36\x26\xb3\xbd\x14\x01\xa3\x43\x5a\xd3\xc3\x09\xa4"
- "\xc5\x4a\x69\x2c\x8e\x76\xba\x0f\x15\xe0\x1d\xc8\x90\xe0\x9d\x29"
- "\x44\x89\x7e\x8e\xa7\x5e\x45\x2c\x8e\x4d\x02\x19\xc1\xf6\x8b\xb0"
- "\x75\xfc\x3b\xef\x6e\x2b\x69\x21\x8a\xea\x8d\x6c\xdf\x1c\xee\xcb"
- "\x29\xcd\x45\xfc\xfb\x3c\xb0\x9d\xca\x15\x44\x28\x5e\xa0\xa3\xfe"
- "\x45\x4a\xb6\x8f\x18\xb0\x22\xed\xd5\xc1\xd8\x80\xc2\xd8\xf9\x15"
- "\x92\xaf\x5d\x0a\xf5\xfb\x20\x05\xcf\x99\xfa\xd0\x92\x78\x12\x08"
- "\x97\x8a\xe6\x14\x29\xdb\x33\xc6\x11\x69\xfe\xd0\xed\x9e\x70\x8c"
- "\x05\x7c\xb7\x46\x21\xee\x0b\x42\x9f\x03\xec\x8c\xe5\x26\x39\x48"
- "\x26\x48\xa7\xe9\xa9\xd4\x94\x64\x23\x6a\xa0\x05\xae\xe1\x63\x4c"
- "\x31\xa1\x24\x2e\x7c\xc3\x18\x42\xde\x5c\xdb\x24\xc7\xfd\x1c\xf6"
- "\x6d\x77\xb7\x19\x53\x7e\x82\x6b\xfc\x2c\x7e\xc0\x79\xd9\x38\x7b"
- "\xd8\x37\x3c\xee\xef\x79\xd9\x78\x3f\x5c\x7b\x98\x0d\xcf\xb8\x46"
- "\x2e\xb4\x6a\x14\x98\x17\xf2\xbc\x63\x4c\x3c\x49\xd4\x7a\xb6\xd7"
- "\x9e\xc7\xe4\x90\x8d\xdb\x88\x79\xcd\xb2\xf1\xac\xad\xf0\xcc\x62"
- "\x6a\xe2\x7e\x7c\x76\x6e\xa3\x68\x81\x8e\xc9\x07\x43\x91\x52\x18"
- "\xbb\x40\xc7\xf6\x8d\x42\x3b\x37\x41\x9b\x21\x8f\x0a\xf7\xeb\xb0"
- "\x7b\x0a\x09\xcc\x87\x34\x2c\x07\xee\x2a\xb6\x67\x58\x36\x2e\x01"
- "\xcb\x76\x7b\xd6\x40\x55\xa4\xa4\x80\x6d\x7e\xf6\x46\x76\xac\x41"
- "\x36\xbe\x4c\x2d\xa3\x94\x16\xcd\xaf\xd8\x80\xf3\xd8\xb8\xbf\x1b"
- "\xf7\xac\xcb\xc6\xaf\x87\xf2\x15\x3b\xd9\xbc\xed\xf8\x48\xb3\x6c"
- "\x9c\xaa\x6b\x3f\x02\x5b\x6b\x19\x5f\x8e\xdf\xc1\xdf\x88\xf9\xc3"
- "\x19\xfe\xa0\xce\xda\x14\x1f\x0a\xcf\x7f\xe3\x7b\xc0\x95\x91\xf0"
- "\xfb\xd2\xae\x3d\xe0\xfc\x77\x80\xa5\xf1\x7b\x01\x9b\x3a\xb6\xff"
- "\x4d\xde\xfb\x9c\x3f\xdb\x93\x2c\xf2\xad\x0a\xd0\xdd\x83\x77\x12"
- "\x46\x00\x17\x12\x46\xb0\xbe\x6f\xa5\x98\xe5\x4c\x1f\xc9\xb4\x8f"
- "\x61\xbe\x5c\xe0\xa1\xbd\x50\xa3\x60\x73\xd3\x9d\xc8\x97\x06\x7c"
- "\x77\x0d\xf9\xb2\x09\x74\x81\x98\x37\xd8\x51\x7f\x7c\xbe\x87\xf1"
- "\x53\x00\x5e\xb0\x3d\x4f\x32\x6d\x15\x8b\xdf\x04\x32\x03\xf7\xaa"
- "\x1f\x48\x82\x7a\x21\x6e\x01\x23\x6f\xc6\x5b\xe5\x25\x89\x3c\xfd"
- "\x83\x16\xab\x7c\xd3\x05\x82\xb2\x85\xe4\xbc\x40\x14\xa0\x87\x14"
- "\x58\x26\x0d\x9e\x5f\xf1\xa0\xc4\xc7\xb5\xc0\xbb\x44\xc0\x2e\xd0"
- "\x7c\x13\xd0\xaf\xa4\x83\xad\xd5\x54\x94\x08\x44\x25\x40\x3e\xb3"
- "\xec\x1e\x25\x94\x17\x88\xb1\x4a\x71\x4f\x35\xd0\x30\xa1\x3d\x43"
- "\xdb\x28\xd1\x10\xeb\x84\x7b\xa2\x31\x6e\xa9\x59\xa6\x8d\xe4\x18"
- "\xd2\x86\x48\x6d\x76\x47\xcf\x9c\x37\x49\x70\xce\x54\x32\x5d\x50"
- "\xb6\xc7\x52\x9f\xbb\x4b\x71\xbe\x79\x4e\x33\xfa\xac\x6a\x22\x61"
- "\xaf\x9c\xa6\x26\x8b\x9d\x08\x7e\xed\xb1\xb8\x0e\x61\xdf\xf0\xc0"
- "\xe8\xb0\x35\x04\x6d\x8d\xd8\x54\x2b\x09\x34\xa5\x58\x78\x9c\x41"
- "\x72\x99\xd8\x57\x82\x0c\x07\xb9\x0e\x3a\x55\x91\x7a\x99\xdc\x85"
- "\xf4\x12\xfc\xb7\xc6\x02\xcd\xde\x7d\x2e\x81\xa4\x0d\x4c\x8e\xde"
- "\xc3\xce\x6f\xa2\x7d\x01\x32\x5f\x8e\xfb\xf2\x4c\x16\xb0\x4f\x72"
- "\xb6\xc6\x0e\xb0\x9c\x4a\x77\x32\x12\xdb\x2d\xe0\x3c\xb4\xd8\xe6"
- "\x30\x6c\x73\x9b\x95\xe0\x5c\xfe\x9c\x97\xd0\x57\xf2\x15\x22\x64"
- "\xb5\xc7\x62\x9b\x05\xff\xc2\xa6\x81\xcf\xe9\xdf\x3b\xab\xaf\x6f"
- "\x53\xa0\xb7\xb0\xe1\xee\x52\x41\x55\xd8\x84\xdf\xc6\x3a\xe0\x39"
- "\x9f\x39\x57\x08\xa3\x3b\xd2\xdf\x64\xb5\x13\xea\xe7\x5c\x07\xdb"
- "\x40\xeb\xe0\xbe\xfd\x53\x49\xb0\xe1\x4d\xce\x77\xfb\x06\x91\x06"
- "\xb1\xb8\x0e\x56\xd8\x84\xf1\x35\xe6\x60\x1d\x2c\x17\xc9\xec\x8b"
- "\x84\xf1\xdf\xa4\x6b\x26\x76\x9f\x07\x46\xe3\x9e\x03\xe4\x7f\x8a"
- "\x0d\xf8\x7f\xd5\x8a\xfe\x91\x2c\xa6\xb4\x6b\x04\xed\x17\x5b\xab"
- "\x4e\xde\x93\xff\xf7\xbd\xfb\x5c\xd2\x40\xf9\x7f\xdf\x10\xf1\xff"
- "\xbe\x9b\xa0\xfd\x13\xbc\x68\xff\x84\x21\x6a\xff\x84\x9b\xa0\xfd"
- "\x13\xbd\x68\xff\xc4\x21\x6a\xff\x44\xb7\xed\x7f\xe2\x2e\x81\xb2"
- "\xbd\x28\x01\x9b\xd9\xfa\x24\xd7\x57\xf7\xbf\x8d\xfb\x4e\xd8\xb9"
- "\x2e\xf1\x99\xf0\x73\x5e\xca\x6e\xcf\xaa\x6e\xcf\x81\xdd\x9e\x83"
- "\xba\x3d\x6b\xba\x3d\x07\x4b\xcf\xa0\x47\x7c\x2f\xc9\xee\xbf\x07"
- "\xec\xd2\x34\xb3\xec\xfe\x7d\xe2\xfb\x09\xe8\x3f\x0c\x74\xfa\x84"
- "\x3e\x62\x5d\xde\x7d\x41\xf6\x23\x76\x4e\x9b\x6e\x18\xa3\xa3\x6b"
- "\xd3\x88\x60\x88\xca\x9f\xb3\x0e\x64\x17\xf0\x8f\x76\x6a\x86\x81"
- "\x8d\x70\x27\xfa\xa8\xc3\x7d\x07\xda\x78\xdc\x4f\xf2\xa3\xdb\xb1"
- "\x7d\x53\xf5\x46\x22\xf8\x3c\xc0\xd6\xf3\x85\x9c\xa8\x7c\x8b\xcf"
- "\x03\x63\xe8\x8e\x62\x7d\xae\x5c\x50\xe6\xa6\x0b\xda\x75\x16\x6a"
- "\x79\xfa\x32\xc8\xa1\x2b\xe8\x37\x1e\x78\x9c\x40\x2d\xc6\xf8\x8b"
- "\x50\xdf\x1f\xad\xab\x4a\x86\xb2\xe1\x3b\xf0\x2d\x18\xc7\x45\x25"
- "\xf0\xd8\xeb\x51\xf9\xd5\x6d\x15\x04\xe3\x09\x89\x65\xe6\x51\xff"
- "\xa8\x04\x2c\xb3\x57\xfb\xd4\xb0\x45\x01\xdf\xfc\xc5\x73\x3a\x05"
- "\xa1\xeb\x15\x41\x03\xe3\xe9\x8f\x4a\xdd\xda\xbd\x86\x2d\x1b\x79"
- "\xb9\x4a\x6f\xca\xb5\xba\x2f\x37\x5f\xac\x6f\xa0\x17\xe5\xea\xc2"
- "\xfb\x28\x57\xac\xaf\xd6\x9b\x72\xcb\xdc\x97\x5b\x20\xd6\x37\xd4"
- "\x8b\x72\x27\xf5\xd8\xff\xe9\x54\xae\x58\xdf\x34\x6f\xca\x75\x1f"
- "\xff\x17\xf0\xe0\x1d\x16\x26\xf5\xd8\x93\xef\x8c\x05\xef\x70\xf0"
- "\x40\x1f\xed\xcf\x57\x78\x87\x81\x07\xe6\xf6\x85\x01\xef\xf8\xff"
- "\x40\x9f\xfc\xf7\x8e\xf7\x0f\xd8\xfa\xe2\xbd\x77\x7c\xff\xb1\x5b"
- "\xfc\xa3\x2d\x4f\x0d\x9b\x8d\x34\xa0\x38\x52\xc8\x8d\x32\x0a\x01"
- "\x9b\x3f\xde\x20\x84\x92\x27\x40\x86\xa9\xb7\x93\x51\xa1\x6c\x7c"
- "\xfc\xe3\xc6\x75\x45\x44\x0e\xe3\x5d\xf9\x1b\x6b\xeb\xe4\x26\xdb"
- "\x74\xd4\x39\xf6\x5d\x89\x56\xd9\x7d\x90\xfe\x11\xe8\xac\x36\xb0"
- "\x3b\x79\x39\x51\xc6\xdc\x94\x50\x22\xfa\xcc\x68\x43\x1f\xa9\x61"
- "\x20\xc7\x4c\xdb\xad\xb8\x6f\x65\x14\xfc\xce\x06\xf8\x85\x32\xac"
- "\xe4\x2d\xc1\x22\x0b\x8d\x67\xf9\x2c\xec\x7c\x5e\xee\xe6\x8f\x69"
- "\xaa\x0e\x7d\x27\x5a\xce\xcb\x26\xcf\xf6\xb1\x10\x39\xfa\x38\x6a"
- "\xcf\x98\x3c\xcb\x2c\x9b\x32\x5d\x3c\x8f\xda\xcc\x7c\x7c\x42\x7d"
- "\xf1\xac\x27\xe6\x45\x5f\x9f\x53\xf5\x44\x8e\xfe\xd7\x21\x6f\x02"
- "\xfa\xfd\xec\xeb\x5c\xb7\xdd\x50\xb8\x0b\x7f\x4f\x0d\xa0\x43\x2f"
- "\x12\x39\x9e\xe5\xa4\xc1\x0b\xb4\xb9\x30\x86\x78\x72\x12\xce\x79"
- "\xb4\x90\x94\x75\x54\xc0\xf9\x27\xaa\xda\x1a\x81\x7b\xe3\xd8\xbe"
- "\x71\xd9\x94\xc0\x12\xbe\x8f\xdc\xca\x62\x0d\xc3\x33\x1b\xc7\xe0"
- "\xde\x18\x55\xd4\x2c\x9a\xeb\x1f\x5a\xdd\xd6\xc2\xe2\x05\x35\xc8"
- "\xa6\x8c\x42\xff\x8b\xad\xaa\xc2\xd2\x36\x55\x61\x59\x7b\xc6\x14"
- "\x95\xd4\x06\xfc\xbe\x94\x8e\xe3\x36\xcc\x07\xef\x27\x4b\xe7\xbc"
- "\xdd\xc4\xde\x1e\x1d\xa6\xa1\x96\x2e\xbf\x1a\xb2\xa9\x7f\x45\xda"
- "\x83\xad\xb0\xbd\x2d\x55\x37\x8e\xcf\x63\x4c\x29\xc7\xf1\x30\xd4"
- "\x7b\x23\x1f\x9b\x46\x6d\x64\x3e\x78\x41\x07\x3c\xa7\x93\x0f\xd0"
- "\x6e\x9d\xc2\xf4\xbf\x71\x1c\xea\xc8\xa9\x6b\xa0\xfc\x5f\x42\x9b"
- "\xea\xf9\x58\x2c\x6a\x3b\x3b\xdf\x28\x9b\x92\x04\xdf\xd8\x0e\xcf"
- "\xa1\x98\x0f\xde\xdb\xc4\xf7\xa5\x4e\xef\x4b\x71\xaf\x24\x7f\x3f"
- "\x55\x1c\xcb\x45\xed\x72\x7a\xbf\x4b\x3f\x0e\xe7\x26\xa6\xce\xc4"
- "\x36\x00\x1d\xd3\x50\xb7\x75\xf9\x09\xf1\x8f\x4a\x13\xf3\xe5\x37"
- "\xcb\xa6\xce\x6f\x05\x6c\xc1\xfb\x22\xa7\xdf\x17\xed\x4f\x0a\x21"
- "\x4f\x14\x23\x0d\xa7\xea\xcd\xf2\xc2\x03\x7c\x3c\x3b\x25\x99\xb5"
- "\x5d\x15\x95\xe4\x5c\x9e\x59\x36\x75\x06\x94\x99\xd4\x06\x76\x14"
- "\xe4\x89\xc6\x6f\x3a\xd3\x5b\x3a\x65\xa9\x8d\x5e\xbe\x48\xbb\x78"
- "\xc5\xaa\x38\x3c\x25\x37\xc2\x65\x8f\x63\x20\x9e\x23\x15\x0c\xdb"
- "\x32\x4d\xdb\xf1\x5c\x5b\x20\x3b\x0f\x9e\x8f\xfb\xa6\x02\x8a\x8c"
- "\xf6\xdc\xa2\x70\x21\x60\xab\xde\xb8\xf6\x71\x72\x49\xf6\x20\xf3"
- "\x03\x62\xd2\x12\x62\xd8\x8a\x7e\x3c\x3e\xc1\x34\xe6\xaf\x14\xe3"
- "\x4a\xb1\x31\xfb\x5a\x25\x39\xa0\x6d\x61\xe3\x7e\x78\x37\x9b\xcd"
- "\x71\x5c\x21\x72\x5b\xba\x92\xfc\x33\xa5\x46\xbe\x4f\x30\xcb\xff"
- "\x29\xd4\xb1\x7d\xba\xfb\x35\x15\xe4\xc1\x24\x25\xc6\x50\x94\x7f"
- "\x08\x63\x69\x7c\x8f\xef\xa4\xb3\x08\xf0\xfb\x62\xb6\x67\xf7\x5e"
- "\xfe\x7f\xea\x76\x7a\x66\xbf\x46\xf4\x59\x21\x9b\x7a\x19\xeb\x8a"
- "\xfe\x3c\x80\x8e\x57\xb0\x7e\x40\x8b\x36\x9f\x22\xb6\x77\x59\x05"
- "\xf9\xcf\x08\x39\xdb\xd0\xd7\xb3\xca\x96\x31\xb5\x8c\xa6\xab\x76"
- "\xe1\x19\xbb\x22\xf1\xdc\x5d\x7b\xc6\x83\x95\x4e\xe7\x49\x55\xad"
- "\x72\xf2\x6b\x48\x33\x4b\x67\x1b\x30\xce\x99\x3b\xf9\x62\x05\x1b"
- "\xef\x5a\xf0\xfc\x32\x41\xb5\x0d\x78\xb1\x2d\xb3\x62\x26\xc1\x79"
- "\x17\x19\xee\x99\x6d\x96\x3d\x54\x47\xfd\xb7\x25\xa5\x60\x9f\xce"
- "\xdd\xaa\xff\x07\xee\xfb\x03\x3a\xee\xc6\x7d\x7e\x40\xcb\xd7\xe1"
- "\xf9\x93\x59\x65\x44\xfb\x2c\xda\x4e\x21\xcf\xfc\x3e\x9a\xda\x1e"
- "\x08\x37\x92\xca\xc6\xff\x25\x47\x6b\x2b\x88\x6a\x1e\xf1\x49\x35"
- "\x53\x3b\x6b\x63\x02\x91\x87\x99\x89\x4f\xca\x15\xec\xd3\x76\x82"
- "\xe7\x07\xaa\xad\x55\x60\x0f\x2d\xab\x7c\x23\xa5\xc9\x57\x3b\x87"
- "\x10\xe8\x7b\x6c\x8d\x99\x9d\xf3\xb1\xb0\x33\xd2\xfe\x38\xdf\xed"
- "\x74\xbe\x67\x7b\x72\x24\x15\xd6\x5d\x24\xca\xaa\xd8\x53\x24\x2c"
- "\xd2\x87\xb2\xf3\x3d\x49\x90\xd1\x02\xbc\x5f\xad\x0b\xb0\xaf\xd6"
- "\x8d\xde\x71\x95\x04\x55\x27\x98\xc1\x36\xab\x20\x85\xf1\x24\x88"
- "\xb6\xc7\xfa\x55\x56\x7c\x42\x68\xf6\xb5\x90\xb7\x52\x8c\xbe\x76"
- "\x25\xdf\x5f\xa5\x5e\x2f\xc3\xf9\xcd\x00\x03\xee\xb3\xba\x4a\x42"
- "\x16\x9e\x4b\x63\x73\xb2\x38\xff\x6d\x6b\xd7\x69\x3b\xdb\x75\xf7"
- "\x76\xac\xd6\x8d\x93\xe6\xcd\xe7\x5f\x0c\xc4\x75\x82\x08\x9a\x71"
- "\x6f\x1e\xee\xed\xc3\x71\x80\xcd\xcf\x3e\x1d\xe7\xc8\x11\xc3\xf0"
- "\xfd\x60\x61\xb1\x8e\x3c\x68\x61\x67\x8f\x70\xde\x3e\xb0\x24\x0a"
- "\xeb\xda\x42\xd8\x5e\x21\x3f\xbe\x57\xc8\x8a\x6b\xd6\xaa\x42\xeb"
- "\xec\xa5\x5a\xd2\x31\x76\x7e\x99\x29\xe9\x1f\x24\xf5\x1a\x3d\xc3"
- "\xec\xf8\x24\xc0\x6d\xc6\x83\x56\xea\x5f\x68\x3d\xa8\x3b\x8e\xfa"
- "\x64\xda\xc0\xe5\xc3\x43\x6c\xfd\x17\x69\x03\x7c\x32\xee\x6e\x41"
- "\xbe\x6d\xd5\xff\x4f\xbc\x45\xfe\x54\x23\xb5\x55\x45\xff\x83\x1c"
- "\xad\xab\x71\xe1\x0f\xe3\x27\xe4\x43\x3e\x21\x8f\x90\x57\x0e\x3e"
- "\x1d\x67\x7c\xda\x2d\x70\x3e\x75\xa8\x36\x1b\x25\x5e\x59\x8b\xe6"
- "\x97\x7b\xc2\xaf\xca\xc6\xde\xf9\x05\x74\xee\xe2\xd7\xab\x2d\x24"
- "\xc8\xd4\x5c\x83\xeb\x05\x7e\x4f\x3d\x43\xc8\x53\xaf\x53\xa1\x6a"
- "\xd6\xa7\x5d\x7c\xb3\x65\xba\xe1\xdb\x37\x0e\xbe\x01\xff\xfb\xe0"
- "\xdb\x7d\x41\x03\xe1\x5b\x65\x23\xe7\x9b\x4d\xdc\xe3\xa5\x3b\x40"
- "\xe4\xd6\xd5\x3a\xf9\xf6\xab\x64\x3a\xf2\xef\xe9\x73\x5a\x72\x70"
- "\x6e\x15\xf0\xec\x7f\x5d\xf8\x27\xe4\x14\x6e\x07\x1e\x94\x22\x0f"
- "\xbd\xeb\x77\x8f\x84\x7b\xde\xef\x1e\x3e\x72\xab\xdf\x0d\x55\xbf"
- "\x7b\x58\x3f\xb8\x7e\xf7\x48\xf0\xad\x7e\xf7\x7d\xf7\xbb\x47\x34"
- "\xdd\xfb\x5d\x97\xdd\x10\x1f\xb3\x7c\xd1\xd2\x38\x3c\x9e\x18\xb5"
- "\x26\x21\x66\x25\xb7\x1e\x5c\xec\x07\x8d\x3d\x25\x54\x8e\xfe\xe5"
- "\x2a\xb7\xd7\x90\xb7\xc6\xd4\xc8\xed\x5f\x6b\x14\xd4\xa0\x4e\x13"
- "\x0c\xa3\x95\xe8\x27\x14\xfb\x67\x3e\xfa\xf0\x90\xfd\xb2\xb6\x3a"
- "\x98\xc7\xe4\xc4\xff\x99\xed\x14\xbc\x60\x3a\xae\xd7\x6c\xe8\x80"
- "\x6b\x2d\x51\xa8\xad\x44\x69\x1c\xc7\xde\x3f\x84\x7e\x13\x69\xf1"
- "\x82\xe9\x25\xf0\x0e\xfd\xf0\xb4\xa9\xa2\x42\x37\x42\x79\x16\xff"
- "\x6d\x99\x0a\x2d\x9e\xbb\xf8\x59\x1e\xe8\x7c\x63\x97\x5f\x25\xd9"
- "\x2f\xda\xe8\xb0\x9f\x9a\x51\x36\xe0\x39\xb9\x4b\xb2\x9f\x1d\xbc"
- "\x86\xeb\x1d\x60\x53\x3f\x37\x09\xbe\x35\x76\x7e\x39\xf3\xb3\x00"
- "\x72\x82\xbf\xff\x39\x8b\x41\x76\xcd\xb0\x55\x8f\x36\x47\xab\xaa"
- "\xc8\xd8\x6a\x28\x0a\xff\x24\x79\xbb\x28\x27\x7e\x76\xf9\xa9\xed"
- "\x5c\x4e\x54\x69\x00\x87\x4f\x03\x0e\x23\xfa\x93\x13\x4e\xf8\x1b"
- "\x37\x30\x39\x81\x78\x43\xdc\x21\xe6\x46\x02\xe6\x10\x87\x12\xee"
- "\xb6\x88\xb8\x53\xd7\x93\x40\x86\x3d\x1b\xc7\x1e\x9e\x73\xae\x4a"
- "\x72\xe0\xce\xde\x1d\x77\x57\xbb\xe1\x4e\x2e\xe2\x6e\xb5\x2b\xee"
- "\x9e\x3f\x15\x48\x0a\xb9\xbc\x70\xe0\x2e\xcb\x3e\x5d\xc2\x1c\xe2"
- "\x0f\xb1\x26\xfc\x59\x47\xaa\x9a\x5b\xba\xf0\x57\xb2\x84\xaf\xb9"
- "\xb2\x3d\xbd\x72\xba\xe7\xda\x6a\x51\x5e\x5c\x94\xe4\xc5\xab\x6e"
- "\xf4\xf4\x29\x2f\xe5\xc5\xcf\xd9\xfa\x33\xf2\xaa\x03\xf8\x86\xfc"
- "\x7a\x4a\x03\x72\x42\xf3\x9f\xe4\xe8\xdc\x9b\x84\x3f\xf1\x43\xc3"
- "\x1f\xf4\x7d\x0b\x75\xe9\x85\x47\xf7\x04\xf7\xc7\x23\xe4\x0f\xf2"
- "\x89\xf1\x07\xf8\x24\xad\x8b\xe3\x3a\x29\xf2\x0a\xf9\x33\x35\x99"
- "\xc8\x91\x5f\x25\x89\x5c\x46\xa0\x2c\x60\xfb\xb0\xbb\xc9\x78\xa0"
- "\xf9\x2c\xe4\x19\x1b\x5b\xa7\xfb\x2f\xcb\xc7\x73\xc4\xa3\x25\x3b"
- "\xfa\x97\x41\x3d\xed\xe8\x5f\xea\xba\xfc\x60\xca\x7e\xc6\xfc\xab"
- "\x18\xc7\xfc\x02\xfa\xe7\xcf\xb8\x0f\x47\xc3\xb6\xe9\xdc\x86\x9f"
- "\xf1\x8a\x28\x03\xb4\x38\x76\x65\xe3\x54\x3b\x8c\x53\x55\x30\x4e"
- "\x35\xc0\x38\x35\xa9\x89\xfb\x4e\x90\xfd\x72\x3d\x11\xcf\x37\x53"
- "\xff\xad\x11\x30\x46\x9a\x85\x74\x65\x6b\xbe\xfe\x85\xa5\xb8\x46"
- "\x45\x73\x60\x0c\xfc\x9f\x72\x02\xcf\x65\x07\x75\xf6\x01\x62\xea"
- "\x97\xa5\xe2\x9a\x76\xbd\x7e\x2d\xee\x77\x98\xa1\xe7\xf5\xfb\x19"
- "\x8b\x69\xc3\xd6\x03\xe5\x42\xa9\x7d\x83\xeb\x7a\xa0\xf3\x7a\xf1"
- "\x5b\x29\x16\x71\x2d\x70\xc6\x33\x2c\x0f\x8e\x9f\x40\x0e\xbe\x01"
- "\x63\x1a\xc7\x7a\xe0\xa7\xf8\xfe\x4f\xae\xeb\x81\x33\x98\x8f\x39"
- "\xb3\x6c\xc6\x46\xdc\x03\x03\xcf\xa1\x3c\xfd\x67\xb3\x9c\xd3\x1d"
- "\xeb\xed\x3c\x5d\x90\xb3\x98\x2b\x38\x5f\xd0\xcc\xe7\x09\x66\x14"
- "\x49\xe3\x71\x37\xf6\xd3\x00\xe4\xf4\x63\x79\x0e\x39\xfd\x18\xdf"
- "\xab\xa5\x29\x8e\xad\xea\x21\xa7\x4f\xc2\xfb\xd0\x8b\x73\x50\x4e"
- "\x1b\xb6\x46\xf2\xfa\x3d\x3a\x09\x68\xe2\x83\xb1\x33\x31\x1d\xcf"
- "\x1f\xa1\xbc\x2e\xc6\xb3\x39\x4c\x86\x17\x47\x6c\x64\xeb\xfe\x8f"
- "\x3e\xed\x2a\xbb\x43\xf7\xb8\xca\xee\x47\xd7\xf7\x2d\xbb\x7f\xfd"
- "\x68\xdf\xb2\xfb\xd1\x37\x6e\xc9\xee\xa1\x96\xdd\x92\xad\xe7\xad"
- "\xec\xfe\xb5\xf2\x96\xec\xbe\xd1\xb2\xfb\xd7\x0a\x27\xd9\xfd\x47"
- "\x57\xd9\x1d\x5a\xd3\x53\x76\x87\x36\x3a\x64\xf7\xa3\x11\x0e\xd9"
- "\xfd\x68\xa0\xab\xec\x7e\xfc\x31\xcf\x64\xf7\x63\x8f\x5e\x5f\xd9"
- "\xfd\xd8\x3c\x57\xd9\xfd\xf8\x64\x51\xb7\x5c\x1e\xb8\xec\x7e\xdc"
- "\xbf\x6f\xd9\xfd\xf8\xed\xae\xb2\xfb\xb1\x26\x2e\xa3\x1f\x0f\xe5"
- "\xb2\xfb\x31\x9b\x28\xd3\x2d\xce\xe9\x0e\xd9\xcd\xd3\x7b\xca\xee"
- "\xc7\x23\xfa\x91\xdd\x3a\xbb\x20\xc9\xee\x3a\x90\xdd\x75\x72\xe1"
- "\xcf\xee\x64\xf7\x6f\xcb\xab\x50\x76\xc7\xa3\xec\xfe\x6d\x79\xdf"
- "\xb2\xfb\xb7\xaf\xa1\x8c\x06\x1c\x93\x22\xf4\x91\x0c\xb8\x34\x2e"
- "\x39\x89\xf3\xd7\x8d\x88\xdb\xf3\xb2\xdf\xd8\xe7\x24\x3b\xcb\xf6"
- "\x27\x7c\xbb\x64\x3b\xa4\x0b\x77\xb9\xca\x76\x94\xeb\x28\xdf\x8b"
- "\xb7\x52\x73\xc9\x56\x5a\xdf\x9e\xf1\x44\x88\x24\xe3\x73\x20\x0d"
- "\xe3\x25\xa1\x0f\xa4\xe2\xab\xec\x52\x00\x0d\x1a\x37\xc0\x77\xf1"
- "\x37\x90\x77\x9e\xab\x3e\xf8\x8d\xd1\x96\xe1\xac\x0f\x9e\xf8\x2b"
- "\xea\x03\x03\x3f\xa3\xce\xf4\x80\xad\x78\x7e\x39\xea\x06\xfe\xfe"
- "\xc9\xd9\x7d\xeb\x83\x27\xde\xff\xbe\xf4\x01\xca\x9a\x91\x4e\x63"
- "\x48\x77\xfa\x00\xe7\x54\xab\xa2\x6f\x8c\x3e\x40\x39\x83\xf2\x05"
- "\x65\x0d\xca\x1d\x94\x33\x28\x73\x6c\xe2\xf9\xbc\xa2\x74\x0f\xf4"
- "\x01\xc8\x15\x3a\xec\x61\x3d\xd3\x07\x32\x6f\xf4\xc1\x93\x9a\x1f"
- "\x94\x3e\x40\xfe\x24\x5f\x5f\x7d\x20\x8d\xf3\x91\x3f\xc8\x2b\x89"
- "\x47\xd2\x58\x1f\xf9\x83\x7c\x42\xfe\xa0\x6d\x24\xe9\x83\x29\x49"
- "\x5c\x1f\x14\xf7\xab\x0f\x9e\x0c\xea\xd2\x07\x72\xae\x0f\xd8\x9c"
- "\xf8\x68\xd4\x07\xbf\x31\xf7\xd4\x07\xbf\x69\x73\xe8\x83\x27\x62"
- "\x45\xf9\xd8\x88\xbe\x17\x40\x1e\x36\xbb\xea\x84\x59\x4b\x3d\xd3"
- "\x09\xbf\x7d\xa6\x87\x4e\x00\xda\x1a\xf8\xba\x19\xea\x83\x52\xd4"
- "\x07\x36\xd4\x0b\x5e\xe9\x84\xdf\xea\x1d\x7a\xeb\xf1\x4a\x2e\x8b"
- "\x7f\xab\x72\xd5\x13\xb3\xe6\x8a\x7a\xec\x0d\x67\x3d\x21\xf8\x78"
- "\xa2\x27\x66\x3d\x22\xe9\x09\x94\xc3\x6f\xe0\x9a\x45\x97\x9e\x40"
- "\xb9\x3a\xeb\x51\x63\x62\x83\x93\x9e\x98\x15\xc8\xeb\x30\x2b\xd6"
- "\xce\xf4\xc4\xac\x09\xa2\xbe\xd9\xed\x9c\xee\xd0\x13\x3c\xdd\xee"
- "\xac\x27\x9a\x50\x4f\xcc\x4a\xeb\x47\x4f\x4c\xf3\x5c\x4f\xcc\x89"
- "\x70\xe8\x89\x39\x11\x7d\xeb\x89\x39\x4f\xa2\x9e\x60\x3e\x78\x81"
- "\xf7\x80\x73\x45\xee\x1d\x5c\x47\xe0\x1c\x0d\xe8\x0e\x33\xfa\xfc"
- "\x80\x7c\x0f\x31\x5f\xfb\x70\xc1\xfb\x26\x03\xfe\x2f\xb0\xdf\xd4"
- "\xab\x2d\x44\x89\x3a\xc3\x70\x9e\x28\x30\x4e\x1d\xa7\xd3\xec\x9c"
- "\x22\x8c\x9d\xda\xa5\x5f\x7e\x17\xe3\xa1\x7e\xa9\x05\xfd\x52\xd3"
- "\x9e\xf1\xbb\x3c\x27\xfd\x82\xb1\xfe\x6a\xba\xe9\x17\x33\xe8\x97"
- "\x46\xe9\x37\x90\xdf\xe8\x9c\x1f\xeb\xc7\xf2\x9f\x67\x17\xe6\xaf"
- "\x83\xfc\xf5\x5c\x1f\xfd\xae\xd9\x55\x1f\xcd\x0e\x17\x5c\xc6\x27"
- "\x4f\xdd\x23\xe9\x23\xd4\xe7\x42\x0f\x7d\xf4\xfb\x53\x5d\xfa\xe8"
- "\x0e\x27\x7d\x94\x24\xe9\xa3\xa7\x66\xdf\xf4\xe3\x93\x41\xc8\xbb"
- "\xeb\xad\x8f\x04\xd0\x3b\xdd\xf5\x11\xea\x28\x69\x7c\x22\x78\xa5"
- "\x8f\x7e\x5f\xf6\x83\xd2\x47\x37\x60\x7c\xd2\x9d\x37\x12\xcf\x90"
- "\x3f\xc8\x1b\xe4\x0b\xfa\x01\x47\x9e\x21\xbf\x90\x57\x53\xf4\xae"
- "\xba\x88\xf1\x0b\xf4\x51\x8f\xb5\x03\xe0\x15\xd0\x7c\x17\xf2\xcb"
- "\x59\x1f\x95\x8c\x96\xf4\xd1\x6c\x7d\x4f\x7d\x34\x7b\xa3\x43\x1f"
- "\xfd\x8e\xed\xaf\x62\xfe\x0f\x65\xbf\x7b\xda\x55\x17\x85\xf9\x79"
- "\xa6\x8b\x66\x9f\xea\x45\x17\x31\xdf\xd3\x86\xad\x2e\x63\x93\x52"
- "\xd0\x47\x5e\xe8\xa2\xd9\x36\x5e\x47\xdc\x0b\xfe\xbb\x60\x2e\xef"
- "\x67\x6f\x77\xe8\xa7\x59\x6d\xce\x69\x0e\xfd\x34\xa7\x4d\xd4\xa9"
- "\xc7\x07\xae\x9f\xe6\xb0\xdf\xe0\x3e\xf1\x37\x5a\xb8\x0e\x70\xd5"
- "\x4f\x73\x4e\xb9\xea\xa7\x39\xa2\x5f\xa5\x30\x25\xd7\x4f\x73\x0e"
- "\x88\x7a\xab\xd6\x39\xdd\xa1\x9f\x78\x7a\x4f\xfd\x14\xa6\xed\x47"
- "\x3f\xa9\x3a\x8b\xe6\x97\x77\x18\x8a\x4a\x6d\xbb\xe2\xc2\x27\xcf"
- "\x1b\x6f\xef\xde\x9f\x78\x3f\xb2\x13\xec\x57\x5d\xeb\x6d\xff\x46"
- "\x48\xa7\x6a\xb3\x51\x10\xcf\x53\x77\x04\xcf\x2f\x3b\xbf\x0c\xfa"
- "\x54\xb3\xfb\x3e\x05\xfd\x49\x29\xf5\xa7\xaa\xd8\x73\x04\xfa\x98"
- "\x1c\xd7\xdb\x5e\x85\xbe\x64\x6a\xab\x63\x7d\x4b\xd5\xa8\x25\xe8"
- "\xdb\xd2\xbf\x99\x04\xfa\xcb\x64\xc3\x7e\xff\x27\xe8\xb3\xd0\xaf"
- "\x9e\x9c\x44\x85\x07\xea\xb5\xc4\x3f\x96\x04\x60\xdf\x7a\x53\x5c"
- "\xcf\x41\x5f\x18\xb8\x8e\x03\xb8\x0e\x59\x78\x8c\xf7\xa9\x57\xe1"
- "\xea\xe0\x7d\x6a\x5c\x47\xbb\xee\x5e\x77\xeb\x38\xa6\x24\x33\x5b"
- "\xc7\xc1\xb3\x4a\x78\x46\x4c\xc0\x3e\x84\xeb\x38\x56\x6e\xdb\x41"
- "\x7d\x03\x77\xb2\x75\x9c\x06\x97\x75\x9c\x1f\xd7\x13\x39\xfa\xc9"
- "\x28\x74\x5e\xc7\xd1\x55\xf5\xb0\xeb\xb0\x7f\x61\x7f\x1a\xb8\xcc"
- "\x0b\x77\xeb\xff\x9a\xed\x9d\x00\x5a\xdb\x55\x45\xa5\xf4\xd5\xe2"
- "\xbc\xff\x69\xb0\xca\xd0\xa7\xa8\x1d\x78\x27\x80\x6c\xa3\xca\x6e"
- "\xb2\xad\x53\xe4\x43\x27\xe7\x03\xf0\x50\xb9\xa0\x8d\xd0\x85\x36"
- "\xe8\x3f\x9d\xa2\x5f\x51\xab\x19\x70\xa8\x1b\x5d\xbc\x16\xe9\xae"
- "\x21\xc5\xa2\x6f\x51\xe1\xe5\x58\x3f\x01\x68\x4d\xd3\xe5\xe4\x8d"
- "\xab\x56\xb6\xee\x69\xe8\x20\x93\x41\x96\xa1\x3f\xa5\x00\xc0\xee"
- "\x88\x9d\x1d\x40\xf7\x33\x9c\xee\xe8\xef\x0d\xef\xb6\x97\x75\x5a"
- "\x28\xfb\xde\xce\x4e\x90\x65\x56\x4e\xfb\x05\x2f\x05\x12\xe6\x8f"
- "\x14\xd7\x3e\xc1\x6e\xa8\x06\x7e\x33\x59\xd6\xa6\xa6\x18\x23\x44"
- "\xf8\x5a\x87\xbe\xaf\x82\x1f\x6c\x03\xda\x77\xea\x10\x1b\x81\x25"
- "\xe7\x71\xed\xf3\xa4\xcb\xda\xa7\xe5\x65\xc7\xda\x67\x75\xd9\x71"
- "\xbe\x57\xc5\x65\x3e\x2c\x6c\x5a\x67\x31\xd7\x39\x6c\x3e\x2c\x61"
- "\xa0\xb4\x7f\x56\xf3\xfd\xd1\x3e\xf0\x07\x4e\xfb\xf0\xc6\xc1\xd1"
- "\xfe\x0f\xf9\xdf\x1f\xed\x95\x3f\x70\xda\x3f\x1b\x39\x38\xda\x3f"
- "\xe7\xd6\xff\x11\xd2\x1e\xc7\x30\xd2\xf8\x45\x1a\xbb\xa0\x0e\xe3"
- "\xfa\xfa\x8f\xbb\x1c\xe3\x96\x3f\xee\x92\xd6\x90\x81\x66\x8a\x1c"
- "\xf4\xe7\x0d\xb4\xd0\x2f\x21\xe3\x2f\xc8\xfe\x78\x97\xb4\x7e\x9c"
- "\x87\x71\x65\x90\x8f\xaf\x02\x1f\xe3\xf0\xac\x91\xc8\x43\xd0\x39"
- "\x0b\xdb\x40\x2f\x8c\x9d\x5f\x6e\xcf\x01\x9d\xf4\x5a\x5c\xb8\x1b"
- "\x7e\xca\x51\x9f\xf8\x27\x90\xc0\x05\x7a\x07\x5f\x85\x97\x81\x9f"
- "\x1d\x60\x9b\x59\x9b\x08\x9e\x1f\x56\x37\x81\xdd\xda\x19\xeb\x37"
- "\x0f\xc6\x00\x12\x4f\xdf\x4c\xb4\x32\xbb\xac\x57\x9e\xee\x70\xe5"
- "\x69\x6b\x2f\x3c\x9d\xbf\x14\xfa\xa9\x5c\xb4\x9d\x19\x4f\xcd\x5d"
- "\x3c\x65\x7a\xe4\x65\x5d\x30\xf2\x55\xe2\x29\xea\x11\xc6\xd3\x66"
- "\xae\x47\xba\x7c\x2d\xbd\xec\xb0\x9d\x2b\x23\x4f\xf5\xc2\xd3\x3f"
- "\xd4\xbb\xf0\x34\x72\xa0\x3c\xfd\xb7\x46\x57\xfb\x2b\xe2\x19\xcf"
- "\xec\xaf\x3f\x2e\x42\xfb\xca\xd9\xfe\xc2\xe7\x56\xb0\xb7\xec\xfe"
- "\x85\xbb\xda\xbc\x1a\xff\xff\x51\xef\x6a\x4b\x45\xcc\xe0\x75\x7a"
- "\x2e\x67\xe0\xb6\x54\xc4\x58\xcc\xf3\xc6\xab\xbd\xd9\x51\x11\x13"
- "\x5d\xed\xa8\x3f\x5a\xb9\xbd\x14\x11\xde\x9a\x8e\x76\x54\x84\x8a"
- "\xa7\x3f\x67\x70\x4e\x77\xd8\x51\x3c\xbd\x15\xfd\xcf\x65\x44\xcc"
- "\x1b\x98\xed\x74\xe7\xf7\x6c\x3b\x69\xfa\xb0\x9d\x34\xff\x22\xb6"
- "\xd3\x9f\xea\x6e\xe9\x6f\x6f\x75\x48\x84\x7e\x70\x3a\xe4\x79\xb7"
- "\xe7\x1f\x6e\xe9\xef\xfe\x68\xff\xef\xda\xc1\xd1\x7e\x5e\x8d\xf7"
- "\xfa\x7b\x61\xb4\x43\x7f\x2f\x8c\x76\xaf\xbf\x17\x9c\xb8\xa5\xbf"
- "\x07\xa2\xbf\x9f\x2f\x1a\x9c\xfe\x5e\xb0\xcb\x55\x7f\x47\x8e\xf2"
- "\x4c\x7f\x2f\xbc\x67\xe8\xf5\xf7\xc2\x10\x57\xfd\xbd\xd0\xc6\xeb"
- "\x34\x7f\xf6\xc0\xf5\xf7\xc2\x53\xee\xf5\xf7\xc2\x73\xae\xfa\x7b"
- "\x61\x39\xd7\xd3\x91\x81\x5c\x7f\x2f\xac\xe4\xe9\xf3\x9f\x76\x4e"
- "\x77\xe8\x6f\x9e\xce\xf5\x77\x64\xf0\xc0\xf4\xb7\xfa\x7b\xd6\xdf"
- "\x81\x7d\xe8\xef\xc0\x7f\x11\xfd\xbd\xc8\x6d\xfc\xf3\x5b\x3a\xa4"
- "\x3f\x1d\x12\x19\x32\x38\x1d\xb2\xd8\xad\xff\xc7\xfe\x75\x48\x4c"
- "\x99\x43\x87\xc4\x94\xb9\xd7\x21\x31\x63\x6f\xe9\x90\x81\xe8\x90"
- "\x45\xe6\xc1\xe9\x90\xe8\x26\x57\x1d\xb2\xe4\x39\xcf\x74\x48\x4c"
- "\xcc\xd0\xeb\x90\x98\x04\x57\x1d\xb2\x24\x94\xd7\x69\xf1\x5f\x07"
- "\xae\x43\x96\xdc\xe3\x5e\x87\x2c\x99\xe4\xaa\x43\x62\x78\x5c\x20"
- "\xd9\x92\xb9\x5c\x87\x2c\x09\xe4\xe9\x8b\xf3\x9c\xd3\x1d\x3a\x84"
- "\xa7\x73\x1d\xb2\x24\x72\x60\x3a\x64\xf8\xf7\xac\x43\x94\x7d\xe8"
- "\x10\xe5\xbf\x88\x0e\xf9\x73\xbd\xf7\x72\xec\x05\xbd\x43\x8e\xbd"
- "\xa0\x77\x2f\xc7\x96\x9e\xbb\x25\xc7\x06\x22\xc7\x96\x24\x0c\x4e"
- "\x8e\x2d\xdd\xe3\x2a\xc7\x5e\x1c\xeb\x99\x1c\x7b\x61\xca\xd0\xcb"
- "\xb1\x17\x66\xb8\xca\xb1\x17\x45\xbf\x51\xb1\x7f\x1a\xb8\x1c\x7b"
- "\xe1\x1b\xf7\x72\xec\x85\xcb\xae\x72\xec\x85\x03\x5c\x5e\xbd\x18"
- "\xcc\xe5\xd8\x0b\x75\x3c\x3d\x36\xc2\x39\xdd\x21\xc7\x78\x3a\x97"
- "\x63\x2f\xea\xfa\x93\x63\xd8\x2f\xaa\x34\xdd\xfa\xc5\x8b\x52\xbf"
- "\x58\xbe\xfd\x68\x91\xd4\x2f\x96\xb3\x76\x09\x45\x0b\xa6\xff\x25"
- "\x91\x28\x0c\x18\x3b\x06\x64\x84\xfe\xdf\xb1\x5f\x2c\xf7\xc7\x7d"
- "\x22\xaa\x7a\x90\x7b\x8d\xa2\x1c\x4c\x02\x39\xd8\x08\xcf\xe8\x57"
- "\x6d\xec\x82\xe9\x28\xbf\x30\xa6\x06\x3e\x73\x79\x68\xf1\xc5\xd8"
- "\x35\x6c\x6d\xde\xa9\xdf\xb0\xbe\xd2\x2a\xf6\x95\x56\xde\x57\xa4"
- "\xb3\x7b\xc9\x8d\x54\xb0\xaf\xd4\x8d\x0e\x8b\xf6\xa1\xd8\x7f\xd8"
- "\x99\x30\xe8\x3f\x74\xa5\x2e\xa0\x28\x1e\xfa\x8c\xa5\x89\xa0\xef"
- "\x7c\xec\x33\xfe\xeb\x65\x01\xb4\x35\xd6\x0f\x64\x22\x97\x7d\x42"
- "\x85\xaf\x0d\xfd\x60\xad\x04\xd9\xd7\x02\xb2\xaf\xc5\xd1\x57\x70"
- "\xbd\xbd\x75\xa5\x4e\xdb\xb6\x52\x37\xae\xb3\x15\x64\x9f\xa5\x7b"
- "\x3f\xb9\x27\x78\x67\x0b\xca\xbe\x26\xd6\x4f\x98\xec\x83\xbe\x21"
- "\xb4\x82\xec\xfb\xb3\x28\xfb\x5a\x75\x28\xeb\x03\x77\x2e\x01\xd9"
- "\x17\x79\x81\xcb\x3e\xd1\x86\xbb\x0f\x65\xdf\x4a\x9d\x7c\x4b\x8b"
- "\x28\xfb\x16\xa1\xec\x3b\x08\x7d\xe4\x3d\x57\xd9\xe7\xef\xad\xec"
- "\x5b\x56\xe7\xda\x4f\xe2\x9e\xf4\xac\x9f\x2c\x7f\xce\x5d\x3f\xe9"
- "\xcc\xf1\xb6\x9f\x2c\x8f\x76\xed\x27\x71\x21\x62\xdf\x7d\x69\xe0"
- "\xfd\x24\x6e\x54\x57\x3f\x79\xb1\x7b\x3f\x89\xbb\xcb\xb5\x9f\x2c"
- "\x6f\xe6\xfd\x21\x6e\x26\xef\x27\x71\x3c\x96\xaa\xec\x45\xbd\x73"
- "\xba\xa3\x9f\xf0\x74\xde\x4f\xe2\xc2\x6f\xad\x97\xff\xd0\xf4\xfd"
- "\x0a\xb7\xfe\x9f\x6e\xad\x97\xf7\x37\x66\x8c\x8b\x1e\xdc\x98\xf1"
- "\x25\xb7\xfe\xef\x6e\xcd\xb7\xf7\x47\x7b\x7d\xd0\xe0\x68\x1f\xef"
- "\x36\xfe\xcf\xad\xb9\x92\xfe\x68\xff\x52\xde\xe0\x68\x9f\x10\xda"
- "\xdf\x18\xc3\xbd\x2d\x95\xd8\x5c\xd9\x35\xc6\x48\x6c\x96\xf6\xf9"
- "\xf6\x1c\x63\x24\x2e\x72\x3d\xc7\x97\x70\xb9\xfb\x39\xbe\xfe\xc6"
- "\x1e\xb6\x5b\x63\x0f\xe0\xf5\x4a\xd5\xe0\xc6\x1e\x89\x93\x5d\x6d"
- "\xaa\xd5\x3b\x3c\xb3\xa9\x12\x5f\x77\x67\x53\xd9\xbc\x1e\x7b\x24"
- "\x96\xbb\xda\x54\xab\x37\x8a\xd8\x78\x7f\xe0\x36\xd5\xea\x18\xf7"
- "\x36\xd5\xea\xe5\xae\x36\xd5\xea\x50\x6e\x3b\xad\xde\xce\x6d\xaa"
- "\xd5\x73\x79\x7a\xc2\x3e\xe7\x74\x87\x4d\xc5\xd3\xb9\x4d\xb5\x7a"
- "\xd7\xad\x75\xf4\x1f\x9a\x4d\xb5\x46\x7b\x4b\xaf\x7b\xab\x5b\x56"
- "\x97\x0f\x4e\xb7\xac\xfd\x1e\xf7\x7f\xfe\xd0\xf5\xfa\x9a\xd8\xc1"
- "\xd1\x3e\xb9\xcf\xfd\x9f\x7d\xeb\xf5\x94\x03\x0e\xbd\x9e\x72\xc0"
- "\xbd\x5e\x4f\xf9\xb9\xab\x5e\x4f\x3e\x72\x4b\xaf\x7b\xa3\xd7\xd7"
- "\x36\x0e\x4e\xaf\xa7\x28\x5c\xf5\x7a\xea\x4b\x9e\xe9\xf5\x94\xf5"
- "\x43\xaf\xd7\x53\xf2\x5c\xf5\x7a\xea\x3c\x11\x1b\x05\x03\xd7\xeb"
- "\xa9\x8f\xba\xd7\xeb\xa9\x4f\xba\xea\xf5\x54\x0d\xd7\xdf\xa9\x7a"
- "\xae\xd7\x53\x27\xf3\xf4\xe4\x7c\xe7\x74\x87\x5e\xe7\xe9\x5c\xaf"
- "\xa7\x26\xdf\x5a\x5f\xff\xa1\xe9\xf5\x34\xb7\xfe\x8f\x6f\xe9\x96"
- "\xfe\x74\x4b\xea\x20\xc7\x8c\xe9\x6e\xe3\xff\xf6\xaf\x5b\x5e\xd1"
- "\x3a\x74\xcb\x2b\x5a\xf7\xba\x65\x63\x81\xab\x6e\xd9\x30\xf1\x96"
- "\x6e\xf1\x46\xb7\xac\x0f\x1d\x9c\x6e\xd9\x18\xe9\xaa\x5b\x5e\xa9"
- "\xf2\x4c\xb7\x6c\x3c\x35\xf4\xba\x65\x63\xb3\xab\x6e\x79\xa5\x9c"
- "\xd7\x29\xfd\xf2\xc0\x75\xcb\x2b\x3b\xdc\xeb\x96\x57\xfe\xe6\xaa"
- "\x5b\x5e\x49\xe0\x3a\xe4\x95\x4a\xae\x5b\x5e\xc9\xe4\xe9\xe9\x16"
- "\xe7\x74\x87\x6e\xe1\xe9\x5c\xb7\xbc\x52\x77\x6b\xdd\xfd\x87\xa6"
- "\x5b\xfe\xa3\xcf\xfd\xbf\x7d\xcb\xb7\x6c\xe2\x90\x6f\xd9\xc4\xbd"
- "\x7c\xcb\x5a\xe5\x2a\xdf\x32\x7d\x6f\xc9\x37\x6f\xe4\xdb\x2b\xcd"
- "\x83\x93\x6f\x59\xa1\xae\xf2\x2d\xfb\x0d\xcf\xe4\x5b\xd6\xfb\x43"
- "\x2f\xdf\xb2\x2a\x5d\xe5\x5b\xf6\x76\x5e\xa7\xff\x38\x36\x70\xf9"
- "\x96\xbd\xc6\xbd\x7c\xcb\x5e\xef\x2a\xdf\xb2\xe7\x72\x39\x96\xbd"
- "\x9b\xcb\xb7\xec\x58\x9e\xfe\x1f\x35\xce\xe9\x0e\xf9\xc6\xd3\xb9"
- "\x7c\xcb\x2e\x1f\xdc\x7a\x7c\x4e\xa8\x63\x3d\x3e\x87\xf1\x42\xd8"
- "\x5e\x1c\xdb\x73\x3d\xde\xf0\x8e\xab\xbf\xa0\xbf\xfc\x9c\xad\xcd"
- "\x63\x9f\x69\xe3\x3e\x1d\x7a\x5d\xa7\xbf\xab\x38\xf6\xd6\x3a\xfd"
- "\xf5\x5c\xa7\x37\xa4\xb9\xf6\x9f\x9c\x8b\x9e\xf5\x1f\x83\x7d\xe8"
- "\xd7\xe9\x73\xba\xf9\x61\xc9\xa9\x13\xb1\x22\x1b\x78\xff\xc9\x79"
- "\xd7\x7d\xff\xc9\xf9\xc8\xb5\xff\xe4\x88\x63\xcc\x9c\x66\xde\x7f"
- "\x72\xca\x78\xfa\x5f\x88\x73\xba\xa3\xff\xf0\x74\xde\x7f\x72\xac"
- "\x9e\xd8\x07\x36\x55\xd1\x2e\xd4\xf7\x93\xeb\xc7\xdb\xbb\x70\x9e"
- "\x20\xe2\xbc\x37\xfb\x20\x8a\xeb\x0b\x66\x1b\xec\x8a\x9b\xdb\xaf"
- "\x7d\xd0\x28\xda\x07\xd1\x3d\xed\x03\xc9\x36\x28\x02\x7c\xbf\xea"
- "\xd1\x1a\xbd\x88\x77\xb4\x0d\xae\x0e\xd4\x36\x98\xe0\xb0\x0d\xb2"
- "\xba\xd9\x06\x7f\xee\x66\x1b\x30\xbc\x37\xb8\xe0\xbd\x87\x6d\xd0"
- "\x85\xf7\xa1\xb2\x0d\x36\xe9\x6f\xad\xd1\x7b\x3b\xee\xcc\x55\x0d"
- "\x6e\xdc\x99\xd7\x7c\x6b\x2e\xdf\x5b\xda\x6f\x1a\xe4\x5c\xfe\xe6"
- "\xd8\x5b\xf3\x2d\xde\xd2\xfe\xaf\x83\xf4\xe5\xb0\xa5\xd1\xfb\xf1"
- "\xc8\xd6\x3d\x8e\xf1\xc8\xd6\x3d\x92\x7d\x85\x72\x97\xf9\xcc\x02"
- "\x59\x9b\x13\x0f\xd7\x55\x42\xfe\x12\xcf\x62\x1e\x28\x4d\x8d\xc7"
- "\x89\x3e\x05\x6d\xae\xad\x13\xc3\x92\x9c\x6d\xae\xfc\xd7\x25\x7b"
- "\x2b\x0c\x6d\x31\xb0\xad\xd0\xae\x92\xc6\x20\x79\x2d\xfd\xec\x1f"
- "\x9e\x18\x37\x17\xc7\x2c\x9d\xfe\x45\xbb\xfe\x75\xc7\x2b\x9b\xf7"
- "\x0c\x6e\xbc\x52\x60\x71\xb5\xb7\xb6\xcd\xf7\xcc\xde\xda\xba\x7c"
- "\xe8\xc7\x2b\x5b\x93\x5d\xed\xad\x6d\xb3\x44\x9c\x2c\x1a\xb8\xbd"
- "\xb5\x6d\x92\x7b\x7b\x6b\xdb\x43\xae\xf6\xd6\x36\x05\xb7\xab\xb6"
- "\xcd\xe3\xf6\xd6\x36\x0d\x4f\xcf\x8f\x74\x4e\x77\xd8\x5b\x3c\x9d"
- "\xdb\x5b\xdb\x62\x3d\xb4\xb7\xca\x06\x61\x6f\x45\xfc\x70\xec\xad"
- "\x89\x37\xb9\xbd\xb5\xdd\xec\x81\xde\xd9\xd5\x4d\xef\xcc\xbd\xa5"
- "\x77\x50\xd6\x6c\x4b\x1e\x9c\xde\x79\x75\x5e\xbf\xb4\x37\x38\xd1"
- "\x1e\x65\xbe\x48\x77\xfb\x84\xb8\xb9\x5e\xd3\x1e\x64\x7d\x71\xca"
- "\x0f\x99\xee\x3b\x74\x83\xa3\x7b\x61\xed\x2d\x5b\xcb\x5b\xda\xbf"
- "\xba\x6b\x70\xb4\x2f\xee\x33\xfe\x63\xdf\xb6\x56\xe9\x8c\xa3\x5d"
- "\xb6\x56\xe9\x8c\xee\xb6\x16\xda\x56\xb3\xad\xdc\xe6\xfa\x0b\xd8"
- "\x4a\xd9\x71\x60\x77\x25\x12\x62\x6a\x7c\x9f\x18\xc0\xf6\xca\xbe"
- "\x04\xf6\xd7\x32\xb0\xbf\x6c\xaf\x89\xf6\xd7\xce\xb7\x5d\xed\xaf"
- "\x92\x49\xbd\xda\x5f\xfe\x0e\xfb\xcb\x06\xb6\x55\xe7\x6b\x71\x73"
- "\xf3\x2e\x39\xd9\x62\x2f\xf4\xb4\xc5\x3a\x72\x8a\xca\x3a\x26\xc6"
- "\x45\x74\x82\x3d\xd6\x97\x2d\xc6\x30\xd1\x8b\x3d\xf6\xff\x0f\x5b"
- "\xac\x28\x78\x70\xb6\xd8\xce\x64\x57\x5b\xac\xf4\x1b\xcf\x6c\xb1"
- "\x9d\xd7\xdc\xce\x7d\x79\x6d\x8b\x95\x2a\x5d\x6d\xb1\xd2\x5a\x5e"
- "\xa7\xe2\xaa\x81\xdb\x62\xa5\xef\xb8\xb7\xc5\x4a\xdf\x77\xb5\xc5"
- "\x4a\xc5\xb3\xa7\xa5\x4d\xdc\x16\x2b\xdd\xc5\xd3\x8b\x2b\x9d\xd3"
- "\x1d\xb6\x18\x4f\xe7\xb6\x58\x69\x9b\x87\x6b\x63\xbb\x6c\xa0\xd3"
- "\xbf\xff\xfd\x94\x7d\xad\x8d\x0d\xd5\x7e\xca\x09\x37\xf9\xda\xd8"
- "\x7f\xf6\x3f\xff\x75\xcb\x26\xe8\x45\xd6\xfc\x4d\x39\x38\xbd\xf4"
- "\x5f\x4d\xb7\x6c\x02\x6f\x69\xff\x9f\x83\x9c\xfb\x7a\x2d\xda\x7b"
- "\x9b\xa0\x2c\xc4\x31\xff\x52\x16\x32\xb0\xf9\x97\xff\x7e\xcd\x55"
- "\xff\xff\xbd\x77\xfd\x7f\x6b\xfe\x65\x00\x3a\x7f\x57\xc8\xe0\x74"
- "\xfe\x7f\xeb\x5d\x75\x7e\xd9\x29\xcf\x74\xfe\x7f\x5f\x1c\xfa\xf9"
- "\x97\xff\xb6\xb9\xea\xfc\xb2\x0a\x5e\xa7\xd7\xce\x0c\x5c\xe7\x97"
- "\xbd\xee\x5e\xe7\x97\xbd\xed\xaa\xf3\xcb\x36\x72\xdd\x5e\x56\xcf"
- "\x75\x7e\xd9\x76\x9e\xfe\x9a\xd9\x39\xdd\xa1\xf3\x79\x3a\xd7\xf9"
- "\x65\x4d\x03\x5b\xef\x52\xdf\xa4\xeb\x5d\x81\xff\x22\xeb\x5d\xff"
- "\x88\xbc\xa5\x77\xbc\xd5\x3b\x65\xb6\xc1\xe9\x9d\xff\xe9\xd7\xff"
- "\x87\x7b\xbd\xf3\x66\x99\x43\xef\xbc\x59\x36\x30\xbd\xf3\xe6\x58"
- "\x57\xbd\xb3\xfb\x6f\xb7\xf4\xce\x60\xf5\xce\x3f\xca\x06\xa7\x77"
- "\xde\xe8\xe6\xff\xe8\x2d\x0f\xfd\x1f\xbd\xe9\xd6\xff\x91\xf7\x7a"
- "\xe7\xcd\x6e\xfe\x8f\xde\x12\xfd\x1f\xed\xf6\xc2\x6f\xc8\x5b\xf7"
- "\xb8\xd7\x3b\x6f\x75\xf3\x7f\xf4\xa6\xe8\xff\xe8\x2d\xd1\xff\xd1"
- "\x5b\xa2\xff\xa3\xdd\x11\xce\xe9\x0e\xbd\xb3\xdb\xc9\x6f\xc8\x5b"
- "\xb7\xfc\x1f\xfd\xe0\xf6\x61\xee\x19\x84\xfc\xfb\x67\xa6\x43\xfe"
- "\xfd\x33\xd3\xfd\x3e\xcc\xff\xb5\xbb\xee\xc3\x7c\x3b\xe7\xd6\x3e"
- "\x4c\x6f\xe4\xdb\x5b\x83\xf4\x8b\xf4\xbf\x15\xae\xf2\x6d\xef\x23"
- "\x9e\xc9\xb7\x7f\x3e\x39\xf4\xf2\xed\x9f\x73\x5d\xe5\xdb\x5e\xad"
- "\x88\x0d\x2f\xe4\xdb\x5e\x99\x7b\xf9\xb6\xd7\xcf\x55\xbe\xfd\xb3"
- "\x9e\xcb\xb1\xbd\xd3\xb8\x7c\xfb\xa7\x85\xa7\xbf\x1d\xe1\x9c\xee"
- "\x90\x6f\x6f\x3b\xc9\xb7\xbd\xa1\x03\x5b\xd7\xf4\xca\xae\xbe\x01"
- "\xeb\x9a\x43\x65\x57\xdf\xec\xeb\x9a\xef\x94\xdf\x9a\x47\xf3\xc6"
- "\xa6\xde\x3b\x77\x70\x36\xf5\xff\x0b\xf1\x5e\xa7\xbc\x17\xe4\xd0"
- "\x29\xef\x05\xb9\x5b\xdf\xc9\x06\xdc\x19\xc0\x26\xce\xba\x44\x14"
- "\x7f\xc1\xf5\x9d\xda\x2a\x92\x83\xeb\x3b\x71\xd2\xfa\x4e\xb1\x68"
- "\x67\xbf\x9b\xe5\x6a\x67\x97\xfb\xf5\x66\x67\xa3\x7d\x6d\x07\xdb"
- "\xd9\xd6\x7d\x5d\xe7\xdf\x7b\xd7\x45\x1d\xfe\x45\x65\xd7\x5e\x8b"
- "\x8b\x18\xa8\x2e\x2a\x5c\xcb\x75\xd1\xab\x3f\x78\x5d\xf4\x7f\x64"
- "\x70\xba\xe8\xdd\xb9\xae\xba\xe8\xbd\x8f\x3c\xd3\x45\xef\x1e\x1b"
- "\x7a\x5d\xf4\xae\xd9\x55\x17\xbd\xb7\x9b\xd7\xe9\xff\x79\x11\x5b"
- "\xf2\xbd\x1c\xf7\xba\xe8\xbd\x02\x57\x5d\xf4\x5e\x2c\xd7\x39\xef"
- "\x19\xb9\x2e\x7a\x2f\x99\xa7\xff\xbf\xdd\xce\xe9\x0e\x5d\xc4\xd3"
- "\xb9\x2e\x7a\xaf\x72\x60\x73\x3c\xc3\x6f\xd2\x39\x1e\xe5\xbf\xc8"
- "\x1c\xcf\xbe\x99\xde\xcb\xc4\x0f\x95\x95\x5d\xe7\x37\x3e\x54\xf6"
- "\x98\x67\x48\x04\x7b\xbb\x85\xaf\x73\x77\xcd\x33\x98\x4f\x89\xf2"
- "\xef\x83\x75\xae\xf2\xef\x7d\xb7\xf2\xaf\xaf\xb5\x6c\x9c\x57\xb0"
- "\x83\x6c\xc4\x18\x99\x5e\xaf\x65\x27\xfe\xd0\x65\xde\x7b\x83\xf4"
- "\xaf\xfc\xc1\x2c\x57\x99\xf7\xe1\x3b\x9e\xc9\xbc\x0f\x0e\xba\x95"
- "\x79\x5e\x9f\xe3\xf8\xa0\xd6\x55\xe6\x7d\x58\xca\xeb\xb4\xef\xa3"
- "\x81\xcb\xbc\x0f\xd7\xbb\x97\x79\x1f\x66\xb9\xca\xbc\x0f\xe7\x71"
- "\xd9\xf6\xe1\x5e\x2e\xf3\x3e\xd4\xf3\xf4\x7d\x46\xe7\x74\x87\xcc"
- "\xe3\xe9\x5c\xe6\x7d\x68\xec\x4b\xe6\x51\x43\x54\x59\x9e\x5c\xd8"
- "\x03\x17\x62\xf4\x2e\xc0\x86\x11\xfe\xaf\x00\x1e\x8f\x82\xff\xdd"
- "\xc6\xbc\xb0\xf8\x47\x95\x09\xe9\x50\x67\x39\x91\x99\x2c\xdf\x19"
- "\x8d\x63\x6c\xf0\x5d\xa3\x78\x66\x2d\xaa\x4c\x6d\x1b\x3e\x4b\xa0"
- "\xb1\x04\xf8\x52\xc6\xe2\x67\x42\x7e\x3c\x1f\xa4\x4d\x24\x01\x97"
- "\x64\xc6\x48\x29\x1f\xd4\x37\xa0\x41\x66\x1c\x8b\x65\xb4\x67\x18"
- "\x97\x41\x5b\x2a\xdd\xd6\x15\xca\x0a\x7b\x7d\x1c\x59\x67\xa3\x5f"
- "\x1b\xe3\x5a\x48\xa3\xcc\xf8\x8e\xba\x79\xf8\x2c\x9a\x1a\x41\xd0"
- "\x96\xdb\x33\xc6\xa2\xc0\x32\x8d\x71\x1d\xf8\x6e\x3b\xbe\xb3\x43"
- "\x1d\x53\x96\x13\x79\x6e\xcb\x70\x25\xc8\x09\xdf\xd4\x36\xda\xb4"
- "\xc2\x06\x75\x06\x6c\x7e\x38\xae\x4e\xf1\xd6\xab\x75\x78\xbe\x51"
- "\x83\xf1\x4c\xb1\x0c\xb0\x67\xb1\x3e\xef\x96\x40\xfe\xde\xea\xf0"
- "\xca\x9b\x64\xb2\xef\x24\x6a\x1e\x18\x6e\x3e\x52\xb9\xa3\xa3\x7a"
- "\xfd\x38\x62\x7c\x00\x68\xa7\x25\xf2\xde\xde\x0f\xf0\x3b\x7d\x9d"
- "\x7f\x57\x62\x8c\xe4\xd4\x1d\x44\xbe\x49\x18\xae\xdc\x9f\xcc\x62"
- "\x14\x5b\xda\x33\x3e\x32\x9b\x65\xf7\xab\x90\xe6\x18\xd7\x12\xe3"
- "\x6b\x03\x6e\x08\xa4\x5b\x3f\x4a\x22\xa4\x3b\x2f\xe2\xa3\x97\x2f"
- "\xd2\x26\x2c\x5d\x1e\xb3\x62\x55\x82\x76\x62\xf4\x08\x32\x77\xc5"
- "\x0a\xed\xf2\x45\x71\x6b\xb4\xce\x6f\x7e\xa1\x8d\x5e\xba\x72\x51"
- "\xd4\xb2\x98\x29\xcb\x17\xeb\x47\xe0\xa1\x22\xa7\x7a\x04\x61\x5d"
- "\x84\x8c\x8f\x15\x25\x9b\x09\xd9\x32\x9a\x28\xb0\x5e\xed\x19\x1f"
- "\xc7\x4a\x71\x4f\x73\xb7\xd2\x36\x39\xe4\x49\x05\xf9\xb8\x29\x65"
- "\x38\xe4\xfd\x28\x61\x27\xd4\xab\x04\xea\x0d\x75\x84\x3a\x7f\x9c"
- "\x2f\xd5\x59\xc2\x44\x2a\x62\x22\xa5\x05\x30\xf8\xf1\x3b\x6a\xeb"
- "\xf0\xdf\x52\x1a\x81\xed\x6b\x83\x7e\x22\x3b\x2f\xdb\xef\xcb\x74"
- "\x59\x4e\x54\x19\xfc\xb6\x46\xc2\x18\xfe\x96\xe6\x46\xe9\xdb\xb1"
- "\x9f\xd0\xd8\x5f\xf1\x3e\xb5\xbf\xec\x39\x9d\x8c\xf0\xb8\xab\x1f"
- "\xdb\x1c\x71\x57\xf7\xb3\xb9\x6a\xa8\x47\x73\x7b\xc6\xfe\x20\x33"
- "\x69\xaf\xc5\x74\x8c\x17\x8c\xf1\xbb\xb1\xce\xd0\x2e\xd0\xa5\xd4"
- "\x48\xd3\x45\xec\x67\xbe\x53\x27\x64\x7e\x16\x62\x52\x5c\x25\x61"
- "\x36\xda\x49\xb3\xde\xa9\xab\x6e\x6b\x23\xea\xf5\xfa\xc5\x74\xd8"
- "\xc7\xb7\xab\x6d\x4b\x63\x76\x8e\x86\x3e\x94\xf5\x59\x08\xcd\xaa"
- "\x0a\x7a\x6e\x12\x09\x84\xb2\x9d\xe3\xbf\x2a\x06\xc6\xff\xfd\x8c"
- "\xff\xc8\x47\xa8\x8f\xc8\xc7\xfd\x46\x44\x85\xbb\x3e\xa5\x7e\x5d"
- "\x20\x07\x01\x0b\x54\xb5\xd9\x12\x66\xe7\x74\xc4\xbe\xdb\x9a\x1a"
- "\x4b\x1e\x64\xb4\x3b\x90\x24\xe4\x6e\xae\x11\x0c\x5b\x40\x56\x6c"
- "\x6e\x03\x9a\x65\xe6\x26\x12\xed\x42\x7b\x20\xc9\xb9\x4a\x42\x2c"
- "\x39\x9b\x2d\xfe\xb2\x34\x19\xd8\x23\x72\xd0\x27\x21\x20\x33\x42"
- "\xc4\xfe\x9e\x89\x74\x3c\xdc\x4c\xc8\x9c\x95\x84\x7c\x3d\x83\xf8"
- "\x94\xc0\xef\x06\xd6\x9e\x03\x4c\xff\xd3\x8c\xfd\xb6\x9d\xf0\x5b"
- "\x8c\xeb\x3b\xc0\xdf\x6f\x74\xdb\xef\xba\xda\xbd\x45\xdf\x7b\xbb"
- "\x0f\xea\x85\xdc\x2d\xe1\xd0\xee\x4c\x6a\xd8\x92\xd0\xb3\xdd\x5b"
- "\xf4\xbc\xdd\xbe\x2d\x43\xdf\xee\x83\xdc\xff\x75\xc6\x81\x36\xef"
- "\xda\x7d\x30\xd9\x83\x76\xbb\xe1\xf7\xa1\x58\x68\x37\xf0\x3b\x1f"
- "\xf8\xbd\xa5\x17\x7e\x6f\x11\xf9\x3d\xb2\x61\xe8\xdb\x7d\x68\x1a"
- "\x6f\xf7\xc1\x66\xef\xda\x7d\xc8\xad\xfc\x73\xb4\x3b\xdf\x0d\xbf"
- "\x0f\x47\x0a\xb9\xf9\xc0\xef\x7c\xe0\x77\x7e\x2f\xfc\xce\x17\xf9"
- "\x3d\xea\xd3\xa1\x6f\xf7\x61\xee\xff\x30\xe3\x50\xa3\x77\xed\x3e"
- "\xbc\xcc\x83\x76\xbb\xe1\x77\x45\x04\xb4\x1b\xf8\x5d\x00\xfc\xce"
- "\xef\x85\xdf\xf9\x22\xbf\x7f\x9a\x3d\xf4\xed\xae\x98\xc0\xdb\x7d"
- "\xb8\xde\xbb\x76\x57\xb8\xdd\xff\xe2\x68\x77\x81\x1b\x7e\x1f\x09"
- "\x17\x72\x0b\x80\xdf\x05\xc0\xef\x82\x5e\xf8\x5d\x20\xf2\xfb\xf9"
- "\xc7\x87\xbe\xdd\x47\x82\x79\xbb\x2b\x6a\xbd\x6b\xf7\x11\xb7\xfb"
- "\xdf\x9d\xe4\xb9\x55\x30\xf4\x94\xe9\xa6\xa4\xe9\x64\xea\x55\x6c"
- "\xff\x27\x46\xea\xbf\xd9\x3a\x72\x7d\x9a\xcc\xa6\xda\x6c\x1b\x09"
- "\x63\xb9\xc2\x74\x21\x56\x6d\x26\x7e\xd0\xd6\x58\x9a\xbb\x2d\x0f"
- "\xef\x02\x94\x63\x03\xd9\x6f\x57\x6d\x6e\xeb\x30\x44\x65\xfe\x65"
- "\x09\xd1\xa6\x5a\x48\x60\x75\x8a\x99\xa4\xe8\xa9\xa5\x9a\x9c\x21"
- "\xfe\x66\x22\xc7\xf9\xb2\xa3\xcd\xe5\x24\x2e\x9e\x52\x28\xfb\x75"
- "\x1c\x63\xe6\x9e\x27\x21\x60\x13\xa7\x51\xd0\x1f\x79\x02\xd1\x42"
- "\xf9\x21\x48\x4b\x28\x7b\xb3\x7a\x2e\x91\x7d\x10\x65\x25\x48\x4f"
- "\xa4\x2d\x8c\x47\x43\x18\x5d\xdb\x08\xf9\xfd\xf3\x9c\xae\x85\x4b"
- "\x06\x4a\xd7\x4f\xf8\xfa\x9f\x61\x4b\xa0\xc9\xdc\x41\xc0\xb6\x0c"
- "\xc4\x33\xf7\x90\x1e\x52\xad\x6f\x81\xb1\xc8\x91\x5a\x9a\xb3\x05"
- "\xc6\xa3\x9b\x2d\x03\x2c\xd7\xad\xff\x6b\x27\x79\x9a\x04\xba\xa2"
- "\x07\xd6\x1c\xf4\xae\x0c\xa1\xfe\x5b\x92\x38\xbd\xb7\x24\x8f\xac"
- "\xf7\x6d\xe9\x9d\xde\x5b\x92\x80\xde\x99\x76\xd5\x96\x04\xcf\xe9"
- "\x5d\x79\x97\x2b\xbd\xb7\x84\xdf\x18\x7a\x1f\x15\xe3\x9f\x6e\xc9"
- "\x73\xa5\xf7\xd1\x52\x4e\xef\xa3\x33\x81\xde\x69\x02\xe8\xca\x81"
- "\x95\x5b\x39\xc3\x03\x7a\x03\xbe\x7b\xea\x30\x07\xbd\xab\x4a\x81"
- "\xde\x22\xbe\xb7\x00\xbe\x47\x36\xb8\xa1\x37\xe0\x3b\x1f\xf0\xbd"
- "\x65\x00\xf8\xae\xca\xea\x46\xef\x1b\x84\xef\x2a\x71\xfe\x2f\xbf"
- "\x1b\xbe\xab\x02\x39\xbd\x2b\xf7\xd2\x9c\x7c\xc0\xf7\x96\x01\xe2"
- "\xbb\x6a\xb7\x07\xfa\x03\xf0\xdd\x53\x77\x3a\xe8\x6d\x0a\xa4\xfe"
- "\xf9\x22\xbe\xf3\x01\xdf\xa3\x3e\xed\x9d\xde\xf9\x80\xef\x7c\xc0"
- "\x77\xfe\x00\xf0\x5d\x7d\xcd\x95\xde\xf9\x37\x08\xdf\xd5\x07\x44"
- "\x7a\x77\xc3\x77\x75\x1a\xa7\x77\xf5\x04\xa0\x37\xe0\x3b\x7f\x80"
- "\xf8\x36\x05\x7b\x40\x6f\xc0\x77\x4f\x9d\xed\xa0\x77\x4d\x1a\xd0"
- "\x5b\xc4\x77\x3e\xe0\xfb\xa7\xd9\x6e\xe8\x0d\xf8\x2e\x00\x7c\xe7"
- "\x0f\x00\xdf\x35\x4b\xbb\xd1\xfb\x06\xe1\xbb\x86\xdb\x7f\x86\x82"
- "\x6e\xf8\x36\x59\x38\xbd\x4d\xf9\x34\xa7\x00\xf0\x9d\x3f\x40\x7c"
- "\xd7\x18\x3c\xb0\x13\x00\xdf\x3d\x6d\x05\x07\xbd\x8f\x59\xa8\x7f"
- "\x81\x88\xef\x02\xc0\xf7\xf3\x8f\xf7\x4e\xef\x02\xc0\x77\x01\xe0"
- "\xbb\x60\x00\xf8\x3e\x76\xc2\x95\xde\x05\x37\x08\xdf\xc7\xc4\xf8"
- "\x97\x05\xdd\xf0\x7d\x2c\x92\xd3\xfb\x98\x02\xe8\x0d\xf8\x2e\x18"
- "\x20\xbe\x8f\xd9\xbc\xb1\x4f\x56\x16\x13\xa5\x2b\xcd\x3f\x8b\xbe"
- "\x7e\x36\xca\x67\xb3\xbf\x1f\x1b\xe5\x33\x4d\xef\x36\xca\xa7\xb5"
- "\x9c\xe6\x9f\x26\x79\x67\xa3\x7c\xe6\xf6\xfc\x43\x5f\x36\x4a\x4f"
- "\x9a\xd7\xd6\x5d\x3f\x3b\xa5\xf6\xa3\xef\xc7\x4e\xa9\x35\xf4\x6e"
- "\xa7\xd4\xce\xe2\x34\xff\xac\xd9\x3b\x3b\xa5\xd6\xad\xff\x83\xbe"
- "\xec\x94\x9e\x34\xff\xfc\xe9\xeb\x67\xab\x7c\xfe\xc8\xf7\x63\xab"
- "\x7c\x4e\x7a\xb7\x55\x8e\xef\xe3\x34\x3f\x1e\xe9\x9d\xad\xf2\x79"
- "\x84\x37\xb6\x4a\x4f\x9a\x7f\x61\xbc\x7e\xf6\xca\x17\xaf\x7f\x3f"
- "\xf6\xca\x17\x09\xbd\xdb\x2b\x5f\x88\xe3\x9f\xcf\x6b\xbd\xb3\x57"
- "\xbe\xf0\x60\xfc\xd3\xd3\x5e\xe9\x49\xf3\x13\xd3\xae\x9f\xcd\x72"
- "\x62\xec\xf7\x63\xb3\xd4\x35\xf5\x6e\xb3\xd4\xed\xe2\x34\xaf\x9b"
- "\xe5\x9d\xcd\x72\x22\xd4\x1b\x9b\xa5\x27\xcd\x4f\x96\x5d\x3f\xbb"
- "\xe5\xe4\x5f\xbf\x1f\xbb\xe5\xe4\xbc\xde\xed\x96\x93\x1a\x4e\xf3"
- "\x13\xfb\xbc\xb3\x5b\x4e\xee\xf5\xc6\x6e\x41\x5a\x23\xcd\xd1\x56"
- "\xe1\x34\x3f\x95\x44\x03\x36\xd7\x74\x82\x3d\xe2\x0f\x74\xf7\x6f"
- "\x26\xf2\x62\xa4\x79\x1d\xa7\xb9\x3d\x60\x5b\x1e\xd0\x27\x16\x69"
- "\xc6\xda\xf1\xad\x26\xc0\x6e\xd8\x6c\xa3\x72\x02\x6d\x51\x92\xf3"
- "\xb2\x2f\x5f\xb1\xa5\x93\x00\x6d\xca\x7a\xf8\xff\xd4\x52\xcc\xa3"
- "\x4d\xc9\x38\x05\x6d\xf4\xc1\x35\x0a\x5b\x4e\x54\x88\xdd\x7f\xeb"
- "\x9e\xf3\xb2\xfa\x83\x74\xec\x82\x90\x4e\xb0\x25\xe8\x8b\x9a\x20"
- "\x53\xf3\x1e\x62\xb2\x7d\x42\xaa\xeb\xde\x23\x42\xc0\xb6\xcd\x0f"
- "\xda\x88\x8e\x7e\xab\x0b\xaa\x4c\x30\x13\xfb\x62\x8d\xca\x94\x54"
- "\x01\xb8\xf8\x5f\x12\xd6\x44\xaf\xd2\xb3\x3a\x55\xa7\x7f\xa1\xc5"
- "\xee\xbf\x4d\x6f\xcf\x29\x2a\xb7\xf9\x17\x9a\xdf\x48\x34\xcb\x55"
- "\x56\xa2\x5b\xd6\x48\x69\x6e\x14\x51\xe4\x36\x10\xe5\xa6\x28\xa2"
- "\xda\xd4\x40\x02\x2b\x1b\xeb\x48\xd5\x85\x0a\x52\xd5\x72\x82\x54"
- "\x5d\x85\xab\x03\x2e\x01\xae\xb4\x13\xa4\xb2\x99\x90\xd9\x17\x09"
- "\x49\x6d\xa4\x96\x1f\xd7\x93\xa0\x4a\x5b\x1d\xd1\x2e\x20\xe4\x92"
- "\xac\xfe\x4f\xaa\x48\x12\x44\xcf\x6a\x08\x5d\xac\x91\xc3\x3b\x05"
- "\xa6\x9b\x6c\x16\x52\xd9\x68\xc5\xf7\xd3\xe1\xbd\x22\xb5\x11\xca"
- "\x17\x2a\xd0\x97\xa1\xa5\x32\xed\x08\xb4\x6f\xb4\x16\xf4\xa6\x52"
- "\xb2\xc9\x72\x3b\x48\xc8\x26\x60\x33\x62\x26\x8c\x72\xcc\xec\xec"
- "\x18\x28\x66\xea\xb9\xff\xf7\x17\x35\xa3\x81\xde\x63\x84\x17\x23"
- "\x02\xe7\x9c\x38\x4d\x71\x3f\x18\xae\xcf\x54\xb7\x7d\x42\x70\xcd"
- "\x3a\x6c\x0d\x21\x4f\xdb\x09\x41\x9a\xe0\x5a\xf2\x1c\x3d\x51\xe3"
- "\x3e\x35\xe1\x5b\xdd\x68\x53\xa3\x85\xac\xb3\x41\x5d\x2f\x59\xbb"
- "\xea\x5a\xbd\xb1\x9a\xc0\xbb\x31\xd5\xb1\x66\xa2\xd2\x93\x40\xa4"
- "\xb3\xcd\xb0\xd9\x3a\xa7\x89\xf8\xc5\xb5\x51\x8a\x34\x46\xda\x22"
- "\x9d\xb1\x3c\x89\xf6\xa6\x68\x0b\x49\xb5\x92\x40\x53\x0a\xdc\x93"
- "\xa8\xc5\x44\x2e\x13\xa8\xe3\x32\xea\x3f\x5a\x0b\xf8\xc8\x47\x4c"
- "\x98\x65\x5f\x26\x03\x0e\x46\xd3\x8c\x2f\x43\x4a\xa0\xbd\xb8\xb6"
- "\x3f\xb0\x36\x9f\xf2\x64\xfd\xa3\x87\x4d\xe8\xc0\xf3\x96\x24\x8e"
- "\x67\xf3\x2c\x1a\xb0\x25\xbc\x13\x6c\x3d\x8e\x67\xdf\x96\xfe\xf1"
- "\xbc\x25\xd9\x81\xe7\xaf\x9e\x73\xe0\xd9\xfc\x73\xf7\x78\x3e\x5d"
- "\x20\xe2\x39\xef\xe6\xc4\xf3\xe9\x49\x7d\xe3\xf9\xb4\xb2\x0f\x3c"
- "\x67\x4a\xf6\xee\xd0\xe0\xf9\x74\xe4\x8d\xc3\xf3\x96\x24\xef\xf0"
- "\x7c\x7a\x86\x2b\x9e\xbf\x7a\x9a\xe3\xf9\x2b\xe2\x1d\x9e\xcd\x6e"
- "\xfd\x1f\xf7\x65\x6f\x3b\xe1\x59\x94\xcf\x67\x35\x80\x67\x90\xcf"
- "\x5b\x44\xf9\x3c\xb2\xc1\x03\x3c\x3b\xc9\xe7\x33\x13\x1d\x78\x3e"
- "\xeb\xe7\x1e\xcf\x0d\x31\x1c\xcf\xf9\x37\xa9\x7c\x3e\x73\xad\x6f"
- "\x3c\x9f\xa9\x73\x8f\xe7\x7c\xa5\x34\x96\x18\x1a\x3c\x37\x84\xdc"
- "\x40\x3c\x7b\x29\x9f\x1b\x54\xae\x78\x3e\x13\xcc\xf1\x6c\xae\xf1"
- "\x0e\xcf\x67\x27\x78\x33\x96\x71\xe0\x39\x5f\x94\xcf\xe7\x9a\x68"
- "\x40\x3e\xc8\xe7\x7c\x51\x3e\x8f\xfa\xb4\x7f\x3c\xe7\x3b\xc9\xe7"
- "\xb3\x57\x1c\x78\x3e\x77\xc2\x3d\x9e\xcf\x3d\x22\xe2\xf9\x26\x95"
- "\xcf\x8d\x47\xfa\xc6\x73\x63\x59\x1f\x78\xce\x94\xc6\x69\x43\x83"
- "\xe7\x73\xe4\xc6\xe1\x39\xdf\x4b\xf9\xdc\x58\xef\x8a\xe7\xb3\xcd"
- "\x1c\xcf\x67\x4b\xbd\xc3\xf3\xb9\x36\x6f\xc6\x89\x4e\x78\x16\xe5"
- "\x73\x53\x39\xe0\x19\xe4\x73\xbe\x28\x9f\x7f\x9a\xed\x01\x9e\x9d"
- "\xe4\xf3\xf9\x83\x0e\x3c\x37\xbd\xee\x1e\xcf\x4d\xbe\x1c\xcf\x05"
- "\x37\xa9\x7c\xfe\x7a\x47\xdf\x78\xfe\x3a\xc9\x3d\x9e\x0b\x94\xd2"
- "\x18\x78\x68\xf0\xfc\x75\xcd\x0d\xc4\xb3\x97\xf2\xf9\xeb\xdd\xae"
- "\x78\x3e\xbf\x8f\xe3\xf9\xbc\xde\x3b\x3c\x37\xb9\x8d\xff\xda\xd7"
- "\x18\xdc\x81\xe7\x02\x51\x3e\x7f\x9b\x49\x03\x0a\x40\x3e\x17\x88"
- "\xf2\xf9\xf9\xc7\xfb\xc7\x73\x81\x93\x7c\xfe\xa6\xc0\x81\xe7\x6f"
- "\xd7\xb8\xc7\xf3\x85\xe3\x22\x9e\x6f\x52\xf9\x7c\x61\x69\xdf\x78"
- "\xbe\x30\xab\x0f\x3c\x67\x4a\xf3\x0b\x43\x83\xe7\x0b\xa5\x37\x0e"
- "\xcf\x05\x5e\xca\xe7\x0b\xc9\xae\x78\xfe\xc6\xc0\xf1\xfc\x4d\xa8"
- "\x77\x78\xfe\x36\x7f\x68\xe6\x37\x2e\x65\xe2\xfc\x46\x07\xce\x6f"
- "\x38\xf6\xfe\xc5\xaa\x6b\x38\x9e\x3b\x01\xcf\x85\xce\x78\xfe\xb2"
- "\xfb\xfc\x46\x73\x8c\xd0\x85\xe7\x4b\x3d\xf0\x2c\x00\x9e\x3b\x19"
- "\x9e\x2f\xfe\x55\x9a\xdf\x30\x35\x97\x02\x4e\x2e\x10\x53\x38\x60"
- "\x39\x57\xc4\xf2\x97\x80\x65\xa0\xa1\x00\x34\xae\xac\xaf\x23\x61"
- "\x16\x4e\xcb\x0e\xa0\xb1\xe0\x8c\xe3\x8e\x26\x39\xe2\x17\x71\x2b"
- "\x61\xb8\x2a\x0e\xb0\x1b\x7f\x8c\x54\x25\xc2\xb5\x16\xae\x14\xb8"
- "\xc8\x31\x52\xd9\x04\xd8\x5d\xea\x8c\xdd\x1a\x11\xbb\x17\x27\xf6"
- "\x8d\xdd\x8b\x8a\x1b\x37\x97\x71\x91\xcf\x7f\x7d\x19\x11\x18\xf6"
- "\xcc\x69\x6a\x4a\xaa\x13\xf1\x79\x81\x84\xd9\x88\x9a\x3e\xaf\x1b"
- "\xad\x8a\x20\x81\x2f\xdb\x89\x3c\x27\x8a\x04\xe6\x9c\x84\x76\x4b"
- "\xfd\xb7\x81\xa8\x3e\xb1\xbe\x47\x2a\x5b\xea\x48\xe5\xd5\x23\xa4"
- "\x52\x80\xeb\x02\x5c\x50\xd7\xb0\x18\xe7\x76\x5b\xc4\x76\x5f\x1a"
- "\x0b\x65\x4d\xe8\xa3\xdd\x36\xd6\xee\x68\x68\x77\x87\xa3\xdd\x26"
- "\xe8\x07\xc0\x9f\x31\x82\x38\x1f\x12\x66\x21\x7e\x2b\x6c\x94\x76"
- "\x88\xf8\x47\xfe\x7c\x52\x6b\x25\x61\x7a\xe0\xd9\x62\xc0\x7f\x63"
- "\x19\x49\x4d\x06\xfc\x77\x58\x11\x77\x16\x53\xda\x35\xc0\xff\xc5"
- "\xe9\x14\xe8\xd7\x89\xf8\xff\x12\xf1\xdf\x3c\x4f\x60\xf8\x6f\x0e"
- "\xf4\x0e\xff\x97\x3c\xc0\xbf\x27\xf3\x21\x97\x33\x71\x3e\xa4\x03"
- "\xe7\x43\x1c\x7b\x40\xfb\xc1\xbf\xf3\x7c\xc8\x77\x4e\xf8\xbf\xdc"
- "\x07\xfe\x2d\x12\xfe\xf3\xbe\x7f\xfc\x5b\xfa\xc1\xbf\xa5\x2f\xfc"
- "\x0f\xf1\xdc\x87\xe5\x06\xe2\xff\x72\x3f\xf8\xb7\x78\x80\xff\x2d"
- "\x49\xde\xe1\xdf\xd2\x0d\xff\xdf\x89\xf8\xff\xce\x4b\xfc\x5f\xf6"
- "\x04\xff\x1e\xcc\x9f\xb4\x21\xfe\x41\xfe\x6f\x69\x73\xda\x0b\xdc"
- "\x1f\xfe\x9d\xe4\x7f\x8b\x13\xfe\xdb\xfa\xc0\x7f\xeb\x5f\xa5\xf9"
- "\x93\xef\x1f\xff\xad\xfd\xe0\xbf\xb5\x0f\xfc\x0f\xf5\x5c\x49\xeb"
- "\x0d\xc4\x7f\x5b\x3f\xf8\x6f\xf5\x04\xff\x5e\xca\xff\xd6\x6e\xf8"
- "\x6f\x11\xf1\xdf\xe2\x25\xfe\xdb\x3c\xc0\xbf\x27\xf3\x2d\xed\x99"
- "\x38\xdf\xd2\x81\xf3\x2d\x8e\x3d\xe1\xfd\xe0\xdf\x79\xbe\xe5\x8a"
- "\x13\xfe\xdb\xfb\xc0\xff\x55\x09\xff\x37\x81\xfc\xbf\xda\x0f\xfe"
- "\xaf\xf6\x85\xff\x21\x9e\x5b\xb9\x7a\x03\xf1\xdf\xde\x0f\xfe\xaf"
- "\x7a\x80\xff\x7c\x2f\xe5\xff\xd5\x6e\xf8\xbf\x22\xe2\xff\x8a\x97"
- "\xf8\x6f\xf7\x04\xff\x1e\xcc\xcf\x74\x20\xfe\x41\xfe\xe7\xb7\x39"
- "\x9d\x0d\xe8\x0f\xff\x4e\xf2\xdf\xea\x84\xff\x8e\x3e\xf0\x7f\xed"
- "\xaf\xd2\xfc\xcc\xf7\x8f\xff\x6b\xfd\xe0\xff\x5a\x1f\xf8\x1f\xea"
- "\xb9\x98\x6b\x37\x10\xff\x1d\xfd\xe0\xff\x9a\x27\xf8\xf7\x52\xfe"
- "\x5f\xeb\x86\x7f\xab\x88\x7f\xab\x97\xf8\xef\xf0\x00\xff\x9e\xcc"
- "\xe7\xd8\xd9\x7c\x4e\x07\xce\xe7\x38\xce\x88\xf4\x83\x7f\xe7\xf9"
- "\x9c\x4e\x27\xfc\xdb\xfb\xc0\xbf\x4d\xc2\xff\x4d\x20\xff\x6d\xfd"
- "\xe0\xdf\xd6\x17\xfe\x87\x78\xee\xc6\x76\x03\xf1\x6f\xef\x07\xff"
- "\x36\x0f\xf0\x5f\xe0\xa5\xfc\xb7\x75\xc3\x7f\xa7\x88\xff\x4e\x2f"
- "\xf1\x6f\x1f\xa2\xf9\x1f\x1a\x82\xf3\x3f\x82\x6a\x73\x5b\x67\xd1"
- "\x82\x10\xc1\x50\x68\x51\xcb\xb4\xc4\xa6\xda\xba\xc7\x94\xd0\x46"
- "\xe6\x5c\x01\x9e\xe8\xaf\x90\x05\x57\x02\x31\x96\xa5\x99\xc2\xf8"
- "\xdf\xe5\x8c\x28\x5c\x36\xc3\x68\xed\xa6\x38\xa2\xb0\x07\x6c\xdb"
- "\x8c\x69\xa6\xf3\x56\x82\x6d\x5e\x87\x34\xb8\xe0\xa0\x01\xce\xc1"
- "\xd1\xef\x74\x81\x25\xe9\x90\xa7\xc3\x4c\x1a\x01\x2f\x95\x8d\x66"
- "\xa0\xfd\x5a\x86\x2d\xe4\xc5\x79\x99\x50\xb3\xf3\x12\x51\xd8\xce"
- "\x6a\xc6\x00\x8f\x83\xfc\x57\x13\x59\x70\x23\x15\x90\x97\xc8\x23"
- "\xe4\xab\x76\x2d\xee\x57\xa2\x93\xaa\x01\xdf\xb6\xb3\xba\x31\x25"
- "\x90\x6f\xe8\xe7\x65\x04\xb6\xfe\x01\xf7\x8a\xca\x7a\xa0\x65\x86"
- "\xe0\x25\x9f\xa8\x27\xe7\x5f\xfa\x9f\xa7\x90\x93\x3a\x9c\xa7\x10"
- "\x54\x5b\x12\x3c\xe3\xd3\x96\x24\x97\x33\xad\x43\xcd\x27\x39\x49"
- "\xf2\x88\x4f\x72\x72\xac\x1b\x9f\x86\x76\xfe\x40\x4e\x8a\x18\x9f"
- "\xe4\x44\xcf\xf9\x44\xcb\xbd\xe2\x93\x9c\x78\xb5\xff\xb7\xc7\x78"
- "\x5a\x2e\x4f\xc3\xf1\x34\xf0\xc9\xc3\xfe\xb4\xc5\xea\x72\x06\x77"
- "\xc8\xf9\x24\xd7\x7a\xc6\x27\xf9\x1a\x57\x3e\x0d\xf1\x38\x57\x2e"
- "\x9f\xc9\xf9\x24\xd7\x30\x3e\x65\xcb\x22\xbd\xe3\x93\xdc\x83\xf3"
- "\x1f\x1e\x8c\xfb\xe4\x0a\x1d\x8e\xfb\x04\x18\xf7\x79\xc6\xa7\xfc"
- "\x24\x97\x33\xc3\x43\xce\x27\x9f\x0a\xcf\xf8\xa4\xb8\xa7\x1b\x9f"
- "\x86\x76\x3c\x26\xf7\x69\xe6\x7c\xf2\x31\x72\x3e\xf9\x28\xbd\xe3"
- "\x93\x62\xda\x90\x8c\x4f\xe4\xbe\x35\x38\x3e\x01\x3e\x79\xd8\x9f"
- "\xf2\xad\x2e\x67\x9c\x87\x9c\x4f\xbe\x7a\xcf\xf8\xe4\x7b\xc4\x95"
- "\x4f\x43\x3c\x6e\x90\xfb\xf2\x78\xc0\x72\xdf\x58\xce\x27\xc5\x1e"
- "\xef\xf8\xe4\xeb\xd6\xff\xe9\x80\xec\x68\xf9\xf0\x24\xb4\xa3\x05"
- "\xb0\xa3\x3d\xe3\x53\x41\x92\xcb\x99\xec\x21\xe7\xd3\x70\x8d\x67"
- "\x7c\x1a\xfe\x52\x37\x3e\x0d\xad\x7d\x2b\x1f\x3e\x83\xf3\x69\x78"
- "\x20\xe7\xd3\xb0\x08\xef\xf8\x34\xdc\x83\xfd\x9f\xbd\x9f\xc3\xea"
- "\x61\xf3\xc9\xfd\x26\xdc\x54\x36\x9f\x5c\x79\xc0\x33\x5e\xf9\x8d"
- "\xbd\xae\x36\x9f\x5c\xd9\xc4\x79\xa5\xdc\xc7\x79\xa5\x54\x78\xc7"
- "\x2b\x3f\xb7\xfe\x1f\xfb\x3b\xbf\xd5\xd3\xee\x1b\x51\x73\x73\xd9"
- "\x7d\x23\x3c\x94\x7f\x23\x8e\x5c\x5f\xbb\x6f\x84\x28\xff\x46\x88"
- "\xf2\xcf\xcf\x4b\xf9\x37\xc2\x03\xf9\xd7\xfb\xb9\xaf\x9e\xb6\x9f"
- "\x2a\xf9\xe6\xb2\xfd\x54\xc1\x9e\xf1\x4a\xb5\xea\xfa\xda\x7e\xaa"
- "\x50\xce\x2b\x55\x10\xe7\xd5\xc8\x79\xde\xf1\x4a\x95\xe9\xed\x79"
- "\xb1\x9e\xf6\x5f\xc0\x4d\x66\xff\xf9\x7b\x68\xff\x05\x5c\x67\xfb"
- "\xcf\x5f\xb4\xff\xfc\x45\xfb\xcf\xdf\x4b\xfb\x2f\xc0\x2b\xfb\xaf"
- "\x1b\xaf\xc4\x7e\xa5\xae\xbd\xb9\x6c\x40\x75\x82\x67\xbc\x52\x57"
- "\x5d\x5f\x1b\x50\xbd\x9d\xf3\x4a\xbd\x8c\xf3\x2a\x60\xaf\x77\xbc"
- "\x52\x9b\xbd\x3d\x9f\xd6\xd3\x0e\x1c\x95\x76\x73\xd9\x81\xa3\x3c"
- "\x1c\xff\x8e\x5a\x73\x7d\xed\xc0\x51\xe2\xf8\x77\x94\x38\xfe\x0d"
- "\xf4\x72\xfc\x3b\xca\x83\xf1\xaf\x07\xf3\x7e\xf2\xdb\xcc\x68\x03"
- "\xda\x0d\x9b\xdb\xd4\x40\x7f\x75\x12\x91\x77\x04\x03\xbf\x54\xc0"
- "\xaf\xf5\x5a\xd2\x69\x00\x7e\x59\x6c\x64\xce\x4b\xa7\x69\x75\xb3"
- "\x9d\x74\x00\xaf\xae\x81\x1d\x68\xb2\x34\xe1\x19\xbd\x5f\x36\xc8"
- "\x6f\x5b\xf3\xfc\x4b\x81\x04\xf9\x85\xf4\xb7\xab\x46\x6b\x29\xf0"
- "\x8b\xf1\x4f\x55\x54\x6e\x33\x6c\xd3\xcf\xbe\x78\x9a\xae\x30\x53"
- "\x5a\x15\x6b\x45\xdf\x91\x21\x55\xb1\x75\x24\xac\x91\xf8\x69\x9f"
- "\x45\xbe\xdc\x36\x09\xd3\x4d\x96\x3a\x82\x7e\x3f\xd9\x1c\xf8\x69"
- "\x5d\x90\xed\x0b\x9d\x0a\xfd\x37\xe1\xb9\x42\xc9\x47\x93\xe9\xc2"
- "\x76\xc6\xff\xee\x73\xaa\x8c\xff\x5f\xe8\x02\x0b\xf1\x7c\xe2\x90"
- "\xdb\x82\xa3\xd9\xfc\x9f\x70\x5a\x33\x46\xaa\xe3\x8a\x65\x94\x42"
- "\x1d\x47\x57\xb7\x59\x08\xd6\xb3\xba\xcd\x48\x52\x13\x48\x60\x75"
- "\x47\x13\x49\x69\xa3\x96\xea\xb4\x6f\x48\xd8\x15\x5c\x17\x40\x3c"
- "\xdd\xf6\x12\xe7\xf7\xe8\x22\xe1\xb4\x6e\x8c\x59\x7e\x5b\x6c\x75"
- "\x0d\x21\xea\xf5\x40\x6b\x1b\x91\xb3\xf3\x9a\x72\xa2\x04\x7a\xc5"
- "\x9a\xd2\x1a\x08\xd0\xce\x62\xb2\x9d\x44\x7a\xc6\xc2\xfb\x19\x5d"
- "\xeb\x0d\x01\xdb\x5a\x30\x0d\x69\x8b\xfb\x4c\x4d\x7a\x0b\xcb\x23"
- "\xbd\xe7\xbc\x4b\x23\xa6\xa4\x0e\x52\x6d\x23\x04\xbe\x37\xeb\x68"
- "\x44\x1d\xe0\x6b\xb4\x97\x72\xfb\xb6\xe6\xa1\x99\xaf\xbc\x23\x14"
- "\xed\x56\xbb\x61\x4b\x02\xaf\xa3\x6f\x4b\xff\xf8\xda\x92\xe4\xc0"
- "\xd7\xed\x27\x06\x87\xaf\xdb\xb3\x86\x18\x5f\x43\x6c\xbf\xde\x3e"
- "\x77\x70\xf8\xba\xfd\x18\xc7\x57\x90\x8d\xe3\xeb\xf6\x0a\x07\xbe"
- "\x7c\x5b\xae\x1f\xbe\x82\xca\x38\xbe\x82\x62\xbd\xc3\xd7\x1d\x4f"
- "\x0f\xcd\x3c\xab\xa6\x14\x6d\x6d\xc0\x97\x28\xbf\x46\x36\x78\x80"
- "\x2f\x27\xf9\xa5\xf9\xf9\xe0\xf0\x75\xe7\x37\x43\x8b\xaf\xa1\xb6"
- "\xb9\xef\xdc\x3b\x38\x7c\x69\x1e\xe2\xf8\xba\x73\x1e\xc7\x97\x46"
- "\xe7\xc0\xd7\xc8\x86\xeb\x87\xaf\x3b\x95\x1c\x5f\x77\x54\x78\x87"
- "\x2f\x8d\x57\xfe\xaf\x7a\x8e\x0f\xee\x26\x38\x3e\xb0\x1b\xf2\x45"
- "\xf9\x35\xea\xd3\xfe\xf1\x95\xef\x24\xbf\xc6\xec\x18\x1c\xbe\xc6"
- "\xfc\x6e\x88\xf1\x35\xc4\xe3\x84\x31\x41\x83\xc3\xd7\x98\xbf\x72"
- "\x7c\xdd\xb5\x8f\xe3\x6b\x4c\xa6\x03\x5f\xa3\x3e\xbd\x7e\xf8\xba"
- "\x2b\x96\xe3\xeb\x2e\x9d\x77\xf8\xba\xdb\xbd\xff\xe7\x01\xcd\x6b"
- "\x8f\x8d\xc4\x31\x0d\xe0\x4b\x94\x5f\x3f\xcd\xf6\x00\x5f\x4e\xf2"
- "\x2b\xf8\xda\xe0\xf0\x15\xfc\xfa\xd0\xe2\x6b\xa8\xc7\x36\xc1\x09"
- "\x83\xc3\x57\xf0\x65\x8e\xaf\xe0\x60\x8e\xaf\xe0\x26\x07\xbe\x7e"
- "\x9a\x7d\xfd\xf0\x75\x77\x05\xc7\xd7\xdd\x99\xde\xe1\x6b\xac\x07"
- "\xfe\x5f\x3d\x99\x8f\x1f\x6f\xc4\x71\x98\xdd\x50\x20\xca\xaf\xe7"
- "\x1f\xef\x1f\x5f\x05\x4e\xf2\x6b\xfc\x9f\x06\x87\xaf\xf1\x7e\x43"
- "\x8c\xaf\x21\x1e\x8f\x8d\xab\x1d\x1c\xbe\xc6\x3f\xc3\xf1\x35\x2e"
- "\x99\xe3\x6b\xfc\x2c\x07\xbe\x9e\x7f\xfc\xfa\xe1\x6b\x9c\x8e\xe3"
- "\x6b\x6c\x93\x77\xf8\x1a\xef\x81\xff\x1f\x4f\xd7\x11\xee\x9d\x30"
- "\xb8\x31\xe4\x3d\xef\x0f\x0e\x63\xf7\x2c\xbf\xb9\xc7\x90\xf7\x4c"
- "\x1f\x1c\xc6\xee\x79\x87\x63\x4c\x6b\xe6\x18\xbb\x67\xf7\x8d\x19"
- "\x43\x6a\x0d\x1c\x63\xda\xa7\xbd\xc3\xd8\xbd\x43\xb8\xfe\x31\x21"
- "\x73\x70\xe3\xc8\x09\xf7\x0c\x0e\x63\xf7\x1d\xbb\xb9\xc7\x91\xf7"
- "\x15\x0d\x0e\x63\x13\xee\xe2\x18\xbb\x6f\x26\xc7\xd8\x84\xc0\x1b"
- "\x33\x8e\xbc\xd7\xc2\x31\x76\xaf\x97\xeb\x36\x13\xbc\x3a\xff\xd2"
- "\xfb\xba\xcd\xfd\xcd\x83\x1b\x4b\xde\xff\xca\xe0\x30\x76\xff\x23"
- "\x37\xf7\x58\xf2\x7e\x32\x38\x8c\xdd\xbf\x8e\x63\x6c\x62\x19\xc7"
- "\xd8\xfd\x09\x37\x66\x2c\x39\x71\x2e\xc7\xd8\xc4\x20\xef\x30\x76"
- "\xbf\x75\xe8\xd6\x9b\x26\x85\x0f\x6e\x3c\xa9\xfb\x66\x70\x18\xd3"
- "\xed\xb8\xb9\xc7\x93\xba\xe8\xc1\x61\x4c\x77\x86\x63\x4c\xa7\xe2"
- "\x18\xd3\xd5\xdd\x98\xf1\xe4\x8f\xca\x39\xc6\x7e\x94\xe4\x1d\xc6"
- "\x26\x79\xe0\xff\xdf\xd3\x75\xb2\x1f\xef\x1d\xdc\x98\xf2\xc7\xb3"
- "\x07\x87\xb1\x07\xec\x37\xf7\x98\xf2\x81\x8a\xc1\x61\xec\xc7\x4f"
- "\x72\x8c\x3d\xa0\xe7\x18\xfb\xf1\x8c\x1b\x33\xa6\x7c\x20\x98\x63"
- "\x6c\x52\xbd\x77\x18\xfb\xb1\x71\xe8\xd6\xf7\xa6\x6a\x06\x37\xae"
- "\x9c\xf2\xf6\xe0\x30\x36\x65\xd1\xcd\x3d\xae\x9c\x32\x79\x70\x18"
- "\x9b\xf2\x3a\xc7\xd8\xe4\x5a\x8e\xb1\x29\xa5\x37\x66\x5c\x39\x39"
- "\x8d\x63\x6c\xb2\x77\xfe\x28\xe4\x53\x7b\xf8\xbf\x5a\x1a\x97\xb8"
- "\x68\xd9\xd2\x68\xed\xd2\xb8\x84\xf8\x97\xb4\x2b\x97\xae\x8d\x79"
- "\x74\xe2\xaa\xc9\xda\xf8\x24\x6d\xfc\xd2\xb8\x3f\x8b\x09\xd1\x23"
- "\xc8\xb3\x31\xcb\x16\x25\x61\x0a\xe4\xfe\x73\xdc\xf2\x98\xb8\x04"
- "\x6d\x7c\xcc\x4b\xab\x96\xc6\xc7\xe0\xff\x2b\xb5\x4b\x56\xc4\x43"
- "\xc2\xe2\x98\xa5\x89\x31\xda\xa8\x55\x4b\x96\xc4\xc4\xaf\x1c\x41"
- "\x66\xaf\x5a\x96\xb0\x54\xbf\x2c\x46\x3b\x73\xf6\x63\x53\xe6\x3e"
- "\xf9\x87\xb9\xbf\xfe\x35\x06\x27\x73\x8a\x4d\x16\x4c\x0d\x45\x7b"
- "\x00\x73\x8a\xf3\xf2\x9f\xdd\x53\xad\x21\x2c\x3e\xee\xa6\x16\x12"
- "\x98\x1d\x4f\x14\x59\x2d\x44\x99\xd3\x42\x54\xda\x17\x48\x28\xcd"
- "\xfa\x22\x34\xb7\x85\x04\xd1\xdc\xa8\xe9\x42\x8e\x3a\x9c\xe6\xa8"
- "\xf3\x2c\x7e\x56\x4c\x0b\x14\xb2\xda\x93\xe0\x37\x41\x40\x5b\x05"
- "\xcd\x19\x4d\x1a\xe4\x3f\x35\x5b\xfc\xae\x69\x53\xbf\x21\x72\x3a"
- "\xe2\xc1\xb9\x6f\x0a\x16\xf9\x47\x38\x53\x05\x6d\x27\xf2\x90\x65"
- "\x70\x45\x10\xf9\x43\x4a\xb8\x34\x70\x4d\x80\xeb\x69\xb8\xe6\xc2"
- "\x15\x0b\x57\x02\x5c\x69\x70\x65\xc2\x95\x07\xd7\x76\xb8\x4a\x89"
- "\xfc\x27\xc1\x70\xcd\x80\x0b\xf2\xfe\x24\x9a\x97\xf3\x13\x3d\x5c"
- "\x45\x70\x1d\x80\xab\x9e\xc8\x1f\x86\xfc\x0f\xef\x21\xf2\x69\x21"
- "\x70\xaf\x80\xab\x16\x2e\x48\x9f\x46\xe0\xc2\xdf\x27\xf0\x77\xd3"
- "\xea\x88\xfc\x91\x20\x02\xf5\xec\xff\x7a\x64\x1a\x5c\xf0\xdd\x47"
- "\x22\xe1\x32\x42\x1a\xd4\xf7\xa7\x09\xdd\xf2\xed\x73\xfa\xbf\xae"
- "\x9f\x32\xad\xea\xf5\xe3\xcd\x2c\x06\x9e\x3c\xe4\x08\x4d\x27\x3e"
- "\x34\xeb\x9a\x56\xff\x00\x91\x5d\x90\x87\x14\x98\x36\xa2\x9c\x51"
- "\x87\xb3\x98\x8e\xf0\x8c\x34\x6b\xcf\x0e\xc9\x37\x93\x65\x16\x8c"
- "\x69\x36\x30\xbc\x85\xe4\x8b\xbf\xaf\x35\xcb\x86\x5b\x59\x0c\xb8"
- "\xec\xaa\x40\x9a\x1a\x51\xc8\x62\xbf\x01\x0d\xf1\x5c\x16\xcd\xac"
- "\xcc\xa4\xca\xc3\xc1\xd8\xe7\x8d\x6b\x59\xbd\x96\xf3\xfe\x05\xef"
- "\xa1\x6e\x16\xff\xa8\xe9\x50\x4f\x05\x3e\xd3\x2c\x6b\x68\x87\x7f"
- "\x61\x1e\xfe\x7f\xad\x78\xbe\x91\x1a\x0a\xcb\x71\x9c\x6d\x4c\xf9"
- "\x4f\xe0\x7b\xc8\xf2\x0e\xff\xe2\x08\xed\xb3\x6a\xda\xc0\xcb\x96"
- "\x9b\xe5\x0f\x11\xa9\xac\x0e\xff\xa8\x50\xba\xbd\x38\x8d\xe6\x00"
- "\x86\xc4\xf2\x04\x28\x8f\x1a\xb6\x45\x42\xbe\x79\x98\x4e\x8b\xe6"
- "\xd7\x49\xff\xc3\x3d\x82\xe6\x16\x11\xbc\xab\xd7\x93\x36\xf6\x9c"
- "\x1e\x4a\xf8\x3d\x90\xa0\xac\x6b\x96\xff\x44\xf6\x60\x0d\x91\x19"
- "\x9f\xc5\x7a\x3f\x54\x99\x5a\x43\x05\x6d\x8a\x0f\x7c\xff\xa1\xaa"
- "\xae\xef\xde\x55\x9c\x84\xf1\x53\x85\xec\xa9\xd1\x18\x83\x0f\x7f"
- "\x8b\x75\x7b\x75\x34\x51\xec\xdc\x4c\x94\xd8\xc6\xf6\xec\x87\xac"
- "\x52\x1c\x3a\xfc\x8d\x1c\xf2\x3f\xf5\x4c\x2a\x75\x2a\xfb\x20\x65"
- "\xed\x09\x89\xe5\x34\xfd\x89\xce\x2c\xf3\xad\xc7\xfc\xda\x7b\x19"
- "\x2d\x97\x8b\xef\x97\x21\x3f\xb1\x7c\x21\xa7\x68\x0f\x3e\x63\x9c"
- "\x3b\x75\x0d\x91\x6b\x53\x26\x94\x73\x1a\x15\x96\x63\x39\x98\x5f"
- "\xc8\xdd\x0a\xff\x3f\xa4\x12\xa0\xbd\xf6\x74\xa2\xd3\xc6\x91\xd0"
- "\x06\xf9\x4f\x0a\xec\x59\x55\x35\xf0\x1e\xfa\x5d\x55\x2d\xe4\xaf"
- "\x61\xf4\xce\xd9\x16\x6e\x96\xff\x24\x13\xde\xd5\x76\xc5\xbe\xe4"
- "\x74\x96\x09\x59\x55\x8d\x50\xa7\x7d\x66\x59\x70\x93\xd4\x06\x26"
- "\xe3\x1c\xf9\x44\x9e\xfe\x64\x8f\xc5\xaf\xaa\xb1\x33\x91\xd6\x6c"
- "\x3a\x49\x08\x7c\x93\x76\x5c\xa5\x95\xc9\xe1\xd4\x9a\xfb\x6f\x84"
- "\x54\x46\xd6\x93\xd4\x45\x24\x78\xe4\x7a\x0a\xb6\x14\x51\x8f\xac"
- "\x57\xd3\xaa\xf0\x7a\x90\xd1\x57\x48\x72\x0d\x6d\xaa\xd6\xef\x23"
- "\xc9\xe7\x88\x6a\xdd\x52\x12\x94\x1a\x4e\x2d\x29\x95\xd4\x6a\x4a"
- "\xaa\x27\xd5\x6d\x70\xe9\xab\x20\xdf\x71\xb8\xf6\x91\xd4\x35\x44"
- "\x31\x07\xe4\x69\xca\x15\xa2\xaa\xd6\x5f\x81\xb4\x8b\x24\x39\x92"
- "\xda\xaa\x2a\x31\xdf\x41\x12\x66\xb3\xa8\xd7\x5d\x24\x8a\x92\x7f"
- "\xc3\xb3\x65\xa7\xc8\x4e\xa8\x4b\x87\xbf\x3a\xed\x5a\xce\x68\x65"
- "\x6b\x22\xb5\xb5\x67\x3f\x9c\x69\x26\xbf\x48\x73\x69\x0b\xd6\x19"
- "\xe3\x86\x42\x7b\x31\x8f\x90\xb3\x6d\xfa\x42\x1b\xe2\xfc\xe1\x64"
- "\x90\xc5\x44\x7a\x8f\xef\x2c\xfe\xdb\x00\x3f\x0f\x97\x85\xd9\x68"
- "\x3b\xe6\xc7\x76\x03\x8d\xcc\x62\xfb\xcd\x3e\x7a\xa2\x80\x6f\x34"
- "\x9b\x65\xe3\x0f\x38\xf1\x10\x79\x32\x4c\xfa\x1e\xcf\x33\x2d\xd0"
- "\x2c\x1b\xc7\x62\x2f\x0a\xfc\x9d\x15\xf3\x42\x3a\xf0\x7f\x7c\x10"
- "\xaf\xdf\xc3\x16\x4c\x13\x65\x29\x62\x05\xeb\xe8\x43\x33\x0f\x59"
- "\xec\xfe\x85\x46\x2a\xa7\x56\xc0\x73\x04\x6d\xd5\xa8\xe6\xd8\xa8"
- "\x55\xc8\xd9\x1a\x0e\xf2\x52\x85\x71\x52\x79\xfe\x69\x1f\xc1\xfb"
- "\x48\x6d\x22\xfb\xff\x75\xfc\x8e\x50\x3c\x7f\x0f\xca\xd6\xb0\x1a"
- "\xcc\x1f\xb5\x27\x37\x1e\x64\x6f\x4e\xe1\x1e\xec\x87\x82\xff\xb6"
- "\xd8\x6b\x3b\x8a\x23\xb1\x7f\x53\xc0\x18\x35\x44\x45\x76\x95\x93"
- "\x4e\x7c\xcd\xf2\x69\x69\x14\x7e\x4f\x0d\x5b\xc3\x45\xde\x2f\xe5"
- "\xd8\x9c\x96\x8c\xfd\x0e\xea\xd5\x06\xe9\xbe\x0d\xf2\x47\x94\x78"
- "\x46\x93\x66\x1e\x9e\xcc\x62\x49\xca\x1f\xf1\xe7\x98\x39\x64\x71"
- "\x79\x96\x23\xfd\xa0\x4f\x82\x1c\xe0\xf6\xc5\x23\x53\xfe\x3f\xf6"
- "\xde\x07\x2e\xaa\x2a\xfd\x1f\x7f\xe6\x32\xea\x40\x20\x93\x91\x4d"
- "\x7d\xa8\xc6\xa2\xc2\xf2\x0f\x96\x15\x19\x16\x15\x16\x96\x0a\x25"
- "\xd5\x94\xff\xd0\xb0\xc6\x42\x25\x41\x1d\x15\x05\x27\xdb\x0f\xb2"
- "\xa8\x94\x68\x94\xfc\x6b\xb3\x5d\x2a\x2b\xdb\xb5\xdf\xc7\xcf\xeb"
- "\x65\xdb\xec\x47\xda\x0f\xbb\x2b\x0c\xbb\x3f\xf7\xf7\x45\xc3\x4f"
- "\x93\x5f\xd6\x25\x17\x75\x56\x26\x19\x61\x66\xce\xef\x79\xce\xb9"
- "\x17\xee\x1d\x66\x54\xd2\xed\xb3\x7f\xa2\xae\x77\xee\x39\xcf\x79"
- "\xce\x39\xcf\xf3\x7e\x9e\xf3\xe7\x9e\x7b\x4e\xbf\x5d\x08\x1c\x0b"
- "\xfb\xde\x8e\x65\xba\xdd\x1a\xb0\x47\x04\x90\x4e\x77\x54\xc8\x41"
- "\xea\x89\x6c\x6a\xed\x2e\xbd\xd3\xe2\xd2\xc1\x6c\x8d\x3e\x4b\x7f"
- "\x6d\xa4\x73\x2b\xb1\x2c\x11\xc8\xf3\x55\xbc\x0f\xc3\xfb\xc6\xfd"
- "\x2d\xd4\xd6\x72\xbe\x97\xd1\xef\xb7\x46\x32\x77\xda\x74\xa0\x33"
- "\x2a\x51\xee\x77\xd6\xb9\x60\x6e\x16\xf1\x29\xa5\xb3\x3b\x31\x8c"
- "\x68\x30\x7c\xaf\x0b\xe6\xa5\x09\xfe\x13\x66\x7b\xc8\x67\x69\xf9"
- "\x1f\x11\xfc\x05\x5f\xe2\xa7\xf0\xae\xde\xce\x3a\x65\xde\x3e\x85"
- "\xf7\x26\x0c\x53\xf8\xa7\x2d\x56\xf2\xb8\x2b\x1e\xe3\x0f\xa8\xeb"
- "\xf0\xe6\x76\xe6\x21\x1e\x18\x97\xec\x82\x17\x4c\x14\xb7\x11\xc3"
- "\x28\xad\x0a\x53\x11\xfb\x33\x91\xc7\x01\xce\x23\xdb\x05\x0b\xeb"
- "\xd4\x7e\x03\x65\x14\xa3\xf8\x5a\x99\xd7\x06\x85\x57\x3f\x1f\x05"
- "\x53\xbf\x77\xc9\x3a\x25\xbe\xd1\xc4\x17\xe9\xf7\xb8\x20\xbb\x43"
- "\x5d\x77\x94\x79\xa3\x1c\xd7\x82\x72\x8f\x57\x97\x59\xf8\xd5\x1d"
- "\x74\xe6\xad\x4e\xe6\xb5\x8d\x7c\x96\x12\x4f\xe7\x7a\xb2\xd2\x71"
- "\x65\x64\x37\xe8\x1f\x01\xed\x2c\xb5\xbb\xf4\x6e\x53\x90\x7f\xd4"
- "\x13\x1d\xfa\xd4\x5f\xf1\x73\x4d\x47\xb2\x0e\xa4\x49\xd1\x9c\xe5"
- "\x29\xc1\x7d\x18\x96\xa9\x9c\x29\xba\x19\x69\xb0\x0f\x14\x76\xcf"
- "\xc4\x75\xa3\x40\x72\x56\xb9\xa8\xbf\x4a\x98\x4b\x71\xc6\x7b\xc0"
- "\x59\x15\x80\x40\xcd\x1c\x57\xea\x3a\xe6\xc0\x3e\x4a\x13\x9d\x11"
- "\x3d\xb8\x36\xf0\x6e\xbe\xfe\x8f\xf5\x60\x3f\xae\xf0\x76\xa0\x76"
- "\xef\xa4\x94\xec\x77\xba\x4f\x73\xdb\xc3\xdf\xdf\x50\xfc\x56\xec"
- "\xf7\x51\xdf\x0f\xfb\xdb\xd6\x72\x49\xf4\xff\x02\x48\x5b\x43\xe1"
- "\xd4\x37\xc4\x7e\x69\xad\x2a\x8e\xd5\xcc\xa9\x14\xb2\x4b\xfe\x94"
- "\xe4\xc8\xcb\xeb\x7b\xc4\x41\x65\x0e\x54\xcd\xa9\xa4\x3a\x14\xd9"
- "\x58\xc0\xe9\xeb\x76\xd0\x59\xbb\xe6\x15\xd4\x6f\x4d\x7e\x2d\xa3"
- "\x1a\x18\xda\x76\xe5\xe0\xea\x90\xcc\xc7\xbf\xd8\x37\x3f\xe9\xbe"
- "\x76\x4e\x25\x9d\xad\xbc\x65\xdd\x10\xc3\x43\x55\xcc\xd1\x75\xdd"
- "\x1c\x57\x77\x69\xf2\x1e\xe5\xec\xda\x41\xf2\xdd\xa3\xd4\xbd\x46"
- "\xae\x3b\x86\xf1\x77\xd6\xe3\x2b\xf9\x99\xda\xf4\x1c\x76\xad\x13"
- "\xfa\x97\x46\x4a\x8b\x75\x4f\xad\x55\xe4\xe4\x73\xd3\x99\xe2\x97"
- "\x1f\x97\xee\x59\x9f\x51\xe8\x00\xbe\x4f\xfe\xa6\xed\x8d\x83\x2b"
- "\xd7\x3d\x7c\xfd\x4b\x33\x8e\x0b\x32\x7c\x9f\x33\xe1\x17\xef\x79"
- "\x6f\x86\xcc\x8f\xe2\x14\x5d\xd5\xc8\xfd\xf5\xef\x90\xc7\xee\x0b"
- "\xa8\x97\x71\x60\xbd\x26\x3d\xf3\xdd\xeb\x35\x29\x61\x60\xbd\x26"
- "\xad\xbf\xb4\xf5\x9a\x14\x76\xfd\xb7\xaa\x5e\xe6\x81\xf5\xba\x77"
- "\xc2\x45\xd4\xcb\x37\xb0\x5e\xf7\x3e\x73\x69\xeb\x75\x6f\xf6\x05"
- "\xd4\x2b\x69\x60\xbd\x52\x22\xbf\x7b\xbd\xee\x3d\x38\xb0\x5e\x29"
- "\x13\x2e\x6d\xbd\x52\x92\x07\xed\x0f\x37\x57\x19\x85\x3f\x4c\x39"
- "\x32\x78\x7f\x98\x52\x3f\xd0\x1f\xde\x17\xd3\xef\x0f\x27\x9f\xfd"
- "\x4e\xfe\x70\xf3\x02\xb9\xaf\x31\xf9\x8b\x01\xfe\xb0\x6c\x41\x66"
- "\x68\x7f\x38\xf9\x6d\xee\x0f\x37\x2d\xc8\x1c\x5c\x1d\x26\xe7\xf6"
- "\xf9\xc3\x98\x05\x99\x1a\x7f\x38\xbc\xca\xd8\x5d\x3a\xb9\xe1\xbb"
- "\xf9\xc3\xc9\x0d\x03\xfd\xe1\xe4\x04\xad\x3f\x9c\x1c\xf6\xac\x2f"
- "\x1c\xc7\xa4\x87\xf2\x87\x19\xbe\x53\x4c\x60\xe3\x8d\xf4\xc1\x95"
- "\xe7\xbe\xb0\xfb\xbf\x23\xe6\x5b\xce\x9d\xd7\xf6\x96\x41\xe6\x15"
- "\x76\xfe\x0b\xc7\x86\x46\xec\x83\x18\xd7\xbe\x0d\xd2\xb1\x42\x90"
- "\x9a\xe3\x5b\xc1\x69\xf3\xc2\xb8\x3c\xc4\x84\x1d\x52\x9a\xab\x3a"
- "\xa1\x39\xfe\x18\xb0\xc8\xff\x36\xb2\x9f\x2e\xc9\x4e\x5d\x46\xd8"
- "\xbc\x7f\x95\xb3\xc0\x3b\x48\x6c\xde\x9f\xa6\x60\xb3\xd9\x87\xd8"
- "\x5c\x41\x78\x4c\x7d\xcf\xd9\x79\x5c\xc6\x66\xea\xb6\x3e\xfd\xd8"
- "\x05\x3e\x43\x62\x13\x6d\x42\x8b\xcd\xed\x0e\x81\xcd\xd4\xf9\x03"
- "\xb1\xb9\xdd\x11\x1a\x9b\xa9\x93\x05\x36\xb7\x3b\x06\x57\x87\x54"
- "\x43\x3f\x36\xb7\x3b\x34\xd8\xbc\x79\x49\x76\x77\x69\x6a\xf6\x77"
- "\xc3\x66\x6a\xb6\x52\xf7\x6a\xb9\xee\x28\x2f\x87\x16\x9b\xa9\x95"
- "\x61\x75\x58\xf2\x69\x2b\xfa\xc3\xe8\xe3\xd2\x03\x56\x3f\xf6\x69"
- "\x03\x25\xfe\xe4\x0c\x3f\xeb\xa6\x33\xda\x99\x34\x11\xd8\xca\xc4"
- "\xe8\x6e\x1c\x6f\x76\x77\x5b\x0d\x2c\xea\xd7\x35\xac\xd7\x04\x58"
- "\xf6\x58\xd6\x9d\x38\x1c\x65\x96\x80\xf7\x11\xd5\x2b\x20\x0e\x2f"
- "\x53\xb5\x2c\x57\xfc\x9d\xc4\x56\x9a\xa2\x36\xaf\x80\x31\xb1\x1e"
- "\x30\x60\x19\x70\x9c\x6e\x84\x58\x1f\xc4\xd1\x6f\x66\xaf\xb3\xd6"
- "\x9e\x01\x3d\xcd\x35\x06\x22\x31\x3f\x5b\x2c\x63\xf9\x89\x50\xbb"
- "\x0c\x68\xdc\x61\xaa\x95\xd8\x6e\xff\xca\x44\x89\x0d\xdf\xf1\x3b"
- "\xb6\xc6\xc2\xcb\x14\x48\x58\x52\x87\x18\xaa\x63\x45\x56\xca\x37"
- "\x95\xce\x0a\x66\x37\x2f\xd9\xc9\xba\x4d\x51\x9b\xce\xc0\x98\xda"
- "\x15\x90\x50\xb3\x02\x12\x59\x6f\xa2\x84\x32\xb0\xcc\x7d\xd9\x48"
- "\x7a\xb7\x30\x09\xf3\x5a\x81\x79\xa1\x2e\xfd\x1b\x31\x2f\x1f\xe6"
- "\x75\x0a\xf3\x3a\x89\x79\xd9\x31\x2f\xbb\xc8\x6b\x70\x32\x7f\xe0"
- "\xe0\xb9\xe6\x84\x33\xd6\x5e\x47\x7b\xd7\xfe\x39\xd6\x36\x2c\x9d"
- "\xe6\x87\xbb\xd6\x58\x07\x89\xf7\x07\xc3\x7e\xff\xb3\xe5\x23\x88"
- "\x67\x86\x6e\xeb\x8c\x57\xbf\x62\x19\xe8\x71\x5e\xfd\x08\xc6\x90"
- "\xcd\x35\x7b\x4f\xa0\x9d\x75\x5b\xbf\x48\xec\x1c\x6c\x5e\x75\xe1"
- "\xf2\x2a\xb5\xb3\x96\xde\x78\x1a\x2f\xee\x68\xdd\x22\x31\x5b\x4f"
- "\xfc\x9c\x96\xdf\x1e\xec\x81\x79\x36\x9a\x83\x66\x36\xf3\xb3\x60"
- "\x38\x2a\x4d\xcd\x2a\x3a\x44\xf3\x79\x0f\x25\x68\xe7\xf3\x1e\x4a"
- "\x07\x29\xad\x13\xa4\x87\xe3\x41\x7a\x64\x27\x20\x9d\xf6\x4a\x6f"
- "\xcb\x78\xef\x3a\x58\xe7\x63\x7f\xc6\x71\x6a\xfd\x66\x1c\x0b\x67"
- "\x8c\xd6\xb9\x1c\x2b\x68\x7e\x2b\xed\x4f\x28\xbf\xbf\x60\x1b\x14"
- "\x4b\xbf\x89\x5f\xde\x32\xb8\xe2\xb8\x94\xd6\x1e\xeb\x19\x96\xee"
- "\x8b\xde\xe1\xf5\xe1\xf8\xad\xd7\x54\x9d\x7d\xb6\x6c\xc7\xee\x5e"
- "\x1a\xcf\x2e\x20\x3f\xf0\xd0\x91\x58\x5d\x31\x8e\x5b\xfd\xc9\x8c"
- "\x99\x68\xce\xd6\x52\x85\x17\xe9\x9e\xeb\x3d\xea\x40\x1a\xe1\x83"
- "\xb0\x58\x2b\xc2\x8d\x84\xc7\x2d\x72\x9b\xed\x8e\xb8\x35\x9b\x6c"
- "\xc0\x8f\xe9\x8b\xfe\x04\xf1\xce\x36\x3f\x20\xa6\x2d\xf3\xfc\x06"
- "\xb2\x23\x8b\xe3\xd9\x3f\xc0\xb1\x3c\x90\x8a\xfe\x0a\x31\x88\xa1"
- "\x68\xb2\x87\x00\xda\x43\x46\x5b\xac\x17\xed\x3a\xb0\xee\x5b\x88"
- "\x25\x3f\x41\xfb\x22\x3b\x3b\x5d\x10\x38\x95\x38\x7c\xc7\x12\x88"
- "\xf3\x9d\xb2\x8e\x70\x9f\xb2\x5e\xf1\x66\x00\xe2\x86\xe7\x81\xb1"
- "\x7a\x09\x62\x77\x29\xda\xc7\x49\xb4\x8f\x4e\x61\x1f\x7d\x78\xfd"
- "\xd1\xaf\xf4\xf4\xcd\x0d\xb7\x8d\x8d\xb2\x6d\xac\x44\xbc\xae\xe8"
- "\xb7\x0d\xdf\xd2\x44\xa9\x5a\x62\x80\x65\x44\xb9\x3f\x18\x57\xbb"
- "\x6e\x18\xf9\xfd\x4c\x76\xdd\xdc\x54\x1a\x9b\x65\xf8\x98\xef\x63"
- "\xd4\xc5\x90\xd1\x92\x99\x6d\xda\xe1\xfd\x6d\x66\x07\xf4\x8f\xe9"
- "\xa6\x3e\xd9\x73\xed\x9c\x16\xf3\x13\xec\xd4\x51\x29\xad\x0d\xc3"
- "\x0d\xe6\xa7\x6e\x31\xa2\x1e\x9f\x14\x63\xc0\xa9\x59\x34\x47\xe0"
- "\x92\xd2\x76\x23\x2f\xa0\xf7\x12\xbf\xe3\x73\x92\x0f\xc7\x21\x2d"
- "\xf8\x51\xe6\xbe\xe8\x05\xd9\x81\xe8\x1d\x8d\x8e\x17\x7b\xb8\x6d"
- "\xf6\xa2\x0e\x8e\xe5\x82\x34\x0f\xb5\x8d\xbe\x21\x06\x7d\x02\xf9"
- "\x8c\x4c\xee\x33\x4a\x7e\x5d\x59\xe8\x62\x81\x8c\x9c\x08\x86\x72"
- "\x31\x38\x6d\x7e\x98\x9b\x07\x6c\xed\x09\x94\x91\xa7\x95\xfc\xcb"
- "\xf0\xc0\x4a\xe1\x43\x76\xa0\x7c\x62\x3a\xc1\xc8\x4a\xcf\x26\x7d"
- "\xb4\xae\x71\x88\x1f\x71\x4e\x7e\x24\x76\xbd\x2e\x12\x75\x35\xbc"
- "\x8c\xec\x1c\xed\x3e\x76\x3d\xf7\x6b\x5c\xb7\xbe\x95\x89\x37\xf4"
- "\xae\x4c\x34\xe3\x75\x9d\xe2\x6b\xe8\x2c\xae\x6a\xf2\x33\xa5\x0f"
- "\x16\x92\x9f\x71\xda\x5c\xe0\x43\x59\x0e\xa7\x76\x69\x65\x62\x3c"
- "\x97\xe9\x0b\x28\xd3\xe7\xc1\x30\xde\x0b\x3a\x2c\x97\x11\xcb\x0c"
- "\x4d\xd6\xa3\x40\x32\xf6\xa3\x1d\x91\x9c\x7b\xc9\x07\x21\xd6\xb0"
- "\x9f\x92\x3d\x7d\x91\x19\xbe\x48\xfc\x23\xd0\xde\x4a\x45\x67\xd9"
- "\xd7\x34\x27\xea\xb4\xf9\x80\xc5\xec\xf0\x32\x3e\x8f\x94\xb6\xe7"
- "\xb7\x99\x5e\x08\x8f\xe9\x47\xaa\xfb\x31\xfd\x48\x75\x3f\xa6\x1f"
- "\xe1\x6b\x50\xd4\xb8\x3e\x5b\x89\xb8\x8e\x56\xe3\xfa\xe1\x4f\xff"
- "\xa6\xb8\x9e\x31\x78\x5c\xbf\x79\x52\x85\xeb\x75\xff\x3b\xb8\xfe"
- "\x9d\x85\xe3\x3a\xa2\xf7\x5a\x8e\xd7\xbd\x4e\xdf\xcf\xc1\x25\x3d"
- "\x52\xa2\xe0\xf6\x37\xef\x13\x6e\xd3\x0f\xfc\xbd\xe2\xf6\x6c\x77"
- "\xa2\x19\xaf\x4b\x8e\x5b\xe4\x79\xc1\xb8\xfd\x9d\xa5\x07\x14\xf9"
- "\x11\x7e\x59\x49\xb7\xd5\x5c\x04\xf7\xa3\x9f\xc8\x8a\x5d\x7f\x1d"
- "\x34\x71\x19\x4e\xcd\x32\x3f\xc5\x02\xe8\x23\x86\x10\x9e\x7a\xec"
- "\x8c\x05\xa2\xdf\xb0\x16\xfd\x1e\x8c\x98\xc7\x6e\xa7\xef\x43\x88"
- "\xcd\xa3\x77\x3c\x0b\x92\x59\xcc\x08\xa0\x77\x41\x58\x1e\x3d\xbd"
- "\xff\xf1\x6f\x3c\x6b\xf6\xa3\x3f\xf1\x6f\xaa\xda\x1d\xd8\xf8\x7f"
- "\x52\x03\x31\xe2\x1d\x11\x8b\xf4\xa6\x76\x97\x4e\xcd\x52\xde\x5f"
- "\x84\xec\x9b\x44\x57\xed\x46\x7b\xd1\x1f\x93\x1e\x7d\x1c\xef\x12"
- "\x96\xe3\x04\xde\x23\xf0\xfe\x19\x95\x63\x70\xed\xdc\x54\x3e\xfe"
- "\x65\x65\x55\x7a\xd9\x0f\x6e\xe4\x36\x78\x2b\xc4\x1c\x97\x7f\x63"
- "\x79\xda\x95\xf7\x21\x7d\xf4\xfd\xf2\x28\xa6\xbc\x51\x26\x7a\xf1"
- "\x8e\x46\x3c\xab\xf8\xad\xe7\xcf\xa0\x8f\xc7\xfa\xe7\xd1\xbb\x54"
- "\xc4\x92\xae\x9b\x59\xef\x93\xef\x93\xf9\x3b\x1d\x94\x03\xf5\xf3"
- "\x64\x5f\x5b\x22\xf2\x7d\x74\x36\xb6\xc3\x2e\x75\xbe\xa1\xe4\xe1"
- "\x92\x1e\xb5\x85\x8b\x1b\x9c\x2c\x1e\x0d\xbb\xfe\x6b\x4a\xa2\x9f"
- "\x0d\x92\x97\x2b\x6c\xdf\x32\x7e\x4e\x79\x46\xbd\xdf\x11\xe8\xb5"
- "\xc4\x7e\x51\x78\x62\x90\xfd\x92\xc7\xc2\x8e\x7f\xfd\xd1\x6f\x14"
- "\x67\x8c\xbe\x0e\xfc\x55\x73\xca\x69\xae\x93\xfa\x5a\xcd\x89\x3e"
- "\xa0\xfe\xd6\x7b\x2f\xba\xa4\x5e\xec\x33\x0e\x47\x7b\x9c\xe1\xf9"
- "\x9c\x6d\x39\x8e\x7d\xd4\x95\x96\xd8\xcd\x2f\x42\x8a\xef\x94\x29"
- "\xea\xc7\xe8\x83\x7a\xd0\x1f\xf4\x9c\xb2\xc6\x36\xe7\x79\x21\x50"
- "\x3d\xa7\xdc\xe9\x6b\x84\x5a\xa4\x23\xff\x4b\xe5\x3d\x7b\xca\x32"
- "\xbc\x74\x09\xf0\x77\x1b\x8e\x05\xef\xa3\xff\x9d\x76\xcf\x90\xb5"
- "\xe8\x73\xd0\x67\x70\x3f\xfc\x1d\x7c\x70\xcf\x2b\xb7\x66\x4f\x9f"
- "\xcd\xbc\xcd\x6d\x7f\x80\xa2\x26\x30\x16\x2d\x87\x18\xe2\xef\xf4"
- "\x35\x09\xbf\xfc\x0c\xfa\x65\x7c\xae\x51\xf9\x65\x3e\xa7\x1e\xe4"
- "\x97\xa9\xff\xdd\xdc\xde\x01\xc3\x3d\x30\x6c\x86\x27\xd6\xbb\xce"
- "\xc3\x02\xd4\x1f\xa7\xf7\x28\x48\x33\x5c\xf1\xd1\x6f\x61\xbf\xa3"
- "\x77\xa9\xf0\xcf\xd5\xb2\x7f\x7e\xeb\xe4\xc5\xfb\xe7\xb7\xec\xe8"
- "\x9f\xb1\xbf\xf7\x26\xf9\x66\xf4\xcb\xbb\x8e\xb9\x25\x1f\xfa\xe2"
- "\xc1\xe9\x76\x7a\x5c\x38\xdd\xce\xc0\xf6\x93\x74\x4a\xd8\x69\xaa"
- "\xf7\xd1\x3b\xfe\x3f\xfb\x87\xbf\xde\x42\xed\x63\x0f\xb6\x8d\xef"
- "\xbd\xd8\x2a\x0d\xb7\xa1\x6e\xf3\x3e\x67\xbe\x7c\x4b\x2c\xeb\xb5"
- "\xc4\xf8\xcb\xde\x28\xf6\xf5\x9a\x0c\xbd\xbd\xa8\x5f\xf4\x17\xd8"
- "\x5e\x19\xdd\x6b\xac\x5c\x26\x81\x6b\xe7\x94\x07\x7e\x74\x4b\x39"
- "\xb6\x4d\xc9\x35\x27\x61\x22\xdb\xf4\xba\xdb\xb7\xe9\x75\x5f\xef"
- "\xa6\xd7\x3d\x88\xcb\xe1\xd8\x7f\x44\x9d\x9f\x75\x04\x36\x6d\x35"
- "\x06\x36\x6f\x6b\xf1\xc7\xbc\x51\xec\x8e\x79\xdd\x8b\xcf\x86\xc0"
- "\x1a\xc4\xc1\x6a\xc2\xc1\x17\x60\x9e\x41\xed\xf0\x8c\x07\x42\xe1"
- "\xe0\x4d\xfb\xe0\xda\xe2\xe9\x16\xc4\x41\x2b\xe2\xe0\xaf\x6a\x1c"
- "\x7c\x06\x3e\xbb\xdc\x46\x3f\x29\xb0\x80\x72\xe7\x63\x99\xbe\x76"
- "\xfa\x89\xdf\x86\xc6\x43\xdb\x85\xe1\xa1\xe7\x94\x16\x0f\x55\xdf"
- "\x11\x0f\xd8\xbe\x9a\x6a\x70\xdc\x74\xf6\x54\xa2\x54\x45\x78\xf8"
- "\x63\x3f\x1e\x3e\xf8\x1f\xb7\xd4\x3b\x68\x3c\x64\x84\x3d\xff\x2b"
- "\x34\x1e\xb6\x66\x5e\x24\x1e\x3a\xfa\xf1\xb0\x35\xcf\xb7\x69\x6b"
- "\x61\xef\xa6\xad\x05\xfd\x78\xf8\x96\xf0\x50\xde\x8f\x87\xad\x36"
- "\x7c\x2e\x19\x88\x87\xcc\xc7\xbf\x5f\x3c\x0c\x39\xfd\xaf\x81\x87"
- "\xc7\xc3\x8e\x7f\xc3\xe0\xe1\x22\xfd\x43\x62\xaa\x0a\x0f\xe8\x1f"
- "\xb6\xa2\x7f\xd8\xaa\xf2\x0f\x27\x10\x0f\x15\x2a\xff\xb0\x15\xfd"
- "\x43\x45\x08\xff\xf0\xc4\xfc\xef\x17\x0f\x97\x1d\xfd\xd7\xc0\xc3"
- "\xcc\xb4\xc1\xe1\xa1\xe2\x22\xfd\x43\x62\x65\x3f\x1e\x2a\xd0\x3f"
- "\x54\xa0\x7f\xa8\x50\xf9\x87\x23\x84\x07\x95\x7f\xa8\x40\xff\x50"
- "\x11\xc2\x3f\x64\xbd\xfc\xfd\xe2\xe1\xf2\x3f\xfc\x6b\xe0\xe1\xc9"
- "\xb0\xf3\xdf\x61\xf0\x70\xb1\xfe\xc1\xad\xc2\x03\xfa\x87\x0a\xf4"
- "\x0f\x15\x2a\xff\xf0\x19\xe2\x61\x9b\xca\x3f\x54\xa0\x7f\xd8\x16"
- "\xc2\x3f\x3c\xb5\xfe\xfb\xc5\xc3\x5d\xa5\xff\x1a\x78\x78\x3a\x67"
- "\x70\x78\xd8\x76\x91\xfe\x61\x74\x7a\x3f\x1e\xb6\xa1\x7f\xd8\x86"
- "\xfe\x61\x9b\xca\x3f\xac\x25\x3c\xa8\xfc\xc3\x36\xf4\x0f\xdb\x42"
- "\xf8\x07\xcb\x6b\xdf\x2f\x1e\x66\x3d\xf8\xaf\x81\x87\x67\x0a\xce"
- "\x87\x07\x05\x0b\x84\x0b\xc2\x42\x6f\x91\x05\x68\x9c\xf1\xde\x71"
- "\x81\x07\xc2\x01\xc7\x44\x97\x25\xd6\x8f\x58\xf0\xad\x41\x2c\xf4"
- "\x08\x2c\x90\x2c\x08\x0f\x34\xae\xa0\xf1\x04\x61\xc2\x8f\x63\x0a"
- "\x5f\x0c\x8e\x29\xd6\xeb\xe3\x08\x07\x3d\xd1\xe7\x19\x57\xf4\x00"
- "\x1f\xfb\xd1\x18\xef\xa4\xf4\xec\x9b\xa1\x70\xf0\xd6\x20\xe7\xf8"
- "\xfa\xc6\x97\x1a\x1c\x7c\xd1\x8f\x83\x67\xc2\x8c\x2b\x9e\x0a\x83"
- "\x03\xd7\x05\xe0\xe0\xe4\xc0\x71\xe6\xc5\xe2\xa0\x67\xa9\x8c\x03"
- "\x1a\x67\x06\xe4\x71\xe6\x02\x1c\x67\xc6\x0c\x16\x07\xb3\x0a\xbf"
- "\x1b\x0e\x2a\x32\x07\x87\x83\xc4\x4a\xea\x27\x08\x1c\x54\x14\xfa"
- "\x62\xb0\xaf\xa0\xc1\xc1\x39\xfa\x0b\x1a\x1c\xcc\x7e\xfb\xfb\xc5"
- "\x41\x50\x7f\xe1\x9f\x16\x07\x73\xc2\xee\xff\x1a\x40\xbd\x93\xbf"
- "\xa7\x79\x7b\xfa\x76\x63\xb8\x5b\xcc\x1b\xd1\x37\x1c\x5b\x96\x40"
- "\x02\xb5\x11\xfe\x95\x96\xd8\xb2\x93\x90\xb2\x71\x09\xe8\x7d\xf9"
- "\xa8\xff\x65\xa0\xef\x91\x00\x7a\xf2\xad\xb1\x07\xda\xdd\x62\x0e"
- "\xc9\xe6\x80\x5a\xa4\xef\x2d\x13\x73\x48\xfe\x2e\xcb\xf0\x8d\xa7"
- "\x81\xaf\x7b\x75\xcc\xfd\x09\xea\x76\xee\xda\x50\xba\xdd\x31\x08"
- "\x5f\xdf\xa3\xf6\xf5\x27\xb4\xba\x55\xfb\xf9\x2a\xbb\x6a\x0e\x69"
- "\x46\x98\x39\xa4\x0b\xd0\x29\x9f\xdb\x3f\x29\xfc\x7c\xdf\x1c\xd2"
- "\x45\xce\xf1\xf7\xa2\x8f\x7f\x4b\xd2\xfa\xf8\xef\xa6\xd3\x79\x96"
- "\x73\xcd\x3b\x92\x7d\x93\x5d\x2b\x36\xdd\xd7\xc6\x93\x1d\xa3\xbe"
- "\xcf\x96\xbd\x7e\x90\xb7\xf5\x6b\xfa\x6d\x9a\x6c\x99\xec\x9a\xec"
- "\x98\xb7\xf5\xb4\xcf\xef\x8f\x46\xd7\xd5\xa8\xe6\x8e\xfc\x31\xb2"
- "\x9f\x0f\xe1\xe3\x03\xe7\xf4\xf1\xd9\x21\xf5\xff\x8f\xe0\xe3\x09"
- "\x07\x8a\x7d\xff\xfd\xd9\xf6\xfc\xf0\xeb\xbf\x2e\x08\x07\x5b\xb3"
- "\xce\x8f\x83\xad\x99\x88\x03\x4f\x8d\x6a\xce\xc8\x1f\xb3\x15\xfd"
- "\xbc\x98\x33\x12\x38\xe8\x9f\x33\x0a\x04\xcf\x19\x69\x70\xb0\xe0"
- "\xd5\xef\x17\x07\x41\x73\x46\xff\xb4\x38\x78\xce\x7a\x91\x38\xb8"
- "\x00\x7f\xb0\x15\xfd\xc1\xad\xe9\x2a\x1c\xa0\x3f\xd8\x8a\xfe\x60"
- "\xab\xca\x1f\xf4\xcf\x15\x05\x82\xe7\x8a\x34\x38\xc8\xd9\xf4\xfd"
- "\xe2\x20\x68\xae\xe8\x9f\x16\x07\x0b\xf3\x2e\x0e\x07\x15\x17\xe0"
- "\x0f\x2a\xd0\x1f\xdc\x5a\x55\xa3\x9a\x23\xf2\xc7\xc8\xfd\xbe\x10"
- "\x7d\xbe\xc0\x39\xfb\x7c\xcf\x6f\xfb\x47\xed\xf3\xfd\x7d\xe3\xe0"
- "\x85\xb0\xef\x4a\x2f\x10\x07\x17\xe0\x0f\x2a\xc8\x1f\xb8\x55\x38"
- "\x40\x7f\x50\x81\xfe\xa0\x42\xe5\x0f\xfa\xe7\x86\x02\xc1\x73\x43"
- "\x1a\x1c\x58\xab\xbf\x5f\x1c\x04\xcd\x0d\xfd\xd3\xe2\x60\x51\xf1"
- "\xc5\xe1\x60\xdb\x05\xf8\x83\x6d\xe8\x0f\x6e\x4b\xab\x51\xcd\x09"
- "\xf9\x63\xb6\xa1\x3f\xd8\xa6\xf2\x07\xfd\x73\x42\x81\xe0\x39\x21"
- "\x0d\x0e\x5e\x7c\xf7\xfb\xc5\x41\xd0\x9c\xd0\x3f\x2d\x0e\x5e\x0a"
- "\xbb\xae\x42\xc1\x40\xdf\x1c\x00\xeb\xc7\x01\xd7\x7d\xbe\x25\xb6"
- "\x27\xfa\xf5\x83\xca\xf8\xbf\x6c\xc0\xf8\x7f\x74\x5d\xd8\x79\xa0"
- "\xa0\xf7\xcb\x7c\x6c\xb0\xf9\xf5\x16\x31\x4e\x78\xa3\x98\xf4\xff"
- "\xe3\xd5\x62\x9c\x68\x7e\x8a\xf4\x9f\x1b\x5a\xff\x83\x9d\x13\xcc"
- "\x41\xfd\xb7\x9f\x43\xff\x73\xc2\x8c\x13\x9e\xbd\x38\xfd\xd3\x7a"
- "\xc7\xde\x53\x97\x50\xff\xca\x9c\xe0\x11\x90\xde\xba\xa8\xf1\xe2"
- "\xe2\xb0\xfa\x0f\xb9\x9e\xa4\x5e\xac\x27\xa1\xb5\x24\xcd\x1d\x1d"
- "\xb0\xf1\x0c\x18\x87\xe7\x0a\x4c\xf0\x35\x25\x88\x89\xb2\xe3\x90"
- "\xe2\x13\x75\xeb\x5b\x53\x42\xfb\xa2\x0b\xbf\xe0\xe0\x6b\x4a\x94"
- "\xf9\x80\xbe\xf5\x24\x73\x69\x3d\xc9\x92\x8d\x17\x3d\x17\x40\xeb"
- "\x49\x0a\x50\xc7\x1e\xd4\xf1\xb7\xa4\xdf\x2f\x34\x76\xad\x99\x03"
- "\x08\xb7\x8e\xe4\x42\xe6\x75\xfe\x06\xeb\x48\xf8\x1c\xc0\x25\xb1"
- "\xe9\xa5\x61\xf7\x7f\x21\x3d\x92\x3e\x9d\x89\x3e\x3e\xaf\xab\xd8"
- "\xb8\xd3\xd6\x02\x1b\x7b\xc0\xa8\xcc\xff\x2b\x3a\x25\x7f\xcf\x10"
- "\x07\xec\x94\x25\x86\x74\xfa\xe3\x25\xe8\xe7\x97\xf6\xfb\xf9\xc0"
- "\xd0\x5b\xca\xab\x57\xa3\x7f\x5f\x0d\x13\xb9\x8c\x86\x6f\x6b\x11"
- "\xf3\x01\x6f\x14\x93\xbd\x93\x3d\xb3\x98\xad\x86\x5e\xd9\xde\x85"
- "\xbe\x9b\x80\xf4\xcc\xcf\xcf\x94\xf2\xd6\x92\xed\x91\xce\x87\xcb"
- "\x3a\xaf\x09\xa3\x73\xae\x6f\x9d\x91\xf6\xe2\xa0\xef\xcc\xfa\x74"
- "\xee\x7b\x45\x35\xff\xa3\xd6\xb9\x3c\xef\x13\x40\x5b\xbe\xa0\xf5"
- "\x43\x17\xa8\xf7\x4b\x36\xbf\x8f\x7a\xaf\x91\xf5\xde\x37\xbf\x7f"
- "\x51\x7a\x7f\x39\xfc\xf7\x2f\x1a\xbd\x6f\xcd\xbc\x04\x7a\xef\x18"
- "\xa8\x77\x1a\xff\x93\xde\xb7\x16\xd0\x38\x1f\xf5\x5e\xd2\x2b\xaf"
- "\x1b\x19\xa8\xf7\x65\xcb\xff\xf6\x7a\x1f\x72\xfa\x5f\x43\xef\xf9"
- "\x61\xf7\x3f\x0f\xd2\xfb\x25\xb0\xf7\xc4\xd4\x10\x7a\x97\xed\x7d"
- "\xab\x87\xc6\xf5\x2c\xa6\x42\xb6\xf7\x13\x21\xf4\x5e\xb0\xf8\x6f"
- "\xaf\xf7\xcb\x8e\xfe\x6b\xe8\x7d\x79\xd8\xf5\x1f\x5a\xbd\x57\x5c"
- "\x02\x7b\x4f\xac\x1c\xa8\xf7\x0a\xd9\xde\x2b\x0a\x68\x1c\x8f\x7a"
- "\x97\xed\xfd\x48\x08\xbd\xaf\x58\xf8\xb7\xd7\xfb\xe5\x7f\xf8\xd7"
- "\xd0\xfb\xca\xb0\xe7\xff\x06\xe9\xfd\x52\xd8\xbb\x3b\x84\xde\x65"
- "\x7b\xaf\xf0\xd0\xb8\x9d\xc5\x6c\x93\xed\xfd\xb3\x10\x7a\xb7\xcd"
- "\xf9\xdb\xeb\xfd\xae\xd2\x7f\x0d\xbd\xaf\x0a\xbb\xfe\x4f\xab\xf7"
- "\x6d\x97\xc0\xde\x47\xa7\x0f\xd4\xfb\x36\xd9\xde\xb7\x15\xd0\x38"
- "\x1d\xf5\x2e\xdb\xfb\xda\x10\x7a\x5f\xfd\xe4\xdf\x5e\xef\xb3\x1e"
- "\xfc\xd7\xd0\xfb\x9a\x31\xe7\x7b\x5f\xaf\xe8\x5e\x99\xb3\xe1\xef"
- "\x67\xb1\x7f\xaf\xe8\x9b\x70\x40\x3a\x27\x2c\xa8\x75\xce\xd7\xf0"
- "\x2c\x15\x6b\x78\xa8\xdf\xce\x70\x2c\xce\x86\xd2\xfa\x0d\x1c\x8f"
- "\xd3\xb8\x5d\xee\xc7\x33\x9d\x3e\x8e\xfa\xf2\xe1\xfb\xf1\x85\x53"
- "\x14\x7d\x7f\xd7\xb1\xdb\xf9\xf4\x1d\x3c\x26\xff\x7b\xd1\xb7\x7a"
- "\xfc\x76\x69\xf4\xbd\x36\xfe\xbb\xe9\xbb\x22\x73\x70\xfa\xae\xc8"
- "\x13\xfa\xe6\xeb\x34\x4a\xfa\xf5\x5d\x51\x20\xf4\x5d\x61\x0b\xdf"
- "\x9e\xaf\xbb\xf3\x6f\xaf\x6f\xed\x9c\xfc\x3f\xaf\xbe\x8b\xc2\x9e"
- "\xff\x41\x73\x30\xa4\x6b\xd2\xfb\x96\x17\x21\xe1\xc7\x2f\x8a\xb9"
- "\x15\xdf\x29\x13\xf9\x7c\x3d\xe9\x9f\xbe\xf1\x19\x8e\x18\xf8\x9d"
- "\xc5\x0d\x3d\xdd\x16\xa0\x6f\x79\x68\xdd\x45\xb3\xd5\x05\x4e\xdb"
- "\x6f\x61\xe3\x32\x30\x1e\xc8\x3e\x0d\x33\xea\x59\xaf\xb3\xcd\x41"
- "\xdf\x78\xeb\x1d\xab\x7f\x0b\x6c\x69\x62\xd4\x5c\x0f\x48\x27\xa5"
- "\xa2\x06\x5a\xb7\x31\xce\x83\x32\xa1\xef\x7d\x50\xe7\x1b\x4f\x02"
- "\x7c\x51\x00\x60\x7e\x9e\x74\x5d\x3c\x6a\xc8\xf2\x10\xdf\xf9\x0c"
- "\x66\x5e\x46\x3d\xf7\x1a\x42\xd7\x3b\xa4\x4b\xb3\x36\x43\x59\x97"
- "\xa1\x99\x97\xb9\xd8\xef\x2f\x2f\xd9\xda\x8c\xe2\xb0\x7b\x39\xd1"
- "\x7a\x1b\xd2\x27\xd9\xb4\x6f\xb3\x98\x97\x71\xda\x1a\x81\xd6\xd5"
- "\x90\x0d\xfb\xbb\x4c\x86\x35\x05\x68\xeb\xad\xc2\xd6\x7f\x7c\x1a"
- "\x69\xb3\x0f\x03\xe1\x43\xe8\xb6\x57\xe8\xf6\x34\xe9\xf6\x30\xb0"
- "\xfc\xc4\xa8\x93\xd2\xfa\x2a\xd2\x2f\xe9\xb5\xe8\x10\x18\xe7\xd1"
- "\xbe\x28\xe4\xe3\xd1\xbf\xa3\x9e\x93\x6b\x5f\x84\x89\x64\xff\xfe"
- "\x4d\xaf\x7b\x7c\x9b\xc4\x1a\x0d\xf2\xfb\xbd\xd1\x3b\xbc\xa5\xcb"
- "\x64\xfd\x3f\x4b\xfa\xb7\x87\xd4\xff\x8e\xef\x3a\xf7\x2e\xeb\xff"
- "\x3b\x7f\xd7\xf3\xbf\x65\xef\x4b\x2f\x95\xbd\xdb\xc3\xee\x89\xa2"
- "\xc5\x81\x98\xa7\x19\x1c\x0e\xba\x43\xe0\xe0\x95\x9d\x03\x71\xb0"
- "\x35\x0f\x71\xd0\xa1\xc5\xc1\xd6\x02\x81\x83\xad\x36\x8c\x2f\x19"
- "\x88\x83\x0d\xa3\xbf\x1f\x1c\x5c\xe0\xf7\x3c\xff\xf0\x38\x78\x55"
- "\x7f\x81\x38\xf8\x0e\xfe\xe0\x54\x08\x1c\xbc\xba\x2b\x04\x0e\xd0"
- "\x1f\x24\xa6\x06\xe1\x40\xf6\x07\x5b\xd1\x1f\x54\x84\xf0\x07\x3f"
- "\x9a\xf0\xfd\xe0\xe0\x02\xbf\xe3\xf9\x87\xc7\xc1\xbf\x87\x6d\xff"
- "\xb5\x38\xa8\xf8\x0e\xfe\xe0\xab\x10\x38\xf8\xf7\x3d\x03\x71\x80"
- "\x7d\x41\xec\x07\x6a\x71\x50\x21\xfb\x83\x0a\x1b\xf5\x0f\x07\xe2"
- "\xa0\xe4\x9e\xef\x07\x07\x17\xf8\xfd\xce\x3f\x3c\x0e\x36\x86\xfd"
- "\xfe\x37\x08\x07\xdf\xc1\x1f\x7c\x1e\x02\x07\x1b\xf7\x85\xc0\x01"
- "\xf9\x03\x77\x10\x0e\x64\x7f\x50\x81\xfe\x60\x5b\x08\x7f\x50\xfa"
- "\xc0\xf7\x83\x83\x0b\xfc\x6e\xe7\x1f\x1e\x07\x3f\x0e\x3b\xfe\xd3"
- "\xe2\x60\xdb\x77\xf0\x07\x45\x21\x70\xf0\xe3\x86\x81\x38\xd8\x86"
- "\xfe\x60\x74\xba\x16\x07\xdb\x64\x7f\xb0\x0d\xfd\xc1\xb6\x10\xfe"
- "\xa0\x6c\xea\xf7\x83\x83\x0b\xfc\x5e\xe7\x1f\x1e\x07\x9b\xc2\x7e"
- "\xff\xad\xc6\x41\x6f\xdf\x78\x61\x2f\xc7\x41\xe9\x6a\x81\x83\xb5"
- "\x84\x83\x0e\xb1\x7e\xa7\x4c\xc6\x41\xdf\x58\xa1\x3d\x18\x03\x9b"
- "\x1a\xfb\x30\xf0\x4d\xff\x58\xa1\x17\xf5\xcd\xe7\x83\xe4\x71\x82"
- "\x32\x0f\xc4\xc7\x09\x38\x4e\x2c\x3d\x2d\xeb\x9f\xcf\x09\x6c\x0e"
- "\xad\xff\x41\x8c\x13\x35\x6b\x34\x82\xf5\xff\x77\xfe\x9d\xce\x80"
- "\x79\x81\x43\x17\xbb\x36\x63\xcb\x05\xea\x5f\xe9\x17\x5c\xa8\xfe"
- "\xbf\x0a\xa1\xff\x2d\x21\xf4\x5f\x91\x27\xf4\x9f\x58\xa9\xf4\x07"
- "\x94\x79\x21\xde\x1f\x18\xa0\xff\xf2\xef\x49\xff\x7f\x9f\xdf\xe7"
- "\x5c\x7a\xfd\xbf\x16\x56\xff\x7e\xb4\x81\x6a\x29\xb0\xbb\x5c\x0a"
- "\xec\xc5\xcb\x81\x57\x23\x86\x0d\xc1\xb0\x16\x4a\x53\x2e\xc7\xf9"
- "\x4b\x81\xf6\x4e\x72\xc4\xea\xb2\x49\xde\x44\x33\x54\xa1\x89\x5d"
- "\x0f\xa9\x58\x37\x41\x27\x41\x31\x86\x3b\x62\xd6\xa7\x0e\x45\xfa"
- "\x46\x56\xfa\x68\x05\x86\x0d\x23\x5a\xb6\x5e\x6f\xe2\xf4\x3a\xbe"
- "\x77\xa6\x4c\xaf\xa3\xbd\xb2\x1c\x44\x8b\x74\x06\x99\x8e\xb7\x5b"
- "\x4c\x92\xa0\x76\x60\xd9\x22\x65\x1a\xda\xeb\xdf\xac\x2e\x63\x8c"
- "\x2e\x95\xf3\x92\xe9\xa2\xfc\xf6\x2f\xeb\x89\xd6\xbf\x5e\x9f\xa0"
- "\xa6\x63\x0f\x02\xf1\x55\xe8\x2e\x93\xf9\x25\x6a\xea\x7b\x03\x40"
- "\xcc\x7a\x33\xe7\x17\xd3\x29\x81\x5c\x3e\xc4\xc4\x54\x2b\xa7\xd7"
- "\xe9\xc7\x68\xe8\x87\x82\xba\x1e\x31\x6c\xe8\x98\x12\x99\x2e\x29"
- "\x20\x01\x3f\x73\x10\xc3\xf5\x6a\x59\xcb\xb4\xc3\x15\x39\xd2\x9e"
- "\x4e\xea\xfa\xfa\xb1\xfe\xd5\xa2\x8c\xb1\xfe\x1f\xdd\x56\x29\xd7"
- "\x25\x59\x9d\x2f\xd1\x61\xba\x09\xb2\x4e\x8c\x58\x8f\x94\x3e\x7e"
- "\x65\x0b\xea\x15\x3a\xc4\xec\xd5\xa8\x23\x87\xd3\x0a\x20\xd7\xfb"
- "\x72\x56\xfa\x58\xa2\x5c\xf7\x54\xad\x1c\x75\x2e\x45\x8e\xa8\xbf"
- "\x36\xa4\x1d\x81\x34\x69\x0a\x5f\xbf\x9d\xef\xa3\x25\xea\x6d\xf7"
- "\x5d\x41\xb8\x68\xea\x00\xa8\x11\xf5\xb9\x42\xe6\x99\x2e\xea\x6c"
- "\x84\xea\x3e\x5d\xeb\x29\xce\x21\xd3\xc5\xf1\xfa\x44\x3d\xb3\xcf"
- "\xaf\xd3\x4f\x1b\x48\x6b\x50\xd3\x5e\x29\x68\xa7\xcf\x46\xda\xcc"
- "\x81\xb4\x46\x35\xed\x48\x41\x9b\x91\x8b\xb4\x59\x03\x69\x7d\x23"
- "\x54\xb4\x57\x09\xda\xc7\x0b\x91\xd6\x32\x90\xd6\xac\xa6\x35\x09"
- "\xda\x59\x0d\x48\x3b\x7b\x20\x6d\xaa\x9a\xf6\x6a\x41\x3b\xb3\x0c"
- "\x69\xb3\x07\xd2\x16\xab\x69\xaf\x11\xb4\x4f\x56\x21\x6d\x4e\x30"
- "\x6d\x2d\xc7\x01\xdc\x20\xe3\xe0\xdf\x04\xed\xd3\xbb\x90\xd6\x1a"
- "\xa2\x6e\x11\x9c\xaf\xa0\x8d\x17\xb4\x8f\x15\x23\x6d\x6e\x08\x5d"
- "\xa8\x69\xaf\x15\xb4\x2f\xb5\x20\x6d\x5e\x08\x5d\xa8\x69\xaf\x13"
- "\xb4\xf3\xea\x90\xb6\x20\x84\x2e\xd4\xb4\xd7\x0b\xda\xf9\xf5\x48"
- "\x6b\x0b\x21\xdf\x7e\xda\xa8\xe7\x76\x23\x4d\x21\xca\xa4\x25\x84"
- "\x6c\xd5\x3c\x47\x09\x9e\x0b\xf7\x22\x7d\x71\x08\xd9\xaa\x69\x6f"
- "\x10\xb4\x2f\x38\x90\x76\xc3\x40\x5a\xd0\x55\x0b\xf9\xde\x2e\xcb"
- "\xf7\x46\x41\xbf\xa8\x11\xe9\x4b\x42\xc8\x97\xe2\x1d\xb2\xad\x25"
- "\x08\xda\x39\x07\x90\xb6\x2c\x84\x7c\xd5\xb4\x37\x09\xda\x35\x05"
- "\x48\x5b\x1e\x42\xbe\x6a\xda\x9b\x05\xed\xd2\x9d\x48\x5b\x11\x42"
- "\xbe\x6a\xda\x5b\x04\xed\xcb\x84\x9d\xca\x10\xe5\xbd\x41\x45\x9b"
- "\x28\x68\xf3\x2b\x90\xb6\x2a\x84\x2e\xd4\xb4\xa3\x05\xed\xda\x1c"
- "\xa4\xad\x0b\xa1\x0f\x35\xed\xad\x82\x76\x39\x61\x7d\x67\x08\x7d"
- "\xa8\x69\x6f\x63\x51\x2b\x37\xc8\x7e\xb1\x3e\x98\x16\x75\x2f\x7c"
- "\xa2\x1d\xc6\xb0\xa8\x55\x85\xf8\x9b\xe8\x76\x11\x5d\x1f\x3f\xbb"
- "\xef\x0e\xf2\x37\xb2\x0f\x1b\xcb\xa2\x16\xb7\xc8\xfc\x76\x0f\xc8"
- "\xdb\xae\x57\xd3\x8e\x63\x51\x9b\x72\x65\xda\x3d\x03\x69\x0d\x6a"
- "\xda\xf1\x2c\x6a\x7d\x8a\x4c\xbb\x77\x20\xad\xb1\x8f\x96\x45\xbd"
- "\x92\x86\x34\xfb\x6a\x64\xdf\xa8\x2a\xe7\xed\x2a\x7e\x13\x58\xd4"
- "\xab\xd3\x64\x7e\x8e\x81\xfc\xcc\x6a\xda\xdb\x59\xd4\x16\xa5\x9c"
- "\x0d\x03\x69\x53\xd5\xb4\x77\xb0\xa8\x7f\xcf\x92\x69\x1b\x07\xd2"
- "\x16\xab\x69\x27\xb2\xa8\x8d\xb3\x65\xda\x03\x03\x64\x4f\x76\x60"
- "\xc7\xbe\x80\xf0\x49\x77\xb2\xa8\x1f\xe7\xc8\xb4\x9a\x7e\x80\xaa"
- "\x1d\xbe\x4b\xe8\xbd\x28\x0b\xf5\xce\xf7\xeb\x45\x9f\xdf\x1a\xaa"
- "\x8f\x91\x77\x2b\x5c\x76\x5c\x7a\xcb\x24\xda\x24\xe5\xdc\xab\x1d"
- "\xdc\x2f\x06\xaa\xe6\xec\xce\xf0\x30\x9f\x3a\x6c\x8b\xc4\x5a\xc6"
- "\x7b\x40\xcf\xcf\x52\x89\xd9\xd1\xea\xc2\x70\xf7\xb5\x73\x5a\xba"
- "\x4b\xdf\x4a\x70\xe9\x6e\x6e\xa4\x7d\xfc\xf0\x77\x92\x0b\x5e\xd4"
- "\xd3\xef\x2d\x76\xe6\xa5\xfd\x2b\xfd\x9b\x17\xe4\x39\x03\x9d\xd8"
- "\x97\x63\x5e\xe4\xe1\xc5\xbe\x5c\x84\x19\xc7\x95\x45\x36\xd6\xe3"
- "\xb4\x75\xc2\x31\xe9\xad\xe5\x6c\xa9\x35\x05\xcb\x50\x8e\xf9\xe5"
- "\x1c\xc5\x67\x5e\x06\xec\x03\x61\x5b\x59\xe6\x58\x46\xfb\x88\xbe"
- "\xf5\xae\x3b\xa6\xaa\x9c\xbd\x32\xab\x23\x6f\x1d\x5c\x8f\xe5\xe6"
- "\x98\xe6\x7b\x0c\x9e\xb2\xde\x17\x88\x59\x50\x46\x7b\x0f\xb2\xca"
- "\xea\x3c\xb1\x2f\xe1\x5b\xfc\x6c\x47\x2c\x43\x0b\x8b\x9f\x53\x17"
- "\xe8\xd9\x50\x4c\xe7\xaa\x39\xd6\x1d\x87\xa3\xaa\x38\xf7\xd5\xd5"
- "\x7c\xcf\x42\xac\x53\x9d\xbf\xe4\xd7\xde\x80\xe1\xd7\x1e\x56\xf2"
- "\x7b\x70\xe6\xba\x40\x9c\xf9\xb2\x63\x3e\x1b\xfe\x8c\x33\x50\xf2"
- "\xeb\x36\x56\xd2\xe2\x76\x7a\x7a\x78\xf8\x51\x69\xc7\x18\xea\x5f"
- "\x76\x19\x9a\x1a\x59\x49\xd3\x01\xc7\x35\x3d\xd0\x2e\xed\xe0\x7d"
- "\x00\x0a\x67\x1b\x7f\x0f\x24\x9f\xc0\xc6\x16\x77\x84\x09\xf4\x5d"
- "\x91\x4d\x8d\xdd\xa5\x3b\xa6\x29\x67\x8f\x28\x79\x11\x5f\x97\xcc"
- "\x2b\xcc\xba\x8f\x58\xb6\x69\x41\x3d\xa6\x2d\xc1\xfe\x62\x8e\x90"
- "\xf1\x8e\x0a\xcc\x21\x4b\xfe\x5d\xe7\xd2\x49\x63\xe4\xdf\xbb\x5c"
- "\xba\x6b\x13\xe5\xdf\x7b\x95\x3d\x1d\x43\xef\x31\xb9\xa0\x10\x65"
- "\x5b\x11\xd8\x61\x31\x50\x5f\x97\xfa\xef\x2c\x66\x41\xa1\xf9\x3a"
- "\x3a\xaf\xaf\x2a\x13\xf3\xac\x10\xfb\xfb\x57\x5d\x89\xf7\x58\xf9"
- "\xee\x96\xef\x8c\x68\x38\x6e\xe2\xe7\x9a\x59\xd9\x76\x2b\xc9\x76"
- "\x9d\x9f\x05\x90\xef\x5e\x94\x93\xd7\x69\xeb\x90\xe5\x57\xf5\x00"
- "\xef\xf7\x93\xee\x50\xbf\x2c\xb2\xc5\xcb\xf3\xda\x54\x55\xae\x2e"
- "\x17\xd2\x40\xd2\x84\xdb\xef\x98\x78\xe7\x5d\x77\x27\xdf\x33\x7f"
- "\xc1\x73\x39\x0b\x9f\x7f\xc1\xba\xe8\xc5\x97\x72\x17\x2f\x59\x9a"
- "\xf7\xf2\xb2\xfc\x82\xe5\x2b\x56\xda\x56\xad\x26\xba\xbe\x3a\xec"
- "\x48\xd3\x79\x24\xc0\x7c\x1e\xa4\x7c\xf8\xb9\xd7\x14\x26\xf4\x5f"
- "\xb5\x53\x6f\x0e\xdd\xb7\x76\x22\xe2\xe9\x0c\x99\x4e\xa9\x5a\x47"
- "\xe7\xd9\x20\xce\x74\xce\xaa\x47\x1c\x74\xc6\x58\xbb\x54\xe5\x69"
- "\x76\x3f\xe2\xa0\x33\xee\xf6\x9b\x3a\x20\xe1\x06\x3a\x87\xac\xca"
- "\x45\xf1\xb5\x37\x03\x34\x60\xda\x50\x3c\x6f\x30\x82\x69\xeb\x48"
- "\xe6\xae\x18\xc9\x3a\x89\x7f\xc5\x76\xd6\xe1\x5e\x63\x85\xcd\xf8"
- "\x8c\x58\x37\x1e\x93\xaa\x3f\xdd\x1f\xcf\xcf\x6a\x8a\xaf\xd9\xce"
- "\xda\x37\x8c\x64\xed\xaf\x6c\x67\x9d\xb5\x23\x99\x2b\xa1\x02\xa2"
- "\xbb\x4b\xab\xad\x2e\xa9\xca\xc1\xed\x06\xe3\x03\x51\x55\xd9\x5b"
- "\x30\x6e\xbc\x0f\x22\x6a\xf1\x19\xc3\x3c\xfb\xcd\xa2\xdc\x1f\x9f"
- "\xf6\x0e\x41\x7e\xd3\x58\x6f\xae\x6e\x33\xe6\x23\xf4\x54\x7d\xa8"
- "\x01\x5b\x72\xcc\xcf\xed\xf4\x1e\x45\xec\x55\xb7\xd6\x9e\xe1\xf9"
- "\xc5\x3a\x2b\x3b\x81\xf8\x7d\xb4\xcc\x3b\x24\xff\x1a\xe6\x43\xda"
- "\xbd\x81\x35\xb9\x3a\xa4\xa9\x40\xde\x1e\x75\x7d\x12\x9f\x5f\x5c"
- "\x60\x5e\xb2\x3c\x37\x77\x74\x14\x24\xf2\xbb\xe6\x7c\xbc\x02\xda"
- "\x63\x76\xeb\x76\xd6\x80\xf5\x74\x60\x7d\x1b\x9b\xb0\x07\x8f\x98"
- "\x01\xac\x53\xf9\x31\xa9\x66\x2c\x86\xef\xc3\xdf\xfb\xb0\xec\x8d"
- "\xe2\x4c\xb5\x8f\x9f\x61\xa5\xd5\xed\x58\xce\x46\x3a\x67\x83\xf6"
- "\xa4\xed\x5a\x99\xa5\xc3\x7a\x57\x20\x5d\xa3\xf9\x1a\xb8\x09\xd3"
- "\x7d\x8a\xe5\xd8\x89\xbf\x89\x7e\x3e\xe9\x11\xe9\x1b\x44\xbd\x3e"
- "\x9e\x4a\xcf\x28\x2b\x47\xf5\x48\x56\xd6\x5d\x5a\x53\x4e\x7b\x6d"
- "\xf3\x33\x89\xf0\x19\xe5\xd2\x88\xb4\xe5\x5d\x45\x59\x3a\x1c\x0b"
- "\xea\x6a\xfb\x79\x66\x53\x99\xa8\x1c\x34\xbe\xfc\x1d\xf6\xe0\x02"
- "\xbd\x16\x18\xeb\x05\xdd\xef\xda\x01\xaa\xb6\xb3\x3a\xbc\xaa\xf0"
- "\xaa\xfc\x2d\xc6\xfd\x06\xaf\x46\x0c\x3f\x80\xf7\xdf\xe2\xfd\x37"
- "\x78\xe1\xf8\xd4\x44\xe5\xce\x2f\x64\x1d\xe3\x2b\xe1\x46\xe2\x8f"
- "\xd8\x7a\xfa\xa8\xf4\xd1\x6e\x2a\x3b\xed\x65\xcf\xa2\x6a\x83\xf6"
- "\xff\xae\xab\x04\x8c\xc7\xfb\x2e\x71\x57\x5f\x75\x38\x02\x7f\x3b"
- "\x4e\xfc\x7e\x7b\x36\x3e\x6f\x90\x7f\xe3\xe8\xf6\xed\xc2\xf3\x5f"
- "\xc1\xfc\xc2\x5d\x6f\x77\x5c\x38\xed\x85\x5c\x1f\x27\x5c\x18\xdd"
- "\x3b\x75\x20\xbd\xeb\x05\xe9\xa7\x49\xda\xf0\x9f\x1a\x44\xd8\xfb"
- "\x07\xc5\xf3\xfb\x2e\x71\xff\x20\x1a\x2f\x94\xd3\x2e\xe4\xbf\x2b"
- "\x5d\x84\xed\xca\xc2\x7b\x15\x5e\xf5\xda\xfc\x3f\xc6\xf4\x1f\xa7"
- "\x90\x3e\x7b\xe9\x7c\x37\xd4\xa5\x4b\xaa\xf1\x90\x8e\xb6\x08\x6c"
- "\xe9\x02\x8c\x87\xb9\x11\x5b\x55\xfd\xf8\xa9\xfb\x93\x16\x3f\x75"
- "\x2d\x41\xf8\x29\x27\x7f\x84\xe9\x52\x6a\x05\x5e\xf6\x75\xad\xc9"
- "\xc1\xe7\xba\x83\xc8\x67\x1f\xcd\x7b\x1c\x93\xde\xe6\x63\xa6\x2d"
- "\xc7\x71\xec\x69\x05\xbe\xef\x6d\xa7\xf4\xf6\x4d\x84\x59\xca\x5b"
- "\xce\x57\x94\x05\xcb\x87\x61\x75\x54\xbe\xa5\xc8\x17\x9f\x77\x22"
- "\x5d\x9d\x13\x4e\x2b\x65\xe3\x69\x4a\x5f\x44\x3c\xca\xe5\x25\x9e"
- "\x94\x8e\xf5\xd7\xcb\x4d\x69\xe4\xbc\x0f\x61\x38\x8d\x55\xe9\x9b"
- "\xa6\x08\xa7\xcf\x05\x84\x49\xba\x3b\x7d\x49\x68\x4b\xe9\x10\xe8"
- "\xb6\xc0\x78\x13\x24\xa1\xbd\x45\x1e\x95\xde\xde\x37\xae\x10\x92"
- "\x88\x1f\xf9\x75\x97\xf4\x76\x71\x2d\xd9\xa2\xe0\xf5\x7b\xaa\x07"
- "\xf1\xff\x6d\x1e\xf0\x7c\x6a\xa8\x3c\x18\xaf\xca\xb7\x82\xc6\xa2"
- "\x5b\x56\x8b\xba\x62\x5e\x3b\x31\xfd\x6e\xaa\x3b\xc9\x13\xe3\xf7"
- "\x1e\x93\x7e\x62\xa2\x38\x7e\x1e\x90\xa8\xcf\x4e\x3a\x33\x82\xe4"
- "\x41\xf4\x74\x66\xa3\xd8\xfb\xbb\x66\x32\x97\x1b\xa6\x27\x7d\x30"
- "\xcc\x83\x78\x14\xf9\x98\x8f\xa1\x3f\x7a\x67\xb5\x17\xfb\x16\xef"
- "\xbc\xa6\xd5\xcf\x4f\xf2\xd4\xfa\xc1\x74\xbb\x31\x7d\x03\xc3\x3a"
- "\x92\x3f\xc1\x3c\x63\xe9\x9c\x38\x0c\x2b\x0f\x94\x22\x8f\x15\x5e"
- "\x3e\x57\x83\x7c\xd6\x63\x59\xca\x89\x0f\x96\xa7\x41\xe6\xb5\xef"
- "\x57\x85\x5a\x5d\xcb\xfc\x76\x92\xce\xb9\x3d\xaf\xe6\x75\x42\xdf"
- "\xf5\xce\xe3\x35\x22\x6e\x2f\xd2\xec\x65\xbd\xe9\x40\x67\x30\x88"
- "\xb6\x84\xc7\xed\x29\x3a\xcb\xf5\xdb\x20\xfc\xda\x3b\x2f\xe7\xaf"
- "\x65\x1d\xfd\xe5\x7e\x27\x51\x39\xc7\x42\x2e\xf7\x1e\xca\x8f\xad"
- "\x9c\xcd\xdb\x56\xca\x83\xd2\xcb\xfc\xf4\xc4\x4f\x91\xd5\x38\x2c"
- "\x87\x90\xd7\x4f\x92\x31\x7c\x27\x61\x91\xcb\x0d\xfd\x68\x57\x11"
- "\x61\xf1\x9d\x31\x98\x7e\xdf\x66\x7a\x5e\x49\xcf\x3f\x71\x70\x1f"
- "\xdb\x17\xff\x93\x02\x8a\x77\xe2\x58\x7f\xcb\x4b\x88\xa5\x00\xc0"
- "\x8d\x71\x90\xe4\xb1\xf3\xba\xed\xf2\xac\x49\xd3\xed\xf7\x01\x50"
- "\x39\x51\x46\x7b\xb1\xac\x07\xd1\xf7\xf3\xb3\xfa\xd0\x5f\xef\x61"
- "\xef\x58\x80\xca\x8c\xfe\x4c\x2e\xdf\xce\x29\xb2\xee\xf7\x50\x1d"
- "\x49\x9e\xe3\x84\xef\xc3\xb8\x77\xbf\xa1\xb2\xf7\xd7\x7b\xa7\x59"
- "\x2d\x63\x5e\x6f\xd4\x03\xe9\x8b\xf4\xd2\xcf\xf3\x1d\xc2\x7e\x39"
- "\xf2\xda\x25\x9e\x05\x36\x48\xd6\xe5\x23\xd9\x01\xa2\xef\xa7\x7d"
- "\xf7\x19\x8a\x5b\x87\x79\x8f\xcf\xc3\x36\x1d\xed\x82\xce\x22\x41"
- "\xbe\xbb\xe8\x3c\x4e\xe4\x41\x67\x6c\xa2\xce\xdf\xfd\x90\xf0\x88"
- "\xcf\x07\xe4\x72\xef\xc2\xf6\x7c\x0c\x5e\x29\xfd\xf6\xff\x6e\xb5"
- "\x16\x5f\x3b\x83\xed\x9f\xf4\x5d\x1e\x28\x4a\x07\x8e\x87\x65\x60"
- "\x3e\x29\xbd\x7b\x8f\xdc\x76\xc8\xba\x7e\x77\xd3\x7e\xb4\x97\x7e"
- "\x1e\xef\xc6\x05\xe9\x7a\x2f\xc7\xe3\xca\x69\x3a\xaa\x33\xa6\xdd"
- "\x2b\xf8\xec\xe4\x75\xe6\x78\xb2\x73\x0c\x1c\x60\x2b\xb1\x9e\x7d"
- "\x38\xd8\x99\x27\xeb\xf9\x40\x90\x4c\x14\xdf\xb5\x8f\xce\x8c\x23"
- "\x9f\x84\xfd\xdc\xfb\xba\x7b\xfb\xfd\x12\xe9\x3e\xc0\x75\xff\xae"
- "\xa9\x56\xb4\xb7\xb2\xdf\xda\x29\xe2\x47\x6a\x30\x4c\x75\x9a\xce"
- "\xf1\x4b\x65\x29\x9a\x4d\x65\xd9\xcb\xcb\x51\x64\x06\x8c\x6b\xa0"
- "\xfc\x91\x57\xa6\x6c\xaf\x0a\xaf\x04\xe2\xf5\x0a\xfa\x2a\x2a\x13"
- "\xe6\xbd\x9b\xfb\xbf\x87\xa9\x6c\x3f\xbd\x49\x2e\x7b\xa3\xd7\x4e"
- "\x69\xdf\x36\x9d\x95\x78\xda\x46\xa4\x2b\xf3\x8a\x73\x65\xa2\x30"
- "\x7d\x3d\xed\xe5\x7f\x4c\x7a\x7f\x03\xf9\x68\x7a\x8f\x84\xbf\x17"
- "\xd3\x37\x9f\xe8\x53\xf4\xc8\xcf\x40\x18\x55\x70\xd1\x29\xbd\x3f"
- "\x87\xc6\x0c\x28\xeb\x5d\xd8\x47\xaa\x27\x79\x13\x96\xb1\x8f\x34"
- "\xb1\xbb\xf4\xa7\x65\x0a\x6e\x31\x9f\x2a\x92\xbd\xd0\xcf\x4f\x7f"
- "\x8f\x38\xde\xdb\x8f\xad\x9f\xfe\x5e\x96\x63\x3d\xca\xd1\x80\xf9"
- "\x3d\x2e\xd7\xab\x1e\xe9\xb1\x2f\xf6\xfe\x03\x72\xd9\xe5\x33\xeb"
- "\x7e\x7a\x42\xd1\x83\x6c\xab\x07\x36\x93\xff\xe5\x3a\xf8\xd9\x06"
- "\x39\xed\x4e\x91\xd7\xcf\x5e\x55\x68\xa9\x8f\x28\xce\x8b\xfa\xd9"
- "\xab\xe4\x07\xc7\xa3\xee\xb9\xef\xe3\x67\xd5\x8a\x30\xb2\x1d\x91"
- "\xc7\xfb\x63\x39\x0e\xb1\xdf\xd3\x8f\xa3\x9f\xcd\x0e\xf2\x4f\xe4"
- "\x8b\xcb\x9b\x91\x07\xf9\x53\xc2\x12\xf9\x54\x1a\xb3\x20\xbf\x89"
- "\xb2\xfd\xc8\x65\xfe\xd9\x6f\xb4\x58\x79\xff\x6a\xc4\xca\x58\x15"
- "\xef\xbd\xa1\xda\xb9\x5a\xe1\x03\xab\x44\x9a\xfa\x48\xb9\x6e\xbb"
- "\x44\xdd\xe4\x67\x92\xdb\x3a\x92\xdb\x7b\x4d\x2a\x39\xa2\xdc\xde"
- "\xbb\x47\xa6\xdf\x4b\xbe\xbc\xdf\x5e\xeb\x97\x2b\xb6\x3c\xd0\x5f"
- "\xbc\x37\x9a\xec\xa1\xbf\x5c\xf5\x99\x41\xfe\x62\x6f\x68\x7f\x51"
- "\x6f\x96\xeb\x5b\x17\x64\x1b\x3b\x45\xd9\xe5\xb6\x05\xf5\xd0\x8c"
- "\x63\x32\x71\x36\x52\xcd\x64\xf2\x9f\x94\xb7\xba\x0d\xaa\x11\x72"
- "\x95\x6d\xf9\xbd\x2b\x07\xea\xa1\xbe\x5d\x6d\xcf\xa4\x6b\xf2\x09"
- "\xc4\x83\x74\xca\xfb\x95\x18\x26\xf4\x5a\x4f\xfd\xdb\x72\xb5\x8f"
- "\x46\xda\x8a\x00\x23\x7b\xa9\xef\xd0\xda\x62\x7d\x96\x6c\x8b\x4a"
- "\xde\xff\x89\x3a\x4a\xea\xcf\xf7\xbd\xd9\x41\xf9\x92\x6e\x1a\x48"
- "\x0e\xa2\x8e\xef\xbd\xab\xb4\x69\x44\x8f\x69\x6d\x98\xa6\x3c\xa8"
- "\x7d\x2c\xa7\xf2\x61\x5e\x06\xee\xb3\xb6\x73\x5f\x61\xeb\xe6\xe5"
- "\x79\xaf\xa2\x56\x6e\x27\x30\x2c\x49\x0e\xcb\x96\xdb\x12\x05\x37"
- "\x43\x82\xca\xe4\x0e\xdd\x3f\xaa\x37\x28\xfd\x23\xce\x8b\xfb\xa2"
- "\xf7\x3c\x72\xfd\x28\x6c\xac\x08\xfb\xd9\x3e\x0a\xdb\x2c\xe4\x50"
- "\xc1\x78\x7b\xf5\xb3\x6c\xb9\xbd\x22\xfb\x92\x5c\xd2\x4f\x5b\xc8"
- "\xc6\xe8\xd9\x25\xbd\x9f\x4e\xfc\x9d\xc5\x3d\x34\x86\xa8\xc4\xb8"
- "\x5c\xf2\x07\xe4\x2f\x68\x6d\x2a\xbf\xcf\xe0\xf7\x6d\xe4\x77\xa8"
- "\x1f\x42\xf1\x48\x37\x9b\x7c\x11\x86\xbf\x67\x7e\x14\xfb\x05\x7f"
- "\x31\x20\xdf\xf7\xcb\xe4\xb4\x9f\xf1\xbe\xc2\x5f\xd2\x23\x94\x30"
- "\x25\x1d\xda\xfa\x62\x4a\x47\xe9\x15\xff\x45\xbe\xcb\x47\xbe\x89"
- "\xe7\xf7\x81\x4e\xc6\x38\x1f\x37\x28\xfd\xa2\x5e\x49\x45\x4b\x67"
- "\xca\x70\x9f\xf6\xc1\x34\xe1\xcf\x3e\x98\x4c\x69\xb9\xfe\xd0\x57"
- "\xae\x3b\xcb\xbe\xae\x5d\x06\xfa\x9a\xd3\xbc\x8f\x95\x22\xca\xf9"
- "\x41\xa5\xa8\xc7\x07\xf3\x79\x3d\x84\x4f\x2d\x17\x65\xa9\x49\xa9"
- "\xe9\xe1\x71\x6b\xa9\x2e\x14\xb7\x45\x15\xc7\x7a\x13\x29\xee\x4d"
- "\x5e\xae\xa0\x74\x81\x5e\xeb\x00\xfa\x5a\x71\x26\x30\xe1\x41\xf6"
- "\xbd\xbb\x4c\x72\x39\xff\xa8\xf8\x5d\x94\x4b\x0e\xf9\x5e\x1e\xf7"
- "\xbc\x4c\x33\x43\xbe\x73\xff\xbe\x6b\x88\x90\xab\x49\x92\xe5\x9d"
- "\x2b\xea\xb1\xeb\x6a\x3e\xce\xfe\x8b\x05\x65\xfb\x81\x4f\x91\xad"
- "\xfa\x37\xd9\x0f\xe6\x6f\xa4\x67\x8e\xfb\x42\x3e\x86\xad\x22\x1a"
- "\x2a\x93\x68\x23\xde\xf7\x04\xf7\xa9\x8f\x49\x1f\xbd\x46\xed\x92"
- "\xe8\xab\x7e\xf4\xb2\x3c\x07\x04\x8e\x65\x3f\xc1\x76\x61\xd7\x3e"
- "\xc5\xc7\xb0\xee\x74\x1c\xf3\x1f\xa5\x32\xf2\xf3\x30\xe8\x9c\x10"
- "\x35\x0d\xf9\xa7\x8f\x7b\x5c\x32\xcf\x5d\x95\x8a\xdf\x20\x5f\xd2"
- "\xec\x39\x2a\xf7\xe9\x3e\x4c\xaf\x91\x7d\xc9\x49\xe9\xc3\xa9\xda"
- "\x7e\xd8\x87\x53\xb5\x3e\xe3\xa3\x39\xc1\x3e\x03\xfb\xcd\x1b\xba"
- "\x4b\x3f\x8c\xd7\xf4\x03\x30\xec\xdc\xbe\x63\x97\x9b\x6c\x94\xce"
- "\x89\xe3\xfe\x89\xcf\x6b\x7d\xf8\x89\x52\x66\xf2\x9b\x5d\x6b\x94"
- "\xf9\x8b\x8f\xa6\x53\x5f\x2d\x28\xbf\x32\x8d\xef\xa4\xfc\x14\x7e"
- "\x7a\xa0\x73\xc6\x50\x0e\x34\xe7\xf2\xe1\x6c\xd9\xcf\xd7\x69\x7c"
- "\xa5\xdc\x86\x91\x9f\xd4\xb6\x55\x35\x93\xb5\x6d\xd5\x47\xf7\x0c"
- "\xf4\x91\x1f\x19\x2e\xbc\xad\xfa\xd0\x45\x7e\x4b\xf1\x91\x5a\x5f"
- "\xf0\x51\x74\x8d\xa6\x2f\xfb\x61\x85\xd2\x97\xed\xf7\xa3\x1f\x26"
- "\x90\x8f\xc2\xfc\xf7\xca\x79\x6f\x70\x49\x55\x25\x4a\xde\x2e\xd4"
- "\x73\xb3\x19\xb1\x59\x5a\xed\xc6\xdf\x56\xb9\x0f\xc8\x6d\xb3\x87"
- "\x9f\x49\xf4\x01\x9d\xe1\x14\x45\x38\x73\x2c\x39\x0d\xed\xfd\x6d"
- "\x45\x43\xd7\x52\x45\xbe\x1f\x5f\xa9\xee\x17\x56\x6f\x67\x25\x98"
- "\x4f\xa7\xba\x8e\x9b\x30\x6c\x8b\x3c\x87\xc0\x65\xcb\x79\x7d\xe4"
- "\xa8\xdd\xae\xad\x9b\xa8\xc7\x47\x1e\xaa\x07\x8d\x89\x30\xff\x3d"
- "\xd4\xef\xc1\x3e\x1f\xfe\xfe\x69\x72\x6d\x1f\xe6\xeb\xca\xce\xda"
- "\xd5\xfd\xab\x9a\x0a\xf2\x95\xf2\xd8\xb3\x11\xfb\x3b\x9a\x39\xb1"
- "\xe9\x0f\x65\x9a\xf3\x96\x2d\x5a\x52\xf0\xfc\xed\xe6\x45\x4b\x16"
- "\x15\x2c\x9a\x9f\xbb\x68\xf5\xfc\x82\x45\x4b\x97\x8c\x59\x3c\xff"
- "\x85\x45\xcf\x99\x57\xce\xcf\x37\x27\xd9\x6e\xb2\x45\x41\x3f\xe9"
- "\x24\xf3\xfc\xfc\xfc\xe5\x8b\x17\xe6\x98\x97\x2c\x7a\x6e\xec\xb2"
- "\x85\xf9\x0b\x0b\xcc\xf3\x97\x2d\x5d\xbe\x24\xc7\x7c\x53\xce\xb8"
- "\x9b\x92\xee\xca\x89\x52\xcf\xa1\xdd\x60\x84\xce\xc0\x99\x6f\x3a"
- "\xb6\x9c\x01\x43\xac\x2e\x6f\x59\xac\x6d\xd1\x12\x31\x6f\xb7\x7b"
- "\xce\xf8\x0a\xc8\xa3\x73\xe2\xe9\xcc\x63\x56\xfa\x71\x1e\xde\xf5"
- "\x44\x87\xf5\x34\xd3\x39\xf1\x58\xf6\xf8\xee\xd2\xdd\x66\x97\xb4"
- "\xc7\xc0\xcf\x33\xc6\x70\xac\x5b\x3c\x3b\xf3\x9b\x0e\xec\xb3\xe5"
- "\xd1\x3b\xf3\xda\x33\x10\x57\xbe\x02\xf4\x78\x45\xe3\x65\xa4\x73"
- "\xe4\x31\x4d\x96\x4b\xfa\x24\x4f\x9c\xfb\xb2\xdb\xe3\x8e\x6c\x6e"
- "\x61\x25\xcd\x2d\x42\x2f\xbb\xff\xaa\xcc\x35\x67\xbc\x0a\x19\x84"
- "\xcf\xa3\xd2\x6e\x37\xd7\x15\x62\x99\xe6\x6c\xbb\x7e\xf9\x60\x2a"
- "\xf6\x07\xdb\x68\xce\x15\xe3\xfe\xea\x91\x20\x1a\xcb\xa5\xdf\x5f"
- "\x98\x04\x5b\x31\xaf\x7c\x13\x63\x98\xc7\x5e\x65\x3e\x0d\xeb\x60"
- "\xc4\xba\xb4\xca\xf5\xd8\xc1\xeb\xb1\x9d\x25\x54\x8c\xc0\xf2\xbd"
- "\xce\xcb\xd3\xae\xd4\x01\xcb\xdd\x8a\x65\x4a\xc7\x72\x1a\xa9\x5c"
- "\xa1\xe6\xfa\x68\xbe\xeb\x98\xf4\xc9\xd8\xc0\x0a\x94\xdb\x75\xe2"
- "\x9c\xbb\x2d\x35\xc2\xfe\xb0\x5e\x39\xb5\xf8\x7b\xf3\x69\x88\xde"
- "\x44\x67\x94\xdb\xaf\x67\x4d\x1e\x1f\x38\xad\xad\x10\xbb\x8a\xb9"
- "\xd9\xff\xf3\x4d\x87\xa8\xd3\x27\x16\xf2\x0d\xbf\x78\xb1\x55\x4f"
- "\x75\xc2\xb6\x22\xba\xf6\x74\xd8\xb9\x45\xfd\xd6\x91\xcc\xc3\x76"
- "\xa8\xfb\x5c\x9f\xfc\x8a\x64\x42\xfd\xad\x2e\x3b\x9d\x6b\xfd\x49"
- "\x3d\xe6\x0d\x72\xdf\xd8\xc3\x7a\x67\xab\xfa\x52\x9f\x10\xce\x3c"
- "\x61\x78\x1b\x14\xde\x74\xf6\x39\xa5\x11\xfa\xff\xf9\x58\x4c\xe3"
- "\xee\xe7\xff\x73\x43\x30\x7f\xe2\x89\xbf\xdd\x4a\x3e\x62\x1c\xfe"
- "\x09\xf5\x09\xdc\x88\x65\x77\x98\xfc\x12\x5e\xdf\xce\x0e\x3a\x31"
- "\x7c\xcb\x59\xd0\x23\xed\xc1\xda\xed\x9c\xbf\xd5\x25\x7d\xcc\xcf"
- "\x12\x7f\x65\x24\xc0\x06\xa4\xe9\x2a\xfd\x04\x3c\xfc\x1c\xf2\x9f"
- "\xa3\xfd\x57\x0f\x98\xcb\x96\xf1\x3c\x29\x08\xcf\xa9\xaf\x53\x9f"
- "\xb0\x02\xf9\x23\x86\xb6\x7c\x0b\x34\xd6\x3e\x30\xae\x02\x12\x29"
- "\x1f\xfc\xdd\x42\xf3\x21\xc8\xb3\x55\xc9\x8f\x21\xfe\x37\x07\xc4"
- "\x1c\x8c\x8c\xad\x31\x34\x7f\x5d\x64\x63\x6c\x3f\xfa\x77\x2a\x23"
- "\x61\xac\xbb\xf4\x17\xd1\x0a\xa6\x10\xeb\x07\x39\xae\xe2\x20\x91"
- "\x95\xfe\xbc\xbc\x76\x04\xd2\x21\xae\x6a\x10\x4f\x84\x2b\xa4\x4d"
- "\x56\x30\x85\x58\x6b\x21\x3a\x2c\x43\xd4\xee\xd5\xa9\x7a\xf2\x91"
- "\xed\xd2\x2f\x3e\x24\x8c\xb1\x37\x1e\x6b\x65\x57\xcd\x6a\x15\x7a"
- "\xfa\xc5\x87\x4e\xaf\xd0\x41\xbf\xdc\x7f\x51\xac\x92\x7b\x0b\xe2"
- "\x38\x8a\xe4\x2c\xe6\xaa\x7f\xf1\x21\x96\xad\x85\xf7\xc5\xd7\xa2"
- "\x0e\x78\x5b\xf5\x8b\x5c\x4a\x2f\xcb\xf0\x40\xbf\x0c\x7f\xd1\x18"
- "\x4a\x86\x41\xb2\xd3\x8b\xb3\xce\x7f\x71\x90\x6c\x05\xd3\xf8\x94"
- "\xf3\xcb\x43\xe9\x12\xf3\xd0\xeb\x2b\xc0\x40\x79\x34\xc4\x11\xfd"
- "\x9e\x31\x4a\x1e\x5b\x50\xd6\xee\x22\xeb\x39\xf1\xdc\x50\x07\x40"
- "\x73\xe2\x94\x3e\x21\x8e\xe4\xbb\x27\xb7\x3f\x3d\xf3\x04\xa7\xbf"
- "\xe9\x39\x4d\x59\xf9\xc5\x4a\xf7\x14\x6f\x1d\x81\x38\xe2\xe5\xdd"
- "\xb3\xeb\x5c\xe5\x4d\x30\x8b\x76\xd2\x71\x03\xe1\x7b\xcf\x9f\x9c"
- "\xd8\x33\xa0\x30\xf9\xf9\x60\x17\xb6\x3d\xc1\xf3\xfb\xe1\xdf\x37"
- "\x7c\x7a\x93\xf6\x7d\xc3\xa7\x71\xe1\xde\x37\x68\xf3\xfd\x74\x3e"
- "\xe5\x1b\xa8\xcd\xd2\xf5\xe7\xfd\xe9\xb4\x40\x88\xbc\x95\xf4\xe3"
- "\xea\xd4\xe3\x99\x4f\x3f\xa1\x32\x34\x63\x3b\xc5\xfe\x2d\x4b\xc7"
- "\x90\x4f\x03\x6f\xc3\x3f\xdd\x2d\xfa\x2f\xd4\x2f\xfa\xb4\x9c\x68"
- "\x82\xeb\xd1\xf7\x67\x88\x23\xdf\x01\x67\xf9\xc3\x90\x87\xc1\x48"
- "\xf7\xeb\x13\x95\x68\x49\x43\x0c\x2c\xc4\x43\x34\x80\x99\xd3\x33"
- "\xfc\x13\x41\xf2\xb3\x9b\x3f\xe8\xfb\xe8\xfb\xe2\x2f\xe2\x2f\x52"
- "\x94\x97\xf3\xf3\x82\x4e\xce\x2f\x5d\x45\x91\x76\x8e\xd4\x0c\x94"
- "\x24\xa1\xfe\xa8\x97\x59\x9c\x35\x04\xf9\x59\x39\x31\x63\x3e\x99"
- "\xbf\xf2\xcc\xd4\xcf\x14\xa2\x7d\xc6\xbf\x88\xd9\xaa\x0c\xae\x8f"
- "\xc8\xe1\xcb\x9f\x6e\xac\xeb\x0b\x92\xea\x8c\xea\x2c\x8d\x50\x3c"
- "\x84\xff\x88\xa5\x7f\xbc\xc8\x2f\x11\xe3\xcd\x25\x7d\x04\x57\x78"
- "\xd6\xab\xc8\x7f\x27\x8a\x3f\xaa\xf5\x1c\x75\x1c\xec\xdf\x75\xaa"
- "\xdf\xd7\x8b\xdb\xa8\xca\x4b\xc8\xff\xdc\x7f\xe6\x96\x48\xe5\x67"
- "\x3f\x3c\x6e\x30\x87\x22\xed\x97\xff\x0d\xc5\x4a\x90\x1a\xa1\xfd"
- "\xf1\x37\xf9\xb4\xcf\xb7\xec\xd5\x3e\xdf\x6a\xb8\x04\x25\x07\x07"
- "\xfd\x53\xe4\xba\x1c\x75\x76\xb0\x2f\x30\x36\xc8\x64\x62\xcb\x83"
- "\x4c\xa8\xff\x4f\x2e\x4d\x04\x96\x67\xb6\x2a\x58\x1f\x9a\xfa\x6f"
- "\xf3\x77\xcd\x7a\xd9\x20\xae\x77\x1b\x07\x44\xde\x1f\x14\x46\xcf"
- "\x43\xcd\x72\xd8\x84\x5f\x0d\xa0\xe7\x61\x66\xd5\xb3\x2e\x15\xff"
- "\xa9\x43\xcf\x3a\xe6\x52\x94\xf5\x87\xbf\x7f\xc1\x3f\x1d\xd9\xc7"
- "\x0f\x7f\x7f\xa3\x3f\x26\x5a\x71\xf4\x44\xfc\x46\xff\xb1\x3e\x47"
- "\xc9\xe4\x08\x26\x07\x30\xf9\xc7\x25\x69\xc7\x7f\xf8\xfb\xe1\xef"
- "\x87\xbf\x1f\xfe\x7e\xf8\xfb\xe1\xef\x87\xbf\x7f\x82\x3f\x1d\x1f"
- "\x47\x30\xf9\x4f\xf9\x2d\xe2\x68\x08\xf4\x42\x26\x0f\x93\x74\xd0"
- "\x4f\x81\xc3\xed\x3b\x41\x67\x80\xa1\xfa\x4b\xd7\xcb\x33\xf7\x15"
- "\xe8\x02\x13\xd0\x77\x3f\x13\xf0\xba\x03\xaf\x7f\x53\x85\xdf\x70"
- "\xa9\x4a\x74\xd1\x7f\x3a\x14\x60\x04\x8e\x0b\x87\xc0\x50\x18\x06"
- "\x06\x88\x84\x28\xb8\x0c\xa2\x21\x06\x86\xe3\x78\xd3\x08\x97\xc3"
- "\x08\xb8\x02\xe2\xe0\x4a\x18\x09\x57\x81\x09\xae\x86\x6b\xb0\x26"
- "\xf1\x70\x2d\x8e\xed\xaf\x47\x81\x8c\x0a\x5d\x97\x62\x48\x35\xe1"
- "\x3f\xf8\x7f\x26\xa4\xf2\xe7\xec\x1f\xc2\xbf\xd7\x70\x87\x1c\xde"
- "\x22\x87\xbb\x7e\x08\xff\x5e\xc3\xcd\xff\xcb\xf7\x51\xff\xab\x77"
- "\x1d\xba\x6c\xe1\xb5\x75\x21\x7d\x65\x70\xa8\x4e\xfe\xeb\x7b\x86"
- "\xf3\xa4\x1f\xc0\x4f\x9b\x3e\xf8\x2f\x15\xaf\x89\xe2\x67\x11\x80"
- "\x98\xe7\x65\xea\x3f\x5f\xb8\x94\xca\xdf\xba\x7d\x78\x35\xe2\x75"
- "\x10\xaf\xff\x83\xd7\xff\xc5\xeb\x84\xc2\x47\xd0\xd0\xd4\xdf\x5f"
- "\xf0\xfa\xb2\x1e\xa0\xcd\x85\x57\x1a\xc0\x91\x42\x80\xff\x31\x02"
- "\x7c\x8d\x6d\xd4\x57\xbb\x01\x8e\xba\xfb\x79\x9e\xda\xd0\x5f\xba"
- "\x13\x62\x65\x37\xd7\xdf\x69\xda\xc7\x05\x91\xe4\x57\x68\xf7\x4e"
- "\xc9\x4a\x37\x4f\x18\x37\x71\xdc\x9d\x49\xe6\xb1\x99\x63\xcd\xb7"
- "\x27\x4d\x48\x1a\x9f\x34\x71\xfc\x84\xbb\xcc\x13\xee\x98\x74\x47"
- "\xd2\xa4\xa4\xbb\xcd\x8b\x57\x2d\x5b\x34\x21\xe9\x85\x85\xe6\xe7"
- "\x17\x2d\x5b\xbc\x72\xfe\xb2\x85\xe7\xab\xd1\x77\xfa\xa3\xe2\x5d"
- "\x1b\x00\xae\x01\xad\xb4\xaf\x07\xe9\x97\xd8\x1c\x37\xb7\x42\x5f"
- "\x8c\xae\x5c\x9e\x43\x4d\x94\x2f\xed\x9f\xee\xa5\x14\xd0\x59\x13"
- "\x40\xf7\xdc\x6c\xd0\xcd\x31\x81\xee\x49\x0b\xe8\x4a\x0f\x80\xee"
- "\xdf\xab\x40\x67\xdf\x07\xba\xc2\x6c\xd0\x15\x94\x0c\x0c\xab\x18"
- "\x23\xc2\x3e\xc1\xb4\xbb\xf0\x7a\x77\x17\xe8\xaa\x2b\x45\xd8\xbe"
- "\x32\xd0\xfd\x87\xed\x6f\x52\xf7\xef\xfe\x77\xa1\xfd\x85\x01\x7f"
- "\x2e\x8e\x29\x6a\xa5\xbb\xd2\x42\x4c\x8a\xfe\xf0\xf7\xc3\xdf\x0f"
- "\x7f\x3f\xfc\xfd\xf0\xf7\xc3\xdf\x0f\x7f\x7f\xe7\x7f\x6e\x1d\x4c"
- "\x3c\x2d\xe9\xe1\xbf\xb0\x57\xd4\x6d\x37\xc4\xbb\x74\xf1\x7c\x5d"
- "\x10\xd0\xb7\x52\x60\xe0\x7b\x9e\xd0\xa5\x5a\x7b\x12\xfd\x50\x35"
- "\x00\x7d\xeb\xb9\x75\x3b\x73\xd3\x77\x9c\x69\xef\x02\x34\x24\x00"
- "\xd0\xba\x16\xe4\x31\xdb\x05\x2f\x47\x8b\xb5\x4c\xcc\x43\xf1\xb4"
- "\x1e\x0a\xc3\x0b\x30\x7c\x43\xb8\xf5\x29\xca\x5a\x2c\xe2\x99\x36"
- "\x8a\x97\x65\x67\x10\x1f\xe2\xb1\x17\xc3\x7c\xe7\xe0\x11\xad\x94"
- "\xcb\x23\x81\x8e\xf8\x75\xd9\xc1\xe4\xb1\x3b\xae\xc4\xb4\x1e\xac"
- "\x4f\xa2\xbc\x96\xa8\x93\xd9\x21\xa2\xc1\xe6\xa3\x6f\x4a\x75\xc7"
- "\x20\xea\x6d\xbc\x4b\x78\xdf\x06\x62\xed\x27\xa5\x4b\x20\x1e\x98"
- "\x56\xd7\x6d\x8f\x4c\xea\x4b\x8b\xbc\xf9\x77\xe1\x10\xb5\xc8\x23"
- "\x39\x24\x41\x6b\x8c\x94\x69\x25\xa4\x9d\xad\xd0\x8a\x38\x69\xaa"
- "\x1c\x77\x19\xc6\xd9\xb4\x71\xfa\xd7\xe5\xb8\x68\x8c\xab\x08\x2a"
- "\x9f\xde\xd9\xe3\x83\x63\x10\xb9\x0b\xcb\x62\xa6\x6f\x98\x28\x8d"
- "\x4c\x7f\x39\xd2\x37\x68\x79\x01\xc8\x71\x23\x30\xce\xa5\x8d\xfb"
- "\x65\x92\x1c\x77\x15\xc6\xf9\xb4\x71\x3a\x25\x9d\xa9\xdb\x1e\x65"
- "\x0a\x51\x4f\xca\x5f\x27\xf2\xa6\x3a\x44\xa5\x20\x4d\x31\xd1\x64"
- "\x99\x8b\x81\x74\x45\x71\xfb\xeb\xfa\xf2\x27\x9a\x6c\x85\x8f\x0b"
- "\xd3\xab\x64\x8a\xb2\x8c\x2a\x54\xd2\xa7\x99\x89\x07\x70\x19\x12"
- "\x1f\x17\x44\xa6\x13\x1f\x7a\xc6\xdf\xf1\x54\x6f\xf9\xb7\x99\xea"
- "\xa7\x5d\xd3\xa3\x47\xb6\x43\xb0\x23\x3a\x14\xaf\x61\x06\x05\x03"
- "\xf9\x26\x16\x28\xba\x9a\xd6\x71\x1d\x4a\x0d\xd8\x19\x38\x6d\x5e"
- "\x30\x5f\x03\x45\x47\xe1\x32\x13\xad\x0b\xda\xbc\x1a\x0c\x45\x79"
- "\xcc\x4b\xdf\xde\x37\xbb\x3b\xa1\xc8\xcd\x3a\x68\xdf\xa5\x75\xdf"
- "\x82\x81\xf6\x4f\x5a\xf7\x32\x98\x1a\x0a\xff\x14\x72\x2d\x52\x80"
- "\xf6\x49\x8e\xa7\xb4\xed\xd0\x5c\xd5\x0e\x45\x55\xda\xb4\x45\xd7"
- "\x82\xa9\x89\xf6\x70\xb2\x43\x2c\x95\xa3\xc1\xec\x03\x5f\xd4\xa1"
- "\xd4\xc2\x37\x41\x5f\x34\x0a\xa4\xa6\x1c\x87\x52\x16\x17\x95\x65"
- "\xc3\x71\x30\xbc\xf3\x3c\x62\xe8\x38\x95\xf7\xeb\xd4\x8f\x57\x7b"
- "\xa5\xfd\xa6\x69\xb0\xdf\xd4\x06\x0d\xa6\xc9\xd0\x60\x4b\x83\xcd"
- "\xc7\x21\x7a\xbf\x37\x05\x1a\xf4\x0f\xa3\x8d\xa5\x81\xb3\x13\x7f"
- "\x9b\xfd\x48\xe3\xe1\xdf\x7d\x1c\x83\xcb\x5a\x2a\x5e\x04\x83\x4b"
- "\xf0\x44\xf9\x5e\xd6\xa6\x7c\xc3\x40\xcf\xa1\xea\x91\x7f\x35\x98"
- "\xb0\x7c\x1d\x58\x96\x7b\x8e\x42\xf4\x95\x09\x26\x48\xc2\x32\x0f"
- "\x73\x56\xfa\x40\x5f\x08\x91\x61\x6c\x2b\x8e\x7f\xff\x8c\xd8\xac"
- "\xd9\xce\x3a\x08\xa3\x5d\x6b\x2c\x68\xa7\xd1\xd3\x30\xef\x4e\x79"
- "\x5d\x60\x67\xd1\xdb\xa0\xef\x5a\x69\xa1\xf5\xd0\xed\x18\x67\x55"
- "\xe2\xe8\xbb\x6e\xfa\x5e\x7b\x7c\x1c\x9d\xa1\x97\x0a\x9f\xf7\x74"
- "\xd0\x9a\xc3\x4e\x5a\x07\x4a\xfc\x62\x6d\x10\x81\xf5\x19\x82\xe5"
- "\xb9\xa7\x16\xc3\x6f\x44\x3a\x4c\x5f\xef\x82\x3d\x49\x7c\x9d\xe2"
- "\x55\xb3\x3c\x81\xab\x66\x7d\x1b\x78\x63\x56\x17\x7b\x63\xd6\x69"
- "\xff\x1b\xb3\xfe\x5a\xb4\x0a\x0c\xfe\xab\x66\xb9\x9b\xf3\xb8\x0e"
- "\x8c\xcd\x79\x27\x68\xfd\xa0\x61\xed\x09\x30\xce\x7d\x19\x75\xef"
- "\x3b\x02\x6b\x17\x81\x29\x10\xf9\x95\x97\xce\xda\x9b\x5b\x08\x2c"
- "\x10\xe9\x32\x84\xaa\x5f\x57\xd4\xd7\xc5\xc2\x86\x0c\x58\xa7\x18"
- "\xb3\x4b\x6a\x4d\xa6\x7c\xdd\x91\xdf\x14\xe3\xb5\x01\xaf\x12\xbc"
- "\xca\x58\xd4\xd7\x65\x28\xab\xa2\xe1\xeb\x75\x40\xdf\x2d\x8c\x0f"
- "\x80\xee\x38\xc4\xa4\xd0\xf9\x0e\x61\xe4\x16\x1f\x28\xed\x76\xdc"
- "\x52\x0c\xeb\xba\xbb\xad\xf4\xfd\xb8\x9b\xfc\x12\xf9\x29\xcc\xa7"
- "\x04\xf3\xb1\x71\x5b\xdc\xce\x3c\x2c\xaa\xdb\x81\xe1\x1d\x9e\x35"
- "\x56\x9d\x7b\x8d\x55\xea\x8a\xea\xde\x8f\x34\xbb\x90\x66\xb7\x2c"
- "\xc3\x0e\xe2\x85\x36\xe1\x8e\xf1\x41\x04\xf2\xcc\xfb\x8f\x33\xad"
- "\xfa\xea\xed\xac\x0d\xe9\x0e\xf6\xf1\x42\xde\xc8\x07\xe5\x1f\xd3"
- "\xa1\x84\xa1\xac\xdb\x37\x21\x1d\xa5\x77\x7a\x53\xc9\x7f\xbb\x9c"
- "\xb9\x1d\xb4\x6e\x37\x8a\xf5\x8a\xfc\x90\x86\xbe\xe9\x74\xc7\x78"
- "\x61\x68\xb7\x1d\x32\x89\x37\xa5\x73\x76\x76\x00\xa6\xdb\xcf\x8a"
- "\xac\xe8\xdf\x60\x46\x37\xb3\xea\xe8\x1b\xfe\xfd\x98\x5e\xe4\x3d"
- "\x3c\x53\x29\x23\xe5\xc1\xbf\xe1\xa7\x72\x22\x1e\xf6\xe7\x7a\x21"
- "\xa6\x12\x22\x30\xdd\x4c\xe2\x47\xbc\x10\x07\x2e\xac\xeb\xfe\xfd"
- "\xb9\x6e\x08\x30\x0d\x4f\x97\xcc\xaf\x4e\xc3\x0f\xc3\x19\xf2\x23"
- "\xfc\x35\x60\x9a\x98\x3a\xce\xef\x89\xff\x08\x10\x3f\x2f\xe8\xcd"
- "\xbc\xbc\x4f\x11\x0f\xbe\x27\x06\xf2\x74\xac\x78\x10\x3a\x21\xd6"
- "\xe0\x2e\xb2\x46\xf0\xf5\x82\x98\xfe\xe3\x75\x1d\x43\x58\x97\x25"
- "\x62\x38\x5f\x2b\xf8\x20\xd0\xbe\x0d\x9d\x30\xfc\x1b\xd6\x65\x8d"
- "\x88\xe9\x04\x3d\x95\x99\xbe\x1f\xa2\x72\xaa\x75\xf9\xc4\x94\xa7"
- "\x26\xc3\x53\x69\x53\xd3\x26\xc3\xf4\x07\x1e\x9a\x0c\x49\xf7\x8c"
- "\x4d\xba\xe3\xee\xe4\x3b\x20\xf3\xe9\x27\x26\x43\xe6\x8c\xc9\x30"
- "\x13\xaf\xcc\x99\x53\x9e\x48\x9b\x32\x73\x32\x58\x1e\x9e\x8a\x4f"
- "\x0f\x4d\x9e\x90\xf4\xc8\xd8\xcc\x87\xa6\x4e\x81\xc7\xb3\x6e\x4f"
- "\xba\xfd\x76\x78\x60\xca\xb4\x09\x49\x49\xf2\x7d\x42\x12\x91\x3c"
- "\x9b\x3c\x65\xe6\xd8\xcc\x65\x4b\x0b\x96\x8e\x9d\x31\xf5\x21\x0a"
- "\x81\x29\x53\x26\xd3\x8b\x03\x15\x7e\x12\xfd\x67\xfc\x24\x67\x0f"
- "\x3b\x95\x4e\xfb\x35\x40\x0d\xea\x1f\xaf\x4e\xfe\x1d\x08\x18\x0f"
- "\xd5\x90\xde\xb8\x7f\x8d\xa5\x36\x4b\xdf\x6d\x8f\x75\xa1\xfc\xdc"
- "\x24\x3f\xda\x33\xe1\x18\x8c\x7c\x17\xe3\x46\xcb\xed\xc7\x90\x6e"
- "\xbb\x11\xb4\xf1\x23\xd0\xbf\xc6\x8e\xa7\xef\x0a\x9c\x78\xa1\xcc"
- "\x3d\xe8\x07\x51\xb6\x6e\xe8\x2a\xb2\x0c\xe1\xdf\x75\xa2\xbe\x69"
- "\xbd\x2d\xa6\x4d\x51\xd9\x7b\x3b\xad\xcb\x35\xaf\x86\x88\x93\x60"
- "\xbc\xb2\xb9\x20\x95\xbe\xbd\x01\x67\x81\xcc\xe3\xdb\x3e\x1e\x51"
- "\xf2\xb7\xa1\xae\x1a\x5a\xf3\x2c\xf8\x6c\x50\xf9\x06\x17\xf1\xd9"
- "\x8c\x71\x32\xaf\x67\x9a\xd1\x47\xa0\x0f\x7f\x34\x50\x94\x08\x2c"
- "\xea\x50\x7a\xa0\x37\x91\xb7\x0b\x98\x6e\x9f\x82\x69\xcc\xdf\xd3"
- "\x80\x79\xb2\x77\xd2\x75\xb4\xfe\x94\xaf\x45\x85\xd8\xc6\x0a\x5a"
- "\xa3\x1d\xf5\x4d\x39\xff\xe6\x9a\x87\x5d\x6e\xf0\x97\xe2\x73\xe9"
- "\x37\xaf\xb1\x22\xf1\x2d\x35\x86\x45\xe2\x73\x39\xea\x3b\x02\xf1"
- "\x02\xfe\x53\x18\xbe\x04\x22\x30\xfc\x37\x28\xeb\x56\x4e\x7f\x8a"
- "\xa7\x1f\x86\x61\xef\x21\xbf\xd7\x02\x51\xdf\xbc\x8e\xf8\xa1\x30"
- "\xec\x2b\x5c\xbe\x09\xd3\x6f\x25\x9f\x27\xfc\xf0\xc8\x2f\x40\x7c"
- "\x67\xe2\x16\xfc\xe5\x67\xda\xa3\x62\x9d\x78\xde\x8f\x72\xd9\x8f"
- "\x2d\x57\x43\x21\xf5\x6f\x2e\xc7\xfa\xc7\x58\x44\x1b\x39\xb2\x81"
- "\x68\xe9\x9b\x78\x16\x7d\x97\x03\xf9\x56\x38\x56\x77\xf2\x7d\xff"
- "\x5c\x70\x79\x6a\xa0\xc8\x0a\xaa\xba\x8c\xa1\x72\x60\xb9\xf5\xdd"
- "\xbd\x56\x6c\x33\x2f\xe7\xfb\xb8\x61\xd8\x6b\x72\xd9\x88\x26\x9e"
- "\xca\x4f\x7e\x02\xf5\x3a\x11\x75\x1e\x89\xf9\x79\x82\x74\x6e\x24"
- "\x79\x60\x79\x5b\x03\x78\x47\x3e\x26\xb6\xd2\x8a\xe5\x02\x89\xe4"
- "\xe1\xea\xe7\xe1\x11\x98\x1a\x31\x31\x08\x53\x1b\x91\xf7\x64\x55"
- "\x7c\x56\x50\xfc\x62\x8c\x7f\x50\x8e\x47\x7b\x1d\x51\x10\x94\x7f"
- "\x39\xc6\x3f\x4c\x3a\x44\x7b\x8c\x70\x81\x71\x57\x0d\xf5\x27\xfb"
- "\xe9\x77\x06\xd1\x3b\x90\xfe\x51\x5a\x7f\x4f\x6d\x05\xd1\xd7\xca"
- "\xb8\x47\x7a\x03\xd2\x1f\x0c\xca\x7f\x3a\xd2\xcf\x54\x95\x2f\xa8"
- "\xfe\x57\xec\xc3\x78\x0b\xe1\x14\xef\x39\x48\x33\x8c\x7c\x00\xf9"
- "\x9f\xfd\xb9\xa4\x9f\x2b\x12\x82\xe8\xd3\x90\xee\x25\x92\x33\x97"
- "\x51\x17\xc9\xc8\xa8\xf4\x6d\xda\x44\x19\xae\xb0\x04\xa5\xb1\x61"
- "\x9a\x7c\x92\x2f\xc7\x59\x77\xc8\x34\x65\x41\x69\x76\x71\x9c\x8a"
- "\x7c\x64\x1d\x8b\x34\xb2\x6f\x53\xf3\xa0\xba\x61\x7f\xeb\x8a\x16"
- "\x2d\x8f\x2b\xb1\xcf\x16\xbb\x66\x93\xf0\x19\x97\x21\x26\x6e\xc7"
- "\xb0\x6a\xe4\xb9\x8d\x70\x84\x76\xe6\x71\xba\xbd\xe8\x7b\xd3\xa3"
- "\x05\x76\xe3\x26\xc4\x16\x02\xfd\x1e\x4b\xbf\x89\x37\xeb\x9d\x26"
- "\xdb\x53\xdc\x04\xbc\x53\xb8\xd8\x27\xd1\x46\x71\x8f\x05\x04\xcf"
- "\xb8\x27\xd1\xde\x25\x7c\xf6\xcb\x79\x6c\xa3\xef\x97\xb1\xfc\xaf"
- "\xa3\x5f\x07\xfa\x06\x1b\xc3\x27\x62\xf8\x26\x39\xfe\x55\xa2\xc7"
- "\xdf\x13\xe4\xdf\x3a\xc4\xd8\xeb\xb2\x9d\xa1\x4d\x5d\xb9\x96\xe7"
- "\x8d\x76\xa5\xa4\x0f\x08\xdc\x3f\x84\x71\x8b\xf0\x3e\x15\xef\x4f"
- "\xe2\xfd\x71\xbc\x4f\xa0\x3d\x27\x8a\xfc\xdc\xbe\xe8\xf9\x5a\xbc"
- "\x3f\x81\xf7\x48\xbc\xcf\xc4\xb2\x7d\x8b\x72\x2f\x77\x23\xa6\x83"
- "\x30\xd3\x89\x3a\x24\xbb\x1f\x26\x74\x18\xd7\x4e\x79\xfa\x15\x5f"
- "\x70\xaa\x3f\x4c\xf6\x0f\xb2\x3d\xc8\x61\xbd\xe9\x24\x97\x4c\xe4"
- "\xef\xa0\xfc\x99\xe0\x35\x44\xe8\x49\xd0\x04\x44\x3a\xbd\xd0\xb7"
- "\x1c\x26\xe8\x74\xea\x3c\xf1\x5e\xb1\xce\xc3\x18\xde\x8b\xf9\x7e"
- "\x15\x70\xe5\x06\x94\x89\x1e\x9f\xb3\x48\x4e\x9c\x9e\xf3\xbd\xc2"
- "\xad\xd2\x37\xf6\xef\xaf\x74\x04\xe9\x9b\x30\xbc\x89\xeb\x1b\x65"
- "\xa7\x94\x99\xca\x8f\x98\xa6\xb6\x72\xa8\x82\x1b\xc4\x77\x67\xbf"
- "\x8d\x8d\x34\x04\xd9\x4c\x02\xf2\x79\x8d\xf0\x31\x3c\x4f\xb6\xc9"
- "\x91\x7d\xf4\xd8\x6e\x8c\x4c\xd6\xd2\x1b\x11\xab\xc7\xb1\xbc\x57"
- "\xec\x92\x7d\x9d\x27\xa2\x90\x30\x3d\x12\xfb\xff\x4d\xed\xbc\xdf"
- "\x56\xfa\xcd\x76\xe2\xe3\x29\xe2\xfb\x01\x79\x22\xf2\xc8\x16\x47"
- "\x16\x2b\xf1\x3c\x2e\xd2\x9b\x4a\x65\x8f\xc8\xe5\x71\x55\x2e\x84"
- "\xa2\x12\x07\xe2\x3b\x33\x4f\x44\x01\x8f\xdb\xdb\xcf\xf7\x90\x55"
- "\xe6\x1b\x11\x72\x8f\xa7\x92\x43\x96\xb1\x00\xd2\xad\xc5\x30\xc4"
- "\xe9\x3b\x08\x19\x3e\xe6\x1f\x5b\x0c\x91\x4e\xdf\x2e\x18\x0d\x70"
- "\xb9\xd3\xd7\x06\xb7\x02\x8c\x72\xfa\x2a\xb0\x1f\xb0\x93\xe2\x3f"
- "\xbf\x05\x74\x3a\xbc\x17\xdd\x5c\x2c\xe9\x9c\xbe\x02\x48\x28\xd6"
- "\xe3\x3d\x17\x1e\x1e\xc2\xba\x9d\xbe\x69\x48\x97\x03\x19\x7e\x76"
- "\x2a\x6d\x08\xfb\x6a\x9e\x1f\x8c\xd3\x5e\x65\x45\x4e\x1f\xf6\xc9"
- "\x7d\x07\x30\x3c\xc0\x32\xfc\x67\xf1\xea\x66\x81\x92\x43\xd6\x0c"
- "\xff\x29\xf6\xd0\xab\x9f\xe3\xf3\x57\x8c\x49\xc0\x9c\xbe\x14\x68"
- "\xf6\x78\x90\xae\x88\xb1\x8d\x87\x2c\x73\xbf\x95\xa0\x97\xf6\x5f"
- "\xda\x78\xc8\x8a\x75\xb1\xf5\x62\x3d\xb0\x9d\x5b\xd9\xbb\x06\xef"
- "\xa5\x87\x56\xf0\xe7\x92\x43\x25\xcc\x70\xc8\x36\x0e\x07\x38\x54"
- "\x07\xa7\xaf\x1d\xe6\x61\x17\x3d\x63\x95\x9b\x51\xf9\x87\xaf\xa7"
- "\xf1\x4d\x0a\xed\xdd\x10\x9b\xb1\xaa\x88\x61\x9c\x81\x45\x1e\xb2"
- "\x39\x7d\x9d\x80\x79\x94\x20\xbf\x57\x39\xbf\x92\x43\xf5\x48\xeb"
- "\x26\x3a\x35\x1f\xe2\x41\xb4\x19\x7e\x88\x45\xfa\xfa\xde\xc8\x43"
- "\x95\x78\xed\xc5\xab\x03\xd3\xf6\x30\x7b\xdc\xaf\xe8\xfb\x5b\x56"
- "\x72\xd8\xc0\xa2\x0e\x9b\xbc\xb4\x57\x14\xc9\xd2\x0f\xc3\xd8\xc6"
- "\xc3\xa8\x67\x48\x43\x7c\x62\x79\x0f\x27\xf3\xf2\x96\x1e\xbe\xdb"
- "\xcb\xeb\x71\xf8\x2e\x51\x8f\xc3\x77\x52\x78\x17\x62\x07\x7f\x5b"
- "\xba\x44\xdc\xd3\x98\x2e\x8b\xa7\x2b\x39\x6c\x61\x86\xc3\x56\x2f"
- "\xda\x1d\xca\xb5\x98\xe4\x88\x72\x2d\x26\x59\x22\x7f\x8b\xd3\x56"
- "\x06\x2c\xf2\xb0\xb5\x37\xf2\xb0\x0d\xd3\x97\xf6\xf2\xbe\xc0\xe1"
- "\x4a\xaf\xe0\xfd\x06\xf2\x99\x8d\xb8\x8e\x40\x1e\x95\xc8\xab\xbe"
- "\xd7\x6e\x86\x8c\x55\xcc\x9b\xe1\x5b\xef\x9b\xb7\x0a\x22\xc6\x40"
- "\x31\x96\xf7\x33\x94\x51\x0e\xd6\xb3\x01\xef\x69\x18\x0f\x57\x60"
- "\x5e\x9f\x23\xdf\x4a\xca\x0f\xf3\xa9\x47\x9e\xef\x22\xaf\x1c\x2a"
- "\xd3\x59\x3b\x18\xf1\x79\xef\x59\x51\xbe\xd6\x40\xc9\x61\x6f\xc0"
- "\x70\xb8\x43\xc1\x10\xe1\x47\xc8\xad\x02\x66\x78\x98\xcf\xe9\xab"
- "\x06\xc4\x98\xb1\xd9\xd3\x46\xf1\x38\x06\xd9\x85\x7a\x26\x4c\x15"
- "\xe0\x7d\x27\x10\x7e\x9a\xf3\x5e\x25\xda\xcf\x09\x43\x33\xf2\x3c"
- "\xeb\xc7\x42\x9e\x0e\x9f\x8b\xe6\xf9\x0c\x30\x37\x4f\x5f\xec\x2f"
- "\x39\xdc\xd8\x9c\x47\x7a\x39\x88\x69\x28\x5d\x2e\xc4\xea\xb0\x1f"
- "\xae\x63\xbe\x58\x9b\x5b\x1f\x63\x2d\x62\xcd\x9e\x69\x48\x9b\x07"
- "\x54\x1f\xc2\x11\xd1\x4f\xef\x64\x2e\xbf\xe1\x4b\x1b\xd5\x8d\x0d"
- "\x2f\x86\xa6\xce\x3b\x81\xc6\x42\x4d\x9d\x3b\x09\xa7\x01\x66\xf8"
- "\x32\x1d\x31\xda\x3b\xbd\xb3\x78\xc8\xdc\x6f\x41\x87\x61\xfe\x26"
- "\xeb\x2e\x8c\x6f\x40\xba\x03\x1c\xb7\x33\xbe\xf5\xc5\xfa\x0c\x87"
- "\xf7\xfa\x4a\xbe\xb4\xcc\xf8\xb6\x97\x35\x59\x2b\x60\x4e\x67\x31"
- "\xca\x6a\x17\x4c\x3f\xe1\x8b\x68\xce\xcb\x41\x9a\x6e\x0c\xdf\xc9"
- "\xf1\x3f\xfd\x44\x17\x9b\xf1\x32\x3b\x35\xe3\xdb\xaf\xd8\x74\x2b"
- "\xfb\x7c\x9e\x0d\x86\x5f\xb6\x9e\x05\xc8\x2e\x0e\xb4\xef\x82\xcb"
- "\xda\x68\x6f\x9e\x34\x98\x36\x3f\xc0\xa6\x9f\x38\xc5\xe6\xbe\x4c"
- "\xb2\x49\x81\x26\x2b\xda\x8f\xad\x82\xe4\xdd\xda\x64\xdd\x87\xf9"
- "\xa7\x21\xdf\x22\xe6\xb4\x55\x23\xad\x23\x76\xce\x09\x23\x1c\x68"
- "\xaf\x00\x5f\xe4\xe1\xbd\xfe\x8d\x87\x1b\x03\x91\x87\x3b\x02\x1b"
- "\x0f\x7b\x59\xe4\x97\xe9\xbe\x8d\x5f\x5a\xfc\x91\x5f\x22\x06\xbe"
- "\x6c\x44\x3d\x45\x92\xce\x7b\xec\x60\xc6\xe7\x5f\xf7\x90\xfe\x4b"
- "\xbe\x6c\xc5\xba\xd2\x7e\x7b\x4c\x60\xff\xcb\x56\x1a\xdf\x63\x5a"
- "\x6f\x6f\xe4\x97\x1d\x48\xe7\x15\xf6\xd5\x66\x20\x5c\xf2\x36\xab"
- "\xb4\x6d\x18\xb6\x31\x11\xbd\x91\x6d\x26\xbc\x12\xf1\x4a\xc6\xb0"
- "\x12\xe4\x7f\x39\xc7\x54\x49\x5b\x09\xbb\xaf\x1c\xfb\xb2\x38\x9e"
- "\x8f\x6c\xab\xcf\xf0\xdf\xcf\x50\x86\x68\x27\x6d\x25\x81\x8d\x6d"
- "\x95\xc8\xab\xd1\xcb\xb1\xdf\xf6\xdf\xc4\xbb\x77\x4d\x22\x8d\xfb"
- "\xf5\x18\xdf\xca\x4a\x8f\x3c\xea\x25\xac\x1a\x8e\xa4\x07\x0c\x47"
- "\xea\x59\xc9\x11\xcb\x63\xaf\x32\xb7\xbf\xe4\x88\x2d\x50\x72\xc4"
- "\xea\x1b\x8a\x7d\x64\xdb\x3e\x20\xff\xe4\xfb\x25\x43\x19\x7c\x81"
- "\xf2\xd8\xc9\xf5\xef\xb4\xa1\x0d\xac\xba\xa6\xb8\xa9\x13\xb1\x90"
- "\xf7\x21\xf7\x4d\xcd\x9e\x83\x5c\xa6\x2c\xf2\x48\x3a\x61\x8a\xf4"
- "\x3b\x37\x0f\x8a\xd9\xc6\x23\x96\xc0\xc6\x23\x56\xff\x46\xe4\x1b"
- "\x89\xf9\x44\x7d\x75\xdc\xcb\xed\xf5\x2b\xc4\xeb\x3e\x7e\xf6\xbb"
- "\xc0\xf8\x57\x1d\xe1\x7c\x24\xf9\x2a\xf2\x4f\x19\x3e\x2f\x61\xe6"
- "\xcf\xe4\xd7\x84\x9f\x82\x79\x8a\x9f\x22\x1f\x45\xe3\x0e\xf2\x53"
- "\x01\xd9\x4f\x05\x64\x3f\xc5\x9f\x0d\xe8\x6b\x4a\x0e\xd9\xc8\x1f"
- "\x65\xd8\x84\x9f\xc9\xf0\x27\x31\xc4\x46\x34\xf2\xb0\x09\x5d\x20"
- "\x4d\xe9\xa1\x57\x39\x3d\x97\xd3\xa1\xfa\x00\xfa\x1b\xbc\xf6\x06"
- "\x84\xbf\xf1\xca\xfe\x46\x52\xfc\x8d\xdf\x4e\xfb\x6a\x13\xb6\x06"
- "\xfa\x9b\x80\xec\x6f\xfc\x4c\xf8\x9b\x80\xec\x6f\x28\xdc\x2f\xfb"
- "\x1b\x7f\x08\x7f\x83\xf6\x4c\xf5\x8d\x90\xfd\x4c\x31\xf9\x19\xaa"
- "\x2f\x62\xcd\x1a\x10\x7e\xa6\x04\xc7\x1c\x12\xf9\x19\x3f\xa6\x09"
- "\x28\x7e\xa6\x9b\xa7\xaf\x27\x5f\xd3\xfb\x23\x40\xff\x69\x06\xf2"
- "\x31\xdc\x9f\xf8\x46\xf9\xc8\x9f\xa0\xfc\xee\x0f\xf6\x27\xc8\x6f"
- "\x2f\xfe\x36\xca\x7e\xaa\x23\x76\x3d\xf3\xa1\x3f\x69\xcc\xb0\x79"
- "\x50\xd7\x47\x70\xfc\x8d\x7e\xdb\x56\x50\xec\xb4\xf9\x00\xfd\x80"
- "\x97\x35\x17\x03\x96\x11\xf1\xeb\x47\x5f\x01\x80\x76\x99\xee\x43"
- "\x1b\x47\x8c\x5b\x9a\xf3\xfe\x08\x7e\xb4\xd5\xe9\x9d\x5d\xce\xb9"
- "\x9e\x44\xe3\xf4\x13\xcc\x8d\xf2\x71\xcd\xcd\x2b\x46\xff\x92\xe8"
- "\x6e\xea\xfc\x0c\xa6\xb5\xb3\xc0\xb4\x6c\x97\x19\x6d\xc0\x32\x7d"
- "\x91\x23\x96\xf6\xf6\x9e\xf1\x2d\x73\xa0\x5f\xfc\x7f\xa7\x9f\x30"
- "\xc6\xce\x6e\x87\xeb\xa6\xcd\x67\x01\x3f\xda\x19\xd6\xb7\x11\xeb"
- "\xdd\x8a\x65\xef\x40\x9b\xf3\xa2\x9d\xa5\xfb\x82\xec\x8c\x45\x7d"
- "\xf9\x6b\xfc\x6d\x16\xf2\xfb\xd2\x8b\x76\xd6\x1a\xe0\xed\x59\x3b"
- "\x1f\xeb\x61\x3e\x7c\x3e\x0c\x6d\xad\x35\xb0\x51\xd8\x5a\x80\x09"
- "\x5b\x0b\x90\xfc\x24\xd9\xd6\x50\x17\x68\x37\x26\xbc\x12\xf1\x0a"
- "\x6d\x6b\x79\x2a\x5b\x7b\x59\xb6\xb5\x48\x61\x6b\xa8\xd3\x08\xff"
- "\x1a\x61\x6f\xc4\x9f\xc6\x83\x7d\xf6\x16\x75\x24\x9d\xf6\x18\x12"
- "\xd8\xe1\x36\x87\xed\xca\x11\x1b\xda\x9b\x15\xed\x0d\xf9\x31\x37"
- "\xf9\x4d\xc4\xe6\xff\x50\x5b\x37\x23\x8f\xfd\xcf\x3c\xff\x35\xc5"
- "\x68\x4f\x36\xf4\x65\x5f\xa1\x1f\xfd\x9f\xb9\x1e\xa8\x43\x7b\x4a"
- "\x47\x3b\xb2\xa0\x3d\x59\xd1\xae\xc8\x9e\x3a\xfc\x6b\x88\xe7\x57"
- "\x1d\x7d\x3c\x78\x5b\xa9\xb5\x27\x31\x93\x1e\x7a\x3e\xb2\xdb\x7e"
- "\x7d\xae\x0b\x8e\xf0\x6f\x61\xf1\xb7\x0d\x7f\xb7\xc9\xbf\x71\xfc"
- "\xf7\x4b\x17\xef\xcb\xa0\x1d\xe6\xad\x83\x2b\x8f\x83\x39\x19\x31"
- "\x0f\xf8\x3b\x1a\x7f\xa7\x64\x8c\xfe\x9c\x05\xca\x6e\xf4\x62\xde"
- "\xdd\x64\x8b\xcc\x3e\x91\xc6\x67\xa9\x88\x45\x03\xeb\xa6\xbd\xe0"
- "\x3b\xdf\xa2\xbd\xe0\x69\xef\x77\x7c\x1e\x8e\x32\x48\xc0\xfb\x88"
- "\xea\x33\x10\x87\x97\xa9\x5a\xde\x77\x1e\x7f\x27\xb1\x95\xa6\xa8"
- "\xcd\x2b\x60\x4c\xac\x47\xec\xf9\x4e\x7b\xd4\xc7\xfa\x20\x8e\x7e"
- "\x33\xfb\x7e\x7d\xed\x19\x79\xdf\xf7\x18\xcc\x8f\xf6\x7d\xcf\x4f"
- "\x84\xda\x65\x7c\x0f\x4e\x53\xad\x9d\xed\xf6\x77\x93\x1c\x0e\x59"
- "\x94\xb2\x50\xd9\xb0\x9c\xd7\x62\x39\xa7\x3d\xb9\x2a\x15\xbe\xb0"
- "\x85\xfe\x7e\xb3\xdb\x6e\xee\xab\x7f\x98\xf8\x32\x45\x26\x61\xe2"
- "\x77\x29\x72\x0a\xf7\x3d\x2d\xb5\xd3\xfe\x15\xac\x93\xf6\x02\xa1"
- "\xef\x7f\x8b\x7c\xec\xff\xa2\x1c\x8b\xd7\xf9\xc1\x90\x61\xf3\x32"
- "\x67\x27\x73\x38\x6d\x27\xa0\x96\xf6\x27\x29\x64\x81\x40\x64\x67"
- "\x21\xdb\xd8\x69\xeb\x5a\xc1\x7c\x34\xaf\xd2\x6d\x1f\x65\x74\x41"
- "\x9a\x41\xe8\xe2\x70\x2b\x1f\x13\x1a\x3a\x6d\xc8\xeb\x72\xe2\xd5"
- "\x84\xe9\xfd\x1b\x3b\x8b\x91\x2e\xd9\x05\x9d\x99\x9c\xce\x70\xb8"
- "\x35\x6f\x35\xfc\xdb\x71\x18\xc5\xf7\xb1\x62\x25\x9d\xe5\xe4\x13"
- "\x30\xcc\x88\x61\xc4\xbf\x02\xe9\xb1\x8f\xfa\x7f\xc6\x88\xbe\xec"
- "\xa8\x42\x85\x0e\x7f\xf3\xbd\xa6\x34\x18\x12\xab\x31\x8a\x35\xdf"
- "\x93\xe9\x40\xfb\x75\x1c\x7d\x89\x96\x1a\x3a\xba\xdf\xa7\x7f\x69"
- "\xa1\x7d\x3d\x8b\xd6\x42\x3c\xea\x87\xca\xf7\xd7\x22\x1b\x3b\xc6"
- "\xec\xa3\x4a\xde\x59\xed\xc5\x31\xc5\x28\x2c\xcb\x47\x85\xe1\xe4"
- "\x19\x38\xc3\xda\x51\x06\xde\x2d\x38\x2e\x24\xf9\x90\x3c\xd1\x6e"
- "\x02\x28\x87\xaf\xc9\x27\xd5\xae\xa0\xb1\xf1\x0d\xa9\x8a\xbc\xc2"
- "\xeb\xa4\xb3\x4c\x8c\x1f\x6f\xa8\x63\x76\x06\x8e\xeb\xe8\x5d\xc6"
- "\x0d\x6f\x0b\x19\x7c\xd9\xd1\x85\x7e\x84\xe6\x6a\x69\x0f\xce\x7c"
- "\x13\xf3\x22\xcf\x0a\x17\xdc\x96\xa4\x7c\xff\xec\xf4\x4d\x21\xdf"
- "\x12\xb2\xdd\xe2\xdf\x3e\xf7\xf1\xbf\xd1\xd1\x1c\x4f\x67\x75\x92"
- "\x6f\xf2\x6e\x58\x27\xf4\xef\x25\xbe\xf4\x2d\x7f\x3b\xc6\xe7\x7b"
- "\x58\x07\x2b\xf1\xda\x68\x1c\x41\xdf\x11\x63\xd8\xaf\x10\xd7\xcc"
- "\xb1\x8c\xca\x74\xe3\xaf\x1c\xd7\xf5\xc0\x31\x1c\x1f\xd6\xf6\xcd"
- "\xdd\xdc\xb8\x8b\xe6\x6a\xc4\x7c\xd3\x8d\x63\x5c\x30\xf6\x80\x52"
- "\x2e\xea\x63\xa0\x6c\x49\xce\xad\xd4\xd7\xa0\xf9\xff\xfc\x42\xe6"
- "\xa5\x3e\x07\xd2\x5a\x94\x3a\x50\xfd\x44\xbd\x6e\xcc\x55\xd7\x0b"
- "\xcb\xe0\xc6\xb1\x36\x97\x41\xfe\x2a\x30\xf0\x3d\x01\xfd\xf4\xfe"
- "\x60\x0a\xaf\x0b\xd5\x99\xd7\x85\xfb\x58\x6c\x23\x7c\x77\xe2\xb8"
- "\x8d\x87\x13\x2f\x1c\xff\x8c\x49\x16\x78\xba\x31\xec\xb9\xb9\x88"
- "\xcd\xfa\xa2\xb3\x70\x5d\x51\x80\x1d\x3d\x06\x09\x53\x50\x4e\x11"
- "\x74\x0f\x50\x3f\xdb\x4b\xd8\x3d\x5d\x46\x6d\xb2\xb3\x90\xfc\x2d"
- "\xa7\xbd\x02\x69\xdb\x91\xe6\x4e\x99\xf6\x4e\xf1\xee\x87\xdf\x87"
- "\xd1\x1d\xdb\xb1\x77\x5d\x90\x30\xcd\xcd\xdb\x7b\x6f\xaa\xf2\xcc"
- "\xf0\x19\xef\xe8\x87\x4f\x97\x85\x2e\xcb\x91\x7a\x6a\xcf\xfc\x67"
- "\x58\x27\xe6\x73\x15\xe1\xa8\x68\x15\x5c\x8d\x98\xfc\x7a\xdd\x5a"
- "\xb8\x92\x30\xc6\x22\x3b\x2b\x85\xdc\x13\x2a\x99\x1d\xfb\x9e\xe8"
- "\x51\xf3\x56\xc0\xbf\xa1\x0d\x95\x1f\x87\x84\x0f\xe7\x15\x9a\xb1"
- "\xac\x00\x5b\x4e\x02\xf5\x51\xbe\x42\xfa\x0a\xa7\xef\x4f\x74\xd6"
- "\x27\x62\x31\xe1\x80\x82\x45\xfc\xdd\x7a\x2e\x5f\x81\xed\x4c\xa2"
- "\x98\x67\xb8\x69\x0a\xcd\xf5\x1f\x85\x9b\x92\xa8\xbe\x78\xe9\x30"
- "\x6c\x14\x3b\xc3\xe2\x19\x6f\xd3\xda\x4c\x2e\xb8\x69\x36\xde\x13"
- "\xf9\x85\xbe\x44\x7e\x36\x21\x9d\x91\x9d\xf1\x13\x4d\x22\x86\x61"
- "\x9c\x8e\xec\xa4\xaa\xdb\x7e\x53\x96\x0b\x1e\x91\xc7\xad\x37\x99"
- "\x89\x57\x98\x32\x98\x18\xff\x8e\xfe\x34\xd6\xf7\xa6\xcf\xcc\xeb"
- "\x74\x54\x0e\xbe\x0f\x24\xf1\xaa\x95\x84\xcf\x0e\x60\x59\x6b\xec"
- "\x01\x2b\xfa\x67\x6b\xa0\xf4\xdb\x54\xfe\x5b\x8e\x63\x72\x3b\x1a"
- "\x9a\xbf\x77\x03\xdf\x8f\x19\x6e\x36\x09\x3e\x5e\x9b\xe3\x9a\xe3"
- "\xf4\xcc\xf7\x2e\xf2\x18\xce\xa4\x3a\x2b\x53\xc5\x5e\xd0\x48\x23"
- "\xc6\xf1\x37\x5f\xdd\x85\x79\x74\xdb\x6f\xc6\x7a\x8f\x37\x88\xf7"
- "\x1e\x67\x52\xc3\xd8\x9e\x91\x6c\x87\x6c\x4e\xd8\xf4\x2d\x27\x9a"
- "\xea\xc8\xfe\xda\x0c\x5d\x86\xb6\x44\xd9\xff\xd2\x9c\x4c\xf4\x51"
- "\xb8\xa5\xb3\xc9\xc4\xf1\x2d\x31\xe9\x66\x9b\x66\xaf\x58\x8c\x1b"
- "\x78\xdd\x8c\xe3\xfd\x9b\xf7\xe1\xd5\x28\x3f\x1f\xc4\xab\x03\x7f"
- "\x27\xe3\xd5\xc6\x65\xb7\x23\x47\xe7\xc2\xb8\x2e\xec\xb3\xd3\xb3"
- "\x0b\x6e\xde\xc3\x76\x24\x48\xca\xef\xda\x37\x69\x9e\xe0\x66\x17"
- "\xea\xc0\x2a\x74\x41\x7c\x40\x87\x65\x23\xb9\xb3\xa2\x4a\xe6\x6d"
- "\x58\xe7\xa1\x72\x1b\x1b\x2a\x3d\x60\xbe\x99\xea\x7f\x4b\x1c\xd5"
- "\xc9\x83\xf2\xa7\x7b\x7e\x25\x73\xef\xaf\xf2\x01\xbd\x23\xeb\xb6"
- "\xdf\x82\xf6\xff\xef\xd3\xc4\x9c\x83\x77\x37\xf1\x93\x31\xc1\x94"
- "\xfa\x0b\x39\x9f\x49\x35\xaf\xd0\xd1\xf3\xaa\x1a\x3e\x0f\x73\x5c"
- "\xdf\x3f\xd7\x7c\xcb\xcb\x68\xe7\xf7\xd3\x5e\xd2\x27\xe1\x96\x4f"
- "\x19\xca\x7a\xbf\x95\xef\x49\xe9\xa6\xf9\x18\x9a\xbf\xc7\x7c\xd0"
- "\xff\xdd\xd4\x28\xef\xbf\xe3\xe6\xbe\x06\x79\x6e\xc6\x38\x6c\x8f"
- "\x3a\x9b\xac\x5e\xf0\x53\x9d\x31\xed\x67\x67\xbc\xfa\xd8\x02\xd0"
- "\xad\xcb\x43\xbf\x83\xe5\x60\xa8\x2b\xe1\xcb\x6e\x49\x5f\x7b\x82"
- "\x79\x95\x3a\xd3\xbb\x54\xe4\xdb\xe9\x82\x72\x4b\x58\x9b\xe8\xab"
- "\xc7\xe8\xc8\xfd\x09\x42\x8f\x01\x94\x95\x56\x8f\xa3\x0d\x42\x87"
- "\x89\x29\x5a\x1d\x8e\xc6\xbe\x4e\xe2\x06\xbc\xaa\xf0\xda\x25\x9e"
- "\xd5\x57\x62\x9e\xea\x37\xea\x35\x11\xfd\x69\x62\x21\xfa\x0b\x79"
- "\xee\x87\xc2\x11\xcf\x84\x9b\xbf\x62\xdb\xd3\x6b\x01\x7a\x8f\x4a"
- "\xe1\x84\x71\x0a\x0f\x60\xff\xc6\x05\x89\xe5\x18\x6f\x24\xfb\xa5"
- "\xfd\x3d\xd5\xf1\x7d\xfb\x38\x41\x22\xdf\xd7\x3c\x76\x7d\x49\x09"
- "\x61\x17\xd3\x54\xc4\xfa\x4a\xb0\x8f\x99\xd8\xa9\xc8\x15\xc3\x0e"
- "\x52\x3c\xe1\xb4\xdb\x3e\x5a\x8f\x72\xa9\xe4\xef\x49\x71\x0c\x18"
- "\xba\xef\x31\x3a\xb1\xaf\x8f\x66\x68\x2b\x21\x5d\x76\xc2\xad\x13"
- "\xd1\x8f\xa1\xff\xfe\x36\x59\xb4\x3f\xb7\xde\x49\xcf\xe8\x3f\xbf"
- "\xc6\xdf\x49\x4d\xe8\xa7\x7a\x4a\xbf\x29\xee\x95\x60\x58\x8f\x04"
- "\xa9\xbe\xcd\x09\xf1\xbe\xa8\xaf\xcb\x9c\x1d\x7b\xa0\xd9\xf7\x73"
- "\x30\xbf\xc8\x79\x8c\xa6\x7d\x66\x8b\x56\x31\xff\xc7\x3d\xf5\x7a"
- "\xa7\xef\x94\x83\xef\xeb\x2e\xbe\xd3\xd7\xfd\xf8\xa8\x38\x73\xe8"
- "\x98\xfc\xcc\xa2\x6f\xf4\x6e\x7e\x9e\xf9\x36\x1f\xa3\xbd\x67\x4c"
- "\x51\x9b\x7a\x60\xcc\x5b\xab\x21\xa9\xaa\x07\x12\x6a\x7a\x20\x91"
- "\xfd\x99\xce\xe4\x09\xe0\x58\xcd\x48\xe7\x9d\x58\x86\xe7\x81\xa1"
- "\x66\x35\xf6\xe7\x7c\xa0\xf3\x6f\xc2\xfe\x1c\x9d\x4d\x74\x2a\x91"
- "\xfc\x65\x5f\x7f\xae\x97\xf7\x95\x4f\x70\x1a\xb6\xf1\x04\xed\x45"
- "\xa9\x8b\xce\x06\x23\x96\xaf\xe8\x24\x8c\x5e\x14\xdd\x8e\x7d\x49"
- "\xac\xb3\x4b\xae\x2f\xca\xbc\x30\xd6\x0a\xc3\x78\x5d\xd1\x87\xb3"
- "\x8d\xdf\x26\x87\x6d\x9b\x25\xc2\x94\x87\x6c\x89\xea\xb0\x9e\xde"
- "\xe5\xee\xb9\xc6\xab\xcf\xaf\x62\x5e\x0a\x2f\x18\xc5\xbc\x18\x6e"
- "\xa5\xbc\x77\x63\x78\xb7\xfd\xd6\x72\x97\xf4\xc7\x69\xe1\x30\x8a"
- "\x63\x26\xd9\xd7\xdc\x76\x39\x93\x8a\x09\xa3\x8d\x6b\x7d\xd8\x1f"
- "\x3f\x49\x76\x7c\x9b\x31\x23\x97\xf9\xcc\x4b\xe8\xbd\xfa\x6d\x40"
- "\xef\xfc\xe9\x5d\xdf\x47\xd8\xd7\x39\xdf\x7b\x7e\x6a\x43\x68\xfc"
- "\x10\x9b\x8b\x3c\x4b\xdb\x1a\x19\x8e\xd9\x2f\xb4\x5f\x4f\x6b\x4d"
- "\xb6\xf2\x75\x2d\xb7\x4d\x73\xc1\x53\x75\xf2\x7e\xb2\x9d\xc2\x9f"
- "\x8e\x19\xe3\x41\x19\x68\x7d\xc0\x18\xa0\x7d\x50\xba\x4a\x8e\x47"
- "\x3b\xae\x23\xdf\x7f\xdb\x59\xd1\x17\x3a\x6e\x10\x6d\xc1\x6d\x87"
- "\xc4\x1c\xff\x6d\x55\x2e\xb8\x97\xb7\xf1\x79\x37\x10\x26\x6e\x3b"
- "\xc8\xa2\x8e\x5f\x46\x74\xe3\x8a\xa1\x78\xa9\x0f\xb2\xd9\xc6\xe3"
- "\x06\xc6\x6d\xe5\x24\xb0\x37\x5e\xea\xa6\xb5\x1a\x9e\xab\x66\x75"
- "\x63\xdf\x60\x0c\xc6\x45\x53\x1e\x6e\xa4\x41\xb9\x47\x8a\x35\x01"
- "\xb7\xb9\x5d\x70\x8f\xec\x0f\x6f\x6b\x10\x73\xcf\xb7\x35\x74\x61"
- "\x5a\xec\x2b\x5e\xd1\x6d\x1f\x83\xfd\xdf\x99\x05\xf2\xbb\x63\xbe"
- "\xa6\x07\xc3\x12\x5c\x90\xb5\x97\xc2\x0a\x46\x81\xa9\xc0\xcc\xc2"
- "\xf5\xc5\xf4\xda\x7a\x8e\x7d\x8f\xaf\xbb\x91\xe0\x2a\xe4\x61\x55"
- "\xf8\x62\x7b\xfb\x7e\x97\xf4\xe4\x93\x18\x56\xa8\xf0\x45\x9a\x2b"
- "\xf1\xb9\xac\x8f\x46\xa4\xa9\x52\xa5\x79\xb2\x4b\xba\xf5\x7d\x0c"
- "\xdb\x1d\x94\xc6\x11\x94\xa6\x45\x95\xa6\x58\xce\xa7\x3d\x28\x8d"
- "\x47\x9b\x66\xac\x7e\x60\xd9\xc6\x9a\xb4\x69\xc6\x26\x06\xa5\x49"
- "\x1e\x58\xb6\xb1\xd3\x82\xd2\xcc\x0e\x4a\x93\xab\x92\x2d\xad\x81"
- "\x49\xc2\xb0\xe2\xa0\x34\xe5\x41\x69\xea\x94\x67\xec\x7b\x3a\x44"
- "\xdf\x00\xf1\x84\x3a\x45\xbd\x46\x63\x3c\xd6\x7f\xf2\xc1\x73\xad"
- "\x83\x42\xcc\xe8\x8b\xaa\xc5\xbe\xfc\xe4\x57\xe9\xbd\x3e\xf9\x73"
- "\xec\x17\x77\x12\x26\xa8\xdf\x49\x79\x1d\x83\x71\x27\x08\x43\xdd"
- "\xf6\x71\x71\x03\xe5\x31\x2e\x51\x5b\xce\x71\xc9\xda\x72\x8e\x4b"
- "\x1f\x28\x8f\x71\xb3\x83\xd2\xe4\x06\xa5\x29\x54\xa5\xa9\x93\xf3"
- "\x29\x0f\x4a\x53\x17\x94\x66\xf7\x40\x7c\x8e\x6b\x08\x4a\x73\x30"
- "\x28\x4d\x7b\xbf\x0c\xc7\xf1\xf5\x6c\x64\x0f\x18\x8e\xcf\x29\x09"
- "\xe7\x90\x9d\x51\xc1\xb3\xb2\x1e\x4d\xe0\x7a\xfc\xfa\x0a\xb1\x2e"
- "\x8b\xef\x81\xd4\x0e\xe3\xb7\x29\xef\x7b\xdf\xe9\xf1\x0e\xa1\x77"
- "\x4c\x28\xdb\x8e\xfd\x36\x2f\xb6\xb9\xe3\xb3\x5d\x70\x67\xa5\xb2"
- "\x66\x83\xd6\xb9\xf0\x3d\xf4\xf8\x78\x64\x7c\xaa\xb0\xbf\xf1\x15"
- "\xf2\x3b\x1d\xaa\x0f\xb6\x8b\xe3\x2b\xbe\x5b\xb9\x92\xee\xa4\x72"
- "\xd1\x5e\x52\xc8\xa3\xb5\x6f\xac\xd1\x57\x56\xca\x33\xe9\x01\xa5"
- "\xac\xb5\x62\xad\x0d\xed\x5f\xe6\xa6\xfd\xbd\xba\xed\x49\xd1\xaa"
- "\xf1\x09\x95\xd5\xb3\x67\xb5\x57\x1f\x54\xe6\x4e\x51\xe6\xa4\x54"
- "\xe1\xa3\x92\x52\x15\x7f\x12\x16\x7f\x25\x5e\x6b\x33\xf6\x0a\x68"
- "\x4d\x41\x53\x15\xf6\x37\x71\x8c\x45\xe5\x3e\x0a\x49\x25\xbc\xff"
- "\xbb\xa4\x07\xe8\xb7\xb3\x70\x12\x5f\x73\x20\xd7\xc5\x41\xe7\x38"
- "\x50\xdf\xa7\x21\xef\x34\x74\xf1\x31\x1a\xf9\xc6\xa4\x13\xfb\x0b"
- "\xdd\x54\xd6\xbd\xca\xba\x1c\x2c\x8b\xe8\xd7\x95\x78\xb3\x69\x3d"
- "\x04\xbd\xd7\xdb\xef\x49\x26\x9a\x36\x94\x6d\x9d\x22\x03\x3a\x13"
- "\x02\x69\x2b\xc2\x8d\x95\xd4\x72\x15\x65\xb8\xe3\x19\x81\x9f\x09"
- "\x09\x5a\x7b\x18\x82\x38\x9d\x90\xac\xc5\xdc\x84\x74\x2d\xe6\x26"
- "\x58\xb4\xf6\x20\xa1\x3d\x4c\xc8\x0d\x4a\x53\x18\x94\xa6\x4c\x95"
- "\xa6\x5c\xce\xa7\x2e\x28\xcd\xee\xa0\x34\x6a\xff\x87\x75\x9e\xd0"
- "\xd2\x37\xee\xe4\xfe\x7e\x82\x4b\xf5\x2c\x55\xf0\x76\x6a\x82\x47"
- "\x09\xa3\x79\x3b\xea\xa3\x12\x6e\x04\xbf\xdb\x8d\x41\x3e\x0a\xe9"
- "\x6f\x4f\xd0\x96\xe1\xf6\x89\xda\x32\xdc\x9e\xa6\x3c\xcb\x6b\x1e"
- "\xfe\xeb\x18\xdc\xbe\x51\xc6\x99\x27\x76\x3d\x3c\x1e\xeb\x7b\xe2"
- "\x19\xea\x9b\x51\xfb\xc4\xd7\x86\xad\xc5\x3e\xe5\xb7\x60\xa4\x35"
- "\x79\xc7\x0a\x20\x82\xf6\x99\x73\xc1\x1d\xfb\x58\xe4\x09\xa2\xe9"
- "\xc4\xfe\x54\x06\xf2\xc8\xc2\xfc\x2b\x31\x0f\x94\xdd\xed\xf5\x41"
- "\x65\xd8\x1b\x54\x86\x46\xd5\xb3\x11\x9f\x5b\x55\xf5\x36\x46\x98"
- "\xf8\x1a\x50\xec\x5b\xdf\xee\x56\xc2\x69\x0e\x00\xeb\xd8\x51\xc4"
- "\xfb\x01\xa9\xb4\x1e\x6f\xc4\x51\xb8\xfd\x08\xcd\x17\x08\x9e\x77"
- "\xc4\xab\x65\x2b\x64\x71\x47\x92\xb6\x1c\x77\xa4\x6a\xcb\x71\x47"
- "\x66\xbf\xaf\xb9\x3d\x4b\xd8\xc8\x1d\x39\x2e\xb8\xaf\x9c\xc2\x50"
- "\x16\xe6\x58\x9f\xf9\x0a\xc7\x0d\xd4\x4f\xbd\xe3\x13\x0f\xd6\x97"
- "\xfd\x48\x1a\x21\x3f\x7f\xca\x6e\xa0\x7e\xf7\x09\x3a\x1b\x80\xd6"
- "\x5c\x5e\x8f\x61\xfb\x84\x5e\xef\xc0\xfa\xdf\x5b\x2f\xf8\xde\xc1"
- "\xf7\x77\x25\x5a\xfc\x5d\xc2\x22\xbd\xb6\x70\x78\xee\x8a\xf2\xe6"
- "\xc9\xeb\x41\xcd\xc8\xa3\x53\xb1\x87\x40\xa9\x37\x2f\xb0\xb1\xcb"
- "\xdb\x6d\x9f\x88\x3c\x92\xbc\x62\x4c\xd3\x95\x86\xd8\xa7\xf1\x37"
- "\x8e\x81\x27\xca\x63\x19\xef\x06\x5a\x93\x87\x7e\x89\xf6\xb2\x8c"
- "\x16\xeb\x27\x26\x4e\x54\xd9\x95\xc7\xbc\xfa\x7e\x76\x14\x26\x9e"
- "\xa5\xbe\x1d\xf9\x0d\x5a\xdb\xb7\xdf\xe7\x06\x9a\x67\x71\xfa\x8e"
- "\xf3\x3e\x39\xc6\x7b\xe5\xb4\x79\xaa\xb4\x6e\x79\x1e\xa4\x83\xe2"
- "\xc6\xfb\x40\xbf\xdf\xe3\xa6\x3d\xfb\xe3\x44\x3f\x7e\xe2\xd9\xfd"
- "\xe8\x2f\x30\xcd\x4e\x25\x0d\xcd\x99\x50\x1a\x1c\xf3\xe8\xc7\x15"
- "\xd2\xb9\x9e\x47\x39\x6f\x65\x7d\x0d\x8d\x8f\x9c\x85\x1d\xe0\xf4"
- "\xb4\xd2\x9c\xa6\x5e\xac\x8b\x9a\xe8\x8d\xf0\x82\xa1\x6b\xa3\x17"
- "\x7d\xf1\x44\xaf\x7f\xa3\xd7\x8a\x65\xc3\x76\x77\x62\x3c\xf9\x40"
- "\xb5\xec\xa6\x4c\xc9\x7c\x22\x63\xfa\xd8\xa7\x9f\x98\x9a\x35\x65"
- "\x92\x39\x6b\xd1\xe2\x85\x39\x63\x97\x2e\x2f\x30\xaf\x5c\xb6\xa8"
- "\x60\xd1\x92\x17\xf8\x36\xa3\xe6\xf9\x05\xe2\x9e\x98\x3b\x3f\xbf"
- "\x60\x32\xfd\x1c\x63\xce\x5b\xb6\x70\x05\xff\x39\x3a\x0a\xb4\x4c"
- "\x16\x15\x2c\x5c\x66\xbe\x29\x67\x8c\xf9\xe1\xf9\x8b\x72\x97\x2f"
- "\x5b\x18\x92\xd7\x24\xf3\xb2\x85\xcb\x16\xce\xcf\x31\x4f\x36\x27"
- "\x11\x67\x35\x3b\x95\x3e\x93\x14\xff\x94\x8f\xed\x39\xf6\xa1\x3b"
- "\xc8\x4f\x51\xbb\x7e\x0c\xee\x3e\x42\x7d\x38\xbe\x2f\x28\xe2\x10"
- "\xdb\x04\x57\xb7\xfd\xce\xb6\x81\xed\xf8\x9d\x6e\x2d\x7e\xef\x02"
- "\x2d\x7e\xef\x32\x0e\x6c\xc7\xef\x0a\xb2\xff\xbb\x82\xec\xff\xae"
- "\xb4\x81\xed\xf8\x5d\x96\xa0\x34\xd6\xa0\x34\xb6\x3e\x3f\x83\x65"
- "\x7d\x85\xfb\xa5\xbb\xca\x82\xd2\x54\x05\xa5\xd9\x15\xf4\xbc\x4f"
- "\xf5\x8c\x7d\xd7\xbb\x0e\xa8\xfb\x06\xf8\xdc\xa6\xd8\x7a\xbf\x7f"
- "\xbb\xcb\xad\xd0\x50\xdb\x53\x4b\xe7\x0f\x71\xda\xbb\x0d\x2a\xda"
- "\x0e\x41\x7b\x77\x9f\xfd\x93\x4f\xa2\x35\x91\xa2\x7f\x7e\xf7\x26"
- "\xd9\xb7\xd1\x79\x44\x4a\x1b\xda\x8e\xba\xb8\xfe\x24\xdc\x75\xb6"
- "\x56\xd0\xba\x69\x9d\x2c\x7b\x63\x56\x77\xed\x08\x30\x50\x5a\xda"
- "\x17\x93\xd9\xef\xe4\x7b\x34\x62\x58\x34\x5e\xe8\xa7\xee\x2e\x76"
- "\x49\xff\x1f\x3f\x0b\x6b\x03\xd2\xb8\xe0\x6e\x8e\x65\x4a\xb7\x81"
- "\xaf\xeb\xe3\xf9\x9d\xa5\x73\x95\x68\xaf\x59\xf2\x9f\x94\x2f\xed"
- "\xd7\x4a\x79\x23\x0f\x3d\x93\xee\x9c\x2a\xef\xbb\x69\xc4\x2b\x0e"
- "\x79\x1e\x54\x78\x22\x3f\x3e\x4f\xf4\x8a\xbc\x0e\x5e\xf4\x7b\xee"
- "\xf6\x28\xfd\x0b\x1a\x2b\x84\xf2\x1d\xa1\xd7\x3c\x43\xec\x16\x7b"
- "\xa0\xd5\xb1\xae\x1d\xcb\x94\x9c\x40\xfd\x50\xa7\xc9\x07\xcd\x55"
- "\x3e\x1c\xbf\x82\x91\x8f\xa7\x6c\x27\xc0\x59\xe7\x03\x9a\x1f\x9e"
- "\x67\x83\xe2\x5a\x29\xd0\xca\xfa\xd2\xd1\x18\x2d\x99\xef\x37\xbe"
- "\x81\xc2\x31\x3d\x8e\x25\xdc\xb4\x36\x3a\xdc\x99\x5f\x44\xe7\xb8"
- "\x81\xc6\x7b\xc9\x15\x72\xdf\xb7\xa4\x16\x79\x85\x5c\xb7\x2b\x81"
- "\xb3\xdb\x9e\x8c\xed\x5f\x76\xb2\xe2\xb3\xf7\x57\x72\xdf\x27\x61"
- "\x38\xca\x36\xd9\x14\xae\x9f\x22\xfb\xf7\x3c\x5a\xfb\xd5\x6d\xbf"
- "\x27\xee\x5c\xb4\x54\xee\xfd\x58\x6f\xb4\x45\xe3\x3b\xeb\x92\x86"
- "\xc8\xfe\xd5\x80\xe9\xa6\x29\xe9\x2e\xa4\x7e\xf2\x37\x0a\x6e\xb4"
- "\x55\x8f\x18\x2b\x4e\xfa\xd5\x56\xbe\x16\xf8\x1e\xec\xff\x25\x2b"
- "\x76\x70\x19\x3e\xa3\xff\xbb\x87\xcf\x27\xd2\xba\x19\x1a\x53\xe7"
- "\xe7\x61\x9f\xcd\xe4\x41\xdf\x78\x8f\x43\x89\xe3\xf3\x44\x14\x57"
- "\xc8\xbc\xfb\x4d\xed\x14\xd7\xd6\x17\x47\xe9\xa8\xdc\x36\x1f\x85"
- "\x7b\x94\x70\xd1\xb6\x4c\xd2\x07\x3d\xc7\x29\xcf\xf8\xdb\x8c\x65"
- "\x29\x91\xf9\xbb\xd1\xe7\xd2\x9a\x27\xdd\x51\x98\xb4\xbe\x86\xdb"
- "\xcd\xa4\x54\x25\x9e\xcf\xa9\xbd\x4d\xef\xc6\x3c\x10\x88\x3a\x6e"
- "\xe4\x7d\x2e\x4c\x43\xe7\x74\xe1\x18\x43\xc7\x7a\xf9\xfa\xab\x4e"
- "\xe2\x43\x36\xc3\xcf\xca\xc1\x67\xe4\x35\xb1\x96\x70\x8d\x7a\x5d"
- "\xe9\x83\xf8\xbc\xfb\x68\xfe\x79\x12\xc7\x2d\x85\x11\x5f\xe2\x47"
- "\x6d\x22\xf1\x26\x7e\x74\x9e\x18\xeb\xa2\x35\x8a\x93\xb0\xfe\xc9"
- "\x9e\x70\xba\xc2\x78\x97\x4a\x96\x43\xf0\xd9\xad\xad\xeb\xbd\x10"
- "\xf4\x6c\x54\x9e\x69\xae\x57\x60\xef\x5e\xbd\x1c\x37\xe6\x5c\x79"
- "\xd1\xf8\x17\x69\x32\xb5\xf9\xdd\x9b\x1d\xc4\x3f\x2f\xe8\xb9\x58"
- "\x79\xae\xe0\xef\x18\xee\x2d\x57\xf2\xe0\x3a\x43\x8c\xed\x5c\xe7"
- "\x1e\x72\xae\xfd\x63\x31\x4d\x83\x2a\xcf\xa1\xf8\x7c\xb0\x5f\x7f"
- "\xf7\xba\x14\x7e\xf8\xbb\x53\x45\x87\xfd\x92\x7b\x7d\x0a\x9d\x78"
- "\xbf\x91\x12\xdd\x9f\x2e\xc5\x74\x9e\xba\x06\x61\x77\xf2\x42\x81"
- "\xdd\x94\x4c\x6d\x59\x52\xb2\x55\x3c\x73\xfb\xcb\x92\x62\x53\xd1"
- "\xa1\x7d\xa6\x94\x04\x63\x35\xdf\x46\x18\x27\xbc\xa6\xec\x0c\x11"
- "\xe7\x95\xe3\x1c\xa1\x31\x9e\xd2\xaa\x0a\x97\xc7\x47\x93\x95\xfd"
- "\xcf\xc9\x3f\x7b\xe8\xac\x34\x79\xbf\x76\x8e\x49\xda\xc7\x59\x3e"
- "\xbf\x09\x71\x3d\xd9\x14\xcc\x97\xce\xdc\xe9\xe3\xd1\xc7\x33\xa5"
- "\x43\xf4\xf1\x26\xa7\xf7\xd7\x6d\x72\x96\x0b\x26\x29\xef\x89\xdc"
- "\x62\x6e\x30\x25\x2d\xdc\xb8\x03\xe9\x37\x68\x65\x36\xb9\xa2\x5f"
- "\x66\x93\xeb\x54\x7c\x77\xa9\xe8\xfe\x1b\x9f\xf7\xa9\xe8\x1a\xcf"
- "\x87\x4d\x81\x95\xc9\x6e\x6d\x5e\xf7\x41\x3f\x8f\xfb\xa2\xfb\xf3"
- "\xba\xcf\xa4\xa2\x6b\xc5\xe7\xc4\xf0\xfa\xb9\x2f\x2d\xbc\x7e\xee"
- "\xcb\x0e\xad\x9f\xfb\x6c\xaa\x7c\x37\x9c\xdf\xae\xee\xab\x57\x95"
- "\xa7\x16\x9f\xf7\x6a\xed\xe8\xbe\xc6\xa0\xe7\x3e\xfd\x33\xf4\x1d"
- "\x3b\x57\xa7\xd2\xf9\x1e\x50\x30\x0a\x8c\xc2\xce\xee\xf3\xaa\xe3"
- "\x3f\xee\x11\xf1\x54\x46\xfe\x0e\x8e\xde\x6f\x72\xba\xfb\xcd\xc1"
- "\x74\x44\xa3\x8a\x4f\x55\xca\xbe\x21\xcc\xde\xe2\x4a\xfb\xe7\x0c"
- "\x50\xfb\x77\xff\x6c\xf1\xde\xe6\x2f\x69\xcc\xfe\xb9\x25\x5c\x5b"
- "\x86\x7c\x2b\x5d\x70\x7f\xa6\x90\xcf\xfd\x88\xff\xa7\xc5\xb7\x2f"
- "\x25\x7f\x49\x43\x3c\xf5\x1c\x83\xd4\xc9\x78\xef\xc5\xfb\x28\x6d"
- "\xfb\x7a\xff\x3e\x66\xd7\xcd\xac\xb5\x07\xb7\xbb\xf7\x1f\xc4\xb1"
- "\x47\x4f\xac\xaf\xd8\x12\x22\xce\xcd\xec\x11\x4f\x0c\x0c\x4f\xa5"
- "\xb6\xae\xc7\x05\xa9\x29\x54\x5e\x55\xb8\x99\xd9\x87\x67\x11\xbd"
- "\x8b\xf2\xc3\x34\xe1\xf4\xa6\x7c\x5f\x24\xb0\x97\x9a\x1b\x54\x8f"
- "\xb3\xc8\xeb\x1b\x51\x8f\x07\xa6\x04\xe5\xbd\x21\x74\x3d\x52\xab"
- "\xb0\x1e\x67\x43\xd7\x23\x95\x9f\x85\xcb\x24\xac\xcb\x80\x7e\x47"
- "\xea\x41\xac\xcb\x59\x2e\x77\x6d\x78\xa7\x32\x4e\x2d\x3a\x8b\xe3"
- "\x7f\x09\x78\xda\x99\x85\xfd\x7a\x13\x74\x0f\xc4\xc5\x56\x42\xe6"
- "\xc0\x3c\x1f\x18\xc3\xec\xc3\x66\xba\xe0\x81\x1c\xa5\xbd\x92\xc3"
- "\xd3\x44\x59\x50\x4e\x12\xc9\x29\x95\xce\x7d\x8a\x0d\xa7\x6f\xc5"
- "\x3e\xc5\x7b\xa6\x07\xd0\xfe\x53\xd3\x95\x36\x1d\xdb\x73\xb7\x22"
- "\x47\x8c\xdb\x1d\x14\xe7\x55\xc5\x1d\xd0\xc4\xad\xed\x0b\x6f\x57"
- "\xc2\x2f\x4c\x4f\x0f\xc6\x05\xe9\x09\xf5\xf3\xe0\xbb\xda\x7a\x3f"
- "\x98\x20\xea\x87\x3a\x1a\x20\xeb\x07\x53\x51\x47\xbd\xa1\x75\xf4"
- "\xe0\xec\xd0\x58\x7b\x90\x9f\xd5\xcd\x46\x40\x28\x7e\xe5\xa8\xbb"
- "\x5e\x8e\x41\x59\x4f\x03\xf5\xf3\xe0\x1e\x45\x3f\x17\x58\x47\x6f"
- "\x50\x1d\xfd\xc7\xe0\xa1\xe5\xa2\xae\x0f\x7d\xa1\xe5\xfd\x90\x31"
- "\x34\x16\x1f\x4a\xc4\x7a\xfa\x43\xd7\xf3\xa1\xb4\xf0\x58\x7c\x28"
- "\x1b\xeb\xe3\x1f\x88\xc5\x87\x6c\x22\x0d\x84\x4a\x53\xc1\xec\x21"
- "\xf3\xd9\x45\xfd\x22\x17\x3c\xd4\x4e\xef\xe9\x54\xe1\x0d\x5a\xfc"
- "\x3d\x64\xe4\xe9\x48\x7e\x3e\x31\x8e\x21\x3d\x1c\x33\x83\x74\x3e"
- "\x4c\x76\xdb\xd3\x12\x82\x64\x75\xea\x18\xa4\xbd\xdb\x25\x49\x0f"
- "\x0b\x79\x4d\x59\xa4\x2d\x53\x5a\x6a\x68\x79\xa5\x59\x50\x5e\xa7"
- "\x42\xcb\x2b\xad\x20\xbc\xbc\xd2\x48\xff\xa7\x06\xca\x2b\xad\x5e"
- "\x2d\x2f\x3a\xe3\x95\xea\x77\xa3\x09\xb1\xd1\x3b\x8f\xd5\x0a\x5f"
- "\x6e\x8c\x45\xac\x88\x34\x9d\x94\xa6\x2d\xd6\x2b\x70\x62\xbe\x06"
- "\x0c\x27\x21\xad\x41\xb1\xff\xe1\x95\x30\x8c\xf5\xce\xa2\x35\xda"
- "\x74\x66\x84\xd1\x69\x3b\xe5\xa0\xb3\x25\x69\xbe\x51\x9b\xef\x14"
- "\x73\x68\x5f\x30\x25\x19\x65\xfa\x7a\x88\xf0\x4c\x31\x67\x3a\xa5"
- "\x44\xeb\x23\xa6\x58\xb5\x3a\x42\xb9\x49\x7c\x37\x74\xdd\x85\x5c"
- "\xe7\xd6\xd9\x94\xd6\x81\x3a\x7b\x78\x95\xd0\xd7\xc3\xcf\x04\x95"
- "\xcf\x1d\x5a\x5f\x0f\x1b\xc2\xeb\xeb\xe1\x84\xf0\xfa\x7a\x38\x95"
- "\xf4\xe5\x82\x87\x6d\xda\x76\xe3\x61\x8b\xb6\xbe\x98\x2f\xa6\x63"
- "\xd2\xd0\x2b\xe8\xf9\x42\xeb\xad\x5c\xe4\xe3\x48\x57\xb5\xd8\xbf"
- "\xc2\xf2\x8f\xa2\x32\x0e\x96\x47\x58\xde\x28\xc3\xf2\xd5\x61\xcf"
- "\x21\x89\x6e\xc6\x71\x25\xad\xcf\xe3\xe7\x44\xc3\x23\xd3\x03\x92"
- "\x6e\x12\xfe\x96\x8e\xc1\xd4\xab\x03\x52\x44\x31\xad\x25\xe3\xdf"
- "\xe6\xf1\xf7\x13\x8f\xe4\xa8\x75\x41\x6b\xca\x68\x2e\x7a\xb3\x98"
- "\xe7\xfc\x0a\xd3\x9f\x10\x7a\x49\x3f\xab\x95\xe3\x23\x25\xa1\xf5"
- "\xf2\x48\x1d\xea\xe5\xab\xd0\x7a\x79\x64\x5f\x78\xbd\x3c\x42\x63"
- "\xd2\xaf\x06\xda\xd1\x23\x6e\xd9\x8e\x5e\xa1\x34\xe6\x25\xd4\x5f"
- "\x4d\x9f\x4f\x34\xf8\x1b\x6d\x24\x9d\x9f\x3d\x3c\xb6\x53\xb1\x23"
- "\x4a\x93\x4e\xe3\x7f\x9e\xbf\x4c\x63\x96\x79\xa8\xf8\xa6\xa7\xc7"
- "\x76\x86\xb2\x93\xf4\x6c\xa2\x1d\x97\x07\x06\x94\xa1\xa5\x9a\x78"
- "\x2c\x03\x40\x1e\x9f\x12\x1d\x85\xd3\x19\x0e\x2a\xfa\x72\x85\x8e"
- "\xcf\x8b\x0a\xda\x12\xd6\x6d\xe5\x67\x55\x05\xf1\x96\xeb\x3f\x8c"
- "\xb7\x23\x44\x4f\x74\x41\x34\x2e\x61\x8f\x53\x13\xb4\xf6\x98\xee"
- "\xd5\xe2\xf3\x11\x7a\x3f\x11\x1b\x40\x3f\x87\xbf\xa7\xf9\xed\xba"
- "\x49\x97\xc6\x36\xa7\x16\x04\xd9\x26\x62\xe0\xd1\x2b\x05\x06\xa6"
- "\x7e\xab\x2d\xeb\xd4\xb2\xd0\x18\x98\xba\x33\x3c\x06\xa6\x3a\xc2"
- "\x63\x60\x6a\x1b\x61\xc0\x05\x8f\xc6\x69\x6d\x73\xaa\x47\x5b\x77"
- "\xcc\x97\xdb\x26\x5c\x3e\x18\xdb\xc4\xbe\xd0\x15\xe1\xec\x50\xee"
- "\xff\xeb\xe8\x5c\xb6\x41\xc8\x4c\x9c\x33\x04\x8f\xd6\xd3\x3b\x24"
- "\xf4\xf1\x56\x92\x61\x0d\x1f\xa3\x3d\xba\x4f\x2d\xc7\xcd\x62\xac"
- "\x55\x74\x0c\x1e\x7b\x80\xd6\xec\x09\x79\x4e\x8b\xd4\xd6\xff\xd1"
- "\xb6\xd0\xf2\x7c\x94\xde\x53\x14\x85\x96\xe7\x63\xc6\xf0\xf2\x7c"
- "\x6c\x0c\x7d\x03\x3e\xd0\xa6\x1e\x4b\xa3\x33\x37\x95\xb6\xe9\x24"
- "\x3c\x56\x7d\x61\xed\xd3\x63\x85\xda\xf6\xe9\xb1\x9c\xc1\xb7\x4f"
- "\x8f\x39\x42\xb7\x4f\x8f\xb5\x86\x6e\x9f\x1e\x73\x0b\x7b\x98\x96"
- "\xa8\xb5\x87\x69\x06\x2d\x26\x50\x76\x97\xac\x7d\x9a\x66\x0b\xb2"
- "\x81\x2d\x98\xdf\x59\xec\x53\xbc\x2a\xf4\x36\xfd\x33\x6d\x19\xa7"
- "\x55\x84\xd6\xdb\xb4\x5d\xa8\xb7\x2d\xa1\xf5\x36\xad\x31\xbc\xde"
- "\xa6\xb5\xa3\xde\xb6\x0c\xd4\xdb\x34\xdf\xe0\xfb\x14\xd3\x93\xb4"
- "\x3a\x9b\x6e\x1a\xbc\xce\xa6\x17\x84\xd6\xd9\xf4\xb2\xd0\x3a\x9b"
- "\xbe\x53\xe8\x6c\x7a\x9b\x56\x67\xd3\xf7\x69\x75\x86\x72\xbb\x64"
- "\x3a\x9b\x31\x26\x48\x67\x4b\x8f\xc1\x8c\x0f\x51\x67\x2d\x42\x67"
- "\x19\x2f\x6b\xcb\x38\x23\x3d\xb4\xce\x66\x64\xa3\xce\x96\x86\xd6"
- "\xd9\x8c\xc2\xf0\x3a\x9b\x51\x89\x3a\x5b\x3a\x50\x67\x33\x76\x0f"
- "\x5e\x67\x33\xda\xb5\x3a\x9b\x71\x60\xf0\x3a\xcb\x48\x0c\xad\xb3"
- "\x8c\xd4\xd0\x3a\xcb\xb0\x08\x9d\x65\x94\x6b\x75\x96\x91\xa7\xd5"
- "\x19\xca\xed\x22\x75\x86\xfa\x49\x17\xeb\x75\x33\xfe\xda\xc5\xe7"
- "\xb4\x33\x3a\x5c\x90\xb9\x5b\xbc\x13\xc8\xe4\xd8\x91\x75\xf8\x31"
- "\xd2\xb4\x0d\x6c\xbb\x33\xf5\x72\xd8\xd3\x03\xf5\x90\x69\xc6\x76"
- "\xb5\xb3\xa1\x90\xaf\xeb\x12\x3a\x24\x99\x23\x9d\x98\x23\xcb\x4c"
- "\xa5\xb4\xa8\x63\xe6\xf4\xfa\x80\xda\x62\xa4\xf7\x10\x1f\xda\xaf"
- "\x24\x88\x57\xee\x60\xfa\x65\xe1\xd7\x98\xff\x25\xdd\xb1\xee\x76"
- "\xe4\xf7\xf8\x7a\x81\xd5\xcc\xe0\xfe\x6f\x2d\xc6\x3d\x29\x70\x3a"
- "\x33\x68\xce\x24\x33\x4c\xff\xf7\x71\xea\xff\xd6\x86\xc6\xe9\xe3"
- "\xe7\xe8\xff\x3e\x4e\xfd\xdf\x5a\xd5\x78\x75\xc4\x5c\x9f\x2b\x68"
- "\xbc\xfa\x78\x4e\xac\x47\x60\x87\xf7\x63\x37\xfe\x25\xbd\xdb\xfe"
- "\x78\x59\x50\x99\x51\x37\x4f\x44\xca\x65\x0e\xd2\xcf\xe3\x3b\xc3"
- "\x94\x79\x1f\x96\xf9\xe3\x30\x65\x6e\x3d\x47\x99\xa9\x6d\xfe\x78"
- "\xa0\x6d\x3d\x11\x2d\xe3\x20\xc4\xb8\xfc\x89\xc4\xd0\xfa\x7f\x22"
- "\x48\xff\x60\x29\x28\x64\x6e\x9e\x5e\x4b\x67\x55\xd3\xd1\x5a\x7d"
- "\xa2\x25\x8c\x84\xa0\xad\x08\xe6\x19\x86\x6e\xdf\x00\xec\xd1\xb7"
- "\x05\x21\xb1\xf7\x44\x87\xb0\xc7\x99\xa9\x5a\x7b\x9c\x09\x5a\x7b"
- "\x44\x59\x6b\xd2\xcd\x34\x6b\xe3\x33\xdd\x97\xce\xc7\xce\x2c\x0f"
- "\xc2\xc0\xe7\xc7\x20\x2b\x46\x60\x20\x6b\x61\x50\x39\xea\x43\x63"
- "\x60\xa6\x03\xeb\xff\x79\x68\x0c\xcc\x6c\x0b\x8f\x81\x99\xb4\x86"
- "\xf8\x73\x35\x6e\x67\x16\xa6\x0e\xd3\xd2\x64\xc5\x87\xf6\x79\x59"
- "\x13\x43\xcf\xeb\x64\x4d\x13\x32\xce\xda\xa0\x95\x71\x56\x8e\x56"
- "\x86\x58\x97\x8b\x97\x61\xdf\xbe\x61\xdd\xf6\xac\x60\xfb\x77\x1e"
- "\x83\x27\x65\xfb\x7f\x6a\x7a\x50\x19\xe5\xf1\x4f\xa8\xb9\xac\x27"
- "\xa3\x51\x96\xce\xd0\xb2\x7c\x32\x31\x74\x9d\x9f\x4c\xc5\x36\xc8"
- "\x19\x18\x60\x4b\x4f\x5a\x30\x7c\x26\x3f\x2b\xf2\x2c\x18\x6b\x30"
- "\x7c\xa6\x0f\x0c\xbc\xbd\xea\x6b\x97\x9e\x2c\xa4\x39\x72\x3e\xc7"
- "\x8c\xf8\x8d\x8d\x87\x4c\x6a\x83\xa8\x5c\xf3\x0a\x83\xdf\x89\x3e"
- "\xc9\xe7\x3f\x68\x1d\x0b\x7d\x57\x13\x6b\x83\x4c\xa7\xc7\x07\x0a"
- "\xde\x89\x3e\x88\x77\x2b\xd9\x05\xd1\x2b\xb4\x62\xae\xb3\x38\xc8"
- "\x37\x3d\x05\xa1\x75\xfc\x94\x29\x3c\x76\x9e\x9a\x28\xf4\xfc\x94"
- "\x55\xab\xe7\xa7\xa6\x05\xec\xc3\xb3\xa8\xae\x88\x81\x41\xd9\x09"
- "\xbd\x3b\x0d\xeb\xef\x5f\x99\xd5\x9a\xb7\x0e\xae\x3b\x0e\x4f\xb5"
- "\xf0\xfc\x24\xe6\x8d\x5d\xaf\x83\x06\xee\x03\x9e\x16\x67\x12\x22"
- "\xcd\x3c\x1f\x48\xec\x95\x97\x5a\x29\xae\xd6\xce\xbc\xfc\x2c\x4c"
- "\x3b\x6b\xa1\xfd\x7e\x10\x0b\x57\x1c\x85\xa7\xbe\xd1\xa4\xc7\x56"
- "\xcf\x29\x78\x24\x88\xf9\xfd\xa7\xcd\xca\x3c\x7c\xb8\xf9\x7d\xa4"
- "\x49\x53\xd6\xfd\x8a\x77\x61\x4f\x27\x87\x6d\x97\xb1\x4c\xf4\xed"
- "\x38\x95\xe9\xdc\x7e\xe0\xe9\x4a\x05\xbf\xe2\xdd\xdc\xd3\xf5\xfd"
- "\xdf\xb6\x3c\xbd\x07\xe3\x66\x9f\x63\x3e\x57\x65\x07\x4f\xbb\xd4"
- "\x7c\xc4\xde\x79\x4f\x7b\x94\xef\x53\xba\xed\x16\x38\x0f\x2f\xb9"
- "\x3c\x96\x44\x6d\x79\x2c\xc9\xd8\xb7\x9c\x2d\xf3\x48\x3b\x0f\x8f"
- "\x38\xe7\xce\x49\x30\x2e\x00\x11\xc7\xe1\xd9\xd7\x2a\x68\x8d\x4e"
- "\x55\x07\x44\xfb\x40\x2f\xc6\x76\x96\x37\xe9\xdb\x10\x1a\x1b\x3a"
- "\x7d\xf7\x3b\xe8\x1d\x1c\x5f\x43\x60\xba\xdf\xd1\x64\xf3\xcb\x7b"
- "\x9b\x59\xde\x23\x99\x36\x59\x4f\x39\xaa\xb6\xb3\x8e\x6a\xbe\xa7"
- "\x95\x45\x33\xfe\x2b\xa3\xf5\x3f\xb4\x0e\x63\x1d\xdc\x7f\x0c\x9e"
- "\x79\x40\xd8\xfa\xb3\x41\x7d\x52\x4b\x98\xf1\x9f\x85\xc6\x7f\xf7"
- "\x87\xb6\xf3\x67\xce\x31\xfe\x7b\x86\xc6\x7f\xf7\xab\xdb\x4d\xf1"
- "\x9e\xe7\x99\x34\x75\x9f\x94\xf6\x9d\x32\x3f\x4f\xfd\xcc\x67\xfe"
- "\xf3\xb6\x0a\x30\xfa\xe8\x9d\x36\xda\xa6\xb3\xa3\x81\xec\xd5\xd8"
- "\xe4\xde\x4b\xfb\x30\x18\xe8\x0c\x6f\xd1\x96\x91\xbd\x3e\xc3\xe7"
- "\x0b\x63\x7d\xc2\x16\x8b\x6c\xcc\x3d\xa6\x1d\x31\xb4\xd4\xaa\xf0"
- "\x2a\x58\x6b\x15\xdf\x7d\x0c\x6f\x87\x61\xce\x0e\xde\x2e\xea\xa8"
- "\xbf\xca\xfb\xad\xbe\x6f\x81\xf8\xee\x2f\x6c\x02\xe2\x1b\xe8\x6b"
- "\x27\x39\xef\x76\xb2\x71\xe2\x49\xbc\x9b\x91\x8e\xf8\x12\x9d\x52"
- "\x0f\xf1\x6d\xcc\xb3\xd1\xea\xba\xf3\xf9\x17\xcc\x1b\xc3\xa7\xd2"
- "\xbc\x8a\x93\xd2\x15\xcd\x62\xe3\xda\xe9\x9d\xd9\x29\x07\x2b\x7a"
- "\x89\x8d\x5b\x46\x73\x62\xcf\xf2\x73\xda\x3f\xfe\x1f\xd7\x90\x82"
- "\x51\x60\x90\xc3\xb2\x1a\xcc\x5e\xc4\xdb\xb3\x95\x5a\x1f\xf1\x6c"
- "\x50\xff\xd7\xc2\xc7\x99\x78\xcf\xa5\xf5\x89\xf2\xfa\x55\xf2\x07"
- "\xcc\xe9\xeb\xe6\xf8\x38\xd7\x9a\x0a\x7a\x27\x4d\x6b\xa2\xc4\xbe"
- "\x6a\xcf\xba\x82\xe6\xde\xdc\x9b\xf9\xba\x9a\xc3\x98\xef\xac\xc5"
- "\x02\x23\xb3\x17\x6b\x75\x3a\x0b\x8a\x4e\xd0\xbb\x20\xd1\x1e\xcc"
- "\xf5\x05\xfb\xc7\x59\x66\xa5\xef\x16\x14\x9e\xac\xb4\x07\xe6\x25"
- "\x9c\x6f\x50\x3b\x33\x8b\xf7\xff\xfd\x03\xda\x85\x59\x79\x58\x3f"
- "\x0d\x26\x9b\x39\x86\x66\x95\x34\x79\x10\x37\xcb\x08\xff\xb3\x69"
- "\xed\xcb\x7a\xfa\xe6\x10\x9f\x87\x9d\x84\x59\x7b\xfd\x76\x30\x34"
- "\xb9\xf9\x37\x55\x46\xc4\x08\xc7\x2d\xb5\x1b\xe3\xc5\x7a\x24\x4f"
- "\x50\x1e\x07\x15\x99\x13\x4d\xf3\xb2\xc3\x20\xd6\x53\x10\x16\x66"
- "\xd5\xd3\xda\x8c\xe1\x9d\x30\x8c\x78\x29\x18\x72\xfa\x5a\xa1\xd9"
- "\x17\x3c\xe6\x99\x1d\x1f\xba\xee\xb3\xa9\xfd\x7f\xdd\x05\xb3\xcb"
- "\xb4\xba\x9d\xcd\xdb\x7f\xe5\xbd\x8e\x0b\x65\x10\x94\x2e\x57\xab"
- "\xfb\x59\x3c\xbf\xb0\x6b\x7c\x4a\xfe\x32\x0d\xc7\x33\xf3\x3c\x7c"
- "\xbd\xd7\x6c\xb4\xff\x67\xf7\x9d\xcb\x0f\x32\xc3\x5f\xa6\x05\x90"
- "\x56\x5e\x17\x8c\x7e\x6b\xb6\x5b\x33\x67\x34\x92\xcf\x19\xcd\x3b"
- "\x06\x73\xe4\x77\x3f\x73\xef\xd4\x96\x6f\x4e\x74\xf8\xbe\xc1\x1c"
- "\x7a\xff\x33\x2f\xb4\xcf\x98\x93\x16\xba\x6f\x30\x67\xb6\xec\x17"
- "\xe6\xb1\xc8\x60\x1c\xcc\xb1\xa1\x8e\x79\x1a\x65\x0c\x4b\x73\xa1"
- "\xe1\xc7\xb0\x73\xea\xfb\xc6\xb0\xcb\xc8\x1f\xcc\x29\xef\x1b\xc3"
- "\xba\x43\x8d\x61\x5d\x21\xf4\x39\xa7\x33\xb4\x3e\xe7\xea\x43\x8f"
- "\x61\xe7\xc6\x8b\x76\x7e\x6e\xa6\x56\xcf\x73\x27\xf6\xbf\x13\x9e"
- "\x13\x7d\xe9\xfa\xc3\x73\xeb\x06\xf6\x87\xe7\x5d\x2b\x74\x35\x6f"
- "\x4e\x50\xd9\xf6\x86\xf6\xed\x73\x5b\xc2\xf7\x87\xe7\x76\x86\xf7"
- "\xed\xf3\x0c\x03\xfb\xc3\xe6\xa1\x41\x34\x63\xfa\xfa\x4a\x9a\xbe"
- "\xd9\xbc\x34\x21\xa7\x79\xd4\x9f\x8b\x50\xd1\xcf\xd6\xe2\x1d\xcb"
- "\x8c\xfc\xd0\xb7\x1d\x27\x9f\xa6\x60\x26\x9c\x4c\x68\xef\xa5\x1b"
- "\x2b\x20\x12\x6d\xe0\xf3\x6e\xfb\xbc\x3e\xfc\xd3\x3a\x3e\xca\x87"
- "\x7c\x64\xd8\xf5\x74\x92\x52\x3e\x5e\x8e\xf6\x73\xbd\x2f\x8d\x30"
- "\x41\xe6\xd6\x01\xf2\xc8\xe6\xfd\x3f\xe2\x71\x6e\x9d\x65\x67\x05"
- "\xd9\x98\x47\xac\xc3\x9d\x3f\x4a\xe8\x6d\x7e\xd0\x58\x36\x3b\x8f"
- "\x7f\xd3\x17\xd6\xdf\x66\x97\x87\xc6\x68\x76\x7d\x9f\xbf\x5d\x46"
- "\x7c\xb3\xbf\x0e\x8a\x6f\x14\x3a\x98\x6f\x0e\x44\xaa\xe7\xba\xb3"
- "\x5d\x5a\x9f\x94\xdd\xa8\x4d\x37\x3f\x68\xfc\x97\x9d\x47\xf1\x17"
- "\xd6\xde\xcc\xcf\x0c\xdf\xde\xcc\x3f\x22\xea\xbf\x20\xe8\xfd\xf2"
- "\xfc\xbc\x73\xb7\x37\xf3\xc3\xd4\x7f\x7e\xbd\xb6\xbd\x59\x10\xf4"
- "\x8e\x7e\x7e\x63\xe8\xf6\x66\xbe\x4b\xf1\x33\xc2\x6f\x2c\xb8\xe7"
- "\xc2\xfc\xcd\x02\x93\xd6\xdf\x2c\x80\xf3\xf9\x9b\xfd\x03\xfc\xcd"
- "\x82\xd9\xb1\x55\xa1\xea\xb2\xa0\x20\xb4\xbf\x59\x50\x26\x74\xb8"
- "\xa0\x5d\xeb\x6f\x16\xec\xd4\xea\x70\x7e\x90\x0e\x17\x04\xbd\xff"
- "\x9e\x9f\xf7\x5d\x7d\x52\x44\x44\x84\x14\xa1\x93\x74\x11\x40\x87"
- "\x51\xe9\x60\x58\x84\x3e\x62\x08\x5e\x43\xe5\xfb\x30\x29\x42\xd2"
- "\xe3\x35\x44\xbe\x0f\x0d\x7a\x1e\x46\x69\xf1\xd2\xcb\xf7\x21\x41"
- "\xcf\x43\xcf\x13\x3f\x4c\xce\x57\xc9\x5f\x1f\xf4\x3c\xe4\x3c\xf1"
- "\x43\x2f\x32\x3d\x0c\x78\xd6\x7e\x07\x39\x75\xc9\x8a\xf9\xb9\x8b"
- "\x72\xf8\xba\xf6\x85\xe6\xf9\xcf\x3d\xb7\x30\x3f\xdf\x5c\xb0\xd4"
- "\xfc\xe0\x03\x4f\xdc\x3e\xc9\x2c\x96\xc7\xe7\x4e\xbe\x29\x27\x0a"
- "\xa6\xaf\x5c\x46\x11\xd3\x67\x4e\xb5\x98\x33\x1f\x7c\x40\x1b\xa9"
- "\xb0\xe1\xcb\xe0\xcf\xc5\x45\x65\x7b\xa9\x1b\x47\x02\x94\x6d\xe7"
- "\x7e\xa7\x9d\xbe\x3d\x17\xe3\x89\x45\x0f\x1c\xa0\xef\x97\x7b\x8a"
- "\x18\x7d\x57\x71\x14\x72\xfe\x44\x95\x18\x5b\x57\x0c\x79\x0b\x68"
- "\x3f\x95\x85\x3a\xf6\x4b\x37\x98\x1f\x05\xe9\x28\x2c\x79\xbc\x21"
- "\x1d\x69\xf1\xd9\xe9\xf2\x81\xb9\x88\xfa\xb6\xd6\xbf\x62\x9c\x8e"
- "\xdd\x17\xc0\x30\x8f\xfc\x7d\xbe\x55\xc7\xc3\x7e\x59\xac\xd0\xc5"
- "\x1e\x83\x85\xef\xb2\x5f\x32\xfe\x4c\x7b\xd6\x08\xba\x85\xab\x98"
- "\x94\x93\x4c\x7e\xa1\x6a\x04\xe8\x69\x5d\xf6\x9b\x23\xc0\xf0\xe6"
- "\x48\xda\xcb\x76\x61\xae\xb2\x2e\x7b\x23\x3e\xbb\x60\x49\x26\xe5"
- "\x4d\xb4\x01\x29\x67\x01\xd1\xd7\x68\xe9\xab\xfa\xd7\x71\x2f\xcc"
- "\x95\x90\x2e\xe3\x6b\x88\x8d\xf5\xb3\xbf\x7a\xa3\xbe\x2e\x1e\x97"
- "\x8e\xfd\x34\x54\xc5\x01\x5f\x31\x88\x6f\xa3\x16\xfe\x69\x95\x9f"
- "\xf9\x68\xcf\x84\xe9\x9d\x45\x6c\xcb\x62\xd0\xa3\x3d\xeb\x1c\xcb"
- "\xe8\x5b\x8a\x85\x07\x6a\x17\x82\x1e\xeb\x1f\x7f\x1c\x9e\xf7\x99"
- "\x67\x60\xbf\x71\x3a\xe8\x7f\x6b\xa3\xef\x5d\x3b\xdf\xda\xfc\x07"
- "\xd0\x7f\xd0\x53\x2c\xf5\x30\x13\x14\x16\xb0\x0e\x46\xfb\x5b\x7b"
- "\x98\x97\xd6\xdb\x1e\xc8\xf6\x13\x4d\x69\x77\x91\x09\x9a\x0b\x3c"
- "\xb0\xb6\x8d\x79\x4b\xfe\x20\xf6\xab\x68\xea\xf4\xd0\xf7\xb3\x86"
- "\xb5\xd3\x21\xe2\x98\x05\xa4\x26\x6b\x25\x38\x67\x7b\xa0\xb0\x8d"
- "\x75\x1c\xc8\xfe\x13\x34\x5b\x77\xc3\xbc\x56\x90\x0e\xb4\x1f\x01"
- "\xbe\x47\xf3\xe6\x04\x5a\x27\x6e\x5a\xbb\x88\xc2\xbe\x85\xd5\x6b"
- "\x21\x66\xf5\x1f\x69\x1c\xd4\x8a\xf9\x9c\x80\x67\x0f\x82\x0e\xf9"
- "\x49\x6b\x8e\x80\x69\xcd\x33\xf4\x9d\x79\x2a\x54\xad\x03\x13\x2b"
- "\x4a\x8c\xee\x29\x4a\x34\xf6\xb0\xc4\x11\xdd\x45\x89\x71\xcd\x79"
- "\x48\xdf\xfe\x19\x0c\x6f\x85\xb8\x5f\x1e\x6f\x95\x2a\x4f\x43\x3c"
- "\xd5\xe9\x18\xd6\xad\xea\x34\xd2\x97\x9e\x75\x04\x30\xad\x3a\x8d"
- "\x2f\xf2\x6c\xab\xd3\xe2\x85\x00\xf2\xaa\xec\x81\xf8\xaa\x1e\x30"
- "\x05\x36\x9e\x75\x50\xba\x4e\x78\xe1\xac\xf3\x00\x40\xe1\x5a\xe6"
- "\xef\x2d\xfd\xa6\x18\xfd\xe1\xb0\x8f\x17\xec\xd5\x3b\x0f\x74\x42"
- "\x93\xa7\x07\x9a\xe1\x30\x38\x6d\x7f\x76\x7c\xb0\x60\xef\x10\xec"
- "\x4f\xea\x1c\xab\x69\x0d\xbc\xc0\x4e\x51\x13\xed\x9f\x57\x0c\x5b"
- "\xd6\x41\x74\xde\x6a\x18\x76\x1c\xc3\xb9\xef\x29\x69\x2b\x71\xfa"
- "\xfe\xec\x58\xcd\xbf\x07\x5f\x92\xb9\xae\x09\x22\x9a\x3d\x95\xf4"
- "\xdd\xb1\xe4\x1f\x9e\x60\x74\x7a\x5a\xc0\x99\xf7\x95\x23\x10\x7d"
- "\xa3\xb7\x2c\x00\x86\x0f\xcf\xb4\x48\x4e\xfd\x19\x70\x5a\x3c\xf0"
- "\x39\xe6\xcd\x36\x27\xc4\xa3\xcf\x4a\x6d\xf6\x78\x69\xff\x9d\x24"
- "\xd6\x65\x8a\xda\xb2\x0c\xc6\xd4\x9c\x86\x84\xea\xd3\x90\xc8\xba"
- "\x13\x25\xfa\xc6\x9b\xf6\x4b\xab\xc6\x7b\x34\x8e\xc1\xb0\xee\xe2"
- "\x3b\xee\x18\xf9\x5b\xef\xde\x44\xa8\xed\xe9\xff\xd6\xbb\xa7\xab"
- "\xff\x5b\x6f\xc4\x54\x1e\x7d\xef\xed\x82\x17\xf4\xb1\x07\x60\xd8"
- "\x51\x58\x98\x48\xf8\xde\x72\x12\xf4\xaf\x9c\x04\x18\x57\x2c\xd1"
- "\x38\x53\x8f\xd8\xff\x93\x13\x75\x43\xbf\x8f\x82\xb5\x0a\xef\xd1"
- "\x78\xe1\x78\xce\xca\xf7\xaa\x68\x97\x71\x8c\x61\x12\x86\xbd\x8a"
- "\xf7\x08\xbc\xaf\x2d\xaa\x62\x6e\xcc\x8b\xf6\xa0\x89\x22\x3c\xcb"
- "\xdf\x97\x5b\xba\xed\xd6\x02\x17\xbc\x56\xa8\xe0\x5a\xf8\xf7\x85"
- "\x79\x9f\x1f\x3d\x41\xfb\xa8\xbb\x79\xb9\x7a\xad\x3a\xda\x53\x5d"
- "\x0e\xa7\x32\x1c\xa1\x7c\x31\x7f\x07\xde\x63\xc5\x18\xd4\x9a\xa5"
- "\xa4\xed\xea\xb5\x52\x9e\x7f\xc4\x70\xa6\x84\x63\xbd\xf5\x14\xf7"
- "\x8b\xa3\x27\x24\x41\x93\x28\x21\x4f\xaf\xcc\x1f\x6d\x7f\x61\x1c"
- "\xd9\x78\x97\x14\xcb\xf6\x67\x4f\x84\xaa\xed\xec\x40\xf5\x76\xd6"
- "\x20\x6c\x6f\x91\xc9\x05\xaf\x3b\xa8\x8c\xd8\x86\x37\x94\x61\xdc"
- "\x7e\x33\x00\xc9\xa5\x21\x87\xd6\x97\x2e\x4a\x76\xc1\x65\x09\xea"
- "\x3a\x30\xfb\x73\x26\x6a\x47\x3f\x5a\xd7\x38\x04\x7d\x80\xa9\xb9"
- "\xbd\x13\x3e\xe8\xe9\x18\x52\xf4\x1b\x90\x9c\xbe\xa3\x30\x3e\x0e"
- "\x4c\x34\x27\x53\xbb\x9d\xb9\xf0\xde\x81\x57\x27\xe2\xe5\xda\xe3"
- "\xb0\xe8\xd5\xdb\xe2\x20\xee\x77\x36\x90\xfd\xd3\xa2\x6a\x95\x7f"
- "\xba\xa9\xc9\xb5\x57\xe5\x9b\x16\xff\x71\xa0\x6f\xca\xfd\xbd\xf0"
- "\x4d\x68\xfb\xdc\x17\xf9\x5d\x72\xf8\x67\x41\xe1\xf2\xf7\x2b\xb9"
- "\x6f\x07\x85\x7b\xe5\xf0\x4d\x41\xe1\x6e\x11\xfe\x52\x93\xe2\xfb"
- "\x9a\xa9\x1c\x2b\xc9\xf7\xbd\xf4\x09\xf9\xbe\xe6\x6c\xd9\xf7\x71"
- "\xff\xf3\xd2\x36\xf6\x13\xf4\x45\x2b\xc8\xdf\xbc\xb4\x98\xca\xcf"
- "\x7e\x09\x4a\xd9\x23\x31\x6c\x2c\x85\x95\x1f\x06\x3d\x5e\x8a\xdf"
- "\x2b\x22\xbf\x47\x3e\x8f\x7c\xdf\x8e\x91\xac\x75\xc7\x76\x76\xb0"
- "\x8a\xef\x0b\xfd\x62\x9f\xff\xfb\x31\x86\x95\x61\xd8\x8f\x31\x9e"
- "\xfc\x20\xc9\xa4\xc9\xb2\x97\xe6\x06\xda\x59\x49\x67\x65\x40\x4a"
- "\x82\xcd\xa8\x6f\xda\xff\x6a\x03\xca\x37\x56\x07\x79\xce\x02\x0f"
- "\xff\x0e\x85\xf6\x20\x6f\x2e\x68\x27\xbb\x1b\xf9\x4a\x80\xe6\x29"
- "\xfe\x04\xeb\x3c\xec\x38\x7d\xab\x42\x65\x98\xb7\xea\x51\xda\x4b"
- "\x5b\xd7\x60\x05\xa0\x7d\x09\xc8\x67\x63\x59\xf4\xe5\x58\x26\xb1"
- "\xff\xef\x4b\x09\xd8\x93\x49\x17\xba\x5e\x92\x49\xfb\xf5\x1f\x85"
- "\x17\xad\xcc\x8e\xfe\x11\xeb\x16\xeb\x2f\x06\xda\x9b\x05\x6d\x8c"
- "\xf6\xd3\xb2\xee\x90\x02\xd6\x72\x65\x7f\x16\x3a\xbb\x01\x69\x9c"
- "\xad\x5e\xa0\x32\xbb\xe0\xc5\x3d\x4d\x85\x7b\x29\xbd\x85\x64\xc3"
- "\xec\x45\x0a\x0f\x1d\xe7\x21\xf1\xb9\x5b\xab\x0b\x5e\x4a\xe7\xe9"
- "\xa3\xbe\x29\x6e\x9a\xed\x06\xf2\xfb\xce\x0e\xe4\x51\x78\x54\xf0"
- "\x40\x5e\x0c\xdb\x00\x4d\x9c\xcc\x3f\x66\x2d\xfb\x2b\xf2\x4f\x20"
- "\x7d\xd1\x3e\x5d\xb4\x4e\x09\xe5\x12\x4d\x7b\x35\x88\x7e\xe8\x8b"
- "\x1f\xd6\x1e\x06\x90\xf7\x1a\x43\xbc\xbd\xb8\x8b\xf6\xf2\xa2\xfd"
- "\xc5\xce\xb5\xb7\x18\xca\x28\x41\xd9\x5f\x2c\xb0\xf2\xd2\xee\x2d"
- "\x86\xbc\x4d\x35\x12\xdb\x8d\xe5\xdf\x45\xfb\x8b\x61\xf9\xa3\x09"
- "\x87\x72\x9d\x76\x6f\x7b\x96\x64\xbe\xc8\x43\x61\x5b\xec\xac\x51"
- "\xd1\x3f\xd5\x97\xea\x82\x71\xad\xa2\x7f\xc8\x5a\x5c\x90\xbb\x9b"
- "\xe2\x31\xac\x81\xe8\xc7\xa3\x1f\x73\x62\x1b\xf6\xf1\x51\xbf\xb4"
- "\x65\x35\xe8\x85\x4f\x5b\xfc\x1b\x4a\x2f\x7c\xda\xe2\xe2\x7e\x9f"
- "\xb6\x78\xb9\xf0\x69\x42\xc6\xc2\xa7\x2d\x5e\x24\x7c\xda\xe2\xf9"
- "\x7c\x3d\x11\xfa\x34\x8a\x23\xbf\xa6\xf8\xb4\xea\x91\xac\x91\x7c"
- "\x47\xb7\x7d\x71\xa6\xe2\xdb\x36\x61\x18\xf9\x0e\x2a\xa3\xf0\x53"
- "\x2f\xd5\xb3\x2f\x13\x41\xac\xd7\xa4\xdf\x56\xda\x3f\xa3\x43\xfe"
- "\x8d\x7a\x59\xfc\x2b\xe1\xe3\x16\xef\xec\xf7\x71\x8b\x13\xfb\xd3"
- "\x92\x8f\x5b\xfc\x9f\xc2\xc7\x89\xf0\xda\x67\xc9\xc7\xbd\x54\x4f"
- "\x32\x90\xf9\x4b\xf4\x1e\x4d\xa6\x47\x39\x2e\xda\xad\xf6\x71\x5a"
- "\xfb\x5a\xec\x53\x7c\x1c\xf9\xb6\x6e\xfb\x92\x68\x17\x44\xf1\xfd"
- "\x51\xc8\xce\x2a\x50\xe6\x8a\xdd\x91\x0e\xa8\xce\xb4\x2f\x3f\xc9"
- "\xed\xa1\x13\x30\x4c\xde\xb7\x46\xae\xf7\x92\x74\xe5\x1b\x4d\x17"
- "\x2c\x1e\xb8\xa7\x19\xf4\xef\x4b\x86\xba\xbe\x9e\xf6\x73\x74\x16"
- "\x1f\x05\x67\x25\x2b\x6e\xf6\xb5\x41\xe0\x95\x97\xbe\x26\xbd\xe2"
- "\x78\xe3\x5e\xba\x93\xdf\xc1\x76\x74\xe3\x3c\x0f\x9f\xbf\xff\x7a"
- "\x8b\x84\x71\x36\x4d\xdc\xbb\x94\x07\xcd\x2b\xe2\xef\xbc\x70\xf3"
- "\x08\x83\xc8\xeb\xdb\xf0\x79\x2d\xbd\x9c\xe7\x85\x7d\x29\x1c\xf7"
- "\x5c\x7e\x12\x96\xf0\x77\x68\x7c\x4f\xe6\x90\xbc\x96\x3e\x20\xc7"
- "\x47\x84\x89\x9f\x7f\x9e\xf4\xeb\xcf\x93\xfe\x6d\xf2\x41\xf4\x3d"
- "\x9e\xdf\xae\xe5\x33\xdc\xa7\xd0\x1d\x27\xba\xdf\xc8\xef\x41\xbe"
- "\x2e\x1a\xc5\xc7\x65\x26\x85\x27\xe1\x6e\x33\xd2\xf1\xfd\x6b\xd1"
- "\x47\xa6\xad\x02\xda\x3b\x58\x95\x36\x6f\x48\xbf\x7c\x97\xee\x3d"
- "\xc7\x3c\x4d\xb4\xb3\x12\xf8\xd9\x2f\xfb\xb1\x2f\x4a\xdf\xd2\x54"
- "\xf4\xbd\x7b\xc8\x9b\x8d\xfe\x32\x9b\x7f\xb7\x26\xbe\xdb\xed\x44"
- "\xff\x76\x3d\xed\xb1\x49\xfd\x4a\xf9\x5b\x8b\xab\xd0\x2f\x8f\xa0"
- "\x7d\x58\x68\xbe\x7a\x9e\x3f\x53\xda\xcf\xf7\xc4\xcf\xab\x54\xd2"
- "\x86\x9b\xdb\xa3\x7c\xe5\x3c\xf9\x77\x48\x98\xe6\x80\x92\x86\x78"
- "\xd3\xb7\x37\xd8\x1e\x5f\xcf\xf7\x37\xf3\x75\x92\x0f\xbc\x0a\xfb"
- "\xa0\x23\x44\x3e\xd9\x20\xf2\x79\x19\xed\x66\xc9\x81\x73\x7d\xe7"
- "\x14\xbe\x7e\x2f\xa7\x0c\xbe\x7e\x20\xd7\xef\x65\xdb\x79\xea\x77"
- "\xae\x7c\xf7\x0c\x3e\x5f\xa3\x92\xaf\x7b\xf0\x72\x5d\x96\x70\xe1"
- "\x72\x4d\x92\xe5\xba\xcc\x72\x1e\xb9\x86\xca\xa7\xec\xc2\xf3\x31"
- "\x2b\xf9\x38\x42\xe5\x03\xfc\x2f\xec\x7e\x3d\x06\xe5\xec\x15\x3a"
- "\x87\x48\x9c\x89\x90\x6f\x50\x9f\x31\x25\xce\x27\xca\x8f\x57\xce"
- "\x98\xea\xff\x8e\x2b\xff\x9e\x79\x75\xd4\xae\xb3\x80\x0b\xf2\x53"
- "\x68\xae\x2d\x6d\xad\xd8\x1f\x50\x4e\x93\x79\x9e\xb3\xad\xf4\xb4"
- "\x17\x3b\xe5\xcd\x18\xdf\x8b\xc5\x23\xf6\xd9\xcb\x7f\x8d\xbe\xc9"
- "\x13\x6b\x76\xf2\x1d\xc2\xfe\xf3\xab\x5c\xb0\x4c\xec\x39\x55\xfa"
- "\xcd\xd6\xae\x22\x99\xfe\x1a\x6a\x93\xfa\x68\x1c\x0a\x4d\xc8\x39"
- "\xbf\x52\xef\xee\x9d\xeb\x92\x34\xdf\x0f\x4e\x59\xb6\x6c\xe9\xb2"
- "\x49\xe6\xfc\xc5\x0b\xc6\xe6\x17\xcc\x2f\x58\x9e\xcf\x3f\x34\x8f"
- "\x02\x0c\x30\x17\x2c\x5a\xbc\x70\xe9\xf2\x82\xc4\x95\xf3\x17\x89"
- "\x0f\xd3\x47\x23\xa1\x9a\x08\x34\xe7\x91\x98\xd0\x87\xb4\x30\x89"
- "\xef\x21\xd1\x49\x75\xa2\xbd\x44\x94\xef\x6e\x1b\x4c\x00\x1e\x3b"
- "\xf9\x9c\x82\x1c\x17\x58\x32\x15\x39\xd2\xfe\x86\xd8\xef\x30\x1d"
- "\x87\x82\xf5\xa4\xfb\x0c\xec\x42\xd6\x8a\x7d\x21\xf8\xb7\xfd\xce"
- "\x02\x0c\x68\x06\x83\x63\x05\xcd\xa3\x16\x78\x03\xf6\xfc\x0e\xbe"
- "\x5f\xe3\xea\xe3\xf8\xbc\xfc\x5a\xa5\x9d\xa7\xf7\x42\xe2\x3d\xee"
- "\xf5\xf7\x1f\x85\x82\xe9\x94\x2f\xd9\x4d\xcd\xeb\xa0\x27\x5e\xcc"
- "\x5e\x40\xdf\x44\x03\x3e\x1b\xb0\x0c\x1d\x4a\x5f\x12\xcb\x1b\xcd"
- "\x22\xbd\x75\x2e\x58\x1e\xff\x5f\x46\x37\xc8\xdf\x6a\x1b\x6a\xc4"
- "\x77\xd9\xfa\x6e\xfb\xf2\xb8\x3e\x5a\x3b\xed\x5b\xec\xad\xa3\x73"
- "\xcb\x42\xca\x37\xea\x4c\x76\xa0\xd7\x32\x44\x5d\x67\x1c\x17\xa3"
- "\x7e\x96\x37\x61\xdd\xe3\x48\xd7\xf2\x7e\x22\x43\x31\xec\x53\xb1"
- "\x77\xf2\x99\x6c\x0c\x1b\x8a\x77\x1b\xe9\x94\xf6\x30\xc0\xb8\x12"
- "\x7a\xc7\xd5\x5c\x78\xca\xb1\xdf\x74\x14\x71\xbd\x1c\xfd\xdf\xdc"
- "\x0d\xe2\xbb\x33\xa4\xc7\x3c\x9c\xc5\x3d\xd0\x60\x66\x0e\x9a\x63"
- "\xc3\xb2\xb7\x37\x98\x3d\xc0\x22\x66\x7d\x4d\xe9\xd0\x2e\x4c\x45"
- "\x36\xea\x4b\x60\x38\xff\xbe\x6e\x79\xab\x22\xf3\x02\x33\x3b\x41"
- "\x34\xe1\xe6\x85\xa9\xbd\xdb\xc2\xdb\x82\xd3\x40\x6b\xa8\xda\x61"
- "\xb9\x2f\xd8\xdf\xdf\x94\x33\xc9\x9c\x33\xbf\xc0\x9c\xbb\x68\xc9"
- "\x42\x73\xce\xa2\x1c\xf3\x92\xa5\x05\xe6\x17\x96\xd2\x04\x0d\x4d"
- "\xc9\x68\x30\x11\xa0\xfa\xad\xb4\x0c\x51\xde\x41\x77\xad\xb4\x0e"
- "\xc5\xfa\xa3\x4c\x56\x3e\xd9\xd5\x6d\x1d\xa6\x95\xc9\xca\x7b\x04"
- "\x8e\x57\x94\x60\xd9\xc7\x88\xef\xf7\x22\x3a\xf0\x19\xeb\xbf\xdc"
- "\xad\xb5\xbd\x95\xaf\xca\xb4\x7b\x14\x5a\x8e\x8b\x1b\x8e\xf7\xc5"
- "\x6d\x91\xf1\x58\x2b\xbe\x33\xe6\xfb\xd6\xd4\xf2\x35\xf8\x2b\x3a"
- "\xc2\xa6\xa1\xbd\xba\x56\xc3\x73\x27\x61\xc5\xef\x99\x7d\x45\xbc"
- "\x8c\x21\x43\xa0\xe4\x4c\x9e\x8c\x1f\xc4\xc4\xca\xc4\x81\xf8\x59"
- "\xb9\x81\xf0\xc3\xba\x2d\x06\xbe\x5e\xc3\xe7\x45\x3f\x85\xcf\xd8"
- "\xbe\xba\x60\x45\x19\xd5\xc3\xb3\xd2\x62\x28\x7a\x93\xef\x9f\xf7"
- "\x0d\xbd\xfb\xa4\x33\x5f\x10\x2b\x91\x88\x0d\xd4\xd1\xca\x42\x45"
- "\x47\x0a\x7d\x68\x1b\xe6\x78\xd1\x62\x4c\xc8\xf3\x8f\x1c\x63\xd8"
- "\xbe\x63\x99\x24\x65\x9f\x3e\x6a\x03\xb0\x6c\x9d\x05\x6b\x19\xc3"
- "\x3c\x5c\x2a\x1c\x9c\x0c\x85\x03\xd4\xed\x73\xb9\x4b\x9f\x7b\x09"
- "\x0d\x7d\xd9\xc2\x82\xe7\xac\xb4\x37\x05\xf9\x01\xbe\xf1\xc5\x4d"
- "\x39\xe6\xe5\xf9\x0b\x9f\x8b\x82\x50\x54\x7d\x91\x6a\xfd\x1b\x03"
- "\x88\xd7\xae\x2e\xcb\x10\xfa\x46\x42\x7c\x13\xb1\xea\xdd\xae\x7c"
- "\x1c\x4b\x68\xf4\xbe\xea\x4d\xa7\x29\x09\xfb\x64\x49\xc0\xfb\xd0"
- "\x28\x33\xf1\x9e\x7f\xd5\x11\x92\x43\x97\xa4\xc3\xf6\xc0\x56\xa5"
- "\x60\x00\x7f\xd7\x63\x9d\xca\xfb\xd7\x58\xac\x6a\xeb\x92\x86\xb4"
- "\x91\xff\x11\xeb\x39\x8e\xa3\x1f\x88\xad\x3d\x0a\xab\xf8\x9c\x74"
- "\x0d\x6f\x4f\x6c\x6d\x4a\x9a\xcd\x7d\xdf\x29\xaf\x4a\x53\x70\xd2"
- "\x9f\xc6\xd6\x44\x61\x7c\xaf\x22\xfb\x4a\x2f\xe9\x9c\x09\xdd\xeb"
- "\x15\x3a\x94\x2b\xab\xe5\x7e\x64\x55\x52\xb0\x6f\xf8\x2f\x23\xbd"
- "\xd3\x16\xe5\xe1\xf8\x33\x9c\x49\xe7\xfb\x9e\x60\x5f\x0d\xcb\x33"
- "\x59\x5e\x5f\xd2\xc2\xdb\x74\x1b\xf2\xf2\x0a\x5e\xcc\x6e\xbb\x4e"
- "\xc9\x8b\x45\x9e\x49\xaf\xe5\x38\x5b\x55\xde\x3f\xe7\xb7\x2a\x85"
- "\xc6\xba\xac\xcb\x32\xd4\x05\xb6\x42\x8e\x2d\xfc\x5d\x70\xb5\xd8"
- "\x83\x8d\xf0\x46\xf5\x24\x5c\xf5\x63\x6a\x55\x8b\xa2\x6f\xaa\x33"
- "\xa6\xdb\x60\xe6\xfb\xf4\xae\xea\x50\x64\x19\x6e\xaf\x18\x6e\xb7"
- "\x06\x2c\x4b\xb7\xb0\x5d\x3e\x4e\x13\xfb\x03\xd1\x77\x2a\x11\x58"
- "\xc6\xbc\x63\xb0\xfa\x2c\xad\xbd\x8f\xf5\xd2\xb8\xe7\x0c\xdf\x5b"
- "\x46\x7c\x4b\xbe\x1a\xfb\xff\x2b\x52\xfa\xbf\x2d\x5f\x8d\xed\xbf"
- "\x2d\x45\xe8\x6e\xf5\xff\x4f\xdc\xfb\x80\x47\x55\x5d\x7b\xc3\x7b"
- "\x26\x03\x4c\xc2\x24\x13\x34\xe2\x88\x11\xc6\x36\x7a\xa3\x45\x8d"
- "\x4a\x79\x69\x5f\xac\x51\xf1\x5e\xbc\x0f\x0a\xb5\x7a\xdf\xf4\x96"
- "\x6b\x40\x12\x1b\x2a\xc2\x34\x84\x30\x60\xc8\x24\x03\xc6\x21\xe6"
- "\x9f\x12\x6d\x80\x10\xe2\x15\x6d\x6c\xb1\xa6\xb7\xb4\x46\x45\x1d"
- "\x25\xb6\xb1\x42\x26\x5a\xbc\x0d\x34\xd4\x21\xc6\x18\x70\x82\x43"
- "\x32\x64\x06\x32\x73\xf6\xf7\x5b\x7b\x9f\x33\x33\xc1\x84\x96\xde"
- "\xfb\x3c\x5f\x9e\x67\x72\xce\xd9\x67\x9f\xfd\x67\xed\xb5\xd7\x5e"
- "\x6b\xed\xb5\xd7\xca\x8b\x9b\x7b\x7e\x75\x3f\x7f\x0a\xc1\x88\xe8"
- "\x99\xc7\x7e\xb7\x98\xaf\xf2\xdc\xee\xc6\x3a\xed\x3b\xe1\x27\x20"
- "\x2c\xd7\xc4\x53\x6c\x63\x2b\xad\x11\xd4\x3e\x2f\xdb\x48\xf6\xd6"
- "\xc2\xee\x89\xd6\x5c\x81\x37\x16\x8a\x61\xb2\xf1\xe0\x79\x6d\xe8"
- "\xd1\xca\x52\xcb\xf6\x69\xcf\xe4\x37\xcc\xcb\x4a\xec\xed\xe9\x98"
- "\x53\x01\xd1\x87\xa9\xed\x45\x98\x5b\x01\xca\xf7\x78\x9a\x06\x43"
- "\xa4\x97\xe1\x19\xfc\x4f\x51\xa6\xdc\xd3\x09\x35\x4b\x5a\x54\x52"
- "\x44\x3e\xa9\x1c\x56\xf2\x2b\x38\x5f\xd2\x1b\xe1\x0b\x47\xbc\xbb"
- "\x59\x9d\xb3\x89\x74\xc6\x47\xd8\xb5\x04\xc2\x82\x36\x48\xdf\x09"
- "\x78\x8f\x39\x12\xa4\xd8\x2c\xa3\x05\x89\xb2\x6d\x8f\xbb\xa2\x75"
- "\x00\x27\xda\xc5\x1e\xe2\xe3\x76\xe9\x8b\x64\x0a\x64\xb5\xc7\x5b"
- "\xb4\xf1\xdb\xf2\x1c\xd2\x50\x26\xbe\x33\xb6\x0b\x5f\x5f\x8f\xb7"
- "\x6b\xed\x55\xdf\xe9\x05\x3e\x08\x18\x3c\x1e\x9d\xff\xc3\x97\x88"
- "\xbc\x7e\xad\x1e\x91\x17\xf9\x28\x3f\xc5\xec\x0c\x3a\x4b\x4c\xd1"
- "\x72\xa4\x0f\x14\x23\xd5\xd3\xde\x2c\xde\x65\xc6\x68\xd5\x46\xb1"
- "\x67\x2a\xec\xce\xd0\x0f\xff\xe3\x05\x89\x62\x0c\xac\x8c\xe2\x7b"
- "\x18\xa8\x3c\x89\x8b\x25\x4b\xb5\x6f\x12\x74\x04\xc7\x92\x55\x5a"
- "\xdd\x5a\x19\xd4\xfe\x0b\xd2\x3c\xd9\x17\x03\xcd\x11\xca\x4b\xe5"
- "\x0a\x9c\xd8\x48\x3c\x53\xc9\x19\x81\x83\xa2\x9f\x25\x1d\xf1\x63"
- "\x2d\x79\xb1\x92\x9e\x38\x7c\xa0\xf6\x44\xc7\xdf\xcb\x36\xa5\xcb"
- "\xb5\x64\x13\x8b\x6b\x63\x36\x9e\x53\xa3\xe3\x50\x29\xc6\x88\xe2"
- "\x2c\x8d\x1b\x07\x51\xcc\x15\xe4\x51\xb8\x68\x27\x8d\x07\x64\xa9"
- "\x79\xac\x1d\x74\x8f\xe6\x0a\x60\x82\x36\x6e\x7a\x96\xf0\x0a\xe5"
- "\x16\x8c\xc5\xcd\x4d\xf6\xb8\xf6\xea\x88\xae\x23\xad\x4a\xcb\x83"
- "\xf6\x09\x99\x4b\x83\x27\xde\xb5\x44\xc7\xf1\x16\x91\xb7\x4d\x6b"
- "\xe7\xdf\x58\x33\x54\x58\x6d\x3a\xad\xd6\xe1\xd7\xea\xc0\x3d\xea"
- "\x29\xf9\x1a\xaf\xfa\xf0\x86\xa2\x7c\xe9\x9c\x88\x16\xf9\xe5\x2b"
- "\x1e\xcd\xcf\x9b\x6d\x5d\xfe\x08\xb9\x31\x5a\xbb\x2a\x3f\xdf\x26"
- "\x36\x61\xc6\xf2\x81\x69\xa2\x3e\xc0\x41\xf2\xb2\x8e\x0d\xdb\xa4"
- "\xfd\x09\xcd\x0b\x9a\xef\x7e\x9a\xef\x07\x4a\x86\x84\x6c\xe2\x29"
- "\xbb\x85\x79\x42\xbc\x8c\xf8\x77\x41\xfb\xa8\xff\x96\x80\x5c\x07"
- "\x30\x9e\xb4\x46\x06\x9d\xa5\x0d\x63\xe1\x55\xda\x32\x76\x2e\x97"
- "\xb6\x8d\x4f\x27\x4a\x7f\x28\xe8\x84\x4b\xe2\x05\xd1\x27\xb2\xdd"
- "\xa7\x72\xf1\x8d\xef\xbc\x32\xc3\x31\x1a\xe5\x30\x6a\x34\x4a\xae"
- "\x13\x8e\xd9\x58\x83\xea\x64\x5d\x8e\x8c\x18\xde\x38\xf6\x48\xbc"
- "\x71\xcc\xf3\xb2\x67\xea\x35\x59\x45\xae\x1d\xa5\x46\xe2\x1f\x89"
- "\xa6\xe3\x7d\x8e\x56\x5e\xfd\x25\xb4\x6e\x38\x0a\xbe\xce\x3f\x38"
- "\xd2\x88\x7f\x20\xbb\x42\x82\x05\xda\x6a\x94\xf3\xc6\x51\x1f\x47"
- "\x7f\x52\xf1\xbc\x67\xbc\xb1\x7e\x98\x96\xe3\x1b\x68\xbb\xec\x86"
- "\x15\xab\x8b\x6e\x23\x17\x53\xf9\x76\x5b\xfe\x8a\xa2\xfc\xbc\xf3"
- "\xf7\xc9\x32\x35\x5e\x8c\xf6\xa8\xeb\x31\xef\xfd\x89\x04\x0f\x07"
- "\xfa\xe3\xcc\xd0\xfa\x20\xe8\x14\x78\x47\x95\xc6\x99\xfa\x59\xf9"
- "\xe9\xdd\xc2\xce\xae\x2c\x43\xc3\x13\xca\x77\x97\x9d\x2b\x48\x43"
- "\xff\x4b\x35\x7b\x40\xc8\xa4\x65\x0b\xb5\xe7\xd8\xf7\x65\xd2\x4f"
- "\xd2\x73\xc2\x26\x0f\x30\x2d\x37\xc5\xf1\x5b\x78\x2e\xeb\x53\x9f"
- "\x85\x1f\x25\xf2\xf9\xe5\x63\x65\xcf\x4b\xf8\x96\x61\xfc\x37\xa9"
- "\xb4\xa2\xdc\x2f\xcb\x61\xec\x85\x52\xff\xa4\xdd\x42\x3f\x5f\xd6"
- "\xa6\xd5\x87\xef\x7b\xe2\xeb\xa4\x75\xeb\xfc\xf2\xbc\xac\x4c\xec"
- "\x23\x6f\x16\x3e\xe0\xca\x02\xe3\xb4\xd5\x1e\x9f\x2f\xe8\x2c\xb7"
- "\xa0\xfe\x76\xad\xcf\x3f\xb0\x8b\xb4\xd9\x17\xe8\xa3\x4f\xed\x63"
- "\x0b\xe1\x16\xd5\x4f\xf8\xaf\xb6\xa1\x4a\xf5\x2b\xe2\xa5\xf8\x86"
- "\xd4\x7e\xe1\xdf\xcc\x42\xf3\xba\xbc\x0c\xeb\xbc\xe6\xef\xa5\x87"
- "\xfa\xb8\xaf\xd4\x6f\xd0\xfc\x4a\xc9\xef\xcb\xf3\xcf\x6b\xdb\xbe"
- "\xb8\x6f\x06\xdc\xdf\x20\xdd\x7b\xf9\xbd\xdc\xe9\x68\x25\x3c\x24"
- "\x7f\x53\xf5\x51\x3c\x2c\xf7\x7e\x1d\xef\xca\x17\x11\xde\xc5\xe3"
- "\xd2\xca\x5b\x56\x00\x93\xd6\xe6\x17\x7d\x57\x70\xf7\x60\xec\xc8"
- "\x6d\xd9\xf2\xa2\x95\x6b\x56\xaf\x9d\x6d\x5d\x9b\xb7\x5c\x9d\xf4"
- "\x63\xe6\xbc\x53\xc8\xee\x01\x6d\x9e\x05\x9d\xce\x45\x31\xda\xe2"
- "\x8c\xe1\x3f\xd9\x58\x89\xd8\xca\xce\xe7\xe5\x7c\x72\x16\xc5\xcd"
- "\x5d\xf1\x3d\xcd\xd1\xdd\x82\x67\x73\xc6\xaf\xff\x24\x1b\x27\x9e"
- "\x62\xce\xdb\x54\x98\x06\x24\x8c\x9d\x27\x44\x3f\x85\x3f\xad\xf2"
- "\x30\xf5\x53\xf8\x6f\x11\xfc\x99\xb3\x4b\xeb\x6f\x4c\x6e\x70\x0e"
- "\x08\x3e\x4a\xe5\xd7\x2e\x24\x97\xc7\xf8\xd3\xcd\x5b\x54\xdd\x59"
- "\xb7\x26\xe3\x69\xfc\x35\xda\x92\x27\x79\xd5\xcd\xb7\x2d\x2e\xe1"
- "\xa3\xb9\x76\xf2\x33\x47\x63\xb0\x79\xa5\xc6\x5b\x0a\xfb\xbb\xad"
- "\x23\x4b\x82\xce\xcd\xcb\xe2\xe9\x04\x4f\x78\xb4\x5b\xe5\x11\x97"
- "\x48\xd9\x75\xea\x6b\xbd\xa8\x8b\xf6\x0e\x2e\xd0\x36\xf4\x6b\x33"
- "\xe8\x5f\x7d\x1e\x95\x43\xfc\x35\x1f\xb6\xa8\xf1\x1d\xb7\x88\xbd"
- "\xc6\x26\x94\xed\xc7\xd8\x22\x1f\xf8\x3f\xa7\xc0\x0d\x05\x38\x4a"
- "\xb6\x37\x01\x8d\x47\x62\x9b\x23\xb4\x16\xe1\x1e\x78\xbb\x45\x3d"
- "\x93\xbe\x65\x89\x7f\x6d\x26\x1b\x1e\xb6\xe8\x87\xd7\xe6\x18\x48"
- "\x5f\x40\xb0\xf0\x34\x86\x98\xc4\x9f\x2d\x56\xd0\xa9\xae\xf8\xf2"
- "\xd4\xb2\x08\xa6\x06\x6a\x07\x5f\x6b\xd1\x13\x7e\x8b\x78\x80\xc3"
- "\x99\x58\x4f\x37\x0f\xf0\xb5\x99\xfa\x09\x7c\x67\x5d\xa8\x9f\x26"
- "\x2d\x76\x25\xd1\x2b\xe9\x9f\xff\x89\x57\xb6\x49\xdd\x80\x5a\xef"
- "\x96\x5f\x73\xfd\xf3\x62\x5d\xa9\x11\xeb\x0a\x67\xd2\xdf\xf9\x96"
- "\x2e\x61\x07\x6b\x7b\x5e\xc4\x44\x55\xcf\x57\xfb\xdb\x6d\x61\x11"
- "\x6b\xce\x51\x44\x7c\x5a\x98\xf6\x7d\xc4\xf9\xe1\x03\x45\x61\xf6"
- "\x83\x10\xe1\xe4\x13\x8c\x7c\xbd\x07\x04\xbf\xf0\x84\x49\xf3\xef"
- "\x4e\x71\x1a\xc1\x07\x33\xf4\x2b\x81\xc6\xdd\xea\x20\xdf\xfc\x4f"
- "\xf4\x91\xde\x55\xca\xe3\x16\x56\x03\x9e\x5e\x8e\xc1\x13\x0f\x52"
- "\x6c\x3c\x29\x2b\xf4\x62\x5c\x12\xbe\x40\xde\xc7\xe4\x1e\xb0\x46"
- "\x27\x9e\xf8\x9c\x6c\xcb\xbd\x6a\x19\xa8\x0b\xeb\xff\xe6\x3a\x59"
- "\x17\xca\x0b\x6a\xe3\xf9\xc4\x83\x5f\xd7\x6f\xc4\xca\xc3\xf7\x0f"
- "\xa8\x7c\x01\x93\xba\xab\xf7\xa8\xac\x76\x4d\x77\x15\xe3\x7d\x9e"
- "\xe8\xd6\x74\x57\xd2\x77\xf4\x96\x46\xaa\x7f\x22\x1d\x11\x77\xfc"
- "\x90\xf0\xde\x48\x3c\xdc\x84\xfc\x04\xd6\x77\x6a\xbb\xc6\x17\xca"
- "\xf1\xa9\xf8\x29\xf1\x87\x14\xc7\x54\xe3\x25\x25\x0f\x50\x51\x22"
- "\xd7\xb2\x8a\x65\xda\x5a\x86\x6f\xf7\xa9\xb4\x42\x5d\xe7\x2a\xa2"
- "\xf2\xef\xf8\x76\xf5\x15\x8d\x1a\x8c\x34\x98\x4b\x18\x55\x9c\x19"
- "\x4e\xfa\x72\x7f\x0c\xb6\x15\x67\x04\xac\xa3\xef\x9f\xbc\x21\x0e"
- "\xf6\xf4\x3c\x5b\xd2\xcd\x0a\xac\xff\x5b\x96\xca\x35\x45\xa6\xf1"
- "\xa4\xd0\x0b\xfc\xf1\x1c\x26\x61\xb0\x52\xe8\x66\xfc\x8e\x4c\xb4"
- "\xed\x49\x8b\x57\x77\x69\x9b\xa4\x65\x4f\x62\xfd\xab\x48\x93\xdf"
- "\x55\xb8\xa9\x2d\xf1\xed\x7d\x70\xf5\xa3\xab\xd7\xac\x5f\x4d\x0a"
- "\xb5\x75\x6b\xad\x2b\xd6\xe4\xe5\x27\x8d\xa3\x0f\xb1\x50\xbc\xe7"
- "\x40\x7d\xd4\x6f\x54\x65\x16\xd9\xc1\xcb\x98\x03\x95\x37\x5b\xaf"
- "\x25\xfc\x7a\xf2\x59\xd2\x15\x88\xd8\x0f\xe4\x23\x55\xea\x0d\x06"
- "\xe8\x7b\x09\xeb\xca\xab\x86\xd7\x17\xa8\x3c\xd6\xd6\x23\x04\x47"
- "\x55\xe6\xe0\xfd\xcc\x35\x4d\x5b\x87\xa8\x7d\x82\x37\x1f\xcd\x14"
- "\x74\x51\x19\x2d\x30\x08\x78\x8d\x66\x62\xbd\x79\xd2\xef\xd5\x5d"
- "\x52\xaf\xf6\x2b\xac\xc1\x83\xfa\x0f\x5e\xd7\x18\xe4\x2b\x81\xa3"
- "\x95\x59\x6a\x59\x44\x3f\x51\xf6\x93\xed\x9a\x1d\x36\xf9\x02\x75"
- "\x17\x93\x1f\x60\x57\x44\xd9\x4a\xf4\xc6\x95\xad\xd1\x25\x5a\x8b"
- "\x14\x94\xf3\xea\x88\x7f\x12\xe6\x0d\xd9\xdf\x4f\xef\x65\x5b\xab"
- "\x64\xbc\x00\xd7\xaa\xb1\xf1\x02\xb6\x2e\xc4\xaf\x4a\xfd\xed\x8d"
- "\xbb\xbf\xd0\x4f\xfb\xc6\x1e\x4b\x73\x75\x9c\x97\x67\x2f\xda\x74"
- "\x38\xca\xaf\x48\x7f\xa4\xaa\xff\x62\x8a\x7d\xb1\x75\x1a\xf9\xfc"
- "\x8c\xe1\x86\xeb\xdb\x2a\x0f\x32\x40\xb0\xa3\xf5\x16\x79\xc4\x59"
- "\x16\xc0\xe4\x05\xd2\xd1\x52\x9f\x78\x70\x25\x70\x62\xeb\xec\x18"
- "\x1e\x48\x18\x21\x2d\x3b\xc6\xa7\x6c\x4d\xa3\x6f\xe2\xe1\x80\x3a"
- "\xee\x90\xb2\xe9\xd6\x02\x6d\xcd\x26\x7f\xa7\x32\x7e\x84\xeb\xf0"
- "\xbe\xd2\x01\xc8\xfc\x5b\xb7\xc4\xca\x70\x1d\x56\x75\x11\x06\xae"
- "\x7f\x72\xde\x6e\x21\xb3\x6d\xdd\x13\xd3\x09\xb8\x0e\x13\xdd\x15"
- "\x65\x24\x85\x5a\x3d\x01\x11\x53\x59\xa7\xc5\x4e\x47\xde\x2e\x8d"
- "\x47\xd1\xca\x6a\x97\x3a\x27\xe1\xa3\x12\x73\xb0\x0e\x79\x02\x51"
- "\x7d\x2c\xd2\xa2\x32\x20\xa0\xda\x2e\x78\xef\xca\xb4\x98\xac\xf7"
- "\xa4\xd8\xbb\x14\x72\xa0\x2c\x07\x7c\x72\xa5\xf1\x7c\xb9\x0d\xfc"
- "\x83\x75\xe5\xea\x95\x60\x1f\x7e\x6c\x5b\x73\x1b\x44\x87\x1f\xdb"
- "\x56\xde\x46\x26\x5b\xf7\x2e\xb8\x47\x5c\x31\x39\x6e\x1b\x47\x7f"
- "\x2c\xe3\xbb\xe6\x08\x9a\x4a\x72\x2e\xe9\x4e\x83\x32\xd6\xe9\x14"
- "\xf5\x6a\x54\xaf\x93\xb1\xee\xd9\x31\x07\x7e\x4b\xb1\x6b\xd0\x86"
- "\x0e\x35\xbe\xac\xb6\x66\x83\x96\x57\xbe\xa2\xed\x77\x09\x1b\x76"
- "\xf2\x43\x38\x5c\x20\xf4\x71\xe8\x53\x54\xff\x21\xf5\x8b\x72\xcf"
- "\x2c\xe8\x7c\x8a\x69\xe9\x9a\x3e\x16\x69\x69\x9a\xee\x55\xe6\x7d"
- "\x2a\x23\xf6\xed\x18\xdd\x76\x9a\xb6\x9f\x86\x3c\x0b\x35\x98\x69"
- "\xe5\x38\xac\xfc\x94\xca\x27\x25\x08\xbe\xda\x59\x39\x5f\xf8\xfe"
- "\x24\x5e\x5c\xe8\x99\x9f\x2a\xd1\xea\x21\x19\x81\xda\xad\xee\xdd"
- "\x88\x79\x4f\x3e\x3e\xa5\x8f\xd0\xa7\xa2\xe3\x3f\x76\x8f\x63\xfc"
- "\xfd\x8d\xd1\x62\xde\x1e\x1e\xe1\x6d\x35\x47\x31\x67\x1f\x61\x2c"
- "\x5c\xcc\x5b\x47\x47\xf8\x3e\x11\xa3\xfa\x61\xc6\xaa\xff\xca\x58"
- "\x24\xe1\x47\x27\xce\x01\xee\xf7\x9d\x51\x4e\x51\xec\xba\xdd\xc8"
- "\x77\x5f\xe0\x2b\xde\x84\x6f\xee\xb3\xf1\x53\x4d\xc8\x77\xef\xe0"
- "\x29\xbe\x0b\x79\xef\x2d\x40\xbf\x8b\x79\x38\x92\xf0\xe8\x09\xeb"
- "\xbf\x11\x1d\xaa\x9a\xe7\xdf\x3a\xd4\xce\x9d\xfa\x5a\xbe\xf9\x5b"
- "\xd7\x07\x9d\x55\x0b\xa2\x31\xb3\x50\x2e\xc1\x68\xb1\x9d\xee\x1f"
- "\x3d\x81\x3e\x9d\xc8\xc5\x1a\x8a\x31\x38\x81\x7c\x90\xff\xd7\x0a"
- "\x7a\xe3\x4f\xb8\xfe\x12\xfc\xc6\x8d\x5b\x83\xb6\xb6\x47\x8a\x79"
- "\x5b\xed\x43\x68\xff\x49\xb4\x7f\x84\xb7\xa2\x0f\xfb\x6a\xfa\x19"
- "\xa3\xf6\x47\xa8\xcc\x08\x4b\xc8\xdd\xa0\x9b\xb6\x1b\xef\x73\xed"
- "\xa9\x6c\x37\xf2\x3e\x14\x60\xd3\x9a\x90\xe7\xa1\x9f\x4e\x63\xa2"
- "\xfd\x3e\xb4\x3b\x71\xa8\x3d\x82\xba\xa9\xfd\xa8\xdf\xa7\xb5\x53"
- "\xab\x9f\xda\xab\xe1\x60\x2e\xe9\xbb\x92\xbe\x14\xed\x96\x3a\xfc"
- "\xea\x6b\xfc\x6b\x0b\x98\x3f\xe1\x5b\xd7\x7b\x59\x75\x36\xcd\x21"
- "\xea\x8f\x1f\x38\xa5\x9e\x2b\x3b\xa1\xc1\x40\xca\x93\xd5\x8b\xb4"
- "\xfe\xc5\xf7\x6b\xc9\x9a\x42\xa1\x47\x5d\xbe\xa2\x68\x65\xf1\x72"
- "\x48\x67\x49\xcc\x46\x49\x42\x7e\xcb\xcf\xb3\xae\x59\x6d\x7d\x64"
- "\xf9\xca\x55\x6b\x8a\xf3\x0b\x67\x0b\x91\x7b\x6d\xfe\xea\x3c\x52"
- "\xaf\x16\x2e\x2f\xb4\x25\x9d\xc7\x73\xbb\x86\xda\x3b\x29\xce\x49"
- "\x29\xe9\xaf\xeb\xee\x55\x75\x8b\x21\xee\xcc\x16\xb2\x9b\x9c\x07"
- "\x35\x90\xf9\xb3\xe9\xfd\x1d\x72\xad\xa9\x5b\xc4\x2b\xbf\x8c\x70"
- "\x2e\x62\x30\xeb\x4e\xb1\xba\xef\x88\x7e\x0e\x2f\xd4\xca\x11\x67"
- "\x34\x04\xcf\x4a\xe9\xa3\x0b\x59\xcc\x66\xbb\xee\x5e\xae\x47\x1f"
- "\x01\x03\x95\x6f\x2d\x53\xcf\xce\xfd\xa1\x97\xd5\x5d\x83\x7e\xd3"
- "\xde\x41\x97\xe0\x0b\xc5\x19\x9f\xba\xcb\xc0\xf7\x96\x71\xe7\x64"
- "\x13\xc1\xa5\x46\xca\x95\x7a\xb3\x8e\xe2\xaf\xf6\xd2\x79\xc3\x2c"
- "\xda\x23\xdc\xed\x54\xb2\x62\x36\x32\xd5\x39\xc4\xe3\x0a\x5d\xbb"
- "\x98\x17\x35\xf5\x1a\xbe\xeb\xe9\x0c\xc7\xe6\x19\xdf\x95\xb4\xba"
- "\x46\x9c\x29\xc2\xb8\x7d\x57\xb6\x5f\xc4\x83\xc6\xfa\x54\xfb\x6b"
- "\xf4\x4f\xe1\x8e\x85\xaa\xdf\xf6\xda\x5f\x2b\x29\x73\xb3\x23\x6b"
- "\x2d\x6a\x0c\x75\xdf\x74\xa5\xd2\x37\x39\x82\x75\x5d\x01\xaf\xca"
- "\x6b\xe6\x1e\x88\x54\xfa\x98\xb2\x3e\x53\x4f\xf4\xdd\x61\x07\xfc"
- "\xd6\x14\x24\xf1\xaf\x0a\xa6\x46\xd6\x67\x92\xad\xa3\x91\x73\x7c"
- "\x9b\xe4\xb3\x88\x98\xb7\x95\xbe\x24\xf5\x79\x06\x3d\x2b\xe0\xd5"
- "\x90\x66\xc5\xf3\x37\x14\x1e\x97\x7f\x6c\xde\x0c\x7a\x36\xeb\x84"
- "\x6d\x5e\x16\x78\xe3\xf9\xd4\x77\xad\xcf\x42\x46\x20\x3d\x45\xb4"
- "\x6f\xb5\x7b\xb5\x74\xe2\x5d\x25\x1f\xc9\x56\xf4\xb2\x5a\xb7\xa4"
- "\x69\xd1\x7c\x4f\x68\x30\x10\xb0\xad\xfc\x12\x34\xba\x6e\x91\x88"
- "\x0b\xbf\xf9\xca\xeb\xb9\xbe\xfa\x51\x5a\x3b\x16\x47\xc4\x5e\x16"
- "\x93\x7b\x1f\xb5\x7d\x1a\x3c\xc9\x16\x9d\xd6\x0f\x8c\x5b\x66\xae"
- "\x9f\x25\xc9\xf9\x5b\x67\x88\x93\x51\x7c\x5c\xe0\x7b\x6d\xa3\xa8"
- "\x57\x6f\xdc\x2c\x9f\x6b\x54\x5f\xe6\x75\x59\x5a\x5e\xa4\xcd\x93"
- "\x3c\x69\x8d\x81\x64\x37\xda\xdb\xa2\xfb\xa6\x09\xce\x49\x96\x36"
- "\x72\x4e\xb4\x90\x68\xb3\x75\x06\x63\x9d\x01\xe2\xdb\xeb\xaa\x0e"
- "\x34\x06\x98\x18\xbf\xa4\x2f\x23\xc3\xbc\x80\x81\x5f\x19\x97\x4f"
- "\xa5\x6f\x90\xbf\x43\xf0\xe0\xc0\x67\x05\xf8\x8c\x6f\x14\xc2\xd7"
- "\xd2\x33\xd4\x8e\xa7\x8d\xed\x25\x03\xe4\xc7\x1d\x78\xf8\xb4\x91"
- "\x60\x43\x6b\x43\x8d\x53\x9c\x91\x13\x34\xd8\x5d\x3c\x87\xca\x38"
- "\x93\x12\x62\x86\x4e\x50\x50\xc0\x3b\x64\x2b\x65\xd3\x4e\x22\xbf"
- "\xa1\x88\x19\x49\x3e\xfa\x7b\xf7\x91\x51\xdf\x02\x09\x93\xa7\x17"
- "\x68\x3c\x10\xee\x97\x8c\x3d\x0b\xfa\xf4\xd7\xce\x82\x3e\xbc\x66"
- "\x4d\x51\x6e\x61\x3e\x5d\x32\xaf\x59\x77\xdd\xf9\x6b\xa2\x49\xc6"
- "\xcd\x79\xba\x80\xc6\x8f\xd6\x09\x79\xa6\xe2\xe9\x96\x38\xb9\x96"
- "\x74\x6b\xb7\xd3\xfa\x46\x7b\xe2\x78\xd7\xfe\x6e\xc9\x26\xc1\x57"
- "\x1d\x37\x32\xfd\xf9\xf5\x3d\xb2\xbc\x68\xf9\xaa\xef\xca\xed\xdb"
- "\x71\xea\xe9\x1e\x5b\xcf\x33\xa9\xd1\x7a\xa4\x0c\x12\x10\x73\xb0"
- "\x7a\x6e\x2b\x4f\x9e\xb5\x44\xd2\xb9\x67\xe6\x68\x36\x4e\xe3\xfb"
- "\x9e\xf0\x15\x45\x2a\xcf\xd1\x38\x50\xec\x41\xfd\x6f\x36\x76\xeb"
- "\x89\xff\x2a\xc5\x3d\xd9\x9c\x08\x3d\x9f\x1a\xd3\xee\xed\xa1\x6e"
- "\xd0\xd9\x67\x5c\x7c\xab\xaf\x08\x78\x55\x36\x91\x9d\x49\xfc\xb9"
- "\x5d\xb9\x47\xf9\x4c\xf3\x44\x79\xb9\x6b\xc4\x25\xe7\xca\x33\x67"
- "\xc4\x5e\xd9\x0c\xf6\x64\x2f\x7b\xe6\xb4\xc1\x02\x39\x6e\x06\xfb"
- "\x39\xee\x85\xbc\x40\xef\xc6\x8c\xf5\x55\xbe\x66\x03\xb0\x13\x58"
- "\xaa\xe3\xf2\x0f\x4c\x98\xfc\x4b\xc0\x4f\xcf\x75\xc2\xfa\x3d\x01"
- "\x10\x9e\x32\xd9\xc0\xcc\x29\x26\xe3\xac\x99\xe9\x96\xdb\xbf\x37"
- "\x7f\x9e\xa3\xb4\xc4\xce\x95\x70\xc8\xcc\xe3\xe2\x2f\x56\xcd\x0c"
- "\x3d\x78\x5d\x99\x5c\x2b\xaa\x67\x86\xc6\x6b\x6b\xb5\x93\xdb\x88"
- "\xb7\x06\xbd\xb2\x3a\xd6\x31\xfd\xab\xe7\xbc\x7a\xe2\xe5\x68\xfd"
- "\xf1\x84\x8f\x41\x26\xd8\x56\xfe\x0e\xd2\xd0\x7f\x3b\xaf\x9a\x6b"
- "\x95\x67\x1b\xb6\xbd\xab\xd4\xcc\xb5\xc6\xca\x37\x30\x2a\x1f\xf2"
- "\x82\x7e\x4f\xe9\x80\xde\x63\xf8\x1e\xf3\x58\x03\xec\x1d\xdc\x8f"
- "\x0b\x4b\xd4\x49\xba\x29\x2a\x03\x74\xd8\xe5\x38\x0b\xfa\x6c\x17"
- "\x7a\x62\xfd\x29\xb6\xed\x6c\xeb\x04\xdf\x89\xbd\x9e\xa4\xa1\xe2"
- "\xa0\xb3\x1e\xe3\xff\xaf\x55\x2a\x3f\x04\x7e\xad\x7e\x81\x46\x13"
- "\xf0\x7e\x9d\xd4\x57\xd7\xe7\x68\x79\xc6\x97\x27\xc9\x66\x92\xbb"
- "\x69\x5c\xf9\xc8\xc0\x00\xf9\x70\x9b\x40\x27\xb0\x00\xeb\xf3\xb3"
- "\x34\x8f\x93\xcb\x53\x27\xa7\x94\x67\x3d\x76\x10\xeb\x5f\xb2\xef"
- "\x32\x96\x12\xf8\x0f\x6a\x33\xd9\xed\x76\xed\x02\xef\x4b\xfb\x54"
- "\x66\x5d\xd6\x4a\x73\x79\xd6\xf2\x88\x73\xfe\xad\xb4\x4e\x9a\xed"
- "\xf7\xe8\xcc\xe1\x3b\x74\x61\xe7\x9c\x5b\x77\xcb\x98\x27\x81\xba"
- "\xe9\xbc\x1b\xdf\xf4\xe0\x1b\x2f\x7e\x7d\xf8\xee\x60\x3f\x7b\xf6"
- "\x0a\x5c\x3b\xcc\x3a\xbe\xdb\x8c\x91\xbc\xa9\x4c\xc4\x80\x24\x1a"
- "\x7d\x90\x27\x81\xc7\x1c\x15\xba\x80\x49\x31\x5d\xc0\xb3\xf3\x31"
- "\x6e\x93\x17\x3d\xc1\xdf\x41\x59\x1d\x91\x11\xa5\xa3\xe9\x14\x63"
- "\xaa\xce\xfb\x30\xe6\xe8\xe1\xd9\xf5\xcc\xa2\xda\x5e\xea\x0f\x86"
- "\x3b\x88\x16\xd3\xd9\xe5\x76\xd4\xb9\x1f\xbf\x36\xeb\x6a\x96\x70"
- "\x8a\x3d\x5b\x4d\xfc\x47\x8c\x87\xfd\xd9\x24\x55\x1e\x71\xdf\x88"
- "\xef\x37\x3d\x46\x38\x31\xa0\x0f\xa3\x7c\xf0\xfc\x1d\x9e\x82\x0e"
- "\x61\x0b\x43\xb6\xcd\x94\x07\x75\x64\x7a\x42\x1d\x4c\xe1\x16\x3d"
- "\x9e\xdb\xc8\x4e\x99\x23\x6f\xa7\xbd\x9b\x75\xda\x42\xa0\xb1\x07"
- "\xc1\x03\x67\x66\xa0\x3d\xa2\x3c\xbc\x3f\xfc\x2a\xc6\xd7\x0a\x7e"
- "\x0f\xe5\x75\x91\x6d\x0d\x9d\x01\xe6\x6b\x33\xaf\xc5\xf7\xed\x90"
- "\xa1\xf5\x54\xfe\x29\xf6\xdc\xb3\x7c\x38\x33\xf3\x26\x9f\x8c\x89"
- "\xd8\xcb\x9e\x5b\x85\x76\x3e\x17\x6b\xe7\x73\x67\xd0\x7e\x03\xe8"
- "\xaa\x1b\x65\xee\xe7\xc5\xa8\xb3\x0f\x75\x42\x1e\x01\xfe\x66\x40"
- "\xde\x35\x50\x9b\x3b\xa9\xbd\xf6\x08\xe3\xeb\x33\x0d\xb5\x43\xcc"
- "\x80\xb9\xe0\xde\x8d\x2b\xfa\xbf\x0f\x3c\x59\x7a\xd0\xf9\x5c\x99"
- "\x76\x8e\x9c\x78\x09\x3c\xd7\x69\xb8\x54\x8d\x3c\x68\x63\x1b\xda"
- "\xb5\x3f\xd9\xc7\x48\xc6\x99\x04\x3c\x9d\x84\x7a\xa7\x60\xac\xda"
- "\x00\xbb\x9f\x02\xd6\xfb\xa9\x4f\xca\x88\x32\xa0\xa0\xbc\xda\x11"
- "\xb4\x69\xad\xc5\x60\xea\xa3\x78\xd1\x41\x0e\x78\x1f\x5e\x6c\x0f"
- "\x72\xb2\x3b\x25\x1b\x4e\x7c\x73\x2f\xfa\x8a\xf5\xee\x67\xb3\x49"
- "\xde\x40\x3f\xe6\xc8\x98\x8e\xcf\xcd\x53\xf7\xb4\x0e\x4b\x3d\xd3"
- "\xb3\xd5\x04\x7b\xea\x97\xa9\x3c\xb5\xc2\x33\xe0\x67\xa6\xbe\xcb"
- "\xb0\xbe\x3d\xdb\xda\xa8\x10\x8f\xf2\xb3\xa8\xfe\x7f\x82\x39\x16"
- "\xf2\x80\xbe\x28\x23\x7c\x80\x78\x4f\x69\xef\xf2\xb3\x55\xb9\xf6"
- "\x84\x6c\xf0\x99\x7a\xb4\x93\xce\x43\x4c\xc7\x3a\x7d\x3b\xd9\x33"
- "\xa1\x7d\x90\x3b\x7e\x56\x75\xa1\x58\xaa\x80\x8f\x05\x79\x20\x37"
- "\xfe\x6c\x81\x80\x57\x31\x6f\x94\xba\x9e\x9f\xb5\x6b\xe7\xf9\xf9"
- "\x08\x2f\xa9\x2d\x15\xf5\x96\x6d\x29\x16\x75\x50\x7c\xcd\x81\x22"
- "\x2b\x3f\xde\x6e\xf5\x4f\x78\x66\x3a\xce\x8e\xc7\xaf\xc6\xec\x12"
- "\x7b\x9a\x63\xed\x78\x1a\x66\xc7\xc9\x8d\xb4\xaf\x59\x46\x7b\xb7"
- "\xd2\xef\x4a\x83\xb0\x57\x5e\x6c\x97\xfe\x25\x3c\x21\x9f\xca\x5b"
- "\x36\x6c\x10\x71\x7c\x88\xaf\x11\xb6\x3f\x27\x55\x7b\x9d\x86\x69"
- "\x54\x47\xfb\x79\xb1\x82\xf3\x57\x2f\x7f\x78\x55\xbe\x54\xa5\xdc"
- "\xf0\x93\xa2\xe5\x3f\x1e\xcb\xff\x1a\x84\x5c\xec\x6c\xd8\x22\x75"
- "\x93\x0d\xfb\xe3\xf8\x44\x43\x54\xb7\xa4\x67\xfb\xa4\x7e\xa9\xa1"
- "\x67\x3c\xfd\xd2\x3d\x3f\x5e\xbd\xa6\x50\xd4\x21\x4c\x9b\xf2\xe5"
- "\xe9\xa2\x24\xf6\xe0\x82\x7b\x16\xdc\xb0\x36\xbf\x48\x04\xe7\x90"
- "\xca\x9c\xe5\x79\x79\x85\xaa\xe1\xd3\x4a\xfa\x8a\xde\x3c\xb2\x5e"
- "\x7c\x6a\x7b\xb4\x48\x9a\x4c\xad\x5d\xb5\xbc\x38\x5f\x2d\x22\xbe"
- "\xad\xe9\x44\x2f\xdb\x1b\x85\xcc\x9c\x24\xf7\x69\xb7\xaf\x8a\xdb"
- "\xd7\x89\x97\x23\xaf\xc0\x3b\x97\xf6\xce\xf6\x0d\xc2\x95\x1d\x57"
- "\x74\x36\x0b\x9f\x08\x86\x03\xff\x49\xf0\xdd\x7e\x86\xfc\xc9\x63"
- "\x6d\x6b\xa1\xf8\xa7\xea\x1e\x28\xe8\xf5\xf6\x8f\xc0\x6f\xb7\x00"
- "\xbe\xf6\xc5\xe0\x88\x40\x53\xed\x5e\xb6\xab\x5d\xd5\x21\x18\x15"
- "\x7d\xc3\x00\xd9\xaf\x34\x09\x3d\xc2\x76\x5f\x4c\x8f\xb0\xab\x9d"
- "\xd6\x75\x8c\x77\x1f\xb5\x8d\xda\x19\x74\xee\x30\xc5\xd9\x0e\xf4"
- "\x79\xd9\x76\xb1\xd7\x45\x7b\xdc\x22\xd6\x03\xf8\x27\xf5\x5c\xb9"
- "\xbe\xf3\x3f\x69\x1d\x6a\x9c\x43\x34\x57\x71\x8d\x34\xcb\x39\xb3"
- "\xf3\x5e\x5e\x39\xb4\xfe\xa6\x00\x4b\x93\x34\x63\xc7\x76\xa4\x5f"
- "\x7a\x8a\xed\x28\x42\xba\x1d\x74\x67\x12\xf1\x2e\x52\x57\xbe\x63"
- "\xbb\xaa\x57\x20\xf8\x4c\x8a\x6b\x43\x5d\x4c\xf7\xb0\xab\xdd\x9f"
- "\x38\x42\xb6\x57\x3e\x6d\x1f\x54\xee\x45\xef\xd8\x17\x95\xb5\x51"
- "\xb7\xba\xf7\x97\xd6\x8f\xfc\x80\x45\xb3\xba\x1f\x87\xbe\x6f\x27"
- "\x79\x42\xb5\xe9\xda\x31\x10\xcf\x03\x4b\xdf\xfa\x43\xeb\x89\x6f"
- "\x96\x32\xc3\xce\xcb\x04\x9f\x43\x7a\x8e\x73\x04\xef\x9d\xd7\xe1"
- "\x3d\xd6\xba\x9d\x56\x2f\x6b\x68\xd0\xda\x43\x6d\x2e\xb2\x83\x19"
- "\xc0\x77\xb4\xf6\xa1\x4d\x53\x90\x67\x41\xac\xcd\x3b\xd3\x04\xdf"
- "\xcc\x73\x54\x5d\xe4\xce\x36\xa9\x6f\x1a\x69\x8d\x1b\x37\xc3\x29"
- "\xb6\x73\x3b\xda\xda\xba\x59\xee\xc1\x4f\xd2\xf6\xb6\x51\xd6\x98"
- "\xfe\xc7\x74\x41\xdb\x67\x4a\x5d\xd0\xce\xd6\xd8\x18\xee\x2c\x22"
- "\xbc\x27\xfb\x05\xcd\x76\x81\xc6\x53\xc6\x1d\xd8\x19\xb5\xff\x52"
- "\x92\x46\xea\x48\x56\xaa\x91\xfb\x70\x18\x97\xc6\x2b\x12\x74\xc7"
- "\xc5\x5e\xec\x4d\x21\x46\x7a\xb0\xc9\x48\x4b\xa6\x7c\x54\xa7\xd0"
- "\x99\x00\x36\xd4\x17\x05\xfc\x78\x82\x65\xf2\x1d\x41\x67\x63\x26"
- "\x78\xbe\xbe\x18\x6e\xec\x14\x7b\x72\x35\x2a\xac\xb9\x73\xfb\xad"
- "\x31\xf9\xad\xf1\x81\xe8\x9e\x13\xca\x89\xad\x19\x8d\x1b\x08\xc6"
- "\x54\xaf\x6d\x23\xe9\xa4\x77\xed\x15\xed\x90\xfb\x3a\xef\x61\xfc"
- "\x76\x71\xf0\x17\xb4\xd6\x92\x2c\x41\x63\x4f\x79\x65\x2c\xa0\x5d"
- "\xa4\x63\x27\xdd\xe9\x73\xb8\xff\xa1\xa2\x1f\x0f\x77\x1a\x0f\xc6"
- "\xdb\x19\x4a\xf8\xef\x4a\x53\xa8\x4c\xf4\x9f\xca\xc2\xfa\xa3\xd3"
- "\xf4\x2b\x6a\xb9\x93\x50\xe6\xcf\xfa\x55\x58\x8b\x3d\x85\x4a\x15"
- "\x0e\x34\xc6\x02\xe6\xbb\x32\x40\x73\x85\xfe\xc7\xd1\xcc\x07\xd7"
- "\xa0\x0c\x19\xa3\x73\xd7\x02\x4e\xb0\x55\xf3\xfb\x49\x06\x43\xdb"
- "\xe5\xd9\x2a\xe0\x22\xe4\x18\x6a\xa7\x52\x39\xd2\x40\x6d\xa7\xfd"
- "\x84\x98\x5c\xbd\x6b\x03\x7d\xeb\x7f\x5c\x7e\x53\x2b\xf7\x3b\x68"
- "\x6c\x7e\xcd\xd7\x17\x30\x55\xcf\x8e\x75\x6a\x67\x19\xe1\x3d\x95"
- "\x13\x10\xf2\xd5\xae\x3a\x05\x70\xc1\x98\x00\xce\xbb\xf6\x6b\x63"
- "\xe2\x65\x8d\xf6\x89\xf8\x61\xe9\x3f\x7f\xd7\x80\xe6\xa3\x85\xd6"
- "\x26\xcc\xe1\x32\xc9\x4b\x36\xbd\x6c\x2e\xbf\x9d\x9b\xc3\xb7\xde"
- "\x4a\xbc\xd1\x6e\x3d\x0f\xc5\xd9\xd1\xcd\x02\x9c\xbe\xd2\x6c\x8a"
- "\x95\xcd\x3f\xea\x26\x1b\x44\x4f\x48\xda\x20\x52\xfa\x7d\x01\xae"
- "\x74\x06\x22\x64\x53\xdf\x1d\x74\x36\x2d\xd2\xe4\x20\xa2\x6f\x09"
- "\xe5\x3a\xc0\xae\x69\x99\x97\x6d\x5b\xa5\xd2\xb5\x29\x27\x59\xd3"
- "\x56\xb5\xfc\xf8\x36\x18\xa4\x1c\xd9\xd4\x22\xe5\xa9\xa6\x7a\xd0"
- "\x9e\x05\x52\x9e\x6a\x6a\xd6\xda\x8d\xf7\xab\xce\xef\xe3\x92\xbb"
- "\xee\xc9\xb7\xae\x22\x12\x9d\x75\x8b\xdd\x9a\x79\x4d\xde\x4d\xc2"
- "\x68\xd5\xfa\xcf\x77\x7d\xd7\xba\xe4\xb6\x6b\xec\x05\xb3\xef\x93"
- "\x97\xbb\x96\x2c\xa2\xeb\x79\x7b\x98\xd6\xa0\x73\x37\x1b\x2b\xaf"
- "\xed\x51\xdb\xb0\xdb\xe2\xd5\x5d\x2f\xed\x40\x8c\xbe\x56\x8a\x83"
- "\x8e\x35\xd5\x47\x7c\xf2\xe2\xc8\xa7\x9c\x6f\x3d\x1a\xe2\x89\xbe"
- "\x56\x7f\xf2\xcc\x10\x7e\x6e\x7f\xe2\x50\x23\xc5\x49\x37\x97\xf3"
- "\x90\x39\x3c\x45\xd2\x4a\x3c\x83\x27\x19\x00\xdf\x43\x63\xc9\xee"
- "\xbe\xce\xc1\x17\x47\xb8\x07\xfc\x0f\xe0\xb2\xdb\xae\xad\xe3\x42"
- "\x07\xe5\xf2\xb5\x2e\xb6\xf3\x51\xc2\x1d\xf0\x07\x46\xc8\x43\xad"
- "\xa4\x87\x42\x3e\xf4\x7f\x9b\x57\xc2\x62\xf7\x5e\x8c\x7f\x97\x0a"
- "\xdf\x25\x78\xc6\xf8\xcf\x33\x88\x39\xee\xb4\x88\xb5\x42\xd9\x7c"
- "\xfd\xfd\x90\x05\xdc\x5a\x99\x28\xcb\x24\xed\x2a\x64\x79\xec\xef"
- "\x3c\xff\xac\x54\x0e\xb6\x93\xee\x82\xce\x17\x9a\xed\x3a\x8a\xe3"
- "\x93\x13\xd5\xd7\xe0\x5d\x4a\x79\x2a\xe9\x70\x72\x52\x02\xba\x32"
- "\xca\x13\xd3\x6b\x28\xde\x5a\xbd\x12\x02\x3f\x91\x2a\x63\x96\xfb"
- "\xd4\x7d\xdd\xe6\x82\xe8\x3e\xc1\x98\xb1\x6f\x16\xf8\x30\xe4\x34"
- "\x60\x1c\x9a\xfc\xdf\x48\x93\xbc\x93\xe2\xd4\x31\x79\xe6\xbc\xf9"
- "\x3f\xc4\xbc\x54\xf1\x11\xf0\xf5\xd3\x1e\x9e\x39\xcc\xfd\x64\xef"
- "\xae\x24\x00\x27\xd9\x49\xe6\x29\x09\x96\xd1\xb9\xd7\x28\x5e\xda"
- "\x80\x97\x36\xe0\x25\xed\xb7\xa2\x7e\x7f\xc2\xf5\xcb\x30\x67\x75"
- "\x27\x59\xf3\x6c\x6a\x3f\xc1\x06\xfc\xbb\x49\x01\xac\x84\x5d\x1d"
- "\xc1\x27\xe9\xab\x05\x74\x5e\x89\xfa\x6a\x0e\xa3\xcf\xf1\xfd\xd2"
- "\x2b\xde\x1a\x27\xfa\xa5\x47\xbf\xec\x83\x42\x6f\x40\xe7\xc8\x40"
- "\x4b\xa6\xc7\x62\x41\x3c\xbf\x28\xbe\x8f\x0a\xc5\x8f\x11\x7d\x78"
- "\xfe\xb1\xf1\xfa\xc8\xf5\xd4\x47\x82\xc1\xf3\x77\xa8\xfb\x2d\xa2"
- "\x9d\x44\xb7\x7c\xec\x79\x96\x52\x4e\xe7\xb7\x7c\xad\xe0\x7b\xef"
- "\xa2\x31\x6c\x72\xf2\x3a\x6a\xe7\x78\xe3\x45\xe5\xc9\xb2\xfe\xd3"
- "\x64\x2e\x2f\x5b\x86\xb6\x74\x8f\x0f\xef\xe7\xcf\x5e\x18\xde\xcf"
- "\x1f\xa2\xef\xa9\x1d\x74\x16\xcd\x4c\x8e\x8a\x80\xdf\xe0\x2b\x5c"
- "\xe3\xd5\x9b\x52\xde\x4c\xed\x1a\xf7\x1d\x70\xdf\x57\x5b\x38\x76"
- "\x4e\x28\x4d\x21\x46\xf0\xdb\x8d\x74\xa9\x93\xfd\xcf\xb2\xa8\xee"
- "\xd8\xe5\xeb\x36\xeb\xac\x09\x34\xc7\x04\x4f\x8c\xfe\x8e\x57\xae"
- "\x59\x57\x47\xbe\xce\xee\x02\xad\x1a\xf7\x3d\xe6\x81\x95\x6f\xfe"
- "\xd6\x37\x50\x5e\x63\x4a\xb9\x8e\xfb\x13\xbe\x95\x94\x12\x08\x67"
- "\x10\x5c\xd1\x56\x3b\xe6\xf8\xb3\x62\xed\x16\xba\x8c\x17\x00\x87"
- "\x57\x45\xfc\x4a\x7f\xa2\xaf\x51\xda\x27\xbc\x90\xe6\x65\xbf\x1b"
- "\x88\xd9\x1a\xbd\x90\xe1\xd5\x4d\x95\xfc\x75\xc2\x95\x3b\xb0\xa6"
- "\x3d\xa0\x38\xcd\xdc\xba\xd1\xcc\xfb\xd9\x0b\x6f\x29\x3c\x53\x8f"
- "\x75\xeb\x81\x18\xee\xc8\xf3\x6e\x1a\xee\xe0\xfb\xbc\xf1\xf1\xe2"
- "\x85\x27\x2e\x8c\x17\x2f\xfc\x50\xd5\xf5\x2d\x93\x36\x80\x2f\xec"
- "\xd5\x64\x0e\xbe\xf9\xca\x1d\xd6\x52\x51\x7f\xb6\xac\x1b\x30\x09"
- "\x67\x13\x9d\x59\x04\xb8\x95\x21\x6f\xb7\x46\x1b\x08\x87\xcc\x11"
- "\x92\x87\x98\xc0\x73\xbc\x0b\x80\xf6\x34\xc8\xf5\x79\x78\x01\xf1"
- "\xaa\x8a\xb3\x69\x1f\xd6\xaf\x9d\x64\x03\x1f\x48\x1c\x84\x5c\xb6"
- "\xc7\xe2\x65\x5f\xa8\xf1\xae\x07\xd3\xb8\x6b\xd0\x52\x2f\xcf\xb3"
- "\x1b\x45\xec\x31\xcc\x73\x8a\x37\x46\x73\x1d\x69\x69\x68\x37\xc5"
- "\x1e\x83\x8c\xb0\x67\x89\xb6\xf6\x2b\xce\x6c\x82\xb7\xa0\xa7\x7a"
- "\xe2\x87\x01\xbb\x67\xf5\x4a\xcb\xc8\x4d\x16\x46\x7d\x1e\xd9\x3c"
- "\xa3\xe5\xc9\x1b\x99\xe1\xf7\x96\x87\x99\xed\x16\x96\x56\x3e\xd7"
- "\xc0\xbe\x9c\xc7\xf4\x04\x07\x2f\xdb\xb3\x4c\xc2\x6e\x4f\xb3\x36"
- "\x3e\x5e\xf6\x82\x88\xd3\x45\x3a\xf8\xc5\x61\x3e\x2c\xf7\x14\xf6"
- "\xb8\xb1\x06\xaa\x7b\x67\xbb\x4d\xe3\xac\x0f\x77\x5b\x57\xae\xb5"
- "\xe6\xad\x59\xbf\xfa\xea\xab\x93\xc6\x91\x25\xf6\x1c\x96\xb2\xc4"
- "\x8b\xc6\x78\x59\x02\xcf\xe8\x7f\xd3\xc0\xf9\xb2\xc3\xa2\x5c\xd5"
- "\x4d\x41\x6e\x16\x8b\xdd\xdf\xcc\x16\xdd\x1c\xf7\x78\x2b\x5b\x74"
- "\xcb\xad\xb9\xf7\xe7\x2f\xcf\xdb\x10\x97\xfa\xed\x78\x3d\x5f\xed"
- "\x0e\xd4\x9d\x30\xe3\x4e\xd0\x0f\xdd\x7d\x8f\xd3\xba\xf3\x62\xa4"
- "\x34\xcc\xbf\x00\xee\xce\x23\xdf\x40\x87\x8a\xc2\xec\x10\xe8\x1b"
- "\xbf\x92\xe8\xfa\x14\xe9\x1f\x33\xc2\x48\x8f\x66\x46\xdf\xfd\x90"
- "\xe9\xce\x48\x1b\xf0\x97\xae\xee\x6c\x08\x81\x4e\x0c\xed\x91\xfc"
- "\xce\x8b\x3d\x48\x9f\x86\xf4\x49\xd2\x8e\xe5\xa5\x44\xc8\xcb\xd9"
- "\xc2\x17\x42\x31\xf9\x42\x78\xf1\x34\xc1\xe8\xc6\x40\x19\x93\x3e"
- "\xb9\x5e\xac\x27\x5f\xd9\x5e\xf6\xd2\x02\xe2\x2f\x28\x2f\xd2\x8e"
- "\x59\x7f\xc2\xb2\xe8\x4a\xfc\xb0\x17\x65\xf2\xad\x43\x7b\xf8\xce"
- "\x1c\xda\xdb\xcf\x40\x99\x77\x10\xdf\x96\x60\x99\x12\x09\x3a\x5f"
- "\xca\xd6\x78\x10\xb2\x37\x9d\x88\xff\xd0\xd6\xc1\x14\xd0\xef\x94"
- "\x80\x99\xe7\x92\x6f\x11\x1d\xcb\xa0\xf5\xc1\x6c\x5f\x22\xce\x28"
- "\xd1\xba\x48\x34\xa1\x49\xd0\xd2\x97\x1a\x34\xba\x50\x23\xe5\xd1"
- "\x24\xfa\x1e\xeb\xe7\x57\x72\xfd\x7c\xa9\x4d\x9b\x0b\xb8\x6f\xd7"
- "\x70\x75\xcc\x39\x97\xd5\x45\xf9\x85\xf9\x79\xd6\x6b\xd6\x26\xb1"
- "\xb8\x48\x8e\x05\xf9\xab\xad\x85\xf9\x3f\x5d\x97\xbf\x56\x08\x7a"
- "\xf4\x76\xec\x1e\x0b\x68\x50\x2c\xae\xae\x38\x6b\xf3\xf3\xeb\x48"
- "\x16\x36\x97\x5f\x2d\xf4\xe9\x82\x37\x32\xcd\x9d\xa7\xd4\x24\x67"
- "\x4b\x7d\xe4\x49\xc0\xb5\x45\xf5\xa9\x3b\x54\x4f\x7c\x5c\x3f\x6b"
- "\xb9\x4d\xee\xd9\xff\x7c\x9d\x84\x95\xf1\x89\xa0\xf3\xe7\xab\x62"
- "\xfc\x5a\x8b\xb0\x7f\x95\xb6\x73\x3f\xdf\x02\x18\xe7\xc5\x78\x90"
- "\x96\x41\xa2\x83\x82\x1e\xfe\x0d\x5a\xa8\xf2\xce\xa8\xa7\xe5\x66"
- "\x5e\xcc\xfb\x6a\xcf\x31\xa1\x0f\x24\x1f\xeb\x92\xbe\xfe\xdc\xab"
- "\xc1\x11\xfc\x4b\x1f\xe9\x1d\x34\xf9\x68\x71\xf8\x2c\x2f\xdd\xc0"
- "\xf4\xa4\x7b\x00\x0d\x69\xf9\x55\xa1\x5f\xcf\x9d\x2f\x75\x81\x97"
- "\xa9\xa7\x3c\x4d\xaa\x0d\x19\x4f\x1c\xaa\x0b\x3a\x5b\x32\x63\x72"
- "\x47\x8b\x4f\xf0\xf1\xe7\x08\x6f\x7e\x7e\x30\x97\xd6\x08\x49\xbb"
- "\xa7\xfe\xad\xf6\xf2\x24\xa9\x73\x97\xf4\xad\xa5\x40\xed\x83\x8f"
- "\x68\x96\x6a\x83\xa8\x97\x78\xdd\xe2\x03\xce\xd5\xd3\x58\x80\xce"
- "\xbb\x34\x78\x51\x7f\xa9\xed\xa4\x57\x06\x1d\x6e\x79\x75\x63\x48"
- "\x2f\x63\x20\xbe\xd4\x23\xe5\xa3\x96\xae\xf8\xbd\x23\x29\x0b\xb5"
- "\xf4\xc5\xfc\x0d\xfc\xfc\x6b\x71\xb8\xd6\xac\xa6\x63\x2d\x8f\xe6"
- "\xae\x5f\xfe\x68\x7e\xee\x3a\xdb\x6c\xeb\xba\xd5\x62\x6b\x4e\xa8"
- "\x01\x8a\xd6\xad\x78\xd4\x4a\x54\x24\x77\xc1\xa2\x45\xb9\x77\x3e"
- "\xf8\x83\x1f\x26\xb1\x3b\x97\x23\xad\x68\x8d\x75\x51\xd6\x6c\xf9"
- "\xea\xfe\xbb\xef\xfa\xb7\xdc\xbb\x16\x3f\x78\xdf\x03\xe3\xd8\xc6"
- "\x9a\x80\x13\x75\x18\xa3\x49\xbd\xec\x97\xf3\xa5\x2d\xc4\xcb\xf6"
- "\xb1\xb6\x10\x2f\x03\x56\x2f\xef\xc5\xaf\x83\xb1\x5f\x66\xe0\x37"
- "\x1f\xbf\x2c\x89\x37\x89\xa0\x81\x2f\xef\x89\xe1\x0d\xbd\x93\xf6"
- "\xc2\x52\xf7\xfa\x32\xe8\xdf\x4b\xe1\xf8\x77\x31\x5a\xf0\x8b\x57"
- "\x04\xbd\x54\xf1\x82\xf0\x21\x37\x6c\x14\xb8\x21\xf9\x95\x97\xc3"
- "\x1a\x6e\x88\xf3\x76\x48\x27\x9d\x19\xbd\x07\x7e\x67\x90\x7e\x19"
- "\xb8\x50\x47\xfb\xa2\x94\xce\x93\xe7\x66\xa8\xe5\xce\x21\x7d\x33"
- "\xf1\xb3\xea\xfe\x49\xca\x49\xf6\x8b\x9f\x72\x67\x4b\x48\xca\x82"
- "\x2f\x5f\x27\xf0\x66\xf3\x8c\x3b\xc5\x3e\x94\x38\xd7\xf0\x8b\x82"
- "\x18\xfe\xfc\x92\xce\x35\x08\xba\x20\x69\xef\x2f\xb6\x9c\xa7\xc7"
- "\x49\x40\x5a\x83\xe6\xaf\xba\xe8\x6a\xa6\x37\x5c\x5d\xc7\xea\xf5"
- "\x1c\xbc\xc2\x2f\x16\x4a\x7b\xb8\x5f\xb4\x69\xfc\x33\xee\x31\xff"
- "\x3f\xb3\x9d\xaf\xff\xaa\x89\xd3\x7f\x95\xda\xf8\xf1\x4e\x9b\x9f"
- "\x78\x64\xb7\xc7\x2f\xfc\x24\xde\xde\x69\x0b\x90\x6f\xbd\xa4\x7e"
- "\xf6\xcb\x64\x47\x84\x9f\xc3\xfd\x0c\xf4\x4d\xac\x21\x37\x49\x9d"
- "\x02\xe4\xb1\x5f\xde\x26\x65\x13\x99\x4e\x70\xf7\xb2\x97\xc9\x8e"
- "\xc9\x40\xe3\x83\xfb\x06\x8c\x51\xf6\x78\x74\x2f\xa5\x5c\xaf\xfa"
- "\xa3\xf9\xe5\xd3\x24\xa3\x12\xac\xb6\xe9\x95\x82\x6d\x4e\xfc\x70"
- "\x25\xda\x17\xe3\x2f\x79\x48\xc2\xf6\x97\x75\xed\x76\x1f\xad\x9b"
- "\xe3\xee\x17\x88\x35\xab\x98\xf7\x68\xe3\xb9\x38\xe2\xbf\x9d\xc6"
- "\x2b\xe8\xfc\x65\x87\x36\x96\xc3\xd7\x6e\xb3\x25\x94\x33\xeb\x81"
- "\xc6\x5b\x28\x1d\xf3\xff\x97\x0b\x55\x3b\xcc\xc0\xf9\xdf\x82\x0e"
- "\x67\xcb\xef\xf7\x1a\xb5\xef\xcf\xf7\x73\x2a\x0e\x0a\x92\x92\xeb"
- "\xbb\x42\x15\x96\xa9\x86\xa5\x1d\x73\xe6\x87\xce\x72\xb6\x4b\x9c"
- "\xd4\x74\x70\xa9\xb2\x3f\xaf\x40\x96\x80\xfc\x5d\x79\xe2\x19\x55"
- "\x0f\x80\xb9\xbd\xf7\xc5\x1b\x19\x5b\x15\x58\x9f\x13\xd5\xa1\x90"
- "\xee\x83\x7c\x97\xa1\x1d\x75\x71\x3a\xb2\xa8\xad\x98\x97\xbd\x42"
- "\x32\x31\x64\xed\x13\xf5\x54\x0e\xcd\x2b\xa9\xb7\xd9\xeb\xf6\x04"
- "\x18\x43\x79\xab\xc5\x1e\xa8\x73\xaf\x45\xe0\x1e\x64\x6d\x21\xe7"
- "\x97\xf0\x2f\x54\x5b\x0a\xc1\xbb\xc8\x73\x41\x7b\x03\x51\x5d\x90"
- "\x38\x23\xb3\xd7\x46\xf6\xa1\x41\xe7\x2b\xa6\xf1\xf4\x85\xa0\x0f"
- "\x05\xcb\x57\xe7\xad\x79\xe4\x91\xbf\x4d\x1a\xe2\x6d\x36\xeb\x9c"
- "\x8a\x0b\x65\x42\xfe\xad\xb7\x48\x3c\x7d\x05\xf4\xbf\xb2\x40\xf2"
- "\x6f\x3f\x3a\x81\x79\x73\xd5\x49\xf6\x4a\x87\xc6\xbf\xcb\x79\xf4"
- "\xca\x61\xee\x7c\xc5\x12\x9b\x1b\xaf\x34\x7f\x7d\x6e\xbc\xb2\x6f"
- "\xfc\xb9\xf1\x4a\x37\xd6\xd9\x1e\xbc\x3f\x8c\x3a\xc5\xde\x0b\x3d"
- "\xab\x3c\xb8\xdb\x1c\xbe\x5d\xf0\xe0\xb9\x1b\x98\x8e\xf8\x6f\xd2"
- "\x4d\xd3\x7a\x10\x81\x5c\x1b\x01\x8d\xc8\x0d\xb3\x54\x5a\x0b\x6a"
- "\x57\x93\xde\x71\x16\x0f\x8f\x70\x6f\xee\x06\xd0\x0b\x3c\xd7\x9c"
- "\x94\xfb\xb5\x0f\x9d\x81\x1c\x82\xfb\xda\x7e\xa2\x15\x0a\x39\x55"
- "\x67\x72\xbd\xfe\xd5\x42\x8d\xc7\x35\x97\x5b\x85\xaf\x5d\xb1\x6e"
- "\x03\xcf\x68\xdd\xce\x8d\x98\xdd\x72\xdd\xfe\x95\xed\x82\x3a\xee"
- "\xe4\x99\xde\xf1\xd2\xd1\xc6\x76\x6a\x17\xda\xd9\x8a\x76\xed\xa3"
- "\xf6\xd4\x3c\x42\xfd\x4a\xb8\xd5\x1c\xce\x12\x7b\x0c\xd4\xce\x87"
- "\x02\xec\x56\x6a\xdf\x43\x3f\xbd\x95\x35\x3d\x42\xfb\xc4\xd2\x3e"
- "\x48\xc5\x25\x03\x70\x66\x4a\x3f\x7b\x35\x23\x20\x62\x1f\xfe\x0a"
- "\xb4\xc8\xd8\x2e\xf9\x60\xb9\x07\x43\x79\xe8\x9d\xc4\xd3\x57\x33"
- "\x0e\xd8\xa9\xcd\xaf\x66\x68\xf9\xe2\xdb\x76\xd7\x72\x1b\x18\xcb"
- "\x95\x8f\x3c\x92\x5f\xb8\x56\x8b\xe3\x9c\xb9\x66\x55\xde\x6d\xea"
- "\xb9\xd9\xd5\xf9\xeb\x73\x57\xe6\x09\xbb\x7c\xa4\xca\xdb\xf3\x78"
- "\x8d\xd9\x24\x0b\x08\x5b\x57\xc1\x67\xec\x23\x1b\x2e\xc1\x73\xf4"
- "\xb2\xd6\x3a\xb9\x8f\xdd\x7a\x8f\x5c\x07\xa6\xae\x47\x3b\xf6\x6a"
- "\xeb\x00\xe9\x23\x86\xd9\xd5\x2e\xda\x5f\xa2\xb3\xd0\xb4\x8f\x45"
- "\x3a\x09\xe4\xe9\xf2\xb2\x5f\x95\x68\xb8\x5d\x8d\x74\x3a\x7f\xe1"
- "\x5e\x4d\x36\x7b\xfb\xae\x56\xb6\xfa\xaa\x78\xd2\x91\x6c\xd0\x00"
- "\x13\xad\x0d\xb4\xaf\x22\xfd\xe6\xb7\xa6\x13\x6d\x23\xbd\x99\x7b"
- "\x35\xd9\xc0\xbd\x4a\xba\x8e\x54\x2f\xdb\x97\x01\xb9\xa8\x6a\xcb"
- "\x46\x66\xa4\x3a\xb0\x6e\x78\xa5\x0e\xb6\x75\xde\xbb\x25\x8c\xa9"
- "\x6b\x87\xb7\x5a\xe8\x04\x5b\x65\xcc\x00\x97\xaf\x59\xd5\x39\x34"
- "\x23\x1f\xf0\x3f\x99\xc9\x36\x1f\x29\x10\xfb\x67\x82\x2e\xb4\x6e"
- "\xe1\x95\x47\x42\xc2\x4e\xb1\xf2\x48\x81\xc2\x0b\x12\xe8\x19\x74"
- "\x39\x09\xfc\xfe\x5e\xee\xc8\x64\xaa\x6d\x63\x42\x3f\xfb\x75\x32"
- "\xe9\x4c\x31\x1e\x8d\x04\x0b\x94\xbf\x57\x2d\x7f\x2f\xca\xc7\xfa"
- "\x77\xa5\x1a\xb3\xb2\xf5\xa0\x56\x17\x70\xdb\x8f\xb5\xab\x8a\xd6"
- "\x2f\xb4\x7f\x0b\x7e\x2e\xa9\x9f\x09\x41\x4e\x9a\x15\xd5\xcf\x48"
- "\x1e\xe9\xd7\x06\x0d\x27\xa9\x6e\xb5\x0f\x2d\x8a\x53\xf8\x4c\xd4"
- "\xa9\x75\xb5\x90\xae\x40\x2b\x93\xa3\x4c\x3e\xe2\x6b\xc6\x5a\x63"
- "\xc4\x1c\xf3\xa7\x94\x63\x4d\xa1\x3a\x88\xc7\x0d\xcc\xe2\x58\x73"
- "\x22\xb9\x11\x83\x3c\xb7\xbe\x81\x25\xc7\xf3\xb7\xa8\xaf\x28\xc6"
- "\x93\xa1\x8c\x11\xd0\xb2\x52\x3a\x0c\xf1\x6b\x71\x96\x80\xec\x42"
- "\x68\x5c\xcf\x61\x9c\x30\x56\x0b\x51\x4f\x2b\xf8\xf2\x64\xc0\xe1"
- "\xd7\x34\x5e\x35\x0a\xe6\xdc\x39\xc1\xab\x9b\x29\xc6\x79\x2f\xfb"
- "\xf5\x2e\x1a\x2b\x2a\x0b\x78\x61\x09\x07\x73\xfe\x85\xfc\x46\x11"
- "\xac\x37\x95\xf0\x01\xda\xeb\xeb\x67\xbf\xb9\x9a\x78\x58\xf0\xf5"
- "\xe2\xde\x91\xc7\x15\x31\xd6\xc2\xde\xf1\x37\x57\x6f\x1a\xe0\xca"
- "\x59\x27\xe3\x1d\xa0\xa5\x67\xf5\x2c\x1c\x82\x0c\x8a\x76\xeb\x1d"
- "\x83\xe4\xdb\xaa\x19\xf3\xcb\xc5\x50\xaf\xb1\x66\x23\x4b\x25\xbf"
- "\x60\x0e\x1b\x0f\x75\x06\x1a\x59\xa7\xad\x91\xfd\x31\x5c\xcf\xdc"
- "\xc5\xa4\xd3\xfc\x4d\xc7\x87\xf6\x7a\xb2\x2f\x4f\xc4\xfd\x56\xeb"
- "\xbf\x51\x5d\xff\xb5\xec\xc3\xc3\x1f\xb3\x0f\xdd\x1f\x33\xeb\xbf"
- "\x8b\x67\xdb\xc1\x9c\x3f\xb2\x83\xd9\x7f\x64\x8e\x3e\xae\x10\x3f"
- "\x54\xfa\x18\xd5\xe1\x42\x59\xcd\xe4\x43\x2b\x55\x19\xb6\x24\xa1"
- "\xff\x86\xc5\x76\x26\xf6\x13\xdd\xab\xdf\x40\x1b\xff\xeb\x74\xd3"
- "\x10\x33\xba\x57\xbf\x27\xee\x85\x7e\x01\xfd\xf5\xe4\x75\x0b\x5b"
- "\x33\xf2\x1f\xe6\xb1\x0f\xd0\x39\x4d\xa5\x96\xda\x18\x91\xed\x06"
- "\xbc\x0c\xda\xf7\xbb\x4b\xa3\xdf\x0b\x9b\xc6\x5d\x04\x0f\xb4\xe9"
- "\xd0\x03\x12\x26\x07\xbb\x01\xd3\x7f\x53\xe1\x93\x13\x0f\x9f\xff"
- "\x4a\x25\xf8\x90\x1d\xa9\x52\xec\x6b\x46\xdb\xb2\x01\x03\x45\xab"
- "\x83\x70\x80\xf6\xbd\xa8\xfc\x9a\x21\x66\x72\xaf\x26\x3b\xd3\xdf"
- "\xac\x33\x2f\x31\x18\x95\x91\xc1\xd6\xda\x33\xcc\x40\xe3\x46\xeb"
- "\x6c\xad\x78\x2f\x60\x9e\x43\x63\xe6\x4f\x3c\x51\x86\x1f\xf0\xf3"
- "\x84\x8b\x70\x0f\xd7\x2a\x8c\x97\x0b\x70\xf2\x63\xac\x9a\xe9\x2a"
- "\xf1\xf1\x68\x1b\xf9\x55\xa4\xb5\x0c\xb8\x12\x4b\xaf\x3c\xfa\x5a"
- "\x18\x73\x47\x11\x72\xda\x7f\xf9\x95\xad\x23\x2e\x69\x73\xf8\x6a"
- "\xd6\x2e\xf0\xc5\x8d\xcf\x88\x73\xed\x26\xf0\xf2\x24\x9f\xb3\x1d"
- "\xe2\xfc\xcb\x6f\xa2\xeb\x5f\xa5\x88\x39\xfe\x1b\xab\x5e\xd8\x96"
- "\xf9\xf6\xa8\xb8\xbe\x27\xe8\xdc\x07\xf9\x77\x7a\x97\x9c\x13\xad"
- "\x6e\xa1\x87\x00\x1d\x98\x88\x27\x01\x5d\x3e\x48\xb6\x7a\xfc\xca"
- "\x1c\x66\xd2\x71\xbf\x69\x99\x99\x7b\xc2\xed\x84\x43\x26\x81\xfb"
- "\xf2\x1d\xf8\x48\xbf\x19\xb4\xbc\x0b\xe9\x06\x2d\x9d\xe8\xba\x02"
- "\xd9\x92\xe4\xda\xc5\x1b\xcc\xbc\xf4\x0c\x4b\x17\x3a\x22\x2d\x7d"
- "\x83\xdf\xdc\x69\x61\x64\xbb\x1f\x26\x7f\x16\xf4\x0d\xd2\x13\xb0"
- "\x0e\xec\x47\xbd\x6e\xe4\x4f\xd3\xf2\xf3\xe1\x1c\x83\xc7\xde\x2e"
- "\xe6\x19\xf9\x3c\xd2\xd6\x05\xa4\x4f\x5a\x6c\xf7\x9b\xc5\x98\x69"
- "\x69\x6b\x73\xc4\x3a\x46\x67\xe7\xc1\xa7\x72\xd1\x9e\x7e\x91\xae"
- "\x83\x9c\x29\x62\x9a\xc7\xa5\xe9\xc9\x4f\x01\xf9\xb0\x8b\x4b\x4b"
- "\x40\x9b\x59\xf4\x19\x75\xd7\xfe\x44\xec\xf7\x5b\x16\x6f\xa0\xfd"
- "\x32\xd4\xf3\x13\xb5\xee\x0d\x9c\x49\xbf\x98\x32\x4d\xae\x99\xbf"
- "\x2d\x89\x97\x71\x69\x8f\x82\xea\x56\x86\x73\xf4\x91\xe1\x9c\x04"
- "\xaa\x9f\xca\x22\xfd\xa4\x88\xad\x1e\x1e\x60\xe4\x93\x99\x57\xcf"
- "\xcd\xe6\x74\x56\x03\xe5\x8a\xf6\xd8\x21\xff\x27\xcf\x75\x8f\x6b"
- "\x67\x51\xf5\x4d\xc8\x5a\xff\x0e\x9c\xfe\xdd\x16\xa2\x29\x11\xe3"
- "\xe0\x3e\xeb\x4f\xc8\x7e\xe1\xb7\x11\x1a\xd3\x08\xe6\x79\x24\x71"
- "\x70\xdf\x4d\x03\x4c\x57\x8a\xb9\x23\xf7\xf1\x7e\x77\x15\xf1\x54"
- "\x0e\x85\x73\xdc\xa7\x12\xee\x9a\x7d\x90\x5b\xb6\x0e\xb6\x09\xbb"
- "\x91\x94\x59\x7e\x4f\x68\x80\x1d\x2c\x3b\xca\x0e\x86\x3d\x65\xfb"
- "\x87\xfc\x06\x69\x3f\x62\x40\xb9\xbf\xbb\x99\xde\x39\x30\x5f\x72"
- "\x23\xcd\x13\xcb\x81\x90\x2d\x00\xbb\x4f\xe5\x5a\xf0\xbb\x2d\x9a"
- "\x3c\xf1\x37\xfa\xd0\x43\x7e\x08\xc9\xbe\x4e\xa9\x54\xac\x68\x8b"
- "\x83\x07\x33\xd9\x4d\x1b\x49\xaf\xfb\xbb\x7d\x29\x01\x96\xad\x96"
- "\xfb\x95\x5a\x6e\xcf\x85\xca\x25\xbc\x3d\xd8\x20\x6d\x36\x94\x24"
- "\x25\x35\x82\xb2\x23\x49\xca\x12\xac\x35\x0e\xc7\x59\xd2\x9d\xb4"
- "\x5d\x8d\x7a\x52\x3b\xc3\x5d\x8c\x7c\x99\x36\x29\x58\xaf\xbf\xb2"
- "\x30\xd5\x56\xc6\x71\x8a\xbd\x96\xac\xf0\xcc\x54\xc8\x39\xa4\x2b"
- "\x75\x10\x9d\x25\xdd\x73\x69\x84\x4d\xf6\x80\xc2\x93\x0f\x3e\x94"
- "\x71\xd9\xfb\xa4\x97\x06\xad\x8a\x70\x8b\xfe\xad\x11\x2f\xab\x05"
- "\xfd\x16\x3e\xf9\x36\x5f\xb9\x23\xa5\x9c\xdd\xce\xf5\x66\x61\x0b"
- "\x85\xf5\x25\x13\x63\xbb\x50\xb4\xa7\xd2\xb7\x2f\xce\x2e\x27\x01"
- "\x75\x3d\x4d\x76\x39\xdc\xe8\xb3\x37\xd2\x9a\x89\x31\x0b\x3a\x5f"
- "\xdb\xef\x65\xbf\x15\xbe\x4f\xaa\x48\x0f\x20\xe8\x7c\xdb\x75\xfe"
- "\xc4\xb3\x14\x67\x81\xe2\x13\xea\x94\xe2\x70\x6b\xed\x69\xf0\x3d"
- "\x02\x1e\x6d\x89\x9d\xbe\xa0\x9b\xbb\xce\xfa\x69\x1e\xa9\x65\x9b"
- "\x51\xf6\x11\xbe\xf5\xac\xdf\xcb\xda\x32\x25\xad\xa1\xfb\xd7\xc4"
- "\xf9\xef\xf0\x28\x9d\xe7\x79\xcd\xd6\x78\x8e\x74\x72\xaf\xa5\x83"
- "\x2f\x74\x0f\x1b\xcf\xfa\x7f\x60\x29\x03\x0f\xd0\x36\xdf\xab\xeb"
- "\x15\x7c\xa8\xe6\x5f\x70\xa2\x3d\x28\xbe\xd3\x92\xe4\x41\x21\xe0"
- "\x71\xd3\x4e\xb2\x37\x5e\x39\x07\x39\x7f\x14\x6b\xeb\x39\xc8\x09"
- "\x7c\x67\x8e\xa9\x66\x06\xcb\xc2\xbb\x19\x27\x59\xdb\xd3\x61\x3d"
- "\x4b\xc3\x2f\xd5\x7f\x65\x41\x22\xca\xcd\x26\xfd\xe7\xa1\x21\xda"
- "\x93\x6d\x13\x74\xbf\x76\x07\xcb\x50\x50\x1e\xe9\x5d\x6b\x67\xb0"
- "\x0c\xd2\xb9\x22\x2d\x33\x37\x22\xf7\x24\x34\x99\x6a\xf3\x0c\x36"
- "\x7b\x6c\xbd\x6d\xea\x19\xbf\x37\xc4\x1a\xbf\xde\xcf\x66\xda\xbe"
- "\xc7\x7b\xfb\xd9\xeb\xab\xb8\x33\x81\xf3\x2b\x2d\x7a\x29\x53\xbc"
- "\xfe\xa0\xb9\x41\xe2\x9d\xd0\xc1\x03\xdf\x68\x8f\x43\xd5\xed\xea"
- "\x84\x5f\xc5\xa4\xa1\x05\x74\x9e\x42\xa4\xe9\x52\x09\x96\xa9\xa2"
- "\x1d\xaa\x2f\xb4\xc8\xe6\xeb\x97\x51\x19\xd4\x9e\xdc\xe5\x52\x2f"
- "\x4c\x7e\xd2\x00\x63\x11\x67\xaa\x6a\x07\x33\x3d\xb5\x83\xa5\x1e"
- "\x7a\x84\xfa\xf5\xfa\x16\x39\x17\x0d\x8c\xda\xab\xb8\x68\x9e\x01"
- "\x27\xd0\x6e\xaa\x8f\x70\xa3\x33\xfc\x95\xdb\x51\xc4\x15\xf7\x4f"
- "\xc8\xa7\xc0\xeb\xef\xbb\x0b\xf7\xb2\xc5\x7d\x61\xe9\xdb\x67\x29"
- "\xf3\xef\x46\x79\xbb\x67\xb0\x54\x94\xf5\x91\x67\x15\xd1\x5a\xcb"
- "\x37\xdc\x85\xfb\xa8\xec\xcf\x69\x3d\xaa\x06\x7c\xe4\xba\xf4\x46"
- "\x83\x27\xd4\xcd\xc8\xaf\xfc\x7d\x36\x1e\xa1\x72\xfa\xd9\x1b\x57"
- "\x89\xfe\xee\xb4\x58\x73\xa5\x2f\x3b\xd1\xd7\xa8\xbe\x5d\xed\x87"
- "\x67\x88\xca\x7b\x23\xcb\xb3\x0c\x3c\xa7\xda\x27\x0d\xd6\x12\xbf"
- "\xde\x78\xcc\x5d\xb8\x87\xd1\xf8\x50\x7e\x3c\x2f\xf5\xf8\x90\x77"
- "\x70\xec\xb8\x50\x1e\xbc\xab\x46\xb9\xff\x27\xb6\x8f\x44\xfb\x1b"
- "\xb1\x3c\x8d\xe8\x0f\x60\xd5\xb5\x13\x30\x92\xfa\xb5\xd7\xcf\x52"
- "\x5b\xbd\xec\xf5\x90\xa7\xe8\xe8\xf8\xe7\x98\x30\xf7\x81\xf7\xe5"
- "\x9d\x42\xb7\xf4\xc6\x89\xfb\xc2\x0a\x97\xf4\xec\xcd\x46\xcc\xad"
- "\x90\x17\x57\xa2\x05\x82\x9e\xdc\x48\x7b\xbf\x6f\xee\x32\xeb\xe4"
- "\xf8\x52\x5f\x88\x67\x1a\x6f\x8c\xe3\xf4\xfa\xa9\xd4\x56\x6d\x8c"
- "\xb9\xe9\x9b\x21\x85\xf6\x6b\x66\x00\xde\xa3\x16\x26\xf1\x8f\xd7"
- "\xa1\xdc\x6a\x95\x87\x0c\xa9\xeb\x69\x68\x38\x71\xd0\xcd\x1f\xb7"
- "\x30\xcd\x66\x0f\xf3\x77\x7f\xae\xb4\x83\xb4\x10\x8d\xda\xad\x97"
- "\x73\x87\xda\xa8\x7e\x1b\x90\xfb\xc8\x6f\x2e\xc5\xf7\xe3\xc7\x15"
- "\x4f\x98\x41\x71\x84\x1d\xe4\xb7\x4f\x9c\x2f\x00\xad\xc2\x7a\x30"
- "\xd9\x13\x38\xc7\xe4\xde\xf6\xfe\x2b\x28\xc6\x3b\x9d\x2d\xd3\xda"
- "\x76\x71\x3a\xf8\x37\xfb\xa4\x0e\x7e\x7f\x86\x26\x6f\x72\x13\x60"
- "\xec\x34\x0b\x1f\xe3\xe0\xbb\x94\x40\x72\x06\xf3\x27\xcf\xcd\x92"
- "\xf3\x66\xff\x22\x9e\x2c\xe9\x6d\x6e\x88\x95\x51\xbf\x54\xb9\x6b"
- "\x32\xf5\x19\xe5\xac\xd2\xf6\x82\xb5\xb2\x27\xf4\xdb\xaf\xf5\x0d"
- "\x7d\x12\x7d\x43\x1f\x45\xdf\xc8\xaf\x86\xec\x9b\xd8\xcb\xbc\xb8"
- "\xfe\xec\xdf\x27\xd7\x9e\x0c\xe6\x9e\x41\x65\xbc\x5d\x2e\x6c\xfa"
- "\x31\x26\xa0\x0f\x97\x9f\x64\x6f\xcd\xe7\x49\x4f\x25\x5d\x5c\x99"
- "\x6f\xc9\x18\x89\x55\x73\xb3\x9e\x05\x0d\x96\xe7\x8c\xc8\xbe\xe5"
- "\xed\x95\xa0\xe5\x59\x24\xc3\x0c\xa3\x3e\xe0\x47\x1c\x1d\x7a\xcb"
- "\x47\x63\x75\xe3\x5e\x96\x2d\xf1\xf0\xad\xe3\xa4\x97\x90\x71\x55"
- "\xde\xaa\x03\xde\x3f\x20\x60\x1d\xb5\xef\xd4\x09\xfb\xce\x78\x1a"
- "\x7b\x91\x6d\x94\x32\x4d\xca\x55\x90\x0d\xdf\x2a\x13\x36\x3c\x68"
- "\xef\xfa\xb0\x46\xff\xde\x2a\xe3\xa4\x1b\x2e\x55\x75\x84\x44\xcb"
- "\x4a\xa5\x5f\xae\xa0\xf3\x6d\x6b\x54\x47\x48\xe7\x30\x9d\xbc\x83"
- "\xf2\x61\xec\xbf\xa2\x3c\xd2\x6f\xd0\x49\xf5\x8c\xe2\xdb\xdf\x56"
- "\xcf\x1f\x66\x92\x5d\x13\xbe\x5d\xea\x65\xbd\x42\x5e\x25\x18\x50"
- "\xdd\xa2\xed\x7a\xd2\x07\xbe\x6d\x8f\xe9\x64\xdf\x92\x67\x1a\x85"
- "\xfd\xcb\xdb\x75\x1a\x8e\xa0\xbf\x93\xa5\x2f\xfd\xfd\x67\x0f\xcc"
- "\x66\x02\x07\x86\xb9\x25\xe9\x9b\x8d\x84\x93\x6f\xb7\xc5\xc3\x69"
- "\x71\x58\x71\x48\x1a\xf4\x56\x33\x17\x73\xfd\xad\xe6\xbf\xcd\x4f"
- "\xbc\x93\xac\xf1\x22\x12\xce\xa9\x68\xe3\xbb\xdd\x02\xd6\xae\xa3"
- "\x39\xe4\xeb\xf2\xf1\x52\xf2\xdd\xfb\xce\x21\xf2\x91\x1c\x76\x1d"
- "\xb5\x47\x1c\x16\xf2\x09\xc9\x14\xd7\x51\x57\xbf\x8d\xe9\x73\x6d"
- "\xa4\x87\x3e\xeb\x26\x19\x0f\x32\x6b\x2a\x4f\x02\x7f\x82\x79\xbe"
- "\x69\x25\x33\xff\x47\x01\xca\x76\x64\xa6\x91\x0f\x63\xf2\x5f\x4c"
- "\xfe\xc7\x23\x8e\xcc\x4b\x70\x3f\x1d\xfc\x5c\x2a\x37\x1e\x2d\xa0"
- "\xbd\xec\x88\x93\x83\x1e\xf7\x90\x1f\x65\xbd\xc7\x1f\x62\x9b\x06"
- "\x99\x91\x7c\x24\x87\xb7\x9e\xed\xee\x0c\x1c\x13\xf2\x4d\x8a\x8d"
- "\xa5\x81\xff\x48\x07\xcc\x2d\x4a\xe2\x59\xc8\xa1\x67\xdb\x65\xbf"
- "\xbf\xe2\xb2\xdf\xb2\xdd\xd4\x7e\x41\xe3\x5c\x3d\xae\x52\xd1\xf6"
- "\x77\x7f\x1a\x46\xf9\x8a\xeb\xf8\x96\x88\xeb\x78\x99\x3c\x07\x7b"
- "\x90\x95\x16\xf1\x01\x4f\xe0\x20\x64\xae\x33\x22\x5e\x14\xed\x95"
- "\x53\x1f\xa9\x7f\x54\xf7\x87\x43\x83\xc2\xe7\x73\x18\xcf\x8e\x55"
- "\xea\x37\x3e\x7c\xe3\x3b\xc8\xce\xb9\x8e\x8b\xbe\x77\x06\xe4\xb7"
- "\xb9\xe2\x9e\xbe\x8f\x83\x83\xda\xe7\x28\x1c\xd0\x77\xea\x1f\xf5"
- "\x3f\x4c\x30\x01\x0c\xd4\xbe\x5a\x46\xd5\x7e\x52\x1f\xff\x88\x55"
- "\x67\x07\xfa\x89\xbe\x8a\x7e\x8e\xa2\x9f\x1d\x05\x8c\x85\x6a\x32"
- "\x52\xcf\x26\x1d\x2f\x23\x19\xd5\xf1\x11\x78\xf8\x92\x3a\x06\x59"
- "\xd4\xf0\x4a\x69\x9d\xbe\x12\xbc\x49\xa9\x1f\x32\xa9\x9f\x0f\x90"
- "\xbd\xab\xc7\x86\x5f\xb8\x91\x11\x8f\xa3\xf1\xeb\xa8\xdb\xf2\xa1"
- "\xf2\x39\x2b\x1d\xe0\x03\xe0\x4d\x43\x9e\x30\xf2\x14\xa0\xff\x90"
- "\x61\xfb\xd5\xf6\x53\xde\x4d\xa7\x65\xbf\xcc\xab\x58\xda\x3b\xff"
- "\xee\xd2\x7b\xba\x5d\x4c\xeb\xcb\x43\xc8\x87\xfe\x58\x50\x56\x32"
- "\xf5\x47\x41\x3f\x77\xa2\x9d\xa1\xb8\x3e\x1d\xf2\x91\xcd\xed\x27"
- "\x2c\x69\x09\xd3\xed\x38\x85\x7e\x9c\x62\x96\xba\x52\xf0\x5f\xf7"
- "\x13\xbf\xe8\x7e\x79\x6a\x0e\x03\x2d\x7d\x47\xc6\xab\x94\xfe\x57"
- "\x2f\x3b\xc9\xde\xfd\x28\xea\x63\x95\xfc\x56\x27\x9e\xed\x21\x3c"
- "\x12\xbe\x56\x69\xcd\x08\x02\x67\x68\x4f\x7b\x3d\xea\x08\x66\x4e"
- "\x17\xed\x71\xce\x21\x9b\x5a\x13\x9e\x29\x5e\x0b\x9d\x31\xd3\xe1"
- "\xbb\x6e\x0e\x98\x51\xf9\xe0\xe7\xda\xe9\x4a\x30\x1c\xd7\x3e\xf5"
- "\x57\x6c\x1e\xea\xd8\x47\xf2\x77\x6b\xa9\x5f\xff\xc4\xaf\xd8\xec"
- "\x8b\xa3\x29\xef\xb1\x89\xe8\x37\xe9\x32\xa9\x3c\xf4\xed\x92\x93"
- "\xec\xbd\xcf\xc7\xce\x31\xab\xa0\x65\x92\x0e\xbe\xb7\x97\x74\x85"
- "\x17\x59\xaf\xe0\xe1\xc8\x1e\xe1\x22\xbf\x6b\xd5\xda\x81\xfb\xaf"
- "\xd9\x11\x69\x6d\xbf\x78\x38\x1c\x30\x4e\x54\x56\xf5\x73\xc2\x9e"
- "\xd0\x51\xf3\x1c\xe8\x05\x78\x85\x03\x16\xda\x77\xc0\xda\xb9\x27"
- "\xc0\xd6\xee\x62\x46\xc7\x20\xe9\x85\xee\x65\x07\x1a\xb3\x58\xd3"
- "\x10\xf9\x79\xca\xbc\x64\xdb\x10\xc6\x52\xa5\x21\xc4\x93\x92\xce"
- "\x95\xaf\xcd\x4c\xad\x7d\x4e\xe3\xe1\x0f\x7c\x54\x72\x86\xe9\x65"
- "\x8c\xee\x03\x5d\x0b\xac\x3c\x5c\xaf\x57\x0a\x1a\xc9\x77\x70\xca"
- "\x4c\xe2\x5f\x0a\x34\x7f\xbc\x82\xf7\xb1\x63\xce\x0d\x5b\x92\xaa"
- "\x0b\xd9\x6c\xf2\x21\x6e\xf6\x4b\x5e\x4e\xae\xd7\xed\xb4\x1f\x92"
- "\xaa\xfa\xe8\x4d\x95\x3e\x7a\xdf\x5b\x48\xf6\xd9\xea\xfb\x9b\x23"
- "\x90\x61\x44\xb9\x85\x2c\xa3\x71\x88\x65\x12\x1f\x94\xfb\xb9\xe4"
- "\xd9\x48\x2e\xbc\xd7\x67\xe6\x91\x2f\x33\xd9\xae\x93\x31\x1f\xe3"
- "\xfe\xb5\xe4\x97\x9c\x5b\x26\xb2\x35\xae\x9d\x2e\xf6\xde\x85\x7f"
- "\x4b\xd2\xc9\xe3\x99\xd5\x3f\xc3\x0c\x07\xc8\x8e\xaf\x59\x9e\x5b"
- "\x3a\x10\x96\xb6\xb1\x41\x67\x7b\xb3\xe6\x7b\x79\xc2\xbd\x65\x97"
- "\x94\x77\x94\xc9\x90\xbf\xfc\x41\xb7\xf4\x1b\xd8\x3e\xe0\xd9\xa2"
- "\xc4\xc9\x38\xed\x1f\xd0\x3b\x4a\x23\x5f\x4c\xd9\x02\x96\xef\xa7"
- "\x92\xdc\xa3\xca\x8c\xef\x58\xb5\x34\x55\x66\x14\xf6\xc9\x16\xb9"
- "\x57\x86\xb5\x29\x25\xe8\x7c\x7f\xb6\xb6\x9e\xd1\xba\x2e\x75\xc3"
- "\xef\x67\x7b\x75\x7d\x5f\xb3\x13\x88\xdf\x1b\x51\xed\xa9\x69\x9f"
- "\x23\x1b\xf9\x6d\xda\xfa\x26\xf6\x3b\x37\xcf\xb8\x73\xed\x06\x96"
- "\xfe\x83\x2b\x8c\x8c\xf6\xca\x90\x77\x40\xae\xbb\xef\x37\xc4\xf4"
- "\xe9\xd9\x02\xde\x74\xae\x58\xc8\x18\xe4\xaf\x4f\xfa\x11\xf7\x69"
- "\x7e\xfb\xe4\xfa\xfb\xfe\x6f\xe3\xea\xe9\x8e\xae\xa3\xa8\x83\xec"
- "\xb5\xa9\x7c\xc9\x9b\xbc\x5f\x25\xce\x9e\x21\x9f\x5c\x5f\xdf\xaf"
- "\xba\x00\x2f\x96\x49\xf0\x55\x54\x79\xd2\xe3\xfb\x42\xc2\xd7\xce"
- "\x12\x6e\xaa\x67\x96\x77\x4a\xbd\x86\x14\xe9\x17\xd7\xdc\xcb\x7e"
- "\x7f\x1d\xbd\x27\x5c\x77\xdf\x48\xfa\xc0\xdf\x3f\xe1\xa1\x75\x7b"
- "\x34\xc7\x74\x1f\xc9\xfa\x82\x17\xff\x7d\xd1\x0d\xf8\x0e\x69\x97"
- "\xbc\x7d\x2a\x64\xa8\xdd\xc8\x66\x4b\xff\x87\xbf\x17\xf2\x86\xff"
- "\xf2\x47\x83\xdf\x4c\x63\x96\x6f\xd6\xb3\xcc\xa0\xf3\xf7\x8d\x5e"
- "\xdd\x67\xc2\x3f\x8d\xa8\xbf\x66\xee\x32\xf2\xa1\xfe\xea\x39\xef"
- "\x24\x39\x56\x7f\xf8\x0e\x9e\x33\x63\xcf\xbf\xff\x44\xdd\x4b\x01"
- "\x9f\xf3\x87\x79\xbb\x4f\x49\xbb\x73\xa1\x5f\xaa\x9a\xe9\x8d\xed"
- "\xd5\xff\xe1\x3b\xb2\x2d\x7f\xf8\xce\x01\x1b\x23\xdd\xf9\xe1\x26"
- "\xe1\x0f\xf9\x0f\x90\x39\xde\x5f\xa4\xea\x63\xba\x04\x5e\x11\xbf"
- "\x5b\x41\x32\xd8\x17\xee\x6a\xe4\xa3\x75\x02\xfc\x51\xb6\xe0\xe1"
- "\xc1\xeb\x2a\xc0\x9f\xb8\xfe\xbf\x48\xfa\xc6\x71\x69\xe2\x0e\xc6"
- "\xc4\x37\xd5\x33\xe7\x09\xdb\x8f\xea\xb9\x6d\xb8\x1a\x79\xf5\x2c"
- "\x2f\xae\x26\xa4\xfb\x71\x25\xdc\x1b\xc0\x35\x0d\xef\x9b\x09\x2f"
- "\x21\xc3\x5a\x28\x2e\xdc\x70\xf2\xcc\xac\x89\xce\x10\x11\x6c\x3c"
- "\x5b\xfe\x8d\x49\xfb\xb6\x8e\x74\x8a\x09\xb6\x78\x17\x63\x6b\xc3"
- "\xfc\x9c\x75\x26\xf9\xf5\xef\x48\x77\xec\xa2\x7d\xe7\x3f\xf8\xc7"
- "\xee\x3b\x77\xa4\xe2\xb7\x04\xbf\x3d\xf8\x1d\xc6\x2f\x3d\xf6\xfb"
- "\x20\x35\xe8\xec\x48\x07\x1c\x05\x8f\x75\x71\x34\xb1\x43\xf8\xd6"
- "\xaa\x25\xb9\x28\x51\x61\x6a\x7f\x53\xf1\x6c\xe4\xc9\x73\x97\xc8"
- "\xfe\xce\x62\x78\x4e\xb5\x3a\xb0\xae\x25\x03\x26\x33\xd0\xe7\xe4"
- "\xb9\x6d\xd4\x5f\x6a\xef\x70\xf2\x2c\x6f\xfc\xf9\x29\x2a\x93\xfa"
- "\xef\x4f\x9e\x45\xe5\x31\x7e\xed\x36\x9b\x06\x4f\x15\x4e\x74\xb6"
- "\x44\x3f\x8c\x32\x24\x1f\x84\xfc\x28\x43\xcb\x1f\x85\x3d\xf2\x09"
- "\x39\x11\xf9\x20\x13\x1b\xb5\xb3\x59\x41\xe7\x07\xc6\x77\x57\xc9"
- "\xfd\x0c\xfa\x36\x10\xf7\x2d\xf9\x0b\x19\xef\x7b\xd4\x69\x94\x75"
- "\xce\xf2\xf6\xb3\x8e\xab\xd4\x7a\xbf\xe6\x3b\x33\x7a\xfe\xf1\x6a"
- "\xf0\x77\x8d\x5e\x3a\x47\x44\xfc\xd0\x7c\x4f\x7a\x80\x79\x1a\x15"
- "\xa6\xd4\xcc\x4a\xcd\x2e\xe5\xee\x7e\xf6\xc1\x5b\x9d\xa1\x81\x8b"
- "\x5c\x0f\x3f\x10\xb6\x77\xfc\x5c\x19\xf3\x94\xdc\x22\x6c\xd9\x4f"
- "\xb1\x3f\x0e\x7a\xfc\xe2\x8c\x2e\xdd\x1f\xa1\xf7\xb4\xdf\x4c\x6b"
- "\x03\x64\xec\xa8\x6f\x7a\x05\x79\x9b\x28\x1d\x69\xe4\x47\x60\x77"
- "\xdc\x3b\x5e\x33\x53\xdd\xa7\xf9\xe3\x8b\xc4\x5b\x88\xf6\x86\xff"
- "\xc5\x4d\x6d\xc6\x5c\xb2\x50\x1f\x1c\x90\xff\x28\x1e\x1f\xcd\x09"
- "\x6b\x31\xe9\x0a\xff\x58\x0e\xbc\xe3\x90\xb5\x2d\x17\xd7\x87\x3f"
- "\x8a\xf3\xc7\x8e\x30\x3f\xe5\x4f\x9e\x69\x21\x9e\xa4\xb6\x74\x92"
- "\xf1\xae\x46\xee\x1e\x4e\x99\x05\x3c\xfc\xe3\x9e\x77\xed\x72\x6c"
- "\x2e\xb2\xdc\x3d\x5a\xdf\x9b\xd4\xbe\x23\x4d\xec\x51\xdd\xd4\x20"
- "\x7d\xf6\xe3\xb9\x67\x42\x9d\x15\xc6\x99\xf8\x01\xac\x0d\x67\x25"
- "\x2c\x3e\x9c\x1d\x5d\x1b\x2e\xaa\x1d\x1f\xce\xfe\x3b\xea\x18\x55"
- "\xeb\xa8\xfb\x07\xeb\xa8\xbb\x50\x1d\x72\xaf\xf9\x60\xfa\xc5\xcb"
- "\x8e\x1f\x8a\x18\xc9\x4a\xd5\x2c\x35\x0e\xe7\xa1\xea\x08\xe4\xb7"
- "\xb0\x69\x6e\x2a\xf1\x36\x64\x57\x4a\xf1\x0b\xc2\x2e\x85\x1d\xb2"
- "\x9f\x63\xee\xe2\x8f\x59\x1f\x3b\x28\x7c\xd8\x1c\x2a\x22\x99\x6d"
- "\xee\x92\xd1\x9a\x59\xcb\x46\xf5\x1f\xae\x22\x78\xef\xc2\x38\xec"
- "\x8c\xc3\xb3\xce\xc0\xc7\xcc\xb3\x8c\xf4\xab\x5d\xa4\xd7\x5e\x82"
- "\x79\x95\xaa\x80\x36\x80\x47\x8f\x08\x78\x80\x7f\x11\xf2\x16\x64"
- "\x36\x21\x6f\xf9\x85\x9f\xd3\x64\x11\x97\xc0\xb9\x2d\x83\x74\xdf"
- "\x91\xd1\x1c\x6b\xd0\xc9\x96\x50\xbc\x02\xd2\x3b\x73\xa3\xaf\x6e"
- "\x71\x38\x81\x0b\x79\x0a\xbc\x3f\xc5\x2b\xf0\x04\xbc\x2c\x02\x3e"
- "\xba\x71\x84\xa5\x35\x82\xf7\x04\xcd\x4e\x25\xba\xbe\x5b\x8d\x59"
- "\x50\x3d\x12\x8b\x59\xd0\x44\xba\x9e\x6e\xdc\x8f\x30\x43\xa4\xfa"
- "\x9b\xa1\x9d\x23\x2c\x63\x57\x31\xcb\xdc\x49\xba\xbc\x13\x92\xf7"
- "\x11\x76\xe0\x14\xbf\x60\x4d\x26\xed\x25\xc4\x78\x1f\x3a\x53\x1e"
- "\xa3\x5b\x06\xa1\x03\xb9\x28\x78\x1f\x12\xeb\x60\xb8\x6a\xe6\x3c"
- "\xc0\xb8\x0d\xb0\xf3\x7a\xd9\xc1\x2a\xc0\xcf\x38\xde\xd8\x6a\xf6"
- "\x24\xf5\x71\x31\x27\xde\xcd\x90\xf4\x1d\x65\x75\x4d\x84\x13\x91"
- "\x9d\x39\xec\x26\x1f\xcb\x92\xe7\x19\x13\xb1\x26\x76\xce\x21\xfb"
- "\xbf\xd2\xc7\x98\x25\xb2\x73\xa9\xce\xf1\x3c\x4b\xf0\x84\xb3\x19"
- "\xfd\x4a\x4f\xf3\x81\x9b\x56\xb1\x2c\xda\x7f\xa0\xbd\x12\xeb\xe3"
- "\x22\xff\xa4\x8c\x12\x96\x15\x5f\xf6\x63\x1b\x0a\x57\xde\x9c\xf5"
- "\xe3\x7c\xeb\x23\x2b\x0b\x1f\x5b\xbf\xbc\x30\x9f\x2d\x94\x66\x13"
- "\xc2\x85\xf4\x06\xb2\x99\x58\xbf\xb2\xa8\xc0\xba\x62\x5d\x61\x61"
- "\xfe\xea\x22\xeb\xbd\x77\x2d\xf9\xba\x1f\xc1\x9d\x96\x3d\xc2\x6f"
- "\xac\xb0\xa1\xf3\x7c\xce\x7f\xf6\xad\x91\x9a\x62\x66\x30\x97\xdf"
- "\xfd\x80\x39\xbc\xd0\x2a\x63\x19\x75\x19\xc9\x6e\x95\x3b\x72\x1a"
- "\x24\x9f\xda\x95\x28\xe5\xa9\xe1\x85\xf2\x6c\x45\x97\xd4\xc9\x04"
- "\x17\xa6\xcb\x39\xe5\xb9\x22\xa1\x88\xd1\xfd\x63\x74\x6f\x2e\x62"
- "\x2e\xf7\x0c\xda\x0f\xf7\x5c\x21\xf2\xed\x5c\xa4\xd3\xf2\x69\x79"
- "\xe4\xfb\x4e\x71\x16\xa2\x49\xf8\xd4\xec\xcc\x06\x7c\x2e\x09\x3a"
- "\x3d\x59\x5e\x7d\xb7\x5f\xdd\x5f\x1f\x90\xf6\x7a\x5d\x46\xf2\xab"
- "\xc7\x7f\x76\xe5\x88\x5a\x4e\x01\xea\x9b\x8a\xbc\x4b\x31\x06\x7d"
- "\xaa\x5d\xdf\xac\x5e\xb5\x5d\xd2\xee\xb4\xf3\x7e\x69\xdf\xe1\x29"
- "\x8b\x3b\xd7\x2d\xce\xe6\xd3\xda\xa8\xf2\xa4\x41\xb5\xbc\x3d\x1a"
- "\x4d\x40\xfe\x56\xf0\x75\x0b\x2f\x9e\x16\x7a\xa4\xfc\x33\xc6\x5f"
- "\x8a\x0a\xa7\x9d\x96\x97\x40\x1f\xd2\x4f\xb2\xce\x86\xf3\xf1\x25"
- "\x3a\x82\xf7\xac\x5e\xb1\xe6\x31\xdb\xf2\xa2\x95\x0f\xaf\x5c\xb5"
- "\xb2\x68\x83\x38\x4e\x3e\x5b\xfc\xfb\xe7\x6b\xf2\x1e\x38\xdf\x07"
- "\xf4\x6c\xd2\xb1\xa8\xbe\x63\x03\x64\xd3\x20\xf5\x5c\x5d\xbb\xc2"
- "\x4e\x36\xeb\xe2\xda\xdd\x25\x6c\x04\x1b\x85\x1f\x83\xae\xbd\xe0"
- "\x07\x43\xea\x7e\x87\x4f\x85\xbd\x78\x3f\x6c\x9a\xdb\x6c\x9d\xc1"
- "\xe6\xf7\xb2\xc3\x8b\x68\x9f\x0b\xf0\xf3\xd3\x7a\x58\xb3\x91\xd6"
- "\x2d\x8c\x42\xf8\x16\x35\x8e\xea\x47\xaf\x13\x0c\x88\x27\x04\x0c"
- "\xf6\xf4\xb2\x8f\xae\x16\x30\xf8\xca\xb2\x47\xf8\x30\xf8\xca\xf2"
- "\x12\xe1\x16\xb5\x59\xe1\x39\x3b\x39\xcf\xd9\xa1\x7c\x55\xb0\x93"
- "\x7f\x55\xb0\x23\xe6\x7f\xee\xa3\x2a\x7c\xbb\x17\xdf\x3e\x4d\xf1"
- "\x61\x6a\x4e\xb1\xbd\xb4\xff\x4d\xcf\xe6\xa2\x54\x16\x31\xcd\x1c"
- "\xa0\xf6\x78\x06\xb2\x04\xbf\xdd\x87\xfc\x9e\xc0\x2d\x0c\xbc\xa4"
- "\xf0\x63\x26\xf7\xeb\xc0\xef\xe1\x3b\x0f\xda\xe5\x19\x38\x47\xbc"
- "\xc5\x80\x02\x9e\x0f\xfd\xdd\x8f\xf5\x33\x8b\xca\xa5\x3e\x8b\xf3"
- "\xc9\xd3\xb9\x37\xe8\xfc\xa8\xc5\xcb\x3a\xed\x2a\x6f\x2a\xec\x2d"
- "\x08\x06\x63\xc7\xf3\x23\xe1\xc7\x18\x30\xbe\x9c\xbb\x8e\xb6\xc8"
- "\x31\xfd\xe8\x38\xa5\x2d\xea\xe3\x5f\xc5\xce\xc5\x7f\x74\x06\xcf"
- "\xa3\xf8\x29\xdc\xf5\x97\x8e\xb8\x7d\x65\xbc\xfb\x58\xfa\x57\x9f"
- "\xce\xfd\xb6\x8d\x14\x5f\xfb\xe3\xeb\x24\xde\xfc\xe5\x0f\x7e\x47"
- "\x41\x02\xbe\x89\xd0\x39\x4e\x09\xcb\x8f\xef\xf1\x6c\x39\xa5\xd9"
- "\x69\xa0\xfe\x8f\x4f\xb8\x1f\x09\x33\x11\xef\xb9\x2f\x2c\xec\xfe"
- "\x54\x5f\x05\x3a\xc5\xd9\x95\x46\xf6\xe2\x90\xed\x68\x2f\x5a\xf8"
- "\x5a\x0f\x3a\x3f\x2e\x89\x9e\x13\x33\x49\x7e\x8f\x78\x2e\x8a\x81"
- "\x45\xb8\x4f\xfc\x1b\xb5\x89\x70\x1f\x65\xb7\xd0\x1e\xb5\x9c\x03"
- "\x1f\xef\xfb\xc7\xe6\xc0\xc7\x42\xff\x8b\xb2\x16\x72\xbd\x83\xdf"
- "\x54\xc5\x96\x09\x1b\x82\x70\x80\xce\xdf\x1a\xb0\x6e\x6c\x91\xf4"
- "\xe4\xf0\x35\xc2\xce\xa4\xd8\xd7\x4c\x67\x5c\x77\x9f\x63\x26\xc5"
- "\xe5\x73\x11\x9f\x7d\xa8\x44\xd8\x5e\x18\xf1\x5d\x2b\xd9\x66\x90"
- "\x2d\x5d\x8a\x88\xb1\xf6\x31\xdb\x7d\x86\x19\xfa\xd8\x9f\xe6\xd0"
- "\x5e\x50\x0c\xd6\x7f\xda\x4a\x7b\x7f\xbc\xf2\x48\xb6\xb9\x44\x2f"
- "\xca\x50\x46\x06\xe7\x69\xdf\x51\x2c\x5f\xfa\xae\x97\xfd\xe9\x31"
- "\xf1\x1d\xe5\x25\x5f\x4d\xa5\xa9\x4b\xc1\x67\xcd\xa3\xfc\x61\x3c"
- "\x37\x29\xa9\x4b\x38\xd6\x83\x48\x71\xb8\x15\xef\x1e\xc0\x7a\xec"
- "\x45\x5a\x8e\xd8\x83\x18\xb5\xd0\xde\x24\xe3\xc6\xb3\x7e\x8f\xf7"
- "\x0b\xb7\x68\x0f\x9d\xc9\x2d\xc2\xda\x29\xe4\x92\x3f\xbd\xdb\x74"
- "\x82\x19\x6c\x8f\xd0\x78\x1e\x16\xba\x56\xe0\x5e\x8b\x6c\xdf\xe1"
- "\x07\x87\x2b\x8f\x97\x0d\x03\x37\x03\x7a\x23\x3b\x60\x09\xd1\x9a"
- "\xdd\x7c\xc0\x72\x0e\xe3\x73\x38\x1d\xb4\xae\x55\xf2\xc4\xf2\x3b"
- "\x0d\x27\x13\x2c\xa9\xf7\xe1\xfd\x7c\xcd\x1e\x49\xc3\x47\x2f\xfb"
- "\x53\x1a\xc1\x0d\x78\xec\xed\x5c\x15\xf3\x69\x3a\x2c\xcf\xaf\x81"
- "\x97\x3b\x6c\xd3\x6c\xec\x22\x23\xca\x41\xb4\x83\xfc\x73\xd8\x23"
- "\xc5\x4a\x0f\xed\x9d\xdf\x77\x46\xe1\x64\xdb\x4f\xe7\x34\x48\xee"
- "\x59\x6c\xe7\xc3\x24\xc7\xd1\x99\x28\xda\x37\xa7\x33\xe3\xbb\x20"
- "\x07\x53\x1b\x50\xd6\x7e\xed\xec\x78\x35\xd2\xa8\x0d\x74\xee\xa9"
- "\xe6\x27\x62\x4e\x92\x6e\xc3\x24\xf6\x0e\x12\x1e\x3d\x71\x5f\x00"
- "\x65\x9e\x12\x7b\x5e\xc3\x4d\x6a\x39\xe4\xd7\x27\xe8\xfc\x84\x69"
- "\x65\x28\x64\x27\x5b\x28\xec\xe1\xbc\xf2\x7b\x69\x27\x74\x5f\x40"
- "\x11\xe7\x55\xe8\x7b\x69\xbf\xf3\xc9\x9c\xa8\xad\xa5\x38\x43\xf2"
- "\xc9\x02\xcd\xef\x0f\xee\x97\x44\xcf\xc0\x01\xa6\xc3\x55\x33\x07"
- "\x02\xa0\x05\x81\xaa\x99\x59\x78\xb7\x0a\x94\x68\xef\x05\x75\x19"
- "\xe4\x2f\x60\x1d\xd3\x2b\x49\xbe\x7d\xe4\x0b\x82\xce\x76\x4a\xfb"
- "\xee\x4f\x0e\xa9\x7e\x21\x12\x4e\xb1\x4f\xb6\xc6\xf6\xd0\x23\xaa"
- "\xfe\xf7\x93\x80\x94\x3f\x3e\x09\x08\xfd\x6f\xcd\xcc\xae\x17\x36"
- "\x86\xf4\xad\x1b\xbd\x7a\x69\xf3\xf8\xc9\x80\x97\xfd\x35\xce\xe6"
- "\xf1\x93\x16\x2a\x6b\x7c\xff\x19\x43\xaa\x6f\xb4\xff\x3e\x26\x78"
- "\xbf\xa8\x3c\xff\x67\xab\xa8\x77\xf3\x8c\x65\x0a\xf1\x7e\x49\x4a"
- "\x2a\xd9\x37\x79\x6c\x43\xa4\x07\x9e\x2c\x75\x0b\x32\x8f\x6a\xcf"
- "\x78\xe9\xc9\xb1\xcf\x97\xd0\xb3\x84\xd9\x7f\xdb\xb5\x3d\xa5\x1a"
- "\xbd\x42\xf1\xba\xb8\xa3\x19\xb4\xd1\x16\x10\xfe\x08\x3c\xe0\x25"
- "\x29\xd6\xb5\xad\x90\xce\x0c\xfe\xf7\x2b\xe4\xa7\x40\xce\xcd\x3f"
- "\x0b\x7a\xad\x38\x6f\xe7\x0e\x92\xa7\xfc\x14\x1b\x64\x88\x21\xdf"
- "\x34\xe4\x3b\xd2\x5e\xe2\x23\xfb\xb0\x12\x8a\xfb\xd8\xa7\xd6\xed"
- "\x4f\x1c\x6a\xfe\xa6\x89\x2d\x43\x9d\xc0\xcf\x97\x17\x5d\x3c\xdd"
- "\xf8\x6f\xdf\x85\x78\x6b\xc9\xeb\x65\xb3\x89\xe4\x73\xd2\xbf\xdc"
- "\x88\xfa\xef\xe5\xa2\xfd\x47\xc2\xfa\x10\x1b\xd5\x4f\xe1\xdf\x2a"
- "\xb3\xb3\xb0\x73\x0a\x8f\x6c\xc4\x78\x0d\x5b\x20\xbf\x1d\x64\x9d"
- "\xd2\x66\x86\xf6\xfd\xcd\xa5\x01\x3e\xe4\x09\xef\x23\xfd\xbf\x1f"
- "\x63\x05\xba\xf5\xe7\x8f\x3c\xe1\xb7\x18\xd9\x31\x13\xbd\xe9\x65"
- "\x7f\x7e\x8b\xda\x75\xa3\xad\x8c\xdd\x70\x4a\xbc\x2f\x91\x7c\xdf"
- "\x9f\xbb\xd5\x6b\x0b\xf9\xe3\x8c\x6f\xd3\x3f\xaf\x5b\xbd\x82\x9c"
- "\xba\xde\xb0\x28\xbf\x38\x7f\x95\xf5\x7e\x72\xf9\x7a\x9e\x4d\xa2"
- "\x31\x16\x17\xac\x7b\x0f\xad\xa5\xc4\x7b\x53\x7c\xb0\x0b\xc5\x06"
- "\xd3\xe2\x82\x61\xce\x65\x90\xbe\xfa\x7f\x33\x36\x98\xc6\x5b\x53"
- "\x5c\xb0\xd8\xde\xcd\x91\xbc\xe8\x1c\x50\xde\x09\xd2\xb3\x58\xbf"
- "\x9d\x7f\xee\xa3\x79\x24\xd7\x97\xee\x9e\x78\x9f\x39\x82\xb7\xda"
- "\x7a\xd6\x8f\xf4\x80\x76\xb6\x13\xb8\x68\x0a\x3a\x8f\x18\x62\x67"
- "\x49\x8e\xa4\x02\x6e\xd2\xfe\xd8\x48\x79\x8f\x58\x35\x1b\x07\x35"
- "\x06\xb4\xb0\xc9\x50\x2a\xae\x48\x93\x7a\xc5\x23\xd7\x34\x29\x53"
- "\x8c\x72\x4f\xeb\xc8\x22\xed\xac\x92\x9c\x9b\xef\xa8\x73\xf3\x48"
- "\xde\x85\xec\x50\x62\x73\xe3\x48\x73\x6c\x5e\x7f\xaa\x7d\xdb\xfc"
- "\xb7\x6c\x58\x54\xf9\xee\xb2\x93\xec\x2f\xbf\x25\x5d\xa3\x3c\x9b"
- "\xfc\x97\x5d\x54\x96\xf4\x3b\xf1\x97\x0d\xea\x3d\xea\xf8\xcb\x72"
- "\xf5\xfe\x4a\xdc\xdf\xa3\xde\xcf\xc0\xfd\xcd\xea\x3d\xe6\xec\x5f"
- "\xae\x50\xef\xd3\x70\xaf\x53\xef\xb1\x76\x1c\x3d\xa1\xde\x4f\xc7"
- "\xfd\x47\xea\xfd\x15\xb8\x7f\x5d\xbd\xc7\x1c\x3c\x2a\xfc\x2d\xa3"
- "\xed\xc6\x7e\x76\xb4\xfa\xe2\xe5\xcd\xa3\x39\x72\xcf\xf9\x68\x03"
- "\xd6\x90\x6c\xb9\xf6\x44\xd3\xf6\x62\x6c\xc2\x1a\x7c\x91\xbe\x84"
- "\xea\x41\x7a\xbb\x97\xb5\xef\x8d\x4b\xcf\x56\xf3\xf7\x80\xce\xd9"
- "\xe3\xd2\xe7\xa8\xe9\xa0\x7f\x1f\x76\xc5\xa5\x67\xca\xf4\xbf\x98"
- "\x30\xd7\x59\x5c\xba\xea\x23\xfe\x2f\x19\x5e\xf6\xb6\x37\x2e\x3d"
- "\x55\x4d\x9f\xaf\xd9\xdf\xa8\xe9\x06\x35\xfd\x01\x2f\xfb\x5d\x5d"
- "\x2c\xfd\x48\x48\x4d\x07\xfd\x3f\x62\x8b\x4b\x8f\x9e\x69\x11\xf1"
- "\xd9\x4a\x68\x6e\xfd\xa5\xce\xcb\xf6\x97\xc5\xe5\xf1\xaa\xdf\x82"
- "\xff\x7b\xb3\x25\x2e\xfd\xb0\x9a\xee\xf6\xea\xa6\xc6\x97\xd9\x31"
- "\x11\xad\xd2\x35\xb0\x65\x13\xe9\xe4\x49\x7e\x11\x76\xc8\x82\xa7"
- "\xee\x89\xd0\xd9\x27\xf3\x2e\xde\x6b\x2d\xe5\xbc\x97\xf5\xf4\xa9"
- "\x76\xb7\x76\xb2\x81\x94\xe7\xc8\x7a\x0e\xaa\x3e\x04\xfc\xe2\x6c"
- "\xd9\x46\x91\x26\x7c\x11\xdf\x64\x2f\x93\xfe\x79\xb5\x58\x0f\xa4"
- "\x9b\x52\xf7\xed\x91\x67\x03\xe9\xea\xa9\x1c\xd2\x5f\x7b\x8a\xce"
- "\x49\xdf\xcd\x90\x61\x29\x8d\x74\x34\x04\x8f\x78\x5d\x94\xa4\xfb"
- "\x3d\x11\xe5\x1c\x9d\xdf\x94\x7a\x2c\x9a\x8b\x94\x9f\x6c\xcd\xe2"
- "\xf3\x7a\x59\x8f\xd0\xbf\x25\x58\xa6\xbd\x18\x74\xf6\xf4\xc4\xce"
- "\xcd\xf4\xcc\x51\xd3\xf7\x20\x3d\x10\x97\x6e\x9d\x90\xb6\x83\x0e"
- "\x72\xe3\x11\xd7\xe8\x08\x0f\x84\x47\x78\xa8\xe6\xaf\xd2\xe6\x1c"
- "\xb4\x6e\x66\xc4\x75\xa4\x81\xce\x95\x50\x4c\xc5\x70\x31\xf7\x93"
- "\x3d\x23\xd2\xa7\xde\x17\xf0\x83\xc7\x08\xf2\xea\x87\xc9\x76\xf5"
- "\x0c\xa3\x7d\x55\x87\x8f\xe2\x73\x99\x39\x9d\x57\xde\x34\xc8\x4c"
- "\x74\xee\x84\x6c\xd3\x69\xcf\xf3\xde\x02\x3f\x3b\x54\x10\x61\x4d"
- "\x28\x7b\xd7\xc3\x1a\x7f\x71\xac\x3e\x76\x26\xf6\x08\xed\x43\xcf"
- "\x74\x88\x18\xb2\xc7\xde\xa7\xb6\x9a\xcb\xc9\x1e\x60\x6e\x07\x7f"
- "\x4f\xf0\xc6\x56\x73\x39\xb3\x7a\xd9\xb1\x2e\xdc\xa7\xca\x1f\xde"
- "\x21\x7d\xa2\x3e\xc9\xb9\xfc\x57\x93\x94\x99\x8f\x1a\x25\xbd\xf8"
- "\xab\x89\xff\x27\x9d\xb3\xf8\x2b\x95\xd1\xe1\x4f\x9e\xd9\x31\xde"
- "\xf7\x9b\x76\x31\xfd\x68\x25\x78\x93\x53\x6d\x7a\x49\x9f\xfe\x1a"
- "\x56\xf4\xc6\x72\xd2\x93\x8b\xf8\x91\x95\xbe\xf6\xbd\xab\x43\xfa"
- "\x43\x1b\xfb\xd8\xe3\x57\x30\xcb\xd2\x90\x9e\xf2\x6c\x4a\x29\x42"
- "\xdd\xe0\x49\xc0\xcf\xea\x7f\x83\xf7\x6f\xaf\x6e\xd3\x87\x05\xbf"
- "\xf2\xd7\xb0\xd0\xad\xba\x7c\x0d\xb4\x86\x78\xba\x23\xc4\x8b\x9b"
- "\xc0\x8b\xbb\x40\xff\x8d\x91\xf5\x05\x97\x84\xd7\x16\x4c\xdd\x55"
- "\xc8\x4c\x91\xb5\x99\x69\xdb\x46\xd8\x3c\x6d\xfd\xd9\x55\x8c\x35"
- "\x25\x68\x49\xaa\xc5\x9a\x42\x3a\x9b\x14\x5d\xaa\xd8\x43\xa6\x7b"
- "\x45\xff\xae\xaf\xa9\xf8\xc2\xb1\x70\x23\xeb\x33\x85\x5f\x05\x6a"
- "\xcb\x78\x7d\xad\xda\xc1\x0c\x11\xf5\xfc\x65\xe9\xe7\x6c\x3a\xf8"
- "\x67\x7d\xca\x19\xee\x3e\xb9\x8a\xe9\x29\x7e\x68\x69\xbe\xd0\x8b"
- "\x4e\x3a\x54\x10\x66\x1e\xfb\x51\x56\x5a\x48\x63\xf4\xe9\xf7\x89"
- "\x4f\x23\x5b\x64\xe4\x4f\x3d\xc9\x3e\x5d\x6e\x0e\x61\xcd\x08\x81"
- "\x27\xff\x09\xc9\xc0\x9f\xae\x93\x7e\x1c\x3e\x6d\xa3\xf3\x92\xee"
- "\xc2\x3b\x29\xed\x69\xc7\xe7\xc2\xe6\xa7\x44\xce\xad\x4f\x57\xd1"
- "\xb3\x83\xce\x83\x26\x9d\x6e\xff\xd5\xb9\xd0\x24\xa9\x7b\xfb\xf4"
- "\x31\x75\x7d\x70\x4b\xd9\xee\xd3\x09\xf7\x31\x15\xd7\xb1\x16\x4e"
- "\xb1\xd3\x1a\x89\x7f\xe5\x5e\xb1\x3f\x4f\x67\xe3\xed\xb7\xbb\xf9"
- "\x48\x9d\xea\xb3\xc7\x7b\xb3\xb2\xf5\x58\x8b\xf4\xab\xe7\x15\x72"
- "\x9e\xd0\xd5\x6f\x3d\x26\xf7\x26\xb6\x1e\xeb\x10\xba\xfa\xad\xc7"
- "\xba\x37\xcf\xa0\xb3\x00\xde\xac\xe1\xc4\x63\xe0\x23\xbd\x86\xe1"
- "\xa4\x91\xb6\x09\xd7\x23\xd7\xd1\x6e\xeb\x4c\x96\x46\x7b\x44\xb9"
- "\x11\xe9\x57\x52\xce\xe1\xe3\x73\xf8\x56\xf1\x6e\x56\xaf\x8d\x25"
- "\x48\x19\xd2\x5b\x7e\x53\x23\xb3\xa2\xad\xc9\xdc\x78\xcc\x25\x6c"
- "\x16\x5d\xc7\x1a\x3c\x3e\x8a\x0b\x13\x61\x72\x2f\xef\x78\x36\x4f"
- "\x3c\xe6\x52\xf3\x7f\xd4\xe9\x43\x1f\x8c\xc7\x72\x3c\xa1\x41\x95"
- "\x27\xf4\x76\xa1\x8d\x39\xdc\x75\xac\x40\x9e\xab\x3e\x7e\xb5\x46"
- "\x57\x25\x8e\x1e\xbf\x4c\xc5\xf5\x6e\x09\xb7\xe3\xd9\xea\x7a\x35"
- "\x8b\xee\xb1\x76\x67\x49\xdb\x93\xe3\x26\x8d\x47\xf6\xaa\x79\xe8"
- "\x1b\xf4\xd7\x2f\x69\xed\xf1\xd9\x18\xb7\x76\xf9\xde\x2b\x74\x6b"
- "\xe8\x1f\xd6\x2c\x6f\x01\xf5\x6b\x22\xda\x2a\x60\x51\xc2\x12\xd0"
- "\x66\x3b\xd9\x69\x13\x9f\xe2\x09\xdc\xee\xf6\x88\x31\xe8\xfd\x80"
- "\xec\xf2\xa9\x1e\xf2\xab\x43\x74\x13\x65\x1a\xa8\xbc\xb8\xf6\xbf"
- "\xa2\xb5\x85\xea\xa3\x77\xe8\x6b\x8e\x90\xab\xd1\x67\xca\x43\xe3"
- "\xda\x6f\x23\x9d\xdd\x19\xc0\x8c\xec\xdf\x7a\xbb\x09\x26\x12\x66"
- "\xbd\xfb\x54\x99\x5e\x1d\x87\xde\x97\xc7\xc2\x43\x3e\x2b\x46\xd0"
- "\x86\x42\xb2\x83\xea\xed\x56\xe1\xa7\xc6\x34\xe8\x15\xe7\xd4\xd5"
- "\x77\xb7\xc5\x7d\x7b\x55\x34\x2f\xda\x4d\xbc\x11\xd9\x14\xd0\x1e"
- "\x93\xc4\xd7\xde\x82\xb8\xef\x0a\x72\x4f\x83\x47\x06\x0f\xb9\xf9"
- "\x39\x11\x23\x0e\xf2\x50\x6f\x49\x0c\xde\xb2\x9c\x71\xea\x98\xa9"
- "\xd5\x81\x3c\xf3\xb5\x76\xe2\x5e\x5d\x83\x7b\xdd\xb1\x31\x39\xee"
- "\xd5\xbe\x23\xfd\x0d\x9e\xab\x28\xde\xe2\x04\x7e\xe8\x75\x1e\xac"
- "\xee\x9d\xe1\xdb\xdd\x02\x1f\xd9\x67\xf3\xc8\xc6\x1c\x70\xb5\x4b"
- "\x1c\xfa\x2c\x5d\xae\x85\x9f\x09\xbf\x60\xb4\x4f\x28\xe3\x92\x7c"
- "\x96\x85\x72\x17\xc9\xfa\x3e\x53\xfd\x3f\x7e\x06\xf9\xcf\x3b\xff"
- "\x7c\xb9\xee\xce\xe5\x79\xd6\x25\x37\x8b\xb3\xa5\x37\xac\xb3\xd1"
- "\xb1\xd1\xbc\xd8\xc3\x58\x9e\x3b\x35\xe6\xcb\xeb\xb3\xba\xa8\x2f"
- "\x2f\xd7\x50\xbb\x84\xff\x67\x3d\x7c\x84\xd7\xd3\xb9\x0f\x5e\xcc"
- "\x1b\x6a\x30\x86\x8e\x33\xec\x72\x8a\x23\x5b\x6a\xe3\x5f\x90\x9f"
- "\x37\xd0\x4b\x8a\x83\x3c\x50\x7a\x86\x4d\x21\x9b\x22\xa2\x3f\xa4"
- "\xf7\xe2\x89\x48\xdf\xea\x1b\x88\x9d\x37\xfb\xe2\x30\x9d\x91\xe4"
- "\x8e\x1c\x3d\xf2\x87\x09\x1f\xc8\xbe\xbc\x9f\x7d\xb1\x0f\xf9\xe8"
- "\xfc\x64\x51\xb5\xd0\x25\x0c\x66\x47\x8c\x43\x8d\x8e\x41\x36\x59"
- "\xc4\x14\xb3\x87\x98\xf5\x27\x74\x2e\xa9\xef\x36\x9e\x38\x98\x8d"
- "\xf4\x14\x91\x1e\x42\xdd\x5b\x07\xb3\xf1\x2e\x05\xef\x36\xe0\xaa"
- "\xa0\x0c\x7b\x0d\xda\x5d\x3a\xc8\x66\xa2\x2d\x03\xdc\x35\x98\x8d"
- "\x76\xf6\x3b\x1e\x63\xd3\x3b\x6d\x03\x24\xdf\xa1\x3c\xaf\x8c\x95"
- "\x86\x6f\xf1\xdd\x21\xf4\xcb\x4e\x3a\x11\x5c\x4b\xaa\x71\x2d\x8d"
- "\xb0\x94\xd2\x4d\x58\xf7\x36\xa1\x7e\x3a\xbf\x89\x72\xc8\xd7\x86"
- "\x6c\x0b\xfa\x46\x3a\x34\x94\xbb\xc9\xc7\xfb\x51\xf6\xc0\x21\x48"
- "\x76\x1e\x7b\x77\xb4\x4c\x95\xa7\xc6\xfc\xfe\xe2\x15\x5e\x39\xd2"
- "\x85\x36\x35\x90\xdd\x35\xd2\x40\x93\xbf\x68\x89\xf1\xc3\x5f\xbc"
- "\xac\xde\x27\x46\xf3\x3a\x72\x58\xe9\x59\x66\x11\xb6\x03\xeb\x13"
- "\x40\x8f\xbf\x98\x47\xfe\x9e\x62\x65\x7e\xfe\x5b\x2a\xaf\x0a\xe5"
- "\x39\xf2\x59\x22\x68\xb5\x11\x6d\xa4\x98\xaa\xc7\x05\x9c\xc4\x1c"
- "\xfb\x7c\x1f\xfa\x52\x47\x7d\x52\x30\x76\xd5\x98\x0f\xe8\x8f\x0e"
- "\xfd\x49\xdc\x14\x89\x9e\x49\xa5\x3e\x4d\x23\x79\x8e\xfa\x25\xc7"
- "\x71\x70\x29\xfa\x95\xb7\xa9\x80\x1f\x47\xdf\x06\x0e\x15\x74\x33"
- "\xac\x3d\xe6\x4e\x5b\x17\x9d\x7f\x38\x2e\xe1\x36\x40\xf6\xa3\x4b"
- "\xd1\xcf\xbc\x98\xff\xd2\x2f\x28\xe6\x54\x37\xda\x55\xa5\xf6\x93"
- "\xd2\x66\xc7\x78\xfa\x2f\x6e\x50\xef\x93\xa2\x79\xbf\xd6\xcf\xfe"
- "\xe6\xb8\x7e\xd2\xf7\x9f\x50\x79\x6a\x3f\x93\xd0\xcf\xc4\xaf\xf7"
- "\x13\xf8\x54\xcc\xb7\xa8\xfd\x74\xa9\xfd\xd4\xa3\x9f\x49\xe8\xe7"
- "\x8c\xb8\x7e\x5e\x72\x5e\x3f\x97\xa1\x9f\x05\xe8\x67\x6f\x5c\x3f"
- "\x53\xc7\xe9\xe7\x32\x2f\xd5\xb1\x75\xb0\x40\xfa\xc1\xfa\x6c\x89"
- "\x3c\xe7\xdd\xdf\x16\xf5\x33\x31\xc2\x5b\xe9\x1c\xa3\x52\xcc\xf7"
- "\x91\xfe\x86\xf4\x46\x24\xeb\xd1\x59\xc6\xdc\x0d\xae\x32\xa1\xbb"
- "\x99\x2e\xf5\xd0\x92\xbf\xea\x0f\x44\xcf\x5d\x3c\x27\x62\x45\xc8"
- "\x73\x8a\x74\xf6\xb1\x90\x09\xdd\xe3\xe2\x0d\xeb\x1d\xf4\x3d\x7d"
- "\x1b\x74\x7e\x91\x11\x3b\x1f\xd6\x2f\x75\xe6\x80\x1f\xdd\x93\xcf"
- "\x27\xa9\xcf\xff\x6c\x99\xd4\xe7\x7f\x11\xf5\x7f\x01\xb8\xb4\x13"
- "\x5c\xc4\xb9\x4d\xb2\xab\x8c\x30\x57\x6e\xd8\xa5\x9d\xbf\xf6\x21"
- "\x6f\x49\xdc\xf9\x6b\x9f\x68\xc3\x39\xe1\xe3\x60\xfd\xe2\xf0\x7a"
- "\x2e\xcf\xe5\x7e\xd1\x1c\xab\xfb\x73\xab\x5a\x77\x17\xdd\xfb\xa5"
- "\x0f\x32\xd2\xb1\x59\xa5\xad\xcc\x17\x07\x35\xfb\x14\x2f\xeb\x33"
- "\xd2\x5c\x1e\x3f\xae\xc2\x17\x81\xb1\x3e\x8f\x06\xda\xc9\xaf\x7b"
- "\xd0\x39\x60\x8a\x9d\xa9\x1e\xb0\xfc\xad\x33\xd5\x0e\x3f\xc6\x09"
- "\xf3\xcd\x26\x62\x04\x0f\xe4\xf1\xad\x43\x8d\x32\x36\xc1\xc0\x6f"
- "\xa9\x9d\xbd\x6c\x60\x0b\x9e\xcd\x72\x2f\x67\x60\x9d\x4a\x9b\x43"
- "\x8b\x23\x61\xb3\x17\x75\x0a\x1f\x4a\xb1\xe7\x55\xe4\x13\x02\xf9"
- "\x5e\x94\x3e\x9d\x07\xf2\xce\xcb\x4f\xef\xcb\xce\x7b\xce\x3e\xef"
- "\xd9\x1a\x00\xcd\x9a\xc8\x0e\xa7\x7a\x86\xd0\xf1\x36\xa4\x94\x33"
- "\x9b\xe3\x04\x4b\x00\x2e\x7e\x4e\x6d\xeb\x1c\x10\x67\xf4\xcc\xdc"
- "\x99\xc5\x3c\x03\x61\xc9\xb7\x83\x5f\xea\xcd\x40\x9e\x13\x6c\x3a"
- "\x9d\x11\xa1\xd8\x0d\xc8\x7f\x52\xc6\x6b\x38\x79\xef\xd2\x75\x49"
- "\x4c\xf9\x71\xce\x54\xae\x5f\x61\x21\x3b\x80\x57\xce\x79\x29\xe6"
- "\x81\xae\x74\x3b\x4b\x27\x3a\x05\x1c\xee\xe3\xfa\x3c\xf2\x33\xe6"
- "\x7b\xe1\xdc\xc0\x24\x4f\xf8\x28\xb3\x81\x7e\x9e\x64\x27\xb3\x0d"
- "\x25\xcc\x50\xdb\xcf\x52\x81\x67\xe1\x03\xe1\x79\x4c\xf3\x69\xd0"
- "\x78\x89\x3c\x2b\xdf\x08\x9c\x5c\x6b\xe1\xa1\xa0\xf3\x44\x23\xe4"
- "\xda\xa5\x9a\xfe\xa2\x4a\xfa\x34\x33\xa0\xfe\x44\xe1\x7f\x41\xf2"
- "\x07\x80\xed\x89\x23\xf2\x8c\x68\xda\x5c\x7c\xd3\x15\x93\x6d\x4e"
- "\x2e\x95\x30\x1c\x72\xcb\x75\xe4\xe4\xd2\x03\x80\xea\x16\x69\xcf"
- "\x94\x86\xbc\xe1\xa8\x3d\x93\xd0\x09\x9e\x04\x4d\x19\x72\x4b\xb9"
- "\x67\xc8\x9d\x1b\x31\xaa\x73\x9c\xd2\x8f\xe4\xd0\xb7\xf8\xce\x2c"
- "\xe3\xca\x9d\x9c\x17\xc3\xb5\x93\xa4\x6b\xd5\xa1\x4f\xc0\x9f\x13"
- "\x45\xd4\x2f\x82\x49\x40\xf8\x2f\x3b\x61\x3f\xb0\x67\x82\xb8\x23"
- "\xc6\xa3\xc6\xb0\xd0\x2f\xcd\xec\x00\x3e\x0d\x62\x0c\x2e\x25\x1f"
- "\x4e\x1e\xd4\x73\xa8\xe9\x1c\x3b\x64\x19\x66\x9d\xb8\xa7\x73\x0b"
- "\xee\x9f\x7c\xc6\xfa\xac\xe3\xaf\xe5\xe0\x07\x5c\x68\x73\x03\x95"
- "\x45\xb4\x86\x6c\x3d\xc9\xd7\x5e\x27\xb8\x36\x4f\x1f\x13\x65\x1c"
- "\x52\x06\xd8\x21\xfb\x71\xd2\x6d\x77\x74\x36\x1d\x65\x9d\x96\x3f"
- "\x89\x7a\x88\xdf\x76\x17\x0e\x5f\xa8\xec\x16\x94\xdd\xa6\x96\xed"
- "\x43\xd9\x69\x13\x97\x3d\xd3\x7a\x91\x65\x5f\x44\xbb\x67\xa6\x5e"
- "\x4c\xd9\x8e\x06\x1e\x01\x1d\x4e\xc6\x1a\xef\x22\x3f\xa4\x74\x3e"
- "\x35\x32\x42\xbe\x57\x66\x71\x69\x3f\xef\xfb\x36\xd1\x1b\x61\xdb"
- "\xb1\xd5\xb7\x45\x9c\x5d\x25\x3d\xbb\x7a\x66\xd5\x13\xfe\x9c\x91"
- "\xde\x3d\xe8\xf4\x45\xed\xbf\xe3\xf6\xb5\x21\x0b\xf8\x16\x48\x3b"
- "\x69\xdf\x16\x89\x5b\x5f\x9e\xa5\xb2\xc6\x97\x39\x07\xf7\x49\x7b"
- "\x7b\xdf\x26\x4d\xbf\x35\x9c\x38\xb8\x4f\x2d\xcb\x7a\xbe\xde\x54"
- "\x75\x98\x63\xcd\xb7\x17\x59\xd7\x17\xae\x2c\xca\xd7\x0e\x57\x27"
- "\xb1\xfb\xf3\x57\xe4\xaf\x2c\xce\xcf\xb3\x3e\xb0\xae\x70\xf5\x0d"
- "\x6b\x1e\x79\xc4\x7a\x6f\xfe\xda\xb5\xcb\x7f\x9c\x9f\xc4\x1e\x28"
- "\x5c\xbe\x7a\xed\x4a\xd2\x6d\x5a\xad\x0b\x6e\xcd\x2d\x58\x53\x74"
- "\xc3\xf7\x16\x64\x9d\xa7\xdb\xa4\xb3\xd6\x3d\x24\xe3\x60\x7d\x9a"
- "\x0e\x1e\x63\x1a\xf9\xdf\x31\x6f\xe0\xee\xc7\x21\x5f\x03\x07\x4f"
- "\xd2\x5a\x48\xeb\x0f\xc9\x5e\xe4\xc7\x97\x7c\x03\xef\x7c\x8e\x77"
- "\xf5\x33\xfe\x6d\xf0\xed\xdd\x48\x23\x3f\xbc\x3d\xfc\x9c\xc3\x4f"
- "\x63\x80\xf4\x69\xc8\xd3\xfe\x14\xd2\xfc\x89\x43\xee\xda\xbf\x32"
- "\x83\xe4\x31\x06\xeb\xb8\x7e\x0a\xaf\x22\x9f\xba\x9f\x59\x98\xea"
- "\xab\x5b\xef\xf1\x86\xc8\xfe\xc7\xb8\x38\xec\xe0\x44\x53\xe5\xfc"
- "\x1a\x7c\x5a\xce\xd3\x63\x2d\xf2\x1c\x82\x72\x9a\x64\xc4\xcd\x22"
- "\xce\xd9\x20\xe8\xff\xa7\xc6\x18\xad\x1e\xd1\x78\xf3\x6e\xc0\x7d"
- "\x7d\x2f\x9e\xa5\x4f\x91\xc1\x83\x63\x6d\xbb\xbe\xda\xcb\xd8\x68"
- "\x9a\xfc\xd1\x37\xa3\x56\xf9\xa3\xfb\xf8\x9f\x72\x58\xfe\xce\x4f"
- "\xff\x9f\xfe\xb4\xfa\xff\xd1\xef\x83\x75\x17\xfe\xfd\x3d\xf5\x8b"
- "\x7e\xff\xff\xd8\xff\xff\xc9\xf7\xc1\x86\x0b\xfd\x08\xdf\x80\x5b"
- "\x3d\x4f\xfd\x95\x19\x81\x9f\xf5\xd5\x0f\x03\xa7\x8f\x31\x4b\x49"
- "\x98\xf7\x39\xfe\x83\xa5\x97\x9e\x00\x0f\x06\x5e\xab\xc8\xce\xfb"
- "\x4a\x47\x48\x2f\x11\x5c\x09\xfc\x6d\xab\xe9\x65\xa6\xea\x5e\xf0"
- "\x59\x45\x32\x3e\x06\xed\x37\xd1\x19\x2d\x0f\x9e\x0f\x16\x87\xd8"
- "\x87\xfe\xd3\x64\x0f\xe9\xee\x5c\x06\xda\xd3\xc3\x18\xe1\xaf\x69"
- "\x19\x4b\x6b\x9c\xce\xf7\x73\xe7\xb6\x34\xae\xdf\x66\x40\xda\xe1"
- "\x57\x95\xec\x49\xaf\x6e\xec\x98\x64\x7d\x98\xd6\x79\xff\xf7\x55"
- "\xdc\x3c\x22\xcf\x20\x8e\x08\x9b\x33\xd5\x97\x32\xd6\xa7\xe0\x83"
- "\x72\x4d\x0f\x5e\xa3\xea\xf3\x70\x3f\xf2\x01\xdd\xa3\x1f\x6d\xdc"
- "\xb9\xc2\x42\x65\xfe\x4a\x69\x9b\x44\x6b\xe6\xab\x1b\xb3\x27\x95"
- "\x2c\x67\xfa\x4e\xef\x49\x76\x00\xb4\x90\xf6\xc2\x31\xef\xf6\x62"
- "\x9e\xb5\xee\x9a\xce\xeb\xd0\xbe\x2a\xf0\x73\x2e\xb4\xa9\x25\xe8"
- "\xf4\x43\xfe\x3b\xd9\xaa\xf2\x72\x6e\xcc\x8b\xbd\xd5\xc8\xb3\x78"
- "\x1d\x9b\x55\x8d\x7c\xe0\xed\x5c\x24\xa3\xc8\xf6\x05\x5e\x07\x0c"
- "\xf6\xa1\xce\x2e\xeb\x43\xf4\x3c\x24\x78\x0c\xaa\x1b\xfd\xb0\xf6"
- "\xb2\x21\x21\xf3\x53\x1d\x5a\xbd\x41\xe7\x69\xd0\xbf\x2f\x0b\xd4"
- "\x3d\xc6\x3a\x59\xce\xe9\x45\x72\xbe\x0e\x9a\x28\x66\x9f\x3c\xe3"
- "\x35\x68\xaa\xde\x88\x75\xfd\x1c\x33\xa2\x8e\x7a\xd4\xe1\x36\x97"
- "\x33\x6e\xa6\xf3\xc1\x3d\x61\xc8\x35\x8a\x6a\x7b\x3b\x74\xb3\xfc"
- "\x56\xf2\x21\x82\xf7\x88\x80\xbf\x17\xfa\x19\xf0\x1f\x05\xa0\x13"
- "\xe0\x39\xc4\xd9\x0a\xf0\x1b\x94\x8e\x3a\xea\xd1\xaf\x2e\xc8\xcd"
- "\xfb\xb0\x76\x53\x7c\x36\xe3\x43\x67\xfe\x95\x89\x78\xe5\xe0\x17"
- "\xd6\xda\x79\x48\xc6\x2f\x3b\x7d\x50\xe3\x17\x08\x3f\x88\x47\xa8"
- "\x7e\x88\x19\x46\x31\xc6\xc0\x91\x0e\xf0\x1f\xe0\xe9\x87\x8c\xea"
- "\xd8\x74\x08\xbe\x40\x8d\xdb\x2a\x69\xf8\xd0\x65\x58\xdf\x4d\xa8"
- "\xa3\x03\x92\xa3\x80\x85\xa4\x41\x43\x19\xda\x5a\x2f\x63\x8f\x0f"
- "\x19\x39\x68\x1d\xe0\xb6\x6f\xf6\x32\x1d\xf3\xb2\xd3\xab\x30\x16"
- "\xfb\x28\x2f\xf9\xcf\x40\xfe\x07\xc0\x8f\x1d\x56\xc7\xa4\x07\x32"
- "\x01\xf8\x80\xd3\x3d\xd4\x0e\x7c\x73\x10\xb0\xa6\xb1\xa8\x52\xe9"
- "\xd8\x61\xc9\xc3\x04\xd6\x69\xb0\xc7\x58\x6f\x89\xc1\x7f\xa8\x39"
- "\x1e\xfe\x80\xc5\x16\x75\x2c\xaf\x8e\x1b\x3b\xc8\xa5\xc3\x21\xd2"
- "\x43\xa3\xbe\xfd\x52\x87\x36\x74\x84\x7c\x9c\x01\x67\xf6\x03\x16"
- "\xfb\x91\xaf\x8d\x68\xf3\xe6\xbf\x82\xe6\x3e\x4c\x3c\xd4\xf0\x71"
- "\xc9\xa3\x0e\x97\x11\x0e\xe3\x59\xc4\xee\xeb\x63\xa7\xbd\x54\x1e"
- "\x9e\xbf\x8f\x2b\x78\xd9\xe1\x7b\x1c\x8d\x14\x4f\x74\x30\x87\x7c"
- "\x90\xa9\x63\x9d\x13\x74\x0e\xcf\xd3\xce\x2f\x11\x0e\xd0\xd8\xa3"
- "\x8f\x5e\xa9\xa7\x18\x9e\x47\xba\x46\xf1\xdd\x68\x01\xb5\xb1\x87"
- "\xe6\xa7\xf6\x1e\xe9\x03\xe4\x1b\x36\x0e\x36\x5e\x75\x4c\xda\x64"
- "\x6c\xbe\xe1\x23\x6a\xdb\xf6\xe1\xd9\x88\x67\x69\xb7\x37\x5a\x90"
- "\x50\x4b\xdf\x94\xc6\xbe\xa1\xf9\x03\x5c\x36\x23\xcf\x47\xb8\x72"
- "\x2d\x2f\xf9\x87\x47\x3b\x72\xb6\x09\x1f\x5d\xc3\xb6\xe1\xd1\x4c"
- "\x3d\xea\x0d\xa1\x5e\x3d\xe1\x06\xe1\x85\x56\x46\xad\x84\xd1\x5e"
- "\x8c\x9f\xc0\xaf\x03\xe1\x36\xc0\x3d\x00\xfe\xff\x2f\x7e\xc9\xdf"
- "\x0d\xe7\xa8\xed\x73\xcb\x98\x11\x3e\x57\x93\xf4\xa7\x43\xf9\xb2"
- "\xa3\xf2\x4e\x94\xcf\x1c\xce\x21\xdc\x43\x59\x07\x55\x9c\x30\x23"
- "\x5f\x41\x14\x87\x84\xaf\x82\xe1\x01\xe2\x35\xd5\xf6\xd3\x9c\x3a"
- "\x2e\x61\x37\xe4\x22\x1c\x00\x1f\xef\x56\xe7\x9a\x97\x78\x55\x89"
- "\x87\x81\xbd\x5a\x19\xd2\xdf\xc1\xf0\x3c\x05\x65\x68\xb8\x12\x4f"
- "\x1b\x90\x17\xf2\xd9\xc9\x28\xde\x68\xb4\x40\xa5\x53\xd3\x54\x3e"
- "\xa4\x03\x63\x43\x7e\xc9\xdd\xc2\xdf\x93\xc0\xcb\x33\x7d\x07\x02"
- "\x61\xf6\x14\xe1\xe5\x43\x44\x13\xce\xdc\x31\x9c\x34\xe2\x8d\xe1"
- "\xf6\x99\x2c\x0d\xb7\xe3\xc6\x55\xe0\xf6\x16\x41\x8f\xce\x2c\xf1"
- "\xb2\xac\x45\x1a\xee\xd3\x3c\x57\x30\xaf\x6b\x8b\xc5\xfe\x80\x99"
- "\xf4\x81\x62\xde\x87\x7c\x42\xc6\xa0\xf1\xec\xb4\xf7\x09\x5f\xf0"
- "\x9b\x15\x66\xec\x0c\x7c\x4e\xfa\x91\x93\x34\xff\xb5\x39\x4e\x63"
- "\x83\xba\xdc\xe4\xaf\x7f\x0b\x68\x20\xcd\xc1\x00\xda\x44\x31\xea"
- "\xc9\xf7\x59\xfb\xd2\x6c\xb6\x16\x63\x7b\x60\x19\x8d\xdb\x99\x2e"
- "\xed\xbc\x44\xad\xa4\x01\x26\x15\x5f\x44\x1b\xcf\x83\xab\x59\xc2"
- "\x75\xc4\x30\x76\x7e\x0f\xef\xa1\xf9\x1d\x0f\x57\x82\x29\xc1\x16"
- "\x79\xd1\xff\x2f\x4d\x1a\x5c\xe3\x60\xfa\xbc\x8a\x8f\x2a\x6d\x1d"
- "\x19\x97\xb6\xd6\xca\xd8\x08\x6d\x9b\xa9\x2f\x58\x53\xa8\x7e\x11"
- "\xfb\x47\x95\x7d\xda\xfd\x84\x53\x23\xf5\x5e\x96\xd7\xa2\xd1\x31"
- "\xb4\x47\xf8\x9b\xa3\xb1\xd2\x68\x07\xe9\xca\xd4\xb6\xbb\xb5\xf1"
- "\xa0\x76\xc7\xd3\x04\xac\x37\xe2\x7c\x5f\xac\xcf\x23\xa7\xf1\xdd"
- "\x25\x44\xdb\x62\xfc\x55\x90\x8d\xed\xfb\xc8\x00\xf5\x9d\x70\xc2"
- "\x56\x4c\xfa\x32\xb9\x96\x79\x99\xbf\x68\x2c\xbd\xf2\xaf\x94\x76"
- "\x19\x92\x1f\x23\x7a\x6f\x7b\x48\xe6\xa7\xf5\x0d\xf9\x85\x6e\x5e"
- "\x5d\x0f\x89\x57\xa3\xb4\x65\x2a\x0c\x7a\x90\xbf\x9d\xce\x60\x93"
- "\x1f\x9e\xa9\x3d\x52\x16\x04\x8d\xde\x4f\x31\x22\x90\xcf\xda\x09"
- "\x39\x20\x3c\x99\xb1\x46\x95\xdf\x24\x3a\xc1\xd7\xe7\x4c\x5d\x3f"
- "\xc0\x12\x6d\xdf\xe3\x9f\xf5\xb3\xd0\x55\x98\x47\x21\xf2\x0b\x89"
- "\xb2\xad\xfd\xec\x5c\x04\xf5\xa6\xa9\x57\x0b\xae\x9f\xe3\x7a\x05"
- "\xae\x87\x70\xbd\x12\xd7\xdf\x22\xbf\xa2\xe6\xcf\xc2\xf3\x2e\xa4"
- "\xdf\xaa\x5e\xd1\xc6\x10\xed\x67\x2f\x79\x8a\xf8\xca\x87\x44\xfa"
- "\x4f\xe9\x19\xd7\xe5\x6a\xbf\x0f\xca\xb9\x1d\xba\x03\xe5\xd8\x29"
- "\x1f\xad\x6b\x48\xb3\x21\xcf\x35\x54\x36\xf9\x44\xe8\x67\x67\x8f"
- "\xc4\xf1\xa7\x28\xe7\x2c\x9d\xcd\x98\x83\xef\x3e\xc0\xb5\x08\xd7"
- "\x6a\x2a\x17\x30\xe8\x8a\xd1\x8b\xd3\xde\x3c\xbb\x1c\x4f\x2f\x0b"
- "\x2c\xa5\xf9\xae\xd1\x03\xc2\xa7\x31\xf9\x96\xca\x7c\x52\x7e\x0d"
- "\xed\xd7\xc6\x2e\x2c\xf1\xd6\x16\xc6\xd8\xa1\xfc\x3b\xe8\x7b\x5c"
- "\xef\x52\xaf\xd9\xea\xf5\x6e\xf5\xfa\x2f\xea\x75\x81\x7a\x5d\xe8"
- "\x65\xa1\x2a\x95\x37\x01\xcc\x42\x64\xdf\x47\x7b\x52\x6a\xbd\x67"
- "\xdd\x24\x5f\x83\xfe\x7f\x7b\x98\xe2\xbd\x39\xcf\xce\xd1\xf4\xd6"
- "\xa4\xfb\x19\x75\xfa\x5e\xd8\x29\x74\x3f\x67\x17\xc5\xd1\xc2\x3a"
- "\x93\x2e\x9b\x81\x77\x9a\xdc\xa8\xe7\x75\x6a\x39\x7b\xf4\xea\x7e"
- "\x3d\xc5\x3d\xa1\x38\x76\xe4\x8f\x4f\xc8\x51\xc9\x73\xe7\xd1\x7c"
- "\x15\x3a\xfd\xad\xe4\x5f\x68\xa8\x1e\xbf\x66\xc8\x14\x7b\x34\x7a"
- "\x4f\xf2\x92\xea\x77\xb3\x1d\x75\xb5\xc5\xe4\xfc\xb3\x05\x72\x6f"
- "\xf3\xf2\x6c\xa4\xc7\xc9\xff\x67\x33\xa8\xcd\x80\x75\x37\xfa\x33"
- "\xa7\x97\x9d\x0d\xe1\x7a\x4b\x9f\xec\x73\x96\xd6\x67\x75\xac\x6c"
- "\x1a\xcc\xfb\x58\xa8\x1e\xf4\xb0\x90\xf0\xbb\x37\x4a\x97\x43\xf5"
- "\x74\x55\xf1\x07\xe3\x1c\xba\x9b\xc6\x3b\x8e\x9e\x74\xc7\xe8\xf4"
- "\xb9\x07\xc6\x8e\xcb\xd0\x03\x61\xc9\x2f\x74\x63\x5e\x12\x0e\xa4"
- "\x9f\x37\x2f\x29\x66\xfd\x25\xea\xb7\x75\x63\x69\xfc\xc8\x00\xd1"
- "\x78\xb5\x8d\xc0\xdb\xa0\xd0\x59\x7b\xd9\x39\x9b\xba\x26\x75\x63"
- "\x8d\xfc\x36\xd2\xfb\x64\x3b\x65\xba\x5a\x17\xf0\x2f\x48\xfe\x50"
- "\xaf\xd4\xd2\x55\xfc\xa6\x72\x0e\xd3\x58\x6b\xe9\x6a\xf9\xc0\xd3"
- "\xe0\x41\x9a\x3f\x5a\xba\xc4\xc9\x33\x19\x44\x6f\xe8\xdb\xb0\xb0"
- "\x65\x84\xfc\xfd\x50\x3b\xda\x3d\xba\x04\xfc\x05\xf9\xa8\xef\xd9"
- "\xbc\x91\x99\xd6\x37\xb0\x64\x39\x37\x47\x7f\xaa\x7d\x2b\x75\xfa"
- "\xa3\x79\x1a\x8d\xaa\x15\xf4\xec\x4c\xf7\x58\x5a\xa9\xe8\xb8\xd3"
- "\x1c\x0e\x1b\x87\xaa\x0e\x85\xe7\x08\x9a\x8b\x79\xdf\x88\xef\x1a"
- "\xbd\xec\x19\xb7\xba\x96\x1c\x94\x7b\x2a\xa3\x1f\x1d\x6a\x96\xb4"
- "\x4b\x2d\x3b\x4a\xff\xe2\xf8\x10\x41\xeb\xa9\x2e\x2a\x0b\xeb\x4a"
- "\x6a\xc0\x91\x33\x55\xd2\xef\x51\xbf\x97\x4d\xcd\xd0\x68\x2b\xad"
- "\x4f\x66\x1d\xb3\xd5\x3c\x24\xd7\x27\x85\x74\x60\xb6\x80\xf0\xa7"
- "\xd6\x69\xf3\x31\x5a\x37\xc9\xcf\x75\xee\x86\x24\xf2\x37\x95\xd3"
- "\xcf\x22\x9f\x83\x3f\xdb\xa3\xee\xcd\x40\xce\x8d\x3c\x4b\xb2\xac"
- "\x0a\x57\xcc\xa7\xc8\x06\x75\x5c\x7a\xd0\x9e\x3d\x44\xdb\x37\x17"
- "\xcb\xd8\x41\xa4\x0f\x12\xb1\xa6\x88\x67\xb5\xf0\x90\xf4\xd9\x1f"
- "\x2e\x8b\xd3\x71\xa9\x76\x67\xa3\xf9\x22\x16\x83\x6b\xa8\x4a\xea"
- "\x13\x23\xc9\x32\x3d\xec\x97\x76\x08\x43\xea\x7c\x0a\xf7\x24\x58"
- "\xa6\xbf\x24\xf5\xc2\xbe\xb7\x25\x3f\x12\x8e\x8f\xff\x2c\x60\x2d"
- "\xfd\xf9\x86\x07\x62\xf3\x22\xbc\x9f\xbe\xc1\xb7\xaf\x07\x9d\x11"
- "\xa6\xa5\xcb\xb5\xe6\xf4\x61\x55\x67\x56\x37\xb5\x3c\x9b\x81\x36"
- "\x4f\xde\xe9\xd4\xe6\x6f\x64\x99\xa8\x5f\x9d\xbf\xd4\x47\xc2\x07"
- "\x9a\xc3\x61\xf2\x09\x86\x39\x4c\x73\x19\xf7\xf5\x61\x6d\xee\x4a"
- "\xfe\xae\x5b\xcc\x5d\x31\x6f\x23\xb6\x58\x3b\x22\x99\x2a\xae\xf6"
- "\x0c\xaf\xb0\x98\xf0\xae\x0a\x6b\xab\xba\x97\x15\x96\x32\xc6\xd6"
- "\xa3\xdd\xca\x08\x0f\x91\x6e\x9a\xf4\x09\xa4\xb3\x51\xed\x55\x69"
- "\xaf\x24\x40\x7e\xce\xea\x30\x1f\x62\xbe\xcd\x52\x99\xe6\xdb\x0c"
- "\xe5\xf5\xc4\x74\xc7\x61\xcd\x37\x68\x15\xea\x6b\x74\x97\xbe\x47"
- "\xf0\xbb\x41\xce\xb1\xf0\x6c\xc2\x63\x0f\x70\x0f\xeb\x4f\x03\xc5"
- "\xa2\x0f\x3a\x15\x8b\x86\x7b\x98\xa3\x79\xc0\xd1\x97\xeb\xa7\xf3"
- "\x06\x8c\x29\xd9\xdc\xaf\xc2\xf3\xb3\xb8\xe6\xc9\xab\x2e\x95\xae"
- "\x2a\xce\x37\xe0\x5b\xcc\xff\xa4\x0e\x6d\x0c\x02\xc9\x33\xb3\x05"
- "\x8e\x95\x92\x7d\x63\x96\xd8\xeb\x27\x1c\x23\xfc\x12\x7b\xfe\xc0"
- "\x35\x73\xf9\xbf\x32\xc2\x33\xe1\xef\xc4\x4e\x63\x12\x9e\x4f\x78"
- "\x86\xb2\x9a\x35\xdf\xbe\x5e\xa6\xa8\xfb\x6d\xca\x3e\xcd\x0e\x9c"
- "\xf0\xb0\xe8\x6a\x76\x19\xca\xb7\xb6\x5b\x03\xa4\x3b\xff\xd4\x13"
- "\xbe\x9b\x51\x5e\x82\x9d\xa4\x97\x97\x6f\xc3\x37\x71\xe3\x3f\x24"
- "\x6c\x59\x0f\x2c\x15\xfa\xcc\x4b\x83\x4e\x6e\x18\x4b\x73\x06\xeb"
- "\x04\x5f\x89\xf5\xf9\x9b\x69\xcc\x0a\xbc\xc5\x5a\xc3\x33\x35\x7e"
- "\xf8\xa6\x34\xb2\xb7\x18\xa4\xf6\x91\x0c\x0e\x7a\x3b\x98\x49\xeb"
- "\xf4\x04\x7a\xe7\x39\xa4\x2b\x22\x9a\x41\xba\x27\xd2\x83\x01\xd6"
- "\x87\xfb\x75\xfa\x97\x0f\x41\x92\xe7\x6b\xbe\xee\xdf\xb9\xd4\xce"
- "\xcf\x90\x2f\x2c\x6b\x21\xbb\xb4\x57\xa7\xa7\xb3\x9a\xdd\x8e\xd3"
- "\xa4\xe3\xe1\xad\x63\x74\x3c\x31\x8f\x4a\x69\xf8\xd9\x63\x3f\x9d"
- "\x51\xbd\xdf\x72\xe1\x9f\xce\x2a\xf3\xea\x66\xe3\x37\x4f\x85\xd5"
- "\x9f\x82\x15\x2c\x4d\x83\x15\xd1\x14\xa2\xb1\x64\x67\x43\xf3\x5c"
- "\x17\x66\xe4\xeb\x08\xe3\x84\x76\x6f\xbe\xfe\x7e\xf7\x46\xc8\xb4"
- "\x3a\x76\xb7\x90\x39\xf4\x17\x79\x26\x5b\xc7\xc4\x78\x0a\x3f\xaa"
- "\x3a\x66\x44\xdd\x9f\xd5\x9e\x62\x06\x5b\x21\xbb\x8a\x74\xe8\xe6"
- "\x08\x77\x93\x0c\x4c\x38\x01\x18\x74\x9d\xd4\xe9\x12\x8b\x36\x31"
- "\x3d\xde\xcf\x3a\xa9\x63\x21\x8d\x97\xc2\x37\xa9\x09\x21\x96\x46"
- "\x3c\xd4\x5d\x9b\xd8\x2c\xb4\xff\xb0\x36\x56\xc4\x67\x90\x1e\x2f"
- "\x1a\xd7\x49\xc7\x84\x2d\x00\xf9\xac\xf7\x12\xdc\x34\x5a\x75\x8a"
- "\x99\xf0\xec\x4e\x08\xb0\x54\xb1\x0e\x55\xe8\x80\xff\xbe\x6e\x81"
- "\x2f\x3a\xd6\x03\xdc\x3f\x1c\x6b\xa7\xe5\xb2\xb8\xfb\x07\xe9\x7b"
- "\x73\x80\x78\xb8\x89\xe0\xa3\xcb\xd7\xe0\x43\xe7\x0e\xcc\xe0\xff"
- "\xc5\x78\x87\xb9\x0f\x6d\x3b\x68\xdb\xc8\x8c\x27\x75\xfa\x07\xd1"
- "\x47\x3a\xd7\xdb\x21\x74\xfc\x3a\xfd\x3d\x9a\x9c\x2e\xdb\xad\xbf"
- "\xcc\x5c\x9e\xc0\x48\x37\x4f\xfe\x1e\x85\x2d\xe6\x57\x16\xa1\x8f"
- "\xf7\x60\x6a\xbb\x4b\xbf\x4b\xf5\x1c\x57\xd7\xb2\x9e\x61\x87\x85"
- "\x1d\xb0\xcc\x67\xe8\x87\xd7\xab\xeb\x5b\x76\xd1\x36\xaf\x3a\x9d"
- "\x57\x85\xef\x41\x61\x2b\xa2\xd3\xfd\x9a\xd6\x12\xd2\x0d\x60\x1d"
- "\x69\xa7\xf5\x3a\x58\xa1\x9f\xaf\xcd\x1b\xac\x13\xed\xf8\x26\xea"
- "\xd7\x00\xf7\x7b\xc9\xe7\x8c\x90\x1f\x64\x7e\x93\xd8\x37\xa8\xd0"
- "\xdb\xa2\xfc\x36\xf2\xd1\x77\xc2\x86\x50\xa7\xdb\x92\x1b\xd1\x01"
- "\xa6\xba\x2d\xd4\x37\x89\x8b\x96\x1f\x21\x7f\x73\x74\xde\x62\x1c"
- "\xc4\xbc\xf5\xc5\xcd\xcb\x0a\xbd\x3b\x26\xa7\x72\x3a\x5b\x3c\xae"
- "\xdd\x93\x2d\x05\x6b\x95\x2e\xe1\xe6\xda\x5a\xde\x5c\xa7\x57\xee"
- "\xdc\x5c\xc3\x4c\xba\x2a\x80\x8d\xe6\x59\xf1\xb2\xcb\xfa\x75\x09"
- "\x77\x98\x4d\x97\x2f\xb9\xab\x68\x0a\x2f\xb5\x30\x7d\xf5\xd0\x14"
- "\xe3\xd5\xa1\xcb\x9b\x79\xc2\xf5\xf7\xdf\x5b\x44\x7b\xdf\x75\xec"
- "\x8b\x55\x2c\xe1\xae\x08\xea\x36\x31\x9b\x57\x37\x69\x11\x9d\x51"
- "\x3f\x60\x02\x2f\x82\x7b\x2a\xb3\xa4\x91\x19\x4b\xfa\xf8\x40\xd5"
- "\x23\x93\x8c\x58\x7f\x53\xb1\x6e\xb8\xa6\x9a\x2e\x6f\x1e\x45\x19"
- "\xef\x2e\x13\xdf\xb5\x5e\xa0\x6d\x87\xc6\x6f\x9b\x6d\x3a\xda\x76"
- "\xec\xe2\xda\x36\xb9\x2a\xd6\xb6\xc9\x55\xff\xf3\xb6\x19\x56\xc6"
- "\xb5\x2d\x35\xd6\xb6\x02\xb4\xcd\xb0\xe1\xe2\xda\x36\xe5\x60\xac"
- "\x6d\x53\x0e\xfe\x9d\x6d\xdb\x3b\x71\xdb\x26\x4d\x1a\xbf\x6d\xf6"
- "\xcb\xfb\x75\x93\x2e\xbb\xb8\xb6\x25\x9a\x62\x6d\x4b\x34\xfd\x4f"
- "\xda\x56\xda\xc8\x3f\xef\x04\x97\x4b\xfa\x1c\xa2\xf3\xfd\xba\xc9"
- "\x57\x6c\x4a\x17\x76\xdc\x97\xa0\x5d\x87\x1c\x8d\xfc\x33\xc1\xdb"
- "\xe8\x26\x09\xdd\x7f\xb0\x62\x92\x0b\xf8\x2b\xed\x4a\x74\x93\xed"
- "\x94\xa6\x24\xcc\x68\xe1\x4e\x1e\xbe\x31\x40\x36\x83\x61\xf2\xcb"
- "\x42\x3e\xcf\x3b\x5e\x1d\x09\x51\xbc\x89\xee\xdd\x43\x06\xf6\xea"
- "\x88\x5f\x8f\x6f\xdb\x35\x5f\xac\xda\xb7\xe6\x86\x0b\xd1\xa3\x49"
- "\x67\xef\x2a\x60\x66\xa2\x47\x74\xa5\xb8\x91\xb5\xa5\x53\x8c\x77"
- "\x9d\xc6\xba\x5f\x31\x39\x55\x3b\x6b\xab\x95\xb5\x78\x60\x0a\x37"
- "\x97\xb0\x04\x3a\xef\x2b\xfc\x36\x5a\xfc\x2c\xa3\x84\x4d\x5a\x6c"
- "\x47\xf9\x21\xb6\xcc\x6c\x47\xd9\x80\x87\xe0\xe5\x75\x93\x1f\x4c"
- "\x58\xc5\x4c\xf5\x28\x9b\xae\x77\x59\x1c\x7c\xf3\x76\x66\xa0\x73"
- "\xc1\x74\xbe\x57\x9e\xed\x9d\x6c\x44\x3d\x76\xad\x9e\xbf\x01\xbf"
- "\x14\x09\xbf\x29\x3f\x8c\xc1\x6f\x4a\x72\x0c\x7e\x93\x3f\x92\xf0"
- "\x9b\xdc\x11\x83\xdf\x94\xb6\x8b\x83\xdf\x14\x43\x0c\x7e\xf2\xdb"
- "\x0b\xc3\x6f\xca\x77\x26\x86\xdf\x94\x25\x31\xf8\xc9\xb2\x26\x80"
- "\xdf\xe4\xf1\xe1\x37\xe5\xd9\xbf\x0f\x7e\x53\xda\xfe\x4e\xf8\x25"
- "\x4b\xf8\x19\xb7\xc7\xe0\x67\xbc\x37\x06\x3f\xe3\x34\x09\x3f\xa3"
- "\x31\x06\x3f\x63\xe8\xe2\xe0\x67\x5c\x10\x83\x9f\xfc\xf6\xc2\xf0"
- "\x33\x6e\x98\x18\x7e\xc6\xba\x18\xfc\x64\x59\x17\x07\x3f\xe3\x27"
- "\x80\x5b\xaa\x0a\xbf\xd4\x89\xe1\x67\x0c\xfd\x9d\xf0\x33\x4b\xf8"
- "\x25\x1e\x89\xc1\x2f\xb1\x3a\x06\xbf\xc4\xef\x4b\xf8\x25\x2e\x8c"
- "\xc1\x2f\x69\xde\xc5\xc1\x2f\x71\x4b\x0c\x7e\xf2\xdb\x0b\xc3\x2f"
- "\xf1\xf5\x89\xe1\x97\xd8\x15\x83\x9f\x2c\x6b\x02\xf8\x4d\x19\x1f"
- "\x7e\x49\x97\xfd\x7d\xf0\x4b\x9a\x77\x21\xf8\x5d\x1c\xaf\x91\x24"
- "\x64\x9d\xff\x85\x72\xea\x27\x2a\x87\x60\x48\xf6\x89\x4a\x45\x52"
- "\x7d\x93\x32\xd9\x28\xcf\x70\x24\x2d\x82\x0c\x73\x7b\xaf\x2e\xe9"
- "\x78\x93\x32\xc9\xc8\x9d\x7f\x68\x53\x9c\x1f\x2c\xe3\xe5\x93\x0d"
- "\x4a\xf9\x14\x03\xf9\x22\x98\x30\x0e\xb5\x6e\xea\x1d\x09\x57\xb0"
- "\x99\x74\x5e\x6f\x33\xf8\x35\xba\x0f\x56\x4c\x5d\x04\x5e\xa4\xfb"
- "\x7c\x98\xe4\xad\x5c\x2b\x82\x5a\x16\xe6\xe7\xad\x5b\x9d\xb7\x7c"
- "\x75\x91\x75\xf9\x8a\x47\xd7\x8e\xf5\x15\x2f\xe2\x41\x6e\xa1\xf1"
- "\x9b\x1a\xf5\x7f\x46\x31\x1d\xc9\xcf\x9e\xed\x1b\x2c\xf1\xa4\x6e"
- "\x6a\x97\xf0\xdf\x9f\x34\xbc\x80\x8f\xe6\xec\xc8\xfe\x26\x7f\x47"
- "\xf8\x0f\x1c\x2d\xd8\x01\x79\xca\x47\x3e\x61\x54\x5f\x83\xbe\x7e"
- "\x5d\xf2\x09\x9e\x18\x2c\x23\x9b\x0e\x71\xb6\x43\x67\xb2\x0a\x5e"
- "\xce\xc9\x3b\xb8\x71\x70\x81\xe2\x0a\x96\xf1\xad\x41\x3b\xc1\xa0"
- "\x93\x7c\xb7\x15\x27\xcc\xea\xd5\x99\xf7\xf2\xc4\xc1\x05\xdc\x35"
- "\xb8\x50\xdd\xe3\x58\x48\xf6\xa2\xd9\x1b\xf9\xa7\x54\x9e\xca\x0b"
- "\x52\x7c\x0e\xb7\xe4\x07\x4d\xf9\xe6\x72\x6b\x02\xe5\x25\x1f\x8a"
- "\xe4\x5b\x50\x8b\xc9\x44\xed\xa6\xbc\xe0\xc7\x6f\xc7\xf7\xb7\x53"
- "\x4c\xca\x68\x19\xb2\x4d\x97\xa2\x4d\x8d\xa2\x2f\x2e\x9f\x7f\xf8"
- "\xf1\x9c\x1d\x22\x2e\xa2\x80\xab\xf9\x69\xf4\xc1\x2f\xe2\x59\x86"
- "\xbf\x12\xf1\x2c\xd5\x6f\xae\xc2\x37\x82\x9e\x92\xdf\x54\x59\x86"
- "\x79\x83\xd6\x2e\xf0\xd0\x49\x78\x5e\x1e\x57\xc7\x54\x3c\xdf\x13"
- "\xf7\xde\x84\xe7\x1b\xc0\x87\x4e\x53\xdf\x27\xe3\x79\x1a\xf1\xa5"
- "\xa2\x5f\x35\x65\xd2\x26\x5a\x97\x42\xb6\x31\xa9\x6a\x9e\x69\x27"
- "\x75\x29\x47\x88\xd7\x55\xcb\xb8\x04\xcf\x6f\x91\xcc\xa8\xbe\x4f"
- "\xc3\xf3\xf3\xb4\x2f\xa0\xbe\xbf\x0c\xcf\x4f\xe0\xf9\x9f\xd4\xf7"
- "\xe0\xeb\x93\xf7\x8b\x36\x1b\x07\xe7\x53\x9f\x00\xfb\x65\x04\x77"
- "\xc0\x7a\x3e\x37\xfa\x7c\x90\x57\x1d\x34\x8e\xd4\x4f\xf7\xc6\x93"
- "\xac\x57\x97\xfc\x6b\x3a\x97\x27\xc7\x2a\x58\x26\x7d\xfb\xe8\x73"
- "\x90\xde\x4a\xe9\x64\x5b\xae\x6c\x0d\x2e\xa3\x7b\xb4\xf5\x1e\x82"
- "\xa1\x5a\x17\x64\xa2\xe4\x6e\x75\x9c\x01\x3b\xf2\xbf\xcb\xca\x76"
- "\xab\x63\x81\xb6\x4d\x41\xdb\xbe\xad\xee\x7b\x84\x16\x87\x47\xe5"
- "\xf9\x22\x5d\x0a\xfb\x87\xfc\x4d\xe0\x3b\x49\xf7\x52\xb2\xb5\x58"
- "\x7d\x5e\x5d\xb2\xf0\x15\x41\xf8\x49\xfa\x15\x7f\xa2\xaf\x5b\xf8"
- "\x57\x01\x8e\x6a\xb8\x42\x78\xc2\x27\x4f\xcd\x11\xba\x9a\x8a\x94"
- "\xe8\xf9\x5f\x7c\xdb\xa6\xc6\x37\x60\x52\x4e\x48\x69\x88\xda\x17"
- "\xe9\x92\x05\x7d\x88\x7b\xb7\x2f\xee\xdd\x7c\xed\x9d\xb0\x81\xab"
- "\x48\xe9\x8a\x7b\x37\xfb\xbc\x77\xbe\xb8\x77\xe9\x63\xcb\x34\x1b"
- "\xe3\xde\x99\xc6\x7e\x67\xce\x88\xbd\x33\x85\xce\x7b\x97\x1d\xf7"
- "\x6e\x40\x7d\x97\x80\xf4\x9c\xa8\x7f\x43\x9d\xa9\x5b\x4d\x07\xad"
- "\x37\xdb\xe2\xd2\x3b\xd4\x74\xaa\x1f\xfc\xdf\x1b\x6d\x6a\xba\xc0"
- "\x73\xe0\xd1\xb5\x6a\x1d\x7b\xe2\xea\x68\x90\x32\x96\xaf\x5b\x8e"
- "\x9f\x29\xd5\xac\xb3\x4e\x21\x9c\x32\x97\x97\x51\xac\x9c\x3a\xe9"
- "\xcb\x4b\xce\x43\x11\x6f\x99\x62\xc2\x22\xdf\x44\xb4\x71\x5c\x1b"
- "\xc1\x8a\x54\x8b\x76\x8e\x35\xe2\xf2\xf5\x28\x55\xb3\x88\x86\xce"
- "\x22\x9f\x5f\x0e\x1f\xf9\x7d\xd1\x62\xef\x9d\x63\x9e\xa2\x60\x19"
- "\x79\x4a\x50\xfd\xc4\xa4\x90\xcf\xb2\x4e\xa1\xdf\x19\x94\xf1\xf7"
- "\xe8\x7c\xef\x56\x5f\xcf\x7a\x1f\x4b\xb7\x7d\x8f\xf7\x91\x9c\x27"
- "\x69\x42\x6a\x15\xbe\x31\xab\xbe\x1c\xb6\x8b\xf3\xe6\xba\xd4\x0e"
- "\x4a\xf3\xf8\x84\x9e\xd9\xd8\xaf\x9b\x66\x11\xef\x79\xce\x76\xd9"
- "\xdf\x69\x16\x21\x4b\xab\xe7\x0a\xd1\x4e\x77\x34\x3e\xa4\x6e\x5a"
- "\xfa\x99\xc4\xb3\x03\x48\x3b\x3c\xc6\xbe\x51\x97\x3a\x48\x65\x52"
- "\x3f\xbc\xba\xd4\x3a\x2a\x1b\x79\x42\x51\xfb\x46\xa4\xaf\x0f\xb3"
- "\x19\x68\x5b\xbf\x56\x7e\xb0\x62\x9a\xc5\xab\x33\x0b\xb9\x92\xca"
- "\x3c\x53\x3d\x0b\xe5\x4e\x9b\xed\xd5\xbf\x35\x5b\xd8\x47\x56\x4c"
- "\x9b\xe7\x65\xbf\x37\x4d\xb4\xfe\x09\x9d\xa4\x31\xd8\xc0\x5d\xc1"
- "\x66\xcc\xf9\x3a\x61\xaf\x9c\x18\x6c\x90\xb2\xfc\xb4\x27\xc8\xfe"
- "\x82\x62\x55\xd3\xbe\xa3\xa4\x3b\xd3\x84\x3d\x04\xa5\x01\x36\x2d"
- "\xa0\xcf\xcd\x02\x07\x2e\x6a\x4e\x4e\x13\xeb\x5f\xed\x10\x33\xd6"
- "\xa8\x36\xaf\x68\xa7\x37\x2e\x4e\x83\xb4\xff\xd7\x5d\x92\xd8\x69"
- "\x17\x7b\x4f\xa2\x8d\xe7\xb7\x81\xda\x8b\xb2\xb6\x4c\xb8\x96\x1a"
- "\x83\x75\x42\x0f\x5a\x39\x24\x63\xa8\xea\x2e\xf9\x7e\x82\xe5\xca"
- "\xb6\x60\xc5\x25\x8b\xa2\xf1\x29\x90\xa7\x86\x6c\x82\x51\x7e\xb4"
- "\x9f\x85\x54\xc7\x25\x62\x1f\xcd\xab\xbb\xc4\x05\x3a\x46\xf6\xd1"
- "\x06\x35\xdd\xd5\x19\x0e\xd1\xd9\xfa\x71\xfd\x67\xd1\x1a\x29\x7c"
- "\x2f\x55\x06\xeb\xe8\xfc\xc4\x4d\x21\xad\xcd\x97\xba\xc8\x6e\x9f"
- "\xda\x2c\x61\x7b\xe9\x26\x0d\x8e\xd5\x43\x28\xbb\xf4\x28\xeb\xd3"
- "\x5d\x3a\x89\xec\x5b\xe8\x1c\x4a\xed\x46\xd5\xe6\x0a\x69\x22\xdf"
- "\x39\x2d\xcf\x25\x42\xdf\x41\xf6\xbe\x44\x4f\x9b\xc8\xef\x00\xca"
- "\xac\xc1\x58\x08\x9f\x22\xba\x4b\xef\x15\xfa\xcd\x42\x26\xfb\x4d"
- "\xf6\x6c\xba\x4b\xf7\x4a\x5c\xb9\x74\x81\x57\x77\xa9\x3a\x77\x65"
- "\x1a\xc5\x3a\x27\x3b\x84\x53\xba\x4b\xaf\xa1\x98\xa9\x80\x47\x33"
- "\xf9\x9d\xeb\x0c\x60\xbe\xd8\xcf\x11\x2e\x34\x53\x6c\x3c\xe4\xcf"
- "\x90\xeb\x03\xc1\xfc\x52\x23\xd5\x4f\xb0\xa5\x78\xb1\x80\xe9\xef"
- "\x51\x76\x54\xff\x41\xb1\x69\x01\xb7\xfd\x13\x8d\x0b\xc1\x28\x82"
- "\x36\x93\x17\x0f\xf7\x8c\xa3\x68\x5f\xda\x4a\x25\x29\x58\x47\xf6"
- "\x93\xb8\x97\xbe\x4e\x5d\x72\xec\xe4\x5c\x4a\xbb\x03\x75\x9c\xa6"
- "\xbd\x46\xb2\x19\x17\xf1\xba\x75\x97\x0e\xa8\xf0\x13\xf1\x2a\xea"
- "\x8a\x25\x1c\xd4\xfc\x8d\x52\x2f\x73\x65\x30\x58\x91\x36\x2f\xa6"
- "\x97\x49\x13\x3e\x8b\x35\x1b\x6b\xbc\x7b\x20\xae\xcd\x01\x71\x0e"
- "\x70\x88\x64\xea\x4b\xc3\x54\x57\x35\xf9\x05\x23\xbc\x38\x19\x8f"
- "\xff\x97\x1e\xa3\x76\x92\x6d\x5e\x24\x71\x88\x6c\x03\x7c\x04\x67"
- "\x94\x9d\x86\xb9\x50\x37\x41\x3c\x74\x11\x8f\x09\xf5\xb5\xc7\xc5"
- "\x98\xc5\x3a\x98\x76\x46\x5b\xe7\x68\x8d\x26\x3f\x0f\xd1\xb4\xea"
- "\xb9\x2d\xe0\x71\xac\x2a\x8f\x33\xae\xae\x48\xf8\x28\xbc\x91\x65"
- "\xd1\x59\x63\xb2\xd3\x26\x7c\xe3\xa6\xb9\x0b\xc9\xef\x31\xf9\x70"
- "\x74\x6f\xbc\x05\xed\xbd\xec\xc5\x6d\xd3\xc5\xf9\xc6\x80\xfb\xc6"
- "\x21\xb2\xd1\xf1\xf5\x97\x08\xdf\x44\xc6\xc5\xf6\x30\xdf\x2d\x63"
- "\x4c\xfb\x79\xf2\x5c\xe2\xa3\x7c\xc2\xef\x3f\x95\xf9\x8f\xfa\xf0"
- "\xd5\x5d\x66\x53\x79\x19\x1f\xe8\xe4\xe5\x27\x75\x97\x89\xf3\x8c"
- "\xb8\x9f\x7e\x52\x37\xfd\x90\x8c\x8b\x28\xfd\xd0\xab\xb6\x86\x93"
- "\xe5\xf9\x7c\x3f\x13\xe7\xa5\x75\xd3\xef\xb0\x5e\xcf\x98\x4f\x37"
- "\xfd\x6e\xe1\x13\xda\x35\x98\xa5\xc2\x20\xab\x56\xb6\xcb\x9c\x6b"
- "\xd7\x8b\x36\x52\xfb\x2e\xae\x6d\xd3\xb5\xf5\x72\x72\xb0\x62\xfa"
- "\x12\xed\x5c\xbf\xe8\xbf\xea\x2b\xda\xfd\x0d\x92\x5b\xa6\xbf\x25"
- "\x71\x70\x70\x8e\x5a\xf7\x9c\xff\x85\xba\x5d\x6a\x99\x46\xe1\x2f"
- "\x1b\x70\x41\xb9\x58\xbf\xa6\x77\x6b\xeb\xa9\x6a\x23\x3f\x5b\xae"
- "\xf3\xd3\xfd\xb1\xb5\x54\xc2\x70\xcc\x99\x9d\x35\x6b\x8a\xac\x60"
- "\xd8\x6d\xcb\x8b\x56\x14\x58\xf3\x0b\x0b\xd7\x14\x5a\xc9\xb9\x4d"
- "\xfc\x1c\x13\x36\x30\x15\x97\x1b\xd4\x18\x67\x2d\xd1\x18\x67\x15"
- "\x97\x2f\x8a\x8f\x3d\xe7\xd5\x5d\xbe\xe4\x7f\x47\xae\xb9\x7c\xc2"
- "\x73\x7e\x75\x7a\xa5\x15\xbf\x36\xfc\xdc\xf8\x75\x90\x9c\x93\x1b"
- "\x62\xd9\x58\x1f\xc5\xf9\xb4\xd8\x79\xf5\xcb\x33\x68\x1f\xbc\x57"
- "\x77\xf9\x07\x4d\x8a\x81\x09\xbf\x26\x4e\x85\x6c\x49\xc8\xb7\x79"
- "\x1b\x7e\x6e\xfc\x3a\xf0\x13\xdf\x29\xef\x89\xb3\xb6\xad\xf1\xef"
- "\x68\x6f\x9a\x3b\xf7\xf8\x28\x0f\x2f\x37\x08\xfe\x4f\x79\x46\xe6"
- "\x3b\xaf\x0d\x7a\x5e\x31\x6d\x91\x9a\x4f\x9c\x89\x4e\x29\x67\xd6"
- "\x71\xf2\x25\xf0\x8a\xa9\x76\x35\x9f\xb0\x4b\xd3\xfa\x43\x7e\xf7"
- "\x91\x5f\xcb\x67\xe0\x15\x97\x19\xd5\x7c\x02\xd7\x14\xa7\x7e\xbc"
- "\x7a\x27\x71\xe7\x91\x7d\x6a\xbe\xd4\xf8\xf2\xe2\xf2\x4c\x56\x2a"
- "\xf4\x3d\x94\x47\x29\x37\x08\xfd\x3f\xc6\x72\x15\xf2\x8f\x2b\xeb"
- "\x5d\xdc\x38\x5d\x91\x76\xfe\x38\xd9\x56\xac\xcc\xff\xee\xca\xd5"
- "\xc5\x14\x05\xaa\x68\xcd\xba\x22\xba\xae\x5e\xfe\xa8\xb8\xac\xc9"
- "\x7d\x64\x85\xbc\x29\x5a\x95\x45\x37\xab\x80\x6f\x74\xcd\x5b\x67"
- "\xa3\xcb\x8a\x35\xf4\x68\x2f\x98\xbd\x6e\x85\x16\xba\x3a\x1e\x0f"
- "\x33\x83\x15\x57\xec\x07\x6e\xec\x95\xfc\xc8\x15\x1d\x90\x7f\xc5"
- "\x3e\xb0\xb9\xdc\xcb\xde\xcf\x14\x31\xee\xd8\xd7\xfc\x15\xe8\xae"
- "\xf8\x84\xfc\x15\x98\xcb\x6d\x2b\xcc\xe1\x95\xf9\x7c\xeb\xf0\xc2"
- "\x60\xc5\x0c\x83\x97\x3d\xe5\x96\xbc\xd0\x60\xb6\xf0\xf9\x59\x71"
- "\xc5\x03\x9a\x7d\xa1\xe2\xf2\x05\xc8\x97\xbd\xb0\x37\x7a\x86\x7c"
- "\xe1\x0c\x5a\x91\x6f\x7e\xd3\x33\x22\xa6\x4c\x1a\xde\xd3\x77\x0b"
- "\xf0\x4c\xb1\xd7\xd2\x15\xd7\x31\x17\x9d\x4f\xc4\xb3\x15\xcf\x19"
- "\x28\x3f\x4f\x9b\x17\xf1\xb0\x51\x83\xaa\x7d\x77\x5c\xf9\x78\xac"
- "\x3f\x29\xcc\xad\x19\x2d\x5a\xcc\x5a\x11\x9f\xb6\x62\x46\x5b\x34"
- "\x3e\xad\x88\xc3\x94\xba\x54\xac\x6b\x62\x6d\xbf\xf2\xdb\x09\x96"
- "\xab\xfe\x59\xf2\xe1\x33\xbc\x9a\x4f\x06\xc9\x67\xcf\xf0\xc7\xc5"
- "\xf6\xc5\xf3\x95\x2c\x1a\xdb\x57\xf2\xa1\x3b\x24\x1f\x7a\xe5\x42"
- "\x5e\x31\xc3\x16\x8d\xc3\x56\x71\x65\x66\x7c\x1c\x36\x2f\xde\x93"
- "\x7c\x83\xf4\xec\xd8\x3a\x38\xe3\x30\xd5\x39\x5e\x1c\x63\xc8\xe7"
- "\xf6\xdc\x0d\xe0\xc5\x71\x15\x7c\xb9\xca\x03\x53\x3a\x77\x66\x93"
- "\x7f\x1b\x2b\xbd\x23\xde\x6f\x5c\x9d\xc3\x4c\xd1\xaf\x23\xe4\x33"
- "\xd7\xef\xc8\xd3\x7d\xb3\x89\xe9\xc4\xb3\xf4\xf9\xc8\x4f\xe9\xae"
- "\x14\xe7\xd8\x34\x7f\x70\xf1\x67\xe2\xc7\x3d\x7b\xf0\xb1\xb6\x67"
- "\xbc\x6a\x8d\x39\xbc\x3c\x5f\xf2\x71\xe9\xdf\x91\xb4\x74\xd8\x24"
- "\xd7\xfb\xf4\x0c\x7e\xbf\x8c\x55\xe2\xd5\xa5\xb7\xd0\x79\x24\xb3"
- "\x6e\xd5\x1a\x8e\x6f\xcd\xf6\xe5\xf9\x22\x0d\xf9\x36\x83\xd7\x92"
- "\xed\x4b\x4f\xf4\xa4\x0f\x30\x3e\x12\x91\x67\xfd\x75\xe9\xc6\x87"
- "\xae\x2a\xa3\x7a\x8c\x82\x8f\xf8\x98\x99\x28\x26\x1e\xb5\xad\x29"
- "\xce\x5f\x5d\x2d\xd2\x44\xbc\xfb\xfb\x99\x89\xfc\xf3\xaa\x6d\x31"
- "\x8a\x38\x63\x15\xe9\xcd\x9a\xcf\x1c\xd4\xf7\x35\x5f\xcb\xf7\xff"
- "\x40\xcc\x90\x6b\x56\xcc\x5e\x72\x37\xee\x66\xab\xe1\x5c\xe3\x71"
- "\x27\x7d\x38\xe9\xcc\xbc\xe1\x97\xb6\xad\x17\xf1\x10\x2b\xd2\xc1"
- "\x43\x5d\xa9\xc6\x50\xfe\xd1\x09\xa2\x2d\x22\x4e\x20\x9d\x2b\x54"
- "\x02\xa8\x77\xd6\x21\xe1\x1b\x57\x2f\xf9\x45\xe1\x93\xae\x22\x7d"
- "\x1f\x4f\xf2\x79\x65\x2c\xd4\x61\x2f\xc6\x4f\xac\xfb\x34\x37\xc4"
- "\xf9\xc9\x54\xea\xfb\x55\xe0\x0f\xd8\x5d\xf8\xfd\x3f\x19\xdb\xe5"
- "\x47\x27\xb4\x72\xc9\x7f\x14\x70\x6b\x21\xae\xa9\xc1\x8a\xab\x6c"
- "\x51\x1b\x21\xed\x4c\xa6\xee\xaa\xa7\xc9\xb7\x55\x8c\x3f\x9f\xf5"
- "\xba\xe4\x2b\xaf\x6a\xf4\x32\x73\x83\x9c\xdf\x57\x01\xff\x5f\x59"
- "\xa0\xde\x43\xfe\xbd\xb5\xe3\xbc\x32\x22\x9a\xee\x43\x8e\xdd\x55"
- "\xdd\xc0\xc5\xbb\xf0\xfb\x7f\xc8\xdf\xa7\xc5\x82\xde\xac\x17\x67"
- "\x8b\xfa\x13\x2c\x2c\x0b\xe9\x61\x2d\x7d\x92\x2e\x1b\xb0\x99\x69"
- "\xd2\xe8\xc9\x70\xd2\x10\x64\x87\x99\xe9\xe0\x37\xeb\xe5\xf3\x30"
- "\xbd\x9f\xad\x3d\xe3\x7e\x9e\x46\x6f\x48\x07\x31\xfc\x78\xce\x76"
- "\x92\xff\x56\x58\xc0\x93\x59\x48\xbe\x9a\x09\xf9\x77\x6f\x96\x9a"
- "\x37\xcf\xcb\x7e\xa5\x7d\x87\xfe\xbf\xed\x8f\xc1\x3f\xc1\x2c\xdb"
- "\x3f\x6b\x0f\x4f\x9e\x65\xa4\x18\xdc\xc8\x53\x8f\xb9\x24\xfd\x67"
- "\x14\xfb\x9a\xab\xce\xa5\x3e\xe0\x81\x34\xe2\x7e\x84\xf0\x62\x96"
- "\xb0\xad\xa9\xde\x98\xba\x84\xf8\x3b\xf2\x39\x20\x62\x9a\x91\x6f"
- "\xc8\x30\x9b\x2c\xfc\xf1\x57\xcf\x0c\x09\x3f\xf4\xeb\x33\x4d\x9a"
- "\x5f\x48\xcc\xc9\x3a\xae\xdf\x96\x41\xbe\x22\x85\xde\x2c\x98\x99"
- "\x22\xfc\x43\xaa\x7e\x21\x77\x15\xb3\xb4\x46\x45\xfa\x85\x14\xfe"
- "\x08\x2e\xe0\x1b\x92\x3b\x3f\x4c\xd5\x7c\x43\xa2\xcf\x74\xce\x30"
- "\x93\x8f\x84\x43\xb8\x66\xc4\xf9\xb5\x31\x8c\xeb\x27\x52\x0f\x1a"
- "\xa9\x97\x7e\x22\x2f\x6e\x6d\x99\x65\x93\x38\x31\xab\x55\x8b\x4b"
- "\x1d\x97\xd6\x0e\x9c\x56\x69\xd0\x55\x75\x6a\x1a\xf8\x9f\x5f\x36"
- "\x46\xf9\x30\xd0\x36\xd2\x1f\xe2\x7d\x1a\x77\x14\x6c\x8f\x9f\x43"
- "\x8c\xd1\x12\x3d\x09\x73\x6b\x32\x7e\x53\xe8\xb7\x30\x4a\x27\x46"
- "\x78\x37\xc9\x02\x66\x1d\xd6\x15\x7b\x02\x5f\x1c\x0e\x27\xe4\x86"
- "\x75\x87\x89\xc7\xa4\xb3\xd5\x8b\x23\x61\x3a\xe3\x6f\x58\x1c\x19"
- "\xa6\x78\x91\x87\xe9\xcc\x58\xed\x23\x74\x86\x71\x16\xa7\x58\x32"
- "\x8b\x23\x5f\xf1\xdd\xf2\x6c\x66\x17\xc9\x00\x91\x11\x7e\x30\x52"
- "\xcc\x3b\x30\x06\x26\x92\x2f\xc8\xcf\x56\x8a\x2e\xc4\x52\x6c\x09"
- "\xef\xdc\x77\xe6\x1d\x4e\x3e\xb6\x28\x8e\x98\x52\x11\x02\x4d\xb4"
- "\xea\x72\xc3\x09\x65\x9e\x70\x9f\xf0\xe5\xbf\x38\x32\x85\x2f\xb6"
- "\xdf\xc6\x45\xfc\xaf\x62\xde\x0e\x7a\x9a\x20\x62\x42\x6f\xe0\xc3"
- "\xb8\x37\x2e\xde\x30\xcc\x29\x5e\x25\xca\xee\x58\x1c\x56\xce\x2d"
- "\xb6\x2b\x8e\x5c\xbb\x0e\xdf\x7d\x86\xef\x3e\x43\x7b\xb2\x50\x66"
- "\x2a\x9e\x6f\xe7\xbb\x1f\xa1\xb3\x4e\x65\x42\xc6\x41\x1f\xdd\xea"
- "\xf9\xd1\x36\xb4\x6f\x1f\xf9\x02\xcf\x0d\xbb\xcb\x76\xab\xe7\x41"
- "\x45\xac\x54\xfb\x28\x57\xeb\x99\xb7\x78\x03\xbb\x3d\x77\xc3\x2c"
- "\x71\xae\x94\xce\x4c\x2d\x0e\x5b\x51\x67\x19\xc1\xc3\x24\xe2\x53"
- "\xd3\xb9\xa9\x8a\xab\x73\x2e\x14\xe7\x92\xec\x41\xd6\x5e\xc1\xf4"
- "\xa4\x07\x88\x34\x39\xfd\xe4\xf3\xcb\xe1\xe7\x21\xd2\xef\xbd\x73"
- "\xae\x5b\x6f\x2d\x36\x80\x7e\x5e\xbd\xa9\xd3\x96\x35\xfe\xd9\xb9"
- "\x8a\x48\x0b\xaf\x7e\x6d\x0b\xaf\x64\x76\x5e\xdd\x66\xe0\xae\x00"
- "\xd1\x6c\x1d\xaf\x4c\x58\x88\x67\xa4\x4f\xb6\xf0\xea\xd7\x21\x2f"
- "\x1b\x07\x70\xc5\xf3\xd4\x36\x5e\xfd\x06\xf8\xa8\xfe\x32\x7c\x57"
- "\xc6\x2b\xbe\xa0\xef\x80\xe7\x03\x36\x5c\xf1\x7c\xa2\x00\xf9\xf0"
- "\x7c\x72\x19\xae\x78\xfe\x32\xa7\x5f\xf7\x0d\x94\xf5\x06\xe4\xdd"
- "\x14\x97\xac\x6b\x9a\x4b\xd4\x55\x99\xe6\x92\x75\x5c\xee\x92\x75"
- "\xcc\x70\xc9\x3a\xae\x72\xc9\x3a\x7c\x4b\x90\xdf\xc5\x2b\x06\xdd"
- "\xc8\x87\xb6\x7e\x95\x85\x2b\x9e\xfd\xcd\xc8\x87\xe7\xa1\x54\x5c"
- "\xf1\x3c\x8c\xb6\xbc\x81\xe7\x80\x1f\xf9\xab\x78\xc5\x48\x1e\xf2"
- "\x99\x78\x45\xb0\x1b\x57\x3c\x9f\x5d\x84\x7c\x78\x3e\x87\x72\x5e"
- "\xc7\x73\x78\x0e\xf2\x83\x96\x5a\xa9\x3d\x75\xbc\xf2\x1b\x54\x6e"
- "\x2a\xaf\xfc\x26\xe5\xc7\xf3\x35\x28\xef\x75\x3c\xff\x53\x26\xae"
- "\x78\xce\xec\x42\x7e\x3c\x5f\x8f\xbe\xbe\x56\xcf\x2b\x67\x67\x20"
- "\x5f\x1a\xaf\xbc\x01\xe9\x6d\x78\xbe\xa9\x04\xf9\xf0\x7c\x33\xe5"
- "\xc7\xf3\x2d\x87\x91\x1f\xcf\x73\x08\x46\x0d\xbc\x72\xae\x17\xf9"
- "\x2c\xbc\xf2\x3b\xd9\xb8\xe2\xf9\xff\x52\xfb\xf1\xfc\x3d\x86\x2b"
- "\x9e\xb3\x01\xab\x37\xf0\x7c\x27\xda\xf7\x5a\x23\xaf\xbc\x9b\xca"
- "\x4f\xe7\x95\xff\x42\xf0\xc1\xf3\x3d\x3e\xe4\xc3\xf3\x22\xc0\xe3"
- "\x75\x3c\xdf\xb7\x0f\xf9\xd3\xc7\x1d\xcf\xca\xef\x57\xf1\xf2\xc9"
- "\x80\xf5\xbf\x77\xf0\xf2\x29\xb8\x2e\xb5\xf3\xf2\x49\x99\xbc\x32"
- "\xb7\x1b\xe9\xb8\xfe\xc7\x12\x3c\xcf\x56\x9f\x71\x7d\x28\x13\xcf"
- "\x59\xea\x33\x5d\x19\x9e\xe7\xa8\xcf\xb8\x2e\x77\xe1\x79\x1e\xaf"
- "\x7c\x98\xf6\x33\x70\x5d\x1e\xc0\xf3\x7c\xf5\x19\xd7\xbc\x0c\x5c"
- "\xc3\xfe\xab\x9c\x0b\xfd\xc9\x4f\x32\x7f\xf2\x9b\x36\xc2\xc9\x48"
- "\xcd\x6b\x65\x4a\x4a\x1b\xed\x7b\x4d\x76\x9c\x61\x53\xfa\x75\xd7"
- "\x5c\x46\x6b\xa1\xa7\xc4\x2b\x62\xcf\xa9\x3e\xe8\x26\xf7\xea\x32"
- "\xa6\x61\xed\x9f\x47\xf1\xba\xd1\xf7\xfd\xdc\x39\x69\x08\x7d\x9e"
- "\xcf\x9d\x53\x7b\x71\xc5\xf3\xb4\x8f\xd1\x67\x3c\xcf\xad\xc4\x15"
- "\xcf\x3f\xba\x13\x7d\x9f\x1f\xac\xc8\xb0\x79\x75\x57\xef\x11\xb4"
- "\xfd\xa5\x6d\x36\x73\xd8\x01\x9a\x02\x7a\xbb\xfd\x3d\xc8\xa3\xcb"
- "\x00\xd7\xfd\xa9\x66\x8a\x11\xb1\xcb\xe9\xe2\x29\x4f\x8a\x36\x51"
- "\x1c\x18\x3e\x9a\xa1\x97\x75\x4f\xe5\xa8\x7b\x17\xe9\x38\x79\xca"
- "\xee\x89\xde\xbf\x25\xde\xcf\x78\x2f\x5b\xbe\x37\xb2\xd8\xfb\x1f"
- "\xd1\xfb\x63\x66\xd2\x4b\xcf\xdc\x28\xde\x7b\x02\x03\x6a\xbf\x12"
- "\xe8\xdd\x59\xca\xeb\xd5\x5d\x93\x2e\xf5\x54\x19\x56\xee\x4c\x60"
- "\xc3\xc6\x61\xac\x5d\xd7\x60\xfd\xbb\x3a\x4f\xd5\x19\x06\xb8\xd1"
- "\x17\x92\xfe\x06\x82\x13\xf9\x42\x31\x2a\x55\xee\x82\x6a\x27\xef"
- "\x22\xd9\x13\x6b\x88\xde\x5a\x9a\xd1\xd6\xab\xbb\x36\xb4\x4b\xe8"
- "\x14\xde\x33\xd2\x99\xa0\x5e\xdd\x35\x6f\x8d\x56\x06\xb2\xac\x1b"
- "\xcd\xa8\xff\xda\xb3\x8e\x10\x3f\xe3\x2e\xbd\x13\x6b\x9d\x48\x5f"
- "\x25\xec\xcc\xe5\x7d\x8e\xb4\x0d\x12\xf7\x0b\xa4\x7e\xf4\xda\x10"
- "\x7d\x1b\xcf\xeb\x47\x2a\x16\xfb\x94\x94\xf7\x52\xe5\xde\xd6\x35"
- "\xef\xbe\xa5\x78\xf5\xe6\x22\x36\xc9\xba\xf1\x1d\x2a\xdf\x38\x56"
- "\x2e\xd4\xf2\xd2\xbb\x6b\x06\xdf\x46\xde\x9d\x42\x87\x73\x6d\x54"
- "\xff\xcb\xd1\x87\xa7\x24\x4f\x94\x4d\xeb\x9a\xe4\xed\xae\x6d\x20"
- "\x5f\x98\x61\xd3\x9b\xfe\x70\x55\x85\x3f\x52\xf5\x9e\x91\xd7\xbc"
- "\x97\x9a\x12\xd6\x31\x61\xa3\xaf\xbb\xf6\xd0\x4d\x21\xd2\xad\xfd"
- "\x91\xf2\x3e\xa1\x4c\xfe\xe1\xde\x1b\xed\x4c\xef\x2e\x3c\x4a\xcf"
- "\xef\xf3\x8a\xdc\x07\x3c\xbe\x6e\x46\xfe\x7c\xf1\xdc\xce\x2b\x1e"
- "\x9d\xa7\x4c\xce\x4f\x6d\x22\x9e\xd4\x4e\x3a\xa1\x8f\x29\xfd\x1e"
- "\x8c\x0b\x78\xff\x6b\xf7\x68\x6d\x21\x7f\xfe\xd5\x80\x1d\xf1\x8b"
- "\x74\xa6\x3a\x37\x12\x21\xff\x4f\x2e\x2f\xe0\x20\xc7\xeb\x5a\x17"
- "\xd1\x6d\xb5\xde\x63\x4a\x52\x20\xbd\x73\x29\xed\x9f\x1a\xc9\x9f"
- "\xce\x19\x71\x06\x33\x4c\x31\xf8\x68\xad\x94\x79\xc7\xf8\x30\x5e"
- "\x61\xcb\xdd\x68\x5b\x53\x58\x94\xbb\xce\xf6\x5d\x2b\x04\x36\xeb"
- "\x9a\x47\xac\x8f\xe5\x3f\xb6\xa6\x70\xc3\xf9\x7c\xa5\x31\x58\xf1"
- "\x4f\xf3\x81\x27\xe2\xac\xc5\x07\xe0\x55\xa5\xae\xf9\x3a\x61\xe7"
- "\xb4\xfd\x39\x19\xf3\x01\x79\x96\x79\x59\x95\xf0\xe7\xa5\x34\xbc"
- "\x97\xc9\x1b\x9d\xae\xad\x74\x96\x7c\x1d\xc9\x06\x7e\xe6\x61\x43"
- "\x68\x9b\x8c\xff\xd7\x49\xfe\x0e\x8a\x4b\xb8\xbb\x78\x88\xe6\x81"
- "\x91\x57\xbf\x69\xc1\x3c\xe8\x3a\x5b\xfd\x64\x41\xaf\x2e\xd3\x7f"
- "\xb6\xfa\x4d\xa3\x16\xa3\x27\x52\xf5\x66\x81\x62\x72\x97\x51\x8c"
- "\x9e\x51\x6e\x61\x87\x00\xcb\x73\xae\x00\xf8\x9c\x80\x61\x97\x13"
- "\xeb\x18\x64\x0a\xe1\x67\xe1\xa5\x6d\x4b\x22\x3c\xd3\x10\x71\x32"
- "\x23\xae\x29\x3c\xe5\xdd\xd6\x51\xd3\x7e\x46\xef\x29\x36\x4f\x64"
- "\x34\x93\x95\x1e\xe6\xca\xbf\x17\x00\x6f\x9c\x8c\x8b\x78\xa8\x05"
- "\x83\x0c\xe9\x49\x4a\xcd\x9b\x75\xfd\x0b\x99\x9e\xf2\x82\x47\x62"
- "\x4b\x71\x5f\xb2\x9c\x25\x23\x9f\xb9\xe4\x03\xa4\x07\x33\x93\xc2"
- "\x8e\x4c\xe3\x39\x47\x66\xd2\x28\xcf\x34\x79\xfa\x42\x6c\xf4\x9a"
- "\x6d\xcb\x6e\xf0\x33\xc3\x76\xf0\x52\xbb\x14\xcc\xc1\x46\xa7\x2d"
- "\xf2\x78\xe6\xe4\xf0\xe3\x99\x86\xd1\xd1\x4c\x63\x78\x7d\xa6\xe1"
- "\xdc\xfa\xcc\xc9\xa3\xc1\x4c\xa3\x27\xcf\xcf\xfe\xe8\xff\x05\xeb"
- "\xec\x1b\x10\xfa\xc8\xd1\xe4\x77\xf7\x8f\x26\xbf\xd9\x68\xea\x63"
- "\x69\x37\xda\xc0\x53\x81\x9f\xdc\x01\xde\x19\x38\x61\x0a\xbf\xb8"
- "\x0d\x34\xf4\xdd\x65\xfd\xba\xcc\x4f\xee\xbe\x8e\x7f\x15\xa9\xb8"
- "\xb1\xc5\xfa\xaf\xa0\x57\xe5\x86\x74\xa4\x01\x7f\xfe\xaf\x85\x57"
- "\xfc\x1f\xd0\x36\x83\x15\xbf\x0c\xaf\x1c\x07\xac\x67\x37\x2c\xc5"
- "\x73\x3a\xe5\x95\xf9\x6e\xdd\xeb\x15\xd7\x9b\x84\xed\x7e\xa4\xe2"
- "\x9f\x0c\xbb\x84\x7c\x77\x9d\x51\xe3\xcb\xdb\x0d\xe3\x9f\x57\x47"
- "\x9e\xd9\x51\x39\x59\x01\xcd\xa9\x7e\xcd\x36\x3e\x2d\xff\x32\x4c"
- "\x7b\x99\x0a\xe0\x06\x7c\xd8\x45\x3e\xa6\xb8\x63\xa1\x2a\x9b\x5e"
- "\x27\x78\x36\x3a\xe3\x4d\xfa\x0b\x35\x4d\xe8\xda\x15\x7d\x36\xf9"
- "\xe3\x6f\x23\xbf\x5e\xa4\xaf\x00\x5e\x43\xa6\xbf\xae\x15\x70\x98"
- "\x04\xb9\xae\x15\xbf\x36\xfc\xdc\xdb\x48\x8f\xe1\x64\x77\x6b\x3a"
- "\x9e\x09\xda\x0a\xfe\xaf\xba\x21\x26\xe7\x5e\x37\x80\xb2\xb2\x2f"
- "\xde\x0e\xf0\xba\x81\x0b\xe8\x9b\x0d\xe4\x9f\x96\xd7\xbc\xd6\x5c"
- "\xa7\x44\xfd\xd9\x62\x6d\xb8\xfe\x36\xd0\x89\x32\xf1\xae\x6a\x7f"
- "\x6a\xe9\x69\x96\x40\xef\x5a\xc9\xee\x01\xcf\xd6\x42\x1d\xf7\x04"
- "\x42\x0c\xdf\x18\x78\xba\xd3\xd5\x3a\xe2\xd7\xd3\xbc\xe8\x44\x1a"
- "\xbe\x7d\xb0\x6e\x44\x2d\xb7\xe1\xbd\x2c\xc7\x4f\x99\x88\x2f\x42"
- "\x31\x8a\x68\xbe\xd4\x95\x42\x86\xa4\x78\x4a\x85\x44\xab\xaf\x7f"
- "\x1a\xf7\x46\xca\xc7\x4d\xfb\x53\x15\x94\x81\x39\x63\xe7\xc9\x6f"
- "\x86\x94\xea\x37\xcb\x30\x77\xb2\xf9\x55\xce\x01\x65\xfb\x7b\x96"
- "\x60\xc5\xf5\xd4\x7f\x11\x87\x9d\xfc\x07\x91\x8e\x24\x02\x59\xbd"
- "\xb3\x25\xcc\xf8\x9d\x61\xf6\x7e\xd1\x19\xe6\x4f\x0c\x98\xfc\xc9"
- "\xee\x02\x7f\xf2\xbb\xcb\x22\xc9\xee\x56\xfc\xf6\xd9\x0a\x69\xdf"
- "\xf8\x5b\x7b\xa3\x7e\x30\x4f\x5f\xd8\x0f\x26\xca\xcc\xd0\x7c\x61"
- "\x46\xd6\x5f\xbc\x1f\xcc\x88\xfe\x80\x61\x57\xf1\xdf\xf6\x83\x09"
- "\x9e\xb5\x0b\xfc\xaa\x5b\xf3\x59\x12\x11\x76\xe8\xcc\x14\x49\x7e"
- "\x73\x40\xf8\x3d\xb1\xbb\x85\xef\x12\xe2\x5d\x69\xad\x09\x56\x7c"
- "\x6b\x40\xe3\x47\x89\x7e\x46\xb6\x06\x2c\xf8\xa5\x05\x2b\x66\x33"
- "\xaf\xee\xf6\x79\x1a\x6d\xc5\x9a\x6b\x8d\x24\x3d\xe6\x0b\xd2\xd9"
- "\x82\xd1\x82\xdb\x29\x2f\xe0\xb8\x04\x75\x27\x44\x46\x0b\xe6\xe3"
- "\x77\x1b\x7e\xdf\x8b\x54\xbf\x99\x1a\xa9\x7e\x37\x3b\x52\xfd\x64"
- "\x06\x7e\x99\xf8\xcd\xc6\x2f\x0b\xbf\x39\xf8\xcd\xe3\xd5\x4f\xce"
- "\xc7\x95\xde\x2f\xc0\x6f\x21\x7e\x8b\xf0\x5b\x82\xdf\x03\x91\xed"
- "\xef\x59\x23\x3a\x43\x3a\x7e\x19\xf8\x59\x23\xd5\xee\x16\xfc\xec"
- "\x28\xd3\x2f\xce\x7c\x56\xcc\xae\xd7\x70\x75\x02\x9f\xab\x99\x22"
- "\x66\xc2\xa4\x4f\xb9\x99\xe2\xf9\x96\x9c\xa1\x3d\xec\xcc\xff\x8f"
- "\xbd\xf7\x81\x8b\xaa\x4a\xff\xc7\xcf\x5c\xc7\x42\x9b\x81\xc9\xa5"
- "\x96\x0c\x6d\xb6\x68\x3f\x53\xab\xc5\xb6\xe6\x52\x1f\xdd\xc8\xac"
- "\xb5\x52\xb1\x5d\x6c\xa9\x2c\x31\xb1\xd0\x10\x51\x49\xc9\x3f\x80"
- "\x93\x29\x12\x20\x9b\x6e\x1f\x34\xfe\x58\x6b\x9f\xa5\x5d\x2d\x77"
- "\xd7\xfd\x3a\x20\xd5\x68\xba\x8b\x0a\x0c\xba\xda\xd2\x7e\xf0\xd7"
- "\xc4\x92\x4b\x86\x36\xc1\x28\x03\xcc\xdc\xf3\x7b\x9e\x7b\xee\x65"
- "\xee\x1d\x66\x60\x66\x40\xb3\x0d\x7c\x5d\x67\xe6\xdc\x73\xcf\x3d"
- "\xe7\x79\xde\xcf\xfb\x79\xce\xb9\xe7\x9e\x73\xd8\x60\x0f\x6c\xef"
- "\x0c\xd5\xb8\x43\xbe\xb0\x8d\xe5\x03\xcf\x74\x07\x56\xde\xf8\x5e"
- "\xe3\x7f\x3d\xf1\x7e\xc4\x41\x83\x33\xd2\x58\xef\x34\x92\x6c\xe0"
- "\x36\x55\x5d\x62\x33\x89\xb3\x91\xac\x9a\xe6\x2e\x92\x95\x44\x5d"
- "\x02\x0f\xac\xc1\x39\xde\x5b\xa2\x10\xe7\x2e\x9a\xa0\xef\xce\xdb"
- "\x1f\xe1\xd2\x98\x63\xa9\xc6\x9c\x21\xac\xad\x07\x7c\x82\x7b\x94"
- "\xf5\xf4\x69\x11\x77\xd0\xaf\xad\x6d\xbd\x40\x56\x27\x51\xbe\x36"
- "\x19\x62\xb4\x06\x00\x9f\x8a\xbc\x29\xe0\x4f\xec\xd7\x3e\xda\x48"
- "\xb3\x01\x4f\x23\x5c\x20\x37\x1e\xfb\xb3\x80\xbd\xb2\x15\x24\x5a"
- "\xc2\x1f\xf8\x75\x9d\xb4\xaf\x13\xbd\x6a\x5c\x39\x9c\x53\xe3\xbe"
- "\x4f\xc5\xd0\xaf\x2d\x5e\x41\xa2\x8a\xe1\x9c\xb0\x47\x27\xd4\x7b"
- "\x66\x5a\x18\xe5\x5f\x30\x90\xd2\x45\x24\x44\x7b\x8e\xed\xfb\xea"
- "\x02\xd9\xbb\xf7\x3e\xd8\x98\x3c\xe3\x9c\x9e\x1c\x36\x9c\x06\xff"
- "\xbc\x07\xf4\xb2\x31\xb9\x1b\x7c\x18\xc8\xd2\x15\x98\x2c\xef\x48"
- "\xbc\x54\xb2\xec\x8e\x34\xa6\x31\x79\x26\x12\x94\x99\xa7\x3c\x51"
- "\xc6\xab\x9a\x41\x9e\x20\x57\xcb\x49\x17\xf4\x4f\xc9\x3c\x49\x9e"
- "\x6f\x80\x3c\x41\xa6\x11\x28\x53\x90\x87\x20\x53\x2a\xca\xb4\x54"
- "\x26\x53\xe0\x2f\x61\x1d\x42\x94\x29\x0f\x32\x2d\xf5\x21\xd3\x9e"
- "\xf1\x01\x90\x69\x99\x5f\x32\x2d\x1f\x80\x4c\xef\xdc\xeb\x4b\xa6"
- "\x4e\x8c\x1d\x0a\x36\x26\x52\xe0\x46\x8b\xf3\xa8\xb0\xa6\x26\xc4"
- "\x7d\x7b\x21\x7e\xdd\xc3\x6b\xf6\x27\xe3\x3e\xde\xf8\x5c\x1f\xf7"
- "\x19\x13\xd6\x80\x2a\xa7\x9d\xae\x82\x03\x66\x4c\x03\x6e\x4b\xbe"
- "\x13\xe7\x12\xa5\x59\xc1\x7f\x51\x53\xdd\x45\x1c\x47\xbb\xeb\x5c"
- "\x17\xc6\xde\x05\x07\x28\x4f\x93\x09\xf2\xca\x33\xb7\x11\x75\x17"
- "\x70\x47\xda\x0a\x72\x53\x21\xf0\x61\x57\xbe\x79\xef\x59\x55\x74"
- "\xce\x83\x69\x3c\x85\x23\x0b\xd7\x86\xe4\x81\x77\x81\xcf\x05\xfd"
- "\xa2\xce\xf0\xf9\x60\xed\x33\x07\xa1\xbc\x1f\xbf\x74\x2c\xd1\x49"
- "\xb2\x92\x7b\xeb\x97\xcf\x4a\xd0\xbb\xf2\xfa\xb7\x13\xdc\xeb\x70"
- "\x4d\x0b\xea\x75\x0f\xb1\x34\xbb\xed\x84\x17\x79\x1a\x75\x81\x76"
- "\x81\x36\xb2\x59\xc6\xcf\xc0\xfd\xba\x12\x71\xef\x0f\x97\x11\xf8"
- "\x19\xd7\x8a\x07\x5d\xe2\x9e\x20\x5e\xed\x63\x35\xd8\xc7\x2a\x61"
- "\x5f\xa6\x08\x90\xc7\x9e\xae\x0e\xa6\x43\xd4\x99\xc5\x59\x2d\xe8"
- "\xaf\x50\xf4\x07\x4c\xee\xe6\xd5\x94\x26\x40\x4c\x77\x8b\x83\x2f"
- "\x38\xb0\x87\x76\x24\x8f\xc4\xbd\xb9\xca\xce\x03\x9e\x92\x20\x86"
- "\xfa\x0a\xfc\x45\x2a\xe0\xeb\x3c\x89\x2a\x4b\x85\xb8\xa8\x03\xf7"
- "\x57\x83\xfa\xbc\xc4\xf6\xa5\xe5\x37\x8c\xd7\xc0\x39\x61\xad\x4b"
- "\x5e\x5a\xeb\xb2\xdd\x80\x63\x1b\xee\xf1\xa6\x25\x06\xce\x7d\xcf"
- "\x4e\xb3\x4b\x73\x8b\x43\x78\x37\x55\x75\xd7\xfd\xec\xf9\x73\x63"
- "\x0e\xca\xb5\x55\x75\x57\x3a\x1b\x03\xfe\x2c\x2f\x2d\x13\xe7\x0c"
- "\xdd\x75\x1b\xcd\xfd\x22\x3b\x0d\xf7\xd8\x96\xce\x65\x41\x5d\x8d"
- "\x07\x9d\x77\x64\x93\x6c\x57\x7e\x54\x04\xee\xbd\x8e\xeb\x86\x05"
- "\x86\xc5\xbb\x62\xb1\x2c\x57\x4e\xe7\x21\x90\x53\x2c\x9f\xdb\x59"
- "\x03\x9c\x12\x4d\x5f\x80\xb6\x2e\x82\xb6\x9e\x05\xb9\x9e\x85\xb6"
- "\xae\x14\xdb\x2a\xee\x39\xc7\x83\xfc\xe1\x9c\x77\xff\x28\xb5\xf5"
- "\x05\x90\x77\xce\x27\x09\x6b\xcf\x91\xef\x51\x88\xc9\x6b\x5b\x85"
- "\xf7\x82\x3a\x2c\xce\xd3\x04\xef\x2b\xf8\xef\xbc\x8d\x31\xb3\x01"
- "\x8f\x28\x73\x88\x19\x76\xd0\xd0\xfd\x85\x92\x1e\xb0\x3e\xb4\x3b"
- "\x79\x64\x69\x2a\xd4\x07\x65\x7f\x9e\x8c\x43\x7b\x06\xd9\x47\x95"
- "\xa2\xfc\x95\xfb\x3e\x87\x0b\x3a\xb8\x0a\x74\x90\x2a\xea\x20\x5f"
- "\xd4\x01\xc4\xcc\xe0\x8b\x71\xac\x27\xa2\xd4\xc8\x74\x10\x98\x8c"
- "\x7e\x92\x34\xc8\xf6\x7a\xc8\xb7\xbd\x4e\x7c\xb3\x8b\xf5\xa5\x55"
- "\xb8\xe6\x26\x0d\x3d\x38\x8c\xef\x06\xbb\x2d\x10\xed\x96\x26\xff"
- "\x4c\xb2\xd9\x33\xaa\x09\x93\xfd\xb3\xd9\xbb\xc7\x7f\x47\x6d\x36"
- "\xfc\xd2\xda\xec\xdd\x17\x94\x36\x3b\xd1\xa0\xb4\xd9\xbb\x4f\xbb"
- "\x6d\x56\x3c\x37\x28\x36\x7b\xb7\xfd\x9b\xb1\xd9\xbb\xed\x5e\x6c"
- "\x76\xa7\x1f\x36\x1b\xe1\xc3\x66\x23\x2e\x9d\xcd\xfe\x34\xe2\xf2"
- "\xf9\xd8\x7b\x9f\xe8\xe2\xbc\xf8\xd8\xd5\x32\x1f\xab\x45\x1f\xfb"
- "\xd3\x56\x6f\xf6\xda\x5d\x0c\xf6\xaa\x11\xed\xf5\xc9\x4a\x28\x2f"
- "\xe6\xf3\xa3\x8d\xfd\xdb\xab\xb3\xd8\x1d\x3f\xf9\xb4\xd9\x64\xb4"
- "\xd9\x72\x62\xb1\x0a\x36\x3b\x4f\xb2\xd9\x62\xb1\x3f\xd4\x87\xdd"
- "\x86\xfb\xb2\x5b\xdc\x87\x0b\xf7\xe0\xea\xd3\x6e\xc5\x78\xa9\x7b"
- "\x0c\xda\xad\xf9\x0a\xf3\xb5\xf7\xec\x56\xda\xed\x3d\x56\xa5\xdd"
- "\xde\xf3\x1b\xb7\xdd\x8a\xe7\x06\xc5\x6e\xef\xd9\xf5\xcd\xd8\xed"
- "\x3d\xbb\xbe\x3d\xbe\xf6\x5e\x9f\x63\x29\x83\xef\x6b\x7f\x76\x9d"
- "\x60\xb7\xbe\x7c\x6d\x96\xe8\x6b\xb5\xe8\x6b\xff\xfb\x1d\xff\x6c"
- "\x77\xd2\x9b\xdf\x71\xdb\xbd\xc4\x3e\x77\xf2\x42\xa5\xed\x4e\x2e"
- "\x56\xda\xee\xe4\xc7\xdc\xb6\x2b\x9e\x1b\x14\xdb\x9d\x9c\xfc\xcd"
- "\xd8\xee\xe4\xe4\x6f\x8f\xcf\xfd\x99\xcf\xfd\x8b\xf5\x63\x49\x76"
- "\x93\xea\x67\x9f\x5b\x8a\x85\x39\x80\xd9\x16\xe7\xbd\x84\xcd\x55"
- "\xb9\x4f\x6b\x89\x88\x21\x7c\xae\x3d\x1b\xf7\x94\xc0\x39\x33\x5b"
- "\x64\x73\x52\xd8\x1c\x8a\xfb\xc6\x4b\x73\x6a\xca\xc4\x7d\x27\xfa"
- "\x9a\x53\x43\x73\xec\xe1\xe2\x75\xc9\x0c\x1b\xf6\x08\xe9\xb7\xb0"
- "\xe6\x95\xea\xbe\x14\xba\xc9\xae\xb3\x8d\xb0\xeb\x7c\x3d\x2f\x0a"
- "\x5d\x47\x29\xee\xd7\xd4\x3e\x76\x0b\x69\xcf\x25\xa4\x50\x78\x16"
- "\x73\xdf\x4e\x68\xa3\xb0\xcf\x48\x7b\xe8\x44\x6b\xbb\x71\x16\x81"
- "\x34\x93\x94\x26\xec\x7d\x6d\x1c\x46\x79\x38\x47\x0b\x36\xd4\x94"
- "\x65\x92\x10\x5c\x47\xf4\x8e\x8b\x88\xc5\xfb\xaa\x81\x23\xc2\x71"
- "\xcf\x27\xdc\x67\x83\x7e\xff\x46\x7b\x69\x1b\x51\xd7\xad\x17\xc6"
- "\x9f\x71\x2e\xce\x8e\x02\xc4\xff\xb0\xdb\x8b\x28\xa7\x26\x7c\x89"
- "\xb1\x81\x6a\xcd\x26\x61\xee\x2f\x60\x45\x9a\x9f\x83\xfb\xa5\xf1"
- "\x63\x8c\x19\xd2\x3a\x96\x14\xea\xf7\x41\xa6\x8d\xc3\x3d\xca\x4b"
- "\x97\x11\x1d\x1c\x1a\x9a\x6f\x36\x75\x6c\x88\x9d\x25\x8d\x27\xfa"
- "\x9c\xc7\x8d\xfb\xf7\xde\x18\xa1\x16\xe7\x02\xe1\xfb\xb8\xc2\x3b"
- "\x0d\x9b\x39\x3e\xc7\x05\xe9\xd4\x98\x25\xec\xbb\x15\x06\xb2\xc0"
- "\xb9\xb7\xb8\x1f\x12\x5f\xba\x85\xbc\x3c\x9a\x90\x77\x57\xb5\x70"
- "\x38\x17\xc4\xf5\x3f\x37\xda\xcd\x99\x77\xe1\x7a\x15\xc2\x5a\xe7"
- "\x67\x54\xf7\xcf\x88\xfb\x82\xed\xd5\x0b\xdf\x9f\xc0\x67\x30\x33"
- "\xe0\x37\xce\x0f\xe0\xdb\x23\xd4\x98\x17\xd2\x87\x9b\x57\xfc\x93"
- "\x84\xa5\x09\xf3\xe3\x43\x58\xde\xd8\x93\x98\xd7\xaa\xba\x5f\x58"
- "\xe3\x0c\x7e\xb7\xe0\x73\x03\x9c\x43\x8f\xf3\x9d\x68\xb1\xb1\x41"
- "\xe0\x87\x3c\xb3\x09\xda\xdf\x20\xcc\x5b\x85\x76\x6e\x86\x36\x43"
- "\x1e\x0d\xce\xed\x11\x3e\x33\x89\x6e\x2b\xa4\x61\x39\xf0\xa9\x31"
- "\xa7\xe2\x5c\x95\xd8\x43\x58\xb6\xcf\xf7\x03\x34\x66\x13\x35\xaa"
- "\x09\x7b\xc7\x47\x75\xbc\x49\x75\xbf\x23\x4c\x45\x29\xdc\x33\xe3"
- "\x65\x1c\xe7\xc6\x39\xd9\xc2\x3c\xf3\xfb\x8f\x43\xf9\xea\x32\x61"
- "\x1c\xf7\xfe\x3d\x56\x55\x6c\xcf\x9a\xc0\xec\x99\xd3\x14\x5c\x6b"
- "\x57\x85\xd7\x88\xf9\x77\xb0\xf9\xcf\x66\x93\x3e\x73\x18\x85\xdf"
- "\x5f\xb3\x79\xdb\x21\x89\x70\xbd\xcd\x3d\x5f\x4d\xb8\x0e\xb0\x34"
- "\x45\x0d\x3a\x13\xf6\xc9\xc1\xdf\x3e\xe7\x44\x8b\x7a\xab\x85\x08"
- "\xb7\x97\xee\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\xcb\xb4\x72\xec"
- "\x19\xc7\x14\xe1\x3d\xe7\x02\xd0\xa1\xeb\x8d\x08\xb5\xb0\x5e\x78"
- "\x37\xea\x05\xe7\xd6\x3f\xf0\x30\xea\x65\x33\xf8\x02\x31\x6f\x8a"
- "\xbb\xfe\xf8\xfb\x01\x41\x9f\x3c\xe8\x82\xcd\xf1\x7f\x60\x8c\xb0"
- "\xf7\x0c\x70\x06\xce\x2f\x3f\x94\x41\xf0\x79\x71\x03\x05\x8c\xbc"
- "\xbb\xcc\xc1\x95\xae\x60\xe9\x1f\xb4\x39\x38\x9c\x4b\x82\xe3\xe1"
- "\xf9\x8b\x88\x30\xae\x8e\x65\xd2\x48\x63\xc6\x9d\x92\x1e\x57\x81"
- "\xee\x56\x00\x76\x41\xe6\x9b\x41\x7e\xa5\x5d\xc2\x33\xab\x8c\x52"
- "\x9e\x68\x78\xc8\x67\x55\x3d\x90\x00\xe5\xe9\x4a\xae\xa7\x36\x9c"
- "\xd3\x0d\x32\x4c\xef\xd8\xf0\xc0\x04\x49\x86\x58\x27\x9c\x93\x9d"
- "\x2f\xcc\xcd\x9f\xb2\x87\x61\x68\x4a\xb6\xd4\x66\x5f\xf2\xcc\x7f"
- "\x97\x44\xe6\xdf\x41\x62\x78\xcd\x58\x03\x1d\x76\xe3\x0e\x1c\x6f"
- "\x9e\xd9\x4a\x08\xae\x8f\x1f\xf7\xca\xa7\xd4\x62\x73\x11\x5e\x3b"
- "\xd6\x80\xcf\x27\x5c\x2f\xdf\x3e\x2a\xee\x25\x90\x17\xf8\xfb\x2c"
- "\x07\xd1\x59\x32\x6d\x6c\x8f\x34\xf2\x35\x71\x2d\x07\x0e\x07\x5e"
- "\x07\x9f\xaa\xce\xfa\x9a\xe0\xfe\xa5\x70\xdd\xfe\x88\x33\xaa\xa9"
- "\x23\x66\xa7\x93\xec\xc0\x78\xf4\x01\xb6\xf6\x0d\xc4\x17\xc0\xf9"
- "\x1c\xce\xc5\xb3\xd8\x20\x3e\xc9\xdf\x1f\xd8\x7e\xce\xaa\xa9\x91"
- "\xbe\x38\x12\xdb\xcd\xe3\x38\xb4\xd8\xe6\x38\x6c\xb3\xdd\x41\x70"
- "\x2c\x7f\xe6\x52\x5c\x87\xf4\x02\xe1\xf3\xc7\x1a\xb0\xcd\x10\xeb"
- "\x14\x05\x3e\xa6\x3f\xb5\xa8\xaf\x7b\x53\x90\x37\xff\xf2\x8d\x3b"
- "\x78\x8d\xb9\x08\xef\x8d\x75\xc0\x77\x73\x66\x42\x8f\x1a\xe5\x8e"
- "\xf2\xb7\x38\x5c\xb8\x3f\xa7\xac\x0e\xce\x00\xeb\xf0\xa0\xef\xf6"
- "\xdf\x41\x22\xf3\xde\x65\x7a\x77\xbd\x2c\xca\x20\x19\x9f\x93\x99"
- "\x8b\x70\x7d\xfc\x99\x58\x07\xdb\x39\x32\xe3\x1c\x11\xf4\x6f\x31"
- "\xb4\x12\xd7\xb0\xdb\x47\xe1\xdc\x0b\xd4\x7f\xa6\x13\xf4\x7f\xd1"
- "\x81\x6b\x87\xd8\x2c\xd9\x9d\x04\xe3\x17\x67\xbb\x81\xeb\xad\xff"
- "\x87\x46\xcc\xce\x08\x54\xff\x0f\x0e\x92\xfe\x1f\xba\x02\xda\xff"
- "\xf3\x20\xda\xff\xd0\x20\xb5\xff\xe7\x57\x40\xfb\xa7\x05\xd1\xfe"
- "\x9f\x0f\x52\xfb\xa7\xf9\x6c\xff\x03\x37\xf0\x54\x98\x93\x13\xba"
- "\x2f\x1b\x7d\x00\xf3\x57\x0f\xab\x70\xfe\x8d\xf0\x2e\x96\xf8\x9b"
- "\xb0\x77\xb3\x42\x3c\x7e\x6b\x3c\x7e\xeb\x3c\x7e\x87\x7b\xfc\x8e"
- "\xf0\xf8\x1d\x29\xfd\x06\x3f\x32\xfc\xbc\x6a\xda\x52\x88\x4b\xb3"
- "\xad\xaa\x87\x35\xe2\xf9\x28\x5c\x5b\x07\x7c\x7a\x94\xaf\x7d\xfa"
- "\xb4\x2a\x42\xbb\x39\x4a\x84\xfd\xf3\x54\x0f\x67\x77\x19\x09\xa5"
- "\xc3\x46\x1b\x70\x8f\x33\x3e\x6f\xe3\xd4\x99\xc0\xd3\x16\x9b\x03"
- "\xe2\xfc\x88\xab\xa0\xec\xef\xe3\xde\x8d\xa8\x57\xfd\x32\x9c\x5f"
- "\xf3\xf0\x62\x6c\xe7\x1d\x69\x66\xc2\x0f\xbb\x5d\x98\xdf\xc0\xe7"
- "\x6f\x9c\x6a\x1b\x76\xfb\x68\xba\xed\xa0\x3e\xdf\xc8\x87\x58\x5a"
- "\x4f\x92\x02\x8e\xd7\xaf\x59\x03\xfa\x6d\xdd\x4b\x56\xb7\xd2\x96"
- "\x35\x4e\xea\xb0\xcc\x31\x93\x2c\x1b\xee\x7d\x52\x4d\xea\x6c\x27"
- "\x85\xfd\x4f\x84\x7d\x5e\x6c\x7b\x09\xc6\x3f\x59\x98\x07\xd2\xea"
- "\x6c\xbb\x48\x2d\xfc\x36\xa7\x7e\x0e\xed\x7c\x64\x8c\xa5\x75\x17"
- "\xf4\x97\x36\xc6\xf2\x9a\x8d\x51\x54\xb3\xd1\x50\xdb\x8a\xfb\xbb"
- "\x6e\x1c\x87\x75\xad\x83\x7a\x58\x9c\x26\xec\x67\x8d\x13\xca\xb5"
- "\xd7\x0b\x7d\x52\x7c\x6e\xcb\x6b\x21\xbf\x76\xa3\x01\xeb\x87\x75"
- "\xf3\xfe\x1c\x76\xdf\x5e\xa8\xfb\xbd\xb3\x0d\x6a\x82\xef\x4f\x04"
- "\x86\x91\x47\x62\x7d\xc6\xd1\x79\xa6\x09\xac\xdc\x90\x60\xca\xf5"
- "\xc9\xff\x50\xae\x58\x5f\x5d\x30\xe5\xda\x7c\x97\x5b\x21\xd6\x57"
- "\x1f\x44\xb9\x8f\x4e\xeb\xa3\x5c\xb1\xbe\xb1\xc1\x94\xbb\xc3\x77"
- "\xb9\x95\x62\x7d\xb3\x83\x29\xd7\xe1\xbb\xdc\x7d\x7b\x83\xc3\xc2"
- "\x74\x9f\xeb\x3f\x20\x16\x82\xc3\xc1\xf4\x3e\xda\x6f\xda\x1b\x1c"
- "\x06\xa6\xdb\xfb\xc2\x40\x70\xfa\x9f\xd1\xa7\xfe\x83\xd3\xfd\x8c"
- "\xe2\xbe\x74\x1f\x9c\xde\x67\xf8\xc4\x3f\xf6\x0d\x40\xf7\x69\x34"
- "\xf4\xa0\x8e\x2f\xd8\x98\xc6\x87\xee\x5b\xf6\x32\x1f\x4b\x1e\x58"
- "\x4b\x48\x58\x11\xb9\xf6\x81\x92\x4f\x69\xac\xd0\xe7\x9e\x99\xb3"
- "\xb6\x98\x70\xd0\x87\xe6\x76\xaf\x6a\xe0\x2c\xce\x18\xe4\x2d\xd7"
- "\xce\x15\x0e\xd5\x2d\x90\x7e\x00\xfc\xa0\x1d\x62\x59\x56\xd6\xc6"
- "\xb4\x82\xcc\x58\x22\xbc\x5b\x07\xfd\x88\x99\x4b\x3f\xa5\xb8\x2e"
- "\x61\xdc\xd7\xc0\xaf\x45\xb8\xce\x21\xb9\x16\xae\x75\x02\x8e\xa1"
- "\x1c\x07\x79\x8f\xb7\xa9\x66\xda\x84\xbc\x36\x61\xbe\x7b\xc1\xbe"
- "\x65\xd8\x57\xa0\x59\x06\x5c\xb3\xcc\x06\xf7\xee\x1c\x66\x23\x5c"
- "\x29\xee\xbb\xb3\x61\xa6\xdd\xaa\x8a\x93\xde\x4f\x6d\x15\xd6\xd6"
- "\x83\xba\xe3\xda\x7a\x2f\x43\xbf\x01\xf3\xdf\x91\x46\x38\x5c\xff"
- "\xb8\x63\x43\x9c\x1e\xd7\xdb\xeb\xeb\x3d\x6f\x57\x9e\x39\x1e\xaf"
- "\xa7\x79\xe0\x9f\xcf\x11\xae\xce\x6e\x23\xd0\xc7\xa8\x2f\x80\xfe"
- "\xc9\x83\xb7\xe1\x78\x4a\x1b\xc9\x5c\x4b\x79\x1c\xdb\xa2\x9a\xfd"
- "\x21\x38\xff\x50\x58\x0b\x5e\x15\x57\x85\x7d\x7d\x71\xbf\xa5\xd1"
- "\x67\xe1\xb7\xd0\x47\xc2\x79\x38\x9a\x0d\x0e\x5a\xa0\x8d\xad\xb3"
- "\xb7\x09\x7b\x7d\x34\xa9\xe2\xde\xc7\x75\xcf\xda\x35\xe6\x59\x76"
- "\x8d\x39\x01\xea\x65\x92\xda\x80\xf7\x97\xd2\xb1\x4f\x88\xf9\xe0"
- "\x7c\x83\xf4\xde\xb7\x8f\x3d\x89\x47\xc5\x45\x50\x1b\xca\x97\xd5"
- "\xe5\xb1\xc9\xa8\x03\x88\x43\xa6\xd9\xb3\x0c\x63\xd9\x18\xc9\xac"
- "\x24\xec\x6b\x43\xbd\xd9\xfb\x9a\xf9\x1b\x27\x08\xef\xf8\x83\x3f"
- "\x98\x6d\xe0\x02\x8c\x89\x67\x45\x63\xdb\xcc\x63\xd1\xff\x3e\x76"
- "\x2b\x94\xff\xdf\x4d\xaa\x59\xec\xdd\xcd\xbc\x8d\xd3\xd8\xbb\x9b"
- "\xb3\xa2\xe0\x1e\xd3\x68\xde\x06\x1b\xe6\x83\xf3\xe5\xe2\xf9\x59"
- "\xb2\xf3\xb3\x70\x3e\xaa\x78\xbe\x5a\x3c\x1f\x2f\x3b\x1f\x9f\x36"
- "\x16\xc7\x3d\x66\xd9\xb0\x0d\xe0\xf3\xa2\xe1\xfc\x54\x61\x7d\x04"
- "\x61\x2f\xc8\x8d\xd1\x62\xbe\xa9\xad\xaa\xc7\x46\xb4\x03\xc6\xe0"
- "\xfc\x74\xd9\xf5\xd3\x3f\xca\x88\x26\x0f\x94\xa0\x0c\x1f\x8b\xb4"
- "\x72\x1f\x4e\x63\x7d\xe5\x59\x82\xbf\x46\x1f\x2a\x2f\x0f\xd2\x5b"
- "\xd0\x4f\xda\x21\x46\x83\xef\x3a\xbc\xa7\x5c\xde\xd2\x1b\xa4\xfa"
- "\xa4\xc5\xf3\xf4\xf3\x97\xbc\x98\x8a\x6f\x00\x2a\xdf\x6d\xd3\xe1"
- "\x3b\xb2\x7c\x5e\x55\x8c\xa5\x08\xdf\xd9\xd3\x09\xef\x87\x6f\xc5"
- "\x39\x5a\xa1\x07\xd2\x5c\x05\x07\x08\x1f\xba\x5f\x6f\x5e\x35\x85"
- "\x9c\x57\x3d\x26\x3c\x3f\xb0\xe8\x09\xc9\x83\xf3\xe6\x55\x47\x31"
- "\xed\x80\x90\x96\xc4\xde\x5b\xd7\xaf\x0a\x21\x87\xf4\x6d\xc2\x98"
- "\x02\x9c\xeb\x14\xc6\x4f\x2e\x10\xce\x69\x0c\x21\x7f\xce\xac\xe7"
- "\xaa\x78\x2b\xf7\x67\xbe\x41\x98\x0b\xfd\x51\x44\x35\xb9\x33\x23"
- "\x04\xf7\x92\xe3\x3e\x84\x7e\x3a\x9e\xc7\x73\xd2\x3b\x44\xe7\x55"
- "\xbf\x78\x58\x98\x17\x7d\x33\xfb\x9e\x55\x44\x3f\xfb\x28\xc2\x26"
- "\xbe\x3b\xfe\x58\x09\xd6\x15\xe7\x39\x82\x1c\xdf\xc4\xfa\x59\x55"
- "\x8f\xed\x18\x56\x2c\xcc\x0f\xd7\x40\xfe\x7c\x3e\xbf\x2a\x06\xb9"
- "\xc1\xb9\xe1\xb1\x78\x6a\xd4\xec\xc4\xf7\x07\x8b\x5f\x93\xde\x95"
- "\xfd\x45\x86\xec\x7d\x3a\x4d\x3b\x47\xee\x83\xb4\x3c\x69\x6d\x0c"
- "\xdc\xa3\xc8\x17\xd7\x38\x20\x7e\xec\x8c\x34\x26\xf0\x9a\x2a\xd0"
- "\x45\x55\x4c\xf5\x54\x82\x63\x3a\x2a\x9c\x97\xdc\xaa\x8a\x5f\x4f"
- "\xb5\x55\x86\x4c\xb4\xe9\x82\xfd\xfa\xdf\xe3\x9c\x43\x90\xe3\x2e"
- "\x9c\x63\x08\xb2\x7c\x07\x7e\x1f\x9d\x56\x4e\xf4\xbf\xc0\x78\xec"
- "\x17\xae\x47\x93\xa8\xf3\xf6\x59\x66\x52\xd3\xfc\x27\x72\xec\x64"
- "\x35\xd1\xcc\x21\xc3\xb2\xac\xd4\x25\xb4\x31\x9d\x70\x71\x56\x32"
- "\x0c\xd7\x6d\xc2\xb5\xda\xf1\x1d\x8d\x3a\x47\x2d\xc4\x48\x5b\xa2"
- "\x76\x67\xb6\x0c\xd7\xcf\x24\x10\x5b\xb1\xe7\xd7\xc2\xfb\x47\x36"
- "\xe1\xfd\x6f\x2d\x8e\xa5\xcb\xde\x3b\xda\xba\x26\x91\xf2\x6b\xcf"
- "\x91\x90\xda\xe4\xd3\x24\x2e\x71\x18\x15\xde\x3b\xca\x80\x8c\x36"
- "\xd0\xfd\x4a\x36\x4f\x70\xdb\x45\x12\x5e\x97\x6e\x25\x96\xd6\x6a"
- "\xf2\xc6\x32\x12\x4e\x3b\x92\x47\xd4\x54\x1f\x25\xb4\xe0\x26\xdb"
- "\x7b\x99\xe6\xe1\x2e\x0d\x9b\xbb\x15\xb6\x4e\x85\x63\xa7\xa1\x79"
- "\x38\x87\xeb\x22\x89\x9e\xfb\x79\xb6\x30\xde\x8b\x63\xeb\xce\x0e"
- "\x83\xbe\xbb\xc3\x70\x73\xd7\x4a\xc3\x58\x69\x4c\xfe\xe9\x73\x3a"
- "\x7c\x06\x91\x40\x37\x4c\xb5\xe2\x3b\x4b\x18\x8b\x3a\xb5\xb7\x38"
- "\x70\xfc\x5d\x58\x87\x66\xa5\x21\x92\x9f\x6f\x20\x77\xda\x84\x77"
- "\xa2\xf0\x99\x80\xae\xf4\x59\xac\x6b\x1b\x11\xe6\x21\x69\xd9\x3c"
- "\x24\x07\x3e\x0f\xd7\x98\xcb\x67\x2c\xd4\x93\xae\x31\xc6\x04\x4b"
- "\xc6\xef\x49\x56\x27\xfd\x4c\xe8\x23\x64\x00\x6e\x37\xfc\x62\x27"
- "\xd5\x9a\xcb\x0f\x1b\x4e\xa1\x6f\x89\x09\x9c\x1f\xe2\x85\x77\xa5"
- "\x51\x36\xa0\xa7\xb4\x5d\x6d\xa8\xb7\xfd\xfa\x3f\x2c\xb3\x71\x8f"
- "\x34\x53\x67\x6d\xd2\xef\xc9\xb1\x86\x7a\x85\x7e\x04\x7d\x42\x3e"
- "\xd4\x13\xea\x08\x75\xe5\xd6\xd3\x29\x41\x4f\xbb\x78\xa6\xa7\x2e"
- "\xcd\xbe\x34\x49\x57\x8e\x62\x63\xb2\x3f\xfa\xaa\x69\xf6\xae\x2f"
- "\x90\x73\x8f\xbe\xb6\xb7\x91\x70\x4b\x2b\xc4\xcd\xa0\xaf\x47\x1e"
- "\x23\xe4\x91\x77\x28\x5f\x3b\xed\x44\x8f\xde\x9c\x79\x3e\xf4\xf6"
- "\x85\x5b\x6f\xa0\xff\x3e\xf4\xf6\x60\x52\x20\x7a\xab\x69\x66\x7a"
- "\x73\x8a\xf3\xc7\x0c\x87\x08\xe7\x58\x69\xe0\x8a\x2e\x92\x18\xd4"
- "\xdf\xf4\xcf\xf5\xe4\x70\x7c\x2d\xe8\xec\x4f\x0a\xfd\xf1\xf9\xe6"
- "\x69\xa0\x83\xe9\xa8\xc3\xe0\xec\xee\x57\x4e\xff\xed\xee\xf1\x17"
- "\x87\xec\x6e\xb0\xec\xee\xf1\xc8\x81\xd9\xdd\xaf\xaa\x87\xec\xee"
- "\x9b\xb6\xbb\x5f\x1d\xf2\xb4\xbb\x9e\xb8\x61\xd9\x82\xc5\xf3\x16"
- "\xa6\x2e\x4c\x7d\x5e\xff\xec\x4b\xe9\x0b\x96\xb3\xe8\x41\x11\x3f"
- "\x44\xb8\x32\x63\x39\xdc\xbb\xbd\xa6\xa8\x9e\xbc\x37\xba\x9e\x73"
- "\xfd\x3b\x42\x4d\xf3\x26\xc6\xf2\x79\x13\xcd\xb8\x8f\x3b\xda\x27"
- "\xee\xef\x7e\x46\xf5\x4c\x36\xae\x69\xc8\xd6\x83\x79\x46\x78\x8e"
- "\x05\x71\x6a\x0b\x3e\x0b\x7a\xb9\x0b\x8e\x55\x44\x1d\xe6\x20\x21"
- "\xe6\xb1\x78\xfe\xe9\xd3\xb8\xfe\x1a\x2d\x31\xb6\x94\xe2\xbe\xeb"
- "\x5d\x44\x6d\xd7\x6c\xb0\xad\x87\xf2\x6c\xda\xaa\x18\xb5\x1e\xdf"
- "\x6d\x79\x72\x12\xf8\xfc\x14\xf7\x3a\x4b\x4f\xef\xa0\x57\x3d\x91"
- "\x87\xdc\x80\xef\x22\x9e\x57\x3d\xb9\xb4\x13\x9f\xa5\x40\x3c\x3d"
- "\xfb\x36\xb8\xd7\x18\x63\xb2\xb0\x86\x04\xf0\x04\x3b\x3f\x47\x78"
- "\xbe\xd6\x99\xb7\x5f\x8f\x31\x47\xbb\xe6\x40\x5a\x7b\xde\x01\x72"
- "\x74\x4d\x91\xc8\x13\x4f\x96\x3c\x52\xc4\x78\xa2\x36\x02\x70\x38"
- "\x1d\x70\x98\xd0\x1f\x4f\xc8\xf0\x37\x36\x30\x9e\x40\xbc\x21\xee"
- "\x10\x73\xd7\x00\xe6\x10\x87\x12\xee\xb6\x88\xb8\x0b\x6b\x24\x3a"
- "\x01\x7b\x4e\x86\x3d\x7c\x67\xbb\x36\xc3\x8d\x3b\x97\x27\xee\x2e"
- "\x7a\xe0\x8e\x13\x71\xb7\x52\x89\xbb\xa7\x4e\xeb\xc8\x1b\x8c\x2f"
- "\xdc\xb8\xcb\xbf\xc5\x21\x61\x0e\xf1\x87\x58\xe3\x9f\x37\x90\xda"
- "\xd6\xb6\x1e\xfc\x95\x3e\xc7\x9e\xe7\x0a\xf3\x85\x39\xba\xa7\x73"
- "\xa5\xc8\x17\xe7\x24\xbe\xd8\xee\xc3\x4f\x9f\x0e\x92\x2f\x9e\x62"
- "\xeb\x9f\x81\xae\xba\x40\x6f\xa8\xaf\x47\x22\x80\x27\x22\xde\x22"
- "\xc7\xe2\xaf\x10\xfd\x2c\x1b\x1c\xfd\xe0\xfe\xd7\x50\x17\x2f\x3a"
- "\x7a\x20\xa5\x3f\x1d\xa1\x7e\x50\x4f\x82\x7e\x40\x4f\xd2\x33\x77"
- "\x7c\x06\x8b\xba\x42\xfd\xdc\xb1\x86\x70\xa8\xaf\xd2\x15\x8c\x23"
- "\x90\x0b\x84\x39\xde\x1e\x1c\x0f\x32\xb7\xa3\xce\x84\x7e\xb6\x51"
- "\x9b\xb2\x75\x94\x7b\xbf\x9c\x8e\x0d\x4f\x9b\x7b\xc7\xd1\x4f\x9f"
- "\x74\xaf\x31\xf7\xa4\x30\xbe\x60\x1e\x8d\xeb\x83\x3f\xc9\xd6\x3b"
- "\xc9\xdb\xdf\xc2\x62\xf8\xb9\x3f\x16\x39\xa0\x1e\xfb\xae\x42\x3f"
- "\xd5\x05\xfd\x54\x0d\xf4\x53\xf3\xa0\x9f\x8a\xe3\x88\xc2\x5a\x0c"
- "\xcf\x8c\x67\xcf\xf8\xa0\x5f\xaa\xdd\x1f\x42\xf3\x37\x38\x50\xae"
- "\xc2\xf3\x64\xad\x19\xf7\x72\x69\xa5\xf9\xd0\x07\x7e\x8b\x23\xf0"
- "\x3b\xe1\xb0\xc1\x15\x20\xa6\x9e\x11\xf7\x53\xb3\xeb\xd8\x3a\x85"
- "\x73\x23\x59\xfd\x9e\x10\xe6\x39\x0a\xcf\x1a\x39\x7e\x87\xeb\x65"
- "\xe5\xb3\x46\xf9\xb3\xe8\xf7\x32\x6d\xe2\x73\xc6\x67\x7a\xd6\x41"
- "\x40\x1e\xdc\x0d\x7d\x1a\xf7\xb3\xc6\x13\xd8\xe6\xe1\xca\x67\x8d"
- "\xcf\x08\x6b\xf3\x59\x55\x73\xa3\x71\x7e\x0d\xfc\x6e\x65\xe9\x4f"
- "\xd8\xe5\xe9\xee\x67\xf9\x2c\x1d\xdf\xe9\x12\xc7\x0a\x5a\xd9\x38"
- "\xc1\xdc\x69\x52\x7f\xdc\x47\xfc\x14\x00\x4f\x27\x4d\x72\xf3\x74"
- "\x12\xdb\xb7\x21\xe2\x60\x44\x6d\x2f\x9e\xc6\x35\xbe\xe6\x6f\x9b"
- "\x89\x3c\x9d\xb7\x5f\x27\xea\xf4\x14\xc8\x64\x18\xee\x79\x87\xe9"
- "\xf8\xee\x13\xf2\x75\x09\x5c\x57\x22\x70\xf8\xc1\x90\xf5\xc2\x9c"
- "\x82\xb9\x0e\x25\x77\xcf\x9f\xa3\xe4\xee\xc4\xf1\x7d\x73\xf7\xbc"
- "\x2f\xfa\xe6\xee\xc4\x27\x86\xb8\x7b\xb0\xb9\x5b\x8a\xf5\x82\xe5"
- "\xee\x79\x7b\x87\xb8\xfb\x72\x73\xf7\xbc\x3d\x32\xee\xfe\x95\x92"
- "\xbb\xe7\xaf\xe9\xcd\xdd\xf3\x0b\xdd\xdc\x9d\xa8\x76\x73\xf7\xdc"
- "\x2a\x25\x77\x27\x9d\xf3\x8f\xbb\xe7\x7f\x71\x69\xb9\x3b\x29\x44"
- "\xc9\xdd\x49\xe2\xba\xa4\x73\x4b\x02\xe7\xee\xa4\x8a\xbe\xb9\x3b"
- "\xe9\x80\x92\xbb\x93\xb6\x32\x8e\x4e\x6a\x65\xdc\x9d\x54\xce\xd2"
- "\xe7\x16\xcb\xd3\xdd\xdc\xcd\xd2\x7b\x73\xf7\x02\x75\x3f\xdc\x6d"
- "\x70\xf1\x12\x77\x37\x00\x77\x37\x70\xfc\xf3\xbe\xb8\x7b\x51\x52"
- "\x2d\x72\xf7\x32\xe4\xee\x45\x49\x7d\x73\xf7\xa2\xc7\x90\xa3\x01"
- "\xc7\xa4\xf8\x75\xda\x82\x6b\x56\x9a\x9f\xfb\x27\x8e\x61\x37\x23"
- "\x6e\xcf\xa8\x16\xbe\x33\x73\x8d\x9c\xdb\x17\xfc\xb1\x87\xdb\x21"
- "\x9d\xbf\x41\xc9\xed\xc8\xeb\xc8\xef\x25\xaf\x53\x6b\xe9\xeb\xb8"
- "\x87\xc9\x82\x46\x89\xe3\xf3\x21\x0d\xf7\x29\xc1\x35\x95\x4a\x2e"
- "\x0a\x87\x1a\x64\xd0\xfc\x32\xdc\x17\xaf\xe9\xd8\xf0\x5c\x88\xd2"
- "\x1f\x2c\x4c\x71\x6e\x90\xfb\x83\xe7\x26\xa3\x3f\xc8\x63\xeb\x00"
- "\x08\x7e\xc0\x59\x62\x4c\x46\xdf\xc0\xce\x3f\xdf\xd9\xb7\x3f\x78"
- "\x6e\xe1\x37\xe5\x0f\x90\x6b\xae\x91\xf5\x21\x7d\xf9\x03\x1c\x53"
- "\xad\x4d\xba\x3c\xfe\x00\x79\x06\xf9\x05\xb9\x06\x79\x07\x79\x06"
- "\x39\xc7\x29\xbe\xfb\x57\x6c\xf4\xc3\x1f\x00\xaf\xd0\xab\x1e\x8f"
- "\x14\xfc\x81\x2a\x18\x7f\xf0\xfc\xa1\x6f\x95\x3f\x40\xfd\xac\xb9"
- "\xb4\xfe\x40\xea\xe7\xa3\x7e\x50\x57\x92\x8e\xa4\xbe\x3e\xea\x07"
- "\xf5\x84\xfa\xc1\xd8\x48\xf2\x07\xe3\x33\x98\x3f\x28\xe9\xd7\x1f"
- "\x3c\x6f\xee\xf1\x07\x1c\xf3\x07\xc2\x98\xf8\x28\xf4\x07\x0b\xf3"
- "\x7a\xfb\x83\x85\x3b\xdc\xfe\xe0\xb9\x70\x91\x1f\x9b\x71\x7d\x0b"
- "\xe0\x83\x22\xa5\x4f\x78\xe1\x3a\xff\x7c\xc2\x42\x57\x2f\x9f\x00"
- "\xb2\xcd\x63\xcf\xce\xd0\x1f\xcc\x42\x7f\xe0\x44\xbf\x10\x94\x4f"
- "\x58\x14\xe9\xf6\x5b\x0b\x32\x18\x17\x2f\x34\x29\xfd\xc4\x0b\xe2"
- "\x73\x84\x05\x4f\xc8\xfd\x04\x3f\xcc\x1f\x3f\xb1\x48\xda\xe7\xc8"
- "\x8e\x3c\xbc\x1b\x9f\x59\xf4\xf8\x09\x81\x57\xbf\x30\xaf\x68\x92"
- "\xf9\x89\x45\x55\xac\x0e\x2f\x84\xbb\x04\x3f\xb1\xa8\x9e\xa5\x2f"
- "\x48\x90\xa7\xbb\xfd\x04\x4b\x77\xc9\xfd\x44\x0b\xfa\x89\x17\xc6"
- "\xf5\xe3\x27\x26\xf8\xef\x27\x96\xaa\xdd\x7e\x62\xa9\xba\x6f\x3f"
- "\x91\xf6\x35\xfa\x09\x61\x4d\x5e\xd0\x3d\xe0\x5c\x5d\x70\x3d\xf3"
- "\x11\x38\x46\x03\xbe\xc3\x8a\xeb\xaa\x40\xbe\xd3\x65\xe8\x47\xe0"
- "\x80\xf3\x2d\x79\xf8\x9d\x17\xae\x69\x0c\xb3\x91\x10\xf4\x19\x79"
- "\x67\x88\x1a\xf7\x87\x62\x72\x4a\xbb\x07\xae\x6d\x70\xfb\x97\x94"
- "\x6b\xfd\xf4\x2f\x27\xc1\xbf\xd4\x77\x6c\x48\x99\x24\xf3\x2f\xb8"
- "\xc7\x56\xbd\x87\x7f\xb1\x82\x7f\x69\x96\xae\x81\xfc\x29\xf2\xfc"
- "\x58\x3f\x21\xff\x19\xe1\xc0\xfc\x0d\x2f\xe3\x7e\x71\x82\x3f\x4a"
- "\x29\x52\xfa\xa3\x25\x4e\x5e\xd1\x3f\x49\xa9\x95\xfc\x11\xfa\x73"
- "\xbe\x97\x3f\x4a\xdd\xd4\xe3\x8f\xae\x97\xf9\xa3\x0c\xc9\x1f\xa5"
- "\x74\x5e\xf1\xfd\x93\x01\xf0\xdd\xa5\xf6\x47\x3c\xf8\x1d\x4f\x7f"
- "\x84\x3e\x4a\xea\x9f\xf0\x41\xf9\xa3\xd4\xf8\x6f\x95\x3f\xba\x0c"
- "\xfd\x13\x4f\xdd\x48\x3a\x43\xfd\xa0\x6e\x50\x2f\xb8\x2e\x38\xea"
- "\x0c\xf5\x85\xba\x1a\x9f\xa6\xf4\x45\x82\xbe\xc0\x1f\xf5\x7a\x76"
- "\x00\xba\x02\x99\xcf\x42\x7d\xc9\xfd\x51\xe9\x28\xc9\x1f\xa5\x45"
- "\xf6\xf6\x47\x69\xd1\x6e\x7f\x94\x22\xec\xb7\xcc\xd6\x65\x7c\xc1"
- "\xa1\xf4\x45\x4b\xff\xe2\x9f\x2f\x4a\xdb\xe4\xc5\x17\x09\xeb\x6b"
- "\xe6\xbd\xae\xe8\x9b\xcc\x02\x7f\x14\x84\x2f\x4a\x2b\x67\x75\xc4"
- "\x79\xe6\x2f\x54\x33\xbe\x4f\x9b\xea\xf6\x4f\x2f\xec\x90\xa7\xb9"
- "\xfd\xd3\xd2\x1d\xa2\x4f\x5d\x17\xb8\x7f\x5a\x2a\x5c\x83\x73\xd0"
- "\x77\xb7\x31\x1f\xa0\xf4\x4f\x4b\x37\x29\xfd\xd3\xd2\x39\xac\x0e"
- "\x4b\xf7\x32\xff\xb4\x34\x8d\xa5\xbf\x90\x2d\x4f\x77\xfb\x27\x96"
- "\xde\xdb\x3f\x2d\xad\xe9\xc7\x3f\x69\xba\x8b\x8d\xc9\x5d\x79\x07"
- "\x66\x39\x77\x6e\x21\xe3\xe6\xdc\xe4\xf2\xb4\x27\x66\x47\x2e\xb6"
- "\x57\x91\xf4\xbc\xed\x71\x42\xba\x35\xfb\xd2\x78\xf1\x5d\xed\xae"
- "\x48\x63\xc2\x99\x14\xb0\xa9\x56\xdf\x36\x05\xf6\x14\x22\xd9\x53"
- "\x6d\xf2\xe7\x04\x6c\x8c\xc3\xe7\x6d\xdb\xc1\x96\x2c\xf6\x06\xc1"
- "\xb6\x34\xcd\x7a\x82\x6b\x6e\x6a\x5b\x89\x4e\xab\x52\x5d\xf5\x28"
- "\x44\x02\x2e\xb0\xab\x07\x6f\xa3\xfc\xed\x8d\x7a\xa2\x4d\x26\xa1"
- "\x68\x5b\xef\x8a\xcf\x73\x70\x9d\x0d\x7c\x8e\x03\xb8\x8e\x9e\x7b"
- "\x9c\xd9\xd4\x76\x38\xba\x98\x4d\x8d\xed\xea\x30\xdc\xec\xeb\x39"
- "\x8e\x25\xc3\x2a\x3c\xc7\xc1\xf7\xa0\xf0\xfd\x33\x1e\x6d\x08\x9f"
- "\xe3\x38\x58\x6c\x07\xf5\xd5\x95\x09\xcf\x71\x9a\x14\xcf\x71\x7e"
- "\xd4\x48\x38\x5c\x83\xe3\x0d\xf9\x73\x1c\x43\x6d\xaf\xb8\x0e\xed"
- "\x0b\xed\x29\x70\xce\x5b\xee\x73\xfe\x97\x30\x77\x02\x64\xed\xd2"
- "\x1c\x98\x45\xb7\x1f\x8c\xfd\x43\x93\x43\x85\x6b\x9d\xba\x40\x77"
- "\x3c\x70\x1b\xd5\x78\x70\x5b\xb7\xa8\x87\x6e\xa6\x07\xd0\x61\xc8"
- "\x33\x76\x42\xe7\x3a\xc1\x7e\xba\xc5\xf5\x4e\x1d\x56\xc0\xa1\x61"
- "\x54\xc9\x2a\x94\x7b\x04\x29\x11\xd7\x3c\xe5\x57\x27\x8f\xe0\x41"
- "\xd6\xd4\xc8\x91\xdd\x17\x1d\xc2\x73\xcf\xbc\x2e\x32\x0e\xb8\x4c"
- "\x8b\x5c\x06\xd8\x1d\x59\xd6\x05\x72\xff\x8c\xc9\x1d\xd7\xd4\xc3"
- "\x4f\xe7\x6a\x83\x1e\xca\xbe\xb9\xbb\x1b\xb8\xcc\xc1\x64\xff\xcc"
- "\x52\x1d\x11\xd6\x49\xc5\x67\x9f\x10\x37\xd4\x81\xbe\x05\x2e\xb3"
- "\x87\x51\xdc\x3f\x84\xff\xb7\x01\xd7\x17\x8b\xbc\xd3\x8e\x7b\xc5"
- "\x18\x10\x1b\xba\xd2\x33\xf8\xec\xf3\x9f\x8a\x67\x9f\xb6\xd5\xee"
- "\x67\x9f\x75\xe5\xa7\xd8\x5c\x15\xc5\x78\xd8\x52\x6b\x77\x09\xf3"
- "\x39\xc2\x78\x58\x7a\xa0\xb2\x4f\xf7\xb9\xfe\xcf\xa5\x97\xbd\xee"
- "\x5b\x2e\xfb\xe5\x85\x03\x93\xfd\x0a\x9f\xf3\x7f\x2f\xbd\xec\x43"
- "\xbe\xe5\xb2\x7f\x51\x33\x30\xd9\xaf\xec\x6b\x0f\x11\x0d\xf6\x61"
- "\xa4\xfe\x8b\xd4\x77\x41\x1f\xc6\xfc\xf5\xaa\x59\xee\x7e\xcb\xaa"
- "\x59\xd2\x33\x64\x90\x99\x3a\x1f\xd7\x07\x07\x59\xa4\x3d\x87\x7b"
- "\x70\xbc\x74\x58\x7a\x7e\x5c\x88\xfb\xcc\xa0\x1e\xb7\x83\x1e\x53"
- "\xf1\x3d\x26\x51\x87\xe0\x73\xe6\xda\xc1\x2f\x8c\x31\x26\xbb\xf2"
- "\xc1\x27\xbd\xbd\x85\xf8\xd0\x27\x87\xfe\x44\x9b\x4e\x74\xcf\xa4"
- "\xb9\xf5\xca\xaf\x06\x7d\x76\x41\x6c\xe6\x68\x21\xf8\x6e\x72\x58"
- "\x0b\xc4\xad\xdd\xc9\x23\xe6\x40\x1f\x40\xd2\xe9\xbb\x2b\x1c\x42"
- "\x5c\xe6\x55\xa7\xdb\x94\x3a\x6d\xf7\xa2\xd3\xa7\x17\x82\x9d\x72"
- "\x62\xec\x2c\xe8\xd4\xda\xa3\x53\xc1\x8f\xac\x36\x44\xa2\x5e\x25"
- "\x9d\xa2\x1f\x11\x74\xda\xca\xfc\x48\xcf\x3a\x4e\xab\xdd\xb1\x73"
- "\x4d\xe2\x69\x2f\x3a\x5d\x91\xa3\xd0\x69\x62\xa0\x3a\x7d\xa9\x50"
- "\x19\x7f\xad\x72\xf9\x17\x7f\xad\xd2\x62\x7c\x25\x8f\xbf\xf0\x77"
- "\x3b\xc4\x5b\x2e\xad\x39\xde\x1e\x54\xff\x7f\x55\xa4\x32\x96\x5a"
- "\x25\xd6\x29\xe3\x9e\xc0\x63\xa9\x55\xc2\x9e\x44\xbb\xb7\x7b\x8b"
- "\xa3\x56\x1d\x57\xc6\x51\xab\x76\xb2\x78\x69\x95\xb3\xdd\x88\x71"
- "\xd4\x2a\x13\x4b\xcf\x88\x91\xa7\xbb\xe3\x28\x96\xde\x8e\x6b\xdd"
- "\x6d\x58\x1d\x12\x58\xec\xf4\xfd\x6f\x38\x76\x8a\xe8\x23\x76\x8a"
- "\xf8\x8e\xc4\x4e\x6b\x7c\xee\x51\x35\xe4\xbf\xfb\xf3\x21\xab\x23"
- "\x07\xe6\x43\x32\xc9\x90\xff\x0e\x56\xf6\x6b\x6a\x06\x26\xfb\xac"
- "\x35\xc1\xfb\x6f\xa3\xce\xed\xbf\x8d\x3a\xdf\xfe\x7b\xdd\x2b\x43"
- "\xfe\x3b\x10\xff\x9d\x39\x6d\x60\xfe\x7b\xdd\x2c\xa5\xff\x36\xbe"
- "\xef\x9f\xff\x5e\x57\x3b\xf8\xfe\x7b\x5d\xa3\xd2\x7f\x1b\xcb\x59"
- "\x9d\xb2\x3a\x03\xf7\xdf\xc6\x4d\xbe\xfd\xb7\xf1\xd7\x4a\xff\x6d"
- "\x4c\x62\x7e\xda\x58\xc5\xfc\xb7\x31\x83\xa5\x67\x39\xe4\xe9\x6e"
- "\xff\xcd\xd2\x99\xff\x36\x56\x07\xe6\xbf\xc3\xbe\x61\xff\xad\xeb"
- "\xc3\x7f\xeb\xbe\x23\xfe\x7b\xfd\xd4\x21\x1f\x12\xac\x0f\x31\x36"
- "\x0e\xcc\x87\xbc\x62\x0e\xde\x87\xe4\xc4\xbb\x7d\x48\x4e\xbc\x6f"
- "\x1f\xb2\xf1\xc8\x90\x0f\x09\xc4\x87\xac\xcf\x1b\x98\x0f\xd9\xb8"
- "\x55\xe9\x43\x36\xa9\xfc\xf3\x21\x39\xd7\x0e\xbe\x0f\xc9\xd1\x2b"
- "\x7d\x48\x4e\x2b\xab\xd3\x86\xc9\x81\xfb\x90\x9c\x5a\xdf\x3e\x24"
- "\xe7\x94\xd2\x87\xe4\x94\x33\x5f\xb1\x89\x30\x1f\x92\x53\xc5\xd2"
- "\x37\x4c\x92\xa7\xbb\x7d\x08\x4b\x67\x3e\x64\x93\x26\x30\x1f\x72"
- "\xf5\x37\xec\x43\x42\xfa\xf0\x21\x21\xdf\x11\x1f\x92\x9b\x13\x3c"
- "\x8f\xe5\x47\xba\x79\x2c\x3f\xd2\x37\x8f\xe5\xfd\x7a\x88\xc7\x02"
- "\xe1\xb1\x4d\xfa\x81\xf1\x58\xde\x1c\x25\x8f\xe5\x1f\xf1\x8f\xc7"
- "\xf2\x3e\x19\x7c\x1e\xcb\x6b\x51\xf2\x58\xfe\x5e\x56\xa7\x57\x87"
- "\x07\xce\x63\xf9\xbf\xf1\xcd\x63\xf9\x25\x4a\x1e\xcb\x4f\x63\x7c"
- "\x95\x5f\xcd\x78\x2c\x7f\x3d\x4b\x7f\x55\x2d\x4f\x77\xf3\x18\x4b"
- "\x67\x3c\x96\x7f\xb2\x3f\x1e\x43\xbb\xa8\x8d\xf0\xb0\x8b\x17\x24"
- "\xbb\x28\x9c\x7a\xac\x58\xb2\x8b\x42\x21\x46\xe3\x8b\x8d\x2d\xaf"
- "\xae\x20\xea\x3c\xdc\x9f\x07\x38\x22\xed\x49\xb4\x8b\xcd\x15\x38"
- "\x4f\x44\xd3\x08\xbc\xd7\x2c\xf2\x60\x06\xf0\x60\x33\xfc\xc6\x35"
- "\xdb\xc6\x18\x5b\x90\xbf\x70\x3f\x0f\xfc\xcd\xf8\xd0\x36\x1c\xf7"
- "\x07\x12\x9e\xcd\xcb\xec\x46\xb0\x95\x76\xd1\x56\xda\x99\xad\x48"
- "\xef\xee\xad\x69\xa6\xbc\x6b\xb9\x61\x54\x5c\xd2\x30\x8a\xf6\x23"
- "\xbc\x13\x06\xf6\x43\x97\x1b\x42\x8b\x97\x81\xcd\xd8\x5a\x08\xae"
- "\xcb\x8f\x36\xa3\x5d\xa7\x0a\xa5\xed\xc9\x23\x80\x13\x19\xf7\xf1"
- "\xd5\xc3\x9d\xb8\xc6\xd6\x72\xe0\xbe\x36\xe0\xbe\x36\xb7\xad\xe0"
- "\xf3\xf6\xf6\xe5\x06\xbd\x7d\xb9\x61\x6c\x77\x3b\x70\x9f\xcd\xd3"
- "\x4e\x1e\x48\x29\x6b\x43\xee\x6b\x11\xec\x44\xe0\x3e\xb0\x0d\xbe"
- "\x1d\xb8\xef\x79\x91\xfb\xda\x0d\xc8\xf5\xba\xb2\xe7\x80\xfb\x12"
- "\xcf\x32\xee\x13\x63\xb8\x5b\x90\xfb\x96\x1b\xb8\x2d\x6d\x22\xf7"
- "\xcd\x43\xee\x3b\x0c\x36\x52\xa9\xe4\x3e\x6d\xb0\xdc\xb7\x79\xbd"
- "\xd2\x4e\x0a\xbf\xf6\xcf\x4e\x0a\x55\xbe\xec\xa4\x3b\x3f\x58\x3b"
- "\x29\xd4\x29\xed\xa4\xb0\x91\xd5\xa9\x60\x4c\xe0\x76\x52\xf8\x7e"
- "\x8f\x9d\xbc\xe0\x69\x27\x85\x87\x95\x76\x52\x58\xc4\xec\xa1\xd0"
- "\xc6\xec\xa4\x70\x17\x4b\x2f\x88\x94\xa7\xbb\xed\x84\xa5\x33\x3b"
- "\x29\x74\x0e\x3d\x2f\xff\xb6\xf9\xfb\xd7\x32\x86\x9e\x97\x07\xdb"
- "\x67\xfc\xb5\x6e\x60\x7d\xc6\x2d\x3e\xd7\xbf\x19\x1a\x6f\xef\x4f"
- "\xf6\xaf\x99\x07\x26\xfb\xdf\xa4\x0d\x8d\x95\x04\x2b\xfb\xad\x93"
- "\x06\x26\xfb\xd7\x5b\xfb\xeb\x63\xf8\x8e\xa5\xb6\x15\xd5\xf4\xf4"
- "\x31\xb6\x15\x49\xf3\x7c\x7b\xf7\x31\xb6\x69\x95\xef\xf1\xfd\x4f"
- "\x89\xe7\x7b\x7c\xfd\xf5\x3d\x9c\x43\x7d\x0f\xd0\xf5\x6f\x4c\x03"
- "\xeb\x7b\x14\x35\x28\x63\xaa\xed\x0f\xfa\x17\x53\x6d\x9b\xed\x2b"
- "\xa6\x72\x06\xdd\xf7\xd8\x96\xa4\x8c\xa9\xb6\x47\x8b\xd8\x58\x18"
- "\x78\x4c\xb5\xfd\x5a\xdf\x31\xd5\xf6\x1b\x94\x31\xd5\xb6\x56\x16"
- "\x3b\x6d\x9f\xca\x62\xaa\xed\xe2\xde\x85\xff\x93\x2c\x4f\x77\xc7"
- "\x54\x2c\x9d\xc5\x54\xdb\x67\x0d\x3d\x47\xff\xb6\xc5\x54\x6f\xd4"
- "\x0c\xf9\xf5\x60\x7d\xcb\xf6\xa4\x81\xf9\x96\x92\x6f\x70\xfe\xe7"
- "\xb7\xdd\xaf\x17\x87\x0f\x4c\xf6\xa5\x7d\xce\xff\xec\xdb\xaf\xbf"
- "\x99\xe6\xf6\xeb\x6f\xa6\xf9\xf6\xeb\x3b\x3e\x57\xfa\xf5\xb2\x17"
- "\x87\xfc\x7a\x30\x7e\xbd\xa4\x70\x60\x7e\x7d\xc7\x1e\xa5\x5f\x7f"
- "\x6b\x8c\x7f\x7e\xfd\xcd\xf1\x83\xef\xd7\xdf\x9c\xa4\xf4\xeb\x6f"
- "\x85\x88\xd8\xb8\x3f\x70\xbf\xfe\xe6\x17\xbe\xfd\xfa\x9b\x5f\x2b"
- "\xfd\xfa\x9b\x87\x98\xff\x7e\x2b\x92\xf9\xf5\x37\x1b\x58\x7a\x59"
- "\xac\x3c\xdd\xed\xd7\x59\x3a\xf3\xeb\x6f\x19\x86\x9e\xaf\x7f\xdb"
- "\xfc\xfa\x6f\x77\x0e\xf9\x96\x60\x7d\xcb\x5b\x03\xec\x33\xbe\xad"
- "\x0f\xde\xb7\xfc\xae\xc6\xed\x5b\x7e\x57\xe3\xdb\xb7\xfc\xee\x7e"
- "\xa5\x6f\x79\xfb\xf8\x90\x6f\x09\xc6\xb7\xfc\xb6\x75\x60\xbe\xe5"
- "\x77\x1a\xa5\x6f\x29\x7f\xc9\x3f\xdf\xf2\xbb\x4d\x83\xef\x5b\x7e"
- "\x57\xa4\xf4\x2d\xe5\x49\x22\x36\x4a\x02\xf7\x2d\xe5\x0f\xfa\xf6"
- "\x2d\xe5\x33\x94\xbe\xa5\x5c\xcf\x7c\x48\x79\x06\xf3\x2d\xe5\x13"
- "\x58\xfa\xdb\xc5\xf2\x74\xb7\x6f\x61\xe9\xcc\xb7\x94\xaf\x1f\x7a"
- "\xee\xfe\x6d\xf3\x2d\xbf\xef\x73\xfe\x6f\xdf\xfc\xb6\x6b\x97\x9b"
- "\xdf\x76\xed\xf2\xcd\x6f\xbb\x7e\xa0\xe4\xb7\xdf\xff\x71\x88\xdf"
- "\x82\xe1\xb7\xf2\xa2\x81\xf1\xdb\x1f\x5a\x95\xfc\xb6\xfb\x09\xff"
- "\xf8\x6d\xd7\xc2\xc1\xe7\xb7\x5d\x19\x4a\x7e\xdb\x3d\x55\xc4\xc6"
- "\xda\xc0\xf9\x6d\xf7\xad\xbe\xf9\x6d\xf7\x78\x25\xbf\xed\x26\x8c"
- "\xc7\x76\x27\x30\x7e\xdb\x1d\xce\xd2\x7f\xbf\x46\x9e\xee\xe6\x37"
- "\x96\xce\xf8\x6d\x77\xd2\xc0\x9e\xc7\xbf\xd7\xea\x7e\x1e\xff\x9e"
- "\xa0\x0b\xbe\xe8\x60\x44\xef\xe7\xf1\xef\xcd\x53\xae\x17\xb4\xfb"
- "\x73\xe1\xd9\x3c\xda\x8c\x9d\xad\xe9\xe0\xf5\x39\xfd\x0d\x07\x23"
- "\x86\x9e\xd3\x5f\xca\xe7\xf4\xef\x8d\x53\xda\xcf\x9e\x6d\xfe\xd9"
- "\xcf\x7b\xef\x0c\xfe\x73\xfa\xf7\x3c\xd6\x61\xd9\xb3\x5e\xc4\xca"
- "\xee\xc0\xed\x67\xcf\x02\xdf\xf6\xb3\x67\xb1\xd2\x7e\xf6\x88\x7d"
- "\xcc\x3d\x45\xcc\x7e\xf6\xc4\x8b\x76\xb5\x4b\x9e\xee\xb6\x1f\x96"
- "\xce\xec\x67\xcf\x4e\x7f\xe2\x03\xa7\xe6\x40\x3c\xfa\xfb\x71\x8d"
- "\x37\xb9\x7a\x70\x9e\x2e\xe2\xdc\x5b\x7c\xf0\x2c\xf3\x17\x42\x6c"
- "\xb0\x73\x8b\xba\xdf\xf8\xa0\x59\x8c\x0f\x92\x7a\xc7\x07\x52\x6c"
- "\x50\x0c\xf8\xde\xee\xd7\x33\x7a\x11\xef\x18\x1b\x5c\x0c\x34\x36"
- "\x78\xc8\x1d\x1b\xe4\x7b\xc4\x06\xcf\x7b\xc4\x06\x02\xde\x9b\x14"
- "\x78\xef\x15\x1b\xf4\xe0\x7d\xb0\x62\x83\x3f\xf9\xdc\xff\x69\xe8"
- "\x19\x7d\x7f\xfd\xce\x3d\xa6\x81\xf5\x3b\xff\xec\x73\xff\xa3\xa1"
- "\xb1\xfc\xfe\x64\xff\xa7\x01\x8e\xe5\xff\x25\x7c\x68\xbc\x25\x58"
- "\xd9\xff\x79\x80\x6b\x39\xfc\xbf\xc2\xe0\xfb\x23\x15\x73\xdc\xfd"
- "\x91\x8a\x39\x52\x7c\x85\xbc\x2b\xac\x99\x05\x5c\x9b\xbf\x0c\x8e"
- "\x8b\x84\xbc\xba\x4c\xd8\xf3\x20\xc4\xd2\x7c\x0a\xf7\x80\x83\x98"
- "\xcb\x74\x3c\x2e\x43\x1e\x73\xed\x9b\x2d\xc5\x5b\x71\x18\x8b\x41"
- "\x6c\x85\x71\x95\xd4\x07\x29\x6c\xeb\x67\xfe\xf0\xad\x5b\xd4\xd8"
- "\x67\xe9\xd6\x1e\x88\xff\xee\xf6\x57\xfe\x32\x67\x60\xfd\x15\x53"
- "\xb1\x32\xde\xaa\x1c\xe1\x5f\xbc\x55\x71\xc3\xe0\xf7\x57\x2a\x0c"
- "\xca\x78\xab\xc2\x2e\xe2\x44\x1b\x78\xbc\x55\x71\xca\x77\xbc\x55"
- "\x71\x5a\x19\x6f\x55\xec\x61\x71\x55\x65\x08\x8b\xb7\x2a\x0e\xb1"
- "\xf4\x7d\x1a\x79\xba\x3b\xde\x62\xe9\x2c\xde\xaa\x0c\xf7\x33\xde"
- "\x4a\x18\x40\xbc\x15\xf2\xed\x89\xb7\x7e\x7e\x85\xc7\x5b\xfb\x7d"
- "\xee\x7f\x2e\xf3\x3b\xf1\x1e\x7e\x47\x3d\xe4\x77\x90\x6b\x2a\x0d"
- "\x03\xf3\x3b\xef\x87\xf4\x2b\xfb\x3c\x99\xec\x91\xf3\x45\xb9\xbb"
- "\xa2\xb6\xa8\x83\x96\x3d\x70\x7d\x49\xe6\xb7\x59\xee\xfb\x4f\x0e"
- "\x4c\xee\x1f\x64\x0f\xc5\x5a\xc1\xca\xfe\xfd\x59\x03\x93\xfd\x87"
- "\xce\xe0\x63\xad\x83\x2d\xc7\x7a\x62\xad\x83\x2d\x9e\xb1\x16\xc6"
- "\x56\x33\x1c\x2c\xe6\x7a\x15\x62\xa5\xdc\x54\x88\xbb\x56\x10\x62"
- "\x69\x7e\x9f\xe4\x41\xec\x95\x7b\x1e\xe2\xaf\x14\x88\xbf\x9c\x6f"
- "\x8b\xf1\xd7\xc1\xa7\x95\xf1\x97\xf9\x94\xd7\xf8\x4b\xeb\x8e\xbf"
- "\x9c\x10\x5b\x75\xbf\xbd\x45\x5d\x78\x5e\x16\x8b\x2d\xea\x1d\x8b"
- "\x75\xe5\x1f\x48\xe8\xba\x75\x4b\x48\x37\xc4\x63\x7d\xc5\x62\x02"
- "\x26\xbc\xc4\x63\xff\x19\xb1\xd8\x07\xd5\x03\x8b\xc5\x0e\x1a\x94"
- "\xb1\xd8\x47\xbf\xf1\x2f\x16\x3b\xf8\xb6\xcf\xb1\xaf\xa0\x63\xb1"
- "\x83\x7b\x95\xb1\xd8\x47\xd9\x22\x66\x5e\x0a\x3c\x16\xfb\x68\x9e"
- "\xef\x58\xec\xa3\x85\xca\x58\xec\x23\xf1\xdd\xd3\x8f\xb6\xb2\x58"
- "\xec\xa3\x59\x2c\xdd\x9c\x21\x4f\x77\xc7\x62\x2c\x9d\xc5\x62\x1f"
- "\xed\xf0\xf3\xd9\x58\xbc\x13\x7c\xfa\x37\x3f\x9f\xb2\xaf\x67\x63"
- "\x83\x35\x9f\xf2\xa1\x2b\xfc\xd9\xd8\xe1\xfe\xc7\xbf\x86\x62\x02"
- "\x2f\x5c\xf3\xd1\xde\x81\xf9\xa5\xbf\x6e\x1d\x8a\x09\x82\x95\xfd"
- "\xe1\x01\x8e\x7d\x55\xeb\x82\x8f\x09\x8e\x36\xba\xc7\x5f\x8e\x36"
- "\x06\x36\xfe\x72\xf4\x31\xa5\xff\xaf\xf6\xee\xff\x87\xc6\x5f\x02"
- "\xf0\xf9\x7f\x6d\x1c\x98\xcf\x3f\x1a\xa9\xf4\xf9\xc7\x36\xf9\xe7"
- "\xf3\x8f\x6e\x1b\xfc\xf1\x97\xa3\xe5\x4a\x9f\x7f\x2c\x5d\xc4\x49"
- "\x7e\xe0\x3e\xff\xd8\x6c\xdf\x3e\xff\xd8\xd3\x4a\x9f\x7f\x2c\x9a"
- "\xf9\xf6\x63\x39\xcc\xe7\x1f\x9b\xca\xd2\xab\xf3\xe4\xe9\x6e\x9f"
- "\xcf\xd2\x99\xcf\x3f\xb6\x35\xb0\xe7\x5d\x61\x57\xe8\xf3\x2e\xdd"
- "\x77\xe4\x79\x57\xad\x66\xc8\xef\x04\xeb\x77\x8e\x95\x0f\xcc\xef"
- "\xd4\xf5\xbb\xfe\x87\x6f\xbf\x73\x3c\xde\xed\x77\x8e\xc7\x07\xe6"
- "\x77\xea\x8f\x28\xfd\x8e\x65\xc6\x90\xdf\x19\xa8\xdf\xa9\x8d\x1f"
- "\x98\xdf\xa9\xf7\x58\xff\xe8\x84\x9f\xeb\x1f\x1d\xf7\xb9\xfe\x51"
- "\xf0\x7e\xe7\xb8\x5e\xe9\x77\x8e\x8b\xeb\x1f\x59\x82\x58\x37\xe4"
- "\x78\xad\x6f\xbf\x73\xdc\x63\xfd\xa3\xe3\xe2\xfa\x47\x27\xc4\xf5"
- "\x8f\x8e\x8b\xeb\x1f\x59\xd4\xf2\x74\xb7\xdf\xb1\xc8\xd6\x0d\x39"
- "\x31\xb4\xfe\xd1\xb7\x6e\x1e\xe6\xdf\x07\xc0\x7f\x1f\x4f\x70\xf3"
- "\xdf\xc7\x13\x7c\xcf\xc3\x3c\xf5\x8e\x72\x1e\xe6\xc9\x7b\x86\xe6"
- "\x61\x06\xc3\x6f\x27\x06\xb8\x2e\xd2\xa9\x74\x25\xbf\x7d\xfc\x99"
- "\x7f\xfc\x76\xea\xeb\xc1\xe7\xb7\x8f\x89\x92\xdf\x3e\xae\x11\xb1"
- "\x11\x04\xbf\x7d\xbc\xdb\x37\xbf\x7d\xfc\x17\x25\xbf\x7d\x9c\xc3"
- "\x78\xec\x63\x2b\xe3\xb7\x8f\x8b\x59\xfa\x49\xb5\x3c\xdd\xcd\x6f"
- "\x27\x65\xfc\xf6\x71\x6b\x60\xcf\x35\x83\x8a\xab\x2f\xc3\x73\xcd"
- "\xc1\x8a\xab\xaf\xf4\xe7\x9a\x0d\x49\x43\xe3\x68\xc1\xc4\xd4\xff"
- "\x20\x03\x8b\xa9\x3f\x69\x0c\xde\xa7\x34\x9a\xdd\x3e\xa5\xd1\xec"
- "\xeb\xf9\x4e\x2e\xe0\x2e\x0f\x62\xe2\x4d\xe7\x89\xfa\x55\x7c\xbe"
- "\x73\xb2\x96\xe4\xe3\xf3\x9d\x54\xe9\xf9\x4e\x89\x18\x67\x37\xde"
- "\xad\x8c\xb3\xff\xf9\x17\x6f\x71\x36\xc6\xd7\x2e\x88\x9d\x9d\x9e"
- "\xcf\x75\x9e\xf4\xee\x8b\xba\xb4\x07\x12\x3a\xdf\xde\x12\x12\xa8"
- "\x2f\x7a\x63\x15\xf3\x45\xdb\xbf\xf5\xbe\xa8\x61\xd7\xc0\x7c\x51"
- "\x23\x51\xfa\xa2\xd3\x8b\xfd\xf3\x45\x8d\x6b\x07\xdf\x17\x35\xe6"
- "\x29\x7d\xd1\xe9\x04\x11\x2b\x41\xec\x2d\x79\xfa\x1e\xdf\xbe\xe8"
- "\xf4\xfd\x4a\x5f\x74\x3a\x9c\xf9\x9c\xd3\x29\xcc\x17\x9d\x36\xb0"
- "\xf4\x7f\x26\xc8\xd3\xdd\xbe\x88\xa5\x33\x5f\x74\x3a\x23\xb0\x31"
- "\x9e\xab\xaf\xd0\x31\x9e\x90\xef\xc8\x18\xcf\xff\x67\x0b\x9e\x13"
- "\x3f\xdb\x5b\xd3\xf3\xfe\xc6\x67\x7b\x7b\x8d\x33\xac\x80\x78\xbb"
- "\x8d\x3d\xe7\xee\x19\x67\xb0\x9e\x16\xf9\xef\xb3\xdb\x94\xfc\xf7"
- "\xa9\x4f\xfe\xeb\xeb\x59\x36\x8e\x2b\xb8\x80\x1b\x71\x8f\xcc\xa0"
- "\x9f\x65\xaf\xf8\xb6\x73\xde\xe9\x01\xae\xaf\x6c\xb5\x2b\x39\xaf"
- "\x69\x9e\x7f\x9c\xf7\xd9\x52\x9f\x9c\x17\xf4\x7b\x1c\x9f\x65\x2b"
- "\x39\xaf\x69\xba\x88\x8f\xc5\x81\x73\x5e\xd3\x78\xdf\x9c\xd7\x74"
- "\xb7\x92\xf3\x9a\x42\x18\xb7\x35\x25\x32\xce\x6b\x8a\x64\xe9\x9f"
- "\xa6\xc8\xd3\xdd\x9c\xc7\xd2\x19\xe7\x35\xa5\xf4\xc5\x79\x34\x6f"
- "\x63\x42\x21\xc7\xef\x81\xc3\x04\x75\xbc\x01\xb0\x61\x86\xef\xd5"
- "\xa0\xe3\x51\xf0\xbd\xde\x97\xfd\xd9\xb4\x1b\x13\x78\x23\xd4\x99"
- "\x23\x2a\x8b\xed\x2b\xb3\x79\xb4\x13\xeb\x29\xbe\xb3\xb6\x31\x21"
- "\xcc\x79\xf5\x34\x9e\x26\x13\xd0\x4b\x82\xb0\x7f\x26\xe4\xc7\xf7"
- "\x83\xf4\x2b\x48\xe8\x79\xd5\xbf\x34\x52\x3e\xa8\x6f\x68\x93\xaa"
- "\xe9\x08\x96\xd1\xb1\xe1\x5f\x11\xd0\x96\x0c\x9f\x75\x85\xb2\xe2"
- "\xde\x19\x4b\xd6\x3a\xe9\xbf\xcd\xa9\x6d\xa4\x59\xf5\xaf\x79\x61"
- "\xad\x57\x4f\xa3\x59\x09\x04\x63\xb9\x3d\xa3\x6d\x6a\x2c\xd3\x9c"
- "\xda\x85\xe7\xa6\xe2\x39\x17\xd4\x31\x73\x31\xe1\x0a\xda\xae\x0e"
- "\x01\x9e\x18\x9e\x65\xa7\x2d\x4b\x9c\x50\x67\xc0\xe6\x87\x63\x1b"
- "\xd4\xef\x6d\x87\x34\x17\x89\xc0\xfd\x4c\xb1\x0c\x88\x67\xa1\x3e"
- "\xff\x5a\x50\x0a\xf9\xbd\xd5\xe1\x95\x77\xc9\xb8\xe1\xb7\x51\x6b"
- "\x60\xb8\xf9\x97\xc9\x97\x1c\xc3\xd6\x8d\x25\xe6\xdb\x41\x76\x7a"
- "\xc2\x79\x3b\x1f\xd8\x7d\x9a\xf5\x7d\xf0\x65\x08\xee\x91\x9c\xb5"
- "\x8d\x70\x9b\xf9\xab\x43\x3e\x5a\x23\xec\x51\x6c\xeb\xd8\xd0\x9c"
- "\x67\x55\x4d\x9b\x83\x32\xc7\x7d\x2d\x71\x7f\x6d\xc0\x0d\x81\xf4"
- "\x9d\x07\x32\x08\xf1\xd4\xc5\xb2\xa4\xc5\xf3\xf4\xe9\x0b\x17\x2f"
- "\x58\xf2\x62\xba\xfe\xd6\xa4\x91\x24\x7e\xc9\x12\xfd\xe2\x79\xa9"
- "\x2f\xe9\xe5\x67\xee\xd5\x27\x2d\x5c\x3e\xef\xd9\x94\x05\xe3\x17"
- "\xcf\x4f\x1b\x89\x41\x8b\xac\x1e\xe1\x58\x17\x7e\x43\xf3\x9e\xd2"
- "\xd7\x08\xd9\x32\x8a\xa8\xb1\x5e\x1d\x1b\x3e\x0f\x97\xf6\x3d\x2d"
- "\x78\x9d\xda\x39\xc8\x93\x05\xfc\xb8\x39\xf3\x6a\xcc\xab\x2f\x83"
- "\x7a\x95\x42\xbd\xa1\x8e\x50\xe7\xcf\x63\xa5\x3a\x4b\x98\xc8\x42"
- "\x4c\x64\xb6\x01\x06\x3f\x9f\x17\xe6\xb8\xfa\xe7\x94\x26\x60\xfb"
- "\xec\x60\x27\x2a\x48\xfb\xa3\xe0\xcb\xf2\x37\x26\xc0\xb5\x6b\x24"
- "\x8c\xe1\xb5\xb4\x60\xa3\xbe\x03\xed\x84\x26\xff\x8c\xd9\xd4\x99"
- "\xf8\xd9\x06\x15\x61\xfb\xae\x7e\x5e\xee\xde\x77\xf5\x8c\x30\x56"
- "\x0d\xf5\x68\x85\x74\xb3\x55\x75\xc3\x4e\x4c\xc7\xfd\x82\x71\xff"
- "\x6e\xac\x33\xb4\x0b\x7c\x29\x35\x53\xa3\x88\xfd\x9c\x4f\x12\xf8"
- "\x9c\x4e\x9b\x45\x7d\x91\xc4\x39\x69\x37\xdd\xf4\x49\x42\x9d\xdd"
- "\x4e\xc2\xd6\xa5\xcd\xa7\x57\x35\x1f\x08\x73\x2e\x5c\x50\x36\x0a"
- "\x6c\x68\x53\xa7\x8d\x6e\x6a\x9f\x36\xfb\x36\xa2\xeb\xd8\x70\x46"
- "\xbe\xff\xab\x3a\x30\xfd\x9f\x11\xf4\x8f\x7a\x84\xfa\x88\x7a\x3c"
- "\x93\x72\x20\xbd\xb7\x1e\x7b\xf0\xf7\x0e\x4f\x0e\x03\x16\xa8\x66"
- "\xdf\x8e\x38\x17\x93\x23\xda\x6e\x7b\x56\x32\xb9\x53\x90\xdd\xbf"
- "\xa3\xf8\x82\x7d\xd9\x7c\xde\x3e\x13\xcd\xdb\xb7\x13\x64\x16\x53"
- "\xb0\x82\xe8\xe7\xba\x74\x24\xff\x22\x89\xb6\xe5\xef\xdb\xa1\x55"
- "\x65\xab\x20\x1e\xe1\xc0\x9f\x44\x03\x67\x44\x8b\xf6\x1e\x83\x72"
- "\xfc\x1b\x30\xc2\xcc\xe5\x84\xfc\x7b\x12\x19\x56\x0a\xd7\x05\xd8"
- "\x1e\xc1\xff\xd3\x0d\x67\xca\xcb\xe0\x5a\xdc\xd7\x37\xb0\xeb\xff"
- "\x1d\xed\xd3\xee\x7a\xda\x6d\xd2\x7b\x6f\x77\x4b\x24\x5f\x60\x82"
- "\xbe\xad\x29\x86\xe6\x99\xa2\x7a\xb7\xdb\xa4\x67\xed\x1e\xde\x36"
- "\xf8\xed\xfe\x37\x5b\xff\x7a\xc3\xbf\x77\x04\xd7\xee\x16\x83\x1f"
- "\xed\xf6\xa1\xef\x2f\xc2\xa1\xdd\xa0\x6f\x13\xe8\xdb\xe4\x45\xdf"
- "\x26\x51\xdf\xd7\x34\x0d\x7e\xbb\x5b\xac\xac\xdd\x2d\x45\xc1\xb5"
- "\xfb\x0b\x9f\xfc\xe7\x6e\x77\x85\x0f\x7d\x9f\xd5\xf0\x05\x15\xa0"
- "\xef\x0a\xd0\x77\x85\x17\x7d\x57\x88\xfa\xbe\xf6\xc4\xe0\xb7\xfb"
- "\x0b\xb6\xfe\xe1\x86\x2f\x0a\x83\x6b\xf7\xd9\x08\x3f\xda\xed\x43"
- "\xdf\x5f\xaa\xa1\xdd\xa0\xef\x0a\xd0\x77\x85\x17\x7d\x57\x88\xfa"
- "\x9e\x98\x3b\xf8\xed\x3e\x5b\xcf\xda\x7d\x36\x27\xb8\x76\x7f\xe9"
- "\x73\xfe\x8b\xbb\xdd\x95\x3e\xf4\xfd\xa5\x93\x2f\xa8\x04\x7d\x57"
- "\x82\xbe\x2b\xbd\xe8\xbb\x52\xd4\xf7\x53\x53\x06\xbf\xdd\x5f\x56"
- "\xb3\x76\x7f\x99\x1d\x5c\xbb\x5b\x7d\xce\x7f\x97\xf1\x79\x39\x70"
- "\x76\x2f\x9d\x5b\x32\x62\xc8\x1d\x17\xb1\xfd\xe7\x52\xa8\x76\x5f"
- "\xf9\x35\xeb\xb2\x55\x4e\xcd\xbe\x5d\xd7\x40\x5f\xee\x0d\x23\x9f"
- "\x1c\x66\x25\x23\xa0\xad\xc9\xb4\xa0\x2a\x16\x3f\x79\x28\xc7\x09"
- "\xdc\xef\xd2\xec\xdb\xd9\x95\xb7\x31\xe6\xd5\xe7\x88\x3e\xcb\x46"
- "\x74\x75\x99\x56\x92\x99\x46\x6d\x75\xe4\x33\xa2\xb5\x12\x0e\xc7"
- "\xcb\x8e\xb5\x9a\x48\xea\x32\x4a\xa1\xec\xd9\xd8\xc7\x2c\x38\x43"
- "\xa2\x21\x26\xce\xa6\xe0\x3f\x0a\x79\xa2\x87\xf2\xa3\x51\x96\x50"
- "\xf6\x94\xb0\x78\xa2\xfa\xe0\x59\x07\x41\x79\xa2\x6c\xa1\x3f\x1a"
- "\x2d\xc8\x15\xa2\xfd\x47\x9f\x62\x72\x7d\xe3\xb9\x40\xe5\x7a\x8e"
- "\x3d\xff\xcb\xdb\x67\xb6\x58\xbb\x08\xc4\x96\x3a\x7c\xe7\x1e\xe4"
- "\xd5\x58\x97\xd6\x06\x7d\x91\xd6\x6c\x9a\xbf\x6f\x0f\x0f\x3e\x2b"
- "\xc0\x72\x7d\xae\x7f\x2d\xe3\x53\x03\x70\x66\x2f\xac\xb9\xe5\x7d"
- "\xbe\x91\x6a\x4d\x06\x26\x6f\xd3\xb8\x6b\x1a\x87\xb7\x79\x97\xb7"
- "\xc9\xe0\x04\x9f\xe3\xd2\x98\xa2\xfc\x97\xf7\xf9\xc3\x4a\x79\x9b"
- "\xc8\xe5\x91\xf7\x79\x71\xff\x53\x53\xac\x52\xde\xe7\xa7\x33\x79"
- "\x9f\xb3\xd1\x7c\x53\x34\x0f\xbe\x32\xc0\x72\x5b\xfc\x90\x37\xe0"
- "\xbb\xb7\x0f\x73\xcb\xdb\x36\x1d\xe4\x2d\xe2\xdb\x04\xf8\xbe\xa6"
- "\xc9\x87\xbc\x01\xdf\x26\xc0\xb7\x29\x00\x7c\xdb\xee\xf6\x90\xf7"
- "\x65\xc2\xb7\x4d\x1c\xff\x33\x79\xe0\xfb\xab\x2a\x26\xef\xaf\x12"
- "\x41\xde\x80\x6f\x53\x80\xf8\xb6\x25\xf8\xe1\x3f\x00\xdf\xbd\x7d"
- "\xa7\x5b\xde\x5f\x57\x51\x6d\x85\x88\xef\x0a\xc0\xf7\xb5\x27\xbc"
- "\xcb\xbb\x02\xf0\x5d\x01\xf8\xae\x08\x00\xdf\x5f\xbf\xad\x94\x77"
- "\xc5\x65\xc2\xf7\xd7\x6c\x8d\xc9\xbc\x0a\x0f\x7c\x7f\x3d\x8e\xc9"
- "\xdb\x56\x4f\xf3\x2b\x00\xdf\x15\x81\x96\x5b\xed\x87\xbc\x01\xdf"
- "\xbd\x7d\xb6\x5b\xde\xed\xe3\x40\xde\x22\xbe\x2b\x00\xdf\x13\x73"
- "\x7d\xc8\x1b\xf0\x5d\x01\xf8\xae\x08\x00\xdf\xed\xd7\x79\xc8\xfb"
- "\x32\xe1\xbb\xcd\x2a\xca\xdb\x03\xdf\x6d\xc5\x4c\xde\x6d\xb1\x20"
- "\x6f\xc0\x77\x45\x80\xf8\x6e\x8f\xf1\x23\x4e\x00\x7c\xf7\x8e\x15"
- "\xdc\xf2\xb6\x17\x53\x6d\xa5\x88\xef\x4a\xc0\xf7\x53\x53\xbc\xcb"
- "\xbb\x12\xf0\x5d\x09\xf8\xae\x0c\x00\xdf\xf6\x57\x94\xf2\xae\xbc"
- "\x4c\xf8\xb6\x8b\xfb\x5f\x56\x7a\xe0\xdb\xae\x61\xf2\x6e\xdf\x43"
- "\xf3\x2b\x01\xdf\x95\x81\x96\x5b\x1e\x4c\x7c\xb2\xbc\x84\x84\x28"
- "\x65\x7e\x51\x77\xe9\x62\x94\x0b\x9d\xdf\x4c\x8c\x72\xe1\x90\xf7"
- "\x18\xe5\x42\x36\x93\xf9\x85\xa8\xe0\x62\x94\x8b\x3e\xdf\x7f\xe8"
- "\x2b\x46\xe9\x2d\xf3\x8e\xf5\x97\x2e\x4e\xe9\x58\xfc\xcd\xc4\x29"
- "\x1d\x31\xde\xe3\x94\x8b\x76\x26\xf3\x8b\x45\xc1\xc5\x29\x1d\x3e"
- "\xd7\x3f\xe8\x2b\x4e\xe9\x2d\x73\x87\xe3\xd2\xc5\x2a\x8e\xcf\xbe"
- "\x99\x58\xc5\xb1\xcb\x7b\xac\xe2\x48\x66\x32\x77\x68\x82\x8b\x55"
- "\x3a\xd5\xc1\xc4\x2a\xbd\x65\xde\x95\x72\xe9\xe2\x95\xae\xd9\xdf"
- "\x4c\xbc\xd2\xa5\xf7\x1e\xaf\x74\x8a\xfd\x9f\xce\xec\xe0\xe2\x95"
- "\x2e\x3f\xfa\x3f\xbd\xe3\x95\xde\x32\xef\xb6\x5e\xba\x98\xa5\xfb"
- "\xc8\x37\x13\xb3\x74\x6f\xf5\x1e\xb3\x74\xcf\x62\x32\xef\xb2\x07"
- "\x17\xb3\x74\xfb\xdc\xff\xa4\xaf\x98\xa5\xb7\xcc\x5d\xf1\x97\x2e"
- "\x6e\x71\x4d\xfe\x66\xe2\x16\x57\x88\xf7\xb8\xc5\x79\x88\xc9\xdc"
- "\x99\x1c\x5c\xdc\xe2\x4a\x0c\x26\x6e\x41\x59\xa3\xcc\x31\x56\x11"
- "\x64\xce\x91\x28\x1a\xba\x2f\xbb\x1b\xe2\x11\x2d\xc8\x5d\xdb\x4a"
- "\xb8\x12\x94\x79\x03\x93\xb9\x2b\xb4\x2a\x16\xe4\x93\x8c\x32\x13"
- "\xda\xf1\x65\x44\xa8\x2b\x6f\xdf\x2e\xca\x11\x68\x4b\x08\x39\xa3"
- "\xe2\x7f\xec\x34\x92\x50\x7d\xe6\x3a\x02\x65\x5d\x87\x79\xf4\x99"
- "\x1b\x4e\x43\x1b\x87\xe1\x33\x0a\x67\xfe\x06\xab\x4b\xbb\x3f\xf1"
- "\x8c\x8a\x2e\xa5\x63\x8c\xd6\x6e\x88\x25\xe8\x0b\x11\xe1\x96\xd6"
- "\x3d\xc4\xe2\x3c\x4a\xea\x1a\x2a\x09\x1f\x5a\x35\xe5\x4e\x27\x31"
- "\xd0\x2f\x0d\xe1\x35\xe9\x56\xe2\x9a\x1f\xa1\xb1\x64\x54\x03\x2e"
- "\xfe\x44\xe2\x5a\xe8\x45\xfa\x2f\x83\xa6\x5b\x6b\xde\xe1\xd2\x56"
- "\xe9\x5d\xf9\x07\x92\x9d\x5a\x73\xe1\xee\x15\x56\x4e\xe3\x20\x86"
- "\x94\x66\x4a\x0b\x9e\x25\xea\x82\x26\x12\xb2\xf9\x59\xa2\xd9\xdc"
- "\x44\x74\x35\xcd\x0d\xa4\xf6\x6c\x35\xa9\x6d\xfb\x84\xd4\x5e\x84"
- "\xa3\x0b\x0e\x1e\x8e\xec\x4f\x48\x0d\x20\x75\xc6\x39\x42\xb2\x9a"
- "\xa9\xed\x47\x8d\x24\xbc\xc6\xd9\x40\xf4\xcf\x10\x72\x5e\x45\x87"
- "\x6b\x12\x49\x38\xfd\x57\x04\xa1\xf3\x23\x38\x38\xa7\xc6\x74\x8b"
- "\xd3\x46\x6a\x9a\x1d\x70\x9e\x6f\x86\xf3\xea\xac\x66\x28\x9f\xaf"
- "\xc6\xb5\x0c\x6d\x35\xd9\x47\xa0\x7d\x13\xeb\x41\xce\x26\x29\x26"
- "\x2b\xe8\x22\xd1\x9b\x41\xcd\x88\x99\x38\xca\x30\x53\xd6\x15\x28"
- "\x66\x28\x5b\xff\xfd\x85\x88\x51\x20\xef\xd1\xfc\x0b\x09\xba\x99"
- "\x9f\x7c\x4a\x71\x3e\x18\x3e\x9f\xa9\xb3\x1f\x25\xf8\xcc\x3a\xee"
- "\x25\x42\xa6\xbb\x08\x41\x99\xe0\xb3\xe4\x99\x69\x24\x0c\xe7\xa9"
- "\xf1\x5f\x1a\x46\x59\x9a\x6d\x64\xad\x13\xea\x7a\xde\xd1\x53\xd7"
- "\xba\xf5\x75\x04\xce\x8d\xae\x4b\xb6\x12\x4d\x1a\xd1\xa1\x9c\x21"
- "\x16\x2d\x9f\xd9\x42\x46\xa4\xda\x29\x45\x19\xa3\x6c\x51\xce\x58"
- "\x9e\x24\x7b\x4b\x92\x8d\x64\x39\x88\xce\x92\x09\x9f\x19\xd4\x66"
- "\x21\x5f\x13\xa8\x63\x04\xd5\x4e\xac\x07\x7c\x4c\x45\x4c\x58\x55"
- "\xbc\x01\x70\x30\x8a\x6e\x70\x35\x96\x42\x7b\xf1\xd9\x7e\x40\x6d"
- "\xe6\x88\x3f\xcf\x3f\x7a\xc5\x84\x6e\x3c\x9b\x0c\x0c\xcf\x9c\x9d"
- "\x86\x9a\x48\x37\xc4\x7a\x0c\xcf\xc3\xdb\xfa\xc7\xb3\x69\x5c\x0f"
- "\x9e\x39\x95\xca\x8d\x67\xee\x73\x9f\x78\xe6\xb8\xfb\x19\x9e\x4d"
- "\xb1\x57\x24\x9e\x39\xd5\xa9\x3e\xf1\xcc\xa9\xf6\xfa\xc6\xb3\x29"
- "\x46\x8a\x77\x07\x05\xcf\x1c\xa7\xb9\x7c\x78\x36\x19\x82\xc2\x33"
- "\xa7\x6a\x51\xe0\x99\x23\x0e\x01\xcf\xb9\x64\x57\x70\x78\x1e\x46"
- "\x82\x89\xb7\x65\x78\x16\xf9\x79\xf8\x21\xc0\x33\xf0\xb3\x49\xe4"
- "\xe7\x6b\x9a\xfc\xc0\xb3\x9b\x9f\xb9\x61\xc7\xdd\x78\x1e\xfe\x17"
- "\xdf\x78\x1e\x7e\xad\x88\xe7\x2b\x93\x9f\x39\xf5\xdb\x7d\xe3\x59"
- "\xbd\xbe\x0f\x3c\x9b\xa4\xbe\xc4\xe0\xe0\x59\xdd\x78\x19\xf1\x1c"
- "\x1c\x3f\x73\x6a\x93\x12\xcf\xc3\xaa\x19\x9e\x87\xad\x09\x0e\xcf"
- "\xc3\x7d\xce\xaf\xe9\xab\x2f\xe3\xc6\x73\x85\xc8\xcf\x21\x5b\x69"
- "\x68\x05\xf0\x73\x85\xc8\xcf\xd7\x9e\xe8\x1f\xcf\x15\x32\x7e\xbe"
- "\xea\x4d\x37\x9e\x43\x5e\xf1\x8d\xe7\xab\x3f\x63\x78\xae\xb8\x42"
- "\xf9\xf9\xea\x17\xfb\xc6\xf3\xd5\xf1\xbe\xf1\x5c\x11\x23\xf5\xd3"
- "\x06\x07\xcf\x57\xef\xba\x7c\x78\xae\x08\x92\x9f\xaf\xce\x51\xe2"
- "\xf9\xaa\x22\x86\xe7\xab\xa6\x07\x87\xe7\x90\x1d\xc1\xf4\x13\x65"
- "\x78\x16\xf9\xf9\x9a\x24\xc0\x33\xf0\x73\x85\xc8\xcf\x13\x73\xfd"
- "\xc0\xb3\x8c\x9f\x47\x2c\x75\xe3\xf9\x9a\xd9\xbe\xf1\x3c\xf2\x8f"
- "\x22\x9e\xaf\x50\x7e\x1e\xf9\x60\xdf\x78\x1e\x19\xd5\x07\x9e\x4d"
- "\x52\x1f\x78\x70\xf0\x3c\x72\xcd\x65\xc4\x73\x90\xfc\x3c\x32\x41"
- "\x89\xe7\x11\xc9\x0c\xcf\x23\x22\x83\xc3\xf3\x35\x3e\xf7\x7f\xed"
- "\xab\x0f\xee\xc6\x73\xa5\xc8\xcf\xa1\x13\x68\x68\x25\xf0\x73\xa5"
- "\xc8\xcf\x4f\x4d\xe9\x1f\xcf\x95\x32\x7e\xd6\xdc\xef\xc6\x73\xe8"
- "\xad\xbe\xf1\xac\x5d\xc7\xf0\x5c\x79\x85\xf2\xb3\xf6\xba\xbe\xf1"
- "\xac\xb1\xfb\xc6\x73\x65\x8c\x34\xbe\x30\x38\x78\xd6\x4e\xbf\x7c"
- "\x78\xae\x0c\x92\x9f\xb5\x06\x25\x9e\x35\x31\x0c\xcf\xd7\xb4\x06"
- "\x87\xe7\xd0\xd8\xc1\x19\xdf\xb8\x76\x02\x8e\x6f\x74\xe1\xf8\x86"
- "\x7b\xee\x5f\x72\x58\x3d\xc3\x73\x37\xe0\xf9\x0d\x39\x9e\xff\xcf"
- "\x63\x7c\x83\x0b\xbb\x96\xef\xc1\xf3\xb5\xbd\xf0\xcc\x03\x9e\xbb"
- "\x05\x3c\xeb\x26\x4b\xe3\x1b\x96\xd6\x1d\x80\x93\xb3\xc4\x32\x0b"
- "\xb0\x5c\x20\x62\xf9\xff\x00\xcb\x20\x43\x1e\x64\x5c\xd3\xd8\x40"
- "\xe2\x6c\x4c\x96\x5d\x20\x63\x5e\x8e\xe3\xae\x16\x0e\xf1\x8b\xb8"
- "\x95\x30\x5c\x9b\x0a\xd8\x5d\x76\x9c\xd4\xae\x80\x63\x15\x1c\x99"
- "\x70\x90\xe3\xa4\xa6\x05\xb0\xbb\x50\x8e\xdd\x7a\x11\xbb\x61\xc7"
- "\xfb\xc6\x6e\xd8\x9e\xcb\x36\x96\xc1\xe9\xd8\xf8\xd7\xff\x25\xe8"
- "\xe2\x1e\xfb\x94\x5a\x32\x1a\x44\x7c\x9e\x25\x71\x4e\x12\x46\x9f"
- "\x32\x8c\xd2\x24\x10\xdd\x6a\x17\xe1\xf2\x9f\x25\xba\xfc\x7f\x42"
- "\xbb\x25\xfb\x6d\x22\x9a\xa3\x8e\x4a\x52\xd3\xd6\x40\x6a\x2e\x1e"
- "\x21\x35\x3c\x1c\x67\xe1\x80\xba\xc6\x2d\x90\xb7\xdb\x26\xb6\x5b"
- "\x77\x04\xca\x8a\xf2\xdd\x6e\x5d\xb9\xd0\xee\x24\x68\x77\x97\xbb"
- "\xdd\x16\xb0\x03\xd0\xcf\x68\x5e\x1c\x0f\x89\xb3\x91\x11\x4b\x9c"
- "\x94\x76\x89\xf8\x47\xfd\x1c\x3d\xe9\x20\x71\x69\xa0\xb3\xf9\x80"
- "\xff\xe6\x72\x92\xb5\x06\xf0\xdf\xe5\x40\xdc\xd9\x2c\xd9\x9d\x80"
- "\xff\xb0\x66\x0a\xf2\xeb\x46\xfc\xff\x1f\xe2\x3f\x2c\x84\x17\xf0"
- "\x1f\x5a\x15\x1c\xfe\xaf\xf5\x03\xff\xfe\x8c\x87\x84\x4f\xc0\xf1"
- "\x90\x2e\x1c\x0f\x71\xcf\x01\xed\x07\xff\xf2\xf1\x90\x51\x32\xfc"
- "\x87\xf7\x81\xff\xef\x4d\x96\xc6\x43\xbe\x79\xfc\x8f\xea\x07\xff"
- "\xa3\xfa\xc0\xff\x60\x8f\x7d\x7c\xef\x32\xe2\xff\x7b\xfd\xe0\xff"
- "\x7b\x7e\xe0\xdf\x64\x08\x0e\xff\xa3\x3c\xf0\x3f\x4a\xc4\xff\xb5"
- "\x41\xe2\x3f\xdc\x1f\xfc\xfb\x31\x7e\xf2\x7d\xc4\x3f\xf0\xbf\x69"
- "\xa7\x6c\x2e\x70\x7f\xf8\x97\xf1\xff\x75\x32\xfc\x7f\xbf\x0f\xfc"
- "\x5f\x2f\xe1\xff\x0a\xe0\xff\xeb\xfa\xc1\xff\x75\x7d\xe1\x7f\x90"
- "\xc7\x4a\xae\xbf\x8c\xf8\xbf\xbe\x1f\xfc\x5f\xef\x0f\xfe\x83\xe4"
- "\xff\xeb\x3c\xf0\x7f\x9d\x88\xff\xf0\x20\xf1\xff\x7d\x3f\xf0\xef"
- "\xcf\x78\xcb\xe8\x09\x38\xde\xd2\x85\xe3\x2d\xee\x39\xe1\xfd\xe0"
- "\x5f\x3e\xde\x12\x21\xc3\xff\xe8\x3e\xf0\x7f\xc3\x64\x69\xbc\xe5"
- "\x9b\xc7\x7f\x44\x3f\xf8\x8f\xe8\x03\xff\x83\x3d\xb6\x72\xc3\x65"
- "\xc4\xff\x0d\xfd\xe0\xff\x06\x3f\xf0\x5f\x11\x24\xff\x47\x78\xe0"
- "\x3f\x42\xc4\xff\xf7\x83\xc4\xff\x68\x7f\xf0\xef\xc7\xf8\xcc\x18"
- "\xc4\x3f\xf0\x7f\xc5\x4e\xd9\xbb\x01\xfd\xe1\x5f\xc6\xff\x37\xca"
- "\xf0\x3f\xa6\x0f\xfc\x47\x4a\xf8\xbf\x02\xf8\xff\xc6\x7e\xf0\x7f"
- "\x63\x5f\xf8\x1f\xe4\xb1\x98\xc8\xcb\x88\xff\xc8\x7e\xf0\x1f\xe9"
- "\x0f\xfe\x83\xe4\xff\x1b\x3d\xf0\x7f\xa3\x88\xff\xd1\x41\xe2\x7f"
- "\x8c\x1f\xf8\xf7\x67\x3c\x47\x2f\x8c\xe7\x74\xe1\x78\x8e\xfb\x1d"
- "\x91\x7e\xf0\x2f\x1f\xcf\x19\x2b\xc3\xbf\xbe\x0f\xfc\xdf\x34\x59"
- "\x1a\xcf\xf9\xe6\xf1\x3f\xb6\x1f\xfc\x8f\xed\x03\xff\x83\x3d\x76"
- "\x73\xd3\x65\xc4\xff\x4d\xfd\xe0\xff\x26\x3f\xf0\x5f\x19\x24\xff"
- "\x8f\xf5\xc0\xff\x58\x11\xff\x63\x82\xc4\xbf\x7e\x90\xc6\x7f\x7e"
- "\xd0\x88\xe3\x3f\xbc\x66\xdf\xce\xee\x62\xa3\x95\xcf\x33\xef\x08"
- "\x53\xe9\x89\x53\xb3\x3f\xd1\x92\x6e\x27\x33\x2f\x80\x4e\xd2\x2e"
- "\x90\x67\x2e\xe8\x70\x2f\xcb\x42\x0a\xfd\x7f\xc5\x3b\xa2\x70\x38"
- "\xf3\x26\xd6\x6f\x4e\x25\x6a\x57\x68\x95\xf0\x7e\x95\xe5\x8c\x83"
- "\x60\x9b\xd7\xa2\x0c\xce\xba\x65\x80\x63\x70\xf4\x2b\x83\xae\xd4"
- "\x08\x79\xba\xac\xa4\x19\xf0\x52\xd3\x6c\x05\xd9\xaf\x12\xb0\x85"
- "\xba\x80\xfa\xac\x29\x3b\x4f\xd4\xce\x7f\x45\x8c\x06\x1d\x87\x6b"
- "\x57\x12\x55\x64\x33\xe5\x51\x97\xa8\x23\xd4\xab\x7e\x15\xa5\x90"
- "\xef\x54\x1d\xe0\xdb\xf9\x2f\xc3\xe8\x52\xc8\x37\xf8\xe3\x32\x3f"
- "\x10\x9e\x7f\xc0\x67\x7a\x4d\x23\xc8\x32\x57\x1f\xa4\x9e\x7e\xe0"
- "\xcf\xfb\x2f\x7e\x8c\x53\xdc\xb2\x1e\xc7\x29\x78\x8d\x29\xca\x3f"
- "\x3d\x99\x0c\x8a\x77\x5a\x07\x5d\x4f\xb7\x44\xf9\xa7\xa7\x5b\xd6"
- "\x2a\xf5\x34\xd8\xe3\x07\xb7\x4c\x63\x7a\xba\x25\x92\xe9\xe9\xe6"
- "\xa4\xe0\xf4\x74\x4b\x50\xf3\x7f\x7b\xf7\xa7\x6f\x1d\x87\xfd\x69"
- "\xd0\x93\x9f\xf6\x64\x2a\x57\xbc\x83\x3b\xe8\x7a\x8a\xaa\xf1\x4f"
- "\x4f\xb7\xde\xea\xa1\xa7\x41\xee\xe7\x46\xd9\x98\x9e\xa2\x0e\x31"
- "\x3d\x45\x69\x82\xd3\xd3\xad\x7e\xbc\xff\xe1\x4f\xbf\xef\x87\x27"
- "\xb1\xdf\xc7\x43\xbf\xcf\x3f\x3d\x55\x18\x14\xef\x0c\x0f\xba\x9e"
- "\x7e\x98\xee\x9f\x9e\x7e\x58\xab\xd4\xd3\x60\xf7\xc7\x7e\x58\xc4"
- "\xf4\xf4\xc3\x14\xa6\xa7\x5b\xf7\x06\xa7\xa7\x1f\x5a\x07\xa7\x7f"
- "\x62\x58\x83\xfd\x13\xd0\x93\x9f\xf6\x54\x51\xae\x78\xc7\x79\xd0"
- "\xf5\x64\x88\xf4\x4f\x4f\x86\x17\x3d\xf4\x34\xc8\xfd\x06\x43\x2c"
- "\xd3\x13\xc4\x8d\x82\x9e\xfe\x6b\x4e\x70\x7a\x32\xf8\x5c\xff\x34"
- "\xb0\x38\xfa\xf6\x28\x8c\xa3\x79\x88\xa3\xfd\xd3\x53\xa5\x41\xf1"
- "\x4e\xf6\xa0\xeb\xe9\xb6\x43\xfe\xe9\xe9\xf6\x31\x4a\x3d\x0d\x76"
- "\x7c\x7b\x5b\x0b\xd3\xd3\x6d\x55\x4c\x4f\xb7\xa9\x83\xd3\xd3\xed"
- "\x7e\xcc\xff\xf4\xfe\x1e\x56\xef\x98\xef\x47\xf5\x57\x56\xcc\xf7"
- "\xa3\x34\xff\x74\xf5\xa3\x23\x97\x36\xe6\xfb\xd1\x56\xa6\xab\x1f"
- "\x25\x33\x5d\xdd\xbe\x27\x38\x5d\xfd\xc8\xe7\xfa\x8f\xfd\xbd\xbf"
- "\xd5\x3b\xee\x1b\xbf\xe6\xca\x8a\xfb\xc6\xfb\xc9\x7f\xe3\x5f\xbc"
- "\xb4\x71\xdf\x78\x91\xff\xc6\x8b\xfc\x37\x2e\x48\xfe\x1b\xef\x07"
- "\xff\x79\x7f\xef\xab\x77\xec\x77\xa7\xe1\xca\x8a\xfd\xee\xa8\xf6"
- "\x4f\x57\x77\xfe\xe0\xd2\xc6\x7e\x77\xb4\x32\x5d\xdd\x61\x66\xba"
- "\xba\x23\x24\x38\x5d\xdd\x39\x21\xd8\xf7\xc5\x7a\xc7\x7f\xd1\x57"
- "\x58\xfc\x17\xed\x67\xfc\x17\x7d\x89\xe3\xbf\x68\x31\xfe\x8b\x16"
- "\xe3\xbf\x3b\x83\x8c\xff\xa2\x83\x8a\xff\x3c\x74\x25\xda\xd5\x5d"
- "\xd9\x57\x56\x0c\x78\x97\xde\x3f\x5d\xdd\xf5\xd2\xa5\x8d\x01\xef"
- "\x9a\xca\x74\x75\x57\x04\xd3\xd5\x8f\x13\x83\xd3\xd5\x5d\x3e\xf7"
- "\xbf\xed\xef\xfd\xb4\xde\x71\xe0\x84\x71\x57\x56\x1c\xf8\x13\x3f"
- "\xfb\xbf\x13\x6e\xbd\xb4\x71\xe0\x4f\xc4\xfe\xef\x4f\xc4\xfe\xef"
- "\x4f\x82\xec\xff\x4e\xf0\xa3\xff\xeb\xcf\xb8\xdf\xc4\x3c\x8c\x01"
- "\x5d\x79\xfb\x76\x86\x81\xfc\xc3\x32\x08\xd7\x15\x09\xfa\xd2\x80"
- "\xbe\xd6\xe9\x49\x77\x1e\xe8\xcb\xe6\x24\x33\x97\x7e\x4a\xeb\x5a"
- "\x5d\xa4\x0b\x74\xd5\x09\x71\xa0\xc5\xd6\x82\xef\xe8\xfd\x77\x13"
- "\x37\xf1\xd6\xa7\x96\xea\x08\xea\x0b\xe5\xef\xd2\x4c\x84\x98\xb2"
- "\x6a\x8a\xa0\x3f\xcd\x81\x64\x67\x5e\x95\x7e\xc6\xb9\x4f\xe9\x12"
- "\x2b\xa5\xb5\xc9\x0e\xa8\xd3\x06\x6b\x6d\x72\x03\x89\x6b\x26\x23"
- "\xf4\xbf\x40\xbd\xdc\x7d\x0a\xd3\x2d\xb6\x06\x82\xeb\x7e\x0a\x63"
- "\xe0\x9f\x1a\xc2\x9d\xff\x30\x68\x70\xfd\x26\x7c\xaf\x50\x5a\xa3"
- "\xc9\x72\xb6\x48\xd0\xbf\xe7\x98\xaa\xa0\xff\x7f\x18\x74\x6f\xe0"
- "\xfb\x89\x83\x1e\x0b\xde\x2d\x8c\xff\xf1\x9f\x46\x8c\x96\xea\xb8"
- "\x24\x85\x52\xa8\xe3\xa8\x3a\xbb\x8d\x60\x3d\xeb\xec\x66\x92\x95"
- "\x4e\x74\x75\x5d\x2d\x24\xd3\x4e\x6d\x75\xd9\x5f\x90\xb8\x0b\xf8"
- "\x5c\x00\xf1\x34\x71\x0c\xd3\xf7\xdd\xd3\xf8\x4f\x0d\xa3\xad\xdc"
- "\xc4\xf0\xba\x7a\x42\xc2\xd6\x81\xac\x9d\x84\x13\xde\xd7\xe4\x48"
- "\x08\xc8\x2b\xd9\x92\xdd\x44\x40\x76\x3b\x2c\xce\x7f\xa2\x3c\x93"
- "\xe1\xfc\xa4\x9e\xe7\x0d\xa1\x55\x6f\x61\x1a\xca\x16\xe7\x99\x5a"
- "\xd2\x6c\x42\x1e\xe9\x3c\xd3\x5d\x36\xb1\x64\x74\x91\x3a\x27\x21"
- "\x80\x0f\xfb\xb1\x84\x06\xc0\xd7\x84\x20\x79\x7b\x62\xd1\xe0\x8c"
- "\x57\xc6\xb4\x62\xdc\xea\xca\x33\x45\xb1\x3a\x0e\x6f\xeb\x1f\x5f"
- "\x26\x83\x1b\x5f\x31\xaf\x0c\x0c\x5f\x31\x77\x0f\x2e\xbe\x06\x3b"
- "\x7e\x8d\x21\x03\xc3\x57\xcc\x5a\x86\xaf\x9f\x96\x33\x7c\xc5\xa4"
- "\xbb\xf1\x35\xbc\xed\xd2\xe1\xeb\xa7\xf1\x0c\x5f\x3f\x0d\x0f\x0e"
- "\x5f\x31\x8e\xc1\x19\x67\xfd\xef\xe9\x18\x6b\x03\xbe\x44\xfe\xba"
- "\xa6\xc9\x0f\x7c\xc9\xf8\xeb\xde\xcf\x07\x86\xaf\x7b\x7f\x33\xc8"
- "\xf8\x1a\xe4\x98\xfb\xde\xc4\x81\xe1\xeb\xde\xd3\x0c\x5f\xf7\x86"
- "\x30\x7c\xdd\x7b\xd2\x8d\xaf\x6b\x9a\x2e\x1d\xbe\xee\xd9\xcb\xf0"
- "\x75\x4f\x7a\x70\xf8\xfa\xef\xa0\xd6\xbf\xea\xdd\x3f\x98\xbc\x0b"
- "\xfb\x07\xae\xbc\x0a\x91\xbf\xae\x3d\xd1\x3f\xbe\x2a\x64\xfc\x35"
- "\xf9\xc1\x81\xe1\x6b\xd2\x85\xc1\xc5\xd7\x60\xf7\x13\x26\x99\x07"
- "\x86\xaf\xc9\x93\x19\xbe\x26\x25\x33\x7c\x4d\x9e\xe0\xc6\xd7\xb5"
- "\x27\x2e\x1d\xbe\x26\x85\x33\x7c\xfd\xf7\xc9\xe0\xf0\x35\xd9\xf7"
- "\xfa\xcf\x01\x8d\x6b\xc7\x6a\xb0\x4f\x03\xf8\x12\xf9\x6b\x62\xae"
- "\x1f\xf8\x92\xf1\xd7\x7d\x6f\x0f\x0c\x5f\xf7\xcd\x1e\x64\x7c\x0d"
- "\x72\xdf\xe6\x3e\xfd\xc0\xf0\x75\x5f\x09\xc3\xd7\xcf\xaa\x19\xbe"
- "\xee\xdb\xea\xc6\xd7\xc4\xdc\x4b\x87\xaf\x9f\xa5\x33\x7c\xfd\x6c"
- "\x42\x70\xf8\x8a\xf5\x63\xfd\x57\x7f\xc6\xe3\xa7\xa4\x60\x3f\xcc"
- "\x95\x57\x29\xf2\xd7\x53\x53\xfa\xc7\x57\xa5\x8c\xbf\xa6\x0c\x1f"
- "\x18\xbe\xee\xff\xcb\xe0\xe2\x6b\xb0\xfb\x63\xf7\x67\x0f\x0c\x5f"
- "\xf7\xbb\x18\xbe\xee\x37\x30\x7c\xdd\x6f\x77\xe3\xeb\xa9\x29\x97"
- "\x0e\x5f\xb1\x27\x19\xbe\x62\xb7\x06\x87\xaf\x29\x7e\xac\xff\xe3"
- "\xef\x73\x84\xa9\xf5\x03\xeb\x43\x4e\x5d\x38\x30\x8c\x4d\xbd\xe1"
- "\xca\xee\x43\x3e\xd0\x3c\x30\x8c\x4d\x9d\xc7\x30\xf6\x40\x1e\xc3"
- "\xd8\xd4\x84\xcb\xd3\x87\x7c\x20\x86\x61\x6c\x8a\x23\x38\x8c\x4d"
- "\x1d\xc4\xe7\x1f\x3f\x9f\x30\xb0\x7e\xe4\x43\xb5\x03\xc3\xd8\x43"
- "\x6b\xaf\xec\x7e\xe4\x43\xd3\x06\x86\xb1\x87\x0e\x33\x8c\x3d\x68"
- "\x63\x18\x7b\xa8\xea\xf2\xf4\x23\x1f\x2c\x66\x18\x7b\x30\xc8\xe7"
- "\x36\x3f\xf7\x63\xfe\x9b\xbf\xcf\x6d\x1e\x2e\x1a\x58\x5f\xf2\xe1"
- "\x1f\x0f\x0c\x63\xd3\x3e\xbb\xb2\xfb\x92\xd3\x76\x0d\x0c\x63\x0f"
- "\xdf\xc6\x30\x36\x2d\x9e\x61\xec\x61\xfd\xe5\xe9\x4b\x4e\x23\x0c"
- "\x63\x3f\x37\x07\x87\xb1\x87\x77\x0e\xde\xf3\xa6\x47\x9d\x03\xeb"
- "\x4f\x3e\xfa\x9b\x81\x61\xec\xd1\x07\xaf\xec\xfe\xe4\xa3\xba\x81"
- "\x61\xec\xd1\x7c\x86\xb1\x47\x4c\x0c\x63\x8f\xae\xbf\x3c\xfd\xc9"
- "\x47\x92\x18\xc6\x1e\x89\x0a\x0e\x63\xd3\xfd\x58\xff\xdf\xdf\xe7"
- "\x64\x33\x13\x07\xd6\xa7\x9c\xd1\x39\x30\x8c\xcd\x78\xe7\xca\xee"
- "\x53\xce\x48\x1f\x18\xc6\x66\x7c\xcd\x30\x36\x23\x92\x61\x6c\x46"
- "\xcb\xe5\xe9\x53\x4e\xaf\x66\x18\x9b\x9e\x13\x1c\xc6\x66\xa6\x0c"
- "\xde\xf3\xbd\x59\x87\x06\xd6\xaf\x9c\xf5\xf4\xc0\x30\x36\x4b\x7b"
- "\x65\xf7\x2b\xe3\x1a\x06\x86\xb1\x59\xb3\x19\xc6\xe2\xb2\x19\xc6"
- "\x66\x4d\xbf\x3c\xfd\xca\xb8\x71\x0c\x63\x33\x83\x5c\x8f\x62\x56"
- "\xaf\xf5\xaf\x16\xa6\xae\x98\x97\xb2\x30\x49\xbf\x30\x35\x7d\xd9"
- "\x52\xfd\xf2\x85\xab\x16\x4c\xbe\xf5\xc5\x71\xfa\x65\x19\xfa\x65"
- "\x0b\x53\x9f\x17\x13\x92\x46\x92\x5f\x2c\x48\x99\x97\x81\x29\x90"
- "\xfb\xf9\xd4\xc5\x0b\x52\xd3\xf5\xcb\x16\x2c\x7d\x71\xe1\xb2\x05"
- "\xf8\x7d\xb9\xfe\xb9\x25\xcb\x20\x61\xfe\x82\x85\x2b\x16\xe8\x9f"
- "\x7d\xf1\xb9\xe7\x16\x2c\x5b\x3e\x92\xcc\x78\x31\x25\x7d\x61\x5a"
- "\xca\x02\xfd\xd4\x19\xf7\x8f\x8f\x7f\xf0\x97\xf1\xf7\xdd\x87\x9b"
- "\x93\xc9\xf6\x26\x8b\xa4\x79\x07\x12\x01\x73\xea\x33\xdc\x93\x2f"
- "\xd5\x45\x10\x61\x7f\xdc\xcd\x6d\x44\xb7\x69\x19\x51\xe7\xb4\x91"
- "\x90\xfc\x36\xa2\xd1\x2f\x22\xb1\x74\x13\x8f\xe9\xe1\x34\x7f\xa2"
- "\x8e\x16\x6c\x68\x81\xcf\x59\x36\xed\x4d\x42\x5e\x9a\x3f\x36\x06"
- "\xcf\x81\x6c\xd5\x90\x6e\x6a\xe2\x9e\x8c\x81\x73\xd6\xac\x2f\x08"
- "\x47\x47\xfe\x82\xbc\xcb\xdb\xb8\x03\xc8\x2a\xd0\x76\xc2\xfd\x32"
- "\x02\x0e\x35\x1c\x7b\xe1\x38\x04\x47\x3d\x1c\x0e\xc2\xc5\x13\x38"
- "\xc2\xe1\xd0\xc3\x31\x0e\x8e\x09\x70\x4c\x82\x63\x2a\x1c\xd3\xe1"
- "\xa8\x86\xa3\x05\x0e\xc8\x3b\x5b\xc7\xca\x99\x1d\x09\xc7\x34\x38"
- "\x0a\xe1\x80\xb2\x1e\x37\xc3\xd1\x4a\xb8\x5f\xe5\xc1\xa1\x81\xc3"
- "\x00\x47\x34\x1c\xf1\x70\x40\xcf\x7b\xb6\x9e\x9d\x4b\x80\xb4\x84"
- "\x14\x02\xf5\xec\xff\x48\xc0\xfc\x5b\xe1\x30\x11\xee\x09\xb8\xe7"
- "\x13\x6b\xe0\xa8\xf1\xc8\x17\x2e\xfb\x1e\xdd\x4f\x99\xb3\xc2\xd6"
- "\xdd\x64\x15\xf6\xc0\xe3\x7e\xf9\xa2\xcb\x48\x86\xb9\xf2\x6f\xb2"
- "\xa6\xdd\x4e\x54\x67\xb9\x5f\xde\x6f\x59\x8f\x3c\x33\x51\x27\xec"
- "\xe9\x08\xbf\x51\x66\x1d\xb9\xbf\x8c\xb5\x92\x2d\xd3\x70\x4f\xb3"
- "\xc0\xf0\xf6\xcb\x58\xf1\xfa\x6c\xab\xea\x76\x83\xb0\x07\x5c\x6e"
- "\xfb\x54\x9a\x95\xf0\x86\xb0\xf7\x1b\xca\x10\xed\x20\xa7\xad\x98"
- "\x86\x9c\x8b\x44\x9b\x37\xaf\x12\xea\x75\x03\x35\x92\x50\xb8\x3e"
- "\x82\x42\xdd\x6c\xda\x0d\x2d\x50\x4f\x35\xfe\x86\xba\x92\x4e\xad"
- "\x39\x16\xbf\x3b\x4a\x8c\x69\x34\xcf\x8c\x36\xc5\x99\x33\x5f\x23"
- "\x4d\x70\x5d\xa7\xf6\x60\x88\xfe\x91\x30\xda\x84\xd7\x1a\x09\x07"
- "\xf9\x76\x31\x5b\xfd\x65\x44\xa7\x76\x83\xcd\x55\x74\x30\x1a\xd2"
- "\xd5\xae\xfc\x0d\x2d\x62\xf9\xc0\x93\x55\x3a\x2b\x17\x1f\x22\xa4"
- "\x17\x1b\x73\xa4\xef\xf0\xa9\x76\x15\x98\xf7\xe0\xa7\x76\x1d\xb1"
- "\x0b\xbf\x8d\xb1\x84\x7d\xea\x88\xfe\x11\x42\x5a\xb9\xf8\xdd\x77"
- "\x56\x13\x95\xf9\x11\xac\x77\x7c\x46\x56\x35\xe5\xf5\x99\xc3\xe0"
- "\xfe\xf1\x2f\xf5\xdc\xf7\x86\x83\x06\xdc\x3f\x95\xe6\x3e\xa6\x2b"
- "\x7b\x8d\x10\xbc\x16\xeb\xb6\x6d\x14\x51\x97\xbc\x46\x42\xb0\x8d"
- "\x1d\xb9\xf1\x3b\xa5\x7d\xe8\xf0\x1a\x0e\xf2\x3f\xfc\x70\x16\x95"
- "\x95\xbd\xd4\xc5\xda\x13\xce\x64\x1a\x7f\xd2\xaa\xfa\xaf\x28\xcc"
- "\xaf\xbf\x59\x90\xe5\x0d\xe2\x79\x94\x91\x15\xcb\xa7\xf9\x07\x12"
- "\xf1\x37\xee\x73\x17\x06\xe8\xd5\x67\x46\x99\x98\x8c\xcc\xc9\x58"
- "\x0e\xe6\xa7\x05\xfb\xf1\xbb\x89\xe6\x0b\x32\x36\xe8\x53\x49\x6c"
- "\x13\x37\xfb\x7e\xd7\x26\xbb\x1a\xca\x00\xbb\xb3\x87\x40\xfe\x6c"
- "\x41\xde\xf9\x55\xd0\xf6\xd9\x13\xe0\x5c\x48\xcf\xde\x97\x4c\xce"
- "\x2a\xc8\x17\xd1\x91\x3b\x3b\xd9\xaa\xba\x2f\x46\xd0\xf3\x0a\x7a"
- "\x12\xf7\xd8\x6c\x5f\x41\x9d\x71\xce\x4f\x79\xe0\x2a\x02\xe7\x73"
- "\xac\x64\x6a\x88\xd4\x46\xa6\xfb\x9e\x72\x6e\xc0\xdf\xb6\x11\x42"
- "\x39\x7b\xbc\x95\x03\xf7\xce\x98\xeb\xd4\xab\xba\x2e\xd2\xfa\xcd"
- "\x8f\xa3\x1c\x09\xed\x5a\x41\x6b\xd6\x4e\xa3\x8e\x82\x13\x84\xd4"
- "\x26\x37\x12\xb0\xf9\xc8\x50\x15\xb5\xc5\xbd\x44\xc2\x42\xd3\xc2"
- "\xe8\x91\xea\x46\xb2\x7a\x1a\x6d\xc1\x7d\x7f\xeb\xec\xcd\x64\xcd"
- "\x27\x44\x93\x55\x4b\xc2\xd7\x4c\xa3\xb6\x9a\xc4\x46\xc2\xd2\x6b"
- "\x49\xd6\x67\x44\xbd\xfa\x10\x75\xcc\x04\xfe\x3f\xd6\x88\xe9\xcd"
- "\x04\xf7\xa8\xcc\x6a\xa1\xce\xcc\xa7\x89\x06\xbf\xd7\x1e\xc2\xf4"
- "\xcf\x49\xd6\x39\xa2\x8e\xcb\xb0\x85\x95\xc2\x3d\xf1\xfa\x32\xa8"
- "\x0b\x7f\x91\x56\x6d\xbe\x48\xc8\xea\x27\x48\xc4\x9a\x79\x44\x17"
- "\xe7\x22\xd4\xe2\xfc\x0b\x89\x73\x51\xf0\x2f\x87\xc9\xda\x85\x24"
- "\x24\xce\x89\xef\xb1\x9d\x22\xb8\xef\x77\x19\xe4\x85\xb6\x99\xb1"
- "\x6d\xab\x4f\x93\x08\xdc\x07\x9d\x5d\xf3\xbe\x78\xcd\x69\x82\x32"
- "\xeb\xd4\x4e\x8c\x75\xe4\x4f\x34\x43\xdb\xd7\xa0\x0c\xe0\x3e\xf5"
- "\x3c\x5e\x07\xd7\x6f\x5e\x26\xc8\x40\x35\xd7\x49\x34\xae\xfc\xfd"
- "\x2d\x73\x33\xcc\x42\xb9\x56\xee\x71\x53\xd9\x32\xa1\x4e\x8a\xbc"
- "\x71\x4e\xda\x6e\xd3\xee\x07\xdc\x3f\x6e\x8d\xcb\xb8\x8f\xe2\xb5"
- "\xa0\xcb\xf0\x8e\xdc\x5f\xe9\x25\x79\x4b\x7a\xb1\x72\xbf\x0a\x07"
- "\x5d\x84\x0f\x4b\x23\x6a\x38\x1f\x6b\x55\x4d\x09\x97\x61\x6d\x17"
- "\xe8\xfc\x2a\x29\xaf\x98\x27\xc9\xaa\x8a\x9d\x23\xcb\x83\xf8\xea"
- "\xc9\x03\xe7\xd7\x5b\x55\xf7\x27\xb1\x7b\xfc\x6a\x2a\xe6\x11\xb9"
- "\x5f\xca\x3b\x8c\xe6\xb4\xda\x5c\x5a\x73\x1a\xe5\xa8\x83\xe6\x6f"
- "\x0c\xa1\xed\x11\x9a\x99\x4e\xea\xe0\xf3\xf7\x23\xcf\x6b\x70\x5f"
- "\x57\x96\x3f\xe1\x3a\x38\xaf\xd3\xaf\x10\xbe\x1b\xf0\x3e\x34\x6f"
- "\xa3\xae\xe7\x9c\x91\x0c\xa7\x25\xc6\x44\xf0\x1d\xba\xb8\x6a\xea"
- "\x70\xe5\x6f\x4c\x2c\x58\x86\xbe\xc3\x9c\x88\x76\xcd\x6b\xab\x22"
- "\x1c\xdb\x0e\xea\x90\x9f\xd0\x46\x68\xde\x7e\xb1\xdc\x5f\xee\x46"
- "\xbb\x61\x5c\xf3\xab\x56\x17\x94\x01\x75\xb2\xc3\xb9\xe1\x4d\x5c"
- "\x42\x22\xbe\x4f\x4a\x73\xce\x8d\x13\xf6\xbd\xe4\x12\x16\x30\xfc"
- "\xb6\xda\x14\xbf\x39\xc1\xe6\x4d\x14\x38\x0b\xf9\x01\xd2\x5f\x71"
- "\xdb\xb0\x20\x37\x8e\x71\xd1\x7e\x1d\xe3\x91\x61\x3c\xe4\x53\x35"
- "\x89\xf6\xd8\x39\xc2\xae\xe9\xc8\x4d\x00\xfc\xff\x60\xa7\xc2\x4e"
- "\x72\xbf\x28\xc4\x3d\x36\xa1\x2e\xc3\xa0\xcc\xd3\xf0\x79\x35\x7c"
- "\x7e\xf6\x51\x35\xea\x5b\x28\xf7\x1a\xfc\xbe\xed\x7a\x6a\x9b\xfa"
- "\x20\xc1\xfd\x34\xc1\xde\x12\x1c\x56\xb2\x54\x83\xe5\x6c\xc2\x7d"
- "\x46\x21\x0d\xf3\x74\xe4\x3e\xa1\x83\x74\xa7\x58\xbe\xc9\x0e\x75"
- "\x55\x96\xff\xc4\xdd\xac\x7c\x56\x2e\x96\x27\x95\x5d\xf2\x3a\x6d"
- "\x65\x65\x3f\x11\x2f\x95\x9d\x0f\x69\x52\xf9\x53\x17\xf7\xdc\x23"
- "\x1d\xce\xaf\x97\xb7\xa1\xe8\x75\x6a\xc7\x32\xe0\x5c\xa1\x95\xbc"
- "\x62\xc3\x73\x39\x90\x86\xd7\xca\x70\x35\xec\xa3\x69\x50\xc6\x21"
- "\xa1\x0c\x93\x95\xac\xcf\xf0\xe0\x38\xad\xc4\x71\x62\x59\x8d\x52"
- "\x59\xb2\x72\x44\x3c\x39\x76\x88\x7a\xc5\x72\x35\x58\x6e\x47\xee"
- "\x93\x1a\x2b\x59\x5e\x23\x6f\x7b\xe7\x88\x76\xa7\x78\xce\x00\x72"
- "\x4f\x52\xda\xc1\xec\x70\x5a\x60\xce\x40\x8e\x13\xcb\xba\x1f\xf9"
- "\x5a\x3a\x8f\x7b\x90\x02\xaf\xc7\xa0\x2d\x09\xdc\x9e\xbf\x1f\xea"
- "\xf4\x64\x9a\x07\x97\xab\x31\x9f\x2b\xf7\xb1\xc5\x25\xb8\x07\xeb"
- "\xf5\xb4\x05\xf2\x6c\x55\xec\x3b\xca\x91\x9f\x41\x5a\xcf\xfe\xa7"
- "\x05\x90\xc7\xca\x3d\xb6\xc3\x57\x9f\x20\xf3\x07\x84\xb3\x14\x5b"
- "\x31\xb6\x46\xcc\x4d\xb2\x44\xda\x89\xa5\x98\x27\x7c\xa9\xb1\x30"
- "\x36\x93\x9a\xcf\x70\x4f\xdd\x8a\xfb\x59\x07\xe6\xaf\x9f\x64\xfb"
- "\x7f\x76\x41\xcc\xb9\xe6\x2e\x82\x3e\xfa\x3c\x37\x67\xb6\xc5\xd6"
- "\x26\xd8\x07\x7c\x17\xe2\x81\x2d\x10\xa3\x62\x9c\x0a\x7d\x83\xe4"
- "\x42\x8e\xc5\xaa\x3c\xe4\x2d\xc5\x74\x8c\x63\x81\x43\xcb\x64\xe7"
- "\x68\xa9\x71\x1a\x93\xdd\x1c\xad\xe0\x2b\xb0\xbe\xce\x9f\x9b\xb1"
- "\xce\x7c\xb1\x71\x1a\xb6\x21\x2b\x83\xf2\x16\x67\x87\x19\x79\x56"
- "\xbf\x02\x63\xec\xa7\xbe\x88\x2b\x21\x94\x2f\x31\x4e\x0b\xac\x0d"
- "\x4f\x09\x7b\x8f\x43\x3f\xe2\xbc\x6d\x8c\x71\x1a\xee\x03\xbd\x39"
- "\x73\x78\xc8\x03\xc5\xd4\xdc\x3e\xd6\x58\xd8\x91\x3b\x47\x23\xed"
- "\xb3\x1b\x58\xb9\x73\x34\x52\xdb\x4b\xc5\xb6\xc3\xbd\x84\x3e\xdb"
- "\x9d\x45\xc2\xfe\xdf\xf0\x7b\xce\x54\x5f\xfa\x02\x8e\xc9\xc0\x6b"
- "\xa1\xed\xb1\x65\x92\x9c\x9c\x36\xdc\xff\xfc\xda\xb3\xdc\x9c\x4f"
- "\xe2\xd6\x98\x89\xb0\xa6\x7f\xfe\xfe\x8c\x00\xeb\x25\x8c\x7f\xd5"
- "\x41\x1f\x26\xce\xf9\x21\x65\x9c\xf8\xb4\x6a\xa6\x58\x1e\x9e\x93"
- "\x74\x55\x2a\xf6\x2d\x02\xbf\xc7\xd3\x3e\xc7\x3f\x64\xed\xd2\xf5"
- "\x6e\xd7\xd3\x7f\x0c\xbe\x5d\x4f\xaf\xf1\xd2\xae\x4f\x06\xb9\x5d"
- "\x56\x3f\xda\xa5\xef\xdd\xae\x67\x36\x05\xdf\xae\x67\xe2\x7b\xb7"
- "\xeb\x99\x3f\x0e\x6e\xbb\x9e\xf1\x39\xff\x41\xd6\xae\xe8\xde\xed"
- "\x9a\x3b\x2f\xf8\x76\xcd\x1d\xd7\xbb\x5d\x73\x37\x0d\x6e\xbb\xe6"
- "\xfa\x7c\xff\xd7\x27\x1f\x16\x98\xcd\x8c\x0f\x13\xef\x0e\x9c\x0f"
- "\x13\x49\x6f\x3e\x9c\xb7\xc0\xcd\x87\xf3\x1e\x0b\x8a\x0f\x0b\x36"
- "\x8a\xf1\xc6\xbc\x31\xbd\xf8\x30\x6f\x23\xf1\xce\x87\x89\x9d\x02"
- "\x1f\xe6\x6f\x0c\xb4\x0d\x87\x7a\xf8\x50\xbb\x91\x28\xf8\x30\xd4"
- "\x6c\xee\xc8\x9d\x17\x19\x1c\x1f\xce\x8b\xec\xcd\x87\x89\x6b\x94"
- "\x7c\x38\x2f\xbe\x0f\x1c\x3a\xbc\xf1\x61\x9c\xf3\x2b\x2a\x62\xc3"
- "\x11\x60\x7d\x76\xf5\x71\xaf\xec\x7e\xee\x95\x1d\xd8\xbd\x9e\xf5"
- "\x39\xff\x03\xfa\xb1\x3a\x88\x41\x74\x6b\xdf\x24\xdc\x19\xe8\xa9"
- "\xd7\x45\x36\x40\x1f\xc1\x41\xee\x48\x03\x4c\x18\xc9\xa4\xba\xe2"
- "\x56\x52\x17\x79\x86\xd0\x11\xe7\x74\xf4\x7f\xb7\xe8\x62\x97\x21"
- "\x36\x9f\x3d\x6e\x49\x77\x04\xa8\xd7\x67\x8b\x25\x6c\xd6\x39\x01"
- "\x9b\x2b\x10\x8f\x49\x2a\x4b\xeb\x59\x11\x9b\xf3\xcf\xf5\xe8\xc7"
- "\xc8\xf0\xe9\x15\x9b\x60\x13\x4a\x6c\xee\x4f\x63\xd8\x9c\x5f\xd1"
- "\x1b\x9b\xfb\xd3\xbc\x63\x73\xfe\x6f\x18\x36\xf7\xa7\x05\xd6\x86"
- "\xf9\x89\x6e\x6c\xee\x4f\x53\x60\xf3\x87\x5b\x74\x1d\xb9\xf3\x4d"
- "\xc1\x61\x73\xbe\x49\x6a\x7b\x89\xd8\x76\x48\x8b\x50\x62\x73\xbe"
- "\xcd\xa7\x0e\x73\x3e\x49\x00\x3e\xd4\x9c\xe5\x92\xcc\x2e\x88\x69"
- "\xf9\xbc\x5b\x1c\xd0\x27\xeb\xc0\xfd\xe4\x29\x37\x81\xd0\x95\x06"
- "\x4d\x07\xf4\x8d\x3b\x3a\x92\x43\xe8\xc8\xd6\xed\xb4\x3b\x02\xed"
- "\x2a\x8c\x76\x18\x42\x41\x66\x51\xf0\x39\xaa\x64\x05\x09\x87\x23"
- "\xa2\x44\x94\x2b\x7c\x8f\xa6\x2b\x23\x46\x16\xac\x20\xe3\xc2\xec"
- "\x24\x04\xea\x90\x10\xb6\x4e\x47\xc2\x9c\x24\x1c\xbf\x53\xe3\x47"
- "\x6a\xe8\xbb\xa9\x71\x5c\x94\xd7\xc2\xfd\x32\xc2\x28\x5d\x6e\x20"
- "\xd0\x8f\x0b\x01\x1d\x44\x94\x71\x74\x8f\x6b\xa5\x81\xa3\xa1\xe6"
- "\xd5\x74\x75\x82\x50\x27\x3e\x6a\xcb\x2c\xc0\xd0\x2c\x9a\x95\x8c"
- "\xf7\x8d\xc5\x7d\x8d\xe9\x0f\xb7\xc4\xd3\x8e\x88\x91\xf9\x17\xc9"
- "\xb8\xb2\x15\x24\xaa\x74\x05\x31\xd0\x6e\x03\x07\x32\x48\x78\x66"
- "\xa9\x0e\xf5\x0e\x6d\x80\x7b\xad\x80\x7b\x81\x2e\x5d\xf9\x70\x2f"
- "\x27\xdc\xeb\x2b\xb8\xd7\x79\x82\xe3\x1e\x11\x65\x46\x76\xaf\xc0"
- "\x64\xbe\x60\x5c\x5f\xe3\xd7\x71\x6b\xc7\xe2\x3a\xbb\xff\x0e\xcb"
- "\xb8\x7a\x1a\x8e\x65\xb7\xaf\x4e\x0e\x10\xef\x0b\x7c\xbe\xff\xb2"
- "\xf9\x5d\x12\x49\x35\x63\x0d\x33\x5f\xf9\x94\x62\x1f\xfb\x95\x77"
- "\xc9\x38\xb4\xb9\x3a\xc7\x39\x42\xb5\x63\x0d\x87\x0d\xad\x81\xde"
- "\xcb\xe7\xfc\xe7\x5c\x23\xad\xef\x8e\x84\x7e\x61\x9e\x39\x67\x33"
- "\x47\x33\xba\x22\x8d\xd9\x47\x4f\x76\x91\xb9\x19\x38\x5e\x4e\x33"
- "\xf4\x4f\x92\x90\x26\x2e\x65\x57\xd6\x27\x38\xf6\xf8\xdc\x1a\xe5"
- "\xd8\xe3\x73\x3b\x08\x97\x3c\x95\x70\x0b\xd3\x09\xb7\xc8\x49\x20"
- "\x9f\xc7\x31\x21\xee\x9d\xb1\x24\xd3\x49\xff\x0d\xfd\xd9\x84\x02"
- "\xe8\x07\xc7\xdd\xa6\xb2\x9a\x57\xe0\x58\x5c\xf2\x64\x90\xdf\x97"
- "\xe0\x83\xc2\xf0\x3b\x96\x97\xb6\x8c\x7c\xef\x2c\x97\x3c\x29\xcc"
- "\x7e\xf5\x34\xa7\xc6\x5c\xee\x84\xfe\x5b\x77\xc4\x41\x5d\x67\x9e"
- "\x39\xb1\x1b\xfb\xb4\xcf\x22\x0f\x3c\x7f\x77\x98\x2a\x1b\xfa\xda"
- "\xb7\x38\x28\x8d\xc0\xf1\xe5\x84\x62\x38\x50\xf7\x82\xde\x47\xb6"
- "\x4d\x45\x7c\x20\x16\xcb\x58\xba\x0e\xf1\xb8\x59\xf4\xd9\xb6\x61"
- "\xb7\x27\xa2\x0d\xb8\xe0\xfa\xac\xcf\x49\xa4\xa5\xd1\x45\x00\xd3"
- "\x09\x73\x5d\x21\x68\x47\x09\xe6\x27\x4f\x90\x33\x69\x84\xcb\xfa"
- "\x9a\x68\x01\x43\x1a\xb4\x07\x1e\xec\x21\xae\x31\xcc\x01\x76\xcd"
- "\x67\x5e\x20\x61\xc8\x13\xb8\x86\xb3\xa5\xd5\x4a\xf8\xaf\x0c\xa1"
- "\x6f\xa4\x92\x70\xe7\x57\xc9\xa3\x6c\x5f\x25\x7f\x6f\x1b\x4f\xc2"
- "\x43\xd3\x88\xae\x24\x15\xb0\xbb\x04\xec\xe3\x3c\xd8\x47\x2b\xb3"
- "\x8f\x1e\xbc\x6e\xf8\xd7\x1e\x7c\x3f\x48\xb0\x8d\x7c\xd1\x36\x56"
- "\x02\x5e\x57\xb8\x6d\xc3\xb9\xc4\xc0\x95\x70\x94\x40\x1d\x41\xee"
- "\x0b\x52\xca\x32\xaf\x46\xde\x27\x74\xac\xd1\x06\xbc\x0b\x6d\xa5"
- "\xce\xf7\x40\x17\xc3\x6f\xe3\xf4\x34\xdf\x5c\x7e\x74\x56\x0b\x71"
- "\xf7\xe9\x52\x76\x77\x8d\x31\x66\xeb\x7f\x41\xbf\x6a\xe2\x92\x27"
- "\x40\x7a\x88\xfe\xf1\xff\xd2\x81\x1e\x77\xb3\x3e\x60\xca\x2e\x1c"
- "\x4f\xb0\x72\xc9\xb8\x1e\x10\xc1\x67\x28\xc7\x84\xf1\xd3\x85\x29"
- "\x90\x97\xb8\x40\xe6\x4e\xcd\x46\x1d\xaf\x31\x67\x98\x17\x75\x09"
- "\xb6\xd9\x0d\x3a\x38\x93\x42\xb8\xb9\xad\x20\x1b\x17\xc8\xa6\x43"
- "\xe0\x8c\x59\x02\x67\xe4\xb4\x6e\x5d\x63\xa5\x7c\x5c\xd2\x30\x0a"
- "\x72\x09\xc1\x31\xa4\x67\xd2\x08\x5d\x7b\x0e\x64\x64\x6f\x40\x7e"
- "\x09\xe5\x57\x32\x0e\x79\x03\xe4\xa3\x6d\x25\x3a\x5a\x70\x93\xed"
- "\xdd\xcc\xea\xe1\x2e\xc0\x39\xf2\x48\xd8\x3a\xd5\x08\xd0\x55\x68"
- "\x1e\xda\x39\xd8\x7d\xd8\x3a\x81\xd7\x04\xdd\x3a\x57\x1a\x6e\xee"
- "\x5e\x69\xd0\xc3\x31\x56\xe2\x1a\xdc\x37\xac\x04\x79\x26\x77\xc1"
- "\x49\xe4\x19\x4b\x86\x95\x38\x41\x96\xa1\xe8\x97\x56\x1a\x22\x05"
- "\x99\x3e\x0f\x32\x7d\x8e\x84\xdc\xe9\x20\x2a\xa8\x97\x0e\xea\x4c"
- "\x6a\x93\x9b\x08\xca\xd8\x05\x76\x84\x72\xee\x46\x0e\x02\xac\x41"
- "\x9c\xa2\x9b\xb1\x50\x4f\x0e\x1b\x4e\x11\x5c\x07\x2a\xab\x93\x7e"
- "\x86\xe3\xb7\x96\x0c\x27\xd8\x9c\xb9\x1c\x65\x0b\xf2\xd2\x1c\x9d"
- "\xe5\x20\xbe\x31\xbd\xe8\x82\x1b\xd3\x8b\x2e\xb8\x31\xbd\xc8\x2e"
- "\x3c\xff\x90\xe1\xba\xb3\x08\x70\xad\x91\xe3\x7a\x91\xf6\x92\xe2"
- "\x7a\x66\xe0\xb8\xde\x76\x5e\x86\xeb\xcc\x6f\x06\xd7\xc7\x12\x04"
- "\x5c\x0f\xeb\x1e\x23\xe0\x55\x67\x71\xfe\x89\x58\xb9\x45\x56\x09"
- "\xb7\x47\x7e\x8f\xb8\x4d\x89\xba\x52\x71\xdb\xd9\x61\xd0\xc3\x31"
- "\xe8\xb8\x85\x32\xfd\xc6\xed\xb1\x84\x2e\x22\xc9\x0f\xf1\x4b\xf3"
- "\xc6\x1a\xf4\x59\xe4\x3e\x90\xdb\xae\xb0\x75\x63\x49\x2d\x93\xe1"
- "\x2e\xfd\xe3\x94\x07\x8e\x78\x1a\xf1\xd4\x65\xa4\x94\xd7\x54\x45"
- "\x64\x1d\x27\x3a\xb8\x47\xa2\xc5\xb9\x9b\x84\xa5\xe1\xf3\xa8\x0d"
- "\xb8\x27\x93\x49\x78\x66\xc5\x11\x35\x9f\x3f\x36\x06\xc7\xae\x70"
- "\x6c\xd1\x95\x7f\x20\x91\xdf\x04\x7d\x14\xed\x44\x1d\x3e\xcf\xa2"
- "\xda\x9b\x48\x47\x6e\xca\x2e\xe9\x59\x8b\xd7\xd8\x44\x73\x20\x11"
- "\xec\x45\x7d\x86\x5b\xfc\x0e\x7c\x72\xf0\xf9\x20\x7c\x0e\x83\x4f"
- "\x61\xdf\xba\xc0\xfc\x5c\x8a\xd0\xff\x05\x5f\xb6\x57\xe4\xc1\xcf"
- "\x04\x1b\xbc\x9d\x68\xcf\x8a\xdf\x3b\x72\x17\x4f\x92\x9e\xdd\xb8"
- "\xf3\xf7\xc8\xa3\x01\xef\x0d\x32\x51\xb3\xe7\x49\xec\xb7\xac\xbc"
- "\x4f\x84\xdf\x44\xad\x87\x3e\x8f\x1e\x9f\xfb\x02\x96\x54\x1d\x34"
- "\xf9\x67\xe2\xe7\x64\xc4\x2a\x8e\xc1\x62\x9c\x27\x72\xad\x55\xbc"
- "\xef\x5e\x2b\xf7\x5c\x8c\xfc\xbe\xde\xe4\x61\xe5\x16\xfb\xdc\xd3"
- "\x27\x30\x59\x2c\xf6\xb9\xff\xe3\x83\x06\x17\x0d\xac\xac\x54\x9f"
- "\xef\x7f\xd2\x48\x63\x6c\x5c\xb9\xcb\xcc\x77\x27\x84\x1d\x5e\x73"
- "\x2e\xc0\xb8\x24\xd5\x67\xff\xd7\xa5\xa9\x8a\x8e\xbb\x6d\x2c\x71"
- "\x15\x1b\x63\x71\xac\x13\x63\xad\x3a\x83\x93\x60\xbc\xf5\xce\x22"
- "\x2b\xd7\x0d\x31\x63\x28\xd8\xe3\x4c\xfb\x87\x74\xf3\x59\x88\x51"
- "\x57\x26\x84\x15\x2c\x22\x93\x9c\x5f\x45\x8c\x7c\x15\x38\xa8\x0b"
- "\xf8\xa0\xeb\xab\xe4\xb0\xba\x34\x07\xe1\x4b\x8c\xb1\x16\x67\x35"
- "\x29\x83\x7c\xc8\xbf\x58\xdf\xce\xaf\x12\x42\x73\x53\xf1\xf9\xc5"
- "\x05\x62\x7e\xf6\xf7\xc0\xbf\x4b\x7e\x3d\x7c\x2d\x70\x0e\x70\x86"
- "\xc0\xc3\x41\x70\x70\xd7\xcb\xb7\x27\xce\x98\x43\x1d\x75\x8d\x27"
- "\x48\x56\x2d\xd1\x65\xbd\x48\xb4\x58\xbe\xc5\x59\xcb\x78\xf9\x09"
- "\xe0\x65\xf8\x5d\x2a\xe3\x65\x61\x7e\x81\x07\x2f\x63\xfc\x5d\xd7"
- "\xdc\x42\x42\xed\xe4\xea\x99\xf6\x30\x47\xa6\x9d\xf2\x18\x8f\x5b"
- "\x9c\xe7\xf0\xdd\xe3\x50\x89\xa3\xb7\x43\xdc\xd1\xbd\x84\xf1\x73"
- "\x89\xc8\xcf\xdb\xcf\x0f\x9c\x9f\xb7\x1b\x81\x9f\x21\xde\xdb\x86"
- "\xdc\x0c\xbc\xbc\xeb\x8c\x8d\x73\x02\x17\x07\xa6\xdb\x34\x9f\xf3"
- "\x3f\x66\x82\xff\x44\x9d\x22\x76\x6a\xcb\x9d\x38\x1f\xe1\xdf\xae"
- "\xd0\x7d\xd9\xe8\x1f\xbb\xc0\x37\xbe\xb3\xa8\x81\x0b\xcd\x00\xdd"
- "\xa6\x7d\x48\x9d\xcb\x13\xc2\x68\x77\x82\xd6\x95\x57\x15\xed\xec"
- "\x8e\x08\xe9\xee\x06\xfd\x02\x5f\x80\xbf\xd2\xd9\x56\x27\x0b\x32"
- "\xe1\xc7\x18\x63\xf9\x0d\x8f\x44\x83\x6f\x8a\x29\x3d\x4f\x26\xd0"
- "\xfc\x7d\x3b\x9c\xf9\xfb\x76\x75\xe7\xef\xdb\x09\xb8\x0c\x85\xf8"
- "\x11\x74\xde\x69\xe6\xf3\xf7\x99\xf9\x82\xca\x6c\x97\xb6\x2a\xda"
- "\xa6\xdd\x57\x0e\xbf\x4d\xfc\x6a\xc0\xc1\x2a\x22\x3c\xd3\xd2\xcf"
- "\x44\x3f\xbc\x74\x9b\x37\x1c\x6c\x33\x06\xe6\x8b\x67\x24\x00\x0e"
- "\x1a\x00\x07\x5f\xcb\x71\xf0\x3e\x71\x1a\x45\x1f\x3d\x9b\x61\x01"
- "\xe4\x2e\xf4\x65\x7a\xfc\xf4\x2f\x8e\x7a\xc7\x43\xa3\x7f\x78\xe8"
- "\xfa\x4a\x89\x87\xe2\x20\xf1\x00\xfe\x35\xa2\x14\xfa\x4d\x9d\x5f"
- "\x19\xb8\x62\xc4\xc3\x29\x37\x1e\xfe\xf0\xff\xd9\xb8\xee\x80\xf1"
- "\xb0\x6c\x4d\x60\x78\x30\x91\x01\xe2\x21\xc7\x8d\x07\x93\xde\x99"
- "\x6f\x1a\xd7\x9d\x6f\x8a\x72\xe3\xe1\x02\xe0\xc1\x14\xeb\xc6\x83"
- "\xc9\x00\xbf\x63\x7a\xe3\x61\xf9\x3b\x97\x17\x0f\xc3\xdb\xbe\x1b"
- "\x78\x48\xf7\xd9\xff\xf5\x81\x87\x81\xf2\x83\x55\x86\x07\xe0\x07"
- "\x13\xf0\x83\x49\xc6\x0f\xe7\x10\x0f\x32\x7e\x30\x01\x3f\x98\xbc"
- "\xf0\xc3\x8b\x15\x97\x17\x0f\xd7\x34\x7d\x37\xf0\xb0\xa2\x38\x30"
- "\x3c\x54\x0c\x90\x1f\x1e\x8d\x71\xe3\xa1\x02\xf8\xa1\x02\xf8\xa1"
- "\x42\xc6\x0f\xa7\x01\x0f\x15\x32\x7e\xa8\x00\x7e\xa8\xf0\xc2\x0f"
- "\x2b\x8f\x5c\x5e\x3c\x5c\x7b\xe2\xbb\x81\x87\x0c\x9f\xe3\xdf\x3e"
- "\xf0\x30\x40\x7e\x78\xb4\x50\x86\x07\xe0\x87\x0a\xe0\x87\x0a\x19"
- "\x3f\xbc\x8f\x78\x90\xf1\x43\x05\xf0\x43\x85\x17\x7e\x78\xe9\x93"
- "\xcb\x8b\x87\x89\xb9\xdf\x0d\x3c\xac\xaa\x0a\x0c\x0f\x95\x03\xe5"
- "\x87\x16\x37\x1e\x2a\x81\x1f\x2a\x81\x1f\x2a\x65\xfc\xb0\x16\xf0"
- "\x50\x29\xe3\x87\x4a\xe0\x87\x4a\x2f\xfc\xb0\xfa\x8b\xcb\x8b\x87"
- "\xa7\xa6\x7c\x37\xf0\xb0\xa6\xa6\x3f\x3c\x48\x58\x40\x5c\x20\x16"
- "\xba\xb3\x12\x08\xf6\x33\xde\x39\xcb\xf0\x80\x38\x10\x30\xd1\x9e"
- "\x10\xe6\x02\x2c\x38\x57\x03\x16\xba\x18\x16\x50\x16\x88\x07\xec"
- "\x57\x60\x7f\x02\x31\xe1\x82\x3e\x85\x53\x0b\x7d\x8a\x75\xea\x08"
- "\xc4\x41\x97\xa6\x9f\x7e\x45\x17\x11\xfa\x7e\xd8\xc7\x3b\xcf\xad"
- "\xfd\xda\x1b\x0e\xb6\x07\x38\xc6\xd7\xd3\xbf\x54\xe0\xe0\xb0\x1b"
- "\x07\x4f\xf8\xe8\x57\x3c\xee\x03\x07\x56\x3f\x70\x70\xbe\x77\x3f"
- "\x73\xa0\x38\xe8\x5a\x22\xe2\x00\xfb\x99\xbc\xd8\xcf\x7c\x16\xfa"
- "\x99\xda\x40\x71\x90\x79\x32\x38\x1c\x54\x90\xc0\x70\xf0\x68\x0c"
- "\xc6\x09\x0c\x07\x15\xe3\x9c\x5a\x88\x15\x14\x38\xe8\x23\x5e\x50"
- "\xe0\x20\xab\xf3\xf2\xe2\xc0\x23\x5e\xf8\x8f\xc5\x41\xb6\xcf\xf7"
- "\x7f\x79\xd0\x3b\xf2\x3d\x8e\xdb\xe3\x7b\x26\xa1\x36\x36\x6e\x84"
- "\xef\x9b\x6c\x4e\x25\x51\xe8\x23\x5c\x2b\x13\xc2\xf2\xce\x93\x49"
- "\x9b\x52\x89\xda\xb9\x1c\xf4\xbf\x8c\xa8\xbb\x38\x42\xba\x96\x27"
- "\x87\xd5\x34\xdb\xd8\x18\x12\xce\x47\x85\xfc\xdd\x79\x6c\x0c\xc9"
- "\xd5\x9e\x10\xba\xa9\x8d\xcd\x81\x35\x3f\xf3\x16\xe8\x76\xdd\x29"
- "\x6f\xba\x7d\x23\x00\xae\xef\x92\x73\xfd\x39\xa5\x6e\xe5\x3c\x5f"
- "\x6c\x94\x8d\x21\xcd\xf4\x31\x86\xe4\x87\x4e\x85\xb1\xfd\xf3\x8c"
- "\xe7\x7b\xc6\x90\x06\x38\xc6\xdf\x0d\x1c\xbf\x9d\x53\x72\x7c\x70"
- "\x3a\x35\xee\xe9\x6b\xdc\x11\xed\x1b\xed\x5a\xb2\xe9\x1e\x1f\x8f"
- "\x76\x0c\xfa\xee\xcc\xdb\xb7\x5e\xf0\xf5\xab\xdd\x36\x8d\xb6\x8c"
- "\x76\x8d\x76\x2c\xf8\x7a\x5c\x93\x78\xc3\xf4\xd8\x52\xd9\xd8\x91"
- "\x4b\x2b\xf2\xbc\x17\x8e\xe7\xfb\xe4\xf8\x97\xbd\xea\xff\xdb\xc0"
- "\xf1\x88\x03\xc9\xbe\xaf\x3c\xdb\x5e\xef\x7b\xfe\x97\x5f\x38\x30"
- "\xa9\xfb\xc7\x81\x89\x00\x0e\xb6\x96\xca\xc6\x8c\x5c\x5a\x13\xf0"
- "\x3c\x1b\x33\x62\x38\x70\x8f\x19\xf1\x9e\x63\x46\x0a\x1c\xbc\x72"
- "\xfa\xf2\xe2\xc0\x63\xcc\xe8\x3f\x16\x07\x1b\xcc\x03\xc4\x81\x1f"
- "\x7c\x60\x42\x3e\x68\x91\xe1\x00\xf8\xc0\x04\x7c\x60\x92\xf1\x81"
- "\x7b\xac\x88\xf7\x1c\x2b\x52\xe0\x60\xe3\xe7\x97\x17\x07\x1e\x63"
- "\x45\xff\xb1\x38\xc8\xa9\x1e\x18\x0e\x2a\xfc\xe0\x83\x0a\xe0\x83"
- "\x19\x93\x4a\x65\x63\x44\x2e\xad\x18\xf7\x79\x89\xf9\xf8\x3e\x63"
- "\xbe\x4d\xe7\xbe\xad\x31\xdf\x95\x8d\x83\x5c\x9f\xcf\x4a\xfd\xc4"
- "\x81\x1f\x7c\x50\x01\x7c\x30\xa3\x50\x86\x03\xe0\x83\x0a\xe0\x83"
- "\x0a\x19\x1f\xb8\xc7\x86\x78\xcf\xb1\x21\x05\x0e\x5e\xbd\x70\x79"
- "\x71\xe0\x31\x36\xf4\x1f\x8b\x83\xbc\x86\x81\xe1\xa0\xd2\x0f\x3e"
- "\xa8\x44\x3e\x68\x2e\x95\x8d\x09\xb9\xb4\x95\xc0\x07\x95\x32\x3e"
- "\x70\x8f\x09\xf1\x9e\x63\x42\x0a\x1c\xe4\xbb\x2e\x2f\x0e\x3c\xc6"
- "\x84\xfe\x63\x71\x50\xe0\x73\x5e\x85\x84\x81\x9e\x31\x00\xea\xc6"
- "\x81\xa0\xfb\xe5\x09\x61\x5d\x9a\x7d\xeb\xa5\xfe\x7f\x5e\xaf\xfe"
- "\xff\xf4\x58\x9f\xe3\x40\x1e\xcf\x97\x85\xbe\x41\xc1\xbe\x6c\xd6"
- "\x4f\xa8\x8a\x46\xfd\xbf\xba\x8a\xf5\x13\xf5\x8f\xa3\xfe\x37\x7b"
- "\xd7\x7f\xa0\x63\x82\x49\xa0\xff\xe6\x3e\xf4\xff\xb4\x8f\x7e\xc2"
- "\x93\x03\xd3\x3f\xce\x77\xec\xfe\x6a\x10\xf5\x2f\x8d\x09\x9e\x26"
- "\xdc\xf6\x01\xf5\x17\x0b\x7d\xea\xdf\xeb\x7c\x92\x72\x36\x9f\x04"
- "\xe7\x92\xd4\xb5\xb4\x90\x4d\x17\x89\x2e\x34\x85\x61\x42\x98\x53"
- "\x02\x98\xc8\x3b\x4b\x26\x39\x59\xdb\x7a\xe6\x94\xe0\x1a\xee\x8c"
- "\x17\xcc\xc2\x9c\x12\x69\x3c\xa0\x67\x3e\xc9\x33\x38\x9f\xe4\xd7"
- "\x9f\x0d\x78\x2c\x00\xe7\x93\xa4\x83\x8e\xed\xa0\xe3\x0b\xa8\xdf"
- "\xc3\x0a\xbb\x56\x8c\x01\xf8\x9a\x47\xe2\xcf\xb8\xce\x25\x98\x47"
- "\x22\x8c\x01\x0c\x8a\x4d\xbf\xb6\xd7\x27\xb7\x83\x1e\x51\x9f\x16"
- "\x83\x53\x18\xd7\x95\x6c\xdc\x92\x51\x4f\x36\x75\x11\x9d\x34\xfe"
- "\x2f\xe9\x14\xf9\x9e\x02\x0e\xe8\x57\x09\x5a\xd4\xe9\xab\xa9\xc0"
- "\xf3\x4b\xdc\x3c\xcf\x5f\xf5\x48\x74\xc9\x2a\xe0\xf7\x55\x64\x82"
- "\x20\xa3\xd0\xca\x6c\x36\x1e\x50\x15\x8d\xf6\x8e\xf6\x4c\xb5\xfb"
- "\x4c\xdd\xa2\xbd\x33\x7d\xd7\x12\xd4\x33\xdb\xeb\x73\xcb\x29\xb4"
- "\x3d\xd4\x79\xa8\xa8\xf3\x52\x1f\x3a\x17\xf4\xad\xd2\xe1\xba\x21"
- "\xf8\x9e\x59\x8f\xce\x9d\x2f\xcb\xc6\x7f\xe4\x3a\x17\xc7\x7d\x78"
- "\xb0\x65\xbf\xe6\x0f\xf9\xa9\xf7\x41\x1b\xdf\x07\xbd\x97\x8a\x7a"
- "\xef\x19\xdf\x1f\x90\xde\xb7\xfa\x7e\xff\x45\xa1\x77\x13\x19\x04"
- "\xbd\xe7\xf4\xd6\x3b\xf6\xff\x51\xef\xa6\x28\xec\xe7\x53\xad\x29"
- "\xa6\x5b\x9c\x37\xd2\x5b\xef\xbf\xa9\xbd\xf4\x7a\x1f\xde\xf6\xdd"
- "\xd0\xfb\xeb\x3e\xd7\x3f\xf3\xd0\xfb\x60\xd8\xbb\xd5\x8b\xde\x45"
- "\x7b\x37\xed\xc4\x7e\x3d\xe8\x5d\xb4\xf7\x73\x5e\xf4\xfe\x3f\x87"
- "\x2f\xbd\xde\xaf\x69\xfa\x6e\xe8\xbd\xc8\xe7\xfc\x0f\xa5\xde\x2b"
- "\x06\xc1\xde\x1f\x8d\xe9\xad\xf7\x0a\xd1\xde\x2b\xa2\xb0\x1f\x4f"
- "\xb5\x15\xa2\xbd\x9f\xf6\xa2\xf7\x6d\xef\x5f\x7a\xbd\x5f\x7b\xe2"
- "\xbb\xa1\xf7\xed\x5b\xfd\xd4\xfb\x20\xd8\xfb\xa3\x85\x5e\xf4\x2e"
- "\xda\x7b\xc5\x4e\xec\xb7\x83\xde\x45\x7b\x7f\xdf\x8b\xde\xdf\xf8"
- "\xcb\xa5\xd7\xfb\xc4\xdc\xef\x86\xde\x8b\x7d\xce\xff\x53\xea\xbd"
- "\x72\x30\xec\xbd\xa5\xb7\xde\x2b\x45\x7b\xaf\x8c\xc2\x7e\x3a\xd5"
- "\x56\x8a\xf6\xbe\xd6\x8b\xde\x4b\x76\x5f\x7a\xbd\x3f\x35\xe5\xbb"
- "\xa1\xf7\xd2\xf5\xfd\x3d\xaf\x97\x74\x2f\x8d\xd9\x08\xcf\x67\x21"
- "\xbe\x97\xf4\x8d\x38\x40\x9d\x23\x16\xe4\x3a\x17\xe6\xf0\x2c\x61"
- "\x73\x78\x30\x6e\xa7\xd0\x17\xa7\x57\x09\xf3\x37\x4c\x42\xbf\x5d"
- "\x8c\xe3\xa9\x4a\x1d\x81\xb1\xbc\xef\x38\xbe\xac\x44\xd2\x77\xb0"
- "\x7d\xb7\xfe\xf4\xed\xd9\x27\xbf\x52\xf4\x2d\xef\xbf\x0d\x8e\xbe"
- "\x77\xa4\x07\xa7\xef\x0a\x12\x98\xbe\x2b\xf4\x4c\xdf\xc2\x3c\x8d"
- "\x18\xb7\xbe\x2b\xa2\x98\xbe\x2b\x0c\xbe\xfd\xf9\x9b\xf9\x97\x5e"
- "\xdf\xca\x31\xf9\xff\x5c\x7d\xbf\x95\xd4\xd7\x18\x0c\xea\x1a\xf5"
- "\xbe\x79\x11\x89\x7a\x75\x11\x1b\x5b\x71\x7e\x15\x21\xac\x4f\x87"
- "\xfa\xc7\x77\x7c\x42\x01\x03\xc7\x12\x6c\xa4\xab\x23\x81\xe0\xbb"
- "\x3c\x38\xef\xa2\x2e\xd9\x4a\x2c\x19\x47\xc9\xa6\x65\x44\x57\x93"
- "\xd8\x46\x66\x96\xd3\x6e\x4b\xa3\x19\xdf\xf1\x56\x9b\x57\x1d\x25"
- "\x74\x89\x61\xe4\x33\x76\xc2\x9d\xe7\x7e\x1b\x89\xf3\x36\xee\xb0"
- "\x83\x4c\xf0\x7d\x1f\xd0\xf9\xa6\xf3\x84\x1c\x06\x14\xea\x9f\x43"
- "\x5d\xff\xf6\xa5\xe1\x2f\x7a\x79\xcf\x27\x90\x71\x19\xf9\xd8\xab"
- "\x17\x5d\xbf\xc1\x0d\xce\xdc\x0c\x69\x5e\x86\x62\x5c\x66\xa0\xef"
- "\x5f\x0e\xda\xdc\x8c\x9d\xd3\xfb\x9a\x6f\x83\xfa\x44\x9b\x76\x16"
- "\xb0\x71\x19\x4b\x46\x35\xc1\x79\x35\x68\xc3\xae\xf6\x88\x90\xd5"
- "\xe9\x60\xeb\x0d\xcc\xd6\x5f\x6d\x83\xbc\x89\xff\x24\x88\x0f\xa6"
- "\xdb\x6e\xa6\xdb\x36\xd4\xed\x3f\x09\x5d\x6e\x18\x79\x9e\xdb\x69"
- "\x47\xfd\xa2\x5e\xb3\x3e\x21\xba\xb9\xb8\x2e\x0a\x72\x3c\xf0\x3b"
- "\xe8\x39\xa6\x6c\x11\x99\x80\xf6\xef\xca\xdf\xb7\xd3\x99\xcf\xe6"
- "\x68\x20\xef\x77\x6b\xcc\xe5\xb9\xcb\x44\xfd\x3f\x89\xfa\x7f\xdb"
- "\xab\xfe\xdf\x08\x76\xec\x5d\xd4\x7f\xd0\xef\xf5\x7c\x53\xf6\xbe"
- "\x64\xb0\xec\xfd\x7f\x7d\xae\x89\xa2\xc4\x01\x1b\xa7\x09\x0c\x07"
- "\x1d\x5e\x70\xf0\xbf\xce\xde\x38\x30\xe9\x01\x07\x39\x4a\x1c\x98"
- "\xa2\x18\x0e\x4c\x06\x38\x1f\xd3\x1b\x07\xbf\x5b\x77\x79\x70\xe0"
- "\xe7\xfb\x3c\xdf\x7a\x1c\x94\xcf\xf1\x13\x07\x41\xf0\xc1\x57\x5e"
- "\x70\xf0\x8e\xda\x0b\x0e\x90\x0f\xac\x1e\x38\x10\xf9\xc0\x04\x7c"
- "\x60\xf2\xc2\x07\xef\x6c\xba\x3c\x38\xf0\xf3\x3d\x9e\x6f\x3d\x0e"
- "\x7e\xef\xd3\xff\x2b\x71\x50\x11\x04\x1f\x7c\xea\x05\x07\x7f\xd0"
- "\xf4\xc6\x01\xc4\x82\x10\x07\x2a\x71\x50\x21\xf2\x41\x85\x01\xe3"
- "\xc3\xde\x38\xf8\xc3\xaf\x2f\x0f\x0e\xfc\x7c\x7f\xe7\x5b\x8f\x83"
- "\x5d\x3e\xdf\xff\xf5\xc0\x41\x10\x7c\xf0\xa1\x17\x1c\xec\x0e\xf7"
- "\x82\x03\xe0\x83\x47\x0b\x3d\x70\x20\xf2\x41\x05\xf0\x41\x85\x17"
- "\x3e\xd8\xbd\xed\xf2\xe0\xc0\xcf\xf7\x76\xbe\xf5\x38\x78\xd7\x67"
- "\xff\x4f\x89\x83\xca\x20\xf8\x20\xcb\x0b\x0e\xde\x8b\xec\x8d\x83"
- "\x4a\xe4\x83\x16\x25\x0e\x2a\x45\x3e\xa8\x04\x3e\xa8\xf4\xc2\x07"
- "\xef\xbd\x79\x79\x70\xe0\xe7\xfb\x3a\xdf\x7a\x1c\xec\xf1\xf9\xfe"
- "\xb7\x1c\x07\xdd\x3d\xfd\x05\x93\x80\x83\xdc\x55\x0c\x07\x6b\x11"
- "\x07\x2d\x6c\xfe\x4e\x9e\x88\x83\x9e\xbe\x42\xb3\x27\x06\xfe\xa8"
- "\xef\xc1\xc0\x17\xee\xbe\x42\x37\xe8\x5b\x18\x0f\x12\xfb\x09\xd2"
- "\x38\x90\xd0\x4f\x80\x7e\x62\x6e\x9b\xa8\x7f\x61\x4c\xe0\x8f\xde"
- "\xf5\x1f\x40\x3f\x51\x31\x47\xc3\x53\xff\x57\xf8\x7b\x3a\xbd\xc6"
- "\x05\x3e\x19\xe8\xdc\x8c\x3f\xf9\xa9\x7f\x29\x2e\xf0\x57\xff\x9f"
- "\x7a\xd1\xff\x9f\xbd\xe8\xbf\x42\xcf\xf4\xff\x68\x8c\x14\x0f\x48"
- "\xe3\x42\x42\x3c\xd0\x4b\xff\x7f\xbe\x4c\xfa\xbf\x32\xdf\xcf\x19"
- "\x7c\xfd\xef\xf5\xa9\xff\x42\x8e\xdf\x03\x87\x09\x0e\x33\x1c\xd5"
- "\x2e\x8e\x3c\x58\xc2\xf1\xc2\xdc\x4e\x5c\x43\xbc\xc4\xd8\xeb\xfc"
- "\x55\xf4\xaa\xdb\x6a\x30\x0f\xe8\x50\xd8\x3f\x40\x2a\x83\xe6\x12"
- "\x94\xa3\x59\xab\x4a\xc4\xf5\xaf\x30\xef\xd5\x52\x59\xda\x75\x24"
- "\x56\x2a\x0b\xda\x97\x0d\x72\x37\x87\xad\x8b\xbd\x0a\xf2\x57\xd3"
- "\xdc\xc5\xad\x90\x37\x44\x28\x73\x9d\x5a\x58\x0b\x54\xca\xeb\x32"
- "\xaa\x70\xcd\x26\x73\x98\x0a\xf2\xb2\x32\x47\x88\xf9\xf4\xbc\x91"
- "\xe8\x85\x7a\x72\x1c\xde\xcf\xb3\x9e\x23\xc5\x7c\x51\xf2\x3a\x6a"
- "\xd7\xc5\x0a\xe5\x89\x79\xae\xa1\x57\x71\x8d\x62\x5b\x0c\xf2\x7c"
- "\xae\x29\x04\xcb\x94\xf2\x69\xc4\xb2\xc6\x29\xf2\xbc\x45\x48\x98"
- "\x4a\xcf\xea\x97\xc1\x11\xb1\x7e\x5a\xcc\xeb\x1a\x99\x62\x76\xa9"
- "\xd4\xd1\x3c\x47\xa2\x15\xd7\x6c\x20\x42\x7e\x31\x6f\xa8\x90\xf7"
- "\xaa\xb8\x09\x90\x77\x82\x28\x73\xb5\x5c\xe6\x62\xbe\x30\x49\x8e"
- "\xf2\x73\x2e\x23\x87\x65\xe1\x79\x1d\xbd\x6a\x66\x0c\xb4\x61\x92"
- "\x94\x4f\xba\x9f\x25\x99\x10\x21\x2f\x47\x7e\x2c\xea\xe4\x5a\x68"
- "\x47\xac\x94\x0f\xd7\x51\x93\xf2\x02\xae\x6f\x28\x73\xcb\x66\x94"
- "\x2b\x37\x35\xdb\xb5\x4e\x3d\xd5\xb3\xcc\xb0\x75\x2a\x2b\xe6\xab"
- "\x6d\x11\xca\x06\xfd\xa5\x4e\x80\xfc\xdf\x13\x65\x34\x8d\xe9\x44"
- "\xd7\xa3\x13\x17\xe7\xc4\x73\xe6\x52\x56\xd7\x70\x31\xdf\xf4\xde"
- "\xf9\xd4\xf2\x7c\xd7\x31\x39\xae\x0d\x07\xd9\xcc\xea\x9d\x37\x44"
- "\x9e\xf7\x7a\x96\x37\x6d\x2f\xe4\x8d\xef\x9d\x57\x27\xcf\xfb\x7d"
- "\x96\x77\xd9\x21\xc8\x9b\xe0\xa5\xae\xa3\x64\x79\x23\x58\xde\xf4"
- "\x93\x90\x77\x4e\xef\xbc\x7a\x79\xde\x1b\x58\xde\xac\x48\xc8\x9b"
- "\xd8\x3b\x6f\xac\x3c\xef\x68\x96\x77\x45\x33\xe4\x4d\xea\x9d\x37"
- "\x5b\x9e\xf7\x46\x96\x37\xc3\x0e\x79\x93\x3d\xf3\x96\x31\xdd\xde"
- "\x2c\xea\x36\x92\xe5\x5d\xad\x86\xbc\x29\x5e\xda\x36\x4c\x28\x97"
- "\xe5\x1d\xc3\xf2\xa6\x36\x40\xde\x34\x2f\xba\x90\xe7\x1d\xcb\xf2"
- "\x6e\x36\x40\xde\x74\x2f\xba\x90\xe7\xbd\x89\xe5\x35\x3a\x20\x6f"
- "\x86\x17\x5d\xb8\xf3\x8e\x7c\x85\x40\x9e\x35\xd0\xce\x7a\x2f\xb2"
- "\x95\x97\xf9\x03\x56\xe6\xc6\x10\xc8\x9f\xed\x45\xb6\xf2\xbc\x37"
- "\xb3\xbc\x9b\x74\x90\x77\xbd\x17\xd9\xca\xf3\xde\xc2\xf2\xbe\x1a"
- "\x01\x79\x73\x7a\xe7\x05\x7b\x63\xf2\xbd\x4b\x94\x6f\x14\xcb\x9f"
- "\xaf\x87\xfc\x79\x5e\xe4\x8b\xe5\x49\x36\x7b\x2b\xcb\xbb\x2e\x0a"
- "\xf2\x16\x7a\x91\xaf\x3c\xef\x0f\x59\xde\xd2\x1a\xc8\xbb\xd5\x8b"
- "\x7c\xe5\x79\xff\x8b\xe5\x7d\xcd\x09\x79\x8b\xbc\xc8\x57\x9e\xd7"
- "\xc0\xf2\x6e\x45\xec\x14\x7b\xa9\xef\xcd\xb2\xbc\xb7\xb1\xbc\xaf"
- "\xb7\x42\xde\x1d\x5e\xf4\x21\xcf\x7b\x3b\xcb\xbb\xa3\x0a\xf2\xee"
- "\xf4\xa2\x0f\x79\xde\x1f\xb1\xbc\x45\x88\xf5\x72\x2f\xfa\xe8\xc9"
- "\x0b\x7e\x61\x9c\x6b\xe4\xf6\xc6\x32\xcc\xaf\x52\x0b\x73\xd0\x28"
- "\x27\xf8\x77\x21\x2f\xe0\xc4\x2c\xf2\xdd\x78\x56\x66\x31\xda\xa5"
- "\xf0\x9e\x22\xe6\xa9\x75\x08\x7c\x04\xfe\xc5\xf9\x93\x32\x37\x77"
- "\xdf\xc1\xf2\xfe\x1a\xb1\xbb\x57\xce\xa1\x94\x53\xcb\xf3\xdd\xc9"
- "\xf2\xed\x41\x5e\x30\x29\xf3\x85\xb8\xf3\x8d\xdc\xb9\x15\xce\x57"
- "\x95\x7a\xf0\x31\xd4\x53\x5e\xd6\x8f\x59\x59\xff\x5b\x0c\x79\xcd"
- "\xca\x7c\xce\xbb\x64\xf9\xee\x62\xf9\xca\x77\x42\xbe\x43\xca\x7c"
- "\x7a\x79\xbe\x9f\xb0\x7c\x7f\xc2\xba\x55\x2b\xf3\xc5\xca\xf3\x4d"
- "\x70\xe5\xfe\x7e\x97\x90\x77\x9d\xba\xc6\x53\x7e\x20\xeb\xbb\x64"
- "\x3e\xed\x6e\x57\xee\xae\xbd\x62\xde\x7a\x49\x86\x82\x9c\x19\xe6"
- "\x39\x11\xf3\x13\x5d\xb9\xef\x56\x89\xf9\x4e\xca\xfd\x80\xcc\xd7"
- "\xfe\x94\x8e\x7c\x6b\x97\xe8\x47\x85\xf7\x01\x80\xdf\x1b\xbd\xc5"
- "\x1b\x69\xb7\x93\x6b\xce\x72\xef\xaf\x61\xbe\x47\xda\xaf\xeb\x03"
- "\xb6\x6f\x72\xb1\x31\x31\xce\x4e\x9d\xf2\xb4\xcd\x1c\xad\xbf\xd3"
- "\x4e\xd4\xb8\x66\x2a\xd5\x9a\x73\xac\x90\x6e\x1b\x63\xcc\xee\xc8"
- "\x7d\x3f\xc7\xaa\x7a\x38\x02\xd7\xf4\x83\xef\x5b\xad\x24\xbf\x08"
- "\xbf\x6f\x36\x52\x07\xc8\x44\x85\xfb\xbb\x94\xc1\xf7\x02\x38\x84"
- "\x3d\x55\x20\xae\xa3\x1b\x48\xac\x79\x85\x93\x9c\xc9\x20\x1c\x5f"
- "\xb0\x51\xaf\x5f\x86\xeb\x0a\xbe\xff\x19\x5d\x99\x3c\x09\xea\x12"
- "\x0b\xf7\x4d\x6a\x82\xdf\x42\x5d\xa0\xfd\xe0\x1b\x27\x99\x97\xe1"
- "\xda\xa2\x1f\x5c\x67\xd3\x1e\x88\xa5\x2f\x3f\xf5\x45\x5a\x26\xb9"
- "\xe9\x2c\xf7\x41\x78\x3b\x70\x43\xfb\xca\xe4\x9f\x61\x19\xbc\x76"
- "\xe3\x24\xc8\x53\x8f\x6b\x12\xd2\xa2\x83\x7a\xb6\x5e\xe1\x07\xc2"
- "\x7a\xee\x50\x9f\x7a\x1a\x69\x9c\xc5\x77\xad\xcf\xc6\xbd\xe1\xcc"
- "\x99\x67\x49\x93\xec\x9c\xed\x86\x83\xc2\x5a\x86\xd0\xbe\x59\xae"
- "\x9c\x56\x07\x1f\xd2\x6a\xa7\x39\x1d\x26\x4b\x8a\x95\xb0\xbd\x60"
- "\x3e\xf8\x9c\x86\x3e\x61\xe1\x73\x5a\x1b\x21\xbd\xdc\x62\xef\x12"
- "\xd2\xa1\x8c\x62\x8c\x3b\xdb\x43\xda\x9d\x34\xc7\x4e\xcc\xa3\xbb"
- "\x48\x33\xf7\x81\x60\x5f\x98\x4e\x37\x75\x98\x50\x56\xfc\xa6\x8e"
- "\xf2\x61\x11\x44\xdd\x3e\xa2\x1d\xe4\xf4\x41\x95\x55\xdc\x93\x44"
- "\xba\x17\x96\x6b\x15\xcb\x82\xf3\x8d\x56\xd5\x6d\xb1\x6c\x9d\xc4"
- "\x0f\xc2\xfb\x98\x23\x12\x46\xf3\x37\x26\x74\xe4\x7e\xa8\x81\xd8"
- "\xb2\x8a\xe9\xe0\xc3\x08\xab\x4a\xaf\x11\xbf\x47\x59\x55\xb7\xa4"
- "\x8b\xdf\xa3\xad\xaa\xfb\x32\xc4\xef\x3d\xeb\x3f\x7a\x5f\x8f\x72"
- "\xe3\x38\x90\xf9\x54\xfe\x8d\x84\x10\x8c\x8b\x31\xd6\xa7\xda\x8d"
- "\xe3\xf4\x63\x71\x1f\xc2\x0f\x4f\xc2\x3d\xa7\xb2\xbd\x00\x3e\xdc"
- "\x06\x9f\x61\xe2\xa7\x4d\xfc\xa4\x98\x47\xc0\x55\xa4\xb1\x9e\xe6"
- "\xed\x8f\x40\x79\x67\xba\x28\x0f\xe5\x26\x83\xec\xf6\x58\x32\x5a"
- "\x44\x99\x7e\x28\xec\x81\x2c\xe8\x14\xf4\x4e\x47\x74\xec\x11\xee"
- "\x95\x7f\x20\x56\x5e\xaf\xe8\x1f\xdf\xf5\x93\x09\x77\x4f\xfc\x69"
- "\xcc\x3d\xf3\x9e\x9d\x9f\xb4\xe0\xb9\xe7\x93\x17\x2e\x7a\x21\x65"
- "\x71\xea\x92\xb4\xa5\xcb\x96\xa7\xbf\xb8\x62\x65\xc6\x4b\xab\xa0"
- "\x9c\x9e\x3d\xe8\xe8\x1b\x53\x55\x76\x8e\xc0\x3d\xa6\xc0\x3d\xcc"
- "\x77\x0b\x75\x81\x34\x86\x07\x73\x94\x5a\xef\x5d\x9e\x96\x08\xe8"
- "\xf7\xdc\x8c\xfb\x7f\x99\xd7\xe1\xbe\x37\x80\x3d\x95\xa5\xf8\xe7"
- "\x66\xdc\x37\xad\x99\x33\xa7\xd7\xd9\x7e\x6e\xc6\x7d\xfb\x3e\x8a"
- "\x68\x21\x51\x37\xe3\xde\x6a\xe6\x44\x3c\x5f\xf6\x43\x42\x0e\xc1"
- "\xb5\xde\xca\xbc\x59\x47\x22\xb6\x5c\x4f\x6d\x5b\xaf\xa7\xad\x58"
- "\xfe\xd6\xd7\x69\x8b\x6d\x75\x32\x29\x80\xdf\x80\x59\xdd\x19\xee"
- "\xc0\xdd\x1f\x41\xa4\x0d\x31\x74\x64\xe9\xeb\xb4\x79\xfd\xf5\xb4"
- "\xf9\xe5\xd7\x69\x6b\xd9\xf5\xd4\x1a\xb5\x95\x68\x3a\x72\xcd\x2d"
- "\x56\xce\x2c\x60\x61\x33\x9c\xe7\x47\x7e\x68\xdd\x0c\xe7\xee\x74"
- "\x92\x61\x65\xf0\x1b\xd2\xec\x1f\xe9\x59\xbd\xdf\x6b\x73\x0c\x87"
- "\xf6\xd5\xd0\xee\x14\x55\x01\xdc\x87\xe9\xe8\xc0\x13\x87\xc0\xfb"
- "\xc3\xfd\x6c\x16\x47\x13\xb1\x72\x07\x12\x70\x3f\x29\xb8\x5f\x98"
- "\xa5\xa8\x95\x60\x79\xef\x2e\x73\x0c\x5f\x3e\x9a\x3a\x21\x6f\x0c"
- "\xbf\x3a\x45\x05\x79\xc2\xa1\x6c\xbb\xbc\x3d\x86\xe7\x16\xa7\xeb"
- "\x53\x5f\x4c\x49\xb9\x6d\x24\x31\x08\x9f\x8a\x3d\xff\xd2\x71\x2d"
- "\xda\x2d\xaf\xd3\x43\xd0\x4e\x33\xb4\xb7\xba\x16\xa2\x7d\xc0\x0b"
- "\x81\x36\x15\x42\xb9\xbb\x21\xbd\x0a\xbe\x57\x41\xdd\xab\xd9\x3e"
- "\x71\x27\x3e\xa1\xb9\x07\x92\xa0\x9e\xe8\x6f\xf4\xb8\x76\x6d\xfb"
- "\xca\x78\x15\xb4\x7b\x2b\xe4\xab\xd6\x8f\x26\xb7\x9e\xe1\x0e\xde"
- "\x0d\xf5\xd8\x09\xdf\x31\xbf\xc0\x07\x90\xff\x10\x6b\xd7\x89\x23"
- "\xf8\x1b\x64\x65\x2e\xb9\x9e\xe6\x75\xe4\x1e\xd4\xe1\x9a\xdc\xc2"
- "\xde\x45\xf0\x1b\xe4\x52\x0d\x79\x0b\xdb\xb3\xe2\x55\xd0\x67\x54"
- "\x95\xf5\x94\x79\xc0\x8a\x75\xc2\x7a\x60\x3f\xf4\x18\x44\x7d\x7c"
- "\x77\x02\x19\xef\x20\xaa\x63\xc0\x74\xc5\xaf\xd3\x1d\x70\x14\xc3"
- "\x51\x74\x14\xce\x1d\x81\xa3\x1a\xd2\x6b\xe0\xf3\x28\x7c\x1e\x81"
- "\x03\xfa\xb1\x11\x58\xef\xe5\x6b\x68\xcb\x9d\x45\xe4\x16\x2c\x1f"
- "\xb0\xf5\xab\x26\xee\x44\x34\xd6\x1d\xd7\xbc\xa7\x23\x0f\xee\x54"
- "\xae\x13\x0e\x08\x81\xf3\xf0\x39\x8e\x7d\xca\x8f\x43\xe9\x70\x6c"
- "\x15\xbf\x37\xc2\xa1\x16\xbf\xdb\xe0\x70\xf6\x7f\x78\x96\xe7\xeb"
- "\x38\x9c\xec\x7f\x5e\xbf\x8e\x9d\xfe\xe5\xfb\x9b\x9e\x70\x47\x80"
- "\xed\x8f\xec\x51\xa6\x1f\xc9\x61\x69\x75\xf1\xec\x77\x5d\xa2\xf8"
- "\x99\x07\xbd\x79\x90\x93\x05\xca\xb7\x54\xb3\x34\xcb\x49\xf8\x8c"
- "\x84\xc3\xe0\x71\x7f\x2c\x53\xc0\x55\xb7\x11\xfc\x05\xe8\xd2\xca"
- "\x1d\x4c\x47\x1d\x6d\x66\xd8\x52\xf1\x54\x48\x4b\x03\x6c\x15\xbb"
- "\xf1\x73\x68\x81\x12\x3f\x87\x66\x79\xe0\xa7\x10\xb9\x08\x6c\xa1"
- "\xaa\x8c\xe1\xa5\xaa\x7d\x75\x12\xfc\x3e\x14\x0f\xe5\x54\xe1\xf8"
- "\x08\x94\x21\xc4\x00\x9b\xcf\x12\xa2\x4d\x26\x6a\xe4\x97\x56\xee"
- "\xd0\xdb\x88\x59\xbc\xb7\x78\x5f\x56\x17\xa8\x1f\xa4\xed\xc0\xfa"
- "\x2d\x81\x72\xe1\xf7\x4e\xc8\xb7\xc3\x42\xda\xa4\xba\x09\xd7\xe4"
- "\x2e\x02\x3c\x8a\xf5\xc5\x32\xf1\x3a\xea\x6e\x57\x1a\x5e\xc3\xee"
- "\x7d\xf8\x09\x48\xc7\x7e\x2d\xbe\xfb\x34\xcc\xe2\xb4\x12\xc4\x24"
- "\x7e\x5a\x9c\xd1\x60\x4b\xd3\x08\xdf\x91\x40\xee\x8c\x20\xd1\x60"
- "\x6f\x23\x9a\xb8\xc3\x93\xee\x58\x43\xa2\xb1\x3c\xe4\x74\x2b\x77"
- "\x98\x94\xa1\x2d\xb2\xb2\x04\x3f\x88\xe5\x1f\x4d\x23\xc2\x7d\x4a"
- "\xb1\x3e\x70\x5e\x76\xdf\xad\xd8\x87\xdd\xbc\x8a\xb5\x15\xee\xb5"
- "\x13\xae\xdf\x83\x6d\x47\x79\xc2\x79\x13\x94\x53\x84\xe7\x84\x7d"
- "\x83\x58\x7b\x76\xe2\xde\x12\x28\x0f\xcc\x8f\xfb\x50\xb2\x35\xc2"
- "\x0f\xbc\x2f\xc8\x0d\xae\x47\x7d\x50\xb8\x07\x96\x91\xe5\xa4\x4e"
- "\x0a\x7c\xf4\xdb\x55\x0e\x88\x3b\xfe\x76\xad\x52\x3f\x87\x6d\x72"
- "\xfd\xc0\x75\x7b\xe0\xfa\x43\x14\xda\x88\x7c\x02\xf7\x0c\xc3\x58"
- "\x03\xd2\x0a\xf9\x5c\x28\x63\x85\x43\x18\xd3\x81\x72\x90\x53\x0a"
- "\xb1\x1c\xa8\xcf\x21\x56\xd6\x5f\x27\x1d\x58\xa3\xd4\xb5\x58\xde"
- "\x4e\xd4\xb9\x60\xcf\xab\x84\x36\x01\x77\xfd\xf5\x78\x29\x3b\x67"
- "\x82\x3c\x26\xda\x3d\x8d\xe0\x5e\x0d\xcc\x97\x08\xe7\xf6\x66\x75"
- "\x0a\xfa\x3d\xc4\x78\xed\xaf\x5f\x2f\x5f\x4b\x5b\xdc\xf5\xfe\x6b"
- "\xb9\xb4\xdf\x85\x58\xef\xbd\x78\x3f\xba\x72\x8e\xe0\x57\xf1\x1e"
- "\x78\xbd\x58\xde\x7a\x2c\x4f\x92\xd5\x1d\x50\x0f\x26\xaf\xc3\x26"
- "\x48\xdf\x89\x58\x14\xe4\x06\x3c\xda\x9e\x85\x58\xfc\xeb\x2e\xb8"
- "\xbe\xaa\x00\x7f\xaf\x14\x7e\xc7\x0a\x1c\xdb\x73\xfe\xb0\x1d\xcf"
- "\x5b\x5a\x40\x6f\x2f\x00\x96\x78\x42\x6e\x09\x27\xd1\x76\xa3\xd0"
- "\xb6\x5d\xf6\xd5\x53\x55\x1f\x39\x09\xc1\x7a\x82\x8c\x4c\x1d\xb9"
- "\x7f\x8b\x07\x5f\xb3\x15\xeb\x0a\x7c\xbd\x97\xfe\x36\x81\x60\x9d"
- "\x81\xcf\xc4\xfa\xfd\xed\xb0\xa8\xfb\xbd\xd8\x46\x94\xe7\x1d\x8c"
- "\xfb\xe0\xdc\x91\x85\x58\x77\x77\xbb\xff\xb6\x43\x2e\x63\xa1\xdd"
- "\xa0\x07\xd4\x17\xea\x45\x56\x26\x62\xbf\x10\xca\xda\xc5\x7e\x33"
- "\x6c\xa0\xac\x0b\xaf\xa7\x35\x98\xdf\x9d\xb7\xfa\x13\x3c\x97\x09"
- "\xf7\xbe\x33\x0d\x7c\x3a\xd8\x05\xee\x59\x02\xe5\xee\xc2\x3d\x46"
- "\xa1\x0c\x13\xca\x14\xea\x32\x1e\xf1\x08\xbf\x6b\xc4\xeb\xc6\x81"
- "\x3f\xc7\x63\x92\xdb\xfe\x8f\x8c\x51\xe2\xab\xda\xd3\xfe\x51\xdf"
- "\x85\x7c\xd6\x34\x22\xe0\x61\x19\xd1\x9f\xe7\xaa\x2b\x44\xdf\x21"
- "\xea\xfa\x88\xf6\x23\xb0\x17\x59\x19\x5b\x3d\x74\x6d\x12\xf0\xb8"
- "\x72\xba\x0a\xdb\x0c\xd7\x9a\xc4\x72\x84\x36\x0b\x78\x32\x0a\x18"
- "\xa8\xa1\x2b\xa1\x9d\x3d\x38\xf8\x9b\x4d\xd4\x73\x8d\x87\x4c\x24"
- "\xee\x9a\x84\x7b\xcb\x21\x27\x75\x18\xc9\xcf\x3a\xba\xdd\xbc\x84"
- "\xba\xe7\x05\xdd\x57\x17\x95\x31\x7f\x2b\xf2\x56\x35\x3b\x7f\xbd"
- "\x02\xc3\x58\x97\x5a\x01\xbf\x58\x97\xac\x39\x58\x17\x93\x50\x8f"
- "\x2c\x3d\x39\xcf\x1d\x99\x8a\xf7\x87\x6b\xeb\x45\x7b\x15\xcb\xfa"
- "\x1b\xda\x7e\xd5\xcb\xc0\x55\x58\x27\xb8\x77\xb4\xc0\x7f\x0f\x09"
- "\x32\x79\x5b\xac\x7b\xb5\xc3\x88\xd7\x1e\x2a\xea\xe4\x84\x6b\xab"
- "\xe1\xbb\xc6\xc1\xf6\x9f\x19\x09\xd7\x97\xe3\x9a\xff\x67\xb8\x3a"
- "\xe4\x0b\x15\x3e\x6f\x3a\xc3\xd5\x9e\xc3\x77\x43\x81\x53\xd4\x50"
- "\x5e\x08\x62\x54\xc2\x45\x2b\x57\x7b\x1a\xd7\xc6\x07\x59\xef\x82"
- "\x18\xa9\x1c\xe5\x8d\x58\x86\x18\x69\x42\x47\xee\x51\x8d\x84\x5b"
- "\xb8\x4f\x31\xca\x9e\xe9\xe7\xe8\x63\x80\x63\x93\x1b\x5b\x47\x1f"
- "\x13\xe5\x58\x0e\x72\x0c\x81\xfb\x1d\x17\xdb\x55\x0e\xf9\x21\x16"
- "\xab\x3d\x20\xd6\xbd\x48\xcc\xbf\x58\xd2\x83\x68\xab\x35\x05\xc8"
- "\xbf\x82\x0e\x8e\xa9\xc5\x6b\x77\xb2\x7b\x1d\x1b\x2e\xe5\xc5\x18"
- "\x91\xed\x2b\x75\x6c\x38\xf2\xe0\x9d\xa0\x7b\x81\xfb\x84\xfd\x77"
- "\x59\x1a\xda\x0e\xbb\x47\xad\xb0\x1f\xc5\xcb\x10\xf7\xb8\x71\x74"
- "\xb4\xd1\x83\x9f\x90\x8b\x0b\xeb\xa0\x0c\xe4\x53\xc4\x12\x72\x2a"
- "\xf6\x61\xa0\x8e\x7b\x45\xfb\x11\xeb\x7c\xec\x61\x25\x56\x6a\xb7"
- "\x01\x56\xc6\xbb\xcb\x3e\x16\xe3\xcd\xcf\x95\x31\x0e\x2c\x16\xdb"
- "\xb6\x49\x6c\xdb\x2e\xb1\x6d\x9b\xc4\xb6\x95\xc3\x3d\x50\x6e\x33"
- "\x64\x72\x04\xb9\xd5\x54\x88\xf9\x4d\xc8\xe5\x6e\x7b\x3d\x76\x41"
- "\xb2\xe5\xde\x7c\x51\xf3\x0e\xda\x83\xac\x5e\xf5\x1e\x7c\x61\xf2"
- "\xce\x17\xc7\x76\x88\xed\xdd\xe1\x61\x1b\x3b\xc5\x78\xf7\x7d\x49"
- "\x0f\x75\xd0\x47\x63\x7b\x28\x1d\x78\x1f\xf9\x13\xef\x2d\xf7\x41"
- "\xa5\x4c\xae\xa2\x2d\xd7\xfc\xa6\xb7\x1e\x6a\x92\xe4\xf6\x8c\xba"
- "\x46\x4e\xc0\x32\x50\xa7\x42\x5c\x09\x69\x4c\xaf\x35\x93\x90\x1b"
- "\xe4\x1c\x0d\x79\xb7\xf2\x14\xed\xa5\x26\x59\x69\x8b\xc7\x4e\x8a"
- "\xb6\x28\xde\xbb\xf6\x1e\xd0\x51\xb4\xec\xbe\x8d\x1e\xf7\x45\xdd"
- "\x1c\x42\x39\x88\x3a\xbd\x55\xf2\x69\x98\x1f\xae\xcd\xe8\xc8\xad"
- "\xd5\x79\xf8\xc7\x42\xac\x1f\xdc\x2b\x47\xe0\xac\xd7\x05\xae\xc8"
- "\xe8\x10\xea\x53\x1b\x5e\x26\xfa\x09\x48\x8b\x66\x69\x35\x56\xd1"
- "\x97\x48\xb8\x79\x45\x59\xa7\xda\x34\xef\xf1\xd1\xb1\x1c\x29\x3e"
- "\x12\xca\x12\xb8\xa8\x36\x5d\x6c\x1f\xa6\x8d\x67\x69\xc7\x26\x61"
- "\x5a\x01\x93\xc3\x56\x2a\xf8\xab\xa3\x56\xd1\x5f\xa1\x7d\x71\xf0"
- "\x7b\x16\xda\x18\xfe\x86\x32\xaa\xb1\x7c\x4b\x76\x17\xf6\x21\x8a"
- "\xac\xdc\x91\x56\xe4\x03\xe4\x0b\x9c\xc3\x2a\x7c\xce\x14\x3e\xaf"
- "\x43\xde\xc1\x38\x04\xcf\x43\xbe\x46\xe4\x22\x48\xbf\x0d\xf7\x6a"
- "\xa5\x5f\x86\x40\xb9\x75\x1a\xf1\xda\xc9\x42\xac\xf0\xe5\xb4\x61"
- "\x52\x9a\x74\x1d\xf0\xd6\x39\xbc\x0e\xaf\x97\xf8\x0b\xb9\xcb\x89"
- "\xdc\xc4\xee\xb7\x4e\xc4\xb8\xd0\x6f\x90\xe2\xa2\x6e\x4e\x96\x17"
- "\xf7\x9e\x61\x9c\x56\xc3\xf8\xac\xee\x7d\xbc\x56\xd0\x1f\x70\x65"
- "\x66\x27\xfd\xac\x6c\x19\x51\x97\xb6\x21\x2f\x1e\xa8\x62\xf5\xb4"
- "\x44\x88\xed\xf8\x4c\x68\x07\xe3\xd4\x42\x56\x97\x03\x55\xa5\x5d"
- "\xc2\x39\x17\xb6\x05\xcf\x6d\x96\x9d\xa3\xdd\x06\x38\x67\x11\xf6"
- "\x58\xf6\xbc\x8e\xef\x4e\xee\x95\x1f\xf7\x1e\x06\x0e\x0d\x29\x7d"
- "\x5d\xe2\x5e\x4b\x11\xab\xa7\x65\xb6\xc4\xbb\x20\xf7\x66\xe4\x5e"
- "\xe1\xdc\x73\x62\x9e\x99\xe2\xa7\xc0\xef\x96\x57\x98\x5c\x23\x38"
- "\x51\xde\xad\x62\x3b\xb6\x09\xfd\xec\x2f\x13\x40\xb6\x96\x35\x92"
- "\x6c\xe5\xdf\xd1\x7e\xe0\xfe\x3a\xfc\x2d\xe0\x7e\x8d\xd0\x87\x2d"
- "\xc6\x3c\x58\x27\xe6\x23\xea\xd2\x3d\x63\x6a\xe8\xeb\x5d\x8b\x7e"
- "\x89\xc5\xaa\xc7\xbf\x16\xc7\x85\x88\x79\xd9\x5b\xe0\x17\xea\x27"
- "\x49\x1c\x43\x3b\xa6\x41\x9f\xbf\x09\xf2\xd4\x0b\x7b\x29\xe1\x7e"
- "\x22\xf2\x3c\xc8\x4f\xef\x75\x59\xc5\x32\xeb\x23\x24\xde\x40\x2e"
- "\xa9\xb3\x37\x89\x31\x5d\x7d\x75\xa9\xc8\x25\xe7\xb9\xfa\x23\xca"
- "\x38\xac\xfe\x88\x92\x33\x8e\x9f\xf6\xe4\x0c\x88\x9b\xd7\x77\xe4"
- "\xd6\x17\x2b\xe2\x00\x48\xeb\x9b\x3b\xea\xd3\xd0\x46\x71\x3f\x39"
- "\x81\x9f\x84\xb1\xae\xe3\x3f\x96\xea\x8c\xbc\xd9\xbe\x5a\x1a\xbf"
- "\x38\x5e\x8b\xb1\x9a\xf2\x7e\xc7\x35\x0a\xee\xc4\xfb\x49\xe5\x81"
- "\x97\x42\x3b\x32\x2f\xc3\xf1\x96\xfa\x46\x91\xe7\x77\x28\xb8\x52"
- "\xf4\x61\xc8\x93\x4a\x5f\x75\xe0\x7d\xa5\xaf\x3a\x5e\xd1\x9b\x23"
- "\x8f\xe7\xf8\xef\xab\x8e\x27\x22\x6f\x49\x1c\xa9\xe4\x82\xe3\x79"
- "\xa5\x8a\x58\xf6\x78\xb8\x14\xcb\xba\x79\xb4\x1e\xfb\x4c\x55\x70"
- "\x7f\x13\xbb\xf7\x09\xc0\xab\x39\x44\xba\x37\x9c\x9f\x54\xa7\x07"
- "\x6c\xe6\x1e\x48\x03\x4c\xb5\x88\x31\xa0\x60\x9b\x5d\xc2\xde\x45"
- "\x96\x68\xc0\xdf\x48\xc4\x99\x39\xb5\x8d\x34\xbb\x7d\xc5\xa1\xf6"
- "\x25\x92\x7c\x4f\xfc\x46\x1e\x17\x96\xbc\x4e\x73\xe0\x3e\x29\xf2"
- "\x36\xe6\x43\xda\x66\x71\x0c\x41\x90\xad\x50\xd6\x89\xd8\xb2\xd7"
- "\x95\x6d\x63\xed\x38\x91\x8e\xed\xc0\x3e\x11\xdc\x7f\x02\xc6\x3d"
- "\x10\xf3\xc1\xf7\x23\xa6\xb2\x1e\xcc\x1f\xd2\x74\x1a\xe5\xf1\xd5"
- "\xc1\x70\xe4\x4a\xb1\xef\x59\x0d\xf1\x4e\xa1\x7c\x2c\x66\xc6\x03"
- "\xb3\xf4\x69\xcb\x16\xa6\xa6\x3f\x77\x97\x7e\x61\xea\xc2\xf4\x85"
- "\xf3\x52\x16\xae\x9a\x97\xbe\x70\x49\xea\xb8\xc5\xf3\x9e\x5f\x38"
- "\x5f\xbf\x72\xde\x72\x7d\x74\xc6\xad\x19\x23\x89\x3b\xeb\xbd\xfa"
- "\x79\xcb\x97\xbf\xb8\x78\x41\x92\x3e\x75\xe1\xfc\xf1\xcb\x16\x2c"
- "\x5f\x90\xae\x9f\xb7\x6c\xc9\x8b\xa9\x49\xfa\x5b\x93\xee\xb8\x35"
- "\x7a\x62\xd2\x48\xf9\x18\xda\xcd\x3a\xd2\xca\x5f\x6c\x69\xd9\x7c"
- "\x91\x84\x84\xa9\xd2\x96\x85\x65\x2c\x4c\x65\x63\x76\x7f\x3f\x7d"
- "\xe7\x56\x92\x06\xe7\x35\xb8\x37\x32\xcd\x3d\x61\x83\x4f\x35\xe6"
- "\x83\x76\xea\xe1\x7b\x08\xd4\x3d\xb2\x23\xf7\xef\x3b\xac\xdc\x3f"
- "\x72\x84\x7d\x8f\x21\x1d\xda\x16\x49\x2f\x56\xb7\x40\xcc\x96\x86"
- "\xcf\xd6\xcb\x2e\x92\xf0\xc2\x15\x44\x0d\x87\x06\x0e\x1d\xa7\xc3"
- "\xb1\xae\xbf\x9f\xb4\x72\x27\x6d\x6c\xdc\xf3\x64\xba\x6d\xc4\x85"
- "\x09\x34\xe7\xc2\x04\xa6\x97\x93\x4b\xa5\x71\xe8\xb8\x57\x48\x1c"
- "\xe2\xb3\x89\x3b\x29\x3c\x2f\x7b\x19\xb0\x8c\x63\xb8\xed\x1f\x4c"
- "\x89\x85\x78\xb0\x11\xc7\x60\xe1\xdc\x52\x3b\x47\x34\x50\x2f\xf5"
- "\x47\x6b\xa2\xc9\x16\xb8\xd7\xf2\x08\x4a\x3b\x72\x4f\xc6\x48\xe3"
- "\x69\xd0\x06\x1d\xb4\xa5\x81\xb5\xe3\xef\x37\x0a\xed\x78\x9d\x46"
- "\x6d\x1d\x05\xf5\x7b\x0d\xeb\x73\x32\x49\x6a\x03\xd4\xbb\xc1\xca"
- "\xfd\xbd\x1a\xea\xa9\xc3\x7a\x79\x1b\xeb\xc3\xf1\x2e\xa8\xe7\x6e"
- "\x7e\x05\xc8\x6d\x2c\xdb\x0f\x6f\x73\x29\xb3\x3f\x68\x4f\x73\x19"
- "\x7c\x2f\x68\x23\x9a\x7c\xdc\xb7\xdc\x78\x13\xad\xb5\x3b\x89\x25"
- "\xb9\x81\x84\xbd\x44\x6d\xf4\xff\xb5\xb4\x88\x6d\x6a\x40\x6e\xf8"
- "\xf3\xa2\x06\x35\xb6\x09\x7c\x85\xa6\xac\xcd\xe7\xd8\xa2\x7a\xcb"
- "\xf5\xd4\x4e\xdf\x90\xc7\x5c\xa7\x84\xfd\x9c\x31\xde\x6a\x37\xe2"
- "\xfe\xd7\xa7\x0c\x70\xef\x6c\x31\x36\xb6\xd3\xee\x39\xb2\x58\xea"
- "\x14\xe2\xcc\xee\xa3\xec\x10\xa9\x6c\xdc\x23\x1d\xaf\x61\xfa\x3f"
- "\xb5\x1b\xae\xb1\xc9\xca\xcf\xf1\x2c\x1f\xcb\x84\xef\x36\xe9\x3e"
- "\xac\x1f\x7e\x0a\x63\x02\x1b\x60\xd9\xe6\xe3\x7e\x51\xaf\xbd\x4e"
- "\x4f\x5a\x20\x7d\x73\x27\x51\x43\xde\x93\x65\xaf\x0b\xe5\xb7\x80"
- "\xdc\xa7\x63\xf9\x2f\x5f\x4f\xc8\x7a\xc8\xd3\x9e\x7b\x32\xdb\x2e"
- "\xec\x57\xfe\x31\xfa\xb5\x0c\xcf\x71\x6c\x11\xcf\xf7\x7a\xe0\x39"
- "\xf6\x35\x8c\x09\xb7\x42\xf9\x80\xa1\xcd\x17\xc0\x0f\xc3\xef\x3b"
- "\xb6\x12\x03\xde\x07\xbe\xd7\xe3\x78\x08\x94\x99\x20\xdd\x8f\x02"
- "\xfe\x0b\x78\x36\x06\x23\x62\x6b\x1c\x8e\x5d\x67\x65\x50\xfa\x11"
- "\xf0\x3b\xd6\x11\x31\x06\xd7\xe4\x49\x98\x02\xac\x9f\x14\x70\x15"
- "\x4e\x0c\x34\xf7\x63\x5d\xd9\x28\xc8\x07\xb8\x2a\x05\x3c\x21\xae"
- "\x20\xaf\x49\xc2\x14\x60\xad\x1e\xf3\x41\x1d\x46\xee\x59\x15\xab"
- "\x46\x8e\x6c\xe6\xfe\x31\x1e\x31\x46\xff\xe7\xd1\x06\xfa\xfd\xa7"
- "\x1a\x98\x9e\xfe\x31\xde\xe2\x60\x3a\x70\xcb\xfd\x1f\x44\x26\xf7"
- "\x7a\xc0\xf1\x48\x94\x33\x1b\xab\xfe\xc7\x78\xa8\x5b\xbd\x10\x8b"
- "\xaf\x05\x1d\x08\xbe\xea\xe3\x56\xbc\x5e\x94\x61\x8d\x5b\x86\xff"
- "\x98\xe6\x4d\x86\x1e\xb2\x53\xb3\x3d\xd1\xff\x11\x8f\xb6\x02\xd7"
- "\xac\x91\xf6\x39\xf7\xa6\x4b\xb8\x87\x5a\xbd\x95\x84\xe0\x3d\x0e"
- "\x85\x0b\xf9\x77\x49\xf7\xd8\x0c\xb2\xb6\x65\x25\xf7\x89\xe7\x43"
- "\x3b\x08\xc1\x31\x71\xbc\x3e\x2a\x1c\xe5\xfb\x8f\x56\xf7\xf5\xd4"
- "\xee\x79\xfd\xad\xf3\x15\x75\x15\x0e\x9a\xdb\x40\xb6\x8c\x02\x1c"
- "\x09\xf5\x6d\x18\xd7\x57\x7d\xa3\xf4\xcc\x4f\x9a\x6f\x46\x7c\x37"
- "\x2c\xb0\x14\x11\x82\x69\xe2\xef\xf8\x76\xf0\x3d\x9e\xe3\xfb\xbe"
- "\x9f\x37\x34\xbc\xad\x7c\xde\xd0\xb0\xd5\xd7\xf3\x06\x8f\xfb\x7e"
- "\x86\xf7\xe5\xcb\xe2\x55\xb2\x7b\xd7\xf0\x5e\xee\x2d\x5d\x7f\xc7"
- "\x0e\x79\x7f\xe6\x93\x1f\x63\x1d\xea\xc0\x4f\xd1\x1b\xe3\x55\x14"
- "\xca\x39\x24\xf8\xf0\x4f\xa2\x59\xfc\x82\x71\xd1\x27\x3a\xcc\xe3"
- "\xd9\x8e\x9e\xbf\x90\x70\xec\xff\x92\x4e\xe1\xc7\xf0\x87\x88\x0e"
- "\x3f\x6f\x4a\x90\x4e\x73\x8a\xcc\x84\x7a\xf9\xa1\x21\x44\x2f\xe4"
- "\xa7\xf0\xc7\x92\xc4\xdf\x36\xe1\x87\xba\x27\x7f\xcf\xf9\x01\xfc"
- "\x8d\x60\xf5\x15\xca\x73\x10\x95\x78\xbf\x0c\x59\x8e\xa9\x7d\x5c"
- "\x4d\x89\x74\x89\xb7\x3f\xf4\x36\xd9\xf1\xd0\xa7\xd7\x17\x09\x99"
- "\x29\x75\x8a\xe5\x4b\xbf\xa9\xfc\x37\xa6\x28\x7f\xc3\xdf\xb0\x39"
- "\xb2\x1b\xdc\x34\x2c\x49\x98\x26\x75\x4b\x4d\x4f\x12\xb7\x43\x27"
- "\xbf\xa5\x8e\x64\x0f\x17\xbe\x84\xe1\x7f\x0e\x28\xcf\x00\xe7\xf5"
- "\xa6\x9e\x0c\xdf\xb3\xaf\x93\x65\x3f\xc6\xaa\x7f\x73\x48\x1f\x6d"
- "\x0c\xf4\x6f\xac\xec\xfb\x4d\xec\xe3\x07\xd5\x83\x58\x7e\xdf\x7f"
- "\xfa\xfa\x11\xd2\x57\x37\x3c\x6e\x9e\xee\x2d\xab\x5b\xfe\x37\xef"
- "\x92\x92\xe4\x08\x75\x9f\xff\xa1\x41\xf9\xfb\xbf\x1c\xca\xdf\xb7"
- "\x4f\x1b\x8c\xaa\x9b\xf1\xbf\x2c\xeb\xb5\x84\xdc\x16\xde\x93\x18"
- "\xe6\x61\x32\x61\x85\x1e\x26\xe4\xfe\x13\x6b\x33\x0c\xea\x53\x2c"
- "\x4b\x56\x7b\xcf\x7d\x69\xfe\x46\xaf\x13\x0d\xe2\x26\x9b\xae\xd7"
- "\xc9\xfb\x3c\xd2\xf0\xf7\x55\x7a\x31\xed\xc7\x07\x7a\xe5\x17\xd2"
- "\xf4\xb2\xdf\xaa\x58\xf8\x6f\x07\x30\x6b\x42\xef\xbc\x43\x7f\x43"
- "\x7f\x7e\xfc\xa9\xd0\x3e\x86\xfe\x2e\xd1\x1f\x65\x5e\x1c\x98\x48"
- "\xf8\xc0\x7f\xb4\x87\x28\xa9\x78\x82\x8a\x09\x54\xfc\x32\x28\x7e"
- "\x7c\xe8\x6f\xe8\x6f\xe8\x6f\xe8\x6f\xe8\x6f\xe8\x6f\xe8\xef\x3f"
- "\xe0\x4f\x25\xef\x58\x63\xff\xf4\x6a\xf1\x53\xde\xff\x51\x89\x87"
- "\x3c\x8d\x1b\xc8\x75\x54\xfc\x23\xd9\xb1\x66\xfd\x8e\x44\xab\xae"
- "\x70\x56\x7d\xf4\x9e\x34\x5b\x48\xce\xb4\xea\xff\x7f\x1a\x2b\x32"
- "\x5e\x48\xcc\x88\xb8\x61\xb1\xa3\xe2\x07\x4b\x8b\xcb\x11\x95\x25"
- "\x29\x4f\x44\xa6\x84\x5c\x31\xd9\x52\xf2\x85\xa7\xc7\xe7\x8c\xce"
- "\x9a\x9c\x37\x32\x73\x62\xee\xd8\xec\xa9\xf9\xc3\xd4\xe4\x74\x48"
- "\x69\x51\xd2\x23\xa1\x49\x41\x97\x8c\x36\x15\x7d\xe2\xea\xf2\x3a"
- "\xa5\xb5\x2a\xeb\x95\xd4\xac\xa8\x5b\x56\xbb\xaa\x7e\xb1\xb5\xb9"
- "\x1d\x53\x5b\x96\xf6\x4c\x6c\x5a\xd8\x35\xb3\x6d\x65\xdf\xf8\xfa"
- "\xfc\xce\xe9\xad\xcb\x7b\x27\x37\x2f\xee\x9e\xdd\xbe\xba\x7f\x8c"
- "\x8d\x8e\x07\x15\x17\x26\x3e\x14\x9c\x18\x78\xd1\x70\x63\xe1\x47"
- "\xce\x4e\xcf\x93\x9a\x2b\x33\x5f\x4a\xce\x8c\xbc\x69\xb9\xb3\xf2"
- "\x27\x6b\xab\xeb\x51\xd5\xa5\xa9\x4f\x45\xa7\x86\x5e\x35\xdd\x5a"
- "\xfa\x95\xb7\xd7\xf7\xac\xee\xda\xdc\xb7\xb2\x73\x63\xef\xda\xee"
- "\xad\xfd\xcb\xdc\xec\x7c\x58\x79\x71\xf2\x63\xe1\xc9\xc1\x97\x8d"
- "\x37\x17\x7f\xe6\xee\xf6\x3e\xad\xbd\x3a\xfb\xb5\xf4\xec\xe8\xdb"
- "\xd6\xbb\xab\x7f\xb3\xb7\xbb\x1f\x57\x5f\x9e\xfe\x5c\x7c\x7a\xf8"
- "\x75\xf3\xed\xe5\xdf\xf9\xfb\xfd\xcf\xeb\xaf\xcf\x7f\x2f\x3f\x3f"
- "\xfe\xbe\xfd\xfe\xfa\xff\x94\x84\x1f\x03\xd3\x8f\xc9\xf4\x8e\x37"
- "\x08\xd5\xd6\x41\x8e\xfe\xff\x4c\x8c\xd0\x78\x87\x08\x34\x98\x32"
- "\x30\x72\x30\xb0\xb1\x90\xd1\x53\x20\xd7\xbf\x38\x80\x02\xb2\x7e"
- "\x62\x00\x68\x7f\x1a\x68\xce\xcf\x18\x88\xa5\xc1\x22\x88\xde\xbf"
- "\x12\x91\x66\xd0\x1e\x30\x02\xfd\xce\x0c\x74\x19\x2b\x03\x1b\x30"
- "\xb4\x38\x18\x38\x19\xb8\x18\xb8\x19\x78\x18\x78\x19\xf8\x18\xf8"
- "\x19\x04\x18\x04\x19\x84\x18\x84\x19\x44\x18\x44\x19\xc4\x18\xc4"
- "\x19\x24\x18\x24\x19\xa4\x80\xbe\x91\x61\x90\x65\x90\x63\x90\x07"
- "\x06\x8a\x22\x76\xbf\x34\x30\x38\x48\x00\x09\x20\x0a\x60\x70\x00"
- "\xf3\x13\x46\xc5\xe9\x2a\x7e\x00\x2a\x7e\x01\x2a\xfe\x60\x54\x9c"
- "\xae\xe2\x0a\x03\x4c\x2b\x0e\x28\xcd\x08\x6c\x32\x40\x5a\x0d\x28"
- "\x6d\x07\x38\x40\x17\x65\x84\x02\x38\x9f\x81\x80\x7e\x0c\xf3\x50"
- "\xf5\xa3\x03\x07\x20\x36\x81\x30\xeb\x19\x18\x20\xf3\x0c\xff\x91"
- "\xc1\x9f\x69\x8c\x87\x58\x04\x1b\x40\x53\x26\x1c\x0c\x22\x60\x92"
- "\x30\x58\xaa\x02\xc4\xc0\x72\x7e\xa9\x0d\x10\xdb\x03\xb1\x37\x10"
- "\x87\xc2\xcc\x66\x60\x64\xba\xc3\x00\xda\xcb\xcd\xc8\x5c\xc1\x00"
- "\xda\x4f\xc7\xc8\xea\xc2\xc0\xc8\x7e\x84\x81\x91\xad\x85\x81\x91"
- "\x93\x05\xe1\x78\x21\x05\xb8\x2b\x19\x05\xa0\xe2\x40\x21\x46\x91"
- "\x15\x48\x96\x91\x5a\x9f\xed\x70\x0d\xf1\x50\x30\xd4\x33\xd1\x33"
- "\x35\x50\xd0\x0d\xd0\x55\x30\x32\x30\x34\xd0\x37\x30\xd1\x37\x34"
- "\x53\x30\x34\xb6\x32\x36\xb0\x32\x30\x57\xc8\xad\x2c\xca\x34\x34"
- "\x48\x4f\x55\x48\xcb\x2c\xca\x2d\x4f\x2c\x4a\x25\xc2\xd3\xa4\x03"
- "\x90\xef\x64\xff\x42\x9c\x89\x1c\x43\x8c\xc0\x1a\x84\xe9\x61\x03"
- "\x03\xd3\x57\x0b\x06\xb8\x0c\xe3\x04\xa8\x57\x34\xa0\x18\x15\x30"
- "\xf6\xbe\x60\x60\xec\xba\xc0\xc0\xd8\xc6\xc1\xc0\x58\x0f\x0c\xcb"
- "\x0a\x16\x06\xc6\xb5\xc0\xf0\x5d\xe5\xc1\xc0\xb8\x34\x83\x81\x71"
- "\x3e\x0f\x03\xe3\x74\x13\x4c\xb1\x6d\x37\x20\x62\x97\x81\x7a\xcf"
- "\x01\xf1\x89\x08\x06\xc6\x03\x2e\x10\xb1\xfb\x16\x0c\x8c\xb7\x54"
- "\x68\xe2\x77\xf2\x01\xa9\xf1\xcd\x08\x00\xb0\xe3\x2b\x95"
+static unsigned int ethp_z8e_uncompressed_length = 385956 ;
+static unsigned int ethp_z8e_length = 120433 ;
+static unsigned char ethp_z8e[120433 + 1] =
+ "\x78\x9c\xec\xbd\x7f\x7c\x94\xc5\xb5\x3f\x7e\x76\xb3\xc0\x26\x06"
+ "\x36\x42\x84\x95\xa2\x5d\x2c\x68\xb4\x20\xd1\x62\x4b\x2d\xd4\x20"
+ "\x41\xc1\xf2\x4b\xc1\x36\x2a\x1a\x50\xa0\x8b\x46\x88\x10\x61\x81"
+ "\x90\x5d\x16\xb4\x09\x02\x89\x1a\x35\x4a\x48\xe8\x15\x2d\x6d\x69"
+ "\xc5\x16\x2b\x3f\x42\x59\x9a\x78\x2f\xd0\x24\x9b\x56\xf0\x93\xdb"
+ "\x8b\xb7\x2b\x37\xd2\x94\x1b\x60\x4b\x16\xb2\x26\xbb\x3b\xdf\xf7"
+ "\x99\x79\x9e\x64\x77\xd9\xa0\xdc\x7b\x5f\xaf\xef\x3f\xcd\xeb\xb5"
+ "\x79\x9e\x67\x9e\x99\x33\x33\x67\xce\x39\x73\xce\xcc\x99\xf3\x10"
+ "\x5d\xfd\x9f\x8f\xcc\x7c\x31\x90\xb1\xa9\xec\xf0\xff\xa0\xfc\x3f"
+ "\xff\xfe\xf9\xf7\xcf\xbf\x7f\xfe\xfd\xf3\xef\x9f\x7f\xff\xfc\xfb"
+ "\xff\xf7\xcf\x6f\xa0\xb1\x17\x8c\x26\xfa\x43\x19\x51\x87\xdb\x3c"
+ "\xcc\x47\x91\xbc\x37\x5e\x15\x21\xbc\x32\x60\x9e\x1f\xc6\x57\xfe"
+ "\xbd\x82\x34\x63\x19\x99\x6f\x4a\xa3\x34\xf1\x86\xd5\x38\x69\x1b"
+ "\x51\xf9\x60\xd1\xf6\xea\xeb\xc2\x5f\x57\x48\x54\xbb\x03\xcf\xaf"
+ "\x8b\xd6\x57\x07\x8b\x00\xe0\xcc\xf3\x51\x6e\x39\xc3\x59\x8f\xe7"
+ "\xf5\x48\x47\x5a\x81\x8f\xe6\x6d\xe0\xb4\x52\x94\xd3\xd3\xbd\x1b"
+ "\x2e\x51\x9d\x2d\x44\xa5\x0c\xc7\x16\xa6\xec\xe1\xb2\x1d\xdb\x91"
+ "\x37\x95\xf3\xae\x1b\x8c\x7a\xd3\x89\xdc\xaf\x8b\x60\x54\x1b\xcc"
+ "\x5c\x0f\xd7\xad\xe5\x6f\x8a\xab\xcf\x8f\xb4\x16\xbd\xbe\x5e\x60"
+ "\xa4\x71\x79\xee\x83\xed\x46\x4a\x3a\x4d\xd7\x5c\xc7\x30\xb9\x6d"
+ "\xc2\x4d\x66\x6f\x67\x88\x4e\x53\x72\x46\xbb\x9b\x92\x6a\x81\x8d"
+ "\x2d\xaf\xcb\xf4\x24\x6f\x20\x44\xb6\x22\x32\xe0\xdd\x74\x5c\x8d"
+ "\x28\xd7\x9f\xf1\x33\xbb\x92\x46\x70\xdd\x80\x6b\x12\x46\x8f\xa1"
+ "\x7a\x20\x11\xe3\x28\x60\xa4\x5b\x02\x6e\x32\x74\xb8\x93\xd1\x7f"
+ "\x73\x86\xec\x3f\xea\x45\x59\xd3\x69\x4a\xf9\x87\x11\xf9\x51\xa7"
+ "\xdf\xb6\x9a\xdb\x90\xf2\x91\x70\x7b\x8c\x3a\x9c\x88\xdb\x73\x4d"
+ "\xd5\x2b\x44\xed\x6e\xe3\xd4\x80\xd1\x22\x34\x38\x35\x3a\x1c\xce"
+ "\x87\xba\x52\xb9\xae\x76\xb7\xe9\x95\xa8\x3c\x3e\x3d\x0f\xda\xed"
+ "\x1f\x13\xa0\x24\x6e\xf3\x29\x4a\x19\xc7\xf5\x69\x7d\x31\x71\x1d"
+ "\xde\x15\x21\xf2\x62\xec\x51\x77\x3a\xfa\x6a\xab\x0d\x12\x01\xe6"
+ "\xb5\xd5\x45\x44\x0c\x1f\xed\xb7\x29\x98\x29\x63\x75\x98\x0c\xa3"
+ "\xbb\xaf\x6e\xcf\xc0\x6a\xd9\x46\xee\xab\x99\xb4\xbc\xf3\xa2\xdb"
+ "\xc8\x70\xd1\x97\x21\xdc\x97\x3a\x50\x94\x96\x67\x43\x37\x3e\xba"
+ "\xfb\x7f\x4d\x56\x1c\x6c\xab\x82\x6d\x00\x6c\x83\x47\x2b\xd7\xdd"
+ "\x7f\x5f\x5c\x7e\x95\x37\x2d\x39\x60\x14\x1a\x1e\x52\x5a\x7b\xf2"
+ "\x26\x97\x47\xe7\x45\x7b\x8c\x0a\xb7\x64\xf4\x51\x4a\x33\xfa\x99"
+ "\x84\x3c\xd3\x30\x8e\x36\xed\xfd\x75\xda\x7b\x2b\xde\xdd\xa3\xe0"
+ "\x5d\x33\x2e\x0a\x5e\x1a\xc3\x8b\xa6\x2d\xc5\x51\x26\xfc\xfa\x40"
+ "\x41\xee\x8b\x5f\x3f\xb3\x4e\x6f\xcb\xad\x22\xe2\xbc\x1e\x7d\xda"
+ "\xb8\x2f\x2b\xe2\x16\xe4\x75\x04\xc9\x36\x94\x9c\xa7\xe8\x9a\xdd"
+ "\x80\x4f\x5b\x56\x93\xd9\x99\x2f\x82\x5e\x47\x1b\x35\xfa\xdb\xc8"
+ "\xe9\x07\x6f\x84\x2e\x52\xd1\x45\xd0\x62\xe8\x2c\x15\x3d\x47\xd6"
+ "\xba\xc2\xcf\x29\x11\x2d\x47\x8c\x82\x9c\xc3\xb8\x6c\x0b\x35\x56"
+ "\xb6\x90\xb3\x32\xb6\xac\xf3\x06\xb2\x36\xe0\x19\x63\x6e\xe1\x76"
+ "\x30\xbf\x85\x52\xf6\x65\x15\xbe\x49\x26\xe7\x70\x32\x36\x2c\xf0"
+ "\x68\x6d\x49\x75\x70\x5b\x36\x9c\x21\xf3\xdb\x8b\x40\x87\x67\xb8"
+ "\xbd\x87\xb3\xde\x5b\x1d\x34\xd6\x5a\xa7\x51\xad\xf5\x24\xd5\x59"
+ "\x27\x50\x9d\x23\x9b\xb6\x9c\xa1\xd4\xda\xe0\x78\xaa\x33\xdd\x47"
+ "\x75\x23\xb2\xc9\xdb\x86\x7b\xf0\x6f\xad\x35\x40\xb6\x15\x4c\x4f"
+ "\xa9\xf6\xf2\xa7\xc9\xec\x53\x30\x81\xbb\xd4\x82\xc3\x05\x44\x8c"
+ "\x3b\x7e\x4e\xd4\x8f\xe5\xd7\x93\x15\xed\x6b\x45\x5b\xbe\x8b\xb6"
+ "\xfc\x6a\x84\x95\x32\xd1\xe6\x7e\xde\x8a\x10\x99\x0a\x29\xb9\x17"
+ "\x3e\x4e\x8f\x80\xf6\xc0\xbb\x6d\x55\x90\x27\xcc\xbf\xed\x6b\x72"
+ "\x20\x13\x52\xc1\xff\xa9\x1b\x34\x1e\x68\x73\xfe\x94\x4c\xed\x2b"
+ "\x73\x0c\xd5\xaf\x8b\x96\x0e\x77\x7f\xd2\xdf\x81\x17\x5b\xf0\xbe"
+ "\x75\x4c\x3a\xa5\x79\x43\x59\x74\xa8\xb3\x95\xf9\xb1\x6d\x40\x80"
+ "\x0c\x0c\xcf\xe2\x00\xef\xac\xa0\x3e\x68\xcf\x9f\xaa\x91\xfe\x0d"
+ "\xe4\x43\xf9\x2c\x1f\xbd\xd6\xc6\xe5\xc5\x90\xc7\x02\x91\x21\x8f"
+ "\x5d\x8c\xbc\xf1\x58\xbb\x78\xe3\xb1\x0b\xe1\x37\x1e\xfb\x87\x73"
+ "\x15\x99\xc3\x43\x1e\xf3\x37\xe6\xcb\x31\x48\x6b\xcc\xc7\x18\x84"
+ "\xc9\xbc\xf6\x2c\xa5\x3d\xf1\x1c\xc6\x3e\xf4\x29\xad\x5d\x4c\xd6"
+ "\x48\xf2\xa1\xa0\x37\x74\x82\x9e\x28\x24\x11\x49\xf6\x98\x13\xf5"
+ "\xaf\x3d\xe5\xb0\x4b\xe7\x2d\xd4\xbb\xd7\x67\xdc\x3b\x8e\xeb\xf5"
+ "\x27\x1f\x75\xe1\xb7\x01\xbf\x62\xfc\x36\x89\x94\xc3\x9b\x80\x2b"
+ "\xe7\x80\x75\x06\xaa\xea\x24\x1a\x13\x21\xc3\x19\xea\x7f\x1c\xed"
+ "\x4f\xeb\x05\x6f\xc3\x22\x1b\x8f\x7b\x6e\x71\x51\x51\x47\x87\x9d"
+ "\x58\x16\xb2\xfc\x63\x79\xd8\xe1\x1e\x60\x43\x3d\x0e\xc9\xbf\xaf"
+ "\x43\xc6\xa4\x1c\xf7\x20\xbd\x35\xb0\xc6\x6e\xf0\xaf\xb1\x1b\xdb"
+ "\x53\x8e\xd7\x22\x4f\x36\xf2\xec\xd6\x70\xd8\xca\xb0\xc0\x5b\xfe"
+ "\xfe\x21\x4a\x02\xcc\xfc\x0f\x2f\x35\x9b\xb6\xbd\x2e\x4e\x22\x5f"
+ "\x5e\x37\x2c\xc0\x06\x1c\xe0\x7f\x80\x4b\x4f\x03\xae\x5b\x36\x23"
+ "\x1f\x97\xf7\x06\xb3\x78\x4e\xf1\x79\xf3\x5a\xc9\x12\xa2\x14\xd1"
+ "\xa5\xea\x43\x9e\x56\x96\xe9\xfd\x83\xd4\xb7\xc3\x4d\xb3\x18\x36"
+ "\x97\xf3\xb6\xb5\x12\xca\xd5\x0a\xa7\xdd\x88\xf4\x19\x1d\xc2\x6e"
+ "\xd8\x80\xf4\x5a\x94\xd7\xea\x6e\xd5\xdb\xc8\x75\xf0\x58\xcb\x76"
+ "\x82\x1e\x6a\xf3\x82\xd4\xbf\x82\x92\x50\x6e\x36\xc3\x63\x58\xa0"
+ "\x03\x1f\xfa\x5a\x5b\x9b\xe7\xa7\x88\x88\x81\xe9\x53\xf0\x2c\xe3"
+ "\x62\xe0\x21\x5d\x00\x1e\xd3\x5f\x1d\xca\xf4\xdf\x2e\xe1\x3d\xf4"
+ "\x61\x84\xe1\x05\xc9\x64\x93\xed\xfd\x21\xc3\xe8\x60\xf9\x01\x98"
+ "\x9e\x15\xf7\x52\x1b\x59\xb6\xfb\x9d\xf6\xa4\x46\xcc\x9b\x5c\xfe"
+ "\xbd\xa2\xd6\x3e\xa2\x3d\x27\x89\x69\x8e\xdf\x7b\x43\x17\x38\xcf"
+ "\x3a\xd1\x6e\x4f\xea\xdf\x06\x59\x84\x3c\x28\xef\xe0\x76\x46\x8f"
+ "\xe5\x43\x93\x7f\x38\x81\x7e\x98\x3d\x35\x7b\x02\x4d\x9f\x38\x69"
+ "\x02\x65\x7e\x77\x74\xe6\xd8\x6f\x7d\xe7\x5b\xf2\xe6\x5b\xdf\x19"
+ "\xf7\x2d\x9a\xf5\xa3\x87\x26\xd0\xac\x19\x13\x68\x36\x7e\xb3\x66"
+ "\x4f\x7e\x28\x7b\xf2\xec\x09\x94\x73\xdf\x54\x3c\x4d\x9a\x70\x47"
+ "\xe6\xfd\xa3\x67\x4d\x9a\x3a\x99\x1e\x9c\x73\x67\xe6\x9d\x77\xd2"
+ "\xc4\xc9\xd3\xee\xc8\xcc\xd4\xae\x77\x64\x72\x96\x47\xc7\x4d\x9e"
+ "\x3d\x7a\xd6\xb2\xa5\x05\x4b\x47\xcf\x98\x3a\x89\x53\x20\xdd\xa2"
+ "\x68\x28\x23\x7c\x29\xc2\xb8\x0e\x88\xf3\x53\x28\x02\xd9\x51\x05"
+ "\x1a\xc0\xaf\xcd\x53\x74\x0a\x32\xe0\xda\xe7\xab\x78\xec\xe4\x1c"
+ "\x60\xa9\x01\xdf\x9b\x3a\xdc\x69\x85\xc0\xa1\x9f\x71\x68\xbb\x89"
+ "\xe5\xc4\x90\x7d\x78\x77\x58\x9b\x6b\xfa\xe0\x7d\x65\xec\xfb\x41"
+ "\x90\xc1\x96\x7f\x6b\xb4\x11\x79\xf1\x03\xde\x03\x90\x85\xc0\xaf"
+ "\x9f\xda\x9d\x39\x7d\x40\xdf\x06\xd4\xd1\x02\xde\x6c\x42\xd9\xe6"
+ "\x28\x9e\x6f\xc1\xf8\x34\xf1\xbc\x72\x8e\xd2\xde\x6f\x2c\xc8\x22"
+ "\x1e\x27\x6f\x81\x06\xe3\x62\x37\x8c\x14\x09\x03\x63\x0f\x38\xc7"
+ "\x15\x9c\x6b\x6d\x51\xf2\xc1\xc7\x70\xb6\xe0\x9d\x06\xeb\x62\x23"
+ "\xe4\x04\xe4\xf8\x03\x11\x67\x06\x89\x94\x7d\x53\x22\x5d\x19\x72"
+ "\xae\x44\xb9\x9c\x28\xba\x0e\xd4\x39\x90\xef\xed\x29\x06\xd0\x81"
+ "\x01\xf3\x2f\xfa\x92\xb6\x00\xf4\x1d\x08\x6f\x3c\xfa\xb2\x38\x9f"
+ "\xc3\x7a\x44\xdf\xd3\x34\xf0\x4f\xe8\x5f\x7d\x64\xe3\xd1\x32\xd1"
+ "\x21\xd3\x18\x6f\x7b\x05\x3f\xa7\x20\x5f\x57\x77\xda\x3e\x4e\x03"
+ "\x1d\x24\x31\xbf\x0a\x21\xd3\x31\x67\x0e\x5c\x05\x99\xd6\x8c\xbc"
+ "\x65\x9c\x77\x4c\x88\xfa\x41\xd6\x58\x6d\x4e\x03\x9d\xa2\x81\x14"
+ "\x49\x39\xfa\x4a\x54\x7d\x80\x33\x90\x27\x29\xa6\x47\x53\xc7\x79"
+ "\xc0\x69\x97\xe9\xd0\x63\x06\x3e\x0e\xf8\xaf\xb2\xac\x54\xf2\x7b"
+ "\xc8\xbf\x73\x3e\x6d\x6e\xee\x79\x06\xaf\x2b\x38\x43\xfe\xbd\x16"
+ "\xb8\x64\x7d\x81\xf5\xbf\x0e\xf7\xc0\x39\x3e\xea\xef\x57\x73\xe3"
+ "\x90\x66\xce\x1b\x41\x1b\x45\xea\xf5\xad\x80\x5b\xee\x59\xdd\x46"
+ "\xa7\xf3\x79\xae\x1d\x98\x16\x71\xda\x29\xb6\x4d\xd7\xd6\x73\xfb"
+ "\x59\x7e\x00\x17\x27\x40\x07\xc9\x80\xb7\x23\x96\x0e\x06\x7a\x00"
+ "\xe7\x65\xb4\xaf\x19\x7d\x7a\xd9\x47\xd7\x1e\x89\xb4\xdb\x51\x2f"
+ "\x19\xc1\x57\x90\xe7\x3d\x30\xb4\xf2\x2d\xb1\xe5\xaf\x2d\xe6\x72"
+ "\xc8\xdf\xa7\xa3\x5d\xe6\xdf\xc4\x38\xd7\xe8\x0e\x74\x39\x28\x3d"
+ "\x8e\x2e\xb7\xa1\x2d\xff\x19\xf5\x7e\x6c\xdc\xfb\x75\x78\xff\x5f"
+ "\xda\x7b\xf0\xfd\xa0\x39\x71\x74\x9b\x8f\xf7\x7f\x43\x7b\x03\xe0"
+ "\x6b\xe8\x16\xd7\x4e\x01\x8d\xf9\xa3\xf2\x6f\x88\xcb\xbf\x1d\xf9"
+ "\xff\x9b\xe9\x86\xe7\x1c\xce\x5f\xad\xf1\x0e\xf2\x9b\x91\x7f\x4f"
+ "\x5c\xfd\xf3\x91\x3f\x10\xd5\xbe\xe3\xb1\xef\xd3\x2b\xf1\xfe\x0b"
+ "\xa6\x75\xe8\x44\x7d\x90\xa7\x1f\xcb\x12\x96\x63\xb5\x79\x3c\x5e"
+ "\xe9\xa6\xb8\xfc\x23\x90\x2f\x55\xc3\x91\x51\xc3\xd1\x14\x1e\x47"
+ "\xd4\x71\x52\xb5\x21\x7d\x5c\x5c\x99\x1c\x94\x49\x07\x1e\x5f\xd6"
+ "\xe9\x32\x41\x99\xbc\xb8\x32\x9b\x78\x1c\x85\xaa\xc7\xd4\xd1\xd5"
+ "\x53\x46\x93\x91\xd1\x30\xb8\x6f\xd7\x00\xc6\xee\x58\x18\x83\x5b"
+ "\x51\xef\xb0\xcd\x4a\xee\x5c\x03\x1a\xba\x13\x69\xff\x0e\x98\xaf"
+ "\x31\x0f\x80\x57\x03\x5e\x7f\x90\x84\x73\x4a\xaa\xa2\xdd\xeb\xae"
+ "\x1d\x10\x22\xbe\x1f\xcd\xf7\x0c\x5b\x74\x4c\xd3\x78\xf2\xba\x6b"
+ "\x71\x45\x7a\x3a\xeb\x6f\x06\x96\xc1\xa2\xe3\x07\x11\x05\xf3\xba"
+ "\xbb\x84\x91\x8c\x78\x0e\x6b\x75\xfc\x09\xcf\x06\xb4\xff\x15\xcc"
+ "\x39\x24\x56\x22\xdf\x6a\x9a\x84\xf4\xc3\x92\x57\x55\x3e\xf9\xac"
+ "\xea\x98\xc2\xf4\x3d\x16\xcf\xfb\xb4\xf2\xef\x33\x3c\xdc\xdf\xa1"
+ "\xdd\x1b\xc2\x0c\xeb\xbc\xce\x83\x83\x7f\x2e\xcb\x81\x0f\x25\x7c"
+ "\x94\x17\x2b\xe5\x3b\x86\xf9\x1a\xae\x53\x71\x5d\x87\xeb\x83\xb8"
+ "\x3e\xee\xfc\x82\xac\xce\xb0\xe4\x47\x7e\x9e\x8a\xeb\x43\xb8\xde"
+ "\x85\xeb\x6c\x5c\x87\xe3\x7a\x2f\xfa\x10\x66\xbe\xc0\x3c\xca\x36"
+ "\x56\x00\xf3\xaa\xa2\x2d\xb6\x01\x3a\xa6\x30\x0e\x26\x23\x4f\xab"
+ "\xe4\x57\x25\x5f\xcc\x6a\x1c\xaf\x6b\x93\x69\x29\x32\xad\x9f\xa2"
+ "\x07\x95\x16\xd6\xe5\xd0\xf9\x9e\x34\x4d\x36\x69\xbc\xa8\xa5\x29"
+ "\xf8\xb3\x00\xdf\xc3\x6d\x15\x0a\x56\x1f\x35\xe6\x1a\x7c\x55\xce"
+ "\x94\xa0\x4e\x43\x74\x9d\xb8\x96\x3b\x1d\x42\xe0\xea\xe2\x31\xf2"
+ "\xd1\xe0\xdd\x42\xd2\x3d\xe6\x58\x05\x6f\xae\x96\x6f\x2c\xe3\x58"
+ "\x96\x97\xe9\xe9\x4d\x51\xb4\x34\xb0\xc3\x3d\x38\x14\xc7\x47\x99"
+ "\xa0\xa5\xdb\x99\x66\x18\xef\xdc\xb7\x01\xf9\x72\x1e\x97\x7d\x91"
+ "\xf0\xcf\x2b\x9a\xac\xd2\xec\x56\xc5\xbf\x43\xb2\xe3\xe4\x8b\xa4"
+ "\xd9\x38\x7e\x6f\x63\x9c\x27\x15\x32\x1f\x0c\x81\xfd\xf7\xde\x30"
+ "\xa9\x33\x6e\x3c\xfa\x3a\xbf\x0f\x60\x8c\xb9\xde\xa4\x7c\xee\xc7"
+ "\x90\x72\xfd\xbd\x7c\x97\x7c\x22\x8b\xe9\x3b\x29\x4f\xbe\xdb\x8d"
+ "\xf9\x68\xaf\xfe\x4e\xaf\x27\xa9\x40\xbe\xab\xef\x81\xbb\xcf\xae"
+ "\xc1\x4d\x4a\xa4\xf3\x89\xe2\x7d\x39\xa3\x89\x8c\xb7\xb9\xa8\x8f"
+ "\x37\x74\x9c\x66\x86\x44\x78\xb4\x8b\x92\xbd\xa1\x5d\x74\x2b\xd1"
+ "\xb5\xde\xd0\x49\xba\x8d\x68\xb8\x37\x54\x0e\x1d\x64\x07\xbf\x3f"
+ "\x74\x0b\x19\x0c\xb8\x3a\x6f\x76\x19\x0d\xde\x50\x01\x8d\x70\x99"
+ "\x70\xcd\xa3\xfb\xfa\x88\x0e\x6f\x68\x1a\xf2\x2d\xa0\x99\x61\x71"
+ "\x3e\xbb\x8f\xf8\x6b\x6e\x98\xd2\xa6\xbd\x20\x9c\xde\x10\xec\x81"
+ "\x50\x3d\xd2\x23\x62\x66\xf8\x0b\xfc\x3a\x44\xa4\x78\x9f\x7d\x66"
+ "\xf8\xbc\x98\xf4\xc2\x21\x3c\xff\x55\x60\x8c\x84\x37\x34\x9e\x1a"
+ "\x03\x01\xe4\x73\x0a\x51\xb2\x2f\xe7\x89\x8b\x46\xea\x82\x0e\x11"
+ "\x29\xd9\x67\x47\x5f\x1c\x5d\xe8\x07\xe6\xd7\x95\x5d\x6b\x70\xdd"
+ "\xb8\x6f\x85\x7c\x2e\xde\x57\x2c\xcc\xfb\x1c\xb7\xc3\xb8\xe2\x3e"
+ "\x78\x43\x2d\x94\x0b\xf3\x60\xe6\x2a\xbf\xe0\xf6\x0f\x58\xc7\xb6"
+ "\xd5\x78\xc2\x18\x58\x66\xae\x72\x0a\xbc\x33\x8b\xe4\x7d\x0e\x6f"
+ "\xa8\x8d\x50\x47\x31\xe0\xbd\x20\xe1\x15\xef\xdb\x89\xbc\x7e\xce"
+ "\x17\x0d\x87\x61\x70\xde\x99\x61\xb2\x20\xff\xce\xae\xe4\x7d\x15"
+ "\xf8\xed\xc5\xaf\x15\x65\x3b\x85\x3b\xfd\xb0\xc0\x7c\x2f\x8a\xf7"
+ "\x9b\x45\xca\x7e\x6b\x10\x3c\x2c\x71\x19\xa6\x7e\xa2\x64\x3f\xc6"
+ "\x99\xb2\x41\x77\x68\xef\xfe\x71\xb2\xbd\x1b\xf7\x7f\x27\x28\xfb"
+ "\xb1\xff\xdb\xaa\x1f\xfb\xef\xe2\xf4\x76\xe8\x3a\xb8\xcf\x69\x57"
+ "\xef\x7e\x84\x72\x73\x64\xb9\xe2\xfd\x39\xc2\xbc\xdf\x1e\x04\x7f"
+ "\x01\xaf\x2e\xc6\x23\xf0\xea\x62\x5c\x02\x7e\x8e\xd7\xb1\x89\x44"
+ "\xf2\x7e\x7b\x57\xf2\x7e\x07\xca\x6f\xec\x92\x3a\xc8\xfe\x8a\xa0"
+ "\x82\xfd\x06\xe0\xcc\x05\xdd\x26\x01\x46\x05\x60\xed\xec\x72\xdb"
+ "\x68\xe6\x2a\x11\x9c\x19\x5a\x17\xca\x5d\x45\x49\xa3\xc8\x85\xf6"
+ "\x1e\x04\x8e\x16\xa0\x9f\x75\xb8\x66\xe3\x3d\x0d\x42\x5d\x87\x00"
+ "\xb7\x82\xeb\x43\x3d\x3b\x01\xf3\x1d\xc0\x5a\xc0\x6d\xfa\xc2\x4d"
+ "\x69\x78\xde\xfb\x85\x6a\x5f\x73\xa4\x78\x7f\x30\x62\xde\xdf\xaa"
+ "\xd3\x10\xd3\x8f\xc2\x5b\x39\xcd\x08\x88\x90\x37\xb4\x8d\x40\x63"
+ "\x69\x8d\x81\x93\xfc\x1e\xf6\xcf\x2e\x8c\x33\xd3\x54\x01\xae\x3b"
+ "\x88\xe9\xa7\x31\xff\x05\xce\x7b\x88\x69\x68\x46\x7e\x60\xdd\x68"
+ "\xca\x37\xe0\xd9\x99\x1b\x32\xd3\x13\xf9\x26\x57\xb8\x78\xff\x91"
+ "\xc6\x7c\x1e\x97\xe3\x28\xc3\xe5\xf2\xc8\x62\x80\x0d\x60\x10\x21"
+ "\x8b\xc3\x6f\xea\x6f\x77\x8a\xc6\xc0\x34\xe4\xcd\x27\xee\x0f\xd3"
+ "\x11\xe7\x9f\xde\x26\x7c\x61\xf3\x01\x07\xf7\x4d\x0c\x70\x51\x43"
+ "\xdb\x5d\xc4\x76\x58\x43\xdb\x0e\xa6\xd3\x88\x30\x1f\x98\x02\x1a"
+ "\xed\x9a\xde\xe6\xea\xf3\xc4\x45\x32\x20\x2d\xdc\x60\xdf\x85\xf7"
+ "\x75\xc8\x57\x2f\xe9\x76\xc6\xc5\x90\x25\x64\xde\xbf\x37\x54\x7c"
+ "\x20\x67\xc6\xc5\x2e\xd1\x60\x2f\xa7\xc7\xdb\x5c\xc0\xd5\x2e\x9a"
+ "\x7e\x36\x94\xd4\x98\xbf\x00\x79\x3a\x90\xbe\x43\xd2\xff\xf4\xb3"
+ "\xed\x62\xc6\x73\xe2\xfc\x8c\x8b\x7f\x15\xd3\xed\xe2\x50\xae\x83"
+ "\x06\x5c\xb3\x4e\x44\x98\x2f\xea\x5b\x76\xd1\x35\x27\x7d\xc4\x3c"
+ "\x31\x6d\x7e\x44\x4c\x3f\x7b\x5e\x3c\xf1\x1c\xe3\x66\x3c\x35\xd8"
+ "\xc1\x3f\x8e\x72\xc6\x77\x73\x83\xbd\x06\xf5\x67\x03\xae\x53\x78"
+ "\x1d\xdb\x90\xd7\x63\x79\xfc\x6c\x1a\xd5\xb7\x94\x53\x28\x79\xff"
+ "\xde\x70\xc9\xfe\x23\x91\xe4\xfd\xad\x91\x92\xfd\x41\x91\x7c\x60"
+ "\x4a\xa8\xe4\x40\x4e\x38\xf9\x00\x68\xe0\xc0\x11\x8c\x53\x32\x8f"
+ "\x79\xa7\x9b\x6c\x78\xfe\xd7\x4e\x1e\xff\xe2\x03\xcd\xe8\x6b\x10"
+ "\x3a\xaf\x50\xb4\x7f\xa0\x99\xd7\x16\x50\x36\xd8\x95\x7c\x00\x3a"
+ "\x19\xae\x92\xf6\x6a\xcc\x4c\x97\xc8\x67\x14\x1b\x6b\xfa\xc1\xee"
+ "\x49\xea\x4a\xae\xb1\xe2\x97\x81\xdf\x38\xa4\x15\x03\xfe\xb5\x92"
+ "\xa6\x8a\x6b\x8a\xc5\xf7\xcb\xa0\x43\x5f\x04\x9c\x9a\x9d\x33\xc3"
+ "\xf7\x08\xe0\x10\x7c\x52\x53\x1c\x29\xa9\xa9\x00\xac\x23\x41\x49"
+ "\xfb\x35\xff\xc6\xb0\xbb\xd6\x64\xf0\x9a\x83\x09\xef\x9b\xc5\xc6"
+ "\x83\x0f\x04\x99\x56\xcd\x07\xa7\x44\xcc\x07\x77\x8a\xe2\x83\x39"
+ "\x3f\x78\x41\xf8\xc3\xc5\x07\x1d\x91\xe2\x83\xf6\x50\x5f\xe8\xe6"
+ "\x8e\x1a\x62\xf9\x14\xfa\xbd\x00\x0e\x3e\x02\x3e\x76\xc8\xf1\xf7"
+ "\x3a\xc0\x03\xab\x86\xba\x1a\xda\x40\x0b\xf9\xbf\x92\xb2\xa9\x31"
+ "\x70\x5c\xe2\x54\x24\x1f\x9c\xc2\x34\xc5\xe3\xfb\x44\x3e\xb9\x44"
+ "\xc9\xc1\x9c\x48\xc9\x41\x7b\xb8\x04\x70\x93\x51\x4f\xca\xa1\x33"
+ "\x41\xc9\xaf\x87\x40\xaf\x35\x28\xf3\x11\x29\x1a\x3f\xd4\xda\x9b"
+ "\x8c\x64\x59\xc5\xf2\x69\x66\x28\xc8\x34\xf3\x37\x96\x6b\x4a\x4e"
+ "\x51\xae\x2e\xa7\x58\x46\xb1\xbd\xc3\x72\x2a\xa2\xc9\xa9\x88\x26"
+ "\xa7\xe4\xb3\x19\xb2\xa6\x78\x9f\x83\xe5\xd1\x4c\x87\x92\x33\x33"
+ "\xc3\x99\x02\xb4\x91\x0a\x18\x0e\x35\x16\xc8\xb3\x71\xdf\x0b\x32"
+ "\xbf\xc4\xd3\xbe\x9d\x11\xc8\x1b\xfc\xf6\x46\x94\xbc\x09\x6a\xf2"
+ "\xc6\xa8\xcb\x9b\x30\xe6\x35\xf0\x54\x24\x91\xbc\x89\x68\xf2\x26"
+ "\x2c\x94\xbc\x89\x68\xf2\x86\xd3\xc3\x9a\xbc\x09\x27\x90\x37\xe0"
+ "\x67\xee\x6f\x92\x26\x67\x5c\x2c\x67\xb8\xbf\xa0\x35\x7b\x44\xc9"
+ "\x99\x62\xd8\x3a\x46\x96\x33\x61\x94\x89\xe8\x72\xa6\x43\x96\xdf"
+ "\xc9\xb2\xa6\xeb\x45\x82\xfc\xb4\x11\xcb\x18\x29\x4f\x42\xc3\x43"
+ "\x2c\x4f\x80\xbf\x7b\xe2\xe5\x09\xe0\xed\xc5\x7d\x9a\x26\xa7\x5a"
+ "\x61\xe9\x86\x20\x4f\x8e\xcc\x74\x04\x30\xd6\x9f\xc2\xf6\x87\xdc"
+ "\x76\x14\xb8\xbc\x8e\x10\x41\x0e\x04\x45\xa3\x8b\xd0\x46\xd0\x6f"
+ "\x18\xb2\x82\x08\x7c\x39\x25\x04\x1e\x07\x8d\xe7\x34\xe6\x9f\xa0"
+ "\x30\x78\x75\x7a\x5b\xbb\xf7\x89\x40\x46\xda\xf4\xb3\xc2\x0f\xfc"
+ "\xf8\x9e\xc8\x77\x41\xbe\x64\xf8\x1b\xda\x0e\xd2\xb4\x16\x11\x99"
+ "\x36\xcf\x67\x03\x0f\xe4\x4c\x5f\xec\xb1\x3c\xf1\x5c\x1a\xf8\x4c"
+ "\x78\x20\x17\x3f\x9e\x7e\x36\xcd\x32\xb7\x85\x6e\x9c\x36\x5f\x44"
+ "\xc2\xe0\x33\xf4\xf7\x08\xfa\xdd\x8c\xb6\xb7\x82\xe7\x82\xe0\xb3"
+ "\x29\xa1\x38\x3e\x13\x29\x07\xfe\x15\xf7\x36\x85\xbf\x03\x41\xf0"
+ "\x59\x73\x44\xce\x67\x2d\xd2\xc6\x44\x3d\x72\x2d\x0e\xbc\xd6\x1c"
+ "\x29\x51\xbc\x16\x11\x8a\xd7\x22\x8c\x3f\xa3\xc6\x6b\x18\x0b\xf0"
+ "\x8d\x15\xbf\x0c\xfc\x12\xf3\x5a\x7e\x14\xaf\x3d\xa7\xf1\x5a\xb2"
+ "\xe2\x35\x8c\x69\x52\x78\x8d\xe2\x37\x86\xcf\x76\x68\x37\xbf\xa5"
+ "\x1c\x9c\x82\x7b\x83\xa2\x1d\xc9\x73\x98\x57\x0e\x3a\xc0\x6f\x76"
+ "\xf0\x1b\xe0\x09\x3f\xcb\x4d\xd0\xe6\x7f\xf2\x5c\x37\x23\x5f\xfc"
+ "\x67\x6e\x78\xa8\x0b\xfc\xe4\x80\x2c\xfb\x2b\xe4\xe8\x7f\x3e\x11"
+ "\xa0\xed\xe0\xa7\x29\xe0\xa3\x1c\xf0\x93\x1d\x7c\xc5\xfc\xd4\x1a"
+ "\x5e\xc3\x30\x0f\xb5\x76\xc3\x90\x73\x65\x2c\x3f\xf5\xb6\x0e\xda"
+ "\xe1\xb6\x15\xfa\xe8\x40\x3e\xeb\x2b\xb8\x2f\xf6\x51\x4d\xb6\x76"
+ "\x0f\xfd\x67\xbb\x55\xea\x31\xe0\xc1\xfc\x22\xba\xee\x0c\x0d\x9f"
+ "\x02\x7a\x27\xdc\xa7\xe2\x7e\xda\xcc\x5b\x0f\x89\xc8\x26\x83\x15"
+ "\xf5\x76\x30\x1f\x0a\xf7\x58\xd6\xcf\xb2\x40\x87\x66\xd1\x91\x91"
+ "\x2a\x52\x8e\xdd\x28\xba\xac\xbc\xd6\x66\xc1\xf3\x00\xf4\x7f\x04"
+ "\xae\x03\xb7\x5d\xa2\x74\xfc\xac\xdb\xdc\x11\x17\xeb\x4e\xb8\xcf"
+ "\x14\x2b\xad\x29\x5b\x56\xd0\x28\x4b\x80\xcc\xd5\xee\x48\x8e\x65"
+ "\x5d\x1a\xaf\x39\xa5\xf3\xbd\x70\xef\x18\x5f\x7d\x89\x4c\xbc\x2e"
+ "\x10\xe9\x8f\xfa\x1c\x16\x21\x96\x67\x50\xf5\x32\xc8\x07\x37\x59"
+ "\xab\xdd\x62\x77\xb8\x83\x71\xb0\x2f\x47\x6f\x0b\xb7\x0d\xed\xbc"
+ "\x01\xed\x9c\xfb\xf0\xaa\x2c\xfa\xc8\x41\x09\xd7\x6a\x3b\xdc\xc3"
+ "\xbb\xfb\xdf\xcb\xfb\x4a\x1d\x27\xbd\xbc\xaf\xd1\xf1\xd4\xcb\xba"
+ "\x9e\x89\xe7\xe8\xf0\x0a\xe1\x2f\x7d\x9a\x18\x17\x56\x67\x48\xfc"
+ "\x17\xf0\xe8\x2a\x0a\xd3\x0d\x33\x57\x7d\x5d\x78\xdb\x84\xc7\xeb"
+ "\x38\x4b\xd5\x78\x5f\x54\x28\x22\x91\xe4\x63\xa0\xd9\xa3\xa1\xf6"
+ "\x15\x22\xc4\x6b\x39\x1d\xee\x9b\x6c\x3e\xfa\x9e\x47\x8d\xc5\xfe"
+ "\x66\x69\x43\x9a\x8f\x86\x00\xeb\x5a\x86\xd5\x80\xf2\xe1\x92\x63"
+ "\xd0\x3d\x6f\x9a\xe2\xa3\xa3\x39\x32\x9f\x79\x7f\x73\xfe\x6a\xfa"
+ "\xda\x19\xba\x49\xe2\x58\x14\x1f\x4b\x67\x79\x80\xb4\x34\xa4\x6d"
+ "\x12\x25\xc7\xac\xc8\xef\xf0\xd1\x07\xe5\x4a\x8f\xbd\x69\x93\x9e"
+ "\x0f\xf7\xf3\xf8\x3e\x86\x7e\x0c\x72\x31\x1d\xb0\x6c\x3d\x9b\x55"
+ "\x06\x6d\x79\x5d\xff\x4b\xc3\x2f\x2b\xf1\xeb\x1e\x79\x7e\x20\x07"
+ "\xba\x16\x39\xd7\xd2\x30\x8c\x0f\xda\xf7\x0d\x03\xec\x88\xd3\xc2"
+ "\x7d\x53\xc5\xdb\xab\x83\xb0\x13\xbe\x91\xea\xa3\x97\xea\x7a\xc3"
+ "\xa7\x60\x5d\xe7\x92\x68\x2d\x5d\xd1\x8d\xcb\xcf\x66\xae\x8a\x08"
+ "\xbe\x67\x79\x54\x8d\x74\xc6\x1b\xe0\xcc\xd1\x71\xd6\xfb\xb8\x1c"
+ "\x4b\x53\x36\xe7\x37\xf6\x08\xb7\x20\xcf\x8d\xbc\xc7\xf4\x8d\x0f"
+ "\x14\x1e\x0e\xb4\xb6\x43\x8e\xf0\x3a\x31\x6c\xb3\xc0\x72\xab\x08"
+ "\x02\xe6\x4e\x1f\x8d\xca\xd4\xd6\xa1\x02\xde\xd0\x64\x96\x2d\x09"
+ "\xe7\x2d\xde\x13\xeb\x81\x3f\xe2\x78\xe3\x30\xc8\x21\x29\x9b\x4e"
+ "\x6c\x28\x52\xed\x0e\x32\x5c\x4f\xd1\x05\x6a\xc1\xfb\xe5\x01\xd1"
+ "\x2a\x8a\x4f\x38\xd8\x8e\xf0\xac\xe8\xe4\xb4\x13\xa0\x6d\xe1\x59"
+ "\xc6\x6d\x1a\x71\xc2\x73\x63\x27\x9d\x76\x50\x52\x75\xf7\xfa\xcf"
+ "\x08\x0f\xaf\xf7\xa8\x75\xae\x11\x59\x3e\x1a\x1d\xd4\xdb\xc5\x3a"
+ "\x06\xf0\xcb\xb8\x6e\x66\x5d\x83\xf7\x1e\x96\x17\x8a\x20\xeb\x1c"
+ "\xc8\x9b\xa7\xf7\x81\xfb\xa7\xfa\x35\xc2\x15\xdd\x2f\xde\xa3\xb2"
+ "\x14\x2a\x1c\x2c\x5f\x45\x66\x9b\xc2\xb5\x99\xfb\xcb\x7d\xe1\x3e"
+ "\xcb\xbe\x48\x19\x8b\x39\x22\x74\x17\xec\x31\x99\xce\xb0\x60\xff"
+ "\x8c\xd2\x68\x6a\x44\x56\x3c\x1d\x75\x8f\xa3\x79\xff\x4e\xd8\xa0"
+ "\x37\x3a\x23\xe2\xd4\x69\x1a\xf9\x88\x5a\x3b\x1b\xf9\x48\x84\xf5"
+ "\xec\x20\xd3\xaf\x57\xee\xbd\x78\x0b\x59\xde\xca\xbc\x83\x90\xb7"
+ "\x05\x79\xa6\x6a\x79\xa7\xaa\x3d\x3b\x79\xed\xc7\x57\xcc\x63\xef"
+ "\xf8\x68\xe4\x3c\xbf\x9c\xef\x4f\x64\xe9\xcf\xb0\xdd\x61\xff\x8d"
+ "\xb4\x8a\x12\x6f\x30\x71\x5b\x0e\xee\xe4\xf9\x2c\x7c\x49\xb4\xa1"
+ "\x9e\x21\x4c\x53\xce\x55\x74\x3d\xe8\xf2\xb3\xa2\xb5\x34\x88\xe9"
+ "\x49\x24\x1f\x1b\xa6\xf0\x3e\x72\x97\x70\x43\xf7\x84\x44\xcd\x5f"
+ "\x41\x5f\x03\x1f\xa5\x9f\xa1\x91\x87\x73\x0b\x6d\x68\x2b\x51\xe9"
+ "\x39\x22\x29\x83\x92\x8f\x59\xbd\xa1\xcf\xa9\xfa\x1c\xaf\xed\x8c"
+ "\xf4\xe9\xb4\x88\xfb\xb6\x2b\xc9\x0b\xcc\x33\x19\x6a\xed\xe1\xe6"
+ "\x47\x78\x9f\xe1\x14\xdd\x9c\xcd\xfd\x55\x7b\x9c\x37\xdf\x25\x2e"
+ "\x89\xb9\x42\xce\x69\x35\x56\x1f\xdd\x9c\x8f\x6b\x86\xfc\xb9\x69"
+ "\x9e\xf6\x6c\x45\xbe\x11\xe2\x52\x84\xf3\x64\x20\x6d\xbc\x70\x1b"
+ "\x98\x27\x6a\x3a\xdc\x37\xc3\x1e\xfd\x7e\xb3\x1a\x9b\x9b\xc7\x32"
+ "\xac\x5e\xda\x60\xc5\xd8\x12\xd3\x26\x60\xfd\xc9\x56\xc4\x6b\x97"
+ "\x37\xbf\x23\xf9\x02\xb0\xaa\x8d\x4a\x6e\x47\xd0\xd6\x2a\x77\xc4"
+ "\x0e\x19\x6d\x8f\x6c\xfc\xb3\x5d\xde\x6b\xef\x84\x36\x8f\x26\x86"
+ "\x7f\x62\x83\x67\x28\xd3\xf8\x2d\xa3\x14\x9c\x13\x0e\xcf\xd0\x33"
+ "\xfc\x3c\x9a\x9f\x03\xe6\x8f\xed\xde\x8a\x2c\xd4\x7f\x06\xf5\xde"
+ "\x32\x4a\xd9\xf3\xb7\x8c\x6e\x47\x1d\x1d\xee\x5b\x46\xf9\x68\x8c"
+ "\x49\xed\xb9\x7c\x6c\xef\x6d\x2f\x99\x79\x87\x79\x4e\xf1\x74\xc6"
+ "\xd9\x86\xed\xcc\x7f\x35\xe6\x76\x73\x4d\x86\x26\x37\x78\x9d\x26"
+ "\xf5\x14\x65\xb4\x35\x58\x25\x7d\x1b\x85\xf1\x96\x4d\xbf\x8e\xf8"
+ "\x8d\xbc\x2f\xa6\xc4\x57\x46\xdb\xe5\xbf\x5b\x3c\xf8\x35\xe1\x77"
+ "\x52\x7b\x6e\xc5\x2f\x84\xfb\x69\xf8\x9d\x94\xb8\xdb\xba\xc0\xe0"
+ "\xc3\xbb\x76\xe8\xec\xfc\xec\xa3\x5b\x8e\x88\xad\x23\x8c\xc2\xac"
+ "\xee\xab\xaf\xe7\x75\x82\x5b\x02\x18\x83\x42\x35\x16\x19\x72\x4d"
+ "\x05\x6d\x63\xbc\x0b\x67\x85\x08\xd6\x15\x05\xb8\xdd\x23\xea\x2a"
+ "\x02\x64\xbb\x99\xfb\x9f\xc1\x63\x2c\x02\xc0\x3f\x5f\x97\x57\x08"
+ "\x7f\x6d\x65\x88\x78\x7f\xae\xc3\x9d\x01\xfe\x5f\x3c\x4d\xad\x39"
+ "\x9c\xd8\xce\xf0\x34\x9a\x10\x7a\xff\x95\x4c\xfb\xd8\xce\x63\x89"
+ "\xe7\xe7\xd1\x77\xcb\x39\xca\xf8\x40\xa4\xfc\xd9\x5e\x6b\x27\xda"
+ "\x06\x39\x82\xb9\x46\xee\x15\x54\x4b\xff\x80\x0c\xcc\xff\x37\x9f"
+ "\xd4\xf7\x93\x36\xe3\xfd\x16\xbc\xc3\xdc\xe3\x6f\xb0\x07\x89\x61"
+ "\x85\xb9\x7f\x28\x7f\x30\xe2\x37\x61\xae\xc6\x98\x7f\x6c\x2f\xca"
+ "\x87\x9c\xe9\x96\x5b\x19\x73\xd7\x9e\x15\x41\xbd\x7f\xb5\xdb\x99"
+ "\x17\x32\x40\xff\xcf\xd8\x7b\xa5\xff\xee\x36\xdf\x96\x5c\x3b\x42"
+ "\x8d\x59\x04\x78\x89\x1d\xb3\xdb\xcc\x6a\xbc\x6e\x1d\x1f\x3b\x5e"
+ "\xb7\x41\xb7\xb9\x75\x03\x7e\x95\xf8\xed\x52\xcf\xd1\xbf\x5b\xf3"
+ "\xa3\xee\x6b\xf0\x83\xec\xbc\x15\xf3\xff\xc8\xa0\x1a\x07\x4e\x47"
+ "\x3f\x98\x46\xfe\x41\xd0\x0d\x73\x88\xf7\x6b\x39\x9d\xe9\x99\xd3"
+ "\x23\xd0\x67\x7c\x74\x6b\x19\xde\xa7\x31\xaf\x96\x46\x28\xe6\xbd"
+ "\x17\xb5\x7b\x56\x43\x56\xd3\xad\x9f\x31\x2c\xcb\xba\xe2\x62\xa6"
+ "\x53\x94\x29\xb7\x84\x8a\xa1\x4f\xde\xda\xa6\xe3\x15\x69\xc7\xf9"
+ "\x3d\xd3\x64\x87\xfb\x36\x13\xf0\xb2\x53\xee\xc7\xc2\xde\x4b\xac"
+ "\x6b\xdc\x96\xd1\xad\x93\x99\x6b\x8a\x59\x1e\xb5\xd1\x37\xc7\x42"
+ "\x66\x61\x6c\xff\x3c\x4f\xcd\x35\xdf\xbc\x8b\x9f\x21\x2b\x3f\xc3"
+ "\x7d\x66\x03\x64\x52\xe7\xc6\xa3\xae\x2e\x23\xf5\xeb\x34\x52\x56"
+ "\x68\x8b\x61\x7c\x28\xe5\xf0\x26\x6f\xeb\x1e\x6a\x0c\xfd\x86\x6c"
+ "\x4f\x4b\x18\xb7\x7a\x41\x03\xce\x55\x22\xfc\x5e\xe7\x4e\x93\x37"
+ "\x74\xde\x83\xb9\xf9\xeb\x67\xe8\x9b\x12\x1f\x2f\x9d\xc2\xac\xff"
+ "\x84\x84\xad\xf0\x93\x6a\xb0\x6e\x59\x24\x42\x5b\x4e\x8b\x00\xf4"
+ "\xbb\x94\xcd\x9d\x34\xea\xad\xd5\x94\x59\xd9\x49\x23\xaa\x3a\x29"
+ "\x43\xfc\x2d\xc3\x58\x09\xbd\xed\x89\x8b\x69\x04\x99\x90\x33\x20"
+ "\x9f\xcc\x55\xab\x49\xd2\x48\x78\x33\xf4\xb7\x10\xf4\xb7\xf3\x19"
+ "\x2c\x1b\xbb\xf5\xb7\x2e\xa9\x17\x1f\xdb\xa0\xe8\xe8\xd8\x86\xfe"
+ "\x76\x32\xa4\xce\xa3\x34\xb4\xcf\x79\x8e\x6e\x5b\x9c\x8a\x09\x91"
+ "\xfb\xec\xd3\xfa\x0b\x9c\x17\x5a\xec\xd4\x4f\xf6\x15\xf2\x5a\x94"
+ "\xfc\x79\x5e\xaf\xf3\xb0\x91\x69\x2a\xc0\x7c\xc3\x7d\x58\xc7\x7b"
+ "\xc6\x7b\x86\x06\x4d\xcb\x2b\x45\x90\xd3\x0b\x86\x8b\x20\xd2\xed"
+ "\x5c\xf7\x6e\xa4\x77\xb8\xbf\x59\xe6\x33\x7e\x30\xad\x37\x1a\x85"
+ "\x7d\xa4\xc9\x95\x51\xd7\x0a\xa3\x8b\x69\xf4\xc8\xda\x10\x74\xef"
+ "\x73\xcc\xb3\xa3\xd2\x66\xe6\x89\x90\x6d\x09\xef\xdf\x8f\x22\xf6"
+ "\x2d\xe0\x3d\xc5\x5f\x43\xb7\xf9\x32\x7f\x02\x9e\x2f\xd8\x56\xb0"
+ "\xe4\x01\xe6\xc6\x9a\x23\x02\xf6\xf9\x57\xf5\x67\x40\x3f\x53\x5f"
+ "\x1d\xcc\x7e\x36\xa3\xa6\xf9\x68\xda\x0e\x6e\xbb\xf4\xa5\x81\xec"
+ "\x84\xbe\x35\x08\xed\x2a\x0e\x00\x0f\x78\x8f\xf9\x7f\xaa\xbe\xff"
+ "\xeb\xe7\xbd\x57\xa4\x61\xfe\x7f\xa0\x86\xd3\x0a\x86\x93\xb5\xc0"
+ "\x26\x7a\xd3\x69\x4c\xbc\x27\x0d\x78\x43\x50\x66\x8f\x0e\x07\xf3"
+ "\xd4\x2f\xda\x8d\x0f\x3f\x8c\xb4\x23\x3a\x1c\xe4\xb9\x0e\xcf\xcd"
+ "\xdd\x79\x54\x99\xd6\xa8\x32\x0f\xb7\x1b\x6f\xfb\x05\xd2\x42\xb1"
+ "\x65\x46\xa7\xc6\x96\x19\x3d\x2c\xaa\x8c\x4b\xd5\x33\x3a\x33\xae"
+ "\x4c\x56\x5c\x99\x59\x97\xb7\x6d\xf4\x82\xb8\x32\x05\x71\x65\x36"
+ "\x5c\xde\xb6\xd1\x15\x71\x65\x76\xc6\x95\xd9\x1b\x85\x4b\xf6\xab"
+ "\xc9\x44\x5a\x7d\x5c\x99\x93\x71\x65\xda\xf4\xe7\x5e\x70\x9c\xba"
+ "\x7c\x1b\x59\x41\x9b\xec\xbb\xe5\x7f\x15\xe3\xd3\xfe\xc6\x33\x1d"
+ "\xaa\xec\xed\x19\x97\xf7\xeb\xf6\xf1\xb1\xf5\xdd\x3e\x2d\xb6\xbe"
+ "\xdb\xe7\x5e\xde\xaf\xdb\xf3\xe3\xca\xb8\xe2\xca\x94\x45\x95\xd9"
+ "\xae\xd5\xb3\x23\xae\xcc\x9e\xb8\x32\x75\x97\xd3\xd5\xed\xcd\x71"
+ "\x65\x5a\xe3\xca\x04\xbf\x04\x17\x3c\x8f\x2b\xbf\xb6\xc1\xac\x2b"
+ "\xdf\x0b\x1d\x61\xcc\x7c\xf6\x8d\xe0\x7d\xd0\xb7\x3b\x83\x7d\x78"
+ "\x7f\x8e\xe7\xab\x5a\x47\x10\x73\xcb\x18\xd8\x3f\x63\x3d\xfa\x9c"
+ "\xc5\x7e\x23\xcc\xd3\x4a\xc7\x1e\x93\xd1\x9b\x2e\x2a\x7d\xcf\x34"
+ "\xff\x35\xae\xab\x76\x18\xcf\x53\x63\xca\xbb\x75\x62\xe5\x83\x46"
+ "\x1a\x9c\xbf\xeb\xfb\xb0\xd5\xca\x1f\xc5\xc0\x3a\x79\xad\x43\x96"
+ "\x39\x12\xa5\x47\x73\xfd\x81\x3d\xab\x83\xa6\xb8\x76\xec\xbc\x42"
+ "\x3b\x52\xa1\x1b\xd9\x1b\x31\x7b\xf1\xfe\x7a\x43\x25\x74\x20\xe8"
+ "\xfd\xdc\xb6\x53\x94\x99\x29\x75\xb2\x25\x9d\xc4\xf7\xde\xc2\xbb"
+ "\xe5\xfe\xbb\xd2\x49\x33\xed\x75\xa8\x9f\x75\xf7\xba\xfc\x0b\xec"
+ "\x23\x85\xf9\x97\x75\xb7\xcc\xd7\x6a\x0b\xfd\x68\x57\xe6\x3c\xdd"
+ "\x4f\xc5\x47\x99\xe5\x52\xd7\x28\x3e\x31\x8f\x7d\x03\xd8\x87\xa6"
+ "\x36\x30\x8e\xf3\x80\xfe\xc7\xe4\xe9\xfd\xc5\x5c\xef\x47\xde\xf1"
+ "\x57\xc2\x99\x1a\xc3\xcc\x9a\x58\x9a\xec\x03\x5a\xc9\x6c\x8a\x1d"
+ "\xf7\x4c\x5f\xec\xb8\x67\xfa\x63\x69\xd2\x08\x9a\xbc\xc3\x14\x5b"
+ "\xe6\x8e\xf4\xd8\x32\x77\x8c\x88\x2a\x53\xa6\xea\xb9\x63\x5c\x5c"
+ "\x99\x29\x71\x65\x72\xa2\x9e\xd1\xc7\x3b\xec\xdd\xb6\x8f\xf4\x81"
+ "\xba\xc3\x11\xf5\x6c\x2c\x97\xf2\xf3\x8e\x4d\x7a\x1a\xaf\x1d\x55"
+ "\xbd\xae\x7c\x70\x34\x78\x3b\xe3\xf8\x9d\xf3\xd7\xc4\xb5\xa1\x3e"
+ "\xae\x0d\xdd\xfc\xaf\xed\xdd\xff\xe1\x34\xdd\xb9\x47\xdb\xbb\x6f"
+ "\xc3\x9c\x3d\x93\x9f\x01\xab\x02\xf9\x81\x87\x3b\x53\x63\xe1\xdd"
+ "\x39\x2c\x16\xde\x9d\xa3\xa2\x9e\xd3\xf0\x3c\x3e\xaa\x0f\x69\x49"
+ "\x56\x32\x80\x5e\xa0\xbf\xdd\x39\x47\x4f\x67\x9b\x12\xed\x6d\x75"
+ "\xca\xb9\x26\x8b\x7d\xcb\x06\x9e\xa2\x3b\x27\xb2\xfd\xa9\xc1\x8c"
+ "\xe6\x7f\x52\xfd\xba\xb3\x3c\xae\x1d\x3b\xe2\xda\xb1\x27\xaa\x5f"
+ "\x01\xcb\x3a\x7a\xd0\x12\x7a\xe8\x11\xd6\x7d\xd8\x9f\x52\xfa\x78"
+ "\xad\x85\xce\x76\x91\xd2\xd8\xb7\xee\x74\x01\x25\x79\x1d\xad\xb0"
+ "\xe5\x8e\xb9\x7a\xa5\xa7\x94\x13\xf9\xca\xb7\x8a\x6c\x1d\xee\x6f"
+ "\xa5\xeb\xf4\x18\xd9\x78\x22\x3f\x52\xf2\xa7\x6c\xa4\x41\xfe\x65"
+ "\x6e\x57\x7a\x6e\x53\x99\x70\xe6\x54\x00\x9f\xb0\x8b\xc6\x5e\xa7"
+ "\xd9\x11\x1b\xd8\x47\x8c\xfd\x58\x31\xc7\xa7\xaa\x7d\xf8\x6f\xcd"
+ "\x8d\xa2\xeb\x80\x6d\xf5\x3d\xe2\x14\x8d\x1d\xce\x3a\x00\xf3\x28"
+ "\xfb\x9a\xd5\x86\xfc\xc4\xb6\xb7\x37\x74\x46\xea\x6e\x78\x6f\xd3"
+ "\xca\x56\x44\x95\xf5\x6b\xb6\x71\x2b\xbf\x1b\x13\x22\x53\x6d\xc0"
+ "\x4f\x80\x93\xae\xf4\xbd\xb1\xc3\x6b\xc1\xaf\x28\x53\xaf\x97\x61"
+ "\x3b\x5a\xee\xf1\x16\x90\xe9\xf6\x42\x32\x79\x56\x9f\x92\xb0\x75"
+ "\xbf\x0d\xe8\xd2\x6d\xde\xc2\x56\xf2\x06\x9a\x79\xad\xcb\xa4\x7c"
+ "\x74\xc6\xda\x92\x82\x64\x6e\x2f\x39\x01\x7b\x6e\xac\x2d\x5c\x72"
+ "\xc2\x8e\xb6\x61\x7c\xbe\x95\xcd\xf2\x26\x1a\x77\x93\x27\xcf\x7a"
+ "\x68\xe6\xf4\xd1\x3f\x7a\x68\xea\x9c\xc9\x77\xdb\xe6\x2c\x7e\x76"
+ "\xe1\x82\xd1\x4b\x9f\x2f\xb0\xad\x5c\xb6\xb8\x60\xf1\x92\x1f\xdb"
+ "\x32\x1d\x23\x1d\xb6\xf9\x05\xea\x9a\x91\x37\x7f\x79\xc1\x04\xbe"
+ "\x1d\x65\xcb\x5f\xb6\x70\x85\xbc\xbd\x35\x85\x62\x81\x2c\x2e\x58"
+ "\xb8\xcc\x36\x72\xc1\x28\xdb\x7d\xf3\x17\xe7\x3d\xbf\x6c\x61\x42"
+ "\x58\x77\xdb\x96\x2d\x5c\xb6\x70\xfe\x02\xdb\x04\x5b\x26\x43\x8e"
+ "\x06\x17\x35\x9e\x99\xfa\x3c\xc6\xf3\x57\xa9\x5b\x34\x69\xf3\x99"
+ "\x4f\xd1\xcf\xd8\xc0\xe5\x73\xd9\x5d\xe6\x58\x9a\xbb\xcb\x1a\x4b"
+ "\x73\x77\x65\x5c\x3e\x97\xdd\x15\x37\xff\xdd\x15\x37\xff\xdd\x35"
+ "\xf7\xf2\xb9\xec\xae\xb8\xf9\xef\xae\xb8\xf9\xef\xae\xee\xf9\x0f"
+ "\xb4\xe4\x5b\x2f\xe5\xc2\x5d\x71\xf3\xdf\x5d\x71\xf3\xdf\x5d\x75"
+ "\x71\xcf\xc7\xa3\x9e\x07\xe1\xb9\x25\x7a\x7e\xc4\x73\x40\xe7\xcf"
+ "\x1e\xf9\xf2\x6d\xb3\x9e\x87\x65\x3d\x64\x73\x8b\xca\xfb\x6d\x5b"
+ "\x54\xde\x56\x2d\xef\xd8\x6e\xfe\xe3\x7d\x6d\xa4\x2b\x7b\xfd\xdb"
+ "\x6f\xb2\x4c\x67\x7f\x3c\x9e\x9b\xc0\x1f\x5f\x3f\x47\xdf\xbe\x96"
+ "\x61\x31\x0d\xb3\x7f\xa6\x78\xe3\xb1\x8e\xea\x81\x64\xe6\x32\xd5"
+ "\xaf\xb0\x5f\xef\xd8\x51\xec\xab\x8b\x34\xf6\x5d\x86\x4c\xf9\x36"
+ "\xf4\xdf\xdf\x69\x7b\xdf\xdf\xf6\x49\x9d\x1f\x65\x34\xf8\xd2\xae"
+ "\x01\x1c\xf6\x05\x36\x97\xaa\xb9\xb8\x05\xf7\xa9\x4c\xd3\x28\x6f"
+ "\x12\xc6\xb1\xcf\xb1\x0f\x34\xd2\xd2\xf0\x4b\x07\x3c\x9f\x0e\x6f"
+ "\xc3\xe0\xc4\xba\x65\xbc\x9e\xdb\x6d\x0f\x1a\xc9\x52\xea\x8e\x34"
+ "\x7b\x23\xac\x5b\x7f\x27\x5d\xad\x2d\x1c\xdd\x2e\xdc\x87\x72\xaa"
+ "\x91\x9e\xd8\x4e\xfa\x0e\xf4\xbf\xef\x98\xd5\x7a\xcb\x77\x30\xfe"
+ "\xd3\xc7\xaa\xb5\xd3\xa3\xdb\x21\x6f\x3b\x01\xe7\x22\xae\x5d\xb8"
+ "\xfe\xbb\x0e\xdf\x23\xed\xed\xef\x14\x08\xb7\x61\x36\xc3\x8d\x4b"
+ "\xdf\x04\xf9\xd6\x69\x09\xb9\x72\x12\xbc\xdb\x29\xdc\x49\x0f\x25"
+ "\x48\xf7\x40\x67\xe8\x44\x3b\x02\xdc\xde\xa8\xf4\x66\xe1\x1e\x30"
+ "\x87\xf3\xfb\xb8\x3e\x94\xe9\x4d\xd7\xd6\xfd\x6f\x95\x0f\xff\xb8"
+ "\x11\x71\xfd\xf8\xe2\x34\x8d\xfb\xa9\xea\xc7\xb8\x70\x6c\xdd\xe3"
+ "\xc6\x27\xee\xc7\xb8\x39\xe8\xc7\x17\x89\xfb\x31\x2e\x5f\xe2\xd6"
+ "\x88\xbe\x18\x2f\x7b\xc7\xbe\xac\x5f\x48\xbc\xc7\xa6\xef\xd0\x74"
+ "\xa1\x00\xec\xb0\x34\xbc\x93\x65\x67\x17\xf6\x8c\x9b\x96\xaf\xde"
+ "\x52\x41\xb3\x12\xd4\xd9\x22\xdc\xfd\x66\xfb\xe8\xbb\xf2\x5c\x43"
+ "\x54\x7a\x48\xb5\x05\x78\x32\x32\x9e\xd0\x1f\x94\xeb\x6d\xbc\x75"
+ "\xbb\x44\xad\x85\x7c\x17\xfc\x3f\x8e\xf4\xb5\xcc\xe5\x85\xc2\xaf"
+ "\xe3\x11\xef\xec\x71\xef\x82\x51\xef\x36\xc4\xbc\x5b\xdb\x9d\x5e"
+ "\xa9\xa7\x7f\xb5\x71\xfa\x6e\x7d\xdc\x38\x61\x7c\xee\x7e\x3c\xb6"
+ "\xdf\xdf\x3d\xa9\xfa\x87\x31\xba\x0c\xd7\xdf\x0d\x62\x8c\xba\x12"
+ "\x8f\xd1\xdd\xe9\x89\x69\xed\x6e\xb9\x8e\x26\x06\x52\x02\x78\x77"
+ "\xf3\xbe\x53\x97\xa4\x41\x6d\x9c\x2e\x1f\x9f\xbb\xf3\xf4\xf1\xf9"
+ "\x6a\x7d\xbc\x7b\x77\x5c\x1f\xc3\xa7\xe9\x7b\xa3\x55\x5f\xbf\xb7"
+ "\x36\x0e\xf6\x91\xc4\xb4\x78\xb7\x0f\xfd\x0c\xf7\xd2\xcf\x50\xef"
+ "\xb4\xf8\x3d\x2b\xfa\x13\xbe\x9c\x16\xbf\x97\xa9\xca\x50\xa2\x32"
+ "\xd3\x84\x3b\x51\x3d\xdf\x5b\xe0\x0c\xb1\x9e\xfb\xbd\x4a\x5e\x5f"
+ "\x8a\x4a\x2f\x8c\xa5\x3f\xf4\x81\xcb\x31\xfe\x42\x4a\xce\xf2\x38"
+ "\x9c\xb6\x91\xf1\xcb\x68\xb2\xc3\xfd\xbd\x93\x71\xb8\x3a\x7f\x9a"
+ "\xc6\x3f\xde\x6e\x34\xec\x50\xf8\x9a\x30\x3c\xae\x4d\xc1\xc4\xf8"
+ "\x1a\x9f\x06\x7c\x9d\x4f\x8c\xaf\xf1\xa3\x7a\xc7\xd7\x78\x1e\xff"
+ "\xf3\x97\xe3\x6b\xfc\xbc\x68\x7c\x41\xd7\x95\xfd\xfb\x86\x15\xb4"
+ "\xd1\x95\x2b\xaa\xb9\xaf\x61\x4a\xb3\x80\x56\x54\x99\x36\x2e\x53"
+ "\x6e\x09\x2a\x3a\x81\x0e\x69\x3e\x47\xe3\x0b\x75\xfe\x1f\x50\x41"
+ "\xfd\x44\xd7\x63\xec\x47\x64\xe0\x72\x5e\xc7\x79\x8f\x37\x94\x49"
+ "\x6c\x7f\xc4\xd5\xdb\x9c\x58\x16\x8c\xf7\x03\xa7\xaf\x5c\x9e\x3e"
+ "\xc1\xac\xfc\xc8\x26\x64\xc5\xca\x88\x09\xb6\xd8\x31\xfa\x1e\xef"
+ "\x47\x58\xb4\x6d\xa7\x2f\xfd\x5d\x79\xcc\x26\x94\x5d\x3e\x66\xdf"
+ "\xbf\x43\x8d\xd7\xf7\xaf\x8d\x6b\xdf\xce\xc4\xe3\x35\xc1\xd3\xfb"
+ "\x78\x4d\x38\xd9\xfb\x78\x4d\xe0\xf5\xd3\xf3\x3e\xfa\x7e\x66\xec"
+ "\xbc\xf1\xfd\xb4\xd8\xfe\xa2\x5e\x94\x13\xc6\xbe\x83\xf8\xf9\xab"
+ "\xf6\x5b\xff\xb1\x8c\xe3\xb1\xe2\x73\x45\x68\xff\x70\x6e\xe3\xd5"
+ "\xc2\xe8\x15\x36\x70\x58\xb6\x3a\xf1\x7e\x2b\xdb\xb8\x8d\x15\x44"
+ "\xbc\x8f\x6c\xbb\x91\x75\xf7\x7b\xfa\x44\x8c\xd4\x8c\x7b\xe3\x69"
+ "\xca\xfa\x53\xc4\x68\x2c\xe4\x3d\x4f\xe9\xb7\x2e\xd7\x10\xee\x19"
+ "\x16\x3d\x16\xbc\xf7\xc9\xb6\xe9\x16\x65\x3b\xfd\x15\xe5\xdf\x51"
+ "\xe3\x92\xf5\x7e\x2c\x1e\xef\xc9\x4a\x3c\x2e\xf7\xe4\x60\x5c\xfe"
+ "\x9a\x78\x5c\xee\x29\xe8\x7d\x5c\xee\x29\xc3\xb8\xfc\xf5\x72\x3e"
+ "\xba\x67\xa7\xc6\x47\xeb\xb9\x8c\x6d\x09\xdb\xe3\x59\xd7\x73\x1e"
+ "\xdc\x83\x47\xb2\x24\x4e\x46\xb7\xe9\x7c\x24\xcb\x9c\x04\x2c\x59"
+ "\xbf\xca\x73\x4f\xb3\x06\x23\x0a\x6e\x16\x59\xda\x12\xf1\x49\x96"
+ "\x95\xf3\xde\x9e\x4f\x66\xe0\x30\x67\x1b\xc3\x58\x46\x84\x7a\x9e"
+ "\xe5\x7c\x9c\x7e\x7b\x20\x9a\x4f\xb2\xa6\xe8\xf9\x58\xd6\x69\x79"
+ "\xb3\x44\x87\x9d\x38\x5f\x1c\x6c\xad\xff\xfd\xe4\x3c\xc2\xf9\x39"
+ "\x5f\x5c\x9e\x0a\xc5\x8f\x59\x27\x63\xf9\x31\x6b\x77\x2c\x7d\x02"
+ "\xff\x28\x17\x81\x9c\xc3\xbd\x09\x6d\xf8\xca\xf4\x75\x65\xde\x9c"
+ "\x38\x2a\x8e\x37\x41\x03\x13\x1b\x14\x0d\x4c\xfc\x55\x6c\x5b\x27"
+ "\x66\x27\xa6\x81\x89\x73\x7b\xa7\x81\x89\x8e\xde\x69\x60\x62\x39"
+ "\xd3\x80\x8f\x26\xd6\xc7\xf2\xe6\xc4\x5d\xb1\x7d\x47\xbd\x92\x37"
+ "\xe9\xda\xab\xe1\x4d\xe8\x42\x83\x7a\xe3\x43\xe6\x29\xf6\x1f\xa9"
+ "\xee\xd4\xf7\x3a\xbe\x12\xce\xcc\xe0\x2b\xb4\xef\xde\x79\xbc\xa6"
+ "\x04\x19\x3f\x8e\x71\x58\x25\xcf\x63\xde\x5b\x10\x8d\xc7\x2d\xea"
+ "\x0c\xa4\x13\x79\xbf\xe0\x7d\x65\x85\xcf\x49\x87\x63\xfb\x7f\x6f"
+ "\x79\x62\x7c\xde\xbb\x0b\xf8\x74\x26\xc6\xe7\xbd\x47\x7a\xc7\xe7"
+ "\xbd\x2d\x7c\x46\xea\x72\x9e\xba\x37\x64\x5b\x21\x75\x14\x59\xe6"
+ "\x1c\x4d\x7a\xf8\xab\xcd\x4f\x93\xc6\xc6\xce\x4f\x93\x86\x5d\xfd"
+ "\xfc\x34\xc9\x91\x78\x7e\x9a\x54\x96\x78\x7e\x9a\xb4\x53\xf1\xc3"
+ "\x24\x5f\x2c\x3f\x4c\xf2\xc4\xd2\x04\x70\xf7\x7f\x36\x3f\x65\x67"
+ "\xc6\xf1\x40\xe9\x69\xca\x7e\x1f\x3a\x85\x4b\x8d\xdb\xe4\xe7\x63"
+ "\xdb\x98\x3d\x2d\xf1\xb8\x65\x2f\xc0\xb8\x95\x26\x1e\xb7\x6c\x57"
+ "\xef\xe3\x96\x5d\x89\x71\x2b\xbd\x7c\xdc\xb2\xf7\x5c\xbd\x4e\x91"
+ "\xdd\x1a\x3b\x66\xd9\x4d\x57\x3f\x66\x93\x47\x25\x1e\xb3\xc9\xd9"
+ "\x89\xc7\x6c\xb2\xe6\x9b\x3e\xb9\x3c\x76\xcc\x26\x17\xc4\x8e\x19"
+ "\xf0\xf6\xbf\x1c\x33\x8c\xcf\x0e\xe5\x9f\x30\xf9\x22\xec\xf6\x7e"
+ "\x1d\xee\xc9\x6d\x3e\xba\x6f\x8f\xb2\xad\xef\x53\x73\x87\x1a\xc3"
+ "\xf7\x90\xc7\x77\xf9\x3c\x70\x9f\x59\x4b\xfb\xd1\xe5\xe3\x70\xdf"
+ "\x08\xc8\xe8\xb6\xba\x42\xb9\xb7\xa5\xc6\x90\x71\x8e\x7c\x9e\xd5"
+ "\xbc\x3f\x75\x5f\x36\x97\xc5\x18\x0b\x6f\x30\x44\x2c\xd7\x91\x3f"
+ "\xc0\x70\xf8\x6c\x68\x1c\xac\xfc\xab\x99\xe3\x7b\xf7\xa9\x39\xba"
+ "\xc3\x53\x74\x27\xe0\xdd\xff\x82\xa2\xd5\xfb\xe2\xf5\xdf\x6a\xbc"
+ "\x7b\x44\xd1\xe9\xd4\x91\x71\x6d\x08\x24\xa6\xd3\xfb\x53\xd1\x87"
+ "\xea\xc4\x74\x7a\x7f\x46\xef\x74\x7a\x3f\xc6\x9f\xaa\xa3\x6c\x9f"
+ "\x81\x4f\x84\x7c\x71\xb6\xcf\xfd\x76\x4b\x40\xd1\x8e\xd4\x89\x4a"
+ "\x8e\xee\xe8\x70\xdf\x1f\xaf\xff\x61\x6c\xa6\xf4\xd7\xda\xdc\x27"
+ "\xae\x7c\x2f\xfa\xdf\xfd\xac\xff\xbd\xd7\x4b\x9b\xaf\xa0\xff\xdd"
+ "\xcf\xfa\xdf\x7b\x97\xf3\xd6\x14\x4d\xff\x4b\x64\xe3\x4d\x19\x95"
+ "\x78\xfc\xa7\xc4\x8d\x3f\xe5\x14\xc0\x1e\x96\xe5\x63\xf3\xe5\x45"
+ "\xe7\x63\xdf\x24\xce\xcb\x34\x92\x20\x6f\x45\x3c\xcc\x5e\xf2\x79"
+ "\x2e\xa3\x3d\xf6\xa5\x4a\x48\x7b\x53\xb4\x33\x25\x53\xb3\x63\xf9"
+ "\x71\xaa\x29\x96\x1f\xef\xdf\x19\x5b\x6e\xea\x88\xd8\xf7\xf7\x05"
+ "\xfe\xef\x64\xec\xd4\xf2\x38\x1a\x38\x74\x9a\x1e\xb8\x56\xd1\xc0"
+ "\x03\x8b\xe3\xda\xb1\x2b\x31\x0d\x4c\xad\x43\xff\x0f\x25\xa6\x81"
+ "\xa9\xbe\xde\x69\x60\x6a\x08\xb8\x3c\x14\x4d\xb7\xb3\x0b\xb3\xfa"
+ "\xc5\xe6\x79\xc0\x96\x58\xe6\x3d\x30\x2e\xf1\x1a\xc1\x03\xb3\x14"
+ "\x8e\x1f\x28\x8e\xc5\xf1\x03\xf6\x58\x1c\xa2\x2f\xff\x7b\x1c\x76"
+ "\xc7\x83\xe8\x70\x3f\x10\xcf\xff\xde\xd3\xf4\x03\x8d\xff\xa7\x3d"
+ "\x18\xd7\xc6\x80\x6a\x4b\xa2\x75\x91\x1f\xb0\xfd\xeb\x4d\x8c\xcb"
+ "\x1f\x8c\x4a\xdc\xe7\x1f\x64\x63\x0e\xf2\x46\x2e\xe3\xa5\x1f\xcc"
+ "\x45\xfa\x6c\x5e\x0f\xe5\xf5\x90\x2a\xa4\xcf\x0e\x91\x59\xce\x57"
+ "\xdd\xf3\xd2\x0f\x5c\xec\x8b\xc2\xf8\x67\xfa\xb5\x0c\xa3\x59\x3c"
+ "\x07\x71\xbb\x72\x0b\xa5\xdf\x82\x65\x03\xd3\xfa\x4d\x4c\xeb\x3f"
+ "\x90\xfa\x1f\xef\xb3\xb0\x1f\xa1\xc5\x41\xb3\x38\x2e\x85\x4e\xef"
+ "\x9c\x3f\x0e\xf6\x49\xe6\x0b\xce\xaf\xe7\x55\xeb\x66\xae\x38\xd9"
+ "\x34\xcd\x94\x78\x8c\xa7\x0d\xeb\x9d\x76\xa6\x8d\x53\xe3\x3c\x2d"
+ "\x2f\x76\x9c\xa7\xcd\x8a\xb8\x07\xcc\xe1\xbe\x82\x06\xae\x8a\x4f"
+ "\x0a\x6c\xc2\xdf\xab\xbc\x5f\xff\x58\x73\x7e\x11\xdd\x78\x86\xa6"
+ "\x1d\x97\xf5\x19\x45\xd0\xb2\xce\x40\x75\x52\x06\x4c\xbf\x55\xb6"
+ "\x13\x79\x72\x43\x64\x14\xeb\x9f\x69\xe6\x77\xd5\x6e\x11\x44\xbe"
+ "\x26\xde\x13\xe0\xb3\xd5\xa0\x85\x41\xa7\x68\xda\xd9\x98\xf2\xe0"
+ "\x7c\xaf\x82\x91\x51\x2d\xf9\x71\xfa\x08\x7d\x4d\x77\x03\x9e\x13"
+ "\xaf\xfb\x4e\x9f\xa2\xfb\x3e\x28\x9f\xb1\xe9\xbd\xee\x5f\x72\x9b"
+ "\xf8\xac\x0c\xb7\xe9\xca\x72\x60\x7a\xa5\x4e\xbf\xca\xd7\x72\xfa"
+ "\xae\x1e\x5f\xbe\xe9\x7b\xf1\x6e\xde\x15\xd6\x06\xa3\xf8\x60\x7a"
+ "\x4b\x34\x1c\x15\x13\x65\x7a\x50\xf7\xc7\xeb\x70\xcf\x30\x7d\x09"
+ "\x2c\xad\x3d\x33\x46\xc5\xb6\x67\xc6\x78\xe8\x29\xe9\x1a\x8c\x29"
+ "\x57\x82\xc1\x63\xae\x68\x96\xe9\x61\xc6\xbc\x2b\xad\xf9\x25\x59"
+ "\x69\xd6\xab\x97\xd1\xd6\x0c\xa9\x2f\x31\x8c\x2f\x69\x63\x53\x8c"
+ "\x6d\x21\xf7\xee\x79\x6f\x6b\xe6\x36\xc5\xf7\x33\xe3\xd6\x08\x67"
+ "\xb4\x49\x7f\x2a\x8d\xef\x9f\x08\xc5\xf3\xc1\xcc\x54\x7d\x8e\x8e"
+ "\x4b\x1f\xa1\xf3\x3d\xec\x5a\x86\x1b\xb7\xce\x3a\x33\x5b\xf1\xc2"
+ "\xcc\xca\x48\x72\xb4\xbd\x36\x53\xea\x7f\xfa\x7a\x29\xde\x67\xc7"
+ "\x95\x8b\x5b\xff\x9b\xd1\x26\x7a\x5f\xa7\x4f\xc5\xf8\x06\x78\x6f"
+ "\x4b\xc5\x6a\x98\x59\x1f\xb7\x5e\xe1\xdf\x22\xcf\xdf\xff\x05\x70"
+ "\x67\x69\x72\xef\xc1\x89\x71\xf5\xb5\x39\xcf\x5e\xa9\xff\xb3\x7a"
+ "\xe9\xff\xac\x9e\xfe\x2f\x91\x70\xe3\xd6\x12\x67\xc9\xfe\x87\x2f"
+ "\x93\x7f\xb3\xd8\x87\x54\xc7\x1b\x74\xee\x59\x1f\xe8\xba\x3a\xaf"
+ "\x1f\xf4\xae\xab\xcf\xea\x59\xff\x53\xe5\x7a\xd6\xff\xfc\x89\x74"
+ "\x75\x1f\xc9\xbd\xd5\xd8\xba\x9b\x2d\x95\x09\xfb\xd2\xcb\xfa\xdf"
+ "\x83\xda\xfa\xdf\x83\xf3\x62\xe5\xd9\x83\xb6\xd8\x31\x9c\x15\x37"
+ "\x86\x0f\x66\xc5\x8e\xe1\xcc\xb6\xff\xe9\xbc\x86\x67\x4a\x4a\x4a"
+ "\x32\x26\x19\x8c\x86\x24\xbc\x46\x17\xa9\x5f\x92\x29\xa9\x0f\x7e"
+ "\x7d\xb5\x6b\x3f\x63\x92\xd1\x84\x5f\x1f\xed\xda\x37\xee\xb9\x1f"
+ "\x97\xc5\xcf\xa4\x5d\xfb\xc4\x3d\xf7\xfd\x92\xf7\xfd\xb4\x7a\xf5"
+ "\xfa\x4d\x71\xcf\x7d\xbe\xe4\x7d\xdf\xff\x65\x79\xba\xec\x39\xd6"
+ "\x0f\x6d\xea\x92\x15\xf3\xf3\x16\x2f\x90\xfb\xc5\x0b\x6d\xf3\x9f"
+ "\x7a\x6a\xe1\xf2\xe5\xb6\x82\xa5\xb6\x7b\x27\x3e\x74\xe7\xdd\x36"
+ "\xb5\xed\x9c\x37\x61\xe4\x82\x14\x9a\xbe\x72\x19\xbf\x98\x3e\x7b"
+ "\x6a\x8e\x6d\xd6\xbd\x13\x63\x5f\xea\x60\xe4\xf6\xf2\x95\xa0\x44"
+ "\xf1\x5f\x56\xc9\x60\xa2\x4d\xaf\x4b\xd9\xd3\xc2\x7e\xbe\x6a\xcd"
+ "\xe3\x47\x87\xeb\xd9\x7f\xb4\xd3\x29\x3c\x37\xf1\x9e\xfe\xec\x85"
+ "\xdc\x89\xd1\xdb\x5d\x94\xff\x24\x9f\x5f\x99\xbd\x4e\xfc\xde\x4f"
+ "\xb6\x07\xc8\x78\x8a\xe6\xfe\xa9\x6e\x0a\xf2\xe2\xd9\xeb\x0b\x91"
+ "\xcd\x49\x66\x94\x7f\x0e\xef\x0c\xe2\xfb\x11\xa4\x05\x34\x5f\xe8"
+ "\x1f\xae\x93\x69\xbf\x77\xe9\xf9\x2c\xa7\x69\xce\x48\xf1\x7b\x21"
+ "\x9f\xf9\x7c\x90\xca\x37\xfb\x0b\x61\x7c\x68\x2f\xcb\x86\xca\x81"
+ "\x64\xe2\xbd\xd0\x37\x07\x92\xf9\xcd\xc1\x1c\xb3\x64\x76\x9b\xbe"
+ "\x17\x5a\x82\x67\x1f\xcd\x6d\xe2\xba\x39\x6f\xc4\xf8\xd0\x29\xce"
+ "\x5f\x15\x93\x7f\xce\xb0\x9e\xbd\xd8\xd9\x6d\x46\xe4\x9b\xf9\x19"
+ "\x59\x2c\x61\xf1\x8f\x60\xca\x61\xd7\xed\x53\xc8\xe0\xc5\x50\xd4"
+ "\x87\x5c\xa4\x7c\x7e\xe6\x2c\x5c\x15\x16\x21\xf6\x4f\x9f\xde\xe6"
+ "\x14\xa5\xcf\x92\x09\x3c\x6d\xf0\x2c\x63\x1f\x85\x39\xd3\xaa\x17"
+ "\x92\x09\xfd\x1f\x76\x86\x1e\x2e\xb4\xcd\x20\x72\x4e\x27\xd3\x31"
+ "\x07\xfb\x1b\x1e\xbb\x71\xcb\x9f\xc9\xf4\xcb\x4e\x97\xb1\x53\x58"
+ "\xa9\xb0\x40\xb4\x0a\x8e\x63\x14\x10\x41\xf6\xf1\xaf\x9f\x17\xe6"
+ "\x3c\x03\x3a\x9c\x56\x6a\x2c\x08\xd0\xda\x93\x22\x58\xfc\x67\x75"
+ "\x36\xa0\xa1\x2d\xc0\xfe\x8b\xe6\xb5\xd3\x29\xe9\x74\x0e\x19\x1b"
+ "\xec\x15\xe4\x9d\x1b\xa0\xc2\x93\xa2\xb5\x7e\xde\xe7\xd4\x68\xdf"
+ "\x4d\xb9\xcd\x64\xac\x6f\xf9\x94\x64\x2c\x9e\x2d\x86\xcc\xa2\x8b"
+ "\x64\x5d\xbb\x98\xd3\x2e\xd2\xea\xb5\xd4\x7f\xf5\x09\xb2\x78\x5b"
+ "\x9b\x51\xcf\x59\x7a\xf4\x38\x19\x00\xcf\xb8\xe6\x53\xb2\xae\x79"
+ "\x84\xfd\x7c\xb3\xa8\xb2\x88\xac\xc2\x99\x91\xda\xe9\xcc\x48\xeb"
+ "\x14\x19\x03\x3b\x9c\x19\xe9\x8d\xf9\xc8\xdf\x72\x90\x06\x34\x53"
+ "\xfa\xef\xcf\x34\x1b\x2b\x2e\xd0\x30\xee\xd3\x69\xf4\xad\xf2\x02"
+ "\xf2\x6f\xfc\x64\x77\x04\x65\xa3\xcb\x84\x92\x3f\x39\xe2\xcd\x09"
+ "\x52\x04\xb0\x2a\x3a\x69\x58\x65\x27\x59\x23\x25\x9f\xec\xe6\x72"
+ "\x6d\xf4\xc3\x55\xde\x7a\xa2\xc2\xb5\x22\xdc\xb5\xf1\xa8\x0b\x32"
+ "\xb1\xdf\x7b\x4f\xee\x35\x79\xeb\xdb\xa8\x21\xd0\x49\x8d\xf4\x17"
+ "\xf2\x3a\xfe\xe6\xf9\xe5\x93\x7b\x79\xcd\xda\xe0\x59\xdd\x82\xba"
+ "\x14\xed\x38\x1b\xf8\xac\xb2\x8b\x4a\x8b\x28\x35\x7f\x35\xf5\x3b"
+ "\x83\x74\x65\xdb\xd7\x14\x7b\x43\x7f\xf3\xac\x96\xfe\xb8\x73\x9b"
+ "\x8a\x1a\x28\xa9\x31\x50\xc1\x7e\x9f\xc6\xf0\x00\x43\xa6\x37\xd0"
+ "\x44\xde\xfc\xbf\x7a\x22\xa9\x06\xeb\xa6\x08\x99\x7f\x75\xa9\xc9"
+ "\xe8\x35\x5d\x22\x6f\x4e\x80\x0e\xa1\x6e\xb1\xc5\xc0\x7b\x9f\x59"
+ "\x8d\x81\x20\x9f\x77\xca\x14\xed\xd6\x94\xd2\x65\x34\xaa\xea\x02"
+ "\x8d\xd8\x76\x81\x32\x44\x47\x86\x91\x7d\x6c\xf9\x6c\xea\x36\x5c"
+ "\x53\x5b\xc8\x8c\xbe\x2b\x7f\xec\xfe\x9a\xaf\x6d\x57\x06\x55\x77"
+ "\xf6\xf8\xda\x76\xb6\xf7\xf8\xda\x82\xa6\xfc\xec\x6f\xeb\xa3\x87"
+ "\x37\x58\xea\xa9\x1f\xf8\x64\x27\xd3\x77\xe9\x39\x32\xad\x3f\x47"
+ "\x74\xbb\xcb\x48\xb6\x45\x7c\xce\xe2\x47\x0b\xbd\x18\x1b\xbe\x3f"
+ "\x45\x3f\x1a\x86\x6b\x2a\x7e\x06\xa4\xcb\xf8\x0d\x2d\x1a\x1d\x23"
+ "\xcd\x88\xb4\x3e\xb8\x26\x81\x5f\xc2\xce\x4a\xe1\x47\x5d\xcd\xed"
+ "\x46\x4a\x61\x7a\xd6\xfc\x7b\x9b\x3b\xdc\x3f\x0c\xf8\xe8\xd9\x36"
+ "\x9d\xae\x95\x8c\x9f\xed\x3f\x74\xea\x2c\xc7\xcb\xf2\xcb\x76\x75"
+ "\xd9\x0d\x1c\x3b\x4b\x4b\xe7\x36\x3c\xce\xf5\xa2\xfe\x2c\x5c\x2d"
+ "\xf8\x81\x4f\x7f\x78\x5c\x2f\xdb\xde\x65\x47\x9d\x3f\x7a\x18\xe9"
+ "\x42\x4f\x47\xbf\x4d\xfc\xee\xb7\xa7\xce\x1a\x55\x9e\x0c\x23\x60"
+ "\x06\x35\xf8\xe0\xfd\xd9\xe5\xcc\xe3\xed\x46\x8b\xa8\x9d\x37\x96"
+ "\x2a\x5f\x17\xf5\xdb\x5e\x17\x75\x8a\xf7\x7e\x54\xe1\xa3\xa5\x65"
+ "\xdc\x46\xcc\xe3\x75\x9b\xf0\xae\x16\xb3\x0e\xe3\xa5\x6e\x01\xfb"
+ "\x93\xfd\x08\xfa\xdf\x35\x35\xd1\x7d\x10\xee\x07\x2b\x78\x2e\xfd"
+ "\x75\xd1\x91\x3e\x90\x01\x15\x8d\x2d\x6d\xf4\xcb\xce\xd6\x3e\xce"
+ "\xa3\x64\xf4\x86\x4e\xd1\x98\x74\xb2\xb2\x3e\x58\xfd\xba\xf0\xbd"
+ "\xca\xf1\xf9\x5e\x17\x6d\xa0\x97\x1b\xce\x50\x4e\x9f\x6f\xa6\x53"
+ "\xfa\x1f\x1d\xa4\xc9\xa7\x9c\x1b\xa2\xe4\xd3\x3b\x0d\xbe\xbd\x51"
+ "\xb2\x69\xee\xc3\x97\xcb\xa6\xc7\x1e\x54\xb2\x09\xbc\x2f\x65\x51"
+ "\xd8\xa7\xa5\x4f\x88\x4b\xd7\xfc\x44\x1e\x1b\x1e\x97\x1e\xd4\xd2"
+ "\xfb\xc7\xa5\xfb\x55\xfa\xa3\xd3\x75\xd9\xd7\xc8\xed\x58\xc9\xb2"
+ "\xef\xd1\x3b\x58\xf6\x35\xce\xd3\x64\x9f\x94\x3f\x8f\x5e\x27\xfe"
+ "\x05\xb2\x68\x05\xcb\x9b\x47\xce\x72\xfb\xc5\xef\x49\x6f\x7b\x32"
+ "\xd2\x7e\xc5\x69\x65\x7f\x21\x13\x7e\xba\xdc\x13\x2c\xf7\x58\xe6"
+ "\xb1\xec\xdb\x3a\x58\x34\x6f\x7d\x5d\x1c\xaf\x94\xb1\x7f\x1e\xe9"
+ "\x96\x7f\x2f\x21\x6d\x13\xd2\x5e\xc2\x7b\x96\x83\x8c\x93\x86\x9c"
+ "\xbd\xc4\xfe\x27\xa0\xb1\x61\x11\x63\x26\x6d\xc1\x78\xf3\x79\xc3"
+ "\x0d\xc0\xaf\xc5\x40\xf9\xde\x02\x3e\xc3\x1a\x66\x9f\xb4\x96\xc6"
+ "\x82\x16\xe6\xbb\xc1\xeb\xc1\x67\x5e\xc7\xe7\x54\x14\x10\x67\xf8"
+ "\xdc\x1d\xb7\x21\x77\xd5\x03\x1c\x2f\xc9\x50\x07\x6b\x98\xfd\xc2"
+ "\x59\x66\xa3\x2d\xa6\x32\xb4\x49\xc5\x67\x79\x64\x87\x8f\x76\xb8"
+ "\xd4\x58\xcf\x6d\xe2\xb8\x6c\xa7\x28\xa7\x15\xf6\x5e\x90\xfb\x66"
+ "\x09\xbb\x88\xcf\xc1\x70\xac\x42\xbe\x6e\x35\x46\xec\x65\xfa\x59"
+ "\x18\x37\x64\x03\xf2\x78\x9b\x83\xc4\x6d\xf6\xd1\x23\x63\x1b\x0a"
+ "\xf7\x72\xf9\x66\xc6\x8d\x70\x3b\x75\x18\x06\x09\xc3\x28\xed\x46"
+ "\x3b\xf2\xa9\xb5\xf3\x94\xa3\xae\x86\xb9\x7e\x62\xb9\xef\x6d\x05"
+ "\x8c\xc2\x53\x0a\x06\x60\x09\xcc\x01\x31\xef\x34\xf8\xfd\xd7\x8a"
+ "\x7f\x00\xfe\x0e\x1e\x2f\x3e\x17\xc9\xfb\x6d\xc0\x4b\x2a\xfb\xca"
+ "\x2b\x5d\xf4\x91\xd1\xd5\x7f\x21\xd2\xce\x76\x82\xde\x1e\x19\xc5"
+ "\xe7\x96\xf8\x3c\xe7\x95\xce\x72\x02\x47\x23\xf4\xf3\x9c\x91\x95"
+ "\xff\xb7\x67\x39\x01\xdb\x5a\x65\x14\xbb\xd1\xfe\x51\x7c\x9e\x13"
+ "\xed\xdf\xc4\x74\xa8\xf5\x29\xf3\xb5\x47\x25\xce\x0b\x38\x0d\xb6"
+ "\xe3\x11\x7d\xfc\xb9\xbf\xdc\x17\xbc\xcb\x51\x3a\xa2\x80\xfd\xf1"
+ "\x58\x26\xbf\x47\x5a\x36\xe7\x1f\x03\x39\xe6\xc5\x1c\xf6\xde\xa9"
+ "\xb0\xb1\x74\x35\x99\x94\x4c\x9b\x3b\x95\xcb\x2b\x99\x36\x97\x7a"
+ "\x64\xda\x63\x17\x95\x4c\x53\x38\x56\x32\xed\xb1\xbf\x2b\x99\xf6"
+ "\xd8\x67\x72\x5f\x0c\x32\x8d\xdf\xb1\x5c\xd3\x65\xda\xb6\xc1\xe2"
+ "\x08\xcb\x8e\x0e\xf7\x63\x4d\xba\x6c\xdb\x8c\x34\x96\x1d\xdc\x46"
+ "\x25\xa7\x1e\xcd\x10\xff\x91\x41\xca\xef\x80\xef\xed\x7c\x7e\xa1"
+ "\x55\xbb\xe7\xf9\x64\xa2\x92\x71\x73\x47\xf4\xc8\xb8\xc7\x76\xf6"
+ "\x94\x65\x19\x37\xf7\xbb\x4a\xc6\xa9\xf4\xea\x47\x59\xc6\x3d\x9a"
+ "\xc1\x38\xd0\xe0\x1b\x79\x0d\x4f\xcb\xcf\x78\xcc\x8c\x96\x71\xb1"
+ "\xfc\x35\xb7\x50\x97\x71\x2c\xdb\xf0\xbc\x09\x32\x4d\xda\x90\xcc"
+ "\x67\xe5\xc0\xb9\xce\x77\x3c\x06\xdc\x67\x8e\xbf\xc6\x78\x9b\x74"
+ "\x96\xfa\x69\x67\x87\xb4\x7e\xcf\x3d\xa2\xfb\x3e\x02\xff\x4d\x89"
+ "\xf4\xe8\x9e\x18\x89\xf4\x75\x3e\x3b\xef\x75\x9d\x22\x6f\x85\x70"
+ "\x35\x86\x4e\x52\x6e\x01\x64\x45\xd2\x33\x9f\xf1\xd8\xc2\xee\xf8"
+ "\x1e\x5f\x59\xf6\x9c\xa1\xc7\xfb\xe7\x06\xa8\x2f\x6c\xf5\xcf\x4a"
+ "\x8d\x78\xe7\x88\x79\x27\xd7\x18\x6e\x5f\xc6\xf1\xf5\xc0\x08\xbd"
+ "\xd8\xfb\x57\x59\xdf\xda\x2b\xd4\xf7\xa6\xac\x0f\x3a\x15\x6c\xa0"
+ "\x6b\xcf\xd1\xe3\xd2\x2e\x91\xf1\x6d\xd6\x27\x84\x75\x54\x7b\xdf"
+ "\xa7\x97\xf7\x7f\xbf\x72\xf9\x27\x92\xaf\x5c\xfe\x89\x5b\x59\x16"
+ "\xa1\x7f\x96\xb0\x3b\x16\xce\x80\x90\x9e\xef\x0c\xe7\x7b\x50\x5b"
+ "\x8b\xf9\xcc\x39\x5c\xda\x68\x56\x1d\x26\xd3\xdf\x16\xe4\x93\x31"
+ "\x43\x20\x2b\xb3\x57\x11\xc7\x6b\x89\x2e\xbb\xb9\x07\xc7\x4f\x64"
+ "\x5d\x61\xdd\x2f\xd5\x5b\x41\x32\x66\x6c\x2d\x74\x52\x8e\x69\x54"
+ "\xde\xbd\xfe\xf1\x44\x0b\xe4\xa6\x2f\xca\x2f\x96\xed\xb1\xaf\x73"
+ "\x5c\x03\xd6\x2f\x4b\x95\xbd\x39\x04\xf2\x79\x20\x9f\x87\xe1\xb3"
+ "\x31\xb9\xe1\x59\xc6\x5a\x19\xcb\x2c\xd7\xa6\x97\xed\x6d\x9d\x85"
+ "\xeb\xd5\xea\x64\x1f\xd3\x00\xca\xcc\xd1\xcb\x30\x6c\xf6\x53\xc4"
+ "\xbc\xfc\x75\x79\xa6\x34\xd4\xc6\xb2\x70\x08\x74\xd1\x81\xaa\x9e"
+ "\x79\xa4\xd5\x53\xec\xa3\xc7\x67\x5d\xe9\x6c\x46\xef\xfd\xcb\xad"
+ "\xbb\xfa\xfe\x91\xd6\xbf\x79\xf4\x25\xfd\xbb\x42\xbd\xf3\xc6\x5f"
+ "\x7d\xbd\x69\x7a\xbd\x8e\xab\xc7\xeb\xbc\x5d\x5f\x1d\xaf\x99\x1a"
+ "\x5e\xe7\xf9\xbe\x04\xaf\x09\xea\x99\x9f\xfe\xd5\xeb\xb1\x69\xf5"
+ "\xcc\x9f\x92\xa8\x1e\x92\x7f\xbd\x9e\x9b\x32\xeb\xb1\x36\xdb\xc1"
+ "\x3b\x2a\x56\xdd\xfc\xb2\xe8\xf8\xc5\xed\x92\xaf\xe6\xef\xe8\x8e"
+ "\x97\xac\xf6\xca\x21\xab\xe7\x1f\xce\xdd\xce\xf3\xbb\x88\xf8\x68"
+ "\x7e\x1d\xc7\x71\xcd\x5e\xab\xce\x64\x6b\x65\x9a\xaf\x14\x37\x99"
+ "\x63\x74\x71\x4c\x3e\xaf\x15\x7d\xaf\xe0\xd8\x25\x27\xca\xd8\xff"
+ "\x1e\x36\x15\x64\xfc\x93\x37\x70\xcc\x31\xdc\xf7\xc3\x7d\x86\x92"
+ "\x01\x4f\x66\xa0\x9e\xde\xcf\x4e\x6e\x3c\xb1\x7d\x47\x51\x66\x9f"
+ "\xde\xfc\xeb\x51\x1e\x3a\xc5\x73\x72\x6d\x2a\x92\xf2\xb1\x03\xb6"
+ "\x84\x16\xef\x6f\xc1\xe7\x32\x06\x9c\x33\x87\xcf\x93\x60\x5e\x5c"
+ "\xd0\x5f\x3b\x07\x00\x7c\xb8\x80\xd7\x27\xb7\xeb\xf8\xd0\xd3\x91"
+ "\xb6\x47\xc7\x07\xf4\x9b\x54\xef\xf6\x10\x9f\xd3\x09\xa8\x33\xd9"
+ "\x4f\xfe\xbb\x28\x39\x51\xa1\x60\x3f\xa5\xf6\x68\xb8\xbe\xae\x1c"
+ "\x93\xb4\x9b\x8a\xd8\x6e\x7a\xaa\xc6\x9f\x7c\xa2\x42\x6f\x87\x58"
+ "\x6e\x35\xf2\xd9\xef\x31\x98\x4b\xb7\xa8\x98\x7b\x06\x3e\x27\x27"
+ "\xdf\x2f\xcf\x30\x2a\x9c\x3c\x35\x41\xb4\x73\xec\x18\x09\x3b\x15"
+ "\xed\x6c\x61\xb8\x3e\x5c\xfd\x6b\x32\x38\xee\x85\xd6\x9f\xa7\x46"
+ "\x46\x36\x7e\xec\x88\x74\x58\x8d\x7a\x7b\xab\xe4\x99\xd6\xa7\xd0"
+ "\xff\x79\x2a\x4e\xac\x6c\x8f\xd5\xc8\xfe\xfc\x91\x94\x13\xdb\xc5"
+ "\x1a\x2b\xed\x59\xd6\x2a\xed\x26\xae\x73\x0c\xea\x17\x6c\x27\x41"
+ "\x37\x41\xb9\xed\xdd\x78\x03\x5c\xd1\xa1\xe3\xed\xa9\x69\x6a\x5e"
+ "\x56\x7d\x0c\xac\xb1\x1a\x6b\xfd\xf2\xbc\x1d\x8d\xb0\x39\xbf\x50"
+ "\xb1\xb0\x9f\x3a\xa9\xe3\xae\xbb\x4d\x68\x0f\xe7\x51\xfe\x4d\x4f"
+ "\x85\xf4\x36\x49\xde\x4d\xe1\xf3\xbb\x4f\xfa\xf9\xdc\x90\xc2\x7f"
+ "\x6d\x6a\x87\x7b\x81\xed\x72\xfc\x2f\x18\x1b\x85\xff\x24\xa6\x3d"
+ "\xc6\x3f\xaf\x75\x00\x2f\x8f\x03\x97\x66\x75\xde\x81\xf5\x99\x05"
+ "\x0b\xf1\x9c\xca\xed\x8c\x94\xe8\x38\xcf\x31\xa9\x75\xb2\x05\x15"
+ "\x51\xe3\x80\xfe\x5a\x59\x57\x33\xe8\xfd\xe7\x32\x8c\x03\x8e\x2b"
+ "\xc9\x75\xa3\x3d\xd7\xa0\xee\xdd\xf1\x7d\x5a\xaf\xce\x92\x90\xf2"
+ "\x2d\x59\xd0\x14\x15\x5b\xdc\x5f\x60\x13\x41\x75\x2e\x79\x81\x63"
+ "\x4f\x91\xdf\xd4\x9b\x0c\x60\x1a\x94\x31\x2a\x8d\x72\x5d\x01\x3a"
+ "\xd7\xa2\x8f\x04\xda\xa6\xc6\x7e\xd1\x36\x95\xb6\xf0\xef\xb8\x82"
+ "\xc6\x16\x4e\x14\xa8\xdb\xef\x94\x31\x56\xd0\xb7\x45\x3e\xa6\x39"
+ "\x9d\xce\x78\x1d\x52\xf9\x8c\x2f\x7c\x87\x65\x8a\x8e\x73\xb4\x3f"
+ "\xa5\xc3\xbd\x30\x5f\x6f\xbf\x9e\x9f\xc7\x8e\xf3\xf0\x9e\x4d\x9d"
+ "\x2d\x28\x65\xad\x3a\x33\xb4\xb0\x52\xe7\x61\xae\x83\xc7\x99\x65"
+ "\x0d\xe3\x43\xe1\x62\x61\x4d\x2c\x2c\xab\x51\xc5\xcd\x64\x9a\x07"
+ "\x3f\xae\x0e\xf6\x41\x1e\x5f\x0f\x8c\x85\x73\xd5\xbb\xee\x76\xb2"
+ "\x9f\xbf\xf4\xc5\x53\xe3\xb1\x68\x2a\xf7\xab\xa7\xbd\xcc\x7f\x8b"
+ "\xba\xc7\x9f\xdf\x05\x9c\x56\x8e\xc1\x2b\x65\x4c\xc1\x70\x6e\xaf"
+ "\x9f\x63\xdb\x4a\x5a\x07\xfc\x32\x6e\x3b\xe7\xd1\xc7\xac\x87\x16"
+ "\x17\xd9\xa3\xe1\x08\xa7\x6c\xab\x84\xa3\x64\x87\x9f\xf7\xb6\x6d"
+ "\x6a\xbf\x65\x51\x79\x54\xbf\x53\xf5\xf6\xf4\xc8\x84\x45\x7b\xe2"
+ "\x69\x92\xeb\xe6\x58\x7c\x1a\x6c\x96\x25\x69\xa7\x68\xd1\x76\xad"
+ "\x5d\x56\x1e\xc7\xde\xe6\x37\x8e\x73\xc9\xb1\x4f\x5f\x55\x32\x04"
+ "\xe3\x6c\x1f\xfe\xaa\x3a\x47\x14\x50\xf1\x4f\x7f\x3c\x52\x18\x7f"
+ "\xca\xb8\xe2\xf5\x74\xbf\x8c\xd7\x21\xcf\x98\xff\x98\xf7\xf8\xc5"
+ "\x80\xfc\x9f\xca\x58\xb7\x9a\x6f\xa0\xbf\x2e\x3f\x24\x63\xf9\x39"
+ "\x0b\xf8\xcc\x6d\x88\x6d\x3d\xe9\xfb\x56\x5b\x10\xa2\xd9\x41\xe6"
+ "\x89\x1f\x17\xf0\x59\x7a\x15\x47\xfc\xc7\x2e\xfd\xfc\x3c\xc7\xce"
+ "\xe4\xb8\xaf\x90\x43\x49\x3d\x71\x5b\xed\x39\xac\x63\x69\xe3\x4b"
+ "\x5b\x8c\xa2\x49\xf1\xff\x8f\x8f\xf2\x79\x79\xb5\x8f\x75\x0a\x32"
+ "\x21\xe9\x6f\xa7\xe8\xc7\x9f\xa9\x75\x1f\x5d\x46\xd9\x1f\xe1\xbd"
+ "\x2c\x9f\x06\x03\x75\xb5\x81\xbf\x67\x5d\x2e\x4b\x7e\x7c\x54\xb7"
+ "\x5d\xf8\xfc\x9d\xda\x17\xeb\x81\xe7\xa3\x1f\x4b\x5b\xb0\x67\x0c"
+ "\xfe\x00\x58\xf6\x71\x97\xcb\x05\xfb\x34\x9d\xf7\xf2\x6f\xe2\x33"
+ "\xdc\x3f\x4e\xe3\xfa\x7b\x9b\x2f\x84\xf3\x11\x1e\x27\xf3\x69\x5b"
+ "\xe2\xb1\x49\xbc\xcf\x66\xdf\xad\xf7\x41\xc7\x89\xea\xc3\xe2\xe4"
+ "\xf6\x94\xa3\xbb\x7a\xfa\xbe\x58\xea\xae\x51\xef\x27\x46\xe1\x86"
+ "\x9f\xb3\xd4\xbc\xb6\x18\xf8\x59\xa0\xc5\xaa\x55\x69\xe0\x9d\xad"
+ "\x62\x4d\x0e\xa9\x36\x2e\x26\x9d\xd7\x91\x77\x94\x8f\x2e\x5a\xd5"
+ "\x7e\xd7\x62\xf4\xdf\x5e\xac\xca\xd9\x8f\x73\x5b\x12\xf6\x33\xb6"
+ "\x8d\x7b\x59\xd7\x50\x31\x15\x16\xef\xe3\xf6\xda\x6e\xe6\x31\x5e"
+ "\xfc\x82\x94\xe1\x1c\x5f\xa1\xcb\xde\x27\xd0\x95\x41\xed\x5d\x76"
+ "\xc8\x85\x0c\x23\xea\x81\xec\x6a\x0f\x68\x75\xee\xd2\xdb\xca\x6d"
+ "\x93\xf1\x39\xc5\xe2\xc4\xf8\xe5\x7a\x65\xcc\x27\x7b\x3f\xfc\xcc"
+ "\xf8\xf5\xfd\xaa\x7a\x09\xf4\xf4\x56\x7f\x49\x53\x66\x64\x85\x38"
+ "\xc2\xf1\xc5\x60\x8b\xb4\x96\x82\x7e\x07\xac\xf3\x40\x37\x7f\xdc"
+ "\x98\xbb\x8a\xb2\x60\x33\x93\xb8\x24\xc6\x55\x45\x70\x5d\x21\xc6"
+ "\x72\x9c\x71\x3c\x67\x6a\xcf\xa3\xf8\xb9\x7d\x85\x98\xdb\xe1\x7e"
+ "\x7a\x9e\xbe\x47\xa8\x62\xe3\x3c\x9d\xdf\x1d\x4f\x28\xe9\x31\x3e"
+ "\x4f\xc4\x71\xa7\x22\xb0\x85\x5a\xb9\xde\x5c\xb6\x67\x51\x1f\xf2"
+ "\x55\x40\xdf\x68\xe1\x7c\xfe\xa4\xdb\x06\xe2\x97\x38\x9e\x07\xca"
+ "\x70\xbb\xda\x93\x9b\x32\xf5\xb6\x0e\x08\x64\x19\xbf\x62\xdb\x42"
+ "\x7a\xdb\x90\x7e\xa4\x54\xa5\x87\x38\xfe\x21\xfb\x3a\x76\xb8\x9f"
+ "\x19\xa6\xb7\x55\x6f\x03\xd7\xc7\xe7\x37\x45\xca\xd1\xbd\x1c\x7b"
+ "\x86\xeb\xe3\x78\xaa\xc8\x3b\x45\x6f\xef\x57\xa5\xe5\xa2\x4a\x21"
+ "\x78\xfe\x64\xf9\x6b\x1b\x4a\xd4\x18\x60\x99\xf2\x4c\x65\x6d\x65"
+ "\x00\x34\x77\x74\x3f\xea\xd8\xd7\x2e\xec\x14\xe9\xb2\x27\x1c\x63"
+ "\x2e\x83\xfc\xcd\x52\x3e\x6c\x3c\xba\x2f\x22\xa6\x40\x4e\xa0\x5c"
+ "\xd7\x14\x5e\x6b\x02\xdf\xe6\x99\xea\x0a\x5b\xf9\xcc\x25\x64\x4e"
+ "\x9e\x09\x79\xf6\xb2\x9e\x05\x7b\x2b\x28\xbf\x5f\x01\xd9\xe4\x59"
+ "\x31\x16\x30\xf2\xfa\x98\x1c\x64\xaa\x8b\x8b\x53\xd5\x1b\x7d\xb4"
+ "\x9b\x3f\xde\xdd\xbe\xf1\xe3\xe2\x0e\x77\x1e\xf4\xff\x67\x7b\xdd"
+ "\xf3\x5d\x3f\x18\xf8\x44\xbe\xb2\xa1\x6c\xef\xe5\xd9\xaf\x94\x57"
+ "\xdf\xaf\x66\x19\x34\xc6\x4a\xa9\x22\xf9\xe3\xdd\x2c\x6f\xdb\x53"
+ "\x3e\x2e\xe6\xb9\x04\xe5\x77\xea\xe5\x79\x5e\xe7\xb9\x03\xe3\x65"
+ "\x2d\xed\x96\x87\x79\x4d\x8a\x9f\xf3\x9a\x74\x1e\x4d\x54\x4f\xc1"
+ "\x0e\x11\x71\x8e\x24\xa3\x17\xf3\xd6\xed\x41\x4a\xad\x7a\x8b\xa8"
+ "\x6c\xb5\x08\xbe\xba\x1a\x36\xcc\x50\xfe\xde\x45\xde\x14\xe6\x51"
+ "\xa6\xef\x2d\xa0\x97\x24\xb4\xe5\xd5\x4b\xa8\xb3\x48\xe5\xd3\xfc"
+ "\xd6\xad\xc8\x57\x80\x6b\xba\x30\x1a\xa9\xbc\x88\xcc\xe5\x11\x32"
+ "\x95\x15\xd1\x30\xa4\x41\xd7\x7d\x76\x8e\xce\xb3\x89\xda\x50\x5a"
+ "\x45\xf4\x0a\xea\x5d\x57\x24\x42\x7f\xc0\x7c\xee\x8e\x88\xe0\x57"
+ "\xc1\x3b\xfa\xbf\x47\xf5\xf1\xd9\x3d\xba\x4e\x88\x7b\x4f\xac\xdf"
+ "\xc1\xb3\x97\x9d\xf1\x7e\x72\xe9\xd2\x82\xdc\x65\x0b\xf9\x92\x31"
+ "\xf2\xf9\x5b\x53\xa2\xd7\x42\x78\xfe\x53\x71\x2a\x9e\x6d\xe6\x75"
+ "\xc7\x57\x07\xea\xfb\xe8\x4b\xac\xfa\xda\xa7\xe6\xaf\x7f\x0f\xdb"
+ "\x74\x6c\xfb\xe0\xdd\xd8\xc3\x85\x6b\x19\x8c\xe1\x33\x33\x19\xe3"
+ "\xeb\x5b\x34\xbf\x60\x7e\xde\xdd\xbc\x63\x96\x92\xa0\x9e\x25\x53"
+ "\xe2\xea\x71\x75\xd7\xa3\xe6\x9f\x80\x91\xf3\x6d\x1e\xd2\x24\x92"
+ "\x43\xf9\xea\xac\xf4\x92\x1d\xfa\x9a\x56\x2f\x7e\x8e\xc1\xf0\xc6"
+ "\x4f\xfc\xcc\x0f\xce\xb5\x64\xfc\xed\xea\x66\x23\xeb\x91\x45\xb8"
+ "\xe7\xb5\x05\xb9\x46\xa6\xc5\x8b\xfa\xfd\x85\x66\xcc\xef\x4b\x82"
+ "\xa2\xe4\x68\xd0\x47\x4b\x7a\x5d\xb3\x89\xf6\x11\x61\x9f\xc2\x16"
+ "\x5a\x9a\x76\x25\x9f\x23\xce\xcf\xfd\x61\x9a\x8d\x2b\xf7\x82\x1a"
+ "\xb3\xa5\xa0\xff\x3c\x5b\xf7\x79\x5e\x2d\x4f\xe9\x60\x3d\x0e\xd7"
+ "\xd2\xb9\xbd\xfa\x8b\x14\x7f\xbc\x57\xd1\xf8\xd2\x8f\xea\x60\xaf"
+ "\xa1\x9f\x3f\x39\x45\x4b\x0f\x9b\xac\xd0\x11\x86\xd2\xcf\x70\xff"
+ "\x11\x97\xe5\x77\x31\x74\x74\xc3\xd9\xed\x26\x48\x17\x48\x19\x83"
+ "\x50\x7f\x64\xd2\x6e\x92\xf0\x33\x0a\x83\xdc\x4d\x4d\xc2\x08\xf6"
+ "\xeb\x6b\x22\xcb\x80\x54\xf3\xd7\x6f\x1c\x66\xbd\xe7\xfb\xe3\xc7"
+ "\x39\x8b\x0a\x21\x95\x43\x41\x8b\x88\x8e\x9f\x16\xb2\x3e\x7c\xab"
+ "\x8b\xa4\x3f\x4d\x49\x28\x61\x9c\x98\xcd\x6e\x91\xcf\x67\xd7\x23"
+ "\x03\x06\x65\x39\x9f\x27\xe3\x7b\x9d\x3e\x23\xc7\x68\x66\xfd\x99"
+ "\xbf\x75\x71\x8a\xf2\x1f\x3c\x84\x34\xe0\xcb\x21\x36\x0d\xca\x52"
+ "\x7a\x67\xfe\xcb\x91\x2d\x83\xb2\x7a\xe0\x9b\x88\xe1\x3b\xdf\x24"
+ "\xe3\x8e\xa2\x56\xa3\xd7\xf4\x7d\xf2\xda\x02\x74\x08\xf7\x09\xc7"
+ "\x0a\x75\xb2\x2e\xcb\x30\xaa\xdd\x91\x62\xe7\x17\x64\xd4\xce\x9f"
+ "\x1a\xcf\x51\xfe\xd1\xdd\xbd\x94\xe3\xf3\xde\xed\x29\xde\x4b\x1d"
+ "\xee\xe7\x4c\x3e\xba\x37\x5b\xd3\x65\x30\xe7\x3e\x07\xfb\x7f\xa9"
+ "\x8c\xf3\x84\xf7\x17\xf9\xbb\x30\x48\xcb\xd0\xf3\x24\xd6\x67\x78"
+ "\x0d\x5e\x78\x98\x0e\xc4\xa5\xbf\xb7\xf2\xd9\x96\x5e\xfc\x60\xfa"
+ "\x79\x1d\x77\xf2\x5e\x64\x9f\x01\x90\x3f\xce\x8b\xa2\x2b\xec\xa6"
+ "\x74\xb0\x93\x31\x6c\xa4\xaf\x87\x2e\x89\x9c\x86\xb6\x0b\x32\xa6"
+ "\x29\xcb\x9a\x5f\x2f\xfa\x83\xd1\x1b\x3c\xef\xf1\x6e\x88\x50\x23"
+ "\xf4\x4a\x6f\xe5\x79\x8f\x8a\x7d\x1a\xa6\x06\xfa\x0b\x35\x38\xfe"
+ "\x9f\xcb\xeb\xfa\x0b\xd2\x85\x8c\x85\xdd\x75\x49\xcc\xf1\x9a\x3e"
+ "\x21\xfe\x4e\x11\xcf\x71\xc0\xbb\xed\x1c\x3d\xf7\x8f\xdf\x03\xce"
+ "\x7b\xff\x09\x58\x32\x66\xda\x04\x3a\x84\x7b\xf4\xa9\x7b\xfe\x4b"
+ "\x18\x6b\xc6\xe0\xd9\x6c\x71\x3c\x6e\x8c\x60\x2e\xe5\xd8\x76\x98"
+ "\x43\xc7\x72\xbf\xf0\x9c\xc9\xcf\xb8\x8e\xe2\xab\x65\x9d\x67\x9b"
+ "\x25\xf4\x38\xcf\xad\x39\x3c\x6f\x22\x7d\x4e\xf5\x25\x39\xd7\xce"
+ "\xd2\x9e\xa7\x69\xcf\x53\xb4\xe7\x6c\xed\x39\x4b\x7b\xe6\x75\x79"
+ "\x6d\x4e\x5e\x56\xd6\xad\x2f\x18\xfb\x35\xe1\x79\xbb\x3e\x16\x68"
+ "\x4f\x7f\x8b\x63\xad\x9c\xdb\xb5\x76\x8c\xd5\xda\x95\xa9\x3d\xeb"
+ "\xed\xb9\xc1\x12\x5a\xfb\x7f\xd4\x9e\xe5\xb6\xd8\xf6\x2c\xcf\x8c"
+ "\x6a\x0f\x59\x1c\x59\x5f\xa5\x3d\x69\x16\xfe\x4e\xc4\xff\xa2\x3d"
+ "\xdc\x16\x4e\x43\xfd\xbb\xe3\xda\xe3\xd1\xdb\x93\x90\xde\x56\x88"
+ "\x56\xd6\x6b\x96\x5f\x2f\xe3\x3a\xf7\x63\x9d\xa5\xba\x53\x8f\x53"
+ "\xb8\x3c\x74\xa5\x38\x85\xe0\x05\xcc\xdb\x05\xe8\xff\xf2\x7a\x4d"
+ "\x7f\xab\x51\x7a\x7e\xc1\x58\xdd\x77\x0c\x7d\xdd\x59\xaa\xfa\xba"
+ "\x6b\x03\xc7\xea\x5b\x45\x5f\x73\x3a\x44\x2b\xec\xee\xff\x62\xdb"
+ "\x30\x1a\x6e\x5e\xc1\xf2\xe5\xcf\xde\x6d\xcb\x9b\xbf\x64\xa1\x6d"
+ "\xe4\x02\xdb\x72\xfb\xe2\x45\x05\x0b\x63\xfd\x29\xd2\xb4\xef\xf7"
+ "\xc8\x73\x22\x6c\x4b\x49\x5b\x1a\xf4\x2f\xe5\xa4\xf4\xc9\x2b\xb8"
+ "\x28\xdc\x05\xf3\x58\xe6\x56\xbd\xa2\xbe\xf3\x84\xf6\xd4\xe9\x73"
+ "\x88\x6e\xff\xf2\x1c\x82\xf4\x93\x98\x27\xe7\x46\xa5\x73\x5e\xbf"
+ "\x9e\xc6\xf0\x35\xd9\xd4\xef\x14\x15\xbc\xcc\x75\x26\xc4\xe1\x25"
+ "\x01\x3b\x20\x87\xbf\x61\x61\x84\x4c\x11\x1c\x77\x8b\xcf\x5f\xa2"
+ "\x9c\x38\x4d\xcf\x4b\xbb\x62\x0e\x9e\x95\xcd\x26\xd0\xc6\xe7\x1f"
+ "\x46\x99\x1d\x48\x33\xb1\x0e\x01\x3b\xb0\x95\xcb\x21\xfd\x59\x8e"
+ "\x83\x81\x74\xb3\x16\x4f\x8c\xd3\xd6\x71\x9c\x0a\xa4\xa5\x45\xa5"
+ "\xbd\x86\x34\x2b\xd2\x6c\x1a\xbc\x77\x18\xcf\x78\xce\xd2\xd6\xc9"
+ "\x38\xcf\x3e\xad\xde\x98\x98\x16\xfc\x0d\x97\x3b\x6f\xcf\xb4\xcd"
+ "\x99\xfd\xed\x09\xdf\x7f\x6a\xe9\x92\x45\x29\x24\xd1\x9e\x81\xe9"
+ "\x38\xf3\x4e\xc7\xad\x77\xdb\xf2\x17\x2e\x5c\x66\x5b\xb9\x70\x49"
+ "\x81\x6d\xfe\xca\xf9\xab\x52\x68\xd1\xd2\x65\x4f\x71\x94\x05\x1e"
+ "\x96\xe5\xb9\x4f\x2d\xfa\x31\x3b\xbd\xa8\xdc\x29\x31\x7a\xc2\x1c"
+ "\x96\x6d\x5a\x5c\x92\x23\xa5\xac\x43\x26\x1f\x77\xe1\x9e\xe3\x75"
+ "\x59\x71\xad\xc3\xaf\x06\xbf\xbd\xf8\x1d\xc7\xaf\xe9\x0c\xad\xe1"
+ "\x98\x18\x7b\x3a\xdc\x2b\x16\xe8\xfa\x4a\x0f\x0d\xad\x70\xe8\x34"
+ "\x04\xfd\x62\x8f\x9a\xdf\x56\xec\x6c\x0c\x49\xfe\xe9\xa6\xa9\xd2"
+ "\x4b\x3d\x34\xc5\xf1\x46\x1b\xd9\xa7\x6b\x05\xde\x77\xca\xb5\x4a"
+ "\x5e\x33\x49\x66\xbc\x9d\xa6\x55\xdb\xaa\x5f\x17\xf5\x1c\x2b\x07"
+ "\xd7\x3a\xd0\x4b\xbd\x8a\x4f\xb3\x72\x04\xf2\x0d\x47\x1d\x35\xaa"
+ "\x0e\xed\x79\xb0\x38\xc2\xdf\x70\x39\xa5\x3d\x33\x2c\xc0\xb8\x8b"
+ "\xef\xf9\xaa\xed\x9d\x5a\xb4\x6f\xbc\x19\x7b\xde\xad\x6c\xd0\xea"
+ "\xe0\x6f\xfd\xb8\xaa\xdc\xd2\x96\x92\xb6\x33\xaf\x11\x5b\x0c\xf7"
+ "\x08\xb4\xe7\x7c\x24\xe9\x31\x15\xff\xd2\xd5\x09\x19\xf1\xad\x6f"
+ "\x79\x1d\x32\xbf\x81\xd7\x90\x67\xe4\x8b\x08\xc7\x21\x8f\x24\x3d"
+ "\xd3\xcc\xe5\x84\xf9\xb8\x2b\xb2\xa5\x7f\x96\xd2\x19\x38\xee\xe0"
+ "\xca\x9d\x1a\xcc\x20\xe3\xf6\x0c\xad\x78\x44\xd9\xe1\x6b\x36\x28"
+ "\x5d\x62\xe5\x1e\xdd\xd7\x12\x3c\x9a\x81\xe7\x3a\x5d\x06\xf8\x68"
+ "\x65\x99\xe6\x17\xe7\xd1\xfa\x1f\xd2\x9e\xf7\x6a\x6d\x34\x70\x2c"
+ "\x14\xb4\xbf\x89\xc7\x0e\xfa\xca\x5e\xdc\x1f\x07\x7e\xea\x15\x7e"
+ "\x1c\x32\xce\x01\xf4\x26\x7e\x7f\x9c\xbf\x77\x83\x77\xc7\x55\x9c"
+ "\x91\x95\x63\xb9\xcf\x3d\xbe\xb3\x95\x59\x68\xeb\x5d\xbc\xc7\x0c"
+ "\x5e\xda\xeb\xbd\xc4\xfc\xb9\x32\x13\xf0\x76\xeb\x72\x87\xe5\x4c"
+ "\x6e\x18\x7c\x2a\xed\x29\x47\x9e\x2e\x6f\x7a\xe8\xc0\xe1\x4a\x24"
+ "\x4b\x12\x8d\xbb\xc2\xbf\xe3\xef\xc2\xfd\x7c\x1d\xda\xb4\x5b\x8e"
+ "\x01\xc7\x63\xbd\xd4\x6d\xb7\x75\x29\x19\xe9\x38\xde\x6d\x63\x6a"
+ "\xed\xe0\xd8\xee\x3e\x6e\x5b\xa7\xdc\xf7\xd7\xe4\x86\x23\xa4\xcb"
+ "\x0d\x1d\x8e\xc5\x20\x22\x16\x07\xfe\x15\x1f\xab\xe0\x3d\x12\x9e"
+ "\x2f\xa5\x3e\x02\x38\x03\x2e\xaa\x33\x70\x91\x92\x63\xb0\x4d\x1d"
+ "\x7b\xf8\x9b\x6f\x52\xa7\x75\x3f\xff\xff\x7a\x64\xd1\xaa\x59\xd1"
+ "\x30\x85\xf9\x58\x05\xc3\x65\x79\xc4\x3a\x49\x6e\xd8\xc4\x71\x68"
+ "\x2a\xb4\xf9\x05\x32\x78\x95\x4b\x6f\x2b\x70\x78\x44\x6f\xaf\xf6"
+ "\xcd\xb1\x23\xa8\xc7\x37\x33\xdc\xc5\xbe\xe0\x75\x6a\x3c\xd7\x48"
+ "\x79\x83\x77\xbb\x50\xb6\xc6\x47\xcf\xa7\x69\x3c\x54\x8f\xf2\xbb"
+ "\x6a\x8b\xb2\x91\x67\x55\xb3\xe6\xcf\xdc\x84\xf1\x3d\xde\x43\xfb"
+ "\x2b\x1a\xa2\xd6\x79\x8e\xab\x31\xfc\xbe\xeb\x14\xad\xb6\x46\xa5"
+ "\x6b\x63\x5b\x3b\x0b\xe9\x0d\x6a\xcd\xe4\x58\x8e\x2a\xbf\x5a\xf9"
+ "\xae\x6a\x6d\x64\x59\xc0\xe7\xf5\x98\xc7\x25\xee\xe5\x18\xaf\x9e"
+ "\xa5\xcf\x17\x80\xb5\x47\xe2\x7c\xb0\xa8\x61\x3c\xa9\x78\x1f\xcf"
+ "\x5f\x52\x78\x5a\xed\x88\xc1\x3d\xcf\x9b\xa8\x87\xf1\x34\x60\x9d"
+ "\x88\x0c\x08\x18\x44\xee\x2a\x13\x31\xbf\x30\x8f\xf3\xde\x20\xe8"
+ "\x43\xea\x55\x0a\x6f\xab\xf7\xea\x78\xd3\xc7\x8e\xf1\xe4\xa3\xd5"
+ "\x19\x8c\xdb\xd8\x3e\xf6\x6b\x3a\xa5\xf7\x1d\x38\xe5\x98\xa6\x78"
+ "\xae\xd7\xf8\xa2\xde\x33\x94\x7d\x47\x56\xfc\xa9\xd6\xf4\x6d\xaa"
+ "\x75\x8c\x25\x85\xdb\x35\x56\x1f\x15\x38\xa2\xec\x92\x23\x8c\x5f"
+ "\xe6\x15\xb4\xb3\x5c\x8b\xbd\x75\x44\xf9\x31\xad\xa8\x17\x25\xc7"
+ "\xca\x25\x2f\xaf\x90\x31\x52\x38\x6e\x6f\x13\xe3\x88\xe5\x22\xf3"
+ "\x12\xf3\x00\xf3\x93\xc2\xd1\x9a\x82\x28\x1c\xd5\x31\x7e\x34\x3c"
+ "\xed\x89\x93\xe5\x0b\x6d\x79\x13\x94\x2c\xb6\x65\x8c\x5c\x30\x46"
+ "\x06\xba\xb1\xdd\x37\xe9\x6e\xdb\xac\x09\x23\x1d\xf6\x51\x33\xd4"
+ "\x65\xd2\xac\x69\x7c\x4d\x89\xb5\xeb\x6c\xa8\xe7\x64\xac\x6d\xb8"
+ "\xce\xae\xe4\xc7\x9a\x80\xcf\x90\x2a\xfd\xd9\x39\xee\x6c\xe9\x12"
+ "\xa2\x30\xda\xbd\xe5\x0c\xc6\xd4\x7c\x6c\x2c\xc7\x39\x9e\xe9\x20"
+ "\x8e\x8b\xfe\x45\x35\xde\x55\x21\x7d\x40\x3e\x7f\x1f\xe1\xaf\x22"
+ "\x92\x7c\x6c\x2c\xaf\xd9\x88\x92\xfd\x41\x7f\x72\xc8\xea\x4f\xee"
+ "\xf2\xf9\x93\x9b\xcc\x93\x6f\x75\x8a\x0e\x77\xe1\x34\xbd\x5f\xbc"
+ "\xb6\x03\x3c\x8d\x9d\xe9\x10\x61\xc6\x51\xae\x83\x63\x91\x03\x76"
+ "\x12\xaf\xed\x14\xa2\xff\xf9\xbb\x95\xfd\x5a\x08\xfa\x5f\xa1\xe9"
+ "\x33\x34\x0b\xcf\xd0\xff\xbe\x2d\xd7\xb8\x22\x6e\xab\x8c\x61\x1e"
+ "\x59\x7f\xdb\x43\xa2\xa4\xcb\xa7\xc3\x04\xac\xbe\x9a\xdf\x83\x84"
+ "\xf7\x55\xfd\x6a\x23\x1b\xff\x98\x6d\x31\xa8\xb8\x90\xe0\x71\x57"
+ "\xb5\x31\x92\xd3\xed\x27\x83\x77\x03\xd6\xa5\xb1\x1f\x4d\x0e\x68"
+ "\xcf\xc5\x79\xf4\x77\xa5\xee\x88\xaf\xd4\x18\x09\x62\x1c\xd3\x94"
+ "\xfe\xdc\xc6\xf2\x13\xb6\xeb\xda\xf1\xfa\xbc\x26\xe7\x43\x23\xb9"
+ "\x94\x3d\xb3\xf6\x71\x2e\x77\xc1\x6d\x22\xc8\xec\xfa\x9b\xd2\xa5"
+ "\x8d\x12\x8c\xb8\x0d\xa4\x7c\x99\xd7\xde\xa1\xcb\x58\xde\x2f\xb5"
+ "\xac\x13\x7e\x5e\x23\xb6\x84\x84\x5f\xc6\xda\xe7\xb9\x83\xce\x90"
+ "\xb7\xb0\xc3\xe5\x95\xdf\xe0\xe4\xef\x8a\x04\xb4\x79\x23\xac\xe6"
+ "\x0d\xd4\xef\x4f\xba\x6d\x1e\xe6\x07\xc3\x19\x82\xae\x8b\xf6\x33"
+ "\x6e\x78\xaf\x25\x02\x5c\x79\x79\x9e\x64\xfc\xa4\xd4\xd7\xb1\x0f"
+ "\x0c\xf7\xd5\x12\x42\x9f\xa3\xfb\x65\x8c\xf8\xb6\xb8\xd1\x2f\x23"
+ "\xfa\xe5\x38\xcb\x3c\x13\x64\xdf\x24\xf0\xdb\x60\x19\xcf\x5a\xda"
+ "\xe7\x45\xb6\xe8\x3e\xb2\xfc\x57\x7d\x28\x9a\x98\xa8\x8f\xc2\xc8"
+ "\x7d\x64\x1c\x14\x5d\xa7\xf1\x9b\x6c\x27\xcb\x8f\x36\x5a\x7b\x7c"
+ "\xc0\x3a\xf6\x09\x3a\x36\x16\xf2\x6d\x12\x8f\x21\xe6\xcf\x32\x6e"
+ "\x67\xa2\xf1\x62\x78\x1a\x2c\x9f\x65\x9d\x6b\x1e\xda\xb2\x2b\x31"
+ "\xbe\x8b\x1a\xae\x8c\xef\xa2\x9f\x72\x79\x6e\x07\xef\xef\x58\x42"
+ "\x46\xc8\xe0\x2e\x1f\xec\xb5\xe2\x44\xf5\x0e\x58\xb7\x9d\xdb\x95"
+ "\xf0\x9d\x60\x7e\xd1\x64\x10\xe8\x50\x80\x4f\x04\xcb\xa4\x0e\xb7"
+ "\x73\x8a\x2e\x8f\x2c\x06\x5b\x92\x94\x0f\x46\x51\x96\x08\x86\x65"
+ "\x5d\x19\xef\x73\x4d\x42\xfd\x09\xdf\x47\xf8\xdb\x1d\xc5\xc7\x6c"
+ "\x91\xf5\xdf\xbc\xc9\x62\xa0\x7b\xfc\x49\xdf\x4c\xb1\x38\x42\x23"
+ "\x18\x87\x80\xe9\x00\x1f\x3f\xcc\x76\xaa\x5a\x1b\x71\x42\xff\x7f"
+ "\x59\xc6\x67\xf2\x27\x1f\xb3\xa9\x7d\x23\x27\xe6\xbf\x0a\x9b\xbe"
+ "\x36\x8f\xe7\x16\x1f\xfd\xdd\xae\xf8\xf2\x6b\x6f\x89\x8d\xde\xe3"
+ "\x11\xb7\x45\xd8\x56\x5b\xa0\x47\xba\xd6\x46\x04\x7f\xcf\xc1\x7b"
+ "\xbc\x87\x4e\x94\xbf\x94\x4e\x27\x1d\x6e\xd7\x88\xc4\x34\xe0\x9a"
+ "\x7c\x65\x1a\x70\x5d\xcf\xef\x19\xef\xca\x56\x71\xe5\xe9\x7a\x8a"
+ "\x58\xff\xb5\xb7\x6c\x45\xb2\x7e\x52\x75\x33\x4e\xb2\x78\xcf\x68"
+ "\x1a\xf0\xe2\x42\xde\x0a\x5d\x0e\x30\xbd\x58\xc2\xfc\xad\x0b\x92"
+ "\x34\x8d\x77\x98\x57\x0a\xcc\x6a\x1d\xbc\xa9\x4c\x7e\xbf\xd2\xbd"
+ "\xa6\xcc\xef\xb4\x6f\xe5\xef\xb4\x06\x92\x8f\x55\x22\x4f\xb3\x8f"
+ "\xea\xd4\x7e\xab\xf9\x58\x39\x60\x54\x94\x2b\x7f\x68\xb3\x8c\x17"
+ "\x05\x9e\xe6\x18\x51\xcc\xd7\x48\x4b\x47\xbb\x39\x5e\x14\xec\x9d"
+ "\x75\x69\xdd\xf3\x92\x3b\x0b\xb2\x42\x48\x5d\x0c\xf3\xd2\xb0\x76"
+ "\xe0\xee\x35\x63\x64\xe7\xa5\x31\x56\xe2\x3e\x5f\x5a\x3f\x74\xe7"
+ "\x4f\x6e\x27\xd3\xbf\x5a\x9f\xa4\xfc\x3b\x29\x7d\xdd\xb7\x4d\xf4"
+ "\xdf\xe3\xc8\xc8\x78\xf0\xd1\x3a\x9b\xc2\xdd\xba\x79\xfa\xf8\xf8"
+ "\xc8\x79\x44\xca\xce\xf5\x8f\xb5\xce\x0c\x89\x2f\xd4\x3a\xf7\x3a"
+ "\xc8\xbf\x67\x2b\xd4\xfb\x35\xad\xf1\x6b\x40\xac\xcf\xdb\x16\x2f"
+ "\xb7\x2d\x58\xba\x72\xc9\xf0\xe1\x31\xb6\x92\x49\x7d\x17\x77\x5d"
+ "\xb9\x9a\x4f\xd7\x1d\xd1\xdb\xcd\x7a\x09\x9e\xd1\xff\x35\x97\xc5"
+ "\xb2\x9f\x96\xab\xb9\xb9\xe7\x66\x52\xcf\xfd\x1d\x34\xed\x8e\xa8"
+ "\xc7\x6f\xd1\xb4\x3b\xbf\x95\xfb\xd0\xc2\xf9\x0b\x56\x45\xa5\xde"
+ "\x15\xbd\x6e\x58\xfa\x16\xea\x4e\x1a\x7a\x2f\x64\x85\x61\xc6\x1a"
+ "\x9e\x5b\xdc\x07\x8b\x42\xe2\x6f\x90\xd7\xe3\xc0\x63\xb9\x0d\x05"
+ "\x21\x6a\x80\x2c\x13\x5f\x63\x19\xde\x4f\x9d\xed\x84\x3e\x05\xda"
+ "\xb2\xa0\xef\x7e\xe8\x75\x17\x79\x7d\x06\xe5\x3e\x6b\xac\xe0\x98"
+ "\xce\x4d\x5a\xbc\x7a\x77\x25\xd2\xaf\xc5\xf5\x23\x5c\xfb\xe2\x7a"
+ "\xd4\xb6\x04\x76\x0f\xfb\xd2\xaf\x60\x5f\x7a\xf7\xfb\xd2\x1f\x28"
+ "\xe0\x22\xf6\x09\xc2\xfb\x39\xac\x83\xf8\x68\xbd\x89\xd7\xc1\x39"
+ "\x2f\xd2\xb6\xd9\x9e\xa6\x4c\xbe\x0a\xb9\x37\xe8\xae\x14\x25\x4d"
+ "\x69\x62\x6b\x0e\x7f\x6f\x6d\xc4\x69\x5a\x6f\x48\x32\x7c\x46\x49"
+ "\x56\x73\x6a\x87\x7b\x3d\xca\x2e\x99\xc3\x78\xea\xed\x5b\xb4\xf2"
+ "\x1b\xc0\x71\xfa\x61\x8f\x6e\xb8\x91\xa4\x7e\xab\xe9\x73\x55\x72"
+ "\x5e\x58\x3f\x27\x4a\xa7\xe3\xbd\xe9\x14\xa5\x9f\x88\xb0\xd2\x4f"
+ "\xd7\x17\xe8\x7c\x80\x7b\x97\x4e\xa7\x31\xf1\xf5\x96\x14\x2c\x5c"
+ "\xb6\x70\x81\x6d\xe4\xf2\x14\x8a\x8a\xae\x67\x5f\xb8\xc4\xb6\x6c"
+ "\xe1\x73\xcf\x2f\x5c\x2e\x23\xe3\xf1\xdb\x98\x39\x3f\x5d\xa4\x34"
+ "\x66\xeb\xe7\xbe\x6c\x43\x19\xbf\xeb\x3f\xe7\x98\x6c\x62\x63\x63"
+ "\x1d\xfb\xee\x48\x1d\x25\x75\x50\x4e\xac\xbd\xf1\x82\x8a\x3b\x51"
+ "\xdc\xa4\xd9\x3a\x2f\xc8\xef\x58\x9f\xa2\x0d\x65\x3d\xf1\xdf\x37"
+ "\x4c\x04\x2e\x8d\x1a\xde\x2e\x76\xb8\x37\x8c\xd3\xf1\xe6\xa3\x17"
+ "\x3c\x9a\x2e\xd5\x26\xe5\x07\xe6\x58\xc8\xbf\x98\xf9\x55\x7d\x83"
+ "\x76\x03\xc7\xe5\x48\x92\xeb\xc9\xc9\x4d\x26\xae\x8b\x61\xa2\x3e"
+ "\x0f\xc6\x07\xb8\xb5\xb1\x7c\x2b\xd6\xe1\xa1\xce\x0c\xae\x4f\xb3"
+ "\x83\x86\x9c\xa1\x17\xe4\x9a\x73\xa4\xb8\xc9\xc4\x32\x85\x63\x88"
+ "\x44\x4a\x00\x47\xee\xd1\xbe\xe0\x91\xeb\xb0\xfc\x0d\x02\xc0\xe2"
+ "\x75\x60\xc8\x86\x74\xfe\x5e\x31\xa7\xa9\xd8\x70\xeb\x37\xf1\xda"
+ "\xb3\x28\xf1\x02\xef\x1b\x82\x3d\x67\x1b\x5e\xf0\xb0\xde\xc9\x70"
+ "\x7d\xb4\xa1\x86\xe1\xa9\xd8\x77\x2f\x0c\x03\xed\x8c\xe8\xd1\x9f"
+ "\x5e\x98\x17\x65\x97\x71\x7b\x64\x3b\x03\x68\x8b\x8c\xb3\xaa\x7c"
+ "\x4d\x65\xbf\x59\x7e\x96\x6b\x7d\xd7\xfb\x03\x78\x90\x7f\xeb\xd3"
+ "\x74\xbf\x09\x9f\xd6\x6f\x6e\x1f\xb7\x3d\xba\xcd\x5a\x7b\x2b\xb8"
+ "\xbd\x28\xb7\x23\x8a\xb7\x79\x5d\xa6\x0f\xd2\xf6\xf6\xf8\xb0\x6f"
+ "\xa0\x78\xb9\xb1\x74\x89\x2d\x6f\xf1\x92\x67\x72\x57\xce\x7f\x66"
+ "\x61\xee\xf3\xf9\xa3\x6c\xcf\x2f\x79\x32\x6f\xe9\x53\xcf\x30\xd5"
+ "\x2c\x2f\x78\xfe\xa9\x67\x6c\x2c\x59\x72\xb3\xa7\x4d\xcb\xbd\xf7"
+ "\xe1\xd9\x8f\xa4\xd0\xbd\xf3\x91\x06\xcb\x7f\x5a\xe6\x28\xf5\xea"
+ "\xa1\xc9\x93\x7e\x98\x3b\x69\xe6\xc3\x33\xe6\xc8\x43\x2f\xdd\xef"
+ "\xb3\x97\x24\xce\x10\x43\x87\x69\xa2\xd8\x1b\xc2\xf8\xf6\x39\x45"
+ "\x25\xe3\x55\xbc\xf4\x17\xf3\x62\xe3\xa5\xbf\x88\x46\xbf\xb8\x1d"
+ "\xbf\x1a\xa2\x9f\xf8\xf1\x83\x74\x2f\xc9\x54\xf4\x95\xfc\x44\x87"
+ "\xfb\xc5\x8a\x1e\xfa\x2a\x91\x67\x29\xd9\x4f\x49\xad\xcf\xbe\x08"
+ "\xf9\xbf\x7e\x6f\xf4\xbb\x1e\x7b\xf2\xc5\xa6\x6e\x7b\xb2\x5b\xa6"
+ "\xbc\xd8\x6d\x5b\x22\xcd\x0c\xbb\x32\x99\xed\x4a\xb5\x9e\x54\x32"
+ "\x41\xd2\x54\xaf\xfc\x6d\x26\xdd\xae\x64\xde\x96\x7b\x52\xd2\xfe"
+ "\xf8\xc9\xb8\x68\x1e\x97\x6b\xfa\x1a\x8f\x73\x39\xb9\x7e\x97\x3a"
+ "\x28\x9b\xd7\xb4\xfd\xc9\x5e\xd6\x15\x30\x7f\x75\x08\xd1\x7f\x50"
+ "\xb6\x6a\xd3\x4f\x1c\xbc\xc6\xcd\x7a\xb3\x46\x4f\x03\xce\xd0\x4f"
+ "\x3e\x10\xee\x17\xea\x95\x4d\xf9\x42\x98\xe5\xba\x58\x3f\xf4\x5e"
+ "\xf6\x2d\x62\xdb\x09\x75\xee\xea\xa1\xd9\x92\xf1\x4c\x0b\x3d\xb6"
+ "\xec\x4f\x62\xe4\x7f\xbb\xfc\x2e\xe1\x4f\x4e\xea\xf1\x1e\x0a\x86"
+ "\x93\xd1\x34\xbc\x8c\xca\x8d\x02\xf2\xe6\x27\x9b\xb8\x0e\xc6\xa7"
+ "\x8f\x5e\xdc\x89\xbc\xa6\x1e\xfc\x15\xa7\x75\xe3\x4f\x5b\x67\xd1"
+ "\xd7\x58\x54\xbb\x4b\x26\xf4\x86\xab\xc4\x78\x2a\x9e\xf7\xa5\x78"
+ "\x72\x53\x1f\xe6\x49\x1d\x5f\x97\xe3\xaa\x78\xc7\xe5\xb8\x2a\xbe"
+ "\xd8\x83\xab\x17\x6f\xb8\x1c\x57\xc5\xcd\x51\xfb\x4a\xda\x3a\x4a"
+ "\xc9\x04\xc6\x19\xd3\x18\xfa\xbd\x09\x74\x56\xd1\x83\xbf\x12\xf3"
+ "\xe5\xf8\x2b\x19\x96\x18\x7f\xc5\x7c\xbe\x2a\x1a\x4e\x55\xa2\x79"
+ "\x63\xc0\x3a\xa3\x76\x1e\xac\xe4\x65\xfe\xd6\x3d\xb7\xe3\x55\x63"
+ "\xc4\xfe\xaa\x1b\x3f\x5c\xd9\x8e\xe8\xd1\xc5\x45\x50\xc3\x6f\x59"
+ "\x1d\x6c\x5e\x5e\x57\xba\xc2\x5c\x74\x52\x5f\xf3\xc0\x7d\x33\xdb"
+ "\xce\xfc\x4d\x28\x4e\x67\x7c\xf2\x37\xc6\x40\xef\xcd\x4a\x2f\x2d"
+ "\xe9\xfe\xfe\x47\xfb\xcd\x2b\xb6\x27\xad\x23\x5b\x6d\xe5\x9d\x9c"
+ "\x1e\x04\x0d\x4d\xe1\x74\xf6\xdd\xea\x0d\x66\x6e\x38\x8b\x12\xc3"
+ "\xdd\xd8\x4d\xff\xbd\x9d\x89\x8e\x93\x47\xf6\xf9\x4b\x16\x2c\x5d"
+ "\xb4\xe8\xcb\x45\x51\xf4\xbe\x5a\x99\x3b\xc2\xdf\xc1\xea\xdb\xb1"
+ "\xfe\xe9\xd5\xa8\x13\xfa\x7f\x7e\xab\x9a\x37\x37\x42\xfe\x2d\xae"
+ "\x53\xba\xe4\x63\xad\xea\x1c\xf8\x4b\xe9\x51\xf2\x19\x34\xf2\x92"
+ "\x4d\xb8\x37\xce\xed\x19\xe3\x8d\x6d\x97\x8f\xf1\x4b\x94\x78\x8c"
+ "\x5f\x1a\x11\x59\xc1\xe7\x70\x5e\x82\xfd\xb3\x4c\xea\x9a\xfc\xcc"
+ "\x7e\x10\xb0\x99\x5b\x61\x2f\xb7\xcd\x5c\xe5\xb9\x27\x77\x95\x41"
+ "\xee\x15\xf3\xb7\x57\x42\x97\x44\x0b\xfb\x22\xf0\xfe\x18\x7f\x7b"
+ "\x85\xbf\xb9\xc4\xdf\xff\x94\x79\x70\x5f\x7a\x9a\xa4\xed\x88\xf7"
+ "\xb6\xea\xd3\xf2\xfb\xd8\xd0\x15\x5e\x72\xe9\xba\xb5\x05\x2a\x23"
+ "\x9f\x4f\xdf\xa2\xc6\xa3\x99\xc7\x82\xeb\xcb\x5d\xe5\x51\x75\x5c"
+ "\xe2\xef\xaa\x91\x45\xe9\x10\x2f\xed\xbd\xe2\xda\x7d\x72\xa8\xb7"
+ "\x18\x68\x66\x61\x74\xf5\xeb\xde\xab\xd4\xbe\x43\xcc\xbc\xcf\xfe"
+ "\xa3\x1d\xee\x4d\x69\xf1\xfe\xa7\xca\x77\x68\x53\x86\xee\x93\x55"
+ "\x2a\x7d\xa0\xc8\xc2\xf2\x93\xed\x9c\xd3\xb4\x69\x5a\xb5\x9c\x2f"
+ "\x37\x4d\x8b\xde\xe3\xb4\xad\x5e\xd7\xf7\x1c\xbd\x74\xf1\x0a\xfb"
+ "\xa6\xa9\x3d\xbe\xaf\xae\x7e\x28\xbf\xa9\xdb\x47\xcc\xed\xea\x57"
+ "\x1d\xd5\x36\xbc\xdb\x19\xe5\xab\xe8\xe7\xf9\x98\xed\xc7\x6a\xf5"
+ "\x5d\x55\x3f\xda\xd0\x80\x34\xd8\x13\x9b\x65\x3c\xc2\x95\x21\x1a"
+ "\x96\xff\x7d\xfe\x66\xcf\xa6\x8b\x9a\x1d\xda\x66\x2b\xe2\xf6\x6c"
+ "\x7a\x8d\xe1\xfa\x90\x4f\xc8\xfd\x80\xcd\xd4\xdd\xe6\xa8\xfa\x74"
+ "\xd8\x0a\x27\x9b\x47\xe8\xed\xf2\xd1\x26\x19\x3f\x85\xbf\x73\x1d"
+ "\xdd\x27\xc7\xa2\xc5\xb9\xf9\xf6\x55\xb9\x8b\x97\x2c\x2e\x48\x21"
+ "\xc7\xfc\xe7\x17\x8f\x41\x92\xed\x29\xfb\xe2\xfc\xdc\xc5\x32\x5a"
+ "\xb1\x0c\x84\x5c\xb0\x2a\x9f\xf7\x3e\x2e\xdb\x83\x4f\x93\xba\xbc"
+ "\x71\xf3\x78\x35\xdf\x6f\x2e\xd7\xe9\x54\x7e\xfb\x5b\xe4\x50\x8f"
+ "\xef\x95\xfc\x66\x70\x12\xfa\x79\x98\x69\x58\xc5\xf7\xd9\xd2\xac"
+ "\xf4\x8b\xcd\xf5\x97\xfb\x64\x6d\xf6\xe9\x3e\x59\xa0\xef\x34\xe6"
+ "\xf5\x28\x58\xa0\xff\x2d\x74\x79\x99\x2d\xe9\xdd\xfe\x9d\xda\x77"
+ "\xc7\x79\xac\x64\xbc\xfb\x57\x58\xde\x6e\x7e\xc0\xeb\x98\xcc\x31"
+ "\x7b\x35\xbe\xda\x92\x1d\xd5\x5e\xe9\xcb\xcb\xb0\xf8\x9c\xd4\x98"
+ "\x60\xb4\x2f\xdb\x96\x8f\x30\xf7\x5a\xf5\x7a\x6c\x6b\x8c\x90\x77"
+ "\x5b\xde\x0c\x18\x3d\x49\xd2\xff\x18\xe5\x00\xab\x4c\xf7\xa3\xf1"
+ "\x75\xf7\x6b\xcb\x8e\xf8\x36\xa2\xed\xc3\x91\x5e\xd3\xe3\x27\xb8"
+ "\xc5\xc5\x30\x90\x86\xf9\xbf\x74\x54\x74\x5a\xf4\x38\x4d\x9c\x3c"
+ "\x0d\x0a\xf4\xf2\x85\x18\xa4\x49\xf3\xf3\xf2\x58\x06\xcd\x5f\x98"
+ "\xf7\xfc\xb2\xa5\xcb\xb5\xa1\x9b\xb8\x88\xc3\x50\xcb\x2c\x77\x6b"
+ "\x6f\x6c\x4b\x16\x2e\x5c\xa0\x92\xb4\x81\x8c\xdd\xb3\x52\x7e\x0c"
+ "\xa5\xb0\xff\x37\xd9\x7b\x74\xc5\xd2\xed\xc2\xb8\xa5\x05\xbf\xf3"
+ "\x52\xfe\xc8\x71\x2d\xcd\x8b\xb5\xd1\x4a\x0b\x75\xde\x97\xe3\xec"
+ "\x64\x9f\xb3\xa3\x2f\xb7\x0b\xb9\xc7\x83\x71\x2d\xfb\x13\xfa\xd9"
+ "\xc7\x47\x65\x7c\xe6\xcb\x10\x05\x67\x4f\x37\xbe\xd7\x3f\xd6\xbc"
+ "\x5e\xf9\x4c\x98\xf8\x9b\xb5\x1c\x53\x02\xef\x61\xff\xbf\x74\x52"
+ "\xc9\xc9\x52\x5f\xf7\xde\x8b\x31\x09\xf6\x66\x29\x68\x7f\x69\xe6"
+ "\xe5\xfc\x5d\x66\xbe\x9c\xef\xd9\xd7\xb2\xcc\xa6\xe3\x38\xea\x1b"
+ "\xf4\xa0\xbf\xb2\x83\xfa\x9a\x71\xb5\xf6\x4d\x04\xbe\xe7\xb2\x6c"
+ "\x57\x88\x01\xfd\xef\x61\xbf\x86\x53\x54\xb6\x49\xd1\x54\x99\x3d"
+ "\xca\x37\x30\xed\x0c\x95\x15\xab\xb1\x2d\x73\xe9\xfc\x87\x7e\x4a"
+ "\x5d\x8e\x61\xa8\x79\xbd\xb4\x8f\xa2\xaf\xb2\x1d\x3a\x6e\xd9\x86"
+ "\xc7\xf3\x9e\x1e\x3d\xa8\x74\x8e\xf4\x17\x51\x31\x35\xba\xb8\xff"
+ "\x80\x33\x56\x87\x83\xbc\xe8\xbf\xd9\xaf\xe3\x4a\xcf\x13\x4d\x13"
+ "\x93\xe6\xe7\xc3\xc0\x5e\xbc\x68\xd1\xc2\x65\xcb\xf5\x38\xe3\x19"
+ "\x4b\xf3\x16\xa8\xb8\xe2\x77\x63\xf8\x57\x82\x87\x27\x70\x68\x72"
+ "\xa4\xaa\xdb\x38\x7d\x77\x14\xaf\x89\x48\xff\x51\x69\x73\xbd\x76"
+ "\xb0\x4a\xb3\xbf\x4e\xd1\x2b\xb3\x94\xff\xd5\x2b\xd7\x2a\xdd\xf6"
+ "\x9a\xb7\x3b\xdc\x2f\x17\xe8\xba\x2d\xaf\xb5\xb6\xd3\x4d\x15\x7c"
+ "\x46\x8e\xcf\x12\x6c\x7b\x5d\xb4\xf0\xda\x2a\xf2\x54\xe8\xdf\xa2"
+ "\x63\xbd\x69\xf3\xeb\x2a\x86\xb6\x67\x09\xfb\x8a\xbc\xf6\x69\xa4"
+ "\xe4\x58\x9a\x48\xd9\x97\x05\xfd\x2c\x95\x79\xa2\x7f\x1b\xfb\xf0"
+ "\x72\xec\xab\x97\x5b\x58\xaf\x63\x59\xc6\xdf\x6b\x68\xa1\x97\xf7"
+ "\x40\x46\x43\xa6\xbf\xe6\xf3\x27\x1f\x4b\xdb\xb0\x9a\xcc\x5c\x07"
+ "\xe4\xb5\xaf\x6e\x3b\xe3\xf6\x15\x3a\x0c\x59\xa6\xc9\x6c\x1f\xd7"
+ "\xe3\xa3\x97\xeb\xb5\x75\xff\x11\xda\x3a\xeb\x08\xe4\x83\xfc\xef"
+ "\x5f\xa1\x68\x75\xff\x87\xb7\xb8\xc8\xc1\xdf\xa6\x54\x71\xab\x3e"
+ "\xde\x8b\x7e\xec\xe5\x6f\x40\x42\x17\x84\xbd\xf3\x72\x01\xfa\xb0"
+ "\x57\xf3\x01\x07\xad\xbc\xd2\xa0\x7c\xfb\x5f\x5e\xc0\x38\x00\xdc"
+ "\x4c\x0d\x6e\x26\xe0\x62\xfc\x6f\xd0\xe2\x65\xbf\xb2\x49\xaf\x03"
+ "\xf3\x9f\x1f\x7a\x73\x90\x75\x67\xb4\xdb\x8c\x5f\x6a\xa9\xdc\x4b"
+ "\xf7\x41\xee\x5b\x04\xfb\xae\xf5\x7c\x6f\xef\x95\x3a\x7d\x2e\xe4"
+ "\xba\xb5\xb6\x8f\xe2\xb5\x3e\x5e\xe7\xd3\xea\x62\x79\x6f\xd0\x61"
+ "\xe2\xd9\x1c\xb9\x74\x76\x3b\x60\x9a\x31\xaf\xfb\xb5\xef\xac\xa5"
+ "\x96\x5e\x60\x3f\x47\x1f\xe6\xed\xaf\x8b\xdc\x50\x1a\xef\x41\xf5"
+ "\xd7\xbf\x63\x57\x7d\x81\xf1\xf5\x6a\x66\xcf\xde\x12\xca\x03\xff"
+ "\xe0\x07\x57\x0b\xbd\x3a\x95\xeb\x65\x5e\xe0\xb1\xec\xc4\xd8\x60"
+ "\x7c\xa6\x88\x4b\x67\x77\xdb\x96\x50\xff\xd3\xf4\xea\xb3\x3c\x46"
+ "\xbc\x1f\xcc\xfe\x87\x48\xb3\x70\xdc\xfd\x53\xf4\xea\x23\x3c\x3e"
+ "\xdc\x16\xe0\xd0\x1a\xea\xc8\xb9\x9f\xcf\x5c\xb3\xcc\x5c\x5b\x08"
+ "\x9d\x7b\x11\xcb\x92\xf2\x4f\xd9\x86\xe7\xef\x25\xf1\xbd\x73\x81"
+ "\x88\xc8\xf1\x5d\xcd\xe3\x5b\xfe\xe9\xda\x56\x11\xf9\xc2\x4d\xe2"
+ "\x48\x80\xe8\x0b\x23\x85\x82\x46\x03\xb7\xdb\xe8\x3c\xcb\xe7\xc2"
+ "\xb7\x93\xd7\x51\xcc\xbe\x6c\xe6\x2d\xab\x29\x8d\xcf\xd4\xf3\xb7"
+ "\x80\x1a\x03\x95\xd4\x98\x5f\x49\xc7\x42\xe5\xe4\x59\xc1\xf1\x51"
+ "\x5e\xdb\xf0\x47\x47\x39\xef\xb1\x25\xe3\x7e\xb2\xed\x87\xb2\xae"
+ "\x61\x7f\x3c\xfe\x67\xfa\xa3\xe7\xcf\x64\x7b\x54\x3e\x8f\xaa\xcf"
+ "\x39\x46\xf5\x59\xc7\xc8\xd9\x22\x22\x6c\xd7\x15\x3d\xcb\x75\x14"
+ "\x03\xd6\x76\x3e\x7f\x9e\x16\x69\xb7\xa6\xa0\xff\x26\xde\x3f\x68"
+ "\x0c\xf8\xc9\xb3\x64\x3f\xb7\xf1\x57\x55\x17\xc8\xec\x59\xf2\x07"
+ "\x79\xaf\xec\xad\xb3\xdb\xbd\x0b\x9a\x59\xa7\x0c\xf1\xd9\x7b\xde"
+ "\x93\x84\x8d\x11\x29\xe5\x36\x86\x55\xbb\x81\x2f\x93\x5e\x1e\x3a"
+ "\xa7\x5e\x5e\xc6\x8a\xdb\xc6\xf8\x40\x9b\x1a\xe6\x28\x9c\xd4\x63"
+ "\xa6\xd0\xda\xfc\xa9\x33\x27\x1a\x3f\xaf\xd6\x33\x7e\x38\x66\x6b"
+ "\x04\xe3\x85\xb6\x65\x01\x07\x11\xbd\x0e\xb4\xd9\xac\xad\xe1\x9a"
+ "\xb7\x5c\xa0\x54\xcf\x12\xfe\x16\xdc\x6b\x77\x58\x66\x99\x40\x1f"
+ "\xe7\x76\x97\x5e\x24\x13\x8f\x1b\xef\xdb\x94\xca\xf7\x0c\xf3\xb5"
+ "\x74\x1e\x33\x7f\xf2\x51\x17\x7e\x1b\xf0\x2b\x66\xba\xc3\x75\x13"
+ "\xc6\xab\x18\x6d\xd8\x85\xb1\xda\xce\x57\x45\x8b\xfb\xf7\x72\x5c"
+ "\x12\xcd\x86\xea\x49\x07\x1f\x85\x84\xfc\xde\x32\x78\xa6\x7c\x57"
+ "\x04\x7c\xc4\x6b\x38\x55\xaf\x50\x6a\xc4\x5d\x16\xdc\x06\x59\x57"
+ "\xf9\x8a\x3c\x97\x9c\xc6\xeb\x9a\x6f\xc9\x6f\x6b\xbc\xb6\x5b\x97"
+ "\x7d\x1b\x07\xf3\xd9\xcd\xf2\x93\x46\x5e\xf7\x29\x3e\x96\xa1\xd1"
+ "\x79\x06\xf2\x40\xfe\x0f\xd1\xe6\xd0\x57\xa4\x7d\xc1\xbc\xdf\x9b"
+ "\x3d\x01\x5d\xb6\x5e\x6c\xcd\x21\xde\xff\x49\x5d\x27\xfc\xa9\x2d"
+ "\x16\xd1\x18\xa8\x97\x67\x76\x1b\x03\x61\xb9\xff\x83\xf7\x86\x19"
+ "\x01\xbf\x05\xba\x6f\x13\xe3\x4e\x4f\xe7\xbd\x23\x5e\x57\x9b\x11"
+ "\x10\xfe\x99\xab\x2c\xfc\x2d\xcc\x61\x72\xef\x40\x4b\x6f\xb4\xc2"
+ "\x6e\x58\xe5\xb7\xa0\xef\xa1\x6e\x58\xed\x39\x49\xcc\x6f\xc8\x9b"
+ "\xde\x9d\xb7\x3d\xc7\xc4\xdf\x76\xe6\x3a\xa3\xd2\xfa\xcc\x74\xa0"
+ "\x2c\x8f\x95\x96\xa6\x74\xe6\xd7\xf7\x74\xdb\x94\x7c\x7e\xa1\x1d"
+ "\xf3\xe6\xf2\x1c\x43\xa4\x3d\xc7\x18\x06\x6c\xd0\x7e\x9a\xfc\x26"
+ "\x67\xc8\xaf\x7d\xe3\xaa\x15\xfc\xdb\x4c\x62\xf3\x90\x79\xc8\x67"
+ "\x62\xb8\x1c\x0b\x82\xbf\x0d\x22\xfa\x5f\x9f\xf8\xdb\xcf\x9b\x0c"
+ "\x56\x4f\xd1\xa3\xa0\xa7\x37\x6a\x98\x9f\xc3\xe6\x3f\x8e\xb5\x3d"
+ "\xcd\x3a\xcc\x1b\xd2\x37\x20\x0c\x1e\x0b\x27\xff\x71\xec\x98\x56"
+ "\x32\x14\x81\x6e\xd5\x1a\xd4\x1b\x0f\x7b\xc1\x83\xce\x88\x80\x1e"
+ "\xfa\xc6\x14\xa6\x1b\x4b\x1b\xfb\xca\xfd\x71\x9c\xf4\x4f\x4b\x09"
+ "\xa7\x79\x83\xad\x54\xef\xfa\x0b\xd5\x87\xbc\xae\x9a\x0b\x7e\x93"
+ "\xf2\x53\x33\x31\xdc\xc5\xfc\xce\x09\x5a\xcd\x0d\x6f\xa7\xde\xf6"
+ "\x06\xd8\x3e\xc6\x1c\xf6\x57\x65\x2b\xbe\x51\xa3\xdb\xc5\x57\xee"
+ "\x43\x45\x3a\xc7\xcf\x10\xc2\x4a\x91\x8d\xff\xc1\xb1\xf2\x9d\xa2"
+ "\x23\x83\xc6\xac\xe6\x35\xb9\x37\xda\x60\xa3\x64\x69\x70\xcf\x2b"
+ "\xb8\xc8\x7f\x05\xb8\x4c\x33\xf5\x15\x72\x5f\x0a\x7d\xfa\x0f\x0a"
+ "\x03\x76\x38\xe5\x3f\xb2\x20\xe3\x9d\xce\x2f\x78\xcd\xf6\xcd\x47"
+ "\x50\x0f\x35\x86\x9a\x88\xe3\xf0\x54\x45\x30\x3f\x9e\xb7\x92\xe6"
+ "\x93\xe7\x3c\x47\x15\x93\x23\x22\x23\x0d\xf6\x3a\xef\xc7\x38\x59"
+ "\xc6\xf1\x5a\x40\x51\x98\xfa\x7a\x31\x33\x72\xec\x08\xc0\x98\xfe"
+ "\x11\xef\x7d\x41\x4e\x84\x85\xd5\x78\xf0\x12\x66\x7a\xc8\x4e\x19"
+ "\x4b\x62\xfd\xd7\xde\x1a\xb0\x8e\xee\x11\x46\x8b\xf4\xe9\x8c\x94"
+ "\x74\x59\x31\xb6\x76\xd9\x9e\x8d\xc7\xc6\x45\xf9\xff\x25\xa1\x2e"
+ "\xe9\xff\x27\xcc\x47\x43\x95\x72\xdd\xf1\x8f\x63\x3b\xdc\x15\x01"
+ "\x1f\xbd\x21\xd7\x5f\x37\xf1\x19\x0f\x29\x63\xdf\x9c\xef\x4f\xfe"
+ "\xc4\xc7\x30\xf8\x2c\x6b\x64\x45\x78\x77\xe9\x3f\xa4\x7e\xcd\xef"
+ "\x26\x36\xb6\x75\x78\x44\xf1\x27\x3e\x3e\xc7\xa8\xc1\xb6\x9c\xa3"
+ "\x37\xaf\x15\x25\x9f\x40\xbf\x78\x73\x9e\x1a\x1b\x79\x3f\x8a\xdf"
+ "\x87\xba\x32\xa0\x57\x57\xec\xac\xec\xe4\xbd\x80\x8a\x39\xc2\xfd"
+ "\x75\x4f\xbb\xf9\x13\xdf\x6c\x2b\xeb\x54\x6f\x16\xf8\x0c\xb5\xc5"
+ "\xda\x3a\xa0\x8c\x8b\xd1\x9b\x8d\x24\xb6\x5a\x53\xbc\x00\x02\x7b"
+ "\x36\xfd\x0c\x6d\xfd\xbc\xd3\x4d\xc6\x2e\xe8\x82\x9d\x46\xe2\xf5"
+ "\xec\xd4\x2d\x43\x29\x13\xef\x86\x9e\xa1\x37\x8f\x86\x8c\x94\x8e"
+ "\x5f\x9a\xff\x6b\xf6\x64\xc0\xcd\xe2\x35\xd2\x86\x0b\xbc\xc6\xf5"
+ "\x96\x3c\xa7\x5c\xfa\x16\x8d\x88\x00\x1e\xef\xf7\x94\x0e\xa5\x11"
+ "\xbc\x4e\x89\xb4\x8c\xdc\xb0\xda\xf7\xd4\xd7\x22\xd6\x0f\xa5\x51"
+ "\xb1\xf5\xbe\xb9\x5b\xad\x63\x6e\x6d\x91\xb6\x95\x9f\x6e\x84\x6d"
+ "\x75\x0a\x70\x77\x08\x77\x92\x10\x5f\xb3\x1a\x95\x6f\xc2\x5b\x9b"
+ "\x2d\x15\x8a\xee\xe4\x3e\x1f\xe8\x8d\xf7\x51\xb5\x3d\x25\x83\x8c"
+ "\x07\x92\xe2\xad\xe3\xef\x50\x47\xad\x13\xa7\xc9\x76\x68\x67\xf8"
+ "\xc3\xeb\x6f\xe3\xd8\x60\xf2\xec\x7e\xee\x7c\xb5\x1f\xc5\xe7\xfb"
+ "\x7d\xf4\x96\x8c\xc7\xb8\xe9\x2d\x4a\x7d\xe9\x2d\x4a\x6b\x58\x24"
+ "\xfb\x55\xa3\x78\xd1\x44\xdc\xde\x48\x31\xf3\x19\x68\x02\xed\xe6"
+ "\xfa\x98\x36\x1a\x43\xe7\x3d\xce\x02\x11\xf1\x3c\xcd\xba\xe8\x5b"
+ "\x61\xcf\xb2\x5d\x34\xb3\x25\xa4\xce\xa2\xce\x25\x7f\x35\xe0\x55"
+ "\x0f\xa5\xb4\xd3\xb4\x35\xd9\x9b\x47\xbc\x5f\x71\x93\x67\xd9\x1e"
+ "\xc0\xde\x7a\x03\xcf\x05\x9b\x81\x1f\x35\x27\x6c\x6d\xf2\x06\x9b"
+ "\xa9\x01\xfc\x3d\x23\x5f\x48\x38\xc8\xf3\xb0\xec\xef\x56\xab\x2d"
+ "\x57\xc5\x60\x90\x7d\xed\xde\xe7\xd3\xfa\xe1\xbd\x20\xe1\xd9\xbd"
+ "\xa0\x12\xbd\x4f\x3a\xae\x15\x7d\x6d\x7d\xc7\xb3\x6c\x07\xf1\xf8"
+ "\x70\x7e\x3c\x97\x7b\xdb\x90\xf7\x6c\xec\xb8\x70\x1e\xbc\xfb\x08"
+ "\x70\xbf\xd3\xb3\x57\xcd\x7b\xa8\x3d\x79\x2a\xdf\xe2\xf3\x68\x6f"
+ "\x99\xb7\x02\x47\x6a\x6d\x7f\xeb\x1d\xdc\x56\x8c\x5d\xa6\xb7\xe0"
+ "\x2f\x89\x7d\x52\xc1\xfb\xa0\xfb\x75\x8d\x72\xcf\xae\x72\xf8\x8c"
+ "\x50\x44\x28\x79\x56\x79\x3c\x02\x39\xe0\xc3\x95\x65\x81\x94\x27"
+ "\xb7\xb3\x1f\x50\xe5\x09\x8b\x41\x8d\x2f\xf7\x85\xf5\x95\x44\x63"
+ "\x1c\xb5\x9f\x98\xc6\x6d\xd5\xc7\x98\xbf\xe1\x18\xe1\x3d\x61\xf6"
+ "\xb7\xef\xb2\x92\xa2\x3f\x51\x06\xb8\x1f\x69\xba\x9b\x43\x9b\xcb"
+ "\x1c\xed\xc9\x7f\xcc\xe2\xf3\x91\xba\x6f\x30\xf8\x77\x7c\xae\xf2"
+ "\xe7\xb6\xb2\x8c\xaa\x36\x0a\x8d\x36\x2b\x8f\x6b\x65\x0b\x94\x4f"
+ "\x46\x65\x39\xca\x17\x24\xec\x6f\x12\xe4\x8e\x1b\x62\x1a\xfd\x61"
+ "\x3d\x52\x40\x56\x61\x3e\xe8\xeb\x0d\x74\x6a\xdf\xcf\xdc\xf6\x20"
+ "\x74\xea\xbe\x7c\x3e\x4a\x6f\xdb\xd5\xed\xfd\x6d\x1b\xa6\x6c\x9b"
+ "\x6d\x73\xf5\xb5\x25\x61\x06\x8e\xdd\x16\xc1\x67\x25\xf9\xbc\x4b"
+ "\xa0\xbf\xc1\xe6\xef\x3f\x68\x96\xe2\x9b\x6d\x1b\x44\xb2\x92\xb7"
+ "\xb9\x41\x72\x71\xbf\x78\x6f\x17\x76\x53\x5f\xee\x33\xe0\xc0\xfe"
+ "\xc9\x1f\xaf\xe6\x73\x05\xbb\xd7\xb5\x1d\xbd\x6f\xe8\x93\xec\x1b"
+ "\xfa\x28\xfb\xa6\x7d\x5f\xea\x34\x55\x0d\x97\xeb\xe5\x57\xd7\x1f"
+ "\x15\x5f\x66\x93\xc1\xc6\xdf\xce\x3d\x4d\xd5\xfb\xe4\x19\x18\x8c"
+ "\x89\xda\x07\xa9\x2a\x10\x29\x2f\xa5\x5c\x1d\xcc\xaa\x2c\x05\x73"
+ "\xd0\xac\xd7\x38\x16\xa5\xf6\x8d\x3a\xc0\xfe\xa9\xd8\x3c\x68\x96"
+ "\x3c\x63\x88\xfa\xf8\x1b\x9f\x3d\x72\xa8\x7a\x04\x8f\xd5\xed\xbb"
+ "\x28\x4b\xd1\x61\xf5\xf5\xbc\xd6\xac\xec\xbc\xaa\x23\x90\xbd\x9b"
+ "\x94\x4d\xa5\xfb\x91\x1b\xa4\x1f\x79\xb4\x8c\xbd\xca\x36\x4a\x79"
+ "\x27\x52\x3a\x3d\xb8\xdf\x2b\xcf\x4a\xa2\xbd\x2b\x43\xba\xfc\xab"
+ "\xda\xcb\x3e\x49\xdd\xfe\x00\xab\x40\x2b\x45\xea\x1c\x79\x87\xbb"
+ "\x3a\x47\xd7\x51\xe4\x37\xc9\xdc\xe2\x08\xe7\x9b\xb9\xea\xbc\xf4"
+ "\x17\x28\x95\x31\x0f\xce\x68\xe7\xec\xaa\x9f\xd5\xd6\x35\x32\xd8"
+ "\x87\x1f\x65\xcb\x7d\x74\x58\x9e\x09\x64\x1c\x70\xdd\xb2\xed\xf2"
+ "\xbb\x60\xd5\xbb\x7b\xf6\x7d\xaa\xe4\x77\xd3\x95\x5f\x6b\xf5\x11"
+ "\x9d\x46\xd0\xdf\xbe\x2a\x36\x68\xd5\x1d\xb5\xa3\x48\xd2\x40\xbb"
+ "\xb0\xa6\x7c\xa3\x92\x69\xb2\xda\x1f\x8d\xa7\x99\xa1\x88\x53\xc9"
+ "\xa0\xaa\x66\x21\x79\xbd\xaa\xf9\xcb\xf5\x89\xed\x93\x75\x5d\x44"
+ "\xe1\x39\x0d\xf2\xe5\xed\x34\x89\xeb\xe2\xfd\x39\x1c\xa3\x65\x4d"
+ "\x11\xc7\x9c\xfa\x69\x1f\x8e\xed\x15\x2a\xde\xef\x08\xf3\x99\x4c"
+ "\xcc\xb3\x91\xe2\xfd\xc5\xa7\xf3\xc9\x98\x9b\xcf\x7b\x5d\x9f\xec"
+ "\x66\xfb\x4a\x38\xa1\x0b\xa4\x40\x3f\x01\x9f\xaf\x5d\x4c\x96\xc7"
+ "\xed\x80\xed\xcc\x48\xe7\xd8\x5b\x1c\x77\x8b\x63\xe7\x85\x9d\x19"
+ "\x03\x71\x3f\x18\xfa\x5c\x9a\x30\xef\xb7\xb3\xbf\x4c\xd8\x2d\x20"
+ "\x8f\x4f\x72\xfc\x2f\xa3\xd7\x1f\xa4\xb5\x67\xc9\xcc\xb1\xbd\x42"
+ "\x25\x9f\x1c\x69\x0c\x7c\x2a\x6d\x8b\x01\xf9\xd0\xa7\x23\xf2\x5c"
+ "\x8e\x35\x92\xfc\xc9\x6e\xcc\xf1\x7b\x54\xbf\xcf\x0b\xd5\x6f\xd5"
+ "\x6e\x6e\xbf\x94\x71\xc5\x35\xc5\x45\xb2\xed\xff\xf2\xf3\x10\xe0"
+ "\x47\x8a\x0f\x6f\x08\x17\x1f\x76\xa9\xb3\x9c\xf5\x54\x54\x20\x5a"
+ "\xbd\xd0\x8d\xd9\x7f\x93\xcf\xeb\xb2\x3f\x0e\xf7\x91\xfb\xc7\x75"
+ "\xff\xf1\xc2\x59\x19\xab\x2c\x84\x67\x67\x9e\x56\xa6\x0d\x65\xda"
+ "\xea\xa9\xb3\xf8\xb0\xec\x7b\x63\x40\x95\xcd\x95\xf7\x5c\x3e\x0a"
+ "\x0f\x5a\x9f\xbb\xf1\x80\xbe\x73\xff\xb8\xff\x21\xc6\x09\x70\xa0"
+ "\xf5\xd5\xda\xa5\xf5\x93\xfb\x78\x0c\xb3\xce\x5b\xe8\x27\xfa\x2a"
+ "\xfb\xd9\x85\x7e\x1e\xb1\x13\x05\xb7\x18\x32\xbf\x48\x39\xec\x62"
+ "\xfb\xd0\xf9\x27\xe8\xd1\x85\x65\x04\x3b\xd0\xf4\xab\xa2\x32\xe3"
+ "\x46\xe8\x26\x45\x7e\xd8\x83\x7e\xd1\xca\xfa\xbe\x37\x1f\xbf\x50"
+ "\xa5\xfc\xee\xb0\xd4\x8f\xf9\x1b\xb1\xcf\xa1\x4f\x91\xcf\xa9\xa8"
+ "\x55\xb4\x42\x37\x0d\x7a\x43\xc8\x63\x47\xff\x61\x3f\x9e\xd6\xda"
+ "\xcf\x79\xd7\xfe\x43\xf5\xcb\x92\x47\xe9\x87\x1e\x2d\x36\x7a\x9b"
+ "\x8b\x49\xef\xcb\x13\xc8\x87\xfe\x58\x01\xab\xbf\xfc\x2e\x03\xfa"
+ "\xb9\x15\xed\x0c\x46\xf5\xa9\xa1\x2d\x08\x98\x27\x28\x65\x16\x19"
+ "\xde\x3a\x87\x7e\x9c\x23\x6b\x59\x11\xf4\xaf\x87\x58\x5f\xfc\xe9"
+ "\x67\xd7\xe4\xd0\x08\x1f\x6d\x6f\x55\x74\x27\xe3\x06\x5d\x77\x86"
+ "\xde\x4e\xee\x8e\x0d\xc4\xf1\xd6\x92\x3f\xa9\x67\x3a\x92\x31\x82"
+ "\x78\xce\xe8\x00\xcd\xb0\x2f\xcd\x4a\xd4\xd1\x91\x31\x58\xb6\xc7"
+ "\x3d\x96\xf0\x9c\x8a\x67\xd6\x83\xd3\x79\x4d\x00\xe5\x8e\x08\xe0"
+ "\x8c\xe1\x43\x9f\xdb\xc3\x57\xc6\x61\xc2\xb3\x26\xbf\xa6\x71\xa8"
+ "\x63\x1c\xdb\xbe\xbb\x8b\xfc\xc6\x17\x7e\x4d\xa3\xae\x4e\xa6\xbc"
+ "\x3d\xae\x37\xf9\xcd\xfb\x16\x0c\x0f\x7d\x1b\x78\x86\x76\xdc\x10"
+ "\xcb\x63\x36\x29\xcb\x94\x1c\x7c\xbb\x85\xf7\x0a\xae\xb2\x5e\x29"
+ "\xff\xd8\xe7\xe9\x2a\xcb\xb5\xea\xed\xc0\xfd\x8e\xde\xda\x7e\xf5"
+ "\x78\xd8\x91\xd5\x1b\xac\xcd\xaf\xcb\x78\x71\xce\x2d\xaf\x43\x5e"
+ "\x40\x57\xa8\xb5\x72\x0c\x6f\xcc\x9d\x3b\x02\xb4\x7c\x1b\x99\x9d"
+ "\x67\x79\x4d\x66\x3a\xd5\x56\x66\x52\x15\x6c\x72\xd1\x9e\x31\xf0"
+ "\xd5\x0b\xec\xfb\xa0\x64\x08\xeb\xa4\x7c\x96\x52\x2c\xcf\x48\x2b"
+ "\x7d\x5d\xd7\xe1\xdf\x49\x2e\xbc\x48\x46\xf5\x8d\x94\x77\xcc\xd9"
+ "\x36\x11\x2a\x37\x46\xec\x95\x1c\xf3\x2a\xa5\x6b\x1e\xc7\xbc\xd2"
+ "\xe3\x48\x49\xdd\xc7\x01\x9e\x6b\xb7\xa6\x6c\x5e\x46\xa3\x38\xf6"
+ "\x9d\xc5\xaf\x74\x39\x35\x5f\xbf\x33\x0e\xed\x4b\xd3\xf6\xfb\xd3"
+ "\x54\x6c\xa9\xb7\x5d\xd5\x17\x50\x97\x7a\xbf\x38\x0c\x1b\x46\xc2"
+ "\x5d\x46\x23\x2a\x2f\x50\x06\xeb\x41\xb9\x9f\x2b\x9d\x8d\xed\xc2"
+ "\xe9\x6d\x16\x11\xfe\xef\x0c\xda\x76\xa6\x27\x36\x9e\x7f\x39\xc7"
+ "\xd3\x13\x09\xcf\x55\xa9\xf5\x77\xe9\xf3\x23\xe3\xb1\xa8\x6f\xe8"
+ "\x11\x95\xbf\x42\x26\xfe\x66\x2c\xaf\xe5\xf1\xda\x30\x9f\xfb\x51"
+ "\x73\xc8\x3b\xcd\x7a\xcc\xb0\x5e\xf7\x11\x8b\x95\xbd\x13\xe9\x0b"
+ "\xfb\xcb\xdf\xe1\xf1\xac\xe0\x39\xe3\x5d\x1b\x9f\x35\xea\xb1\x71"
+ "\xde\x35\xf0\x3b\x4e\x63\x5f\xf8\x2c\x89\xcb\x77\xa7\xb0\xdd\xa3"
+ "\xd9\x8c\x87\x6c\xdd\x69\x4a\x87\xe1\xb9\x8c\xdb\x50\xad\xd6\x91"
+ "\x07\x74\xb8\xdf\x5d\xa0\xcf\x67\x3c\xaf\xab\xef\xd5\xbe\xeb\xf0"
+ "\x19\x3e\xea\x75\xff\x4a\x5f\x57\x97\x7e\x6e\x1c\x0b\xcc\xfd\xee"
+ "\x4e\x7d\x7e\x93\xdf\x23\x59\x3f\xf4\xde\xe5\xab\x68\xd8\xec\xeb"
+ "\xcd\x32\xf6\x06\x7f\x77\x54\xcd\xbb\xef\x36\xf5\xec\xa7\x65\x49"
+ "\x7c\xcb\x6f\x0d\xb2\x8d\x61\xc4\x1c\xac\xe2\xdf\xb5\xa9\xf9\x57"
+ "\x3f\xe7\xfe\xee\xd9\x9e\x7a\x7e\x96\xd6\x3d\x8f\xa2\x0e\xf6\xeb"
+ "\x60\xf8\x4a\x37\x79\x97\x7d\x68\x78\xef\x2b\x4b\xcd\xaf\xef\xd6"
+ "\x5d\x41\x17\xcb\x60\xfc\x46\x34\x7b\xd2\xdb\xf6\x37\x85\x5f\x07"
+ "\x25\x8d\x29\x27\xeb\xa1\x22\x9f\x69\x80\x8a\xe3\x64\x39\x45\x3f"
+ "\x9b\xcf\xef\x99\xd6\x3d\xb7\xf3\x5a\xdc\xcf\x0e\x7a\x79\xde\xee"
+ "\xca\x49\x9d\xc1\xb6\xbe\xd4\xc5\x7f\xb6\x6b\x34\xca\x21\x6d\xe0"
+ "\xef\xcf\x05\x4d\xa5\xab\x69\x14\x7f\xd3\x13\xe9\x72\x9d\xc0\x3f"
+ "\xe4\x99\x8e\x6f\xa4\x93\xf5\x1b\xe5\x7c\x1e\xe0\x67\xc7\x61\x5f"
+ "\x86\xe4\x3a\x2a\xd7\xbf\x65\x88\x8b\x63\xff\xbd\xd7\xe9\xeb\xa3"
+ "\xc6\x6a\xe7\x73\x78\xce\x88\x7a\xee\xaf\xaf\xe5\xfb\x68\x67\xbe"
+ "\xdc\xbb\x64\x9f\xe7\x25\x3c\x5f\xb3\xad\xa4\xfb\x09\xed\x7c\x4e"
+ "\xb5\x65\xe7\x73\xb5\xf9\xc4\x6b\xd5\xc7\xab\x64\x1c\xaf\x9d\xd9"
+ "\x3e\x7a\x77\x83\xb6\x1e\xd3\x24\xe9\x8a\xf5\xdd\x17\xd9\x06\xfb"
+ "\x9b\x67\x33\xf2\xf1\x3c\x91\xeb\xa0\x2c\xa5\xc3\x87\x38\xee\xa5"
+ "\x2f\xaa\xff\x9f\xf2\x5a\x5f\x42\x99\xf8\x16\x91\x2c\x53\xd2\x35"
+ "\x4b\xfa\x9c\x6d\xbe\xde\x87\xab\x59\x94\x84\xd9\x5e\x4a\x05\xcd"
+ "\xa5\xe1\xca\x73\x38\xe7\x4d\x17\x9b\x87\x78\x98\x2e\x61\xc3\x5a"
+ "\x61\x27\x98\xdb\x93\xbb\xa6\xf4\x76\x56\x91\x71\xe3\xdd\xf0\x43"
+ "\x52\x3e\xb4\x3f\x9f\xd3\xe0\x87\x7e\xb6\x8d\x68\x79\x48\x74\xda"
+ "\x6e\xe4\x33\x41\x3f\x9f\xe3\xdc\xc6\xbe\x2b\x3f\xcf\x88\xf5\x5d"
+ "\xf9\xf9\x14\xfc\x8a\xf1\x3b\x49\xf4\x8b\x54\x5c\xe7\xf4\xfc\x7e"
+ "\x31\xa5\xc3\xfd\xf3\x39\xc0\xa3\xd4\xb1\xae\x4e\x26\x72\x79\x8c"
+ "\x03\xdb\x45\xc9\x7f\xf1\xab\xfe\x0e\xca\xc4\xb3\x59\xf4\x1f\x92"
+ "\xaf\xf5\xd7\x86\xe7\x34\x9b\x13\xf3\x5a\x32\x70\x32\x14\x7d\xee"
+ "\x7f\xbd\x8f\xfb\xcb\xed\x6d\x4f\x0e\x53\xf4\x39\x4d\x86\xc9\xfd"
+ "\xf7\x27\xa3\x1c\x70\x29\x6e\x5e\xb1\x5d\xc7\xa7\x86\x27\xde\x37"
+ "\x32\xb6\x03\x86\xd2\x83\x90\x1f\x30\xf4\xfc\xdd\xb8\x1f\xca\xdf"
+ "\xd7\xc0\x98\x22\x1f\x6c\x62\xb3\x7e\x06\xb4\xc3\xfd\x8b\xac\xc3"
+ "\x79\x6a\xff\x80\xcb\x06\xa2\xca\x72\xcc\x8b\x44\xe5\x51\xa7\x2c"
+ "\xcf\x6d\x3d\x4d\x3f\x7f\x58\xd5\xfb\x8b\xb1\xbd\xf1\x52\xd1\x70"
+ "\xe8\x77\x95\x3e\x8e\x8b\xc1\xfa\xd0\x78\xef\xb0\x00\x79\x2b\x23"
+ "\x98\xf3\x43\x99\x59\x45\xc2\x73\x9a\x7e\x71\xb1\x31\xd8\x7a\x95"
+ "\xf3\xe1\x2f\xa4\x4f\x96\xe8\x74\x91\xb7\xf0\x4e\xf9\x2d\xeb\x73"
+ "\xb4\x6b\xa4\xd7\x2f\x63\xc2\xf3\xbd\x8c\x2d\xca\x7e\x1a\x3c\x37"
+ "\xc0\xc6\xee\x8e\xa9\x18\x41\xde\x2a\x4e\x47\x9a\x37\xe0\x97\xb1"
+ "\x17\x7b\xfc\xc8\xbb\xcc\x8a\xa7\x7e\xf9\xa9\x8c\xbf\xc0\xed\x0d"
+ "\xdd\xef\xe1\x36\x47\x8a\xbb\xcc\xdc\x07\x27\xec\x3f\x6f\xa8\xc3"
+ "\xc3\x3c\x61\x5b\xc1\x6b\x85\xbf\xdc\x07\xba\x13\x91\x92\x2e\xf3"
+ "\xd5\xf5\xe1\x97\xf2\x3c\x90\x33\x24\xce\xf9\x93\xbb\xcc\xac\x93"
+ "\x94\x16\xf5\x31\x4f\xaa\x14\x9e\xf6\x94\x50\x66\x87\xfb\x97\x27"
+ "\x0f\x3b\xd4\xd8\x5c\x25\xdc\x93\x7a\xdf\xab\xb4\xbe\x23\x4d\xee"
+ "\xcd\x8d\xa9\x50\xb1\x26\x7d\xb4\x2b\xbd\xd7\x35\x2b\x8c\x33\xeb"
+ "\x03\xec\xe3\xaa\x70\xb1\x6b\x41\xf7\xdc\x70\x55\xed\xd8\xb5\xe0"
+ "\x2b\xd4\xd1\xa5\xd5\x71\xe4\x7f\x58\xc7\x91\x2b\xd5\x01\xd9\x70"
+ "\xc3\x19\xfa\xd5\x9c\xab\xb7\x1d\x7f\x65\x93\xb4\x52\x1c\xb2\x29"
+ "\x99\xf9\xeb\x8f\xc2\xb0\xdf\x42\xa9\x83\x32\xe5\x77\xa7\x8c\xe4"
+ "\xe2\xb8\x9b\xa1\xe2\xbf\xf8\x1b\x1c\x9d\xe4\x59\xf1\x67\x6a\xa1"
+ "\x5f\xc9\x58\x77\x0d\x05\x6c\xb3\x0d\xc9\xef\xda\x18\x72\x75\x19"
+ "\x77\xed\x60\x7c\x6f\xc3\x38\x6c\x8d\xa2\xb3\xc6\xc0\x9f\xc9\x3b"
+ "\x8f\xd7\x57\x9b\x78\x5d\x3b\x5f\xf4\x1f\x94\x19\x81\x6c\x80\x8e"
+ "\x1e\x96\xf8\x80\xfe\x22\xed\x2d\xd8\x6c\xd2\xde\xf2\xcb\xf3\x89"
+ "\xfd\x65\x3c\x4d\xf7\xd2\x00\xaf\x7d\x87\xbb\x72\x6c\x1d\x6e\x9a"
+ "\xc5\x71\x36\x79\xdd\x59\x98\x8f\xa5\xcf\x0c\x25\x09\x69\x4f\x41"
+ "\xf7\xe7\x38\x9b\xde\x80\x8f\xc2\xd0\xa3\x2b\x2f\x51\x7a\x25\x74"
+ "\x4f\xc8\xec\x34\x96\xeb\xd5\x5a\xac\xcd\xcd\x97\x7a\x62\x6d\x56"
+ "\xf1\x5a\x4f\x33\xee\x2f\x91\x29\xbc\xd9\x60\xdd\x7a\x89\x46\x6c"
+ "\x5b\x41\x19\x5b\x79\x2d\xef\xef\x4a\xf7\x61\xbd\x42\xc6\xdd\x5c"
+ "\x9a\xc1\xeb\xf9\x3d\xba\xcf\x4a\x8e\x0b\xdc\x2d\xb7\x4c\x72\x0d"
+ "\xe4\xaa\xf0\xfd\x6b\x39\x0f\x86\x8a\xbb\x66\x85\x52\xaf\xf7\x75"
+ "\x6d\x0c\xc3\x26\xfd\x55\x1d\xf0\x97\x95\x68\x6c\x75\x3f\xac\xf2"
+ "\xa8\x58\xa9\x87\x47\x28\xf9\xee\xa3\xf7\xcc\xbd\xd1\x44\x78\x6b"
+ "\x0e\x8d\x69\xa3\x4c\xe5\xd3\x90\x8c\x39\xf1\xbd\x3c\xde\x3f\x2f"
+ "\x7a\x96\xac\xe1\xad\x73\x0d\xce\x9f\x52\x12\x7f\xe7\x9c\x7f\x45"
+ "\xff\x10\xad\x63\xf2\x28\x93\xf7\x1f\xd8\xef\xc1\xb6\x46\xe6\x9f"
+ "\x30\xa2\x90\x32\xa3\x61\x4f\x51\x8e\x51\x77\xdb\xa6\x2e\x79\x6a"
+ "\xe9\xb3\xf9\xf3\x0b\x16\x3f\xb9\x38\x6f\x71\xc1\x2a\x19\x42\x61"
+ "\x94\xfc\x77\xdf\xc8\x05\x73\xe4\xa6\x73\x94\x7e\x31\xa2\x67\x3d"
+ "\xee\xbd\x8b\x21\x5e\x3f\xb8\x2a\x7c\xbd\x27\xe5\x5f\x25\x74\xa9"
+ "\x4a\xe9\xbb\xb3\xdb\xec\x33\xd4\x35\xc9\x35\x71\xa4\x6d\xd2\x7c"
+ "\x6c\x4e\x6b\xf9\x22\x9b\x86\x78\x40\xc7\xe3\x4f\xd1\x6f\x42\xbc"
+ "\x1f\x82\xb1\x4a\xf3\x16\x9e\x61\x5b\x72\x3c\xaf\xf1\x37\xf0\x5a"
+ "\xc6\x32\xce\xbf\x7b\x2d\xfb\x30\xb0\x3f\x14\xe8\x70\xc7\x29\xed"
+ "\x59\xfb\x66\xfa\xd6\xd0\x52\xeb\x8e\xd0\x79\xeb\xbb\x42\xe4\xbc"
+ "\x25\x96\xda\xb7\x8a\xf3\xf6\xb7\xa2\xe2\xbf\xf5\x45\xf9\x97\xc1"
+ "\x27\xdf\xc1\x6f\x88\x28\xde\xbf\x13\xfc\x37\xec\x0c\xed\x7e\x87"
+ "\xdb\x30\xdd\x2e\xce\xf7\xc4\x42\xd8\xbd\x0f\xcf\x5d\xf8\x45\x44"
+ "\xf1\x81\x23\x51\xfb\x6b\xfc\xee\x53\xce\x9f\xbf\x88\x7d\xc2\x76"
+ "\x9f\xe5\x76\x89\x8d\x07\xfe\xcd\xef\xb4\x27\x21\x7f\x58\xb5\xf3"
+ "\xfd\x64\xef\x86\x46\xb2\x3d\x29\xef\xcd\x9e\xa7\x59\x9f\x7b\xff"
+ "\xa7\xc2\xe8\x14\xbc\x07\xe7\x6d\x0d\x91\x3a\xaf\xf6\x9e\x83\x7d"
+ "\x10\xaa\xa0\x6f\x57\x0e\xa4\xb4\xb2\x81\x94\xda\xe1\x7e\x7f\x6c"
+ "\xb7\xff\x85\x59\xcd\xb7\x3c\xe7\x71\xec\x6c\xc8\xa3\x0e\x9e\x3f"
+ "\xb9\x1d\x4c\xc3\x80\x39\x8f\xf7\xe7\xd4\xf9\xa8\xf7\xf3\xa0\x5b"
+ "\x5a\xaf\x5e\x1e\xbf\x2f\xbf\xa7\x32\x66\x13\xcd\xe3\x35\x6d\xde"
+ "\x77\xe6\xd8\xd2\xe0\x57\xb3\xb2\x37\x7e\x73\x42\xee\xab\x43\xa6"
+ "\xf0\x7e\x49\x75\x11\xf4\x04\xf3\xb1\x54\xd6\x6f\x42\x6e\x72\xf1"
+ "\xde\x66\xe4\xd2\xd9\xdd\xbc\x1f\x2d\xcf\x16\xca\x98\xec\xc7\xa8"
+ "\xfa\x22\x99\x5a\xe8\x7d\xfe\x56\x77\x5a\x0f\x5e\x7f\xf3\x5d\x86"
+ "\x21\x36\xee\xcb\xb2\x14\x1a\x8b\x19\x46\xe4\xd2\xb9\x71\x7a\x39"
+ "\xe0\xae\x1f\x97\x03\x1d\xdc\x20\xcb\x71\x5e\x19\x13\x25\x6d\xae"
+ "\x30\x77\xcd\x92\x75\xaa\xe7\x59\x02\x7c\x18\xba\x14\xde\x8d\xfb"
+ "\x39\x8c\x27\x5c\x73\xe4\xda\x2f\xec\x75\x19\x8b\xc7\xfc\x89\xcf"
+ "\xeb\xfb\x9b\x47\xb6\x87\x7d\x71\x0b\x20\xb3\xa4\x3e\xf8\x9b\xe7"
+ "\xaa\x3e\x27\x53\xfe\xd3\x3c\x7e\xbf\x95\xeb\xfe\xa0\xa7\x9d\xaa"
+ "\x7d\xbf\xed\xd3\xbe\xf1\xb0\xab\xdd\x1c\x4a\x0b\x18\xcd\x54\x6b"
+ "\x0d\xb2\xac\xf4\xd4\x5a\x3b\x61\x53\xfc\xa6\xde\x67\xdc\xbb\x5b"
+ "\xe9\x22\xaa\x1c\xef\x13\x43\x4f\x6d\x4d\xb2\xa6\x39\xf1\xbe\x4d"
+ "\xf7\xbb\x80\x4e\xda\xba\x19\xef\x80\xdb\x3a\xc6\x9b\x8f\x76\x67"
+ "\x35\xe6\xa9\xb3\x19\x78\xee\xcb\xe7\xed\x25\xae\xd7\x3f\xd3\x6a"
+ "\x59\xe7\xe1\xf3\x9f\xe3\x2c\xa1\x2c\x23\xef\x03\xf3\xb9\x7f\x8e"
+ "\x85\xc0\x67\xff\x79\x2d\x4f\x7b\x9f\x19\xf7\x7e\x94\xfe\xbe\xc3"
+ "\xfd\xdb\x05\xfa\x99\x7d\x8e\xa9\xc4\x3e\x06\x61\xcd\x57\x50\xc6"
+ "\x1a\xba\xa0\xf6\x51\xd9\x57\x90\xd7\x11\xf9\xcc\x23\xef\x75\xa2"
+ "\x5c\x65\xb7\xef\xa6\x3c\xeb\xf3\xdb\x5d\xba\x6f\x14\xee\xf7\x76"
+ "\xfb\xf5\x00\x17\xed\xc5\x21\x73\x20\x75\x88\x27\x50\xdc\x05\xfd"
+ "\xf3\xb7\xc7\x21\x0f\x7b\x8d\x45\x24\x6d\x3f\x8e\xc9\xfc\x3c\x19"
+ "\x23\x29\xc7\xc6\x71\x8c\x8e\xda\x00\x69\xbe\xff\x7b\xee\xd2\xce"
+ "\xc4\x27\x9d\xa3\xdf\xfe\xa3\x67\xcf\x31\xac\xad\x97\xed\x99\xab"
+ "\xf4\xb5\x3d\x73\xe5\x7a\xd9\xc6\x2e\xff\xdb\xab\x83\xc6\xdd\xab"
+ "\x7d\x46\x75\xf6\x61\xcf\x2c\x1f\xd5\x6c\xd0\xfd\x56\x90\x2f\xad"
+ "\xb7\xd8\x6b\xa2\xb8\x29\x55\xc1\xfc\x40\xae\x27\xf6\xd8\x3f\x1f"
+ "\x48\xdf\x20\xde\x1f\x8c\xf0\x5c\x99\xf2\x1f\xd2\x6f\xd2\x9b\x7f"
+ "\x81\xd7\xcd\xfa\x2a\x5b\xec\x03\xed\x5b\x52\xd2\xd7\x73\xd0\x99"
+ "\xd8\xe7\x81\xfc\xac\x70\xb6\xc7\xa7\xaf\xc1\x6f\x31\x46\x38\x2e"
+ "\xb7\x70\x6e\x17\x01\x6f\x7e\x80\xa0\x87\xf9\xbd\x98\x7b\x51\x87"
+ "\xc8\x5f\xc6\x71\xf3\x3f\xb8\x8e\x71\xaf\x78\xea\x83\x12\xd9\x26"
+ "\xf7\x3d\xc2\xc9\xfa\xa7\xbf\x4d\xda\x41\xc8\x77\x2d\xf2\x4d\xac"
+ "\x2b\x6c\x63\x3f\x16\xe2\x98\x87\x2d\x5a\xdd\xfe\xe4\xa6\xd4\x6f"
+ "\xa4\xd2\xbc\x0e\xf7\x07\xd0\xff\x5f\xcc\xba\x7a\x3e\xff\x60\xce"
+ "\x95\x74\x11\x35\x37\x66\x51\x6f\xf6\x0c\xdb\xab\xb7\xa3\xfe\xe9"
+ "\x82\xdb\xff\xbb\x89\x21\x63\x90\xba\x8c\xfd\xc4\x37\x5d\x0e\xc8"
+ "\x81\x7e\x22\xbc\x1a\xe3\xd5\x6e\x85\xbe\x5b\x4f\x8d\xa1\x3a\xe9"
+ "\x23\x02\x1e\xb6\x14\x05\xc4\x05\x6f\x68\x8f\xf4\xef\x55\xe7\xe0"
+ "\x7f\xf7\x5d\x6f\xe8\x20\x35\xe6\xfb\xc9\xb3\xec\xcf\x98\xb3\x7e"
+ "\x37\x92\xdb\x75\x7b\xbe\x8b\x46\x9f\xe3\xf7\x1f\xb4\xa8\x79\xf2"
+ "\x77\x59\xda\x35\x8d\x63\x63\x46\xb7\xe9\xbe\xe7\x97\x3c\x55\xb0"
+ "\x78\xe9\x92\xd1\xd3\x16\xae\x58\x98\x67\x7b\x48\xb9\xdc\xc5\xcc"
+ "\x5f\xe6\x9e\xf8\xdf\x1f\xa6\xf2\x9c\xc2\xba\x0a\xc7\x01\xbf\x52"
+ "\x0c\x70\x3d\xfe\x37\xf4\x86\x11\xbc\xbe\xf7\x7f\x19\x03\x5c\xd7"
+ "\x45\x38\xfe\x77\xcf\x5a\xf7\x87\xf5\xdd\x3c\x10\x39\xd4\xc1\xcf"
+ "\x7c\xf6\x33\xe2\xfe\xdd\x34\xe6\xa3\x2a\xe9\x9f\xf6\x61\x76\x74"
+ "\xac\x24\xf6\xc5\xe3\xf5\x11\xa4\xcf\xd5\xcf\xd9\x82\x16\x31\x6f"
+ "\x7c\x98\xd7\x73\xee\xe7\x43\x07\xc6\x7b\xaf\xe2\x5f\x99\xb7\x58"
+ "\xdf\x13\xd6\xbe\xbb\x26\xf7\xb0\x23\xee\xae\x2c\xb5\x0e\xf3\xe1"
+ "\xe6\xaa\x48\x3f\xb3\xda\x03\xf8\x70\x8f\x7e\xa6\x4c\xf1\xe6\x21"
+ "\x8d\x37\x3f\xac\xbf\xd2\xbe\x7d\x0f\x6f\xec\x35\xf7\xf0\xf5\x5f"
+ "\xb5\xb2\x7b\xcd\x5f\xb6\xe7\xaf\xe9\xc3\xd7\x9d\xa1\xfd\x37\xf0"
+ "\xda\x0c\xee\xbf\x8e\xfb\x3e\x72\xae\x95\xfe\xf5\xfb\x3e\xd3\xee"
+ "\x51\xc7\xbe\xa3\xda\xfd\xd7\x70\xff\xbe\x76\x3f\x14\xf7\x6f\x6a"
+ "\xf7\xe0\xd9\x7d\xeb\xb4\xfb\x74\xdc\x2f\xd6\xee\x21\xf3\xf7\x3d"
+ "\xa8\xdd\x0f\xc6\xfd\x77\xb5\xfb\xeb\x71\x3f\x5c\xbb\x07\x0f\xee"
+ "\x4b\xd6\xf6\x4f\xcd\x68\xfb\xc5\xab\xd7\xcf\xf7\x7a\xd4\x1e\xdd"
+ "\x3e\xe8\x89\xef\xed\x50\x73\x46\x77\x5a\x3a\x68\x7a\x81\x8e\x5f"
+ "\xa4\xf3\xdc\x68\x46\xfa\x28\x1f\xbd\xd3\x12\x95\xbe\x53\xcb\x9f"
+ "\x8d\xf9\xc6\x17\x95\x5e\xa9\xa5\xcf\x85\x0e\x6a\x8e\x4a\x2f\xd3"
+ "\xd2\x0b\x20\x17\xed\x51\xe9\x5a\x5c\x87\x7d\x9b\x7c\xb4\xdd\x1a"
+ "\x95\xee\xd0\xd2\x77\xe8\xfe\x0a\x5a\x7a\x9e\x96\x5e\x83\xf4\x23"
+ "\x51\xe9\xf3\xb4\x74\xc8\xff\x0f\x9b\xa3\xd2\xd5\xba\x82\x3c\x8b"
+ "\x66\x11\xb5\x85\xcc\x5b\xfb\x82\x3e\xda\xb6\x37\x2a\xcf\x14\x55"
+ "\x76\x7f\x9a\x8f\x2a\xa3\xfb\x32\x5e\x4b\xcf\xf0\xd1\xdf\xb7\x47"
+ "\xa5\x67\xf6\x26\xab\x0c\x15\x34\xaf\xb7\x35\x4c\xfe\x4e\x95\xf4"
+ "\x93\x94\xba\xe5\x81\x85\x7c\x4e\xcd\xb2\x4d\x9c\xb2\x15\x09\x71"
+ "\x8a\x0e\x4c\x53\xfe\x81\x47\x79\xee\x68\x53\xe7\xfd\x0e\x8c\x95"
+ "\x67\xc0\xd8\xe7\x9c\xcf\x00\xae\xe6\xb4\xfd\x32\xf6\xc9\x18\x87"
+ "\x4b\xc5\xe4\x54\xfe\xa7\x6d\xd2\x96\xd7\xf6\x39\x91\xe7\x33\x5e"
+ "\xdb\x64\x38\xbc\xde\xe7\x2d\xe8\x94\x3e\x91\x6c\x4b\x71\x1a\xdb"
+ "\xb4\xf2\x5c\x58\x94\x4d\xa5\xe4\xfe\x81\x85\x11\x3e\xb7\xef\x56"
+ "\x76\x3f\xf3\x22\xe7\x67\xdf\x9c\xe8\xbc\x3e\x3a\x20\x6d\xd3\x24"
+ "\xeb\xb5\x9f\x74\xb8\x0f\x64\xf7\x9c\x55\xda\x5f\xa9\xa5\x9f\x40"
+ "\xfa\xdc\xa8\xf4\xe2\xde\x65\x3b\xe4\x9d\x79\x5f\x71\xd7\x25\x11"
+ "\x08\x5d\x12\xc1\x2d\xff\x89\x76\x2f\x92\xe7\x6e\x6e\x0c\x17\xef"
+ "\xab\xd0\x62\x60\x7c\x16\x5a\x21\xfc\x90\xd9\xfc\x8d\x89\x6b\x66"
+ "\x04\xfc\x34\x23\xbf\x43\x6c\x7e\x92\xfd\xec\x2e\xca\x78\x50\xce"
+ "\x36\x8e\xbf\xcd\xbe\x5b\x01\xde\x1f\x4a\x6d\xc4\x1c\x57\xb5\x88"
+ "\xdf\x7f\x4a\xd3\xed\x7e\x6a\xb0\x87\xa9\x0a\xb0\xb7\x3d\xa9\xfb"
+ "\x4d\x1e\xe8\x8e\xff\xc3\x6d\xe0\xfa\x9c\xf2\x5b\x31\x35\xa3\xb9"
+ "\xad\xfc\x2d\x3c\xb1\xf9\x7a\xbf\xf8\x03\xeb\xb2\x5d\xfc\x0d\x44"
+ "\x1b\xe6\xf6\x71\xb8\x27\xf9\xe3\x77\x48\xef\xad\x4f\x8a\x97\x6b"
+ "\x34\x7f\xcc\xfd\x66\x25\x2f\x6a\x0a\xc4\xbf\xf0\xb9\xa3\x1a\x07"
+ "\xca\xb6\xfa\x93\xbb\x12\xfa\x5f\xad\xdd\x46\xc6\xae\x8d\xd0\x4d"
+ "\xce\xed\x35\x2a\xf9\x74\x70\x41\xc4\x68\x5e\xc7\xeb\x8a\xf2\x3b"
+ "\x11\x1b\x8f\x4d\xd9\xb5\x24\x68\x6c\x58\xdd\x42\x6b\xae\x27\xeb"
+ "\xdc\x20\xfb\x92\xd7\x7c\x3e\xa0\x80\x63\x71\x75\xf9\xa1\x87\x1a"
+ "\x7f\x8b\xf7\xbf\x5f\xb2\xd7\x18\x92\xfa\xca\xc1\x05\x72\x2d\xaa"
+ "\xf8\xd8\x30\x9e\x43\xbc\xcd\x61\x3e\x7b\x24\xf5\x64\xc8\x7f\x73"
+ "\x78\xa5\x7d\x60\x68\xb9\xfd\x9a\x6d\xcb\x28\x35\xbc\x3c\x23\xfd"
+ "\xd5\x4b\x34\x4e\x9f\x7f\x60\xc3\x66\x8a\x0e\x6b\x4a\x29\xe6\x14"
+ "\xb6\x71\x07\x18\xd2\xe4\x9e\x1b\xdf\x47\x8c\x6f\x8f\xa8\x5a\x71"
+ "\xe5\x6f\xde\x84\x61\xdb\x72\xec\x69\x6e\x4b\xa2\xbe\x6e\x7a\x0b"
+ "\xf6\xb2\x76\x4e\xb6\xe8\x73\x1a\x0c\xbb\xc5\x38\xe0\xa2\xf0\x9c"
+ "\xc9\x23\x23\x7f\x27\xa4\x68\xa1\x5c\x47\xea\xd3\x60\x0f\x91\xd7"
+ "\xf1\x17\x2a\x5a\xc6\x63\x74\x70\x1f\xeb\x69\xec\x37\x89\xfc\x69"
+ "\x67\xe8\xe0\x51\x4b\x10\x73\x46\x10\xba\xf4\xd3\x6c\x13\x1e\xfc"
+ "\x34\x20\x63\xdf\xfe\xde\xc6\xbe\xe3\xff\x1f\x7b\xdf\x03\x17\x65"
+ "\x95\xee\x7f\x66\x18\x75\xd0\xe1\x8f\x46\x39\x1a\xda\x54\xba\x4d"
+ "\x2d\x16\xb6\xd6\xb5\x5d\xdb\xa8\x74\xd7\x6d\x35\xac\x6b\xbf\xcb"
+ "\xae\x96\x98\x60\x68\xa8\x23\x12\x91\x21\x20\x12\x3f\x30\x06\xe9"
+ "\xae\xdb\x45\x18\xfe\x74\xc5\x7b\x69\xd7\x36\xb7\x9f\x7b\xd7\xf6"
+ "\x97\x85\x89\x1b\x12\x30\x68\x58\x68\x98\x13\x21\xa1\x8b\x36\xc2"
+ "\x20\x23\xcc\xbc\xe7\xf7\x3c\xe7\xbc\x2f\x33\x03\x0c\x0c\x03\x9a"
+ "\xfd\x56\x3e\x9f\xf7\x33\xbc\xe7\x3d\xef\x79\xcf\x79\x9e\xef\x79"
+ "\x9e\xe7\xfc\x7b\x9e\xf2\xb8\xc7\x30\xed\x4a\xca\x59\xb6\x47\x82"
+ "\xf0\xbe\x75\xb0\x1e\xef\x53\xf0\xdc\xee\x78\xe3\xfc\x3f\x75\x5b"
+ "\xc7\xf0\xb9\x8a\x83\x27\x38\xcf\x7a\x4c\x7c\xfc\x75\xb0\xde\x1d"
+ "\x76\x85\xcc\x83\x65\x14\x7d\xa3\x1b\x6c\xe4\x49\x0b\x35\xb1\xf5"
+ "\x4c\xf4\x57\x90\xf8\x48\x39\xbd\x9c\x4b\xf8\x19\xbb\x0f\x77\x09"
+ "\x59\x07\xcb\xb8\xbf\xca\x0f\xdf\x20\x7c\x2f\x12\xe8\xc8\x83\x07"
+ "\xf8\x5c\xee\xc1\x4a\x3e\xb7\x79\xb0\x61\xdb\x54\xdc\xab\xfc\x61"
+ "\x5e\x87\xef\xc1\x56\xf8\x8d\xed\x18\xff\x59\xb9\x7b\x7d\xf4\xb7"
+ "\x06\xcd\x74\x12\x84\x73\xea\xb8\xef\xb8\x98\xef\x37\x86\x6f\x7c"
+ "\x64\xa0\x59\xec\xd9\x6d\x4d\x3a\xe2\xc3\xc7\x7b\x1f\x9e\xbb\xcf"
+ "\x40\x34\x50\x57\x3f\xaa\x3c\x98\xc9\xf6\x78\x65\x1e\xcc\x33\xb6"
+ "\xd1\x72\xdc\x5b\xc8\xd7\x3e\x3e\x2a\xa3\xbe\x07\x33\x79\xfe\x8f"
+ "\x1e\xaa\x6d\x83\x36\x28\x0f\x46\x18\xad\x17\x44\x9b\xf0\x23\xc0"
+ "\xfe\xc1\x08\x9a\x79\x30\x86\x9f\x7f\xff\x28\x4b\x92\xab\x1c\xa3"
+ "\x1f\x6d\x11\xb1\xde\xc0\xe9\xf6\x51\x99\xa8\xaf\x6e\xc3\xff\x41"
+ "\x77\x87\xf2\xb5\xfa\x8f\xe2\x25\x1b\xd9\x24\xe6\xc1\x77\xe0\xff"
+ "\x08\x2e\x6b\x3f\xda\x09\x6d\x17\xcf\x30\x7c\xc4\xd6\x0b\xa1\x7d"
+ "\xa0\xb3\x3e\xac\xc3\x76\xb9\x93\xad\x8c\x16\x49\xc4\x07\xea\x9c"
+ "\x88\x7b\x4a\xd1\x4e\x31\x5a\x1e\x29\xe7\xb1\x2c\x0f\xcd\x66\xe7"
+ "\x80\xe1\x3b\xc0\x1f\x39\xca\x4d\x3c\xb7\x8c\xe5\x39\xea\x5f\x7e"
+ "\xb3\x54\x17\xfc\x1e\x3e\x83\xb6\xe2\xfe\x1e\xa4\x55\x0c\xe6\x41"
+ "\xbe\xb6\xe8\x70\x8e\xa3\x13\x68\x86\xfb\x85\x0e\x85\x21\x4d\x38"
+ "\xcd\x0e\xf5\xc6\x3c\xe7\xf4\x3a\x34\xd1\x95\x1e\xfc\x5e\x50\x82"
+ "\x6c\x88\xc3\x7d\x23\x87\xc2\x44\xfa\xb5\x89\xdf\x67\x71\x38\xf9"
+ "\xb3\xf2\x3d\x4e\xef\x4e\xeb\xcd\xcb\xe3\xa6\xca\x71\x0d\x16\xe7"
+ "\xe4\x39\x5e\xcb\xeb\x9c\xde\xab\x5b\x71\x09\x6d\xe4\xf7\x23\x30"
+ "\xce\x25\xd2\xbc\x2b\xad\xbc\xd9\x41\x6f\x5e\xce\x00\xdf\x98\x2e"
+ "\x7d\xc3\x44\xca\x4b\xa5\x7a\xc2\xff\xa2\x0e\x3e\xa4\x75\xf0\xa4"
+ "\x7c\xa1\xf4\x5e\x11\x3b\x4b\xf4\x91\x05\xcf\x40\x0e\x28\x07\x71"
+ "\xed\x07\xa8\x52\x6b\x7b\xa4\x9c\xe1\x91\x1c\x2a\xc1\x3d\xb1\x40"
+ "\xd7\x44\x8e\xa1\x43\xe9\x5c\x17\x1e\x2a\xc1\x32\x71\x5d\x85\xfb"
+ "\x3b\x3d\x94\x07\xe5\x8a\xb1\xba\x0f\xed\x15\xeb\x00\xe3\xbf\x0f"
+ "\x4b\xfb\x8e\xeb\x1e\x5b\x19\xc5\x0e\xfb\xce\x7a\x49\xd7\xf7\x5c"
+ "\x91\xd2\x71\xae\xf3\x50\xab\xd3\xb9\xd8\x50\x4e\xef\x8f\xe7\xc0"
+ "\x38\x75\x7f\x0e\xf7\x8b\x7b\x20\x07\x78\x96\xd2\x49\xa6\x62\x7c"
+ "\x98\x64\x1d\x3d\x5f\xab\x83\xb1\xb5\xb2\x2a\x0a\xe4\x45\x4c\x72"
+ "\x27\x19\x8f\x7b\x2e\x50\xde\xe0\x7c\x0f\xf5\x85\xf4\xac\xaa\x18"
+ "\xc7\xd9\xbb\x0a\x13\x8c\x6d\xcb\xf4\x30\x96\x4d\xb9\x40\xa6\xf2"
+ "\x3d\x14\x1f\x6f\x14\xe7\x7d\xf2\x85\xcc\xaa\x58\x3c\xd7\x59\x0b"
+ "\x23\x42\x9a\x12\x93\x2f\x64\x55\xc5\x42\xb9\x49\x29\xeb\xc8\x24"
+ "\xd4\x6f\xb8\x57\x97\x63\xa6\xa2\x1c\xca\x4d\x42\x9f\x6b\x02\x8d"
+ "\x90\xc1\xf7\xcb\x05\x65\x9d\x52\x2f\x10\xb6\x47\x1c\x70\x26\x6f"
+ "\x22\x1f\x1f\x82\xef\x97\x63\xdc\x4a\x9c\xf3\x31\x5a\xad\xe8\x17"
+ "\xa2\x1c\x9e\xf9\xc3\x33\x9c\xef\x11\xd0\xff\x1a\xfa\x73\x87\xf2"
+ "\xd5\x58\x3e\x7c\xab\x9c\xd7\x9d\xf9\x45\x29\x6f\x22\x87\x6f\xc7"
+ "\x3c\x92\x5f\x37\x21\x25\xc2\x07\x9f\xe3\x39\x61\x3b\xc6\x45\x00"
+ "\xeb\x9c\xbf\xd3\xd0\xfb\x8e\x68\x3f\x43\x5f\xae\x78\x9f\x6e\xff"
+ "\xac\x01\xf2\x1e\xc0\x3d\xa9\xdc\x96\xad\xd8\x2f\xf6\x75\xb0\x8f"
+ "\x2b\xfe\x22\xfe\xaf\xea\xcd\x9b\x12\x41\x92\xaf\x10\x35\x5b\x57"
+ "\x7d\xd9\x07\x64\x6f\x85\x0a\x63\x2c\x38\x95\xf9\x35\x96\x97\x8d"
+ "\xfe\xe2\xa2\x89\x0a\xe4\xf2\x04\xa8\x37\xc6\x47\xf9\x1a\xe7\x6a"
+ "\x45\xda\x98\x80\x4f\xfb\x76\x70\x9f\x80\xfb\xf5\x80\xfd\xe4\x2d"
+ "\x60\x0f\x6c\x21\xaa\x2d\x76\x12\x8c\xed\x04\xbe\xb5\xe2\xbe\x6a"
+ "\x1c\xbb\x21\x6d\x44\x1e\x36\x42\x5b\x9a\xb7\xc4\xd0\xe6\x2d\x6d"
+ "\xb4\xb5\x26\xa6\x81\x80\x9e\x99\x54\xab\xab\x43\xdf\xe4\x5f\x63"
+ "\x5b\x71\x8e\x12\x68\xda\x68\xc2\x6f\x64\x55\x35\xe3\x59\x19\x36"
+ "\x4f\x20\x3f\x74\x40\x3a\x57\x54\xc4\xce\x1e\x55\x84\xf6\xce\x7d"
+ "\x25\xd0\x0a\xb1\x2e\x95\x02\xfe\x9f\xc0\xce\x27\x8e\xc7\xf1\x0f"
+ "\xce\x69\xac\x78\xa5\xa4\xf7\x8c\x06\x9f\x1b\xa8\x88\x75\xf2\xcb"
+ "\xc5\xde\xc5\x39\x02\x7c\x37\xdc\x46\x3b\x77\x88\x79\xf1\xdd\xf0"
+ "\x57\x56\x50\x7c\x17\xde\x29\xe9\x7d\xc7\xe5\x8c\xcf\x61\x6e\x57"
+ "\x00\x6d\xf1\x7f\x33\xd0\x52\xdc\x43\xa5\xe1\xeb\xdf\x15\x0d\xd2"
+ "\x9a\xb3\x89\x7c\x9c\x8b\x78\x1a\xd8\x9f\xf8\x11\xe2\xea\x23\xe9"
+ "\x48\x1d\xfa\x6f\x82\x74\xb5\xe4\xcb\x08\xfe\x9f\x01\x65\x71\x3b"
+ "\xdb\xc9\x47\x59\x8e\x93\xbf\xc3\x14\x33\xfd\x06\x71\x02\x72\xc5"
+ "\xe7\x3c\x39\xa2\xa3\x59\x75\x4a\x7e\x4e\xea\xc8\x21\xac\x67\x13"
+ "\x39\x82\xbe\x14\x02\xb8\x2f\x85\x23\x5b\x45\xf9\x61\x0d\xb7\xdb"
+ "\x02\x4c\xf0\x4d\x3c\xf3\xe3\x74\x9f\x08\xf2\x24\x10\xf2\xfd\x99"
+ "\xfb\x03\x3c\xa2\xeb\x93\x1f\x9f\xa7\xf6\xb9\x0f\xeb\x73\xaf\xb1"
+ "\x40\xbf\x71\xb7\xb6\xae\x9f\xca\xe6\x0f\x83\xfd\xb7\x12\x5d\xca"
+ "\x39\xe2\x03\x58\x39\x8b\x75\xab\x6d\x6d\xc3\x36\x05\xd0\xb4\x50"
+ "\x82\x73\xa0\xcc\xb6\x04\x9d\xde\x34\x03\xf2\x9c\x23\xb7\xe0\xbe"
+ "\x6f\x8c\x91\x02\xf9\xcf\x73\x3f\xe6\x9f\xfc\x66\xf9\x4b\xe3\x89"
+ "\xf0\x42\xc4\x04\x2a\x7f\x2a\x0f\xd7\xf6\xde\xe9\x36\x8d\xc1\x75"
+ "\xae\xe4\x5d\x04\x6d\xad\x5b\x00\x63\xcd\x18\x8f\x0e\xde\x69\xdb"
+ "\xdd\xdd\x3a\xc6\x68\x3b\x45\x74\x6b\x89\xfc\x3c\xf9\x64\x91\x22"
+ "\x89\x28\x76\xb4\x90\x40\xe0\xab\xed\xb0\x6d\x6e\xaf\x2f\x04\xc3"
+ "\x24\x7e\x8e\xdb\x00\xf2\x75\x93\x9a\x5a\xbb\xd2\xfe\x5e\x06\x63"
+ "\xaf\x9d\xd2\x18\x3b\x9b\xc7\x41\x51\xc0\xf7\x6f\x96\x8b\x7e\x1f"
+ "\x38\x6d\xff\x7e\x96\x9f\xb3\x0a\x7a\x01\xde\x69\x74\xd8\xdf\x9f"
+ "\xf0\x58\xe3\x99\x75\x21\x5c\xf6\x7d\x12\x73\x18\x2c\xf8\x74\xbe"
+ "\x47\x21\xa8\x2b\xed\x13\x65\xef\x1e\x05\x36\x6f\xf5\x49\x0c\xf0"
+ "\x30\x84\xdb\xe6\x75\x21\x2b\xec\x4a\xb1\x0f\x62\xfa\xfb\x11\xf8"
+ "\x2e\xbc\x17\x60\x61\x73\x4c\x9f\xcc\x77\x60\xed\x13\x15\xca\x7c"
+ "\x68\x93\xca\x44\xfe\x9e\x8a\xed\x42\x9a\x40\x3e\x05\xdc\xa7\x1f"
+ "\x2e\x75\xe3\x17\x56\xf9\x37\xa5\x0d\xe7\x40\x32\x7b\x5a\x01\x4f"
+ "\x17\x80\x07\x37\xa1\xef\x27\x23\x7c\xa7\xa6\xa8\x9b\xd4\xa8\x3b"
+ "\x48\x2d\xfc\x8f\x7b\x91\xcb\xd7\x7e\x43\x9a\x35\x03\xeb\x1b\xd0"
+ "\x59\x99\x50\xe7\x3c\x2c\x0b\x65\x01\xee\xdf\x32\x26\x81\xfe\x31"
+ "\x43\x59\xcd\x84\x95\x51\x23\xb4\x92\x9a\x44\x18\x67\x65\x4f\x31"
+ "\xd7\x16\x9d\x22\xb5\xea\xcf\xd8\x77\xd0\x26\x2c\x8f\xeb\x18\xac"
+ "\xec\x32\x28\xfb\x80\x58\x76\x1b\x94\x1d\xe4\xb6\xec\xcc\x9e\xc0"
+ "\x61\x96\xed\x79\xbd\x33\x7b\xc8\x70\xca\x06\xd9\xa7\xc2\x38\x37"
+ "\x78\xae\x2b\x79\x0a\xf1\xb3\x5f\x46\xbf\x9f\xb7\x51\xbe\x1f\xf6"
+ "\xe8\xc3\xec\xec\x57\x1a\xdb\x6f\xac\x64\x67\xc0\x2e\x12\xb6\xa7"
+ "\x91\x9f\xfb\x3a\x4b\x70\x3f\x44\x57\xda\x51\xad\x63\xac\xd4\xbb"
+ "\x4e\x05\xb6\xea\xd1\x45\x7c\xdf\x63\x95\xb8\xee\x7b\x14\xfd\x46"
+ "\xba\x19\xe7\x7d\x3a\x87\xef\x9f\x3d\xfa\x9a\x34\xff\xd2\xe1\xfb"
+ "\xe9\x1c\xb1\x2c\x4d\xdf\x79\x3d\x29\x20\x6d\x74\x62\xbc\x14\xdb"
+ "\x36\x5e\x3c\x7e\xfa\x74\xf4\xaa\xe8\x35\x09\xd1\x51\x9a\xa5\x2f"
+ "\xc5\xad\x9f\xb5\x61\xf5\x6a\xcd\xe2\xe8\x4d\x9b\x56\xbe\x10\x3d"
+ "\x9e\x2c\x8d\x5b\xb9\x7e\xd3\x1a\x9c\x7b\xd3\x68\xe6\xff\x64\x45"
+ "\xcc\x86\xf8\x59\x3f\x9f\x1f\xda\x67\xee\x0d\xcf\x2a\x36\xa2\x0d"
+ "\x0e\xba\xe3\x96\x64\x3b\x99\x88\x7e\x7c\x02\x5e\xa1\xe5\xaf\xc2"
+ "\xf8\x0f\xf0\x77\x1e\xf5\x14\xea\x06\x1c\x1b\xa0\x0f\x41\x90\xdf"
+ "\xd5\x05\x6f\xd2\xba\x16\xf2\xa5\x1d\xec\xca\x86\x62\xee\x0f\xaf"
+ "\x11\xc6\xe4\x66\x1e\x6f\xf1\xcb\x93\xe8\xeb\xee\x75\x48\x33\xfb"
+ "\xd6\x85\xec\xf8\x8a\x28\x40\xaf\xc1\xb8\xa4\x2a\x8f\xca\xc7\xd1"
+ "\xec\x5b\x68\x05\xfd\x46\x4d\x44\x1f\xe2\x72\xa3\xc9\x8a\xeb\xf9"
+ "\xca\x70\x5b\x0a\x45\x79\xca\xfb\x56\xd5\x2e\x4e\x97\x83\x65\x7c"
+ "\x5f\xf1\x97\xef\xe3\x18\x66\x1b\x8b\x87\x59\x05\xfd\xff\xa0\xce"
+ "\x21\xa7\x3f\xab\x10\x6d\xc7\x06\xa0\xfb\xcb\x4d\x70\xcf\xfd\x8c"
+ "\x54\xd5\xbb\xee\xd5\xa8\x06\xbd\xfc\x45\x2b\xbf\xf0\x9d\x06\x25"
+ "\xbf\xf0\x7f\xe7\xeb\x4b\x03\xbf\xfa\xa6\x8f\xf4\x92\xbe\xef\xed"
+ "\xfb\xf5\x49\x83\x5f\x9e\x7c\x1f\x7f\xbf\xcf\xf6\x8f\xe4\xfd\xfa"
+ "\xf4\xc1\x2e\xc4\x1b\x60\xab\xf1\xf5\xaf\x88\x12\xf0\xb9\x53\xff"
+ "\x3c\x60\xfa\x34\x51\x27\xd9\x68\x73\xca\xb3\x24\x38\xf9\x1c\xc1"
+ "\x78\x84\xad\xf1\x89\xb4\x39\xf9\x32\xda\xa4\xf5\xcf\x00\x7e\x0f"
+ "\xe4\x34\x11\x95\xbe\x89\x04\xd6\xc6\x63\xac\x62\xf4\xf5\x05\x72"
+ "\xa6\x0d\x2e\xb8\xaf\x4e\xb0\x92\x4f\xcd\x97\x70\x7f\x53\x79\x6d"
+ "\x24\xc8\x9d\x46\x42\x10\xbf\xaa\x48\x12\x64\xb8\x85\x7e\x40\xd3"
+ "\x36\x80\x3e\xdb\x80\x71\x09\xeb\xdf\x15\xc2\xc6\xbc\xbb\xb9\x72"
+ "\x8c\xe6\x79\xd4\xf1\x35\xbf\x11\xb1\x79\x84\x9f\x29\xfa\x8c\x9d"
+ "\x67\x80\x7e\x52\xcf\xe7\xd5\xeb\x1f\xe5\xfa\xbc\x7e\xa2\x38\xdf"
+ "\x04\xff\x7f\xc6\x6c\x45\x68\xc7\x01\x8c\xdf\x8a\x65\xfe\x49\x38"
+ "\xc0\xe2\xb7\xbe\xbb\x39\x6c\x4c\xd2\x4a\x22\xaf\x35\x9d\x27\x18"
+ "\xdb\x09\x63\x81\x42\xbf\xdb\x0b\xfd\x6c\x5f\xe1\x2d\x34\x17\xea"
+ "\x97\x5d\x74\x0b\xcd\x84\x3a\x95\x75\xa5\xd5\x54\x82\xee\xf9\x40"
+ "\x5c\x77\x29\x87\x7e\xb1\x57\x0f\x79\xc2\x5f\x22\xb7\xe9\x21\x5f"
+ "\x0e\xe4\x43\x3b\x99\xd7\xef\x98\x1e\x68\xb0\x1f\xbe\x59\xa7\x79"
+ "\x0e\xef\x8d\x6c\xef\x0d\x7e\x1b\xda\xa1\x69\x22\x46\x35\xe8\x36"
+ "\x05\x7e\x43\xfa\x6e\x57\x5a\x2d\xc8\xbf\xca\x78\xb6\x76\x06\xe9"
+ "\xbc\x9c\xda\xa5\xbc\xbf\x56\x65\xef\x70\xc4\xd7\xcd\xd6\x6f\x06"
+ "\x9d\xde\xcd\x7c\x60\xa2\xdf\x35\x66\x63\x30\xbb\xc2\x4e\x02\xf8"
+ "\xfc\x00\xd8\x16\x31\x20\x07\xc0\x9e\x60\x7b\xa1\xc1\x96\x80\xba"
+ "\xec\xc4\x38\x8f\xf8\x1c\xc6\x6d\xfb\x41\x2f\xef\x43\x3b\xe0\xb9"
+ "\xce\x27\x08\xce\xb1\x63\x8c\xd6\x4d\xcb\xa9\x95\xc7\xcc\xa9\xdd"
+ "\x2f\xd9\x02\x28\x83\x50\xff\x83\x2d\xac\xe8\x01\x1e\x02\x06\x2a"
+ "\xc1\xb6\x98\x78\x9e\x69\x0e\x46\xfb\x4a\xa6\xf3\x13\x98\xcf\x66"
+ "\x1f\x2e\xa3\x6b\xed\xd0\x3e\x15\x7c\x03\x68\xd6\xc8\xe6\xc2\xb9"
+ "\x8c\x31\xaa\x24\x3d\x8e\x63\x5e\x13\x94\x41\x41\x96\x89\xcf\xa0"
+ "\xfd\x47\xa4\x58\x77\x60\x57\xd4\x7e\x20\xd2\xac\x9a\xaf\x21\x1b"
+ "\xd9\xd8\x1f\x6c\xae\x10\x91\x36\x95\x68\x57\x88\xef\xf6\xee\x7f"
+ "\xc4\x71\xb9\x00\x76\x05\xd2\x0b\xe9\x04\xe5\x54\x8a\x72\xac\x9e"
+ "\xdb\x2f\xc7\x5e\x12\xd7\x2d\x73\x81\xd7\xe9\x0e\xfa\x1b\xcb\x9c"
+ "\xe9\x0f\xef\x8b\xe3\xc6\x63\xb7\x3b\xf1\x0e\xc6\x46\x75\x56\x9c"
+ "\x27\x85\x3a\x7e\xc0\xe7\x78\x8c\x5f\xa3\xaf\x34\xf4\xcd\x0c\x34"
+ "\xfe\x20\x1b\xfd\x00\x83\x6c\xde\xf6\x15\xc1\xb5\x6f\xb0\x9f\xea"
+ "\xbe\xe6\xf6\x69\x5d\x2a\x62\x18\xee\xd9\x3c\x7c\x33\xd4\x0b\xcb"
+ "\x83\xfb\xa7\xe0\x17\xec\xd8\xba\x5f\x39\xc7\x53\x76\xc4\x52\xae"
+ "\x0b\x73\x9c\x47\x30\xc6\xf2\xf1\xb3\x31\x16\xe7\xc0\x58\xfe\x9e"
+ "\x18\xac\x5b\x23\xf6\x4b\xa9\xad\x18\x57\x19\xd2\xd1\xf6\x6f\x44"
+ "\xbe\x49\xe9\xe8\x43\x18\xf8\xa4\x82\x6f\x9d\x14\xeb\xb4\x1f\xee"
+ "\x95\x70\x3f\x83\xcd\xef\xf7\xb0\xf3\xe6\x8d\xfa\x64\xc7\x3b\xd8"
+ "\x6f\x00\xc3\x01\x90\xe7\x18\xfc\x52\x29\x2f\x8f\xbd\x5c\x17\xf1"
+ "\xbb\x6e\x9c\x03\xab\xd3\x49\xb1\x97\x31\xee\x32\xca\x0c\xfd\x73"
+ "\x2e\xb4\x47\xda\xec\x05\x5e\x31\xdc\x1d\xb6\x1d\x00\x7a\x1f\x03"
+ "\xfb\xff\x6f\x11\xbc\x5d\x75\x11\x62\xfd\xca\xb9\xff\x94\xa3\xb9"
+ "\xcc\xdf\x2f\x1b\x0f\x1d\x0b\xeb\x1d\x0f\xf5\xda\x96\x75\xcc\x8f"
+ "\x2d\x94\x55\x8d\xfc\x47\x3b\x11\xf2\xc5\xf4\x62\x8b\x9d\xf7\xad"
+ "\x6b\x45\xfb\x52\xac\x3f\xe2\xe5\xa8\x48\xbb\x5c\xe7\x7e\xe7\xdc"
+ "\xcf\xa1\x0c\x18\xff\x7f\xd2\x8b\x01\xa9\x5f\x73\x1c\x1c\x17\x63"
+ "\x3f\xf5\xb4\xa2\x0f\x5f\x28\xb7\x1c\x6d\x70\xae\x57\x8f\xef\x3f"
+ "\xdc\x68\xc3\x39\xf4\x7a\xb8\x87\xfe\x7d\x3c\xb7\x63\xfc\x67\xa6"
+ "\x74\x26\x37\x8e\x03\x7d\xee\x63\xb1\x4a\x90\x2e\x52\x7f\xdd\xf1"
+ "\x1c\x8e\xfd\x42\x79\x9f\x4d\x04\x34\x58\xdb\x88\xb8\xd7\x1f\xfa"
+ "\xec\x59\x5c\x3b\x3d\x0f\x18\x52\x62\xff\x05\xfe\xee\x45\x7f\xd3"
+ "\x40\xc7\xba\xf4\x37\x59\xbf\x55\x61\xbf\xed\x41\x1f\x12\xf0\x9d"
+ "\x8a\xc8\x30\x72\x38\xb1\x9c\xf5\x63\xf4\x1f\x52\x00\xb4\xc3\x38"
+ "\xc7\xf0\xed\x24\x69\x8f\x32\x62\x04\xfd\x85\x88\x38\xa9\xc0\xbe"
+ "\x2c\xd2\x4e\x01\xf9\x4a\xa5\xbe\xe7\xc4\x7f\x96\xa7\x4f\x7f\x0b"
+ "\xe0\xfd\xed\x78\xbd\x44\x6b\x1b\xeb\xc7\x75\x3a\x1b\xf4\x63\x67"
+ "\x9a\x22\x3d\x91\xae\x5d\x69\x9f\x41\xfb\x2b\xd5\x12\x4d\x1d\xf4"
+ "\xfc\x6c\xa3\xc8\xf3\x3a\x3e\xc7\xf4\xd9\x1c\x71\xfe\xa9\x97\x86"
+ "\x22\xfe\x50\x0f\x1c\xd8\x86\x6d\x07\xdd\x80\xdf\x47\x8c\x14\x88"
+ "\x32\xab\xc2\x8c\x18\xf9\x0c\xfa\xff\xbf\x6a\x1d\xb2\xa3\x2e\x9e"
+ "\x8d\x59\x80\x4f\x9c\x3f\x9f\x15\x32\x7f\x1b\x03\xc8\x0e\x13\x39"
+ "\xb6\xdc\x21\x9f\x3e\xdb\x2b\xd1\x41\xc2\xa4\xd4\xef\xa1\x8c\x2b"
+ "\xae\xf2\xe7\xb3\xd3\x50\xc6\x24\x94\x6f\x0e\x1b\xea\xb3\x36\x57"
+ "\xf9\xf6\x59\x3d\xca\x37\xc4\xb5\x2e\x01\xe7\xd8\xb8\xbe\x32\x91"
+ "\x9a\x24\x57\x99\x54\xb3\x91\xef\x0d\xe0\x36\x17\x62\x4b\xf7\x1c"
+ "\xcf\x8f\x3a\x0c\xf2\xb3\xb1\xb8\xa8\xf3\x2a\x50\xc7\x41\x5a\x8c"
+ "\x48\xaf\x46\xc8\x5f\x81\xe7\x26\xd1\x57\xc2\x84\x46\x3e\xd6\x03"
+ "\x39\xfd\x01\xfa\xef\x86\x7c\xda\x5a\xf8\x5a\x4f\x06\x97\xdd\x92"
+ "\xac\xa0\xab\x22\x26\xbc\xdc\x4a\x7c\x75\x3f\xa7\xdf\xb4\x90\x13"
+ "\x78\x9e\xd5\x8a\x3e\x24\xa1\x6c\x4d\x0b\xf9\xe2\x18\x7c\x37\x48"
+ "\xfc\x55\xc3\xef\xfb\xf0\x3b\x05\x7e\xdf\x82\xdf\x5b\xe1\x37\x0b"
+ "\xf2\x0b\x62\xfe\x50\xb8\xdf\x08\xe9\x3f\x11\x7f\xa1\x8e\x27\xd0"
+ "\xde\x5c\x22\xda\x8e\x98\xbe\x00\xef\xe1\xf7\x01\x91\xe7\xd5\x9c"
+ "\xe7\x27\x66\x41\x39\x89\x50\xff\x06\x63\x23\x2b\x4b\xd7\x42\x3e"
+ "\xef\xc4\xb2\xf1\x1c\x33\xfc\xff\xb6\x93\x0d\x0a\xe5\x9c\x38\x01"
+ "\xbf\x73\xe0\x77\x17\xfc\xc6\xc3\xef\x3a\x91\x06\x75\x28\x1b\xa2"
+ "\x12\x19\xcd\x33\x35\xdc\xde\x5d\x22\xf5\x79\xd4\xc3\x0e\xd9\x51"
+ "\x5b\x19\xb5\x9c\xf3\xdb\x44\x8e\x33\x1c\x40\xde\x47\x31\x2f\xfc"
+ "\x3e\x2e\xfe\x86\x89\xbf\x0b\xc4\xdf\x5f\x8a\xbf\xf3\xc5\xdf\x85"
+ "\x26\x72\x42\x27\xda\x18\x40\x97\x13\x3a\x6c\x37\xf4\x6d\xd1\x9f"
+ "\xda\xe7\xb9\x38\x46\x06\x39\xfe\x00\x94\xef\xd3\x95\xf6\xb9\x42"
+ "\x9a\x1f\xc5\x39\x9f\x9e\xb4\xa3\x7f\x2c\x60\xeb\xda\x9f\x07\x3b"
+ "\x64\x9b\xd1\xa6\x92\x85\x11\xb0\x81\x6e\x36\xc8\x69\xae\x58\x4e"
+ "\xbc\x5c\x5c\x17\x16\x63\x03\xf8\xa0\xbf\x3c\x36\x1e\xf2\xbb\x29"
+ "\x02\xfb\x2a\x9b\x3b\x46\xdf\x6e\xbe\x75\x04\x2e\x15\x8c\x0d\x02"
+ "\x25\xf9\x8d\xe3\x1e\x3e\x56\x1f\xf7\x19\x7c\x2b\xd3\x31\x56\xff"
+ "\x7c\x2e\x5f\x43\x9b\xbc\x11\xd2\x4b\x1c\xe9\x27\xf0\x3c\xc0\x03"
+ "\x40\xcf\x06\x68\xcf\x9c\x26\xf2\x39\xfa\xf0\xbf\xbf\x99\xb7\x39"
+ "\x54\x6a\xb3\xc8\x0f\x9d\x44\xdf\x66\x72\x22\x11\x64\x61\x1c\x62"
+ "\xb8\xa9\x57\xce\x9e\x60\xf3\xba\x22\x46\x80\x97\x27\x66\x23\x4f"
+ "\x9d\xfa\xa0\xb3\x0c\x0a\xea\x4a\xfb\x42\xeb\x2a\x53\x8c\x5a\x94"
+ "\x29\x88\x0d\x90\xdf\xc8\x6b\x65\x9f\xfe\x57\x8f\xfd\x8f\xf7\xbb"
+ "\x2f\xa2\x5c\xdf\xfd\xac\xde\xc6\xfb\x5d\x03\xe0\x0c\xf0\x59\x8f"
+ "\xf1\x21\x40\x0e\x7d\x31\x5f\xec\xd3\x0d\xd0\xa7\x1f\x80\xf4\x3a"
+ "\x5e\x57\x9e\x2e\x7e\x0b\x70\x56\x8f\xed\xbe\x55\x4a\x17\xdb\x8b"
+ "\xe5\xa0\xcf\xff\x29\x52\xba\x58\x3e\xe0\xb1\xfe\x00\xf6\x13\x29"
+ "\x5d\x6c\x13\xd8\x51\x5f\xd8\x24\x79\x92\xcd\xf1\x96\x2e\xbd\x87"
+ "\x7c\x43\xff\x58\x7c\x8e\xff\x0b\x3c\x5b\x51\x82\xfa\x61\xdb\x73"
+ "\x44\xf5\x72\x1e\xf1\xe3\xfd\xf2\x8b\x56\x57\x19\x79\xea\x28\x4d"
+ "\x0b\xb0\x51\xa5\xd1\x5a\x63\x9b\x23\xd9\xab\x86\xae\xb4\x86\x28"
+ "\x29\xce\xb7\x23\xce\x40\xc3\xae\x9a\x92\x5e\xfa\x42\x5d\x1a\x32"
+ "\xa5\xba\x38\xe9\x67\xc6\x03\xac\x1b\x96\xb5\x0d\xec\x75\x0b\xc8"
+ "\x05\x2e\xb7\x1b\x0e\x98\xc8\x04\xc9\xde\x65\x7a\x2b\x40\x46\x74"
+ "\x39\x09\x6c\x7d\x34\x00\x75\x23\xee\xf1\x11\x70\x1e\x2b\xd1\x4e"
+ "\x6a\x75\x30\x96\x4f\x3c\x4b\x56\xbc\x32\x1e\x7d\xaf\x44\x40\x5d"
+ "\xdf\x81\xba\x95\xda\x71\xee\x7f\x3d\x8e\x53\x4f\xad\xb4\x27\x50"
+ "\xab\x48\x33\xe8\x47\xa7\x16\x88\xb4\x45\xf9\x55\x8a\x32\x7d\x5b"
+ "\x32\x8f\x19\x84\x73\x39\xd8\x3f\x7e\x87\x7a\x4c\x4d\xad\x15\x06"
+ "\xec\x2b\x27\x17\x4a\x36\x29\xd4\xb7\x84\xdb\x84\xc7\xf7\x30\xdf"
+ "\x44\x60\x79\xf3\xb9\xc0\x93\x27\x78\xdb\x4f\x7e\xc0\xd7\xb9\x99"
+ "\x8f\x4c\xbc\x2f\xf3\x51\xdf\xf2\x05\xdf\x97\x75\xf4\xef\x7c\x4f"
+ "\xc9\xc9\xbc\xde\x3d\x25\x0e\x5b\xb1\x9c\xfb\x8d\x3a\xb9\xdf\xd1"
+ "\x27\x4e\xa6\xe3\x7b\xf0\xfe\x79\x48\xaf\x76\xa4\x1f\x2f\xe5\xf6"
+ "\x80\xd1\xe6\xbf\x35\x0c\xf7\x96\xdd\x8c\xbe\xb6\xf9\xf7\x4e\x85"
+ "\xb0\xef\xb3\x39\x0f\xa3\x4d\xea\xbf\x48\x67\xd4\xd9\xac\x0f\x43"
+ "\xff\xc5\x7e\xdc\x93\x55\x47\xe0\xe2\xfd\x96\xeb\xe6\x72\xd6\x6f"
+ "\x59\x9f\x3d\x35\xcf\xa9\x1e\x16\x36\xef\x85\xfc\x7c\x55\xad\x82"
+ "\x67\x11\xa0\x57\xeb\xc4\x67\x3c\xa6\xc4\x79\xe6\x23\xcf\x8c\x6b"
+ "\xdb\xb8\xd6\x89\x67\xb4\x02\x00\xdd\xe8\x13\x44\x5a\xab\x5e\xdc"
+ "\x96\x42\xed\xb8\xee\x74\x99\x5a\x72\x7b\x7d\xfd\x9f\x2a\x75\xf8"
+ "\xf7\x39\xa9\x10\xdb\x65\x85\x6f\x19\xf8\x5e\xb0\x86\x4e\x6e\x53"
+ "\x35\x58\x10\xa7\x46\xc0\x1e\xfc\xe6\xf1\xb8\xcc\xa7\x4c\x12\xf6"
+ "\xa0\x5f\x46\xb5\x90\x2f\x37\xee\xbc\x85\xe6\x01\x4f\xf3\xa0\x2f"
+ "\xc5\xc2\xfd\xb3\xf0\x1b\xc5\x7f\x65\x81\xf8\x2b\xf6\x91\xbc\xae"
+ "\xb4\x2f\x83\xa5\x78\xf4\x48\x1b\x8b\x6f\x4f\x24\xe2\x2c\x07\xe8"
+ "\x80\x58\x63\xeb\xc8\x50\x6f\xc4\x17\xe2\x0c\x31\x16\xb0\xf5\x09"
+ "\x86\x33\xe6\x7f\x20\x11\xf7\x20\x9f\x54\x20\xce\xa0\xac\x18\xc9"
+ "\xcf\xaf\x89\x7c\xa9\xe2\xeb\x39\x5f\x26\x49\x7b\x6e\x71\x2d\x29"
+ "\xfe\x76\x72\x33\x94\xab\xa9\xd0\x30\x5f\x9a\x67\x8c\xb6\x05\x04"
+ "\xf3\xe2\x3a\x1c\x97\x93\x93\x2b\xe0\x9d\x7d\x0e\x9a\x1b\x59\x6c"
+ "\xe6\xc3\xcb\xd9\x5c\xe4\x4d\xf0\xac\xda\x79\x9c\x61\x22\x55\x79"
+ "\x38\xd6\xc0\xbd\x7d\x77\x06\x11\x5c\x07\x06\x39\xf6\xa5\x59\xb2"
+ "\x6b\xef\x0b\xc2\xf5\xfc\xaa\xf9\x50\x3f\x1c\x43\xd7\xc1\xff\xa1"
+ "\x30\x96\xac\x74\x33\x67\x3c\x07\xe7\x7a\xc4\xf8\x3c\x8d\x38\x8f"
+ "\x85\xf1\x0c\x5a\xc8\x99\x8d\x35\xe8\x0b\x64\x43\x7f\x3f\xcf\xc9"
+ "\x89\xb4\x13\x7d\x3d\x6b\xe2\xc8\x4d\x4d\xe4\xcc\x52\x9c\x37\x4a"
+ "\xb9\x84\x73\x34\x8d\x89\xae\x73\x34\x8d\x95\xe2\x05\x23\xed\xd3"
+ "\x61\x4e\x57\x9d\xf8\xbb\x68\x88\xab\x55\xcc\x0b\x2d\xfd\x4a\xd4"
+ "\x29\x6a\xe8\x27\x8d\xbd\xf3\xbf\x88\x4b\xec\xdb\xb8\x8f\x03\xe7"
+ "\x9c\x64\x36\x82\xbe\x47\x80\x4f\x50\xef\x6d\xf7\x3c\x5d\xbe\x19"
+ "\x71\x74\x9a\x9d\x83\x42\x1f\xc4\xc3\xdb\x4b\x74\x9a\xf1\x93\xfb"
+ "\x03\x6d\xac\x83\x6f\x07\xed\xb8\x48\x14\xba\x38\x32\x0d\xe7\xbf"
+ "\x03\xec\xb4\x1c\xc7\xb8\xa2\x4f\xc1\xba\xf3\xe4\xf4\xb1\xf8\x2d"
+ "\x44\x0e\xcf\x6f\x83\xff\xcb\x25\x3b\x09\xde\x09\xf4\xb1\x92\x20"
+ "\xb4\x8f\x1e\xdf\x42\x6e\xeb\x4a\x3b\x6d\x90\x78\x85\x36\x04\xce"
+ "\xc3\x89\x73\x09\x50\xd7\x46\xb6\xc7\x19\xfd\xd4\x9b\x18\xdd\x98"
+ "\x1c\xc6\x32\x60\x0c\x7b\x3a\xd3\xc7\x42\x02\xb9\xee\x39\x0d\xf8"
+ "\x3f\x2a\xda\x8c\xa7\x4b\x01\xfb\xf5\x4e\xf5\xfc\x85\xd3\xff\x19"
+ "\xf8\x7e\x80\x05\xed\x33\x77\xf4\xf9\x6a\x96\x44\x1f\xdc\xaf\x1a"
+ "\x00\xe3\x04\xc6\x6f\x1b\x6d\x83\xba\x55\xeb\x36\x13\xe5\x79\x72"
+ "\x66\x5a\xf1\x9b\xec\x9c\x5d\x25\x9f\x9f\x3f\x33\x51\x1a\x87\xf3"
+ "\x7a\x7f\x75\x3a\x60\xab\x0f\xc1\x79\x75\xf4\x77\xc6\xf6\xfa\x7d"
+ "\xa7\x66\x73\xe9\x46\xdb\x3c\x52\x9e\xfc\x53\xcc\x23\xd9\x55\x8d"
+ "\x1d\x29\x6a\x72\x58\x3d\x0f\xfa\xf1\x57\x65\x26\xd9\x91\xb9\xc3"
+ "\xdf\x53\xf9\x55\x99\x48\xdf\x6a\xbe\x17\xe1\xab\x57\x50\x97\xe0"
+ "\xd8\x1f\xf4\x48\x05\xea\xe8\xae\xb4\x33\x0a\xa9\xdf\x80\xde\xa8"
+ "\x80\x77\x44\x7f\xd8\xb8\xfe\xfb\x55\x3c\xfa\x80\x60\xe3\x06\x9e"
+ "\x5f\xc5\xe7\xfc\xcf\xcc\xed\xb5\xa5\x21\x1f\xbe\xc7\xf7\xa8\x7d"
+ "\xb5\x68\x85\x5d\x06\x34\xfd\x6a\x11\xb6\x4d\xc4\x22\xe8\xab\x33"
+ "\x31\x8e\x7e\x7b\x9a\xc9\xe6\xc3\x6d\xce\xfd\xf2\x4c\xa6\x63\xbc"
+ "\xd9\x38\x6f\xd6\x4e\xa2\x19\xa8\x1f\xea\xfc\x51\x57\x9d\xb9\xb2"
+ "\x63\x07\x2d\xc9\x95\x0b\x8f\x6d\xcb\x21\x2a\x59\x36\x90\x0d\xfb"
+ "\x59\x42\xe4\xcd\x2d\xc4\xe4\x1b\xa0\x9a\xbc\xe4\xf1\xf8\x71\x34"
+ "\x59\x4d\xe4\xfa\xf6\x71\xca\xdb\xad\x93\x4b\xa8\xcf\x3d\x4f\x2f"
+ "\x8e\xb7\x12\xcd\xda\x5c\xf2\x6d\x2c\xf1\x79\xdc\x0e\xdf\x56\x11"
+ "\x9d\x89\x34\x05\xe1\x99\xd1\xc3\x2a\xb4\x3f\x9a\x82\xb0\xcc\x24"
+ "\x03\x51\x26\x35\xd3\xd6\xec\xd5\x63\x94\xa0\x0f\x02\x0b\x00\x63"
+ "\x13\x54\x93\x4b\x7a\xa0\x8c\x43\x91\xec\xbd\x01\xcf\x46\xf3\xba"
+ "\x99\x7e\x3f\x70\xdd\x74\xb7\x40\xdd\xf6\x0c\xaf\x6e\xdf\xec\x77"
+ "\xd4\xed\x9b\xfd\x23\xaf\xdb\xd7\xb3\x9d\xea\x16\xe8\xa8\x5b\x0c"
+ "\xd4\xed\xeb\x47\x87\x57\xb7\xb3\x4b\x1d\x75\x3b\xbb\xd4\xc3\xba"
+ "\xed\x1d\xa4\x6e\x35\x03\xd7\x2d\x71\x32\xd4\xed\xf4\xf0\xea\xd6"
+ "\x62\x71\xd4\xad\xc5\x32\x92\xba\xe1\x58\x3e\x39\x98\x9e\x65\xfe"
+ "\xe4\xe3\xb8\xbf\xd6\x16\xf2\xcd\xc3\xc9\x06\x76\x3f\xa9\x85\x34"
+ "\x5d\x11\xfb\xb7\x39\xc5\x42\xbf\xe1\x76\x4e\x53\xf4\xbd\x3a\xdc"
+ "\xef\xda\xb4\x1c\xb0\x1c\xc4\x31\xfd\x0d\xdb\xdf\x90\x62\xa6\xe2"
+ "\x7e\xd3\xa6\xd7\x8a\xd8\x7e\x94\xfa\x4c\xf1\xbe\xb2\x63\x7c\xdd"
+ "\x1c\xdc\x0b\x22\x40\x7f\xa6\xe3\xeb\xc2\x30\x7e\xe7\xbb\x71\x66"
+ "\x39\x4d\x43\xdf\x61\xe8\xef\x4f\x41\xe8\xf6\xba\x25\xef\xc6\x59"
+ "\x59\xec\xf0\x6d\xec\xbc\x6f\x53\xb9\x74\xc6\x4d\xfa\x86\xd9\xb7"
+ "\x3e\x13\xd2\x1b\xa4\x38\xb0\x54\xae\xc4\xb1\xc7\x5c\x2c\x1f\xd2"
+ "\xcd\x52\x6c\x56\xc0\x7b\xba\x28\x1b\x2c\x01\xd6\xc1\xe4\xde\x37"
+ "\x33\x25\xb9\xf7\x78\x3c\x09\xc0\xb8\x94\x3b\x92\xc7\xe1\x9a\x23"
+ "\x94\xd5\xb4\x1f\xe9\x1e\x6e\x19\x47\x03\x92\x88\x0f\x9e\xed\xc3"
+ "\x3d\x7a\x46\xb5\x99\xcc\x48\x22\x63\xc2\x13\xa1\x4c\x2b\x89\x0c"
+ "\x48\x84\xf2\x80\xd6\x7c\x6c\xf0\x0d\x9b\xe3\xdb\x09\xe5\xe1\xfa"
+ "\xb7\x4f\x3c\x51\x3d\xae\x4e\xa1\xdb\x76\x11\x05\x9e\x03\xc4\xf3"
+ "\x7c\xfc\x2c\xdf\x58\x65\x57\xda\x37\x25\x52\xfb\x3c\xe0\x8f\x3f"
+ "\xe7\x4f\xf3\x69\x07\x7f\x9a\x77\xf5\xe7\x4f\xf3\x18\xce\x9f\x6f"
+ "\x6c\x0e\xfe\x9c\x0d\x73\xe5\x4f\xf3\x4c\x57\xfe\x34\xc7\x78\xc7"
+ "\x9f\xe6\x48\x07\x7f\xf8\x37\x38\x7f\x9a\x13\x07\xe6\x4f\x73\xae"
+ "\x83\x3f\xcd\x33\x3c\xe3\x4f\xf3\x11\xf7\xfc\x69\x5e\x3a\x08\x7f"
+ "\xc6\x0e\xcc\x9f\xb3\x37\x7b\xce\x9f\xb3\x61\xc3\xe0\x8f\x1f\xe7"
+ "\x4f\xcb\x16\x07\x7f\x5a\x1e\xea\xcf\x9f\xb3\x7b\x38\x7f\xce\x1a"
+ "\x1c\xfc\x69\x31\xb9\xf2\xe7\xec\x11\x57\xfe\xb4\x28\xbd\xe3\x4f"
+ "\x0b\x71\xf0\x87\x7f\x83\xf3\xa7\x45\x3d\x30\x7f\x5a\x42\x1d\xfc"
+ "\x39\x5b\xe1\x19\x7f\x5a\xa2\xdd\xf3\xe7\xac\x65\xf8\xfc\x69\xf9"
+ "\x4b\x1f\xfe\x04\xba\xe7\x4f\x8b\x69\x18\xfc\x09\xe0\xfc\x69\x9d"
+ "\xe6\xe0\xcf\xb7\x27\xfb\xf3\xe7\xdb\x05\x9c\x3f\xdf\xce\x73\xf0"
+ "\xa7\x35\xd5\x95\x3f\xdf\x46\xbb\xf2\xe7\xdb\x32\xef\xf8\xf3\x6d"
+ "\x89\x83\x3f\xfc\x1b\x9c\x3f\xdf\x1e\x18\x98\x3f\xdf\xd6\x39\xf8"
+ "\xf3\x6d\x94\x67\xfc\x69\x1d\xe3\x9e\x3f\xdf\xee\x1c\x84\x3f\xe3"
+ "\x06\xe6\x4f\xeb\x33\x9e\xf3\xa7\x35\x75\x30\xfe\x0c\xcf\xd6\x6b"
+ "\xdd\x89\xdf\x1d\x85\x72\x1a\xdd\x95\x83\xb4\xc3\xfd\x87\x42\x5a"
+ "\x6b\x63\x91\x30\x56\xc9\xcf\x68\xb4\xee\xd4\x6c\x26\x8f\x34\x91"
+ "\x73\x77\x17\x09\x63\x94\x34\xad\x0c\xc6\x49\x7f\xc8\xa3\x5b\xc7"
+ "\x2a\x84\xad\xe3\x14\x78\x36\xdb\x7d\xfc\xf6\x73\x59\x3e\x53\xc8"
+ "\x74\x3c\x47\xb7\x0d\xec\x65\xfc\xbf\x2b\xed\xdc\x4e\xb0\x05\xc3"
+ "\x06\x3b\xbf\x85\x7b\x9d\x0e\xa7\xe3\xf8\xf6\x5c\x79\xaf\x5f\x8c"
+ "\x34\x9a\x88\xfe\xc5\x74\x77\xe0\x39\x8b\x73\xad\xe8\xeb\x1b\xc6"
+ "\xab\x15\x61\x77\xd0\x33\x38\xf6\x68\x21\xe7\xcf\xd2\xac\x2a\x8c"
+ "\x8d\x69\x01\x5b\xfd\xa6\xf3\xe4\x7c\x68\xef\xfe\x3c\x1a\x91\x2f"
+ "\xce\x11\xea\x78\xde\xb6\x67\x20\xaf\x0e\xe3\x90\x6e\x4a\xc6\xf8"
+ "\x9a\x6d\x0f\x83\xed\xfb\x23\xfc\x06\xfa\x4e\x2a\x86\x5f\xdc\x27"
+ "\xc3\xf7\x66\x9e\x5f\xc2\xec\xe5\x6d\xb7\xe6\xf3\xbd\x70\x6d\x33"
+ "\x25\xdc\xc1\x77\xc6\xc3\xbd\x9f\x68\xcf\x63\xfe\x09\xe7\xc9\x3f"
+ "\x3a\x9d\x9e\xab\xe0\xfe\x24\x94\x3d\x51\x7c\xee\x07\xf7\x07\xd1"
+ "\xce\x66\x7e\x3e\x72\x52\xc5\x3d\xc4\xff\x28\x81\xb4\x40\x31\xcf"
+ "\x44\xc8\xf3\x1a\xda\xee\x62\x19\x93\xe0\x7e\x0d\x8e\x81\xc5\xe7"
+ "\x41\x70\xbf\x18\xd7\x0e\xc4\xe7\x37\xc3\xfd\x6c\xb8\xbf\x8b\x9f"
+ "\x79\xe9\x11\xfb\xe8\x79\x9b\x77\x67\xc6\xcf\xb3\x98\x9a\xc8\x03"
+ "\x3e\x16\xf8\x87\xd3\xfe\x9f\xf3\xcd\x7d\x9e\x45\x3a\x3d\xab\x97"
+ "\x9e\xf1\x3d\x6a\xff\x48\x72\x7a\x56\xd1\xe7\x59\x9e\xd3\xb3\xfd"
+ "\x7d\xca\xdc\xef\xf4\xac\xb4\xcf\x7b\x75\x4e\xcf\x72\xfb\x3c\x6b"
+ "\x73\x7a\x96\x2a\x3e\xf3\xe9\x4a\x6b\x53\x38\xd6\xf0\xce\xeb\xc4"
+ "\x74\x39\xa4\x07\x3b\xa5\x47\x8a\xe9\xf0\xfd\xb6\x39\x26\x52\x60"
+ "\x16\xd3\x19\xef\x79\xf9\x6d\x8b\x9c\xca\x0f\xe5\x73\x1c\x6d\x91"
+ "\xbd\x7b\xe7\xc6\xd7\xe5\x0a\x3d\x11\xf9\xf0\x4c\x8d\xb8\x72\xc6"
+ "\xf6\xfa\x04\xcd\xf3\x2f\xbd\xa0\x89\x8b\x8e\xc7\xed\x2b\xeb\xd6"
+ "\xc4\x6b\xd6\x6d\x88\x8a\x76\xf1\xb3\x1e\x84\x3e\x07\x31\xa6\x1a"
+ "\xfa\x6e\x61\xf1\x0b\xde\xa4\xad\xbd\x31\x3f\x40\xae\xc2\xb7\xaa"
+ "\x4d\x64\x01\xfb\xd6\x4e\xee\x8f\xbc\x12\x7d\xbf\x70\x3f\x2f\xe4"
+ "\x89\x26\xd2\x76\x4c\xf4\xf3\x52\x0e\x79\xad\xee\xfd\xbc\x5c\xac"
+ "\x67\xfe\x0d\x21\x1f\xf7\xf3\x72\xb1\x01\xfa\xf9\xe3\x74\x3c\x8f"
+ "\xe1\xc1\x63\x9b\x5d\x90\x6c\x13\xf3\x8a\x2b\xcc\x47\x60\x2a\x9f"
+ "\xcb\xe8\xeb\xaf\xb5\xaa\x14\xdf\x13\xd7\x4b\x4b\x9d\xde\x8f\xe2"
+ "\xcf\x25\xfd\x20\x7e\x33\xb3\x0a\xcf\xb9\x8e\x6f\x82\x7b\x36\x7f"
+ "\xcf\x9e\x5d\xe0\x73\x79\x59\x55\x7b\xb1\x4d\xd8\x6e\xd7\xb6\xc9"
+ "\xff\xad\x89\x5c\x78\xc7\xd1\xb6\x0b\xf5\x4e\xbe\xe0\xc4\x36\x5c"
+ "\xb0\xf1\x3e\xda\xaf\xad\x6c\x7f\x22\x55\x56\xed\xc5\x6f\xa3\x3c"
+ "\x63\x75\xf5\x85\xfb\xac\xaa\x32\xa9\x3e\x4e\xf5\xdb\x8b\xe3\x7a"
+ "\xa8\xdf\x49\x4e\x13\x90\x1f\xc0\x53\xb1\x0d\xbb\x68\x5a\x5b\x12"
+ "\x8f\x65\x00\xfa\x04\x63\xb2\x30\x5d\x75\x31\x4a\x9a\xcb\x44\x1d"
+ "\xc5\xe7\x30\x2f\x3a\xec\x3f\xf4\xd1\x95\x25\xe9\xaf\x8b\x4e\xf6"
+ "\x1f\xff\x26\xa4\x95\x3a\x63\xc8\xe9\x7b\xc7\xf0\x7b\x90\x6f\x11"
+ "\x3f\x0f\x50\x55\x86\xfd\x1d\xee\x03\x71\x2f\x26\xbe\x8b\x75\x74"
+ "\x17\x87\xcf\x9d\x0f\x45\x07\x1d\xbf\x0b\x96\xe8\xb8\x93\x9d\x91"
+ "\xff\x2e\x44\x9a\xaf\x13\x63\x60\x94\xef\xec\x8d\x4b\xfd\x5d\x04"
+ "\x8b\xed\x96\x3d\xb9\xf2\x3e\x15\x89\xe4\xb4\xfd\x6e\x25\xca\x78"
+ "\xec\x33\x5c\xd6\x7f\x57\x2e\xf2\x3c\x92\xd7\xff\xbb\x2c\x4c\x77"
+ "\xec\xbf\xff\xce\x24\xe5\x93\xe4\x32\x5f\xaf\xfa\xee\x7d\x96\x8f"
+ "\xc7\x0a\x8e\xe1\x3c\xbf\x2b\xb0\x89\x7c\x57\x2d\xe6\x3f\xc7\xb0"
+ "\xc8\xfc\xf7\x7c\xd7\x4a\xb3\xea\x63\xa0\xae\x30\xfe\x69\x13\x63"
+ "\x56\xf0\xef\xc2\x6f\x35\xd6\x05\x69\x84\x67\xc9\xa9\x7e\x72\x25"
+ "\xf0\x67\xc0\xb3\x5a\xe2\xbe\xee\xdb\xce\x93\x4b\xdc\x86\x90\x53"
+ "\x2b\xce\xb1\xf2\xb6\x5e\x8a\x76\xda\xfb\xac\x92\xf2\x70\xd9\xcd"
+ "\x9e\xb1\x3d\xe5\xba\x04\x9c\x0f\x12\x9f\x25\xe0\xf9\xda\xde\xff"
+ "\xc7\x3a\xfd\x3f\x06\xff\x67\xfb\x9a\x37\x33\xdd\xaa\x70\x9c\xe3"
+ "\xbf\x14\x05\xf7\xaa\x3e\xf7\x41\x2e\xf7\xaf\xf0\x7d\xcf\x60\x9b"
+ "\x35\xb3\x3d\xe4\x62\xba\x58\xb6\x2f\xab\x4f\x02\x9d\x0b\xd8\x38"
+ "\x80\x67\xba\xc5\x7e\x78\x00\xcf\x6c\x07\xd8\x9e\x65\xe7\xb5\xe1"
+ "\xf9\x1c\xf1\x37\x54\xfc\x0d\xe1\x71\x5a\x2f\x05\x3b\x62\xad\xe3"
+ "\x1c\xcd\xa5\x10\x77\xb1\xdf\xf1\x3c\xb8\xf8\x1b\x2a\xfe\x86\x88"
+ "\xb1\x6a\x97\xc3\x7b\xbd\xe7\xbf\x07\xde\x83\x7c\x29\x5d\x3a\xcb"
+ "\x6d\xcf\xac\x5a\x2e\x64\x1e\x5b\x88\x71\x41\xd1\x4f\x58\x4a\x1b"
+ "\xfa\x8a\xb1\x10\x23\xe9\x26\xc6\xf8\xae\x54\x8c\x0d\x5a\xcb\x63"
+ "\x82\xe2\x19\x58\x19\xce\x9b\xa3\xed\x58\xab\xbb\xc0\xe2\x82\xbe"
+ "\xdc\x26\xc5\x3d\xb9\xd4\x6a\xcf\xaa\x5a\x2e\xf6\x97\x5d\x7c\x8f"
+ "\x7e\x3b\x9b\x2f\x66\x71\xad\xdb\xd8\xba\x97\xb2\x85\xb4\x27\x4a"
+ "\x79\x38\xed\xda\xd9\xdc\x57\x71\x9a\x14\xfb\xb1\x5d\x23\xc5\x9a"
+ "\x36\x91\xf6\xa4\x4e\xdf\xcf\x1b\x20\x6d\x8e\xeb\x9e\xe9\xf6\xc5"
+ "\x58\x26\xd6\xdd\x44\x2e\x99\xb1\x6c\xc8\x13\xd1\xdb\x67\x21\xfd"
+ "\x65\x1b\x99\x0a\xf5\x6a\x91\xca\x87\xe7\xd0\xff\xcd\x8c\x96\x58"
+ "\x66\x67\x96\x1d\xe8\xd0\x9e\x6d\x92\x17\x2e\xe2\x7b\xae\xdb\x41"
+ "\xff\xfd\xf7\xfc\xc1\x6c\x20\xe8\x0b\x79\xd0\x97\x4a\x84\xcc\xfa"
+ "\x5c\xe6\xcb\xdb\xb7\x3e\x8f\xcf\x31\xb6\x9f\xc5\xdd\xe1\x3b\x2e"
+ "\x13\x05\xee\x81\xe0\x98\xed\xe0\x3e\x90\x21\x0d\x64\x75\x19\xf4"
+ "\x11\x36\x57\x30\x3c\xbd\xdf\x6e\x61\x65\x4c\xe5\xbe\xcd\xf0\xec"
+ "\x52\x57\x5a\x47\x58\x6f\xfc\x84\xde\x7e\xdc\xb1\x06\xd7\x1e\xa0"
+ "\x7f\xb0\x3a\xf6\xad\x03\xd6\x17\xca\x6a\x76\x6b\x63\x2a\xeb\xd9"
+ "\xfa\x2c\xc8\x80\x48\xbe\x47\xb5\xe3\xcf\x3e\xea\x5b\x5b\xe1\x5b"
+ "\x7b\x7b\xe3\x46\x40\x9e\x1c\xdc\x7b\x0f\xe5\xf7\xb6\x33\x8e\x7d"
+ "\xa3\x9e\xf7\xf5\x8e\x56\x21\xab\x3e\x77\x47\x37\x51\x88\xe9\xad"
+ "\xb5\x36\x2b\xc6\x1e\x18\xd0\xcf\x16\x8b\x9d\x87\x7b\xc2\xb7\xd7"
+ "\xe7\xe2\xb9\xa1\xfb\xac\x52\x9d\x2d\xad\x78\x5e\x05\xeb\xcc\x69"
+ "\x6b\x39\x2d\xd1\x51\xdf\x0e\x65\x27\x9f\x22\xcd\xc4\x12\x8d\xfb"
+ "\xe6\x18\x4d\x36\x4b\x7b\x39\x2d\x6c\xcc\xc7\xbe\xcf\xf3\xb0\xb1"
+ "\x3f\x8b\x63\x04\xe5\x17\xb1\x58\x6c\xd0\x06\xe0\x45\x79\x32\x9e"
+ "\xf9\xb7\xb0\xb8\x00\xdb\x98\xaf\x0e\x68\x37\xdb\x27\xdb\x29\xae"
+ "\x93\x58\x4a\x25\x5d\x61\x12\xd3\x76\xe0\xb7\x13\xba\xc9\x45\x62"
+ "\x79\x0d\x63\xac\x03\x3d\x4a\xd0\x3f\x5d\xad\x05\xfa\x49\x62\x37"
+ "\x62\xa1\x04\x63\x77\x9a\x88\x25\x9d\xeb\x37\xa4\xb9\x25\x06\xbf"
+ "\x8f\xb4\x85\xb1\x99\x19\x68\x7a\xb9\x2b\xad\xb3\x37\xfe\x63\xce"
+ "\x2d\x38\xde\xb1\x0c\xea\x5f\xd7\x0e\x75\xae\xcd\x03\xdd\x39\xf5"
+ "\x14\xd6\xef\xa8\x30\xbe\x3e\x17\xf7\x64\xc3\xff\xeb\x44\xd9\xce"
+ "\x78\xc7\x71\xd0\xf9\x96\x8f\x3a\xf8\xf6\x5a\x8e\x05\xe6\x43\x0d"
+ "\xd2\x16\x8a\xf4\x63\xf1\x24\x72\x13\x38\x1d\xc4\xfc\x36\x3e\x5f"
+ "\x1c\x7c\x17\xd4\xcb\x29\xfe\x5d\x27\xd3\xdd\xe8\xfb\xbe\x88\x8d"
+ "\x09\x3b\xf7\x3b\xd5\xd9\xc2\xce\xbf\xb6\xe3\x5c\x5f\xe7\x72\xfc"
+ "\x96\x1e\xfd\x87\x21\x2e\xce\x3b\xe3\xbf\xf3\x61\xac\x27\xee\xf9"
+ "\xb5\xfb\xd6\x45\x82\xbe\x8d\x42\x3a\xc3\x3b\xf1\xd0\x17\x72\x07"
+ "\xd1\x85\x2c\xee\x5e\x57\xda\x65\xad\xa4\x0b\x61\x7c\x01\x7a\xa1"
+ "\xeb\x76\x36\xee\x04\x7b\xda\x28\xa0\x3d\xd3\xa5\x41\xdc\x40\x5f"
+ "\x2f\x11\x65\x6c\x09\xbc\xb3\x5c\x5a\xf3\xb2\xe3\xb9\x89\x8b\x6c"
+ "\xbd\xd7\x22\xc5\x93\xe3\xfe\xfa\x2e\xa7\x3a\xce\x59\x5c\xce\xee"
+ "\x77\xce\x02\xcf\xfe\xbc\xc9\xe2\x8e\xed\x45\x9d\x52\xd3\xd6\x8c"
+ "\x3a\x82\xbd\x8f\x67\x2f\x92\x61\x4c\xce\xcf\x0f\x35\xe3\xfc\x3c"
+ "\x8b\x79\x82\x75\xe1\xb1\x27\x9a\xd8\xff\x80\x5b\x05\xfe\x72\x2c"
+ "\x5d\x36\xf7\xc6\x4c\x07\x7e\xe3\x5a\xdb\x61\xc5\x2f\x48\xf9\x1d"
+ "\xa8\xaf\xbb\x6e\xc7\xf8\xdf\x5d\x69\x5d\x41\x52\xec\x6f\x16\xeb"
+ "\x9b\xb7\x67\xa7\x5b\xbf\x8c\xf7\x92\x50\xf4\x17\x80\xe7\xeb\x18"
+ "\x0d\x54\x93\x63\xd0\xd7\x33\xfa\xad\x2c\xdf\x8c\x31\x59\xba\x8e"
+ "\xfd\xee\x16\x76\x46\xd9\x52\x7e\x6f\x3b\xee\xc3\x6a\x6b\x49\x62"
+ "\xfe\x98\x94\xe1\x89\x36\x8a\xef\x31\x7b\xc2\x6f\x32\x9e\x37\x6e"
+ "\x63\xb1\x0e\xb0\x4c\xaf\xfd\x16\x77\x19\x44\xdb\xb4\x0d\xc6\x3e"
+ "\x93\x81\x57\xcc\x76\x87\xff\x6f\x39\x4f\xac\x57\x78\x0c\x5a\xee"
+ "\x7b\x5f\xdc\x8f\x3d\x96\xfb\xd8\x00\x9a\x31\x9f\x07\xd6\x75\x9a"
+ "\x7b\x30\x5e\xb3\x75\x23\xf3\x83\x9d\x59\xb5\x4f\xa4\xc1\xbe\x1d"
+ "\xbc\x5e\x01\x2b\x12\xe5\xac\x8e\x58\xbf\xe1\xd5\xcd\x3a\x57\x1c"
+ "\x47\x8c\xed\x4a\xb3\x26\x49\xbe\x39\xb8\x3d\xc5\xfd\x63\x73\x5e"
+ "\x58\xcf\x89\xf6\xf3\x7e\xf1\xdb\xfb\x47\xe1\xdb\xfb\xc5\x32\x33"
+ "\xb9\x8f\xf0\x2e\xe8\x07\x55\x60\x9f\x5e\x51\x48\xe3\x19\xf1\x0c"
+ "\x51\x08\x1f\x67\x5d\x09\x76\x8c\x67\x38\x0d\x5d\xce\xdd\x6d\xd8"
+ "\x10\xaf\x89\x5a\xb3\x49\xb7\x32\x7e\x55\x8c\x26\x3a\x2e\x6e\x43"
+ "\x9c\x06\x9d\x34\x39\xf7\x1f\x1e\xc7\xe8\x4a\xa8\x18\x9f\xb0\xcc"
+ "\x11\x9f\xf0\x4a\xa2\x73\x4c\x4f\x13\xb9\x92\x34\x3a\x73\x17\x57"
+ "\xf2\xdc\x95\x93\x2b\x17\xf6\xc1\x75\x00\xae\x72\xb8\x2a\x71\x2e"
+ "\x63\x85\x95\x84\x81\xae\x67\xfb\x4c\x1c\x3e\x27\xae\xa0\x5f\xf2"
+ "\xb0\x26\x72\xa5\xb3\x48\x50\xe0\x38\x08\xe3\x86\xef\xc3\xfc\xc5"
+ "\xf0\x3e\x5c\xe5\x70\x55\xc2\xc5\xde\x13\x3e\x66\xe7\xe5\xf7\x39"
+ "\x3f\xe3\xfb\x47\xb6\xee\xc5\x3c\x74\x2b\x2e\xd9\x43\xbe\x7f\xe7"
+ "\xf9\xfa\xd4\x41\x4e\xd3\xda\xa5\x7c\x6c\x6d\xdf\x7f\x2b\xd1\x0c"
+ "\x90\xcf\x87\xa6\x9d\x2b\x13\xf3\xb1\xbd\x36\x52\x7b\x30\xd6\x00"
+ "\xe4\x97\xf2\x29\x68\x5a\xd7\x1c\x31\x1f\xd3\x15\x42\x9a\x7c\xa0"
+ "\xef\x8e\xa1\x69\x07\x82\xc5\x7c\x81\xce\xe5\x39\xe5\x19\x2b\xa4"
+ "\x9d\x29\xc5\x3c\xc2\x56\x45\x10\xb7\x9d\xae\xe4\x41\xfe\x01\xfd"
+ "\xaf\x0c\x8f\x4f\x3d\x61\x7d\xf9\xa4\x5b\xb5\x26\xfa\xa7\x6b\xd6"
+ "\x27\x60\xa4\xa9\xf8\x0d\x2f\xc5\xe3\xef\xfa\x95\x2f\xb2\x9f\x0d"
+ "\x2b\x56\xaf\xe2\xff\xc4\xc7\x86\xe2\x3f\xb1\x80\x37\xfc\x8d\x7a"
+ "\x49\x87\x3f\xab\x36\xe0\x6d\x62\x4c\xc8\x4b\xab\xf0\xa7\xef\x39"
+ "\x50\x6d\x57\x5a\x4f\x2b\x60\xa3\x81\xcb\xd9\x1e\x18\x23\x9d\x63"
+ "\xd8\xc3\x78\x4a\x47\xb4\x36\x22\xcd\x6b\xb9\xfa\x1c\xb1\xc9\xd0"
+ "\xe7\x48\xc0\x56\xdd\xaa\x00\xdb\x9a\x68\xd0\x19\x3b\xbb\xd2\x6c"
+ "\xa1\x26\xb2\x96\x88\xb2\xb1\x9c\xf9\x39\x4d\xeb\x49\x15\xf7\x76"
+ "\x2a\x84\xcc\xaa\x78\xf4\xdf\x0f\xf7\x2c\xce\x36\xdc\x97\xc0\xfd"
+ "\x07\x70\x8f\xf1\xb5\x83\xe0\x3e\x09\xe7\xa4\xe0\x5e\x0d\xf7\xc1"
+ "\x42\xe6\xc1\x4c\x3c\x63\x0c\xf7\x1a\xb8\x9f\x01\xe5\xe7\x4a\xfd"
+ "\x62\x60\x5b\xd9\xb6\x4f\x8a\xfd\xcd\xe3\x7c\xdb\xca\x7b\xe3\x7c"
+ "\x63\x3c\xa7\xe4\xc0\xe5\x4c\xff\x32\x1b\xc4\xd6\xec\xa3\x9e\x96"
+ "\x00\x79\x9a\x25\x7d\xc9\xe7\x3b\x6c\x16\xc9\x7f\x0a\x9f\xcf\xb0"
+ "\x2b\x9c\xe2\xa5\xe3\x7d\x90\x14\x2f\x1d\xe7\xbb\x58\xbc\x46\xf8"
+ "\xa5\x69\xe8\x4f\x96\x96\x0d\x38\x97\xc7\xe2\x7c\xda\x5f\x41\xdf"
+ "\xbc\xe6\x94\x28\xd9\x9d\x45\x38\x87\x06\xf7\xdc\xb7\x24\xbd\x48"
+ "\xec\x2c\x3e\x94\xe4\x77\xce\xd9\x97\xc4\x80\xe7\xa1\x8e\x83\xcd"
+ "\xc0\xe2\x5d\xc5\x6e\x08\xb0\xad\x8c\xe6\x76\xa0\xfd\x24\x97\x5f"
+ "\x75\xe9\xdc\x5e\xb0\x57\xd0\xa7\x79\x4c\x14\x13\x11\x16\x72\xdf"
+ "\x53\xb1\x1b\x28\xbc\x1b\x90\xb8\x32\x9a\xa5\x41\xbe\x6d\x60\xab"
+ "\x89\xf5\x7b\xdb\x18\x8c\x67\x5c\x05\xd1\x47\x86\xbd\xec\xb9\x69"
+ "\xa9\xf8\x1d\x25\xb3\x43\x8e\x13\x15\xc6\xdb\xc4\xba\x15\x39\xf9"
+ "\xc5\xdb\x01\x69\xb8\x87\xb4\xe3\x69\xa2\x42\x3f\xc0\x62\x5d\xca"
+ "\x78\xfc\x30\x21\x4c\xf2\x35\x65\x82\xb4\xbe\xed\x79\xfa\x5f\x19"
+ "\x2a\x67\xae\x0a\x59\xb2\x00\xfe\x0b\x11\x43\x56\x3b\x63\x33\xb8"
+ "\x63\xfc\xf1\xc8\x8e\xff\x4a\xf8\x6f\x1e\x97\x54\x00\x3b\xcd\xce"
+ "\xc6\x42\x02\x8e\x81\xbb\x22\xf2\xf8\x1e\x54\xe1\x28\xfa\xdd\x15"
+ "\xd2\xd0\x9e\xc4\x73\xd3\xc2\x01\xc4\x2c\x55\xd6\x65\x16\x6f\x41"
+ "\x1f\xcf\x32\xa0\xb1\xf0\x0e\x3e\x13\x7d\x78\xc9\x99\x8f\x2b\x3b"
+ "\x51\xb3\x33\xc2\x60\xa3\xe0\x19\xd4\x16\x99\xac\x06\xed\x0e\x9c"
+ "\x4f\x12\xd2\x84\xa5\x88\x5b\xe0\x31\xfa\x10\xb1\xd0\xf1\x55\x91"
+ "\xd4\xf7\x58\x08\xe2\x18\x6d\x5d\x63\x20\xd2\x8c\xa2\xcf\x80\xc7"
+ "\xe1\xfa\x37\x1e\x7b\x66\x59\xab\x54\x26\xdc\xab\xc0\x86\xda\x09"
+ "\xbf\x81\x5d\x69\x74\xa1\x53\x4c\x3e\xf1\x4c\x34\x5d\x83\xbe\xdf"
+ "\xb0\x6c\x66\x3b\xcb\x64\xef\x73\x1b\x84\xc6\x9b\x48\xe0\x1c\xde"
+ "\x17\x31\xd6\xe8\xf6\x4c\xf1\x7f\xb0\x7f\xee\x37\xf7\x29\xe3\x84"
+ "\x34\x57\xca\x31\x0d\x3a\x4f\x4e\x1e\x87\xeb\xdf\x20\xff\x07\x26"
+ "\xf2\x20\xcb\xbf\x4d\xce\xce\x49\xb6\xf8\xa8\xf1\xbc\x3b\xad\x97"
+ "\xd2\xc7\xc8\xc2\x80\xa6\x18\xd3\x8d\xf7\xfd\x8e\xf1\x75\xb1\x70"
+ "\x6f\x91\xe6\x58\xd8\x9c\x4b\x06\xee\xeb\xea\xbd\x4f\x84\xfb\x20"
+ "\xe9\x1e\xfe\xd7\x48\xb2\x02\xe7\x24\x3a\x52\x22\x76\xe1\xb8\x73"
+ "\x95\x1a\xec\x42\xb0\x6f\xe0\x39\xf0\x7f\xfb\x42\xfe\x6e\x8f\xa6"
+ "\x23\x4d\xaf\xb3\xf8\xdf\x14\x69\x01\xf9\x07\xcf\xc0\xfe\x8b\x6d"
+ "\x14\xcb\x89\x31\xc9\x8b\x7a\xdb\x26\xa4\xf9\x04\x08\x59\xc7\x16"
+ "\xb2\x36\xca\x64\xa5\xf0\xff\x22\xb3\x6f\x95\x06\xf2\x01\xff\x6d"
+ "\x06\x96\x2f\xe1\x42\x49\x76\x77\xe0\x52\x23\x58\xf0\xe5\xab\xbb"
+ "\x91\x7e\x6c\x4f\xb6\x7e\x73\x20\xf3\x5d\x8b\x7e\x40\x58\x4c\x34"
+ "\xf4\x6f\x69\x23\x63\x59\x4c\x81\x2c\x9b\x9a\xf9\xd2\x7f\x59\xab"
+ "\x92\x7c\x5b\x82\xbc\x09\xa2\xf2\x0d\x16\xf4\x77\xc9\x62\x87\x74"
+ "\x69\xfd\x99\x8f\x4b\xd1\xb7\x65\x61\x02\x09\x32\x08\xdc\xb7\x25"
+ "\xf3\x11\x32\x16\xc6\x29\x09\x03\xfb\xb7\xa4\x69\x7b\x17\x4a\xfe"
+ "\x2d\xe9\x65\xbb\x15\xfe\x9f\x01\xf4\xc0\xf8\xef\x5a\x76\xef\xf0"
+ "\x37\xa5\x18\xd0\xdf\xa5\x9c\xb0\x98\x25\xe8\xef\x72\x58\xfa\x42"
+ "\x26\x63\xf3\xb2\x5d\x19\x32\x90\x7f\xaf\xb2\xb8\x80\x4e\x69\x15"
+ "\xd0\x12\xd1\xbf\x01\x8d\x11\xd3\x1a\x4c\x24\xcb\x20\x8e\x4b\xcd"
+ "\x38\xc6\xdf\xc9\xe6\xc6\x84\x36\xda\x13\xb3\x6b\x20\x99\xd3\xee"
+ "\x3f\xc5\xd4\x8e\xfe\x29\x32\xe4\x6a\x93\x4c\x9e\x84\xef\xb2\xb1"
+ "\xa4\x4c\xae\xee\xdb\xaf\x9f\x5f\xb5\x21\x2a\x7a\xc5\xda\x75\x3a"
+ "\xcd\xd3\x4b\x1f\x67\x81\x12\x43\x34\x6b\xe2\xa3\x99\x4a\xd2\x3c"
+ "\xbd\xe0\xb1\xf0\xf0\xa5\x2b\xfe\x75\xe9\xa3\x4b\x9f\xf9\xd7\x87"
+ "\xf9\x89\xc5\xa5\x71\xaf\x60\xb0\xcd\xf8\x0d\x1a\x7c\xe9\x79\x31"
+ "\x9a\xf8\xe6\xe8\xb8\x0d\x7d\xe5\x41\x10\x9b\xe7\x92\xb3\x39\x5d"
+ "\x0b\xfe\xcf\xe6\xd2\x64\xf2\xfd\xd2\x1c\x17\x93\x7d\x32\xf9\x1e"
+ "\xa4\x2d\x8b\x35\x9e\x21\xc7\x3e\x4b\xc4\x38\xef\xa8\x77\x14\xd8"
+ "\xa7\x51\xff\x40\x5b\x4c\xce\xbe\xb9\xf8\xbb\x3e\x0a\x39\xbe\x27"
+ "\xf6\x65\x31\x6d\x0a\x9d\x3a\x35\x85\xf9\xd7\xca\xf0\x09\x92\xe6"
+ "\xbd\x31\x4d\xaa\x43\x13\xe6\xc9\x90\x3f\xdb\x1b\x4f\x38\xc3\x67"
+ "\x9e\x23\x0e\x25\xfb\x73\xa1\x11\x21\x68\xce\x8c\x01\x5b\x65\x2c"
+ "\x5c\xe3\xf0\x5a\xd8\x2b\xdf\x13\x68\x03\x8e\xd9\x02\x64\xa0\x83"
+ "\x13\x7d\x78\x1c\xab\x8c\x7a\x16\x7b\x21\xdc\x6e\xf3\x59\x61\x97"
+ "\xc3\xaf\x0f\x5d\x61\x57\xb0\x71\x22\x4d\xa0\xf5\xec\xac\x7d\x02"
+ "\xad\xc3\x78\x6d\x80\xe3\xcc\x70\x5b\x72\x66\xb8\x9d\xda\x56\x80"
+ "\xfd\x0e\xbf\xdf\xe2\x99\xf1\x70\xfb\xb7\x94\xc5\xac\xc1\xb3\xf5"
+ "\xdc\xcf\x60\x25\xee\xa1\x7c\x0e\x30\x5c\xd4\xce\x63\x12\x87\xbf"
+ "\xf2\xdd\x99\x15\xaf\x98\x78\x4c\xe2\x8b\x3c\x8e\x37\x8f\x75\x4e"
+ "\x92\xa1\x9c\xa3\x2b\xec\x3e\x9a\x70\x7b\x0f\x65\xe7\x5e\x33\x14"
+ "\x9a\xc1\xe2\x0c\xa3\x8c\xdd\x34\x85\xc8\xf1\x1c\x9d\xbd\x68\xb5"
+ "\x06\x7d\x0a\xa6\x98\xa9\x15\x7d\xd3\x7c\xd4\xdd\x20\xd7\x24\x28"
+ "\x80\x6e\x8a\x05\xb5\xba\xd0\x81\xcf\x3d\x67\x7c\x95\x4a\xf5\xf9"
+ "\xfb\x69\xc6\xd7\x4b\xa8\xbe\x60\x0e\xcd\x3c\x86\x73\xa3\x32\x9a"
+ "\xd1\xac\x81\x7b\x48\x6f\x31\x53\xbd\x61\x0e\xcd\x38\x57\x0e\xbf"
+ "\x70\xdf\x96\x4b\xf5\x85\x70\xff\x49\x04\xbc\xb7\x8f\x66\x54\xe2"
+ "\x7b\xa1\x34\xe3\xe8\x42\xf8\x85\xfb\xaa\x30\xc8\x07\xf7\x9f\xce"
+ "\x85\x5f\xb8\xaf\x0e\x6d\x91\x8d\x09\x84\x77\x20\xed\xbb\x48\xfe"
+ "\xad\xf6\x48\xf6\xad\x8c\xce\x48\xfe\x0d\x6b\x24\xff\x46\x4f\x24"
+ "\xff\x86\x10\xc9\xbf\x51\xa3\x85\xfc\x07\x68\x46\x6d\x1e\xe4\x9b"
+ "\x4b\x33\xea\x94\xf0\x0b\xf7\xc7\x12\x21\x1f\xdc\x1f\x6f\x85\x5f"
+ "\xb8\xaf\x87\xba\x14\xc2\xfd\x89\x4a\xc8\xff\x01\xcd\xf8\x62\x1e"
+ "\xe4\x9b\x47\x33\x1a\xf6\xc1\x2f\xdc\x9f\x9a\x01\xf9\xe0\xfe\x4b"
+ "\x28\xc7\x00\xf7\xa7\x55\x90\x7f\x1e\xdd\x2e\xc3\xfa\x94\xd3\xed"
+ "\x3e\x58\x6e\x18\xdd\xae\xc0\xfc\x70\x3f\x16\xca\x33\xc0\x3d\x8c"
+ "\xaf\xf5\x06\xb8\xf7\x2d\x83\xfc\x70\x3f\x01\xda\x9a\x5f\x41\xb7"
+ "\xab\x6c\x90\x6f\x3e\xdd\xee\x0f\xe9\x05\x70\x1f\xb8\x14\xf2\xc1"
+ "\xfd\x24\xcc\x0f\xf7\x37\xed\x85\xfc\x70\x7f\x33\xd2\xa8\x92\x6e"
+ "\x9f\x7c\x00\xf2\x2d\xa4\xdb\xa7\xaa\xe1\x17\xee\x83\xb1\xfe\x70"
+ "\x3f\xbd\x01\x7e\xe1\xfe\x76\xa0\x55\x21\xdc\xdf\x09\xf5\xcb\xaf"
+ "\xa6\xdb\x67\x62\xf9\x8b\xe8\x76\x2d\xd2\x07\xee\xef\xa9\x80\x7c"
+ "\x70\x3f\x0b\xe8\x61\x80\xfb\xfb\xb2\x21\xff\xa2\x01\xf9\xb9\xfd"
+ "\xfe\x28\xba\x75\x2c\xa1\xdb\x7f\x6a\xa1\x5b\xc7\xc1\xef\xbc\x52"
+ "\xba\x75\x8c\x96\x6e\x0f\x53\x40\x3a\xfc\x3e\x9c\x04\xf7\x21\xe2"
+ "\x3d\xfc\xfe\x7c\x29\xdc\x87\x8a\xf7\xf0\xfb\x48\x08\xdc\xcf\x11"
+ "\xef\xe1\xf7\xd1\xfd\x70\x3f\x97\x6e\x7f\x2c\x1b\xee\xf1\x57\x03"
+ "\xf7\xf3\xc4\x7b\xf8\x9d\xbf\x04\x7e\x6d\xe6\x69\xd1\x89\x66\xbf"
+ "\xb5\xa1\x66\xbf\xa2\x12\xc4\xa4\x3d\x27\x7f\x9f\xe0\x5f\x10\x0a"
+ "\x7a\x77\x6c\x4a\x27\x19\xd7\x22\x1b\x77\x1a\x65\x8a\x31\xc9\xc4"
+ "\x62\x01\x8a\x3e\x2e\xc7\x36\xc9\xc6\x9e\x04\x1b\x09\xe3\x39\xc8"
+ "\xa1\xed\x6d\x34\x6d\x4c\x3b\xb4\x39\x96\xa6\x4d\x68\x82\x5f\xb8"
+ "\x9f\x78\x1c\xda\x0c\xf7\x0f\x6e\x87\x5f\xb8\x5f\xf6\x18\xb4\x3d"
+ "\xb6\x2b\x63\xdc\x5c\x93\x4c\x11\xcb\x64\xc4\x7f\x25\x94\x04\xd8"
+ "\x52\x68\xb8\x0d\x74\xc7\xae\x3d\x91\x01\xb6\x48\xe0\x43\x71\x58"
+ "\x00\xc6\xec\x28\x8c\x3e\x40\xfd\xd7\xb2\x3a\x61\x5c\x1e\xda\x33"
+ "\x43\xce\xbf\x3d\x81\x36\xc9\xc6\x45\x63\xfc\x08\xea\x9f\xe6\xee"
+ "\xf9\x6b\xec\xf9\xd4\x3d\x3a\xfe\x1c\xf0\xd0\xfb\x7c\x19\x3e\xdf"
+ "\x13\x80\x7e\xd8\xa7\x3f\xcb\x9e\x1b\x2d\xad\x62\xbb\x7c\xf0\xd9"
+ "\x21\xcc\x6b\x92\x8d\x6b\xe6\x32\x7c\x6c\x2b\x4d\xf3\x21\x1d\xca"
+ "\x63\x4b\xa0\xee\x16\xa8\x7b\x88\x68\xc3\xc7\x53\x65\x55\x22\xf7"
+ "\x71\x52\x7f\xc0\xdd\x3c\x90\x90\xbd\x3b\x4f\x0f\x72\x10\xc7\xc5"
+ "\xa0\x0f\xe5\x9a\xe4\x19\x07\x9a\x64\xbe\xe5\x85\x6c\xbe\x63\xcf"
+ "\x5c\x2e\x1f\x95\xaf\xf5\x6c\x3f\x96\xae\xd9\x1c\x00\xdf\xf7\x3d"
+ "\x94\x62\xa5\x9d\xe5\xc9\x8f\x81\x6c\x65\xe9\xe5\xec\x0c\x11\xff"
+ "\x9f\xad\x21\x89\xff\xe7\xb1\x79\x68\x28\x0b\xdf\x75\x1e\x87\xd8"
+ "\x33\x66\x2f\x11\xfc\xf7\x84\xb1\xb5\x75\x99\x32\xeb\xa0\x60\x92"
+ "\x07\xc4\x93\x31\x9a\xcd\x1f\x41\xf9\x4a\xd7\x31\x6b\x6f\x5e\xf6"
+ "\xec\x2f\x1f\x42\xde\x02\x9c\x5f\xca\x50\xf6\xc6\x3f\xa6\xd0\x86"
+ "\xd7\x51\x17\xca\x49\x18\xea\x67\x66\x03\xcb\x7c\x23\xf1\xb4\x93"
+ "\x4d\x55\xac\xb1\x65\xaf\xd5\xd8\xb3\xf7\xcc\xa5\x39\x7b\xc2\xfc"
+ "\x6d\x32\xee\x1b\x58\xe6\xfb\xfb\xfb\xac\x68\x73\x56\x61\xde\xc5"
+ "\xc2\xd8\x9f\x05\xde\x9b\x48\xe4\xe5\x71\xa7\xf0\x5e\x4f\x33\xc2"
+ "\xca\x8c\x6d\x0d\xa4\x3c\x8e\x95\x95\x4d\x33\x16\x45\x08\x63\x7f"
+ "\xb1\xb4\x08\x6d\xf7\x44\x9c\x7b\x3b\x8e\xe9\x13\x81\x2f\xa0\x57"
+ "\x7c\x63\xa5\xba\xa0\x4e\xd1\x03\xed\xd0\xae\x46\x7f\x18\x2b\xec"
+ "\x76\xf4\x2f\x97\x69\x02\x3a\x70\x7e\xf9\x2e\xc1\x38\xef\xe2\x77"
+ "\xf7\x08\xe3\x8f\xe9\x6a\x97\xe3\x3a\xa2\x12\xfd\x75\x75\xb2\x33"
+ "\xf4\x18\xfd\x58\x40\x3b\x80\xe7\x75\xe6\xdd\xba\x55\xba\x15\x9b"
+ "\x75\x1b\xe2\xe2\x57\xbc\xa4\xfb\xa9\x06\x06\x93\x9a\x0d\xab\x35"
+ "\xeb\xa2\xd7\x6d\x88\x7b\xa5\x9f\x8f\xa0\xae\x8c\xf1\x0a\x93\x4c"
+ "\xc9\xe6\xc4\x8e\x82\x4d\xcf\xe6\xf4\x65\x13\xea\x91\xd7\xbb\xde"
+ "\xe4\x31\x38\x20\x8f\x16\xc6\x7d\x7b\x99\x5d\x9e\xb7\x27\x82\x1a"
+ "\xa2\x0f\x64\xa1\x1f\x90\x97\x30\xc6\x83\x99\x18\x49\x3b\x8f\xcb"
+ "\xcb\x62\xee\xc1\x18\x23\x61\x0b\x2d\x4f\x68\xc7\x7e\x00\xb2\xa5"
+ "\x68\x21\x2d\x5c\x4d\xae\xe8\xd7\xe6\x35\xc9\x26\x1c\xb8\xa2\x2f"
+ "\x9a\x2b\xc5\x4c\xb2\x67\x17\xe5\x09\xaa\xdd\xfb\x30\x66\x52\x0f"
+ "\x55\x93\x1a\xa0\x65\x77\xe6\xb1\xe5\xa0\x07\x22\x0a\xd3\xe8\x01"
+ "\x3b\x8c\xb9\x98\x0f\x9b\xff\x4a\x48\xb5\x53\xad\xc2\x9e\x46\x94"
+ "\xf0\xeb\x4f\xfd\x4b\x4d\x3d\xaa\xe2\x50\x7c\x8e\xb1\x92\xec\x3d"
+ "\x5a\x92\x5c\x4f\x85\xdf\xc6\x00\x6e\xd2\xc0\x68\xc7\xd8\xb0\x31"
+ "\x17\x08\xa4\x8f\x17\x72\x8a\xca\x5b\x16\x12\x39\xe6\x05\x7b\x8f"
+ "\x2c\x87\xff\x93\x56\x12\x3f\xc8\x17\x90\x74\x14\xd2\xbb\xb4\xe3"
+ "\x6d\x29\x5a\x65\x77\x8a\x76\x7c\x0f\xd5\xaa\x8c\xcd\x56\xd2\x33"
+ "\x33\x21\x77\x96\x99\x28\x76\x81\x5d\x58\x28\x40\x1f\x34\x44\x97"
+ "\xd8\x5f\xd5\x8e\xb5\xbd\xaa\x55\xf4\xf4\x68\x95\xb6\x97\xb5\x8a"
+ "\xee\x97\xb5\x63\x7b\xba\xb4\x4a\x63\x94\x99\x54\x99\xff\x40\x6a"
+ "\x9b\x5b\xd9\xbc\x6f\x8f\x5f\x69\x5b\x8f\x5f\x51\xb5\xaa\x99\x04"
+ "\xdd\xab\x03\xbb\x10\xec\xe5\x7c\x18\x2b\x00\x26\x54\xb6\x3d\x09"
+ "\xa0\xef\x4a\x73\x81\xbe\x85\x0b\xee\xa6\xdf\xd9\x33\x02\x63\x34"
+ "\x4f\x80\xbc\xda\xaa\x50\x43\x1a\xe0\x27\xb8\x81\x66\x4c\x01\x19"
+ "\xa7\x08\x86\x4b\x63\xe2\x7c\x20\x34\x23\x00\xef\xd5\x98\x97\xe7"
+ "\xbb\x39\xd6\xc4\x7e\x27\x7e\xc0\x62\xb8\x66\xf8\x56\x17\x32\x9b"
+ "\x64\x42\x9d\x64\x93\x54\x28\x06\xf6\x35\x02\x79\x2c\xbd\x63\x78"
+ "\x01\x64\x8e\x3e\x7f\x40\xdf\x38\xdc\xff\x0f\x7c\x3b\x27\xbf\x2e"
+ "\x57\xe8\xf5\xff\x0c\x32\x53\x35\x0d\xfa\x4f\x2a\x7b\x96\x5d\x1c"
+ "\x96\x7c\x89\xf8\xe0\xb3\x7d\x97\xad\x72\xbc\xd7\xc4\xc9\xa8\xd1"
+ "\x62\x25\xb9\xb8\xfe\x11\x1c\x7d\x60\xdf\x65\xb3\x1c\xf1\x52\x0b"
+ "\x69\xf0\xee\x03\xb9\x97\xc5\x72\xf3\xf6\x44\xa6\x6c\x24\x2c\x0e"
+ "\x0a\xc6\x52\x42\x1c\xe5\x26\xc3\x18\x14\xe3\x3e\xc5\xa1\x0c\x53"
+ "\x6d\x84\xff\x95\x98\x8f\xaa\x8a\xc3\x04\x28\x03\xb0\x54\x46\xfd"
+ "\x8a\xb5\x82\xbe\x68\x1f\xc8\x56\x1d\x9d\xb6\x5a\x2d\xec\xda\xb3"
+ "\xb0\x2b\x43\x55\x09\xf4\x30\x49\x73\x1a\xb5\x65\x36\x82\xfe\xbb"
+ "\xe8\x63\x36\x72\x24\xbe\x13\x7d\xfc\xfa\x98\x7d\x8f\x45\x9a\xfd"
+ "\x76\xe7\x99\xfd\x4a\x73\x05\xfd\x6e\x13\x5c\xcd\xba\x38\xa2\x3a"
+ "\x2f\xf3\xcb\xee\xf5\x3f\x7b\xe9\x3a\xf1\x3f\x0b\x76\x1e\xb3\xf7"
+ "\x00\x3b\x68\xbf\x09\xfa\x62\x16\xcf\x04\xed\x3a\x94\xb9\x5d\x19"
+ "\x7e\x07\x24\xbb\x0c\xe5\x88\x3d\xeb\x58\x2c\x5c\x31\x90\x5e\x67"
+ "\x92\x69\xac\x92\x8c\x01\xdd\xb3\x44\xd8\xfe\xa4\xba\x0b\xcf\x58"
+ "\xf5\xc4\x3c\x82\x79\x81\x6e\xa9\xf0\x2d\x1f\x7b\x4f\xcc\x3c\xb8"
+ "\x1e\x86\xeb\xe7\x76\x7d\xb1\xc6\xae\x2f\x0a\xb3\xeb\x4b\x75\x76"
+ "\xfd\xda\xa5\x70\x45\xc0\xb5\x1c\xae\x48\xb8\xa2\xe0\x8a\xa1\xfa"
+ "\xb5\xb1\xf0\x8b\xcf\xe3\xe1\x4a\x84\x2b\x09\xae\x54\xb8\xd2\xed"
+ "\xbb\xf6\x2c\x11\x00\x9f\x70\x69\xe0\x0a\xb6\xeb\x77\x37\xc0\x35"
+ "\xe0\x5c\x09\xcd\xec\xe1\xb1\x1b\xc6\x9c\xa1\x01\x18\xdb\x37\xa9"
+ "\x13\xfd\x49\xaa\x8f\x68\x2d\xc3\xf3\x61\x2f\xf3\x4f\x77\x37\x7f"
+ "\x82\xe5\x43\xff\xea\x19\x66\x79\xee\xfd\x1c\xaa\xf7\x44\xd8\x82"
+ "\x57\x33\x7f\xea\xd0\xa7\x65\xb5\x91\xcd\x24\xdc\x4c\x52\xaa\x9b"
+ "\xbb\x49\x4a\x14\xb5\xb3\xb1\x79\x12\x9e\x6d\xd9\x60\x41\x1c\xdb"
+ "\x69\x84\xa6\x27\xbb\x68\xa1\x5d\xb5\x5b\x47\x55\xbb\xcb\x98\xcf"
+ "\x4a\x90\x3f\x18\x2b\xad\x77\x5c\x8a\xb8\x82\xb1\x69\x4d\x5b\x27"
+ "\x79\x35\x8a\x0a\x35\x31\x60\x9b\x34\x00\xc0\x64\xe4\x2d\xc4\x98"
+ "\x34\x36\xfd\x75\x23\x4d\x05\xbc\xf8\xda\x81\x6e\x02\x8e\x49\x01"
+ "\x5b\x38\x3e\x95\xf0\x05\xfa\x2c\x50\x8a\x2f\x45\xc7\xfa\xc7\xc0"
+ "\x33\x05\xc6\x9f\x32\xc0\x98\xd4\x90\x40\x66\x18\xe0\x19\x8b\x15"
+ "\x0a\xf5\x7e\x52\x17\x40\x85\x17\xb5\xa4\x68\x2d\x51\xfa\x5d\xe0"
+ "\xf1\x67\xed\x40\xfb\xde\x18\x0c\xd9\x6b\xf3\x16\x5f\xd0\x90\x23"
+ "\xda\xd3\xa0\x97\xf6\x81\xfc\x5e\x9b\xd7\x03\xb2\x1b\x68\x69\x1f"
+ "\x1e\x2d\x03\x35\x57\x8b\x96\x3d\xc1\xd1\x25\x9c\x9e\x91\x04\x69"
+ "\xd6\x97\x9e\x48\xe3\xcd\xcd\x40\x4f\xa0\xab\xb1\xde\x4e\xfc\x65"
+ "\x64\xa5\x44\xcf\x02\xa0\x27\xd0\x54\x8d\x34\x05\x7a\x30\x9a\x52"
+ "\x91\xa6\x45\x4e\x34\x05\xf9\xc4\xfc\x7b\x22\x4d\x05\xa0\x69\x91"
+ "\x1b\x9a\xf6\x8e\xef\x81\xa6\xc5\x1e\xd1\xb4\x6c\x04\x34\x9d\x18"
+ "\xef\x8e\xa6\x36\xd4\x99\x39\x6b\x73\x29\xc8\x3c\xa3\xad\x8a\xf9"
+ "\xaa\x05\x7b\xa7\x19\xec\x36\x93\xa0\x2a\xca\x03\x9a\xa8\x70\x9f"
+ "\x00\xc6\x3b\x63\x7e\xe5\xca\xe8\x15\x7b\x4e\xa9\x19\xd3\x40\x76"
+ "\xc5\xdc\x87\xbe\xf9\x74\x26\x52\x24\xa7\x07\x6a\x2f\x5b\x40\xc7"
+ "\x04\xbd\xd3\x8d\x36\x67\xce\x9e\xfb\x04\x1a\x43\x50\x8e\x3c\x77"
+ "\x37\x51\x74\x83\xac\xd0\x25\x90\xdb\x72\x41\xde\x75\x83\xfc\x3c"
+ "\x2f\x9b\xb4\x70\x81\x4e\xa0\x70\xa5\xa0\xcf\x55\xc1\x6f\xb7\x09"
+ "\xe4\x35\xe3\x2f\xf2\x0c\xd7\x1f\x6b\x9e\xfb\x18\xca\xbb\xe9\xa1"
+ "\x4f\x23\x6d\x24\x25\xa6\x3f\x7f\x85\x94\x08\xb0\xbb\x86\xee\x27"
+ "\x18\x73\x31\xa9\x15\xf9\xba\x8f\x18\x9b\x1d\xfd\x44\x78\x99\xcb"
+ "\x61\xe4\x05\xf6\x0b\xec\x23\x3b\x9c\xe4\x2f\xc8\xf6\xc0\x42\x31"
+ "\x06\x89\x1d\xe4\x2f\xe4\x55\xa0\xaf\x56\x8c\x4d\x32\x60\xff\x78"
+ "\x15\xfa\xc7\x66\x16\x1f\x4a\x0d\xf4\xd8\xd7\xdd\xc5\x79\x88\x3c"
+ "\x33\xda\x2a\x19\xff\x72\x45\x79\xcf\xe9\xbe\xfb\x8f\x94\x46\x80"
+ "\x2d\x23\x53\x0b\x39\xa5\x26\xda\x15\x33\x1e\xe7\x2a\x61\xfc\x1c"
+ "\x1a\x10\x05\xb6\xc3\x77\xa0\x0f\xd6\x03\xbe\x2e\x92\x19\xc5\xeb"
+ "\xc1\x1e\xe8\xc2\x38\x6f\x50\x9f\x57\x78\x7c\x5c\x21\xc3\xbf\x1a"
+ "\x9e\x31\x1f\xb2\x82\xe4\x43\xb6\x43\x8b\xe3\x7e\xc7\x7c\xd1\x06"
+ "\xad\xdc\xf1\xcd\xcf\xf7\xd9\x55\x32\x35\x3b\x6f\x2f\x0b\xe2\xfb"
+ "\xcc\x94\x1f\x64\x22\x5d\xdb\x64\x41\x73\xf8\x1c\xf1\xa1\x6c\x5d"
+ "\x32\x19\x77\x5e\x76\xd3\x39\xba\xfd\x68\xaa\x0e\x63\x7d\x4b\xcf"
+ "\x52\x22\x90\x0e\x73\xee\x4d\x25\x20\xbb\x65\x73\x8d\x89\x17\xd0"
+ "\x27\xe3\x30\x65\x6f\x10\x9b\xef\xb0\x67\x7e\xbe\x1f\xe8\x14\x26"
+ "\x6c\xff\xfc\x03\x90\x29\xa1\xf4\x45\x68\xeb\x5a\x68\xeb\x79\xa0"
+ "\xeb\x79\x68\xeb\xcb\x62\x5b\xc5\xd8\x77\x02\xd0\x1f\x9e\x0d\xac"
+ "\xff\xa4\xb6\xbe\x88\xb1\x60\xde\x8f\xd8\x72\x81\xdc\x44\xef\xc0"
+ "\x35\x5f\x76\x1e\xb2\xcb\x68\x3b\x4d\xf0\xbb\x4c\x3f\x67\xaf\x8d"
+ "\x79\x06\xf0\x88\x34\x07\x9b\x00\xf4\x5c\x51\xb9\xc4\x07\xac\x0f"
+ "\xed\x89\x19\x5f\xb4\x1e\xea\x83\xb4\xbf\x48\x42\xb0\x3f\x03\xed"
+ "\x67\x14\x21\xfd\x5d\xe3\x4f\x07\x31\x1e\x8c\x05\x1e\xac\x17\x79"
+ "\xa0\x17\x79\x00\xb6\x22\xe8\x6a\x9c\xe3\x50\x17\xa5\x71\x1e\x0c"
+ "\x8f\x46\x37\xcf\x18\xe5\xfe\x6a\x71\xdf\x5f\xd5\x2b\xbb\xf9\x18"
+ "\x52\x86\xbe\x6c\xa9\xff\x9e\x9f\x08\x3d\xd0\x6f\x73\xc4\x7e\x4b"
+ "\x63\x7e\x2e\xf5\xd9\x16\xd9\xcd\x76\xcf\xfa\xec\x2d\x17\xfe\x49"
+ "\xfb\x6c\xd0\xd5\xed\xb3\x93\xff\xe2\xda\x67\x27\xb7\xba\xf6\xd9"
+ "\xc9\x85\x8e\x3e\x2b\x3e\x1b\x95\x3e\x3b\x79\xff\xf7\xd3\x67\x27"
+ "\xef\x1f\xa0\xcf\xd6\x7b\xd0\x67\xd5\x6e\xfa\xac\xfa\xea\xf5\x59"
+ "\x75\xc3\xb5\xd3\xb1\xc1\x53\xba\xe5\x03\xe8\xd8\x57\x9d\x74\xac"
+ "\x1f\xea\xd8\x29\x7b\x07\xea\xaf\x3d\x06\xe8\xaf\x2a\xb1\xbf\xfe"
+ "\xf6\x6f\x50\xde\xd4\x3d\x55\x8d\x43\xf7\x57\x9b\xc1\x61\x3f\xb9"
+ "\xed\xb3\x31\xd8\x67\xcb\x88\xd1\xc4\xfa\xec\x4a\xa9\xcf\x1a\xc4"
+ "\xf1\xce\x20\xfd\x36\xc8\x5d\xbf\xc5\x78\x60\x18\x0b\x6c\xd0\x7e"
+ "\x2b\xda\x4b\x3d\xd3\xb0\xdf\x96\x5f\x67\xba\xf6\xd6\x75\xae\xfd"
+ "\xf6\xd6\x12\xd7\x7e\x7b\xeb\x33\x8e\x7e\x2b\x3e\x1b\x95\x7e\x7b"
+ "\x6b\xec\xf7\xd3\x6f\x6f\x8d\xfd\xe1\xe8\xda\xe0\xdc\x6b\xa7\x6b"
+ "\x6f\x3b\xc1\xfa\xad\x3b\x5d\x9b\x22\xea\x5a\x3f\xd4\xb5\xd3\xd6"
+ "\x78\xd6\x77\xa7\xaf\xfc\x27\xef\xbb\x57\x59\xe7\xde\x76\xb7\x6b"
+ "\xdf\xbd\x6d\xb9\x6b\xdf\xbd\x6d\xa2\xa3\xef\x8a\xcf\x46\xa5\xef"
+ "\xde\xa6\xfd\x7e\xfa\xee\x6d\xda\x1f\x8e\xce\xd5\x2c\x72\xd7\x77"
+ "\x35\xd3\x49\x6a\x93\x4c\xb3\xc7\x68\x60\xfb\xf2\x52\x8d\xb6\x9f"
+ "\x12\xb6\x97\x45\xa6\xa9\x31\xaa\xe7\x12\x61\xfb\xb1\x06\x8c\xd5"
+ "\x82\x7b\x6a\x7e\xe7\xb4\x67\x85\xaf\xe9\x6a\x2e\x48\x7b\x6e\x8a"
+ "\xc5\x78\x2e\x83\xed\xb9\xa1\x99\xc7\x62\xf8\x7b\xb7\xf3\x7d\xf2"
+ "\x99\xc7\x62\xa5\x7b\xe6\x5f\x46\x76\x7b\x08\xcd\x3a\x16\x65\xf6"
+ "\x3d\x16\xe5\x6e\x9d\xc4\x7f\x2b\xa5\xb8\xcf\xa4\x63\x7a\x42\x68"
+ "\xc7\x76\x42\x72\xd9\x1a\xc4\xed\x51\xd0\x46\x1e\x0f\xd8\x7f\x6a"
+ "\x60\x47\xda\x12\x02\x69\x89\x52\x1a\x8b\xc1\x9d\xe6\x43\x05\x78"
+ "\x46\x73\xd6\xd8\x30\x5e\x1f\xfa\x3e\xbe\xf7\x32\x62\xf1\xf6\x4c"
+ "\x90\x11\x6c\x0f\x09\x5b\xc7\x9f\x7c\xab\xa5\xa8\x9d\x28\x6a\xd3"
+ "\xd9\x5e\x3a\xdc\xab\x53\x92\x83\xf8\xf7\xb9\x27\x8f\xca\x15\x44"
+ "\x28\x5c\xad\xa4\x7e\xbb\x5b\xd9\xde\x62\xc0\x8a\xb4\x7f\x07\xe3"
+ "\x1a\x0a\xd3\xa2\xcb\x24\xff\xbb\x14\xea\xf7\x61\x32\x9e\x3d\xf5"
+ "\xa1\x45\x71\x24\x10\x2e\x15\xd5\xef\x6e\xed\xca\xb8\x23\x50\x9a"
+ "\x3f\x74\xbb\x4f\x1c\xe3\x08\xdf\xaa\x56\x88\x7b\x85\xd0\x0f\x01"
+ "\xdb\x73\xb8\x43\x2e\x64\xda\x21\x9d\xa6\xa5\x50\x63\xa2\x8d\x04"
+ "\x00\x2d\x70\x0d\x1f\xe3\x8c\x09\x45\x09\xa1\xdb\xa6\x12\xf2\xa7"
+ "\xcd\xad\x72\xdc\xcf\x61\xff\x8f\x5b\x2d\xe5\xc9\xf7\xe3\x1a\x3f"
+ "\x8b\x29\xd0\x22\xbb\xd3\x2f\xfc\x1c\x8f\x19\x0c\xff\x4f\xc1\xb5"
+ "\x87\xc5\x70\x8f\x6b\xe4\x42\x87\x5a\x81\x79\x5b\x64\x77\x1c\x29"
+ "\x4f\x38\x45\x02\x74\x44\x99\x03\x6d\xe3\x79\xef\xd8\x89\x79\x4d"
+ "\xb2\x3b\xd9\x1e\x05\xb8\x2f\xc3\xf9\x72\x78\x8f\xcd\x95\x52\xc3"
+ "\x6a\x25\x93\x0f\xd9\xbb\x5b\x85\x69\xab\x95\x6c\x2f\x29\xb4\x73"
+ "\x07\xb4\x19\xf2\xa8\x70\x0f\x0f\xfb\x4d\x26\x81\x3b\x21\x0d\xcb"
+ "\x81\x5f\x15\xdb\x47\x2c\xbb\x23\x1d\xcb\x76\x7b\xfe\x40\xb5\xbb"
+ "\x95\x02\xb6\xf9\x79\x1c\xd9\xb1\x26\xd9\x9d\x07\x02\x64\x94\x52"
+ "\x43\x74\xd9\x36\x9c\xc7\xc6\x3d\xdf\xb8\x8f\x5d\x76\xe7\x1b\x50"
+ "\xbe\xa2\x98\xcd\xdb\xde\xa9\x33\xc9\xee\x70\xec\x47\x60\x6b\x2d"
+ "\x77\x56\xe2\x77\xf0\x1d\x31\x3f\xdb\x6b\x8a\x75\xd6\x24\xfb\x50"
+ "\xb8\xff\x33\xdf\x17\xae\x5c\x0d\xef\x3b\xfc\xff\xf0\xf7\x00\x4b"
+ "\x77\x56\x00\x36\x99\x6f\x14\xbc\x77\xbb\x4f\x59\xe4\x5b\x0d\x50"
+ "\xaa\x1f\xef\x24\x8c\x00\x2e\x24\x8c\x60\x7d\xdf\x4d\x36\xc9\x99"
+ "\x3e\x92\xcd\x60\x31\xb9\x72\x80\x87\xf6\x02\xb5\x82\xcd\x4d\xf7"
+ "\x20\x5f\x9a\xe0\xd9\x4c\x5f\xe4\xcb\x0e\xd0\x05\x62\xde\x10\x47"
+ "\xfd\xf1\x7e\x26\xe3\xa7\x00\xbc\xe0\xfb\xa0\x66\x9c\x66\x31\x9d"
+ "\x40\x66\xe0\xfe\xf5\x8a\x44\xa8\x17\xe2\x16\x30\xf2\xa7\x38\xab"
+ "\xbc\x28\x81\xa7\x7f\xd8\x6e\x95\xef\x38\x4f\x50\xb6\x10\xfd\x5a"
+ "\xa2\x00\x3d\xa4\xc0\x32\x69\x70\x74\xd9\x7d\x12\x1f\x37\x03\xef"
+ "\x12\x00\xbb\x40\xf3\x1d\x40\xbf\xa2\x6e\xb6\x56\x53\x56\x24\x10"
+ "\x95\x00\xf9\x4c\xb2\x99\x6a\x28\x2f\xb0\xf0\x16\x6a\xc6\x7d\xd6"
+ "\x40\xc3\xcd\x5d\x19\x33\x2c\x12\x0d\xb1\x4e\xb8\x4f\x5a\x8f\x7b"
+ "\xff\x65\x33\x74\x1c\x43\x33\xc2\xa4\x36\xbb\xa3\xa7\xfe\x4f\x24"
+ "\x58\x7f\x2f\x99\x2b\x28\x7b\xd4\xd4\xe7\xd6\x12\x9c\x6f\x7e\xb2"
+ "\x0d\xfd\x58\xb5\x92\xf0\xd7\xce\x50\xa3\xd9\x4e\x04\xdf\x1e\x35"
+ "\xae\x43\xd8\xb7\xdd\x33\x29\xfc\x15\xa0\x17\xe8\xfb\x14\x2b\x09"
+ "\x34\x26\x9b\x79\xec\x41\x72\x89\xd8\x37\x81\x0c\x07\xb9\x0e\x3a"
+ "\x55\x91\x72\x89\x4c\x41\x7a\x09\x7e\x45\x0b\x81\x66\x47\x9f\x89"
+ "\x27\xa9\xc3\x93\xa3\x33\xd9\xf9\x67\xb4\x2f\x40\xe6\xcb\x71\xaf"
+ "\x9e\xd1\x0c\xf6\x89\xbe\x68\xe1\x30\xcb\x71\x7b\xfe\x19\xdb\x2d"
+ "\xe0\x3c\xb4\xd8\xe6\x70\x6c\xb3\xc5\x4a\x70\x2e\xff\xc9\x8d\xe8"
+ "\x3f\xb9\x93\x08\x59\x3d\x6a\x6c\x33\xd8\x3a\x95\xc3\x9f\xd3\xff"
+ "\x51\xc4\x60\xdf\xa6\x40\x6f\x61\xdb\xad\x25\x82\x6a\x77\x25\x7e"
+ "\x1b\xeb\x80\x67\x7f\x9e\xec\x24\x8c\xee\x48\x7f\xa3\xd5\x4e\xa8"
+ "\xaf\x73\x1d\x6c\xc3\xad\x83\xfb\xf6\xdf\x4b\x82\xb3\xff\xc4\xf9"
+ "\x6e\xdf\x26\xd2\x20\x06\xd7\xc1\x76\x57\x62\xcc\x8d\x27\xb1\x0e"
+ "\xe6\x0b\x64\x31\x68\x1e\xe4\xbf\x51\xdb\x46\xec\x3e\xf7\x4c\xc2"
+ "\x3d\x07\xc8\xff\x64\x1b\xf0\xff\xb2\x15\x7d\x26\x99\x8d\xa9\x57"
+ "\x08\xda\x2f\xb6\x0e\xad\xbc\x3f\xff\xef\x3a\xfa\x4c\xe2\x70\xf9"
+ "\x7f\xd7\x28\xf1\xff\xae\xeb\xa0\xfd\x5a\x2f\xda\xaf\x1d\xa5\xf6"
+ "\x6b\xaf\x83\xf6\xdf\xed\x45\xfb\xef\x1e\xa5\xf6\xdf\xed\xb6\xfd"
+ "\x8f\x4f\x11\x28\xdb\x8b\xe2\x9f\xcf\xe2\xd0\x70\x7d\x75\xcf\x21"
+ "\xdc\x77\xc2\xce\x7a\x89\xf7\x84\x9f\xfd\x52\xf6\xb9\x57\xf5\xb9"
+ "\x0f\xec\x73\x1f\xd4\xe7\x5e\xdd\xe7\x3e\x58\xba\x07\x3d\x32\xe6"
+ "\xa2\xec\x9e\xd9\x60\x97\xa6\x9a\x64\xf7\x54\x8b\xcf\x67\xa0\x4f"
+ "\x31\xd0\xe9\x33\x06\x89\x7f\x79\xeb\x79\xd9\x8f\xd9\x19\x14\xba"
+ "\x6d\xaa\x96\x6e\x4e\x25\x42\xf6\xda\xf8\x27\xb7\x80\xec\x02\xfe"
+ "\xd1\x1e\xf5\x58\xb0\x11\x26\xa3\xdf\x3a\xdc\x77\xa0\x89\xc3\xfd"
+ "\x24\x3f\x9e\x89\xed\xbb\x57\x57\x4e\x04\x9f\x7b\x98\x2d\x28\xe8"
+ "\xd7\xc6\x9b\x7d\xee\x99\x4a\x77\xed\x59\x92\x23\x17\x94\x39\x69"
+ "\x82\x66\x8b\x99\x9a\x17\x5d\x02\x39\xd4\x89\xbe\xe4\x81\xc7\xf1"
+ "\xd4\x5c\x1e\x77\x01\xea\xfb\x63\x7d\x4d\x12\x94\x0d\xdf\x81\x6f"
+ "\xc1\x38\x6e\xed\x52\x1e\xb7\x7d\x6d\x7c\xad\xa5\x92\x60\x8c\x21"
+ "\xb1\x4c\x1d\xf5\x5b\xbb\x14\xcb\x1c\xd0\x3e\xcd\xce\x6f\x86\x6f"
+ "\xfe\xf4\x19\xad\x82\xd0\xad\x8a\xa0\xe1\xf1\xf4\xc7\xfb\xdc\xda"
+ "\xbd\xd9\x05\x51\xbc\x5c\xa5\x17\xe5\x86\xb8\x8d\x95\x0e\xe5\x8a"
+ "\xf5\x0d\xf4\xa6\xdc\x48\xf7\xe5\x1a\xc4\xfa\x6a\xbc\x29\xf7\xc0"
+ "\x20\xe5\x8a\xf5\x0d\xf3\xa2\xdc\x59\x81\xee\xcb\x2d\x14\xeb\x9b"
+ "\xea\x4d\xb9\x31\xee\xcb\xcd\x6f\xf6\x0e\x0b\xb3\x3e\x18\x0c\x0b"
+ "\xde\xe1\xe0\xde\x41\xda\x5f\xd0\xec\x1d\x06\xee\x8d\x1a\x0c\x03"
+ "\xde\xf1\xff\xde\x41\xf9\xef\x1d\xef\xef\x53\x0d\xc6\x7b\xef\xf8"
+ "\x7e\x9f\x5b\xfc\xa3\x2d\x0f\xbc\x2f\xa1\xfe\x7b\xc2\x84\x9c\xb5"
+ "\x25\x82\x7f\xfe\x7f\x6e\x13\xc2\xc8\xe3\x20\xc3\x02\xf2\xc8\xc4"
+ "\x30\x36\x3e\xbe\xcf\xb2\xc5\x40\xe4\x30\xde\x95\xbf\xb3\xb9\x41"
+ "\x6e\xb4\xcd\x45\x9d\x63\x2f\x4d\xb0\xca\xee\x84\xf4\x43\x80\x2a"
+ "\x0b\xd8\x9d\xbc\x9c\xb5\x25\x39\xc9\x61\x44\xf4\xa3\x61\xc1\xb3"
+ "\xcb\xe1\x20\xc7\x8c\x79\x56\xdc\xb7\x32\x11\xde\xb3\x01\x7e\xa1"
+ "\x0c\x2b\x79\x57\x30\xcb\xc2\xe2\x58\x3e\x33\x3b\xb3\x97\x93\xff"
+ "\x9f\x34\x45\x8b\xfe\x14\xcd\x2d\xb2\xd0\x67\x7d\xcc\x44\x8e\x7e"
+ "\x8f\xba\x32\x42\x23\x4c\xb2\xd9\x0b\xc5\x33\xaa\x6d\xcc\xef\x27"
+ "\xd4\x17\xcf\x7f\x62\x5e\xf4\xff\x79\xaf\x8e\xc8\xd1\x27\x3b\xe4"
+ "\x4d\x47\x5f\xa0\x83\x9d\xf5\xb6\x67\xef\x4e\xc7\xf7\x69\x36\xe8"
+ "\xd0\x0b\x44\x8e\xe7\x3b\x69\xf0\x6a\x92\x03\x63\x88\x05\x77\xe3"
+ "\x9c\x47\x3b\x49\xde\x42\x05\x9c\x7f\xa2\xaa\xa2\xb9\xb8\x37\x8e"
+ "\xef\x1b\x9f\xad\x29\xe2\xfb\xc8\xad\x2c\xfe\x30\xdc\xb3\x71\x0c"
+ "\xee\x8d\x51\xad\xd5\xd2\x1c\xbf\xb0\x5a\x4b\x3b\x8f\x87\x29\x9b"
+ "\x7d\x3b\xfa\x64\xec\x50\xed\x4e\xb5\xa8\x76\x67\x76\x65\xcc\x0e"
+ "\x96\xda\x80\xdf\x97\xd2\x71\xdc\x86\xf9\xe0\xf9\x3c\xe9\xec\xb7"
+ "\x9b\x78\xdc\x93\xc2\xd5\xd4\xdc\xeb\x6b\x43\x76\xff\x5b\x48\x7b"
+ "\xb0\x15\x12\x2d\x29\xda\xe9\x7c\x1e\x63\x76\x25\x8e\x87\xa1\xde"
+ "\x51\x7c\x6c\xba\x36\x8a\xf9\xe5\x05\x1d\xf0\x8c\x56\x3e\x4c\xbb"
+ "\x75\x36\xd3\xff\xe5\xd3\x51\x47\xde\x9f\x05\xe5\xff\x0c\xda\xd4"
+ "\xc6\xc7\x62\x6b\x13\xd9\x99\x47\xd9\xec\x4c\xf8\x46\x22\xdc\x6b"
+ "\x30\x5f\x93\xec\x7e\x95\xf8\x3c\xd5\xe9\x79\x2a\xee\x95\x14\x9f"
+ "\x8b\x63\xb9\xb5\xe9\x4e\xcf\xd3\x75\xd3\x71\x6e\xe2\xfe\xa5\xd8"
+ "\x06\xa0\x63\x24\xea\xb6\x5e\xdf\x21\x7e\x6b\x23\xc5\x7c\xf1\x6d"
+ "\xb2\xfb\xd7\x75\x00\xb6\xe0\x79\x92\xd3\xfb\x49\x87\x13\x43\xc9"
+ "\xe3\x85\x48\xc3\xfb\x53\x4d\xf2\xe2\x85\x7c\x3c\x3b\x3b\x9b\xb5"
+ "\x5d\xb5\x36\xc2\xb9\x3c\x93\xec\xfe\x45\x50\x66\x84\x05\xec\x28"
+ "\xc8\x13\x8f\xdf\x74\xa6\xb7\x74\xf2\x52\x13\xb5\x6e\xa5\x66\xd5"
+ "\x86\x97\xd6\xe3\xc9\xb9\xf1\x2e\x7b\x1c\x03\xf1\x6c\xa9\x90\x5d"
+ "\x1c\x63\xcc\xc3\xb3\x6e\x81\xec\x8c\xf8\x4e\xdc\x37\xe5\x5f\x5a"
+ "\x62\xcf\x29\x0d\x15\xfc\x8b\x96\x94\x6f\x7e\x8c\x5c\x94\xfd\x84"
+ "\xf9\x2b\x35\x02\x4a\xb2\xdf\x44\xdf\x1e\x55\x98\xc6\xfc\x19\x61"
+ "\xac\x29\x36\x66\xdf\xac\x24\x15\x9a\x76\x36\xee\x87\x67\xcf\xb2"
+ "\x39\x8e\x4e\x22\xb7\xa5\x29\xc9\xff\x49\xae\x93\x7f\x20\x98\xe4"
+ "\xff\x47\x68\x60\xfb\x74\x0f\xab\x2b\xc9\x7d\x89\x4a\x8c\xab\x28"
+ "\xff\x08\xc6\xd2\xf8\x1c\x9f\x49\x67\x11\xe0\xfd\x77\xd8\x9e\xdd"
+ "\x3b\xf8\xff\x29\x79\xf4\xeb\xc3\x6a\xd1\x8f\x85\xec\x27\x32\xac"
+ "\x2b\xfa\xf8\x68\x93\xfd\x64\x0c\xd6\xcf\x24\xfb\x89\xc2\xc7\x80"
+ "\x7b\x7c\x89\x0a\xf2\x5f\x12\xf4\xc5\x31\x28\x0f\x6c\x19\xf7\x1f"
+ "\xa0\x69\xaa\x3f\xe0\xb9\x3b\x83\x78\x16\xaf\x2b\xe3\x27\x8d\x4e"
+ "\x67\x4c\x55\x1d\x72\xf2\x08\xa4\x99\xa5\xb3\x0d\x18\xfb\xcc\x9d"
+ "\x7c\xb1\x82\x8d\x77\x25\x38\x3a\x53\x50\x15\x03\x2f\x8a\x63\x2a"
+ "\xe7\x13\x9c\x77\x91\xe1\x9e\xd9\x36\xd9\x03\xad\xd4\xaf\x38\x22"
+ "\x19\xfb\x74\x4e\xd1\x92\x3f\xe0\xbe\x3f\xa0\xe3\x5e\xdc\xe7\x07"
+ "\xb4\x7c\x1b\xee\xab\x16\x96\x11\xcd\xd3\x68\x3b\xcd\x59\xf9\xeb"
+ "\x28\x6a\xbb\x67\x49\x39\xa9\x6e\x7e\x8f\x7c\x5a\x5f\x49\x54\xcb"
+ "\x89\x4f\x8a\x89\xda\x59\x1b\xe3\x89\x3c\xdc\x44\x7c\x92\x3b\xb1"
+ "\x4f\xdb\x09\x9e\x1f\xa8\xb5\xd6\x80\x3d\xb4\xc1\xf2\x4e\x72\xeb"
+ "\x18\xcd\x93\x84\x40\xdf\x63\x6b\xcc\xec\x9c\x8f\x99\x9d\x9b\xf6"
+ "\xc3\xf9\x6e\xa7\xf3\x3d\xea\xa4\x48\x2a\x6c\xb9\x40\x94\x35\x31"
+ "\xa7\x49\x78\xa4\x0f\x65\xe7\x7b\x12\x21\xa3\x19\x78\xff\xb2\xd6"
+ "\xdf\xfe\xb2\x76\xd2\xae\xcb\x24\xa8\x36\xde\x04\xb6\x59\x25\x29"
+ "\x88\x23\x41\xb4\x2b\xc6\xb7\xba\xb2\x8a\xd0\xed\xf6\xc0\x77\x93"
+ "\xcb\xc7\xd8\x95\x7c\x7f\x55\xc0\x56\x19\xce\x6f\xfa\x67\xe3\x3e"
+ "\xab\xcb\x24\x74\xc5\xd9\x54\x36\x27\x8b\xf3\xdf\xb6\x2e\xad\xa6"
+ "\xa7\x4b\x7b\x47\xf7\xcb\xda\xe9\xd2\xbc\xf9\xb3\x17\x02\x71\x9d"
+ "\x20\x82\x66\xfc\xa8\x04\xf7\xf6\xe1\x38\xc0\xe6\x27\x53\xe3\x1c"
+ "\x39\x62\x18\xbe\x1f\x2c\xac\xd2\x92\xfb\xcc\xec\xec\x11\xce\xdb"
+ "\x07\x16\x3d\x8f\x75\x6d\x27\x6c\xaf\x90\x2f\xdf\x2b\x64\xc5\x35"
+ "\x6b\xd5\xee\x86\xc5\x6b\x34\xa4\x7b\x5a\x74\xa6\x31\xf1\x0f\x24"
+ "\xe5\x0a\xfd\x9a\xd9\xf1\x89\x80\xdb\x8c\x39\x38\xb7\xd7\x70\x44"
+ "\x7b\x02\xf5\xc9\x9c\xe1\xcb\x87\x07\xd8\xfa\x2f\xd2\x06\xf8\x54"
+ "\xb2\xb7\x1d\xf9\x56\xb4\xe4\x8f\x71\x66\xf9\x13\xcd\xd4\x56\x13"
+ "\xf5\x07\xf2\x69\x43\x9d\x0b\x7f\x18\x3f\x21\x1f\xf2\x09\x79\x84"
+ "\xbc\x72\xf0\xe9\x04\xe3\xd3\x5e\x81\xf3\xa9\x5b\x95\x5f\x22\xf1"
+ "\xca\x6a\x88\xce\xf3\x84\x5f\xd5\xcd\x03\xf3\x0b\xe8\xdc\xcb\xaf"
+ "\xfc\x76\x12\x64\x6c\x03\x7b\x19\xf8\xf5\xc4\x53\x84\x3c\xf1\x36"
+ "\x15\x6a\x16\x1e\xef\xe5\x9b\x2d\xd3\x0d\xdf\xce\x39\xf8\x06\xfc"
+ "\x1f\x84\x6f\x77\xcd\x18\x0e\xdf\xaa\x9b\x39\xdf\x6c\xe2\x1e\x2f"
+ "\x6d\x05\x91\x5b\x5f\xd6\xca\xf3\x2e\x93\xb9\xc8\xbf\x45\x67\x35"
+ "\xe4\xc8\xd2\x1a\xe0\xd9\x7b\x2e\xfc\x13\xf4\xbb\x13\x81\x07\xfb"
+ "\x90\x87\xde\xf5\xbb\x87\x22\x3d\xef\x77\xff\x72\xf2\x46\xbf\x1b"
+ "\xad\x7e\xf7\x2f\xa9\x23\xeb\x77\x0f\x85\xdc\xe8\x77\xdf\x77\xbf"
+ "\x7b\x48\xdb\xb7\xdf\xf5\xda\x0d\x71\xd1\xeb\x56\xae\x59\x8f\xc7"
+ "\x13\x9f\x7f\x25\x3e\x7a\x13\xb7\x1e\x5c\xec\x07\xb5\x3d\x39\x4c"
+ "\x8e\x3e\xe7\xaa\xf3\xea\xc8\xbb\x53\xeb\xe4\xf6\x6f\xd5\x0a\x9a"
+ "\x3d\x39\x52\xc8\x9e\xd2\x8a\xbe\x43\xb1\x7f\xee\x44\xbf\x1e\xb2"
+ "\x47\xea\x6b\x83\x79\x9c\x4e\xfc\x9f\xd9\x4e\xc1\xab\xd5\xb8\x5e"
+ "\xb3\x6d\x33\x51\x6c\xc3\x33\xda\x56\x9c\x17\x61\xcf\x1f\x46\x5f"
+ "\x8a\xb4\x70\xb5\x1a\xfd\xf2\x58\x54\x6b\x35\xe9\x50\x96\xd9\xaf"
+ "\x38\x46\xa1\xc1\x33\x17\x3f\x33\x80\xed\x53\xd7\xeb\x67\x49\xf6"
+ "\x08\xa1\x63\x7f\x6a\x46\xb9\x80\x67\xe4\x2e\xca\x7e\x76\xec\x0a"
+ "\xae\x75\x80\x3d\xfd\xcc\xdd\xf0\x9d\x69\xd1\x79\xcc\xef\x02\xc8"
+ "\x08\xfe\xfc\x61\x3d\x7e\xff\x4a\x76\x11\xc6\xba\xb1\x74\xa8\x4a"
+ "\x4b\x3a\xb2\x4b\x43\xab\x92\xf2\x44\x19\xf1\x33\xfb\x13\x79\x5c"
+ "\x46\xd4\xa8\x01\x83\x8b\x00\x83\x11\x43\xc9\x08\x27\xec\x4d\x1f"
+ "\x9e\x8c\x40\xac\x21\xe6\x10\x6f\x13\x00\x6f\x88\x41\x09\x73\xbf"
+ "\x13\x31\x17\xd0\x48\x02\x19\xee\x6c\x1c\x77\x78\xee\xb9\x26\xd1"
+ "\x81\x39\x7b\x5f\xcc\x5d\xee\x83\x39\xb9\x88\xb9\x97\x5d\x31\xb7"
+ "\xec\x74\x20\x29\xe0\xb2\xc2\x81\x39\xbd\x4c\x2d\xe1\x0d\xb1\x87"
+ "\x38\x13\x5e\xd0\x92\x9a\xb6\xf6\x5e\xec\x15\xad\xe6\xeb\xad\x6c"
+ "\x3f\xaf\x9c\xee\xbb\xf2\xb2\x28\x2b\x2e\x48\xb2\x22\xdf\x8d\x8e"
+ "\x3e\xed\xa5\xac\x78\x98\xcd\x7f\x23\xaf\xba\x81\x6f\xc8\xaf\x27"
+ "\xd4\x20\x23\xd4\xff\x49\x3e\x5d\x7a\x9d\xf0\x27\x6e\x74\xf8\x83"
+ "\xbe\x70\xa1\x2e\x03\xf0\x68\x66\xc8\x50\x3c\x42\xfe\x20\x9f\x18"
+ "\x7f\x80\x4f\xd2\x9a\x38\xae\x91\x22\xaf\x90\x3f\xf7\x26\x11\x39"
+ "\xf2\xab\x28\x81\xcb\x07\x94\x03\x6c\x0f\x76\x1f\xf9\x0e\x34\x5f"
+ "\x8a\x3c\x63\xe3\xea\x34\xbf\x17\x76\xe2\x19\xe2\x49\x92\x0d\xfd"
+ "\x88\xa6\xbf\x0d\xfd\xc8\x9c\x5e\xbf\x98\xb2\x9f\x95\xf1\xf1\x51"
+ "\xb1\x78\x8e\x38\xec\x35\xb1\xcf\x13\x1c\xab\xb2\x71\xa9\x1d\xc6"
+ "\xa5\x2a\x18\x97\x66\xc3\xb8\x34\xb1\x95\xfb\x4f\x90\x3d\xb2\x95"
+ "\x88\xe7\x99\xa9\x5f\xd1\x5c\x18\x13\x69\x91\x96\x6c\x8d\xd7\x6f"
+ "\x77\x2a\xae\x49\x51\x3d\x8c\x79\xff\x53\x4e\xe0\x3e\xf3\x88\xd6"
+ "\x3e\x4c\x1c\x3d\x22\xee\x4d\x3a\x16\xa5\xdb\x8c\xfb\x1b\xc2\x74"
+ "\xbc\x7e\x3f\xfb\x0d\xa6\xb3\xf5\x3f\xb9\x50\x62\xdf\xe6\xba\xfe"
+ "\xe7\xbc\x3e\xfc\x6e\xb2\x59\x5c\xfb\x0b\x63\x6b\x7f\x28\x43\x50"
+ "\xee\xbd\x03\x63\x18\xc7\xfa\xdf\x71\x7c\xfe\x1b\xd7\xf5\xbf\x30"
+ "\xa6\xef\x4c\xb2\xb0\x74\xdc\xf3\x02\xf7\xe2\x7a\xda\xcf\x22\x9c"
+ "\xd3\x1d\xeb\xeb\x3c\x5d\x90\xb3\xb8\x2b\x38\x3f\xd0\xc6\xe7\x05"
+ "\xc2\x0c\xd2\xf8\xdb\x8d\xbd\x34\x0c\xb9\xbc\x20\xd5\x21\x97\x17"
+ "\xb0\x3d\x00\x54\xbd\x67\x61\x4d\x3f\xb9\x7c\x0a\x9e\xcf\x3f\xf7"
+ "\x24\xca\xe5\xec\xa2\x30\x5e\xbf\x47\xef\x06\x9a\xf8\x60\xfc\x4c"
+ "\x4c\xc7\xf3\x46\x28\xa3\x0b\x99\xcc\xde\x33\x37\x9d\xad\xf1\x3f"
+ "\xba\xd0\x55\x56\xcf\xdf\xeb\x2a\xab\x1f\xdd\x32\xb8\xac\x7e\xfc"
+ "\xa1\xc1\x65\xf5\xa3\x6f\xdf\x90\xd5\xa3\x2d\xab\x25\xbb\xce\x5b"
+ "\x59\xfd\xb8\xe2\x86\xac\xbe\xd6\xb2\xfa\x71\xe2\x24\xab\x97\xba"
+ "\xca\xea\xf9\xd5\xfd\x65\xf5\x7c\x93\x43\x56\x3f\xba\xd4\x55\x56"
+ "\xff\x62\xb6\x67\xb2\x7a\xc1\xac\xab\x2b\xab\x17\x2c\x72\x95\xd5"
+ "\xbf\x08\x16\x75\xc9\xa5\xe1\xcb\xea\x05\xf6\xc1\x65\xf5\x2f\xc6"
+ "\xb8\xca\xea\x05\x0d\x5c\x26\xff\x22\x94\xcb\xea\x05\x6d\xa2\x0c"
+ "\x37\x3b\xa7\x3b\x64\x35\x4f\xef\x2f\xab\x7f\xb1\x70\x08\x59\xad"
+ "\xb5\x0b\x92\xac\x6e\x00\x59\xdd\x20\x17\x5e\x70\x27\xab\x7f\x9d"
+ "\x5e\x83\xb2\x3a\x0e\x65\xf5\xaf\xd3\x07\x97\xd5\x4f\x5c\x40\x99"
+ "\xcc\xfc\x7a\xbe\x49\x9b\x99\x5f\xc5\x37\x69\x2b\xe2\xf4\xc9\x24"
+ "\x48\x87\x34\xf4\x3f\x89\xf9\x38\xef\x25\x99\xfe\x0b\x7b\xaf\x4c"
+ "\x87\x7c\xc2\x14\x87\x4c\x47\x79\x8e\x72\xbd\xf0\x4d\x6a\x2a\x7a"
+ "\x93\x36\x76\x65\xfc\x72\x86\x24\xdb\xf5\x90\x86\x71\x92\xd0\xf7"
+ "\x11\xee\x8f\x04\x1a\x34\x6f\x83\xef\x61\x7e\xc8\xb7\xc8\x55\x07"
+ "\x3c\xb1\xcf\x55\x07\xfc\x72\xeb\xe0\x3a\xe0\x57\x0f\x0f\xae\x03"
+ "\x7e\xf9\xce\x0d\x1d\x70\xbd\xe9\x80\x5f\x29\x6f\xe8\x80\xa1\x75"
+ "\xc0\x40\x3c\xea\xab\x03\x66\x89\x3a\xa0\x70\x48\x1d\xf0\x2b\x85"
+ "\x7b\x1d\xf0\x44\x5d\x7f\x1d\xf0\x44\xb3\x43\x07\xfc\x32\xc2\x55"
+ "\x07\x2c\x7a\xc0\x33\x1d\xf0\xeb\xd9\x57\x57\x07\xfc\x7a\x89\xab"
+ "\x0e\x58\xa4\x11\xe5\x54\xa1\xb3\x0e\x10\x7c\x3c\xd1\x01\x8b\x64"
+ "\x92\x0e\x40\x19\xfb\x0e\xae\x37\xf4\xea\x00\x94\x85\x8b\x7c\xcb"
+ "\x13\x9a\x9c\x74\xc0\xaf\x1b\xb9\xac\x5f\x34\xc7\xce\x74\xc0\xaf"
+ "\xcd\x3c\xfd\x17\x06\xe7\x74\x87\x0e\xe0\xe9\x76\x67\x1d\xd0\x8a"
+ "\x3a\x60\xd1\xa2\x21\x74\x40\xa8\xe7\x3a\xe0\xa9\x46\x87\x0e\x78"
+ "\xaa\x51\xd2\x01\x28\xf7\x51\x07\xa0\xcc\x46\x3d\xc0\x7c\x83\xb1"
+ "\x3d\x21\x4f\x2d\x08\x30\x13\x25\xfa\x24\xc6\x39\x15\x94\xdd\xe8"
+ "\xff\x08\x75\x01\xcb\xb3\x9e\xe7\x01\x79\xde\x0c\x32\xbc\x15\x64"
+ "\x78\xab\xfe\x22\x51\x40\xbe\x86\x1c\xdc\x5f\x08\xf7\x28\xeb\x03"
+ "\xda\x40\x6f\xd8\x98\xde\x68\x40\x7d\xc3\xe9\xf5\xd4\x02\x57\xdd"
+ "\xb1\xf8\xa1\x81\xc6\x03\xb9\x4e\xba\xa3\xe8\x16\x5a\xdf\x95\xb1"
+ "\x78\xb9\xa4\x0f\x72\xe0\x1e\x75\x46\x6e\x3b\xd3\x19\x26\xd0\x19"
+ "\xcd\x5c\x67\x2c\x4e\xed\xcd\x03\x75\x60\x79\xb8\x5e\x69\x80\x3c"
+ "\x8d\x62\x9e\x52\x57\xbd\xf2\x94\xd2\x55\xaf\x2c\x3e\x89\x7a\x05"
+ "\xfd\xe4\xb2\xf8\xf2\xfa\xe2\x08\x7b\x61\x74\x1e\xea\x18\xfe\x3c"
+ "\xfc\xf7\xbd\x7a\xe5\x16\x27\xbd\x92\x28\xe9\x95\x27\xc7\x5c\xf7"
+ "\x7a\x05\xb0\x5c\x93\xf4\xcf\xa4\x57\xc2\x23\xaf\x07\xbd\x82\xbc"
+ "\x99\xe0\x34\x37\xec\x4e\xaf\xa0\x5f\x89\x9a\xd8\x1f\xba\x5e\x09"
+ "\x5f\xee\x5e\xaf\x3c\xa5\xed\xaf\x57\x9e\x9a\xe7\xd0\x2b\x8b\xf7"
+ "\xb9\xea\x95\xa7\xf5\x9e\xe9\x95\xa7\xb2\xfa\xea\x15\xa4\x65\x0e"
+ "\xdf\x5f\xd1\x86\xfa\xc4\xae\xdf\x9d\x2a\xa0\x6e\xf1\x4a\xaf\x3c"
+ "\x55\xe6\xaa\x57\x9e\x4e\x14\xf5\xde\x5b\xc3\xd7\x2b\x4f\xb3\xb9"
+ "\xa3\x1c\x49\xaf\x5c\xee\xab\x57\x9e\x5e\xe9\xaa\x57\x9e\x9e\xc3"
+ "\xf5\xc7\xd3\xd9\x5c\xaf\x3c\xbd\x50\xd4\x4f\x25\xce\xe9\x0e\xbd"
+ "\xc2\xd3\xfb\xeb\x95\xa7\x4b\x87\xd0\x2b\xaa\x1e\x43\x74\x5e\x77"
+ "\x76\x69\xaa\xad\x34\x21\x34\x64\xf9\x6d\xf6\xbe\x7d\x83\xf7\x09"
+ "\x3b\xc1\x3e\xd2\xbb\xc6\xf5\xbf\x08\xe9\x51\xe5\xe3\x5e\x62\xd6"
+ "\x37\xba\x83\xa3\x33\x5b\x62\xa1\x7f\xb4\xb9\xef\x1f\xd0\x37\x94"
+ "\x52\xdf\xa8\x89\x39\x4b\xa0\xbf\xc8\x71\x8d\x2b\x1f\xfa\x85\xd1"
+ "\xd2\xc0\xe4\x98\xaa\x59\x43\xd0\x9f\xa4\x5f\x1b\x09\xf4\x93\xc9"
+ "\xc6\xfe\x1a\xa8\x66\x87\x3e\xb2\xe0\x6e\x2a\xdc\xd3\xa8\x21\x7e"
+ "\x31\xc4\x1f\xfb\xc9\x9f\xc4\x35\x14\xf4\x3f\x81\x6b\x27\x80\xcf"
+ "\xd0\x15\xc7\x78\xff\xc8\x87\xab\x9b\xf7\x8f\xe9\xdd\x5d\xda\x3b"
+ "\xdc\xad\x9d\x18\x13\x4d\x6c\xed\x04\xcf\x07\xe1\xb9\x2c\x01\xfa"
+ "\x07\xc5\xb5\x13\x2b\xef\x13\x50\xdf\xc0\x62\xb6\x76\xd2\xe4\xb2"
+ "\x76\xf2\xe3\x46\x22\x47\xdf\x14\x05\xce\x6b\x27\xda\x9a\x7e\x7d"
+ "\x02\xfb\x0a\xf6\x89\xe1\xcb\xaf\xa5\x9a\xc1\xf6\x2f\xd9\x80\xd6"
+ "\x76\x55\x69\x2a\xcd\xdf\xa3\xfb\x63\x93\x55\x86\x7e\x3c\xed\xc0"
+ "\x3b\x01\xe4\x14\x55\xf5\x91\x53\x3d\x22\x1f\x7a\x38\x1f\x80\x87"
+ "\xca\xe7\x2c\x84\xae\xb0\x81\xad\xd5\x23\xfa\xf2\xb4\x9a\x00\x87"
+ "\xda\x49\x85\x9b\x91\xee\x6a\x52\x28\xfa\xf3\x14\x5e\x8d\xf1\x15"
+ "\x80\xd6\x34\x4d\x4e\xde\xb9\x6c\x65\x6b\x8d\xd9\xdd\x24\x04\xe4"
+ "\x92\x1f\xca\x25\xc0\xee\xf8\xe2\x6e\xa0\xfb\xd7\x9c\xee\xe8\x63"
+ "\x0d\x7f\x6d\xaf\x6a\x35\x50\xf6\x1d\x3d\x3d\x20\x97\xac\x9c\xf6"
+ "\xcf\x6d\x0c\x24\xcc\x07\x28\xae\x37\x82\xae\xaf\x05\x7e\xa3\x5c"
+ "\x7a\xd2\x12\x40\x31\x56\x87\xf0\xad\x16\xfd\x4d\x05\xdf\x67\x01"
+ "\xda\xf7\x68\x11\x1b\x81\x45\x2d\xb8\xde\x78\xca\x65\xbd\xd1\xfc"
+ "\xaa\x63\xbd\xb1\xb6\xec\x04\xdf\x1f\xe2\xa2\x3b\x9e\x3e\xd0\x53"
+ "\x18\x9d\x89\x74\x67\xba\x23\x7e\xb8\xb4\x7f\xc6\xf0\xfd\xd1\x3e"
+ "\xf0\x07\x4e\xfb\xa5\x31\x23\xa3\xfd\xbf\xf5\xf3\x95\x7a\xed\x68"
+ "\xaf\xfc\x81\xd3\xfe\x99\xe6\x91\xd1\x3e\xc2\x6d\xfc\x3f\xa4\x3d"
+ "\x8e\x3d\xa4\x71\x87\x34\xe6\x40\x3d\xc6\xf5\xf0\x32\xad\x63\xbc"
+ "\xb1\x4c\x2b\xad\xdb\x02\xcd\x14\x7a\x71\xbe\x49\xb7\x9a\xdc\x76"
+ "\x5e\xf6\xdb\x42\x69\xcd\x16\xed\x7d\xc6\xc7\x7c\xe0\xe3\x7a\x3c"
+ "\xdf\x23\xf2\x10\x74\xce\x0a\x0b\xe8\x85\x69\xd1\x79\x76\x3d\xe8"
+ "\xa4\x3d\x09\xa1\x6e\xf8\x29\x47\x7d\xe2\x17\x4f\x02\x9f\xd3\x39"
+ "\xf8\x2a\xbc\x0a\xfc\xec\x06\x3b\xcb\xda\x4a\xf0\xcc\x6e\x40\x2b"
+ "\xd8\x5f\x3d\x31\xbe\xcb\xc1\x9e\x97\x78\xfa\xa7\x04\x2b\xb3\xb1"
+ "\x06\xe4\xe9\x2e\x57\x9e\x76\x0c\xc0\xd3\x67\xd7\x40\x3f\x95\x8b"
+ "\x76\x30\xe3\xa9\xa9\x97\xa7\x4c\x8f\xbc\xaa\x0d\x46\xbe\x4a\x3c"
+ "\x45\x3d\xc2\x78\xda\xc6\xf5\x48\xaf\x7f\xa3\x57\x1d\x76\x70\x75"
+ "\xe4\xe9\x01\x78\xfa\x6f\x91\x2e\x3c\x8d\x1c\x2e\x4f\x7f\x1b\xe3"
+ "\x6a\x57\x2d\x3b\xe1\x99\x5d\xf5\xdb\xb3\x68\x3b\x39\xdb\x55\x78"
+ "\xdf\x01\x63\x75\xbb\xdf\xee\x74\x8b\x57\xb6\xd4\x6f\x2d\xae\xb6"
+ "\xd4\xb2\x72\x5e\xa7\xdf\x4c\x1c\xbe\x2d\xb5\x8c\xd9\x5f\xef\xe4"
+ "\xf3\x31\xb0\xab\x1d\xb5\xec\x6d\x57\x3b\x6a\x59\x12\xb7\x97\x96"
+ "\xd5\x77\xa4\xa1\x1d\xb5\x2c\x97\xa7\xff\x26\xd0\x39\xdd\x61\x47"
+ "\xf1\xf4\x0e\xf4\xf9\x96\xb1\xcc\x34\x3c\xdb\x69\xf2\xf7\x6c\x3b"
+ "\xa9\x07\xb1\x9d\xd4\xff\x24\xb6\xd3\xb3\xcb\x6f\xe8\x6f\x6f\x75"
+ "\xc8\x32\xcb\xc8\x74\xc8\x73\x6e\xfd\xbf\xdc\xd0\xdf\x43\xd1\xfe"
+ "\xd9\xd2\x91\xd1\x3e\x72\xa9\xf7\xfa\xfb\xf9\x56\x87\xfe\x7e\xbe"
+ "\xd5\xbd\xfe\x7e\xfe\xd9\x1b\xfa\x7b\x38\xfa\x7b\x85\x66\x64\xfa"
+ "\xfb\x79\xad\xab\xfe\x5e\xf5\x7b\xcf\xf4\xf7\xf3\x7b\x46\x5f\x7f"
+ "\x3f\xbf\xdf\x55\x7f\xaf\x4a\xe5\x75\x8a\x3c\x36\x7c\xfd\xbd\x6a"
+ "\xa5\x7b\xfd\xbd\x6a\x8d\xab\xfe\x5e\x35\x8f\xeb\xe9\x55\x3b\xb9"
+ "\xfe\x5e\xb5\x84\xa7\x47\xd6\x39\xa7\x3b\xf4\x37\x4f\xe7\xfa\x7b"
+ "\x55\xc9\xf0\xf4\x77\xc0\xf7\xac\xbf\x03\x07\xd1\xdf\x81\xff\x24"
+ "\xfa\x3b\x7a\xb0\x18\x82\x37\x74\xc8\xa0\x3a\x64\xd5\xfe\x91\xe9"
+ "\x90\xd5\x6e\xe3\x9f\x0d\xad\x43\xd6\x84\x38\x74\xc8\x9a\x10\xf7"
+ "\x3a\x24\xe6\xad\x1b\x3a\x64\x38\x3a\x24\x3a\x6a\x64\x3a\x24\x26"
+ "\xd6\x55\x87\xac\x39\xe9\x99\x0e\x89\x39\x37\xfa\x3a\x24\xc6\xea"
+ "\xaa\x43\xd6\x54\xf0\x3a\xbd\x70\xf3\xf0\x75\xc8\x9a\x3d\xee\x75"
+ "\xc8\x9a\x77\x5c\x75\xc8\x9a\x54\xae\x2b\xd6\x34\x70\x1d\xb2\x66"
+ "\x27\x4f\x7f\x21\xc8\x39\xdd\xa1\x43\x78\x3a\xd7\x21\x6b\x9a\x87"
+ "\xa7\x43\xc6\x7d\xcf\x3a\x44\x39\x88\x0e\x51\xfe\x93\xe8\x90\x17"
+ "\x07\x3d\xff\x3b\xb8\x1c\x5b\x67\x71\xc8\xb1\x75\x16\xf7\x72\x6c"
+ "\xdd\x9a\x1b\x72\x6c\x38\x72\x6c\x8d\x75\x64\x72\x6c\xdd\x1c\x57"
+ "\x39\xb6\xfe\x2d\xcf\xe4\xd8\xba\x3f\x8f\xbe\x1c\x5b\x57\xee\x2a"
+ "\xc7\xd6\x67\xf3\x3a\xbd\x78\x7a\xf8\x72\x6c\xfd\x3a\xf7\x72\x6c"
+ "\xfd\x4b\xae\x72\x6c\xfd\x42\x2e\xaf\xd6\x97\x70\x39\xb6\x7e\x39"
+ "\x4f\x7f\xb1\xd1\x39\xdd\x21\xc7\x78\x3a\x97\x63\xeb\xf7\x0e\x25"
+ "\xc7\xb0\x5f\xd4\xa8\xfb\xf4\x8b\x17\xa5\x7e\xb1\x31\xf8\x53\x83"
+ "\xd4\x2f\x36\x32\x1b\x4d\x30\xac\x56\xbf\x9e\x40\x14\xd9\x18\xaf"
+ "\x05\x64\x84\xee\xb7\xd8\x2f\x74\x6f\xe0\xfe\x12\x55\x23\xc8\xbd"
+ "\x66\x51\x0e\x26\x82\x1c\x6c\x86\x7b\xf4\x65\x36\x6d\xb5\x1a\xe5"
+ "\x17\xee\xd3\xc0\x7b\x2e\x0f\xcd\x63\x30\x5e\x0c\x5b\x67\x77\xea"
+ "\x37\xac\xaf\x74\x88\x7d\xa5\x83\xf7\x15\xe9\xbc\x5c\x52\x33\x15"
+ "\xec\x9b\xb4\x93\xc2\xa3\x7c\x28\xf6\x1f\x76\x0e\x0b\xfa\x0f\xdd"
+ "\xa4\xf5\x37\xc4\x41\x9f\x31\xb7\x12\xf4\x57\x8f\x7d\xc6\x6f\xab"
+ "\xcc\x9f\x76\xc4\xf8\x82\x4c\xe4\xb2\x4f\xa8\x1c\x63\x43\xdf\x53"
+ "\x9b\x40\xf6\xb5\x83\xec\x6b\x77\xf4\x15\x5c\x3b\xef\xd8\xa4\xd5"
+ "\x58\x36\x69\xa7\xf7\x74\x80\xec\x33\xf7\xed\x27\x33\x43\x8a\xdb"
+ "\x51\xf6\xb5\xb2\x7e\xc2\x64\x1f\xf4\x0d\xa1\x03\x64\xdf\x0b\xa2"
+ "\xec\xeb\xd0\xa2\xac\x0f\x2c\x5e\x0d\xb2\x2f\xf2\x3c\x97\x7d\xa2"
+ "\x0d\x77\x27\xca\xbe\x4d\x5a\xf9\xef\xda\x45\xd9\xb7\x12\x65\xdf"
+ "\x11\xe8\x23\x7f\x73\x95\x7d\x7e\xde\xca\x3e\xdd\x72\xd7\x7e\xb2"
+ "\xf1\xa8\x67\xfd\x44\x77\xd2\x5d\x3f\xe9\xd1\x7b\xdb\x4f\x74\xad"
+ "\xae\xfd\x64\xe3\x7e\xb1\xef\x76\x0e\xbf\x9f\x6c\xfc\x7d\x6f\x3f"
+ "\x79\xb1\x6f\x3f\xd9\x58\xe8\xda\x4f\x36\xea\x78\x7f\xd8\x58\xc9"
+ "\xfb\xc9\xc6\x74\xb1\xff\x58\x9c\xd3\x1d\xfd\x84\xa7\xf3\x7e\xb2"
+ "\xb1\xfe\xc6\x7a\xf9\x0f\x4d\xdf\x6f\x5a\x72\x63\xbd\xdc\xdb\x31"
+ "\xe3\xc6\xd6\x91\x8d\x19\xe3\xab\x6f\xcc\xb7\x7b\x4b\xfb\x4d\x79"
+ "\x23\xa3\x7d\xc2\xc2\x1b\x73\x25\xde\xd2\xfe\xa5\xa0\x91\xd1\xfe"
+ "\xe5\x8a\xa1\xc6\x18\xee\x6d\xa9\xcd\xba\xea\xde\x31\xc6\x66\x9d"
+ "\xb4\x3f\xb7\xff\x18\xe3\x95\xb3\xae\x67\xe9\x12\x5f\xea\xbb\x77"
+ "\x76\xa8\xb1\x87\xed\xc6\xd8\x03\x78\x9d\x90\x3b\xb2\xb1\xc7\x2b"
+ "\x7d\xf6\x27\xbe\x3a\xcd\x33\x9b\x6a\xf3\x2c\x77\x36\x95\xcd\xeb"
+ "\xb1\xc7\xe6\x79\xae\x36\xd5\xab\x4a\x11\x1b\x8f\x0e\xdf\xa6\xda"
+ "\x7c\xce\xbd\x4d\xb5\xf9\x92\xab\x4d\xb5\xb9\x82\xdb\x4e\xaf\x06"
+ "\x73\x9b\x6a\x73\x03\x4f\x4f\x0c\x73\x4e\x77\xd8\x54\x3c\x9d\xdb"
+ "\x54\xaf\x6a\x6f\xac\xa3\xff\xd0\x6c\xaa\xa4\xd2\x1b\x7a\xdd\x5b"
+ "\xdd\xf2\xea\xbc\x91\xe9\x96\xe4\xef\x71\xff\xe7\x0f\x5d\xaf\x27"
+ "\xb5\x8d\x8c\xf6\x29\x83\xee\xff\x1c\x5c\xaf\xa7\x2d\x74\xe8\xf5"
+ "\xb4\x85\xee\xf5\xfa\xd6\x83\xae\x7a\x3d\x75\xf1\x0d\xbd\xee\x8d"
+ "\x5e\x4f\x8e\x19\x99\x5e\xdf\x9a\xe9\xaa\xd7\xd3\x3a\x3d\xd3\xeb"
+ "\x69\x63\x46\x5f\xaf\xa7\x05\xb9\xea\xf5\x34\x93\x88\x8d\x29\xc3"
+ "\xd7\xeb\x69\x87\xdc\xeb\xf5\xb4\xa3\xae\x7a\x3d\x4d\x3c\xa7\x96"
+ "\x66\xe1\x7a\x3d\x6d\x1f\x4f\x4f\x55\x3b\xa7\x3b\xf4\x3a\x4f\xe7"
+ "\x7a\x7d\x1b\xb9\xb1\xbe\xfe\x43\xd3\xeb\xe9\x49\x37\x74\x8b\xb7"
+ "\xba\x65\xdb\x08\xc7\x8c\xaf\x59\xbd\xd7\x2d\x99\xa5\x0e\xdd\x92"
+ "\x59\xea\x5e\xb7\x64\x4e\x71\xd5\x2d\x19\x6f\xdf\xd0\x2d\xde\xe8"
+ "\x96\xf4\x8a\x91\xe9\x96\xff\xdd\xec\xaa\x5b\xb2\x9e\xf2\x4c\xb7"
+ "\x64\xae\x1c\x7d\xdd\x92\xa9\x73\xd5\x2d\x59\xf3\x44\x6c\xbc\x34"
+ "\x7c\xdd\x92\x35\xcd\xbd\x6e\xc9\x9a\xe9\xaa\x5b\x32\xad\x5c\x87"
+ "\x64\x2d\xe1\xba\x25\x4b\xc5\xd3\x33\xe2\x9d\xd3\x1d\xba\x85\xa7"
+ "\x73\xdd\x92\xb5\xfc\xc6\xba\xfb\x0f\x4d\xb7\x6c\x1f\x74\xff\xef"
+ "\xe0\xf2\x4d\x9f\xee\x90\x6f\xfa\x74\xf7\xf2\x2d\xfb\x8a\xab\x7c"
+ "\x7b\x3d\xeb\x86\x7c\xf3\x46\xbe\x65\xe9\x46\x26\xdf\xb2\x2b\x5c"
+ "\xe5\x5b\x8e\x87\xfe\x80\xf4\x8f\x8e\xbe\x7c\xd3\xf7\xf1\xff\x90"
+ "\x23\xfa\x00\x7a\xfd\x99\xe1\xcb\x37\xbd\xdd\xbd\x7c\xcb\x19\xe3"
+ "\x2a\xdf\xf4\xa2\xff\x9f\x9c\x50\x2e\xdf\xf4\xa2\xff\x9f\xd7\x97"
+ "\x3a\xa7\x3b\xe4\x1b\x4f\xe7\xf2\x2d\x67\xde\xc8\xd6\xe3\x73\x2b"
+ "\x1c\xeb\xf1\xb9\x8c\x17\x42\xde\x9e\x85\xfd\xd7\xe3\x73\x1f\xc2"
+ "\xf5\x78\x47\x7f\xc9\x39\xc8\xd6\xe6\xb1\xcf\x58\xb8\xff\x9e\x01"
+ "\xd7\xe9\xa7\xec\x59\x78\x63\x9d\xfe\x6a\xae\xd3\xe7\x2a\x5c\xfb"
+ "\xcf\x1b\x1b\x3d\xeb\x3f\xb9\x5b\x47\x7f\x9d\x3e\x37\xd7\xb5\xff"
+ "\xbc\xb1\x5c\xc4\xca\x6b\xc3\xef\x3f\x6f\x3c\xec\xbe\xff\xbc\xb1"
+ "\xc0\xb5\xff\xbc\x21\x8e\x31\xdf\xd0\xf1\xfe\xf3\x46\x08\x4f\xcf"
+ "\x49\x77\x4e\x77\xf4\x1f\x9e\xce\xfb\xcf\x1b\x49\x9e\xd8\x07\x36"
+ "\x55\x69\x3a\xea\xfb\x90\xc6\xdb\xec\xbd\x38\x8f\x17\x71\x3e\x90"
+ "\x7d\xf0\x3c\xd7\x17\xcc\x36\x28\x4d\x98\x33\xa4\x7d\xd0\x2c\xda"
+ "\x07\x51\xfd\xed\x03\xc9\x36\x30\x00\xbe\xf3\x3d\x5a\xa3\x17\xf1"
+ "\x8e\xb6\xc1\xe5\xe1\xda\x06\x5a\x87\x6d\xa0\xef\x63\x1b\xbc\xd0"
+ "\xc7\x36\x60\x78\x6f\x72\xc1\x7b\x3f\xdb\xa0\x17\xef\xa3\x65\x1b"
+ "\xfc\xbb\xe5\xc6\x1a\xbd\xb7\xe3\xce\x37\x72\x47\x36\xee\xdc\xa9"
+ "\xbb\x31\x97\xef\x2d\xed\x7f\x37\xc2\xb9\xfc\xdf\xb7\xdd\x98\x6f"
+ "\xf1\x96\xf6\x3b\x47\xe8\xcb\xe1\x3f\xdc\xc6\x7f\x1a\xda\xbe\xca"
+ "\x9f\xe3\x18\x8f\xe4\xcf\x91\xec\x2b\xc9\x37\x22\xc8\x67\x85\x3e"
+ "\x0e\xae\xcb\x84\xbc\x1e\xc7\xe2\x0c\x28\x8d\xcd\x27\x88\x2e\x19"
+ "\x6d\xae\x5d\x6f\x87\x27\x3a\xdb\x5c\x79\xb3\x24\x7b\x2b\x1c\x6d"
+ "\x31\xb0\xad\xd0\xae\x92\xc6\x20\xe8\xd7\x6a\xd0\xfd\xc3\x33\x13"
+ "\xe6\xe0\x98\xa5\xc7\xaf\x34\xfd\x9f\x77\xbc\xf2\xe6\x9c\x91\x8d"
+ "\x57\x76\xc5\xbb\xda\x5b\xf9\x5f\x7b\x66\x6f\xed\xba\x34\xfa\xe3"
+ "\x95\x7c\xe2\x6a\x6f\xe5\x57\xf3\x3a\xfd\xc7\xd9\xe1\xdb\x5b\xf9"
+ "\xef\xb8\xb7\xb7\xf2\xff\xe2\x6a\x6f\xe5\x67\x72\xbb\x2a\xdf\xc4"
+ "\xed\xad\x7c\x03\x4f\xff\x8f\x66\xe7\x74\x87\xbd\xc5\xd3\xb9\xbd"
+ "\x95\xdf\xe6\xa1\xbd\x95\x39\x02\x7b\x6b\xee\x0f\xc7\xde\xba\xfb"
+ "\x3a\xb7\xb7\x0c\x6e\xe3\xbf\x39\xe9\x9d\xf4\x3e\x7a\x67\xce\x0d"
+ "\xbd\x83\xb2\xa6\x80\x8c\x4c\xef\x14\x9a\x86\xa4\x7d\xb6\x13\xed"
+ "\x51\xe6\x8b\x74\xb7\xcf\x48\x98\xe3\x35\xed\x41\xd6\x17\x26\xff"
+ "\x90\xe9\x6e\xd8\x3b\x32\xba\x17\xbb\x8d\x7f\x7c\xc3\xd6\x1a\x8a"
+ "\xf6\x45\xda\x91\xd1\xbe\xa4\xde\x7b\x5b\x6b\x77\xf9\xa7\xbd\xb6"
+ "\xd6\xee\xf2\xbe\xb6\x16\xda\x56\x8b\xad\xdc\xe6\x7a\x1d\x6c\xa5"
+ "\xed\xeb\xc1\xee\x4a\x20\xc4\xd8\x7c\x90\x64\x83\xed\xb5\xfd\x22"
+ "\xd8\x5f\xb1\x60\x7f\xd9\xf6\x88\xf6\xd7\xee\x07\x5c\xed\xaf\xb7"
+ "\xde\x19\xd0\xfe\xf2\x73\xd8\x5f\x36\xb0\xad\x7a\xf6\x24\xcc\xc9"
+ "\xbd\xe8\x64\x8b\xad\xed\x6f\x8b\x75\xeb\x4b\x33\xbb\x67\x26\xcc"
+ "\xed\x01\x7b\x6c\x30\x5b\x8c\x61\x62\x00\x7b\xec\xff\x0f\x5b\xac"
+ "\xb8\x64\x64\xb6\xd8\x6e\xe2\x6a\x8b\x95\xae\xf3\xcc\x16\xdb\xbd"
+ "\xc5\xed\xdc\x97\xd7\xb6\xd8\xee\x6c\x57\x5b\xac\x34\x42\xc4\xcc"
+ "\x53\xc3\xb7\xc5\x4a\x1f\x72\x6f\x8b\x95\x3e\xea\x6a\x8b\x95\x8a"
+ "\x67\x4f\x4b\x63\xb9\x2d\x56\xaa\xe5\xe9\x6f\x2d\x71\x4e\x77\xd8"
+ "\x62\x3c\x9d\xdb\x62\xa5\x89\x1e\xae\x8d\xa5\xdb\x40\xa7\x7f\xff"
+ "\xfb\x29\x07\x5b\x1b\x1b\xad\xfd\x94\xda\xeb\x7c\x6d\x6c\xcf\xd0"
+ "\xf3\x5f\x37\x6c\x82\x01\x64\x4d\x69\xf6\xc8\xf4\xd2\x7f\xc7\xde"
+ "\xb0\x09\xbc\xa5\xfd\x7f\x8d\x70\xee\xab\xac\xd5\x7b\x9b\xe0\x8f"
+ "\xfb\x1d\xf3\x2f\x7f\xdc\x3f\xbc\xf9\x97\x3f\xde\xed\xaa\xff\xdf"
+ "\x1e\x58\xff\xdf\x98\x7f\x19\x86\xce\xff\xef\xfd\x23\xd3\xf9\x7f"
+ "\xb0\xb8\xea\xfc\xbd\x2b\x3d\xd3\xf9\x7f\xdc\x38\xfa\xf3\x2f\x7f"
+ "\x4c\x75\xd5\xf9\x7b\x17\x89\x38\x89\x1e\xbe\xce\xdf\x3b\xcb\xbd"
+ "\xce\xdf\xfb\x80\xab\xce\xdf\xab\xe4\xba\x7d\x6f\x24\xd7\xf9\x7b"
+ "\x83\x79\xfa\xdb\x51\xce\xe9\x0e\x9d\xcf\xd3\xb9\xce\xdf\x1b\x3b"
+ "\xbc\xf5\xae\x80\xeb\x74\xbd\x2b\xf0\x9f\x64\xbd\xeb\x9d\xe6\x1b"
+ "\x7a\xc7\x5b\xbd\xb3\x37\x75\x64\x7a\xe7\xdd\x48\xef\xf5\xce\x7b"
+ "\x21\x0e\xbd\xf3\x5e\xc8\xf0\xf4\xce\x9f\xdf\x72\xd5\x3b\xfb\x66"
+ "\xde\xd0\x3b\x23\xd5\x3b\x7f\x0a\x19\x99\xde\xf9\x73\x1f\xff\x47"
+ "\xef\x79\xe8\xff\xe8\xcf\x6e\xfd\x1f\x79\xaf\x77\xfe\xdc\xc7\xff"
+ "\xd1\x7b\xa2\xff\xa3\x77\xbd\xf0\x1b\xf2\xde\x1e\xf7\x7a\xe7\xbd"
+ "\x3e\xfe\x8f\xde\x4b\xe5\xfa\xe5\x3d\xd1\xff\xd1\x7b\xa2\xff\xa3"
+ "\x77\x1b\x9d\xd3\x1d\x7a\xe7\x5d\x27\xbf\x21\xef\xdd\xf0\x7f\xf4"
+ "\x83\xdb\x87\xb9\x7f\x04\xf2\xef\xaf\x2a\x87\xfc\xfb\xab\xca\xfd"
+ "\x3e\xcc\xff\xd9\xea\xba\x0f\xf3\x2f\x13\x6f\xec\xc3\xf4\x46\xbe"
+ "\xbd\x37\x42\xbf\x48\xff\xb3\xc8\x55\xbe\xfd\xf5\x7d\xcf\xe4\xdb"
+ "\xff\x1c\x1d\x7d\xf9\xf6\x3f\x0d\xae\xf2\xed\xaf\xa5\xbc\x4e\xfb"
+ "\xbd\x90\x6f\x7f\x7d\xcd\xbd\x7c\xfb\xab\xde\x55\xbe\xfd\x35\x92"
+ "\xcb\xb1\xbf\x1e\xe0\xf2\xed\xaf\xf1\x3c\x7d\x7f\xa3\x73\xba\x43"
+ "\xbe\xed\x77\x92\x6f\x7f\xad\x18\xde\xba\xa6\x57\x76\xf5\x35\x58"
+ "\xd7\x1c\x2d\xbb\xfa\x7a\x5f\xd7\x7c\x7f\xde\x8d\x79\x34\x6f\x6c"
+ "\xea\xbf\x36\x8c\xcc\xa6\xfe\xdb\x7e\xef\x75\xca\xc1\x3c\x87\x4e"
+ "\x39\x98\xe7\x6e\x7d\x67\x3b\xe0\x2e\x1b\x6c\xe2\xac\x8b\x44\xf1"
+ "\x3a\xae\xef\xd4\xd7\x10\x3d\xae\xef\xac\x97\xd6\x77\x0a\x45\x3b"
+ "\xfb\xa0\x9f\xab\x9d\xfd\x7f\xf5\x03\xd9\xd9\x68\x5f\xdb\xc1\x76"
+ "\xb6\xf5\x5d\xd7\xf9\xed\xc0\xba\xa8\xdb\xaf\x34\xf3\xca\x9e\x84"
+ "\xb9\xc3\xd5\x45\x05\x9b\xb9\x2e\xca\xff\xc1\xeb\xa2\xf7\xd3\x47"
+ "\xa6\x8b\x3e\x68\x70\xd5\x45\x1f\x2e\xf0\x4c\x17\x1d\x7c\x66\xf4"
+ "\x75\xd1\xc1\x28\x57\x5d\xf4\x61\xa8\x88\x95\xd9\xc3\xd7\x45\x1f"
+ "\x4e\x74\xaf\x8b\x3e\x9c\xe2\xaa\x8b\x0e\xb6\x71\x9d\xf3\xe1\x7c"
+ "\xae\x8b\x3e\x24\x3c\xfd\xff\x86\x3a\xa7\x3b\x74\x11\x4f\xe7\xba"
+ "\xe8\xc3\x25\xc3\x9b\xe3\x19\x77\x9d\xce\xf1\x28\xff\x49\xe6\x78"
+ "\x3e\xaa\xf4\x5e\x26\x7e\x9c\x5d\xdd\x7b\x7e\xe3\xe3\xec\x7e\xf3"
+ "\x0c\x09\x60\x6f\xb7\xf3\x75\xee\xde\x79\x06\xd3\x69\x51\xfe\x7d"
+ "\x2c\x73\x95\x7f\xe5\x6e\xe5\xdf\x60\x6b\xd9\x38\xaf\x60\x07\xd9"
+ "\x68\x2b\x1c\xc1\x5a\x76\xc2\x0f\x5d\xe6\x7d\x38\x42\xff\xca\x87"
+ "\xaa\x5d\x65\xde\xe1\x87\x3c\x93\x79\x1f\xff\xca\xad\xcc\xf3\xfa"
+ "\x1c\xc7\xc7\x11\xae\x32\xef\xf0\x0c\x11\x1f\x0b\x86\x2f\xf3\x0e"
+ "\x8f\x71\x2f\xf3\x0e\xfb\xb9\xca\xbc\x8f\x4d\x5c\xb6\x1d\x9e\xcb"
+ "\x65\xde\xc7\x16\x9e\x5e\x3e\xdf\x39\xdd\x21\xf3\x78\x3a\x97\x79"
+ "\x87\xe7\x0f\x26\xf3\x68\xf6\xda\xcc\x5c\xb9\xb0\x0f\xae\x03\x50"
+ "\xc7\x29\x80\x8d\x72\xf8\xbf\x12\x78\x3c\x11\xfe\xaf\x73\xd7\xff"
+ "\xcc\x7e\x6b\x33\x85\x34\xa8\xb3\x9c\xc8\x8c\xe6\xef\xca\xcb\xa7"
+ "\xda\xb0\xde\xe2\x99\xb5\xb5\x99\x01\xb6\x71\x0b\x05\x1a\x43\x80"
+ "\x2f\x99\x2c\x36\x26\xe4\xc7\xf3\x41\x9a\x04\xe2\x7f\x51\x76\xb8"
+ "\x59\xca\x07\xf5\xf5\x6f\x92\x1d\x7e\x0b\xcb\x80\xba\x9a\xa1\x2d"
+ "\x4b\xdc\xd6\x15\xca\x0a\x7f\x7b\x3a\xd9\x62\xa3\xdf\x96\xaf\x6f"
+ "\x27\xcd\xb2\x8a\x87\x02\xda\xc6\x2d\xa4\x29\x11\x04\x6d\xb9\x7d"
+ "\x53\xcd\x0a\x2c\x13\xe3\xe9\xc2\xb3\x60\x7c\x66\x87\x3a\x26\xaf"
+ "\x23\xf2\x9c\xf6\x71\x4a\x90\x13\x63\x52\x2c\xb4\x75\x83\x0d\xea"
+ "\x0c\xd8\xfc\x68\x7a\x83\xe2\xdd\x7c\x48\xb3\x13\x35\xc6\x26\xc5"
+ "\x32\xc0\x9e\x85\xfa\x54\x3c\x5c\x04\xf9\x07\xaa\xc3\x6b\x7f\x22"
+ "\x21\x63\xee\xa6\xa6\xe1\xe1\xa6\x22\xd7\x1d\x1d\x03\xb6\x4e\x27"
+ "\xe5\xf7\x00\xed\x34\x44\x3e\xd0\xf3\x61\x7e\x67\xb0\xf3\xef\x4a"
+ "\x8c\x6d\x9c\xb2\x8b\xc8\x77\x08\xe3\x94\x87\x93\x58\xfc\x61\x73"
+ "\x57\xc6\x91\x28\x93\xec\x1e\x16\x3b\x14\xe3\x5a\x62\xfc\x77\xc0"
+ "\x0d\x81\xf4\xa4\x43\x89\x84\xf4\xe5\x45\x5c\xd4\xba\x95\x9a\xf8"
+ "\x35\xeb\xa2\x37\xbc\x14\xaf\x99\x19\x35\x9e\x2c\xdd\xb0\x41\xb3"
+ "\x6e\xe5\xfa\x57\x34\xce\x4f\x7e\xaa\x89\x5a\xb3\x69\xe5\xf3\xb1"
+ "\xd1\xb3\xd6\xad\xd2\x8d\xc7\xcd\x28\x4e\xf5\x08\xc2\xba\x08\x19"
+ "\x47\x32\x8b\xfe\x9d\x90\xdf\x4d\x22\x0a\xac\x17\x7c\xaf\x4d\x8a"
+ "\x61\x8a\x31\x3c\xe5\x90\x27\x05\xe4\xe3\x8e\xe4\x71\x90\xb7\xc2"
+ "\x5a\x0c\xf5\x2a\x82\x7a\x43\x1d\xa1\xce\x7f\x57\x4b\x75\x96\x30"
+ "\x91\x82\x98\x48\x6e\x07\x0c\xfe\xfd\xa1\x00\xeb\xb8\x5f\x52\x1a"
+ "\x81\xed\xc3\x7e\x22\x83\xb4\x2c\xa6\xcb\xf4\x6b\x33\xe1\xdd\xa5"
+ "\x12\xc6\xf0\x5d\x9a\xb3\x76\x49\x17\xf6\x13\x1a\xf3\x73\xde\xa7"
+ "\x3e\x09\x79\x46\x2b\x23\x3c\x86\xea\xdf\x53\x1d\x31\x54\x3f\x61"
+ "\x73\xd5\x50\x8f\x36\x48\xcf\x33\x91\x1e\x16\xf3\x18\x63\xff\x62"
+ "\x2c\x54\xac\x33\xb4\x0b\x74\x29\x2d\xa7\x69\x22\xf6\x33\xdf\x8f"
+ "\x10\x32\x3f\x37\x19\x15\x97\x49\xb8\x8d\xf6\xd0\xac\xf7\x23\x6a"
+ "\x2d\x16\x12\xb0\x55\xb7\x8a\x8e\x3d\xb2\x2b\xc0\xb6\x26\x1a\x63"
+ "\xb8\x0a\x59\x9f\x9b\x68\x56\xdd\xce\x67\xee\x26\x81\x50\xb6\xc5"
+ "\x29\x96\xab\x62\x78\xfc\xff\x3b\xe3\x3f\xf2\x11\x63\xb4\x72\x3e"
+ "\x7e\x32\xff\x50\x7c\x7f\x3e\xf6\xe2\xef\x6d\x81\x1c\x01\x2c\x50"
+ "\x55\x7e\x5d\xb8\x9d\xd3\x11\xfb\x6e\x47\x4a\x0c\xb9\x8f\xd1\xee"
+ "\x13\x9b\x90\x93\xbf\x4f\xc8\xce\x6f\xa5\xd9\xf9\xf5\x40\xb3\x98"
+ "\x9c\x04\xa2\x59\x61\x0f\x24\xfa\xcb\x24\xd4\xac\xcf\xaf\xf3\x93"
+ "\xa5\xca\xc0\x1e\x91\x83\x3e\x09\x05\x99\x11\x2a\xf6\xf7\x18\xa4"
+ "\xe3\x27\x60\xad\x3d\xb9\x89\x90\x6f\xe7\x11\x9f\x22\x78\x6f\x78"
+ "\xed\xf9\x84\xe9\x7f\x9a\xf1\x49\x6a\x31\xbc\x8b\x31\x7a\x87\xf7"
+ "\x7e\xa5\xd2\x6d\xbf\xeb\x6d\x77\xc1\x92\x81\xdb\x5d\x69\x11\x72"
+ "\x0a\x42\x85\xec\x82\x18\x9a\x5d\xb0\xb4\x7f\xbb\x0b\x96\xf0\x76"
+ "\x8f\x69\x1f\xfd\x76\x57\x96\xf3\x76\x57\x26\x7a\xd7\xee\xa3\xc4"
+ "\x83\x76\xbb\xe1\xf7\xd1\x36\x68\x37\xf0\xbb\x00\xf8\x5d\x30\x00"
+ "\xbf\x0b\x44\x7e\x4f\x68\x1a\xfd\x76\x1f\x3d\xc0\xdb\x7d\x54\xe7"
+ "\x65\xbb\xdd\xca\x3f\x47\xbb\x0d\x6e\xf8\x5d\xd5\x2c\xe4\x18\x80"
+ "\xdf\x06\xe0\xb7\x61\x00\x7e\x1b\x44\x7e\x4f\x3c\x3e\xfa\xed\xae"
+ "\xe2\xfe\x0f\x33\xaa\x62\xbc\x6b\x77\x95\xd9\x83\x76\xbb\xe1\xf7"
+ "\xa7\x8d\xd0\x6e\xe0\xb7\x01\xf8\x6d\x18\x80\xdf\x06\x91\xdf\x0f"
+ "\x6e\x1f\xfd\x76\x7f\xca\xe3\x3f\x67\x7c\x1a\xe9\x5d\xbb\x3f\x75"
+ "\xbb\xff\xc5\xd1\xee\x42\x37\xfc\xae\xae\x17\x72\x0a\x81\xdf\x85"
+ "\xc0\xef\xc2\x01\xf8\x5d\x28\xf2\x7b\xd9\x63\xa3\xdf\xee\xea\x12"
+ "\xde\xee\xea\x08\xef\xda\x5d\xed\x76\xff\xbb\x93\x3c\x6f\x00\x99"
+ "\xdd\x8f\xe7\xc6\xc4\xb9\xe4\xde\xcb\xd8\xfe\xda\xf9\xd4\x2f\xbf"
+ "\x61\xc2\xd6\x54\x99\x4d\x95\xdf\x38\x01\xc6\x72\x05\x69\x42\x4c"
+ "\x80\x89\xf8\x42\x5b\x63\x68\x4e\xb1\x0e\x7f\x05\x28\xc7\x06\xb2"
+ "\xdf\xae\xca\xaf\xef\xce\x5e\x1b\xf3\xfa\x6a\xa2\x49\x31\x93\xc0"
+ "\xda\x64\x13\x49\xd6\x51\x73\x2d\xf9\x9a\xf8\x99\x88\x1c\xe7\xcb"
+ "\x3e\x6d\x3b\x40\xd6\xc7\x51\x0a\x65\xcf\xc2\x31\x66\x4e\x0b\x09"
+ "\x05\x9b\x38\x95\x82\xfe\xc8\x15\x88\x06\xca\x0f\x45\x5a\x42\xd9"
+ "\x71\x01\x4b\x89\xec\xc3\xe7\xad\x04\xe9\x89\xb4\x85\xf1\x68\x28"
+ "\xa3\xab\x85\x90\x5f\x2f\xe3\x74\x2d\x58\x3d\x5c\xba\xd6\xf0\xf5"
+ "\xbf\xec\x7c\xb3\xd1\xd4\x4d\xc0\xb6\x0c\xc4\x33\xf7\x90\xbe\xbf"
+ "\x56\xd7\x0e\x63\x91\x9a\x08\xaa\xcf\x37\x09\xa0\xb3\x86\x57\x6e"
+ "\xad\x5b\xff\xd7\x4e\xf2\x34\x02\x64\x66\x3f\xac\x39\xe8\x6d\xdc"
+ "\x4f\xfd\x0a\x22\x38\xbd\x0b\x96\x4f\x68\x1c\xd3\x3e\x30\xbd\x0b"
+ "\x22\x6c\xa0\x73\xec\xaa\x82\xa5\x9e\xd3\xdb\x58\xe8\x4a\xef\x82"
+ "\xd0\x6b\x43\x6f\xa3\x18\xff\xb4\x40\xe7\x4a\x6f\xe3\x0c\x4e\xef"
+ "\xda\x4a\xaa\x2f\x88\x14\x40\x57\x0e\xb3\xdc\x72\x0f\xe8\x0d\xf8"
+ "\xee\xaf\xc3\x1c\xf4\x3e\x36\x03\xe8\x2d\xe2\xbb\x00\xf0\x3d\xa1"
+ "\xc9\x0d\xbd\x01\xdf\x05\x80\xef\x82\x61\xe0\xfb\x98\x5f\x1f\x7a"
+ "\x5f\x23\x7c\xd7\x89\xf3\x7f\x05\x7d\xf0\x5d\xb7\x93\xd3\xbb\x0e"
+ "\xc6\xb9\x05\x80\xef\x82\x61\xe2\xfb\x58\xa8\x07\xfa\x03\xf0\xdd"
+ "\x5f\x77\x3a\xe8\x7d\x7c\x27\xf5\x33\x88\xf8\x36\x00\xbe\x27\x1e"
+ "\x1f\x98\xde\x06\xc0\xb7\x01\xf0\x6d\x18\x06\xbe\x8f\x6f\x71\xa5"
+ "\xb7\xe1\x1a\xe1\xfb\x38\xf7\x31\x99\x6d\xe8\x83\xef\xe3\x0a\x4e"
+ "\xef\x63\x65\x54\x6f\x00\x7c\x1b\x86\x89\xef\xe3\x25\x1e\xd0\x1b"
+ "\xf0\xdd\x5f\x67\x3b\xe8\x5d\xaf\x00\x7a\x8b\xf8\x36\x00\xbe\x1f"
+ "\xdc\xee\x86\xde\x80\x6f\x03\xe0\xdb\x30\x0c\x7c\x7f\x76\xa1\x0f"
+ "\xbd\xaf\x11\xbe\x3f\x3b\x20\xd2\xbb\x0f\xbe\x3f\x8b\xe7\xf4\xfe"
+ "\x4c\x0d\xf4\x06\x7c\x1b\x86\x89\xef\xfa\x40\x0f\xec\x04\xc0\x77"
+ "\x7f\x5b\xc1\x41\xef\x13\xf1\xd4\xaf\x50\xc4\x77\x21\xe0\x7b\xd9"
+ "\x63\x03\xd3\xbb\x10\xf0\x5d\x08\xf8\x2e\x1c\x06\xbe\x4f\x3c\xeb"
+ "\x4a\xef\xc2\x6b\x84\xef\x13\x62\xfc\xcb\xc2\x3e\xf8\xae\x6f\xe6"
+ "\xf4\xae\xcf\xa4\xfa\x42\xc0\x77\xe1\x30\xf1\x7d\x22\xd5\x1b\xfb"
+ "\x64\x53\x21\x51\xba\xd2\xfc\xf3\xd6\xab\x67\xa3\x7c\x7e\xec\xfb"
+ "\xb1\x51\x3e\x37\x0c\x6c\xa3\x7c\x1e\xc1\x69\x7e\xc2\xe6\x9d\x8d"
+ "\xf2\xb9\xdb\xf3\x0f\x83\xd9\x28\xfd\x69\xde\xb0\xfc\xea\xd9\x29"
+ "\x0d\x0b\xbe\x1f\x3b\xa5\x21\x70\x60\x3b\xe5\x8b\x6a\x4e\xf3\x2f"
+ "\x74\xde\xd9\x29\x0d\x6e\xfd\x1f\x0c\x66\xa7\xf4\xa7\xf9\xc9\xba"
+ "\xab\x67\xab\x9c\x7c\xff\xfb\xb1\x55\x4e\xa6\x0f\x6c\xab\x9c\x0c"
+ "\xe3\x34\x6f\x68\xf6\xce\x56\x39\xd9\xe8\x8d\xad\xd2\x9f\xe6\x5f"
+ "\xce\xbf\x7a\xf6\xca\x97\xb3\xbe\x1f\x7b\xe5\x94\x75\x60\x7b\xe5"
+ "\x94\x38\xfe\x39\x15\xe1\x9d\xbd\xf2\xa5\x07\xe3\x9f\xfe\xf6\x4a"
+ "\x7f\x9a\x37\x1e\xb8\x7a\x36\x4b\xe3\x5b\xdf\x8f\xcd\xd2\x18\x3b"
+ "\xb0\xcd\xd2\xa8\xe5\x34\xff\xb2\xda\x3b\x9b\xa5\xd1\x6d\xfc\x93"
+ "\xc1\x6c\x96\xfe\x34\xff\x2a\xe4\xea\xd9\x2d\x5f\xdd\xfc\xfd\xd8"
+ "\x2d\xa7\x4d\x03\xdb\x2d\xa7\x0d\x9c\xe6\xa7\xc3\xbc\xb3\x5b\xbe"
+ "\x9a\xeb\x8d\xdd\x82\xb4\x46\x9a\xa3\xad\xc2\x69\x6e\xb2\x51\xff"
+ "\xfc\x7d\x3d\x60\x8f\xf8\x01\xdd\xfd\xda\x88\xbc\x10\x69\xde\xc0"
+ "\x69\x6e\xf7\x2f\xd6\x01\x7d\x62\x90\x66\xac\x1d\xff\x50\xfb\xdb"
+ "\xb3\xf3\x1b\xa9\x9c\x40\x5b\x94\xa4\x45\x76\xc6\xd7\x96\x46\xfc"
+ "\x35\xc9\x5b\xe1\x7f\xd3\x05\xcc\xa3\x49\xce\x38\x0d\x6d\xf4\xc1"
+ "\x35\x0a\x9b\x7e\x6d\xa0\xdd\xaf\x28\x17\x9e\xfd\x8a\x4e\x5b\x1d"
+ "\xd8\x03\xb6\x04\x7d\x51\x1d\x64\x6c\xdb\x47\x8c\xb6\x2a\x52\xdb"
+ "\xf0\x37\x22\xf8\x17\xc7\xdd\x67\x23\x5a\xfa\x0f\x6d\x50\x75\xbc"
+ "\x89\xd8\x57\xa9\x55\xc6\xc4\x4a\xc0\xc5\x7b\x24\xbc\x95\x5e\xa6"
+ "\xdf\x68\x55\x3d\x7e\xbb\xeb\xec\x7e\xc5\x4b\xec\xfa\xd2\x3c\x9b"
+ "\xdf\xee\xf2\x77\x12\x4c\x72\x95\x95\x68\x63\x9b\x29\xcd\x79\x9e"
+ "\x28\x72\x9a\x88\x72\xc7\xf3\x44\xb5\xa3\x89\x04\x56\x37\x37\x90"
+ "\x9a\xf3\x95\xa4\xa6\xfd\x24\xa9\xb9\x0c\x57\x37\x5c\x02\x5c\xa9"
+ "\x27\x49\x75\x1b\x21\x8b\xa1\x96\x29\xcd\xd4\xfc\xe3\x46\x12\x54"
+ "\x6d\x6b\x20\x9a\xe7\x08\xb9\x28\x3b\x73\x5a\x15\x49\x82\xe8\x37"
+ "\x6a\x42\x57\xa9\xe5\xf0\x4c\x81\xe9\x46\x9b\x99\x54\x37\x5b\xf1"
+ "\xf9\x07\xf0\x5c\x91\xd2\x0c\xe5\x0b\x95\xe8\xcb\xd0\x5c\x9d\x7a"
+ "\x14\xda\x37\x15\xe9\xdc\x2a\xd9\x64\x39\xdd\x24\x74\x07\xb0\x19"
+ "\x31\x13\x4e\x39\x66\x8a\xbb\x87\x8b\x19\x13\xf7\xff\xfe\xa2\x7a"
+ "\x12\xd0\x7b\xaa\xf0\x62\x44\xe0\x93\x27\xcf\x50\xdc\x0f\x86\xeb"
+ "\x33\xb5\x96\x2a\x82\x6b\xd6\xe1\xaf\x10\xb2\xc8\x4e\x08\xd2\x04"
+ "\xd7\x92\x9f\xd4\x91\x00\xdc\xa7\x26\xfc\x43\x3b\xc9\xd8\x6c\x26"
+ "\x5b\x6c\x50\xd7\x8b\xd6\xde\xba\xd6\xa6\xd7\x12\x78\x36\xb5\x36"
+ "\xc6\x44\x54\x3a\x12\x88\x74\x06\x5b\xb4\xe1\xc9\x56\xe2\xbb\xde"
+ "\x42\x29\xd2\x18\x69\x8b\x74\xc6\xf2\x24\xda\x1b\xa3\xcc\x24\xc5"
+ "\x4a\x02\x8d\xc9\xf0\x9b\x48\xcd\x46\x72\x89\x98\x64\x67\xcc\xd4"
+ "\x6f\x2a\x01\x7c\xc4\x23\x26\xe0\x9e\x00\x0e\x26\xd1\x8c\xaf\xf6"
+ "\x17\x41\x7b\x71\x6d\x7f\x78\x6d\xfe\xda\x93\xf5\x8f\x7e\x36\xa1"
+ "\x03\xcf\x05\x11\x1c\xcf\xdf\x54\x53\xff\x82\xd0\x1e\xb0\xf5\x38"
+ "\x9e\xc7\xb4\x0f\x8d\xe7\x82\xe5\x0e\x3c\x7f\x7d\xd2\x81\xe7\x6f"
+ "\x0e\xba\xc7\xf3\x37\x53\x38\x9e\x0b\x74\xd7\x27\x9e\x9b\xde\x19"
+ "\x1c\xcf\x4d\xd9\xee\xf1\x5c\x10\x23\xd9\xbb\xa3\x83\xe7\xa6\xe6"
+ "\x6b\x87\xe7\x82\x08\xef\xf0\xdc\x54\xee\x8a\xe7\xaf\xeb\x38\x9e"
+ "\xbf\x4e\xf7\x0e\xcf\xdf\xb8\xf5\x7f\x3c\x98\xbd\xed\x84\x67\x51"
+ "\x3e\xb7\x18\x00\xcf\x20\x9f\x0b\x44\xf9\x3c\xa1\xc9\x03\x3c\x3b"
+ "\xc9\xe7\xe6\xb7\x1d\x78\x6e\xd1\xbb\xc7\xf3\xd9\x73\x22\x9e\xaf"
+ "\x53\xf9\x7c\x76\xcb\xe0\x78\x3e\xbb\x7c\x10\x3c\xb7\x4a\x63\x89"
+ "\xd1\xc1\xf3\xd9\xfd\xd7\x10\xcf\x5e\xca\xe7\xb3\xb9\xae\x78\x6e"
+ "\x2e\xe1\x78\x6e\x5e\xea\x1d\x9e\x5b\xca\xbc\x19\xcb\x38\xf0\x6c"
+ "\x10\xe5\xf3\xb9\x58\xea\x6f\x00\xf9\x6c\x10\xe5\xf3\xc4\xe3\x43"
+ "\xe3\xd9\xe0\x24\x9f\xbf\x7d\xc5\x81\xe7\x73\xcf\xba\xc7\x73\xeb"
+ "\xfb\x1c\xcf\x86\xeb\x54\x3e\xb7\x2e\x1e\x1c\xcf\xad\x21\xee\xf1"
+ "\x6c\x88\x91\xc6\x69\xa3\x83\xe7\xd6\xf4\x6b\x87\x67\x83\x97\xf2"
+ "\xb9\x35\xd2\x15\xcf\xdf\xea\x38\x9e\xbf\x9d\xe1\x1d\x9e\xcf\x25"
+ "\x7a\x33\x4e\x74\xc2\xb3\x28\x9f\xdb\xe6\x01\x9e\x41\x3e\x1b\x44"
+ "\xf9\xfc\xe0\x76\x0f\xf0\xec\x24\x9f\xcf\xff\xca\x81\xe7\xb6\x59"
+ "\xee\xf1\xfc\x8f\x2c\x11\xcf\xd7\xa9\x7c\xfe\xc7\xb4\xc1\xf1\x7c"
+ "\xde\x36\x08\x9e\x5b\xa5\x31\xf0\xe8\xe0\xf9\x1f\x4b\xaf\x21\x9e"
+ "\xbd\x94\xcf\xff\x08\x75\xc5\xf3\xf9\x30\x8e\xe7\x73\x16\xef\xf0"
+ "\xdc\xe6\x36\xfe\xeb\x60\x63\x70\x07\x9e\x0b\x45\xf9\xfc\x9d\x8a"
+ "\xfa\x17\x82\x7c\x2e\x14\xe5\xf3\xb2\xc7\x86\xc6\x73\xa1\x93\x7c"
+ "\xbe\x30\xc5\x81\xe7\x8b\x76\xf7\x78\xbe\xf8\x1b\x8e\xe7\xc2\xeb"
+ "\x54\x3e\x5f\xb8\x30\x38\x9e\x2f\x54\xbb\xc7\x73\x61\x8c\x34\xbf"
+ "\x30\x3a\x78\xbe\x38\xe3\xda\xe1\xb9\xd0\x4b\xf9\x7c\x91\xb8\xe2"
+ "\xf9\x42\x20\xc7\x73\x5b\x85\x77\x78\xfe\x4e\x3d\x3a\xf3\x1b\xed"
+ "\x2a\x9c\xdf\xe8\xc6\xf9\x0d\xc7\xde\xbf\x98\x80\x3a\x8e\xe7\x1e"
+ "\xc0\x73\x81\x33\x9e\xbf\xec\x3b\xbf\xf1\xdd\x39\xa1\x17\xcf\x97"
+ "\xfa\xe1\x59\x00\x3c\xf7\x30\x3c\x5f\xba\x59\x9a\xdf\x30\xb6\x95"
+ "\x00\x4e\xce\x13\xe3\x12\xc0\x72\x8e\x88\xe5\x2f\x01\xcb\x40\x43"
+ "\x01\x68\x5c\xdd\xd8\x40\xc2\xcd\x9c\x96\xdd\x40\x63\xc1\x19\xc7"
+ "\xdd\xad\x72\xc4\x2f\xe2\x56\xc2\x70\xcd\x7a\xc0\x6e\xdc\x31\x52"
+ "\x93\x00\xd7\x66\xb8\x92\xe1\x22\xc7\x48\x75\x2b\x60\x77\x8d\x33"
+ "\x76\xeb\x44\xec\x9a\xdf\x1e\x1c\xbb\xe6\xcc\x6b\x37\x97\x61\xe6"
+ "\xf3\x5f\x5f\x46\x04\x86\x3f\x75\x86\x1a\x13\x1b\x44\x7c\x9e\x27"
+ "\xe1\x36\x12\x40\x97\x69\x27\xa9\x22\x48\xe0\xab\x76\x22\xd7\x3f"
+ "\x4f\x02\xf5\xa7\xa0\xdd\x52\xff\x6d\x22\xaa\x2a\xeb\xdf\x48\x75"
+ "\x7b\x03\xa9\xbe\x7c\x94\x54\x0b\x70\x9d\x87\x0b\xea\x1a\x1e\xed"
+ "\xdc\x6e\xb3\xd8\xee\x4b\x6f\x41\x59\x33\xdc\xb7\xfb\x52\x2a\x6b"
+ "\x77\x14\xb4\xbb\xdb\xd1\x6e\x23\xf4\x03\xe0\xcf\x54\x41\x9c\x0f"
+ "\x09\x37\x13\xdf\x0d\x36\x4a\xbb\x45\xfc\x23\x7f\xaa\xea\xad\x24"
+ "\x5c\x07\x3c\x5b\x05\xf8\x6f\x2e\x23\x29\x49\x80\xff\x6e\x2b\xe2"
+ "\xce\x6c\x4c\xbd\x02\xf8\x37\x7f\x40\x81\x7e\x3d\x88\xff\x2f\x11"
+ "\xff\xdf\x99\x04\x86\xff\xef\x76\x7a\x87\xff\x76\x0f\xf0\xef\xc9"
+ "\x7c\x48\xa7\x0a\xe7\x43\xba\x71\x3e\xc4\xb1\x07\x74\x08\xfc\x3b"
+ "\xcf\x87\xb4\x3b\xe1\xdf\x32\x08\xfe\x2d\x37\x4b\xf3\x21\xdf\x3f"
+ "\xfe\x3b\x86\xc0\x7f\xc7\x20\xf8\x1f\xed\xb9\x8f\x8e\x6b\x88\x7f"
+ "\xcb\x10\xf8\xb7\x78\x80\xff\x82\x08\xef\xf0\xdf\xd1\x07\xff\xed"
+ "\x22\xfe\xdb\xbd\xc4\x7f\xa7\x27\xf8\xf7\x60\xfe\xc4\x8a\xf8\x07"
+ "\xf9\x5f\x50\xef\xb4\x17\x78\x28\xfc\x3b\xc9\xff\x4e\x27\xfc\x77"
+ "\x0d\x82\xff\x2e\x09\xff\xd7\x81\xfc\xbf\x3c\x04\xfe\x2f\x0f\x86"
+ "\xff\x51\x9e\x2b\xb9\x7c\x0d\xf1\xdf\x35\x04\xfe\xbb\x3c\xc1\xbf"
+ "\x97\xf2\xff\x72\x1f\xfc\x77\x8a\xf8\xef\xf4\x12\xff\x56\x0f\xf0"
+ "\xef\xc9\x7c\x4b\x8f\x0a\xe7\x5b\xba\x71\xbe\xc5\xb1\x27\x7c\x08"
+ "\xfc\x3b\xcf\xb7\x58\x9d\xf0\xdf\x3d\x08\xfe\xbb\x6f\x96\xe6\x5b"
+ "\xbe\x7f\xfc\x5f\x19\x02\xff\x57\x06\xc1\xff\x68\xcf\xad\x5c\xb9"
+ "\x86\xf8\xef\x1e\x02\xff\xdd\x1e\xe0\xdf\xe0\xa5\xfc\xbf\xd2\x07"
+ "\xff\x56\x11\xff\x56\x2f\xf1\xdf\xe3\x09\xfe\x3d\x98\x9f\x11\x10"
+ "\xff\x20\xff\x0d\xf5\x4e\x67\x03\x86\xc2\xbf\x93\xfc\xef\x71\xc2"
+ "\xbf\x7d\x10\xfc\xdb\x25\xfc\x5f\x07\xf2\xdf\x36\x04\xfe\x6d\x83"
+ "\xe1\x7f\x94\xe7\x62\x6c\xd7\x10\xff\xf6\x21\xf0\x6f\xf7\x04\xff"
+ "\x5e\xca\x7f\x5b\x1f\xfc\xf7\x88\xf8\xef\xf1\x12\xff\x82\x07\xf8"
+ "\xf7\x60\x3e\x47\x2e\x63\xf3\x39\xdd\x38\x9f\xe3\x38\x23\x32\x04"
+ "\xfe\x9d\xe7\x73\x04\x07\xfe\xe5\xc4\x3d\xfe\xe5\xe4\x66\x69\x3e"
+ "\xe7\xfb\xc7\x3f\x1d\x02\xff\x74\x10\xfc\x8f\xf6\xdc\x0d\xbd\x76"
+ "\xf8\x97\x93\xc1\xf1\x2f\x27\x1e\xe0\xbf\xd0\x4b\xf9\x4f\xfb\xe0"
+ "\x5f\x10\xf1\x2f\x78\x87\x7f\xb9\x6c\x74\xe6\x7f\xe4\xf2\xfd\x38"
+ "\xff\x23\xa8\xf2\xeb\x7b\x0c\xab\x03\x85\xec\xdd\x75\x01\x32\x0d"
+ "\xb1\xa9\x8a\x72\x8d\xf1\x16\xf2\x64\x27\xf0\x44\xd7\x49\x9e\xeb"
+ "\x0c\xc4\x58\x96\xe5\x14\xc6\xff\x2e\x67\x44\xe1\xb2\x65\x4f\x25"
+ "\x3b\xd6\x13\x85\xdd\xbf\x38\x0e\xd3\x8c\x2d\x56\x82\x6d\xde\x82"
+ "\x34\x38\xef\xa0\x01\xce\xc1\xd1\xef\xb4\x81\x45\x69\x90\xa7\xdb"
+ "\x44\x9a\x01\x2f\xd5\xcd\x26\xa0\xfd\x66\x86\x2d\xe4\x05\xd4\x67"
+ "\x69\xf1\x45\xa2\xb0\x7d\xa3\x9e\x0a\x3c\x0e\xf2\x7b\x99\xc8\x82"
+ "\x9b\xa9\x80\xbc\x44\x1e\x21\x5f\x35\x9b\x29\x85\x7c\xef\xd4\x02"
+ "\xbe\x6d\xdf\x68\xa7\x16\x41\xbe\x51\x9f\x97\x91\xcb\xd9\xfa\x07"
+ "\xfc\x2e\xaa\x6e\x04\x5a\x6e\x97\x79\xc9\x27\xb9\x27\xe7\x5f\x86"
+ "\x9e\xa7\x90\x2b\x96\xe3\x3c\x85\xa0\x2a\x58\xea\x19\x9f\x0a\x22"
+ "\x5c\xce\xb4\x8e\x3a\x9f\x7c\x6c\x9e\xf1\x49\xf1\x8c\x2b\x9f\x46"
+ "\x79\xfe\x40\xae\xd0\x70\x3e\xf9\x58\x38\x9f\x7c\xe6\x79\xc7\x27"
+ "\x85\x57\xfb\x7f\xfb\x8d\xa7\xe5\x63\x15\x38\x9e\x06\x3e\x79\xd8"
+ "\x9f\x0a\x1a\x5c\xce\xe0\x8e\x3a\x9f\xc6\x94\x7a\xc6\xa7\x31\xf6"
+ "\x3e\x7c\x1a\xdd\x71\xae\x7c\x4c\x25\xe7\xd3\x18\x03\xe7\x93\xa2"
+ "\xd9\x3b\x3e\x8d\xf5\xe0\xfc\x87\x07\xe3\x3e\xf9\xb8\xbd\x38\xee"
+ "\x13\x60\xdc\xe7\x19\x9f\x0c\x11\x2e\x67\x86\x47\x9d\x4f\xe3\x16"
+ "\x79\xc6\xa7\x71\x7b\x5c\xf9\x34\xca\xe3\x31\xf9\x38\x1d\xe7\xd3"
+ "\xb8\xf9\x9c\x4f\x63\xb3\xbd\xe3\xd3\xb8\x03\xa3\x32\x3e\x91\xfb"
+ "\x2e\xc5\xf1\x09\xf0\xc9\xc3\xfe\x64\x68\x70\x39\xe3\x3c\xea\x7c"
+ "\x52\x5a\x3c\xe3\x93\xef\xe2\x3e\x7c\x1a\xdd\x71\x83\xdc\x97\xc7"
+ "\x03\x96\x2b\xdb\x38\x9f\x94\x73\xbc\xe3\x93\x6f\xe4\xe8\xd8\xd1"
+ "\xe3\x6d\x68\x47\x0b\x60\x47\x7b\xc6\xa7\xc2\x08\x97\x33\xd9\xa3"
+ "\xce\xa7\xf1\x06\xcf\xf8\x34\xbe\xd3\x95\x4f\xa3\x6c\xdf\xca\xc7"
+ "\x97\x73\x3e\x8d\xdf\xc9\xf9\xe4\xdb\xe8\x1d\x9f\x26\x78\xb0\xff"
+ "\x73\xe0\x73\x58\xfd\x6d\x3e\x55\xd9\xf5\x65\xf3\xa9\x16\x7a\xc6"
+ "\x2b\xd5\x5b\x57\xd7\xe6\x53\xc5\x72\x5e\xa9\xc2\x38\xaf\x26\x64"
+ "\x7a\xc7\x2b\x95\x5b\xff\x8f\x43\x9d\xdf\xea\x6f\xf7\xf9\x2f\xbd"
+ "\xbe\xec\x3e\x3f\x0f\xe5\x9f\xff\xe2\xab\x6b\xf7\xf9\x8b\xf2\xcf"
+ "\x4f\x94\x7f\x7e\x5e\xca\x3f\x7f\x0f\xe4\xdf\xc0\xe7\xbe\xfa\xdb"
+ "\x7e\x81\xe4\xfa\xb2\xfd\x02\x4a\x3c\xe3\x55\xc0\x95\xab\x6b\xfb"
+ "\x05\x54\x70\x5e\x05\xe4\x71\x5e\xf9\x9b\xbc\xe3\x55\xa0\xca\xdb"
+ "\xf3\x62\xfd\xed\xbf\x89\xd7\x99\xfd\x37\xd1\x43\xfb\x6f\xe2\x55"
+ "\xb6\xff\x26\x8a\xf6\xdf\x44\xd1\xfe\x0b\xf4\xd2\xfe\x9b\xe8\x95"
+ "\xfd\xd7\x87\x57\x62\xbf\xba\x29\xe2\xfa\xb2\x01\x27\x59\x3d\xe3"
+ "\xd5\x4d\x4f\x5d\x5d\x1b\xf0\xa6\x60\xce\xab\x49\x66\xce\xab\x49"
+ "\x73\xbd\xe3\xd5\x4d\x6e\xe3\xdf\x0e\x75\x3e\xad\xbf\x1d\x78\xb3"
+ "\xe2\xfa\xb2\x03\x83\x3c\x1c\xff\x06\xd9\xaf\xae\x1d\x18\x24\x8e"
+ "\x7f\x83\xc4\xf1\xef\x4d\x5e\x8e\x7f\x6f\xf6\x60\xfc\xeb\xc9\xbc"
+ "\xdf\xe4\x28\xb4\x01\xed\xd9\xf9\xf5\x01\x40\xff\x80\x44\x22\xef"
+ "\x0e\x06\x7e\xa9\x80\x5f\x5b\x35\xa4\x27\x1b\xf8\x65\xb6\x91\x27"
+ "\x37\x9e\xa1\xb5\x6d\x76\xd2\x0d\xbc\xba\x02\x76\xa0\xd1\xdc\x8a"
+ "\x67\xf4\x7e\xd6\x24\xbf\xc5\xbe\x6c\x63\x20\x41\x7e\x21\xfd\xed"
+ "\xaa\xa9\xa0\xfb\x8a\xe3\x18\xff\x54\xa5\x79\xb6\xec\xe2\x25\x8b"
+ "\x2f\x9c\xa1\x1b\x4c\x94\xd6\xc4\x58\xd1\x77\x64\x60\x4d\x4c\x03"
+ "\x09\x6f\x26\xbe\x9a\xa7\x91\x2f\xb7\xbc\x83\xe9\x46\x73\x03\x41"
+ "\xbf\x9f\x6c\x0e\xfc\x8c\x36\xc8\xf6\x85\x56\x85\xfe\x9b\xf0\x5c"
+ "\xa1\xe4\xa3\xc9\x78\x3e\x8f\xf1\xbf\xef\x9c\x2a\xe3\xff\x17\xda"
+ "\xc0\x02\x3c\x9f\x38\xea\xb6\xe0\x2d\x6c\xfe\x4f\x38\xa3\x9e\x2a"
+ "\xd5\x71\x43\x2c\xa5\x50\xc7\x49\xb5\x16\x33\xc1\x7a\xd6\x5a\xca"
+ "\x49\x4a\x3c\x09\xac\xed\x6e\x25\xc9\x16\x6a\xae\x4d\x3d\x47\xc2"
+ "\x3b\x71\x5d\x00\xf1\x74\x4b\x27\xe7\xf7\x2d\x1a\xe1\x8c\x76\x2a"
+ "\xfc\xb6\xd5\xd6\x11\x12\xb0\x15\x68\x6d\x23\x72\x76\x5e\x53\x4e"
+ "\x94\x40\xaf\x18\x63\x6a\x13\xd2\xae\xce\x68\x3b\x85\xf4\x8c\x81"
+ "\xe7\xf3\x7a\xd7\x1b\xfc\x8b\x8f\x63\x1a\xd2\x16\xf7\x99\x1a\x75"
+ "\x66\x96\x47\x7a\xce\x79\x97\x4a\x8c\x89\xdd\xa4\xd6\x46\x08\xe0"
+ "\xa3\xfa\xd3\x88\x06\xc0\xd7\xcd\x5e\xca\xed\xc9\xba\xd1\x99\xaf"
+ "\x9c\x52\x81\x76\xab\x3d\xbb\x60\x29\xaf\xe3\x98\xf6\xa1\xf1\x55"
+ "\x10\xe1\xc0\xd7\x94\x67\x47\x86\xaf\x29\x7e\xa3\x8b\xaf\xd1\xb6"
+ "\x5f\xd5\x0d\x23\xc3\xd7\x94\x67\x38\xbe\xd4\xa9\x1c\x5f\x53\x16"
+ "\x39\xf0\x35\xa6\xfd\xea\xe1\x4b\x1d\xc2\xf1\x35\xb9\xcd\x3b\x7c"
+ "\x4d\x71\xeb\x87\x76\x78\xf3\xac\xc1\x33\xd0\xd6\x06\x7c\x89\xf2"
+ "\x6b\x42\x93\x07\xf8\x72\x92\x5f\xb7\x1e\x1c\x19\xbe\x6e\x5d\x37"
+ "\xca\xf8\x1a\x65\x9b\xfb\xd6\xb9\x23\xc3\xd7\xad\x7f\xe1\xf8\x9a"
+ "\x6a\xe2\xf8\xba\x75\xaf\x03\x5f\x13\x9a\xae\x1e\xbe\xa6\x66\x73"
+ "\x7c\x4d\x5d\xe4\x1d\xbe\x82\xbd\xf2\x7f\xd5\x7f\x7c\x30\x3d\x1d"
+ "\xc7\x07\xf6\x6c\x83\x28\xbf\x26\x1e\x1f\x1a\x5f\x06\x27\xf9\x35"
+ "\x7d\xda\xc8\xf0\x35\xad\x66\x74\xf1\x35\xda\xe3\x84\x69\x79\x23"
+ "\xc3\xd7\xf4\x9b\x39\xbe\xa6\x85\x71\x7c\x4d\x57\x39\xf0\x35\xf1"
+ "\xf8\xd5\xc3\x57\x70\x1b\xc7\x57\xf0\x5e\xef\xf0\x35\xdd\xbd\xff"
+ "\xe7\x61\xcd\x6b\x6b\x9a\x71\x4c\x03\xf8\x12\xe5\xd7\x83\xdb\x3d"
+ "\xc0\x97\x93\xfc\xd2\x6c\x19\x19\xbe\x34\xb3\x46\x19\x5f\xa3\x3c"
+ "\xb6\xb9\xcd\x3a\x32\x7c\x69\x5e\xe2\xf8\xba\xad\x84\xe3\x4b\x13"
+ "\xeb\xc0\xd7\x83\xdb\xaf\x1e\xbe\x6e\x5b\xc4\xf1\x75\x9b\xca\x3b"
+ "\x7c\x69\x3c\xf0\xff\xea\xc9\x7c\xfc\x9d\xf3\x71\x1c\x66\xcf\x2e"
+ "\x14\xe5\xd7\xb2\xc7\x86\xc6\x57\xa1\x93\xfc\xba\xe3\xf4\xc8\xf0"
+ "\x75\x87\x7e\x74\xf1\x35\xda\xe3\xb1\x3b\x22\x46\x86\xaf\x3b\x4e"
+ "\x70\x7c\xdd\x41\x38\xbe\xee\xa8\x76\xe0\x6b\xd9\x63\x57\x0f\x5f"
+ "\xb7\xef\xe5\xf8\xba\x3d\xd6\x3b\x7c\xdd\xe9\x81\xff\x1f\x4f\xd7"
+ "\x11\x66\x96\x8d\x6c\x0c\x39\xf3\xd1\x91\x61\x6c\xc6\xa5\xeb\x7b"
+ "\x0c\x39\xe3\x83\x91\x61\x6c\xe6\x43\x1c\x63\x33\xa2\x38\xc6\x66"
+ "\x86\x5e\x9b\x31\xe4\x8c\x40\x8e\xb1\x3b\xeb\xbc\xc3\xd8\xcc\x51"
+ "\x5c\xff\xd0\xaa\x46\x36\x8e\xbc\x6b\xcf\xc8\x30\x76\xd7\x33\xd7"
+ "\xf7\x38\xf2\x2e\xcd\xc8\x30\x76\x57\x21\xc7\xd8\x8f\x2a\x39\xc6"
+ "\xee\xda\x79\x6d\xc6\x91\x3f\x8a\xe7\x18\xfb\x91\x97\xeb\x36\x5a"
+ "\xaf\xce\xbf\x0c\xbc\x6e\x73\x8f\x6e\x64\x63\xc9\x7b\x7c\x47\x86"
+ "\xb1\xbb\xdf\xbf\xbe\xc7\x92\x77\xa7\x8f\x0c\x63\xf7\xc8\x38\xc6"
+ "\xee\x0e\xe1\x18\xbb\xdb\x7a\x6d\xc6\x92\xda\x06\x8e\x31\x6d\x9e"
+ "\x77\x18\xbb\x27\x69\xf4\xd6\x9b\x42\xea\x47\x36\x9e\x0c\x59\x37"
+ "\x32\x8c\x85\x4c\xbb\xbe\xc7\x93\x3f\x6e\x1d\x19\xc6\x42\xa2\x39"
+ "\xc6\x7e\x9c\xcb\x31\x16\xb2\xfc\xda\x8c\x27\x7f\x3c\x8f\x63\xec"
+ "\x1e\x9b\x77\x18\x0b\x31\x8d\xde\x3a\xd9\x7d\x73\x47\x36\xa6\xbc"
+ "\xf7\xd8\xc8\x30\x76\xef\xd6\xeb\x7b\x4c\x79\xef\xa2\x91\x61\xec"
+ "\xde\xa3\x1c\x63\xb3\x2c\x1c\x63\xf7\x96\x5f\x9b\x31\xe5\xac\x12"
+ "\x8e\xb1\x59\x91\xde\x61\xec\xbe\xf9\xa3\xb7\xbe\x37\xdb\x30\xb2"
+ "\x71\xe5\xec\x07\x46\x86\xb1\xd0\xb3\xd7\xf7\xb8\x32\x74\xdf\xc8"
+ "\x30\x36\x7b\x16\xc7\x58\x68\x04\xc7\xd8\xec\x19\xd7\x66\x5c\x19"
+ "\xaa\xe0\x18\xbb\xcf\x3b\x7f\x14\xf2\xd9\xfd\xfc\x5f\xad\x59\x9f"
+ "\xb0\x32\x76\x4d\x94\x66\xcd\xfa\xf8\xb8\x8d\x9a\x4d\x6b\x36\x47"
+ "\x3f\x3c\xf3\xa5\x10\x4d\x5c\xa2\x26\x6e\xcd\xfa\x17\xc4\x84\xa8"
+ "\xf1\xe4\xe9\xe8\xd8\x95\x89\x98\x02\xb9\x5f\x58\xbf\x2e\x7a\x7d"
+ "\xbc\x26\x2e\x7a\xe3\x4b\x6b\xe2\xa2\xf1\xff\x4d\x9a\xd5\x1b\xe2"
+ "\x20\x61\x55\xf4\x9a\x84\x68\xcd\xf3\x2f\xad\x5e\x1d\x1d\xb7\x69"
+ "\x3c\x59\xfc\x52\x6c\xfc\x1a\x5d\x6c\xb4\x66\xfe\xe2\x47\x67\x2d"
+ "\x5d\xf0\xaf\x4b\x1f\x79\x04\x83\x93\x39\xc5\x26\x0b\xa6\xd9\xa5"
+ "\xb9\x80\x39\x45\x8b\xfc\xa7\x7b\x6a\xc1\x5a\xc4\xf8\xb8\x3b\xda"
+ "\x49\xe0\xf6\x38\xa2\xc8\x6a\x27\x4a\x7d\x3b\x51\x69\xd6\x92\x30"
+ "\x9a\x75\xca\x9c\xd3\x4e\x82\x68\xce\x5a\xb5\xa0\xbf\x29\x94\xea"
+ "\x27\xeb\xcc\xbe\x36\x0d\xa4\x05\x0a\x59\x3d\x4b\xe0\x9d\x20\xa0"
+ "\xad\x82\xea\xa7\x98\x9a\xe4\x3f\x8d\x32\xfb\xda\x49\xca\x39\x22"
+ "\xa7\xe3\xef\x6f\xf8\x93\x60\x96\x1f\x8a\x27\xf8\x27\x23\xf2\x9f"
+ "\x98\xe1\x6a\x24\xf2\x39\xd9\x70\x19\xe0\x2a\x83\xab\x0e\xae\x06"
+ "\xb8\xda\xe0\xb2\x12\xf9\x03\x0a\xb8\x54\x70\x05\xc1\x15\x0c\xd7"
+ "\x0c\xb8\x4a\xe0\x2a\x87\x0b\xf2\x3e\xd0\xca\xcb\x79\xc0\x42\xe4"
+ "\x0f\x6a\xe0\x5a\x08\x57\x24\x91\xff\x0b\xe4\xff\x97\x39\x70\xed"
+ "\x87\x6b\x11\x5c\x11\x70\x61\x7a\x3a\x5c\xf8\xbe\x95\x3f\x9b\xbb"
+ "\x1c\xae\x3c\x02\xf5\x1c\xfa\x9a\x7b\x00\x2e\xf8\xee\xdc\x66\x22"
+ "\x7f\x68\x3e\x5c\x50\xdf\x87\xac\x7d\xf2\x85\x39\xfd\xbf\x7c\x88"
+ "\x32\x93\x02\xb6\xde\x66\x62\x31\xf0\xe4\x73\x16\xd3\x34\xe2\x43"
+ "\xb3\xec\x44\x77\x0f\x91\x9d\x97\xcf\x99\x62\x4c\x47\x39\x73\x53"
+ "\x28\x8b\xe9\x08\xf7\x48\xb3\xae\xed\x73\xd4\x26\xa2\x53\x63\x4c"
+ "\xb3\xe1\xe1\x6d\x8e\x5a\x7c\x3f\xc2\x24\x53\x29\x59\x0c\xb8\xed"
+ "\x75\xb9\x34\x25\xa2\x80\xc5\x7e\x03\x1a\xe2\xb9\x2c\x9a\x59\xa7"
+ "\xa4\xca\x2a\x03\xf6\xf9\xf2\xcd\x58\xaf\x9f\x5c\xe2\xfd\x0b\x9e"
+ "\x43\xdd\xcc\x7e\x6b\xd5\x50\x4f\x05\xde\xd3\x2c\x9b\xa6\xdb\x6f"
+ "\xb7\x0e\xff\xbf\x52\x18\x5d\x42\xb3\x77\xe7\xe1\x38\xbb\x3c\xf9"
+ "\x3f\x49\x13\xbc\xd7\xed\xb7\x67\xae\xe6\xe9\x00\xda\xc4\xcb\x96"
+ "\x43\x1d\xd2\xa5\xb2\xba\xfd\xd6\x6a\x68\xde\x9e\x48\xaa\x07\x0c"
+ "\x89\xe5\x09\x50\x1e\xcd\x2e\x0e\x83\x7c\x26\x4c\xa7\x86\xe8\x03"
+ "\xd2\xff\xf0\xdb\x48\x73\x76\x9b\xf0\x37\x60\x2b\xb1\xb0\xfb\xb4"
+ "\x30\xc2\x7f\x03\x09\xca\xba\x36\xf9\x03\xaf\xdd\x57\x47\x64\xe5"
+ "\x4f\x63\xbd\x1f\x58\x92\x52\x47\x05\x4d\xb2\x0f\x7c\xff\x81\xa7"
+ "\x7a\xbf\x3b\x65\x4f\x04\xc6\x4f\x15\xb6\xcf\x6e\xc5\x18\x7c\xf8"
+ "\x2e\xd6\x2d\x7f\x12\x51\x14\xff\x3b\x51\x62\x1b\xbb\xb6\x3f\x90"
+ "\x24\xc5\xa1\xc3\x77\xe4\x90\xff\x89\xa7\x52\xa8\x53\xd9\xbf\xa2"
+ "\xac\x3d\x3f\x69\xe3\x34\x7d\x60\xaf\x49\xe6\xcb\x62\xe5\x69\xee"
+ "\x60\xb4\xbc\x24\x3e\x37\x23\x3f\xb1\x7c\x41\x5f\x9a\x8b\xf7\x18"
+ "\xe7\x2e\x00\x50\xab\x49\x9e\x71\x80\xd3\x68\x77\x1e\x96\x83\xf9"
+ "\x85\x9c\x22\xf8\x7f\x4e\xae\x00\xed\xb5\xa7\x11\xad\x66\x3d\x09"
+ "\x6b\x92\x3f\x38\xc5\x9e\x75\x2c\x02\x9e\x43\xbf\x3b\xb6\x1c\xf2"
+ "\xef\x63\xf4\xd6\x17\x87\x9a\xe4\x0f\xaa\xe0\xd9\xf2\xde\xd8\x97"
+ "\x9c\xce\x32\x21\xeb\x58\x6c\xd7\xf6\x07\xc3\x4c\x32\x8d\x55\x6a"
+ "\x03\x93\x71\x8e\x7c\x22\x4f\x1f\x9c\x63\xf6\x3d\x16\xdb\x93\x40"
+ "\xeb\x76\x9c\x22\x04\xbe\x49\xbb\x2f\xd3\xea\xa4\x25\xd4\x9a\xf3"
+ "\xbf\x08\xa9\x8e\x6c\x24\x29\x2b\x49\xf0\x84\xad\xd4\x1c\x6e\x27"
+ "\x01\x13\x1a\x03\x68\xcd\x92\x46\x90\xd1\x9d\x24\xa9\x8e\xb6\xd6"
+ "\xea\x3e\x20\x49\x67\x89\x6a\xcb\x1a\x12\x94\xb2\x84\x9a\x93\xab"
+ "\xa9\xd5\x98\xd8\x48\x6a\x2d\x70\xe9\x6a\x20\xdf\x09\xb8\x3e\x20"
+ "\x29\xaf\x90\xff\xc7\xde\xfb\xc0\x37\x55\x64\x8b\xe3\x27\xb7\x29"
+ "\xa4\xb5\x7f\x02\x56\x2d\x5a\x31\x60\xd5\xa2\x2d\x54\x17\x5d\x74"
+ "\x8b\x44\x28\x58\x14\x68\x85\x8a\x55\x10\x8a\xb6\x58\xb0\x40\x2c"
+ "\x05\x02\x16\x5a\x22\xba\xa5\x16\xa8\x2b\xcf\xad\xd2\x7f\x2e\x75"
+ "\xb7\x2a\x2e\xd5\x65\x9f\xf5\x7d\xf0\x99\x5d\xaa\xaf\x8b\x40\xba"
+ "\xfb\xf0\xf3\xed\xbe\x1f\xae\x91\x57\xd9\x3e\xb6\x40\xb4\x81\x84"
+ "\x36\xc9\xfc\xce\x99\xb9\xb7\xbd\x49\x13\xa4\xca\xba\xff\xac\x5e"
+ "\x72\xef\xcc\x99\x33\x67\xce\xbf\x39\x33\x77\xee\x8c\x76\x0e\xfa"
+ "\xd3\x4d\x67\x21\xea\x88\xe9\x2c\xa6\x9d\x82\x92\x5c\xe6\x39\x7c"
+ "\x88\xe0\x3e\x84\x4c\x8f\x23\x76\xe3\x29\xd0\xd6\xcd\xa7\x6f\xcb"
+ "\x3e\x85\x7a\xa4\xa5\x37\xfa\xaa\xdc\xf3\xdb\x46\x75\xf5\xac\x65"
+ "\x1e\x57\xc5\x0f\xa3\xec\xf0\x23\xab\x5f\x5b\x88\x66\x3a\x37\x14"
+ "\xdb\x4b\x30\xbe\x6d\xf5\xf1\x8b\x3d\xa4\xe7\x3f\x04\xf4\xc5\xa0"
+ "\xe4\x53\x9e\x23\xba\x1e\xf5\xe7\x87\xc9\x99\x1e\xe6\x22\x78\x6a"
+ "\x37\xf2\xa8\x40\x6e\x7f\x41\x98\x09\xb4\x58\x87\xc9\xae\xb9\xfe"
+ "\xa8\x4a\x86\x24\x93\x61\x4a\x7d\x32\xcc\x4e\xbb\x66\x2c\xd7\x0b"
+ "\x1f\xcf\x9b\x58\x42\xb0\x98\x8e\xf2\xbf\x3e\x51\xd0\xf7\xc3\x62"
+ "\x4a\x93\x7d\x29\xd9\xed\x16\x1f\xd9\x75\xf9\x41\x93\x37\x7a\x77"
+ "\x03\x93\x98\x1b\xf5\x79\x12\xeb\x89\x8f\x9a\xe3\x61\x6e\xdf\xb6"
+ "\xba\x54\xf4\x97\x51\x74\x4e\xaa\x80\x9f\x34\x1d\xf3\x8d\x86\xb5"
+ "\xfc\x3e\x85\xea\xf1\xd5\xe6\x57\x91\x6f\xcd\x6c\x27\xf8\xe5\x55"
+ "\xdb\x8b\xd0\xf7\x6e\xdb\x5d\x45\x76\xe8\x8b\xae\xcf\x38\xff\xf2"
+ "\x6b\x64\x33\xf1\x0c\x75\x8c\x55\x2e\x37\xf6\xe3\xb1\x40\xb8\x5d"
+ "\x9a\xa4\x65\x58\x9e\x55\xd6\xa5\xca\xb2\x3f\x25\x74\x73\x12\xf1"
+ "\x4e\x8b\x74\x15\x63\x7a\xf8\x71\x69\x52\x25\x7d\xa3\x89\xcf\x7b"
+ "\xf8\x59\x92\xd2\xa4\x17\x84\xce\x1c\x34\xf9\x3d\x4b\xc4\x3f\xb4"
+ "\x49\xf4\x03\x22\xbe\x98\xf4\xf6\x80\x5d\x08\x3d\x16\xf6\x5d\x87"
+ "\x34\xdd\xde\xed\xb3\x84\xf9\x10\x4e\x73\x5c\xf0\x41\xea\x8d\xf8"
+ "\x7d\xae\xab\x62\xd2\x31\xbb\x46\x5b\xe8\x27\xcf\x8a\xdf\x55\xd1"
+ "\xb9\x95\x48\x4b\xd8\x09\xe9\xce\x08\xfc\x1d\x8e\xbf\xd1\x07\xda"
+ "\xa9\xaf\xe5\x78\x2f\xa3\xfb\x57\xae\x64\x8e\xf4\xd9\x40\x67\x54"
+ "\x22\xdf\xef\x4c\xb4\xc3\xe2\x9d\x84\xa7\x82\xce\xee\xc4\x34\x82"
+ "\xc1\xf4\x34\x3b\xe4\x6e\x11\xf8\x27\xda\x9d\xe4\xb3\xfc\xf1\x2f"
+ "\x11\xf8\x05\x5e\xc2\xa7\xe0\xae\x7d\x89\x75\xcb\xb8\xcb\x14\xdc"
+ "\xdb\x30\x4d\xc1\x9f\xbe\xa2\xbf\x8e\x06\xac\x23\x4a\xdd\x86\x97"
+ "\x5f\x62\x4e\xc2\x81\x79\xfb\xed\x50\x90\x47\x79\x5b\x31\x8d\xca"
+ "\xaa\x74\x2a\xec\x40\x16\xe2\x38\xc4\x71\x74\xda\x61\xa9\x9f\xdf"
+ "\x40\x1e\x45\x2b\xbe\x56\xe0\xba\x4b\xa7\xe0\x1a\xc0\xa3\xe8\xd4"
+ "\x27\xd5\xb2\x4c\x09\x6f\x14\xe1\x45\xf8\x49\x76\x78\x6c\xa2\xba"
+ "\xed\xc8\xf3\x2c\x39\x2f\x1b\xf9\x9e\xac\xa6\x59\xf6\xab\x4d\x58"
+ "\x5e\x23\xeb\xeb\x28\xf2\x59\x4a\x3e\x9d\xeb\xc9\x2a\x6e\xd3\x93"
+ "\xdd\xa0\x7f\x04\xb4\x33\x03\xe2\xa9\x09\xf0\x8f\x5a\x82\xf3\x55"
+ "\xdc\x36\x9d\x9f\x6b\x7a\x25\xeb\x42\x18\xab\xdf\x59\x9e\x12\xdc"
+ "\x8d\x69\x47\x95\x33\x45\xb7\x23\x8c\x5d\xba\x2d\xe4\x9e\x89\x9b"
+ "\xc6\x80\x64\xab\xb1\x53\xbc\x4a\x3a\x97\x66\x4b\x70\x82\xad\xc6"
+ "\x07\xbe\xba\x7c\xab\x71\x13\xb3\x9e\x90\x7e\xf4\x00\x9d\x11\x3d"
+ "\xb4\x3e\xf0\x47\x7c\xfd\x1f\xeb\xc5\x38\xae\xe4\x36\x7e\x76\xfa"
+ "\x69\x29\x6d\xb3\xcd\xf1\x15\xb7\x3d\xbc\x5f\x41\xf9\x2f\x62\xdc"
+ "\x47\xb1\x1f\xc6\xdb\x05\x55\x92\x88\xff\x7c\x08\x5b\x47\xe9\x14"
+ "\x1b\x62\x5c\x5a\xaf\xca\x63\x75\xf9\x66\xc1\xbb\xb4\x3b\x89\x8f"
+ "\x9c\x5e\xcf\xbd\x56\xa2\xd9\x57\x93\x6f\xa6\x36\x94\x9a\x99\xcf"
+ "\xe6\x71\x59\xe9\xac\x5d\xc3\x5a\x8a\x5b\xd3\xae\xc8\xac\x05\x86"
+ "\xb6\x6d\x1e\x62\x1b\xf8\xf8\x17\x63\xf3\xd3\x8e\x6b\xf3\xcd\x74"
+ "\xb6\xf2\x8e\x4d\xe1\xba\x69\x35\xcc\xda\x33\x3a\xdf\xea\xaa\x48"
+ "\x9b\xa4\x9c\x5d\x3b\x34\xbc\x69\x93\x94\xb6\xd7\xc9\x6d\xc7\xba"
+ "\xf8\x3b\xeb\x09\xd5\xfc\x4c\x6d\x7c\x4e\x0b\xb9\xd6\x09\xfd\x4b"
+ "\x13\x95\xc5\xb6\x1b\xeb\x15\x3e\x79\x1c\x74\xa6\xf8\x88\x93\xd2"
+ "\xe4\xf0\xcc\x12\x2b\xf0\x7d\xf2\xb7\xd5\x35\x0d\x91\x2e\xbe\xfe"
+ "\xe5\x08\x8e\x0b\x32\x3d\x1f\x30\xe1\x17\x27\xa7\xcc\x91\xf1\x51"
+ "\x9e\x22\xab\x3a\x39\x5e\x1f\x7a\x1d\x93\x27\x5e\x44\xbb\xf4\x41"
+ "\xda\xf5\xe9\x37\x6f\xd7\xe4\xa6\xc1\xed\xba\x3b\xfc\xd2\xb6\xeb"
+ "\xee\x90\xeb\xbf\x55\xed\x32\x0c\x6e\xd7\xdd\xbf\xfe\xe6\xed\xba"
+ "\xbb\x2c\x48\xbb\x3e\xbd\xc4\xed\xea\xbc\x88\x76\xa5\x0e\x6e\xd7"
+ "\x94\x6d\xdf\xbc\x5d\x53\x72\x06\xb7\x6b\xca\xaf\x2f\x6d\xbb\xa6"
+ "\xec\x1f\xb2\x3f\xdc\xbe\xdb\x21\xfc\xa1\x71\xc9\xd0\xfd\xa1\x31"
+ "\x79\xb0\x3f\xbc\xe7\x85\x01\x7f\x78\xcf\xc6\x6f\xe4\x0f\xb7\x2f"
+ "\x97\x63\x8d\x7b\x66\x0e\xf2\x87\x95\xcb\x53\x83\xfb\xc3\x7b\x6e"
+ "\xe0\xfe\x70\xdb\xf2\x21\x8e\xa3\x8d\x8e\x7e\x7f\x18\xbd\x3c\xd5"
+ "\xcf\x1f\xc6\xec\xc6\xfe\xf3\x9e\x8c\x6f\xe6\x0f\xef\xc9\x18\xec"
+ "\x0f\x8d\x4d\xfe\xfe\xf0\x9e\xb2\xd0\x7a\x58\x9f\x14\xcc\x1f\x66"
+ "\x7a\xce\x30\xa1\x1b\xf5\x49\x43\xa4\x27\xe4\xfe\xef\xa8\xf3\xcd"
+ "\x17\xae\xab\xae\x79\x68\x75\x4d\x0d\x39\xff\x85\x63\xc3\x2a\x8c"
+ "\x41\xf4\x1b\x5f\x05\xe9\x44\x09\x48\x47\x12\x3a\xc0\x66\x76\xc3"
+ "\x78\x13\xea\x84\x05\xd2\x8e\xd4\x74\xc3\x91\x84\x13\xc0\x22\x0e"
+ "\x56\xb1\x9f\xaf\x35\x1a\x8b\x48\x37\xa7\x7a\x6d\xc5\xee\x21\xea"
+ "\xe6\xd4\x36\x45\x37\x8f\x78\x50\x37\xd7\x92\x3e\xa6\xa7\xd8\xba"
+ "\x4f\xca\xba\x99\x3e\xaa\x5f\x3e\x16\xa1\x9f\x41\x75\x13\x6d\xc2"
+ "\x5f\x37\xeb\x1a\x84\x6e\x4e\xfb\x62\xb0\x6e\xd6\x35\x04\xd7\xcd"
+ "\x69\xbf\x11\xba\x59\xd7\x30\xb4\x36\x4c\xab\x1c\xd0\xcd\xba\x06"
+ "\x3f\xdd\xbc\x71\xad\xd1\x55\x31\xad\xf3\x9b\xe9\xe6\xb4\x4e\xa5"
+ "\xed\xb5\x72\xdb\x31\x2d\xdd\x5f\x37\xd3\x13\x42\xca\xb0\xfc\xbd"
+ "\x1c\xf4\x87\x51\x27\xa5\xf4\x6e\x2f\xc6\xb4\xbe\x4a\x4d\x7c\xa6"
+ "\x97\xb9\xe8\x8c\x76\x26\x4d\x04\xb6\x2e\x29\xca\x85\xe3\x4d\x97"
+ "\xab\x40\xc7\x22\x0f\x8e\x66\x7d\xf1\x80\xb4\xc7\x32\x57\x52\x0c"
+ "\xf2\x2c\x11\x7f\x47\xd6\xae\x85\x38\xbc\xe2\x6b\x65\xbe\xe2\x7d"
+ "\x2a\x5b\x17\x1f\xb9\x7d\x2d\x24\xc7\x3a\x41\x87\x34\xe4\xc4\x6e"
+ "\xd6\x43\xac\x07\xe2\xe8\x9e\x59\x1a\xd3\xea\xcf\x81\x96\xe6\x1a"
+ "\x7d\xd1\x58\x9f\x39\x96\xb1\xd5\x49\x50\x5f\x84\xf4\x48\x10\x5f"
+ "\x2f\xb1\x66\xef\xba\x24\x89\xc5\xec\x7e\x93\x3d\x9d\xc3\x69\xf2"
+ "\x25\xae\x2d\x43\x1d\x2a\x63\xa5\x05\x54\xaf\x91\xce\x0a\x66\x37"
+ "\xae\xdd\xc2\x5c\xf1\x91\xdb\xce\x41\x72\xfd\x5a\x48\xac\x5b\x0b"
+ "\x49\xac\x2f\x49\x42\x1e\xe4\x2c\x7a\x4a\x4f\x72\xc7\x36\x60\x5d"
+ "\x6b\xb1\x2e\x94\xa5\x77\x1b\xd6\xe5\xc1\xba\xce\x60\x5d\xa7\xb1"
+ "\x2e\x0b\xd6\x65\x11\x75\x0d\x8d\xe7\xd3\x73\x2e\x34\x27\x9c\xb9"
+ "\x71\x34\xed\x5d\xfb\xe7\x58\xf3\xf0\x0c\x9a\x1f\xee\x79\xba\x60"
+ "\x88\xfa\x3e\x3d\xe4\xf7\x3f\x3b\x7e\x09\x09\x4c\xd7\x17\x3f\xe7"
+ "\xd9\xcf\x58\xa6\x07\xe0\xd9\x5f\x42\x32\xd9\xdc\x11\xf7\x29\xb4"
+ "\xb3\xbe\xf8\x0f\x93\xba\x87\x58\xd7\x8c\xc4\x50\x75\x55\x58\x58"
+ "\x7b\x5f\x02\x8d\x17\x77\xb7\xec\x90\x98\xb9\x37\x21\xbf\xf9\xe0"
+ "\xd1\x5e\x58\x6c\xa6\x39\x68\x66\x36\x3c\x02\xba\xe3\xd2\xac\x8e"
+ "\xd2\x3f\xd2\x7c\xde\x8c\x26\xff\xf9\xbc\x19\x87\x40\xca\x30\x81"
+ "\x34\xb3\x01\xa4\xfb\x93\x00\xe1\x02\xae\xdc\xcc\xd7\x47\xc3\x26"
+ "\x0f\xfb\x33\x8e\x53\xcb\xb7\xe3\x58\x38\x73\x9c\xc6\x6e\x5d\x4b"
+ "\xf3\x5b\x19\xcb\x90\x7f\x7f\xc1\x3e\x28\x96\xee\x09\x9f\xa9\x08"
+ "\x2e\x3f\x29\x65\x14\xc4\x3a\x87\x67\x78\xa2\x76\x77\x78\x70\xfc"
+ "\xd6\x17\xff\x9a\xf1\x7c\xe5\xee\xaa\x3e\x1a\xcf\x3e\x46\x7e\xe0"
+ "\xde\x25\xb1\x9a\x32\x1c\x6f\x6b\xe2\x19\x8b\xa7\x39\xdb\x9c\x1a"
+ "\xbc\x48\xf6\x5c\xee\x91\xb6\x56\xd2\x0f\xd2\xc5\x7a\x91\xae\x27"
+ "\x7d\xdc\x21\xf7\xd9\x8e\xb0\x9b\x73\xc9\x06\xbc\x58\xbe\xf4\x0b"
+ "\x48\xb0\x1d\xf3\x02\xea\x74\xce\x62\xaf\x8e\xec\x28\xc7\xfa\xc8"
+ "\x1f\xe0\x04\xb6\xa8\xf4\x4b\x88\x46\x1d\x8a\x22\x7b\xf0\xa1\x3d"
+ "\x64\x1e\x8b\x75\xa3\x5d\xfb\x36\x9d\x85\x58\xf2\x13\xb4\x2f\xb2"
+ "\xad\xdb\x0e\xbe\x33\x49\x31\xbb\x56\x42\x9c\xe7\x4c\xc1\x48\xc7"
+ "\x99\x82\xcb\x5f\xf6\x41\x5c\x8c\x09\xf4\xb5\x2b\x51\x77\x57\xa1"
+ "\x7d\x9c\x46\xfb\xe8\x16\xf6\xd1\xaf\xaf\xcf\xb5\x96\xd3\x37\x37"
+ "\xdc\x36\xb6\xc9\xb6\xb1\x0e\xf5\x75\xed\x80\x6d\x78\x56\x25\x49"
+ "\xb5\x12\x03\xa4\x11\xf9\x3e\xbd\xba\x7e\xd3\x70\xf2\xfb\xa9\x6c"
+ "\xf4\x52\x03\x8d\xcd\x32\x3d\xcc\xb3\x17\x65\x11\x3e\x4e\x32\xb0"
+ "\x6d\xbb\x3b\x0e\x66\x75\xc1\xc0\x98\x6e\xd6\x1f\x7b\xaf\xcd\x6f"
+ "\x36\xcc\x65\x67\x8e\x4b\x19\xb9\x98\xae\x33\xcc\xbf\x49\x8f\x72"
+ "\xfc\xa3\x18\x03\xce\xea\xa0\x39\x02\xbb\x94\x31\x11\x71\x01\xbd"
+ "\x97\xf8\x98\xcf\x49\xce\xac\x46\x58\xf0\x22\xcf\x3d\x51\xcb\x8d"
+ "\xbe\xa8\xdd\x4d\xd6\xe5\xbd\xdc\x36\xfb\x50\x06\x27\x0a\x41\x5a"
+ "\xdc\x8d\xbc\xf1\x22\x6f\x5c\xdc\x67\x64\x71\x9f\x51\x7e\x30\xbe"
+ "\xc4\xce\x7c\x99\x79\x61\x0c\xf9\xa2\xb3\x99\xbd\xb0\xc8\x04\x6c"
+ "\xe3\x29\xe4\x91\xb3\x83\xfc\x4b\x8c\x6f\x9d\xf0\x21\xbb\x90\x3f"
+ "\xd1\xdd\xa0\x67\x15\x5e\xfd\x2f\x37\xb5\x85\x7b\x51\xcf\xc9\x8f"
+ "\xc4\x6e\xd6\x44\xa0\xac\x62\x2a\xc9\xce\xd1\xee\x63\x37\x73\xbf"
+ "\xc6\x65\xeb\x59\x97\x34\xb6\x6f\x5d\x92\x01\xaf\xd1\x8a\xaf\xa1"
+ "\xb3\xb8\x6a\xc9\xcf\x54\xcc\x00\xf2\x33\x36\xb3\x1d\x3c\xc8\xcb"
+ "\x18\xea\x97\xd6\x25\x25\x70\x9e\x3e\x81\x3c\x5d\x0a\xba\x09\x6e"
+ "\xd0\x20\x5d\x7a\xa4\x19\x0e\x17\x1c\x07\xe2\xb1\x17\xed\x88\xf8"
+ "\xdc\x47\x3e\x08\x75\x0d\xe3\x14\xe3\xec\x65\x06\xf8\x30\xe9\x13"
+ "\xa0\xbd\x95\x4a\xcf\xb3\xcf\x69\x4e\xd4\x66\xf6\x00\x8b\xde\xdd"
+ "\xc1\xf8\x3c\x52\xc6\xa4\x83\x59\x6e\x08\xad\xd3\xf7\x8f\x19\xd0"
+ "\xe9\xfb\xc7\x0c\xe8\xf4\xfd\x06\xfe\x4e\x41\xa5\xd7\xe7\xab\x51"
+ "\xaf\xa3\xd4\x7a\x7d\xdf\x9d\x7f\x55\xbd\x9e\x33\x74\xbd\x7e\xf9"
+ "\xb4\x4a\xaf\x37\xfd\x6d\xf4\xfa\xe3\x1c\xae\xd7\x61\x7d\xd7\x72"
+ "\x7d\xc5\xbe\xfb\x1d\xb0\x4b\xf7\x47\x29\x7a\xfb\xbb\x37\x48\x6f"
+ "\x67\x65\xfd\xbd\xea\xed\x79\x57\x92\x01\xaf\x4b\xae\xb7\x88\xf3"
+ "\xa2\xf5\xf6\xe3\x9c\x5e\x50\xf8\x47\xfa\xcb\xca\xfb\xe2\x0d\xa5"
+ "\x30\x05\xf9\xd6\x11\xbb\x79\x34\x1c\x16\x3c\xec\x30\xcc\x67\x3e"
+ "\xf4\x11\x5b\x49\x9f\x7a\x2d\x8c\xf9\xa2\xea\x33\x4a\x7f\x0f\x7a"
+ "\xac\xa3\xca\xe6\x79\x0b\x62\x4d\xf4\x8e\x67\x79\x3c\x8b\x1e\x65"
+ "\xa7\x77\x41\x48\x8f\x96\xde\xff\x78\xb7\x7a\xc1\x8b\xfe\xc4\xbb"
+ "\xad\xb1\xca\xb7\xf5\x7f\x1c\xbe\x68\xf1\x8e\x88\x45\x78\x0c\xae"
+ "\x8a\x59\x1d\xca\xfb\x8b\xa0\xb1\x49\x54\x63\x15\xda\x8b\xf6\x84"
+ "\x34\xfb\x13\xfc\x95\xf0\xf7\x29\xfc\x0d\xc3\xdf\x7b\x88\x8e\xa1"
+ "\xf5\x73\xb3\xf9\xf8\x17\xfb\xb2\x4e\xe1\x07\x67\x47\x73\x1b\xbc"
+ "\x19\xa2\x4f\xca\xf7\xae\x8a\xd9\x05\xca\xfb\x90\x7e\xf8\x7e\x7e"
+ "\xcc\xd6\x52\xdd\xc8\x13\xad\x78\x47\x23\x9e\x55\xf8\xc2\xf9\x33"
+ "\x68\x13\xb0\xfd\x59\xf4\x2e\x15\x75\x49\xe3\x62\x05\x77\xcb\xbf"
+ "\x93\xf9\x3b\x1d\xe4\x03\xc5\x79\xc2\xd7\x8a\x3a\xb0\x5e\x3b\xf6"
+ "\xc3\x79\xea\x7a\x83\xf1\x03\xf3\x3c\xa1\xf2\x86\xc6\x8b\x39\x21"
+ "\xd7\x7f\x4d\x4f\xf2\xb2\x21\xe2\x0a\xf9\xfd\x2b\x4b\xc8\x37\x65"
+ "\x36\x79\xad\xbe\xbe\x9c\xd8\x0f\x4b\x4e\x0d\x31\x2e\x99\x13\x72"
+ "\xfc\xeb\x8d\xaa\xcf\xcd\x1c\x37\x1a\xbc\x35\xf9\x26\x9a\xeb\xa4"
+ "\x58\xeb\x48\x92\x07\x28\xde\x7a\x7d\xb9\x5d\xea\xc3\x98\x31\x06"
+ "\xed\x71\x8e\xf3\x03\xb6\xe3\x24\xc6\xa8\xeb\x72\x62\xb7\x2f\x87"
+ "\x34\xcf\x99\xf8\xc8\xe7\xd1\x07\xf5\xa2\x3f\xe8\x3d\x53\x10\x7b"
+ "\xc4\xe4\x06\x5f\x6d\xbe\xc9\xe6\x69\x83\x7a\x84\x23\xff\x4b\xf4"
+ "\x9e\x3f\x93\x13\x53\xb1\x12\xf8\xbb\x0d\xeb\x63\x6f\xa0\xff\xcd"
+ "\x7c\x3f\x7c\x23\xfa\x1c\xf4\x19\xdc\x0f\x7f\x03\x1f\xdc\xfb\xcc"
+ "\xcd\xb9\xb3\x17\x32\xf7\x91\x63\x7f\x80\xd2\xc3\xa0\x2f\x5d\x03"
+ "\xd1\x84\xdf\xe6\x39\x2c\xfc\xf2\xc3\xe8\x97\xf1\xb9\x4e\xe5\x97"
+ "\xf9\x9c\x7a\x80\x5f\xa6\xf8\xfb\x48\x67\x17\xc4\x38\x61\xf8\x1c"
+ "\x67\xac\x7b\x93\x93\xf9\x28\x1e\xa7\xf7\x28\x08\x13\xa3\xf8\xe8"
+ "\x57\x30\xee\xe8\x5b\x25\xfc\x73\xad\xec\x9f\x5f\x39\xfd\xed\xfd"
+ "\xf3\x2b\x16\xf4\xcf\x18\xef\xbd\x4c\xbe\x19\xfd\xf2\x9e\x13\x0e"
+ "\xc9\x83\xbe\x78\x68\xb2\xcd\xaa\x0e\x25\xdb\x39\xd8\x7f\x92\x4c"
+ "\x49\x77\x0e\x37\x79\xe8\x1d\xff\x9f\xbd\x31\xaf\x34\x53\xff\xd8"
+ "\x8b\x7d\xe3\xeb\xcb\x3b\xa4\x18\x33\xca\xd6\xf4\x01\xf3\xac\xce"
+ "\x89\x65\x7d\x39\xd1\xde\xca\xfa\x5c\x4f\x5f\xbc\xae\xaf\x0f\xe5"
+ "\x8b\xfe\x02\xfb\x2b\xbd\xe3\xe9\x02\xce\x13\xdf\xb5\xf9\x26\xdf"
+ "\x73\xb7\x34\x60\xdf\x34\xa9\xee\x34\x4c\x64\xdb\x5e\x69\xf7\x6c"
+ "\x7b\xe5\x58\xdf\xb6\x57\x8e\xa2\x5e\xc6\x60\xfc\x88\x32\x3f\x6f"
+ "\xf5\x6d\x7b\xc5\xe1\xdb\x5e\xdb\xec\x8d\xae\xcf\x75\x44\xbf\xd2"
+ "\x81\xcf\x5d\xbe\xa7\x51\x0f\x36\x90\x1e\x7c\x08\x86\x39\xd4\x0f"
+ "\x3f\xf0\x61\x30\x3d\x78\xd9\x32\xb4\xbe\x78\x76\x0e\xea\x41\x07"
+ "\xea\xc1\x97\x6a\x3d\x78\x9f\xce\x38\x14\xba\xf0\xa0\xd0\x05\xe4"
+ "\x3b\x1f\xcb\xf4\xf7\xd3\x73\x0f\x06\xd7\x87\x63\x17\xa7\x0f\xbd"
+ "\x67\xfc\xf5\xa1\xe6\x1b\xea\x03\xf6\xaf\xf1\x75\x38\x6e\x3a\x7f"
+ "\x26\x49\xaa\x21\x7d\xf8\x64\x40\x1f\xde\xfc\x93\x43\xea\x1b\xb2"
+ "\x3e\xcc\x0d\x79\xfe\x57\x70\x7d\xd8\x95\xfa\x2d\xf5\xc1\x3d\xa0"
+ "\x0f\xbb\xb2\x3c\xdb\x76\x2d\xec\xdb\xb6\x2b\x7b\x40\x1f\xce\xa2"
+ "\x3e\xec\x32\x0d\xe8\xc3\xae\x1c\x7c\x2e\x18\xac\x0f\xf3\x3e\xf9"
+ "\x6e\xf5\x21\xfc\xab\x7f\x0d\x7d\xc8\x0e\x39\xfe\x0d\xa1\x0f\xdf"
+ "\xd2\x3f\x24\x67\xa9\xf4\x01\xfd\xc3\x2e\xf4\x0f\xbb\x54\xfe\xe1"
+ "\x14\xe9\x83\xca\x3f\xec\x42\xff\xb0\x2b\x88\x7f\x78\xf0\x8b\xef"
+ "\x56\x1f\x2e\x3b\xfe\xaf\xa1\x0f\xf3\xdb\x86\xa6\x0f\x35\xdf\xd2"
+ "\x3f\x24\x37\x0d\xe8\x43\x0d\xfa\x87\x1a\xf4\x0f\x35\x2a\xff\xf0"
+ "\x29\xea\x43\x8d\xca\x3f\xd4\xa0\x7f\xa8\x09\xe2\x1f\x1e\x3a\xfb"
+ "\xdd\xea\xc3\x88\x3f\xfc\x6b\xe8\x43\x4e\xc8\xf9\xef\x10\xfa\xf0"
+ "\x2d\xfd\x43\x0a\xa8\xf4\x01\xfd\x43\x0d\xfa\x87\x1a\x95\x7f\x78"
+ "\x9f\xf4\x41\xe5\x1f\x6a\xd0\x3f\xd4\x04\xf1\x0f\x8f\x84\x7f\xb7"
+ "\xfa\x70\x47\xc5\xbf\x86\x3e\x3c\xd2\x35\x34\x7d\xa8\xfd\x96\xfe"
+ "\x21\x25\x67\x40\x1f\x6a\xd1\x3f\xd4\xa2\x7f\xa8\x55\xf9\x87\x8d"
+ "\xa8\x0f\xb5\x2a\xff\x50\x8b\xfe\xa1\x36\x88\x7f\x58\x78\xc5\x77"
+ "\xab\x0f\x0b\xa6\xfe\x6b\xe8\xc3\x42\xf7\xd7\xe9\x83\xa2\x0b\xa4"
+ "\x17\xa4\x0b\x7d\xa5\x39\x40\xe3\x8c\xd7\x4f\x0a\x7d\x20\x3d\xe0"
+ "\x3a\xd1\x93\x13\xeb\x45\x5d\xf0\x3c\x8d\xba\xd0\x2b\x74\x81\x78"
+ "\x41\xfa\x40\xe3\x0a\x1a\x4f\x90\x4e\x78\x71\x4c\xe1\x89\xc6\x31"
+ "\xc5\x66\x6d\x1c\xe9\x41\x6f\xd4\xd7\x8c\x2b\x7a\x81\x8f\xfd\x68"
+ "\x8c\x77\x5a\x5a\x74\x6d\x30\x3d\x78\x65\x88\x73\x7c\xfd\xe3\x4b"
+ "\x3f\x3d\xf8\x70\x40\x0f\x1e\x0e\x31\xae\x98\x1f\x42\x0f\xec\x17"
+ "\xa1\x07\xa7\x07\x8f\x33\xbf\xad\x1e\xf4\xae\x92\xf5\x80\xc6\x99"
+ "\x3e\x79\x9c\xf9\x18\x8e\x33\xa3\x87\xaa\x07\x8b\xe1\x9b\xe9\x41"
+ "\x4d\xea\xd0\xf4\x20\xb9\x89\xe2\x04\xa1\x07\x35\x0b\x3d\xd1\x18"
+ "\x2b\xf8\xe9\xc1\x05\xe2\x05\x3f\x3d\xc8\xbd\xe1\xbb\xd5\x83\x80"
+ "\x78\xe1\x9f\x56\x0f\x96\x84\xdc\xff\xd5\x87\x72\x27\x7f\x4f\xf3"
+ "\xf6\xf4\xed\x46\x8c\x43\xcc\x1b\xd1\x37\x1c\x3b\x56\x42\x22\xf5"
+ "\x11\xde\x75\x39\xb1\x95\xa7\x21\x6d\xeb\x4a\xd0\x7a\x56\xa3\xfc"
+ "\x8b\x40\xdb\x2b\x01\xf4\xae\x2e\x88\x3d\xd4\xe9\x10\x73\x48\x66"
+ "\x2b\xd4\x23\x7c\x5f\xa5\x98\x43\xf2\xf6\xe4\xc4\x6c\xfd\x0a\xf8"
+ "\xba\x57\xeb\xa2\x9f\xa1\x6c\x1f\xd3\x04\x93\xed\xae\x21\xf8\xfa"
+ "\x5e\xb5\xaf\x3f\xe5\x2f\x5b\xb5\x9f\xaf\xb1\xa8\xe6\x90\xe6\x84"
+ "\x98\x43\xba\x08\x99\xf2\xb9\xfd\xd3\xc2\xcf\xf7\xcf\x21\x7d\xcb"
+ "\x39\xfe\x3e\xf4\xf1\xaf\x48\xfe\x3e\xfe\x9b\xc9\xf4\xb1\x63\x17"
+ "\x9a\x77\x24\xfb\x26\xbb\x56\x6c\xba\xbf\x8f\x27\x3b\x46\x79\x9f"
+ "\xaf\x7c\x65\x1f\xef\xeb\x9f\x1e\xb0\x69\xb2\x65\xb2\x6b\xb2\x63"
+ "\xde\xd7\xd3\x3e\xbf\xcf\xa5\x34\xd7\xa9\xe6\x8e\xbc\xd1\xb2\x9f"
+ "\x0f\xe2\xe3\x7d\x17\xf4\xf1\x79\x41\xe5\xff\x8f\xe0\xe3\x49\x0f"
+ "\x14\xfb\xfe\xfb\xb3\xed\xbc\xd0\xeb\xbf\x2e\x4a\x0f\x76\x4d\xfc"
+ "\x7a\x3d\xd8\x95\xea\x7b\x6e\xbc\xb6\x4e\x35\x67\xe4\x8d\xde\x85"
+ "\x7e\x5e\xcc\x19\x09\x3d\x18\x98\x33\xf2\x05\xce\x19\xf9\xe9\xc1"
+ "\xd2\x88\xef\x56\x0f\x02\xe6\x8c\xfe\x69\xf5\x60\x69\xf7\xb7\xd4"
+ "\x83\x8b\xf0\x07\xbb\xd0\x1f\x8c\xcf\x51\xe9\x01\xfa\x83\x5d\xe8"
+ "\x0f\x76\xa9\xfc\xc1\xc0\x5c\x91\x2f\x70\xae\xc8\x4f\x0f\x0a\x46"
+ "\x7c\xb7\x7a\x10\x30\x57\xf4\x4f\xab\x07\x05\xce\x6f\xa7\x07\x35"
+ "\x17\xe1\x0f\x6a\xc8\x1f\xec\xa9\x53\xcd\x11\x79\xa3\xe5\xb8\x2f"
+ "\x48\xcc\xe7\xbb\x60\xcc\xb7\x7c\xd4\x3f\x6a\xcc\xf7\xf7\xad\x07"
+ "\xcb\x43\xbe\x2b\xbd\x48\x3d\xb8\x08\x7f\x50\x83\xfe\x60\x02\xa8"
+ "\xf4\x00\xfd\x41\x0d\xfa\x83\x1a\x95\x3f\x18\x98\x1b\xf2\x05\xce"
+ "\x0d\xf9\xe9\x41\xe1\x98\xef\x56\x0f\x02\xe6\x86\xfe\x69\xf5\x60"
+ "\x85\xf6\xdb\xe9\x41\xed\x45\xf8\x83\x5a\xf4\x07\x13\xb2\xeb\x54"
+ "\x73\x42\xde\xe8\x5a\xf4\x07\xb5\x2a\x7f\x30\x30\x27\xe4\x0b\x9c"
+ "\x13\xf2\xd3\x83\x95\xe3\xbe\x5b\x3d\x08\x98\x13\xfa\xa7\xd5\x83"
+ "\x55\x21\xd7\x55\x28\x3a\xd0\x3f\x07\xc0\x06\xf4\x80\xcb\x7e\x75"
+ "\x4e\x6c\x6f\xd4\x2b\xfb\x94\xf1\x7f\xe5\xa0\xf1\x7f\x4a\x73\xc8"
+ "\x79\xa0\x80\xf7\xcb\x7c\x6c\xb0\xfd\x95\x66\x31\x4e\xa8\xcf\x25"
+ "\xf9\x3f\xbf\x41\x8c\x13\x0d\xf3\x49\xfe\xa6\xe0\xf2\x1f\xea\x9c"
+ "\x60\x1e\xca\xbf\xf3\x02\xf2\x7f\x34\xc4\x38\xe1\x91\x6f\x27\x7f"
+ "\x5a\xef\xd8\x77\xe6\x12\xca\x5f\x99\x13\xfc\x14\xa4\x57\xbe\xd5"
+ "\x78\xf1\xa9\x90\xf2\x0f\xba\x9e\xa4\x49\xac\x27\xa1\xb5\x24\x47"
+ "\xba\xba\x60\xeb\x39\xd0\xc7\x14\x0a\x9d\xe0\x6b\x4a\x50\x27\x2a"
+ "\x4f\x42\x9a\x47\xb4\xad\x7f\x4d\x09\xed\x8b\x2e\xfc\x82\x95\xaf"
+ "\x29\x51\xe6\x03\xfa\xd7\x93\x2c\xa2\xf5\x24\x45\xd1\xdf\x7a\x2e"
+ "\x80\xd6\x93\x14\xa3\x8c\x9d\x28\xe3\xb3\x24\xdf\x0f\xfd\xec\xda"
+ "\x6f\x0e\x20\xd4\x3a\x92\x8b\x99\xd7\xf9\x2b\xac\x23\xe1\x73\x00"
+ "\x97\xc4\xa6\x8b\xec\x21\x7d\x3b\xca\x91\xe4\x69\x4b\xf2\xf0\x79"
+ "\x5d\xc5\xc6\x6d\xe6\x76\xd8\xda\x0b\x7a\x65\xfe\x5f\x91\x29\xf9"
+ "\x7b\x86\x7a\xc0\xce\xe4\x44\x93\x4c\x9f\x5f\x89\x7e\x7e\xd5\x80"
+ "\x9f\xf7\x0d\xbb\xa5\xa1\x76\x03\xfa\xf7\x0d\x30\x91\xf3\x28\xa6"
+ "\xb6\x59\xcc\x07\xd4\xe7\x92\xbd\x93\x3d\xb3\xe8\x57\xba\xfa\x64"
+ "\x7b\x17\xf2\x3e\x0c\x24\x67\x71\x7e\x66\xb1\x86\x6c\x8f\x64\x1e"
+ "\x23\xcb\xbc\x2e\x84\xcc\xb9\xbc\x35\x7a\xda\x8b\x83\xbe\x33\xeb"
+ "\x97\xb9\xe7\x19\xd5\xfc\x8f\x5a\xe6\xf2\xbc\x8f\x0f\x6d\xf9\xa2"
+ "\xd6\x0f\x5d\xa4\xdc\x2f\xd9\xfc\x3e\xca\xbd\x4e\x96\x7b\xff\xfc"
+ "\xfe\xb7\x92\x7b\x71\xe8\xef\x5f\xfc\xe4\xbe\x2b\xf5\x12\xc8\xdd"
+ "\x3d\x58\xee\x34\xfe\x27\xb9\xef\xca\xa6\x71\x3e\x8b\xde\x55\xd0"
+ "\x27\xaf\x1b\x19\x2c\xf7\x35\xe7\xff\xfa\x72\x0f\xff\xea\x5f\x43"
+ "\xee\x6b\x43\xee\x7f\x1e\x20\xf7\x4b\x60\xef\xc9\x59\x41\xe4\x2e"
+ "\xdb\xfb\xae\xa3\x34\xae\x47\xb9\xcb\xf6\x7e\x2a\x88\xdc\xd7\x7d"
+ "\xf9\xd7\x97\xfb\x65\xc7\xff\x35\xe4\x6e\x0e\xb9\xfe\xc3\x5f\xee"
+ "\x35\x97\xc0\xde\x93\x9b\x06\xcb\xbd\x46\xb6\xf7\x9a\x6c\x1a\xc7"
+ "\xb3\xe8\x1a\xd9\xde\x3f\x0d\x22\xf7\xf5\xff\xf7\xd7\x97\xfb\x88"
+ "\x3f\xfc\x6b\xc8\x7d\x83\xf5\x22\xe5\x7e\x09\xec\x3d\x05\x82\xc8"
+ "\x5d\xb6\xf7\x9a\xa3\x34\x6e\x47\xb9\xcb\xf6\xfe\x7e\x10\xb9\x3f"
+ "\xfd\xf9\x5f\x5f\xee\x77\x54\xfc\x6b\xc8\xbd\x24\xe4\xfa\x3f\x7f"
+ "\xb9\xd7\x5e\x02\x7b\x4f\xc9\x19\x2c\xf7\x5a\xd9\xde\x6b\xb3\x69"
+ "\x9c\xce\xa2\x6b\x65\x7b\xdf\x18\x44\xee\x1b\xff\xf8\xd7\x97\xfb"
+ "\x82\xa9\xff\x1a\x72\xdf\xd4\xfc\x75\xef\xeb\x15\xd9\x2b\x73\x36"
+ "\xfc\xfd\x2c\xc6\xf7\x8a\xbc\x49\x0f\x48\xe6\xa4\x0b\x6a\x99\xf3"
+ "\x35\x3c\xab\xc4\x1a\x1e\x8a\xdb\x19\x8e\xc5\xd9\x30\xbe\x7e\xa3"
+ "\x8b\x8f\xdb\xe5\x38\x9e\x69\xb4\x71\x14\xcb\x87\x8e\xe3\x4b\x7f"
+ "\xa7\xc8\xfb\x9b\x8e\xdd\xbe\x4e\xde\x81\x63\xf2\xbf\x17\x79\xab"
+ "\xc7\x6f\x97\x46\xde\x65\x0d\xdf\x4c\xde\x35\xa9\x43\x93\x77\x4d"
+ "\x96\x90\x37\x5f\xa7\x51\x30\x20\xef\x9a\x6c\x21\xef\x9a\x9c\xd0"
+ "\xfd\xf9\xe6\xf7\xfe\xfa\xf2\xf6\x9f\x93\xff\xe7\x95\xb7\x25\xe4"
+ "\xf9\x1f\x34\x07\x43\xb2\x26\xb9\xef\x58\x0e\x89\xcf\x2f\x17\x73"
+ "\x2b\x9e\x33\xf1\xe4\xf3\xb5\x24\x7f\xfa\xc6\x27\x06\x75\xe0\xe3"
+ "\x1c\x07\xf4\xba\x72\x80\xbe\xe5\xa1\x75\x17\x47\x0a\xec\x60\x33"
+ "\x1f\x84\xad\x45\xa0\x3f\x94\xfb\x15\xcc\x69\x62\x7d\xb6\x63\x56"
+ "\xfa\xc6\x5b\x6b\xdd\x70\x10\xd8\xaa\xa4\xc8\x45\x4e\x90\x4e\x4b"
+ "\xcf\x64\xd0\xba\x8d\xf1\x4e\xe4\x09\x7d\xef\x83\x32\xdf\x7a\x1a"
+ "\xe0\xc3\x62\x00\xc3\x52\x92\xf5\x33\xaf\x85\xaf\x09\xf2\x9d\xcf"
+ "\x50\xe6\x65\xd4\x73\xaf\x41\x64\xbd\x4b\xba\x34\x6b\x33\x94\x75"
+ "\x19\x7e\xf3\x32\xdf\xf6\xfb\xcb\x4b\xb6\x36\x63\x4b\xc8\xbd\x9c"
+ "\x68\xbd\x0d\xc9\x93\x6c\xda\xb3\x5d\xcc\xcb\xd8\x30\xbc\xa7\x75"
+ "\x35\x64\xc3\xde\x9e\x78\xdd\xd3\xc5\x68\xeb\x1d\xc2\xd6\x9f\xff"
+ "\x0a\x61\x73\xff\x07\x48\x3f\x84\x6c\xfb\x84\x6c\xbf\x22\xd9\xfe"
+ "\x0f\xb0\xd5\x49\x91\xa7\xa5\x67\x0d\x24\x5f\x92\x6b\xe9\x1f\x41"
+ "\xbf\x98\xf6\x45\x21\x1f\x8f\xfe\x1d\xe5\x3c\xa9\x7e\x39\x4c\x24"
+ "\xfb\xf7\x6e\x7b\xe5\xa8\x67\x9b\x58\xa3\x41\x7e\xbf\x2f\x6a\x77"
+ "\x47\x45\x91\x2c\xff\x47\x48\xfe\xcf\x06\x95\xff\xae\x6f\x3a\xf7"
+ "\x2e\xcb\xff\x1b\x7f\xd7\xf3\xb7\xb2\xf7\x55\x97\xca\xde\x9f\x2b"
+ "\xbb\x38\x3d\x10\xf3\x34\x43\xd3\x03\x57\x10\x3d\xf8\x71\xd2\x60"
+ "\x3d\xd8\x95\x85\x7a\xe0\xf6\xd7\x83\x5d\xd9\x42\x0f\x76\xe5\x60"
+ "\x7e\xc1\x60\x3d\xf8\xf1\x5b\xdf\x8d\x1e\x5c\xe4\xf7\x3c\xff\xf0"
+ "\x7a\x50\x5e\x7e\x91\x7a\xf0\x0d\xfc\xc1\x99\x20\x7a\xb0\x35\x35"
+ "\x88\x1e\xa0\x3f\x48\xce\x0a\xd0\x03\xd9\x1f\xec\x42\x7f\xb0\x2b"
+ "\x88\x3f\xd8\xfa\xeb\xef\x46\x0f\x2e\xf2\x3b\x9e\x7f\x78\x3d\xa8"
+ "\x08\xd9\xff\xfb\xeb\x41\xcd\x37\xf0\x07\x9f\x05\xd1\x83\xe7\x27"
+ "\x0d\xd6\x03\x8c\x05\x31\x0e\xf4\xd7\x83\x1a\xd9\x1f\xd4\xe4\x50"
+ "\x7c\x38\x58\x0f\x9e\x7f\xff\xbb\xd1\x83\x8b\xfc\x7e\xe7\x1f\x5e"
+ "\x0f\x2a\x43\x7e\xff\x1b\xa0\x07\xdf\xc0\x1f\x7c\x10\x44\x0f\xb6"
+ "\x19\x83\xe8\x01\xfa\x83\x14\x08\xd0\x03\xd9\x1f\xd4\xa0\x3f\xa8"
+ "\x09\xe2\x0f\xb6\x7d\xf8\xdd\xe8\xc1\x45\x7e\xb7\xf3\x0f\xaf\x07"
+ "\xdb\x43\x8e\xff\xfc\xf5\xa0\xf6\x1b\xf8\x83\xd2\x20\x7a\xb0\x23"
+ "\x63\xb0\x1e\xd4\xa2\x3f\x48\xc9\xf1\xd7\x83\x5a\xd9\x1f\xd4\xa2"
+ "\x3f\xa8\x0d\xe2\x0f\x76\x1c\xfe\x6e\xf4\xe0\x22\xbf\xd7\xf9\x87"
+ "\xd7\x83\xaa\x90\xdf\x7f\xab\xf5\xa0\xaf\x7f\xbc\xd0\xc2\xf5\xa0"
+ "\x62\x83\xd0\x83\x8d\xa4\x07\x5d\x62\xfd\x4e\xa5\xac\x07\xfd\x63"
+ "\x85\xce\x40\x1d\x78\x61\x56\xbf\x0e\xfc\xdf\xc0\x58\xa1\x0f\xe5"
+ "\xcd\xe7\x83\xe4\x71\x82\x32\x0f\xc4\xc7\x09\x38\x4e\xac\xf8\x4a"
+ "\x96\x3f\x9f\x13\x78\x21\xb8\xfc\x87\x30\x4e\xf4\x5b\xa3\x11\x28"
+ "\xff\xbf\xf3\xef\x74\x06\xcd\x0b\xfc\xf1\xdb\xae\xcd\xf8\xc9\x45"
+ "\xca\x5f\x89\x0b\x2e\x56\xfe\x9f\x05\x91\xff\x8b\x41\xe4\x5f\x93"
+ "\x25\xe4\x9f\xdc\xa4\xc4\x03\xca\xbc\x10\x8f\x07\x06\xc9\xff\xc5"
+ "\xef\x48\xfe\x7f\x9f\xdf\xe7\x5c\x7a\xf9\xef\x0c\x29\x7f\x2f\xda"
+ "\x40\xad\xe4\x6b\xae\x92\x7c\x2d\x78\x59\xf1\x6a\xc3\xb4\x70\x4c"
+ "\xe3\xef\x82\xab\xe4\x3c\x6f\x05\xd0\xde\x49\xd6\x58\x4d\x2e\xf1"
+ "\x9b\x60\x86\x29\x30\xb1\x9b\xc1\x88\x6d\x13\x70\x12\x94\x61\xba"
+ "\x35\x7a\xb3\x71\x18\xc2\xb7\xb1\x8a\x39\xf1\x98\x36\x9c\x60\xd9"
+ "\x66\x2d\xdf\x17\x27\x56\xc3\xf7\xce\x94\xe1\x35\xb4\x57\x96\x95"
+ "\x60\x11\x4e\x27\xc3\x89\xbd\xa3\x25\x09\xea\x07\xd3\x16\x21\xc3"
+ "\xd0\x9e\x55\x06\x35\x8d\xd1\x1a\x23\xc7\x25\xc3\x45\x7a\x2d\x9f"
+ "\x35\x12\xac\x77\xb3\x36\x51\x0d\xc7\xa6\x02\xe1\x55\xe0\x2e\x93"
+ "\xf1\x25\xf9\xb5\x77\x2c\x40\xf4\x66\x03\xc7\x17\xdd\x2d\x81\x4c"
+ "\x1f\xea\xc4\xac\x6e\x0e\xaf\xd1\x26\xfb\xc1\x0f\x03\x75\x3b\xa2"
+ "\xd9\xb0\xd4\x6a\x19\x2e\xd5\x27\x01\x3f\xf7\x19\xd3\xb5\x6a\x5e"
+ "\xcb\xb0\x31\x0a\x1f\x69\x4f\x27\x75\x7b\xbd\xd8\xfe\x5a\x41\x63"
+ "\xac\xf7\xb9\x09\x4d\x72\x5b\x26\xa9\xeb\x25\x38\x2c\x77\xab\x2c"
+ "\x13\x3d\xb6\x23\xad\x1f\x5f\xe5\xf2\x72\x05\x0e\x75\x76\x14\xca"
+ "\xc8\x6a\x2b\x00\x90\xdb\x3d\x02\x65\xb3\x47\x6e\xbb\xd1\x9f\x8f"
+ "\x1a\xbb\xc2\x47\x84\xa1\xbd\xcd\x46\x22\x4c\xba\x82\xd7\x6b\xe1"
+ "\xfb\x68\x89\x76\x5b\x3c\x97\x93\x5e\x1c\xee\x02\xa8\x13\xed\xb9"
+ "\x5c\xc6\x99\x21\xda\xac\x87\xda\x7e\x59\x6b\x29\xcf\x2a\xc3\xc5"
+ "\xf1\xf6\x44\x3e\x6a\xf4\x6a\xb4\xb3\x06\xc3\xea\xd4\xb0\x57\x08"
+ "\xd8\x2c\x3b\xc2\x66\x0d\x86\xd5\xab\x61\xaf\x14\xb0\x73\x1d\x08"
+ "\x9b\x3d\x18\xd6\x33\x52\x05\x7b\x95\x80\x7d\x10\x10\x36\x67\x30"
+ "\xac\x41\x0d\x1b\x2f\x60\x17\x67\x20\xec\xc2\xc1\xb0\x46\x35\xec"
+ "\x28\x01\xfb\x90\x1e\x61\x73\x07\xc3\x96\xa9\x61\xaf\x16\xb0\x0f"
+ "\x1b\x10\x36\x2f\x10\xb6\x9e\xeb\x01\x8c\x95\xf5\xe0\x1a\x01\xbb"
+ "\x20\x15\x61\x0b\x82\xb4\x2d\x8c\xe3\x15\xb0\x09\x02\x36\x53\x8b"
+ "\xb0\x85\x41\x64\xa1\x86\xbd\x56\xc0\xae\xca\x46\x58\x53\x10\x59"
+ "\xa8\x61\x47\x0b\xd8\xc7\x13\x11\xb6\x38\x88\x2c\xd4\xb0\xd7\x09"
+ "\xd8\xfc\x64\x84\x35\x07\xe1\xef\x00\x6c\xe4\x13\x13\x11\xa6\x04"
+ "\x79\xd2\x1e\x84\xb7\x6a\x9c\x63\x04\xce\x65\x69\x08\x5f\x16\x84"
+ "\xb7\x6a\xd8\xb1\x02\xf6\xc9\x74\x84\xdd\x32\x18\x16\x34\xb5\x82"
+ "\xbf\xb7\xc9\xfc\xbd\x5e\xc0\xaf\x98\x85\xf0\xe5\x41\xf8\x4b\xf9"
+ "\x56\xd9\xd6\x12\x05\xec\x92\x2c\x84\xad\x0c\xc2\x5f\x35\xec\x0d"
+ "\x02\x76\x93\x1b\x61\xab\x82\xf0\x57\x0d\x7b\xa3\x80\x5d\x9d\x84"
+ "\xb0\x3b\x83\xf0\x57\x0d\x7b\x93\x80\x5d\x43\xba\x53\x1d\x84\xde"
+ "\xb1\x2a\xd8\x24\x01\xbb\x2e\x1e\x61\x6b\x82\xc8\x42\x0d\x3b\x4e"
+ "\xc0\x96\x75\x21\x6c\x43\x10\x79\xa8\x61\x6f\x16\xb0\xeb\x49\xd7"
+ "\x1b\x83\xc8\x43\x0d\x7b\x0b\x8b\x7c\x5a\x27\xfb\xc5\xa6\x40\x58"
+ "\x94\xbd\xf0\x89\x16\x48\x66\x91\x1b\xc9\xc7\x10\xdc\x1e\x82\xeb"
+ "\xc7\x67\xf1\xfc\x80\xfc\x8d\xec\xc3\x52\x58\xe4\x53\xd9\x32\xbe"
+ "\xe6\x41\x75\x5b\xb4\x6a\xd8\xf1\x2c\xb2\xca\x21\xc3\xee\x1b\x0c"
+ "\xab\x53\xc3\x4e\x60\x91\x5b\xac\x32\x6c\xcb\x60\x58\x7d\x3f\x2c"
+ "\x8b\x7c\xae\x0d\x61\xf6\xd7\xc9\xbe\x51\x45\xe7\x6d\x2a\x7c\xb7"
+ "\xb2\xc8\xf2\x76\x19\x9f\x75\x30\x3e\x83\x1a\xf6\x36\x16\xf9\x13"
+ "\x85\xce\xd6\xc1\xb0\x46\x35\xec\x0f\x58\x64\x45\x87\x0c\xdb\x36"
+ "\x18\xb6\x4c\x0d\x3b\x91\x45\x56\xda\x65\xd8\x43\x83\x78\x4f\x76"
+ "\x60\xc1\x58\x40\xf8\xa4\xdb\x59\xe4\xf6\x2e\x19\xd6\x2f\x0e\x50"
+ "\xf5\xc3\x77\x08\xb9\x5b\x3a\x50\xee\x47\x79\x7f\xb3\x59\xdb\x11"
+ "\x2c\xc6\x30\xdd\x0c\x97\x9d\x94\x6a\x6b\x44\x9f\xa4\x9c\x7b\x55"
+ "\xc7\xbf\x2b\xf4\xd5\xe4\x57\x65\x3a\x99\x47\x9d\xb6\x43\x62\xed"
+ "\x13\x9c\x20\xce\x52\x89\xde\xdd\x62\xc7\x74\xc7\xb5\xf9\xcd\xae"
+ "\x8a\xda\x26\xbb\xe6\xe6\x0e\xda\xc7\x0f\xef\xf7\xd9\xe1\xc9\x6c"
+ "\xba\xdf\x61\x61\x6e\xda\xbf\xd2\xbb\x7d\x79\x96\xcd\xd7\x8d\xb1"
+ "\x1c\x73\x23\x0e\x37\xc6\x72\x61\x06\x1c\x57\x96\x9a\x59\xaf\xcd"
+ "\xdc\x0d\x27\xa4\xda\xf3\x6c\x55\x41\x1a\xd2\x60\xc2\xfa\xf2\x8e"
+ "\xe3\x33\xa7\x01\x63\x20\xec\x2b\x0b\xad\x45\xb4\x8f\x68\xdd\x38"
+ "\x47\x74\xa3\x89\x3d\xb3\xa0\xcb\xb4\x09\xae\x3b\x29\xd5\xf1\xb8"
+ "\x80\xef\x31\x78\xa6\xe0\x6e\x5f\xf4\xf2\x42\xda\x7b\x90\x55\xbf"
+ "\x96\x25\xf6\x25\xac\xe3\x67\x3b\x22\x0d\xed\x2c\x21\xbf\xcc\xd7"
+ "\xbb\xa5\x8c\xce\x55\xb3\x6e\x3a\x09\xc7\x55\x79\x8e\x51\xaf\xf1"
+ "\x3d\x0b\xb1\x4d\x65\xde\xf2\x83\x66\x9f\xee\x60\x31\x2b\x3f\xda"
+ "\x62\x2b\xb4\x83\x38\xf3\xa5\xee\x0b\x16\xf3\xb0\xcd\x57\x7e\x70"
+ "\x21\xa6\x37\xd9\x9c\xbd\x3c\x1d\x71\x34\x53\x7c\xd9\xa3\xfb\x7d"
+ "\x16\x2b\xff\x7d\xb6\xf5\xea\x5e\xe8\x94\xea\xf8\xde\x7d\x94\xce"
+ "\xb6\x1e\xe5\xfc\xf1\x6d\x3d\xda\x14\x16\x0f\xda\x9e\x88\xdf\x67"
+ "\xb9\x2a\xea\xda\x95\xb3\x47\x94\xba\x08\xaf\x5d\xc6\x15\x62\xdd"
+ "\x47\x2c\xdb\xb6\xbc\xdc\x55\x51\x1f\x85\xf1\x62\x97\xe0\x71\x7d"
+ "\xbc\x5d\x13\x96\x27\xdf\x27\xda\x35\xc3\xd2\xe4\xfb\x54\xbb\x66"
+ "\xcc\x24\xf9\x3e\x4d\xd9\xd3\x31\xf8\x1e\x93\xcb\x17\x22\x6f\x8b"
+ "\x7d\xbb\x72\x74\x14\xeb\x52\xfc\xce\xa2\x97\x2f\x34\x8c\xa6\xf3"
+ "\xfa\xea\x8f\x62\x9d\xc5\x62\x7f\xff\xfa\x97\xf1\x37\x56\xfe\x75"
+ "\xc8\xbf\x8c\x60\xb8\xde\x24\x2c\x05\x56\x59\x97\x41\xbc\xdd\xe4"
+ "\x65\x3e\xc4\x5b\x8d\x7c\x6a\xb6\x99\xbb\x64\xfe\xd5\x7f\xc8\xe3"
+ "\x7e\x92\x1d\xca\x97\x45\x1c\x6d\xe6\x75\x6d\x6b\x34\xa9\xe9\x4a"
+ "\xbd\xf5\xb6\x1f\x4c\xbc\xfd\x8e\x1f\x4e\xba\x73\xc9\x63\x8f\xe7"
+ "\xe5\x2f\x7d\xa2\x60\xd9\xf2\x27\x0b\x57\xac\x5c\x65\x7a\xaa\x68"
+ "\x75\xf1\x9a\xb5\xeb\xcc\xeb\x37\x20\x9e\xfe\xb3\xda\xd8\xae\x74"
+ "\x8d\x53\x02\xac\x63\x2a\xd6\xd1\x70\x3b\xa7\x05\xd3\x84\xec\x1b"
+ "\x12\xb5\x86\xe0\x71\xb5\x0d\x23\x5d\x3a\x3f\xa6\x5b\x6a\xd8\x4c"
+ "\x67\xd9\xa0\x8e\x69\x6c\x35\xf7\x5a\xe9\x7c\xb1\x4e\xa9\xa1\xf8"
+ "\x88\xe3\x5e\x2b\x9d\x6f\x77\x20\xbe\x0b\x12\xc7\xd2\x19\x64\x0d"
+ "\xb9\x94\x5f\x7f\x23\x40\x2b\x96\x0d\x86\x73\xac\x1e\xe2\x5f\xbc"
+ "\x92\x39\x76\x5e\xc9\xba\x09\xff\xce\x97\x58\x97\xe3\xe9\x02\xd8"
+ "\x8e\xcf\xa8\xe7\xfa\x13\xd2\xab\xb7\x1f\x48\xe0\xe7\x34\x25\xd4"
+ "\xbd\xc4\x3a\xb7\x5c\xc9\x3a\x9f\x79\x89\x75\xd7\x5f\xc9\xec\x89"
+ "\x3b\x21\xca\x55\xd1\xd0\x65\x97\x1a\x8c\xdc\x66\x30\xdf\x17\x59"
+ "\x6f\xdf\x81\x79\x13\x3c\x10\x56\x8f\xcf\x98\xe6\x3c\x60\x10\x74"
+ "\xef\xfd\xca\x1d\x8e\xed\x3b\xc4\xfa\x0a\x35\xdb\xb1\x1e\x21\xa3"
+ "\x57\x1f\x6e\xc5\x5e\x1c\xeb\x73\xd8\xdc\xc7\xc1\x2e\xbd\x9a\x53"
+ "\x7f\x8e\xd7\x17\x6b\xab\xee\x06\xc2\xf7\xcb\x22\x77\xf8\xea\xab"
+ "\x99\x07\x61\x27\xf9\x9e\x2e\xd4\x20\x4c\x1c\xe2\x76\xaa\xdb\x93"
+ "\xb4\x74\x45\xb1\x61\xe5\x9a\xc2\xc2\x71\x91\x90\xc4\x7f\xfd\xce"
+ "\xc6\x2b\xa6\xfd\x65\x5f\x7c\x89\xb5\x62\x3b\xad\xd8\xde\xb6\xc3"
+ "\x18\xbd\xa3\xbe\x00\xb6\xa9\x0a\xf1\xbe\x85\xe9\xfb\xf1\x7e\x3f"
+ "\xd2\xde\x26\xce\x53\x7b\xe7\x8f\xac\xe2\xd5\x3c\xa4\xb3\x8d\xce"
+ "\xd8\xa0\xfd\x68\x7b\xd6\x65\x6b\xb0\xdd\x3b\x11\xae\xcd\x70\x35"
+ "\xdc\x70\x42\xfa\xd9\xed\x48\x47\x23\xde\x13\xfc\xe7\x24\x47\x84"
+ "\x6f\x15\xed\x7a\x87\x9f\x9d\x89\xbc\xb2\xd6\x5e\xc9\x2a\x5d\x15"
+ "\x3f\xd3\xd3\x3e\xdb\xfc\x3c\x22\x7c\x46\xbe\xb4\x21\x6c\x55\x4f"
+ "\x69\xb6\x06\xc7\x81\x9a\xfa\x7e\x9c\xaf\xda\x89\x26\xa2\x83\xc6"
+ "\x96\x1f\x63\xf4\xe6\xeb\xcb\x81\x14\x37\x68\x3e\x46\x4f\x56\xf3"
+ "\x12\x6b\xc0\xab\x06\xaf\xea\x83\x98\xf7\x3b\xbc\xda\x30\xfd\x10"
+ "\xfe\x1e\xc4\xdf\xdf\xe1\x85\x63\xd3\x78\xa2\x7b\x75\x09\xeb\x9a"
+ "\x50\x0d\xd7\x13\x7e\xd4\xad\x87\x8e\x4b\xef\xa4\x12\xed\xb4\x8f"
+ "\x3d\x8b\xfc\x59\xa3\xff\xde\xdf\x8d\xf1\x80\xf9\xf8\x9b\x2c\x7e"
+ "\xd5\x57\x63\x31\x5e\x3b\xe5\xfb\x63\x78\x69\xe5\x7b\x07\x5e\x9e"
+ "\xaf\xbf\x02\xf1\x85\xba\x5e\x2b\xb8\x78\xd8\x8b\xba\x1a\x2f\x0e"
+ "\xee\x17\x06\x90\x5e\x37\xe3\xd5\xec\x9f\xfe\x7a\xb9\x48\xfb\x65"
+ "\xb6\x78\xfe\x65\xae\xfc\x5b\x09\xd2\x5e\xe4\xd3\x5e\xc4\xbf\xb7"
+ "\x4d\xa4\xed\x3d\x8a\xbf\x09\x78\x25\x05\xd4\x4f\x38\xb9\x5e\xf5"
+ "\xd1\xd9\x6e\x28\x4b\xbb\xf4\xb3\x62\x92\xd1\x0e\xa1\x5b\x1a\x1f"
+ "\xe3\x69\x26\xd4\xad\x9a\x01\xfd\x69\xcc\xf7\xd7\x9f\xc6\xac\x00"
+ "\xfd\xa9\x22\x5f\x84\xb6\xb0\xbf\x5e\xe8\xcb\xfe\x9e\xa7\xf3\xf0"
+ "\xb9\x31\x1b\xf1\xec\xa7\x39\x0f\xc4\xc1\xfb\xef\x1d\x27\x71\xdc"
+ "\x59\x00\x5a\xf2\x2f\xdd\x52\xe3\x6b\xa4\xb3\x54\xb7\x5c\xaf\xa0"
+ "\x05\xe9\xc3\xb4\x06\xa2\x6f\x15\xe2\xc5\xe7\x46\x84\x6b\xb0\xc1"
+ "\x57\x0a\x6d\xbc\x4c\xc5\x72\xd4\x47\x99\x5e\xc2\x49\xe5\xd8\x40"
+ "\xbb\x4c\x54\x46\xd4\xfd\xda\xc3\x98\x4e\xe3\x54\xfa\x9e\x29\xcc"
+ "\xe6\xb1\x03\xe9\x24\xfd\xda\x3c\xa9\x68\x4b\x19\xe0\x73\xe5\xc0"
+ "\x84\x78\x48\x45\x7b\x8b\x38\x2e\xbd\x96\x36\xbe\x04\x52\x09\x1f"
+ "\xf9\x74\xbb\xf4\x1a\xd4\x93\x2d\x0a\x5c\xf2\xf9\x7f\x3f\x33\x1d"
+ "\x34\x01\xaf\xa7\x8e\xe8\xc1\x7c\x55\xbd\x3b\x69\x1c\xba\x63\x83"
+ "\x68\x2b\xd6\xd5\x88\xe5\x9b\xa9\xed\xc4\x4f\xcc\x6f\x41\x3c\xd5"
+ "\x94\xc7\xcf\x02\x12\xed\x69\xa4\xf3\x22\x88\x1f\x04\x4f\xe7\x35"
+ "\x8a\x7d\xbf\x5f\x7d\x9f\xf3\x0d\xcb\x93\x3c\x18\xd6\x41\x38\x4a"
+ "\x3d\xcc\xc3\xd0\x1f\xed\xde\xe0\xc6\xb8\xe2\x17\x23\xfc\xe5\xf3"
+ "\x9a\x43\x2d\x1f\x2c\xd7\x8c\xe5\x5b\x19\xb6\x91\xfc\x09\xd6\x19"
+ "\x4b\x67\xc4\x61\x5a\x95\xaf\x02\x71\xac\x75\xf3\x79\x1a\xc4\x43"
+ "\x3e\xa5\x8a\xf0\x20\x3d\xad\x02\xd7\xcf\xd3\x7e\x53\xe2\x2f\x6b"
+ "\x19\x5f\x23\xc9\x9c\xdb\xf3\x06\xde\x26\xf4\x5d\x3f\xff\x7d\x9d"
+ "\xc8\x6b\x41\x98\x16\xd6\x97\x01\x74\xfe\x82\xe8\x4b\x78\xde\xbe"
+ "\xd2\xf3\x5c\xbe\xad\xc2\xaf\xfd\xfc\xcb\xd5\x1b\x59\xd7\x00\xdd"
+ "\x3f\x6f\x52\xce\xb0\x90\xe9\xde\x47\xf5\xb1\x75\x0b\x79\xbf\x4a"
+ "\x75\x50\x79\x19\xdf\x16\xc2\xa7\xf0\x6a\x3c\xd2\x21\xf8\xf5\x5a"
+ "\x0b\xa6\x37\x92\x2e\x72\xbe\xa1\x1f\xed\x29\x25\x5d\xfc\xf9\x1e"
+ "\x2c\xbf\x7f\x3b\x3d\xaf\xe3\xcf\x46\xee\x63\xfb\xf3\x5f\x73\x52"
+ "\xbe\x0d\xc7\xf9\x3b\x9e\x44\x5d\xf2\x01\x5c\x1f\x07\xa9\x4e\x0b"
+ "\x6f\xdb\x1e\xe7\xd3\xe9\x9a\x03\x1e\x00\xa2\x13\x79\xd4\xe2\xaa"
+ "\xf8\x45\x36\xf6\x35\xfc\x4c\x37\xf4\xd7\xfb\xd8\xee\x1c\x20\x9a"
+ "\xd1\x9f\xc9\xf4\xfd\xe2\x43\x59\xf6\xfb\xa8\x8d\xc4\xcf\xf1\xc2"
+ "\xf7\x61\xde\xeb\xcb\x88\xf6\x81\x76\xff\xa2\x41\xcd\x63\xde\x6e"
+ "\x94\x03\xc9\x8b\xe4\xa2\xc2\x49\xba\x5f\x85\xb8\xf6\x88\x67\xa1"
+ "\x1b\xc4\xeb\xaa\x2b\xd9\x21\x82\x1f\x80\x6d\xe2\xfb\xf1\x6f\xc2"
+ "\xba\x27\x98\xb0\x4f\x47\xbb\xa0\x73\x48\x10\xef\x1e\x3a\x8b\x13"
+ "\x71\xb4\x10\x4f\x91\x96\x14\xd2\x47\x7c\x3e\x24\x97\x4b\xc6\xfe"
+ "\x9c\xae\xb4\x01\xfb\x7f\xfd\x5a\x7f\xfd\x6a\x0a\xb4\x7f\x92\x77"
+ "\x95\xaf\x34\x03\xb8\x3e\x14\x81\xe1\xb4\xd4\xf4\x9e\xdc\x77\xc8"
+ "\xb2\x7e\x3d\xfa\x00\xda\x8b\x0a\xc7\xce\x00\x59\xb7\x70\x7d\x5c"
+ "\x37\x4b\x43\x6d\xc6\xb2\x2d\x32\x1e\xde\x66\xae\x4f\x16\xae\x03"
+ "\x87\xd8\x3a\x6c\x67\xbf\x1e\xfc\xc2\x21\xcb\xf9\x50\x00\x4f\x14"
+ "\xdf\x95\x46\xe7\xc5\x91\x4f\xc2\x18\xf7\x6e\x57\xdf\x80\x5f\x22"
+ "\xd9\xfb\xb8\xec\x9b\xaa\xeb\x45\x7f\x2b\xfb\xad\x26\x91\x7f\xa5"
+ "\x9f\x0e\x13\x2d\x87\xb9\xfe\x12\x2d\xa5\x0b\x89\x96\x16\x4e\x47"
+ "\xa9\x01\x4e\x4b\xaf\xa7\x53\xfd\x58\xb6\x5d\xb6\x57\x19\xd7\x2f"
+ "\xc8\xf6\xf7\x3f\x83\xbe\x8a\x68\xc2\xba\x53\xb9\xff\x9b\xc1\x79"
+ "\xf2\x9a\x4c\x7b\x9b\xdb\x42\x65\x1b\xab\xcf\x4b\xbc\x6c\x1b\xde"
+ "\x47\xb9\xc5\x99\x32\x91\x58\xbe\x89\xf6\xf1\x3f\x21\xfd\x92\xfc"
+ "\x85\x86\xde\x21\x9d\x90\xde\x3a\x45\xdf\x7b\xa2\x4f\xd1\x22\x3e"
+ "\x1d\xe9\xa8\xa2\x17\xdd\xd2\x5b\x9f\xd2\x78\x01\x79\xbd\x07\x63"
+ "\xa4\x26\xe2\x37\xe9\x32\xc6\x48\x13\x5d\x15\x6f\x44\x29\x7a\x8b"
+ "\xf5\xd4\x10\xef\x85\x7c\xde\x78\x00\xf5\xb8\x65\x40\xb7\xde\x78"
+ "\x40\xe6\x63\x13\xf2\x51\x87\xf5\xfd\x5e\x6e\x57\x13\xc2\x63\x2c"
+ "\xf6\xd6\x6f\x64\xda\xe5\x73\x03\xdf\x58\xa1\xc8\x41\xb6\xd5\x43"
+ "\xdb\xc9\xff\x72\x19\xbc\xa9\x95\xcb\x36\x8a\xba\xde\x0c\x57\x60"
+ "\x29\x46\x14\x67\x45\xbd\x19\x4e\x7e\x70\x02\xca\x9e\xfb\x3e\x7e"
+ "\x4e\xad\x48\x23\xdb\x11\x75\xbc\xf5\x16\xd7\x43\x8c\x7b\x06\xf4"
+ "\xe8\x8d\x63\x01\xfe\x89\x7c\x71\xd5\x11\xc4\x41\xfe\x94\x74\x89"
+ "\x7c\x2a\x8d\x57\x90\xc6\x7d\xb2\xfd\xc8\x34\xbf\x39\xd3\x5f\x57"
+ "\xde\x7a\x19\x75\x25\x65\x00\xf7\x9b\x93\x82\xf5\x73\xf5\xc2\x07"
+ "\xd6\xc8\x6d\xdb\x2a\xb7\x6d\x8f\xdc\xb6\xad\x72\xdb\x9a\xb0\x0e"
+ "\xe2\xdb\x6c\x15\x1f\x91\x6f\x7b\xde\x93\xe1\x5b\xc8\x97\x0f\xd8"
+ "\xeb\x9b\x67\x15\x5b\x1e\xec\x2f\xf6\xbc\x4e\xf6\xa0\xa2\xab\x3d"
+ "\xc0\x5f\xb4\x04\xf7\x17\x6f\x36\xc8\xed\x6d\x08\xb0\x8d\x46\x39"
+ "\xde\x7d\x5f\x91\xc3\x11\x1c\x8f\x89\x73\x91\x5e\x7d\x9f\xfc\x27"
+ "\xd5\xad\xee\x83\xea\x04\x5f\x65\x5b\xde\xf3\x6f\x83\xe5\xb0\x27"
+ "\x4f\x6d\xcf\x24\x6b\xf2\x09\x84\x83\x64\xca\xe3\x4a\x4c\x13\x72"
+ "\xdd\x93\x46\xbe\x41\xed\xa3\x11\x76\xa7\x8f\x91\xbd\xec\x29\xf0"
+ "\xb7\xc5\x37\x8f\xca\xb6\x28\xd7\xfd\xd6\x9d\x28\xa3\x54\x55\xbd"
+ "\xc7\x02\xea\x25\xd9\xb4\x12\x1f\x64\x99\xde\xa0\xf4\x69\x04\x8f"
+ "\x65\xcd\xae\x8a\xb7\xf4\x01\xfd\x63\x15\xd1\x87\x75\x95\x73\x9f"
+ "\xf5\x12\xf7\x15\x66\x17\xa7\xe7\xad\xb8\x7a\xb9\x9f\xc0\xb4\x54"
+ "\x91\xb6\xc7\x2e\xf7\x25\x8a\xde\x3c\xeb\x4f\xd3\x5b\xa6\xe0\xf1"
+ "\xd1\x9b\xe5\x4a\x7c\xc4\x71\x71\x5f\xf4\x56\xb1\xdc\x3e\x4a\x4b"
+ "\x11\x69\x6f\xa6\x51\xda\x76\xc1\x87\x9d\x8c\xf7\x57\x6f\xd8\xe5"
+ "\xfe\x8a\xec\x4b\xc2\xe7\x2c\xb2\x31\x7a\x46\x1c\x6d\x84\xdf\x56"
+ "\xd6\x4b\x63\x88\x6a\xbb\xf4\x7a\x37\xf9\x03\xf2\x17\xb4\x2e\x95"
+ "\xff\xce\xe1\xbf\x57\x90\xdf\xa1\x38\x84\xf2\x11\xee\x18\xf9\x22"
+ "\x4c\x1f\x67\xb8\x0f\xe3\x82\xbf\xe8\x10\xef\x2f\xa3\xe4\xb2\x93"
+ "\x79\xac\xf0\x97\x8c\x30\x25\x4d\x29\x87\x7e\xeb\x14\x95\xa3\xf2"
+ "\x8a\xff\x22\xdf\xe5\x21\xdf\x24\xea\xdb\x2c\xeb\x38\x1f\x37\x28"
+ "\x71\x51\x9f\xa4\x82\xa5\xf3\x64\x84\x4f\x3b\x24\xfc\xd9\x2f\xdf"
+ "\xa7\xb2\x5c\x7e\xe8\x2b\x37\x9d\x67\x9f\xd7\x17\x81\xb6\xee\x2b"
+ "\xf2\x8b\xaf\xee\x17\x74\xee\x8d\x97\xdb\xf1\x39\x6f\x87\xf0\xa9"
+ "\x55\x82\x96\x57\xf7\xd7\xf5\xf2\x3c\x2f\xb5\x85\xf2\x76\xa8\xf2"
+ "\x58\x5f\x12\xe6\xed\xe5\xe7\x7c\x05\x96\xf3\xf5\x15\x0c\x82\xaf"
+ "\x17\xe7\x01\xeb\xea\x5e\x52\x7c\xef\xde\x6a\x41\xe7\xde\x07\x15"
+ "\xbf\x8b\x7c\xef\x24\xdf\xcb\xf3\x96\xca\x30\x73\xe4\x5f\xee\xdf"
+ "\xf7\x3e\x2b\xf8\x1a\x2f\xc9\xfc\xee\x96\xdb\xf1\x32\x1f\x67\xff"
+ "\x25\x07\x79\xbb\xb7\x44\xe1\xad\xfa\x9e\xec\x07\xeb\xd7\xd3\x33"
+ "\xd7\xfb\x12\x3e\x86\xad\x21\x18\xa2\x49\xf4\x11\xbf\x2c\x0e\x8c"
+ "\xa9\x71\xac\x37\x82\xfa\x25\x11\xab\xbe\xfd\xa5\x3c\xff\x03\xd6"
+ "\xa2\x9f\x61\xbf\xd0\x9c\xa6\xf8\x18\xe6\xca\xc0\x31\xff\x71\x84"
+ "\x69\x9e\x4c\x69\x74\x46\x88\x1a\x86\xfc\xd3\xde\x5e\xbb\x8c\xb3"
+ "\x39\x5e\xf1\x1b\xe4\x4b\x8e\x38\x8f\xcb\x31\x5d\x73\x5b\x9d\xec"
+ "\x4b\x4e\x4b\xcd\xbf\xf3\x8f\xc3\x9a\x7f\xe7\xef\x33\xde\xfe\x34"
+ "\xd0\x67\x60\xdc\xbc\xc5\x55\xd1\x5c\xe3\x17\x07\x60\xda\x85\x7d"
+ "\x47\xb3\x89\x6c\x94\xce\x88\xe3\xfe\x89\xcf\x69\xbd\x7d\xab\x42"
+ "\x33\xf9\xcd\x9e\xa7\x95\xf9\x8b\xb7\x0f\x53\xac\xe6\x5f\xdf\xdb"
+ "\x51\x7e\xbe\x93\xea\x53\xf0\x61\x2f\x45\x76\x64\x2d\xa2\xf9\x96"
+ "\xe6\x63\xb2\x9f\x6f\xf0\xf3\x95\x72\x1f\x46\x7e\xd2\xbf\xaf\x7a"
+ "\xf5\x7d\xff\xbe\xea\xed\xf7\x06\xfb\xc8\xb7\xcb\x2f\xbe\xaf\x7a"
+ "\x3b\x97\xfc\x96\xe2\x23\xfd\x7d\xc1\xdb\x95\x75\x7e\xb1\xec\xdb"
+ "\x71\x4a\x2c\x3b\xe0\x47\x9b\x69\xcc\xb4\x1f\xeb\x6f\x11\x75\xbf"
+ "\x83\xfa\xda\xa0\x53\xea\xc6\xfc\xb4\x23\x06\xd4\xcd\x8a\x57\x4d"
+ "\xa8\x53\x5d\x72\x0c\xc8\x6d\xb3\x97\x9f\x47\xb4\x37\x15\xf5\x2f"
+ "\x92\xf4\xcc\xba\xf2\x2b\xe8\x1c\xe8\x2b\x5a\x7b\x56\x29\xfc\x7d"
+ "\xe7\xdf\xd4\x71\x61\xed\x4b\xac\x1c\xeb\x29\x54\xb7\x71\x1b\xa6"
+ "\xed\x90\xe7\x10\x38\x6f\x39\xae\x77\x8c\xf5\x2f\xf9\xb7\x4d\xb4"
+ "\xe3\x9d\x62\x6a\x07\x8d\x89\xb0\xfe\x89\x14\xf7\x60\xcc\x87\xf7"
+ "\xaf\xb7\xd4\xf7\xeb\x7c\x63\xd4\x79\x8b\x3a\xbe\xfa\x59\x1c\xf9"
+ "\x4a\x79\xec\xd9\x86\xf1\x4e\x95\x7a\x2e\x66\xf6\xb4\x2c\x83\xa9"
+ "\x68\xd9\xca\xe2\xa5\xb7\x19\x96\xad\x5c\x56\xbc\x6c\x49\xe1\xb2"
+ "\x0d\x4b\x8a\x97\xad\x5a\x99\xbc\x62\xc9\x13\xcb\x1e\x37\xac\x5b"
+ "\xb2\xda\x90\x6a\xbe\xc1\x1c\x09\x03\xa0\x77\x19\x96\xac\x5e\xbd"
+ "\x66\x45\x7e\x9e\x61\xe5\xb2\xc7\x53\x8a\xf2\x57\xe7\x17\x1b\x96"
+ "\x14\xad\x5a\xb3\x32\xcf\x70\x43\xde\xf8\x1b\x52\xef\xc8\x8b\x54"
+ "\xcf\xa1\x8d\xd5\x43\xb7\xef\xdc\xff\x75\xed\x38\x07\xba\x58\x8d"
+ "\xa9\x28\xd6\xbc\x6c\xa5\x98\xb3\xfb\xd5\xa7\x13\x76\x82\x89\xce"
+ "\x88\xa7\xf3\x8e\x59\xc5\x3b\x0e\xfc\xd5\x12\x1c\xb6\xd3\x40\x67"
+ "\xc4\x23\xed\x09\xae\x8a\x5f\x35\xd8\xa5\x77\xcb\xf9\x59\xc6\x98"
+ "\x8e\x6d\x4b\x60\xe7\x7e\xd7\x85\x31\x9b\x89\xde\x97\xd7\x9f\x83"
+ "\xb8\xaa\xb5\xa0\xc5\x2b\x0a\x2f\x3d\x9d\x21\x8f\x65\x8e\xda\xa5"
+ "\x7d\x0e\x71\xe6\xcb\xbe\x62\x47\xc4\x1f\x72\x58\xf9\x1f\x72\x84"
+ "\x5c\xf6\x3d\xa5\xcc\x33\x67\x3e\x0b\x99\xa4\x9f\xc7\xa5\x7d\xfc"
+ "\xbd\xd7\x33\xa8\xcb\x34\x5f\xdb\xf3\x9f\x53\x8d\x18\x0f\x1e\xa3"
+ "\xf9\x56\xcc\x7b\xca\x29\x41\x14\xd2\xa5\x3d\x50\x92\x0a\x2f\x62"
+ "\x5d\xab\xe3\x19\x73\x55\xec\x9b\xa4\xcc\xa7\x61\x1b\xf4\xd8\x96"
+ "\x0e\xd1\x8e\x5f\x5d\xc3\xdb\xf1\x12\x4b\xdc\x39\x12\xe9\xfb\x09"
+ "\xd1\xb3\x2f\x4f\x69\x03\xd2\xdd\x61\x97\x7e\xd5\x86\x74\xea\x89"
+ "\xae\x60\x73\x7d\x34\xdf\x85\x74\xbe\xe5\x5b\x8b\x7c\x1b\x2d\xce"
+ "\xb8\xdb\x51\x27\xec\x0f\xdb\xd3\x59\x8f\xf7\xdb\xbf\x82\xa8\x6d"
+ "\x74\x3e\xb9\xe5\x3a\x76\xd8\xe9\x01\x5b\x41\x07\xc4\xae\x67\x0e"
+ "\xf6\xef\xff\xd7\x25\xb7\xa9\x83\x7c\xc3\xaf\x96\x77\x68\xa9\x4d"
+ "\xd8\x57\x44\xd5\x7f\x15\x72\x6e\x51\xfb\xe2\x95\xcc\xc9\x76\xa9"
+ "\x63\xae\x5f\xf3\x73\x80\x28\xde\xea\xb1\xd0\x99\xd6\xbf\x4e\xc2"
+ "\xba\xcb\xe4\xd8\xd8\xc9\xfa\x16\xaa\x62\xa9\x5f\x93\x9e\x39\x43"
+ "\xe0\xd6\x29\xb8\xe9\xdc\x73\x2a\x23\xe4\xff\xeb\xb7\xb0\x8c\x43"
+ "\x85\xbf\x3c\x10\x3f\xe1\xc4\x7b\x87\x52\x8f\x18\x87\xff\x9a\x62"
+ "\x02\x07\xea\xb2\x23\x44\x7d\x89\x3f\x79\x89\x1d\xb5\x61\xfa\x8e"
+ "\xf3\xa0\x45\xd8\xa3\xf5\x2f\x71\xfc\x5d\xc8\xf7\x59\x84\xff\x99"
+ "\x2b\x01\xb6\x20\x4c\x4f\xc5\xbe\x32\x27\x3f\x83\xfc\xdf\xa9\x5f"
+ "\x33\x07\xce\x63\xcb\xfa\x7c\x57\x80\x3e\x1b\x7f\x42\x31\xe1\x4e"
+ "\xc4\x8f\x3a\xb4\xe3\x2c\xf6\xc3\xf8\x3c\x7e\x27\x24\x51\x3d\x78"
+ "\xdf\x4e\xf3\x21\x88\x33\x47\xa9\x8f\xa1\xfe\x6f\xf7\x89\x39\x18"
+ "\x59\xb7\x92\x69\xee\xba\xd4\xcc\xd8\x01\xf4\xef\x44\x23\xe9\x18"
+ "\x96\xa9\x54\x74\x0a\x75\xfd\x28\xd7\xab\x38\x48\x62\x15\xff\xae"
+ "\xaf\x1f\x89\x70\xa8\x57\x75\xa8\x4f\xa4\x57\x08\xdb\xa2\xe8\x14"
+ "\xea\x5a\x3b\xc1\x21\x0d\x91\xcd\x1b\x8c\x5a\xf2\x91\x9d\xd2\xbb"
+ "\x29\xa4\x63\xec\xa7\xf7\x77\xb0\xab\x16\x74\x08\x39\xbd\x9b\x62"
+ "\x73\x0b\x19\x0c\xf0\xfd\x5d\x50\xf1\xbd\x1d\xf5\x38\x92\xf8\x2c"
+ "\xe6\xaa\xdf\x4d\x41\xda\xda\x79\x2c\xbe\x11\x65\xc0\xfb\xaa\x7f"
+ "\xef\xa6\xf2\x32\x0f\x0f\x0d\xf0\xf0\xdd\x8c\x60\x3c\x0c\xe0\x9d"
+ "\x56\x9c\x73\xfe\x6e\x36\xd9\x0a\x96\x29\x51\xce\x2e\x0f\x26\x4b"
+ "\xac\x43\xab\xdd\x09\x3a\xaa\xa3\x35\x8e\xc3\xef\x51\xea\xd8\x81"
+ "\xbc\x76\x94\x16\x5c\x50\x9f\x5b\x1b\x00\x68\x4e\x9c\xca\x27\xc6"
+ "\x11\x7f\xdf\xed\x1e\x28\xcf\x9c\x81\xe5\x6f\x78\xdc\x8f\x56\x7e"
+ "\xb1\x8a\x16\x78\x71\x24\xea\x11\xa7\xb7\x25\xf9\x42\xf4\x26\x1a"
+ "\x44\x3f\x69\x1d\x4b\xfa\xdd\x92\x6f\xab\x06\xa0\x34\xf9\x39\xbb"
+ "\x07\xfb\x9e\xc0\xf9\xfd\xd0\xef\x1b\x5a\x5e\xf3\x7f\xdf\xd0\xb2"
+ "\x33\xd4\xfb\x86\x80\x7a\x3f\xa7\x7a\x7d\xf5\xd9\x1a\x55\xdd\x87"
+ "\x7c\x41\xea\x56\xca\x8f\x6f\x50\x8f\x67\xde\xbb\x95\x68\x38\x82"
+ "\xfd\x14\xbb\x26\x5b\xc3\x10\x4f\x2b\xef\xc3\xdf\x4b\x15\xf1\x0b"
+ "\xc5\x45\xef\xe9\x09\x26\xb0\x1d\xfd\x7f\xba\x38\x1a\xff\xc2\x79"
+ "\xfe\x10\x3e\x03\xf4\xf4\x6b\x28\x50\xb2\x25\x3f\x60\x60\x41\x1e"
+ "\xa2\x00\xc6\x70\x78\x86\x7f\x22\x49\x7e\x76\xf0\x07\x6d\x3f\x7c"
+ "\x7f\xfe\xb7\xf8\x8b\x10\xf4\x72\x7c\x6e\xd0\xc8\xf5\x95\xab\x20"
+ "\xd2\x2f\x50\x9a\x81\x52\x24\xd8\x1f\xf5\x36\x65\xd9\x38\xa6\x1f"
+ "\xd3\xc4\x81\x19\xf3\xc8\xf8\x95\x67\xa6\x7e\xa6\x14\xff\x67\xfc"
+ "\x0b\x5b\xa8\xaa\xe0\xba\xb0\x3c\xbe\xf4\x29\xd1\xde\x9f\x24\x35"
+ "\xe8\xd5\x55\xea\xa1\x2c\x9c\xdf\xc4\xd2\x3f\x6e\xc4\x97\x84\xf9"
+ "\x63\xda\xfa\x01\x2e\x77\x6e\x56\x81\x7f\x2c\xc8\xbf\x3e\xfe\x02"
+ "\x6d\x1c\xea\xdf\x68\xd5\xfd\x75\xe2\x67\x6c\xc7\x25\xc4\x7f\xe1"
+ "\x3f\x43\x7b\x84\x72\x3b\xa0\x1e\xd7\xe7\x06\x03\x1d\xe0\xff\xf5"
+ "\x56\x25\x49\xad\xa1\x03\xf9\x37\xa5\xf9\x3f\x27\xb9\xfd\x9f\x6f"
+ "\xc9\xf8\xf6\x84\xa3\x0d\xd2\x3f\xa5\xf6\x11\x00\x37\xc7\xf5\x27"
+ "\xc6\x06\x98\x4c\x6c\x55\x80\x09\x0d\xfc\xc9\xd4\x84\x21\x3d\x35"
+ "\xaa\x64\x6d\x70\xe8\xbf\xce\xdf\xd5\x9b\x65\x83\xb8\xce\xa1\x1f"
+ "\x94\x39\x25\x20\x8d\x9e\x87\x19\xe4\xb4\x5b\x7f\x33\x08\x9e\xa7"
+ "\x19\x54\xcf\x1a\x23\xfe\xd3\x00\x70\x43\xe1\xa5\xa0\xf5\xfb\xbf"
+ "\x7f\xc1\x3f\x0d\xd9\xc7\xf7\x7f\x7f\xa5\x3f\x26\x7a\x71\xf4\x44"
+ "\xfc\x87\xfe\x63\xfd\x8e\x92\xc9\x19\x4c\x4e\x60\xf2\xcd\x25\xe9"
+ "\xc7\xbf\xff\xfb\xfe\xef\xfb\xbf\xef\xff\xbe\xff\xfb\xfe\xef\xfb"
+ "\xbf\x7f\x82\x3f\x0d\x1f\x47\x30\xf9\xaf\xff\xbe\x3f\x9f\x86\x41"
+ "\x05\x35\x4c\xd2\x00\x53\x65\x94\xdd\x0e\x1a\x1d\x0c\xd3\x5e\xba"
+ "\x28\xcf\xd0\x4f\xd0\x45\x16\xa0\x6f\x7e\xe8\xbd\xcb\x0f\xf0\xba"
+ "\x46\x95\x3e\xf6\x52\x51\xf4\xad\xff\x34\xc8\xbc\x30\x1c\x17\x86"
+ "\xc3\x30\x18\x0e\x3a\x88\x80\x48\xb8\x0c\xa2\x20\x1a\x62\x70\xbc"
+ "\xa9\x87\x11\x30\x12\x2e\x87\x38\xb8\x02\xae\x84\xab\x20\x1e\x46"
+ "\xc1\xd5\xd8\x92\x04\xb8\x16\xc7\xf6\xd7\x21\x43\xc6\x04\x6f\x4b"
+ "\x19\x18\xe3\xf1\x1f\xfc\x3f\x0b\x8c\xfc\x39\xf7\xfb\xf4\xef\x34"
+ "\xdd\x2a\xa7\xb7\xcb\xe9\xf6\xef\xd3\xbf\xd3\x74\xc3\xdf\xf8\x77"
+ "\xcc\xdf\xf4\x57\x83\x2e\x5b\x78\x6d\x4d\x50\x5f\x19\x98\xaa\x91"
+ "\xff\xfa\x9f\xe1\x6b\xca\x0f\xc2\xe7\x5f\x3e\xf0\xcf\x88\xd7\x44"
+ "\x71\x5b\x0a\x20\xe6\x79\x99\xfa\xcf\x13\xaa\xa4\xf2\xb7\xb9\x13"
+ "\x2f\x07\x5e\x08\xb9\x19\x7b\x18\xcb\x65\x78\x5d\xa1\xe0\x11\x30"
+ "\x74\x04\xde\x69\xcc\xff\xac\x11\xc0\x7e\x0c\x2f\xac\xf6\x73\x33"
+ "\xc0\xf1\x28\x80\x2f\x66\x01\xfc\xef\x1e\x80\x13\xdd\x03\x38\x7b"
+ "\xca\x06\xa8\xfb\xd2\x24\xee\x0d\x78\x9d\x23\x44\x60\xd7\xf4\x4f"
+ "\xef\x59\xa7\x67\x67\x18\x6e\x1d\x3f\x71\xfc\xed\x3f\x58\x62\x48"
+ "\xc9\x4a\x31\xdc\x96\x7a\xeb\xad\x13\x52\xef\x98\x70\xeb\x0f\x0d"
+ "\xb7\xdd\x76\xd7\xad\xa9\x77\xa5\xa6\x1a\x56\xac\x2f\x5a\x76\x6b"
+ "\xea\x13\xf9\x86\xa5\xcb\x8a\x56\xac\x5b\x52\x94\xff\x75\x4d\xfa"
+ "\x26\x7f\x44\xde\xb5\x3e\xe0\x12\xf0\xe7\xf6\x14\x90\x7e\x53\x06"
+ "\xd2\x1f\x72\x61\x90\x78\x34\x55\xf2\x5c\x6a\x92\x7c\x05\x64\xaf"
+ "\xb4\x82\xe6\xc9\x26\xd0\x2c\xb5\x83\x26\xb7\x06\x34\x39\xc7\x40"
+ "\xb3\x3d\x0b\x34\xcf\x1b\x40\xf3\x9c\x11\x34\xa5\x9d\xa0\x31\x47"
+ "\x0d\x4e\xfb\x69\xb3\x48\xdb\x87\x65\xf7\xe2\xf5\x7a\x2a\x68\x5e"
+ "\x4d\x10\x69\x56\x3d\x68\xfe\xe3\x6b\xa5\xfa\x1d\xff\x5d\x6c\xdc"
+ "\x30\xe8\xcf\xce\x75\x8b\x66\xac\x62\xd3\x83\x4c\x8e\x7e\xff\xf7"
+ "\xfd\xdf\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\x7f\xe7\x7f"
+ "\x0e\x0d\x4c\xfc\x4a\xd2\xc2\x6f\x31\x2a\x72\x59\x74\x09\x76\xcd"
+ "\x9d\x13\x69\x2d\x09\xd0\x37\x53\xa0\xe3\xfb\x9e\x88\x4b\x8b\x3f"
+ "\xe1\xd8\xf1\x0f\xc3\x6b\xb8\x4e\xbd\x26\x85\xd6\x1c\x1d\x88\x4f"
+ "\x85\xb0\x78\x10\xeb\xa3\x2c\xac\x5d\x7c\x73\x7c\x1b\x74\x83\x8e"
+ "\xef\x19\x40\xdf\x89\x22\x7e\xb3\x1d\xde\x68\x50\xd6\x53\x29\x70"
+ "\xb4\x9e\x8a\xd6\x5f\x21\x2c\xff\x26\x21\xc4\xfa\x19\x3d\xfb\x69"
+ "\xbc\x34\xad\x16\x80\xbe\x37\x7d\xf1\x25\xe6\x68\x2d\x01\x38\xd0"
+ "\x28\xbe\x3b\xa5\xb5\x35\x88\xbf\xc3\x0e\xe5\x8d\x62\x3d\x15\x73"
+ "\x3e\x83\xe9\x98\xd6\x6d\x87\xad\xca\xf7\x13\xdd\x4a\xba\x6d\xcb"
+ "\x39\x68\x35\xf0\xef\x6a\x1c\xad\x06\x2f\xa4\x8f\xa1\xf6\x47\xc4"
+ "\x23\x6c\xc8\xb5\x34\xca\xba\x31\xaa\x5b\x86\xcf\x08\xa8\x0f\xdb"
+ "\x18\xb1\x50\xa9\x2f\x04\x8e\x28\x2a\xab\xe0\x41\xda\xbb\xb1\x4c"
+ "\x95\x82\x07\xe9\x51\x68\x74\xa4\x6f\xe4\x75\xec\x09\x46\x93\xe1"
+ "\xc3\xb4\xf0\xfc\x3b\x26\x74\xa6\x1d\x5d\x9a\x68\xb8\xe2\xd6\xe9"
+ "\xf9\x89\x37\xb1\xd4\xd8\xe4\xe7\x53\x2f\x33\x46\x18\x63\x26\xcc"
+ "\x4d\x95\xf4\xd2\x58\x29\x75\xa4\x5e\xba\xf1\x31\xfa\xb7\x7d\x74"
+ "\x12\xff\x35\x68\xd3\xb6\xe4\xdd\x61\x18\x3e\xe5\xc7\xcf\xad\x35"
+ "\xbe\xfb\x8b\x19\xc6\x7b\xe7\xaf\x1e\xf7\xdb\x54\xe9\xf2\x3f\x3c"
+ "\xff\x7e\xd2\x57\x04\x31\x66\x2c\xfd\xbb\xf0\x40\x58\xdc\x38\x0b"
+ "\x61\x69\x1f\x65\xf8\x2d\xa5\xdc\xac\x4d\x2b\xce\xbb\x7d\x42\x23"
+ "\xd5\xf8\xe0\xe3\x29\x16\x2a\x33\x63\xb6\x28\x23\x20\x26\xec\x53"
+ "\xe7\x8d\x7f\x87\x4a\x1b\x38\x0d\xa0\x15\xb8\xfa\x71\x5f\x25\x28"
+ "\x14\xa9\x63\x0f\xa7\x5e\x2b\xd7\xfd\x33\xfa\xf7\x91\xdd\xe3\x25"
+ "\xc4\x30\x32\x65\x2a\xe5\x4e\x70\xa5\xba\x0c\xad\x69\xda\x27\x12"
+ "\x93\x86\xdf\xfa\x0b\xbc\x4b\x7c\x22\x51\x2f\xe1\xfd\x8f\xc5\x3d"
+ "\xf1\x20\xef\x87\x02\x42\x2f\xdd\x10\x97\x96\x97\x77\xc7\x67\xce"
+ "\xbc\x3b\xf4\x92\xb1\x31\x2f\xcd\x78\x65\x65\xe1\x2d\x89\x69\x89"
+ "\x79\xb7\xeb\x25\xfe\x7b\x97\xf1\x86\x8a\x47\xf4\xd2\x4d\xbf\x49"
+ "\x1d\xa1\xd7\xfc\x57\x83\x06\x3e\x94\xe6\xed\xf9\x30\xec\x93\x4f"
+ "\x3e\x82\x9b\x57\x7c\xa4\xb9\x79\xd6\x47\x92\x66\xc4\x47\x51\x0f"
+ "\xc3\x7f\xe9\x87\xc3\x7f\xc5\xe3\x65\xb8\x17\xda\x34\xa5\x59\x6d"
+ "\xd2\xba\xdc\xb6\xb0\xd2\x23\x6d\xda\x87\xa0\x2d\x7c\xf1\x88\xb6"
+ "\x61\xf7\x3e\xd0\x36\xfc\xa1\xcf\xdb\x74\x37\x41\x5b\x04\x40\xdb"
+ "\x18\x90\xda\xc6\x42\x5c\xdb\x6d\x23\x9e\x6b\xbb\x77\xb4\x64\xbd"
+ "\xbc\xe7\x1e\xeb\xd5\xda\x19\xd6\x44\x3d\x58\x6f\x88\x04\xeb\x8d"
+ "\x51\x51\xd6\x9b\xf0\x1a\x07\x0d\xd6\x54\x7c\x4e\x83\x04\x6b\xf8"
+ "\x86\x61\x00\x82\x96\x8f\x0c\x00\x1f\x8d\x81\x29\x1f\x8d\xc5\xdf"
+ "\xeb\xf1\x4a\xc4\xeb\x06\xbc\x6e\xc2\x0b\xc7\x29\x1f\xd1\xfe\x3e"
+ "\x90\x34\x2c\xed\xdf\x7f\xb3\x64\xc9\xc4\x25\xb7\x67\x4f\x0b\x0b"
+ "\xcb\x4f\x84\xcb\x90\x6b\xda\xb4\xc4\x31\xe1\x93\xc2\xf3\x13\x3f"
+ "\x73\x1a\xf1\x5f\xbd\xf4\xe8\x7f\x87\x0d\x9b\xe0\x9a\xe4\xca\x7d"
+ "\xf7\x33\x2f\x44\x22\xff\x21\x50\x87\x7b\x2c\xa0\x71\x22\x8d\x4e"
+ "\x4b\xcf\x3d\x2e\x4b\x94\xde\x0e\x11\x05\x8a\x1e\x8b\xbc\xdf\xea"
+ "\x9d\x96\x32\xd4\xbf\xa8\xe4\xe0\x79\x9b\x29\x2f\xe3\x02\xe5\xf2"
+ "\x82\xe7\x91\x4e\x47\x95\x29\x79\x3d\xd2\x81\x2c\x7c\x46\xfd\xd7"
+ "\x4d\xf2\x87\xb5\x86\x39\x2d\x9a\xcd\x98\xb7\x67\x30\x1e\x2b\xe2"
+ "\x49\xaf\xc0\xbc\xb6\x20\x79\xf7\x39\x2d\x73\xa9\x8e\xce\x80\x3a"
+ "\x9c\x4a\x1d\xf4\x3d\x77\x1d\xda\x17\xf9\x1d\x9f\x25\xa2\x85\xca"
+ "\xda\xdc\x0e\x68\xf4\x75\x69\xb4\xe6\x43\x40\x78\x5c\x96\xe8\x44"
+ "\xa5\x3c\xc1\xd1\x7e\x04\xf4\x1d\x1e\x5f\xef\x09\xd1\x0f\xd2\x7a"
+ "\xcf\xed\x88\xc3\xb0\x56\x73\xd5\x71\x88\xf2\x52\x19\x3b\x44\x17"
+ "\x38\xa5\x83\x58\x77\x74\xae\xe2\xe7\x30\x8d\xaf\xcf\xa7\x3a\xb0"
+ "\xed\x65\x98\x57\x32\x98\xe6\x83\x23\x05\x5f\xa2\xab\x95\xbc\x0b"
+ "\xad\x21\x14\x65\x18\x73\x5a\x0e\xfa\xb0\xcc\xa1\xc1\xf8\x58\x99"
+ "\xd3\x22\x3d\x87\x79\x5d\x41\xf2\x36\x8b\xba\x62\xb4\x41\xf2\x2c"
+ "\x98\x27\x61\x9e\x21\x44\x5e\x18\xe6\xa5\x05\xcb\x6b\xad\xe1\x38"
+ "\x73\xfa\x79\x1e\x13\x6d\xc4\xe7\x02\x85\xe7\x5f\xdf\x1e\x92\xf7"
+ "\xad\xc8\xf7\x98\x9a\x40\xfc\x84\xdb\x29\x1d\x26\x7c\x2d\x83\xeb"
+ "\x3e\xa4\x71\x5a\x32\x50\x17\x62\x8e\x0e\xce\xfb\xf8\x1a\xe4\x03"
+ "\xd1\xe5\x08\x92\x97\x80\xed\x41\x7f\x1d\x1b\x15\x04\xe7\x30\xcc"
+ "\xb3\x63\x5e\xd2\xd7\xc8\x43\xcf\x7d\x38\xed\x77\x30\x1a\xc2\x4f"
+ "\xc0\xc8\xc9\xd4\x1e\xa1\x17\x30\xec\x04\x8c\x38\xdc\x23\xd6\xbe"
+ "\x3b\x0c\x1b\x20\x0c\x9f\x5f\x65\x16\xeb\x15\x98\xdf\x8d\xfa\xa4"
+ "\xb3\x9d\xf3\xc0\x09\x88\xad\x44\x98\x30\xfa\x56\x95\xfa\x27\x4c"
+ "\x0f\xb3\xb9\x3d\xf4\xbd\x06\xea\x59\xec\xdb\xf8\x2b\x61\x39\xfe"
+ "\xfd\xc9\xbc\x1a\x48\x24\x1a\xf9\x7a\x55\x8b\x55\x43\xeb\x3f\xa9"
+ "\x3f\x74\x4a\x70\x93\x93\xeb\x6c\x2c\xf6\x7f\xba\x06\x79\xad\x2e"
+ "\xd1\xa0\xc5\xb2\x1b\x25\x3d\x5f\xfb\xed\x40\x5c\x44\xc3\x03\x3e"
+ "\x8b\x55\xea\xc7\x23\x59\x2f\xa3\x75\xbc\x3d\x16\x69\xa6\x53\x8a"
+ "\x65\x02\x8f\xde\xa0\xe0\x21\x38\xac\x8b\xaf\x87\xef\xb1\x68\x7f"
+ "\xa2\x82\x49\x57\xd7\x35\xc1\x09\x61\x44\xf3\x71\xd0\xd7\x50\x7d"
+ "\x72\x1b\xf9\xda\x5a\xdb\x5a\x0f\xd8\x30\xbe\x38\x01\x7a\x33\xb6"
+ "\xd5\x70\xc0\x4d\xdf\x34\x5b\x47\xd4\x6f\x02\xe0\x76\x21\x81\x41"
+ "\xc6\x59\xad\xe0\x24\x1c\xaa\xb6\x8e\x14\xf5\x53\x5b\x75\x20\xc3"
+ "\xb6\xaa\x69\x24\xbc\xd8\xae\xab\xea\x10\xae\x15\xa3\x16\x19\xa6"
+ "\x4b\x81\x51\xc9\x60\x8c\x4c\x1f\xf1\x87\x64\xb6\x50\xb1\x4f\x97"
+ "\x65\x04\xf6\xff\x97\x75\x09\xbb\x1d\x48\x97\x69\x88\x17\x34\x68"
+ "\x90\x06\x8d\x55\xe0\x1f\x91\xa1\xe0\xb7\x83\xde\xad\xa6\xb9\x8e"
+ "\xc3\xea\x23\x84\x9d\x72\xd8\xe2\x01\xd8\x58\x3f\x58\xe4\x85\x24"
+ "\x64\x00\x92\x1d\x46\xe4\x21\x3f\xc2\x10\xa6\x19\xe5\x6d\x50\x60"
+ "\xe4\xf6\xc7\x63\xde\x14\x19\x5f\xab\x0a\x5f\x31\xe1\xa3\xf5\xaf"
+ "\xc2\xf7\x8e\xb0\x0f\xf8\x3e\x68\xc3\x67\xc7\x60\xff\x4a\xf6\x3a"
+ "\x52\x87\x70\x89\x94\x6e\x1a\x0b\xfa\x93\x30\xe2\x8b\x1e\x29\xac"
+ "\x4b\xf0\x62\x24\xfa\xbf\xe8\xfe\xd8\x06\x9f\x27\xda\xc1\xe0\x96"
+ "\xeb\xcb\x23\xde\x0c\xf8\x5b\xaa\x73\x64\xb6\x52\xa7\x92\xaf\xb6"
+ "\x19\x63\xc4\x04\x8c\x4f\x8c\x6f\x18\x13\x8c\xa3\x95\xd8\x65\x72"
+ "\xeb\xd2\xc4\x09\xce\xc9\xad\x86\xdb\x53\x5f\xcb\x4f\x4c\xe6\x7d"
+ "\xff\x4d\xc7\x53\xc7\x62\xef\xfe\x07\xfe\xef\x4f\x28\x25\x91\xa7"
+ "\x60\x3a\xdd\x8f\xa5\x7b\x39\x5e\xc0\xbb\x07\xe7\x85\x0d\xbf\xa1"
+ "\x88\xee\x44\xe4\x60\xbc\x72\xd1\xe3\x61\xe9\xf2\x7d\x8c\xc8\xb9"
+ "\x85\xc7\x1c\x49\x53\xe9\xfe\x46\x8e\x6b\x42\x23\xd5\x3c\xfe\xf9"
+ "\xd4\x1f\xcd\xff\x55\xd8\x47\xcf\x3d\x69\x8c\xba\xc9\x42\x30\xc9"
+ "\xf7\xa7\xee\xc2\x94\x03\x94\x32\xf6\x67\x9c\x02\x75\xa9\x7d\x54"
+ "\x4a\xce\x4f\x48\x9e\x9e\xfa\x6f\x0b\xe6\x5d\xff\x87\xd4\x91\x97"
+ "\xff\x76\xe1\x01\x2a\x7f\xf9\x48\xbf\x9a\xc6\x0e\x50\xf5\xd8\x8e"
+ "\x71\xcf\xfe\xe0\x35\x81\x65\xfe\xbc\xb0\x3f\x18\x47\xaf\x2a\xa2"
+ "\xd4\xeb\x79\x2c\x46\xb1\xca\x84\xb3\xa9\xe1\xcf\xcd\xff\xec\x3f"
+ "\xe6\xef\x6e\x7f\x64\x1c\xb6\xf4\xf2\x9f\xb4\x3f\x32\x7f\xf7\x67"
+ "\xff\x11\xf6\x0c\x41\xde\x9c\x97\x1a\x67\x08\x9f\xbc\xa6\xf5\x81"
+ "\x71\x9c\xaa\xab\x2a\xe3\xab\x47\x35\x5e\xdd\x7c\xcd\xfe\x84\xb6"
+ "\x6b\xff\x7b\xf4\x9f\xae\xfb\x3f\x83\x73\x0c\xc3\x38\xe2\x9e\xd4"
+ "\x31\xfd\x71\x04\x60\x1c\x71\x1c\xe3\x88\x52\x8c\x23\x8e\xa8\xe3"
+ "\x88\xdf\x45\xde\x55\x22\x62\x09\x01\x2f\xe2\x9f\xe4\xff\xc6\xf8"
+ "\x67\x25\xc6\x3f\xc9\x1f\x85\x3f\xf8\xd0\x47\x51\xd9\x22\xfe\x19"
+ "\x11\x3b\x8c\xc7\x40\xa3\xf0\x17\xe3\xa0\xff\x1a\x83\xbf\x49\xf8"
+ "\x3c\x6e\xe4\x70\xff\x98\x68\x6e\x4c\x5b\xf8\x42\x8c\x89\xd2\x30"
+ "\x26\x32\x2e\x69\xd3\xcd\xfc\x4d\x5b\xc4\x24\x63\x5b\x64\x7f\x5c"
+ "\x34\xa3\x2d\x3d\x7e\x42\xdb\x4c\x2d\xb4\xdd\x07\x22\x36\xda\x02"
+ "\xa9\xbf\xd3\xc6\x69\x3e\x8e\x02\xed\xc7\x31\x0d\x91\x1f\xc7\x5a"
+ "\xad\x1f\xeb\xf1\x1a\x01\x0d\x1f\x8f\x84\xe1\xbf\xbd\xa7\x01\x7e"
+ "\x3b\xad\xd4\xfe\x91\x16\x62\x3e\x8a\x80\xb3\x1f\x8d\xc0\xdf\xdc"
+ "\x97\xe0\xa3\x1f\x83\xf6\xa3\x48\xed\xd9\x81\xf6\xc6\x7d\xf1\xd1"
+ "\x98\x0f\x27\x7f\x34\x36\xed\x3f\x3f\xba\x3e\x7d\xee\x47\x89\x1f"
+ "\x7e\xf8\xd1\x0d\xf6\xd1\xea\xb8\x89\xda\x0c\x70\xcb\x16\x8a\x60"
+ "\x91\xdf\xb7\x27\x0d\x4b\x1d\xf6\x6c\x3e\x8f\x07\xef\x90\xe3\xc2"
+ "\x3b\x8c\xd3\x9f\x9b\x3f\xff\xf1\x30\xc9\x38\x9a\x47\x97\x72\xa4"
+ "\x39\x10\x7d\xfa\xc7\x9c\x93\x5b\x07\x62\xce\x44\xe7\x40\xcc\x69"
+ "\x18\x36\x79\xad\x5f\x7c\xd6\x87\x69\x47\xd3\x12\x0d\x37\xa4\xf2"
+ "\xc8\xac\x7d\x54\x60\xb4\x36\x7e\x5b\xea\xe4\x44\xdd\xed\x1d\x18"
+ "\xb3\x0d\x2f\xff\xf1\xe3\xbf\xa0\x0b\xa3\xb6\xf3\x7a\xe9\xb9\xe5"
+ "\x4b\x26\xe5\x3c\x73\x33\xca\xfc\x72\x8a\x82\x87\xff\xf8\xd9\x96"
+ "\x1f\xff\xf8\xb9\x96\x8f\x1e\x99\x37\xee\x1d\x4c\xfb\x6d\x62\x31"
+ "\xea\xcf\xff\xcb\xfb\x7f\x13\xce\xa6\x85\xff\xf8\xa1\x96\xe7\x7e"
+ "\xfa\xc4\x13\xad\xa4\x2f\x24\x5b\xa5\x8f\xea\xb1\x8c\xc4\x98\x44"
+ "\xf3\xae\xcb\x72\x05\xc6\x3f\xa3\xda\x02\xfb\xb2\xef\xed\xf2\x7b"
+ "\xbb\xfc\xde\x2e\xff\x16\x76\x79\x25\x08\xbb\x1c\x55\x19\xcc\x2e"
+ "\x67\xce\x99\x91\x79\x97\x61\xcd\xe3\x06\x53\xd1\xaa\x27\x8a\x96"
+ "\xac\x30\x14\xae\x5a\x92\x97\x9f\x17\x09\xfd\x19\x4b\x1e\x2f\x5e"
+ "\xb6\x76\x49\x71\xfe\xa0\x6f\x1b\xe3\x95\x98\x74\x70\x6c\x3d\xca"
+ "\x1d\x3a\xb6\xbe\x3a\x2e\xf8\xb8\x44\x83\x7d\xfb\xd5\xa9\x41\xf2"
+ "\xc6\xca\x79\xb3\x82\xe4\x4d\x95\xf3\x0a\x82\x8c\x01\xa3\xc5\x18"
+ "\xe3\xea\x2d\xc1\xf2\x30\xbd\x46\x89\x49\x70\x9c\x26\xb5\x8e\xed"
+ "\x06\x8a\x49\x4e\xc0\xd5\x1f\x62\x9b\xba\x30\x7f\xbf\x12\xcb\xd8"
+ "\xe1\xea\x2d\x4a\x8c\x26\x8f\x43\x92\x9c\x16\x23\xb6\xf3\x6a\x7b"
+ "\x90\x31\xca\xcd\x72\xbd\x9e\x81\xd8\x68\x8e\xc1\x65\xb9\x26\x6a"
+ "\x70\x6c\xd4\x0e\x62\x0c\x79\x4d\x52\x00\xec\x24\x05\x16\xe3\x49"
+ "\xda\xf3\xa1\x9b\xbe\x49\xeb\x86\x6b\xf6\x33\xcb\xa8\x6a\x8a\x29"
+ "\x69\x1c\x49\x78\xc4\x58\xb2\x83\x8f\x25\x71\xac\xd8\x89\x65\x8b"
+ "\x55\xe3\xc9\x4e\x8c\x8d\x87\xd3\x78\xf2\x04\x5c\xf3\x2a\x8d\x29"
+ "\xb7\x73\x5c\x27\x09\xd7\x6c\xc2\x65\x87\x6b\xac\x3c\xee\x13\x65"
+ "\x9b\x55\xf3\x66\x38\xae\xbd\x86\xef\x05\xaa\xc4\x85\x98\xdf\x6e"
+ "\x97\xbe\x8a\x53\xda\x40\xb1\xa0\xdc\x8e\x32\x21\x87\x6b\x82\x8c"
+ "\x7f\xda\x7f\x22\xc6\x81\x09\xfd\xe3\x1f\xc2\xe7\xb3\x8c\x7a\xbb"
+ "\x8e\xe3\x4c\x48\x54\x70\xaa\xf5\xf2\xf1\x55\x2b\x97\x2e\x7b\x62"
+ "\x4d\x51\xbe\x61\xf5\xac\x59\x86\x15\xab\xf2\xf2\xc7\x8f\x1f\x1f"
+ "\xe9\xa7\x7f\x51\x22\xa6\x3d\x68\x24\x3d\xa4\xb8\x56\xd6\x43\x23"
+ "\xc6\x9c\x72\xdc\x9c\x50\xe6\x3f\xbe\x38\x68\x94\xe3\x5b\xfa\x86"
+ "\x2b\x55\x86\x69\xf4\x83\x41\x7c\x72\x8c\x4c\x71\x6e\x8c\x0c\xd3"
+ "\x16\x88\x07\xf3\xf8\xb8\x88\xbe\xb3\xeb\x11\xed\xeb\x0e\xc0\x73"
+ "\x8f\x3c\xde\x41\xbd\x1f\x26\x8f\x13\xae\xd5\x07\xe0\xb9\x67\x60"
+ "\xbc\xa1\x51\x60\x26\xaa\xc7\x26\xf8\x9c\xae\xc8\x64\x20\x8e\x3f"
+ "\xd0\x25\x70\x6b\xf4\x03\x71\xff\xb5\x85\x01\x63\xa9\x2b\x07\x70"
+ "\x83\x5e\x86\xa9\xf2\xa7\xf1\xc0\x49\xb9\xad\x3a\x15\x9e\x7d\xfe"
+ "\x78\x0e\xfc\x45\xc6\x13\xa6\x82\xe9\x08\xa0\xb1\x6b\x30\x8d\xd6"
+ "\x18\x81\xbb\x01\xeb\xb7\xcb\x6d\x1b\x1d\xd0\x7e\x84\xe1\xb8\xe3"
+ "\x10\x26\x41\x81\x99\xa8\x1e\x4b\xd1\x78\x8e\x7f\x7b\x09\xa3\x67"
+ "\x91\x3e\xe1\x35\x0c\xe9\xfe\xb3\x6a\x4c\x37\x5c\x2e\x17\xd8\xfe"
+ "\xe8\x1e\x1c\x2f\xd4\xfb\x8d\xd3\x46\x07\xb4\x1f\xc7\x86\x23\x15"
+ "\x1e\x69\x15\x98\xc0\xf6\xdb\x05\x8d\x23\x46\x0c\xb4\x7f\x74\x47"
+ "\x00\x9e\x2b\x49\xa7\x08\x97\xaa\x2e\x4f\x00\x9e\xe3\x32\x1f\x55"
+ "\xbc\xbe\xce\x10\x20\x8f\xff\x95\xe9\x51\xf1\xfa\xba\xf4\x00\x3c"
+ "\x67\x28\xdf\xbf\x5d\xd7\x15\x04\xe0\x39\x33\xd0\x2e\xd4\x63\x01"
+ "\x53\x19\x30\x8e\x95\x98\xe5\xb7\xd1\x01\x78\x9a\x15\x98\x9e\x61"
+ "\xcf\x35\x08\xd9\x5e\xd7\xaa\xf8\x22\x21\xd7\x84\x54\xc2\x8d\xe9"
+ "\xc7\xd4\xbe\x00\xe9\xea\x1a\xcc\x27\x03\x04\xf2\x49\x45\x97\x3c"
+ "\x16\x37\x24\x06\xb4\xef\xa4\xcc\xa7\x48\x15\x9e\x8c\x80\xf6\xfd"
+ "\x45\xc6\x13\xae\x82\x09\x90\xff\x81\x6e\x19\x8f\x56\x05\x13\xa8"
+ "\xff\xa7\x64\x3c\xea\xba\xf6\x7d\x3d\x9f\x0c\x7e\xfa\x4f\xbc\xc2"
+ "\xb4\xee\xaf\x99\x83\xd2\x89\x77\x07\x63\xb0\xff\xdb\x5d\xc3\xbf"
+ "\x8d\x8e\x19\xbe\x8f\xf6\x90\x42\x1f\x6d\xe4\x73\x83\xbd\xe4\xa7"
+ "\xc7\x98\xeb\xd1\x9f\x89\x36\x40\xaa\xf0\xdd\x63\x96\x00\xdf\x8b"
+ "\x75\x4c\x96\x1d\x62\x8a\xd5\xef\x01\xec\x30\xa6\x52\xce\xc3\xf6"
+ "\x5f\xd1\xa1\xe4\x51\xba\x98\x5f\x1c\x83\xfd\xdf\x28\x93\xe8\xc7"
+ "\xc6\x14\xca\xb0\xe8\xf7\x13\x32\x82\x7d\xaf\x1c\xea\xfd\xcb\xea"
+ "\x78\xe6\x2b\x1d\x45\xdf\x2f\x9f\x9d\xe4\xb3\x30\xb0\x99\xdd\x60"
+ "\xb8\x1a\x4a\x8f\xc3\x58\x1d\x8d\xf1\xb7\x6f\x00\x5d\xa9\x89\xb9"
+ "\x69\xbf\xd9\x23\x8e\x6e\x28\x75\xb0\x2e\x3a\x6b\x60\xd3\x59\xd0"
+ "\xd1\x99\x01\x9b\x9e\x82\xf8\xd6\x92\x2f\x82\x7e\x83\xeb\xa3\xb3"
+ "\x01\x13\xa8\x6c\x27\x1c\xa9\xe9\x84\xd2\x1a\xff\xb2\xa5\xd7\x42"
+ "\xfc\x61\x3a\xb7\xc0\x02\xb1\x44\x07\xbd\x4f\xf1\x44\x9e\x9d\x54"
+ "\xf2\x32\x68\x4b\x31\xba\x3c\x9c\x67\x55\x68\x69\x27\x5a\xb6\x9c"
+ "\x04\xdd\xee\xa5\x56\xe9\x99\x93\x44\xaf\x77\xd2\xde\x0d\x6e\xe9"
+ "\x40\xfc\x2c\x38\x10\x7f\x0c\x5a\xe3\x27\x43\xab\x39\x1d\xb6\x9f"
+ "\x84\xa8\x03\xee\x34\x68\xd5\xce\x80\xd6\xc4\x74\xb0\x75\xe3\xbd"
+ "\xc1\x8b\x30\x4e\xbe\xdf\xd1\x09\x18\x6b\xdd\xb9\x1c\x74\x76\x81"
+ "\x13\x79\x36\xf6\x90\xb2\x77\x0f\x3d\x07\x6b\xc7\xea\x51\x10\x8f"
+ "\xf4\x75\x21\x2d\x77\x1e\x87\xeb\xc3\x13\xe3\x21\x95\xfa\x5f\x5b"
+ "\xb5\x07\xb4\x25\x10\x11\x42\x2f\xe2\xf8\xbe\x9f\x18\x47\xd5\xbd"
+ "\x84\x7d\x3d\xfe\xf6\xa0\x4e\xb8\x2c\xd7\xa7\x61\xdd\xc7\xe4\x79"
+ "\xaf\xee\xd2\x57\x51\xcf\xd6\xe5\xd0\x3e\x20\xd8\x4f\x5f\x9f\xa3"
+ "\xe4\xd1\x7e\xa6\xb4\x4f\xe9\x84\x38\xd0\xdb\x3c\x46\xf8\xa0\xb7"
+ "\x8b\xbe\xb5\xef\xa6\xfd\x0f\x08\x1f\xf6\xf9\x61\x34\xff\x84\xf4"
+ "\x8c\xc3\x3e\xbe\xfb\x7a\x84\xc3\xf2\x28\xff\x76\xbe\x87\x30\xbb"
+ "\x6a\x81\xd3\x77\xd5\x82\xb3\xbe\x9f\x2e\xe8\x61\x3f\x5d\xf0\x95"
+ "\xf7\xa7\x0b\xbe\x2c\x5d\x0f\x3a\xef\x55\x0b\x1c\x47\x4c\x5c\x06"
+ "\xfa\x23\xa6\x53\xf4\xdd\xbc\x6e\xe3\x29\xd0\x2f\x7a\x0a\x65\xef"
+ "\xf9\x14\x36\x2e\x83\x78\x5f\x44\x9f\xc3\xe6\xf9\x04\x16\x95\x00"
+ "\xf3\x45\x78\x82\xca\xb6\x27\xd2\x6b\x56\xe6\xd3\x5c\x96\x44\xbd"
+ "\x5d\x72\xa6\x52\xbd\x8e\xe8\x70\x33\x5e\x25\x78\x95\xe1\xb5\x85"
+ "\x45\x7a\xb7\x20\xaf\x4a\x63\x36\x6b\x80\xf6\xeb\x99\xe0\x03\xcd"
+ "\x49\x48\x4c\xa6\x33\x8d\x43\xf0\x2d\xc1\xb7\x3d\x0e\x6e\x2a\x83"
+ "\x4d\x2e\x57\x01\xed\x9b\xea\x20\xfb\xa2\x78\x14\xeb\x31\x63\x3d"
+ "\x5c\xe7\xd1\x46\x9c\x2c\x26\x8e\xde\xe5\x75\x39\x9f\x2e\xd0\x38"
+ "\x9e\x2e\x90\x7a\x62\xe2\xc2\x10\xa6\x06\x61\x9a\x64\x1e\x76\x11"
+ "\x2e\xb4\x1b\x47\xb4\x07\xc2\x10\xa7\xe9\xdd\x73\x1d\xda\xda\x97"
+ "\xd8\x31\x84\x6b\xed\xc7\x85\xb8\x77\xf2\x38\x29\xb1\x43\x49\xa3"
+ "\x38\x69\x1b\xc2\x51\x79\x9b\xdb\x48\xf5\xd8\x6d\x85\x5d\xb4\x5f"
+ "\x45\x24\xeb\x13\xf5\x51\x0c\x47\xb6\x1a\xed\x86\x61\x2e\x0b\x64"
+ "\x11\x6e\x2a\x67\xeb\xee\x02\x2c\x17\xc6\x4a\x0b\x30\x5e\x84\x39"
+ "\x2e\x56\xa0\xa1\xbd\x6b\x0f\x60\x79\x51\xf7\x0d\x46\x85\x46\xaa"
+ "\x83\xef\x5d\x4b\x74\xa2\x3e\x1c\x28\x74\x43\x74\x35\xcd\x93\xc3"
+ "\x3c\xc2\x47\xb8\x50\x0f\xec\xd8\xd6\xb0\x03\x85\x0e\xf0\x31\x3f"
+ "\x9c\x76\x19\x5f\x95\x1f\x3e\x4c\x67\x88\x8f\xf4\xaf\x15\xcb\x44"
+ "\x37\x70\x7c\x73\xdf\xf5\x11\x3e\x37\x68\x0d\x9c\xde\xf9\x84\x83"
+ "\xef\x03\x8d\x38\xad\x6b\xa7\x62\xec\x78\x83\xdb\x51\x5a\x10\xc6"
+ "\xbf\x93\xc7\xf2\x7b\x37\x75\x85\xb3\x9e\x9c\xb0\x18\xfe\x8d\xfc"
+ "\x54\xa0\x77\xad\x08\xf3\x47\xd6\x53\x10\x16\xdd\x8d\xb1\x1e\xc2"
+ "\xd0\xbe\x59\x44\xa7\x5a\x96\x73\xa7\xcf\x9f\x0c\xf3\xd3\x67\xa6"
+ "\x4f\x86\xd9\xf7\x4c\x9b\x0c\xa9\x77\xa6\xa4\x4e\xfc\xc1\x0f\x7f"
+ "\xc0\x6f\x7e\xf0\xc3\x49\x3f\x80\xac\x87\xe6\x4e\x86\xac\x39\x93"
+ "\x61\x1e\x5e\x59\xf3\xa6\xcf\x4d\x9f\x3e\x6f\x32\xe4\xcc\x98\x89"
+ "\x4f\xd3\x26\xdf\x9a\x7a\x6f\x4a\xd6\xb4\x99\xd3\xe1\x81\xec\xdb"
+ "\x52\x6f\xbb\x0d\xee\x99\x3e\xeb\xd6\xd4\x54\xf9\xf7\xd6\x54\x02"
+ "\x79\x64\xd2\xf4\x79\x29\x59\x45\xab\x8a\x57\xa5\xcc\x99\x39\x8d"
+ "\x52\x60\xfa\xf4\xc9\x59\x7e\x71\x64\x92\xf7\x9c\x97\xf8\xed\x64"
+ "\x67\x32\x68\xbf\x62\xa8\x43\x3d\xc0\xab\x9b\xef\x83\x04\x37\xfd"
+ "\xbe\x8e\xe4\xc7\xfb\x82\x1b\xe3\xa8\x3f\x75\x59\x6e\x24\xf9\xf3"
+ "\xf9\x5b\xda\x33\xf8\x04\x8c\x9f\x8c\x79\xa3\xe4\x78\x24\x1c\xf3"
+ "\xdd\xfe\xf9\xe3\x16\x62\xfe\x75\xb4\xaf\x8e\x0d\x2f\xe4\xbd\x13"
+ "\xfd\x21\xf2\xd8\x01\x3d\xa5\x39\xe1\x7c\x5f\x43\x94\x3b\xed\x37"
+ "\xe1\xb2\xdc\x34\x51\x65\xf7\x9d\xb4\x2f\x05\xcd\x27\x9f\x86\x9b"
+ "\xa2\x8f\x14\x1b\xb9\xac\x6c\xc5\x32\x8e\xb3\xfd\x38\x22\xe5\xbd"
+ "\x11\xed\x75\xb4\xe7\x87\xc0\x53\xa2\xf2\x11\xb4\xdf\x71\xfb\x76"
+ "\xcc\x93\x71\x3d\x70\x04\x7d\x05\xfa\xf2\xa9\xbe\xd2\x24\x60\x91"
+ "\x67\x8d\xbe\xbe\x24\x10\xf3\xaf\x37\xed\x53\xe9\xb6\xb3\xd5\x8c"
+ "\x70\xbb\x33\x34\xb4\xff\x02\xdf\x8b\x01\x6e\xb4\xa2\x8e\x3b\xbd"
+ "\xdb\xc3\xb7\xb2\x33\x7c\xff\xc3\x61\xd8\xbe\x14\x6c\x5f\xa2\x6f"
+ "\x7b\x78\x39\xdf\x4b\x94\xc3\x25\xc5\x31\x7a\x8e\x41\xb8\xbe\xfe"
+ "\xb4\x2b\x28\xcd\x45\xef\x77\xd0\x66\x19\xe3\xe9\x61\x98\xfe\x09"
+ "\xfa\xb5\x0e\x84\x2d\x27\xd8\x09\x1e\x18\xce\xf7\x3d\x29\xd5\xc0"
+ "\x71\x48\x5a\xe8\x8b\x09\xaf\x50\xd5\x47\x78\x16\x8a\x7e\x0c\x65"
+ "\x71\x06\xf1\xf4\xf0\x74\x09\xd3\xdf\x43\xfc\xcf\x93\xbf\x14\x3e"
+ "\x7c\xfc\xa3\x00\xfd\xef\x45\x06\x9e\x69\x5f\xe7\x4d\xe2\xf9\x00"
+ "\xf2\x92\xde\x13\xd0\x3b\x7e\x97\x25\x09\xe3\x9f\xc4\x0c\xd1\x57"
+ "\x8e\xe7\x75\xd0\x3e\xb2\x2c\xea\xa1\x54\xc4\x5b\x69\xdd\xd0\xcd"
+ "\xcf\xc9\xb1\x43\x52\xa1\xaf\xb4\x00\x02\x68\x4a\x22\xfa\xc9\x87"
+ "\x20\x2f\x52\x50\x0f\x22\x5c\x96\x71\x10\xa0\x07\x09\x88\x67\x2b"
+ "\xd2\xd7\x81\x6d\xda\x8a\x78\x12\x7d\x3d\x05\x64\x1b\x12\xda\x16"
+ "\xc6\x4a\x03\x38\xe4\xf2\x46\xff\xf2\x37\x75\x52\x39\x84\x0f\x77"
+ "\xf5\x10\xfc\x4d\x5d\xc4\x73\x59\xef\x50\x2f\xc7\x99\x02\xf4\x72"
+ "\x0c\xd2\x72\x87\x2a\xbf\x2a\x20\x3f\x1c\xf3\x7f\x24\xe7\xa3\xed"
+ "\x8f\x6b\x0e\xa0\xf7\x10\xe6\x4f\x41\x7a\x9d\x68\xdb\x61\x58\x5f"
+ "\x63\x9d\x1c\x9b\xc8\xf0\xf6\x00\x78\x0f\xc2\x4f\x23\xbd\xa1\x7e"
+ "\x87\xe0\xeb\x65\xdb\x41\x78\x9d\xcb\x72\xb3\xde\x1f\x3e\xe5\x0b"
+ "\x84\x9f\x35\x40\xdf\xcd\xa9\xfe\xf9\x37\xbb\x31\xff\x01\xd2\x75"
+ "\xfc\x7d\x94\x62\x7d\xf2\x27\xe4\xcb\x0e\x14\x92\xbc\x6e\xce\x0d"
+ "\x80\x2f\x43\xb8\x3c\x99\x47\x92\xcc\xa3\x46\x79\xec\x7e\x4c\xa6"
+ "\x61\x67\x40\x99\x7d\x58\xa6\x10\xf9\xb8\x55\xd1\xcb\x20\x65\xda"
+ "\x02\xca\x74\x91\x1c\x99\xa8\x47\xeb\xea\x1b\x28\x23\xfb\x49\x35"
+ "\x0e\x6a\xdb\x65\x2e\xcb\x2d\x51\x01\x6d\x4f\xc7\x7a\x8b\xb7\x09"
+ "\xbf\x73\x19\xea\xd0\x6d\x98\x76\x3b\xe2\xdc\x46\x36\xb0\x9d\xe2"
+ "\x41\x87\x1b\x58\x69\x46\x94\xd0\xdd\x5b\x56\xc4\x78\x80\xee\x53"
+ "\xe8\x9e\x70\x33\xd7\x2c\xd9\x26\x6f\x59\x81\xbf\x94\xce\xcf\x7d"
+ "\x21\x3f\xcc\x5c\xf7\xfb\x04\xce\x5b\x5e\xa0\xf3\xbe\xf0\xd9\x2b"
+ "\xd7\x91\x42\x7b\x85\x22\xfd\x15\xd8\xef\x00\x5b\x87\x70\x1b\x60"
+ "\x1a\xa6\x5f\xcb\x6d\x55\xc0\xf1\x67\x51\x47\x06\xe9\xf7\x44\x7c"
+ "\xbe\x42\x2e\x1f\x4d\xf8\xf0\xfe\x56\xf9\x5e\xe3\x25\x5c\x67\x14"
+ "\x1b\x4c\xe1\x7b\x78\x92\x1d\x72\xfc\x58\x9e\xf6\x65\x15\x38\x93"
+ "\xbf\xc4\xdf\x99\xf8\xfb\x29\xfe\x3e\x80\xbf\xef\xd1\x3e\xa9\xa5"
+ "\x5e\x6e\x8f\xf4\xfc\x1a\xfe\xce\xc5\xdf\x17\xf0\x77\x1e\xfe\x6e"
+ "\xc4\xdf\xa9\xf8\xfb\x30\xd9\x05\xed\xf9\x4e\x7b\xd7\x60\xdf\x2a"
+ "\x74\x8b\xde\xfd\xb9\x32\x88\x07\xd3\x11\x26\x9d\xdb\xab\xf0\x2f"
+ "\x3a\x21\xc7\x64\x7e\x16\x0f\xea\x03\xa5\x0d\x17\xfa\x20\xd2\xbc"
+ "\x8a\x1f\x3a\x33\x90\x26\xfb\x26\xd9\x16\xe5\x34\x81\x3f\x0b\xf1"
+ "\x27\x10\xad\x4c\xe0\x0a\x17\x32\x97\xf1\x8b\x72\xda\x20\x75\x6a"
+ "\xd4\x75\xda\xe1\x16\x07\xed\x7b\x84\xbf\xc7\xf8\xbe\x92\x90\x12"
+ "\xc5\xb8\xde\x63\x3f\xcb\xf1\xdd\xd2\x22\xc3\x55\x11\x8f\x79\x79"
+ "\x91\x9e\xac\xd2\xa5\x91\x2e\x4b\x4a\x4e\x80\x2e\x61\xac\x7f\xe3"
+ "\x73\xa4\x33\xc4\x77\x6a\x5b\x8c\x89\xf7\xe5\xbc\x2d\x1c\xff\x19"
+ "\xa1\x93\x75\xf2\xda\x24\x61\xbf\x29\x0d\x01\x78\xf6\x23\x9e\x8a"
+ "\x00\x7b\xef\x1e\xe8\xd7\x52\xda\x03\xfc\x51\x23\xd6\x87\xbe\xf2"
+ "\xe6\x2e\xd9\xaf\x3a\xc3\x4a\xc8\x5e\x52\xdc\x76\x38\xc9\xf7\x94"
+ "\xc3\xfc\xed\x84\xc7\x59\xca\xf7\xeb\x77\x86\x99\xa8\xbd\xe3\xe3"
+ "\x95\x7c\x9e\x17\x1d\x57\x46\x76\x10\x56\xc8\xf3\xb0\xff\xbb\x5e"
+ "\xaf\xe4\x81\xd8\x07\xce\x19\x56\xcc\xf3\xb2\xfa\xf1\x56\x9c\xcd"
+ "\x95\xf1\x86\x05\x3d\x7f\xa1\xfc\x6c\x56\x0a\x80\x74\x73\x19\x84"
+ "\xdb\x3c\x47\x21\xd3\xc3\xbc\x29\x65\x10\x61\xf3\xec\x81\x71\x00"
+ "\x23\x6c\x9e\x63\x70\x33\xc0\x18\x9b\x67\x27\xc6\x2b\x8d\x94\xff"
+ "\xc1\x4d\xa0\xd1\xe0\x6f\xe9\x8d\x65\x92\xc6\xe6\x29\x86\xc4\x32"
+ "\x2d\xfe\x16\xc2\x8c\x70\xe6\xb2\x79\x66\x21\x5c\x1e\x64\x7a\xd9"
+ "\x99\xf4\x70\xf6\xd9\x62\x2f\xe8\x67\x3d\xcb\x4a\x6d\x1e\x1c\x3b"
+ "\x78\x0e\x61\xba\x8f\x65\x7a\xcf\xe3\xe5\x62\xbe\xf2\xb3\xb9\x99"
+ "\xde\x33\x6c\xda\xb3\x1f\xe0\xf3\x67\x0c\x65\xc9\x6c\x9e\x34\x38"
+ "\xe2\x74\x22\x5c\x29\x63\x5b\xcf\x66\x2d\x3a\x2b\x41\x1f\x9d\x8f"
+ "\xb0\xf5\x6c\x2e\xb6\xc5\xd4\x87\xed\xc0\x7e\x78\x55\xdf\xd3\xf8"
+ "\x5b\x71\x76\x25\x7f\x2e\x3f\x5b\xc6\x74\x67\x4d\xe3\x71\x20\x46"
+ "\x6d\xb0\x79\x3a\x61\x31\x0e\x25\x32\xd7\x3b\x18\xd1\x1f\xb3\x99"
+ "\xc6\x61\x69\xb4\xb7\x72\x6c\xe6\xfa\x52\x86\x79\x3a\x16\x71\xd6"
+ "\x64\xf3\x74\x03\xd6\x51\x86\xf8\x36\x72\x7c\xe5\x67\x1b\x10\xd6"
+ "\x41\x70\x6a\x3c\x84\x83\x60\x33\xbd\x10\x8b\xf0\x0d\x7d\x11\x67"
+ "\xab\xf0\x6a\xc6\xcb\x8e\x65\xbf\x62\x96\xb8\xdf\xd0\xfe\x98\xac"
+ "\xfc\x1c\xc6\x08\xe7\xf4\x6e\x3a\xcb\x81\x78\xe9\x85\xe1\x6c\xeb"
+ "\x39\xd2\xab\x74\xd4\x4f\xa4\xf7\x5c\x2a\xa7\xb7\xe2\xdc\x04\x37"
+ "\x6f\xc7\xb9\xf1\xa2\x1d\xe7\x52\x28\xbd\x07\x75\x07\xef\xb3\x7a"
+ "\x44\x5e\x26\x96\xcb\xe6\xe5\xca\xcf\x65\x31\xdd\xb9\x5c\x37\xda"
+ "\x21\xf2\xb5\x8c\xf8\x88\x7c\x2d\x23\x5e\x22\xfe\x2c\x9b\xb9\x12"
+ "\x58\xc4\xb9\xdc\xbe\x88\x73\x26\x2c\x6f\xe9\xe3\xb1\xca\xb9\x2a"
+ "\xb7\xc0\xbd\x03\xf1\x2c\x44\xfd\x0e\x43\x1c\x55\x88\xab\xa1\xcf"
+ "\x62\x80\xcc\xf5\xcc\x9d\xe9\xd9\xec\x59\xbc\x1e\xc2\x92\xa1\x0c"
+ "\xe9\x7d\x1f\x79\x94\x87\xed\x6c\xc5\xdf\x74\xcc\x87\xcb\xb1\xae"
+ "\x0f\x10\x6f\x15\xd5\x87\xf5\x34\x20\xce\x5a\xc4\x95\x47\x34\x9d"
+ "\xb7\x80\x1e\x9f\x9b\xcf\x0b\xfa\xda\x7d\xe5\xe7\x1c\x3e\xdd\x39"
+ "\xbb\xa2\x43\xa4\x3f\x82\x6f\x3b\x61\x8e\x93\x79\x6c\x9e\x5a\xec"
+ "\x75\x70\x8c\xe4\x3c\x46\xf9\x38\x56\xda\x83\x72\x26\x9d\x2a\xc6"
+ "\xdf\x46\x20\xfd\x39\x62\x7a\x96\x60\x3f\x20\x1d\x9a\x63\x72\x6e"
+ "\x4e\x01\x93\x06\x9f\x4b\x17\x7b\x74\xb0\xc8\xa4\x2d\xf3\x96\x9f"
+ "\xb3\x1e\x31\x91\x5c\x8e\x62\x19\x2a\x57\x08\xb1\x1a\x1c\x2f\x68"
+ "\x98\x27\xd6\xec\xd0\x46\x17\x94\xb2\x23\xce\x59\x08\x6b\x02\x6a"
+ "\x0f\xe9\x11\xc1\xcf\xee\x66\x76\xaf\xce\x65\xa2\xb6\xb1\x98\x32"
+ "\x38\xdc\x7d\x3b\xd0\x98\xed\x70\x77\x23\xe9\xa9\x8f\xe9\x5c\x46"
+ "\xd4\xd1\xbe\xd9\xdd\x65\xe1\x8b\xce\x82\x06\xd3\xbc\x87\x0b\xf6"
+ "\x60\x7e\x2b\xc2\x1d\xe2\x7a\x3b\xe7\xac\x27\xd6\xa3\x3b\xd7\xec"
+ "\x29\x77\x65\xcd\x39\xdb\xc7\x0e\x17\xec\x84\x47\xbb\xcb\x90\x57"
+ "\x7b\x60\xf6\x29\x4f\xd8\x11\x53\x1e\xc2\xb8\x30\xbd\x91\xeb\xff"
+ "\xec\x53\x3d\x6c\xce\x53\xec\xcc\x9c\xb3\x9f\xb1\xd9\x05\xec\x83"
+ "\xc5\x66\x88\xb9\x6c\x33\xf3\x91\x5d\x1c\xea\xdc\x03\x97\x1d\xa3"
+ "\xbd\xf3\xd3\x61\xd6\x12\x1f\x9b\x7d\xea\x0c\x5b\xf4\x14\xf1\x26"
+ "\x0d\x0e\x17\xa0\xfd\x98\x77\x12\xbf\xdb\x0f\x17\xec\xc7\xfa\xd3"
+ "\x11\x6f\x29\xb3\x99\x6b\x11\xd6\x1a\xfb\xe8\x29\x3d\x1c\xea\xdc"
+ "\x09\x9e\x88\x73\xcd\xde\xad\xe7\xac\xbe\x88\x73\x76\xdf\xd6\x73"
+ "\x0e\x16\xe1\x32\x7a\xb6\xba\xb2\xbc\x11\x2e\xd4\x01\x97\x15\xe5"
+ "\x14\x41\x32\xef\xb5\x80\x01\x9f\xff\xb3\x97\xe4\x5f\xee\x6a\xc7"
+ "\xb6\x3a\x30\x36\x66\x42\xf7\x5d\xed\x34\x0f\x81\x65\x1d\x7d\x11"
+ "\x2e\x3b\xc2\x39\x84\x7d\xb9\x81\xf4\x92\xe6\xfb\x31\x0d\x19\x54"
+ "\x10\xd6\x17\xe1\xd6\xe3\x65\xc0\x2b\x95\x55\xb8\xcb\x10\xff\x08"
+ "\xae\x53\xe5\xee\x32\x76\x77\x15\xc6\xda\x67\x11\x8f\xbb\x21\xd3"
+ "\x3b\x85\x21\x0f\xd1\x4e\xdc\x65\xbe\xad\xee\x2a\xc4\x65\x75\x73"
+ "\xdd\x77\x7f\x40\xb8\xfb\x9e\x4e\xa2\xf9\x09\x2d\xe6\xb7\xb3\x8a"
+ "\xf3\x53\xdd\xa4\xab\xba\xf3\x46\x9f\xee\x7c\x03\x2b\x3f\x9f\x75"
+ "\xff\xb3\xcc\xe1\x2d\x3f\x6f\xf2\x95\x9f\xcf\xf5\x0c\xc3\x18\xde"
+ "\xbc\x1f\xc8\x3f\x79\xfe\x93\x21\x0f\x3e\x44\x7e\x34\x72\xf9\xdb"
+ "\xcc\x68\x03\xeb\xaf\x2e\x3b\xdc\x8d\xba\x60\x7a\x8b\xfb\xa6\x23"
+ "\xce\xa3\x9c\xa7\x2c\xe2\xbc\x91\x74\x8a\xe4\xbb\xc8\x04\x65\x6c"
+ "\xeb\xf9\x2c\xdf\xd6\xf3\xb9\xde\xad\x88\x37\x02\xeb\x89\xec\x3b"
+ "\xee\xe6\xf6\xda\x87\xfa\xba\x1f\xe8\xec\x47\xa1\xe3\x7d\xf6\x50"
+ "\x3e\x92\x7c\x15\xf9\xa7\x4c\x8f\x9b\x74\xe6\xcf\xe4\xd7\x84\x9f"
+ "\x82\xc5\x8a\x9f\x22\x1f\x45\xe3\x22\xf2\x53\x3e\xd9\x4f\xf9\x64"
+ "\x3f\xc5\x9f\x75\xe8\x6b\xca\xcf\x9a\xc8\x1f\x65\x9a\x85\x9f\xc9"
+ "\xf4\xa6\x32\xd4\x8d\x28\xc4\x61\x12\xb2\x40\x98\x8a\xb3\x1b\x39"
+ "\x3c\xe7\xd3\xd9\x06\x1f\xfa\x1b\xbc\x9a\x7d\xc2\xdf\x38\x64\x7f"
+ "\x23\x29\xfe\xc6\x6b\xa1\x33\x2f\x49\xb7\x06\xfb\x1b\x9f\xec\x6f"
+ "\xbc\x4c\xf8\x1b\x9f\xec\x6f\x28\xdd\x2b\xfb\x1b\x6f\x10\x7f\x83"
+ "\xf6\x4c\xed\x0d\x93\xfd\x4c\x19\xf9\x19\x6a\x2f\xea\x5a\xae\x4f"
+ "\xf8\x99\x32\x1c\x13\x49\xe4\x67\xbc\x58\xc6\xa7\xf8\x19\x17\x2f"
+ "\xdf\x40\xbe\xa6\xef\x39\x40\xff\x69\x00\xf2\x31\xdc\x9f\x78\xc6"
+ "\x78\xc8\x9f\x20\xff\xa6\x04\xfa\x13\xc4\xd7\x8c\xf7\x7a\xd9\x4f"
+ "\xd9\x63\x37\x33\x0f\xfa\x13\x6b\xa6\xd9\x89\xb2\xfe\x14\x62\x3d"
+ "\xe8\xb7\xcd\xc5\x65\x36\xb3\x07\xd0\x0f\x38\xd8\x91\x32\x40\x1a"
+ "\x51\x7f\xbd\xe8\x2b\x00\xd0\x2e\x8d\x1e\xb4\x71\xd4\xf1\xac\x23"
+ "\xa6\x4f\xc0\x8b\xb6\x3a\xbb\xbb\xc7\xb6\xc8\x99\xa4\x9f\x7d\x8a"
+ "\x39\x90\x3f\xf6\x45\xa6\x32\xf4\x2f\x49\x8e\xc3\xdd\xef\xc3\xac"
+ "\x4e\xe6\x9b\x95\x6b\x37\xa0\x0d\x64\xcd\x5e\x66\x8d\xa5\x73\x37"
+ "\xe7\x9c\x65\x56\xf4\x8b\xff\x3d\xfb\x94\x3e\x76\x61\x27\x8c\x9e"
+ "\xb5\x84\xf9\xbc\x68\x67\xd8\x5e\x2b\xb6\xbb\x1d\x69\xb7\xa3\xcd"
+ "\x39\xd0\xce\x8c\x9e\x00\x3b\x63\x91\xae\xff\xc4\x7b\x83\xe0\x9f"
+ "\xcb\x81\x76\xd6\xee\xe3\xfd\x59\x27\x1f\x8b\x62\x3d\x0e\x9a\xb7"
+ "\x43\x5b\x6b\xf7\x6d\x15\xb6\xe6\x63\xc2\xd6\x7c\xc4\x3f\x49\xb6"
+ "\x35\x94\x05\xda\x8d\x1e\x2f\x03\x5e\xc1\x6d\xcd\xa4\xb2\xb5\xa7"
+ "\x64\x5b\x8b\x10\xb6\x86\x32\x0d\xf3\x3e\x2d\xec\x8d\xf0\xd3\x78"
+ "\xb5\xdf\xde\x22\xcf\x1b\xe9\x0c\x00\xa1\x3b\xdc\xe6\xb0\x5f\x39"
+ "\x6f\x42\x7b\xcb\x45\x7b\x43\x7c\xcc\x41\x7e\x13\x75\xf3\x4f\xd4"
+ "\xd7\xcd\x31\xb1\x3f\x2d\xf6\x5e\x5d\x86\xf6\x64\x42\x5f\xf6\x19"
+ "\xfa\xd1\x3f\x2d\x72\x42\x03\xda\x93\x11\xed\x28\x0b\xed\x29\x17"
+ "\xed\x8a\xec\xc9\xee\x7d\x9a\x70\xf6\xd9\xfb\x71\xf0\xbe\xd2\xdf"
+ "\x9e\x2e\x34\x6f\xea\xb2\xfc\x50\x6b\x87\xf3\x7c\x3c\x8d\xf7\x7a"
+ "\x3b\xf4\xa6\xcb\xf7\x09\x76\xf8\xff\xb4\x3c\x96\x41\x3b\x34\x6d"
+ "\x82\x2b\x4e\xc2\x0f\xdb\x51\xe7\x01\xef\xa3\xf0\xfe\x68\xe6\xb8"
+ "\x0f\x98\xaf\xd2\x58\x80\x75\xbb\xc8\x16\x99\x65\x22\xd9\x80\x11"
+ "\x75\x51\xc7\x5c\x49\x51\x2c\x46\xf7\x0a\x9d\xd3\x4a\xe7\xb2\xe2"
+ "\x73\x0c\xf2\x20\x11\x7f\x47\xd6\x9e\x83\x38\xbc\xe2\x6b\xe5\x33"
+ "\x61\xf1\x3e\x95\xad\x8b\x8f\xdc\xbe\x16\x92\x63\x9d\xe2\x3c\x56"
+ "\x3a\x3f\x16\xe3\xe8\x38\xba\x67\x96\xcf\x92\xea\xcf\xc9\x67\xb2"
+ "\x46\x63\x7d\x74\x26\xeb\xea\x24\xa8\x2f\xe2\xe7\x63\xc5\xd7\x5b"
+ "\x58\xb3\xd7\x45\x7c\x38\x9b\xa5\xd0\x42\xb4\x21\x9d\xd7\x22\x9d"
+ "\x9d\x0f\xae\x37\xc2\x87\xe6\xe0\xfb\x2b\xba\x2c\x93\xfa\xdb\x1f"
+ "\x22\x3f\x51\xe1\x49\x88\xfc\x74\x85\x4f\xa1\xd6\x76\x52\x3f\xed"
+ "\x5d\xcb\xba\x69\xaf\x6e\x9a\x37\x28\xf5\xb0\xff\x45\x3e\x96\x6d"
+ "\xf2\x82\x2e\xd3\xec\x66\xb6\x6e\x66\xb5\x99\x4f\x41\x3d\xed\x1f"
+ "\x5e\xc2\x7c\xbe\x68\x5d\x09\xdb\xa6\x33\xf7\xac\x65\x1e\x9a\xf7"
+ "\xc1\x3a\x9a\xec\xb0\xa0\x41\xc8\xe2\x5c\x3b\x1f\x6f\x46\xe9\xcc"
+ "\x88\x6b\x04\xe1\x3a\x8c\xe5\xbd\xdb\x74\xa8\xaf\x93\xda\xed\x1a"
+ "\x5d\x0b\x87\xd3\x9d\x6b\x37\x6d\x80\x6b\x4e\xc2\x9d\x3a\x3e\x4e"
+ "\xa8\xd4\x55\x91\x4f\xc0\x34\x3d\xa6\xc5\x21\xfe\x9d\x2e\xcb\x9d"
+ "\x18\x73\xf7\xec\x14\xb1\xec\x9d\x71\x0a\x9c\x1d\x26\x75\x05\xae"
+ "\x5b\x93\xbf\x92\x2c\xf3\xdb\xef\x4d\x03\xfe\xbb\xd7\xd1\x4e\x71"
+ "\xc6\xe0\xd9\x03\x3e\xdd\x95\x45\xe7\x6e\x95\x6e\x84\x04\x94\x0f"
+ "\xd1\xb7\x15\xc7\x1c\x27\x98\xe5\x4e\xc3\xee\x0d\x6e\x1c\x53\xdc"
+ "\xb9\xd3\x0e\x07\x43\xf2\xd3\x77\x8e\x75\x22\x0f\x1c\x3b\xd6\x02"
+ "\x10\x7f\x88\x9f\x68\x37\x3e\xe4\xc3\xe7\xe4\x93\xea\xd7\xd2\xb8"
+ "\xfb\xce\x0e\x85\x5f\x21\x65\x52\xa9\xab\x14\x63\xd3\xbb\x26\x31"
+ "\x0b\x03\xeb\x68\x7a\x8f\x71\xd7\x9d\x9c\x07\xe5\x2e\x7b\x0f\xfa"
+ "\x11\x9a\x53\xa6\x33\xb2\x56\xc7\x33\xb7\xcb\x72\x57\xb2\x1d\xa6"
+ "\xb6\xc9\xf3\x55\x4e\x9b\x67\x3a\xf9\x96\xa0\xfd\x16\xdf\x9b\xb4"
+ "\x1f\xff\x8f\x72\x8e\x24\xa0\x1f\x22\xdf\x14\x15\xd7\xba\x49\xc8"
+ "\xdf\x4d\x78\xe9\x5b\x8f\x4e\xcc\x5f\xed\x64\x5d\xac\x32\x8e\xce"
+ "\x22\x71\xd2\x3e\x9f\x98\x46\xe7\xfe\x30\x6b\x11\xd1\xf4\xa3\x87"
+ "\xad\xa3\x7b\xe1\x84\x19\xc2\xea\xfb\xe7\x89\x7e\x94\x4e\xf3\x42"
+ "\x62\x3e\xec\xae\x56\x3b\x4c\xcf\x53\xe8\xa2\x18\x03\x79\x4b\x7c"
+ "\x6e\xa7\x58\x83\xde\x53\xac\x2e\x61\x6e\x8a\x39\x10\xd6\xa1\xb4"
+ "\x81\xda\x27\xda\xf5\x23\xad\xba\x5d\xf4\xee\x3e\xb6\x44\xf0\x60"
+ "\xf5\x7a\xd0\xf1\x33\x7b\xbc\xf4\x9e\x63\x3a\x6f\x0b\xb5\x99\xb7"
+ "\x85\xfb\x58\xec\x23\x3c\xb7\xa3\x0e\xf1\x74\x07\xe2\xc2\xf1\xcf"
+ "\xb4\x76\xa1\x4f\x77\xb5\x86\xfa\x86\x05\x75\xb3\x01\xc7\xaa\xa3"
+ "\x4b\x7d\xec\x38\xe2\xfc\x54\xcc\xb1\xfd\x88\xce\xfe\x08\xcb\x74"
+ "\xa3\xee\x46\xc5\x54\x52\x9f\x6c\x2b\x21\x7f\xcb\x61\x2f\x47\xd8"
+ "\x4e\x84\x39\x2c\xc3\x1e\xe6\xe7\x12\x8a\xdf\xe1\xf4\x8b\xfd\x58"
+ "\x2d\xd2\xd1\x49\xf3\xbe\xc8\xe7\x32\xe5\x19\xc7\xf8\x38\x4e\xfc"
+ "\x51\x0d\xdb\x16\x53\x19\x9c\x96\xf3\x0d\xd4\x9f\x79\xcf\xb1\x6e"
+ "\xac\xe7\x2a\xd2\xa3\xd2\xf5\x30\x0a\x75\xf2\xf3\x4d\x1b\xe1\x0a"
+ "\xd2\x31\x16\xad\xab\x16\x7c\x4f\x4b\x65\x16\x8c\x3d\xd1\xa3\x9a"
+ "\xd6\xc2\x35\x68\x43\x55\x27\x21\x6d\xfa\xe2\x12\x03\xd2\x0a\xb0"
+ "\xe3\x34\x50\x8c\xf2\x19\xc2\xef\xb4\x79\xbe\x80\xfa\xd3\xa4\x8b"
+ "\x69\x79\x8a\x2e\xe2\xbd\xe9\x42\xbe\x02\xfb\x19\x83\x98\xa3\x48"
+ "\xfb\x94\xde\x49\x1c\x87\xb4\x36\x6a\xaf\x58\x03\x9d\xf6\x1e\x3b"
+ "\xc7\x12\x18\xef\xd3\xdc\xe8\xa7\xd3\x9c\xf8\x6b\xe0\x17\xfa\x12"
+ "\xf9\x59\x8f\x70\x4d\xec\x9c\x97\x60\x0c\x98\x66\x65\x16\x0d\xd9"
+ "\x49\x0d\xd6\xdd\x6d\x87\x45\x2d\x42\x36\x69\x2d\x84\x2b\x04\x0d"
+ "\x7a\xc6\xf7\xb9\xfd\x0a\xdb\x3b\xf9\x41\xc3\x26\x9a\xe3\x9c\x3c"
+ "\x8e\xdb\x05\xe2\xaa\x97\x84\xcf\xf6\x21\xad\x75\x16\x5f\x01\xfa"
+ "\xe7\x02\xdf\xf6\x11\x19\xfc\x5e\xce\x63\x72\x3f\x1a\x14\x7f\x65"
+ "\x5c\x2b\x3f\x2b\x11\x26\xf3\x73\x41\x7d\xa8\xf7\xd6\xab\x4f\xd2"
+ "\xf3\xdb\xf4\xec\x8c\x1a\x99\x61\xab\x36\x8a\x73\x1a\x11\x46\x8c"
+ "\xe3\x27\xbf\xdd\x83\x75\xb8\x2c\x93\x9b\xed\x30\xa3\x41\xbc\x9f"
+ "\x19\x99\x11\xf2\xfb\x28\xb4\x01\xb2\x39\x61\xd3\x53\x9e\x3d\xdc"
+ "\x40\xf6\xe7\x86\x1e\x9d\xdb\x20\xfb\x5f\x9a\xcf\x89\x3a\x0e\x53"
+ "\xb6\x1c\x8e\xe7\xfa\x2d\x31\xe9\x6e\xbd\xdf\x59\x6e\x98\x37\xf8"
+ "\xba\x3b\x1d\xaf\x6c\xbc\x72\xe5\xe7\x42\xbc\xb0\xcd\x77\xb7\xe3"
+ "\x73\x31\xe7\xdd\xae\x3c\x8d\x1d\xf3\x7a\x30\x66\xa7\x67\x3b\xdc"
+ "\x3d\x8b\xed\x4a\x94\x94\xfb\xfa\x97\x69\x9e\xe0\x6e\xb3\x1d\x26"
+ "\x83\x90\xc5\x14\xbe\x76\x07\x69\x23\xbe\xb3\xd2\x6a\xe6\x6e\xdd"
+ "\xe4\x44\xba\xef\x6e\x6a\xad\x76\x82\xe1\x46\x6a\xff\xdd\x7b\xa8"
+ "\x4d\xb4\x86\x85\x7e\x57\x57\x33\xc7\x81\x1a\x0f\xd0\xbb\x3c\xc4"
+ "\x85\xf6\x5f\x9f\x28\xe6\x32\xe2\x1c\x84\x4f\xd6\x09\xa6\xb4\x5f"
+ "\xf0\x79\x64\x86\x61\xad\x86\x9e\x47\xd4\xbd\xc4\xe7\x61\x3c\xac"
+ "\x34\x47\x5e\xbb\x30\x25\x02\xed\x7c\x0a\x9d\xf3\x78\x1a\xa6\xcc"
+ "\x66\xc8\xeb\x03\x05\xfc\xcc\x28\x07\xf6\x3f\xdd\x75\x7c\xbd\xd1"
+ "\x14\xf4\x7f\x93\x73\xf9\xbb\x19\x4c\xe7\xbe\x06\x71\x6e\xc7\x3c"
+ "\xec\x8f\xba\x0f\x17\xb8\xc1\x4b\x6d\xc6\xb2\xef\x9f\x73\x6b\x63"
+ "\x8b\x41\xb3\xc9\x84\x7e\x07\xe9\x60\x28\x2b\xe1\xcb\xee\xb6\x6f"
+ "\x3c\xc5\xdc\x4a\x9b\x0f\x34\x90\x7d\x4c\xd9\x62\x87\xd7\x8f\x86"
+ "\xb4\x89\xfe\x76\x18\x5f\x3d\x90\x28\xe4\xe8\x43\x5e\xf9\xcb\xd1"
+ "\xd8\x20\x64\x38\xe5\xa8\xbf\x0c\x8d\x58\x83\x11\x35\xc1\x38\x11"
+ "\xaf\x74\xf9\x59\x7d\xe9\x54\xf7\x28\x57\x63\xa5\xcb\x62\x8c\x43"
+ "\xfb\x28\x11\xb2\xa1\x74\xd4\x67\xd2\x9b\x2f\xb1\xef\xe9\xcb\x01"
+ "\x7a\xdf\x4b\xe9\xa4\xe3\x94\xee\xc3\xf8\x06\x9f\x93\x30\x5f\x4f"
+ "\xf6\x4b\xe7\x6f\xa9\xf3\xfb\xcf\x59\x00\xe3\x7a\xc2\x15\xbb\xb9"
+ "\xbc\x9c\x74\x17\x61\x92\x63\x3d\xe5\xe5\x58\xdf\x16\x85\xaf\x98"
+ "\x56\x48\xf9\xa4\xa7\x98\x5e\x63\x87\x37\xf8\xfa\x05\x27\x8e\x01"
+ "\x83\xc7\x1e\x46\x6b\x7f\x8c\xa6\x73\x97\x91\x2c\xbb\xe1\x9e\x43"
+ "\xe8\xc7\xb0\x1f\x1f\x61\x14\xfd\xcf\x3d\x74\xf6\x93\x06\xfd\xe7"
+ "\xe7\x78\xdf\x76\x18\xfd\x54\xef\xf6\x70\x73\x9f\x04\xc3\x7b\x25"
+ "\x30\x7a\xb6\x1b\x2b\x3d\x91\xde\x2d\xb6\xae\x7d\x70\xc4\xf3\x0e"
+ "\x18\x96\x73\x1c\xbf\xa1\x73\xe0\x4a\xd7\x33\xef\xde\xde\x26\xad"
+ "\xcd\x73\xc6\xca\xcf\x5c\x85\x7b\x38\x3f\x9e\x3f\x8e\x51\xc0\x22"
+ "\x8e\x5b\xf0\x27\xca\x58\xb0\x7d\x29\xf3\x6c\x3f\x41\x7b\xc3\xc7"
+ "\x47\x6e\xeb\x85\xe4\x57\x36\x40\x6a\x4d\x2f\x24\xd6\xf5\x42\x12"
+ "\xfb\x73\x92\x54\x83\x71\xdc\xa2\xb3\x7a\x3a\x8b\x3c\x27\xc6\x04"
+ "\xba\xba\x0d\x18\xcf\x79\x40\xe3\xdd\x86\xf1\x9c\x07\xe3\xb9\x33"
+ "\x49\xe4\x2f\xfb\xe3\xb9\x3e\x8a\x95\x2b\x23\xb4\xe2\xac\xd0\x08"
+ "\x3a\x2b\x4a\x13\x95\x0b\x7a\xa4\xaf\xf4\x34\xdc\xa3\x89\xea\xc4"
+ "\x58\x12\xdb\x6c\x97\xdb\x8b\xbf\x71\xb1\x05\x30\x9c\xb7\x15\x7d"
+ "\x38\xdb\x36\xc2\x18\xb2\x6f\x96\x48\xa7\x9c\x64\x4b\xd8\x86\xa9"
+ "\xa3\xe8\x9d\xf3\xbe\xab\xdd\xda\xd5\x35\xcc\x4d\xe9\xc5\x63\x98"
+ "\x1b\xd3\xf9\x9e\xfe\xcd\x98\xee\xb2\x4c\x4d\xb2\x4b\x5f\x86\x8c"
+ "\x01\x71\xcc\x24\xfb\x9a\xa9\xaf\x33\xa9\x8c\x74\xd4\xba\xd1\x83"
+ "\xf1\xf8\x69\xb2\xe3\xa9\x4d\x99\x85\xcc\x63\x58\x49\xef\xff\xa7"
+ "\x56\xd3\xda\x04\x7a\x27\xf9\x4b\x8c\x75\xbe\x6e\x3d\x02\xf5\x21"
+ "\x34\x7e\x88\x2d\x44\x9c\x15\x6e\x2b\xc3\x31\xfb\xc5\xc6\xf5\xb4"
+ "\xfe\x4c\x7c\x6b\x3a\xb5\xd3\x0e\x2b\xf9\xba\x0f\xfe\x7d\x0e\xf7"
+ "\xa7\xd3\x5a\x9d\xc8\x03\x7f\x1f\x30\xad\x9a\xf6\x29\xef\xa9\x1c"
+ "\xa6\xb5\x8e\x26\xdf\x3f\xed\x05\x11\x0f\x0e\x93\xfb\x82\x69\x4f"
+ "\x89\xf7\x07\xd3\x26\xda\x61\x2e\xef\xe3\x4d\x63\x49\x27\xa6\x15"
+ "\xb2\x98\x61\x61\x04\x37\xbe\x0c\xca\x56\x79\x20\x97\x6d\x1b\x06"
+ "\x8c\xdb\xca\x69\x60\x3f\x7d\xd2\x45\xdf\xdc\x38\xaf\x5a\xe0\xc2"
+ "\xd8\xa0\x15\xf3\xb4\x54\x87\x03\x61\x90\xef\x11\x62\xed\xc2\xb4"
+ "\x72\x3b\x3c\x20\xfb\xc3\x69\x0b\xc5\x1c\xf3\xb4\x85\x3d\x58\x16"
+ "\x63\xc5\xcb\x31\x1f\xe3\xdf\x27\xa3\xe4\x77\xdc\x8e\x67\xf8\xb7"
+ "\xa2\xd3\xf6\xdb\xa1\x30\x8b\xd2\x8a\xc7\x40\x7c\xb1\x81\x75\x85"
+ "\x8c\xf5\xfc\xda\x39\xfd\x1e\xbe\x0e\x4f\x82\xab\x5c\x96\x74\x50"
+ "\xf0\x62\x7f\xfb\x46\x8f\xf4\xe0\x83\x98\x16\xa7\xe0\x45\x98\x2b"
+ "\xf0\x39\xb1\x1f\x46\x94\x99\xa8\x2a\xf3\x60\x8f\x74\xf3\x1b\x98"
+ "\x96\x11\x50\x26\x27\xa0\x4c\x81\xaa\x4c\x99\x5c\x4f\x49\x40\x99"
+ "\xca\x80\x32\x35\x41\x68\x6b\x0e\x28\x63\x0d\x28\xd3\x1e\x84\xb6"
+ "\xce\x80\x32\x4e\xff\x32\xd3\xb5\x2a\xde\xd2\x7a\xa2\x54\x4c\x8b"
+ "\xf7\x2f\x33\x3d\x29\xa0\xcc\x24\xe5\x19\x63\xcf\x1c\x11\x1b\xa0"
+ "\x3e\xa1\x4c\x51\xae\x68\x2f\xd3\xb1\xfd\x0f\x16\x5e\x20\xfe\xc6"
+ "\xb1\x61\xb8\xa7\xb4\x56\x9c\x9b\x4b\x7e\x95\xd6\x1f\x90\x3f\xa7"
+ "\x77\x26\xa4\x13\x14\x77\x52\x5d\x27\x60\xc6\xb3\xa4\x43\x88\x73"
+ "\xcf\x60\x7e\x4c\xb7\x06\xd0\xd9\x1e\x40\xa7\x7d\x30\x3f\xa6\x3b"
+ "\xfd\xcb\xcc\xd0\xfa\x97\x99\x11\xa7\x2a\xd3\x20\xea\x99\x91\x14"
+ "\x50\x66\x52\x40\x99\x8c\xc1\xfa\x39\x63\x61\x40\x99\xc2\x80\x32"
+ "\x25\x03\x3c\x9c\xc1\xbf\x0d\x27\x7b\xc0\x74\x1c\xff\xcc\xdb\x7f"
+ "\x01\xde\xe9\x15\x7d\x56\xbe\x9d\x16\x7a\x7d\xef\xa8\x9d\xe2\xbb"
+ "\x39\x7e\x46\x41\x27\xdc\x9b\xa2\xbc\x5b\xde\xdd\xeb\x0e\xa7\x77"
+ "\x9e\xc8\xdb\xae\x03\x66\x37\xf6\xb9\x33\xb0\x0f\x9e\x9d\xaa\xac"
+ "\x2d\xa1\xf5\x38\xfc\x8c\x1b\x3e\x1e\x99\xd1\x21\xec\xef\x5e\xe5"
+ "\x9d\x0e\xb5\x07\xc7\x19\xf7\x26\x7f\x43\xba\x0e\x13\x5d\x74\xd6"
+ "\x03\xe2\x30\xf5\x8f\x35\xfa\x69\xa5\x3a\xef\xfd\xa3\x42\x6b\xbd"
+ "\x58\x13\x44\x6b\x85\x1d\x74\xfe\x06\x96\x69\x54\x8d\x4f\x88\x56"
+ "\xe7\xbe\x0d\x6e\xad\x3f\xcd\xf7\x6e\x91\x69\xee\x10\x3e\xea\xde"
+ "\x0e\xc5\x9f\x84\xd4\xbf\xca\xb8\xa6\x23\x35\x00\xb4\xe6\xe1\x70"
+ "\x0d\xc6\x9b\x38\xc6\x22\xba\x8f\x43\x86\x81\xc7\xbf\x2b\x7b\x81"
+ "\xee\x6d\x25\x77\xf1\x35\x11\xa2\x2d\x19\x39\x74\xce\x32\xc5\x3e"
+ "\xad\xa6\xaf\x68\x5d\x1e\xe3\x67\x2e\x41\xc6\xb3\x07\x4a\x1c\x48"
+ "\x6b\x46\x96\xb2\x7e\xc8\x0e\x19\x22\xae\xab\x8c\x6b\xa0\xf5\x1a"
+ "\xb4\xb6\xe9\x80\x73\x12\xc1\x14\x23\x9d\xca\xda\xe9\x6e\x3a\xb3"
+ "\x19\x61\x93\x43\x8d\x95\xd4\x7c\x15\x34\xdc\xf7\xa5\xd0\x9f\x8c"
+ "\xfd\xfe\xf6\x10\x8e\x7a\x9a\xd1\xee\xaf\x73\x19\x76\x7f\x9d\xcb"
+ "\x70\xf8\xdb\x83\x84\xf6\x30\x53\xeb\x5f\x66\x66\x9c\x7f\x99\x99"
+ "\x89\xaa\x32\x55\xa2\x9e\x99\x93\x02\xca\x64\x04\x94\x51\xfb\x3f"
+ "\x6c\xf3\xcc\x82\xfe\x71\x27\xf7\xf7\x33\xcd\xaa\x67\x69\x27\xef"
+ "\xa7\x66\x56\x2a\x69\xf2\x77\xc9\x7c\xad\x94\x8c\xaf\x29\xc0\x47"
+ "\x11\xfc\xfe\x00\x1a\x0e\x05\xd0\x70\x4c\x79\x96\xd7\x57\xfc\x16"
+ "\x79\x37\x46\xd6\x33\x67\xec\x66\x78\x20\xd6\x33\xf7\x61\x8a\xcd"
+ "\xa8\x7f\xe2\x6b\xd8\x36\x62\x4c\x79\x16\xf4\xb4\x76\xf0\x44\x31"
+ "\x84\xd1\x39\x30\x76\xb8\x3f\x9b\x45\x47\x10\x4c\x37\xc6\x53\x99"
+ "\x27\x60\x66\x37\xd6\x5f\x8d\x75\x20\xef\xee\x33\xfa\xd3\x70\x5f"
+ "\x96\x3f\x0d\xf7\xe5\xaa\x9e\xf5\xf8\x6c\x52\xb5\x5b\x4f\xfb\x44"
+ "\xbc\xc8\x63\xeb\xfb\xca\x95\x74\x9a\x03\xc0\x36\x76\x95\xf2\x38"
+ "\xc0\x48\xeb\x06\x47\x1e\x87\xfb\xd6\xd0\x7c\x81\x8c\x73\x9f\x9a"
+ "\xb7\x82\x17\xf7\xb5\x05\xd0\xd1\x11\x40\x47\xd7\x80\xaf\x99\xd9"
+ "\x2d\x6c\xe4\x3e\xbc\x9f\x9f\x44\x69\xc8\x0b\x43\xac\xc7\x70\xb9"
+ "\x75\x2c\xc5\xa9\xf7\xcf\x74\x62\x7b\xd9\x73\xd2\x48\xf9\x79\x36"
+ "\xc3\x98\x01\x63\x31\x3a\xbb\x97\xbe\x9d\xbd\x0e\xd3\xb2\x85\x5c"
+ "\xef\xc7\xf6\xcf\x33\x0a\xbc\xf7\xf3\x77\xfb\x04\x8b\xf7\x06\x16"
+ "\x1d\xd7\x12\x4a\x9f\x7b\x62\xe2\x9a\x95\x35\xb6\x88\x63\x8b\x62"
+ "\x0f\xbe\xed\x71\xcd\xbe\x6d\xb1\x6e\x4c\xab\x46\x9b\xa8\x12\x63"
+ "\x9a\xd8\x74\xd4\x7d\x1a\x7f\xe3\x18\x78\x96\x3c\x96\x89\x6b\xa5"
+ "\xb5\x83\xb4\x7f\x05\xfa\xcc\x28\xb1\x36\xe3\xfe\x43\x2a\xbb\x72"
+ "\x1a\x36\x4c\x61\xc7\x61\xd6\x0b\x14\xdb\x91\xdf\xa0\x35\x88\x07"
+ "\x3c\x0e\xa0\x79\x16\x9b\xe7\x24\x8f\xc9\x31\xbf\x4a\x94\x9d\xa5"
+ "\x53\x95\x75\xc8\xf3\x20\x5d\x94\x37\xc1\x03\xda\x03\x4e\x07\xc5"
+ "\x2a\x71\x22\x8e\x9f\xf5\xc2\x01\xf4\x17\x58\x26\x4d\x29\x43\x73"
+ "\x26\xfc\xbd\x7f\x31\x68\xc7\x97\x80\xd6\xba\xe1\x38\xc7\x2d\xbf"
+ "\x73\xe6\xe3\x23\x5b\x49\x17\xd8\x9c\x1d\x14\x53\x6a\xc5\xba\xad"
+ "\x59\x55\x61\x6e\xd0\xf5\x6c\x8b\x6b\xb0\xe3\xbd\x77\x5b\x5c\x13"
+ "\xd2\x86\xfd\xd9\xfd\xfb\xc8\x07\xaa\x79\x37\x7d\x7a\xd6\xdc\xcc"
+ "\xd9\x29\x0f\xcd\x9d\x99\x3d\xfd\x2e\x43\xf6\xb2\x15\xf9\x79\x29"
+ "\xab\xd6\x14\x1b\xd6\x15\x2d\x2b\x5e\xb6\xf2\x09\x7e\x0c\x98\x61"
+ "\x49\xb1\xf8\x4d\x2a\x5c\xb2\xba\x78\x32\xdd\x26\x1b\x4c\x45\xf9"
+ "\x6b\xf9\xed\xb8\x48\xf0\x47\xb2\xac\x38\xbf\xc8\x70\x43\x5e\xb2"
+ "\x61\xc6\x92\x65\x85\xf4\x15\x43\x30\x5c\x77\x19\x8a\xf2\x8b\xf2"
+ "\x97\xe4\x19\x26\x1b\x52\x09\xb3\x1a\x9d\x4a\x9e\xa9\x8a\x7f\x5a"
+ "\x8d\xfd\x39\xc6\xd0\x5d\xe4\xa7\xa8\x5f\x3f\x01\x99\x6b\x28\x86"
+ "\xe3\xe7\x76\xa1\x1e\x62\x9f\x60\x77\x59\x66\x17\x0f\xee\xc7\x67"
+ "\x97\xfb\xeb\xef\xec\x6a\x7f\xfd\x9d\xdd\x34\xb8\x1f\x9f\x1d\x60"
+ "\xff\xb3\x03\xec\x7f\xf6\xb1\xc1\xfd\xf8\x6c\x87\x7f\x99\x39\xe0"
+ "\x5f\x66\x8e\xbe\xdf\xcf\x20\xad\xcf\x70\xbf\x34\x27\x31\xa0\xcc"
+ "\xc4\x80\x32\xe9\x01\xcf\xd9\xaa\x67\x8c\x5d\xe7\xe4\xa9\x63\x03"
+ "\x7c\x2e\x56\x6c\x7d\xc0\xbf\xcd\x29\x57\x60\xa8\xef\xa1\x6f\x5d"
+ "\x64\xd8\x06\x15\x6c\x97\x0c\xdb\x6f\xff\xe4\x93\x68\xed\xa6\x88"
+ "\xcf\x33\x6f\x90\x7d\x5b\xe7\x8e\x81\x3e\xb4\x13\x65\x71\xdd\x69"
+ "\x98\xf3\x42\xbd\x80\x75\xd0\x7a\x5e\xf6\xd3\x05\xae\xfa\x91\xa0"
+ "\xa3\xb2\x74\x6e\x15\xb3\xcc\xaa\xa1\xf5\xe3\x98\x16\x85\x17\xfa"
+ "\xa9\xcc\x78\x65\xed\xfc\x16\x84\xb1\x43\x26\xd7\x65\x2a\xb7\x85"
+ "\xaf\x3b\xe4\xf5\xbd\x40\xdf\x58\xd1\x59\x70\x3b\xc4\x1e\x12\x9d"
+ "\x74\x9e\x1a\xd5\x8d\x38\xb4\x4c\x9a\xf5\xb9\x7c\x2e\x96\x1e\xaf"
+ "\x38\xc4\x59\xa8\xe0\x44\x7c\xfc\x5c\x46\x8a\xf9\x28\xd6\x13\x71"
+ "\x4f\x66\xa5\x12\x5f\xd0\x58\x21\x98\xef\x08\xbe\x36\x1b\x62\x77"
+ "\x58\x7c\x1d\xd6\x4d\x9d\x44\xd3\x7e\x8a\x43\x6d\xf1\x1e\x38\x52"
+ "\xe3\xc1\xf1\x2b\xe8\xf9\x78\xca\x7c\x0a\x6c\x0d\x1e\xa0\xf9\xe1"
+ "\xc5\x66\x28\xab\x97\x7c\x1d\xac\xbf\x1c\x8d\xd1\x32\x9d\x44\xcf"
+ "\x16\x4a\xc7\xf2\x38\x96\x70\xd0\x1a\xee\x10\xf3\x11\xb1\x04\x67"
+ "\x1d\x4b\xe3\xbd\xac\x64\x39\xf6\x2d\xaf\x47\x5c\x41\xd7\x17\x4b"
+ "\x60\x73\x59\xb2\xb0\xff\x5b\xd7\xae\xf8\xec\x03\xd5\xdc\xf7\x49"
+ "\x98\x8e\xe3\xd7\xcc\xe6\x50\x71\x8a\xec\xdf\x4d\xb4\xae\x0c\x61"
+ "\xf7\x5c\x08\x96\xe8\x3e\x80\xed\x66\xdb\x87\xe9\x76\x6f\x4a\x0d"
+ "\x97\xfd\xab\x0e\xcb\x75\x2a\xe5\x2e\xa6\x7d\x14\x1b\x51\x7f\x8c"
+ "\xb6\xea\x14\x63\xc5\xb9\x0f\xbf\xc8\xd7\x2c\x3f\x80\xf1\x5f\x96"
+ "\x62\x07\x97\xe1\x33\xfa\xbf\x2c\x3e\x9f\xc8\xd7\xf5\xe0\x78\x72"
+ "\xb5\x09\x63\xb6\x78\x27\xfa\xc6\x07\x72\x94\x3c\x3e\x4f\x44\x79"
+ "\x25\xcc\x7d\x20\xbe\x93\xf2\x8a\xfb\xf3\xc4\x37\x04\xec\x80\xd9"
+ "\x43\xe9\x95\x4a\xba\xe8\x5b\x1e\xa8\x09\x78\xde\xa3\x3c\xe3\x7d"
+ "\x0b\xde\x1b\x64\xfc\x0e\xf4\xb9\x1a\xb1\xe7\xc2\xdc\x51\x75\xdc"
+ "\x6e\x1e\xe8\x50\xf2\xf9\x9c\xda\xab\xf4\x6e\xcc\x09\xbe\x98\x61"
+ "\x3a\x1e\x73\x61\x99\xbd\x5f\xb9\xc3\x71\x8c\xa1\x61\x74\x86\x2a"
+ "\xa6\x11\x1e\xb2\x19\x7e\x96\x3d\x3e\x1f\x87\x07\x0e\xd1\x77\x0e"
+ "\xa4\x23\xeb\x3c\x90\x60\xba\x9b\xe6\x9f\xe7\x72\xbd\xa5\x34\xc2"
+ "\x4b\xf8\xa8\x4f\x24\xdc\x84\x6f\x3b\xc5\xb4\x7c\xbd\xe4\x5c\x6a"
+ "\x7f\x65\x28\x59\x61\xbe\x59\xc5\xcb\x70\x7c\x2e\xf7\x6f\xeb\xdc"
+ "\xea\x80\xe7\x26\xe5\x99\xe6\x7a\x85\xee\xcd\xad\x91\xf3\x5a\x2f"
+ "\x54\xd7\x58\xfe\x8d\xcc\xdc\xae\x80\xfa\xdc\xfe\xf8\xe7\xe9\x02"
+ "\x9e\xe3\x95\xe7\x9d\xfc\x1d\xc3\xbc\x24\xa5\x0e\x2e\x33\xd4\xb1"
+ "\xc6\x4d\x8e\xf0\x0b\xed\x65\x82\x65\x16\xaa\xea\x1c\x86\xcf\x85"
+ "\x03\xf2\x9b\x67\x56\xf0\xe1\xfd\x16\x15\x1c\xc6\x25\xf3\x76\x2a"
+ "\x70\xe2\xfd\xc6\xbc\x46\x55\xb9\xe6\xaf\x69\x6b\x80\xee\x66\x7b"
+ "\x85\xee\xce\xeb\x0a\xa0\xc5\x3d\x80\x33\x5b\x3b\x40\x4b\xb6\x5e"
+ "\x05\x87\xf6\x99\x6d\x08\xd4\xd5\xd5\x66\xd2\x71\xd2\xd7\xec\xb4"
+ "\x20\x79\x6e\x39\x2f\x27\xb8\x8e\x67\x9b\x54\xe9\xf2\xf8\x28\xfb"
+ "\x13\x39\x4e\x20\xff\xec\xec\x29\xcd\x56\xce\x53\xe5\x3a\x49\xfb"
+ "\x88\x4d\x10\x67\x77\xa3\x5e\x67\x37\x07\xe2\x15\xdf\xdf\xc8\x38"
+ "\x06\x70\x96\x89\x18\x2f\xdb\xae\x6a\x5b\xb7\x1d\xe6\x2a\xef\x89"
+ "\x1c\x62\x6e\x70\xde\xb1\x50\xe3\x0e\x97\xe5\xc1\x04\x7f\x9e\x3d"
+ "\x98\x3c\xc0\xb3\x07\x27\x0d\xe0\x7d\x30\x5d\x05\xf7\x5f\xf8\x9c"
+ "\xad\x82\xcb\xfd\x3a\xdd\x14\xba\xf2\x60\x79\x40\x5d\xd5\x2a\x1c"
+ "\x8d\xaa\xba\x9a\x55\x70\x1d\xf8\x6c\x0d\x2d\x9f\x07\x8f\x85\x96"
+ "\xcf\x83\xee\xe0\xf2\x99\xaf\x1f\xa8\x77\x7e\xc2\xd7\xdb\xd5\x7c"
+ "\xa3\x8a\x9e\x7a\x7c\xce\xf2\xb7\xa3\xf9\xb9\x01\xcf\xfd\xf2\x67"
+ "\xe8\x3b\x1a\x37\x18\xc3\x29\xbd\x78\x0c\xe8\x85\x9d\xcd\xaf\x52"
+ "\xe7\xef\xed\x15\xf9\x44\x23\x7f\x07\x47\xef\x37\x05\x5c\x4b\x20"
+ "\x1c\xc1\xa8\xf2\x3b\x14\xda\xb1\xbf\x0e\x7a\xf6\xa7\xd2\xff\xd9"
+ "\x7c\xd4\xff\xcd\xe7\xfd\x1f\xdb\x36\x3c\x8d\x59\x3e\xc8\x09\xd5"
+ "\x97\xb9\x2c\x0f\xa5\xe2\x98\xa1\x4b\xf0\xe7\x21\xd4\xff\x95\x3c"
+ "\x36\x61\x95\xc3\xd3\x50\x9f\x7a\x4f\xc0\x43\x9f\xe0\x6f\x1f\xfe"
+ "\xbe\xe7\xdf\xbf\x3e\x94\xcd\x2c\x9a\x79\xf5\x96\xc0\x7e\xf7\xa1"
+ "\x42\x1c\x7b\xf4\xc6\x7a\xca\x72\x82\xe4\x95\x33\x4b\xd8\xdc\x20"
+ "\xe9\x0d\x28\xaf\x5e\x3b\x3c\x74\x94\xe8\x55\xa5\xb7\x30\x4b\x4c"
+ "\x36\xc1\xdb\xa9\x3e\x2c\x13\x4a\x6e\xca\x77\x50\x42\xf7\x72\xb4"
+ "\x01\xed\x38\x7f\x02\x72\x36\x8b\x76\xe4\x7c\xea\x5f\x77\x4e\x42"
+ "\xf0\x76\xe4\x4c\xc4\x76\x9c\x0f\xde\x8e\x9c\x2c\xce\x5b\x09\xdb"
+ "\x32\x28\xee\xc8\x29\xc4\xb6\x9c\xe7\x7c\xf7\x4f\xdf\xa2\x8c\x53"
+ "\x4b\xcf\x03\xbd\x17\xe2\x65\xe7\x95\x0c\xc8\x4d\x86\xdb\x13\x5b"
+ "\x0d\x59\x41\xea\x6c\x65\x96\xe1\xf3\xec\x90\xe3\x51\xfa\x2b\x39"
+ "\xfd\x98\xa0\x05\xf9\x24\x11\x9f\xb0\x3d\x58\x2e\x94\xbc\x15\xfb"
+ "\x14\xef\x99\x1e\x46\xfb\x7f\xc8\xae\xf4\xe9\xd8\x9f\x3b\x14\x3e"
+ "\x62\x5e\x46\x40\x9e\x5b\x95\x97\xe7\x97\xb7\xb1\x3f\xbd\x44\x49"
+ "\xbf\x38\x39\x3d\xbc\x27\x40\x4e\x28\x9f\x47\x26\xfb\xb7\xfb\xe1"
+ "\xfd\xa2\x7d\x28\xa3\x41\xbc\x7e\xb8\x03\x65\xd4\x17\x5c\x46\x0f"
+ "\x3b\x83\xeb\xda\x23\x51\x1c\xdf\x48\x08\x82\xef\x91\x24\x94\x5d"
+ "\x1f\xd7\x41\x59\x4e\x83\xe5\xf3\xc8\x2c\x45\x3e\x17\xd7\xc6\x47"
+ "\xaa\x02\xda\xe8\x3d\x01\x0b\xa2\x45\x5b\x17\x3c\x1a\x80\xbb\x29"
+ "\xb8\x2e\x3e\x62\xc5\x76\x7a\x83\xb7\xf3\x91\x63\xa1\x75\xf1\x11"
+ "\x7a\x57\xe7\x1d\xac\x8b\x0b\xf4\xa2\x0c\x04\x29\xb3\x20\x99\x59"
+ "\x82\xd5\xb3\x20\x9d\xe2\x22\x3b\x2c\x28\xa1\xf7\x74\xaa\xf4\x85"
+ "\xfe\xfa\x87\x6d\xa0\x72\xc4\x3f\x8f\x18\xc7\x90\x1c\x4e\x18\x40"
+ "\xfa\x3a\x9d\x74\x59\x16\xec\x0f\xe0\xd5\x99\x13\xb0\x70\x72\x8f"
+ "\x24\xcd\x10\xfc\x7a\x54\x13\x40\x53\x47\x70\x7e\x2d\x70\x20\xbf"
+ "\xce\x04\xe7\xd7\xc2\xa8\xd0\xfc\x5a\x48\xf2\x3f\x33\x98\x5f\x0b"
+ "\x8d\x6a\x7e\xf9\x2c\xa2\x7d\xd7\xc7\xa3\x6e\xf4\x2d\x66\xf5\xc2"
+ "\x97\xeb\x63\x51\x57\x44\x99\x6e\x2a\x53\x1c\xeb\x16\x7a\x62\xb8"
+ "\x1a\x74\xa7\x61\xe1\x42\xc5\xfe\x63\xaa\x61\x38\xeb\x5b\x40\x6b"
+ "\xb4\xe9\x4c\x67\xbd\xcd\x7c\xc6\x6a\xf3\xa4\x02\xcd\x37\x06\xd4"
+ "\xdb\x12\xdc\x17\x2c\x6c\x47\x9e\xfe\x24\x48\x7a\x97\x98\x33\x7d"
+ "\xd4\xe0\xef\x23\x1e\x05\x7f\x19\x2d\xe0\xe5\xa0\x7f\xff\xd3\x0b"
+ "\x5f\x17\x96\xd9\xa3\xa6\xc1\x32\x5b\x34\x42\x96\xd7\x97\xfe\xf4"
+ "\x3d\x5a\x1e\x5c\x5e\x8f\x36\x84\x96\xd7\xa3\xfb\x43\xcb\xeb\x51"
+ "\x1a\xfb\x9c\xb1\xc3\x22\xbd\x7f\xbf\xf1\xa8\xc3\xbf\xbd\x58\x2f"
+ "\x96\x63\xd2\xb0\xcb\xe9\xf9\x62\xdb\xad\x5c\xe4\xe3\x48\x56\xf4"
+ "\xfd\x3f\xd2\x3f\x86\x68\x1c\x2a\x8e\x90\xb8\x91\x87\x55\x1b\x42"
+ "\x9e\x13\x1e\x75\x04\xc7\x95\xb4\x3e\xcf\x30\x9a\xe6\xca\x16\x7d"
+ "\xe1\x93\x34\x77\xe1\xbd\x74\x02\x72\xdf\xf6\x49\x61\x65\xb4\x96"
+ "\x8c\x7f\x3b\xc8\xdf\x4f\x2c\xf2\xa8\x65\x41\x6b\xca\xb6\x8b\xbd"
+ "\x1c\x69\x9e\xf3\xb3\x13\xb0\xf8\x59\x21\x97\xdc\x17\xfc\xf9\xb8"
+ "\xd8\x10\x5c\x2e\x8b\x27\xa1\x5c\x3e\x0b\x2e\x97\xc5\xd9\xa1\xe5"
+ "\xb2\xd8\x84\x72\xf9\x6c\xb0\x1d\x2d\x2e\x97\xed\xe8\x19\x2a\x63"
+ "\x58\x49\xf1\xea\xe2\xf3\x04\x83\xf7\x68\x23\x8b\x3f\xa7\xfc\x94"
+ "\x6e\xc5\x8e\x78\x19\x1a\xff\xf3\xfa\x65\x98\x16\x19\x87\x1a\xaf"
+ "\x3d\xb6\x3b\x98\x9d\x2c\xa6\xf7\xa9\x9a\xf1\x26\xd0\x21\x0f\x73"
+ "\x6a\x09\x47\x11\xc0\x69\xc8\x9d\x4d\x70\x94\x4e\x67\x2c\x0f\xc0"
+ "\xe7\x26\x29\x70\x7c\x5e\x54\xc0\x1a\x98\xab\x00\x08\xce\x1f\x77"
+ "\xae\xdc\xfe\xe1\xbc\x1f\x21\x78\x82\x0b\x80\x31\x0b\x7b\xcc\xdd"
+ "\xef\x6f\x8f\xb9\x55\xfe\xfa\xb9\x98\xde\x4f\xc4\xfa\xd0\xcf\xa1"
+ "\x2e\x77\x7a\x2d\x9a\xbb\x2e\x8d\x6d\x2e\x89\x0a\xb0\x4d\xd4\x81"
+ "\x25\x6f\x09\x1d\x58\xb2\xcd\x9f\xd6\x25\x89\xc1\x75\x60\x49\x5a"
+ "\x68\x1d\x58\x92\x13\x5a\x07\x96\x14\x93\x0e\xd8\x61\xc9\x1e\x7f"
+ "\xdb\x5c\x52\xe9\xdf\x76\xac\x97\xdb\x26\x8c\x18\x8a\x6d\x62\x2c"
+ "\x74\x79\x28\x3b\x94\xe3\x7f\x4d\x7d\x2f\xc0\x10\x78\xa6\x43\xbb"
+ "\x42\xfa\x1e\x33\xd2\x3b\x24\xf4\xf1\x05\xc4\xc3\x3a\x3e\x46\x7b"
+ "\x2c\x5b\xcd\xc7\xed\x62\xac\x55\x8a\xb0\x7f\xa4\x35\x7b\x82\x9f"
+ "\x8f\xbf\xea\xdf\xfe\xc7\x8a\x83\xf3\xf3\xb1\x4a\xe4\x67\x69\x70"
+ "\x7e\x3e\xd6\x14\x9a\x9f\x8f\xb5\xd2\xb7\xea\x83\x6d\xea\xb1\x63"
+ "\x86\xb5\x3c\x46\xe1\x65\x4e\xc3\xe3\xb7\x5f\x5c\xff\xf4\x78\x9c"
+ "\x7f\xff\xf4\x98\x67\xe8\xfd\xd3\xe3\x39\xc1\xfb\xa7\xc7\x4d\xc1"
+ "\xfb\xa7\xc7\xcb\x85\x3d\x3c\x6e\xf5\xb7\x87\xc7\x1b\xfc\x75\x02"
+ "\x79\x77\xc9\xfa\xa7\x3c\x7d\x80\x0d\xec\x38\x01\x79\x2f\x60\x4c"
+ "\x21\xfb\xc2\xfc\x07\xfd\x69\xcc\x4b\x0e\x2e\xb7\xbc\x74\x94\xdb"
+ "\x8e\xe0\x72\xcb\xcb\x0d\x2d\xb7\xbc\x12\x94\xdb\x8e\xc1\x72\xcb"
+ "\xdb\x39\xf4\x98\x22\xaf\xcd\x5f\x66\x79\xcd\x43\x97\x59\x7e\x54"
+ "\x70\x99\xe5\x27\x06\x97\x59\x7e\x9a\x90\x59\x7e\xb1\xbf\xcc\xf2"
+ "\xb3\xfd\x65\x86\x7c\xbb\x64\x32\xcb\x6f\x0d\x90\xd9\xaa\x13\xb0"
+ "\x74\x3a\xca\xac\x5d\xc8\xec\x89\x88\x00\x1a\xed\xc1\x65\x96\xef"
+ "\x46\x99\xad\x0a\x2e\xb3\xa5\x71\xa1\x65\xb6\x94\xf6\xd0\x58\x35"
+ "\x58\x66\x4b\x33\x86\x2e\xb3\xa5\x25\xfe\x32\x5b\x9a\x37\x74\x99"
+ "\x2d\xb5\x06\x97\xd9\xd2\x8e\xe0\x32\x5b\xea\x10\x32\x7b\x22\xc9"
+ "\x5f\x66\x4f\xe8\xfc\x65\x86\x7c\xfb\x96\x32\x43\xf9\x18\xc5\x7a"
+ "\xdd\x27\xb6\xf6\xf0\x39\xed\x27\xca\xec\x50\x20\x7f\xcf\x5e\xc0"
+ "\x75\x47\x96\xe1\x5e\x84\x29\x1e\xdc\x77\x3f\x51\x23\xa7\x3d\x34"
+ "\x58\x0e\x4f\xb4\x60\xbf\xda\xdd\x5a\xc2\xd7\x75\x09\x19\x12\xcf"
+ "\x11\x4e\xcc\x91\x3d\xc1\xfd\x3f\xca\x98\xd1\xbe\xc2\xd4\x17\x23"
+ "\xbc\x93\xf0\xd0\xbe\x2a\xfe\xb8\x0a\xb4\x43\x89\xcb\x42\xaf\x31"
+ "\x1f\x6e\xa4\xbd\xff\x4f\xc0\xb2\x51\x42\x57\x0b\x02\xe3\xdf\x7a"
+ "\xac\xeb\x94\xd0\xd3\xe5\x01\x73\x26\x05\x21\xe2\xdf\x02\x8a\x7f"
+ "\xeb\x83\xeb\x69\xc1\x05\xe2\xdf\x02\xe2\x47\xbd\x6a\xbc\x3a\x12"
+ "\x23\xc0\x80\xf1\x6a\x81\x27\xd6\x29\x74\x87\xc7\xb1\xdb\x86\x1b"
+ "\x5d\x96\x65\x89\x01\x34\xa3\x6c\x96\xbd\x2a\xd3\xfc\xb2\x7f\xf9"
+ "\x65\x69\xc1\x69\x5e\x96\x8d\x34\xef\x0d\x4e\xf3\x32\x53\x68\x9a"
+ "\x97\x55\x22\xcd\x7b\x07\xdb\xd6\xb2\x46\x59\x0f\x82\x8c\xcb\x97"
+ "\x59\x83\xcb\x7f\x59\x80\xfc\x21\xa7\xb8\x84\x39\x78\x79\x3f\xb8"
+ "\xe5\xa0\x86\xa3\xb5\xfa\x04\x4b\x3a\x12\x04\x36\x39\x10\x67\x08"
+ "\xb8\xec\x41\xba\x47\xdf\x16\x04\xd5\xbd\xe5\x65\xc2\x1e\x97\x77"
+ "\xf8\xdb\xe3\xf2\x6a\x7f\x7b\x5c\x16\xc0\x93\xe5\x2d\xfe\xf9\x05"
+ "\xe5\x97\xce\xc7\x3e\x99\x14\xa0\x03\x1f\x9c\x80\x27\x5f\x13\x3a"
+ "\xf0\xa4\xd7\x9f\x8e\x27\x8d\xc1\x75\xe0\xc9\x1c\x6c\xff\x07\xc1"
+ "\x75\xe0\xc9\xe2\xd0\x3a\xf0\x64\x15\xf2\xf2\x03\xb5\xde\xce\x2b"
+ "\x31\x0e\x0f\x80\xd9\x17\xdc\xe7\x3d\x79\x28\xf8\xbc\xce\x93\x9d"
+ "\x82\xc7\x85\x09\xfe\x3c\x7e\xd2\xe3\xcf\x43\x6c\xcb\xb7\xe7\x61"
+ "\xff\x59\x19\x2e\x4b\x61\xa0\xfd\xdb\x4e\x40\xa1\x6c\xff\x2b\xbe"
+ "\xf0\xa7\xb1\x50\x1e\xff\x04\x9b\xcb\x2a\x6c\x44\x5e\xda\x82\xf3"
+ "\xb2\xd0\x1a\xbc\xcd\x85\xd4\x07\xd9\x7c\x83\x6c\xa9\x90\xbe\x4b"
+ "\x9d\x47\xef\x0e\x68\x0e\xab\x0e\xd3\xe7\x79\x40\xc7\xfb\xab\xfe"
+ "\x7e\x69\x45\x1c\xcd\x91\xf3\x39\x66\xd4\xdf\xd8\x04\xc8\xa2\x3e"
+ "\x88\xe8\x5a\x5c\x12\xf8\x4e\x74\x85\x91\xe8\xa6\x75\x2c\xf4\x5d"
+ "\x4d\xac\x19\xb2\x6c\x4e\x0f\x28\xfa\x4e\xf0\x01\xb8\x4d\x64\x17"
+ "\x04\xaf\xc0\x8a\xb9\xce\xb2\x00\xdf\xb4\xa2\x3a\xb8\x8c\x57\x34"
+ "\x87\xd6\x9d\x15\x87\x84\x9c\x57\x82\xbf\x9c\x57\x74\xfa\x2c\x31"
+ "\xd9\xd4\x56\xd4\x81\x21\xd9\x09\xbd\x3b\x0d\xe9\xef\x9f\x59\xd0"
+ "\x61\xda\x04\xa3\x4f\xc2\xca\x02\x5e\x9f\xc4\x30\xa6\xd0\x40\x2b"
+ "\xf7\x01\x2b\xdf\xe7\x74\x22\xcc\x62\x0f\x48\xec\x99\x27\x3b\x28"
+ "\xaf\xde\xc2\xdc\x74\x6e\x8c\x72\x06\x0c\xea\xc2\xe5\xc7\x61\xe5"
+ "\x66\xbf\xf2\xd8\x1b\xd9\x04\x8e\xfd\x62\x7e\x7f\x65\x8b\x32\x0f"
+ "\x1f\x6a\x7e\x1f\x61\x8e\x29\xeb\x7e\xc5\xbb\xb0\x95\xed\x21\xfb"
+ "\x65\xa4\x89\xbe\x1d\x27\x9a\x2e\xec\x07\x56\xa5\x2a\xfa\x2b\xde"
+ "\xcd\xad\x32\x0e\x7c\xdb\xb2\x6a\x16\xe6\x39\x2f\x30\x9f\xab\xb2"
+ "\x83\x55\x66\x35\x1e\x71\x5e\xcc\xaa\x4a\xe5\xfb\x14\xbc\xaf\xfe"
+ "\x1a\x5c\x0a\x3d\xd6\x00\x7a\xda\x71\xbc\xe0\x94\x71\x1c\xfb\x1a"
+ "\x1c\x71\xb6\xc6\xbb\x60\xbc\x0f\xc2\x4e\x42\xd1\x38\x3a\x7f\xc6"
+ "\x56\xd3\x05\x51\x1e\xd0\x8a\xb1\x9d\xe9\x56\xfa\x36\x84\xc6\x86"
+ "\x36\xcf\x14\x2b\xbd\x83\xe3\x6b\x08\xe2\xa7\x58\x0f\x9b\xbd\xf2"
+ "\x1e\x6c\xa6\x7b\x88\xa7\x87\x0b\xce\x58\x6b\x5e\x62\x5d\xb5\x7c"
+ "\xef\x2d\x93\xdf\xf8\xaf\x92\xd6\xff\xd0\x3a\x8c\x4d\x30\x05\xe1"
+ "\xff\x28\x6c\xbd\x28\x20\x26\x35\x85\x18\xff\x99\x68\xfc\x37\x25"
+ "\xb8\x9d\x9b\x2e\x30\xfe\x33\xd1\xf8\x6f\x8a\xba\xdf\x14\xef\x79"
+ "\x4c\xc7\xd4\x31\x29\xed\x8f\x65\x58\x4a\x71\xe6\x53\x0f\xdc\xb2"
+ "\x13\xf4\x1e\x7a\xa7\x8d\xb6\x69\xeb\x6a\x25\x7b\xd5\x1f\x76\xb4"
+ "\xd0\x3e\x0c\xba\x18\x13\xe9\x22\xf5\x65\x64\xaf\x4f\x19\x78\x5f"
+ "\xe6\x11\xb6\x58\x6a\x66\x8e\xe4\x4e\xd4\xa1\x55\x05\x0a\xae\xa8"
+ "\x8d\x05\xe2\xbb\x8f\x98\x4e\x18\x6e\xeb\xe2\xfd\xa2\x86\xe2\x55"
+ "\x1e\xb7\x7a\xce\x02\xe1\x3d\x50\x72\x18\x08\xaf\xaf\xbf\x9f\xe4"
+ "\xb8\x4b\xc8\xc6\x09\x27\xe1\x3e\x82\x70\x84\x97\xe0\x94\x76\x88"
+ "\x6f\x63\x9e\x6a\x54\xb7\x9d\xcf\xbf\x60\xdd\x98\xfe\x39\xcd\xab"
+ "\xd8\xa8\x5c\xe9\x02\x36\xbe\x93\xde\x99\x9d\xb1\xb2\xd2\x27\xd9"
+ "\xf8\x22\x9a\x13\x2b\xa2\x73\x9f\x35\x7b\xff\x64\x0f\x2f\x1e\x03"
+ "\x3a\x91\xf6\x54\x77\xab\xc1\x0d\x76\x28\x4a\xf5\xf7\x11\x45\x01"
+ "\xf1\xaf\x89\x8f\x33\xf1\x57\x4b\xeb\x13\xe5\xf5\xab\xe4\x0f\x98"
+ "\xcd\xe3\xe2\xfa\x71\xa1\x35\x15\xf4\x4e\x9a\xd6\x44\x89\xfd\xdf"
+ "\x8a\xcc\x01\x73\x6f\x8e\xed\x7c\x5d\xcd\xff\x60\xbd\xab\xc3\x85"
+ "\x8e\x14\x87\xfb\xcb\xb4\xa8\xba\xf4\x14\xbd\x0b\x12\xfd\xc1\x22"
+ "\x4f\xa0\x7f\x2c\x6a\x51\x62\xb7\x80\xf4\x76\xa5\x3f\x30\xac\x24"
+ "\xbc\xab\x03\xfa\x99\x22\x1e\xff\x7b\x07\xf5\x0b\xab\xc9\xaf\xfb"
+ "\xe9\xe4\x11\xae\x43\xab\x0d\x87\x9d\xa8\x37\x45\xa4\xff\xab\x5f"
+ "\x46\x98\xcd\xf4\xcd\x21\x3e\x0f\x3f\x0d\xab\xb3\xbc\x16\xd0\x1d"
+ "\x76\xf0\x6f\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdf\x98\x20\xd6\x23\x39"
+ "\x03\xea\x28\x54\x78\x4e\x30\x47\x8a\xfe\x07\xc4\x7a\x0a\xd2\x85"
+ "\xd5\x46\x5a\x9b\x11\xd3\xcd\xf7\xda\xd2\x2b\x3a\x64\xf3\x74\xc0"
+ "\x11\x4f\xe0\x98\x67\xf5\xbe\xe0\x6d\x5f\x4d\xfd\xff\x4f\xec\x50"
+ "\x9c\xe8\x2f\xdb\xd5\xbc\xff\x57\xde\xeb\xa0\xec\x1d\xfe\xe5\x8a"
+ "\xb5\xfe\xb2\x2f\xaa\xa6\xfc\x90\x6b\x7c\x2a\x87\xa7\xe3\x78\x66"
+ "\xb1\x93\xaf\xf7\x2a\x46\xfb\x2f\xca\xbe\x90\x1f\x64\x51\xc3\xd3"
+ "\x7d\x08\x2b\xaf\x0b\x46\xbf\x55\x5c\xee\x37\x67\x74\x25\x9f\x33"
+ "\x5a\x7c\x02\xd6\xc8\xef\x7e\xd6\x1c\x0e\xa0\xaf\x31\x74\x6c\x50"
+ "\x4c\xef\x7f\x16\x07\xf7\x19\xc5\xc7\x82\xc7\x06\xc5\x4e\xd9\x2f"
+ "\x2c\x66\xd1\x81\x7a\xb0\x86\xbe\xa7\xe3\x65\x94\x31\x2c\xcd\x85"
+ "\x86\x1e\xc3\xae\x31\xf6\x8f\x61\x8b\xc8\x1f\xac\x49\xea\x1f\xc3"
+ "\x3a\x82\x8d\x61\xed\x41\xe4\xb9\x66\x4b\x70\x79\xae\xa9\x09\x3e"
+ "\x86\x5d\xb3\x4f\xf4\xf3\x6b\xba\xfc\xe5\xbc\xe6\xd0\xc0\x3b\xe1"
+ "\xe2\xc6\x4b\x17\x0f\xaf\x9d\x34\x38\x1e\x5e\xfb\x6b\x21\xab\xb5"
+ "\x67\xfd\x69\x5b\x9b\x15\xdc\xb7\xaf\x2d\x08\x1d\x0f\xaf\xdd\x12"
+ "\xda\xb7\xaf\x6d\x18\x1c\x0f\x1b\x86\x05\xc0\xb4\xf6\xc7\x4a\x7e"
+ "\xb1\xd9\xda\x63\x82\x4f\xeb\x28\x9e\x0b\x53\xc1\x3b\xfd\xf5\x1d"
+ "\x69\x46\x7c\xe8\xdb\x4e\x92\x4f\x53\x74\x26\x14\x4f\x68\xef\xa5"
+ "\xeb\x77\x42\x04\xda\xc0\x07\x2e\xcb\xba\x7e\xfd\xa7\x75\x7c\x54"
+ "\x0f\xf9\xc8\x90\xeb\xe9\x24\x85\x3e\xa2\x63\x5d\xc9\x85\xde\x97"
+ "\x86\xc5\x43\xd6\x8b\x83\xf8\xb1\x8e\xc7\x7f\x84\xe3\xc2\x32\x5b"
+ "\xd7\x1d\x60\x63\x4e\xb1\x0e\xd7\xfc\x9e\x90\x9b\x39\x60\x2c\x6b"
+ "\xd6\xf1\x6f\xfa\x42\xfa\x5b\x73\x52\x70\x1d\x35\x1b\xfb\xfd\x6d"
+ "\x11\xc7\xbb\x3e\x20\x3f\x57\xc8\xc0\xdc\xe2\x8b\x56\xcf\x75\x9b"
+ "\xcd\xfe\x3e\xc9\x9c\x1b\x50\x2e\x60\xfc\x67\xe6\xf4\x5c\x5c\x7f"
+ "\x63\xee\x0a\xdd\xdf\xac\x5f\x23\xda\xbf\x21\xe0\xfd\xf2\x7a\xdd"
+ "\x85\xfb\x9b\xf5\x21\xda\xbf\xde\xe8\xdf\xdf\x6c\x08\x78\x47\xbf"
+ "\x3e\x37\x78\x7f\xb3\xde\xac\xf8\x19\xe1\x37\xd6\xff\xfe\xe2\xfc"
+ "\xcd\xfa\x66\x7f\x7f\xb3\xbe\xfa\xeb\xfc\xcd\x81\x41\xfe\x66\xbd"
+ "\x33\xb6\x26\x58\x5b\x36\x44\x05\xf7\x37\x1b\x12\x85\x0c\x37\x94"
+ "\xf8\xfb\x9b\x0d\x69\xfe\x32\x5c\x1f\x20\xc3\x0d\x01\xef\xbf\xd7"
+ "\xeb\xbe\xa9\x4f\x0a\x0b\x0b\x93\xc2\x34\x92\x26\x0c\xb3\xb0\x79"
+ "\x30\x3c\x4c\x1b\x16\x8e\xd7\x30\xf9\x77\xb8\x14\x26\x69\xf1\xfa"
+ "\xff\x89\xfb\x1e\xe8\xa8\xaa\x6b\xef\x33\x93\x09\x4c\x70\x32\x13"
+ "\x42\x8c\x23\x7f\x64\x50\xb0\x51\x41\xa2\xe2\xf7\x51\xc4\x1a\x2b"
+ "\xbe\x87\x6f\xa1\xa4\x14\x6b\xda\x87\x26\x68\x62\x43\x45\x98\x26"
+ "\x01\x02\x86\x4c\x18\x22\x8d\x9a\x7f\x6a\xc4\x00\x21\x44\xa5\x2d"
+ "\xb4\xa8\xb1\xc6\x36\xf6\xa1\x8e\x12\x7d\x51\x43\x26\x5a\x6c\xa3"
+ "\x0f\xdb\x21\x0d\x31\xa4\x01\x46\x32\x49\x86\x64\xe6\x9e\x6f\xff"
+ "\xce\xb9\x77\x66\x12\x13\x2c\xef\xbd\xb5\x3e\xd6\x0a\x73\xef\xb9"
+ "\xe7\xef\x3e\xfb\xec\xb3\xf7\x3e\xfb\xec\x1d\xad\xfe\x4e\x18\xf5"
+ "\x3e\x11\x65\xe9\xcf\xa0\xfe\x46\x8f\x7a\x9f\xf0\x2d\xdf\x27\xaa"
+ "\xed\x6a\xed\x1b\x46\xbd\x47\x7f\xcb\xf7\x09\xff\xc3\xf2\xec\x1b"
+ "\xef\x23\xef\x41\xde\xb5\x6e\xe3\xea\xb5\x6b\x32\x85\x5d\x7b\x96"
+ "\x6d\xf5\x43\x0f\x65\xe5\xe6\xda\xf2\xd6\xdb\xbe\x7f\xfb\x8a\x1b"
+ "\x17\xd9\xa4\x79\xfc\xda\x5b\xe7\x64\x4e\x62\x77\x6f\xca\xc1\x87"
+ "\xbb\x7f\x78\x57\x9a\x2d\xf5\xfb\xb7\x8f\xfc\xa8\x55\x23\xcc\xe0"
+ "\x2f\x54\x4b\xc4\xda\x4b\x79\x22\x91\xb1\xd2\x9d\x82\xee\x74\xe2"
+ "\xee\xb9\x94\x27\x8a\x3e\x6f\xc1\xfd\xe5\x21\x07\xc7\xbd\x8a\x0e"
+ "\x56\xb0\x15\x83\x98\x57\x57\xc4\xec\x0f\xc2\x9f\x4a\xc1\x2e\xfe"
+ "\xb6\x97\xd9\xfe\x8d\xe9\x3b\xd8\xe3\xa7\x9a\x96\x52\x5e\x7a\x77"
+ "\x7b\x02\xcc\xe6\x00\x6f\x5b\xf4\x04\x7d\xd3\xf1\xef\x29\x94\xe6"
+ "\x53\xef\x64\x3a\x76\x89\xb4\xb7\x8b\xb4\x7c\x96\x2e\xb6\xf5\x56"
+ "\xfe\x36\x17\xef\xf0\x59\x23\xf3\x6d\x9d\xcc\xf5\x8f\xb5\x81\x2e"
+ "\xd4\xc4\x33\x03\xec\xb2\x77\xc5\x33\xe3\xae\x44\xf8\xdc\xdd\x6a"
+ "\xd0\xec\xb2\x9f\xa0\x77\x0f\x7b\xbc\x1b\x6d\x23\xaf\xa2\x7f\x6c"
+ "\x08\xf9\x6b\x47\xe6\x5f\x10\xb6\xe3\xde\x6a\xd0\x53\xbe\xe5\x27"
+ "\x98\xc5\x12\xe4\x5f\xfb\x27\x05\xf3\xaf\x5f\x4a\x7c\x1a\x4d\x45"
+ "\x4b\xa0\x88\xc9\xbb\x51\x5b\xb7\x6e\x0e\xf2\x00\x7c\x26\xdc\xdd"
+ "\xeb\xe0\x15\x8f\x32\x03\xad\x67\x9d\x2b\x07\x77\x29\xb6\x66\xee"
+ "\xcb\x62\x06\x1a\xff\xf4\x1e\x56\x58\x65\xbb\x87\xf8\xc6\xbb\x99"
+ "\xe1\xa3\xfc\x22\xc6\xcb\x8d\xbb\xcb\x3f\x65\x86\xdf\x0e\x15\xe9"
+ "\x87\xb8\x95\x15\xe4\xf1\x6e\x0e\x3f\xdc\x3e\xee\x87\xbd\x6d\x4b"
+ "\x46\x10\x79\x9e\x1c\x74\x58\x59\x2b\xb1\x2f\x5b\x8f\x73\x7f\xc9"
+ "\xa7\xd2\x5f\xc5\xd1\x5e\x1f\xee\xcf\x1a\xb7\xde\xcd\xa2\xba\xd2"
+ "\x98\xfe\x68\x76\x35\x73\xaf\xf2\xb1\x82\xe3\xbc\xbb\x25\xe3\x24"
+ "\x6b\xcd\xae\x67\xe9\xed\x4c\xdf\xd2\xf9\x25\x13\xbe\xa4\xcb\x53"
+ "\x8a\x0a\xfb\x99\x75\xeb\x1a\xa4\xf5\xb3\x2d\x5b\x59\xec\x96\xcf"
+ "\x20\x07\xb5\x53\x3b\xa7\xd9\x4f\x8e\x31\x1d\xd5\xa7\x7f\xec\x4b"
+ "\x66\x7d\xec\xc7\xb8\x67\x9e\xc2\x6a\x0a\x99\x95\x3b\x92\x4c\x43"
+ "\x8e\xa4\xb8\x21\x9e\x14\x3f\xe8\x48\x4a\x68\xb5\x53\xfe\xce\xb7"
+ "\x98\xb9\x9d\x25\xbc\xdd\xd3\xae\xaf\x3e\xc7\xa6\x63\x4c\x5d\x34"
+ "\xb6\x9a\x73\x94\xbf\x3c\x91\x29\x54\x36\xb2\x4c\x20\x36\xd1\xea"
+ "\x4e\xf3\x33\x85\xea\xaa\x1e\x62\xd3\x6b\x86\x98\x55\x29\x4b\x64"
+ "\x28\xd7\xcb\x1c\x4f\xbb\x5b\x18\x61\x0a\x0f\x0e\x97\x47\xe7\x13"
+ "\x3d\x9c\xf8\xea\x83\x8d\x06\x77\x4b\x2f\x3b\xea\x1b\x62\xad\xec"
+ "\x0b\xe6\xce\xff\xca\xf5\xdb\x07\x1b\xa3\x89\x9f\xd4\xb9\xb6\xc0"
+ "\x06\x5e\xe2\x8e\xe3\x28\xfc\xe7\x15\xb1\x8a\x42\x66\xb2\x6f\x61"
+ "\x13\x7b\x28\x5d\xd0\x9e\x12\x7f\x91\x3b\xf0\x95\x6b\x8b\xb8\x0f"
+ "\xfe\x78\x77\xe1\x51\x16\xd5\xea\xab\xc6\xbd\x63\x7d\xd0\x9c\x52"
+ "\xe4\xf6\xb5\x31\xb7\xfd\x6f\x2e\xc5\x94\x92\x5d\xaa\x30\xe3\xcb"
+ "\x03\x6d\x7a\xb7\x61\x80\xb9\xd3\x7c\xec\x1d\x6a\x9b\x97\xa7\x94"
+ "\x12\xcd\x4a\x69\xf5\xf9\xe1\x7f\x27\x99\xf7\x59\x27\x55\xe4\xb0"
+ "\xb9\xb5\xe7\xd8\xec\xbd\xe7\x58\x12\x1f\x4c\xd2\xe3\x8e\x37\xfc"
+ "\xa5\xed\xa5\x5f\x13\xc9\x60\x34\x76\x79\x8f\x3b\x56\xbd\xeb\x3d"
+ "\x9c\xc4\xf6\x0d\x85\xef\x7a\x0f\xf5\x85\xef\x7a\x13\x4e\x19\x71"
+ "\xdf\xdb\xc3\x0a\x6b\x2c\x2d\x6c\x22\xad\x13\x17\xf0\xbb\xe2\x0c"
+ "\x33\x6c\x3f\xc3\xd8\xf5\x45\x7a\xc8\x99\x06\x5a\x0f\x5b\xdd\x34"
+ "\x37\x78\xee\x60\x45\x0b\xe8\xd7\x44\x7f\x24\xcf\x15\x09\x5f\x15"
+ "\x9d\x2a\x1e\x53\x9a\x9e\xd2\x66\xd0\x6f\x14\xfd\x5e\xea\xa8\xe1"
+ "\x5e\x6a\x2b\x8d\x78\x95\x49\xc0\x67\xf5\x7e\x79\xda\xa0\xb3\xc8"
+ "\xe4\x61\x87\xd6\x6a\x78\x2d\xe9\xfb\x56\xe3\x3b\x1d\xa7\xe1\xef"
+ "\xdd\x2b\xfa\x35\x9c\xad\x83\xef\x77\x35\x1d\x7d\xd8\x80\x76\xa9"
+ "\xfd\x34\xfa\xb5\x48\x19\xd4\xd1\xab\x95\xed\x1b\xce\x46\x9b\x8f"
+ "\x52\x3a\xd7\xd2\x69\xdc\x06\x7c\x7b\xbd\xe3\xb4\x5e\xe6\x49\xd2"
+ "\x53\x9d\x7e\xb5\x7e\x5a\xfb\x05\x87\xb0\xc6\xfb\xf4\x16\x7e\x24"
+ "\x63\x01\xab\xd9\xc9\x5b\xf6\xee\xe4\x4d\x72\xed\x15\xd5\x7b\xd8"
+ "\x2b\xc2\xf7\x24\xed\xe1\x4d\xa5\xf4\xed\x08\x49\xe3\x80\x4b\x53"
+ "\x26\xec\x4b\x8b\xda\x3c\xec\xca\x84\xc8\x31\x70\xe7\x96\x7a\xec"
+ "\xa3\xaf\x14\x36\x93\x3c\xf9\x58\x7d\x6b\x67\x2f\xfb\xed\x50\x77"
+ "\xb4\xe3\x43\xa6\x77\x07\x3a\xd8\xfc\x04\x19\x27\x67\xdf\x4e\xee"
+ "\x79\x16\xf1\x83\x77\xf2\x5e\xc2\x97\x19\x3d\x6c\xdb\x8c\xeb\x12"
+ "\x58\xc2\xc7\xc4\x95\x48\xfa\xb4\xed\xe6\x08\xfa\xf4\xd6\x51\x4f"
+ "\x63\x04\x6d\x7a\xfc\xd1\x6f\xd2\xa6\xe2\x35\x92\x36\xd1\xda\x17"
+ "\xb4\x28\xe8\x51\xd3\xef\x1d\x95\xae\xde\x5f\x29\xfe\xee\xa8\x74"
+ "\xbf\x9a\x3e\x67\x54\xba\x57\xa6\x6f\xcf\xd2\x68\x5f\x2b\xfa\xb1"
+ "\x09\xb4\x6f\xfb\x5d\xa0\x7d\xad\x19\x2a\xed\x13\xf4\x67\xfb\x3c"
+ "\xfe\x22\xd1\xa2\x8d\xa0\x37\xdb\xa3\xd1\x7f\xfe\x36\xd3\xfa\x1e"
+ "\xd3\xc5\x9c\xef\x23\xad\xf2\x0b\x66\xa0\x3f\x95\xee\x15\x5c\x06"
+ "\xba\x07\x9a\x07\xda\xb7\x27\x91\xb7\xef\xd9\xc9\x8f\xd5\x08\xbf"
+ "\xd5\xce\x10\xfd\x7b\x8a\xd2\x4a\x29\xed\x29\xfa\x0e\x3a\x08\x98"
+ "\x1c\x4d\x6b\x64\x22\xae\x4d\xa9\xb1\x5a\xd1\x27\xb3\x72\x9a\x6f"
+ "\xf8\xbf\x2a\x26\xf8\x5a\x74\xcc\xee\xce\xf3\x89\x7b\x28\xf0\x95"
+ "\xde\x9a\xd7\x89\x75\x97\xb8\x5d\x81\x9e\xe2\x24\x2b\xf4\xf1\x1e"
+ "\xdc\x55\x41\x1f\xd2\x37\xff\x1b\x7c\x7d\xeb\x9a\xb2\x19\x83\x5f"
+ "\x02\xd0\x6c\xea\x8b\xa1\x92\xfa\x24\x7d\x0b\x3b\x0f\x7b\xd8\xdf"
+ "\x54\x7c\x7d\x1c\x77\xd5\x68\x4f\x21\x41\xdc\x49\xf4\x91\xc6\x66"
+ "\x09\x16\x31\xf8\x66\x41\x7c\x4d\xfc\xee\xd1\x2b\xd9\x95\x9a\x7f"
+ "\x16\x27\xd1\x06\xca\xe3\x6e\xf7\x33\xf4\xd9\xc3\x9c\xcb\x8e\x16"
+ "\x34\x52\xf9\x6d\x5e\xc0\x86\x3b\x1d\x5a\x1d\x3a\x51\x87\x5e\xe8"
+ "\x6e\xb3\x29\x9f\x47\x94\x37\x47\xe7\x1f\x5d\xe5\x65\xa0\xfb\xee"
+ "\x6e\xaa\xa3\xa0\x43\xd6\x41\x75\x71\xda\x03\x46\x7c\x53\xeb\x8f"
+ "\xdd\xca\xbf\xa6\xfa\x0f\x63\xbe\xe0\xa7\x0b\x76\x4a\x04\x17\x13"
+ "\x7c\x35\x48\x3e\xd4\x79\xe7\xbe\x2f\x18\x53\x7d\x8d\x11\xbe\x39"
+ "\x97\xc0\x97\x17\xfc\x8b\x5d\xc8\xb7\x18\xc1\x68\xb6\xe6\x5f\x4c"
+ "\xd9\xf4\xbf\xeb\x5b\x8c\xea\xb6\xd6\xea\x39\xad\x39\xe7\x12\xf8"
+ "\x17\xa3\xfe\xef\x07\x1e\xaa\x63\x5a\xfa\xdc\x4f\x00\xf3\x6d\xa5"
+ "\x48\xab\x70\xf2\x66\x6d\xfe\x31\x5e\x8c\x85\xbe\xd9\x25\x7f\xc8"
+ "\x69\x5d\x16\x2f\xc5\x77\x4a\x5b\x85\xfc\xf3\x89\x8e\xb9\x69\x0f"
+ "\x7b\xb5\x23\xa8\xaf\xd8\xc2\x0c\x92\xa6\x3d\xbe\x1a\xe5\x25\x4d"
+ "\x7b\xdc\x1a\xa6\x69\x8f\xc7\x4a\x9a\x26\x61\x2c\x69\xda\xe3\x3a"
+ "\x49\xd3\x8a\xcf\x0b\x7b\x22\xa2\x69\xf8\x06\xba\xa6\xd1\xb4\xbd"
+ "\x89\xbc\x19\xb4\x63\xd0\x59\xdc\xad\xd1\xb6\x32\x4a\x03\xed\x40"
+ "\x1f\x25\x9d\xda\x9e\xc2\xff\x2b\x89\x49\x7b\x4d\x3c\x67\xc3\x7f"
+ "\x46\xb7\xfa\x8c\xfd\xe4\xc7\x92\xc6\x3d\xbe\x38\x4c\xe3\x8a\x5d"
+ "\xe1\xb2\xa0\x71\x8f\xff\x40\xd2\x38\x99\xbe\xef\x27\xa0\x71\xdb"
+ "\x53\x00\x03\xb5\x7e\x3d\xce\xd1\xd4\xfc\x80\xe3\xd2\x48\x1a\x37"
+ "\x72\x7d\x3d\x5e\xa5\xd1\x38\xd0\x36\x7a\xdf\xef\x61\xb3\x84\x5e"
+ "\x18\xeb\xac\x8a\x60\xae\xad\x3b\xcc\x01\xc6\x8c\xf8\x01\x80\xdb"
+ "\x1d\xa7\xd9\x44\xd5\x6f\x8d\x3a\xee\xc7\x3d\xda\x1d\x4d\x82\xff"
+ "\x37\x7d\x9a\xb1\xb0\x5f\x32\x9a\xeb\x99\xf0\xe7\xe8\x2e\xea\x60"
+ "\xee\x6a\x5e\xd4\x1a\x38\xce\x94\xed\x8f\x9c\xc0\xbc\x92\xbc\x71"
+ "\x0b\x7e\x41\x77\x7a\xd8\x8e\x59\xe9\x3e\xa1\xbf\x3f\x51\xa1\xa7"
+ "\x6f\xf9\x23\xbe\xdd\x8a\x36\xa0\x57\xa4\x67\xe3\x78\x7a\x84\x8b"
+ "\x68\xab\xec\x02\x6d\x1d\x14\x6d\x11\x2f\x45\x72\xcf\xe4\x33\x6c"
+ "\x87\x38\x43\x13\x3e\x99\xc7\xae\xeb\x73\xf5\x7b\xd4\x38\xdf\xcf"
+ "\x5f\xb8\xfc\x2f\x2e\xbf\x70\xf9\x5f\x7c\x17\x34\x08\xf7\xf1\x82"
+ "\xce\x91\xf5\x98\x03\x5a\xbe\x1e\xe4\x5b\xad\x9e\x83\x9c\x70\xcc"
+ "\x12\x72\x99\x55\xab\x13\x78\x57\x4e\xf9\x84\xff\x5a\xa2\x91\x4b"
+ "\x36\x33\xf8\x0e\x8e\x2c\xbb\x37\x0c\xdf\x5f\xa4\x5e\x40\x4f\x63"
+ "\x72\x93\x14\x88\xf8\xf2\x47\x68\x17\xc4\x5d\x9a\xaa\xd0\xd9\xc3"
+ "\x2f\x7c\x44\x2f\x45\xfc\x56\xf5\xde\x6e\x2f\xd1\xb7\x99\xf0\xb1"
+ "\x09\xbe\x52\xbd\x6b\x71\x19\xd1\xe5\x78\xf8\x61\x81\xbe\x3a\x3d"
+ "\x98\xaa\x3f\x22\xfc\xef\x97\x24\x6b\x65\xc7\xd3\xed\xa1\x5d\xb5"
+ "\x4d\x71\x0f\x89\xca\x64\x6a\x65\x50\x37\xee\xde\xd0\x7e\x3c\x53"
+ "\xf8\x37\x0b\xf4\x82\x06\x5e\x46\x3c\x68\xbc\x6c\x27\x83\xa9\xed"
+ "\x54\x7b\xd8\x8e\xcc\x0b\xdd\x73\x1a\x7f\x7c\x25\xc7\x2e\x7e\x7c"
+ "\x4c\x1d\xdf\x13\x71\xdf\x32\xbe\x0b\xb4\xfb\xc4\xb2\x8b\x6f\x37"
+ "\x4e\x6b\xb7\xe4\xe2\xe1\xfa\xc4\xe1\x7f\x1e\xae\xc9\x2a\x5c\x9f"
+ "\xf0\x7e\x0b\x5c\xc7\x68\xe7\xc9\xd9\xff\x7c\x3b\x36\xb5\x9d\x27"
+ "\xd3\xc6\x6a\x87\x89\x7f\xe3\xfa\xeb\x31\x6a\x31\x62\xd4\xb8\xc4"
+ "\x31\x54\x4f\x9d\x87\x95\x84\x62\x0f\xcb\x78\x49\x4f\x36\x78\xd8"
+ "\x13\x55\x23\xef\x71\x3d\xf9\x49\x7a\x1d\xf6\x75\xae\x78\xd8\x93"
+ "\xc7\xa0\x6b\x5b\xb2\x55\xfa\x07\x54\xcb\x10\x3d\x7f\x62\xfa\x85"
+ "\xce\xd3\x44\x2c\x0c\xd5\x77\x07\xee\xa7\xf2\xf2\x04\x4f\x9f\x23"
+ "\x9b\xc9\x58\xd1\x4f\xdd\x80\x7b\x48\xf4\x3c\x91\x9e\xa5\x1e\x0a"
+ "\xf1\x05\xa4\x4f\x8a\x09\x94\xb6\x0d\xf1\x27\xe4\xfd\xbd\xa7\x56"
+ "\x52\x1f\xf2\x85\xae\x49\xf8\xd8\x17\xbe\x5d\x7c\x94\x4f\x8f\xb2"
+ "\xd2\xa7\xc7\x53\xf9\x5a\x1e\x8f\x56\x5f\xc8\xbf\xc5\x53\x77\xc9"
+ "\xbd\xe5\xa9\xa5\x7d\xe3\xc4\x31\x82\x9f\xb3\xfd\x85\xc9\x23\xee"
+ "\x1f\xde\x99\x93\xb3\x3e\x67\x91\x2d\xf7\xd1\x07\xe7\xe5\xe6\xad"
+ "\xce\xdb\x90\x2b\x2e\xaa\x4f\x62\x94\x60\xcb\x5b\xf3\x68\xd6\xfa"
+ "\x0d\x79\x49\x9b\x56\xaf\x91\x17\xdb\xaf\xa1\x8c\x91\x99\xd8\xc8"
+ "\xb8\x91\x44\x83\xda\xb8\x5e\xf8\xa0\x10\xb1\x23\xe1\x8b\x44\xbb"
+ "\xb7\xdb\x64\x15\x31\xb6\x88\x66\x95\x2e\xf6\xb0\xf5\xdd\xda\x3c"
+ "\xc0\x3f\x22\xf1\x2d\xd6\x1e\x56\xfa\x63\xe0\xce\x72\x62\x41\xf7"
+ "\x49\xbf\x12\xc2\x37\x80\x3b\x8f\x12\x5a\x99\xd1\xb5\x11\x7a\xd8"
+ "\xd2\x36\xc5\xf9\x94\x4b\xf8\x7b\xdc\xd2\x83\xf7\x7e\x8d\x4f\xc0"
+ "\xb9\x92\x3c\x07\x9e\x79\x5b\x07\x2b\x9d\x83\x76\xb1\xee\x6a\x9f"
+ "\x91\xb1\xba\xb9\xf3\xa9\x76\xdc\xd5\xa6\x77\x23\xf5\xc1\xa5\xf1"
+ "\xa2\xd4\x5f\x13\x8f\x4d\xa0\x79\x2e\xf5\xbd\x17\xe7\x65\xea\x5d"
+ "\x6f\x63\xad\xbc\xd7\x6d\xa0\xbc\xbd\xa1\xbc\x4e\xca\x5b\x96\xd0"
+ "\x4d\xfb\xe6\x98\x67\xd9\xdc\x1c\x9f\xad\x0c\xa7\x45\x47\x8e\x99"
+ "\xe4\x6a\x9a\xbf\xb2\x5f\xd2\xd8\x13\x34\x5c\x91\x73\x5f\x56\x26"
+ "\x7c\x2f\x97\xc7\x67\x53\xda\x04\xfa\x2d\xea\xa3\x6f\xf0\x81\x40"
+ "\xdf\x32\x70\x46\xd6\x5a\x70\xd6\x75\xc4\xda\x41\xf3\x5e\x66\xf7"
+ "\xb0\x8d\xd3\xe5\xbd\x35\xca\x4f\x6d\xb8\x8b\x86\x58\x93\x8d\xbb"
+ "\xa0\xa3\xf3\xb0\xb2\xc3\x4d\x36\x1f\xe3\x51\xff\x7e\x02\xe5\x68"
+ "\x5d\x59\x1d\xf9\xe0\x45\x28\x5d\xdc\xcf\x2b\xab\xd7\x60\x9e\x67"
+ "\xe3\xa7\x91\x67\x3c\xbd\x32\xf6\xcb\x0a\xb1\x97\x9c\x63\xb0\xc1"
+ "\xea\x64\x65\xc7\x46\xef\x17\x73\x32\x17\xd9\x32\x57\xe7\xd9\xd6"
+ "\xae\x59\x97\x65\xcb\x5c\x93\x69\x5b\xb7\x3e\xcf\xf6\xd3\xf5\x50"
+ "\xf0\x40\xa5\x33\x02\x27\x14\x8c\x6f\x53\x5a\xb4\x76\x86\xdd\xb7"
+ "\x29\x7b\x82\xc4\xe9\x8a\x79\x7d\x83\xd9\x13\x47\xc2\xa4\x62\xb2"
+ "\xdc\x2b\xcb\x33\xa8\xef\x06\x79\xff\x2f\xaa\x9b\xde\x69\xfc\x65"
+ "\xcd\x23\xd7\x6e\xc5\xfd\x6a\xde\x52\x2d\xaf\xc0\x8b\x2b\x7b\x42"
+ "\xdf\x2a\x54\x7c\xdc\x27\xef\x29\x0b\xbf\x37\xfb\x84\x0d\x7f\xb9"
+ "\x6b\xdc\x32\xf0\xf5\xb5\x85\x3d\x74\x86\x95\x1f\xe4\xce\x32\x9f"
+ "\x8a\x43\x46\xa5\x34\x3e\x5f\xc5\x1f\xc2\x89\x0a\xf6\x4d\xfc\xa9"
+ "\x58\x05\xfc\xe1\x83\x69\x46\x61\xef\x11\xf0\x13\x9d\xa3\x77\xda"
+ "\x9f\x3d\xac\x3c\x13\xe3\xf0\x6d\x4a\x33\x3a\x76\x09\xff\x7b\xa7"
+ "\x70\x76\x8a\xf8\x34\x84\x2b\x31\x32\x8e\x66\xc5\x4a\x6d\x8e\xb4"
+ "\xfc\x63\xaf\x61\x81\x2f\x23\x71\x4c\xc2\xf3\x65\x81\x63\xc4\x1f"
+ "\x50\x9f\xf4\x9a\x9f\x3f\xec\x21\xd4\xb7\xa6\xbc\xad\x9c\x53\x1b"
+ "\x8d\x11\x78\x70\x66\x2c\x3c\xa0\xb9\x7d\x68\xed\xfa\x87\x1e\xa1"
+ "\x85\x9e\x93\x95\xf7\x50\x36\x7c\x5b\x80\x0e\x08\xc7\x19\x73\x32"
+ "\x6d\x1b\x72\xb3\x1e\x9a\xc4\xc6\xca\x15\xfa\x18\x39\xff\x71\x0a"
+ "\xe1\x6b\x5f\x5f\x5a\x34\xee\x58\xc8\x3b\x15\x4f\x6f\xed\xcb\x25"
+ "\x59\x64\xc4\xbc\x3f\xfd\x73\xb7\x35\x99\x78\xba\x64\xe1\x3b\x0e"
+ "\x30\x93\x76\x02\x4f\xbf\x01\x38\xf4\xe9\x75\xb4\x9f\x54\xe6\x69"
+ "\x38\x40\xcf\x45\x34\xa6\xec\xb0\x8d\xc6\xd3\x0d\x7d\xfa\xe8\xe3"
+ "\xa0\x3f\xd2\x1e\xa4\x87\xe8\x80\x65\x5f\x07\xab\x14\xb6\x60\xb5"
+ "\x62\x3f\xaa\x6c\xd0\xca\x94\x87\xee\x39\x3f\x3d\x5d\xc3\x93\x88"
+ "\x32\xbf\x44\x9a\xf0\x75\xe4\xac\x68\xc3\x9c\x73\x39\xf7\x06\x2d"
+ "\x1f\xc1\x95\xef\x13\x74\xe4\x69\xe3\x68\xda\xf0\x5e\x1c\xce\xc4"
+ "\x65\x7f\x04\xfe\x99\xe2\x53\x85\xdf\x14\xe2\xf5\x3a\xd8\xd3\x97"
+ "\xaa\xf6\x29\x42\xa7\xe8\xce\xa7\xba\xfc\xb2\x2e\x6a\x6b\x40\x6b"
+ "\x8b\xc7\xc6\xa7\xee\x13\x78\xf6\x74\x76\x58\x67\xf8\x74\x02\x64"
+ "\x65\xde\x97\x36\xc1\xc3\x2a\x57\x0a\xdc\xa2\xe7\xbc\xcb\xa5\x0f"
+ "\x37\xe0\x1b\xc6\x09\xbc\x0a\xe3\xd4\xd3\x07\xb4\xf9\xc6\x98\xa9"
+ "\xdc\x2a\x9b\xf0\xf3\xfb\xb4\x4b\x83\xe5\x78\xbe\x66\xc4\xba\x35"
+ "\x51\x5f\x06\xe5\xda\x15\x72\x9e\xf4\x2f\x84\x7b\x2e\x51\xd4\xc7"
+ "\xfc\x2e\xf6\xcc\x27\xb0\xdd\xb7\xf8\x21\x37\xc5\x8b\x78\x70\x72"
+ "\x2f\x7b\xc6\x46\x38\x9c\x10\xbe\x9b\xfe\x0c\xf1\x7f\x95\x09\x72"
+ "\xee\x9e\x59\x1c\xb1\xf6\xbc\xaa\x3d\xc0\x44\xc0\x08\xf4\xcc\x9d"
+ "\x7f\xa7\x58\xaf\xf2\xde\xef\x33\xd9\x5a\x39\xe1\x67\x80\x70\x03"
+ "\x76\xb0\x67\xd8\x33\x25\xd8\x23\xd0\x3f\x0f\x7b\xc6\x88\xf6\x31"
+ "\x3e\xec\xd9\x02\x6f\xac\x88\x81\xf2\xcc\xfe\x51\x7d\x68\xd0\xea"
+ "\x52\xeb\x6e\xd2\xde\xe1\x77\xcc\xc3\xaa\x52\x11\x07\xf2\x88\x4f"
+ "\x8c\xe1\x92\x26\x92\x0a\x9a\x7c\x22\x5f\xaf\x06\x43\x4a\x2f\xa2"
+ "\x77\x9a\x8b\x52\x26\xcf\x84\x12\xd4\x78\x53\x55\x88\x61\xca\x1d"
+ "\x36\xf8\x25\x5c\x2c\xe9\x8d\xf0\xa5\x23\xbe\xc5\xa8\x6b\x36\x06"
+ "\x77\x84\x84\x5d\x8c\x2f\x20\x68\x83\xf4\xbd\x40\xdf\x69\x8d\x0c"
+ "\x22\xa6\xcb\x70\x76\x8c\xec\xdb\xb3\x19\xa1\x36\x10\x9f\x52\x9c"
+ "\x41\x3e\x9b\x2a\x7d\x99\x4c\x24\x59\xef\xd9\x22\x6d\xfe\x8a\x77"
+ "\x52\x1a\xe2\xa7\xea\x99\xb1\x49\xf8\x0a\x7b\xb6\x46\xeb\xaf\xfa"
+ "\x4d\x2f\xf0\x41\xc0\xe0\xd9\xd0\xfa\xef\x13\xb1\x3e\x9f\x6d\xd6"
+ "\xda\x11\x79\x29\x1f\xf2\x37\xcd\x16\xdf\x3a\x43\xf5\x48\x1f\x2a"
+ "\x46\x11\xef\xb9\x0e\xdf\xaa\x58\x98\x56\x3d\x23\xfc\x15\x0b\xbb"
+ "\x35\x1a\x87\xf7\xb1\xec\x18\x31\x07\x36\x86\xf8\x20\x88\x23\xac"
+ "\x97\xb8\x58\xb5\x40\x2b\x13\xa5\x03\x1c\xab\x96\x68\x6d\x6b\x75"
+ "\xa0\xff\x17\xa4\x79\x72\x2c\x06\xac\x11\x35\x66\xa7\xa0\x17\x92"
+ "\xd7\xaa\x3a\x2a\x70\x50\x8c\xb3\xaa\x2e\x72\xae\x25\x2f\x57\xd5"
+ "\x10\x81\x0f\xe8\x4f\x68\xfe\x69\xee\x7d\x72\x2f\xa9\x6a\x8f\xe8"
+ "\x63\x0a\xbd\x77\x87\xe6\xa1\x5c\xcc\x11\x62\x40\x8d\x19\xef\x51"
+ "\xac\x15\xca\xa3\x70\xd1\x4f\xcc\x07\xc9\x62\x0b\x59\x13\x78\x42"
+ "\x5a\x2b\x04\x13\xea\xe3\x73\x8f\x02\xaf\x06\x9d\xcf\xa5\x8c\xc4"
+ "\xcd\xe7\x52\x23\xfa\xab\x03\x5d\xa7\xb4\x4c\x2d\x8f\x87\x3d\x27"
+ "\xee\x32\x69\xf0\xa4\x6f\x45\xa1\x79\xbc\x51\xe4\xad\xd4\xfa\xf9"
+ "\x2d\x7b\x86\x0a\xab\xe7\x3e\x54\xdb\x68\xd6\xda\xa0\x67\x92\x7f"
+ "\xaa\x56\x8d\xae\xe3\xc1\xcd\x79\x59\xd2\xb9\x11\x36\xf9\xd5\x0f"
+ "\x3d\x92\x95\x39\xd7\xb6\xfa\x61\xb8\x41\xca\x5d\x9b\x95\x65\x17"
+ "\x87\x38\x23\xf9\xc0\x04\xd1\x1e\xc1\x41\xfa\x9c\x7e\xfe\x07\xcf"
+ "\x4a\xfb\x15\xac\x0b\xac\x77\x2f\xd6\xfb\x91\x82\x73\x42\xb6\x71"
+ "\x17\xdd\xc8\xdc\x7e\x5e\x04\xfe\x5f\xd0\x3e\x8c\xdf\xea\x93\xfb"
+ "\x00\xcd\x27\xf6\xc8\x41\xe7\x4e\xfb\x48\x78\xed\x2c\x1a\xb9\x96"
+ "\x77\x56\x8e\x4d\x27\x76\xde\x20\xe8\x44\xa9\xc4\x0b\xd0\x27\xd8"
+ "\xfe\xa3\x5e\x2a\xd3\x34\xaa\xce\x63\x61\x1a\xb5\xd3\xa3\xd1\x28"
+ "\xb9\x4f\x3c\x6f\xa0\x3d\xa8\x52\x6d\x2b\x10\xc6\x9b\xe7\x0b\x24"
+ "\xde\x3c\x4f\xf2\xdf\xcb\xc5\x9a\xac\x23\xf7\x8e\xe7\x3c\xe0\x1f"
+ "\x65\x7c\xed\xe7\x93\xb5\xfa\xaa\xe2\xb1\x6f\x3c\x9f\xf2\x4d\xfe"
+ "\x61\x67\x2f\xf8\x07\xd8\x25\x02\x16\x22\x9e\xb0\x58\x37\xcf\xaf"
+ "\x8d\xa0\x3f\x71\xf4\x5e\x30\xd6\x5c\x3f\x88\xed\x78\x1e\x8e\xdb"
+ "\xe6\x3d\xb4\x2e\xef\x56\xb8\xa8\xca\xca\xb7\x67\x3d\x94\x97\x95"
+ "\x39\xfa\x9c\x2d\x49\xe3\xc5\x70\xc6\x5d\x45\xeb\xde\x1b\x0b\x78"
+ "\x3c\x4f\xe3\xdf\x15\xd0\xc6\x20\xe8\x14\xf1\x8e\x2a\x8d\x33\x75"
+ "\xb1\x5d\x1f\xca\x58\xe2\xcf\x07\x34\x3c\x41\xbe\x3b\xf2\xb9\x32"
+ "\xe8\xac\xa6\xf1\xef\x34\xaa\xf2\x16\xc9\xb4\xd5\x36\xed\x3d\x5c"
+ "\xbe\x3a\x4b\xec\x7d\x3b\x85\x4d\x1f\xc1\xb4\xba\x33\x82\xdf\xc2"
+ "\xfb\x61\xf5\x5d\xf8\x61\x92\x71\xd1\xab\x37\x4b\xf8\x56\xd3\xfc"
+ "\x3f\xa7\xd2\x8a\x5d\xcd\xb2\x1e\xc6\x5e\x2a\xf4\x46\xef\x13\xfa"
+ "\xfd\xea\x4a\xad\x3d\x2a\x7f\x3c\xb2\x4d\xec\x5b\xa3\xeb\xf3\xb0"
+ "\x6a\x71\x3f\x64\xbb\xf0\x21\x57\xdd\x32\x46\x5f\x53\x23\xf3\x51"
+ "\x1e\x92\x7f\x9f\xab\xd1\xc6\xfc\xc3\x7c\xa4\xed\x32\x5c\x60\x8c"
+ "\xbd\x72\x8c\xbb\x8a\x80\x5b\x68\x1f\xf8\xaf\xf6\x21\x53\xf5\x4b"
+ "\xe2\x41\xfc\x46\xf4\x5f\xf8\x47\xb3\x62\x5d\xef\x22\xf9\xf7\xe9"
+ "\x16\x6d\x1c\x18\x63\x43\xa1\xd7\xa0\xf9\xa5\x92\xe5\x77\xdd\x3a"
+ "\xb2\x6f\xbb\x4a\x23\xca\x74\xbb\xae\x84\xee\x7e\xd7\x1c\xee\x7c"
+ "\xbe\x04\x78\x08\x7f\x55\x55\x21\x3c\xdc\xd5\xf8\x4d\xbc\xdb\x35"
+ "\x1b\x78\x17\x89\x4b\x6b\x6e\x7c\x88\x30\x29\x37\x2b\x6f\x91\xe0"
+ "\xee\x89\xb1\x83\xdb\xb3\xd5\x79\x6b\xd6\xaf\xcb\x9d\x6b\xcb\xcd"
+ "\x5c\xad\x2e\xfa\x11\x6b\xde\x29\x64\x7f\x9f\xb6\xce\x06\x9d\xbb"
+ "\x67\x87\x69\xcb\xee\x30\xfe\xc3\x46\xeb\x4a\xe8\x66\x77\x6f\x96"
+ "\xeb\x69\xf7\xb2\x88\xb5\x2b\xca\x63\x8d\xee\x13\x3c\xdb\xee\xc8"
+ "\xfd\xdf\x47\x30\x8d\x39\xc3\x76\x5f\xaa\xc2\xd4\x27\x61\xbc\xfb"
+ "\x5d\x31\x4e\xe1\x8f\x6b\xd7\x31\x8c\x53\xf8\x7f\x11\xfc\xd9\xee"
+ "\x03\xda\x78\xc3\x72\xc3\x6e\x97\xe0\xa3\x54\x7e\xed\xdb\xe4\x7a"
+ "\xc9\x9f\xee\x59\xa5\xea\xde\xda\x35\x19\x4f\xe3\xaf\xa9\x2f\x99"
+ "\x92\x57\xdd\x73\xe9\xf2\x02\x3e\x9c\x9e\x0f\x3f\x75\x98\x83\x3d"
+ "\xb7\x6b\xbc\xa5\xb0\xdf\x2b\x8b\x4f\x1b\x74\xee\x59\x18\x49\x27"
+ "\x78\xd4\x23\xed\x2a\x8f\x98\x26\x65\xd7\x4b\xfe\xd0\x41\x6d\xe1"
+ "\xec\xe1\x02\x7d\xa3\x71\xed\x21\xfa\xf7\x6a\x03\xea\x01\x7f\xcd"
+ "\xfb\xac\x6a\xac\xca\x1a\x71\x86\x57\x4b\x75\x7b\x69\x6e\x29\x1f"
+ "\xf1\x7f\xbb\x05\x6e\x28\x84\xa3\xb0\xdd\xf1\x69\x3c\x12\xdb\xf3"
+ "\x19\xf6\x22\x7a\x26\xbc\xad\x49\x92\x38\x55\x93\xe4\xcd\x4d\x62"
+ "\x7d\x7d\x56\x7d\x5f\x6e\x9a\x01\xfa\x02\xc0\xc2\x5d\xe3\x67\x12"
+ "\x7f\xf6\xf8\x89\xe6\x1d\x88\xac\x4f\xad\x0b\x30\x35\xa0\x1f\x3c"
+ "\xd7\xaa\x07\x7e\x03\x5f\x79\x5f\x12\xf1\x09\x7b\x5c\x3c\x37\x49"
+ "\x3f\x8e\xef\xad\x0b\x8d\xd3\x84\x78\x8f\x88\x01\x0a\x7a\x25\xfd"
+ "\xfb\xef\x7d\xfc\x59\xa9\x1b\x50\xdb\xad\x79\x82\xeb\x5f\x10\xfb"
+ "\x4a\xb9\xd8\x57\x38\x93\xfe\xd2\x6b\x0e\x08\x3b\x5a\xfb\x0b\x22"
+ "\xe6\xab\x7a\x3f\xdb\xdb\x64\x0f\x88\x58\x75\x8e\x3c\xf0\x69\x01"
+ "\x9c\x1b\x89\xfb\xc7\x47\xf2\x02\xec\x87\x7e\xe0\x64\x4d\x3b\x7c"
+ "\xc5\xcb\x58\xe0\x35\x9d\x9a\x7f\x78\xc4\x90\x44\xfc\x53\x1a\x57"
+ "\x54\x38\x7e\xe9\xde\xc3\xd0\xdb\x4a\x79\xdc\xca\xca\x89\xa7\x97"
+ "\x73\xb0\x77\x1e\x62\xf1\x49\x59\xa1\x83\xe6\x25\xea\x2b\xca\x7b"
+ "\xa7\xc0\x9f\x10\x9d\xd8\xfb\x16\x6c\xd3\x3d\x6a\x1d\x83\xce\xbd"
+ "\xb4\xff\xef\xc9\x96\x6d\x51\x7d\x83\xda\x7c\xee\x9d\xf7\x4d\xfd"
+ "\x46\xb8\x3e\x2a\x3f\x57\xe5\x0b\x98\xd4\x7d\xbd\x87\xba\x6a\x34"
+ "\xdd\x57\x98\xf7\xd9\x5b\xaf\xe9\xbe\xa4\xef\xe9\x9a\x3c\xb4\x3f"
+ "\x9e\x8e\x88\x3b\x7e\x0c\xbc\x37\x82\x87\x1b\x97\x9f\xa0\xfd\x1d"
+ "\x7d\xd7\xf8\x42\x39\x3f\xb5\x77\x81\x3f\x44\xcc\x55\x8d\x97\x94"
+ "\x3c\x40\xed\x4a\xb9\x97\xd5\x2e\xd4\xf6\x32\x2a\xdb\xa0\xd2\x0a"
+ "\x75\x9f\xab\x0d\xc9\xbf\x63\xdb\xe5\xd7\xe6\x69\x30\xd2\x60\x2e"
+ "\x61\x54\x7b\xb4\xcf\x3c\xb1\x31\x0c\xdb\xda\xa3\x02\xd6\xa1\xef"
+ "\xfb\xa2\x23\x60\x8f\x77\x83\xa4\x9b\xb5\xb4\xff\xd7\x2c\x90\x7b"
+ "\x8a\x4c\xe3\xe6\x84\x7f\x88\xb8\xed\x02\x06\x6b\x84\x6e\xc6\xeb"
+ "\x48\x42\xdf\xbc\x1e\x5d\xb2\x4d\xd2\xb2\x5a\xca\xbf\xb7\x57\x96"
+ "\xab\xad\x46\x5f\x22\xfb\x7b\xef\xba\x47\xd6\xad\xdf\xb4\x0e\x0a"
+ "\xb5\x0d\xb9\xb6\x87\xd6\x67\x66\x4d\x1a\x43\x1f\x62\x45\x5c\x6b"
+ "\x5f\x55\xc8\xef\xd4\x8b\x46\xd8\xd1\xcb\x98\x05\x2f\xc6\xd8\xae"
+ "\x06\x7e\xed\x7b\x14\xba\x02\x11\x3b\x02\x3e\x56\xa5\xde\xa0\x1b"
+ "\xe5\x25\xac\x5f\xe8\xef\xdb\x94\xad\xf2\x58\x2f\xbc\x06\x38\xaa"
+ "\x32\x07\xa7\x31\x9e\xd2\xf6\x21\xf4\x4f\xf0\xe6\xc3\x49\x82\x2e"
+ "\x2a\xc3\xd9\x06\x01\xaf\xe1\x24\xda\x6f\xf6\x35\x7b\x74\xd7\x07"
+ "\xe4\xb8\xf6\x1d\xd3\xe0\x81\xf1\x0f\x22\xd6\x26\x5f\x43\x38\xfa"
+ "\xa2\x51\xad\x0b\xf4\x13\x75\xd7\x68\x76\xdc\xf0\x25\xea\xda\x08"
+ "\x3f\xc2\x75\x9f\x29\x65\xa0\x37\x75\x56\x8d\x2e\x61\x2f\x52\xa8"
+ "\x9e\x57\x07\xbc\xd1\xb4\x6e\x6e\xa7\xb2\x89\x1d\xec\x85\x4c\x19"
+ "\x6f\xa0\x6e\xc9\xc8\x78\x03\x2f\xd8\xe8\x2f\x53\xfd\x2b\x8e\x78"
+ "\xbe\xd0\x9f\x56\x26\x35\x9c\x56\x57\x37\x2a\x4f\x31\xf5\xe9\x50"
+ "\x88\x5f\x91\xfe\x4c\x55\xff\xc7\x88\x9d\x51\x77\x0a\x3e\x43\xc3"
+ "\xb8\x51\x17\xab\xf2\x20\xdd\x80\x1d\xf6\xdb\x4e\xf6\x82\xf4\x65"
+ "\x52\x4e\xb8\xc1\xd3\x10\xd7\xdb\xcb\x07\xd7\x10\x4e\xbc\x60\x08"
+ "\xe3\x81\x84\x11\xa5\x59\xc3\x7c\x4a\x5d\x2f\xca\x44\xc2\x81\xda"
+ "\xb8\x5d\xca\xa6\x2f\xa4\x68\x7b\x36\xfc\xa5\xca\xf8\x13\x75\x87"
+ "\x1a\x0a\xbb\x49\xe6\x7f\x61\x55\x44\x1d\x87\x54\x5d\x84\x81\xeb"
+ "\xf7\xc5\xed\x13\x32\xdb\x0b\x05\x61\x9d\x40\xdd\x21\xd0\x5d\x51"
+ "\x87\x39\xc1\xeb\xf6\x89\x98\xd1\x3a\x2d\x46\x3c\xe5\x3d\xa0\xf1"
+ "\x28\x5a\x5d\x4d\x52\xe7\x24\x7c\x5c\xd2\x1a\xac\xa4\x3c\x2d\x21"
+ "\x7d\x2c\xa5\x85\x64\xc0\x7c\x5a\xc7\x82\xf7\x7e\xa1\x37\x2c\xeb"
+ "\xed\x13\x7e\x05\x84\x1c\x28\xeb\x31\x7a\xd8\x0b\x9e\xd1\x72\x1b"
+ "\xf1\x0f\xb6\x35\xeb\xd6\x10\xfb\xf0\x53\xfb\xfa\x5b\x49\x74\xf8"
+ "\xa9\x7d\xcd\xad\x30\xf9\xba\x7b\xc9\x5d\xe2\x97\x16\xc7\xad\x63"
+ "\xe8\x8f\xa1\xf7\x16\x71\x99\xa1\x33\x22\x39\x17\xba\xd3\x41\x19"
+ "\x2b\x75\xa2\xfa\x6b\x54\x7f\x27\xd0\xbe\x57\x44\x6b\xa5\x0c\xb1"
+ "\x6f\x08\xfe\x75\x8a\x53\xc6\x79\x55\xf7\x6c\xa2\xe5\x2f\x3e\xae"
+ "\x9d\x97\x09\x1b\x78\xf8\x31\xec\xcb\x16\xfa\xb8\x41\xe7\x8b\x21"
+ "\xfd\x87\xd4\x2f\xca\x33\x37\x4a\x6f\xd7\xd2\x35\x7d\x2c\xa5\xf5"
+ "\x6a\xba\x57\x99\xf7\xc5\x40\xb8\xec\x08\xdd\x76\x82\x76\x1e\x37"
+ "\xe8\x7c\xc9\xa6\xc1\x4c\xab\xc7\x61\xe3\x67\x54\x3e\x29\x4a\xf0"
+ "\xd5\xce\x17\x13\x84\xef\x50\xf0\xe2\x42\xcf\xfc\xd2\x4a\xad\x1d"
+ "\xc8\x08\xe8\xb7\x7a\xf6\x23\xd6\x3d\x7c\x84\x4a\x1f\xa3\x2f\x85"
+ "\xe6\x7f\x14\xcc\x93\x6e\xba\x46\xe8\xe5\x93\x72\x89\x3f\xbb\x66"
+ "\x94\x1e\x0e\x38\x34\xbf\x8a\xc5\x08\x1d\x93\x94\xd3\xa3\xc1\x23"
+ "\xd0\x18\x5e\xa0\xf9\x8c\x02\x2d\x97\xfb\xde\x4b\xc7\x43\x7b\xbc"
+ "\x29\x81\xf0\x6a\x62\x03\xfc\xcc\xcb\x7b\x0b\x2f\x9d\x07\xbe\x79"
+ "\x2f\x7b\x64\x90\xc3\x46\xf9\xf9\x7f\x1f\x94\x7a\xf8\xfd\x37\x87"
+ "\x75\x66\x2f\x95\xa8\x3e\x51\x61\xff\x46\xf3\xb5\x7f\x6e\x88\xe7"
+ "\xa4\xfc\x82\xf7\xa2\x3a\x71\x47\x01\xed\x5f\xc4\x39\x0f\xc9\xfd"
+ "\x8b\x4a\xe4\x3a\xdd\xef\x12\x75\x10\xad\x96\xf7\x00\xf6\x13\xff"
+ "\xff\x52\x8d\xdc\x1b\x50\x77\x1a\xeb\x33\x2f\xb2\xf7\x39\x3f\x9a"
+ "\x0b\x18\xfa\xcc\x2b\xea\xa5\x0f\xe2\xfd\xef\xfa\x9c\x06\x9a\xd3"
+ "\xfd\x34\xff\xbf\xfd\x86\xac\xab\xb5\x35\xbc\x91\x37\x05\x06\x78"
+ "\x63\xf9\x17\x44\xe7\x1e\x66\x2c\xb0\x91\xd7\x0f\x0f\xf0\x06\x11"
+ "\x83\xfc\x41\xc6\xca\xfe\xca\x58\x30\xea\xdf\x4f\x0d\x11\xae\xde"
+ "\xd3\xaf\x9c\x41\xbc\xc0\x7d\x94\xef\x1e\xdf\x59\x5e\x4b\x65\xee"
+ "\xb1\xf3\x33\xb5\x94\xef\xee\xd3\x67\xf8\x5e\xca\x7b\x77\x36\xe1"
+ "\xca\x46\x1e\x08\x46\x3d\x72\xca\xf6\x23\xd0\xee\x5f\x2e\xf1\x96"
+ "\x99\x9b\xb8\x53\x5f\xc1\xb7\x5f\x77\xed\xa0\xf3\x97\xa9\xa1\x38"
+ "\x65\x54\x2f\xf0\x6a\x79\x3e\x9e\x1f\x39\x45\x78\x70\x2a\x9d\xf8"
+ "\x0e\xc2\xdb\x53\x94\x0f\xe7\x3f\xe2\x6e\x96\x37\xea\xda\x78\xfa"
+ "\x4b\x1a\xb3\xff\x03\xbc\x29\xb8\x91\x37\x56\x3c\x40\xfd\xef\xa1"
+ "\xfe\x0f\xf0\x7a\x1a\x43\x43\x79\x17\x63\xe8\x7f\x10\x75\x06\x59"
+ "\x54\xfa\x66\xdd\xe4\x7d\xf4\x3d\x3d\x3f\x8e\xed\xa3\xbc\x0f\xf8"
+ "\xd8\xe4\x5a\xca\xf3\xc0\xcf\x27\x33\xd1\xff\x5e\xea\x77\xac\xb9"
+ "\x29\x48\x6d\xa3\xff\xd4\xbe\x5f\xeb\xa7\xd6\x3e\xfa\xab\xad\xdb"
+ "\x74\xe8\x08\xcd\x13\x45\xbf\xe5\xb9\xc7\xaf\x56\x7b\x73\x69\x9e"
+ "\xa3\xae\xbb\x56\xca\xd8\xbf\x5a\xa8\xf5\x7f\xe4\x39\xd8\xaf\x8a"
+ "\x24\xfd\xfc\x15\xc9\x3f\xfb\xd5\x98\x2e\x32\x0d\xe3\xf7\xd2\xba"
+ "\x55\xef\xfe\x9d\xd2\x60\x46\xdf\xe7\x8e\x3e\xe7\x4a\x5d\x9f\x23"
+ "\x74\xd4\xab\x1f\xca\x5b\xb3\x71\x35\x49\xbe\x93\x98\x1d\x49\x42"
+ "\x36\xce\xca\xb4\xad\x5f\x67\x7b\x78\xf5\x9a\xb5\xeb\x37\x66\xe5"
+ "\xcc\x15\xea\x8c\xdc\xac\x75\x99\x50\x5d\xe7\xac\xce\xb1\x4f\x1a"
+ "\x25\xcf\x94\x9a\x9b\x5a\x11\x83\xa6\x10\xf8\x7d\xf0\x43\x55\x6f"
+ "\xeb\xe7\xce\x14\x21\x17\x4b\x1a\xf3\xeb\x9b\x6d\x5b\x52\xf0\xfd"
+ "\x2d\xb9\x8f\x1f\x6c\xe6\xe5\x13\x83\x9c\x8b\xd8\xda\xba\x33\xec"
+ "\xe0\x1b\x02\x1e\x7d\x4b\xb5\x7a\x84\xec\x0a\x9c\xb5\x6f\x01\x1f"
+ "\xf6\xeb\x55\x1c\xdf\x47\xc0\xe2\x60\x99\xe4\x45\x28\x7d\x78\x29"
+ "\x0b\xdb\xdb\x1f\xfc\x90\xeb\x69\xec\x04\x4b\x55\x66\x28\x51\xef"
+ "\x3d\xfe\x67\x07\x3b\x08\x59\x0a\xe7\x36\x6d\x82\x27\x17\xf7\xb3"
+ "\x0e\xae\x21\x99\xa3\x84\x3b\x27\x98\x00\xaf\x72\x29\xd3\xeb\x2d"
+ "\x3a\xc4\xce\xed\xc0\x5d\xd1\x64\x9c\xef\xee\x73\x2a\xc9\x61\xfb"
+ "\xa6\x5f\x95\x42\xbe\x10\xe7\x1c\x82\x26\xfd\xba\x5b\x5b\xbb\x7a"
+ "\xdc\xbf\xd9\x3e\x75\x91\x5c\x7f\xbf\x3e\x8d\xfc\x34\xff\x8b\xe4"
+ "\xf8\x44\x1c\x70\xe2\x0d\x0e\x46\xd3\xf8\x15\xee\x58\xaa\x9e\x49"
+ "\x1e\x8c\x56\xcc\x3f\xaa\x0f\xe6\x92\x5c\x60\xba\x2f\x99\x97\x1b"
+ "\x13\x95\x72\xe3\x84\x20\xf1\x54\x0a\xc9\x09\xbc\xfc\xbe\x9b\x82"
+ "\xe5\x46\xa6\x6c\x4a\xd2\x63\x6f\x75\xe4\x13\x7c\xd7\x67\x4f\xe2"
+ "\x67\xb3\x2f\x09\x6e\x4a\x82\x9d\xaa\x91\x73\x2a\x6b\x36\x5a\x45"
+ "\xbc\xe2\x72\xe3\x24\xf5\x7d\x2a\xde\x15\xe2\x93\x29\xcd\x46\xef"
+ "\x57\x2a\x3c\x22\xff\xc8\xbc\xb3\xf1\x6e\xd1\x09\xbb\xca\x64\x92"
+ "\x4b\x16\x63\xec\xda\x98\x85\x7c\x06\x1d\x51\x68\x6c\x07\x99\x96"
+ "\x0e\xb9\x41\xf2\xf0\xec\x21\x82\xb1\xf4\x65\x11\xca\x77\xe0\x73"
+ "\x0d\x06\x32\x3e\xf7\x44\xc2\xd9\x83\xcd\x0a\x62\xa3\x6f\x9f\x76"
+ "\x2d\xd7\xff\x6a\x1f\x68\xd6\xf2\xa0\xa0\x85\x4c\x9e\x3b\x1d\x5c"
+ "\xa8\xc1\x13\xf7\x08\x40\x4b\x69\xde\x92\xd2\xbd\x6c\x92\xa4\x03"
+ "\x07\xd3\x22\xe4\xc3\x5e\xcc\xb5\x87\x1d\x50\xfd\x6c\x19\xb7\xcb"
+ "\xf7\x5f\x1f\x90\x6b\xe5\x60\xb1\x96\x97\xd2\xa4\xbf\x9f\x52\xe3"
+ "\xf1\x4d\x01\x36\xd5\xfe\x3d\xde\x45\x73\x94\xa6\xe6\x3b\x14\x5e"
+ "\x53\x12\xdf\xe8\x77\x21\xe4\x6b\x9c\x3f\xe2\xb9\x76\x9c\xbb\xb0"
+ "\x85\x35\x9c\x63\xbf\xc2\xfe\x69\x9b\xca\x58\xab\x0f\xb2\xd5\x6f"
+ "\x8c\x47\x6a\x7c\x4c\xcc\xb3\x79\x62\xb0\x8f\x67\x23\x1e\xe8\x98"
+ "\xb2\x04\xca\x50\xfe\x25\x42\x4e\xa2\x75\xa1\xd0\xba\xa0\x32\x0a"
+ "\xf0\xba\xb0\x1f\xf2\xcb\x6f\x8a\x9b\x0a\xba\xe1\xab\x9f\xf0\xf5"
+ "\x37\xc5\x80\x21\xd6\x41\xb9\x53\xdc\x83\x14\xfb\xa4\x6b\xe3\x02"
+ "\xd4\xf1\x73\xb3\x9f\x19\x5a\x69\x87\xa0\x79\xf1\xdb\x0b\xd9\xe4"
+ "\x1e\xca\x6f\xc8\x63\x46\xc8\xb0\x23\xf7\x90\xb1\xf7\x8f\x3e\x53"
+ "\x7c\x63\x5f\x79\x3c\xf1\x3b\xbf\x39\x4c\xb4\x7f\x5c\xff\x89\xdb"
+ "\x13\x89\xaf\xa1\x7c\x95\x53\x71\x56\xfd\x9b\xee\x0b\xe5\xd5\xee"
+ "\xe6\x02\x57\xe6\x5b\xa1\x4f\x89\x6f\x14\x67\xde\xe6\xf8\x4a\xa9"
+ "\xb7\xfc\x6d\x92\x56\x1e\x7a\x4f\xd8\x15\x54\x0c\x31\x6b\x45\x48"
+ "\x56\xfc\x6d\xaa\x9c\xa3\xdf\xa6\x6a\xf2\xc5\x58\xed\xe4\xed\xe7"
+ "\x8a\x63\x0e\xd3\xbb\x6d\x5e\x76\xbd\x9f\x99\x6a\x77\x33\x56\xb9"
+ "\x85\xfb\x9f\xdd\x42\x78\x44\x30\xe6\xfa\xdf\x34\xc3\xfe\x62\x1f"
+ "\xed\xd1\xe5\x0a\x63\x51\xd4\x97\x67\x07\xa8\xcd\x42\x99\x8f\x4b"
+ "\xbf\x6a\x56\xca\xe7\xa3\xdf\x04\xa2\x23\xac\xaa\x90\x19\xab\x14"
+ "\x66\xa8\x2c\x64\xd3\x29\x8d\xf8\x8a\xdf\x1e\xd3\x64\x81\x31\xcf"
+ "\x85\x6b\x89\x3e\x52\xbb\xdb\x0a\x79\xe0\x3d\x92\xef\x9c\x0a\xf7"
+ "\xff\x33\x70\xf7\xb0\x43\x0b\xe4\x18\x0f\x2d\xd0\x64\x03\x7a\x4e"
+ "\x19\x79\xc7\xfa\x50\xd2\xe8\x33\xe6\x07\xd7\xaf\xcf\x4b\xcf\xc9"
+ "\xc2\x4f\xd2\x9c\x0d\xd7\x8c\xe6\x15\x4d\x32\x1e\xd5\xa1\x34\xac"
+ "\x2d\xf0\x4f\xf2\xae\xd2\xa1\xea\x08\x7d\x0f\x74\xce\xb7\x81\xef"
+ "\x83\xad\x09\x7d\x6b\x78\x57\x5c\x1d\x60\xba\x13\x46\xa6\x1f\xdd"
+ "\xde\xc3\xab\xf3\x56\xaf\x5d\x24\xcd\x1a\xc6\x68\xa7\x79\x64\x3b"
+ "\x2f\x87\xce\x7f\x55\xd9\xdc\x27\xe8\x63\xd9\x7d\x36\x1e\x7b\x8b"
+ "\x4b\xee\x75\x2f\xcf\xd6\x6c\x07\xc7\xf6\xe9\x62\xcc\x0b\x96\x27"
+ "\xa6\x60\x8d\x38\xb6\x32\xfd\xeb\x5b\xda\xf5\x90\x4b\x0a\xe9\x19"
+ "\xb6\x5c\x42\xff\xad\xc6\x8a\x7c\xfb\x5c\x3b\xed\xa5\x2f\xe7\xf3"
+ "\x32\x23\xc9\xc0\x2f\xdb\xc7\xb3\xdf\x8a\xbc\x0f\x2f\xcf\xee\x5f"
+ "\xae\xbc\x80\xad\x97\xc8\xaf\xd9\x69\x8c\x2c\xf7\x4a\xb4\x9c\xb3"
+ "\x97\x09\xff\x7f\x53\xa7\xe1\xaf\x96\xa7\x22\x51\x8b\xc1\xf9\xf2"
+ "\xb8\x7e\x90\x79\x69\xbc\x4b\xe2\xf8\x2b\x77\x8a\x33\xea\xa9\xec"
+ "\x17\x1d\xec\x95\xdb\x0d\x56\x66\xa5\xe7\x5f\xd3\xb3\xd0\x61\xe0"
+ "\xdb\x08\x3c\x9a\xd1\x5b\x67\x20\x8a\x43\x94\x47\xc7\xe5\x3f\x62"
+ "\xfc\xe4\xbf\x28\xfa\xd3\x73\x9d\xb8\xb5\x12\x45\x33\x38\x71\x82"
+ "\x81\x59\xcc\x26\xe3\xcc\x2b\xa6\x5b\x6f\xfb\xde\xe2\x85\x8e\xc2"
+ "\x82\x7c\xae\x04\xfc\x16\x1e\x11\x37\xb5\xf4\x96\xec\x7b\xaf\x29"
+ "\x92\xfc\x43\xd9\x2d\xd9\x63\xf5\xb5\xcc\xc9\xed\x90\x69\x15\xf3"
+ "\x8a\x4a\xc7\x06\xa6\x7f\x75\xc8\xa3\x87\x0c\x05\x1e\xc6\x1d\xf8"
+ "\x92\x64\xf1\x57\x3e\x79\x87\xd2\x08\x5e\xf9\xbc\x74\x45\xa5\xbc"
+ "\x93\xf4\xea\x64\xa5\x7c\x45\x65\xb8\x7e\x03\x43\xfd\x24\xa7\xeb"
+ "\xf7\x17\x76\xeb\xdd\x86\xef\x31\xb7\xcd\xc7\xde\xa1\xe7\x31\xe7"
+ "\x8a\xda\x84\x4e\x18\x75\xd0\x1e\x5c\xe2\x38\x4f\x7b\x73\xbe\x38"
+ "\x9f\xd1\x9f\x61\xaf\xde\x55\x3f\x4e\x39\x71\xc6\x6a\x36\x6f\x1c"
+ "\x74\xbe\x4a\xf4\xff\xc1\xd9\xaa\x1c\x42\x72\xd2\xab\x55\xda\x7e"
+ "\x40\xdf\x37\xc8\x73\xa2\x57\x0f\x68\x79\xc6\x9c\xa3\x27\x61\xeb"
+ "\xcc\x5d\xc0\x03\x3e\xd0\xdd\x0d\xdf\x8b\xe3\xe0\xca\x12\xe2\x51"
+ "\xca\x40\x9b\x63\xb7\xc5\x4d\x30\x6f\x4b\x7e\xb4\x85\x78\xa3\xd8"
+ "\xde\x4b\x99\xd9\x77\x3f\xfa\x0c\x7b\xfb\xb6\xbd\x24\x73\xe2\x7c"
+ "\xd8\xa2\x4b\x5e\x63\xd9\x96\xbc\x3a\xe8\x5c\x7c\x13\x78\x28\x4b"
+ "\xfe\x5d\x3a\x4b\xe0\x76\x5d\xc0\xb9\xe0\xa6\x7d\x32\x56\x91\xaf"
+ "\x32\x91\xb7\x53\x99\xe3\x54\xc6\x43\x7f\x9d\x54\xae\xa5\x8b\xd5"
+ "\xaf\xa1\xdf\x66\x8b\x8e\xef\xb3\xd0\x4c\xce\x2f\x12\xb1\x5b\xb1"
+ "\x3f\xb7\x70\x33\xc9\x76\xc3\x42\x07\x17\x1d\xd6\xc1\xd5\x97\xd2"
+ "\xbc\x4d\x58\xf6\x38\x7f\x87\xea\x6a\x0e\x0e\x28\xcd\xb5\x67\x40"
+ "\x0f\x85\x5c\x75\x8c\x68\xc0\xb1\xb9\x55\xcc\xaa\xda\x4c\xeb\x5b"
+ "\x02\xcd\xd8\x87\xe1\x73\xa0\x89\xda\x3c\x4c\x7f\x8d\xb6\x75\x2c"
+ "\xea\x0c\xab\xff\x52\xb3\xb9\x92\x7c\xdd\xef\xee\x55\xf5\x00\xae"
+ "\xeb\xa9\xfc\xd6\x47\x81\x13\xdd\xfa\x00\xd5\x4f\xb2\x76\xb3\x3b"
+ "\xbb\x59\xd8\xb0\xe1\x4e\x02\xf2\x50\x1b\x49\x6e\x7f\x33\x53\xb8"
+ "\x55\x4f\xef\x8d\xb8\x5f\xc0\x29\x6f\x6b\x7e\x3b\x6b\xb5\xfb\x69"
+ "\xdf\x6c\x21\xd9\x33\x69\x36\xf5\x47\xd4\x47\xdf\x8f\xbd\x4a\xf3"
+ "\x6b\x23\x99\x81\xea\x13\x31\xed\x71\x77\x9f\xe7\x26\x5d\x4d\xe5"
+ "\x9b\xf8\xb0\x55\x8f\xfa\xcf\xb0\xd7\x4e\xf2\xbe\xa4\xa4\xf9\xbd"
+ "\x32\x96\x69\x07\x7b\xed\x30\xf5\xb3\x3c\xa2\x9f\x77\x52\xff\x0d"
+ "\xb4\x57\xba\xa8\xce\xc3\x7c\x23\xb5\xd9\x49\x6d\xfa\xbc\xb0\xff"
+ "\x9c\xcd\x37\x59\x0d\xe8\x73\x2b\xfa\x9b\x1f\x64\x7c\x53\x92\xa1"
+ "\xe2\x1c\x33\xd0\x5a\x70\xed\xa3\x5f\x1a\x7f\x03\xf1\xf5\xd3\x07"
+ "\x9d\xaf\x85\xfc\x3f\x80\x8f\xa4\x77\x8f\x86\x4b\x65\x94\x87\xfa"
+ "\xd8\x48\xfd\x3a\x1c\xdb\xcb\xa0\x5b\x88\x26\x3c\x8d\xa6\x76\x27"
+ "\xd2\x5c\x35\x12\xec\xde\x25\x58\x1f\xc6\x98\x94\x01\xa5\x5b\xa1"
+ "\xfa\x2a\x06\xa8\x4f\xb9\x56\x83\xa9\x13\x71\xde\x07\x39\xc1\xfb"
+ "\xd8\xf2\xfc\x41\x0e\x7b\x71\xd8\x5e\x53\x99\xbd\x34\x56\x83\x87"
+ "\xfd\xae\x00\x72\x7e\x17\x7b\xad\x58\xc6\x62\x7d\xad\x44\x3d\x4b"
+ "\x3e\x26\xf5\xbb\xf5\x5f\x02\xf6\x18\x97\x69\x5b\xdc\x0e\x77\xb7"
+ "\x97\x99\x3a\x2f\x25\x9e\xe5\x35\x56\xa3\x80\x3f\xfd\x5d\x89\xd6"
+ "\xcf\x71\xd6\x98\xdf\x4d\xf4\x45\x19\xe0\xdd\x90\x5f\xa4\x9d\xd9"
+ "\xef\x0e\xa7\xe7\x47\xa5\x90\xac\xa2\xa7\x7e\xe2\x1e\x53\x22\xf1"
+ "\x68\xb7\xc1\x0e\x91\xfa\x47\x7b\xf6\xef\x8e\x5f\x28\x06\x32\xc1"
+ "\x87\xf8\x82\xd7\xa9\x0f\xbf\x13\xfa\x54\xc4\x88\x95\x3a\xd6\xd7"
+ "\x13\x34\x3f\x1c\x7c\x80\x17\x60\xef\xa5\x76\x8b\x8a\x37\x8a\x36"
+ "\x10\x17\xb7\x3b\xcf\xc6\x4f\x34\xd9\xbc\xe3\xfa\x3a\x88\xb0\x9f"
+ "\xf3\xaa\xb1\xf6\x84\x2d\xc1\x48\xfb\xb9\xd7\x0b\x22\xf4\x35\xb0"
+ "\x27\x28\x82\xcd\x84\xf4\x97\xf4\xba\xb0\x09\x5c\x9e\x2f\xfd\xc2"
+ "\xb8\xfd\xbd\xaa\xdc\xf1\xfa\x87\x22\xfe\x16\x78\x5a\x61\x73\xd7"
+ "\xa3\xda\xc9\xbd\xbe\x1a\x6d\x34\x8d\x8a\xf1\x9d\xb5\x6e\xf5\x83"
+ "\x6b\xb3\xa4\x0a\x73\xde\xcf\xf2\x56\xff\x74\xa4\x6c\x64\x10\xb2"
+ "\xb8\xf3\xf5\x63\xf2\x4c\xa0\xc1\x14\x21\x23\x18\x42\x3a\x5d\x3d"
+ "\x6b\x90\x7a\xdd\x86\xb9\x63\xe9\x75\xef\xfa\xe9\xba\xf5\x39\xa2"
+ "\x0d\x61\x52\x98\x25\x6f\x05\x4e\x62\xf7\x2e\xb9\x6b\xc9\xbc\xdc"
+ "\xac\x3c\x11\x54\x47\x2a\x51\x57\x67\x66\xe6\xa8\x06\x87\x6b\x50"
+ "\x0a\x5f\x1e\xde\x24\x8a\xda\x1f\xc9\x93\xa6\x8a\xb9\x6b\x57\x6f"
+ "\xcc\x52\xab\x88\xec\xeb\x74\xd0\xcb\xa6\x1a\xa1\xab\x9a\x24\xed"
+ "\x23\x1a\x0e\x47\x9c\xa7\x46\xea\x6f\x2e\xa7\x6f\xa1\xf3\x7f\xfb"
+ "\x95\xc0\x95\x37\xd6\xb4\xd6\x09\x5f\x26\x86\x23\x2f\x02\xbe\x6f"
+ "\xdc\x89\x38\x10\xb4\xb7\x79\x10\xb7\x58\xb5\x3d\x20\x7a\xfd\xc6"
+ "\x2c\x92\xb5\x3c\x04\xdf\xfc\xe5\xc4\xe5\x12\x4d\x25\x39\xfd\xcd"
+ "\x04\x55\x27\x62\x54\xf4\x0d\x0b\x61\x37\x56\x2b\xf4\x77\x6f\x2c"
+ "\x0e\xeb\xef\xde\x84\x4d\x8f\x91\xe6\xbb\x13\x7d\x43\x3f\xe9\xfb"
+ "\xaa\x08\x9b\x9d\x4e\x0f\x81\x11\xf5\xc0\xb6\x44\xc4\x68\x21\x9e"
+ "\x58\xf5\x07\xa1\x6f\x7d\x11\xfb\xd0\x1f\x8a\x41\x73\x95\xd2\xf8"
+ "\x76\xb9\x66\x7e\xbf\x97\x97\x9b\x37\xcd\xf7\xb1\x04\x49\x33\xde"
+ "\x80\x2c\x3e\x85\xfa\xd8\x44\xe9\xf9\x44\x77\xa2\xc1\x1b\xc9\x33"
+ "\xaa\x37\x4e\xa9\xfa\x3c\xc0\x27\x3a\xa2\x0f\x9e\xb0\xce\xef\xcd"
+ "\x04\x6f\x6c\x7c\x7b\xb1\xb4\xc9\x11\xf6\x07\xd2\x06\xe4\xf7\x86"
+ "\x90\x8e\x8b\xda\x56\xcf\xdc\x13\xba\x28\x3f\xc1\xa2\x5d\x3d\x07"
+ "\xc7\xd8\x53\x31\x6e\x69\x4b\xf9\xfb\x11\xf2\x8f\x8c\x89\x61\xde"
+ "\xa4\x48\x7b\x59\xf4\x3d\x4b\xf0\x51\xd0\x2f\x0e\x01\xde\xbf\xdf"
+ "\x4c\xdf\x69\xaf\xfb\xbd\xdd\xc3\x5e\x0f\xf5\x07\x7d\xce\xcb\x27"
+ "\x66\x80\xca\x61\xef\xa3\x3e\x4d\xa4\x3c\x55\xe1\x3e\xff\x5e\x9c"
+ "\x8d\x42\xa6\x94\x3c\xc8\x1f\x8c\x52\xcf\x1b\xdf\x1d\x31\x6f\x86"
+ "\x33\xec\xf7\xa7\xa8\xaf\x22\x1e\x96\x36\x7e\x89\xb3\xbf\x1f\x31"
+ "\xfe\xb0\x0e\xb6\x61\x9d\xd4\xc1\xfe\x81\x85\xe7\xf0\xf7\x4d\xc0"
+ "\x7b\xd8\x0d\x69\x36\x43\x98\x4f\x19\x2f\xe4\x0f\x49\x5a\x3d\x8a"
+ "\x39\xbe\x19\x72\x72\xb9\x3c\xff\xa6\x79\xf9\xc3\x9a\x28\xdd\x09"
+ "\xc1\x4b\xcd\xf7\xb3\x3a\x4a\x9b\x40\x69\xf7\x23\x1f\xda\x14\xba"
+ "\x4a\x82\x0d\xc6\xa2\x90\x8c\x15\x65\x9d\xb0\x9c\xea\x23\xbc\x3a"
+ "\x74\x2c\x8c\x1b\x7f\x48\x11\xf4\x52\x85\x35\x77\x36\x6c\x0f\xcb"
+ "\xee\x7f\xd8\x1f\xd2\xbb\x51\x3d\xe1\x3d\xe3\x0f\x1f\x02\xc6\x15"
+ "\x21\x1d\x44\x63\x40\xf4\x43\x9e\xa7\xbe\xd7\xc5\x1a\x4f\x73\xe2"
+ "\x2f\xb0\xd7\x42\x3e\xc4\xdc\x0b\x7e\x4f\xe8\xcf\x1a\x7f\x59\x2b"
+ "\xcf\x2c\x76\xd2\xf3\x41\x45\x3f\x16\xee\x34\x4e\x8f\xb4\xef\x95"
+ "\xf0\x6f\xcc\x54\x50\x27\x8d\x1f\x75\xd1\xfe\xa3\xd3\xf4\x9a\x6a"
+ "\xbd\xf7\x52\x9d\xcf\x77\xa9\xb0\x16\x67\x79\xe5\x2a\x1c\x30\xc7"
+ "\x02\xe6\x8d\xc4\xfb\xbe\x2e\x62\xa6\x39\xea\xf8\xe9\xf5\x54\x87"
+ "\x8c\xad\xdb\x58\xc5\x01\x5b\x35\xbf\x17\xf2\x37\xf5\x5d\xde\x89"
+ "\x24\x5c\x24\xd9\x14\xfd\x54\xca\xe3\xdb\xd0\x77\x9c\xe3\x85\x75"
+ "\x2a\x8d\x1f\xa2\xac\xf7\x31\x59\xa6\x42\x9e\x33\xd2\xdc\x34\xea"
+ "\xf8\xa6\x6c\xa6\x9e\x6f\x11\x9e\xff\xbe\x0d\x78\x8f\x7a\x7c\x42"
+ "\x66\x6e\xf4\x28\x04\x17\x9a\x93\xf8\x41\xe7\x9b\x26\x6d\x4e\x68"
+ "\x3e\x9a\x2f\xc0\x6f\xd3\x9c\xbc\xb9\x50\xf3\xad\x84\xbd\x89\xd6"
+ "\x70\x91\xe4\x25\xdf\x3c\x6f\xd9\x76\x1b\xb7\x04\x6e\xba\x09\xbc"
+ "\xd1\x3e\xbd\xd0\x85\x6a\xf6\xab\x33\x09\x4e\x67\xb5\xbb\x00\xca"
+ "\xf6\x7f\x6f\x87\xed\xaf\xdb\x2f\x6d\x7f\x91\x7e\x8f\x8f\x2b\xad"
+ "\xbe\x20\xee\xc2\xb4\x53\x1b\x35\x9a\x9c\x05\xfa\x16\xb5\x4d\x47"
+ "\xb0\x7b\x13\xf7\x1f\x0f\xab\x74\x6d\x62\x0f\x7b\xf3\x73\xb5\xfe"
+ "\xc8\x3e\xac\x94\x67\x8a\x6f\xfa\x25\xef\xff\x26\x68\x4f\x95\x94"
+ "\xd7\xde\xf4\x6a\xfd\xa6\xef\x87\x47\x8f\x31\xf5\x8e\xbb\xb2\x6c"
+ "\x6b\x41\xa2\x93\x6f\xcc\xb7\x25\xcd\xc9\x9c\x2f\x8c\xc5\x6d\xff"
+ "\x72\xc7\x22\x5b\xea\xad\x73\xf2\xb3\xe7\xde\x23\x7f\xee\x48\x5d"
+ "\x86\xdf\x51\xb6\x03\xb6\x41\xe7\x1f\x53\x47\xca\x83\xef\xa8\x7d"
+ "\xf8\x63\xb6\x47\xf7\x2f\x42\x17\xcd\x4d\xc6\x7a\x5e\x32\xe0\xa5"
+ "\x3d\xb5\x17\x7c\xf2\xf2\xe0\xdf\x38\x7f\x62\xc0\xcb\x63\x8d\xf5"
+ "\xde\xd8\x5b\xb2\xe9\x2f\xd9\x1b\x6b\xae\xa9\x20\x1a\x68\xd9\xc6"
+ "\xfd\x96\xc0\x44\x49\x2b\xe9\x9d\x78\x92\x6e\xe2\x7b\x30\x97\xec"
+ "\xce\x6b\x1c\x7c\x79\x90\xbb\x89\xff\x21\xb8\xfc\xb1\x59\xdb\xc7"
+ "\x85\x1e\xb3\xd4\x58\xbf\x3c\x9f\x0f\x03\x77\x88\x3f\x20\x79\x8e"
+ "\xda\x8c\x82\xde\xf5\x8f\x34\xfe\x57\x93\x25\x2c\xfe\x08\x18\xd8"
+ "\x54\xf8\xa6\x0e\x3a\xff\x83\xe6\x7f\xb9\xd0\x3d\x2b\x4e\xab\xd8"
+ "\x2b\x94\xed\xd7\xae\x20\x59\x20\x59\xab\x93\xea\x32\x49\x7b\x26"
+ "\x59\x1f\x8b\xf0\x4d\x70\xa1\x3f\xa5\x3c\xa6\x09\x7a\x2b\xdc\x0b"
+ "\xb6\xe4\xeb\x10\x7f\x2b\x2d\xa4\xab\xa3\x6f\xe6\x6d\x71\xd0\xdf"
+ "\xa5\x99\x7d\xba\x22\xe4\x09\xeb\xb4\x14\x4f\x85\x5e\xf1\x13\x3f"
+ "\x11\x07\xfc\x10\xbc\xaa\xb0\xa7\xf8\x8f\xc6\xd0\xf9\xdc\x88\xb9"
+ "\xff\x0f\x81\x0f\xe7\x9c\x06\xc2\xed\x3f\xa6\x5c\x99\x20\x79\x27"
+ "\xc5\xa9\x63\xd2\x57\xc4\x7f\xbc\x2c\xd6\xa5\x8a\x8f\x04\x5f\x2f"
+ "\xce\xce\x2d\x01\xee\xc5\x3d\x15\x25\x8a\x70\x92\xf5\x30\x77\xc1"
+ "\x60\x11\xee\xab\x87\xf0\xd2\x4e\x78\x69\x27\xbc\x84\x9d\x03\xb5"
+ "\xef\x8d\xba\x36\x83\xd6\xac\xae\x87\xfd\x47\x01\xfa\x0f\xd8\x10"
+ "\xff\x6e\x52\x08\x56\xc2\x9e\x15\xf0\x31\x5f\xb2\x04\xf7\x0c\x31"
+ "\x56\x4b\x80\xc6\x1c\x39\x2e\xbd\xe2\x29\x77\xd2\xb8\xf4\x34\xae"
+ "\xfc\xd3\x42\x17\x84\xfb\x9f\x44\x4b\x12\xc3\x31\x5c\x0e\xd7\x44"
+ "\x8e\x51\x41\xdc\x27\x31\x86\xc3\x6f\x8d\x35\x46\xae\xc7\x18\x01"
+ "\x83\xc3\x4f\xab\xe7\x9c\xa2\x9f\xa0\x5b\xbd\xec\x70\xaa\x79\x5b"
+ "\x11\x43\x3f\x89\xef\xbd\x03\x73\x58\xeb\xe4\x95\xe8\xe7\x58\xf3"
+ "\x85\xfa\x64\x5d\x6f\xad\xb2\x6c\x2b\xca\x18\x74\xbe\x95\x34\x36"
+ "\xbc\xdf\xba\xeb\xc2\xf0\x7e\x6b\x06\xca\xa3\x1f\xb8\x43\x6a\x81"
+ "\x83\x31\xc2\x6f\xe2\x2b\x4a\xc6\x6a\xd7\xbc\xad\x0e\xfd\x1a\xf3"
+ "\x1b\xe1\x7e\x6f\x45\xce\xc8\x35\xa1\xd4\xfa\x19\xe0\x07\x7d\x91"
+ "\xd4\xeb\xbf\xd5\x16\x3a\x7f\x28\x35\xb6\x5b\x74\xb6\x28\xac\x31"
+ "\xc1\x13\xd3\x78\xc7\xaa\xd7\xa2\xab\x84\x8f\xc2\x3b\x88\x56\x8d"
+ "\xf9\x9d\xd6\x81\x8d\x6f\xbf\xee\x4a\xaa\xaf\xc6\xbc\x4d\xc7\xbd"
+ "\x51\xd7\x4d\x32\xfb\x02\xb3\x01\x57\xea\x6b\x3e\xad\xf1\x93\x62"
+ "\xef\x16\xba\x92\xb7\x69\xfd\x7f\x2c\xe2\xee\x78\x63\x8d\x6a\x7c"
+ "\xae\xb7\x33\x3d\xec\x4f\x11\xb1\x50\xdf\xce\xf3\xe8\xbe\x53\x22"
+ "\xd7\xea\xb4\xdd\xb4\xa7\xad\x54\x9c\x16\x6e\xdb\x62\xe1\x54\x57"
+ "\xac\xc2\x93\xf4\xb4\x6f\xad\x0c\xe3\x8e\xbc\xa7\xaa\xe1\x0e\x95"
+ "\x6f\x18\x1b\x2f\xde\xfe\xec\xc2\x78\xf1\xf6\x41\x55\xcf\x9b\x21"
+ "\x6d\x6f\xdf\x0e\x68\x32\x07\xdf\x3e\x6d\xb7\xad\x10\xed\xbf\x5d"
+ "\x29\xdb\x26\x98\x04\x52\x40\x67\x96\x11\xdc\x8a\x06\x9d\xef\x24"
+ "\x69\xb4\x01\x38\x64\x09\x42\x1e\x62\x02\xcf\xe9\xdb\x12\xa2\x3d"
+ "\xea\x19\xa1\x65\x09\x78\x55\xc5\xf9\x47\x03\xed\x5f\x7b\x70\xf7"
+ "\xc4\x17\x1b\x43\x72\xd9\x3b\x44\xff\x0c\x4b\x25\xfd\x8b\x49\xe0"
+ "\xa5\x31\xd6\x2a\xe9\x87\xc2\x28\x62\x06\xd2\x3a\x47\x9c\x40\xac"
+ "\x75\x4a\x4b\xa0\x7e\x23\x66\x20\xc9\x08\xef\xd4\x69\x7b\xbf\xe2"
+ "\x4c\x01\xbc\x85\xce\x58\x0f\x7e\x98\x60\xf7\x9c\x5e\x39\x30\x30"
+ "\xdf\xca\x30\xe6\x81\xed\x53\x0f\xfc\xe2\x7a\x66\xf8\xc0\xfa\x20"
+ "\xb3\xdf\xc8\x12\xb6\xfd\x1f\x03\xfb\xc7\x42\xa6\x07\x1c\x3c\xec"
+ "\x9d\x7a\x09\xbb\x77\xbc\xda\xfc\x78\xd8\xdb\xf0\x01\xc0\x70\x2e"
+ "\xb3\x3c\xc0\xfb\xe4\xb9\x94\x2b\x8e\xf6\x40\xab\xfc\xfe\xc7\x55"
+ "\x63\xec\x0f\x77\xda\xd6\xe4\xda\x32\xd7\x6f\x5a\x37\x6b\xd6\xa4"
+ "\x31\x64\x09\xd7\x6c\x29\x4b\xb8\xd2\x22\x65\x09\x7a\xcf\xa6\xfa"
+ "\x16\x8e\x96\x1d\x96\xa5\xab\xee\x45\xd2\x93\x59\xf8\xf9\x06\xb6"
+ "\xec\x86\x88\xd7\x9b\xd8\xb2\x1b\x6f\x4a\x5f\x91\xb5\x3a\x73\x73"
+ "\x44\xea\xcd\x91\x7a\xc4\x8a\xdd\xd4\x76\xd4\xd4\xef\x13\xfd\xd0"
+ "\xdd\xf3\x18\xf6\x9d\x77\xef\x2e\x0c\xf0\xaf\x08\x77\x17\xc2\xa7"
+ "\xd7\xd1\xbc\x00\x3b\x4a\xf4\x8d\x4f\x03\x5d\x9f\x28\xfd\xda\x06"
+ "\x19\xf4\x74\x16\x1a\xbb\x97\x64\xba\x7e\x79\xf7\xe2\xdd\x9f\xb7"
+ "\x56\xfb\x89\x4e\x98\xf7\x4b\x7e\xe7\xdd\xb9\x94\x3e\x99\x7e\xef"
+ "\x95\x67\x3a\xef\xfe\x98\xe4\xe5\x14\xe1\xc3\x64\x23\x7c\x98\xbc"
+ "\x2b\x6c\xc3\xae\xf7\x15\x31\xe9\x4b\xcf\xd5\x09\x1f\xf7\x1e\xf6"
+ "\x6e\x15\xf8\x0b\xe4\xa5\x32\xf3\x6c\x3f\x63\xc9\xf8\x05\x3f\x4c"
+ "\xdf\xe6\xf2\x32\xf3\x7e\xbe\x27\x0d\x36\x35\xb3\x29\xfd\x69\xf0"
+ "\x6d\x51\x56\xa3\x69\xd0\xf9\x6e\xa5\xc6\x83\xf8\xc6\xb9\xfb\x05"
+ "\x38\x6b\xfb\xa0\x99\xe8\xb7\xd9\x67\xe1\xe9\xf0\x09\xa4\x63\xb3"
+ "\xb1\x3f\x58\xf2\x53\xc5\xdd\x42\xec\x8b\xa0\x09\xb5\x82\x96\xbe"
+ "\xdb\xad\xd1\x85\x72\x29\x8f\x4e\x42\x79\xda\x3f\xcf\xca\xfd\xf3"
+ "\x3d\xa3\xb6\x16\xe8\x39\x41\xc3\xd5\x11\xf7\xcb\xd6\xe5\x65\xe5"
+ "\x64\x65\xda\xe6\xe4\x4e\x62\x11\x11\x58\xb3\xb3\xd6\xd9\x72\xb2"
+ "\x7e\xbe\x21\x2b\x57\x08\x7a\xf8\x3a\xf2\xfc\x8d\x68\x50\x38\x1e"
+ "\xf6\x54\xc0\xf8\xbd\xcd\x90\x85\x2d\xdb\x66\x89\xb3\x14\x79\x06"
+ "\xb6\xe2\x80\x52\x1e\x9b\x22\xf5\x96\x3d\x04\xd7\x23\xd2\x1f\x57"
+ "\xa9\xb9\x0a\x7c\x5c\x17\x3b\x52\x26\x6d\x65\xde\x7b\x5f\x85\x55"
+ "\x15\xf5\xf3\x70\x98\x5f\x6b\x12\x7e\x87\xa4\xcd\xea\x7b\xc7\x3c"
+ "\xcc\xd5\x10\xe6\x41\x9a\x6e\x05\x1d\x14\xf4\xf0\x5b\x68\xa1\xca"
+ "\x3b\x53\x3b\x47\xb6\xf1\x8d\xbc\xb3\x62\x88\x09\x7d\x20\x62\x23"
+ "\x48\xfa\x7a\x24\x59\x83\x23\xf1\x2f\x9d\xd0\x3b\x68\xf2\xd1\xf2"
+ "\xc0\x79\x5e\xb8\x99\xe9\xa1\x7b\x20\x1a\x72\xe0\x95\x1c\xaf\x9e"
+ "\x3b\xdf\xb3\x11\x2f\x53\x85\x3c\xb5\xaa\xed\x26\x8f\x35\x57\x52"
+ "\x3d\xf9\x61\xb9\xa3\x69\xb1\xe0\xe3\x87\x80\x37\x47\xa6\xa7\x63"
+ "\x8f\x90\xb4\xfb\x92\x6f\xeb\x2f\x9f\x24\xcf\x51\x24\x7d\x3b\xd2"
+ "\xa8\x8e\xa1\x17\x34\x4b\xb5\xfd\xd5\x4b\xbc\x6e\x5a\x4c\x38\x57"
+ "\x85\xb9\x20\x3a\x5f\xa2\xc1\x0b\xe3\x45\xdf\xa1\xb7\x26\x3a\x7c"
+ "\xe0\xd5\x2d\x7e\xbd\x8c\x5d\xfa\xde\x5c\x29\x1f\x35\xd9\x22\xcf"
+ "\x0d\xa5\x2c\xd4\xb4\x20\xec\x27\xe4\xbd\xaa\xd1\x34\x62\xfd\x3a"
+ "\x5c\x27\x7b\x24\x7d\xd3\xea\x47\xb2\xd2\x37\xd8\xe7\xda\x36\xac"
+ "\x13\xc7\xb6\x42\x0d\x90\xb7\xe1\xa1\x47\x6c\xa0\x22\xe9\x4b\x96"
+ "\x2d\x4b\xff\xfe\xbd\x3f\xfc\xf1\x24\xf6\xfd\xd5\x94\x96\xb7\xde"
+ "\xb6\x2c\x79\xae\xfc\xb4\xe2\xce\x3b\x7e\x94\x7e\xc7\xf2\x7b\xef"
+ "\x59\x39\x86\x4d\xba\x89\x70\xa2\x92\xe6\x28\xba\x83\x7d\x50\x2a"
+ "\x6d\x90\x9a\x9a\x47\xda\x20\x35\x79\xe8\x8f\xa8\xf3\xfb\x56\xc6"
+ "\x3e\xa0\xd4\x0f\x4a\xe9\xaf\x48\xe2\x4d\x4c\x1c\xf5\xdf\x17\xc6"
+ "\x9b\x0f\xc4\x79\x1b\x74\x07\x52\xf7\xfa\x3e\xd1\xbf\xf7\x96\x45"
+ "\x7e\x0b\xd3\x82\xf7\x83\x82\x5e\xaa\x78\x01\x7c\x48\x0f\x18\x05"
+ "\x6e\x48\x7e\xe5\xfd\x65\x1a\x6e\x54\xc8\xf3\x21\x06\x9d\x19\xbe"
+ "\x13\x7e\x57\x41\xbf\x4c\xb8\x50\x89\xb3\x75\xa4\xf3\xd8\x15\x55"
+ "\x6a\xbd\xc5\xd0\x37\x83\x9f\x55\xcf\xc4\xcc\x3d\xec\xfd\x77\xb9"
+ "\xb3\x69\xa9\x94\x05\x9b\x36\x0b\xbc\xd9\x3e\xf5\xfb\xe2\x0c\x52"
+ "\xdc\x27\x7a\xbf\x31\x8c\x3f\x1f\x94\x62\x6e\x40\x17\x24\xed\x7d"
+ "\xff\xd8\x28\x3d\x4e\x14\xa5\x75\x6b\x7e\xe6\xf3\x66\x31\xbd\x61"
+ "\x56\x25\xab\xd2\xf3\x22\x0f\x7b\xbf\x5a\xda\xa1\x7e\x60\xd4\xf8"
+ "\x67\x7a\x4e\xf0\x30\xde\x3e\x5a\xff\x55\x1e\xa1\xff\x2a\xb4\xf3"
+ "\x13\xad\x76\x2f\x78\x64\x97\xdb\x2b\xfc\x9b\xde\xd6\x6a\xf7\xc1"
+ "\xb6\x64\x52\x17\xfb\xe0\x7e\x47\x90\x0f\xd1\xf3\x54\x1a\x9b\xd8"
+ "\x43\xe6\x4b\x9d\x02\xc9\x63\x1f\x94\x49\xd9\x44\xa6\x03\xee\xf4"
+ "\x8c\x3e\x1a\x30\x3f\x84\x97\xdd\x34\x47\xcb\xc7\xa2\x7b\xe6\x6d"
+ "\x7a\xd5\x8f\xd4\x07\x27\x20\xa3\x02\x56\xcf\xea\x95\xec\x67\x9d"
+ "\xf4\x47\xbf\xa0\x7d\x61\xfe\x92\xfb\x25\x6c\x3f\xf0\x34\xe5\xf7"
+ "\x62\xdf\xf4\x8f\x47\x4b\x69\x3e\x8f\x6b\xf3\xb9\x3c\xe8\xbd\x0d"
+ "\xf3\x35\xe8\xfc\x4f\xab\x36\x97\x7d\x57\xbf\xee\x89\xda\xc6\x6c"
+ "\x47\x6a\x6e\x44\x3a\xad\xff\x0f\xaa\x85\x6d\x0f\xd6\xd7\xa8\xb2"
+ "\x44\x87\x53\xd4\xf2\x69\x5a\xf9\xd1\xfe\x89\xc5\x05\x5d\x28\xb9"
+ "\x16\x49\x1b\x1f\x35\x9c\xf4\x08\x1b\x1f\x9c\x01\x36\x49\x9c\xd4"
+ "\x74\x70\x71\x72\x3c\xcd\x3f\x50\xca\x49\xfe\x2e\x8f\x7e\x52\xd5"
+ "\x03\xd0\xda\xfe\xcf\xfe\xeb\x19\x5b\xeb\xdb\x94\x16\xd2\xa1\x40"
+ "\xf7\x01\x9f\x83\xd4\x0f\x4f\x84\x8e\x2c\x64\xa3\xe9\x61\xcd\xa9"
+ "\xb0\x19\xc3\x9d\x65\xd4\x83\x75\x25\xf5\x36\xcd\x71\x6e\xa2\xbc"
+ "\x54\xdf\x3a\x71\xfe\xed\xfc\xcf\x6c\x81\x7b\x24\x6b\x0b\x39\xbf"
+ "\x80\x7f\xa5\xda\x30\x09\xde\x45\xde\xc7\x6b\x5e\x12\xd2\x05\x89"
+ "\xbb\x69\xff\x29\xec\xb2\x29\x7d\xd5\x58\xfa\x42\xa2\x0f\xd9\xab"
+ "\xd7\x65\xae\x7f\xf8\xe1\x6f\x27\x0d\x91\x67\x5c\x95\x4e\xa5\x84"
+ "\xea\x24\xf9\xf7\xd5\x6c\x89\xa7\xcd\x44\xff\x5f\x4c\x91\xfc\xdb"
+ "\xbf\x9f\xa2\x75\x33\xa3\x87\x7d\x68\xd5\xf8\x77\xb9\x8e\x3e\x9c"
+ "\xcd\x9d\xcd\xd9\xe1\xb5\xd1\xec\xfd\xe6\xda\xf8\xd0\x30\xf6\xda"
+ "\xf8\x30\x89\xf6\xd9\xe3\xf4\x7d\x36\xb5\x79\x5c\xd0\x7c\xcc\xb7"
+ "\xe4\xc1\x5d\x96\xc0\x6d\x82\x07\x4f\xdf\xcc\x74\xe0\xbf\xa1\x9b"
+ "\xc6\x7e\x10\x24\xb9\x36\x48\x34\x22\x3d\xc0\xe2\xb0\x17\x54\xac"
+ "\x83\xde\x71\x26\x0f\x0c\x70\x4f\xfa\x66\xa2\x17\xf4\x5e\xde\x23"
+ "\xcf\xe0\x1f\xe8\x27\x39\x84\x9e\x2b\xba\x40\x2b\x14\x04\x43\x60"
+ "\x72\xbf\xfe\xb0\x5a\xe3\x71\x2d\xdb\x6c\xc2\x47\x36\xf6\xed\xa0"
+ "\xb4\x67\xaa\xc7\xde\x4d\xed\x34\x08\x1a\x14\xb4\xe0\x0c\x80\x55"
+ "\xfc\x8c\xea\x85\x5d\xd0\x3a\xf4\x2f\xea\x26\x4b\x20\x59\x9c\x15"
+ "\xec\xfb\x99\xb0\x07\xba\x49\xda\x03\xdd\xc4\x6a\xd7\x01\x0e\x1f"
+ "\xfa\x2f\xa8\x1b\x8f\xbd\x25\x35\x32\x3d\xff\xe1\x35\xe9\xf6\xec"
+ "\xcd\xe9\xb0\x05\x1c\xb5\xbf\xcb\x35\xe4\xfc\x68\xba\x84\xef\x47"
+ "\xa9\x61\x5d\x95\xb4\xe1\x03\xcd\x9c\xef\x17\x3e\x6c\xd5\xb3\x9e"
+ "\x8f\x17\x00\xf6\x8e\xf3\x78\x37\x12\xce\x7d\x3c\x0f\x67\x3f\x7d"
+ "\xb0\x9d\xd9\x97\xc6\x2a\x9d\x1c\xe7\x8d\xc4\x6b\x7d\x7c\xa9\x76"
+ "\xa7\xbe\x8f\xd2\x69\xed\x23\x2d\x46\x9c\x35\xe6\x09\xdd\x1c\xc1"
+ "\xe9\x23\x97\x87\x59\x54\x5b\xd7\xe8\xa7\x60\x9f\x27\x6c\xca\x05"
+ "\x9f\xf1\xd1\x69\x79\x47\xeb\xa3\x4e\x0d\x96\xc4\xfb\x2e\xc4\xbd"
+ "\x7e\xd8\xe9\xf4\x71\xd8\x04\x7e\xcc\xb4\xf2\x1e\xf6\x91\xb8\x63"
+ "\x7a\x8f\x4f\x3c\x1f\x7a\xc0\x17\x79\x27\xff\xa3\x6a\x49\xb7\x3e"
+ "\xaa\xa1\x74\xa2\x95\x1f\x15\x51\x9f\xcd\xd2\x47\x80\xa8\x67\xa9"
+ "\x66\x0f\x15\x09\xb7\x3b\x56\xdb\x89\x59\x5e\xf3\xf0\xc3\x59\x39"
+ "\xb9\x5a\x4c\xf9\xa4\xf5\x6b\x33\x6f\x55\xef\xe0\xaf\xcb\xda\x94"
+ "\xbe\x26\x53\xdc\xf1\xa1\x54\xf9\x38\x0a\xbe\x73\x21\xdf\x08\xbb"
+ "\x79\x31\xa6\xb6\x39\xb5\x2a\x1f\xd5\xc1\x5a\x1a\xa4\xbd\x45\xcb"
+ "\xa3\x72\x6f\xbb\xe4\x25\xea\x47\x9b\xb6\xb7\x41\xc7\xd2\xc7\xbe"
+ "\x6b\xc3\x99\x19\xfc\x32\xe0\x6c\x0e\x7a\x16\xca\x43\x6b\xf4\xa3"
+ "\xd0\x9d\xe9\x32\x4a\xc7\x99\xb0\x6b\x1d\xce\x81\xdb\xee\x54\xca"
+ "\x8c\xa5\x7c\x52\xff\x42\xa2\x6b\x26\xcc\x1d\xce\x8a\x64\x0c\x8f"
+ "\x96\x14\xd0\x6b\xe8\x02\x5d\xeb\x60\x4f\xdb\x12\x47\xfc\x09\xed"
+ "\x97\x6d\x4b\x49\xd6\x2b\x2d\xde\xc2\x8c\x68\x83\xf6\x42\x8f\xd4"
+ "\x2b\xb7\xac\x7a\xb7\x80\x31\x75\x3f\xf4\x94\x09\x3d\x67\x4b\x92"
+ "\xdc\x53\x8d\x75\xaa\x1e\xa5\x8e\xf2\x15\x7b\xd8\x55\x5e\xd9\xe7"
+ "\xfe\x0c\x81\x27\x82\xd6\xb5\x1c\xe0\x4f\xf6\x8b\x3b\x02\xf4\x9b"
+ "\xa1\xf0\xec\x28\xbc\xd3\x5e\x33\x89\xe6\xb1\x8d\x3b\x92\x98\x6a"
+ "\x27\x1d\xd5\xc5\x8e\xde\x00\x3d\x30\xe1\x87\x0b\xb0\xa0\xfa\x0f"
+ "\xa9\xf5\x1f\xa2\xfa\xa9\xdd\x9b\xd4\xf8\xb9\x2d\x5e\xad\x2d\x5a"
+ "\xaf\x5e\xda\x8f\x4b\xb1\x27\x53\xff\x8b\xe9\xaf\x44\xea\x9c\xfc"
+ "\x24\xfb\xcd\x0c\xe9\x9c\x24\xdf\x77\x34\x49\x5b\x2f\x68\x5b\x1d"
+ "\xc3\x01\xc5\x29\xfc\xb7\xea\xd4\xb6\x0e\x40\xff\xa1\xd5\xc9\xa9"
+ "\x4e\x3e\xd0\x5b\x47\xfb\xa7\x91\xe8\x86\xd7\xbc\x8d\xf6\x49\xb4"
+ "\x01\xbe\xdd\x37\x93\xd3\x3e\x1a\x4c\x0f\x1a\xa4\x0f\x8d\xcd\x2c"
+ "\x36\x92\x67\xa7\xf6\xaa\xc3\x7c\x26\xd5\x31\x40\xf4\xb9\x90\x15"
+ "\x75\xb2\xa3\xaf\xa1\x6d\xd8\x39\x61\x5e\x87\x68\x9e\x68\xae\x52"
+ "\xa8\x9d\x7a\x92\x35\x62\x09\x0e\x9f\x61\xbe\x60\x3b\x52\x3b\x24"
+ "\xe4\x0f\x0b\xf5\xcd\xd0\xc1\x8e\xbe\x8b\xb9\x42\x5d\x84\x17\x71"
+ "\x81\xc1\xb4\x7f\x85\x0f\x3b\xc0\x7a\x6b\x01\xef\xc6\xf9\x65\x17"
+ "\x73\xdf\x09\xbe\x9c\x64\x15\xf1\xec\xc8\xe4\x8a\x98\x6b\x61\x3b"
+ "\xed\xbe\x73\x6b\x37\x57\xce\x3b\x19\x6f\xa6\xfd\xe1\xbc\x9e\x05"
+ "\xfc\x24\x57\x53\xbf\xf5\x8e\xd3\xf0\xb3\x57\x47\xb4\xa6\x04\x36"
+ "\x2b\xc6\xf2\x2d\x2c\x0e\x3e\x0a\x1d\x76\xee\x6f\xf5\xd5\xb0\x56"
+ "\x7b\x0d\xfb\x28\x50\xc5\x5c\x1b\xa1\xa7\x75\xf7\x7e\x9c\x5f\x85"
+ "\xbb\x2a\x31\xf4\xfc\xb2\xed\x47\x68\xab\xb5\xf8\xe3\x63\x9f\xd2"
+ "\xcc\x7d\xca\x6c\x3f\x11\xef\x55\x2d\x69\x1f\x11\xb6\x7d\xc4\x1c"
+ "\x9d\x5c\x01\x8f\x57\xf8\x28\xda\x28\xa1\xba\xea\xe0\xcf\x2f\x4e"
+ "\xe9\xb3\x4e\xa2\xf1\x1b\x96\xe7\x33\x71\x46\xea\x5a\xf7\x47\xf4"
+ "\xf1\xd2\xda\x73\xcc\xe8\x5a\xf7\x9e\x78\x16\x3a\x13\x1a\xaf\x3b"
+ "\xb3\x5d\xd8\x60\xc2\x97\xa1\x3b\xbf\x1b\x77\xbe\x95\x0a\xf4\x31"
+ "\x28\xfb\x4d\xf0\x32\x68\xe5\xf7\x15\x6a\xe5\x5b\x05\x2d\xd8\x0b"
+ "\x78\x50\x9f\x8e\xae\x94\x30\x69\xa1\x54\xd9\x67\x82\x4f\x5a\x24"
+ "\x7c\x5a\x17\x00\x3e\xb0\x49\x57\x36\xf6\xd6\x51\xdf\x52\x08\x06"
+ "\x8a\xd6\x06\x70\x00\x67\x79\xa8\xbf\xfc\x1c\x33\xb9\xd6\xc1\x66"
+ "\xdd\xbd\xcb\x92\x6a\x30\x2a\x03\xa7\xeb\x2b\xfa\x99\x01\xf3\x06"
+ "\xde\xa1\x42\x7c\x17\x30\x2f\xc0\x9c\x79\x63\xa3\xf3\xe9\xaf\x80"
+ "\xfe\x8a\x80\x7b\xf4\x5b\x4c\xf3\x55\x42\x7d\x48\xa0\xb9\xaa\xc3"
+ "\xaf\xc0\xc7\x92\x81\x7a\xf8\x78\xc5\xfe\x4c\xb8\x12\x4e\x7f\x72"
+ "\xe0\xd5\x00\xad\x1d\x45\xc8\x9e\xee\x04\xa5\x2c\xde\x25\xed\x97"
+ "\x3f\x5e\xb9\x97\x78\xfd\x9a\x67\x84\x8f\x0c\x13\xc9\x27\xd0\x39"
+ "\xb0\xdd\xe2\x2e\x5d\x9b\x55\xa3\xe3\x4f\x26\xc2\xff\x84\x7b\x89"
+ "\x5e\xd8\x52\x1a\xf7\xab\xb8\xbe\x9f\xf2\x2c\xf6\xb0\xeb\xb3\xe5"
+ "\x9a\x68\x11\x77\x00\x41\x07\xc6\xe3\xb3\x68\xef\x6a\x81\x0d\x2b"
+ "\x9f\x96\xc6\x4c\x3a\xee\x35\x65\x58\xb8\x3b\xd0\x04\x1c\x32\x09"
+ "\xdc\x97\xdf\x88\x37\xf6\x5a\x68\x6f\x6b\xa3\x74\x83\x96\x8e\x3d"
+ "\x54\x21\x79\x19\xb2\xfa\xf2\xcd\x16\x5e\xd8\xcf\xa6\x0b\xbd\x97"
+ "\x96\xbe\xd9\x6b\x69\xa5\x9d\xbf\x90\x68\x37\x7c\xeb\xa0\x0c\xa5"
+ "\x47\xd1\x5e\x79\x98\xda\x75\x51\xfe\x04\x2d\x3f\xef\x4b\x33\xb8"
+ "\xf3\x9b\xc4\x3a\x83\xff\x35\xb1\x47\xca\xf4\xe8\xe5\xf9\x5e\x8b"
+ "\x98\x33\x2d\x2d\x37\x4d\xec\xcd\xf0\xc3\x41\xbc\x37\x17\xfd\xe9"
+ "\x12\xe9\x3a\x92\x9d\x91\x1e\x17\x91\xa6\x87\xcf\x13\xf8\xd3\x8c"
+ "\x48\x8b\xa2\x3e\xb3\xd0\x3b\xb5\x8d\x7d\x1a\xeb\x6e\xf9\x66\x9c"
+ "\x01\xca\xfd\x59\xb4\xbd\x99\x33\xe9\xa3\x57\xa6\x49\x3e\xe0\x93"
+ "\xba\x48\xb9\x1d\xe7\x2e\x68\x5b\xe9\x4b\xd3\x07\xfb\xd2\xa2\xd0"
+ "\x3e\xea\x82\xce\x95\xc6\x48\xed\x76\x33\xf8\x87\xe7\x65\x3f\xaa"
+ "\xe7\xb8\xf7\x45\xf5\x8a\xfe\xe4\xfb\x89\xf6\xdc\x97\x3c\xb6\x7d"
+ "\x4f\x4a\xb6\xab\xf0\x27\x84\xd3\x9f\x1e\x00\x4d\x09\x9a\x62\x1a"
+ "\x6c\x3f\xc3\x3e\xfd\xe9\x2c\xcc\x69\x90\xd6\x79\x30\x36\xa6\x61"
+ "\x7e\x37\xd3\x15\xd2\xda\x91\x67\x93\x9f\xde\x0e\x3e\xd1\xa1\x70"
+ "\x4e\xcf\x0b\x80\xbb\x96\x5e\xd8\xe5\xc4\x34\x0a\x5b\x18\xf3\xe2"
+ "\x0c\xb7\xbf\x9b\xb5\x14\x7d\xc1\x5a\x02\xee\xa2\xc3\xe7\xbc\x06"
+ "\x69\x13\x63\x40\xbd\xf7\xe2\x9b\x83\xd6\x4b\x7a\xb0\x6e\x7c\xd9"
+ "\x96\xe4\x25\x82\xdd\xdf\xe4\x5e\xf0\xe9\x01\x4d\x46\xba\xf0\x18"
+ "\xfe\x24\x7c\xa2\xc2\x5e\x54\x29\x9f\x0a\x9d\xab\x83\x0f\x26\xb1"
+ "\xf9\x5b\xa0\xab\xfe\xb4\xdd\xec\x63\x29\x6a\xbd\x67\x65\xbd\x7f"
+ "\x62\x17\xaa\x17\x78\xdb\x52\x2d\xed\x50\x14\xf3\xd4\xd4\x20\xd5"
+ "\x1d\x34\x4f\xad\xa4\xbd\xc6\x41\xfc\x0b\xf1\x23\xc7\xee\xa4\x76"
+ "\x52\x5b\x03\x6d\x0c\x7e\x95\x6b\x15\xda\xaf\xcf\x5a\x99\x6a\xff"
+ "\xe3\x38\xc3\xfe\x74\x83\xc2\x93\xe2\x48\x76\x13\x7d\x01\x9d\x85"
+ "\x3e\xbd\x30\xc8\x26\xb8\xf3\x48\xca\x8a\x4d\xc9\xa6\x3a\xbe\xfb"
+ "\x3e\x74\xed\x44\xab\x82\xdc\xaa\x7f\x6b\xc0\xc3\x2a\x88\x7e\x0b"
+ "\xff\xa0\xdb\xa7\xed\x36\x6f\x63\xb7\x71\xbd\x45\xd8\x8f\x29\x65"
+ "\x8b\xb2\x69\x6e\x25\x8c\xcb\x8d\x0d\x11\xb6\x46\x51\xd4\xd6\x1b"
+ "\xb0\x35\xe2\x26\x63\x7e\x0d\xf6\x4c\x9a\xb3\x41\xe7\x9f\x88\xff"
+ "\xff\x44\xec\x77\xa5\xe0\x8b\x04\x9d\x3f\x76\xb7\x37\x36\x31\x19"
+ "\x75\xc0\x4f\x99\xb2\x31\x50\x5f\xf1\x35\x33\x48\x78\x1c\x9b\xd7"
+ "\xda\x3b\xe8\xe2\xa5\x89\xc9\x58\x47\x6a\xdd\x16\xaa\x3b\xc8\xcb"
+ "\x12\x49\xf6\x39\xb6\x4c\xce\x8d\x78\xb6\xe2\x7b\x60\x18\x77\x03"
+ "\xff\x54\x55\x33\x04\xbe\xe8\x4f\x29\xc4\xeb\xba\xfa\x4c\x89\xc9"
+ "\x3f\xb4\x16\x11\x0f\x70\x2c\xc3\xa3\x53\xc4\x1d\x36\xcd\xd7\xe9"
+ "\x78\xe7\x6a\x7c\x8f\x75\x92\x9b\x2a\x21\xbe\x3d\xa1\x87\xfd\xf9"
+ "\x93\x21\x27\xd3\x0f\xd3\xde\x3a\x44\xb2\x0f\xdf\x93\x66\x2a\x9f"
+ "\xca\x92\xe9\xdb\xd4\x1e\x76\xec\x8d\x80\x9e\x25\xd0\x5f\x9c\x77"
+ "\x5a\x76\x0c\xd5\x9b\x02\x9d\xee\xd1\x73\x38\x67\xfe\x4c\xfa\xe5"
+ "\xd8\xcd\x66\x2b\x54\x1f\x74\xc9\x15\x53\xd9\x6c\xe8\x91\x29\x2d"
+ "\x29\x3d\x28\xcf\x59\x34\x39\x71\xfb\x54\x36\x77\x64\xbb\xc7\x6a"
+ "\x24\x9f\xf7\x67\xb1\xc7\x6f\xf2\xb2\x2b\xec\xdf\xe3\x1d\x54\x6f"
+ "\x25\x77\x46\x71\x3e\xcd\xaa\x97\xfc\xe0\x67\x9b\x2d\xd5\x12\xef"
+ "\xc4\xb9\x02\xe1\x1b\xce\x6d\x54\x7d\xb5\x4e\xf8\x78\x35\x9b\x97"
+ "\xe0\x6e\x96\x48\xd3\xc5\x01\x96\x71\xa2\x1f\xaa\x5f\xc6\xe0\xf6"
+ "\x6b\x33\x50\x07\xfa\x93\xbe\x5a\xea\xba\xe1\xb3\x91\xe0\x2a\xec"
+ "\x84\x4b\x77\x33\xd3\x53\xbb\x59\xdc\xd1\x87\xc5\xb8\x0e\xc8\xb5"
+ "\x68\x60\xe8\xaf\x52\x8a\x75\x46\x38\x41\xfd\x46\x7b\xc0\x8d\xd6"
+ "\xc0\x59\x97\x23\x8f\x2b\xae\x9f\xc1\x3f\xc9\x67\xa7\x5c\x39\x87"
+ "\xd8\xf2\xce\x80\xf4\x33\xb6\x8a\x79\xf7\x51\x7d\xfb\xa6\xb2\x38"
+ "\xaa\xab\xdf\xbd\x16\xb4\xd6\x7a\xa5\x2b\xa7\x81\xea\xfe\x73\x0c"
+ "\xf6\xa3\x32\x82\x8f\xdc\x97\xfe\x7c\xd8\xed\x6f\x67\x88\x71\x71"
+ "\x8f\x9d\x07\x51\x0f\xe5\xb9\x5d\x8c\x77\x8f\xd5\x96\x2e\xfd\x6a"
+ "\x8a\xb1\x86\xce\x10\xd4\x71\xb8\xcf\x89\xfa\x56\xba\x33\x88\xe7"
+ "\x54\xc7\xa4\xc1\x5a\xe2\xd7\x9f\x9f\x76\xe5\xec\x67\x98\x1f\xe4"
+ "\xa7\xf7\x22\x77\x2f\xe5\x3d\x3d\x72\x5e\x90\x87\xbe\xbd\x46\xf5"
+ "\xfe\xdf\xf0\xd9\x18\xce\x6c\xc2\x79\x6a\x68\x3c\x04\x2b\xdf\x1e"
+ "\x82\x91\xd4\x19\xfe\x79\x06\xfa\x4a\x73\x37\xdd\x9d\xf7\xc5\xd8"
+ "\x77\x22\x69\xed\x13\xde\x6f\x6b\x15\xfa\xb2\xbf\xc4\xde\x13\x50"
+ "\xb8\xa4\x67\x7f\x71\x11\xef\x96\xed\xa1\x5f\xd0\x02\x41\x4f\xae"
+ "\xc7\x79\xf6\x5f\xde\xb5\xe8\xe4\xfc\x62\x2c\xe0\x99\xc6\x9a\xe3"
+ "\x88\xb3\x8a\x38\xf4\x55\x9b\x63\x6e\x4a\xc9\x56\x70\x06\x05\xdb"
+ "\xde\x61\x2b\x93\xf8\xc7\x2b\xa9\xde\xd7\x54\x1e\xd2\xaf\xee\xa7"
+ "\xfe\xbe\xd8\x18\x17\x7f\xcc\xca\x34\x3b\x44\x5a\xbf\x87\xd3\xa5"
+ "\xed\xa8\x15\x34\x6a\x9f\x5e\xae\x1d\xf4\x51\x2d\xeb\x93\x67\xe3"
+ "\x7f\x29\xa2\xf2\x63\xda\x7d\xf3\xa8\xa9\xf0\x3f\xe5\x80\x0f\x51"
+ "\x71\x57\x89\x68\x15\xed\x07\x13\xdc\xbe\x21\x26\xcf\xeb\xdb\x6f"
+ "\x25\x1e\x7f\x02\xee\xa9\x6a\x7d\xbb\xb8\x73\x85\x76\xf5\xbe\x5c"
+ "\xfb\x52\x4d\x86\xe6\x26\x82\xb1\xd3\x22\xe2\x1d\x10\xdf\xa5\xf8"
+ "\x62\x53\xec\xde\xd8\x15\x75\x72\xdd\xb4\xdb\x79\xac\xa4\xb7\xe9"
+ "\x7e\x56\x84\x71\xa9\x7a\x89\x09\x18\x33\xd5\x53\xa9\x9d\x6f\x6b"
+ "\x75\x8f\x1b\x43\x44\x1b\x1b\x8d\x49\xfa\x37\x48\xc9\x16\x63\x83"
+ "\x8f\x1e\x31\xb6\xcf\xc5\x1d\xc0\x8b\x1c\x4f\xbb\x84\x6d\x8a\xdd"
+ "\x35\x15\x75\x7c\xf1\x4b\xf4\x0f\x73\x42\xf4\xe1\xb2\x1e\xf6\x79"
+ "\x06\x9f\xf4\xd4\xa4\x8b\xab\xf3\xf3\xb9\xb2\xce\x15\x75\xcf\x11"
+ "\x0d\x96\x77\x16\x61\xb3\xf3\x45\x19\x2f\x5b\x51\x07\x19\xa6\x8f"
+ "\xda\x23\xfc\x88\xa0\x43\x5f\xc4\x61\xae\xae\x3f\xc4\x52\x24\x1e"
+ "\x7e\x11\x0d\x79\x57\xc6\x78\xfa\xbc\x81\xf0\x5e\xfa\x97\x0b\xd9"
+ "\xac\xea\xc4\x3e\x16\x49\x63\x2f\xb2\x8f\x52\xa6\x31\x2f\x22\x79"
+ "\xee\xf3\xfd\xc2\x2e\x89\xfa\xbb\x29\xa0\xd1\xbf\xcf\xf7\x73\xe8"
+ "\xbb\x0b\x55\xbd\x27\x68\x59\xa1\xf4\x11\x38\xe8\xfc\x62\x49\x48"
+ "\xef\x89\x3b\xdd\x4e\xde\x8c\x7c\x34\xf7\x67\x91\x47\xfa\x20\xeb"
+ "\x51\xef\x3b\x7f\xf1\x63\xf5\x2e\x73\x12\x6c\xb5\xa8\x2c\xd1\x3b"
+ "\x2e\xf4\xad\x80\x01\xda\x16\x7d\xd7\x43\xc7\xf9\x45\x4d\x58\xcf"
+ "\xfc\xb9\x88\x0d\x21\xfd\x11\x7c\xd1\xa0\xe1\x08\x8d\x77\x82\x8c"
+ "\xeb\xf1\xf9\x8c\x23\x73\x99\xc0\x81\x3e\x6e\x9d\x74\x55\x0d\x70"
+ "\xf2\x8b\xe3\x91\x70\x5a\x1e\x50\x1c\x92\x06\x7d\xde\xc4\xc5\x5a"
+ "\xff\xbc\xe9\xdb\xf9\x89\xff\xba\x41\xe3\x45\x24\x9c\xe3\x88\xbe"
+ "\x7c\x19\x10\xb0\x2e\x19\x40\x0c\x38\xcb\x63\x85\xf0\x23\xfe\x5f"
+ "\x5f\xc3\x5f\x7b\xa0\x64\xc0\x1e\x74\x58\xe1\x9f\x96\x29\x25\x03"
+ "\x45\x5d\x76\xa6\x4f\xb7\x43\xb7\x9e\x28\x64\x3c\x92\x59\xe3\xb8"
+ "\x99\xf8\x13\x5a\xe7\x5b\xd7\x30\xcb\xfd\xd9\xd0\x31\x24\x25\xc0"
+ "\x9f\x3a\x7c\xa9\x23\x16\x42\xd0\x91\x14\x4f\xcf\x89\xc4\xcf\xc5"
+ "\x71\xe3\x40\x06\xce\xe7\x83\x4e\x4e\xf4\xf8\x38\x7c\xba\xeb\xdd"
+ "\x5e\x3f\xdb\x7a\x9a\x19\xe1\xaf\x3d\x50\x96\x68\x6d\xf5\x7d\x29"
+ "\xe4\x1b\xb3\x9d\x25\x10\xff\x81\x3b\x00\x56\x25\x36\x91\xd1\x1e"
+ "\x6f\x90\xe3\x3e\xcb\xe5\xb8\x65\xbf\xd1\x7f\x41\xe3\x4a\xfc\x45"
+ "\x85\xa2\xef\x5f\x3e\x17\xa0\xfa\x95\x92\x60\x41\xb0\x24\x98\x2f"
+ "\xef\xd4\xb7\xb0\xc2\x3c\xde\xed\xf6\xb5\x90\xcc\xd5\x2f\x62\xd7"
+ "\xe1\xfc\x1f\x63\xc4\xf8\xd0\xf6\xc7\xe7\x4e\x0b\x5e\x2b\x40\xef"
+ "\x8e\xb5\x6a\x99\x5e\x2a\xd3\xdb\xc2\x86\x4a\x82\x62\xec\xad\x3e"
+ "\x59\x36\x5d\x3c\xa3\x7c\x04\x1c\xd4\x31\x87\xe0\x40\x63\xc7\xf8"
+ "\x30\xfe\x00\x60\x42\x30\x50\xc7\x6a\x1d\x56\xc7\x89\x31\x7e\x44"
+ "\xbb\xce\x6e\x1a\x27\x8d\x55\x8c\x73\x98\xc6\xd9\x9c\xcd\x98\xbf"
+ "\x3c\xa5\xe8\xfc\xa4\x60\x3e\x64\x54\xc7\x27\xc4\xc3\x17\x54\x32"
+ "\x92\x45\x0d\x2f\x17\x56\xea\x9f\x24\xde\xa4\xd0\x4b\x32\xa9\x97"
+ "\x77\xc3\x86\xd7\x6d\xa7\xbf\x40\x0d\x03\x8f\xa3\xf1\xeb\xd4\xb6"
+ "\xf5\x63\xe5\x24\x2b\xec\xe6\xdd\xc4\x9b\xfa\xdd\x01\xca\x93\x4d"
+ "\xe3\x27\x19\xb6\x4b\xed\x3f\xf2\x6e\xfd\x5a\x8e\xcb\xb2\x96\x25"
+ "\xbc\xf3\x93\x12\xbd\xbb\xbd\x84\x69\x63\x79\x80\xf2\xd1\x78\xac"
+ "\x54\x57\x2c\xc6\xa3\xd0\x38\xf7\x50\x3f\xfd\x11\x63\x3a\xda\x0b"
+ "\x3b\xe2\xcf\xd8\xa4\x54\xa6\xdb\x7d\x86\xc6\x71\x86\x59\x2b\x0b"
+ "\x89\xff\x5a\x01\x7e\xf1\xf8\xd1\x4b\xd2\xd8\x6c\x0f\xfb\xaf\x63"
+ "\x52\xa6\x13\xbe\xa0\x2f\xed\x61\x5f\xf6\x87\xfc\x3d\xc3\x87\x7e"
+ "\x6c\xe2\x74\xe0\x91\xf0\xfb\x8c\x3d\x63\x90\x70\x06\xe7\xf4\x9b"
+ "\xa8\x8d\xc1\xa4\x44\xd1\x1f\xe7\x02\xd8\x09\x9b\xe8\x1d\xb1\xa3"
+ "\x70\x5f\x55\x47\xe5\xac\x9c\x60\x86\xfa\x89\x9f\x33\xe0\x17\x30"
+ "\x1c\xd3\xe6\xf6\x15\xb6\x90\xda\x68\x80\xfc\x5d\x5f\xe8\xd5\x3f"
+ "\xfe\x0a\x9b\x7b\x71\x34\xe5\xaf\xb3\xc7\xa3\xdf\xd0\xcf\xa2\x3e"
+ "\x1a\x5b\x7c\x0f\xfb\x5b\xcc\xc8\x35\x66\x13\xb4\x4c\xd2\xc1\xbf"
+ "\xb6\x41\xff\x79\x91\xed\x0a\x1e\x0e\x36\x16\x17\x59\xee\x98\xd6"
+ "\x0f\x7a\x1e\xf7\xbe\xc5\xc5\xc3\xe1\x6f\x73\xc7\xab\xab\x6c\xa7"
+ "\xb0\x91\x74\x94\xef\x24\x7a\x41\xbc\xc2\x11\x2b\xce\x52\x68\xef"
+ "\xdc\xef\x63\xb9\x7b\x19\xe2\xcf\xc4\xba\x03\x77\xb3\x23\x35\xc9"
+ "\xac\xf6\x1c\x7c\xc6\x25\xc5\x3f\x7b\x8e\xe6\x52\xa5\x21\xe0\x49"
+ "\xa1\x47\xe6\xb9\x49\x71\x15\x3b\x35\x1e\xfe\x6f\xfd\x05\xfd\x4c"
+ "\x6f\x5b\x27\x9e\x7d\x4b\x6c\x3c\x50\xa5\x57\xb2\x6b\xe0\xc7\xdc"
+ "\xbc\xa8\x1e\x7e\xcc\x35\xdf\xe0\x82\xf7\xc9\xa7\x35\xd7\x67\x9d"
+ "\x54\x96\xc3\xe6\x22\x9e\x81\xc5\x2b\x79\x39\xb9\x5f\x7b\x66\x53"
+ "\xff\xe2\x54\x7f\xe1\x71\xd2\x5f\xf8\x5f\xd7\xc2\xe6\x5c\xfd\x7e"
+ "\x6f\x90\x64\x18\x51\x6f\x0e\x9b\x5d\x73\x8e\x25\x81\x0f\x4a\x3f"
+ "\x29\x79\x36\xc8\x85\x77\xf7\x5a\x78\xf0\x1f\x49\x6c\x6f\x4f\x38"
+ "\xde\x81\x37\x17\x31\x12\xb8\x75\x3c\xfb\xe9\x8a\x44\x61\x4f\x20"
+ "\x7c\xed\xe2\x9c\x81\xde\x59\xd5\x33\xcc\x70\x04\xb6\x89\x75\xf2"
+ "\x1e\xde\x91\x80\xb4\xf7\x1d\x74\x7a\x9a\x34\x3f\xf0\xe3\x9e\x97"
+ "\x97\x4a\x79\x47\x99\x40\xf2\x97\x77\xd0\x25\x7d\x90\x9e\x30\xb9"
+ "\x8b\x95\x08\x19\xc7\x73\x1a\xdf\x90\x06\xbf\x6e\x29\x02\x96\x27"
+ "\x16\x40\xee\x51\x65\xc6\x77\x6c\xa1\x34\xc9\xc3\x08\x9b\x6b\xab"
+ "\x3c\xff\xa3\xbd\xc9\x3c\xe8\x3c\x91\xaa\xed\x67\xd8\xd7\xa5\xaf"
+ "\xd7\x13\x99\x1e\x3d\x3b\x7e\x81\xfe\xc5\xa9\x36\xe2\x38\xbb\x49"
+ "\xa1\xfc\x55\xda\xfe\x26\xce\x70\xb7\x4f\xfd\x7e\xee\x66\x36\xfd"
+ "\x87\x97\x1b\x19\xce\xff\x28\x6f\xb7\xdc\x77\x4f\x1c\x0e\x9f\x11"
+ "\xa4\x08\x78\xc3\x47\x81\x90\x31\xe0\xfb\x53\xc6\x34\xe8\xd5\x7c"
+ "\x80\xca\xfd\xf7\xc4\xe7\x11\xed\x04\x42\xfb\x28\xb5\x01\x1b\x74"
+ "\xd4\x2f\x79\x93\x13\xf5\xe2\x2e\x25\xe5\x93\xfb\xeb\x89\x71\xe5"
+ "\x36\xf8\xa1\x02\x7c\x15\x55\x9e\x74\xf7\x7e\x25\xe1\x9b\xcf\xa2"
+ "\xe6\x57\x31\xeb\x3b\x85\x1e\x83\x59\xfa\xe8\xb6\x74\xb0\x8e\xbb"
+ "\xf1\x1d\xb8\xee\xba\x1e\xfa\xc0\x8e\x83\x6e\xec\xdb\xc3\x69\xa6"
+ "\x7b\x20\xeb\x0b\x5e\xbc\xa3\x7a\x1e\x95\xa3\xb4\xf8\xb7\xcf\xf8"
+ "\x0d\x15\x5b\xd8\x5c\xe9\x4b\xb5\x43\xf8\xe8\xc2\x9d\xf5\xab\x12"
+ "\x98\xf5\xaa\x2a\x96\x34\xe8\xec\x70\x79\x74\x5c\xd8\xab\x88\xf6"
+ "\xcb\x7f\xd4\x86\x78\x0e\xaf\x0e\x79\xa2\xe5\x5c\xfd\xfd\x7e\x7a"
+ "\x4f\x0a\xbf\x77\x9c\x57\xcf\x87\xda\x3c\xec\xef\xab\xf6\x9d\x91"
+ "\xb6\xf4\x42\xbf\x54\x7a\x4b\x6a\xd8\xfe\xe0\xef\xf7\xcb\xbe\xfc"
+ "\xfd\xfe\x23\x76\x06\xdd\xf9\xb1\x5a\xe1\x9b\xfd\xef\x24\xf7\x9e"
+ "\xb0\xab\xfa\x98\x36\x81\x57\xe0\x77\x77\x40\x06\xfb\xca\x55\x46"
+ "\xf9\xb0\x4f\x10\x7f\x94\x22\x79\xf8\x5b\xb2\x15\xc2\x9f\x88\xf1"
+ "\x7f\x08\x7d\xe3\x98\x34\x71\x37\x63\xa2\x4c\xd9\xa2\x3a\x61\xcf"
+ "\x52\x76\x5f\x12\xfd\x1a\x79\xd9\xe2\x54\xfa\x35\x11\xce\x65\xd0"
+ "\x6f\x1c\xfd\x42\x96\x4d\xa0\xef\x71\xc0\x4b\x92\x61\xad\x88\x51"
+ "\xd9\x17\xbb\xa8\x7a\xbc\x7b\x51\x80\x8d\xbb\xf8\x47\x4c\xda\xec"
+ "\x75\xa6\x20\x3e\xe1\xf2\xbd\x8c\xe5\x06\xf8\x90\xed\x0a\xc4\x18"
+ "\xe9\x4c\x71\xec\xc5\x59\x7a\x67\xc2\xc8\xb3\xf4\xce\x05\xf4\x47"
+ "\x6f\x9d\xcd\xf4\xe7\xa7\xbf\x94\xf0\xdf\xc9\x05\x83\xce\xce\x14"
+ "\x82\xa3\xe0\xb1\x2e\x8e\x26\xa2\x3c\xcd\x03\xe4\xa2\xd8\xa9\x29"
+ "\x72\xbc\x2b\x8a\xe8\xdd\xc8\x63\x7f\xe4\x52\xc7\x6b\xa7\xf7\x38"
+ "\x9b\x83\xf6\xb5\x58\x82\xc9\x54\x1a\x73\xec\x7d\x49\x18\x2f\xfa"
+ "\xdb\x17\xbb\x38\x35\xf2\x4e\x18\xea\xc4\xf8\xbd\xb1\x54\x8e\x60"
+ "\xc9\xaf\x7e\xdd\xa3\xc1\x53\x85\x13\xee\xcb\xe8\xfb\xa8\x0e\xc9"
+ "\x07\x51\x7e\xaa\x43\xcb\x1f\x82\xfd\x54\x26\xf8\x26\xb4\x45\x32"
+ "\xb1\x51\xbb\x6f\x36\xe8\x3c\x39\xf7\xdd\xb5\x4c\xf5\xe7\xd1\x99"
+ "\xe2\x8b\x28\x0b\x9f\x0a\x63\x95\xa7\x36\x8d\xb2\xcd\xc5\xa9\x5d"
+ "\xac\xf3\x76\xd9\xee\x49\xdb\x78\x6b\xa9\x70\x16\xf1\x77\xc4\xf5"
+ "\xce\x97\x72\xdf\x62\xf7\x74\x1f\x73\xd7\x28\xb4\xe7\xdf\x52\x94"
+ "\x52\xc8\x5d\x5d\xec\xe4\x89\x56\x7f\xf7\x45\xee\x87\x27\x85\xbf"
+ "\x10\x3e\x54\xc4\xdc\x05\x37\x8a\xf3\xac\x33\xec\xab\xc9\x6e\xaf"
+ "\xb8\x73\x4e\xcf\x5d\x41\x7c\xc7\x19\x3a\xf6\x06\x92\xb1\x43\x71"
+ "\x32\x14\xca\x5b\x8b\x74\x4a\x83\x4f\x92\x7d\x11\xdf\x78\xf9\xa2"
+ "\x34\xb9\xa6\xba\x3e\x04\x6f\x21\xfa\x1b\xf8\x57\x17\xfa\xac\x94"
+ "\x2e\x4a\xc3\x18\x1c\x24\xff\x21\x36\x28\xd6\x84\x6d\x23\x74\x85"
+ "\x5d\xbf\x24\xbc\xe3\x4a\xd9\xa2\xb4\x8b\x1b\x43\x97\xb8\x2b\xe9"
+ "\x08\xf0\x33\xde\xd8\x45\x69\xe0\x49\x2a\x0a\xa3\x8d\x77\xd4\x70"
+ "\x57\x9f\xf9\x96\xa2\x41\x67\x57\xf3\xbb\xf9\x72\x6e\x2e\xb2\xde"
+ "\x66\x6d\xec\xb5\xea\xd8\x29\x4d\x9c\x51\xcd\xaf\x96\xf1\x43\x3c"
+ "\xec\x2b\x36\xae\xce\x8a\xe6\x19\xfc\x00\xed\x0d\xe7\x25\x2c\xbe"
+ "\x4a\x0d\xed\x0d\x17\xd5\x8f\xaf\xc6\xf5\xe5\x1f\xd1\xc6\xb0\xda"
+ "\x46\xc3\x7f\xb3\x8d\x86\x0b\xb5\x21\xcf\xcf\xbb\x53\x2e\x5e\x76"
+ "\xec\x16\x7e\x75\x88\x7e\xda\x25\xcd\x3c\xf5\x5a\x90\xe4\xb7\x80"
+ "\x69\x45\x11\x78\x1b\xd8\xca\x22\x96\x4a\xa0\x74\x6a\xca\xd1\xfc"
+ "\x21\xe6\xda\xf8\x29\xeb\x64\xdd\xc2\x7f\xdf\xd1\x3c\xc8\x6c\x3f"
+ "\x72\x0d\x97\xdf\xd2\x36\xac\xff\x0a\xf7\x27\xb3\xf7\xd2\x3c\xec"
+ "\x89\xc0\xb3\x56\xdf\xa7\xcc\x9d\x01\xfd\x6a\x1b\xf4\xda\x2e\x1e"
+ "\xbb\xa2\x48\x21\xda\x40\x3c\x7a\x50\xc0\x83\xf8\x17\x21\x6f\x91"
+ "\xcc\x26\xe4\x2d\xaf\xf0\x99\x1c\x2b\x62\xa4\x38\x5f\xc9\x83\xee"
+ "\x3b\x38\x9c\x66\x1b\x74\xb2\x54\xc4\x4e\x81\xde\x99\x9b\x8c\x95"
+ "\xcb\x03\x51\x5c\xc8\x53\xc4\xfb\x23\x76\x8a\xdb\xe7\x61\x41\xe2"
+ "\xa3\x6b\x06\x58\x42\x0d\xf1\x9e\x44\xb3\xe3\x40\xd7\xf7\xa9\xf1"
+ "\x53\xca\x06\xc2\xf1\x53\x6a\xa1\xeb\x69\xa7\xe7\x01\x66\x08\x96"
+ "\xa5\x64\xef\x19\x60\xb3\xf7\x6e\x64\x49\x7b\xa0\xcb\x3b\x25\x79"
+ "\x1f\x61\xdb\x8e\x58\x2a\xeb\x93\x70\x96\x10\xe6\x7d\xe0\x23\x21"
+ "\x4c\xb7\x0c\x42\x07\x72\x51\xf0\x3e\x25\xf6\xc1\x40\xe9\xa2\xba"
+ "\x80\xe9\xbe\xa4\xe1\xf2\xc5\xc4\x73\x74\xd7\x13\xfc\xe6\x8e\x35"
+ "\xb7\x9a\x8d\x4c\x55\x44\xfc\x9b\x77\x67\x4b\xfa\x4e\x75\xf9\xc6"
+ "\xc3\x89\xe0\x9e\x34\x36\xbf\x97\x25\xcb\x73\xfb\x18\xda\x13\x7b"
+ "\xd2\x60\xd3\x58\xf8\x28\xb3\x06\xf7\xac\xd2\x39\x5e\x60\x51\xee"
+ "\x40\x0a\xc3\x5f\xe1\xd7\xbc\x7b\xfe\x5a\x96\x8c\xf3\x07\x9c\x95"
+ "\xd8\x1e\x13\xf9\xaf\x99\x5d\xc0\x46\x9c\x39\x3c\xba\x39\x67\xcd"
+ "\x0d\xc9\x3f\xcd\xb2\x3d\xbc\x26\xe7\xd1\x4d\xab\x73\xb2\xd8\x52"
+ "\x69\x0a\x22\xdc\xd1\x6f\x86\x1d\xc8\xa6\x35\x79\xd9\xb6\x87\x36"
+ "\xe4\xe4\x64\xad\xcb\xb3\xdd\x7d\x47\xea\x37\x7d\x92\xee\xb1\xee"
+ "\xc7\x59\x8f\xb4\x0b\xec\x8d\xe1\xcf\x5f\x37\x50\x8e\xf8\x5a\xdb"
+ "\xee\x5c\x69\x09\x2c\xb5\xc9\x38\x47\xbd\xab\x60\x8b\xcb\x1d\x69"
+ "\xd5\x92\x4f\xed\xbd\x5f\xf2\xf6\x96\xa5\xf2\x1e\x5d\xaf\xf4\x03"
+ "\xd8\xb7\x74\xba\x5c\x53\xff\xb8\x35\xca\xce\xf0\xfc\x28\x9e\x2d"
+ "\x76\x56\xe2\x9a\x8a\xf3\xf0\x7f\x08\x1f\x8d\x7c\xcf\x32\x9d\x96"
+ "\x4f\xcb\xa3\x7e\x17\x7e\xa7\x6b\xe1\x57\xd7\xd9\x93\x49\xf0\x89"
+ "\x1f\x74\xfe\x63\xa5\x47\xef\xeb\x56\x79\x84\x6e\x69\x83\xd8\xbb"
+ "\x0a\x3e\x3a\xf9\xf3\xd3\x06\xd4\x7a\x4a\xa9\xbd\x4b\x28\x6f\x91"
+ "\x87\xf5\x18\x55\x5b\xc5\x99\x1d\x6a\xbf\xa4\x4d\x45\xcf\x46\x69"
+ "\x53\xf1\x8f\xfd\x11\x77\xe1\x85\xaf\x09\xec\x8d\x2a\x4f\x3a\xa8"
+ "\xd6\xd7\xac\xd1\x04\xca\x7f\x8c\xf8\xba\xea\x8b\xa7\x85\xff\x90"
+ "\xf2\xcf\x08\xdf\x4b\xbd\x77\x8e\xf4\x69\xa2\xc1\xcd\xfa\x2b\xa9"
+ "\x8b\x97\x70\xa5\x31\x1c\x96\x70\x12\xe9\xd3\x7b\xe8\x1d\xe5\x3c"
+ "\xac\x77\xfa\x68\xfc\x0a\xcd\xf8\x5d\xeb\x1e\x5a\xff\xa8\x7d\x75"
+ "\xde\x9a\x07\xd7\xac\x5d\x93\xb7\x59\x5c\xd9\x9f\x2b\xfe\xfb\x97"
+ "\x39\x99\x2b\x47\xfb\x9f\x4f\x82\x4e\x46\xf5\x5b\xed\x83\x0d\x84"
+ "\xd4\x8b\xf5\x7e\x1d\x70\xb2\xdb\x2e\x6e\x9c\xbd\xa2\xaf\x35\xc2"
+ "\x8f\xc7\x69\x46\xfc\x63\xaf\x7a\x3e\xd2\xab\xce\x95\xf8\xde\x67"
+ "\xba\x2f\xce\x36\x95\x2d\xee\x60\xde\x06\x9c\x8b\x11\xbc\x33\xb0"
+ "\x7f\x96\x6d\xc1\x3e\xd7\xc6\x8e\x06\x68\x2f\x15\x67\xe5\x67\x62"
+ "\x01\x33\xf0\x90\x04\xa3\xfd\x1d\xec\xf4\x06\x01\x8b\xb3\xd6\xfd"
+ "\xc2\x37\xc7\x59\xeb\xaf\x80\x8b\xe8\xb3\xc2\xd3\xf6\x70\x9e\xb6"
+ "\x5b\x39\x9b\xbd\x87\x9f\xcd\xde\x1d\xf6\x7d\x79\xda\x43\x65\x0f"
+ "\x51\xd9\x93\x88\x6d\x55\x7e\x86\x1d\x02\x9d\xc4\xbb\x25\x2f\x8e"
+ "\x64\xc3\x5b\xd2\xd0\x1f\xb7\x37\x99\xc9\xfb\xfa\xa7\x3d\x6e\xdf"
+ "\x8d\x8c\x78\xcf\x0c\x71\x3f\x54\x9c\xef\x11\x7f\x48\xe5\xdc\xd4"
+ "\x2f\xb7\x77\x08\x32\x74\x9a\x42\x3c\xa2\x87\x9d\x8e\xa3\xfd\xb6"
+ "\x1a\xf5\x62\xcc\x7b\x09\x27\x61\xa7\x41\x63\x27\x3e\xa6\xa7\x46"
+ "\xbd\x1b\xdc\x59\x46\xe9\x80\xc1\xc8\xf9\x3f\x33\x0b\xf3\x48\x30"
+ "\xfe\xbf\x61\x1c\x38\x23\x7c\x44\x2d\xeb\xe4\x7f\xe3\x25\x03\x75"
+ "\x72\xbe\xcf\xdc\xa5\xa6\x9d\x0d\xfb\x0b\x38\x73\x3f\xbd\x0f\xd3"
+ "\x9f\xc2\x4b\x06\x5d\x11\x67\xd3\xf8\x26\x7c\x7a\xc1\xee\xc4\xbe"
+ "\x85\x5d\x41\xe5\x9f\x96\x67\xd5\x83\xef\x78\x1d\xd9\x51\x54\x26"
+ "\x88\xfb\xad\x2a\x7c\x5f\x73\x17\x9f\xd1\x6c\x3d\xa8\x4f\x67\x7f"
+ "\xe0\x7a\x38\xc0\x44\xfc\xfa\xce\x80\xb0\x87\x54\x7d\x44\xe8\x14"
+ "\x67\x2f\xec\xd5\xe0\x5f\xcd\xb4\x37\x5e\xc6\x7e\x18\x74\x9e\xe9"
+ "\x0c\xd9\x24\x99\x24\xcf\x08\xbe\x0d\x31\xfd\xb0\x7e\xc0\x03\xa2"
+ "\x4f\x58\x3f\x54\x77\x1c\xce\xb9\xe5\x3a\x3a\x3b\xfd\xbf\xb7\x8e"
+ "\xce\x0a\x9c\xa7\x7e\xd7\x73\xbd\x83\xcf\x2f\x65\x19\xc2\x0e\x21"
+ "\xe0\xc3\xbd\x64\x03\xed\x3d\xc5\x92\x26\x79\xcb\x84\xad\xca\xc6"
+ "\x5e\xc4\x33\x2e\xda\x37\xc4\x4c\x4a\xa9\xb1\x04\xbc\xfa\xd1\x02"
+ "\x61\xbf\x61\xa4\x72\xf5\xb0\xef\x80\x8d\xa1\x59\xc4\x8c\xfc\x94"
+ "\xed\xeb\x67\x86\x4e\x76\xb6\x06\xe7\x49\x61\x58\x9f\xfd\x1a\xe7"
+ "\x87\xfc\xc9\xfe\x85\x96\x02\xbd\xa8\x43\x19\x38\xbd\x50\x2b\x87"
+ "\xd8\xe4\x28\xd7\xc1\xce\x7e\x26\xca\x21\xaf\xf0\x25\x12\xb7\x8a"
+ "\x78\xb5\x3a\xe4\x0f\xd0\x7b\xad\x12\x97\xca\x69\x4f\x09\x6e\x0c"
+ "\xd4\xd3\xb7\x95\x4a\xe9\xe2\x54\x4a\x4b\x13\xe7\x18\xc3\x56\x9c"
+ "\x6f\x12\xce\x25\x26\xbb\x3d\x5f\xb9\x44\x7f\x70\x57\x39\x8f\xf6"
+ "\x5f\x21\xdb\x78\xaf\xa9\x3d\xc5\x0c\xf6\x87\x31\x9f\x5e\xe9\x03"
+ "\xf8\x0c\x3b\x20\xfb\xe7\x7d\xab\xef\xc9\x60\x7e\x1f\xe1\xab\x4f"
+ "\x6f\x64\x47\xac\xb0\xb1\xbf\x2f\xee\x88\x75\x88\xe6\xc7\x5b\x4c"
+ "\xf4\xf2\x80\xe4\xab\xbd\xa1\xb5\x09\x1c\x8d\xb2\xc6\x39\xe8\xfb"
+ "\x7e\xcd\xa6\x09\x78\x5a\x2a\x7c\xbc\x9f\x2d\x00\xdc\x08\xb7\x17"
+ "\x1c\x5d\x1b\xf6\xb1\xdc\x27\xef\xf5\xc5\x51\x99\xd0\xfd\xdf\xe0"
+ "\x80\xd2\x42\xfd\x80\x2f\x9a\xfc\xe0\x46\xe5\x38\xce\xdf\xef\xe9"
+ "\x57\x38\xee\x3c\xe0\xfe\x0a\x64\xa7\xe5\xf9\xbc\x0f\xb2\x20\xee"
+ "\x8a\xe1\xec\x1d\x77\xe9\xc3\xeb\xe4\xeb\xd9\xda\x9d\x7a\xac\x11"
+ "\xf4\x01\xf7\xc1\xca\x7f\x26\xd6\x29\x6c\x60\x4d\xe2\xfc\x21\xea"
+ "\x91\x53\xf7\xf8\xa8\xce\x33\xe2\xdc\xac\xaf\x56\xad\x07\x3e\xb3"
+ "\xa8\x8e\x6c\xad\x0e\x05\xf6\xc3\x39\xc2\x7e\xcf\x23\xcb\x4b\x5b"
+ "\xa3\x7b\x7c\x8a\xb8\xc7\x83\xf2\xd2\x06\xe8\xeb\x9a\x90\x0d\xaa"
+ "\xb8\x5b\xf3\xf5\x21\xcd\xc6\x8c\x9e\x43\xf7\xbf\x00\xd3\xbe\xd2"
+ "\x5b\xd2\x7c\x44\x1f\x7c\xa5\x8b\xaa\xe9\x1b\xd1\xff\x53\x6d\x17"
+ "\xd4\x87\xc0\x8f\xc2\x06\xa6\x57\xcc\xc6\x06\xf8\xc8\x80\xb5\xbd"
+ "\xb4\x7b\x3f\x77\xb3\xea\x2f\x23\xea\x0c\xfb\xfa\xeb\xf0\x39\x7c"
+ "\x50\xd5\x21\x9f\x5b\x25\x65\x98\x73\xab\x84\x0e\xb9\xfc\x96\x94"
+ "\x97\xb6\xf8\xf5\xf5\x5b\x3c\x7a\x69\x8f\x77\x8e\x78\x91\xa1\xe2"
+ "\xb0\x2d\xe8\xb9\x38\xd4\x35\x36\xcf\x69\xae\x93\x75\xf6\x09\xff"
+ "\x21\x61\x9d\x40\x9f\xb8\xff\x84\x33\x73\x05\xfc\xa3\x79\x6a\x2a"
+ "\x6c\xa4\xdc\xf6\x73\xd0\x25\x4f\x90\xfa\x09\x99\x47\xb5\xf3\x9c"
+ "\xd2\x33\xf2\x3d\x1e\xef\x12\x66\xe7\x3c\xda\xb9\x54\xb9\x5e\x41"
+ "\xfc\x41\xee\xa8\x23\x7a\x69\xf7\x09\x3f\x0d\x6e\xe2\x47\xa9\x0d"
+ "\x6e\xcf\xc1\x5d\xca\xbe\x4b\xe1\xbf\x41\xae\xcd\xbe\x27\x44\x9f"
+ "\x9c\xb7\x71\x07\x64\x32\x2f\x62\x1d\x9d\x63\x94\x6f\x32\xe5\xbb"
+ "\xbd\xa9\xa0\x17\x36\x66\x05\x88\x63\xdb\xa9\xb6\xed\x8d\x35\xd7"
+ "\x5d\x65\x62\x19\x83\xce\xbe\x95\x1e\xd6\x54\x73\xf1\x74\xa3\x6f"
+ "\xe5\x85\xf8\x73\xc9\x2f\xa6\xb0\xf1\x64\x7c\xe8\x70\xae\xa7\xf6"
+ "\xef\xe6\xe8\xbf\xef\xf6\x80\xde\xcf\x86\xf5\x13\xf9\x75\x45\xf9"
+ "\x2c\xe0\x9c\xc8\x83\x5b\x68\xbe\xfa\xac\x24\x03\xb6\xb0\x56\x69"
+ "\x77\x03\xdb\x01\x4b\xa1\x8f\x9f\x73\x07\x1a\x70\x86\xe0\xa5\xb9"
+ "\x22\xba\xe5\xfb\xae\x3b\xf0\x16\x83\x7d\x37\xe8\x4d\x07\xf3\xcd"
+ "\x41\xbf\xae\xb7\x17\xb1\x79\x67\xf0\xbd\xaf\x53\xee\xf9\xbe\x14"
+ "\xf5\x37\x0e\xfe\x81\x23\xfb\xf4\x2f\x1b\xd6\x3d\x04\x27\xd3\xf3"
+ "\x96\x65\x6d\xcc\x5a\x6b\x5b\x01\x17\xd4\xa3\xed\x46\xc3\x71\x0e"
+ "\xfb\x4d\xd8\x5f\xc1\xbf\x23\xde\xe1\x85\x62\x1d\x6a\x71\x0e\x69"
+ "\xcd\xcd\x86\xce\xfb\x7f\x33\xd6\xa1\xc6\x9f\x23\xce\x61\xf8\xfc"
+ "\xa7\xbf\x25\xb4\x06\x94\x77\x06\xf1\x2e\xf6\x74\xa7\x6f\x19\xd6"
+ "\x91\xdc\x5f\xfa\x97\x44\xfa\x2a\x92\xfc\x59\x62\x32\xa5\xaf\xd2"
+ "\xee\xbc\x12\x2e\x9a\xe8\x7d\x6d\xf8\x8e\x4d\x7f\x3e\xcd\x77\xa3"
+ "\x5c\xbf\x22\x6f\x89\x66\x27\xa1\xc6\xb4\x17\x76\x1d\xca\x8e\x9b"
+ "\x0b\xa4\x6e\xb2\xbf\xac\x56\x99\x68\x94\xe7\x62\xfd\x0d\xda\x1d"
+ "\x2e\xb9\x36\xdf\x51\xd7\x66\x7f\xcb\x85\x6c\x59\xc2\x6b\x63\xc0"
+ "\x18\x5e\xd7\x7f\x53\xcb\x0e\x18\xbf\xcd\x0e\x46\x95\x11\x2f\xed"
+ "\x61\xfe\x19\xd0\x57\xca\x3b\xdb\x7e\xe1\x5f\x48\xfa\xe3\x18\x3c"
+ "\xa1\x3e\x53\x1b\x83\x1f\xaa\xcf\xd3\xe8\xf9\x35\xf5\x99\xf8\xc5"
+ "\xc1\x5d\xea\x33\xad\xd9\xc1\x6d\xea\x73\x02\x3d\xaf\x51\x9f\x69"
+ "\xef\x18\xfc\x81\xfa\x9c\x48\xcf\xdf\x55\x9f\x2f\xa7\xe7\x59\xea"
+ "\x33\xad\xc1\x41\x71\x66\x40\x7d\x37\x52\xdf\xfb\x2f\x5e\x66\x1d"
+ "\x70\xc9\x73\xeb\x41\x46\xfc\x60\x95\xdc\x7b\x42\x69\x09\x84\xd3"
+ "\x99\x1a\x7c\x29\xbd\x11\xed\x50\xfa\x5c\x0f\xf3\xb4\x45\xa4\xab"
+ "\xfe\xdb\x06\x97\x78\xd8\xd7\x9e\x88\xf4\x1a\x35\x7d\x15\xc9\xdc"
+ "\xbe\x88\xf4\x4a\x35\x3d\x8f\xe8\x62\x76\x44\x7a\xb1\x9a\x5e\xea"
+ "\x61\xff\x65\x88\x48\xcf\x57\xd3\xf7\x6b\x36\x3c\x6a\xfa\x5a\x35"
+ "\xfd\xb0\x87\x7d\xda\x10\x91\x9e\xa1\xa6\x13\xfd\xef\x6f\x8f\x48"
+ "\x17\x74\x45\xfa\x64\xb7\xf0\x23\x05\x58\x5b\x83\x7e\x0f\x6b\xdf"
+ "\x1f\x91\x67\xa9\x2c\xeb\x27\x7e\xf1\x2f\x2d\x11\xe9\x8b\xd5\xf4"
+ "\x24\x8f\xee\x3b\x91\x75\x26\x8f\x47\xab\x74\xd5\x2c\x63\x3c\xbd"
+ "\x3e\x64\x20\x61\xcb\x2c\xf8\xec\xf3\x59\xb8\x13\x66\xd9\xcb\x3b"
+ "\x6c\x85\x9c\x77\xb0\xf3\xcb\x54\xdb\xdd\x7c\xd8\x51\xca\xfb\x75"
+ "\xe7\x17\xa8\xbe\x15\xbc\xe2\xce\xdd\x16\xa4\xf9\xdf\x14\xfa\x99"
+ "\xfc\x22\xe9\x2f\x5c\x8b\x3d\x03\xfd\x96\x7a\xf6\x4f\x79\xe0\x2b"
+ "\x16\xb6\xe0\xbd\xd0\x81\xbb\xf3\x86\xa4\x2f\x79\x92\x83\x91\x06"
+ "\x3d\x0f\xe0\x11\xa9\xcf\x92\x74\xff\x7c\x96\x32\x84\x7b\xad\x52"
+ "\x17\x86\xb5\x88\xfc\xb0\x57\x8b\xcc\xeb\x61\xe7\x85\x5f\x8a\x28"
+ "\xeb\xe4\x3f\x0f\x3a\xcf\x2f\x09\xdf\x27\xf2\xd7\xa8\xe9\x9f\x51"
+ "\xfa\xaa\x88\xf4\x92\x71\x69\x3b\xd1\x41\x6e\xec\x2f\x1a\x1e\xe0"
+ "\xbe\xc0\x00\xf7\x97\xff\x95\xfa\xfd\xb0\xb0\x11\xbc\x22\x58\xd2"
+ "\x5f\x89\xfb\x36\x88\x11\x1b\xd8\xc8\xbd\xb0\x89\xa4\xf4\x4b\xee"
+ "\xf1\x79\x89\xc7\x18\xe4\x65\x0f\xc2\xfe\xb5\x9f\xe1\x6c\xd6\xd1"
+ "\x8b\x78\x83\x16\x8e\x7b\xdc\x5b\x4f\x33\x13\xee\xe3\xd4\x3e\x8c"
+ "\xef\x5f\xb2\xbb\xb3\xbd\xec\x68\x76\x90\xd5\x52\xdd\x7b\x1f\xd4"
+ "\xf8\x8b\xf3\x81\xd0\x5d\x61\xea\x03\xda\x73\x88\x98\xd8\x43\xc2"
+ "\x57\xb9\x65\x1b\x6c\x0a\xee\x5b\xc8\xdf\x03\x6f\xbc\x28\xc3\xb2"
+ "\x8d\xd9\x68\x6f\x5f\x48\xcf\xa9\xf2\xef\x3e\x3c\x8f\x39\xd7\x2a"
+ "\x6d\xa7\xb5\x3c\x94\x27\x68\x4d\xc9\x00\x93\xf4\x62\x28\x8f\xbf"
+ "\x88\xfb\x27\x43\xf9\x44\x6f\x16\x12\x1f\xbe\x70\xac\xf2\x5b\xf7"
+ "\x32\xfd\x70\x39\xf1\x26\x67\x1a\xf5\x92\x3e\x0d\x67\x2a\x7a\xe3"
+ "\x36\xe8\xda\x45\x3c\xdc\x72\x63\xd3\xa1\x75\x7e\xfd\xd1\x2d\x9d"
+ "\xec\xb1\xcb\x99\x75\x95\x5f\x4f\x79\x86\x4e\x9a\xf3\xe0\xd3\xfc"
+ "\x96\x14\xe2\x67\xf5\xaf\xd3\xf7\xb7\xd7\x35\xea\x03\x82\x5f\x19"
+ "\xce\x14\xfa\xd9\x52\x63\x35\xf6\x10\x77\x7b\x10\xbc\xb8\x89\x78"
+ "\xf1\x12\xa2\xff\xc6\xe0\xa6\xec\xf8\x40\x6e\xf6\x25\x7b\x73\x98"
+ "\x29\x98\x9b\x94\xf0\xec\x00\x5b\xa8\xed\x3f\x7b\x37\xd2\x9e\x32"
+ "\x68\x9d\x54\x41\x7b\x0a\xf4\x3e\x66\x5d\x9c\x38\x87\xc6\xb3\xa2"
+ "\xff\x6b\x5c\xed\xc6\x0b\xc7\xf6\x0e\x6e\x4a\x12\xfe\x26\xd0\x97"
+ "\xb1\xc6\x5a\xba\x9b\x19\x82\xea\xbd\xd4\xc2\x93\x2c\x91\xf8\x67"
+ "\xbd\xb9\x9f\xbb\x7a\xd6\x32\x3d\xe2\x21\x17\x66\x09\xdd\x6a\xf4"
+ "\xd1\xec\x00\x73\xe7\x7f\xc1\x0a\x73\x30\x47\xc3\x6f\x82\x4f\x83"
+ "\x3d\x33\xe5\x8f\xeb\x61\xc3\x1f\x5a\xfc\xb4\x67\xf8\x89\x27\xff"
+ "\x19\xe4\xe2\xe1\x2f\xa5\x7f\x8b\x80\x0d\xf7\x48\x5d\x39\xdf\x47"
+ "\xda\x79\xc7\x49\x61\x37\x54\x20\xd7\xd6\xf0\x31\xbc\x3b\x70\x4f"
+ "\xd6\x1c\xdb\xf4\xca\x90\x3f\x5a\xea\xef\x86\x3f\x53\xf7\x87\x64"
+ "\x29\xdb\x0d\x1f\x1b\x0f\x77\x95\x92\xf3\x90\x5d\x66\xba\x6b\xc0"
+ "\xbf\x72\x8f\x38\xe3\x87\xcf\x80\xfc\xdb\x5c\x9c\xc8\x9d\xf4\x65"
+ "\x14\xd8\xa5\x3c\x71\xbe\x4e\xfa\x90\x0c\xc8\xbb\xf9\xd0\xf7\x3f"
+ "\x71\xbe\x5e\x9c\x6f\x3c\x71\x5e\xea\xfb\x9f\x38\xdf\xb6\x7d\x2a"
+ "\xee\x13\x04\xaa\xfb\x62\xce\x13\xdf\x16\x58\xdb\x67\x8e\x1f\x33"
+ "\x3e\x9f\xd8\x8f\x4a\x06\xda\x6c\x57\xb0\x04\x9c\x33\xa5\x07\xa5"
+ "\x2f\x56\xb9\x86\x83\x35\xfc\x09\xf1\x6d\x66\x87\x9d\x45\x49\x7f"
+ "\xc7\x81\x53\xf3\x6b\x98\x8d\xfa\x1a\xcb\x8d\xe7\x8b\x84\xdd\x63"
+ "\xc9\xf9\x4a\x77\x2f\xe2\x54\x05\x99\x3c\x0f\x0c\x1e\xe0\x31\xe7"
+ "\x8b\x64\xfe\xe0\x77\x5b\x7b\x69\x0c\xc6\xf3\xa9\x6e\xff\x69\x95"
+ "\x27\x0c\x2e\xa4\x3e\xa6\xf2\x92\xf3\x19\xf2\xbe\x79\xf0\x09\x8d"
+ "\xae\x4a\x1c\x0d\x6e\x55\x71\xbd\x4d\xc2\x2d\x78\x40\xdd\xaf\x66"
+ "\xe2\x99\xf6\xee\x64\x69\xbf\x12\xcc\xd3\x78\x64\x8f\x9a\x07\x65"
+ "\xe8\x59\xf5\xf3\x19\xac\xa2\xb1\xcf\x55\xbf\x2f\x44\x1a\x8d\x8f"
+ "\xf6\xac\x40\x1b\xc6\x35\x1e\x6d\x15\xb0\x28\x60\x51\xd4\x67\xf8"
+ "\xc0\xc3\x1d\x01\x9f\xdb\x77\x9b\xcb\x2d\xe6\x80\xdf\x00\xdb\x7e"
+ "\xb4\x03\x7f\x43\xa0\x9b\x54\xa7\x01\xf5\x85\xfb\xaf\x5c\xaa\xf5"
+ "\x05\xed\xe1\x1b\x8d\x35\x55\xc8\xd5\x34\x66\xe4\xc1\xbc\x76\xd9"
+ "\xa1\xf7\xeb\x27\x98\xc1\x86\x8e\xa7\x00\x26\x12\x66\x7c\xba\x2a"
+ "\xd3\xab\xf3\xc0\x27\x8f\x84\x87\x7c\x57\x8c\x44\x1b\x72\x60\x4b"
+ "\xc5\x53\x54\xf8\xa9\x31\x56\x14\xe1\x8b\x56\x7e\x53\x7e\x19\x51"
+ "\x76\x46\x28\x2f\xf5\x1b\xbc\x11\xec\x12\x70\x4e\x25\xf1\x55\x69"
+ "\x8b\x28\xd7\x96\xfe\x35\xf1\xc8\xc4\x43\x6e\xdf\x29\x62\x56\x12"
+ "\x6f\xa5\x74\x86\xe1\x2d\xeb\x19\xa3\x8d\x2b\xb4\x36\x3c\x4c\xd9"
+ "\xaf\xf5\x93\x9e\xd5\x3d\x98\x27\x85\xe7\x44\x59\xaa\x95\x83\x4e"
+ "\x87\xe6\xc8\x87\xf8\xb1\xe3\xc4\xc5\xd0\xb9\x09\x2a\xad\x81\xdb"
+ "\x5c\x02\x1f\x19\xaf\x83\xee\x92\xe0\x6a\x97\x38\xc4\x8b\xe5\x5e"
+ "\xc8\xeb\x50\x27\xce\x1a\xa5\xbf\x51\x5e\x4d\xf5\xaa\x77\x96\xf8"
+ "\x21\xb5\x0f\x24\xff\x05\xf6\x8f\x96\xeb\xbe\xbf\x3a\xd3\x96\x7a"
+ "\x83\xb8\x73\x3b\x6f\x83\x1d\xd7\x69\x33\xc3\x2f\x23\x79\xee\xb8"
+ "\xb0\x8f\x33\xc4\xa2\x56\x7d\x9c\x95\x9a\x9b\x04\xfc\x75\x6c\x09"
+ "\x1f\xe0\x55\xb8\x3b\xc2\x37\xf2\xea\x72\x9a\x43\x47\x3f\xbb\x0c"
+ "\x71\xb1\x0b\xed\xfc\x2b\xf8\xbf\x23\x7a\x89\xb8\xee\xdd\x85\xfd"
+ "\x6c\x22\xec\x92\x40\x7f\x60\xf7\xcc\x63\x29\xbd\xcc\xd8\x1d\xba"
+ "\x87\xa7\x33\x2c\xc6\xdd\x51\xee\x48\x23\x5e\xda\x18\x00\x3e\xc0"
+ "\x46\xbd\x4b\x67\x98\x4e\xf9\x70\xaf\x34\xaf\x4c\xe8\x12\x62\x52"
+ "\x82\x26\x73\x8d\xe3\x34\x9b\x20\x62\x1c\xe6\xfb\xa1\x53\xd3\x77"
+ "\xe8\xd8\x2f\x79\x6c\x4c\x0a\xa5\x9b\x45\xba\x9f\xda\x2e\x8b\x49"
+ "\xa1\x6f\x66\xfa\x76\x82\x7e\x15\xaa\x23\xbf\x9c\xfa\x5d\x78\x9a"
+ "\x5d\x41\x7d\xe9\xe6\xa5\x31\x29\xd4\xcf\x2e\xc7\xa3\x2c\xb1\xd5"
+ "\xde\x0d\xf9\x8e\xea\xf3\xc8\xd8\x8d\x54\xb6\x43\xa7\xbb\x99\xc6"
+ "\x95\x0f\x9d\x08\xfd\x16\x94\xd1\x6f\x61\x90\x99\x0b\xb7\xd2\xbe"
+ "\xb7\x95\xda\xc7\xbd\x56\xaa\x07\x3e\x48\x64\x5f\x68\x6c\xd0\xab"
+ "\x51\xbd\x5b\x7b\x79\x17\xd5\xdd\x7d\xb4\x97\xea\xcb\x6f\x0f\xd5"
+ "\xa9\xf2\xd4\x33\x69\xbc\x97\xf2\xf2\x29\x46\xea\x53\x35\x6c\xb7"
+ "\x29\x2d\x8e\xd2\xe2\x42\xfc\xb0\xce\x30\x59\x7d\x8e\x09\xe5\x75"
+ "\xa4\xb1\xc2\xf3\x4c\xd8\x50\xdb\x36\x45\xb1\x0e\x5d\x54\x1d\xfc"
+ "\x60\x85\xeb\xd4\xcf\x40\x7d\xa5\x54\x9f\x23\x8b\xc5\x10\xad\x36"
+ "\x52\x1f\x11\x23\xfa\x84\x80\x13\xd6\x98\x4e\x3f\x9d\xc6\x52\x89"
+ "\x31\x29\x34\x77\x65\xb4\x1e\x68\x3c\x3a\x1a\x4f\xcc\xd6\x60\xe8"
+ "\xae\x2e\xc6\x34\x19\xf2\x1c\xc6\x25\xe7\x31\x66\x15\x8d\x2b\x73"
+ "\x6b\x36\x3f\x41\x63\xeb\x3e\x9a\xdd\xce\x68\xef\xb1\xb4\xda\xdb"
+ "\x70\x87\xe2\x84\x84\x5b\x37\x6c\x50\x49\xde\x8f\xc9\x0c\xf9\xea"
+ "\xd5\x45\xed\xa2\xbe\xc7\x51\xbf\x4a\xd5\x71\x22\xad\x2a\xc4\xd3"
+ "\xeb\xa2\x9e\x53\x9f\x27\x85\xf2\x7e\x73\x9c\xc6\x88\x71\x52\x79"
+ "\xc3\xad\xa8\x4f\x1d\xe7\x24\x1a\x67\xcc\x37\xc7\x49\xf8\xb4\x91"
+ "\x17\xab\xe3\x2c\x51\xc7\xa9\xa7\x71\x4e\xa2\x71\x4e\x8d\x18\x67"
+ "\xfc\xa8\x71\x66\xd0\x38\xb3\x69\x9c\x1d\x11\xe3\x8c\x1b\x63\x9c"
+ "\x19\x1e\xb4\x51\x16\x93\x2d\xfd\x83\xf1\x46\x71\xff\x7d\x47\x54"
+ "\xe8\xfe\xbb\x82\x7b\x97\x03\xc2\x07\x51\x03\xf4\x37\xd0\x1b\x41"
+ "\xd6\xc3\x1d\xcf\xf4\xcd\x25\x45\x42\x77\x93\x28\x75\xd3\x82\xbf"
+ "\xda\x11\xb5\x2a\x74\x77\x63\xa7\x88\x5d\xe3\x43\xba\xf0\x19\x90"
+ "\xc3\x84\xee\x71\xf9\xe6\x4d\x0e\x94\x47\x59\xca\x5f\x1a\xba\x63"
+ "\xa6\xd3\xdb\xa5\x2e\x7e\x4a\x1c\x9e\xe1\x0b\x4b\x9e\x09\xf0\x66"
+ "\x71\x26\xb0\x23\x2a\x1c\xff\x69\x23\x6f\x02\x5c\xc4\x7d\x56\x71"
+ "\x1f\x94\x95\xa4\x07\x4a\xb4\x7b\xe9\xbd\x94\xb7\x33\xe2\x5e\x7a"
+ "\xaf\xe8\xc3\x90\xf0\xfd\xb0\x69\x79\x60\x93\xb8\x9f\x3e\xb8\xc3"
+ "\x60\x0c\xb7\xad\x2b\x51\xdb\x36\xe2\xd9\x2b\x7d\xb3\x41\xc7\x66"
+ "\x13\xf6\x36\x3b\x0c\x0b\x34\x1b\x17\x8f\x8e\xd9\xb1\x96\xc7\x8c"
+ "\xf3\xb2\xc3\xb0\x6a\x84\x2f\x28\x5d\x34\xfc\xbc\x23\x3d\x2f\x74"
+ "\xd7\x7c\x87\xa1\xe8\xdb\xee\x9a\x3b\xbc\x34\x4f\xb4\xde\xec\x88"
+ "\x79\xae\x33\x90\x8c\x6b\xae\x11\xb1\x52\x74\xd1\x33\xd0\xcf\x0e"
+ "\x9d\x01\xfb\x87\x45\x9c\x07\xe9\x0c\x5f\xaa\xb4\xd9\xbb\x3c\x18"
+ "\xb0\x78\xa8\x4d\xe1\x5b\x2a\xf4\x6e\x38\x06\x5f\x19\x54\x36\x56"
+ "\xf8\x39\xa7\xfa\x46\xe6\x17\xdf\x8b\x46\xbd\xa7\x8c\x7a\xb7\xf9"
+ "\x88\x66\x8d\x67\xcb\x53\x36\x55\xe8\x78\xab\xcd\xdb\x98\xdd\x71"
+ "\x8a\x45\x11\x2e\x9e\x44\xdf\x5a\xbb\xc5\x3d\x3f\x0b\x77\x26\x33"
+ "\x77\x77\x40\xf2\xed\xc4\x2f\x75\xcc\xa6\x3c\xa7\x58\x22\xee\x99"
+ "\x20\x96\x0c\xe5\xef\x11\xf1\x63\x74\x13\xde\x58\xb5\x61\x12\x53"
+ "\x7e\x9a\x76\x09\xd7\x6f\xa9\x87\x2d\xc1\xcb\x43\x1e\xc4\x60\xd1"
+ "\x15\xee\x62\xd3\x41\xa7\x08\x87\x3b\xb9\xfe\xb1\x7a\x2a\xd3\xfb"
+ "\xd2\x50\x77\xb4\x3b\xf0\x05\xb3\x13\xfd\xec\xd1\x4d\x38\x60\x28"
+ "\x60\x86\x8a\x2e\x16\x47\x78\x16\x38\x12\x58\xc8\x34\x5f\x0f\x35"
+ "\xf1\xd2\x87\x40\x0d\xe1\x64\xae\x95\xfb\x07\x77\x4c\x30\x90\x5c"
+ "\x5b\xa4\xe9\x2f\x4a\xa5\xaf\x37\x03\xb5\xff\x73\xe1\x97\x42\xf2"
+ "\x07\x04\xdb\x09\xb7\xcb\x7b\xa6\x09\x3f\xa5\x32\x0b\x43\xb2\x8d"
+ "\x6e\x42\x93\xe4\x17\xcd\x52\x17\x4d\xef\x47\x48\x3a\x2a\x96\x36"
+ "\x51\x09\x94\x37\x33\x64\x13\x05\x9d\x20\x7d\xa7\x39\x74\x09\xb9"
+ "\xc7\x64\x76\xa5\x07\x8d\xea\x1a\xa7\x74\xda\xb7\x51\x96\xca\x59"
+ "\x44\x9c\xcb\x1d\x13\xea\xc2\xb8\x36\x01\xf6\xcd\x3a\x1a\x93\x89"
+ "\xe6\xf5\x38\xc6\x05\x98\xf8\xe0\xd7\x4d\x17\xed\x39\xb2\x7f\x9c"
+ "\x38\x48\xc6\x01\x16\x10\xfa\xa5\x5b\x16\x12\x3e\x9d\xa6\x39\x98"
+ "\x02\xdf\x56\x6e\x6a\xe7\x68\xed\x10\x3b\x6a\xed\x63\xad\xf4\x8c"
+ "\xbb\x0f\xae\x9f\xfd\x9d\x75\xda\xc6\xde\xcb\x89\x1f\x20\xbc\xe8"
+ "\xaf\x44\x5d\xa0\x35\xb0\x17\x85\x0f\xc2\x56\x2f\xd5\xd5\xc9\x44"
+ "\x1d\x47\x95\x6e\x76\x34\x1f\x32\xec\x7d\x0b\x5b\x6b\xbf\x60\xad"
+ "\xd6\x3f\x89\x76\xc0\x6f\xbb\x72\xfa\x2e\x54\x77\x1d\xd5\x5d\xaf"
+ "\xd6\xdd\x4b\x75\x27\x8c\x5f\xf7\xa2\x8c\x8b\xac\xfb\x22\xfa\xbd"
+ "\x28\xf5\x62\xea\x76\x54\xf3\x20\xd1\xe1\x58\xda\xe3\x4b\xe0\x9f"
+ "\x15\x77\x5c\x83\x03\xf0\x49\x33\x53\xc8\xea\x5d\x3a\xe3\x5e\xd0"
+ "\x1b\x61\x1f\x52\x66\x2c\x16\xf7\x5f\xa1\x67\x57\xef\xbd\xba\x03"
+ "\x27\x19\xf4\xee\x83\x3b\x8c\x25\x61\xbf\x55\xa1\xb3\x71\xa2\x7d"
+ "\xc6\x43\xc2\xd6\xba\xd4\x58\x2c\x71\xcb\xb8\x1a\x75\x8d\xad\x23"
+ "\x8d\x69\x10\x36\xfb\x3a\xe3\x49\x4d\xbf\xd5\x17\x1b\xd3\xa0\xd6"
+ "\x65\x1b\xad\x37\x55\x1d\x09\xd9\xb2\xf2\xf3\x6c\x9b\x72\xd6\xe4"
+ "\x65\x69\x17\xb4\x27\xb1\x15\x59\x0f\x65\xad\xd9\x98\x95\x69\x5b"
+ "\xb9\x21\x67\xdd\xbc\xf5\x0f\x3f\x6c\xbb\x3b\x2b\x37\x77\xf5\x4f"
+ "\xb3\x26\xb1\x95\x39\xab\xd7\xe5\xae\x81\x6e\xd3\x66\x5b\x72\x53"
+ "\x7a\xf6\xfa\xbc\x79\xdf\x5b\x92\x3c\x4a\xb7\x89\xfb\xda\xc7\x21"
+ "\xe3\xd0\xfe\x94\x48\x3c\xc6\x64\xf8\x25\xb2\x6c\xe6\xae\xc7\x48"
+ "\xbe\x26\x1c\xec\xc1\x5e\x88\xfd\x07\xb2\x17\xfc\x1b\xc3\x67\xf2"
+ "\x9e\x9d\xbc\xad\x4b\x37\x6d\x2f\xf1\xed\xed\x94\x06\xff\xc4\xc7"
+ "\xf9\x90\xc3\x2b\xce\xb3\x75\xd3\x36\x53\x9e\xa6\xa7\x28\xcd\x1b"
+ "\x6b\x76\x55\xfc\x95\x19\x24\x8f\x11\xe3\xe7\xfa\x89\xbc\x14\xbe"
+ "\x86\xff\x6e\x65\xaa\x8f\x74\xbd\xdb\xe3\x87\x0d\x91\x71\x79\xc0"
+ "\xc1\x41\x53\xe5\xfa\x8a\x39\x2f\x69\xdd\xf9\x3a\x71\x97\x41\x37"
+ "\xed\xc7\x90\x11\xb7\x23\xee\xe2\x8e\x49\x44\xff\x87\xed\x61\x5a"
+ "\x3d\x45\xe3\xcd\xdb\x09\xee\x9b\x3a\xe8\x5d\xf8\x5a\x99\x30\x69"
+ "\xc1\x08\xfb\x30\x9d\x29\x81\xe9\x2e\x2b\x90\x7f\x54\x46\x77\x59"
+ "\x89\xfc\xc3\x73\xe4\xdf\xb4\xc5\xf2\x6f\x74\xfa\xff\xf4\x4f\x6b"
+ "\xff\xbf\x5d\x87\xff\x5b\xfe\xfe\x89\xf6\xc5\xb8\xff\x3f\x8e\xff"
+ "\x7f\x52\x9e\x16\xc3\x05\xfe\x80\x6f\x84\x5b\xc7\x9f\xfa\x2b\x33"
+ "\x12\x7e\x56\x95\x3d\x48\x38\xfd\x25\xb3\x16\x04\x78\xa7\xe3\x7e"
+ "\x36\xbd\xf0\x14\xf1\x60\xc4\x6b\xe5\xe5\xf3\xce\xc2\x01\x7e\x82"
+ "\xf0\xe6\x13\xc2\xdf\xc6\xf2\x0e\x66\x2a\xeb\x20\x3e\x2b\x4f\xc6"
+ "\x9e\xc1\x79\x13\xee\x79\xb9\xe9\xbd\x65\xa3\x9f\x7d\xec\xfd\x1a"
+ "\x36\x95\xae\xd6\x0c\xa2\x3d\xc7\x19\x03\xfe\x9a\x32\x58\x42\x4d"
+ "\x22\x3f\xcc\x9d\xaf\x64\x72\xfd\x2b\x2b\x29\xed\xd8\xab\x4a\x4a"
+ "\xf4\xab\x5b\x9a\xa3\x6d\x0f\x62\x9f\x37\xbd\xa9\xe2\xe6\xed\xe2"
+ "\x1e\x23\xfd\x02\x07\x55\x1f\xd3\xb4\x3f\x4d\x79\x4b\xee\xe9\x53"
+ "\xca\x54\x7d\x1e\x9e\xc5\xfd\x0d\x1a\x47\x23\x77\x6e\xa9\x47\x9d"
+ "\xaf\x28\x8d\xd1\xd8\x33\x5f\xdd\x92\x12\x5d\xb0\x9a\xe9\x5b\x3d"
+ "\x3d\xec\x08\xd1\x42\x9c\x8f\xd3\xba\x3b\x44\xeb\xac\x7e\x6f\x22"
+ "\xaf\xa4\xfe\x95\x12\x3f\x57\x42\x7d\x3a\x30\xb8\x23\x36\xc9\xa3"
+ "\x9b\x68\x55\x79\x39\x17\xad\x8b\x43\x65\x94\x67\xf9\x06\x36\xb3"
+ "\x8c\xf2\x11\x6f\x57\x02\x19\x45\xf6\x6f\xf2\x2c\x82\x41\x03\xb5"
+ "\xd9\x66\x7b\x00\xef\x66\xc1\x63\xa0\x6d\x1a\x87\xad\x43\x67\x16"
+ "\x32\x3f\xda\xd0\xda\xa5\xfa\x4b\xa8\xfe\x36\xf5\x8c\xb1\x52\xd6"
+ "\x13\xdb\x20\xe9\x58\x8c\x09\x31\x44\xe5\x3d\xb1\x18\x53\xd9\x16"
+ "\xda\xd7\x87\x18\xfc\xe0\x56\x51\x1b\x2e\xcb\x36\xc6\x2d\xb8\x63"
+ "\x7c\x3c\x40\x72\x8d\x22\xed\x77\x75\xe6\x5d\xb2\xac\xe4\x43\x04"
+ "\xef\x11\x24\xfe\x5e\xe8\x67\x88\xff\xc8\x26\x3a\x41\x3c\x87\xb8"
+ "\x9f\x41\xfc\x06\xd2\xa9\x8d\x2a\x1a\x57\x1b\xc9\xcd\x0d\xb4\x77"
+ "\xd7\x83\x57\x78\xa0\xff\xdf\x18\xce\x38\xc0\x2f\xe4\xe6\x73\xbf"
+ "\x88\x2b\xb5\xc3\xbc\x40\xe3\x17\x80\x1f\xe0\x11\xca\x1e\x60\x86"
+ "\x61\x9a\x63\xc2\x91\x66\xe2\x3f\x88\xa7\x37\xdb\xd5\xb9\x69\x16"
+ "\x7c\x81\x1a\x47\x5a\xd2\x70\xf3\x56\xda\xdf\x4d\xd4\x46\xb3\x47"
+ "\x37\x4d\xc0\x42\xd2\x20\x73\xa9\xb6\xd7\x43\xe7\xe0\xa1\x3a\x38"
+ "\xd1\x3a\x82\x5b\xc3\xdc\x0c\x1d\xf3\xe8\x62\x8f\xd1\x5c\x34\x20"
+ "\x2f\x95\x37\x50\xfe\xc3\xb4\xef\x2f\x56\xe7\xe4\x38\xc9\x04\xc4"
+ "\x07\x98\x97\xa0\x1f\x54\xa6\x85\x60\x4d\x6d\xc5\xf9\x54\x3a\x76"
+ "\x4c\xf2\x30\x71\x5f\x6a\xb0\xa7\xb9\x2e\x0e\xc3\xdf\x62\x8c\x84"
+ "\x3f\xc1\x42\xca\xe5\xba\xb8\x27\x22\xe6\x8e\xe4\xd2\xb8\x0c\xe8"
+ "\xa1\xa9\xbd\xc3\x42\x87\xa6\xb3\xdc\x0e\xdf\x6f\x84\x33\x87\x09"
+ "\x16\x87\x29\x5f\x23\x68\xf3\xf6\xbf\x12\xcd\x7d\x10\x3c\x54\xdc"
+ "\x5d\x92\x47\xb5\x74\x03\x87\xbb\x74\x96\x4f\xf0\xde\xa9\x33\x2f"
+ "\x45\x7d\xf4\xfe\x26\xfd\x12\x2f\x6b\x79\xcd\x51\x83\xf8\xc6\x31"
+ "\xf0\xc9\x37\x49\x9d\xeb\x34\xea\x57\x9d\x76\x07\x0a\x38\x80\xb9"
+ "\xa7\x31\x0a\xfd\x83\x47\x67\xa9\x83\xae\x51\x94\x1b\xce\x46\x1f"
+ "\x8f\x63\x7d\x6a\xdf\x29\xbd\x1b\x3e\x73\x23\x60\xb3\x54\x9d\x93"
+ "\x46\x11\x2b\x54\x17\x77\xbb\xec\x5b\xdc\x74\x7a\x37\x52\x1f\xc4"
+ "\x39\x44\xdf\x70\x76\x54\x05\xca\x14\x86\xcb\x60\xfd\x10\x2e\x5b"
+ "\xa8\xcc\x77\xe9\x97\x6b\x79\xe1\x37\x9f\xfa\xe1\x7a\x16\xbe\xcb"
+ "\x74\x96\xf6\xbe\xe1\x24\x3d\xb5\xeb\xa7\x76\xf5\xc0\x0d\xe0\x85"
+ "\x56\x47\x85\x84\xd1\x21\x9a\x3f\x81\x5f\x47\x02\x8d\x04\xf7\x38"
+ "\xe2\xff\xfd\x69\x92\xbf\xb3\xb8\xd4\xfe\xb9\xc4\xf9\xe0\x04\xa3"
+ "\xb7\x56\xfa\x19\x42\xbe\x50\xfc\xd7\x30\x9f\x69\x81\x9f\x21\x23"
+ "\xd5\xd5\xa2\xe2\x84\x85\xf2\xb5\x85\x70\x08\xfe\x0e\x74\x71\xa9"
+ "\xe0\x35\xd5\xfe\x03\xf7\xee\x92\xb0\x33\x7b\x81\x03\xc4\xc7\xbb"
+ "\xe4\x3c\x9b\x97\x82\x57\x95\x78\x38\x39\x41\xab\x43\xf8\x4c\x20"
+ "\x38\x2b\x54\x87\x86\x2b\x91\xb4\x81\xf2\xa6\x10\x5f\x1a\xc2\x1b"
+ "\x8d\x16\xc8\x3a\xe3\x37\xab\x7c\xc8\x42\x9a\x1b\xf8\x6b\x77\x09"
+ "\x3f\x58\x02\x2f\xe3\x97\x1d\xf1\x05\x40\x5f\x8f\x51\xbf\x88\x26"
+ "\x4c\x3e\xd8\x67\x9e\x62\x0d\xe3\xf6\xe4\x6a\x0d\xb7\x23\xe6\x55"
+ "\xe0\x76\xb1\xa0\x47\x93\x1b\x3d\xec\x5f\x3b\x35\xdc\xc7\x3a\x57"
+ "\x68\x5d\x57\x6c\x14\xe7\x03\x16\xe8\x03\xc5\xba\xf7\xf7\x0a\x19"
+ "\x03\xf3\xd9\x9a\xdf\x29\x7c\xe4\x6f\x57\x98\xb1\xd5\x77\x12\xfa"
+ "\x91\x1e\xac\x7f\x6d\x8d\x63\x6e\xa8\x2d\x17\xe2\x18\x14\x13\x0d"
+ "\xc4\x1a\xf4\x51\x9f\xe8\x9b\x11\x3e\xe1\x9a\x56\xa5\xb0\x5c\x9a"
+ "\xdb\x23\x19\x98\xb7\xf8\x85\xda\x9d\x8b\x0a\x49\x03\x4c\x2a\xbe"
+ "\x88\x3e\x8e\x82\xab\x45\xc2\x35\x7e\xed\xc8\xf5\x1d\x67\xc2\xfa"
+ "\x8e\x84\x2b\x60\x0a\xd8\x52\x5e\x1a\xff\xc4\x3c\x0d\xae\x61\x98"
+ "\x4e\x89\x51\xf1\x51\xa5\xad\xf1\x63\xd2\xd6\x0a\x19\x33\xa2\x71"
+ "\x3b\xc6\x42\x7b\x0a\xda\x17\xf1\xb0\x54\xd9\xa7\xc9\x0b\x9c\x8a"
+ "\x0f\x78\x58\x41\x8a\x46\xc7\xa8\x3f\x2b\x81\x4f\x98\x2b\x8d\x76"
+ "\x40\x57\x26\xfb\x3e\x25\x49\x9b\x0f\xf4\x3b\x92\x26\x50\x9f\x84"
+ "\xbd\x57\x78\xcc\x53\x7e\x4c\xe5\xe2\x41\xdb\xc2\xfc\xd5\x94\xec"
+ "\x91\x63\x9f\x92\x8a\xb1\x03\x27\xec\x1b\xa1\x2f\x93\x7b\x99\x47"
+ "\x67\x3a\x3e\x92\x5e\x99\x3e\x11\x76\x19\x2a\x3f\x06\x7a\x6f\x7f"
+ "\x40\xe6\xc7\xfe\x46\xf9\x85\x6e\x5e\xdd\x0f\x53\xb0\xff\x51\x5a"
+ "\xb3\x0a\x83\xe3\x94\xbf\x09\xf7\xb8\xe1\xcb\xe7\x92\xe3\x52\x16"
+ "\x24\x1a\x7d\x18\xb1\x33\x28\x5f\x49\x2b\xc9\x01\x81\x09\x8c\xd5"
+ "\xa8\xfc\x26\xe8\x04\xdf\x94\x76\xc9\xa6\x6e\x16\x63\xff\x1e\xff"
+ "\x7b\x97\x2e\xe1\x71\x5a\x47\x7e\xf8\xcb\xa4\xba\x6d\x5d\xba\xcb"
+ "\xb2\xa8\xdd\x04\xf5\xd7\x4a\xbf\x77\xd3\xef\xe5\xf4\x7b\x33\xfd"
+ "\x4e\xa3\xdf\x19\x94\x5f\x51\xf3\x27\xd3\x7b\x34\xa5\xdf\xa4\xfe"
+ "\x52\x1f\x13\x70\x9e\x9d\xfa\x14\xf8\xca\x07\x90\x9e\xf8\x39\xde"
+ "\xe9\xf7\x43\x75\xdc\x2d\x72\x6d\x27\x1c\xa4\x7a\xf2\x91\x0f\xfb"
+ "\x1a\xa5\xd9\x29\x4f\x19\xea\x86\x5f\x05\x7a\xbe\x3d\x82\x3f\xa5"
+ "\x7a\x2e\x7d\x94\x7e\x17\xd0\xef\x0d\xf4\x9b\x47\xe5\xe1\xcf\x33"
+ "\x95\x60\xd0\x16\xa6\x17\xe6\xa5\x99\xf9\x72\x3e\x69\x0e\x9b\xb0"
+ "\xde\x35\x7a\x00\x7c\x1a\x91\x6f\x95\xcc\x27\xe5\xd7\x4b\x67\x6b"
+ "\x73\x17\x10\x73\x67\x69\x0f\xd0\xdc\x51\xfd\xb7\xa3\x3c\xfd\xde"
+ "\xa1\xfe\xa6\xa8\xbf\x77\xaa\xbf\xff\xaa\xfe\x2e\x51\x7f\x97\x7a"
+ "\x74\x09\x3e\x95\x37\x21\x98\x25\x08\x3d\x39\xad\x5d\xb5\xdd\xc4"
+ "\x24\xc8\xd7\x44\xff\x6f\x46\x1c\x47\x6a\xb7\x46\xd3\x5b\x43\xf7"
+ "\x33\xbc\x23\xe6\x92\x3d\x42\xf7\x73\x69\x43\x04\x2d\xac\x34\xe9"
+ "\x52\x18\xf1\x4e\x13\x6a\xf4\xbc\x52\xad\xc7\xa4\x57\xcf\xeb\x11"
+ "\x0f\x06\x71\x35\xe1\xa7\x50\xc8\x51\xb1\x2b\x0e\x60\xbd\x0a\x9d"
+ "\x7e\x19\x7c\x14\x99\xab\xe8\xaf\x8e\x64\x8a\xfd\x1a\xbd\x87\xbc"
+ "\x24\xe5\xfc\x89\x7f\x1a\xdc\x91\x68\x0b\xcb\xf9\x97\xb6\xc9\xb3"
+ "\xcd\xcb\x7e\x4e\xe9\x11\xf2\xff\xa5\xf0\xd1\x75\x33\xc1\xba\x9d"
+ "\xc6\xb3\xa0\x43\x97\x98\x41\xbf\x37\x76\xca\x31\x27\x6b\x63\x56"
+ "\xe7\xca\xae\xc1\xbc\x53\x97\x10\x20\x7a\x98\x03\xfc\xee\x08\xd1"
+ "\xe5\x84\x00\x7e\x55\xfc\xa1\x79\x4e\x78\x19\xf3\x1d\x41\x4f\x52"
+ "\xc2\x74\x3a\xf1\xf0\xc8\x79\x31\x1f\x0e\x48\x7e\xa1\x9d\xd6\x25"
+ "\x70\xa0\x78\xd4\xba\x4c\xc5\xba\x54\xcb\xfa\x47\xd2\xf8\x29\xa9"
+ "\xa0\xf1\x6a\x1f\x09\x6f\x13\x32\x31\x37\x1e\x5d\x62\xbb\xba\x27"
+ "\x21\x26\xc3\xcd\x94\xbe\x4c\xf6\x53\xa6\xab\x6d\x11\xfe\x25\x2c"
+ "\x01\xfe\x6b\xe9\x2a\x7e\xa3\x9e\xc5\x98\x6b\x2d\x5d\xad\x9f\xf0"
+ "\x34\x61\x01\xd6\x8f\x96\x2e\x71\x72\x72\x29\xe8\x0d\xca\x06\x84"
+ "\x2d\x23\xc9\xdf\x0f\x34\x51\xbf\x2f\x6b\x24\xfe\x02\xf7\xc4\x8f"
+ "\x6f\xdf\xc2\x4c\x9b\xaa\x59\xac\x5c\x9b\x97\x7d\xae\x95\x15\x3a"
+ "\xfd\x1d\x97\xb5\x68\x34\xaa\x42\xd0\xb3\xf8\x94\x91\xb4\x72\xea"
+ "\x1a\xee\xb4\x04\x02\x26\x73\xe9\xd1\xc0\x02\x41\x73\x69\xdd\xd7"
+ "\x0c\xee\xb0\x1a\x3c\xec\x95\x38\x75\x2f\x69\x11\xbc\x9a\xce\xfa"
+ "\xdd\xa3\x75\x92\x76\xc9\xba\xad\x21\xfa\x17\xc1\x87\x08\x5a\x8f"
+ "\xb6\x50\x17\xed\x2b\x71\x3e\x47\xda\x25\x92\x7e\x5b\xd3\x3c\xec"
+ "\xca\x04\x8d\xb6\x62\x7f\xb2\xe8\x98\xbd\xfc\x01\xb9\x3f\x29\xd0"
+ "\x81\xd9\x7d\xc2\x3f\x5d\xab\xbd\x97\x61\xdf\x84\xff\xef\xf4\xcd"
+ "\x93\xe0\xb3\x2a\x8d\xfa\x7a\x37\xf1\x67\xfb\xd5\xb3\x19\x92\x73"
+ "\x2f\x0f\x42\x96\x55\xe1\x4a\xeb\xe9\xf2\x13\xea\xbc\x1c\xa7\xfe"
+ "\xec\x07\x6d\xdf\xbe\x51\xc6\x54\x82\x3e\x48\xc4\xf8\x02\xcf\x6a"
+ "\xe5\x7e\x11\xcb\x60\x87\xb5\x3b\x42\xc7\x25\xed\xce\x74\x97\x1d"
+ "\x15\x31\x2a\x4a\xcd\xa5\x52\x9f\x78\xf9\x06\x99\x7e\x79\x9a\xb4"
+ "\x43\x30\xab\xeb\xe9\xf2\x25\x51\xd6\xc4\xbf\x08\xfd\xeb\x84\x98"
+ "\xab\x25\x3f\x72\xf9\xc2\x08\x9b\x1f\x01\x6b\xe1\xe7\x78\xc7\xe5"
+ "\xa9\xe1\x75\x71\xf9\x6c\x94\xa1\xb2\x3d\x94\x9e\xad\xa5\xcb\xbd"
+ "\xc6\xbc\x58\xd5\x99\x55\x5e\xb2\x2d\x85\x11\x6d\x9e\xb0\xc7\xa9"
+ "\xad\xdf\xcb\x9b\x65\xfb\x72\xfd\x62\x8c\xc0\x07\xac\xe1\x80\xf0"
+ "\x2b\xb6\x42\xf8\xc2\xa1\xe7\xaa\x80\xb6\x76\x25\x7f\x27\xee\x9c"
+ "\xc9\x75\x7b\x79\x7b\x44\x3f\x2a\x55\x5c\x3d\xde\xf7\x90\xd5\x44"
+ "\xdf\x7c\x1e\x9d\x51\x9e\x65\xe9\xac\x52\xc6\x78\x62\xa0\x4d\x19"
+ "\xe0\x7e\xe8\xa6\xa1\x4f\x80\xce\x46\xb5\x57\xc5\x59\x89\x0f\xbe"
+ "\xd2\x2a\x69\x3d\x84\xfd\xa3\xc5\x31\xcd\x3f\xda\xe0\x8e\xa9\x4b"
+ "\xc2\xba\x63\xeb\x7e\x75\x5c\xa5\xd4\x5e\x8d\xab\xf0\x3d\xe0\xd2"
+ "\x73\x72\x8d\x59\xab\x80\xc7\x6e\xc2\x3d\xda\x7f\xaa\x8f\x14\x88"
+ "\xb2\x45\x1a\xee\xd1\x1a\xcd\xec\xd2\x4d\x9b\x5c\x95\xc8\xab\x69"
+ "\x4e\x61\xb7\xbf\x96\xf0\x20\x48\xbf\x99\xf2\x57\x17\x87\x5f\x15"
+ "\xe7\xab\xa9\x2c\xad\xff\x59\x8d\xda\x1c\xf8\x62\x17\xd5\x0b\x1c"
+ "\x2b\x84\x7d\x63\xb2\x38\xeb\x07\x8e\x01\xbf\xc4\x99\x3f\xe1\x9a"
+ "\x65\xdb\xbf\x31\xe0\x99\xf0\x99\x42\xef\xe8\x2f\xf0\x6c\x70\xc7"
+ "\x34\xa3\xe6\xf3\xd8\xa3\x9b\x2a\xcf\xdb\x76\x4c\x9b\xae\xd9\x86"
+ "\x03\x0f\xf3\x66\xb1\x4b\xa9\x7e\x5b\x93\xcd\x07\xdd\xf9\xdf\xdc"
+ "\x81\x3b\x19\xf2\x02\x76\x92\x5e\x5e\xd6\x44\x65\x22\xe6\xdf\x2c"
+ "\x6c\x59\x8f\xac\x12\xfa\xcc\x29\xf4\x6d\xed\x48\x9a\x13\xe3\x17"
+ "\x7c\x25\x51\xc7\xab\x12\x18\xce\xe9\x69\xaf\x99\x56\xa9\xf1\xc3"
+ "\xf3\x29\x8d\xf2\xa0\x7f\x90\xc1\xdb\xe8\xb9\x12\xfb\xf4\x38\x7a"
+ "\xe7\x05\xd0\x15\x81\x66\x40\xf7\x04\x3d\x18\xc1\xfa\x58\x97\x6e"
+ "\xe6\xe4\xa3\xf0\x5f\xb4\xfe\x9b\x7e\xaf\x0b\xf3\x79\x3f\xfc\x69"
+ "\xd9\x72\xd8\x94\x0e\xdd\x15\x3e\xe8\x9d\x1c\x5f\x43\xc7\x33\xdd"
+ "\x3a\x52\xc7\x33\x3d\x5b\xfd\x2b\xa0\x3f\x4f\xf8\x6f\x86\x5d\x7d"
+ "\xee\xbd\xf0\xdf\x8c\x12\x99\x77\x46\x15\xfd\xd5\x49\x58\x59\x69"
+ "\xad\x4c\x2f\xd0\x60\x05\x9a\x02\x1a\x0b\x3b\x1b\xac\x73\x5d\x80"
+ "\xc1\x5f\x12\xcd\x13\xf5\x7b\xfb\xb5\x2b\x5c\x5b\x20\xd3\x4e\x17"
+ "\xb1\x0b\xe0\xbf\xf8\xa2\x6c\xbd\x74\xd3\xc5\x7c\x0a\xff\xb2\xba"
+ "\xe9\x76\x6a\x3b\xa1\xe2\x0c\x33\xd8\x73\xd8\x0c\xe8\xd0\x2d\x41"
+ "\xee\x82\x0c\x0c\x9c\x20\x18\xb4\xf5\xe8\x66\xfc\x3c\x6f\x2b\xd3"
+ "\xd3\xf7\x99\xf4\x9c\xa1\xf1\x52\x54\x26\x2e\xca\xcf\x12\xc0\x43"
+ "\xdd\xb1\x95\xcd\x1c\xdc\x31\x63\xb1\x36\x57\xe0\x33\xa0\xc7\x0b"
+ "\xc5\xbb\xd2\x4d\x17\xb6\x00\xf0\xe5\xef\x01\xdc\x34\x5a\x75\x06"
+ "\xba\xeb\x19\x49\x51\x3e\x16\x27\xf7\xa1\x19\x45\x34\xaf\x29\x12"
+ "\x5f\x66\x2c\x21\xdc\x3f\x16\xd1\xcf\x7f\x89\x78\xde\x81\xf2\x16"
+ "\x1f\x78\xb8\xf1\xe0\x33\xe3\xa8\x06\x9f\x0a\xe1\x03\x94\xd9\xc5"
+ "\x7c\x07\x78\x2f\xf5\xad\xc5\xbe\x85\x19\x7b\x74\x57\xbc\x45\x63"
+ "\xc4\xdd\xe0\x66\xa9\xe3\xbf\xe2\x35\x4d\x4e\x97\xfd\xbe\x62\xab"
+ "\x65\x5b\x14\x83\x6e\x1e\x3e\x23\x85\x2d\xe6\x59\xab\xd0\xc7\xbb"
+ "\x03\x8b\x99\xab\x70\x11\xf2\xdc\xa5\xee\x65\xc7\xfb\x1c\x56\x76"
+ "\xc4\xba\x98\xd6\xf1\x15\x4b\x3d\x7a\xb6\xf2\xa2\x6d\x5e\x75\x57"
+ "\x2c\x55\xe1\xdb\x22\x6c\x45\x74\x57\x5c\x8e\xbd\x04\xba\x01\xda"
+ "\x47\xc0\xa3\xc5\x53\xdd\xfb\xb5\x75\x43\xfb\x44\x13\x95\xb1\x4a"
+ "\x3d\x66\x7f\x2a\x3d\x27\xc0\x6f\x8d\x90\x1f\x64\x7e\x93\x3c\x37"
+ "\xb8\xa2\x3d\xc4\x6f\x53\x3e\x94\x13\x36\x84\xba\x19\xbd\xe9\x41"
+ "\xe8\x12\x66\xf4\x62\x6c\x2a\x2e\xd2\x7e\x35\xd3\x18\x5e\xb7\x33"
+ "\x96\x88\x75\xdb\x1b\xb9\x2e\x67\x26\x85\xe5\xd4\x69\xc7\xe7\x55"
+ "\x31\xdb\x58\xeb\xd0\x6e\xc6\x5e\x35\x73\x57\x45\x05\xaf\xab\xd4"
+ "\x2b\xdf\xdf\x5e\xce\x4c\xba\x52\x02\x1b\xd6\xd9\xc6\x8c\x4b\x69"
+ "\x3d\x1e\xb4\x98\x2e\x4b\xbd\x23\x6f\x22\x2f\xb4\x32\x7d\xd9\xb9"
+ "\x89\xc6\x59\xfe\xcb\xea\x78\xd4\xb5\x2b\xee\xce\xc3\xd9\x77\x25"
+ "\xfb\x6a\x2d\x8b\xba\x83\xa8\xdc\x55\x26\x66\xf7\xe8\x66\x35\xe0"
+ "\x9e\xfb\x11\x13\x78\x91\x59\x0d\xa8\xb3\xa0\x86\x19\x0b\x3a\x79"
+ "\x77\xe9\xc3\xd1\x46\xda\x7f\xe3\x68\xdf\x28\xb9\xc4\x74\x59\xdd"
+ "\x30\xd5\xf1\x6e\x86\x28\x57\x3f\x7e\xdf\x6c\x37\x8f\xdd\x37\x7b"
+ "\x62\x97\xce\x76\xe7\xc5\xf5\xed\x4a\x5f\xb8\x6f\x57\xfa\xfe\x17"
+ "\xfa\xf6\x49\x44\xdf\xe2\xc2\x7d\xcb\x46\xdf\x4e\x5c\x5c\xdf\x66"
+ "\x2f\x08\xf7\x6d\xf6\x82\x7f\xb2\x6f\x87\xc6\xef\xdb\xac\x47\xc7"
+ "\xee\x5b\xfe\x65\x5d\xba\x59\x5b\x2f\xae\x6f\x73\xf2\xc2\x7d\x9b"
+ "\x93\xf7\x3f\xe9\x5b\x61\x0d\x3f\xd9\x3a\x9d\xc1\x9f\xa6\x09\x74"
+ "\xbe\x4b\x77\xe5\xb6\xad\xd3\x85\x1d\x77\x3c\x3d\xdf\xec\xa8\xe1"
+ "\x7f\x97\xbc\xcd\xac\xf3\x72\x4f\x9b\xe5\x25\xfc\x95\x76\x25\xba"
+ "\x2b\x3d\xc2\xce\x25\x6a\xea\x01\xee\xe4\x81\xeb\x7d\xb0\x19\x0c"
+ "\xc0\xb7\x0b\x7c\xc1\x37\xbf\x3a\xe0\x47\x1c\x8e\xf6\x7d\xe7\x0c"
+ "\xec\xd5\x01\xaf\x7e\x70\xc7\x95\x73\x35\x7f\xae\x5a\x59\x4b\xf5"
+ "\x85\xe8\xd1\x95\xab\xef\xc8\x66\x16\xd0\x23\xfc\x22\x9e\x66\x45"
+ "\xe1\x44\xe3\x1d\x5f\x63\xdf\xbf\x32\x5f\xbb\xaf\xab\xd5\xb5\xbc"
+ "\x7b\x22\xb7\x14\xb0\x28\xdc\x19\x16\xbe\x1f\xad\x5e\x36\xbb\x80"
+ "\x45\x2f\xcf\xa7\xfa\xfd\x2c\xc3\x92\x4f\x75\x13\x3c\x24\x2f\x7f"
+ "\xe5\x5b\x51\x6b\x99\xa9\x8a\xea\xc6\xef\x1d\x56\x07\xdf\xbe\x8b"
+ "\x19\x70\xb7\x18\x77\x84\xe5\xfd\xe0\x09\x46\x6a\xc7\xa3\xb5\xf3"
+ "\x2d\xf0\x33\x4b\xf8\x5d\xf5\x6e\x18\x7e\x57\x6d\x08\xc3\xef\xaa"
+ "\xef\x4a\xf8\x5d\x95\x1c\x86\xdf\x6c\xdb\xc5\xc1\xef\xaa\xb5\x61"
+ "\xf8\xc9\xb2\x17\x86\xdf\x55\x2f\x8c\x0f\xbf\xab\x1a\xc3\xf0\x93"
+ "\x75\x8d\x03\xbf\x09\x63\xc3\xef\xaa\xe0\x3f\x07\xbf\xd9\xb6\x7f"
+ "\x12\x7e\xb1\x12\x7e\x73\x74\x61\xf8\xcd\x7e\x23\x0c\xbf\xd9\x9b"
+ "\x25\xfc\x66\xdb\xc3\xf0\x9b\x93\x71\x71\xf0\x9b\x7d\x28\x0c\x3f"
+ "\x59\xf6\xc2\xf0\x9b\x7d\x62\x7c\xf8\xcd\xf6\x87\xe1\x27\xeb\xba"
+ "\x38\xf8\xcd\xb9\x95\xe0\x16\xa7\xc2\x2f\x6e\x7c\xf8\xcd\xc9\xf8"
+ "\x27\xe1\x67\x91\xf0\xbb\xfa\xf6\x30\xfc\xe6\xf4\x87\xe1\x37\xe7"
+ "\x4d\x09\xbf\x39\xf5\x61\xf8\x5d\x5d\x77\x71\xf0\x9b\xd3\x1b\x86"
+ "\x9f\x2c\x7b\x61\xf8\x5d\x3d\x6b\x7c\xf8\x5d\xbd\x30\x0c\x3f\x59"
+ "\xd7\x38\xf0\x9b\x38\x36\xfc\xae\xde\xfa\xcf\xc1\xef\xea\xba\x0b"
+ "\xc1\xef\xe2\x78\x8d\xab\xc7\xbd\xff\x7e\x91\xf5\x04\xc6\xab\x07"
+ "\x30\x84\x7d\xa2\xb2\xe3\xea\x40\xad\x32\xc1\x28\xef\x70\x5c\xdd"
+ "\x40\x32\xcc\x6d\x1d\xba\xef\xdc\x55\xab\x44\x1b\xb9\xf3\xef\xc7"
+ "\x15\xe7\xc9\x62\xbe\x6d\x82\x41\xd9\x36\xd1\x00\x7f\x06\xe3\xc6"
+ "\x5c\xd7\x7d\xe7\x60\xd4\xe5\xec\x0a\xdc\xd7\xdb\x4e\xfc\x1a\x9e"
+ "\x07\x77\x7c\xa7\x81\x78\x91\x94\xd1\x30\xc9\x5c\x93\x2b\x82\x7d"
+ "\xe6\x64\x65\x6e\x58\x97\xb9\x7a\x5d\x9e\x6d\xf5\x43\x8f\xe4\x8e"
+ "\xf4\xa1\x2f\xe2\x64\x16\x63\xfe\xbe\xe3\x0f\xf9\x98\x71\xf2\x7c"
+ "\xf8\xea\xb3\x5f\x09\xdb\xb4\xa4\x85\x22\xae\x81\xd9\xb2\x84\x0f"
+ "\xa7\xed\x4e\xb9\x8a\xbf\x23\x7c\x10\x0e\x67\xef\x26\x79\xaa\x17"
+ "\x7e\x65\x54\x7f\x85\xbd\x5d\xba\x6b\x7f\xc0\x63\xa7\x34\xc2\xa6"
+ "\x43\xdc\xed\xd0\x25\x69\x77\xb0\x9a\xb9\x29\x66\x89\x52\x3a\xa5"
+ "\x91\x97\x4d\xa9\x07\x0c\x5a\xe1\xff\x6d\x63\xd4\xcc\x0e\xdd\xdc"
+ "\x04\x1e\x1b\xb3\x84\x97\xc6\x2c\x55\xcf\x38\x96\xc2\x5e\x34\x65"
+ "\x0b\xff\x1b\xea\x53\x79\x41\xc4\x2d\x71\x49\x7e\x30\xe9\xa8\x65"
+ "\x9b\x2d\x0a\x79\xe1\x87\x11\xfe\x09\xb5\x58\x55\xe8\x37\xf2\x12"
+ "\x3f\x7e\x1b\x95\xbf\x0d\xb1\x3a\x43\x75\xc8\x3e\x4d\xe9\xd1\x5d"
+ "\x63\x10\x63\x29\x35\x7a\xfb\x1e\x4b\xdb\x2d\xe2\x45\x0a\xb8\x5e"
+ "\x77\x9e\xc6\xe0\x15\x71\x3e\x03\x67\x45\x9c\x4f\xb5\xcc\x0c\x2a"
+ "\x23\xe8\x29\x7c\xaf\xca\x3a\xae\x3b\xa1\xf5\x8b\x78\xe8\x49\xf4"
+ "\xfe\x61\x44\x1b\x97\xd0\xfb\x6b\x11\xdf\x4d\xf4\xfe\x1c\xf1\xa1"
+ "\x93\xd5\xef\xb1\xf4\xbe\x19\x7c\xa9\x8c\x91\x59\x24\x6d\xa2\x75"
+ "\xd7\xad\xa2\xb4\x38\x35\xcf\x64\xca\x73\x3b\x78\x5d\xb5\x8e\x78"
+ "\x7a\x9f\x03\x99\x51\xfd\x9e\x40\xef\x31\x38\x17\x50\xbf\x5f\xda"
+ "\xa3\xbb\xf6\x34\xbd\x7f\x47\xfd\x4e\x7c\xfd\xb5\xc2\xd7\x16\xc1"
+ "\x7d\x31\xc6\x44\xb0\xaf\x06\xdc\x09\xd6\x8b\xb9\xc9\xd8\x4b\xf2"
+ "\xaa\x03\xf3\x88\x71\xba\xb6\xf4\xb0\x0e\xdd\xb5\x97\xe3\x5e\x9e"
+ "\x9c\xab\x29\x8d\xd2\x3f\x90\x3e\x8d\xd2\xad\x48\x87\x6d\xb9\x52"
+ "\x36\xa5\x1a\xcf\x04\xd3\xd7\x00\x43\xb5\x2d\x92\x89\xae\x4d\x51"
+ "\xe7\x99\x60\x07\x1f\xbe\xac\x68\x9f\x3a\x17\xd4\xb7\x89\xf4\x7d"
+ "\xaf\x7a\xee\x91\xbd\x3c\x30\x2c\xef\x17\xe9\xae\xcd\xfe\x6f\xf9"
+ "\xac\xa0\x72\x92\xee\x5d\x7b\x40\x8b\x61\x48\x69\xc2\x57\x06\xf0"
+ "\x13\xfa\x15\x6f\xac\xb1\x5d\xf8\x68\x21\x1c\xd5\x70\x05\x78\xc2"
+ "\x27\x7c\xc7\x25\x75\x35\xd7\x86\xee\xff\x52\x59\x9b\x1a\xf7\x81"
+ "\x49\x39\xe1\x3a\x16\xb6\x2f\xba\x46\xd0\x87\x88\x6f\xd3\x23\xbe"
+ "\x69\x7e\x09\xa5\xcf\xa9\x1d\xd7\x2d\x8c\xf8\x56\x35\xea\xdb\xca"
+ "\x88\x6f\xc5\xa3\xea\xb4\x47\x7c\xcb\x1b\x55\xae\x34\xe2\x5b\xc6"
+ "\xa8\x6f\x07\x22\xbe\xa5\xaa\xdf\xa2\x28\xdd\x15\xf2\x91\xa8\xbb"
+ "\x26\x45\x4d\x27\x5a\x7f\x5d\x7b\x44\x7a\xb2\x9a\x8e\xf6\xbd\x1e"
+ "\xf6\xe7\xe3\x6a\xba\xc0\x73\xc2\xa3\xab\x65\x1b\x73\x4d\x11\x6d"
+ "\x30\x39\x87\xc6\x76\x39\x7f\x49\xf9\x16\x9d\x6d\x22\x70\xca\xb2"
+ "\xad\x08\x31\x84\x2a\xa5\x3f\x30\xb9\x0e\x45\x1c\x6a\xc4\xca\xa5"
+ "\x7c\xe3\xd1\xc6\xb1\x6d\x04\xe7\x16\x69\xf7\x58\x83\xa5\xc6\xe3"
+ "\x4a\xa9\x05\xe7\x23\x33\xe1\x37\xcc\xd1\x0b\xdf\x31\x5a\x4c\xc2"
+ "\x21\xe6\xce\x1b\x2c\x6a\xf5\x8b\xfb\xb6\xb8\x0f\x61\x86\xdf\xb3"
+ "\x56\xa1\xdf\x39\x2d\xe3\x12\xe2\x7e\x6f\x99\xf1\xf8\xa6\x5e\x36"
+ "\xdd\xfe\x3d\xde\x09\x39\x4f\xd2\x84\xb9\xa0\x27\x16\x95\xa6\xed"
+ "\x12\xb6\xde\xba\x79\xc9\x48\x73\xf7\x0a\x3d\xb3\xb1\x4b\x37\xaf"
+ "\x48\xfb\x2e\xc7\x3b\xaf\x48\xc8\xd2\xea\xbd\xc2\xc1\x1d\xf3\x92"
+ "\x42\x71\x33\x75\xf3\x8a\xfb\x63\x13\x93\x28\x6d\xf1\x48\xfb\xc6"
+ "\x79\xf7\xa2\x4e\x8c\xc3\xa3\x9b\xeb\x47\xdd\x94\x27\x23\x64\xdf"
+ "\x48\xe9\x9b\x02\x6c\x2a\xf5\xad\x4b\xab\x9f\xbe\x93\xfc\x3f\x57"
+ "\xc8\x95\xa8\xb3\xbf\x6c\x71\x1a\xa5\x55\x79\xf4\x9f\xdb\xa4\x7d"
+ "\xe4\xbc\x3a\x0f\xeb\x48\x1e\x6f\xff\x13\x3a\x49\xd3\x94\x36\x5e"
+ "\x3a\xa5\x9d\xd6\x7c\xb3\xf4\x03\x30\xa5\x4d\xca\xf2\xf3\x4e\x23"
+ "\x16\x19\x62\x78\xe3\xdc\x51\xd2\x9d\xeb\x85\x3d\x04\xd2\x08\x36"
+ "\x07\x88\x3e\x0b\xfd\xf3\xc5\xad\xc9\x79\x62\xff\x83\xef\x26\xdc"
+ "\xb9\xc0\x1d\x8e\xc1\x1d\xd7\x2f\x0d\xc5\x7a\xd0\xee\x13\xe8\xae"
+ "\xff\x39\x74\x7c\x15\x8a\xec\xe3\xe8\x3e\xa0\xbf\x54\x57\xef\xb8"
+ "\x7b\xa9\x69\x8a\xd4\x83\x96\x9b\x65\x6c\x59\xdd\xf5\x6f\x46\x59"
+ "\xa7\x75\x53\x5b\x0d\xa1\x18\x17\x94\xa7\x1c\x36\xc1\x54\x7f\x68"
+ "\x9c\x39\xa2\x8d\xe3\x52\x4f\x7f\xbd\x97\xe8\x58\x73\xc5\x10\x33"
+ "\xa8\xe9\xde\xd6\x80\x1f\x77\xeb\xc7\xf4\xc1\x85\x3d\x52\xf8\x6f"
+ "\x2a\x9f\xd2\x8c\xfb\x13\xf3\xfd\x5a\x9f\xe7\x7b\x61\xb7\x8f\x3e"
+ "\x4b\xd8\xce\x3f\xa9\xc1\xb1\xec\x1c\xd5\x5d\xf8\x05\xeb\xd4\xcd"
+ "\x7f\x14\xf6\x2d\x02\x26\x5b\x34\x9b\xab\xf9\x8f\x8a\x7c\x43\xa1"
+ "\x3c\x42\xdf\x01\x7b\x5f\xc0\xa9\x16\x7e\x07\xa8\xce\x72\x9a\x0b"
+ "\x11\xc7\x56\x37\xff\x0d\xa1\xdf\xa4\xef\x62\xdc\xc2\x9e\x2d\x39"
+ "\x41\xe2\xca\xfc\x43\x1e\x5d\xb2\x4d\xe2\xa0\x4c\x43\x0c\x78\xd8"
+ "\x21\x9c\xd1\xcd\x2f\x43\x2c\x59\x82\x47\x3b\x7c\xd7\xb5\xfa\x68"
+ "\xbd\xe4\x0f\x01\x17\xda\x11\x33\xd0\xa3\x9b\x2f\x63\x59\x99\x00"
+ "\xf3\xf9\x76\xb4\x0f\xd8\x22\x8e\x2e\xc1\x74\x60\x70\x47\x72\x48"
+ "\xff\x81\x98\xbd\x94\x67\x5c\xdf\x8d\x80\x51\x90\xfa\xdc\x4a\xfc"
+ "\xaa\x6b\xea\x17\xe8\xdf\x27\x8a\x79\x4a\x33\xec\x27\xe9\x59\xfa"
+ "\xbe\x28\x95\x73\x27\xf1\x20\xf9\x60\x94\x75\xfa\xac\x56\x89\x0b"
+ "\x32\x8e\xb9\x2e\x39\xf5\xff\xb1\xf7\x3d\xf0\x4d\x55\x67\xff\x27"
+ "\x69\x80\x80\x49\x13\xb1\x73\xc1\x15\x8c\xae\x6e\xd1\xa1\x56\x45"
+ "\x45\xc4\x59\x15\x1c\x28\x52\x74\xa0\x55\x10\x8a\xfc\x0b\x5a\x20"
+ "\x94\x52\x02\x94\xfe\x13\xbb\x52\x93\xd2\x39\xe6\x5b\xa4\x2d\x15"
+ "\x71\x2d\x1b\xba\x6e\xb0\xfd\xba\xbd\x30\xe3\x2b\xec\x2d\xda\x36"
+ "\xd5\x1f\xfc\x6c\x4a\x1d\x69\xd7\x61\x65\x05\x62\x29\x34\xb4\xc9"
+ "\x3d\xbf\xe7\xb9\xe7\xa6\xb9\x69\x93\x36\x49\x0b\xe2\xa4\x9f\xcf"
+ "\xfd\xdc\xde\x73\x9f\x9c\x7b\xce\xf3\x7c\xcf\xf3\x3c\xe7\xdf\x73"
+ "\x04\xfe\xf1\x67\x5e\x14\xa4\x32\x3e\x30\xfa\xbb\x64\x6c\x5c\x26"
+ "\xfa\xc7\x50\xae\x52\xef\xb8\xcc\x5d\x32\x7e\x4c\x4d\x58\x63\x0d"
+ "\xef\x0e\x88\xca\xdc\xc1\xef\x03\x6c\xc7\x3e\x75\xec\x62\xfc\x96"
+ "\x19\x63\x8b\x21\x2e\x4e\x89\xf1\x1f\x3b\x15\xcb\x89\x6b\xf3\xdc"
+ "\xca\xc8\x56\x6a\x8e\x6c\x43\x3e\xc3\x6f\xd2\xa0\x2d\xf8\x1d\x5b"
+ "\x45\xbd\x89\xe7\x9e\x74\xe6\xdc\x35\x5e\x74\xf6\x2e\xd8\xc1\xbb"
+ "\x5e\xf4\xd8\x39\xb4\xd1\x18\xe7\xa1\x27\xcd\xfc\x9c\x06\x7c\x1c"
+ "\xad\xe0\xe3\xf8\x1d\x2b\xe2\xe3\x1c\xde\x41\x62\x71\xaf\x31\xae"
+ "\xd3\x46\xbc\x51\xc5\xb3\x95\x18\x3b\x19\xe3\x40\x5a\x36\xdc\x0d"
+ "\xe5\xbd\x5b\xf9\xab\xeb\xf9\xfd\x8d\x1d\x96\x3b\xda\x71\x8d\x4e"
+ "\xdb\xc9\x34\x3e\xbe\x91\x3c\xde\xe8\xa2\x3b\xd9\xd9\xdb\x0e\xaa"
+ "\x7c\xb6\x12\xdf\xf1\x67\x07\x60\x9e\xe1\xc6\x01\x96\xdc\x55\x2f"
+ "\xf8\x32\x6d\x60\xcb\xbf\x0f\xf5\xe1\xf7\x33\xc2\xff\xd7\x9f\x92"
+ "\xdc\x73\x2f\x3b\x2f\x92\xc5\xb2\x17\xd6\x1a\x0e\x67\xfb\xf3\x1d"
+ "\x84\xdf\x2f\x2d\xb9\x7b\x8f\xf6\x36\x42\xda\x24\x77\xbf\xc7\xc7"
+ "\x95\x36\x8d\x8c\x15\x78\x10\xbb\x95\x95\x4b\xb5\xc0\x28\xe5\xcb"
+ "\x88\xe5\x0b\xad\x6c\x77\x7b\xec\xe5\xf0\xce\x9c\xbb\x2b\x3d\xfb"
+ "\xfa\xf9\xfa\x0b\xf1\xa6\x2d\x37\x63\xbf\xe5\x9e\x5b\x98\x5c\x46"
+ "\x4e\x10\xbe\x3d\x61\x08\xbe\xed\x10\xf2\x94\xf3\x31\xb7\x81\x2f"
+ "\x90\x2f\xe8\xbd\x7b\xe2\x3c\xf6\x54\x58\x23\x3f\x9e\xd9\xf9\x7b"
+ "\x12\xbc\xb6\x94\xf1\xd0\x67\xcf\xce\xaa\x55\x29\x5a\x70\xd8\x0d"
+ "\x0b\x53\x16\xe9\xb5\x4b\x92\x93\x57\x25\x6b\x31\xe0\x4d\xaf\x73"
+ "\x95\xe4\x34\xe7\x9e\x24\xe1\xec\xb7\xf2\x9e\xb3\xdf\x72\xee\xd9"
+ "\x2f\x3e\x93\xcf\x2e\xb9\xa7\x72\x68\xfa\x35\xf7\x04\xdc\xe7\x57"
+ "\x20\xe5\x2a\xe0\xaa\x84\xcb\x02\x57\x15\xf6\x73\x16\x38\x49\x1c"
+ "\xd8\x47\x7e\x4e\xd8\xbb\x5f\xfd\x1e\x13\xce\x83\x37\x4b\x26\xdc"
+ "\x55\xc2\xc9\x08\x1f\xd7\x24\x9b\xc3\xb5\x24\x18\x1f\xbd\x12\x2e"
+ "\x0b\x5c\x55\x70\xf1\xbf\xe3\xfe\x87\xdf\x6b\x5b\x21\x7e\x87\x73"
+ "\xd3\x34\xdb\x32\x19\x69\x68\x96\x8c\xf7\x43\xb8\x37\x18\x5d\xaf"
+ "\x32\x48\x69\xce\xed\xfb\x05\x3a\x5e\x37\x44\x66\x11\xad\x1f\xba"
+ "\x08\x9a\xf3\x63\xbb\x40\xc7\xef\x7d\xf7\xd4\x07\x63\xf7\x03\xbd"
+ "\x87\x4e\x46\x73\xee\x32\x08\x74\x2c\xa6\x59\xb6\xd4\xdf\x77\x87"
+ "\xd1\xec\x0b\xd1\x02\x9d\x5a\x9c\x9f\x88\x66\x38\x97\x73\xe3\x14"
+ "\xa4\xe1\xb2\x64\xec\x1c\x96\x9c\x7b\x8e\x02\xbd\xdf\x98\xa7\xa1"
+ "\xc9\xe9\xde\xb4\xde\x72\x32\x2c\x5a\xbe\x64\xd2\xf2\x95\xa9\x78"
+ "\x92\x54\xca\xaa\xb5\x29\x78\x5f\xb9\xf0\x15\xfe\xb6\x6a\xc1\xd2"
+ "\x45\xec\x9f\x94\xa4\x58\xfc\x27\x09\xf0\x86\xf7\xc5\x6b\x0d\x78"
+ "\x5b\xb4\x0a\x1f\x8d\xfa\xf1\x6b\x17\x79\x8e\xf4\xf6\x89\xbb\xd4"
+ "\x99\x73\x5f\x8c\x5d\x32\x21\x8a\xf9\x23\xf7\xc5\xda\x25\x3f\xe6"
+ "\xe7\x81\x55\x59\x76\x72\x58\xc7\x9f\xfd\x47\xfa\xc4\x2b\x90\xdc"
+ "\xf7\x10\xc6\x2b\x50\x65\x19\x16\xa9\x5c\xcb\x97\x50\xb3\x6a\x1a"
+ "\xfc\x36\xc9\x4e\x76\x0b\x7b\xcb\x47\xc6\xf1\x71\x43\x73\xee\x3d"
+ "\xe0\x59\x5f\xc8\x99\xe4\x1d\x18\x0f\x9f\x5f\x6f\xf4\x06\xc6\xc2"
+ "\x19\xa9\x05\xba\xc9\x25\x6f\xf0\xe7\xd2\x44\xc1\x7b\xfc\xdd\x14"
+ "\x78\xd6\xc0\x73\x34\x97\x7b\x31\x13\xf7\x27\xc2\xb3\x16\x9e\x63"
+ "\x20\xff\x6a\x4f\xbb\x10\xf3\x46\x38\x6c\x6e\x92\xdf\xfe\xb1\x6f"
+ "\x8c\x29\x68\x5b\xf7\xab\x3d\x67\xf9\xf2\xe7\xf6\xe6\xdc\xaf\xed"
+ "\x39\xb7\x97\x3f\xcb\x49\x3d\x8f\xb7\x6b\xbc\x6d\xbf\xbf\x38\x42"
+ "\x33\x36\x95\xf9\xe1\xf7\x4f\xf3\xc4\x64\x60\x7e\xf6\xfd\x09\xa2"
+ "\x33\x8f\xf1\x59\xdf\x73\xe6\x31\x8b\x4b\xf6\x16\x1f\xf7\x48\x72"
+ "\x7f\x05\xcd\xb9\xaf\xbe\xe7\x7c\xba\x9c\xfb\x0b\xc4\xe7\xd3\xd9"
+ "\xe1\x3d\xf6\x6f\x20\xbd\xdc\x6b\x07\xef\x9f\x8c\xdf\xf4\x77\xbe"
+ "\x33\xf4\xcf\x8d\x0b\xd6\x83\x2f\x0e\x77\xde\x2f\x17\x7c\x60\x4c"
+ "\xa7\xd9\x71\x18\xdf\x46\x8b\xef\xd0\xf7\xf3\x3b\xe6\x80\xe7\x2b"
+ "\x4a\x26\x3e\x82\x71\x77\x1d\x19\x8b\x25\x3f\x2c\xc1\x35\x48\xf0"
+ "\xcc\xe2\x46\xd2\x33\x92\x89\xfc\x3e\x36\x4f\x4c\x39\xf1\x9e\x78"
+ "\xbf\x7b\x0f\x3e\xf3\xcc\x19\x27\xad\x52\xb9\x16\x2e\x61\x7e\xdc"
+ "\xc4\xb7\x99\x2e\x55\x29\x98\xbd\x9f\x68\xa2\xcf\xb0\xf3\x4e\xec"
+ "\x92\x07\xd4\xb8\x1f\x49\x25\x49\x5a\x45\xe1\xb7\x2a\xe3\xc2\x25"
+ "\x7c\x1a\xd0\xbd\x0a\xbe\x96\x50\xbe\xd5\xd6\xe8\x56\x42\x2f\xb8"
+ "\xd9\x5e\x7f\xc9\x44\xc3\xfc\xb1\x99\xf8\x1d\x39\xef\x47\x7c\x46"
+ "\x14\x78\x56\x20\x96\xad\x44\x14\xf3\x6e\x2b\xa4\xe1\x7a\xac\x73"
+ "\xcf\x10\x3e\xee\xaf\x50\x16\x03\x7f\x56\x59\xce\x03\x72\x4f\xcc"
+ "\x1c\x3b\xa4\xf5\xae\xcf\x33\x3f\xe7\x5b\xc8\x2d\x8b\xc6\xcf\x9a"
+ "\x0a\xff\x8d\x17\x8e\xb9\x15\x63\x27\xfa\x5c\xe4\xb5\x71\xe7\x7e"
+ "\xb3\xef\x4b\xfe\x9c\xc8\x9c\x07\x12\x40\x4e\x2e\x5e\xde\xaf\xce"
+ "\xfd\x0a\x75\x0b\x7f\x7e\x22\xee\x2b\xe4\x3a\xe0\xbb\x93\xa7\xf3"
+ "\xf1\x75\xa5\xcc\x5f\xe4\xe3\xda\xe5\x3c\x80\x31\xbd\xed\xec\x8c"
+ "\x58\x95\x1d\xe4\xc7\xdb\x7d\x6c\x1b\xfc\xfe\x49\x35\xd6\xfd\x81"
+ "\x0a\xd0\xa9\x8f\xc1\xf5\x1c\x3b\x1f\x66\xee\x57\x9e\x7c\x31\x7e"
+ "\x14\x60\x6b\x1a\xdc\xd5\xf0\xfd\xfa\x9e\x35\x42\x3d\x7b\x32\x1f"
+ "\xb8\x88\xb1\xad\x7a\xf6\xe7\x4a\x26\xdf\xcb\xfc\xca\x49\x32\x3b"
+ "\xf9\x51\x01\x6b\xdf\x18\xff\xbf\x4a\xd8\x9b\x35\x09\xfa\xbf\x4f"
+ "\x26\xfa\xe6\x31\x69\x89\x67\xec\x83\xc9\x6e\x52\x1c\x60\xf1\x31"
+ "\xb8\x9e\x03\xfa\x19\x9e\x33\xb2\x5f\x95\xf2\x7b\x8b\x4e\x46\x68"
+ "\x48\x2c\xa4\x2f\xf6\xa4\x0f\x93\xc4\x01\x6f\x26\xa5\x78\xf4\xc9"
+ "\xb9\xc8\xc8\x0e\x78\xde\x0c\x7e\xba\x8b\x3d\xab\xf0\xfd\x36\xcf"
+ "\x33\xfc\x5f\xea\xd1\x37\xd8\x3f\x3b\xb7\x31\x61\x3b\xf6\xff\x16"
+ "\x69\xc0\x27\xd3\x60\xff\x6a\x12\xf4\x7f\xff\x37\x93\xfd\x76\x92"
+ "\xe1\x5c\xf6\xc7\xe3\x3b\x22\x9f\xa9\xe8\x00\x1d\x0a\xef\x1a\xed"
+ "\xe4\x77\xf3\x84\x7c\x5a\xed\xd2\x86\x16\xaf\x3c\x22\x54\xc0\x63"
+ "\x17\xab\xd3\x64\x2d\x55\xaa\x09\x9e\x57\xde\x99\xf3\xa0\xda\x2e"
+ "\xb9\xcf\xc9\xd3\xa5\xb6\x95\x9a\xba\xd4\xb3\xad\xd0\x83\xb7\x2c"
+ "\x45\xac\x3c\xc8\xef\x4f\x36\x6f\x50\xf3\x31\xc4\x30\x0e\x01\x1f"
+ "\x9f\x0c\x63\x4e\xba\xc8\x70\x3e\xce\xbf\xf9\x41\x3d\x1f\xdf\x7e"
+ "\x9d\x4e\xe1\x89\x37\x09\xed\xb4\x80\x4a\xdf\x4f\xc1\x18\x94\xfc"
+ "\x58\x5a\xa7\x2e\x92\x8f\x3b\x29\xc4\x9b\x2c\x4e\x25\x51\x45\x1c"
+ "\x8b\x37\xc9\xc7\x28\xe8\x27\xe6\x24\xcd\xfe\x72\x82\x27\xe6\x24"
+ "\xf0\x01\xf7\x1e\xea\xe8\x05\x97\x13\xee\x31\xa2\x58\x37\x32\xbf"
+ "\xf1\x27\xa5\xa0\x37\xa5\x2c\xfe\x64\x68\xf6\xe6\xc1\x36\x86\x93"
+ "\xc9\xe3\x3d\x67\x78\x8b\xd2\xe2\xa0\xbd\x08\x7e\xce\x03\x4e\x21"
+ "\x6d\xb6\x9d\xfc\xbd\xad\xc7\x37\x03\x7d\x87\x63\x8a\xf0\x3e\x8d"
+ "\x66\xe8\xb7\x8b\xdb\x15\xe1\xff\xd0\x74\x0f\x03\xbb\x3c\x1c\xae"
+ "\x11\x78\x4d\xeb\xd1\x1f\x17\x68\x3d\xf6\x11\x54\x12\xb0\x37\xc6"
+ "\x08\x1a\xef\x72\x45\x2c\x70\x49\x8e\xa2\xef\x89\x7b\xae\xe3\xdd"
+ "\x2e\xdc\xfb\x2f\x8b\x77\x9f\xc3\xf3\x35\x8f\xe2\x5e\xb2\xad\x4b"
+ "\x71\x6f\xe3\x8d\x14\xcf\xa9\x89\x77\x9f\xa5\x3b\xd9\x9e\xcd\x3a"
+ "\xe1\xcc\xcc\x6a\x77\x2a\xad\x02\x39\x28\xb0\xdf\x81\xf1\xb7\x22"
+ "\x25\x4e\x12\x69\x88\xf8\x60\xe6\xf9\x0f\x28\xc6\xde\xc2\x33\xca"
+ "\xb8\x1c\x27\xe8\x4a\xad\x64\x81\x2b\x22\xd3\xea\x6a\xe1\xcf\x09"
+ "\x88\x77\x8f\xa0\xf1\xc6\x87\x28\x7f\xb6\x58\x2a\x3d\x04\x7a\x36"
+ "\x82\x3f\x43\x7b\x3d\x3d\x07\xff\xcb\xe3\xd7\x9f\xa3\x78\xbe\x27"
+ "\xe4\x5d\x15\xef\xe2\xba\xe2\x8d\x5c\xc6\x02\xa3\x04\x7e\xf7\x4f"
+ "\xf8\xdd\x3f\xa1\x3c\xb1\x90\xa7\x1a\x9e\x1f\xa6\x3b\x97\xe2\x1e"
+ "\xa8\x4c\xbe\xef\x03\x75\xb4\x08\xfb\x4a\x2b\xf1\x4c\x4f\x8c\x33"
+ "\xbe\xc0\x65\xc9\xdc\x29\xec\x13\xe5\xcf\x96\x35\x76\x53\xe1\x3b"
+ "\x13\xe3\xd7\x93\x87\x17\xac\xbf\x91\xdf\x6f\x8a\x7b\xa9\xe2\x5d"
+ "\x5a\xf8\x66\x26\xf2\x43\xc1\x9f\xe7\xcd\xef\xa7\x7a\xa8\xbe\xbf"
+ "\xf3\x3d\x71\x9d\xc8\x9a\x31\x44\x8a\xfb\x33\xdc\x25\xef\x24\x62"
+ "\x2c\xb0\x0c\x07\x75\xe2\xb8\xdf\x07\x5d\xf5\x52\x6d\xaa\x0c\xf4"
+ "\xea\x43\xee\x5a\x43\xac\xff\x3d\x75\x79\x63\xc0\xff\xfd\xbc\x83"
+ "\xe6\x45\x27\x51\x73\x7d\x0a\x35\xa9\xa3\x70\xbd\x2a\xcd\xbb\x71"
+ "\x32\x3c\x43\xfa\xcd\x0a\x6a\xb6\xa5\xd0\xbc\x98\x46\xb8\xc3\xf3"
+ "\x8f\xf7\x52\x73\x03\x3c\x4b\x53\xe0\x77\x0e\x9a\x17\x81\xbf\x33"
+ "\xd0\x3c\xd9\x62\xb8\xc3\xf3\xb0\x79\x40\x07\xcf\xc3\x67\xc3\x1d"
+ "\x9e\x47\xcc\x38\x29\xf9\x69\x15\xfc\x06\xd2\x6e\x4b\x63\xdf\xba"
+ "\x3d\x8d\xff\x56\x1e\xf6\xd5\xf0\x1b\xf7\xa4\xb1\x6f\xdc\x97\xc6"
+ "\xbe\x01\xf8\xe2\xbf\x21\x9f\x02\xf4\x4e\x9a\x37\x72\x3f\xd0\x19"
+ "\x69\xde\x35\x31\x70\x87\x67\xc5\x36\xa0\x83\xe7\x48\x19\xdc\xe1"
+ "\x59\x05\x65\x69\x80\x67\x75\x0b\xd0\xbb\x68\xde\xe8\x04\xa0\x4b"
+ "\xa3\x79\xd7\x55\xc3\x1d\x9e\xbf\x17\x07\x74\xf0\x7c\x3d\xe4\x63"
+ "\x83\x67\x8d\x0e\xe8\xe1\x79\x32\x7e\x9f\xd0\xbc\x9f\x62\xbe\x99"
+ "\x34\xef\x61\xa0\xb7\xc1\xf3\x23\x90\x9f\x0d\x9e\x1f\x8b\x06\x3a"
+ "\x78\x9e\x72\x08\xee\xf0\xfc\x38\xd6\x55\x46\xf3\xa6\x69\xe0\xbe"
+ "\x99\xe6\x4d\x87\x74\x1b\x3c\x3f\x69\x80\x3b\x3c\x3f\x85\xf4\xf0"
+ "\x3c\x13\xeb\x0b\xcf\xb3\x20\x9f\x7a\xe0\xf1\x33\x47\xe1\x9e\x4b"
+ "\xf3\xe6\x4c\x00\x3a\x78\x7e\x0e\xcb\x0f\xcf\xcf\x77\x00\x1d\x3c"
+ "\xcf\x03\x5e\x35\xc0\xf3\x7c\xac\xa7\x82\xe6\x2d\xc4\xfc\x4d\x34"
+ "\x6f\x11\xf2\x03\x9e\x97\xd8\xe1\x0e\xcf\x7a\xe0\x47\x03\x3c\xbf"
+ "\x5c\x0e\x77\xbf\xe7\xf3\xd1\xbc\x15\x99\x34\x6b\x38\x94\x39\xf5"
+ "\x00\xcd\x1a\x01\x77\x63\x12\xcd\x1a\xa6\xa3\x79\x1b\xab\x21\x1d"
+ "\xee\xeb\xa7\xc0\xf3\x78\xe1\x19\xee\x1b\xa2\xe1\x39\x56\x78\x86"
+ "\xfb\x86\x0e\x78\x9e\x20\x3c\xc3\x7d\x53\x1a\x3c\x4f\xa4\x79\xe9"
+ "\xb3\xe1\x19\xee\x9b\x5a\xe1\x79\xb2\xf0\x0c\xf7\x4c\x0d\xdc\x5d"
+ "\x8e\xb1\xbb\x2a\x1d\xca\x32\x83\x43\x79\xdc\x8e\x98\x74\xe7\x7f"
+ "\xee\xe0\x22\xeb\x31\x8e\xf0\xf0\x8c\xf3\x64\xc4\x49\xc9\x23\xbf"
+ "\x46\x1b\x69\x4d\xb3\xf3\xe7\xda\x09\xb1\xe9\x86\x37\x4b\xe2\x7e"
+ "\x09\x3e\xc1\x44\x3c\xdf\x1c\xea\x3c\x9e\x66\x0f\x6b\x87\xfb\x5e"
+ "\x9a\x7d\x4d\x33\xd4\x19\x9e\xaf\xfd\x0c\xee\xf0\x7c\x5f\x1e\xd4"
+ "\x19\x9e\xe7\x3e\x0a\xf7\xbd\x9d\x39\x71\x0e\xbb\xe4\xa7\x31\xbc"
+ "\x7e\xff\xcd\x3e\xbb\xca\x95\x01\x3a\x05\x74\xee\xf6\xe6\x52\x95"
+ "\x2b\x91\x50\x73\x63\xa6\x0a\xcf\x9f\x28\xde\xe5\xa4\x91\x65\x7c"
+ "\x99\xf0\x8c\x19\xda\x1d\x23\x65\xdf\xbe\x86\x36\x4b\x1e\x19\x8b"
+ "\x63\x9f\x34\xf2\x83\x40\xef\x1f\xe2\xdf\xdf\xd0\x5c\xc1\xde\xcb"
+ "\x89\xf7\xfd\x5c\x7c\xff\xa2\x0a\xc7\xab\xc7\xbd\xc5\xbf\xb7\x76"
+ "\xb4\x0a\xf5\x8a\xc0\x77\xeb\x91\xd6\x2e\x79\x84\x9d\x43\x26\x89"
+ "\x2b\xa5\xd9\x11\xe4\x9c\x42\x0d\xbe\xe9\x23\x7b\xed\x92\x87\x5a"
+ "\x84\xb1\xc4\x0e\xaa\x90\x3b\x59\x1c\x82\xeb\x02\xc5\x48\x91\x73"
+ "\x26\x7b\xbd\x39\x9b\xd6\x61\x9f\x14\xec\x88\x54\x9b\x1e\x53\xd9"
+ "\x2c\x79\xcc\x58\xcc\x8f\x35\x34\x1b\x71\xaf\x50\xb3\xe4\xd1\x87"
+ "\xba\xf3\xd5\x13\xb5\x1b\x54\xf0\xfd\xc7\xd6\x67\x38\xe9\x79\x4b"
+ "\xfa\xa3\x60\xef\xf8\xf4\x14\xb6\xfe\x9c\xff\x3f\x91\xad\x19\xe2"
+ "\xff\x9f\xc1\xc6\x4d\x1f\x33\xe2\x6f\xc5\x7d\x00\x77\x4e\x52\x12"
+ "\x17\xd9\x9c\xc9\xe6\xbc\x1e\x7d\xe4\x20\x67\x97\xaa\x52\xc8\x30"
+ "\xed\x86\x0f\x20\xff\x47\x73\x7d\xfb\x8b\x1e\x5a\xfe\xdd\x8a\xbf"
+ "\x01\xed\x0e\x7e\x6c\xe7\xd1\x9e\xf3\x8f\x29\xd4\xe1\x75\xe6\x2b"
+ "\xc5\xa1\x6d\x63\x3e\xdf\x63\x1a\x8c\x91\xe9\x52\x34\x26\xba\x4c"
+ "\x65\x89\x6e\x53\xb3\x91\xe6\x37\x67\x46\xba\x24\x84\xad\xdd\x7f"
+ "\xec\xa9\x3b\x9d\x38\xe6\xf6\x31\xd2\x0e\xe3\x86\xa7\x8e\xbf\xc3"
+ "\x48\xa4\x96\xe4\x06\x7c\x9e\x4a\x73\x36\x1e\xb2\xb6\xd5\x13\x4b"
+ "\x32\x9f\xd7\x14\x9a\xf3\x8b\x14\x6e\x78\x96\xa1\x04\x7d\x55\x23"
+ "\x8e\x15\x7d\x86\x7c\x39\x02\x72\x01\xbe\x3f\x16\xe3\x29\x0b\x9e"
+ "\x15\x60\x06\xde\xa1\x1f\x89\x7b\xad\x17\xb8\xdd\x18\x17\x2a\xd7"
+ "\x0e\x7c\x60\xf2\x7a\x0c\x63\x42\x13\xe1\xbb\x2f\x72\x91\xea\x98"
+ "\xda\x79\x38\xaf\x2a\xc7\x38\x3b\xe7\xf9\xbd\x99\x2e\x3c\xdf\x0f"
+ "\xed\x25\xa3\xf5\x89\x8f\xbc\xc8\xb0\x60\x83\x61\x55\x72\xca\x82"
+ "\xb5\x86\x49\x5a\xe8\xc8\x69\x57\x2d\xd5\xae\x58\xb2\x62\x55\xf2"
+ "\xfa\xde\xfe\xa6\x1c\xca\x75\x00\x70\x52\x85\xe5\x3a\x02\x3e\x2c"
+ "\x1b\x83\x9e\x6a\x42\x59\x6f\x7f\x93\x9d\x27\x01\x34\x76\x3b\x79"
+ "\x97\xef\x97\x70\x85\xcd\x85\xb4\x68\x97\x73\x0b\xee\x31\x5f\x8b"
+ "\x7d\x06\x07\xb1\x92\x76\x28\x1b\x3b\x5b\xb0\x16\xe3\x20\xa4\xa6"
+ "\x51\x4b\x6a\x3b\xb6\x03\x23\x35\x1f\xcf\xa5\xc5\xef\xc4\x5d\x34"
+ "\x97\xd5\x37\x4b\xa6\x1a\x2e\x9a\x8f\x1b\x3d\xe7\xff\xb8\x4d\xc7"
+ "\xeb\x39\x85\xdd\x81\xe7\xff\x74\x53\x0d\xa9\x01\x5e\x76\x99\xd4"
+ "\x6a\xb0\x03\x8a\xe2\x6c\xb0\x63\xd0\xd7\xe0\xe3\x2f\xfc\x66\x9f"
+ "\xc5\x4d\x75\x32\x77\x36\x91\xc3\x3d\x92\x46\x36\x6b\xbb\x15\x8d"
+ "\x06\x7c\x8f\xe7\xfe\xb8\xbb\x75\x24\xfd\x28\xe5\x5e\xd0\x03\x6e"
+ "\xb2\x09\xe5\xcf\x5a\xd5\x9f\x26\x90\x3e\x8a\xcb\x6f\x24\x27\xa7"
+ "\x11\x29\xd2\x82\x9f\x44\xe6\xc1\xff\x69\x0b\x89\x12\xe8\x54\x69"
+ "\x47\x20\xbd\x53\x37\xca\x95\xa1\x93\x77\x65\xe8\x46\x75\x53\x9d"
+ "\xc2\xda\xe2\x24\xdd\xb7\xec\xab\xbb\xdd\x41\x64\xdb\xc1\x9f\x2a"
+ "\xe6\xa0\x0d\x16\xed\xb2\xbb\x37\xea\x86\xbb\x36\xea\x64\xdd\xdd"
+ "\x3a\xb9\x6b\x9d\x4e\xd6\xb5\x4e\x37\xbc\xbb\x53\x27\xb7\x2e\x76"
+ "\x90\x8f\x1d\xbf\x25\xb5\x2d\xad\xfc\x38\x65\xb7\xb2\x79\x7c\xb7"
+ "\xb2\x51\xa1\x68\x21\x51\x77\x18\xc0\xaf\x02\x3f\xf3\x2d\xf0\xa9"
+ "\x01\x13\x0a\xd7\xbb\xfb\x2c\xd4\xdc\x54\x07\xfc\x9d\x33\xf5\x56"
+ "\x7a\xd6\x9d\xf3\xa4\x4e\xfb\x04\xe8\xab\x2c\x59\x34\xa4\x01\x7e"
+ "\x9e\x2b\xa4\x39\x3f\xb7\x43\xff\x5e\x0b\x17\xf4\x97\x79\x39\x80"
+ "\x2f\x37\xbd\x11\x9e\xa3\x91\x96\xd1\xcd\x1a\x6f\xe7\xef\x33\xd2"
+ "\xf8\x33\x51\x73\x1e\xdb\x5c\xcc\xf7\xfb\xa6\xe6\x7a\xfc\xf5\x43"
+ "\x32\xff\xfb\xd8\x81\x66\x6f\x4f\xff\x99\x03\x9d\x63\xfe\xdc\xee"
+ "\x57\x97\xe7\x8f\x70\xe1\x1c\x27\x07\x7c\x3b\x29\x79\x7c\x2c\xc6"
+ "\x9e\xa2\x19\xd3\x84\x3e\xeb\x54\x7e\x1c\x0b\xf7\x7e\xe3\xb8\x06"
+ "\x4b\x7b\x9c\x1f\x3b\xe1\xa4\x71\x18\xeb\xbf\x12\xe3\x7d\xe1\x38"
+ "\x06\xe0\xba\xca\x2e\x79\x1c\xc7\xcd\x86\x41\x7f\xaf\x02\xae\x4a"
+ "\xb8\x2c\xbf\xc2\xf1\x8d\x6c\x32\xd5\x33\xf6\xe3\xbf\xac\x8f\x43"
+ "\xff\xf7\x37\xd5\xde\xfe\xef\xe3\xd0\xff\x9d\x6a\x09\x7d\x7d\xe0"
+ "\xe3\xfa\x7e\xc6\xa1\x65\x18\xb7\x96\xe6\xd7\xab\x0b\xb8\x9e\x38"
+ "\xb7\x60\x1b\x1e\x3f\x08\x7a\x22\x93\x7f\x67\x6a\xcc\x4c\xff\x9a"
+ "\x44\xe0\xbb\x0a\x5c\x0f\x01\xcf\xda\x64\x09\xb5\x76\x38\x49\x01"
+ "\xce\x4b\x44\xef\x72\x56\x5c\x70\x48\xb1\x5d\xd4\x42\x1a\xfc\xf6"
+ "\x58\xc1\x05\x21\xdf\xc2\xe6\xd2\x8c\xd5\x84\x3f\xbb\x04\xcf\x3f"
+ "\xc2\xf6\x52\x90\x0e\x7d\x4b\x3c\xab\x29\x19\x75\xf5\xcf\xae\x85"
+ "\xff\xe5\x48\x47\x15\x8d\x99\x1c\xe4\x01\x6d\xa6\x95\x2a\x1b\xf5"
+ "\x9c\xf9\xb8\x03\x6c\x48\x05\x1d\xfb\x4e\x02\xb7\xbd\x39\xb7\x33"
+ "\xe7\x67\x58\x7f\x3e\x96\x30\xc6\x15\xc2\xb1\x13\x37\xf4\xe1\x6b"
+ "\xcb\x5d\x84\x3e\xea\x22\x87\x53\xce\x43\xff\x43\x1d\xe5\x50\xda"
+ "\xeb\x1d\xca\xa6\x3a\xb7\xb2\x49\x0b\x57\x8c\x21\x19\xe7\x93\xa7"
+ "\x8d\xef\x89\x8f\xf9\x75\xff\xf1\x31\x21\xcf\x18\x4f\x8c\x4c\xf7"
+ "\xba\xd0\xe3\x63\xba\xa5\x27\x74\xc5\xa9\x03\xc7\xc7\x04\x9f\xb5"
+ "\x0e\xfc\x55\x8b\x27\x96\x89\x9b\x5f\x9f\x4e\x14\x6e\x65\x63\x02"
+ "\x1f\x0f\xc5\x68\xe1\x63\x9a\xa0\xef\x8a\xb6\xa6\x33\x67\x9a\xde"
+ "\xe3\x8f\xa2\xfe\x74\x9b\xd5\x5a\xb8\xa2\x21\x3d\xd3\x2e\x99\x5b"
+ "\xe9\xd1\xad\x60\x73\x0b\xdc\xa3\xb6\xd8\x3b\x71\xcf\x41\xb7\xfe"
+ "\x61\xa4\x05\x3e\x5a\xe0\xdb\x11\xee\x6e\xfd\x64\xb8\x1e\x82\xeb"
+ "\xa7\x6e\xf3\xf1\x4c\xb7\xb9\xa9\xc2\x6d\x2e\xdb\x06\x57\x21\x5c"
+ "\x45\x70\x95\xc2\xb5\x1b\x2e\xf0\x73\xca\xf6\xc2\x1d\xdf\xef\x87"
+ "\xab\x12\xae\x03\x70\x59\xe0\x3a\xe4\xde\xde\x5c\xe0\x96\xc8\xa2"
+ "\xe1\x8a\x81\x0b\xca\xd1\xa4\x71\x9b\xed\xad\x6e\x73\x63\x22\xdb"
+ "\x0b\x3a\x3d\xca\x83\x55\xff\x71\x06\x26\xb1\xf3\x18\x86\x9d\xa0"
+ "\x2a\x3c\x2b\x38\xed\x3c\xc6\xc7\xd3\x1f\xd6\x75\x84\x76\x2e\x87"
+ "\x64\xfa\x94\x40\xd8\xc6\xfc\x41\xcf\x74\x87\x98\xdf\xb6\x80\xe3"
+ "\x30\x9a\xe6\x42\x57\xf4\x3b\x71\xae\x6c\x92\x09\xba\x4d\x52\x9b"
+ "\xd8\x42\xe2\x1d\x24\xa3\xba\xa5\x8b\x64\x2c\xa6\x6e\x5e\x0f\xa4"
+ "\xe1\xf9\x2f\xef\xa7\x20\xce\xdd\x34\x41\xdb\x6d\x3a\x9e\xeb\x56"
+ "\xd8\x2b\xa8\xc2\xde\xca\xc7\xdc\x03\x7d\x82\xe7\x9f\xf5\xf4\x6b"
+ "\x11\x77\xd0\xb7\xad\x69\x3b\x4f\x36\x2e\xa6\x5c\x0d\x48\x18\xe3"
+ "\xea\xa9\x24\xe4\x6d\x1e\x7f\x42\xdf\xf6\xc9\x46\x9a\x09\x78\x1a"
+ "\xe9\x06\xbe\x71\xd8\xa7\x05\xec\xed\x4c\x25\xb1\x1e\xfc\x81\x5d"
+ "\x57\x7b\xce\x8c\xa2\xc3\xa7\xeb\xe0\x9d\x0c\xcf\x94\x2a\x82\xbe"
+ "\x6d\x51\x2a\x89\x29\x82\x77\xfc\xf9\x9f\x50\xee\x99\x06\x15\xe5"
+ "\x5e\xd1\x91\x92\x97\x89\x5c\x79\x9a\x9d\x29\xeb\x06\xde\x7b\xcf"
+ "\x55\x28\xab\x7f\xea\xb4\x96\x1c\xd6\x7d\x01\xf6\xb9\x02\xe4\x52"
+ "\x56\xdf\x0d\x36\x0c\x78\xe9\x0e\x8d\x97\x4f\xd8\x2f\x15\x2f\xbb"
+ "\xa3\x77\xd9\x19\x3f\x13\x09\xf2\xac\x37\x3f\x91\xc7\x1b\x5a\x80"
+ "\x9f\xc0\x57\xeb\x51\x37\xf4\x4f\xc9\x42\x0f\x3f\x77\x00\x3f\x81"
+ "\xa7\x1a\xe4\x29\xf0\x83\xe7\x29\x15\x78\x5a\x22\xe2\x29\xe8\x2f"
+ "\x3e\x3e\x21\xf2\x94\x03\x9e\x96\x04\xe0\x69\xcf\x18\x01\xf0\x74"
+ "\x67\x50\x3c\x2d\x1f\x04\x4f\x67\x4c\x08\xc4\x53\x17\xfa\x0e\xf9"
+ "\x65\x75\x14\x74\xa3\xd5\xf5\x31\x1f\x6b\x93\x9a\x9a\x62\x38\x53"
+ "\x93\x96\x53\x1c\xaf\xc7\x33\xc2\x71\xbe\x1f\xcf\x30\xe3\x63\x43"
+ "\x95\xd3\x8b\xee\xfc\xe6\x58\x4c\x03\xdd\xa6\xbf\x13\xd7\x18\x19"
+ "\xec\x60\xbf\x68\x65\xed\x05\x1c\x5f\x8b\x5f\xd1\x85\xbe\x77\x7e"
+ "\xf3\x2a\x8e\xea\x09\xea\x95\xf9\xb7\x12\x59\x17\xe8\x0e\x43\x2a"
+ "\xb9\xb1\x00\xf4\x61\x97\xb9\x29\xe6\x94\xe4\x29\xf9\x54\x03\x47"
+ "\xe1\xca\xc0\x98\x91\x1c\xe8\x5d\xd0\xe7\xbc\x7c\x51\x66\x38\x6f"
+ "\x58\x33\x1f\xf7\xb0\x3c\x75\xf1\x93\x44\x17\xc9\xd0\xf7\x95\x2f"
+ "\x97\x91\xa0\x75\x9b\x06\x6e\x27\x78\x8e\x62\x5a\x2b\xca\xb5\x82"
+ "\x58\x5b\xbc\xed\x84\x13\xf4\x34\xca\x02\xdb\x05\xb6\x91\xad\x22"
+ "\xfd\x0c\xba\x5f\x5d\x2c\x9c\x2b\xe2\xce\x06\xfd\x8c\x31\xe4\x41"
+ "\x96\x78\xde\x88\xdf\xf6\xb1\x11\xda\xc7\x06\xfe\xcc\x27\x0d\xf0"
+ "\xa3\xa2\xab\x93\xc9\x10\x65\x66\x75\x55\xf1\xf2\x2b\x10\xec\x01"
+ "\xe3\xbb\xfd\xdf\x94\x26\x80\x4f\x17\xa7\xe7\xf2\x9b\xb5\xb4\x53"
+ "\x3f\x0a\xcf\xfd\xda\x79\x06\xf0\xb4\x18\x7c\xa8\xb3\x60\x2f\x56"
+ "\x02\xbe\xce\x90\x98\x9d\x2b\xc1\x2f\xea\xc4\xb3\xdb\xa0\x3c\xeb"
+ "\xd9\x99\xb7\x5c\xce\x74\x13\xbc\xe3\x63\x60\x72\x9e\x18\x98\xe7"
+ "\x74\x38\xb6\xe1\x1d\x73\x5a\xa5\x93\x7a\xbf\x79\x3d\x71\x2b\xe2"
+ "\xf4\x6c\xcf\xea\xcc\x0f\xf9\xb1\x60\xb9\x13\xfb\x0b\xa4\x4d\x32"
+ "\x93\xdf\x2b\x48\x73\xdd\x9b\x0d\xe9\xb8\x96\x68\xe6\x1e\x9a\x3f"
+ "\xcc\x68\xc0\xf3\xbb\x3d\xef\x32\x12\x90\x0f\xda\x3b\x32\x09\xd8"
+ "\x80\xb8\x5c\x3c\xd7\x1d\xe3\x89\x85\x86\xc5\x99\x16\xcc\xcb\x6d"
+ "\xba\x1e\x6d\x7d\x1c\x97\x7f\xbd\x02\x74\x4a\x2c\x7d\x05\xea\xfa"
+ "\x32\xd4\xf5\x14\xf0\xf5\x14\xd4\x75\x9d\x50\x57\xe1\x3c\x3b\x0e"
+ "\xf8\x0f\xef\xfc\xdb\x47\x4f\x5d\x5f\x01\x7e\xe7\x9e\x9f\xb5\xe9"
+ "\x34\xb9\x8e\x82\x4f\x5e\xd3\xc6\xef\x17\xea\xb4\xba\xbe\x20\xf8"
+ "\x5d\xde\x7e\x9b\xca\xca\xe7\x00\x1e\x91\xe7\xe0\x6b\x43\x5f\xb2"
+ "\x91\x78\xe4\x80\xe5\xa1\xdd\xfa\x51\x25\x2b\xa1\x3c\xc8\xfb\x33"
+ "\x64\x3c\xb6\x67\xe0\x7d\x4c\x09\xf2\xdf\xf7\x4c\xe9\x28\x5e\x06"
+ "\xc3\x41\x06\x2b\x05\x19\x98\x05\x19\x80\xcf\x0c\xb6\x18\xc7\x7a"
+ "\x34\x25\xd9\x4c\x06\xa1\xf1\x28\xbe\x65\x88\xdb\xeb\x84\xc0\xed"
+ "\xf5\xe7\x37\x75\xb1\xbe\xb4\x04\x63\x71\x42\x3f\x61\x0d\xd7\x0d"
+ "\xed\x36\x5f\x68\xb7\x54\xff\x53\x4f\x9b\x3d\x29\x99\x75\x30\xb8"
+ "\x36\xfb\xf4\x7b\xdf\xd1\x36\x1b\x75\x69\xdb\xec\x33\x6b\x7d\xdb"
+ "\xec\x33\xe5\xbe\x6d\xf6\x99\x17\xbd\x6d\x56\x78\x37\x24\x6d\xf6"
+ "\x99\x94\x6f\xa6\xcd\x3e\x93\xe2\xa7\xcd\x46\x05\xd1\x66\x35\x01"
+ "\xda\xac\xe6\xd2\xb5\xd9\x9f\x17\x5e\x3e\x1b\xfb\xac\xad\x4b\xea"
+ "\xc7\xc6\x6e\x14\xd9\x58\x25\xda\xd8\xd9\x49\xfe\xda\x6b\x77\x11"
+ "\xb4\x57\x85\xd0\x5e\x5f\xf8\x2b\xe4\x37\x67\xc9\xc7\x8d\x03\xb7"
+ "\x57\x57\x91\xd7\x7f\x0a\xd8\x66\xf5\xd8\x66\xcb\x89\xd5\xce\xb7"
+ "\xd9\x85\x9e\x36\x5b\x24\xf4\x87\xfa\x69\xb7\x51\x81\xda\x2d\x9e"
+ "\xf1\x85\xe7\x7b\xf5\xdb\x6e\x05\x7f\xa9\x7b\x2c\xb6\x5b\xcb\x15"
+ "\x66\x6b\x9f\xbd\xdd\xb7\xdd\x3e\x9b\xe8\xdb\x6e\x9f\xfd\x9e\xb7"
+ "\xdd\x0a\xef\x86\xa4\xdd\x3e\x3b\xfe\x9b\x69\xb7\xcf\x8e\xff\xf6"
+ "\xd8\xda\xe7\x02\x9e\xff\x37\xf4\xb6\xf6\x85\x5f\xf3\xed\x36\x90"
+ "\xad\xcd\x10\x6c\xad\x12\x6d\x6d\xc2\xad\xc1\xb5\xdd\xe7\x6f\xfa"
+ "\x8e\xb7\xdd\x4b\x6c\x73\x9f\xff\xca\xb7\xed\xbe\x10\xed\xdb\x76"
+ "\x9f\xff\xd4\xdb\x76\x85\x77\x43\xd2\x76\x9f\x6f\xfd\x66\xda\xee"
+ "\xf3\xad\xdf\x1e\x9b\x3b\x57\x11\xa8\xed\x6a\xc7\x91\xcc\x66\xc9"
+ "\xdc\x25\xd6\x22\x7e\x6d\x60\xa6\xd5\x35\x89\xb0\x35\x2c\x73\xcd"
+ "\x56\xcd\x44\xc2\xe5\xab\x73\xf1\xac\x09\x5c\x4b\xf3\x2b\xd1\x5a"
+ "\x15\xb6\xb6\x62\xee\x7b\x9e\xb5\x36\x3b\x85\xf3\x28\xfa\x5b\x6b"
+ "\x43\x4d\xea\x68\xe1\x77\xad\x6c\x7d\x8d\x5a\xeb\x79\x66\xb1\xb0"
+ "\xe6\xb6\x51\xb3\x5a\xe3\x50\xaa\x03\x9d\xbb\x2d\x8f\xcc\xa2\x14"
+ "\xcf\x71\x3a\x37\x6e\x9f\xe1\x5c\x1e\x21\x05\xfc\x5c\xcc\xbc\x18"
+ "\xf8\xed\x0c\xb6\xc6\xe2\xb9\x59\xe7\xb2\x67\x11\x48\x9b\xe8\x49"
+ "\xe3\xcf\xd5\xce\x8e\xa0\x1c\xbc\x03\x1d\x32\x79\x67\x3a\x91\x63"
+ "\x7c\xd1\x3b\x2e\x20\x16\xe7\x4d\x03\x1d\x11\x85\x67\x41\xe1\xf9"
+ "\x1b\xf4\xfb\x3f\xe8\x28\x69\x27\xb2\xda\xcd\xfc\xf8\x33\xae\xd1"
+ "\x29\xcd\x47\xfc\x47\xdc\x56\x48\xa5\x32\xc2\x15\xbf\x33\x8d\x2a"
+ "\x9b\x74\xfc\x9a\x60\xc0\x8a\x67\xdd\x0e\x9e\xa3\xc6\x8d\xdd\xd5"
+ "\xea\x89\x6f\x49\xa1\x7c\x7f\x4b\x77\x48\xf1\xfc\xf3\x92\x64\xa2"
+ "\x86\x4b\x41\xcd\x4d\x3a\x28\x57\x9d\x67\x3c\x31\xe0\xfa\x6e\x3c"
+ "\x1b\xf8\x07\x1a\x99\xb0\x46\x08\xf7\xe9\xf2\x3e\xd3\x56\x29\x97"
+ "\xeb\x86\x74\x9a\x9d\xc1\x9f\xc7\xa5\x02\x5e\xe0\x9a\x5c\x3c\x27"
+ "\x89\x2b\xd9\x67\x78\xf5\x06\x42\xde\xdf\xd0\x2a\xc5\xf5\x20\xee"
+ "\xff\xfa\x41\x87\x25\xfd\x6e\x8c\x63\xc1\xc7\x40\x3f\x29\x79\xb1"
+ "\x26\xfe\x2b\x76\x0e\x30\xfc\x6f\xc3\x39\x98\xa7\xe0\x19\xd7\x07"
+ "\x70\xe7\x34\x32\xa4\x85\xf4\xd7\x2c\xa9\x0d\x44\x65\x20\xf2\x7c"
+ "\xa8\x9b\x40\x3b\xbb\x83\x8f\x5d\xf3\x22\xbf\xee\x16\x9e\xf5\x38"
+ "\x6f\x00\xbf\x93\xe3\x3a\x28\x5a\xf4\xce\x34\x5e\x3f\x98\x9a\x74"
+ "\xdc\xd8\x77\x84\x3d\x53\x4d\xba\xad\x50\x67\xa0\x51\xe0\x9a\x1f"
+ "\xfe\x9e\x4e\xd4\xdb\x92\x31\x5e\xea\x8b\xf5\x70\x57\x58\x56\xe2"
+ "\x7a\x95\x17\xa7\x60\xde\x81\xf7\x0d\x34\xe9\x68\xb6\x8c\xb0\xbd"
+ "\x3f\x92\x4f\x9b\x25\xf3\x8d\x2a\x09\xa5\xb4\x68\x57\xeb\xab\x38"
+ "\xce\x8d\x6b\xb5\xf9\xf5\xe7\xf3\x9f\x86\xfc\x65\x3b\xf9\x71\xdc"
+ "\xf9\xb1\x76\xc9\xbc\xc6\x9e\x75\xfe\xfc\x9c\xd3\x7c\x5c\x57\x25"
+ "\xc1\xdf\x08\xf4\x5a\x86\xbf\x26\x9d\x36\x3d\x82\xc2\xf3\x6a\xb6"
+ "\x9e\x5b\xbe\x14\x7e\x6f\xf0\xae\x63\xe3\x7f\x07\x58\x9a\xbf\x19"
+ "\x64\xc6\xaf\xb9\xc1\xe7\x80\x6b\xa5\x05\xb9\xd5\x68\x00\x1b\xbd"
+ "\x65\xe7\xc1\x08\xe0\xc2\x83\x11\x2c\xef\xef\xd3\xed\x52\x36\xc7"
+ "\xb1\x80\x5f\xb7\x96\x0f\x32\x74\xef\xd0\xc8\xf8\x38\xe2\xdd\x28"
+ "\x17\x5c\x73\xbf\xe0\x08\xca\x65\x2b\xd8\x02\x46\x3b\xbf\xcd\x5b"
+ "\x7e\xfe\xb7\xbc\x3c\x39\x90\x05\x5b\xfb\xbf\xa0\x98\x3f\x93\x06"
+ "\x74\x06\xae\x3b\x3f\x64\x84\x72\x21\x6e\x01\x23\xef\x27\x3b\xa5"
+ "\x25\xa9\x2c\xfd\x6f\xed\x4e\x29\xae\x25\xc1\xf1\x70\xf3\xcb\x44"
+ "\x86\xe3\xea\x98\x27\x8d\xde\xd5\x7a\xa7\x47\x8e\x1b\x40\x76\xa9"
+ "\x80\x5d\xe0\xf9\x56\xe0\x5f\x49\x17\x3f\x67\xd5\x5a\xc2\x11\x05"
+ "\x07\x74\x76\xc9\x82\x7a\xc8\x4f\x5d\x7c\x3d\x75\xe0\x5a\x6f\xe0"
+ "\xe1\x86\xce\x9c\x05\x3d\xfb\x1f\xb0\x4c\xb8\x56\xdb\xcc\xaf\xd9"
+ "\x5f\x10\xcb\x30\xb4\x80\x78\xea\x1c\x88\x9f\xe6\xf7\x49\xb4\xf9"
+ "\x0e\x32\x91\x53\x4c\xd2\xd3\x88\x1f\x94\xe2\x78\xf3\x4c\xa8\x35"
+ "\xc6\xcd\x8f\x7f\xed\x04\xb5\x3a\xdc\x84\x53\x4e\xd2\xe3\xfc\x84"
+ "\xfb\xd5\xdb\x46\xc7\xaf\xc7\x3d\x16\xc7\x73\x33\x9c\x44\x6d\x4d"
+ "\x77\xb0\xb3\xd3\xc8\xd7\xc4\xbd\x06\x74\x38\xe8\x75\xb0\xa9\xb2"
+ "\x8c\xaf\xc9\x18\xe4\x17\xa7\x3c\x9e\x7b\x52\x92\xb8\x65\x4e\x0a"
+ "\xc9\x0c\x4d\x8f\x26\xf2\xe7\x14\xa1\x7f\x01\x3a\x5f\x8a\x6b\xf4"
+ "\xac\x0e\xf0\x4f\xcc\xc7\x43\x8c\xf7\x91\xd8\x67\xbd\xb5\xb8\xde"
+ "\x1c\x8e\x43\x0b\x75\x8e\xc7\x3a\x77\x38\x09\x8e\xe5\xcf\x5c\x8d"
+ "\xf1\x49\xcf\x13\xce\x3c\x49\x8f\x75\x06\x5f\x47\x1e\xfa\x98\xfe"
+ "\x42\x4d\x7f\xdf\xa6\xc0\x6f\xee\xd5\x1f\x94\x72\x8a\x26\x39\x7e"
+ "\x1b\xcb\x80\x7b\x76\x66\x9e\x27\x3c\xdf\x91\xff\x56\xa7\x9b\x50"
+ "\xa5\xb8\x0c\xae\x50\xcb\x10\xb8\xfe\x77\x90\x68\xd3\xfb\x4c\xee"
+ "\xee\x57\x05\x1e\xe8\x71\x9e\xac\x49\x8e\x71\xf3\x67\x62\x19\x1c"
+ "\xa7\xc9\x53\xa7\x09\x2f\x7f\xab\xae\x8d\xb8\x23\x6e\x1b\x8d\x6b"
+ "\x2f\x50\xfe\xe9\x2e\x90\xff\x05\x27\xc6\x14\x71\x58\x33\x2f\x12"
+ "\xf4\x5f\x5c\xe7\x74\xd2\xbe\xf2\x7f\x69\xcb\x1c\x63\xa8\xf2\x7f"
+ "\x69\x88\xe4\xff\xd2\x15\x50\xff\x45\x61\xd4\x7f\xd1\x10\xd5\x7f"
+ "\xd1\x15\x50\xff\xc5\x61\xd4\x7f\xf1\x10\xd5\x7f\x71\xc0\xfa\x3f"
+ "\x36\x86\xa3\xfc\x9a\x9c\xc8\xcf\x1d\x68\x03\x98\xbd\x5a\x92\x85"
+ "\xeb\x6f\xf8\x3d\x5a\xc2\x33\x61\x7b\xb6\xe4\xbd\x9e\x15\xbd\x9e"
+ "\xd5\xbd\x9e\xa3\x7a\x3d\x6b\x7a\x3d\x47\x7b\x9e\xc1\x8e\x0c\x3b"
+ "\x23\x59\xfc\x35\xf8\xa5\x99\x76\xc9\x12\x93\xf0\x3e\x06\x63\xee"
+ "\x80\x4d\x8f\x09\x74\x7e\x9f\x52\x42\x68\xb7\x94\x12\xfe\x5c\x3d"
+ "\xc9\x52\xd2\x95\x4d\x28\x8d\xb8\x41\x87\x67\x9f\x71\xa6\xb2\xfd"
+ "\x33\x41\x4f\x5b\x1d\x4e\xf0\xf3\x35\xc3\x21\xef\xef\xe3\x99\x8e"
+ "\x28\x57\x6d\x32\xae\xaf\x59\x72\x1a\xeb\x79\x87\xc1\x42\xb8\x88"
+ "\xdb\xf8\xf5\x0d\x9c\xb9\x6c\xbf\x23\xe2\xb6\x1b\xe8\xf6\xe6\x02"
+ "\x73\x36\x27\xb7\xb6\x1d\x25\xf9\x52\x4e\x9b\x96\x06\xf2\x6d\xdb"
+ "\x4f\x36\xb6\xd1\xd6\x34\x17\x75\x5a\xe7\x59\x48\x86\x03\xcf\x44"
+ "\xa9\x22\xb5\x8e\xa3\xfc\xb9\x28\xfc\xf9\x2f\x8e\xfd\x04\xfd\x9f"
+ "\x0c\xa4\x81\xb4\x5a\xc7\x5e\x52\x03\xcf\x96\x95\xff\x82\x7a\x2e"
+ "\x2d\xb6\xb6\xed\x85\xfe\x52\x59\x05\xa7\x28\xdb\x46\x15\x65\x85"
+ "\x35\x6d\x78\x9e\x4a\x59\x11\x96\xb5\x16\xca\x61\x75\x55\x62\x3f"
+ "\xab\x88\xcf\xb7\xa3\x8e\xef\x93\xe2\xbc\x2d\xa7\x04\x7a\x65\x59"
+ "\x21\x96\x0f\xcb\xe6\xdf\xdf\xad\x8f\x81\xb2\x4f\x9a\xa3\x93\x11"
+ "\xdc\x57\x11\x1a\x46\x96\x5a\x02\xfb\xd1\xf5\xbb\x59\xbe\xf2\x30"
+ "\xf2\x5d\x16\x50\xff\x53\x93\x4d\x28\xaf\x3a\x9c\x7c\xfb\xac\x49"
+ "\x17\xe5\x2b\x94\x57\x1b\x4e\xbe\x55\x81\xf3\x6d\x10\xca\x1b\x17"
+ "\x46\xbe\x7a\x6d\x3f\xf9\x0a\xe5\xcd\x0c\x27\xdf\x80\xfb\x8b\x11"
+ "\x0f\xe1\x61\x41\x5f\xdd\x1f\x16\xc2\xc3\xc1\xf2\x7e\xea\x6f\x8b"
+ "\x09\x0f\x03\xcb\x53\xfa\xc3\x40\x78\xf2\x5f\xde\xaf\xfc\xc3\x93"
+ "\xfd\xcb\x7d\xce\x7c\x17\xcb\x3e\x3c\xb9\xbf\x1c\x10\xff\xd8\x37"
+ "\xa0\xa6\xcf\xed\x34\xb2\x39\x93\xcb\x2f\xb3\x73\x91\x9f\x37\xbf"
+ "\xca\xc5\x91\xc7\x36\x11\xa2\x2a\x24\xd7\x3e\x56\x7c\x82\xc6\xf1"
+ "\x7d\xee\x57\xe4\x9b\x8a\x88\x14\xfa\xd0\xd2\xf7\x36\xd4\x4b\xad"
+ "\xae\x89\xa8\xb7\xdc\xbb\x53\x9d\x92\x1f\x42\xfa\x87\x60\x07\x3b"
+ "\xc0\x97\x65\x79\x95\xd9\xf3\xd3\xe3\x08\xbf\xe7\x0e\xfa\x11\x33"
+ "\x57\x9f\xa0\xb8\x97\x39\xfe\x6b\xd0\xaf\x85\x18\xff\x90\x5c\x0b"
+ "\xbf\x75\x01\x8e\x21\x1f\x27\xf9\x3d\xe7\x90\xcc\x74\xf0\xb4\x0e"
+ "\xb6\xe6\xfd\xf3\x66\xec\x2b\xd0\x0c\x1d\xc6\x32\x73\xc0\xb7\xd7"
+ "\x47\x38\x88\xb4\x84\x3f\x8f\xe7\x95\x14\xbb\x24\x69\xb1\xb0\x6f"
+ "\xb5\x8d\x8f\xb9\x07\x65\xc7\x98\x7b\xaf\x42\xbf\x01\xe9\xef\x30"
+ "\x10\xe9\x47\x7c\x8c\xe2\x57\x4a\x31\x0e\x5f\x7f\xfb\xbf\xdd\x26"
+ "\xfb\x21\xfc\x3d\x35\x81\x7d\x3e\x4d\xa4\xb5\x1d\x0e\x42\xa3\xdf"
+ "\x89\xcb\x87\xfe\xc9\xd4\x5b\x71\x3c\xa5\x9d\xa4\x6f\xa2\x1c\x8e"
+ "\x6d\x51\xc5\x71\x23\xae\x3f\x64\x31\xe2\x93\x26\x63\x5f\x5f\x38"
+ "\x87\xe9\x86\x53\xf0\xcc\xf7\x91\x70\x1d\x8e\xa2\x4c\x4f\xf3\x95"
+ "\x71\xb5\x1d\xed\x84\xc5\x39\x4f\x7a\x08\xe3\xa1\x9d\x53\xd8\x2d"
+ "\x1d\x0a\x7b\x55\x67\x4e\xd2\x44\x4f\x1d\xf0\xfb\x9e\x74\xec\x13"
+ "\x22\x1d\xbc\x4f\xf0\xec\x07\x0f\x70\x56\xf1\xe8\x78\x0d\x75\x20"
+ "\x7f\x59\x59\x56\x1c\x44\x19\x50\x93\xbd\xb2\x23\x43\x37\x8e\x8d"
+ "\x91\x24\xb5\x60\x5f\x1b\xca\xbd\x9b\xf5\x7b\xcb\x76\xf3\x7b\xff"
+ "\xc1\x1e\xcc\xd1\x49\x43\xf4\x89\x93\xf8\xbd\xb0\x96\x71\x68\x7f"
+ "\x57\xbc\x0b\xf9\x3f\xd8\x2c\x59\x21\x9c\x83\x5b\x56\xc9\xf6\x74"
+ "\x26\xed\x86\x6f\x54\xc2\x73\x22\xd2\xc1\x7b\x9d\xf0\xde\x22\x7a"
+ "\x6f\xc1\xf5\xa8\xc2\xfb\x69\xc2\xfb\x43\xa2\xf7\x87\x0c\xe3\x70"
+ "\xdc\x63\x85\x01\xeb\x00\x7c\x2c\x85\xf7\xfb\xf9\xb8\x09\xfc\x19"
+ "\x91\x65\xa5\x02\xdd\xfe\x36\xc9\x8a\x2d\xe7\x00\x63\xf0\xfe\x80"
+ "\xe8\xf7\x07\x3e\x32\xc6\x92\xc7\x8a\x91\x87\x2b\x8a\xec\xd2\xe3"
+ "\x42\xcc\xe9\xa4\x72\xbe\xee\x60\x43\xc5\xf9\xd9\x25\x2b\xf4\x68"
+ "\x27\x3b\xc0\x47\x03\x9a\x02\xfc\xa6\x98\xdf\x9e\x9d\xa5\xda\xc5"
+ "\x2b\x16\x6a\x17\xad\x5a\xbb\x12\x77\x06\xfa\xee\x79\x53\xe3\xde"
+ "\x59\xce\xd4\x58\x6e\x2d\xc4\xbd\x7c\x6a\x7e\xdf\xf8\x36\x5c\xa3"
+ "\x15\xd9\x64\x77\xe7\x37\x19\xb8\xc8\xe3\x05\x96\x0d\x8f\x92\x33"
+ "\x92\x95\xfc\xfc\x81\x15\x34\x9b\x09\xde\x5b\x36\x7c\x8c\x69\x7c"
+ "\x1c\x66\x3c\x2b\x86\x1f\x0f\xd8\x20\x27\x87\xb4\xed\xfc\x98\x02"
+ "\xbc\x5b\xcf\x8f\x9f\x9c\x27\x52\x57\xb6\x9c\xec\x4b\xaf\x93\x1e"
+ "\xe0\xec\xd2\x7d\x5c\x3d\xbf\x16\xfa\x23\x4d\x15\xb9\xd3\x28\xc7"
+ "\x33\xe6\xa4\x1f\x40\x3f\x1d\xdf\xe3\x3b\xcf\xde\x22\xf8\xfd\x11"
+ "\x7e\x5d\xf4\xcd\xec\xff\x8c\x42\xda\xf4\x91\xc6\x21\xec\x29\x5f"
+ "\x39\x16\xcb\x8a\xeb\x1c\xdb\x24\x2b\x6f\xc2\xf2\xd9\x25\x2b\xb5"
+ "\x11\x45\xfc\xfa\x70\xc5\x19\xc9\x2a\x25\x67\x6e\x2c\x47\xdd\xe0"
+ "\xca\x59\x71\x94\x66\x2b\x7e\x8b\xfb\x0a\x8b\xde\xf0\xec\xa1\x5d"
+ "\xe9\x14\xed\xb3\x53\x9c\x93\x92\x87\x3b\x73\x56\x29\x3c\x31\x33"
+ "\xf0\xec\xa2\x40\xba\xc6\x09\xfe\xe3\xc5\xe8\x5d\x55\x9c\xa2\x11"
+ "\x64\xd1\x58\x5e\x35\x85\xe0\x98\x8e\x04\xd7\x25\xb7\x49\x56\xcb"
+ "\xa8\xb2\xb1\x30\x1d\xdb\x74\xfe\xf1\x82\xdf\xf2\x31\x98\x9a\xec"
+ "\x7b\x71\x8d\x21\xf0\x72\x0f\x3c\x7f\x3c\xad\x9c\x68\x9f\x41\x7f"
+ "\x6c\xd5\xa6\x27\x17\x53\xd7\x6d\xb3\x2c\xa4\xba\xe5\x8f\xe4\x93"
+ "\xa3\x55\x44\x31\x8f\x44\x64\xd8\xa9\x9b\xaf\x63\x0a\x91\xc6\xdb"
+ "\x49\x04\xc6\x73\xc2\x18\xee\xb8\x47\xa3\xd6\x59\x03\x3e\xd2\xfb"
+ "\x29\xef\xa5\xb7\x0e\xd3\xce\x24\xe0\x5b\xb1\xf9\x6b\x7e\x0f\x92"
+ "\x83\xdf\x17\xae\xc4\xb1\x74\xd1\xde\xa3\x6d\x69\x89\x94\xdb\x74"
+ "\x9a\xc8\x6b\xf4\x5f\x90\xf8\xc4\x08\xca\xef\x3d\x32\x02\xa1\x03"
+ "\x64\xbf\x8e\xad\x13\xdc\x7e\x81\x44\xd5\xa6\xd8\x89\xb5\xad\x8a"
+ "\xec\x48\x26\x51\xb4\x53\x3f\xb2\xba\xea\x63\x42\xf3\x27\x27\xfe"
+ "\x3e\xdd\x32\xcc\xad\x60\x6b\xb7\x54\x59\x12\x1c\x3b\x8d\x34\xe1"
+ "\x1a\xae\x0b\x24\x76\xc1\xbf\x32\xf9\xf1\x5e\x1c\x5b\x77\x75\xea"
+ "\xb4\xdd\x9d\xba\x9b\xbb\xd6\xe9\xc6\x79\xc6\xe4\x5f\x3c\xad\xc6"
+ "\x39\x88\x04\x9a\xb3\x30\x11\xf7\x2d\xa1\x2f\xea\x52\xc6\xe9\x71"
+ "\xfc\x9d\x8f\x4f\xb3\x4e\x17\xcd\x2d\xd2\x91\x3b\x1d\xfc\xbe\x28"
+ "\x9c\x13\x50\x97\xbc\x84\x65\x6d\x27\xfc\x3a\x24\x25\x5b\x87\xe4"
+ "\xc4\xf9\x70\x45\x93\xe6\x29\x30\xab\x5d\x63\x77\x55\x59\x8d\xbf"
+ "\x25\x19\x17\x69\x13\xdf\x47\x30\x02\x6e\x73\x56\xc5\x50\x65\x93"
+ "\xe6\xb0\xee\x18\xda\x96\x89\xa1\xeb\x07\x03\xbf\x96\x15\x79\x03"
+ "\x72\xb2\xef\x6d\x47\xb9\x1d\x2f\xf8\x5d\xb2\x43\xfa\x44\x0b\x75"
+ "\xd5\x2c\xfe\x2d\xf9\xa4\xbe\xce\x47\x3e\xbc\x3c\x81\x0e\xe5\x84"
+ "\x32\x42\x59\x79\xe5\x74\x8c\x97\xd3\x5e\x8e\xc9\xa9\x4b\xf1\xb9"
+ "\xdd\x23\x2b\x67\xd1\xae\xfa\x60\xe4\x55\xdd\xe2\x5f\x5e\xc0\xe7"
+ "\x1e\x79\xbd\xd5\x4e\xa2\xac\x6d\xe0\x37\x83\xbc\x9e\x78\x9a\x90"
+ "\x27\xf6\x50\xae\x66\xda\x67\x3d\x72\x73\x99\x02\xc8\xed\x2b\xaf"
+ "\xdc\x40\xfe\xfd\xc9\xad\x25\x14\xb9\x55\xb7\x30\xb9\xb9\x84\xf5"
+ "\x63\xba\x43\x44\xea\x5c\xa7\x93\x16\x5e\x20\x13\x51\x7e\x33\xfe"
+ "\xa5\x25\x87\x67\xd7\x80\xcc\xfe\xe8\x23\x3f\xce\x6c\xaf\x04\x19"
+ "\x54\xa3\x0c\xc3\x6b\x77\x29\x69\xc1\xb7\xbb\xe4\xf3\x57\xdb\xdd"
+ "\x50\xb5\xbb\xe4\xa2\xc1\xb5\xbb\x94\x69\x57\xdb\xdd\x37\xdd\xee"
+ "\x52\xa6\xf4\x6e\x77\x3d\x7e\x43\xf2\x92\x15\x0b\x97\xaf\x5c\xbe"
+ "\x72\x99\xf6\xa5\xf5\x29\x4b\xd6\x30\xef\xc1\xc7\x7f\xd0\xb8\xd3"
+ "\xe3\xa4\x78\xa6\x7b\x75\x61\x1d\xf9\xfd\x0d\x75\x52\xf7\x97\x1a"
+ "\x19\x35\x3d\x5b\xc1\x99\x9e\x8b\xc5\xf3\xdd\xb1\x7d\xe2\xb9\xef"
+ "\x27\x25\x1b\x1c\x18\xeb\x90\xc5\x89\xd9\xc0\xe2\x69\x44\xbf\x93"
+ "\x80\x73\x41\xaf\x6e\x20\xb2\x57\x71\xdf\xb7\x13\xc7\x5c\xf8\xf7"
+ "\xcf\x63\x5c\x36\x5a\xfc\x4e\x02\xc6\xea\xe9\x50\x94\x25\x6e\x86"
+ "\xbc\x1c\xca\xc6\x72\x99\x16\xf7\xb5\xa4\x42\xb9\x57\xb4\x79\x63"
+ "\x2f\x6d\x88\xa6\xc3\x53\x15\xa8\x17\x70\x1f\xe2\x19\x49\xea\xe9"
+ "\x8b\x38\x8f\x02\xbe\xf4\x9c\x5b\xe1\x3b\x63\x77\xd5\xf3\x71\x25"
+ "\x40\x47\xb0\xf7\xc6\x3d\xf8\xfd\x8b\xa6\xe3\x05\xe8\x6f\x9c\x53"
+ "\x34\xd9\xcf\x99\x9a\x0c\x1f\xa7\x15\x0a\x3a\x62\xdd\x98\x27\x0a"
+ "\x99\x8e\xa8\xd1\x00\x06\x67\x00\x06\x13\x06\xd2\x11\x22\xec\x8d"
+ "\x0b\x4d\x47\x20\xd6\x10\x73\x88\xb7\x6b\x00\x6f\x88\x41\x0f\xe6"
+ "\x7e\x25\x60\x4e\xd5\x48\xd4\x3c\xee\x5c\x0c\x77\xb8\x8f\xbb\xc6"
+ "\xe8\xc5\x9c\xbb\x37\xe6\x2e\xf4\xc2\x9c\x54\xc0\xdc\x3a\x5f\xcc"
+ "\xcd\xfd\x42\x4d\x76\xf0\x98\x4b\xf4\x62\xce\x1c\xa7\xf7\xe0\x0d"
+ "\xb1\x87\x38\xe3\x96\xe9\x48\x4d\x5b\x7b\x0f\xf6\x4a\x96\xb2\xb9"
+ "\x5c\x7e\xad\xb0\x94\x56\x5c\x5c\x27\xe8\x8a\xd3\x1e\x5d\xf1\x56"
+ "\x00\x1b\xfd\x45\x98\xba\xc2\xc8\xe2\xbf\x80\xac\xba\x40\x6e\x28"
+ "\xaf\x27\x34\xa0\x23\x34\xbb\xc8\x27\xb3\xaf\x10\xf9\x24\x0f\x8d"
+ "\x7c\xf0\x4c\x6c\x28\x8b\x1f\x19\x2d\x68\x1b\x48\x46\x28\x1f\x94"
+ "\x13\x2f\x1f\x90\x93\x67\xbe\x1d\xe7\x5f\x51\x56\x28\x9f\x3b\xd2"
+ "\x88\x14\xe5\x55\x92\xca\xf4\x03\xea\x01\x7e\x7d\x77\x2f\xfd\x0e"
+ "\x3c\x37\xa0\xcc\xf8\x3e\x76\xb6\x72\xd9\xb6\xd1\xde\x33\x74\x3a"
+ "\x73\x36\x4c\xee\xeb\x43\x6f\x98\xe5\x8d\x3b\x97\x2a\x9c\x0b\xda"
+ "\x98\xc0\x7c\xf6\x8d\x6f\x0b\x6d\x3e\x0e\xfb\xaa\x7c\xbf\xd4\x0d"
+ "\xfd\x52\x05\xf4\x4b\x4d\xd0\x2f\xc5\x71\x43\x3e\x26\xc3\x86\x62"
+ "\x36\xa7\x07\xfd\x50\xe5\x71\x23\xf4\x89\xf4\xc8\x4b\x7e\xfe\x58"
+ "\x69\xb7\xe0\x7c\x17\x35\x43\x9f\x77\x97\x94\xc0\x73\xd5\x61\x9d"
+ "\x3b\x44\x1c\x6d\x38\x20\xcc\x8f\x6b\x58\xbc\xc2\x8d\x26\x56\xbe"
+ "\x54\x7e\x5d\x23\x3f\xb7\x28\xe5\x4a\xdd\xaf\xfa\xce\x2d\x8a\xe7"
+ "\x9e\x7f\x9f\xee\x10\xe6\x15\x37\xb2\xf8\x5e\xd8\x5f\x02\xbd\xf7"
+ "\x1e\xf4\x61\xbc\x73\x8b\x9f\xe1\xfb\xb5\xbe\x73\x8b\x1b\x85\xb3"
+ "\xbb\x36\x96\xe2\x7a\x1a\x78\x9e\xc7\xd2\x53\x53\xc4\xe9\xde\xb9"
+ "\x7b\x96\x8e\x7b\xb8\x84\xb1\x81\x36\x36\x2e\xb0\xb1\xd2\xd3\xff"
+ "\x0e\xe0\x2f\x85\xa0\x97\x33\x8b\xbc\x7a\x39\x93\x1f\x3b\xa7\x9a"
+ "\xe6\xdc\x9a\x3e\x7a\x19\x63\x7d\x65\x0e\x9b\x89\x7a\xd9\x74\x3c"
+ "\x93\x95\x2f\x6d\x2a\xf0\x24\x02\xcf\xbe\xc3\x74\xdc\xeb\x84\x3a"
+ "\xba\x98\xd7\xd9\xcd\xc6\xcd\xfc\xfa\x81\xb4\xc5\xbe\xba\x3a\xa3"
+ "\xca\x57\x57\xa7\x6d\xef\x5f\x57\xa7\xcf\xe9\x5f\x57\xa7\x1d\xbe"
+ "\xaa\xab\x87\x5a\x57\x7b\xfc\xba\x70\x75\x75\xba\xf6\xaa\xae\xbe"
+ "\xdc\xba\x3a\x3d\x5a\xa4\xab\x67\xfb\xea\xea\x8c\xd6\xbe\xba\x3a"
+ "\xc3\xe5\xd5\xd5\x69\x06\x5f\x5d\x9d\xf5\x54\x70\xba\x3a\x73\xfa"
+ "\xa5\xd5\xd5\x99\x7a\x5f\x5d\x9d\x35\x51\xd0\x3b\xca\xd0\x75\x75"
+ "\xd6\x98\xfe\x75\x75\xd6\x4d\xbe\xba\x3a\xb3\x83\xe9\xe4\xac\x19"
+ "\x4c\x57\x67\x09\xe9\x69\x0a\x71\xba\x57\x57\xb3\xf4\xbe\xba\x3a"
+ "\x6b\xf1\x00\xba\x5a\xe7\xe6\x3c\xba\xba\x1e\x74\x75\xbd\x94\x5b"
+ "\x16\x48\x57\xe7\x94\xd6\xa0\xae\x4e\x46\x5d\x9d\x53\xda\xbf\xae"
+ "\xce\x19\x89\x3a\x99\x8f\xf5\xf9\x26\x6d\xe1\x63\x2d\xbe\x49\x5b"
+ "\x11\xa7\x33\xd3\x20\x1d\xd2\x30\x26\x25\xd2\x31\x1e\x7b\x74\x7a"
+ "\xf6\x98\x1e\x9d\x0e\x74\xdc\x18\xaf\x4e\x47\x7d\x8e\x7a\xbd\xf8"
+ "\x4d\x6a\x2f\x79\x13\xcf\x2f\xc9\x8e\xf3\xe8\x76\x33\xa4\xe1\x19"
+ "\x25\x18\x4f\x09\xd7\x5e\x02\x0f\x5a\x5e\x85\xef\x21\x3d\xd0\xe9"
+ "\x7d\x6d\xc0\x6b\xd5\xbe\x36\x20\xbb\xb8\x7f\x1b\xb0\xf9\xf9\xfe"
+ "\x6d\x40\xf6\x91\xab\x36\xe0\x4a\xb3\x01\x9b\x63\xae\xda\x80\x81"
+ "\x6d\x80\x3f\x19\xf5\xb6\x01\xb7\x0b\x36\xa0\x78\x40\x1b\xb0\x59"
+ "\x1b\xd8\x06\xbc\xd6\xd6\xd7\x06\xe4\x10\xaf\x0d\xc8\x4e\xf1\xb5"
+ "\x01\xbf\x78\x3a\x38\x1b\x90\xf3\xd4\xa5\xb5\x01\x39\x49\xbe\x36"
+ "\xe0\x17\x93\x05\x1b\xf5\x17\xb1\x0d\xe0\x22\x82\xb1\x01\xbf\x18"
+ "\xeb\xb1\x01\xa8\x63\xdf\xc3\xf9\x86\x1e\x1b\x80\xba\xf0\x17\xb7"
+ "\x58\x52\x9b\x45\x36\x20\xc7\xc9\x74\xfd\x2f\x66\xb9\x79\x1b\xf0"
+ "\x0b\x85\x60\x4b\x2a\xc5\xe9\x5e\x1b\xc0\xd2\xdd\x62\x1b\xd0\x8a"
+ "\x36\xe0\x17\xfa\x01\x6c\x40\x6c\xf0\x36\xc0\xe4\xf4\xda\x00\x93"
+ "\xd3\x63\x03\x50\xef\xa3\x0d\x40\x9d\x8d\x76\x80\x8f\x5b\xc6\xaf"
+ "\x37\x31\x2d\x54\x39\x88\x1c\xe3\x14\xe3\x98\x0a\xea\xee\xfc\x76"
+ "\x66\x0b\x78\x9a\x95\x8c\x06\xf4\x79\x0b\xe8\xf0\x56\xd0\xe1\xad"
+ "\xe6\x33\x44\x06\x74\xf5\xf9\xb8\x76\x11\x9e\x51\xd7\xab\xda\xc0"
+ "\x6e\xb8\x78\xbb\x51\x8f\xf6\x86\xf1\xcb\xb4\xd0\xd7\x76\xe4\xce"
+ "\xf1\xd7\x1f\x28\x10\xd9\x8e\x92\xeb\xe9\xd1\xce\x9c\x5c\xa3\xc7"
+ "\x1e\xe4\xc3\x33\xda\x8c\x82\x76\xde\x66\xd8\xc1\x66\xb4\x30\x9b"
+ "\x91\x5b\xd4\x43\x03\x65\xe0\x69\x98\x5d\xa9\x7f\x15\xcf\x7b\x63"
+ "\x34\x16\x5f\xbb\x62\x8a\xf1\xb5\x2b\xb9\xe7\xd1\xae\x40\x1d\xf0"
+ "\x6c\x34\x09\x67\x6e\x2c\x74\x17\xef\xaa\x47\x1b\xc3\xde\xe7\xfd"
+ "\xa1\xc7\xae\x5c\x2f\xb2\x2b\x46\x8f\x5d\xd9\x72\xd3\x15\x6f\x57"
+ "\x00\xcb\x35\x69\xdf\x25\xbb\x92\x97\x76\x25\xd8\x15\x94\xcd\x35"
+ "\xa2\xb1\xe1\x40\x76\x05\x63\x58\xd4\x24\x7d\xdb\xed\x4a\x9e\x31"
+ "\xb0\x5d\x31\x4d\xe9\x6b\x57\x4c\x09\x5e\xbb\x92\x5b\xed\x6b\x57"
+ "\xcc\x7b\x82\xb3\x2b\xa6\x77\x7b\xdb\x15\xe4\x65\x3e\x5b\x63\xd1"
+ "\x86\xf6\xc4\x6d\xb6\x5b\x38\xb4\x2d\x61\xd9\x15\xd3\x21\x5f\xbb"
+ "\x62\xde\x26\xd8\xbd\x83\xa1\xdb\x15\x33\x3f\x76\x94\xef\xb1\x2b"
+ "\x17\x7a\xdb\x15\xf3\x26\x5f\xbb\x62\x9e\xc5\xec\x87\xb9\x9c\xd9"
+ "\x15\xf3\x62\xc1\x3e\x1d\x10\xa7\x7b\xed\x0a\x4b\xef\x6b\x57\xcc"
+ "\x96\x01\xec\x8a\xa2\xbb\x68\x57\x7d\x97\xa9\xc9\xe2\xda\xbd\xcf"
+ "\x30\x7e\xde\x8d\xee\xde\x6d\x83\xb5\x09\x37\x3b\x37\xc8\x33\xc7"
+ "\xf5\x2c\x21\xdd\x8a\xcf\xed\x9c\xb0\x3f\xba\x2b\x7a\x57\xd5\xc9"
+ "\x24\x68\x1f\x6d\x81\xdb\x07\xb4\x0d\xb9\xa7\x6d\xd4\xe8\xff\x45"
+ "\xa0\xbd\x48\x71\x8e\xeb\x2d\x68\x17\xd6\x8e\x7a\x5e\x8f\x29\x5a"
+ "\xb4\x04\x63\x5d\x2a\xdb\x88\x5a\x29\x91\x0c\x7f\x12\xbc\x7a\x37"
+ "\xb4\x91\xa9\xb7\x52\xee\xb6\x46\x2d\x51\xea\x49\x24\xb6\x93\xf7"
+ "\x85\x39\x14\x8c\x6d\x81\x73\x27\x80\xcf\xd8\x05\x9f\xb2\xf6\xf1"
+ "\x16\x5c\x5d\xac\x7d\x8c\xeb\xea\xd4\xdd\x1c\x68\xee\xc4\x6a\xb4"
+ "\xf3\x73\x27\xb8\xf7\x08\xf7\x7c\x71\xd0\x3e\x28\xce\x9d\x38\x59"
+ "\x9b\x80\xf2\xaa\x77\xf2\x73\x27\xcd\x3e\x73\x27\x3f\x69\x24\x52"
+ "\x8c\x7b\xb1\x43\x3c\x77\xa2\xab\xe9\xd3\x26\xb0\xad\x60\x9b\x08"
+ "\x5d\x7f\x6d\x9d\xdc\xdf\x5a\x26\x17\xf0\xda\xad\x68\xb2\xd0\xb7"
+ "\x9a\x2b\x7e\xd7\xec\x94\x60\x8c\x51\x37\xc8\x8e\x03\x3d\x45\x15"
+ "\xbd\xf4\x54\xb7\x20\x87\x6e\x26\x07\x90\xa1\x7c\x7e\x07\xa1\x0b"
+ "\x5c\xe0\x6b\x75\x0b\x71\x46\x9d\x76\xc0\xa1\x6e\x74\xf1\x06\xe4"
+ "\xbb\x86\x14\x0b\xb1\x46\xb9\x8d\xfa\x91\x1c\xf0\x9a\x66\x4b\xc9"
+ "\x7b\x17\x9c\xfc\x5c\xa3\xa9\x8b\x8c\x07\xbd\xa4\x44\xbd\x04\xd8"
+ "\x1d\xb5\xb3\x0b\xf8\xde\xc4\xf8\x8e\x71\xec\xf0\xee\xda\xa8\xd3"
+ "\x42\xde\x37\x77\x77\x83\x5e\x72\x32\xde\xcf\x5f\xad\x26\x7c\x7c"
+ "\x52\x9c\x6f\x04\x5b\x5f\x0b\xf2\x46\xbd\x34\xb3\x43\x45\xf1\x2c"
+ "\x0f\xee\x4b\x1d\xc6\xf4\x8a\xbe\xb3\x03\xcf\x6d\xd1\x21\x36\xd4"
+ "\x25\x27\x71\xbe\xb1\xc1\x67\xbe\xd1\xb1\xd1\x3b\xdf\x58\x5b\x7e"
+ "\x8c\xad\x0f\xf1\xb1\x1d\xe6\xa3\xdd\xc5\xbb\xaa\x90\xef\xbc\xed"
+ "\x48\x09\x95\xf7\x05\x01\x63\xa5\x5f\x7a\xde\xab\xbf\xe5\xbc\xdf"
+ "\xba\x79\x70\xbc\x7f\x23\x60\xfc\x97\x4b\xcf\x7b\xf9\xb7\x9c\xf7"
+ "\xbf\x24\x83\xe3\xfd\xaf\x2a\xfa\xe3\x3d\xf6\x3d\x3c\xfd\x0e\x4f"
+ "\x9f\x03\xed\x18\xb3\xc3\x6f\x4e\xf1\xf6\x37\xde\x9c\xe2\x99\xb7"
+ "\x05\x9e\xc9\xcc\xc2\x78\x93\x61\x29\x9e\x87\xf1\xeb\xbf\x78\xe6"
+ "\x6c\xd1\xdf\xe7\xe5\xf8\x16\xc8\x71\x25\xee\x1d\x12\x64\x08\x36"
+ "\x67\x41\x07\xd8\x85\xb1\xbb\xea\xdd\x66\xb0\x49\xef\xee\x33\x04"
+ "\x90\xa7\x14\xed\x89\x32\x85\xa8\xe7\x1b\xbc\x72\xe5\x36\x82\x3c"
+ "\xbb\xc0\xcf\x72\xb6\x12\xdc\x0f\xac\x6a\x05\xff\xab\x5b\x3f\x72"
+ "\x1e\xf8\xf3\x1e\x99\xbe\x9f\xea\xe4\x7d\x2c\xbf\x32\xdd\xee\x2b"
+ "\xd3\x73\x7e\x64\xfa\xe2\x72\x68\xa7\x52\xc1\x0f\xe6\x65\x6a\xef"
+ "\x91\x29\x6f\x47\x36\xea\xa2\x51\xae\x1e\x99\xa2\x1d\xe1\x65\xda"
+ "\xc6\xec\x48\x4f\xec\xa4\x8d\x5e\x3f\xb8\x3a\xf1\x0b\x3f\x32\x7d"
+ "\x23\xcd\x47\xa6\x89\xa1\xca\xf4\xd7\x9b\x7d\xfd\xaa\x37\xbf\x0e"
+ "\xce\xaf\x7a\x53\x82\xbe\x93\xd8\xaf\xc2\xe7\x73\xd0\x57\x77\x2b"
+ "\xed\x87\x3a\xc2\xf2\xa5\xde\x54\xfb\xfa\x52\x6f\x36\xb2\x32\x6d"
+ "\xbb\x3d\x74\x5f\xea\x4d\xde\xff\x7a\xef\x2d\xd6\x07\xf6\xf5\xa3"
+ "\xde\x3c\xec\xeb\x47\xbd\x59\xc8\xfc\xa5\x37\x1d\xe7\xb2\xd1\x8f"
+ "\x7a\x73\x2f\x4b\xdf\x36\x5e\x9c\xee\xf5\xa3\x58\x3a\x3b\xd3\xfe"
+ "\x4d\x57\x68\xbe\xd3\xf7\xbf\x61\xdf\x49\xd3\x8f\xef\xa4\xf9\x8e"
+ "\xf8\x4e\x85\x01\xd7\xff\x5f\xb5\xdf\x03\xd9\x90\xff\x52\x0f\xce"
+ "\x86\x6c\xef\xb8\x6a\xbf\xc3\xe5\x7d\xa1\x65\x70\xbc\xdf\xd1\xef"
+ "\xfe\x87\xfe\xed\x77\x89\xcc\x6b\xbf\x4b\x64\x81\xed\x77\xf1\xfa"
+ "\xab\xf6\x3b\x14\xfb\xfd\xd6\xe4\xc1\xd9\xef\xe2\x29\xbe\xf6\xbb"
+ "\xe4\x0f\xc1\xd9\xef\xe2\x0f\x87\xde\x7e\x17\xd7\xf9\xda\xef\x92"
+ "\x22\x56\xa6\x1d\xa7\x43\xb7\xdf\x25\x9b\x02\xdb\xef\x92\xd7\x7c"
+ "\xed\x77\x49\x02\xb3\xd3\x25\x15\xcc\x7e\x97\x24\xb1\xf4\x1d\x6d"
+ "\xe2\x74\xaf\xfd\x66\xe9\xcc\x7e\x97\x1c\x08\xcd\x7e\xab\xbe\x61"
+ "\xfb\xad\xee\xc7\x7e\xab\xbf\x23\xf6\xbb\x74\xe2\x55\x1b\x12\xae"
+ "\x0d\x29\xa9\x1b\x9c\x0d\x79\x3b\xe0\xf9\xd7\x03\xdb\x90\xdd\xd3"
+ "\xbc\x36\x64\xf7\xb4\xc0\x36\xe4\x9d\x83\x57\x6d\x48\x28\x36\xa4"
+ "\x34\x73\x70\x36\xe4\x9d\x5c\x5f\x1b\xb2\xfb\x7c\x70\x36\x64\xf7"
+ "\xb0\xa1\xb7\x21\xbb\xa3\x7c\x6d\xc8\x6e\x3b\x2b\xd3\xae\xbb\x42"
+ "\xb7\x21\xbb\x3f\x0c\x6c\x43\x76\x1f\xf1\xb5\x21\xbb\x85\xb3\x32"
+ "\x76\x77\x30\x1b\xb2\x5b\x88\x6b\xbf\x2b\x56\x9c\xee\xb5\x21\x2c"
+ "\x9d\xd9\x90\x77\x49\x68\x36\x64\xc4\x37\x6c\x43\xe4\xfd\xd8\x10"
+ "\xf9\x77\xc4\x86\xfc\xa6\xcf\xf9\x87\xc1\xeb\xb1\x3d\x6a\xaf\x1e"
+ "\xdb\xa3\x0e\xac\xc7\xca\x5f\xbb\xaa\xc7\x42\xd1\x63\xef\x46\x0d"
+ "\x4e\x8f\x95\xcf\xf2\xd5\x63\x7b\x0e\x06\xa7\xc7\xca\x6b\x86\x5e"
+ "\x8f\x95\x37\xfa\xea\xb1\x3d\xe5\xac\x4c\xbf\xb9\x18\xba\x1e\xdb"
+ "\xb3\x25\xb0\x1e\xdb\xf3\x4b\x5f\x3d\xb6\x67\x31\xd3\x57\x7b\x0e"
+ "\x30\x3d\xb6\xc7\xc8\xd2\x7f\xe3\x14\xa7\x7b\xf5\x18\x4b\x67\x7a"
+ "\x6c\x4f\xd5\x40\x7a\x0c\xdb\x45\x8d\xa6\x57\xbb\x78\xc5\xd3\x2e"
+ "\xf6\x4e\xfc\xa4\xc8\xd3\x2e\xf6\xf2\x3e\x1a\x57\xf4\x4e\xc2\xeb"
+ "\xa9\x44\x66\xc2\x33\x71\x40\x47\x18\x5e\xc0\x76\xf1\xbb\xf7\x70"
+ "\x7d\x89\xa2\x11\xf4\x5e\x8b\xa0\x07\x8d\xa0\x07\x5b\xe0\x19\xe3"
+ "\xa4\x8d\x7d\x27\x01\xf5\x17\xae\xd3\xc0\x67\xa6\x0f\x1d\xc3\xf0"
+ "\x4c\x1e\x7e\x9e\x5d\xd4\x6e\xf8\xb6\x72\x4e\x68\x2b\xe7\x58\x5b"
+ "\xf1\xec\x97\x4b\x6b\xa1\x9c\x7b\x8d\x6e\x74\xfc\xe2\x08\x8a\xed"
+ "\x87\xdf\x87\x05\xed\x87\xae\xd1\x45\x16\x25\x43\x9b\x71\xb4\x12"
+ "\x8c\x85\x8f\x6d\x46\x99\x25\x89\xa4\xe7\xf4\x23\x41\x27\x32\xdd"
+ "\xc7\x55\x0d\x73\x61\x5c\xab\x35\xa0\xfb\xda\x41\xf7\xb5\x7b\xdb"
+ "\x0a\xce\x9d\x9f\x5b\xa3\xd3\x76\xac\xd1\x8d\xeb\x3e\x07\xba\xcf"
+ "\xd1\xbb\x9d\x2c\x68\xdb\xd9\x8e\xba\xaf\x95\x6f\x27\xbc\xee\x83"
+ "\xb6\xc1\x9d\x03\xdd\xb7\x4c\xd0\x7d\xe7\x74\xa8\xeb\xd5\x3b\x97"
+ "\x82\xee\x4b\x3c\xc5\x74\x9f\xe0\xc3\xfd\x10\x75\xdf\x1a\x9d\xf4"
+ "\x57\xed\x82\xee\x5b\x88\xba\xef\x30\xb4\x91\xbf\xfa\xea\x3e\x65"
+ "\xb8\xba\xef\x77\x46\xdf\x76\xb2\xf7\x5f\xc1\xb5\x93\xdf\x9d\x0f"
+ "\xd4\x4e\xba\xcd\xe1\xb6\x93\xbd\x32\xdf\x76\xb2\xb7\x8e\x95\xe9"
+ "\xb7\xd7\x86\xde\x4e\xf6\xfe\xa1\xa7\x9d\xbc\xd2\xbb\x9d\xec\xfd"
+ "\x8b\x6f\x3b\xd9\x6b\x62\xed\x61\x6f\x0b\x6b\x27\x7b\x4b\x59\xfa"
+ "\x6f\xd5\xe2\x74\x6f\x3b\x61\xe9\xac\x9d\xec\x75\x5c\x9d\x2f\xff"
+ "\xb6\xd9\xfb\xf7\x93\xae\xce\x97\x87\xdb\x67\x7c\x4f\x36\xb8\x3e"
+ "\xe3\xef\x5b\xaf\x8e\xb7\x87\xcb\xfb\xf7\xf7\x0f\x8e\xf7\x7f\x58"
+ "\x7c\x75\xac\x24\x5c\xde\x57\xc4\x0e\x8e\xf7\x7f\xb4\x0f\xd4\xc7"
+ "\x08\xec\x4b\xfd\xc9\x54\xdd\xd3\xc7\xf8\x93\xc9\xb3\x3e\xb7\x6f"
+ "\x1f\xe3\x4f\x12\xdf\xbd\x74\xfb\x7e\xd9\x7b\xed\xec\x40\x7d\x0f"
+ "\xd7\xd5\xbe\x07\xc8\xfa\x0f\x7b\x07\xd7\xf7\xd8\xdf\x6b\x7d\xe2"
+ "\x9f\x1f\x08\xce\xa7\xfa\xd3\xf4\x40\x3e\x95\x2b\xec\xbe\xc7\x9f"
+ "\x12\x7c\x7d\xaa\x3f\xc7\x08\xd8\x78\x31\x74\x9f\xea\xcf\xc3\x02"
+ "\xfb\x54\x7f\x56\xfa\xfa\x54\x7f\xb2\x33\xdf\xe9\xcf\x13\x99\x4f"
+ "\xf5\x27\xe1\x8c\xf0\x7d\xf3\xc4\xe9\x5e\x9f\x8a\xa5\x33\x9f\xea"
+ "\xcf\x53\xae\xce\xa3\x7f\xdb\x7c\xaa\xff\x63\xb9\x6a\xd7\xc3\xb5"
+ "\x2d\x7f\x4e\x18\x9c\x6d\xf9\xcb\x37\xb8\xfe\xf3\xdb\x6e\xd7\x2b"
+ "\xe5\x83\xe3\xfd\x5f\xfb\x5d\xff\xd9\xbf\x5d\x3f\xb8\xd8\x6b\xd7"
+ "\x0f\x2e\x0e\x6c\xd7\x0f\xd8\x7c\xed\xfa\x7f\x2f\xbf\x6a\xd7\xc3"
+ "\xb1\xeb\x7f\xd9\x3c\x38\xbb\x7e\x60\xb7\xaf\x5d\xff\xdb\xb5\xc1"
+ "\xd9\xf5\x83\x37\x0d\xbd\x5d\x3f\x18\xeb\x6b\xd7\x0f\xba\x04\x6c"
+ "\xdc\x1b\xba\x5d\x3f\xf8\x45\x60\xbb\x7e\xf0\x5f\xbe\x76\xfd\xa0"
+ "\xb0\x4f\xed\x6f\x6a\x66\xd7\x0f\x56\xb3\xf4\xff\x9e\x20\x4e\xf7"
+ "\xda\x75\x96\xce\xec\xfa\xdf\xa2\xaf\xce\xaf\x7f\xdb\xec\xfa\x07"
+ "\x01\xcf\xff\xba\x6a\x5b\x06\xb2\x2d\x7f\x1b\x64\x9f\xf1\xc3\xa8"
+ "\xf0\x6d\xcb\x47\x16\xaf\x6d\xf9\xc8\x12\xd8\xb6\x7c\x74\xaf\xaf"
+ "\x6d\xf9\xf0\xf0\x55\xdb\x12\x8e\x6d\xf9\xc0\x3e\x38\xdb\xf2\x11"
+ "\xf1\xb5\x2d\x87\x56\x04\x67\x5b\x3e\xda\x34\xf4\xb6\xe5\x23\x93"
+ "\xaf\x6d\x39\x24\x94\xe9\xc3\x5f\x86\x6e\x5b\x0e\x3d\x10\xd8\xb6"
+ "\x1c\x7a\xc4\xd7\xb6\x1c\x8a\x62\x36\xe4\x50\x12\xb3\x2d\x87\x74"
+ "\x2c\xfd\xc3\x02\x71\xba\xd7\xb6\xb0\x74\x66\x5b\x0e\x19\xaf\xce"
+ "\xbb\x7f\xdb\x6c\xcb\xe1\x7e\xd7\xff\xf6\xaf\xdf\xaa\x4a\xbd\xfa"
+ "\xad\xaa\x34\xb0\x7e\xab\xfa\x9e\xaf\x7e\xfb\xfb\xbb\x57\xf5\x5b"
+ "\x38\xfa\xed\x90\x69\x70\xfa\xed\x7f\xed\xbe\xfa\xed\x48\x90\xf1"
+ "\x80\xaa\x5e\x1c\x7a\xfd\x56\xd5\x2b\xfe\xc3\x11\x21\x06\xd0\xdf"
+ "\x57\x87\xae\xdf\x8e\x8c\x09\xac\xdf\x8e\xdc\xe4\xab\xdf\xaa\x84"
+ "\xf8\x3f\x47\x66\x30\xfd\x76\x44\x48\xff\xbb\x41\x9c\xee\xd5\x6f"
+ "\x2c\x9d\xe9\xb7\x23\x09\x83\x9b\x8f\xff\xc4\xee\x9d\x8f\xff\x84"
+ "\x97\x05\x57\xd8\x9c\xdb\x77\x3e\xfe\x93\x39\x38\x1f\xef\x6d\x2f"
+ "\x47\x6c\xfc\xdc\x3c\xb6\x99\x0e\x16\xbf\xc7\xef\x3c\xfd\x98\xe6"
+ "\xdc\xab\xf3\xf4\x97\x72\x9e\xfe\x13\xad\x6f\xfb\xa9\x36\x07\xd7"
+ "\x7e\x3e\x29\x1e\xfa\x79\xfa\x4f\xf6\xfa\xb6\x9f\x6a\xa3\x80\x95"
+ "\xb7\x43\x6f\x3f\xd5\xcf\x07\x6e\x3f\xd5\x0b\x7d\xdb\x4f\xb5\xd0"
+ "\xc7\xac\x36\xb1\xf6\x53\x3d\x4d\x68\x83\xa5\xe2\x74\x6f\xfb\x61"
+ "\xe9\xac\xfd\x54\x17\x06\xe3\x1f\xb8\x14\x4d\x87\xd0\xde\x8f\x6f"
+ "\xbc\xd1\xdd\x83\xf3\x14\x01\xe7\xfe\xfc\x83\x97\x98\xbd\xe0\x7d"
+ "\x83\xdd\xfb\x52\x06\xf4\x0f\x5a\x04\xff\x60\x71\x5f\xff\xc0\xe3"
+ "\x1b\x14\x01\xbe\xdf\x0a\x6a\x8e\x5e\xc0\x3b\xfa\x06\x17\x42\xf5"
+ "\x0d\x5e\xf2\xfa\x06\xe6\x5e\xbe\xc1\xb2\x5e\xbe\x01\x8f\xf7\x66"
+ "\x1f\xbc\xf7\xf1\x0d\x7a\xf0\x3e\x54\xbe\x41\xad\xfa\xea\x1c\x7d"
+ "\xb8\xfd\xce\xea\xbd\x83\xeb\x77\x5a\x4d\x57\xc7\xf2\xc3\xe5\x7d"
+ "\xed\x20\xc7\xf2\x3f\x95\x5f\x1d\x6f\x09\x97\xf7\xd6\x41\xc6\x72"
+ "\xf8\x6c\x73\xf8\xfd\x91\x63\xb3\xbc\xfd\x91\x63\xb3\x3c\xfe\x95"
+ "\x27\x36\x22\xe8\x67\x99\x39\x19\xae\x0b\x84\xbc\x9e\xcc\x9f\x33"
+ "\x20\xb7\xb6\x1c\xc3\x73\xd7\xc0\xe7\x3a\x7a\x38\xde\x28\xf6\xb9"
+ "\xfe\xef\x74\x8f\xbf\x15\x8f\xbe\x18\xf8\x56\xe8\x57\x79\xfa\x20"
+ "\x18\xd7\xaa\xdf\xf5\xc3\xb7\xec\x4b\xc1\x3e\x4b\xb7\xb2\xe9\xd0"
+ "\x77\xb7\xbf\xf2\xe9\xac\xc1\xf5\x57\x8e\x16\xf8\xfa\x5b\xc7\xdc"
+ "\xc1\xf9\x5b\xc7\x94\x43\xdf\x5f\x39\x16\xed\xeb\x6f\x1d\x6b\x15"
+ "\x70\x22\x09\xdd\xdf\x3a\x76\x24\xb0\xbf\x75\xec\x53\x5f\x7f\xeb"
+ "\xd8\x6e\xe6\x57\x1d\x73\x31\x7f\xeb\x58\x25\x4b\xff\xbf\x44\x9c"
+ "\xee\xf5\xb7\x58\x3a\xf3\xb7\xfe\x9f\x3c\x48\x7f\xab\x6a\x10\xfe"
+ "\x96\xf1\xdb\xe3\x6f\x2d\xba\xc2\xfd\xad\xcf\x33\x83\xb0\x3b\x87"
+ "\x7a\xd9\x9d\x94\xab\x76\x07\x75\xcd\xff\x8b\x1e\x9c\xdd\xa9\x77"
+ "\x0d\xc8\x7b\x93\x88\xf7\xa8\xf3\x05\xbe\xbb\x63\xf6\xa5\x84\xcd"
+ "\x7b\xd0\xf5\xc5\xe9\xdf\x66\xbe\x7f\x5e\x35\x38\xbe\x37\x04\x3c"
+ "\xff\xf0\xaa\xaf\x35\x10\xef\x6d\x53\x06\xc7\xfb\xe3\x8e\xf0\x7d"
+ "\xad\x7f\x34\x7e\xd2\xe3\x6b\xfd\xa3\xb1\xb7\xaf\x85\xbe\xd5\x53"
+ "\x4e\xe6\x73\xbd\x0e\xbe\x52\xde\x4a\xf0\xbb\x52\x09\xb1\xb6\x1c"
+ "\x24\x26\xf0\xbd\xf2\xce\x80\xff\x95\x04\xfe\x97\xeb\x5d\xc1\xff"
+ "\xfa\xc7\xd3\xbe\xfe\x57\xe3\x11\xbf\xfe\x97\xd2\xeb\x7f\xb9\xc0"
+ "\xb7\xea\x7e\x77\x5f\x4a\xc1\x19\x91\x2f\xf6\x72\x5f\x5f\xac\xcb"
+ "\xdc\x54\xd5\x75\xcb\x3e\x63\x37\xf8\x63\xfd\xf9\x62\x3c\x26\xfc"
+ "\xf8\x63\xff\x19\xbe\x58\xc3\x81\xc1\xf9\x62\xff\x88\xf6\xf5\xc5"
+ "\x4e\x6c\x09\xce\x17\xfb\xc7\xf6\x80\x63\x5f\x61\xfb\x62\xff\x28"
+ "\xf7\xf5\xc5\x4e\xa4\x08\x98\x59\x11\xba\x2f\x76\x62\x4e\x60\x5f"
+ "\xec\xc4\x8b\xbe\xbe\xd8\x09\x61\xef\xe9\x89\x5c\xe6\x8b\x9d\x98"
+ "\xc2\xd2\x1b\x93\xc4\xe9\x5e\x5f\x8c\xa5\x33\x5f\xec\xc4\xb6\x20"
+ "\xe7\xc6\x0e\xb9\xc0\xa6\x7f\xf3\xeb\x29\xfb\x9b\x1b\x1b\xaa\xf5"
+ "\x94\x2f\x5d\xe1\x73\x63\x4d\x03\x8f\x7f\x5d\xf5\x09\xfc\xe8\x9a"
+ "\x13\xe5\x83\xb3\x4b\xcd\xb9\x57\x7d\x82\x70\x79\xdf\x34\xc8\xb1"
+ "\xaf\x16\x59\xf8\x3e\xc1\xc9\x3a\xef\xf8\xcb\xc9\xba\xd0\xc6\x5f"
+ "\x4e\x4e\xf5\xb5\xff\x2d\xfe\xed\xff\xd5\xf1\x97\x10\x6c\x7e\x73"
+ "\xdd\xe0\x6c\xfe\x49\xb5\xaf\xcd\xff\x72\x53\x70\x36\xff\xa4\x79"
+ "\xe8\xc7\x5f\x4e\x16\xf9\xda\xfc\x2f\xf5\x02\x4e\xb2\x42\xb7\xf9"
+ "\x5f\x4e\x0f\x6c\xf3\xbf\x7c\xda\xd7\xe6\x7f\x19\xc3\x6c\xfb\x97"
+ "\x69\xcc\xe6\x7f\x39\x91\xa5\xb7\x64\x8a\xd3\xbd\x36\x9f\xa5\x33"
+ "\x9b\xff\x65\x6e\x68\xf3\x5d\xaa\x2b\x74\xbe\x4b\xfd\x1d\x99\xef"
+ "\xfa\x8a\x5c\xb5\x3b\xe1\xda\x9d\x2f\x8b\x06\x67\x77\x4e\x0d\x18"
+ "\xff\x23\xb0\xdd\x39\x3d\xcd\x6b\x77\x4e\x4f\x0b\xcd\xee\xb4\x1d"
+ "\xf4\xb5\x3b\xff\x7e\xe4\xaa\xdd\x19\xac\xdd\xf9\x6a\xda\xe0\xec"
+ "\x4e\x5b\xaf\xf8\x47\xa7\x83\x8c\x7f\x74\x3a\x60\xfc\xa3\xf0\xed"
+ "\xce\xe9\x5e\xf1\x8f\x4e\x0b\xf1\x8f\x4e\x85\x11\x37\xe4\xf4\x87"
+ "\x81\xed\xce\xe9\x5e\xf1\x8f\x4e\x0b\xf1\x8f\x4e\x0b\xf1\x8f\x4e"
+ "\x0b\xf1\x8f\x4e\x39\xc5\xe9\x5e\xbb\x73\x4a\x14\x37\xe4\xcc\xd5"
+ "\xf8\x47\xdf\xba\x75\x98\x67\x07\xa1\xff\xda\x75\x5e\xfd\xd7\xae"
+ "\x0b\xbc\x0e\xf3\xeb\x62\xdf\x75\x98\x8e\xdb\xaf\xae\xc3\x0c\x47"
+ "\xbf\x9d\x19\x64\x5c\xa4\xaf\xf5\xbe\xfa\xad\xfd\x58\x70\xfa\xed"
+ "\xeb\x7f\x0d\xbd\x7e\xfb\xba\xc3\x57\xbf\xb5\x5b\x58\x99\xce\x86"
+ "\xa1\xdf\xda\xdf\x0e\xac\xdf\xda\xf7\xf8\xea\xb7\xf6\x34\xa6\xc7"
+ "\xda\x8f\x32\xfd\xd6\x5e\xc0\xd2\xcf\x3a\xc5\xe9\x5e\xfd\x76\x56"
+ "\xa4\xdf\xda\xed\xa1\xcd\x6b\x86\xe5\x57\x5f\x86\x79\xcd\xa1\xf2"
+ "\xab\xaf\xf4\x79\xcd\x8e\x84\xab\xe3\x68\xe1\xf8\xd4\xed\x1d\x83"
+ "\xf3\xa9\xcf\xd7\x85\x6f\x53\x9c\xfb\xbd\x36\xc5\xb9\x3f\xd0\xfc"
+ "\x4e\x1e\xe0\xce\x04\x3e\xf1\x96\x33\x44\xf6\x3a\xce\xef\x1c\xad"
+ "\x21\x66\x9c\xdf\x59\xe9\x99\xdf\x29\x16\xfc\x6c\xe7\xad\xbe\x7e"
+ "\xf6\x85\x3d\xfe\xfc\x6c\xf4\xaf\xdd\xe0\x3b\xbb\x7a\xcf\xeb\xbc"
+ "\xe0\xdf\x16\x75\x29\x9b\xaa\x2e\xbe\xbb\xcf\x18\xaa\x2d\xda\xb1"
+ "\x81\xd9\xa2\xb7\xbe\xf5\xb6\xa8\xa3\x74\x70\xb6\xa8\xb3\xc3\xd7"
+ "\x16\x5d\x5c\x18\x9c\x2d\x72\xae\x1e\x7a\x5b\xe4\xcc\xf4\xb5\x45"
+ "\x17\x67\x08\x58\x79\x2a\x74\x5b\x74\xf1\xf6\xc0\xb6\xe8\xe2\xbd"
+ "\xbe\xb6\xe8\xa2\x9c\xd9\x9c\x8b\x89\xcc\x16\x5d\x8c\x66\xe9\x17"
+ "\x66\x88\xd3\xbd\xb6\x88\xa5\x33\x5b\x74\x31\x29\xb4\x31\x9e\x11"
+ "\x57\xe8\x18\x8f\xfc\x3b\x32\xc6\xd3\xd5\x12\xbe\x4e\x74\x97\x57"
+ "\xf7\xec\xdf\x70\x97\xf7\x19\x67\x48\x05\x7f\xbb\x9d\xcd\x73\xf7"
+ "\x8c\x33\xd8\xbf\x10\xf4\x9f\x7b\xac\xaf\xfe\xeb\x0e\xa8\xff\xfa"
+ "\x9b\xcb\xc6\x71\x05\x37\xe8\x46\x57\xf1\x20\xe6\xb2\x53\xbf\xed"
+ "\x3a\xef\xe2\x20\xe3\x2b\xbb\x5a\x7d\x75\x1e\x37\x27\x38\x9d\xe7"
+ "\x5e\x12\x50\xe7\x85\xbd\x8f\xc3\x9d\xe2\xab\xf3\xb8\x38\x01\x1f"
+ "\x0b\x43\xd7\x79\xdc\x4d\x81\x75\x1e\x77\xab\xaf\xce\x73\xbb\x98"
+ "\x6e\xe3\x66\x33\x9d\xc7\xa9\x59\x7a\x77\xa2\x38\xdd\xab\xf3\x58"
+ "\x3a\xd3\x79\x5c\x62\x7f\x3a\x8f\x9a\xca\xaa\x0a\xa4\x5c\x05\x5c"
+ "\x95\x50\xc6\x31\x80\x0d\x0b\xfc\x5f\x05\x32\x1e\x0d\xff\x07\xf4"
+ "\x49\x1c\xca\xb2\x2a\x2e\x1b\xca\x2c\x25\x12\xab\xe3\xac\xc5\x72"
+ "\x83\x0b\xcb\x6d\x67\xfc\x29\xab\x52\xb9\x46\x4c\xe3\xa8\x9e\x80"
+ "\x5c\xaa\xf8\xb3\x31\x81\x1e\xf7\x07\x69\x53\x49\xe4\x19\x09\x25"
+ "\x1e\x3a\x28\x6f\x64\xb3\x84\x3b\x88\x79\x74\xe6\x50\x05\xd4\x25"
+ "\x29\x60\x59\x21\xaf\xf8\x3d\xe3\xc8\x26\x17\xfd\xd2\xb2\xb2\x9d"
+ "\xb4\x48\xe8\x1c\x55\xdb\x88\x69\x34\x23\x81\xa0\x2f\x57\x71\x83"
+ "\x43\x86\x79\xe2\x79\xba\xf0\x6e\x22\xbe\x73\x43\x19\xd3\x57\x10"
+ "\x69\x7e\xfb\x08\x39\xe8\x89\x61\x19\x1d\xb4\x75\x95\x0b\xca\x0c"
+ "\xd8\xfc\x60\x5c\xbd\xec\xf7\x6f\x41\x9a\x9b\x68\xf0\x6c\x52\xcc"
+ "\x03\xfc\x59\x28\x0f\x7d\xbe\x04\xe8\xfd\x95\xe1\xb5\xf7\xc9\xf8"
+ "\x61\xb7\x52\x7b\x68\xb8\xa1\x7b\x03\xf1\x51\x95\x35\x8e\x58\x6e"
+ "\x03\xde\x69\x89\xd4\xdf\xfb\x90\xbe\x23\x25\xfd\xed\x7f\x97\xe3"
+ "\xd9\xc6\x19\xdb\x89\x74\x2b\x37\x42\xfe\x51\x1a\x7f\xfe\xb0\xa3"
+ "\x33\x8f\x64\xda\x25\x8b\x1b\x91\xe7\x78\xae\x25\x9e\xff\x0e\xb8"
+ "\x21\x90\x5e\xf8\xa1\x91\x90\xde\xb2\x48\x5e\xbc\x62\xa1\x36\x65"
+ "\xf9\x8a\x25\xab\xd6\xa6\x68\x6f\x59\x3c\x8a\xcc\x5e\xb5\x4a\xbb"
+ "\x62\xe1\xca\xf5\x5a\xf1\x9b\x49\xda\xc5\xcb\xd7\x2c\x7c\x29\x69"
+ "\xc9\xed\x2b\x16\x19\x46\xa1\xb0\x45\xe5\x88\xc2\xb2\x70\x79\x64"
+ "\x77\xc9\x1b\x84\xfc\x6a\x34\x91\x61\xb9\x3a\xf3\x24\x72\xcf\x19"
+ "\xa6\x78\x86\xa7\x14\x68\x32\x40\x3f\x6e\x4d\x1f\x81\xb4\x51\x3b"
+ "\xa1\x5c\x25\x50\x6e\x28\x23\x94\x59\x32\xc1\x53\x66\x0f\x26\x32"
+ "\x10\x13\xe9\xed\xe4\xa4\x54\x32\x47\xe5\x1c\xf1\x33\x4a\x13\xb0"
+ "\x7e\x18\x43\x4b\x02\x69\xef\xf2\xb6\xcc\x5c\x56\x05\xbf\x35\x78"
+ "\x30\x86\xbf\xa5\xf9\x65\x05\x9d\xd8\x4e\xa8\xfe\xa7\x7c\x9b\x92"
+ "\x4a\xa7\xcd\xd1\x49\x08\x7f\x86\x6a\x9e\xa4\xa8\xe7\x0c\x55\x48"
+ "\x47\xde\x42\x39\xda\x20\x7d\xbf\x5d\x72\x9f\x02\xd3\xf1\xec\x5f"
+ "\x3c\x0b\x15\xcb\x0c\xf5\x02\x5b\x4a\x2d\x34\x5b\xc0\x7e\xee\xf9"
+ "\x59\x9c\xe9\xfa\x58\xab\xec\x02\x89\x77\xd1\x6e\xba\xe5\xfc\xac"
+ "\xda\x8e\x0e\xa2\xca\x32\x2c\xa2\xa3\xc8\x9f\x54\xae\xe5\x4b\xf0"
+ "\x0c\x57\xce\x7c\x7d\x2c\x35\xab\xa6\xcd\xb9\x95\xa8\x3b\xf3\xa4"
+ "\x6a\xd1\x59\xae\xb2\xd0\xe4\x2f\xe5\xe5\x8f\x72\xc4\x33\x5a\x99"
+ "\x1c\xa5\x89\x1f\xa6\xf4\x95\x63\x0f\xfe\xf6\x70\xe4\x30\x60\x81"
+ "\x2a\xea\xd5\xf1\x6e\xc6\x47\x6c\xbb\xe7\x32\xf4\xe4\x4e\x9e\x77"
+ "\x11\x1a\x2e\xff\x73\x07\x67\xaa\xd7\x51\x53\x7d\x14\xf0\xac\x3c"
+ "\x3f\x95\x68\x17\xb8\xd5\xc4\x7c\x81\xc4\x3a\xcc\xf5\xe0\x9f\x64"
+ "\x4a\xc0\x1f\x91\x82\x3d\x89\x05\x9d\x11\x2b\xb4\xf7\x72\xe4\xe3"
+ "\xff\xb6\x11\x32\x73\x0d\x21\x5f\x4e\x26\x11\x25\xf0\xbb\x10\xeb"
+ "\xc3\xdb\x7f\x9a\x27\x2d\xda\x09\xbf\xc5\x33\x7a\x43\xfb\x7d\x44"
+ "\x4c\xc0\x76\xe7\xad\x77\x81\xff\x7a\xcb\xd4\x5c\x7e\xbd\x01\xea"
+ "\x5d\x0e\xf5\xde\xe6\xa7\xde\x05\xac\xde\xc3\xda\x87\xbe\xde\x11"
+ "\x2c\xfe\x75\x5e\xc4\xb6\xf0\xea\x2d\x8b\x1e\xb8\xde\xb6\x00\xf2"
+ "\x1e\x26\x87\x7a\x83\xbc\x6d\x20\x6f\x9b\x1f\x79\xdb\x04\x79\x5f"
+ "\xd3\x3c\xf4\xf5\x96\x1d\x65\xf5\x96\x99\xc2\xab\xf7\xb0\x80\xfa"
+ "\x4f\x54\xef\x00\xf2\x1e\x4e\xb8\x7c\x1b\xc8\xdb\x06\xf2\xb6\xf9"
+ "\x91\xb7\x4d\x90\xf7\xb5\x9f\x0d\x7d\xbd\x87\xb1\xf8\x87\x79\xc3"
+ "\x36\x87\x57\xef\xe1\x8a\x81\xeb\xdd\x10\x40\xde\xc3\x9d\x50\x6f"
+ "\x90\x77\x03\xc8\xbb\xc1\x8f\xbc\x1b\x04\x79\xdf\x97\x37\xf4\xf5"
+ "\x1e\xce\xce\x7f\xce\x1b\x9e\x16\x5e\xbd\x47\x04\x5c\xff\x22\xaa"
+ "\x77\x00\x79\x8f\x70\x70\xf9\x0d\x20\xef\x06\x90\x77\x83\x1f\x79"
+ "\x37\x08\xf2\x9e\xfb\xe8\xd0\xd7\x7b\xc4\x01\x56\xef\x11\x29\x61"
+ "\xd6\x3b\xe0\xfa\x77\x91\x5e\xd3\x80\xee\xea\x23\x73\xab\x71\x22"
+ "\xb9\xe3\x02\xd6\x7f\x64\x22\x55\xd6\x6b\xae\xc9\xca\x94\xb8\x14"
+ "\xf5\xd1\xd7\x40\x5f\x6e\x47\x36\xa7\x57\xd9\xc9\x48\xa8\xab\x9e"
+ "\xe6\x37\x56\xe0\x9d\x83\x7c\x5c\xa0\xfb\xdd\x8a\xfa\xa8\x2e\x53"
+ "\x59\xf9\xeb\x4b\x89\x36\xc3\x41\xd4\xb5\xe9\x76\x92\x6e\xa0\x8e"
+ "\x5a\xd2\x44\x94\x76\x22\xc5\xf1\xb2\x4f\xda\x2a\xc9\xca\x64\x4a"
+ "\x21\xef\xe9\xd8\xc7\xcc\x3f\x49\x62\xc1\x27\xce\xa4\x60\x3f\x0a"
+ "\x38\xa2\x85\xfc\x63\x91\x97\x90\xf7\x1f\x55\xb3\x89\xe4\x6f\x2f"
+ "\x39\x09\xf2\x13\x79\x0b\xfd\xd1\x58\x9e\xaf\x1d\x84\x3c\x39\x97"
+ "\xf1\x75\xc7\xd2\x50\xf9\x3a\x52\x98\xff\xab\x8f\xb5\xda\xbb\x08"
+ "\xf8\x96\x6a\xdc\x73\x6f\x97\xca\xeb\x6a\x0d\xed\x84\xe6\xc9\x53"
+ "\xa8\xb9\x5e\xcb\x81\xcd\x0a\x31\xdf\x80\xf1\xaf\x45\xfc\x2e\x04"
+ "\x7e\xf7\xc1\x9a\x97\xdf\xa3\xa0\x1f\x52\x5f\x28\xf0\xbb\xe8\x9a"
+ "\xc6\x61\xed\x01\xf8\x5d\x08\xfc\x2e\x07\x7e\x6f\x0b\x9e\xdf\xa3"
+ "\xfe\xe2\xcb\xef\x7a\xc3\xe5\xe1\xf7\x28\xe1\xfc\xd3\xfa\x0a\x5f"
+ "\x7e\x8f\x8a\x63\xfc\x1e\xd9\x02\xfc\x2e\x05\x7e\x17\x84\x98\x6f"
+ "\x63\x10\x7a\x1c\xf0\xdd\xd7\x86\x79\xf9\xad\x88\xa3\x4a\x9b\x80"
+ "\x6f\x1b\xe0\xfb\x9a\x66\xff\xfc\xb6\x01\xbe\x6d\x80\x6f\x5b\x08"
+ "\xf8\x56\xdc\xda\x8b\xdf\x97\x09\xdf\xd7\x08\xe3\x7f\xb6\x5e\xf8"
+ "\xbe\xa6\x82\xf1\xfb\x9a\xd9\xd4\x6c\x03\x7c\xdb\x42\xc4\xb7\x62"
+ "\x46\x10\xfc\x06\x7c\xf7\xb5\x9d\x5e\x7e\x2b\x2b\x80\xdf\x02\xbe"
+ "\x6d\x80\xef\x6b\x3f\x0b\xc0\x6f\xc0\xb7\x0d\xf0\x6d\x0b\x01\xdf"
+ "\xca\xed\xbe\xfc\xb6\x5d\x26\x7c\x2b\x17\x0b\xfc\xee\x85\x6f\xa5"
+ "\x96\xf1\x5b\x71\x08\xf8\x0d\xf8\xb6\x85\x88\x6f\xe5\x81\x20\xec"
+ "\x16\xe0\xbb\xaf\xcd\xf6\xf2\x5b\xa5\xa5\xca\x06\x01\xdf\x0d\x80"
+ "\xef\xfb\xf2\xfc\xf3\xbb\x01\xf0\xdd\x00\xf8\x6e\x08\x01\xdf\xaa"
+ "\x91\xbd\xf8\x7d\x99\xf0\x1d\xc9\xfc\x3f\x53\x43\x2f\x7c\x47\x16"
+ "\x30\x7e\x47\x4e\xa0\xe6\x06\xc0\x77\x43\x88\xf8\x56\x8d\x0f\x82"
+ "\xdf\x80\xef\xbe\xbe\x82\x97\xdf\xea\x02\xe0\xb7\x80\xef\x06\xc0"
+ "\xf7\xdc\x47\x03\xf0\x1b\xf0\xdd\x00\xf8\x6e\x08\x01\xdf\xea\xf5"
+ "\xbe\xfc\x6e\xb8\x4c\xf8\x56\x0b\xe7\x5f\x36\xf4\xc2\xb7\x9a\x30"
+ "\x7e\xab\x76\x03\xbf\x01\xdf\x0d\x21\xe2\x5b\x5d\x14\x8e\x7f\xb2"
+ "\xa6\x98\xc8\x7d\x79\x3e\x5a\x76\xe9\x7c\x94\x6b\x4f\x7f\x33\x3e"
+ "\xca\xb5\x95\xfe\x7d\x94\x6b\x53\x18\xcf\xaf\xd5\x84\xe7\xa3\x8c"
+ "\x0e\xb8\xff\xa1\x3f\x1f\xa5\x2f\xcf\xaf\x33\x5e\x3a\x3f\xe5\xba"
+ "\x85\xdf\x8c\x9f\x72\xdd\x78\xff\x7e\xca\xe8\x56\xc6\xf3\xd1\xa6"
+ "\xf0\xfc\x94\xeb\x02\xc6\x3f\xe8\xcf\x4f\xe9\xcb\xf3\xa8\xb6\x4b"
+ "\xe7\xab\x44\x1d\xfb\x66\x7c\x95\xa8\x52\xff\xbe\x4a\xd4\x3c\xc6"
+ "\xf3\x28\x12\x9e\xaf\x12\xe5\x0c\xc7\x57\xe9\xcb\xf3\xeb\x13\x2f"
+ "\x9d\xbf\x72\xfd\xf4\x6f\xc6\x5f\xb9\x3e\xca\xbf\xbf\xf2\x3d\xa1"
+ "\xff\xf3\xbd\x94\xf0\xfc\x95\xeb\x83\xe8\xff\xf4\xf5\x57\xfa\xf2"
+ "\xfc\xfb\x47\x2f\x9d\xcf\xf2\xfd\x83\xdf\x8c\xcf\xf2\xfd\x5c\xff"
+ "\x3e\xcb\xf7\xa7\x30\x9e\x5f\xdf\x1a\x9e\xcf\xf2\x7d\x7b\x38\x3e"
+ "\x4b\x5f\x9e\x8f\x99\x76\xe9\xfc\x96\x31\x77\x7d\x33\x7e\x8b\xc6"
+ "\xe5\xdf\x6f\xd1\x54\x32\x9e\x6b\xe6\x85\xe7\xb7\x8c\x99\x1d\x8e"
+ "\xdf\x82\xbc\x46\x9e\xa3\xaf\xc2\x78\x1e\xad\xa1\x91\x9f\x3b\xba"
+ "\xc1\x1f\x51\x02\xdf\x95\x6d\x44\x5a\x8c\x3c\xaf\x67\x3c\x77\x47"
+ "\x36\x56\x00\x7f\xf4\xc8\x33\xbe\x1e\xff\xd6\x44\xba\x4d\xf5\xd1"
+ "\x54\x4a\xa0\x2e\x72\x72\x52\x7a\xc3\x2d\xae\x6c\x12\xa9\x4d\xcf"
+ "\x82\xff\xa3\x47\x22\x8d\x36\x3d\xe7\x0b\xa8\x63\x04\xce\x51\xb8"
+ "\xcc\x65\xb3\xdc\xca\xe3\x75\x27\xa5\x3f\x58\x42\xc7\xbe\x33\xab"
+ "\x1b\x7c\x09\xfa\x8a\x26\xca\xda\x56\x41\xac\xae\x8f\x49\x6d\xfd"
+ "\x5f\x09\x17\xd9\xf8\xc7\x3b\x5d\x44\x47\xff\xad\x8b\xaa\x4e\xb1"
+ "\x13\xf7\x22\x8d\xc2\x6a\xac\x02\x5c\xfc\x91\xc4\xb7\xd2\x0b\xf4"
+ "\x9f\x3a\x45\xb7\xb2\x49\xed\x56\x36\x16\xb8\xcd\x4d\xf5\x2e\x65"
+ "\x13\x79\x2f\x15\x7a\x82\x4e\xa2\x4b\x6a\xa1\x34\xff\x25\x22\xcb"
+ "\x6f\x26\xf2\xad\x2f\x11\xc5\xd6\x66\xa2\xae\x6e\xa9\x27\x35\xa7"
+ "\xaa\x48\x4d\xbb\x8d\xd4\x5c\x80\xab\x0b\x2e\x0e\xae\x4c\x1b\xa9"
+ "\x6e\x23\xe4\xa9\xd3\x84\x64\xb4\x50\xc7\x4f\x1a\x49\x54\xb5\xab"
+ "\x9e\x68\xe7\x13\x72\x46\x7a\xc3\x45\x45\x22\x89\xa2\xff\xd4\x10"
+ "\xba\x48\x23\x85\x77\x32\x4c\xb7\xba\x1c\xa4\xba\xc5\x89\xef\xeb"
+ "\xe1\xbd\x2c\xa3\x05\xf2\xe7\xaa\x30\x96\xa1\xa3\x3a\xf3\x08\xd4"
+ "\xef\xb9\x38\xe0\xb3\xce\xe3\x93\xe5\x77\x91\xd8\xad\x20\x66\xc4"
+ "\x4c\x3c\x65\x98\xd9\xd9\x15\x2a\x66\x7e\xc0\xe2\xbf\xbf\xa2\x19"
+ "\x0d\xfc\xbe\x81\x7b\x25\x41\x3d\xd3\x76\x82\xe2\x7a\x30\x9c\x9f"
+ "\xa9\xed\xf8\x98\xe0\x9c\x75\xfc\x7a\x42\x66\xb8\x09\x41\x9e\xe0"
+ "\x5c\xf2\x4c\x03\x51\xe1\x3a\x35\xee\xdf\xba\xd1\xd6\x16\x07\xd9"
+ "\xe4\x82\xb2\x9e\x71\xf6\x94\xb5\x76\x73\x2d\x81\x77\x37\xd4\xea"
+ "\xed\x44\x61\x20\x6a\xe4\x33\xf8\x45\x9a\x99\xad\x64\xe4\xca\x0e"
+ "\x4a\x91\xc7\xc8\x5b\xe4\x33\xe6\xe7\xe1\xbd\x75\xb1\x83\x64\x38"
+ "\x89\xda\x9a\x0e\x77\x23\x75\x58\xc9\xd7\x04\xca\xa8\xa0\xca\xe7"
+ "\xe2\x00\x1f\xfb\x11\x13\x76\xe9\x0d\xd1\x80\x83\xd1\x34\x6f\x4c"
+ "\x5d\x09\xd4\x17\xe7\xf6\x43\xab\x73\x74\x30\xf3\x1f\x7d\x7c\x42"
+ "\x11\x9e\x0b\x19\x9e\xc7\xb5\xd2\xc8\x7a\x03\xe0\x79\x1b\xc3\xf3"
+ "\xb0\xf6\x20\xf0\x5c\xe4\xc5\x73\xf4\x79\x2f\x9e\xc7\xd9\x02\xe3"
+ "\x79\xdc\xbd\x02\x9e\x2b\xae\x4c\x3c\x8f\x3d\xd2\x3f\x9e\xc7\x96"
+ "\xf7\x83\xe7\x72\x8f\xbf\x3b\x34\x78\x1e\x47\x2e\x23\x9e\x0b\xc3"
+ "\xc3\xf3\xd8\x46\x5f\x3c\x47\xb7\x31\x3c\x47\x97\x86\x87\xe7\x71"
+ "\x01\xe3\x1f\xf7\xe7\x6f\x7b\xf1\x6c\x13\xf4\xf3\x4d\x95\x80\x67"
+ "\xd0\xcf\x36\x41\x3f\x5f\xd3\x3c\x30\x9e\x6d\x22\xfd\x7c\xe3\x61"
+ "\x2f\x9e\x6f\xda\x13\x18\xcf\x37\x0d\x63\x78\xb6\x5d\xa1\xfa\x59"
+ "\xbb\xbd\x7f\x3c\x6b\x8d\x81\xf1\x6c\xd3\x79\xfa\x12\x43\x83\x67"
+ "\x6d\xdd\xe5\xc3\xb3\x2d\x4c\xfd\xac\xdd\xeb\x8b\xe7\x1b\x0f\x30"
+ "\x3c\xdf\x68\x08\x0f\xcf\x37\x1d\x0a\xa7\x2f\x23\xc2\xb3\xa0\x9f"
+ "\x63\x72\x69\xa4\x0d\xf4\xb3\x4d\xd0\xcf\xd7\x7e\x16\x04\x9e\x45"
+ "\xfa\xf9\xe6\x5f\x7b\xf1\x1c\xb3\x3e\x30\x9e\x7f\x78\x4c\xc0\xf3"
+ "\x15\xaa\x9f\x7f\xb8\xbc\x7f\x3c\xff\x70\x5a\x3f\x78\x2e\xf7\xf4"
+ "\xd3\x86\x06\xcf\x3f\x2c\xbd\x8c\x78\x0e\x53\x3f\xff\x30\xcd\x17"
+ "\xcf\x37\x9b\x18\x9e\x6f\x8e\x0b\x0f\xcf\x31\xdb\xc2\xe9\x27\x7a"
+ "\xf1\xdc\x20\xe8\xe7\x1f\x27\x00\x9e\x41\x3f\x37\x08\xfa\xf9\xbe"
+ "\xbc\x81\xf1\xdc\x20\xd2\xcf\xb7\x2c\xf1\xe2\xf9\xc7\xd3\x03\xe3"
+ "\xf9\x47\xef\x32\x3c\x37\x5c\xa1\xfa\xf9\x47\x0f\xf4\x8f\xe7\x1f"
+ "\x69\x02\xe3\xb9\x41\xe7\xe9\x03\x0f\x0d\x9e\x7f\x64\xb8\x7c\x78"
+ "\x6e\x08\x53\x3f\xff\x68\x86\x2f\x9e\x6f\x99\xc7\xf0\x7c\x8b\x3a"
+ "\x3c\x3c\xff\x38\xe0\xf9\xaf\xfd\xf5\xc1\x45\x78\x16\xf4\xf3\x6d"
+ "\x3a\x1a\xd9\x00\xfa\xb9\x41\xd0\xcf\x73\x1f\x0d\x02\xcf\x22\xfd"
+ "\xac\xbb\xd7\x8b\xe7\xdb\xc6\x04\xc6\xf3\xad\x6b\x05\x3c\x5f\xa1"
+ "\xfa\xf9\xd6\x91\xfd\xe3\x59\xd7\xda\x0f\x9e\xcb\x3d\xe3\x0b\x43"
+ "\x83\xe7\x5b\xe3\x2e\x23\x9e\xc3\xd4\xcf\xb7\x46\xfb\xe2\x59\x37"
+ "\x9e\xe1\xf9\xc7\xf6\xf0\xf0\x7c\xdb\x84\xa1\x19\xdf\xb8\x5d\x87"
+ "\xe3\x1b\x5d\x38\xbe\xe1\x5d\xfb\xa7\x57\xd5\x31\x3c\x77\x03\x9e"
+ "\x77\x88\xf1\x7c\xbc\xf7\xf8\xc6\x4f\x86\x71\x3d\x78\xbe\xbd\x0f"
+ "\x9e\x39\xc0\x73\x37\x8f\xe7\xf1\x77\x79\xc6\x37\xac\x6d\xa5\x80"
+ "\x93\x53\xc4\x3a\x0b\xb0\x9c\x2f\x60\xf9\x38\x60\x19\x78\xc8\x01"
+ "\x8f\xab\x1b\xeb\x49\xbc\x83\xf1\xb2\x0b\x78\xcc\x89\x71\xdc\xd5"
+ "\x2a\x45\xfc\x22\x6e\x3d\x18\xae\x59\x09\xd8\x4d\xfe\x94\xd4\xa4"
+ "\xc2\xb5\x01\xae\x74\xb8\xc8\xa7\xa4\xba\x15\xb0\xbb\x5c\x8c\xdd"
+ "\x3a\x01\xbb\x3f\x39\xdc\x3f\x76\x7f\xb2\xfb\xf2\x8d\x65\xfc\x84"
+ "\x8d\x7f\x1d\x4f\x50\xc7\x3f\x7d\x82\x5a\x8d\xf5\x02\x3e\x4f\x91"
+ "\x78\x17\x51\xd1\xb9\xba\xd1\x8a\x04\xa2\xde\xe8\x26\x52\xf3\x4b"
+ "\x44\x6d\x6e\x80\x7a\x7b\xda\x6f\x33\x51\x7c\xec\xfc\x2b\xa9\x6e"
+ "\xaf\x27\xd5\x17\x8e\x90\x6a\x0e\xae\x53\x70\x41\x59\xe3\x97\x88"
+ "\xeb\xed\x10\xea\x3d\xfe\x20\xe4\x15\x13\xb8\xde\xe3\x8b\xf8\x7a"
+ "\x2f\x86\x7a\x77\x79\xeb\x6d\x85\x76\x00\xf2\xb9\x81\x13\xc6\x43"
+ "\xe2\x1d\x64\xe4\x2a\x17\xa5\x5d\x02\xfe\x51\x3e\x1f\x1f\x75\x92"
+ "\x78\x03\xc8\x6c\x11\xe0\xbf\xa5\x9c\x64\xa4\x01\xfe\xbb\x9c\x88"
+ "\x3b\x87\x35\xf3\x22\xe0\xff\x27\xf5\x14\xf8\xd7\x8d\xf8\x3f\x8e"
+ "\xf8\xbf\xcd\xc5\xf1\xf8\xbf\xad\x22\x3c\xfc\xdf\x1e\x0c\xfe\x83"
+ "\x18\x0f\x89\xd5\xe1\x78\x48\x17\x8e\x87\x78\xd7\x80\x0e\x84\x7f"
+ "\x91\x3e\xbf\x43\x84\xff\xd8\x7e\xf0\x7f\xa7\x07\xff\x15\xdf\x3c"
+ "\xfe\xef\x18\x00\xff\x77\xf4\x87\xff\x21\x1e\xfb\xb8\xe3\x32\xe2"
+ "\xff\xce\x01\xf0\x7f\x67\x30\xf8\x2f\x0c\x0f\xff\x77\xf4\xc2\xff"
+ "\xed\x02\xfe\x6f\x0f\x13\xff\xb1\x41\xe0\x3f\x98\xf1\x93\x7b\x10"
+ "\xff\xa0\xff\x6d\x51\xa2\xb5\xc0\x03\xe0\x5f\x3c\x7e\x72\x97\x08"
+ "\xff\xf7\xf4\x83\xff\xbb\xef\xf2\x8c\x9f\x7c\xf3\xf8\xbf\x6b\x00"
+ "\xfc\xdf\xd5\x0f\xfe\x87\x7a\xac\xe4\xae\xcb\x88\xff\xbb\x07\xc0"
+ "\xff\xdd\x41\xe0\xdf\x16\xa6\xfe\xbf\xab\x17\xfe\x63\x05\xfc\xc7"
+ "\x86\x89\xff\x7b\x82\xc1\x7f\x10\xe3\x2d\xf7\xe9\x70\xbc\xa5\x0b"
+ "\xc7\x5b\xbc\x6b\xc2\x07\xc2\xbf\x48\xff\x4f\x10\xe1\xff\xbe\x7e"
+ "\xf0\x7f\xaf\x07\xff\x57\x80\xfe\x9f\x30\x00\xfe\x27\xf4\x87\xff"
+ "\x21\x1e\x5b\x99\x70\x19\xf1\x7f\xef\x00\xf8\xbf\x37\x18\xfc\x87"
+ "\xa9\xff\x27\xf4\xc2\xff\x3d\x02\xfe\xef\x09\x13\xff\xf7\x05\x81"
+ "\xff\x60\xc6\x67\x1e\x40\xfc\x83\xfe\x6f\x88\x12\xed\x0d\x18\x00"
+ "\xff\xe2\xf1\x99\xfb\x45\xf8\x7f\xa0\x1f\xfc\x4f\xbc\xcb\x33\x3e"
+ "\xf3\xcd\xe3\xff\xfe\x01\xf0\x7f\x7f\x3f\xf8\x1f\xea\xb1\x98\xfb"
+ "\x2f\x23\xfe\x27\x0e\x80\xff\x89\x41\xe0\xbf\x21\x4c\xfd\x7f\x7f"
+ "\x2f\xfc\xdf\x27\xe0\xff\xbe\x30\xf1\xff\x40\x30\xf8\x0f\x62\x3c"
+ "\x67\x32\x3f\x9e\xd3\x85\xe3\x39\xde\x3d\x22\x03\xe1\x5f\xa4\xff"
+ "\x27\x89\xf0\x3f\xb9\x1f\xfc\x3f\xe8\xc1\xff\x15\xa0\xff\x27\x0d"
+ "\x80\xff\x49\xfd\xe1\x7f\x88\xc7\x6e\x26\x5d\x46\xfc\x3f\x38\x00"
+ "\xfe\x1f\x0c\x06\xff\x61\xea\xff\x49\xbd\xf0\xff\x80\x80\xff\x07"
+ "\xc2\xc4\xff\xe4\x21\x1a\xff\x79\xa8\x0e\xc7\x7f\x38\x45\x7d\x54"
+ "\x77\xd1\x3b\xb3\x38\x53\x93\x5a\x25\xd1\x12\x97\xe2\x78\x9d\x35"
+ "\xa5\x83\xcc\x3c\x0f\x32\x31\x9c\x27\xf3\xcf\xab\x89\xdb\xd4\x44"
+ "\x28\xf4\xff\x7d\xf6\x88\xc2\xe5\x32\x3d\x17\xb7\x75\x25\x91\xb9"
+ "\x23\x1b\xff\x88\x69\xd6\x93\x4e\x82\x75\xde\x84\x3c\x38\xe5\xe5"
+ "\x01\x8e\xc1\xd1\xb3\x3a\x75\x49\x36\xd0\x74\xd9\x49\x0b\xe0\xa5"
+ "\xba\xc5\x0e\xbc\xdf\xc0\x63\x0b\x65\x01\xe5\x31\xec\x3c\x43\x64"
+ "\xae\x7f\x6a\x6e\x00\x19\x47\x29\xd7\x11\x49\x74\x0b\xe5\x50\x96"
+ "\x28\x23\x94\xab\x76\x03\xae\x57\x7a\xe8\x48\x2d\xe0\xdb\xf5\x4f"
+ "\xdd\x0d\x25\x40\x37\xf4\xe3\x32\x0f\xf1\xf3\x1f\x70\xd7\x57\x37"
+ "\x02\x2f\xf3\x26\x87\x29\xa7\x87\x82\xd8\xff\x12\xcc\x38\xc5\xc3"
+ "\x46\x1c\xa7\x00\x39\x6d\x0b\x52\x4e\x85\x3e\x7b\x5a\x87\x5c\x4e"
+ "\x0f\x6b\x82\x93\xd3\xc3\xab\x7b\xc9\x69\x88\xc7\x0f\x1e\x9e\xcc"
+ "\xe4\xf4\xb0\x9a\xc9\xe9\xa7\x09\xe1\xc9\xe9\xe1\xb0\xd6\xff\xf6"
+ "\xed\x4f\x3f\xa2\xc5\xfe\x34\x07\xfd\xe9\xe0\xe4\x64\xd3\xf8\xec"
+ "\xc1\x1d\x72\x39\xc5\x59\x82\x93\xd3\x23\x63\x7c\xe5\x34\xd4\xfd"
+ "\xdc\xb8\x16\x26\xa7\xb8\x4a\x26\xa7\x38\x12\x9e\x9c\x1e\x09\x62"
+ "\xff\x47\x30\xfd\xbe\x47\xab\xb0\xdf\x07\x72\x0a\xb2\x3d\xd9\x0a"
+ "\x7d\xf6\x0c\x0f\xb9\x9c\x1e\xd5\x07\x27\xa7\x47\x3f\xec\x25\xa7"
+ "\x21\xee\x8f\x3d\x6a\x62\x72\x7a\x34\x91\xc9\xe9\x91\xf2\xf0\xe4"
+ "\xf4\xe8\xd1\xa1\xe9\x9f\x4c\x31\x60\xff\x84\x83\xfe\x49\x70\x72"
+ "\x6a\xd0\xf8\xec\x71\x1e\x72\x39\x4d\x51\x07\x27\xa7\x29\xcb\x7d"
+ "\xe5\x34\xd4\xfd\x86\x29\xec\x3c\x60\xe9\x14\x39\x93\xd3\x63\xb3"
+ "\xc2\x93\xd3\x94\x80\xf1\x4f\x43\xf3\xa3\x1f\xd7\xa0\x1f\x0d\x72"
+ "\x0a\xb2\x3d\x35\x14\xfa\xec\xc9\x1e\x72\x39\x4d\xad\x0c\x4e\x4e"
+ "\x8f\x5f\xdb\x4b\x4e\x43\xec\xdf\x4e\x6d\x64\x72\x9a\x5a\xc1\xe4"
+ "\x34\xc5\x19\x9e\x9c\x1e\x0f\x66\xfd\xa7\xdf\x7d\x58\x7d\x7d\xbe"
+ "\x9f\x1d\xba\xb2\x7c\xbe\x9f\x2d\x0e\x4e\x56\x3f\x3b\x78\x69\x7d"
+ "\xbe\x9f\xe5\x32\x59\xfd\x6c\x1e\x93\xd5\xe3\xbb\xc3\x93\xd5\xcf"
+ "\x02\xc6\x5a\x1a\x68\xff\x56\x5f\xbf\x6f\xba\xe1\xca\xf2\xfb\xa6"
+ "\x07\xa9\xff\xa6\x2f\xbf\xb4\x7e\xdf\x74\x41\xff\x4d\x17\xf4\xdf"
+ "\xb4\x30\xf5\xdf\xf4\x20\xf4\x9f\xff\x7d\x5f\x7d\x7d\xbf\x27\xa3"
+ "\xaf\x2c\xdf\xef\x89\x03\xc1\xc9\xea\xc9\xef\x5d\x5a\xdf\xef\x09"
+ "\x3b\x93\xd5\x13\xfb\x99\xac\xa6\xbb\xc2\x93\xd5\x93\xba\x70\xf7"
+ "\x8b\xf5\xf5\xff\x66\x5c\x61\xfe\xdf\x8c\x20\xfd\xbf\x19\x97\xd8"
+ "\xff\x9b\x21\xf8\x7f\x33\x04\xff\xef\xc9\x30\xfd\xbf\x19\x61\xf9"
+ "\x7f\xbe\xb2\xf2\xf8\x80\x33\x53\xae\x2c\x1f\x70\x66\x54\x70\xb2"
+ "\x9a\xb9\xe2\xd2\xfa\x80\x33\x27\x32\x59\xcd\x54\x30\x59\x3d\x35"
+ "\x3b\x3c\x59\xcd\xcc\x0c\x77\x7f\x5a\x5f\x3f\x70\x96\xf6\xca\xf2"
+ "\x03\xe3\x83\xec\xff\xce\x1a\x73\x69\xfd\xc0\x78\xa1\xff\x1b\x2f"
+ "\xf4\x7f\xe3\xc3\xec\xff\xce\x0a\xa2\xff\x1b\xcc\xb8\xdf\x33\x99"
+ "\xe8\x03\xba\x4d\xf5\x51\x2a\xe0\xbf\xca\x48\xa4\x5d\xd1\x20\x2f"
+ "\x05\xc8\x2b\x4b\x4b\xba\x4d\x20\x2f\x87\x8b\xcc\x5c\x7d\x82\xd6"
+ "\xb6\xb9\x49\x17\xc8\xea\x22\xf8\x81\x56\x47\x2b\xee\xd1\x7b\xb0"
+ "\x59\xfa\xcc\x98\xb9\xab\xd5\x04\xe5\x85\xfc\x77\x2b\x9e\x8b\xa3"
+ "\x20\x2f\x5e\x7e\x8a\xa6\x7a\x97\xa9\xb1\xe0\xa9\xd3\x27\xe8\x2a"
+ "\x3b\xa5\x35\x7a\x27\xc6\x8e\x9c\x55\xa3\xaf\x27\xc0\x85\x91\xda"
+ "\x67\x50\x2e\x4f\x1f\xc1\x74\xab\xa3\x9e\x60\xdc\x4f\x7e\x0c\xfc"
+ "\x84\x2e\xca\xf5\xb9\x4e\x81\xf1\x9b\x70\x5f\xa1\x27\x46\x93\xf5"
+ "\x54\x21\x2f\xff\xde\x63\xaa\xbc\xfc\x3f\xd7\xa9\x77\xe0\xfe\xc4"
+ "\x21\xf7\x05\x9f\xe6\xc7\xff\xb8\x13\x9a\x1b\x3c\x65\x5c\x95\x44"
+ "\x29\x94\x71\x74\x6d\x87\x83\x60\x39\x6b\x3b\x2c\x24\x23\x85\xa8"
+ "\x6b\xbb\x5a\x49\x7a\x07\x75\xd4\x66\x7e\x45\xe2\xcf\xe3\xbc\x00"
+ "\xe2\xe9\x99\x6b\x99\xbc\x9f\x9e\xcc\x9d\xd0\xdd\x60\x97\x3e\x23"
+ "\xaf\x05\xaf\x50\x95\x05\xbc\x76\x11\x29\xbf\x5f\x53\x4a\xe4\xc0"
+ "\x2f\xbd\x35\xb3\x99\xd0\xc8\x2f\xd4\x56\x57\x03\xf2\x53\x0f\xef"
+ "\x27\xf7\xcc\x37\x44\x7e\x31\x1a\xd3\x90\xb7\xb8\xce\xd4\x6a\x70"
+ "\xf0\x34\x9e\xf7\x4c\x76\x99\xc4\x6a\xec\x22\xb5\x2e\x42\x00\x1f"
+ "\xad\x9f\x24\xd4\x03\xbe\x66\x85\xa9\xb7\x9f\x31\x0d\xcd\x78\xe5"
+ "\x6c\x3b\xfa\xad\x80\xaf\x6d\xac\x8c\xc3\xda\x83\xc0\x57\xa1\x17"
+ "\x5f\xb3\xd7\x0f\x0e\x5f\xb3\x6f\x1d\x62\x7c\x0d\xb1\xff\xfa\xf3"
+ "\x8e\xc1\xe1\x6b\xf6\x6a\x86\xaf\x9f\x17\x31\x7c\xcd\xd6\x7b\xf1"
+ "\x35\xac\xfd\xd2\xe1\xeb\xe7\xd3\x18\xbe\x7e\x2e\x0f\x0f\x5f\xb3"
+ "\xdb\x86\x66\x9c\x15\xf1\x50\x0f\xfa\xcb\x26\xe8\xaf\x6b\x9a\x07"
+ "\xc6\x97\x4d\xa4\xbf\x9e\xb5\x0d\x0e\x5f\xcf\x6e\x19\x5a\x7c\x0d"
+ "\xb5\xcf\xfd\xec\xec\xc1\xe1\xeb\xd9\x4f\x19\xbe\xe6\xb8\x18\xbe"
+ "\x9e\xad\xf2\xe2\xeb\x9a\xe6\x4b\x87\xaf\x39\xe5\x0c\x5f\x73\xf4"
+ "\xe1\xe1\xeb\xb9\xb0\xe2\x5f\xf5\xed\x1f\x3c\x5f\x8a\xfd\x03\xc0"
+ "\x97\xa0\xbf\xae\xfd\x2c\x08\x7c\x89\xf4\xd7\xf3\x0f\x0c\x0e\x5f"
+ "\x09\x5f\x0d\x31\xbe\x86\xb8\x9f\x90\xb0\x7f\x70\xf8\x7a\xfe\x2e"
+ "\x86\xaf\x84\x79\x0c\x5f\xcf\xeb\xbc\xf8\xba\xf6\xb3\x4b\x87\xaf"
+ "\x04\x39\xc3\xd7\x73\x55\xe1\xe1\xeb\xf9\xc0\xf1\x9f\x43\x1a\xd7"
+ "\x9e\x47\xb0\x4f\xe3\x36\x35\x08\xfa\xeb\xbe\xbc\x81\xf1\xd5\x20"
+ "\xd2\x5f\x73\xb7\x0f\x0e\x5f\x73\xa7\x0f\x2d\xbe\x86\xba\x6f\x33"
+ "\x37\x6a\x70\xf8\x9a\xfb\x4b\x86\xaf\x17\x0e\x30\x7c\xcd\xcd\xf5"
+ "\xe2\xeb\xbe\xbc\x4b\x87\xaf\x17\xf4\x0c\x5f\x2f\xe8\xc2\xc3\xd7"
+ "\xbc\x60\xe2\xbf\x06\x31\x1e\x3f\x3f\x11\xfb\x61\x80\x2f\x41\x7f"
+ "\xcd\x7d\x34\x08\x7c\x89\xf4\xd7\x8b\x17\x07\x87\xaf\x17\xf7\x0c"
+ "\x31\xbe\x86\xb8\x3f\xf6\x62\xca\xe0\xf0\xf5\xe2\xd7\x0c\x5f\x2f"
+ "\x46\x33\x7c\xbd\xd8\xea\xc5\xd7\xdc\x47\x2f\x1d\xbe\xe6\x55\x31"
+ "\x7c\xcd\xcb\x0d\x0f\x5f\xf3\x83\x89\x7f\x1a\xe4\x3c\x42\xe2\xa1"
+ "\xc1\xf5\x21\x13\x5f\x1c\x1c\xc6\x12\x95\x57\x76\x1f\x72\x41\xfd"
+ "\xe0\x30\x96\x38\x87\x61\x6c\x41\x26\xc3\x58\xe2\x8c\xcb\xd3\x87"
+ "\x5c\x30\x9e\x61\x6c\x7e\x5b\x78\x18\x4b\x1c\xc2\xf9\x8f\x45\xba"
+ "\xc1\xf5\x23\x5f\xfa\x70\x70\x18\x7b\x69\xf5\x95\xdd\x8f\x7c\x69"
+ "\xf2\xe0\x30\xf6\xd2\x5f\x18\xc6\x16\xb6\x30\x8c\xbd\x54\x71\x79"
+ "\xfa\x91\x0b\x0b\x18\xc6\x16\x86\x39\x6f\xb3\x28\xac\xfd\x2f\xfe"
+ "\xe7\x6d\x96\x98\x06\xd7\x97\x5c\x72\xcb\xe0\x30\xb6\xf8\xd8\x95"
+ "\xdd\x97\x5c\x5c\x3a\x38\x8c\x2d\x19\xcb\x30\xb6\x78\x1a\xc3\xd8"
+ "\x92\xa8\xcb\xd3\x97\x5c\xd4\xc1\x30\xb6\x68\x7f\x78\x18\x5b\x52"
+ "\x38\x74\xf3\x4d\xcb\x1c\x83\xeb\x4f\x2e\xdb\x32\x38\x8c\x2d\x7b"
+ "\xe0\xca\xee\x4f\x2e\x93\x0d\x0e\x63\xcb\xb2\x18\xc6\x96\xee\x65"
+ "\x18\x5b\x66\xbc\x3c\xfd\xc9\xa5\x09\x0c\x63\x4b\x35\xe1\x61\x6c"
+ "\x59\x10\xf1\xff\x83\x9d\x27\x7b\x79\xf6\xe0\xfa\x94\xcb\x4f\x0f"
+ "\x0e\x63\xcb\x8b\xaf\xec\x3e\xe5\x72\xfd\xe0\x30\xb6\xfc\x5f\x0c"
+ "\x63\xcb\xd5\x0c\x63\xcb\x1b\x2f\x4f\x9f\x52\x7f\x80\x61\x4c\x9f"
+ "\x16\x1e\xc6\x5e\x4e\x1c\xba\xf9\xbd\xa4\xca\xc1\xf5\x2b\x93\x9e"
+ "\x1e\x1c\xc6\x92\x24\x57\x76\xbf\xf2\x95\xea\xc1\x61\x2c\x69\x3a"
+ "\xc3\xd8\x2b\x29\x0c\x63\x49\x71\x97\xa7\x5f\xf9\x8a\x96\x61\xec"
+ "\xe5\x30\xe3\x51\x24\xf5\x89\x7f\xb5\x7c\x65\xea\xc2\xa4\xe5\x8b"
+ "\xb5\xcb\x57\xa6\x24\xaf\xd6\xae\x59\xbe\x61\xc9\x43\xb7\xac\x1d"
+ "\xaf\x4d\x36\x6a\x93\x97\xaf\x5c\x26\x24\x2c\x1e\x45\x9e\x59\x92"
+ "\xb4\xd0\x88\x29\x40\xbd\x6c\xe5\x8a\x25\x2b\x53\xb4\xc9\x4b\x56"
+ "\xaf\x5d\x9e\xbc\x04\xff\x5f\xa3\x5d\xba\x2a\x19\x12\x16\x2d\x59"
+ "\x9e\xba\x44\xfb\xd2\xda\xa5\x4b\x97\x24\xaf\x19\x45\x9e\x5a\x9b"
+ "\x94\xb2\xdc\x90\xb4\x44\x3b\xe5\xa9\x47\x6e\x9f\x3d\xf5\xe7\xb3"
+ "\x1f\x7e\x18\x0f\x27\x13\x9d\x4d\x16\x4d\x4d\x4d\x75\x80\x39\xd9"
+ "\x49\x69\xea\x8a\x5a\x0d\xe1\xcf\xc7\xdd\xda\x4e\xd4\x5b\x92\x89"
+ "\x2c\xb7\x9d\xc8\xcd\xed\x44\xa1\x7d\x99\xc4\x51\xf3\x0d\x71\x90"
+ "\x1e\x45\xcd\xcf\x64\xd2\xfc\xb2\x04\x6a\x7e\xd6\xe2\x50\x3e\x68"
+ "\x40\x5a\x6a\x9e\x54\x8a\xef\x80\xb7\x32\x6a\x7e\x4e\xd7\x2c\x4d"
+ "\x1d\xef\x50\x4e\x9e\x95\xf1\x15\x91\xd2\x51\x2b\x3a\xde\xe7\x1c"
+ "\xd2\x0f\x71\x24\x01\xea\x4e\xa4\xab\x14\x44\xba\xd2\x09\xf7\x72"
+ "\xb8\x2a\xe1\x3a\x04\x57\x1b\x5c\x1d\x44\x6a\x90\xc3\x15\x05\x97"
+ "\x16\x2e\x1d\x5c\xb1\x70\x01\xf7\x0c\x71\x70\x1d\x80\xab\x11\x2e"
+ "\xa0\x5d\x2d\x63\xf9\x40\x23\x91\xae\x9e\x0c\xd7\x66\xb8\x20\xaf"
+ "\xe4\xfd\x70\xd9\x89\x74\x4d\x26\x5c\x04\xae\x68\xb8\x62\xe0\x9a"
+ "\x06\x57\x12\xd0\x44\xb1\x77\x29\x90\x96\x92\x48\xa0\x9c\x03\x5f"
+ "\x29\x48\x9f\x0b\xd7\x5e\x22\x5d\x0b\xdf\x5c\x6b\x80\xcb\xd2\x8b"
+ "\x4e\x2e\xfa\x3f\x66\x80\x3c\xa7\xa8\xb2\x6e\xb4\xf3\x67\xe0\x49"
+ "\x57\x2d\x77\x67\x93\x08\xb7\x79\xf2\x2c\xc3\x6d\x44\x72\x4a\xba"
+ "\xea\x5e\xeb\x66\xd4\x33\xcf\x64\xf2\x67\x3a\xc2\x33\xf2\xac\x33"
+ "\x6f\xd5\x04\x3b\x79\xbf\x10\xcf\x34\x0b\x0d\x6f\xab\x26\x08\xbf"
+ "\x4f\xb1\x4b\x1e\x2f\xe7\xcf\x80\xcb\x57\x4d\xa1\x19\x09\x3b\xd8"
+ "\xd9\x6f\xab\xf8\x71\x34\x6a\x8a\x2c\xa2\x8a\x91\xd1\xd8\xe6\x2d"
+ "\x1b\xf8\x72\x29\x69\x36\x89\x84\xdf\x2b\x28\x94\xcd\xa1\x2c\x4b"
+ "\x80\x72\xca\xf0\xd9\x6d\x7e\xd0\x70\x51\x69\xaf\xc0\xff\x9d\xc5"
+ "\xbb\xec\xd4\x64\xaf\xc7\x7e\xb6\x25\xfd\x0d\xd2\x0c\xbf\xbb\xa8"
+ "\x6c\x36\x6a\x9f\x50\xd1\x66\xfc\x6d\x36\xc6\xa8\x5d\x55\xca\xda"
+ "\xea\x2a\xc5\x45\x65\x59\xa2\xbb\xb0\xb9\x14\xd2\x65\x6e\x73\x59"
+ "\x02\xcb\xff\x41\xd0\x93\x8d\x99\xf0\xbf\x8b\x4f\x2f\xda\xe5\xf4"
+ "\xfc\x0f\x77\xa7\x3b\xbf\x49\x8b\x77\x65\x16\xe9\xe0\x9f\xb3\xe3"
+ "\x08\xbb\xab\x89\xf6\x09\x42\xda\xa4\x86\xb7\xef\xac\x22\x12\xcb"
+ "\x13\x58\x6e\x43\x52\x46\x15\xe5\xb4\xe9\x11\xf0\x7d\xc3\x8a\x9e"
+ "\xef\x8e\x69\x2e\xc4\xf3\x53\x69\xde\x0a\xd9\xce\x37\x08\xc1\xdf"
+ "\x62\xd9\xb6\x8f\x26\xb2\xe2\x37\x88\x1c\xeb\xd8\x99\x67\x28\xf4"
+ "\x9c\x43\x87\xbf\x91\x02\xfd\xf4\xe9\x19\x54\x94\xf7\x12\x37\xab"
+ "\x8f\x9c\xf1\xd4\x50\x65\x97\x3c\xb6\x1b\xe9\xb5\x37\xf3\xbc\x54"
+ "\x0a\xef\x15\x28\x4f\xcc\x9f\x9a\x9b\xea\xf0\x19\xcf\xb9\x53\x55"
+ "\x11\xa9\x36\x3d\xa6\x92\xf1\xc8\x5e\x8f\xf9\x20\x3d\xcd\x3f\x8e"
+ "\xff\xef\xa5\x66\x9e\xc7\x3a\xed\x4a\x12\xd7\x2c\x5d\x7d\xaf\xdb"
+ "\xac\x46\xfe\x41\xbb\x53\xab\x81\xde\xc1\xf3\xdb\xdc\x68\xb0\x4b"
+ "\x57\xeb\xe0\x9d\xba\xe7\xec\x4b\xc6\x67\x09\xd0\x69\x3b\xf3\x56"
+ "\xcf\xb3\x4b\xe6\x56\xf2\x72\x4e\xa5\x47\xf1\x8c\xcd\x73\xa9\xd4"
+ "\x15\xef\x3a\xc1\x81\xae\x22\xf0\x3e\xcd\x4e\xe6\x96\x7a\xea\xc8"
+ "\x64\xdf\x93\x8f\x12\x9f\x1d\x4a\x3e\x9f\xdd\xfe\xf2\x81\x6f\x27"
+ "\x2d\x70\x69\x25\x5d\x17\x68\xdd\xd6\x67\x91\x8f\x84\x76\xa5\xd2"
+ "\xea\x4d\xd3\xa8\x33\xff\x33\x42\x6a\xf4\x8d\x04\xda\x7c\x74\xa4"
+ "\x84\x3a\xe2\xd7\x13\x55\xa4\x41\x45\x8f\x54\x35\x92\x8d\xd3\x68"
+ "\x2b\x9e\xfb\x5b\xdb\xd1\x42\xd2\x6c\x44\x91\x51\x43\xa2\xd2\xa6"
+ "\x51\x47\x75\x62\x23\x61\xe9\x35\x24\xa3\x89\xc8\x36\x1e\xa2\xce"
+ "\x99\xa0\xff\x3f\x69\xc4\xf4\x16\x82\x67\x54\x66\xb4\x52\x57\xfa"
+ "\x8b\x44\x81\xff\xd7\x1c\xc2\xf4\x7f\x91\x8c\xd3\x44\x16\x6f\x74"
+ "\xa8\x4a\xe0\x9b\xf8\xfb\x9d\x50\x16\xee\x02\x3d\xb0\xf5\x02\x21"
+ "\x1b\x9f\x27\x9a\xb4\x85\x04\xfc\x40\x42\xad\xae\x3f\x91\x78\x37"
+ "\x05\xfb\x72\x98\x6c\x5a\x4e\xe4\xf1\x2e\xdc\xc7\x76\x8c\xe0\xb9"
+ "\xdf\x3b\x81\x16\xea\x66\xc1\xba\x6d\xfc\x82\x68\xf0\x1c\x74\xf6"
+ "\x9b\x83\xc2\x6f\xbe\x20\xc8\xb3\x8b\xca\x67\x2b\x9c\xe6\xe7\x62"
+ "\xa1\xee\x06\xe4\x01\x7c\xa7\x8e\xc3\xdf\xc1\xef\xb7\x26\xf3\x3c"
+ "\x90\x2c\x70\x11\x90\x79\x63\xc2\x02\xa3\x85\xcf\xd7\x2e\x4d\xde"
+ "\xbb\x33\x99\x2f\x93\x0f\x6d\xbc\x8b\x9e\x73\x28\x1b\x01\xf7\xc9"
+ "\x47\xe3\x8d\x0f\x53\xfc\x2d\xc8\x32\xba\x33\x6f\x4d\x94\x87\xdf"
+ "\x1e\xb9\xd8\xa5\x6b\xe4\x20\x8b\xe8\x08\x03\x91\xc1\xfb\x09\x76"
+ "\xc9\xfc\x6d\x22\xac\x61\x1b\x1a\xee\xa1\x15\x68\x12\xec\x92\x79"
+ "\x8d\x22\x1a\xc4\x57\x0f\x0d\xbc\x37\xda\x25\x2f\xb6\xb0\x6f\xac"
+ "\x99\x88\x34\x82\xee\xf7\xd0\x46\x50\x93\xdc\xe1\x56\xda\xed\x54"
+ "\x4a\x9d\x80\x47\x23\x3d\xa7\x51\xcc\x74\x51\x27\x67\x3e\x8e\x7a"
+ "\x5e\x81\xe7\xba\x32\xfa\x94\x91\xf0\x3e\x53\x9b\xca\xff\x1f\x8d"
+ "\xdf\xa1\xa6\xb2\xcc\x9e\x77\xd9\x64\x18\x2d\xde\x55\x07\xb6\x43"
+ "\x1d\x5f\x45\x9d\xd0\xd6\xeb\xf2\x93\xd1\x76\xd8\xeb\xb0\x5d\x73"
+ "\xca\xc6\x5c\xe7\xf6\x66\x6c\xf3\x13\xb0\x8d\x50\xd3\x71\x83\x50"
+ "\x8e\xb7\xb1\xdd\x30\x5d\xb3\xc6\xee\x86\x3c\xa0\x4c\x1d\xf0\x6e"
+ "\x58\xb3\x34\x65\x36\xee\x27\xa5\xa6\x91\xe3\xd9\xb9\x97\x29\xcf"
+ "\x33\xfc\xca\x1d\x3e\xcf\x52\xbe\xcd\xef\x05\xdf\x26\x01\xf5\x03"
+ "\xa4\xaf\xf7\xb6\x61\x9e\x6f\x52\xa6\x8b\x8e\x67\x32\x3d\x12\xc1"
+ "\x01\x9d\xa4\x59\x68\x8f\x17\x95\xea\xa8\xce\xbc\x14\xc0\xff\x4f"
+ "\x63\x7c\xda\x49\xfe\xb0\x5c\x3c\x63\x13\xca\x12\x01\x79\x7e\x0a"
+ "\xf7\x11\x70\x3f\xf6\x51\x15\xca\x9b\xcf\xf7\x1a\xfc\x7f\xfb\xf5"
+ "\xd4\x31\x65\x2a\xc1\xf3\x34\xa1\xbd\xa5\xb4\xd9\x49\x2e\xaf\x23"
+ "\xb6\xe0\x39\xa3\x90\x86\x34\x9d\x79\x6b\x65\x76\xb2\x65\x9b\x90"
+ "\xff\xde\x0e\x28\xab\x6f\xfe\x6b\x6f\x65\xf9\xb3\x7c\x31\x3f\x4f"
+ "\xde\xc5\x6f\xd2\x36\x96\xf7\xda\x69\x9e\xbc\xcd\x90\xe6\xc9\x7f"
+ "\xca\x8a\x9e\x6f\xe8\xe1\x1b\xd1\xe2\x3a\x14\xbe\x49\x3b\xb6\xf3"
+ "\xe7\x89\xae\xdd\x6c\x27\xc5\x55\xf8\x2e\x17\xd2\xf0\xb7\x22\x5c"
+ "\x45\x7c\x34\x0d\xf2\x38\xc4\xe7\xb1\xd7\x4e\x8a\x66\xf5\xd2\x71"
+ "\x4a\x8f\x8e\x13\xf2\xaa\xf3\xe4\x25\xca\x47\xc0\x53\x54\xab\x20"
+ "\x57\xcc\x57\x81\xf9\x76\xe6\xa5\x12\x3b\x79\x7d\xb7\xb8\xee\xc0"
+ "\x73\x99\xf0\x2e\xda\x2e\x79\xa8\xc5\xb7\x1d\xac\x96\xd3\x7c\x7b"
+ "\x2b\xea\x38\x21\xaf\x7b\x51\x5f\x7b\xde\xe3\x19\xa4\xa0\xd7\xc7"
+ "\x63\x5b\xe2\x75\xbb\xb9\x31\x11\xf2\x59\xdc\x4b\x97\xcb\x90\xce"
+ "\x9d\xb7\x62\x61\x31\x9e\xc1\x7a\x3d\x6d\x05\x9a\x5c\x9f\x73\x47"
+ "\xa5\xe4\xa7\x90\xd6\x73\xfe\x69\x3e\xd0\xd8\xa5\x2b\x02\xc6\x77"
+ "\x4c\xbf\x89\x48\xad\x40\x0d\xbe\x35\x62\x6e\xb2\x35\xba\x83\x58"
+ "\x8b\x38\xc2\x95\xbc\x43\xe2\xd2\xa9\xe5\xa4\x74\xdd\x18\x3c\xcf"
+ "\x3a\x34\x7b\x9d\xca\xce\xff\xec\x02\x9f\x33\xed\x6e\x82\x36\xfa"
+ "\x8c\xd4\x38\xdd\xea\x68\xe7\xdb\x1d\xfc\xcf\xfb\x03\xbf\x02\x1f"
+ "\x15\xfd\x54\xe8\x1b\xe8\x0b\xa4\xcc\x57\xe5\x80\xb6\x04\xd3\xd1"
+ "\x8f\x05\x1d\xba\x53\xf4\x8e\x96\xec\xaa\x64\xbc\x33\x4a\x78\x5b"
+ "\x81\xe5\x75\xfd\xcc\x82\x65\xe6\x8a\x76\x55\x62\x1d\x32\x8c\x94"
+ "\xb3\xba\x3a\x2d\xa8\x67\xb5\xa9\xe8\x63\xaf\xfb\x22\xbe\x98\x50"
+ "\xae\x78\x57\x65\x68\x75\x58\xc7\x9f\x3d\x0e\xfd\x88\x33\x8e\xb1"
+ "\xbb\xf0\x8c\x65\xe9\xd6\xf4\x61\xf2\xc7\x8a\xa8\xe5\xdc\xb8\x77"
+ "\x40\xc6\x46\xe2\x39\x67\x37\xb4\x7c\x8d\xc4\x53\xf7\x12\xa1\xee"
+ "\xf0\x2d\xbe\xcf\x76\x67\x21\x7f\xfe\x37\x3c\x1b\x27\x06\x92\x17"
+ "\xe8\x98\x56\xfc\x2d\xd4\x3d\x6e\xa7\x87\x4f\x2e\x07\x9e\x7f\x7e"
+ "\xed\x29\xa9\xb1\x26\x3e\xcd\x42\xf8\x98\xfe\xe6\xe3\xad\x21\x96"
+ "\x8b\x1f\xff\xaa\x85\x3e\x4c\xbc\xeb\x03\xca\x74\xa2\xf1\xfc\x4c"
+ "\x21\x3f\x7c\xe7\x91\x55\x89\xd0\xb7\x08\xe3\x1b\x01\xc7\x3f\x44"
+ "\xf5\x52\xf7\xad\xd7\xfa\x77\xc3\xaf\xd7\x7a\x43\xdf\x7a\xad\xaf"
+ "\x19\xda\x7a\xad\x0f\xb8\xfe\x59\x54\x2f\x6d\xdf\x7a\x6d\xd8\x14"
+ "\x7e\xbd\x36\x4c\xeb\x5b\xaf\x0d\xef\x0e\x6d\xbd\x36\x04\x5c\xff"
+ "\x20\xaa\x57\x6c\xdf\x7a\x6d\x9c\x13\x7e\xbd\x36\x6a\xfb\xd6\x6b"
+ "\xe3\xa6\xa1\xad\xd7\xc6\x80\xfb\x7f\x03\xea\xc3\xfc\xa6\x58\xa6"
+ "\x0f\xd3\x6e\x0d\x5d\x1f\x6e\xec\xe8\xab\x0f\x37\x3d\xef\xd5\x87"
+ "\x9b\xa6\x86\xa5\x0f\xf3\xcb\x04\x7f\x63\xd3\xb5\x7d\xf4\xa1\xa9"
+ "\xcc\xe0\x5f\x1f\xa6\x9d\xe6\xf5\xa1\xb9\xcc\x10\x5a\x1d\xd2\x2a"
+ "\x7b\xf4\xa1\xb2\xcc\xe0\xa3\x0f\x23\x9b\x62\x3b\xf3\x36\xa9\xc3"
+ "\xd3\x87\x9b\xd4\x7d\xf5\x61\x9a\xc1\x57\x1f\x6e\x9a\x16\x18\x87"
+ "\x8d\x7a\x7f\xfa\x30\xde\x75\x96\x32\x6c\x34\xea\x43\x2c\x4f\x69"
+ "\x3f\x98\x77\xf4\xff\xad\xe3\x8e\xd0\xbe\x95\x1e\x70\xfd\x07\xf4"
+ "\x63\xd5\xe0\x83\xa8\x37\xbd\x4d\xa4\x27\xd3\x88\xb4\x36\xba\x1e"
+ "\xfa\x08\x4e\x72\x87\x01\x30\x91\x4d\x26\xd7\x16\xb5\x91\xda\xe8"
+ "\x93\x84\x2a\x47\xaa\xe9\x6f\xf6\x65\xc6\x25\x23\x36\xd3\x0f\x5b"
+ "\x53\x9c\x21\x62\x33\xbd\xc0\x83\xcd\x5a\x17\x60\x33\x15\xf1\x98"
+ "\x71\xde\xda\x76\x4a\xc0\x26\xf4\x68\x3c\xf2\xc9\x66\xf8\xf4\x8b"
+ "\x4d\x68\x13\xbe\xd8\x3c\x6e\x67\xd8\xcc\x78\xaf\x2f\x36\x8f\xdb"
+ "\xfd\x63\x33\x63\x0b\xc3\xe6\x71\x7b\x68\x75\xc8\x98\xed\xc5\xe6"
+ "\x71\xbb\x0f\x36\x7f\xb4\x2f\xb3\x33\x2f\x63\x6f\x78\xd8\xcc\xd8"
+ "\xeb\xa9\x7b\xb1\x50\x77\x48\x53\xf8\x62\x33\xa3\x25\xa0\x0c\x73"
+ "\xcf\xcf\x02\x7d\xa8\x38\x25\xcd\xdc\xef\x06\x9f\x96\x33\xc5\xe9"
+ "\xa1\x4f\xd6\x89\xe7\xc9\x53\xe9\x04\x42\xd7\xe9\x14\x9d\xd0\x37"
+ "\xee\xec\xd4\xcb\x69\xa4\xfc\x2d\xda\xad\x21\x50\x76\x15\xed\xd4"
+ "\x45\x02\xcf\x62\xe0\x3e\xba\x38\x95\x44\xc1\xa5\x29\x16\xf8\x0a"
+ "\xff\xc7\xd2\x75\x9a\x51\xf9\xa9\x64\xbc\xaa\x83\xc8\xa1\x0c\x09"
+ "\xaa\x2c\x35\x51\xb9\x48\x14\xfe\x4f\xb3\x4f\xe8\xa0\xef\x26\xc3"
+ "\x71\x51\x4e\x09\xdf\x33\xaa\x28\x5d\xa3\x23\xd0\x8f\x93\x83\x0c"
+ "\x34\x3b\xa5\xb4\xc2\xbd\x4e\x27\xa5\x91\xf6\x7f\xd3\x8d\x09\x7c"
+ "\x99\xb8\x98\x7d\x16\xc0\x90\x85\x66\xe8\xf1\xbb\x71\x78\xae\x31"
+ "\xfd\xd1\xbe\x43\xb4\x53\x33\xca\x7c\x81\x8c\xdf\x99\x4a\x62\x4a"
+ "\x52\x89\x8e\x76\xeb\xa4\xc0\x83\x84\xf9\xab\xd5\x28\xf7\x04\x2a"
+ "\x85\x6f\xa5\xc2\xb7\x5c\xd8\xff\x83\x6f\xb9\xe0\x5b\x67\xe1\x5b"
+ "\x67\xe0\x5b\xd9\xf0\xad\x6c\xf6\xad\xd0\x78\x9e\xa5\xed\x6f\xfc"
+ "\x3a\x7e\xd3\x38\x8c\xb3\xfb\xa5\xca\x38\x62\x1a\x8e\x65\x9f\xdb"
+ "\xa8\x0f\x11\xef\x59\x99\x81\xf2\xdf\xfa\x3e\x89\xa6\x8a\x49\xfa"
+ "\x99\xaf\x9d\xa0\xd8\xc7\x7e\xed\x7d\x32\x1e\xdb\x5c\xad\xf3\x34"
+ "\xb4\xb3\x49\xfa\xc3\xba\xb6\x50\xbf\x15\x70\xfd\x73\x5e\x36\xad"
+ "\xeb\x8e\xc6\x7e\xa1\xdd\xb9\x55\x4a\x8d\x5d\xd1\xbb\x1c\x1f\x1f"
+ "\xed\x22\x0b\x8c\x38\x5e\x4e\x8d\xda\x17\x88\xbc\x59\x9a\x5b\x9a"
+ "\x61\xc3\xb1\xc7\x6c\x83\xef\xd8\x63\xf6\x36\x22\xdd\x0c\x5f\x79"
+ "\x4d\x4f\xa4\x39\x0e\x02\x74\xbd\x2e\x5d\xfc\x9e\x71\x24\xdd\x45"
+ "\xbf\x84\xfe\x6c\x55\x3e\xf4\x83\xe3\x6f\x95\xd8\x2d\xa9\x38\x16"
+ "\xb7\xf9\x2e\xe0\xdf\xbf\xc1\x06\xa9\xf0\x7f\xcc\xcf\x90\x4c\xae"
+ "\x3b\x25\xdd\x1c\xab\xea\x18\x31\xcd\xa5\x68\xd2\xb8\xa0\xff\xd6"
+ "\xad\x69\xce\xbc\x68\xb2\xd7\x75\x63\x9f\xf6\x25\xd4\x03\xaf\xde"
+ "\xaa\x92\x64\x42\xbf\x35\x4e\x4f\xa9\x06\xc7\x97\x13\x8a\xe0\x42"
+ "\xd9\xf3\x72\x8f\x8c\x9c\x82\xf8\x40\x2c\xee\x64\xe9\x6a\xc4\xe3"
+ "\x56\xc1\x66\x3b\x22\x6e\x4b\xc4\x36\xe0\x86\xdf\x67\xfc\x8b\x44"
+ "\x5b\x1b\xdd\x04\x30\x9d\xb0\xc0\x2d\xc7\x76\x94\x60\x79\xe1\x33"
+ "\x72\xd2\x40\xa4\x19\x5f\x13\x25\x60\x48\x81\xed\x81\x83\xf6\x10"
+ "\xdf\xa8\x72\x42\xbb\xe6\xd2\xcf\x13\x15\xea\x09\x8c\xe1\x6c\x85"
+ "\xde\x28\x77\x56\x17\xb9\x63\x25\x89\x72\x9d\xd5\x8f\x76\x9c\xd5"
+ "\x5f\xb7\x9d\x23\x51\x91\x06\xa2\x2e\x5e\x09\xd8\x5d\x05\xed\xe3"
+ "\x0c\xb4\x8f\x36\xd6\x3e\x7a\xf0\x9a\x43\x77\xe3\xfe\x20\xbe\x6d"
+ "\x98\x85\xb6\xb1\x0e\xf0\x9a\xea\x6d\x1b\xae\x55\x3a\x69\xb1\x94"
+ "\x12\x28\x23\xf0\x3d\x2b\x71\x67\xfa\x08\xd4\xfb\x06\x3a\xee\x9d"
+ "\x44\xd0\xbb\x50\x57\xea\xfa\x3d\xc8\x62\xd8\xad\x52\x2d\xf4\xf9"
+ "\x35\x1f\xcf\x6a\x25\xde\x3e\x5d\xee\xdb\x5d\x63\x77\x39\xb4\xcf"
+ "\xd0\xb3\xcd\xd2\xcd\x3a\x48\x97\x6b\x9f\xfd\xb1\x1a\xe4\xf8\x36"
+ "\xeb\x03\xe6\x96\xe2\x78\x82\x5d\xfa\x2a\xc6\x03\x22\x38\x87\xf2"
+ "\x09\x3f\x7e\xfa\x5a\x22\xd0\x12\x37\xf0\xdc\xa5\x28\xcb\xe4\x14"
+ "\xf6\x56\xcb\xcb\x5d\x7c\xdb\xec\x06\x19\x9c\x4c\x22\xd2\x05\x6d"
+ "\xc0\x1b\x37\xf0\xa6\x93\xd7\x19\xb3\x78\x9d\x61\x92\x6f\x4b\xb3"
+ "\x53\x2e\x7e\x71\x04\x05\xbe\xc8\x71\x0c\x69\xbe\x81\xd0\x4d\xa7"
+ "\x81\x47\x1d\xf5\xa8\x5f\x22\xb9\x75\x4c\x87\xec\x00\xfe\x28\xdb"
+ "\x88\x9a\xe6\x4f\x4e\x7c\x3f\xbd\x6a\x98\x1b\x70\x8e\x7a\x44\x95"
+ "\x25\x19\x09\xb2\x8a\x34\x61\x3b\x87\x76\xaf\xca\xe2\xf5\x1a\x2f"
+ "\x5b\xd7\x3a\xdd\xcd\xdd\xeb\x74\x5a\xb8\xc6\x79\x74\x0d\x9e\x1b"
+ "\x56\x8c\x7a\x26\x2f\xab\x0a\xf5\x8c\xd5\x68\x27\x2e\xe0\x65\x24"
+ "\xda\xa5\x75\xba\x68\x9e\xa7\xcb\x80\xa7\x4b\x89\xfc\x4e\x27\x91"
+ "\x40\xb9\xd4\x50\x66\x52\xa3\x6f\x26\xc8\x63\x37\xb4\x23\xe4\x73"
+ "\x37\xea\x20\xc0\x1a\xf8\x29\x99\x4f\x2d\xd7\x92\xc3\xba\x63\x04"
+ "\xe3\x40\x65\x5c\xa4\x4d\x38\x7e\x6b\x85\xae\x02\x55\x36\x69\x90"
+ "\xb7\x76\xe9\x66\xf2\xf1\x2c\x27\x09\x8c\xe9\x9c\xaf\xbc\x98\xce"
+ "\xf9\xca\x8b\xe9\x9c\x56\x7e\xfe\x43\x84\xeb\x8b\x85\x80\x6b\x85"
+ "\x18\xd7\x39\x92\x4b\x8a\xeb\x99\xa1\xe3\x7a\xfb\x19\x11\xae\xd3"
+ "\xbf\x19\x5c\x7f\x92\xc0\xe3\x3a\xa2\x7b\x2c\xe2\x75\xb3\xcc\xea"
+ "\xfa\x23\xb1\x4b\x73\x8e\x7a\x70\x7b\xe4\xb7\x88\xdb\x5c\xcd\x95"
+ "\x8a\xdb\x8b\x9d\x3a\x2d\x5c\x43\x8e\x5b\xc8\x33\x68\xdc\x7e\x92"
+ "\xd0\x45\x3c\xfc\x43\xfc\x52\xd3\x24\xbd\x36\x83\x3c\x0c\x7c\x2b"
+ "\x55\x65\x8d\x23\x35\x8c\x87\xa5\xda\x67\x29\x07\x3a\xe2\x69\xc4"
+ "\x53\x57\x36\xa5\x9c\xa2\x31\x37\xe3\x53\xa2\x86\x6f\xd4\x59\x5d"
+ "\xef\x11\x95\x01\xe7\xa3\xca\x12\xa8\xf2\x39\x1d\x3f\x67\x25\x25"
+ "\x32\xce\x3c\xa9\x14\xc7\xae\x70\x6c\xd1\x6d\x6e\xaa\xe3\xcc\x37"
+ "\xc4\x71\xca\x67\x32\x71\x3e\x8b\x2a\x1f\x34\x74\xe6\xe5\x96\x7a"
+ "\xe6\x5a\xfc\xfb\x97\x4d\x75\xd0\x5e\x64\x27\xa5\x5b\x8a\xe1\x2e"
+ "\x85\xfb\x03\x70\x8f\x80\x3b\x7f\x6e\x5d\x68\x76\x2e\xf7\x28\x1b"
+ "\xc3\x6c\x8a\x11\xf4\xe0\x31\xbe\x0d\xde\x46\x94\xa7\x84\xff\x3b"
+ "\xf3\xb6\xc4\x7a\xe6\x6e\xbc\xf4\x3d\xfc\xa8\xc6\x6f\x03\x4f\x64"
+ "\x6c\x3e\x89\x3d\x8b\xf2\xab\xe1\x9f\x89\x4c\x0b\xf5\x2f\xc0\x79"
+ "\x5f\xc0\x92\xa4\x93\xea\x7f\x2a\xdc\x1f\x42\xac\xe2\x18\xec\x87"
+ "\x46\x66\x23\x3d\xdf\x80\xef\x96\xdb\xa5\xd9\xe3\xc5\xdf\xf5\xc7"
+ "\x0f\xbb\x74\x4b\xc0\x33\x7d\x42\xe3\xc5\x16\x7b\xa0\x7c\xa6\xea"
+ "\xdc\x34\xb4\xbc\xf2\x02\xee\xff\xa4\xd1\xbb\x2a\xe2\xcb\xdd\x16"
+ "\xae\x3b\x41\x75\x38\xed\x74\x88\x7e\x49\x5e\xc0\xfe\xaf\x5b\xd1"
+ "\x58\x1a\x7f\xeb\x38\xe2\x2e\xda\x55\x81\x63\x9d\xe8\x6b\xd5\xea"
+ "\x5c\x04\xfd\xad\x3d\x2f\xdb\xa5\xdd\xe0\x33\x46\x42\x7b\x9c\xd9"
+ "\xf1\x01\xdd\x7a\x0a\x7c\xd4\x75\x09\xaa\xfc\x97\xc9\x64\xd7\x59"
+ "\xcd\xa8\xd7\x41\x07\x75\x81\x3e\xe8\x3a\xab\x57\xd5\x1a\x9c\x84"
+ "\x2b\xde\x55\x61\x75\x55\x91\x9d\x40\x87\xfa\x17\xcb\x7b\xf1\x6c"
+ "\x42\x64\xde\x4a\x9c\xbf\x38\x4f\x2c\x2f\xfd\x16\xf4\xef\xeb\xaf"
+ "\x0d\xdb\x04\x3a\x07\x74\x06\xaf\x87\xc3\xd0\xc1\x5d\xaf\xde\x96"
+ "\xf8\xd4\x3c\xea\xac\x6d\xfc\x8c\x64\xd4\x10\x75\xc6\x5a\xa2\xc4"
+ "\xfc\xad\xae\x1a\xa6\x97\x9f\x07\xbd\x0c\xcf\x25\x22\xbd\xcc\xaf"
+ "\x2f\xe8\xa5\x97\xd1\xff\xae\x6d\x69\x25\x91\x1d\x64\xc4\xcc\x0e"
+ "\x95\x33\xbd\x83\x72\xe8\x8f\x5b\x5d\xa7\x71\xef\x71\xa4\x47\x47"
+ "\xbf\x05\x7e\x47\xf7\x2a\xa6\x9f\x8b\x05\xfd\xfc\xd6\x99\xc1\xeb"
+ "\xe7\xb7\xb2\x41\x3f\x83\xbf\xb7\x1d\x75\x33\xe8\xe5\xbd\x27\x1d"
+ "\x52\x17\xe8\xe2\xd0\x64\x6b\x0a\xb8\xfe\x63\x26\xd8\x4f\x94\x29"
+ "\x62\xa7\xa6\xdc\x85\xeb\x11\xbe\x74\x47\x7e\xee\x40\xfb\xd8\x05"
+ "\xb6\x71\xcf\xcb\xf5\xd2\x48\x23\xc8\xd6\xf0\x01\x75\xad\x49\x50"
+ "\xd1\xee\x04\xa5\xdb\xd4\x58\xea\xea\xd6\xc8\xbb\xbb\x41\xbe\xa0"
+ "\x2f\xc0\x5e\xa9\x1d\x1b\xf5\x3c\x4f\xb8\xb1\xbb\x2a\xb8\x9c\xa5"
+ "\x15\x60\x9b\x26\x96\x9c\x21\x13\xa8\xb9\x5e\xed\x32\xd7\x47\x77"
+ "\x9b\xeb\xa3\x00\x97\x91\x17\x4d\x28\xf3\x8b\x16\xce\x5c\x1f\xcb"
+ "\xe5\x37\x38\xdc\xca\xc6\x52\x87\xb2\x5e\x03\xcf\x3a\x6e\x23\xe0"
+ "\x60\x03\xe1\xe7\xb4\xb4\x33\xd1\x0e\x9b\xcd\xfe\x70\xb0\x3d\x3b"
+ "\x34\x5b\xfc\x54\x02\xe0\xa0\x1e\x70\xf0\xb5\x18\x07\x07\x89\x2b"
+ "\x5b\xb0\xd1\x73\x18\x16\x80\xef\x7c\x5f\xa6\xc7\x4e\x3f\xf3\xb1"
+ "\x7f\x3c\x34\x06\x87\x87\xae\xb3\xbe\x78\x28\x0a\x13\x0f\x60\x5f"
+ "\x35\x25\xd0\x6f\xba\x78\x56\x27\x2d\x42\x3c\x1c\xf3\xe2\xe1\x77"
+ "\xff\x70\x48\xbb\x43\xc6\x43\xbe\x21\x34\x3c\xd4\x1b\x06\x87\x87"
+ "\x65\x72\x11\x1e\x0a\x00\x0f\x45\x80\x87\x6d\x5e\x3c\x9c\x47\x3c"
+ "\x54\x88\xf0\x50\x08\xcf\xe5\x7d\xf1\xb0\xb5\xf8\xf2\xe2\x61\x58"
+ "\xfb\x77\x03\x0f\x05\x01\xfb\xbf\x01\xf0\x30\x48\xfd\xb0\x2c\xd1"
+ "\x8b\x07\x1b\xe8\x07\x1b\xe8\x07\x9b\x48\x3f\x9c\x06\x3c\xd8\x44"
+ "\xfa\xc1\x06\xfa\xc1\xe6\x47\x3f\xfc\xf2\xbd\xcb\x8b\x87\x6b\x9a"
+ "\xbf\x1b\x78\x78\xa3\x20\x34\x3c\xd8\x06\xab\x1f\x2a\x45\x78\x00"
+ "\xfd\x60\x03\xfd\x60\x13\xe9\x87\x2f\x10\x0f\x22\xfd\x60\x03\xfd"
+ "\x60\xf3\xa3\x1f\x7e\x75\xf0\xf2\xe2\xe1\xda\xcf\xbe\x1b\x78\xd8"
+ "\x16\x70\xfc\x3b\x00\x1e\x06\xa9\x1f\xf4\x6a\x2f\x1e\x1a\x40\x3f"
+ "\x34\x80\x7e\x68\x10\xe9\x87\x83\x80\x87\x06\x91\x7e\x68\x00\xfd"
+ "\xd0\xe0\x47\x3f\xfc\xba\xe6\xf2\xe2\xe1\xbe\xbc\xef\x06\x1e\xde"
+ "\xac\x08\x0d\x0f\x0d\x83\xd4\x0f\x7a\xbd\x08\x0f\xa0\x1f\x1a\x40"
+ "\x3f\x34\x88\xf4\xc3\x26\xc4\x83\x48\x3f\x34\x80\x7e\x68\xf0\xa3"
+ "\x1f\xfe\xeb\x8b\xcb\x8b\x87\xb9\x8f\x7e\x37\xf0\x50\x68\x19\x08"
+ "\x0f\x1e\x2c\x20\x2e\x10\x0b\xdd\x19\x09\x04\xfb\x19\x7b\x4e\x31"
+ "\x3c\x20\x0e\x78\x4c\x9c\x4b\x50\xb9\x01\x0b\xae\x8d\x80\x85\x2e"
+ "\x86\x05\xe4\x05\xe2\x01\xfb\x15\xd8\x9f\x40\x4c\xb8\xa1\x4f\xe1"
+ "\x52\x42\x9f\x22\x4b\xa6\x41\x1c\x74\x29\x06\xe8\x57\x74\x11\xbe"
+ "\xef\x87\x7d\xbc\x33\xd2\xed\xff\xf2\x87\x83\xb7\x42\x1c\xe3\xeb"
+ "\xe9\x5f\xfa\xe0\xe0\xb0\x17\x07\xcf\x07\xe8\x57\x3c\x1b\x00\x07"
+ "\xf6\x20\x70\x70\xa6\x6f\x3f\x73\xb0\x38\xe8\x5a\x25\xe0\x00\xfb"
+ "\x99\x9c\xd0\xcf\x7c\x09\xfa\x99\xca\x50\x71\xf0\x56\x55\x78\x38"
+ "\xb0\x19\x42\xc3\xc1\xb2\x4a\xf4\x13\x18\x0e\x6c\x45\x2e\x25\xf8"
+ "\x0a\x3e\x38\xe8\xc7\x5f\xf0\xc1\xc1\x8e\xd3\x97\x17\x07\xbd\xfc"
+ "\x85\xff\x58\x1c\x14\x05\xdc\xff\xcb\x81\xdc\x51\xdf\xe3\xb8\x3d"
+ "\xee\x33\x89\x74\xb0\x71\x23\xdc\x6f\xb2\x75\x25\x89\x41\x1b\xe1"
+ "\x5e\x97\xa0\x32\x9d\x21\x93\xb7\xac\x24\x32\xd7\x1a\x90\x7f\x32"
+ "\x91\x75\x49\x09\xe9\x5a\xa3\x57\x55\xb7\x38\xd8\x18\x12\xae\x47"
+ "\x05\xfa\x6e\x13\x1b\x43\x72\x9f\x4b\x88\xdc\xd2\xce\xd6\xc0\x5a"
+ "\xe6\xef\x02\xd9\x16\x1f\xf1\x27\xdb\x1d\x21\xe8\xfa\x2e\xb1\xae"
+ "\x3f\xed\x2b\x5b\xb1\x9e\x2f\xca\x16\x8d\x21\xcd\x0c\x30\x86\x14"
+ "\x84\x4c\xf9\xb1\xfd\x33\x4c\xcf\xf7\x8c\x21\x0d\x72\x8c\xbf\x1b"
+ "\x74\xfc\x5b\x52\x5f\x1d\x1f\x9e\x4c\x4b\x76\xf7\x37\xee\x88\xed"
+ "\x1b\xdb\xb5\xa7\x4d\xf7\xd8\x78\x6c\xc7\x20\xef\x8b\xa6\xcf\x3b"
+ "\x78\x5b\xbf\xd1\xdb\xa6\xb1\x2d\x63\xbb\xc6\x76\xcc\xdb\x7a\x8c"
+ "\x49\x9c\xa3\xb7\x94\x88\xc6\x8e\xdc\x4a\x41\xcf\xfb\xd1\xf1\x5c"
+ "\xbf\x3a\x7e\xa7\x5f\xf9\x7f\x1b\x74\x3c\xe2\xc0\xd3\xbe\xaf\xbc"
+ "\xb6\x5d\x1a\x78\xfd\x57\x50\x38\xa8\x4f\x19\x18\x07\xf5\x06\x2e"
+ "\x67\x79\x94\x08\x07\x05\x80\x03\xd0\xf3\x6c\xcc\x88\xe1\xc0\x3b"
+ "\x66\xc4\xf5\x1e\x33\xf2\xc1\xc1\xdb\x9f\x5e\x5e\x1c\xf4\x1a\x33"
+ "\xfa\x8f\xc5\xc1\xae\xfd\x83\xc4\x41\x10\xfa\xa0\x1e\xf4\xc1\x72"
+ "\x7d\x89\x68\xac\xc8\xad\xb4\x81\x3e\xb0\x89\xf4\x81\x77\xac\x88"
+ "\xeb\x3d\x56\xe4\x83\x83\x77\x6c\x97\x17\x07\xbd\xc6\x8a\xfe\x63"
+ "\x71\xb0\xfb\xc0\xe0\x70\x60\x0b\x42\x1f\xd8\x50\x1f\x1c\x10\xe1"
+ "\x00\xf4\x81\xe0\xf7\xf9\xf1\xf9\xb8\x7e\x7d\xbe\x77\x9b\xbe\xad"
+ "\x3e\xdf\x95\x8d\x83\xdf\x04\x9c\x2b\x0d\x12\x07\x41\xe8\x03\x1b"
+ "\xe8\x83\x97\xd5\x25\xa2\xb1\x21\xb7\xb2\x01\xf4\x41\x83\x48\x1f"
+ "\x78\xc7\x86\xb8\xde\x63\x43\x3e\x38\x28\xfb\xea\xf2\xe2\xa0\xd7"
+ "\xd8\xd0\x7f\x2c\x0e\xca\xab\x07\x87\x83\x86\x20\xf4\x41\x03\xe8"
+ "\x83\x97\x17\x8b\x70\x00\xfa\xa0\x01\xf4\x41\x83\x48\x1f\x78\xc7"
+ "\x84\xb8\xde\x63\x42\x3e\x38\xd8\xf3\xf5\xe5\xc5\x41\xaf\x31\xa1"
+ "\xff\x58\x1c\xfc\x36\xe0\xba\x0a\x0f\x06\x7a\xc6\x00\xa8\x17\x07"
+ "\xbc\xec\xd7\x24\xa8\xba\x14\x9f\x77\x78\xfa\xff\xa6\x3e\xfd\x7f"
+ "\xbd\x25\xe0\x38\x50\xaf\xf9\x65\xbe\x6f\x90\xff\xb9\x83\xf5\x13"
+ "\x1a\x4b\x51\xfe\xaf\x6f\x60\xfd\x44\xed\xb3\x28\xff\xdf\xf9\x97"
+ "\x7f\xa8\x63\x82\x8b\x41\xfe\x2d\xfd\xc8\xff\xc5\x00\xfd\x84\x17"
+ "\x06\x27\x7f\x5c\xef\xd8\x7d\x76\x08\xe5\xef\x19\x13\xfc\x82\x48"
+ "\xdf\x1a\x54\x7f\x71\x6f\x40\xf9\xfb\x5d\x4f\x52\xce\xd6\x93\xe0"
+ "\x5a\x92\xda\xd6\x56\xb2\xe5\x02\x51\x47\x26\x31\x4c\xf0\x6b\x4a"
+ "\x00\x13\xa6\x53\x64\xb2\x8b\xd5\xad\x67\x4d\x09\xc6\x70\x67\x7a"
+ "\xc1\xc2\xaf\x29\xf1\x8c\x07\xf4\xac\x27\x99\x8f\xeb\x49\xde\x3b"
+ "\x36\xe8\xb1\x00\x5c\x4f\x92\x02\x32\xee\x00\x19\x9f\x47\xf9\x1e"
+ "\xf6\x69\xd7\x3e\x63\x00\x81\xd6\x91\x04\x33\xae\x73\x09\xd6\x91"
+ "\xf0\x63\x00\x43\xd2\xa6\xdf\x2f\x0f\xa8\xdb\x41\x8e\x28\x4f\xab"
+ "\xce\xc5\x8f\xeb\x7a\xda\xb8\xd5\x58\x47\xb6\x74\x11\xb5\x67\xfc"
+ "\xdf\x23\x53\xd4\xf7\x14\x70\x40\xcf\x26\x28\x51\xa6\xaf\xaf\x04"
+ "\x3d\xbf\xca\xab\xe7\xb9\xe1\x4b\x2b\x8a\x37\x80\x7e\xdf\x40\x26"
+ "\xf0\x3c\x8a\x6c\x70\xb0\xf1\x80\xc6\x52\x6c\xef\xd8\x9e\xa9\xb2"
+ "\x5e\xd7\x2d\xb4\x77\x26\xef\x1a\x82\x72\x66\x67\x7d\xfe\xfe\x08"
+ "\xb6\x3d\x94\x79\xa4\x20\xf3\x92\x00\x32\xe7\xe5\x2d\x51\x63\xdc"
+ "\x10\xdc\x67\xd6\x23\x73\xd7\xab\xa2\xf1\x1f\xb1\xcc\x85\x71\x1f"
+ "\x0e\xda\x72\x50\xeb\x87\x82\x94\xfb\x90\x8d\xef\x83\xdc\x4b\x04"
+ "\xb9\xf7\x8c\xef\x0f\x4a\xee\x15\x81\xf7\xbf\xf8\xc8\xbd\xde\x30"
+ "\x78\xb9\x2f\x93\xfb\x91\x7b\x81\x20\xf7\x6d\xd8\xcf\x07\xb9\x97"
+ "\x77\x0b\xeb\x46\xfa\xca\xfd\x0f\x1f\x5e\x7a\xb9\x0f\x6b\xff\x6e"
+ "\xc8\xfd\x8f\x01\xe3\x9f\xf5\x92\xfb\x10\xb4\xf7\x65\x89\x7d\xe5"
+ "\x6e\x13\xda\xbb\x2d\x0a\xfb\xf5\x54\x69\x13\xda\xfb\x69\x3f\x72"
+ "\xdf\xf7\x97\x4b\x2f\xf7\x6b\x9a\xbf\x1b\x72\xdf\x1f\x70\xfd\x87"
+ "\xaf\xdc\x6d\x43\xd1\xde\x2b\xfd\xc8\x5d\x68\xef\xb6\x6d\xd8\x8f"
+ "\x07\xb9\x0b\xed\xfd\x0b\x3f\x72\xff\xd3\x1f\x2e\xbd\xdc\xaf\xfd"
+ "\xec\xbb\x21\xf7\x3f\xe7\x06\x29\xf7\x21\x68\xef\x7a\x75\x5f\xb9"
+ "\x37\x08\xed\xbd\x21\x0a\xfb\xed\x54\xd9\x20\xb4\xf7\x83\x7e\xe4"
+ "\xfe\x7f\xf6\x5c\x7a\xb9\xdf\x97\xf7\xdd\x90\x7b\x65\xc0\xf5\x7f"
+ "\xbe\x72\x6f\x18\x82\xf6\xae\xd7\xfb\x91\xbb\xd0\xde\x1b\xb6\x61"
+ "\x3f\x1d\xe4\x2e\xb4\xf7\x4d\x7e\xe4\xfe\x97\xb7\x2f\xbd\xdc\xe7"
+ "\x3e\xfa\xdd\x90\xfb\x5f\x8d\x03\xcd\xd7\x7b\x64\xef\x19\xb3\xe1"
+ "\xe7\x67\xc1\xbf\xf7\xc8\x1b\x71\x80\x32\x47\x2c\x88\x65\xce\xaf"
+ "\xe1\x59\xc5\xd6\xf0\xa0\xdf\x4e\xa1\x2f\x4e\x87\xf3\xeb\x37\x74"
+ "\x7c\xbf\x5d\xf0\xe3\xa9\x44\xa6\x41\x5f\x3e\xb0\x1f\xff\xdf\xbf"
+ "\xf4\xc8\x3b\xdc\xbe\xdb\x40\xf2\xee\xdd\x27\xbf\x52\xe4\x2d\xee"
+ "\xbf\x0d\x8d\xbc\x0f\xe8\xc3\x93\xb7\xcd\x10\x9a\xbc\x6d\x05\x4c"
+ "\xde\xfc\x3a\x8d\x72\xaf\xbc\x6d\xdb\x98\xbc\x6d\x85\x81\xed\xf9"
+ "\xc1\xac\x4b\x2f\x6f\xdf\x31\xf9\xff\x5c\x79\xff\x2d\xa1\xbf\x31"
+ "\x18\x94\x35\xca\x7d\xeb\xcb\x24\xe6\xf5\x97\xd9\xd8\x8a\xeb\xac"
+ "\x06\x75\xbe\x0c\xe5\x8f\x7b\x7c\x22\x01\x03\x9f\x24\x38\x48\x57"
+ "\x67\x02\xc1\xbd\x3c\xb8\xee\xa2\x56\x6f\x27\x56\xe3\xc7\x64\x4b"
+ "\x32\x51\x57\x27\xb6\x93\x99\xe5\xb4\xdb\xda\x68\xc1\x3d\xde\x32"
+ "\xcb\x86\x8f\x09\x5d\xa5\x1b\x35\xbf\x83\x48\xcf\x48\x3f\x50\xe3"
+ "\xba\x8d\x3b\x3a\x80\x27\xb8\xdf\x07\x64\xbe\xe5\x0c\x21\x87\x53"
+ "\x08\xd1\x2e\x45\x59\x7f\xb0\x62\xd8\x5a\x3f\xfb\x7c\x42\x19\x97"
+ "\x11\x8f\xbd\xfa\x91\xf5\x0e\xe9\xd0\xac\xcd\xf0\xac\xcb\xf0\x19"
+ "\x97\x19\xec\xfe\xcb\x21\x5b\x9b\x61\x89\xeb\x6f\xbd\x0d\xca\x13"
+ "\xdb\xb4\x2b\x9f\x8d\xcb\x58\x8d\x55\x04\xd7\xd5\x60\x1b\x76\x9f"
+ "\xd3\xc8\x37\xa6\x40\x5b\xaf\x67\x6d\xfd\xf5\x76\xa0\x4d\x6c\x20"
+ "\x88\x0f\x26\xdb\x6e\x26\xdb\x76\x94\x6d\x03\xa1\x6b\x74\xa3\xce"
+ "\x48\x2d\xad\x28\x5f\x94\x6b\x86\x8d\xa8\x17\x60\x5c\x14\xd4\xf1"
+ "\xa0\xdf\x41\xce\x13\x77\xbe\x4c\x26\x60\xfb\x77\x9b\xeb\xa3\x5c"
+ "\x66\xb6\x46\x03\xf5\x7e\xb7\xa2\x49\x93\x97\x2c\xc8\xff\x05\x94"
+ "\xff\x87\x7e\xe5\xbf\x23\xdc\xb1\x77\x41\xfe\x61\xef\xeb\xf9\xa6"
+ "\xda\xfb\xaa\xa1\x6a\xef\xff\x13\x30\x26\x8a\x2f\x0e\xd8\x38\x4d"
+ "\x68\x38\xe8\xf4\x83\x83\xff\x71\xf8\xc1\x41\x01\xe8\x7d\x79\x2f"
+ "\x1c\x6c\x13\x70\x50\x08\xef\xcb\xfb\xe2\xe0\xa3\xb5\x97\x07\x07"
+ "\x41\xee\xe7\xf9\xd6\xe3\xe0\xd0\xac\x20\x71\x10\x86\x3e\x38\xeb"
+ "\x07\x07\x87\x9c\x7d\x71\x60\x03\x7d\xb0\x2c\xd1\x17\x07\x36\x41"
+ "\x1f\xd8\x40\x1f\xd8\xfc\xe8\x83\xc3\x9b\x2e\x0f\x0e\x82\xdc\xc7"
+ "\xf3\xad\xc7\xc1\xdf\x03\xda\x7f\x5f\x1c\xd8\xc2\xd0\x07\x27\xfc"
+ "\xe0\xe0\x7f\x89\x1f\x1c\xa0\x3e\xa8\xec\x85\x03\x41\x1f\xd8\x0a"
+ "\xd1\x3f\xec\x8b\x83\xff\x7d\xed\xf2\xe0\x20\xc8\xfd\x3b\xdf\x7a"
+ "\x1c\x54\x05\xdc\xff\xdb\x0b\x07\x61\xe8\x83\x0f\xfc\xe0\xe0\x88"
+ "\xbc\x2f\x0e\x1a\x40\x1f\xe8\xd5\xbe\x38\x68\x10\xf4\x41\x03\xe8"
+ "\x83\x06\x3f\xfa\xe0\x88\xf9\xf2\xe0\x20\xc8\x7d\x3b\xdf\x7a\x1c"
+ "\x7c\x1c\xb0\xff\xe7\x8b\x83\x86\x30\xf4\x41\x86\x1f\x1c\x7c\xa2"
+ "\xf6\x83\x03\xd0\x07\x7a\x7d\x2f\x1c\x08\xfa\xa0\x01\xf4\x41\x83"
+ "\x1f\x7d\xf0\xc9\xaf\x2f\x0f\x0e\x82\xdc\xaf\xf3\xad\xc7\x41\x75"
+ "\xc0\xfd\xdf\x62\x1c\x74\xf7\xf4\x17\x2a\x79\x1c\xe4\x6d\x60\x38"
+ "\xd8\x84\x38\x68\x65\xeb\x77\x4c\x02\x0e\x7a\xfa\x0a\x2d\xbd\x31"
+ "\x50\x13\xd5\x83\x81\xaf\xbc\x7d\x85\x6e\x90\x37\x3f\x1e\x24\xf4"
+ "\x13\x3c\xe3\x40\x7c\x3f\x01\xfa\x89\x79\xed\x82\xfc\xf9\x31\x81"
+ "\x1a\xff\xf2\x0f\xa1\x9f\xe8\xb3\x46\xa3\xb7\xfc\xaf\xf0\x7d\x3a"
+ "\x7d\xc6\x05\x6c\x83\x5d\x9b\x51\x1b\xa4\xfc\x3d\x7e\x41\xb0\xf2"
+ "\x3f\xe1\x47\xfe\x56\x3f\xf2\xb7\x15\x30\xf9\x2f\xab\xf4\xf8\x03"
+ "\x9e\x71\x21\xde\x1f\xe8\x23\x7f\xeb\x65\x92\xff\x95\xb9\x3f\x67"
+ "\xe8\xe5\x5f\x17\x50\xfe\x05\x52\xae\x02\xae\x4a\xb8\x2c\x70\x55"
+ "\xb9\xa5\x64\x6a\xb1\x94\xe3\xf7\xf3\x60\x0c\xf1\xe2\xec\x3e\xef"
+ "\x87\xd3\xe1\x8f\xcf\x40\x1a\x90\x21\x7f\x66\xab\x27\x0f\x9a\x47"
+ "\x90\x8f\x16\xa5\x24\x11\xe3\x5f\x21\xed\x08\x4f\x5e\xca\x2c\x12"
+ "\xe7\xc9\x0b\xea\x97\x09\x7c\xb7\xa8\xb2\xe2\x86\x03\x7d\x15\xcd"
+ "\xdb\x62\x07\x5a\x39\x9f\x67\x96\x2c\x1a\xe9\x3d\xb4\xee\x6c\x09"
+ "\xc6\x6c\xb2\xa8\x24\x40\xcb\xf2\x1c\x29\xd0\x69\xb9\x6c\xa2\xe5"
+ "\xcb\x29\x95\xe2\xf7\x7a\x97\x73\x94\x40\x17\x23\x2e\xa3\x32\x2b"
+ "\x8e\xcf\x4f\xa0\xb9\x86\x0e\xbf\x71\x8a\x50\x17\x9d\x98\xce\xfd"
+ "\x28\xc1\x3c\x3d\x74\x0a\x21\xaf\xf1\x3e\x34\xbb\x08\x51\x49\xb4"
+ "\xac\x7c\x46\x29\x11\xca\xa7\x44\x5a\xf7\xa8\xdc\xfd\x6e\x89\x2c"
+ "\x96\x93\x92\x58\x9f\xdf\xe4\x10\x9e\x5e\xa0\x8d\xe4\x69\x87\xbf"
+ "\x82\xb4\x13\x04\x9e\xcb\xc4\x3c\x17\xe8\x54\x1e\x3e\x8a\xdf\xb9"
+ "\xb3\xa5\x98\x17\xbe\x07\x5f\xeb\xe5\x4a\xa8\xc3\x64\x0f\x9d\xe7"
+ "\x7b\x56\xf0\x00\x78\x5a\x29\xb9\x4b\x90\xc9\xb5\x50\x8f\x38\x0f"
+ "\x1d\xc6\x51\xf3\xd0\x02\xae\xc7\xec\xf4\xf2\x66\xb4\x3b\x2f\x2f"
+ "\xc5\x9d\x25\x9b\xd2\x3b\x4f\x55\x96\xc4\x8e\x74\x35\xad\x7c\xde"
+ "\x20\xbf\x3c\x1d\xd0\x5f\x27\xf0\x68\x1a\x93\x89\xba\x47\x26\x6e"
+ "\xa9\x0b\xdf\x59\x4a\x58\x59\xa3\x04\xba\x19\x7d\xe9\x64\x62\xba"
+ "\xef\x31\x3e\x6e\x97\x03\x6f\x66\xf5\xa5\x95\x8b\x69\xaf\x67\xb4"
+ "\xa6\x72\xa0\x9d\xdd\x97\x56\x2d\xa6\xfd\x3e\xa3\xcd\xaf\x04\xda"
+ "\x04\x3f\x65\x1d\x2d\xa2\xd5\x30\xda\x82\x2a\xa0\x9d\xd7\x97\x56"
+ "\x2b\xa6\x1d\xc3\x68\x77\xa8\x81\x36\xb1\x2f\x6d\x9c\x98\xf6\x06"
+ "\x46\xfb\x46\x3d\xd0\x2e\xee\x4b\x9b\x29\xa6\xfd\x01\xa3\xdd\xd6"
+ "\x0a\xb4\xfa\xde\xb4\x3b\x99\x6c\x6f\x16\x64\x1b\xcd\x68\xdf\x74"
+ "\x02\x6d\x92\x9f\xba\x45\xf0\xf9\x32\xda\xb1\x8c\x36\xaf\x1a\x68"
+ "\x0d\x7e\x64\x21\xa6\x1d\xc7\x68\x7f\x17\x0d\xb4\x29\x7e\x64\x21"
+ "\xa6\xbd\x91\xd1\x96\xb4\x01\xad\xd1\x8f\x2c\xbc\xb4\xa3\x4a\x3b"
+ "\x80\x26\x0d\xea\x59\xe7\x87\xb7\xe2\x3c\x6f\x62\x79\xee\x72\x01"
+ "\x7d\xa6\x1f\xde\x8a\x69\x6f\x66\xb4\xef\xca\x80\x76\xb3\x1f\xde"
+ "\x8a\x69\x7f\xc8\x68\xcb\x14\x40\x9b\xdb\x97\x16\xda\x1b\xe3\xef"
+ "\xdd\x02\x7f\x63\x18\xfd\x9e\x28\xa0\x37\xf9\xe1\x2f\xe6\xe7\x69"
+ "\xb3\xb7\x30\xda\x62\x0d\xd0\x16\xf8\xe1\xaf\x98\xf6\x47\x8c\xf6"
+ "\xaf\x16\xa0\xdd\xe6\x87\xbf\x62\xda\x1f\x33\xda\xf7\x1d\x40\x5b"
+ "\xe8\x87\xbf\x62\x5a\x1d\xa3\xad\x40\xec\x14\xf9\x29\xef\xcd\x22"
+ "\xda\x5b\x19\xed\x1f\xed\x40\x5b\xea\x47\x1e\x62\xda\xdb\x18\xed"
+ "\x81\x0a\xa0\xdd\xed\x47\x1e\x62\xda\x9f\x30\xda\xfd\x88\xf5\x72"
+ "\x3f\xf2\xe8\xa1\x05\xbb\x30\xde\x3d\xea\xcf\x75\x3b\x91\x5e\x22"
+ "\xe3\xf7\x9d\x51\x29\x6f\xdf\x79\x5a\xc0\x89\x45\xd0\x77\xb7\xb3"
+ "\x3c\x2b\xb1\x5d\xf2\xb1\x09\x90\xa6\xc6\xc9\xeb\x23\xb0\x2f\xae"
+ "\x7b\x76\x7a\x75\xf7\x1d\x8c\xf6\x3d\xc4\xee\x7e\xb1\x0e\xa5\x52"
+ "\x99\x98\xee\x4e\x46\x57\x8d\x7a\xa1\xd2\x97\x4e\xee\xa5\x1b\x65"
+ "\xc9\x85\xf7\x07\x4a\x7a\xe9\x63\x28\xa7\x38\xaf\xbb\x58\x5e\xff"
+ "\x53\x00\xb4\x16\x5f\x3a\xd7\xdd\x22\xba\xbb\x19\xdd\xa1\x42\xa0"
+ "\x3b\xe4\x4b\xa7\x15\xd3\xdd\xc3\xe8\x6a\xb1\x6c\x55\xbe\x74\x71"
+ "\x62\xba\x09\xee\xbc\xbf\x97\xf2\xb4\x59\xb2\xea\xde\xfc\x03\x5e"
+ "\xdf\x2d\xb2\x69\xf7\xba\xf3\xaa\xca\x05\xda\x3a\x0f\x0f\x79\x3e"
+ "\x33\xcc\x4b\x05\xcc\xdf\xe7\xce\xfb\xb8\x42\xa0\x3b\x2a\xb6\x03"
+ "\x22\x5b\x7b\x3f\x1d\xf5\xb7\x52\xc1\x8e\xf2\x67\x20\x83\x7e\x6f"
+ "\xf4\xe7\x6f\x18\x6e\x23\xd7\x9c\x92\xda\x0c\xcc\xf6\x78\xce\xeb"
+ "\x6a\x60\xe7\x26\x17\xed\xaa\x8b\xef\xa0\x2e\x71\xda\x56\x29\xad"
+ "\xbb\xb3\x83\xc8\x30\x66\x2a\x55\xda\x9d\x76\x48\x77\x8c\xdd\xe5"
+ "\xe8\xcc\xb3\xa5\xd9\x25\x4b\xf8\xd8\x86\xf0\x7f\xae\x9d\xfc\xa6"
+ "\x1a\xff\xdf\x9a\x4d\x9d\xc0\x13\x09\x9e\xef\xb2\x13\xfe\xcf\x87"
+ "\x8b\x3f\x53\x05\xfc\x3a\x9a\x43\xe2\x2c\xa9\x2e\x72\xd2\x48\xa4"
+ "\x5c\x7e\x59\x81\x36\x19\xe3\x0a\xda\x8e\xd1\x75\xfa\xc9\x50\x96"
+ "\x0a\xf8\xee\xe2\x66\x78\xe6\xcb\x02\xf5\x07\xdb\xb8\xd7\x92\x8c"
+ "\xb1\x45\x1b\x46\x3a\x94\x4d\x15\xf4\xd5\xb9\x5f\x19\xd2\xc9\x8d"
+ "\xa7\xa4\x0d\xf2\x73\xa0\x1b\xce\xad\xd3\xff\x14\xf3\xe0\x94\x65"
+ "\x7b\x81\xe6\x10\xc6\x24\xa4\x85\xcd\x05\x2c\x5e\x61\x03\x1f\xcf"
+ "\x1d\xca\x53\x47\xa3\x77\x59\xb8\xae\xcd\x99\x78\x36\x9c\x25\xfd"
+ "\x14\x69\x16\xbd\x73\x8c\x69\xe6\x63\x19\x42\xfd\x2c\x6e\x93\xdc"
+ "\xc9\x29\xe4\x1d\xd4\x74\x9d\xc3\x9a\x64\x27\xec\x2c\x98\x06\x1b"
+ "\x8d\x7c\xde\xca\x99\xe4\x8d\x90\x6e\xb7\x76\x74\xf1\xe9\x90\x47"
+ "\x01\xfa\x9d\xe7\x14\x6a\x19\x35\xa9\xe5\x96\x1b\xba\x48\x8b\xb4"
+ "\x81\x6f\xe3\x98\x4e\xcd\xd7\x39\x90\x57\x9c\xf9\x3a\x7b\x84\x86"
+ "\xc8\xce\x29\xd5\xb2\xce\xbc\x86\x0a\xcf\x99\x24\x9e\x6f\x61\xbe"
+ "\x76\x21\x2f\x78\x5f\x67\x97\x4c\xb5\xb0\x38\x89\x0d\xf2\x7e\xd6"
+ "\x88\xa8\xa8\xb9\xac\xaa\x33\xef\x38\x01\xdf\xb2\x82\xc9\xe0\xb8"
+ "\xc2\x2e\x99\x6c\x12\xfe\xd7\xd8\x25\x0f\x77\x08\xff\xc7\xd8\x25"
+ "\x73\x9d\xc2\xff\x3d\xf1\x1f\xfd\xc7\xa3\x2c\x2b\x02\x9e\xef\xe7"
+ "\x76\x24\xc8\xd1\x2f\x46\x5f\x9f\x2a\xcb\x8a\xb4\xe3\xf0\x1c\xc2"
+ "\xe3\x55\xf0\xcd\xfd\xec\x2c\x80\xe3\x66\xb8\xab\x84\xbb\x43\xb8"
+ "\x53\xa4\xe1\x71\x15\xfd\x4e\x1c\x35\x1d\xcf\x45\x7e\xa7\xbb\x29"
+ "\x07\xf9\xd6\x03\xef\x5a\xad\xc6\x56\x81\xa7\xc7\xf9\x33\x90\x79"
+ "\x99\x82\xdc\xa9\xf2\xba\x56\xfe\x5b\xe6\xa6\x0a\x71\xb9\x80\x86"
+ "\xc4\xde\x75\xf7\x3d\x13\xee\xbd\xef\xfe\x89\x0f\x2c\x7c\x69\xd1"
+ "\xe2\x25\x4b\x97\xe9\x97\xbf\xfc\x4a\xd2\x8a\x95\xab\x0c\xab\x93"
+ "\xd7\xa4\xac\x4d\x5d\x67\x5c\xbf\x01\xe9\x7a\xea\xb0\x63\xca\xff"
+ "\x6f\xef\x7a\xc0\xa2\x3c\xce\xfc\x7c\xcb\x9a\x22\xc5\x82\x86\x10"
+ "\x6a\x4c\x5c\x0d\xf4\xc8\x9d\xc0\x62\x48\xa2\xd6\x36\x24\x35\x09"
+ "\xb9\x9a\xc6\xdc\x79\x57\xef\x4a\xee\xe4\x82\x06\x52\x44\x0b\x24"
+ "\xe2\xbf\x40\xd0\x5e\xd3\x3d\x95\x4d\xe4\x28\x77\x41\x96\x34\xd8"
+ "\xb3\x2d\xd7\x98\x0b\xf6\xe8\xd5\xf6\xb0\x92\x1e\x26\x44\x4c\x6b"
+ "\xee\xc8\x15\xec\x8a\x0b\x2c\xb0\xe0\x0a\xab\xa0\x20\x73\xbf\x77"
+ "\x66\x3e\xf6\xdb\x05\x8d\xf9\xdb\xe7\xb9\x87\xd1\xe1\xfb\xe6\x9d"
+ "\x99\xf7\xdf\xbc\xf3\xce\x3b\xb3\xb0\xa3\xf9\x4c\x0c\x74\xee\x07"
+ "\x9d\xb6\x04\xc1\x0f\x60\xd2\x26\xda\xe6\x99\x2d\x53\xeb\xb4\x25"
+ "\x06\x7b\x9f\x85\x74\x07\x58\xdb\x16\xba\xfb\x06\xf6\xa7\xb5\x54"
+ "\x3e\xd4\x40\x77\xa7\xb9\x4c\x6d\x39\x27\xbc\x0f\x35\xd0\xdd\x7d"
+ "\xc7\x62\xdc\x2c\x76\x21\xdd\xaf\xd6\xb6\x86\xea\x1d\x5f\x60\xac"
+ "\x11\x7d\xa7\xc2\xb9\x30\x92\xc5\xec\x8b\xe6\xde\xb2\x68\xee\x21"
+ "\xfc\x65\xe5\xdc\xed\xdd\x96\xc5\xf6\xa2\x0c\xbb\x8d\xec\x32\xb5"
+ "\x27\x1c\x43\xb4\x8d\x38\x7a\x5e\x55\x39\x77\xed\x8a\xe6\xae\x9d"
+ "\xe5\xdc\xe3\x88\xe6\xce\xd8\x32\x16\x3e\x6c\x6b\x73\x3a\x4d\x6d"
+ "\x4b\xc4\xbc\x42\xfd\x78\xd8\xef\x5a\x4b\x51\x97\x34\xc6\x42\x1c"
+ "\x28\x03\xe6\x3b\x66\x91\x7c\xbf\x3a\x38\x32\x03\xf2\x35\xf2\xd1"
+ "\x1c\x6d\x2f\xe8\xc8\x71\x6a\x7f\xac\x11\x11\x00\xe8\x79\x5b\x46"
+ "\x3a\x60\x2b\xed\xab\xe8\x4e\x29\xd0\x8b\x68\xa9\xf0\x30\xc2\xf7"
+ "\x93\xbc\x91\x19\xf9\x73\xf9\x18\xda\x5a\xc7\xb7\xe5\x68\x68\x13"
+ "\x0e\xdc\x3e\xa3\x3c\xf1\xeb\x37\x14\x58\x72\x9f\xce\xc9\xb9\x23"
+ "\x8c\xc5\x8b\x67\xc0\xbd\x7f\x05\xf4\x7d\xb4\xfb\xca\x79\x23\xe4"
+ "\x6c\x80\xbc\x4d\x6f\x23\xe2\x87\xcd\x30\xc8\x64\x07\xde\x03\x80"
+ "\x1f\xc1\xfb\x11\xf0\xde\x24\xef\x8a\x1b\x78\x87\xdb\xda\xd3\xc1"
+ "\x27\xad\x39\x16\xfa\xfe\xda\xa1\xcd\xab\x35\xc8\x5d\x86\x76\x4d"
+ "\x96\xb9\x2c\xae\xcb\x74\x3a\x01\x7c\xd4\xe0\x9d\xda\xbf\x47\xe3"
+ "\x88\xf6\x8d\x52\xae\x81\xa3\x54\x86\xae\x1a\xf6\x47\xf3\xdd\xc3"
+ "\xb6\xd3\xa1\xf4\xbd\xdc\xe2\xfe\x22\x94\xa1\x97\x26\xb4\xb5\x0f"
+ "\x15\xad\xd6\xb0\x6f\xd4\x1c\x13\x38\xdb\x5b\x89\x27\xe2\x83\xf6"
+ "\xa2\x6f\x21\xf2\x1b\x1f\x5d\xc3\x12\x46\x98\xf6\x96\x8b\xb1\xca"
+ "\x72\x5e\x8d\x5c\x89\x5c\xf1\x26\xea\x8e\x23\x37\x01\xde\x8c\xe7"
+ "\x9b\x78\x1e\x47\xc6\x5e\x36\x86\xf8\xce\xdf\xce\xdd\x49\x15\xec"
+ "\x76\xc2\x0f\xdb\xfa\x7a\x87\x69\x20\x9e\x78\xa7\xef\xbd\xe7\x61"
+ "\xa7\x2b\x03\xbf\x2b\xdc\x19\xc9\x50\x8f\x67\xac\x7c\x1a\xb3\x33"
+ "\x07\x79\xb7\x7a\x3f\xc5\x4c\xbf\x1f\x53\xef\x6e\x64\xdf\xfb\xe7"
+ "\x60\x7c\x57\xcb\x67\xd6\x5e\x7f\xdb\xeb\xca\x95\xd7\xd7\xee\x6c"
+ "\x0c\x33\x75\xc2\xfb\x77\x1e\x0c\x84\x77\x16\x4b\x58\xef\x4a\x59"
+ "\xee\x5d\xa3\x9e\xbb\x98\xa9\x0f\x7a\xea\x03\xfe\xbe\x06\x09\xeb"
+ "\x6b\xc6\x33\x0a\xd9\x12\x44\x9f\x70\xd6\xd1\x78\x8e\x96\x60\xcd"
+ "\xc0\x58\x3a\x4d\xa7\x73\x68\x8c\x4a\xa5\x6d\x69\xe3\x5c\xc0\xb2"
+ "\x60\x5b\x95\x7e\xfb\x71\x3e\x1e\x68\x3f\xce\xb4\x20\xfb\xb1\x93"
+ "\x3f\xc2\x5c\xa8\x73\x48\x7b\x39\x32\xb4\x2d\x13\x65\xe7\x4a\xe0"
+ "\x39\x42\x67\x24\xc0\x21\xe2\x8a\xd2\x5e\xc6\x66\x65\x31\x33\xf9"
+ "\x17\x8f\xc9\xb9\x9f\x6c\x96\x68\x2b\xba\x92\x17\xf0\x07\x58\x35"
+ "\xf1\xb7\x11\x78\x51\xae\x41\xbb\xea\x16\x36\xa8\xf3\x26\xfa\xd8"
+ "\x9e\x82\x3d\x2a\x7e\x09\x27\xf5\xe3\x7e\xb9\xb2\xa8\x8f\xa4\x7d"
+ "\xe6\x31\xc0\x69\x6f\x4b\x7f\xff\x14\xd2\x32\xe6\x64\x64\x93\xf4"
+ "\x6c\x19\xb3\x62\x2e\xa5\xb1\xf1\xe1\x35\x2c\x29\x86\x59\x31\xdf"
+ "\x66\x76\x98\xce\xa4\x24\x6e\x67\x56\xc2\x47\x7e\x1d\x72\x8c\x38"
+ "\x68\x2e\x4a\x5c\xea\xfe\xd3\xd3\x59\x6f\x6e\x62\x82\x4e\x15\xf1"
+ "\x83\x7a\x03\xdd\x32\xda\xc7\x96\x6e\x95\xb2\x82\x56\x0d\xfa\x1f"
+ "\x22\xd9\x49\x9f\xa8\xaf\x07\x1e\x3b\xd5\x89\xbb\x83\xa4\x3c\x35"
+ "\x74\xbf\x04\xe9\x83\xda\xd3\x5d\x94\xf2\x7b\xc2\xdb\x0f\x0b\xbd"
+ "\xa1\x3f\x8d\x07\x07\x0d\xc2\x51\x34\xc6\xc7\x38\xfc\xd1\x2b\x5b"
+ "\x47\x10\x7b\x9c\x9d\x19\x38\x3e\x67\xdc\xc6\xf1\x41\xbf\x43\xe8"
+ "\xdf\xc8\x21\x23\xf9\x13\xd0\x8c\xa0\x78\x03\x30\xfb\xb8\x0d\x38"
+ "\x9e\x19\x11\xe7\x3a\x5d\xa6\x8e\x4b\xe0\xc5\x4e\x78\xc0\x4f\xa3"
+ "\xc4\xd5\x91\x72\x74\x7b\xe0\x58\x2b\x7c\x35\x34\xe6\x62\x3e\x6f"
+ "\x15\x32\xc1\x77\x75\x1c\xaf\x92\x75\xf5\x68\x53\xcf\x47\xd3\x18"
+ "\xdd\xd7\x20\xd7\x12\x51\x57\x57\x74\x49\x8c\x6f\xa3\xf4\x6b\x1d"
+ "\x3d\xf9\x3b\xb8\xdb\xcf\x77\x47\xb5\x7e\xe7\x85\xe2\xbb\x8e\xe8"
+ "\xf1\xcd\xe9\x62\x6d\x25\x1a\xd4\x5f\xe1\xdb\x4e\xf8\x74\x5d\x25"
+ "\x82\x0f\xa9\xaf\x33\x87\x00\xaf\x21\x5b\x14\x7a\x83\x1f\x1d\x2a"
+ "\x22\x5b\xec\x20\x1b\x3a\xb2\x97\xca\x9b\x45\x79\x89\xf0\xb1\x13"
+ "\xf5\x67\x3c\x54\xdf\xe2\xc6\xb8\x7d\x13\xb6\x34\xce\xd8\xed\x51"
+ "\xcc\xea\x2b\x11\xb2\xd5\xfa\xb6\xad\xd0\x8e\x8d\x31\x46\x7c\x42"
+ "\x47\xf5\xc3\xb6\xb3\x2b\xb1\xd6\x88\xf8\x01\xfe\xba\x8e\xbf\xb2"
+ "\x86\x11\xcf\xf0\x67\x8a\xbf\xb3\xbf\x50\x63\x5f\x47\x32\x92\x3e"
+ "\x13\xa5\xef\x43\x5d\x67\x06\xf1\xee\x97\xfb\x6c\x85\x51\xc7\x42"
+ "\x6e\x8c\x03\x8d\x17\x8d\x8b\x01\x27\xd9\xbe\x1d\xb8\x6a\x65\x59"
+ "\xda\x06\xe9\xda\x1e\xcd\x9b\xa9\xbd\xbf\xad\xeb\x1d\xaa\x7b\x16"
+ "\xb4\x93\x36\x31\x71\xf7\x18\xdd\x5b\x02\xbc\xb5\x74\xcf\x28\x70"
+ "\xd4\x93\x4e\xc1\x4b\x1c\xd9\x23\xca\xcd\xaa\x5f\x2c\xd6\xf3\x45"
+ "\xc8\xcb\xfd\xf3\xbf\xf3\xa6\x40\xfb\x72\x05\xcf\x7f\x1a\x6f\xfb"
+ "\x78\x51\x1a\x13\xf6\x90\xc7\x2c\x03\x26\xd7\x6b\x6a\xed\x50\x63"
+ "\xdd\x39\xe3\x18\xe6\x8b\x01\xc7\xee\xa0\xb1\xae\x17\xf6\xb8\x79"
+ "\xa5\x46\x32\xa3\x6f\xbd\xc2\x23\x64\x16\xf6\x54\x22\x6c\xa0\x99"
+ "\x6f\x86\x9c\x13\x76\x70\xd6\xad\xc6\xb9\x39\x48\x27\xba\xef\x4a"
+ "\xa1\xfb\xe5\xc8\x27\x0d\x97\xb0\x2f\x0f\x8f\xfa\xfd\x12\x8d\xfd"
+ "\xb8\x18\x7b\x97\xdd\x21\xd7\x5b\xe5\xb7\x5c\xb2\x3e\x3a\xc0\x86"
+ "\x89\x97\x37\x84\xfd\x12\x2f\x45\xe9\xc4\x4b\xbd\xe0\xa3\xc8\xc2"
+ "\x06\x4c\x9d\xcb\x89\x3e\xfa\x36\xa9\xf9\xaa\x70\x9d\xad\x24\x5c"
+ "\x3b\xe1\xab\x88\x27\xd0\x8e\x17\xfe\xef\x41\xa1\x93\xfd\x8a\xf7"
+ "\xa6\x91\x12\xea\xeb\xb4\x5f\x32\x89\xbe\x4d\x78\x37\x8f\xc8\x3b"
+ "\x68\xc2\xd0\xff\x20\x7d\xef\x7f\x97\xa9\x67\x8c\x7c\x34\x7d\xe6"
+ "\x84\xf7\x4e\xfa\xfb\x50\xf8\x14\x33\xf0\x85\x92\x8d\xea\x76\xe1"
+ "\x31\xf5\xbc\x4b\xdf\x8f\x0f\x5d\xd7\x22\x46\x3a\x48\xfa\x26\x5b"
+ "\x46\x8c\x94\x32\x6c\xeb\x32\xeb\x76\x0b\x3a\x95\xa4\x7b\x39\x3e"
+ "\x5d\x0f\xc3\x8e\xeb\xfd\xb6\xd5\xf5\xb0\xd2\xe3\x41\xe8\x31\x14"
+ "\xf4\x8e\x2b\xb9\x0e\xa2\x3d\x62\xb1\x9e\x9f\x29\xde\x2b\x54\xfb"
+ "\x75\xfa\x38\xa8\xb9\xda\xbc\x97\xfc\xaf\x18\x83\xae\x31\xd5\xb7"
+ "\x46\xd1\xba\xa2\xb7\xa5\x18\x51\xde\x2d\xd5\x75\x85\xfc\x60\x12"
+ "\xc6\x5e\xf8\x3e\x71\x07\xaf\x84\xd1\xdc\x91\x34\x7a\x0e\x08\x3b"
+ "\x44\xdc\xe3\xb7\xa3\xae\x53\x41\xfe\x89\x7c\xb1\xfd\x04\x70\x90"
+ "\x3f\x25\x5b\x22\x9f\x4a\xfb\x18\xe0\xab\x55\xf3\x47\xf1\xdc\x7d"
+ "\x5f\xa0\xad\xf4\xbc\x00\x5b\x49\xf0\xe3\xee\xb6\x4e\xb5\xce\x39"
+ "\xa4\x0f\xac\x94\x7d\xba\x9f\x53\xb2\xd5\x4a\xd9\x54\x99\xf4\xf6"
+ "\xac\xd0\xdb\x03\x06\x3d\x42\x6f\xee\xd7\x54\xfb\x7a\xf2\xe5\xfe"
+ "\xf9\xda\xdd\xaf\xcf\xe5\xc9\xfe\xc2\xfd\x32\xcd\x07\x03\x5f\x4d"
+ "\x41\xfe\xa2\x7e\x6a\x7f\xd1\x5d\xa1\xe4\xad\x0e\x9a\x1b\x35\x2a"
+ "\xde\x3d\xac\x8f\xc3\x09\xec\xd3\xe4\x3d\x4a\xed\x87\xc9\x7f\x12"
+ "\x6d\xe3\x1a\x54\x25\xf5\xaa\xe6\xb2\x7b\xcf\xe4\x71\x70\xa7\x1b"
+ "\xe7\x33\x8d\x35\xf9\x04\xc2\x41\x63\x2a\xe2\x4a\xc0\xe4\xb8\xba"
+ "\x53\xc8\x37\x18\x7d\x34\xda\x96\x8d\x73\x9a\x2f\xee\xb5\x81\x73"
+ "\xb1\xbb\x59\xcd\x45\x45\xbb\x27\x19\x63\x64\x35\xd0\x3d\x15\x44"
+ "\x97\xc6\xa6\x91\xf4\xa0\xc6\xf4\x56\x7d\x4d\xa3\xf6\xe8\x5b\x38"
+ "\x6c\xeb\x09\x0d\x5a\x1f\xed\xc4\x1f\x68\x15\x0b\x9f\x55\x2e\x7c"
+ "\x45\xe1\xb0\xe0\xa7\x27\xdc\xa1\xd6\x09\xc0\xac\x12\xe6\x6e\x55"
+ "\x6b\x89\x6e\x37\x3b\x02\x79\xea\xc9\x9a\x3a\x3e\xea\x2e\xd6\xe3"
+ "\x23\x81\x4b\xf8\xa2\x9e\x1c\x25\x1f\xc1\x12\x24\xac\x3b\x85\x60"
+ "\x7b\xa5\x1e\xca\xb8\x58\xaf\xba\x5a\xd5\x7a\x45\xf3\xcb\x84\x72"
+ "\x1a\xcd\x31\x2a\x03\x47\x03\xe1\x6f\x29\xbe\x4c\x7b\x88\x0a\xa7"
+ "\xa9\xd3\x45\xfe\x80\xfc\x05\xfd\x1e\xab\x78\xd2\xef\x96\x9a\x7a"
+ "\x67\x91\xdf\xa1\x38\x84\xea\xd1\xee\x14\xf9\x22\xc0\x17\xd0\x7d"
+ "\xad\xbc\x2f\x14\x78\x7b\xcd\xb2\x6f\xef\x5d\x22\x56\xe8\x4b\x0b"
+ "\xd1\x61\x7a\x3f\xf8\xad\x4e\xea\x47\xfd\x75\xff\x45\xbe\x6b\x8c"
+ "\x7c\x93\xa0\xd7\xbb\x45\xd9\xb8\xd8\x37\xe8\x71\xd1\xa8\xc9\xd0"
+ "\x96\xee\x9f\x11\x3e\xad\xb7\x51\xfa\xb3\xde\xc3\xd4\x57\x8c\x1f"
+ "\x7c\xe5\xb3\x97\xf8\x19\x47\x1e\x33\x57\x0d\x92\x5f\x6c\xaf\x93"
+ "\x7c\xf6\x45\x2a\x39\xde\x13\x72\x48\x9f\x6a\x97\xbc\xb4\xd7\x55"
+ "\x5d\x16\x75\x17\x48\x16\xaa\x2b\x35\xd4\xf1\xd1\x78\xd4\xf5\xcd"
+ "\x16\x7c\x05\xf5\x1b\x1f\xcd\x9a\xd4\x9e\xee\x1f\x86\x0f\x0d\xad"
+ "\x2a\xd7\x7d\x6f\x9f\x5d\xf2\xd9\xf7\x88\xee\x77\xa1\xf7\x36\xf2"
+ "\xbd\xa2\x6e\xbd\x6a\xf3\x35\xf5\x14\xfe\xbd\x6f\x87\xd4\x6b\x8c"
+ "\x49\xe9\xdb\xa5\xe4\x78\x41\xec\xb3\xfb\xd6\x40\xb7\x7d\x05\xba"
+ "\x6e\x8d\xef\x34\x7f\x40\x3f\x92\xca\xc2\xee\xb7\x8b\x3d\x6c\x25"
+ "\xb5\x21\x9e\xe4\x1a\xd1\x9b\x13\x1c\x53\x63\xaf\x37\x93\xd6\x25"
+ "\x19\xab\xf6\xf7\xa8\xb3\x21\xd6\x90\xf7\x7d\xac\x0b\x9e\x14\xdd"
+ "\xc7\xf0\xe1\x34\xec\xf9\x3b\xd0\xc6\x23\xee\x35\xa5\x3b\x45\x8c"
+ "\x6d\xc8\x3f\xbd\x7a\xd9\xa9\x70\x7a\x22\x75\xbf\x41\xbe\xe4\x84"
+ "\xaf\x43\xc5\x74\x9e\x86\x2a\xe5\x4b\x06\x4c\x9e\xa3\x81\x71\x98"
+ "\xe7\x68\xa0\xcf\xe8\x7f\x37\xd8\x67\x20\x6e\xde\x35\x6c\xf3\x94"
+ "\x05\xc4\x01\x80\x5d\xdb\x77\x78\xb2\x68\x8e\xd2\x9d\x72\xc2\x3f"
+ "\x89\xf3\xae\xfe\x3b\x74\x9e\xc9\x6f\x0e\x6d\xd3\xcf\x2f\xfa\xdf"
+ "\xa0\x58\x2d\x90\x5e\xbf\x39\xc0\x77\x12\x3d\x1d\x9f\x99\xd1\x9d"
+ "\x64\xd0\x03\x9d\xb9\x78\x4e\x29\x3f\x5f\x1d\xe0\x2b\xd5\x1a\x46"
+ "\x7e\x32\x70\xad\x6a\x3f\x1c\xb8\x56\xf5\xbf\x36\xd9\x47\xf6\x17"
+ "\x5f\xff\x5a\xd5\xbf\x86\xfc\x96\xee\x23\x03\x7d\x41\xff\xae\xaa"
+ "\x80\x58\xb6\x3f\x5c\x8f\x65\xfd\x7e\xd4\x53\x49\x3e\x0a\xf4\xeb"
+ "\x15\xed\x31\xac\xfb\x13\xb4\x51\x9f\x72\xc2\x02\xdb\xb4\xb5\x67"
+ "\xc1\xa6\x9c\x2a\x06\x14\x73\xf3\xb2\xb8\xbf\xa8\x2f\x1e\xf6\x17"
+ "\x46\x76\xd6\x90\x3b\xc8\x5c\xfe\xb5\xa2\x71\x68\xa3\xae\xdf\x81"
+ "\x3d\xc6\xb8\x70\x7f\x39\x7f\x7e\xd8\x36\x90\x69\x94\x71\x0f\x60"
+ "\xa5\xea\x0c\x41\xe8\x56\xe0\x1a\x58\xe2\x28\x0f\x94\x4d\xca\x31"
+ "\x90\x43\x72\xd0\x9e\x08\xf4\x17\x51\xdc\x83\x98\x0f\xef\x9d\x87"
+ "\x1c\x13\x36\xef\x34\x5f\x2a\x31\xc6\x57\xa7\xc3\xc9\x57\xaa\xbd"
+ "\x67\x13\xe2\x1d\xbb\xf1\x2c\xe6\x91\xaf\xac\xb2\x6c\xca\xcb\xce"
+ "\x2d\x58\xbf\xd8\x92\x9d\x9b\x5d\x90\x9d\x91\x93\xbd\x35\xa3\x20"
+ "\x7b\x63\xee\xa2\x0d\x19\x4f\x66\x3f\x61\xd9\x9c\x91\x6f\xb1\x16"
+ "\xc6\x15\x86\x31\x7f\xd3\x65\x96\x8c\xfc\xfc\xa7\x37\xac\xcb\xb4"
+ "\xe4\x66\x3f\x91\x90\xb7\x2e\x7f\x5d\x81\x25\x23\x6f\xe3\xd3\xb9"
+ "\x99\x96\xb8\xcc\xc4\x38\xeb\xdd\x99\x61\xc6\x33\xb4\x85\x91\xcc"
+ "\x33\x7e\xd1\xed\x2e\xbd\xc8\x42\x23\xb4\x4d\x79\x11\x85\xd9\xb9"
+ "\xf2\xdc\xee\xdc\xbb\x49\x65\x6c\x13\xea\xc3\xe9\x7e\x64\x6e\x1b"
+ "\x70\xe3\x69\xa6\x76\x90\xd3\x82\xf7\x50\xf0\x3e\x6f\xd8\x76\x0e"
+ "\x3e\x7b\xa8\x58\xdc\x7d\x0c\x38\x64\x9b\xc7\x2f\x36\xb9\x11\xb3"
+ "\x6d\xa2\xcf\xd7\x1d\x17\x59\x94\xfd\x19\x66\x46\x0e\x47\x8e\x34"
+ "\x45\xd2\x59\xd7\x39\xf8\x7d\xaf\x5b\x9e\x7d\x7a\x73\xbc\xb3\x66"
+ "\x2f\xe7\xbb\x67\x2f\x97\xe3\xe2\xcd\xd6\xcf\xa2\x1f\xfd\x36\x7b"
+ "\x94\xec\xb3\xc3\xe4\x15\x9f\xc5\xed\x84\x2d\xd3\x39\xee\xd0\x2f"
+ "\xef\x4f\x45\x3c\xd8\x46\xe7\xb0\xa8\xcb\xf6\x99\x58\x38\xf8\x32"
+ "\x1f\xdb\x6e\x65\xfb\x40\x2b\x3f\x86\xf3\x61\x9b\xd7\xaa\x9f\xa7"
+ "\x41\x86\x48\xc8\xd2\x2a\xe5\x38\x77\xa3\x90\xa3\x9c\xc7\x96\xcd"
+ "\x01\x7f\x2f\x12\x3f\xde\x74\x5d\x06\xf0\xdd\xea\x34\x9d\x6b\x00"
+ "\x9f\x91\xc4\xd7\x54\x67\x7d\x74\xde\x05\x3e\x0f\x8c\x3f\x03\xbd"
+ "\xdd\x26\xef\xc4\x2b\xad\x92\xf3\x0f\xf2\xb4\x39\xf0\xbe\x77\x90"
+ "\x85\xef\xa1\xbb\xcb\x4b\xe6\xf3\xb7\x7d\x63\xac\x25\xab\x95\x45"
+ "\x6c\xe1\x5e\xfe\x53\xb7\x5b\xc9\x74\x92\x7c\xc3\xeb\x4f\xb5\x9a"
+ "\x49\x26\xac\x15\xe1\x8e\xc1\xab\x9e\x2d\x9a\xf7\x45\x73\x1f\x7f"
+ "\xc9\x18\x73\x9d\x5f\x4a\x3a\xa1\x78\x6b\xa8\x84\xee\xc0\x3e\x6f"
+ "\x01\xed\x42\x15\x1b\xfb\xf8\x68\xba\x21\x96\x3a\x4f\x76\xe6\xbb"
+ "\x0a\xee\x50\x1d\x37\xdd\x93\x4e\x7d\xe4\xf8\x9f\x3f\x80\x3e\x5e"
+ "\x03\xfe\xe2\x60\xfc\x84\x13\xef\x5e\x9d\x8e\xdc\x87\x9f\xa7\x98"
+ "\xc0\x0b\x5b\xf6\x5e\x85\x5e\xec\x8b\xe5\xfc\x54\x0b\xe0\xa5\x97"
+ "\x98\x19\x6d\xe1\xab\x04\x7e\x27\xf4\xbe\x82\xf0\xef\x8c\x66\x6c"
+ "\x17\xda\x0c\xd9\xbc\x85\x3e\x71\x67\xf9\x79\xd8\x49\xfb\xa6\xe0"
+ "\xb3\x6c\x65\xcf\xcb\x82\xec\x39\xf5\x45\x8a\x09\xcb\x80\x1f\x36"
+ "\x54\x7a\x01\xeb\x30\xca\x89\x65\x2c\x9e\xe8\xe0\xfd\x24\x9d\x87"
+ "\x0c\xdb\x06\x57\xe9\xf4\x38\xec\x7f\xef\xb8\x3c\x83\x51\xb6\xb5"
+ "\x88\xce\xaf\x8b\x0a\x39\x3f\x06\xff\x4e\x3c\x92\x8d\xa1\xcf\x2e"
+ "\xdd\xa6\x60\xeb\xa7\x84\x5d\x45\xb1\x78\x6e\x1b\x0c\x75\xcc\x41"
+ "\x3b\xd8\x55\x15\xec\x89\xec\x0a\x6d\x0f\xe9\x36\x05\x5b\x3b\x49"
+ "\xed\xc0\x43\xd8\xa1\xad\xa9\x66\xf2\x91\x2e\xd3\x50\x1c\xd9\x18"
+ "\xff\xde\x57\x5b\xf9\xcd\xdf\x68\x95\xe3\x34\x14\xd7\x32\x22\xc7"
+ "\xc0\xaf\xf7\xc1\x11\x83\xde\x4f\xc2\x8e\xc3\x48\xcf\xf2\xac\x7a"
+ "\x28\x0e\xbc\x9d\x14\xb1\xf8\x0e\x8c\x81\x58\xab\x06\x5d\xd4\x5f"
+ "\xe9\xb0\xd9\xaf\xc3\xa1\xd4\xa9\x74\x18\xa4\x3b\xb3\xbc\x17\x7d"
+ "\x68\x25\xcd\x15\xf4\x29\xd0\xef\x3a\x9f\x6a\x2c\x41\xc3\x6c\x2e"
+ "\x63\xa1\x44\xa3\x31\x4a\xb4\xaf\xd1\x69\x94\x42\xd7\xde\xa2\xac"
+ "\x6b\xda\x73\x63\x35\x63\x74\x26\x4e\xfd\x63\xa3\x48\xbf\x43\x2e"
+ "\x7f\x7f\xee\x0b\xee\x1f\xf7\x44\x00\xaf\x22\x83\xd7\x91\x7d\x73"
+ "\x60\x47\x82\x5f\x5f\xec\xb5\xf8\x8d\xb5\xc8\x75\xb2\x61\x21\xd9"
+ "\xb7\xef\xf1\x96\x0a\xc6\x08\xa6\xca\x2b\x87\xb0\xf6\x04\x9f\xef"
+ "\x5f\xfd\xf3\x06\xdf\xfe\xc0\xcf\x1b\x7c\xbb\xaf\xf6\x79\x43\x10"
+ "\xdd\xf7\x88\xee\xb8\x63\xb5\x66\xa0\xdd\x38\x3e\x05\x6d\xbd\x7f"
+ "\x62\xb5\x71\x3f\x73\xe1\x0e\xe2\xe1\x04\xd6\x29\x7e\xcb\x6a\x8d"
+ "\x03\x4f\xa3\x58\xc3\x2f\xc4\xcb\xf8\x85\xe2\xa2\x0b\xa1\xd4\x26"
+ "\x58\x8e\x89\x14\x1a\x45\x67\xea\xec\x92\x28\xcc\x78\x90\x51\x84"
+ "\xc4\xee\xf6\xea\xd5\xa6\x80\xc6\x8c\x4f\x51\x08\x67\xec\x1e\xd1"
+ "\x9e\x23\x49\x90\x2a\x4b\x2c\xe6\x89\xf6\x13\xf5\x1f\x21\xcd\x94"
+ "\xfc\x0a\x7c\x23\x4c\x93\x6f\x4b\x22\x0d\x2d\x56\x5c\xa3\x37\x67"
+ "\x7a\x97\xa9\xd2\xb7\x90\x8b\x57\xcf\x00\x3e\xab\x68\xcc\xf9\x98"
+ "\xc2\xaf\x97\xb9\xb1\x4c\x90\xc0\x32\x52\x48\xba\x81\xc0\xfc\x90"
+ "\x4c\xf1\xab\x52\x5f\xcc\x9c\x00\x99\xaa\x8d\xbc\x42\xdd\xc5\x33"
+ "\xc4\x4b\x04\xfd\x18\x01\xbe\x78\xd4\x2f\x59\x35\xd1\xe0\x46\xdf"
+ "\x73\x86\xe6\x6f\x49\xf6\x97\x56\x5f\x43\xc6\x0f\x9a\x6e\x33\xbc"
+ "\xcf\x97\x8f\xa5\x6b\x3f\x46\xfc\xd7\x4e\x96\x93\x33\xf5\x57\xbf"
+ "\x79\x2c\x75\x4d\xd5\xd4\xaf\xff\x65\xfa\x18\x73\xa3\x85\xfa\xeb"
+ "\xbf\xd4\x10\x58\xbe\xd7\x1e\x58\xbe\xcf\xf9\x31\x70\xce\x04\x91"
+ "\x22\x27\xf6\x62\xa9\xb5\x13\xc0\x88\xa0\x29\x13\x61\x0f\x9a\x42"
+ "\xfe\xa4\xb8\x09\x61\xec\xfe\x14\x03\xd8\x3c\x75\xeb\x4f\x26\xcd"
+ "\x7d\x4e\x4d\x88\xf9\xde\xc8\x49\x95\xf7\x06\xc1\xa8\x7c\x83\x45"
+ "\xc1\x92\x8f\x4e\x6a\x2f\x60\x16\x43\x59\x4b\xc5\x8f\x6a\xd8\xbf"
+ "\x77\x72\xdb\xe9\x34\x9d\xae\x23\x69\x34\x3f\xa6\xd3\x27\x94\xb8"
+ "\x5c\xc5\xe1\x89\xc4\x83\xfe\xf1\x09\x47\xc9\x55\x05\x57\x00\xae"
+ "\x5e\x3e\x96\x75\x7c\x3a\x4d\xa7\xe9\x34\x9d\xa6\xd3\x74\x9a\x4e"
+ "\xff\x0f\x92\x66\xdc\x58\xd3\xef\xb0\x7e\x46\x3d\x8d\xfb\x1f\x4d"
+ "\x65\x23\xcc\xf4\x51\xfa\x71\x95\x58\x71\x6a\x83\xa5\x7a\xad\x33"
+ "\xd2\xbe\xea\xa4\xf5\xd0\x26\x6f\xe8\xf3\x69\x4d\xf1\x07\xb3\xdc"
+ "\x31\x15\x6b\x5a\x97\xd4\x17\x8e\x98\x77\xad\x68\x8c\xad\xc9\x74"
+ "\x45\x95\xad\x3e\x95\x52\x57\xe0\x0b\xdf\xbd\xb2\x79\x51\x6d\x8e"
+ "\x67\x5e\x65\x7a\xdb\xf2\x23\xdb\xc7\x4c\x25\xf7\xff\x6a\xe1\xf7"
+ "\xff\xae\x63\xce\x8b\x7f\xf6\x9b\xc5\xff\x96\x37\x18\x66\xfb\xd3"
+ "\x37\xff\xf8\x47\x4f\xf5\xce\xfd\xe7\xbf\xfe\xdf\x65\xff\xb1\xf5"
+ "\xf2\x0d\x7f\xff\xe0\xaf\xbf\xf0\x83\xf5\x5d\xd1\xe5\x7f\xf9\xdf"
+ "\x77\xff\xf4\x99\x8b\x9f\xdb\xfb\xb5\x13\x89\x3f\xc9\x1d\xb8\xad"
+ "\xea\x6f\x4e\x7f\xf9\x97\xcf\x8e\x6b\xcf\xdd\x77\x74\xc1\xcb\x19"
+ "\x67\x66\xbf\xf0\xd8\x3b\xc9\xaf\x7d\xeb\xfc\xcc\xef\x3e\x7c\xfc"
+ "\x8e\x1f\x66\xf7\x7c\xfe\x9f\xfe\xea\xbd\xa5\x3f\xdb\x72\x69\xc6"
+ "\xb7\x1f\x78\x23\xee\xc0\xba\xce\x9b\xfe\xf1\x2f\xde\xbd\xeb\xf0"
+ "\xd3\x17\x66\xed\x79\xe4\xed\x84\x7f\xdd\xd0\x7f\xeb\xfe\xc7\xdb"
+ "\xbf\xf4\x8b\x1d\x57\x42\x76\x7e\xe5\xd8\xed\xaf\x3c\x71\xf6\xc6"
+ "\x7d\x7f\xfe\xdb\x3b\x5f\xcf\x1f\xfa\xec\x3f\x7c\xf5\xad\x3f\xf9"
+ "\xf1\x37\xfb\x6e\x79\xe9\x1b\xbf\xfb\xe2\xcf\xb7\x8d\x7e\xe6\x3b"
+ "\x0f\xfd\xd7\x1f\xfd\xcb\x93\xdd\x37\x7f\xef\xeb\xff\x73\xcf\xbf"
+ "\x6f\x1e\x8e\x28\x7d\xb4\x25\xe9\xd5\x8d\xe7\xe6\x3b\xfe\xf6\xf7"
+ "\xf7\xfe\x67\x11\xff\x28\xfa\x63\x21\x51\xbf\xfd\x34\xc7\xcd\x1f"
+ "\x3c\x12\xb8\x6a\xed\x87\xc6\x63\xd2\xd4\xf8\x4b\x40\xf1\x5d\x4c"
+ "\x0b\x65\x37\x98\x3f\xc4\x8e\xe1\xc3\xca\x7d\x95\x64\x31\xf6\xbf"
+ "\x9e\x44\xe7\x47\xc9\xc8\x77\x22\xdf\x22\x20\xfe\x53\x80\x85\xd7"
+ "\x89\xe3\x93\x4f\x1a\x64\x0f\x01\x67\x33\xd8\x0d\xd0\x56\x28\x9b"
+ "\xc9\xc2\xd8\x67\x59\x38\x9b\xc5\x3e\xc7\x22\x58\x24\x9b\xcd\xe6"
+ "\xb0\x1b\x59\x14\xbb\x89\x45\xb3\x9b\x59\x0c\xfb\x3c\x9b\x0b\x69"
+ "\xe6\xb1\x5b\xd9\x6d\x6c\x3e\x94\xb2\x60\x6a\x59\x8a\x59\x6a\x0c"
+ "\x7e\xe0\xff\x2a\x96\x2a\xca\x6b\xa7\xe1\x9f\x2a\xbc\x41\xc1\x4f"
+ "\x2a\xb8\x73\x1a\xfe\xa9\xc2\x2d\x7f\xe0\xe7\x82\x3f\xe8\x53\x43"
+ "\xe8\x20\xa3\x87\x80\x18\x62\x22\x05\x43\x35\x95\x26\xca\xec\x7d"
+ "\xfa\x4f\xc2\x17\xd8\x3f\x38\xa5\x22\xab\x03\xd9\x22\xc6\xe4\xe7"
+ "\x0d\xdc\x98\xc6\xca\xb5\x5f\x99\x67\x17\xd3\x47\x27\xa1\x2c\x4a"
+ "\xfc\x7c\xff\xd4\x50\x80\x5c\x8c\xbc\x1b\xb9\x14\xf9\x25\xe4\x03"
+ "\x3a\x6e\xa6\xcd\x5f\xc1\x34\xcb\x76\x3c\x9d\x4c\x5b\x10\x83\x5c"
+ "\xcb\xb4\xd8\x45\x4c\x5b\xe8\x61\x5a\x5c\x8e\x9f\xf9\xc4\xe7\x27"
+ "\xb8\xd4\x16\x29\xb8\x05\xef\xc9\xc6\xb3\xda\x0f\xba\x9e\x35\x3c"
+ "\xb0\x3a\xcd\x92\x9c\x98\x92\x78\xd7\x9d\x19\x96\x84\x55\x09\x96"
+ "\xc5\xd6\xe4\xe4\x24\xeb\xdd\x49\xc9\xf7\x58\x16\x2f\x5e\x96\x6c"
+ "\x5d\x66\xb5\x5a\x36\x6c\xc9\xcb\x4e\xb6\x3e\xb9\xce\xb2\x3e\x3b"
+ "\x6f\xc3\xe6\x8c\xbc\x75\xd7\x21\xf5\x07\x4e\x10\x85\xdd\x7a\x45"
+ "\xb2\x69\x1c\x21\x8d\xdd\xcb\x4c\x57\x0a\x59\xc8\xec\x54\x36\x69"
+ "\x48\x35\xbb\x12\x29\x5e\xe5\xa0\xea\x1f\xb6\x31\xed\x07\x8d\x4c"
+ "\x7b\x79\x8c\x69\x2f\xd5\x33\x6d\xdf\x08\xd3\x8e\xe7\x30\xed\xd7"
+ "\xcb\x99\x76\x34\x9d\x69\x3f\x47\x9b\xd7\xe3\x27\xc3\x7e\xd3\x2c"
+ "\x61\xe7\xd0\xb7\x17\xd9\xb5\x92\x69\x6d\x4b\x24\x6c\x14\x63\x73"
+ "\x31\xe6\x93\x50\xc1\x47\x48\x1f\x74\xdc\xb5\xff\x03\x03\x93\xab"
+ "\x6c"
;
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
index f6164d0..23af286 100644
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -2834,7 +2834,7 @@ mxge_media_init(mxge_softc_t *sc)
return;
}
}
- if (*ptr == 'C') {
+ if (*ptr == 'C' || *(ptr +1) == 'C') {
/* -C is CX4 */
sc->connector = MXGE_CX4;
mxge_media_set(sc, IFM_10G_CX4);
diff --git a/sys/dev/mxge/rss_eth_z8e.h b/sys/dev/mxge/rss_eth_z8e.h
index 935b14c..e0dfade 100644
--- a/sys/dev/mxge/rss_eth_z8e.h
+++ b/sys/dev/mxge/rss_eth_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,9669 +28,9874 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int rss_eth_z8e_uncompressed_length = 553468 ;
-static unsigned int rss_eth_z8e_length = 154580 ;
-static unsigned char rss_eth_z8e[154580 + 1] =
- "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x19\x24\x60\x92"
- "\x99\xc4\x48\x47\x4c\x74\x10\xd0\x68\xf9\x11\x15\x5b\xb4\xa0\x51"
- "\xc0\x62\xe5\x47\xaa\x68\x03\x22\x09\x1a\x30\x68\xc4\x11\x02\x04"
- "\x08\x99\x61\xc0\x16\x2b\x90\x49\x44\x0c\x12\x48\xb4\xd8\x4b\x6f"
- "\x51\xd3\x8a\xb7\xd8\xa2\x4e\x4b\xfa\x7d\xe9\xbd\x24\x93\xf6\xa5"
- "\xef\x9b\xdb\x97\xde\x8e\x7c\x23\x8d\xdc\x00\x23\x19\xc8\x98\xcc"
- "\x9c\xfd\xfd\xac\xbd\xcf\x49\x66\x86\x09\xca\xbd\xf7\x79\xde\x7f"
- "\x9a\xe7\x99\x9c\x73\xf6\xd9\x7b\xed\xb5\xd7\x5e\x6b\xed\xb5\xf7"
- "\x5e\x7b\x1d\xa2\x2b\xff\xf3\x53\x0a\x5f\x92\xc8\x3c\xba\xf3\xb7"
- "\xff\x85\xf2\xff\xf8\xfb\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f"
- "\xfc\xfd\xe3\xef\xff\xdf\xbf\x40\x12\x4d\x3a\x6f\x32\xd3\xef\x3c"
- "\x44\x3d\xee\x94\x6c\x3f\xf5\x3a\x5e\x7f\x55\x84\xf1\x2a\x09\xe3"
- "\x7c\x36\x5f\xf9\x57\x8b\x34\x93\x87\x52\x6e\xb2\x52\xea\xb4\x3d"
- "\x44\x3b\x46\x88\xae\x57\x77\x8a\xc0\xa6\x9d\xa2\x6b\xfa\xdb\x44"
- "\xcd\x63\x88\x5e\x1d\x21\x82\x80\xb1\xd0\x4f\x8b\xe6\x31\x8c\x4d"
- "\x78\xe6\xf7\x9b\x47\x88\x00\xd2\xcb\x91\x7e\x8c\xd3\x37\x8e\x00"
- "\xac\x2c\x22\xf7\x4e\x11\x8a\x82\x9b\xc2\xe5\x19\xe6\xf4\x51\x12"
- "\x97\x7d\x71\x70\x18\xc6\x21\x3f\x15\x4d\xbf\x0c\x8c\x54\x03\xaf"
- "\xa0\x89\x92\x18\x5e\xb7\x9b\x6c\x41\xb7\xf7\x5a\x94\x0d\xa2\x3d"
- "\xb9\x5c\xb6\x1a\x79\x84\x9b\x92\x9b\x2b\xc2\x64\xbf\x89\x92\x4e"
- "\xd1\xf0\x37\x71\x35\xe1\xfa\x1a\xb7\x75\x93\x2a\x37\x86\x61\xa0"
- "\x6c\x52\x8f\x7b\x58\x5e\x7f\x59\xc0\xb6\x57\x91\x19\x79\x97\x05"
- "\x4d\x5e\x93\xca\x6b\x1d\xa6\xe7\x35\x21\xef\x42\x23\xaf\x7a\x67"
- "\x7a\x48\x7f\x77\x35\xde\x55\xc4\xbe\x33\xd7\xea\xef\x52\xf1\x6e"
- "\x47\x1c\x7e\x66\x5f\x6f\x98\x4e\xd1\xb0\x03\xc0\xc5\x7e\x04\x3d"
- "\xc2\x65\xf4\xfc\x19\xc8\xdf\x1c\x0b\x8b\x48\x7f\x97\x89\x77\xfe"
- "\xd8\x77\x1f\xe7\xe9\xef\xbe\x81\x77\xe1\xd8\x77\x49\x46\x39\x5b"
- "\x8f\x7b\xb8\x2d\x41\x3b\xb9\xfe\x24\x55\x37\xb7\x61\xf8\x14\xe4"
- "\x71\x71\x9e\x79\x76\x17\x71\x5f\xf1\xbb\x23\x8d\xfd\xf5\x73\x9e"
- "\x62\x03\x8e\x1f\xe5\xa3\x68\x0a\x5a\x0e\xaf\x34\xca\x4f\xb7\x33"
- "\x0c\x92\x34\x64\x38\x7e\x1a\x36\x93\xe1\xf0\x33\xee\xb3\xb9\xdd"
- "\xfa\xbd\x9d\xdb\x17\xdd\xe7\x44\x66\x80\x1d\x02\x43\xf4\x2a\xfc"
- "\x86\xa6\x18\x3c\xb0\xd2\x26\x34\xe7\x75\x64\x16\xb5\xa9\x75\x9a"
- "\x5b\x90\xaf\x22\x44\xf6\x91\xe4\x3c\x49\x57\xdb\x80\x1f\x6d\x5f"
- "\x47\x29\x4e\x87\x08\xf9\x2a\xba\xa8\x35\xd0\x45\xce\x80\xe8\xf4"
- "\x85\x2f\x50\xd5\x05\x4a\xf1\x85\xcf\x50\xd5\x8b\x64\x6b\xae\xfc"
- "\x8c\x12\xf1\x97\x66\x12\xe4\xcc\xe6\xb2\x1d\xd4\x5a\xdf\x41\xce"
- "\xfa\xd8\xb2\xce\x1c\xb2\xb5\xe0\x19\x7d\x67\x61\x3c\x9a\xed\x61"
- "\x0a\x67\xa6\xd6\x55\xee\x22\xb3\x73\x14\x99\x5a\x4a\xbc\x06\x2e"
- "\x7e\xc6\x65\xf3\x69\x4a\xf9\xc9\x52\xf0\xd0\x69\xc6\x37\xab\xee"
- "\xbd\x75\x21\xd3\x11\xdb\x2c\x3a\x62\x3b\x41\xcd\xb6\xa9\xd4\x5c"
- "\x31\x9d\xb6\x9f\xa6\xd4\x23\xa1\x29\xd4\x6c\x7e\x10\x32\x36\x9d"
- "\x7c\x5d\xb8\xb7\x47\x90\x27\x48\xf6\xd5\x04\xfe\xb8\xba\x6d\xc7"
- "\xb3\x94\xe2\x57\x30\x41\xdf\xab\x4f\xfc\xb6\x9c\x88\xe9\xcb\xcf"
- "\x89\xda\xb1\xf2\x3a\xb2\x01\xbf\x4e\xe0\x72\xf7\x49\x4a\xbd\x76"
- "\x8c\x8d\xf2\x80\xf3\x50\x5f\x5d\x98\xcc\x95\x34\x6c\x10\xd9\xca"
- "\xd2\xdc\x52\xc6\xbb\xf6\xee\x14\x9d\xcc\xa3\xdd\xeb\x0b\x21\xa7"
- "\xa9\xb3\x50\x77\x17\xd7\xb7\x1d\xb2\xee\x7c\x93\xcc\xdd\x6b\x0a"
- "\x93\x1a\x76\x8a\x0e\xbc\x2b\x35\xde\x81\x9f\x3a\xf0\xbe\x73\x62"
- "\x16\x59\x7d\xe1\x7c\xfa\xa4\xb7\xd3\xcc\x30\xd2\x83\x94\xc4\xf0"
- "\x2c\x15\x94\x8c\xf6\x0c\x01\x3e\x77\x37\x20\x7d\x34\xf2\xa1\xfc"
- "\x7e\x3f\xd5\xda\xb8\xbc\xf8\xc6\x13\x41\xed\x1b\x4f\x5c\xd0\x5e"
- "\x7f\xa2\x5b\xbc\xfe\xc4\xf9\xc8\xeb\x4f\x7c\xe1\x5c\x4b\x29\x91"
- "\x6f\x3c\x11\x68\x75\xc8\x3e\xb0\xb6\x3a\xd0\x07\x11\x4a\xd9\x70"
- "\x86\xac\x8b\x5e\x44\xdf\x87\xff\x4a\x1b\x96\x91\x4d\xcb\xb8\xa6"
- "\xc0\x17\xfe\x33\x2d\xaa\x24\x81\xfb\xe2\x44\xed\xeb\xce\xcc\x6a"
- "\x57\x32\x94\x82\x36\xa5\xd9\xfd\xe6\xab\x3d\x5c\x6f\x20\x23\xbb"
- "\x1d\xbf\x13\xf8\xf9\xf1\xeb\x10\x99\x59\x1d\xa0\x95\x33\x7d\x63"
- "\x12\xed\xed\x25\x9a\xa8\x51\xd2\x69\x4a\x9b\x02\xfc\xad\x83\xd0"
- "\x2d\x5b\xab\x2d\x74\xdd\xe2\xa2\xaa\x9e\x9e\x52\x62\xdd\xc4\x7a"
- "\x89\xf5\x14\xea\xd9\x82\x7a\xda\xa4\x2c\xee\x14\x41\x91\x59\xe8"
- "\x42\x7a\x67\x70\x7d\x69\x52\x60\x7d\xa9\xa9\x3b\xb3\x70\x13\xf2"
- "\x1c\xf0\x9b\x53\x53\x74\x1a\x76\x32\x2c\xc8\x44\x20\x2d\x4c\xc9"
- "\x80\xe9\xf8\xd5\xc5\x76\xf3\x9e\x9d\xe2\x04\xf2\x1d\xef\x87\x05"
- "\xd8\x80\x03\xfa\xa7\x75\x1a\x69\xa0\x75\xc7\x36\xe4\xe3\xf2\xbe"
- "\x50\x3e\xeb\x6f\xbf\xaf\xac\x93\x2c\x61\x1a\x2e\xfa\x54\x7d\xc8"
- "\xd3\xc9\x7a\x36\x2d\x44\x57\xf5\xb8\xa9\x80\x61\x73\x39\x5f\x57"
- "\x27\xa1\xdc\x26\xe1\x2c\x85\x7e\xa3\x39\x3d\xa2\x34\x09\x3a\xbd"
- "\xe3\x08\xca\xab\xba\xd3\x0b\x0c\x1c\xb9\x0e\xee\x6b\x89\x27\xf8"
- "\xe1\x48\x59\x88\xd2\xea\x28\x19\xe5\x1e\x65\x78\x0c\x0b\x7c\xe0"
- "\x47\x5b\x37\x1d\x29\x0b\x90\x26\x62\x60\xfa\x75\x78\x8d\x31\xf0"
- "\x90\x2e\x00\x8f\xf9\xaf\x19\x65\xd2\x1a\x25\xbc\x47\x7e\xa5\x31"
- "\xbc\x10\x99\xed\x12\xdf\xc7\x19\x46\x0f\xeb\x18\xc0\xf4\xae\x7e"
- "\x80\xba\xc8\x92\x12\x70\x96\x26\xb7\x56\x12\x71\xf9\xf7\xaa\x3a"
- "\x87\x88\xee\xc2\x64\xe6\x39\x7e\xef\x0b\x9f\x47\x9e\xf4\xcf\x45"
- "\x77\x69\x72\x5a\x17\x99\x19\x67\x94\xaf\x60\x3c\xa3\xfb\xf2\x91"
- "\x19\x8f\x4f\xa5\xc7\xa7\x3f\x34\x7d\x2a\xcd\xbe\x7f\xda\x54\xca"
- "\xbb\x7b\x7c\xde\x9d\xdf\x9e\x7c\x27\x15\xfc\xe0\x91\xa9\x54\x30"
- "\x67\x2a\x3d\x8a\x5f\xc1\xa3\x33\x1e\x99\x3e\xe3\xd1\xa9\x54\xf8"
- "\xe0\x43\x78\x9a\x36\xf5\xf6\xbc\xef\x8e\x2f\x98\xf6\xd0\x0c\xfa"
- "\xfe\xbc\x3b\xf2\xee\xb8\x83\xee\x9f\x31\xeb\xf6\xbc\x3c\xfd\x7a"
- "\x7b\x1e\x67\x59\x30\x79\xc6\xa3\xe3\x0b\x56\xbc\x50\xfe\xc2\xf8"
- "\x39\x0f\x4d\xe3\x14\x1e\x93\xa3\x78\x27\x37\x72\x51\x63\x1a\x07"
- "\xc5\xb9\x99\xa4\x41\x67\xec\x45\xdf\xe3\xd7\xe5\xad\x3a\x09\xd9"
- "\xb7\xfe\x79\x2f\xf7\x99\xd4\xad\x16\x1e\xaf\xcc\x3d\x6e\xcb\x09"
- "\xd0\x6e\x26\xd3\x0e\x63\x1a\xf2\x8c\x58\x8b\x77\xb7\xea\x63\xc7"
- "\x10\xbc\x0f\xc7\xbe\xcf\x84\x9e\xb5\x4c\x6c\xb5\x13\xf9\xf0\x03"
- "\xbd\x83\xd0\x81\xa0\x6b\x80\xba\x9d\x85\x43\xc0\xd7\x49\xa8\xa3"
- "\x03\x32\xd9\xd6\xe3\xb6\x4e\x8e\x92\xf5\x0e\xf4\x4b\x9b\x7d\x1d"
- "\x25\x9f\x25\x6b\x46\x6b\x79\x3e\x71\xff\xf8\xca\x75\x18\x17\xfa"
- "\x61\x0c\x97\x30\xd0\xe7\x80\x73\x5c\x87\xe3\x8a\xd2\x0b\x7e\x86"
- "\xb3\x1d\xef\x74\x58\x8f\xb5\x42\x3f\x40\x7f\xbf\xa5\x39\x73\x49"
- "\x64\xa6\x36\x6a\x7d\xb9\x72\x4c\x40\xb9\x43\x06\x3f\xa3\xfe\x60"
- "\x33\xea\x14\x3f\x99\x99\x84\xfe\x4f\xc2\x58\x85\xb6\x58\x9a\xc1"
- "\xd7\x90\xa3\xec\x4e\xd1\x57\x48\x2a\x2d\xc3\x1c\xa9\xc5\x73\x6d"
- "\xf6\xe7\xc2\x89\xb4\x75\x32\x6d\x08\x9e\x3b\xd1\xd7\xc9\xe0\x15"
- "\x8a\x9c\x43\xfa\x72\x4a\x46\xfa\xef\x41\xeb\x76\x99\xff\x9c\x2c"
- "\x3f\x14\x69\x6f\x03\xde\xe7\x5a\x66\xf6\x69\xf0\x0e\xa7\xc1\x4e"
- "\xc8\x78\x19\xe5\xff\x93\xf5\x9d\xd2\xc1\x23\x76\xf1\x18\x87\x76"
- "\x04\x14\x7c\xfd\x19\xf2\xaa\x70\x18\xb1\xeb\x08\xe8\x72\x04\xa3"
- "\x56\x73\x25\xdb\x36\x19\x68\x7f\x5a\xa1\x1a\x1f\x47\xd4\x71\x5e"
- "\x4d\x14\x92\xb0\xee\xaa\x00\xdc\x2e\xef\xba\x2e\x3a\xe5\x20\x93"
- "\x9f\x32\xa6\x68\xce\x52\x8a\x6a\x4b\x2e\xe3\x01\xbc\xcd\x3d\x7d"
- "\xa5\x18\x2f\x33\xc6\xc9\xb2\xc0\x4f\xc7\x8d\xf3\xd8\x18\x7f\xd6"
- "\x11\xe8\xd7\x49\xe8\xf3\x61\xa8\x2f\x10\xd7\xe7\xa9\x4c\x0f\xe0"
- "\xdb\xae\xe1\x0a\x38\x59\x62\x4d\x29\xf0\x22\x13\xd3\xc3\x3f\x00"
- "\x23\xa8\x78\x2a\x33\x2f\x8e\xa7\x9e\x04\xec\xa9\x51\xef\x0b\xe2"
- "\xde\xdf\x8f\xf7\x0f\xe8\xef\x21\xab\x99\x8e\xb8\xfa\xb7\xe2\xfd"
- "\x83\xdc\x87\x90\xc5\x64\x3f\x59\xf7\xef\x65\x5b\x72\x20\x7f\x63"
- "\x5c\xfe\xc3\xc8\xff\x3d\xe0\x1b\xe4\x71\x82\xf3\x37\xe8\x7c\x8f"
- "\xfc\x29\xc8\xdf\x16\x57\xff\x28\xe4\x7f\x34\x0a\xbf\xb8\xf6\x5f"
- "\x73\x08\xef\x0b\x99\x4f\x71\x2d\x41\x9e\xa1\x2c\xff\xac\x7b\x8e"
- "\x94\x71\xff\x5c\x63\x8f\xcb\x9f\x8f\x7c\xcf\x31\x9d\x25\x8d\xba"
- "\x99\x46\xd6\xfd\xba\x5d\x73\x42\xe1\x70\xcd\xbc\xb8\x32\xe5\x28"
- "\xb3\x92\xe9\x2b\xf9\xac\x27\x61\x99\x2d\x71\x65\xf6\x4b\x3e\x55"
- "\xf5\xe8\x7d\xac\xca\xe8\x7a\x2d\x1a\x06\xb7\x0d\xb6\xd6\x35\xc7"
- "\x62\x61\x5c\xbb\x1f\xf5\xae\xdf\xa6\x74\xc6\xd5\xe0\x89\x3b\x90"
- "\xb6\x0b\x30\xcf\x30\x1f\x41\xce\x82\xbe\x40\x08\x7a\x77\x66\xaa"
- "\xe2\xdd\xac\xf1\x96\x4a\xe2\xfb\xf1\x7c\xcf\xb0\x45\xdf\x2c\x5d"
- "\x9e\xb2\xc6\xe3\xca\xe9\x59\x9c\xce\x72\x2c\xfa\x1e\xd6\x14\xcc"
- "\xac\xef\x43\xde\x4d\x78\x8e\xe8\x75\xd4\xe0\x39\x09\xf8\x9f\x86"
- "\x4e\x07\xcf\xce\x64\x7e\x9c\x84\xf4\x97\xf5\xf7\x1b\x39\x3f\xee"
- "\x6f\xd7\xef\x93\xc0\x63\xa7\x75\x39\x83\x4c\x5d\xbb\x56\xd6\x0d"
- "\xb9\x32\xca\x6b\x8a\xef\xa7\xe1\xdd\x12\x5c\x1f\xc2\xf5\xfb\xb8"
- "\x7e\x1f\xd7\xf1\xce\x0b\x64\x73\x46\xa4\x7c\xf1\xf3\x75\xb8\x3e"
- "\x82\xeb\x10\x5c\x1f\x05\x6e\x5f\x80\xee\x9d\x01\xf0\x74\x1c\xcf"
- "\x74\xa1\x0f\x59\xee\x87\xaa\x3e\xcc\xf2\x73\x9d\x11\x43\x17\x9c"
- "\x1b\x48\xd3\xf5\x83\x2e\x0f\x7a\x5a\xdf\x4c\xa6\x4b\x01\xe0\x1f"
- "\xe6\xfa\x85\x82\x35\x44\xf5\x93\xca\xa3\xa9\x72\x66\xd5\xdf\x7a"
- "\x9a\xca\x97\x14\x5d\x27\xae\x9e\xaa\xa0\x10\xb8\x56\x32\x5d\xfd"
- "\x74\x2d\x8f\x6f\x66\x3c\x17\x30\x9d\x64\x7e\x09\xf7\x9a\xae\xa8"
- "\xfe\x86\x6d\x7f\xed\xe1\xb8\xfe\x66\x39\xdf\x26\xfb\x1b\xb4\x33"
- "\x70\x66\xfc\xc1\xd3\x3c\x4e\x5e\x65\xf0\x0d\xf8\xbb\x6b\x40\xc6"
- "\x46\x98\x63\xe1\x28\xbe\x62\xfe\x48\x77\xe8\x32\x09\x7a\x41\x87"
- "\x05\x93\x2b\x99\x57\x47\x4c\xf2\xd3\xcf\x65\x7e\xc0\x3e\xcb\xef"
- "\x83\xd0\x4d\x9c\x3f\xd9\xc1\x32\x36\x62\x9e\xf1\x5e\xbe\xcb\x98"
- "\x2f\xc7\x81\xe4\x32\xf9\xce\xe1\x07\x8b\x19\xef\x64\x3d\xfc\xae"
- "\x5c\xbe\xdb\x3a\x00\x37\xd5\xab\xc3\x4d\x4e\x64\x4b\x09\x4f\x6a"
- "\x13\x18\xd4\x74\x9b\x8b\x86\xf8\xc2\xc7\x69\x6e\x58\x44\xc6\xbb"
- "\x68\x98\x2f\x7c\x80\x6e\x25\xca\xf0\x85\x4f\xd0\x6d\x44\xa3\x7c"
- "\xe1\x1d\x18\xdb\xf7\xf1\xfb\x4f\x6e\xa1\xa4\x24\x5c\x9d\x37\xbb"
- "\x4c\x49\xbe\x70\x39\x8d\x71\x99\x71\x2d\xa3\x07\x87\x88\x1e\x5f"
- "\x78\x16\xf2\x95\xd0\xdc\x88\x38\x37\x7d\x88\xf8\x5b\x51\x84\xac"
- "\xb3\x5e\x12\x4e\x5f\x18\x76\x76\xf8\x18\xd2\x35\x31\x37\xf2\x25"
- "\x7e\x3d\x42\xf3\xa4\x7a\xe7\x46\xce\x89\x69\x2f\x7d\x82\xe7\xbf"
- "\x09\x61\x22\xe1\x0b\x4f\xa1\xd6\x60\x10\xf9\x9c\x42\xd4\xa4\x36"
- "\x2d\xba\x60\xa2\x3e\x8c\xd1\x5a\x4d\xaa\x17\x6d\x69\xeb\x43\x3b"
- "\x30\x7e\xf9\xfa\xd6\xe3\x5a\x9b\xda\x2a\x9f\x3d\xa9\x7e\x61\x4d"
- "\x6d\x9b\x80\x49\x0b\xb7\xc1\x17\xee\xa0\x22\x98\xdd\x73\xd7\x06"
- "\x04\xe3\x9f\xbe\x91\xe7\x2c\x53\x08\x7a\xd1\x32\x77\xad\x53\xe0"
- "\x5d\x8a\xc8\x48\x6d\xf3\x85\xbb\x08\x75\xc0\x6e\x4a\xfd\xab\x84"
- "\xe7\x49\xe3\xbc\x01\xce\x17\x0d\x87\x61\x70\xde\xb9\x11\xb2\x88"
- "\x9a\x34\xea\xcb\x48\x0d\xf4\x65\xa4\x59\xf1\xcb\x17\x99\x69\x8f"
- "\x08\x77\xd6\x6f\x05\xc6\x53\x94\x2f\xc6\xb3\x23\x84\x39\x82\xa4"
- "\x65\x84\x86\x22\x7f\x31\xf8\x65\x3a\xf8\x0e\xf8\xa6\x79\x24\xbe"
- "\xb5\x69\xd5\x21\xd9\x8e\xb4\xed\xaa\x1d\x69\xdb\x38\xbd\x1b\xb6"
- "\x04\xee\x9b\xba\xd5\xbb\xf7\x50\x6e\x9e\x2c\xe7\x49\x6b\x12\xd6"
- "\x34\x6f\x08\xf2\x04\xba\xba\x98\x8e\xa0\xab\x8b\x69\x09\xf8\x4d"
- "\xbe\x8a\xad\x24\x32\xd2\xbc\xc0\xa7\x0d\xe5\x4f\xf6\xc9\x31\x3e"
- "\x2d\x10\x52\xb0\xcf\x01\xce\x42\xf0\x6b\x32\x60\x04\x84\x27\x9d"
- "\xfa\xdc\x76\x9a\xbb\x56\x84\xe6\x86\x37\x86\x8b\xd6\x52\xf2\x38"
- "\x72\x01\xdf\x8f\x40\xa3\x12\xb4\xb3\x19\xd7\xe9\x78\x4f\xd7\xa0"
- "\xae\x4f\x00\x37\xc0\xf5\x89\x9a\x74\x86\x19\x01\xac\x12\xc6\xe9"
- "\x4b\x37\x59\x45\x66\xba\xf5\x4b\x89\x5f\x7a\x9e\xe6\x49\x2f\xd0"
- "\xac\xe9\xf9\x06\x0f\x31\xff\x28\xba\xed\xa0\x39\x41\x11\xf6\x85"
- "\xf7\x10\x78\xcc\xda\x1a\x3c\xc1\xef\x31\xaf\x38\x80\x7e\x66\x9e"
- "\x2a\xc7\x75\x1f\x31\xff\xb4\x3a\x5e\xe2\xbc\x9f\x30\x0f\xcd\x71"
- "\x04\x37\x8e\x27\x47\x12\x9e\x9d\x45\xe1\x14\x5a\xe4\x30\xbb\x22"
- "\x9e\x74\x7b\xab\x83\xfb\xe5\x38\xca\x70\xb9\x32\xb2\x24\xc1\xb6"
- "\x4e\x12\x61\x4b\x45\xc0\x9c\x56\xea\x14\xad\xc1\x59\xc8\xeb\x20"
- "\x6e\x0f\xf3\x11\xe7\x9f\xdd\x25\xfc\x11\x6b\x7a\x1b\xb7\x4d\xa4"
- "\xbb\xa8\xa5\xeb\x2e\xe2\xf9\x4d\x4b\xd7\x3e\xe6\x53\x4d\x58\xd3"
- "\x1b\xc1\xa3\x7d\xb3\xbb\x5c\x43\x16\x5d\xa0\x24\xa4\x45\x5a\x4a"
- "\x0f\xe0\x7d\x33\xf2\x1d\x93\x7c\x3b\xe7\x42\xd8\x12\xb6\xa6\x5b"
- "\xc3\x9e\xf4\xa6\x39\x17\xfa\x44\x4b\xe9\x0e\x7a\xb2\xcb\x05\x5a"
- "\x1d\xa0\xd9\x67\xc2\xc9\xad\x8e\x12\xe4\xe9\x41\xfa\x3e\xc9\xff"
- "\xb3\xcf\x74\x8b\x39\x2f\x8a\x73\x73\x2e\xfc\x4d\xcc\x2e\x15\x9f"
- "\x14\x55\x50\xfa\xd5\x1b\x85\xc6\x72\x71\xac\xe3\x00\x5d\x7d\xc2"
- "\x4f\x2c\x13\xb3\x16\x6b\x62\xf6\x99\x73\x62\xd1\x8b\x4c\x9b\x29"
- "\xd4\x52\x0a\xf9\xa9\xd8\xc1\xf4\xce\x6b\x29\x3d\x8c\xfa\xa7\x03"
- "\xae\x53\xf8\x2a\xf6\x20\xaf\xd7\xf2\xe4\x19\x2b\x1d\xeb\xd8\x41"
- "\xe1\x8c\x74\x6b\xa4\x26\xdd\xae\x65\xa4\xe7\x6b\x35\xe9\x05\x22"
- "\x23\xbd\x31\x5c\x93\xde\x14\xc9\x48\x07\x0f\x58\xec\xe8\xa7\x61"
- "\xdc\xe7\xbd\x98\xef\xe3\xf9\x86\x5e\xee\x7f\x8f\x25\x4f\x58\x2d"
- "\xac\x0b\x85\xe2\x7d\x4b\x1e\xcf\xd9\x45\x86\xa5\xa0\x2f\xc3\x92"
- "\x8f\x7c\x05\x4a\xbe\x2c\xc5\xcc\x97\x72\x2c\xaa\xb5\x14\x61\xec"
- "\x48\xc6\x7b\x07\x7e\x2e\xfc\x3c\x48\xf3\x03\x7e\x46\x8f\x82\xe9"
- "\x17\xf7\x7a\x60\xa3\x62\x8e\x9e\x61\x05\x3d\xef\x13\xa0\x21\xe4"
- "\xc4\xe2\xd7\x6a\x2c\x01\x91\x69\xb5\x87\x24\xef\x5b\x6f\x64\xd8"
- "\x7d\xeb\x73\x79\x2e\x6f\x16\x35\xd6\x3c\xa4\xbd\x15\x62\x5e\xb5"
- "\x5a\x1b\x35\x6b\x06\xe4\xc7\xda\xf4\xf0\x4b\x22\x10\xf1\x58\xdb"
- "\x34\x8f\xd5\x1b\xbe\x0a\xb6\x6f\xc5\x61\x62\xfd\x14\xfe\x58\x80"
- "\x06\xbf\x07\x3d\xf6\xc9\xfe\xf7\x55\x40\x06\xd6\x8e\x74\xb5\x74"
- "\x81\x17\x1c\xef\x48\xdd\xd4\x1a\x3c\x2e\x69\x0a\x3c\x1a\x99\xa7"
- "\xb8\x7f\x17\x39\xc8\x85\xba\x9a\xb4\x1a\xab\x37\x52\x03\xb8\x19"
- "\xa8\x27\xf3\x9a\x07\x42\x52\x5e\xaf\x01\xbf\x1e\x46\x99\xdf\x93"
- "\xe2\xf1\x6b\xf2\x07\xd3\x91\xac\xab\x58\x3f\xcd\x0d\x87\x98\x67"
- "\xfe\xce\x7a\x4d\xe9\x29\x2a\x32\xf4\x14\xeb\x28\x9e\x4f\xb0\x9e"
- "\xd2\x74\x3d\xa5\xe9\x7a\x4a\x3e\x5b\xa1\x6b\x3c\xa9\x6d\xac\x8f"
- "\xe6\x56\x28\x3d\x33\x37\x92\x27\xc0\x1b\xa9\x80\xd1\xa6\xfa\x02"
- "\x79\x6a\x53\xff\x2a\xf3\x4b\x3a\xa5\x91\x06\x7d\xa3\x41\xdf\x68"
- "\x4a\xdf\x14\xe8\xfa\xc6\x64\xe8\x9b\x08\xc6\x35\xc8\x94\x96\x48"
- "\xdf\x68\xba\xbe\x89\x08\xa5\x6f\x34\x5d\xdf\x70\x7a\x44\xd7\x37"
- "\x91\x04\xfa\x46\xf3\xa4\x71\x7b\x93\x75\x3d\xe3\x62\x3d\xc3\xed"
- "\xd5\x6a\xd2\xbc\x9a\xd2\x33\x7e\xcc\x25\x4c\xac\x67\x22\x28\xa3"
- "\x19\x7a\xa6\x47\xea\x03\x62\x5d\xd3\xf7\x43\x82\xfe\xb4\x13\xeb"
- "\x18\xa9\x4f\xc2\xa3\xc2\xac\x4f\x40\xbf\xfb\xe2\xf5\x89\xa8\x4d"
- "\xb7\xe2\xde\xaa\xf4\x54\x7a\xbe\x65\xa3\x08\x43\x9f\xd8\xe7\x56"
- "\x04\xd1\xd7\x7f\xc5\x9c\x1a\x7a\xbb\xa2\xdc\xe5\xab\x08\x13\xf4"
- "\x40\x81\x68\x75\x11\x74\x0e\xf8\x37\x02\x5d\x41\x04\xb9\x6c\x84"
- "\x7c\xb6\xa1\xee\xa6\x56\xc7\x9f\x09\xf2\x6e\x9d\xdd\xd5\xed\x5b"
- "\x14\xcc\xb5\xce\x3e\x23\x02\xa0\x8f\x7f\x91\xc3\x05\xfd\x92\x1b"
- "\x68\xe9\xfa\x88\x66\x75\x08\x6d\x56\xb1\xdf\x0e\x3c\x9a\x66\x2f"
- "\xf3\x5a\x16\xbd\x68\x85\x9c\x09\x2f\xf4\xe2\xff\x3d\xfb\x8c\xd5"
- "\xb2\xb0\x83\x6e\x98\xb5\x58\x68\x90\x27\xd0\x1d\x72\x06\x79\x84"
- "\x8c\xe5\x43\xe6\x0a\x20\x67\x8d\xe1\x38\x39\x83\xcc\xdc\x80\x7b"
- "\xbb\xa2\x9f\xa5\x00\x72\x96\xa7\xc9\xf1\xac\x43\xce\xe1\x20\x0f"
- "\x05\xbc\xc6\x05\x59\xcb\x83\x5c\x48\x59\xd3\x54\xb9\x62\x8d\xe9"
- "\x67\xd2\x65\x0d\x7d\x81\xf7\x0e\xfc\x5c\xf8\x25\x96\x35\x47\x94"
- "\xac\xbd\xa8\xcb\x5a\x86\x92\x35\xf4\x69\x72\x64\xbd\x92\x37\x86"
- "\xcf\xf3\xbc\x7e\x79\xcb\xb4\x36\x0a\xb6\x27\x25\xef\xb0\xcc\x59"
- "\x31\xae\x58\xdb\x20\x6f\x5e\xcd\x93\xc1\x7c\x1d\x60\xbd\x09\xde"
- "\xfc\x0f\x1e\xeb\xe6\x38\xc4\x7f\x14\x45\x46\xba\x50\x57\x1b\x74"
- "\xd9\xdf\xa0\x47\xff\x63\x51\x90\x1a\x01\xab\x51\xcb\xb0\x36\x41"
- "\x9e\xbc\x5a\x8d\x94\xa7\xfc\xc8\x7a\x86\x79\x4d\x7e\x3f\x0c\x39"
- "\x56\xc6\xca\xd3\x60\xeb\x8b\x3d\xee\x1b\xa7\xf8\xe9\x57\xe5\x6c"
- "\xaf\xe0\x7e\xa6\x9f\x0e\xcd\xd4\xef\x61\xff\xd4\xcb\xb5\x69\x96"
- "\x41\x47\x15\x5d\x7b\x9a\xec\x29\xe0\x77\xc2\x7d\x2a\xee\x53\xe7"
- "\xde\xfa\x09\xec\x88\xcd\xfb\x51\x6f\x0f\xcb\xa1\x70\x4f\xe2\x39"
- "\x57\x3e\xf8\x30\x45\xf4\xe4\xa6\x8a\xcc\x9c\xd5\xa2\xcf\xc6\x6b"
- "\x58\x16\x3c\xa7\xa3\xfd\x63\x70\xcd\xdc\x73\x91\xb2\xf0\xb3\xed"
- "\x71\x6b\x2e\xb6\x9d\x70\x9f\x27\xd6\xd8\x86\x6f\x5f\x4d\xe3\x2c"
- "\x41\x4a\x69\x70\x6b\x85\x96\x8d\x56\x5e\xcb\xc9\xe2\x7b\xe1\x6e"
- "\x2c\x6d\xb8\x48\x66\xb6\x2b\xb5\x0c\xd4\x57\x61\x11\x62\x65\x2e"
- "\x35\xac\x80\x7e\x70\x93\xad\xc1\x2d\x9a\x22\x3d\x4c\x83\xd4\x26"
- "\x03\x17\xc6\x0d\x78\xe6\x00\xcf\xec\xc7\xd6\xe6\xd3\xef\x2b\x28"
- "\xe1\x1a\x68\x8f\xdb\xde\xdf\xfe\x41\xde\x2f\x34\x68\x32\xc8\xfb"
- "\x4a\x83\x4e\x83\xac\x97\x99\x79\x8c\x8e\xac\x16\x81\xea\x67\x89"
- "\x69\x61\x73\x86\xc5\xff\x06\x1d\x5d\x55\x11\xca\x99\xbb\xf6\x46"
- "\xe1\xeb\x12\x5e\x5f\xc5\x19\x6a\xc0\xfb\xaa\x4a\xa1\x69\x19\x39"
- "\x85\xa2\x26\x67\x5e\xf7\x6a\x11\xe6\xb5\x12\xd4\xe1\xf7\xd3\x3d"
- "\x2e\xd5\x17\xe9\x79\x72\x9e\x67\xcd\x99\x07\x58\x19\x0c\xab\x05"
- "\xe5\x23\x35\x39\x0b\x7b\xdc\xa3\x52\xfc\xf4\xfb\x85\x32\x9f\x35"
- "\x3d\xcf\xb1\x8e\xae\x3f\x4d\xa3\xf2\xa5\xad\xef\xc9\x29\x63\x7d"
- "\x80\x34\x2b\xd2\x66\x01\xbe\x03\xf9\x27\xfb\xe9\x17\x75\xca\x8e"
- "\x1d\x35\xcb\xc8\x87\x7b\x3b\xdf\xc7\xf0\x4f\x92\xdc\x5e\x41\x7f"
- "\xd9\x07\x36\x5b\x38\xcd\x1c\xb5\xf9\x62\xc5\x2f\x3f\xf1\xeb\x01"
- "\x7d\x9e\xde\x04\x5b\x8b\x9c\x1b\x28\x1b\xfd\xc3\xf8\xfd\xd6\x59"
- "\x21\x4e\x09\xf7\xa8\xc2\x9f\xac\x0b\x61\x9e\x30\xea\x98\x9f\xb6"
- "\xd4\x0f\x46\x4f\xc1\xb6\xce\x45\xd1\x59\xbd\xba\x9f\x96\x9f\xce"
- "\x5d\xab\x09\xbe\x67\x7d\xd4\x80\x74\xa6\x5b\x8f\xfb\xa6\x2c\x83"
- "\x66\x83\xf7\x4b\x4e\xa9\x9a\x17\xde\x54\x2e\xdc\x82\xbc\x37\xf0"
- "\xfe\xc4\x4d\xab\x14\x1d\x2c\xf9\xdd\xd0\x23\xbc\xfe\xda\x00\x7a"
- "\xaf\xb4\x89\x10\x60\x96\xfa\xe9\xb6\x80\xbe\xce\x13\xf4\x85\x67"
- "\xb0\x6e\x49\x38\x6e\xf1\xfe\xcf\x00\xfc\xd1\x3b\x5a\xb3\xa1\x87"
- "\xa4\x6e\x9a\x3f\xbd\x4a\xe1\x1d\x62\xb8\xde\xaa\xf3\xd4\x81\xf7"
- "\x2b\x83\xa2\x53\x78\xe6\x4f\xe6\x79\x84\x77\x75\x2f\xa7\xbd\x06"
- "\xde\x16\xde\x15\x8c\xd3\xe8\xd7\xbc\x37\xf4\xd2\x29\xcc\xfb\x1a"
- "\xfa\xd7\x64\x46\xbb\x78\x0d\x46\xad\x23\x8d\xc6\x7c\x68\xdc\x21"
- "\x03\x2f\xb6\x31\x40\xdf\x14\xb6\x39\xd8\xd6\xe0\x35\xfd\x95\x95"
- "\x22\xc4\x36\x07\xf2\x8e\x33\xda\xc0\xed\x53\xed\x1a\x9d\x1f\xdd"
- "\x2e\xe0\x10\xc0\x1c\x5a\xd2\x60\xe5\x5a\x4a\xb1\x2b\x5a\xa7\x70"
- "\x7b\xb9\x2d\xdc\x66\xd9\x16\xa9\x63\x31\x46\x84\xef\x42\xfd\x32"
- "\xbd\x00\xb0\x30\xff\xf9\xe6\x3c\xc5\x53\xa3\x29\x9e\x8f\xfa\xfb"
- "\xd1\x9a\x4e\xce\x2f\xe9\x06\xa7\x26\x4e\x9e\xa2\x31\x3c\xdf\x4d"
- "\xe6\xab\xc6\x76\x76\x88\xf9\x77\x74\x01\x8f\xc9\xbe\x4a\xd6\xb7"
- "\x32\xef\x35\xc8\xdb\x81\x3c\xc3\xf4\xbc\xc3\xd4\x7e\x8e\xbc\x0e"
- "\xe5\x2b\xc6\xc5\x88\x9f\xc6\xd8\x03\x72\xbc\x9f\x4f\xc6\xb3\xc0"
- "\x33\x70\x69\x17\x35\xa3\x0b\x12\xe3\x92\x21\xc7\xb3\xc8\x45\xd1"
- "\x85\x7a\xbe\xc1\x3c\xe5\x5c\x4b\xd7\x81\x2f\x3f\xad\xda\x40\xd7"
- "\x30\x3f\x89\x8c\x9c\x72\x45\xf7\x31\x65\xc2\x0d\xdb\x13\x1a\xd5"
- "\xb1\x9a\xae\x87\x1c\x95\x9d\xa6\x31\x1b\x8b\x2a\xed\xc0\x95\xa8"
- "\xfa\x2c\x91\xd4\x41\x19\x39\x0e\x5f\xf8\x33\x6a\x38\xcb\xeb\x2f"
- "\x63\x1a\x0d\x5e\xc4\xfd\x81\xcb\xe9\x0b\xd0\xd5\xa5\xd6\x0f\xc6"
- "\x5e\xc7\xeb\xf7\x27\x69\xac\x99\xdb\x8b\x5f\x12\xea\xbe\x20\x2e"
- "\x8a\x85\x42\x8d\x69\x98\x83\x8e\xcd\xc3\xd5\x25\x7f\x6e\x2a\xd6"
- "\x9f\x1d\xc8\xd7\x21\x2e\x6a\x9c\xc7\x85\xf6\x87\x85\x3b\x89\x65"
- "\xe2\x70\x8f\x7b\x6c\xae\x9f\xa6\xea\xf2\x3e\x26\xc8\xb0\x06\xc1"
- "\xc1\x81\xbe\x25\xe6\x4d\xe0\x51\x63\xaf\x4a\x62\x3c\x96\x48\xb9"
- "\x00\xac\x06\x93\xd2\xdb\x1a\x70\xdd\xeb\xd6\x4a\xa1\xa3\x4b\xb5"
- "\xda\xb1\x47\xe5\xbd\xfe\x4e\xe8\xe3\x68\x62\xf8\xf3\xa7\x7b\x47"
- "\x32\x8f\x8f\xed\x52\x70\xe6\x4f\xf6\x8e\x3c\xcd\xcf\x67\xf8\x39"
- "\x68\xbd\xf9\xa8\xaf\x2e\x1f\xf5\x9f\xe6\x7a\xbb\xd4\x7c\x7e\xec"
- "\x99\x6e\xd4\x81\x36\x74\xf9\x69\x7c\xb3\xda\xcb\xb8\xf9\xe8\x20"
- "\xb2\x67\x65\xd9\x61\x99\x53\x32\x7d\xcb\x3b\x2d\x8d\x52\xfe\x8a"
- "\xc1\xf3\x2e\x5d\x6f\xf0\x5a\x4b\xea\x49\xba\xe5\x40\x8b\x4d\xf2"
- "\xb7\x49\x98\x6e\x9e\xf5\xae\x16\x30\xf1\x7e\x93\x52\x5f\xb7\x1c"
- "\xb8\xf4\x77\x33\xda\x77\xb3\x07\xbf\x7a\xfd\x19\xf3\xff\x9b\x0f"
- "\xe3\x3e\x15\xbf\x7a\x49\xbb\xdd\x25\x49\x7e\xbc\xeb\x86\xcd\xce"
- "\xcf\x7e\xba\x79\x8b\xd8\x3d\xc6\x04\xbb\x44\xde\x37\x5c\xc7\xeb"
- "\x04\x37\x1f\x44\x7f\x4d\x51\x7d\x71\x8b\xdc\x53\x04\x6e\x4c\x77"
- "\xe1\xac\x13\xa1\xe6\xaa\x20\xf0\xbe\xb9\xa3\xb9\x2e\x48\xf6\x9b"
- "\xb9\xfd\x37\x77\x72\x9b\x82\xa0\x3f\x5f\x57\xd6\x89\xc0\x91\xfa"
- "\x30\xf1\xbe\x57\x8f\xfb\x16\xc8\x5f\x29\xa9\x35\x87\xf9\xc5\x0c"
- "\x4f\xe7\x09\x61\xb4\x5f\xe9\xb4\x9b\x8f\x72\x5f\xe2\xf9\x2e\xb4"
- "\xdd\x72\x96\x6e\x59\x25\x32\xc7\x1e\x3d\x52\x4a\xb4\x07\x7a\x04"
- "\x63\x8d\x5c\x8b\x87\x5e\x62\x98\x18\xff\xc7\xd6\x1b\xfb\x34\xdb"
- "\xf0\x7e\x3b\xde\x61\xec\x09\xb4\x94\x86\x88\x61\x45\xb8\x7d\x28"
- "\xff\x91\x16\x30\x63\xac\x46\x9f\xdf\x7c\xb4\xca\x01\x3d\xd3\xaf"
- "\xb7\x6e\xc9\xde\x70\x46\x84\x8c\xf6\xf1\x5e\x28\xe0\x82\xff\x9f"
- "\xb5\x0d\xca\xff\xfd\x38\xe7\xfe\xe1\xc8\x18\xd5\x67\x1a\xe8\x12"
- "\xdb\x67\xb9\x47\x55\x7f\xdd\x12\x8e\xed\xaf\xdc\xa3\xf8\x4d\xc7"
- "\x6f\x21\x7e\x65\xfa\x73\xf4\x2f\x2f\xea\x1e\xd2\x9a\x7b\xb0\xc7"
- "\x9d\x8b\xf1\x7f\xcc\x21\xd5\x0f\x9c\x8e\x76\x30\x8f\x7c\x41\x29"
- "\xbc\x5e\xc7\xfb\xa0\x9c\xce\xfc\xcc\xe9\x1a\xec\x19\x3c\x17\xe0"
- "\xbd\x95\x65\xb5\x5a\xa3\x98\xf7\xbe\xcd\xe0\xb9\x75\xbd\x8c\xff"
- "\x9b\x72\x8d\x71\xe3\x96\x2d\xcc\xa7\xc8\x33\xcf\x12\xde\xb2\x05"
- "\xf5\x1d\x30\xe8\x8a\xb4\x1d\xfc\x9e\x79\x12\xe9\xcd\xa0\x8b\x5c"
- "\x43\x0f\x62\xbe\x97\xd8\xd6\xc8\xed\xec\xb7\xc9\xac\x16\x3f\xeb"
- "\xa3\x2e\xba\x35\x08\x9d\x85\xbe\x1d\xeb\x55\x63\xcd\xad\x17\xf8"
- "\x19\xba\xf2\x53\xdc\x07\x5a\xd0\xca\xde\xda\xec\xf6\x3e\x13\x0d"
- "\xed\x35\x51\x7e\xb8\x76\xf3\xb1\x70\x66\x56\x87\xaf\xf3\x20\xb5"
- "\x86\x7f\x49\xf6\x67\x25\x8c\xcf\x7d\xe0\x01\xe7\x5a\x11\x79\xaf"
- "\x77\xbf\xd9\x17\x3e\xe7\xc5\xd8\x7c\xe3\x69\xba\x55\xd2\xe3\x95"
- "\x93\x18\xf5\x17\x49\xd8\x3a\x7d\x36\xef\xdf\xbe\x54\x84\xb7\x9f"
- "\x12\x41\xd8\x77\xc3\xb7\xf5\xd2\xb8\x37\xd6\x51\x5e\x7d\x2f\x8d"
- "\xd9\xdb\x4b\xb9\xe2\xef\xb9\xa6\x7a\xd8\x6d\x8b\x2e\x58\x09\x3a"
- "\xa1\x30\xdd\x41\x29\x7b\xd7\x91\xe4\x91\x48\x0d\xec\xb7\x30\xec"
- "\xb7\x73\xb9\xac\x1b\xfb\xed\xb7\x3e\x69\x17\xe7\x9c\x50\x7c\x94"
- "\x73\x22\xad\x94\x92\x52\x8b\xc9\x0a\xfc\x9c\x67\xe9\xd6\x5b\x53"
- "\x3b\x60\x3b\xa2\xcd\x7e\xbd\xbd\xb8\x4e\xb1\x94\xd2\x50\xd9\x56"
- "\xe8\x6b\x51\x33\xd6\x3b\xe8\x38\x6c\x62\x9e\x0a\xb2\xdc\xa0\x0d"
- "\xb7\xdd\xcf\x7b\xb1\x07\x47\x86\xcc\x2b\xeb\x45\x88\xd3\xcb\x47"
- "\x89\x10\xd2\x73\xb9\xee\x26\xa4\xf7\xb8\x6f\x2b\xf0\x9b\x53\xf6"
- "\x0d\xc6\xa3\x98\x1f\xe9\x7a\xe5\xb6\x3f\x0a\x93\x8b\xe7\xce\xf6"
- "\x0d\x61\xd8\xde\x67\x59\x66\x6f\x6b\x9b\x5b\x26\xc2\xf6\xe5\xbc"
- "\x2f\x7e\x9b\x97\xf7\xec\x79\xaf\xee\x5d\xd8\x36\x5f\xb5\x4f\xcf"
- "\xe3\x05\xcf\x15\x2c\x65\x80\x59\x6b\xc5\xb8\x95\x1b\xe7\x23\x40"
- "\x34\x98\x1d\xcf\xbe\x22\xaf\x4a\xbf\x94\x6f\xa6\xfa\xe9\xe1\x12"
- "\xc6\x9d\xf7\x64\x59\x77\xc2\xde\xba\xe6\x14\x7d\x73\x66\x10\x74"
- "\xc0\x7b\x8c\xff\x33\x27\xeb\xfb\xaa\xd2\xdf\x05\x69\x18\xff\x1f"
- "\xaa\xe4\xb4\xf2\x51\x64\x2b\xb7\x8b\xce\xc1\x6c\x26\xe9\x83\x62"
- "\xa2\x6f\xa0\x4c\xb9\x01\x07\xe3\xd4\x3f\x77\x9b\x1e\x7b\x0c\x69"
- "\x5b\x0c\x38\xc8\x73\x2d\x9e\xeb\xfa\xf3\xa8\x32\xfb\xa3\xca\x3c"
- "\xd6\x6d\xba\xed\x9f\x91\x76\x38\xae\xcc\xb1\xb8\x32\x27\xa2\xca"
- "\xb8\xf4\x7a\x02\xb1\x65\xc6\x51\x6c\x99\x71\xd6\x4b\x71\x1b\x37"
- "\x26\xae\xcc\xa4\xb8\x32\xd3\x2f\xc5\x6d\x5c\x61\x5c\x99\xd2\xb8"
- "\x32\x15\x51\xb4\x64\x7f\x10\xd8\x57\xe3\xb6\xc6\x95\xa9\x8f\x2b"
- "\x73\xc0\x78\x1e\xcc\xe7\x67\xe5\x1e\xb2\x81\x37\x3b\xb9\x3f\x5f"
- "\x45\xff\x74\xbf\xfe\x5c\x8f\x5e\xb6\x33\x41\xbb\xc2\xb1\xf5\x8d"
- "\x4f\x8d\xad\x6f\x7c\xf6\xa5\xed\x1a\x9f\x17\x57\x26\x3f\xae\x4c"
- "\x41\x54\x99\x46\x55\xcf\xf8\x92\xb8\x32\xe5\x71\x65\x36\x5f\xca"
- "\x57\xe3\xeb\xe2\xca\xec\x8f\x2b\x73\xe8\x2b\x68\xc1\xe3\xb8\xf2"
- "\xcd\x1a\xc1\xb6\xf2\x03\xb0\x11\x26\x8c\x62\x9f\x03\xde\x9b\xfc"
- "\x49\x6f\x68\x08\xef\x87\xf0\x78\x75\xa4\x22\x84\xb1\x65\x02\xe6"
- "\x3f\x77\xba\x8c\x31\x8b\xfd\x31\x58\xa6\x95\x8d\x3d\xbe\x73\x30"
- "\x5b\x94\xeb\x31\x7c\xb5\xb8\xae\x23\xd9\x3c\x4e\x4d\x98\xd7\x6f"
- "\x13\x2b\xff\x25\x52\x70\x26\xfc\xcc\xd8\x1b\x6d\x50\x7e\x1e\x49"
- "\x6c\x93\x1f\xa9\x90\x65\xb6\x44\xd9\xd1\x5c\x7f\xf0\xe0\xba\x90"
- "\x39\x16\x8f\x09\xa5\x97\xc1\x23\x15\xb6\x51\x6e\x2b\x2c\x0b\xde"
- "\xbf\x6e\xa9\x87\x0d\x04\xbb\x9f\x71\x3b\x49\x13\x02\xd2\x26\x5b"
- "\xde\x4b\x7c\xef\xab\xbc\x47\xee\x6f\x2b\x9b\x74\x62\x6e\x33\xea"
- "\x67\xdb\xbd\xd9\x71\x9e\xba\xe5\xf8\xcb\xb6\xdb\xc4\xc7\x8e\x54"
- "\x06\x80\xd7\xc4\x7e\xff\x0f\x3f\x4d\x9c\x27\x6d\x0d\xcf\x7c\x3b"
- "\xef\xbd\xf3\x1e\xd2\x91\xe0\x64\xce\x03\xfe\x9f\x30\xce\x68\x2f"
- "\xc6\x7a\xc8\xd8\x84\xf0\xe5\x68\xa6\xfa\x70\x62\x65\x2c\x4f\x0e"
- "\x01\xaf\x4c\xf4\xc4\xf6\xfb\xc4\xc6\xd8\x7e\x9f\xd8\x14\xcb\x93"
- "\x26\xf0\xe4\xc4\xe6\xb8\x32\xc7\xe3\xca\x74\x44\x95\xf1\xe8\xf5"
- "\x84\x62\xcb\xe4\xa5\xc4\x96\xc9\xb3\x45\x3d\xa3\x8d\x79\xb9\xfd"
- "\x73\x1f\xe9\x5b\x94\x37\x39\xea\xd9\xb4\x43\xea\xcf\xbc\x59\x46"
- "\x1a\xaf\x1d\xed\xdd\xa9\x7c\x5b\x74\x78\xa5\x71\xf2\xce\xf9\x2b"
- "\xe3\x70\xd8\x1a\x87\x43\xbf\xfc\xeb\xfb\xe9\xbf\x3b\x45\xb7\x97"
- "\xeb\xfb\xe9\x5d\x18\xb3\xe7\xf2\x33\x60\xd5\x21\x3f\xe8\x90\x77"
- "\x2c\x0e\xde\x89\x38\x78\x5d\x51\xcf\x56\x3c\x87\xa3\xda\x60\x4d"
- "\xb6\x49\x3f\x41\xd8\x6f\xb7\x67\x19\xe9\x3c\xa7\x04\xbe\x9d\x4e"
- "\x39\xd6\xe4\xb3\xcf\x56\xe6\x49\xba\x9d\x7d\x9a\x74\x5d\x7e\x7b"
- "\xb4\xfc\x93\x6a\xd7\xed\xf3\x62\xf1\xb8\xbd\x24\x16\x8f\xdb\xcb"
- "\xa3\xda\x15\xb4\x6c\xa4\xef\x5b\xc2\x8f\xcc\x67\xdb\x87\x7d\xed"
- "\xa4\xef\xd4\x06\xd8\x6c\x17\xc8\xca\x3e\x6b\xa7\xca\x29\xd9\x57"
- "\xd1\x89\xb9\x5c\x4e\xfb\xa0\xfc\x94\x39\x3f\x4f\xf7\xfb\xb3\x03"
- "\xfe\x71\x83\x1f\xb5\xda\xf9\x79\x5a\xcd\x98\x7a\xa4\x41\xff\x4d"
- "\x2c\x56\x76\xee\xe8\x4e\xe1\x2c\xac\x03\x3d\x31\x2f\xba\xe3\xcf"
- "\xfa\x3c\x62\x3a\xfb\x5e\x41\xf7\x74\x62\x8c\x4f\x55\x7b\xe5\x77"
- "\x64\x47\xf1\x75\xd0\xbe\xee\x3e\x71\x92\xee\xf8\x94\x6d\x00\x96"
- "\x51\xf6\xe1\x3a\x12\x0e\x10\xcf\xbd\x7d\xe1\xd3\xd2\x76\xc3\x7b"
- "\xbf\x5e\xb6\x30\xaa\x6c\x40\x9f\x1b\x77\xf2\xbb\x89\x61\x32\x1f"
- "\x09\x06\x08\x70\xb2\x94\xbd\x77\xc7\xa7\x47\x20\xaf\x28\xb3\xd5"
- "\x28\xc3\xf3\x68\x2e\x63\x29\x27\xf3\x84\x4a\x32\x7b\xd7\x9d\x94"
- "\xb0\x0d\x5f\x0a\xd8\xd2\x5d\xbe\xca\x4e\xf2\x05\xdb\x79\xad\xcb"
- "\xac\x7c\x60\xee\xf0\x27\x87\x28\xa5\xbb\x66\xbe\xdd\x8f\xfb\x48"
- "\xcd\xfc\x5c\xe0\x86\xfe\xb9\xc3\xcc\xfa\x26\x9a\x76\x33\x66\x14"
- "\x3c\x32\x77\xf6\xf8\x1f\x3c\xf2\xd0\xbc\x19\xf7\xd8\xe7\x2d\x7b"
- "\x7e\x49\xc9\xf8\x17\x56\x95\xdb\xd7\xac\x58\x56\xbe\x6c\xf9\x33"
- "\xf6\xbc\x8a\xb1\x15\xf6\xc5\xe5\xea\x9a\x5b\xb6\x78\x65\xf9\x54"
- "\xbe\x1d\x67\x77\xac\x58\xb2\x5a\xde\xde\x3a\x9c\x62\x81\x2c\x2b"
- "\x5f\xb2\xc2\x3e\xb6\x64\x9c\xfd\xc1\xc5\xcb\xca\x56\xad\x58\x92"
- "\x10\xd6\x3d\xf6\x15\x4b\x56\x2c\x59\x5c\x62\x9f\x6a\xcf\x63\xc8"
- "\xd1\xe0\xa2\xfa\x33\xcf\x18\xc7\x78\xfc\xaa\x76\x8b\x36\x7d\x3c"
- "\xf3\x2b\xfe\xb9\xf3\xe0\xa5\x63\xd9\x9d\x47\x63\x79\xee\xce\xf6"
- "\x58\x9e\xbb\xb3\xf3\xd2\xb1\xec\xce\xb8\xf1\x6f\x52\xdc\xf8\x37"
- "\x29\xfb\xd2\xb1\x6c\x52\xdc\xf8\x37\x29\x6e\xfc\x9b\xd4\x3f\xfe"
- "\x81\x97\xfc\x9b\xa4\x5e\x98\x14\x37\xfe\x4d\x8a\x1b\xff\x26\x6d"
- "\x8e\x7b\xde\x11\xf5\x7c\x0d\x9e\xf7\x45\x8f\x8f\x78\x3e\x68\xc8"
- "\xe7\x80\x7e\x99\x74\xd4\xc8\xc3\xba\x1e\xba\xb9\x43\xcf\xeb\x8f"
- "\xca\xdb\xa9\xe7\x0d\xf6\xcb\x1f\xf8\x88\x7d\xdd\xd4\x7c\xfd\xae"
- "\xf9\xac\xd3\xd9\xcf\x8d\xc7\x26\xc8\xc7\x8d\x67\x69\xd2\x1f\x19"
- "\x16\xf3\x30\xfb\x3d\x8a\xd7\x9f\xe8\x69\xc8\xa4\x14\x2e\xd3\x50"
- "\x4b\x66\xe1\xbe\xa3\x0b\x57\x42\x5a\x2a\x7e\xd0\x29\x77\xc1\xfe"
- "\x1d\x56\xae\xc6\x8b\xbb\x1a\xa5\xcd\x8f\x32\x3a\x7c\x39\xaf\x01"
- "\x1c\x1b\xca\xa4\x54\xab\xb1\xb8\x03\xf7\xa9\xcc\xd3\x28\x6f\x16"
- "\xa6\x3b\x6f\xc7\x95\x90\x66\xc5\x2f\x0b\xf0\x1a\x0d\x78\x9b\x47"
- "\x24\xb6\x2d\xe3\xed\xdc\xfe\xf9\xa0\x89\x2c\xd5\x6e\xad\xdd\xa7"
- "\xb1\x6d\x7d\xd7\x71\xb5\xb6\x90\x8d\x39\xe6\x27\x85\x0d\x48\x4f"
- "\x3c\x4f\xfa\x16\xec\xbf\xbb\x8e\xaa\xf5\x96\x6f\xa1\xff\x1f\x0e"
- "\xaa\xb5\xd3\xec\x10\xf4\x6d\xef\x29\xfa\xd6\x07\xb8\xf6\xe1\xba"
- "\xcb\x80\xef\x95\xf3\xed\x6f\x4d\x12\xee\xa4\x47\x19\x6e\x5c\xfa"
- "\x2c\xe8\xb7\x5e\x4b\xd8\x55\x98\xe0\x5d\xa9\x70\x27\x3f\x92\x20"
- "\x9d\xe7\xdf\xbd\x7e\xfa\xd6\x41\xc6\x37\x2a\xbd\x4e\xb8\xd3\xe7"
- "\x71\x7e\x3f\xd7\x87\x32\x83\xd9\xda\x86\x5f\xab\xf2\x43\xff\x56"
- "\x47\x5c\x3b\xbe\x3c\x45\xdf\x5e\xac\xda\xf1\xed\x8f\xe2\xea\x0e"
- "\x27\x6e\xc7\xb7\xb3\xd0\x8e\x2f\x13\xb7\xe3\xdb\x79\x92\xb6\x26"
- "\xb4\xc5\x74\xc9\xbb\x59\x68\xcb\x97\x92\xee\xb1\xe9\x25\xba\x2d"
- "\xc4\x73\x32\x2b\xde\xc9\xb2\x8f\x56\x0e\xf4\x9b\x9e\x6f\xab\xa5"
- "\x8e\x0a\x12\xd4\xb9\x4f\xb8\x87\x3e\xea\xa7\x6f\x9f\x90\x70\x06"
- "\xd2\x0f\x2b\x5c\x40\x27\x93\xa4\x13\xcb\x83\x65\xb0\xfe\x36\xe6"
- "\x25\x6a\x2d\x64\x32\xe4\xff\x5b\x5e\x63\x2d\x73\x65\xa5\x08\x18"
- "\x74\xc4\xbb\xdc\xb8\x77\xa1\xa8\x77\xd3\x63\xde\x6d\xe8\x4f\x5f"
- "\x68\xa4\x7f\xbd\x7e\x9a\xbc\x35\xae\x9f\xd0\x3f\x77\xe7\xc4\xb6"
- "\x7b\x72\xbd\x6a\x1f\xfa\xe8\x12\x5a\x4f\x3e\x84\x3e\xea\x4b\xdc"
- "\x47\x93\x8f\x27\xe6\xb5\xc9\x72\x1d\x4d\x64\x52\x02\x78\x77\xf3"
- "\x1c\xbb\x4f\xf2\xa0\xde\x4f\x97\xf6\xcf\xdd\xe3\x8c\xfe\xf9\x7a"
- "\x6d\xbc\xdb\x11\xd7\xc6\x08\x60\x9c\x51\x6d\xbd\x67\x6a\x1c\xec"
- "\x2d\x89\x79\xf1\xee\x46\xb4\x33\x92\xb8\x9d\x77\x1f\x1e\x9c\x17"
- "\xef\x6e\x47\x7b\x22\x97\xf2\xe2\xdd\x01\x55\x86\x12\x94\xb9\x27"
- "\x55\xb8\x13\xd5\x73\xcf\x18\x67\x98\xed\xdc\x7b\x16\xf2\xfa\x52"
- "\x54\xfa\x94\x58\xfe\x43\x1b\xb8\x1c\xd3\x2f\xac\xf4\x2c\xf7\xc3"
- "\x29\x3b\x99\xbe\x8a\x27\x7b\xdc\xf7\xd4\xc7\xd1\xea\xdc\x29\xfa"
- "\x4e\x4e\xb7\x29\x69\x9f\xa2\xd7\x77\x3e\x8d\xc3\xe9\x50\x62\x7a"
- "\xdd\xd3\x06\x7a\x9d\x4b\x4c\xaf\x7b\xba\x06\xa7\xd7\x77\xb8\xff"
- "\xcf\x5d\x4a\xaf\xef\xd8\xa3\xe9\x05\x5b\x57\xb6\x6f\xb4\x0d\xbc"
- "\xd1\x57\x24\x1a\xb8\xad\x11\xb2\x5a\xc0\x2b\xaa\x4c\x17\x97\x99"
- "\x67\x09\x29\x3e\x81\x0d\x99\x72\x96\xbe\x33\xc5\x90\xff\xf4\x3a"
- "\x1a\x2a\xfa\x9e\x60\x3f\xa2\x24\x2e\xe7\xab\x38\xe7\xf5\x85\xf3"
- "\x88\xe7\x1f\x71\xf5\xd6\x25\xd6\x05\xdf\x69\x02\x4d\x6b\x13\xa4"
- "\x1f\x55\xfe\x65\x53\x28\x56\x47\x7c\xc7\x1f\xdb\x47\xa0\x1b\xca"
- "\xe9\xdb\x4e\x5f\xf9\xbb\x7c\x9f\x4d\x29\xb8\xb4\xcf\xa6\x7c\xa1"
- "\xfa\x6b\xca\x1f\x63\xf1\x9b\x52\x9a\xb8\xbf\xa6\xb8\x06\xef\xaf"
- "\x29\xf5\x83\xf7\xd7\x94\x43\xdc\x5f\x68\x6f\x20\x76\xdc\x98\xd2"
- "\x16\xdb\x5e\xd4\x8b\x72\xc2\x74\xd5\x35\xfc\xfc\x75\xdb\x6d\xfc"
- "\x58\xc7\x71\x5f\x35\x54\x11\x78\x39\x69\x14\xe3\x78\xa5\x30\x06"
- "\x85\x0d\x1a\x7a\xd6\x25\xde\x6f\xe5\x39\x6e\x6b\x1d\x11\xef\x23"
- "\xdb\x6f\x60\xdb\x7d\xea\xef\x35\x13\xb5\xe3\xde\x74\x8a\xee\xab"
- "\xd1\x4c\xa6\x4a\xde\xf3\x94\x7e\xe1\x72\x0d\x61\xea\x89\xe8\xbe"
- "\xe0\xbd\x4f\x9e\x9b\x6e\x57\x73\xa7\xbf\x9d\xa2\x7b\x97\xa8\x7e"
- "\xb9\xef\xc5\x58\x3a\xde\x4b\x89\xfb\xe5\x5e\x1b\xfa\xe5\x6f\x89"
- "\xfb\xe5\xde\x49\x83\xf7\xcb\xbd\x05\xe8\x97\xbf\x5d\x2a\x47\xf7"
- "\x96\xea\x72\xb4\x89\xcb\xd8\x97\xf3\x7c\xfc\xde\x7f\xe7\x3c\xb8"
- "\x87\x8c\xdc\xcb\x47\xca\x93\xc6\x77\x19\x72\x24\xcb\xd4\x03\x96"
- "\xac\x5f\xcf\x53\xa7\xc3\x88\x86\xeb\xb5\x74\x25\x92\x93\x7b\x65"
- "\x3f\x4d\x70\x10\xef\xc5\x17\xee\x61\x18\x2b\x88\xce\xd2\x7d\xe3"
- "\x39\x1f\xa7\x4f\x08\x46\xcb\xc9\x7d\xfd\xf9\x58\xd7\xe9\x79\x49"
- "\xf4\x94\x12\xe7\x8b\x85\x7d\x9f\xde\xfe\xa1\x72\x1c\xe1\xfc\x9c"
- "\x2f\x2e\x4f\xa1\x92\xc7\xfb\xea\x63\xe5\xf1\x3e\x47\x2c\x7f\xde"
- "\x2b\xcb\x69\xd0\x73\x7e\x9a\xda\x0c\x1c\xbe\x36\x7f\x5d\x5e\x36"
- "\xef\xeb\x8a\x93\x4d\xf0\x40\xfe\x36\xc5\x03\xf9\xcf\xc7\xe2\x9a"
- "\x6f\x4e\xcc\x03\xf9\xd9\x83\xf3\x40\xfe\xe4\xc1\x79\x20\x7f\x1e"
- "\xf3\x80\x9f\xf2\xb7\xc6\xca\x66\x7e\x59\x6c\xdb\x51\xaf\x94\x4d"
- "\xca\xb8\x12\xd9\x84\x2d\x74\xcd\x60\x72\xc8\x32\xc5\xfe\x23\x0d"
- "\xbd\xc6\x5e\xc7\xd7\xa2\x59\x0a\xe4\x0a\xf8\xdd\x6f\xe7\x35\x25"
- "\xe8\xf8\xc9\x4c\xc3\xbd\xf2\xec\xe1\xfd\x93\xa2\xe9\xb8\x5d\x9d"
- "\x8f\x73\x22\xef\x87\xbc\xaf\xac\xe8\xf9\xc0\xc6\xd8\xf6\xdf\x3f"
- "\x2f\x31\x3d\xef\x2f\x03\x3d\x9d\x89\xe9\x79\xff\x96\xc1\xe9\x79"
- "\xff\x3e\x3e\x7b\x74\xa9\x4c\xdd\x7f\xd8\xbe\x5a\xda\x28\xb2\xcc"
- "\x59\x7a\xe0\xda\xaf\x37\x3e\xdd\x1f\x8c\x1d\x9f\xee\x3f\x71\xe5"
- "\xe3\xd3\x03\x93\x13\x8f\x4f\x0f\x14\x24\x1e\x9f\x1e\x28\x55\xf2"
- "\xf0\x40\x63\xac\x3c\x3c\xe0\x8a\xe5\x09\xd0\xee\x7f\x6c\x7c\x7a"
- "\x20\x10\x27\x03\xd5\xa7\x68\xda\x8b\xb0\x29\x5c\xaa\xdf\xa6\xdf"
- "\x15\x8b\xe3\xb4\xd4\xc4\xfd\x36\x6d\x0c\xfa\xad\x3a\x71\xbf\x4d"
- "\xcb\x1f\xbc\xdf\xa6\xf1\x1e\x74\xf5\xa5\xfd\x36\xad\xfc\xca\x6d"
- "\x8a\x69\xfb\x63\xfb\x6c\x9a\xe7\xca\xfb\x6c\x5a\x57\xe2\x3e\x9b"
- "\x6e\x4e\xdc\x67\xd3\xb3\x55\x9f\x4d\x9f\x17\xdb\x67\xd3\x27\xc5"
- "\xf6\x19\xe8\xf6\xdf\xec\x33\xf4\x4f\x58\xf9\x27\x4c\xff\x00\xf3"
- "\xf6\xa1\x3d\xee\xe9\x07\xfc\x34\x43\x9f\x5b\xcf\x50\x63\x87\xea"
- "\xc3\xf7\x90\xa7\xf1\xd2\x71\x60\xfa\x51\x3d\xed\x07\x97\xf6\xc3"
- "\xf4\x0e\xe8\xe8\xae\xe6\x4a\xb9\xb7\xa5\xfa\x90\x69\x8e\x7c\xde"
- "\x75\xbc\x3f\x35\x83\x37\x8b\x92\xd0\xc7\xc2\x17\x0a\x13\xeb\x75"
- "\xe4\x0f\x32\x1c\x3e\x73\x19\x0b\x6b\x46\xde\x95\x8c\xf1\x83\xfb"
- "\xd4\x64\x87\xbd\x55\x77\x00\xde\x83\x33\x14\xaf\xce\x88\xb7\x7f"
- "\x1b\xf0\xee\x3a\xc5\xa7\xdf\xfd\x2c\x0e\x87\x83\x89\xf9\x74\xc6"
- "\x31\xb4\xa1\x21\x31\x9f\xce\xe8\x1c\x9c\x4f\x1f\x44\xff\x53\x43"
- "\xd4\xdc\x27\x73\x51\xd8\x1f\x37\xf7\x79\x30\xd7\x12\x54\xbc\x23"
- "\x6d\xa2\x9a\xec\x70\x8f\xfb\xc1\x78\xfb\x0f\x7d\xf3\x60\x8b\x8e"
- "\xf3\xef\xe3\xca\x0f\x62\xff\x3d\xc8\xf6\xdf\x7b\x89\x71\x7e\xf0"
- "\x32\xf6\xdf\x83\x6c\xff\xbd\x77\xa9\x6c\x3d\xa8\xdb\x7f\x89\xe6"
- "\x78\x0f\x76\x25\xee\xff\xef\xc6\xf5\x3f\x15\x96\x63\x3e\x2c\xcb"
- "\xc7\xe6\x1b\x17\x9d\x8f\x7d\x93\x38\x2f\xf3\x48\x82\xbc\x85\xf1"
- "\x30\x07\xc9\xe7\xba\x84\xf7\xd8\x97\x2a\x21\xef\x7d\xf7\x80\x92"
- "\xc7\x99\xe6\x58\x79\xfc\x6e\x73\xac\x3c\x3e\x58\x1a\x57\xae\x23"
- "\xf6\x3d\xf8\xe7\x7f\x4c\xc7\xce\x9c\x17\xc7\x03\x9f\x9c\xa2\x99"
- "\x7f\x54\x3c\xf0\xd0\xad\xb1\x78\xcc\x2c\x4b\xcc\x03\x33\x37\xa3"
- "\xfd\x9f\x24\xe6\x81\x99\x8d\x83\xf3\xc0\xcc\xc3\xa0\xe5\x27\xd1"
- "\x7c\xfb\x68\x65\xfe\xd0\xb8\x3c\xfe\xc4\x3a\x6f\x66\x28\xf1\x1a"
- "\xc1\x43\x56\x45\xe3\x87\x66\xc6\xd2\xf8\xa1\xdc\x58\x1a\xa2\x2d"
- "\xff\x7d\x1a\xf6\xc7\x3e\xe8\x71\x3f\x14\x2f\xff\xbe\x53\xf4\x3d"
- "\x5d\xfe\x1f\xce\x88\xc3\xf1\xa0\xc2\x25\xd1\xba\xc8\x43\x3c\xff"
- "\xf5\x25\xa6\xe5\x43\x5d\x89\xdb\xfc\x3d\x33\xc6\x20\x9f\x76\x89"
- "\x2c\x7d\x2f\x1b\xe9\x8f\xf2\x7a\x28\xaf\x87\xec\x45\xfa\xa3\x61"
- "\x4a\x91\xe3\x55\xff\xb8\xf4\xbd\x7c\xf6\x45\x61\xfa\x33\xff\x5a"
- "\xb2\xa9\x80\xc7\x20\xc6\xab\xa8\x52\xfa\x2d\x58\x36\x33\xaf\xdf"
- "\xc4\xbc\xfe\x3d\x69\xff\xf1\x3e\x0b\xfb\x11\x5a\x2a\xa8\xc0\x17"
- "\x0c\x93\xc1\xef\x9c\x3f\x0e\x76\x3d\xcb\x05\xe7\x37\xf2\xaa\x75"
- "\x33\x57\x9c\x6e\xfa\x5e\x73\xe2\x3e\xfe\xde\x89\xc1\x79\xe7\x7b"
- "\x21\xd5\xcf\x0f\x8f\x8b\xed\xe7\x87\xad\x9a\x3b\x7d\x1e\xb7\x15"
- "\x3c\x70\x45\x72\x52\x6e\x17\x81\x41\xf5\xfd\xa6\x27\xda\x1d\x55"
- "\x74\xc3\x69\x7a\x78\x87\xac\xcf\x24\x42\x96\x8d\x49\xd4\x2c\x75"
- "\xc0\xc3\x9f\x4b\x3c\x91\xa7\x28\x4c\x26\xb1\xe9\xb9\x76\x7e\xd7"
- "\xe0\x16\x21\xe4\x6b\xe3\x3d\x01\x3e\xb3\x0c\x5e\xb8\xe6\x24\x3d"
- "\xfc\x4e\x4c\x79\x68\x02\x9f\x82\xd1\xd9\x20\xe5\xf1\xe1\x0e\x63"
- "\x4d\x77\x33\x9e\x13\xaf\xfb\xce\x4a\x31\x7c\x1f\x94\xcf\xd8\xc3"
- "\x83\xee\x5f\x32\x4e\x7c\x56\x86\x71\xba\xbc\x1e\x98\xb5\xd0\xe0"
- "\x5f\xe5\x6b\x39\xab\x6c\xc0\x97\x6f\x56\x85\x9f\x66\xd9\x2f\xb3"
- "\x36\x18\x25\x07\xb3\xf6\x45\xc3\x51\xf1\x3f\x66\x1d\x32\xfc\xf1"
- "\x70\xdf\xfc\x15\xb0\x0c\x7c\xba\xe2\xf0\x81\x1d\xf1\xc0\x71\x05"
- "\x63\x76\xca\xe5\x60\x70\x9f\x2b\x9e\x65\x7e\x98\x6d\xbf\xdc\x9a"
- "\x5f\xb2\x8d\x0a\x5e\xbd\x84\xb7\x66\x4b\x7b\x89\x61\x5c\x1e\xc7"
- "\xd9\x9e\x98\xb9\x85\xdc\xbb\xe7\xbd\xad\x39\x4f\x2a\xb9\x9f\x13"
- "\xb7\x46\x38\xfb\x80\xf4\xa7\xd2\xe5\x7e\x51\x38\x5e\x0e\x66\x1f"
- "\x33\xc6\xe8\xb8\xf4\x0e\x43\xee\x31\xaf\x65\xb8\x71\xeb\xac\x73"
- "\xcc\x4a\x16\xe6\x2c\xd4\x32\xa2\xe7\x6b\x73\xa4\xfd\x67\xac\x97"
- "\xe2\xbd\x39\xae\x5c\xdc\xfa\xdf\xec\x03\x62\xf0\x75\xfa\x54\xf4"
- "\x6f\x90\xf7\xb6\x54\x0c\x84\x39\x5b\xe3\xd6\x2b\x02\xdb\xe5\xf9"
- "\xf6\xbf\x00\xee\x5c\x5d\xef\x15\xc4\xd9\x78\x73\x0e\x38\xcf\x5c"
- "\xae\xfd\x73\x06\x69\xff\x9c\x81\xf6\x2f\x67\xb8\x73\xe3\xd6\x12"
- "\xe7\xca\xf6\x47\x2e\xd1\x7f\x73\xb3\xa1\xbf\x0c\xba\xc1\xe6\x9e"
- "\xbb\xca\xb0\xd5\x79\xfd\x60\x70\x5b\x7d\xee\xc0\xfa\x9f\x2a\x37"
- "\xb0\xfe\x17\x48\x64\xab\xfb\x49\xee\xad\xc6\xd6\x5d\x67\xa9\x4f"
- "\xd4\x96\xb9\x83\xac\xff\xcd\xd5\xd7\xff\x0a\xec\xb1\xfa\x6c\xae"
- "\x3f\xb6\x0f\xe7\xc6\xf5\x61\x01\xc5\xf6\xe1\x9c\x03\xff\xd5\x71"
- "\x8d\x01\x25\x27\x27\x9b\x92\x93\x4c\x49\xc9\x78\x8d\x26\xd2\xd0"
- "\x64\x73\xf2\x10\xfc\xae\xd2\xaf\x43\x4d\xc9\x26\x33\x7e\x43\xf4"
- "\xeb\x55\x71\xcf\x43\xb9\x2c\x7e\x66\xfd\x3a\x24\xee\xf9\xaa\xaf"
- "\x78\x3f\x54\xaf\xd7\xa8\xdf\x1c\xf7\x3c\xe4\x2b\xde\x5f\xf5\xdf"
- "\x2c\x4f\x97\x3c\xc7\xfa\xa1\x3d\xb4\x7c\xf5\xe2\xb2\x65\x25\x72"
- "\xbf\x78\x89\x7d\xf1\xd3\x4f\x2f\x59\xb9\xd2\x5e\xfe\x82\xfd\x81"
- "\xfb\x1f\xb9\xe3\x1e\xbb\xda\x76\x2e\x9b\x3a\xb6\x64\x38\xcd\x5e"
- "\xb3\x82\x5f\xcc\x7e\xf4\xa1\x42\x7b\xc1\x03\xf7\xc7\xbe\x34\xc0"
- "\xc8\xed\xe5\xcb\x41\x89\x92\xbf\xfc\x97\x47\x10\x6d\xdd\x29\x75"
- "\x4f\x07\xfb\xf9\xaa\x35\x8f\xc7\x37\x1e\x63\xff\xd1\x5e\xa7\xf0"
- "\xde\xc4\x7b\xfa\x8f\x8c\xe5\x46\x8c\x6f\x74\x91\xe3\x29\x3e\xbf"
- "\xf2\xc8\xfd\xe2\xe3\x00\xd9\xbf\x47\xa6\x93\xf4\x44\x4d\x33\xac"
- "\x22\x7e\xf6\xf9\xc3\x64\x77\x52\x0a\xca\xdf\x8e\x77\x49\xe2\x5e"
- "\x0d\x69\x41\xdd\x17\xfa\xb1\xfb\x65\xda\xc7\x2e\x23\x9f\xe5\x14"
- "\x3d\xf2\x99\xf8\x58\xc8\x67\x3e\x1f\xa4\xf2\x3d\xf2\xa1\x30\x7d"
- "\xbf\x82\x75\x43\x7d\x26\x99\x79\x2f\x74\x57\x26\xa5\xec\x1a\xc1"
- "\xb1\x40\x1e\x39\x60\xec\x85\xbe\x8c\x67\x3f\x3d\xe1\xe1\xba\x39"
- "\xaf\x66\xfa\xfe\x5b\x9c\x7f\x6f\x6c\xfe\x13\x03\x7b\xb1\x8f\x1c"
- "\x30\x21\xdf\xdc\x4f\xc9\x62\x89\x88\x2f\x42\x99\x59\xed\x13\x66"
- "\x52\x92\x0f\x5d\x71\x2c\xec\x22\xe5\xf3\xf3\xe8\xd8\xb5\x11\x11"
- "\x66\xff\xf4\xd9\x5d\x4e\x51\xfd\x3c\x99\x21\xd3\x49\xde\x15\xec"
- "\xa3\xf0\x68\x6a\xc3\x12\x32\xa3\xfd\xd9\xa7\x69\xde\x14\xfb\x1c"
- "\x22\xe7\x6c\x32\xff\x6b\x05\xfb\x1b\xe6\xac\xde\xfe\x27\x32\xff"
- "\xbc\xd7\x65\xea\x15\x36\xaa\x2c\x17\x9d\x82\xe3\x03\x05\x45\x88"
- "\x7d\xfc\x8f\x15\x47\x38\xcf\xd2\x1e\xa7\x8d\x5a\xcb\x83\xb4\xe1"
- "\x84\x08\x6d\xf9\x93\x3a\x1b\xd0\xd2\x15\x64\xff\xc5\x94\x0d\xb3"
- "\x29\xf9\x54\x21\x99\x5a\x4a\xeb\xc8\xb7\x30\x48\x95\x27\x44\xe7"
- "\xb1\xe2\xcf\xa8\xb5\xb4\x89\x8a\xda\xc9\x74\xac\xe3\xaf\x24\x63"
- "\xdc\xd4\x6e\xf6\x56\x5d\x20\xdb\x86\x65\x9c\x76\x81\xd6\x6d\xa0"
- "\xb4\x75\x7f\x26\x8b\xaf\xb3\x1d\xf5\x9c\xa1\x05\xc7\x29\x09\xf0"
- "\x4c\xeb\xff\x4a\xb6\xf5\xf3\xd9\xcf\x37\x9f\xea\xab\xc8\x26\x9c"
- "\xb9\xa9\xbd\xce\x5c\x6b\xaf\xc8\xcd\xec\x71\xe6\x66\xb5\x3a\x90"
- "\xbf\xe3\x23\x4a\x6f\xa7\xac\x8f\x4f\xb7\x9b\xea\xce\x53\x36\xb7"
- "\xe9\x14\xda\x56\x7f\x1e\xf9\x6b\x17\x38\x34\x94\x8d\x2e\x13\xce"
- "\x58\xb0\xc5\x57\x18\x22\x0d\xb0\xea\x7a\x29\xbb\xbe\x97\x6c\x5a"
- "\xcd\x02\x07\x97\xeb\xa2\xc7\xee\xf6\x1d\x23\xaa\xdc\x20\x22\x7d"
- "\xb5\xd9\xbc\x7e\x31\xf4\xbd\xa7\x0e\x99\x7d\xc7\xba\xa8\x25\xd8"
- "\x4b\xad\xf4\x17\xf2\x55\xfc\xdd\xfb\xf3\xa7\x0e\x0d\xd1\x20\x04"
- "\xde\x75\x1d\xa8\x4b\xf1\x8e\xb3\x85\xcf\x2a\xbb\xa8\xba\x8a\x52"
- "\x1d\xeb\x68\xe8\x69\xa4\xab\xb9\xbd\xc5\xef\x0b\xff\xdd\xbb\x4e"
- "\xfa\xe3\x3e\xe1\xa9\x6a\xa1\xe4\xd6\x60\x1d\xfb\x7d\x9a\x22\x99"
- "\x9b\xbd\xbe\x60\x1b\xf9\x1c\x7f\xf3\x6a\xd6\xcd\xfb\xb7\x6a\x94"
- "\xf2\xce\xc5\x36\x93\xcf\x7c\x91\x7c\x85\x41\xfa\x04\x75\x8b\xda"
- "\xcd\xc7\xa0\xb7\xf2\x5b\x83\x21\x3e\xef\x94\x27\xba\x6d\xc3\xab"
- "\x57\xd0\xb8\xbd\xe7\x69\xcc\x9e\xf3\x94\x2b\x7a\x72\x4d\xec\x63"
- "\xcb\x67\x53\xf7\xe0\x9a\xda\x41\x29\x68\xbb\xf2\xc7\xce\xd0\x7d"
- "\x6d\xfb\x72\xa9\xa1\x77\xc0\xd7\xb6\xb7\x7b\xc0\xd7\x16\x3c\xd5"
- "\xc4\xfe\xb6\x7e\x9a\x37\xdd\x72\x8c\x86\x42\x4e\x4a\x99\xbf\xab"
- "\xcf\x92\x79\xd3\x59\xa2\x09\x2e\x13\xd9\x97\xf2\x39\x8b\xc7\xc7"
- "\xfa\xd0\x37\x7c\x7f\x92\x1e\x3b\x81\x6b\x2a\x7e\x49\x90\x89\x3f"
- "\x72\x3b\x3b\x74\x3e\x46\x9a\x09\x69\xbf\xc7\x35\x19\xd7\x8f\x9c"
- "\xf5\x22\x20\x3c\x37\xe4\x75\x9b\x68\x38\xf3\xb3\xf2\xef\xbd\x21"
- "\xaf\xc7\xfd\xd8\x41\x3f\x3d\x37\xc6\xe0\x6b\xa5\xe3\x1f\x69\xfa"
- "\xe4\xe4\x19\x8e\x43\x15\x90\x78\xf5\x95\x26\x71\x4c\x2a\x3d\x9d"
- "\x71\xc8\xe1\x7a\x4f\xd2\xe3\x5c\x8f\x05\x3f\xc8\xe9\x63\x3b\x8c"
- "\xb2\xdd\x7d\xa5\xa8\xf3\xf1\x6b\x91\x2e\x8c\x74\xb4\xdb\xcc\xef"
- "\xde\x3f\x79\xc6\xa4\xf2\xe4\x9a\x00\x33\xa4\xc3\x87\xec\x3f\x32"
- "\x8f\x65\xbc\xdb\x64\x11\x47\x8a\x27\x51\xfd\x4e\x71\x6c\xcf\x4e"
- "\xd1\xac\x64\xef\xf1\x42\x3f\x95\x95\x32\x8e\x18\xc7\x9b\xb7\xe2"
- "\xdd\x11\x8c\x42\x4c\x97\xe6\x12\xf6\x27\x7b\x1c\xf6\xdf\xd5\x31"
- "\x6d\x10\xee\x82\x42\x1e\x4b\xdf\xad\x3a\x3a\x04\x3a\xa0\xb0\xb5"
- "\xa3\x8b\x7e\xde\xdb\x39\xc4\xf9\x07\x32\xf9\xc2\x27\x69\x62\x16"
- "\xd9\xd8\x1e\x6c\xd8\x29\xfc\xb8\x76\xb2\x7f\x27\xf8\x25\xe7\x34"
- "\x3d\xfe\xfb\x6f\x66\x51\xd6\xbf\x55\x90\xae\x9f\x1e\xff\x6b\x94"
- "\x7e\x5a\xd2\xe2\x3f\x14\xa5\x9b\x9e\xb8\xf6\x52\xdd\xb4\x20\x43"
- "\xe9\x26\xc8\xbe\xd4\x45\x11\xbf\x4a\x9f\x1f\x89\x4b\xd7\xfd\x44"
- "\xe6\x7f\x1a\x97\x1e\xd2\xd3\x5b\xe2\xd2\x03\x7a\x7a\x9a\xa1\xfb"
- "\x5a\x19\x8f\x35\xac\xfb\x0a\xbf\x60\xdd\xd7\x5a\xac\xeb\x3e\xa9"
- "\x7f\x0a\xff\x2c\xde\x82\x2e\x5a\xcd\xfa\xa6\xf0\x1d\xc6\x5f\x7c"
- "\x4c\x06\xee\xc3\x90\xf6\x3c\xa7\x79\xfe\x42\x66\xfc\x0c\xbd\xf7"
- "\x09\xeb\x3d\xd6\x79\xac\xfb\x76\x8f\x10\xed\xbb\x77\x8a\xe3\xf5"
- "\x32\xb6\xce\x0f\xfa\xf5\xdf\x2b\x48\xdb\x8a\xb4\x57\xf0\x9e\xf5"
- "\x20\xd3\xa4\xa5\xf0\x10\xc7\xc4\xe8\x00\x3f\x97\x6b\xa6\x3c\xda"
- "\x8e\xfe\xe6\xf3\x86\x9b\x41\x5f\x4b\x12\x39\x7c\xe5\x7c\x86\x35"
- "\xc2\x3e\x69\x1d\xad\xe5\x1d\x2c\x77\x23\x36\x41\xce\x7c\x15\x9f"
- "\x51\x55\x50\x9c\xe6\x73\x77\x8c\x43\xd1\xda\xef\x71\x3c\xa2\xa4"
- "\xe6\x52\x22\xf6\x0b\x67\x9d\x0d\x5c\xcc\x1e\xe0\xa4\x62\xa8\x14"
- "\x96\xf8\xa9\xf1\x80\xea\xeb\x27\x3c\x1c\xef\xec\x24\xfd\x60\x3f"
- "\xe6\x7b\x21\x6e\x9b\x25\xe2\x22\x3e\x07\x03\x19\xe3\xf3\x8b\xa5"
- "\xbb\x4d\x5a\xa9\xc7\x38\x0b\xc3\xb1\xef\x90\xc7\xd7\x1e\x22\xc6"
- "\xd9\x4f\x3f\x08\xb6\x54\x1e\xe2\xf2\x75\x4c\x1b\xe1\x76\x1a\x30"
- "\x92\x24\x0c\x93\x9c\x37\x96\xfa\xa9\x50\xad\x9d\x67\x66\xb7\xb7"
- "\x2c\x0c\x10\xeb\x7d\x5f\x27\x60\x54\x9e\x54\x30\x00\x4b\x60\x0c"
- "\x88\x79\xa7\xc3\x4f\xdb\x20\xbe\x00\xfc\x12\xee\x2f\x3e\x17\xc9"
- "\xfb\x6d\xa0\x4b\x2a\xfb\xca\x2b\x5b\xf4\x07\x67\x1a\xfe\x42\xa4"
- "\x9f\xed\x04\xbf\xfd\xa0\x8b\xcf\x2d\xf1\x79\xce\xcb\x9d\xe5\x04"
- "\x8d\xc6\x18\xe7\x39\xb5\x35\xff\xb3\x67\x39\x01\xdb\xb6\xd7\x24"
- "\x9a\x80\x7f\x17\x9f\xe7\x04\xfe\xb3\x98\x0f\xf5\x36\x05\x5e\x5b"
- "\x20\x69\x3e\x89\xd3\x30\x77\x3c\x6a\xf4\x3f\xb7\x97\xdb\x82\x77"
- "\x36\x65\x23\x8a\x36\x3f\xcd\x0f\xf0\x7b\xa4\x99\x39\xff\x44\xe8"
- "\x31\x1f\xc6\xb0\xf7\x4e\x46\x4c\xd5\xeb\xc8\xac\x74\xda\x13\xc3"
- "\xb8\xbc\xd2\x69\x0b\xbc\x03\x3a\x6d\xc1\x07\x4a\xa7\x29\x1a\x2b"
- "\x9d\xb6\xe0\x67\x4a\xa7\x2d\x78\x53\xee\x8b\x41\xa7\xf1\x3b\xd6"
- "\x6b\x86\x4e\xdb\x33\x42\x1c\x65\xdd\xd1\xe3\x5e\xe0\x31\x74\xdb"
- "\x36\xa4\xb1\xee\x60\x1c\x95\x9e\x2a\xec\x14\xff\x5f\x2e\x29\xbf"
- "\x03\xbe\x2f\xe5\xf3\x0b\x9d\xfa\x3d\x8f\x27\x49\x4a\xc7\x2d\xe8"
- "\x18\xd0\x71\x0b\x4a\x07\xca\xb2\x8e\x5b\xf0\xa5\xd2\x71\x2a\xbd"
- "\x61\x01\xeb\xb8\xc2\x4e\xa6\x81\x0e\xdf\xc4\x6b\x78\x7a\x7e\xd0"
- "\xf1\xf1\x40\xb4\x8e\x8b\x95\xaf\x27\xa6\x18\x3a\x8e\x75\x1b\x9e"
- "\x67\xf9\x69\xb8\x9c\x67\xb3\x9c\xed\x00\xcd\x0d\xb9\xe3\x3e\xe0"
- "\x36\x73\x5c\x33\xa6\xdb\xb4\x33\x34\x54\x3f\x3b\xa4\xb7\xfb\x89"
- "\x2d\x86\xef\xa3\x9f\x16\x78\x12\xd9\xd1\x03\xb1\x07\xe9\x46\x3e"
- "\x3b\xef\x73\x9d\x24\x5f\x9d\x70\xb5\x86\x4f\x50\x51\x39\x74\x45"
- "\xf2\x73\x9f\x72\xdf\x62\xde\xf1\x1d\xbe\xb2\xee\xc1\x58\xda\x52"
- "\x14\xa4\xab\x30\x57\xff\xb4\xda\x84\x77\x15\x31\xef\xe4\x1a\xc3"
- "\x84\x15\x1c\xb7\xee\x89\xa6\xc1\xe6\xfb\x57\x56\xdf\xc2\xa9\x83"
- "\xd7\xb7\x70\xbe\xac\x0f\x36\x15\xe6\x40\x19\x67\x69\xa1\x9c\x97"
- "\xc8\xf8\x36\x9b\x12\xc2\x7a\x59\x7f\x3f\x64\x90\xf7\x3f\xfb\x8a"
- "\xf2\x7f\xf8\x8a\xf2\x9f\xb3\x2e\x42\xfb\x2c\x11\x77\x2c\x9c\xf4"
- "\xb0\x91\xef\x34\xf2\x3d\x99\xa1\xaf\xc5\x7c\xea\x1c\x25\xe7\x68"
- "\x36\x03\x26\xf3\xdf\x76\xe4\x93\x31\x43\xa0\x2b\xa7\xaf\x25\x8e"
- "\xd7\x12\x5d\x76\xf6\x00\x8d\x9f\xa4\xcb\xac\xfb\xa5\xfa\xea\x48"
- "\xc6\xd0\x3c\x02\x9b\x14\x63\x1c\xc7\xed\xd3\xd7\x3f\x9e\xdc\x07"
- "\xbd\xd9\x18\xe5\x17\xdb\x05\x3d\x77\x23\xc7\x35\x60\xfb\xb2\x5a"
- "\xcd\x37\xbf\x01\xfd\x9c\xc9\xe7\x61\xf8\x6c\x4c\x51\xa4\xc0\x74"
- "\x44\xc6\x17\x7b\xd2\x6f\x94\x1d\x6c\x9d\x85\xeb\xd5\xeb\x64\x1f"
- "\xd3\x60\x8f\x7b\x51\x96\x51\x86\x61\xb3\x9f\x22\xc6\xe5\x1b\xe5"
- "\x99\xd2\x70\x17\xeb\xc2\x6f\xc0\x16\xcd\x54\xf5\x14\x93\xaa\x67"
- "\xd1\x4c\x3f\x2d\xb4\x5e\xee\x6c\xc6\xe0\xed\x5b\xb4\xf9\xca\xdb"
- "\x47\x7a\xfb\x16\x79\xbf\xa2\x7d\x97\xab\x37\x7c\xe5\xf5\x5a\xf5"
- "\x7a\x8b\x26\x5f\x39\x5d\x8b\xca\xbe\x3e\x5d\xf3\x74\xba\x16\x35"
- "\x7e\x05\x5d\x13\xd5\x73\xfc\xeb\xd7\x63\xd7\xeb\x29\x4e\x49\x54"
- "\x0f\xc9\xbf\x41\xcf\x4d\xa5\x18\x31\x2c\x39\x9e\xab\x8a\x2f\x57"
- "\x5c\x10\x1d\xab\x57\xc5\x79\x2d\x2e\x31\x62\xf5\xea\xb1\x64\xa1"
- "\xab\x8b\x37\x16\x35\xf2\xf8\x2e\x34\x3f\x15\x6f\xe6\xf8\xa8\xd3"
- "\x37\xa8\x33\xd9\x7a\x99\xba\xcb\xc5\x08\xe6\x98\x56\x42\x14\xd2"
- "\x91\x3a\xb9\xdf\x0e\xbd\x5e\xfc\x47\xf6\xbf\x57\xfb\x85\xc5\x27"
- "\x94\xdc\x17\xc3\x36\x2f\xce\x1d\x1c\xc6\xfc\xe2\x7d\x55\x79\x43"
- "\x06\xf3\xa9\xef\x71\x2f\xce\xf6\xd3\xf2\x54\xe9\x47\x9f\x79\x73"
- "\x3b\xe6\x0f\x7a\x5c\xbd\xa7\x77\x45\xc5\x10\xc4\x58\xf8\xd4\x6f"
- "\x75\xdf\x7f\xd0\xc0\x05\x5a\x2e\x9e\x67\xd0\xc0\x48\x47\x5a\xa9"
- "\x41\x03\xd8\x34\xa9\xbe\xc6\x30\x9f\xcd\x09\xaa\x73\xd8\x8b\xb7"
- "\x89\x9a\xf9\x05\x0a\xf6\xe2\x76\x65\xb7\xa0\xbe\xbe\x42\xb3\x9c"
- "\x2b\x55\xf1\x5c\xe9\x29\x47\x20\x63\x7e\x81\x81\x87\x58\x69\x33"
- "\xf1\x79\xef\x89\x61\x15\xa7\x8b\x6d\x02\x3e\x1b\x27\xdf\xaf\xcc"
- "\x35\x61\x6e\x09\x9a\x2c\xfe\x42\x74\x73\xbc\x18\x09\x3b\x15\x78"
- "\xd7\x31\x5c\x3f\xae\x81\xf5\xb9\x1c\xeb\x42\x6f\xcf\xe2\x7f\xd7"
- "\x6a\x6f\x6e\xd7\x7a\x6c\x26\x03\xdf\xbd\xf2\x1c\xeb\x53\x68\x7f"
- "\x91\xb4\xdb\x14\x3e\x36\x13\xfb\xf0\x6b\x99\xf3\x8b\xc5\x7a\x1b"
- "\x1d\x5c\xd1\x29\xe7\x4a\x5c\xe7\x44\x8e\x07\xc7\x73\x23\xd8\x23"
- "\x28\x37\xaf\x9f\x6e\x80\x2b\x7a\x0c\xba\x3d\x45\x6a\x2c\x56\x6d"
- "\x0c\xae\xb7\x99\x8e\x04\xe4\x19\x3b\x1a\x63\x77\x7e\xa9\x62\x3d"
- "\x3f\xe5\x31\x68\xd7\x8f\x13\xf0\xe1\x3c\xca\xa7\xe9\xa9\x26\x03"
- "\x27\x29\xaf\x99\x7c\x66\x77\xf1\x3e\x3e\x2b\xa4\xe8\x7f\x24\x15"
- "\x79\x8e\x5f\x4a\xff\xa7\x3a\xa3\xe8\x9f\xcc\xfc\xc6\xf4\xe7\xf5"
- "\x0d\xd0\x25\x03\xb4\x4c\x51\x67\x1c\xd8\x86\x79\x9a\xcf\xd2\xa7"
- "\x32\x9e\x5a\x8d\x41\xf3\x42\xb3\x5a\x1b\x7b\x7a\x56\x54\x3f\xa0"
- "\xbd\x36\xb6\xcf\x92\x8c\xf6\x73\x19\xa6\x01\xc7\x77\xe4\xba\x81"
- "\xcf\xd5\x3d\xee\xa7\x4b\xe2\xdb\xb4\x49\x9d\x1f\x21\xe5\x4f\xf2"
- "\xf4\xe6\x7e\xf9\x18\x21\x02\xe5\x76\x11\x52\x67\x91\x9f\x1e\x77"
- "\xb0\x2a\x60\x1e\x4c\xee\x99\x07\x65\xac\x48\x93\x5c\x4b\x80\x9d"
- "\xb5\x64\xad\x00\x6e\xaa\xef\x97\x7c\x5f\xa5\x95\xec\xc1\x15\x3c"
- "\xf6\xf4\x05\x81\xba\x03\x4e\x19\x57\x05\x6d\x5b\xb2\x83\x79\xce"
- "\xe0\x33\x5e\x7b\x54\x7e\xe2\x25\xf3\x59\x8f\x18\x34\x07\xfe\xc3"
- "\x7b\xdc\x25\x63\x0c\xfc\x8d\xfc\xdc\x77\x9c\x87\xf7\x69\x9a\xed"
- "\x21\xa9\x5f\xd5\x39\xa1\x92\x02\x43\x6e\xb9\x0e\xee\x67\xd6\x2f"
- "\x4c\x0f\x45\x8b\x12\x47\x2c\x2c\x9b\x49\xc5\xa7\x64\x9e\x87\x3c"
- "\xae\x0b\x0d\x41\x9e\x1d\x03\x30\x4a\xac\xea\x5d\x3f\x9e\xec\xdb"
- "\x2f\xfd\xef\x54\x7f\x94\x44\xb8\x5d\x03\xf8\xb2\xfc\x95\xf4\xf7"
- "\x3f\xbf\x0b\x3a\x6d\x1c\xcf\x56\xea\x95\xf2\x51\x8c\x6f\x80\xe3"
- "\xc4\x4a\x5e\x07\xfc\xe9\x8c\x3b\xe7\x31\xfa\x6c\x80\x17\x97\x64"
- "\x47\xc3\x11\x4e\x9b\xc9\xd0\x4f\x4a\x77\x04\x30\x4f\x25\xbb\xda"
- "\x63\x59\x32\x33\x0a\x67\xaf\x81\xcf\x80\x4e\x58\x52\x1a\xcf\x93"
- "\x5c\x37\xc7\xdf\xd3\x61\xb3\x2e\xb1\x9e\xa4\x25\xf3\x14\x5e\x4f"
- "\x1f\xe3\x7e\x1c\x6c\x4c\x33\xe2\x7c\xbe\xaa\x74\x08\xfa\x79\xe9"
- "\x9f\x5f\x55\x67\x87\x82\x2a\x96\xe3\x92\x7f\x17\xa6\x37\x99\x56"
- "\xbc\x86\x1e\x90\x31\x3a\xe4\xb9\xf2\x25\xf2\x8c\x79\xba\xe3\x4d"
- "\x19\x3f\x56\xf7\x07\x0c\x34\x3b\xc2\x32\x7e\x9f\xb3\x9c\xcf\xd9"
- "\x86\x79\x7e\x27\xfd\xdd\x8e\x94\x87\xe9\xd1\x10\xcb\xc4\xd2\x5c"
- "\x3e\x3f\x1f\x94\xb2\xb4\x74\x92\x71\x66\x9e\x63\x5a\x8a\x9e\x42"
- "\x82\x1e\x4a\x66\xbb\xc8\xee\xe4\x78\x07\xcf\xf0\xf9\x21\xd2\xfb"
- "\x97\xb6\x9b\x44\x9b\x92\xff\xa5\x1b\x64\x1c\x41\xb9\x77\x75\x12"
- "\x3a\x21\xf9\xef\x27\x69\xe9\x6b\x6a\xad\xc7\xd0\x51\xcf\xa4\xf1"
- "\xfe\x95\x5f\x87\x81\xba\x30\xfe\x2d\x36\x5f\xaa\x4b\x96\x6e\x30"
- "\xe6\x2b\x7c\xe6\x4e\xed\x85\x0d\xc0\xf3\xd3\xd2\x4a\xbe\x0e\xf4"
- "\xc1\xef\x18\x56\xd7\xa5\x7a\xe1\x19\x32\x64\xcf\x71\x13\x9f\xdb"
- "\x5e\xd2\xcc\xf5\x0f\x36\x5e\x08\xe7\x7c\xee\xa7\x94\x53\xf6\xc4"
- "\x7d\x93\x78\x6f\xed\x99\x12\xa3\x0d\x06\x4d\x54\x1b\x9e\xf9\xa8"
- "\x3b\x33\x27\x4a\x3f\x3f\xf3\x91\xa4\xc5\xc0\xfb\x0b\x51\xb4\xe1"
- "\xe7\xa0\x1a\xd7\x9e\x39\x08\xfe\xd8\xa7\x78\x4d\xa5\x41\x76\x1e"
- "\x15\xeb\xa1\x0b\x24\x8e\xcb\xc8\x90\x75\xe4\x85\xfd\xf7\x45\xb6"
- "\xda\xe3\x7a\x06\xed\x7f\x46\x8f\x9b\xf0\xcc\x16\xc6\x25\x61\x3b"
- "\x63\x70\x2c\x2d\x63\xfb\x42\xc5\x51\x28\x7d\x9e\xf1\xb5\xdf\xcc"
- "\x7d\x5c\x7a\xb7\xd4\xe1\x1c\x53\xa1\xaf\x74\x48\xb0\x2f\x97\xba"
- "\xfb\x4a\xa1\x17\x72\x4d\x3d\xee\x52\xe8\xff\x73\x21\x55\x67\x69"
- "\xb1\x81\x2b\xe3\x06\xbb\x39\xa5\x47\x2c\x4b\x4c\x5f\xae\x57\xc6"
- "\x79\x2a\x1d\x8a\x5f\x0a\x7e\x57\x7d\x9d\x38\x4c\xb0\xcb\x3b\x03"
- "\x35\xa3\xb7\x68\xab\xc5\x51\x8e\x27\x86\xb9\x47\x67\x35\x78\x37"
- "\x7d\xa3\x17\xb6\xf8\x93\xa6\xa2\xb5\x94\x8f\x39\x32\x89\x8b\x62"
- "\xf2\x5e\x0d\xd7\xd5\x62\x12\xc7\xeb\xc6\x73\x9e\xfe\x3c\x8e\x9f"
- "\xbb\x57\x8b\x85\x3d\xee\x65\x56\x63\x4f\x50\xc5\xc2\x59\x66\xef"
- "\x8f\x1f\x94\xfc\x04\x9f\x1f\xe2\x38\x53\x1a\xe6\x3e\x9d\x5c\x6f"
- "\x11\xcf\x5f\x51\x1f\xf2\x41\xfe\x8b\x65\x3b\x03\xc9\xb7\x65\xe2"
- "\x97\x3b\xc8\xde\x69\x27\xe3\xd5\x9d\x31\x7a\x8b\x81\x6b\x7a\x30"
- "\xdf\xf4\x35\x71\x3b\x60\xe0\x86\xf4\xa3\xd5\x2a\x3d\xcc\xf1\x0e"
- "\xd9\xb7\x11\xef\x8f\x19\xb8\x1a\x38\x70\x7d\x7c\x5e\x53\x64\xe6"
- "\x58\x39\xd6\x0c\xd7\x17\x58\xcf\xf1\x7d\x97\x85\x0c\x7c\xbf\x2e"
- "\x1f\x57\xd5\x0b\xc1\x63\x27\xeb\x5e\xfb\x48\xa2\xd6\x20\xeb\x93"
- "\x67\x67\x1d\xa9\x0f\xf2\xfa\x76\x26\xea\xc8\xe8\x16\xa5\xa4\xf5"
- "\x95\x26\xec\x5f\x2e\x83\xfc\x5b\xa4\x6e\xa8\xcd\xc9\xd0\xc4\x4c"
- "\xe8\x08\x94\xeb\x9b\xc9\x6b\x4b\x90\xd9\x67\x0f\x36\x57\x76\xf2"
- "\x19\x4b\xe8\x9b\x67\x0f\x22\x8f\x95\x6d\x2c\xcc\xaf\x58\x67\x25"
- "\xb3\x5e\xf2\xae\x9e\xc4\x30\x3e\x30\x57\x90\xb9\xb9\xe2\xeb\x7d"
- "\x07\x00\x70\xbb\x94\xdc\x3c\xdb\x65\xd8\x25\xb8\x0f\xc5\xee\x77"
- "\x3f\xeb\x8f\x9f\x9b\x3d\xf5\xc2\x0b\xe5\x45\x2b\x96\xf0\x25\x77"
- "\xec\xaa\x5b\x87\x47\xcf\xc1\x59\x07\xab\xf8\x08\xcf\x59\x79\xbd"
- "\xeb\xd5\x4c\x63\xff\xf6\xb9\xfe\xf3\x5f\xba\x9f\xf8\x7d\x3c\x97"
- "\x60\x9b\x1b\xef\xca\x7e\x5b\xb9\x41\xda\x40\x9f\xa6\x90\x29\xbe"
- "\xbe\xa5\x8b\xcb\x17\x97\xdd\xc3\x3b\x35\xc3\x13\xd5\xe3\x8a\xab"
- "\xe7\x50\x7f\x3d\x4a\x07\x06\x4d\x9c\xaf\xe6\xf5\x62\x91\xe1\x22"
- "\x75\x46\xf7\xb9\x13\xc6\x5a\x4a\x62\xff\xba\x9c\x82\x48\xed\x82"
- "\x26\xee\x17\xe7\x06\x32\xbd\xbf\xae\xdd\xc4\xb6\x4c\x15\xee\x79"
- "\x4e\x2b\xd7\x66\xf4\x38\x45\x1f\x9f\x6f\xc7\x18\x53\x96\x27\x6a"
- "\x72\x30\xbe\x97\xe5\x0e\x36\x8f\x8d\xf6\x4d\x60\x5f\xb6\x0e\x2a"
- "\x9b\x39\xa8\x1f\x81\xe7\x66\x3d\x26\x76\xd9\x9e\x66\x1b\x71\xbf"
- "\xff\xe8\x24\x95\xed\x32\xdb\x30\x8e\x8c\xa4\x7f\xc2\xfd\x1e\x2e"
- "\xcb\xef\x62\xfa\x39\xe7\x4c\xa3\x19\x5c\x08\x6e\x4c\x12\xea\x8f"
- "\xcc\xfa\x4d\x32\x7e\x26\x91\x24\x77\xd9\x92\x41\xe1\xa1\x57\x99"
- "\xc9\x92\x9e\x9a\x72\xe3\x0d\xd9\xb6\xfb\xee\x9d\x32\xd9\x59\x55"
- "\x09\xe9\x0d\x87\x2c\x22\x3a\xae\x96\x73\xff\x63\xb7\xba\x48\xfa"
- "\x59\xd4\x38\xf7\x27\xc2\x75\x9b\x5b\x38\xf8\x4c\xb3\x96\xb9\xb3"
- "\xcd\xb9\x8a\x4c\xef\xf5\xfa\x4d\x1c\x3b\x9e\x6d\x2c\xfe\xb6\xc0"
- "\x49\x7a\xfe\xd6\x4f\x90\x86\xf6\x57\x08\xcf\xce\x36\x65\x9b\x3c"
- "\xbf\x4c\xab\xdd\xd9\x36\x00\xdf\x4c\x0c\xdf\xb9\x8b\x4c\xfb\xaa"
- "\x3a\x4d\x3e\xf3\xbd\xe4\xb3\x07\xe9\x13\xdc\x27\xa4\x25\xea\x64"
- "\x7b\x87\x61\x34\xb8\xb5\x2d\xce\x2f\xc9\xa4\x9f\x4b\x34\x9d\xa5"
- "\xe7\xdf\x6c\x1a\xa4\x1c\x9f\x03\xee\xce\x1c\x3d\xa7\xc7\xfd\x3c"
- "\xfa\xff\x7e\xb3\x3e\xde\x41\x2f\x3f\x0f\xfe\x2f\x93\xfa\x1f\xef"
- "\x67\x77\xcb\xd8\xc2\xcb\xc9\xc8\x93\xb0\x8f\x7e\xcc\x6b\xb3\xc2"
- "\xcb\xfd\x2a\x2e\x7e\xde\xc9\x67\x1e\x06\xf1\x8f\x18\xea\xab\xb8"
- "\x83\xf7\xa8\x86\xa4\x87\x28\xd5\x79\x41\xf4\x45\xdc\x94\x05\x76"
- "\x37\x45\x30\xa7\x0e\x5f\x14\x85\x2d\x5d\xe7\x65\xac\x4b\xd6\x1f"
- "\xef\x2e\xfd\x9d\xc9\x17\x3a\xe7\xf5\x6d\xd6\xa8\x15\xb6\x87\xaf"
- "\xfe\x9c\x57\xc5\xc4\x8c\x50\x0b\xfd\x85\x5a\x2a\xfe\x5f\x97\xcf"
- "\xf5\x17\xa4\x0b\x17\xd3\xb9\xef\xa2\x98\xe7\x33\xff\x3f\xc4\xdf"
- "\x3e\x61\x5d\x08\xba\xdb\xcf\xd2\xf2\x3f\x7c\x0c\x38\xef\xfd\x07"
- "\x60\xc9\x58\x5a\x53\xe9\x13\xdc\xa3\x4d\xc7\x0d\x3d\x99\x30\x06"
- "\x49\x92\x77\x9b\xa5\xe2\x49\x93\x06\x9d\xcb\x31\xcf\xa0\x6b\x27"
- "\x71\xbb\xf0\x9c\xc7\xcf\xb8\x8e\xe3\xab\x65\xa3\x77\x8f\x25\xfc"
- "\x24\xeb\xe0\x42\xd6\xaf\x48\x9f\xd7\x70\x51\xea\xe4\x02\xfd\x79"
- "\x96\xfe\x3c\x53\x7f\x9e\xae\x3f\xe7\xeb\xcf\x53\xf8\x59\xe9\xee"
- "\x17\x4a\xfb\xc7\x15\xd3\xd0\x36\x3c\x57\x18\x7d\x01\x7c\xd2\x2c"
- "\x15\x1b\xe4\x18\xa0\xe3\x31\x49\xc7\x2b\x4f\x7f\x36\xf0\xc9\xb1"
- "\x84\x37\xfc\x4f\xe1\x13\x8a\xc5\xc7\x91\x12\x85\x0f\x59\x2a\xf2"
- "\xbf\x0e\x3e\x56\x0b\xc7\xe7\xff\x6f\xe0\xc3\xb8\x70\x1a\xea\xdf"
- "\x12\x87\x4f\x9d\x81\x4f\x42\x7e\x5b\x2d\x3a\x79\xfc\x5b\x79\x9d"
- "\x8c\xf7\x3b\x94\xc7\xb6\x86\x5e\x23\x7e\x9d\xe3\xf8\xe5\xe2\xd7"
- "\x41\x16\x6c\xc8\x83\xf6\x3b\xf6\xe9\xe3\xfc\x61\x65\x0b\xbe\x98"
- "\x6a\xf8\x14\xa1\xad\xfb\xab\x55\x5b\x0f\x6c\xe6\x18\x6e\x6b\xe9"
- "\x7a\x67\x85\xe8\xc4\xdc\xec\x7f\xf3\xfc\x21\x1a\x6e\x59\xf9\xca"
- "\x95\xcf\xdf\x63\x2f\x5b\xbc\x7c\x89\x7d\x6c\x89\x7d\x65\xe9\xb2"
- "\xa5\xe5\x4b\x62\xf7\xd9\xad\xfa\xf7\x52\xe4\xf9\x01\xb6\xb7\xe5"
- "\x7c\x0b\xfc\xcf\x7a\x5b\xf9\x7c\xbe\xd8\x22\xdc\x2f\x4e\x66\x5d"
- "\xbf\xb7\x96\xcc\x7c\xa6\x18\xf8\xd4\x1b\x3a\xde\x98\x23\xb1\x8e"
- "\x47\x3a\xec\xbf\xe5\x93\xa2\xd2\x39\xef\x51\x23\x8d\xe1\xeb\xba"
- "\x69\xe8\x49\x7a\x71\x19\xd7\x99\x90\x86\x17\x45\x23\xc6\x57\xfe"
- "\xde\x80\x09\x3a\x45\x70\x3c\x26\x3e\x97\x87\x72\xe2\x14\xad\xb8"
- "\x8e\x75\x2f\x7f\x93\x47\xd9\xf5\x02\x38\xae\x18\x8f\x32\xfb\x90"
- "\x66\xde\x8e\xbc\x98\x2b\x74\x72\x39\xa4\xcf\xe0\xf8\x08\x48\x4f"
- "\xd1\xe3\x4c\x71\xda\x7c\x8e\x5f\x80\x34\x6b\x54\xda\xf3\x1c\x2b"
- "\x1d\x69\x76\x1d\xde\x06\xa6\x33\x9e\xf3\xf5\xb5\x14\xce\x53\xa3"
- "\xd7\x1b\x13\xff\x8c\x3f\x9e\x71\xc7\x84\x3c\xfb\xbc\x47\xbf\x35"
- "\xf5\xde\xa7\x5f\x58\xbe\x74\x38\x49\xb2\xe7\x62\xb8\xcc\xbb\xa3"
- "\xe2\xd6\x7b\xec\x8e\x25\x4b\x56\xd8\xd7\x2c\x59\x5e\x6e\x5f\xbc"
- "\x66\xf1\xda\xe1\xb4\xf4\x85\x15\x4f\xf3\xe9\x7b\xee\x96\x95\x45"
- "\x4f\x2f\x7d\x86\x9d\x21\x54\xee\xe1\x31\xe3\xf8\x3c\xd6\x6d\x7a"
- "\xbc\x8a\xa3\xd5\x6c\x6b\x64\xdc\xd2\x84\x7b\x8e\xe3\x64\xc3\xb5"
- "\x19\xbf\xc3\xf8\x1d\xc2\xef\x38\x7e\x6d\xa7\xa9\x62\x21\xae\x07"
- "\x7b\xdc\x2b\xa7\x18\xf6\xc4\x00\x0f\xad\x2c\x30\x78\x08\xe3\xff"
- "\x41\x35\xbe\xad\x74\xb5\x86\xa5\xfc\xf4\xf3\x54\xf5\xc5\x01\x9e"
- "\xe2\x38\x94\xad\xec\xeb\xb3\x1a\xef\xc1\xc3\xa0\x3f\xcf\xab\x87"
- "\x31\xdd\x4e\xd1\xea\x55\x98\x8f\x1f\xe3\x18\x2a\xb8\x36\x83\x5f"
- "\x8e\xa9\xb8\x25\x2b\xc3\xc8\x37\x0a\x75\x1c\xd6\xeb\x50\xcf\x23"
- "\xc4\x51\xfe\x76\xc6\x49\xfd\x99\x61\x01\x46\x1a\xdf\xf3\x55\xdf"
- "\x53\xb3\xb0\xdf\xa4\x9a\x37\x1a\xef\xca\xdf\xd6\xeb\xf0\x82\x16"
- "\xae\xbd\x6e\xb9\xf6\x27\xe7\x57\xbc\x76\x68\x49\xba\x4f\x00\x9f"
- "\x73\x5a\xf2\x13\xed\x32\x2e\xa2\xab\x17\x3a\xe2\xce\x3b\x7d\x15"
- "\x32\x7f\x12\xaf\x2d\xce\x71\x08\x8d\xe3\x53\x6b\xc9\xcf\xb5\x73"
- "\x39\x61\xbd\xa5\x49\xdb\x9e\x96\xaf\x6c\x01\x8e\x47\x57\xee\xd2"
- "\x61\x86\x98\xb6\xa7\x69\xe5\xed\x6a\xae\x56\xb1\x50\xd9\x67\xe5"
- "\x5b\x0d\x1f\x3c\xc8\x68\x2e\x9e\xeb\x0d\x1d\xe0\xa7\xf2\x52\xdd"
- "\x5f\xca\xab\xda\x5f\x7e\x5c\x7f\x3e\xa4\xe3\x98\xc4\x31\x32\x80"
- "\x7f\x1b\xf7\x1d\xe6\xbd\x87\x70\x7f\x1c\xf4\x39\xa6\xe8\x53\x2e"
- "\x6d\x40\xd8\x35\xfc\xfe\x38\x7f\x67\x04\xef\x8e\xab\xf8\x13\xe5"
- "\xa9\xdc\xe6\x01\x9f\xca\xfa\x7c\xe0\x9a\xc6\x7b\x8f\x90\xa5\x43"
- "\xbe\x8b\x2c\x9f\xe5\x1c\xcb\xb2\xc9\xd0\x3b\xac\x67\x8a\x22\x90"
- "\x53\x69\x77\xaf\x9a\x6e\xe8\x9b\x01\x3e\x58\x55\x98\x48\x97\x24"
- "\xea\x77\x45\xff\x55\xbf\x15\xee\x15\xf5\xc0\xa9\x49\xf6\x01\xc7"
- "\xe9\xbc\xd8\x6f\xdf\xf7\x29\x1d\xb9\xea\x40\xff\x5c\x44\xc7\x83"
- "\x63\x7e\xfb\x19\xb7\x5e\xb9\x1f\xac\xeb\x8d\x55\xc7\x0d\xbd\x61"
- "\xc0\xb1\x24\x09\xcd\x52\x81\x7f\x9e\x9c\x00\xaf\x9d\xf3\x78\x29"
- "\xed\x11\xc0\x49\xbf\xa0\xce\x46\x69\x35\x39\x01\x3f\xad\xda\x0a"
- "\x1d\x63\x96\x36\xa7\x7b\xc5\x7b\x03\xba\x68\x75\x6e\x34\x4c\x61"
- "\xcd\x09\x30\x5c\xd6\x47\x6c\x93\x14\x45\xcc\x1c\x9f\x24\xa0\x8f"
- "\x2f\xd0\xc1\xab\x0b\x0d\x5c\x41\xc3\xa3\x06\xbe\xfa\x37\x9e\xa0"
- "\xab\x56\x1d\x9a\x1b\xe9\x63\x1f\xe1\x66\xd5\x9f\x15\x52\xdf\xe0"
- "\xdd\x01\x94\xdd\xe1\xa7\x17\x3b\x75\x19\x3a\x86\xf2\x07\x8e\x54"
- "\x4d\x47\x9e\xd5\x4d\xba\x9f\x6b\x1b\xfa\xf7\x78\x14\xef\xbf\x1d"
- "\xb5\x16\x70\x5c\xf5\xe1\xbd\xae\x93\xb4\x3a\x10\x95\xae\xf7\xed"
- "\x91\x82\x93\xb4\xe6\x6d\x35\xaf\xce\x69\x52\xe5\xd7\xa8\xb3\x2b"
- "\x3a\x8e\xac\x0b\xf8\x1c\x17\xcb\xb8\xa4\xbd\xec\xe3\x35\xb9\xc6"
- "\x78\x01\x58\x07\x25\xcd\x47\x88\xc3\x4c\x27\x15\x07\x62\x45\xab"
- "\xa2\xd3\x9a\x82\x18\xda\xf3\xb8\x89\x7a\x98\x4e\xe9\x1b\x85\x96"
- "\x1e\x4c\x12\x45\x6b\xcd\xc4\xf2\xc2\x32\xce\x7b\x46\xe0\x0f\x69"
- "\x57\x29\xba\xad\xf1\x18\x74\x33\xfa\x8e\xe9\xe4\xa7\x35\xc4\xb4"
- "\x8d\x6d\xe3\xd0\xb6\x93\x46\xdb\x41\x53\x5e\x07\xc7\xf3\x3e\x5d"
- "\x2e\x8e\x79\x47\xb2\x4f\xc1\xca\x9f\x1d\x31\x7f\x8b\x8e\x54\x4c"
- "\x22\x45\xdb\x35\xe8\xe3\x17\x0b\xa2\xe6\x0d\x47\x99\xbe\x2c\x2b"
- "\xc0\xb3\x4b\x8f\xc9\x74\x54\xf9\xb7\xac\xdc\x07\x7b\x5f\xae\xd7"
- "\x30\x6d\xba\x4d\x32\x9e\x6b\x1b\xd3\x88\xf5\x22\xcb\x12\xcb\x00"
- "\xcb\x93\xa2\x51\xc5\xac\x28\x1a\x35\x33\x7d\x74\x3a\x1d\x8c\xd3"
- "\xe5\x4b\xec\x65\x53\x95\x2e\xb6\xe7\x8e\x2d\x99\x28\x03\xa0\xd8"
- "\x1f\x9c\x76\x8f\xbd\x60\xea\xd8\x8a\xd2\x71\x73\xd4\x65\x5a\xc1"
- "\x2c\xbe\x0e\x8f\x9d\x77\xd9\x51\xcf\xc1\xd8\xb9\x5b\x55\xbe\xd2"
- "\x1f\x15\xc7\xfc\x49\x57\x37\x71\x3a\xc7\x23\xad\x5e\x4e\x14\x01"
- "\xde\xdb\x4f\xa3\x4f\xad\x39\x5b\x39\xfe\xed\x5c\xcc\x19\xe7\x5c"
- "\x10\x5f\x36\xe0\xdd\x5e\xa4\xa7\x3b\x38\x6e\xfe\xdf\x84\x96\x91"
- "\xb3\x95\xe7\xf6\xa2\x26\xbd\x20\x90\xe1\xdc\x8f\x9f\x23\x90\x31"
- "\xba\x78\xc6\xad\x4e\xd1\xe3\x5e\x3b\xc6\x68\x17\xaf\x01\x80\x4e"
- "\x5b\xe7\x56\x88\x08\xd3\xa8\xa8\x82\x63\x54\x03\x76\x32\xaf\x01"
- "\xac\x45\xfb\x9f\xdf\xa2\xe6\x97\x6b\xc1\xff\x2b\xba\x74\x5d\x56"
- "\x80\x67\xd8\x7f\x77\x49\xdc\x34\xb7\x4d\xc6\xb6\xd6\x36\xdd\xf6"
- "\x08\xe6\x03\x0e\x03\x26\x60\x5d\xa5\xc7\xf0\x93\xf0\xbe\xae\xbf"
- "\xa5\x56\x7b\x43\xbd\x25\x49\xc5\x0b\x84\x8c\xbb\x1a\x4c\x5a\x61"
- "\xbf\xff\x04\xde\xa5\x6f\xb4\xb2\x7f\x45\x21\x78\x8f\x63\x8e\xf6"
- "\xbf\xab\x76\x6b\xfe\x6a\x93\x16\x42\x3f\x5a\x95\xfd\xdc\xc5\xfa"
- "\x13\x73\xcb\x75\x59\xc6\xb8\x26\xc7\x43\x13\xb9\xd4\x7c\x66\xdd"
- "\x5d\x5c\xee\xbc\xdb\x8c\x39\x43\xc5\xbe\x9b\xb2\xe4\x1c\x25\xa4"
- "\xb9\x93\x48\xf9\xb8\xae\x1b\x66\xe8\x58\xde\x47\xb3\x6c\x14\x01"
- "\x5e\x47\xb4\x84\x45\x40\xc6\x60\xe7\xb1\x83\x4e\x93\xaf\xb2\xc7"
- "\xc5\x3e\x76\xd2\x06\x42\xbd\x6a\xdc\x88\xa8\x71\x03\xf5\x07\x92"
- "\x6f\x2b\xc6\xf8\x90\x74\x9a\xd6\xb6\x33\xfe\x4c\x1b\x5e\x8f\xd7"
- "\x40\x2b\x1f\x8f\x93\x4c\x9f\x4c\x7b\x36\xfb\x46\x70\x5b\x2d\x61"
- "\xb4\x39\xba\x5d\x26\xcd\xbf\xdd\x8d\x76\x99\xd0\xae\x8a\x33\x2c"
- "\x33\x21\xf6\x59\x81\xbc\x8d\x90\x71\x8e\xe5\xfc\x79\x5d\x28\xba"
- "\x8d\xac\xff\x55\x1b\xd6\x5f\x97\xa8\x8d\xc2\xc4\x6d\x94\x34\x38"
- "\xa3\xcb\x9b\xc4\x93\xf5\x47\x17\xad\x3b\x90\xbe\x91\x7d\x45\x72"
- "\xb6\x42\xbf\x4d\xe3\x3e\xc4\xf8\xe9\x61\x3c\x13\xf5\x17\xc3\x53"
- "\xb0\xd6\x1f\xb2\x6c\x74\x15\xf7\xb8\xd7\x6f\x4e\x4c\xef\xf5\x6f"
- "\x5f\x9e\xde\xeb\xd7\x72\x79\xc6\x83\xf7\x00\x2c\x61\x4c\xd6\xc1"
- "\xb7\x98\xaf\x6d\x49\x54\x6f\xfa\xc6\x46\xc6\x2b\xe1\x3b\xc1\xf2"
- "\xa2\xeb\x20\xf0\xa1\x80\x9c\x08\xd6\x49\x3d\xee\xca\xfe\xf5\x2f"
- "\x4b\x92\x3d\x59\xea\x07\x93\xf0\x24\x82\x61\xd9\xe8\xe1\xbd\x90"
- "\x69\xa8\x3f\xe1\x7b\x8d\xbf\xe9\xe0\xc9\xa9\xd0\x36\x7d\xf3\x26"
- "\x4b\x12\xdd\x17\x48\xfe\xe6\x70\x4b\x45\x78\x0c\xd3\x10\x30\x2b"
- "\x20\xc7\xe3\x79\x9e\xaa\xd6\x2e\x2a\x61\xff\x6f\x93\xf1\xb8\x03"
- "\x19\x39\x15\x6a\x6f\xa1\x12\xe3\xdf\x8e\x59\xc6\xfa\x2d\x9e\xa1"
- "\x5f\x3e\x2b\x53\x72\x79\xfd\x1b\xa2\x76\xf4\x38\xcd\x6d\x11\xf6"
- "\x75\x16\xd8\x91\x1b\x1e\xd3\x04\xc7\xf9\x1f\x3d\x6e\x80\x4f\x94"
- "\x1f\x8d\xc1\x27\x28\x1f\x4e\xcc\x03\x1b\x72\x2e\xcf\x03\x95\x5f"
- "\xf0\x7b\xa6\xbb\x9a\xab\x6c\x98\x6e\xd8\x29\x62\xd3\xf5\x6f\xd8"
- "\xab\xb8\xfe\xca\x76\x55\x37\xd3\x24\x9f\xd7\x63\x66\x81\x2e\x2e"
- "\xe4\x75\x18\x7a\x80\xf9\xc5\x12\xe1\x6f\x20\x90\xe4\x69\xbc\x83"
- "\xfd\xe3\xf0\xab\xb5\xd2\xd1\x9d\xf2\x7b\x81\xee\x8a\xd2\x80\xb3"
- "\x74\x37\xc6\x61\x0a\x66\xe4\x80\x6f\x37\x34\xf9\xc9\x2b\xe3\x19"
- "\x61\x0c\xee\x02\x8c\xc0\x0e\xe5\x27\x9b\x22\xe3\x08\x41\xa6\x39"
- "\x76\x10\xcb\x35\xd2\xb2\x80\x37\xc7\x11\xc2\x7c\x67\x43\x67\xff"
- "\xb8\xe4\xce\x87\xae\x10\xf2\xdb\x3b\x18\x97\xb2\xbb\x41\xbb\xd7"
- "\x4c\xda\xfe\x8b\x13\x6d\xc4\x6d\xbe\xb8\x69\xe4\xfe\x1f\x4d\x20"
- "\xf3\xff\xb2\x3d\x45\x8e\x3b\x28\x6b\xe3\xb7\xcc\xf4\x9f\x93\xc9"
- "\xc4\x74\xf0\xd3\x86\x90\xa2\x5d\xd5\x64\xa3\x7f\xfc\x54\xd9\x28"
- "\x75\xe7\xa6\x27\x3a\xe7\x86\xc5\x97\x6a\x3d\xb4\x0a\xfa\xef\xd9"
- "\x36\xf5\xbe\xc2\x1b\xbf\x06\xc4\xf6\xbc\x7d\xd9\x4a\x7b\xc9\x0b"
- "\x6b\x96\x8f\x1a\x15\x33\x57\x32\xcb\xb3\x31\xee\xaa\x32\x35\x9e"
- "\x56\xf5\xc7\x3f\x62\xbb\x04\xcf\x68\x7f\xc5\x25\x31\xce\x67\x15"
- "\xe9\xee\xcf\x45\x79\x34\x70\x7f\x3b\xcd\xba\x3d\xea\xf1\x4e\x9a"
- "\x75\xc7\x9d\x45\x8f\x2c\x59\x5c\xb2\x36\x2a\xf5\xae\xe8\x75\xbd"
- "\xea\x37\x50\x77\xf2\xc8\x07\xa0\x2b\x92\xe6\xac\xe7\xb1\xc5\xf9"
- "\x5a\x55\x58\xfc\x1d\xfa\x7a\x32\x64\xac\xa8\xa5\x3c\x4c\x2d\xd0"
- "\x65\xe2\x7a\xd6\xe1\x43\xd5\x99\x3f\xd8\x53\xe0\x2d\x0b\xda\x1e"
- "\x80\x5d\x77\x81\xd7\x67\x50\xee\xc3\xd6\x3a\x8e\xf5\x3b\x5a\x8f"
- "\x63\xee\xe4\x18\xd8\x19\xb8\xee\xc1\xf5\x2a\x5c\xdf\xb4\x2f\xc7"
- "\xbc\x87\x7d\xac\x57\xb3\x8f\xb5\x53\xfa\xba\x4c\x08\xba\x88\x7d"
- "\x45\xf0\x7e\x1c\xdb\x20\x7e\x72\xf2\xf7\xc1\xf8\x9b\x74\xf9\x48"
- "\x5b\x65\x7f\x96\xf2\xf8\x2a\xe4\xfe\x11\x66\x60\x35\xa3\x4b\xc5"
- "\xee\x42\xfe\x96\xd6\x18\xa4\xff\x7b\x72\xd2\xa7\x94\x6c\x1b\x1a"
- "\xe9\x71\x3b\xdb\xfd\xf4\xdc\x56\xa6\xd3\x60\xdf\xfe\x64\x3a\xc7"
- "\xdb\x87\x03\xb6\xe1\x8f\x49\xda\xb7\xba\x3d\xb7\x57\x8e\x0b\xae"
- "\x71\x51\x36\x1d\xef\x5f\x0e\x57\xf6\x89\x88\x28\xfb\xd4\x35\xcb"
- "\x90\x03\xdc\x17\x1a\x7c\x1a\x13\x77\x6d\x79\xf9\x92\x15\x4b\x4a"
- "\xec\x63\x57\x0e\xa7\xa8\xa8\x6b\xa5\x4b\x96\xdb\x57\x2c\x79\x71"
- "\xd5\x92\x95\x32\x62\x1a\xbf\x8d\x19\xf3\xb3\x44\xe6\xa8\x7a\xe3"
- "\x3c\x90\x7d\x24\xd3\xd7\xf5\x11\xc7\xea\x12\xb5\x37\x65\xb3\x4f"
- "\x87\x9a\x6f\xec\xec\x8c\x9d\x6f\xb8\x0b\x94\x9d\x37\xba\x50\xcd"
- "\x75\x36\x7e\xc6\xcf\x27\x69\x63\xe9\x40\x5c\xf0\x8d\xd7\x81\x96"
- "\x26\x45\xb7\x94\x53\x3d\xee\x8d\x56\x83\x6e\x7e\x72\xd7\xe9\xb6"
- "\x54\x97\xd4\x1f\x18\x63\xa1\xff\x62\xc6\x57\xf5\xcd\xcf\x8d\x36"
- "\xf0\x46\xb2\x5c\xef\xcd\x18\xbd\x90\xeb\x62\x98\xa7\x50\x1e\xfd"
- "\x83\x72\x76\xd6\x6f\x5b\x0c\x78\xa8\x93\xb8\x3e\x7d\x1e\xf4\x0d"
- "\x94\x97\xfb\xe1\x9a\x67\xf4\x42\xd6\x29\x1c\x5b\x42\xab\x19\xbd"
- "\x50\xed\xe3\xb9\xeb\xd8\xc6\x94\xb1\xe9\x01\x8b\xd7\x69\xa1\x1b"
- "\xca\xf8\xfb\xb0\x9c\xa6\x62\x86\xb9\x4a\x78\x6d\x18\x75\xcd\x03"
- "\xfe\x6d\x03\x3e\xef\xee\x3a\xb6\x3b\x19\xae\x9f\x36\xee\x60\x78"
- "\x2a\x26\xda\xc6\xa0\x9f\xaa\xc2\x03\xf6\x93\x7b\x72\xd4\xbc\x0c"
- "\xf8\x28\x3c\x83\xc0\x45\xc6\xdf\x54\x3e\x88\xb2\xdd\xac\x3f\x77"
- "\xe8\x6d\x37\xda\xd3\xe3\x76\x43\xff\x39\x3b\x8d\xbd\x75\xbf\xde"
- "\x6e\xc6\x8f\x71\x8f\xc6\x59\xc7\xd7\xc1\xf8\xa2\x5c\x65\x94\x6c"
- "\xf3\xba\xcc\x10\xa4\x79\x06\x7c\x9b\x5d\xed\xf1\x7a\xe3\x85\xe5"
- "\xf6\xb2\x65\xcb\x9f\x2b\x5a\xb3\xf8\xb9\x25\x45\xab\x1c\xe3\xec"
- "\xab\x96\x3f\x55\xf6\xc2\xd3\xcf\x31\xd7\xac\x2c\x5f\xf5\xf4\x73"
- "\x76\xd6\x2c\x45\xd3\x67\xcd\x2a\x7a\xe0\xb1\x47\xe7\x0f\xa7\x07"
- "\x16\x23\x0d\x33\xff\x59\x79\xe3\xd4\xab\x47\x66\x4c\x7b\xbc\x68"
- "\xda\xdc\xc7\xe6\xcc\x93\x87\x21\xfa\xdf\x4f\x5f\x9e\x38\x43\x0c"
- "\x1f\x5a\xc1\x4b\xf3\xd0\xbf\x43\x4e\xd2\x0f\xb3\x54\x1c\xed\x4d"
- "\xd3\x63\xe3\x68\x6f\xc2\x5c\x76\x13\xac\xcc\x4d\x3b\x88\x36\x1f"
- "\xc5\x0f\xf3\xd4\x1f\xa6\x28\xfe\x1a\x36\xb7\xc7\xbd\xc9\x31\xc0"
- "\x5f\x3f\xcc\x92\xfb\xe3\x75\x72\xdf\xd9\x84\x77\xd0\xff\x2e\x4f"
- "\xf4\xbb\x81\xf9\xe4\xa6\xfd\xfd\xf3\xc9\x7e\x9d\xb2\xe9\xb8\x31"
- "\xb7\x44\x5a\x31\xe6\x95\xc3\x78\x5e\xa9\xd6\x93\x7e\x78\xad\xe4"
- "\xa9\x41\xe5\x3b\x85\x8c\x79\x25\xcb\x36\xef\x13\xab\xf9\xc7\x66"
- "\x6b\xb4\x8c\xcb\xd8\x8d\xba\x8c\x73\x39\xb9\x7e\x67\xdd\x79\x9c"
- "\xd7\xb4\x61\x1f\xcf\x83\xad\x80\xf1\xab\x47\x88\x8c\x9d\xc7\x15"
- "\x4e\x9b\x0b\x78\x8d\x9b\xed\x66\x9d\x9f\xd2\x4f\xd3\xe6\x6d\xc2"
- "\xed\xde\xa7\xe6\x94\xee\x3f\xb3\x5e\x17\x9b\x46\x3e\xc0\xfe\x27"
- "\x3c\x77\x42\x9d\x9b\x07\x78\xf6\x87\x59\xcc\x0b\x03\x73\xd9\xcd"
- "\x31\xfa\xbf\x5b\x7e\xaf\x6e\xf3\x41\x23\x0e\x40\xf9\x28\x32\x99"
- "\x47\x79\x68\x87\x49\xb8\xfc\xb4\xb9\x84\xeb\x60\x7a\xfa\x69\x93"
- "\x0b\x79\xcd\x03\xf4\xdb\xdc\xd9\x4f\x3f\x7d\x9d\xc5\x58\x63\x51"
- "\x78\xff\xf0\xda\xc1\x68\x95\x98\x4e\x2f\x4d\xfe\x4a\x3a\xb9\x69"
- "\x08\xcb\xa4\x41\xaf\x4b\x69\xf5\x52\xe5\xa5\xb4\x7a\xa9\x25\x8a"
- "\x56\x17\x2e\xa5\xd5\x4b\x4d\x51\xfb\x3e\xfa\x3a\xca\x0f\xaf\x65"
- "\x9a\x31\x8f\xa1\xdd\x25\xe0\xb3\x97\x07\xe8\xf7\x92\xff\x52\xfa"
- "\xbd\x14\x4c\x4c\xbf\x97\x3c\x37\xc5\xc2\xa9\x4e\x34\x6e\xa4\x6f"
- "\x34\xe9\xe7\x84\x7e\xb8\xac\x39\x5b\xce\x49\x43\xaf\x9a\xb4\xd2"
- "\x57\xdd\xf8\xe1\xca\xf3\x88\x01\x5b\x5c\x84\x74\xfa\x96\x36\x63"
- "\xce\xcb\xeb\x4a\x97\x19\x8b\x4e\x18\x6b\x1e\xb8\x6f\xe7\xb9\x33"
- "\x7f\x2b\x88\xd3\x99\x9e\xfc\xed\x29\xf0\x7b\xbb\xb2\x4b\x7f\x78"
- "\xa8\x7f\xcd\x65\xc2\x0d\x79\xc9\x1b\xc9\x7e\xa4\xfe\x0e\x4e\x6f"
- "\x03\x0f\xc9\x35\x24\xf6\xef\x19\x0c\x66\x51\x24\x9f\x12\xc3\xfd"
- "\x51\x3f\xff\x0f\x76\x56\x36\x4e\x1f\x95\x2e\x5e\x5e\xf2\xc2\xd2"
- "\xa5\x5f\xad\x8a\xa2\x7d\x77\x3c\x6e\x6d\x4b\x0f\x7f\x8f\x71\xd3"
- "\xb3\xeb\x50\x27\xec\xff\xe7\xbd\x6a\xdc\xfc\x11\xf4\x5f\x69\x85"
- "\xb2\x25\x9f\xe8\x54\xe7\x83\x7f\xd4\x15\xa5\x9f\xc1\x23\x3f\x0a"
- "\x09\xf7\x8f\x26\x0d\xf4\xf1\x8f\x9a\x2f\xed\xe3\x1f\xb5\x27\xee"
- "\xe3\x1f\x85\xb5\xd5\x7c\x3e\xe3\x47\x3c\xff\x91\xb6\x26\x3f\xf3"
- "\x7e\x39\xe6\xcc\x9d\x98\x2f\x77\xcd\x5d\xeb\xbd\xaf\x68\x6d\x12"
- "\xfb\x95\xcb\x6f\x72\x84\x2f\x8a\x0e\xde\xb3\xe6\xfd\x31\xfe\x26"
- "\x07\x7f\x8b\x87\xbf\xd5\x2a\xf3\xe0\xbe\xfa\x14\xc9\xb9\x23\xde"
- "\xdb\x1b\x4e\xc9\xef\x12\xc3\x56\xd8\x52\x68\xd8\xd6\x96\x8d\x76"
- "\x79\x6e\x79\xbb\xea\x8f\x76\xee\x0b\xae\xaf\x68\xad\x57\xd5\x71"
- "\x91\xbf\xb7\x45\x16\x65\x43\x6c\xf1\x5c\x76\xed\x3e\xc3\xe9\x19"
- "\xd4\x1f\xca\xed\x1a\xfa\xaa\x8a\x69\xcd\xbe\x9c\x01\xc3\x57\x87"
- "\xfd\x0a\x01\xb7\x33\xde\x2f\x51\xf9\x97\xbc\x4c\x86\xdf\x0e\xee"
- "\x53\xfb\xe7\x03\xfc\x1d\x17\xcc\xe3\xec\x55\x1b\xaf\x3a\x4b\x5b"
- "\x5a\x1a\x06\x59\x43\x37\xce\x29\xeb\x7e\x3e\x43\x01\xa3\xdf\xff"
- "\x11\xe3\xdc\x50\xd6\x17\x03\x3e\x8d\x2f\x97\x45\xf9\xae\x05\x78"
- "\xec\xe5\x6f\xc5\x9c\xa2\x97\xb7\xc9\x6f\xd3\xdc\xc4\xeb\xdf\x2f"
- "\x1f\x50\xdf\x05\x7e\xb9\x2e\x1a\x17\x85\xc7\xcb\xf3\x79\x8d\x96"
- "\xdf\x47\xe3\x52\xb1\x78\xd5\xb2\x89\x15\x4b\x97\xd9\x9f\x2e\x5d"
- "\xe6\x28\x5a\x26\x63\xcb\xca\xb0\xb5\xe5\x6b\x1d\xbc\x23\x71\xeb"
- "\xf0\xb8\x31\x4c\xf7\x9d\x34\x7c\x60\x94\xff\xe4\x8f\x33\x40\x0f"
- "\x93\xf2\x9f\x7c\xc5\xac\xc6\xf5\x1f\x67\x5f\xea\x2f\xf3\xe3\x3c"
- "\xc3\x5f\x06\x7c\x65\xdd\xa1\x62\xda\xeb\x3e\x36\xcc\x77\x3f\x2e"
- "\x48\x50\xa6\xdf\xff\x93\xbf\x67\xcb\xdf\x9e\xe5\x7d\x6d\x19\x7f"
- "\xbc\x96\xfb\xed\xe5\x43\xbe\x8a\x19\x1c\x43\x55\xe7\xe7\x1f\xef"
- "\x30\xf8\xd9\xf0\xb3\x64\x58\x7c\x6e\x65\x62\x28\xda\xcf\xe8\xc7"
- "\x5f\x62\xcc\xb3\xf5\xb7\x63\xbd\x89\x18\xf7\xa0\xc9\xcb\x78\xb4"
- "\xc7\xe3\x01\xfc\x46\x21\x3d\x30\xe0\xa7\x65\xb4\xf3\x15\x33\xee"
- "\x0b\xe3\x79\xee\xfe\x19\xb3\x60\x94\xae\x5c\x52\x3e\x9c\xa6\x2d"
- "\x2e\x2b\x63\xb9\x5e\xbc\xa4\x6c\xd5\x8a\x17\x56\x16\x2d\x5b\xbe"
- "\x0c\xa9\xf7\x2f\xe5\x90\xbf\x32\xcb\x3d\xfa\x1b\xfb\xf2\x25\x4b"
- "\x4a\x54\x92\xde\x0d\xb1\xfb\x40\x6a\xef\xfe\x95\x72\x3f\xbd\x3c"
- "\x6e\xc0\xfe\x7a\xe5\x98\x30\xbd\x62\xc5\xef\x7a\x29\xd3\xd2\x36"
- "\x7a\xa5\x2e\x76\xde\xf3\xca\x7e\x83\x1f\x64\xff\x39\xd9\xd7\x27"
- "\xfb\xf3\x6e\x21\xf7\x4d\xd0\x67\x5b\x23\xfc\x4d\x6f\x3f\x6d\x95"
- "\xf6\x7e\x14\x9c\x7e\xfd\xcf\xe7\xf6\x37\x29\x3f\x01\x33\x7f\x1f"
- "\x94\xcf\xef\xf7\xb8\xb7\x82\xff\xb7\x1c\x54\xfc\xbf\xb5\x9f\xff"
- "\xbb\x4d\xc9\x98\xc3\x6d\xcd\x36\xec\xf9\x58\x99\xd9\x3a\xe9\x52"
- "\x59\x62\x1f\xb7\xad\xb3\x0c\xda\x1a\xfd\xac\x78\x6b\xeb\xe7\xc6"
- "\x3a\x6c\x83\x1e\x7f\x9e\xef\xb9\x2c\xdb\xea\x22\x3d\xed\x3e\xf6"
- "\xc7\x3f\x49\x5b\x0f\x29\x7e\xd9\xba\x23\xca\x27\xcb\x7a\x9a\xb6"
- "\x1e\x54\xfd\xb4\xf5\x80\x81\x1f\xda\x29\xf7\x03\x18\x86\x92\xfd"
- "\x57\x6e\x57\xbc\xb3\xb5\xcd\xa0\x2d\xcf\x8b\xf1\xec\x1f\xb0\x2d"
- "\x5e\x71\x49\x1f\x09\x15\xbf\xa0\x8f\xdb\x0f\x38\xc5\x06\x9c\x1e"
- "\xf7\x36\xb4\x3f\xa5\xd9\xa0\x95\x91\x27\x9a\x27\xa6\x2d\x76\x60"
- "\xd2\xba\x6c\xe9\xd2\x25\x2b\x56\x1a\x31\x9d\x73\x5f\x28\x2b\x51"
- "\x31\x9c\xef\x41\xf7\xaf\x81\x04\x4e\xe5\x30\xd0\x48\x55\xb7\x71"
- "\x36\xe4\x38\x5e\x67\x90\x7e\x7b\x72\x1e\x53\xf3\xf9\x5e\x7d\x4e"
- "\x73\x92\xb6\x57\x2a\xdf\x97\xed\x53\x95\xbd\x78\xf5\x1a\xe0\xd4"
- "\x68\xd8\x8b\xbc\x7e\xd9\x4d\xa3\x0a\xf9\x3c\x12\xfb\x6d\xef\xd9"
- "\x29\x3a\x78\xbd\x12\x79\x9a\x8d\xef\x7e\xb1\x2d\xb2\x4d\x7d\x8f"
- "\x3d\xe0\x5d\xce\x31\xf3\x6b\x87\x69\x35\x39\xa5\x22\x33\xb5\x0e"
- "\x36\x4f\x2a\xcb\x42\x5a\x17\xfb\x4e\x72\x9c\xa1\xed\x56\xb6\x95"
- "\x58\xbf\x70\x6c\xfc\x0e\xda\xe6\xc7\xfc\x06\xe3\x5f\x6d\x6a\x20"
- "\x23\xa7\x74\xf3\x3a\x4a\xe1\x3a\xa0\x9b\xfc\xcd\x8d\x4c\xdb\xed"
- "\xe3\x7e\x0b\xdd\xa3\xaf\xef\xfa\xb9\x1e\x3f\x6d\x0b\xe9\x6b\xe9"
- "\x95\xfa\xda\x65\x25\xf2\xcd\xf3\x53\x9a\xfe\x4d\x9d\x74\xcb\x2d"
- "\x2e\xaa\xe0\xef\x00\xaa\x18\x41\x37\x77\xa2\x1d\x56\xfe\xde\x1e"
- "\xec\x2b\xcc\x21\xb6\x35\xa2\x0d\x56\xdd\xf7\x16\xbc\xb2\xfd\x4b"
- "\xe5\x53\xbd\xcd\xc3\x34\x00\xdc\x2d\x3a\x5c\x8c\x97\xdb\xd1\xff"
- "\xd7\xeb\xb1\x89\xb7\x1f\x32\xea\xc0\x98\x12\x80\x2d\x5a\xc0\xf6"
- "\x28\xf0\x2e\xc6\xaf\xa4\x5a\xee\x4f\xfb\x31\x6f\xb1\x08\xf6\x1b"
- "\x1a\xf8\xb6\xd9\xf6\x80\x31\xbe\x70\xdd\x3a\xee\x9b\x79\xfd\x8c"
- "\xd7\xce\xf4\xba\x36\xf3\xfc\xda\x80\x89\xe7\x62\xed\xe2\x99\x46"
- "\xc0\x4c\xc1\x58\x19\xd0\xbf\x69\x55\x52\x7d\x9e\x7d\xcc\xfc\x18"
- "\x0b\x6f\x14\x45\x61\x2b\xef\xeb\xa4\x19\xdf\x0c\x6b\x38\xcf\xf4"
- "\xaa\x5e\x38\xb0\x5f\x83\xf2\xa0\x3f\xe4\xc1\xd5\x41\xd5\xf2\x3b"
- "\x69\x2c\x0b\xdc\x97\xbd\xe8\x1b\xfe\xb6\xbd\xb8\x78\xa6\x09\xf3"
- "\xfc\xb4\x53\x54\xbd\x8b\xfb\x88\xf7\x58\xd9\xf7\x0b\x69\x16\x8e"
- "\x71\x7e\x92\xaa\x5f\xe2\xfe\x61\x5c\x84\x27\xcd\x11\xee\x29\xfc"
- "\x2e\x9f\x6f\x65\x7d\xb8\xa1\x12\x76\xec\x52\xd6\x25\x35\xc3\x78"
- "\x5e\xcc\xdf\xa6\xe1\x7b\x67\x89\xd0\x64\xff\xae\xe3\xfe\xad\x19"
- "\xb6\xa1\x53\x68\x5f\xba\x49\x1c\x0d\x12\x7d\x69\xa2\x70\xc8\x94"
- "\xc4\x78\x9b\x9c\x67\xf8\x0c\x6e\x23\xf9\x2a\xb6\x10\xea\x4d\xd9"
- "\xbe\x8e\xac\x7c\x7e\x99\xbf\xbb\xd2\x1a\xac\xa7\x56\x47\x3d\xfd"
- "\x6b\x78\x07\x79\x57\x73\x2c\x8a\x9a\xa6\x7f\xab\xd8\xc1\xfb\x56"
- "\xc3\x70\xff\xa2\xfd\x71\xae\xcb\x33\xf3\xdf\x8e\xff\x89\xfe\xcd"
- "\xfb\x27\xb2\x2f\x90\xcf\x85\xc7\x0a\xff\x95\x8e\xe5\xff\x2b\x39"
- "\x3b\x84\xc6\x73\xa5\xaa\xe7\xb9\x8e\x2d\x80\xd5\xc8\x67\x7d\xad"
- "\x5a\xb7\x6d\x38\xda\x6f\xe6\x35\xf9\xd6\x60\x80\xbc\xcb\x7f\x0d"
- "\x1c\x3d\xff\xbe\xf7\x3c\xa5\x78\x97\xff\x4e\xde\xab\x39\xcc\x99"
- "\x46\x5f\x49\x3b\xdb\x69\x61\x3e\xe7\xcc\xfb\x7c\xb0\xdb\xb5\x6a"
- "\xc6\x31\xa2\xf0\xe6\x6f\xb6\x1b\xe5\x61\xc7\x19\xe5\x65\xac\xa8"
- "\x3d\x4c\x0f\xe0\xd4\x32\x4f\xd1\xe4\x18\x66\x95\x0a\x67\xd0\xa7"
- "\x30\x9a\x3e\xd5\x21\xa6\x0f\xc7\xc7\xd4\xd0\x5f\xc0\x2d\x1f\x34"
- "\xd0\x8c\x3a\x80\x73\x8a\xbe\x2e\x9a\xb2\xfd\x3c\xa5\x7a\x97\xf3"
- "\x77\xb7\x6a\x9e\xb4\x14\x98\x53\xb4\x8b\x67\x9b\xaa\x2f\x90\x99"
- "\xfb\x8d\xf7\x42\xaa\xe5\x7b\x49\xf3\x7c\xee\xb3\x40\x46\x76\x3b"
- "\x7e\x27\xf0\xf3\x33\xdf\xe1\xca\x67\xd4\xb6\x80\x4e\xed\xe8\xab"
- "\x46\xbe\x2a\x5e\x4c\xe7\x36\x19\x7b\xe6\x03\xe9\x90\xa3\xb0\x90"
- "\xdf\xb6\x85\xcc\x78\xda\x35\xc8\x11\xaf\x8b\xec\xad\xa5\x54\xcd"
- "\xbd\x6d\xcc\x1e\xe8\xba\xfa\x5a\x79\x06\xd4\xca\x6b\x85\x6f\xc8"
- "\xef\x18\xd4\xf4\x9f\xff\xfc\xf1\x08\x3e\x27\x57\x93\x62\xe2\xb5"
- "\x14\x4f\x8e\x4b\xe7\x73\x57\x8f\xbb\x16\xfa\x7f\x84\xee\x4b\xba"
- "\x5d\x9e\xc3\x65\xd9\x1f\xcc\x46\x87\x7d\x78\x4c\xec\x2e\x24\xde"
- "\x53\x49\xdd\x28\x02\xa9\x1d\x16\xd1\x1a\x3c\x26\xcf\x47\xb6\x06"
- "\x23\x72\x4f\x05\xef\x93\xe6\x04\x03\x16\xd8\x93\x6d\x4c\x3b\x23"
- "\x9d\xf7\x63\x78\xad\x6a\x4e\x50\x04\xe6\xae\xb5\xf0\x77\x07\xb3"
- "\xe5\x7a\xbc\x9e\xde\x6a\x83\x2d\xbe\x36\x60\x41\xdb\xc3\xfd\xb0"
- "\xba\x0b\x93\x59\xde\x90\x37\xab\x3f\x6f\x77\xa1\x99\xbf\xa3\xcb"
- "\x75\x46\xa5\x0d\x99\x5b\x81\xb2\xdc\x57\x7a\x9a\xb2\x43\x6b\xfb"
- "\xbf\xff\xc8\xf6\x27\xfb\x4c\x8b\x95\x85\x49\x5a\x77\xa1\x29\x02"
- "\xd8\xe0\x7d\xab\xfc\xfe\x61\x38\xa0\x7f\x4f\xa8\x13\xf2\xdb\x4e"
- "\xa2\x66\x67\x00\xf9\xcc\x0c\x97\xcf\xdd\xf3\x77\x18\x44\xc6\xae"
- "\x8a\xc4\x7e\x6c\x9b\xf7\x7b\xab\x16\x80\x9f\x5e\xed\x64\x79\x8e"
- "\x58\x6f\xd8\x6a\x7f\x96\xed\x93\x57\x17\x33\x3d\x23\x90\xb1\x48"
- "\xc6\x0d\x5b\x27\x76\x52\x52\x15\xf8\x56\xad\xeb\xbc\xba\xd1\x07"
- "\x19\x74\x6a\x02\x36\xdf\xab\xe5\xcc\x37\x96\x2e\xf6\x3f\xbb\xc1"
- "\x23\x7d\xbe\x32\x5d\x8d\xbe\x50\x27\x1d\x73\xfd\x85\x8e\x85\x7d"
- "\xae\xc3\xe7\x03\x66\xe5\xfb\x65\x66\xb8\xaf\xf1\x3b\x27\x78\xb5"
- "\x28\xd2\x48\x83\xad\xb7\xf3\x9c\x13\x63\xd8\xdf\xd4\xfc\xeb\xd5"
- "\x4e\x63\xae\x79\xf9\x36\xec\xc8\xe7\x58\x05\x42\xd8\x48\xab\x5d"
- "\xc4\xfb\x38\x4e\xd1\x93\x4b\x13\xd7\xf1\x3a\xd7\x0e\x1b\xec\xfe"
- "\x7c\x1d\xee\x39\x05\x17\xf9\x2f\x03\x97\x79\xe6\x58\x9d\xdc\xeb"
- "\x41\x9b\x16\x79\x23\x80\x1d\xc9\x2c\x62\x9b\xc5\xe9\xfc\x92\xd7"
- "\x41\x5f\x7b\x09\xf5\x78\x5b\xc3\x6d\xc4\x31\x4f\xf6\x6a\x18\x1f"
- "\xcf\xd9\x48\xf7\x73\x73\x9e\xa5\x1d\x2f\x6a\x22\xd7\x8a\x39\x30"
- "\xef\x71\x38\x59\xc7\xf1\xfc\xba\x2a\x42\x57\xf9\x60\x45\xf1\x39"
- "\x7d\xc0\x58\xfb\x7b\xde\x4f\x82\x9e\x88\x08\x9b\xe9\xa3\x8b\x7e"
- "\x62\x5f\x16\x79\x6e\x7f\xd3\xf5\x6f\xa4\x6f\xa4\xfb\x84\xc9\x22"
- "\xfd\x18\xb5\x9a\xaa\x76\xf4\x6d\x48\xf9\xd5\xe5\x78\xa2\x7c\xea"
- "\x92\x51\xd7\x05\xf6\xa9\x13\xd6\x9c\x79\xf5\x72\x2d\xef\x86\xad"
- "\x3d\xee\xd7\xec\x7e\x7a\x35\x8f\xf9\x67\x2b\xfb\xd6\x4b\x1d\xfb"
- "\xda\xb6\x40\xc6\x82\x46\x86\xc1\xe7\x06\xb5\xd5\x91\xa6\xea\x2f"
- "\xc8\xac\xe8\xf1\xda\xf3\xad\x5d\x3d\x5e\xe1\x59\xd0\xc8\x67\xc6"
- "\x74\xd8\x96\xb3\xf4\xda\x54\x51\xb3\x00\x63\xf9\x6b\x5b\x55\xdf"
- "\xc8\xfb\x42\x7e\x1f\xee\xcb\x85\x0c\xee\x38\x5e\xdf\xcb\xeb\xeb"
- "\x3b\x5c\xc2\x7d\xa3\xb7\xdb\xba\xa0\xf1\x51\x1b\xdb\x54\xaf\x35"
- "\xfa\x4d\xff\xab\x4b\x5f\x5b\x93\x31\x08\xe2\xd7\xc4\xfa\xfb\x70"
- "\xb7\x6d\xb8\x0f\x40\x30\x47\xcc\x3a\x4d\x75\x19\xbd\x6e\x32\xf5"
- "\xc1\x16\xec\x35\xc1\xe6\xdf\x5d\x98\xba\x7d\x24\xe5\xe1\xdd\xc8"
- "\xd3\xf4\xda\x85\xb0\x89\xb2\xf0\xb3\x06\xae\x2f\x1d\x06\xb8\xf9"
- "\xbc\xee\xd8\x72\x9e\xd7\x8d\x76\x3e\x26\x6d\xb5\x37\x68\x8c\x06"
- "\x78\xbc\x87\x52\x3d\x92\xc6\xf0\xda\x1f\xd2\x72\x8b\x22\x6a\x2f"
- "\xd1\x98\xdf\x6f\x1a\x49\xe3\x62\xeb\x7d\xed\x84\x5a\x1b\xac\x93"
- "\x31\xd3\xd6\x04\xe8\x06\xc7\xbd\xfc\x9d\xca\x9d\x6d\xc2\x9d\x2c"
- "\xc4\xf5\x36\x93\xda\xef\xdf\xf9\xa1\xa5\x4e\xf1\x9d\xdc\x3b\x03"
- "\xbf\xf1\xde\xa4\xbe\x4f\x93\x24\x63\x2f\x64\x8e\xce\xe6\x6f\xfe"
- "\x46\xad\xbd\x5a\x25\x1e\xfa\x79\xe9\xc8\xa6\xdb\x8a\x19\x06\xe3"
- "\x53\xb4\x58\xed\xf1\xf0\x59\x6a\x3f\xed\x94\xf1\x18\xb7\xbe\x41"
- "\xa9\xaf\xbc\x41\xd6\x96\xa5\xb2\x5d\x9d\x4a\x16\xcd\xc4\xf8\x6a"
- "\x1e\x96\x33\xf0\x04\xf0\xe6\xfa\x98\x37\x5a\xc3\xe7\xbc\xce\x72"
- "\xa1\x79\x9f\x65\x5b\xf4\xf5\x5b\xbd\x2b\x0e\xd0\xdc\x8e\xb0\x3a"
- "\xf7\xb7\x90\x02\x0d\x80\xd7\x30\x92\xac\xa7\xe8\xf5\xbb\x7c\x65"
- "\xc4\x7b\x00\x37\x79\x57\x1c\x04\xec\xd7\x1f\xe2\xb1\x60\x1b\xe8"
- "\xa3\xc6\x84\xd7\xc3\xbe\x50\x3b\xb5\x40\xbe\xe7\x38\x44\x84\xe1"
- "\x20\xcf\x46\xd9\xde\xdd\x36\x7b\x91\x3a\xef\x2e\xdb\xda\xbf\x77"
- "\xa6\xb7\xc3\x77\x5e\xc2\xdb\xe1\x83\x55\x6a\xb4\xc9\xa0\xb5\xe2"
- "\xaf\xd7\xff\xe8\x5d\xb1\x8f\xb8\x7f\x38\x3f\x9e\xbd\xbe\x2e\xe4"
- "\x3d\x13\xdb\x2f\x9c\x07\xef\xbe\x00\xdc\x6f\x0f\xec\xff\xf2\xbe"
- "\xe4\x40\x9e\xfa\x37\xf8\x1c\xd0\xce\x49\xbb\x41\x23\xb5\x5e\xfe"
- "\xfa\x93\x8c\xab\x9f\x5e\x5f\xe8\x2b\xff\x4b\x62\x3f\x4f\xc8\x3e"
- "\xf8\x7e\x63\xab\xdc\x07\xab\x9b\x3d\x27\xac\x09\xa5\xcf\x76\x41"
- "\xb6\x9c\x98\xa3\xec\x22\xd6\x05\x52\x9f\x4c\x60\xdf\x9a\x5d\x49"
- "\x96\x24\xd5\xbf\xdc\x16\xb6\x57\x12\xf5\x71\xd4\x1e\x9d\x95\x71"
- "\x35\xfa\x98\xbf\x97\xa7\xf1\x3e\xeb\x48\xd0\xbb\xcf\x46\x8a\xff"
- "\x84\x07\x75\x7f\xa1\xdb\x6e\x6d\xfa\x58\xd6\xd6\x9d\x71\x43\x1d"
- "\x9f\x4b\x33\xfc\x6d\x21\xbf\x3b\x8a\x94\x0f\xb3\x8d\x75\x54\x83"
- "\x49\xc9\x0e\xe3\xa8\x97\x3d\xa6\xfc\x1c\xea\xbc\x28\x7f\x2c\x61"
- "\x7b\x93\xa1\x77\xdc\x50\xd3\x68\x0f\xdb\x91\x02\xba\x0a\xe3\xc1"
- "\x55\xbe\x60\xaf\xfe\xad\xc2\x5d\x1b\x60\x53\x5f\xc5\xe7\x52\x0c"
- "\xdc\xae\x6c\x3f\x6d\xd7\x4c\x35\xb7\xd9\xb5\xc5\x58\xaf\x11\x56"
- "\xd0\xd8\x6d\x11\x7c\x46\x8d\xcf\x1a\x04\x33\x36\x37\x05\x32\x76"
- "\xfa\x95\xdc\xec\x6a\x82\x9d\x2a\xf5\x6d\x51\x88\xbf\x11\xef\xdc"
- "\xcf\xfb\xa5\x98\x37\x5d\xc5\x6d\x06\x1c\xcc\x7f\x9e\xcf\x52\xe3"
- "\xf9\xae\x41\x7d\xaf\xe5\x9c\xc9\x68\x1b\xda\x24\xdb\x86\x36\xca"
- "\xb6\xe9\xdf\xf2\x39\x45\x6f\xc8\xb3\xcb\x57\xd6\x9e\x37\x6c\x8a"
- "\xb6\x9b\x9b\xf8\x3b\xa5\xa7\x68\xf7\x67\xf2\xfc\x01\xfa\x44\xed"
- "\x2d\xbc\xd1\x28\x86\xbf\x32\xfc\x0a\x61\xaa\x18\xd1\x9e\x9d\xfe"
- "\xd7\x38\xee\x9f\xfe\x3d\x30\xc0\x6e\x81\x2e\xf7\xcb\xb3\x5d\xa8"
- "\x8f\xbf\xa7\x38\xa0\x87\x76\x17\x70\x5f\x4d\x38\x40\xf9\x8a\x0f"
- "\x77\xcf\xe0\xf5\x5b\x35\xcf\x7b\x23\x08\xdd\x7b\x48\xcd\xa9\x0c"
- "\xdf\xec\x24\xe9\x9b\x1d\xad\x63\xaf\x0c\xc7\xdd\x52\xdf\x89\xcc"
- "\x2a\xe8\x9f\x37\x3a\xe4\x19\x35\xe0\xbb\x26\x6c\xe8\xbf\x37\x3a"
- "\xd8\xcf\xa7\x7f\x8f\x7d\x2d\x78\xa5\x4a\x9d\xd9\xed\x71\xef\xde"
- "\x6c\xd8\x28\xf2\xfb\x4f\x6e\x71\x94\xf3\xcd\x5d\x7b\x4e\xee\xc1"
- "\x57\xcb\xf3\xe5\xa7\xf5\xf3\x4d\xbb\x77\xe9\xeb\x19\xb9\xec\x17"
- "\x8f\xb2\x5e\x3f\x7d\x24\xfd\x79\x98\x06\x5c\xb7\xc4\x5d\x7e\x83"
- "\x69\xf7\x89\x81\xbd\x94\x37\x0e\xc9\x74\xe9\x2b\xba\x3b\x68\xf0"
- "\x08\xda\x7b\x95\x8a\xc3\xf8\xc6\x93\x47\xc6\x91\xe4\x81\x6e\x61"
- "\x1b\x3e\xba\x9e\x79\xb2\x3e\x3b\x9a\x4e\x73\xc3\x9a\x53\xe9\xa0"
- "\xdd\x66\x21\x65\x7d\xb7\xf9\xab\xed\x89\xfa\x17\x0d\x5b\x44\xd1"
- "\xd9\x0a\xfd\xd2\x30\x45\xd2\xda\x93\xd6\xc4\xf1\x30\xd6\x57\x71"
- "\x7c\x9f\x3d\xb7\x73\x1c\xa5\xb0\x27\xad\x2d\xc2\x67\xe1\x30\xce"
- "\x6a\x9e\x34\xff\x29\x07\x99\x8a\x1c\xbc\x7f\xb4\xc0\xc1\xf3\x2b"
- "\xe1\x84\x2d\x90\x09\xfb\x04\x72\xbe\x61\x19\x59\x9e\x2c\x05\x6c"
- "\x67\x6e\x16\xc7\x39\xe2\x18\x47\x1c\xa7\x2c\xe2\xcc\xcd\xc4\xfd"
- "\x08\xd8\x73\x56\x61\x4d\xf3\xb2\x0f\x4a\xc4\x2d\xa0\x8f\x4f\x70"
- "\xac\x25\x93\x2f\x10\xa2\x0d\x67\x28\x85\xe3\x28\x85\x6b\x16\x6c"
- "\x69\x0d\xfe\x55\xce\x2d\xd2\x1d\xb0\xa7\x35\xca\x06\xcd\x6d\x5a"
- "\xc6\x02\x07\xc6\xf8\x72\xd5\xee\x73\x42\xb5\x5b\xe1\xcd\xf8\x2b"
- "\x1d\x67\xf1\x57\x49\xdc\xf7\xfe\x39\x0c\xf8\x9a\x27\xeb\x44\xc4"
- "\x93\xd5\xae\xce\xd0\x1d\xa3\xaa\x72\xd1\xe9\x83\x6d\xcc\x3e\x91"
- "\x7c\x4e\x92\x7d\x5c\xb8\x8d\xdc\x3e\xae\xfb\xdf\xce\x9f\x91\x71"
- "\xa1\xc2\x78\x76\x96\xe9\x65\xba\x50\xa6\xeb\x18\xf5\x7a\xb2\x64"
- "\xdb\x5b\x83\xaa\x6c\x91\xbc\xe7\xf2\x51\x74\xd0\xdb\xdc\x4f\x07"
- "\xb4\x9d\xdb\xc7\xed\x0f\x33\x4d\x40\x03\xbd\xad\xb6\x3e\xbd\x9d"
- "\xdc\xc6\x7f\xc5\xa8\xf3\x06\xda\x89\xb6\xca\x76\xf6\xa1\x9d\x47"
- "\x4b\x89\x42\xb5\x9b\xbd\x5f\x66\x66\xb5\xf3\xfc\xd0\xf9\x47\xd8"
- "\xd1\x95\x1e\xc2\x3c\xd0\xfc\x4e\x95\xc7\xf4\x63\xd8\x26\x55\x01"
- "\xcc\x07\x03\xa2\x93\xed\x7d\x9f\x03\xbf\x70\xbd\xfc\xc6\xab\xb4"
- "\x8f\xf9\x7b\x9c\x2f\xa2\x4d\xda\x67\x54\xd5\x29\x3a\x61\x9b\x86"
- "\x7c\x61\xe4\x29\x45\xfb\x31\x7f\x3c\xa5\xe3\xcf\x79\x37\x7c\xa1"
- "\xda\x65\x29\xa3\xac\x4f\x16\x6c\x31\xf9\xda\xb7\x90\xd1\x96\x45"
- "\xc8\x87\xf6\xd8\x00\x2b\x4d\xc6\xc0\x47\x3b\x77\x03\xcf\x50\x54"
- "\x9b\x5a\xba\x42\x80\xf9\x67\x1a\x5e\x40\x49\x6f\x9c\x45\x3b\xce"
- "\x92\xcd\x53\x05\xfb\xeb\x11\xb6\x17\xf7\xa6\x5d\x5d\x48\x63\xfc"
- "\xb4\x27\x4b\xf1\x9d\x8c\xd1\x72\xed\x69\x6a\xb8\xab\x3f\x0e\x0b"
- "\xc7\xb6\xca\x58\xb0\x95\xf9\x48\xc6\x63\xe1\x31\xa3\x07\x3c\xc3"
- "\xfe\x29\x6b\x50\x47\x4f\xee\x08\x89\x8f\x7b\x12\xe1\x39\x15\xcf"
- "\xfc\x7d\x9e\x2c\x5e\x13\x40\xb9\x2d\x02\x34\x63\xf8\xb0\xe7\xca"
- "\xf9\xca\x34\x4c\x78\x7e\xe3\x5d\x9a\x8c\x3a\x3c\x3c\xf7\x6d\xaa"
- "\x0a\x98\x5e\x7a\x97\xc6\x5d\x99\x4e\x69\x28\x19\x4c\x7f\xf3\x5e"
- "\x00\xc3\x43\xdb\x32\x4f\x53\xe3\x43\xb1\x32\x66\x97\xba\x4c\xe9"
- "\xc1\x46\x2b\xaf\xbf\x5f\x61\xbd\xd2\x86\x63\x3f\xa2\x2b\x2b\xd7"
- "\x98\x65\xe0\x01\x18\x6d\x83\xe1\x7e\xe5\x74\x68\x2c\x1b\x0c\xd6"
- "\xb6\x9d\x32\x36\x97\x73\xfb\x4e\xf6\xf1\xdb\xbc\xff\x88\x8d\xe3"
- "\x25\x63\xec\xdc\x17\xa4\x95\x7b\x28\xc5\x79\x86\xd7\x64\x66\xd3"
- "\x91\xfa\x3c\xda\x8b\x39\xb9\xe8\xce\xcd\x7c\xf5\x3c\xfb\x13\x28"
- "\x1d\xc2\x36\x29\x9f\x63\x13\x2b\x73\xad\xd5\x3b\x0d\x1b\xfe\xcd"
- "\xbb\x2a\x2f\x90\x49\x7d\x8f\xe2\xcd\x49\xd3\xed\x22\xbc\xc3\xa4"
- "\x95\xd6\x73\x7c\xa1\xcc\x2a\x8e\x01\x5d\x6a\xc4\xec\x91\xb6\x4f"
- "\x05\x64\xae\xdb\x36\x7c\xdb\x0a\x1a\xc7\x71\xc6\x2c\x01\x65\xcb"
- "\xa9\xf1\xfa\xcd\x12\xe0\x67\xd5\xf7\xd0\xad\x2a\x8e\x4f\xc3\x81"
- "\x86\xf3\xa8\x4b\xbd\x7f\x2d\x82\x39\x8c\x84\xbb\x82\xc6\xd4\x9f"
- "\xa7\x5c\xb6\x83\x8a\x3e\x53\x36\x1b\xcf\x0b\x67\x77\x59\x44\xe4"
- "\x3f\x73\x69\xcf\xe9\x81\x38\x64\x81\x95\x1c\xbb\x4c\xd8\x06\x3b"
- "\x1f\x5c\x3d\x42\xfa\xd1\xc8\xd8\x17\xea\x7b\x65\x44\x3b\x6a\xc9"
- "\xcc\xdf\xe7\xe4\xb5\x3c\x5e\x1b\xe6\xb3\x34\x6a\x0c\x79\xcb\x6c"
- "\xc4\x67\x1a\x74\x6f\xce\xa3\xe6\x3b\xda\x55\x98\x7f\x05\x7a\xbc"
- "\xde\xd5\x3c\x66\xbc\x35\x8b\xcf\xef\x0c\xcc\x71\xde\x1a\xcf\xef"
- "\x38\x8d\xfd\xcb\xf3\x25\x2d\xdf\x2a\xe7\x79\x8f\x3e\x67\xfc\xc4"
- "\xde\x9f\xa6\x6c\x18\x1e\xcb\x18\x87\x06\xb5\x8e\x9c\x0e\x5c\x3c"
- "\xc6\x78\xc6\xe3\xba\xfa\x36\xe8\x5b\xfb\xfc\xa6\x3f\x0c\x7a\x8e"
- "\xcd\x58\x57\x97\xbe\x63\x1c\x77\xc9\xfd\xd6\x71\x63\x7c\x93\xdf"
- "\x7e\xd8\x34\xf2\x81\x95\x6b\x29\xfb\xd1\xeb\x52\x64\xcc\x03\xfe"
- "\xc6\xa3\x1a\x77\xdf\x0a\x0f\xec\x51\xe5\x4b\x7a\xcb\xef\xba\xf1"
- "\x1c\xc3\x84\x31\x58\xc5\x1a\xeb\x52\xe3\xaf\x71\xbe\xf8\x27\xd7"
- "\x0d\xd4\xf3\x93\x29\xfd\xe3\x28\xea\x60\x5f\x09\x86\xaf\x6c\x93"
- "\xb7\xb8\x6c\x80\xe7\x56\x6a\x7c\x7d\x2b\x70\x19\x5b\x2c\x97\xe9"
- "\xab\xe9\xf3\x49\x5f\xd7\xdf\x15\x7d\x2b\x28\x79\xe2\x0e\xb2\x7d"
- "\x52\xe5\x37\xa7\xab\x98\x39\x16\xd4\xbf\x8d\xdf\x33\xaf\x7b\x27"
- "\xf0\x5a\xdc\x4f\x3e\xf7\xf1\xb8\xdd\x57\x98\x3a\x87\xe7\xfa\xd2"
- "\x16\xff\x49\xfb\x78\x94\x43\x5a\xe6\xc7\x67\x43\xe6\xea\x75\x34"
- "\x8e\xbf\x9f\x88\x74\xf9\x6d\xa8\xc0\x37\x9e\xeb\x19\x9d\x45\xb6"
- "\xd1\x3b\xd8\xc7\x7e\x1f\xf9\x4d\xff\x97\xfc\x2e\xa4\xac\xbf\xf6"
- "\x75\x2b\xc7\x59\x7b\xaf\xd7\x3f\x44\xf5\xd5\xbe\x3d\x78\xce\x8d"
- "\x7a\xbe\xdb\x58\xcb\xf7\xd3\xbe\x7a\xb9\x1f\xc8\x7e\xc4\xcb\x79"
- "\xbc\x76\x7a\x06\x7c\x6f\xf6\xed\x51\xb8\xec\xdb\x73\xc4\x41\xbc"
- "\x56\x7d\x7c\xaf\x8c\x99\xb4\x0f\xba\xf3\xad\x26\x7d\x3d\xa6\x4d"
- "\xf2\x15\xdb\xbb\x3f\xe4\x39\xd8\xdf\xbd\xdb\x90\x8f\xc7\x89\xa2"
- "\x0a\xca\x57\x36\xbc\x73\xbf\x06\xfe\x19\x68\xff\xbe\x61\xbc\xd6"
- "\x97\x50\x27\xbe\x41\x24\xcb\xd4\x54\x75\x4a\x3f\xae\x9a\x5d\x0e"
- "\x5c\x53\x44\x8d\xcb\x83\x6b\x2a\x78\xae\x11\x57\x2b\xae\x75\xb8"
- "\x42\x7f\xbf\x5e\xc0\x7c\x89\x39\xac\x0d\xf3\x84\x94\xee\x8c\x2a"
- "\xff\x60\xe7\xff\x98\x36\xbe\xcd\x8f\x93\xf2\x4b\x7d\xdb\xd5\x82"
- "\xde\x9c\xbb\x87\x68\x65\x58\xf4\xda\x6f\xe0\x73\x36\x6f\xbb\x9c"
- "\x7b\xd8\x1f\xe4\xed\x79\xb1\xfe\x20\x6f\xe3\xee\xed\x83\x44\x3f"
- "\x4d\xc1\x6f\x32\xee\x5d\x03\xbf\x9f\x96\xf7\xb8\xdf\x86\xbd\xb8"
- "\x4f\xda\x58\x57\xa6\x13\xdf\x56\xfb\xeb\x3c\x2f\xca\x58\xd4\xa4"
- "\xda\xbb\xd3\x8b\xe7\x14\x91\xf1\x3a\xe9\xed\x6d\xc2\xb3\xd5\xee"
- "\xc4\xb8\x96\x01\x9a\x8c\x44\x9b\x33\x76\x39\xb8\xbd\x8c\x6f\x77"
- "\x86\xcb\x13\x7d\xf6\x91\x61\x72\xfb\x03\x19\x4e\x86\x47\x62\xc2"
- "\x0d\x79\x06\x3d\x75\x3a\xf1\xbe\x91\xa9\x1b\x30\x94\x1d\x84\xfc"
- "\x80\x61\xe4\xef\xa7\xfd\x48\xfe\x96\x01\xfa\x14\xf9\x30\x27\x4e"
- "\x31\xce\x55\xf6\xb8\x7f\x5a\xf6\xdb\x32\xb5\x7f\xc0\x65\x83\x51"
- "\x65\x39\xd6\x40\xa2\xf2\xa8\x33\x45\xd5\xe9\xc2\x9c\xef\xed\x8d"
- "\xaa\xde\x9f\x16\x0f\x26\x4b\x55\xa3\x60\xdf\xd5\xfb\x39\x1e\x01"
- "\xdb\x43\x53\x7c\xd9\x41\xf2\xd5\x6b\x18\xf3\x9d\xde\xfc\x2a\xe1"
- "\x3d\x45\xff\x34\xaa\x35\xd4\x79\x85\xe3\xe1\x4f\xd5\x37\xc2\x7a"
- "\x5d\xe4\xab\xbc\x43\x7e\x37\xf8\x2c\xed\xff\xbe\x2f\x20\xe3\x6f"
- "\xf3\xfd\x54\x7e\xcf\xbe\x0f\x3c\x36\x60\x8e\xdd\x1f\xbf\x4e\x43"
- "\xde\xbd\x9c\x8e\x34\x5f\x30\x20\xe3\xdc\x0d\xf8\x66\x57\x1d\x55"
- "\x32\xb5\x7f\x98\x3c\xf7\xce\xf8\x86\xbf\xeb\x65\x9c\x35\x4f\xd5"
- "\x51\x6e\x83\x13\xf3\x3f\x5f\xb8\xc7\xcb\x32\x61\x5f\xcd\x6b\x85"
- "\xff\xf4\x19\xf8\x4e\x68\x35\x55\x47\xaf\xac\x0d\xff\x24\xe7\x34"
- "\xce\xb0\x38\x1b\xc8\xa8\x3a\xca\x36\x49\x75\xd5\x90\x94\x69\xf5"
- "\xc2\xdb\x9d\xe9\xf4\xf6\xb8\xf7\xa7\xfc\xb6\x42\xf5\xcd\x95\xc1"
- "\xdd\x9f\x62\xb4\x7d\xaf\xde\x76\xd4\x25\xf7\xe6\x26\xd6\xa9\xb8"
- "\x7e\xc8\x93\x3f\xe8\x9a\x15\xfa\x99\xed\x01\xf6\x1b\xd5\x69\xe1"
- "\xe9\x1f\x1b\xae\x0c\x8f\x4b\x62\xa6\x25\xa8\xa3\x4f\xaf\x23\xf8"
- "\x5f\xac\x23\x78\xb9\x3a\xa0\x1b\x72\x4e\xd3\xcf\x5c\x57\x3e\x77"
- "\xfc\xd9\x2c\xc9\x2b\x1e\x67\x93\xd2\x99\xff\xfc\x45\x04\xf3\xb7"
- "\xb0\x75\xa7\x57\x7e\xe3\xc7\x44\x2e\x8e\x71\x18\xf6\x2c\x6a\x6a"
- "\xa9\xe8\x25\xef\xea\x3f\x51\x07\xfd\xec\x43\x2e\xd3\x52\xce\x73"
- "\xb6\xd7\xa9\xaf\xd6\x65\xed\x33\xed\xe7\x73\xc2\xa5\x7b\xd0\x0f"
- "\xbb\xa3\xf8\xac\x35\xf8\x27\xf2\x15\xf3\xfa\x6a\x1b\xe4\xeb\x75"
- "\xe8\x8b\x9d\x5e\x0d\xba\x01\x36\x7a\x44\xd2\x03\xf6\x8b\x9a\x6f"
- "\x6d\xde\x2f\xe7\x5b\x01\x79\xe6\x2f\x4d\xc6\x2e\x74\x97\x1d\xe3"
- "\xb5\xef\x48\x5f\xa1\xbd\xc7\x4d\x05\x1c\xd3\x90\xd7\x9d\x85\x35"
- "\xa7\x6c\x6e\x38\x59\xc8\xf9\x14\x6c\x7f\x8e\x69\xe8\xc3\xac\x32"
- "\x02\x3b\xba\xfe\x22\x65\xd5\xc3\xf6\x84\xce\xb6\xb2\x5e\x6f\xd0"
- "\xe3\x1a\x6e\xbb\x38\x10\xd7\x70\x2f\xaf\xf5\xb4\xe3\xfe\x22\x99"
- "\x23\x35\x9b\xf7\xef\xbe\x48\x63\xf6\xac\xa6\xdc\xdd\xbc\x96\xf7"
- "\xb9\xb2\x7d\xd8\xae\x90\x31\x0e\x5f\xc8\xe5\xf5\xfc\x01\xdb\x67"
- "\x0d\xc7\x60\xed\xd7\x5b\x72\x2e\x7a\x65\xf4\xfe\x67\x39\x0e\x86"
- "\x3d\x55\x9d\x61\xeb\x2e\x07\x68\x07\x9b\xe3\x67\x01\xd0\xaf\x2c"
- "\x51\xdf\x1a\xbe\x4d\x3b\xa2\xe2\x52\xfe\x76\x8c\xd2\xef\x7e\xfa"
- "\xf9\xa4\xc1\x78\x22\xb2\xbb\x90\x26\x76\x51\x9e\xf2\x57\x18\x86"
- "\x31\xf1\xe7\x75\xbc\x7f\x5e\xf5\x3c\xd9\x22\xbb\x17\x26\x39\xdf"
- "\xa4\x64\xfe\xa6\x34\xff\xaa\xbe\x10\x9d\x13\xcb\x28\x8f\xf7\x1f"
- "\xd8\xa7\xc1\xbe\x5e\xe6\x5f\x36\xa6\x92\xf2\xa2\x61\xcf\x54\xce"
- "\x46\xf7\xd8\x1f\x5a\xfe\xf4\x0b\xcf\x3b\x16\x97\x2f\x7b\x6a\x59"
- "\xd9\xb2\xf2\xb5\x32\x6c\xc0\x38\xf9\xef\xc1\xb1\x25\xf3\xe4\xa6"
- "\x73\x94\x7d\x31\x66\x60\x3d\xee\xc0\xa8\x08\xaf\x1f\x5c\x11\xbd"
- "\x7e\xde\xa5\xef\xa3\x05\xf6\xc8\x7d\xa5\x03\x93\xfc\xa6\xa3\xf2"
- "\xac\xe9\x36\x15\x43\xa6\x53\xf9\x31\xa8\x7c\x9a\xe7\x75\x8e\x41"
- "\x34\xe5\x24\xbd\x67\xe5\xfd\x10\xf4\x55\xa3\xaf\xf2\x34\xc1\x0e"
- "\x99\xc2\xfb\x2c\x2d\xbc\x96\x21\x6d\xdf\x03\x6f\xca\x31\xec\xac"
- "\x8c\x43\xb5\xef\x24\x9e\xd9\xef\x5d\x13\x85\xbb\x23\x2f\xd8\xf6"
- "\x69\x2f\xd8\x7e\x2a\x44\xe1\x1b\xda\xb9\xd2\xdd\xe2\x5c\xe9\x1b"
- "\xc2\x93\xce\xe3\x6f\xf6\x69\x3a\xf0\x41\xd8\x4d\xdf\xc0\x6f\xe8"
- "\x40\x0c\x81\x03\x7f\x98\xd5\x21\xfa\xf0\xd3\x30\x2f\xb7\x47\xed"
- "\xa1\xf1\x3b\x79\x66\xc3\xb1\x82\x7d\xa9\x0e\x44\xb8\x6e\x51\x6b"
- "\xb9\x31\xe0\x2c\x4d\x46\xfe\x88\xc2\xe5\x9d\xeb\x7c\x9b\x4f\x91"
- "\xda\x37\x7d\xc7\xe6\x95\x6b\xc6\xef\xfc\x82\xcb\xf1\x3e\x1b\xdb"
- "\xd0\xbe\x0e\x9e\x5b\xfc\x7c\x1f\xfb\xe1\xb1\xfd\xbc\x27\x93\xac"
- "\x9e\x4c\x4a\xed\x71\xbf\x33\xbd\xdf\xc7\xc2\xaa\xc6\x54\x1e\xd7"
- "\x38\x16\x31\x74\x4e\x0f\x8f\x91\x8c\x07\xf3\x29\x60\x3a\x78\x0f"
- "\x4e\x9d\x2b\x7a\xa7\xd2\x4f\x65\x81\x2b\xd7\xb9\xef\xc8\xd8\x36"
- "\xc2\xe4\x14\x13\xb7\x92\xdc\x9b\xd6\x7d\x0e\xcd\x90\xcb\x62\xd5"
- "\x9e\x77\x3f\x97\xfb\xe7\xab\xcf\x34\x42\x6e\x5c\x0d\xbd\x94\xaa"
- "\x79\x72\x4a\xd8\x8e\x69\xa9\x94\xfb\xca\x29\x28\xd7\xc4\xfb\xce"
- "\xf2\x5c\x9e\x8c\x73\xfd\x27\x6a\xb8\x40\xe6\x0e\x7a\x27\xc4\x6b"
- "\xed\x03\xb4\x7d\x77\x36\xef\xad\x88\xda\xd4\x3a\x4b\xa5\x69\x0b"
- "\xc3\xd0\x2e\x9e\x9d\x6c\x94\xc3\xd8\x3d\x94\xcb\x9d\xa4\x77\x6f"
- "\x97\xe5\x38\xaf\xfc\x3e\xa2\x75\x21\xc6\xb1\x4e\xce\x1f\xc6\xf3"
- "\x5e\xcd\x5a\x20\x20\x6f\x91\xd5\x91\x26\xbc\x9b\xa7\x79\x5c\x1e"
- "\xa4\x15\xca\x35\x5e\xcc\xcb\x65\xbc\x13\xeb\x82\x46\x9f\xff\xef"
- "\x5e\x89\x0f\xfb\xb1\x96\x43\x37\x49\xbb\xef\xdd\x97\xf6\x7e\x4e"
- "\x66\xc7\x52\xee\xc3\xf7\x6c\x3a\xdf\xec\x57\xf8\xbd\x77\x5d\x77"
- "\x6d\x56\x7b\xb7\xd5\xd9\x18\x34\xa5\xd0\x11\x1b\xfb\xdd\xbf\x5e"
- "\x70\xc4\xd6\x8b\xb9\xc3\xbb\x7e\xbf\x39\x35\x45\xd9\x1c\xaa\x1c"
- "\xef\xed\xc0\x1e\xed\x4a\xb6\x59\xe7\xf4\xb8\xdf\x23\xc3\xbf\x82"
- "\xbf\x29\xce\x7b\x3c\xa0\x6f\x3b\xd3\xcd\x4f\x07\xca\xe4\x3a\xff"
- "\xa6\x27\x3a\xd1\x9e\xab\xd8\x07\x8e\xe9\xcc\xe7\x1b\x2c\xb8\x17"
- "\xab\xc5\x64\x4b\x38\xdf\xd4\x20\xcf\x35\xca\xf3\xf2\x93\xf4\x98"
- "\x2d\x79\x7a\x0c\x97\x71\xfc\xac\xce\xdb\xbf\xd7\x7f\xfe\x9f\xe3"
- "\xd4\xb0\xef\x40\x44\xf7\xab\x93\xf1\x5b\xce\xab\xfd\x51\xf6\xab"
- "\xe3\xf5\x41\x3e\x1f\xc8\x7b\x98\x28\xd7\xd8\xef\xe7\x28\xcf\xc5"
- "\xbc\xd7\x64\xc4\x6d\xc1\xfd\xe1\x7e\x7f\x1d\xb4\xbd\xdb\xe3\xac"
- "\x0b\x5a\x5f\x2f\x08\x7a\xaa\xfc\x78\xd7\x0e\xb9\xbd\x5c\xdc\x40"
- "\xfe\xbe\x0b\x71\x2c\x0b\x2d\x33\xc7\xc3\xf1\x2c\x8e\x04\x49\x3f"
- "\x13\xdc\x74\xb7\x7e\x7e\x3c\xf9\x2c\xbd\x77\x61\x60\x2f\x31\xa2"
- "\xaf\x83\x35\x15\x2b\x3b\xac\x49\x9e\x8f\x13\xb5\x4e\xd7\x4f\xd6"
- "\x85\x4c\x4d\xeb\xfc\x26\x75\x4e\xa0\x69\x9e\x9f\x0e\x6d\x31\xfc"
- "\x51\x90\x2f\x6b\xb0\x58\x56\xc2\x33\xba\x44\xc1\xfc\x85\x5c\xc3"
- "\x18\x98\xd7\xfc\x42\xed\x93\x6d\x1a\x59\xac\xf1\x18\x98\xb9\xc8"
- "\x2b\x7d\x2b\x1c\xe7\x79\x3d\xec\x2a\x35\xc7\x52\x79\x74\xbf\xc8"
- "\x6b\x4e\xc7\x3e\x67\xf2\xb3\xa2\x59\x53\x87\xb1\xb6\xbe\xdd\xa4"
- "\x71\x6c\x63\xe1\x6c\x14\x41\x9f\x23\x48\xb0\xaf\x02\x3e\x8c\xa9"
- "\xa8\x43\x40\x3f\x0c\x45\x99\xeb\x98\xf6\x4a\x86\x7e\xb1\x4d\xe2"
- "\xe4\xbe\x4f\x38\xd9\xae\x0c\xb0\x6f\xc7\x79\x42\xbe\x0c\xe4\x9b"
- "\xd1\x5c\xd9\xc5\xfe\x29\x85\x1c\x43\xae\x43\xaf\x3b\x90\x31\xba"
- "\x64\x74\x2a\x15\xf7\xb8\x7f\x51\xe8\xa7\x4d\xb6\x2b\x97\xed\x5f"
- "\x14\x5e\xce\xc6\x50\x63\x5e\x3e\x0d\x36\x4f\xe1\x79\xe8\x04\xd4"
- "\x3f\x5b\x30\xfe\xbf\x9c\x11\x36\x85\xa8\xcf\x34\x54\x7c\xd3\x55"
- "\x41\x61\xf7\x50\x11\x59\x87\xfe\xea\xb6\xc1\x8e\x3d\x46\xad\xe1"
- "\x66\xe9\xfb\x01\x99\xb5\x54\x05\xc5\x79\x5f\xf8\xa0\xf4\x85\x55"
- "\x67\xc6\x7f\x39\xd5\x17\xfe\x88\x5a\x1d\x01\x62\xbd\x70\x92\x7e"
- "\x79\x2b\xe3\x35\xc1\xe1\xa2\xf1\x67\xf9\xfd\x2f\x3a\xd5\xf8\xf7"
- "\xcb\xe9\xfa\x35\x8b\x63\x0d\x46\xe3\xf4\xe0\xaa\xe5\x4f\x97\x2f"
- "\x7b\x61\xf9\xf8\x59\x4b\x56\x2f\x29\xb3\x3f\xa2\x5c\xe9\x62\xc6"
- "\xa5\x94\x81\x18\xca\xef\xcb\xb1\x82\x6d\x10\x8e\xa5\x7c\xb9\x38"
- "\xca\x46\x0c\x65\xe8\xb5\x31\xbc\x6e\xf7\x3f\x19\x47\xd9\xb0\x31"
- "\x38\x86\xf2\xc0\x1a\xf6\xfb\x6d\xfd\x32\xa0\x7d\xd2\xc3\xcf\x7c"
- "\x4e\x52\x73\xff\xb2\x80\xe5\x68\xaf\xf4\x3b\x7b\x7f\x66\x74\xdc"
- "\x1f\xf6\xb1\xe3\x75\x0f\xa4\x17\x1b\x67\x52\xc1\x8b\x18\x2b\xde"
- "\x77\x0c\x9c\x91\x79\x1f\xfa\xff\x17\x87\x95\xfc\xca\xbc\x5b\x8d"
- "\xbd\x5e\xfd\xdb\x55\x72\x6f\x5a\x73\xf7\x4c\x57\xeb\x2b\xef\xd7"
- "\xec\xd5\x86\xa6\xa8\xb5\xfd\xf7\x0f\x19\xe7\xaf\x94\x6c\x7e\xa2"
- "\xcb\xe6\xfb\x6d\x97\xdb\x8f\x1f\x90\x8d\x83\xa9\x03\x72\xfd\x37"
- "\xbd\xec\xc1\xd4\xaf\xda\xcb\xd7\xed\xdc\x6b\x4f\xd3\xbf\x8c\xe2"
- "\x35\x17\xdc\xdf\x88\x7b\x79\xee\x53\xf9\xa2\x7f\xf0\x99\x7e\x8f"
- "\x3a\x3e\x68\xd1\xef\xaf\xc7\xfd\x07\xfa\xfd\x48\xdc\xef\xd1\xef"
- "\x21\xb3\x1f\xbc\xa4\xdf\x67\xe1\xfe\x79\xfd\x1e\x3a\xfe\x83\xc7"
- "\xf4\xfb\x11\xb8\x9f\xaa\xdf\x5f\x87\xfb\xb1\xfa\x3d\x64\xf0\x83"
- "\x34\x7d\x5f\x34\x05\xb8\x7f\x79\xe5\x76\xf7\xc1\x66\xb5\xf7\xf6"
- "\x81\x19\xba\x52\x3f\xab\xd6\x9f\x66\x03\x4f\x97\x1a\xf4\x45\x3a"
- "\x9f\x35\x4f\x41\x7a\x9e\x9f\xde\xb2\x46\xa5\x1f\xd0\xf3\xcf\xc4"
- "\xf8\xd2\x11\x95\xde\xa8\xa7\x17\xc3\xb6\x9c\x14\x95\xbe\x43\x4f"
- "\xaf\x80\x5e\x2c\x8b\x4a\xdf\xa2\xa7\xc3\x16\xad\x9f\x1e\x95\x5e"
- "\xa9\xa7\xef\x37\xfc\x10\xf4\x74\x87\x9e\xee\x45\x7a\x30\x2a\xbd"
- "\x44\x4f\x87\xfe\x7f\xff\x44\x54\xba\xd4\x2b\xd5\xf2\xdc\x96\x45"
- "\x1c\xa9\x64\xd9\xfa\x80\xf7\x08\xa3\x71\x9e\xa5\xca\xfe\x4b\x16"
- "\xd2\x53\xa3\xd2\xf3\xf5\xf4\x71\x7e\xfa\x6c\x5f\x54\xfa\xa0\xb6"
- "\x6f\x52\x1d\x15\x0f\xb6\x36\xc9\xdf\xfa\x91\xfe\x8f\xd2\x66\xfc"
- "\xd5\x32\x3e\xd3\x65\xd9\x23\x4e\xda\xab\x84\x38\x49\xbf\x2a\xd0"
- "\xfd\xfe\xe6\xb1\x1f\x96\x3a\x1b\xf7\xab\xc9\xf2\xbc\x14\xc7\x31"
- "\xe4\xf3\x72\xeb\x38\xed\x5f\x64\xac\xbc\x89\x15\x2e\x15\xe3\x50"
- "\xf9\x95\x76\xc9\x39\xba\xbe\x7f\x89\x3c\xfc\x8d\x44\x62\x38\xbc"
- "\x8e\xe7\x2b\xef\x95\xbe\x8e\x3c\x47\xe2\x34\x9e\xab\xca\x33\x54"
- "\x51\x73\x25\xa5\xf7\x7f\xb5\x4c\xe3\x33\xee\x6e\x35\x9f\x67\x59"
- "\xe4\xfc\xec\x73\x13\x9d\xd7\x4f\xbf\x92\xf3\xdc\x64\x5b\xc6\xdb"
- "\x3d\xee\x5f\xcd\x1c\x38\xd7\xf3\x2f\x8d\x7a\xfa\x3e\xa4\x17\x47"
- "\xa5\x6f\x1d\x5c\xb7\x43\xdf\x59\x53\xfd\x7d\x17\x45\x30\x7c\x51"
- "\x84\xb6\xff\x07\xf0\x5e\x2a\xcf\xa8\xdc\x10\xf1\xa4\x06\xf4\x78"
- "\x11\x9f\x86\x57\x8b\x00\x74\x36\xc7\xe9\xbf\x7a\x4e\x30\x40\x73"
- "\x1c\x3d\x62\xdb\x53\xec\x3f\x77\x41\xc6\x4e\x72\x76\x71\x0c\x63"
- "\xf6\xc9\x0a\xf2\xbe\x4f\x6a\x2b\xc6\xb8\xbd\x4b\xf9\xfd\x5f\x69"
- "\x76\x29\x6c\xef\xd2\x08\xed\x05\xec\x3d\x4f\x19\xfe\x90\x1c\x03"
- "\x5e\xf7\x51\x04\x0e\x5c\x9f\x53\x7e\x6f\xe3\x90\x8c\xcd\xc1\xdf"
- "\x13\x13\x35\xbb\x5c\xe2\x77\x6c\xbf\x56\xf1\x77\xe4\xec\x18\xdb"
- "\xa7\xe0\xde\xab\x7e\x78\x87\xf4\xc1\xda\xa4\x64\xf9\x50\x85\xd2"
- "\x35\x69\xc5\x4a\x5f\x1c\xaa\x10\x6f\xf1\x19\x9d\x43\x7c\xfe\xa5"
- "\x02\xb6\x72\x42\xbf\xaa\x0d\x7b\xc8\xd4\x57\x0b\xdb\xe4\xec\x21"
- "\x93\xd2\x4f\x1f\x96\x6a\xa6\x94\x8d\xbc\x5e\x28\x63\xed\xd7\xe6"
- "\x34\x1e\x58\x1e\x32\xb5\xac\xeb\xe0\x53\xdb\xb6\x85\x21\xf6\xff"
- "\x3e\xf4\x79\x7a\x39\xc7\x6a\x74\xba\x60\x77\x9a\xde\xc7\xfb\x8f"
- "\x97\x1f\x32\x85\xa5\xbd\xf2\x61\xa9\x5c\x63\xf2\xe4\x94\xf3\x18"
- "\xe2\x6b\x8f\xb0\xcd\x9c\x0a\x9b\xb9\x04\xfa\x3f\x25\xb2\xa6\x34"
- "\x33\xbc\xb2\xf4\xea\x3d\x2b\x28\x35\xb2\x32\x37\xeb\xd5\x8b\x34"
- "\xd9\x18\x7f\x30\x37\xcd\x13\x3d\xb6\xe1\xd5\x18\x53\x78\xee\x9a"
- "\x9e\x64\x95\x7b\x69\x7c\xaf\x99\x1a\x0a\xf6\xae\xbe\xfc\x77\x43"
- "\x22\x98\xb3\x72\x2c\x5f\xc6\x25\x51\x5b\xb7\xbe\x81\x79\xb0\x7e"
- "\xa6\xb4\xea\x33\x1a\x01\x3b\xd7\x94\x7e\x41\x78\x4f\x97\x91\x89"
- "\xbf\xb5\x50\xb5\x44\xae\x0f\x0d\x69\x29\x0d\x93\xaf\xe2\x2f\x54"
- "\xb5\x82\xfb\xe8\xc3\x8f\xd8\x4e\x63\x7f\x48\xe4\xb7\x9e\xa6\x0f"
- "\x5b\x2c\x21\x8c\x19\x21\xd8\xce\xcf\xf2\x5c\xef\xc3\x4f\x83\x32"
- "\x96\xe8\xaf\xc7\xb0\x4f\xb8\x77\xc5\x03\x9c\x16\x71\x7e\x26\x7d"
- "\x1f\x0a\x95\x6c\x7d\xd8\xce\xcf\x4e\x3e\xe3\x9a\x79\x53\xfd\xbb"
- "\xbd\xa1\x21\x6a\x0d\xe2\xc3\x7f\xd7\xc7\x07\x87\x9a\x73\x7d\x78"
- "\xc9\x59\xbc\xfe\xb5\x51\x4f\x06\x9f\x75\xba\xd1\x57\x1f\xa6\x39"
- "\x41\xe1\x97\xfb\x94\x7c\xb6\xbf\xe2\x3e\xaf\xb8\xe8\x21\x75\x1e"
- "\xed\xd7\x7b\xb4\x9a\x0c\x52\x31\x00\x7f\x2d\x63\x74\xaa\x35\xcb"
- "\x0c\xab\x5a\xa3\xcd\xb0\xab\x35\xcb\x8c\xbc\x4d\x23\xd9\x07\xf9"
- "\xd7\xf5\xdd\x19\x19\xf9\xb8\x3a\xba\x33\x6f\x1e\xfc\x1b\x7a\x9e"
- "\xf4\x3c\xfb\x0d\x94\xc5\x6b\xe5\xec\x4f\xdc\xa0\xfc\x88\x51\xc7"
- "\x6f\xd8\xaf\x98\xdf\xdd\x78\xd2\x41\xc9\xbc\xbe\x88\x7a\xcf\x4c"
- "\xac\x27\x3b\x70\x4d\x13\x56\xab\x5f\xfa\x6e\x79\xac\x01\x5f\x97"
- "\xf0\xb2\xcf\xa0\xda\xd3\xf8\xcd\x01\x91\x61\xf5\xab\xfc\xbf\x99"
- "\xda\xda\x85\x36\x58\xad\x4d\xbe\xd0\x19\xdd\x26\xfc\x0d\x78\xdf"
- "\xda\x24\x3c\x56\xaf\x3a\x2b\xfe\x9b\x6d\x86\x5e\x55\x3c\xfa\x9b"
- "\x8d\x8a\x6e\xe9\x79\x8a\x6e\xbf\x39\xa0\x8f\x57\x37\xf2\x3d\xc6"
- "\xee\x3c\xb5\x07\xff\x9b\x0a\xc3\x46\xf6\xeb\x79\xb8\x0c\xee\xf5"
- "\x58\x38\xbf\xa9\x43\xdb\xf3\xf4\xf7\xf2\x5b\x61\x68\x1f\xc6\xac"
- "\x5f\x1f\xe7\x76\x0d\xa6\x5b\x25\x2d\x2a\x29\x19\x38\xcb\x98\x38"
- "\x6c\xa7\xf8\x82\xf7\x79\xd5\xf7\x00\x3f\xba\x4b\x9e\x99\x45\x3d"
- "\xe8\x1f\x13\xeb\x4d\x3e\xe3\xcb\xf0\x06\xf0\x3f\x7c\x9d\x81\x0b"
- "\xd7\xc7\xef\xd0\xd6\x26\xee\x4f\xd0\xca\xcb\x79\xb8\x5f\x4f\x39"
- "\x78\xed\xe2\x02\x68\xc6\x7e\x40\x1f\x4d\x67\x9a\x28\x9a\x7d\x64"
- "\x97\xf4\xe8\xef\x87\x8f\xae\x8d\xa5\x87\x7a\xd6\xac\xd0\x0d\x2b"
- "\xd8\x1f\xe4\xa3\xe9\x3a\xfd\xba\xf4\xfa\xbf\xd0\xe7\xea\x78\x77"
- "\xf8\x67\x51\x65\x73\xfa\xf3\xaa\x6f\x4f\x9a\x78\x6f\x95\xd7\xda"
- "\x15\xbf\x1e\x3e\x1e\x55\xee\x78\xd1\x17\x6c\x23\xa7\x36\xf1\xb7"
- "\x02\x99\xe6\x3d\xee\xc3\x9d\x03\xf4\x56\x70\x12\xd4\x71\x83\x51"
- "\x87\x9f\x0e\xef\x37\xf0\xc4\xbd\x3e\x06\x7f\x34\x6e\xa0\x4f\x0e"
- "\xcf\x32\xca\xb1\xff\x3e\xfa\x28\xc4\xe7\x05\x13\xea\x41\xde\xd3"
- "\xc9\x86\x0e\x0e\xdf\xe7\x95\xfc\x48\x1f\xed\x63\x5f\x57\xd0\xb5"
- "\x4d\xf1\xd0\x47\x5b\xd4\x58\xf8\x91\x8c\xdd\xc2\xfb\x25\x1c\x8b"
- "\x18\xf5\xd5\x03\xee\x21\x1d\xe7\x26\x1d\x07\xe0\xf3\xeb\xfd\xf1"
- "\xf3\xba\x07\x16\x97\xc8\x83\xb1\xe3\x57\x39\xe2\xe3\x54\xa6\x0c"
- "\x9c\x81\xfc\xa8\x2b\xea\x0c\xe9\x16\x45\xef\x8f\x27\xff\x1f\xf6"
- "\xbe\x07\x2e\xaa\x6a\xdb\x7f\xcf\x30\x10\x2a\xc9\x80\x40\x54\x68"
- "\x63\x62\x52\xd7\xca\x6e\xea\xb3\xd4\x7b\xa9\xd4\x67\x5d\xff\x60"
- "\x57\x8b\xcc\x3f\xf8\x87\x2e\x78\x51\x47\x44\x44\x44\x40\x24\x9e"
- "\xdd\x14\xd1\x90\x87\x86\x48\xf7\x5a\x8f\xba\xfe\xa1\x7b\xeb\x3d"
- "\xec\xa9\x8d\x57\xec\xa1\x02\x83\x85\x85\x86\x3a\x22\x1a\x12\xda"
- "\x24\xa3\x0c\x30\x73\xce\x6f\xad\xbd\xcf\x99\x33\x67\x98\x01\xc6"
- "\x34\xbb\xbf\xf7\xf8\x7c\xe6\x73\xd8\xe7\xec\xb3\xcf\x3e\x7b\xad"
- "\xfd\xdd\x6b\xad\xb3\xf6\x5a\xa0\xa7\x7e\x92\xcd\xf4\xd6\xd2\x6c"
- "\xa0\x59\xda\x0d\xf2\x00\xe6\xd8\x48\xd5\xf2\x4d\x55\x5a\xd0\xa5"
- "\xd5\xfd\x0f\x00\x5e\x60\xde\xa9\xde\xe8\x4b\x81\x78\x83\xbe\x9a"
- "\xbc\x1f\x9c\xdf\xdc\x5f\x27\xed\x53\xd3\x35\x80\x6e\x5b\xbc\x11"
- "\x74\xd9\xb4\xab\xe4\x01\xe6\x1b\x71\x68\x05\xda\x74\xf8\xb4\xc8"
- "\xed\x5c\x4e\xff\x32\xdc\x03\x59\x05\x1a\x21\x9f\x16\xb3\x9d\xdb"
- "\xdc\xbf\x0c\xda\xad\x49\x5b\x4c\xfc\x71\x7d\x43\xdb\x10\xe3\x19"
- "\x5d\x19\xb4\x8b\x7b\x5b\x8b\x38\x3e\x52\xc1\xab\x07\x04\x73\xea"
- "\x41\x51\x1b\x39\x42\x7d\xbf\x81\xcf\x94\xf5\xe4\xd0\x51\xde\x6f"
- "\x40\x30\xe6\xfe\x43\x3b\x8f\xde\x0c\xfd\xdc\x3c\x20\x18\xae\xf5"
- "\x85\x6b\x3f\xc2\x91\xc3\x58\x65\x18\x1f\x1b\xda\x0f\xc6\xf6\xf9"
- "\x9c\x01\xc1\xac\xef\x46\x5a\xb7\x9e\x7c\x3e\x18\xeb\x88\x31\xd0"
- "\xb8\xb4\x48\x0f\xbc\x8e\x7b\x6a\xad\x70\x9f\x1e\x66\x28\xbb\xa7"
- "\xd6\x76\x8f\x20\x3f\xc3\x5c\xd6\x1d\xe4\xb7\x0c\xc1\x18\x6a\xa5"
- "\xe8\x6b\xca\x64\x59\x5d\xa9\x30\xd7\x41\x3e\xd6\xed\x17\xfe\xf7"
- "\xb1\xd5\x4d\x8b\x24\xa9\x6d\x24\x98\x7e\x2f\x5d\xe9\x01\xd8\xab"
- "\x53\xc3\x38\x10\xbb\x36\x2f\x61\x7b\x1b\x30\xb6\x5a\x34\xf1\x01"
- "\x5c\xee\x03\xfd\xc6\x1c\x13\x17\xd0\x06\x2b\x8c\x4d\x03\xd0\xa9"
- "\x64\x13\x8b\x9f\xf7\xc9\x46\xe0\xfd\xd4\x35\x20\x0f\xac\x21\x3e"
- "\x6b\xac\x24\x04\xdf\x13\xe8\xd6\x88\xfe\xd2\xa8\xbb\xe1\xd8\x30"
- "\x1a\x0e\x18\x0e\xef\x32\x66\x4d\x0c\xdf\xb0\xa6\x99\x6f\xac\x8c"
- "\xa9\x25\xb0\xce\xf8\x57\x69\xab\x31\xd6\xf3\x05\x7c\x57\xb4\x3d"
- "\xc2\x98\x0e\x37\xe0\x33\x36\x0f\x18\x83\x7b\x60\xa8\x9d\x40\x79"
- "\xf0\x80\xb8\x5f\xa8\x90\xee\x29\xd2\x0d\xb7\xd9\xbb\x12\xf9\x32"
- "\xa1\x2f\xe5\x1c\xfe\x9f\x48\xf7\xf2\xf5\x46\xfd\x07\x6d\x1a\x73"
- "\x57\x15\xd9\xf6\x5e\x30\xdb\x80\x4e\x6b\x17\xc3\x8a\xde\x8b\x36"
- "\x02\xbc\x77\xaa\x85\xbf\xb1\x49\xa8\x8b\xf7\x4e\x5d\x35\x97\xc7"
- "\x7b\xe1\x9e\x5d\xb6\x7b\x64\x7b\x77\x3e\x67\x72\x05\x8c\x2d\xfe"
- "\x6f\x84\xb1\x14\x7c\xa3\x34\xec\xbb\xb6\xae\x4e\xfc\x96\x6c\x20"
- "\x87\x72\x91\x9f\x9c\xc7\x67\x3e\xac\x92\xc7\x13\x3a\x5c\x83\xb1"
- "\x8e\xe0\x7c\x88\x18\xf7\x07\xfe\x0f\x83\xb6\xd8\xde\x26\xbb\x78"
- "\x5e\xd9\x76\xb1\x01\xd3\x8c\xfc\x45\xe4\x13\xc0\x15\x8f\x26\x72"
- "\x18\x63\x33\x44\xb1\xfd\x4f\x87\x8f\x62\x3f\xeb\xc9\xe1\x5c\x28"
- "\xfb\xb2\xb8\x03\x87\xdf\x14\xf0\x23\x62\xaa\xd5\xe2\x6b\x80\x67"
- "\xe2\x5e\x1e\xbb\x72\x0a\xe0\x89\x1a\xea\x7d\xca\x62\xe7\xd1\x2f"
- "\x8a\x0a\x87\xeb\xe9\x0e\xe5\x70\x87\xb2\xc6\x04\xf3\xc6\xd5\x37"
- "\xf3\x8d\x0f\x50\x7b\x61\x42\xdf\xb5\x44\x9b\x76\x85\x78\x00\xaf"
- "\x5c\xc2\xbe\x55\x35\x36\xe3\x3b\xf9\xf2\x19\xc3\x88\xbe\xd1\xc2"
- "\x64\x4b\x58\xd3\xeb\x43\xa1\xce\x15\x12\x84\xfe\xdc\x98\x67\x02"
- "\xea\x37\xb1\xb8\xd0\x47\x66\xcf\x5a\xd1\x9b\x70\x7f\x88\xec\xc3"
- "\x2b\x23\x22\xf1\x9b\xdd\x9e\x76\x83\x27\x7e\xbf\x4a\xdd\x06\x3c"
- "\x69\x25\x41\xc0\x63\x0d\x98\xd3\x0b\x73\xae\xff\xa5\xbd\xd1\x53"
- "\x6f\x39\x43\xb4\x8b\x88\xb2\x89\x1c\x89\x50\xa5\x10\xd5\xa6\xcb"
- "\x44\x0d\x74\xb5\x1c\xb1\x8c\x22\x62\xdc\x80\x02\x7f\xb6\xe7\xb9"
- "\x00\xf0\x75\x79\x30\x6f\x6e\xcd\xf8\xc7\x6e\x03\x79\x4f\x27\xea"
- "\xd8\x1b\x58\x2e\x09\x15\x3c\xff\x7e\xa5\x10\x23\x81\x8d\xed\x3f"
- "\xae\xb0\xfd\x53\x01\x23\xe1\x1e\x83\x24\x7f\x1f\x11\xfc\x08\x07"
- "\x65\x32\xec\x3b\x12\x77\x04\xb4\xa5\x4c\xe6\x7b\x10\xd0\x9a\x71"
- "\xc4\xc7\xe6\x7b\x40\xed\x56\x47\xe2\x80\x86\x99\x4c\x36\x1f\x94"
- "\x39\xd7\xea\x2d\xcc\x41\x3c\xef\x53\x82\xf7\xc2\x7d\xbe\x26\x6a"
- "\x63\x3a\x32\x51\xe2\xb5\x23\x6a\xc4\x7c\x78\x27\x68\xef\x1f\x99"
- "\xf8\x5e\x38\x26\x50\x0f\xf8\xec\x1f\xeb\x8f\xec\x72\x11\x43\x55"
- "\x7d\x6f\x94\x85\xda\x40\xd2\x92\x80\x9f\xae\x02\x0d\xfa\x61\x9c"
- "\x24\x3d\x3c\xa7\xb2\xb0\x9d\x54\x06\xb7\x90\x2a\xf8\x1f\x7d\x8c"
- "\x75\x8b\x2e\x92\x06\x8d\xf3\xf5\x06\xd6\x2c\x03\xf4\xd9\x88\x6d"
- "\x21\x16\xa0\x5f\x96\x1e\x56\xb0\x2a\x23\xb4\xd5\x40\x68\x1b\x95"
- "\x5c\x23\xa9\x4c\x42\x3d\x6b\x5b\x7a\x55\xe1\x19\x52\x15\xfc\x15"
- "\x7d\x0e\xca\x84\xba\xf8\x96\x2e\xda\xbe\x17\xee\xb9\x57\x2d\xb4"
- "\xdd\x0c\x6d\x07\xb8\x6e\x3b\xb5\xda\xbd\xb6\xdd\xe9\x77\xaa\xce"
- "\x9d\xb6\x61\x9d\x59\xa8\x0f\x66\xfb\xb5\x52\xef\x27\xf7\x5a\x6f"
- "\x62\x8c\xcc\x87\x78\xe6\xe7\x7a\xf4\x39\xba\xa7\x2b\x83\xfa\x11"
- "\x47\xd1\xbd\x5d\xd7\x08\xf5\x55\x64\xfb\xb9\x2e\x11\xf4\x73\x68"
- "\xcd\x38\x3a\x54\xd2\x95\x6c\xdf\x9f\x40\x56\x3d\x1a\xc1\xfc\x19"
- "\xfb\x47\x31\xbe\x3a\xea\x89\x6d\x39\xef\xc7\x80\x0d\xcc\x2f\xf6"
- "\xe8\x5b\xa2\xfd\xa5\xc5\x6f\xc0\x06\xa1\x2d\x8d\xa3\x5d\x4f\x4c"
- "\xea\x19\x9d\x94\x20\xe6\x07\x4d\x10\xb6\x95\xbe\x1c\xbd\x20\x3a"
- "\x36\x31\x7a\xa1\x66\xfa\x8a\xf8\x25\x8f\x2f\x7d\xe3\x0d\xcd\xe4"
- "\xe8\xe5\xcb\xe7\xfd\x21\xba\x37\x99\x1e\x3f\x6f\xc9\xf2\x58\xb4"
- "\xbd\x69\x34\xe3\x9e\x9e\x1b\xb3\x34\xe1\xf1\xdf\x8c\x1b\xe6\x60"
- "\x7b\xc3\x3d\x88\x75\x28\x83\xc3\xda\x11\x94\x6a\x25\x7e\x18\xf3"
- "\xc6\x77\x15\xaf\x5b\x0d\xfa\x1f\xf0\x5f\x13\xae\x53\xb8\x36\xa0"
- "\x6e\x80\xf1\xf6\x00\xbf\x2b\xde\xcd\xe3\xab\x2f\x93\x5a\x94\x2b"
- "\x6b\x77\xb2\xd8\x71\x75\xa0\x93\x1b\x59\xce\xba\x6f\xce\x62\x5c"
- "\xb8\xb7\xe1\x9c\xd1\x6f\x50\xe6\xa6\x73\x44\x05\xeb\x1a\xe8\x25"
- "\x5f\x14\xf0\xca\x7b\xf8\x0d\x41\x7c\x19\x7f\x31\x98\x08\xf1\xb0"
- "\x95\x7a\x83\x19\xbf\xd3\x7b\x4f\xb5\xa4\xf1\x88\xa7\x6c\x6e\x7d"
- "\xb1\x83\x8d\x8b\x1f\x61\xfe\xc2\xdf\x1c\x44\x1d\x66\x1d\xcd\x29"
- "\xf8\x05\xcc\xff\xfd\x09\x12\x4e\xeb\xcb\x05\xd9\xb1\x16\xc6\x7d"
- "\x65\x3d\x94\x59\x4c\x8e\x2f\x6a\xe5\x3e\x18\xe5\xb0\x2e\x7f\xd5"
- "\xcc\x7e\x78\x4f\x8d\x0f\xfb\xe1\xff\xf6\xbf\x6f\x8a\xd8\xcf\xf1"
- "\xfc\x4f\xfd\x89\xcf\xbf\xd5\xfb\xab\xd3\xbb\xfe\xf5\xe4\xf9\x78"
- "\xbc\x9b\xef\xff\x53\xee\xaf\x5e\xdf\xd5\x0f\xf9\x0d\x78\xab\xee"
- "\xed\x73\xc4\x1b\xf8\x33\x77\xe3\x7c\xe0\xe9\xb3\x24\x38\xc5\xc2"
- "\x37\xa4\xcd\x26\x21\xa9\x57\x08\xe6\x74\x6b\x4c\x48\xe2\x1b\x52"
- "\x6f\xa2\x4c\x5a\x8d\x39\x4e\x4a\xb3\xeb\x89\xcf\xc6\x7a\xa2\xae"
- "\x4a\xc0\x7c\xaf\x18\x17\x0b\x9e\x86\x23\x04\xe5\x8a\x44\x33\x39"
- "\x61\xfc\x11\xfd\x96\x74\x55\x51\x80\x3b\x75\x84\x20\xff\xfa\x44"
- "\x91\x80\x82\x20\xfe\x00\x9f\x11\x77\x80\x57\xc6\xed\x86\x73\x35"
- "\xfb\xb8\x70\xcf\x7d\xc9\xe5\x9e\x9a\xf9\xb8\xc6\x1f\x9b\x2d\xf0"
- "\xe6\x31\xb6\x57\x48\x4f\x73\x90\xc1\x3c\xa9\x61\x76\xf5\xea\xf1"
- "\x6c\x3d\xaf\x0e\x14\xec\x4d\xf0\xbf\x9e\xca\x8a\xf0\x1e\xa5\x98"
- "\x03\x13\xdb\xdc\xcb\x95\xd2\x1c\x98\xfb\x92\xc3\x3d\x53\xe6\x11"
- "\x65\x95\x01\x56\x4a\xc0\x41\x5c\xc1\x60\xde\xed\x86\x79\x56\xb2"
- "\x23\x88\xcf\x81\xfe\x6d\x28\x0c\xe2\xd7\x43\x9f\x8a\x5b\x33\x8e"
- "\x55\xc0\xda\xa3\x13\xbe\xbb\xe8\x60\x5e\xec\xde\x08\x75\xa6\xae"
- "\x20\x0f\x6d\x84\x7a\xd9\x50\x0f\xe5\x64\xd6\xbf\xca\xcd\x30\x06"
- "\x9f\xc0\x33\xab\x35\x73\xb0\x7c\x82\xc6\x00\xc2\x67\xc3\x7b\x68"
- "\xea\xc9\x89\x10\x58\xdb\x54\xf8\x0c\xf1\xb9\xad\x19\xc7\x01\xff"
- "\xca\x92\x84\xef\xbe\x39\xac\x9d\xe3\x91\x6c\xbe\xf6\xc7\x3d\xc7"
- "\x42\x8e\xd2\xfe\x0d\x1b\x93\x61\x4d\x6f\xa7\xf1\x22\x73\xd1\xde"
- "\x82\x32\x06\x95\x2b\xac\xc4\x97\xd9\x07\x40\xb6\x88\x01\x1c\x00"
- "\x79\x82\xfa\x38\x83\x2c\x01\x7d\xc9\xc5\x5c\x79\x78\x1d\xf4\xb6"
- "\x4f\x60\x5d\x2e\x41\x39\x60\xce\x8d\x97\x08\xda\xd8\x31\xcf\xe5"
- "\xf2\x59\xbc\x99\xe5\x20\x39\x5e\x2a\xca\x02\x88\x41\xb8\xfe\x83"
- "\x2c\xac\xea\x00\x1a\x02\x0f\x94\x83\x6c\xe1\xd7\x44\x8e\x9b\x84"
- "\xb1\x2f\xa7\x6b\x7e\x22\x8d\x6f\xec\xc1\x30\xfa\x04\xfa\xc2\xfb"
- "\xc0\x33\xca\x0d\xa4\x96\xda\xc2\x19\xc6\x9c\x50\x8b\xeb\x38\xea"
- "\xbc\x06\x68\x83\x07\x2c\x13\xae\xc1\xfb\x1f\x6e\x10\x9f\x09\xd7"
- "\x74\xc2\x98\x55\xc0\x98\x61\x9b\x54\xf7\x07\x99\x2b\x53\x18\x9b"
- "\x0a\x94\x2b\x84\x7b\x63\xc4\x76\x51\x2f\xe7\x40\xae\xc0\xf1\xc2"
- "\x71\x82\x76\x2a\x04\x1c\xab\x61\xf2\x4b\xe5\x2a\xc2\xbe\xb7\xe7"
- "\x00\xad\x33\xa5\xf1\x3f\xb1\xdb\x7e\xfc\xe1\x7e\xe1\x39\x95\x83"
- "\xed\x68\x07\xba\x51\x85\x05\xed\xa4\xd0\xc7\x03\xcc\xc6\x73\xe2"
- "\x12\xc6\x15\xc3\x38\xc6\x30\xc6\x07\x36\x60\xcc\x5c\xc0\xe6\x75"
- "\xe7\x00\x73\xe7\xa3\xfc\x54\x21\xc4\xc5\xaa\xc8\x44\x1e\x86\x32"
- "\xb5\xc3\x37\x40\xbf\xb0\x3d\x28\xcf\x80\x23\xc8\xb1\x15\x93\xed"
- "\x73\xd2\x4a\xf9\x68\x2b\xc6\x49\xfb\x0c\x4e\x68\x99\xfe\x7c\x42"
- "\x8b\x36\x30\x5a\xbf\x23\x06\xfb\x56\x87\xf3\x52\x7c\x57\xcc\x4d"
- "\x0b\xe7\x51\xf6\xaf\x43\xba\x89\xe7\x31\xde\x2e\xd0\xc9\x07\x9e"
- "\x75\x56\xe8\x13\x96\xbd\xa1\x4c\x73\x0e\x60\x9e\xda\x4d\x78\x4f"
- "\xaa\x74\x0f\xce\x1b\xe0\x61\x5f\xa8\x73\x0a\x8e\xbc\x58\x97\xe5"
- "\xaf\xad\x98\xf5\x4e\x3b\xda\xc0\x2a\x12\xc4\xfc\xb5\x98\xbb\x16"
- "\x31\x63\xe3\x1c\xd9\xd8\xe3\xd8\xec\x06\x5a\x51\xbe\x3b\x62\x29"
- "\x85\xf1\xae\x04\xf9\xff\x3f\x85\x18\x77\x15\xb3\x84\xfe\xe9\x58"
- "\x3e\x86\xa3\xb9\x85\x5b\xc4\x18\x0b\x95\xd2\xf7\x7f\x9b\x6c\x59"
- "\x31\x0b\x79\x12\xda\xaa\x40\xfa\xa3\x9c\x08\xf5\xe2\x6c\xbc\x45"
- "\xf7\xf1\x56\x34\xa3\x7c\x29\xf4\x1f\xf9\xa5\x52\x18\xbb\x5c\xfb"
- "\x79\x67\x3f\xcf\xa1\x0d\xd0\xff\x8f\xd8\x78\x40\x9c\xd7\x8c\x0f"
- "\xaa\x2e\x09\x32\x45\x12\xc6\xbb\x85\x76\x75\x28\x83\xb3\x75\xb5"
- "\xaa\xf4\x48\x9d\x05\x6d\xe8\x35\x50\x86\xf9\x5d\x95\xdb\xe2\x3f"
- "\x44\x9d\x49\x71\xa3\x0a\xc6\xe1\x09\x1a\x03\x02\xc7\x45\x9c\xaf"
- "\x9b\xe6\xa0\xee\x37\x8c\xcd\xd9\xa4\x06\x52\x65\x6e\x26\x82\x0f"
- "\x3f\xcc\xd9\x4b\xf8\xed\xb4\x09\x78\xc8\x1b\xe7\x2f\xd0\x77\x37"
- "\xc6\x66\x86\x71\xac\xce\xcc\xa3\xf3\xd6\x07\xe7\x6d\x07\xc6\x86"
- "\x80\xe7\x94\x45\x85\x43\xaf\x75\x74\x1e\x63\xcc\x8f\x77\x61\xec"
- "\x30\x57\x2c\x3c\x3b\x5d\xf4\x3d\x46\x1e\xc1\x18\x1f\x02\x9f\x94"
- "\xe3\x5c\x16\xc6\x4e\x05\xf5\x8a\xc5\xb9\x67\x47\x7f\x5a\xc7\x61"
- "\xbe\xf9\xb2\xf9\x56\x55\x2b\x8e\xb5\x85\xce\xe3\x8a\x04\x0b\xcc"
- "\x63\xfb\x31\xc5\xf1\xc4\x71\x6d\xcd\xd0\x43\x5b\x65\x21\xe2\x98"
- "\x4a\xe3\xa9\x5f\x21\xd0\xbc\x9a\xd9\x98\xf4\xa3\x04\xfb\x93\x6d"
- "\x0c\x05\xfe\xc3\x1c\x9f\xa5\xeb\xf0\xdd\x61\x6d\xc0\xe7\x23\x8f"
- "\xbc\x2b\x60\x56\x99\x11\x79\x44\x0f\xf3\x7f\x5a\xa3\x84\x1d\x15"
- "\x49\x54\x67\x01\x3a\x31\xfa\xe8\xdf\xa3\x71\x34\x9c\x60\x87\x81"
- "\x54\x46\x49\xf8\xa4\x2f\x11\xc7\x41\xe4\x49\x71\xde\x43\x1b\x56"
- "\x39\xfe\xe8\x2f\x40\x1b\xfe\x88\x6f\x92\x0c\xa5\x37\xca\xf1\x4d"
- "\x5f\x8b\xf8\x86\x7c\xad\x4d\x44\x1b\x1b\x5b\xaf\x0c\xe4\x58\xba"
- "\x1c\x93\x8e\xad\x60\xbe\x01\x4c\xe6\x42\xde\xd2\xce\x61\xf5\x71"
- "\x0d\x83\xfa\x54\x17\x17\xd6\x3c\xf4\x6b\xc4\x73\x71\xc2\x78\xd5"
- "\x41\xfd\x32\xdc\x0f\x89\x31\x10\xfa\xd4\x31\x5d\x0f\x70\xfa\x00"
- "\xc6\xba\x86\x7a\x43\xab\x40\xce\xef\xc8\x62\xd8\x2d\x62\x05\xbf"
- "\x20\xb2\xcf\xca\x46\xd2\x4b\xfb\x1b\xfe\xe2\x65\x72\x12\xe3\x71"
- "\x9b\x31\xde\x22\xb4\xad\xb9\x4c\xbe\x3a\x05\xcf\x0d\x10\x8e\xc1"
- "\x70\x3c\x08\xc7\xfb\xe1\xf8\x3e\x1c\x1f\x84\xe3\x46\xa8\xcf\x09"
- "\xf5\x87\x41\x79\x05\x9c\x7f\x5a\x38\x42\x1f\x4f\xa2\xff\x7d\x84"
- "\x20\x3b\xe2\xf9\x17\xb1\x0c\xc7\x67\x04\x9a\x57\x30\x9a\x9f\x7c"
- "\x0a\xda\x49\x82\xfe\xd7\xea\xeb\x68\x5b\xda\xcb\xe4\xcb\x36\x6c"
- "\x1b\xf7\x27\xc3\xff\x7b\xec\x64\x50\x68\xe7\xe4\x69\x38\x0e\x87"
- "\xe3\x0e\x38\x26\xc0\x71\x99\x30\x06\xd5\x88\x0d\x0b\x93\xe8\x98"
- "\x6f\xd0\x30\x79\x37\x42\x9c\xf3\xb8\x0e\x4b\xd8\x71\xbc\x62\xe1"
- "\x2c\x46\x6f\x03\xa9\xa2\x7c\x00\x75\x9f\xc3\xba\x70\x7c\x41\x38"
- "\x86\x0b\xc7\xf1\xc2\xf1\x5f\x85\xe3\x38\xe1\x08\xfa\xe8\xc9\x04"
- "\x41\xc6\x80\x71\x39\x99\x40\xfd\x9e\x72\xfa\x17\xb0\x67\x7c\x99"
- "\x8b\x3a\x32\xe0\xf8\x08\x68\xdf\xa3\x35\xe3\x4b\x6f\xd1\x3e\x8a"
- "\x36\x9f\x8e\x8c\xa3\xfb\xde\xa5\xdf\xb5\xbf\xd4\xd8\x61\xdb\x74"
- "\x1f\x45\x38\x01\x19\x28\xb0\x40\xc9\xe7\x08\xed\x24\x29\x85\xef"
- "\xc2\x42\x1c\x7d\x0f\x8c\x2d\x47\xf5\x21\xbf\xbc\x46\x9c\xab\xd4"
- "\x76\x8c\x71\xd0\xfc\x06\x45\xc2\x6f\x21\xe8\x06\x31\x22\x7e\xa3"
- "\xde\x23\xc4\xac\x2c\x83\x67\x6d\x90\x74\xf5\x2f\xc7\xb0\x6f\x68"
- "\xf7\x85\xc3\xf9\x5d\xd2\xf9\x93\x66\xec\x33\x8c\x67\x2d\xbc\xcf"
- "\xf0\x7a\xf2\x25\xc6\xc3\xff\x75\x03\x7b\xe7\x61\xe2\x3b\x0b\xf4"
- "\xd0\x8a\xe3\xdb\x40\x4e\xa6\x00\x16\xc6\x23\x0f\xd7\xdb\x70\xf6"
- "\x24\xb5\xeb\x0a\x3c\x02\xb4\x3c\x39\x02\x69\x6a\x37\x07\xed\x31"
- "\x28\xa0\x35\xe3\xab\xa1\x72\x4c\x39\x31\x14\x31\x05\x79\x03\xf0"
- "\x1b\x69\xed\xe3\x30\xff\x30\x2f\x9d\x3f\x9b\x77\x5f\xc5\xc8\xef"
- "\xd5\xd7\x5a\xd8\xbc\xab\x05\x3e\x03\xfe\xac\x6e\x46\xfa\x18\xc8"
- "\x57\x13\x85\x39\x5d\x0b\x73\x7a\x04\x9c\xaf\x61\x7d\x65\xe7\x85"
- "\x67\x01\x9f\x55\xe3\x7b\x3f\x28\x9e\x17\xde\x17\xdb\xc1\x78\xea"
- "\xf7\x8b\xe7\x85\xf6\x81\x1f\xab\x0f\xe0\x3c\x11\xcf\x0b\xef\x04"
- "\x72\x54\x0d\x11\xf1\x64\x03\xe3\xb7\xf5\xe2\x7d\x48\x37\x8c\x37"
- "\xc5\x6c\xfc\x5f\xe1\x37\xd4\x22\x5c\x1f\xd6\xcd\x21\x3e\x2b\xf3"
- "\xc9\xbd\x6c\x5e\x7e\xd5\x2c\xc7\xc8\xaf\x2b\xf9\x0c\x5f\x0b\xaf"
- "\x1e\x14\x51\x69\x19\x2e\xca\xab\x05\xf0\x9c\x18\x31\x57\xb2\x14"
- "\x93\xbf\x66\x47\x65\x91\x6d\x7c\xb1\x2f\x1b\xc4\xbe\xd8\xad\xcf"
- "\x94\x06\xd8\x37\x6c\x6b\x1d\xc8\xeb\x26\xc0\x05\x86\xdb\x35\x07"
- "\xc4\x1c\xf2\xd9\xc2\xba\x85\x79\xcb\xb3\x13\x59\x1e\x73\x5c\x1b"
- "\xd1\xc7\x87\x43\x3b\x56\x92\x95\x54\x69\x41\x97\x4f\xba\x44\xe6"
- "\xae\xea\x8d\x31\x55\x22\xa1\xaf\x1f\x43\xdf\x76\x59\xd1\xf6\xbf"
- "\x04\xf5\xd4\xaf\xa3\xad\x89\xbc\x59\x18\x33\x98\x47\x5f\xbf\x28"
- "\x8c\x2d\xe2\x17\x8d\xc9\xb7\x2e\x95\xe5\xd7\x41\x5b\x0e\xce\x8f"
- "\x77\x70\x1d\x0b\xe6\xcd\x65\x05\x38\x57\x4e\x4d\x12\x65\x52\xe8"
- "\x6f\x11\x93\x09\xab\x3e\xa4\x31\x87\x72\x06\x45\x30\x5b\xe0\xa9"
- "\xd3\xec\xdd\x4f\xe9\xd8\x77\x6e\x1a\x4f\x12\xcb\xbb\x3d\x82\x83"
- "\x3e\x60\x7e\x59\x47\x8f\x33\x9f\x92\x53\xb6\xfc\x1f\x76\xb2\x62"
- "\x19\x8b\x07\x75\xaa\x54\x9a\x13\xa7\xd6\xe3\x7d\x70\xff\x7e\x38"
- "\x5f\x2d\x9d\xaf\x2a\x16\xec\x5d\xd3\xfb\xae\x0d\x47\xdf\xb2\x40"
- "\x8c\x4b\xcd\x9e\xf7\xf5\x30\xfa\x7c\x6a\xf3\x80\xb9\x29\xcc\x5f"
- "\x1c\x67\x5c\xb3\xe9\x1c\x86\xf9\x8b\xf3\xb8\x63\xf3\xa0\x48\xf8"
- "\xb1\x79\xcb\xd6\xe6\x32\x3a\x6f\xe9\x9c\xfd\x3a\xdc\xae\x1f\x66"
- "\x6a\xf7\x42\x7a\xae\x0e\xf6\x81\x6b\xb3\x60\x5d\xad\x11\xae\x51"
- "\xdf\x3b\x8c\x1b\x62\xb9\xc9\x1b\xf1\xdb\x36\x7e\xeb\xc4\xbd\x57"
- "\xbe\xc0\xdd\x18\xeb\x43\xfc\x56\x3d\xb9\x39\x8d\xb7\xe2\x77\xa7"
- "\x9b\xbc\x29\xc7\x16\x17\xff\xeb\x62\x29\x6e\xcf\x29\x6f\xe1\xbd"
- "\x22\xe0\x59\x05\xcc\x17\xac\xa6\x8d\xc9\x54\x35\x66\xe4\x53\x3d"
- "\xf0\x1e\x1c\xf3\x59\x6e\xdb\xaf\x1b\x44\xde\x83\x79\xb9\xf0\x32"
- "\xf9\x66\x45\x6e\x10\x9f\x0f\x34\xcd\x87\xb9\x14\x07\xe5\x79\x70"
- "\x5c\xc8\x8e\x0a\x35\x1e\x85\x39\x92\xdf\x9a\xf1\x8d\x46\xcc\xe9"
- "\x8d\x63\x63\xf2\x4b\x35\x22\x9f\x65\xc3\x38\x20\xaf\xd1\xef\xc8"
- "\xd0\x6f\xe4\x2f\xe4\x33\xe4\x31\xdf\xb5\x2f\x51\x3e\xa3\x71\x05"
- "\xe0\x3c\xf6\x17\xf9\x0c\xda\x8a\x13\x63\xe2\x1a\xc8\x37\x6a\xf6"
- "\x3d\xe7\x9b\x74\xd1\x97\x16\xbf\x25\x25\x0c\x24\x81\xd0\xae\xa6"
- "\x4c\x43\xe3\x4e\x9e\xd7\x5b\xc6\x13\xac\x8b\xdf\xe1\x18\x4e\xde"
- "\xf7\x0e\xdc\xf3\x89\x34\xe6\x27\x86\xd2\x6f\x46\xb3\xa8\x2d\xb2"
- "\x1f\x5c\xab\xb6\xd7\x33\x0c\xe4\x8b\x02\xd4\x35\xd0\xb7\x6f\x50"
- "\x00\xd1\x00\xdf\x02\x8e\x7d\x63\x12\xe5\xda\x27\x03\xf0\x7b\xfe"
- "\x17\x13\xa1\x7f\x75\x2c\x4f\xf9\x17\xc3\x41\x97\x2c\x77\x61\x33"
- "\x1e\x8e\xb6\x1e\x21\x97\x4d\x1d\xda\xb1\x30\xf6\xff\x65\xf2\xed"
- "\x8a\x4a\x8c\xf1\xb1\xb4\x73\x4c\xe4\xd4\x24\xfe\x06\xc6\x45\xd6"
- "\xc4\x93\x7e\xf5\xe4\xdb\x48\xb4\x1b\xa5\xfd\x88\x36\x9a\xda\x14"
- "\xb9\x8d\xa6\xb6\x42\xf8\x19\x08\x39\x3d\xce\xee\x57\x23\x1c\x23"
- "\xba\xf9\x35\x0b\x75\xcd\x84\x9c\x51\x09\x63\xf5\x55\x6b\x46\xad"
- "\xcd\xfe\x8b\x7c\x89\x73\x1b\xfd\x38\xd0\xe6\xa4\xb0\x10\x8c\x29"
- "\x02\x74\x82\x7e\xaf\x7b\xec\x65\x5d\x32\xf2\xd1\x69\x9a\xeb\x1b"
- "\xe3\xf5\xba\xe7\x4b\x74\x9a\xd2\x93\xc5\xce\xac\xad\x81\x67\x5f"
- "\xdc\x74\x8d\xa8\xb4\xf1\xa4\x3f\xda\xbf\x7d\xad\xbc\x0e\x75\x5c"
- "\xe4\x89\x9d\x34\x87\xcc\xe9\x53\x09\x6b\x88\x12\xae\x3f\x04\xff"
- "\x97\x89\x72\x12\xdc\xa3\xf6\x30\x93\x00\x94\x8f\x5e\x58\x43\x1e"
- "\x6a\xcd\x38\x5d\x24\xd2\x0a\x65\x08\xb4\xc3\x09\xb6\x04\xe8\x6b"
- "\xed\x05\xbc\x0f\x63\xba\x1b\xe8\xb8\x51\x1c\xc6\x36\x7c\xa0\x3f"
- "\x1b\x3c\x4c\x44\xcd\xd6\x9e\xd3\xc0\xff\x47\x05\x99\xf1\x74\x31"
- "\xf0\x7e\x8d\xd4\xcf\xe0\x40\xbb\xff\x67\xe0\xfd\xbe\x26\x94\xcf"
- "\x5c\x8d\xcf\x99\xa7\xc4\xf1\x41\x7f\x55\x5f\xd0\x13\x28\xbd\x2d"
- "\x7c\x33\xf4\xad\x42\x9b\x4c\xbc\x9b\xc8\xb7\x03\x77\xe6\xd1\xfd"
- "\x73\xe5\xcc\x3e\xff\x6d\xa0\xa8\x87\xb3\x7e\x9f\xb9\xe0\xbb\xd6"
- "\x83\xa0\x5d\x1d\xe3\x98\x51\x5f\xbf\x1f\x82\xa9\x2d\x5d\x6f\x19"
- "\x43\x74\xa9\xcf\x62\x1d\x51\xae\xaa\x6b\x49\x0b\x26\x47\x82\xc7"
- "\xc0\x3c\x3e\xb3\x1b\xe6\x4a\x81\xfb\x3e\x95\x67\x76\x0b\xe3\x5b"
- "\xc1\x7c\x11\xce\xac\xc1\xb5\x04\x75\x7f\x58\x47\xca\x70\x8d\x6e"
- "\xcd\xf8\xd6\x5b\x9c\x37\xb0\x6e\x94\xc1\x3d\xcc\xc7\x3a\x07\xbf"
- "\xff\x9e\x49\xc2\xd8\x0e\x54\x6f\x60\xf5\x7d\x98\xcd\xff\xdb\x31"
- "\x36\x59\x1a\xea\xe1\x7d\xcc\x47\xed\x4c\xc4\x5c\xab\x02\xc6\xf4"
- "\x4c\x04\xbe\x1b\xe3\xc5\xe0\xd7\xa1\x7e\x9c\x34\x6f\x4f\x53\x6c"
- "\x3e\xd2\x6c\x3f\x2f\xbf\xdd\x20\xe9\x9b\xb5\xe1\x8f\xe7\x12\x8d"
- "\xb3\x79\xa8\xed\x8b\x6b\xd5\xb7\xd6\x4d\x9b\xf8\xa2\x1c\x25\xf7"
- "\xfc\xba\x6c\xe2\xa3\xd8\x00\xc3\x86\xf3\x2c\x31\x2a\xf0\x32\xa9"
- "\xbb\xd7\xd7\xe7\xbe\x88\x17\x12\xee\xe1\x53\x83\x89\x72\xe3\xf5"
- "\x7b\xbc\x07\x9a\xef\x2b\xe2\x3d\x1e\x7b\x79\x72\x82\x99\x68\x16"
- "\xe5\x90\xef\xe2\x88\xc7\x0b\xa0\x2d\x0c\xf2\x21\x5a\x03\x39\x17"
- "\x8c\x7b\x41\x8f\xf8\xa0\xfc\x71\x2e\x18\xdb\x4c\x29\x20\xde\x29"
- "\x0d\x7c\xe3\x86\x37\x3c\xbd\x61\x3d\x50\xbf\x0b\x3c\xd6\xc7\xe7"
- "\xbe\xa2\x0e\x68\xe3\x70\x14\xbd\xaf\xc4\x75\xdf\xea\xb6\x39\xef"
- "\x9b\x36\x08\xfa\xf6\xa1\x7b\x7d\x3b\x5f\x2a\xf5\xed\x7c\xe9\x4f"
- "\xef\xdb\xd9\x11\x76\x7d\x53\x4b\x7d\x8b\x81\xbe\x9d\x1d\xef\x5e"
- "\xdf\x2e\x44\x4a\x7d\xbb\x10\xd9\xc3\xbe\xed\xee\xa2\x6f\x27\x9d"
- "\xf7\x2d\xe9\x3e\xe8\xdb\x05\xf7\xfa\x56\x6f\x96\xfa\x56\x6f\xfe"
- "\x29\x7d\x43\x5d\x3e\x35\x84\xbf\x44\x63\xaf\xc7\x13\x1f\xf4\xdd"
- "\xbb\x4c\xce\x3f\x97\x5a\x40\xcb\xfe\x97\xc9\x39\xab\x30\xbf\x8d"
- "\x69\x26\xfe\x22\x93\x73\xce\xc5\x3e\xa1\x45\x7f\xd7\x73\x51\xc0"
- "\xcb\xc1\x8c\xa7\xcf\x53\xff\x86\x34\x23\x2f\xf8\x9b\x9e\x7b\xab"
- "\x90\xfa\xa3\x0c\x29\x15\xca\x15\x2d\xfe\x83\x36\xa0\x2f\x08\x07"
- "\xf3\x99\xf7\x1f\x94\x8f\xb9\x28\xf7\xc5\x1b\x95\x7c\x06\xc6\x04"
- "\xc3\x38\x7e\x2a\xc2\x6f\x19\x54\xbc\x2f\xde\x4c\x73\x31\xaf\xa3"
- "\xfb\x78\xcf\x95\x89\x7b\xd7\xc4\x67\x18\xfd\x86\x94\xc2\xf9\x3a"
- "\x31\xf7\x2d\xaf\x44\x79\x66\x50\x0e\xb6\x0f\xe7\x4d\x62\x7e\x5a"
- "\xe0\xf7\xf5\x02\x36\x98\x7c\xcd\x5d\xe1\xde\xf9\x47\x45\xdc\x7b"
- "\x21\x81\xf8\x62\x0e\xc7\x4d\xa9\xf7\xe0\x37\x47\xd0\xa7\xcf\x95"
- "\xe2\xb8\x4f\x35\xdd\xc3\xfb\xa6\x10\x0f\xdc\xb3\x87\x3e\x7a\xfa"
- "\x60\x23\x09\x4d\x21\x9e\x53\x93\xa0\x4d\x33\x89\xf2\x4d\x82\xf6"
- "\x60\xac\x99\x6e\x70\x9e\xda\xf8\x72\xa1\x3d\xfc\xfe\xed\x91\x40"
- "\x7c\x5e\x08\x4e\xe3\xd7\x6d\x23\x2a\xdc\xdf\x87\xfb\xf4\xd8\x1e"
- "\x3d\x2f\xef\xd6\x8c\xf3\xbb\xc4\xf7\xeb\x01\x7d\xfa\x32\xfa\x18"
- "\x2e\x48\xf4\x31\xec\xe8\x4c\x1f\x43\x2f\x46\x1f\x03\x91\xe8\x73"
- "\x61\x9c\x9c\x3e\x86\x47\xe5\xf4\x31\xc4\xdd\x1a\x7d\x0c\x0b\x25"
- "\xfa\xb0\x67\x30\xfa\x18\x52\x9c\xd3\xc7\x90\x2b\xd1\xc7\x10\xd6"
- "\x33\xfa\x18\x8e\xb9\xa6\x8f\x21\xb2\x0b\xfa\x78\x39\xa7\xcf\x85"
- "\xfb\x7b\x4e\x9f\x0b\xe3\xdc\xa0\xcf\xbd\x8c\x3e\xf5\x6b\x25\xfa"
- "\xd4\x8f\xed\x4c\x9f\x0b\x1f\x32\xfa\x5c\x28\x92\xe8\x53\xdf\x20"
- "\xa7\xcf\x85\x63\x72\xfa\xd4\xfb\xdc\x1a\x7d\xea\x55\x12\x7d\xd8"
- "\x33\x18\x7d\xea\x43\x9c\xd3\xa7\x7e\xb8\x44\x9f\x0b\xe5\x3d\xa3"
- "\x4f\x7d\xac\x6b\xfa\x5c\x30\xbb\x4f\x9f\xfa\xfd\x0e\xf4\x51\xbb"
- "\xa6\x4f\x7d\x83\x1b\xf4\xf1\x65\xf4\x69\x18\x28\xd1\xe7\xe2\xd9"
- "\xce\xf4\xb9\xf8\x22\xa3\xcf\xc5\x70\x89\x3e\x0d\x99\x72\xfa\x5c"
- "\x8c\x95\xd3\xe7\xe2\xee\x5b\xa3\xcf\xc5\x5d\x12\x7d\xd8\x33\x18"
- "\x7d\x2e\x1e\x70\x4e\x9f\x8b\x35\x12\x7d\x2e\xc6\xf4\x8c\x3e\x0d"
- "\xbd\x5c\xd3\xe7\x62\x7e\x17\xf4\xb9\xc7\x39\x7d\x1a\x5e\xeb\x39"
- "\x7d\x1a\x32\xbb\xa2\x8f\x7b\xb2\x5e\x03\xcd\x49\x71\x1b\xda\x31"
- "\xb8\x6a\x07\xc7\x0e\xfd\x0f\xb9\x8c\x06\x43\x21\xe7\xe5\xcd\xf6"
- "\x68\x34\xe4\x6b\x92\xc9\x6f\xeb\xc9\xa5\xc7\x0b\x39\x4f\x6f\x3e"
- "\xe3\xfd\x10\x2e\xe3\x83\x32\x7e\xad\x97\x8a\x5b\x7b\x8f\x0a\xf7"
- "\x5c\xbb\xce\x89\x7d\x69\xa3\xc7\xfd\x64\x00\xee\x9b\x5b\x07\xf2"
- "\x32\xfe\xdf\x9a\x71\x29\x1f\x64\xc1\x71\x5d\xed\xdf\x42\x5f\xa7"
- "\x23\x99\xa8\xdf\x5e\x2a\xb3\xc5\xbb\xc8\xe0\x93\x30\x6e\x98\xf6"
- "\x61\xdc\x67\x71\xa9\x39\x97\xc6\xa1\x1a\x10\x12\xfe\x30\x7f\x1e"
- "\x75\x8f\xcb\xe4\xf2\x15\x7e\xf3\x80\x10\xe4\x07\x90\xd5\xfb\x35"
- "\x91\xcb\xc3\x6d\xfe\x79\x7c\xe4\x76\xc1\x46\x58\xce\xea\x36\xbe"
- "\xc6\x6f\xee\x5f\x8e\x39\x3b\x97\xa7\x62\x2e\xca\xc6\xe7\x40\xf6"
- "\x7d\x04\x9f\x81\x31\x91\x76\xc2\x11\xfd\x64\x98\x6f\xe6\xe5\xe9"
- "\x54\x5e\x5e\xf7\xe0\x76\xe6\x0b\xd7\xf8\xa8\xc8\x77\xf0\x9c\xde"
- "\x50\xf6\x13\xe4\x79\xac\xdf\xa7\x89\x7c\xd7\x66\x77\xdd\x07\xca"
- "\x67\xa1\x6d\x3f\xe1\xfa\xbd\x50\x3e\x8c\x72\x36\x8d\xdf\x91\x9d"
- "\x2e\xf8\x10\x7f\xb7\x0b\xce\xa9\x85\x3a\x7e\x50\xe7\x2d\x94\xdd"
- "\x85\x36\xfc\xa1\xbc\x18\x75\x60\xe1\x7a\x00\x94\xa7\xe1\xb7\x03"
- "\xe1\x7a\x20\x94\xd1\xd6\x39\x84\xed\x79\xe9\x10\xe6\xe8\x77\xe4"
- "\xd6\xf6\x82\x7f\x47\xf5\x56\xa4\x01\xd3\x05\xbe\xb3\xf3\xff\xb9"
- "\xdc\xe8\x70\x6d\xa1\xdd\xb5\x5a\xf1\x1a\xf3\x51\xfb\x2e\xdd\xee"
- "\x5a\xb9\xc3\xb5\x02\xbb\x6b\xa5\x0e\x6d\x96\xda\x5d\x2b\x76\xb8"
- "\xaf\xc6\xee\x5a\xae\xc3\x35\xa3\xdd\xb5\x4c\xe1\x9a\x47\x6b\x46"
- "\xa3\xb7\xf4\x0d\xef\x72\x82\x70\x5e\x09\xe7\x35\x76\xe7\x17\x0a"
- "\xe7\xe1\xf9\x8d\xa3\x0c\x24\x3f\x44\x38\x4f\x69\xcf\xda\x6f\x8c"
- "\xb0\x6b\x7f\x38\xb3\x71\x34\x2e\xb4\xf9\xce\xf9\x0f\x6a\xe4\x3a"
- "\x22\xb7\xc3\xb5\x10\xe4\x2b\x7b\xde\x5e\x92\xa8\x99\xbf\xe2\x0f"
- "\x9a\xf8\xe8\x04\x74\x5f\x59\x1c\x9b\xa0\x59\xbc\x74\x61\xb4\x2c"
- "\x7e\x7a\x00\xc6\x12\xc4\xfc\x63\x18\x93\x45\x88\xf5\xdf\x68\xcb"
- "\x8f\x01\xb8\x0a\xcf\xaa\x36\x90\x71\xd4\x8e\x9d\xcb\xe2\x8c\x97"
- "\x63\x4c\x17\x16\xbf\x85\xbc\x54\x4f\x1a\x4f\x09\xf1\x5b\x74\x50"
- "\xd7\xe2\x3a\x7e\x4b\x53\x2d\x8d\x5b\x08\xf5\x58\xfc\x96\xa6\x3a"
- "\x98\xe7\x2f\xf0\xbd\x59\xbe\x0b\x96\x07\xec\x8a\x28\x9b\x18\xe7"
- "\xb6\xd1\xd8\x7f\xe9\xcc\x96\xe1\x18\x87\xb5\xbf\x05\xef\x13\xbe"
- "\x8d\x5b\xec\xee\x8f\x61\xd7\xc5\xf5\x41\x78\x66\xce\x00\xec\x6b"
- "\xef\x7a\x28\x53\xfb\x3d\xbd\x76\x85\xd9\xf2\x36\x0f\x50\xe1\x3b"
- "\xe1\x7b\xcb\xdf\x4d\xf9\x6a\x3d\xb9\xf2\xb1\xf4\x6e\x57\x6a\xed"
- "\x62\xbc\x89\xef\x40\xd8\x1c\xed\xf4\xae\xd4\x3f\x91\x57\x0f\x50"
- "\xe1\xb3\x11\xcf\xd8\x5e\x06\x28\x6f\x1e\x60\xeb\x8f\x5d\xff\x30"
- "\x4e\x92\x0a\xfa\x77\x96\x8e\x09\xd0\x94\x07\x9a\x0a\xef\xb0\x83"
- "\xcf\x68\x4c\xa7\xbe\xf9\xb8\x07\x18\xf3\x97\xd0\xb5\xaa\x29\x46"
- "\xb4\x65\xe2\x1a\xc5\x6c\x98\x4d\x92\xfc\x87\xb1\xb7\x36\x8b\xeb"
- "\x57\x93\x9d\xfc\xc7\x9e\x09\xe7\x8a\xed\x79\xc8\xee\x79\xa7\xf0"
- "\x79\x50\x2f\x82\xed\x07\x18\x80\xdf\x38\x41\xbe\x6f\x0a\x40\x5f"
- "\x4c\xbc\x17\xfb\xe8\x2a\x67\x9d\xab\xd8\x88\xd2\x38\x7e\xaf\x11"
- "\xc7\x31\x97\xe6\x4e\xfa\x7e\x98\x68\xaf\xa3\xfb\x91\xa0\x4e\xae"
- "\x2d\x87\xf3\xf7\xb3\x68\x1e\xb4\x9c\x7f\x8f\x7c\xd2\x87\x44\xb1"
- "\xb1\xfd\x3e\x1a\x31\x1e\xe7\x0c\xc3\xfa\xef\xcb\x04\x9a\x0b\x76"
- "\xd8\xef\x37\xe2\x79\xc9\xff\xfe\xfb\x06\xb1\x9e\x88\xcb\xec\x7b"
- "\xd5\xf7\x07\x69\x3d\x96\x57\x37\x9f\xd1\x7c\x88\xba\x9e\x7c\x5f"
- "\x2d\xd4\x67\x79\x09\x69\x5c\x9e\xef\x9b\xf9\xcd\x43\xf2\xa1\xaf"
- "\xa0\xff\x34\xe6\xb3\x71\x64\xcf\x85\x63\x35\xf6\x05\xc7\x08\xf7"
- "\x8e\xf3\x9b\xff\x3d\x12\xe8\xe3\x34\xa7\x86\xe0\xd7\xfd\x50\x13"
- "\xb9\xca\x64\x08\x25\x4f\xed\xbb\xec\x5d\xaf\xc6\xda\xf9\x3e\xfb"
- "\x88\x75\x18\x76\xd3\x6b\xd4\xa7\x5c\x9b\x88\xf6\x20\xe1\x5a\x22"
- "\xee\xaf\xb5\xfd\xef\x65\xf7\xbf\x27\xfe\x4f\xfd\x9a\x93\xe9\xda"
- "\xaa\x92\xf6\xee\x5f\x8d\x81\xb2\x8f\x43\x39\x40\x56\x5e\xc5\xfc"
- "\x9e\x41\x36\x6b\xa0\x3e\xe4\xc2\x79\xa1\xed\x5e\xb4\x3f\x89\xfc"
- "\x28\xe0\x0d\x35\xee\xc5\x16\xfc\x16\xd4\xb8\x87\xdb\xd7\x32\x9b"
- "\xee\xdf\x86\xeb\xc3\x85\xe3\x30\xe1\x38\x94\xe5\x34\xbd\xaa\x91"
- "\xf2\x92\xa3\x8d\xe6\xea\x30\x57\x79\xd2\xc5\x3c\xf2\x62\x9e\x74"
- "\xdc\xff\x2d\xe4\x75\x9d\x05\xf7\xc5\x74\x95\x93\x1e\xae\xaf\x17"
- "\xf7\x72\x5b\x73\xfa\x7f\xc2\xe5\xa4\x95\x62\x0e\x4d\x8c\xff\x95"
- "\xd6\x8c\x31\x60\x4c\x44\x4f\xda\x89\x3e\xa1\x35\x1d\xf3\x68\x56"
- "\xb1\xfc\x99\xb8\x07\x56\x81\x76\x73\x94\x1d\xab\xb4\x57\x69\x0e"
- "\xcd\x95\xcd\x24\x44\xfb\x1b\xbe\x01\xc6\xa0\xd9\xba\xb9\xff\x27"
- "\x02\x1f\x6d\x83\x35\x70\x40\x13\xb9\x46\xed\xc5\x34\x07\x74\x33"
- "\xfd\xee\xe5\x7d\x99\x5c\x4b\xa1\x75\xf8\xc8\x6d\x6c\xec\xae\x51"
- "\xdb\xd7\xce\x0c\x31\x4f\xe2\xb5\x50\x31\x2f\xb3\x81\x5c\x4b\xbf"
- "\xe1\x37\x13\x78\xeb\xda\x28\xb9\xcf\xf4\xb5\x69\xd8\x26\xf6\xdd"
- "\x40\xae\x9a\xb0\x6d\xa8\x33\xcb\x36\x67\xe1\xfc\x4a\x0b\x79\x00"
- "\xfa\x75\x59\x6c\x1f\xae\xc3\xfc\x6f\xa6\x7b\xf3\xb1\xcd\x1b\x9b"
- "\xd3\xb1\xdd\x1c\x83\x87\xb1\x88\xf9\x5c\x5f\x83\xf5\xef\x2f\xda"
- "\xae\x64\x20\x98\x0b\xe5\x30\x97\xaa\xb9\x9c\x21\x3a\x16\xa3\x7b"
- "\x88\x60\x63\xbc\x76\x05\xfd\xba\x36\xdd\x24\x2a\xf4\x81\x60\x3c"
- "\xfb\xc3\xe3\x94\x8f\xe1\x1c\x60\x75\x31\xcc\x11\xba\xaf\xd7\xbd"
- "\x75\xff\x1a\xcb\x8b\x7d\x9d\x78\x67\xc7\x8b\x31\xc6\x7f\x18\x67"
- "\x97\x17\x41\xd8\xf7\xf2\xc3\xe2\xaa\x24\xfa\xbd\x9b\xf6\xd1\xb1"
- "\x0f\xd8\x5f\x68\xab\xd1\xa5\x8c\xa9\x1e\xc2\xbe\x0f\x6d\x19\x54"
- "\xca\x7c\x54\x7f\xf8\xd4\x23\xf8\x41\xc0\xd1\x1f\x4a\x6c\xf9\x20"
- "\xa0\x4e\x36\xfa\xde\x43\xfb\xb6\xf7\x8c\xa7\xcf\xa8\x65\x73\xfd"
- "\x87\x66\x6e\xf3\x10\x1d\xf6\x41\x38\xdf\x5c\x65\x31\x63\xec\x07"
- "\xa7\xf1\xb3\x68\x9e\x39\xf4\x09\xdf\x32\x44\x87\xfb\x86\x9e\x34"
- "\x8b\x7d\x36\x36\xe3\x7e\x15\xec\x33\x1b\x5b\xe3\x05\x71\x1c\x37"
- "\x5e\x87\xb6\x53\xcf\x90\x06\x62\x8c\x45\xbf\x39\xdc\x7f\x85\x73"
- "\x98\x8d\x81\x91\xea\x7c\xf4\xf9\xac\x0e\xd5\xfd\x69\xce\x1f\x68"
- "\xbf\x90\xe6\x2d\x83\x77\x00\x5a\xe8\x52\x71\xcf\xbf\x91\xc6\xdb"
- "\x58\x17\x4f\xd8\x7b\x53\x3f\xd9\x1f\x85\xef\x24\xc6\x62\x71\xad"
- "\x30\x08\xe7\x36\xe1\xb3\x13\xdb\xc9\x35\x62\x7c\x0b\xf3\x91\xc3"
- "\x78\x54\x63\xdc\xb9\x2a\x13\xcc\x93\xa4\x76\xe4\x85\x6a\xcc\x73"
- "\x69\x20\xc6\xf5\x6c\x7d\xc3\x31\x37\xc6\xe1\xf3\x71\x6c\x81\x76"
- "\x46\x18\xd3\x2f\x5a\x33\x7e\x54\x89\x63\x9a\x1d\x84\xfa\x8e\x51"
- "\xd3\xd5\xda\x60\x85\x3e\x57\x81\x96\xa1\x7b\xe0\x0c\xf6\xaf\x92"
- "\xf3\x1f\xa2\x43\x9f\x6c\xf8\x5f\x88\x75\xca\x68\xc7\xe6\xd2\x8f"
- "\xef\xc3\x33\x7e\x44\xff\x06\xc4\x4a\x8c\x8d\x06\xe7\x26\x09\xe3"
- "\x47\xf3\x44\xe4\x24\xb2\x71\x60\xf5\xaf\x0b\xdf\xc3\x1f\x6c\x85"
- "\x7e\x15\x48\xf6\xe2\xeb\x74\xed\x46\x7e\x2b\xa4\x3a\xe1\x8f\xa5"
- "\x76\x7d\x36\xd1\xfd\xaf\xd7\xd1\xd6\xf7\x63\x14\x3e\x6b\x23\xc6"
- "\x05\x43\xbe\x68\xb2\xe7\xff\x1f\x9f\xc3\x7e\xa2\xcf\xaf\xd5\x6f"
- "\x50\x29\xac\xb7\x07\x70\x9c\xe1\x9e\x24\x98\x0b\xba\x2e\xd6\x42"
- "\x9a\xa3\xae\x35\xe3\xfa\x50\x71\x2d\x04\xfd\x02\xd6\x85\x96\xc1"
- "\x54\xef\x04\x79\x5a\xcf\xa1\x3c\xd3\x12\x8a\x7c\x03\x73\xdd\x2c"
- "\xc8\x3a\x66\xb8\x27\x4a\xfc\xe6\x65\xc5\x7d\x13\xd7\xe8\xf7\x5e"
- "\x93\x98\x7b\x8d\xc5\xe1\xbb\x9e\x29\xed\xb3\xb8\x9e\xd3\x69\x9f"
- "\x05\xee\xfd\xc9\xa3\x39\xba\x76\xe3\x9a\x52\xd9\xdc\x80\x6b\x04"
- "\xbd\x1f\xf7\x5e\xa4\x82\x4e\xce\xf6\x0f\x35\xa0\x7d\x9e\xe6\x32"
- "\xc1\xbe\xb0\x9c\x12\xf5\xf4\x7f\xe0\x5b\x15\x1e\x19\x2f\x5d\x37"
- "\xd9\xf2\x8b\x03\xbd\xf1\x5b\xdb\x11\xd5\x04\xa2\x7b\x18\xd7\xeb"
- "\x96\xc1\x98\x2b\xbb\x35\xa3\x25\x58\xcc\x93\x4d\xf3\x62\xb3\xf7"
- "\x69\x76\x19\x6f\xf1\x09\x32\x0c\xe3\x05\xe0\xfe\x3a\x3a\x06\xea"
- "\x3c\x33\xc6\x70\xc6\x78\x94\xba\x64\xcc\xb5\xd2\x72\xea\x9d\x20"
- "\xba\x47\xd9\xa4\x7b\xe2\x3a\xca\x28\xcd\x97\x53\x68\x9c\x25\xef"
- "\xa9\x49\x16\x1e\xef\xa3\xf2\x84\x5f\x9e\x19\xaf\xd1\x1c\x06\xd8"
- "\xe6\x2d\xc7\x23\x6e\x29\x12\x64\xd3\x66\xc0\xfd\xfb\x80\x56\x54"
- "\x76\x87\xff\x83\x9a\x88\xc9\xca\xf2\xb5\xb2\x98\xfa\x82\x3f\xb6"
- "\x17\x8b\xb1\x01\x63\x46\x63\x1e\x98\x96\x69\x1e\xc3\xdc\xc6\xa6"
- "\x15\x34\xbe\x75\xce\x00\x6f\x61\xdd\xf4\xde\xc4\xfa\xe5\x3b\x37"
- "\x49\x49\xfb\x88\xfd\x73\xaf\x6f\xa6\x31\x82\x1e\xe1\xd5\x9a\x61"
- "\x4a\x17\x63\x73\x30\x79\x8a\xc5\xbd\x66\xb4\x30\x5d\x65\xf3\x69"
- "\x80\x8f\xf0\x6c\x9f\xdb\xf0\xec\x52\x41\x26\x37\xb0\xd8\xdf\x2d"
- "\x0b\x81\xae\x86\xd6\x8c\x1b\xde\xa2\x3e\x23\xec\x21\x1a\xca\xf4"
- "\xac\x1b\x1a\x49\x9f\x69\xe9\x14\x8f\xf5\xf9\xa5\x4b\x13\x34\x0b"
- "\x63\x97\x6b\xe7\x25\x2c\x88\xd1\x44\xc7\xc7\x2f\x8d\xd7\x60\xf0"
- "\x25\xfb\xf9\xc3\xf2\x13\xdd\x18\x2e\xe4\xf2\x2b\x96\x72\xf9\xdd"
- "\x90\xe5\xbf\x34\x90\x1b\xe9\xb7\xc7\x76\x71\xa3\xc0\x55\x3b\x39"
- "\x4a\xae\x04\x7e\xf8\x1d\x45\x07\xbf\x72\xb4\x65\xcc\x35\x93\x70"
- "\x58\xeb\xe9\x5a\x28\xc5\x9c\xb8\x31\x1d\x7d\x8c\xea\xc9\x8d\xb6"
- "\x42\x4e\x45\x68\x0c\xa1\x0c\x0e\xf7\x81\x62\x9c\xf6\x52\xf8\xe9"
- "\xe0\x57\x0e\x3f\x7a\x1f\xf7\x0f\xba\x5f\xbe\xc4\xfe\x1a\xf3\x1f"
- "\x49\xcd\xc4\x3a\xfc\x5a\x15\xc5\x2f\x6e\x0b\xab\xe7\xd0\x07\x25"
- "\x9f\x71\xad\x44\xa8\x47\x73\x72\xf5\x5d\x4b\x34\x4e\xea\x79\xf0"
- "\x19\x97\x76\x0b\xf5\xa8\x0f\x80\xf8\x3e\x98\x43\x00\xea\x8b\xf5"
- "\x54\x7c\x46\xcb\x28\xa1\x1e\xf5\xc9\xe1\x32\x94\xce\x9e\xeb\xc9"
- "\x67\x7c\xa2\x11\xea\xa9\xed\xdb\xb3\xab\xe3\xc5\x65\x7c\x5b\x8c"
- "\x75\xb8\xb5\x2a\x16\xdf\x36\xe3\x46\x01\xd4\x77\x1a\x7b\xd5\x3d"
- "\x3a\xb5\x8e\x73\xa4\x93\x76\x41\x6c\xf4\xb3\xb1\x4b\x12\x31\x83"
- "\x54\xc2\xd2\x15\x09\x78\x5c\x32\xef\x8f\xf4\xb0\x74\xee\x1b\x0b"
- "\xd8\x3f\x09\x71\xc3\xf0\x9f\x38\xe0\x37\x3c\x2e\x5c\xa1\xc5\xc3"
- "\x82\xa5\x58\x4c\x8a\x19\xba\x62\x01\x1e\x1c\xf7\x81\x86\xb5\x66"
- "\xb4\x36\x03\x6f\xd4\x31\x9c\x6d\x35\x1b\xc8\x25\x2a\xd3\x61\x9e"
- "\xa4\xa3\x61\x16\x22\xda\xb5\xe4\x31\x47\xcc\x9e\x18\x73\xc4\x77"
- "\xad\x76\x81\xaf\x25\x36\x1a\xd6\x0c\xd0\xb1\xcd\xc3\x0d\x24\x46"
- "\xc8\x61\x3d\x20\x98\xc6\x2f\xcd\x68\xcd\x14\x7c\x3b\x55\x5c\x4e"
- "\xff\x0a\x8c\xcb\x0f\x65\x9a\x93\x1a\xca\x66\xa8\x87\xb9\x6a\x30"
- "\x17\x75\x00\x94\x6b\xd0\x26\x05\xe5\x60\x28\x87\x70\x39\x6a\x03"
- "\xee\x31\x86\xb2\x06\xca\xa1\xd0\xbe\x2d\xff\x9b\x73\x59\xd9\xfc"
- "\x89\x98\x27\x9b\xe5\xc4\x36\x97\xd9\x72\x62\x63\x9e\xa6\x54\xf5"
- "\x2c\xba\xfe\x52\x19\xc4\xdc\xe8\x11\xdc\x7f\x02\xd4\x69\x14\xd7"
- "\x4b\x66\xef\x30\x9b\xc5\xf8\x29\xcc\x9e\xd1\xe6\x6d\x97\x5b\x1c"
- "\xcb\xc1\x62\x6e\x71\xb4\x77\xd1\xdc\x86\x70\xe4\x33\x30\x4e\x2c"
- "\xef\x34\xf6\x0e\xcb\x89\xd9\xb6\x06\x63\xee\x1a\xd3\x16\x2a\x06"
- "\x15\xa2\x0d\x0d\xca\x2c\x66\x24\x7f\x8d\xb4\xd1\x78\xfa\x62\x3c"
- "\x39\xfb\x58\x12\x4e\xf7\x43\x7d\x09\x32\x03\xcd\x63\x15\xb7\xd4"
- "\xd7\x32\x2f\x9a\xc9\x81\x6d\x67\x19\x7e\x0d\xaa\x63\xf2\x42\x5b"
- "\x39\xff\x32\xcb\x75\x62\x20\xed\x93\x50\x67\xf1\x55\xc4\x2d\xe5"
- "\xe1\x5e\xdf\xa4\x79\xd1\xf4\x1c\xd4\x5b\x07\xb2\x9a\xd0\xbf\x3d"
- "\xfa\x10\xdc\xe3\xca\x09\x31\x32\xda\x76\xcf\xe9\x9f\x8e\xcf\xf1"
- "\xa6\x72\xc8\x97\xc4\x07\x73\x53\x62\xdf\x0a\xed\xe2\xdd\x6d\x82"
- "\x73\xe8\x43\xda\xf2\x32\xf1\xc1\xf8\xbe\x42\x5f\x76\xb3\xbc\x60"
- "\xed\xe3\xc4\x58\x53\x06\x38\xe7\xf8\x3e\x2f\xff\x9e\x72\xe5\xe0"
- "\x05\x43\x23\xc6\xc3\x7f\x43\x85\xf4\xce\xf6\xbc\x19\xd2\xe2\x3f"
- "\x58\xd7\xb2\x77\xc0\xbf\xb0\x1c\x9e\xed\xa0\xff\xb7\x8d\xa2\x3e"
- "\x2c\xa8\x97\xb4\x46\xe6\x33\x1f\xd4\xf6\x4a\x8c\xa7\xcb\x65\xa0"
- "\x3c\x89\xfb\xa6\xdb\x0f\x20\xcf\xf2\xea\x41\x86\x9d\x6b\x30\x76"
- "\xb3\x02\xc6\xb8\xfd\x63\xbc\x26\xc4\xec\x52\xd2\x18\x57\x56\x12"
- "\x4c\xf7\x08\x83\x8c\x82\x7b\x50\x2f\x13\xeb\x41\x94\x3b\xd0\x9e"
- "\xc4\x65\xb4\x47\x22\xdf\x02\x8d\x31\x86\x88\x89\xf7\xef\x5f\xca"
- "\xfb\x85\x66\x22\x1f\xa3\xac\xab\x57\xe3\x98\x75\x84\xc2\x73\x5f"
- "\x80\xdf\xab\x2c\xa7\xcc\xeb\x8d\x62\x9b\x18\x57\x0d\x64\xa8\x66"
- "\x38\xaa\x5b\x33\x3a\x26\xd9\xe5\xda\x13\xf6\x44\x77\x2c\xc6\x78"
- "\x6f\xd8\x36\x93\x9d\xad\x1f\x32\x19\xa4\x23\xc9\x40\x7c\x73\xd9"
- "\x5c\xec\x00\xf9\xe7\xdf\xa2\x84\xff\x41\xfe\x79\xaa\xc4\xa1\x8d"
- "\xd3\xa2\xad\x94\xf1\x74\xc7\x27\xc0\xa3\x2f\xc0\xef\x55\xa8\xaf"
- "\x13\xf3\xc9\xaf\x53\xd2\x7d\x92\x97\x3d\x82\x71\xbf\x7b\x47\xad"
- "\x78\xde\x53\x11\x0e\x63\xda\xd1\x28\xce\xfd\x16\xff\x41\x65\x50"
- "\x36\x8b\x36\x16\x66\x73\xb1\x78\xdb\x95\xab\xa1\x1c\x2c\x96\xe1"
- "\xff\x50\x11\x2b\x50\x4f\x6c\x01\x5d\x12\xf5\xce\x05\xc1\x20\x17"
- "\x06\xa3\x9e\x67\x01\xfa\xff\x9b\x46\xa8\x1b\x61\x20\x6f\x09\x18"
- "\x63\x99\x65\xf0\xb8\x1e\x29\xbe\x0b\x97\xe1\xe1\xcb\xde\xc7\x9a"
- "\xcb\x6d\x4e\x2b\x35\xfa\xf5\x4f\x82\x3a\xb0\xfe\x9b\xa9\xbe\x87"
- "\x31\xd7\x36\xb4\xab\xa7\xeb\x33\x41\x4e\x7e\x03\xf9\xcb\x4a\xfd"
- "\xb0\x36\x26\xab\x69\x9c\x5e\x8c\xf9\x41\xe3\xf3\x61\x8c\x4a\x0b"
- "\xf1\xa2\x79\x01\x36\xa7\x15\xd3\x78\xf8\x2b\xc3\x7c\xc4\xf8\x94"
- "\x80\x3d\x71\xbc\x32\xae\x02\x63\x56\xd2\xfc\x1f\xad\x61\x7d\x69"
- "\x9c\x4a\x21\x3e\xe5\x8e\x44\x12\x50\xc0\xb1\xf8\x94\x34\x1e\x88"
- "\x17\xe8\x24\x89\xce\x63\x54\xf2\x19\xc5\x09\x62\x8c\x4a\xfe\xa6"
- "\xd5\x0c\xff\x23\x2f\x60\x5e\xf4\x30\x5a\x96\x62\x4b\xa9\x9c\xc6"
- "\xac\x54\x02\xc6\x29\x59\xcc\x4a\xf7\xd6\x06\x6b\x14\xe3\x13\x6b"
- "\x91\x98\xef\xde\xee\x1c\xe0\x5f\x9b\x10\xcb\xa0\x23\x4e\x38\x57"
- "\x6e\x20\x59\x62\xfc\x29\x23\xda\xc8\x72\xa9\x1d\xac\x1d\xf7\x5f"
- "\x6c\x73\x86\x2f\xd7\xfd\xb7\x69\xaf\xd3\x58\x14\x1c\x3c\x8f\xa3"
- "\x58\xc7\xf4\x46\xce\xdb\x71\x0e\xcf\x5f\xb0\x74\x61\xf4\xdc\x45"
- "\x8b\xb5\x9a\x97\xa7\xbf\x40\x93\x1d\x0e\xd5\xc4\x26\x44\xd3\xe5"
- "\x47\xf3\xf2\xf8\xe7\xa7\x4e\x9d\x3e\xf7\xf7\xd3\x9f\x9b\x3e\xe3"
- "\xf7\x63\xd9\xee\xc4\xe9\xf1\xab\x30\x61\x66\xc2\x52\x0d\xde\x34"
- "\x5f\xc8\xb2\x9d\x1c\x1d\xbf\xd4\x71\xee\x07\x50\x9b\x96\x92\xda"
- "\x6f\x4d\xf8\x3f\xb3\x9b\x71\xbb\x44\x7b\x16\xc3\x39\x6e\x2b\x8e"
- "\x2d\xcd\x5f\x9a\xc1\x85\xa0\x2c\x25\xe4\x3f\xc7\x35\x06\x6d\xa2"
- "\x46\x5c\x6b\xe0\x5d\xaa\xed\xe3\x70\x09\xf7\x62\x3c\x2e\xb5\x38"
- "\x6f\xd9\x39\xbe\x17\xff\xc0\x03\x69\x2c\x96\x16\xaf\x12\x6d\xdc"
- "\x78\x4e\xec\x43\x3d\xd6\xc9\xe0\x26\x4b\x79\x76\xf9\xa1\x52\x2e"
- "\x49\xfa\x27\x1b\x23\x42\x50\x74\xf1\x84\xb1\xf3\x82\xdf\x3d\xf8"
- "\x9b\x68\xc3\xf2\x44\xbe\x16\xf5\x33\x5f\x05\xac\xb7\x49\x1e\x2c"
- "\x17\x55\x56\x0d\xcd\x9f\x30\xd5\x6a\xf1\x98\x6b\x55\xc2\xd1\x83"
- "\x9f\x6b\x55\x51\x9d\x90\x4f\xe4\x6b\xe8\xbe\xfa\x44\xbe\x1a\x73"
- "\xae\x01\x1f\xaf\x9f\x6a\x49\x5d\x3f\xd5\xca\x5b\xe6\x82\xac\x0e"
- "\xc7\xef\x70\x7f\xf8\x54\xeb\x77\x3c\xcd\x3b\x83\xfb\xe8\x59\x4c"
- "\xc1\x72\xf4\x97\x9c\x03\x3c\x5c\x78\x9d\xe5\xea\x9d\xba\xea\x87"
- "\xf3\x73\x57\x19\x58\xae\xde\x6b\x2c\xbf\x35\xcb\x01\x4e\x52\xa1"
- "\x9d\x63\x73\xad\x1e\x9a\xa9\xd6\x0e\x9e\xee\x71\xcd\x22\xea\xae"
- "\xf2\xef\x3a\xb5\x55\x64\x3f\xd6\xc0\x6f\x1d\xa4\xe2\xb3\x1f\xd7"
- "\xc1\x31\x93\xcf\x09\xdd\x8d\x78\xcd\x67\x0f\x2b\xe0\xb7\x86\xc2"
- "\xf9\xa7\x93\xe0\x98\xc9\x67\x8f\x9c\xce\x6f\x1d\x0c\xe5\x67\x86"
- "\xc1\x11\xca\x7d\x42\xa0\x3e\xe1\xb3\x7d\x36\xc0\x31\x9d\xcf\xbe"
- "\xd7\x02\xf5\xa0\xec\x1b\x07\x47\x28\xab\xeb\xa0\x1e\x94\xfd\x27"
- "\x5d\x56\x90\x1a\xf8\x1f\xce\x8d\xf1\x61\xcf\xfa\x6d\x30\x7d\x56"
- "\xf6\xf3\xa1\xec\x19\xe3\x87\xb1\x67\x4c\x1c\xc3\x9e\xf1\xbb\x89"
- "\xec\x19\xfd\x0e\x40\x3d\xe8\x63\x60\x31\x1c\xd7\xf3\xd9\xf7\xe5"
- "\x42\x3d\x28\xdf\x9f\x0e\x47\x28\x3f\x08\xcf\x1a\x0c\xe5\xfe\x91"
- "\x70\x84\xf2\x43\xe3\xa0\x9e\x0f\x9f\x3d\x70\x38\x1c\x37\xf0\xd9"
- "\x83\xb0\x7d\x28\x0f\x0e\x80\x23\x94\x87\xa8\xa0\x1e\x94\xc3\x4c"
- "\x70\x84\xf2\x14\x78\xa7\x41\x6a\x3e\x3b\xc2\x1b\x8e\x39\x7c\xf6"
- "\x34\x78\x5e\x28\x94\x7f\xaf\x85\x23\x94\x67\xc0\xfd\x83\xa1\xfc"
- "\x4a\x2d\x1c\xa1\x1c\x89\xef\x1a\xc0\x67\xcf\xc4\xe7\xe4\xf2\xd9"
- "\xaf\xe3\x3b\x43\x79\xf6\x27\x70\x84\xf2\x5c\xec\x0f\x94\xe7\xe1"
- "\x7d\x50\x9e\x0f\x63\x30\x28\x98\xcf\x8e\xde\x0d\xc7\x7c\x3e\x3b"
- "\x26\x05\xea\x41\xf9\x8f\x93\xe0\x08\xe5\x25\x30\x86\x83\xa1\xac"
- "\x6d\x86\x23\x94\x97\xe3\xfb\x86\xf0\xd9\x89\x39\x70\x2c\xe0\xb3"
- "\x57\x2d\x84\x7a\x50\x4e\x19\x05\x47\x28\xa7\xc1\xf8\x0d\x86\xf2"
- "\x5a\x03\x1c\x0b\x9c\xd3\xf3\xcd\x48\x7e\xad\x17\x8c\x7b\x4e\x0d"
- "\xbf\xf6\x1e\x38\x6e\xc9\xe4\xd7\x7a\x86\xf1\xd9\x79\xc3\xe1\x3c"
- "\x1c\xdf\xd1\x42\x79\xa8\x50\x86\x63\xee\x2c\x28\x0f\x13\xca\x70"
- "\xdc\x3a\x11\xca\xc3\x85\x32\x1c\xb7\x63\x79\x14\x9f\xfd\x2e\x1c"
- "\xbd\xe0\xb8\xbd\x1c\xca\x63\x84\x32\x1c\x77\x04\xc0\xd1\xc2\x67"
- "\xe7\x13\x38\x1f\x0e\x47\x1d\x94\xe1\xb8\x2d\x1d\xca\xe3\xe0\xd8"
- "\x00\xe5\x71\xc6\xc1\xfe\x25\xb8\x9e\xf3\xfe\x57\x74\x5c\xd0\x90"
- "\xf4\xb4\x1b\x44\x89\xf1\x8f\x4a\x52\x0d\x18\x03\xe6\xa1\x7a\x85"
- "\xf2\x63\xcc\xb3\x81\x75\xac\x79\x83\x08\x17\x34\x28\x1d\xce\x7b"
- "\x41\xbd\x7b\x2e\x2b\x3c\x8e\x22\xc6\xe8\x53\x0c\x34\xbf\x9f\x10"
- "\xdf\xd2\x0b\xee\xc1\x7c\x91\xa3\x00\xd3\x95\x30\x5e\x63\xf8\x0c"
- "\xcf\xeb\x70\x3c\xc0\x67\xf4\xa9\x87\xf1\x82\xb2\xdf\x97\x70\x84"
- "\xf2\xc8\x3f\xc1\x78\x41\xf9\xf5\xe7\xe1\x78\xa0\x35\xcb\x63\x94"
- "\x41\x41\x58\x3c\xb6\xbd\x03\x86\xf9\x5a\x78\x7e\x2a\xa0\x27\xff"
- "\xde\xb4\x12\x5f\x8b\x8e\xf0\x5b\x47\x14\xf9\x62\x9c\xc6\xf7\xfb"
- "\x95\xf0\xfe\xd7\xab\x69\xbf\x33\x40\x8f\xee\x08\x55\xb2\x67\xf7"
- "\xe1\xeb\x15\x1e\xd1\x98\x13\x82\x0f\xea\xed\xea\xfa\x9b\xf4\xfa"
- "\xc3\x2f\x0f\x63\xd7\xd5\x44\xba\xfe\x2a\x5e\x7f\xdf\x17\x63\xab"
- "\x3f\xa2\x1c\x66\x50\x78\x54\x60\x1d\x83\x42\xd9\xc8\x67\x78\x10"
- "\xbd\xa9\x51\x78\xc7\x7b\xb0\x5e\x25\xde\xe7\xca\xbe\xc3\xe5\x8e"
- "\x0e\xdb\x08\x98\x87\xfa\x2e\xac\x7d\x4a\x4d\x6a\x68\x69\xbd\xc2"
- "\xb3\x60\x07\xca\x43\x01\x11\x46\x8a\x85\x0a\xd5\xbc\x8e\x2d\xa1"
- "\x0d\x9a\x64\x5f\x68\xcf\x73\x47\x9a\x99\x37\xe9\x52\x9f\x27\x97"
- "\xe9\xf9\xc1\x1a\xba\x37\x88\xfd\xef\x43\x7d\x3e\x59\x7d\x33\xb5"
- "\x2f\x43\x5b\x78\xaf\xbd\x7e\x61\xcd\x2a\x5b\xc8\x05\x4d\x23\xf4"
- "\x9b\xb9\x42\x15\x7d\x90\x33\x28\x7d\x13\x88\xa7\x26\xf9\x73\x68"
- "\x5f\xb5\x5b\xa6\x8b\xda\xea\xd2\x6b\x9b\x0f\x41\xdd\x77\xd1\x6e"
- "\x94\xa5\xb2\xc5\x3f\xe5\xe1\x1d\xde\xc6\x75\x4f\x49\xc2\x71\x2d"
- "\xa6\xb2\xad\xc2\x73\x0c\xc6\xba\xb5\x04\x0c\x57\x5b\x72\xae\x94"
- "\x58\x73\x23\x8c\x7c\xde\x34\xd2\xd7\xa2\x20\xd4\x37\x5f\xe1\xb9"
- "\xec\x49\x33\xca\x92\xc7\xb1\xee\xa3\x9c\x57\x55\xd8\x13\x49\x44"
- "\xa9\x8b\x3f\x83\xe5\x58\x3e\xeb\xf4\x50\x7d\x73\x2d\xd1\xc5\xd3"
- "\xb6\x62\xf8\x2c\xa3\x86\xf3\x6a\x98\x58\x88\x32\x79\x12\xda\xd4"
- "\xbe\xc4\x71\xb9\x0a\xe3\xac\x6a\xcd\xf2\x9c\x68\xcb\xd7\x0d\x63"
- "\xb9\x11\xc6\x0e\xe5\x65\x8c\x73\x31\xd7\x6a\xc5\xb8\x71\xeb\x0d"
- "\x30\x0e\x74\x7d\x55\x78\x0e\xc5\x5c\xe7\xc2\x73\xd7\x72\xfe\xa1"
- "\xd5\x55\xb3\xf0\xfb\xa0\x1a\xe3\x70\x99\xe8\xde\x78\x0b\xe6\x30"
- "\x84\x75\x46\xa8\x6b\x4f\xbb\x58\x21\x26\x40\xec\x92\x84\xf8\x65"
- "\x9a\xe5\xb1\xc9\xd1\x63\x07\xaf\x18\xaa\x89\x4f\xd2\xc4\xd3\xdc"
- "\xf3\xf4\x04\x2c\xcb\xcb\xe3\x96\x26\x68\x30\x07\x78\xe7\x1c\xc4"
- "\xc1\xbc\x3a\xb4\x98\xca\x92\x8a\x3e\x74\xbf\x26\x5f\x34\xad\x38"
- "\x21\x85\xe7\x34\x0f\xdf\xc3\x5f\x53\x78\x8d\x69\xf3\xf2\x2c\xc6"
- "\xb5\x96\xcb\xd0\x10\x21\xde\xb1\xcf\x36\x7f\x82\xfb\xf7\xbc\x5b"
- "\xb3\xbc\x6c\xf1\x5f\x0c\x8a\x3e\x29\xd4\x4e\x92\xe5\x35\x11\x78"
- "\xb0\x59\xf8\x4e\xc6\x62\xfb\x09\xd7\xe8\x77\xe4\x2c\xaf\x18\x03"
- "\x89\x65\xf1\x2a\x8b\xa6\x79\xd3\x35\x58\xe1\x45\x7d\x35\x78\xcd"
- "\xb4\x62\x7e\x57\xbf\x12\x90\xe3\x14\xf4\x9b\x9d\xe5\x21\x5e\x4f"
- "\xae\xb3\x58\xbb\x5b\x47\x68\x30\x3e\x87\x35\xef\x91\x22\x2e\x68"
- "\x84\x86\xfb\x20\x40\x9b\xf6\x1e\x51\xee\x83\x39\xaf\xd2\x00\x7f"
- "\x3f\x4c\x1e\xfa\x3c\xb5\x51\x09\x7d\xfe\xf0\xf3\xd4\x5a\x25\x9f"
- "\x3b\x24\xa9\x25\x34\x30\xc7\x2c\xe4\xaa\xd6\x5b\xcc\xe4\x7f\x40"
- "\xcb\x06\x9d\xad\xd4\x14\x38\x16\x7e\x8f\xac\x37\x6f\x9d\xa0\xd1"
- "\x3d\xfc\x6b\x32\xfe\x51\xfe\x87\x2f\xca\x08\x69\x56\xf4\x59\xf8"
- "\xc5\x38\xd4\x23\x42\x8b\xcc\xea\xd0\x5d\xa6\xbc\xe1\x45\x18\x1b"
- "\xab\x2d\x6f\x82\xb6\x3d\xe8\x51\x72\x04\xea\x1c\x07\x3d\xe7\x84"
- "\x06\xf8\x77\x20\x51\xb6\x3d\xd2\x8f\xec\x6b\xcf\x51\x96\x97\x8d"
- "\x61\x36\xde\x28\x98\x33\x94\x9f\xee\x99\xfc\xc5\x27\x65\x04\x9e"
- "\x0d\xd7\x27\x2a\xff\x67\x54\xa7\xeb\x8b\xbf\x18\x56\x46\x5a\x31"
- "\x7e\x32\xe8\x91\x87\xce\x00\xde\xe5\x8d\x36\xec\x49\x36\x2b\x67"
- "\x19\x88\xb2\xb2\x36\x9f\xa4\x5c\x22\xf7\x5a\x7e\x08\x53\xfd\x15"
- "\xee\x6f\xc3\x78\xa7\x27\x82\x69\xdc\xc3\x54\x1d\xcd\x43\xeb\x5b"
- "\x05\xf2\x02\xf7\x43\x98\x57\xd5\x74\x1d\x81\xeb\x6f\x58\x7e\x17"
- "\x4c\x2a\x63\x8c\x44\x1f\x59\x44\xda\x94\xe1\x64\xff\xcc\x22\xf2"
- "\x2e\xe8\x24\xef\x5e\x23\x3e\x54\xf6\xed\x08\xf3\xb2\x74\x84\xa9"
- "\x2c\xab\xc3\x30\x0e\x15\xcf\xff\x10\xd6\x1b\x65\x61\xcb\xd2\x30"
- "\xef\x2a\x63\x11\x79\xb2\x91\x84\xb5\x29\x89\x6f\xdb\xea\xb0\xde"
- "\x55\xda\x7c\x68\x0b\x84\x5b\x18\x57\x8c\x81\x87\xb1\xf1\x70\x9c"
- "\xfa\x44\x92\xe9\xcd\x8a\x7b\x06\xf7\xae\x21\x81\x18\x83\x15\xe5"
- "\x4b\x8c\xd7\xcc\x05\x8c\x36\x58\x03\x86\x17\xa5\xde\x80\x7e\x61"
- "\x8c\xa1\xbd\x03\xd4\x28\x9f\x83\xec\xa1\xc0\x77\xe6\xf8\xb0\xde"
- "\x73\xf1\xb8\xa5\xff\x1b\x28\xa3\x73\xad\xc1\x98\xe3\xc9\x1b\xfb"
- "\x89\xf9\x96\xd7\x5c\x80\xb1\x4c\x0b\x53\x41\x3d\x1f\x38\xdf\x57"
- "\xdf\x6c\x26\xd6\xc7\x07\x68\x9e\xd0\xd2\x3c\xba\x01\x85\xa9\x44"
- "\x9d\x93\x4a\x02\x34\x23\x29\x2f\x8d\xb7\xee\x19\xa0\xe6\xb3\x82"
- "\x03\xd0\xf6\xc2\xce\xf5\x1e\xac\x99\x40\x88\xe6\xd7\xf8\x7f\xaf"
- "\x4a\xcd\xb3\x40\xc3\x80\xd1\xe1\x54\x7f\x40\xfd\x54\xd1\xeb\x30"
- "\xe3\xf1\x5e\xfb\xdb\xbc\xe6\x47\x72\x59\x5b\x13\xb8\xb5\xaa\x10"
- "\xcc\xb1\x7d\x4d\xd1\x6b\x07\x9f\xfd\x1f\x99\x7c\xee\x04\xca\x8b"
- "\x50\xde\xd6\xe6\x05\xb2\x42\xf6\x7f\x34\x42\xfb\x63\xda\x14\xaa"
- "\x1a\xf8\xd5\x0a\xf7\xe7\xe0\x7b\x5b\x77\xf5\x5b\x8f\xef\x4d\xf3"
- "\x02\xc1\x7b\xcd\x05\x9a\xf1\x41\xcf\x1a\x69\xac\xfc\x0e\x18\x5f"
- "\x21\x6f\x2a\x8e\x07\x8e\x01\xd7\x11\xd6\x9b\xbe\x6b\x47\x98\x0f"
- "\x8c\x2f\xc6\x5b\xf6\x4d\x9d\x07\xf7\xe4\x8d\x56\xc1\xb5\xbe\x6d"
- "\x01\xa3\x47\x61\x7e\x2e\xbd\xd6\x48\xac\x5b\x47\xd3\x78\x82\xdb"
- "\x92\x61\xce\x05\x3e\x6b\xe4\xb7\x8e\xf6\x11\xe6\x16\xc1\x7e\x72"
- "\xd9\xc5\xc3\xdb\x70\x1f\x1d\xf4\x0d\xfa\x07\xeb\xb2\xaa\xd6\xa0"
- "\xe8\x15\xd0\x36\xb8\x5f\xbe\x41\xe1\xdd\x08\x7d\x0d\xe1\xb3\x86"
- "\x8d\xc3\xff\xe1\x5a\x08\xf4\xd9\x8a\xe3\x80\xe3\x21\x8c\xc5\x0d"
- "\x69\x2c\x66\xa5\x43\xbd\x06\x2e\x2b\x27\x18\xda\x28\xe3\xb3\x7e"
- "\xa5\x92\xea\xf5\xee\x2f\xd5\x8b\x09\x65\xf5\xb6\x97\xb3\x7a\x23"
- "\x52\xe0\xfa\x7e\x36\xde\xbd\xe7\x75\x1e\xef\xde\xaf\x49\xf7\x46"
- "\x54\xb0\x7b\xdf\x8c\x64\xf7\x6a\xf0\xde\xcd\xf2\x3e\xf5\x7e\x4b"
- "\xaa\xff\x3b\xc2\xea\xa7\x7b\xb3\xfa\x0f\x4e\xb4\xab\xf7\xb1\x54"
- "\xef\x95\x0d\xac\xde\x9f\x8a\x58\xbd\xc1\xc5\x70\xfd\xaa\x93\xbe"
- "\x5c\x92\xee\x49\x50\xb3\x7b\xde\x3f\xc0\xee\x09\x1f\x05\xfc\xd4"
- "\x5f\xde\x97\x3e\x81\x52\xfd\x25\xc2\x7b\x17\x4d\x62\xf5\x9f\x6d"
- "\xb0\xab\x37\x96\xd5\xc3\xeb\x7f\x85\x7a\xbd\x4a\xdb\xbc\x56\x99"
- "\x58\xbd\xf1\x99\xc8\x8f\x50\x67\x36\x97\x75\xff\xae\x36\xaf\xa0"
- "\x1c\x68\x67\x37\xd0\x26\x18\x8f\x40\xbb\x60\x2e\x27\x14\xfa\xed"
- "\x1d\x8a\xdf\x70\x10\x73\x0d\x0a\x2f\x15\xe0\xae\xd5\xa9\x9d\x2b"
- "\xab\x4f\x81\xcd\xce\xc6\x81\x6c\xb0\xf5\x61\xa7\x71\x36\x69\x5e"
- "\x66\x94\x0f\xf2\x06\x69\x72\x38\x96\xdf\x1d\x78\x14\x64\x9b\x3e"
- "\x47\x61\x2d\x4c\xa7\x71\x95\x73\x47\x14\x71\xa1\x80\xb1\x57\x89"
- "\x87\x3e\xa5\x91\x94\x70\x8d\xca\x9c\x76\xa2\xaa\x82\x75\x06\xeb"
- "\x97\xc0\x9a\xaa\x59\xe2\x01\xeb\x6b\x9f\xb3\x39\x37\x85\xf6\x8a"
- "\xa6\x95\xa4\x2d\x66\x39\xad\x51\xae\x42\x6c\x86\xf9\xe8\x43\x73"
- "\xad\x2d\x41\xb9\xc2\xc7\x0f\xfe\xf7\xc6\xba\x6d\x8f\xf8\x0f\x6b"
- "\xfb\xf3\xb4\x92\xf6\xa0\x30\xd2\xfe\x41\xa0\xba\x23\x68\x44\x51"
- "\x47\xde\x70\x8d\xe5\xcf\xd3\x34\x96\x47\xfa\x95\x58\x83\xc2\xd2"
- "\xe1\xd9\x80\xdb\xf9\xca\xbd\x5c\x89\x72\x6f\xaa\x4e\x89\xed\x7e"
- "\x9e\x5a\xa4\x3c\x94\x5a\xad\x3c\xc4\x95\x2a\x3f\x4f\xcd\x81\x63"
- "\x31\xe6\xdd\x02\x59\xce\x67\xde\xa1\xd4\x72\x58\x37\x7c\x60\xbc"
- "\xfa\xac\x17\xed\x94\xfc\xf3\x16\x52\x55\x6c\x21\x47\x13\x6e\x10"
- "\xa3\x5f\x68\x31\xfc\x76\x1b\x03\x47\x87\x19\x03\x27\x68\x68\x9f"
- "\x83\xc6\xd0\x77\xc4\x7d\xa8\x87\x38\xd6\x67\x61\x3c\xb0\xcd\x63"
- "\x85\x1c\xfa\x88\x08\x31\xa7\x15\xf7\x66\x76\x8a\x39\xad\x64\x39"
- "\xdf\x6c\x71\xa7\x7f\x8e\x98\xd3\x82\x8d\x80\xc6\x9c\x06\x7d\x8f"
- "\xea\x7d\xb0\x7e\xd1\x3c\x91\x16\x90\xcf\xb6\x3e\x8d\xf1\xfb\xf1"
- "\xdb\x96\xa9\x35\xeb\xde\x12\x51\x3f\x43\x19\xc3\xba\x39\xb4\x14"
- "\x7e\x9f\xc0\x79\x98\xa3\x1f\x6b\xc4\xf3\xfc\x96\x26\x1d\xda\xcb"
- "\xad\x7c\xcc\x6f\x5a\x71\x6f\x25\x1f\xf3\x5b\xeb\xd6\x47\x72\xac"
- "\x5b\x27\x10\x38\x37\x06\x7e\x63\xad\x9b\x9b\xca\xe0\x57\x0e\xbf"
- "\x0a\xf8\x55\xc3\xaf\x06\x7e\xb5\xf0\x33\xc0\xaf\x01\x7e\x8d\xf0"
- "\x6b\x86\x9f\x11\x7e\x26\xde\xaf\xa9\x0e\x63\x66\xf2\x5b\xbe\x47"
- "\x3e\x08\x16\xdb\x95\xc6\xb7\xef\xe3\xf0\xbe\xe1\x28\xff\x70\xd9"
- "\xff\x41\x73\x00\x20\xcf\xf3\xef\xfb\x97\x22\xee\xf2\x83\x03\x73"
- "\x8c\x03\xa7\x15\xc1\xcf\xdb\xe8\x17\x19\x05\xbf\x18\xf8\x69\x8d"
- "\x5b\x47\x87\x03\xfd\xbc\x81\x8e\xd5\xad\x59\x7d\x61\xce\x04\x52"
- "\x5b\x04\xfc\x5f\x00\xff\x6f\x10\xfe\x87\xb9\xe2\x47\xe3\x1c\x1b"
- "\x03\xc7\xe4\x40\xb9\xd4\xa0\xe8\x47\xeb\xb5\x04\x8d\x8e\x10\xf6"
- "\x64\xa6\xc3\x79\xd0\xff\xfb\xe4\xb0\x7a\xc3\xd5\xf6\xf3\x65\xf1"
- "\x02\xed\xdc\xc5\xf3\x92\xe6\x2e\x8f\x8b\x5d\x10\xbd\xfc\x59\xcd"
- "\xe0\x85\x9a\xb0\xd8\xf8\x65\x73\x97\xad\x88\x5e\x11\x4d\xc5\x26"
- "\x38\xf5\xa8\xdc\xdf\xcc\x82\xb9\x0b\x40\xbe\xef\xdb\xc0\xf3\xb8"
- "\x5e\x4d\x32\x01\x8f\x3d\x3c\xad\xe4\xc0\x35\xa3\xd2\x0a\x72\x8b"
- "\x4f\x43\x3a\xcc\xbb\x11\x45\x07\xae\x99\x95\x3e\x0d\x1a\xc2\x03"
- "\xaf\xe3\x35\x7d\x43\xb5\x20\xc7\x7c\x49\x2a\x50\x8e\x81\x3a\x7b"
- "\x97\x98\x95\x53\xf0\xfe\x0f\xfa\x95\xec\x83\xff\xe1\x9c\x06\xef"
- "\xe3\x41\xb6\xa1\x47\x90\x6d\x58\x39\x8c\x1c\xa2\xc7\xe1\x9a\x43"
- "\xb4\x5e\x58\xfa\xe7\x78\xbc\xb9\x86\xaf\x80\x76\xd1\x36\xc6\x7f"
- "\xe0\x3f\x8c\xd6\x81\xb9\x46\xeb\xc0\x3c\xab\x57\xa8\x17\x62\x3d"
- "\xaa\x2b\x40\x1f\xf7\x41\x3f\xd2\x56\x10\x95\x38\x77\x51\x1f\xb0"
- "\xcd\xdf\x44\x94\xf3\x7c\x2b\x71\xfe\x62\x7f\x78\x98\xaf\x7b\xe0"
- "\xde\xbd\x4b\x98\xfe\x04\x3a\x93\x07\xea\x4a\x88\x11\x88\x0d\xfa"
- "\x94\x6a\x7a\x7f\x09\x57\x0d\xba\x96\x07\xdc\xab\xbe\x17\xaf\x15"
- "\x80\x6c\x56\x40\x65\x71\xb5\x4d\xfe\xdd\x10\xc4\x62\xb3\xf9\x44"
- "\x01\x5f\xcc\x27\x0f\xc1\x73\x06\xe2\xf8\xe1\x78\xe1\xb7\x52\x3e"
- "\xab\xaf\x01\xe3\x22\xec\xf0\x27\xde\x96\xc0\x08\x33\xb5\xad\x64"
- "\xa9\xd7\x8b\x32\xa5\x29\x20\xc2\x6c\x4f\x37\x46\x2f\x4d\xf4\x92"
- "\x79\xf3\xe3\xa2\x17\xd2\xcf\x6b\xf3\x96\x2f\x5f\xb1\x38\x5a\x13"
- "\x3d\x6f\x41\x8c\x86\x5e\xd6\xac\x58\x0e\x55\x62\x13\x96\x6b\x96"
- "\xae\x5c\xa2\x59\xbc\x3c\x16\xa5\xe3\xe8\xf8\xf8\x15\xda\x84\xde"
- "\x84\xdd\xa9\x59\xbc\x22\x2e\x21\x56\x0b\xff\x2c\x8f\x5e\xb2\x50"
- "\x43\xa9\xbe\x1c\x9a\x8a\x8b\xd3\x08\x4f\x58\x1e\x33\x2f\x1e\x19"
- "\x61\xc9\x1f\xa0\x92\xdd\xfd\x72\xd9\xd9\x07\x63\xdf\xa1\xcf\xd5"
- "\x35\x85\xdf\x95\x32\x15\x8c\x75\x6e\x84\x19\x7d\x15\xa0\xdc\x48"
- "\xf5\xa9\x2c\x75\x3e\xda\x94\xdf\x81\x77\x6c\x01\x9e\x6f\xcd\xf2"
- "\x5b\x28\xbe\x1b\xb5\x31\x63\x3c\x50\x8c\x35\xab\xf0\x3b\x45\xf7"
- "\x06\x03\xff\x53\x5f\x96\x2c\xf5\x5f\xd9\x58\xf8\xe5\xda\xdb\xb0"
- "\xa8\xcd\x54\xe1\xb7\x07\x7d\xe6\x60\x0e\x34\xa2\x4c\x20\xe4\x6f"
- "\x50\xc0\x3d\xa7\xf1\x1e\x6e\xeb\x04\x58\x2f\xfc\x2a\x24\xb9\xdc"
- "\x6f\x17\xd6\xa7\xf5\xb2\xd4\x37\xf9\xc0\xd1\xe1\x70\x6e\x3d\xf6"
- "\xcb\xc5\x1a\xa2\xb9\x09\xed\x9e\x28\x21\xe4\x57\x01\x24\xec\xe6"
- "\x96\x21\x86\x56\xff\x50\x5d\x7b\x06\xb9\xa7\x1d\xe6\xb1\x59\x49"
- "\x1e\x6a\x03\xbe\x58\xf5\x14\xf1\x58\x33\x99\x28\x4b\x16\x95\x60"
- "\x3c\x63\x52\x31\x31\x9f\xe8\xa3\x40\xa7\x36\xef\x26\x15\xba\x7a"
- "\x52\x69\xf9\x88\xe5\x04\x49\x46\xb9\xba\xdf\x64\x8c\x5f\x97\xb6"
- "\x86\xb7\xee\xfb\xcc\xe8\xb9\xb7\xa9\x04\x73\x79\x3c\xa4\xb7\x9c"
- "\xd7\xe9\x53\x76\x11\x7d\x92\x5e\x87\xb1\x43\xae\x29\xfc\x9f\x39"
- "\x04\xd7\x7a\x55\xc0\x7d\x53\xc8\x3d\x50\x7e\x1c\x9f\xb1\x3e\x8f"
- "\xaf\x7d\x2b\x88\xaf\x7b\x2b\x8f\x37\x00\x4f\x35\x00\x4f\x35\x6e"
- "\x0c\xe2\x9b\xd1\x17\x00\x7d\x1e\x90\x4f\xb5\x89\x24\xb8\x49\xe1"
- "\x5f\x46\x75\xfb\x71\xb4\x7c\x3f\x94\xe9\x9e\x79\x7d\x52\x1e\x96"
- "\x1f\x80\x72\x03\x2b\x17\x62\xf9\x41\x28\x9b\x58\xf9\x0b\x2c\x87"
- "\x34\x29\xfa\xa9\x58\xb9\x8a\xd0\x18\x18\x8a\x7e\x01\xac\xfc\x35"
- "\x96\x61\xec\xfb\x85\xea\x12\xb1\xbf\xe7\x80\x66\xfd\x9e\x4a\x3b"
- "\x0b\xfa\x59\xd2\x65\x3a\x1f\x3e\x4f\x8d\x41\xdb\x03\xcc\x07\xff"
- "\x4f\xfb\xd4\xa1\x6e\xd7\x6f\xba\xd7\x30\x3c\xfa\x47\xfa\x9a\xc9"
- "\x3d\x20\x2b\xf5\x81\x6b\x83\x71\xec\x9c\xda\x5a\xf6\x06\x9e\x9f"
- "\x6a\xe1\x75\xfc\xfb\xfd\x8a\xf9\xad\x23\x35\xfc\xfb\x01\xe8\x53"
- "\x08\xeb\xd8\xc3\x86\x92\x64\x33\x8d\x29\x0d\xf2\x29\xcc\xa1\x7e"
- "\x9b\xb1\x4f\x46\x90\xf7\x5c\xc4\x98\x55\xf3\x5b\x87\x68\x40\x8f"
- "\xca\x9f\x1c\x66\x41\xdf\x66\x90\x71\x03\x06\x1f\x8d\x41\xb9\x60"
- "\xcc\x3b\xdc\xae\x00\x23\x97\x16\x49\xf8\xd0\x7e\xc5\x93\x63\x78"
- "\x1d\xac\x51\x0a\x66\xab\xe6\xf1\xf9\xe7\xe9\x73\x07\xf7\x2b\xe6"
- "\x56\xc6\x60\xae\x27\x8a\x2f\xa9\xb8\x5e\x27\x02\x9e\xac\x8e\xf4"
- "\xb5\x6e\x1d\x93\x73\x34\xe6\x92\x7b\x79\x83\x14\x01\xa1\x2e\xfd"
- "\x9b\xa0\x4f\x18\x63\xd5\x02\xcf\xb1\xc0\xbb\xa2\x6c\xb0\x97\x2b"
- "\x57\x82\x8c\x52\xbc\x67\x7e\xad\x27\xbf\x32\xd2\x17\xde\xe9\x29"
- "\x7d\xd8\x0d\x52\xd5\x8e\x73\x25\xa0\xe1\x68\x12\x21\xe3\x93\x2c"
- "\x3a\x5f\x23\x8d\x85\xad\xd6\x2e\x22\x03\xf8\xc0\x21\x9a\x26\x45"
- "\xe0\xf0\x29\x29\xf0\x0e\xf0\xee\x87\xea\x6b\x55\x1c\xbc\xc7\x93"
- "\x6c\xdc\xe0\xbe\x40\x58\x7f\xfa\xe5\x8b\x72\xbd\x9b\xfd\xa7\x7c"
- "\xc3\x2d\x8f\x24\xb8\x67\x79\x1f\xc8\x23\x5c\x47\xa4\x2f\x07\xeb"
- "\x0f\x5e\x3b\x1a\x76\x95\xe0\x33\x85\xb1\x66\xb1\x77\x42\x61\x9c"
- "\xe1\xf9\x18\x83\x5b\x1c\x57\x58\xc3\x82\xad\x1d\x31\xce\xe9\x9f"
- "\x37\x26\x0a\xfa\x97\xc3\x6f\x6e\x72\xba\x67\x11\xd6\xf1\x4d\x8c"
- "\x3f\xfc\xcb\xe1\x57\xcb\xbf\x37\x4d\x6d\x1c\xec\xdf\x48\x73\x71"
- "\xe6\x3d\x9d\x23\xda\x48\x60\xbe\x01\x8f\x04\x7e\x5a\x02\xba\xb0"
- "\xf3\xb8\x83\xa9\xb5\x34\x07\x9a\xe7\x79\xde\xd7\x8a\xb9\x7d\x6f"
- "\x60\x3c\xf7\xda\xa3\x61\x26\x37\x69\x1a\x68\x76\x45\x53\x6c\x1f"
- "\x74\xea\x0e\xf7\xda\x0b\x9a\xe8\x92\x47\x76\xc1\xb8\xa8\x9b\x4a"
- "\xda\xf9\x71\x0a\x26\x7b\xdf\x77\x15\xc7\xca\x02\xeb\x48\xf2\x29"
- "\xa2\x34\xc3\x7a\xf9\xd1\x2b\xeb\x95\x43\x61\x9d\xb1\xc2\xda\x7f"
- "\xac\xba\x8c\x4c\x9d\x44\xd2\x2a\x63\xae\x13\x31\xb7\x19\xac\x6b"
- "\x9a\x0f\x5f\x31\x2a\xf1\x9b\x11\xe6\x32\xa3\x7a\x6a\xde\xb3\x51"
- "\x7f\xfd\x1a\xd6\x4c\x90\x1b\xf6\x7c\x6d\x54\x5a\x5a\x22\x35\x34"
- "\x9e\x3c\xe8\xe4\x69\x31\x3c\x67\xfb\x8e\x84\x39\x47\x72\xfa\xc7"
- "\x61\xae\xe8\x13\x11\xd5\x74\x8f\xff\x89\xc8\x32\x72\xa2\x2e\x9f"
- "\x54\x34\x9c\xc5\xbd\xcf\xef\x9d\x88\xcc\x41\x79\xb1\xaf\x05\x64"
- "\xc2\x77\x41\x26\x84\xf9\xda\x8b\x53\xa7\xd6\x8a\xdf\x92\x30\xf7"
- "\x99\x28\x0f\x5a\x60\x8e\x16\x08\xf9\xcd\x2c\x59\x81\x75\x05\xc2"
- "\x77\x25\xcc\x7b\xb6\x3d\x91\x84\x6e\x57\x72\x91\xce\xbe\x21\xf5"
- "\x5d\x46\xfd\xa3\x83\x39\xbf\xd4\x5a\x31\xff\xd9\x94\x65\x1a\xf2"
- "\xdf\xf0\xee\x47\xc3\xdc\x9d\x93\xf7\x51\xff\x17\x0b\xf0\x9d\x05"
- "\x78\xce\x02\xe3\x09\x34\x28\x06\xba\x39\xd5\x41\x44\x1a\x74\xa4"
- "\x89\x34\xb8\x7f\x0d\xa5\x01\xe8\x2e\xab\x5f\x13\x68\x70\x06\x68"
- "\xd0\x00\x34\xc8\x20\xe9\xc7\xa7\x57\x90\xa9\x11\x40\x83\xe6\xeb"
- "\x98\x8b\x80\xe5\x97\x4b\x60\x63\x4f\x69\x71\xc6\xa8\xac\x32\x31"
- "\x1a\xec\x9e\xc9\x68\xb0\x77\xa6\x11\xe4\x98\x7e\xe4\x43\x28\x5b"
- "\x57\x46\x6a\x30\x1f\x14\x9f\x11\x85\xb9\xb0\x19\x2d\x3a\x80\x16"
- "\x1d\x8c\x16\xa9\xcb\x80\x16\x35\xb5\x34\x0e\xd5\x89\xba\x0a\x52"
- "\x11\x55\x44\x2a\x01\x97\x80\x16\xf3\x90\x2e\xa8\x57\x5b\x57\x87"
- "\xf9\x83\x1e\x1d\x50\x90\x4c\x82\x45\x7a\x80\xde\xde\x7b\x63\x32"
- "\x41\x9f\xde\x61\x30\x37\x45\x7a\x04\x50\x7a\x5c\x15\xe8\xd1\x8e"
- "\x7e\x71\x40\x8f\x76\xa0\x47\x3b\xd0\x23\x83\xd1\x03\x71\x7e\x8a"
- "\xc9\x97\xe7\xbe\x0f\xc3\x38\x15\x9d\xe9\xb1\x5a\xa0\xc7\x99\x5b"
- "\xa1\xc7\xfd\x13\x3b\xd3\x23\x78\x68\x77\xf4\x90\xe6\xc4\x83\x03"
- "\x91\x1e\x1d\x45\xc2\x9c\x78\x04\xe7\x44\xba\xf2\x57\xb0\x16\xe1"
- "\x98\x1e\xab\x3e\x40\xe7\x04\xbc\x6b\xfa\x87\xaf\x98\x95\x15\x0d"
- "\x40\x97\x85\x42\xce\x33\x81\x2e\x8c\x1e\x23\x34\xc5\x5f\xb3\xf1"
- "\xd7\xbc\x84\x6b\x06\xce\x0d\xa4\x0f\xd0\x09\xe6\x8f\xb3\xdc\x80"
- "\xf6\xdf\x5b\xa1\x4d\x0e\xe7\x09\xce\x11\x9c\x0f\x95\x31\x67\x69"
- "\xae\xf5\x13\x11\xe5\x04\xbf\xbb\x9e\x88\x3c\x00\xb4\xca\x27\xd6"
- "\x95\x40\x9b\x44\xdc\xc7\x41\x06\x62\x8e\xc0\x13\x91\xeb\x51\x5e"
- "\x50\x03\xcf\xf7\xb2\x02\x9d\xac\xad\xc1\xbd\x37\x80\x0e\x85\xdf"
- "\x63\xed\xbf\xc3\x62\x3e\x64\xde\x2b\xb0\x0e\xce\xab\x2c\x40\x23"
- "\x98\x3b\xb2\x39\x63\xcb\x93\x7c\x31\x8c\xec\xa8\x27\xde\xf7\xc6"
- "\x32\x1a\x59\xed\xe6\xcc\xe4\x58\x9c\x33\xe9\x40\xa3\x53\x6e\xd2"
- "\xe8\x01\x96\xff\x33\x08\xb0\xda\xaf\xa9\x04\xd6\x49\xa0\xd1\xfd"
- "\x07\x5c\xd1\xc8\xba\xcb\xbf\xdc\xaa\x0e\xdd\x85\x39\x11\xb8\xa5"
- "\xd3\x15\x1c\xe8\x4b\xed\xa0\x97\x9e\x30\x5a\x48\xca\x6c\xa2\x4c"
- "\x3e\x4b\xbc\xf4\xd3\xbf\x24\x7a\x43\x29\x8d\x67\x8e\xf6\x5e\xcc"
- "\x33\xa2\xb7\x94\x02\x5e\x4d\x48\xc7\xf2\x0e\x5a\x36\x92\xd5\xb3"
- "\x89\x07\xcd\x1d\x1a\x59\x44\x36\x00\x7f\xee\x99\x59\xa4\xe4\x72"
- "\x87\x24\xf1\x6a\xcc\x8f\x44\x74\x55\x5a\x0b\xc6\x63\xf3\xa9\x8c"
- "\xa9\xc0\x18\x96\xe7\x31\x5e\x78\x95\x09\xda\x34\xf2\xed\x56\x58"
- "\x33\x0a\x33\xf8\x52\xcc\x19\xf1\x24\xae\x11\x18\x63\x4e\xf1\xa0"
- "\x15\x65\x11\xb4\x7b\xe9\x52\xb7\x83\xec\x15\x42\xf7\x41\xc0\x39"
- "\x45\xe5\x22\x13\x5c\x7f\x68\x19\xf6\x8b\xd9\xa0\xd9\xf1\x49\x8c"
- "\xfd\x1d\x34\xe1\xc8\xc1\x54\xa3\x2a\x07\xf4\x5d\x90\xd1\xa0\x5e"
- "\xc8\x64\x1a\x3b\x66\x4b\x93\x59\x5f\x63\xa6\xf6\x47\x63\x5a\x8c"
- "\x57\x4e\x32\xfa\x5e\x61\xfe\x09\x5c\xb3\x1f\x1a\x88\xfe\x1a\xfc"
- "\x2e\x58\xaf\x82\x9e\xce\x29\x99\x6f\x54\x4a\xeb\x72\x48\x12\xac"
- "\x67\x8d\xe3\xc3\xf8\x34\xcc\xd3\x71\x08\xde\x0b\xf5\xa0\x8f\xea"
- "\xcd\x14\x53\xfe\x3a\x7f\xbd\x12\xed\x23\x66\xc0\x87\x8a\xaf\xff"
- "\x46\xf3\xb9\x5e\x56\xf4\x7f\xeb\x78\xa4\x85\xe0\xf3\x67\x3c\x8a"
- "\xdf\x18\x42\x0e\xb4\x29\x8b\xa2\xda\xbc\x82\x46\xa5\x35\x48\xb9"
- "\x2c\xed\x73\x56\x22\xce\xec\x99\x0f\x6d\x22\xce\xd4\xa7\x2b\x19"
- "\xb6\x84\xa3\x8d\xce\xdb\x11\x5b\x2a\x9b\xaf\x92\x54\xe0\xe3\xca"
- "\x98\x22\x9a\x4b\xa5\x2f\xe0\x3b\xb7\x1a\xf0\xa4\x03\xf4\x7d\xc0"
- "\x13\xc4\x81\x42\xc0\x0f\x6e\x35\xe8\xf9\xed\xa0\xe7\x0b\x38\x82"
- "\xb2\x17\x1e\x67\x03\x8f\xfa\x96\xc3\x39\xa0\x13\x07\xb8\x0e\x78"
- "\x12\xf6\x6e\x32\x09\x7d\x17\x78\x74\x07\xe2\x08\xc8\xc5\x53\xb4"
- "\x80\x23\x2b\x01\x47\x12\x69\x4e\xe1\xe0\x42\x25\xc3\x8f\xcf\xea"
- "\xd7\x2b\x73\xc4\x9c\xe2\x74\x7c\x07\xf4\xaf\x42\xfe\x88\x4a\xc7"
- "\xbe\x2a\xad\xb8\x3e\xad\x8e\xf4\xa8\x32\x01\x8f\xe4\x4d\xd0\xe2"
- "\x39\x3a\x6f\x57\xc6\xf4\xe6\x18\xaf\x85\xe3\x98\xec\xbc\x46\x86"
- "\xd1\xbc\x9b\x3f\x04\xf7\xde\xb4\x84\x0c\x2d\xbc\x46\x42\x0b\x97"
- "\x90\x30\x98\xaf\xca\x42\xe8\xc3\x9c\x65\x6a\x42\x73\x96\x78\x05"
- "\x85\xc3\x79\xa7\x39\x4b\x40\xae\x0e\x2e\xc4\x39\xb3\x34\xcc\xd6"
- "\x27\x4b\xce\x4c\xad\x15\xc6\x8e\xc6\x77\x53\x0c\x58\xc1\xfc\xa9"
- "\x7d\x0d\x4c\xce\x1f\x20\xc4\x19\x0a\x68\x00\x5d\xe5\x9e\x26\xc5"
- "\x80\xd9\xfc\x96\x90\x5a\x6d\x32\x51\x34\x89\xd7\x40\xf6\xe4\x80"
- "\x56\x4f\xa4\x93\x74\xce\x2f\xb3\x5c\x9f\x74\x15\x73\x00\xb8\x39"
- "\x0f\x07\xd0\x7d\x69\xd6\x9c\x99\x09\xd4\x0f\x68\xcb\xcc\x94\x9d"
- "\x4d\x64\x18\xff\x47\xa0\xc7\x22\x78\xd7\x26\x12\x5a\xd0\x04\xef"
- "\xba\x92\xbd\xab\x98\x43\x9d\xcb\x28\x8a\x81\x6b\x5d\xe6\xfb\x32"
- "\xfe\x11\xf3\x7d\xf9\x94\x00\x86\xf5\xe3\x1f\x46\x1f\x63\x1a\x7f"
- "\xa7\x55\x6f\x39\x4b\xf0\xb9\x68\x1b\xd2\x5f\xa7\x3c\x3d\x0d\x79"
- "\x99\x2b\x9a\xa6\x9e\x5b\x07\xbc\xdd\x1a\x83\x76\x32\xf5\xa1\x7a"
- "\x23\xc6\xbb\xa1\x32\x9f\x41\x11\x92\x8e\x72\xda\xe7\x70\x0e\x79"
- "\xdf\x8e\xe7\xd3\x91\xe7\xf1\x3a\xe5\x7b\xb8\x4f\x5f\x77\x89\x60"
- "\x7b\xf6\xed\x20\xfd\xc5\xb6\x2e\x2b\x34\x23\xb0\x2d\xe4\x05\xb4"
- "\xe9\xe0\x5c\x63\xb4\x2f\x45\x7f\xf2\x60\x3e\xe8\x51\xa1\x6c\xc4"
- "\x5c\x36\x6a\xe4\x01\xca\x2b\x80\xdf\x18\x5f\x99\xe7\x23\x3d\x80"
- "\xcf\xb0\x9f\xbd\x81\xde\xc3\x44\xbe\x80\x73\x01\x8e\xbc\xd1\x77"
- "\xad\x1a\x75\x9a\x00\xfc\xbf\xa7\xfc\xe1\x1e\xfd\x34\x2e\xf3\x45"
- "\x71\xa1\x20\xdf\x02\x5e\x22\x6e\x5a\x5b\xec\x30\xb3\x99\x61\x26"
- "\x62\x92\x88\x9b\x14\x9b\x68\x1e\x87\x52\xf4\x45\x8d\xa1\x7d\x74"
- "\x13\x37\x2b\x9b\x25\xdc\x9c\xa2\xb5\xc3\xcd\x66\xbe\x9d\x1b\xec"
- "\x0c\x37\x07\x8e\x90\xe3\xe6\xc0\x67\xe4\xb8\x19\xba\xc3\x11\x37"
- "\x3b\x63\xe6\xc0\x55\xce\xf0\x12\xf4\x98\x87\x9a\x14\xa1\x93\x5c"
- "\x63\xe5\xc0\x5d\xee\x63\xe5\xc3\x9f\xca\xb1\x72\x60\xe3\xff\xbf"
- "\x58\x39\xe8\x45\x19\x56\xaa\x7b\x88\x95\x4d\x14\x2b\x03\xf8\xef"
- "\x61\x4e\x08\xf8\x51\xb8\xc8\x05\x56\x2e\xea\x66\x2e\xfc\xd1\x15"
- "\x56\x0e\x7a\x4f\x8e\x95\x83\x6a\xe4\x58\x39\xe8\x2d\x09\x2b\x85"
- "\x6b\xb7\x05\x2b\x07\x15\xdd\x1d\xac\x1c\x54\x44\xb1\xf2\x1a\x62"
- "\x65\xe8\x9a\xee\xb1\x72\xe0\x6e\xe7\x58\x09\xe7\x29\x56\x0e\xdc"
- "\x2d\x61\xe5\xd9\x6e\xb0\x72\xf0\x3c\x37\xb0\x32\x80\x62\xa5\xda"
- "\x05\x56\x2e\x82\xb1\x12\xf8\x82\xf2\x9e\x03\x6f\x08\x58\x19\x6c"
- "\xc3\xca\x1e\xf0\x87\x7b\xf4\x1b\x1c\xd5\x15\x56\x72\x39\x4c\xbe"
- "\x44\xac\xe4\xfd\x05\xac\x8c\xb3\x90\xe4\xd3\x80\x91\x35\x4d\x34"
- "\x5f\x0d\xf5\xe1\x85\x5f\xca\x6b\x88\x45\xc3\x8b\xf6\xc2\x78\xe9"
- "\x0d\x25\x14\x9b\xa8\x2f\xea\x24\xc4\xaa\x12\xa8\x9b\x6f\x93\x3b"
- "\x29\x76\x9e\x16\xb0\x73\x96\x80\x9d\x73\x7e\x02\x76\xce\x44\x5a"
- "\x3e\xb2\xac\x4d\x29\x62\xe7\x16\xc0\xce\x47\xa8\xfc\x80\xdf\x33"
- "\x19\x76\x3e\x7a\x55\xec\x17\xda\x34\xf5\x09\xdb\x09\xeb\xd7\xf5"
- "\xce\x38\xfa\x12\x6d\xef\xa8\x6e\x51\x33\xb1\x61\xe9\x2c\x09\x4b"
- "\xa1\xad\x1d\xae\x71\xf4\x91\x66\x1b\x8e\x66\x00\x8e\x9e\xb3\xc3"
- "\x51\xd0\x9b\xfe\x8a\x98\x07\x38\xda\x4a\x71\xf4\x33\x01\x47\x87"
- "\x58\x8f\xcf\x02\x1c\x7d\x49\xc4\xd1\x21\xc3\xcc\x19\x45\x51\xe6"
- "\xac\xee\x71\xb4\x95\xe2\xa8\xf6\xce\xe3\x68\x99\x03\x8e\x82\xee"
- "\x8a\x79\xd4\x9d\xe2\xa8\xc8\x8f\x14\x47\xd3\x25\x1c\xa5\xe3\x1a"
- "\xb6\xad\x2a\x0a\xc6\x3d\x4a\x4b\x75\x37\x1b\x8e\x6a\x4b\x18\x8e"
- "\xc2\x39\x6a\x3f\x59\x0e\x38\x0a\xfc\x97\x56\x89\x71\xfc\x48\x38"
- "\xf4\x51\x8d\xf8\xba\x13\xe6\x0c\x8e\x91\x0d\x4f\x17\xc1\x9c\x41"
- "\x8c\x69\x81\x39\x03\x38\x3a\xe7\x86\x9a\xd0\xf9\x92\x05\xf3\xa5"
- "\xc9\x45\xbe\x3c\xd1\x5f\xd6\x25\x9e\x86\xfd\x28\xc7\xd3\x47\x43"
- "\xe5\x78\x1a\x76\x5a\xc2\x53\xe1\x1a\xe2\x29\xd0\x0c\xc6\xa7\x1c"
- "\x31\xf5\xd6\xf0\x34\xcc\x68\xc3\x53\xa5\x80\xa7\x8b\xba\xc7\x53"
- "\xfa\xdd\xcf\x05\x9e\xda\x63\x83\x6b\x3c\x0d\x33\x4a\x78\xfa\x68"
- "\xa5\x0d\x4f\x6b\x5d\xe1\xe9\x23\x26\xe7\x78\x0a\xe7\x29\x9e\x3e"
- "\x62\xb2\xe1\x69\xad\x13\x3c\x7d\xc9\x1e\x4f\x1f\x3b\xc8\xf0\xb4"
- "\x84\xe2\x26\x62\x6a\x95\x09\xf8\x03\xe7\x5c\x42\x3e\xc5\x54\x0e"
- "\x30\x15\x73\x08\x63\xfe\x28\xf4\x81\x77\x86\xa9\x0c\x73\x0d\x04"
- "\x71\x15\xe7\x66\xda\x64\xd0\x77\x61\x2d\x82\x31\xa1\x6b\xaf\x38"
- "\x7e\x3b\xed\xf0\x75\xee\x2a\x35\xca\x76\x32\x5e\xe1\x44\x5e\x69"
- "\x09\x43\x1f\x59\x19\xaf\xb8\x47\xcb\xc7\x0e\xb8\xc2\x56\x57\xba"
- "\xfb\x71\xd4\xdd\x67\x10\xe5\xea\x19\x80\xaf\x91\xa8\xbb\x17\x3b"
- "\xe8\xee\xc5\x9d\x75\xf7\x53\x5d\xe3\xa8\x5b\xba\xfb\x2b\x48\xc3"
- "\x5f\xed\x97\xe3\xe8\xaf\x0e\xca\x71\xf4\xc9\x67\xb0\x5f\x0c\xc7"
- "\x8b\x9d\xeb\xee\x74\x9e\x0f\xed\x65\xd3\xdd\x6b\xe5\xf8\x29\xe9"
- "\xee\x4f\x5c\x71\x8d\xa3\x43\x87\xcb\xe4\xd1\x39\x02\x8e\xce\x17"
- "\x70\x74\xbe\x84\xa3\x27\xbe\x14\xe5\xd1\xc7\xa7\x1d\xab\xb5\xc7"
- "\xd1\xa1\x49\x36\x1c\xad\xeb\x8c\xa3\x22\x86\x22\x9e\x62\x3b\x68"
- "\xcb\xda\x0d\x38\xbd\x6f\xbe\x56\xc9\x6c\xb5\x51\x38\x76\xde\x8e"
- "\xb6\xda\xca\xe6\x1b\x24\x75\x16\xe2\x69\x3e\xc5\x53\x5f\x05\x99"
- "\x07\xd8\xd7\x17\xfd\xfe\x0b\xf0\x9b\x7d\x22\xcb\xbf\x86\xf6\x25"
- "\x6e\x25\xcb\xe7\x29\xda\x99\xe0\x7d\xe9\xb7\xfa\xd9\x67\x05\x4c"
- "\xbd\x09\xe3\x01\x3c\xf7\xee\x4d\xc0\xd4\x44\x27\xb2\xe9\x6a\xc0"
- "\xd4\x64\x3b\xd9\x14\xe6\xfe\x67\xf3\x1d\x31\xf5\xf1\x4b\x55\xc8"
- "\x2b\x88\xa9\x32\x3d\xbe\xf8\x17\xa0\xc7\x3f\x31\x56\x8e\xa5\x4f"
- "\x68\xe5\x58\xfa\xc4\x60\x09\x4b\x85\x6b\xb7\x45\x36\x7d\x62\xcc"
- "\xdd\x91\x4d\x9f\x18\x23\xe9\xf1\x4f\xde\x6f\xc3\xd2\x1a\x57\x58"
- "\x3a\x74\x8c\x73\x2c\x85\xf3\x14\x4b\x87\x8e\xb1\x61\x69\x8d\x13"
- "\x3d\x5e\x86\xa5\x4f\x5a\x19\x96\x16\x33\xd9\xb4\x56\x94\x4d\x8b"
- "\xff\x09\xf5\xf8\x27\x2d\xee\xea\xf1\xc7\x9b\x19\x7e\x22\x3e\x89"
- "\x18\x2a\xe9\xf1\xc5\xae\xf5\xf8\x6e\x30\xd4\x2d\x59\x94\x62\xe8"
- "\x30\xab\x1c\x43\x9f\x52\xc8\x31\x74\xf8\x32\x47\x0c\xed\x8c\x9f"
- "\x4f\x3d\xe7\x0c\x3b\x99\x1e\x3f\x5c\xe3\x1a\x37\x9f\x8a\x73\x1f"
- "\x37\x7f\xfd\x96\x1c\x37\x9f\x2a\xf9\xdf\x81\x9b\x4f\xf7\x97\xe1"
- "\xa6\xba\x87\xb8\xf9\xb3\xe8\xf4\x4f\x3b\xd8\x3f\x9f\x76\xb0\x7f"
- "\x3e\x6d\x67\xff\x7c\xfa\x36\xda\x3f\x9f\xbe\x4b\xf6\xcf\xa7\x13"
- "\x24\x19\x74\xf8\xb4\xee\x71\xf3\xa9\x04\xe7\xb8\x09\xe7\x29\x6e"
- "\x3e\x95\x20\xe1\x66\x77\x32\xe8\x88\x11\x6e\xe0\xe6\x2f\x5c\xa7"
- "\x1f\xd1\xa5\xfd\xd3\x99\x4e\x8f\xb8\x49\xf1\xb2\xd6\x41\xa7\x9f"
- "\x61\xaf\xd3\x17\x4b\x3a\xfd\x44\x86\x5b\x7a\x4b\x8e\x5c\xa7\xbf"
- "\xed\x38\x3a\x72\xbc\xd9\x66\x0f\xfd\x13\xe0\xe8\x48\x9a\x2b\xc1"
- "\x6c\xb3\x87\x3e\x53\x29\xf6\x8b\xe9\xf4\x5b\x08\xeb\x97\x13\x9d"
- "\x9e\xfa\xcc\x8e\xdc\x66\xd3\xe9\x6b\x1d\x75\xfa\x67\xd6\xb8\xc6"
- "\xd4\x91\x3a\xa7\x3a\x3d\xea\xdf\x14\x53\xb5\x14\x53\x6f\xe6\xd9"
- "\x63\xea\xbf\x9c\xa5\x98\x3a\x41\xc4\xd4\x7f\x51\x99\x61\x6e\x9a"
- "\xbd\xba\xc7\x54\x6c\x47\xc2\xd4\x98\x9f\x07\x53\x75\x3d\xc7\x54"
- "\xfb\xfd\xa6\x9f\xc1\xbb\xdb\x30\x95\x8e\xf1\xa8\x55\x55\x51\x88"
- "\xa9\x31\x0e\xfa\x7d\xb1\x73\xfd\xfe\x18\x51\xe2\xf8\x88\xfa\x3d"
- "\xd2\x80\xe2\xcd\x1d\xd5\xef\x47\x9d\x94\x63\xeb\x33\x2a\x39\xb6"
- "\x8e\xda\x2f\x61\xab\x70\xed\xb6\xe8\xf7\xa3\xaa\xef\x8e\x7e\x3f"
- "\xaa\x5a\xc2\xd6\x67\xf6\x74\x8f\xad\x23\xcb\x9d\x63\xeb\xc8\x72"
- "\x86\xad\x23\xcb\xbb\xc4\xd6\x09\xf6\xd8\xfa\xec\x0e\x11\x5b\x25"
- "\xfd\x1e\xf8\x03\xe7\x5f\x42\xce\xad\xeb\xf7\x2f\xde\x6d\xfd\xfe"
- "\x59\x97\xf1\x4f\x9c\xea\xf7\x79\x80\xb3\xa0\x8b\xaf\x3e\x09\xfa"
- "\xfd\x34\x41\xbf\xaf\x2b\x72\xd0\xef\x8b\x3a\xe9\xf7\x29\xd3\x04"
- "\x4c\x85\x39\x45\x31\x75\x7e\xf1\xad\xeb\xf7\x2f\x23\x0d\x47\x6f"
- "\x93\x63\xea\xe8\x1d\x72\x4c\xfd\xed\xe3\xd8\x2f\x86\xe9\x45\xce"
- "\xf5\x7b\x3a\xcf\x47\x5f\x91\xe9\xf7\xd0\xbf\xce\xfa\xfd\x6f\xce"
- "\xca\x30\x75\x8e\x3d\xa6\x8e\x09\x90\xc9\xa9\xf0\x5e\x88\xa9\x1f"
- "\x9e\x63\x98\xfa\xd1\x39\x3b\x4c\x9d\xf2\x91\x80\xa9\x63\xc7\x1f"
- "\x9b\x6e\x8f\xa9\x63\x22\x45\x4c\xa5\x78\x39\xc7\xac\x4c\x8b\xec"
- "\xec\x77\x42\xfd\x7d\xd0\x17\x08\xda\xc6\x3d\x52\xd8\xe6\x9e\x73"
- "\x31\xdd\xfb\x9b\x44\x3a\xf7\x37\xd1\x27\x18\x48\x45\x43\x0e\xf5"
- "\x33\x29\x40\x3f\x93\xb5\x64\x60\x41\x3b\xdb\xeb\x4f\x73\x6f\xdc"
- "\x74\xbe\xcf\x7f\xf6\x6b\x12\xce\xa2\x4f\xd6\xbb\xe8\x93\x75\x93"
- "\xf9\x00\x01\xbd\x3b\xef\xeb\x17\xe5\x26\xc0\x83\xfd\xe7\x1c\x71"
- "\x76\xec\xe9\x2a\xe4\x9f\x59\x31\x0e\x3a\x7f\xd1\x2f\x40\xe7\xff"
- "\xcd\x53\x72\x7c\xfd\xcd\x42\x39\xbe\xfe\xe6\x7e\x09\x5f\x85\x6b"
- "\xb7\x45\x76\xfd\xcd\xb0\xbb\x23\xbb\xfe\x66\x98\xa4\xf3\xff\xf6"
- "\x5e\x1b\xbe\x56\xdb\xe1\xeb\x39\x7b\x7c\x1d\x13\x42\xf1\xf5\x9c"
- "\x23\xbe\xc2\x79\x8a\xaf\x63\x42\x6c\xf8\x5a\xed\xa0\xf3\x9f\x73"
- "\xc4\xd7\xdf\xfe\x48\xf1\x15\x78\x41\x2e\xbb\x16\x75\xaf\xf3\xd7"
- "\xfd\xd2\x74\xfe\xdf\x1a\xdd\xd2\xf9\x11\x53\xe3\x18\xa6\x22\x66"
- "\x89\xb8\x2a\xe9\xfc\x45\x2e\x75\xfe\xee\x70\xd5\x2d\x59\x95\xe2"
- "\x6a\xf8\x8f\x72\x5c\x0d\xbf\x21\xc7\xd5\x71\xab\x1c\x71\xb5\x33"
- "\xa6\x3e\x37\xc2\x19\x9e\x32\x9d\x7f\x5c\x98\x6b\x2c\x7d\x2e\xca"
- "\x7d\x2c\x7d\x7e\xb3\x1c\x4b\x9f\xdb\xf5\xbf\x17\x4b\x5f\x18\x2c"
- "\xc3\x52\x75\x0f\xb1\xf4\x67\xb1\x03\xbc\xb0\x46\x8e\xa5\x2f\x94"
- "\xc8\xb1\xf4\x85\x68\x09\x4b\x85\x6b\xb7\x05\x4b\x5f\x48\xb9\x3b"
- "\x58\xfa\x42\x8a\x24\xab\x8e\x7b\xad\x7b\x2c\x7d\x2e\xc6\x39\x96"
- "\xc2\x79\x8a\xa5\xcf\xc5\x48\x58\x7a\xb6\x1b\x2c\x1d\x3f\xd6\x0d"
- "\x2c\x95\xdb\x01\x1c\xb1\xf4\xae\xdb\x01\xc6\x8f\x71\xcb\x0e\x20"
- "\x62\xe9\xb4\xce\x76\x00\xc4\x57\x6a\x07\x80\xf1\x12\x31\x8c\xda"
- "\x01\xc6\x31\x2c\xd3\x5b\xd6\xcb\xec\x00\xb7\x1f\x5b\x27\x4c\x36"
- "\xdb\xec\xa9\x19\x80\xad\x13\xa6\x51\x6c\xb5\xd9\x53\x5f\xbc\x22"
- "\xf6\x8b\xd9\x01\xfe\x44\x58\xbf\x9c\xd8\x01\x9e\xa7\xed\xbd\x27"
- "\xb3\x03\xd8\x61\x2d\xb4\xb5\xcd\x35\xce\x4e\x28\x97\xd9\x01\xea"
- "\x25\x9c\xbd\x89\x3e\xea\x80\x83\x14\x67\x83\xec\x71\xf6\x5f\xdb"
- "\x28\xce\x3e\x2f\xe2\xec\xbf\xfa\xb4\xc2\xdc\x6c\x75\x17\x67\x71"
- "\x1f\xc1\xb9\xa8\xbb\x83\xb3\xa5\x6e\xe0\xac\x9d\x6d\x60\x3f\x8c"
- "\x87\x0d\x67\xe9\xb8\x4f\xdc\x5a\x35\x0b\x71\x36\xca\xc1\x36\x50"
- "\xe4\xdc\x36\x70\xf4\x6e\xd8\x06\x26\x5e\x95\xe3\xed\x8b\x1a\x39"
- "\xde\x4e\x3c\x25\xe1\xad\x70\xed\xb6\xd8\x06\x26\x36\xdf\x1d\xdb"
- "\xc0\xc4\x66\x09\x6f\x5f\x3c\xd6\x3d\xde\x4e\xa8\x76\x8e\xb7\x70"
- "\x9e\xe2\xed\x84\xea\x2e\xf1\xf6\x79\x7b\xbc\x7d\x69\xbf\x88\xb7"
- "\x92\x6d\xa0\x48\xb0\x0d\xac\xef\xde\x36\x50\xe7\xc2\x36\x30\xfe"
- "\x6e\xdb\x06\x5e\x2a\x75\xc7\x36\xd0\x96\xc7\xfc\xf6\x57\xa3\xdf"
- "\xfe\x6c\xc0\xdf\x88\x2f\x61\x0c\xba\xf7\xdb\x4f\x11\xfd\x4f\xa3"
- "\xf2\x05\x9c\xcd\x77\x6a\x1b\x38\xde\xe8\xda\x36\x70\xbc\xc6\xde"
- "\xff\xf4\x77\x9f\xca\xbf\x5b\xfd\x6e\xbf\xf8\xdd\xea\xf8\xd7\x88"
- "\xb3\x53\x0f\x63\x99\xcb\x1d\xcd\xf2\xf0\x2a\xa6\xea\xb0\x9f\xce"
- "\xfc\xf8\x3f\xe3\xec\xbf\x65\x4d\x0a\xb4\xd9\x0a\xaa\x11\x6f\xf3"
- "\x09\xc7\xc7\x78\x61\x8c\x70\x6a\x2b\x78\x05\x79\x6f\xea\x32\x7b"
- "\xdc\x3d\x74\xc6\x1e\x77\x27\x85\x8b\xb8\x6b\x05\xdc\x3d\x58\x9f"
- "\xcf\xec\xaf\x33\x99\x6f\xea\xee\x99\x76\xbe\xa9\x5f\xfe\x43\xc0"
- "\xdd\xc9\x63\x8f\x19\xe0\xfd\xbb\xf2\x9f\x82\xfb\xf7\x9e\xe9\xa9"
- "\x0f\x6a\xbe\x53\xdf\x29\x01\x9f\x9c\xfa\x4f\x41\x5f\xd5\x3b\x84"
- "\xb9\x6a\x85\x79\xba\xc3\xce\x7f\xaa\x20\x19\xe6\xb3\xb0\xaf\xa4"
- "\x4b\x3f\xd4\x99\x92\x1f\x2a\x9f\x3b\xda\x07\xd7\x37\x6e\xeb\xe8"
- "\xea\x76\x3e\xc6\x83\x0f\x18\xed\x83\xcf\xef\xe8\x80\x75\xe7\x85"
- "\x48\x0f\xa6\xd7\x3d\x6b\x04\xec\xe9\xcb\xc6\x7d\x72\x92\x15\xd6"
- "\x1a\x2b\xac\x35\x5c\xee\xb3\x46\x0b\xca\x26\x79\xcf\x9a\x0a\x40"
- "\xcf\xb3\x64\xd0\x5c\xaa\xbd\xb3\x41\xd7\xdb\x89\x7a\xde\x35\x98"
- "\x1b\x69\x61\x4a\xec\x8f\x88\xa3\xbe\x8d\xf0\x1e\xd7\xba\x96\xe5"
- "\x2c\x3f\x48\x38\xaa\x7b\xe9\x38\x3c\x73\xca\xe2\x2a\xe4\xdd\x48"
- "\x69\x4f\x01\x95\x99\x5d\xf8\xca\x62\x5f\x58\x8c\x44\xe0\x85\xdb"
- "\x60\x93\xb0\xef\x8f\x1c\xd7\xa7\x1c\x95\xe3\xfa\x14\xb3\x1c\xd7"
- "\xa7\xec\x91\x70\x5d\xb8\x06\xb8\x0e\x74\xa3\x72\x34\xac\x7d\xb7"
- "\x28\x47\x4f\x29\x13\x71\x9d\x13\x70\xbd\xb0\x07\xb8\xde\xa5\x1c"
- "\x6d\x87\x4b\xae\x71\x7d\x4a\x99\x64\x93\x98\xfa\x9e\x53\x1f\xd9"
- "\x33\xf6\xb8\x3e\x69\x22\xc5\xf5\x33\x8e\xb8\x0e\xe7\x29\xae\x4f"
- "\x9a\xe8\x72\x3f\xc1\x19\xc7\xef\x69\x11\x6f\x52\x5c\xaf\x15\x7c"
- "\x64\xab\xdd\xd8\x4f\x50\xcb\x30\x5d\xc4\x72\xb4\x57\xdd\x5d\x9b"
- "\x44\x44\xa6\x3b\x36\x09\x8a\xe5\xcd\x0c\xcb\x11\x1b\x45\x3c\xef"
- "\xc9\x7e\x82\xee\xf0\x5c\x94\x9b\x11\xcf\x5d\xc9\xcd\x72\x3c\x9f"
- "\xf6\xa6\x1c\xcf\xa7\xbd\x25\xc7\xf3\x19\x6f\xca\xf1\x7c\x46\xa6"
- "\x23\x9e\x77\xc6\xf2\x69\xa7\x9d\xe1\xb8\xf6\x15\xb4\x51\xcc\x18"
- "\xee\x1a\xc3\x5f\x56\xb9\x8f\xe1\xbf\x57\xfc\xaf\xc3\x70\xb5\x23"
- "\x86\xff\x7e\x0c\x62\x90\x35\xcb\x01\xc3\x17\x09\x18\x2e\xe0\xc8"
- "\xce\x26\x41\x16\x76\xc4\xf0\x66\x78\x8f\x6e\xf4\x71\xcb\xf7\x8e"
- "\x18\x3e\xfd\x29\x19\x86\xab\xbb\xc1\xf0\x45\xcc\x0e\x22\xf3\xcb"
- "\x75\x61\x0b\x81\xf7\x08\xdf\xe1\x42\x36\x17\xc7\xcc\xbe\x3f\x72"
- "\x0c\x9f\xfe\x96\x1c\xc3\xa7\x1f\x90\x63\xf8\xf4\x65\x12\x86\x0b"
- "\xd7\x6e\x8b\x6c\x3e\x7d\xfd\x6d\x97\xcd\x45\xfe\xe8\x12\xc3\xa7"
- "\xaf\x97\x64\xf3\x19\xd1\xdd\x63\xf8\xcb\x3e\xce\x31\x1c\xce\x53"
- "\x0c\x7f\xd9\xc7\xe5\x3e\x87\x4e\x18\xfe\xca\x78\x37\x30\x5c\x6e"
- "\x0b\x11\x31\x5c\xb0\x85\xec\xb4\xb3\x85\x58\x33\x98\x2d\x64\x47"
- "\x13\xe3\x8d\xbe\x0a\xc6\xa7\xc0\x3f\xc1\x85\xca\xae\x75\xb7\x1d"
- "\xb7\x64\x07\x79\xa5\x53\xfc\xfb\xae\xec\x20\x14\xbf\x71\x8f\xc3"
- "\x6b\x80\xdb\xd5\x3d\xdc\xe3\x30\x51\xdc\xe3\x90\xe3\x62\x8f\x83"
- "\x80\xe7\x73\x7e\x02\x9e\xd3\x3d\x0e\xaf\xce\x90\xdb\x98\x5f\x7d"
- "\x4d\xb4\x31\x33\x3c\x7f\x3d\x56\x8e\xe7\xaf\xc7\xd8\xf6\x3c\x00"
- "\xe6\xeb\xb5\x5b\x3a\xed\x79\xb0\x61\x3b\xb5\x83\xbe\xba\x5f\xf7"
- "\x4a\x03\xb1\xe1\xfb\x2c\x09\xdf\xa1\xad\xfb\x65\xd8\x5e\x6f\x8f"
- "\xed\xaf\x1a\x64\xd8\x7e\x2e\x5f\xee\x1f\x51\xaf\xb5\xc3\x76\x71"
- "\xcf\x43\xe4\xd9\x63\x75\xdd\x60\x3b\xdc\xdf\xf3\x3d\x62\xb7\x17"
- "\xdb\xc5\xfd\x0d\x4e\xb1\xdd\x7e\x7f\x83\x9d\xff\x03\x62\x3b\xcd"
- "\x47\x11\xe8\x80\xed\xab\x63\x94\xd6\x23\x30\x1f\x00\xd7\x71\x8e"
- "\x58\x79\xc0\x76\x3a\xde\xaf\x05\xdb\x63\x7b\x47\x06\xc3\xf6\x77"
- "\x9b\x7e\x3a\xb6\xdb\xe4\x61\x7b\x6c\x9f\x80\xd8\x3e\x33\x90\xed"
- "\xbf\x48\xef\xd9\xfe\x0b\x07\xff\x8c\x77\x7b\x60\x7f\xe9\x12\xe3"
- "\x9d\xf4\x4b\x8e\xf1\x33\x17\xcb\x31\x7e\x66\x91\x1c\xe3\x67\xce"
- "\x90\x30\x5e\xb8\x76\x5b\xe4\xf4\x99\x71\x77\xc7\xfe\x32\x33\x4e"
- "\xc2\xf8\xd7\x5f\xec\x7e\xef\xc5\xab\x8d\xce\x7d\x33\xe0\x3c\xc5"
- "\xf8\x57\x1b\xbb\xdc\x7b\x21\xb3\x77\xcf\x7a\xc6\xe9\xde\x8b\xea"
- "\x9f\xcf\x37\xc3\x9e\x57\x1c\xed\x2f\xb7\x6e\xfb\x9e\x35\xca\x5d"
- "\xfb\x0b\xee\xbd\x58\x7d\xca\x6e\xef\x45\x5d\xf7\x7b\x2f\x52\x66"
- "\xf4\xd0\xfe\xd2\x85\x6f\xc6\xf1\x08\x7b\x7f\xb7\xd9\x23\xe4\xf8"
- "\x3e\xfb\x19\x1b\xbe\xbf\x8c\xf8\x3e\x6f\xb2\x1c\xdf\xe7\x4d\xc2"
- "\x7e\x3a\xdb\x8b\xf1\x99\xec\xbb\xe2\xec\xad\x72\x5f\x0d\x07\xfb"
- "\xcb\xcb\xc8\x7b\x51\x56\x19\xbe\x9f\xb3\xc7\xf7\xd9\x3a\x67\xb2"
- "\x3b\xda\xbd\xa9\x4f\xf1\x1c\xbb\x3d\x6d\x53\x44\xff\xb7\x39\xc7"
- "\x8e\x45\xc2\xfb\x1b\x5c\xf8\xba\xcd\x61\xbe\x6e\xd4\xb7\x0d\xed"
- "\xe0\xd0\xd6\xbe\x39\x5a\x65\x6a\x14\xcf\xa1\xaf\x9b\xa3\x9f\x1b"
- "\xfa\xbe\xa1\xaf\x5b\x65\x4c\x8e\x4b\x3f\x37\xe4\x4d\x57\xbe\x6e"
- "\xd0\xef\x00\x8a\xf5\x17\x04\xac\x17\x7c\xdd\x0a\x12\x25\x5f\x37"
- "\x19\xd6\x3b\xf1\x1f\xde\x7f\x2e\xdd\xb9\x1c\x9f\x26\x61\x7d\x3b"
- "\xca\xf1\xa3\x1d\x6c\x31\x94\x06\x73\x55\x3f\xab\x2d\x86\x62\xfd"
- "\xdc\xb6\x2a\xe4\xe3\x59\x5a\x27\xb6\x98\xce\x3e\xce\x3f\x9f\x2d"
- "\x26\x6a\x9a\x1c\xe3\xa3\x32\xe5\x18\x1f\xf5\x8c\x84\xf1\xc2\xb5"
- "\xdb\x82\xf1\x51\x11\x77\xc7\x16\x13\x15\x21\xd9\x62\xe6\x3d\xee"
- "\xd4\xff\x4e\x66\x63\x9f\x5d\xee\xdc\xc6\x3e\x5b\xf0\xbf\x9b\x5d"
- "\xee\x72\x4f\x48\xa7\x6f\x9a\xf3\xfd\x98\x8d\xfd\x16\xf6\x84\xd4"
- "\xfd\xd2\x6c\x31\xf3\xd5\xee\xda\x62\xa8\x6f\xf3\x29\xf4\x0f\x71"
- "\x6f\x4f\x48\x77\xd8\x6e\x93\xdd\xbb\xf8\x86\x29\xc7\xf6\x05\x7e"
- "\x72\x6c\x5f\x10\x28\xc7\xf6\x3f\xf4\x97\x63\xfb\x1f\x42\x1c\xb1"
- "\xbd\x33\xae\x2f\x88\x76\x86\xe9\xda\x97\xd1\x16\xf3\x46\x85\x6b"
- "\x3c\x5f\x90\xe3\x3e\x9e\x2f\xdc\xf6\xbf\x1a\xcf\xd5\x8e\x78\xbe"
- "\xb0\xe6\x67\xb5\xcb\x50\x3c\x8f\x3e\x26\xc3\x73\x75\x37\x78\xfe"
- "\xb3\xd9\x65\xde\x18\x28\xc7\xf3\x37\xa6\xcb\xf1\xfc\x8d\x5e\x12"
- "\x9e\x0b\xd7\x6e\x8b\x5d\xe6\x0d\xcd\xdd\xb1\xcb\xbc\xa1\x91\x64"
- "\xf6\x37\xac\xdd\xe3\xf9\x82\x7c\xe7\x78\x0e\xe7\x29\x9e\x2f\xc8"
- "\x77\xe9\x4f\xdd\x09\xcf\xff\x70\xd6\x0d\x3c\x77\xea\xa3\xf2\xcb"
- "\xb0\xcb\xfc\xa1\xce\x5d\xbb\x8c\xab\x7d\x2a\x88\xef\x92\x7f\x8a"
- "\xdd\x3e\x95\x70\x71\x9f\x4a\xba\xdc\x3f\xe5\xb6\x63\x7b\xcc\x55"
- "\x39\xb6\xc7\xfc\x28\xc7\xf6\xc5\xf7\xca\xb1\x7d\xb1\x8f\xd8\x4f"
- "\x66\x97\xc9\xe8\xb4\x6f\x45\x8e\xf3\xb1\xd3\x74\x2f\x37\x10\x67"
- "\x58\x7f\x59\x11\x77\xd0\x35\xce\xc7\x26\xb9\xc2\x79\xf4\x57\xf9"
- "\xeb\x9c\x18\x27\x38\xbf\x68\xed\xff\x0f\x38\xef\xca\x0f\x85\xea"
- "\x41\x80\xf1\x88\xf7\x14\xdf\x05\xac\x47\x9c\xb7\xfe\xb7\x33\x1b"
- "\xcd\xa2\x03\x77\x0a\xe7\x5d\xdb\x68\xfe\xb8\xbf\x6a\x96\x80\xf3"
- "\x3d\xd9\x43\x73\x58\x6e\xa3\x29\x58\x74\xa7\x6d\x34\x71\x7e\x72"
- "\xbc\x8f\x1b\x27\xc7\xfb\x3f\xb6\x49\x78\x2f\x5c\xbb\x2d\xf2\x7b"
- "\x9c\xfa\xee\xd8\x68\xe2\xd4\x12\xde\xc7\x5d\xed\x1e\xef\x63\xd3"
- "\x9d\xe3\x7d\xac\x10\x9b\x2d\x36\xbd\xe7\x78\xbf\xd8\x86\xf7\x9d"
- "\xf7\xcf\xa4\xdf\xba\x8f\xcc\x73\x77\xdb\x46\xb3\xd8\x25\xfe\x77"
- "\x15\x1f\xe3\xd6\x6d\x34\xc2\x9e\xc4\xf9\xce\xe3\x63\x1c\xeb\xc2"
- "\x47\xe6\x58\x85\x3d\xd6\x2f\x39\x2d\xf7\x45\x5c\x72\x56\xf4\x45"
- "\x3c\x56\x85\x58\xbf\xdc\x53\x8e\xf5\xcb\x55\xae\x6c\x34\xfb\x39"
- "\x7b\x9f\xc4\xa5\xcf\xc8\x6d\x34\x45\x72\x1b\xcd\x14\xe4\xbd\xf8"
- "\x4f\x5d\x63\xfd\xd2\x85\x72\x1f\x70\xb6\x47\xf1\xc3\x39\x82\x0f"
- "\xf8\x1c\x3b\x1f\xf0\x97\xfe\x2c\x60\xbd\x76\x6d\x79\xb5\x85\xb8"
- "\xe3\x87\xf8\xd3\x7d\xbd\xd7\x3b\xf5\x41\xa4\x6b\x40\x17\x7e\x88"
- "\x73\x4f\xab\xd1\xa7\x39\xa6\x30\xd1\xce\x0f\xb1\x8b\x78\xc6\x32"
- "\xfc\x9f\xa3\x75\x89\xff\x6d\xbc\x84\xff\xdc\xbf\x48\x76\x1b\x0e"
- "\xe5\x7c\x4a\x17\xed\x81\x3b\x65\xb7\x71\x66\x27\xd1\x3d\x8f\xf8"
- "\xbf\xec\x63\x26\xe7\xc7\xfc\xc2\xec\x36\xf1\xbd\xe4\xb8\x1f\x3f"
- "\x46\x8e\xfb\xcb\x7e\x94\x70\x5f\xb8\x76\x5b\x7c\xd1\xe3\xbd\xef"
- "\x8e\x9c\x1f\xef\x2d\xd9\x6d\xe2\x2f\x75\x8f\xfb\x4b\xe3\x9c\xe3"
- "\xfe\xd2\x38\x86\xfb\x4b\xe3\xba\xb4\xdb\xc8\x7c\x23\x97\x1f\xfb"
- "\xc9\x76\x1b\x51\xce\xbf\xeb\xfb\x7a\x96\x97\xbb\x63\xb7\xb1\xed"
- "\x49\xff\x49\x76\x1b\xe7\x78\x2f\xca\xf6\xc7\xba\xf8\xe6\x2a\xc7"
- "\xfb\x84\x63\x72\xbc\x4f\xa8\x94\xe3\x7d\xd2\x15\x39\xde\x27\x35"
- "\x3a\xb3\xdb\xc8\xb1\x7e\x45\x7f\x67\x38\xaf\x9d\x82\x76\x9b\xa4"
- "\x7c\xd7\x18\xbf\x62\xa2\xfb\x18\x9f\x18\xfd\x7f\x18\xef\x80\xf1"
- "\x6a\x47\x8c\x4f\x2c\xfa\x59\x65\x7c\x8a\xf1\x2b\xb7\xca\x30\xfe"
- "\x36\xda\x72\x7a\xb2\x9f\xc4\xb5\x6c\xbf\xd2\xc1\xff\x3d\x49\x23"
- "\xc7\xf8\x95\x76\xfe\xef\xc2\xb5\xdb\x82\xf1\x2b\x6f\xbf\xff\x7b"
- "\x8f\x30\x7e\xa5\x9d\xff\x7b\xd2\xb1\xee\x31\x7e\x45\x84\x73\x8c"
- "\x87\xf3\x14\xe3\x57\x44\x74\x29\xdb\xcb\x30\x7e\xd5\x9e\x3b\x61"
- "\xcb\xb9\x3b\xfb\x8d\x56\xed\x76\xc7\x9e\xd3\x55\xdc\x11\x97\xf6"
- "\x9c\x51\xa2\x3d\x47\xeb\xc2\x9e\x73\xbb\x30\x3f\xf9\xa0\x1c\xf3"
- "\x93\x0f\xcb\x31\x3f\xf5\x47\x39\xe6\xa7\x1a\xe5\xf6\x9c\xf8\x4e"
- "\xf6\x1c\x39\xfe\xaf\x1e\xa8\x9b\x62\x6f\xcf\x29\xb2\xb3\xe7\xa4"
- "\xbe\xe7\x1a\xff\x57\xbb\xc4\xff\x9b\x14\xff\xa3\x9c\xe0\x7f\xca"
- "\xff\x12\xfc\x8f\xfa\x09\xf8\x9f\x72\x17\xf0\x7f\xcd\x0e\x66\xe3"
- "\xe9\x61\x9c\x94\xfd\xee\xdb\x78\x7e\xda\x3a\xb0\xe6\x86\x7c\x1d"
- "\x48\x0d\x93\xaf\x03\x6b\xce\x4a\xeb\x80\x70\xed\xb6\xac\x03\x6b"
- "\x4c\x77\x67\x1d\x58\x63\x92\xd6\x81\xd4\x93\xdd\xaf\x03\xab\x5d"
- "\xac\x03\xab\x85\x75\x60\xb5\x1b\xeb\x40\xda\x61\xd7\x36\x1e\xed"
- "\xad\xdb\x78\x9e\xb9\xdb\xfb\xa0\xd2\x74\x6e\xd9\x78\xf2\xc6\x94"
- "\x54\x60\x8c\x94\x0b\x44\xb9\x7a\x9e\x68\xe3\xd1\x39\xd8\x78\x74"
- "\x9d\x6c\x3c\xab\x2e\x08\xf8\x3f\x49\xd8\x6f\x3a\xe5\x27\xc4\x48"
- "\xa1\x39\x94\xd3\x0f\xca\xfd\xe6\xd3\x29\xfe\x4b\xf1\xfb\x32\x27"
- "\x63\xbf\xd8\xfa\xa3\xeb\x22\x06\xea\xda\x7b\x65\x36\x9d\x49\xce"
- "\x62\xa4\xac\x93\xf9\xdd\xc8\xf7\x9b\xae\x1d\x25\xc3\xfb\x29\x6c"
- "\xbf\xe9\x47\xce\xbe\xd3\xda\x62\xf2\x67\xbc\x48\x63\xf2\xdb\x62"
- "\xf9\xad\x4d\xe9\x51\x2c\xe9\x39\x42\x2c\xe9\x73\x77\x21\x96\x74"
- "\x4f\x63\xf2\x9f\x73\x8c\xdf\x97\x71\x49\x5f\xa1\x23\x55\xc8\x23"
- "\xb3\x1c\x63\x9f\xea\x9c\xef\xdd\x57\x0a\x7b\xf7\x97\xdc\x99\x38"
- "\x28\xd8\x1f\xba\xe6\xfb\x67\xea\xf6\xa4\x1a\x69\x7f\x30\x5f\x35"
- "\xd0\x39\xb6\x02\x78\x95\x43\x3c\x8d\x47\x3c\x5d\x57\x40\xeb\x5e"
- "\x00\x5e\xf0\x0f\xa8\x45\x3e\xce\xe6\x88\x8f\x36\x11\xb1\x75\x1d"
- "\xf5\xfb\x02\x31\x02\xb0\x95\xd5\x5b\x73\x81\xb7\x5a\xfd\x43\x6a"
- "\xa1\xff\xf7\xec\x5d\x52\xed\x59\x65\x30\xc1\xbc\x68\xc2\x3d\xb1"
- "\x0a\xbd\xa5\x55\x87\xb4\x38\xb4\xa4\x5a\xc5\x03\xfe\xee\x7c\x83"
- "\x78\xbb\x37\x4f\xd7\xc5\x50\x79\x06\xd7\x3d\xff\xcc\x0a\x8c\x03"
- "\x22\xca\x56\xdc\x0f\x92\x7d\x6b\x07\x8c\x0f\xc7\xb3\xb5\x6f\x6e"
- "\x2c\xc3\x0d\x78\x5e\x0c\x8c\x25\xf5\xb1\x45\xdc\xa0\x39\xac\x00"
- "\x37\x0a\xaf\x4b\xdf\xb1\xb1\x7d\x1c\x23\x66\x47\xc9\x94\xfc\x5f"
- "\x0c\xae\xb0\x75\x6d\xb8\x73\x6c\x5d\x1b\xce\xb0\x75\x6d\xb8\x0d"
- "\x5b\x0d\x4e\xec\x28\x32\x3f\xf6\x37\x05\xff\x17\x9d\x83\x8c\xad"
- "\xfb\x27\x8c\x8f\xf2\xa6\x5b\xfe\x2f\x14\x4f\xe3\x18\x9e\x22\x5e"
- "\x89\x98\x2a\xd9\x51\x74\x2e\xed\x28\xdd\x61\xaa\x5b\x7b\xf8\x29"
- "\xa6\x66\xf9\xc9\x31\x35\x2b\x50\x8e\xa9\x6f\x6d\x75\xc4\xd4\xce"
- "\x78\x9a\x35\xc3\x19\x96\xb2\xf8\x28\x6f\x8d\x73\x8d\xa3\x59\xe9"
- "\xae\x70\x94\xfa\xa7\xcf\xb1\xf3\x4f\xb7\xe1\xe8\xbf\x6d\x96\xe3"
- "\x68\x56\x59\x4f\x71\x94\xe6\x36\x39\xf7\x33\xe4\x36\xb9\x65\x1c"
- "\xd5\x3a\xe0\xe8\xfa\xc7\x25\x1c\x75\xcc\x6f\xd2\x0d\x8e\x2e\xba"
- "\x33\x31\x50\x64\x38\xca\x19\x69\x7f\x34\x4b\x68\x5f\x3f\x96\xe3"
- "\xe8\xfa\x06\xd7\x38\xba\x7e\xad\x84\xa3\xac\xde\x9d\xc5\xd1\xf5"
- "\x25\x32\x1c\x5d\x64\x87\xa3\xdf\x4b\x3a\x04\xfa\x58\xd8\x70\x74"
- "\xb1\x1d\x8e\x2e\xea\x0e\x47\xd7\xd3\x31\x62\x32\xea\x5b\x2b\xba"
- "\xc7\xd1\xac\xf5\xce\x71\x14\xce\x53\x1c\xcd\x5a\x2f\xe1\xa8\x13"
- "\x19\x55\x86\xa3\x7f\x7a\xcd\x0d\x1c\xfd\x85\xc7\x46\xf9\x53\xa4"
- "\x5b\xb6\x0a\x69\x4f\x67\xe7\x18\xa9\xb3\xed\xf7\x04\x95\x3a\xe4"
- "\x3d\x29\xed\x94\xf7\x64\x95\xb8\xc7\x73\xa2\x80\xab\x2f\xfd\x04"
- "\x5c\xa5\x7b\x3c\xdf\x8e\x95\xfb\x9e\xbc\xbd\x58\xf4\x3d\x61\xb8"
- "\xba\x49\x21\xf6\x4b\xca\x7b\x52\xda\x45\x8c\xd4\xb7\x0f\xca\x62"
- "\xa3\x4c\xb4\x8f\x8d\x92\xfd\xb1\xeb\x18\xa9\x6f\x37\xc8\x62\xa3"
- "\x1c\x2f\xb6\xe5\x3d\x71\x8c\x91\x2a\x61\xec\x86\x1b\x14\x63\x6d"
- "\x31\xa8\x36\x84\xd9\x62\xa4\x76\xb3\x2f\x08\xdb\xd9\x5b\x1f\x73"
- "\xe7\x31\x56\xe7\x06\xc6\xca\xf2\x9e\x38\xc6\x98\xda\xb8\x4d\x5f"
- "\x5e\x4a\xaa\xa2\x4a\x9d\xc4\x46\x2d\xbd\xab\xb9\x4f\xb0\x5f\xce"
- "\xb1\x36\xbb\xbf\x1c\x6b\xb3\x23\x68\xdd\xb3\xce\xb0\x76\xe3\x55"
- "\x09\x6b\x59\xbd\x35\x67\x1d\xb0\xb6\xce\x05\xd6\xc2\xba\xba\xf3"
- "\xb2\xbb\x58\x9b\x1d\x42\xb1\x36\x43\xc0\xda\xa6\xdb\x8d\xb5\xd9"
- "\x21\x12\xd6\x66\x5f\xe8\x3e\xc7\xd4\xdb\xcd\xce\xf7\xe5\xbc\xdd"
- "\xcc\xb0\xf6\xed\xe6\x2e\x73\x4c\xc9\x7c\x3e\x36\x9d\x14\x73\x4c"
- "\x49\xf6\x80\x52\xc1\x1e\xf0\xcf\x9c\x13\x65\x53\xb5\xbb\xf6\x80"
- "\x13\xa0\xbb\xe3\xbe\xcb\xd5\x98\x73\x6a\x16\xe6\x44\x29\x71\xb0"
- "\x07\x94\x74\xb6\x07\xbc\xd6\x35\xc6\xba\x65\x0f\xa0\xfb\x2e\x73"
- "\x2a\xe5\x18\x9b\x73\x52\x8e\xb1\xb9\xb1\xe2\x3e\x4b\xec\x8f\xeb"
- "\x98\xa9\x9b\xfb\xdb\xec\x01\x75\x72\x6c\x95\xec\x01\xb9\xf7\xbb"
- "\xc6\xd8\xcd\x72\xfb\xef\x4b\xc5\xb2\x7d\x96\x1f\xd5\xdb\xc7\xa1"
- "\x16\xe3\x4f\x6d\x89\x3e\x56\x63\x8f\xb1\x9b\x37\xfc\x33\xc5\xa1"
- "\xb6\xc5\x9a\xea\xc6\x97\xbb\x73\x1c\xea\x77\x00\xd7\x4a\x08\xee"
- "\x6d\xa3\x78\x2b\xb3\x0d\x94\xdc\x1d\xdb\x40\x79\x89\x0b\xdb\xc0"
- "\x3b\x6f\xca\x71\xf6\x9d\x52\x5a\xf7\xb4\x33\x9c\x7d\x67\x86\x84"
- "\xb3\xac\xde\x9a\xd3\x0e\x38\x5b\x7b\x3b\x65\xda\x77\x32\xef\xac"
- "\x6d\xe0\x9d\x4c\xc9\x36\x90\xdb\x83\xfd\x8f\x9b\x23\x9c\xe3\xec"
- "\x66\xc1\xee\xba\x59\xb2\xbb\xd6\x3a\xc9\x97\x22\xc3\xd9\xad\x8f"
- "\x8b\xfb\x1f\xa9\x4c\x5b\x27\xca\xb4\x25\xff\x84\xf9\x52\xb6\x0e"
- "\x75\xd7\x36\x80\xfb\xdc\x11\x5b\x11\xbb\x44\x7c\x95\x6c\x03\x25"
- "\xae\x6d\x03\xdd\xe0\xab\xfb\xb9\xfb\xf2\x1e\x97\xe3\x6b\xde\x53"
- "\x72\x7c\xdd\x76\xd0\x11\x5f\x3b\x63\x6b\xde\x32\x67\xb8\xca\x6c"
- "\x03\xdb\xe2\x5c\x63\x6a\x5e\x81\x2b\x4c\xa5\x31\xfd\xea\x25\x1f"
- "\x69\x09\x53\xff\x7d\xbf\x1c\x53\xf3\x0c\x3d\xc5\xd4\xbb\x92\x2f"
- "\xe5\x96\x31\x35\xc6\x01\x53\xf3\x67\x48\x98\xea\x98\x33\xa5\x1b"
- "\x4c\xbd\x53\x76\x02\x7b\x4c\x95\xc9\xae\xf9\xa7\xe5\x98\xba\xcd"
- "\xc7\x35\xa6\xe6\x7f\x28\x61\x2a\xab\x77\x67\x31\x35\xbf\xf6\xce"
- "\xda\x09\xf2\x6b\x25\xd9\x75\xdb\x8e\xee\x31\x35\x6f\x97\x73\x4c"
- "\xcd\xdb\xc5\x30\x35\x6f\x57\xcf\xf7\x94\x6f\x5f\xeb\x06\xa6\xfe"
- "\xc2\x73\xa9\x6c\x4f\x77\xdb\x4e\x80\xf6\x56\xc4\xd2\xba\x9f\x16"
- "\x3b\x24\x49\x8c\x1d\x32\x4e\xc0\xd8\x09\x3f\x15\x63\xdf\xdd\x2c"
- "\xf7\x69\x78\x77\xab\xe8\xd3\xc0\x30\x76\xe7\x08\x79\x7e\xd4\xce"
- "\xb1\x42\xe4\x31\x54\xdf\xbd\x64\xb3\x13\x20\xe6\x8e\xb3\xb7\x13"
- "\x14\x5e\x72\x8d\xb7\x05\x3e\x32\x3b\xc1\x17\xce\xf1\xf6\xa6\x0c"
- "\x6f\x77\x3c\x4a\xf1\xd6\x16\x43\xb5\x20\x42\x8c\xa1\xda\xad\x0c"
- "\x2b\xc3\xdb\xa8\x9f\x07\x6f\x4b\x7b\x8e\xb7\xf2\x5c\x2a\x8e\xf1"
- "\x52\x77\x54\xea\xcb\x00\x6f\x69\xbc\x0e\xc7\x98\xa9\x3d\x8b\xd7"
- "\x71\xa7\x62\xa6\x62\xbf\x9c\xe3\x6e\xe1\x34\x39\xee\x16\x66\xd2"
- "\xba\x4e\x71\xb7\x70\xa0\x84\xbb\xac\x5e\x8f\x71\xf7\x96\x6c\x06"
- "\x85\x11\x77\xd6\x66\x50\x18\x21\xe1\xee\xce\xc0\xee\x71\xb7\x20"
- "\xc0\x39\xee\x16\x04\x30\xdc\x2d\x08\xe8\x12\x77\x65\x3e\x04\x45"
- "\x9e\x4e\x63\x79\xd4\xfd\xb3\xe7\x59\x29\x52\xdd\x8a\xcd\x00\x30"
- "\x58\x99\x82\x31\x9c\xa2\xd0\x87\xa0\x7b\x9b\x41\x77\x78\xeb\xbe"
- "\xcd\xe0\x3d\x85\x1c\x6f\xdf\xf3\x94\xe3\xed\xae\x8f\xb1\x5f\x5d"
- "\xda\x0c\x28\x06\xbc\x37\xcd\x66\x33\x30\xc8\x71\x56\xb2\x19\xec"
- "\x9a\xe7\xfa\xdb\xd7\x7b\x29\x32\xf9\x76\x82\x43\xcc\xea\x39\x12"
- "\xde\x1e\xaf\x12\x7d\xc6\xfe\xbc\xe7\x58\x84\x3d\xde\xbe\xa7\xeb"
- "\x14\xb3\x7a\xfa\x6d\x8c\x59\x3d\xfd\x36\xc7\xac\x9e\x21\x8f\x59"
- "\xbd\xfd\xa6\xe4\x47\xe6\x7e\xcc\xea\xbf\xbc\x48\x31\x18\x79\x08"
- "\xe3\x56\xf7\xc4\x8e\x70\x87\x73\xad\xc8\xb0\x57\x66\x47\xf8\x4b"
- "\xa5\x1c\x7b\x77\x11\xd7\xd8\xfb\x97\x1d\x12\xf6\xb2\x7a\x77\x56"
- "\xe6\xfd\x4b\xc5\x9d\xb5\x23\xfc\xa5\x42\xb2\x23\xec\xda\xec\x14"
- "\x7b\x65\xdf\xc6\xde\xcb\x74\xfe\x6d\x0c\xce\x53\xec\x7d\x2f\xd3"
- "\xa5\x1d\xa1\x93\xff\xd6\xfb\x2b\xd8\xb7\x31\x41\xe6\x35\xb8\x61"
- "\x47\xf8\xc5\xf9\x18\xbc\x9f\x70\x2b\x76\x04\xc4\x5b\xc4\x33\x11"
- "\x73\x7b\x62\x47\xb8\xfd\x32\xee\x07\x2b\xe4\x98\xfb\xc1\x2a\x39"
- "\xe6\x7e\x74\xbf\x23\xe6\x76\xc6\xdb\x0f\xf6\x3b\xc3\x5a\x66\x47"
- "\xf8\xb0\xdc\x35\xce\x7e\xd0\xe0\x12\x67\x1d\x7c\x73\x25\x9c\x2d"
- "\x0e\x94\xe3\xec\x7f\x84\xdd\x12\xce\xf6\x34\x07\xcb\x2f\x0a\x67"
- "\xa3\x1c\x70\xb6\xf8\x63\x09\x67\x1d\xf3\xb0\x74\x83\xb3\x77\x28"
- "\x0f\x8b\x6b\x19\xf7\xc3\x11\x72\x9c\xfd\x30\xc6\x35\xce\x7e\xe8"
- "\x29\xe1\x2c\xab\x77\x67\x71\xf6\xc3\xe1\x77\xd6\xb6\xf0\xe1\x70"
- "\x49\xc6\xfd\xb0\xad\x7b\x9c\xfd\xa0\xd9\x39\xce\x7e\x20\x7c\x17"
- "\xfb\xa0\xd9\xa5\x8c\xdb\x09\x67\x3f\x3a\xeb\x06\xce\xfe\xc2\x7d"
- "\x10\x3e\x72\x2b\xfe\x85\x9d\xbd\xd6\x4b\x6f\x70\xd8\x2f\x71\xda"
- "\x7e\xbf\x84\x9d\x6d\x61\x9c\x68\x5b\x90\xe7\x67\x49\x12\xed\xb7"
- "\xe1\x02\xee\x3e\xff\x53\x71\xf7\xaf\x57\x5b\x6d\xb8\x1b\x0f\xb8"
- "\xfb\x57\xba\x3f\xa2\xd5\x86\xbb\xfb\xde\x17\xfb\x25\xe5\x67\x71"
- "\x61\x5b\x78\x16\xdb\xdb\xfd\x9c\xcd\xb6\x80\x38\x1c\x6e\x6f\x5b"
- "\xd8\x37\xc3\x35\x06\xef\x8e\x91\xd9\x16\xfe\xe1\x1c\x83\x4d\x32"
- "\x0c\xde\xb3\x8d\x62\xf0\xb3\x22\x06\xef\xde\x7d\x13\x74\xcb\x9b"
- "\x59\xee\x61\xb0\x89\x62\xf0\xc4\xbb\x83\xc1\x9f\xdc\x06\x0c\xa6"
- "\xe3\xbe\x77\xac\x5e\x07\x18\x3c\x0b\x31\x78\x62\xcf\xec\x0d\x3f"
- "\x53\x8e\x16\xec\x97\x73\x2c\xde\x7b\x58\x8e\xc5\x7b\x4d\xb4\xae"
- "\x53\x2c\xde\xbb\x59\xc2\x62\x56\xef\xce\xda\x1b\xf6\xea\xee\xac"
- "\xbd\x61\xaf\x4e\xc2\xe2\x7d\x6f\x76\x8f\xc5\xbb\xb5\xce\xb1\x18"
- "\xce\x53\x2c\xde\xad\xed\x12\x8b\x9f\xb5\xc7\xe2\x12\x9b\xcc\x2b"
- "\xb3\x37\x18\xfe\xd9\x73\xb7\x94\xb8\x94\x7f\x35\x03\x48\x7a\xbd"
- "\xa2\xa4\x52\x5f\x40\x48\x4b\x06\x49\xd7\x5b\x9e\x25\x70\x0e\xc6"
- "\xaf\xe4\x86\x3e\x78\x14\xe1\xb6\x0c\x1e\x85\x78\xfc\x0e\xfe\x40"
- "\xc6\xcd\x51\x0a\x73\x8b\x8e\xf1\xc7\xd4\xdf\x15\xcf\x23\xf6\xee"
- "\xb4\xbb\xee\xec\x59\x7c\x4e\xe8\x27\xc2\x7d\x11\x6c\xdf\x4d\x68"
- "\xa9\x58\x46\xde\x34\x28\x3e\x9e\xce\x6f\x0e\x2d\x31\xfa\x85\x96"
- "\x38\xbb\xff\x61\x35\xf1\xee\xbb\x96\xe7\x0b\xf3\x78\x53\xcb\x23"
- "\x81\x45\x2d\x7f\x22\x24\x27\x8f\x37\xb6\x66\x7d\xbc\x01\xde\xf1"
- "\x93\x7f\x87\x7a\x2d\xfe\xdb\x8a\x5a\x32\x22\x08\x9c\x2b\x12\xcf"
- "\xc1\xb8\x11\x2e\xc3\x83\xe7\xe0\x1a\xbf\xe5\xca\x86\x9d\xa9\x80"
- "\x55\x29\x84\x3c\x71\x13\xe7\xcc\xc7\x25\xc0\x33\x01\xd9\xd0\xe6"
- "\x26\x68\x8b\xbf\xef\x41\x13\xf0\xa3\xaa\x2a\x93\xe0\x9c\x5e\x0f"
- "\xef\x55\x94\x8d\x63\xef\xf1\x58\x3e\xaf\x54\x11\xee\xfd\x00\x33"
- "\x1f\x38\xb6\x04\xe8\x41\x72\xe2\x09\xdd\xc3\xbf\x09\xea\xf1\xca"
- "\x34\x9e\x1b\xdc\x0f\xc6\xcf\xc4\xe6\x34\xf4\xef\x10\xe8\xb1\x3c"
- "\x3c\xb7\x30\x9e\xa8\xe1\xe7\xc3\x6f\x1d\x5b\xd2\x9a\xf5\xb7\x51"
- "\xf0\x9e\x1a\xec\x97\xab\x77\xdc\xb4\x1d\xd6\x9d\x07\x83\x71\xed"
- "\xa0\xcf\xc7\x67\xd3\xe7\x28\xb9\xf5\x56\x38\xcf\x67\xa4\xf1\xfa"
- "\x24\x0b\xf1\x85\xb1\xd8\x09\xfd\x46\x7e\xe4\x3e\x08\x2c\x5a\xf7"
- "\x00\x21\x7b\x93\x1b\x95\x7a\xe8\xbb\xf5\xdf\x1f\x34\xe9\x52\x7f"
- "\x4d\xe0\xba\x11\x75\x96\xcb\x8a\xbf\x8f\x98\x7a\x85\x10\xc4\x13"
- "\xf8\xff\x39\x13\xac\x63\x93\xa1\xbc\x09\xde\x83\x6b\x09\x56\x61"
- "\xdd\xcb\x8a\xbf\x5d\xd5\x25\x9e\x21\xbe\x5a\xe2\x9d\x0d\xef\xc6"
- "\xea\xfe\xed\x00\xd6\x35\x28\xfe\x1e\x8e\x7d\x80\x72\x35\x94\xf1"
- "\x3e\xf4\x21\x23\xfc\xae\x00\x33\xe5\xcd\xdc\xb1\x25\xdc\xe0\x00"
- "\x33\xc5\x3e\x78\xcf\x4d\xf0\xce\x50\xc7\x07\xea\xf8\xd0\x63\x2a"
- "\x51\xe7\xc2\x39\x6c\x07\x8e\x3e\xba\x25\xed\xd8\xf6\x6e\x6c\xdb"
- "\xc5\x38\xa8\xf8\x80\xb1\xb0\x76\xab\xe8\x9a\xaa\x49\x55\x9c\xac"
- "\x57\xfc\xdd\xe0\xab\xe0\x79\x7e\x57\xbf\xf4\x75\xa9\xc4\x27\x87"
- "\x23\x44\xf7\x00\xb6\xf3\xf7\xfd\xd0\xbe\x0a\xc7\xa2\x35\xeb\xef"
- "\xf9\x06\xc5\xdf\xc6\xe1\xf8\x02\x3d\x4d\x9a\x87\xe9\xfb\x1a\xf1"
- "\x39\x78\x8f\x50\x9f\xc6\xbe\xc7\x3e\x6b\x52\x3d\x78\x28\x9f\xf6"
- "\x50\x5c\x20\x1e\xc1\x3e\xd9\x70\x7f\xad\x81\xfc\x71\x03\xde\x6f"
- "\x60\xf7\x01\x2f\xfd\xbd\x19\x68\x16\x85\xe7\xb0\xec\xa2\xbf\x3e"
- "\x22\xdd\x2a\x83\x81\x37\x1c\x69\x27\xf2\x08\xf0\x85\xc8\x23\xd8"
- "\xdf\x7d\xa9\x06\x25\x5d\x87\x15\x9f\x50\xbd\x2e\x1b\x68\x68\x7d"
- "\x37\x58\xb5\x09\xc6\x96\xeb\x40\xba\xd4\xc3\xb5\x4f\x9f\x42\xba"
- "\x6c\x4a\x06\x9a\xb0\xba\xd3\xa5\xfe\x63\xf9\x53\x4a\x4f\x0e\x68"
- "\xc1\xf6\x6e\x7e\xea\x89\xef\xb3\xe9\x26\xd0\x31\x88\x37\x95\x25"
- "\x41\xbf\x90\x6f\x81\x47\xf6\xc6\x9b\x95\xe8\xd7\x87\xe7\x0f\x5d"
- "\x37\x2b\x37\x35\x11\x94\x2b\xc9\x46\xc0\xe5\x1d\x89\x30\xe6\xd0"
- "\x26\x1f\xda\x2f\xfd\x49\x91\x8e\xc9\x40\xbb\x44\xe0\x5d\x18\xf3"
- "\x4d\x30\x7e\x85\x80\x79\xf8\x7f\x21\xac\x3f\x1c\xd4\x33\x28\x3e"
- "\x0d\x87\xf6\xd4\x3b\x82\x78\xe3\xce\x20\xbe\x19\xc6\xf0\xcf\xad"
- "\x59\x9f\x86\x88\x63\x88\x7d\xda\x04\xe7\x37\xc2\x75\x83\xe2\x93"
- "\x7c\xc6\x43\x9f\xc4\x88\xef\xec\x6a\x3c\x37\xec\x25\xa3\x36\xee"
- "\x25\x21\x7f\xda\x4b\xc6\xac\x6e\x80\x79\x99\xf1\x5b\xfe\xc4\x2c"
- "\x0b\xac\x89\xa9\xb5\xed\x41\x8f\x14\xe1\xb7\x27\x6e\xdd\x83\x45"
- "\x6f\xee\x25\x43\x71\x6f\xec\xd4\x66\x42\x70\x0d\x9f\xea\x79\x9e"
- "\xd7\x6b\x6f\x10\xce\x2f\xb5\xd6\xba\xee\x31\xff\x29\x37\x08\x39"
- "\x1a\x66\x22\xa9\x09\xb0\x96\x5f\x6f\x24\xa9\x26\xde\x58\x95\x7e"
- "\x85\x00\xf6\x14\xb3\xb1\xfb\xcf\xba\xa9\xd1\x84\xe0\x9e\x41\xee"
- "\xfb\x30\x72\x6f\x0c\x51\xa5\x9c\x26\xc1\x69\x0d\x7c\xa3\x35\xef"
- "\xe9\x9c\xd4\x35\x44\xb9\xf7\x7a\x2d\x93\x3d\x15\xff\xb9\xe7\x20"
- "\xee\x4f\x6d\x8d\x24\x73\x2d\xc2\x7a\x94\x3b\xb6\x34\x2d\x96\xdc"
- "\x8f\xef\xe3\x4b\x65\xaf\xff\x7c\x11\xc6\xad\xd4\x3d\x7c\xfe\xcf"
- "\x00\x4a\xcf\xbc\x11\x9a\xbd\xf3\xcd\x20\x6f\x35\x95\xa4\x45\xf3"
- "\x8d\x28\xd7\xc1\xfa\x42\x65\x41\x7d\xa3\x05\x64\xab\x85\xb0\x7e"
- "\x1b\xc8\xe7\xf5\x45\x4a\x6e\x73\x53\x89\x9b\xcf\x48\xa2\xeb\x36"
- "\xae\xa5\xd0\xf7\x19\x61\x24\x9d\xf6\x1f\xd6\x4c\xdf\x04\x94\xa7"
- "\xf8\xf3\xd8\xff\x43\xf0\xae\xfc\xc0\x69\x30\x4f\x3f\xb5\xe0\xfa"
- "\x39\xb5\x4e\x47\x2a\xcc\x56\xb2\xbd\x89\x8e\x91\x17\x8c\x91\x0a"
- "\xae\x55\xc3\x38\x79\x3b\xa3\x1b\xd2\x8c\xcb\x49\xad\xe5\x3c\x18"
- "\x6d\x28\x5d\x4c\x8c\x2e\x53\x96\x11\x58\x47\x81\x36\x9b\x19\x6d"
- "\xb8\xc0\x31\x45\x48\x1b\xf7\xde\xe3\xbf\xc2\x5d\xad\x2f\xf8\x6c"
- "\x1e\xf8\x03\xf9\x82\x0b\x18\x53\x84\xcf\xc6\x3e\xe0\xf7\x33\xe4"
- "\x83\xa9\x6f\x9e\xe7\xab\xb4\x8d\x44\x0f\xef\xc3\xfb\xd9\xf7\xc1"
- "\xe2\x6e\x1f\xca\x5c\xf5\x61\xc3\x13\xc0\xb7\x4f\x00\xdf\x3e\x01"
- "\x7c\x6b\x60\x7c\x7b\xbc\x8e\xf1\xad\x15\xfa\xd5\x06\xb2\xfb\xea"
- "\x19\x44\x89\xfd\xda\x7d\x06\x63\xf4\x41\x3f\x1b\x25\xde\x9d\x7c"
- "\x15\xc6\x48\xe4\x5f\x8f\xc7\xfc\x71\x7c\xaa\x4c\xb5\x24\x0d\xf9"
- "\xb7\xdd\x19\xff\xee\x2f\x98\x3a\x0f\x68\xf3\x07\xe0\xdf\xef\xc2"
- "\x88\x4f\x03\x51\xad\x99\x01\xfc\xdb\xe8\x8c\x7f\xf7\x2f\x3e\x00"
- "\xcf\xec\xc4\xbf\xd1\xf6\xfc\xbb\xbf\x97\xfb\xfc\x5b\x5a\x63\xe3"
- "\xdf\x99\x02\xff\xc6\x3a\xf0\x6f\x83\x1d\xff\xe2\x7b\xbb\xcd\xbf"
- "\xfb\x47\xb9\xc7\xbf\xa5\x07\x6c\xfc\x0b\x7a\xc9\xf6\x37\xe8\x18"
- "\x79\xc1\x18\x01\xff\x96\xe6\xc0\x38\x39\xe5\xdf\x9f\x9f\x7e\xff"
- "\x3d\xab\xe7\xf4\xfb\xef\xc7\xbb\xa7\xdf\x67\xc7\xdc\xa7\xdf\x67"
- "\xb9\x77\x9e\x7e\x9f\x99\xdd\xa3\xdf\x67\x29\xae\xe9\xf7\x59\xc4"
- "\x2f\x87\x7e\x07\x43\x7a\x4e\xbf\x03\x57\xbb\xa7\xdf\x81\xb7\xdc"
- "\xa7\xdf\x81\xe9\x77\x9e\x7e\x07\x4a\xdd\xa3\xdf\x81\x31\xae\xe9"
- "\x77\x40\xed\x8a\x7e\x2f\xdc\xcf\xf1\x1c\xfa\xcd\x05\x0d\x22\x28"
- "\x03\x31\x79\xed\xe0\x15\xd4\x19\xa1\xac\x12\xcb\x54\xa6\x02\xbd"
- "\xda\xa1\xec\xe3\x50\x56\x3b\x94\x03\x1c\xca\xc1\x0e\xe5\x10\xb1"
- "\x0c\xf4\xf2\xbc\xa6\x38\xf8\x1a\xe8\x6c\x20\xe3\x1c\x34\x09\xd7"
- "\x43\xe7\x5a\x35\xa8\xf7\x85\x3a\xeb\xfb\xa6\x0c\xde\xac\x4d\x25"
- "\x0f\x36\x29\x0e\x45\x51\x7a\xac\x7b\x20\x8c\x4f\x4e\x27\x40\x8f"
- "\x86\x29\x6b\x90\xaf\x8c\x84\xef\x08\xf6\x82\x71\xba\x0f\xf4\x4d"
- "\x23\xf2\x9c\x26\xfe\x73\xbe\x5e\x71\x68\x32\xbe\xdf\x13\x5a\x1d"
- "\xe1\x3c\x1e\xc3\x9c\xe8\x0a\xa0\x4f\x83\xd1\xe3\xb1\x07\x40\x1f"
- "\x2d\xca\x56\x72\xde\xd9\x19\x9c\x66\x8d\x91\x37\x4e\xfa\x11\xd6"
- "\x31\x58\xcb\xf4\xcd\x66\xe0\x49\xde\xa8\x8b\xbf\x0a\xfd\x3d\xf4"
- "\x69\x65\x0a\xb4\x0d\xcf\x81\x67\x19\x78\x75\x53\x99\xde\x52\x4d"
- "\x78\x68\xa3\xca\x54\x0e\xba\x7f\x2d\x11\xda\x34\xf0\x7e\x4d\x65"
- "\xd8\xa6\x53\xfd\x2c\x77\xd0\x70\x78\xe6\xb3\x33\xc2\x54\x84\x5f"
- "\xab\x0a\x70\x8f\x3f\x0e\xd5\xba\xd4\xfb\x72\x07\x7d\xc2\xda\xf5"
- "\xbe\x85\x76\x3f\x1f\xe6\xba\xdd\x50\xa1\xbf\xea\x5b\x69\x77\x7d"
- "\x17\xed\x0a\xfd\xd5\xdc\x4a\xbb\x06\xd7\xed\x0e\x16\xfa\x1b\x7e"
- "\x0b\xed\xea\x5c\xe6\xff\x80\x76\x85\xfe\xa6\xdf\x4a\xbb\x39\x5d"
- "\xd0\x6d\xf8\xad\xf1\x82\xae\xa1\x2b\x5e\xb8\x35\x3e\x38\xdc\xc5"
- "\xfb\x87\x0e\xbf\x35\x1e\x38\xbc\xa1\x2b\x1e\xb8\x35\xfa\x1f\xee"
- "\x92\xfe\xb7\x46\xfb\x7f\x0c\xef\x8a\xf6\xb7\x46\xf7\x7f\xb8\xe4"
- "\x7f\xd4\x65\xf9\xdc\x87\xab\xf9\xa0\x69\x84\xdb\x72\xbd\x9a\x0b"
- "\x7a\xf8\xcb\x75\x5c\x38\x79\x01\x30\xcc\x37\x9f\xf8\x85\x53\xfb"
- "\xd0\x91\x90\x35\x05\x44\x99\xa3\xe4\x94\x7b\x92\x6b\x95\x7a\xcb"
- "\x28\x92\x66\xe1\xad\xbb\x12\xcd\x8a\x41\x70\xfe\x70\x0c\x21\xa6"
- "\xe5\x61\x84\xb6\xe3\x7f\xbd\x3a\x3b\x35\x9c\x4c\xb5\x12\xb4\x47"
- "\x98\x8e\xa4\x00\x86\x01\x8e\xe9\xf3\xcd\xb8\xe6\xf9\xc1\x7d\x16"
- "\xe0\x5f\x68\xc3\x4c\xf6\x71\x46\x45\x78\x3c\xad\x67\x04\xbd\xd1"
- "\xc8\xe7\x3d\xfc\x25\x9f\x16\x46\x32\xe1\x7f\x78\xe6\x9b\x1e\x46"
- "\xa2\x2c\x04\x7d\xb2\x35\xeb\x08\xe0\x72\xd9\x2c\xd4\x31\x41\x97"
- "\x6d\x4e\xfb\x11\x6d\xee\xd3\xc8\x3a\xd0\x6b\xb1\xee\x5e\xce\xa8"
- "\x7c\x42\x4b\x94\x47\x8c\xa8\xbf\x1f\xd9\x7d\x38\x81\x90\x2e\x6c"
- "\x2e\x2a\x2e\x60\x74\x00\xde\x8f\xed\xa0\x2d\x73\x13\x07\x63\x1b"
- "\x30\xb6\x14\xfb\xcb\xe7\x3e\xb2\x5e\x97\x8c\xeb\x42\xd9\xf0\xf1"
- "\x8f\xf2\xad\x02\xce\x3f\xd0\x04\x65\xaa\xb3\x67\xf0\xd5\xbc\xfa"
- "\x4a\x29\x9f\x7d\x6f\x78\x95\xe9\x3a\xd1\x25\xb6\x93\x7a\x45\xd9"
- "\x08\x7c\x76\x4b\xc0\x68\xb5\x29\x60\x74\x70\x6b\x56\xd9\x30\xb1"
- "\xbf\xf8\x2c\xf1\x3c\xda\x28\x58\x1f\xcb\x22\x0e\xa7\xb8\xee\x23"
- "\xac\x25\xfe\x53\x83\x79\x23\x8e\xa1\x2e\xf5\x3a\xf4\xe5\xe8\x51"
- "\x1c\x67\x3e\xf7\x59\x83\x29\x2d\x6c\x00\xb3\xd9\x95\x35\xa3\xed"
- "\x07\xd6\x81\x1a\x6a\x87\xd9\xdc\x54\x43\xfd\x6c\x00\xef\x41\x67"
- "\xcf\x47\x79\xe5\x9a\xa2\x8c\xe6\x3f\x9e\x11\xa6\x74\x53\xe7\x29"
- "\xa3\xeb\xbf\x6e\x00\x8e\xc3\xd1\x3d\xf0\xbc\xd1\xf5\x8a\xa3\x6a"
- "\x66\xc7\x6b\x6a\xc4\xe7\x41\x9d\x02\x78\x66\x23\x9f\x73\xa5\x04"
- "\xeb\xc1\xf5\x61\xc2\x75\xa3\xdd\x75\x23\x9f\x3b\x3a\x4c\xb8\x2e"
- "\xd8\x01\x9b\x4c\x76\xd7\x4d\xda\x01\x68\x97\x3b\x9a\x84\xef\x04"
- "\x6b\x59\x35\xae\x6b\x68\xf3\x67\x76\xf5\xa6\x6a\xa1\x5e\x43\xb3"
- "\xe2\xe8\xe6\x16\xe0\x2b\xb8\xde\x6c\x77\x7f\xf3\x91\xa4\x61\xe4"
- "\x85\x1d\x38\xa6\x47\x77\x19\x3c\xae\x97\x30\x5b\x4e\x59\x11\x1d"
- "\x0b\x75\x53\xb9\x7d\x7b\x06\xc5\x51\x2d\xb4\x59\x6e\x02\x59\x0f"
- "\xea\xac\xc7\x67\xda\x8f\x7f\x74\x7c\xfc\xd2\x78\xcd\xe0\x85\x9a"
- "\x85\x8b\xe7\x69\x16\x2c\x5d\xb1\x24\x61\xec\xe0\x85\xbd\x09\xb1"
- "\xe3\x1d\x35\x9f\xe1\xcb\x73\xb9\x23\x23\xf5\xf9\x20\x63\x29\xd5"
- "\xb0\xde\xb6\x93\x5c\xa0\xab\x25\x6f\xc2\x30\x6b\xd0\x78\x9d\x35"
- "\x6f\xc8\xb0\xb4\x1b\x44\x99\x1a\xcc\x5f\xd0\x25\x3f\x0f\x34\xf8"
- "\x62\x2c\xae\xf7\x7a\x0d\x21\x1b\x80\x5f\x75\xc9\xff\xc0\x73\x74"
- "\x0f\x8c\x3e\x8a\x9d\xfb\x7b\x6a\xb9\xf2\xf3\xd4\x5a\x65\x45\xd4"
- "\x75\x72\x24\xd8\x48\xca\x34\xd7\x49\x01\x9e\xe7\xaa\xe9\xb7\x19"
- "\xa8\xff\x3e\x3e\x0b\xed\x5b\xf8\x3f\xb3\xd5\x7d\xf1\x28\x3e\x47"
- "\xf3\x00\x7e\x33\xf8\xe2\x71\x7c\x9e\x41\xf1\xc5\x50\x8f\x02\xa2"
- "\x00\x79\xc6\x07\xea\x5d\xe1\xb6\x8e\x8c\xa4\xf3\x3b\xeb\x68\x9d"
- "\x45\xe9\xb7\xa4\x70\x0b\xf1\xde\xb9\x85\x90\x02\x7f\xa2\x6a\xcd"
- "\xfa\xa2\xc6\xa0\xea\x95\x80\xe3\x05\x4d\xfb\xb4\x28\xc9\x6f\xe1"
- "\x5c\xa3\x81\xfc\x31\x14\xcf\xc1\xbc\x32\xb9\xc2\x0b\xfc\x56\x66"
- "\xde\xe5\xaf\xe3\x02\x46\x4e\xe4\x61\x2c\xcc\xa1\xfe\x46\x5f\x2d"
- "\xf0\x0b\xcc\x1b\x3e\x70\xe4\xc4\x66\x45\x79\xc3\x17\xc0\x41\xa9"
- "\x38\x4f\x61\x3c\xfe\x7a\xd3\x8c\xdf\xc8\x86\xed\xbe\x69\x84\xf2"
- "\x78\xdd\x87\x89\x66\xe5\xf1\x71\xa5\x44\xf3\x32\xca\x43\xff\x33"
- "\xfb\x77\x0b\x79\xcb\x63\x11\x20\x3b\x36\xfc\x8d\x9c\xa8\x2b\x27"
- "\x3e\xb3\x88\x87\x2d\x7e\x7b\x02\x51\x4e\x35\x40\x79\x05\x51\x56"
- "\x81\x2e\x8f\xf6\xf6\xd4\xe7\xd0\xe6\x5e\x49\xd0\x0e\xcf\x2b\xe3"
- "\x2a\xf6\x5c\x37\x03\x2e\x35\x7a\xe2\x7e\x6f\x4e\x9d\x59\x8c\xf7"
- "\xcc\x35\x09\xdf\xaf\x5a\x84\xef\x57\x2d\xf4\xfb\x95\x16\xbf\x5d"
- "\xe1\x37\xab\x94\x28\x9e\xb3\x2e\x0f\xf3\x9f\x1a\xe5\xc1\x63\x9b"
- "\xf8\x3d\xeb\x5e\x90\xfb\xf9\xe5\x61\x7d\xb7\xc5\x93\x80\x2a\x63"
- "\x23\xd1\x37\x96\x93\x77\x13\x49\x00\xdf\x12\xd3\xab\xa2\xec\x38"
- "\xe1\xb7\xa4\x17\xed\x4b\xd5\x79\x5a\xd1\xe6\xd1\x12\xdc\xdb\x77"
- "\xad\x02\x6d\xf7\x7d\x37\xc4\x93\xa1\x3b\xaf\x93\x61\x73\x2f\xa5"
- "\xd3\x58\x4e\x98\x77\xcf\xd2\x12\xa6\xe9\x68\x09\x7b\xb8\x7d\x79"
- "\xd8\x00\x5f\x23\xfb\xde\x35\x3b\x56\x4d\xf0\x9b\x16\x9f\xf5\x5f"
- "\xeb\x77\xa2\xdd\xd9\x64\x24\x16\xbf\xcc\x62\xe4\x4f\x78\x6e\x08"
- "\x7e\x23\x49\x5b\x45\xd4\xdc\xc5\x30\x52\xd9\x7c\x9d\x3c\x09\x7c"
- "\x83\xdf\x03\x0a\xeb\xd9\xf7\x00\xeb\xe6\xd4\x5a\xfc\x26\xd0\xba"
- "\x3c\x4c\x39\xf9\x2a\xac\x57\x59\xff\x43\xda\x07\xfb\xeb\x8e\x86"
- "\x9d\xc5\x35\x61\x98\x34\xef\xcb\x3f\xbe\xb5\x79\x5f\x4e\xf7\xff"
- "\xe3\x37\x32\x1e\xf8\x79\xf7\x75\xa4\x1b\xd0\xef\xba\x51\xf9\x52"
- "\x03\x6f\xa9\x6c\xf8\x08\xe8\x53\x2b\xa3\x0f\xa5\x67\xbc\x59\x79"
- "\x79\x21\xd0\xe5\x12\xa3\x55\x85\x09\xe8\x74\x18\xdb\x18\x1d\xb1"
- "\x07\x68\x0d\x3a\x8f\xb2\xc2\x7c\x96\xc6\xa2\x40\x7a\xed\x6e\x2f"
- "\xf7\x6c\x0f\x78\xb8\x1a\xbf\x35\xb6\x86\xfa\x1b\xda\x72\x47\x86"
- "\x75\x04\x8c\x1c\xd5\xc5\x77\x47\x2d\xd2\x6b\x4d\x2c\xf1\xae\x68"
- "\x38\x45\x28\xcd\x96\x09\x34\x43\xff\xb4\x95\x61\x7d\x2d\xad\x61"
- "\xfe\xdb\x80\x56\x55\x09\x06\xb2\xfd\x3a\x09\xd0\x37\xd6\xe2\x37"
- "\x99\x5e\x2f\x4d\x23\xe4\xa5\x0f\x79\xae\xb2\xec\x0c\xa5\xdf\x5e"
- "\xa0\x9f\x05\xe8\x87\xdf\x22\x6d\xf4\x4b\x04\xfa\xdd\x04\xfa\x5d"
- "\x95\xe8\x67\x6d\x05\xfa\xb5\x02\xfd\x56\x02\xfd\x4c\x8e\xf4\x2b"
- "\xf5\xc1\xef\x95\xf8\x5d\x08\xe9\x87\x3e\xd1\xdc\xca\xb0\x10\xfa"
- "\x9d\x72\x41\x18\xd9\x39\x9f\x78\x3f\x6e\x26\x8a\xb4\xc3\x44\x0d"
- "\xfd\x54\x0f\x81\xf1\x85\xf6\x80\xbf\xeb\x89\xbe\xd4\x4a\x56\xbf"
- "\x46\x06\x20\x3d\x2d\x02\x3d\xf5\x96\x4f\xc9\xcd\xd6\x30\x25\xb4"
- "\x39\x6a\xdb\x4d\x32\x66\xd2\x25\x0d\x39\x3a\xbd\x92\x00\x3d\x0a"
- "\xb8\xad\xcf\x1a\x6e\x7d\x1e\x56\xc4\xf5\x7c\x1e\x1e\xbf\xf4\x7f"
- "\xf3\xf0\x56\xe7\xe1\xf1\xf5\xce\xe7\x61\xc5\x33\xb7\x36\x0f\x2b"
- "\x46\xfd\xdf\x3c\xfc\x25\xcd\xc3\x8a\x50\xc7\x79\x68\x93\x15\xe2"
- "\xa3\x17\xcf\x8b\x5d\x12\xbb\xe4\x0f\x9a\xf9\xab\x12\xa2\x97\x33"
- "\x89\x41\x26\x33\x84\x59\xb9\x70\xe5\x3b\xb0\x9e\x9e\x08\xae\x25"
- "\xfb\x1e\xa8\x55\x72\xaf\x07\xab\xf8\x9c\x3c\x23\x97\xb3\x2d\xe9"
- "\x1d\x90\x7d\x71\xbe\xe6\x82\x5c\x7b\x59\x51\x1b\xf9\x3f\x21\x20"
- "\xf3\xc5\x37\x11\xfc\x9f\xc9\x4b\x91\x31\xb8\xb7\x30\x3f\x8f\x6f"
- "\xc4\xbd\x85\xc7\xc7\xe1\xda\x5f\x75\xac\x4f\x24\xac\xeb\xaf\x07"
- "\x93\xb6\xd7\x23\x95\x7f\x3a\x43\xbc\x7d\x6b\xc9\x24\x8e\xe3\x79"
- "\x5d\x6a\x13\xc8\x5a\xa7\x8a\x74\x33\x9b\x88\x26\xd9\x1b\xea\xd6"
- "\x28\x34\xc9\x6b\xe1\xf8\xd5\x25\x4d\x72\xd6\x79\x38\xbe\x4f\xed"
- "\x1b\x41\x7c\x23\x9f\x37\xa2\xc8\xfa\x41\xa0\x1a\xbf\x29\xee\x0c"
- "\xe2\x1b\xf6\x82\x6c\xbf\xb7\xdd\xac\x5c\x77\x1d\xf8\x23\xe3\x21"
- "\x1e\xbf\x0d\xe2\xb7\xc7\x75\xf1\x30\xc6\x20\x6b\x32\x79\xf0\x2b"
- "\x4f\x9c\x2f\x1b\xf2\xf8\x86\x43\x97\x6b\x95\xf8\x6d\x14\xe7\x90"
- "\x49\x7d\xa5\x24\x13\xde\x05\xfa\x69\xd8\x1e\xc4\xd7\x19\x03\x47"
- "\x46\xaa\x34\x44\xd9\x9a\xa5\x1f\x03\x72\x97\x09\x65\x8a\xf5\x70"
- "\xed\x4f\x70\x8d\x7d\xa7\xfb\x52\xc7\x7b\x55\x79\x23\x6e\x01\xff"
- "\x2a\xae\x29\xf4\x6f\xb5\xc1\x7b\x6e\x60\xba\x40\xa3\x79\xeb\xc8"
- "\x51\x96\xf7\xfd\x0d\x16\x94\xe3\x06\xfb\x1b\xdb\x03\x47\x86\x59"
- "\xb6\x8e\x9c\x38\xe3\x51\xfa\x3d\x1a\xea\x9f\x1c\x8f\xef\xd1\x11"
- "\x30\x64\x18\xd4\x37\xb5\x04\x4c\x18\xd6\x92\x3b\x5e\x77\x3c\xa9"
- "\x44\xc0\x33\xfd\xa7\x2f\xe5\x0b\x78\x96\x0f\xf3\x25\x12\xf0\x2c"
- "\xb2\x33\x9e\xb1\xef\xf7\x56\xc2\x70\xad\x92\x40\x5b\x0d\x38\x5f"
- "\x50\x36\xdc\x03\x63\x81\x73\x01\x79\x9e\xe2\x1b\x60\x9b\x38\x2f"
- "\x70\xce\x20\x86\xd1\x39\xea\x30\x47\x70\x5e\xf4\x31\x12\x35\xce"
- "\x0b\xc4\x38\x9c\x17\xe8\x17\xf3\xce\x4d\x36\x2f\x7c\xeb\x88\x9a"
- "\xce\x0d\x4b\x39\x9d\x1b\xa8\x17\x54\x58\x1c\x70\xcd\x6e\x5e\x6c"
- "\x14\xe7\x85\x88\x6b\xc0\xfb\x16\x9c\x17\x2b\xe5\xf3\xe2\xf5\xb3"
- "\x6a\x42\x31\x2f\xeb\xbf\x7c\x0a\x60\x5e\x54\x69\x8d\xc4\x2a\xe2"
- "\x1a\xcc\x0b\xdc\xb7\x43\x71\xed\x8f\x02\xae\x19\xe1\x3c\xcc\x87"
- "\xc2\x45\x72\x5c\x6b\x6b\xed\x4e\xbe\x38\xe9\x77\x6b\xb8\x76\x92"
- "\xea\x10\x48\x2b\xa4\x1b\xd2\x0b\x69\xf4\xcf\x44\x1f\xc4\x2d\xab"
- "\xda\x05\x6e\x39\xa1\x0f\xf0\x73\x33\xfc\xdf\x89\x46\x7c\xd6\xa7"
- "\xd3\xed\xb1\x0b\x31\x0b\xf1\x0b\x71\x0b\x31\x0c\xe7\x01\x62\x17"
- "\xc5\x2d\xc0\x74\x28\x37\x56\xc6\xd4\x53\x4c\x4b\xbb\x44\xd4\x69"
- "\xe3\xc9\x00\xc4\x30\xbd\xe5\x06\x41\x4c\xa3\xf4\xf3\x93\xe8\x87"
- "\x18\xb6\x3d\x91\x8c\x99\x1c\xab\x21\x88\x5d\x06\x45\xb5\xe5\x68"
- "\xd8\x29\x42\xf5\x81\x8c\x7e\xff\xba\xd3\x1f\xe6\xed\x16\xa2\xca"
- "\xf5\x27\xde\xad\x59\x5f\x1a\x3a\xeb\x02\x5f\x9a\x44\x5d\x00\xe7"
- "\x2c\xce\x5d\x83\x42\x4f\x75\x38\xdd\x03\xcf\xc2\xfc\xd5\x7b\xb3"
- "\xef\xd2\x4f\xa7\x33\xdb\xf8\x69\x96\x5b\x01\xf4\x68\x49\x87\xfe"
- "\xea\x39\xf6\x3d\x1c\x74\xe6\xc0\x47\xd6\xf3\x9b\xaf\x94\xe2\x58"
- "\xe2\xbb\xcd\x7d\x14\x78\x6e\xeb\x68\xf5\x26\x1c\x9f\xad\xa0\x8f"
- "\x6f\x1d\x1d\x2c\xf1\xd7\x57\xcb\x8e\x26\x11\x32\x23\xc9\x5d\xfe"
- "\xfa\x4a\x4b\xfb\xf0\x6d\x64\x3f\xfe\xf5\x48\x15\xf7\x6d\xa4\x27"
- "\xf0\x42\xf0\x52\x6b\x3a\xb9\x99\x13\x19\x95\x66\xe1\x1b\x35\xc9"
- "\xe4\x31\xe8\xd7\xc9\xe3\xa0\x7f\x1f\x4f\x20\x44\x1f\x11\x07\x74"
- "\x7d\xd5\xb0\x8f\x33\xaa\x0c\x8a\xaa\xf2\x9d\x30\xce\x80\xad\x2a"
- "\x7b\x6c\x65\x38\x5a\x45\x73\x00\x98\x73\x22\xb5\xd8\xd6\xd4\x72"
- "\xe2\xab\x99\x80\xfe\x76\xa7\x96\xad\x5a\x43\x70\x0f\xa9\x27\xfc"
- "\x3f\xb6\x6d\xcb\x10\x03\xdc\xdf\x97\xff\x76\xba\x42\x3b\x01\xd6"
- "\x97\xd7\xa7\x2b\xf0\xfb\xff\x47\xa9\xf9\x4a\x0e\xce\x31\x7f\xa2"
- "\x7c\x82\xd7\x37\xb4\xab\xa8\x1c\xc5\x41\x9d\x2a\x53\x3e\xd9\x90"
- "\xe8\x4d\xb0\x3e\xf3\x51\xcb\x27\x58\x7f\x63\xbc\x9a\xfa\x0f\xd0"
- "\xfb\x2c\xf9\x04\xef\xb5\xc2\xf9\xb7\x39\x1f\x92\x9d\x1c\x40\x8e"
- "\x47\x54\xd1\x36\x8e\x47\x7c\x41\xb0\x0d\xe0\x79\xf8\xff\x10\xd9"
- "\x94\x18\x0c\x73\x3c\x1f\xae\x7f\x4d\x36\x5d\x0b\x81\xe3\x65\xf8"
- "\xdd\x24\x4d\x8a\x1a\xc3\xf1\x08\x8e\xf8\xae\xfd\x2d\x0f\xbc\xcb"
- "\xeb\x71\x5f\x62\x2a\xf1\x82\x75\xe2\x8a\xbe\x36\x07\xd6\xba\xaf"
- "\xaa\x71\xdf\x3a\x9f\xf6\x7a\x33\xc7\xbf\x7e\x95\x4b\x7b\xfd\x1a"
- "\x3e\xdb\xca\xbf\xfe\x03\x3e\x7b\x63\xb2\x46\xf0\x51\xcd\xa7\xfe"
- "\x75\x1b\x6e\x86\x12\xec\x2b\x3e\x17\x9f\xb7\x29\x3e\x4c\x78\xe6"
- "\x50\xda\x37\x7c\x26\xb6\x69\xff\x4c\xcc\x09\xaf\x79\x05\x9f\x79"
- "\x6a\x36\x1c\xfd\x80\x1e\x35\x48\x07\x7c\x3e\xc7\x47\x7a\xf2\x69"
- "\x91\x1e\xf4\x9e\xa4\x46\x67\xf7\x6c\x16\xee\xa1\xb1\x58\xf0\x9e"
- "\x76\x56\x9f\xb6\x01\x6b\xdf\x1e\x3c\xff\xab\x48\x1d\xe9\x4c\xc3"
- "\xaf\x5f\x64\x6b\xe1\xd7\xf7\xb3\xb5\x90\xd1\x94\xf2\xca\xeb\x91"
- "\x9e\x40\x37\x35\xae\x9b\xd0\xc6\x8f\xb6\x36\xbe\x8d\xf4\x40\x7a"
- "\x23\xdf\x88\xbc\x84\x7c\x24\xf2\x10\xed\x27\x70\x9d\x3d\xcf\xc0"
- "\xff\xde\xac\x9d\xaf\x9f\x11\xdb\x81\x3e\x10\x91\x8f\x7e\x05\xd7"
- "\x3b\xf3\x51\xad\x9f\xc4\x47\xdf\x7c\x6c\x4e\xe5\x79\xe4\x23\xdd"
- "\xcc\x0c\x6c\x67\xad\xd4\x9f\xe9\x0a\xe4\xb1\x7f\x32\xde\x32\x20"
- "\x9d\x7e\x95\x42\x02\xd8\xfb\x7c\x43\xf3\xe7\xfe\x2a\x45\x17\x80"
- "\x7d\x15\xdf\x03\xfb\x90\xcd\x69\x88\xf8\x1e\x9b\xda\x43\xa1\xdd"
- "\x6b\x44\xb8\xe7\x4d\x6c\x5b\x1c\x03\xa0\x19\x11\xef\x11\xeb\x67"
- "\x73\x61\xd0\xef\xa1\xf4\x1e\xc6\x73\x97\x9d\xf0\xcf\x37\x27\x1d"
- "\x79\xae\x4f\x0a\x01\x41\x16\x64\xa7\x99\xd7\xf1\x39\x57\x59\xdf"
- "\x3e\xb7\xb6\xc3\x33\x80\x06\x4a\x76\xbe\xd6\xd3\x8e\x27\x84\xf6"
- "\xcd\x4e\xda\xaf\x7d\x4a\xd6\x7e\x24\xb4\x9f\x04\xed\xa3\x6c\x36"
- "\x13\xed\x60\xb5\x34\x07\xf6\xaf\x92\x58\xfb\x22\xdf\xf2\x39\xa1"
- "\x25\xda\x64\xf4\xf1\xac\x35\x31\x3c\xad\x5a\x86\xf5\xa8\x6f\x91"
- "\x92\x2b\xe2\x1c\x7c\x8b\xec\x7d\xcf\xf6\xa5\x1a\x05\xbf\xa2\xda"
- "\x53\x58\x07\xf0\xd5\x84\x32\xe6\x1e\x90\xcf\x24\xdf\xa2\x33\x78"
- "\xfd\xac\x2e\xb1\xde\xce\xb7\xa8\x96\xea\xfb\x06\xc5\x69\x6f\xd0"
- "\x25\x95\x50\x2e\x63\xe7\xab\xb4\xf6\xe7\x25\xdf\x3d\x76\x1e\xfd"
- "\xa2\x05\xdb\x6b\xf3\x91\x52\xb4\xbd\x9d\xd6\x88\xf6\x4e\x17\xba"
- "\xaa\x1b\x32\xf0\xc5\x04\x49\x06\xbe\x98\xe0\x5a\x06\x3e\x5d\xd9"
- "\xb5\x0c\x6c\x38\x20\xc9\xc0\xe7\xfb\xb3\x79\x7f\x5e\xc1\xe6\xfd"
- "\x39\x1a\x0f\x39\x1b\xda\xb3\xfc\x79\x9a\x86\xff\xa0\x5f\x09\xf2"
- "\x79\x21\xc8\xb4\xfb\x12\xcb\x95\x7b\x40\x4f\xb6\x2a\x1f\xe2\xd7"
- "\xc1\xd8\x61\x4c\xb5\x75\xc9\xb0\x4e\x5b\x6a\x48\x95\x0a\x65\x60"
- "\xf4\xd1\x3a\x37\xb0\xaa\xd9\x4c\x60\x9d\xcb\x61\xe3\x72\xe6\x51"
- "\xa0\x85\x87\xde\x6c\x26\xb4\x1e\x5c\x83\x75\xad\x01\x65\xe0\x43"
- "\x5c\xb9\xb2\x10\xc6\x14\x7e\x2a\x53\x40\x84\xd1\x5e\x46\x6e\xcd"
- "\x3a\x13\xe9\x5c\x36\x3e\x5b\x67\xc9\xb2\x97\x8d\xcf\xbc\x8f\xb2"
- "\x31\xda\xc8\x51\x0e\xe0\x98\x4c\x6c\x00\xf9\xd8\x88\x72\x32\xca"
- "\xc6\x9c\x4c\x36\xae\x9b\xd7\xb5\x6c\x7c\xe6\xe4\xff\xc9\xc6\x3f"
- "\x55\x36\x76\xa5\xf3\xd7\x3d\x7e\x6b\xb2\x71\xdd\xd0\xff\x93\x8d"
- "\xef\x96\x6c\x5c\x17\x2c\xca\xc6\x5c\x46\xbf\x5f\x17\x6c\x81\xf9"
- "\x6a\x93\x8d\xcf\x5a\x3a\xcb\xc6\xe7\xd4\x9d\x65\xe3\x33\x71\x92"
- "\x6c\x7c\xc6\x47\x2e\x1b\x37\x0c\xee\x2c\x1b\x9f\x9b\xed\x4a\x36"
- "\x06\x5c\x6a\x46\xd9\x18\x79\x0a\xe5\x64\x94\x8f\x39\x90\x8f\x19"
- "\x7f\x9d\xdb\x78\x6b\xb2\xf1\xb9\x0d\x3d\x93\x8d\xcf\x5d\x75\x2e"
- "\x1b\x9f\xae\x70\x2d\x1b\x9f\xae\x70\x2e\x1b\x1b\x36\x4a\x32\x8d"
- "\xe1\xb5\x5f\xbe\x6c\x7c\xde\xe2\x5c\x7e\x31\x78\x32\xd9\xf8\x5c"
- "\xf3\xed\x97\x8d\xcf\x35\x3b\x97\x8d\x0d\xab\x98\x1c\x71\xce\xd8"
- "\x59\x36\x86\x7b\x9c\xca\xc6\x86\x3d\xc2\x3d\xcd\x72\xd9\x98\xb5"
- "\x01\x6b\xe2\x31\xd7\xb2\xf1\x85\x68\xb6\x46\x5e\x18\xc1\xd6\x48"
- "\x46\xd3\xce\xb2\xf1\x85\x7b\xbb\x97\x8d\x19\x0f\xd1\x7e\xba\x94"
- "\x8d\x2f\xcc\xe8\x2c\x1b\x9f\xae\x70\x2e\x1b\x5f\x7c\x5c\xe2\xa3"
- "\xfa\x4a\xb9\x6c\x7c\x61\xc7\x3f\x87\x6c\xec\x8a\xb7\xce\x5b\xe4"
- "\xb2\x71\xfd\x62\xf7\x65\xe3\xfa\xf7\xdc\x93\x8d\x91\xe7\x9c\xc9"
- "\xc6\xf5\x57\x1d\x79\x4e\x2e\x1b\x5f\xec\xe5\x5c\x36\xbe\x38\x50"
- "\x2e\x1b\x63\xfb\xce\x64\xe3\x8b\x93\x65\xed\x77\x92\x8d\x2f\xc6"
- "\xca\x65\x63\x56\x4f\x92\x8d\x1b\xd4\x82\xad\x61\x85\xfb\xb2\xf1"
- "\xc5\x1f\xbb\x96\x8d\x2f\xb6\xc9\x65\xe3\x8b\x15\x4c\x06\x6e\x08"
- "\x65\xb2\xf1\x45\x03\x3b\x7f\x3a\xc1\xfe\xbc\x24\x1b\xb3\xf3\x9d"
- "\x65\xe3\x86\x31\xdd\xc8\xc6\xe1\x3d\x97\x8d\x7f\x98\x54\x6e\x93"
- "\x8d\x7f\x98\x24\xca\xc6\x98\xe3\xa7\x00\xe4\xcd\x02\x2a\x1f\x1f"
- "\x27\xc7\x17\xd2\x35\xe7\x6a\xd7\xf2\x71\x73\x8a\x24\x1f\x37\x55"
- "\xb2\xb9\xdf\xf4\x31\x9b\xfb\x4d\xcb\x6c\x36\x62\x90\x8d\x51\x46"
- "\x16\x6c\xc4\x35\x1b\xe0\xb7\x2f\xb9\x9c\xca\xc7\xe8\xbf\x8e\x32"
- "\x32\xca\xc7\x28\x27\xa3\xec\x5b\x99\x49\x48\x95\xd1\x8c\x3e\x1d"
- "\xd5\xba\x01\x38\xae\x4d\xb3\x41\xae\x36\xc0\xda\x56\x0d\xf7\x1a"
- "\xf6\x5d\x37\xe3\x5e\x88\xba\xec\x7a\xb8\xc7\xc0\xee\x81\xeb\xb5"
- "\x78\x0f\xd4\xa9\x63\xb4\xb8\xb2\x9f\xad\x9f\xa2\x7c\x7d\xe9\x2d"
- "\x99\x7c\xcd\xea\xd6\x88\xf2\xf5\x0e\xe8\x03\xfc\x54\x28\x5b\xa3"
- "\x8c\x0d\xb2\x75\xc5\x8e\x3c\xbe\xbc\x30\x88\x2f\x6b\xcd\xba\x74"
- "\x40\x94\xb1\x37\xc2\xb9\x6c\x38\x07\xfd\xa8\x2e\x2b\x22\xe4\xe0"
- "\x75\x1d\xca\x0e\x86\x1d\x97\x89\x0a\x68\x56\xbb\x0e\x9e\x8f\xf7"
- "\xc3\x3d\x46\xf1\x1e\x58\xdf\x2b\x98\x4c\x7e\x25\x89\x93\xd9\xab"
- "\x2f\x8f\xb5\xc9\xe4\x30\x4e\x68\x0f\xc7\xdc\x59\x54\x2e\x1f\xec"
- "\x6f\xb4\x88\x72\x79\xa0\xbd\x5c\xfe\x5d\x9b\x28\x97\xe3\x1e\x24"
- "\x9b\x5c\x9e\x20\xca\xe5\x97\x63\x6f\x51\x2e\xaf\xf9\xa5\xc8\xe5"
- "\x3e\x0a\x85\xca\x27\x8a\xc9\xe5\x05\x89\xb7\x47\x2e\x47\x99\x1c"
- "\xe5\x70\x94\xc9\x51\x46\x47\xb9\x1c\x65\x74\x4e\x90\xcb\x0b\xed"
- "\xe4\x72\xce\x4e\x2e\xe7\x64\x72\xf9\x77\x47\x6f\x4d\x2e\xff\xae"
- "\xec\x36\xc8\xe5\x77\x95\x3e\x77\x43\x2e\x0f\x73\x90\xcb\x51\x0e"
- "\x87\xb9\xd7\x80\xf2\xb9\x5e\x07\x63\xf3\xff\xd8\xfb\xfe\xb8\x28"
- "\xea\xfc\xff\x37\xb3\x90\x68\x28\x0b\x2d\x86\x9d\xda\x26\xbb\xb5"
- "\x76\x58\x54\xea\x69\x69\x61\x91\xe9\x9d\x0a\x74\x5a\x58\x9a\x68"
- "\xa0\x68\xa8\xa8\x68\xf8\x03\x44\xd3\x52\x03\x44\x03\xd3\x02\xc5"
- "\x4e\x3b\xbc\xd3\xa2\x3e\x76\xe1\xa5\xb9\x5e\x7a\x87\x1d\xbf\xec"
- "\xec\x8e\x3a\xbd\x56\x0f\x3d\x24\xd4\x15\x51\x16\xd8\xdd\xf9\xbe"
- "\xde\xf3\x9e\x75\x66\x76\x67\x96\x9d\x59\x24\xec\xeb\x1f\xfb\x10"
- "\x67\xde\xf3\x9e\x79\xbf\x9e\xcf\xf7\xfb\xfd\x7c\xbe\xe7\x3d\xef"
- "\xf7\x02\xd0\xe8\xa0\xcf\xdb\xd7\xe6\xff\x2b\xe1\x6b\xf3\xed\xc1"
- "\x7c\x6d\x7e\x61\xab\xab\x36\xbf\xb0\x97\xa7\xcd\xcb\x4d\x3e\xe7"
- "\x11\xd3\xee\x43\xfd\x36\xce\xc0\xba\xfb\x5c\xb2\x50\x9b\x5f\xb6"
- "\xb9\x6a\xf3\x0b\x2d\xa2\xda\x9c\xf8\x6f\xa1\x36\x0f\x79\x42\x63"
- "\xbd\xa1\xcd\xeb\x07\x2a\xd3\xe6\xf5\x06\xce\x3b\x9c\x1b\x46\xfa"
- "\x97\x0b\x65\x52\x7a\xbd\x59\xcd\xd7\xeb\xf5\x85\x9c\x5e\x4f\xe5"
- "\xe9\xf5\xda\x06\x69\xbd\x5e\xcb\xe8\x43\xbb\x3a\x2e\x05\xe7\x85"
- "\x75\x16\xb4\x95\xb5\xda\x85\x58\x6b\x35\x8c\xc7\x5a\x0b\xda\xa7"
- "\x5a\x3c\x2f\x1a\xfe\xdf\xc7\xa1\xdb\x19\x7f\x89\xb5\xfb\xb2\xae"
- "\xa8\xaf\x7e\x2c\x15\xd7\x57\x3f\x1e\xc3\x3a\x86\x7c\x73\x5a\x5f"
- "\x00\x31\xa9\xed\x58\xfd\x5e\x5f\x20\xae\xdf\x1b\x86\x13\xad\x53"
- "\x5f\x84\x71\x11\xea\x77\xb8\x46\x54\xbf\x37\xcc\x65\xaf\x29\x10"
- "\xea\x77\x92\x07\xf4\xd9\xeb\xa5\xf5\xfb\x45\x3d\xe9\xc3\x1b\xae"
- "\x91\x3e\x9c\x60\xec\xaa\xdf\x1b\x2a\xf8\xfa\x1d\xe3\xef\xaa\xdf"
- "\x09\xa7\x98\xe7\x94\xd4\xef\x17\x43\x5c\xf5\x7b\x6d\x03\xd6\xef"
- "\x56\x1e\xaf\x0a\x30\xaf\x66\x60\x5e\x5d\xf6\xc3\xbc\xc2\xfd\xa4"
- "\x76\x26\xe6\xd5\xa5\xdd\x16\xbb\x43\xc7\x6f\xc0\xf9\x25\x3a\xeb"
- "\x78\xdc\x5e\xb8\xe3\x59\xca\x42\xd4\x1f\x73\x0d\xf3\xcc\x81\x1b"
- "\x4e\x8f\xf9\x76\x73\xb9\x76\x49\x27\xce\xb5\x4b\x8f\x30\x38\xb3"
- "\x5c\xc3\xe3\x89\x44\xd7\xe3\xf2\x5d\x7a\x56\x9e\xae\x67\xae\x59"
- "\x2a\x4f\xd7\x63\x2e\x8a\xe9\xfa\x4b\xc7\x9c\xb9\x28\xd4\xf5\x97"
- "\xce\x88\xeb\xfa\x4b\x2d\x42\x5d\x8f\xf3\x17\xd3\xf5\x97\xf5\x82"
- "\xfc\x5d\x74\xfd\xe5\x51\x42\x5d\x4f\xd2\x71\xba\xfe\x72\x1d\x3b"
- "\x4e\xb2\x49\xbe\xae\xbf\x7c\x9c\x6d\xdf\x89\xae\x3f\xeb\xac\xeb"
- "\x2f\x9f\x10\xea\xfa\xcb\xbb\x48\xfb\x7a\xd9\x6a\x61\x74\xfd\xe5"
- "\x52\x72\xbc\x36\x97\x7f\x9c\xd3\xf5\xe4\xb8\x85\xaf\xeb\x8d\x58"
- "\xd7\x9b\x35\xed\xe8\xfa\x18\xcf\x75\x7d\x5b\x1e\xa7\xeb\xdb\xf2"
- "\xdc\xeb\x7a\xf3\x31\xf7\xba\xde\x52\xcd\xe9\xfa\xe6\xfb\x48\x9b"
- "\xd0\xec\x47\xda\x84\xeb\x8c\x06\x82\x7a\xc5\x8d\x7b\x2f\x60\xe6"
- "\x58\x97\x7d\xd4\x58\x46\x7d\xbc\x90\x1d\xf7\xbe\x0e\x9a\x7e\x09"
- "\xe8\xf3\x26\xa2\xcf\xa1\xcd\x3c\x8a\x75\x3d\xd6\xdf\x44\xd3\x5f"
- "\xff\x04\x8e\x99\x20\xe6\x47\x21\x2f\xd3\xde\x65\x46\x0a\xcf\xad"
- "\xc2\x69\xa1\xbe\xd7\x64\x41\x3f\x02\xc7\x6b\x20\x8d\x11\x5f\x03"
- "\xc7\x4e\x1a\x17\x32\xd7\x15\x62\xed\x0f\xd7\x19\xe1\xfc\x29\xa7"
- "\xeb\xaa\xf1\x75\x95\x69\x8c\xb6\xaf\x26\xd8\x5d\xb3\xc1\xf1\x72"
- "\xce\x07\x5c\xd9\xc4\xf8\x80\x26\xd6\x07\x40\x5a\xc8\xab\x8c\xf1"
- "\x01\x33\xc0\x07\xc0\x73\xc3\x8f\xef\x03\x0e\x82\x0f\x28\x05\xdf"
- "\xb2\xbf\xf9\xcd\x2b\x47\x79\x3e\xa0\x14\xeb\x7e\xec\x01\xb0\xf6"
- "\x87\x7e\x6d\x3f\xf6\x05\x87\x5a\x4d\x14\x60\x7c\x12\x7c\x40\x0d"
- "\xbe\x9e\xbb\xb6\x11\xf1\xaf\xc5\xe9\xe1\x19\x8d\x8c\x87\x00\x3d"
- "\x07\xcf\x70\xaa\xf0\x2c\xe3\x21\xca\xe1\xda\x6a\xe2\x21\x1a\x07"
- "\xf3\x3c\xc4\x41\xe2\x21\xae\x1d\x14\x8e\xeb\x37\xae\x92\xef\x21"
- "\x9a\x46\xba\x1f\xdb\x6f\xdc\x27\xc7\x43\x40\xb9\xcb\x1c\x3a\xd5"
- "\x65\x1e\x1f\x9e\x67\x0e\x5a\x15\xeb\x52\xb7\xf3\xc1\x58\xcd\x8a"
- "\x35\x2a\xd6\xa7\x58\xa7\x7a\xa4\x51\xe1\xf9\xcb\x2d\x1d\x38\xb6"
- "\x7f\x07\x78\x88\x25\xd2\x1e\xc2\xe1\x1f\x98\x31\x7d\xd6\x43\x40"
- "\x1d\x63\x3c\x44\xc1\x6a\x9e\x87\xb8\x83\xe7\x21\x7c\xf8\x1e\xa2"
- "\xa9\xbb\x32\x0f\xd1\xe4\xdf\x01\x1e\xa2\xec\xb6\x87\x50\xea\x21"
- "\xae\x36\xdd\xf0\x10\x14\x3b\xbe\x1f\xec\xf0\x10\xd7\x4e\xb9\x7a"
- "\x88\x6b\x66\x9e\x87\x38\x68\xf2\x69\x8c\x62\xf4\x39\xe3\x1f\xae"
- "\xa4\x0a\xfd\x83\xf5\x59\x57\xff\x70\x7d\xb8\x32\xff\x70\x7d\xb6"
- "\x32\xff\x70\x3d\x89\x3c\x1f\x7e\x37\x79\x25\x8a\xf4\x63\xd7\xfd"
- "\x39\x4f\x71\x25\x80\x7f\xac\x7d\x4f\x71\xfd\x8a\xb8\xa7\x30\x1f"
- "\x95\xf6\x14\xe6\xa3\xd2\x9e\xc2\xb2\x13\x6b\x3f\xec\x1f\x20\x7f"
- "\xd0\x7e\x96\xb9\xfc\x77\x01\x59\xed\xe8\x3c\x67\x3f\x91\x32\x83"
- "\xf8\x8f\x9b\xaf\xf3\x2c\x01\xe2\x3a\xcf\xd2\x07\x6b\x28\x2b\xa3"
- "\xf3\xae\x9b\x0b\x3a\xdc\x53\x5c\x37\x8b\x7b\x0a\x4b\x36\xd1\x59"
- "\xd7\x9b\x5c\x3d\x05\x5c\x23\xea\x29\x2c\x47\xd8\x6b\xcc\x42\x4f"
- "\x41\xf2\x00\xbd\x70\x5a\xda\x53\xb4\x2c\x25\xfa\xa1\x65\x2c\xd1"
- "\x0f\x04\x63\x57\x4f\xd1\xc2\x1f\xff\x95\xf0\x14\x84\x53\xcc\x73"
- "\x4a\x7a\x8a\x96\xd9\xae\x9e\xc2\x7c\x14\x7b\x0a\x71\x5e\xb5\x8d"
- "\x17\xf2\xaa\xf5\xa2\xd0\x53\xb4\x1c\x70\xf6\x14\xb7\x20\xd7\x02"
- "\xb8\xf7\x03\xb8\x4c\xad\xd9\xf2\x7d\x44\xeb\x11\x79\x3e\x02\xf3"
- "\x4f\xcc\x47\xb4\xf5\x74\xe6\x9f\xd0\x47\xb4\x0d\x14\xf7\x11\x6d"
- "\xa3\x84\x3e\x02\xe7\x2f\xe6\x23\xda\xe6\x0a\xf2\x77\xf1\x11\x6d"
- "\xeb\x85\x3e\x82\xa4\xe3\x7c\x84\x35\x82\xb4\xc9\xe6\xd9\xf2\x7d"
- "\x84\x35\xc8\xbd\x8f\xb0\xf6\x11\xfa\x88\xb6\x06\xd2\xa6\x5a\xa3"
- "\x88\x8f\x80\x32\x30\xc7\xcd\x49\xfc\xe3\x9c\x8f\x20\xc7\x5d\x7d"
- "\x84\x75\x4a\x3b\x3e\x22\xc0\xba\x2b\xd8\xd4\xaa\x0b\x36\xb7\x69"
- "\x46\xab\x7f\x59\xfb\x94\xed\xc6\x9e\x01\xf1\xa0\x15\x4e\x81\x76"
- "\x98\x8e\x28\xfc\xdd\x7d\xc6\x09\xd0\x04\xd3\xc9\x7c\x7f\xac\x0b"
- "\x3e\x5a\x82\x75\x9c\xd1\x0f\xaf\x71\xd8\x9a\x37\xa0\xda\x1a\xde"
- "\x1b\x61\x7d\xd0\xb2\x2b\xd8\x68\xc9\x1b\x6a\x68\xc1\x73\xfd\x93"
- "\x11\x35\xad\x41\x5c\xdb\x2d\x3f\x45\xdb\x81\xf3\xfe\xd1\x53\x88"
- "\xae\xab\x48\x3a\xc7\xf0\x18\x6b\x06\xfc\x3d\x46\x55\x53\x0d\xa3"
- "\x21\x02\xe2\x23\x51\x41\x06\xd2\xf4\x6c\x40\xea\x9e\x3e\x3e\x77"
- "\xfc\xfa\x5b\x84\x6c\xa0\x1f\x9e\x1d\x48\xdb\x7f\x99\x10\x89\xd7"
- "\xd9\xe9\x45\x34\x44\xa9\x9f\x95\xd5\x10\x6f\x5f\x47\xe1\x85\x78"
- "\x7c\xb8\x82\xd3\x0e\x2d\x0e\x6d\xc7\xd3\x0d\x53\x2f\xaa\x51\xe1"
- "\x6a\xe1\x5c\xff\xb6\x4d\x9c\x6e\xc0\x9a\x81\x9e\x06\xda\xce\x42"
- "\xe6\x6b\x2c\x8b\x25\x73\xfd\xc3\x6b\x11\xb5\xe3\x15\xe4\x5f\x1e"
- "\x7f\x16\x8f\xfd\x84\x96\xd7\xee\x46\x4b\xc7\xa2\xfe\x56\xac\x13"
- "\x40\xeb\x95\xd7\xe6\x23\xbc\x86\x60\x01\x68\x85\xad\xd7\xd1\x08"
- "\xdc\x1f\x8f\x9b\x4e\xf4\x02\xe9\x8b\x6d\xd7\x8e\x19\x8e\x21\xf9"
- "\x5a\xcf\xc6\xac\x1f\x20\xf9\xad\xed\x2e\xd0\xf5\xba\x60\xa3\x0d"
- "\xb0\x24\x6b\x47\x3e\x11\x63\xff\xe0\xf9\x88\x8f\x80\x87\x7f\x3c"
- "\x5b\xe7\x83\xd7\xc1\xc6\x7b\x42\xda\xf7\xf6\x46\x02\x6c\xda\x58"
- "\x6c\xda\x08\x36\x18\x97\x57\x52\x10\x5e\x73\xb0\x17\xc6\xa4\xca"
- "\x52\x83\xec\xcb\x1d\xfb\x42\x46\xa0\xed\x76\x82\x87\xad\x2d\xa9"
- "\xbb\x1d\x62\x8f\xd7\xd6\x02\x3e\x30\x1a\x2e\x0b\xef\x15\xb9\xca"
- "\xa7\x27\xd6\x70\xc0\xef\x1e\x3b\x5a\x01\x87\x33\x04\x07\x7a\xb5"
- "\x9a\xf9\xd7\xba\xdc\xa0\x85\xbc\x07\xb4\xb5\x01\x16\x16\x67\x2c"
- "\x3e\x5f\x87\xf7\x94\xc4\xeb\xde\x59\x37\x91\xb5\xfd\x18\x2c\x96"
- "\x1b\xfa\xe2\x75\x31\x98\xef\x65\xda\x0c\xb8\xbd\x54\x6f\x3f\x8f"
- "\xbf\xf3\x21\x18\xd8\xd8\xd8\xe3\xfd\x25\x71\xbc\xb1\x3e\xab\x02"
- "\x5d\xc6\x7c\xbf\xf2\xa6\x35\xa5\x6d\x77\xb0\x11\xcf\xa5\xb9\xe4"
- "\x43\x2b\x9c\xff\x4b\xa7\xfc\xf4\xb1\xd7\xde\x82\xb1\xb7\x8f\xb8"
- "\x11\x7b\x0a\x5d\x54\x14\x7b\x0a\x35\xfc\xf4\xb1\x57\xdf\x82\xb1"
- "\xa7\x4b\xb9\xd8\x53\xca\xf4\x3f\x45\x25\xb9\x8b\x3d\x1e\x87\x72"
- "\x8c\x41\x39\xc6\x9f\x70\x1f\xc7\x78\x15\xaa\x87\xf6\xc6\x7c\x4b"
- "\xf8\x9b\x3f\xdf\xf2\xef\x47\xf1\xf7\xe7\xec\x7c\x4b\x4a\x35\xd2"
- "\xed\xb8\x13\xd5\x2d\xe9\xc6\xb8\x13\xe5\x77\x9c\xd1\x8d\x94\xdf"
- "\x3e\x46\x37\x52\x7e\xcc\x9c\x86\xf4\xd3\x88\xb2\xde\x1f\xa2\xfe"
- "\x68\x9e\x91\xc2\xdf\x1e\x7d\x74\xc9\x42\x65\x35\x82\x0e\xa4\xee"
- "\xa5\xf1\x38\x50\xf6\x42\xf0\x1b\xd0\x37\xa7\xcc\x44\xf7\xd6\x53"
- "\xbe\xe7\xf0\x5a\x62\x5f\x5e\x32\x52\xb9\x38\xcd\x80\xe7\x23\xf6"
- "\xde\x63\xf6\xc1\x7d\xdb\x47\xf3\x2c\x94\x83\x2f\x8e\x6f\x0c\x21"
- "\x86\x66\x5b\xc8\x68\xf5\xd5\xdd\xc1\x26\xc7\x9c\x48\xeb\xbe\xde"
- "\x48\x94\x43\xf8\xdb\x45\xe0\x11\xe6\x0c\xfe\xd6\xd0\xc1\x27\xcc"
- "\xa3\x4a\x4b\x1d\xc2\x7b\xe5\x04\xd6\x21\x35\x0d\x1c\x7a\x79\x0f"
- "\xe0\xcb\xe7\x51\xae\x04\x8f\xb6\x09\x79\x74\x95\xe5\x11\xf0\x89"
- "\xe3\x11\xf7\xdd\x61\x80\x2c\x1e\x35\xb0\x3c\xda\xe4\xc4\xa3\x8b"
- "\x5a\xf4\xf7\x53\xa7\x09\x8f\x36\xf8\x0c\xb6\xea\x1d\x3c\xf2\xfd"
- "\xe4\xd8\x14\xe0\xd1\x14\xb9\x3c\xf2\x2d\x11\x78\x5b\xaa\x47\x85"
- "\x8b\xb7\xa5\xfc\x42\x9c\xbd\xad\xc3\xcb\x5e\x0d\x79\x42\x7d\x35"
- "\xff\x09\x4d\x53\x08\xeb\x67\x29\xbf\xe1\xca\xf8\xec\x37\xcc\xa3"
- "\xb9\x6a\x94\xdf\x36\xe7\xb9\x6a\x7f\xc4\x3e\x95\x52\x45\x62\xae"
- "\x89\xfa\x54\xf6\x9c\xcb\x1c\x23\xaa\xdb\xf0\x1b\x73\x8c\xa8\x6e"
- "\x7e\x5d\x7e\xae\x1a\x75\x47\xb1\xa8\x5f\xa0\xee\xf8\x84\x99\xab"
- "\x46\xf9\x6d\xed\xf0\xb9\x6a\x90\xa7\xa8\x2f\xa5\xba\x91\xf1\x7f"
- "\xca\xaf\xc0\x65\xae\x1a\xbe\x46\xcc\x97\x52\xdd\x26\xb3\xd7\x6c"
- "\x15\xf8\x52\x36\x0f\x68\x4f\x16\x4b\xfa\x52\xca\x3f\x88\xb4\x2f"
- "\xdd\xce\x90\xf6\x85\x60\xea\xe2\x4b\xa9\x6e\x07\xf8\xbe\x54\x74"
- "\xae\x1a\xcb\x21\xe6\x39\xa5\x7c\x29\xe5\xef\xe3\xe2\x4b\x29\xd5"
- "\x08\xd1\xb9\x6a\x54\xf7\xef\x38\x1e\x75\x5f\x2a\x98\xab\x46\xf9"
- "\x8f\xbd\x25\xe6\xaa\x49\x73\xab\x58\x30\x57\x8d\xea\xde\x47\xf6"
- "\x5c\x35\xaa\xfb\x78\x59\x5e\x94\xe1\x9c\x88\x17\xa5\xba\x6f\x73"
- "\xe6\x9c\xc0\x8b\x52\xdd\x3f\x13\xf5\xa2\x54\xf7\x0a\x81\x17\x65"
- "\xf2\x17\xf1\xa2\x54\xf7\x16\x41\xfe\xce\x5e\x94\xea\x11\x22\xf0"
- "\xa2\x6c\xba\x1b\x5e\x94\xea\x41\x7c\x1f\x45\x9d\x93\xed\x45\xa9"
- "\x1e\xdb\x70\x9a\x7d\xef\x91\x77\x46\x02\x1f\x4a\xf5\xd8\x29\xf0"
- "\xa1\x54\x0f\x32\x1f\x8d\xea\x51\xce\xcc\x53\xa3\x7a\xac\x23\xc7"
- "\xa9\x5a\xfe\xf1\x1b\x3e\x94\x3d\x8e\xe7\xa9\x31\xf3\xd3\x36\xf4"
- "\x38\x25\xcf\x7f\x3e\xdc\x05\xfd\x67\x84\x1b\xff\x19\x71\x6b\xfa"
- "\x4f\x2a\x60\xb1\x22\xff\x49\x05\x48\xae\xff\x7d\xdb\x03\xb9\xd1"
- "\xe1\x1b\x7a\x98\x39\x1d\xde\xf3\x8a\x32\xdd\xd2\xd3\xfc\xd3\xc7"
- "\xfe\x16\xf4\x40\x1b\x02\x0e\x72\xb1\x0f\x9c\xab\x2c\xf6\x81\xc9"
- "\xca\x3d\xd0\xdd\x3a\xce\x03\xdd\xad\x93\xf6\x40\xea\x51\xee\x3d"
- "\x90\x26\x99\xf3\x40\xc1\x64\x4e\x2d\x15\x4c\xe6\xd4\x52\xc1\x0b"
- "\xe4\x7b\xa0\xa0\x0b\xb7\x3d\x90\x1c\x0f\xd4\x6b\x18\xe7\x81\x82"
- "\x3e\x53\xe6\x81\x82\xf6\x0b\x3d\xd0\xdd\x27\x5c\x3d\x50\x70\x1f"
- "\xcf\x3d\x50\xf0\x48\x65\x7c\x0e\x1e\xe1\x99\x07\x0a\x2e\x14\xf7"
- "\x40\xea\x28\x69\x0f\x44\xce\xb9\x6a\x57\xcd\x48\x4e\xbb\x6a\xba"
- "\x77\x7d\x0f\x74\xd7\x5e\x71\x9d\x7a\xd7\x67\xc4\x03\x05\x17\x74"
- "\xbc\x07\x0a\x16\x9f\xef\x47\x69\x06\x12\xbd\x18\x5c\xe4\xea\x81"
- "\x82\xc5\xe7\xfb\x51\x9a\xa9\xec\x35\xc2\xf9\x7e\x6c\x1e\xd0\x9e"
- "\x2c\x95\xf6\x40\x21\x21\xa4\x7d\xd1\x90\x75\x5d\x58\x4c\x5d\x3d"
- "\x90\xe6\x50\xfb\x1e\x88\x70\x88\x79\x4e\x49\x0f\x14\xe2\xe7\xea"
- "\x81\xd4\x91\xe2\x1e\xa8\xf7\x69\x8e\x47\xbd\xd3\x85\x1e\x28\x64"
- "\xfc\xad\xe1\x81\x24\xb9\xb5\x57\xe8\x81\x7a\xf7\x93\xef\x81\x7a"
- "\xc7\xca\xf3\x40\xc1\xe2\xf3\xfa\xa8\xde\x85\xce\x9c\x13\x7a\xa0"
- "\xde\x07\xc4\x3d\x50\xef\x13\x42\x0f\x14\x2c\x3e\xaf\x8f\xea\x6d"
- "\x13\xe4\xef\xe2\x81\xee\xee\x23\xf4\x40\x24\x1d\xe7\x81\xee\x3e"
- "\x48\xda\xd0\xc0\x0b\xf2\x3d\xd0\xdd\x85\xd2\x1e\xe8\xee\xdd\x42"
- "\x0f\x74\x77\x1a\xf1\x3a\x77\x57\x13\x0f\x74\x77\x16\x39\x0e\x3d"
- "\x18\xef\x38\xe7\x81\xc8\x71\xce\x03\xdd\x6d\x92\xe7\x81\xee\xed"
- "\x82\x1e\x48\xeb\xc6\x03\x69\x6f\x51\x0f\xd4\x67\xa9\x32\x0f\xd4"
- "\x27\xed\xb6\x0e\x57\xa2\xc3\xef\x6e\xe2\x74\xf8\x3d\xd7\x94\xe9"
- "\x96\x7b\xdc\xbe\xff\x74\xaf\xc3\x07\xec\xe5\x74\xf8\x80\xbd\xd2"
- "\x3a\xfc\x17\xee\xd7\x3f\xa3\xee\x6d\xe2\x74\x78\xff\x49\xa4\x9f"
- "\xec\x3f\x9c\xf4\x93\xfd\x5a\xe4\xeb\xf0\x7e\x0b\x6e\xeb\x70\x39"
- "\x3a\xbc\x8f\x91\xd3\xe1\xfd\x46\x2a\xd3\xe1\xfd\x46\x08\x75\x78"
- "\xd8\x64\x57\x1d\xde\x6f\xa7\xe7\x3a\xbc\xdf\x31\x65\x7c\xee\x77"
- "\xd4\x33\x1d\xde\x5f\x2f\xae\xc3\x7f\x51\x2e\xad\xc3\xc9\x39\x57"
- "\xfd\x74\xef\x31\x4e\x3f\xdd\xbb\xa9\xeb\xeb\xf0\x7b\x07\x8b\x6b"
- "\xa5\x7b\x47\x12\x1d\xde\x5f\xd7\xf1\x3a\xbc\xbf\x4e\x5c\x87\xdf"
- "\xfb\x09\xd1\x2c\xfd\x0d\xae\x3a\x1c\xae\x11\xd5\xe1\xf7\x9e\x63"
- "\xaf\xd1\x09\x75\x38\xc9\xe3\x2c\xa5\xf5\x91\xd6\xe1\xda\x42\xd2"
- "\xbe\x68\xe7\x92\xf6\x85\x60\xea\xaa\xc3\xb5\xcf\xb6\xaf\xc3\x09"
- "\x87\x98\xe7\x94\xd4\xe1\xda\x6c\x57\x1d\xfe\x0b\xf1\x35\xa5\xa8"
- "\x01\x89\x1c\x8f\x06\xf8\x09\x75\xb8\xf6\xdb\x5b\x43\x87\x4b\x72"
- "\x6b\xb0\x50\x87\xdf\xb7\x5b\xbe\x0e\xbf\xef\x3b\x79\x3a\x1c\x73"
- "\x4e\x4c\x87\x0f\xd0\x3b\x73\x4e\xa8\xc3\x07\x8c\x12\xd7\xe1\x03"
- "\x26\x0b\x75\x38\xce\x5f\x4c\x87\x0f\x58\x2b\xc8\xdf\x45\x87\x0f"
- "\xd8\x29\xd4\xe1\x24\x1d\xa7\xc3\xc3\xa2\x48\x1b\xfa\x0b\xf9\x6b"
- "\x4a\x51\x61\x7a\x69\x1d\x1e\x36\x48\xa8\xc3\xc3\x10\xd1\xdb\x61"
- "\x71\x44\x87\x87\x69\xc8\xf1\x5f\xa4\xf0\x8f\x73\x3a\xfc\x17\x29"
- "\x42\x1d\x1e\x96\x24\x4f\x87\x07\x76\x41\x1d\xae\x76\xa3\xc3\xd5"
- "\xb7\xa8\x0e\xd7\xfb\x28\xd3\xe1\x7a\xa4\x5c\x0b\x86\x97\x72\x5a"
- "\x30\xbc\x54\x5a\x0b\xea\xbf\x75\xaf\x05\x1f\x44\x9c\x16\x34\x4c"
- "\x27\x6d\xb5\xe1\x59\xd2\x56\x1b\xfc\xe4\x6b\xc1\x07\xd2\x6f\x6b"
- "\x41\x39\x5a\x30\x6c\x05\xa7\x05\x1f\x18\xab\x4c\x0b\x3e\x30\x46"
- "\xa8\x05\x07\x25\xba\x6a\xc1\x07\xf6\x79\xae\x05\x1f\x38\xa1\x4c"
- "\x0b\x3e\x50\xed\x99\x16\x34\x3c\x22\xae\x05\xf5\x35\xd2\x5a\x90"
- "\x9c\x73\xed\xc3\x07\x9e\xe0\xfa\xf0\x81\x85\x5d\x5f\x0b\x0e\x8c"
- "\x14\xef\xaf\x07\x8e\x25\x5a\xd0\x10\xd1\xf1\x5a\xd0\x10\x21\xae"
- "\x05\x07\x1e\x22\xfd\xa6\x61\xb0\xab\x16\x84\x6b\x44\xb5\xe0\xc0"
- "\x2b\xec\x35\x11\x42\x2d\x48\xf2\x80\xf6\xa4\xa7\xb4\x16\x7c\x70"
- "\x0f\x69\x5f\x1e\x5c\x4a\xda\x17\x82\xa9\xab\x16\x7c\x30\xb6\x7d"
- "\x2d\x48\x38\xc4\x3c\xa7\xa4\x16\x7c\x70\x9b\xab\x16\xd4\x9f\x14"
- "\xd7\x82\xe1\xdc\x3a\xb5\x54\x78\x90\x50\x0b\x3e\x78\xe6\xd6\xd0"
- "\x82\x92\xdc\x8a\x14\x6a\xc1\x5f\x7e\x22\x5f\x0b\xfe\xf2\x9c\x3c"
- "\x2d\x88\x39\x27\xa6\x05\xc3\x1f\x71\xe6\x9c\x50\x0b\x86\x8f\x17"
- "\xd7\x82\xe1\x89\x42\x2d\x88\xf3\x17\xd3\x82\xe1\x9b\x04\xf9\xbb"
- "\x68\xc1\xf0\x7d\x42\x2d\x48\xd2\x71\x5a\x70\x50\x0c\x69\x43\xf5"
- "\xe9\xf2\xb5\xe0\xa0\x47\xa4\xb5\xe0\xa0\xe1\x42\x2d\x38\x88\x7c"
- "\x73\x46\x0d\x4a\x20\x5a\x70\x90\x96\x1c\xd7\xaf\xe0\x1f\xe7\xb4"
- "\x20\x39\xce\x69\xc1\x41\xa9\xed\x69\x41\xf7\xfa\x61\x88\x9a\xd3"
- "\x0f\x43\xd4\x7c\xfd\x70\x5c\xa0\x1f\x1e\x0a\x71\xaf\x1f\x1e\x8d"
- "\xe3\xf4\x43\xc4\x01\x52\xbf\x23\x0a\x49\xfd\x8e\x60\xd6\xf0\x4b"
- "\x1f\x0f\xfd\x3c\xe8\x87\x7d\xf5\x25\x44\x3f\xd4\x5b\xa8\xb7\x2f"
- "\xb1\xfa\xa1\x01\xf9\x67\xcd\x63\xf5\xc3\x2b\x58\x3f\x3c\xfc\x2d"
- "\xd6\x0f\x01\x05\xa0\x55\x6b\x59\xed\x9a\x02\xda\xb5\x16\xfe\x0f"
- "\x75\xe7\x4b\xc8\xa3\x12\xf4\x65\x2e\xbe\x1e\xef\xdb\x00\x79\x31"
- "\xdf\x72\x32\xdf\x79\x9a\xfc\xf0\x7e\x40\x58\x5b\xe0\xfd\x35\xda"
- "\xdd\x5b\xa3\x96\xdd\x5b\x23\x41\xb8\xb7\x06\xde\x53\x03\xef\xaf"
- "\x51\xb0\x10\x69\xde\x67\x35\x45\xaf\x55\x3e\xbd\xf0\xfe\x1a\xbd"
- "\x9a\x88\x3e\xdd\x67\x2f\x23\xfa\x74\x51\x68\x0f\xd0\x42\xe1\xdb"
- "\x1b\x39\x2d\xf1\x0e\xd6\x11\x8b\x0c\xda\xa6\x45\x86\xfe\x57\xaf"
- "\x1a\x06\xb8\xee\xab\xf1\xd9\x44\xbc\x27\x00\xde\x8b\xd0\xca\xea"
- "\x53\x7a\x96\x01\xed\x98\x89\xfc\x41\x17\xfb\x3c\x04\xfa\xf4\x81"
- "\xbe\xf0\xec\x15\x48\x6d\xbb\x6a\xe8\xcb\x5f\xaf\x11\x9e\x5d\x6d"
- "\xbf\x6a\x40\xe5\xf1\xdf\x33\xdf\x75\x5a\xd9\xef\x3a\xcd\x8b\x0c"
- "\x78\xaf\x81\x61\xef\x2d\xe4\xe9\xd3\x10\x87\x3e\x7d\x78\xa7\x32"
- "\x7d\xfa\x70\x91\x50\x57\x0c\x39\xe4\xaa\x2b\x22\xfc\x3c\xd7\x15"
- "\x11\xca\xd6\x7f\xa1\x22\x0c\x9e\xe9\x8a\x88\xf5\xce\xba\x62\x0f"
- "\xa3\x2b\x1e\x0a\xc5\x1c\x14\xd7\x15\xe4\x9c\x6b\x7f\xf0\xe8\x40"
- "\xae\x3f\x78\xe4\x5a\xd7\xd7\x15\x8f\x6c\x15\x6f\xfb\x1f\xd9\x49"
- "\x74\x45\xc4\xba\x8e\xd7\x15\x11\xeb\xc4\x75\xc5\xa3\x21\xa4\x0d"
- "\x8e\xc8\x72\xd5\x15\x70\x8d\xa8\xae\x78\x74\x2c\x7b\xcd\x3a\xa1"
- "\xae\x20\x79\x40\x3b\x93\x28\xad\x2b\x1e\x23\x7b\x78\x50\x8f\x9e"
- "\x20\xed\x0e\xc1\xd4\x55\x57\x3c\xba\xa7\x7d\x5d\x41\x38\xc4\x3c"
- "\xa7\xa4\xae\x78\xf4\x8a\xab\xae\x78\x48\x23\xae\x2b\x06\x1f\xe7"
- "\x78\x34\x78\xb6\x50\x57\x3c\x36\xfc\xd6\xd0\x15\x92\xdc\xda\x2a"
- "\xd4\x15\x83\xbb\xcb\xd7\x15\x83\x47\xca\xd3\x15\x98\x73\x62\xba"
- "\x62\xf0\x7a\x67\xce\x09\x75\xc5\xe0\xdd\xe2\xba\x62\xf0\x21\xa1"
- "\xae\xc0\xf9\x8b\xe9\x8a\xc1\x17\x04\xf9\xbb\xe8\x8a\x21\x7e\x42"
- "\x5d\x41\xd2\x71\xba\x62\x48\x31\xeb\xcd\x0e\xc9\xd7\x15\x43\xd6"
- "\x4b\xeb\x8a\x21\x9b\x84\xba\x62\x48\x02\xd1\x0f\x43\x0e\x12\x5d"
- "\x31\x24\x8d\xd5\x1b\x07\xf9\xc7\x39\x5d\x41\x8e\x73\xba\x62\x48"
- "\xf9\xed\xef\x2d\xbb\xe2\x18\xd3\xaf\x12\x95\xf5\xe1\xbf\x4a\xf8"
- "\xe9\xdf\xf5\xde\x82\xdf\x5b\x6e\x18\x62\xe2\xde\xf5\x0e\x3b\xa3"
- "\x4c\xb7\x0c\x33\xfd\xf4\xb1\xbf\x15\xe7\x1a\xff\x6a\x2f\x17\xfb"
- "\xc7\xa7\x2a\x8b\xfd\xe3\x53\x7e\xfa\xd8\xdf\x8a\x73\x1c\x86\x1b"
- "\xb8\xd8\x3f\xf1\x9d\xb2\xd8\x3f\x21\xb9\xff\x79\xfb\xbe\xf4\x19"
- "\xde\x1c\x87\x67\xf6\x4a\xfb\xd2\x11\xfb\xdc\xfb\xd2\x48\xde\x1c"
- "\x87\xa7\xd8\x39\x0e\x4f\xb1\x73\x1c\x9e\x64\xe6\x38\x64\x60\x5f"
- "\xfa\x41\xac\xf6\xe3\x85\xa5\x14\x5e\xeb\x6b\xdf\x42\x0b\x05\x98"
- "\xf8\x5a\xb1\x2f\x85\x58\x67\xb7\x62\x5f\x7a\x94\x1d\xd7\x7e\x72"
- "\x41\x65\x1d\x6f\x4f\x0b\x6a\x84\x8d\x5b\x73\xf7\x28\xc2\xe7\xbe"
- "\x6c\x2c\xa5\x72\x5b\x9d\xc6\xbc\x21\x4f\xed\x3c\xe1\x98\x37\x1e"
- "\xeb\x6e\xe1\xed\x4d\x61\xcb\x1f\xad\x6e\x6f\xcc\xdb\x79\xbc\xbb"
- "\xb0\x15\x69\x6e\xdd\x31\xef\xc7\x77\x71\x63\xde\x4f\x2a\x9c\xff"
- "\xf0\xa4\xd3\xfc\x87\x28\x91\xf9\x0f\x4f\xca\x98\xff\xf0\xa4\xc2"
- "\xf9\x0f\x4f\x7a\x38\xff\xe1\x29\x97\xf9\x0f\xc4\x9b\x8e\x28\xc9"
- "\x90\xf4\xa6\xe4\x9c\xab\xa7\x88\xe4\xcd\x7f\x88\xbc\x05\xe6\x3f"
- "\x44\x4a\xbc\xa3\x8e\x64\xe7\x3f\x3c\x75\x13\xe6\x3f\x3c\x25\x31"
- "\xff\x21\x92\x9d\xff\xf0\x94\xc8\xfc\x87\xa7\x24\xe6\x3f\x44\xb2"
- "\xf3\x1f\x9e\x72\x9a\xff\xf0\x14\x3b\xff\x61\x94\x9b\xf9\x0f\xa3"
- "\xd8\xf9\x0f\xa3\xd8\xf9\x0f\x04\x53\x57\x6f\x3a\xca\x83\xf9\x0f"
- "\x4f\xb1\xf3\x1f\x9e\x72\x33\xff\x61\x94\xc8\xfc\x87\x11\x7b\xc5"
- "\xbd\xe9\x33\xbc\xf9\x0f\xcf\x38\xcd\x7f\x18\x75\x8b\xcc\x7f\x90"
- "\xe4\x96\xd3\xfc\x87\xa7\x15\xcc\x7f\x78\x5a\xe6\xfc\x87\xa7\x24"
- "\xe6\x3f\x3c\xa3\x77\xe6\x9c\xd0\x9b\x3e\x23\x31\xff\xe1\x19\xa7"
- "\xf9\x0f\x4f\x49\xcc\x7f\x78\x66\xad\x20\x7f\x17\x6f\xfa\x8c\xd3"
- "\xfc\x87\xa7\x9c\xe6\x3f\x44\xb1\xf3\x1f\x46\x4c\x92\xef\x4d\xa3"
- "\xdc\xcc\x7f\x88\x72\x9a\xff\x10\xc5\xce\x7f\x88\x62\xe7\x3f\x44"
- "\xb1\xf3\x1f\x46\x4c\xe4\x1f\xe7\xbc\x29\x39\xce\x79\xd3\x28\x99"
- "\xf3\x1f\x6e\x7f\x8b\xd9\x39\xde\x74\xb4\xc2\xf9\x0f\xa3\xdd\xce"
- "\x7f\xb8\xed\x8f\xa4\x34\x7a\xd4\x0a\x4e\xa3\x3f\x97\xae\x4c\xb7"
- "\x3c\xb7\xe2\xa7\x8f\xfd\xad\xe8\x8f\x46\x8f\xe1\x62\x3f\xa6\x45"
- "\x59\xec\xc7\x58\x94\xfb\xa3\x98\x72\xce\x1f\xc5\x94\x4b\xfb\xa3"
- "\xb1\xee\xf7\xff\xa3\x26\x68\x38\x7f\x34\x6e\x31\xd1\x28\xe3\x26"
- "\x13\x8d\x32\xae\x8f\x7c\x7f\xf4\x9b\x4d\x42\x7f\xf4\xeb\x7e\xb7"
- "\xfd\x91\x52\x7f\xf4\xdc\x51\xce\x1f\xfd\x66\xaa\x32\x7f\xf4\x9b"
- "\x29\x42\x7f\x14\xbb\xd4\xd5\x1f\xfd\xe6\x88\xe7\xfe\xe8\x37\xe7"
- "\x94\x71\xfd\x37\xb5\x9e\xf9\xa3\x71\xcf\x8a\xfb\xa3\xb1\xd5\xd2"
- "\xfe\x88\x9c\x73\xd5\xb5\xe3\xcf\x71\xba\x76\xfc\x27\x5d\xdf\x1f"
- "\x8d\x9f\x28\xae\x61\xc7\x4f\x25\xfe\x68\x5c\x54\xc7\xfb\xa3\x71"
- "\x51\xe2\xfe\x68\x3c\xd9\xff\x95\x1a\x37\xc6\xd5\x1f\xc1\x35\xa2"
- "\xfe\x68\x82\x1f\x7b\x4d\x94\xd0\x1f\x91\x3c\xa0\xad\xb9\x4f\xda"
- "\x1f\x4d\x38\x44\xda\x9e\x09\xd9\xa4\xed\x21\x98\xba\xfa\xa3\x09"
- "\x89\xed\xfb\x23\xc2\x21\xe6\x39\x25\xfd\xd1\x84\x7d\xae\xfe\x68"
- "\xac\xf8\xbe\x6a\x54\xcc\x5a\x8e\x47\x31\x7a\xa1\x3f\x9a\x70\xed"
- "\xd6\xf0\x47\x92\xdc\x9a\x28\xf4\x47\xd1\xc7\xe4\xfb\xa3\xe8\x16"
- "\x79\xfe\x08\x73\x4e\xcc\x1f\xc5\x3c\xeb\xcc\x39\xa1\x3f\x8a\x99"
- "\x2e\xee\x8f\x62\x96\x0a\xfd\x11\xce\x5f\xcc\x1f\xc5\xec\x16\xe4"
- "\xef\xe2\x8f\x62\x8e\x08\xfd\x11\x49\xc7\xf9\xa3\xd8\x04\xd2\x86"
- "\x8e\x95\xbf\xaf\x1a\x15\xfb\xac\xb4\x3f\x8a\x1d\x2f\xf4\x47\xb1"
- "\x5a\xe2\x83\x62\xd3\x88\x3f\x8a\x1d\x4c\x8e\x8f\x4d\xe5\x1f\xe7"
- "\xfc\xd1\xd8\x54\xa1\x3f\x8a\x5d\x77\xfb\x3b\xcd\xae\xe8\x8f\x7e"
- "\x7b\x9f\x32\x7f\xf4\x5b\xed\x6d\x8d\xae\x44\xa3\xc7\x16\x70\x1a"
- "\x7d\x62\xa1\x32\xdd\x32\xb1\x40\xb9\x46\x9f\x92\xc2\x69\xf4\x29"
- "\x29\xd2\x1a\x7d\xd2\x02\xf7\x1a\x7d\x72\x29\xa7\xd1\xe3\xfa\x90"
- "\x7e\xf2\x45\x1b\xe9\x27\x5f\x3c\x24\x5f\xa3\xbf\x38\x44\xa8\xd1"
- "\x27\x1d\xb9\xad\xd1\x95\x6a\xf4\xdf\x26\x71\x1a\xfd\x45\x1f\x65"
- "\x1a\xfd\x45\x24\xd4\xe8\x53\xfb\xb9\x6a\xf4\x17\x13\x3d\xd7\xe8"
- "\x2f\xae\x57\xc6\xf5\x17\xd7\x79\xa6\xd1\x5f\xbc\x20\xae\xd1\x27"
- "\xa5\x4a\x6b\x74\x72\xce\x55\x5b\x4d\x5e\xcf\x69\xab\xc9\x93\xba"
- "\xbe\x46\x8f\xb3\x88\xeb\xa8\xc9\x3e\x44\xa3\xbf\x58\xd7\xf1\x1a"
- "\xfd\xc5\x3a\x71\x8d\x3e\x79\x31\xd1\x33\x2f\x36\xb8\x6a\x74\xb8"
- "\x46\x54\xa3\x4f\xde\xc3\x5e\x53\x27\xd4\xe8\x24\x0f\x68\x6b\x8e"
- "\x49\x6b\xf4\x97\xd8\xef\x82\x5e\x7a\x84\xb4\x3d\x04\x53\x57\x8d"
- "\xfe\x52\xf7\xf6\x35\x3a\xe1\x10\xf3\x9c\x92\x1a\xfd\xa5\x58\x57"
- "\x8d\x3e\x29\x45\x5c\xa3\x4f\xe1\xcd\xd3\x7c\xf9\xb8\x50\xa3\xbf"
- "\xb4\xed\xd6\xd0\xe8\x52\xdc\x8a\xb3\x08\x35\xfa\xcb\xb3\xe5\x6b"
- "\xf4\x97\x0b\xe5\x69\x74\xcc\x39\x31\x8d\xfe\xf2\x05\x67\xce\x09"
- "\x35\xfa\x14\x3f\x71\x8d\x3e\xa5\x9f\x50\xa3\xe3\xfc\xc5\x34\xfa"
- "\x94\xb1\x82\xfc\x5d\x34\xfa\x94\x44\xa1\x46\x27\xe9\x38\x8d\x3e"
- "\xd5\x9f\xed\xd3\xfa\xc8\xd7\xe8\x53\x2e\x48\x6b\xf4\x29\x57\x84"
- "\x1a\x7d\xca\x51\xa2\xc5\xa7\xf6\x25\x1a\x7d\x4a\x0d\x39\x3e\x29"
- "\x94\x7f\x9c\xd3\xe8\xe4\x38\xa7\xd1\xa7\x86\xdf\xfe\x86\xb3\x2b"
- "\x6a\xf4\x57\x8e\x29\xd3\xe8\xaf\x1c\x55\xae\x13\x67\x6e\xe5\x74"
- "\xe2\xcc\xad\xd2\x3a\x71\xda\x36\xf7\x3a\xf1\x55\x13\xa7\x13\x67"
- "\x8c\x22\x6d\xf5\x0c\x3d\x69\xab\xa7\x9f\x93\xaf\x13\xa7\x4f\x15"
- "\xea\xc4\x69\x17\x6e\xeb\x44\xa5\x3a\x71\x6a\x24\xa7\x13\xa7\x0f"
- "\x54\xa6\x13\xa7\x1b\x84\x3a\x71\x96\xeb\x9e\x5a\xd4\xf4\x6c\xcf"
- "\x75\xe2\xf4\x4f\x94\xe9\xc4\xe9\x25\x9e\xe9\xc4\x19\x41\xe2\x3a"
- "\x71\x5a\x81\xb4\x4e\x24\xe7\x5c\xfb\xf7\x57\x3f\xe1\xfa\xf7\x57"
- "\xd3\xbb\xbe\x4e\x7c\x55\x2b\xde\x97\xbf\x3a\x90\xe8\xc4\x19\xea"
- "\x8e\xd7\x89\x33\xd4\xe2\x3a\xf1\x55\x76\xfd\xb3\x19\x1a\x57\x9d"
- "\x08\xd7\x88\xea\xc4\x57\xd9\xf1\xdf\x19\x6a\xa1\x4e\x24\x79\x40"
- "\x5b\x73\x51\x5a\x27\x26\xac\x27\x6d\x4f\x02\xfb\x1e\x89\x60\xea"
- "\xaa\x13\x13\x1e\x69\x5f\x27\x12\x0e\x31\xcf\x29\xa9\x13\x13\x96"
- "\xba\xea\xc4\x69\x5b\xc5\x75\xe2\xcc\x58\x8e\x47\x89\x57\x84\x3a"
- "\x31\xe1\xc8\xad\xa1\x13\x25\xb9\xa5\x15\xea\xc4\xc4\x4d\xf2\x75"
- "\x62\xe2\x31\x79\x3a\x11\x73\x4e\x4c\x27\xce\x0c\x72\xe6\x9c\x50"
- "\x27\xce\x1c\x24\xae\x13\x67\x3e\x2b\xd4\x89\x38\x7f\x31\x9d\x38"
- "\x73\x81\x20\x7f\x17\x9d\x38\x33\x5b\xa8\x13\x49\x3a\x4e\x27\xce"
- "\x8a\x60\xfb\xb4\x51\xf2\x75\xe2\xac\x20\x69\x9d\x38\x4b\xb8\xff"
- "\x15\x35\x93\xec\x7f\x45\xcd\x8a\x22\x3a\x71\x16\xd9\xff\x8a\x9a"
- "\x16\xc9\x3f\xce\xe9\x44\x72\x9c\xd3\x89\xb3\x26\x7a\xf7\x7d\xe7"
- "\xfc\x00\x4e\x5b\xcc\x0f\x90\xd6\x16\xb3\xae\xb9\xd7\x16\xc9\x13"
- "\x39\x6d\x31\xe7\x33\x52\xbf\xe7\x6c\x23\xf5\x7b\x0e\x33\x3f\x29"
- "\xbd\x02\xb4\xc5\x80\x58\xed\x47\x97\x4a\x18\x6d\xf1\xf1\x3c\x0b"
- "\x05\x7a\xcf\xd7\x8e\xb5\x05\xe8\xba\xac\x25\x58\x5b\xd4\xb2\xdf"
- "\x77\xce\x3e\x51\x91\xc6\xd7\x16\x49\x63\x99\x6f\x3d\x6f\xec\x5b"
- "\x5b\x8b\xf0\x79\xb1\x6f\x3f\x0f\xcd\x63\xbf\xfd\x84\xbc\xf9\xdf"
- "\x7c\x32\xdf\x81\x5e\x02\xed\x31\x03\xf0\xe0\x69\x8f\xdb\xdf\x7e"
- "\xe2\xbe\x7e\x76\xa1\x32\x5d\x3b\xbb\x40\xa8\x39\xe6\x1f\x70\xd5"
- "\x1c\x73\x7c\x3c\xd7\x1c\x73\xf4\xca\x34\xc7\x1c\x9d\x67\x9a\x63"
- "\xce\x5a\x71\xcd\x31\xcb\x82\xf9\x29\xae\x39\xc8\x39\xd7\xbe\x22"
- "\x59\xcf\xf5\x15\xaf\x5d\xe9\xfa\x9a\xe3\xb5\x3c\xf1\x7e\xe1\xb5"
- "\x42\xa2\x39\xe6\xac\xe9\x78\xcd\x31\x67\x8d\xb8\xe6\x48\x66\xdb"
- "\xff\x39\xeb\x5c\x35\x07\x5c\x23\xaa\x39\x92\xd9\xf7\x7f\x73\xd6"
- "\x08\x35\x07\xc9\x03\xda\xa0\xe9\xd2\x9a\x23\xd9\x46\xda\xa4\xe4"
- "\x0a\xd2\x26\x11\x4c\x5d\x35\x47\xf2\xee\xf6\x35\x07\xe1\x10\xf3"
- "\x9c\x92\x9a\x23\xf9\xa2\xab\xe6\x98\xd5\x24\xae\x39\xe6\xf1\xe6"
- "\x69\xcf\x4b\x14\x6a\x8e\xb9\x43\x6e\x0d\xcd\x21\xc9\xad\x3c\xa1"
- "\xe6\x98\xe7\x27\x5f\x73\xcc\x1b\x2e\x4f\x73\x60\xce\x89\x69\x8e"
- "\x79\x6b\x9d\x39\x27\xd4\x1c\xf3\x76\x8a\x6b\x8e\x79\x07\x84\x9a"
- "\x03\xe7\x2f\xa6\x39\xe6\x9d\x13\xe4\xef\xa2\x39\xe6\xfb\x08\x35"
- "\x07\x49\xc7\x69\x8e\xf9\xbb\x58\xdf\x56\x28\x5f\x73\xcc\x5f\x2b"
- "\xad\x39\xe6\x67\x0b\x35\xc7\xfc\x78\xa2\x2d\xe6\x97\x12\xcd\x31"
- "\x3f\x95\xd5\x2d\x05\xfc\xe3\x9c\xe6\x20\xc7\x39\xcd\x31\xbf\x4c"
- "\xc6\xd8\x94\x46\xce\xb7\x9f\xfb\xae\x0b\xc7\xa6\x1c\xe3\x52\xd6"
- "\xf0\xde\xbe\x37\xc6\xa6\xa0\xaf\x97\xda\x47\x1d\x8f\x4d\xe1\xbe"
- "\x9b\x1b\x9b\x3a\xcd\xb4\x55\xdc\xd8\x94\x89\x19\x9b\xc2\xe3\x52"
- "\xe0\xd9\x6f\x8c\x4b\xd9\x5f\x77\xfd\xee\x73\x9f\x5d\xfe\xb8\xd4"
- "\x2b\x0b\xd4\x68\x3b\xd3\x7f\x1f\x28\x27\xe3\x52\x35\x37\xc6\xa5"
- "\x70\xbf\x6d\x6b\x76\x1d\x97\xc2\xfd\x35\x37\x2e\xf5\xbd\xc2\x71"
- "\xa9\x05\x53\x95\xf5\xdf\x0b\xba\xc0\xf7\x6f\xb7\xe2\x77\x9f\xf3"
- "\x4f\x71\xef\x8e\x17\x2a\xfc\xfe\x6d\xa1\xdb\xef\xdf\x6e\xcf\x6b"
- "\x96\x8a\xfd\x82\x5d\x5c\xec\x53\x27\x29\x8b\x7d\xea\xc4\x9f\x3e"
- "\xf6\xb7\xe2\x9c\x89\x45\x5a\x2e\xf6\x8b\x15\xae\xff\xb6\xb8\x5a"
- "\xf9\x58\x78\x7a\x19\xe7\x57\xd3\xcb\xf8\x7e\xb5\x2c\x8a\xef\x57"
- "\x97\xec\x76\xef\x57\x97\xab\x39\xbf\xba\x74\x01\xd1\x86\x4b\x27"
- "\x11\x6d\xb8\x94\xd9\x93\x2c\x7d\x14\x62\x7c\xaa\x15\x7b\xd6\x39"
- "\x16\xea\xa3\x7a\x23\x65\x5d\x4d\xbc\x6a\x95\xb5\x1c\x55\x98\x2d"
- "\xe8\xed\x25\xc8\x77\xfd\x25\xe4\xfb\x87\x46\x0b\xde\x39\xc7\x1f"
- "\xfa\x09\xd0\x52\xe5\xa0\x2d\x0a\x51\x4a\x06\xf6\xb1\x69\xd9\x55"
- "\x29\x66\x9e\x8f\x7d\xbd\x27\xe7\x61\x21\x5d\x8a\x05\x1d\x9e\x63"
- "\xa4\xb0\x57\x6d\xcb\x1f\xad\x6e\x1b\xd4\x9b\xac\x59\xc4\x1f\x2f"
- "\x87\x7b\x6b\x5f\x11\x8e\x97\xb7\xe6\x8f\xd6\xb4\xec\xeb\xed\xcb"
- "\xac\x87\xa8\xe7\xc6\xcd\x3d\x1d\x2f\x7f\xbf\x15\x69\x1c\xeb\x21"
- "\xe2\x7e\xf1\xd6\x1b\x2f\x4f\x2d\xe0\xc6\xcb\xd3\x26\x2b\x1b\x2f"
- "\x4f\x8b\x13\x7a\xd7\x8c\xc5\xae\xde\x35\xed\x90\xe7\xde\x35\x4d"
- "\xe1\xf7\xff\x69\x26\xcf\xbc\xeb\xd2\x51\xce\xde\xb5\x38\x03\x7b"
- "\xd7\x25\xc5\x98\xab\xe2\xde\x95\x9c\x73\xf5\x1c\xcb\xce\x70\x9e"
- "\x63\xd9\xbe\xae\xef\x5d\x97\xc5\x88\xfb\x8b\x65\x93\x89\x77\x5d"
- "\x1a\xd9\xf1\xde\x75\x69\xa4\xb8\x77\x5d\x56\x41\x74\xfe\xd2\x48"
- "\x87\x0f\xe5\xbc\x2b\x5c\x23\xea\x5d\x97\xfb\x38\x5f\x43\xbc\xeb"
- "\xd2\x28\xe2\x5d\x97\xf7\x93\xf6\xae\xcb\xd9\xf5\xd2\x96\xaf\x27"
- "\xed\x13\xc1\xd4\xd5\xbb\x2e\x9f\xde\xbe\x77\x25\x1c\x62\x9e\x53"
- "\xd2\xbb\x2e\xdf\xe3\xea\x5d\x97\xec\x12\xf7\xae\xe9\xab\x38\x1e"
- "\xa5\xdf\x27\xf4\xae\xcb\xaf\xdc\x1a\xde\x55\x92\x5b\x31\x42\xef"
- "\xba\xe2\x88\x7c\xef\xba\xe2\x9a\x3c\xef\x8a\x39\x27\xe6\x5d\xd3"
- "\x47\xb1\xfc\x89\x12\xf7\xae\xe9\x53\xc5\xbd\x6b\xfa\x62\xa1\x77"
- "\xc5\xf9\x8b\x79\xd7\xf4\x9d\x82\xfc\x5d\xbc\x6b\xfa\x21\xa1\x77"
- "\x25\xe9\x38\xef\x9a\x11\x4f\xda\xd0\x25\xe3\xe5\x7b\xd7\x8c\x51"
- "\xd2\xde\x35\x63\xac\xd0\xbb\x66\xf4\x25\x1e\x35\x23\x95\x78\xd7"
- "\x8c\x08\x72\x7c\xc9\x38\xfe\x71\xce\xbb\x92\xe3\x9c\x77\xcd\x58"
- "\x23\xc3\xbb\x86\x76\x90\x77\xf5\xbf\xb5\xbc\xeb\x17\x59\x9d\xeb"
- "\x5d\x33\xfb\x28\xf3\xae\x99\xa1\x1e\x6a\x78\x4d\x3b\x1a\xde\xf7"
- "\xff\x2f\x0d\x9f\xb1\x95\xd3\xf0\xab\xf2\x95\x69\x96\x55\x79\x3f"
- "\x75\xec\x6f\xbd\xb8\x67\xc6\x73\x71\x7f\xa3\xa7\xb2\xb8\xbf\x11"
- "\x70\xdb\xb7\x2a\x89\xfd\x2a\xde\x78\xcd\x1a\x85\xf3\x9f\xd7\xac"
- "\x53\xee\x5b\xb3\x76\x71\xbe\x35\x6b\x17\xdf\xb7\xfe\x55\xf0\x9e"
- "\x75\xed\x54\xf7\xbe\x75\x7d\x03\xe7\x5b\xd7\x8d\x27\xba\x70\x1d"
- "\x3b\xdf\xf6\x2d\x46\x6f\xad\xf8\x8c\xf8\xd6\xeb\xd8\xb7\x9e\x07"
- "\xdf\x3a\x33\x9e\xb2\xb2\x6b\xf0\xe3\x79\x59\x15\xe0\x3d\xb1\x57"
- "\xad\x4a\x83\xbf\x53\xcd\xe8\xed\x85\xc8\x77\x03\x78\xce\x3d\xd0"
- "\x7f\xed\x59\x62\xa6\xd6\xcd\x81\xb6\xbf\x66\x1f\x0a\x4c\x02\x3f"
- "\xdb\x88\xfd\xec\x51\xf0\xaa\x6b\x59\x3f\xfb\xd6\xec\xaa\x54\xbe"
- "\x9f\x5d\x7b\x9a\xf1\xb3\x66\x32\xe7\xab\x2a\x15\xfc\x2c\xdc\x0f"
- "\xaf\xe9\xcf\xf7\xb3\x2d\xe0\x57\x5b\xc1\xaf\xe6\xd6\x3b\x79\xdb"
- "\x99\xae\xde\xb6\x25\x64\x74\xa8\x65\x50\x6f\x7f\xec\x6d\xaf\xef"
- "\xfe\xff\xd1\xdb\xbe\x31\x91\xf3\xb6\x6f\x0d\x51\xe6\x6d\xdf\x1a"
- "\x2c\xf4\xb6\xd9\xb1\xae\xde\xf6\xad\x6d\x9e\x7b\xdb\xb7\x0e\x29"
- "\xab\x33\x6f\x1d\xf4\xcc\xdb\xae\xeb\xe7\xec\x6d\x3f\x64\xde\xcb"
- "\xae\x8d\xc7\x7c\x16\xf7\xb6\xe4\x9c\xab\x27\x59\x7f\x88\xf3\x24"
- "\xeb\xd7\x77\x7d\x6f\xbb\x3e\x5c\xdc\x7f\xac\x1f\x42\xbc\xed\xba"
- "\xbe\x1d\xef\x6d\xd7\xf5\x15\xf7\xb6\xeb\xd9\xf9\xff\xeb\xfa\xba"
- "\x7a\x5b\xb8\x46\xd4\xdb\xae\x3f\xed\x7c\x0d\xf1\xb6\xeb\xb4\xc4"
- "\xdb\xae\x6f\x91\xf6\xb6\x1b\xf2\x49\x1b\xb6\x21\x91\xb4\x61\x04"
- "\x53\x57\x6f\xbb\x61\x64\xfb\xde\x96\x70\x88\x79\x4e\x49\x6f\xbb"
- "\x61\xad\xab\xb7\x5d\x3b\x45\xdc\xdb\x66\x4d\xe5\x78\xf4\xb6\x4d"
- "\xe8\x6d\x37\x54\xdc\x1a\xde\x56\x92\x5b\xe1\x42\x6f\xfb\x76\xa1"
- "\x7c\x6f\xfb\xf6\x09\x79\xde\x16\x73\x4e\xcc\xdb\x66\xf5\x63\xf9"
- "\xa3\x15\xf7\xb6\x59\xc3\xc5\xbd\x6d\x56\xac\xd0\xdb\xe2\xfc\xc5"
- "\xbc\x6d\x56\xba\x20\x7f\x17\x6f\x9b\xb5\x4d\xe8\x6d\x49\x3a\xce"
- "\xdb\x66\x8f\x60\xfb\x3a\x3f\xf9\xde\x36\xbb\x9f\xb4\xb7\xcd\xd6"
- "\x0b\xbd\x6d\x96\x85\x78\xd8\xec\x18\xe2\x6d\xb3\x03\xc8\xf1\xb5"
- "\xbe\xfc\xe3\x9c\xb7\x25\xc7\x39\x6f\x9b\x1d\x2f\xef\xbd\xac\x57"
- "\xeb\x1e\xf9\x76\xfe\x37\x03\x1d\xb5\xee\x91\xe3\xdd\x6c\x67\x7d"
- "\x33\x90\xd3\xa2\xcc\xdf\xe6\xb8\x5d\xff\xe5\xb6\xc7\x12\xd3\xf9"
- "\xd9\xa9\x9c\xce\xcf\x5d\xa0\x4c\xb3\xe4\xa6\xdc\xf6\x58\x4a\x62"
- "\xbf\x31\x92\x8b\xfd\xa6\x8b\xca\x62\xbf\xa9\x41\xb9\xc7\xda\x56"
- "\xcb\x79\xac\x6d\xb5\xd2\xef\x06\x37\x1f\x71\xef\xb1\xde\x0d\xe7"
- "\x3c\x56\x7e\x36\xd1\x27\xf9\x0b\x88\x3e\xc9\x7f\xa4\xe3\xde\x0d"
- "\xe6\xed\x11\xbe\x1b\x7c\x67\xe0\xed\x77\x83\x1d\xe1\x9f\x72\x4b"
- "\x39\xff\x94\xb7\x58\x99\x7f\xca\x4b\x15\xfa\xa7\xf7\x36\xb9\xfa"
- "\xa7\xbc\xef\x3c\xf7\x4f\x79\x36\x65\xf5\x21\xcf\xea\x99\x7f\xca"
- "\x9f\x2a\xfe\x6e\x70\xf3\x51\xe9\x77\x83\xe4\x9c\xab\xee\xdd\x62"
- "\xe3\x74\xef\x96\xe3\x5d\xdf\x3f\x6d\x49\x16\xd7\xb8\x5b\x16\x13"
- "\xff\x94\x3f\xa5\xe3\xfd\x53\xfe\x14\x71\xff\xb4\x85\xfd\xfe\x35"
- "\x7f\x8a\xab\x7f\x82\x6b\x44\xfd\xd3\xbb\xfd\x9c\xaf\x21\xfe\x29"
- "\x3f\x9e\xf8\xa7\x77\x87\x4b\xfb\xa7\x77\xbf\x25\xed\xd3\xbb\xbb"
- "\x49\xfb\x44\x30\x75\xf5\x4f\xef\xa6\xb7\xef\x9f\x08\x87\x98\xe7"
- "\x94\xf4\x4f\xef\x1e\x73\xf5\x4f\x9b\x8d\xe2\xfe\x69\x5b\x21\xc7"
- "\xa3\x6d\x23\x85\xfe\x69\x6b\xcf\x5b\xc3\x3f\x49\x72\x2b\x59\xe8"
- "\x9f\xb6\x9e\x96\xef\x9f\xb6\x05\xc9\xf3\x4f\x98\x73\x62\xfe\x69"
- "\xdb\x54\x96\x3f\xf1\xe2\xfe\x69\xdb\x52\x71\xff\xb4\x6d\x93\xd0"
- "\x3f\xe1\xfc\xc5\xfc\xd3\xb6\x43\x82\xfc\x5d\xfc\xd3\xb6\xef\x84"
- "\xfe\x89\xa4\xe3\xfc\xd3\x7b\x2b\x48\x1b\xba\x79\xb6\x7c\xff\xf4"
- "\xde\x54\x69\xff\xf4\x5e\xa2\xd0\x3f\xbd\x37\x8c\xf8\xa4\xf7\x72"
- "\x89\x7f\x7a\x6f\x1c\x39\xbe\x39\x89\x7f\x9c\xf3\x4f\xe4\x38\xe7"
- "\x9f\xde\x2b\x92\xe7\x9f\x3c\x5f\x17\xe9\xa7\x9f\xd7\xaa\xbd\x45"
- "\xe7\xb5\x16\x0c\x51\xe6\x9d\x0a\x06\xdf\xd6\xf0\x4a\x34\xfc\x7b"
- "\xfb\x39\x0d\x5f\xa8\xf0\xfb\xdf\xc2\x12\xe5\x1a\x7e\x77\x31\xa7"
- "\xe1\x77\x17\x4b\x6b\xf8\xed\x6b\xdd\x6b\xf8\x0f\xcc\x9c\x86\xdf"
- "\x19\x4b\xfa\xc8\x9d\x43\x48\x1f\x59\x74\xad\xe3\x34\x7c\xd1\x5c"
- "\xa1\x86\xdf\x7e\xf1\xb6\x86\xef\x08\x0d\x5f\xc0\xdb\xef\xb8\x68"
- "\xb8\x32\x0d\x5f\x34\x4c\xa8\xe1\x3f\x9c\xe4\xaa\xe1\x8b\x0a\x3d"
- "\xd7\xf0\x45\x47\x94\xd5\x87\x22\xa3\x67\x1a\x7e\xe7\x7d\xe2\x1a"
- "\x7e\xfb\x3a\x69\x0d\x4f\xce\xb9\x6a\xaf\x0f\x8e\x70\xda\xeb\x83"
- "\xec\xae\xaf\xe1\x3f\x88\x10\xd7\x59\x1f\x0c\x27\x1a\x7e\xa7\xb6"
- "\xe3\x35\xfc\x4e\xad\xb8\x86\xff\x60\x1f\xd1\x3b\x3b\xb5\xae\x1a"
- "\x1e\xae\x11\xd5\xf0\x1f\x9c\x71\xbe\x86\x68\xf8\x9d\x3a\xa2\xe1"
- "\x3f\xb0\x49\x6b\xf8\xdf\x6d\x23\xed\xd3\xef\x66\x93\xf6\x89\x60"
- "\xea\xaa\xe1\x7f\x37\xaa\x7d\x0d\x4f\x38\xc4\x3c\xa7\xa4\x86\xff"
- "\xdd\x7a\x57\x0d\xbf\x7d\x8d\xb8\x86\xdf\x3d\x9d\xe3\xd1\x6e\x1f"
- "\xa1\x86\xff\xdd\x89\x5b\x43\xc3\x4b\x72\x2b\x42\xa8\xe1\x77\xed"
- "\x94\xaf\xe1\x77\x7d\x2b\x4f\xc3\x63\xce\x89\x69\xf8\xdd\xf7\xb1"
- "\xfc\xd1\x89\x6b\xf8\xdd\x23\xc5\x35\xfc\xee\x49\x42\x0d\x8f\xf3"
- "\x17\xd3\xf0\xbb\x57\x09\xf2\x77\xd1\xf0\xbb\x0b\x85\x1a\x9e\xa4"
- "\xe3\x34\xfc\x87\x91\x6c\xff\x36\x48\xbe\x86\xff\xf0\x3e\x69\x0d"
- "\xff\xe1\x40\xa1\x86\xdf\x6d\x25\x5a\xfd\xc3\x89\x44\xc3\x7f\xa8"
- "\x26\xc7\xb7\x87\xf3\x8f\x73\x1a\x9e\x1c\xe7\x34\xfc\x87\x09\xb7"
- "\xd7\x4d\xea\x8a\xeb\x26\xfd\xde\xa6\x4c\xc7\xff\xde\xaa\x5c\x4b"
- "\x7e\x5c\xcd\x69\xc9\x8f\xab\xf9\x5a\x52\xb8\xb6\x41\xf1\x09\xf7"
- "\x5a\x72\x5f\x28\xa7\x25\xff\xb8\x94\xb4\xd5\x7f\x9c\x4a\xda\xea"
- "\x3f\x32\xef\xf7\xe4\xad\x9b\xf4\x87\x7c\xe1\xba\x49\x7b\xee\xbb"
- "\xbd\x6e\x92\x52\x9d\xf8\x61\x1a\xa7\x13\xff\x30\x5d\x99\x4e\xfc"
- "\x43\xbc\x50\x27\x96\xa4\xbb\xea\xc4\x3f\x1c\xf3\x5c\x27\xfe\xe1"
- "\x82\x32\x9d\xf8\x87\x3a\xcf\x74\xe2\x1f\xc7\x8a\xaf\x61\x50\x7c"
- "\x52\x7a\xdd\x24\x72\xce\xb5\x7f\xdf\x7b\x81\xeb\xdf\xf7\x7e\xd6"
- "\xf5\x75\xe2\xde\x38\xf1\xbe\x7c\xef\x74\xa2\x13\xff\x38\xa6\xe3"
- "\x75\xe2\x1f\xc7\x88\xeb\xc4\xbd\xdf\x92\x3e\xf5\x8f\xe3\x5c\xd7"
- "\x30\x80\x6b\x44\x75\xe2\xbe\xee\xec\x35\x63\x84\x3a\x91\xe4\x01"
- "\x6d\x8d\x5e\x5a\x27\xee\x3b\x42\xda\x9e\x7d\x9b\x48\xdb\x43\x30"
- "\x75\xd5\x89\xfb\x66\xb7\xaf\x13\x09\x87\x98\xe7\x94\xd4\x89\xfb"
- "\x3e\x71\xd5\x89\xc5\xd5\xe2\x3a\xf1\x63\xde\x3a\xad\x1f\x0f\x14"
- "\xea\xc4\x7d\x2d\xb7\x86\x4e\x94\xe4\x56\x9c\x50\x27\x7e\x74\x5c"
- "\xbe\x4e\xfc\xc8\x26\x4f\x27\x62\xce\x89\xe9\xc4\x8f\xc7\x3a\x73"
- "\x4e\xa8\x13\x3f\x4e\x14\xd7\x89\x1f\xa7\x0b\x75\x22\xce\x5f\x4c"
- "\x27\x7e\xbc\x47\x90\xbf\x8b\x4e\xfc\xf8\x98\x50\x27\x92\x74\x9c"
- "\x4e\x2c\x49\x22\x6d\x68\xf1\x52\xf9\x3a\xb1\x64\xac\xb4\x4e\x2c"
- "\x89\x15\xea\xc4\x12\x1d\xd1\x83\x25\x2b\x88\x4e\x2c\x19\x46\x8e"
- "\x17\xa7\xf1\x8f\x73\x3a\x91\x1c\xe7\x74\x62\x49\x96\xbc\xef\x40"
- "\x3a\x64\xac\xb7\x93\xbe\x03\xe9\xa8\xb1\xde\xce\xfe\x0e\xe4\x53"
- "\x85\xeb\xdf\x7f\xaa\xbd\x3d\x4f\x46\xee\x38\x6f\x49\x11\x37\xce"
- "\xfb\x7f\xdb\x94\xe9\x95\xff\xdb\xaa\x5c\x9b\x7f\xc1\xdb\xbf\xf7"
- "\x0b\xc1\xfe\xbd\xc2\xf9\xf0\xfb\xe7\xba\xd7\xe6\xa5\xbc\xfd\x7b"
- "\x3f\x67\xf7\xef\xfd\x9c\xdd\xbf\xf7\x4f\x2d\x4a\xe6\xc3\x6f\x68"
- "\x44\xbe\x6f\x3b\xcf\x87\x3f\x79\x88\xcc\x87\x5f\xe8\x3c\x1f\xfe"
- "\x4f\x0b\x84\xf3\xe1\xf7\x5f\x94\x9a\x0f\x8f\xc7\x7d\xdb\xf6\xf5"
- "\x66\xe6\xc2\x8b\xce\x83\x7f\xa9\x63\xe7\xc1\x63\x6e\xbe\xbf\x8c"
- "\x68\xfb\xf7\x6e\x49\x6d\xff\x29\x6f\xed\xfc\x3f\x29\xdc\xff\xf7"
- "\x4f\x4e\xfb\xff\x1e\x14\xd9\xff\xf7\x4f\x32\xf6\xff\xfd\x93\xc2"
- "\xfd\x7f\xff\xe4\xe1\xfe\xbf\x9f\xbb\xec\xff\x4b\xe6\xc1\xef\x4f"
- "\x91\x9e\x07\x4f\xce\xb9\x6a\xb2\x52\xde\xba\x52\xa5\xb7\xc0\xfe"
- "\xbf\xa5\x12\x7b\xb4\x96\xb2\xfb\xff\x7e\x7e\x13\xf6\xff\xfd\x5c"
- "\x62\xff\xdf\x52\x76\xff\xdf\xcf\x6f\xec\xe5\xcb\x69\xfb\xcf\x25"
- "\xf6\xff\x2d\x3d\xe7\x7c\x0d\xd1\xf6\x9f\xb3\xfb\xff\x1e\x70\xb3"
- "\xff\xef\x01\x76\xff\xdf\x03\xec\xfe\xbf\x04\x53\x57\x6d\x7f\xc0"
- "\x83\xfd\x7f\x3f\x67\xf7\xff\xfd\xdc\xcd\xfe\xbf\x07\x44\xf6\xff"
- "\xdd\x9f\x2c\xae\xed\xbf\xe0\xed\xff\xfb\x85\xd3\xfe\xbf\x07\x6e"
- "\x91\xfd\x7f\x25\xb9\xe5\xb4\xff\xef\x9f\x15\xec\xff\xfb\x67\x99"
- "\xfb\xff\x7e\x2e\xb1\xff\xef\x17\xec\xfe\xbf\x9f\x4b\xec\xff\xfb"
- "\x85\xc4\xfe\xbf\x5f\x38\xed\xff\xfb\xb9\xc4\xfe\xbf\x5f\xac\x15"
- "\xe4\xef\xa2\xed\xbf\x70\xda\xff\xf7\x73\xa7\xfd\x7f\x0f\xb2\xfb"
- "\xff\xee\x0f\x91\xaf\xed\x0f\xba\xd9\xff\xf7\xa0\xd3\xfe\xbf\xf8"
- "\x93\x21\xac\xe1\x0f\xb2\xfb\xff\x1e\x64\xf7\xff\xdd\xaf\xe1\x1f"
- "\xe7\xb4\x3d\x39\xce\x69\xfb\x83\x72\xf6\xff\xd5\xc8\x19\x03\xfe"
- "\xe9\xe7\x71\xa8\x6f\xd1\x79\x1c\x87\x14\x8e\xff\x1e\xf2\x62\xfc"
- "\xf7\x58\x03\xa7\x31\x8f\x35\x48\xcf\x25\xf8\xb2\x9d\xf1\xdf\xaf"
- "\x06\x73\x1a\xf3\x08\xfb\xbd\xd2\x91\xa5\xa4\x9d\x3e\x32\xdc\xd3"
- "\xb9\x04\x1b\xae\xb3\xba\xd2\x31\x97\x60\x09\x3b\x97\x00\xb4\x25"
- "\xd1\x92\xc6\x4f\x84\x73\x09\x0e\x0f\x97\x9a\x4b\x20\x3a\x87\xc0"
- "\x49\x3f\x3a\xb4\xa6\xd2\x39\x04\xb7\xbe\x7e\x3c\xc8\x9b\x43\x60"
- "\x4c\x57\xa6\x1f\x8d\x2b\x84\xfa\xf1\xaf\xdb\x5c\xf5\xa3\xf1\x8c"
- "\xe7\xfa\xf1\x88\x9f\x32\xfd\x78\xc4\xd7\x33\xfd\x78\x24\x51\x7c"
- "\x0e\xc1\x97\x27\xa5\xe7\x10\x90\x73\xae\xfd\xfe\x57\x7e\x5c\xbf"
- "\xff\x97\x13\x5d\x5f\x3f\xfe\x25\x55\xbc\x8f\xff\x4b\x3a\xd1\x8f"
- "\x47\x12\x3a\x5e\x3f\x1e\x49\x10\xd7\x8f\x7f\xb9\x42\xfa\xda\x23"
- "\x09\xae\xfa\x11\xae\x11\xd5\x8f\x5f\xe9\x9d\xaf\x21\xfa\xf1\x48"
- "\x12\xd1\x8f\x5f\x8d\x92\xd6\x8f\x5f\x9d\x26\xed\xd2\x57\xfb\x48"
- "\xbb\x44\x30\x75\xd5\x8f\x5f\xad\x6d\x5f\x3f\x12\x0e\x31\xcf\x29"
- "\xa9\x1f\xbf\xaa\x70\xd5\x8f\x5f\x4a\x8c\x0d\x1f\xdb\xcd\xf1\xe8"
- "\xd8\xb3\x42\xfd\x78\x34\xe4\xd6\xd0\x8f\x92\xdc\x4a\x15\xea\xc7"
- "\xa3\xe7\xe4\xeb\xc7\x63\x7d\xe4\xe9\x47\xcc\x39\x31\xfd\x78\x2c"
- "\x91\xe5\x4f\x92\xb8\x7e\x3c\xb6\x4a\x5c\x3f\x1e\xdb\x26\xd4\x8f"
- "\x38\x7f\x31\xfd\x78\xec\x98\x20\x7f\x17\xfd\x78\xec\x8c\x50\x3f"
- "\x92\x74\x9c\x7e\xfc\xeb\x1a\xd2\x86\x7e\xa9\x60\x6c\xf8\xaf\x89"
- "\xd2\xfa\xf1\xaf\x73\x85\xfa\xf1\xaf\x91\x44\x27\xfe\x75\x2b\xd1"
- "\x8f\x7f\x9d\x48\x8e\x7f\x99\xc6\x3f\xce\xe9\xc7\x2f\x9d\xc6\x86"
- "\xff\x5a\xec\x4e\x3f\xd2\xb9\xf5\x96\x5c\xca\x5e\x02\xbf\x52\x78"
- "\xce\x3e\xd0\x8f\x19\xe1\xef\x32\xe8\x8f\xd4\xf0\xb7\xe4\xda\x86"
- "\xe6\xa0\x7a\x8b\x1d\xb4\x87\x1d\xee\x53\x65\xbe\x6c\x34\xde\x63"
- "\x85\x7b\xff\x8d\xec\xd9\x02\x79\x06\x5a\xbb\x8d\xb1\xd3\x49\xd0"
- "\x87\xc3\xdf\x69\x70\x0c\xd2\xf7\x82\x7e\x4f\xbb\x04\xf5\xba\x44"
- "\xfd\x6d\x8c\x23\x1d\x3c\x73\xaf\xb3\xd4\xdf\xfc\x70\x1e\xcd\x1b"
- "\xfe\x36\x11\xca\xb3\x5f\xf2\x59\x21\xaf\xe8\x3d\xfd\x51\xba\x95"
- "\xfe\x9f\x71\x5e\x23\xaa\xa5\xfe\x56\x18\xd8\xd0\x6d\x0c\xb4\x43"
- "\x08\xeb\xbd\x92\x7b\xcc\xbe\x38\x4f\xe3\xbc\x56\x7c\x2e\x13\x9f"
- "\xb3\xc1\x33\x66\xcc\x45\x54\x4e\x63\x37\x7f\xd0\x55\x7e\x2b\x9b"
- "\xe8\xba\xf9\x56\x78\xe6\x34\x2b\x3a\xdc\xbf\xc6\xf7\xe3\xf7\x6a"
- "\x98\xbe\xa7\xb2\xc9\xc6\xe4\xa1\x9d\xc7\x3c\xcf\xce\xed\x90\x5e"
- "\xec\x19\xd6\x7e\x84\xc2\xfd\x06\xd2\x26\x79\xfd\xdd\xdf\x9a\xa4"
- "\xe2\x18\xb8\xaa\x3f\x32\x3e\x08\xb1\xd3\x22\x4a\xec\xbc\xbc\xfb"
- "\x94\xb9\x5b\xff\xd6\xff\x9d\xde\x74\xd3\xca\x6d\x88\xda\x68\xef"
- "\xe6\xff\x15\xb4\x89\x3b\xb6\xd0\xe6\xe6\x0d\x65\x65\x26\x9f\x43"
- "\x51\x38\xe6\x6f\xc0\xf9\x8d\xbd\x69\xf3\xd5\xd5\x98\x37\x65\xa6"
- "\x23\xc0\x24\x67\x2c\x16\x26\xcc\x9d\xae\x4d\x9d\x3d\x37\x71\xfe"
- "\xe2\x54\xad\x3e\xa1\x07\x9a\x38\x7f\xbe\x76\xee\xf4\x79\x4b\xb5"
- "\xfc\x33\x8f\x6b\x13\x66\x2f\x9a\x3e\x23\x39\x71\xd0\xdc\x57\x53"
- "\x7a\x60\x03\xc4\x7b\x0e\x0d\x7e\x16\xfb\x86\xb2\x86\xed\x9b\x11"
- "\x7a\x27\x18\xf9\xe2\xe7\x6a\xde\x70\x3c\xc6\xe4\xdb\x3d\x15\xdf"
- "\x2f\x67\x0b\xdd\x44\x41\x9a\x95\xd0\xa6\x6d\xcc\xe8\x86\xd3\x4e"
- "\xd9\x01\xcf\xb5\x1d\x9e\x1b\x9e\x11\x9e\xf9\xf8\x0a\xc7\x33\x3b"
- "\x38\xb1\x12\x73\x22\xa3\x11\x38\x78\xbc\x30\xd0\xd2\xed\x39\x9a"
- "\x8e\xc3\xe5\x6b\x82\xba\xe2\x73\x9e\xfa\x7a\x08\xe3\x01\x36\xd5"
- "\x5b\xe0\xda\x52\x07\xc7\xec\x79\x8f\xe5\xd2\x9b\xeb\x8d\xa0\x1d"
- "\x7d\x9a\xe9\xa4\x27\x81\x9b\x70\xfd\xd7\x7e\x0f\x23\x94\x49\x37"
- "\xc7\x31\xfb\x0f\xd0\xcd\xc0\x61\xc2\x53\x7c\xae\xe6\x2a\x85\x9e"
- "\x82\x3c\xac\x26\xf4\x9a\x0e\xe7\x61\x82\x63\x38\xe6\xf6\xa2\x58"
- "\xf5\x24\x03\xca\x7c\x20\x13\x65\x36\xe3\x6b\x76\x05\xd7\x05\xa6"
- "\x22\x9f\xe8\x34\xfa\x07\x68\x77\x7c\xe8\xfb\x62\xd5\xf4\xee\xe0"
- "\x3a\x13\x75\xdc\x64\xcf\x7f\x2c\x17\xca\xd3\xd0\xbc\xe1\xeb\x28"
- "\x13\x6a\x3e\x89\xf3\xd9\xb8\x85\x89\x7d\x03\x2e\x3b\xc4\x07\xbc"
- "\x0c\x6d\xa4\x57\xb3\x75\x28\x37\xa0\xc4\x9e\xfb\x52\x51\x95\xef"
- "\x75\x14\x6d\xa5\xdb\xe8\x4d\x01\x25\x95\x4d\x4d\xd0\xa6\xa5\xbc"
- "\x4a\xf7\x28\xb3\x05\x5a\x67\x27\xee\x08\x86\xba\xb8\xe9\xa5\x22"
- "\x7a\x53\x58\xc3\xa4\x81\x48\x0d\x79\x17\x39\xe2\x09\xb1\xf4\x95"
- "\xc7\xa3\xaf\x99\x35\x5d\x30\x1f\xe0\x79\x58\x3e\x7c\x6d\x3e\x92"
- "\xea\xca\x87\x1b\x75\x73\x4b\x18\xb2\xd2\x71\xcf\xb5\xe5\x85\x0d"
- "\xa3\x35\x61\xba\x8c\x73\xe8\x0e\x1c\xdb\x4a\xd0\xfb\x39\x4b\x50"
- "\x68\xf6\x2b\x48\x3b\x6d\xa9\x1a\x99\xf3\xc3\xb4\x81\xab\x32\x7d"
- "\x20\x26\x14\xb4\x2f\x11\xd0\x66\x46\xb4\xf5\x7e\x2c\x77\x45\x22"
- "\xa2\xf6\x9d\x2d\xa1\xb0\x4e\xc6\xf3\x42\xce\x53\x7f\xff\x64\x3b"
- "\x5c\x47\x5f\x8e\x43\x18\x0f\x06\x8b\xcb\x49\x68\xfc\x6c\xe8\x9f"
- "\xe7\x30\xe7\xcf\x15\x42\x9e\xf2\xca\xf5\x77\x46\xff\xda\x00\xab"
- "\x87\x01\xa7\xaa\x5a\x1b\x93\x27\x83\x55\x32\x87\xd5\x21\x78\x0e"
- "\x0e\xaf\xbf\x27\x63\x5c\x25\xca\x9c\xc9\x96\xb9\x14\xca\xbc\xcb"
- "\x4d\x99\x8b\x48\x99\xfd\x1a\xdd\x97\xb9\x7c\xb7\xfb\x32\x97\x7f"
- "\x27\xbf\xcc\xe5\x29\xf2\xcb\x5c\x1e\x2f\x5d\x66\x1d\x8b\xb3\x0e"
- "\x70\xd6\xb9\xc1\x59\xc7\xe2\x7c\xe7\x59\xf7\x65\xae\xd8\xe6\xbe"
- "\xcc\x15\x15\xf2\xcb\x5c\x91\x20\xbf\xcc\x15\x13\xdd\x94\x99\xc5"
- "\x59\x07\x38\xeb\xdc\xe0\xac\x63\x71\x0e\xfa\xc6\x7d\x99\x2b\xb3"
- "\xdd\x97\xb9\xf2\x88\xfc\x32\x57\xc6\xc9\x2f\x73\xe5\x18\xe9\x32"
- "\xeb\x59\x9c\xf5\x80\xb3\xde\x0d\xce\x7a\x16\xe7\xa1\x1b\xdc\x97"
- "\xb9\x6a\x95\xfb\x32\x57\x7d\x26\xbf\xcc\x55\xe3\xe4\x97\xb9\x6a"
- "\x84\x9b\x32\xb3\x38\xeb\x01\x67\xbd\x1b\x9c\xf5\x2c\xce\x2f\x3f"
- "\xed\xbe\xcc\xd5\x8b\xdd\x97\xb9\x7a\x8f\xfc\x32\x57\x47\xca\x2f"
- "\x73\x75\x84\x54\x99\x5b\xa1\xdd\x0e\x80\xb2\xb4\xfd\x2b\xee\x39"
- "\x9b\x26\x2c\x3c\xa0\x16\x51\x05\xab\xed\x49\x81\x75\xa8\x3b\x94"
- "\x2d\x89\xde\x32\x34\x1e\xff\x6b\xd7\x84\x19\x5a\x35\x61\xc3\x5a"
- "\x82\xeb\x8d\xcb\xa7\xa2\x3b\xb0\x1e\x5f\x6f\x47\xa1\xf6\xbc\x30"
- "\x5d\xd6\xf3\x48\xbb\xd2\x8c\xd4\x95\x19\x26\x94\x91\x42\x9b\x2b"
- "\xd1\x19\xd4\xb3\x0e\x7b\xcf\xef\x51\x79\x43\x19\x9a\xb7\x90\xa6"
- "\xcf\x53\x27\xae\xe1\x77\xc0\xa0\x93\x33\x73\xff\x89\xb4\x70\x8f"
- "\x88\xed\xf0\xc3\xf9\x04\x8e\x83\xfe\x73\xcb\xd0\x19\x3b\x32\x50"
- "\xe8\x97\x73\xea\x10\x3e\x5e\x08\x3f\xdb\x96\xc7\x72\x33\xa6\x22"
- "\xea\xa3\xc6\x1a\x8a\xf4\xcd\x27\x8e\x38\xf7\xcd\xe3\xa6\x43\x2c"
- "\x67\xe0\x73\xdf\xf4\x2c\x78\x5e\x6e\x2c\x4f\x64\x39\xfa\x6e\x26"
- "\x96\xa7\x6c\xa4\xbf\x77\xea\xbb\xbf\x84\xfb\x73\xb1\x3c\xb1\x02"
- "\xc7\x92\xce\x0b\x8b\xac\xaa\x6b\xc5\xbe\x49\x7d\x3e\x0d\x51\x70"
- "\x3c\xbc\x32\xa5\x11\x49\xc4\x38\x93\x17\xe3\xbd\x01\xb5\x7e\x8d"
- "\x12\x31\x2e\x86\x18\x97\x8a\xc4\x78\x97\x67\x31\xfe\xc7\x64\xef"
- "\x63\xfc\x0f\xbd\x74\x8c\xff\xb1\x40\x7e\x8c\xbf\x31\xcb\x8f\xf1"
- "\x37\x26\x36\xc6\x46\x61\x8c\xbf\xc9\x95\x8e\xb1\x8e\xc7\x63\x1d"
- "\xf0\xf8\xce\xb3\xe2\x31\xd6\x01\x8f\x75\x22\x3c\xd6\x79\xc8\xe3"
- "\x93\x87\xbc\x8f\xf1\xc9\xf5\xd2\x31\x3e\xf9\xad\xfc\x18\x9f\x9c"
- "\x28\x3f\xc6\x27\xa3\x48\x8c\x75\x4e\x3c\xfe\x47\x93\x9b\x18\xf3"
- "\x78\xac\x03\x1e\x07\x7d\x23\x11\x63\xe0\xb1\x4e\x84\xc7\x3a\x0f"
- "\x79\xfc\xcf\xfb\xbc\x8f\xf1\xb7\x17\xa5\x63\xfc\xcf\xe1\xf2\x63"
- "\xfc\x6d\xa9\xfc\x18\x7f\x5b\xcc\xc6\xd8\x89\xc7\xdf\xc6\x49\xc7"
- "\x58\xcf\xe3\xb1\x1e\x78\x3c\x74\x83\x78\x8c\xf5\xc0\x63\xbd\x08"
- "\x8f\xf5\x1e\xf2\xf8\x5f\x6b\xbd\x8f\xf1\xbf\x62\xa5\x63\xfc\xaf"
- "\x42\xf9\x31\xfe\x57\x5f\xf9\x31\xfe\x57\x00\x89\xb1\xde\x89\xc7"
- "\xff\x3c\xe8\x26\xc6\x3c\x1e\xeb\x81\xc7\x2f\x3f\x2d\x11\x63\xe0"
- "\xb1\x5e\x84\xc7\x7a\x0f\x79\x5c\x73\xc1\xfb\x18\xd7\x7c\x26\x1d"
- "\xe3\xef\x7c\xe4\xc7\xb8\x26\x53\x7e\x8c\x6b\x52\xd8\x18\x3b\xf1"
- "\xb8\x46\x2b\x15\xe3\x36\xf0\x80\x3d\x21\xc6\x3d\x1b\x10\x55\x88"
- "\x63\x5b\x43\x62\x6b\xeb\x3d\x34\xbe\x90\xb2\x27\xe1\x98\x30\x63"
- "\x40\x3f\x86\xf6\xb2\xe5\x85\x85\xd3\x14\x94\x29\x03\x8f\xbb\x7e"
- "\x37\xdb\xba\x1a\xf5\xd2\x66\xe0\xf1\xdf\x7f\x33\xf3\x03\xb4\x19"
- "\x6f\x9e\x86\xfb\xa9\xf0\xb8\x97\x75\xd3\x85\x22\x5b\xc8\x03\x29"
- "\xe7\xa9\xef\x77\xd2\xfa\x10\x04\xde\x2b\x92\x7e\x2d\x54\x53\xd5"
- "\x50\x02\xf1\xf9\x1a\x55\xd6\xfc\x19\xd9\x7b\x0f\x9d\xf1\xb0\x15"
- "\x19\xe8\x1f\x0d\x9a\xf2\x54\x13\xb2\xbd\x1a\x1a\x50\x95\x56\x86"
- "\xaa\xd2\x3e\x45\xd1\x75\xf4\x75\xfa\xbf\x86\x80\xb6\x90\x11\xc5"
- "\xb6\x90\xa1\x91\xb6\xfc\xd1\x06\x6b\xc8\x88\xad\xfb\x96\x98\xa8"
- "\x00\x0b\x32\x24\xd7\xd2\x74\xce\x0c\xe4\x9b\x73\x16\xf9\x6f\x9c"
- "\x81\x02\x36\x9e\x45\xea\xf2\xda\x1a\x54\x51\x5f\x86\x2a\x1a\xbf"
- "\x43\x15\xd7\xe1\xd7\x0a\x3f\x3b\xfc\x32\xbf\x03\xac\x11\x1a\x7f"
- "\x11\xe1\xbd\x1b\xcd\xbf\x3c\x85\x34\xe5\xd6\x1a\x84\xbf\x7f\xbd"
- "\x44\x7d\x3f\x32\x20\x1e\x69\xe8\xff\x86\x22\xfa\xd5\x50\x0a\xce"
- "\xf9\xe2\xe3\x55\x56\x33\x2a\xaf\xb5\xe0\xf3\x7d\xe1\xbc\xef\xca"
- "\x5a\xc8\xdf\x5e\x86\xf7\x66\x34\x97\x67\x1e\x87\xf2\x6d\xcb\xa5"
- "\xb1\x87\xee\x1d\x86\x72\x21\xd4\x76\x3a\x74\x00\xe1\xc1\xbf\x27"
- "\x6d\xb7\xcb\xc5\xfa\xfb\x64\x26\xc6\xaf\x85\x06\x43\x9c\xef\xb1"
- "\xbf\x16\xa7\x9e\xf0\xdd\x0f\x74\x65\x53\x0d\xc2\x63\x09\x95\x4d"
- "\x5f\xa3\xaa\x35\x76\x14\xbd\x14\xa1\x71\x36\x84\x70\x2c\xaa\xd2"
- "\xea\xd0\x84\x14\x14\x88\xc7\x9f\xed\x3f\x1a\x82\xab\x6a\xcd\x28"
- "\xdd\x0a\xcf\x78\xc9\x72\xe3\x19\x2b\xd7\x54\x22\x38\x77\x4f\x65"
- "\x92\x09\x05\xa4\x20\x35\x8e\xaf\x35\x2f\xcc\x30\x01\xea\xcf\xbc"
- "\x26\x9a\xc6\xb1\xc5\x31\xc5\xf1\xc5\xf9\x39\x62\x5e\x95\x60\x46"
- "\x2b\x2d\x48\x5d\x95\x01\xff\xa6\xd1\xe6\x2a\x74\x05\xc1\x33\xc6"
- "\xd0\x41\xdb\x72\x81\x17\x09\x98\x0b\x26\xea\xbb\x78\xc0\x3f\x58"
- "\x82\x53\xbb\x08\xa7\xfc\x1a\x3d\xe0\xd4\x5e\x8e\x53\xff\x3e\xc4"
- "\x71\xea\xf4\x36\x69\x4e\x9d\xba\xc6\x72\xca\xd8\x35\x39\x75\x6a"
- "\x93\x7b\x4e\x9d\x4a\x71\xc3\xa9\x52\xe0\x54\xa6\x90\x53\xa7\xf7"
- "\xc8\xe7\xd4\x29\x63\x27\x72\xaa\x58\x19\xa7\x4e\xed\x12\x72\xea"
- "\xdf\xfb\xa5\x39\xa5\x63\xdb\xa9\x3b\xcf\xb6\xcf\x29\x1d\xaf\x9d"
- "\xfa\x4f\x10\xc7\xa9\x1f\x2e\x4a\x73\xea\x87\xb1\x84\x53\xba\x2e"
- "\xda\x4e\xfd\xe7\x9c\x7b\x4e\xfd\xe7\xa8\x34\xa7\x74\xd0\x4e\xe9"
- "\x9c\xda\xa9\x1f\x6c\xf2\x39\xf5\x83\xa6\xf3\x38\xa5\x53\xd8\x4e"
- "\xfd\xc7\x22\xe4\xd4\x7f\xfc\xdd\x70\x8a\x6d\xa7\x82\xbe\xf1\x80"
- "\x53\xbc\x76\xca\x94\xc8\x71\xea\xec\x28\x69\x4e\x9d\x29\x64\x39"
- "\xd5\x45\xdb\xa9\x33\xc3\xdd\x73\xea\x4c\xa8\x1b\x4e\x41\x3b\xa5"
- "\x73\x6a\xa7\xce\xc6\xca\xe7\xd4\x99\xa4\x4e\xe4\x94\xc2\x76\xea"
- "\xcc\x38\x21\xa7\x4c\x53\xa4\x39\xa5\x67\xdb\xa9\xa1\x1b\xda\xe7"
- "\x94\x9e\xd7\x4e\x9d\x3d\xc0\x71\xaa\x36\x5f\x9a\x53\xff\xbd\x42"
- "\x38\xa5\xef\xa2\xed\xd4\x7f\xb3\xdd\x73\xea\xbf\xc9\xd2\x9c\xd2"
- "\x43\x3b\xa5\x77\x6a\xa7\x6a\x77\xcb\xe7\xd4\x7f\x0f\x76\x1e\xa7"
- "\xf4\x0a\xdb\xa9\xff\x16\x09\x39\x75\xb6\xc4\x0d\xa7\xd8\x76\xea"
- "\xe5\xa7\x3d\xe0\x14\xaf\x9d\x3a\xd7\x93\xe3\xd4\xf9\x0b\xd2\x9c"
- "\x3a\xff\x2c\xcb\xa9\x2e\xda\x4e\x9d\x3b\xe3\x9e\x53\xe7\x8c\x6e"
- "\x38\x05\xed\x94\xde\xa9\x9d\x3a\xdf\x22\x9f\x53\xe7\xd5\x9d\xc8"
- "\x29\x85\xed\xd4\xb9\x26\x21\xa7\xce\xf9\x4a\x71\xaa\x15\xfb\x3e"
- "\x1f\xe0\x54\x12\xf8\x3e\xe0\x50\x60\x35\xe1\x54\x1b\x70\xea\x7d"
- "\x3e\xa7\xfe\xed\xec\xfb\xfe\x37\xdd\x7e\x83\x53\x17\xe6\x3a\x73"
- "\xca\x0e\x9c\x6a\x63\x38\x55\xb7\xd6\xe1\xfb\xaa\x1a\x8a\x00\xab"
- "\x7a\x54\x15\x03\x7c\xda\xc2\xf2\xe9\xdf\xc0\x27\x28\x8f\x1d\xca"
- "\x5b\x7e\xaa\x06\x45\x9b\x49\xb9\x5a\xa1\xbc\x76\x3e\x97\x5a\xeb"
- "\x28\xcc\x21\xcc\x1d\x07\x8f\x2a\xe6\x01\x7f\x16\x9e\x40\x15\x4b"
- "\xe0\xb7\x0c\x7e\x19\xf0\x43\x27\x50\x79\x1d\x62\xc6\xec\x39\xfe"
- "\x54\xb3\xfc\xa9\xbb\xcf\x3d\x7f\xea\x90\x3c\x8f\x77\x21\x5d\x3e"
- "\x7f\xea\x62\xd8\xb9\x74\xea\xe8\xd8\x1f\x68\x3c\x07\x96\x70\xa4"
- "\x1e\x45\x5b\x51\x20\xfd\xb2\x21\x38\x20\x0e\xa9\x97\xdb\x10\x95"
- "\x3d\x03\xa9\xb3\xbf\x87\xf2\x3a\xea\xce\x59\x14\xf0\xb5\xe5\xcf"
- "\xa8\xbc\xb1\x06\x95\x5f\x3f\x8e\xca\xed\xf0\xab\x87\x1f\x3c\x63"
- "\x74\x22\xbf\xbc\x66\xb6\xbc\x17\x82\x20\x2f\x9d\x9b\xf2\x9a\x99"
- "\xf2\x26\x40\x79\x5b\xb9\xf2\x56\x01\x17\x01\x97\x7b\xec\xac\x4f"
- "\x8c\x36\xa3\xee\xf3\xad\x34\xdd\xca\x72\x10\xe3\xf2\xf5\x49\x0b"
- "\x8a\x4e\x01\xac\x5e\x05\x0e\xd6\x16\xa3\x95\x2b\x80\x83\xad\x16"
- "\xfc\x5e\xdf\x5c\x95\xd9\x02\x1c\xac\x1b\x4c\x43\xdc\xda\x30\x07"
- "\xff\x8d\x39\xf8\xbf\x38\xbb\x34\x07\x77\x11\x0e\x82\x4f\x6c\x9f"
- "\x83\xbc\x76\xed\xc2\x39\x8e\x83\x3f\x5e\x91\xe6\xe0\x8f\xdd\x1d"
- "\x3e\xf1\xa7\xe7\x60\xfd\x6e\xf7\x1c\xac\x5f\x23\xcf\x13\x36\xf8"
- "\xc8\xe7\x60\xfd\xc9\xce\xe3\xe0\x8f\xf9\xee\x39\xf8\x63\xaa\x07"
- "\x1c\x2c\x56\xc6\xc1\xfa\x52\x21\x07\x2f\x9c\x92\xe6\xa0\x8e\x6d"
- "\x07\xc1\x57\xb6\xcb\x41\xbe\xaf\x6c\x98\xcd\x71\xf0\xd2\x62\x69"
- "\x0e\x5e\xcc\x76\xf8\xca\x9f\x9e\x83\x17\x07\xba\xe7\xe0\x45\x7f"
- "\x79\x1e\xf2\xd2\x5a\xf9\x1c\xbc\x18\xd7\x79\x1c\xbc\xd4\xc7\x3d"
- "\x07\x2f\x5a\xda\xe7\xa0\x4e\x61\x3b\x78\x71\x84\x90\x83\x0d\xf1"
- "\x6e\x38\xc8\xb6\x83\xe0\x43\xdb\xe7\x20\xaf\x1d\xbc\x74\x91\xe3"
- "\xa0\xb9\x45\x9a\x83\xe6\x20\x87\x0f\xfd\xe9\x39\x78\x79\x9f\x7b"
- "\x0e\x5e\xce\x92\xe7\x39\xaf\x74\x97\xcf\xc1\xcb\xa7\x3a\x8f\x83"
- "\xe6\x42\xf7\x1c\x34\xaf\xf0\x80\x83\x0a\xdb\xc1\xcb\x46\x21\x07"
- "\x2f\xd5\x4a\x73\x50\xcf\xb6\x83\xe0\x5b\xdb\xe5\x20\xdf\xb7\x5e"
- "\x59\xc0\x71\xf0\x6a\xba\x34\x07\x1b\xf3\x1d\xbe\xf5\xa7\xe7\x60"
- "\xe3\x23\xee\x39\xd8\xa8\x96\xe7\x51\xaf\x66\xcb\xe7\x60\x63\x7c"
- "\xe7\x71\xf0\xea\x7d\xee\x39\x78\x15\xb5\xcf\x41\xbd\xc2\x76\xb0"
- "\x31\x4a\xc8\xc1\x2b\x49\x6e\x38\xc8\xb6\x83\xe0\x73\xdb\xe7\x20"
- "\xaf\x1d\xbc\x7a\x8d\xe3\xe0\x75\x1f\x69\x0e\x5e\xeb\xe3\xf0\xb9"
- "\x3f\x3d\x07\x9b\x3e\x73\xcf\xc1\xa6\x3c\x79\x9e\xf6\x7a\x90\x7c"
- "\x0e\x36\xd5\x76\x1e\x07\xaf\xed\x76\xcf\xc1\x6b\x6b\x3c\xe0\xa0"
- "\xc2\x76\xb0\xa9\x4c\xc8\xc1\xab\x0d\x52\x1c\xb4\x83\x2f\x6e\xdb"
- "\x15\x82\xec\x79\x23\x8a\x03\x7d\xb4\xc8\xaa\x79\x20\xa5\x2a\xb5"
- "\x09\x4d\xb8\x06\xf1\x49\xb9\x86\x5e\xb9\xa6\x46\xb6\xbc\x11\x5b"
- "\x41\x93\x1b\x78\xfe\x99\x99\x5b\x66\xcd\xdd\x96\xbb\x71\x1e\xf2"
- "\x05\xff\x3d\x03\x1f\xab\x3a\x6f\x41\xf8\xfe\xe9\xf8\x79\xea\xb9"
- "\xe7\xc1\xe3\x04\xf4\x65\x83\x9a\x79\xc7\xdc\x6a\x42\xb5\x23\x90"
- "\xaa\xbc\xd6\x04\x71\x58\xc6\xe0\x8b\xe3\x02\x78\xd6\xee\xb8\x84"
- "\x7c\xad\xff\x0d\xbd\x07\xe2\xad\xe9\xf9\x3a\xf2\xe9\x5b\x4b\xdb"
- "\x71\x5c\x71\xbc\x70\x8c\xb5\xcb\xf0\xbb\xeb\xe6\x21\x95\xc0\x31"
- "\xeb\x7f\x0d\xf7\x6c\x87\x74\xe2\x7e\xb5\x79\xa4\x7c\x6e\x34\xb3"
- "\xdf\xc3\x5e\x3f\x55\x0e\xbd\xa5\x44\xac\x76\x79\x18\xab\x62\x9e"
- "\xcf\xbb\x09\xb1\xb2\xa8\x3d\x8b\x95\x65\xba\x53\xac\x44\x7c\x95"
- "\x65\xb6\xfc\x58\x59\xd8\x75\x22\x2d\xfe\xd2\xb1\xd2\x79\xc8\x2b"
- "\x9d\x81\xe7\x47\x6e\x42\xac\x5a\x46\x78\x16\xab\x96\x6c\x61\xac"
- "\xc4\xf4\x7f\x4b\xbe\xfc\x58\xb5\xc4\x91\x58\xb5\x0c\x76\x13\x2b"
- "\x0f\x79\xa5\x2b\xe6\xe9\xe6\x9b\x10\xab\xd6\x24\xcf\x62\xd5\x7a"
- "\xc0\x29\x56\x22\x3a\xb5\xf5\x88\xfc\x58\xb5\xae\x21\xb1\x6a\x8d"
- "\x97\x8e\x95\xde\x43\x5e\xe9\x0d\x3c\x7d\x77\x13\x62\xd5\x96\xe7"
- "\x59\xac\xda\xce\x09\x63\x25\xa6\xa7\xda\x2e\xca\x8f\x55\x5b\x09"
- "\x89\x55\x5b\x96\x9b\x58\x79\xc8\x2b\x7d\x31\x4f\x87\xdc\x84\x58"
- "\x59\x8d\x9e\xc5\xca\x16\xe4\x14\x2b\x91\x7e\xdf\xd6\x47\x7e\xac"
- "\xac\xa7\x48\xac\xac\xa5\x52\xb1\xb2\xe5\x85\xe9\x02\x21\x06\x2d"
- "\x5b\xc2\x50\x60\x1a\xa2\x5a\x75\x10\x37\x0d\xc4\x6d\x95\x16\xf4"
- "\x13\xc4\xcd\x6c\x45\x13\x16\xfc\x40\x57\x36\xd8\x50\x2b\xc4\xac"
- "\x45\x13\x66\xa8\x32\xd7\xe1\x39\x47\x4f\x9c\xa5\xec\x2d\x2f\x2f"
- "\x50\x23\x1c\x37\x1c\x07\x1c\x3b\x1a\xe2\xc6\xc4\x51\x33\xda\x60"
- "\xd3\x0c\x8d\x1c\x7f\xf1\x07\x7a\xbe\x89\xa6\x71\x79\x69\xf5\x85"
- "\x22\xfc\x5e\x20\xba\x0e\x75\xd7\x3e\x8f\xcb\x64\xdf\x83\x8f\x57"
- "\x99\x6b\x40\x1f\x34\x22\x46\x9b\xfd\x60\xd0\xd8\x5e\x34\x04\xd8"
- "\xaa\xe2\x9e\xa3\x83\xeb\x8d\xd6\xde\x8f\xe5\xae\xbc\x88\xee\xc0"
- "\xfa\x21\xc7\x8e\x42\xd3\xe7\x22\xea\xa3\x39\x46\x8a\xf9\x76\x6d"
- "\x21\x93\xc7\x62\x88\x4b\x28\x7d\x95\x37\xa7\xfb\x6a\x12\xaa\x3a"
- "\x9f\xcb\xe0\xe6\xac\x11\x18\xdc\xfe\x65\x50\x83\xce\x8c\xa0\x35"
- "\x61\xc3\x72\x2b\x91\x96\x6e\x83\x18\x33\xdf\x13\xd1\xd3\x77\xb4"
- "\xca\x8d\xb1\x9d\x99\xff\x6d\xd7\xb2\xf3\xb7\x20\x4e\xf8\xfe\xcc"
- "\xfc\xad\x14\xde\xfc\x2d\x78\x66\x6e\xfe\x96\xdd\x17\xcf\xdf\xb2"
- "\xff\x10\x7a\x8f\xa3\xec\xf3\x93\x69\x1a\xca\x1e\x5c\xd9\x64\x46"
- "\xb8\xfc\x95\x4d\x46\xb4\x32\x15\xa9\x2b\x5b\xeb\x50\x46\x13\x6d"
- "\xae\xcc\xbc\x80\xa2\xaf\x61\x1d\x8c\xf9\x62\xbf\x42\x70\xb5\x1d"
- "\xb5\xff\x60\xb8\x07\xf2\xab\xab\xac\x46\x88\xf7\x1d\x4f\x12\x68"
- "\x66\x7f\xc0\x21\xa9\x2a\xf3\x2c\x02\x4c\x8c\x55\xd6\xef\x31\x4e"
- "\x49\x70\x7e\xc4\x0d\x7d\xdd\x7b\xe8\x5f\xf0\x31\x8c\x19\x7e\xdf"
- "\x84\xd7\x07\xd8\xc1\xd3\xdf\x98\x17\x81\x69\x99\xa8\x2a\xad\x15"
- "\x55\x5a\xf1\x37\xbb\xb6\x94\xbf\xc7\xd5\x48\xf1\x68\x17\xcb\xa3"
- "\xcc\xc0\x34\xbf\x46\x0f\x78\x54\x7c\x83\x47\x2a\x9f\x51\x5e\xf1"
- "\x48\x85\xae\x78\xcd\x23\x15\x3a\xe4\x05\x8f\x4a\x05\x3c\x52\xf9"
- "\xec\x91\xcd\x23\x15\x5a\x27\x9b\x47\x2a\x34\xce\x2b\x1e\xa9\x7c"
- "\x98\xf5\x25\x20\x9f\x00\x86\x47\x2a\x9f\x08\x8e\x47\xcc\xb7\x51"
- "\x37\x89\x47\x74\xa9\x34\x8f\x74\x6c\x7b\xa4\x83\xf6\xe8\xce\xb3"
- "\xed\xf3\x48\xc7\xb5\x47\x2a\xd5\x7a\xef\x78\xa4\x1a\xee\x3d\x8f"
- "\x54\x7e\xca\x79\xa4\x13\xb6\x47\x2a\xd5\x15\xf9\x3c\xa2\xaa\xe5"
- "\xf3\x88\xca\xf3\x8e\x47\xaa\x55\x84\x47\xd4\x44\xc2\x23\x55\x1a"
- "\xc7\x23\xe6\x7b\xb3\x9b\xc3\x23\x15\x85\xdc\xf0\x88\x6d\x8f\x74"
- "\xd0\x1e\x05\x7d\xe3\x01\x8f\x78\xed\x91\xdf\x09\xef\x78\xe4\xb7"
- "\xca\x7b\x1e\xf9\x8d\xf7\x82\x47\x4e\xed\xd1\x1d\xc3\xe5\xf3\xc8"
- "\x2f\x54\x3e\x8f\x7c\x4f\x79\xc7\x23\xbf\xe3\x84\x47\xbe\x05\x84"
- "\x47\x7e\x46\x8e\x47\xcc\x37\x7c\x37\x89\x47\xbe\x63\xa4\x79\xa4"
- "\x67\xdb\x23\x3d\xb4\x47\x43\x37\xb4\xcf\x23\x3d\xaf\x3d\xf2\xef"
- "\xe3\x1d\x8f\xba\x1d\xf7\x9e\x47\xdd\xf2\x95\xf3\x48\xef\xd4\x1e"
- "\xf9\xaf\x92\xcf\xa3\x6e\xf1\xf2\x79\xd4\x4d\xe7\x1d\x8f\xfc\x83"
- "\x08\x8f\xee\xa8\x25\x3c\xf2\xf7\xe7\x78\xc4\x7c\x17\x79\x93\x78"
- "\x74\x47\xae\x1b\x1e\xb1\xed\x91\x1e\xda\xa3\x97\x9f\xf6\x80\x47"
- "\xbc\xf6\xa8\xc7\x74\xef\x78\xd4\x23\xc8\x7b\x1e\x75\x3f\xed\x05"
- "\x8f\x9c\xda\xa3\x1e\xc7\xe5\xf3\xa8\x7b\xb1\x7c\x1e\x75\x4f\xf6"
- "\x8e\x47\x3d\x26\x13\x1e\x75\x0f\x27\x3c\xea\x11\xc3\xf1\x88\xf9"
- "\xd6\xf4\x26\xf1\xc8\xbf\x46\x8a\x47\x78\x2d\x82\x77\xc8\xba\x10"
- "\x4d\x1b\x97\xa1\x61\x3b\xf0\xbf\xad\x28\xa2\x39\xe7\x4e\x74\x64"
- "\x05\x59\x0f\x00\x9e\x93\x19\xef\x15\xbb\xfe\xce\x3d\x80\x8b\x26"
- "\x4c\x1b\x7d\x9a\xac\xd1\x80\xd7\x05\xb9\xba\x32\x09\x3d\x8c\xd7"
- "\x65\x50\x05\x0c\xc3\xeb\x58\xdd\x58\x3b\x40\x23\xb1\x76\xc0\x4b"
- "\xd2\x6b\x07\xb4\x6e\x71\x7c\x77\x5b\xcc\x7d\x77\xab\x0a\xf0\x73"
- "\xfb\xdd\xad\xea\xce\x8b\x85\x2f\xc9\xe5\xc3\x9d\xcc\xf7\x5f\x57"
- "\x7b\x87\x21\x28\x3b\x2e\xf3\x49\x52\xf6\x00\x66\xbd\x95\xf6\xbf"
- "\xc7\x2d\xe6\xf1\xe4\xce\xe2\x49\x53\x50\x26\xbd\xe1\x6b\x2b\x1d"
- "\x12\xa6\xa5\xf3\xc3\x22\xe4\x3d\x4b\x40\x54\x3b\xf1\x2e\x12\x8f"
- "\x77\xcf\x62\x36\xde\x99\x6c\xbc\xc5\xd7\x2d\x78\x49\x7a\xdd\x02"
- "\xf1\x78\xf7\x74\xff\x9d\xb3\xaa\xe7\x54\xf9\xf1\xee\x69\x60\xe3"
- "\x9d\xd9\x9c\xd3\x33\x99\x8b\x77\xcf\x3a\xf9\xf1\xee\x19\x4a\xe2"
- "\xfd\x77\x33\xc4\xbb\x08\xe2\x5d\x22\xf3\x59\xf6\xbb\x8f\xb7\x4e"
- "\x82\xdf\x81\xa1\x24\xde\xec\x9a\x09\x1a\x89\x35\x13\x5e\x92\x5e"
- "\x33\x41\x3c\xde\xbd\xce\xb9\x8f\x77\xaf\x0a\xf9\xf1\xee\xb5\x95"
- "\xc4\x5b\x07\xfc\xee\x75\x8a\x8b\x77\xa0\x87\xeb\x0a\xf0\xe3\xdd"
- "\x6b\x1d\x89\x77\x79\x2d\x1d\xa2\x03\x7e\xeb\x64\xf2\x3b\x50\xd7"
- "\x4e\xbc\x25\xf8\xad\x5e\xc7\xc6\x9b\xe5\xb7\xc4\x7a\x0d\x2f\x49"
- "\xaf\xd7\x20\x1e\x6f\xf5\x24\xf7\xf1\x56\x8f\x94\x1f\x6f\xb5\x3f"
- "\x1b\x6f\xe0\xb7\x7a\x1c\x17\x6f\x75\x99\xfc\x78\x07\x5a\x48\xbc"
- "\x2b\x6a\x20\xde\xc0\x6f\x9d\x4c\x7e\xab\xf3\xdc\xc7\x5b\x2f\xc1"
- "\xef\x20\x0b\x89\x37\xbb\x56\x84\x46\x62\xad\x88\x97\xa4\xd7\x8a"
- "\x10\x8f\x77\xd0\x31\xf7\xf1\x0e\xda\x27\x3f\xde\x41\x69\x24\xde"
- "\x7a\xe0\x77\xd0\x41\x2e\xde\xc1\xc3\xe4\xc7\x3b\x28\x89\xc4\xbb"
- "\xb2\x9c\x0e\xd1\x03\xbf\xf5\x32\xf9\x1d\xec\xdb\x4e\xbc\x25\xf8"
- "\x7d\x57\x12\x1b\x6f\x96\xdf\x12\xeb\x54\xbc\x24\xbd\x4e\x85\x78"
- "\xbc\xef\x1a\xe2\x3e\xde\x77\xf5\x93\x1f\xef\xe0\x3a\x36\xde\xc0"
- "\xef\xbb\xc2\xb9\x78\xdf\x55\x2c\x3f\xde\xc1\x35\x24\xde\x55\x46"
- "\x88\x37\xf0\x5b\x2f\x93\xdf\x77\xa5\x4a\xc5\x3b\x10\xe2\x7d\x0c"
- "\x74\x0c\xf4\x83\x06\x7b\x1e\xe8\x14\x9b\x30\xee\x55\x69\xc3\xd0"
- "\x43\xd7\x71\xec\x43\x26\x42\xdf\x61\xe8\xb4\xf5\x32\x54\x21\x23"
- "\xbd\xfe\x76\x58\x15\xd2\x5d\xf2\xdb\x61\x95\xe6\x8a\xec\x6f\x87"
- "\x55\x9a\x83\x9c\x06\x0a\x41\x1c\xa6\x21\x4c\xfb\x21\xeb\x9b\x62"
- "\x95\x66\xaf\xe8\x3a\x1a\x2a\xcd\x14\xfc\x4d\x31\xbd\xa1\x7a\xbf"
- "\x3d\x5f\x89\x36\x0a\x89\xf7\x00\xeb\x62\xc0\xa1\x48\x1a\xeb\xbb"
- "\x23\x01\xeb\xe2\x4e\x5b\xb7\x43\x75\xf7\x40\xef\xb1\xee\x7d\x4d"
- "\x1a\xeb\xde\xa7\xe5\x63\xdd\xbb\x98\xd3\x5f\xbd\x1b\x38\xac\xef"
- "\xce\x94\x8f\x75\xef\xad\xa2\xeb\x79\xa8\x7a\x8f\x21\x58\x7f\x13"
- "\x0a\x58\x2b\xd0\x65\x77\x8f\x6b\x1f\x6b\x1d\xd4\x6b\x9d\x9b\x7a"
- "\xdd\x27\x1c\xfa\x4c\x43\xa7\xad\x1f\xa2\xea\x13\xe2\x3d\xd6\xa1"
- "\x67\xa4\xb1\x0e\x3d\x2e\x1f\xeb\xd0\x3c\x4e\xfb\x85\xd6\x70\x58"
- "\xf7\x49\x96\x8f\x75\xe8\x1a\xd1\x75\x45\x54\xa1\x83\x09\xd6\xff"
- "\x58\x61\xcf\x57\xa2\x09\xfb\x0c\xf3\x00\x6b\xa8\xd7\x3a\x37\xf5"
- "\xfa\x17\xa1\x80\x75\x71\xa7\xad\x63\xa2\xfa\x85\x8f\xf7\x58\xdf"
- "\x53\x21\x8d\xf5\x3d\x9f\xc9\xc7\xfa\x9e\x4c\x4e\x77\xde\x73\x94"
- "\xc3\xfa\x17\x71\xf2\xb1\xbe\x27\x45\x74\x7d\x13\xd5\x3d\x5a\x82"
- "\xf5\x49\x13\x60\xad\x40\x8f\xfe\x42\x52\xff\x73\x58\xeb\xa1\x5e"
- "\xeb\xdd\xd4\xeb\x7e\xbe\xa0\x15\x0c\x9d\xb6\x9e\x8a\xaa\xef\x45"
- "\xef\xb1\xee\x7b\x40\x1a\xeb\xbe\x3b\xe5\x63\xdd\x37\x99\xd3\xbc"
- "\x7d\x4b\x38\xac\xfb\x45\xc9\xc7\xba\xef\x14\xd1\x75\x56\x54\x7d"
- "\x03\x08\xd6\xff\x8c\xb2\xe7\x2b\xd1\xc2\xfd\xd4\x1e\x60\x0d\xf5"
- "\x5a\xef\xa6\x5e\xf7\x07\x5f\xaf\x2f\xee\xb4\x75\x5d\x54\xfd\xbf"
- "\xf3\x1e\xeb\xfe\xbb\xa5\xb1\xee\x9f\x2d\x1f\xeb\xfe\x71\x9c\xde"
- "\xee\x5f\xc0\x61\x7d\x6f\x84\x7c\xac\xfb\x8f\x11\x5d\xef\x45\xd5"
- "\xcf\x42\xb0\xfe\x57\x31\x60\xad\x40\x87\xf7\x97\xdc\xff\xc0\x9d"
- "\x0e\x5f\x54\x88\xfc\x85\x78\x6b\x4d\x9d\xab\xc5\xb5\xc7\xbd\xc7"
- "\x5b\x9b\x2f\x8d\xb7\x36\x5d\x3e\xde\xda\x31\x9c\x16\xd7\x66\x71"
- "\x78\xdf\xa7\x95\x8f\xb7\x76\x98\xb8\x16\xbf\xb7\xce\x3b\x2d\xae"
- "\x6d\x50\xa2\xc5\x5d\xf1\x1e\x50\xdd\xb9\x7a\x7c\xc0\x01\xef\xf1"
- "\x1e\xb0\x56\x1a\xef\x01\x73\xe5\xe3\x3d\x60\x18\xa7\xc7\x07\xac"
- "\xe0\xf0\x0e\x53\xcb\xc7\x7b\x80\x41\x5c\x8f\xdf\x57\xe3\x9d\x1e"
- "\x1f\x70\x4a\x89\x1e\x77\xc5\x5b\x67\xec\x5c\x4d\xae\xdb\xe3\x3d"
- "\xde\xba\xc5\xd2\x78\xeb\xa6\xca\xc7\x5b\x67\xe0\x34\xb9\x8e\x37"
- "\xfe\xad\x47\xf2\xf1\xd6\x85\x8a\x6b\xf2\xb0\x32\xef\x34\xb9\xae"
- "\x5c\x89\x26\x77\xc5\xfb\xfe\x92\xce\xd5\xe5\xf7\x6f\xf3\x1e\xef"
- "\xfb\x13\xa5\xf1\xbe\x7f\xbc\x7c\xbc\xef\x0f\xe5\x74\xf9\xfd\x53"
- "\x38\xbc\xef\x97\xbf\x7e\xa6\xea\x7e\x7f\x71\x5d\xae\x2f\xf5\x4e"
- "\x97\xdf\x7f\x50\x89\x2e\x77\xc5\xdb\x50\xd4\xb9\xda\xdc\xb0\xde"
- "\x7b\xbc\x0d\x93\xa4\xf1\x36\x8c\x94\x8f\xb7\xc1\x9f\xd3\xe6\x06"
- "\xde\xf8\xbf\xc1\x24\x1f\xef\x07\x2c\xe2\xda\xfc\x81\x62\xef\xb4"
- "\xb9\x61\xaf\x12\x6d\xee\x8a\xf7\x83\xb9\x9d\xab\xcf\x1f\x5c\xea"
- "\x3d\xde\x0f\x3e\x2b\x8d\xf7\x83\x83\xe4\xe3\x3d\xd0\xc2\xe9\xf3"
- "\x07\x47\x70\x78\x3f\x58\x2d\x1f\xef\x81\x75\xe2\xfa\x7c\xe0\x56"
- "\xef\xf4\xf9\x83\x05\xde\x8f\x93\x0f\x4a\xc6\xda\x5c\xee\xfa\x8f"
- "\x55\xa9\xec\x37\x77\xaa\x5f\x72\xeb\x3f\xaa\x06\x4d\x45\x52\x6b"
- "\xcb\xa8\xc2\x0f\x74\xe9\xf5\x1f\x55\xe1\xee\xd7\x7f\x54\x85\xcb"
- "\x5b\xff\x51\x15\xbe\x53\xf6\x7c\x7c\x55\x78\x32\xe7\x11\xc2\x79"
- "\xfe\x7f\x10\xd9\xa3\xb8\x2b\xaf\x0b\xa9\x0a\x17\xae\x0b\xa9\xfa"
- "\x25\xb3\x2e\x24\xbd\xe1\xbb\x00\x65\x5e\x64\x50\x9a\xf7\xef\x05"
- "\x22\xc6\x60\x1f\x22\x77\x1d\x4a\x8e\xdb\x0f\x3d\xcb\x71\x3b\x62"
- "\xb8\x34\xb7\x1f\xce\xef\xd2\xeb\x50\xaa\x1e\xee\xe3\x9e\xdb\x0f"
- "\x59\x64\xad\x39\xa2\x7a\x58\xfe\xba\x37\xaa\x87\xc7\x70\x7e\xe8"
- "\x61\x9e\xff\x8d\x58\xd7\x89\xdc\x56\xb6\x9e\x92\xea\xe1\x70\x21"
- "\xb7\x1f\x1a\x41\xb8\xfd\xef\x78\x65\xbe\x2b\x62\xa2\xf7\xef\x41"
- "\x1e\xd3\x61\xcf\x25\x77\x3d\x4c\x8e\xdb\x8f\xdc\xc7\x71\xfb\xb1"
- "\x10\x69\x6e\x3f\xba\xa0\x4b\xaf\x87\xa9\x7a\xe4\x9a\x7b\x6e\x3f"
- "\x72\x52\xd6\x5a\x26\xaa\x47\x27\xcb\xe7\xf6\xa3\x3a\xce\xfb\x3d"
- "\x9a\xc4\x71\xfb\xb1\x84\xce\xe3\xb6\xc2\x75\x32\x55\x8f\xfa\x0b"
- "\xb9\xfd\x48\x28\xe1\xf6\xe9\xfd\xca\x3c\xe6\x63\x11\xde\xbf\xf7"
- "\x19\x8a\xb0\xbf\x94\xbb\x2e\x27\xc7\xed\xc7\x6c\x1c\xb7\x87\xb8"
- "\xac\x0b\xc5\x71\x7b\xc8\xf8\x2e\xbd\x2e\xa7\x6a\xf0\x09\xf7\xdc"
- "\x1e\x5c\x22\x6b\x8d\x14\xd5\x90\x21\xf2\xb9\x3d\x04\x71\x3e\x77"
- "\x48\x14\xc7\xed\xa1\x91\x9d\xc8\x6d\x85\xed\xf6\xe0\x5a\x21\xb7"
- "\x1f\x6b\x22\xdc\x36\xf9\x2b\xf3\xd3\x43\x03\xbc\x7f\xcf\x35\xec"
- "\x14\xf6\xd2\x72\xd7\x07\xe5\xb8\x3d\xf4\x3b\x8e\xdb\xc3\x2a\xa4"
- "\xb9\x3d\x6c\x60\x97\x5e\x1f\x54\xf5\x2b\xf7\xeb\xff\xa8\x7e\xe5"
- "\x66\xfd\x1f\x91\x6f\x85\x55\xc3\xe4\xaf\x7b\xa1\xfa\xd5\x29\xce"
- "\xd3\x0f\xd3\x72\xdc\x1e\xde\xb7\xf3\xb8\xad\x70\xdd\x50\xd5\xaf"
- "\x8c\x42\x6e\x0f\xad\x26\xdc\x3e\x3b\x45\xd9\xd8\xc1\xb0\x3a\xef"
- "\xdf\xeb\x3d\x51\x8a\xc7\x0d\xe4\xae\x53\xca\x71\x7b\xf8\x67\x1c"
- "\xb7\x9f\xd8\x23\xcd\xed\x27\xfc\xba\xf4\x3a\xa5\xaa\xc7\xd7\xbb"
- "\xe7\xf6\xe3\x49\xb2\xd6\x74\x51\x3d\x2e\xff\x3b\x78\xd5\xe3\xa5"
- "\xdc\xf8\xc5\xe3\xbc\xf9\xef\x4f\x58\x3a\x91\xdb\x0a\xdb\xed\xc7"
- "\x0b\x84\xdc\x1e\xbe\x97\x70\xbb\xb6\x44\xd9\x38\xc9\x13\x47\xbd"
- "\x1f\x27\x79\xf2\x28\xf3\x0e\x53\xe6\x7a\xa9\x1c\xb7\x47\x6c\xba"
- "\xb1\x36\x91\xea\xc9\xcf\x9c\xb9\x7d\x63\x6d\x22\xd5\xc8\x8a\x2e"
- "\xb3\x5e\xaa\x6a\x64\xac\x7b\x1e\x8f\x8c\x90\x37\x26\x32\xf2\x33"
- "\xf9\x3c\x1e\x99\xc9\x8d\x89\x8c\xe4\xcd\x7f\x79\xca\xb1\x27\xf9"
- "\xcd\x5f\xb3\x48\xf5\xe4\x64\xb7\x6b\x16\xa9\x9e\x1c\x76\xd3\xd6"
- "\x51\x55\x8d\x4c\x10\xac\x59\xa4\x1a\xb1\xce\xce\xd4\x85\xff\xf9"
- "\x2a\x1b\x57\x79\x52\x72\x8f\x60\xcf\xc7\x55\x46\x91\xf7\xbb\x32"
- "\xd7\x6d\xe5\xea\xc2\x53\x85\x5c\x5d\x18\x75\x44\xba\x2e\x44\x7e"
- "\xd7\x65\xd6\x6d\x55\x45\x4e\x75\x5f\x17\x22\x47\xc8\x1b\x43\x89"
- "\x94\xbf\x0e\x8c\x2a\x32\x8b\x1b\x43\x89\xac\xe6\xea\xc2\xd3\xea"
- "\xce\xab\x0b\xa3\x12\xdd\xd7\x85\x51\x51\x37\x6d\x3d\x57\x55\x64"
- "\x8a\xb0\x2e\x3c\x95\x47\xea\xc2\x85\x75\xca\xc6\x61\x46\x29\x7a"
- "\xff\x2d\xac\x0b\x51\xa7\x98\x77\xdf\x32\xd7\x8f\xe5\xea\xc2\xd3"
- "\x7b\xb8\xba\x10\xe5\xa2\xe7\xb9\xba\xf0\xcc\xb9\x2e\xb3\x7e\xac"
- "\xea\x99\xd9\xee\xeb\xc2\x33\x63\xe4\x8d\xb9\x3c\x53\x21\xbf\x2e"
- "\x3c\xc3\xfb\xfe\xe9\x19\xde\xf7\x4f\xcf\xf6\xed\xbc\xba\x10\xb5"
- "\xc0\x7d\x5d\x88\x8a\xb9\x69\xeb\xca\xaa\x9e\x59\x21\xac\x0b\x4f"
- "\x17\x91\xba\xd0\x10\xa0\x6c\xdc\x26\xca\x03\xfd\xdf\xde\xb8\xcd"
- "\x73\x75\xcc\xbc\x00\x99\xeb\xd8\x72\x75\xe1\xd9\xcf\xb8\xba\xf0"
- "\xdc\x77\xd2\x75\x61\xf4\x95\x2e\xb3\x8e\xad\x6a\xf4\x62\xf7\x75"
- "\x61\xf4\x44\x79\x63\x34\xa3\xbf\x93\x5f\x17\x46\xef\xe2\xc6\x68"
- "\x46\xd7\x71\x75\x61\x8c\xa1\xf3\xea\xc2\x73\xe9\xee\xeb\xc2\x73"
- "\x53\x6e\xda\xfa\xb6\xaa\xd1\xeb\x84\x75\xe1\xd9\xbd\xa4\x2e\x5c"
- "\xca\x55\x36\xce\xf3\x5c\x93\xf7\xe3\x3c\xbf\x6e\x62\xe6\x4c\xc8"
- "\x5c\x4f\x97\xab\x0b\x63\x8e\x70\x75\xe1\xd7\xe7\xa4\xeb\xc2\x58"
- "\x5b\x97\x59\x4f\x57\x35\x76\x95\xfb\xba\x30\x36\x5e\xde\x98\xce"
- "\xd8\x73\xf2\xeb\xc2\xd8\x12\x6e\x4c\x67\x6c\x13\x57\x17\x7e\x33"
- "\xb8\xf3\xea\xc2\xaf\xd7\xbb\xaf\x0b\xbf\x4e\xba\x69\xeb\xec\xaa"
- "\xc6\xe6\x09\xeb\xc2\x98\x52\x52\x17\xae\x68\x94\x8d\x0b\xfd\x06"
- "\x79\x3f\x2e\x34\x01\x31\xf3\x49\x64\xae\xeb\xcb\xd5\x85\xdf\x54"
- "\x70\x75\x61\xbc\xf4\x3e\x0f\xaa\xf1\xdd\xbb\xcc\xba\xbe\xaa\x71"
- "\xee\xf7\x3f\x52\x8d\x73\xb7\xff\x91\xc8\x18\xd0\xb8\x2b\xf2\xeb"
- "\xc2\xb8\x83\xdc\x18\xd0\x78\xde\xf7\x7f\x13\x22\x3b\xaf\x2e\x8c"
- "\x77\xbf\xff\x83\x6a\xbc\x07\xfb\x3f\x28\x5c\xef\x57\x35\xae\x48"
- "\x58\x17\x7e\x73\x94\xd4\x85\xab\x5b\x95\x8d\x23\x4d\x68\x77\xfc"
- "\x1f\xfb\xfc\x36\x8d\xeb\x38\x52\x79\xed\x30\xf4\xcb\x97\x70\x5d"
- "\x88\xde\x6f\xcd\x0f\x33\xe0\xf5\x85\x6d\x3a\x76\x0d\xca\x55\xec"
- "\x1a\x2f\x4d\x56\xb2\x06\xa5\xd9\x76\x63\x0d\x4a\xb2\xf6\x07\xa2"
- "\xf0\xb7\xc0\xf8\x9b\x60\xab\x9a\xac\x3f\x49\xe3\x39\x51\x78\x8e"
- "\xd4\xd9\x32\x66\x7d\x95\x15\x56\x28\xfb\xf9\x76\xd6\x9f\x8c\x37"
- "\xa1\xf2\xf8\x65\xc8\x1a\xb4\x2d\x97\x7c\x27\x1c\x1d\xc5\xac\x3f"
- "\x39\x2d\xf4\x9e\x9c\xff\x20\x4d\x20\x5e\x7f\x32\x9e\xb6\xaf\x34"
- "\xd1\xe6\x4a\x0b\x82\xb4\x10\xdf\xe9\xec\x1a\x94\xaa\xe8\x7d\xb8"
- "\xec\xd6\x69\x86\x7b\xb6\xff\x47\x62\x7d\x61\x55\xb4\xfc\x75\x60"
- "\x55\xd1\xf1\xdc\xf8\x4e\xf4\x2e\x8e\xa3\xd1\x4c\x1f\x0c\xff\x8e"
- "\x28\x8f\x83\x36\x66\xc3\xf5\xbe\x6d\x8a\xd6\xde\x88\x36\x7a\x80"
- "\x19\x9e\x23\xe2\xd2\x7e\x71\x98\xc5\x26\x01\x66\xc5\x78\x9d\x63"
- "\xcf\x31\xf3\x6b\xbc\x39\x98\xc5\x58\x3c\xc7\x2c\x76\xba\x13\x66"
- "\x22\xe3\x10\xb1\x63\xe5\x63\x16\xab\xe1\xc6\x21\x62\xe3\x38\xcc"
- "\x62\x8b\x09\x66\x31\x66\x82\x59\xf3\x98\x36\x45\xeb\x77\xc4\xb6"
- "\xfb\xfd\x37\xf6\x4d\x6d\x1a\x57\x5f\xce\x61\xf6\xdb\xbe\xd6\x7c"
- "\xf0\xee\xe0\xcb\x3d\xc7\xec\xce\xb3\x37\x07\xb3\xe7\xf7\x7a\x8e"
- "\xd9\x6f\x43\x84\x98\x89\xf9\xe5\xe7\xe5\xef\xd9\xa9\x7a\xbe\x8c"
- "\xf3\xcb\xbf\x0d\xe0\x30\xfb\xed\x14\x82\xd9\xf3\xbb\x08\x66\x96"
- "\xd4\x36\x45\x6b\x80\xfc\xd6\xe0\x01\x66\xf8\x9d\xbe\x9b\x7a\x36"
- "\xb1\x1a\x30\x2b\xc6\xeb\x3e\x7b\x8e\x59\xd0\x37\x37\x07\xb3\x89"
- "\xf1\x9e\x63\x36\xf1\xb8\x13\x66\x22\xbe\x6e\xe2\x27\xf2\x31\x9b"
- "\xb8\x82\xf3\x75\x13\x8d\x1c\x66\x93\xd4\x04\xb3\x89\x71\x04\xb3"
- "\x16\xd0\x3f\x4a\x7c\xce\xc4\x76\xc7\xbf\xb0\x0e\x6d\xd3\xb8\xfa"
- "\x1c\x0e\xb3\x17\xd6\x58\xf3\xc1\x0b\x81\xcf\xf1\x1c\xb3\xa1\x1b"
- "\x6e\x0e\x66\x2f\x68\x3c\xc7\xec\x85\x74\x21\x66\x62\xfe\xe3\x85"
- "\x44\xf9\x98\xbd\x10\xc1\xf9\x8f\x17\x52\x39\xcc\x5e\x38\x4a\x30"
- "\x7b\x21\x80\x60\xd6\x5a\xde\xa6\x68\x2d\x92\x17\x72\x3d\xc0\x0c"
- "\xbf\x83\x75\x53\xcf\xe2\x86\x01\x66\xc5\x78\x1d\x6c\xcf\x31\x7b"
- "\xf9\xe9\x9b\x83\xd9\x8b\x65\x9e\x63\x16\xf7\x88\x13\x66\x22\x3a"
- "\x39\x4e\xfe\x3a\xd8\xaa\x17\x6b\x39\x9d\x1c\x67\xe0\x30\x8b\x4b"
- "\x23\x98\xbd\x68\x24\x98\xb5\x59\xda\x14\xad\x67\x12\x27\xb9\xfe"
- "\x97\x3b\xdd\xe8\x98\x97\xcf\xe1\x36\xd9\xdc\x75\xb4\xe3\xe4\x4c"
- "\xcf\x71\x9b\x7c\xa1\x7d\xed\x38\xf9\x84\x7c\xdc\x26\x17\x70\xda"
- "\x71\xb2\x89\xc3\xed\xa5\x08\x82\xdb\xe4\x34\xef\xb4\xe3\xe4\x76"
- "\xbf\x7f\x15\xd3\x8e\xae\xb8\xbd\x5c\xdc\x75\xf4\xe3\xcb\xc3\x3c"
- "\xc7\xed\xe5\x9d\xed\xeb\xc7\x97\xd7\xcb\xc7\xed\xe5\x89\x9c\x7e"
- "\x7c\x79\x2b\x87\xdb\xcb\x75\x04\xb7\x97\x23\xbc\xd3\x8f\x2f\x4b"
- "\xae\xff\xe6\x4e\x3f\xba\xe2\x36\x35\xbe\xeb\x68\xc8\x29\x66\xcf"
- "\x71\x9b\x3a\xb9\x7d\x0d\x39\x75\x94\x7c\xdc\xa6\x06\x70\x1a\x72"
- "\x6a\x0c\x87\xdb\xd4\x22\x82\xdb\x94\x3a\xef\x34\xe4\xd4\x64\x25"
- "\x1a\xd2\x15\xb7\x69\xa1\x5d\x47\x47\xbe\x52\xec\x39\x6e\xd3\x82"
- "\xda\xd7\x91\xaf\xc8\xdf\xb3\x58\xf5\xca\x51\x4e\x47\x4e\xf3\xe7"
- "\x70\x9b\x46\xf6\x60\x51\xbd\x52\xe4\x9d\x8e\x9c\xd6\xee\xfa\x1f"
- "\x62\x3a\xd2\x15\xb7\xf8\xea\xae\xa3\x25\xe3\x65\xe8\xff\xf8\xe3"
- "\xed\x6b\xc9\x78\x05\xfa\x3f\x7e\x05\xa7\x25\xe3\x79\xfa\x7f\x3a"
- "\xab\xff\xe3\xe3\xbc\xd3\x92\xf1\x9e\xe8\x7f\x17\x2d\xe9\x8a\xdb"
- "\x8c\x75\x5d\x47\x4f\xce\x08\xf5\x1c\xb7\x19\xab\xda\xd7\x93\x33"
- "\xe4\xef\x03\xa5\x9a\x31\x98\xd3\x93\x33\xd2\x38\xdc\x66\x94\x11"
- "\xdc\x66\xa8\xbd\xd3\x93\x33\x24\xd7\x7f\x74\xe0\x66\xd3\x84\x19"
- "\x68\x91\x71\xc8\x8a\xa4\x61\xec\xda\x84\x89\x71\xb6\x90\x30\x83"
- "\xdc\xfd\x5d\x1c\x6b\x4e\x1f\x4f\x42\xe8\xac\x2a\xe1\x8a\x77\xeb"
- "\x4e\x27\xec\xf4\x7e\xdd\xe9\x84\xb9\x1d\xb6\xbf\x8b\x2a\x61\x92"
- "\xfc\x75\xa7\x13\xb4\x9c\x06\x4d\x48\xe0\xb0\x4e\x64\xe6\x27\xc8"
- "\x5b\x8f\xfa\xd5\x5a\xef\xd6\xa3\x4e\xb8\x40\xf8\xf5\xea\x2e\xb2"
- "\x1e\x75\x82\xa9\x53\xf6\x7d\x51\xbd\x1a\x83\xd7\xa3\xa6\x37\xd8"
- "\x74\xca\xd6\x47\x4e\x4c\xf0\x80\xcf\xc5\xb4\xc8\x18\x2d\xc7\xe7"
- "\x24\x03\xf0\xb9\x58\xee\x3e\x33\x42\x3e\xcf\x3a\xe2\x1d\x9f\x67"
- "\x2d\xf0\x9e\xcf\xb3\x46\x76\xdc\x3e\x33\xb3\xf4\xf2\xf9\x3c\xd3"
- "\xcc\x69\xf3\x59\x83\x39\x3e\x27\x25\xc9\xe7\xf3\xcc\xfd\xde\xf1"
- "\x79\xd6\x01\xc2\xe7\x99\xa9\x84\xcf\xb3\x4a\x3a\x65\xff\x19\xd5"
- "\x4c\x2d\xe1\x33\x9d\xac\x6c\xfd\xe9\xa4\xc1\xed\xf3\x59\x67\xa0"
- "\x45\xc6\xaf\x39\x3e\xcf\xb1\xd8\x42\x74\x06\xb9\xfb\xdd\x08\xf9"
- "\x3c\x67\x93\x77\x7c\x9e\x33\xca\x7b\x3e\xcf\xe9\xd9\x71\xfb\xdd"
- "\xcc\xbe\x26\x9f\xcf\xb3\x8d\x9c\x67\x99\xe3\xcb\xf1\xf9\xb5\x61"
- "\xf2\xf9\x3c\x7b\x8d\x77\x7c\x9e\xb3\x9e\xf0\x79\x76\x14\xe1\xf3"
- "\x9c\xcc\xce\xd9\x07\x27\xc9\xcc\xf0\x39\xc7\x67\xbf\xb2\xf5\xbd"
- "\x5f\x93\x5c\xff\x98\xc7\xe7\x62\x5a\x64\x6c\x9f\xe3\xf3\xdc\x32"
- "\xe0\x73\xb1\xdc\x7d\x77\x84\x7c\x9e\xeb\xe5\x3e\x17\x73\x3b\x60"
- "\x9f\x8b\x64\x2f\xf6\xb9\x70\xde\x77\x27\xf9\x98\x7c\x3e\x27\xe7"
- "\x72\x5e\x2e\xf9\x24\xc7\xe7\x79\xfe\xf2\xf9\x9c\x3c\xd1\x3b\x3e"
- "\xcf\x65\xf7\xbf\x48\xd6\x10\x3e\xcf\x8d\xe9\x9c\xfd\x78\x5e\x33"
- "\x12\x3e\xab\xac\xca\xd6\x4f\x9f\x7b\xb2\x7d\x3e\xeb\x0d\xb4\xc8"
- "\x7b\x0f\x8e\xcf\x29\x5b\x6d\x21\x7a\x83\xdc\xfd\x7f\x84\x7c\x4e"
- "\x79\xc4\x3b\x3e\xcf\x3f\xe3\x3d\x9f\xe7\xef\xeb\xb8\xfd\x7f\xe6"
- "\xe7\xcb\xe7\xf3\xfc\x78\xce\xe3\xce\xe7\xbd\xff\x4f\xa9\x91\xcf"
- "\xe7\xf9\x5e\xee\x0b\x94\x32\x90\xf0\x79\x1e\xbb\x2f\x50\x8a\xb6"
- "\x73\xf6\x05\x9a\x97\x4b\xf8\x7c\x47\x94\xb2\xf5\xe9\x53\x76\x79"
- "\xc0\xe7\x62\x5a\xe4\x9d\x10\xc7\xe7\x45\x49\xc0\xe7\x62\xb9\xfb"
- "\x10\x09\xf9\xbc\xc8\xc7\x3b\x3e\x2f\xfc\xc4\x7b\x3e\x2f\x4c\xef"
- "\xb8\x7d\x88\x16\x26\xca\xe7\xf3\x42\xc7\xfb\x3f\x68\x9f\x17\xf2"
- "\xde\xff\x2d\x52\xb0\x3f\xd1\x82\x26\xef\xf8\xbc\xb0\x85\xf0\x79"
- "\xc1\x7e\xc2\xe7\x85\xe6\xce\xd9\x9f\x68\x41\x3c\xe1\xb3\x7f\x96"
- "\xb2\xf5\xff\x17\xb5\x3b\xff\x43\x6c\x7c\xc3\x31\x2e\xc5\x71\x7a"
- "\xc9\x08\xef\xc7\x38\x16\x7f\xeb\x1d\xa7\x17\xaf\xf5\x9e\xd3\x8b"
- "\x63\x3b\x6e\x8c\x63\xb1\x82\xbd\xfe\x16\xfb\x72\x63\x1c\x8b\xc7"
- "\x70\x9c\x5e\xb2\x42\x3e\xa7\x53\xcb\xbc\xe3\xf4\xe2\x0a\xc2\xe9"
- "\xd4\x75\x84\xd3\x8b\x8f\x76\xce\x18\x47\xea\x60\xef\xc6\x38\x96"
- "\x8c\x51\x32\xc6\xe1\xca\xe9\xa5\x6a\xef\xc7\x39\xd2\xf6\x78\xc7"
- "\xe9\xb4\xc9\xde\x73\x3a\x4d\xdf\x71\xe3\x1c\x69\x3d\xe5\x73\xfa"
- "\xf5\x1a\x6e\x9c\x23\xad\x2f\xc7\xe9\xa5\x31\xf2\x39\xfd\x7a\x81"
- "\x77\x9c\x4e\xdb\x49\x38\xfd\xfa\x14\xc2\xe9\xb4\xad\x9d\x33\xce"
- "\xf1\xba\xbf\x77\xe3\x1c\x4b\xfb\x2a\x19\xe7\x70\xe5\xf4\xf2\x5a"
- "\xef\xc7\x3a\x96\xa7\x7b\xc7\xe9\xe5\x83\xbc\xe7\xf4\xb2\x96\x8e"
- "\x1b\xeb\x58\x76\x46\x3e\xa7\x97\xed\xe5\xc6\x3a\x96\x99\x39\x4e"
- "\xaf\xd0\xc9\xe7\xf4\xb2\x14\xef\x38\xbd\x7c\x31\xe1\xf4\xb2\x08"
- "\xc2\xe9\xe5\xc9\x9d\x33\xd6\xb1\xf4\x94\x77\x63\x1d\xcb\xcd\x4a"
- "\xc6\x3a\x5c\x39\x9d\x51\xea\xfd\x78\x47\x46\xac\x77\x9c\xce\xf0"
- "\xf1\x9e\xd3\xe9\x15\x1d\x37\xde\x91\xfe\x99\x7c\x4e\xa7\x67\x72"
- "\xe3\x1d\xe9\xbc\xef\xff\x33\x2c\xf2\x39\x9d\x1e\xe5\x1d\xa7\x33"
- "\xc6\x12\x4e\xa7\xfb\x12\x4e\x67\x44\x76\xce\x78\xc7\x8a\x12\xef"
- "\xc6\x3b\x32\xda\x5d\xff\x42\x6c\xbc\xc3\x95\xd3\xab\xb2\xbc\x1f"
- "\xf3\x58\xa5\xf7\x8e\xd3\x99\xdf\x7a\xcf\xe9\xcc\x9d\x1d\x37\xe6"
- "\x91\xb9\x5e\x3e\xa7\x33\x27\x72\x63\x1e\x99\xbc\xf9\x4f\xab\xca"
- "\xe5\x73\x3a\x33\xd4\x3b\x4e\xaf\xea\x47\x38\xbd\xb2\x86\x70\x7a"
- "\x95\xa6\x73\xc6\x3c\x56\xae\xf1\x6e\xcc\x63\xd5\x56\x25\x63\x1e"
- "\xae\x9c\x5e\x13\xef\xfd\xb8\xc7\x1b\x2d\xde\x71\xfa\x8d\x3d\xde"
- "\x73\xfa\x8d\xc5\x1d\x37\xee\xf1\xc6\x54\xf9\x9c\x7e\xc3\xc0\x8d"
- "\x7b\xbc\xc1\x5b\xff\x7e\x4d\x91\x7c\x4e\xaf\x6e\xf0\x8e\xd3\x6f"
- "\x5c\x21\x9c\x5e\xbd\x97\x70\xfa\x8d\xba\xce\x19\xf7\x58\x1d\xe7"
- "\xdd\xb8\xc7\x1a\x97\xf9\x6f\x8b\x12\xe7\x25\x68\xe7\xcf\x9c\xb9"
- "\x28\x31\x55\xbb\x28\x79\xf6\xab\x89\x23\xf5\x8e\xff\x8f\x8c\x48"
- "\xd3\xa7\xf5\x40\x09\x73\xa7\x4f\x5b\xf2\x28\x77\x32\x39\x71\x1e"
- "\xfc\xd3\x03\x25\x4d\x5f\x94\xa4\x4d\x5d\x9a\x92\xa8\xc5\xff\x9b"
- "\xfb\x6a\x0a\x24\x99\x9f\xca\x1d\x79\x3e\x31\x79\x7a\xda\xec\x79"
- "\xb3\xb4\xd3\x93\x67\xcf\x9a\x37\x37\x71\x5e\xaa\x76\x61\xe2\x82"
- "\xc5\xb3\x17\x26\xe2\xbf\x17\x69\x67\xce\x5f\x08\x07\x5e\x4d\x9c"
- "\xbd\x24\x51\x3b\x63\xf1\xcc\x99\x89\x0b\x17\xf5\x40\xe3\x17\x27"
- "\xa7\xce\x4e\x49\x4e\xd4\x46\x8d\x1f\x35\x68\xe2\xb3\xbf\x9d\xf8"
- "\xd4\x53\x3d\x10\x6f\xef\x69\x2d\x9d\x37\x5a\x0b\x1c\xf2\x3d\xaf"
- "\xca\x5d\x5b\x19\x8a\x50\x36\x70\x73\xe3\x42\xa4\xde\xb0\x10\xf9"
- "\xae\x6f\x44\xfe\xd9\x8d\x28\xc0\xbe\xf9\x42\xb1\x76\x0e\x8a\xa4"
- "\x83\x5e\x29\xd9\xd8\x88\x34\xf6\x4d\xef\x22\x7a\xd3\x16\xa3\x39"
- "\x68\x65\x09\x4e\x4b\x07\x65\xd4\xe1\xe3\x80\x85\x2f\xbd\x69\x5b"
- "\xca\x59\x55\x6e\x94\x39\x28\x33\x77\xe5\x05\x44\xd1\xbd\xd6\x96"
- "\x7f\x64\x37\x53\x47\xf0\x08\x11\xc4\x0a\xa9\xde\xac\x85\x5f\x35"
- "\x52\xbd\x95\x09\xbf\x5c\xf8\x9d\x42\xaa\x75\xbe\xf0\x0b\x80\x5f"
- "\x1a\xfc\x0e\xc2\xaf\x01\x7e\x16\xa4\x5a\x0f\xc7\xd6\x6b\xe1\x67"
- "\x80\x1f\x1c\x5f\x0f\x69\xd7\xc3\xb9\x0d\xbe\x24\x9f\x0d\x70\x7e"
- "\x43\x16\xfc\xf6\xc3\xaf\x1c\xa9\xde\x86\x3c\xdf\x2e\x42\xaa\xac"
- "\x70\xf8\xb7\x14\x7e\x47\xe1\x87\x8f\xd7\xc1\x31\x9c\x56\x4d\xce"
- "\x65\xd5\x20\x55\xb6\x06\x7e\x83\xe1\x17\x03\xbf\x35\xf0\xdb\x0a"
- "\xbf\x5d\xf0\xdb\x0b\x3f\x78\xbe\x6c\x9c\x06\xee\x95\x03\xe7\x72"
- "\xe0\x1e\x39\x25\x48\xb5\xd1\x1f\x7e\xc9\xf0\x33\x22\x28\x23\xfb"
- "\xf3\xe7\xfd\x8d\x7f\x23\x9c\xfe\xef\xfc\x9b\x12\xb8\xea\x5e\x93"
- "\xf1\x41\x2b\xd4\xdb\xb7\x46\xd1\xab\x91\x8a\xde\x94\x99\x9b\xf2"
- "\x20\xf2\xa9\x57\xbd\xd5\xb3\x6a\x0d\x82\xf6\x66\x8b\xd1\xb8\xac"
- "\x15\x9f\xef\x89\x63\xd6\x9c\xf3\x56\x80\x09\x25\x9b\x71\xfd\x94"
- "\xc7\xcf\xb7\x02\xd8\xeb\xc7\x99\x7c\xee\x2c\xc1\xd7\xd3\x9b\xc3"
- "\xea\xe8\x95\x71\xef\xe3\xef\x70\xcf\x43\x0c\xf1\x77\xba\x74\x6e"
- "\x58\x3c\xad\xee\xd7\x84\xdb\x18\xe3\x32\xfc\x5c\x6f\x9e\x23\xf5"
- "\x11\xce\xc3\xb3\x99\x83\x2e\x14\x43\xfd\xf3\xc5\xff\xa7\x01\x73"
- "\xba\x28\xd6\x9f\xb4\x3b\x6f\x31\xfe\xa5\x35\xe4\xf1\x78\x7c\xae"
- "\x65\xf7\x5d\xd0\x4e\x84\xe4\x1a\xe7\xb5\xa2\x5a\xd5\x9b\x67\xa0"
- "\x6c\x14\xb4\x81\x14\x7d\xff\x5d\xc8\xbe\xe5\xf1\xf8\x03\xc0\x03"
- "\x9c\xee\xcf\x19\x75\xf8\x5f\x13\x3e\x4f\xe7\x3d\x61\xc0\xe3\x40"
- "\xc6\x8c\x0f\xa0\x5d\x7e\xf3\x5c\x6b\x48\x8c\x59\xfb\x7c\x20\x7d"
- "\x96\x3c\x1b\xa4\x7b\x2b\xcd\xf1\x2c\xad\x41\x17\x4a\x70\xfe\xb4"
- "\x36\xb6\x04\xce\xf9\xda\x37\xad\x2c\x81\xe7\xf0\xb9\x04\xd7\xd1"
- "\xf0\x8c\xc6\xe7\xf1\x7d\xd7\x2d\x80\x67\xa5\x56\xc6\x42\xde\x1f"
- "\xc4\x96\x7c\xbc\xcc\x42\xe1\x73\xf6\xdc\x0b\xc5\xc0\xf7\x00\x3a"
- "\x67\xcd\xde\xf7\x82\x91\xef\x8e\xcd\x08\x6d\xdf\x8c\xfc\x9b\x73"
- "\xd6\x25\x99\x7c\xbb\xa7\x92\xb6\xef\xcd\x5a\x0a\xd2\x98\x54\xeb"
- "\xa2\x68\xe0\x2f\x73\x2f\xcd\x90\x22\x37\xf7\xfa\xec\xc6\xbd\xb6"
- "\x0c\x29\xc2\xf7\x22\x31\xba\x50\x4c\xfe\x25\x79\xd8\x77\xdd\x55"
- "\x82\xe3\x87\x63\xe7\xc8\xc3\xbe\xc9\x91\xc7\x5b\xdf\xe2\xeb\xe1"
- "\x9e\xc5\xf4\x87\x77\x95\xd8\xb7\x8c\x28\x81\x32\xaf\xc1\xe7\x03"
- "\x57\xa1\x26\x1a\xfe\xc5\xf7\x27\x58\x40\xec\xa9\x4c\x84\xf3\xa7"
- "\xd9\x63\x34\x1c\x83\x6b\xcd\xf6\xd5\x5a\x84\xfb\xa6\x06\xd5\x7a"
- "\x66\x6c\x82\x56\xeb\x8a\x09\xc6\xeb\xc7\x2e\xad\xa6\xed\xf0\xb3"
- "\x3d\x5c\x8d\x7c\x8c\xcf\x63\x7c\xd7\x27\x69\x27\x74\x83\x18\xaf"
- "\x9f\x7d\x23\xb6\xf7\xc5\xe2\xf8\xa8\x77\x04\x43\x7d\x7f\xd3\x0f"
- "\xf0\xd6\x22\x8c\x0f\x8e\x15\xc4\x09\xc1\x71\x7f\xcc\xd3\xe6\x9c"
- "\xf5\x5b\x9d\xe2\xa5\xfe\x75\xec\x4a\x9a\x97\xf7\x74\x9a\xc1\x0d"
- "\x3f\x1b\x93\xbe\xcc\xe4\xe3\x67\xc2\xe9\xb5\x03\x18\xce\x9d\xb3"
- "\xb3\xe7\x31\xb7\x70\xfc\xe8\x90\xd1\x5a\xfc\xff\x49\x03\x91\x3a"
- "\xb0\x1a\x51\xda\x0c\x5d\x29\xe1\xc2\x13\x06\x07\x4f\x98\x32\x6e"
- "\x79\x20\xcd\xb6\x1a\xfa\xda\x1b\xfc\xdb\x10\x65\xdb\xa4\x2b\x82"
- "\x74\xa6\x96\xfc\xc1\x45\x74\xae\xae\x08\x7f\x7f\x7e\x56\xb5\x61"
- "\x24\x13\x83\xd5\xfe\x88\x3c\x87\x6e\x57\x46\x32\x6d\xce\xb8\x02"
- "\xf7\xea\xfd\x84\xe9\xcf\x4b\xcc\x80\xd7\xe0\x22\xcc\x87\x03\xd7"
- "\x2d\x14\x5e\x13\x90\xee\xb5\xa6\x72\x3b\x94\xb5\x10\x38\x01\x65"
- "\x45\x38\xdf\xe6\x9c\x0d\x6b\xb8\xb2\x6e\x30\x60\x6e\xc0\x3d\x4a"
- "\xc9\xbd\x21\xdf\xd5\x70\x8f\x4d\xba\x52\x48\xb7\xd7\xe4\xf3\x89"
- "\xd6\x11\x13\xe6\xde\x5c\x3a\xb6\x2e\x6d\x28\x32\x07\xe9\x4a\xdb"
- "\x96\xd0\xd5\x1b\xbf\x87\xfc\x57\x23\xba\xf5\x3a\x5d\xbe\x22\x86"
- "\xb6\xe4\xbc\x80\xe7\x39\x9e\x42\x2b\xa7\xa3\xbe\x77\xae\xa2\xcd"
- "\xd1\x36\x14\x78\xe7\xa9\x40\xba\x22\xe6\x14\xb3\x37\xc2\x8a\x6a"
- "\xba\xae\x32\xe5\x20\x5a\x71\x0e\x05\xa4\xcf\x46\x9a\x95\x31\x50"
- "\x96\x72\xda\x52\x95\x76\x0a\x55\x36\xc1\x2f\xa5\x02\xd2\x7d\x0b"
- "\xbf\x83\x68\xe5\x52\xe4\x3b\x01\xfa\xbd\x8c\x6b\x28\xa0\x32\xe5"
- "\x1a\x1c\xbb\x88\x56\xc4\xd3\xd6\x8a\x72\x9c\xee\x18\x8a\xb6\x9a"
- "\x03\xd3\x2f\x02\xa6\x2f\xe0\x6f\xba\x4f\xa3\x1d\xf0\x2c\xad\x41"
- "\x5b\xcc\x2d\x9b\xb6\xa5\x5d\x5d\x42\x5b\x9b\x73\xde\x4e\x33\xa1"
- "\xc7\x33\x05\x65\xc1\xcf\xdc\x8a\x10\xe0\xe6\x83\xd3\xd8\xf3\x1f"
- "\xcb\x9c\x66\xc5\xed\xcb\xdb\xc9\xa0\x3b\x90\xe3\x3c\x3e\x67\x0e"
- "\x79\x2c\x13\x8e\x6f\x8d\xb6\xd2\xcd\x38\x3e\xb8\xdc\x10\xa3\xfd"
- "\x6c\xf9\xf7\xab\x52\x90\x2f\xdc\xe3\x94\xc9\xe7\xff\xac\xf8\x1e"
- "\x90\xe7\x1d\xc0\xf7\x14\xcc\x0d\xf6\x9c\xc5\xe4\xf3\x69\x14\xc7"
- "\x97\x75\xfb\x81\x23\x77\x38\x9e\xa5\x39\x27\x2b\x14\xae\x1d\xc7"
- "\xe3\x13\xe6\xc7\x8d\xf3\x6c\x7f\x86\xdb\xa6\x34\x3b\x6e\x5b\xd5"
- "\xfd\xca\x6c\x21\x4f\x44\xd0\x41\xf5\x91\xf4\xd5\xd0\x00\x9a\xa2"
- "\x2d\x13\xac\xb4\xc5\x9e\x7f\x7f\x26\xf4\x59\x01\x55\xd6\x26\x44"
- "\xd2\x67\x1d\xa2\x37\xd5\x8f\x21\x73\x48\xb3\x76\xe3\x3c\x41\xdb"
- "\x54\xe7\x34\x22\x75\x74\x35\x6d\xc1\xf5\xd7\xbe\xa9\xd1\x98\xb3"
- "\x10\x69\xe8\xfc\x27\xb4\xf6\x90\xa1\x11\x2d\x3b\x63\x11\x6e\x63"
- "\x31\x7f\xe9\x5c\xb8\x96\xcd\x07\xee\xeb\x67\x52\x65\xad\xb0\xc3"
- "\xf5\x74\xde\xfd\x99\x2c\x0f\x98\xf6\x90\xb4\xa3\x59\x2b\x68\x3d"
- "\x9c\xcb\xed\x57\x0e\xe7\xfc\xce\xaa\xb2\xfd\xe1\x38\xa2\x73\xfb"
- "\xfb\x1a\x33\x1a\x21\x6d\x76\x4f\xc2\xa1\x7e\x65\x82\xff\x53\x38"
- "\x9e\xeb\x99\xfa\x4f\x74\x68\xf6\x20\xae\xde\x31\xe5\x65\xea\x55"
- "\x6b\xc8\xfd\x50\xef\xb2\x23\x4d\x3e\x81\xfe\x6c\x8c\x7d\x9a\x98"
- "\x36\x09\xda\x95\x9d\xb1\xfe\x5f\xc5\x20\xf4\x15\x38\x17\x48\x93"
- "\x60\xf2\x09\xea\xcb\xc5\x32\x3b\x1d\xa7\x65\x9e\x13\xea\xa6\x7d"
- "\x35\xdb\x07\xc0\x35\x50\x6f\xaa\x71\x9b\x43\xda\xb6\xec\x34\xdc"
- "\xee\x40\xbd\x1b\xc6\xb6\xfb\xeb\xe0\xb9\xd4\x74\xf0\x8b\x26\x78"
- "\xae\xcc\xb3\xec\xb3\xf0\x9f\xcd\xd1\xce\xd0\x9b\xe2\xe2\x49\x5a"
- "\x9d\x11\xee\x5f\x0b\xf7\x6f\xe2\x73\x8d\x94\x2b\x67\xf2\xc3\xe5"
- "\xf0\x37\xe8\x12\x47\x5e\x50\x57\xfd\xa1\x8e\x9e\xc7\x9c\xc2\xf5"
- "\x73\xdb\x66\xac\x35\xe2\x92\x5a\x36\xc5\xa5\x34\xe7\xe4\x84\x3b"
- "\xea\xa9\x7d\x09\x5d\x03\xb8\x22\xfb\x75\xfa\xe4\x46\xc0\x32\xda"
- "\xa6\xa2\xa7\xd9\xc2\x11\xe8\x56\xeb\x0e\x38\xbe\x63\x09\xd6\x7d"
- "\x6f\x27\x41\x5d\xf6\x17\x4f\xeb\x8b\x70\x3a\x26\x3d\x9b\xb6\x35"
- "\x28\x2e\x89\x79\x66\x4a\x65\x87\xe7\xf3\x71\x3c\x53\x6b\x90\x6e"
- "\x2f\xdc\xbb\xd8\xe4\x83\x22\x04\xf5\x65\x73\xdf\x3a\x9a\x8e\xc3"
- "\xbc\x52\x41\x59\x2a\xe0\xdf\x6e\x2c\x8f\xef\xfc\x0a\x74\x6d\xd4"
- "\x78\xa8\x2b\x80\xf7\x7b\xbd\x69\x33\x5c\x5f\x67\x42\xaf\x4c\xc4"
- "\xd7\x6f\x80\xff\xe3\xe3\x38\x4d\x73\xce\x46\x64\x42\xd3\xa2\x48"
- "\xbe\xeb\x35\x18\x3f\x61\xbe\x1b\xf5\x24\x5f\xe6\x59\xee\xc4\x79"
- "\xe2\xeb\x70\x9e\x85\x5b\xe8\x06\x9c\x0f\xe4\x11\xe5\xc8\x3b\x1b"
- "\x8e\x39\xf2\x8f\x9a\x7b\xe3\x1e\x09\x70\xbe\x9c\xff\xec\xdb\xb6"
- "\xd0\x4d\xe4\xb9\x36\x66\x9a\xd0\xac\x50\x7c\x6e\x3d\x1c\xc3\xd7"
- "\x12\x8e\x6c\x2c\xc4\xfc\x31\x91\xf2\xa8\x08\x8f\x36\xee\x35\xa1"
- "\xc4\x22\x7e\x1b\x0f\x38\xf5\x74\xf4\x01\x6c\x7e\xd5\x8e\xfc\xb8"
- "\xbc\x48\x1e\x74\xee\xe4\x18\xb6\x8e\xe0\xba\x1c\x80\xf3\x6f\xce"
- "\xc9\x85\xf2\xc7\xd7\xb1\xe5\x47\x4d\x84\xf3\x10\x7b\xe6\x1a\xc2"
- "\x87\x9c\x35\x4d\x8e\xbe\x1c\xb0\x28\x86\x6b\x06\x3b\xf5\x4d\xfe"
- "\xa4\xdf\x78\x22\x06\xf3\x86\x6d\x17\x7a\xe2\x67\x72\x94\x17\xf2"
- "\xf1\xa5\x73\xd6\xde\x81\xb9\x8e\xf3\xb1\xe7\x0f\x56\x43\x3e\x2b"
- "\x9c\xf2\xf1\xc5\xe9\xec\x39\x6b\x9f\xc0\x7d\xe1\x3b\xbd\xe9\x3a"
- "\x48\x53\xe4\x48\x83\xcf\x43\x5c\x9f\x84\x63\xfb\x4d\xe8\x35\x1d"
- "\x3e\x96\x03\x69\x4c\xaa\xb5\x92\xdf\xc7\x64\xdc\x87\xa8\xaa\x02"
- "\x13\xf6\x8e\xb8\x5e\x8f\xa8\xea\xdb\x84\xaa\x0a\xec\xc8\xfe\xa1"
- "\x26\x22\x32\x83\x36\x9e\x57\x6d\x7a\xa4\xd2\x52\x87\xe4\xe9\xbd"
- "\x5c\xe6\xfb\x37\xba\x15\x3c\xce\x8a\x47\x11\xee\xff\x2f\xa9\x36"
- "\x4f\xaf\x32\x37\x32\x6d\x1c\xfc\x3d\x1e\x9f\x7f\x07\x3c\x11\xf6"
- "\x45\xe0\x7d\x93\x72\x29\xe2\x8d\xec\x90\x76\x3b\x3e\x8e\x7d\x13"
- "\x78\xb6\x1d\xbc\x73\xf4\x87\xc1\x25\x24\x76\x9b\xfb\x30\x7d\x1e"
- "\x7e\x5e\xeb\x73\x46\xfc\xcc\xf6\x5d\xc1\x25\xb8\x0c\x2b\xd3\x68"
- "\x7b\x95\xb5\xd9\x58\xd9\x64\x43\xda\x25\xd8\xd3\x6d\xba\x16\x5d"
- "\x88\x68\x68\x03\x65\x7a\xaa\x4d\x46\x7c\x4f\xf0\xbd\x97\xcc\xfa"
- "\xe0\x92\x95\x36\x44\x6d\xcc\xf0\xf3\x7f\xa6\x80\x36\x5e\xbd\x5f"
- "\x13\xd1\x9c\xb3\x39\xf4\x08\xb4\x26\xf2\xb5\xf0\xe6\x50\x47\xd9"
- "\xb7\xb3\x65\x87\x7b\x31\xed\xd2\xc3\x5b\x33\x99\xf2\x42\x9a\x18"
- "\x29\xbc\xe8\xd5\x81\xf4\x57\x05\x56\xb4\xa8\x80\x6e\x5d\x54\x88"
- "\x28\xdb\x16\x03\xfa\x78\x7b\x0d\x6e\xcf\x23\x1d\xf1\x64\x62\x07"
- "\x7e\x3f\x25\x03\xa9\xeb\x55\x9b\x5b\xa2\x57\x64\x32\x7b\x24\x1d"
- "\x86\x74\x32\x9f\x95\x19\xff\xab\x04\x1f\x1d\x6d\x5d\x49\x93\x3e"
- "\xe9\x9d\xfb\x26\xb0\xf9\xe1\x73\x0e\xfc\xb6\xb3\xfe\x56\xfe\x3d"
- "\xde\x91\xfc\xfe\xdf\x4d\x59\xd5\xe2\x65\x7d\xe7\x9c\xf2\xb2\xbe"
- "\x53\xe2\x5a\xd6\xbc\x9e\x1d\x5b\xd6\x3c\x8d\x82\xb2\x6a\xc5\xcb"
- "\x9a\x77\x42\x79\x59\xf3\x0a\x44\xca\xda\xd2\xb1\x65\xcd\x47\x0a"
- "\xca\x1a\x21\x5e\xd6\xfc\x43\xca\xcb\x9a\xbf\xce\xb5\xac\xf9\xe7"
- "\x3a\xb8\xac\x92\xfb\x9f\xd2\x54\x20\x8d\xdb\x27\x68\x97\x5a\x33"
- "\x5a\x40\xcb\x6d\x19\x69\x4c\xdf\x89\xa8\xf2\x26\x0b\xaa\xec\x5b"
- "\x83\x75\x32\xf5\x50\x0a\xb4\x7b\xab\xd1\x08\x7a\xf3\x05\x63\x65"
- "\x41\x03\x1c\x3f\x8f\x2a\xd2\x2c\x28\x72\x21\x6e\x7f\xb7\x7c\x52"
- "\x95\x20\xb7\xfd\xdd\xb2\xe2\x46\xfb\x6b\x7d\x94\x6d\x73\xdf\x3d"
- "\x5d\xd9\xd0\x8a\x70\xf9\xe1\xef\xe3\x37\xda\xdf\xd5\x24\xde\xce"
- "\xed\x2f\x8e\x47\x95\xc5\x22\x68\x7f\xc9\x77\x52\xef\xe6\x3b\xb7"
- "\xbd\x39\xf5\x08\x89\xb7\xbd\xef\x2e\xc0\x6d\xef\x76\x38\x2f\xef"
- "\xf9\xdf\x1d\xe1\x68\x7b\x73\xe1\x9e\xfc\xb6\xf7\xab\x04\xdc\x27"
- "\xbf\x9b\xa7\xac\xed\x7d\x37\xcf\x51\xee\x42\xb6\xdc\x10\x2b\x8b"
- "\xb0\xed\x7d\x57\x72\xaf\x4b\x3e\x6f\xe9\x2d\x03\x4c\x1f\xf7\xb7"
- "\xf8\xd9\x77\x69\xcc\xb8\x7f\x6b\x86\x98\x7c\xbe\xdd\xe2\x7b\x5e"
- "\xb5\x75\x1c\x33\x9e\xd9\x9c\xe0\x43\xef\xba\x6b\x6b\x74\x2a\xfd"
- "\x03\xad\xd7\x98\xf1\x58\x25\xf6\xdc\x70\x7e\x15\xbd\xfb\xae\xad"
- "\xf2\x9e\x9b\xe4\x09\xfd\x5f\x44\x06\xd4\x97\x8f\x97\x58\x28\xfb"
- "\xf2\xb8\x40\xc0\x41\x4d\xe7\x3f\xa0\xa5\xdf\xd4\x24\x5f\xcd\x1f"
- "\x91\x7b\xcc\x70\x0e\xe1\xb4\xf4\x2a\xdf\x11\xca\x9f\x7f\x5b\x80"
- "\xfb\xe7\xdf\x36\x4a\xfe\xf3\x93\x3c\x3d\x7b\xfe\x6d\x01\x1e\x3d"
- "\x7f\x6f\x78\xfe\xd6\x61\x7e\xe0\xff\xa8\xc3\xad\xc3\x7c\x65\x3e"
- "\x8f\xe4\xfe\x77\x1d\x77\x8f\xf7\x3c\x6e\xff\xe8\xde\x83\xb5\x1f"
- "\x6f\x37\x53\xd0\x06\x30\x7d\x38\xae\x7b\xa4\xfd\xab\x83\x36\xeb"
- "\x07\x9a\xb4\x49\x66\x99\x6d\xd2\x7b\x99\x9e\xdf\xdf\x90\xd9\xf1"
- "\xf7\x7f\x5f\xba\xfc\xce\x6d\xe2\x47\xbd\xd5\x92\x6d\xe2\x96\x07"
- "\x32\x5d\xdb\xc4\xf7\x8f\xc9\x6f\x13\xdf\xcf\x75\x6d\x13\x0b\xae"
- "\x70\x6d\x62\xc1\x69\xe5\x6d\x62\xc1\x1e\xcf\xdb\xc4\x82\xb5\xca"
- "\xda\xc4\x82\x18\xf7\x6d\x62\x41\xb1\xb2\x36\xb1\xa0\xd8\xb5\x4d"
- "\x2c\x08\x10\xb6\x89\x60\x10\xa4\xb0\xcc\x0d\x28\x81\x3e\x3a\xa0"
- "\x5e\x55\x58\x62\x5d\x0d\xbe\x25\x77\x4d\x71\xb4\x8d\x6e\xa6\x37"
- "\x05\x94\xd8\xa9\xc1\xb8\x5d\x89\x6c\x6e\x4e\xf2\xb7\xbf\x6e\x08"
- "\xa0\x83\xfb\x2d\xa1\xdb\x42\x11\xc4\x49\x07\xcf\x1f\x48\x37\x1b"
- "\x7a\xd1\xaf\x1b\x82\x0b\xae\x23\x0d\xfc\x42\x0b\xd8\xfe\x18\xfe"
- "\x8e\xa0\x5f\x0f\xed\x91\xb3\x04\x85\x07\x36\x21\x7f\x78\x86\xb8"
- "\xc0\x55\x6a\x04\x6d\x90\x06\xff\x4d\xaf\x2e\x4a\xda\x71\x1d\xf9"
- "\x06\xa6\x01\x36\x41\x70\xbf\xb4\x40\x9a\x5e\x64\x40\x3b\x16\x82"
- "\x97\xa6\x50\xe8\x76\x8a\x2e\xb1\x36\x1b\x28\x9b\xe6\x89\x48\x82"
- "\xcf\xf6\x04\xba\x37\x78\xaf\xbc\x27\x02\xec\xbd\x1f\x6f\xb2\xad"
- "\x4c\x52\xd1\xcb\xe3\x54\xf8\x59\x6d\x79\x8f\x9b\xe9\x2d\xf0\x5b"
- "\x99\xd4\x0b\x6b\x68\xf0\xda\x11\x74\x73\x68\x0f\xf0\xe1\xe1\xdb"
- "\x97\x20\x5d\xe1\x75\x64\xa0\xaf\x1a\x28\xc0\x3f\x0e\xef\x35\x0a"
- "\x31\x8a\xb3\x53\x45\x49\x70\xce\x17\xb7\x89\x34\xbe\xbf\x15\xee"
- "\xdf\x06\xf7\x6f\xc5\xdc\x46\xa1\x3b\xe0\xfe\xb6\xd7\x0d\x32\xeb"
- "\xcb\x76\x66\xfe\xaf\xe3\xb9\xec\xe1\xfd\xd5\xf4\x47\xf0\xc3\xcf"
- "\x05\x31\xdc\x81\x63\xf2\x50\x7f\x0d\x7e\xb6\xec\xeb\x28\x1c\x9e"
- "\x53\x07\xcf\x60\x80\xfb\xe2\x75\x5a\xe2\x5e\x59\xa0\xc6\x1c\x15"
- "\x3c\x9b\x6d\x13\xfb\x6c\x97\xe1\xd9\x2e\x71\xcf\x86\xef\x85\xe3"
- "\x23\xf5\x0e\x34\x3a\xbd\x3f\xae\x9b\xff\x0b\x4c\xeb\x36\x06\xbf"
- "\x0f\xbd\xba\x3c\x49\x26\x57\xb7\x4b\xae\x7f\xb2\xf1\x23\xd4\x97"
- "\x56\x67\xd4\x4c\x58\xfb\x03\x1d\x0d\xa9\xd6\x7e\x84\xc2\xab\xa0"
- "\x5e\x57\x5a\x2e\x22\x3a\x28\xa3\xe6\x98\xa1\x41\xe6\xbd\x76\x24"
- "\x49\xdd\x6b\xc3\x6a\xba\xda\xae\x79\x22\x82\xd6\x8c\x58\xb7\x71"
- "\x35\x9d\xd6\xa6\x0b\xae\x6e\xd5\xdd\x55\x34\xcd\xaa\x06\x5e\xd3"
- "\x69\xda\x85\x48\x7b\x5e\xb5\x7b\xdf\xd7\x27\xc1\x97\xbe\x84\xfc"
- "\xcf\xaa\x76\xd7\xae\xfc\x0e\xbf\x2b\xda\x61\x11\xbe\x2b\x2a\xea"
- "\x8b\x54\x3b\xb3\x90\xea\x83\x02\xa4\xfa\x9d\x11\x41\x3a\xe1\x6f"
- "\xd7\x29\x92\xd7\xce\xd9\xd1\x7b\xfa\xa3\x0c\x2b\xfd\x3f\x3a\xb7"
- "\xde\x92\x43\xd1\x96\xe8\x81\x3e\x26\xe3\x12\xfc\x0e\x65\xe7\x74"
- "\x88\xe9\x8f\xd0\xd7\x06\xc2\xdf\x83\x00\x53\x94\xb2\x10\xdd\x55"
- "\xaf\xda\x19\x8e\xeb\x4d\x60\x53\xb7\x31\xb6\x95\x71\xc8\xaa\x8d"
- "\x45\x6d\x79\x4f\x68\x6d\x79\xf7\x67\xda\xd5\x6b\x8a\x57\x5e\x40"
- "\x7d\xf1\xbb\x4f\xa8\x1b\x71\xd3\x6c\xfe\xb8\x3e\xc6\x19\x67\x7c"
- "\x8d\xce\xa7\x22\x6a\xe5\x35\xd4\x13\xb8\x79\xa3\x5e\x8d\x6f\x08"
- "\xb4\xa4\x37\xd0\x76\x5c\xb7\xf0\x98\x2a\x9c\xeb\x95\x71\x0d\xfc"
- "\xbd\xb9\x0e\x15\x2c\x44\x1a\xdb\xa2\xa4\x60\xf3\xd5\xa4\xbb\xde"
- "\xb7\x23\x4d\xaf\x26\xa4\x2e\x68\x04\x4e\x2d\x02\x3e\x35\x42\x3d"
- "\x33\x93\x7a\x86\xbf\xb5\xdf\x8e\xeb\xd8\x86\xbf\x35\xec\x68\x24"
- "\x75\x8c\xe1\x11\xae\x63\xf3\x81\x47\xf3\x70\xff\x01\x3c\x5a\x0d"
- "\x75\x0c\xea\x05\x9d\xb3\xfd\x54\xc1\x6a\x1a\xa5\xcf\x46\xd4\x8e"
- "\xfa\x6e\xf8\x9c\x8f\xdf\x40\x4a\xfb\x75\x8c\x05\x71\x63\x1d\xbb"
- "\xcf\xb5\xea\xef\x2a\xd2\x3e\x4f\x5f\x3e\xab\xda\x09\xf5\x17\xf9"
- "\x6b\x5f\x78\x40\x0d\xf1\x66\xc7\xa4\x77\xd7\xe2\x31\x4e\x13\xc4"
- "\x02\xc7\x45\xfb\x3c\x7a\xe0\xac\xaa\x68\x10\x8e\xe3\xeb\xc5\x48"
- "\x95\xf2\x24\x5d\x0b\x31\x1b\x4c\xc6\x71\x8b\xc2\x99\x77\xa8\xab"
- "\xb4\xe8\xef\xcc\xbb\x2b\x72\x8d\x0d\xe2\x66\x55\xd7\x8f\x01\xbc"
- "\x63\x8c\x73\x5a\x99\x76\x08\xc7\xf1\x7c\x32\xa2\xa6\x35\x40\xac"
- "\x6c\x10\xab\x66\x43\x00\xb4\x47\x31\xb8\x3d\xa2\x73\xfb\xa5\xac"
- "\x30\xd1\xf6\xe8\x04\x15\x9d\xb1\x00\xf9\x57\xa5\xd9\xd0\x2b\x29"
- "\x88\x4e\xbf\x08\xf1\x6a\xaa\x41\xd0\x2e\xf5\x82\x36\x2b\xb8\x70"
- "\x09\xd2\xe0\x78\xf5\x6c\x00\xad\xb2\x39\xb3\xe8\xa3\x8c\x32\x3f"
- "\x1b\xf0\x17\xb7\x4f\x81\xab\x7c\xba\x43\x3d\xeb\x95\x85\xeb\x23"
- "\xd4\xcf\xc0\x55\x4c\x7b\x19\x57\x00\xf5\xd0\xfa\xba\x61\x40\xdb"
- "\xeb\x06\x2d\xfc\xfa\x3b\xda\x30\x47\xfb\x41\xe7\xec\x88\xc2\xed"
- "\x57\x55\x9a\x09\x59\x21\xb6\xbd\x70\x5f\xf7\xba\xa1\x2f\x13\xe3"
- "\x59\x06\xf4\xb0\x05\xf9\xc0\x33\xa9\xe1\x79\xd1\x8e\x99\xc8\xbf"
- "\x22\xe9\x2c\xb2\x41\xdd\x70\xc4\x7d\xfc\x6c\x2d\x82\x7c\xa9\x63"
- "\x86\x6f\x11\x1b\x33\x1f\x69\xde\xfd\xee\x00\xc7\xbb\xdf\x31\xdf"
- "\xc5\x12\xde\xfd\xae\xf4\xe7\xc8\xbb\xbf\xc7\x31\xbc\x53\xb5\xe9"
- "\x19\x3e\x0d\xae\xb2\x7e\x0a\x31\xfa\xdd\x2e\xcc\x11\xcc\x99\xe3"
- "\x7f\xc0\x9c\xd9\x55\xde\x55\x39\xd3\xd2\x6c\xd0\xc2\xef\xa6\x70"
- "\x06\xf2\x65\x38\x83\x63\xf5\xf7\xb8\x56\xe4\x88\x11\x53\x57\x73"
- "\x33\x6a\xb4\x2b\xd1\x53\x50\x57\x6b\x03\x57\xf5\x47\x15\x4c\x9c"
- "\x76\xd7\x6a\x5f\xa0\xed\x50\x4f\xfd\x56\x9e\x40\xea\xd6\xd5\x34"
- "\x5d\x65\xdd\x87\xec\x9a\xa1\x11\xcc\xfb\xc0\xdc\x46\x23\x78\xd6"
- "\x62\x1a\xbf\x87\x5f\x0d\x98\xa5\xe0\xb1\xf0\x95\x25\xb6\xfc\xd1"
- "\x5a\xfb\xa6\x8c\x3a\x3a\x68\x5b\x8a\x0d\xea\xb5\x7d\xd3\x2b\x25"
- "\xf6\xa0\x2d\xc6\xe6\x9c\xdd\xe3\x4c\xe8\x10\x33\xce\x0b\x7d\x71"
- "\x04\xb4\x0d\xb8\xfd\x65\xe6\x7b\xe2\xf7\xf4\x70\x3e\xd9\xf1\x7e"
- "\x19\xb7\x09\xec\xbb\x07\xf6\xdd\xc4\x6e\x8c\x61\x0f\xfc\x6e\x82"
- "\x6d\x53\xa6\x3a\xde\x4d\x38\xfe\x8f\xcf\xc3\x75\xf1\x78\x5c\x95"
- "\x77\xdd\x29\x92\xce\x71\xdd\x8e\x33\xb8\xad\xe7\xae\x23\xff\x87"
- "\x7e\xe4\x54\x1b\x85\xfc\x45\x35\x8e\x66\xb4\x16\xea\x0f\x78\xa3"
- "\xdf\x4f\x85\x7f\xa9\xf3\xaa\x0f\xd3\xe1\x5f\x15\xfc\xcb\x8c\x63"
- "\xca\xeb\xaf\x3e\x0c\x25\xef\x87\x46\xec\x27\xf7\xff\xb0\x0f\x53"
- "\x27\x1f\x44\x3d\xeb\xd9\xbf\x9b\x73\x3e\x4c\x75\xbc\x27\xbf\x91"
- "\xfe\x06\x3e\x1f\xaa\xf1\xbd\x01\x23\x5f\xf2\xee\x9e\xfc\x1f\xcf"
- "\x8b\x61\xf3\x63\xfe\x6f\xd7\x85\xe4\x1a\x33\xce\xa2\x06\xd5\x87"
- "\xa6\x2a\xe8\xc3\xed\x5b\x46\xec\xdf\x78\x1d\xe1\xef\x58\x7c\x1c"
- "\xf7\x85\xba\xe8\x6f\x5c\xc6\xa4\x61\xf6\xd2\xb1\xe7\x3d\x96\x4b"
- "\x6f\xae\x37\x62\x2f\xd8\x4c\x27\x3d\xc9\xfe\x3b\x12\xd7\x27\x32"
- "\x6e\xf2\xfb\x41\x34\x60\x8b\xf7\x4a\xbf\x31\x57\x08\xef\x61\x9e"
- "\xe9\xdb\xf7\xc8\x0a\xd2\x57\x3a\x9e\x17\xef\x73\x8e\xe7\xe2\x3c"
- "\x90\x89\x32\x9b\x45\xf6\x39\xe7\xe6\xec\xfc\x3e\xd4\x9e\xff\x18"
- "\x60\xff\x7b\xd0\x99\x3b\x8a\xf9\x65\x16\xc3\x02\xd2\xaf\x91\x3a"
- "\x27\x0f\x87\xdf\x17\x49\xe5\xf3\xac\xc1\x46\xcb\xcc\x4b\x7a\xfc"
- "\x47\x17\x1c\x11\x5d\x6c\x33\xda\xdb\xe2\x02\x8f\xad\xb8\x28\x53"
- "\xdb\x14\x4b\xae\xff\x67\xcb\x1b\x1a\xd3\x76\x7f\x70\x04\x7e\x4f"
- "\x61\x9b\x1f\xf7\x5c\x65\xb1\x15\xed\x99\x57\x47\xe1\xf6\x70\x6f"
- "\x7d\x09\x15\x3d\x90\xd5\x70\xb5\x48\x8d\xc7\xbd\xb0\x96\xcb\xb9"
- "\x84\x74\xad\x2b\xe3\x02\x5b\xdb\xe2\xd0\xdb\x97\xd0\x08\xfb\xac"
- "\xd0\x1e\x59\x33\x91\x6f\x0b\xb4\x85\x2d\xff\x4b\x0a\xfc\xfb\xa9"
- "\x3a\x74\x18\xae\xad\x6c\x32\xa1\xed\x90\x96\xfe\x5f\x5c\xaf\xdf"
- "\xc4\xd3\x96\xf2\xf8\x4f\x51\xb4\xc1\x66\xcc\x38\x83\x7a\x42\x9b"
- "\xa8\xae\x4a\xdb\xcd\xbc\xcf\xf5\x5b\x4a\x69\xab\xac\xe7\x50\xf6"
- "\x4c\x68\x4b\xa1\xed\x5c\x39\x09\xfa\x0c\xe0\xc4\xfb\xfc\x3e\x63"
- "\xce\x7b\x5c\x9f\x71\x19\xfa\x8c\xcd\xd0\x67\xac\x0c\x45\x95\x29"
- "\x46\x04\x6d\x58\xb7\x09\x29\x81\x96\x8c\x14\xe8\x3b\x96\x42\xdf"
- "\x91\x76\x0e\x31\xfd\x46\x43\x1d\x82\x36\xbf\x57\xe1\x3c\xa4\x69"
- "\xbd\x0c\x7d\xc7\x65\xe8\x3b\x32\x48\xdf\xb1\xed\x12\xf4\x1d\xf3"
- "\xc1\x1b\xcc\x83\xbe\xa3\x41\xa4\xef\xb8\x24\xee\x0b\x1c\xed\x60"
- "\xcb\x65\x03\xb5\x0d\xfa\x8d\x65\xdf\x22\x6a\xdb\x0b\xdd\x64\x72"
- "\x66\x8f\xe4\xf7\xbf\xf4\x96\x11\xef\xd8\xe9\x38\x84\xe3\xbe\xcc"
- "\x02\xfd\x30\xe0\x52\x65\xb0\xa2\xc0\x93\xdd\xc6\xb4\xc0\xf1\xb6"
- "\xde\x61\xa8\xf8\x7b\x33\x45\xe7\x3d\xa0\x6d\x01\xdc\x96\x2d\x46"
- "\x54\x1b\x60\xb8\xf7\xf9\x5c\x0a\xfb\x44\x7b\x7e\x58\x14\xf1\xa4"
- "\x7f\xbc\x88\xc7\x44\x02\x4d\x04\x37\x2b\x1d\x17\x48\xbf\x1a\xd7"
- "\x33\x7b\x06\xf2\xb5\xfd\x37\xb4\x87\xfd\xd5\x50\xff\x8c\x6f\x91"
- "\xda\xfc\x6a\x12\xc4\xeb\x22\x3a\xfc\x4d\x2e\xb5\xe3\x25\xa4\xc5"
- "\xeb\x22\xd2\x6f\x7e\x59\xb6\xe3\x15\x34\x6c\xc7\x7f\xd0\xe0\xed"
- "\x2f\xa1\xf0\xc2\xef\xf1\xfa\xe9\x80\x61\x1d\x6d\xa9\x48\xfa\x33"
- "\x7e\xc7\x1e\x49\x6f\xb9\x1f\xd1\x21\x43\x63\xe0\xef\x61\xb9\x2f"
- "\x81\x7f\x80\xf3\xd1\x86\x16\x63\x55\x5a\x05\xca\x3a\x8b\x50\xc6"
- "\x05\x16\xe3\x1b\xf8\x9e\x46\x56\x0a\xda\x0f\xac\x09\xc6\x13\x7c"
- "\xf1\x7b\x2f\xec\x39\x6e\x60\x3c\xf3\x2f\x42\x5d\xc0\x62\x5c\xd1"
- "\x50\x8d\xa0\x0f\xec\x76\x43\x1f\x30\x18\x9f\x46\x0e\x6d\x00\xd8"
- "\xf4\x02\x2d\xa0\x69\xb9\xea\xa4\x0f\x16\x2a\xd4\x07\xac\xbf\xb1"
- "\x2e\x32\x50\x05\x14\x8d\x56\x56\x20\x6a\xab\x5d\x2e\xc6\x7f\x64"
- "\xf6\x3f\xc4\x63\x5f\x64\x8e\xcc\x1f\x16\x60\x2c\x4c\xaa\x3f\xa4"
- "\x4c\x32\xf8\x20\x85\xd8\x67\xb6\x83\xfd\x51\x82\xfd\xbe\x0b\x0a"
- "\xb1\xcf\xa4\xdf\x3c\xac\x55\x86\xfd\x35\x99\xd8\x33\xeb\x4b\xfe"
- "\x4c\xb1\xdf\xb7\x5f\x88\xfd\xde\xb9\x04\xfb\xbd\xc9\xca\xb1\xd7"
- "\xb5\x53\xef\x75\x6c\xbd\xff\xf8\x9c\x32\xec\x75\x50\xef\x0f\xa7"
- "\x29\xc3\xfe\xa2\x4c\xec\x99\x35\x2a\x7f\xa6\xd8\x7f\x5c\x22\xc4"
- "\xfe\xa3\xd9\x04\xfb\x8f\x92\xbc\xc0\xbe\x9d\x7a\xaf\x63\xeb\xfd"
- "\x27\x67\x14\x62\x8f\xeb\x7d\xb5\x32\xec\x4f\xcb\xc4\x9e\x59\xe7"
- "\xf2\x67\x8a\xfd\x27\x7b\x85\xd8\x97\x24\x12\xec\x4b\x12\x94\x63"
- "\xaf\x6f\xa7\xde\xeb\xd9\x7a\xff\x7f\xa7\x95\x61\xaf\x87\x7a\x6f"
- "\x34\x28\xc3\xfe\x90\x4c\xec\x99\xb5\x32\x7f\xa6\xd8\xff\x5f\xb1"
- "\x10\xfb\x4f\xa7\x13\xec\x3f\x8d\xf7\x02\xfb\x76\xea\xbd\x9e\xad"
- "\xf7\x9f\x7d\xa7\x10\x7b\xa8\xf7\xc6\x4c\x65\xd8\xa7\xcb\xc4\x9e"
- "\x59\x6f\xf3\x67\x8a\xfd\x67\xbb\x84\xd8\xef\x9f\x4a\xb0\xdf\x3f"
- "\xc5\x13\xec\x97\xf3\xb1\x3f\xd5\x6d\x0c\x78\x2b\x46\xe7\xef\x79"
- "\x89\xc5\xfe\x43\xc0\x1e\xca\xbf\xf7\x85\xad\x4e\x1a\xff\xf3\x0a"
- "\x06\xf7\x78\xc0\x3d\x0d\x70\x07\x6f\xe8\xc0\x1c\x30\xea\x89\x71"
- "\xc7\x98\x67\x9c\x46\xea\xc3\x70\x2d\xc6\x07\x63\x0c\x38\x6a\x19"
- "\x9c\xef\xf8\xb2\x8c\xf6\xf1\xd5\x60\x3c\xb1\xee\xc7\x98\xb7\xa7"
- "\xed\x31\x27\xda\xc5\x3c\xf6\xe6\xe8\xfb\x56\xe7\xf1\xbf\x8e\xc2"
- "\xfc\x04\x78\xb8\x0c\xb9\x98\x7f\xbe\x55\x88\xf9\x9f\x26\x61\x1c"
- "\x4c\xaa\x3f\x4d\x54\x8e\xb9\x2e\x53\x1a\x73\x47\x1f\x7f\xe0\x88"
- "\x77\x98\x1f\xae\xe6\x30\xd7\x65\xba\xc7\xfc\xb4\x02\xcc\x3b\xb6"
- "\x7f\xef\x5a\x98\x1f\xc8\x12\x62\x5e\x3a\x96\x60\x5e\x3a\x46\x0a"
- "\x73\x3b\xb4\xd7\x78\x4c\x1d\x7f\xff\x67\x6b\x8e\x7b\xae\x0d\x70"
- "\xc5\xdf\x01\xe2\xb1\xde\x7d\xf3\x4a\xa9\x36\xc0\x7d\xe3\x12\xa4"
- "\xcb\x5a\x82\x46\x04\xd6\x91\xf6\xbb\x15\xda\xef\xf5\xd7\x91\xaf"
- "\xfd\xb5\xd0\x1e\x59\xf5\xc8\xb7\x15\x62\xdc\xfa\x5a\x52\x60\x79"
- "\xbc\x19\x1d\xbe\x54\x4a\xe1\xb1\x5b\xfc\xde\x8e\xfe\x31\xae\xd7"
- "\xd8\x04\xda\x52\x5e\xbb\x99\x8c\xab\x9c\x73\x8c\xab\xec\x13\x8c"
- "\xab\xbc\x5d\xcf\x8e\xab\x4c\x26\x18\x15\xf0\xf1\x79\xe5\x03\x89"
- "\x71\x95\xb2\x76\xc7\x55\x98\xf1\x94\x4b\x48\xd3\x36\x3f\x29\x78"
- "\x1b\x3b\xae\xf2\xde\x3c\xef\xc6\x55\x5a\xe7\x1b\xa8\xf7\x00\x9f"
- "\xe5\x93\x01\x9f\xef\xe5\xe2\xf3\x45\xb8\xa7\xe3\x2a\x8e\x3e\xd6"
- "\xd1\xaf\xe2\x3a\x87\xfb\x56\x4b\x5e\x98\xaf\xf3\x58\x0a\xae\x6f"
- "\x97\x54\x87\x46\xe2\x36\x59\xd9\x78\x8a\xb1\xe6\x56\x1b\x4f\xc1"
- "\x75\xce\xd1\xcf\x76\x8d\x3e\xf6\x90\xbf\xb0\xee\x7d\x71\x84\xf4"
- "\xb1\x5f\x18\x3d\xd5\x57\x6e\x30\x5f\xe3\x3c\x86\x42\x30\x3f\xfc"
- "\x08\x1e\x73\x51\x36\x8e\x72\x24\xfc\x56\x1b\x47\xe9\x7a\x98\x7f"
- "\x69\x15\x62\x7e\xe8\x33\x82\xf9\xa1\xfd\xde\x63\xae\xf3\x75\x1e"
- "\x3b\x21\x98\x1f\xd1\xe3\xb1\x16\x65\xe3\x27\x47\x14\x6a\xe9\x9f"
- "\x6e\xfc\xa4\xeb\x61\x6e\x34\x0b\x31\x3f\xbc\x87\x60\x7e\xb8\xb8"
- "\x03\x30\x5f\xe3\x3c\x66\x42\x30\xff\xaa\x0f\xd6\x5e\xca\xc6\x4d"
- "\x8e\x9c\xbc\xd5\xc6\x4d\xba\x1e\xe6\x7f\xa9\x15\x62\x7e\xa4\x90"
- "\x60\x7e\xa4\xc0\x7b\xcc\xf5\xbe\xce\x63\x25\x04\xf3\x63\x3d\xf1"
- "\xd8\x8a\xb2\xf1\x92\xbf\xdc\x72\xe3\x25\x5d\x0f\xf3\xa3\x35\x42"
- "\xcc\xbf\xda\x44\x30\xff\x2a\xb7\x03\x30\x5f\xe3\x3c\x46\x42\x30"
- "\xff\x9b\x0f\x1e\x53\x51\x36\x4e\xf2\x97\x15\xb7\xda\x38\x49\xd7"
- "\xc3\xfc\xaf\xe5\x42\xcc\x8f\xad\x25\x98\x1f\x5b\xe3\xa9\x67\x76"
- "\x78\x65\x87\x3f\x66\xbc\xb2\x06\x34\xbb\xd3\xd8\x08\xc1\xbb\xec"
- "\x22\xa3\xd9\x15\x7b\x65\x63\xcd\xad\x32\x3e\xe2\xc0\x1a\xfb\xe5"
- "\xae\xe1\x95\xcb\x9c\xde\x7f\xfe\x6d\x31\xf1\xca\x7f\x4b\x95\xc2"
- "\x5a\x6c\x2e\x42\x25\x78\x4d\xc7\x5c\x84\xf5\x4b\x00\x47\xe0\x01"
- "\x9e\x8b\x80\xe7\x24\x88\xcd\x47\xc0\xf3\x10\x1c\x73\x12\xf8\xf3"
- "\x11\xc6\x98\x68\x0b\x9e\x93\x80\x7d\x72\x79\xfc\x06\xe4\x98\x9b"
- "\x80\xe7\x20\xac\x3c\x83\x7a\x62\x8c\xf0\xfc\x03\xec\x97\x6f\xf6"
- "\x1c\x84\xad\xf6\xae\x30\x07\xe1\xeb\xb8\xf6\xbc\xf2\xf8\x3d\xfd"
- "\x11\xf0\xed\xc6\x38\x55\xdb\x96\x30\x84\xeb\x1c\xc6\x28\xb0\x81"
- "\xd4\xc3\x7d\x2f\x94\x50\x55\x69\xa5\x68\xfd\x32\xa4\x76\x8c\x5f"
- "\xe0\x3a\x08\xed\x72\xa0\x15\xf0\xcc\x9a\x43\xc6\x31\xec\x3f\xc6"
- "\xf5\x34\xbf\x96\x84\xbf\xd5\x57\x1f\xfe\x67\x09\x85\xc7\x1e\x77"
- "\xcc\x44\x83\xdf\x3f\x8f\x86\x55\x36\x9d\x46\x4c\x9d\xca\x0f\x1b"
- "\x06\xd7\x6a\xdb\xf2\x87\xc6\xd8\x43\xc2\x74\xe6\x90\x30\x03\xc6"
- "\x2d\xab\x1e\x21\x5c\xbf\x30\x6e\x55\x69\x85\x37\xf0\x62\xb0\xa2"
- "\xd8\xb1\x0d\xc9\x3a\xf5\x8d\x62\xcc\x0a\x2e\x01\x66\xf3\x85\x98"
- "\x15\x2a\x1d\xdf\x70\xcc\xe7\x9e\x6f\xa0\x0a\xa1\x4e\x2d\x8b\x05"
- "\xcc\x9e\x97\x8b\x59\xb9\xe4\xfe\xef\x6e\x30\xcb\xf4\x10\xb3\xa3"
- "\xed\x63\x76\x58\x2b\x82\x59\x29\x5c\x5b\xc4\x62\xb6\x0b\x30\x2b"
- "\xe6\x30\xbb\xe6\x21\x66\xce\x1e\xf6\xe7\x84\x59\x85\x51\x3e\x66"
- "\x3a\x0f\xeb\x99\xce\x83\x7a\x76\x38\xcd\x15\x33\x1d\xd4\x33\x1d"
- "\x5b\xcf\x74\x50\xcf\x74\xbc\x7a\x76\xd1\x43\xcc\x9c\x3d\xe8\xcf"
- "\x09\xb3\x2a\xc9\xf5\xbf\xdd\x60\xe6\x61\x3d\xd3\x79\x52\xcf\xaa"
- "\x45\x30\x83\x7a\xa6\x63\xeb\x99\x0e\xea\x99\x8e\x57\xcf\x4e\x7b"
- "\x88\x99\xb3\x87\xfc\x39\x61\x76\x42\xfa\xfb\x6f\x49\xcc\xf4\x1e"
- "\xd6\x33\xbd\x07\xf5\xcc\x68\x70\xc5\x4c\x0f\xf5\x4c\xcf\xd6\x33"
- "\x3d\xd4\x33\x3d\xaf\x9e\x1d\xf2\x10\x33\x67\x0f\xf8\x73\xc2\xec"
- "\x1b\xc9\xfd\x1f\xdd\x60\xe6\x61\x3d\xd3\x7b\x50\xcf\x8c\x99\x22"
- "\x98\x41\x3d\xd3\xb3\xf5\x4c\x0f\xf5\x4c\xcf\xab\x67\xe9\x1e\x62"
- "\xe6\xec\xe1\x7e\x4e\x98\x9d\x94\xdc\xff\x5d\x0a\x33\x06\x2f\xd0"
- "\x8e\xa2\x98\xb5\x0a\x75\xa3\x15\x74\x3c\x7e\xe7\x25\x8a\xd7\x9b"
- "\x5f\x96\xd1\xab\x7c\x35\x18\x2b\xac\x07\x31\x5e\x55\x69\xc7\x44"
- "\x75\x23\x7e\x2f\x06\xb8\x23\xfc\x6e\x6c\xe5\x39\x19\x7a\x71\x86"
- "\x14\x56\xed\xbf\x0f\x2b\x98\xc7\x61\xe5\x78\x1f\xd6\xa1\x58\x7d"
- "\x23\x17\xab\x7f\x8e\x50\x86\x95\x2e\xb3\x7d\xac\x74\x47\xdd\x63"
- "\x75\xb8\x9a\xc3\xea\x34\x0f\x2b\xd7\x7e\xcc\x73\xac\x9c\xfa\xaf"
- "\x9f\x15\x56\xff\xaa\x93\xc2\xca\xaa\x19\x1a\x83\xbf\x79\x9f\x00"
- "\xde\x97\x7e\x35\xee\xb9\x9c\xb3\x48\xb7\xe1\x2c\x1a\x81\xbf\x6f"
- "\xde\xb7\xcc\x42\x41\x19\xff\xf7\xf5\xc9\x3a\xd4\xf6\x63\x68\x0f"
- "\xfc\xfd\x0c\xd3\x4e\xbe\x16\xea\x5f\x15\x6f\x66\xda\xc4\x6c\xc0"
- "\xa8\xb2\xa9\x14\x62\xd2\x6d\x4c\x65\xd3\xa7\xa8\x75\x51\x1c\xfa"
- "\xfb\xa9\x7a\xc0\x85\x6e\xab\x6a\x28\x45\x3b\xe0\xbc\x71\xc9\xa7"
- "\xc8\xfe\xa3\xa1\xc7\xb4\x34\x44\x5d\x52\xd5\xec\xc5\xde\xf9\xe1"
- "\x34\xa4\x1e\xd7\x40\x5b\x2a\x1b\xbe\x46\xef\xcf\x40\xba\x63\x69"
- "\x08\xe1\x58\x33\x5e\x79\x0e\xf6\xca\x87\x04\xf8\xbc\xc7\xf3\xca"
- "\xcc\xf7\xb2\x29\x80\xcd\x15\x27\x6c\xc0\x8b\x43\xac\xbb\x4d\x68"
- "\x02\x6c\x9a\x1c\xd8\x5c\x44\x19\x0b\x30\x36\x26\xce\x2b\xb3\xd8"
- "\x14\xe0\x36\x2f\x85\xe7\x95\x2f\xf1\xb0\x61\xbf\x55\x15\x60\xe3"
- "\x18\xcb\x78\xdd\x80\xdf\x91\xbb\x78\x65\x65\x63\x19\xdf\x49\x7e"
- "\x2b\xc2\xd4\x23\xa8\x23\x13\xa0\x1e\xad\x48\x65\xea\x11\x89\x7f"
- "\xef\x30\xe0\x7b\x09\x0a\x34\x75\x1b\xb3\x01\x30\x68\x85\xba\x86"
- "\xfb\xa2\x95\x50\x4e\x8c\x25\xc6\x6d\x42\x71\x5b\xdb\x2b\x4d\x88"
- "\x82\x36\x2b\x0a\x63\x67\xfb\x31\xd4\x3f\x07\xfa\xaa\xaa\x29\xdf"
- "\x03\x3e\x8d\xa8\xca\xcc\x62\xb3\xec\x7b\x74\x49\xf5\x7d\x24\xfd"
- "\x9a\xa1\xc7\x43\xc0\x53\xe8\x7b\xd4\xd3\xf0\xb7\x2f\xd0\xe6\xbd"
- "\x3f\x13\x0d\x1b\x97\x42\x5b\x98\xb9\x3c\x50\xc7\x70\x7f\x86\xdb"
- "\xc3\xca\x94\xbf\x20\x5b\x7e\x98\xae\x2d\x64\x68\xcc\x31\x50\xb3"
- "\xb8\x4d\xc4\x58\xf8\x2d\xe6\xb0\xc3\xdf\xed\xf1\xc7\x3a\x5c\xda"
- "\xc2\x39\x5f\x8b\xd7\xaf\x29\x26\x59\xe3\x1d\x05\x6c\xfd\x2a\x50"
- "\x3a\xde\xe1\x18\x8f\x02\x0c\xf1\xb7\x7a\x2b\xbf\x45\xd4\x7b\xb2"
- "\x31\xfc\xb7\xe4\xfe\x27\x6e\x30\xcc\x6c\x1f\xc3\x66\x07\x86\x47"
- "\xdb\xc7\xf0\x94\xaf\x08\x86\x45\x1c\x86\x87\xb5\x3c\x0c\x4b\x59"
- "\x0c\x77\xf1\x30\x2c\x6e\x1f\x43\x27\x2f\xfd\xb3\xc2\xf0\xb4\xfb"
- "\xf1\x0f\x51\x0c\x75\x1e\xd4\xc3\xcb\x2c\x86\x3a\x0f\xea\xe1\xe9"
- "\x32\x57\x0c\x75\xbc\x7a\x78\x38\x8d\xc3\x50\xc7\xd6\x43\x1d\xaf"
- "\x1e\xea\x3c\xa8\x87\x4e\xde\xfa\x67\x85\xe1\x7f\xaa\x15\x60\xe8"
- "\x41\x3d\xfc\xc1\x81\xa1\x07\xf5\xf0\x87\x2c\x11\x0c\xf9\xf5\xb0"
- "\x9a\x87\x21\x5b\x0f\x75\xbc\x7a\xa8\xf3\xa0\x1e\x3a\x69\x95\x9f"
- "\x15\x86\x26\xc9\xfd\xdf\xa5\x31\xd4\x7b\x50\x0f\x0f\xb3\x18\xea"
- "\x3d\xa8\x87\x67\x62\x5c\x31\xd4\xf3\xea\xa1\xd1\xc0\x61\xa8\x67"
- "\xeb\xa1\x9e\x57\x0f\xf5\x1e\xd4\x43\x27\xef\xfd\xb3\xc2\xf0\xac"
- "\xfb\xf1\x7f\x71\x0c\x3d\xa8\x87\x2b\x1d\x18\x7a\x50\x0f\xff\xab"
- "\x11\xc1\x90\x57\x0f\x8d\x99\x3c\x0c\xd9\x7a\xa8\xe7\xd5\x43\xbd"
- "\x07\xf5\xd0\xc9\x8b\xff\xac\x30\xac\x95\xdc\xff\x8a\x8f\x21\xe8"
- "\x6c\x57\x5d\xda\xc4\x61\xc8\xc7\xcf\x59\x8b\x46\x83\x46\xc5\xd8"
- "\x4d\xb1\x22\xca\x15\xbf\xda\x93\x18\xbf\x70\xfc\x3e\xee\x1a\xa7"
- "\x49\x19\xec\xd8\xf7\x39\x18\xb3\x63\x09\x08\x61\x7d\xea\xd0\xa3"
- "\xf8\x9d\xea\x0d\x3d\x9a\xf8\xff\xab\x1e\x3d\x57\x23\x1f\x3b\xb6"
- "\x1f\x94\xc4\x4e\xd8\xf7\x45\x43\x9f\x28\x8d\xdd\xf9\x5c\x57\xec"
- "\x74\x45\x1c\x76\xa4\xdf\x23\xd8\x1d\xae\x76\xf4\x7f\x04\x3b\xb6"
- "\xff\x73\x8b\xdd\xcf\xb9\xff\xfb\x9f\x64\xff\x67\x5b\x8d\xa8\xc2"
- "\xd5\xf6\x92\x5c\xca\x5e\x0a\x3f\x23\xfc\xca\xe0\x98\x1f\x1c\x63"
- "\x74\x0f\xfc\x9f\x39\x67\xef\xc1\xac\x05\x66\x0c\xf4\x89\xc7\x7b"
- "\x7a\xe0\x34\x77\x38\xd2\x04\xae\x42\x91\x3b\xd8\x3c\xe0\x78\x26"
- "\x1c\x37\xf6\xf2\x89\xbc\x03\xd2\x97\xd1\x39\xbf\x2f\x82\x63\xdd"
- "\x70\x5a\x7a\x95\x2f\x59\xd3\x81\xa2\x70\x1e\xce\xf7\xf4\x67\xd3"
- "\xf4\xe5\xdf\xb7\xe7\xaa\x48\xbc\x0e\x88\x23\x4d\x77\x3b\xf5\xef"
- "\x62\x9c\xce\xee\xe3\xab\xb5\xaf\x46\x5a\x7e\x5a\xfa\x69\x84\xf3"
- "\x75\xa4\xed\xc1\xe6\xa7\xe3\xa7\xb1\x7d\x80\x50\x2f\x1f\x2d\x93"
- "\x67\xaf\x14\x0a\x97\x09\xa7\xbd\x93\xee\xb5\xdb\xc2\xa4\xf7\xf1"
- "\x35\x08\xd2\xbf\x89\x98\xb4\x6c\xba\x00\xfa\x8e\xaf\x8c\x6c\x3a"
- "\x66\xee\x36\x1c\xf3\xe5\xc7\x8f\x4d\xd7\xd3\x11\x1b\xbc\xde\x38"
- "\xbf\xac\xb6\xd5\x14\xce\x0f\xa7\xe9\x65\xbf\xe3\x2f\xd5\x6c\x59"
- "\x06\xf3\xef\x89\xd3\xc1\x75\x8f\xb0\x71\x0e\x84\x32\x0c\xbb\x91"
- "\x5f\x6e\xbd\xc5\x91\x6e\xa5\x0d\xf5\xd9\xc1\xc5\x46\x4d\xe7\x14"
- "\x0f\xc6\x6b\x08\x3a\x63\xd7\xcb\xc7\xc7\x84\xb1\xab\x6a\x40\x08"
- "\xa7\xa5\x7b\xfd\xbe\x0e\xd2\x07\xb1\xe5\x88\x24\xe5\x60\xd6\x5b"
- "\x21\x58\x53\xd6\xbb\xb6\x33\xcf\xea\xa3\x65\x9f\x35\x18\xd2\x45"
- "\x39\xf2\xb5\x53\xcc\x38\x06\x9b\xd6\x97\x49\x5b\x99\x8c\xd7\xd4"
- "\xbf\x91\xfe\x2e\x9c\xd6\x96\xf3\x27\x5f\xdb\x2a\xdf\x31\xce\xf9"
- "\xdb\x56\xfb\xe3\xf3\xfc\xfc\x35\x24\xfd\x1f\xfa\x42\xfa\x71\xae"
- "\xe9\xd5\xce\xe9\x43\x48\xfa\xbd\xa1\x90\x3e\xc6\x35\xbd\x35\xd8"
- "\x29\x7d\x6f\x92\xfe\x23\x0d\xa4\x9f\xe8\x9a\x5e\xeb\x9c\xfe\x6e"
- "\x92\xfe\x73\x0b\xa4\x8f\x73\x4d\x1f\xe9\x9c\x3e\x94\xa4\x2f\x51"
- "\x43\xfa\x29\xae\xe9\x33\x9d\xd3\xf7\x21\xe9\x3f\x0d\x80\xf4\xf1"
- "\xce\xe9\x77\x30\x69\xd1\x00\x36\xed\x3d\x24\xed\x7e\x7f\x48\x9b"
- "\x20\x52\x56\x15\x9b\x77\x04\x9b\xfe\x17\x24\x7d\x71\x16\xa4\x4f"
- "\x72\x4d\xef\xeb\x9c\xbe\x2f\x49\xff\xb7\x70\x48\x9f\x2c\x82\x95"
- "\x73\xfa\x7e\x24\xfd\x17\xa9\x90\x3e\x45\x04\x2b\xe7\xf4\xfd\x49"
- "\xfa\x43\x49\x90\x3e\x55\x24\xf6\xce\xe9\xef\x25\xe9\x0f\x4f\x81"
- "\xf4\x69\x22\xb1\x17\xa6\xcf\x39\x12\x03\xe9\x56\x6c\x67\xb9\xe9"
- "\x14\x77\xe7\xbc\xef\x23\x79\x7f\x15\x05\xd7\x64\xba\xa6\x47\x3e"
- "\x24\x3d\x7a\x94\x4d\x3f\x80\xa4\x3f\x36\x0c\xd2\xaf\x11\x89\x7d"
- "\x18\x4e\xbf\x83\xa4\x0d\x23\x69\x0f\x34\x40\xda\x75\x22\x71\xe7"
- "\xa7\xd5\x91\xb4\x27\x6b\x20\x6d\x96\x48\xcc\xf9\x69\xf5\x24\xed"
- "\xd7\x45\x90\x36\x57\x24\xde\xfc\xb4\xf7\x93\xb4\xe5\x13\x21\x6d"
- "\x9e\xc8\xf3\x0e\xe0\xa5\x7d\x80\xa4\xad\xc4\xbc\xda\x2a\x82\x0b"
- "\x3f\xad\x81\xa4\xfd\xe7\x1a\x48\x5b\x20\x82\x09\x3f\xed\x40\x92"
- "\xb6\xea\x20\xa4\x2d\x12\xc1\x84\x9f\xf6\x41\x3a\xe7\x44\x0a\xdb"
- "\x4e\xef\x72\x4e\xbb\x9d\x6b\x77\x7f\x69\xef\xf5\x0f\x1d\xdb\x56"
- "\x92\xef\x56\x57\xe3\xb5\xec\x6e\x94\xeb\x31\x47\x1f\x61\xa7\x50"
- "\x38\x9d\x73\x3c\x14\xae\xc3\x79\xee\x75\x6d\xdb\x7c\x1f\xdb\xce"
- "\xf5\x11\x83\xe8\x9c\xda\x04\xf6\xfe\x25\xae\x69\xfd\xf9\x69\x1f"
- "\xa2\x73\xbe\x2b\x67\xd3\xee\x77\x4d\xab\xe6\xa7\x7d\x98\xce\xf9"
- "\x77\x2e\x9b\xb6\x54\xa4\x7d\x7d\x94\x97\x36\x82\xce\x39\x3d\x11"
- "\xd2\x1d\x14\x6b\x5f\xe9\xd5\xda\x47\x71\x7b\xe0\x68\xbb\x21\xfd"
- "\x23\x24\xbe\xe7\xb5\x10\x5f\x66\xae\x86\x23\x2d\xe0\xf0\x28\xaf"
- "\xaf\x7c\xd4\xde\xeb\x87\x50\x36\x66\x47\x5d\x9f\x21\x93\xff\x0c"
- "\x8f\x91\x3c\x4d\xa7\x20\xcf\x32\xe7\x67\x60\xdb\x23\xac\x13\x70"
- "\x7c\x07\xdb\x72\xce\x16\xe1\xf8\x42\xda\x72\x81\x46\xa0\x7c\x54"
- "\x38\x4f\x16\xdb\x21\x74\x4e\x4d\x04\x1b\x03\x41\x7f\x04\xf5\x91"
- "\x69\x0f\x01\xdf\x32\xfa\xcd\xbb\x0e\x42\xda\xa1\x6c\xba\x93\xce"
- "\xfd\x20\xfb\x7c\xbf\x82\x73\x35\x37\xfa\x40\x1f\xdf\x53\x62\x5a"
- "\x26\xe5\x41\x74\x67\xbd\xca\x4c\xe6\xe3\xdf\xd8\x57\xab\x91\xe9"
- "\x4f\xec\xbb\x82\xab\xa3\x9b\x68\x2b\xff\xd8\x46\x8a\xae\x7e\xb8"
- "\x09\xf9\xe2\x35\xf8\xe8\x90\x11\xeb\x4c\x70\xdc\xac\xbf\xab\xa8"
- "\x39\xc7\x6c\x35\xf9\x7c\xc9\xac\x29\xda\x9c\x73\xc5\xdf\x84\xe6"
- "\xf8\xe2\xbf\x37\xae\xa6\x2d\x78\x9f\x02\xdb\xe6\x7a\x63\x95\xbd"
- "\x01\xaf\xa5\x68\x81\x3c\x2c\xe7\x53\x90\x0a\xef\x29\x87\xd7\x75"
- "\xad\x4a\x6b\x40\xe7\x55\x57\xc6\xd3\xf3\x93\x46\xc0\x33\xe0\xf5"
- "\x56\x13\xce\xc2\xff\x49\x4c\x41\xfb\xe6\xd6\x9f\x32\x2e\xc4\xeb"
- "\xd3\x5d\xc9\x37\x87\x8c\x46\xf4\x1b\x2f\xd7\xa5\x64\xa0\x7b\xeb"
- "\x55\x57\xf2\x1c\x6b\x51\x31\xeb\x4f\x5d\x4e\x7a\x92\xac\x3d\xd5"
- "\xd8\xcf\x1e\x54\x7f\xca\x65\xed\xa9\xa2\xd8\x22\xb2\x9e\x55\x23"
- "\x93\x37\x3c\x5b\x35\xad\x0b\x2e\xb5\xb7\xae\xc9\xc4\xfb\xbf\x19"
- "\x33\xea\xd1\x59\xf6\x1c\xce\x93\xe4\x75\xe5\x22\xce\x03\xe7\xe5"
- "\xc8\x07\x5f\x67\xbe\x2f\xb6\x08\x97\x1d\xe2\x50\xea\xf9\xfa\x55"
- "\x57\x4e\xe1\xf5\xab\x64\xa4\xcf\xc3\xe9\xc5\xd7\xe5\x05\x8d\xb3"
- "\xa9\xde\xd2\x9c\xd3\x98\x0a\x5a\xf5\x24\x89\x7b\x63\xa6\x09\xd1"
- "\x13\xd9\xbf\xb3\x4c\x3e\x14\x8b\x47\xe3\x56\x93\xcf\x27\xf1\xec"
- "\xdf\xbb\x1c\xeb\x85\x89\xe6\xab\xae\x2f\x87\x78\xd7\xda\xdf\x8f"
- "\xf3\xc7\xda\x9a\xac\x5b\x5a\x5f\xae\xed\x8f\xd7\x73\xbe\x6a\x80"
- "\x7b\xd6\x92\xb8\x5c\xf5\x81\x7f\x03\xd9\x7f\xcd\xec\xbf\x34\x4e"
- "\xc3\x70\x49\x33\xb2\x94\xce\x7d\xa0\x86\xec\x05\x73\x95\x59\xab"
- "\x8c\xc1\x0e\xf0\xa5\x83\x1e\xa8\x61\xf2\xcd\x1f\x2d\x98\x23\x8a"
- "\x17\x05\x8b\x78\xe4\xd1\xc7\x06\x0f\x19\xfa\xab\x61\xc3\xa7\xcf"
- "\x78\x35\x21\x71\xe6\xac\xa4\xd9\x73\x5e\x4b\x9e\x3b\x6f\x7e\xca"
- "\x82\x85\x8b\x52\x17\x2f\x79\x3d\x6d\xe9\x32\x9c\xee\xc6\xf3\xbe"
- "\x1f\xe5\xd3\x44\x21\xc0\xee\x69\x7c\x9f\x6c\xe6\xde\x70\x8c\xe0"
- "\x7c\x75\x85\xaf\x56\x5c\xc3\x57\x81\xaa\xc6\xfb\x79\x34\xa8\xae"
- "\x7e\x87\xf7\x17\x01\x9e\xf9\x54\x15\x3c\xc7\xec\x61\x56\xab\xba"
- "\x5a\x5e\x69\x7e\xce\x88\xf7\xdc\xfb\x2a\xb4\x0e\xe9\x06\xe0\x7d"
- "\xce\xae\x96\xe2\xf3\x3b\xee\x47\xe8\x28\x5c\x2b\x96\xe7\x00\x35"
- "\x0a\x7d\xa7\x37\x6d\xce\xeb\x4d\x37\xe0\xfc\xf3\xb6\xd0\x75\xe6"
- "\xe5\x49\x28\x07\xfe\x0f\x5c\x57\x9f\x57\x35\x65\x7f\xd5\x97\xd9"
- "\x93\xa8\xef\xf6\x2d\x74\xed\x9a\xde\x74\xed\x1b\x5b\xe8\x86\x1d"
- "\xbd\x69\x93\x2e\x0f\x05\x34\xe7\x34\x45\x9a\x54\x57\xb7\x32\xf5"
- "\x06\xce\xdb\x7b\x5d\x1d\xb6\x11\xce\x3d\x6c\x45\xaa\x1d\xf0\x7f"
- "\x38\xd6\xf4\x95\x96\x3c\xf7\xc7\x8d\x16\x3f\xc8\x4f\x47\xb7\x25"
- "\xfb\xe4\xc0\x7d\x08\x26\x4d\x9f\x1c\x85\xde\x1f\xee\x67\xae\xb2"
- "\x9c\x45\x26\x55\x53\xc9\x8e\xeb\xcc\xfd\x02\xab\xb6\x36\x20\x9c"
- "\xdf\x47\x0b\x2d\x7e\x8b\xee\xa1\xad\x90\x36\xd7\xbe\x3c\xd9\x07"
- "\xd2\x24\x43\xde\x4d\xfc\xf2\x18\x66\xce\x4d\xd5\xce\x5b\x9c\x9c"
- "\x3c\xb0\x07\x32\x30\xff\x22\xfe\xfe\x7b\xa9\x90\x1f\x7a\x67\x0b"
- "\x7d\x14\xca\x69\x84\xf2\x96\x55\x80\x5b\x00\x7e\x20\x28\x53\xee"
- "\x79\xd5\x35\x3f\x38\x7e\x10\xfe\x3e\x08\xcf\x5e\xc6\xec\xe7\xe5"
- "\x7b\xc7\x23\x74\x4e\xd3\x41\x78\xce\x32\xbc\x47\x01\x5e\x4f\xf1"
- "\xea\xeb\x13\x7d\xa0\xdc\x79\x90\xae\x4c\x7b\x0f\xd2\xc3\x75\xd9"
- "\xf0\x1c\xbb\xe0\x6f\x9c\x7e\x38\xc6\x11\xd2\xff\x3f\xf6\xde\x05"
- "\x3e\xca\x2a\xcb\x17\x5d\xf5\x08\x04\x8c\xe4\x61\xa4\xd3\x36\xdd"
- "\x16\x76\xb0\xa3\xf2\x48\x20\xda\x91\x06\x8d\x24\xd8\x41\x13\x48"
- "\x0b\x6a\x14\x04\xa2\x89\x56\x9a\x00\x91\x04\x28\x30\xa4\x2a\x05"
- "\xd8\xb1\x1b\x21\xc4\x88\xb1\x0d\x49\x1c\xd1\x8e\xa7\xe9\x91\xbe"
- "\xc3\xcc\xe4\xfc\x7e\xa8\xe9\x26\x73\x0f\x3d\x03\x29\xce\xb9\xcc"
- "\xef\x64\xfa\xe0\x74\xc9\x49\xd3\x91\x09\x58\x9a\x82\x14\xa4\xaa"
- "\xf6\xfd\xaf\xbd\xbf\x2f\xf5\x48\x05\xf5\x8c\xe7\xf1\xbb\xd7\xe8"
- "\xc7\x57\xdf\x7e\xac\xbd\xf6\x5a\x6b\xaf\xbd\xf6\x6b\xed\x1e\x59"
- "\x2f\xf3\x84\xe9\xfc\x0d\x5a\x75\x1f\x9c\x2a\xf6\x0c\xef\xbd\x6c"
- "\x65\x7f\xab\xf2\x8e\x18\x7c\x83\x2e\x27\x90\xb6\x71\xc8\xbe\xc2"
- "\xc0\x77\x55\xb6\x87\x60\xe6\x30\x4e\x8c\x07\x8f\x5d\xff\x09\x96"
- "\x60\x70\xa4\x84\x66\xf9\xc8\xf0\x4f\xfd\x44\xad\x07\x44\x07\x9e"
- "\x56\x3c\x2d\xff\x88\xb8\x3f\xe0\x39\x81\xf0\x93\x78\xff\x23\xde"
- "\x7f\xe8\x97\x6b\xa1\x69\x8c\x77\x75\xad\x18\x98\xd3\x42\xdf\x97"
- "\x77\x61\xd6\xd1\xe3\xe7\xcc\x71\x0d\x8c\x3b\xfb\x56\x16\x53\x2e"
- "\xfb\x23\x7d\xc0\x0e\x57\x11\xe2\xf1\xde\x25\xdf\xe1\x8f\x69\xf8"
- "\x24\x9e\x41\xf5\xdb\x97\x8d\xdf\xab\xb4\xdf\x05\x78\x56\x7c\xe1"
- "\x13\x0d\x6f\xbc\xc7\xe4\xeb\xfe\xd2\x69\xbf\xdc\xe3\xff\x72\xe5"
- "\x5e\xb3\x91\xc9\x7f\x9a\x4c\x81\xf8\xc8\x70\xbf\x5b\x85\x19\x0e"
- "\xab\x30\x43\x97\xf6\xee\x27\xb3\x11\x74\x32\x02\xbe\xc9\xa2\xc2"
- "\x4c\x33\xf1\xae\xc1\xe3\x88\x2c\x7f\x02\xf2\x4f\x48\x65\x7e\x8e"
- "\x40\xdf\x33\x2f\xdd\xa6\xcb\x27\x99\x47\xfb\x94\x6c\x19\x78\xbf"
- "\x03\xc2\x4e\x40\xb6\x5a\x47\xe5\xc7\x34\xfc\x7e\xa4\xfc\x0c\x77"
- "\x46\xc9\x4f\x23\xeb\x23\xe4\x4b\x6d\x57\xf2\x72\x6c\xe8\x85\x32"
- "\x7c\x0f\x1f\x06\x9c\x63\x96\xd5\x0c\xc3\x27\xc7\xcd\xfb\x2e\x10"
- "\xdd\x68\x25\xe9\x1f\x72\xd0\x34\x1c\x60\x99\xe5\xb2\xb5\x72\x15"
- "\x2e\xc0\x0f\x61\x1d\x8c\xdf\x46\xc0\xc5\xf7\x21\xa4\xeb\x70\xd1"
- "\xe7\x3a\x6e\x32\xcf\xcf\x7f\x0a\x79\xd4\xf0\x65\x98\x9c\x4f\x84"
- "\xea\x75\x82\xf3\x68\x65\xff\x16\xe1\x99\xd0\x51\x64\xff\x8c\x4c"
- "\x2e\x90\x92\x65\x92\xdf\x2e\x7f\x26\xda\x52\x01\x05\xb9\xaf\x4b"
- "\xa3\x4c\xb4\xb7\x49\xe7\x4c\xbe\xe6\xd9\xb5\x94\xc9\xf0\x58\x87"
- "\xbb\x4d\xbe\x92\x76\x6e\x8b\x0a\xd6\xbb\xca\xf7\xe2\xe5\x13\xff"
- "\x58\x45\xb2\x9c\x36\xc6\x07\xf1\x61\xe5\x36\xbb\x30\x0a\xda\xb7"
- "\x5d\xd5\x15\x65\x1d\x42\xfe\x23\x5c\x77\xa6\x27\xe2\xbb\x00\xc7"
- "\xc3\x71\x7c\xbf\x8a\x56\x9f\x43\x7c\x36\x83\xe9\xc1\xe9\xf9\x4e"
- "\x48\xe5\x53\xf6\xf2\xcd\x92\x6e\xc8\xcf\xfc\x10\x28\x83\x61\xd8"
- "\xfd\xc2\x2f\xa0\x8f\xde\xda\xce\xf7\x08\x5c\xab\x88\xe4\xcf\xd5"
- "\x82\x70\xfe\x20\xdf\x11\xe4\xef\xe1\x3e\x98\xf5\x09\xca\x4c\xe4"
- "\x3b\xd0\x10\xd6\x18\xdc\x0b\x18\x5b\x7c\x72\x1e\x08\x70\x9e\x00"
- "\x2e\x8d\x0c\x07\xf8\xf4\x68\xb0\x9a\xd9\xdf\x64\x38\xaf\x35\x78"
- "\x87\x98\xe7\xb2\x3d\x6f\x97\x75\x82\xee\xba\x76\x47\x9b\x8a\xeb"
- "\x42\x9a\x2e\x31\x52\x40\xe2\x85\x12\xed\xae\x35\x19\x77\xd4\x7e"
- "\x55\xf2\xb7\x47\xdd\x53\x78\x6d\x49\xf5\x0e\x31\x10\xc2\xfb\x1a"
- "\xe9\x7e\xd5\x35\xbc\x8f\x72\x79\x62\xeb\x2a\xd9\x8f\x72\x19\x9c"
- "\x5f\xc1\xbb\x7a\x96\xe1\xe9\xb4\x9a\x0d\x3c\x14\xbd\xae\x26\x21"
- "\xfc\x10\xcb\xa2\xa4\x1b\xf4\xe8\x90\x9d\x65\xf1\x9a\x19\xf9\x59"
- "\x87\x1e\x1b\xda\xca\xdf\x57\x5b\xa4\x8e\x1d\x8d\xbf\x5a\xc8\xf1"
- "\xae\x01\xf0\x6d\x1d\x64\x29\x48\xf4\xfd\x54\xca\xf4\x3a\x65\xdd"
- "\x0e\x7b\x5f\xc8\x37\x1c\xf7\x13\x31\x9e\xa0\x51\x17\x70\x3d\x8c"
- "\xbe\x66\x90\x71\x85\xbe\x3e\x2a\xde\x2a\x21\xc6\x19\xfa\x4c\xc3"
- "\x6f\xe4\xbb\x1a\xef\x8f\x72\x1d\x99\x9e\xb3\x95\xee\x43\x9c\xff"
- "\x77\x8c\x7b\x58\xbd\x7d\xe1\x34\x96\xf5\x06\x1f\x98\x5f\xcc\x97"
- "\x10\xcc\x6b\x2c\xfb\x8d\x80\x75\x58\x7d\x2b\xd9\x60\x5a\x37\x4e"
- "\x15\x27\x39\x7d\x28\xad\x3f\x8b\xe3\xea\x50\xf6\x9c\x2a\x79\xbf"
- "\x9b\x81\x7d\xe3\x03\xee\x61\xbe\xef\x13\x30\xba\x98\xa6\x48\xb7"
- "\x9b\xe5\x11\xdf\x27\x35\xbc\x77\xa1\x3f\x9f\x89\x67\x41\xa8\xfd"
- "\xfb\x37\x47\xca\xd7\x48\x74\xfb\x67\x7e\x37\x06\xed\x05\xa4\xdd"
- "\x75\x6c\xb9\x64\xf2\x27\x6b\x7d\x87\xc6\x6b\x7f\xf9\x71\xb4\x97"
- "\x30\x18\x83\x51\xbc\xee\x92\xf2\xb8\xb5\xd0\xc0\x75\x46\xde\x2e"
- "\x05\x67\x44\xd6\x59\xca\x93\x53\xca\xc0\x49\xb1\x15\xf5\x1c\x95"
- "\x83\x91\x02\x8d\xcf\x27\xa3\x68\xa2\xeb\xae\x66\xbe\xa7\x8b\x75"
- "\x12\x6c\xdc\xfb\x86\x47\x42\x7a\x89\x79\x1f\x94\xbc\x1f\xf1\xb4"
- "\xab\xfe\x56\xd3\x5b\x23\x2a\x7e\x6a\x84\x0c\x73\x9d\x66\x48\xf9"
- "\x65\x5c\xec\xab\x18\x97\x2e\x89\x87\xdd\x42\x88\x6b\xe5\xf2\xdd"
- "\x26\x7f\x86\xd6\x5e\x35\x58\xd7\xfc\x0c\x6b\x27\x74\x15\xe3\x84"
- "\xb2\x1b\xa4\xfe\x7b\x50\xd2\x24\xa0\xe1\x7e\xc2\xe7\xe4\xbc\xc3"
- "\x9e\xab\x46\x99\xf7\x04\x7e\x97\xf9\xd4\x3d\x07\x93\x91\xbf\xd3"
- "\xf2\x34\xf7\xe3\x86\x55\xac\xa3\x2d\x4f\xca\xdf\x8b\x2d\x8f\x41"
- "\x56\x2f\x90\x19\xf0\xe2\x59\x46\x75\xb9\x18\x34\x1b\xee\xe6\x31"
- "\x03\x68\x7d\x18\x36\x52\x27\xd3\x9b\x65\x19\x36\x52\xf6\xf0\xde"
- "\x40\x99\x2e\xb7\x28\xa7\x95\x69\xaf\xf8\x13\x78\x17\x72\xdc\x15"
- "\x92\xad\xc0\xbb\x1a\x1d\x3b\x41\xc7\x78\x94\x77\x87\x56\x2f\xbe"
- "\x63\x34\x09\xdf\xdf\xd6\x70\x6f\xd1\xd2\xff\x83\xce\x07\xad\xad"
- "\x9e\xdc\xcb\xfa\x57\xf2\x20\xb8\x4a\xcb\x7b\x48\x95\x15\x7c\x4a"
- "\x4f\xcb\x36\xa2\xba\xb3\x2c\xf8\x14\xeb\xc1\x39\xe0\xbd\xd4\x7d"
- "\xf2\x2e\x5c\x15\xc6\x6d\x47\x96\x61\x36\xc4\x49\x39\x84\xdd\x13"
- "\x92\xa3\x60\x76\x94\x7e\x62\x5d\xdc\xd8\xbb\x4b\xdd\x09\xc1\xb2"
- "\xc4\x3a\x95\xc7\x26\x80\x97\xa0\xb5\x1f\x0d\xe7\xe0\x9b\x91\x76"
- "\x12\x7d\x06\x59\x99\x15\x06\xbb\x31\x56\x3f\xd7\xae\x74\x60\xab"
- "\x56\xb7\x8f\xb5\xba\x1d\xd6\xea\xf6\xb1\x56\xb7\x4e\x94\x01\xba"
- "\xd1\xdb\x61\x74\x04\xdd\x28\x59\x4b\xdf\xc5\xba\x3c\xd4\x5e\x45"
- "\x91\xde\x96\xc7\xe8\x0b\xb3\x6a\x0f\x21\xbc\x44\x46\x94\xbe\xe8"
- "\x8a\xad\x2f\x82\x3e\xad\xbe\x1d\x51\x6d\xe3\x90\xc2\x5d\xeb\x5b"
- "\xc0\x87\x5e\xaf\x7e\x37\xc7\xe5\x9b\x59\x7f\x72\xd9\xe1\x7d\x50"
- "\x9b\xa2\xab\xd6\x96\xc5\xc5\xb1\x7c\x10\xc7\xc2\xdb\x33\xf3\x9a"
- "\x75\x02\xc3\x60\x9e\x4a\xbb\x12\x61\x8a\xaf\xd2\x6e\x6d\x0c\xd7"
- "\xd1\x48\xdb\x1c\x14\xdc\x5e\x44\x77\x64\x5b\x14\x33\xb5\xb6\xa8"
- "\xca\x36\xd3\x7e\xf0\x28\x73\xb4\xdc\x26\xca\x8e\x2a\x97\x79\xd3"
- "\x23\x7d\x2f\x2b\x9e\xee\xd0\xfb\x34\x4e\x8f\xbc\x36\xe4\xb1\x46"
- "\xf5\x8f\x8d\x8c\x9f\xdb\x14\x74\x4b\x9d\x75\x40\xea\x0a\xdb\x30"
- "\xe3\x63\xa6\xca\x76\xad\x9f\x40\x58\xa6\x16\x96\xa3\xf5\x25\xba"
- "\xdc\x7c\x14\x85\xd3\x89\xd8\xf6\x51\xd0\xad\xdb\x47\x12\xd6\x88"
- "\x84\x75\x52\xab\x1f\x87\xcd\x52\xfa\x29\xd8\xcc\x61\x7b\x15\x1d"
- "\x9a\x85\xec\xaf\x82\x39\x5a\x7f\xc5\xed\xcb\xe8\x36\x05\x3a\xb9"
- "\x8d\xf1\xb7\xdb\x6c\xb0\x30\x7c\x97\xe3\x1a\x8f\x21\x5a\x10\x97"
- "\xcf\xfa\x80\xf5\x85\xe5\x59\xa5\x37\x2c\x4b\xe5\x7b\x3d\xeb\x1d"
- "\xb6\x43\x38\x1e\xe9\xb2\x59\x17\x21\xbc\xde\xf2\x10\xec\x82\x7f"
- "\x8b\x37\x02\x56\x99\x96\xf7\x55\x69\x2b\xfc\x5b\x81\x49\x0f\xd3"
- "\xf3\xa1\xad\x2f\xe6\x7c\x9c\x5f\xd7\x5f\xac\xbb\xfc\xac\x9b\x54"
- "\x79\xff\xa2\xc9\xb8\x1c\x37\xe8\x76\xd1\x88\x31\x2c\x2d\xdf\x57"
- "\x20\x75\x9a\x31\x5d\xe9\x33\xe3\xcd\x9c\x57\xf2\x0f\xba\xb2\xee"
- "\xaa\xf8\xb8\x7d\x13\x99\xdb\x3e\x97\x36\x56\xaa\xc2\xd3\x58\xa5"
- "\xea\x61\xbc\x57\xd6\x43\xe9\xd4\x46\x85\xcb\xe5\xd4\xb6\x6b\x32"
- "\xee\x51\xae\x0b\xc7\xed\x0b\x8b\xe3\x3b\x43\x10\xf7\xbc\xc4\x2b"
- "\x2a\x5f\x70\xc4\x3a\x26\x7d\xbb\xba\xfb\x36\xbe\xed\x80\xae\x7b"
- "\x8d\x1e\x0d\xcf\xdf\xe8\x7a\x17\x74\x59\xc0\xba\x57\xc6\x3d\xab"
- "\xa5\x59\xaa\xbd\x1f\x94\xef\x8f\x14\x5d\xd3\x8c\x1a\xbd\xf3\xb5"
- "\x7a\x7c\x26\xc7\xd9\xff\x56\x02\xda\x1a\xcf\xe8\xb4\x0d\xff\xcd"
- "\xed\x07\xe5\x27\xf1\xb7\x94\xfb\x5a\x39\x86\x6d\xe5\x34\x8c\x93"
- "\xec\x23\xcc\x86\x93\xd1\x36\xf5\x79\x73\x5c\x05\xf7\x4b\xd2\x56"
- "\x35\xc7\x2d\xd1\xe6\x80\xa8\x7b\xd3\x5f\xa1\x5f\x30\x35\xeb\x3a"
- "\x46\x0c\x17\x10\xfb\x2c\x3f\x6f\x96\x97\xc7\x19\xd8\xc7\x7d\x78"
- "\x1a\xd6\x4f\xef\x5d\x73\x6b\x30\x4d\x55\xba\xde\x60\x5d\xd2\xeb"
- "\x3d\xa7\x6c\x3a\xb3\xd9\xd2\xa6\xe9\x92\x4b\x66\xf3\xf4\x08\x3b"
- "\x0c\xdf\x11\x3a\xc3\x1c\x77\x77\xb4\xce\x80\xdd\xbc\x6b\xb8\xc9"
- "\xe4\x8d\xb0\x03\x10\x76\x5d\xdd\x61\x36\x9d\xe0\x36\xca\x77\x16"
- "\x49\xfd\xb4\x49\x96\xf5\x92\x8e\x33\xeb\xcd\xa1\x17\xb4\xf9\x0b"
- "\x73\xdc\x0c\xb6\xd5\x22\xcb\x33\x97\x45\xe8\x4e\x2e\x4f\x87\x67"
- "\x26\xbe\xf7\x06\x74\xf8\x9c\x61\x66\x6b\x7a\xbe\x23\x42\x57\x6a"
- "\x7d\x18\xeb\xc9\xc8\xbe\xea\xf2\xcd\x91\x7d\x55\x5c\xf2\x18\x1d"
- "\xd9\x64\x76\x7f\xe9\xbe\xca\x6c\xee\x62\xbd\xa5\xeb\xc8\x08\x5d"
- "\x60\x36\xf7\xb7\x85\xdb\xb2\x66\x73\xa5\x6e\xcb\x8e\xea\x51\xb3"
- "\xc9\xcf\x3a\x0a\xe5\x77\xa9\xb2\xe3\x56\xa1\xdf\x5f\xab\x97\x8d"
- "\xf8\xe6\x5e\x8c\xc8\xc4\x5e\x2f\xe4\xc8\x94\xab\xd9\x80\xb2\x6d"
- "\x5e\xe3\xbb\x3f\xcc\xc6\x06\xc8\xdf\x64\x96\xb3\xee\x0d\x9f\x53"
- "\x7f\xa8\xaf\xe8\x19\xda\x38\x4a\xdf\x8b\xe1\x76\xe1\xc1\x03\xa2"
- "\x01\xe5\xf4\x84\xd7\xf1\x65\x84\xed\xd3\xe6\x10\x24\x6d\x19\x96"
- "\x39\xae\xa5\xfd\x40\x64\xdd\x54\x3d\xe2\x4e\x72\x3d\x78\x4c\x84"
- "\xf2\xd9\xce\xe6\x3b\xcf\x93\xd0\x6e\xb8\x1d\x74\xea\x76\xd1\x55"
- "\x67\xb8\x7d\x75\xb9\x92\x75\xa5\x36\xf6\x3c\x01\x7b\x27\x62\xbe"
- "\xaf\x28\xaf\xd8\x52\xb5\xa9\x62\x43\xcd\xb3\x73\x2d\x15\x1b\x2a"
- "\x6a\x2a\x4a\x2b\x2b\xb6\x97\xd6\x54\x6c\xdc\x30\x73\x7d\xe9\x73"
- "\x15\xcf\x58\xb6\x96\x56\x5b\x32\x6d\x33\x6c\x93\x29\x94\x74\xbe"
- "\xa5\xb4\xba\x7a\xf3\xfa\xf2\x32\xcb\x86\x8a\x67\x66\x6d\x2a\xaf"
- "\x2e\xaf\xb1\x94\x6e\xda\xb8\x79\x43\x99\x65\x46\xd9\xec\x19\x99"
- "\xf7\x94\x4d\x0e\x9f\x43\xbb\x2d\x89\x06\x83\x57\x3e\x19\xd8\x77"
- "\x85\xe2\x13\x0d\x55\x9b\x12\x6d\x15\x1b\xe4\xbc\x9d\x79\xe2\xdd"
- "\x73\x9a\xa9\x8a\xef\x1c\xe7\x7b\x66\x45\xd3\x84\x02\xbc\xcd\x9c"
- "\x0e\xf5\xb4\xb4\xf3\xbd\xe3\x53\xc5\xb4\xe1\xa6\x09\x3e\xb7\x79"
- "\xb2\xbc\x2f\x1d\xb4\xb0\xa0\x6e\xd3\xc4\x95\x3f\x0c\xc0\x66\xab"
- "\xe2\xfd\xd9\xed\x57\x28\xb5\x71\x0b\x99\xf1\x24\xe0\x49\xe2\x3b"
- "\xc9\x87\x9b\x26\xce\x74\x9b\xe3\x0b\xa4\x0f\x7f\xf3\xc4\x93\x9e"
- "\xe4\x19\x5d\xa2\x71\x86\xba\x7f\xdc\x3c\xf1\x0f\xfa\x5c\xf3\xb2"
- "\xdd\xb4\x8c\xe5\xf3\x9c\x79\xa2\x9c\x63\xdf\x09\x59\xe6\xf9\xd7"
- "\xa1\x0f\x16\xe5\xc2\x1e\x3c\xdb\x7d\x8b\x8c\xfb\x83\xd7\x48\x09"
- "\xc0\xcb\x7c\xbc\x36\x93\x5e\x41\x59\xd5\x69\x42\xa0\x8c\x46\x7d"
- "\x3e\x8d\xef\x89\x47\x5d\xfa\xb4\x7a\x54\xcb\x7a\x1c\x10\xe9\xcd"
- "\x29\xc0\xaf\x49\xe2\x73\x4c\xaf\x03\xf0\xee\x03\x4e\x16\xbe\x27"
- "\x9e\xf1\x8a\x35\xd7\xc7\xf3\x5d\xe7\xcd\xf1\x71\xc1\x2d\xa0\xdb"
- "\xf7\xd4\xbd\x47\xfb\xda\x54\xfb\x43\xbd\x16\xb4\xe3\xf7\xde\xcf"
- "\x29\xe1\x65\xbe\x7b\xdb\x79\xab\x38\xe5\xf5\x93\xcb\xda\x47\x89"
- "\xdb\x84\x47\xfc\xdd\x27\x03\xaa\x4e\xf1\x99\xac\x1b\xfe\xe6\xa7"
- "\x7d\x66\xae\x13\xfa\x8a\x04\xbe\xc7\x79\x9c\xb9\x45\xf3\x2b\x53"
- "\x85\x57\xbc\x11\x66\x73\x99\xe3\x5f\x67\x9a\xb0\xbd\x35\x84\x7e"
- "\x6a\xb8\x29\xde\x01\xbc\xfb\x34\xdb\xd8\x2b\x46\x56\x19\xc2\xd2"
- "\xb2\x9c\x79\xc7\x81\x1d\xaf\xc3\xe6\x3b\xbd\x39\x8f\xe2\xff\xa4"
- "\x38\xe4\xf1\x84\xc1\x77\x47\xc3\x67\x98\xf8\xed\xd1\xcb\x91\xe3"
- "\x70\x73\x3c\xdb\x04\x1e\xc8\xb2\x67\x9c\xf2\xd2\x9b\x0e\x88\x33"
- "\x2e\x84\xef\xbb\x4a\x66\xa4\x45\xbf\xc1\xf0\x27\xe5\xba\xcd\x13"
- "\x0e\x31\xfc\x9d\x53\x89\x76\x21\xcd\x50\xd3\xc4\x3e\x9e\xdf\x45"
- "\x1c\xda\xbf\xf7\x74\xf4\xbc\xb5\x26\xcf\xf3\xa3\xe4\x39\xb7\x89"
- "\x6d\x42\xf4\x04\x2c\x43\xfb\x2e\xa3\x1f\xc6\xf7\xec\x66\xca\xe0"
- "\x72\xf0\xfb\x34\xcf\x87\x00\xe6\x11\xbd\x3c\x01\xf9\xdf\x1b\x54"
- "\x73\x30\x9a\x6c\xcd\x74\xd9\x06\x78\x7d\x42\x1c\x87\x7e\x67\x1c"
- "\x59\xc6\x90\xa7\x5f\x97\x29\xc8\xfa\x19\x29\x57\xa9\x94\x21\x9a"
- "\x26\x59\xf9\x8e\x6f\x96\xab\x36\xc8\x13\xcb\xd5\x70\xd3\xe4\x24"
- "\x5d\xa6\x20\x6b\xa7\x39\x1d\x70\x98\x7c\x64\x7b\xae\x99\x75\x64"
- "\xbf\x79\xf2\x6e\x96\x31\xf1\xda\xc3\x7d\xe2\x5b\x2b\xfb\x14\x9f"
- "\x26\xef\x76\xf9\x14\x0f\x42\x74\x9f\x5c\x12\x46\xf7\xd3\x90\xe3"
- "\xc9\x4c\x67\x39\x57\x8d\xf4\xc0\xed\xb4\xb4\xc5\x77\x80\x07\xb2"
- "\xaf\x9a\x9c\xcf\xf9\x35\x1a\x9e\x0c\xd1\x70\x72\x47\x2c\x1a\x46"
- "\xd1\x4e\xde\x1b\x2d\x9a\x26\x1f\xe6\xb6\x82\x3c\x67\xf4\x3b\xa3"
- "\x63\xf1\x12\x65\x98\xcd\xcd\x14\xcf\x65\xf4\xa4\x72\xfa\x1b\xcc"
- "\x7a\x19\xfb\x40\x6b\x8f\xdd\x7a\x5d\x79\xee\xe9\x20\xe2\x39\x71"
- "\xce\x9f\x9e\xca\xf4\xbd\x21\x3f\x94\x5f\x78\xa3\xf3\xcf\x78\x26"
- "\x02\x57\xf9\x88\xa6\x1b\x4a\x5e\xd1\xee\xd4\x46\xfe\x5d\xd7\xc3"
- "\x37\xdd\xa2\xfa\xc9\xee\xdb\x58\xbe\x6f\x78\xdf\xd5\x42\xc4\x61"
- "\xda\xf7\xe1\x21\xf4\x3d\xd1\xf3\xfb\xe3\xae\x37\x98\x6f\x08\x44"
- "\xac\x37\x98\x6f\x18\x1c\x6f\xbd\x21\xb2\xdc\x84\x7b\xb9\xdc\x60"
- "\xfb\x0a\x43\xa8\xec\x84\xf4\x60\x8c\xb2\xf5\xfc\xb3\x3b\xc2\xc6"
- "\x33\xe6\x84\x97\x18\x87\x5e\xf4\x53\xe2\x3b\x2b\x0c\x02\x70\x7a"
- "\xa4\x6d\x91\xd0\xa0\xec\x17\xb6\x8b\x12\xac\x9c\x26\xba\x1e\xa3"
- "\x7f\xf1\xa9\x7c\x8f\x0b\x5d\x95\x1f\x71\x0f\x52\x12\xbf\x6f\xcd"
- "\xd0\xa3\x8d\x11\x89\x49\xc4\xf8\x48\x20\xb2\xc8\xf4\x02\x7f\x2a"
- "\x48\xfb\xf6\xc8\x0f\xf3\x68\xfa\xd1\xf8\x7f\xc7\xdf\x24\x85\xaf"
- "\x84\xe7\x23\x83\x56\x5e\x41\x58\x8a\xfc\xeb\xe4\x16\xa4\x67\x89"
- "\xf5\xc7\x56\xb5\x63\x05\xc6\xe6\x16\xab\x4c\x2c\x84\x5f\x83\xaf"
- "\x7f\x8b\xf0\x6f\x0e\x89\xfc\xc6\x9f\x69\x55\x58\x01\xb7\x9a\xca"
- "\xe4\x36\xab\xef\x77\x8c\x06\x19\x3b\x92\xc2\x8b\x4c\x22\x47\x9c"
- "\xfc\x91\xc8\xff\xf8\x00\x2f\x03\xf1\x96\x86\xd1\x04\x37\x79\xeb"
- "\xc3\x92\xff\x93\x42\x7f\x7a\xdf\x75\xea\xf8\x55\xff\xbe\x17\xf6"
- "\xfb\x56\xf5\x9a\xde\xf2\x35\xc2\xbf\xfe\x9f\xe5\xf4\x24\xfd\x67"
- "\x48\x3c\x6e\xb3\xc4\x4a\x1a\xa2\xff\x6d\x0e\x3d\x28\x5c\x42\x43"
- "\xf1\x33\xfc\x91\xdf\x3f\xe8\x8a\xfc\xbe\x33\xfe\x6b\xc0\x9c\xba"
- "\xf9\x1f\xbb\x1b\xf6\x71\xc6\x99\xd1\xc0\xc4\xa8\x26\x93\xd8\x18"
- "\xd5\x84\x42\x7f\x1a\x36\x26\xe0\xb3\x2a\x2c\xd8\x1c\x3b\xf5\xff"
- "\x9c\xbf\x5b\xea\xb5\x06\x71\xab\x27\x69\x4c\xe4\xfd\x51\x61\xfc"
- "\x3d\xc1\xa2\x85\x65\xfd\x6e\x4c\x7a\x19\x66\x09\xfb\x36\xe4\xe2"
- "\x9f\x0e\x68\xd6\x99\x5f\x07\xae\xdf\xfc\xfd\xff\xf0\xcf\xc0\xed"
- "\xe3\x9b\xbf\xff\x49\x7f\x42\xf5\xe2\xd0\x44\xf2\xc5\xff\x89\x51"
- "\x45\x29\xb4\x08\xa1\x05\x08\xed\xc7\xd7\xd2\x8f\x7f\xf3\xf7\xcd"
- "\xdf\x37\x7f\xdf\xfc\x7d\xf3\xf7\xcd\xdf\x37\x7f\xff\x1f\xf8\x33"
- "\xc8\x71\x84\xd0\xfe\xf4\xdf\x2a\x8e\x87\x40\xcf\x15\xcb\x30\xa3"
- "\x81\x42\x29\x30\xdc\xbe\x9b\x0c\xf1\x34\xc1\xfc\xf5\x59\x79\x96"
- "\x51\x84\xbe\x64\x86\x4c\x3c\xbc\xc7\x64\x1e\x9e\xef\x84\x85\xdf"
- "\xf6\x75\x61\xf4\xef\xfe\x33\x80\x80\x26\x8c\x0b\xe3\x68\x02\x4d"
- "\xa4\x78\x9a\x44\x93\xe9\x06\x4a\xa0\x1b\x69\x0a\xc6\x9b\x49\x94"
- "\x4c\x29\x74\x13\xa5\xd2\xcd\x34\x95\xbe\x45\x69\xf4\x6d\xba\x05"
- "\x35\x99\x46\xdf\xc5\xd8\xfe\x56\x10\x64\x7a\xec\xba\x38\x28\x37"
- "\x0d\xff\xe0\xff\x62\xca\x95\xdf\x6b\xbf\x09\xff\x5f\x1a\xde\xad"
- "\x85\x9f\xd6\xc2\xdd\xdf\x84\xff\x2f\x0d\xb7\xfc\x6f\x7e\x4f\xff"
- "\xdf\xfa\x36\x40\x65\x2b\xad\x6d\x88\xa9\x2b\xa3\x43\x0d\xda\xdf"
- "\xe8\x37\x7d\x41\xfe\x31\xf0\x22\xf3\x47\xff\xe5\xe2\xc9\x56\x3f"
- "\xed\x44\x6a\x9e\x57\x84\xff\xf9\xc7\xcb\xa9\xff\xd5\x1d\xc3\x73"
- "\x02\xcf\x19\x3c\xff\x15\xcf\x7f\xc7\x73\x51\x87\xa3\xd2\xf0\xd4"
- "\xdf\xbf\xe1\xf9\x6f\x9d\x44\x67\xdd\x78\xf2\x89\x3e\xaa\x25\xfa"
- "\xd7\x24\xa2\x8f\xd1\x47\xfd\xe9\x08\xd1\x39\x4f\x08\xe6\xa7\xbb"
- "\x42\xd8\x5d\x54\x3b\xbb\x25\xff\x3e\x67\xff\x34\x90\xa4\x80\x9e"
- "\xb6\x6b\xf1\x8a\x02\x4b\xd6\xec\xec\xd9\x77\x67\x5a\x66\xcd\xb2"
- "\xcc\xcd\xcc\xca\x9c\x93\x99\x3d\x27\xeb\x1e\x4b\xd6\xbc\xf9\xf3"
- "\x32\xe7\x67\xfe\xd0\xb2\x7e\xdb\xa6\x8a\xac\xcc\xe7\xca\x2d\x1b"
- "\xca\x2a\xaa\x2d\xcf\x56\x6c\x5a\xbf\xb5\x74\x53\xf9\x17\xd5\xea"
- "\x2b\xff\x31\x7a\xdf\x0d\x92\xe4\x40\x24\xb5\x6f\x25\x73\x6a\x1f"
- "\x99\x67\x74\x53\x28\x26\x43\x7b\x62\xfe\xad\x7f\xf2\xb1\x3f\xce"
- "\x58\x39\xe5\xf7\x0f\x3c\x37\x63\x61\xde\x5b\xfb\x8e\x90\x71\x56"
- "\x03\x19\x67\x14\x90\xf1\x3b\x0b\xc8\x98\x78\x94\x8c\x46\x84\x3d"
- "\x67\x25\xe3\x9a\x04\x32\xae\xe8\x27\xe3\x92\x5c\x32\x2e\xb0\x8c"
- "\x0d\xdb\x92\xa6\xc2\x3a\xf3\xc9\x78\xd0\x47\xc6\xa6\x6c\x32\xee"
- "\x3a\xad\xc2\x3e\x40\xd8\xdf\xb8\xbf\x76\x3a\xfc\xfb\xfe\xbe\xac"
- "\xfd\x30\xe6\xcf\x2d\x65\x0c\xf9\xcd\x0f\x65\xc7\x98\x24\xfd\xe6"
- "\xef\x9b\xbf\x6f\xfe\xbe\xf9\xfb\xe6\xef\x9b\xbf\x6f\xfe\xfe\x0f"
- "\xff\xf3\x18\x28\xfb\x73\xa3\x99\x7e\xdf\x48\x34\xec\x8c\x9f\xe6"
- "\x36\x4c\x3b\xc9\x7b\x4a\x88\xcf\x4e\x51\xbc\xf4\xb7\xc2\x4f\xd8"
- "\x5e\x94\x84\xbc\x83\x44\x7c\xf6\xf3\x95\x03\xc2\xc3\xe7\x3a\xf3"
- "\xdf\x26\xea\x49\x27\xe2\x7d\x2e\x80\xb1\xca\x4d\xcf\x27\xa8\xbd"
- "\x4d\xc2\xcb\xf1\xbc\x3f\x0a\xe1\x35\x08\xdf\x35\xde\x7e\x15\x7d"
- "\x6f\x16\xc3\xcc\x9f\x2e\x71\x39\x14\x05\x87\x61\x74\x21\xcc\x7f"
- "\x1d\x18\x09\x3a\x5e\x5e\x23\x19\x18\xde\x90\x93\xd2\xbc\xce\xee"
- "\x9b\x91\xd7\x8b\xfa\x64\x68\x7b\x8b\x06\x85\x93\x4c\x3d\x36\x3f"
- "\x9f\x31\x35\x9c\xa7\xc9\x6f\xe2\x6d\xc4\x5b\xee\xb1\xdd\xa9\xf2"
- "\xa5\x33\x0c\xe4\x35\x0c\x3b\x27\x65\x8e\xe6\x05\x6c\x79\x4e\x9c"
- "\x26\x57\x78\x8d\xdd\x46\x95\x36\x69\x92\x96\xd6\x88\xb4\xab\xf4"
- "\xb4\x2a\xce\xb8\x44\x8b\xbb\x01\x71\xb6\xc8\x38\x73\x93\x16\x97"
- "\x80\xb8\xe6\x28\xfc\xcc\xae\x6b\x7e\x3a\x4f\x93\x0e\x03\x17\x0b"
- "\x9f\x69\xe2\x3c\x5a\xfa\x64\xa4\xef\x89\x84\x45\xa4\xc5\xa5\x20"
- "\xce\x1d\x19\xf7\x41\xa6\x16\xf7\x2d\xc4\xf9\x23\xe3\x0c\x7a\xbe"
- "\xb4\x61\xe7\xe4\xb4\x18\xf5\xe4\xf2\x0d\xaa\x6c\xae\xc3\xe4\x05"
- "\x48\xe3\xe0\x34\x2b\x2c\x0e\x62\x5e\x71\xdc\xf1\x8e\xd1\xf2\x39"
- "\xcd\x5a\x1d\x8e\x1b\xf9\xc3\x68\x0a\x5a\x4e\xae\xd5\xf3\xe7\x5b"
- "\x18\x06\x49\x1a\x32\x1c\x37\x4d\x2a\x60\x38\xfc\x8d\xdf\xd3\xb8"
- "\xde\xda\x6f\x0b\xd7\x2f\x72\x8f\x8f\x19\x60\xe3\x60\x88\x4e\xc0"
- "\x33\x31\x5e\x97\x81\xea\x34\x11\xb4\x7f\x9b\xf7\x75\x65\x66\x06"
- "\x9d\x82\x5c\x36\x1f\x59\x6e\x21\xfb\x39\xba\x21\x8d\xf7\x09\xed"
- "\xdd\x4e\xf1\xf6\x2a\xe1\xe3\xb3\xf8\xbd\x9e\x41\xb2\x7b\xc4\x00"
- "\x9f\x77\xaf\xbb\x4c\xf1\x7c\xbf\x51\xdd\xf3\x94\xd6\x53\xfb\xe7"
- "\xd8\xf7\xdf\xf2\xfd\x41\xd3\x38\x6f\x3f\xf5\xb6\xf6\x93\xbd\x35"
- "\x32\xaf\xfd\xbb\x94\x76\x8a\xcf\xce\x3b\x29\x91\xf1\xe8\xb1\xf8"
- "\xc9\x9f\x92\x99\x59\xfb\x3a\x99\xed\xd3\xc9\x78\xaa\xac\x5b\xc7"
- "\xc5\xcd\xb8\xec\xba\x40\xf1\x6f\x3d\x0b\x19\xba\xc0\xf8\xe6\x64"
- "\xbe\xb7\xdd\x67\x3c\x9e\x56\x48\xc7\xd3\xce\x52\x4f\xda\x42\xea"
- "\xb1\xe5\xd3\xde\x0b\x94\x70\xdc\xb7\x80\x7a\xcc\x0f\xa2\x8d\xe5"
- "\x93\x6b\x10\xbf\x2d\x01\xa4\xf1\xca\x73\x20\xe7\xe9\x86\xd3\xcd"
- "\x3f\xa5\x78\xb7\x82\x09\xfa\xde\x70\x56\x3f\xd3\xc0\xdf\xb1\xea"
- "\x51\xfd\x6d\x4a\x03\x7e\x03\xc0\xe5\xde\x73\x94\x70\x73\x7a\x1a"
- "\xf1\x3d\x45\x13\x5d\x2d\x7e\x32\xd7\xd2\xa4\x71\xda\x56\xaa\x3c"
- "\x0f\x0d\xd9\x6c\x3b\x20\x06\x58\x46\x87\x5e\x28\x41\x3b\x4d\x28"
- "\x44\xd9\x83\xda\x3e\xc1\x41\xfb\x9b\x64\x1e\xda\x5a\xc2\xfb\xa3"
- "\xfb\x11\x67\xd5\xe3\xf8\x9c\x37\x9f\xdf\x9e\x93\xca\xf7\x48\xe5"
- "\xd2\x87\xd7\x06\x78\x0f\xe2\x20\xef\x0b\x65\x78\x89\x36\x32\xa1"
- "\x3e\x71\xc0\xe7\xde\x76\x84\x7f\x1f\xe9\x90\xbf\xd3\x4d\x47\x33"
- "\xe5\xbe\xc5\x6f\xad\xf4\x06\xbf\xb5\xf2\x72\xf0\xb5\x95\x43\xe2"
- "\xb5\x95\x9f\x07\x5e\x5b\xf9\x99\x7d\x1b\xc5\x07\xbe\xb5\xd2\xd3"
- "\x5b\x25\x79\x90\xd4\x5b\x75\x91\xf7\x13\xc6\xb3\xdf\xee\xd5\xcf"
- "\x83\xf7\xfe\x8f\xf8\xbe\xa5\xb4\x60\xf2\x3d\xe0\xd3\x3f\xd3\xea"
- "\x5a\x12\xf8\xed\x8b\x55\xbf\xa1\x94\x9c\x2a\xd5\x86\xe2\x51\xa7"
- "\x1b\x2d\x6e\xf3\x1c\x29\xbf\x9e\xe4\xdc\x2a\x3c\x35\x78\x6c\x78"
- "\x6a\x45\x4a\x4e\x2d\x68\x65\x9f\x52\x6f\x20\x3e\xc7\x30\x27\x48"
- "\x86\x0b\x74\xe3\x02\xe0\x9f\x34\x0e\xdd\xa6\x05\x9b\xec\xc5\x3f"
- "\x70\x50\x1d\xfb\x40\x60\xdd\xc4\x7a\x89\xf5\x14\xca\x69\x40\x39"
- "\x56\xd9\x16\x0f\x08\xaf\x48\xb1\x17\x23\x7c\xc0\xfb\x82\xd5\xe0"
- "\x79\xc1\x6a\x1c\x4a\xb1\x2f\x47\x9a\xc3\x48\xd3\xa1\xd1\x70\x80"
- "\x61\xa1\x4d\x78\x6e\xf4\x93\x09\x30\xab\xfe\xfe\x4a\x9f\xf9\xe0"
- "\x01\x71\x16\xe9\xce\x8c\xc2\x02\x6c\xc0\x01\xfd\x6f\x1c\xd0\xc3"
- "\x40\xeb\xfe\x97\x91\x8e\xf3\xbb\x7c\xb9\xac\xbf\xdd\xae\xca\x01"
- "\xde\xc7\x3b\x59\x8c\xa8\xf2\x90\x86\xcf\x78\x7a\x6e\xf4\xd1\x84"
- "\x61\x27\x15\x33\x6c\xce\xc7\xbe\xcb\x90\x6f\xb9\xb0\x5b\xa1\xdf"
- "\x68\xe9\xb0\xb0\x1a\xf8\x4c\xff\x71\xe4\x57\x65\x4f\x29\xd6\x71"
- "\xe4\x32\xe4\x99\x7e\xc6\x13\xf2\x70\xbc\xd2\x47\x37\xb6\x90\x09"
- "\xf9\x96\x33\x3c\x86\x05\x39\x70\xa3\xae\xcb\x8f\x57\x7a\x28\x28"
- "\x22\x60\xba\x35\x78\x1d\x11\xf0\x10\x2e\x00\x8f\xe5\xaf\x07\x79"
- "\x6e\xec\x90\xf0\x1e\xf9\xfb\x20\xc3\xf3\x91\xd9\x22\xf1\x7d\x8c"
- "\x61\x48\xff\x18\x80\xd9\xbd\x65\x11\x0d\x52\x62\xbc\xc7\x6e\x35"
- "\xc9\xfd\x83\xc8\xff\x5e\xdd\x40\x9c\x18\x2a\x31\x4d\x91\x7b\x07"
- "\x17\x11\xfb\xc2\x18\xa4\x29\x9f\x88\x21\xab\xe9\xc6\x41\x32\x33"
- "\xce\x7c\x9e\x88\xf1\x0c\xe7\xe5\x23\x8b\x1f\x5b\x48\x8f\xe5\x2f"
- "\xc9\x5f\x48\x45\x0f\xe4\x2d\xa4\xcc\x7b\x67\x65\xce\xfb\x61\xce"
- "\x3c\x2a\x7e\xfc\x91\x85\x54\xbc\x74\x21\x2d\xc7\x53\xbc\x7c\xf1"
- "\x23\xf9\x8b\x97\x2f\xa4\x92\x07\x97\xe0\x2b\x6f\x61\x56\xe6\x8f"
- "\x67\x15\xe7\x2d\x59\x4c\x3f\x59\x31\x37\x73\xee\x5c\x7a\x60\x71"
- "\x61\x56\x66\xa6\xf6\xce\xca\xe4\x24\x4f\xe6\x2c\x5e\x3e\xab\x78"
- "\xd3\xc6\x9a\x8d\xb3\x96\x2e\xc9\xe3\x10\x5a\xbc\x78\x21\x2f\x24"
- "\x84\xc9\x4f\x46\xe0\x4a\x80\xe9\xec\x15\x9f\x16\xb0\xff\x06\x6a"
- "\x03\xff\xf1\x0c\xca\x73\x21\x94\xf4\x2f\x6d\xcc\x37\xa9\x5f\x13"
- "\xb9\xcf\x32\x0f\x3b\x13\xdd\xa0\x9f\xdc\x8f\xcb\x3e\x14\xce\xd3"
- "\xd4\xb7\x11\x77\x87\xd6\x7f\xc4\x0d\x3b\x93\x28\x32\x3e\x05\xfa"
- "\x35\x71\x0e\x9f\x33\x70\xe1\x01\xcd\xbd\xd0\x83\xa0\xad\x87\x86"
- "\xec\x25\x71\xf2\x9c\x27\xf8\xcd\xfb\x6f\x91\x77\x41\x58\x7b\xef"
- "\xe7\x7d\xba\x96\xed\x64\xba\x44\x49\x37\xf7\xd6\xe4\xf2\x59\x1c"
- "\xe2\x1b\x67\x24\x8c\xcb\xa3\x30\x26\x6b\x67\x45\xdd\x6d\xbc\x07"
- "\x5a\xc1\xd9\x15\xa6\x1b\xdc\x0c\x67\x2f\xe2\x34\x58\x4f\xf4\x42"
- "\x47\x40\x87\xcf\x0f\xda\x33\x48\xa4\x64\xe6\x04\x47\x32\x64\xbf"
- "\x80\x7c\xc7\x74\x99\x46\xf9\xde\x1e\x94\x29\xde\x2a\x30\xf0\x7e"
- "\x54\xb9\x37\x95\x12\x4f\x34\xf3\x9e\xed\x94\x5c\x87\x3c\x83\x2d"
- "\xc3\x92\xe3\x03\x4d\xf8\x6e\xca\xad\x17\x76\x75\xb6\x1a\x61\x93"
- "\xf0\xed\x00\xbf\x4d\x90\x17\x0a\x7c\x8a\xf0\x0d\x64\x42\xf8\x1f"
- "\x40\xeb\x3e\x99\xfe\x53\x99\x7f\x22\xc2\xde\x05\xbc\xfa\x60\x4a"
- "\xae\x13\xf2\xc3\x61\xb0\x15\x92\x5f\x46\xfe\x9d\xac\xf3\x94\x1e"
- "\x9e\xaa\xce\x55\x82\x37\x0a\xfe\x54\xfd\x9c\xe5\x80\xc2\x61\xea"
- "\x3f\x1c\x07\x5d\x8e\xa3\xe7\xea\xa9\x65\xfb\x26\x19\xf5\xbf\xb1"
- "\x44\xf5\x91\x53\x7b\x38\x2d\x9f\x91\x17\x49\x1f\x14\x03\xee\xae"
- "\xee\xed\x83\xd2\xe7\xbc\x9b\x92\x73\x83\x76\x2b\x85\xd5\x65\x26"
- "\xe3\x01\xbc\xcd\xc3\x23\x56\xf4\x99\xc9\x99\x32\x2f\xf0\xd3\x70"
- "\xe3\x34\xd3\x18\x7f\xd6\x13\xe0\x6b\x36\x78\x3e\x09\xe5\x79\xa3"
- "\x78\x9e\xc4\xf4\x00\xbe\x7d\x41\xbc\x01\x27\x4d\x6c\xb5\x02\x2f"
- "\x32\x32\x3d\xdc\x21\x18\x5e\x25\x53\x29\xd9\x51\x32\xf5\x12\x60"
- "\x2f\x0c\x8b\x5f\x11\x15\xbf\x1e\xf1\x8b\xb4\x78\xb4\xd7\x94\x9a"
- "\xa8\xf2\x1b\x11\xff\x20\xf3\x10\xed\xd1\xe4\xa6\xa4\xc3\x6d\x6c"
- "\x4f\x86\xd2\x1f\x8a\x4a\xdf\x8d\xf4\x0f\xf1\x7e\x7c\xee\x2b\x38"
- "\x7d\xbb\x26\xf7\x48\x1f\x8f\xf4\x67\xa2\xca\x2f\x42\xfa\xe5\x61"
- "\xf8\x45\xd5\xff\xa6\x63\x88\x2f\x61\x39\xc5\xbb\x0c\x69\x26\xb2"
- "\x0e\x60\xfd\x73\xbc\x92\xf9\x73\x53\x7a\x54\xfa\x7c\xa4\x5b\xc7"
- "\x74\x96\x34\x1a\x62\x1a\x25\xe9\xb6\xcd\x59\x85\xc3\x4d\x25\x51"
- "\x79\x6c\xc8\x53\xcd\xf4\x95\x72\x36\x1c\x33\xcf\x9e\xa8\x3c\x87"
- "\xa5\x9c\xaa\x72\x34\x1e\xab\x3c\x9a\x6e\x0b\x87\xc1\x75\x83\xbd"
- "\x75\xd3\xe9\x48\x18\x37\xc3\x66\x4b\x7c\xe1\x65\xa5\x33\x6e\x80"
- "\x4c\xcc\x45\xd8\x41\xc0\xdc\xcd\x72\x84\x76\xe6\x75\x79\x7c\xd0"
- "\xbd\x05\x09\x4a\x76\x53\xb3\x12\x6b\x89\x7f\xcf\xe2\xdf\x0c\x5b"
- "\x8c\x14\x6a\xed\x29\x35\x0b\x6f\x0e\x97\xfe\x19\xb9\x1d\x8b\x91"
- "\x87\x83\x0a\x66\xea\xa3\x68\xef\x46\x7c\x07\xb4\x32\x5e\xe5\xf3"
- "\xcc\xc0\xdf\x09\xbd\x4e\x7c\x26\x1b\xe1\xd9\x08\x7f\x59\x8b\xdf"
- "\xcd\xe9\xf1\x3b\x4b\xfb\x6d\x80\x8c\x39\xb5\x76\x86\x36\x75\xf3"
- "\x0e\x59\x36\xda\x95\x9e\x3f\xa8\xe4\x3e\x0f\x71\x15\x78\x2f\xc1"
- "\xfb\x51\xbc\x7f\x82\x77\x16\xfb\xa0\xb0\x07\x64\xfb\xe2\xef\xef"
- "\xe2\xfd\x08\xde\x93\xf0\x5e\x0e\xdc\x2e\x83\xee\x0e\x0f\x64\x3a"
- "\x4a\x66\x06\xc1\x43\x6e\xf7\x13\x15\x0f\x53\xfb\xb9\xcc\x80\xae"
- "\x0b\x3e\x0d\x85\x69\xfa\x41\x6b\x0f\x5a\xd8\x48\x01\xd3\xa5\x18"
- "\xf0\xbb\xb9\x7c\xa1\x60\xc5\x29\x3e\xa9\x34\x41\x95\xcf\xac\xf8"
- "\xad\x85\xa9\x74\x86\xf0\x32\xf1\x6e\xae\xf3\x0a\x81\xb7\x43\xfa"
- "\xaf\xa0\x9b\x77\x81\x26\x66\x7c\xaf\x60\x3a\xc9\xf4\x12\xee\x4d"
- "\x9e\x30\x7e\xc3\xbe\xbf\xb9\x3b\x8a\xdf\x2c\xc3\x2f\x4b\x7e\x83"
- "\x76\x3a\xce\x8c\x3f\x64\x9a\xfb\xca\x09\xba\xdc\x40\xbe\x07\x43"
- "\x6d\x6c\x6a\x7c\x54\x9b\x49\x07\x9c\xfd\x2c\x1f\x53\xaa\xb4\x36"
- "\x39\x75\x34\x3d\xfa\x8d\xa9\x39\x91\xe9\x93\x58\x56\x61\x9f\xdf"
- "\x74\x58\xd3\x75\x5e\x53\x2d\xcb\xf4\x54\xd8\xff\xa7\xfa\xa5\xdd"
- "\xd6\x94\xfb\x22\xc3\xf1\xda\xa5\x7f\x20\xaf\xa9\x8a\xdb\xe2\x54"
- "\x87\x1e\x2f\xe3\x92\xed\xa7\x19\x77\x53\xa5\x8c\x6b\x75\x43\x14"
- "\xf5\x38\x52\xe7\xce\xbc\xa6\x1a\x19\xd7\x15\x82\x9b\x59\xa2\xc1"
- "\x35\xc5\xf4\xef\xd4\x98\x59\x30\x8b\xc8\x78\xa7\x83\xe2\x5c\xfe"
- "\x33\xb4\xcc\x2f\x02\xb3\x1c\x34\xc9\xe5\x3f\x4c\x77\x10\x25\xbb"
- "\xfc\x67\xe9\x4e\xa2\xe9\x2e\x7f\x33\xec\x80\x43\x1c\xff\xe1\x0f"
- "\xc8\x60\xc0\xdb\x7e\xbb\xc3\x68\x70\xf9\x6b\x28\xdd\x61\xc6\xbb"
- "\x92\x1e\x8c\x13\xc3\x2e\x7f\x21\xd2\x95\xd1\xb2\x80\xf8\x34\x3f"
- "\x4e\xfc\x69\x4d\x80\x92\x0a\x77\x0b\xbb\xcb\x0f\x9b\xdc\x7f\x12"
- "\xe1\x41\xb1\x2c\x70\x15\xcf\xb0\x08\x36\x66\x96\x2c\x0b\x7c\x2a"
- "\xf2\x76\x7f\x88\xef\x3f\x09\x61\x24\xe1\xf2\x2f\xa0\x5e\xaf\x17"
- "\xe9\xec\x42\xec\xcf\x2c\x58\x7d\xd9\x48\x23\xec\x8f\x69\x7f\x66"
- "\x09\xea\x62\x1d\x41\x3d\xd0\xcf\x3d\x37\xf2\x02\xde\x4d\x99\xcf"
- "\xca\xef\xc6\x4c\x9b\x48\xca\xb4\xce\xc6\x00\x87\xeb\xe0\xf2\xf7"
- "\xd3\x1a\x98\xe8\xcb\xb6\x79\x04\xe3\x3f\xa5\x9e\xc7\x37\x0b\xd8"
- "\x97\x43\xe2\xb2\x6d\x76\x81\xb8\x78\x91\x9c\x69\x75\xf9\x07\x09"
- "\x65\xd8\x00\x6f\xb3\x84\xd7\x98\xd9\x82\xb4\x1e\x4e\x17\x0e\x87"
- "\x61\x70\xda\x65\x01\xf6\xb1\x95\xd9\x32\x92\x9c\xd9\x80\xa7\x13"
- "\x4f\x1f\xf2\x5e\x10\xce\xd4\xdf\xf1\x79\x5c\xe4\xf7\x89\x94\xac"
- "\x78\x1f\xfb\x8e\x62\x5a\x06\x68\x22\xd2\xfb\x20\x57\xf9\x90\x4f"
- "\xe0\x9b\x95\x21\xf1\x6d\xca\xfa\x81\x4f\xd6\x23\xeb\x76\x55\x8f"
- "\xac\x19\x1c\x3e\x04\xd9\xc1\xef\x82\x21\x15\xf7\x63\xe4\x5b\x21"
- "\xf3\x35\x66\x15\x88\xa4\xac\x12\x1f\xda\x1d\xe8\xea\x60\x3a\x82"
- "\xae\x0e\xa6\xa5\xd8\x9f\x55\xe0\xb2\xed\x21\x91\x9c\x55\x32\x92"
- "\x9c\x65\x45\xfe\xed\x23\xd2\x16\xc8\x6a\xf0\x29\xd8\x3f\x03\x9c"
- "\x55\x90\x6b\x13\x60\x34\x00\x56\xcb\x88\xd3\x42\xcb\xb6\x09\xdf"
- "\x32\x7f\xbd\x7f\xcd\x36\x32\xcd\x24\x87\x81\xfd\xf9\xba\x6c\x65"
- "\xa8\x67\x0f\xde\xf9\x88\xa7\x9b\x50\xd6\x87\x80\xdb\xc0\xe5\xa1"
- "\x9c\x16\xc0\x7c\x15\xb0\xca\x18\xa7\xab\xec\x2b\x35\x25\xab\xf3"
- "\xaa\xc2\xef\x44\xb0\x31\x6b\x20\x98\x94\xd5\xa7\xcb\x10\xcb\x8f"
- "\xa2\x5b\x33\x2d\xf5\x0a\xbf\xcb\x7f\x90\x20\x63\x49\xbd\xde\xb3"
- "\x1c\x8f\x31\xc8\x61\xf0\x99\x65\xaa\x06\xef\x43\xc4\xf2\xd3\x5b"
- "\xb5\x9b\xd3\x7e\xc8\x32\xb4\xb4\xca\x5b\x3f\x8b\xaa\x0c\xf8\xb6"
- "\xaf\xf1\xc7\xd3\xea\x2a\xb3\x23\xd0\x98\xd5\xd5\x5b\xc5\x7c\x39"
- "\x83\x3c\x9c\xaf\x92\x12\x0d\xb0\xc3\x0d\xc2\x9f\x68\xf3\x98\x6f"
- "\xb4\xda\x45\xaf\xb7\x10\x69\xab\xa4\x7f\x62\x96\x23\x4e\x5f\x34"
- "\x28\xdc\x81\xa4\xb9\x56\xae\x9b\x98\xe2\xa0\x53\x83\x77\x13\x8f"
- "\x85\x4e\x0d\x1e\x62\x39\x0d\x8a\xa4\xb9\x39\x90\xd1\x91\xa2\x41"
- "\x47\xdc\xea\xcb\x64\x40\x58\xe0\x94\xf5\x30\xe2\x7b\x90\xee\xa4"
- "\x94\xdb\xa5\x97\xfd\x89\xfe\xa4\xac\x4e\x7f\xe3\xdc\x82\xa5\x97"
- "\x47\xc4\x29\x6b\x33\x3d\x35\xe8\x00\xad\x0e\x53\xd1\x45\xbf\xa9"
- "\xb7\xaa\x0c\x69\x86\x11\x7e\x48\xca\x7f\xd1\xc5\x21\xb1\xf4\x79"
- "\xf1\xe9\xd2\xcb\x7f\x12\x45\x56\xf1\xe1\x1a\x1b\x4d\xb9\xa1\x5e"
- "\x04\xb9\x5d\x9c\xec\x3f\x4c\x37\x9c\x65\x5f\x3d\xf9\x54\x58\x1a"
- "\x14\x45\x17\x3f\x15\xab\x9f\x67\xda\x2c\xa0\x53\x56\xb4\x1f\x5b"
- "\x33\xd3\xfb\xc4\x29\xeb\x31\x94\x9f\x0f\xb8\x76\xc1\xf7\x8f\x15"
- "\x96\x76\x27\x3e\x75\x31\x89\x4e\xf6\x37\x93\x3f\x39\xab\x33\xb0"
- "\x3f\xab\x2b\x98\x9c\xd5\x17\xdc\x9f\x35\x20\x92\xe7\xe6\xf8\xf7"
- "\xcf\x2d\x08\x24\xcf\x85\x0c\xcc\xed\x02\x9f\x26\x31\xcf\xaf\x39"
- "\xc9\x82\xef\xbf\xbb\xc6\xfc\x6f\x9c\x7b\x02\x75\x1d\x80\xce\x14"
- "\x4a\xf6\xe7\x9e\xe0\xf1\x3d\xf2\x0e\x8c\x24\xcf\xed\x43\xba\x01"
- "\xd5\xbe\xe6\xfa\x58\x2e\x65\x9f\xd5\x34\x77\x18\x7d\x8c\x69\x24"
- "\x79\x5e\x3c\x9e\x34\x3c\x19\xa2\x69\x9e\x0d\xf0\x93\xa5\x4c\x35"
- "\xce\xb3\x89\xfb\x1a\x61\xcb\x62\x3c\x9f\x3c\xaf\x65\x59\xe0\x7e"
- "\x01\x1a\xa2\x9d\xcc\xb3\x05\xf7\xcf\x6b\x10\x29\xf3\xba\x7c\x52"
- "\xf6\xe7\xfd\x3d\xc3\x1e\x79\x21\x83\xc7\xfd\x66\xc4\x9f\x10\x4d"
- "\xd9\xf3\x7d\x2c\xab\x49\xd9\x39\xc1\xa4\xec\x16\xd1\x98\x5d\xf0"
- "\xf0\x6e\xe1\x09\x34\x66\x5b\x83\x8d\xd9\x25\xfe\x09\xb0\x91\x6d"
- "\xc7\x88\xf5\x93\xff\x03\x21\xf8\x2e\xa9\xde\xaa\x43\x92\xff\x2e"
- "\x1b\xda\xc0\xb6\x5b\x1c\xa7\x06\x21\x0b\x55\xbf\x91\xba\xa9\xd7"
- "\x7b\x46\xd2\x54\x24\x67\xe7\xb0\x4c\x31\x7f\x57\x57\x91\x43\xec"
- "\xcf\x2e\x08\xee\xcf\x2e\x09\xec\x07\xdc\x64\x94\x93\x72\xcf\x1f"
- "\x7d\xb2\xbd\xde\x03\x79\x3d\x86\x3c\xff\x40\x4a\xc6\xef\xe9\x1b"
- "\x4f\x47\xb2\xae\x62\xfd\xb4\xcc\xef\x63\x99\xf9\x0b\xeb\x35\xa5"
- "\xa7\x68\x8d\xae\xa7\x58\x47\xf1\xb8\x83\xf5\x54\x50\xd3\x53\x41"
- "\x4d\x4f\xc9\xef\x24\xe8\x9a\xc6\x4c\x2b\xeb\xa3\x65\x36\xa5\x67"
- "\x96\x05\x32\x05\x64\x23\x01\x30\xac\x8a\x17\x48\xd3\x94\xb9\x59"
- "\xa6\x97\x74\xca\x6c\x09\x42\xdf\xe0\xe9\x0c\x2a\x7d\x33\xa0\xe9"
- "\x1b\xa3\xae\x6f\xd8\xe7\x2a\xda\x54\x30\x96\xbe\x09\x6a\xfa\x26"
- "\x20\x94\xbe\x09\x6a\xfa\x86\xc3\x03\x9a\xbe\x09\xc4\xd0\x37\x68"
- "\xcf\x5c\x5f\x93\xa6\x67\x1c\xac\x67\xb8\xbe\x90\xb5\x92\xa0\xd2"
- "\x33\x36\x8c\x39\x8c\xac\x67\x02\xc8\x13\xd4\xf5\xcc\xb0\xcc\xdf"
- "\xc2\xba\x66\xe4\x45\x82\xfe\xb4\x10\xeb\x18\xa9\x4f\xfc\xd3\xfd"
- "\xac\x4f\x40\xbf\xfb\xa3\xf5\x09\xe0\x75\xe2\x77\x92\xa6\xa7\xfa"
- "\x12\xeb\x85\x1f\xfa\xa4\x6b\x99\xcd\x4b\x7c\xef\x75\xa2\x1f\x7a"
- "\xdb\x56\xe3\x70\xd9\xfc\x04\x3d\x30\x20\x7a\x1d\x04\x1c\x21\xbf"
- "\x01\xe8\x0a\x22\xb4\xcb\x1c\x3f\xda\x38\x64\xbc\xa0\xb7\xea\x9f"
- "\x29\x80\xb6\x5a\x34\x38\xe4\x5a\xed\xcd\x48\x2a\xba\x28\x3c\xa0"
- "\x8f\x7b\x75\x95\x03\xfa\x25\xc3\x73\x6a\xf0\x7d\x2a\xec\x17\xc1"
- "\xc2\xb5\x6e\x0b\xda\x40\x41\x51\x45\x77\x22\xdf\x2b\xb5\xf4\xb2"
- "\xe8\x86\x5e\xfc\x7f\x8a\x2e\x26\x25\xae\xea\xa7\xef\x15\x96\x8a"
- "\x60\x00\xed\x0c\xf5\xed\x42\xbd\x4f\x00\xf7\x3e\xb4\xb9\x01\xb4"
- "\xb3\x1c\x7f\x54\x3b\x43\x9b\xf9\x3b\xfc\xb6\x28\xfa\xcd\x1d\x40"
- "\x3b\x63\x3f\x9f\x82\xfb\x10\x1e\xeb\xa1\x9c\x01\x9e\x0f\x43\x5b"
- "\x3b\x11\xdc\xaf\xda\x5a\x50\xe5\xf3\x05\x99\x7e\x46\xad\xad\x81"
- "\x17\x68\x37\xf1\x78\xd2\xf0\xc4\x6e\x6b\x55\x61\x6d\xed\x79\xad"
- "\xad\x25\xab\xb6\x06\x9e\x9a\x02\x2f\xa8\xf6\xc6\xf0\x79\x3c\x38"
- "\xda\xde\x52\xb2\x73\xd8\xe7\x90\x92\x1d\xd9\xe6\xd0\xaf\x64\x5b"
- "\xd1\xde\x4a\xd0\xde\x00\x4f\x78\x58\x6f\x42\x36\xff\x95\xfb\xba"
- "\xa5\x55\xe2\x5f\xd7\x04\x6e\x71\xa0\x3d\x59\xa1\xcb\xfe\x04\x3d"
- "\xfa\xaf\xab\xbd\xd4\x81\xf6\x94\x83\x76\x54\x80\xf6\x54\x82\x76"
- "\xc5\xed\xa9\x2f\xf0\x02\xc3\xbc\xa7\x6f\x14\x86\xec\x2b\x23\xdb"
- "\x93\x9a\x49\x8f\x3d\x1f\x39\xec\xbc\xb5\xd2\x4d\x1f\xc5\x4b\x9f"
- "\x94\xce\x5b\x6d\xf8\x7d\x56\xfb\x8d\xf1\xdf\x07\xd2\x96\xe2\x76"
- "\x58\x55\x47\x37\x5f\x20\x4b\x0e\x64\x9e\xf0\x3b\x01\xbf\x17\x2c"
- "\xbb\xe3\x43\xd8\x12\xbf\x66\xb9\x1a\xe6\xb6\x28\x9c\xd9\x3c\x3e"
- "\xcb\x85\x2c\xc6\x8b\xe1\x8c\x04\x91\x92\xf7\x73\x31\x92\xc6\x73"
- "\x5e\x89\xf8\x9e\x02\x1a\xa4\xe3\x9d\x72\xf0\x0a\xa5\xe2\x61\xff"
- "\xae\x0e\xb6\x9f\xf0\x3b\x53\x6c\x4d\x9b\xbc\x77\x0b\xcd\x4c\xf4"
- "\x2a\xff\xf2\x89\xf5\x49\x3c\xf7\x93\xca\xbf\x85\xf3\xb8\xb9\xfd"
- "\x8a\xee\x63\x1e\xe5\xc5\xb8\x9f\x3b\x30\x2c\xdb\x65\x81\x8e\x0b"
- "\xe3\x06\x3c\xbf\x0b\x3c\x0b\x1f\xdd\x96\x4b\x7c\x9f\x5a\x2c\x1d"
- "\x33\xec\xb4\x8c\xd6\x7f\x9c\xf8\x3d\x3a\x4d\xc6\x89\x3f\xac\xd3"
- "\x69\xbc\xf3\xb5\xdc\x4f\x07\xb6\x88\x41\xf6\x0d\xc2\xe7\x81\xed"
- "\x7e\xf1\xdf\xd9\xd7\x7c\x5d\x80\xe2\x97\xd9\x7c\xc2\x35\x28\xba"
- "\xf9\x5e\xb6\x76\xf6\x57\x52\x2b\x82\xc1\xe4\xbc\x4a\xb1\x3f\xcf"
- "\x3a\xb4\x45\xf8\x79\x5e\x65\xd8\x39\x3d\xc9\x4d\xf9\xf1\x8a\x17"
- "\x59\x27\xe4\x98\x30\x29\xcf\x0a\x58\xc9\x0c\xeb\x14\xf2\x07\xf6"
- "\xe7\x55\x21\x5d\x8e\x9b\x06\x8b\x65\xba\xa4\xac\x13\x55\xdb\xe9"
- "\x3b\x17\x68\xba\xf4\xb9\x21\x1a\xf3\x1c\xac\x13\x10\x96\x84\xb0"
- "\x5a\xc0\xdf\x85\xf4\x56\x37\xfd\xd7\x99\xca\x96\x9d\x5e\xab\xa7"
- "\xc3\x6f\xe9\x97\x3c\x42\x86\xd4\x6e\x0c\x47\xc4\xf9\x32\x03\x45"
- "\x9e\x96\xe3\x93\x69\xb9\xb1\xa3\x43\x3a\x7d\x6e\x01\xfb\xf9\xb4"
- "\xef\xa0\x69\xe0\x0f\xe3\xf7\x99\xdd\x26\xce\x0b\xe7\xf4\x86\xb7"
- "\xb6\xfb\x30\xa6\x98\x0e\x5c\xfe\xba\x76\x3c\x7a\x06\xaf\x88\x7e"
- "\xd0\x60\x60\x1f\xc6\x85\x4c\x1f\xa6\x27\xda\x4d\x10\x74\xf8\x98"
- "\x75\x52\xfb\x16\x1e\x1b\xdf\x96\xab\xd3\x6b\x7c\x9e\xe4\xd5\xaa"
- "\xf1\xe3\x6d\x1d\xc2\x29\xa8\xfb\x7b\xbc\x96\x71\xdb\x9b\x8a\x06"
- "\x73\xfb\x86\xa0\x47\x78\xae\x96\x7d\x72\x56\xa7\x09\xe8\xf6\xdb"
- "\x9a\xdd\x74\x57\xa6\x7e\x1e\xda\xe5\x5f\xcc\xba\x25\x66\xbf\x25"
- "\xcf\x42\x8f\xc2\xff\x7e\x77\xef\x34\xe8\x21\xa9\x9b\x1c\xa9\x75"
- "\x8a\xff\x3e\x86\xcb\x67\xfb\xfb\x11\x5f\xed\x15\x03\xa2\xd1\x11"
- "\xcf\xe3\x08\x3e\x57\x8c\xb0\xdf\x41\xae\x45\xf7\x26\xc6\xe9\xfb"
- "\xbf\xeb\xfe\xde\x35\x3a\x8f\xf1\x61\xfb\xe8\xdc\xcd\xf7\x0f\xf3"
- "\x5c\x8d\x9a\x6f\xfa\xfe\x4c\x37\xcd\x3a\xa9\xe3\xc5\x36\x06\x68"
- "\xcb\x74\x3e\xc1\xb6\x06\xcf\xff\x57\xd7\x0a\x1f\xdb\x1c\x48\x5b"
- "\xa2\xd7\x81\xeb\xa7\xea\xf5\xfd\xca\xf0\x7a\x01\x07\x0f\xc6\xda"
- "\x92\x06\xd5\xdb\x28\x5e\xfa\x08\x0c\xf0\xfa\xc1\x62\x59\x17\xae"
- "\xb3\xac\x8b\xd4\xb1\xe8\x23\xfc\x77\x63\xdc\x26\xc3\x07\x00\x0b"
- "\xe3\x9f\x99\x39\x4a\x9e\xbe\x3f\x33\x5a\x86\x42\xbe\x6d\xb3\x5a"
- "\xec\x57\xe9\x7b\xf6\xa0\x38\x77\x9e\xd2\x17\x83\x4e\x26\x7e\x07"
- "\xd9\xce\xf6\xb1\xec\x2e\xa9\xe5\x3e\xd9\x55\xcb\xfa\x56\xa6\xbd"
- "\x09\x69\xfb\x91\xe6\x6e\x2d\xed\xdd\x6a\xed\x47\xbe\x27\xf2\x1b"
- "\xfd\xd8\xab\x6e\x4a\x2f\xf4\xc8\xfe\xde\x7e\x5a\xff\x16\xf8\xc6"
- "\x1b\x7a\x78\x49\x6d\x6c\x5c\xb2\x5b\xb8\x3f\x0b\x5c\x11\x83\x28"
- "\xe7\x5b\x2c\x47\xf6\x6d\xf4\x6d\xc8\xe4\xc7\x75\x3b\xe8\x66\x96"
- "\x31\x91\x9c\xd7\xa0\xe8\x9e\xde\x22\x9c\xb0\x3d\xa1\x51\xab\xb6"
- "\xd0\x77\xd0\x86\x1c\x17\x28\xfd\x37\x6b\x6a\x2d\xc0\x95\x68\xdf"
- "\x25\x62\x1b\xe5\x4f\x48\xbf\x8b\xef\xd4\x6c\xbf\xc4\xb2\x98\x7e"
- "\x52\x97\x45\xfc\xee\xbb\x9e\xae\x40\x3f\x93\xa6\xe6\x19\x66\x2c"
- "\xe6\xb9\xfe\x73\x34\x23\x93\xeb\x8b\xc7\x80\xb0\xe9\xe2\x8a\x98"
- "\x26\x64\x9f\x36\x2f\xde\x4d\x33\x56\xe1\x9d\x26\x1f\xe8\x12\xed"
- "\x3b\x1e\xe9\x92\xc4\x95\x00\xa7\x49\x43\x58\x86\x70\x1a\xb8\x9d"
- "\xb4\x0e\x3b\x67\xac\x70\xd3\x8f\xb5\x71\xeb\x0c\x0b\xc3\x1a\x07"
- "\x07\xbe\xb7\x83\xa4\xdf\x09\x9a\xf1\xbe\xa5\xce\xc0\x78\xec\x97"
- "\xed\x02\xb0\xda\x8d\x4a\x67\x07\x81\x6b\x9b\x33\x68\x85\x7e\xb6"
- "\x06\x9b\x0a\x73\xe5\x6f\x2d\x4e\x68\xfd\x68\x6c\xf8\x8e\x54\xf6"
- "\x15\xd2\x4f\xb7\xa7\x29\x38\x8e\xf8\xee\x5b\x2e\xf0\xb7\xf4\x03"
- "\xe7\x4d\x2a\xca\x75\xb5\xe4\x2a\x1f\xd0\x48\xa3\xc6\xf1\xb7\x7f"
- "\x7b\x08\x65\x0c\x3b\x6f\x47\x9d\xe6\xc4\xab\x75\x8f\xa2\xdc\x71"
- "\xda\x5e\x12\xb7\x1d\x6e\x73\xaa\x4d\xff\xe0\xe2\xa9\x0e\xd9\xfe"
- "\x7c\x43\x49\xf3\xd2\x34\xfd\xcb\x73\x32\x09\xe7\xe8\x07\x83\xa7"
- "\xd2\xa4\x7c\x1b\x85\xf1\x76\x5b\x84\xef\x58\xc4\x8d\x7d\x6e\xc7"
- "\x78\xff\xf6\x63\x78\x4e\x68\xdf\x67\xf0\x0c\xe0\x77\x0e\x9e\xb3"
- "\x92\x76\x6f\x94\x19\xdc\x88\x1b\x82\xcd\xce\xdf\x6e\xba\xfd\xa8"
- "\x78\x23\xdd\xa8\xff\x6e\x7f\x9d\xe7\x09\x6e\x77\x83\x07\x56\xc5"
- "\x0b\x86\x43\x06\xe0\xc6\x74\x17\xf6\x16\xe1\xeb\xa9\xf3\x32\xde"
- "\x49\x3d\x2d\x5e\xb2\xdc\xce\xf5\xff\x41\x2a\xd7\xc9\x0b\xfa\xf3"
- "\xbb\xba\x45\x78\x8e\xb7\xfa\x89\xd7\xc8\x86\x9d\x3f\x40\xfb\xff"
- "\x59\xa1\x9a\x73\x70\xe4\x32\x3c\x4d\x26\x84\x5e\x7f\x45\xe7\xa2"
- "\x5c\xcb\x16\x03\x7f\x6f\x6b\x53\xf3\x30\xde\xd0\x5c\xf3\x0f\x9e"
- "\x47\x3b\xbf\x9f\xfd\x48\x5f\xa2\x1f\xfc\xad\x00\xad\x8f\x5b\xa5"
- "\x8f\x4a\x0f\xcf\xc7\xf0\xfc\x3d\xca\x81\xfe\x9b\x71\x42\xf3\xc7"
- "\xe3\x91\xba\x06\x30\xf7\x22\x0e\xfd\xd1\xe0\x29\xab\x8f\x02\x5c"
- "\x67\xe4\x7d\xff\x8a\xcf\xcc\x7e\xb4\xeb\xf8\x7e\x1b\xe0\x21\xc0"
- "\x2b\xa5\xcb\x7e\x50\xb0\xe3\xa2\xf0\xe9\x75\xe6\xb5\x54\xc0\x1d"
- "\x74\x53\x63\xc9\xb8\x6d\x62\xb4\x1e\x77\x4c\x3a\x9e\xae\xf8\x18"
- "\x04\xad\x22\xf9\x78\x47\xbc\xe2\x61\xc6\x82\x48\x1e\xde\x01\x5b"
- "\x27\x63\x17\x9e\x56\x3c\x87\xd5\x77\xf8\x93\x51\x15\xf6\x1b\x7c"
- "\xcd\x80\x3e\xcd\xa8\x85\xbe\xd0\xe6\x7e\x38\x1c\xf2\xcc\x72\xf3"
- "\x19\xfa\x9e\x11\xf6\x3d\x7e\x91\x38\x9c\x65\x9c\xc3\x83\xb0\x6f"
- "\xdc\x94\xd1\x88\xf8\x24\x6e\xbf\xec\xef\x33\x3c\x7e\xd4\xaf\x13"
- "\x65\x48\x7f\x7e\x89\xf5\x0d\x0d\x2c\xbb\xc8\xd3\x9c\xe8\x6f\x68"
- "\x40\x79\x83\x3a\x5d\x11\x76\x86\xe3\x59\x4e\x87\x9d\x77\x98\x41"
- "\x17\xe9\xdf\xc4\x8b\x31\x60\x6c\xdb\xe3\x8e\x8c\x51\x1b\x2d\x69"
- "\x9e\x8d\x79\x39\x48\x77\x66\x43\x8f\x41\x7f\x17\xe6\xa8\xfe\xe7"
- "\xce\xbb\xf9\x1b\xfa\xf3\x63\xfc\xce\x3c\x05\x3d\x75\xad\x29\xb7"
- "\x6a\xc4\x48\x13\xaf\x19\x29\xd7\xdf\xf4\xeb\xc3\xfe\x94\x9c\x5a"
- "\xd7\xc0\x51\xea\xf5\xff\x5f\xc4\x77\xc9\x02\xc6\x1d\xec\x77\xd6"
- "\xbe\x4d\x04\xde\xbb\xd6\x69\x76\xf9\x3f\xed\x96\x7e\xde\xd5\xb9"
- "\x7d\xc3\x2f\xce\xc1\x0a\x58\x2d\x61\x6b\xf4\xf9\x75\xc3\xde\x67"
- "\x85\x7f\xef\x79\xf6\x45\x93\x36\xf9\xe5\x6b\x34\xf3\x97\xdb\x29"
- "\xb3\xf5\x1a\xa5\xb7\x5d\xa3\x0c\xf1\x17\xbe\xff\x27\x74\x67\xd0"
- "\x94\x2a\x8a\x6f\xdb\x0e\x7b\xce\x4f\x86\xc0\x7e\xd8\x73\x7e\xd8"
- "\x73\x9f\x66\xb0\xbe\x1c\xb5\xe7\x46\xa4\xad\x9c\xe7\x95\xfe\xc9"
- "\xf7\xe7\x79\x6f\xb4\x92\x21\x61\x2d\x25\x01\x3f\xfb\x25\xba\xa3"
- "\x22\xa1\x1f\xb6\x24\xea\xec\xd6\xea\x0b\x9a\xd7\x26\x5a\x69\xa2"
- "\xac\x2b\x74\xb8\xd8\x5f\x98\x33\x6e\xdf\x6c\x64\x99\xf2\x72\x5b"
- "\xe2\x3a\xd4\xf3\x5a\xee\xd1\x5b\x7c\xe6\xea\x56\xe1\xe3\xf0\x9a"
- "\xe9\xc2\x87\x70\x2b\x97\x7d\x04\xe1\xc3\xce\x3b\x1b\xdd\xe6\x99"
- "\x0b\xc6\x93\x51\x8c\x99\x34\x5d\x73\x57\xb2\x30\x3a\x20\xa3\xf3"
- "\xba\x76\xf8\x61\x8f\x5f\xe2\x76\x7c\x57\xd2\xb2\x4a\xe1\xb7\x6c"
- "\xe0\x75\xf5\xbb\x88\xd7\xfc\x79\xad\xef\xaf\x61\xeb\x7c\xd1\x3a"
- "\x3f\xf7\x21\x3c\x7e\x48\xac\x04\xcc\xa6\x79\x5d\x02\x63\xf6\x2f"
- "\x6b\xd7\xf3\x5e\x93\x57\xe4\xbe\x96\xbb\x0a\xdd\xf4\x58\x87\xe6"
- "\x5f\x76\x50\xe9\xd3\x99\x33\xbd\xa0\x41\xa4\x0e\x98\x49\xec\x17"
- "\x65\xa8\x31\xd7\xdf\xfd\x3d\xd6\xfd\x77\x5d\x55\xb6\x50\xae\x4f"
- "\xf5\x05\x77\xfd\x8b\x9a\xe3\xbf\xab\xd5\x4d\x3f\x92\x7d\x7c\xd5"
- "\x6d\x2c\x13\x77\x9d\x11\x29\xb9\x23\x9c\x6e\xb6\x83\x1c\x1b\xfd"
- "\xb4\x56\xec\xcf\xf5\x09\xd9\x56\x2e\x91\x78\x6d\xdd\x30\xef\xd5"
- "\xf0\x7e\x6b\xe5\x30\x6c\x83\x99\x88\xf3\x73\x19\x1e\xa4\x01\xdd"
- "\x27\xa9\x3d\x01\x77\x79\xdc\x74\xaf\xa6\x0f\xef\xea\x51\x73\xcf"
- "\x77\xf5\x0c\x21\x2f\x6c\xc5\x9b\x86\x9d\x33\x61\xff\x2e\xaf\xd1"
- "\xd6\x8e\xe5\x9e\x1e\x84\xa5\xbb\x69\x45\x17\x87\xd5\x4c\xa7\xb4"
- "\x1a\x8b\x18\x18\xd7\xd6\x8b\xa8\xe7\xac\x77\xe5\xbe\x1b\x23\x7d"
- "\x0b\x30\xac\x3a\x5c\xf4\xb7\xff\x61\xc8\xf8\xe8\xa3\x08\xab\xd5"
- "\xe1\x22\xcd\xcd\xf8\xde\x33\x9a\x46\xe5\x69\x0d\xcb\xf3\xe8\x90"
- "\xf1\xce\xff\x80\xb0\x23\x51\x79\xba\xa3\xf2\x9c\x0e\xcb\xe3\xd0"
- "\xca\xe9\x8f\xca\xe3\x8d\xcc\x33\xcb\x3c\x16\xb7\x59\x69\x91\x79"
- "\x66\x65\x44\xe5\xc9\x19\x8b\xdb\xac\xc2\xa8\x3c\xab\xa2\xf2\x54"
- "\x86\xd1\x96\xf7\xc0\x64\x22\xcc\x11\x95\xa7\x31\x2a\x4f\x87\xfe"
- "\x0d\xdb\xb3\x5b\xd9\x06\x90\x27\xf0\x14\x7c\x85\x9d\x33\x0b\xf5"
- "\x5f\x78\xe6\x7a\xfb\xa0\x20\x33\x5e\xfb\x41\xe5\xa7\x9f\xf5\x2a"
- "\xaf\xeb\xb3\x3e\x87\x5d\x3c\xc8\x32\xc1\x76\x27\x97\x75\x9e\x66"
- "\x5f\x64\x19\x1a\x76\xce\x4e\x1d\x4b\x8f\xd9\x19\x91\x78\xce\xce"
- "\x89\xc4\x73\x76\xc1\x58\x7a\xcc\x5e\x15\x95\xa7\x32\x2a\x4f\x6d"
- "\x58\x9e\x0e\xad\x9c\xc6\xa8\x3c\x1d\x51\x79\x8e\x8c\x95\xcf\xd9"
- "\x3d\x51\x79\xce\x44\xe5\xe9\x0f\xd1\x70\xb6\xdc\xcf\xc6\xed\x01"
- "\xe1\xf8\x5e\x90\x7e\x1d\xda\x25\xe9\xf2\xac\xef\x47\x53\x72\x3d"
- "\xa7\xbe\x59\xed\xcb\x92\x3e\x91\xfa\x69\xce\xab\xfa\x7a\xef\x5b"
- "\xd7\x7c\x71\xbc\xc6\x04\xda\x0e\x1c\xb7\xf9\xd0\xe7\xce\x59\xeb"
- "\xa6\xbb\xf5\xfb\x0d\xe4\x5e\x19\xe9\x53\x4f\x8e\x47\xe6\xe4\xaa"
- "\xf6\x37\xa7\x59\x5b\xd3\xe1\xfa\xa0\x5f\x9c\xd3\xfc\x3f\x86\x57"
- "\xe6\xdd\x8c\x17\xfb\x96\x02\x8c\xbe\xd1\xb1\xc6\x28\xae\x5c\x66"
- "\xe6\x03\x3a\xae\xed\x6a\xaf\x0d\xfb\x33\xf3\xb0\xbf\xaf\x61\x67"
- "\x66\x42\xd8\xf8\x84\x71\xf5\x1e\xdd\xee\x33\x47\xe1\x3c\xa8\x70"
- "\xce\xcc\x55\x3a\x2a\x33\x57\xd7\x27\xe3\xca\x5f\xa3\xdd\xd7\x0b"
- "\xab\x80\xf7\x14\x9c\x6a\x85\xbd\x89\x31\x16\xe3\x7d\x8e\x32\x1b"
- "\xa4\xfd\xbb\xe1\x1a\xf1\x6f\x57\xed\x7c\xb9\xe7\x40\xab\x4b\x37"
- "\xdf\xeb\xc0\xb6\x4f\x4f\xd5\xe7\x34\x24\xc7\x68\xac\x1b\x33\x2f"
- "\x1e\xaf\xf5\x30\xae\x5d\xfa\xbe\x1c\xe0\xa2\xec\xba\x46\x3b\xef"
- "\x85\xf0\xf0\xba\xde\x71\x6f\x0e\xa7\x39\x0b\xda\x76\xe8\x34\xe0"
- "\x3b\x22\x90\x76\xdc\x3b\xee\xc2\xe9\xaa\x70\x98\xf7\x84\x92\x9f"
- "\xac\xf4\xc8\xf6\x10\x07\x39\xcd\xca\x89\x94\xb9\xac\x82\x48\x99"
- "\xcb\x2a\x89\x6c\x0f\x46\xb4\x87\xac\xca\xa8\x3c\xb5\x51\x79\xf6"
- "\x84\xe5\x69\xd4\xca\xe9\x88\xca\x73\x24\x2a\x4f\xb8\xfe\x43\x9d"
- "\xb3\x4e\x8f\x8e\x3b\xa5\xbe\xcf\x72\x87\x7d\x1b\x9b\x65\x3f\x95"
- "\xe5\xd5\xc3\x78\xde\x8e\x6d\x54\x96\x1b\x05\x6f\x6e\x52\x94\x8e"
- "\x42\xfa\xb9\xe9\x91\x38\xcc\xcd\x8e\xc4\x61\x6e\xbe\xfe\xad\xed"
- "\x79\xf8\xfd\x79\x9a\xab\xfb\xf7\xf4\x26\xd6\xd3\x4f\x12\xfd\x8f"
- "\x3c\xc1\xb6\x19\xf7\x4f\x72\x6f\xd8\x0e\xd8\x94\x97\x29\x89\xf7"
- "\xe4\x9d\xaf\x21\x13\xfb\x9d\x73\xd3\xbc\x63\x18\xcf\xb1\xbd\x3b"
- "\x08\x7b\x6a\x19\x60\xac\x40\xf9\x2d\x28\x03\xb4\x9b\xdb\x19\x85"
- "\x43\x57\x14\x0e\x27\xc2\xbe\x93\xf0\xdd\x17\x56\xef\x24\x53\x9a"
- "\xdc\x03\x0a\xdb\x7a\xae\x47\x0f\xe7\x39\x00\xd4\x71\xc0\x2e\xed"
- "\x80\x5c\xde\x8f\x97\x72\x8e\xe6\x7e\xc4\xf3\x05\x0a\xe6\xbc\x69"
- "\xe1\xb4\x55\xb4\x98\x97\x19\x89\xc7\xbc\xdc\x48\x3c\xe6\x15\x87"
- "\x74\xcd\xdc\x15\xaa\x8d\xcc\x2b\x73\xd3\x7d\x8d\x1c\x06\x5a\x58"
- "\x12\xfd\x96\x9b\xba\x6f\x63\x3b\x75\xde\x6f\xbd\xa8\xaf\x78\xd1"
- "\x98\xa2\x7d\xff\xad\xb8\x8d\xed\xee\x3c\xd6\xcf\xbc\xe7\xf2\x56"
- "\x84\x1d\x53\x7c\x9d\x87\xfa\xff\xa8\x53\xc1\x9d\x77\x4c\xf6\x03"
- "\xb7\xb1\xfd\x3b\xaf\x41\x24\x3b\x62\xda\xac\x2c\xcf\x43\x29\x0e"
- "\xd2\xf6\x83\x5a\x00\x63\x50\x6f\x0f\xc1\x26\x07\x05\xf7\x3f\x04"
- "\x7a\x64\x03\x46\xa6\x4f\x8d\x69\x1e\xca\x86\xec\xb7\x80\x7f\x18"
- "\x03\x67\x6b\x63\x19\x47\x2a\xef\xc9\x83\x5e\x62\xdf\x96\x09\x6a"
- "\xff\x44\x76\x76\x58\xbb\xf2\x5a\xb6\xdf\x2f\xce\x51\xf6\x55\xb6"
- "\xed\x58\x6f\xf0\xde\xbe\xe3\x7e\x0f\xf1\x3c\x8b\xcb\x7f\x41\xda"
- "\xe4\x88\xf7\x69\x79\xab\xc2\xf2\x7a\xb4\x79\x90\x01\x8e\x9b\xe3"
- "\x27\xf3\x71\xaf\x87\x7d\xf8\xa7\x2a\x3b\x3e\xfb\xea\x71\xe8\x0b"
- "\xe4\x39\xa4\xe7\xe1\x39\x13\xce\x83\x31\x8f\x79\x76\x2d\xdf\xf9"
- "\x79\x4e\xc2\xd6\xf7\xd7\xf0\xf8\xc8\x55\x3b\x40\x2e\x6f\x1f\xcf"
- "\x69\x9a\xd5\xbe\xa8\x6c\x9f\xc9\x47\xf1\x43\xfb\xed\xe0\x7d\xb6"
- "\x2f\xb0\xdf\xee\x03\x6e\x90\xf3\xec\x69\xac\x03\xc3\x69\xb7\x78"
- "\x71\xf1\x23\xcb\x8a\x66\x3d\xfe\xc8\x92\x15\x8b\xe7\x5b\x56\x54"
- "\xac\x2f\x2f\x9b\xb5\x71\x73\x8d\x65\xeb\xa6\x8a\x9a\x8a\x0d\xcf"
- "\x49\xb7\xa3\x96\xd2\x1a\xf5\xce\xa8\x2c\xad\xae\x59\xc8\x3f\x67"
- "\x5a\xaa\x36\x95\x6f\x91\x3f\xef\x98\x4c\x91\x40\x2a\x6a\xca\x37"
- "\x59\x66\x94\xcd\xb4\x3c\x58\x5a\x51\xb9\x79\x53\x79\x4c\x58\xf3"
- "\x2d\x9b\xca\x37\x95\x97\x96\x59\x16\x5a\x32\x19\x72\x38\xb8\x30"
- "\x7e\x66\xea\xfa\xa9\x1a\xfd\x39\x6c\xe8\x01\xd6\x53\xdc\xaf\x9f"
- "\xa7\x1f\x7e\xc4\x36\x9c\xf4\x13\x0a\x39\x44\x9f\xe0\x1e\x76\xde"
- "\x7d\x76\x6c\x3f\x7e\xb7\x27\x52\x7e\xef\xa1\x48\xf9\xbd\x27\x69"
- "\x6c\x3f\x7e\x4f\x54\xfb\xbf\x27\xaa\xfd\xdf\x93\x3f\xb6\x1f\xbf"
- "\xa7\x24\x2a\x8f\x35\x2a\x8f\x6d\x54\xcf\x00\xd7\x9d\x52\x2f\xdd"
- "\xb3\x27\x2a\x4f\x6b\x54\x9e\xc3\x51\xdf\xc7\xc2\xbe\x61\xbb\xde"
- "\x73\x32\xdc\x36\xc0\xf7\x59\xbd\xad\x87\xf4\xdb\x3d\x1e\x3d\x0d"
- "\xf7\x3d\xed\x7c\x1f\x91\x4c\xfb\xc3\xf8\xb0\xb4\x03\x2a\xed\x0f"
- "\x47\xdb\x3f\xeb\x24\xde\x13\xa9\xec\xf3\x1f\xbe\xac\xe9\x36\xbe"
- "\x9f\x48\xef\x43\xfb\xc1\x8b\x5b\x2f\xd1\x3d\x57\xdb\x55\x5a\x0f"
- "\xef\x93\x15\xaf\xad\x1c\x6e\x4f\xa1\x78\xce\xcb\x7e\x32\x85\xf3"
- "\x6e\xe9\xb3\x11\x61\x09\x78\xa0\xa7\x7e\xe8\x70\x9b\x67\xc9\xbd"
- "\xed\xbb\x90\xc6\x4d\x3f\x94\xb2\xcc\xf9\x76\xc9\x7d\x7d\xb2\xbc"
- "\xab\x7c\xcf\x12\xfb\x9e\x65\xfd\xc9\xe5\xb2\xff\x56\x2e\x1b\x30"
- "\xcc\xc2\x78\xf7\x12\xcd\x0f\x67\x12\x9e\x54\xc0\x3c\xa3\xc3\x04"
- "\x3c\x39\x4f\xb4\x53\xdb\x07\xaf\xec\x9e\x1f\x7a\x75\xfb\x82\xc7"
- "\x0a\xb1\x74\x47\xec\x3d\xcf\x94\xb8\xcf\x19\xec\xeb\xae\xeb\x07"
- "\x4e\x39\xe9\x6c\x87\xba\xd2\xfc\xd4\xdb\xea\xc7\xf8\x95\x92\xe4"
- "\x78\xca\x76\x91\x5c\x1d\x7e\xe2\xf9\xe1\x35\x36\x72\xb4\x1b\x83"
- "\x7d\x62\x34\x1f\x8f\xd1\x72\xe4\xbd\x02\xbb\x38\x1c\xf9\x31\x96"
- "\xf0\xf0\xde\xe8\xf1\xee\xfb\xe2\x74\xdd\xb7\xf1\x78\x2f\xa7\x59"
- "\xb3\x7d\x1b\xda\x01\x2b\xe6\xbe\x5d\x23\xb9\x86\x9d\x39\xe8\xff"
- "\xd6\xe6\xe8\x3a\xfb\x78\x8b\xd4\x7d\x46\x84\x83\xb6\x39\x69\xe3"
- "\xd9\x29\x9a\x7e\xaf\xe2\xbd\x5f\xc3\xce\x7b\x53\xaf\x97\x96\xf1"
- "\x3e\x8e\x7a\x8b\xa6\x07\xe8\xad\xba\xcc\x38\x4d\xbf\xc6\x23\x5f"
- "\xa1\x9e\xef\xcb\xd4\x4f\x3b\xa3\xe0\x41\x5b\xf5\xaa\xb1\xe2\xfc"
- "\xdf\xbd\x22\xf7\x02\xdf\x0b\xfb\x2f\x47\x6f\x07\x37\xe0\x1b\xfa"
- "\xef\x5e\x39\x9f\xc8\xfb\x66\x78\x4c\x5d\x5d\x05\x9b\x2d\xcd\x0b"
- "\xdd\x78\x6f\xb7\x1e\x27\xe7\x89\x38\xae\x56\xf8\x8e\xa7\xf5\x73"
- "\xdc\xd9\xd1\x38\xce\xc7\x78\xdb\xfc\x1c\xee\xd5\xc3\x55\xdf\x32"
- "\xdf\x1c\xf5\x9d\xaa\x7f\xe3\xb7\x05\xb8\x34\x68\xf0\x3d\xd0\xb9"
- "\xbc\xe7\xc9\x70\x8e\xe6\xd7\xb7\xc9\x76\x33\x3f\x57\x8f\x97\x73"
- "\x6a\x6f\xf2\xda\x98\x97\x82\x29\x0f\x90\xb4\xb9\x90\x87\xef\xed"
- "\xc2\x18\xc3\x20\x46\xe4\xfe\xab\x41\x86\xc3\x6d\x46\xde\x9d\x83"
- "\x6f\xc0\x62\xbf\xdd\x1e\x96\x91\xad\x7e\x9a\x56\x75\x1f\xcf\x3f"
- "\xcf\x97\x72\xcb\x61\x0c\x97\xe1\x71\x9f\xc8\xb0\x19\x1e\xdf\x2f"
- "\x26\x86\x78\x8f\xe2\x7c\xd4\x3f\xc7\x3b\x1e\xaf\x10\xef\x0e\xa3"
- "\x65\x1c\xbe\x3d\x91\x75\xfd\x11\x45\x7d\x27\xe9\xdf\x3c\xd7\xab"
- "\x64\xef\x47\x66\x2d\x6e\xe6\xf5\xca\xe2\xf1\x2f\xd2\x14\x47\x96"
- "\xf7\xa3\xb5\x51\xf0\xab\xa2\xbe\x1d\xfa\x77\xb3\x5c\x63\xf8\x51"
- "\xa3\x5e\x86\xe4\x19\x64\xec\x50\x9d\x27\xee\x7a\xfe\x64\x91\xa7"
- "\x27\xac\xcc\x09\xf8\x3e\x13\xe2\xdf\x8f\xdc\x3a\x3c\xfc\x1e\x0c"
- "\x4b\x07\xbb\xe4\x47\x7e\x3d\x9d\x5a\xdf\x58\x90\x10\xca\xb7\x20"
- "\xed\x0b\xea\x1a\x25\xbb\x0b\xcb\x95\xec\x2e\x28\x8e\xc4\x65\xc1"
- "\xda\x30\x98\x95\x21\x5c\x16\xd8\xc2\xd2\xa1\x7d\x2e\x68\x88\x96"
- "\xd5\x6a\x1b\xcb\x38\xcb\xeb\x82\x43\x31\xe2\x7c\x5a\x5c\x77\x6c"
- "\x19\x5f\xd0\x17\x16\xae\x8d\x8f\x16\x2e\xd4\xec\x04\xd6\xcf\x5e"
- "\xbe\x3b\x4d\xf3\xdf\x2e\x65\x92\xfd\x3a\x6b\xf7\x39\x41\xae\x17"
- "\xa6\x45\xc3\xe5\x3b\x78\x46\x61\x8c\xc2\x5c\x30\xa0\x6c\xbc\x85"
- "\x05\xa1\xba\x2d\x5c\xe1\xa6\xf9\xfa\x3a\x91\x47\xcd\x0d\x2e\xc8"
- "\x1f\x6f\xdc\x81\xf4\xbb\x22\x69\xb6\xb0\x39\x44\xb3\x85\x1d\x61"
- "\x70\x0f\x87\xa5\xfb\x4f\xf8\x3e\x16\x96\xee\xc4\x17\xc9\xa6\x92"
- "\x95\x85\x9e\xc8\xb2\xee\xa3\x10\x8c\xfb\x12\x42\x65\xdd\x97\x16"
- "\x96\xae\x0f\xdf\x19\xe3\xf3\xe7\xbe\xfc\xf1\xf9\x73\xdf\xda\xd8"
- "\xfc\xb9\xcf\x16\x56\xee\xae\x2f\x6e\x57\xf7\x75\x86\xe1\xd3\x8e"
- "\xef\xae\xc8\x76\x74\xdf\x89\xa8\xef\x51\xfe\x0b\xe8\x8e\x43\xdb"
- "\x73\xe3\x38\xbc\x66\x3a\x25\xa9\x76\x76\x9f\x2f\x3c\xfe\xbd\x6b"
- "\x2a\x9e\x71\x94\x6b\x70\xbc\xbe\x29\xd3\xdd\x6f\x89\x4e\xc7\x69"
- "\xc2\xe2\x73\x75\xdc\x77\x8d\xe3\x6b\x5c\xef\xff\x5c\x41\xee\xff"
- "\xee\x5f\xa5\xd6\x6d\x16\x65\x0b\xe7\x87\x25\xe3\xf5\x65\x80\xdb"
- "\xe2\xa6\xfb\x8b\x15\x7d\xee\x87\xfc\x3f\xae\xce\xbe\x34\x2e\xca"
- "\x86\x3c\x5d\x3b\x4f\xb9\x0b\xf1\x1e\xc1\x7b\x7a\x64\xff\x7a\xff"
- "\x31\xe1\x34\x2c\x6f\x77\x46\xf7\xbb\xf7\x9f\xc1\xd8\xe3\x5a\xa2"
- "\xdf\x51\x12\x23\xce\x23\x9c\xa6\x47\xc6\x86\xe7\x72\x5f\x77\xcd"
- "\x4d\xb9\x0b\x18\xdf\xb0\x70\x8b\x70\x4e\x59\xc1\xe9\xdd\x5c\x1e"
- "\xf2\x8c\xc7\x37\xfd\x7c\x91\x92\xbd\xdc\xca\xa8\x7a\x5c\x05\xac"
- "\x4f\x54\x3d\x1e\x58\x1c\x55\xf6\xae\xd8\xf5\xc8\x6d\x45\x3d\xae"
- "\xc6\xae\x47\xae\xbc\x43\x57\x18\x51\x97\x31\x76\x47\xee\x19\xd4"
- "\xe5\xaa\xa4\x7b\x64\xf8\xa0\x3e\x4e\xb5\x5f\xc5\xf8\xdf\x48\x32"
- "\xef\xf2\xda\x10\xdf\x54\xba\x07\x52\x13\x5b\xa8\x78\x6c\x99\x0f"
- "\xcc\x14\xce\x89\xcb\xdd\xf4\x40\x99\xde\x5f\x69\xe1\xf9\x0a\x17"
- "\xd0\xc9\xc8\x74\x42\x7d\x90\x6f\x3c\x7e\xeb\xed\x53\xad\x33\x3d"
- "\x80\xf6\x9f\x5b\xa0\xf7\xe9\xe8\xcf\x3d\x3a\x1d\x11\x77\x24\x2a"
- "\xce\x17\x16\x77\x32\x22\x6e\xc7\x68\x78\xbf\x1e\xfe\xe5\xf8\xb4"
- "\x28\x35\x8a\x4f\xe0\xcf\xa2\xb7\x23\xeb\xbd\x28\x5d\xd5\x0f\x3c"
- "\x1a\x43\xeb\x45\xb9\xe0\xd1\x48\x6c\x1e\x2d\x5a\x15\x5b\xd6\x16"
- "\xc9\x3b\xbf\x45\x0a\xc5\x82\xd7\x08\xde\x8d\x48\x19\xd4\xf8\x34"
- "\x96\x3f\x8b\x8e\xea\xfc\xf9\x92\x75\xf4\x45\xd5\x31\x70\x9e\xf2"
- "\x36\xab\xba\xe6\xfd\x43\x24\xec\xbc\xa4\xd8\xb2\x98\x97\x81\x7a"
- "\x06\x62\xd7\x33\x2f\x7f\x7c\x59\xcc\x5b\x8b\xfa\x04\xc6\xca\x62"
- "\x9e\x4d\xe5\xa1\x58\x79\x9a\x85\x33\x66\x39\x87\xd9\x2e\x72\x53"
- "\x5e\x3f\xaf\xd3\x85\x85\xf7\x44\xca\x5f\x5e\x92\xcc\xc7\xf4\xf3"
- "\xab\x71\x0c\xf3\xe1\xbc\x85\x8c\x5f\x24\x93\xc3\xce\xfc\xf4\x28"
- "\x5a\x7d\x7a\x9e\xf2\xdf\x1e\x32\x1a\x1f\x54\xf4\x5a\x5c\x11\x89"
- "\x53\x7e\x6e\x6c\x7a\xe5\x97\x80\x5e\x9f\xc6\xa6\x57\x7e\xcd\xf8"
- "\xf4\xca\x67\xfe\x7f\x3a\x96\x5e\xf9\x9d\xe1\xf4\xe2\x3b\x5f\xb9"
- "\x7e\xdf\x4f\x83\x6c\x8c\xac\x11\xed\x4a\x97\x27\x25\x42\x56\x54"
- "\x9e\x41\xce\x73\x36\xd1\xa7\xe4\xc4\x72\x0b\xc5\x5f\xa2\xfc\x1e"
- "\xbd\xfd\x4f\x69\xa1\x89\x62\x64\x25\xef\xd1\xe6\x3b\x24\x92\x5c"
- "\xb6\x4f\xbb\xf9\xae\x49\x9e\x6f\x8c\x2c\x77\xb1\x25\xb6\x2e\x58"
- "\x9c\x03\x9a\x36\xc5\x08\x2f\x56\x73\xa6\x8b\x1b\x22\x75\xc4\x62"
- "\x6b\x24\x8f\x40\x37\xa3\xf4\x8e\x6e\xf8\x32\xcf\xf5\x79\xb6\xb8"
- "\x6f\x2c\xcf\x1e\xdc\xa6\xf8\xf5\xe0\x13\x51\xf8\x79\x62\xf3\xeb"
- "\xc1\xf8\xf1\xf9\xf5\x60\xfa\xf8\xfc\x7a\x30\x97\xf9\xe5\xa6\x07"
- "\x6d\x91\xfd\xc6\x83\x25\x91\xf5\x45\xb9\xc8\x27\x8c\x13\x6e\xe2"
- "\xef\x2f\x5b\x6f\xfd\x61\x1d\xc7\xbc\x6a\x87\x7d\x05\xfc\xa7\x33"
- "\x8e\x5f\x15\xc6\xb8\xb0\x41\xc3\xc6\xed\xe3\xde\x4b\x92\xd0\x8b"
- "\x71\x25\xef\xcf\x93\x77\x44\xd3\x8f\x8b\x82\x46\xc3\x7c\xfc\x36"
- "\x9e\xa7\x25\xdf\x0e\x1a\x4d\x0e\xde\x4b\x26\xcf\xe6\xc9\xf5\x89"
- "\x1f\x97\x85\xf3\x82\xf7\x94\xf1\x5c\xf4\x5e\x35\xcf\xf9\x27\xe4"
- "\xbf\xa8\xf8\x52\x70\x35\x92\x8e\x3f\x6e\x88\xcd\x97\x1f\x77\x80"
- "\x2f\x7f\x8a\xcd\x97\x1f\x1f\x1b\x9f\x2f\x3f\xe6\x31\xe9\x9f\xc6"
- "\xb6\xa3\x1f\x7b\xb4\x76\xb4\x93\xf3\x58\x36\xb0\xbd\x5a\x50\xca"
- "\x69\xf0\x1b\x6d\xa4\x40\xde\x49\x35\x6b\x50\x6f\x47\x9c\xa7\x80"
- "\xc7\xff\xb2\x7c\x2d\x8d\x45\x83\x11\x06\xb7\xa0\x20\x71\x30\x56"
- "\x3b\x29\x58\xcb\x69\x67\x57\x11\xef\xeb\x2d\x39\xc8\x30\x36\x11"
- "\x01\xc6\xdf\x72\x3a\x0e\xe7\x3b\x1d\xc2\xd2\x37\xea\xe9\xe4\xbc"
- "\xa8\x4a\xdb\xc0\xf7\x92\x73\xba\x28\xd8\x5a\xfd\x27\xca\x7e\x84"
- "\xd3\xcb\x7b\xd0\x23\xd3\xb8\x55\x7b\x5c\x92\x1e\xd9\x1e\x0b\x7c"
- "\x91\xf2\xf9\x63\x5e\x9f\x48\x0c\x42\xcf\xe1\x77\x61\xc0\x69\x98"
- "\xff\xf5\xb4\xcd\x25\x35\x51\x6d\x13\x32\xf0\xd0\xcd\x4a\x06\x96"
- "\x5c\x8e\xc4\x75\xc9\x9e\xd8\x32\xb0\xe4\xd0\xf8\x32\xb0\xa4\x7b"
- "\x7c\x19\x58\x72\x96\x65\xc0\x4d\x0f\xa5\x46\xb6\xcd\x25\xde\xc8"
- "\xba\xa3\x5c\xd9\x36\x29\xf9\xab\xb4\x4d\xd8\x42\x37\x8d\xd7\x0e"
- "\x35\xfb\xdf\xc0\xf7\xb4\x7d\x05\x9a\xa9\x7b\x87\xe8\xa1\x4e\x5e"
- "\x43\x82\x8e\xb7\x32\x0d\xdb\xe4\x18\xed\xa1\x63\xe1\x74\xdc\xab"
- "\xc6\x5a\xf6\xf3\xf4\xf0\x03\xbc\x67\x4f\xd1\xb3\x70\x52\x64\xfd"
- "\x1f\x3a\x1b\x9b\x9e\x0f\xf1\x3a\x85\x3d\x36\x3d\x1f\x4e\x1a\x9f"
- "\x9e\x0f\xcf\xe4\x33\xe0\x63\xdb\xd4\xc3\xf9\x7c\x07\xa7\xde\x37"
- "\x5d\xa2\x87\x0f\x7e\xb9\xfe\xe9\xe1\xda\xc8\xfe\xe9\xe1\xb2\xaf"
- "\xde\x3f\x3d\xdc\x1d\xbb\x7f\x7a\xb8\x2f\x76\xff\xf4\xb0\x47\xb5"
- "\x87\xc2\x8c\xc8\xf6\x50\x18\x1f\x29\x13\xa0\xdd\xd7\xd6\x3f\x15"
- "\xda\xa2\xda\xc0\x3e\x94\x77\x15\x36\xc5\x6e\xc5\xb7\xa2\xf7\x23"
- "\x71\x2c\x6c\x8e\xcd\xb7\xc2\xc3\xe0\xdb\xbe\xd8\x7c\x2b\x3c\x31"
- "\x3e\xdf\x0a\xfb\xc1\xb7\x7d\x63\xf9\x56\xe8\xff\xea\x36\x45\x51"
- "\x66\x24\xcf\x8a\xd2\xbe\x3a\xcf\x8a\x6a\x62\xf3\xac\x68\x4f\x6c"
- "\x9e\x15\x1d\x52\x3c\x2b\x3a\x1b\xc9\xb3\xa2\x63\x91\x3c\x03\xdd"
- "\xbe\x36\x9e\x2d\x9d\x19\xc5\xb3\x8d\xe7\x69\xe9\x6f\xc0\xb3\xd3"
- "\x8a\x67\xcb\x9e\x8f\xc4\x71\x69\x41\x6c\x9e\x2d\x5d\x0b\x9e\x6d"
- "\x8c\xcd\xb3\xa5\xb5\xe3\xf3\x6c\x69\x0b\x78\xb6\x71\x2c\xcf\x96"
- "\x1e\xf9\xea\x3c\x5b\xda\x1f\xc9\xb3\xa5\x27\xbf\x3a\xcf\x96\x65"
- "\xc4\xe6\xd9\xb2\xdc\xd8\x3c\x5b\x56\xa2\x78\xb6\xac\x31\x92\x67"
- "\xcb\xaa\x22\x79\x06\xba\xfd\x3b\x79\x06\xfe\xe4\xa8\xfd\xba\xcb"
- "\xf8\x7e\xdc\x89\xc3\xce\x65\x03\x6e\x2a\x3e\xa2\xd6\x04\x8a\xa5"
- "\xec\x68\x3c\x7c\x0f\x69\xce\x8e\xed\xbb\x8b\xcd\x5a\xd8\xe3\x63"
- "\xf9\x50\x6c\x41\xbf\x3a\xd8\x53\x2b\xf7\x75\x29\x1e\x32\xcd\x91"
- "\x4e\xcd\x91\x15\xe7\x72\x5e\xf0\x58\xb8\x7c\x7e\xe2\xbe\x18\xe9"
- "\xbd\x0c\x87\xfd\x95\x44\xc1\xaa\xfc\x2a\x76\xd9\xf8\x7b\xcc\x17"
- "\xe5\x74\xd7\xcd\x05\xbc\x9f\xd4\x2b\x59\x2d\x8e\xb6\x7f\xdb\x11"
- "\xf7\xa8\x92\xd3\xe5\x51\x73\x26\xc5\xe3\xd8\xbf\x3f\x61\xfb\xb7"
- "\x3d\xb6\x9c\xfe\xe4\x3a\xf6\xef\x4f\xd8\xfe\x6d\x0f\x1b\xaf\xa6"
- "\xac\xf6\xbb\xa3\xc6\xab\x3f\x29\x4b\xf4\x2a\xd9\x91\x76\xec\xfe"
- "\x45\x39\xc3\xce\x9f\xec\x89\xc2\x19\xbc\x79\x64\x92\x86\x73\x14"
- "\x7f\x7e\x72\x68\x1c\x9c\x8f\x01\xe7\xf7\xc6\xc1\xb9\xef\x3a\x38"
- "\x73\xdf\xfc\xde\xd8\xb6\xf5\x48\x82\x26\x07\x31\xc6\xe5\x8f\x64"
- "\xc4\xe6\xff\x23\x51\xfc\xa7\x92\x9a\x5a\xe1\x91\xf9\x23\xd3\x59"
- "\xc3\xd3\xf1\x5e\x7d\x4e\xcb\x32\x12\x23\x6d\x73\x34\xcc\x71\xd2"
- "\x1d\x1b\x23\x7b\x7c\xb6\x20\xa6\xec\x3d\x32\xa0\xda\xe3\xf2\xdc"
- "\xc8\xf6\xb8\x9c\x22\xdb\x23\x68\x1d\x91\x6f\xb9\x25\x32\xbe\xd8"
- "\xf3\xf5\xe9\xd8\xe5\x8d\x51\x32\xf0\xe1\x79\x5a\x71\xa3\x92\x81"
- "\x15\xe5\x51\x78\x74\xc6\x96\x81\xe5\xdd\xa8\xff\x87\xb1\x65\x60"
- "\xf9\xd9\xf1\x65\x60\x39\xef\x21\xfe\x30\x5c\x6e\x97\xd7\xe6\x4e"
- "\x8c\x4c\xb3\x62\x5a\x6c\x9d\xb7\x22\x3b\xf6\xbc\xce\x8a\x42\x45"
- "\xe3\x15\xbb\x22\x69\xbc\xa2\x2c\x92\x86\xa8\xcb\xbf\x9f\x86\xa3"
- "\x7e\xc3\x86\x9d\x2b\xa2\xdb\xbf\xeb\x3c\x3d\xaa\xb5\xff\xc7\x8a"
- "\xa2\x70\xd4\xc6\x3f\xb1\xe6\xb2\x1e\x4d\x00\x2d\x5d\xb1\x69\xf9"
- "\x68\x46\xec\x3a\x3f\x9a\x8b\x3e\xc8\x15\x1c\xd3\x96\x1e\x2d\x41"
- "\xf8\x72\x79\x77\xe4\x55\x4a\x6a\x43\xf8\x72\x3f\xc5\xcb\xfe\x6a"
- "\xb4\x5f\x7a\x94\x7d\x0a\x09\x39\xc7\x0c\xf9\x4d\x9c\x46\xc5\xdc"
- "\x07\x31\x5e\x6b\x6a\xa3\xd7\x44\x1f\x95\xf3\x1f\xbc\x8f\x85\xcf"
- "\xd5\x24\xda\xa8\xd8\xe5\xf5\x93\x2e\xef\x9c\x3e\x0a\x76\x1f\xb7"
- "\x0b\x4e\xaf\xa7\x55\x73\x9d\x8e\x28\xdd\xf4\x18\xc5\xe6\xf1\x63"
- "\x69\xe3\xcb\xce\x63\xd9\x8a\xcf\x8f\x59\x23\xf9\xfc\x58\x61\xd0"
- "\x39\x65\x05\xd7\x15\x32\xf0\x95\xda\x09\xaf\x9d\x8e\xab\xef\x77"
- "\xae\xec\xab\xaa\xa3\xef\x5d\xa0\xc7\x4e\xcb\xf2\x8c\xc2\x97\x58"
- "\x6f\xa0\x1e\xa9\x03\x1e\x9f\x21\xf1\x44\x9a\x35\x7e\x32\x8a\x9d"
- "\xeb\xfa\x38\xae\xdd\x29\x7c\xf2\x6e\x4c\xa7\x38\xcd\xfe\x7e\x20"
- "\x0b\x37\x9d\xa3\xc7\x3e\x89\xc8\x8f\x5e\xcf\xa5\x60\xa4\xab\xf9"
- "\xfd\xc7\x2d\xfa\x3c\xfc\x78\xf3\xfb\x48\x93\xaf\xef\xfb\x55\x6b"
- "\x61\x8f\xe7\x8c\xdb\x2f\x03\x27\x3e\x3b\xce\x38\x5d\x5f\x0f\x3c"
- "\xde\xa2\xcb\xaf\x5a\x9b\x7b\xbc\x33\x74\xb6\xe5\xf1\xa3\x88\x5b"
- "\x75\x9d\xf9\xdc\xb0\x76\xf0\xb8\x3b\x1c\x8e\xf2\x9d\xf7\xb8\x57"
- "\x3f\x9f\x32\xec\x2c\xa1\x2f\x80\xa5\xe1\x53\x92\x11\x89\x4f\x49"
- "\x0e\x6c\xcb\x55\x1a\x8c\xfc\x2f\x80\x91\xea\x3a\x34\x9f\x66\x07"
- "\xc9\x74\x81\x9e\xdc\xdf\xcc\x7b\x74\x5a\x07\x28\xc1\x4f\x66\x35"
- "\xb6\x2b\x79\x9d\xcf\x86\xf0\xd8\xd0\xe5\xbf\xbf\x9b\xd7\xe0\xe4"
- "\x1e\x82\xb4\xfb\xbb\x4f\xd9\x02\x9a\x6f\xb3\x92\x77\x99\xa6\xa7"
- "\xac\x9f\x76\xb7\x1e\x10\x03\x07\xa5\x4f\xab\x92\x88\xf1\xdf\x1e"
- "\xde\xff\xc3\xfb\x30\xea\xe8\xfe\xf3\xf4\xc4\x03\xaa\xad\x3f\x19"
- "\x65\x93\x96\x8c\x33\xfe\x2b\xe1\xf1\xdf\xfd\xb1\xdb\xf9\x13\xd7"
- "\x19\xff\x3d\xc1\xe3\xbf\xfb\xc3\xfb\x4d\xb5\xce\xf3\x44\x7e\xb8"
- "\x4d\xca\x7e\xa7\x2c\xcf\xb2\x9d\xf9\xc4\x7f\xbc\xab\x99\x92\xfc"
- "\xbc\xa6\x8d\xb6\xe9\x1a\xe8\xe1\xf6\x9a\x74\xca\xd3\xc5\x7e\x18"
- "\xe2\xf9\x4e\x6f\xd5\x97\x71\x7b\x7d\x42\xce\x17\x26\xfa\x55\x5b"
- "\xb4\xdb\x84\x67\x66\x3f\x64\x68\xa3\x55\x87\x55\xb3\xc3\xaa\xce"
- "\x7d\x4c\xe9\xa7\x89\xae\x01\xd9\x2f\x1a\xd8\x5e\x95\x76\xab\xff"
- "\x32\x31\xdc\xe3\xb5\xa7\x88\xe1\x06\x47\xfb\x49\x09\xbb\x9f\xdb"
- "\x38\xc3\x64\xd8\xbd\x48\xc7\x70\x39\x9d\x5e\x0f\x75\x36\xe6\xc9"
- "\x84\xf0\xba\xcb\xf9\x17\x94\x8d\xf0\x25\x3c\xaf\xe2\xe2\x7c\xf6"
- "\x95\x62\x76\x3f\xaf\x99\x7d\xda\x2d\xec\xeb\xc4\xec\x4d\x3c\x27"
- "\xf6\xa4\xbc\xa7\xf7\xbd\x7f\x75\xc7\xd5\x4c\xa7\x78\x2d\x6c\x45"
- "\x8f\xc5\x07\x79\x7b\xb2\x25\x52\x47\x3c\x19\x65\xff\x96\xc8\x71"
- "\x26\xde\x95\xbc\x3f\x51\xdb\xbf\xca\xfa\x40\xb8\xfc\xc3\x52\x3e"
- "\xae\xb7\xa7\x82\xd7\xa4\x79\x4f\x94\xf2\xab\xf6\xa4\x3b\x6a\xee"
- "\xcd\xb3\x57\xee\xab\xf9\x23\xca\x5d\xb9\x5e\xc9\xc8\xaa\xf5\x91"
- "\x3c\x5d\x49\xf6\x8b\xbc\x16\xa4\xfa\x83\xd5\xfe\x68\xfd\xb8\xd2"
- "\xa2\xdb\x6e\x51\xe1\x39\x7a\x7f\x60\xd9\x20\xe1\x46\xf5\x33\x2b"
- "\xa5\xfd\x1f\x18\xd3\x2f\xac\xac\x42\xfd\x22\x64\xb2\x57\xca\xd0"
- "\xca\x86\x53\x5e\xc8\xcd\x26\x96\xff\x55\xbc\xf7\xa5\x9e\xcf\x1c"
- "\xe2\x7b\xe2\x25\x5a\xd9\x15\x70\x52\xfc\x29\x8f\x3c\x53\x95\x04"
- "\x19\x91\x72\xcb\xfd\xc6\x1c\xb5\x1f\xc9\x1b\x55\xc6\x19\x9d\xe6"
- "\x9c\xa6\x77\xd3\x1f\xb5\xfd\x14\x2c\x0b\x2b\x3b\x79\x6f\xc6\x94"
- "\x41\x9a\xc8\xb0\x74\x19\x72\xf9\xfb\xa8\xd7\x1f\x3d\xe6\x59\x35"
- "\x2d\x76\xdd\x57\x71\xff\xdf\xe4\xa6\x55\x7b\x22\x79\xbb\x4a\xf6"
- "\xff\xfa\xba\x8e\x1b\x34\x88\xca\x57\x19\xc9\xfb\x95\xb2\xbc\x71"
- "\xf7\xf8\x34\x2e\x5a\x80\xf1\xcc\x1a\xaf\xdc\xef\xb5\x0a\xed\xff"
- "\xc9\x63\xd7\xd3\x83\x22\x69\xd1\x82\x20\xd2\x6a\xfb\x82\xa1\xb7"
- "\x56\x79\x22\xe6\x8c\xa6\xca\x39\xa3\x35\xe7\xe9\x29\x6d\xed\x67"
- "\xf5\xdd\x91\xf8\x3d\x95\x30\xbe\x6d\xf0\x14\xaf\xff\xac\x89\xad"
- "\x33\x9e\xca\x8f\x6d\x1b\x3c\xb5\x4a\xd3\x0b\x6b\x44\x72\xb4\x1c"
- "\x3c\x65\x03\x8f\x65\x1e\x7d\x0c\xcb\x73\xa1\xe3\x8f\x61\x9f\xea"
- "\x1c\x1d\xc3\x6e\x62\x7d\xf0\x54\xe3\xe8\x18\xd6\x13\x6b\x0c\xeb"
- "\x8e\xc1\xcf\xa7\x06\x63\xf3\x73\xb5\x39\xf6\x18\x76\xf5\x34\xd5"
- "\xcf\xaf\x2e\x8e\xe4\xf3\xea\xec\xd0\x9a\xf0\x53\x09\x5f\x9f\x3d"
- "\xbc\xba\x63\xac\x3d\xbc\xe6\xbb\x8a\x57\x6b\x9e\x8a\xc2\xad\x2b"
- "\xb6\x6e\x5f\x7d\x7a\x7c\x7b\x78\xf5\xe0\xf8\xba\x7d\x4d\xfc\x58"
- "\x7b\xd8\x32\x21\x2a\xcd\xcc\x51\x5b\x29\xc2\x36\x5b\x93\xaf\xe8"
- "\xb4\x86\xed\x39\x53\x58\xfa\x55\x91\xf2\x0e\x9c\x01\x0f\xba\xed"
- "\x02\xeb\x34\x5d\x66\xc6\xa3\x09\xfb\x5e\xfa\x7e\x33\x4d\x42\x1b"
- "\xf8\x70\xd8\xb9\x66\x54\xfe\x79\x1f\x1f\x97\xc3\x3a\x72\xdc\xfd"
- "\x74\x46\x1d\x3f\x89\x47\xff\xf5\xd6\x4b\x4d\x69\x54\xfc\xca\x18"
- "\x7a\xac\x95\xf6\x1f\xc3\xb8\x3e\xcf\xd6\xae\x88\x6a\x63\x5e\xb5"
- "\x0f\xb7\x74\xba\xe2\x5b\x69\xd4\x58\x76\x6d\x95\x3c\xd3\x37\xae"
- "\xbe\x5d\xdb\x18\x5b\x46\xd7\x76\x8e\xea\xdb\x4d\x0c\x77\xed\xc7"
- "\x51\xf1\x27\x14\x0f\x4a\x2d\xc1\xe4\xf0\xb9\xee\xb5\xee\x48\x9d"
- "\xb4\xf6\x44\x64\xbe\xd2\xa8\xf1\xdf\xda\x2a\x8e\xff\x72\xfd\x4d"
- "\x69\xf1\xf8\xfd\x4d\xe9\x47\xaa\xfe\x4f\x47\xad\x2f\x97\x56\x5d"
- "\xbf\xbf\x29\x1d\xa7\xfe\xa5\x9d\x91\xfd\xcd\xd3\x51\x6b\xf4\xa5"
- "\x27\x62\xf7\x37\xa5\x6e\x5d\xcf\x28\xbd\xf1\xf4\xbd\x5f\x4e\xdf"
- "\x3c\x9d\x16\xa9\x6f\x9e\xa6\x2f\xd2\x37\xc7\xc7\xe8\x9b\xa7\x57"
- "\x25\xb6\xc6\xaa\xcb\xd3\x35\xb1\xf5\xcd\xd3\x7b\x14\x0f\x9f\xee"
- "\x8f\xd4\x37\x4f\x1f\x8a\xe4\x61\x69\x14\x0f\x9f\x8e\x5a\xff\x2e"
- "\xad\xfa\x1f\xd5\x49\x26\x93\xc9\x68\x32\x18\x0d\x26\xe2\xcb\xa9"
- "\x0c\x34\xd1\x64\x36\xc5\xe1\x99\xa0\xbd\x27\x1a\x4d\x46\x33\x9e"
- "\x38\xed\x3d\x21\xea\x7b\x22\xe7\xc5\x63\xd6\xde\x71\x51\xdf\x13"
- "\xbe\x20\x7e\xa2\x56\xae\x5e\xbe\x39\xea\x3b\xee\x0b\xe2\x27\xfc"
- "\x3b\xf3\xd3\x98\xef\xc8\x73\x90\x4b\x36\x6c\x29\xad\xac\x28\x93"
- "\xfb\xda\xcb\x2d\xa5\xcf\x3c\x53\x5e\x5d\x6d\xa9\xd9\x68\x59\xf4"
- "\xc0\x23\x73\xe7\x5b\xd4\xf6\xf8\xca\x85\x33\xca\x26\x53\xd1\xd6"
- "\x4d\x1c\x51\xb4\x7c\x49\x89\xa5\x78\xd1\x03\x91\x91\x3a\x18\xb9"
- "\x0d\xfe\x7a\x50\xc2\xda\x5e\xee\x4b\x53\x89\xf6\x1c\x90\x7a\xa7"
- "\x9f\xcf\x9e\xab\xf1\x44\xc5\x03\x27\xf9\xfc\xf2\x35\xbb\xe0\x73"
- "\x15\xe7\xa8\xec\xcf\x5c\x89\x59\x1d\x0e\xaa\x7a\x9a\xfd\xa9\x94"
- "\x1b\xc4\x07\x1e\xb2\x3c\x44\xc6\x73\xb4\xe1\x27\x3d\x05\x48\x8b"
- "\x6f\x97\xdb\x4f\x16\x3b\xdb\xb6\xd6\xcf\x10\x67\x10\xf7\x05\x11"
- "\xe6\xd5\xce\xe7\x5b\x0d\x32\xec\x03\x87\x9e\x2e\xf1\x3c\x95\xbf"
- "\x2d\x3e\x10\xf2\x9b\x7d\xd6\xa8\x74\xe5\xdb\x84\xb1\x2c\x87\xf5"
- "\x42\x6b\x0a\x99\x79\x5f\xf6\xeb\x29\x14\xff\xfa\x54\xf6\x65\x5b"
- "\x5e\xa9\xef\xcb\x7e\x09\xdf\x6e\xda\x50\xcc\x65\x73\xda\xa0\xb1"
- "\xec\x69\x4e\xdf\x16\x99\xbe\x35\xb4\x8f\xbb\xbc\xd2\x88\x74\xcb"
- "\x3e\xa6\xc4\xc4\x80\xf8\xcc\x97\x92\x53\x35\xbb\x00\x76\x1a\x58"
- "\x71\xd2\xef\x20\x75\x36\xaa\xfc\xcf\xdb\x02\xc2\xcf\x3e\x13\x8a"
- "\x06\xed\x62\xdf\x7a\x32\xa3\x3d\x1b\xba\x37\xf1\x59\x8a\xf2\x93"
- "\xed\xe5\x64\x46\xfd\xa7\x5d\xa0\x67\xfd\x96\xa5\xb0\x1b\x8b\xc8"
- "\xfc\x8f\x36\x3e\xef\x9a\xf7\xf3\xbd\xff\x85\xcc\xbf\xbe\xe6\x30"
- "\x5e\x13\x69\x54\x5b\x23\x06\x04\xfb\xb7\xf6\x0a\x1f\xef\xb7\x3d"
- "\xb9\x36\xc0\x69\xb6\x0f\xdb\xd3\xa8\xb7\xc6\x4b\x3b\xce\x0a\x5f"
- "\xc3\x7f\x51\xfe\x2a\x4e\x0d\x7a\xf9\xfc\x6c\xfc\x8e\x22\x32\x9d"
- "\x2f\x21\xe3\x29\x6b\x0b\xb9\x56\x79\xa9\xf6\xac\x18\x38\xb9\xf6"
- "\xcf\xd4\x6b\x3d\x42\x6b\xfa\xc8\x78\xb2\xff\x23\x92\x3e\x9a\x9b"
- "\x7e\xdd\x51\x77\x99\xd2\x76\x54\x70\xd8\x65\xda\xbe\x83\x6e\xdc"
- "\xfe\xcf\x3c\x0e\xea\x43\x39\x17\xe9\xc9\x33\x64\x00\x3c\xe3\x0b"
- "\x1f\x51\xda\x0b\x4f\xf0\x39\xf3\x5c\x6a\xad\xa3\x34\x61\xcf\x48"
- "\xb8\x66\xcf\x48\xba\x26\x32\x52\x86\xed\x19\xa9\xbd\x55\x48\xdf"
- "\xff\x3e\x4d\xe9\xa3\xd4\x0f\x2e\xf4\x19\x5b\x3e\xa7\x69\x5c\xa7"
- "\xf3\xa8\x5b\xeb\xe7\x48\xdf\x54\x5f\x1c\x44\xde\xf0\x3c\xfe\xe4"
- "\x7a\xab\xab\xc4\x47\x41\xc0\x6a\xb9\x46\xd3\x5a\xaf\x51\x5a\x70"
- "\x7f\x7d\x31\xe7\x1b\xa4\xe7\xae\xba\x4e\x12\xd5\xee\x10\x81\x91"
- "\xa6\xdc\x2a\xe8\xc3\x89\xef\x3d\xdd\x65\x76\x9d\x1c\xa4\x53\xde"
- "\x6b\xd4\x4b\x7f\x24\x97\xed\x2f\xdd\xbf\x7e\xba\x2b\x0e\xf6\xa4"
- "\xa1\x7b\x3b\xef\x81\x57\xb2\x63\x3f\xc5\xfe\xf3\x1c\xb4\xaf\x8e"
- "\x12\xaa\xb6\xd3\xc4\x0b\x08\x97\xba\xa7\x71\x9e\xcd\xe5\xff\x4b"
- "\xf7\x76\x79\x1e\x7c\x43\x71\xdd\x29\x32\xf5\x7a\x5b\xf8\xdc\xb1"
- "\x31\x90\xf2\xeb\x0e\x97\xf7\x34\xb9\xaa\xfe\xd4\x1d\x4c\xfa\x75"
- "\xc3\x9e\x20\xc5\xff\xe6\xca\x69\xa3\xcb\x7c\x85\x5c\x25\x5e\xfa"
- "\x10\x65\x8b\xa6\x5f\x1f\x86\xce\xca\xed\xf5\xfa\xd8\xff\x4e\xa6"
- "\x18\x4a\x9b\xbc\x6f\x13\xcd\x6c\xfb\x9c\xd2\x0f\x7e\x4e\x19\x62"
- "\x38\xc3\xc8\x67\xbc\xd9\x5f\xda\x41\xbc\x13\x30\x06\x43\xdd\xe5"
- "\x59\x6f\x91\xac\x9d\xf5\x1e\xc9\xa0\xf6\x6b\xa1\xb3\xde\xd7\x86"
- "\x42\x67\xbd\x21\x53\x55\x7c\xde\xdb\x4d\xcf\x99\x13\x4f\xd2\xc4"
- "\x73\x54\x9e\xc1\xf2\xbd\xef\x12\x99\x77\x5e\x22\x9a\xed\x30\xf2"
- "\x38\xd3\x0c\xd9\xff\xb3\x0b\xbc\xe1\xdf\xe7\xc8\xda\x8a\x77\x02"
- "\x1e\x8c\xe7\xac\xd2\x57\x45\xbf\x26\xc7\x08\x33\x22\x6c\x37\xde"
- "\x26\xbc\x77\xd8\x5b\x85\x47\x34\xe6\xb3\x0f\x9a\xc9\x2c\xcf\xea"
- "\x7c\x79\x7e\xc1\xb0\xd3\x5a\xe3\xa6\xfd\xb5\xba\x5c\x2b\xfd\x5e"
- "\x5e\xf5\xe1\xb9\x8b\xec\x47\xdd\x23\xf1\x1a\xb1\x1a\xd8\xa7\xba"
- "\x16\xce\x38\x7c\xc4\xe5\xa2\xfc\x6e\xbc\x13\xd5\x18\xd4\xba\x42"
- "\xcf\x3b\x34\x62\xe5\x32\xff\x19\xe1\x42\x0f\x47\xbd\xcd\x1c\xf7"
- "\x37\xe7\x2e\x1a\x55\x9a\x0c\x23\x60\xfa\x34\xf8\x68\xfb\xe5\xa9"
- "\xdc\xc6\x87\x8c\x89\xe2\xf8\xda\x6c\x6a\x3d\x20\x4e\x1e\x3c\x20"
- "\x7a\x54\xdb\xab\x48\x73\x53\x53\x37\xe3\x88\x3e\xbc\x67\x0f\xe2"
- "\x8e\x5b\x88\x98\x2e\x3d\x65\xbc\xbf\xb4\x22\xc7\x4d\x37\xa4\x87"
- "\xd7\x41\x38\x9f\x49\xe3\x7e\xf4\xaf\xeb\x4e\xc4\x41\x07\xa4\xf5"
- "\xf6\x0f\xd2\xaf\xaf\x0d\xc4\xd9\xff\x40\x46\x97\xff\x1c\xcd\x49"
- "\xa5\x34\x9e\x93\x69\x3f\x20\xdc\x78\x0f\xe0\x19\x84\xbc\x7c\xf7"
- "\x02\x55\xec\xbe\x2b\x95\x52\xff\xc9\x46\x9a\x7e\xaa\x38\x18\xa6"
- "\x9f\x66\x9c\x72\x77\x85\xe9\xa6\xf5\xff\x3c\x56\x37\x55\xfe\x67"
- "\xa5\x9b\xd0\xf6\xa5\x2e\x0a\xb8\xb5\xf0\xf7\xa3\xc2\xb5\xf3\x2b"
- "\x95\x6f\x46\x85\xfb\xb4\xf0\x97\xa3\xc2\x3d\x2a\x7c\xdd\x29\x5d"
- "\xf7\xf5\x32\x1e\x5b\x59\xf7\xad\xfb\x2d\xeb\xbe\xde\xb5\x9a\xee"
- "\x93\xfa\x67\xdd\xab\xe2\xaf\xa0\x8b\xb6\xb0\xbe\x59\xb7\x9e\xf1"
- "\x17\x1f\x90\x8e\xfb\x24\x84\xcd\xe2\xb0\xc6\x3f\x92\x19\x8f\xae"
- "\xf7\xec\xac\xf7\x58\xe7\xb1\xee\x7b\x63\xaa\xe8\x7b\xe3\x80\x38"
- "\xd3\x2a\xfd\x42\xff\x74\x54\xff\xfd\x02\x61\x7b\x10\xf6\x0b\xc4"
- "\xb3\x1e\x64\x9a\x9c\x2a\xe9\xe2\xb9\x81\x7e\xc8\x73\x43\xd0\x98"
- "\x49\x7b\xc1\x6f\xf6\x7f\xb5\x0b\xf4\x4d\x34\x50\x95\xab\xc6\x2b"
- "\xcf\xa1\xb0\x0f\xf2\xde\x9a\x7e\x6e\x77\x53\x77\x06\x79\x9e\xe2"
- "\xcf\x54\xe7\x15\x17\xf8\xac\x0a\xe3\xb0\x66\xdb\x43\xec\x4b\xdb"
- "\xd0\x63\x25\x62\xbf\x04\xac\xb3\x81\x8b\xb9\x11\x38\x29\xff\xbf"
- "\xeb\xd2\x61\xc9\x14\x28\x5e\x6f\x28\x66\x7f\xfd\xe7\xe8\xa7\x56"
- "\xe1\x84\x7e\x44\xdd\x12\x03\x0e\x62\xdf\x2c\x68\x63\xec\x4f\xcb"
- "\xfa\x86\x31\x68\x6d\xd4\xfd\xb3\xf0\xdd\x0d\x48\xe3\xea\xf3\x11"
- "\xe3\xec\xa6\x9f\x1e\x3d\x55\xdb\xc5\xf9\x4b\x98\x36\xc2\x69\xd7"
- "\x61\x18\x24\x0c\xa3\x9c\xbb\xb5\xba\x69\x5d\x81\xb2\x6f\x72\xab"
- "\x4e\xad\xf2\x10\xeb\x7d\xd7\x00\x60\xd4\x9e\x53\x30\x00\x4b\xa0"
- "\x0f\x88\x88\xd3\xe0\xdf\xb8\x43\x7c\x06\xf8\xe9\xcc\x2f\xf6\xd3"
- "\xc5\xfb\x94\x40\x97\x04\xf6\xd5\xa0\xec\xd0\x9f\xfe\xa6\xfd\x8f"
- "\x44\x9a\xaf\x31\xc8\xdb\x4f\x0f\xb3\x2f\x2f\xf6\x2f\x76\x3d\xdf"
- "\x62\xa0\x51\xba\xee\x5f\x2c\xb8\xf5\xeb\xf5\x2d\x06\xd8\x69\x6d"
- "\x46\x71\x04\xf8\x1f\x66\xff\x62\xc0\x3f\x81\xe5\x50\xab\xd3\x91"
- "\x57\x9f\x64\x9a\x57\x78\x39\x6c\x9f\x53\x9c\xd0\xf9\xcf\xf5\xe5"
- "\xba\x20\xae\x4f\xd9\x87\xe2\xb4\x9b\x2a\x8f\x70\x3c\xc2\x7a\x38"
- "\xfd\x1c\xe8\x31\x17\xfa\xb0\xf7\xce\x05\x8c\xfb\xb6\x93\x59\xe9"
- "\xb4\xf5\x7f\xe0\xfc\x4a\xa7\xad\x77\x84\x74\xda\xfa\xcd\x4a\xa7"
- "\x29\x1a\x2b\x9d\xb6\xbe\x42\xe9\xb4\xf5\xa5\x72\x3f\x11\x74\x1a"
- "\xc7\xb1\x5e\xd3\x75\xda\xc1\xa9\xe2\x04\xeb\x8e\x61\xe7\xfa\x62"
- "\x5d\xb7\xbd\x8c\x30\xd6\x1d\x8c\xa3\xd2\x53\xeb\x3a\xc5\x7f\xcb"
- "\x20\xb5\x5f\x93\x7f\x5b\xd9\x7f\xc6\x80\xf6\x1b\x7c\x59\xff\x3b"
- "\xa5\xe3\xd6\x1f\x0a\xe9\xb8\xf5\x19\xa1\xbc\xac\xe3\xd6\xff\x47"
- "\xa5\xe3\x54\x78\xfb\x93\xac\xe3\xd6\x75\x32\x0d\x34\xf8\x46\x5e"
- "\x47\xd3\xd2\x83\x8e\x15\x47\xc2\x75\x5c\x64\xfb\x5a\xef\xd7\x75"
- "\x1c\xeb\xb6\x61\xe7\x86\x04\x37\x4d\x96\xfe\x51\xb8\x9d\x35\x83"
- "\xe6\x7a\xbb\x63\x1e\x70\x9d\xd9\x2f\x3f\xd3\x2d\xef\x22\x4d\xd4"
- "\xfc\xd6\x68\xf5\xde\x50\xa0\x9f\xd1\x74\xd3\xfa\xb1\x3e\xcd\x28"
- "\xe4\x97\x0c\xbc\xbe\x95\xfd\x39\xba\x1c\xe7\xc8\xd5\x22\x1c\xbd"
- "\xfe\xb3\x14\xdc\xb9\xee\x63\xe6\x2b\xc6\x1b\x3f\xe2\x37\xeb\x1d"
- "\xf4\xa3\x2f\xad\xf1\xca\xf9\xfb\x8f\xf7\x19\x11\x67\x8b\x88\x7b"
- "\x9b\xcb\xe0\x79\x45\xfc\xae\x1a\x6f\x1e\xe1\x2b\x94\x75\x79\xfc"
- "\xb2\x36\x26\xcb\xb2\x60\x4b\x61\xdc\x93\x7c\x89\x36\xc8\x35\x34"
- "\xe9\x93\x39\x26\xac\x8d\x0f\x68\xf1\xa6\x71\xe2\x4b\xbf\x20\x7f"
- "\xfd\x17\xe4\x7f\x93\x75\x10\x9f\xc7\x0b\x38\x23\xe1\x4c\xf1\xeb"
- "\xe9\x2e\x70\xba\x3f\x68\xeb\x20\x1f\xdb\xa7\xcb\x71\x59\x9a\x0e"
- "\x93\xe5\x6e\x2f\xd2\x49\xff\xb5\xd0\x91\xf9\xdb\x88\x7d\x07\x87"
- "\xe5\xad\x8a\x0b\xd1\x77\x63\xd7\x75\xe6\x69\x12\x5c\x2d\x24\xef"
- "\x7e\x39\x0e\x5b\x94\xcf\xd2\x34\x8f\xae\x3d\x54\xad\x82\xbe\x5c"
- "\x2b\xcf\xad\xa9\x73\xbb\x83\xd0\x6f\xb7\xb2\x8f\x4d\xb6\x2b\xb5"
- "\xb3\x16\xdf\x82\x5e\x4e\x61\x3f\x2c\x3c\x5f\xbd\x26\x50\x6c\x3c"
- "\x2e\x7d\xe2\x57\xb5\xe8\x79\xc7\x9b\xdb\xe3\x72\xb5\x32\xe5\x39"
- "\x24\xe4\x39\xa9\xe7\x61\xd8\x7c\xf6\x06\xfd\xf1\xad\xd2\xbf\x99"
- "\x7f\x90\x75\xe0\xb7\x60\x83\xa6\xa8\x72\xd6\x92\x2a\xe7\x79\xb4"
- "\x9b\x0d\x27\xaf\x77\xce\x69\xfc\xfa\x3d\xbf\xe0\xab\xd7\x8f\xb4"
- "\xfa\x3d\x6f\xfb\x82\xfa\x5d\xaf\xdc\xa3\x5f\xbd\xdc\x24\xbd\x5c"
- "\xcf\x57\xa7\xeb\xa6\xf4\x2f\x4f\xd7\x4c\x8d\xae\x9b\x4a\xbe\x80"
- "\xae\xb1\xca\xd9\xf3\xe5\xcb\xb1\xe8\xe5\x74\xc7\x2a\x87\xe4\xdf"
- "\xb8\xfe\x7a\xe2\xf5\xbb\x57\xf8\x1e\x22\x75\x27\x42\x75\x7c\xf8"
- "\x1d\x53\xea\x7e\xa2\xea\x69\xfa\x1d\x53\xa1\x73\x5c\xd5\xf7\xae"
- "\xe9\xe0\x7e\x5d\x04\xdd\x54\xbd\x80\xe7\xda\xf2\x77\x28\xff\x80"
- "\x5a\x9e\xe2\x2f\xb8\xdb\x8a\x7d\xe4\x38\xb8\x6c\x21\xa4\x2f\x16"
- "\xaf\xf2\xb3\x57\xbd\x9f\xcf\xe4\xa9\x3d\x3b\xd5\xdd\xaa\xfd\x57"
- "\xb7\xba\x69\x93\xf2\x39\xd5\x94\xbb\x73\xc8\xae\xa5\xbf\x85\xfb"
- "\xa4\xd1\x34\xdd\x7a\x9a\x98\x73\x7e\x4d\x8e\xdc\x43\x75\x99\x11"
- "\xe7\x07\x17\x6f\xda\xb4\x71\xd3\x7c\x4b\xf5\xfa\xa7\x67\x55\xd7"
- "\x94\xd6\x6c\xae\x96\x07\xcd\x27\x13\x02\x2c\x35\x15\xeb\xcb\x37"
- "\x6e\xae\xc9\xd8\x5a\x5a\xa1\x0e\xa6\xdf\x81\x84\xe1\x89\x28\xe2"
- "\x3e\x92\x34\xe8\x90\xd3\xc2\x28\x7d\x48\x0c\x72\x9d\xd8\x97\x88"
- "\x7e\xee\xb6\x27\x8d\xc8\xeb\x64\x9d\x53\x53\xe6\xa6\x92\x62\x9d"
- "\x8e\xec\xdf\x10\x76\x47\xda\x05\xaa\xa9\x67\xde\x2f\x83\x09\xd9"
- "\xae\xfc\x42\xc8\xb3\xfd\xae\x1a\x04\xf4\x52\x7c\xf7\x16\x9e\x47"
- "\xad\xf1\x05\x9d\xd5\x03\xd2\x5f\xe3\xf6\x0b\xf8\xde\xfc\x5d\xbd"
- "\x9f\xe7\x75\x21\xb5\x8e\x7b\xeb\xfd\xe7\xa8\xa6\x88\xcb\xe5\x76"
- "\xd3\xd6\x44\x66\x86\x25\x9c\x35\x7c\x26\x9a\xf0\x1d\x0f\x1c\x06"
- "\x74\x5b\x12\xf8\x26\x88\x64\x47\xa6\x9b\x36\x4f\xfb\x7d\x92\x87"
- "\xb4\xb3\xda\xf1\x6d\xea\x5c\xb6\x79\xd8\xb9\x39\x75\x34\xad\x93"
- "\xfd\x16\x3b\x32\xf9\xde\xb2\x98\xf4\x4d\x29\x5a\x1b\x1c\x29\x89"
- "\x0b\xaf\x33\xc6\xc5\xe0\xcf\xe6\x53\xa8\x7b\x2a\xf3\x5a\xf3\x27"
- "\x32\x01\x61\x7f\xab\x7c\x27\x17\xad\x45\xd8\x04\xbc\x6d\xcc\x53"
- "\xf6\x61\x80\xb8\x06\x5e\xe3\xea\xad\xfd\xb4\xfb\x78\xda\x39\xc8"
- "\xf5\x66\xe8\xbf\xd5\xbb\xd4\xb9\x33\xa4\x47\x19\x2e\xc7\x35\xea"
- "\xb1\x88\x6e\x9e\x63\x03\xee\xfd\x3d\x16\x2f\x09\xd3\xca\x8f\x39"
- "\x1f\xda\x45\x9a\xdd\xc6\xb6\x04\xc2\xe5\xf9\xba\xcd\x7d\x3a\xcd"
- "\x6b\x2c\xe2\x22\xa7\x19\x6f\x5e\x98\xfb\xbb\x7d\xb2\x2f\xf8\x9c"
- "\x78\x0f\x55\x3f\x6d\xf6\x47\xeb\xfb\x19\x65\xf3\x2d\x65\xa5\x35"
- "\x96\xca\x8a\x0d\xe5\x96\xb2\x8a\x32\xcb\x86\x8d\x35\x96\xe7\x36"
- "\xf2\x04\x0d\x4f\xc9\x44\xc8\x44\x90\xeb\xb7\xb5\x24\x4e\x5f\x83"
- "\x1e\xda\x6a\x9d\x80\xfa\x83\x26\x5b\x1f\x1d\x1a\xb6\x4e\x8c\xa4"
- "\xc9\xd6\x7b\x95\x1c\x6f\x69\x00\xee\x33\xd5\xf9\x3d\xd3\x00\xbe"
- "\x51\xff\xcd\x9e\xc8\xb6\xb7\x75\xb7\x96\xf6\xa8\x9e\x56\xca\xc5"
- "\x6d\x17\x46\xe3\xf6\x69\xf2\xd8\xae\xce\x19\x4b\xbf\x35\xed\x72"
- "\x0f\xfe\x96\x81\x71\xf3\xb0\xaf\xae\xed\xf4\xcc\x25\xda\xf2\x9f"
- "\x85\x73\xcb\x34\x4d\x86\xe2\x83\x8d\x45\x55\x9a\xfc\x40\x26\xb6"
- "\x66\x8c\x95\x9f\xad\xbb\x58\x7e\xc4\x70\x49\xbc\xdc\xaf\xe1\xf7"
- "\x41\x4f\xe1\x1b\xfd\xab\x9b\xb6\xec\xe1\x7a\x78\xb7\x96\xc4\xdb"
- "\x5f\x97\xfe\xf3\x3e\xe1\xb5\x4f\xbe\xf3\x05\xb2\x32\x09\xb2\x01"
- "\x1e\x6d\xad\xd5\x79\xa4\xa7\x8f\xdd\x86\xa5\xbc\x44\xca\x98\xa2"
- "\xe7\x3f\x4b\x19\x43\xff\x0e\x9c\x8c\xba\x9f\x3e\xee\x03\x80\xdb"
- "\x60\xcd\x0e\x21\x50\x86\x3b\x4c\x0e\x2e\xc5\x92\x03\xf0\xf6\x99"
- "\xca\x8d\xcf\xac\x43\x43\xdf\x54\x5e\xf3\x8c\x95\x7d\x53\xb0\x1e"
- "\x90\x8e\x2f\x66\x94\x59\x36\x57\x97\x3f\x33\x99\x62\xa5\x1a\x8d"
- "\x0c\xe7\x7f\x52\x10\xf2\x3a\x34\x54\x12\xc7\x67\x24\xd4\x99\x88"
- "\x6d\x6f\x0f\x55\x63\x2c\x11\xc1\xf7\x6d\xaf\xbb\xd2\x32\x61\x93"
- "\x65\x92\xb4\xa1\x41\x33\xb5\xce\xbf\xed\x23\xa6\xc3\x90\xd1\x80"
- "\xfe\xc0\xd6\xaa\xcb\x00\x7e\x77\xa2\x4e\x8d\xa1\x3d\x16\xdb\xce"
- "\x0e\x19\xe3\xce\xb2\xfe\x51\xfb\x39\x2e\x40\x0f\x24\xb6\x9f\xa3"
- "\x6d\x72\x4e\xba\x4d\xf6\x27\xb6\xb3\x7a\x9e\xbd\xa3\xe7\x94\xb7"
- "\xe5\xeb\x72\x12\xca\x63\x3b\xc5\x61\xd2\x57\x91\x73\xab\x8f\x79"
- "\x2e\x14\xef\xcd\x7a\x3a\xd0\x55\xb4\x4b\x3d\xb2\x2d\x33\x5a\x37"
- "\xfc\x3e\x89\xd7\xb4\x15\x3e\x52\xfe\x92\x8a\x0a\xa4\xdf\x13\xd8"
- "\x6a\xc0\x67\xa1\xb6\xbf\xe4\xb4\xec\xd3\x6d\x80\xe5\x53\xb0\x84"
- "\xd3\xf6\x3d\xbd\x2c\x91\x5c\x54\xd0\x2e\xe5\x6c\x5b\x63\x68\xce"
- "\x6f\xdb\x02\x1e\xeb\x8a\xa1\x92\x09\x6e\xb2\xd5\x4a\xd9\xc2\xef"
- "\x9a\x6f\x2b\x1f\x6c\x2c\x6f\x5c\x4f\x96\xab\x90\x4c\x6d\x3b\xad"
- "\xf3\x9b\xeb\x8c\x7c\xbb\x2c\xd2\x4f\xef\xb6\x01\x9d\x96\xe3\xf9"
- "\x8a\x91\xed\x36\x09\xb8\x0c\xab\xb6\x2b\xc7\x69\xca\x3f\x10\x9f"
- "\x53\x31\x01\xc7\xaa\xf3\xb4\xfd\x2a\xef\xbd\x4f\xf4\xf1\xb8\xa7"
- "\x48\xde\x93\xa6\xce\x92\x6f\x87\xfd\xbf\x65\x41\xe8\x6c\xf9\x76"
- "\xf4\xff\xb6\x05\x8a\x77\xdb\xcb\xc2\xda\x9e\x47\x5b\xcf\x9f\xc8"
- "\x34\x62\x7d\xe6\xb2\x2d\x96\xed\x55\x9d\xdb\xdd\xde\xa8\xe7\x93"
- "\x7e\x02\xfc\xaa\x4f\xbc\x44\xdb\x8f\x70\x1f\xc1\xf8\xb9\x69\x3b"
- "\xef\xb7\x96\xfb\x9e\xb8\xcf\x95\x72\x93\xc6\x77\x98\x6c\x3f\x19"
- "\x85\xc3\x59\x1d\x96\x06\x7b\x50\xff\x66\xbf\x61\x6e\xaa\xb5\xf5"
- "\x4c\x43\x9b\xf2\xca\x3a\xdc\xd0\x53\x83\xb6\xe5\xe5\x74\x2f\xa4"
- "\xea\x34\x44\xb8\x03\xdf\xb0\x7f\x6a\x32\xd4\x9a\x8e\x23\x53\xe9"
- "\xa2\xda\x1a\xf6\x49\x65\xb7\xb0\x5f\xc1\x05\x4a\xdf\x48\x5f\x38"
- "\x32\x2e\x4b\x6b\xb3\x93\xf8\x8c\x8f\xdc\xd7\xe2\xf5\x4b\xdd\xa0"
- "\x7c\x27\x20\x1e\x6d\x64\x98\xef\x66\x19\xb1\x4e\x52\xb8\xbd\xd0"
- "\x30\x5a\x06\x64\xa2\x47\xae\x21\xbe\x60\x53\xbe\x48\x26\x62\xac"
- "\xf6\x42\xa7\xce\xbf\x5d\x07\x10\x06\x98\xc8\x17\xdf\x23\x7d\x7d"
- "\xbd\xd0\xa3\xe3\xab\xc5\x19\xa5\x3c\x48\x1a\xbc\x30\xda\xfe\x87"
- "\x52\x64\x5a\x8f\x5e\x8e\x4c\x8b\x74\x9c\x9e\xef\xec\x1c\x76\xd6"
- "\x26\x8c\xc2\x51\x3e\x50\xe2\xb9\x9c\x9e\x0e\x19\x97\x11\xd2\x55"
- "\xdb\xe5\x9a\xa9\xdc\x77\x86\x7a\x78\x5e\xb0\x4e\x92\x3c\xb0\x10"
- "\xdf\xef\x61\x66\x78\x4a\x16\x6b\x57\xe9\x79\x4c\x06\xa6\x63\x6d"
- "\xa5\x5e\xb6\x0e\x83\xf1\xbf\xae\xce\x53\x75\x31\x73\x1b\xe1\xb4"
- "\x0c\x57\xca\xc4\x76\xb6\x99\x6a\x2f\x4b\x19\x94\xf5\xac\x3d\x11"
- "\xce\x6b\x65\x8b\xd5\x9e\x0d\x93\x07\xc6\x67\x94\xff\x6e\xda\x31"
- "\x4d\xf5\x25\x3b\x28\x0c\xc7\x5c\x7c\x27\x85\xf8\x20\x79\xc4\xf7"
- "\x2c\xc5\xbc\x07\x51\xb6\x15\xa4\x09\x0a\x89\x27\xf3\x03\x63\xa9"
- "\x1c\xea\x81\xde\xe3\xb6\x02\x9a\x00\xc7\x1d\xaf\xb2\x5c\x01\xae"
- "\x35\x52\x36\x77\xd8\xc2\xf0\x35\xb0\x5e\x47\xd8\x1e\x3d\x0d\xf0"
- "\x93\x63\x2e\x9d\x9e\x88\xeb\x1c\xe5\xe3\x5c\x99\xb6\x4b\xc7\xf3"
- "\x0b\xfa\x0c\x8d\x56\x3b\x3e\xd3\xca\xf0\xe8\x65\xe0\x37\xca\xa9"
- "\x1d\x63\xab\x3e\xbd\xad\xa6\x5c\x39\x27\xe2\x4e\xbe\xf4\x99\x75"
- "\xe5\x65\x33\x2d\xa5\xcf\xb2\x1b\xa3\xea\xca\xf2\xf2\x2a\xb9\x08"
- "\x13\x69\x07\xa6\xca\xf2\x40\x07\x65\xcb\xda\xb7\xbd\xa2\xf6\x9f"
- "\x70\xbb\xe0\xf6\xee\xe1\xf6\x7e\xbc\xf6\x73\x39\x36\x71\x39\xe6"
- "\x92\xcb\x27\x1c\x6c\xbf\x4b\xdd\xc7\xf5\x4f\xf3\xaa\x7e\x00\xfc"
- "\xe4\x3e\x72\xd8\x59\xd7\x12\x49\xaf\xba\xce\xc8\xb6\x5c\xd7\x15"
- "\x5b\x4f\xd4\x3d\x21\xf5\x44\xa3\x92\x0b\xd6\x4f\xbc\x77\x9f\xe1"
- "\x22\xcf\x60\x14\x4c\x7f\x48\x47\xd9\xe3\x75\x1d\xa5\xfa\x09\xfb"
- "\x4c\xf4\x41\x8d\xaa\x2c\x7b\x7a\x48\x6e\xec\x87\x94\xdc\xd8\x73"
- "\xdc\xd4\xd4\xac\x8f\x55\x54\xdf\x51\x17\xcf\xf6\x23\xeb\x74\xc4"
- "\x97\xe8\xf0\x9a\x53\xb8\xdf\xb0\x5b\xc7\xda\x0f\xf6\x54\xb6\x1f"
- "\x78\x5f\x21\xd3\x02\xb8\xc6\xab\x76\x63\x6f\x0e\xd3\x3f\x49\xf8"
- "\x3e\x14\x8b\xd7\x4f\x73\x77\x3c\x8b\x97\xcb\x66\x3d\xb3\xa1\x66"
- "\x21\xbb\x98\x2a\xb7\x55\x95\x3f\x53\x53\x5e\x16\xbd\x4e\x96\xa1"
- "\xdb\x62\xbc\x46\xdd\x8c\x76\xef\x49\x66\x7a\xd8\x51\x1f\x67\xba"
- "\x5e\x07\xa9\xa7\x60\x3b\x6a\x3a\x2e\xe1\x3c\xd5\x7f\xd6\x2e\xf7"
- "\xd9\x39\xd2\x75\x39\xe1\x74\x79\x36\x11\x44\x18\xea\x5f\xa7\xef"
- "\x07\xc4\x98\xd4\x51\xa0\x7f\x87\xf2\x3b\x94\x9f\xa4\x03\x72\x4f"
- "\x1e\x68\x5a\x9f\x10\x66\x6f\xe1\xdb\xd1\xaf\x7d\x4b\x3f\x4a\xec"
- "\xf3\x6b\x90\x1c\x6f\x2a\xfa\x3a\xc0\xff\x1d\x9a\xae\xa8\xf7\x28"
- "\x38\x44\x6f\xd5\x79\xe2\xda\xe5\xfc\xbc\xa3\x4b\x2f\x0f\xf9\xcf"
- "\x86\x97\xc9\xfd\x56\x34\x3c\x37\x39\xe4\x3a\xf2\x4e\xe9\x03\xce"
- "\xe1\x8d\x81\xab\x2d\x3c\xdd\xb0\xb3\x3e\x0d\xe5\xf7\xe8\x75\x5e"
- "\x6e\x93\x61\x33\xaf\x53\xc7\x41\xad\x8e\x9d\x2c\x5b\x5c\x3e\xcb"
- "\xbf\x86\xc3\x1e\xcd\xaf\x88\x9b\xef\x37\x64\xfc\xa5\x7f\xb3\x34"
- "\x6e\xd7\xf5\x0e\xf4\xf3\xba\xbf\x97\xb3\x5c\xc7\xa3\x75\x1e\xb3"
- "\xee\x57\x4a\xe5\xaf\x2f\x8f\xc2\xed\x68\x58\x9e\x81\xee\xdb\x78"
- "\xee\xbd\xbe\x48\x38\xed\x47\x58\x0e\xd9\xdf\x54\xf3\xa8\x1c\xd6"
- "\xbb\xc7\xca\x5d\x7d\x21\xcb\x5d\xb8\x2c\x55\xcc\x7d\x06\x92\x54"
- "\x5d\x5e\x33\x5f\x5a\xf7\x30\xec\xd8\x6d\x59\x69\x4d\xc5\xc6\x0d"
- "\xd5\x33\x2d\xd5\x65\xa5\x5a\xa3\x8f\x68\xf3\x4e\x39\x76\xf7\xea"
- "\xed\x6c\xd8\xe9\x2c\x0c\xe9\x16\x67\x48\xfe\x79\x8f\x95\xbc\x5b"
- "\xd9\xf9\xa6\x6a\x4f\xce\x9a\xb0\xb6\x2b\xf3\x73\x1b\x6d\x97\x36"
- "\x9b\x33\xbc\xff\xe7\xb1\xf1\xa4\x4b\xe4\x5c\xa8\xd1\xd4\xab\x68"
- "\xec\xfc\x44\xd6\x53\xfa\xd3\xaa\xf7\x73\x3d\xa5\xff\x16\x69\x9f"
- "\x39\x4f\xeb\xf5\x0d\x8d\x1b\x9c\x03\xd2\x8e\xd2\xec\xb5\xeb\x8d"
- "\xcb\x43\xf6\xe9\xce\x5d\xda\xdc\x59\x9f\x3e\xc6\xd3\xed\x6b\xe0"
- "\x52\xa6\x6c\xd5\x9d\x0b\x97\xd5\x8a\x91\x35\x36\xf6\x33\xc7\x3c"
- "\xd8\x59\xa1\xdb\x96\x72\xff\xdd\xfe\xa2\xe2\x61\xe7\xce\xb5\xe1"
- "\x7a\x42\x98\xd6\xf5\x69\x36\x62\xb1\x1a\xbb\xde\xf0\xf7\xe7\x50"
- "\x16\xaf\x1d\x5c\x07\x37\xd4\x6b\x27\xf4\x5f\x73\x19\xc3\x61\xfb"
- "\x5a\x0c\xa5\x69\xf7\x3b\xee\x92\x6b\x8d\x6d\x80\xed\x01\x6f\x91"
- "\x0e\xf6\x9f\x53\xca\x46\x10\x32\xca\x7b\x6f\xbc\xba\x8d\x44\x3b"
- "\x03\xdc\x17\xe1\x37\xe4\x76\x97\x76\x26\x7d\x57\xb1\xa7\x3a\x83"
- "\x86\x86\xd2\x8c\x43\xd5\x25\x66\x9e\x2f\x60\x5a\xb8\x5a\x7d\xa4"
- "\xe4\x67\x97\x05\x7a\xea\x74\x38\x3c\x0d\x16\xd3\xd4\xcc\x78\x88"
- "\xea\x34\x23\xcb\xb7\xbc\x0f\x70\x28\x03\xfd\xe9\xce\x01\x51\x9d"
- "\x61\x1c\xc7\x77\xd6\xf5\xea\x99\xa0\xdf\x5d\xc9\xfa\x4a\xf9\xe7"
- "\xdf\xfd\x9b\x57\xd4\xdc\x80\x56\xee\xae\xdf\x0a\xe3\x9b\xb2\x5f"
- "\xd9\x2b\xfb\x15\x41\xca\xdf\xf9\xae\xd3\x72\x1f\x6c\xd5\x9b\xf2"
- "\x4e\x54\xed\x7c\xb5\xa7\xa7\xca\x2f\xef\x9a\xb3\xd7\xb0\x9d\xe6"
- "\xe7\x75\x1f\x79\x7e\xf8\x78\x8d\x9f\x96\xfb\x58\x26\x77\x13\xfb"
- "\x7a\xf7\x4a\x7b\x61\x77\x82\xee\xdf\x9d\xef\x69\x84\x1d\x4c\xa8"
- "\x97\x89\xf9\x6e\xb1\xb3\x6f\xfe\xdd\xfd\x3c\xef\xaa\xc6\xe3\x69"
- "\xb4\x17\x36\xbd\xe2\xc1\xee\x47\xf9\x6e\x3c\x35\x56\x38\x07\xbe"
- "\x98\xfe\x82\xb4\xeb\xd5\x1a\xb0\xae\x27\x76\xff\x99\xf7\x96\xbb"
- "\x35\x18\x28\x0b\xfd\xff\xce\x46\x55\x16\xe0\x0d\xeb\xfc\xdc\xfd"
- "\xe8\xd8\xf9\x8d\x10\x3c\xe4\x5f\xa1\xd9\x05\xa4\xe6\xae\x7e\xcf"
- "\xb0\x7a\xf4\xb9\xab\x90\xed\xb3\xbb\x4f\x9f\xbb\x52\xbe\xa3\x77"
- "\xb5\x72\xf9\xe3\xcd\x11\x09\xfb\x13\x2c\xf7\xf1\x6c\xc3\x8d\x6b"
- "\x4f\xa0\x7f\x67\xdc\x75\xbb\x50\xf1\xe7\xc5\xe7\xd9\x3e\xe4\x7b"
- "\x4c\x75\x5b\x52\xd9\x00\x2f\xd6\xaa\xbe\xec\xc5\xb5\x7a\x5f\x86"
- "\xbc\x47\x35\x5d\xa1\xf5\x73\x2f\x8e\x8e\x7f\x63\xef\xab\x7f\xb1"
- "\x55\xa7\x91\x4e\x73\x45\xa3\x17\x2f\x0f\xa5\x2c\x3a\x1c\xa2\xed"
- "\x8b\x97\x25\xad\x47\xe3\x7f\x36\x2b\x8c\xf6\xfc\x3d\x53\xe9\xcd"
- "\x17\xd1\xff\xef\x5a\xa5\xfa\x14\x15\x26\x52\x1c\xf3\xc4\x0b\x25"
- "\xa4\x68\x50\x21\xe7\x66\x3c\xf6\x0c\xe0\xf6\xb3\x34\xb7\xe1\xa6"
- "\x2e\xa5\xcb\x7e\x86\xfe\xef\xc5\x54\x95\xef\xc5\x6e\xc6\x25\x1c"
- "\xdf\x47\x37\xac\xdb\xb0\x71\xeb\x06\x9e\x50\xdb\x5c\x6d\x79\x66"
- "\x63\x59\xf9\xe4\x18\xf3\x21\x69\x7c\xdf\xb3\xb7\x79\xd4\x6f\xd4"
- "\xcf\x33\x79\x1f\xbc\xba\x73\xe0\xe7\x59\x96\xdb\x59\xbe\x7e\xf6"
- "\x2a\xcf\x15\xc8\xbb\x1f\xd8\x47\xaa\x9a\x37\x18\xe0\xfc\x8a\xd6"
- "\x3f\xff\xee\xd0\x56\xab\x66\x63\xbd\xf4\x2f\x4c\x47\x6d\xcc\x21"
- "\xce\x53\x43\xb2\xde\x0f\x31\x7e\xd2\x36\x1f\xc9\x90\x7a\x31\x38"
- "\x62\x35\x4b\x7a\x8d\x64\xa0\xbf\xf9\x99\xc7\x6d\x48\x69\xd6\xea"
- "\xe5\xd7\xe9\xc1\xf5\x87\xad\x1b\x3f\x2c\x2a\x20\xa3\x3f\xcf\xd4"
- "\x60\xb1\xfe\x04\xec\x9f\xf5\xe8\xfb\xb0\xd9\x17\x68\xf7\x16\xf6"
- "\x03\xdc\x10\x08\xee\x67\x7d\xd3\x90\xab\xeb\x25\xee\x8b\x82\x80"
- "\xf3\xde\x15\x4f\x1c\xda\x0d\xef\xbf\x9f\x7a\x8e\x5e\xda\xa3\xee"
- "\x0b\x68\xa8\x8c\xbc\x2f\xe0\xa5\x02\x3c\x7b\xb4\xe7\x70\xd8\xef"
- "\xeb\x3d\x7a\x1e\x5b\x28\xac\xe1\x44\x54\x9a\xc3\xc0\xe9\xcc\xa8"
- "\xbd\xa2\xfc\x91\x6a\xfe\x8b\xf9\xee\x8b\x97\x92\xd9\xe7\x67\x48"
- "\x36\x1a\xee\xd6\x6c\x90\x01\xa6\x1d\xf7\xb7\x48\x23\xcf\xb2\x80"
- "\x26\xf3\x78\x8e\x96\xeb\x24\x86\x2b\x20\x13\x2f\xcd\x0c\xc9\x81"
- "\xa2\x11\xc2\x72\x43\x76\xca\x4b\xa9\x9c\x27\x9c\x0e\x28\xe3\x01"
- "\x35\x36\x7d\xc9\xaa\xf7\xd9\xec\xef\x54\xdd\x1f\xd1\x70\xe6\x68"
- "\xdd\x00\xc6\xfc\x2f\xed\x0a\xc1\x68\x38\xa3\xcd\x45\x98\x85\xf1"
- "\x67\x39\xed\x72\xcc\xf6\xd2\xa1\xd0\x9c\x40\xc3\x19\xd6\xbb\x12"
- "\x46\x8a\x23\xd7\xe5\x95\x77\x2a\x1b\xf4\xbb\xd3\x91\xf6\xb4\x6e"
- "\xa3\xe8\xb0\x7a\xd4\x9c\x93\xf4\x51\x89\x36\xd8\x88\x34\xde\xd1"
- "\xf9\x58\x84\x8d\x8e\x01\x41\xd5\x1e\x69\x7b\xff\x3c\x35\x34\xd6"
- "\xfb\x99\x5c\xbb\x94\xe3\x40\x05\x07\x76\xf2\xcf\xe3\xa3\xc7\x6d"
- "\xb0\x1f\x2c\x15\x1b\x2a\x60\x3e\x3c\x57\xb5\x71\x21\x86\x0e\xcf"
- "\x55\x55\x2c\xe4\x2d\x5b\x45\xf9\x4b\xe4\x1b\x8d\x63\x61\x8c\xf9"
- "\x63\x75\xbf\x6b\x89\xd4\xa9\x3c\xce\xe5\xb9\xd3\x61\x75\xd7\xe9"
- "\x44\xed\x1d\xaf\xbd\x27\xa0\xdf\xb3\xa1\x0d\xfc\x2d\xdf\x5d\x03"
- "\x1c\x4e\x68\xf7\xcb\xea\x7d\x36\x74\xf9\xcf\x7f\xa3\xaf\x77\xc9"
- "\x3d\xec\xec\x87\x70\xc8\x2a\xe7\xe3\x50\xa7\xd1\xf9\x0f\x35\xbf"
- "\xa8\xd6\xcc\x86\x9d\xbf\x20\x3d\x5c\x9f\x8f\x45\x58\xaa\x3e\xf7"
- "\xaa\xd2\xfe\x22\x3d\x94\x37\x62\x6e\x3b\x55\x5f\x4f\x43\x9a\x02"
- "\x9d\x66\x3a\x1c\xbb\x45\x5c\xd2\xec\x24\x93\xb4\xab\x9d\x3f\x5f"
- "\x20\x7d\x7f\xb2\x2d\x2e\xe7\x99\x7f\x51\xab\x97\xc3\x63\x04\xc6"
- "\x5b\x5b\xbb\x91\xed\x9e\x7d\x7c\x2a\x1f\xa1\xbf\x18\xe5\x7f\xe4"
- "\x1a\x47\xec\xf5\x8d\x91\x2d\xa2\xc7\x7f\x45\x74\xed\xfd\x23\xda"
- "\xec\xb3\x44\xfe\x2d\xe2\xc8\xc8\x15\x71\x54\xde\x51\xfd\x34\xd1"
- "\xcb\xff\x4a\x14\x30\xad\xfc\xe4\x1a\xe8\xbe\xf4\x72\xf0\x12\xdf"
- "\x5d\xd7\x8e\x74\x4b\xbd\x9f\x8a\x36\xe4\x59\x5a\x25\x2e\xb5\x21"
- "\x5d\xd1\xc5\x4b\xe2\x20\xd2\x16\x59\x51\xef\x2d\xc2\x1f\x30\xad"
- "\xfb\xc4\xf2\x18\xeb\xa1\x3d\x39\x9e\xfd\x4b\x8e\x0a\xa7\x71\x9f"
- "\xd8\x79\xd7\x9d\xc3\xce\x3d\xf9\xa3\x77\x66\x01\x2e\xd3\x68\x99"
- "\x8d\x7f\xaf\xfb\x04\x75\xfa\x64\x0d\xfa\x50\xf0\xe0\x13\xa4\xc3"
- "\xf8\xbf\x5a\xea\x1b\x8f\xe9\xce\x14\x3c\x19\xb1\xf4\x3e\x70\xed"
- "\x09\x6c\x11\x5d\xfb\x56\x03\xff\x0b\xc0\xff\x8a\x38\x82\x3a\x1c"
- "\xdd\x7b\x9e\x88\xf1\x0f\x30\xcc\x00\x99\xd6\x6c\x33\x24\xb7\x23"
- "\x7e\x8d\x2d\x89\xda\x91\x76\xb5\x97\x92\xdb\x90\x66\xf5\xf3\xc9"
- "\x24\xf1\x1f\x04\xde\xc9\x4b\x8e\x06\x50\x36\xe3\x8f\xf2\x07\x75"
- "\x3c\xf5\xf2\x19\x5f\x5d\x06\xd7\xf0\x7c\x57\xca\xa2\x41\xc6\x5b"
- "\xcd\xe1\xbf\x3c\xc3\x53\x6d\x25\x8f\xe9\xae\x3b\xdd\xf4\x72\x2e"
- "\xb7\x21\xae\x8f\x07\x32\xa5\x9d\x2b\xfb\x44\xa7\x81\x1a\x4f\xbe"
- "\x5c\xa8\xd7\x2f\xbc\x5e\xc5\x1b\x37\xc9\x79\xd4\xd2\x67\x6a\x2a"
- "\xb6\x94\x62\x74\x36\x99\xaa\x38\x48\x8e\xdf\xca\xcb\x2c\x1b\x37"
- "\x58\x9e\x2d\xad\xa8\xdc\xb8\xa5\x7c\xd3\x4c\x39\xe4\xae\x2e\xdf"
- "\x50\xc6\xd3\xab\x9b\x4a\x37\x55\x4d\x8e\xb2\xb9\x1b\x97\x1c\xed"
- "\xe5\x7b\x4e\xea\x78\xfe\xba\xb1\x48\x9b\x5b\xf4\x09\x67\xae\x1c"
- "\xbb\xa9\x76\xb0\x17\x63\xfe\x5c\x8e\x7f\x40\xf5\x35\x8d\x85\xa2"
- "\x69\xd1\x45\x21\xe4\x1d\xcc\x86\x4b\xd4\x78\xaf\xac\xe7\x50\x81"
- "\x0e\x47\x9e\xd1\x90\x36\x2b\x87\x8f\x14\x50\x68\xcf\x76\x63\x91"
- "\x30\xa2\x8e\xa0\x81\x66\xb7\x3a\xb4\xb3\x73\xff\xe9\x1c\x35\xce"
- "\x40\xbd\x79\xed\xe0\xb4\xb4\x0b\xe5\x19\x9f\xc6\x9b\x61\xf7\x3a"
- "\x84\x73\x42\x02\xd3\x65\xaf\x1a\x57\x1a\x13\x0d\x7c\xff\xea\x39"
- "\x3e\x6f\x98\xc9\x6b\x84\xed\xce\x60\x66\x68\x8f\xcc\xcb\x25\x6c"
- "\xe3\xca\xb9\x76\xd9\x2e\xf6\x36\xeb\xf2\x6e\xe4\x33\x1c\x3b\x6f"
- "\x99\xaf\x74\xf5\x5e\x79\xa6\x08\x7c\x9b\xaf\xf0\x97\xf7\x41\xa3"
- "\x7f\xda\xf7\x5b\xd4\xef\x92\xb0\x17\x68\x7e\xdb\xf7\xfd\x36\x98"
- "\xf2\xfe\xe9\x40\x75\x9a\x76\x87\x7a\xde\x84\x60\xd3\xa2\x2b\x01"
- "\xf4\xeb\x41\xd8\xaa\xa2\xe9\x83\xe5\x81\xa6\x45\x9e\xe0\xd6\x0c"
- "\x23\xeb\x77\xbb\x0d\xf4\xdb\x68\x9d\x2c\x3e\xb5\xde\x10\xd8\x9a"
- "\x01\x1b\x60\x91\x4f\x08\xe4\x4d\xc9\x8b\x97\x77\xde\x36\x2d\xba"
- "\xa6\x7d\x4f\xe6\xef\x20\x6c\x35\xc0\x4c\xc2\x77\x4a\x50\x84\xa5"
- "\x8f\x4c\x9b\xca\xdf\x89\x06\xb9\x37\x2f\x13\xb6\xf1\x02\xae\xbb"
- "\x5e\x67\x39\x46\xe0\x79\x8a\xd1\xba\xed\x3b\xac\x87\xb3\xed\xaa"
- "\xec\x48\x7a\xe6\x1c\xed\xeb\x56\x3a\x6d\x34\xdd\x6e\x9d\x06\x92"
- "\xb6\x4d\x8b\xf8\x4e\x9f\x42\x79\x2f\xfc\xce\xef\xdc\x29\x8c\x2f"
- "\xaf\xe3\xbe\x63\x59\x40\xae\x65\x91\x5a\xfb\xd8\xd7\xaf\xd3\x93"
- "\xf7\xa2\x73\xff\x01\xbe\x65\xac\xf1\xd0\x64\xd5\x7e\x1b\xcd\x61"
- "\x63\x94\x41\x21\xe5\x7d\x5f\xab\x2c\xd7\x18\xbf\x53\x7d\xef\xd5"
- "\x7c\x99\x37\x66\xea\x69\x11\x96\xa3\x6c\xd2\xbd\x66\x1e\xbb\xf1"
- "\xda\x16\xff\x6e\x1b\xe7\x9c\x64\x5d\xab\x10\xac\x0b\x59\x37\x5b"
- "\x6e\x21\xea\xf5\xb2\xdd\xde\xb8\xe7\x78\xab\x97\x24\xff\x52\x16"
- "\x5d\x1c\x12\x56\x82\xbd\x12\xd3\x4e\xe5\x3c\x48\x7f\x42\xda\xe0"
- "\x90\xe7\x20\xe4\x19\x79\x2e\xb1\xbc\xd6\x5d\x66\x3c\xf6\xc7\xf7"
- "\xd4\x0e\xb0\x1f\x77\xc8\xe1\xfe\x78\xa6\x0d\xf7\x0d\x7b\x9d\xf2"
- "\x8c\x9c\xd4\xc1\xdd\x5b\xb2\x19\xc6\xe5\x29\x3e\x32\xf7\x42\x83"
- "\x82\xde\xbe\xaa\x3a\x4a\xbe\x80\xf4\xe6\x1a\x8a\xe7\xf1\xd1\x97"
- "\x5d\x47\x46\x79\xf9\x8a\x26\xfb\xf3\x75\x1b\x08\xbf\x8b\x23\xcf"
- "\x82\xee\x1f\x73\x16\xf4\xe9\x8d\x1b\x6b\xd6\x6c\x2a\xe7\x57\xc6"
- "\x8c\xcd\x77\x44\xf7\x89\x09\xea\xde\x9c\xfd\x56\xe6\x1f\xf7\x13"
- "\xea\x4c\xc5\xfe\xce\xb0\x71\x2d\xcf\xad\xdd\xcf\xfd\x1b\xaf\x89"
- "\x23\xae\xe7\x77\xb5\x3b\xa4\x5d\xf5\x71\x3c\x19\xa3\xcb\x7b\xb6"
- "\xb4\xa6\xb4\x72\xbe\x5a\xbe\x8d\x51\x4e\x5f\x64\x39\x4d\x49\xa3"
- "\xe5\xa8\x31\x88\x57\xb6\xc1\xfd\x1f\xe4\x8a\xe4\x77\xdc\x4a\xcf"
- "\x35\x65\xeb\x7b\x9c\x62\xfb\x9e\xc8\x2b\x0b\x34\xd5\x37\x32\xbf"
- "\xec\x3b\xc8\xf8\x37\xdb\xfb\x8c\x6c\x7f\xd5\xe1\x37\xef\x39\x91"
- "\xf3\x7c\xda\x9d\x76\x1f\x7c\xde\x07\x3d\xdb\xd4\x20\xf6\xe7\x95"
- "\x41\xae\x1c\xe3\xed\x33\x09\x3f\xb7\xab\xd6\x28\x9b\x3a\xc6\x4b"
- "\x2b\x1a\x8b\x1a\x54\x5b\x69\xba\x2c\xd7\xca\x6e\xa1\x9f\x9d\xa3"
- "\xa6\xcf\xcc\x69\x18\xc7\xdd\x42\xbf\xc2\x6f\x39\x5e\xe0\xb8\x08"
- "\x5e\x7f\x77\xb0\xc3\x0c\xe9\x84\x94\x1a\x84\xfa\x83\x11\xa6\xfe"
- "\x4c\x78\x8c\xc2\x20\x77\xbf\x9b\x40\xe1\x89\x13\xcc\x94\x38\x25"
- "\x21\xfe\xd6\xef\x4d\x4b\xbb\xff\xbe\x05\x39\xf6\xba\x5a\x9b\x08"
- "\xfa\x7d\x89\x22\xfc\xfe\xc5\x77\x1a\x1e\xbd\xc3\xa1\xfa\x8a\xfd"
- "\xef\x34\xc4\xc2\xf5\x65\xa7\xe0\xbd\xc6\x04\x7d\x75\xc4\xbe\x99"
- "\x8c\xef\x5d\x73\x1b\xd9\x96\xe3\xfe\xc7\xe5\xff\x08\x63\x82\x57"
- "\xea\x3f\x44\x18\xea\x6f\x13\x8d\xef\x1f\x51\x67\x1b\x5e\xf9\x5d"
- "\xb0\xe9\xfd\x23\x21\xf8\x66\x62\xf8\x18\x2f\x18\x0f\xd5\x0d\x18"
- "\x5d\xe6\xfb\xc8\x65\xf1\xd2\x87\xf8\x1d\x93\x96\x28\x93\xe7\xa6"
- "\x18\x06\xf4\x70\x83\xfd\x2a\xf4\xb3\x4d\xce\x13\x1b\x2f\xd1\x2b"
- "\x57\x8f\x8c\x93\x4f\xae\xf5\xa4\x2c\x79\x76\xd8\xd9\x0c\xfe\x3f"
- "\xb4\x47\xb3\x87\x60\xaf\x35\xe7\xeb\x3a\x01\xf1\xe5\x6a\xbe\xba"
- "\xb9\x44\x4f\x13\x93\x47\x3f\xe7\x3d\x93\xa2\x9b\xf9\x2a\xae\x0c"
- "\x0c\xb0\x0f\xb7\x71\xe6\x04\xf2\xd1\x3f\xef\xe6\x76\x7c\x63\x7d"
- "\xd2\x84\x29\xf5\x99\xeb\x4f\xa2\xff\xbb\x71\xf0\x66\x9a\xe2\x7d"
- "\x8a\x71\xe6\x7d\xbb\xa7\x0f\xc2\xf6\xe5\x75\xaa\x44\x43\x66\x45"
- "\x62\x7d\x66\x69\xc0\xb9\x60\x1e\xf7\x93\x89\xb6\x25\x86\x44\xff"
- "\x03\x06\xbf\x33\x7b\x5e\xbb\xba\xf3\xc4\xdb\x38\x55\xf4\x21\xcf"
- "\x59\xe4\x71\xe3\xe9\x47\xbe\x93\xe7\xe9\xd5\x6f\xe3\x7d\x22\xd1"
- "\x20\xda\x13\xc1\xc9\x39\x0e\x79\x07\x24\xeb\xe8\x93\x22\x05\x36"
- "\xe6\x88\x9c\x0b\x88\x0b\xcd\x05\xbc\xba\x00\x7c\x9b\x50\xb8\x5b"
- "\x7c\x08\x58\x27\x02\x57\x82\x27\xda\x2e\x11\x69\x73\xde\x67\xd0"
- "\x46\xcf\xcc\x6c\xa6\x34\x6d\xef\xa5\xf1\xa4\xff\x04\xeb\x62\x3e"
- "\xbb\xdc\x83\x32\x8f\xe1\xe9\xb2\x6c\x20\xd3\x25\x7a\xf5\x65\xb6"
- "\x3f\x42\x36\xec\x6b\x71\xda\x78\xa4\x7b\x36\xf2\xef\x58\xcf\x32"
- "\x31\x60\xf4\x03\x3e\x6c\xfe\x13\x2e\xeb\x09\xb9\x17\x86\xf7\x36"
- "\x73\x1a\x94\x91\xe1\xf2\x9d\xa0\xa0\x48\x33\xe2\xbb\x8b\xf7\x29"
- "\x0b\xa4\xed\xb5\xf5\x51\x6f\x95\x0f\x3a\xf6\x24\x6c\xe0\x8c\x74"
- "\xe0\x23\xe1\x21\xfe\xcc\x7b\xe0\xaf\x05\xf6\x1e\xe0\x9d\xe6\xbd"
- "\x35\x7c\x06\x58\x54\x67\xdc\x8e\xfc\x3d\x18\x43\x1b\x19\xfe\x25"
- "\x3a\xf0\xaa\x18\xca\xc8\x98\x33\xa8\xee\x44\x3c\x47\x07\x2a\x81"
- "\xe7\x8b\x21\x3c\x0f\x5c\x06\xfe\x66\xe8\xd5\x6e\xc0\x3c\x26\xb6"
- "\xa0\xcc\x7e\x94\x89\xf1\x08\xe4\x37\x1d\xe3\x5d\x33\xe3\xdc\xcb"
- "\xf8\xda\x02\x24\xb6\x66\x98\xf7\x7d\x4e\x66\xb4\x85\xee\x76\xbc"
- "\x51\xff\xa3\xb0\xc9\xa6\x0d\x3b\x0f\x38\xf4\x73\xe4\x6c\x4b\xe0"
- "\xbb\x51\x97\xa5\x97\x91\x06\x38\x76\x01\xaf\x63\x37\x0e\x12\x8f"
- "\x71\xe2\x20\xa7\x71\x28\x77\x22\x78\xd5\x05\xda\x3d\x0f\x5a\x1f"
- "\xe3\x3a\x05\xaf\x04\x07\x82\x80\xb7\xef\x0a\x70\xaa\x4e\x33\x27"
- "\xf4\xf3\x7d\xd1\xc3\x02\xf4\x3e\xb3\xcc\x36\x2c\x78\xdf\x29\xef"
- "\xe1\x44\x9e\x22\xd4\x15\xfd\xdd\x6b\x33\x79\xbc\x81\x7a\x64\xab"
- "\x3b\x1d\x0f\xe4\x68\x6b\x5a\x67\xd4\x3c\xd3\xab\x2f\x33\xed\xb9"
- "\x5e\x09\xf5\x49\x2f\xba\x06\x3c\x94\xd0\x7f\x33\xfa\xb7\x57\x8f"
- "\xb4\x06\xd9\x46\x79\x6d\x74\xfe\x7f\x9c\x36\xe6\x73\x41\xbf\x04"
- "\xaf\x88\x01\xb6\x3d\xd5\x7e\x97\xd7\x2a\xd7\xd8\x4c\xb9\xb0\x33"
- "\x8d\xc0\x93\xcf\x43\x4c\x45\x3f\x7d\x3f\xef\x67\x02\x7e\x18\x77"
- "\xbc\xb6\xe7\x7a\x77\xa9\x82\x3e\x69\x48\x73\x04\xb8\xe7\x4b\x7a"
- "\x6d\x11\xad\x6a\xae\xe7\xb5\x1e\xfd\x3c\xbf\xb8\x22\x6a\xf7\xd5"
- "\xc9\x72\x1d\xbb\xb6\xc8\x32\xf8\x7e\xcd\x81\x1a\x8b\xf8\xb8\xc7"
- "\xe2\x19\xf7\xcc\x74\xd8\x3e\x1e\x8f\x76\x67\x97\x5c\xd3\x8c\xdc"
- "\xc7\xd3\x32\x33\x6c\xdc\xc8\xeb\x9a\x0e\x5e\xbb\x55\x7e\x57\x5a"
- "\xe4\x7e\xe5\x65\x36\xe5\x5f\xc2\xe5\x1b\xd4\x6c\xcb\x96\x6d\xf2"
- "\x1e\x1f\xb6\x6b\xe4\xde\x9f\x0b\xda\x7e\x9d\x96\x64\x2e\xa3\x27"
- "\xea\xae\xe0\xf2\x0d\xa5\x4f\x57\x96\xab\xa9\x94\x59\x3f\xad\x29"
- "\x7d\x2e\xd2\xfe\x35\xcb\x71\xb1\xb3\x65\x97\x9a\x9b\x6c\x39\x16"
- "\x66\x27\x9a\x47\xe7\x96\x8c\x74\x54\xcd\x2f\xb5\x9c\x8d\x35\xbf"
- "\xb4\xe4\xb9\x0d\x1b\x37\xc9\x32\xe4\xd6\xa6\x72\x75\xba\x68\x32"
- "\x3d\x9a\xbf\x24\x7f\x56\x75\x79\x8d\xbc\x9c\x43\x4d\xe6\x94\x96"
- "\x95\x6d\xd2\x36\x3e\x55\x70\x2e\x8e\x79\x76\xab\xcc\x5a\xb5\xae"
- "\x46\x6d\x99\xaa\xae\x2c\xdd\x52\xae\x81\x08\xc7\x75\x1a\xeb\xcb"
- "\x9e\x56\x39\x66\x9e\xac\xd6\x69\x5f\xaf\x0c\x5b\xd7\x09\x1f\x47"
- "\x7e\x1b\x71\x0d\x7a\x5c\xd5\x6d\x2c\x2b\xbf\xfc\x76\x6f\x87\xf4"
- "\x89\x60\x3e\xfe\x57\x4c\xdf\xd7\x2f\xb3\x3f\x79\xf4\x6d\x9d\x7c"
- "\xff\xa9\xb6\x06\x0a\x7d\xfd\xfa\x7f\x86\xbd\xdd\x09\xfa\xda\x96"
- "\x05\x82\x02\x3a\xd5\xe6\xa6\x83\x3d\xda\x1c\x42\x7c\xd0\xd8\x32"
- "\xc0\xfb\x57\xda\xe4\x3c\xc2\xeb\x83\xa1\x79\x84\x83\x3d\xdc\xaf"
- "\x83\xdf\xfd\x8c\x1b\xe3\x39\xec\xfc\x65\x42\xd8\xde\x81\x7e\x37"
- "\xbd\x2e\xd7\xba\x78\x8d\x5b\xde\xf5\x00\xfb\x49\x3b\x57\x6e\xec"
- "\xfd\x2b\xee\x87\x5a\xb3\x59\xe7\x06\x1b\x8b\x3a\x54\x9b\x79\xa3"
- "\x48\x34\x2d\x79\x6e\x8e\x97\x52\x95\xce\xf8\xe5\xeb\x08\xbf\xe9"
- "\x12\xfd\xb2\x06\xe1\x56\xe8\x9d\x38\xb6\x5d\xd4\x5c\xf9\x2f\x5f"
- "\xd7\xe6\x15\x98\x3e\x71\x61\x38\x34\x86\xe6\x1e\x0e\xf6\x78\x92"
- "\x8b\x3a\x76\xa9\xbd\x01\x72\x1d\x54\xad\x45\xff\xf2\xe8\xe8\x58"
- "\x1b\x65\x6b\x6b\x7f\xa9\xe7\x91\x1e\xb4\xe8\xd0\xd6\xe3\x50\xf7"
- "\xd7\x79\x3c\xa1\xed\xe9\xfa\xe5\x40\xb8\x0d\xac\x7c\xeb\x2f\x79"
- "\x8e\xed\x66\x35\x66\x78\xe3\x66\x69\xe7\xf0\x3c\xc7\x35\xa6\xf7"
- "\x1b\x77\x20\x1e\x7d\xdd\x1b\x16\x37\xb5\xb4\xe8\xf8\x30\xce\x35"
- "\x36\x18\x03\xc8\xc7\x7d\x1f\x70\x9a\x88\x34\xf9\x21\x9c\xdf\x48"
- "\x95\x76\xb3\x28\xd1\xe6\x22\xdf\xe8\x52\xf3\x4d\x45\x47\xc2\xf8"
- "\x66\xbe\x44\x6f\xbc\x0e\x5c\x8f\xec\x54\x6b\xf0\x71\xfa\xda\x36"
- "\x60\x45\xd4\x3f\x34\x17\xf4\xfa\xf7\xd4\x5c\xd0\x1b\x47\x42\x3c"
- "\x7c\xa3\x86\xe5\x9e\xf7\x2f\xe8\x7b\x17\x98\x9f\xea\xde\x81\x37"
- "\x46\xf7\x7f\x05\x53\x8a\x1a\x79\xac\xb4\x57\xad\xc3\x81\x2f\xad"
- "\xdf\x36\x19\x3e\x96\x6b\xb1\x73\x7c\xd4\x81\xb0\x09\x08\xbb\x91"
- "\xd3\x71\x99\x72\xce\x04\xb4\xe1\xba\x04\x61\x8f\x9b\xd2\x26\x3c"
- "\x30\xec\x6c\xcd\x80\xcd\xd7\x1f\x92\x8d\x37\xe4\x9a\xdc\x5e\x8d"
- "\xd6\xc2\xf9\xfa\xbc\xd0\xf8\xad\x75\xc5\xe8\x9a\x13\xe0\x84\xfa"
- "\x8c\xd6\x6d\x4c\x63\x2e\xb7\x6a\x3b\xcf\x49\x1f\x3c\x2c\xf1\x50"
- "\xeb\x3a\xbf\x07\xff\x0e\x0a\xd8\x17\xdc\xd7\xf2\x58\x82\x79\xcf"
- "\x69\xd5\x5d\x40\x07\x79\x8e\x9d\xe7\x4e\x0f\xe0\xf7\x13\x41\x63"
- "\x2c\xd9\x69\x3d\x19\xbe\xcf\x50\xd1\xff\x60\x6a\x90\x61\xa2\xfe"
- "\x0c\x0b\xfd\x8f\x41\x9f\x5f\xd1\xe0\xc6\x01\xe6\x6b\xe7\x35\x5a"
- "\xcb\x35\x85\x26\x8d\x0e\xcc\x63\x49\xf3\x83\xe9\xd0\xb9\x72\xfe"
- "\xc7\xde\x21\x2e\x6e\x04\x0c\x75\x47\xe7\xc1\x7c\xc1\xb4\xd5\xd2"
- "\x7b\x78\x0c\x06\xdc\xd5\xd9\x2a\xc8\x22\xc6\x31\x8c\x67\xb0\xa9"
- "\xa8\x85\x71\xe7\xf5\x84\xd0\xb8\xfa\xe0\x36\xce\xeb\x79\x41\xe5"
- "\xd9\xa7\xd6\x3b\x98\x37\xbf\x15\x5b\xad\xa4\xcd\xb3\xa3\x9f\x7a"
- "\xc3\xc1\x72\xcf\x70\xbc\x72\x7c\x75\xb0\x31\x08\xba\x80\x27\xa0"
- "\xf3\xc1\x63\x3a\x4f\xdc\xd4\x6a\x1b\xcf\x1e\x56\xfe\xf3\x0f\x0e"
- "\xe8\x3e\x5a\xb8\x6f\x42\x1b\x76\x28\x5b\xb2\xed\xdd\xc4\xfa\xfb"
- "\x45\xa2\x7f\xde\x3c\xb6\x8d\xda\x8d\xc2\x17\xb6\x8f\xee\x56\xd0"
- "\xe9\x53\x7d\x4f\x71\x70\xe7\xca\x3e\xde\x83\xe8\xf2\xa9\x3d\x88"
- "\x1c\xbe\xd4\x2b\x82\xbd\xde\x00\xef\xa9\xef\x1b\x76\xb6\x15\xea"
- "\xe3\x20\xd6\x6f\xa6\x7a\x03\x68\xd7\xb6\xd6\x4d\xaf\x54\x6a\x7a"
- "\x6d\xe2\x05\x6a\x7b\x49\x83\x1f\x8e\x83\x59\x8d\x23\xdb\x3a\xd5"
- "\x78\xaa\xad\x19\xba\x27\x5f\x8d\xa7\xda\x3a\x74\xbc\x11\x5f\x19"
- "\x5d\xc7\xe2\xbc\x25\xe5\x96\x4a\x56\xd1\x99\x73\x6d\x96\x8c\x19"
- "\x65\x73\xe4\xa6\x55\xcb\x83\x79\xf3\x2d\xc5\x0b\x67\xd8\xac\x33"
- "\x97\xaa\x57\x5e\x71\x21\xbf\xa3\xd6\x30\x2d\xc3\xce\x76\x8a\x1c"
- "\xaf\x1d\xd2\x70\x68\x4f\x73\x1b\x66\x69\xf7\xbd\xe6\x75\xf0\x3d"
- "\xe8\xe8\x53\x07\xd9\x4e\x5e\x16\xf8\x93\x10\xfb\xb3\x06\x44\x72"
- "\x5e\x87\x27\xf9\x9d\x06\x3c\xc5\x9e\xe4\x25\x7b\xf8\x9e\xf4\xc4"
- "\x7a\xe1\x4b\xf4\x4f\x54\xba\x12\xdf\xb0\x49\x06\x60\xf7\x30\x2f"
- "\x69\xf1\x1d\x76\xb1\x2c\x20\x5c\xb0\x7f\x40\x97\x76\x9b\xde\x8f"
- "\xcb\x39\xa8\xc6\xbc\x8e\x65\x36\x31\xc2\xb2\x03\xfb\x00\xe3\x2d"
- "\x94\x69\xe2\x39\xb3\x76\xd4\xff\x15\xb7\xa2\x45\xfb\x61\xf0\xff"
- "\xb4\x46\xdf\x62\x7c\x83\xff\x39\x66\xd9\xc6\x9d\x69\xb2\xaf\x08"
- "\xee\xbc\xf3\x11\x8c\x05\x8a\x75\x98\x80\x95\xa0\xdd\xeb\x2a\xe1"
- "\xd1\x97\x3c\xff\x1c\x6c\xca\x3f\xca\x73\x17\x7c\xbe\x30\xd1\x66"
- "\xe0\x7b\x7c\x4a\x46\xe7\x6b\x10\x37\xa5\x3e\x89\xe7\x70\x4a\xa6"
- "\x78\x0d\x0e\x4e\x13\x9a\xd7\x08\xba\xf7\x19\x83\x3e\xd8\x13\x49"
- "\xea\xce\xf2\x41\x6d\x5d\xb7\xc3\x3a\xba\x4e\x10\xc1\xfb\x0e\x29"
- "\x0f\x9f\x3b\xcd\xe0\x43\x9b\xe7\xb6\x54\x65\x3b\x05\x9d\x06\x52"
- "\x67\xce\x3b\x9e\x92\xed\x52\x93\x47\xd0\xd7\xc3\x6b\x78\x89\x7e"
- "\xe1\xe1\xfd\xee\x41\x13\x64\x92\x2e\x90\xab\x76\xd8\xc1\xe7\x5e"
- "\x47\xe5\xb2\x0a\x72\x59\x05\xb9\xe4\xf5\x56\x94\xef\x31\xdd\xb9"
- "\x16\x6d\xd6\x70\x81\x3a\x66\x32\xfe\x4c\x1b\xd8\xef\x09\x41\xd0"
- "\x4a\xee\xab\x63\xfa\xa4\x3c\x98\xcd\xe7\x95\xb8\xae\x89\x7e\xd4"
- "\x39\xbc\x5e\xc6\xa0\x7b\xaf\x13\xf5\x32\xa2\x5e\xb6\x8b\x72\xde"
- "\x80\xcf\x91\x41\x97\x4c\x0d\xdd\x05\xf1\x66\x61\x78\x1d\x83\x7c"
- "\x7f\x8c\xac\xc3\x9b\xeb\x63\xd5\x51\x18\xb9\x8e\x4c\x83\x37\x1f"
- "\xd0\xd6\x5b\x24\x9e\xac\xb7\x06\xe9\x4d\x9a\x52\xcf\xe7\xb7\xf2"
- "\x3a\x60\xf7\xe6\x31\x0f\xdb\x9c\xa2\x91\xf1\x8c\xc5\x2f\x86\xa7"
- "\x60\xfd\x55\x42\x62\xbd\x63\x2d\x70\xe9\x8b\x4d\xef\x37\xaf\x5e"
- "\x9f\xde\x6f\x9e\xe2\xfc\x8c\x07\x9f\x45\x4b\x64\x47\x45\x90\x6f"
- "\xd8\x15\x0d\xb1\xca\x9d\x52\xdf\xc1\x78\xc5\x8c\x83\xec\x0f\xee"
- "\xdb\x14\xd9\x26\x82\x6d\x3e\x62\xfa\xb5\x23\x5c\xcd\xc9\xfe\x95"
- "\x63\x74\xee\xb8\x31\x0f\xe3\x2f\x8b\x89\xdb\x98\xb4\x89\x51\xdf"
- "\x58\x70\x13\x0d\x8d\xec\xeb\x2c\x0f\xba\x2a\x66\x3c\xda\x81\x45"
- "\xec\xbc\xeb\x36\xc0\xdb\x33\xa5\xde\x20\x3c\xa6\xbb\x26\x4f\xf1"
- "\xfa\xd3\x99\xae\xc0\xd5\x86\x36\xfe\xaa\xec\xbb\xe5\x5c\xc6\x5b"
- "\xa0\xc3\x7b\xf2\xfe\x4a\x4f\x72\xde\x1e\xb5\x3f\xe1\xad\x54\x37"
- "\xfd\xdd\x40\x68\xaf\xd1\x5b\xe9\x6e\xc3\x0d\xca\xbe\x36\x7d\xe7"
- "\x97\xe8\xd3\xf2\x83\xce\x44\x61\xd9\x9e\x28\xce\xd3\x5b\xef\x07"
- "\x45\x86\x11\xfd\x56\x7e\x48\x76\xd4\x79\x37\x5d\x76\x90\xbf\x2c"
- "\xb6\x5c\xbc\xb5\xfb\xfa\x72\xf1\xd6\x13\xda\x5c\xdf\x5a\xb5\x07"
- "\xf0\xad\xc3\xfa\x98\x43\xec\xfc\xce\x2f\x2d\x75\xb2\xfc\x5c\x55"
- "\x36\x68\xe2\xcf\x65\x3d\x53\x08\xba\x39\x90\xb6\x4f\xd7\x0d\x2c"
- "\x43\x89\x01\x1e\x0f\x91\x94\x73\xc4\x79\xa1\x7b\x5a\x54\xff\xfc"
- "\x50\x36\xdb\xaa\x41\x67\xdb\x51\xf4\x5f\x6f\xf0\x1e\x78\x6f\x72"
- "\x7e\xc2\xb0\xf3\x50\x9a\x9b\xfe\xa2\xe9\xbf\x7c\xb3\x68\xcc\x57"
- "\x7b\x4a\x52\xe4\x3c\x6d\x02\xb7\x73\xbe\x6f\x8c\xdb\x3a\xc2\x52"
- "\x81\x37\xdf\x3d\x86\x31\xc2\xa1\x62\xbd\xef\x0f\x3a\x73\x99\xde"
- "\x52\x9f\x1a\xd9\x1e\x06\xed\x5e\x35\x06\x3b\xaf\xcc\x49\x23\xae"
- "\xf3\x95\x9d\xb7\x74\xfe\x6c\x36\x99\xff\xef\xb4\xa7\xa9\x6a\x2e"
- "\xa5\xd6\xdf\x63\xa6\x7f\xcb\x21\x23\xd3\xc1\x4d\x87\xd6\x2a\xda"
- "\x1d\xea\xd0\xf9\xe3\xa6\xb7\xe4\x3d\x5d\x3c\x07\xbf\xcc\x2f\x86"
- "\xd4\x9a\xc2\xa1\x6e\xf4\x81\xda\xda\x59\x7b\x42\x8c\xfe\x61\xb1"
- "\xa5\xa2\xda\x52\xb6\x71\xeb\x86\xe9\xd3\x27\xc7\x18\x4b\x1c\x3a"
- "\xa3\xc6\x12\x6f\xc7\x87\x8f\x25\xf0\x8d\xfa\xb7\x0d\x44\x8f\x1d"
- "\x0a\xd7\x68\x6e\x0a\xd6\x64\x52\xe8\x77\x16\x15\x66\x85\x7d\xce"
- "\xa3\xc2\xb9\xf3\xd6\x3c\x52\x5e\x5a\xb6\x2d\x2c\xf4\xee\xf0\x79"
- "\xbe\x7d\xbf\x44\xd9\xa6\x5b\x16\x41\x7f\x18\x96\xbe\xc0\xfd\xce"
- "\xdb\x81\x3a\xbf\xf8\x0b\x64\x37\x87\x7d\x03\x9d\xaa\xf1\xd3\x29"
- "\xe8\x37\xf1\x1d\xd6\xeb\x13\x95\x7f\xcc\x00\xf1\x3c\x5a\x22\xea"
- "\xee\xc1\x98\xee\xb2\xda\x03\xfe\xce\xf4\xde\x16\x1f\xf4\xc4\x92"
- "\x66\x65\xef\xbc\x7d\x16\xe1\xc9\x08\x8f\x53\xfb\x58\xde\x99\x84"
- "\xf1\x72\xae\xf4\x85\xb0\x85\x7d\x21\xbc\xfd\x19\xd3\x68\xb6\xd7"
- "\x41\xca\x27\xd7\xdb\xcd\xec\x2b\xdb\x4d\xef\xe4\xb3\x7d\xc1\x69"
- "\x11\xf6\x91\xe5\xa7\x94\xc9\x6f\xb6\x87\xdd\x80\x29\xf6\x2f\x69"
- "\x16\x6f\x94\xf0\xda\x7e\x3a\x60\x3e\xc0\x76\x9b\x29\x6d\x62\x60"
- "\xd8\xf9\x4e\xae\x6e\x83\xf0\x7e\xd3\xf1\xec\x0f\xbd\x1f\x9c\x02"
- "\xfd\x3d\xc5\x9b\x28\xd6\xb0\x6f\x11\x03\xa5\x73\xff\x90\x68\x2b"
- "\x96\x67\x94\xb8\x5f\x64\x9d\xd0\x26\x75\xe9\x3b\x2d\xba\x5e\xd8"
- "\xab\xc6\xa3\x93\x39\x3f\xfa\xcf\x4f\x55\xff\xf9\x4e\x97\xde\x16"
- "\xf0\xbb\x47\x97\xd5\x88\x73\x2e\x1b\x6a\xca\x37\x95\x97\x59\x66"
- "\x54\x4f\xa6\xb0\x9b\x1c\xad\xe5\x1b\x2c\x9b\xca\x9f\xdf\x5c\x5e"
- "\x2d\x07\x7a\x1c\x1b\xb9\xc6\x02\x1d\x14\xba\x57\x57\x9e\xb5\xf9"
- "\xd5\x1d\x3c\x16\x4e\xac\x9f\x2e\xe7\xd3\xd5\x3a\xc8\xfb\x27\x82"
- "\x7b\x6f\xcc\x55\xf3\x91\x17\x40\xd7\x4e\xcd\xa7\xee\x92\x5d\x6c"
- "\xc7\x9d\xa7\xce\x85\x6a\xcd\xfe\x57\x9b\x15\xad\xe2\x77\x0f\x3b"
- "\x7f\x55\x19\xb2\xd7\x3a\xe5\xfe\x57\xb5\x77\xee\x57\xbb\x40\xe3"
- "\xb2\x90\x0d\xd2\x79\x91\xf5\xa0\xd4\x87\x5f\xa0\x0b\x35\xdb\x19"
- "\xe5\x74\x66\x89\x2d\xa2\x7f\xdf\x35\x92\xf3\x81\xec\x63\x5d\xe9"
- "\xd7\x5f\xb9\x75\x3a\xc2\x7e\xe9\xe7\x79\x07\x7d\x7c\xb4\xcc\x7f"
- "\x55\xd4\x6d\x23\x23\xcf\x3d\x40\x87\xb4\xfc\xf5\x26\x8f\x51\x38"
- "\xdf\x39\x0d\x5b\x66\x17\xa7\x69\xd3\xf6\x90\x89\xe4\x25\xd0\x27"
- "\x9d\x19\xa1\x71\x47\xe7\xa0\xb4\xe3\xaf\xb1\xdc\xfc\xea\xe4\x1a"
- "\xee\x23\x94\xee\xbe\xe1\x8b\xf0\x15\x93\xd5\x9c\xbb\xd2\x6f\x9d"
- "\x56\xad\x0e\x83\xac\xb3\xb4\x3d\x88\x46\x25\xd7\x9d\x83\x90\xb9"
- "\x5d\xcc\x0b\xe8\xf9\x06\x9d\x5e\x5c\x5f\xc6\x9d\xe7\x95\xa1\x87"
- "\x5b\xde\xdb\xee\x33\xaa\x3b\x10\xdf\x39\xab\xc6\x47\x9d\xa7\xc3"
- "\xd7\x8e\xd4\x58\xa8\xb3\x3f\xe4\x6f\xe0\x57\x63\xee\xe1\xda\xb8"
- "\x81\x8f\xb5\xac\x5b\xb3\xb5\x74\x5d\xf9\x9a\xcd\x55\x33\x2d\x9b"
- "\x37\xc8\xa5\x39\x39\x0d\x50\xb3\xf9\x99\x75\x16\xd6\x22\x6b\xf2"
- "\x0b\x0b\xd7\x2c\x7a\x74\xf9\x13\x93\x69\x51\x29\xc2\x6a\x36\x5a"
- "\x0a\x33\x67\xaa\xa8\x47\x16\xe7\x3d\xb6\x26\x6f\xd9\xa3\x4b\x57"
- "\xc4\xd8\x1b\x9b\x00\x99\x70\x80\x47\x71\xe7\xe8\xd7\x0b\xd4\x5e"
- "\x88\x77\x6d\x91\x7b\x21\xde\x05\xad\xde\x3d\x8c\xe7\x04\xd1\xaf"
- "\xd3\xf1\x2c\xc0\x93\xa9\xe4\x66\x12\x74\xe0\xbb\x87\x42\x72\xc3"
- "\x71\x6a\xbf\xb0\x9a\x7b\x7d\x17\xfa\xef\x1d\x7f\x78\x5c\x48\x17"
- "\xfc\x87\xdf\x48\x7d\xa9\xc9\x05\xcb\xc3\x1a\x7f\xbc\x94\x0d\x65"
- "\xaf\xbc\xeb\xd7\x65\x43\x9e\xb7\x43\xf8\xff\x4b\xde\xfb\x07\x46"
- "\x55\x5c\xfd\xc3\xb3\x9b\x10\x02\x04\x76\x13\x43\x5c\x11\x65\x6d"
- "\xa3\x8d\x2d\x4a\x50\xac\xd1\x47\x6b\x34\xa8\xa0\xfc\xd2\xa2\x8d"
- "\x8a\x24\x08\xd8\x80\x80\x0b\x84\xb0\x84\x90\x5f\x60\xde\xd8\x42"
- "\x58\x10\xf8\x46\x09\x10\x9f\x07\x2c\x56\xd0\xb4\xc5\x36\x5a\xc0"
- "\x55\xa2\x8d\x90\x64\xa3\xc5\x36\xd8\x88\x6b\x0c\x18\xd2\x80\x0b"
- "\x09\x64\x49\x76\xef\xbc\x9f\x33\x73\xef\xfe\x08\x1b\x30\xd6\x6f"
- "\xed\xfb\x3e\x7f\x24\x77\xef\xdc\xb9\x73\x67\xce\xcc\x7c\xe6\x9c"
- "\x33\x67\xce\x21\x9d\x19\x3d\xc7\xf8\xde\x43\xfa\x65\x8c\x85\x7c"
- "\xda\x17\xa5\x74\x1e\xbd\x6f\x8f\x5a\xee\x18\xd2\x37\x13\x3f\xab"
- "\xee\x9f\x0c\x69\x65\xbf\x5d\xc8\x0b\x77\xba\xa5\x2c\xf8\xea\xf5"
- "\x62\xdc\xac\x1c\x76\x8f\xd8\x87\x12\xe7\x1a\x7e\x9b\xe1\x1f\x3f"
- "\xaf\xd1\xb9\x06\x81\x0b\x12\x7b\x7f\xbb\xaa\x87\x1e\x27\x0c\x69"
- "\xa5\x9a\xbf\xea\xcc\x6b\x98\x3e\xfc\x1a\x1b\xdb\xa0\xe7\xe0\x15"
- "\x7e\x3b\x4e\xda\xc3\xfd\xb6\x52\xe3\x9f\xf1\x1b\xf3\xff\x4b\x4b"
- "\x4f\xfd\x57\x49\x80\xfe\x2b\xd7\xc2\xbf\xa8\xb3\xb8\x88\x47\xb6"
- "\x3b\x5c\xc2\x4f\xe2\x5d\x75\x96\x0e\xf2\xad\x37\xf0\x38\x7b\x6d"
- "\x70\x9e\x97\x77\xe1\xf7\x30\xb4\x4d\xac\x21\xa3\xa4\x4e\x01\xf2"
- "\xd8\x6b\x77\x4a\xd9\x44\xa6\x13\xdd\x9d\xec\x55\xb2\x63\x0a\xa7"
- "\xfe\xc1\xef\x52\xf4\x51\x72\x28\xdc\x1b\x52\xa0\x57\xfd\xd1\xbc"
- "\xb6\x8e\x64\x54\xa2\xd5\x0b\x7a\x25\xe3\x85\x42\xfc\xe1\x4a\xd8"
- "\xe7\xe7\x2f\xb9\x5b\xd2\xf6\x35\x5b\x95\xb5\x8d\xd6\x4d\x77\xaf"
- "\x76\x8a\x59\xbc\x51\xeb\xcf\xc9\x5e\xd7\x5d\xd4\x5f\x9d\x85\xaf"
- "\x55\x6b\x7d\xd9\x7e\x63\x0a\x64\x2f\x66\x3e\x50\x76\x13\xa5\x63"
- "\xfe\xbf\x36\x4e\xb5\xc3\xec\xe8\xf9\x2e\x70\x38\x59\xbe\xbf\x2b"
- "\x52\x7b\xbf\xa7\x9f\x53\x71\x50\x90\x94\x5c\xb7\x0b\x55\x58\x82"
- "\x1a\x96\x36\xe8\xcc\x0f\x9d\xe5\xac\x92\x63\x52\xd3\xc1\x19\x65"
- "\x7b\x76\x43\x96\x80\xfc\xbd\x3e\xb9\x50\xd5\x03\x60\x6e\xef\xda"
- "\x71\x23\x63\xf3\x3a\x96\xa6\xfa\x74\x28\xa4\xfb\x20\xdf\x65\xa8"
- "\x87\x2d\x40\x47\xe6\xb3\x15\x73\xb2\xdd\x24\x13\x43\xd6\x4e\x5e"
- "\x45\xe5\xd0\xbc\x92\x7a\x9b\x5d\x76\x47\x07\x63\x28\x6f\x81\xd8"
- "\x03\x2d\xdc\x65\x12\x63\x0f\xb2\xb6\x90\xf3\x73\xf8\x57\xaa\x2d"
- "\x85\xe0\x5d\xe4\xb9\xa0\x5d\x1d\x3e\x5d\x90\x38\x23\xb3\xcb\x42"
- "\xf6\xa1\x9d\x85\xbb\xa3\x42\xe9\x0b\x81\x0f\x19\x33\x16\xcc\x7a"
- "\xf6\xe9\xa7\x2f\x0d\x0d\x81\x36\x9b\xb6\x42\xa5\x18\x65\x42\xfe"
- "\xdd\x60\x92\xe3\x74\x37\xf0\xff\x57\x19\x92\x7f\x7b\xe2\x04\xe6"
- "\xcd\x55\xad\x6c\x77\xb5\xc6\xbf\xcb\x79\xb4\xfb\x30\x2f\xdc\x6d"
- "\xf2\xcf\x8d\xdd\xe5\x17\xce\x8d\xdd\x7b\x42\xcf\x8d\xdd\x0d\x58"
- "\x67\x1b\xf1\xfc\x30\xbe\x29\xf6\x5e\xe8\x5e\xe5\xc1\xed\x06\xcf"
- "\x5d\x82\x07\x4f\x5b\xc6\x74\xc4\x7f\x93\x6e\x9a\xd6\x03\x2f\xe4"
- "\x5a\x2f\x30\x22\xcd\xc3\x8c\xb4\x16\xac\x5d\x40\x7a\xc7\x11\xdc"
- "\x73\x8e\x3b\xd3\x96\x01\x2f\x70\x5f\xd2\x2a\xf7\x6b\xa7\x9f\x85"
- "\x1c\x82\xdf\x6b\x8f\x13\x56\x28\xe4\x54\x9d\xc9\xf5\xfa\xf5\x71"
- "\x1a\x8f\x6b\x28\x30\x0b\x5f\xbb\x62\xdd\xc6\x38\xa3\x75\x3b\xcd"
- "\x6b\xb0\xcb\x75\xfb\x75\xcb\x45\x75\xdc\xd1\xaf\x58\x42\xa5\xa3"
- "\x8e\x55\x54\x2f\xd4\xb3\x02\xf5\xda\x43\xf5\x29\x79\x9a\xda\x15"
- "\x76\xb3\xc1\x93\x28\xf6\x18\xa8\x9e\xd3\x3b\xd8\xcd\x54\xbf\xe9"
- "\x0b\x6f\x66\x5b\x9f\xa6\x7d\x62\x69\x1f\xa4\x8e\xa5\x70\x8c\x99"
- "\xfe\xc7\xd9\x1b\xf1\x1d\x22\xf6\xe1\xeb\xc0\xa2\xc8\x2a\xc9\x07"
- "\xcb\x3d\x18\xca\x43\xcf\xe4\x38\x7d\x23\xfe\x80\x95\xea\xfc\x46"
- "\xbc\x96\x2f\xb0\x6e\x29\x33\x2c\x60\x2c\xe7\x3c\xfd\xf4\xec\x45"
- "\x8b\xb5\x38\xce\x09\xcf\xce\x9b\x75\xa7\x7a\x6e\x76\xc1\xec\xa5"
- "\x69\x73\x66\x09\xbb\x7c\xa4\xca\x9f\x3d\x78\x8d\x91\x24\x0b\x08"
- "\x5b\x57\xc1\x67\xec\x21\x1b\x2e\xc1\x73\x34\xb1\x0a\x9b\xdc\xc7"
- "\xae\x18\x2f\xd7\x81\x41\x4b\x51\x8f\x5d\xda\x3a\x40\xfa\x88\x76"
- "\x76\x4d\x31\xed\x2f\xd1\x59\x68\xda\xc7\x22\x9d\x04\xf2\xd4\x3b"
- "\xd9\xeb\x39\xda\xd8\x5e\x83\x74\x3a\x7f\x61\x5f\x40\x36\x7b\x7b"
- "\xae\x51\xd6\xa5\xe4\xf0\x98\xc4\x44\x60\x40\x14\xad\x0d\xb4\xaf"
- "\x22\xfd\xe6\x57\x0c\x27\x6c\x23\xbd\x99\x7d\x01\xd9\xc0\xbd\x41"
- "\xba\x0e\xa3\x93\xed\x89\x87\x5c\x94\xb3\x2a\x9b\x45\xd2\x37\xb0"
- "\x6e\x38\xa5\x0e\xb6\x22\xe9\xdd\x1c\xc6\xd4\xb5\xc3\xb9\x46\xe8"
- "\x04\x2b\x64\xcc\x00\x5b\x8a\x4d\xd5\x39\xd8\x90\x0f\xe3\x7f\x30"
- "\x93\x75\x4e\x4c\x15\xfb\x67\x02\x17\x2a\x56\xf1\xf5\x89\xe2\x5c"
- "\x2f\xae\xa9\x0a\xcf\x08\xa3\x7b\xe0\xf2\x40\xf0\xfb\xbb\x78\x5e"
- "\x02\x53\x6d\x1b\xc3\x8e\xb3\xdf\x0d\x26\x9d\x29\xfa\xa3\x8c\x68"
- "\x81\xf2\xcb\xd4\xf2\xcb\x50\x3e\xd6\xbf\x2b\xd5\x98\x95\x15\x35"
- "\xda\xb7\x30\xb6\x5d\x58\xbb\x72\x68\xfd\x42\xfd\x33\xf1\x67\x95"
- "\xfa\x19\x37\xe4\xa4\x11\x3e\xfd\x8c\xe4\x91\x7e\x17\xae\x8d\x49"
- "\xfa\xb6\xda\x86\x52\xa5\x50\xf8\x4c\xd4\xa9\xdf\x2a\x25\x5d\x81"
- "\x56\x26\x47\x99\xfc\x5c\x5b\x39\xd6\x9a\x48\xcc\x31\xd7\x90\x02"
- "\xac\x29\xf4\x0d\xe2\x71\x3b\x46\x70\xac\x39\xde\x34\x6f\xb8\x3c"
- "\xb7\xbe\x8c\x0d\x0e\xe4\x6f\xf1\xbd\x4c\x3f\x4f\x86\x32\xce\x01"
- "\xcb\x72\xe9\x30\xc4\xef\xc4\x59\x02\xb2\x0b\xa1\x7e\xed\x42\x3f"
- "\xa1\xaf\x92\xf0\x9d\x0a\xf0\xe5\x83\x41\x87\xdf\x51\x7f\x95\x28"
- "\x98\x73\x5d\x82\x57\x37\x50\x8c\xf3\x26\xf6\xbb\x2d\xd4\x57\x54"
- "\x16\xc6\x45\xa4\xa7\x33\xf5\x7e\xf2\x1b\x45\xb4\x5e\x91\xc3\x5b"
- "\x68\xaf\xef\x38\xfb\xc3\x35\xc4\xc3\x82\xaf\x17\xbf\xf3\x66\x71"
- "\x45\xf4\xb5\xb0\x77\xfc\xc3\x35\x2b\x5a\xb8\x72\xbe\x90\xf1\x6a"
- "\x60\xe9\x79\x3d\xf3\xb8\x21\x83\xa2\xde\xfa\xbc\x93\xe4\xdb\xaa"
- "\x1c\xf3\xab\x98\xe1\xbb\x91\x25\xd9\xcc\x48\x7e\xc1\xf2\x2c\xdc"
- "\x5d\xd7\x51\xc6\xea\x2c\x65\xec\xa0\x67\x03\xb3\x67\x91\x4e\xf3"
- "\x0f\xd5\x87\xac\x1b\xc8\xbe\x7c\x00\x7e\x3f\x6f\x7e\x94\xbe\xf5"
- "\xfb\xf4\x43\x87\x3f\x66\x87\xec\x1f\x33\xf3\xe3\xe2\xde\x52\x93"
- "\x7a\x90\xd5\x24\x1f\x64\x79\xcd\x5c\x21\x7e\x28\x77\x3e\x7d\xa3"
- "\x18\x65\x95\x93\x0f\x2d\xa3\xd2\x6e\x1a\x88\xf6\x87\x4f\xb6\x32"
- "\xb1\x9f\x68\x5f\xf0\x36\xea\xf8\xfb\xd3\x5b\xcf\xb0\x48\xfb\x82"
- "\xf7\xc4\x6f\xa1\x5f\x40\x7b\x1d\xb3\x1a\x84\xad\x19\xf9\x0f\x73"
- "\x58\x5b\xe8\x9c\xa6\xb2\x96\xea\xe8\x95\xf5\x06\xbd\xc2\xb5\xf7"
- "\xb7\xe5\xfa\xde\x17\x36\x8d\x5b\x88\x1e\xa8\x53\xed\x54\x49\x93"
- "\x9a\x06\xd0\xf4\x51\x95\x3e\xa9\x81\xf4\xf9\xbd\x91\xe8\x43\x76"
- "\xa4\x4a\x56\x5b\x39\xea\x96\x0c\x1a\x28\xda\x37\x68\x0c\xd0\xbe"
- "\x17\x95\x5f\x72\x86\x45\xd9\x17\x90\x9d\xe9\x1f\x96\x18\xa6\x84"
- "\x47\x2a\xe7\x4e\x56\xac\x3d\xcb\xc2\xa9\xdf\x68\x9d\x5d\x2b\x9e"
- "\x0b\x9a\xa7\x52\x9f\xb9\xa2\x93\x2d\xf8\xc3\xf8\x4c\xb6\xd2\xd8"
- "\xc3\x35\x07\xfd\x55\x0c\x3a\xb9\xd0\x57\xe5\x74\x95\xe3\x71\xf4"
- "\x4e\xf2\xab\x48\x6b\x19\xc6\x8a\x3f\x7d\xfd\xe8\xdf\x78\x30\x77"
- "\x14\x21\xa7\xfd\xde\xa5\xac\x9b\x58\x2c\x6d\x0e\xdf\x48\xdc\x02"
- "\xbe\xb8\x6c\xbd\x38\xd7\x1e\x05\x5e\x9e\xe4\x73\xf6\x92\x38\xff"
- "\xf2\x07\xdf\xfa\xf7\x2b\x11\x73\xfc\x0f\x66\xbd\xb0\x2d\x4b\xd9"
- "\xa0\x8e\xf5\x0d\x9d\x85\x7b\x20\xff\xc6\xd5\xcb\x39\x51\x61\x17"
- "\x7a\x08\xe0\x40\x6f\x3c\x09\x70\xb9\x86\x6c\xf5\xf8\x95\xa9\x2c"
- "\x4a\xc7\x5d\x51\xe9\x06\xee\xf0\x54\xd1\x18\x8a\x12\x63\x5f\x3e"
- "\x03\x1f\xe9\x32\x00\xcb\xeb\x91\x1e\xae\xa5\x13\xae\x2b\x90\x2d"
- "\x49\xae\x9d\xbc\xcc\xc0\x73\xcf\xb2\xe1\x42\x47\xa4\xa5\x2f\x73"
- "\x19\xea\x4c\x8c\x6c\xf7\x3d\xe4\xcf\x82\xde\x41\x7a\x18\xd6\x81"
- "\xbd\xf8\xae\x1d\xf9\x63\xb5\xfc\xbc\x3d\x35\xdc\x61\xad\x12\xf3"
- "\x8c\x7c\x1e\x69\xeb\x02\xd2\xfb\x4d\xb6\xba\x0c\xa2\xcf\xb4\xb4"
- "\xc5\xa9\x62\x1d\xa3\xb3\xf3\xe0\x53\xb9\xa8\xcf\x71\x91\xae\x83"
- "\x9c\x29\x62\x9a\x07\xa4\xe9\xc9\x4f\x01\xf9\xb0\x0b\x48\x0b\x43"
- "\x9d\x99\xef\x1e\xdf\x5e\x3b\x57\xec\xf7\x9b\x26\x2f\xa3\xfd\x32"
- "\x7c\x67\xae\xfa\xed\x65\x9c\x49\xbf\x98\x32\x4d\xae\x99\x6f\xe6"
- "\x04\xca\xb8\xb4\x47\x41\xdf\x56\xda\x53\xf5\xde\xf6\xd4\x30\xfa"
- "\x3e\x95\x45\xfa\x49\x11\x5b\xdd\xd3\xc2\xc8\x27\x33\x5f\xb7\xaf"
- "\x9e\xd3\x59\x0d\x94\x2b\xea\x63\x85\xfc\x1f\xbd\x7f\x4a\x68\x5b"
- "\x98\xd7\x8a\xed\xb9\x8f\x63\x4c\xff\x71\x15\x61\x8a\xd7\x38\x76"
- "\xbb\x79\x2e\xd9\x2f\xbc\xe9\xa5\x3e\xf5\x62\x9e\x7b\xa3\xc7\x6e"
- "\x1f\xd5\xc2\x74\xb9\x98\x3b\x72\x1f\xef\x8f\x57\x11\x4f\x95\xa7"
- "\x70\x8e\xdf\x46\x1a\xbb\x86\x36\xb2\x61\x19\xbb\x53\xd8\x8d\xc4"
- "\xfc\x26\xdf\xe1\x6e\x61\x35\xf9\x9f\xb2\x1a\x8f\x23\x7f\xef\x19"
- "\x57\xb8\xb4\x1f\x09\x47\xb9\x7f\x1c\x4d\xcf\xf2\x30\x5f\xd2\xbc"
- "\xe5\xbd\xcb\x81\x90\x2d\x40\xbb\xcf\xe5\x5a\xf0\xc7\x55\x9a\x3c"
- "\x71\x89\x36\x34\x92\x1f\x42\xb2\xaf\x53\xd6\x3f\x57\x81\xba\xe4"
- "\xf1\xce\x04\x36\x2a\x9b\xf4\xba\x7f\xdc\x33\xa4\x83\x25\xab\xe5"
- "\x7e\xad\x96\xdb\x78\xb1\x72\x69\xdc\xd6\x94\x4a\x9b\x0d\x25\xe6"
- "\xb9\x72\x2f\xca\xf6\xc6\x3c\xe7\xc4\x5a\x93\x97\x77\x9e\x74\x27"
- "\x95\xd7\xe0\x3b\xe5\x75\x9e\x7a\x46\xbe\x4c\xb7\x2a\x58\xaf\xbf"
- "\x36\x31\xd5\x56\x26\xef\x14\xfb\xd3\x60\x85\x27\x18\x21\xe7\x90"
- "\xae\x34\x8f\x70\x96\x74\xcf\xb9\x5e\x16\xe1\x00\xc2\x93\x0f\x3e"
- "\x94\x31\xf4\x7d\xd2\x4b\x03\xab\xbc\xdc\xa4\xdf\x77\xce\xc9\xd6"
- "\x02\xbf\x85\x4f\xbe\x95\x57\xbe\x34\xa4\x80\xdd\xc5\xf5\x06\x61"
- "\x0b\xa5\xac\xdb\x51\x89\xbe\x6d\x90\xb6\x39\x29\xdb\x03\xec\x72"
- "\xc2\xf0\xad\x75\x64\x97\xc3\x8d\x29\x19\x65\xb4\x66\xa2\xcf\x3a"
- "\x0b\xff\xb4\xd7\xc9\xde\x14\xbe\x4f\x56\x93\x1e\x40\xe0\x7c\xe5"
- "\xf5\xae\xe8\x82\x7c\x2a\x83\x7c\x03\x29\x59\x9e\x8a\xb5\xa7\xc1"
- "\xf7\x08\x7a\x54\x0e\xa8\x6b\xeb\xb4\x73\x5b\x41\x3e\xcd\x23\xb5"
- "\x6c\x03\xca\x3e\xc2\xd7\xd1\x39\xb4\xca\x04\xd9\x37\xf4\xfb\x4f"
- "\xe2\xfc\xb7\xa7\x9b\xce\xf3\xfc\xc9\x52\xd6\x45\x3a\xb9\x3f\x0d"
- "\x07\x5f\x68\x6f\x37\x16\xe4\xff\xdc\x94\x0f\x1e\xa0\xf2\x0e\xa7"
- "\xfe\x84\xd4\x23\xaa\xfe\x05\x7b\xdb\x83\xe2\x9b\x4d\x03\x1d\x28"
- "\x04\x3c\x6e\x6c\x2b\x7b\x7b\x77\x17\xe4\xfc\x6e\xac\xad\x5d\x90"
- "\x13\xf8\xe6\xd4\xa8\x92\x61\x2c\x11\xcf\x86\xb5\xb2\xca\x75\x1e"
- "\x3d\x8b\xc5\x9f\xd1\x75\x65\xc6\x00\x94\x9b\x4c\xfa\xcf\xda\x33"
- "\xb4\x27\x5b\x29\x70\x7f\xed\x4b\x2c\x5e\x41\x79\xa4\x77\x5d\x3b"
- "\x8c\xc5\x93\xce\x15\x69\x09\x69\x5e\xb9\x27\xa1\xc9\x54\x2b\x87"
- "\xb1\x91\xc1\xdf\xad\x54\xcf\xf8\xbd\x2d\xd6\xf8\xa5\x2e\x76\xb5"
- "\xe5\x67\xbc\xe9\x38\x7b\x6b\x1e\x2f\x0c\xe3\xfc\x4a\x93\x5e\xca"
- "\x14\x6f\x3d\x62\x28\x95\xe3\x4e\xe8\xe0\x31\xde\x68\x8f\x43\xd5"
- "\xed\xea\x84\x5f\xc5\x98\xf1\x63\xe8\x3c\x85\x48\xd3\x19\x89\x96"
- "\x46\x51\x0f\xd5\x17\x9a\x77\xe5\x8f\xd3\xa9\x0c\xaa\x4f\xda\x0c"
- "\xa9\x17\x26\x3f\x69\xa0\xb1\x88\x33\xb5\xfa\x25\x16\xf5\xeb\x97"
- "\x98\xb1\xf6\x69\x6a\xd7\x5b\xab\xe4\x5c\x0c\x67\x54\x5f\xc5\x46"
- "\xf3\x0c\x63\x02\xf5\xa6\xef\xd1\xd8\xa8\xf3\x7c\x6d\xcf\xcb\xe4"
- "\x8a\x7d\x2e\xf9\x14\x78\xeb\x7d\xfb\xa2\x5d\x6c\x72\xb3\x47\xfa"
- "\xf6\x99\xc6\x5c\xdb\x50\xde\xb6\x61\xcc\x88\xb2\x3e\x72\xcc\x23"
- "\xac\x35\xfd\xc0\xbe\x68\x0f\x95\x7d\x8c\xd6\xa3\x35\xa0\x8f\x5c"
- "\x97\xde\x2e\x75\xb8\x1b\x18\xf9\x95\x9f\x64\xe1\x5e\x2a\xe7\x38"
- "\x7b\xfb\x2a\xd1\xde\xcd\x26\x73\x9a\xf4\x65\x27\xda\xea\xd3\xb7"
- "\xab\xed\x70\x9c\xa1\xf2\xde\x4e\x74\xa4\x83\xe7\x54\xdb\xa4\xd1"
- "\x5a\x8e\xaf\xb7\xe7\xdb\x17\x6d\x67\xd4\x3f\x94\x1f\xf7\xd3\x1c"
- "\x6d\xc8\x7b\x32\xb8\x5f\x28\x0f\x9e\xad\x41\xb9\xb7\xfa\xf7\x91"
- "\x68\x7f\xc3\x9f\xa7\x0c\xed\x01\xad\xea\x37\x83\x46\x52\xbf\xf6"
- "\xd6\x79\xaa\xab\x93\xbd\xe5\x76\x64\x7e\x1a\xfa\x1c\x13\xe6\x3e"
- "\xc6\x7d\x41\x9d\xd0\x2d\xbd\x7d\x62\x92\x47\xe1\x12\xcf\xfe\x5c"
- "\x06\xde\xad\xd8\x89\x2b\x61\x81\xc0\x93\x1b\x69\xef\xf7\xcf\x5b"
- "\x0c\x3a\xd9\xbf\xd4\x16\xe2\x99\x42\xf5\x71\x80\x5e\xdf\x48\x75"
- "\xd5\xfa\x98\x1b\x5f\x2b\x56\x68\xbf\x66\x18\xe8\xdd\x6d\x62\x72"
- "\xfc\x71\x1b\xca\x5d\xa3\xf2\x90\x2d\xea\x7a\xda\xd2\x1e\x3d\xb6"
- "\x82\x2f\x37\x31\xcd\x66\x0f\xf3\x77\x57\x9a\xb4\x83\x34\x11\x46"
- "\x6d\xd3\xcb\xb9\x43\x75\x54\xdf\x6d\x96\xfb\xc8\x7f\x9e\x86\xf7"
- "\x9b\x43\xb6\x37\x6c\x18\xc5\x11\xce\x23\xbf\x7d\xe2\x7c\x01\xb0"
- "\x0a\xeb\x41\x84\xa3\xa3\x8b\xc9\xbd\xed\xbd\x57\x50\x8c\x77\x3a"
- "\x5b\xa6\xd5\xad\x6f\x3a\xf8\x3f\x37\x4b\x1d\xfc\xde\x78\x4d\xde"
- "\xe4\x46\xd0\xb8\xd0\x20\x7c\x8c\x83\xef\x52\x3a\xa2\x5f\xb3\xb9"
- "\xa2\xf7\xd9\xe5\xbc\xd9\x3b\x81\x47\x4b\xbc\x4d\x73\xb3\x7c\x6a"
- "\x97\x2a\x77\x45\x50\x9b\x51\xce\x3c\x6d\x2f\x58\x2b\xbb\x57\xbf"
- "\xfd\x5a\xdb\xd0\x26\x79\x26\xf9\xb5\x62\xd1\x36\xf2\xab\x21\xdb"
- "\x26\xf6\x32\xfb\xd6\x9e\xbd\x7b\x24\x6d\x5f\xb3\xd9\x87\x51\x19"
- "\xfb\x0b\x84\x4d\x3f\xfa\x04\xf8\x70\x79\x2b\xdb\x77\x07\x1f\xf8"
- "\xeb\x81\x7d\x2b\x73\x9f\x8c\x91\x68\xdb\x67\xdf\x08\x0c\x96\xe7"
- "\x8c\xc8\xbe\x65\xff\x1c\x60\xb9\x9d\x64\x98\x76\x7c\x0f\xe3\x23"
- "\x00\x87\xf6\xb5\x51\x5f\xdd\xb8\x8b\x25\xcb\x71\xb8\xef\x0b\xd2"
- "\x4b\xc8\xb8\x2a\xfb\x6c\x18\xf7\x53\xa5\xbc\xa4\xd9\x77\xea\x84"
- "\x7d\x67\x20\xc6\xf6\xb1\x8e\x52\xa6\x89\xd9\x01\x59\x6c\x5f\xbe"
- "\xb0\xe1\x41\x7d\x97\x7a\x34\xfc\xdb\x97\xcf\x49\x37\x9c\xab\xea"
- "\x08\x09\xcb\x72\xa5\x5f\xae\xce\xc2\xfd\x66\x9f\x8e\x90\xce\x61"
- "\x16\xf2\x6a\xca\x87\xbe\xff\x9a\xf2\x48\xbf\x41\xad\xea\x19\xc5"
- "\xfd\xb7\xa8\xe7\x0f\x13\xc8\xae\x09\xef\x4e\x73\xb2\x26\x21\xaf"
- "\x12\x0d\xe8\xdb\xa2\xee\x7a\xd2\x07\xee\xb7\xfa\x75\xb2\xfb\xe4"
- "\x99\x46\x61\xff\xb2\xdf\xa6\x8d\x11\xb4\x37\x42\xfa\xd2\xdf\x7b"
- "\xfe\xc0\x48\x26\xc6\x40\x3b\x37\x0d\xfc\x61\x19\x8d\xc9\xfd\x95"
- "\x81\x74\x9a\xec\x51\xf2\x24\x06\xed\x2b\xe7\x62\xae\xef\x2b\xbf"
- "\x34\x3f\xf1\xce\x60\x8d\x17\x91\x74\x36\x02\x5f\xde\x6d\x10\xb4"
- "\xb6\x8d\x1e\x47\xbe\x2e\x97\xe7\x92\xef\xde\x77\x6a\xc9\x47\xb2"
- "\xc7\x36\x3a\xc3\x9b\x67\x22\x9f\x90\x4c\xb1\x8d\xb6\x1e\xb7\x30"
- "\x7d\x9a\x85\xf4\xd0\x05\x53\x48\xc6\x83\xcc\x4a\x67\x02\xb2\x69"
- "\x9e\xaf\x98\xc3\x0c\x4f\x66\xa0\xec\xbc\x84\x58\xf2\x61\x4c\xfe"
- "\x8b\xc9\xff\xb8\x37\x2f\x21\x06\xbf\xe3\xc0\xcf\x19\xb9\x71\x74"
- "\x2a\xed\x65\x7b\x0b\x39\xf0\xb8\x91\xfc\x28\xeb\x1d\x2e\x37\x5b"
- "\x71\x92\x45\x92\x8f\x64\xcf\xba\x82\x8c\xba\x8e\xcf\x84\x7c\x33"
- "\xc4\xc2\x62\xc1\x7f\x0c\x07\xcd\x4d\x4a\x74\x01\xe4\xd0\x82\xa9"
- "\xb2\xdd\x5f\x73\xd9\x6e\x59\x6f\xaa\xbf\xc4\xb8\x9b\xad\xb9\xa2"
- "\xee\xef\x2e\xf4\xa0\x7c\xc5\x96\x94\xe9\xb5\x25\x59\xe4\x39\xd8"
- "\x1a\x96\x9b\xc9\x5b\x1c\x1d\x35\x90\xb9\xce\x8a\x78\x51\xb4\x57"
- "\x4e\x6d\xa4\xf6\xd1\xb7\x0f\x9d\x39\x29\x7c\x3e\x7b\x70\x9f\x37"
- "\x4f\x7d\xa7\x0d\xef\xb4\xd5\xb0\x2e\x5b\x92\x68\x7b\x5d\x87\x7c"
- "\x37\x4d\xfc\xa6\xf7\x03\xe8\xa0\xb6\xd9\x47\x07\xb4\x9d\xda\x47"
- "\xed\xf7\x10\x4d\x40\x03\xb5\xad\xa6\x6e\xb5\x9d\xd4\xc6\x83\x58"
- "\x75\x5e\x42\x3b\xd1\x56\xd1\xce\x6e\xb4\xb3\x3a\x83\x31\xf7\xfa"
- "\xd7\xca\xcf\xc7\x24\x59\x48\x46\xcd\xfb\x08\x3c\x7c\x8e\x8d\x41"
- "\x16\x0d\xdf\x9d\x6b\xd3\xff\x0a\xbc\x49\xae\x0b\x32\xa9\x8b\xb7"
- "\x90\xbd\xab\xc3\x82\x3f\x4f\x19\x23\x1e\x47\xe3\xd7\xf1\x6d\xd3"
- "\x21\xe5\x18\xcb\x6d\xe1\x2d\xe0\x4d\xdd\x0e\x0f\xf2\x64\xa0\xfd"
- "\x90\x61\x8f\xab\xf5\xa7\xbc\x2b\x4e\xcb\x76\x19\xe6\xb1\xd8\x77"
- "\x1e\x2f\xd6\x3b\x1a\x8a\x99\xd6\x96\xe9\xc8\x87\xf6\x98\x50\xd6"
- "\x60\x6a\x8f\x82\x76\x6e\x46\x3d\xdd\x01\x6d\xaa\x6d\x23\x9b\xdb"
- "\x4f\xd8\xc0\x29\x4c\xf7\xd2\x29\xb4\xe3\x14\x33\xd9\x72\xc1\x7f"
- "\x3d\x4c\xfc\xa2\xfd\xd5\x41\xa9\x0c\x58\xfa\x8e\x8c\x57\x29\xfd"
- "\xaf\x0e\x6d\x65\xef\x7e\xe4\xf3\xb1\x4a\x7e\xab\xa3\x0b\xe6\xd1"
- "\x38\x12\xbe\x56\x69\xcd\xe8\xc4\x98\xa1\x3d\xed\xa5\xf8\x46\x67"
- "\x42\x9c\xa8\x4f\xe1\x18\xb2\xa9\x8d\xc2\x3d\xc5\x6b\xa1\x33\x66"
- "\x3a\xbc\x97\xc1\x41\x33\x2a\x1f\xfc\xdc\x54\xba\x12\x0d\x43\xda"
- "\xa7\xbe\xce\x92\xf0\x8d\xed\x24\x7f\x57\xe4\xba\xf4\xcf\xbd\xce"
- "\x46\xf6\x0d\x53\xde\x63\xbd\xe1\x37\xe9\x32\xa9\x3c\xb4\x2d\xa6"
- "\x95\xbd\x77\x2c\x78\x8e\x99\x05\x96\x49\x1c\x7c\x6f\x17\xe9\x0a"
- "\xfb\xf8\x5d\xc1\xc3\x91\x3d\x42\x1f\xdf\xab\xd0\xea\x81\xdf\x17"
- "\xd8\x11\x69\x75\xef\x3b\x1d\x0e\x44\xf6\x56\xd6\x9a\x4d\xc2\x9e"
- "\x30\xaf\x64\x13\xf0\x02\xbc\xc2\x01\x13\xed\x3b\x60\xed\xdc\xde"
- "\xc1\x16\x6f\x61\x91\x79\x27\x49\x2f\x34\x91\x1d\x28\x4b\x64\x5b"
- "\xcf\x90\x9f\xa7\x84\x98\x17\xce\xa0\x2f\x55\x0c\x21\x9e\x94\x74"
- "\xae\x7c\x71\x82\x71\xed\x26\x8d\x87\x3f\xf0\x51\xce\x59\xa6\x97"
- "\x31\xba\x0f\xd4\x8f\x35\x73\xcf\x06\xbd\x92\x51\x46\xbe\x83\x63"
- "\x76\xd4\x93\xef\x60\xcd\x1f\xaf\xe0\x7d\xac\x98\x73\xed\xa6\x81"
- "\x6b\x16\xb1\x91\xe4\x43\xdc\xe0\x92\xbc\x9c\x5c\xaf\xab\x68\x3f"
- "\xc4\xa8\xfa\xe8\x35\x4a\x1f\xbd\xef\x8d\x23\xfb\x6c\xf5\xf9\x68"
- "\x2f\x64\x18\x51\xee\x22\x16\x5f\x76\x86\x25\x10\x1f\x94\x76\x4c"
- "\xf2\x6c\x24\x17\x4e\x6c\x33\x70\xef\x3f\x13\xd8\x96\x56\xbf\x8f"
- "\x71\xd7\x62\xf2\x4b\xce\x4d\xbd\xd9\x1a\xaf\x8d\x13\x7b\xef\xc2"
- "\xbf\x25\xe9\xe4\x71\xcf\x36\xac\x67\xe1\x07\xc8\x8e\xaf\x5c\x9e"
- "\x5b\x3a\xe0\x91\xb6\xb1\x9d\x85\x55\xe5\x9a\xef\xe5\x5e\xf7\x96"
- "\x6d\x52\xde\x51\x22\x20\x7f\xb9\x3a\xed\xd2\x6f\x60\x55\x8b\x63"
- "\x95\x12\x20\xe3\x54\x7d\x48\xcf\x28\x8d\x7c\x31\x25\x0b\x5a\xbe"
- "\x6f\x24\xb9\x47\x95\x19\xdf\x31\xfb\xd2\x24\x0f\x23\xec\x93\x4d"
- "\x72\xaf\x0c\x6b\xd3\x90\xce\xc2\xf7\x47\x6a\xeb\x19\xad\xeb\x52"
- "\x37\xfc\x7e\xb2\x53\xff\xcf\xfa\x8b\xd4\xcf\xa8\xda\x53\xd3\x3e"
- "\x47\x32\xf2\x5b\xb4\xf5\x4d\xec\x77\xae\x1c\x76\xcf\xe2\x65\x6c"
- "\xf8\xcf\xaf\x88\x64\xb4\x57\x86\xbc\x2d\x72\xdd\x7d\xbf\xd4\xaf"
- "\x4f\x4f\x16\xf4\xa6\x73\xc5\x42\xc6\x20\x7f\x7d\xd2\x8f\x78\x9b"
- "\xe6\xb7\x4f\xae\xbf\xef\xbf\x19\xf0\x9d\x06\xdf\x3a\x8a\x6f\x90"
- "\xbd\x36\x95\x2f\x79\x93\xf7\x57\x8b\xb3\x67\xc8\x27\xd7\xd7\xf7"
- "\x57\x5f\x84\x17\x4b\x20\xfa\x2a\xaa\x3c\xe9\x68\xfb\x4a\xd2\xd7"
- "\xca\xc2\x46\x6d\x60\xa6\x77\x72\x9d\xe1\x43\xa4\x5f\x5c\x43\x13"
- "\xfb\xe0\x7a\x7a\x4e\x63\xdd\x7e\x23\xe9\x03\x3f\x78\xce\x41\xeb"
- "\x76\x77\x6a\xd4\x24\x92\xf5\x05\x2f\xfe\x41\xe6\x0d\x78\x0f\x69"
- "\x31\xfb\x4f\xb9\xc3\xd7\x66\xb3\x91\xd2\xff\xe1\x07\x42\xde\x70"
- "\x5d\xfe\x4c\xe7\x0f\x63\x99\xe9\x87\x1b\x58\x42\x67\xe1\x07\x65"
- "\x4e\x7d\xab\xb4\x25\xa1\xef\xaf\xdf\xe7\x22\x1f\xea\x6f\x74\x39"
- "\xfb\xc9\xbe\xfa\xcb\x6d\xb8\x4f\xf0\xdf\x7f\xf0\x89\xba\x97\x52"
- "\xef\x64\x7f\x49\xda\x76\x4a\xda\x9d\x0b\xfd\x92\xed\x15\x8b\x7f"
- "\xaf\xfe\x2f\xb7\xc9\xba\xfc\xe5\xb6\x03\x16\x46\xba\xf3\xc3\x5b"
- "\x85\x3f\xe4\xbf\x40\xe6\x78\x7f\x82\xaa\x8f\xa9\x17\xe3\x8a\xf8"
- "\xdd\x22\x92\xc1\xbe\xb2\xaf\x41\x3e\x5a\x27\xc0\x1f\x25\x4b\x1e"
- "\xfe\x95\x62\x05\xe3\x27\xa0\xfd\x3b\x48\xdf\x18\x12\x13\x5f\x62"
- "\x4c\xbc\xb3\x6e\x47\xb5\xb0\xfd\x58\xb7\x7f\x1c\xae\x91\x7c\xdd"
- "\x6f\x2c\xb8\x46\x61\xcc\xe5\xe3\x4a\x63\xcf\x8a\x6b\x2c\x9e\x27"
- "\xd2\xb8\x84\x0c\x6b\xa2\xb8\x70\xed\xd1\x3b\xec\xbd\x9d\x21\x22"
- "\xda\x38\x56\x3d\xca\xa4\x7d\x5b\xf5\x70\x8a\x09\x36\x79\x0b\x63"
- "\x8b\x3d\xbc\xcb\x7c\x35\xf9\xf5\xaf\x1e\x9e\xb7\x85\xf6\x9d\xff"
- "\xe2\x0a\xde\x77\xae\x36\xe2\x6f\x0a\xfe\xb6\xe3\xef\x30\xfe\x86"
- "\xfb\xff\x3e\x34\x76\x16\x56\x0f\x07\x1d\x05\x8f\xd5\x37\x4c\xac"
- "\x16\xbe\xb5\xd6\x92\x5c\x14\xfd\x9c\x4d\xb6\x77\x5f\x39\xee\x23"
- "\x79\xf4\x3e\xa7\xda\x5e\x1b\xee\x8d\xe6\x3c\xac\x6b\xd1\xa0\xc9"
- "\x30\xb4\x39\x7a\xff\x38\x6a\x2f\xd5\xb7\x3d\xfa\x37\x96\xc0\xf3"
- "\x53\x54\x26\xb5\xdf\x15\xfd\x0a\x95\xc7\xf8\x8d\x29\x3e\x7a\xaa"
- "\x74\xa2\xb3\x25\xfa\x76\x94\x21\xf9\x20\xe4\x47\x19\x5a\x7e\x1f"
- "\xed\x87\x91\x2f\x31\xf4\x29\xf2\x41\x26\x8e\xd4\xce\x66\x75\x16"
- "\x7e\x18\xf9\xee\x3c\xb9\x9f\x41\xef\x76\x04\xbc\x4b\xfe\x42\x42"
- "\xbd\x8f\x6f\x46\xca\x6f\xfe\xc6\x72\x9c\x55\x5f\xa5\x7e\xf7\x02"
- "\xdf\x99\xbe\xf3\x8f\xd7\x80\xbf\x2b\x73\xd2\x39\x22\xe2\x87\xee"
- "\x70\x0c\xef\x60\x8e\x32\x05\x6b\xfe\x2b\xe5\xc9\xb9\xdc\x7e\x9c"
- "\x7d\xb8\xaf\xce\xdd\xd2\xc7\xf5\xf0\x43\x61\x7b\xc7\xbb\xf2\x99"
- "\x23\xe7\x26\x61\xcb\x7e\x8a\x1d\x3c\xe9\x70\x89\x33\xba\xf4\xfb"
- "\x08\x3d\xa7\xfd\x66\x5a\x1b\x20\x63\xfb\x7c\xd3\x2b\xc8\xbb\x95"
- "\xd2\x91\x46\x7e\x04\xb6\x05\x3c\xe3\xeb\x77\xec\x94\x73\xea\xe0"
- "\x0e\xe2\x2d\x44\x7d\x3d\xf7\xdb\xa9\xce\x8a\x6d\xc7\x4e\x6a\x43"
- "\x1e\xe4\x3f\x8a\xc7\x47\x73\xc2\x9c\x45\xba\xc2\x83\x05\x18\x77"
- "\x5c\x59\xb7\x63\x67\xdf\xda\x70\x50\x9c\x3f\xce\xf3\xf0\x53\xae"
- "\xe8\x1d\xa4\xe7\xd6\xaf\xcd\xed\x17\x99\x52\xc6\xed\xed\x31\xaf"
- "\x94\x77\x16\x1e\xdc\xfe\xae\x55\xf6\x4d\x1f\xcb\xdd\xae\xb5\x7d"
- "\xab\xda\x76\xa4\x89\x3d\xaa\x51\xa5\xd2\x67\x3f\xee\x1b\x7b\xd5"
- "\x59\xa1\x9f\x89\x1f\xc0\xda\x70\x5e\xd2\xe2\xd0\x48\xdf\xda\xd0"
- "\xa7\x7a\x1c\x1a\xf9\x0d\xbe\xd1\xad\x7e\xc3\xf6\x2d\xbf\x61\xbb"
- "\xd8\x37\xe4\x5e\x73\xcd\xf0\xbe\xcb\x8e\x87\x44\x8c\x64\xe0\xa7"
- "\x4d\x62\x66\xed\x1a\x2f\xe4\x37\x8f\x11\x72\x16\x78\x1b\xb2\x2b"
- "\xa5\xf8\x05\x1e\xdb\x73\xb6\x5a\x6b\x17\xb3\x67\x7d\xcc\x9a\x59"
- "\x8d\xf0\x61\x53\x9b\x49\x32\xdb\x3e\x67\xf7\xfa\x57\x5c\xdd\xfa"
- "\x43\xf3\x88\xde\x5b\xd0\x0f\x9b\x03\xc6\x59\x5d\xc7\xc7\xcc\x91"
- "\x4e\xfa\xd5\x7a\xd2\x6b\x3b\x81\x0f\xe5\x0a\xb0\x01\x3c\xba\x57"
- "\xd0\x03\xfc\x8b\x94\xb7\x5e\x2b\x16\xf2\x96\x4b\xf8\x39\x1d\x2c"
- "\xe2\x12\x14\xbe\x10\x4f\xba\x6f\x6f\x77\xaa\xb9\xb3\x90\x4d\xa1"
- "\x78\x05\xa4\x77\xe6\xc6\x94\xfc\xc9\x9e\x30\x2e\xe4\x29\xf0\xfe"
- "\x14\xaf\xc0\xd1\xe1\x64\x5e\xf0\xd1\x65\xe7\x58\x6c\x19\x78\x4f"
- "\x60\xb6\x91\x70\x7d\x9b\x1a\xb3\x60\xcd\x39\x7f\xcc\x82\xad\xa4"
- "\xeb\x69\xc0\xef\x73\x2c\xdc\xbb\xee\xb5\xe2\xcd\xe7\x58\xfc\x96"
- "\x2c\x96\xb0\x99\x74\x79\x27\x24\xef\x23\xec\xc0\x29\x7e\xc1\xb3"
- "\x09\xb4\x97\xe0\xe7\x7d\xe8\x4c\xb9\x1f\xb7\xc2\x85\x0e\xa4\x4f"
- "\xf4\xae\x15\xeb\xa0\xc7\xb6\xa3\xda\x63\xdc\x3f\xae\x7b\xfd\x6f"
- "\xc0\x2f\xd4\xac\x06\xfd\x22\x43\xf5\xad\x66\x4f\xb2\x21\x20\xe6"
- "\xc4\xbb\xf1\x12\xdf\x51\x56\x7d\x6f\x63\xc2\xbb\x39\x95\x8d\x6a"
- "\x63\x89\xf2\x3c\xe3\x00\xac\x89\x75\x63\xc8\xfe\x2f\x77\x3e\x33"
- "\x79\x37\x4f\xd3\xe5\xbd\xcc\xc2\x1c\x9e\x64\x46\x7f\xb9\xa7\x79"
- "\xcb\xa8\x79\x2c\x91\xf6\x1f\x68\xaf\xc4\xbc\x5c\xe4\xef\x17\x9f"
- "\xc3\x82\xfc\x38\xcd\x5f\xb6\x68\xce\xe8\xc4\x5f\xce\x36\x3f\x3d"
- "\x67\xd1\xfc\xa5\x33\x16\xcd\x66\xe3\xa4\xd9\x84\x70\x21\xbd\x8c"
- "\x6c\x26\x96\xce\xc9\xcc\x30\xcf\x5c\xb2\x68\xd1\xec\x05\x99\xe6"
- "\x89\x29\x53\x2e\xf4\x23\xb8\xd9\xb4\x5d\xf8\x8d\x15\x36\x74\x8e"
- "\x63\xfc\xff\xfc\xe4\x5c\x49\x16\x0b\x37\x14\xdc\x3b\xd5\xe0\x19"
- "\x67\x96\xb1\x8c\xea\x23\xc9\x6e\x95\xe7\xa5\x96\x4a\x3e\xb5\x7e"
- "\x80\xe4\xed\x1f\x48\x92\x67\x2b\xea\xa5\x4e\xa6\x73\xdc\x70\x39"
- "\xa7\x1c\x57\x84\x65\x32\xfa\x3d\x9f\x7e\x1b\x32\x59\xb1\x7d\x18"
- "\xed\x87\x3b\xae\x10\xf9\x36\x4f\xd0\x69\xf9\xb4\x3c\xf2\x79\x9d"
- "\x38\x0b\xb1\x55\xf8\xd4\xac\x4b\x06\x7d\x62\x3a\x0b\x1d\x89\xce"
- "\xf0\x51\x4e\x75\x7f\xbd\x45\xda\xeb\xd5\x47\x92\x5f\x3d\xfe\x7f"
- "\xae\x3c\xa7\x96\x93\x81\xef\x0d\x42\xde\x69\xe8\x83\x66\xd5\xae"
- "\x6f\x44\x93\x5a\x2f\x69\x77\x5a\xf7\xb0\xb4\xef\x70\xe4\x07\x9c"
- "\xeb\x16\x67\xf3\x69\x6d\x54\x79\xd2\x4e\xb5\xbc\xed\x1a\x26\x20"
- "\x7f\x05\xf8\xba\x71\x7d\xc7\x42\x87\x94\x7f\x82\xfc\xa5\xa8\x74"
- "\xda\x6c\x7a\x05\xf8\x30\xbc\x95\xd5\x95\xf6\x1c\x2f\xbe\x1e\x1c"
- "\xbf\x60\xe6\xb3\xf3\x2d\x33\x32\xe7\x3c\x35\x67\xde\x9c\xcc\x65"
- "\xe2\x38\xf9\x48\xf1\xef\xbe\x6b\x67\x4d\xed\xe9\x03\x7a\x24\xe9"
- "\x58\x54\xdf\xb1\x1d\x64\xd3\x20\xf5\x5c\xf5\x5b\x3c\x85\x6c\x44"
- "\xdf\xea\x5d\x2f\x6c\x04\xcb\x84\x1f\x83\xfa\x5d\xe0\x07\x9d\xea"
- "\x7e\x47\x9b\x4a\x7b\xf1\xbc\xdd\xb8\x3f\xd1\x3c\x8c\xdd\xd1\xc4"
- "\x0e\x4f\xa0\x7d\x2e\xd0\x2f\x9f\xd6\xc3\x92\x6c\x5a\xb7\xd0\x0b"
- "\x9e\x9b\xd4\x38\xaa\x1f\xbd\x45\x34\x20\x9e\x10\x34\xd8\xde\xc4"
- "\x3e\xba\x46\xd0\xe0\x6b\xd3\x76\xe1\xc3\xe0\x6b\xd3\x2b\x34\xb6"
- "\xa8\xce\x0a\x4f\xdd\xcc\x79\xea\x4b\xca\xd7\x19\x9b\xf9\xd7\x19"
- "\x2f\xf9\xfd\xcf\x7d\xb4\x1a\xef\xee\xc2\xbb\xeb\x28\x3e\x4c\xc9"
- "\x29\xb6\x8b\xf6\xbf\xe9\xde\x90\x69\x64\x5e\xe3\x2b\x56\xaa\x8f"
- "\xa3\x25\x51\xf0\xdb\xcd\xc8\xef\xe8\xb8\x89\x81\x97\xcc\x17\x67"
- "\x23\xc5\x7e\x1d\xf8\x3d\xbc\xe7\x40\xbd\x1c\x2d\x5d\x24\x13\x5b"
- "\x15\xf0\x7c\x68\xef\x5e\xac\x9f\x76\x2a\x97\xda\x2c\xce\x27\xc7"
- "\x71\x67\x67\xe1\x47\x3b\x9d\xac\xce\xaa\xf2\xa6\xc2\xde\x82\x68"
- "\x10\xdc\x9f\x1f\x09\x3f\xc6\xa0\xf1\xe5\xdc\x36\xba\x54\xf6\xe9"
- "\x47\x5f\x50\xda\x84\x66\xfe\xb5\xff\x5c\xfc\x47\x67\x71\xdf\x8d"
- "\x3f\x85\xdb\x6e\xaa\x0c\xd8\x57\xc6\xb3\x8f\xa5\x7f\xf5\x38\xee"
- "\xb2\x64\x53\x7c\xed\x8f\xaf\x97\xe3\xe6\xa6\x3f\xb9\xf2\x32\xc2"
- "\xf0\x8e\x97\xce\x71\x4a\x5a\x7e\x3c\xde\xb1\xea\x94\x66\xa7\x81"
- "\xef\x7f\x7c\xc2\xfe\xb4\x87\x89\x78\xcf\xcd\x1e\x61\xf7\xa7\xfa"
- "\x2a\xd0\x29\x85\xf5\xb1\x64\x2f\x0e\xd9\x8e\xf6\xa2\x85\xaf\xf5"
- "\xce\xc2\x8f\x73\x7c\xe7\xc4\x8c\x92\xdf\x23\x9e\x8b\x62\x60\xd1"
- "\xd8\x27\xfe\x8d\xea\x44\x63\x1f\x65\xef\xa4\x3d\x6a\x39\x07\x3e"
- "\xde\xf3\xed\xe6\xc0\xc7\x42\xff\x8b\xb2\xc6\x71\x7d\x1e\x1f\xb5"
- "\x9a\xa5\x0b\x1b\x02\x4f\x07\x9d\xbf\x0d\xc7\xba\x91\x29\xf1\xe4"
- "\xf0\xb5\xc2\xce\x24\xab\x8d\xd6\xb8\xfc\x6d\x5d\x2c\x4a\xb1\xa5"
- "\x58\x89\xcf\xae\xcd\x11\xb6\x17\x91\x78\xaf\x82\x6c\x33\xc8\x96"
- "\x6e\x88\x88\xb1\xf6\x31\xdb\x76\x96\x85\x37\xb3\xbf\x8e\xa1\xbd"
- "\x20\x3f\xad\xff\xfa\x3c\xed\xfd\xf1\xf5\x89\x89\x86\x1c\x7d\x31"
- "\x95\xa1\x9c\x3b\xe9\x7b\x8f\x62\xf9\xd2\x7b\x4d\xec\xaf\xf3\xc5"
- "\x7b\x94\x97\x7c\x35\xe5\x1a\xa7\x81\xcf\xaa\xa6\xfc\x1e\xdc\x6f"
- "\x55\x8c\x53\x38\xd6\x03\x6f\x96\xa7\x02\xcf\xa6\x2a\xb6\xdf\x58"
- "\x90\x96\x2a\xf6\x20\xba\x4d\xb4\x37\x89\xf1\x55\x80\xb5\xf8\x2b"
- "\xbb\xa8\x0f\x9d\xc9\xcd\xc4\xda\x29\xe4\x92\xbf\xbe\xbb\xf5\x04"
- "\x0b\xb7\x3c\x4d\xfd\x79\x58\xe8\x5a\x31\xf6\x54\xfe\xee\xf0\x23"
- "\xed\xeb\x93\x2c\xed\x18\x9b\x1d\xfa\x48\x76\xc0\x44\xb6\xe4\xfb"
- "\x13\x0f\x98\xba\xd0\x3f\x87\x87\x03\xeb\xd4\x98\x2e\xf2\x3d\x6d"
- "\x4c\x86\x99\x8c\x93\xf0\xfc\x0e\xcd\x1e\x49\x1b\x8f\x4e\xf6\xd7"
- "\x58\xa2\x1b\xc6\xb1\xb3\x6e\x9e\xdf\xa7\x69\xbb\x3c\xbf\x06\x99"
- "\xe2\xb0\x45\xb3\xb1\xf3\x9e\x53\x6a\x50\x0f\xf2\xcf\x61\xf5\x66"
- "\x29\x8d\xb4\x77\x3e\xe9\xac\xc2\xc9\xb6\x9f\xce\x69\x90\xdc\x33"
- "\xd9\xca\xdb\x49\x8e\xa3\x33\x51\xb4\x6f\x4e\x67\xc6\xb7\x40\x0e"
- "\xa6\x3a\xa0\xac\xbd\xda\xd9\xf1\x35\x48\xa3\x3a\xd0\xb9\xa7\x92"
- "\xb9\x62\x4e\x92\x6e\x23\x4a\xec\x1d\x84\x3d\x73\x62\x52\x07\xca"
- "\x3c\x25\xf6\xbc\xda\xb7\xaa\xe5\x90\x5f\x9f\xce\xc2\x4f\x98\x56"
- "\x86\x42\x76\xb2\x8b\x84\x3d\x9c\x53\xbe\x2f\xed\x84\x26\x75\x28"
- "\xe2\xbc\x0a\xbd\x2f\xed\x77\x3e\x19\xe3\xb3\xb5\x14\x67\x48\x3e"
- "\x19\xab\xf9\xfd\xc1\xef\x29\xbe\x33\x70\xa0\x69\xbb\xed\x15\x6b"
- "\x07\xb0\xa0\xc3\xb6\xc3\x8e\x67\xf3\x80\x44\xbb\x2e\xaa\xcb\x20"
- "\x7f\x01\x4b\x98\x5e\x89\x49\xd9\x4e\xbe\x20\xe8\x6c\xa7\xb4\xef"
- "\xfe\xa4\x56\xf5\x0b\x11\x76\x8a\x7d\xf2\xbc\x7f\x0f\xdd\xab\xea"
- "\x7f\x3f\xe9\x90\xf2\xc7\x27\x1d\x42\xff\xbb\xfe\x95\xf4\xff\xc9"
- "\x76\xeb\x2b\xb2\x9d\x7a\x69\xf3\xf8\x49\x8b\x93\x1d\x1d\xee\xb7"
- "\x79\xfc\x64\x27\x95\x15\x9a\x5f\x1c\x6f\x93\x65\xfe\xed\x33\xc1"
- "\xfb\xf9\xe4\xf9\xbf\x9b\xc5\x77\x57\x0e\x4b\x57\x88\xf7\x8b\x79"
- "\xae\x9c\xec\x9b\x1c\x96\x33\xa4\x07\x8e\x90\xba\x05\x99\x47\xb5"
- "\x67\xbc\xac\x35\xf8\x3e\x86\xee\x25\xcd\xfe\x66\xd5\xf6\x94\x4a"
- "\xf4\x0a\xc5\xeb\xe2\x79\xe5\xc0\x46\x4b\x87\xf0\x47\xe0\x00\x2f"
- "\x49\xb1\xae\x2d\x8b\xe8\xcc\xe0\xdf\x76\x93\x9f\x02\x39\x37\xff"
- "\x2e\xf0\x5a\x29\xbc\x8b\xe7\x91\x3c\xe5\xa2\xd8\x20\x67\x18\xf2"
- "\x45\x23\xdf\x91\xaa\x9c\x36\xb2\x0f\x9b\x47\x71\x1f\x9b\xd5\x6f"
- "\xbb\xa2\xc7\xdb\x7e\x18\xc5\xd2\xf1\x4d\x8c\xcf\x57\x27\xf4\x1d"
- "\x37\xfe\xd6\x76\x31\xde\x5a\xf2\x7a\xc9\xac\x37\xf9\x9c\xf4\x2f"
- "\x37\xe2\xfb\x13\xb9\xa8\xff\x11\x8f\xde\xcd\xba\xf5\xfd\xf9\x4f"
- "\xf2\xad\xcc\x53\xd8\x9f\x7b\xb3\xd1\x5f\xed\x26\xc8\x6f\x35\xac"
- "\x4e\xda\xcc\xd0\xbe\xbf\x21\xb7\x83\x9f\x71\x78\xf6\x90\xfe\xdf"
- "\x85\xbe\x02\x6e\xfd\xfd\x23\x87\x67\x1f\x23\x3b\x66\xc2\x9b\x26"
- "\xf6\xf7\x7d\x54\xaf\x1b\x2d\xf9\xec\x86\x53\xe2\x79\x8e\xe4\xfb"
- "\xfe\xde\xa0\x5e\x77\x92\x3f\xce\xc0\x3a\xdd\xb7\x64\xc1\x4c\x72"
- "\xea\x7a\xc3\x84\xd9\x59\xb3\xe7\x99\x1f\x26\x97\xaf\x3d\x6c\x12"
- "\x23\xfd\x71\xc1\x1a\xb6\xd3\x5a\x4a\xbc\x37\xc5\x07\xbb\x58\x6c"
- "\x30\x2d\x2e\x18\xe6\x5c\x3c\xe9\xab\xbf\xcb\xd8\x60\x1a\x6f\x4d"
- "\x71\xc1\xfc\x7b\x37\x47\x66\xf9\xe6\x80\xf2\x4e\x27\xdd\x8b\xf5"
- "\xbb\xf0\xef\xcd\x34\x8f\xe4\xfa\xd2\xd0\x18\xe8\x33\x47\xf2\x56"
- "\x05\xf9\x48\xef\xd0\xce\x76\x62\x2c\x46\x75\x16\x1e\x09\xf7\x9f"
- "\x25\x39\x62\x04\xdd\xa4\xfd\xb1\x91\xf2\x1e\x31\x6b\x36\x0e\x6a"
- "\x0c\x68\x61\x93\xa1\x14\x5d\x11\x2b\xf5\x8a\x47\xae\xdd\xaa\xf4"
- "\x8f\x94\x7b\x5a\x47\x26\x68\x67\x95\xe4\xdc\x7c\x47\x9d\x9b\x47"
- "\x66\x5d\xcc\x0e\xc5\x3f\x37\x8e\x94\xfb\xe7\xf5\xe7\xda\xbb\xe5"
- "\x97\xb2\x61\x51\xe5\xbb\xa1\xad\xec\x1f\x6f\x92\xae\x51\x9e\x4d"
- "\xfe\xc7\x16\x2a\x4b\xfa\x9d\xf8\xc7\x32\xf5\x37\xbe\xf1\x8f\x19"
- "\xea\xef\x2b\xf1\x7b\xbc\xfa\x7b\x18\x7e\x8f\x56\x7f\x63\xce\xfe"
- "\xe3\x0a\xf5\x77\x2c\x7e\xeb\xd4\xdf\x58\x3b\x3e\x3d\xa1\xfe\x8e"
- "\xc3\xef\x8f\xd4\xdf\x57\xe0\xf7\x5b\xea\x6f\xcc\xc1\x4f\x85\xbf"
- "\x65\xd4\x3d\xf2\x38\xfb\x74\x4d\xdf\xe5\xcd\x4f\x53\xe5\x9e\xf3"
- "\xa7\xa5\x58\x43\x92\xe5\xda\xe3\x4b\xdb\x85\xbe\xf1\x68\xf4\x45"
- "\xfa\x14\xfa\x0e\xd2\xab\x9c\xac\x6a\x57\x40\x7a\xb2\x9a\xbf\x11"
- "\x38\x67\x0d\x48\x1f\xa3\xa6\x03\xff\x0e\xd5\x07\xa4\x27\xc8\xf4"
- "\x7f\x44\x61\xae\xb3\x80\x74\xd5\x47\xfc\x3f\xe2\x9d\x6c\xbf\x33"
- "\x20\xdd\xa8\xa6\xdf\xa1\xd9\xdf\xa8\xe9\xe1\x6a\xfa\x54\x27\xfb"
- "\xa3\xcd\x9f\x7e\xc4\xad\xa6\x03\xff\x8f\x58\x02\xd2\x7d\x67\x5a"
- "\x44\x7c\xb6\x1c\x9a\x5b\xff\xb0\x39\xd9\xde\xfc\x80\x3c\x4e\xf5"
- "\x5d\xf0\x7f\x7f\xde\x19\x90\x7e\x58\x4d\xb7\x3b\x75\x83\x02\xcb"
- "\xac\xee\x0d\xab\x74\xa5\x2c\xbd\x37\x9d\x3c\xc9\x2f\xc2\x0e\x59"
- "\xf0\xd4\x8d\x5e\x3a\xfb\x64\xd8\xc2\x9b\xcc\xb9\x9c\x37\xb1\xc6"
- "\x66\xd5\xee\x36\x83\x6c\x20\xe5\x39\xb2\xc6\x1a\xd5\x87\x80\x4b"
- "\x9c\x2d\xcb\x16\x69\xc2\x17\xf1\x28\x6b\xbe\xf4\xcf\xab\xc5\x7a"
- "\x20\xdd\x94\xba\x6f\x8f\x3c\xcb\x48\x57\x4f\xe5\x90\xfe\xda\x91"
- "\xd9\x25\x7d\x37\x43\x86\xa5\x34\xd2\xd1\x10\x3d\x02\x75\x51\x12"
- "\xf7\x1b\xbd\x4a\x17\x9d\xdf\x94\x7a\x2c\x9a\x8b\x94\x9f\x6c\xcd"
- "\x02\xf3\x3a\x59\xa3\xd0\xbf\x85\x99\xa2\x77\x74\x16\x36\x36\xfa"
- "\xcf\xcd\x34\x8e\x51\xd3\xb7\x23\xbd\x23\x20\xdd\xdc\x3b\xb6\x03"
- "\xef\x8c\x89\xd6\xee\x73\xbc\xc3\x73\x8e\xbb\x4b\x8e\x4a\x9b\x73"
- "\x60\xdd\xd5\x5e\x5b\x62\x31\x9d\x2b\xa1\x98\x8a\x9e\x2c\xee\x22"
- "\x7b\x46\xa4\x0f\x9a\xd4\xe1\x02\x8f\xd1\xc9\xd7\x3c\x45\xb6\xab"
- "\x67\x19\xed\xab\xe6\xb5\x51\x7c\x2e\x03\xa7\xf3\xca\x2b\x4e\xb2"
- "\x28\x3a\x77\x42\xb6\xe9\xb4\xe7\x39\x31\xc3\xc5\x6a\x33\xbc\x6c"
- "\x2b\xca\xde\xf2\x94\xc6\x5f\x7c\xb6\xc1\x7f\x26\x36\x91\xf6\xa1"
- "\xaf\xce\x13\x31\x64\x3f\x7b\x9f\xea\x6a\x28\x20\x7b\x80\xfd\xa9"
- "\xfc\x3d\xe2\x8d\x77\x54\x18\x0a\x98\xd9\xc9\x3e\xab\xc7\xef\x72"
- "\xf9\x87\x67\x48\xef\xad\x4d\x72\x2e\x1f\x8d\x92\x58\x93\xe8\x96"
- "\x78\x71\x34\x8a\xff\x37\x9d\xb3\x38\x4a\x3a\xe8\x54\xf0\xe1\xa9"
- "\xa1\xde\x5f\xb1\x85\xe9\xbb\xd7\x83\x37\x39\x55\xa9\x97\xf8\x74"
- "\xd4\xa3\xe8\x23\x0b\x48\x4f\x2e\xe2\x47\xae\x4f\xd9\xb3\x6b\x81"
- "\x5b\x5f\x9b\xdd\xcc\x96\x5f\xc1\x4c\xd3\xdc\x7a\xca\xb3\x62\x48"
- "\x26\xf9\x10\x7e\x25\x1d\xfc\xac\xfe\x0f\x78\xbe\x7f\x41\xa5\xde"
- "\x23\xf8\x95\xa3\x1e\xa1\x5b\xb5\xa5\x14\xd3\x1a\xe2\x68\xf0\x12"
- "\x2f\x1e\x05\x5e\xdc\x0a\xfc\x8f\xf4\x2e\xcd\x88\xf1\x2c\xce\x18"
- "\xb4\x65\x11\x8b\xf2\x2e\x4e\x88\x7d\xe1\x1c\x4b\xd2\xd6\x9f\x2d"
- "\x59\x58\x53\x3a\x4d\x03\xd7\x62\x4d\x21\x9d\xcd\x10\x9d\x51\xec"
- "\x21\xd3\x6f\x45\xff\x6e\xdb\xd6\xac\x8b\xc7\xc2\xf5\x2e\x4d\x10"
- "\x7e\x15\xa8\x2e\xa1\xda\xba\xfa\x25\x16\xee\x55\xcf\x5f\xe6\x1e"
- "\x63\x71\xe0\x9f\xf5\x43\xce\x72\x7b\xeb\x3c\xa6\xa7\xf8\xa1\xb9"
- "\xb3\x85\x5e\xb4\x5f\x6d\x86\x87\x39\xac\x9f\xb2\xdc\x45\xd4\x47"
- "\x9f\x3f\x44\x7c\x1a\xd9\x22\x23\xbf\xb1\x95\x7d\x3e\xc3\xe0\xc6"
- "\x9a\xe1\x06\x4f\x3e\x97\x64\xe0\xcf\x97\x48\x3f\x0e\x9f\x57\xd2"
- "\x79\x49\xfb\xa2\x7b\x28\x6d\x5d\xde\x31\x61\xf3\x33\x4f\xce\xad"
- "\xcf\xe7\xd1\x7d\x1e\x9d\x07\x8d\x19\xb7\xe7\xf5\x2e\x77\x3f\xa9"
- "\x7b\xfb\x5c\xf5\x29\xfd\xca\x14\x29\xdb\x7d\xde\xeb\x3e\xa6\x62"
- "\x1b\x53\xca\x29\x76\x5a\x19\xf1\xaf\xdc\x29\xf6\xe7\xe9\x6c\xbc"
- "\xf5\x2e\x3b\x3f\x67\x53\x7d\xf6\x38\x47\x2b\xeb\xc6\x94\x4a\xbf"
- "\x7a\x4e\x21\xe7\x49\x5d\xfd\x98\x9d\x72\x6f\x62\x4c\xa5\xd4\xd5"
- "\x8f\xa9\x5e\x39\x8c\xce\x02\x38\x13\xdb\xa3\xc7\x34\xe0\x1a\xde"
- "\x1e\x33\xb1\xb2\xf7\xf5\x68\x74\xb5\xf9\x6a\x16\x4b\x7b\x44\x69"
- "\x5e\xe9\x57\x52\xce\xe1\x2f\xc6\xf0\x75\xe2\xd9\x88\x26\x0b\x0b"
- "\x93\x32\xa4\xb3\x60\x54\x19\x33\xa3\xae\x83\xb9\x71\x8c\x55\xd8"
- "\x2c\xda\xc6\x14\x3b\xda\x28\x2e\x8c\x97\xc9\xbd\xbc\x2f\x92\x79"
- "\xf4\x18\xab\x9a\xff\xa3\xba\x36\xb4\xc1\x38\x66\x9c\xc3\x7d\x52"
- "\xe5\x09\x9d\x18\xfb\x63\xc6\x71\xdb\x98\x54\x79\xae\xfa\x8b\x6b"
- "\x34\x5c\x95\x63\xf4\x8b\xa1\x92\x6e\xa3\xab\x25\xdd\xbe\x48\x56"
- "\xd7\xab\x11\xf4\x1b\x6b\x77\xa2\xb4\x3d\xf9\x22\x4a\xe3\x91\x9d"
- "\x6a\x1e\x7a\x07\xed\x75\x49\xac\xfd\x62\x24\xfa\xad\x4a\x3e\x77"
- "\x0a\xdd\x1a\xda\x87\x35\xcb\x99\x41\xed\xea\x0d\x5b\x05\x2d\x72"
- "\x58\x18\xea\x9c\x41\x76\xda\xc4\xa7\x38\x3a\xee\xb2\x3b\x44\x1f"
- "\x34\x7d\x48\x76\xf9\xf4\x1d\xf2\xab\x43\xb8\x89\x32\xc3\xa9\xbc"
- "\x80\xfa\xef\xd6\xea\x42\xdf\xa3\x67\x68\xeb\x38\x21\x57\xa3\xcd"
- "\x94\x87\xfa\xf5\xb8\x85\x74\x76\x67\x41\x33\xb2\x7f\x6b\x6a\x20"
- "\x9a\x48\x9a\x35\xed\x51\x65\x7a\xb5\x1f\x9a\x5e\x0d\xa6\x87\xbc"
- "\x57\x8c\xc0\x86\x45\x64\x07\xd5\xd4\xa0\xd2\x4f\x8d\x69\xd0\x24"
- "\xce\xa9\xab\xcf\xee\x0c\x78\xf7\x2a\x5f\x5e\xd4\x9b\x78\x23\xb2"
- "\x29\xa0\x3d\x26\x39\x5e\x9b\x32\x02\xde\xcb\x48\x3b\x4d\x3c\x72"
- "\xe2\xb8\x95\x9b\x44\x8c\xb8\xc4\xce\xc2\xa6\x1c\x3f\xbd\x65\x39"
- "\x21\xbe\x71\xb5\xf6\x0d\xe4\xb9\x43\xab\x27\x7e\xab\x6b\x70\x93"
- "\xdd\xdf\x27\x5f\x38\xb5\xf7\x48\x7f\x83\xfb\xd5\x14\x6f\xb1\x17"
- "\x3f\xf4\x3a\x07\x56\xf7\x3a\xcf\x5d\x76\x31\x1e\xd9\x97\x49\x64"
- "\x63\x0e\xba\x66\xc8\x31\xf4\xe5\x70\xb9\x16\x7e\x29\xfc\x82\xd1"
- "\x3e\xa1\x8c\x4b\xf2\x65\x22\xca\x9d\x20\xbf\xf7\xa5\xea\xff\xf1"
- "\x4b\xc8\x7f\xce\x3b\x7a\xca\x75\xf7\xcc\x98\x65\x9e\x32\x5a\x9c"
- "\x2d\xbd\x61\x89\x85\x8e\x8d\xce\xf2\xdf\x04\xf3\xdc\x46\xbf\x2f"
- "\xaf\x2f\x6d\x3e\x5f\x5e\xb6\xf1\xea\x79\xcb\x2f\x1b\xf9\x39\xbe"
- "\x81\xce\x7d\xf0\x2c\x5e\x5a\x82\x3e\xcc\x3b\xcb\x2e\xa7\x38\xb2"
- "\xb9\x16\xfe\x15\xf9\x79\x03\x5e\x1e\x06\x7e\x34\xe4\x9e\x65\xfd"
- "\xc9\xa6\x88\xf0\x87\xf4\x5e\x3c\x1a\xe9\xeb\x52\x1a\xfc\xe7\xcd"
- "\xbe\x3a\x4c\x67\x24\x79\x5e\x2a\xc5\x01\x17\x71\x38\xc8\xbe\xfc"
- "\x38\xfb\x6a\x0f\xf2\xb5\xe1\x59\xe6\x1a\xa1\x4b\x18\x9b\xe8\x35"
- "\x8e\x5f\x9d\x77\x92\x45\x88\x98\x62\x56\x37\x33\xcf\xa5\x73\x49"
- "\xcd\x77\xf2\xe8\xb1\x89\x48\x1f\x22\xd2\xdd\xf8\xf6\xba\xb1\x89"
- "\x78\x36\x04\xcf\x96\xe1\xaa\xa0\x0c\x6b\x09\xea\x9d\x7b\x92\x5d"
- "\x8d\xba\xb4\x70\xdb\xd8\x44\xd4\xf3\x78\xde\x7c\x16\x57\x67\x69"
- "\x21\xf9\x0e\xe5\x39\x65\xac\x34\xbc\x8b\xf7\x6a\xd1\x2e\x2b\xe9"
- "\x44\x70\xcd\x59\x83\x6b\xae\x97\x0d\xc9\x5d\x81\x75\x6f\x05\xbe"
- "\x4f\xe7\x37\x51\x0e\xf9\xda\x90\x75\x41\xdb\x48\x87\x86\x72\x57"
- "\xb4\xf1\xe3\x28\xbb\xa5\x16\x92\x9d\xc3\xda\xe0\x2b\x53\xe5\xa9"
- "\x31\xbf\xbf\xda\xcd\xd7\x4f\xac\x47\x9d\x4a\xc9\xee\x1a\x69\xc0"
- "\xe4\xaf\x76\xfa\xf9\xe1\xaf\x5e\x55\x7f\x0f\xf0\xe5\xcd\x4b\x65"
- "\xb9\xe7\x99\x49\xd8\x0e\x2c\x0d\x03\x1e\x7f\x95\x44\xfe\x9e\xfc"
- "\x65\x1e\x7b\x93\xca\x5b\x8d\xf2\xf2\x66\xb3\x01\xc0\xea\x48\xd4"
- "\x91\x62\xaa\x7e\x21\xe8\x24\xe6\xd8\xb1\x3d\x68\x8b\x8d\xda\xa4"
- "\xa0\xef\xd6\x60\x3e\xa0\x3d\x3a\xb4\x67\xc0\x0a\xaf\xef\x4c\x2a"
- "\xb5\x29\x9a\xe4\x39\x6a\x97\xec\xc7\xb1\x13\xd0\xae\xa9\x2b\x32"
- "\xf8\x17\x68\x5b\x4b\x6d\x46\x03\xc3\xda\x63\xa8\xb3\xd4\xd3\xf9"
- "\x87\x2f\x24\xdd\x5a\xc8\x7e\x74\x02\xda\x39\xd5\xef\xbf\xf4\x2b"
- "\x8a\x39\xd5\x80\x7a\xad\x56\xdb\x49\x69\x23\xfd\x3c\xfd\x57\x37"
- "\xa8\xbf\x07\xfa\xf2\x5e\xd0\xce\xe3\xe5\x01\xed\xa4\xf7\x3f\xa1"
- "\xf2\xd4\x76\x0e\x44\x3b\x07\x5c\xd8\x4e\x8c\xa7\x2c\xbe\x4a\x6d"
- "\x67\xb1\xda\x4e\x3d\xda\x39\x10\xed\x1c\x16\xd0\xce\x98\x1e\xed"
- "\x9c\x82\x76\xa6\xa2\x9d\x4d\x01\xed\x34\x86\x68\xe7\x14\x27\x7d"
- "\x63\xdd\xd8\x54\xe9\x07\xeb\xcb\x29\xf2\x9c\xf7\xf1\x4a\x9f\x9f"
- "\x89\x73\xbc\x82\xce\x31\x2a\x59\x7c\x0f\xe9\x6f\x48\x6f\x44\xb2"
- "\x1e\x9d\x65\x4c\x5b\x56\x9c\x2f\x74\x37\x71\x52\x0f\x2d\xf9\xab"
- "\xe3\x1d\xbe\x73\x17\x9b\x44\xac\x08\x79\x4e\x91\xce\x3e\x2e\x62"
- "\x42\xf7\x38\x79\xd9\xd2\x3c\x7a\x9f\xde\xed\x2c\xfc\x2a\xde\x7f"
- "\x3e\xec\xb8\xd4\x99\x83\x7e\xf4\x9b\x7c\x3e\x49\x7d\xfe\x97\xe9"
- "\x52\x9f\xff\x95\xcf\xff\x05\xe8\x52\x45\x74\x11\xe7\x36\xc9\xae"
- "\xd2\xcb\x8a\xd3\x3c\xc5\xda\xf9\xeb\x36\xe4\xcd\x09\x38\x7f\xdd"
- "\x26\xea\xd0\x25\x7c\x1c\x2c\x9d\xec\x59\xca\xe5\xb9\xdc\xaf\xca"
- "\xfd\xdf\x3e\x66\x56\xbf\x5d\x4f\xbf\x5d\xd2\x07\x19\xe9\xd8\xcc"
- "\xd2\x56\xe6\xab\x1a\xcd\x3e\xc5\xc9\x9a\x23\x69\x2e\x87\x8e\xab"
- "\xf0\x55\x47\xb0\xcf\xa3\x96\x2a\xf2\xeb\xde\x59\xd8\x12\xe5\x3f"
- "\x53\xdd\x62\xba\xd4\x99\xea\x3c\x17\xfa\x09\xf3\xcd\x22\x62\x04"
- "\xb7\x40\xc6\x1d\xbf\x5a\xc6\x26\x68\x79\x93\xea\xd9\xc4\x5a\xc8"
- "\x17\x82\x41\xee\xe5\xb4\x2c\x51\xb1\xb9\x65\xb2\xd7\x63\x70\xe2"
- "\x9b\xc2\x87\x92\xff\x7e\x1e\xf9\x84\x40\xbe\x1d\xd2\xa7\x73\xcb"
- "\xac\x1e\xf9\xe9\x79\x7e\x8f\xfb\xe4\x1e\xf7\xe6\x0e\x60\x56\x6f"
- "\x76\x38\x6b\x86\x09\x1d\x6f\xf1\x90\x02\x66\xc9\x3b\xc1\xc2\x30"
- "\x16\x8f\x51\xdd\xea\x5a\xc4\x19\x3d\x03\x2f\x4c\x64\x8e\x16\x8f"
- "\xe4\xdb\xc1\x2f\x35\xc5\x23\xcf\x09\x16\x47\x67\x44\x28\x76\x03"
- "\xf2\xb7\xca\x78\x0d\xad\x13\xa7\x2d\x19\xc8\x94\x5f\xa6\x0e\xe2"
- "\xfa\x99\x26\xb2\x03\xd8\xdd\xe5\xa4\x98\x07\xba\xdc\x17\xd9\x70"
- "\xc2\x29\x8c\xe1\x66\xae\x9f\x45\x7e\xc6\xda\xfe\xa7\xab\xa5\x9f"
- "\xc3\xf3\x29\xb3\x00\x3f\x5b\x59\x6b\x72\x78\x0e\x0b\x5f\x7b\x9c"
- "\x19\x31\xce\x3c\x07\x3c\x49\x4c\xf3\x69\x50\x16\x23\xcf\xca\x97"
- "\x61\x4c\x2e\x36\x71\x77\x67\xe1\x89\x32\xc8\xb5\xd3\x34\xfd\xc5"
- "\x6a\xe9\xd3\x2c\x1c\xdf\x1f\x20\xfc\x2f\x48\xfe\x00\xb4\x3d\x71"
- "\x44\x9e\x11\x8d\xfd\x29\xde\xa9\xf7\xcb\x36\xad\xd3\x24\x0d\xc7"
- "\x57\xc8\x75\xa4\x75\xda\x01\x50\x75\x95\xb4\x67\x8a\x45\x5e\x8f"
- "\xcf\x9e\x49\xe8\x04\x5b\xa7\xa1\x0f\x2b\xa4\xdc\x33\xbe\x22\xcd"
- "\x1b\xa9\xce\x71\x4a\x4f\x1c\x47\xef\xe2\x3d\x83\x8c\x2b\xd7\x9a"
- "\xe4\x1f\x6b\xad\xa4\x6b\xd5\xa1\x4d\x18\x3f\x27\x32\xa9\x5d\x44"
- "\x93\x0e\xe1\xbf\xec\x84\xf5\xc0\xf6\x5e\xe2\x8e\x18\x13\xdd\x1e"
- "\xa1\x5f\x7a\x25\x15\xe3\xe9\x24\xfa\xe0\x32\xf2\xe1\xe4\xc0\x77"
- "\x6a\xb7\x76\xb1\x5a\x53\x3b\xab\xc3\x6f\x3a\xb7\x60\x9f\xfb\x25"
- "\x6b\x36\x87\x5e\xcb\xc1\x0f\x58\x51\xe7\x62\x2a\x8b\xb0\x86\x6c"
- "\x3d\xc9\xd7\x5e\x1d\xb8\x36\x47\x33\x13\x65\xd4\x2a\x2d\xac\xd6"
- "\x4a\x32\xec\xfe\xd4\xba\xad\x9f\xb2\x3a\xd3\x5f\xc5\x77\x88\xdf"
- "\xb6\x2f\x6a\xbf\x58\xd9\xa5\x28\x7b\xa7\x5a\x76\x1b\xca\x8e\xed"
- "\xbd\xec\x1d\x15\x7d\x2c\xbb\x0f\xf5\xde\x51\xde\x97\xb2\xf3\x4a"
- "\xb9\x17\x38\x3c\x18\x6b\xbc\x95\xfc\x90\xd2\xf9\x54\xef\x39\xf2"
- "\xbd\x32\x82\x4b\xfb\xf9\xb6\x5b\x08\x6f\x84\x6d\xc7\xba\x94\x4c"
- "\x71\x76\x95\xf4\xec\xea\x99\x55\x87\xe7\x18\x23\xbd\x7b\x67\x61"
- "\x9b\xd9\x2f\x8b\xfa\xf6\xb5\x21\x0b\xb4\x8d\x95\x76\xd2\x29\x99"
- "\x72\x6c\xfd\xf3\x3c\x95\x15\x5a\xe6\x1c\xbb\x5d\xda\xdb\xb7\xad"
- "\xd0\xf4\x5b\xed\xd1\x63\xb7\xab\x65\x99\x7b\xea\x4d\x55\x87\x39"
- "\xe6\xd9\xd6\x4c\xf3\xd2\x45\x73\x32\x67\x6b\x87\xab\x07\xb2\x87"
- "\x67\xcf\x9c\x3d\x27\x6b\xf6\x2c\xf3\xd4\x25\x8b\x16\xdc\xf0\xec"
- "\xd3\x4f\x9b\x27\xce\x5e\xbc\x78\xc6\x2f\x67\x0f\x64\x53\x17\xcd"
- "\x58\xb0\x78\x0e\xe9\x36\xcd\xe6\xb1\x37\xa7\x65\x3c\x9b\x79\xc3"
- "\xcf\xc6\x26\xf6\xd0\x6d\xd2\x59\xeb\x46\x92\x71\xb0\x3e\xc5\x81"
- "\xc7\x88\x26\xff\x3b\x86\x65\xdc\xbe\x1c\xf2\x35\xc6\x60\x2b\xad"
- "\x85\xb4\xfe\x90\xec\x45\x7e\x7c\xc9\x37\xf0\xe6\x4d\xbc\xfe\x38"
- "\xe3\xb7\x80\x6f\x6f\x40\x1a\xf9\xe1\x6d\xe4\x5d\x79\x2e\xea\x03"
- "\xa4\x47\x23\x4f\xd5\xaf\x91\xe6\x8a\x1e\x5f\xb1\xf6\x28\x0b\x97"
- "\x3c\xc6\x49\x1b\xd7\xf7\xe7\xab\xc9\xa7\xee\x97\x26\xa6\xfa\xea"
- "\xd6\x3b\x9c\x6e\xb2\xff\x89\x9c\xec\xc9\xe3\x84\xa9\x72\x7e\x9d"
- "\x5c\x27\xe9\x32\xa6\x54\x9e\x43\x50\x4e\x93\x8c\xb8\x52\xc4\x39"
- "\x3b\x09\xfc\xff\x3c\xd2\x8f\xd5\xe7\x34\xde\xbc\x01\x74\x5f\xda"
- "\x84\x7b\xe9\x53\xe4\x64\x4d\xb0\x6d\xd7\xd7\xbb\x18\xeb\x8e\x95"
- "\x7f\xf4\x4e\xb7\x59\xfe\xd1\xef\xc0\x3f\xe5\xb0\xfc\xeb\x99\xfe"
- "\xaf\xfe\x69\xdf\xff\xb6\xef\x77\xda\x2e\xfe\xf7\x4d\xbe\x2f\xda"
- "\xfd\x3d\xb6\xff\x5f\x79\xbf\xb3\xf4\x62\x7f\x34\xde\x30\xb6\x1a"
- "\x7f\x7d\x94\x45\x62\x7c\x6e\x58\xf3\x14\xc6\xf4\x67\xcc\x94\xe3"
- "\xe1\xcd\x79\x4f\xb2\xe1\xb9\x27\xc0\x83\x81\xd7\xca\xb4\xf2\xe6"
- "\xdc\x73\xa4\x97\xe8\x9c\x83\xf1\x5b\x59\xd2\xc4\xa2\xd6\x34\x81"
- "\xcf\xca\x94\xf1\x31\x68\xbf\x89\xce\x68\x39\x70\x5f\x93\xe5\x66"
- "\x87\x5c\xa7\xc9\x1e\xd2\x5e\x97\x0e\xec\x69\x64\x8c\xc6\x6f\x54"
- "\x3a\x8b\x2d\x8b\xe3\x7b\x79\xe1\x0b\xb1\x5c\xff\x42\x38\xd2\x0e"
- "\xbf\xa1\x24\xf7\x7b\x23\xbb\xba\x9f\xf9\x29\x5a\xe7\x5d\x0f\xa9"
- "\x63\xf3\x88\x3c\x83\x78\x4e\xd8\x9c\xa9\xbe\x94\xb1\x3e\x75\x3e"
- "\x22\xd7\xf4\xce\x6b\x55\x7d\x1e\x7e\x9f\xfb\x90\x7e\xa3\x1d\x95"
- "\xbc\x70\xa6\x89\xca\x7c\x5d\xa9\xec\x47\x6b\xe6\x1b\xd9\xc9\xfd"
- "\x72\x66\x30\x7d\x9d\xb3\x95\x1d\x00\x16\xd2\x5e\x38\xe6\xdd\x2e"
- "\xcc\xb3\x8a\x2d\x71\xdc\x86\xfa\xad\x06\x3f\x57\x8c\x3a\xed\xec"
- "\x2c\x74\x41\xfe\x6b\xad\x50\x79\x39\x3b\xe6\xc5\xae\x35\xc8\x33"
- "\x79\x09\x1b\xb1\x06\xf9\xc0\xdb\x15\x93\x8c\x22\xeb\xd7\xf1\x16"
- "\x68\xb0\x07\xdf\xac\x37\x4f\xa7\xfb\x33\x82\xc7\xa0\x6f\xa3\x1d"
- "\xe6\x26\x76\x46\xc8\xfc\xf4\x0d\xed\xbb\x9d\x85\xa7\x81\x7f\xff"
- "\xcc\x50\xf7\x18\x6d\xb2\x9c\xd3\x13\xe4\x7c\x4d\x11\x31\xfb\xd4"
- "\x33\x5e\x9e\x35\xd9\x58\xd7\xbb\x58\x24\xbe\xb1\x01\xdf\xb0\x1b"
- "\x0a\x18\x37\xd0\xf9\xe0\x46\x0f\xe4\x1a\x45\xb5\xbd\x3d\x33\x5a"
- "\x7d\x57\xf0\x21\x82\xf7\xf0\x82\xbf\x17\xfa\x19\xf0\x1f\x19\xc0"
- "\x09\xf0\x1c\xe2\x6c\x05\xf8\x0d\x4a\xc7\x37\x36\xa0\x5d\xf5\x90"
- "\x9b\xf7\x60\xed\xa6\x18\x7f\x91\xd3\xcf\x3e\xc0\x44\xbc\x72\xf0"
- "\x0b\x8b\xad\xdc\x2d\xe3\x97\x9d\xae\xd1\xf8\x05\x1a\x1f\xc4\x23"
- "\xac\x99\xce\xc2\xbb\xd1\xc7\x18\x23\xd5\xe0\x3f\xc0\xd3\x9f\x89"
- "\x54\xfb\xa6\x5a\xf0\x05\x6a\xdc\x56\x89\xe1\x67\x86\x62\x7d\x8f"
- "\xc2\x37\xaa\x21\x39\x0a\x5a\x48\x0c\x3a\x13\xaf\xad\xf5\x32\xf6"
- "\xf8\x99\x48\x0e\xac\x03\xdd\xf6\x8c\x4c\xd7\x31\x27\x3b\x3d\x0f"
- "\x7d\xb1\x87\xf2\x92\xff\x0c\xe4\x9f\x0a\x7e\xec\xb0\xda\x27\x8d"
- "\x90\x09\xc0\x07\x9c\x6e\xa4\x7a\xe0\x9d\x1a\xd0\x9a\xfa\x62\xb5"
- "\x8a\x63\x87\x25\x0f\xd3\xb1\x44\xa3\x3d\xfa\x7a\x95\x9f\xfe\x67"
- "\xca\x03\xe9\x0f\x5a\xac\x52\xfb\xf2\x9a\x80\xbe\x83\x5c\xda\xee"
- "\x26\x3d\x34\xbe\xb7\x57\xea\xd0\xce\x1c\x21\x1f\x67\x18\x33\x7b"
- "\x41\x8b\xbd\xc8\x57\x49\xd8\xbc\xf2\x28\x30\xf7\x29\xe2\xa1\xda"
- "\xbf\x90\x3c\x6a\x7b\x3e\x8d\x61\xdc\x8b\xd8\x7d\xcd\xec\xb4\x93"
- "\xca\xc3\xfd\x43\xb8\x82\x97\x6d\x1f\x9f\x57\x46\xf1\x44\xc7\x8e"
- "\x23\x1f\x64\xb2\xaf\xc7\x8e\xeb\x2c\x6c\x4f\xd2\xce\x2f\xd1\x18"
- "\xa0\xbe\x47\x1b\x9d\x52\x4f\xd1\x9e\x44\xba\x46\xf1\x5e\x77\x06"
- "\xd5\xb1\x91\xe6\xa7\xf6\x1c\xe9\x2d\xe4\x1b\x36\x80\x36\x4e\xb5"
- "\x4f\x2a\x65\x6c\xbe\xf6\x23\x6a\xdd\xf6\xe0\x3e\x12\xf7\xd2\x6e"
- "\xaf\x3b\x23\x6c\x2d\xbd\x93\xeb\x7f\x87\xe6\x0f\xc6\xb2\x01\x79"
- "\x3e\xc2\x95\x6b\x79\xc9\x3f\x3c\xea\x91\xfa\x82\xf0\xd1\xd5\x6e"
- "\x69\xef\x4e\xd0\xe3\xbb\x6e\x7c\x57\x4f\x63\x83\xc6\x85\x56\xc6"
- "\x5a\x49\xa3\x5d\xe8\x3f\x31\xbe\x0e\x78\x2a\x41\xf7\x0e\xf0\xff"
- "\xff\x70\x49\xfe\xae\x3d\x55\xad\x9f\x5d\xc6\x8c\x68\x2b\xde\x2a"
- "\xfd\xe9\x50\xbe\x64\x9f\xbc\xe3\xe3\x33\xdb\x53\x69\xec\xa1\xac"
- "\x1a\x75\x4c\x18\x90\x2f\xc3\x37\x86\x84\xaf\x82\xf6\x16\xe2\x35"
- "\xd5\xfa\xd3\x9c\xfa\x42\xd2\xee\x4c\x31\x8d\x01\xf0\xf1\x15\xea"
- "\x5c\x73\x12\xaf\x2a\xc7\x61\xc7\x2e\xad\x0c\xe9\xef\xa0\x3d\x49"
- "\x41\x19\xda\x58\x09\xc4\x06\xe4\x85\x7c\xd6\xea\x1b\x37\x1a\x16"
- "\xa8\x38\x15\xad\xf2\x21\xa9\xe8\x1b\xf2\x4b\x6e\x17\xfe\x9e\xc4"
- "\xb8\x3c\xdb\x7c\xa0\xc3\xc3\x7e\x4d\xe3\x72\x3a\x61\xc2\xd9\xbb"
- "\xdb\x63\x26\x3a\xfd\x63\xfb\x6c\xa2\x36\xb6\x03\xfa\x55\x8c\xed"
- "\x55\x02\x8f\xce\x42\x5e\x4d\x9c\xa0\x8d\x7d\x9a\xe7\x0a\xe6\xf5"
- "\xda\x2c\xb1\x3f\x60\x20\x7d\xa0\x98\xf7\xee\x36\x21\x63\x50\x7f"
- "\xd6\x59\x9b\x85\x2f\xf8\x95\x0a\x8b\xac\xeb\x38\x46\xfa\x91\x56"
- "\x9a\xff\xda\x1c\xa7\xbe\xc1\xb7\xec\xe4\xaf\x7f\x15\x30\x90\xe6"
- "\x60\x07\xea\x44\x31\xea\xc9\xf7\x59\xd5\xb4\x64\xb6\x18\x7d\x7b"
- "\x20\x9d\xfa\xed\x6c\xbd\x76\x5e\x62\xad\xc4\x80\x28\x75\xbc\x88"
- "\x3a\xf6\xa0\xab\x41\xd2\xf5\x5c\x78\xf0\xfc\x6e\xdf\x4e\xf3\x3b"
- "\x90\xae\x44\x53\xa2\x2d\xf2\xa2\xfd\xff\x8c\xd2\xe8\x1a\x40\xd3"
- "\x97\xd5\xf1\xa8\x62\xeb\xb9\x90\xd8\xba\x56\xc6\x46\xa8\x5c\x49"
- "\x6d\xc1\x9a\x42\xdf\x17\xb1\x7f\x54\xd9\xa7\xca\x45\x63\xea\xdc"
- "\x06\x27\x9b\xb5\x53\xc3\x31\xd4\x47\xf8\x9b\xa3\xbe\xd2\xb0\x83"
- "\x74\x65\x6a\xdd\xed\x5a\x7f\x50\xbd\x03\x31\x01\xeb\x8d\x38\xdf"
- "\xe7\x6f\xf3\xb9\xd3\x78\x2f\x86\xb0\xcd\xcf\x5f\x75\xb2\xe0\xb6"
- "\x9f\x6b\xa1\xb6\xd3\x98\xb0\x64\x91\xbe\x4c\xae\x65\x4e\xe6\xca"
- "\x0c\xc6\x2b\xd7\x1c\x69\x97\x21\xf9\x31\xc2\x7b\xcb\x74\x99\x9f"
- "\xd6\x37\xe4\x17\xba\x79\x75\x3d\x24\x5e\x8d\xd2\xd2\x55\x1a\x34"
- "\x22\x7f\x15\x9d\xc1\x26\x3f\x3c\x83\x1a\xa5\x2c\x08\x8c\xde\x4b"
- "\x31\x22\x90\xcf\x5c\x07\x39\xc0\x13\xc1\x58\x99\xca\x6f\x12\x4e"
- "\xf0\xa5\xa9\x83\x96\xb6\xb0\x01\x96\x9f\xf1\x2f\x8f\x33\xf7\x55"
- "\x98\x47\x6e\xf2\x0b\x89\xb2\xcd\xc7\x59\x97\x17\xdf\x8d\x55\xaf"
- "\x26\x5c\x8f\xe1\x7a\x05\xae\xb5\xb8\x5e\x89\xeb\x9b\xc8\xaf\xa8"
- "\xf9\x13\x71\xbf\x05\xe9\x37\xab\x57\xd4\xd1\x4d\xfb\xd9\x53\x7e"
- "\x4d\x7c\xe5\x74\x91\xbe\x90\xee\x71\x9d\xa1\xb6\xbb\x46\xce\x6d"
- "\xf7\xdd\x28\xc7\x4a\xf9\x68\x5d\x43\x9a\x05\x79\xae\xa5\xb2\xc9"
- "\x27\xc2\x71\x76\xfe\x48\x00\x7f\x8a\x72\xce\xd3\xd9\x8c\x31\x78"
- "\xef\x43\x5c\x33\x71\x5d\x43\xe5\x82\x06\xf5\x7e\xbc\x38\xed\x9c"
- "\x65\x95\xfd\xe9\x64\x1d\xd3\x68\xbe\x6b\x78\x40\xe3\x29\x28\xdf"
- "\x34\x99\x4f\xca\xaf\xee\xbd\x5a\xdf\x79\xe4\xb8\xb5\x78\xd0\x77"
- "\x28\xff\x6e\x7a\x1f\xd7\x14\xf5\x9a\xac\x5e\xef\x55\xaf\xf7\xab"
- "\xd7\xb1\xea\x75\x9c\x93\xb9\x57\xab\xbc\x09\x68\xe6\x26\xfb\x3e"
- "\xda\x93\x52\xbf\x7b\xde\x4e\xf2\x35\xf0\xff\x96\x76\x8a\xf7\x56"
- "\x78\x7e\x8c\xa6\xb7\x26\xdd\x4f\x77\x61\xdb\xff\x6c\x16\xba\x9f"
- "\xf3\x13\x02\xb0\x30\x3f\x4a\x97\xcc\xc0\x3b\x45\x94\xe9\xb9\x6a"
- "\x4f\x73\x7e\xbb\x5e\xdd\xaf\xa7\xb8\x27\x14\xc7\x8e\xfc\xf1\x09"
- "\x39\x2a\x7a\x1f\xe9\xfb\x1b\x85\x4e\x7f\x1d\xf9\x17\x1a\xbf\x0a"
- "\x7f\x36\xc8\x14\x1b\x34\xbc\x27\x79\x49\xf5\xbb\x59\x85\x6f\x55"
- "\xfa\xe5\xfc\xf3\x19\x72\x6f\xf3\xf2\x64\xa4\x07\xc8\xff\xe7\xe3"
- "\xa9\xce\xa0\x75\x03\xda\x33\xa6\x89\x9d\x77\xe3\x7a\x53\xb3\x6c"
- "\x73\xa2\xd6\x66\xb5\xaf\x2c\x1a\xcd\x9b\x99\x7b\x03\xf0\x70\x11"
- "\x8d\xef\x26\x1f\x2e\xbb\x37\xd0\x55\x1d\x3f\xe8\x67\xf7\xbd\xd4"
- "\xdf\x01\x78\xd2\xe0\xc7\xe9\xae\xa9\xc1\xfd\x72\x66\xaa\x47\xf2"
- "\x0b\x0d\x98\x97\x34\x06\x86\xf7\x98\x97\x14\xb3\x3e\x46\x7d\xd7"
- "\x16\x8c\xf1\xe7\x5a\x08\xe3\xd5\x3a\x62\xdc\x76\x7a\xa8\x6f\x9c"
- "\xac\xcb\xa2\xae\x49\x0d\x58\x23\x6f\x41\x7a\xb3\xac\xa7\x4c\x57"
- "\xbf\x85\xf1\xd7\x49\xfe\x50\xaf\xd4\xd2\xd5\xf1\x4d\xe5\x1c\xa6"
- "\xbe\xd6\xd2\xd5\xf2\x31\x4e\x3b\x6b\x68\xfe\x68\xe9\x72\x4c\x9e"
- "\x8d\x27\xbc\xa1\x77\x3d\xc2\x96\x11\xf2\xf7\xf4\x2a\xd4\xbb\x7b"
- "\x0a\xf8\x0b\xf2\x51\xdf\xb8\x32\x9b\x45\x2d\x2d\x65\x83\xe5\xdc"
- "\xec\x5e\xa8\xbd\x2b\x75\xfa\xdd\xb3\x34\x8c\x5a\x2b\xf0\xec\x6c"
- "\x43\x30\x56\x2a\x3a\x5e\x68\xf0\x78\x8c\xe3\x73\x6a\x3d\x63\x04"
- "\xe6\x62\xde\x97\xe1\xbd\x32\x27\x5b\x6f\x57\xd7\x92\x1a\xb9\xa7"
- "\xd2\xfd\x51\x6d\xb9\xc4\x2e\xb5\x6c\x1f\xfe\x05\xf0\x21\x02\xeb"
- "\xe9\x5b\x54\x16\xd6\x15\x63\x47\x5e\xea\x20\x89\xdf\xdd\x2e\x27"
- "\x1b\x14\xaf\x61\x2b\xad\x4f\x06\x1d\xb3\x94\x4c\x97\xeb\x93\x42"
- "\x3a\x30\x4b\x87\xf0\xa7\x56\x67\x69\x63\xb4\x6e\x92\x9f\xeb\xb4"
- "\x65\x03\xc9\xdf\x54\xea\x71\xe6\x3d\x06\xfe\x6c\xbb\xba\x37\x03"
- "\x39\xd7\xbb\x91\x64\x59\x95\xae\x98\x4f\xde\x65\x6a\xbf\x34\xa2"
- "\x3e\xdb\x09\xdb\x57\x66\xc9\xd8\x41\xa4\x0f\x12\xb1\xa6\x88\x67"
- "\x35\x71\xb7\xf4\xd9\xef\xc9\x0f\xd0\x71\x95\xcb\x79\xd2\x3d\x5b"
- "\xc4\x62\xb0\x8d\xcf\x91\xfa\x44\xef\x60\x99\xee\x71\x49\x3b\x04"
- "\xe1\x4f\x93\xee\x1b\xc3\x4c\x71\xaf\x48\xbd\x70\xdb\x7e\xc9\x8f"
- "\x78\x02\xe3\x3f\x0b\x5a\x4b\x7f\xbe\x9e\x16\xff\xbc\xf0\xec\xa5"
- "\x77\xf0\xee\x5b\x9d\x85\x5e\xa6\xa5\xcb\xb5\xe6\xf4\x61\x55\x67"
- "\x96\x3f\xa8\x20\x99\x01\x9b\x23\x36\x17\x6a\xf3\xd7\x9b\x2e\xbf"
- "\x2f\xe7\x2f\xb5\x91\xc6\x03\xcd\x61\x8f\xf0\x09\xb6\xaf\x9a\xe6"
- "\x32\x7e\xaf\xf2\x68\x73\x57\xf2\x77\x0d\x62\xee\x8a\x79\xeb\xb5"
- "\xf8\xeb\xe1\x4d\x50\xc7\x6a\x63\xfb\x4c\x53\x14\x9e\xad\xc6\xda"
- "\xaa\xee\x65\x79\xa4\x8c\xb1\x6e\x74\xb5\x72\x8e\xbb\x49\x37\x4d"
- "\xfa\x04\xd2\xd9\xa8\xf6\xaa\xb4\x57\xd2\x41\x7e\xce\x6c\x98\x0f"
- "\x7e\xdf\x66\x46\xa6\xf9\x36\x43\x79\x8d\x7e\xdd\xb1\x47\xf3\x0d"
- "\x9a\x83\xef\x95\xd9\x73\xdf\x23\xfa\xdd\x20\xe7\x98\x67\x24\x8d"
- "\x63\x07\xc6\x1e\xd6\x9f\x52\x8a\x45\xdf\x59\xa8\x98\xb4\xb1\x87"
- "\x39\x3a\x0b\x63\xf4\xd5\x0d\x71\xbc\x14\x7d\x4a\x36\xf7\xf3\x70"
- "\xbf\x11\xd7\x59\xf2\xaa\x33\xd2\x55\x1d\xf3\xa5\x78\x17\xf3\x7f"
- "\x60\xb5\xd6\x07\x1d\xd1\x3b\xea\xc5\x18\xcb\x25\xfb\xc6\x44\xb1"
- "\xd7\x4f\x63\x8c\xc6\x97\xd8\xf3\xc7\x58\x33\x14\x3c\xc0\x68\x9c"
- "\x09\x7f\x27\x56\xea\x13\xcf\x1d\x34\xce\x50\x56\xb9\xe6\xdb\xd7"
- "\xc9\x14\x75\xbf\x4d\xd9\xa3\xd9\x81\xd3\x38\xcc\xbc\x86\x0d\x45"
- "\xf9\xe6\x2a\x73\x07\xe9\xce\x3f\x77\x78\xee\x65\x94\x97\x68\x27"
- "\xf1\xf2\xf2\x17\xf0\x4e\x40\xff\x9f\x11\xb6\xac\x07\xa6\x09\x7d"
- "\xe6\x65\x9d\x85\x3c\x3c\x18\x73\x4e\xda\x04\x5f\x89\xf5\xf9\x87"
- "\xb1\xcc\x8c\x71\x8b\xb5\x86\x27\x68\xfc\xf0\xa8\x58\xb2\xb7\x38"
- "\x49\xf5\x23\x19\x1c\x78\x7b\x32\x81\xd6\xe9\x5e\xf4\xce\x63\x48"
- "\x57\x44\x98\x41\xba\x27\xd2\x83\x81\xd6\x87\x8f\xeb\xf4\xaf\xd6"
- "\x42\x92\xe7\xcf\x5e\xe8\xdf\x39\xd7\xca\xcf\x92\x2f\x2c\xf3\x22"
- "\x76\x59\x93\x4e\x4f\x67\x35\x1b\xf2\x4e\x93\x8e\x87\x57\x04\xe9"
- "\x78\xfc\x1e\x95\x62\xf1\x67\xf5\xff\xe9\x22\xd5\xdf\xab\x2e\xfe"
- "\xa7\x33\xcb\xbc\xba\x91\xf8\x4b\x52\x69\xf5\xd7\xce\x22\x16\xab"
- "\xd1\x8a\x30\x85\x30\x96\xec\x6c\x68\x9e\xeb\x3c\x8c\x7c\x1d\xa1"
- "\x9f\x50\xef\x95\x3f\x7e\xd8\x9e\x0d\x99\x56\xc7\xee\x15\x32\x87"
- "\xbe\x8f\x67\xb2\x75\x4c\xf4\xa7\xf0\xa3\xaa\x63\x91\xf8\xf6\x97"
- "\x6b\x4f\xb1\x70\xcb\x22\x76\x15\xe9\xd0\x0d\x5e\x6e\x27\x19\x98"
- "\xc6\x04\x68\x50\xdf\xaa\xd3\x0d\xc8\x5c\xc1\xf4\x78\x3e\xa2\x55"
- "\xc7\xdc\x1a\x2f\x85\x77\x8c\x61\x6e\x16\x4b\x3c\x54\xca\x0a\x36"
- "\x02\xf5\x3f\xac\xf5\x15\xf1\x19\xa4\xc7\xf3\xc5\x75\xd2\x31\x61"
- "\x0b\x40\x3e\xeb\x9d\x44\x37\x0d\xab\x4e\xb1\x28\xdc\xdb\xc3\x3a"
- "\x98\x51\xac\x43\x45\x3a\x8c\xff\xb6\x06\x31\x5e\x74\xac\x11\x63"
- "\xff\xb0\xbf\x9e\xa6\xa1\x01\xbf\x1f\xa1\xf7\x0d\x1d\xc4\xc3\xf5"
- "\x46\x1f\xdd\x6c\x8d\x3e\x74\xee\xc0\x00\xfe\x5f\xf4\xb7\x87\xb7"
- "\xa1\x6e\x35\x96\x6c\x16\xd9\xaa\xd3\x3f\x82\x36\x12\x0f\x50\x2d"
- "\x74\xfc\x3a\xfd\x78\x4d\x4e\x97\xf5\xd6\x0f\x35\x14\x84\x31\xd2"
- "\xcd\x93\xbf\x47\x61\x8b\xf9\xb5\x49\xe8\xe3\x1d\x98\xda\xf6\xdc"
- "\xdb\xe9\x3b\x5f\xa8\x6b\x59\x63\x7b\x9e\x89\x1d\x30\xdd\xc1\xd0"
- "\x0e\xa7\x53\xff\xcf\xbe\xdb\xca\xeb\x74\x4e\x95\xbe\x35\xc2\x56"
- "\x44\xa7\xfb\x1d\xad\x25\xa4\x1b\xc0\x3a\x52\x45\xeb\x75\x67\x91"
- "\xfe\x0e\x6d\xde\x60\x9d\xa8\xc2\x3b\x3e\xbf\x06\xf8\xbd\x8b\x7c"
- "\xce\x08\xf9\x41\xe6\x8f\x12\xfb\x06\x45\x7a\x8b\x8f\xdf\x46\x3e"
- "\x7a\x4f\xd8\x10\xea\x74\xab\xd2\xbc\x3a\xd0\x54\xb7\x8a\xda\x26"
- "\xc7\xa2\xe9\x09\xe4\x2f\xf7\xcd\x5b\xf4\x83\x98\xb7\x6d\x01\xf3"
- "\xb2\x48\x6f\xf7\xcb\xa9\x9c\xce\x16\x9b\x43\xcd\x43\xcb\x10\xac"
- "\x55\xba\xb0\xd1\x6b\xd7\xf2\x72\x9b\x5e\xb9\x67\x65\x09\x8b\xd2"
- "\xad\x06\xd9\x68\x9e\x65\xa5\x0f\x3d\xae\x0b\xbb\xdb\x10\x75\xf9"
- "\x94\x94\xcc\xfe\x3c\xd7\xc4\xf4\x6b\xce\xf4\x8f\xbc\xc6\x7d\x79"
- "\x39\x0f\xfb\xf1\xc3\x13\x33\x69\xef\xdb\xc6\xbe\x9a\xc7\xc2\x52"
- "\xbc\xf8\x76\x14\xb3\x38\x75\xfd\x26\xd0\x19\xf5\x03\x51\xe0\x45"
- "\xf0\x9b\xca\xcc\x29\x63\x91\x39\xcd\xbc\x65\xf5\xd3\xfd\x22\xb1"
- "\xfe\x1a\xb1\x6e\x14\x0f\x8a\xba\xbc\xbc\x1b\x65\xbc\x9b\x2e\xde"
- "\x0b\x69\x93\xa5\xd6\xad\x36\x74\xdd\x2c\x71\xa8\xdb\x67\x7d\xab"
- "\x5b\xc4\x6a\x7f\xdd\x22\x56\xff\xeb\x75\x0b\x9f\x13\x50\x37\xa3"
- "\xbf\x6e\x19\xa8\x5b\xf8\xb2\xbe\xd5\xad\x7f\x8d\xbf\x6e\xfd\x6b"
- "\xbe\x61\xdd\x76\xf5\x5e\xb7\x7e\xfd\x42\xd7\xcd\x7a\xf9\x71\x5d"
- "\xbf\xa1\x7d\xab\xdb\x80\x28\x7f\xdd\x06\x44\xfd\x2b\x75\xcb\x2d"
- "\xe3\xc7\xea\xc0\xe5\x92\x3e\x87\x70\xfe\xb8\x2e\xe2\x8a\x15\xc3"
- "\x85\x1d\x77\x0c\xea\x55\x9b\x57\xc6\xbf\x14\xbc\x8d\xae\x9f\xd0"
- "\xfd\x77\x16\xf5\x2b\xc6\xf8\x95\x76\x25\xba\x08\x2b\xa5\x29\x61"
- "\xc3\x76\xf2\x42\xee\xb9\xb1\x83\x6c\x06\x3d\xe4\x97\x85\x7c\x9e"
- "\x57\xbe\x71\xce\x4d\xf1\x26\xaa\xb7\x9d\x09\x67\x6f\x9c\x73\xe9"
- "\xf1\x6e\x95\xe6\x8b\x55\x7b\xd7\x50\x7a\x31\x3c\xea\x77\x3e\x25"
- "\x83\x19\x08\x8f\xe8\x4a\x71\x23\xd7\xe6\xf6\x8f\x4c\x39\x8d\x75"
- "\xbf\x28\xc2\xa8\x9d\xb5\xd5\xca\x9a\xdc\xd2\x9f\x1b\x72\x58\x18"
- "\x9d\xf7\x15\x7e\x1b\x4d\x2e\x16\x9f\xc3\xfa\x4d\xb6\xa2\x7c\x37"
- "\x4b\x37\x58\x51\x36\xe8\x21\x78\x79\x5d\xc4\x23\x61\xf3\x58\xd4"
- "\x06\x94\x4d\xd7\x14\x53\x1e\x5f\xf9\x22\x0b\xa7\x73\xc1\x74\xbe"
- "\x57\x9e\xed\x8d\x88\xc4\x77\xac\xda\x77\x2e\x41\xbf\x21\x92\x7e"
- "\xfd\x1f\xf3\xd3\xaf\xff\x60\x3f\xfd\x22\x3e\x92\xf4\x8b\xa8\xf6"
- "\xd3\xaf\x7f\x65\xdf\xe8\xd7\x3f\xdc\x4f\x3f\xf9\xee\xc5\xe9\xd7"
- "\xff\xb6\xde\xe9\xd7\x7f\x8a\x9f\x7e\xb2\xac\x5e\xe8\x17\x11\x9a"
- "\x7e\xfd\x37\x7e\x33\xfa\xf5\xaf\xfc\x86\xf4\x1b\x2c\xe9\x17\xf9"
- "\xa2\x9f\x7e\x91\x13\xfd\xf4\x8b\x8c\x96\xf4\x8b\x8c\xf4\xd3\x2f"
- "\xd2\xdd\x37\xfa\x45\x8e\xf5\xd3\x4f\xbe\x7b\x71\xfa\x45\x2e\xeb"
- "\x9d\x7e\x91\x36\x3f\xfd\x64\x59\x7d\xa3\x5f\xe4\x27\xa0\x9b\x51"
- "\xa5\x9f\xb1\x77\xfa\x45\xba\xbf\x21\xfd\x0c\x92\x7e\x03\x8e\xf8"
- "\xe9\x37\x60\x8d\x9f\x7e\x03\x1e\x92\xf4\x1b\x30\xce\x4f\xbf\x81"
- "\x49\x7d\xa3\xdf\x80\x55\x7e\xfa\xc9\x77\x2f\x4e\xbf\x01\x6f\xf5"
- "\x4e\xbf\x01\xf5\x7e\xfa\xc9\xb2\x7a\xa1\x5f\xff\xd0\xf4\x1b\x38"
- "\xf4\x9b\xd1\x6f\x60\xd2\xc5\xe8\xd7\x37\x5e\x63\xa0\x90\x75\xbe"
- "\x83\x72\x36\xf4\x56\x0e\xd1\x90\xec\x13\x95\xa2\x81\x1b\xb6\x2a"
- "\x11\x91\xf2\x0c\xc7\xc0\x09\x90\x61\xee\x6a\xd2\x0d\xfc\x62\xab"
- "\xd2\x2f\x92\x17\xfe\xa5\x52\x29\xfc\x30\x9d\x17\x44\x84\x2b\x05"
- "\xfd\xc3\xc9\x17\x41\xaf\x71\xa8\x75\x83\xee\x0e\xbb\x82\x5d\x4d"
- "\xe7\xf5\x56\x82\x5f\xa3\xdf\x9d\x45\x83\x26\x80\x17\x69\xe8\x49"
- "\x93\x59\x73\x16\x8b\xa0\x96\x8b\x66\xcf\x5a\xb2\x60\xd6\x8c\x05"
- "\x99\xe6\x19\x33\x9f\x59\x1c\xec\x2b\x5e\xc4\x83\x5c\x45\xfd\x37"
- "\xc8\xe7\xff\x8c\x62\x3a\x92\x9f\x3d\xcb\x0f\xd8\x80\x56\xdd\xa0"
- "\x7a\xe1\xbf\x3f\xe6\x81\x31\xbc\x3b\xf5\xa5\xe4\x1f\xf2\x77\x84"
- "\xff\xc0\xee\x8c\x97\x20\x4f\x35\x92\x4f\x18\x75\x1f\xaa\xf1\xb8"
- "\x6e\xf0\x09\x1e\x3d\x29\x9f\x6c\x3a\xc4\xd9\x0e\x5d\x94\x59\xf0"
- "\x72\x85\xbc\x9a\x1b\xc7\x8e\x51\x6c\x93\xf2\xf9\xba\x49\x56\xa2"
- "\x41\x1d\xf9\x6e\xcb\x0a\x1b\xd1\xa4\x33\xec\xe2\xd1\x63\xc7\x70"
- "\xdb\xd8\x24\x75\x8f\x23\x89\xec\x45\x93\xb3\xf9\xe7\x54\x9e\xca"
- "\x0b\x52\x7c\x0e\xbb\xe4\x07\xa3\x66\x1b\x0a\xcc\x61\x94\x97\x7c"
- "\x28\x92\x6f\x41\x2d\x26\x13\xd5\x9b\xf2\x82\x1f\xbf\x0b\xef\xdf"
- "\x45\x31\x29\x7d\x65\xc8\x3a\x5d\x86\x3a\x95\x89\xb6\xd8\x52\x9c"
- "\xed\xcb\x53\x5f\x12\x71\x11\x05\x5d\x0d\xeb\xd0\x06\xa7\x88\x67"
- "\xe9\xf9\x5a\xc4\xb3\x54\xdf\xb9\x0a\xef\x08\x3c\x25\xbf\xa9\xb2"
- "\x0c\xc3\x32\xad\x5e\xe0\xa1\x07\xe2\x7e\x46\xc0\x37\x06\xe1\x7e"
- "\x7c\xc0\xf3\x28\xdc\xdf\x00\x3e\x34\x5a\x7d\x3e\x18\xf7\xd1\xc4"
- "\x97\x8a\x76\x95\xe4\x4b\x9b\x68\xdd\x10\xb2\x8d\x31\xaa\x79\xa2"
- "\x5b\x75\x43\x8e\x10\xaf\xab\x96\x11\x83\xfb\x7d\x24\x33\xaa\xcf"
- "\x63\x71\xff\x32\xed\x0b\xa8\xcf\x87\xe2\xfe\x39\xdc\xff\x48\x7d"
- "\x0e\xbe\x7e\xf0\x5e\x51\x67\xe3\xd8\x91\xd4\x26\xd0\x3e\x9d\xe8"
- "\x0e\x5a\x8f\xe4\xc6\x94\x46\xc8\xab\x79\xd4\x8f\xd4\x4e\x7b\x76"
- "\x2b\x6b\xd2\x0d\xfe\x1d\x9d\xcb\x93\x7d\x35\x29\x5f\xfa\xf6\xd1"
- "\xa7\x22\x9d\xf6\xea\xc2\xc8\xb6\x5c\x59\x37\x29\x9d\x7e\xa3\xae"
- "\xe3\x89\x86\xea\xb7\x20\x13\x0d\x6e\x50\xfb\x19\xb4\x23\xff\xbb"
- "\x2c\x7f\x9b\xda\x17\xa8\x5b\x7f\xd4\xed\x16\x75\xdf\xa3\x78\xb2"
- "\xa7\x5b\x9e\x2f\xd2\x0d\x61\xdf\xca\xdf\x04\xde\x93\xb8\x37\x24"
- "\x59\x8b\xd5\xe7\xd4\x0d\x16\xbe\x22\x68\x7c\x92\x7e\xc5\x15\x9d"
- "\x52\x2d\xfc\xab\x60\x8c\x6a\x63\x85\xc6\x09\x8f\x18\x94\x2a\x74"
- "\x35\x45\x43\x7c\xe7\x7f\xf1\x6e\xa5\x1a\xdf\x80\x49\x39\x61\x48"
- "\xa9\xcf\xbe\x48\x37\x58\xe0\x43\xc0\xb3\x3d\x01\xcf\xee\xd0\x9e"
- "\x09\x1b\xb8\xa2\x21\xf5\x01\xcf\x46\xf6\x78\xd6\x16\xf0\x6c\x78"
- "\x70\x99\x86\xc8\x80\x67\x51\xc1\xef\x19\xe2\xfd\xcf\xa2\xdc\x3d"
- "\x9e\x25\x07\x3c\x6b\x51\x9f\x85\x21\x3d\xd5\xe7\xdf\x50\x17\xd5"
- "\xa0\xa6\x03\xeb\x0d\x96\x80\xf4\x6a\x35\x9d\xbe\x0f\xfe\xef\xed"
- "\x4a\x35\x5d\x8c\x73\x8c\xa3\xeb\xd4\x6f\x6c\x0f\xf8\x46\xa9\xec"
- "\xc3\x94\x6a\xd9\x7f\x51\x46\x83\xce\xdc\x9f\xc6\x94\xa1\x20\x9f"
- "\x62\xe5\xd8\xa4\x2f\x2f\x39\x0f\x45\xbc\x65\x8a\x09\x8b\x7c\xbd"
- "\x61\x63\x48\x1b\xc1\x22\xa3\x49\x3b\xc7\xea\xb5\xa5\xd4\x28\xb6"
- "\x57\x4a\x29\xfe\x1e\xf9\xfc\xca\x6b\x23\xbf\x2f\x5a\xec\xbd\x2e"
- "\xe6\xc8\xec\xcc\x27\x4f\x09\xaa\x9f\x98\x21\xe4\xb3\xac\x4e\xe8"
- "\x77\x4e\xca\xf8\x7b\x74\xbe\x77\x5d\x4a\xcd\xd2\x36\x36\xdc\xf2"
- "\x33\xde\x4c\x72\x9e\xc4\x04\xe3\x6a\xbc\x63\x50\x7d\x39\xbc\x28"
- "\xce\x9b\xeb\x8c\xd5\x94\xe6\x68\x13\x7a\xe6\xc8\xe3\xba\x68\x93"
- "\x78\xce\x53\x5f\x94\xed\x8d\x36\x09\x59\x5a\x3d\x57\x88\x7a\xda"
- "\x7d\xf1\x21\x75\xd1\xc3\xcf\x46\x17\x58\x91\x76\x38\xc8\xbe\x51"
- "\x67\x3c\x49\x65\x52\x3b\x9c\x3a\xa3\x8d\xca\x46\x1e\xb7\xcf\xbe"
- "\x11\xe9\x4b\x3d\x6c\x18\xea\x76\x5c\x2b\xbf\xb3\x28\xda\xe4\xd4"
- "\x19\x84\x5c\x49\x65\x9e\x5d\xf7\x1b\x94\x1b\x3d\xd2\x19\x1e\x6b"
- "\x14\xf6\x91\x45\xd1\x49\x4e\xf6\x41\x54\x6f\xeb\x9f\xd0\x49\x1a"
- "\x27\x95\x72\xdb\xa4\x72\xcc\x79\x9b\x3c\xf3\x3f\xa9\x54\xca\xf2"
- "\xd1\xcf\x91\xfd\x05\xc5\xaa\xa6\x7d\x47\x89\x3b\xd1\xc2\x1e\x82"
- "\xd2\x40\x9b\x9d\xc0\xe7\x72\x31\x06\xfa\x34\x27\xa3\xc5\xfa\xb7"
- "\xf6\x0c\x8b\x2c\x51\x6d\x5e\x51\x4f\x67\x40\x9c\x06\x69\xff\xaf"
- "\x8b\x19\x50\x67\x15\x7b\x4f\xa2\x8e\x3d\xeb\x40\xf5\x45\x59\xab"
- "\x7a\x5d\x4b\x8d\x93\x6c\x42\x0f\xba\x7e\x7c\x83\xb0\x25\xd3\xc5"
- "\x3c\x14\x66\xba\xb2\xb2\xb3\x28\x66\x82\x2f\x3e\x05\xf2\x94\x90"
- "\x4d\x30\xca\xf7\xb5\x73\x11\x7d\x23\x46\xec\xa3\x39\x75\x31\xc5"
- "\xc0\x31\xb2\x8f\x0e\x57\xd3\x8b\xeb\x3c\x6e\x3a\x5b\x1f\xd2\x7f"
- "\x16\xad\x91\xc2\xf7\xd2\xfa\x49\x36\x3a\x3f\x31\xca\xad\xd5\xf9"
- "\xb2\x62\xb2\xdb\xa7\x3a\x4b\xda\x5e\xb6\x42\xa3\xe3\x9a\x33\x28"
- "\x3b\xf7\x53\xd6\xac\xbb\xac\x1f\xd9\xb7\xd0\x39\x94\xb5\xd9\xaa"
- "\xcd\x15\xd2\x44\xbe\x2e\x2d\x4f\x8c\xd0\x77\x90\xbd\x2f\xe1\xe9"
- "\x56\xf2\x3b\x80\x32\x4b\xd0\x17\xc2\xa7\x88\xee\xb2\x89\x42\xbf"
- "\xb9\x88\xc9\x76\x93\x3d\x9b\xee\xb2\x5d\x72\xac\x5c\x36\xd6\xa9"
- "\xbb\x4c\x9d\xbb\x32\x8d\x62\x9d\x93\x1d\xc2\x29\xdd\x65\xd7\x52"
- "\xcc\x54\xd0\xa3\x9c\xfc\xce\xd5\x75\x60\xbe\x58\xbb\x68\x2c\x94"
- "\x53\x6c\x3c\xe4\x8f\x97\xeb\x03\xd1\xfc\xb2\x48\xfa\x3e\xd1\x96"
- "\xe2\xc5\x82\xa6\x1f\xa0\x6c\x9f\xfe\x83\x62\xd3\x82\x6e\x7b\x7b"
- "\xeb\x17\xa2\x91\x17\x75\x26\x2f\x1e\xf6\x61\x9f\xa2\x7e\xb1\x73"
- "\x94\x98\x49\x36\xb2\x9f\xc4\x6f\xd5\xd7\xa9\xec\x3b\x39\x97\x62"
- "\xef\xc6\x37\x4e\xd3\x5e\x23\xd9\x8c\x8b\x78\xdd\xba\xcb\x5a\x54"
- "\xfa\x89\x78\x15\xb6\x2c\x49\x07\x35\x7f\x99\xd4\xcb\x5c\xd9\xd9"
- "\x59\x14\x9b\xe4\xd7\xcb\xc4\x0a\x9f\xc5\x9a\x8d\x35\x9e\x4d\x0d"
- "\xa8\x73\x87\x38\x07\x78\x86\x64\xea\xcb\x3c\xf4\xad\x35\xe4\x17"
- "\x8c\xc6\x45\x6b\xe0\xf8\xbf\xec\x33\xaa\x27\xd9\xe6\x79\xa3\xc7"
- "\x37\xf0\x75\xe3\x1b\x89\xce\x28\x3b\x16\x73\xc1\xd6\x4b\x3c\x74"
- "\x11\x8f\x09\xdf\xab\x0a\x88\x31\x8b\x75\x30\xf6\xac\xb6\xce\xd1"
- "\x1a\x4d\x7e\x1e\x7c\x69\xeb\xf6\x27\x81\xc7\x31\xaa\x3c\x8e\xb1"
- "\x57\x1f\x85\x37\xb2\x44\x3a\x6b\x4c\x76\xda\x34\xde\xb8\x71\x5f"
- "\x03\xf9\x3d\x26\x1f\x8e\xf6\xec\x9b\x50\xdf\xa1\x3b\x5e\x88\x13"
- "\xe7\x1b\x3b\xec\x37\x9e\x21\x1b\x9d\xb6\xe3\x39\xc2\x37\x51\xe4"
- "\x64\xab\x87\x6f\x93\x31\xa6\x5d\x3c\x7a\x5f\x03\x3d\x13\x7e\xff"
- "\xa9\xcc\x6f\xeb\xc3\x57\x37\xd4\xa2\xf2\x32\x6d\xc0\xc9\xcb\x5b"
- "\x75\x43\xc5\x79\x46\xfc\x8e\x6b\xd5\xc5\xd5\xca\xb8\x88\xd2\x0f"
- "\xbd\x6a\x6b\x18\x21\xcf\xe7\xbb\x98\x38\x2f\xad\x8b\xbb\xdb\xfc"
- "\x63\xc6\xda\x74\x71\xf7\x0a\x9f\xd0\xb6\xb1\x66\x95\x06\xe6\xb5"
- "\xb2\x5e\x86\x34\xab\x5e\xd4\x91\xea\xd7\xb7\xba\xc5\x69\xeb\x65"
- "\x44\x67\x51\xdc\x14\xed\x5c\xbf\x68\xbf\xea\x2b\xda\xfe\x03\x92"
- "\x5b\xe2\xf6\xc9\x7e\x19\x1b\xaf\x7e\x3b\xfe\x3b\xf8\x76\xb1\xba"
- "\x1e\xba\x85\xbf\x6c\xd0\x05\xfc\xa3\x1b\xf5\x68\xd0\xd6\x53\xd5"
- "\x46\x7e\xa4\x5c\xe7\xe3\x5c\xfe\xb5\x54\xd2\x30\xe8\xcc\xce\xb3"
- "\xcf\x66\x9a\xc1\xb0\x5b\x66\x64\xce\xcc\x30\xcf\x5e\xb4\xe8\xd9"
- "\x45\x66\x72\x6e\x13\x38\xc7\x84\x0d\x4c\xd1\xe5\xe1\x6a\x8c\xb3"
- "\x9d\xbe\x18\x67\x45\x97\x4f\x08\x8c\x3d\xe7\xd4\x5d\x3e\xe5\xbb"
- "\x91\x6b\x2e\xef\xf5\x9c\x9f\x4d\xaf\x54\xe0\xaf\x12\x7f\x76\xfc"
- "\xd1\x19\x32\x96\xe6\x66\xc9\x58\x1f\xc5\xf9\x34\xff\x79\xf5\xcb"
- "\xe3\x69\x1f\xbc\x49\x77\xf9\x87\x5b\x95\x70\x26\xfc\x9a\x14\x2a"
- "\x64\x4b\x42\xbe\xcd\x2b\xf1\x67\xc7\x5f\x35\xfe\xc4\x7b\xca\x7b"
- "\xe2\xac\x6d\x45\xe0\x33\xda\x9b\xe6\x85\xdb\xdb\x28\x0f\x2f\x08"
- "\x17\xfc\x9f\xb2\x5e\xe6\xeb\x51\x07\x3d\x2f\x8a\x9e\xa0\xe6\x13"
- "\x67\xa2\x87\x14\x30\x73\x88\x7c\x61\xbc\x68\x90\x55\xcd\x27\xec"
- "\xd2\xb4\xf6\x90\xdf\x7d\xe4\xd7\xf2\x85\xf3\xa2\xa1\x91\x6a\x3e"
- "\x31\xd6\x94\x42\x7d\xa8\xef\xf6\xe3\x85\x47\xf6\xa8\xf9\x8c\x81"
- "\xe5\x05\xe4\x89\x50\x8a\xf4\x8d\x94\x47\x29\x08\x17\xfa\x7f\xf4"
- "\xe5\x3c\xe4\x0f\xe9\xaf\xb4\x6f\xfd\x74\x45\x6c\xcf\x7e\xb2\xcc"
- "\x9c\x33\xfb\xf6\x39\x0b\xb2\x28\x0a\x54\xe6\xb3\x4b\x32\xe9\xba"
- "\x60\xc6\x33\xe2\xf2\x6c\xda\xd3\x33\xe5\x8f\xcc\x79\x89\xf4\x63"
- "\x1e\xc6\x1b\x5d\x67\x2d\xb1\xd0\x65\xe6\xb3\x74\x6b\xcd\x18\xb9"
- "\x64\xa6\x16\xba\x3a\x70\x1c\x26\x74\x16\x5d\xb1\x17\x63\x63\x97"
- "\xe4\x47\xae\xa8\x86\xfc\x2b\xf6\x81\x0d\x05\x4e\xf6\x7e\x82\x88"
- "\x71\xc7\x2e\xf0\x57\xa0\xbb\xe2\x13\xf2\x57\x60\x28\xb0\xcc\x34"
- "\x78\xe6\xcc\xe6\xeb\x1e\x48\xea\x2c\x1a\x16\xee\x64\xbf\xb6\x4b"
- "\x5e\x68\x6c\xa2\xf0\xf9\x59\x74\xc5\x54\xcd\xbe\x50\xb1\xa5\x34"
- "\x93\x2f\x7b\x61\x6f\xb4\x9e\x7c\xe1\x8c\x35\x22\xdf\xc8\xad\xeb"
- "\x45\x4c\x99\x58\x3c\x6f\xc3\xfd\x18\xdc\x53\xec\xb5\xe1\x8a\x6d"
- "\x8c\x95\xce\x27\xe2\xde\x8c\xfb\x78\x94\x3f\x4b\x9b\x17\x81\xb4"
- "\x51\x83\xaa\xdd\x1e\x52\x3e\x0e\xf6\x27\x85\xb9\x35\x6c\xa7\x16"
- "\xb3\x56\xc4\xa7\x2d\x1a\x56\xe9\x8b\x4f\x2b\xe2\x30\x19\xa7\x89"
- "\x75\x4d\xac\xed\x57\xde\x12\x66\xba\xea\x3e\xc9\x87\x0f\x73\x6a"
- "\x3e\x19\x24\x9f\x3d\xcc\x15\x10\xdb\x17\xf7\x57\x32\x5f\x6c\x5f"
- "\xc9\x87\xbe\x24\xf9\xd0\x2b\xc7\xf1\xa2\x61\x16\x5f\x1c\xb6\xa2"
- "\x2b\x13\x02\xe3\xb0\x39\xf1\x9c\xe4\x1b\xa4\x27\xfb\xd7\xc1\x61"
- "\x87\xe9\x9b\xa1\xe2\x18\x43\x3e\xb7\xa6\x2d\x03\x2f\x8e\xab\xe0"
- "\xcb\x55\x1e\x98\xd2\x79\x61\x32\xf9\xb7\x31\xd3\x33\xe2\xfd\x42"
- "\xea\x1c\xae\x16\xed\x3a\x42\x3e\x73\x5d\x79\xb3\x74\x3f\xdc\xca"
- "\x74\xe2\x5e\xfa\x7c\xe4\xa7\x74\x57\x8a\x73\x6c\x9a\x3f\xb8\xc0"
- "\x33\xf1\x21\xcf\x1e\x7c\xac\xed\x19\xcf\x7b\xd6\xe0\x99\x31\x5b"
- "\xf2\x71\xc3\x6f\x53\xf7\x88\x3d\x72\xbd\x1f\x1e\xcf\x1f\x96\xb1"
- "\x4a\x9c\xba\xe1\x3b\xe9\x3c\x92\x41\x37\xef\x59\x8e\x77\x0d\xd6"
- "\x19\xb3\x45\x1a\xf2\xad\x04\xaf\x25\xeb\x37\x7c\x80\x63\x78\x0b"
- "\xe3\xe7\xbc\xf2\xac\xbf\x6e\x78\xe4\xf4\xab\xf2\xe9\x3b\x91\x82"
- "\x8f\xf8\x98\x45\x51\x4c\x3c\xaa\xdb\xd6\x00\x7f\x75\x6b\x91\x26"
- "\xe2\xdd\x3f\xcc\xa2\xc8\x3f\xaf\x5a\x97\x48\x11\x67\xac\x68\x78"
- "\xb9\xe6\x33\x07\xdf\xbb\xc0\xd7\xf2\xc3\x3f\x17\x33\xe4\xda\x99"
- "\x23\xa7\xdc\x8b\x5f\x23\xd5\x70\xae\x81\x63\x67\x78\x7b\xcc\x84"
- "\xa4\xf6\xd7\x53\xfa\x8b\x78\x88\x45\xc3\xc1\x43\x5d\xa9\xc6\x50"
- "\x7e\xe2\x04\x61\x8b\x88\x13\x48\xe7\x0a\x95\x0e\x7c\x77\x44\xad"
- "\xf0\x8d\xab\x97\xfc\xa2\xf0\x49\x57\x34\x7c\x0f\x8f\x49\xa9\x97"
- "\xb1\x50\x1f\xa8\x47\xff\x89\x75\x9f\xe6\x86\x38\x3f\x69\xa4\xb6"
- "\x5f\x35\x0e\x98\x9a\x82\xbf\x5f\xc8\xd8\x2e\x4f\x9c\xd0\xca\x25"
- "\xff\x51\x18\x5b\x49\xb8\x1a\x3b\x8b\xae\xb2\xf8\x6c\x84\xb4\x33"
- "\x99\xba\xab\xd6\x91\x6f\x2b\x3f\x7f\x3e\xe2\x2d\xc9\x57\x5e\x55"
- "\xe6\x64\x86\x52\x39\xbf\xaf\xc2\xf8\xdf\x3d\x56\xfd\x0d\xf9\xf7"
- "\xe6\xea\x1e\x65\x78\x35\xdd\x87\xec\xbb\xab\x1a\x30\x16\x53\xf0"
- "\xf7\x0b\xe4\x6f\xd6\x62\x41\xaf\xd4\x8b\xb3\x45\xc7\xc3\x4c\x2c"
- "\x11\xe9\x1e\x2d\xbd\x9f\x2e\x19\xb4\xb9\x3a\x4a\xc3\x93\xf6\x98"
- "\xf1\xcd\xb8\x1f\x0e\x7e\x73\x83\x7a\x0f\xbe\xee\xea\x91\xda\x3d"
- "\x7e\x27\x69\x78\x43\x3a\x88\xf6\xe5\xa9\x2f\x92\xfc\x37\xd3\x04"
- "\x9e\xcc\x44\xf2\xd5\xd5\x90\x7f\x77\x25\xaa\x79\x67\x39\xd9\xeb"
- "\xda\x7b\x68\xff\x50\x97\x9f\xfe\x61\x06\x59\xff\x11\xdb\x79\xf4"
- "\x2b\xa5\x14\x83\x1b\x79\x36\x60\x2e\x49\xff\x19\x59\x6d\xe5\xab"
- "\xbb\x8c\x53\x1d\x90\x46\xec\x4f\xd3\xb8\x18\x21\x6c\x6b\xd6\x64"
- "\x1b\xa7\x10\x7f\x47\x3e\x07\x44\x4c\x33\xf2\x0d\xe9\x61\x11\xc2"
- "\x1f\xff\xba\x57\x8a\x85\x1f\xfa\xa5\x09\x51\x9a\x5f\x48\xcc\xc9"
- "\x7c\xae\x7f\x21\x9e\x7c\x45\x0a\xbd\x59\x67\xc2\x10\xe1\x1f\x52"
- "\xf5\x0b\xb9\x25\x8b\xc5\x96\x29\xd2\x2f\xa4\xf0\x47\x70\x11\xdf"
- "\x90\xbc\xf0\x90\x51\xf3\x0d\x89\x36\xd3\x39\xc3\x04\x7e\xce\xe3"
- "\xc6\x35\x3e\xc0\xaf\x4d\x78\x48\x3f\x91\x7a\x60\xa4\x5e\xfa\x89"
- "\xec\xdb\xda\x32\xc2\x22\xc7\xc4\x88\x0a\x2d\x2e\x75\x40\x5a\x15"
- "\xc6\xb4\x8a\x41\x57\xd9\xd4\x34\xf0\x3f\xaf\x95\xf9\xf8\x30\x60"
- "\x1b\xe9\x0f\xf1\x3c\x96\xe7\x65\xbc\x18\x38\x87\x18\xa3\x25\xba"
- "\x1f\xe6\x56\x04\xfe\xfa\xd3\xdf\x38\x1f\x4e\x9c\xe3\x0d\x24\x0b"
- "\x18\x74\x58\x57\xac\x61\x7c\xb2\xc7\x13\x96\xe6\xd1\x1d\x26\x1e"
- "\x93\xce\x56\x4f\xf6\x7a\xe8\x8c\x7f\xf8\x64\x6f\x3b\xc5\x8b\x3c"
- "\x4c\x67\xc6\xd6\x3e\x4d\x67\x18\x47\x70\x8a\x25\x33\xd9\xfb\x35"
- "\xdf\x26\xcf\x66\xd6\x93\x0c\xe0\x3d\xc7\x6b\xbc\x59\x9c\xf4\x42"
- "\x51\x24\x5f\x90\x9f\xad\x21\x3a\x37\x1b\x62\x09\x7b\x67\xd2\xd9"
- "\x77\x38\xf9\xd8\xa2\x38\x62\x4a\x91\x1b\x98\x68\xd6\xa5\x79\xc2"
- "\xf2\x1d\x9e\x66\xe1\xcb\x7f\xb2\xb7\x3f\x9f\x6c\xbd\x93\x8b\xf8"
- "\x5f\x59\xbc\x0a\x78\x1a\x26\x62\x42\x2f\xe3\xed\xf8\x1d\x39\x79"
- "\x59\x3b\xa7\x78\x95\x28\xbb\x7a\xb2\x47\xe9\x9a\x6c\x55\xf2\xd2"
- "\xac\x3a\xbc\xf7\x25\xde\xfb\x12\xf5\x49\x44\x99\x46\xdc\xdf\xc5"
- "\xb7\x3d\x4d\x67\x9d\xf2\x85\x8c\x83\x36\xda\xd5\xf3\xa3\x95\xa8"
- "\xdf\x1e\xf2\x05\x9e\xe6\xb1\xe7\x6f\x53\xcf\x83\x8a\x58\xa9\xd6"
- "\x6e\xae\x7e\x27\x69\xf2\x32\x76\x57\xda\xb2\x11\xe2\x5c\x29\x9d"
- "\x99\x9a\xec\x31\xe3\x9b\xf9\x44\x8f\x28\x11\x9f\x9a\xce\x4d\x15"
- "\x5d\x93\x7a\xb1\x38\x97\x21\xe5\xea\x92\x89\x36\xbe\xf1\xfe\xc3"
- "\xbc\x64\xca\x3c\xbe\x71\xdc\x54\x6e\x7b\x80\x62\xc2\xea\x78\xc9"
- "\xcf\xc7\xe1\x1e\xe9\x8f\xc6\xf3\x8d\xe3\xa7\xf2\x92\xc7\x18\xae"
- "\xb8\x7f\xa2\x91\x6f\x7c\x00\xf7\x37\x54\xe3\xbd\x7a\x5e\x32\x2a"
- "\x09\xf9\xa6\xf0\x92\xc4\x9d\xb8\xe2\xfe\x26\x13\xf2\xe1\xfe\xe6"
- "\x62\x5c\x71\x3f\xc6\x7d\x5c\xf7\x83\xe1\x78\x07\x69\xd3\x2b\xe5"
- "\xb7\x66\x54\x89\x6f\x95\xcc\xaa\x97\xdf\xf8\x65\xa3\xfc\xc6\xdc"
- "\x16\xf9\x8d\xf9\x1d\xf2\x1b\x3f\xcd\x40\xfe\x06\x5e\x92\x34\x15"
- "\xf9\x52\x79\xc9\xed\xc9\xb8\xe2\xfe\x8e\x91\xc8\x87\xfb\x9f\xd1"
- "\xb7\x70\x9f\x1c\x8e\xfc\xb8\xbf\xdb\x85\xfc\x8d\xbc\x24\xc5\x89"
- "\x7c\xd3\x78\xc9\xbd\x54\x3e\xee\xef\xb7\x23\x1f\xee\xc7\x57\xe0"
- "\x8a\xfb\x07\xcb\x91\x1f\xf7\x0b\xd1\xa6\xfb\x9d\xbc\x64\xd1\x1e"
- "\xe4\x4b\xe7\x25\x99\xf8\xde\x38\xdc\x67\xa1\xbe\xe3\x71\xbf\x14"
- "\xef\x8f\xc7\xfd\xb2\x55\xc8\x8f\xfb\xe5\x68\xeb\xfd\xcd\xbc\x24"
- "\x07\xdf\x19\x37\x8b\x97\xe4\x52\x9b\x71\x9f\x9f\x8e\x7c\xb8\x2f"
- "\xa4\xfa\xe0\x7e\x25\xde\x7b\x00\xf7\xcf\x81\x06\xf7\xb7\xf0\x92"
- "\xe2\x54\xe4\xcb\xe0\x25\xbf\x4e\xc0\x15\xf7\x6b\xdc\xc8\x87\x7b"
- "\x1b\x68\x38\x1e\xf7\x2f\x94\x22\x3f\xee\x37\x51\x7b\xdb\x78\xc9"
- "\x8b\x77\x20\xdf\x3c\x5e\x52\x66\xc4\x15\xf7\x5b\x9b\x91\x0f\xf7"
- "\x2f\x83\x7e\xe3\x71\xbf\x7d\x35\xf2\xcf\x0b\xdd\x9f\x3b\xc3\x79"
- "\x41\x04\xe3\x25\x7b\x4c\xbc\xa0\x3f\xae\x6f\x56\xf3\x82\x7e\x09"
- "\xbc\xe4\x2d\x2b\xd2\x71\xfd\xe3\x1e\xdc\x8f\x54\xef\x71\xfd\x53"
- "\x39\xee\x13\xd5\x7b\x5c\x2b\x57\xe3\x7e\x8c\x7a\x8f\xeb\x3e\xba"
- "\x4f\xe2\x25\xfb\x71\x8d\xa0\x6b\x14\xee\xef\x50\xef\x71\xb5\xa7"
- "\xe2\xea\xe1\x25\x7f\x1e\x8b\xf4\x64\x5e\xb2\x97\xbe\x4f\xd7\x2a"
- "\xdc\x8f\xc5\xfb\x09\xb8\x1f\xeb\xba\xf6\xd6\x7c\xb2\x47\xe2\x71"
- "\x43\x6c\x4a\xdc\x84\x29\x79\x67\x99\x9e\xf4\xca\x15\xb9\x4e\xf2"
- "\xdb\x30\xa2\x49\xf7\xc3\xf3\x14\x13\x82\xf2\x78\x37\xdd\x5f\xaf"
- "\xc4\x8d\x9b\x82\xf4\x08\xe4\xeb\x7f\x5c\x77\x2d\xc5\xbe\x60\x8e"
- "\x1c\xa7\x88\x45\xa7\xfa\xa4\x8b\x68\xd2\xc5\x5f\x03\x5e\x20\x89"
- "\xe2\x77\x83\x4e\x51\xbc\xb0\xdf\x19\x5c\x57\xf3\xc2\x41\x4d\xa0"
- "\x13\xee\xa3\x3f\xc6\x15\xf7\x3f\xfd\x15\xe8\x85\xfb\x27\xee\xc1"
- "\x15\x58\x1f\x9f\xef\xd4\x5d\x23\x7d\x34\xbd\x9e\x02\xdc\xe4\xc0"
- "\x18\xd4\xed\xe5\xac\x7c\x83\xc7\x8e\x31\xf1\xb8\xc5\x40\xbe\xd5"
- "\x76\x24\xe5\xf3\xb8\xcb\xcb\x45\xbd\x0b\x21\xbf\x76\xc7\xeb\xe5"
- "\xb7\x07\x71\x7c\x7b\x37\xe9\x3c\x79\xdc\xa8\xde\x9e\xd7\x8a\xe7"
- "\x3f\x58\xca\xe4\x73\x23\xf3\x3f\xff\x05\x3d\x3f\x69\x20\x3d\xf5"
- "\x75\x3f\x02\x2f\x78\x6d\x2c\xe5\x71\xea\xe2\x21\x97\x86\x31\x47"
- "\x47\x8b\xda\xc6\xfe\xc8\x77\xed\x50\x7a\xaf\x37\xdd\x8b\xb2\x21"
- "\xcd\xbd\xa6\x90\xd7\x93\x9c\x89\xf5\x42\x6f\xce\x8d\xaf\x6c\xd2"
- "\x5d\xd7\xbc\x85\xf4\x07\xb1\x4b\xec\x74\xfe\x07\x65\xbc\xda\xbd"
- "\xfe\xc1\x91\xe6\x6c\x03\xca\xbb\xee\x58\x9e\x9b\x77\xd8\x73\xef"
- "\xc1\xba\x26\xd2\x33\x84\x4d\xb9\xfc\x3d\x55\xda\x01\x89\xdf\xc9"
- "\x52\x17\x7a\x5d\x33\xbd\x1b\xc8\xd7\x7b\x8b\xbe\x32\x2a\x71\x4b"
- "\xea\xe5\x3e\xd6\xb5\xbb\xf7\x29\x4e\xbd\x21\x93\xf5\x33\x67\xbf"
- "\x43\xf5\xed\x08\x96\x01\xb5\xbc\xe2\xd9\x91\xfd\xc8\xbb\x59\xe8"
- "\x6b\xae\x0b\xd7\x74\xbd\x1c\x6d\xf8\xb5\xe4\x7f\x92\x69\x0d\x93"
- "\x7c\xdc\x75\xab\xc8\xef\xa5\x27\x36\xd5\xe9\xd9\x30\x24\xdf\xbb"
- "\x61\x89\x9d\x6f\x5a\x52\x3f\xc4\xa3\x63\xc2\x1e\x5f\x77\xdd\x5b"
- "\xa3\xdc\xa4\x47\x3b\x48\x79\x17\x2a\x11\xae\xc3\x37\x5a\x99\xde"
- "\xbe\xe8\x53\xba\xff\x1d\x2f\xea\x6e\x70\xb4\x35\x30\xf2\xdd\x8b"
- "\xfb\x0a\xfe\xab\x98\x1a\x65\x60\x44\xc7\x56\xe2\x3f\xad\xa4\xff"
- "\xf9\x98\xd2\x6f\x01\x9d\xc1\xe7\x5f\x67\xd3\xea\x42\xbe\xfb\xd7"
- "\x80\x76\xc4\x1b\xd2\xf9\xe9\x34\xaf\x97\x7c\x3d\x15\x3b\x41\x07"
- "\xa9\x43\xbc\x2e\x93\x30\x5a\xfd\xee\x87\x4a\xcc\x83\xa6\xba\x69"
- "\xb4\x57\x6a\x24\xdf\x39\x1d\xe2\xbc\xa5\x87\xe2\xed\xd1\xba\x28"
- "\xf3\x06\xf6\xdd\x1c\xf5\x9c\xe9\x9c\x05\x99\x8b\x16\x9a\x17\xcf"
- "\xc9\x9e\x7d\xe7\xb5\x4b\x46\x9a\x17\x59\xcd\x8b\x44\x7c\x67\x91"
- "\x30\x6b\xa4\x79\xf1\xbc\x67\x33\xcd\x99\xcb\x2c\xb3\x2f\x8c\xdf"
- "\x6b\xe2\xc6\x07\x54\x9e\x6d\xa4\xdc\x9b\x2a\xcf\xb2\x66\xe6\x70"
- "\xc5\xfc\x83\xfe\xe0\xc9\x7f\xb4\xea\x7c\xc4\x75\x2e\x3a\x7b\xae"
- "\x14\x9a\x99\x1a\x83\x3a\xea\xc5\x18\x46\xe7\x3a\x22\x3b\x8b\x7e"
- "\x14\xb0\xff\x31\xb2\x4a\xea\x27\x7e\x64\xc3\x18\x1c\x43\x69\x1b"
- "\x34\x7f\x5c\xea\x33\xb9\x7f\xf0\x23\xac\xff\xab\xa5\x7f\xb0\xf2"
- "\x25\x0d\x92\xd7\xfb\x91\xd0\x5d\x72\x73\x96\x95\x6f\x4f\xca\x07"
- "\xef\xa3\x23\xbd\x8f\x88\x73\xcb\xce\x88\xb3\xa7\x7c\xe3\x63\x2e"
- "\x3a\xf7\xed\xdd\xf4\xa0\x45\x89\x7b\xcc\xa5\xbc\x72\x5b\x72\xde"
- "\xcb\x4c\xff\x06\xe6\x7c\xb8\x19\xe3\xfb\x07\x6c\xc4\x3b\xb9\x2d"
- "\x7a\xd4\xf9\xf4\x3b\xb9\x0d\x7a\xbe\x61\xc2\xb8\xf6\xf8\xdb\xd3"
- "\xdd\x85\xc2\x6f\x27\xca\x70\xb3\xbf\x8c\x65\x24\xb3\x54\x76\x0c"
- "\x7d\xaa\xb8\x63\xe8\x83\xa9\xee\x8d\x73\x5d\xf6\x1f\xdc\xc4\xee"
- "\xbd\x9e\x7f\xfd\x41\x15\xe9\x96\x46\xee\xfa\x60\x2c\xe9\xf6\x1e"
- "\x68\x73\x1b\x1f\x70\x75\x6c\x7a\xcc\x42\xfe\x6c\xce\x6f\x7a\x26"
- "\xb9\x2b\x6e\x62\xfd\x01\xe4\x39\x08\x9e\xfe\x90\x19\xe3\xf7\x1a"
- "\xa6\x3f\x7f\xdd\xad\xf5\x6f\x74\xd9\xf4\xd5\x55\x77\x48\x7d\x64"
- "\x3a\xe6\x8c\x18\x4f\x09\x1b\x3f\xd8\x53\xc5\xf0\x6d\xf6\x46\xd7"
- "\x38\xfd\x5f\x92\x2e\x78\xfe\xe6\x07\x89\x55\xac\x93\x7c\xa9\x42"
- "\x76\xda\xff\x69\x29\xe3\x9b\xd2\x2b\x76\x67\xbb\xf5\xd3\x9c\x4c"
- "\x5f\xdb\x50\xca\x72\x8e\xb1\xc1\x9e\xaf\x13\xc2\x5f\xc3\xfb\xe7"
- "\xc9\x47\xe1\x21\x93\xf0\x55\x96\x6b\x17\x71\x5b\x0d\x75\xe0\x27"
- "\x94\xaf\x13\x22\xea\xa6\xda\x19\x9e\x67\x7b\x1e\x34\xb1\xda\x0c"
- "\x17\x73\xa4\x96\xb3\xf3\xfa\x64\xf6\xd6\xe3\xe5\x6c\x33\xf8\xf6"
- "\xcd\xa7\x58\x94\xdc\x67\x4d\x88\xf0\x74\x27\x84\x7b\x96\x27\x90"
- "\xef\x18\xce\xbf\x4e\x18\x48\xfc\xa3\xe7\xd9\x84\xc8\x3a\x57\x39"
- "\x1b\xd5\xc2\x12\xce\xeb\x99\xe1\xfc\xf2\x84\x81\x75\x96\x52\x94"
- "\x45\xc1\xa6\x99\x8e\xfc\x56\x91\x3f\x2b\xa2\xd3\xa0\x54\x36\xb5"
- "\x4d\x97\x30\x7f\xe0\x61\x36\x94\xfc\x26\x92\xdf\x33\xf2\xdd\xaa"
- "\xc4\xa6\x57\x78\x63\x1f\xb3\xe4\x9e\x25\x3f\x1f\x6e\xc6\x5f\xbf"
- "\xc7\x49\x3c\xed\x74\xe0\x0e\xb5\x59\xe1\x09\x03\xd3\xe8\xba\x3e"
- "\x25\x9b\xf8\x5a\xa5\xd3\x44\xf1\x88\x22\xa9\x9e\x98\xa7\x91\x2b"
- "\xbe\x00\x2d\xf3\x12\xc2\x91\x2f\x0a\xe9\x43\x1c\x6d\x6e\xe6\xbd"
- "\xe1\x1e\xd7\x8d\x16\x11\x77\x36\x76\x6b\x2e\x33\xda\x72\x59\xac"
- "\xf9\xa7\x62\x2c\xad\xf1\xee\xbe\xc7\xc9\x8b\x6e\x9f\xc5\x0b\xc2"
- "\x87\xcb\xb4\x9f\xcc\x37\xdf\xc7\x98\xf9\x26\xf1\x7b\xa8\xf9\x76"
- "\xf4\x61\x6c\xba\x51\xf0\xdc\x42\x16\xfb\xc9\x00\x39\xc6\x7f\xa2"
- "\x3b\x1f\xb1\x6a\xa7\x52\xf4\xa7\x2a\xa5\x20\xdc\x4c\xf1\xa9\x4f"
- "\xe9\x7e\x7c\x8c\x97\x1c\xac\xe6\x1b\xe6\x8a\xb1\x88\xfb\x2f\xce"
- "\x47\xfc\x34\x8a\x97\x1c\x1a\x89\xf2\x93\xcf\xeb\xc2\x1b\xf0\xd7"
- "\x28\xdf\xff\x71\x03\xb5\xdb\xbb\x3d\x29\x95\xda\x2d\x62\xd8\xa0"
- "\x5d\x69\xe8\x33\x1e\x97\x66\x17\x7e\xdd\xbb\x41\x5f\x35\xc6\x27"
- "\xd1\x83\x68\xa0\x74\x27\x0c\x14\x6d\xed\x4e\x88\x02\x7d\xc9\x47"
- "\xaa\x21\x77\x06\xde\xd9\x94\x76\x18\xcf\x86\x9c\x8f\x4d\x8f\xa4"
- "\x58\x52\x0e\x8b\x8b\x79\x37\xa6\xd5\x93\x0f\xb0\x17\xb3\x31\xe7"
- "\x86\xa6\x81\xd7\x48\x6b\x54\xe7\x16\xa3\x7a\x2a\x25\x87\xac\xe7"
- "\xc9\x86\x1f\x75\x43\xfd\x1a\xf0\x87\xe7\x3f\x9e\x76\xfe\xda\xa4"
- "\x0c\x5c\x13\x51\x57\x33\x2f\x7a\x78\x03\xfd\xc6\x33\x33\xda\x7c"
- "\x2f\xd1\x81\xe8\xa1\xd2\xe2\x4e\x3f\x2d\x72\xeb\x91\x6f\xa4\x52"
- "\xf4\x7b\xbc\xfb\x93\x28\x5e\x34\x71\x6a\x40\xbe\xd9\xfe\x7c\xbf"
- "\xca\x94\xf9\xf6\x99\x64\xbe\x5f\xd4\xa0\x1f\x74\x2a\xbd\x5f\x0d"
- "\x41\xef\x97\xfd\xef\x2e\x1e\x2e\xdf\xfd\xcd\x4e\xf9\xee\x3d\x78"
- "\xf7\x27\x47\x7a\xd4\xe9\x23\x7f\xfe\xf9\x53\x64\xfe\xff\x4e\x95"
- "\xf9\xef\x2c\x0d\xc8\x77\xde\x9f\xcf\xda\x28\xf3\xed\x72\xc9\x7c"
- "\xf7\x83\x37\x1c\x79\xcb\x85\x75\x19\x79\x83\xff\x9d\x4d\xe9\xf2"
- "\x9d\xea\x28\xf9\xce\x53\xc5\x78\x3e\x3b\xb8\x2e\x23\x9f\xf4\xe7"
- "\xb7\xa9\xed\x7e\xaf\x4c\xe6\x7f\x72\x4c\x40\xbe\xe7\xd4\x31\x81"
- "\xe7\xb5\xc8\xf7\x13\x76\x3e\xa2\x6c\xac\xcc\xf7\xcb\xc3\x34\x1e"
- "\x91\x67\x87\x52\xf4\x5f\x1d\xe7\x23\x92\x9c\x4e\xdd\xf5\x1d\xe8"
- "\x9b\xe1\x74\x45\xdf\x0d\x57\x6c\x0f\xb4\xe1\xf7\x3c\xda\x6f\x20"
- "\xcc\x75\xea\x7e\x34\x01\xb8\xeb\x0d\xbd\x97\x39\xb2\xd9\xa7\xdf"
- "\x52\xc0\x1b\x6c\xbc\xbf\x3c\x24\xbf\xb6\xfe\x9e\x36\xb2\x41\x20"
- "\x4c\x39\xae\xbb\xe1\x11\xf2\x0d\xc7\xf3\xc6\xa9\x3a\xa5\x1b\x84"
- "\xad\x3e\xf9\x66\x20\xbd\xa3\x9a\x26\xfd\x51\x61\x6c\x42\x2e\xac"
- "\x24\x7f\x7c\xa4\x67\xc4\x1a\x55\xed\xd4\xdd\x90\x01\x9c\xe8\xf7"
- "\x82\x5e\xa9\xc0\x5f\x25\xfe\xec\x2f\x90\xfe\xb1\x90\xdd\xab\xe9"
- "\x66\x43\xd7\xf5\x06\xac\x7f\x6b\x4a\xfd\xfa\xa9\x1b\xca\x31\x7e"
- "\xdd\x7d\xb7\xdf\xbd\xa1\xfc\x22\xfb\x44\xe1\xc2\x47\xfa\xa6\xfb"
- "\x5d\x36\x45\xc6\x80\xc7\x5c\x04\x0f\x77\xc3\x59\xac\xf9\xf9\xc2"
- "\xe7\xeb\x86\xc7\x2d\x4a\x3c\xd6\x92\x93\x2c\xcc\x91\xd3\xc2\x2a"
- "\x94\x16\xbd\xad\x8b\x85\xd7\x61\x3d\xa5\xfc\x15\xe0\x1d\xcc\x0b"
- "\xc2\xc0\x47\xdc\x38\xd8\x76\x4e\x2d\xaf\x3c\x2b\x3f\x6f\xbe\x8c"
- "\x75\x4d\xfc\x23\xad\x41\xc0\x9d\x28\x11\xff\x6c\x01\xf1\x4f\x37"
- "\xde\x8d\xdf\x91\x94\x17\xd8\xcf\xce\xff\x77\x56\x7e\xd7\xa6\x09"
- "\xf5\x5d\xd7\xdd\xe6\xec\x8e\x7b\xdc\xd2\xbd\x29\xd5\xe5\xf9\xef"
- "\x25\x2e\xcf\x75\x49\xf9\xde\xb8\x89\x53\xf0\x6d\xac\x4f\xa5\xfa"
- "\xd7\x95\x0a\xfd\xeb\xb9\x76\x3d\x95\xfb\x4e\xee\x4e\xfd\xfe\xdc"
- "\x7a\xfd\x7e\xa5\x52\xff\x4e\xae\x0d\xd7\x72\x8a\x85\x05\x9e\xf5"
- "\xc6\x75\xfb\x73\xab\xb1\x3e\xde\x88\x39\x39\xb2\x5e\xd3\x83\xf2"
- "\x7b\x3c\xac\x6e\xa7\x87\xbd\x9f\x79\x96\xb9\xa2\x1f\xe8\xc0\x9f"
- "\xdb\x35\x34\x0d\x7f\x73\x45\x8c\x75\x1e\x37\x43\xb4\x91\xce\x62"
- "\xed\x57\x64\x9d\x55\x7a\x50\x99\xe7\xb7\x2a\x74\x5e\x4b\xf5\x87"
- "\xab\x1b\xb5\xe7\x02\x7f\xb8\x7a\x19\x87\xcd\xe7\x13\xf7\xdf\xe1"
- "\x0f\x57\xd5\x21\x90\x3f\x5c\xc8\xae\xf5\xaa\xec\x6a\x57\x7d\x1f"
- "\x45\x91\xbc\x2a\x7c\x1f\x59\xed\xc2\x7f\x91\xd8\x97\xdf\x98\x3a"
- "\x85\xf8\xd0\xce\xa2\x51\x2e\x4d\x2e\x25\xde\xca\xbb\xee\xc1\x70"
- "\xfc\x41\x5e\x4d\xc4\x98\xf9\xab\x45\x4b\xe7\x9b\x0c\x36\xa2\x89"
- "\x97\x67\xfc\xac\x93\xce\x19\xf1\x8c\xbb\xbc\x1b\x1f\x4c\xf7\x6e"
- "\x9c\x5b\x8f\xb4\x3b\xf0\x77\xa7\x77\xa3\x61\x03\xfe\x4a\xf1\x57"
- "\x86\xbf\x72\xfc\x6d\xc7\xdf\x4e\xfc\x55\xe0\x6f\x0f\xfe\x2a\xf1"
- "\xb7\x17\x7f\x76\xfc\x55\x29\x1b\x0d\xbb\xc8\xbf\x1f\xca\xae\xc7"
- "\x38\x30\x69\xe5\xfa\xe9\x9d\x38\x1f\xed\x4f\x26\xbe\x8f\x0f\x39"
- "\xd8\xcc\x31\xdf\xf9\x8e\x5b\x8b\x45\xfd\x09\x97\x77\xdc\x9e\xee"
- "\xba\x26\xcb\xe2\xba\x66\x49\x83\x2b\x3a\x2f\x11\x7f\x49\xf8\x4b"
- "\x76\x6d\x4c\x37\xa2\x3f\x1b\x5c\x43\xd3\xcb\xd1\x0e\xf4\xff\xad"
- "\x7b\xa5\xae\x29\x11\x18\x77\x6b\xa3\xfa\xbb\xc5\xa9\x1b\x23\xf4"
- "\x67\xae\xa1\x33\xd2\x71\xef\x76\xea\x6e\x11\xf9\xda\xe3\xd2\xcd"
- "\xea\xf9\xa4\xfc\xce\xa2\xd1\x46\x67\xf8\xa8\x04\x99\x2f\xd5\x49"
- "\x7b\x47\x48\x8b\xd7\xe6\x60\x50\xbc\x8b\x99\x96\xb4\xf9\x33\xac"
- "\x69\x8b\xe7\xcd\x99\x39\x7b\xf1\xed\xe6\x6b\x67\x99\x13\xe6\x2c"
- "\x5a\x98\xb6\x70\xc9\xec\x25\xb3\x05\xfb\x88\xa4\xeb\x83\xf6\x8e"
- "\x28\xae\x31\xf3\x40\xce\x19\xd2\xcc\x39\xad\xdb\x13\xc0\xa1\xf3"
- "\x1f\x64\xe5\xef\x3d\xe5\xd2\x7b\xc1\xbf\x45\x35\xe7\x63\x5e\x3e"
- "\x6e\xd9\x7b\xca\xad\x8f\x6a\x36\x33\x8e\xb9\x40\xcf\x1c\xcd\xf5"
- "\x2a\x3f\xf7\x31\xab\x21\x7e\x0e\x79\x5e\x5f\xe0\xd6\x4f\xa2\xf7"
- "\x5f\x49\xca\x7f\x03\xbf\xf9\xa6\xc7\x5c\xf4\x1e\x07\x8f\x27\xae"
- "\xe0\xf1\xe4\xfd\x84\xfa\xfd\xe2\x9a\xea\xda\x2f\xf2\x4d\x9c\xf2"
- "\x0e\x5d\xcf\xe5\xf0\x1a\x94\x4b\x7a\x35\xfe\xca\xad\x6c\xbf\x7c"
- "\xc7\x29\xf2\x60\x1e\x36\xe9\x6e\xda\x43\xf9\x84\xcc\x84\x3a\xbe"
- "\x81\x7a\xe4\x2d\x61\xe1\xda\xdc\x26\xb9\xc8\x37\xbf\xb3\x88\xdf"
- "\xbd\xe9\x2a\x9a\xdf\x54\x1f\x8e\xf9\xbc\x1b\xef\xbe\xbe\x40\xca"
- "\x91\x90\x1d\xc3\x48\x66\x24\x0c\x21\xec\x70\xe4\xd4\x8b\xf7\x2b"
- "\x94\x7a\xc8\x9c\x61\xf4\xee\x93\xf4\xac\x0c\x3c\x6a\x99\x90\x49"
- "\x6e\xf2\xc5\x3f\x5b\x1d\x27\x7d\x1f\x45\xa5\x33\x3a\xa3\x3d\xe2"
- "\x94\x6e\xf4\x42\xa2\x1f\xd1\x8b\xf6\x6a\x79\xd1\xe8\xc4\xb2\x18"
- "\x16\xbe\x25\x86\x45\x7a\x86\x2e\xa9\x96\xfa\xfa\x9b\x1a\x34\xde"
- "\xba\x23\x76\x49\xd0\xd9\x1c\xd9\x5f\xe6\xd9\x0b\x68\xd7\x61\x96"
- "\xd8\xde\x9b\xb1\x78\xf1\x92\xf9\xb3\xcd\xb3\x67\xcc\xcc\x30\x8b"
- "\xc7\xe6\x25\x8b\x91\x65\x4e\xe6\x62\xf3\xb3\x4b\x17\x98\xe7\x2f"
- "\x9e\x43\x52\xc2\xec\x45\x8b\x96\x58\x32\x07\x32\xf9\xa6\x79\xfe"
- "\x92\x79\x99\x73\x2c\xf8\xb1\x78\xf6\x82\x59\x66\xd1\xeb\x8b\x51"
- "\xd4\xbc\x79\x66\xf5\x0b\x8b\x33\x66\x2c\xa2\x81\xb0\xe0\x97\xc8"
- "\x14\xf0\x7e\xb0\x0c\x11\x45\xbe\xa5\x68\xdd\x39\xa5\x1b\x73\x5b"
- "\x55\x38\x68\xbd\x61\x49\x35\xd9\x17\xe0\x3e\x49\xc8\x95\x45\x37"
- "\xd1\xde\x0b\x7b\x01\x6d\x6c\xbf\xf6\x76\x8c\xdd\x9b\xf7\x68\x6d"
- "\x23\x5f\xee\xc2\x97\x21\xf9\xc9\xd4\x8d\xb9\x56\x9c\x9b\xc3\x7c"
- "\x10\xf6\x27\x45\x37\x75\x4b\x5a\xdc\xdc\x1c\xe8\x07\x5b\xf8\x54"
- "\xd4\xdd\xec\x95\xfb\x18\x63\x92\x88\x37\x52\x7d\xcf\xeb\x78\xd1"
- "\xcd\xd7\xd3\x3b\xca\xc6\xb9\x0d\x9d\x45\x63\x86\xfb\xe5\x93\x9b"
- "\x85\xff\x6c\x91\xaf\xe8\xe6\xfb\xf8\xd0\x74\x23\xd2\x1a\xa8\x5e"
- "\xbd\xac\x31\xe6\x73\x28\xf7\x50\x05\x63\x3f\x89\x65\x09\xe7\xd6"
- "\x4f\xaa\xe8\x8c\x79\x30\xb2\xab\x90\xf5\xef\xc2\xba\xe6\xd6\xb3"
- "\x11\xe7\x31\x2e\x96\x8d\x66\x61\x2b\x26\x32\x7d\xc5\xdc\x0a\xf2"
- "\xc5\xca\x6a\xc6\x95\x32\x47\xba\x93\x39\xdc\xbb\x58\x8d\xbd\x89"
- "\xd5\x7a\x7e\x2b\xe3\x24\x64\x93\x7c\x71\xcb\x16\xf2\x0f\x95\xb7"
- "\x82\x7b\xdf\x78\xdb\xd5\xef\xf5\xd6\x0a\x8a\x6f\x30\xc2\xe1\xf9"
- "\xdc\xee\xc8\xd9\xce\x1c\x56\x87\x9d\xce\xcd\x83\x6e\xcf\xef\xc7"
- "\xb3\x01\x35\x78\x6f\x12\xeb\x8f\xfb\x15\xf4\x8d\xe2\x4d\xbc\xe1"
- "\xf9\x38\xde\xf8\xfc\x26\xee\xc4\x98\xa2\x78\x05\x2d\x6b\xe2\x78"
- "\xdb\x1a\xd5\x07\x1c\x8d\x53\x4b\x16\x33\xb5\xea\x6e\x89\x15\x3a"
- "\x8e\xb1\xe2\xfe\x0a\xdc\x0b\x1b\x0d\x87\x75\x13\xdd\x0f\xc3\xfd"
- "\x18\x79\xbf\x95\xee\xaf\xc4\xfd\x58\x79\xff\x01\xdd\x0f\xc7\xfd"
- "\x54\x79\x5f\xc7\xc4\x19\x72\xdd\x2d\xb3\xe4\xfd\xdf\xe8\x1e\xb4"
- "\xbf\x25\xd3\x9e\x45\xf5\x3d\x8a\x3e\xbb\xa5\x20\xef\x33\xc8\xa9"
- "\xd6\xe3\x62\x3e\xbc\x93\x9b\x41\x3a\x18\xcc\x87\x5b\xfa\x0d\x6a"
- "\x24\x19\xf7\x96\xed\x11\x89\x74\x1d\xb3\xd3\xe0\x66\xfd\xc1\x33"
- "\x0e\x42\x7b\x96\x10\xed\x42\xf2\x30\xaf\xdf\xfe\xc6\x64\x0f\xb7"
- "\xf3\x1d\x49\x56\xbe\xf1\x71\x17\xdf\x71\x9b\x9d\x8b\x75\xee\xfe"
- "\x8a\x8a\x6c\xb7\xf0\x87\x0b\x3e\x1d\x73\xe8\x16\x71\x56\xc8\x05"
- "\xbe\xb7\x17\xff\x98\x46\xbe\xf1\x41\x17\xe4\xc9\x8c\x89\x09\x1e"
- "\xb2\x15\x04\xaf\xff\xd3\x25\xef\x67\x10\xdf\x30\x63\xa6\xb2\xfd"
- "\x36\xbb\x92\x97\xca\x78\x7c\x92\x75\x62\x06\xb7\x63\x0d\xd3\x49"
- "\x5d\x37\xff\x1c\xdf\xff\x5c\x7c\xf7\xda\x24\xab\xb2\x34\x83\xe2"
- "\x33\x09\x7c\xc9\xa5\xf5\x3c\x0b\x78\xb2\x3c\xd5\xe0\xdd\x38\x23"
- "\xfd\xfd\x8c\x63\x7d\x8b\x75\xa6\xfb\x69\x66\xaf\x36\x49\xa8\x93"
- "\x97\xa7\x32\x0f\xbe\xe3\x41\x5b\x89\x77\x78\x5d\xa9\xd6\x83\x87"
- "\xb1\xee\x7e\xaa\xa1\x1f\x5f\x9a\x6a\x40\x9b\x46\x3b\x12\xce\xb2"
- "\xba\x2e\x9a\x2b\xb7\x8e\x79\xdf\xca\xd8\xbd\x56\x8f\xdd\xe0\x12"
- "\x76\x6b\x46\xcb\x5c\x76\x35\x1f\xfa\xa0\xab\x55\x77\xeb\xaa\x49"
- "\x39\x68\x03\xda\xbe\xbf\xa9\x21\x5c\x41\x3b\x46\x49\xba\xd1\x7b"
- "\x19\xa0\x6d\x86\x26\xdf\xf4\xad\xfe\xb7\x8a\x71\xa3\x2c\x4e\x65"
- "\x74\x9e\xef\x0d\xf0\x2b\x4a\x77\xaa\x41\xc1\x7a\x44\xcf\xde\x4f"
- "\x38\xc9\xe8\x9b\x92\xd6\xb7\x4a\x5b\xcd\x78\xd0\x19\xdf\x27\xff"
- "\xc1\x1a\x5d\x91\x37\xc3\xdb\x9d\x11\xba\xff\x37\xcd\x48\x44\xfd"
- "\xd2\xf9\x46\x43\x7e\xe8\xe7\x86\x34\x39\x3e\x6e\x2d\xc5\xdf\x4e"
- "\xfe\xf2\x12\xa7\xeb\xda\x5b\x2b\x45\xfc\xcc\x4d\xa9\xe9\x9a\xae"
- "\x08\xf3\x0d\x63\x24\xa9\x5f\x45\x6e\x4b\x68\xff\xa9\xb6\x1d\x95"
- "\x22\x6e\x59\xbf\xcf\xb9\xc1\x4b\xf1\x78\xcf\x92\x2f\xea\xca\xf7"
- "\x13\x3a\xfa\xd8\xa7\x49\xe3\x7a\xeb\x53\x2a\xff\xde\xeb\x79\x77"
- "\x1f\xcb\x2b\xed\x75\x8c\x6c\x07\x5d\x62\x0d\xf9\x5d\x7c\xac\x4e"
- "\xca\x20\xb7\xdf\x49\xb4\xf2\x60\x1d\xc9\xfe\x84\xe9\xdd\x58\x2f"
- "\x7f\xfb\x68\xb1\x7e\x24\xd6\x19\x2f\x78\x81\x0f\xeb\xab\xd8\xe4"
- "\x09\x2c\xaf\x36\xe3\x0c\xd3\xe2\x91\xf1\xb8\xc7\x5c\xaf\x3e\xea"
- "\xd2\xd3\x7e\x13\xc5\x1f\x13\xf2\xfa\xa6\xb4\xc4\xd7\xfe\x86\x35"
- "\x13\x7c\xc4\xee\xbf\xb9\xf4\x9e\xf6\x54\xb3\xf0\x85\x0d\x39\x22"
- "\x2f\x83\x2b\xbe\x3d\x28\x8a\x97\x60\x4b\xc9\xa7\xf8\xce\x87\xa6"
- "\xd4\x8b\x33\xd6\x87\x52\xab\xd8\xa1\xc6\x52\x56\xd3\xfc\x19\x9d"
- "\x0b\x7c\xf9\x50\xaa\x8d\xf8\xc9\x21\x1e\xf0\x8c\x9b\xc1\x33\x62"
- "\xbe\x0e\x50\x8c\x3b\x2a\xb5\x7d\x28\xda\x93\xd2\xf8\x45\x0f\xe6"
- "\x68\x99\x1a\x93\xcc\x53\x94\x34\xb2\x4c\xdd\x93\xa2\x58\x65\x2f"
- "\x65\xb1\xf8\x97\xf4\x4a\x6a\xa8\x3d\xa8\x21\x0b\x85\x0f\x16\x93"
- "\x12\xbd\xa3\x52\x8b\x59\x36\x69\xa1\x99\xfd\x19\x6d\x7f\x3f\xa1"
- "\xaf\x73\xf2\x76\xb1\x27\xeb\xc1\xb8\xf3\x60\xcc\x79\x40\x4f\xf4"
- "\x81\x1b\xfd\x16\x52\x16\xd3\xfa\xa0\x3b\x4f\xeb\x83\xff\xaa\x15"
- "\x7d\x00\x19\x6e\xf9\x63\x6a\x1f\x7c\x8a\x3e\x68\x46\x1f\x14\xb2"
- "\xfc\x83\x53\x6b\xd8\xe4\x29\xe8\x83\xb6\x33\xe4\x47\x5d\xc6\x84"
- "\xcb\x94\xb4\x17\x7d\xf1\xa9\x4b\x5f\xd7\x21\xfb\x60\xd7\xe3\xb2"
- "\x0f\x5e\x7f\xdc\x05\x3e\xe6\xd6\xfa\x57\x71\xef\x5d\x9a\x6a\xa6"
- "\x18\x39\xbc\x30\x9d\xe2\x57\xcb\xbe\xe8\x46\x5f\x74\xcb\xbe\xc8"
- "\x5d\x88\xbe\x38\xdc\x20\x7c\xb1\x1c\x6a\xac\x61\x35\xe9\xe5\xac"
- "\x16\xb8\x84\xbe\x98\x41\xfd\x42\xfa\x05\xef\xf2\x84\x98\x17\xb3"
- "\x59\x6c\x59\x36\x33\x69\xfd\xa1\x74\xa3\x3f\xb2\xd1\x1f\x5d\xe8"
- "\x0f\xb7\xaf\x3f\x62\x45\x7f\x9c\x54\xfb\xa3\x8b\x6c\xd9\xd0\x1f"
- "\x5d\xe8\x8f\x2e\xf4\x47\xa1\xec\x0f\xc2\xf9\x49\x1d\x06\xae\xfc"
- "\x33\x81\x6d\x6d\x0d\xd1\x1f\xcb\xd5\xfe\xf8\xf4\xdb\xf4\xc7\x7f"
- "\x95\x5e\xd8\x1f\xb7\xe7\x5c\xaa\x3f\xfc\x73\xe2\xce\x85\xd4\x1f"
- "\xdd\xe5\xea\x9c\xb8\x8e\xe6\x44\xbe\xfe\x27\x58\x8b\x88\xa6\x1f"
- "\xd6\xef\x15\x73\x02\x6d\xcd\x7f\xf5\x51\xb7\xbe\xa6\x19\xfd\x32"
- "\x8b\x7b\x85\x3c\xac\xf6\x8b\xec\x8f\xc7\x5c\x3b\xff\x26\xe9\x6f"
- "\x7e\x80\xd6\x0c\x9a\x1b\xd4\x3f\xe8\x27\xcc\x9f\x50\xf1\xfc\x02"
- "\xf7\x6a\x51\xa6\x42\xf3\x84\xe6\x08\xcd\x87\xda\x8c\xcf\x44\x7c"
- "\xf4\x43\x53\xaa\x19\xed\xd9\x1e\x4a\xdd\x8b\xbe\x2a\x65\xde\xa5"
- "\xe8\x9b\x2c\xcc\x13\x1d\xbb\x86\xe2\xfa\x1d\x4a\x2d\x26\x7e\xc1"
- "\x88\x31\x3f\xc0\x8b\x7e\xf2\x76\x9a\x06\xae\x86\x8c\xb5\x2d\xcb"
- "\x3f\x6f\xb6\xaa\x31\x8c\x79\x44\x12\xa5\x87\x7b\xd0\x47\x98\x3b"
- "\x41\x73\xc6\x17\xdb\xf8\xcb\x04\xb6\xa5\x89\x45\x0e\x9e\x23\xfb"
- "\xc8\x1b\x30\x67\x26\xce\xa1\x39\x93\x8f\x3e\xfa\xa4\x8f\x7d\x74"
- "\xa7\x3c\x8b\x1f\x07\xac\x1e\x6a\xc8\xc7\x3a\x89\x3e\xba\x23\xaa"
- "\xb7\x3e\xf2\x6e\xbf\xb5\xd4\x6b\x7c\x80\xe2\xf5\x8e\x50\x9e\x9d"
- "\xaa\x53\x20\x3f\x75\x41\x6e\x3d\xe4\xf2\xb0\x9c\x27\x99\x3e\xfb"
- "\x33\x16\xe1\x98\xfa\x31\x73\x38\x2b\x19\xf9\x46\x26\xbd\x37\xc5"
- "\x48\x70\x78\x2a\x81\x57\xcf\x4c\xa1\xfb\x2d\xe2\xde\xc5\x96\x3f"
- "\xc9\xc2\x44\xbc\xcf\xd4\x72\xb6\x1a\xe3\x73\xf7\xe3\xe5\x7a\x65"
- "\xc3\x04\x8a\x73\x40\xf6\x0b\x76\x3a\xa7\x94\xb7\x8c\x45\xd5\x66"
- "\xd4\x90\x7f\xb8\xcf\xc9\xdf\x6f\x5d\x07\xca\x74\xf1\x2e\x2f\xd6"
- "\x8c\xad\x85\xbc\x92\xfc\xdd\x8f\xa2\x35\x82\x7c\x57\xe8\x7e\x36"
- "\x91\x78\x11\xd2\xff\xd9\x73\x5f\x02\xef\xf5\x33\x71\x1e\x0a\x69"
- "\xba\xda\xb9\x64\x4f\x71\xf7\xbb\x54\x2f\xa9\x8b\x97\xd7\x51\x14"
- "\x17\x31\xee\x99\x17\xf6\xe5\xba\xc2\x6d\x90\x87\xc1\xa3\x51\x39"
- "\x5b\xb8\x94\x0d\xab\x1d\x87\xdd\x42\x0f\xeb\xca\xcb\x88\xb0\x65"
- "\x93\x6f\x5d\xf2\x9d\x4f\x6b\xf6\xdd\x0b\x29\x66\x31\xdf\x8e\xf5"
- "\x2a\x2e\x35\xbd\xe2\x29\x97\xde\xbf\x2e\xff\xac\x1a\xeb\x59\xe5"
- "\xbd\x09\x3c\x8f\x62\x0c\xec\x47\xbb\x48\x0e\xfa\x6d\x93\x5b\x60"
- "\xca\x6b\x4f\x15\xeb\x49\x4f\xe4\x06\x3e\xd4\xfc\xed\xf7\x22\x06"
- "\xeb\x71\xdd\x5d\x47\x0e\xa6\x7a\x18\x7d\xff\x91\xeb\x69\xaf\xe5"
- "\xae\xa8\xf3\xfa\xf7\x3c\xe7\x23\x92\x8a\xf3\x9a\xfd\xf1\x27\x03"
- "\xe3\x4c\x12\xce\xec\x7e\x0a\x65\x12\xce\x34\xe5\xeb\x25\xb6\x24"
- "\x93\xae\x32\xb2\x27\xb6\xd4\xb6\x9d\x64\xb9\x18\xc7\xb5\x19\xe5"
- "\x22\x0e\xc4\x10\xe0\xbb\xb2\x1c\x78\xd2\x9d\x10\xb3\x05\x78\x42"
- "\x38\xb0\x15\xf8\xa1\x2c\x37\x0d\x2c\xe9\x62\x23\x35\x1c\x21\xde"
- "\x8b\xae\x4f\x62\x8c\x1a\xaa\x91\x86\x7e\x52\x80\xeb\xc0\x93\x84"
- "\xcd\xd9\x2c\x7e\x33\xc6\xe8\x16\xc2\x11\xf0\xc5\x93\x2c\xc0\x91"
- "\xa5\xc0\x91\x2c\x11\x07\xd8\xb4\x55\x2f\xf1\xe3\xed\xa6\x62\xbd"
- "\x4d\x8b\x03\x2e\xe8\x9b\x3c\xbf\x8e\xc6\x47\x7a\xbe\x38\x87\xe6"
- "\xa5\xf5\x69\x79\x6a\x58\x5d\x07\xc6\xc8\xa6\x67\x92\x29\x4d\xcc"
- "\xdb\xa5\x19\x03\x15\x39\xd6\x92\x89\x26\xdb\x4e\xb1\x44\x11\x2b"
- "\xf3\x6b\xd3\xc0\xb5\x0b\xd8\xc8\xad\xa7\x58\xfc\xd6\x05\x2c\x01"
- "\xf3\x55\xbf\x15\x75\x98\xbe\xd0\xc8\x44\xbc\x85\x88\x24\x1b\xd2"
- "\x43\xc6\x5b\x00\x5f\x6d\xda\x4a\x73\xe6\xd9\x04\x5f\x9d\x3c\xb6"
- "\x82\x29\x5e\xd0\x4e\xf8\x47\xd2\x25\xbf\x2f\x6d\xa0\x6f\xb6\x4a"
- "\x3e\x3f\xd9\x2d\xed\x90\x92\x72\x20\xab\xf4\x6f\xd5\x25\xef\xe6"
- "\xeb\x93\x2d\x96\x6c\xa6\x6b\xd5\x9e\x81\xf7\x54\xd0\x57\x37\xe6"
- "\xb3\x7c\x25\xfa\xb5\x9d\x0e\x2b\x78\x27\xf2\x87\xdc\xa7\x79\x98"
- "\x5c\x45\x65\x79\x6d\x05\x53\xa9\xbd\xca\xfa\x82\x69\xdb\x5a\x59"
- "\x22\x7f\x06\xfd\x31\x17\x6d\x6d\x65\xf1\x65\xad\x68\xeb\x52\xd9"
- "\x56\x2d\xee\xb9\x52\x78\x20\x1c\xcf\x2e\x1a\xab\xc8\xf5\x0c\xc5"
- "\x2a\x4a\x1c\x07\x0c\xbb\x8c\xff\x80\xb1\xda\x36\xe1\x9b\xa2\xd3"
- "\xe1\xf9\x8c\xd1\x77\x49\x77\xe4\x38\x23\xc6\xf4\xcb\x34\x96\x95"
- "\xf2\x25\xce\xb4\x46\x8c\xed\xce\x0c\xc6\xf1\x7b\x7f\x93\x8b\x7c"
- "\x41\x08\x9e\xcf\xa9\xfb\x59\x3d\xf1\x69\xef\x20\x8d\xc6\x7e\xc0"
- "\x98\xaf\xa7\x31\x4f\xcf\xc5\xb8\xc7\x7b\x8e\xc6\x63\x8c\xca\x0b"
- "\x2c\x87\xfa\x5f\x2b\xeb\xb8\xee\x9e\xe7\xa8\x2c\x1a\x0b\xa4\xe3"
- "\xa1\xb9\x26\xfb\xbe\x92\x6c\xc0\x4d\x3c\x6e\x62\xbd\xbc\x77\x91"
- "\x8f\x11\x23\x8d\x01\x31\x56\x80\xdf\xe4\xbb\x94\xf3\xd4\x30\x8c"
- "\x33\xaa\xe7\x40\xf4\x77\xa2\x36\x2e\x90\x16\xdb\x73\x6c\x0c\x29"
- "\x30\x92\x4c\x13\x4b\xbf\xbf\xe9\xf8\xe8\x5b\xff\xdd\xd3\xeb\x19"
- "\x05\x25\xfe\x56\x11\xff\x82\x70\xd3\xdb\x1e\x80\x99\x6d\x12\x33"
- "\x09\x93\x34\xdc\x14\xd8\x24\xfc\xe5\x57\x92\x2d\x6c\x86\xa8\x63"
- "\x1f\x71\xb3\xb6\xcd\x8f\x9b\x93\x2c\x01\xb8\xd9\xc6\xbb\x94\x6b"
- "\x43\xe1\x66\xca\x73\xc1\xb8\x99\xf2\x7c\x30\x6e\xde\x77\xb2\x27"
- "\x6e\x5e\x88\x99\x29\x1f\x86\xc2\x4b\xc8\x31\x23\x5a\x75\xf7\x95"
- "\xf5\x8e\x95\x29\x1d\x7d\xc7\xca\x7b\xfb\x05\x63\xe5\xd8\xa4\xff"
- "\xff\x62\xe5\xbd\x2f\x06\x61\xa5\xf1\x1b\x62\x65\xab\xc0\xca\x58"
- "\xfe\x4f\xcc\x09\x15\x3f\xb6\xce\xed\x05\x2b\xe7\x5e\x62\x2e\x3c"
- "\xd3\x1b\x56\xde\x7b\x3a\x18\x2b\xef\x8b\x0f\xc6\xca\x7b\x8f\xf8"
- "\xb1\x52\x7d\xf6\x9d\x60\xe5\xbd\xae\xef\x07\x2b\xef\x75\x09\xac"
- "\x3c\x45\x58\x79\x5f\xed\xa5\xb1\x32\xc5\x13\x1a\x2b\x91\x2e\xb0"
- "\x32\xc5\xe3\xc7\xca\xcf\x2e\x81\x95\xf7\xff\xae\x0f\x58\x19\x2b"
- "\xb0\xd2\xd8\x0b\x56\xce\x05\xad\xd4\x71\x21\xc6\x5e\x8f\xb1\xa1"
- "\x62\xa5\xc9\x87\x95\xdf\x60\x7c\xf4\xad\xff\xee\xaf\xb8\x18\x56"
- "\x2a\x36\xc9\x5f\x12\x56\xf2\x38\x15\x2b\xe7\x79\x58\xf6\x11\x60"
- "\xe4\xe1\x56\x11\x57\x43\xd8\xed\xe2\x2f\xe7\x31\xc2\xa2\xc7\x2c"
- "\xaf\x83\x5e\x0e\x67\x85\xc0\x26\x71\xf6\x6a\x02\x61\x55\x05\xf2"
- "\x96\xfa\xf8\x4e\x81\x9d\x47\x54\xec\x9c\xa6\x62\xe7\xf4\x7f\x01"
- "\x3b\x1f\xa7\xbe\x1c\xf7\xee\x79\xbd\x86\x9d\xeb\x81\x9d\xe3\x04"
- "\xff\x40\xfb\xba\x12\x3b\x27\xdc\xa9\xd5\x8b\x74\x9a\x8e\xcc\x97"
- "\x98\xac\xd7\x99\x0b\x71\xf4\x01\x2a\x6f\xfc\x50\xfb\xdc\x36\xe6"
- "\xc3\xd2\x69\x7e\x2c\x3d\xae\x7b\xf0\x64\xef\x38\x3a\xfe\x0e\x1f"
- "\x8e\x16\x02\x47\x8f\x06\xe0\x28\xe4\xa6\xd7\x08\xf3\x80\xa3\x9d"
- "\x02\x47\xdf\x56\x71\xf4\x81\x89\x07\xa7\x01\x47\x1f\xd0\x70\x74"
- "\x7c\xbe\xbb\xf0\x3d\x8f\xbb\xe8\xd2\x38\xda\x29\x70\xd4\xf2\x7f"
- "\x1f\x47\xab\x7a\xe0\x28\x64\x57\x8a\x7d\x1e\x12\x47\xb5\xf1\x28"
- "\x70\x34\xdf\x8f\xa3\x82\xae\x0f\x9c\xa8\x4b\x07\xdd\xd3\x2d\x42"
- "\x76\xf3\xe1\xa8\xa5\x42\xe2\x28\xd2\x84\xfe\x64\x31\x70\x14\xe3"
- "\x2f\xaf\x96\x7c\x5c\xb1\x64\xd4\xd1\x48\xf8\xba\x0d\x73\x86\x68"
- "\xe4\xc3\xd3\xb9\x98\x33\x84\x31\xed\x98\x33\xc0\xd1\xe9\x67\x8d"
- "\x4c\xcc\x97\x22\xcc\x97\xd6\x5e\x62\x7d\x69\xf6\xb6\xbd\xe2\xe9"
- "\x83\x77\x07\xe3\xe9\x83\x99\xc1\x78\xfa\xe0\xf5\x7e\x3c\x55\x9f"
- "\x11\x9e\xa2\xcf\x40\x9f\x9d\x84\xa9\xdf\x0e\x4f\x1f\x4c\xf6\xe1"
- "\xa9\x5e\xc5\xd3\xb9\x97\xc6\x53\xb1\x2f\xd8\x0b\x9e\x06\x62\x43"
- "\xef\x78\xfa\x60\xb2\x1f\x4f\x27\x5c\xe5\xc3\xd3\x86\xde\xf0\x74"
- "\xfc\xd8\xd0\x78\x8a\x74\x81\xa7\xe3\xc7\xfa\xf0\xb4\x21\x04\x9e"
- "\x3e\x10\x88\xa7\x13\x07\x4b\x3c\xad\x90\xbe\x30\x80\xa9\x75\x1d"
- "\x18\x1f\x34\xe7\x32\x4b\x05\xa6\x2a\xc0\x54\x8a\x7f\x4a\xf1\x5f"
- "\xc8\x5e\x3e\x14\xa6\x4a\xcc\x75\x32\xc2\x55\x9a\x9b\x79\x13\x21"
- "\xef\x62\x2d\x02\x4d\xc4\xda\xab\xd1\x6f\x5b\x00\xbe\xa6\x2d\x33"
- "\x12\x6f\x17\x34\x56\x14\x6d\xac\xb4\x27\x90\x1d\x70\xd0\x58\xe9"
- "\x5b\x5f\x4e\x8c\xea\x0d\x5b\x7b\x93\xdd\x0f\x92\xec\xfe\x08\xd3"
- "\x2f\x7f\x04\xf8\x9a\x4a\xb2\xfb\xce\x1e\xb2\xfb\xce\x0b\x65\xf7"
- "\x4f\x2e\x8e\xa3\x7d\x92\xdd\x1f\xa5\x3e\x9c\x34\x20\x18\x47\x27"
- "\x0d\x0e\xc6\xd1\x87\x9e\xa7\x7a\x49\x1c\xdf\x19\x5a\x76\x17\xf3"
- "\x7c\xd2\x63\x3e\xd9\xbd\x21\x18\x3f\xfd\xb2\xfb\x43\xb7\xf5\x8e"
- "\xa3\x93\x56\x05\xf1\xa3\xd3\x55\x1c\x7d\x4a\xc5\xd1\xa7\xfc\x38"
- "\x7a\xe8\x63\x8d\x1f\x9d\xfc\xf2\x87\x0d\x81\x38\x3a\xa9\xda\x87"
- "\xa3\x8d\x17\xe2\xa8\x86\xa1\x84\xa7\x54\x0e\xe9\xb2\x76\x01\xa7"
- "\xdf\x78\xca\xa2\x97\xba\xda\x74\xa2\x5d\x64\x4f\x5d\x6d\x6d\xdb"
- "\x59\x96\x3b\x8d\xf0\xb4\x54\xe0\xa9\x41\xc7\x66\x00\xfb\x86\xd0"
- "\x99\x81\x32\xda\xd3\xcf\x92\xf1\x93\x48\xbf\xa4\x2c\x95\xb1\x08"
- "\x35\x3d\x13\xda\x2b\xf6\xf2\x9f\xfc\x4c\xc5\x54\x8a\x31\x8e\x31"
- "\xb7\xf9\x1c\x30\x35\x2b\x04\x6f\xba\x1c\x98\x9a\x1d\xc0\x9b\x62"
- "\xee\xbf\xfd\x54\x4f\x4c\x9d\x72\x4b\x1d\x8d\x15\xc2\xd4\x20\x39"
- "\x7e\xe7\x7f\x80\x1c\x3f\x65\x4d\x30\x96\x4e\xb1\x07\x63\xe9\x94"
- "\x25\x7e\x2c\x55\x9f\x7d\x27\xbc\xe9\x94\xd5\xdf\x0f\x6f\x3a\x65"
- "\xb5\x5f\x8e\x7f\x68\x8e\x0f\x4b\x0f\xf7\x86\xa5\x93\x56\x87\xc6"
- "\x52\xa4\x0b\x2c\x9d\xb4\xda\x87\xa5\x87\x43\xc8\xf1\x41\x58\xfa"
- "\xf0\x44\x89\xa5\x3b\x25\x6f\xda\xa0\xf1\xa6\x3b\xff\x3f\x28\xc7"
- "\x3f\xdc\xab\xff\x9f\xde\xe4\xf8\x83\x6d\x12\x3f\x09\x9f\x34\x0c"
- "\xf5\xcb\xf1\x3b\x7b\x97\xe3\x2f\x81\xa1\x7d\xe2\x45\x05\x86\xfe"
- "\x7c\x62\x30\x86\xfe\xfc\xa1\x60\x0c\x7d\xf4\xdd\x9e\x18\x7a\x21"
- "\x7e\xfe\x7c\x5d\x28\xec\x94\x72\xfc\xa3\x96\xde\x71\xf3\xe7\x7b"
- "\xfb\x8e\x9b\x53\x8f\x04\xe3\xe6\x54\xf6\xbf\x03\x37\x1f\x99\x1f"
- "\x84\x9b\xc6\x6f\x88\x9b\xff\x16\x99\xfe\x91\x1e\xfa\xcf\x47\x7a"
- "\xe8\x3f\x1f\x09\xd0\x7f\x3e\xf2\x1d\xea\x3f\x1f\xf9\x9e\xf4\x9f"
- "\x8f\x54\xf9\x79\xd0\x47\x5f\xbe\x34\x6e\xfe\xbc\x2a\x34\x6e\x22"
- "\x5d\xe0\xe6\xcf\xab\xfc\xb8\x79\x29\x1e\xf4\x17\xcf\xf5\x01\x37"
- "\xff\xc3\x65\xfa\x5f\x5c\x54\xff\x19\x4a\xa6\x27\xdc\x14\x78\xd9"
- "\xd0\x43\xa6\x7f\x24\x50\xa6\xdf\xe9\x97\xe9\xc7\x49\xdc\x72\x78"
- "\x6c\xc1\x32\xfd\x77\x8e\xa3\xa9\x1b\xdd\x3e\x7d\xe8\xaf\x80\xa3"
- "\xa9\x2f\x52\xdb\xdc\x3e\x7d\xe8\xb4\xab\xb4\x7a\x49\x99\x7e\x3d"
- "\x93\xf5\x0a\x21\xd3\x0b\xdb\xe1\xd4\x13\x3e\x99\xbe\xa1\xa7\x4c"
- "\xff\x44\x6d\xef\x98\xfa\x98\x31\xa4\x4c\x4f\xf2\xb7\xc0\x54\x8b"
- "\xc0\xd4\x73\x9b\x02\x31\xf5\xf1\x1b\x04\xa6\xde\xa7\x61\xea\x63"
- "\x53\xdd\x98\x9b\xee\x88\x4b\x63\x2a\x95\xe3\xc7\xd4\x8c\x7f\x0f"
- "\xa6\xda\xbf\x39\xa6\x06\x9e\x57\x7d\x1b\x6d\xf7\x61\xaa\xa0\xf1"
- "\xe3\x1f\xd6\xa5\x13\xa6\x66\xf4\x90\xef\x77\x86\x96\xef\x3f\x64"
- "\x7a\xa2\x8f\x26\xdf\x53\x1f\x08\xbc\xf9\xbf\x2a\xdf\x3f\x71\x4d"
- "\x30\xb6\x3e\x31\x35\x18\x5b\x9f\x18\xe0\xc7\x56\xf5\xd9\x77\x22"
- "\xdf\x3f\x61\xfe\x7e\xe4\xfb\x27\xcc\x7e\x6c\x7d\xc2\x7b\x69\x6c"
- "\x7d\xcc\x14\x1a\x5b\x91\x2e\xb0\xf5\x31\xd3\x45\xb1\xf5\xbe\x40"
- "\x6c\x9d\x76\x52\xc3\x56\xbf\x7c\x8f\xf1\x41\xf3\x2f\xd3\xf6\xed"
- "\xe5\xfb\xf1\xdf\xb7\x7c\x3f\xad\xad\x4f\xf2\xfd\x26\xe0\x2c\x64"
- "\xf1\xe5\x1f\x41\xbe\x7f\x48\x95\xef\x1b\xcb\x7b\xc8\xf7\xe5\x17"
- "\xc8\xf7\x39\x0f\xa9\x98\x8a\x39\x25\x30\xf5\xa9\x9d\xdf\x5e\xbe"
- "\x7f\x98\xfa\xf0\xc9\x13\xc1\x98\xfa\xe4\xc9\x60\x4c\x9d\xb1\x82"
- "\xea\x25\x31\xbd\x3c\xb4\x7c\x2f\xe6\xf9\xf4\xdb\x82\xe4\x7b\xd4"
- "\xef\x42\xf9\x7e\xc6\x0d\x41\x98\x3a\x3d\x10\x53\xa7\xcf\x0a\xe2"
- "\x53\xd1\x2e\xc2\xd4\x57\x8f\x4a\x4c\xfd\xed\xd1\x00\x4c\x9d\xf4"
- "\x5b\x15\x53\xd3\x36\x7e\x38\x35\x10\x53\xa7\xef\xd4\x30\x55\xe0"
- "\xe5\x74\xb7\x3e\x2f\xf5\x42\xbb\x13\x61\xef\x43\xb6\x40\x28\x9b"
- "\xce\x8a\x51\x99\xbb\x8f\x66\x5c\xda\xde\x24\x35\xb4\xbd\x89\x23"
- "\xd3\xc9\x6a\x9a\x6d\xc2\xce\xa4\x8c\xec\x4c\x0a\xd8\x35\x65\x5d"
- "\xd2\x4f\x80\xf0\x67\xd8\x8b\x8f\x80\x27\x1f\xf3\xe3\x2c\xd9\x64"
- "\x6d\x26\x9b\xac\x73\xd2\x06\x08\xfd\x7d\xa1\x5f\x00\x8d\x6f\x02"
- "\x1e\xbc\x75\xb4\x27\xce\xa6\x5f\x5f\x47\xe3\x67\x5a\x46\x0f\x99"
- "\xbf\xfc\x3f\x40\xe6\x4f\x2f\x08\xc6\xd7\xf4\x3d\xc1\xf8\x9a\x3e"
- "\xc7\x8f\xaf\xea\xb3\xef\x84\x77\x4d\xcf\xff\x7e\x78\xd7\xf4\x7c"
- "\xbf\xcc\x3f\xe3\x49\x1f\xbe\xd6\x07\xe0\xeb\xd1\x40\x7c\x9d\x3e"
- "\x4f\xe0\xeb\xd1\x9e\xf8\x8a\x74\x81\xaf\xd3\xe7\xf9\xf0\xb5\xbe"
- "\x87\xcc\x7f\xb4\x27\xbe\x3e\x75\xb7\xc0\xd7\xc6\xf2\x1e\xbc\x6b"
- "\xf9\xa5\x65\xfe\xc6\xff\x34\x99\xff\xa9\xe4\x3e\xc9\xfc\x84\xa9"
- "\xf3\x24\xa6\x12\x66\x69\xb8\xea\x97\xf9\xcb\x7b\x95\xf9\x2f\x85"
- "\xab\x7d\xe2\x55\x05\xae\xce\xbc\x3b\x18\x57\x67\xde\x1b\x8c\xab"
- "\x4f\x7f\xd8\x13\x57\x2f\xc4\xd4\x99\xcf\x85\xc2\x53\x29\xf3\x3f"
- "\x6d\xed\x1d\x4b\x67\x56\xf4\x1d\x4b\x67\x7d\x11\x8c\xa5\x33\x3b"
- "\xfe\xf7\x62\xe9\xec\x25\x41\x58\x6a\xfc\x86\x58\xfa\x6f\xd1\x03"
- "\xcc\xae\x0d\xc6\x52\x24\x06\x61\xe9\xec\x37\xfd\x58\xaa\x3e\xfb"
- "\x4e\xb0\x74\x76\xcd\xf7\x83\xa5\xb3\x6b\xfc\xbc\xea\xd3\xaf\x5e"
- "\x1a\x4b\x67\x56\x86\xc6\x52\xa4\x0b\x2c\x9d\x59\xe9\xc7\xd2\xcf"
- "\x2e\x81\xa5\xbf\x5c\xd3\x07\x2c\x0d\xd6\x03\xf4\xc4\xd2\xef\x5d"
- "\x0f\xf0\xcb\xd5\x7d\xd2\x03\x68\x58\xfa\xd0\x85\x7a\x00\xc2\x57"
- "\xa1\x07\x00\xbd\x34\x0c\x13\x7a\x80\xb1\x12\xcb\x1c\x9e\xe2\x20"
- "\x3d\xc0\x77\x8f\xad\x19\x5b\xdc\x3e\x7d\x6a\x21\xb0\x35\x43\xc4"
- "\x95\x74\xfb\xf4\xa9\xf3\x6e\xd3\xea\x25\xf5\x00\xbf\x62\xb2\x5e"
- "\x21\xf4\x00\xf7\x88\xf2\x4e\x07\xe9\x01\x02\xb0\xf6\xb8\xee\x99"
- "\x13\xbd\xe3\xec\x1c\x53\x90\x1e\xa0\xc9\x8f\xb3\xe7\xc8\x46\x1d"
- "\x38\x28\x70\x36\x2e\x10\x67\xe7\x8e\x17\x38\x7b\x8f\x86\xb3\x73"
- "\xa6\x75\x62\x6e\x76\xf6\x15\x67\xe9\x1c\xc1\xd1\xf4\xef\x07\x67"
- "\x2b\xfb\x80\xb3\x01\xba\x81\xb7\x40\x0f\x1f\xce\x0a\xba\xcf\x3d"
- "\x56\x37\x8d\x70\x36\xbd\x87\x6e\xa0\x3c\xb4\x6e\xe0\xfd\xef\x43"
- "\x37\xf0\xcc\x9d\xc1\x78\xfb\x8c\x25\x18\x6f\x9f\xb9\xd6\x8f\xb7"
- "\xea\xb3\xef\x44\x37\xf0\xcc\x1d\xdf\x8f\x6e\xe0\x99\x3b\xfc\x78"
- "\x3b\xef\x8a\x4b\xe3\xed\x1c\x73\x68\xbc\x45\xba\xc0\xdb\x39\xe6"
- "\x8b\xe2\xed\x3d\x81\x78\x3b\x7f\x80\x86\xb7\x7e\xdd\x40\xb9\xaa"
- "\x1b\x28\xbe\xb4\x6e\xa0\xb1\x17\xdd\xc0\xbd\xdf\xb7\x6e\x60\xfe"
- "\x05\x3e\x09\x2f\xa6\x1b\x38\xbf\x49\xda\xed\x2f\x27\xbb\xfd\x27"
- "\x81\xbf\x53\x3e\x06\x0d\x2e\x6d\xb7\x9f\xa3\xd9\x9f\xa6\x97\xaa"
- "\x38\x5b\x1a\x52\x37\x70\xb0\xa5\x77\xdd\xc0\xc1\xc3\x81\xf6\xa7"
- "\x0b\xfa\x05\xef\x5b\x2d\x18\xa0\xed\x5b\x1d\xfc\x1b\xe1\xec\x22"
- "\x11\x17\x46\xd9\x90\x5e\x2e\xfd\x6a\x2f\x32\x52\x3d\x43\xd9\xf1"
- "\xbf\xad\x04\xee\x65\x2d\x98\xed\xd3\x15\xd4\x13\xde\x96\x32\x85"
- "\x67\x44\x90\x5f\x6f\xa1\x2b\x78\x94\xc6\xde\xc2\x77\x03\x71\x77"
- "\xff\xa7\x81\xb8\xbb\xc0\xa6\xe1\xae\x17\xb8\xbb\xaf\xa9\x54\xea"
- "\x5f\x1f\x97\xb6\xa9\xbb\x1e\x0f\xb0\x4d\xfd\xf8\x3d\x15\x77\x9f"
- "\x5d\xf3\xa1\x13\xed\xbf\x98\xfd\x14\xde\x7f\xfd\xd3\x6f\x6a\x83"
- "\x5a\x1a\xd2\x76\x4a\xc5\xa7\x90\xf6\x53\xa8\xab\x71\x8b\x3a\x57"
- "\xbd\x98\xa7\x5b\x02\xec\xa7\xca\xb2\x31\x9f\xd5\x73\x25\x17\xb5"
- "\x43\x7d\xdc\x6f\x87\xca\x37\xa4\x35\xd2\xfa\xa6\x6c\x4c\x2f\xef"
- "\xe2\x19\x61\x3c\x36\xad\x91\xbe\xdf\xdd\x8d\x75\x27\x25\x35\x4c"
- "\xca\x75\x69\x76\x60\xcf\x10\x49\xf7\x67\xab\xbd\x58\x6b\xbc\x58"
- "\x6b\x94\x0d\x69\x76\x0f\xf1\x26\x9b\xd2\xaa\xca\x20\xe7\x79\x0a"
- "\x45\x9c\xc1\x81\x25\x90\xf5\xb6\x91\x9c\x77\x0a\x73\x23\x2f\x41"
- "\x4f\xf5\xd1\x70\xd4\xd0\x82\x76\x9c\xba\x38\x2f\xe7\xf9\xda\x8f"
- "\xa3\xf6\x07\x0e\xe2\x9b\x96\x7d\x75\x34\x76\x53\xfd\x67\x0a\x04"
- "\xcf\xdc\x8b\xad\x2c\xd5\x45\xfa\x57\xc4\x58\xf8\x0e\x74\x12\x81"
- "\xf5\x09\xc6\xf5\x85\x43\x83\x71\x7d\xe1\xb8\x60\x5c\xb7\x78\xfd"
- "\xb8\xae\x3e\x03\xae\x7b\x0b\x25\x1f\x8d\xb5\xef\x5b\xf2\xd1\x0b"
- "\x63\x35\x5c\x57\x54\x5c\xdf\xfa\x0d\x70\xfd\xa2\x7c\x74\x00\x2e"
- "\xf5\x8e\xeb\x0b\x63\xfd\x3a\x89\x85\xa7\x43\xda\xc8\x7e\x1a\x88"
- "\xeb\x0b\x4a\x05\xae\x7f\xda\x13\xd7\x17\x94\x4a\x5c\x5f\x50\xda"
- "\xeb\x79\x82\x4f\x7b\xee\xa7\x2d\xfa\x44\xe0\x7a\x83\x6a\x23\x5b"
- "\xdf\x87\xf3\x04\x0d\x12\xd3\x35\x2c\x27\x7d\xd5\xf7\xab\x93\x58"
- "\x74\xb8\x2f\x3a\x09\x81\xe5\x6d\x12\xcb\x09\x1b\x35\x3c\xff\x26"
- "\xe7\x09\x2e\x85\xe7\x1a\xdf\x4c\x78\xde\x1b\xdf\x1c\x8c\xe7\x8b"
- "\x3f\x09\xc6\xf3\xc5\x47\x82\xf1\x7c\xe9\x27\xc1\x78\xbe\xf4\x70"
- "\x4f\x3c\xbf\x10\xcb\x33\xaf\x0f\x85\xe3\x96\x47\x49\x47\xb1\x74"
- "\x55\xef\x18\x9e\x39\xb5\xef\x18\xbe\xe4\xa1\xff\x75\x18\x6e\xec"
- "\x89\xe1\x4b\x56\x13\x06\x79\x8b\x7a\x60\xf8\x5c\x15\xc3\x55\x1c"
- "\xd9\xd6\xaa\xf2\xc2\x3d\x31\xbc\x0d\xed\xb8\x84\x3c\xee\xf9\x67"
- "\x4f\x0c\xcf\x2a\x08\xc2\x70\xe3\x25\x30\x7c\xae\xd4\x83\x04\xd9"
- "\xe5\xf6\xa2\x0b\x41\x3b\x6c\x5b\x7a\xe1\xcd\x35\x9a\x05\xd6\x27"
- "\x18\xc3\xb3\x8e\x04\x63\xf8\xd2\xa8\x60\x0c\xcf\x7a\xd7\x8f\xe1"
- "\xea\xb3\xef\x84\x37\xcf\x6a\xf8\xce\x79\x73\x6d\x7c\x5c\x14\xc3"
- "\xb3\x1a\xfc\xbc\xf9\xd2\x37\x2f\x8d\xe1\x99\xd3\x42\x63\x38\xd2"
- "\x05\x86\x67\x4e\xeb\xf5\x9c\xc3\x05\x18\x6e\xdd\xd8\x07\x0c\x0f"
- "\xd6\x85\x68\x18\xae\xea\x42\xb6\x05\xe8\x42\xbc\x85\x52\x17\xb2"
- "\xa5\x55\x8e\x8d\x21\x3a\x39\x4e\x31\x7e\x4c\x5b\xf5\x17\x97\xdd"
- "\xb6\x7c\x2b\x3d\x88\xb5\xd7\xf8\x6f\xa1\xf4\x20\x02\xbf\xe9\x8c"
- "\xc3\x63\xc0\xed\xfa\x6f\x78\xc6\x61\x9c\x76\xc6\xc1\xd6\xcb\x19"
- "\x07\x15\xcf\xa7\xff\x0b\x78\x2e\xce\x38\x2c\xdb\x11\xac\x63\x5e"
- "\xf6\xaa\xa6\x63\x96\x78\xbe\xe2\xad\x60\x3c\x5f\x51\xe9\x3b\xf3"
- "\x00\xcc\x77\x58\xd6\x5f\x70\xe6\xc1\x87\xed\x42\x0f\x9a\x3d\xc0"
- "\xfe\x68\x33\xf3\xe1\xfb\x34\x3f\xbe\xa3\xac\x39\x41\xd8\xde\x14"
- "\x88\xed\xd9\x89\x41\xd8\x7e\xb4\x34\xd8\x3e\xa2\xc9\x12\x80\xed"
- "\xda\x99\x87\xe5\x37\x7c\xd8\x78\x09\x6c\xc7\xfb\xdf\xfc\x8c\xd8"
- "\x77\x8b\xed\xda\xf9\x86\x90\xd8\x1e\x78\xbe\x21\xc0\xfe\x81\xb0"
- "\x5d\xc4\xc3\x18\xda\x03\xdb\x97\x67\xe8\xbd\x07\x30\x1f\x80\xeb"
- "\x34\x47\xbc\x1c\xd8\x2e\xe8\xbd\x3c\x23\x10\xdb\xbb\x0b\x25\xb6"
- "\x6f\x6e\xfd\xd7\xb1\xdd\xc7\x0f\x07\x62\xfb\x7d\x84\xed\x39\xb3"
- "\xe5\xf9\x8b\xfc\x6f\x76\xfe\xa2\x87\x7d\xc6\xe6\x6f\xa0\x7f\xb9"
- "\x28\xc6\x87\xa8\x57\x30\xc6\xe7\xec\x0b\xc6\xf8\x1c\x57\x30\xc6"
- "\xe7\xec\xf0\x63\xbc\xfa\xec\x3b\xe1\xd3\x73\xf6\x7e\x3f\xfa\x97"
- "\x9c\xbd\x7e\x8c\x5f\xf1\xe2\xa5\xcf\x5e\x64\x27\x85\xb6\xcd\x40"
- "\xba\xc0\xf8\xec\xa4\x8b\x9e\xbd\x08\xd2\x77\xe7\x3e\x1f\xf2\xec"
- "\x45\xfd\xbf\xcf\x36\x23\x70\xac\xf4\xd4\xbf\x7c\x7b\xdd\x77\x6e"
- "\x71\x5f\xf5\x2f\x74\xf6\x62\xf9\x27\x01\x67\x2f\x1a\x2f\x7d\xf6"
- "\x22\xe7\x91\x6f\xa8\x7f\xb9\x88\x6d\xc6\xc1\x29\x81\xf6\x6e\x79"
- "\xcf\x05\xe3\x7b\xde\xf3\x3e\x7c\x7f\x98\xf0\x7d\xe5\x96\x60\x7c"
- "\x5f\x59\x46\xf5\x0c\x75\x16\xe3\xed\xa0\x7d\xc5\xbc\x63\xc1\xb6"
- "\x1a\x3d\xf4\x2f\x0f\xd3\xd8\x5b\x39\x31\x08\xdf\x8f\x06\xe2\x7b"
- "\xbe\x31\x14\xef\x4e\x7a\x6f\x61\x53\x3c\x3d\xe0\x4c\xdb\x24\xcd"
- "\xfe\xad\xe0\x8a\x0f\x53\xd1\x7e\x67\x2f\xb6\x6e\xd3\xa5\xad\x9b"
- "\xb0\x6d\x23\x3d\x38\xca\x7a\x63\xba\x45\x9f\x9b\xce\x15\xb2\x75"
- "\xeb\x69\xe7\x46\xb6\x6f\x64\xeb\x56\x9b\x61\xeb\xd5\xce\x8d\xc6"
- "\x66\x6f\xb6\x6e\xa8\x77\xac\xc0\xfa\x2f\x54\xac\x57\x6d\xdd\xca"
- "\xb2\xfc\xb6\x6e\x41\x58\x1f\xc2\x7e\xf8\xad\xa3\xf9\xa1\xf9\xf8"
- "\x3c\x3f\xd6\x77\x11\x1f\xff\x5f\x3d\x74\x31\xa2\x0f\x0a\xa6\xfe"
- "\x5b\x75\x31\x02\xeb\x0b\xc7\xd7\xd1\x38\x9e\x66\x09\xa1\x8b\xb9"
- "\xd0\xc6\xf9\xdf\xa7\x8b\x29\x7c\x39\x18\xe3\x0b\x0f\x07\x63\x7c"
- "\xe1\xf3\x7e\x8c\x57\x9f\x7d\x27\x18\x5f\x58\xfe\xfd\xe8\x62\x0a"
- "\xcb\xfd\xba\x98\x95\x2b\x42\xda\xdf\x05\xe9\xd8\xf3\x4d\xa1\x75"
- "\xec\xf9\xaa\xfd\x5d\xbe\xa9\xd7\x33\x21\x17\xec\x69\xae\x9a\x21"
- "\x75\xec\xdf\xe2\x4c\x48\xe3\x7f\x9a\x2e\x66\x55\x7a\x5f\x75\x31"
- "\xc2\xb6\xf9\x13\xb2\x0f\xe9\xdb\x99\x90\x4b\x61\xbb\x8f\x77\xbf"
- "\xc8\x1e\x66\x30\xb6\x3f\x37\x23\x18\xdb\x9f\x9b\x1d\x8c\xed\xcf"
- "\xcf\x0f\xc6\xf6\xe7\xe7\xf5\xc4\xf6\x0b\x71\xfd\xb9\x37\x43\x61"
- "\xba\xe5\x61\xd2\xc5\x3c\x3f\xbc\x77\x3c\x7f\xce\xd9\x77\x3c\x2f"
- "\x3a\xf1\xbf\x1a\xcf\x8d\x3d\xf1\xfc\xff\x89\xff\xb7\xea\x65\x04"
- "\x9e\x17\x5f\x11\x84\xe7\xc6\x4b\xe0\xf9\xbf\x4d\x2f\x53\xbc\x30"
- "\x18\xcf\x8b\xb7\x07\xe3\x79\xf1\x63\x7e\x3c\xff\x7f\xd9\xfb\xf6"
- "\xb8\x26\xae\xb4\xff\x93\x04\x2d\xb6\x28\x60\xc1\x45\xab\x36\x76"
- "\x75\x8b\x56\x5b\xed\xab\xf5\xb2\xba\xd5\x56\x57\xa0\x5e\xb0\xd5"
- "\x2d\xf5\x52\x41\xc1\xa2\x8b\x36\x22\x5a\xb4\x08\x78\x5d\xb4\xa8"
- "\x60\xc1\xa2\x82\x62\xab\xad\xf7\xcb\x56\xdf\xc5\x5d\x75\xe3\xaa"
- "\x5d\x6c\xb9\xd9\xd5\x16\x5b\xac\xd1\xa2\x8b\x16\x6d\x44\xd4\x08"
- "\x49\xe6\xf7\x9c\x39\x13\x4e\x26\x99\x49\x32\x13\x40\xf8\xbd\xfe"
- "\x91\x8f\x32\x99\x39\x99\x79\x9e\xef\x79\xce\xf7\xfb\xcc\x39\xcf"
- "\xe1\xbe\xab\x97\xbc\x4c\x8a\xe6\xd1\xe4\x65\x52\x34\x94\xb3\xaf"
- "\x1a\xed\x3c\x9e\xaf\xa8\x10\x8e\xe7\x70\x9c\x8d\xe7\x2b\x2a\x44"
- "\xe7\x53\xdb\xc5\xf3\xd5\xbd\x24\xc4\x73\xc1\x39\x2a\x4d\x23\x2f"
- "\xb3\xba\xa7\xd4\xbc\x8c\xd8\x3a\x15\x1c\xdf\xe9\xfc\x14\xab\x75"
- "\x2a\x43\x2d\xeb\x54\x92\xf9\xf3\x53\xea\x3d\xb6\x7f\x34\x84\x1f"
- "\xdb\x3f\x1a\xc6\x8f\xed\xeb\xa6\xf0\x63\xfb\xba\xc9\x96\xfb\x24"
- "\x79\x99\xa5\x76\xeb\x56\xf8\x71\xfe\xa3\x6d\xda\x37\xcb\x91\x50"
- "\xac\x87\xb6\x5a\x8b\xc7\xf9\x8f\xf2\xc5\xe2\x3c\x9e\xaf\xb2\xe7"
- "\xdd\x68\x81\x38\x9f\x7a\xee\xff\x87\x38\x2f\x36\x0f\x85\xd5\x41"
- "\x10\xe3\x71\xbc\x67\xe3\x3b\x17\xeb\x71\x9c\x37\xfd\x43\x28\x47"
- "\xb3\xc6\xab\xa1\xe2\xbc\x78\x8e\x66\x6d\xab\xa2\xc9\x5c\x9c\x77"
- "\x65\x0d\xcd\x49\x7e\x8e\x26\x7b\x56\x43\xe7\x68\xd6\x46\xf0\xe3"
- "\xfd\xda\x0c\x7e\xbc\x5f\x1b\x4c\xe3\x3d\xf7\x5d\xbd\xf0\xf7\xb5"
- "\xe1\x8f\x26\x47\xb3\x36\x9c\xc6\xfb\x75\x43\x9c\xc7\xfb\x8f\x4a"
- "\x84\xe3\xfd\x47\x5c\x6d\xb6\x8f\x4a\x5c\x8f\xf7\x69\x75\xf1\xde"
- "\x7e\xfd\x4c\xb2\xfc\x39\x32\xc3\x1e\x75\x8e\x26\x4d\x34\xfe\x3b"
- "\xaa\x8f\x21\x3f\x47\xc3\xad\x49\x9c\x26\x5c\x1f\xe3\xac\x83\x39"
- "\x32\x67\x0b\xac\x63\x7d\x7a\x77\xfe\x5c\xc4\xf4\x5e\x96\xb9\x88"
- "\x67\x8b\x70\xac\xcf\x9c\xc0\x8f\xf5\x99\xe3\xc5\x72\x34\x47\xcd"
- "\xd6\x73\x12\xd3\x57\xf1\x73\x34\xb9\xfc\x1c\xcd\x18\x8c\xbd\xcc"
- "\x16\xe2\xb1\x3e\xfd\x30\x7f\x0e\x38\x59\xa3\xb8\xeb\x5d\x6e\x0e"
- "\xf8\xbb\x56\x73\xc0\x43\x3e\xe5\x62\xfd\xfa\x73\xf9\x25\x46\x24"
- "\x65\x1e\xa2\xfb\x73\xbd\x53\x04\xe7\x20\xb2\x63\x80\x83\x79\x88"
- "\x53\x2f\xfa\x20\xb3\x12\x74\xf8\x02\xab\x79\x88\x0e\xea\x19\xf3"
- "\xe2\xff\xbb\x1a\xd1\xf8\xff\x90\xa1\xf1\xdf\xdc\x9f\xe6\x6d\xcc"
- "\x98\xe7\xb3\x7e\xf9\xd8\xab\xa1\xf2\x36\x42\x79\x12\xed\x6b\x38"
- "\xfe\x67\x28\x08\xcf\x8f\x6e\x62\x79\x9b\x8c\x77\xf8\x71\x3f\x23"
- "\x95\x1f\xf7\x33\x86\xd1\xb8\xcf\x7d\x57\x2f\x73\xd1\x33\xc2\x1e"
- "\x0d\xcf\xcf\x08\xa3\x79\x9b\xcc\x7e\xce\xe3\x7e\xfa\x31\xe1\xb8"
- "\x9f\x7e\x8c\xc4\xfd\xf4\x63\x0e\xf3\x36\xbc\xb9\x91\x1b\xda\xbb"
- "\x9d\xb7\xb1\xf0\xfc\x47\xbe\xae\x67\x43\x80\x94\xbc\x4d\xdd\x9a"
- "\x74\xb7\xf2\x36\xc2\xf1\xde\xc2\xed\xcf\x3a\x78\xe7\xca\x8f\xf7"
- "\x9f\xb4\xe7\xc7\xfb\x4f\x3a\xf1\xe3\xfd\xe6\x81\xfc\x78\xbf\x79"
- "\x80\x50\xde\x86\x1f\xeb\x3f\x99\x2d\x14\xe7\x35\x63\x70\xde\x66"
- "\x53\x85\x78\x8c\xff\x24\x4b\x7a\x8c\xcf\x3a\xf2\x38\xc6\xdb\xc4"
- "\x78\x1f\xdb\x18\x9f\xa5\x6f\x54\x8e\xcf\xc6\xf8\x8d\xd7\x78\x31"
- "\xbe\x1e\x73\x39\xae\xac\x27\x11\xe7\xf6\x9b\x6c\xe6\xbf\x6f\xb2"
- "\x99\xff\xbe\xc9\x6a\xfe\xfb\x26\x4d\xfd\xc5\xf8\x4d\xf5\x3f\xff"
- "\xdd\xa5\x18\xbf\xc9\x6a\xfe\xfb\xe6\xf6\xce\x63\xfc\x27\xb9\xc2"
- "\x31\x1e\x8e\xb3\x31\xfe\x93\x5c\x87\xdc\x9e\x17\xe3\x37\x9b\x1a"
- "\x22\x97\xf3\x68\xd6\x1b\x6d\x36\x4a\xc9\xe7\x38\xaa\x3b\x22\x9a"
- "\xcf\x19\x60\xc9\xe7\x68\x44\xf2\x39\xf5\x15\xf3\x73\x5a\xf3\x63"
- "\x7e\x8e\x2f\x3f\xe6\x6f\x1b\xc6\x8f\xf9\xdb\x86\xf2\xf3\x39\xb1"
- "\x76\xf9\x1c\x7e\xfc\xcf\x99\xab\x1d\x63\x9d\xcf\xc9\xb5\xca\xe7"
- "\xe4\xde\x11\x8f\xff\x39\xa2\xf1\xff\x3e\x1b\xff\xc3\x05\xe2\xff"
- "\x96\xff\x23\xf1\x3f\xdc\x8d\xf8\xbf\xe5\x11\xc4\xff\xad\xb7\x48"
- "\x8e\xc7\xc5\x3a\x29\x47\xa5\xe7\x78\xdc\x1b\x07\x72\x47\xf0\xc7"
- "\x81\xdc\x78\xfe\x38\x90\xdb\x8b\x8e\x03\xdc\x77\xf5\x32\x0e\xe4"
- "\x0e\x7f\x34\xe3\x40\xee\x70\x3a\x0e\x6c\xeb\xe2\x7c\x1c\xc8\x11"
- "\x19\x07\x72\xb8\x71\x20\x47\xc2\x38\xf0\xa9\xaf\x78\x8e\x47\x23"
- "\x3f\xc7\x33\xf0\x51\xaf\x83\xfa\xd4\x47\x52\x8e\x67\x43\x44\x72"
- "\x01\xae\x91\x72\x05\x29\x3f\x8c\xb0\xe4\x78\xb4\x36\x39\x1e\xad"
- "\x5d\x8e\x67\xe1\x15\x2e\xfe\x8f\xe2\xd6\x9b\x8e\x71\xa3\x46\x0a"
- "\xbb\x97\xf4\x67\xad\xf9\xf3\xe6\x3f\x63\xe3\x3f\xad\xdf\xf7\x79"
- "\x0e\xbe\x2f\x32\xfe\x68\x1d\xd4\x40\xfd\x6c\x0a\x2f\xa7\x33\x4a"
- "\xa8\x46\xca\xe7\xbc\x79\x37\xfc\xf5\xa6\x9f\xa5\xf0\xe2\xfd\x18"
- "\xb2\xde\x74\xb7\xd0\x7b\xda\xba\x9a\xfc\xdb\x37\xb2\x35\xf9\xeb"
- "\x6a\xf9\x7d\x56\xe0\x52\x2d\xe9\x77\xb9\x5a\xd2\x3f\x3d\x82\x5a"
- "\xd2\xae\xd6\xe4\xff\xc9\xb6\x7e\xdf\x8e\x7e\xc5\x05\x5a\x54\x84"
- "\x31\x32\xd9\xb6\xf6\xa9\x56\x78\xed\xbe\x92\x5b\xbb\x3f\xa7\x61"
- "\xea\xa0\xe0\xfb\x61\xc7\xfc\xb6\x7b\x72\xf7\x25\xea\xd9\xfb\xc1"
- "\xfb\x76\xc3\xbd\x1e\x2d\x00\xac\x9a\x71\x3c\x8d\xc5\xf1\x74\x47"
- "\x25\x7b\xee\x15\xc0\x42\xdb\x01\x1a\x8c\xe3\xb5\x66\xe4\xa5\x59"
- "\x80\x63\xeb\x0e\x76\xde\x17\xd0\x08\x88\xad\xe4\xbc\xc5\x57\x18"
- "\x93\xa9\xed\x50\x0d\xdc\xff\x13\xfb\xe7\x94\xb4\x28\xd2\x55\x43"
- "\xbf\xb8\xc9\xee\xe3\x5a\x6c\x7c\xa0\xc5\xbe\x38\x31\xa7\xc4\x83"
- "\x81\xf8\xbb\x75\x06\xf2\x94\xd6\x4f\x77\xb0\xfb\xd4\xb3\x6b\xd7"
- "\xdb\xee\xd9\x8b\xeb\x80\x58\xb8\x95\xf9\x57\x9a\xdf\xca\x01\xfb"
- "\x98\x19\x32\xf6\x4d\x9d\x49\xe2\x06\x03\xe3\x35\xd8\x92\x9d\x63"
- "\x8b\xe3\x06\xbb\x87\x15\xc4\x8d\x2d\x55\xf4\x3d\x36\x6e\x1f\xdb"
- "\x88\xe4\x51\x3e\xa7\xf3\x5f\x74\x62\xb1\xf5\xb3\x34\xe1\xd8\xfa"
- "\x59\x1a\x89\xad\x9f\xa5\xd5\xc5\x56\x9d\x40\x1e\x85\x37\x8f\xfd"
- "\x0b\x6e\xfe\x8b\xd6\x86\x63\x6b\x9b\x61\x7d\x94\x2f\x24\xcd\x7f"
- "\x61\xe3\x69\x0c\x89\xa7\x38\x5e\x59\x62\x2a\xcd\xa3\x68\x45\xf3"
- "\x28\xce\x62\xaa\xa4\x35\xfc\x6c\x4c\xdd\x19\xc1\x8f\xa9\x3b\xa3"
- "\xf8\x31\x75\xcf\x35\xdb\x98\x6a\x1f\x4f\x77\xee\x10\x8a\xa5\xa4"
- "\x3e\xca\x9e\x0c\xf1\x38\xba\xb3\x44\x2c\x8e\xb2\xf3\xd3\xdf\xb5"
- "\x9a\x9f\x5e\x17\x47\x77\x5d\xe1\xc7\xd1\x5d\x7e\xae\xc6\x51\x76"
- "\x6f\x93\x9f\x1a\x61\x6f\x13\xd9\x71\x54\x63\x13\x47\x77\x2f\xa6"
- "\x71\xd4\x76\x7f\x13\x27\x71\x74\x56\xc3\xd4\x40\xe1\xc5\x51\xb3"
- "\x9e\xbd\x1f\xf5\x1c\x7c\xaf\x7b\x14\xfc\x38\xba\xa7\xaf\x78\x1c"
- "\xdd\x7d\x8e\xc6\x51\x72\x5e\xc3\xc6\xd1\x3d\x88\x17\x47\x67\x59"
- "\xc5\xd1\x5f\xa8\x86\xc0\x73\x2c\xea\xe2\xe8\x6c\xab\x38\x3a\xcb"
- "\x59\x1c\xdd\x83\xb0\x8d\x08\x47\xdd\x73\xc6\x79\x1c\xdd\x59\x2a"
- "\x1c\x47\xe1\x38\x1b\x47\x77\x96\xd2\x38\x2a\xc0\x51\x79\x71\x74"
- "\xef\x2e\x09\x71\xb4\x89\xd7\x46\xd9\xbb\x53\x52\xae\x82\xae\xe9"
- "\xb4\xaf\x91\x3a\xc5\x7a\x4d\x50\x9e\xcd\xbe\x27\x79\x76\xfb\x9e"
- "\x2c\xb4\xac\xf1\x0c\xe2\xe2\x6a\x88\x1b\x71\x95\x5d\xe3\xb9\xef"
- "\x28\x7f\xee\xc9\xbe\xe3\x96\xb9\x27\x24\xae\x1e\x1a\x67\xb9\x2f"
- "\xba\xef\x49\x9e\x83\x1a\xa9\xfb\x5b\xf3\x6a\xa3\x04\x59\xd7\x46"
- "\x39\xa4\x10\xaf\x91\xba\xbf\x2f\xaf\x36\xca\xd7\x3b\xeb\xf6\x3d"
- "\xb1\xad\x91\x4a\x63\xec\x81\x11\x6c\x8c\xad\xab\x41\xb5\x3f\xbe"
- "\xae\x46\xaa\x93\x75\x41\xb8\x9d\xfd\x57\xa3\x1b\x3e\xc6\x6a\x25"
- "\xc4\x58\xde\xbe\x27\xb6\x35\xa6\x0e\xdc\x28\xce\xcf\x43\x45\xe1"
- "\x79\x02\xb5\x51\xf3\x1e\xe9\xde\x27\xf8\xbe\x84\x63\xed\xc1\xd9"
- "\xfc\x58\x7b\x30\x97\x3d\xf7\x92\x50\xac\x3d\x38\x84\xc6\x5a\x72"
- "\xde\xe2\x4b\x36\xb1\xb6\x4c\x24\xd6\xc2\xb8\xba\xf5\xba\xd4\x58"
- "\x7b\x30\x86\x8d\xb5\x4b\xb9\x58\x7b\xb3\xbe\x63\xed\xc1\x18\x1a"
- "\x6b\x0f\xf5\x71\xbe\xc7\xd4\xfe\xc1\xc2\xeb\x72\xf6\x0f\x26\xb1"
- "\x76\xff\x60\x87\x7b\x4c\xf1\xe6\x7c\xfc\xb5\x8b\x65\x8f\x29\x9a"
- "\x0f\xc8\xe3\xf2\x01\xcd\x79\x4f\x94\xbf\xaa\xa5\xe6\x03\xbe\x01"
- "\xed\x8e\xd7\x5d\x7e\x88\xf7\x9c\x9a\x8c\xf7\x44\x39\x68\x93\x0f"
- "\x38\x68\x9f\x0f\x78\xc7\x71\x8c\x95\x94\x0f\x60\xd7\x5d\x7e\xd9"
- "\x89\x1f\x63\xbf\xec\xc2\x8f\xb1\xff\x7b\xd4\xb2\xce\x12\xdf\x8f"
- "\x78\xcd\xd4\x2f\x67\xd7\xe5\x03\xca\xf8\xb1\x95\xe6\x03\xfe\x77"
- "\xa6\x78\x8c\xfd\x92\x9f\xff\x0d\xd9\xc9\x5b\x67\xb9\xfb\xaa\x75"
- "\x1d\x6a\x4b\xfd\xa9\xc3\x47\xce\x9e\xb7\x8e\xb1\x5f\x96\x35\xa7"
- "\x3a\xd4\x75\xb5\xa6\x9c\xcc\xe5\xb6\xaf\x43\x7d\x64\x5c\x71\xfe"
- "\x41\x84\xd7\xb6\xb1\xf1\x96\x97\x1b\x38\xf8\x68\x72\x03\xf9\x07"
- "\x45\x72\x03\x47\x2e\xf0\xe3\xec\xff\x7a\xb2\xe7\x5e\x14\x8a\xb3"
- "\x47\x76\xd0\x38\x4b\xce\x5b\x7c\xd1\x26\xce\x96\xd6\x27\xa7\x3d"
- "\x72\xbe\x61\x73\x03\x47\xce\xd3\xdc\xc0\xff\xba\xb0\xfe\xf1\xcb"
- "\x5c\xe1\x38\xfb\x25\x97\x77\xfd\x92\xe6\x5d\x4b\x05\xf6\x4b\xe1"
- "\xc5\xd9\xbf\x2d\xb6\xac\x7f\x64\x39\x6d\x99\x85\xd3\x1e\x6c\x86"
- "\xfb\xa5\xfc\x2d\x41\x6a\x6e\x00\xaf\x73\xc7\xb1\x15\xc7\x2e\x4b"
- "\x7c\xa5\xb9\x81\x83\xe2\xb9\x01\x27\xf1\x55\xfa\xde\x7d\x79\x8b"
- "\xf9\xf1\x35\x6f\x09\x3f\xbe\x1e\x6b\x6d\x1b\x5f\xed\x63\x6b\xde"
- "\x49\xa1\xb8\x4a\x72\x03\xff\x38\x26\x1e\x53\xf3\x2a\xc5\x62\x2a"
- "\x5b\xd3\xef\x2a\x9d\x23\x4d\x63\xea\xdf\x5b\xf1\x63\xea\xd1\xde"
- "\xae\xc6\xd4\x47\xb2\x5f\x8a\xec\x98\x1a\x6d\x13\x53\xff\xbe\x83"
- "\xc6\x54\xdb\x3d\x53\x9c\xc4\xd4\x86\xca\x13\x58\xc7\x54\x1e\x77"
- "\xfd\x47\x77\x7e\x4c\xfd\xc7\x64\xf1\x98\xfa\xf7\x87\x34\xa6\x92"
- "\xf3\x1a\x36\xa6\xfe\x23\xb0\x61\xf3\x04\xff\x08\xa4\xdc\xf5\x1f"
- "\xb7\x9c\xc7\xd4\xbc\x6a\xe1\x98\x9a\x57\x4d\x62\x6a\x5e\xb5\xeb"
- "\x6b\xca\x8f\x9d\x93\x10\x53\x9b\xf8\x5e\x2a\xc7\x4a\x24\xe7\x09"
- "\x70\xbe\x15\xc7\xd2\x32\xf7\x6a\x87\xc4\x5b\x6a\x87\x0c\xe7\x62"
- "\xec\x1f\xdd\x8d\xb1\xc7\xaf\xf0\xe7\x34\x1c\xbf\x66\x99\xd3\x40"
- "\x62\xec\xc9\x15\xfc\xfd\x51\xed\x6b\x85\xf0\x6b\xa8\x9e\xe8\x57"
- "\x97\x27\xc0\x31\x77\xb8\x75\x9e\xe0\x64\x3f\xf1\x78\x7b\x62\x32"
- "\x2f\x4f\xf0\x95\x70\xbc\xbd\xcf\x8b\xb7\xff\x5c\xc8\xc6\xdb\xba"
- "\x1a\xaa\x27\x72\x2d\x35\x54\x9d\x72\x58\x5e\xbc\x0d\x6f\x9c\x78"
- "\x9b\xe7\x7a\xbc\xe5\xef\xa5\x62\x5b\x2f\x55\xdb\xa9\xf8\x34\xc4"
- "\x5b\xb6\x5e\x87\x6d\xcd\x54\xd7\xea\x75\x34\x54\xcd\x54\x7c\x5f"
- "\xc2\x71\x57\xbb\x8d\x1f\x77\xb5\xe7\xd9\x73\x05\xe3\xae\x76\x2e"
- "\x8d\xbb\xe4\x3c\x97\xe3\xae\xac\x9c\x81\x36\xb7\x61\x73\x06\xda"
- "\x5c\x1a\x77\x4f\x46\x39\x8f\xbb\x27\x22\x85\xe3\xee\x89\x48\x12"
- "\x77\x4f\x44\x3a\x8c\xbb\xbc\x39\x04\xff\x9a\x20\x58\xcb\xa3\xac"
- "\xb9\xef\xb3\xf2\xaf\xf1\x72\x72\x06\x10\x83\x95\x09\xb8\x86\x53"
- "\x38\x9e\x43\xe0\x3c\x67\xe0\x2c\xde\x4a\xcf\x19\x9c\x1a\xc7\x8f"
- "\xb7\xa7\x26\xf0\xe3\xed\xbf\x15\xf8\xbe\x1c\xe6\x0c\xd8\x18\x70"
- "\x6a\x5b\x5d\xce\x40\xc7\x8f\xb3\x34\x67\xf0\xd5\x21\xf1\x77\x5f"
- "\xa7\x0a\x78\xfc\xf6\x8f\x36\x35\xab\xdf\xa5\xf1\xf6\xeb\x22\xcb"
- "\x9c\xb1\xd3\xa6\xb3\xa1\xd6\xf1\xf6\xb4\x8f\x5d\xcd\xea\xf1\xf5"
- "\x58\xb3\x7a\x7c\x3d\xd7\xac\x9e\xc0\xaf\x59\xbd\xe9\x3e\x9d\x47"
- "\x26\xbd\x66\xf5\x99\x8d\x6c\x0c\xc6\x18\xc2\x75\xab\x5d\xc9\x23"
- "\x34\xf0\x5e\x2b\xbc\xd8\xcb\xcb\x23\x7c\xd5\x89\x1f\x7b\xbf\x0a"
- "\x15\x8f\xbd\x67\x6e\xd1\xd8\x4b\xce\x6b\x58\xce\xfb\x55\xc7\x86"
- "\xcd\x23\x7c\xd5\x91\xe6\x11\xbe\xba\x22\x18\x7b\x79\xef\xc6\x4e"
- "\x9d\x17\x7e\x37\x06\xc7\xd9\xd8\x7b\xea\xbc\x68\x1e\xc1\x6e\xfe"
- "\xd6\xbf\xcf\x90\x77\x63\x1c\xe7\xd5\x49\xc8\x23\x34\xb9\x39\x06"
- "\xff\x3e\x2d\x27\x8f\x80\xe3\x2d\x8e\x67\x96\x98\xeb\x4a\x1e\xa1"
- "\xfe\x39\x6e\xfe\x19\x7e\xcc\xcd\x3f\xcb\x8f\xb9\x05\x33\x6d\x63"
- "\xae\x7d\xbc\x3d\xdb\x4a\x28\xd6\x92\x3c\x42\x41\x80\x78\x9c\x3d"
- "\xdb\x57\x34\xce\xda\xcc\xcd\xa5\x71\xf6\xeb\x28\x7e\x9c\x3d\x1b"
- "\x2f\x2b\xce\xba\xba\x07\x4b\x93\x8a\xb3\xe1\x36\x71\xf6\x1b\x05"
- "\x8d\xb3\xb6\xfb\xb0\x38\x89\xb3\x0d\xb4\x0f\x8b\x38\xc7\xfd\x66"
- "\x05\x3f\xce\x7e\x93\x27\x1e\x67\xbf\x99\x40\xe3\x2c\x39\xaf\x61"
- "\xe3\xec\x37\xcb\x1b\x36\xb7\xf0\xcd\x72\xca\x71\x0b\x82\x9d\xc7"
- "\xd9\xb3\x83\x85\xe3\xec\x59\xee\xbd\xd8\xd9\xc1\xa2\x1c\xd7\x2e"
- "\xce\x16\xf6\x92\x10\x67\x9b\xf8\x1c\x84\x42\x49\xf5\x2f\xac\xf2"
- "\xb5\x2d\x8b\x75\x36\xeb\x25\x2e\x5a\xaf\x97\xb0\xca\x2d\x0c\xb7"
- "\xe4\x16\xf8\xfb\xb3\xc4\x5b\xf2\xb7\x43\xb9\xb8\xfb\x9a\xbb\x71"
- "\xb7\x68\xc8\x83\xba\xb8\x1b\x0b\x71\xb7\x88\x5d\x1f\xf1\xa0\x2e"
- "\xee\x9e\xbb\x67\xb9\x2f\xba\x3f\x8b\x48\x6e\x61\x10\xdb\x5e\x7a"
- "\x5d\x6e\x01\xc7\xe1\xa1\xd6\xb9\x85\x73\x3b\xc4\x63\x70\x51\x1e"
- "\x2f\xb7\xf0\x2f\xe1\x18\x5c\xcd\x8b\xc1\xc5\x37\xd8\x18\x3c\xc8"
- "\x12\x83\x8b\x8c\xf7\x41\x5b\xde\x5f\x29\x2d\x06\x57\xb3\x31\x38"
- "\xe8\xd1\xc4\xe0\xc3\xf5\x10\x83\x59\xbb\x97\xac\x29\xd6\x42\x0c"
- "\x9e\x8c\x63\x70\x90\x6b\xf9\x86\x46\xda\xa3\x05\xdf\x97\x70\x2c"
- "\x3e\xe7\xcb\x8f\xc5\xe7\x86\xb3\xe7\x0a\xc6\xe2\x92\x2b\x34\x16"
- "\x93\xf3\x1a\x36\xdf\x70\xce\xa7\x61\xf3\x0d\xe7\x7c\x68\x2c\x3e"
- "\x77\xc1\x79\x2c\x2e\xd2\x0a\xc7\x62\x38\xce\xc6\xe2\x22\xad\xc3"
- "\x58\x3c\xc8\x3a\x16\x7f\x5b\xc7\x79\x79\xf9\x06\x5d\x73\xdf\xbb"
- "\xe5\x5b\x51\xfe\xab\xee\x8c\x92\xaf\x2a\xfe\xd3\xa9\x38\x1b\xa1"
- "\xbb\x4b\x51\x72\xb1\x71\x10\x82\x63\x60\xbf\xff\x8c\x28\x0e\x18"
- "\x80\xcc\xeb\xdf\x48\xc6\xf1\xf8\x63\xfc\x01\x8e\x9b\xa6\xe4\xfa"
- "\x16\x6b\xe3\xff\xb0\xf3\x5d\xf1\x71\x1c\x7b\xb7\x5a\x7d\x2f\xf4"
- "\x5b\x4c\xda\x1b\x88\xbb\x2e\x97\xac\xbb\x79\xc3\xc3\xf2\x37\xc6"
- "\xa6\x4e\xf1\x9f\xed\x4c\x7a\x88\x51\xef\x1b\x62\x14\xba\xfe\x39"
- "\x1f\xe4\xd9\x66\x09\xc3\x6c\xd9\xc0\x54\xdf\xfd\xdd\x20\xcd\xdd"
- "\xd5\x08\xa5\x6d\x60\xf4\x0f\x56\xfe\xa7\x0c\xae\xf5\xf8\x04\xce"
- "\xbb\xdb\xf6\x84\xe6\xee\xd2\x50\x04\xc7\xf4\x96\x63\x60\x37\x64"
- "\x5e\xaa\x62\xcc\xf0\x1d\xb3\xa1\xcd\xe4\xad\x89\x10\xab\x12\x10"
- "\x7a\xf1\x3e\xee\x33\xe7\x71\xcc\xf4\x5b\x0b\x6d\xae\x83\xb6\x98"
- "\xdf\x3c\x53\x0d\x78\xf4\x28\x02\xc6\x01\xcf\x9d\x02\xcf\x95\xbb"
- "\x16\xdb\x5e\xd5\x23\x8b\x51\x7a\x20\xf3\x8e\x81\xf9\x8c\xff\xb4"
- "\x64\xf0\x07\x4a\x8b\x45\xec\x9e\x38\xeb\xe0\x3c\x46\x99\xc4\x98"
- "\xbb\x0d\x08\x2d\x36\x56\x93\x3e\x0d\xf7\x77\x02\x74\x2c\x03\xbf"
- "\xbb\x25\x16\xf9\xc0\xc7\x8b\xc9\x9c\x96\xfc\x60\xe5\xf9\x14\xb8"
- "\x2f\x0d\xbe\x2f\xb1\x67\x5c\xb7\x09\xc6\x9d\x67\x02\xf0\xd8\xc1"
- "\xfe\x3e\xfe\x6d\xf6\x77\x94\xe6\x14\x13\x1c\x67\x96\x26\x31\xc5"
- "\xf1\x46\xe4\x0d\xb6\xd8\x0a\xf7\x8d\xf1\x68\xfe\x7c\x90\x66\x59"
- "\x07\x84\xf6\x2f\xaa\x50\x16\xc3\xbd\x9b\x3e\x79\xa6\x5a\x9b\xf8"
- "\x32\x82\xef\xf5\x58\xb3\x5c\x57\x5c\x58\x31\xf6\x06\x42\x38\x9e"
- "\xc0\xff\xd3\xab\x61\x1c\x1b\x0d\x7f\xaf\x83\xe7\x30\xdf\x0d\xf0"
- "\xc0\xe7\xc2\xf1\x21\xda\x05\x3f\x20\x6f\x0d\xf2\x5c\x0b\xcf\xc6"
- "\x9d\xeb\x85\xcf\xd5\x29\x2e\xa4\xe1\x7b\x80\xbf\xd5\xf0\x37\xbe"
- "\x0e\xcf\x21\x43\xcc\xf6\x81\xf9\x2c\x36\x33\xa6\x25\x9b\xbb\x0d"
- "\xcc\x67\x63\x1f\x3c\xe7\x3a\x78\x66\x38\xc7\x0b\xce\xf1\x62\xff"
- "\x4d\x44\x3e\x19\x70\x0c\xb7\x03\xff\x7a\x69\xe7\xd4\x40\xdb\xe7"
- "\x8d\xb8\x6d\x11\x3b\x78\x30\x7e\xd3\x92\x19\xc0\x36\x1e\x53\xd5"
- "\x89\x8a\x73\x57\x15\xdf\xf5\xf6\x56\x30\x0c\xb3\x7d\x40\xe8\xb2"
- "\x44\xe4\x95\x66\x46\x48\xdb\x01\xb7\xf3\x5d\x2b\x68\xdf\x03\xdb"
- "\xe2\xc1\xca\x0b\x15\x3a\xc5\xf9\x0c\x6c\x5f\xf0\x67\xb5\xfa\x39"
- "\xfc\x0c\xdf\x0d\xc5\xbf\x83\xaf\x21\xe7\x5f\x60\x6b\xdf\xe3\x7b"
- "\x56\x27\xaa\x18\xf8\xbe\xbb\x4a\x71\x05\xa9\x02\xbc\xd6\x3e\x58"
- "\xf9\x5d\xa0\x0e\xa5\x97\xe3\xeb\x75\xe4\x3a\xc0\xd2\x77\x83\xc1"
- "\x67\x07\xf1\x31\xfc\xb7\xc8\xfd\x7a\x59\xfc\x56\x18\x00\xd8\xb0"
- "\xf5\x9d\x05\x23\x80\x0b\x0b\x46\xf0\xfd\x1e\x48\xd4\x29\xd9\x71"
- "\x58\xf1\x1d\xab\xeb\xd6\x82\x0f\x4d\x9b\x03\x3c\xd6\x81\x6d\xcd"
- "\xb5\xd8\x2f\x57\xe1\xbb\xef\x97\x60\xbf\xac\x5b\x04\x3e\x21\xe7"
- "\x6e\xa7\xf7\x8f\xff\xfe\x9e\xf5\xa7\x19\x7c\x41\xd6\x6e\x7e\x3f"
- "\x01\x3f\xcf\xba\xfb\xe0\xc7\x76\x4c\xf5\xe9\x78\xb8\x2f\x8c\x5b"
- "\xc0\xc8\xfe\x58\x83\x12\xcf\xeb\xc3\xc7\x4f\x54\x19\x94\xeb\x6e"
- "\x22\xcc\x2b\xd1\x1a\x88\xcb\x39\x0b\xc0\xe6\xd0\x26\xd3\x75\x40"
- "\xe8\x4b\x16\x3f\x2e\x02\xdf\x2d\x00\xec\x82\xcd\xd7\x81\xfd\xb6"
- "\x40\xcc\xc3\xff\xdf\x02\xe3\x8f\x19\xce\xd3\x29\xbe\x4f\x83\xf6"
- "\x7c\x72\xda\x31\xfa\xad\xed\x98\x4a\xb0\xe1\xa7\x0f\x56\x7e\x1f"
- "\x63\xb1\x21\xbe\xa7\x75\x70\x7c\x0d\x7c\x0f\xf6\xac\x20\x18\xfa"
- "\x2e\xcf\xf2\xcc\x62\xf6\x4c\xdd\x8f\x06\xac\xd9\x8f\x3a\xae\xde"
- "\x8f\x06\x7f\x58\x0e\xfd\x72\xe9\xab\xcc\x37\x93\x8d\x30\x26\xee"
- "\xc8\xab\x69\xf7\x86\x06\xbf\x7b\x32\x2f\x7b\x26\x77\xc5\x7e\xd4"
- "\x13\xaf\x8d\x1d\x5b\x89\x10\x1e\xc3\xc7\xb6\xb8\xcc\x14\x6b\xee"
- "\x21\xb3\xef\x8e\x3c\xd3\xb2\x1e\x6d\xc7\xdc\x43\xe8\x4c\x60\x35"
- "\x4a\x8c\x83\xb1\xbc\xaa\x02\x25\x56\x33\xfa\xa2\xe4\x1b\x88\x49"
- "\x0b\xa9\x26\xb6\xbb\xd8\x73\x2c\x44\x31\xbc\x66\xd0\xfc\x4b\x20"
- "\x6a\x1d\x8d\x3c\x12\x2e\xa2\x80\xa4\x72\xa6\xc2\xb4\x21\x2c\x3c"
- "\x71\x31\x52\xee\xaf\x2a\x25\xdc\x53\x51\x6a\x3a\x8e\xd7\xa7\x3e"
- "\x08\x43\x53\x8d\xdc\x78\x94\x31\x2d\x25\x69\x26\x6a\x8f\x9f\xc7"
- "\x9b\xe5\x5e\xa5\x1b\xc1\x6e\x29\xd2\xe2\x73\x69\x24\xeb\xcf\x0d"
- "\xef\xe8\xf7\x4f\x33\x00\x6f\xf5\x4e\x4e\x8a\x62\x2a\x30\xaf\x83"
- "\xf1\x85\xe5\x82\xc5\x15\x46\xe0\x56\x91\x30\x7e\xeb\xd0\x3f\xaf"
- "\xe6\x2a\xcd\x99\xde\xc9\x12\x7f\x23\x9f\x1d\xb7\xf1\x58\x0a\xf7"
- "\x3e\x21\x10\x25\xb3\xf7\x0f\x63\xa6\x77\x1c\xe6\x53\xcc\x65\x7c"
- "\xff\x27\xe0\x59\x99\x2e\xf3\x75\x70\xfe\x28\x3c\x7e\x8e\x2d\xd3"
- "\xa2\x02\x83\x09\x6d\xba\xc9\xda\xa8\x25\xd8\xc8\x03\xbe\x53\x83"
- "\x9d\x3c\x85\xfc\x86\x7d\x66\x4e\xdb\x91\x67\x56\x11\xdf\xb0\x7e"
- "\xa9\x26\x7e\x19\x33\x17\xc1\x38\x0a\xbe\x49\x27\xbe\x31\xfb\x47"
- "\x68\xb0\x6f\xa4\x3d\xc7\xc5\x34\xb1\xf1\x05\xff\x36\x03\xf8\xc0"
- "\xb8\x30\xfb\x45\x68\xf0\x6f\xe3\x7b\xc0\xef\xcf\x30\x0e\xc6\xae"
- "\xb8\xcc\x14\x69\x2a\x50\x31\x3c\x0f\xe3\x6b\x7d\x0f\x46\x89\xf7"
- "\xf0\x83\x9f\xd8\x3d\xa4\xbe\x08\xb8\x7d\x11\x70\xfb\x22\xe0\x56"
- "\x47\x70\xfb\x75\x19\xc1\xad\x09\xee\xeb\x21\x70\xf7\x0f\x27\x20"
- "\x25\xbe\xaf\xbd\x3f\xe0\x1a\x7d\x70\x9f\x15\x14\xbb\xa3\x6f\x81"
- "\x8d\x2c\xf8\x55\xf5\x68\x8b\xed\x53\x54\x5d\x8a\x92\x30\x7e\x6b"
- "\x84\xf0\xfb\x63\xe5\xd8\x08\xf0\xcd\x7b\x80\xdf\xff\x06\x22\xaf"
- "\x72\xe4\xb1\x78\x02\xe0\xb7\x42\x08\xbf\x3f\x1e\x3f\x06\xbf\x69"
- "\x87\xdf\x28\x6b\xfc\xfe\xf8\x8e\x74\xfc\xfe\xd8\xb5\x0e\xbf\x13"
- "\x39\xfc\xce\xb4\xc1\x6f\xb9\x15\x7e\xf1\x73\x4b\xc6\xef\x8f\x29"
- "\xd2\xf0\xfb\xa3\x57\x1d\x7e\x41\x97\x6c\x9a\xc1\xda\xa8\x25\xd8"
- "\x08\xf0\xfb\x83\x0e\xec\x24\x88\xdf\xc6\xf7\xdf\xa5\xbd\xae\xfb"
- "\xef\xd2\x62\xe7\xfe\xbb\xd4\x5e\xba\xff\xca\xca\x1b\xde\x7f\x97"
- "\x82\xa4\xf9\xaf\xac\x40\xdc\x7f\x65\xb9\x4d\xc7\x7f\x97\x63\x5c"
- "\xf7\xdf\xe5\x21\xce\xfd\xf7\xd3\x45\xe9\xfe\xfb\x69\x7b\xc3\xfb"
- "\xef\xb2\xa7\x34\xff\xfd\x94\x2a\xee\xbf\x9f\xc2\xc5\xfc\xf7\x7a"
- "\x7b\x33\x63\xc6\xf3\xe6\xda\x8d\x2c\xc1\x1c\x88\xf0\x35\xdd\x40"
- "\xac\x19\xe1\x6f\x0f\xcb\xdf\x2c\xa7\x02\x5d\x6d\xf3\xb7\x97\xcd"
- "\xdf\x3e\x36\x7f\xfb\xd9\xfc\x1d\x60\xf3\x77\x47\xcb\xdf\xe0\xaf"
- "\x16\xb7\x15\x97\x77\x81\x66\x4b\xd6\x29\x74\xc3\xb9\xef\xbb\x4e"
- "\x35\xa9\xb1\xee\xeb\x2a\x74\xef\xeb\x96\x32\x86\xd6\x0a\xc4\xd4"
- "\x2a\x19\xa4\x49\x44\xcf\xdc\x54\xe8\xf2\x6a\x96\x82\x24\x54\x75"
- "\x08\x64\x6a\x92\x11\xf8\xe5\xf0\x98\x85\x80\x2f\x3d\xe8\xc4\xa4"
- "\x80\x96\xd0\xf6\x6f\xc0\x6e\xfa\x22\x8d\x1e\x78\xf9\x3f\x99\xab"
- "\x0a\xdd\x0e\xfc\x9c\x2f\x6a\xb4\xc8\xac\xea\x11\xc8\xb0\xb5\x9b"
- "\xbd\x0f\xeb\x55\x3d\x3a\x30\xdb\x16\x68\xd6\x2c\x35\x7b\x16\x57"
- "\x9e\x47\x6b\x95\x66\x75\x42\x02\xf0\xfa\xca\xc3\xe8\xc3\x4a\xa6"
- "\x22\xc1\xc8\x18\x8a\x27\x6b\xf1\x7b\xdb\x8a\xe2\xf8\x7c\x54\xa4"
- "\x3f\x8f\xf0\x98\x87\xb1\x5a\xac\x3f\x4c\xde\x13\xe3\x73\xe0\x58"
- "\x91\x7e\x2f\x2a\x84\xbf\xb5\x73\xae\xc1\x73\x5e\x99\x50\x5c\xb9"
- "\x17\x99\x32\xbc\x0f\x9a\xfd\xbc\x33\x18\x3f\xef\xac\xc2\x4a\xb8"
- "\xb7\x0c\xef\x6c\x7c\xaf\x45\x70\x1f\xec\x1e\x9d\x99\xde\xd9\x6c"
- "\xbb\xd5\x25\x6c\x0e\xc1\x94\x09\xe7\xfb\xc3\xf9\xfe\xde\x59\xf8"
- "\xfe\xf0\xbd\x09\xea\xbd\x8c\x20\x0f\xb8\xf7\x41\x13\x02\x3d\x10"
- "\xb3\xc4\x23\x40\x1a\xde\xae\xc4\x8b\xea\xc8\x8c\xa0\xe5\xa4\x5d"
- "\x4f\x39\xed\x8a\xce\x7f\x62\x32\x82\xb9\xfb\xf5\x91\xd1\xee\xd5"
- "\x40\x07\xed\x72\xf7\xab\x96\xd3\xae\xb8\x9e\xce\x08\xe1\xee\x77"
- "\xa8\x9c\x76\x4b\x1d\xb4\xcb\xdd\x6f\xb2\x8c\x76\x7f\xee\xed\xc0"
- "\x6f\x1e\xf2\xb0\xf0\xf3\x72\x47\x58\x90\x87\x83\x9f\x1d\x3c\x7f"
- "\xb0\x87\x3c\x0c\x94\x8b\xe6\xbf\x31\x06\xe4\xf9\xbf\xdc\xa1\xff"
- "\xe5\xf9\xbe\x5c\x74\xff\x47\xec\x7b\x79\x7e\xbf\x26\x8a\x7f\xac"
- "\x8d\x99\x8c\x91\xb9\x4c\xbb\xf9\x25\xe6\x0d\xbf\xc9\x35\xb7\x1b"
- "\xf9\xe9\x32\xf3\x50\xf4\xfa\x62\x18\xf3\xb2\x90\xef\xeb\x39\x97"
- "\x99\xa1\x6c\xce\xe9\x9a\x76\x71\x36\x52\xa6\x29\xcd\xca\x7d\x8b"
- "\x4a\x95\xc5\xc6\x01\x38\x6e\x99\xb6\x2f\x30\x28\x7e\x0b\xc7\x4f"
- "\x46\x23\x54\x3d\x2f\x10\x91\xb6\x7e\x93\xbb\x36\x71\x28\x1a\x6b"
- "\x42\x38\xc7\x51\x3d\x66\xee\x65\xe6\x54\x02\x70\xfc\x3b\x10\x5f"
- "\xb3\x0c\x78\x2c\xf5\x85\x6b\x8d\x80\x63\x68\xc7\x80\x0e\x98\xf5"
- "\x8a\x31\x7a\xf6\x5c\x3d\xe8\x51\x3d\xb3\x61\xe4\xa7\x78\x4c\x66"
- "\x92\x02\xd1\x72\xf8\xfb\xba\xe2\x7a\x1f\x95\x1e\x29\xb7\x80\x56"
- "\x7d\xb0\xf2\x7a\x4f\x9d\xe2\xbf\x9e\x58\xbf\x82\x4e\xae\x4c\xba"
- "\x83\xf3\xf9\xf3\x4b\xf6\x9b\xf5\xca\x65\xa0\x9b\xf1\xf9\x2f\x6a"
- "\x90\xf2\x94\x1e\xe7\x06\xae\x87\x9d\x8c\x43\xc8\x41\x3e\xc7\xc3"
- "\xec\x37\xb5\x1c\x5f\x8f\xdb\xc1\x79\xd2\x75\x66\xb0\xb3\xdf\xb4"
- "\x14\x7c\xdf\x4c\xc6\x1b\x61\xda\x45\x78\xcc\xb9\xae\x1b\xd1\x9d"
- "\x79\x80\xc7\x10\x18\x3b\x3a\xdc\x84\xbf\xd9\x7c\xc0\x52\xa6\x84"
- "\xf1\x6b\x93\xc2\xac\x6d\x3d\xb4\xa8\xba\x0a\x69\x17\xd4\xa0\xab"
- "\x8a\xeb\x57\xf0\x6f\xdf\xf5\x9b\xaa\xab\xf6\x9b\x5a\x01\xf7\x50"
- "\x66\xb9\x5f\xfc\x5b\x96\xe3\x38\xff\xc1\xdd\xa3\xf1\x64\x82\xf8"
- "\x3d\x32\xcb\x3a\xb4\x1d\x1b\xc0\xe8\xb1\x2d\xb5\x89\x55\x70\x2f"
- "\x15\x73\xb1\xbd\x99\x8c\xa9\x07\xab\x93\x02\x3b\x93\x7c\xe0\x7f"
- "\xb3\x70\x5e\x09\xc6\x86\xed\x24\xc7\xe3\xbd\x9d\x9d\xc3\x03\xb1"
- "\x9f\xd9\x3e\x20\x1a\x73\xa1\xdb\x8a\xff\xb2\xf9\xc0\x09\x81\x4a"
- "\x89\x7a\xea\xbf\xac\xfe\xd5\x76\xc6\x76\xa8\x78\x07\x7e\xef\xf7"
- "\x57\x15\xff\x3d\x46\x72\x1c\xde\x79\xf8\xf7\xe0\x9c\x20\xf8\xcd"
- "\x3c\x26\xa3\x4d\x32\x3e\x0f\xbe\x2f\xe3\xbe\xd7\x5a\x7d\xaf\x85"
- "\x7b\x36\x70\xdf\x1b\xb9\xef\x4f\x5b\x7d\x7f\x5a\xd3\x19\xe7\xfc"
- "\x2a\xba\xe2\x67\x82\xf1\x2e\x17\xbe\x3f\x8c\xdf\x27\xb0\xcf\xe4"
- "\xef\x9d\xcb\x9d\x77\xb8\x52\x51\x31\xe4\x2e\xe0\x0b\xbe\x3f\x66"
- "\x75\xfd\xb1\x53\xf1\xbd\xd1\xeb\x39\xd8\xa6\x15\xa1\x3a\x8f\x76"
- "\x41\x24\x4f\xf4\xdf\x51\xac\x2d\x60\xfc\xb4\x6e\x4f\xa7\xa8\xe8"
- "\x88\xc7\xc8\x6a\xe0\x91\x70\x4e\x5f\xfc\x9b\xd6\xf6\x8f\x8a\x8d"
- "\x7d\x3f\x56\xdd\x2d\x52\x1d\x39\x3b\x42\x3d\xfd\xfd\xf9\x73\xe2"
- "\x86\x74\x8b\x7c\x12\x21\x2b\xec\xf8\x30\x4b\xbd\x19\x73\xc6\xa4"
- "\xc0\xe2\x2c\xe0\x6f\x4a\x1f\x18\xcb\x6b\x50\x06\xf8\xd5\xb8\xe1"
- "\xcf\xc8\xd4\x6e\x56\x9a\x69\xc3\x28\x94\x74\x0f\x29\x13\x03\x98"
- "\x2b\xda\x45\xaf\x81\x0f\x2a\x6e\x60\x0e\x51\xac\x46\x28\x15\xb0"
- "\xaa\x5d\xf4\x2f\x38\x76\x43\xc1\xbe\x6f\x08\x27\xc7\xbe\x4c\xcc"
- "\x57\xfe\x33\xb1\x54\x59\x10\x5e\x85\x4e\x05\xe8\xd1\x69\x75\x15"
- "\xca\xc6\xc7\xcd\x25\xec\x7b\x1f\x38\x7f\x1c\xfe\x2d\x9c\x3b\xc3"
- "\xff\x27\x79\xc0\x8a\x0b\xf8\x77\xd4\x1d\xf0\xfb\x88\x8a\x8b\xf8"
- "\xf7\xe0\xf9\x4a\x55\xd9\x48\x01\xfd\xc8\x0b\xce\xcb\x34\x67\x4e"
- "\x0a\x64\xfb\xfa\xca\x8a\x14\xa3\xd2\x77\xce\x96\xf5\xc8\x73\xeb"
- "\x7a\x84\xb2\xdb\x22\x8f\x07\x2b\x6f\x24\xeb\x3c\x7a\x79\x61\x7b"
- "\x41\xd3\x5e\x77\x95\xe8\x55\x38\x96\xa1\x43\xe9\x09\xf8\x18\xf4"
- "\xa9\x6a\xb1\xd8\x81\xdf\xc3\x19\xb6\xf7\x4f\x33\xfb\x4d\x0a\x60"
- "\xc0\x16\x86\xae\xfd\xb5\xde\x1a\xc0\x0b\xf4\x1b\xc6\x7f\x52\x40"
- "\xa5\xe2\x97\xb4\xaf\xf2\x10\x4a\xc4\xfd\x14\xec\xb1\xe7\xbe\x01"
- "\xbf\x7f\x43\x7b\xef\xeb\xe1\xef\x59\x69\xbb\x16\x18\x94\x5f\x0f"
- "\xcf\x43\xea\x37\x31\xc7\xba\xd9\xea\x8d\x48\xc6\xd8\x23\x14\x78"
- "\x69\xf9\x5f\xd1\x37\x65\xf9\xc8\x6b\x32\x52\xd5\xd5\x86\x8f\x43"
- "\xca\xb1\x3a\xf8\x7b\x3e\x52\x16\x19\x4c\xec\x7b\x80\xc4\x61\x38"
- "\x9f\x5f\x88\x70\x8e\x9f\x51\x7e\xdc\x75\x5f\x95\x01\xe2\x53\x45"
- "\x0b\xbc\x96\xdc\xec\xb3\x27\x05\x5f\x33\xb5\x9a\x7b\x37\x76\x97"
- "\x7b\x37\x76\x97\x7d\x37\xb6\x1c\xbf\x17\xc3\xef\xc3\x12\xc2\x19"
- "\xb3\x69\x5e\x60\xdb\xb1\xe1\x2a\x06\xb7\x89\xdf\x95\xb5\x06\x4d"
- "\xc1\xcc\x0b\x6c\xb3\x31\x16\xf9\x15\xe9\x2b\x50\x71\x45\x3e\xda"
- "\xbc\x00\xf9\x31\x77\xa3\x5b\x15\x9c\xfe\x1a\x31\xeb\xbf\x48\x3e"
- "\x90\xa8\x6d\x61\xc2\xf9\x94\xbb\x01\x4f\x7a\x2f\x51\xe0\xf7\x02"
- "\x6d\x52\x63\x51\xcf\xad\x55\xa8\xf7\xd4\x6b\xc9\x6c\x9d\x28\xbc"
- "\xa7\x9f\xf1\x6e\xa0\xba\xf6\x6e\xe0\x73\x35\xf3\x02\x3b\x7b\xeb"
- "\xc9\xbb\xb4\x29\x33\x7d\x10\x7e\x5f\xc6\xac\xbc\x58\xba\x15\xe7"
- "\xb4\xab\xf5\xc8\xe8\xbb\x27\x05\xe3\x13\x7e\xb7\x23\x7e\xff\x92"
- "\xb4\x10\xf9\x98\x7f\x0e\x44\x85\x95\x55\xe8\x25\xc0\x0d\x7e\xd7"
- "\xb0\xe5\x2a\x79\xd7\x60\x4a\xdf\x91\x87\xdf\x37\x3c\x98\x17\xa8"
- "\x1c\x7d\x0b\xc6\xae\x95\x37\xf6\xd6\x74\xeb\x9f\x76\x26\xf0\x12"
- "\x1e\x1f\xfa\xd2\x7e\xff\xcb\x14\x79\xfd\xfe\x97\xc9\xf8\x3a\xfc"
- "\xfe\x8d\x01\x3c\xef\xad\xc2\x7e\x03\xff\x55\xe9\x95\x21\xe5\x8c"
- "\xb1\xb0\x7c\x37\xf8\xa7\x94\xe7\x1f\xd6\x9f\xb1\x06\xe5\xf5\x48"
- "\xf0\xcb\x35\xe2\xab\x82\x6a\xf0\xd3\x49\xdc\x46\xb8\x7a\x1f\xf8"
- "\x1a\xf4\x94\xb2\xc0\x70\x89\xad\x73\x81\xfd\xb5\xb7\x26\xbf\x45"
- "\x8d\xdf\xc8\x5c\xfc\x1e\xf3\x41\xd7\xfe\x07\x1f\x66\x4c\x34\xd4"
- "\xfa\x4d\xf2\x74\xf0\x4e\x73\x39\xf6\xd7\xe2\x99\xc8\xb3\xa0\xfc"
- "\x02\x62\x7d\x36\x97\xf3\x19\x9e\xfb\xf6\x41\x60\x1b\xe3\x83\xc0"
- "\xb6\x1b\xc1\x57\x45\x71\x3a\xb4\xa9\x0a\xf9\x15\x57\x94\xe2\xf7"
- "\x3d\xad\x42\xc6\x21\x14\xb2\x8b\x31\x17\x9e\xfe\x81\xf5\xdf\x7e"
- "\xf0\x9f\x11\xfc\x87\xdf\x73\xd6\xf9\x6f\x01\xf8\xef\x3e\xf8\xef"
- "\x16\xf5\x9f\xe9\x01\xf8\xef\x01\xf8\xef\x03\xf0\x5f\xb5\xad\xff"
- "\x7e\x98\x8c\xdf\x85\xe2\x77\x4e\xd8\x7f\x78\xbe\xb5\xf9\x83\xc0"
- "\x8e\xec\x3b\xd0\xe9\x81\x68\xeb\x34\xe4\xd9\xcb\x80\x14\x49\x27"
- "\x91\x0f\xdc\xa7\xcf\xf3\x60\x5f\x68\x0f\xf0\x7d\x15\x15\xe7\x99"
- "\xd0\x87\xef\xa0\xce\xd8\x9f\x46\xce\x9f\xc5\xc6\x23\xe8\xfe\x83"
- "\x40\x25\xb4\x39\x60\xe3\x7d\x34\x78\xd4\x35\x35\x3a\x33\xbe\x10"
- "\x81\x3f\x82\xcc\x99\x53\x0f\xca\xef\x87\xbf\x06\xb8\xde\x0f\x6f"
- "\xa5\x3f\xee\x87\x72\xfb\xe1\xad\xbe\xc2\xfd\xf0\xf6\x35\x79\xfd"
- "\xf0\x76\xf9\xe3\x7e\xd8\x94\xfa\xe1\xed\x12\xdb\x7e\x58\xc7\x15"
- "\x62\xa3\x66\x47\xcc\x9c\x33\x73\xce\x7b\xea\x69\x0b\xe3\xa2\xe6"
- "\x11\xc6\xc0\xe3\x0c\x81\x26\xf3\x50\xe5\xc7\x30\x9e\x7e\x13\x50"
- "\x8a\x0e\x74\x28\x55\x9a\x27\x05\x78\x30\x69\xc7\x4b\xcc\x69\x27"
- "\x42\x3f\x06\xfe\x8b\xfb\x6b\x06\xf0\xda\xeb\x8a\x5a\x8f\x7f\x77"
- "\x04\xce\x17\x7b\x13\xe1\xff\x93\x77\xb2\x49\x03\xf0\xba\xc5\xac"
- "\x0d\x4c\x05\x5e\xb7\xf8\xf5\x70\x3c\xf6\xdf\x99\xff\x54\x18\x8c"
- "\xeb\x93\x02\xd0\xc3\x49\x61\xca\xd5\x3f\x20\x4f\xef\x52\x34\xca"
- "\x6c\x66\x18\x6d\xe2\x4d\xe0\x5a\x86\x51\xda\x89\x37\x91\x7a\x91"
- "\x27\x9c\x7b\x7f\x9f\x7a\xd1\x12\xfc\x6f\xba\x7a\xd1\xca\xcb\xf0"
- "\xef\x38\x36\x77\xd2\x8e\xa9\x60\x36\x4c\xd4\x98\x3e\x1f\xa8\xc3"
- "\xef\x2b\xb7\xb6\x63\xca\xf7\x03\xc7\xdf\x5f\x63\x50\x2e\xab\x02"
- "\x7c\x2c\x7d\x96\xc1\xef\x1d\xf1\x7b\xcd\x65\xb1\x60\x63\xe0\x9a"
- "\x84\x0f\xde\x3b\x84\xfb\x4b\xea\x06\xa6\xfc\xc4\xf5\x52\x25\x7e"
- "\xef\x8a\xfb\x50\xb5\x5f\x9b\xe4\xe5\xf0\x2c\x70\x9f\xba\x4d\xed"
- "\x98\x32\xbd\xff\xa4\x40\x0f\x35\x52\x3e\x58\x79\xa7\x02\x78\x49"
- "\x2e\xe6\x14\x29\xf0\xdd\x6a\xf8\x8e\xbc\x03\xbc\x17\xc3\xb4\xd4"
- "\x1f\xc6\x71\x0b\xf0\xab\xb8\xad\xa8\xea\xf7\x10\x9e\x33\x95\xe8"
- "\x81\x0a\x43\xe6\x24\x4f\xe3\x8e\xfe\x07\x8d\x98\xc7\x75\xeb\xaf"
- "\xad\xf1\x9f\x68\x30\x66\x4e\xc2\xfb\xb8\x28\xc8\xf9\x77\xef\xe0"
- "\xe7\xa8\xf5\x1b\x85\xe0\xfc\xea\xbb\x7e\x7f\x46\x77\x33\x66\xa5"
- "\x7d\x1d\x7f\x90\x8b\x67\x55\x11\x21\x59\x5c\x3c\xcb\x82\xfe\x12"
- "\x06\xf1\x2c\xcc\x3e\x9e\x91\xb9\x01\x26\x44\xe2\x5a\x21\x6e\xab"
- "\x1c\xf7\x17\xcc\x0d\xf7\x81\x2d\x70\x5f\xc0\x98\x67\xe3\x1b\xc4"
- "\x36\x4b\xbf\xc0\x7d\x06\xc7\x30\xb6\x8f\xda\xf4\x11\xdc\x2f\x9e"
- "\xd2\x23\x1f\xdc\x2f\x70\x8c\xc3\xfd\x02\xcf\xb9\xf9\xf8\x3e\xe9"
- "\x17\xde\x65\xc8\x87\xed\x1b\xc6\x7c\xb6\x6f\x60\x5d\x50\x60\xb4"
- "\x89\x6b\x56\xfd\x62\x8d\xa5\x5f\x58\xe2\x1a\x60\xdf\x88\xfb\xc5"
- "\x07\xfc\x7e\x31\xe9\x92\x0f\x62\x63\xde\xca\x8b\x93\xb3\xa1\x5f"
- "\xe0\x3c\x96\xc9\x12\xd7\xa0\x5f\xe0\x35\x41\x6c\x5c\xfb\x33\x17"
- "\xd7\xf4\x70\x1c\xfa\xc3\x96\x59\xfc\xb8\xf6\xf0\x81\x33\x7e\x71"
- "\xf7\xb8\xbc\xb8\x76\x97\xd5\x10\xd8\x57\xd8\x6f\xd8\x5f\xd8\x47"
- "\xcd\xc9\x3f\x38\x6e\x99\x7c\x44\xe2\x96\x80\x7f\x00\xcf\x95\xf0"
- "\x7f\x3b\x1f\x31\x2b\xbf\xdf\x6e\x1d\xbb\x70\xcc\xc2\xf1\x0b\xc7"
- "\x2d\x1c\xc3\x70\x3f\xc0\xb1\x8b\x8d\x5b\x10\xd3\xe1\xef\x8a\xc2"
- "\xe8\xab\x6c\x4c\x4b\xba\x86\x7c\x92\x46\xa0\xce\x38\x86\x15\x1b"
- "\xef\x21\x1c\xd3\x58\xff\xf9\x52\xff\xe1\x18\xb6\x69\x01\x1a\x3c"
- "\x7a\xa6\x1a\xe1\xd8\x05\xb6\xdf\x79\x26\xf0\x02\x62\xf5\xc0\xd2"
- "\xa7\x47\x6e\x6d\x0b\xfd\x76\x3d\xf2\xc8\x68\x8b\x3c\x1f\xac\xbc"
- "\x97\x6a\xaf\x05\xee\xe5\x5a\xb4\x00\xee\xb3\xb8\xef\xea\x14\x77"
- "\x58\x0d\xa7\xed\x30\x08\xc7\xa0\xc3\x44\xcf\x85\x85\x92\xbc\x7b"
- "\xed\x11\xf6\x6f\xd0\xd1\x54\x43\xdf\xbb\x45\xde\xb5\x83\x66\xf6"
- "\x7f\x23\x8c\xc9\x6c\x93\x82\x6d\x89\x9f\x6d\x6a\x77\xc0\x5c\xe6"
- "\x54\xdd\x3a\x6c\x9f\x4c\xd0\xe3\x99\x53\x2b\x28\xbe\xee\x77\x3a"
- "\x13\x8f\xd0\x84\x78\xa9\xf8\xba\xcf\xce\xff\x67\x7e\x0c\x7b\x9a"
- "\x99\x14\xe6\x61\xfe\x31\xac\x05\x60\x21\xe0\x7d\x53\x32\xba\x9f"
- "\x96\xd4\x3b\xc9\xc8\x54\xa8\x17\xa1\x1e\x10\x03\x17\x7f\x0d\xfa"
- "\xfb\xeb\x38\x84\x8a\x43\x63\xc0\xaf\x89\x07\x0f\x98\xf5\x1e\xf0"
- "\x7c\x71\x5b\xc1\xce\x10\x5b\x3d\xac\x63\x2b\x89\xa3\x77\xe2\xd8"
- "\x79\xde\x69\x49\x43\x71\x5b\x63\xf3\x91\xb7\xfa\x8f\x78\x2e\x9f"
- "\xa1\xd3\xc2\xc5\x08\xaf\x4f\x6d\x71\x5d\xf1\xe0\xc6\xc3\xf5\x63"
- "\x0e\xc2\xf5\x6d\x98\x1f\xc7\x2b\x34\x7f\x84\xf1\x65\xd2\x78\x05"
- "\x9e\x5b\xb0\x3b\x31\x4b\x69\x86\x63\x64\xae\x52\x16\xc2\xdf\xa7"
- "\xd6\x78\xb0\x3c\xca\x0c\xe7\x14\x55\x67\xa1\xd4\x05\x9e\x08\x9f"
- "\x4f\xe6\xbf\x65\x21\x7c\xfe\x9a\x58\x1f\x76\x6e\x02\x7b\x9d\x31"
- "\x0b\xe1\x6b\x4d\x70\xfc\x23\xb3\x17\x5a\xbb\xc8\x0f\x7d\x1d\x5a"
- "\xc4\xb6\xf1\x75\xe8\x57\x08\xb7\x01\x98\x87\xff\x9f\x40\xeb\x16"
- "\x04\x40\x1f\xcf\x82\xef\xbf\x43\xeb\x6e\x77\x84\x7f\xaf\xc3\xe7"
- "\x3e\xba\xa9\x78\x90\xfa\x75\xa8\x19\x79\x2f\x79\x95\x01\xec\x32"
- "\xc5\x78\xcd\x63\x22\x6a\x09\xf7\x9e\x59\x5c\x9a\x06\x63\xdd\xfd"
- "\x04\xbc\x26\x9e\x49\x9a\x54\x69\x66\x26\xdd\x32\x27\x4d\xba\x8d"
- "\x7f\xdb\xc4\x4c\xfa\x15\xff\xf6\x9a\x45\x6a\x6e\x3e\x6c\x16\x3b"
- "\x77\x2f\xf5\x7e\x57\x84\xef\x15\xff\x2e\xfe\xbd\x75\xb1\x81\xdc"
- "\x6f\xf6\x64\xef\x0d\xff\x26\x6e\xd3\xfa\x37\xf1\x7e\xf3\xea\x3f"
- "\xe1\xdf\x34\xb4\x82\x7f\x7d\xc1\x1f\xc9\xd8\x0f\xf8\xf7\xcd\x4c"
- "\x58\x0b\x26\x29\x4c\xc5\x5e\x13\x5f\x21\x74\xcd\x10\xee\x1a\xb6"
- "\x16\x01\xbe\xa6\x86\x9c\xcf\xb6\x01\x63\x1f\xbb\x7f\xc8\x0b\x61"
- "\x5a\x64\xef\x43\xc3\x3d\x32\x16\x1a\xce\x90\xb1\x90\xf8\x94\xc5"
- "\xca\xa4\xb0\x16\xe0\x37\x1f\x3c\x6e\x42\x1b\x39\x75\x6d\xfc\x18"
- "\xa6\xc2\xfe\xc6\xb8\xb1\x60\x09\xe3\xc8\x82\x21\xf6\x3e\x35\x08"
- "\x59\x63\x06\xfe\xef\xc9\xb5\x73\xcd\xd2\x0e\xdc\x03\xb2\xe0\xe8"
- "\x05\xf8\xde\x1e\x47\x35\xc7\x29\x8e\x6a\xa6\x18\x12\x19\x06\xe3"
- "\x48\x3b\x71\x29\xb4\xf3\xb0\x17\xbd\x9f\xf1\x0a\x8c\xb1\x66\x86"
- "\xad\x54\xec\xa7\x17\x12\x90\x1f\xf7\x3c\x26\xf6\x79\x12\xb4\x7e"
- "\xf8\x5e\x2d\xcf\x81\xef\x61\xad\x59\x8d\x2c\xcf\xb1\xae\xa6\x2b"
- "\xb4\x7b\x1b\x91\x6b\x6a\xfa\xe0\xb6\x2d\x36\x00\x9f\x21\xcb\x35"
- "\x96\xf3\xd7\x9a\x03\xe1\xbe\x7b\xb2\xd7\x10\xcc\x5d\x17\xc0\x4f"
- "\xcd\x62\x5b\xcc\x3d\x95\x80\x80\xc8\x02\x77\x9a\x58\x85\x7f\x67"
- "\x23\xb9\xb7\x7f\x9a\x6a\xe0\x37\xc0\x07\x4a\xee\xf8\x21\x2b\x4c"
- "\x70\xed\x1b\x84\xda\xbf\xc4\x6b\x3f\x0c\xda\x8f\x87\xf6\x31\x37"
- "\x9b\x88\xf3\x60\x35\x6c\x1d\x80\x17\xe2\x49\xfb\x16\xdc\x32\x69"
- "\x21\x46\xcd\x22\x3c\x7f\xb4\x36\x97\xc4\xd3\x3b\xec\x1e\x20\xec"
- "\xbc\x25\xa5\x39\xd7\x6c\x33\x6f\xc9\x7a\x5e\xdb\x81\x44\x3d\x37"
- "\x67\xa9\x96\xad\x69\x01\xf1\xb5\x1a\x73\xcc\x7d\xc0\xcf\xe8\xbc"
- "\xa5\x1f\xf0\xf7\xab\xb4\x0b\xae\x5a\xcd\x5b\xaa\x65\xf5\xbe\x4e"
- "\x51\x7b\x18\xb4\xa4\x12\xfe\xd6\x90\xe3\x77\x3a\x5a\x1f\xa7\xf3"
- "\x02\xc9\x71\x3c\xe7\x9a\xcb\xbb\x56\x9e\xca\xc3\xb9\xb7\xda\x02"
- "\x4b\xbe\x53\x44\xab\xba\xce\x81\x95\x2d\xd5\x75\x1c\x18\xfe\x2f"
- "\xce\x81\x8d\x0b\x1d\x72\x60\xa5\x2a\xba\x8e\x03\x2b\x15\x67\xd9"
- "\x7e\xaf\x54\xec\x63\xfb\xbd\x52\xc1\xee\x83\xbb\x16\xda\x33\x7e"
- "\x3a\x5f\xcf\x7c\x3e\x20\x19\xe3\x7c\x0b\x70\xda\x03\x0b\xf2\x95"
- "\xfb\x40\x27\x9b\x94\xcf\x32\xcb\xc0\x76\xb8\x5e\xdb\xb2\x45\x30"
- "\x4e\x1b\xcf\xa3\x22\x0f\xcc\x81\xaf\x42\x3b\xa8\xb0\x88\x7d\x2f"
- "\xf7\x46\x38\xb1\x8b\xf1\x02\xf8\x42\x55\x6c\x30\x20\xf6\x3c\xf8"
- "\x0e\xc6\xb5\x72\xcc\x81\x4f\x98\xf3\x95\x5b\xc0\xa6\xf0\x01\x8e"
- "\x3c\x5f\x6b\xcd\x91\x1f\xac\x34\x79\x08\x72\x63\x25\x4a\x31\xae"
- "\xb4\xe6\xc6\xa6\x71\x98\x1b\xe3\x3c\x39\xe6\x01\x66\xc2\x89\x0f"
- "\x02\x3f\xd6\x62\x9e\x8c\xb9\xb1\x99\xc7\x8d\x99\xd6\x8e\xb9\xb1"
- "\x69\xf1\x63\x6e\xec\x2e\x37\x16\xd3\xfc\xe6\x8b\xf2\xb8\xb1\xb9"
- "\xf4\x31\x37\x7e\x54\xdc\xd8\x7c\xda\xc2\x8d\xcd\x4b\x9f\x7e\x39"
- "\x7b\x3d\xf4\x57\x0b\x37\x5e\x8d\x76\xda\x71\xe3\xd5\xe8\x98\x3d"
- "\x37\x36\x05\x50\x6e\x6c\xcc\xe3\x71\x63\x65\xcb\x73\x76\xdc\x58"
- "\xa9\x68\x25\xc6\x8d\x21\x2e\x55\x62\x6e\x8c\x31\x85\x79\x32\xe6"
- "\xc7\x70\x9f\x15\x2c\xbe\x94\x8a\x81\xb2\xb8\xb1\x52\x31\xc0\x25"
- "\x6e\xac\x54\x6c\x14\xe6\xc6\xc6\x78\x71\x6e\x6c\x8c\x17\xe4\xc6"
- "\x4a\xd5\xc0\x3a\x4e\xa3\x54\xb5\x68\xf2\xdc\x58\xa9\xdc\x29\xc8"
- "\x5f\x94\xca\x43\x2c\x37\x56\x2a\xb2\xea\x9d\x1b\x43\x9b\x82\xdc"
- "\x58\xa9\xea\xc6\xf2\x08\xa5\x22\xdb\x8e\x1b\xe3\x6b\x84\xb8\xb1"
- "\x52\xf5\x0e\x77\x4d\x16\x8f\x1b\x73\x6d\xc0\x98\x38\x5f\x94\x1b"
- "\x2b\x3d\x7c\xc9\x18\xa9\xba\x42\xb8\x31\xf1\xa9\x1d\x37\x56\xaa"
- "\x8e\x3a\xe5\xc6\x1c\x86\xd8\xfb\x14\xe3\xc6\x4a\x0f\x85\x3d\x37"
- "\x36\xc6\x0b\x72\x63\x65\x8b\x8b\x14\x47\x2d\x16\xf2\xb8\xb1\xd2"
- "\x23\xb8\x59\x70\x63\x71\x6c\xed\xe4\x71\x63\x65\x8b\xf6\x92\xb9"
- "\xb1\xb2\xc5\x68\x49\xdc\x98\xc5\x9c\x00\x37\x56\xb6\xd8\x68\x8b"
- "\x39\x1e\x37\x56\xb6\x38\x22\xc8\x8d\x95\x2d\x0a\x79\xdc\x98\x6d"
- "\x5f\x80\x1b\x2b\x5b\x3c\xe4\xb5\x6f\xcb\x8d\x95\x2d\xfd\x79\xdc"
- "\x98\x3b\xaf\x8e\x1b\x2b\x5b\x1e\xe3\xf8\x56\x17\xc9\xdc\x58\xd9"
- "\x32\xc7\x21\x37\x56\xb6\xdc\xc1\xe3\xc6\xca\x96\x2c\xfe\x75\xca"
- "\x96\x25\x2c\x37\x56\xb6\x4c\x25\xdc\xd8\xa8\xb6\x3e\x4e\xb9\x31"
- "\x39\x6e\xc7\x8d\x57\xb7\xac\x70\xc2\x8d\x87\xba\xce\x8d\x7d\x0d"
- "\xf9\x75\xdc\xd8\xd7\x60\xe1\xc6\x78\xff\xa0\x6c\xe0\x9b\xd9\x2c"
- "\x3f\xfe\x1a\x7d\x1d\x89\xef\xff\x89\x8d\x8e\xf9\xb1\x77\x20\xe5"
- "\xc7\xad\x17\x92\xbe\xdf\x7a\x0a\xe1\xc7\xad\x3b\xd5\xe5\x88\x81"
- "\x1b\x63\x8e\xcc\xe5\x88\xcf\xa7\xc2\xe7\xc0\xa2\x7c\x96\x1f\xe3"
- "\xb9\xf1\x98\x23\x63\x7e\x8c\x79\x32\xe6\xbe\x85\xcb\x11\x2a\xd2"
- "\x1b\xf0\xbc\x8e\x12\x6d\x67\x6c\xd7\xd6\xad\x80\x57\xe3\x3c\x4f"
- "\x09\x5c\xab\x3b\x50\x65\xc0\xeb\x2c\xca\xd6\x5e\x85\x6b\x74\xe4"
- "\x1a\xf8\xbe\x14\x5f\x03\xe7\x94\x11\x5f\x78\x45\x91\xf1\x93\xe3"
- "\xd7\x4a\xcf\x7e\x3c\x7e\x4d\xce\x3d\x6f\xe1\xd7\x39\x70\x0f\xf0"
- "\xf1\xc0\xdc\x1a\x73\x6c\xe0\xd6\x05\x39\x1b\x98\xfc\x2d\xed\x98"
- "\xd3\x0f\x56\x7b\x46\x5b\x38\xf6\x1a\x38\xb6\x16\x8e\xc1\x7d\x94"
- "\x9c\xce\x45\xe8\x78\x95\x16\x73\x07\x5d\xce\x75\xe4\x01\x3e\x2b"
- "\x5d\x06\xbf\x8f\xaf\x87\x6b\xb2\x2d\xd7\xc0\xf8\x5e\x40\x38\xb9"
- "\x57\x57\xb3\x75\xbe\x5a\xe9\x79\xa3\x8e\x93\x83\x9d\x70\x3e\x1c"
- "\xef\xcb\xc5\xf2\xf2\x6e\xfd\xb5\x46\x0b\x2f\xf7\xb7\xe2\xe5\xca"
- "\x27\x77\x58\x78\x39\x5e\xdf\x54\xc7\xcb\xe3\x38\x5e\xae\x6c\xe5"
- "\x2f\x93\x97\x9f\x6f\x2a\xbc\xdc\x4b\xa1\xf0\xf0\x0a\x27\xbc\x3c"
- "\x7b\x41\xfd\xf0\x72\xcc\xc9\x31\x0f\xc7\x9c\x1c\x73\x74\xcc\xcb"
- "\x31\x47\x37\x73\xbc\x7c\x8b\x15\x2f\x37\x5b\xf1\x72\xb3\x35\x2f"
- "\x57\x3e\x39\x57\x16\x2f\x57\x3e\xa9\xa9\x07\x5e\xfe\x48\xfd\xf3"
- "\x28\x78\x79\xa0\x0d\x2f\xc7\x3c\x1c\xfa\x5e\x39\xe6\xe7\xc5\x5a"
- "\xb0\xcd\x5c\xe0\xe8\xc0\xcf\x9d\x72\x73\xe5\x93\x93\xad\xb9\xf9"
- "\x96\xb6\xd6\xdc\xdc\x6b\xb8\x3d\x37\xf7\x0a\xb3\xe2\xe6\x05\x3a"
- "\xa5\xe7\x5e\x36\xee\x43\xff\xd6\x4e\xc3\xbc\xdb\x33\x80\xcf\xcd"
- "\xdb\xee\xb2\xe7\xe6\x5e\x3b\x04\xb9\x39\xd1\xdf\x7c\x6e\xee\x3f"
- "\xb5\xdc\x58\xc7\xcd\xbd\x2e\xc8\xe3\xe6\x5e\xe7\xeb\xb4\x83\xf2"
- "\x89\x72\x32\xbe\x78\xc5\x89\xf1\xf5\x07\x3e\xd6\x7c\xbd\x75\x30"
- "\xe5\xeb\x71\x94\xaf\x2b\x9f\xc8\x12\xe5\xeb\xf0\x1d\x3b\x77\xdc"
- "\x27\x69\x28\x6e\x0b\xf3\x2c\x88\x95\xe5\xea\x58\xcc\xb5\xda\x3c"
- "\xc4\x5c\x0b\xe2\x53\x39\x9e\x73\x0d\x7f\x9f\xb1\xf0\x76\x56\x5f"
- "\x62\xee\xbe\xa8\x29\xf2\xab\x36\x91\xc2\xfc\xaa\xcd\x5c\xcc\x63"
- "\xd8\xf5\xac\xca\xd6\x41\x60\x93\xf2\xfa\xe5\xef\xad\x83\x84\xf9"
- "\x7b\x9b\x6b\x84\xeb\xb4\x1e\x85\xfd\xc2\xe7\xef\x70\x8d\x20\x7f"
- "\xf7\x6e\xcf\x5d\x13\xc4\xe7\xef\xa4\x0d\x18\xb3\xfb\x89\xf3\x77"
- "\xef\x73\x64\x0c\xf7\xde\x46\xc6\x70\xe2\x63\x7b\xfe\xee\xbd\xd0"
- "\x9a\xbf\x63\xff\xdb\xf3\x77\x82\x29\xf6\x3e\x45\xf9\xbb\xf7\x49"
- "\x3b\xfe\x0e\xbf\x89\xf9\xbb\xd1\x0a\x57\xd9\x18\x57\xd3\x30\xae"
- "\x7c\x0f\x61\x5c\xe1\x71\x52\x3d\x03\xe3\xca\x77\x9c\xc1\x6c\xe1"
- "\xf1\xab\xa1\x3d\x1f\x5f\x5b\x1e\x8f\xe3\x85\x23\x9c\x69\x62\x51"
- "\x67\x8c\x35\x8c\x33\x8b\xdf\xf0\xf9\x18\x6f\x0d\x8b\x35\x9f\x12"
- "\x61\xac\xf9\x5c\x62\xfd\xcc\x61\x0d\xe7\x13\x09\xaf\x67\x9f\xef"
- "\x8e\x34\x5e\x8f\xaf\xf1\xed\x26\x8d\xd7\x63\x2c\x0a\xf1\x7a\xdf"
- "\xb9\xb6\x58\xe4\xf3\x7a\xdf\x35\xc2\xbc\xde\x77\x07\x9f\xd7\xe3"
- "\xf6\x85\x78\xbd\xef\x39\x5e\xfb\x76\xbc\xde\xf7\x16\x9f\xd7\x93"
- "\xf3\x28\xaf\x6f\x9b\x41\x62\xf1\x13\x43\xa4\xf3\xfa\xb6\xf3\xb9"
- "\xf8\x4e\x78\xfd\x55\x5b\x5e\xdf\x76\x31\x9f\xd7\xb7\x0d\x25\xf1"
- "\xb5\xed\x4e\x03\xcb\xeb\xdb\x46\x92\xe3\x4f\x0c\xb6\x3e\x5e\xc7"
- "\xeb\xb9\xe3\x06\x6b\x5e\xaf\xc5\xbc\xbe\xad\xd6\x09\xaf\x0f\x75"
- "\x9d\xd7\x77\x1e\x4a\x79\x7d\xe7\xa1\x8e\x79\xfd\xd3\x73\x1d\xf3"
- "\xfa\x67\x12\x28\xaf\x6f\x5f\x48\x62\x42\xfb\x43\x24\x26\xb4\x67"
- "\x39\x10\xf4\x2b\x9a\xf7\x9e\xcb\xce\xb1\xce\xdf\x5f\x95\xaf\x3c"
- "\x10\xcb\xe5\xbd\xef\x03\xa7\x5f\x00\xfc\xbc\x9a\xf0\x73\x88\x99"
- "\xa7\x31\xaf\xc7\xfc\x9b\x70\xfa\xf6\x53\xe0\x98\x0e\x6c\x7e\x1a"
- "\xda\xd2\xed\x5d\xa4\x55\xe2\xb9\x55\xf8\x5c\xe8\xef\xa5\xa9\x30"
- "\x8e\xc0\xf1\x52\x38\x47\x8b\xaf\x81\x63\xe7\xb5\xb1\xec\x75\xc1"
- "\x98\xfb\xc3\x75\x5a\xf8\xbe\xcc\xe6\xba\x12\x7c\x5d\x51\x3c\xcb"
- "\xed\x4b\x88\xef\x02\x76\xc1\xf1\x02\xaa\x03\xfc\x86\xb0\x3a\xa0"
- "\x9a\xd3\x01\x70\x2e\xb4\x95\xcf\xea\x80\x69\xa0\x03\xe0\xbe\xe1"
- "\x63\xad\x03\x8e\x81\x0e\xc8\x03\xdd\x72\xf8\xc1\x6a\x3f\x8d\x95"
- "\x0e\xc8\xc3\xbc\x1f\x6b\x00\xcc\xfd\x61\x5c\x3b\x8c\x75\xc1\xf1"
- "\x1a\x1d\x9e\x4f\x7e\x1e\x74\x40\x29\xbe\xde\xea\xda\xbd\xd6\xd7"
- "\xe2\xf3\xe1\x1e\xb5\xac\x86\x00\x3e\x07\xf7\x50\x96\x73\x95\xd5"
- "\x10\x05\x70\x6d\x09\xd1\x10\x7e\x3a\x2b\x0d\x71\x8c\x68\x88\x80"
- "\x68\x5e\x5e\x5f\xe9\xdf\x4b\xba\x86\x68\x77\xc3\x61\x6e\x5f\xe9"
- "\xff\x8e\x14\x0d\x01\xcf\x9d\x6f\xe1\xa9\x76\xf3\xf8\xf0\x3c\x73"
- "\xe0\xaa\x98\x97\x3a\x9c\x0f\xc6\x71\x56\xcc\x51\x31\x3f\xc5\x3c"
- "\xd5\x25\x8e\x0a\xf7\x5f\x60\xa8\xc7\xdc\x7e\x4b\xd0\x10\x0b\xc4"
- "\x35\x84\x45\x3f\xb0\x39\x7d\x4e\x43\x40\x1f\x63\x35\x44\xf6\x52"
- "\x2b\x0d\xd1\xd2\x4a\x43\x28\xac\x35\x44\xbb\x23\xf2\x34\x44\xbb"
- "\xc3\xf5\xa0\x21\xf2\x1f\x6b\x08\xb9\x1a\xa2\x5d\x6e\x9d\x86\x50"
- "\x72\xf9\xfd\xb6\x16\x0d\x11\x90\x62\xaf\x21\x02\xb2\xad\x34\xc4"
- "\x31\x9d\xd2\x4f\xcf\xf2\x73\x56\x3f\xf8\xa9\xf9\xfa\xa1\xf3\x1d"
- "\x7b\xfd\x10\x70\x4d\x9e\x7e\x68\xef\x2f\x4f\x3f\xb4\xf7\x23\xf7"
- "\x87\xdf\x4d\x3e\xad\x27\xe3\x58\xc0\x61\xaa\x29\x9e\xce\xb3\x3e"
- "\xe6\x5c\x53\xb4\xcf\x11\xd6\x14\x4f\x6b\xc4\x35\xc5\xd3\x1a\x71"
- "\x4d\xf1\xcc\x68\xcc\xfd\xb0\x7e\x80\xf6\x81\xfb\x3d\xd3\xde\xfa"
- "\x5d\x40\xaa\x13\x9e\x67\xab\x27\x34\xd3\x88\xfe\x68\x78\x9e\xd7"
- "\x21\x4f\x98\xe7\x75\x38\x83\x39\x94\x91\xe5\x79\xed\xb3\xb3\xeb"
- "\x5d\x53\xb4\xcf\x16\xd6\x14\xcf\x0c\x24\x3c\xab\x7d\xae\xbd\xa6"
- "\x80\x6b\x04\x35\xc5\x33\xb3\xb9\x6b\xb2\xf9\x9a\x82\xb4\x01\x7c"
- "\x61\x95\xb8\xa6\xe8\xd8\x8d\xf0\x87\x67\xee\x11\xfe\x40\x7c\x6c"
- "\xaf\x29\x9e\xb1\xce\xff\x8a\x68\x0a\x82\x29\xf6\x3e\x45\x35\x45"
- "\x47\x7f\x7b\x4d\xf1\xb4\x06\x6b\x0a\x61\x5c\x75\x7a\xc8\xc7\x55"
- "\xa7\x8d\x7c\x4d\xd1\x31\xca\x56\x53\x34\x43\xac\xe5\xd1\xf7\x03"
- "\xf8\x99\x3a\x0d\x94\xae\x23\x3a\xcd\x96\xa6\x23\x30\xfe\x84\x74"
- "\x44\xa7\xa3\xb6\xf8\xe3\xeb\x88\x4e\x17\x84\x75\x44\xa7\x5b\x7c"
- "\x1d\x81\xdb\x17\xd2\x11\x9d\xdb\xf3\xda\xb7\xd3\x11\x9d\xfb\xf1"
- "\x75\x04\x39\x8f\xea\x88\xce\x65\x24\x26\x3f\xed\x2f\x5d\x47\x74"
- "\x3e\xee\x58\x47\x74\x3e\xc3\xd7\x11\x9d\xb3\x48\x4c\xed\xac\x27"
- "\x3a\xa2\xf3\x5e\x72\xfc\x69\x3f\xeb\xe3\x54\x47\x90\xe3\xf6\x3a"
- "\xe2\x59\x4f\x27\x3a\xc2\xcb\xb8\xbd\xff\xc1\x9a\xae\xfd\xb5\xb5"
- "\x7e\xb3\x74\x2f\x94\xbf\x6a\xaa\xdb\x8f\x20\x1c\xb8\x42\x19\x70"
- "\x87\x08\xa4\xc4\x6b\xfa\x13\xcf\x01\x27\x88\x20\xf3\xfd\x31\x2f"
- "\xd8\xbf\x00\xf3\x38\x6d\x0b\x5c\x3f\xb1\x26\x63\x64\xae\xb1\xe7"
- "\xa0\x12\xcc\x0f\x1e\x6e\xef\x9f\x66\xc8\x98\x68\x78\x88\xe7\xfa"
- "\xc7\x20\xe5\xd4\x4a\x61\x6e\xf7\x61\x19\x63\x06\xcc\x7b\x8e\x9d"
- "\x4c\x78\x5d\x61\xf4\x35\x16\xc7\x98\x33\xe0\xf5\x18\xc5\xd5\xa5"
- "\x2c\x87\xf0\x0a\x1f\x8a\xb2\x13\x91\x5f\xeb\x4a\xe4\xd3\x5a\xa1"
- "\x68\x19\x02\x28\x30\x01\x7f\x18\xd1\x9d\x31\xbf\x10\x39\x14\xd7"
- "\xf0\x69\x43\x38\x44\x5e\x0b\x23\xc7\x21\x3e\xba\x8f\x7a\xe6\xe0"
- "\xfc\x70\x21\xe5\x0e\x0f\x2d\xdc\xce\x8a\x37\x4c\xb9\xe5\x83\x72"
- "\x96\xf2\xe7\xfa\xd7\xa6\x53\xde\x80\x39\x03\x33\x15\xb8\x9d\x81"
- "\xcc\xd7\x58\x34\x8e\xcc\xf5\xef\x59\x8e\x94\x5b\xdf\x45\x9e\x05"
- "\xe1\x57\x71\xee\x27\xa0\xa0\x7c\x07\x5a\x18\x8c\x3a\x1b\x31\x4f"
- "\x00\xae\x57\x50\x9e\x89\x70\x7d\xc2\x6c\xe0\x0a\x59\xf7\xd1\x60"
- "\x3c\x1e\x8f\x8a\x20\x7c\x81\x8c\xc5\xea\x6d\x67\x02\xcf\x20\xe9"
- "\x5c\x4f\x9d\x8b\x1c\xad\xbb\xdd\x0e\xbc\xbe\x6b\xff\x34\x13\xf8"
- "\x92\xd4\xa5\x0c\x57\x9b\x3f\xfd\x00\xed\x07\x1c\xee\xb9\x5a\xa1"
- "\xc0\x35\xb6\xf1\x7e\x93\xe6\xbd\x83\x4a\x78\xbe\xa9\xe5\x7c\x53"
- "\x4b\x7c\x83\xfd\xf2\xae\x06\xe1\x7a\x86\x6d\xb0\x4f\x8a\x0d\xa5"
- "\xc8\xfc\xa1\x65\xcf\xc9\xde\x68\x8b\x99\xf8\xc3\x54\x1b\xdd\xca"
- "\x0c\xb6\xc7\x75\xbb\x00\x0f\x2c\x87\x4b\xc5\xfb\x50\x2e\x51\xb4"
- "\xc6\x1c\x0e\xf0\xfd\xe4\xd6\x1a\xf0\xc3\x15\xe2\x07\x66\xa9\x0f"
- "\xfb\xaf\xf1\xc3\x40\x35\xb4\xfd\x5c\x6d\x2d\xf8\xc2\x60\xeb\x8b"
- "\x8b\xa5\x78\xbf\x4a\x5c\x53\xcf\x98\x4e\xea\x06\xb2\xbe\xf8\x30"
- "\xb0\x23\xae\xb9\xc1\xae\x97\xa9\x0d\xc4\xf1\xd2\x67\xcb\x75\xbc"
- "\xce\x87\xf8\xc0\xc4\xd9\x1e\xef\x5d\x89\xed\x8d\xf9\x59\x31\xf0"
- "\x32\x76\xfd\xca\xea\x67\x3b\xd6\xee\xe8\x9f\x86\xe7\xd2\xdc\x56"
- "\x3e\x27\x6f\xfe\xaf\xf2\xb9\x8e\x8f\xde\xf6\xea\x66\x68\x7b\x75"
- "\x05\xb5\xfd\x6f\x37\xca\xb3\xfd\x6f\xb3\x1e\xbd\xed\x7d\x9a\xa1"
- "\xed\x9f\x8b\xa4\xb6\xef\x26\x93\xff\x77\x13\xad\x7f\x85\x6d\x8f"
- "\xf3\x50\x96\x1c\x94\x25\xff\x84\xc7\x38\xa2\x55\x7a\x16\xd0\xf9"
- "\x96\x3d\x0b\xac\xe7\x5b\x7e\x73\x1a\xaf\x3f\xe7\xe6\x5b\x2a\xbb"
- "\xdd\x70\x9c\x77\xea\xe1\x47\xf3\x4e\x81\xf3\x09\x6f\x0c\x7c\x87"
- "\xf0\xc6\x40\x76\x4e\xc3\xe2\x4b\x48\x69\xfc\xdd\x40\xdd\xfe\x39"
- "\x5a\x25\x5e\x7b\xb4\xff\xb6\x41\x99\x5a\x05\x3c\x50\xf9\x2c\x83"
- "\xf3\x40\x6b\x62\x41\x6f\xc0\xd8\xac\x99\x81\x9e\xbd\xa9\x7c\x3e"
- "\x1d\xd7\x29\x3b\x71\x5b\xab\x4c\xc3\xe7\x3c\xf7\x01\xda\xdb\x41"
- "\xaf\xc0\x63\xdb\xfe\x39\x06\xa5\x05\x2f\x96\x35\x86\x60\x43\xad"
- "\xc9\x7f\x96\xee\xee\x8e\xfe\x07\x2d\x73\x22\x8d\xfb\x06\x95\x08"
- "\x62\x08\xaf\x5d\x04\x1c\x61\xcc\xe0\xb5\x86\x16\x3c\x61\x1c\x15"
- "\x19\x2a\x10\xde\x87\xc7\xbb\x02\xf9\x30\x80\xa1\x49\xbb\xc0\xbf"
- "\xd6\x38\x4a\x13\xc1\xd1\x46\x3e\x8e\xee\x72\x38\x02\x3c\x51\x1c"
- "\xd1\x75\x87\x93\x25\xe1\xa8\x92\xc3\x51\xba\x0d\x8e\x6e\xa9\xd1"
- "\x37\x65\x97\x38\x1c\xfd\x56\x67\xec\x66\xc1\xd1\xf3\x53\xce\x4c"
- "\x06\x1c\x4d\x96\x8a\xa3\xe7\x27\xf3\xb5\x6d\xaf\x85\xf6\xda\xf6"
- "\xf9\x93\xb6\xda\xd6\xa2\x65\xef\xfa\x4f\xd5\xdd\xcd\x9c\x5a\x5e"
- "\xed\x6f\xd1\xb3\xcf\x5f\x93\x87\xe7\xe7\xcb\x5d\x9b\xab\x16\x38"
- "\xc2\x76\xae\xda\x1e\x56\xa7\x76\xab\xc4\x58\x13\xd6\xa9\xe4\x3b"
- "\xfb\x39\x46\xdd\xaf\xd1\x39\x46\xdd\x0f\x35\xfd\xb9\x6a\xdd\xc7"
- "\x0b\xeb\x85\xee\x53\xc8\x5c\xb5\xc0\xe1\xf5\x3f\x57\x2d\x70\xb8"
- "\xb0\x2e\xed\xce\xe5\xff\x03\x83\xec\xe7\xaa\xc1\x35\x82\xba\xb4"
- "\x47\x0b\xee\x9a\xe1\x7c\x5d\x4a\xda\x80\x78\xd2\x45\x5c\x97\xf6"
- "\x38\x4e\xe2\x4b\x8f\x35\x24\xbe\x10\x9f\xda\xeb\xd2\x1e\x51\xd6"
- "\xba\x54\x78\xae\x1a\xc1\x10\x7b\x9f\xa2\xba\xb4\xc7\x3e\x7b\x5d"
- "\xda\xad\x42\x78\xae\x5a\xcf\x15\x14\x47\x3d\xbb\xf1\xe7\xaa\xf5"
- "\xb8\xd7\x3c\xe6\xaa\x89\x62\x6b\x3c\x7f\xae\xda\x0b\x67\xa4\xcf"
- "\x55\x7b\xe1\xa1\x34\x2d\x8a\x31\x27\xa4\x45\x7b\x8e\xb0\xc5\x1c"
- "\x5f\x8b\xf6\x8c\x10\xd6\xa2\x3d\x17\xf2\xb5\x28\x6e\x5f\x48\x8b"
- "\xf6\xdc\xc1\x6b\xdf\x4e\x8b\xf6\x3c\xc9\xd7\xa2\xe4\x3c\xaa\x45"
- "\x7b\x45\x92\x18\xda\x2d\x5d\xba\x16\xed\x35\x02\x9f\xb3\x6f\x13"
- "\x79\x67\xc4\xd7\xa1\xbd\x46\xf3\x75\x68\x2f\x6e\x3e\x5a\xaf\x78"
- "\x32\x4f\xad\x57\x5f\x72\xbc\x5b\x9a\xf5\x71\xaa\x43\xc9\x71\x3c"
- "\x4f\x8d\xcc\x4f\xeb\x95\x22\x4d\x7f\xbe\xd4\x04\xf5\x67\x6f\x07"
- "\xfa\xb3\x77\x33\xd5\x9f\x2f\x75\x91\xa7\x3f\x5f\x52\x3f\x7a\x1e"
- "\xde\x1c\x35\x50\xaf\x6c\xca\xc3\x7b\xe7\xc8\xe3\x2d\xbd\xb3\x1f"
- "\xbd\xed\x9b\xa3\x06\x7a\x29\x9a\xda\xfe\xe5\xf6\xf2\x6c\xff\x72"
- "\x80\x7c\x0d\x34\xb0\x84\x6a\xa0\x81\x25\xe2\x1a\xe8\xe5\x5b\x8e"
- "\x35\x50\xff\x00\xaa\x81\xfa\x71\x73\x6a\xfb\x71\x73\x6a\xfb\x75"
- "\x92\xae\x81\xfa\x66\x3e\xd6\x40\x52\x34\x50\xef\x72\xaa\x81\xfa"
- "\x46\xc8\xd3\x40\x7d\xc3\xf9\x1a\x68\xd0\x62\x7b\x0d\xd4\xf7\x8c"
- "\xeb\x1a\xa8\xef\x0d\x79\x78\xee\x5b\xe1\x9a\x06\xea\x17\x2c\xac"
- "\x81\x5e\xd6\x8b\x6b\x20\xf2\x9d\x3d\x77\x7d\xe5\x06\xe5\xae\xaf"
- "\x1c\x69\xfa\x1a\xe8\x95\x30\x61\x9e\xfa\x4a\x04\xd1\x40\xfd\x82"
- "\xea\x5f\x03\xf5\x13\x99\xef\xf7\xca\x05\xc2\x17\xfb\x8d\xb2\xd7"
- "\x40\xfd\x44\xe6\xfb\xf5\x6f\xc5\x5d\x63\x33\xdf\x8f\xb4\x01\xf1"
- "\xa4\x9b\xb8\x06\xea\x7f\x92\xc4\x97\xfe\xa4\xae\x0b\xe7\x53\x7b"
- "\x0d\xd4\x7f\xa6\x73\x0d\xd4\x8f\x9b\xef\xd7\xcf\xc1\x7c\xbf\xfe"
- "\x87\xec\x35\xd0\xcb\x95\xc2\x1a\x68\xe0\x2a\x8a\xa3\x81\xdd\xf9"
- "\x1a\xa8\xff\xc3\xe6\xa1\x81\x44\xb1\x15\xc6\xd7\x40\x03\xce\x4a"
- "\xd7\x40\x03\x4c\xd2\x34\x50\x3f\x91\x79\x7d\x03\x83\x6d\x31\xc7"
- "\xd7\x40\x03\xa3\x84\x35\xd0\xc0\xc5\x7c\x0d\xd4\x4f\x64\x5e\xdf"
- "\xc0\x5d\xbc\xf6\xed\x34\xd0\xc0\x33\x7c\x0d\x44\xce\xa3\x1a\x68"
- "\x50\x34\x89\xa1\x2f\x67\x4a\xd7\x40\x83\x82\xc5\x35\xd0\xa0\x71"
- "\x7c\x0d\x34\xa8\x2b\xd1\x3a\x83\x12\x88\x06\x1a\x34\x80\x1c\x7f"
- "\x39\xc3\xfa\x38\xd5\x40\xe4\x38\xd5\x40\x83\x52\xa5\x69\xa0\x67"
- "\x9b\xa0\x06\x52\x3b\xd0\x40\xea\x66\xaa\x81\x06\x77\x93\xa7\x81"
- "\x06\x77\x7d\xcc\xc3\xe5\xf0\xf0\x41\xb9\x94\x87\x0f\xd9\x26\x8f"
- "\xb7\x0c\x71\xf8\xfe\xd3\x31\x0f\x1f\x11\x46\x79\xf8\x88\x30\x71"
- "\x1e\xfe\x07\xc7\xf5\xcf\x94\xaf\xe5\x52\x1e\x3e\x4c\x41\xc6\xc9"
- "\xa1\xd7\xc8\x38\x39\x74\x87\x74\x1e\x3e\xb4\xd3\x63\x1e\x2e\x85"
- "\x87\x0f\x8e\xa1\x3c\xfc\xd5\x1b\xf2\x78\xf8\xab\x15\x7c\x1e\xfe"
- "\xc7\x16\xf6\x3c\x7c\xe8\x68\xd7\x79\xf8\xd0\xb9\xf2\xf0\x3c\x54"
- "\xe3\x1a\x0f\x1f\x7a\x4e\x98\x87\xff\x21\x5e\x9c\x87\x93\xef\xec"
- "\xf9\xd3\x6b\x73\x29\x7f\x7a\x6d\x48\xd3\xe7\xe1\xc3\x74\xc2\x5c"
- "\x69\xd8\x0d\xc2\xc3\x87\x96\xd4\x3f\x0f\x1f\x5a\x22\xcc\xc3\x5f"
- "\x9b\x42\x38\xcb\xd0\xf3\xf6\x3c\x1c\xae\x11\xe4\xe1\xaf\xa5\x73"
- "\xd7\x94\xf0\x79\x38\x69\x03\xe2\xc9\x3e\x71\x1e\xfe\x7a\x30\x89"
- "\x2f\xaf\xb7\x27\xf1\x85\xf8\xd4\x9e\x87\xbf\x76\xc7\x39\x0f\x27"
- "\x18\x62\xef\x53\x94\x87\xbf\x3e\xd0\x9e\x87\xff\x41\xb8\xa6\x94"
- "\x72\x84\x2f\xc5\xd1\xf0\x43\x7c\x1e\xfe\xfa\x92\xe6\xc1\xc3\x45"
- "\xb1\xa5\xe3\xf3\xf0\xe1\xe3\xa4\xf3\xf0\xe1\x2b\xa4\xf1\x70\x8c"
- "\x39\x21\x1e\x3e\xfc\x9c\x2d\xe6\xf8\x3c\x7c\xf8\x2d\x61\x1e\x3e"
- "\xa2\x05\x9f\x87\xe3\xf6\x85\x78\xf8\x88\x3e\xbc\xf6\xed\x78\xf8"
- "\x88\xd1\x7c\x1e\x4e\xce\xa3\x3c\x7c\x84\x9e\xc4\xd0\x3f\x48\xaf"
- "\x29\xa5\x1c\x71\x4e\x9c\x87\x8f\xb8\xc8\xe7\xe1\x23\xf6\x12\xbe"
- "\xfd\x47\x0f\xc2\xc3\x47\x68\xc9\xf1\x3f\x74\xb4\x3e\x4e\x79\xf8"
- "\x1f\xea\xea\x49\x11\x1e\xfe\x47\x3f\x69\x3c\xdc\xbb\x09\xf2\x70"
- "\x1f\x07\x3c\xdc\xa7\x99\xf2\xf0\x91\xfb\xe4\xf1\xf0\x91\x7b\xe5"
- "\x73\xc1\xb1\x91\x94\x0b\x8e\x8d\x14\xe7\x82\x41\x4b\x1c\x73\xc1"
- "\x51\x7b\x29\x17\x7c\xa3\x35\x89\xd5\x21\x77\x48\xac\x0e\x39\x24"
- "\x9d\x0b\x86\x74\x7f\xcc\x05\xa5\x70\xc1\x3f\x06\x52\x2e\x18\x7c"
- "\x4f\x1e\x17\x0c\xae\xe6\x73\xc1\x50\x5f\x7b\x2e\x18\xf2\x8e\xeb"
- "\x5c\x30\x64\xb1\x3c\x2e\x18\x92\xe0\x1a\x17\x0c\xb9\x24\xcc\x05"
- "\x83\x96\x8b\x73\x41\xf2\x9d\xfd\x18\x3e\x6a\x31\x1d\xc3\x47\x05"
- "\x37\x7d\x2e\xf8\x46\xa5\xf0\x78\xfd\xc6\x3d\xc2\x05\x43\xca\xea"
- "\x9f\x0b\x86\x94\x09\x73\xc1\x51\x33\xc9\xb8\x19\xa2\xb3\xe7\x82"
- "\x70\x8d\x20\x17\x1c\x95\xc3\x5d\x53\xc6\xe7\x82\xa4\x0d\x88\x27"
- "\x47\xc5\xb9\xe0\xe8\x09\x24\xbe\x8c\xee\x46\xe2\x0b\xf1\xa9\x3d"
- "\x17\x1c\x65\x72\xce\x05\x09\x86\xd8\xfb\x14\xe5\x82\xa3\x47\xd8"
- "\x73\xc1\xa0\x64\x61\x2e\x38\x96\xd6\xa9\x55\x8e\x39\xce\xe7\x82"
- "\xa3\xd7\x34\x0f\x2e\x28\x8a\xad\x4a\x3e\x17\x1c\x33\x45\x3a\x17"
- "\x1c\x93\x2e\x8d\x0b\x62\xcc\x09\x71\xc1\x31\x97\x6c\x31\xc7\xe7"
- "\x82\x63\x1e\x0a\x73\xc1\xb1\xbe\x7c\x2e\x88\xdb\x17\xe2\x82\x63"
- "\x87\xf0\xda\xb7\xe3\x82\x63\xdf\xe1\x73\x41\x72\x1e\xe5\x82\x63"
- "\x8d\x24\x86\x06\x75\x97\xce\x05\xc7\x5e\x12\xe7\x82\x63\xaf\xf1"
- "\xb9\xe0\x58\x6e\xcd\x59\xa8\x0f\xe1\x82\x63\x0b\xc8\xf1\xa0\x40"
- "\xeb\xe3\x94\x0b\x92\xe3\x94\x0b\x86\xaa\x9d\x71\x41\xc7\xfc\xe1"
- "\xed\x63\x94\x3f\xbc\x7d\xcc\x9a\x3f\x9c\xe5\xf1\x87\xd0\x93\x8e"
- "\xf9\xc3\x04\x0f\xca\x1f\xde\x8a\x22\xfd\xfb\xad\x60\xd2\xbf\xdf"
- "\x62\x6b\xf8\x2d\x1e\x0d\xe3\x3c\xf0\x87\x7d\x37\x0f\x12\xfe\x70"
- "\xd3\xa0\xfc\xe8\x36\xc7\x1f\x2a\x91\x67\xea\x1c\x8e\x3f\xbc\x8b"
- "\xf9\xc3\x9b\x4b\x30\x7f\xf0\xca\x06\xae\x5a\xce\x71\x57\x0d\x70"
- "\xd7\x72\xf8\x1b\xfa\xce\x09\x68\xa3\x08\xf8\x65\x1a\xbe\x1e\xef"
- "\xdb\x00\x6d\xb1\x6b\x39\xd9\x75\x9e\xba\x16\x78\x3f\x20\xcc\x2d"
- "\xf0\xfe\x1a\x4e\xf7\xd6\x28\xe7\xf6\xd6\x88\xe4\xef\xad\x81\xf7"
- "\xd4\xc0\xfb\x6b\x64\xc7\x22\xbf\xcd\x1c\xa7\x68\xb3\x44\xd1\x06"
- "\xef\xaf\xd1\xa6\x9a\xf0\xd3\x7d\xe6\x7c\xc2\x4f\xe7\x05\x3c\x09"
- "\x5c\xa8\xe7\x96\x2a\xca\x25\x3e\xc6\x3c\x62\x5e\xa0\xba\x7a\x5e"
- "\x60\xe7\xbb\x77\x03\x9f\xb3\xdf\x57\xe3\xfb\xed\x78\x4f\x80\xe2"
- "\xf8\x52\x96\x47\xb0\xfb\x31\xbc\x17\x88\xb6\xce\x40\x9e\xc0\x8b"
- "\x15\x2f\x02\x3f\x7d\xbe\x23\xdc\x7b\x21\xf2\x31\xdd\x0d\xec\x68"
- "\x5d\xaf\x11\xee\xdd\xc7\x7c\x37\x10\x15\x84\xff\xc0\xae\xeb\x34"
- "\x72\xeb\x3a\xf5\xf3\x02\xf1\x5e\x03\x03\x36\xc5\x5a\xf1\x53\x7f"
- "\x0b\x3f\x7d\x73\xb4\x3c\x7e\xfa\xe6\x28\x3e\xaf\x08\x9b\x69\xcf"
- "\x2b\xde\x3c\xe4\x3a\xaf\x78\x53\x66\xfd\x97\x37\xcf\xbb\xc6\x2b"
- "\xde\xea\x67\xcb\x2b\x76\xb1\xbc\x22\xf4\x34\xc6\xa0\x30\xaf\x20"
- "\xdf\xd9\x8f\x07\xe3\x2f\xd0\xf1\x60\xfc\xb6\xa6\xcf\x2b\xc6\x0f"
- "\x17\x8e\xfd\xe3\x47\x13\x5e\xf1\x56\xdf\xfa\xe7\x15\x6f\xf5\x15"
- "\xe6\x15\xe3\x4f\x92\x18\xfc\xd6\x00\x7b\x5e\x01\xd7\x08\xf2\x8a"
- "\xf1\xf7\xb8\x6b\xfa\xf2\x79\x05\x69\x03\xe2\x8c\xaf\x38\xaf\x98"
- "\x40\xf6\xf0\x50\x4e\x58\x4c\xe2\x0e\xf1\xa9\x3d\xaf\x98\x30\xc1"
- "\x39\xaf\x20\x18\x62\xef\x53\x94\x57\x4c\xc8\xb1\xe7\x15\xa1\x5a"
- "\x61\x5e\xf1\xf6\x7c\x8a\xa3\xb7\xfd\xf9\xbc\x62\xc2\xb5\xe6\xc1"
- "\x2b\x44\xb1\x35\x9c\xcf\x2b\xfe\x74\x44\x3a\xaf\xf8\xd3\x0d\x69"
- "\xbc\x02\x63\x4e\x88\x57\xbc\xdd\xcf\x16\x73\x7c\x5e\xf1\xf6\x38"
- "\x61\x5e\xf1\xf6\x4c\x3e\xaf\xc0\xed\x0b\xf1\x8a\xb7\x33\x79\xed"
- "\xdb\xf1\x8a\xb7\x0f\xf1\x79\x05\x39\x8f\xf2\x8a\xb0\xf1\x9c\x36"
- "\x9b\x29\x9d\x57\x84\xf5\x13\xe7\x15\x61\x43\xf8\xbc\x22\xcc\x87"
- "\xf0\x87\xb0\x68\xc2\x2b\xc2\xba\x92\xe3\xa1\xd1\xd6\xc7\x29\xaf"
- "\x20\xc7\x29\xaf\x08\x8b\x7f\xbc\xde\xb2\x29\xe6\x98\x26\xfa\xca"
- "\x1b\xc3\x27\xfa\x3c\xfa\x77\xbd\xcd\x71\xbd\x65\x58\x2a\x7d\xd7"
- "\x3b\x69\x8d\x3c\xde\x32\x29\xf5\xd1\xdb\xbe\x39\xce\x35\x9e\x18"
- "\x46\x6d\x3f\xa5\x95\x3c\xdb\x4f\xf1\x7c\xf4\xb6\x6f\x8e\x73\x1c"
- "\x26\x9d\xa7\xb6\x7f\x77\x85\x3c\xdb\xbf\x2b\xba\xff\xb5\x73\x5d"
- "\x3a\xc3\x6a\x8e\xc3\x8c\x30\x71\x5d\x3a\xf5\x1d\xc7\xba\x74\xba"
- "\xd5\x1c\x87\x69\xdc\x1c\x87\x08\x6e\x8e\x43\x04\x3b\xc7\x21\x11"
- "\xeb\xd2\x4f\xe7\xeb\x0f\xc4\xe6\x29\x71\xad\xaf\x7d\xb1\x06\x25"
- "\xf8\xc4\xc3\x88\x75\x29\xd8\x7a\x4d\x0d\xd6\xa5\xa7\xb9\xbc\x76"
- "\x44\xa7\xa2\x0a\xab\x3d\x2d\x94\x53\x77\xd1\x9a\xbb\xa7\x11\xfe"
- "\xee\x44\x55\x9e\x32\xad\xc6\x26\xe7\x0d\x6d\xaa\xe7\xf0\x73\xde"
- "\x38\xd7\xfd\xd0\x6a\x6f\x0a\x53\xe6\x2c\x9d\xb3\x9c\xb7\x6d\xbe"
- "\x3b\xa7\x06\xf9\x35\xdf\x9c\xf7\x94\x50\x9a\xf3\x0e\x97\x39\xff"
- "\x21\xdc\x66\xfe\xc3\x7b\x02\xf3\x1f\x22\x24\xcc\x7f\x88\x90\x39"
- "\xff\x21\xc2\xc5\xf9\x0f\x11\x76\xf3\x1f\x88\x36\x9d\x3a\x39\x51"
- "\x54\x9b\x92\xef\xec\x35\xc5\x74\xab\xf9\x0f\xd3\x9b\xc1\xfc\x87"
- "\x69\x22\xef\xa8\xa7\x71\xf3\x1f\x22\x1a\x60\xfe\x43\x84\xc8\xfc"
- "\x87\xe9\xdc\xfc\x87\x08\x81\xf9\x0f\x11\x22\xf3\x1f\xa6\x73\xf3"
- "\x1f\x22\x6c\xe6\x3f\x44\x70\xf3\x1f\xa6\x3b\x98\xff\x10\xc9\xcd"
- "\x7f\x88\xe4\xe6\x3f\x10\x9f\xda\x6b\xd3\xe9\x2e\xcc\x7f\x88\xe0"
- "\xe6\x3f\x44\x38\x98\xff\x10\x29\x30\xff\x61\x6a\x98\xb0\x36\x9d"
- "\x61\x35\xff\x21\xca\x66\xfe\x43\x64\x33\x99\xff\x20\x8a\x2d\x9b"
- "\xf9\x0f\x51\x32\xe6\x3f\x44\x49\x9c\xff\x10\x21\x32\xff\x21\xea"
- "\x9c\x2d\xe6\xf8\xda\x34\x4a\x64\xfe\xc3\x0c\x9b\xf9\x0f\x11\x22"
- "\xf3\x1f\x66\xf4\xe1\xb5\x6f\xa7\x4d\x67\xd8\xcc\x7f\x88\xb0\x99"
- "\xff\x30\x83\x9b\xff\x30\x55\x21\x5d\x9b\xce\x70\x30\xff\x61\x86"
- "\xcd\xfc\x87\x19\xdc\xfc\x87\xf7\xb8\xf9\x0f\x33\xb8\xf9\x0f\x53"
- "\x91\xf5\x71\xaa\x4d\xc9\x71\xaa\x4d\xdf\x93\x38\xff\xe1\xf1\x5a"
- "\xcc\xc6\xd1\xa6\xd1\x32\xe7\x3f\x44\x3b\x9c\xff\xf0\x58\x1f\x89"
- "\x71\xf4\xf7\x02\x29\x47\x9f\xd5\x5d\x1e\x6f\x99\x15\xf8\xe8\x6d"
- "\xdf\x1c\xf5\x51\x74\x35\xb5\xfd\x9f\x77\xc8\xb3\xfd\x9f\xb7\xcb"
- "\xd7\x47\xf3\xe2\xa9\x3e\x9a\x17\x2f\xae\x8f\x62\x9c\xec\xff\xa7"
- "\xd1\x52\x7d\xf4\x7e\x17\xc2\x51\xde\x6f\x41\x38\xca\x9c\x33\xd2"
- "\xf5\xd1\x9c\x21\x7c\x7d\x14\x73\xf6\xb1\x3e\x92\xab\x8f\x66\x69"
- "\xa8\x3e\x9a\xd3\x4a\x9e\x3e\x9a\xe3\xc9\xd7\x47\x71\xdd\xec\xf5"
- "\xd1\x9c\xd9\xae\xeb\xa3\x39\xe9\xf2\xb0\x3e\x27\xcd\x35\x7d\x34"
- "\xe7\x8e\xb0\x3e\x8a\x49\x10\xd7\x47\xe4\x3b\x7b\x5e\xab\x49\xa7"
- "\xbc\x56\x33\xa5\xe9\xeb\x23\x0d\x12\xe6\xb0\x9a\x56\x44\x1f\xcd"
- "\xd1\xd7\xbf\x3e\x9a\xa3\x17\xd6\x47\x1a\xb2\xff\xab\x72\x4e\xb5"
- "\xbd\x3e\x82\x6b\x04\xf5\x91\xe6\x10\x77\x8d\x9e\xaf\x8f\x48\x1b"
- "\x10\x6b\x0a\xc5\xf5\xd1\xdc\x99\x24\xf6\xcc\x1d\x48\x62\x0f\xf1"
- "\xa9\xbd\x3e\x9a\xeb\xeb\x5c\x1f\x11\x0c\xb1\xf7\x29\xaa\x8f\xe6"
- "\xbe\x63\xaf\x8f\x62\x44\xf6\x55\x9b\xd7\x87\xe2\x28\xf6\x1c\x5f"
- "\x1f\xcd\xdd\xd6\x3c\xf4\x91\x28\xb6\x10\x5f\x1f\xc5\xce\x95\xae"
- "\x8f\x62\x77\x48\xd3\x47\x18\x73\x42\xfa\x28\xf6\x8e\x2d\xe6\xf8"
- "\xfa\x68\x5e\x6b\x61\x7d\x34\xaf\x1b\x5f\x1f\xe1\xf6\x85\xf4\xd1"
- "\xbc\x71\xbc\xf6\xed\xf4\xd1\xbc\xd9\x7c\x7d\x44\xce\xa3\xfa\x28"
- "\xce\x87\x1b\xd3\x64\xec\xab\x36\xef\x8e\xb8\x3e\x9a\xf7\x90\xaf"
- "\x8f\xe6\x15\x10\x1d\x14\xd7\x95\xe8\xa3\x79\x3a\x72\x3c\x46\x6d"
- "\x7d\x9c\xea\x23\x72\x9c\xea\xa3\xb8\xbe\x8f\xd7\x69\x36\x45\x7d"
- "\x34\xbf\x50\x9e\x3e\x9a\x5f\xf0\x98\xa3\xcb\xe1\xe8\x71\x41\x94"
- "\xa3\x7f\x10\x2c\x8f\xb7\x7c\x10\x24\x9f\xa3\x27\x75\xa4\x1c\x3d"
- "\xa9\xa3\x38\x47\x8f\xef\xe4\x98\xa3\x27\x44\x52\x8e\xbe\xe8\x0c"
- "\x19\x27\x17\xed\x22\xe3\xe4\xa2\x99\xd2\x39\xfa\xc2\x2b\x7c\x8e"
- "\x1e\x3f\xfb\x31\x47\x97\xcb\xd1\x17\xf8\x51\x8e\xbe\x70\x9f\x3c"
- "\x8e\xbe\x70\x2f\x9f\xa3\x27\x9d\xb5\xe7\xe8\x8b\x7c\x5d\xe7\xe8"
- "\x8b\xfa\xc9\xc3\xfa\xa2\xbe\xae\x71\xf4\x45\x99\xc2\x1c\x3d\x5e"
- "\x2d\xce\xd1\xc9\x77\xf6\xdc\x2a\xa1\x1f\xe5\x56\x09\x8a\xa6\xcf"
- "\xd1\x3f\xdc\x2e\xcc\xa3\x3e\xdc\x47\x38\xfa\xa2\x8c\xfa\xe7\xe8"
- "\x8b\x32\x84\x39\x7a\x42\x17\xc2\x67\x16\x65\xd9\x73\x74\xb8\x46"
- "\x90\xa3\x27\x4c\xe0\xae\xc9\xe0\x73\x74\xd2\x06\xc4\x9a\xb9\xe2"
- "\x1c\x7d\x31\xb7\x2e\x28\xe1\x12\x89\x3d\xc4\xa7\xf6\x1c\x3d\xe1"
- "\x88\x73\x8e\x4e\x30\xc4\xde\xa7\x28\x47\x4f\x30\xd9\x73\xf4\xf8"
- "\x8e\xc2\x1c\x3d\xd1\x6a\x9e\x66\xe2\x7c\x3e\x47\x5f\x3c\xa2\x79"
- "\x70\x74\x51\x6c\x6d\xe7\x73\xf4\x44\x7f\xe9\x1c\x3d\x31\x58\x1a"
- "\x47\xc7\x98\x13\xe2\xe8\x89\x99\xb6\x98\xe3\x73\xf4\xc4\x43\xc2"
- "\x1c\x3d\xf1\x2c\x9f\xa3\xe3\xf6\x85\x38\x7a\xe2\x3d\x5e\xfb\x76"
- "\x1c\x3d\xc9\x97\xcf\xd1\xc9\x79\x94\xa3\x27\x1d\x26\x31\xf4\x83"
- "\x33\xd2\x39\x7a\x52\xa6\x38\x47\x4f\xca\xe1\x73\xf4\x24\x0d\xe1"
- "\xe2\x49\xf9\x84\xa3\x27\x2d\x27\xc7\x3f\x38\x6d\x7d\x9c\x72\x74"
- "\x72\x9c\x72\xf4\xa4\xd2\xc7\x6b\x38\x9b\x22\x47\x5f\x32\x57\x1e"
- "\x47\x5f\xa2\x91\xcf\x13\x57\x0d\xa7\x3c\x71\xd5\x70\x71\x9e\xb8"
- "\x74\x84\x63\x9e\xb8\x32\x95\xf2\xc4\xe5\xb7\x48\xac\x5e\x7e\x8e"
- "\xc4\xea\xe5\xe9\xd2\x79\xe2\xf2\x56\x7c\x9e\xb8\x34\xf3\x31\x4f"
- "\x94\xcb\x13\x93\x2a\x29\x4f\x5c\x76\x41\x1e\x4f\x5c\x76\x9e\xcf"
- "\x13\x57\x09\xec\xa9\xb5\x7c\xa0\xeb\x3c\x71\xf9\x14\x79\x3c\x71"
- "\xf9\x64\xd7\x78\xe2\xf2\xe3\xc2\x3c\x71\x69\x90\x38\x4f\x24\xdf"
- "\xd9\x8f\xef\x2b\xa7\xd0\xf1\x7d\x65\xf7\xa6\xcf\x13\x57\x14\x08"
- "\x8f\xe5\x2b\x2e\x10\x9e\xb8\xfc\x58\xfd\xf3\xc4\xe5\xc7\x84\x79"
- "\xe2\x4a\xae\xfe\xd9\x72\xad\x3d\x4f\x84\x6b\x04\x79\xe2\x4a\x2e"
- "\xff\xbb\xfc\x18\x9f\x27\x92\x36\x20\xd6\x6c\x14\xe7\x89\x7f\xe9"
- "\x47\x62\xcf\x5f\xb8\xf7\x48\xc4\xa7\xf6\x3c\x71\xe5\x25\xe7\x3c"
- "\x91\x60\x88\xbd\x4f\x51\x9e\xf8\x97\x6e\xf6\x3c\x71\xe9\x70\x61"
- "\x9e\x98\x62\xa2\x38\x4a\xc9\xe1\xf3\xc4\xbf\xcc\x6e\x1e\x3c\x51"
- "\x14\x5b\x05\x7c\x9e\x98\x32\x44\x3a\x4f\x4c\x99\x2b\x8d\x27\x62"
- "\xcc\x09\xf1\xc4\x94\xe3\xb6\x98\xe3\xf3\xc4\x94\x8b\xc2\x3c\x31"
- "\xe5\x0e\x9f\x27\xe2\xf6\x85\x78\xe2\xaa\x4e\xbc\xf6\xed\x78\xe2"
- "\xaa\x81\x7c\x9e\x48\xce\xa3\x3c\x71\x15\xb7\x07\xd6\x92\x5b\xd2"
- "\x79\xe2\xaa\xe3\xe2\x3c\x71\x95\xcd\xfe\x57\xab\xb8\xfd\xaf\x56"
- "\xe9\x09\x4f\x5c\xc5\xed\x7f\xb5\xa4\xd2\xfa\x38\xe5\x89\xe4\x38"
- "\xe5\x89\xab\x91\x7b\xeb\x3b\xd3\xf3\x28\xb7\x48\xcf\x13\xe7\x16"
- "\xab\xb7\x39\xe6\x16\xeb\x10\xe5\x16\x6b\x22\x48\xff\x5e\x33\x82"
- "\xf4\xef\x35\xec\xfc\xa4\xc5\x85\xc0\x2d\x9e\x9b\xaf\xdf\x7f\xfb"
- "\x20\xcb\x2d\x0e\xcc\x31\x28\x81\xef\x79\x98\x31\xb7\x00\x5e\x97"
- "\xba\x00\x73\x8b\x72\x6e\x7d\x67\xea\xe2\xc2\x78\x6b\x6e\xb1\xfa"
- "\x1e\xbb\xd6\xb3\x6e\xdf\xda\x72\x84\xbf\x17\x5a\xfb\x79\x7c\x0e"
- "\xb7\xf6\x13\xda\xb6\x5e\xf3\xc9\xae\x03\xbd\x0d\xdc\x63\x1a\xf8"
- "\xc3\x8a\x7b\x3c\x5e\xfb\x89\xc7\xfa\xd4\x60\x79\xbc\x36\x35\x88"
- "\xcf\x39\xd6\x47\xd9\x73\x8e\xd4\x7d\xae\x73\x8e\xd4\x73\xf2\x38"
- "\x47\x6a\x89\x6b\x9c\x63\x4d\x1f\x61\xce\xb1\x7a\x3b\xc6\xa7\x30"
- "\xe7\x20\xdf\xd9\x8f\x15\x6b\xcf\xd1\xb1\x62\x6d\x4e\xd3\xe7\x1c"
- "\x6b\x87\x0a\x8f\x0b\x6b\x83\x09\xe7\x58\xd3\xbb\xfe\x39\xc7\x9a"
- "\xde\xc2\x9c\x63\x2d\x17\xff\xd7\xf4\xb5\xe7\x1c\x70\x8d\x20\xe7"
- "\x58\xcb\xbd\xff\x5b\xd3\x9b\xcf\x39\x48\x1b\x10\x83\x5a\x8b\x73"
- "\x8e\x75\xbb\x48\x4c\x5a\xb7\x90\xc4\x24\xe2\x53\x7b\xce\xb1\x6e"
- "\x9c\x73\xce\x41\x30\xc4\xde\xa7\x28\xe7\x58\xb7\xd1\x9e\x73\xac"
- "\xce\x15\xe6\x1c\xe9\x56\xf3\xb4\xd3\x7d\xf9\x9c\x63\xdd\x95\xe6"
- "\xc1\x39\x44\xb1\x35\x94\xcf\x39\xd2\x0e\x49\xe7\x1c\x69\xd7\xa4"
- "\x71\x0e\x8c\x39\x21\xce\x91\xde\xc7\x16\x73\x7c\xce\x91\x3e\x5a"
- "\x98\x73\xa4\x47\xf1\x39\x07\x6e\x5f\x88\x73\xa4\xa7\xf3\xda\xb7"
- "\xe3\x1c\xe9\xfb\xf8\x9c\x83\x9c\x47\x39\xc7\x7a\x2e\x86\xae\x0e"
- "\x96\xce\x39\xd6\xf7\x11\xe7\x1c\xeb\x07\xf2\x39\xc7\x7a\x2f\xc2"
- "\x2d\xd6\x47\x12\xce\xb1\x5e\x4d\x8e\xaf\x0e\xb2\x3e\x4e\x39\x07"
- "\x39\x4e\x39\xc7\xfa\x38\x09\xb9\xa9\x72\x29\x6b\x3f\xf7\xdd\xe7"
- "\xe7\xa6\x2c\x79\x29\x63\xcf\x41\xe7\xeb\x72\x53\x30\xd6\x8b\xed"
- "\xa3\x8e\x73\x53\x78\xec\xa6\xb9\xa9\x4b\x6c\xac\xa2\xb9\x29\x1d"
- "\x9b\x9b\xc2\x79\x29\xd0\xec\x75\x79\x29\xf3\x07\xf6\xeb\x3e\xf7"
- "\x99\xa5\xe7\xa5\xde\x9d\xeb\x83\xb6\xb0\xe3\x77\x59\x47\x92\x97"
- "\x2a\xad\xcb\x4b\xe1\x71\xdb\xf4\xc0\x3e\x2f\x85\xc7\x6b\x9a\x97"
- "\xfa\x41\x66\x5e\x2a\xa3\x95\xbc\xf1\x3b\xa3\x09\xac\x7f\x6b\x8e"
- "\xeb\x3e\xd7\xa7\xd0\x77\xc7\x99\x32\xd7\xbf\x65\x3a\x5c\xff\xf6"
- "\x78\x5e\xb3\x98\xed\x33\x42\xa9\xed\x3f\x51\xc8\xb3\xfd\x27\xe8"
- "\xd1\xdb\xbe\x39\xce\x99\xc8\x2c\xa0\xb6\xcf\x92\x59\xff\x2d\x2b"
- "\x41\x7e\x2e\x3c\x37\x8e\xea\xd5\xdc\x38\x6b\xbd\x9a\x3f\xdc\x5a"
- "\xaf\x6e\x1c\xe7\x58\xaf\xe6\x1c\xa3\x7a\x35\xbb\x13\xe1\x86\xd9"
- "\x0a\xc2\x0d\x37\xb3\x7b\x92\x2d\x1e\x86\x58\x9d\x6a\xc4\x9a\x75"
- "\x96\x41\xb9\xff\xa6\x56\x69\x5c\x4a\xb4\x6a\xb1\xb1\x00\x15\xea"
- "\x0d\xe8\xa3\x05\xc8\x63\xd5\x6d\xe4\xb1\xbb\xca\xa0\xf4\x8e\x41"
- "\x9e\x30\x4e\x00\x97\x2a\x00\x6e\x91\x83\x34\x89\x58\xc7\x6e\x1e"
- "\x58\xac\xd1\x5b\xe9\xd8\x8d\x47\xa9\x86\x85\xf3\x34\x06\xf4\xcf"
- "\x59\x5a\x25\xd6\xaa\xb5\x99\xb3\x74\xb5\xbd\x06\x95\xb0\x35\x8b"
- "\xac\xf3\xe5\xf0\xdb\xea\x77\xf9\xf9\xf2\x9a\xcc\x59\xe5\x0f\xf7"
- "\x0d\x3a\xcf\xd6\x43\xec\x46\xf3\xe6\xae\xe6\xcb\x37\xd7\x20\x3f"
- "\x4b\x3d\x44\x3c\x2e\x36\xbf\x7c\xf9\x27\x41\x34\x5f\xbe\xb9\x85"
- "\xbc\x7c\xf9\x66\x0f\xbe\x76\xdd\xd6\xc5\x5e\xbb\x6e\x9e\xe9\xba"
- "\x76\xdd\x2c\x73\xfd\xff\xe6\x54\xd7\xb4\xeb\xe6\x5b\xb6\xda\x75"
- "\x67\x22\xd6\xae\x1b\xc7\x63\xac\x0a\x6b\x57\xf2\x9d\xbd\xe6\xc8"
- "\x59\x43\x35\x47\xce\x3b\x4d\x5f\xbb\x66\x1b\x85\xf5\x45\x4e\x0b"
- "\xa2\x5d\x37\x57\xd6\xbf\x76\xdd\x5c\x29\xac\x5d\x73\x16\x12\x9e"
- "\xbf\xb9\xd2\xa2\x43\xa9\x76\x85\x6b\x04\xb5\x6b\xce\x3e\xdb\x6b"
- "\x88\x76\xdd\xac\x27\xda\x35\xe7\xac\xb8\x76\xdd\xc2\xd5\x4b\xdb"
- "\xd2\x8f\xc4\x27\xe2\x53\x7b\xed\xba\xa5\xb5\x73\xed\x4a\x30\xc4"
- "\xde\xa7\xa8\x76\xdd\x32\xc1\x5e\xbb\x6e\x0c\x15\xd6\xae\xb9\xbd"
- "\x28\x8e\xb6\x16\xf2\xb5\xeb\x96\x9c\xe6\xa1\x5d\xc5\xb0\x95\x6d"
- "\xe4\x6b\xd7\xad\xb3\xa5\x6b\xd7\xad\xdb\xa4\x69\x57\x8c\x39\x21"
- "\xed\xba\xf5\x16\x87\x1f\xbd\xb0\x76\xcd\x6d\x25\xac\x5d\x73\xbb"
- "\xf0\xb5\x2b\x6e\x5f\x48\xbb\xe6\x8e\xe6\xb5\x6f\xa7\x5d\x73\x67"
- "\xf2\xb5\x2b\x39\x8f\x6a\xd7\x6d\x5e\x24\x86\x66\x3d\x94\xae\x5d"
- "\x73\x6f\x89\x6b\xd7\xdc\x7b\x7c\xed\x9a\x9b\x4f\x34\xea\x36\x35"
- "\xd1\xae\xb9\x65\xe4\x78\x96\xc1\xfa\x38\xd5\xae\xe4\x38\xd5\xae"
- "\xdb\x7a\x4b\xd0\xae\x15\xf5\xa4\x5d\x4b\x9b\x97\x76\xbd\x54\xd6"
- "\xb8\xda\xf5\xd3\x33\xf2\xb4\xeb\xa7\xa7\x5d\xe4\xf0\xe5\x4e\x38"
- "\xfc\xf9\xff\x5b\x1c\x7e\xdb\x70\xca\xe1\xb7\x0f\x93\xc7\x59\xb6"
- "\x0f\x7d\xd4\xb6\x6f\x7e\x76\xff\xcc\x8b\xda\x7d\xc7\x51\x79\x76"
- "\xdf\x91\xf7\x58\xb7\xca\xb1\xfd\x76\xab\x7c\xcd\x17\x32\xe7\x3f"
- "\x7f\xd1\x57\xbe\x6e\x3d\x10\x4a\x75\xeb\x81\x50\x6b\xdd\xfa\x15"
- "\xef\x3d\xeb\xce\x56\x8e\x75\xeb\xde\x2c\xaa\x5b\x77\x3f\x24\xbc"
- "\x70\x37\x37\xdf\x76\x37\xcb\xb7\x12\x8e\x10\xdd\x7a\x1f\xeb\xd6"
- "\xeb\xa0\x5b\x67\x84\x2b\x8d\x5c\x0d\x7e\x3c\x2f\xab\x10\xb4\x27"
- "\xd6\xaa\xc5\xf1\xf0\xff\x38\x3d\xfa\x28\x16\x79\xac\x06\xcd\xb9"
- "\x0b\xc6\xaf\x5d\x0b\xf4\xca\x94\x59\x10\xfb\x4b\xf7\x21\xef\x68"
- "\xd0\xb3\x55\x58\xcf\x9e\x06\xad\xba\x82\xd3\xb3\xbb\xfd\x8b\xe3"
- "\xac\xf5\xec\xce\x55\xac\x9e\xd5\x93\x39\x5f\xc5\x71\xa0\x67\xe1"
- "\xf7\x70\x4d\x7f\x6b\x3d\xfb\x10\xf4\x6a\x0d\xe8\xd5\xb4\x9b\x36"
- "\xda\x76\x86\xbd\xb6\x7d\xe8\x3f\xab\xc2\xd0\x6b\x50\x29\xd6\xb6"
- "\xf7\x77\xfc\x5f\xd4\xb6\x9f\x23\xaa\x6d\x77\x5d\x91\xa7\x6d\x77"
- "\xe9\xf8\xda\xf6\x80\xc9\x5e\xdb\xee\x1e\xe1\xba\xb6\xdd\x3d\x53"
- "\x5e\x9f\xd9\x1d\xed\x9a\xb6\xdd\x7d\xd6\x56\xdb\x7e\xce\xbe\x97"
- "\xdd\xe9\x85\xf1\x2c\xac\x6d\xc9\x77\xf6\x9a\x64\xef\x4c\xaa\x49"
- "\xf6\xf6\x6b\xfa\xda\x76\x4f\xa9\xb0\xfe\xd8\x73\x85\x68\xdb\xdd"
- "\xf9\xf5\xaf\x6d\x77\xe7\x0b\x6b\xdb\xbd\xdc\xfc\xff\xdd\xf9\xf6"
- "\xda\x16\xae\x11\xd4\xb6\x7b\x57\xd9\x5e\x43\xb4\xed\xee\x02\xa2"
- "\x6d\xf7\xee\x10\xd7\xb6\xfb\x86\x91\x18\xb6\xcf\x97\xc4\x30\xe2"
- "\x53\x7b\x6d\xbb\xf7\x86\x73\x6d\x4b\x30\xc4\xde\xa7\xa8\xb6\xdd"
- "\xd7\xc7\x5e\xdb\xee\xf4\x14\xd6\xb6\x07\x5a\x51\x1c\xed\xdf\xc5"
- "\xd7\xb6\xfb\x16\x36\x0f\x6d\x2b\x8a\xad\x52\xbe\xb6\xdd\x1f\x2c"
- "\x5d\xdb\xee\x5f\x2c\x4d\xdb\x62\xcc\x09\x69\xdb\xfd\x67\x39\xfc"
- "\x14\x08\x6b\xdb\xfd\xd7\x84\xb5\xed\x7e\x13\x5f\xdb\xe2\xf6\x85"
- "\xb4\xed\x81\xee\xbc\xf6\xed\xb4\xed\x81\x11\x7c\x6d\x4b\xce\xa3"
- "\xda\xf6\x40\x05\x89\xa1\x5f\x1c\x92\xae\x6d\x0f\x9c\x15\xd7\xb6"
- "\x07\xce\xf1\xb5\xed\x81\xed\x44\xc3\x1e\x30\x12\x6d\x7b\x20\x8f"
- "\x1c\xff\xe2\xa0\xf5\x71\xaa\x6d\xc9\x71\xaa\x6d\x0f\x7a\x49\x7b"
- "\x2f\xeb\x56\xdd\xa3\xf3\x8d\xbf\x66\xa0\xbe\xea\x1e\x59\xde\xcd"
- "\x36\xd6\x9a\x81\x43\x3b\xe4\xe9\xdb\x43\x0e\xeb\xbf\x3c\xd6\x58"
- "\x42\x3c\xff\xa0\x9a\xf2\xfc\x2f\x3b\xc9\xe3\x2c\x5f\x76\x7c\xac"
- "\xb1\xe4\xd8\xfe\x50\x25\xb5\xfd\xe1\x8d\xf2\x6c\x7f\x38\x4b\xbe"
- "\xc6\x3a\x96\x46\x35\xd6\xb1\x34\xf1\x77\x83\x47\x66\x3b\xd6\x58"
- "\x47\x4b\xa9\xc6\xca\x1b\x48\xf8\x49\x5e\x27\xc2\x4f\xfe\x76\xa9"
- "\xfe\xde\x0d\xfe\x6d\x02\xff\xdd\xe0\x91\x0b\x8f\xdf\x0d\xd6\x87"
- "\x7e\xfa\x32\x92\xea\xa7\xbf\x75\x91\xa7\x9f\xfe\xa6\xe6\xeb\xa7"
- "\xe3\x43\xec\xf5\xd3\xdf\x56\xb8\xae\x9f\xfe\xb6\x4b\x5e\x7f\xf8"
- "\xdb\x4e\xd7\xf4\x53\x5e\x2b\xe1\x77\x83\x47\x34\xe2\xef\x06\xc9"
- "\x77\xf6\xbc\xf7\xe8\x2e\xca\x7b\x8f\xce\x6f\xfa\xfa\xe9\x68\x80"
- "\x30\xc7\x3d\xda\x85\xe8\xa7\x3c\xcf\xfa\xd7\x4f\x79\x9e\xc2\xfa"
- "\xe9\x28\xb7\xfe\x35\xcf\xd3\x5e\x3f\xc1\x35\x82\xfa\xe9\xe8\x59"
- "\xdb\x6b\x88\x7e\xca\xf3\x22\xfa\xe9\xe8\x35\x71\xfd\xf4\xf7\x25"
- "\x24\x3e\xfd\x7d\x1c\x89\x4f\xc4\xa7\xf6\xfa\xe9\xef\xdd\x9d\xeb"
- "\x27\x82\x21\xf6\x3e\x45\xf5\xd3\xdf\xe7\xda\xeb\xa7\x23\x31\xc2"
- "\xfa\xe9\x58\x30\xc5\xd1\x3f\x6e\xf0\xf5\xd3\xdf\x8f\x36\x0f\xfd"
- "\x24\x8a\xad\x00\xbe\x7e\xfa\xc7\x2a\xe9\xfa\xe9\x1f\xc7\xa5\xe9"
- "\x27\x8c\x39\x21\xfd\x74\xac\x15\x87\x1f\x2f\x61\xfd\x74\xac\x9b"
- "\xb0\x7e\x3a\x36\x84\xaf\x9f\x70\xfb\x42\xfa\xe9\xd8\x4c\x5e\xfb"
- "\x76\xfa\xe9\xd8\x0a\xbe\x7e\x22\xe7\x51\xfd\x74\x3c\x90\x1b\xdf"
- "\xfc\xa5\xeb\xa7\xe3\xad\xc4\xf5\xd3\x71\x5f\xbe\x7e\x3a\x56\x4e"
- "\x74\xd2\xf1\xc1\x44\x3f\x1d\x33\x90\xe3\x47\xfc\xac\x8f\x53\xfd"
- "\x44\x8e\x53\xfd\x74\x7c\x94\x34\xfd\xe4\x7a\x5d\xa4\x47\x3f\xaf"
- "\x55\xdd\x4c\xe7\xb5\x9e\xb8\x22\x4f\x3b\x9d\xd0\x3d\xe6\xf0\x72"
- "\x38\xfc\xf1\x70\xca\xe1\xb5\x32\xd7\xff\x6a\x27\xcb\xe7\xf0\xf9"
- "\xe3\x29\x87\xcf\x1f\x2f\xce\xe1\x4f\xf6\x71\xcc\xe1\xcf\x64\x53"
- "\x0e\x7f\xca\x44\xc6\xc8\x53\x57\xc8\x18\x79\x6a\x5b\xfd\x71\xf8"
- "\x53\xed\xf9\x1c\xfe\xe4\xc6\xc7\x1c\xbe\x3e\x38\xfc\x3f\xad\xf6"
- "\x3b\xfe\xd7\x35\x79\x1c\xfe\x5f\xe5\x7c\x0e\x7f\x56\x61\xcf\xe1"
- "\x4f\x05\xbb\xce\xe1\x4f\xcd\x96\xd7\x1f\x4e\xc5\xb8\xc6\xe1\x4f"
- "\x15\x0a\x73\xf8\x93\x7d\xc5\x39\x3c\xf9\xce\x9e\x7b\x9d\x99\x4d"
- "\xb9\xd7\x99\x81\x4d\x9f\xc3\x9f\x2e\x13\xe6\x59\xa7\xaf\x11\x0e"
- "\x7f\xaa\xa0\xfe\x39\xfc\xa9\x02\x61\x0e\x7f\xe6\x1d\xc2\x77\x4e"
- "\x15\xd8\x73\x78\xb8\x46\x90\xc3\x9f\x59\x63\x7b\x0d\xe1\xf0\xa7"
- "\x4a\x08\x87\x3f\xb3\x4b\x9c\xc3\x7f\x35\x82\xc4\xa7\xaf\xfc\x49"
- "\x7c\x22\x3e\xb5\xe7\xf0\x67\x6e\x39\xe7\xf0\x04\x43\xec\x7d\x8a"
- "\x72\xf8\xaf\xfa\xd9\x73\xf8\x93\xbd\x85\x39\x7c\x7e\x6b\x8a\xa3"
- "\x7f\xef\xe3\x73\xf8\xaf\x16\x37\x0f\x0e\x2f\x8a\xad\x32\x3e\x87"
- "\xff\xf7\x68\xe9\x1c\xfe\xdf\x4b\xa4\x71\x78\x8c\x39\x21\x0e\xff"
- "\xef\x42\x0e\x3f\x25\xc2\x1c\xfe\xdf\x37\x84\x39\x7c\xbe\x82\xcf"
- "\xe1\x71\xfb\x42\x1c\x3e\xbf\x17\xaf\x7d\x3b\x0e\x9f\x1f\xcc\xe7"
- "\xf0\xe4\x3c\xca\xe1\xf3\x2b\x49\x0c\xd5\x5e\x94\xce\xe1\xf3\x0b"
- "\xc5\x39\x7c\xfe\x05\x3e\x87\xcf\xdf\x49\xb8\xfa\x59\x44\x38\x7c"
- "\xfe\x31\x72\x5c\x5b\x6a\x7d\x9c\x72\x78\x72\x9c\x72\xf8\xb3\x3e"
- "\x8f\xeb\x26\x35\xc5\xba\x49\x5f\xef\x92\xc7\xe3\xbf\xde\x29\x9f"
- "\x4b\x7e\x9b\x40\xb9\xe4\xb7\x09\xd6\x5c\x92\x5f\xdb\xe0\x9b\xc5"
- "\x8e\xb9\x64\xf1\x69\xca\x25\x8b\xba\x91\x58\x5d\xd4\x8a\xc4\xea"
- "\x42\xf6\xfd\x9e\xb4\xba\x49\x85\xc3\xf8\x75\x93\xbe\x29\x7c\x5c"
- "\x37\x49\x2e\x4f\x3c\xdb\x95\xf2\xc4\xc2\xd6\xf2\x78\x62\xa1\x17"
- "\x9f\x27\xfe\xa7\xbb\x3d\x4f\x2c\x9c\xeb\x3a\x4f\x2c\xcc\x94\xc7"
- "\x13\x0b\x33\x5c\xe3\x89\x85\xf7\x84\x6b\x18\x7c\x93\x2c\x5e\x37"
- "\x89\x7c\x67\x3f\xbe\x17\x67\xd2\xf1\xbd\x38\xa2\xe9\xf3\xc4\x62"
- "\x0f\xe1\xb1\xbc\xb8\x35\xe1\x89\x85\xd5\xf5\xcf\x13\x0b\xab\x85"
- "\x79\x62\xf1\x12\x32\xa6\x16\x1a\xec\x6b\x18\xc0\x35\x82\x3c\xb1"
- "\xf8\x08\x77\x4d\x35\x9f\x27\x92\x36\x20\xd6\x9c\x13\xe7\x89\x25"
- "\xb3\x49\xec\x29\x19\x42\x62\x0f\xf1\xa9\x3d\x4f\x2c\xf1\x77\xce"
- "\x13\x09\x86\xd8\xfb\x14\xe5\x89\x25\x53\xec\x79\xe2\x37\x09\xc2"
- "\x3c\xf1\x5b\xab\x3a\xad\xe7\x2e\xf0\x79\x62\xc9\x8e\xe6\xc1\x13"
- "\x45\xb1\xe5\xc1\xe7\x89\xe7\xe6\x4b\xe7\x89\xe7\x76\x49\xe3\x89"
- "\x18\x73\x42\x3c\xf1\xdc\x3d\x5b\xcc\xf1\x79\xe2\xb7\xbe\xc2\x3c"
- "\xf1\xdb\xee\x7c\x9e\x88\xdb\x17\xe2\x89\xdf\x4e\xe0\xb5\x6f\xc7"
- "\x13\xbf\x9d\xcb\xe7\x89\xe4\x3c\xca\x13\xff\xe3\xc7\x8d\x69\xdd"
- "\xa4\xf3\xc4\x6f\xef\x89\xf3\xc4\x6f\x4d\x7c\x9e\xf8\x6d\x09\xe1"
- "\x83\xff\x09\x24\x3c\xf1\xdb\x72\x72\xfc\x9b\xae\xd6\xc7\x29\x4f"
- "\x24\xc7\x29\x4f\xfc\xcf\x00\x69\xeb\x40\xea\x25\xd7\xdb\x48\xeb"
- "\x40\xea\x2b\xd7\xdb\xd8\xeb\x40\xce\xcb\xac\x7f\x7f\xde\xd5\xfa"
- "\xf7\x8f\xe7\xc9\xd4\xe5\x79\xff\x33\x8a\xe6\x79\xbf\x1b\x21\x8f"
- "\xaf\x7c\x37\x5c\x3e\x37\xff\xc9\x6a\xff\xde\x9f\x78\xfb\xf7\xf2"
- "\xe7\xc3\x7f\xdf\xde\x31\x37\xff\xd1\x6a\xff\xde\x1f\xb8\xfd\x7b"
- "\x2f\x72\xfb\xf7\x5e\xdc\x21\x67\x3e\xfc\xea\x2a\xe4\xf1\x91\xed"
- "\x7c\xf8\xf3\xc7\xc9\x7c\xf8\x58\xdb\xf9\xf0\x17\x3b\xf1\xe7\xc3"
- "\x7f\xbf\x51\x6c\x3e\x3c\xce\xfb\xd6\xee\x1b\x74\x1e\xcf\x85\x17"
- "\x9c\x07\x3f\xb1\x7e\xe7\xc1\x63\x6c\x6e\x5e\x44\xb8\xfd\xa6\x66"
- "\xc9\xed\x2f\x58\xd5\xce\x2f\x95\xb9\xff\x6f\xa9\xcd\xfe\xbf\x97"
- "\x05\xf6\xff\xbd\x28\x61\xff\xdf\x8b\x32\xf7\xff\xbd\xe8\xe2\xfe"
- "\xbf\x17\xed\xf6\xff\x25\xf3\xe0\xbf\xef\x28\x3e\x0f\x9e\x7c\x67"
- "\xcf\xc9\x7e\xb4\xaa\x2b\xf5\x63\x33\xd8\xff\xf7\x07\x91\x3d\x5a"
- "\x7f\xe0\xf6\xff\xbd\xd8\x00\xfb\xff\x5e\x14\xd9\xff\xf7\x47\x6e"
- "\xff\xdf\x8b\x75\x7b\xf9\x52\x6e\x7f\x51\x64\xff\xdf\x1f\xd3\x6d"
- "\xaf\x21\xdc\xfe\x22\xb7\xff\xef\x8f\x0e\xf6\xff\x2d\xe3\xf6\xff"
- "\x2d\xe3\xf6\xff\x25\x3e\xb5\xe7\xf6\x3f\xba\xb0\xff\xef\x45\x6e"
- "\xff\xdf\x8b\x0e\xf6\xff\x2d\x13\xd8\xff\xf7\xfb\x00\x61\x6e\xff"
- "\x93\xd5\xfe\xbf\x97\x6c\xf6\xff\x2d\x6b\x26\xfb\xff\x8a\x62\xcb"
- "\x66\xff\xdf\x4b\x32\xf6\xff\xbd\x24\x71\xff\xdf\x8b\x22\xfb\xff"
- "\x5e\xe2\xf6\xff\xbd\x28\xb2\xff\xef\x25\x91\xfd\x7f\x7f\xb2\xd9"
- "\xff\xf7\xa2\xc8\xfe\xbf\x3f\xf5\xe1\xb5\x6f\xc7\xed\x7f\xb2\xd9"
- "\xff\xf7\xa2\xcd\xfe\xbf\x3f\x71\xfb\xff\x7e\x77\x52\x3a\xb7\xff"
- "\xc9\xc1\xfe\xbf\x3f\xd9\xec\xff\xfb\x13\xb7\xff\xef\x65\x6e\xff"
- "\xdf\x9f\xb8\xfd\x7f\xbf\xd3\x5a\x1f\xa7\xdc\x9e\x1c\xa7\xdc\xfe"
- "\xb2\x94\xfd\x7f\xcb\xa5\xe4\x80\x1f\xfd\x3c\x0e\x9f\x66\x3a\x8f"
- "\x43\x27\x33\xff\xab\x73\x23\xff\x5b\x91\x45\x39\x66\x45\x96\xf8"
- "\x5c\x82\x2b\x4e\xf2\xbf\xd7\x74\x94\x63\x96\x73\xeb\x95\xca\xbb"
- "\x91\x38\xfd\xf3\x35\x57\xe7\x12\xac\xbe\xcf\xf1\x4a\xcb\x5c\x82"
- "\x05\xdc\x5c\x02\xe0\x96\x84\x4b\xfe\x3c\x85\x3f\x97\xe0\xca\x35"
- "\xb1\xb9\x04\x82\x73\x08\x6c\xf8\xa3\x85\x6b\xca\x9d\x43\xd0\xfc"
- "\xf9\xe3\x65\xab\x39\x04\x3f\x77\x97\xc7\x1f\x7f\x0e\xe4\xf3\xc7"
- "\x1b\x23\xec\xf9\xe3\xcf\x6b\x5c\xe7\x8f\x3f\x1f\x92\xc7\x1f\x7f"
- "\x3e\xe8\x1a\x7f\x2c\xf7\x15\x9e\x43\x70\x25\x59\x7c\x0e\x01\xf9"
- "\xce\x7e\xdc\xbf\x76\x88\x8e\xfb\xd7\x16\x37\x7d\xfe\x78\x4d\x2d"
- "\x3c\xc6\x5f\xeb\x4e\xf8\x63\xb9\x4f\xfd\xf3\xc7\x72\x1f\x61\xfe"
- "\x78\x2d\x87\x8c\xb5\xe5\x3e\xf6\xfc\x11\xae\x11\xe4\x8f\xd7\xce"
- "\xd9\x5e\x43\xf8\x63\xb9\x1f\xe1\x8f\xd7\x6e\x89\xf3\xc7\xeb\xab"
- "\x48\x5c\xba\xfe\x0e\x89\x4b\xc4\xa7\xf6\xfc\xf1\x7a\x1f\xe7\xfc"
- "\x91\x60\x88\xbd\x4f\x51\xfe\x78\x7d\xa1\x3d\x7f\xbc\x22\x92\x1b"
- "\xae\x18\x47\x71\xf4\xdf\x3b\x7c\xfe\x78\xfd\x64\xf3\xe0\x8f\xa2"
- "\xd8\x52\xf3\xf9\xe3\x7f\xd3\xa5\xf3\xc7\xff\x9e\x91\xc6\x1f\x31"
- "\xe6\x84\xf8\x63\x85\x2f\x87\x1f\x3f\x61\xfe\x58\xd1\x4b\x98\x3f"
- "\x56\x8c\xe0\xf3\x47\xdc\xbe\x10\x7f\xac\x98\xcb\x6b\xdf\x8e\x3f"
- "\x56\xac\xe1\xf3\x47\x72\x1e\xe5\x8f\x37\x7a\x73\xe3\x9a\x8c\xdc"
- "\xf0\x0d\x5f\x71\xfe\x78\xa3\x3d\x9f\x3f\x56\x70\xb5\xf3\x6f\x0c"
- "\x27\xfc\xf1\x06\x22\xc7\xaf\x74\xb5\x3e\x4e\xf9\xe3\x15\x9b\xdc"
- "\xf0\x8d\xf1\x8e\xf8\x23\x93\xe1\x9d\x9f\xa6\x34\x1f\x84\x4f\x1e"
- "\xdc\x67\x7b\x18\xc7\xb4\xf0\xff\x7c\x18\x8f\x7c\xe1\xff\x25\x62"
- "\x7c\x45\xef\xef\x9d\x6f\x06\xee\x61\x86\xdf\x29\xd6\xff\xaa\xd5"
- "\x76\x30\xe2\x7b\xe7\xf6\x6c\xf1\xce\xf7\x36\x3e\x11\x64\x66\xa2"
- "\x11\xe3\x07\xff\x8f\x87\x63\x70\x7e\x1b\x18\xf7\xd4\x0b\x50\x9b"
- "\xdb\xca\x1b\xd5\x96\xf3\xe0\x9e\xdb\x5c\x55\xde\x38\x84\xdb\x78"
- "\xb0\xfa\x26\xd8\xf9\x46\xb8\xe8\xbd\x42\x5b\x63\x77\x75\x46\x8b"
- "\x8d\xcc\x7f\xb5\x73\xaa\x50\xb9\xf2\x66\xb0\x77\xe5\x13\x41\x10"
- "\x87\x10\xe6\x7b\x07\x3b\xe8\x3d\x70\x9b\xda\x39\x35\xf8\xbb\x9e"
- "\xf8\x3b\x13\xdc\x63\xe2\x6c\xa4\x5c\x5b\xf5\x84\x27\xf0\xaa\x16"
- "\x49\xd5\x4c\xc5\xfb\x46\xb8\xe7\x78\x23\xfa\x67\xe7\x52\x8f\x03"
- "\x9b\x4a\xd9\xb1\xa7\xa8\xda\xc4\xb6\xa1\x9e\x83\xef\xe7\xe6\xe8"
- "\x2d\x70\xbe\xd0\x3d\xac\xd8\x8f\x7a\xb6\xe8\xce\xe8\xa4\x8d\x77"
- "\x37\x73\xc5\xec\xe8\xbd\xa4\x33\xd2\xf6\x00\xdb\xa9\x91\x52\xe8"
- "\x7b\x69\xbf\xf3\x8b\xa3\xfa\xb7\x9e\x1f\xb7\x63\xaa\x93\x36\x22"
- "\xe5\x3a\xf3\x13\x9e\xa7\x20\x26\x6e\xdd\xc0\xe8\x1f\xac\xfe\x25"
- "\x4e\xa7\xb8\x9c\x81\x6d\xbe\x0c\xbe\x5f\xd7\x8e\xd1\xdf\x5d\x8a"
- "\x71\xf3\x4b\xea\x49\x18\xdb\x6d\x7d\x11\x1b\x39\x3b\x42\x1d\x37"
- "\x73\x76\xd4\xfb\xf3\xe3\xd4\xdd\x22\x9f\x44\xe3\xdf\x7f\x5f\x3d"
- "\x3b\x62\xce\x42\xb5\xf5\x37\x83\xd4\x91\x33\xe7\x45\x4c\x8b\x89"
- "\xea\x35\x7b\xba\xe6\x49\xb8\x27\x64\x75\x1f\x7e\xf8\x5e\xcc\xab"
- "\x7f\xc9\xda\xb2\x1e\xa1\x8f\xdb\x22\x0f\x7c\x5f\xf0\x7b\x46\x9d"
- "\x47\x2f\x2f\xfc\x7b\x6b\x37\x30\xd5\x4a\x38\x27\x09\x62\xda\xba"
- "\xc4\x27\xf0\xb9\x9e\x5b\xe1\xbe\xb6\xc0\x7d\xc3\x3d\xc2\x3d\x57"
- "\x06\x5a\xee\xd9\x82\x89\x24\x8c\x89\xc4\x2a\xc0\x60\x65\xb0\xb7"
- "\xe1\x89\x91\x0c\x13\x86\x9f\xaf\x1a\xfa\x8a\x02\x8e\x5d\x61\x35"
- "\x40\xa6\x77\x3e\x5c\x1b\x69\xc1\x98\x39\x23\x2c\x9c\xd9\xe0\x9d"
- "\x06\xdc\x51\xf1\x80\x89\xfe\x03\x60\x13\x5f\x7f\xe8\x25\x84\x92"
- "\x99\x07\x61\xec\xfe\x03\xcc\x03\xc0\x30\xc1\x29\x7c\x77\x6b\xf9"
- "\x5d\x25\x7a\x15\xda\xd8\xa9\x43\xe9\x09\xb8\x0d\x1d\x1c\xc3\x36"
- "\x37\xe7\xce\xd7\x4d\x08\x44\xc9\xcf\x27\xa3\xe4\x07\xf8\x9a\xed"
- "\xfd\xf3\xbc\xe3\x90\x62\x6c\x3c\x73\x19\xe2\x8e\x82\xe9\x32\x5f"
- "\xc7\xec\xe8\x9f\xa7\x53\x56\xa6\x9a\x33\xc3\xc2\xe1\x79\x2a\xa1"
- "\x1d\xbd\x4e\xd1\x7e\x3b\x6e\x67\xdd\x06\xd6\xf6\x95\xf8\xd9\xc1"
- "\x3e\xa0\x65\x18\x2d\xb3\x94\xeb\x43\x69\xbd\x83\xcc\x69\x4b\x92"
- "\x8b\x3d\xee\xa3\xb1\x46\xa6\x96\x49\xef\x1d\x54\x54\x5d\x0d\x31"
- "\x4d\x33\x9d\x79\xf2\x97\x5d\xde\xc6\x99\x51\x5b\xdb\x42\x5f\x4c"
- "\x5f\x92\xcc\xa4\x87\x0c\x98\xd0\x1d\xf9\x3c\x58\x7d\x6b\x94\xc5"
- "\x9e\x60\x4b\x0f\x69\x38\xba\xc5\xd6\x74\xc1\x78\x80\xfb\xe1\xf0"
- "\x70\x2b\xfb\x64\x9c\x3d\x1e\xea\xfa\xe6\x86\x91\x25\x46\x26\x6c"
- "\x64\x6d\x46\x10\xf4\xd3\x91\xd5\x89\xd7\x50\x4b\x6c\xdb\x22\xe0"
- "\xfb\x6b\x17\xa0\x80\x35\xef\x22\xf5\xd4\x85\x3e\x48\x9f\x39\x52"
- "\xef\xbd\x24\x59\x01\x36\x51\x42\x7c\xe9\x0d\x31\xb3\x77\x6d\xbb"
- "\xb0\xf0\x84\x28\xa4\xdc\x77\xf5\xa0\x12\xf3\x64\x3c\x2f\xe4\xba"
- "\xf2\xf6\x94\x2d\x70\x1d\xf3\x6b\x18\xc2\xfe\x60\x7d\xf1\x6b\x34"
- "\x1a\x3d\x13\xc6\xe7\x59\xec\xf7\xe9\x39\xd0\xa6\xb4\xe7\xba\xcd"
- "\xf2\x5f\x13\xf8\xea\x25\xf0\x53\x71\xb9\x89\x6d\x93\xf5\x55\x0c"
- "\xf5\xd5\x71\xb8\x0f\xea\xaf\xdb\x01\xd8\xaf\xc2\xcf\x1c\x14\xca"
- "\x3d\x73\x0a\xe3\x17\x14\x27\xfe\xcc\x41\x1a\xf2\xcc\x2d\xaa\x1c"
- "\x3f\xf3\xaf\xe3\x1c\x3f\xf3\xaf\x2b\xa4\x3f\xf3\xaf\x1d\xa5\x3f"
- "\xf3\xaf\x5e\x0e\x9e\x99\xf3\x73\x30\xf8\x39\xc8\x81\x9f\x83\x38"
- "\x3f\x3f\x75\xd5\xf1\x33\xeb\x47\x38\x7e\x66\xfd\x42\xe9\xcf\xac"
- "\xf7\x91\xfe\xcc\x7a\x24\xfe\xcc\xc1\x9c\x9f\x83\xc1\xcf\xc1\x0e"
- "\xfc\x1c\xcc\xf9\xd9\xf7\x5b\xc7\xcf\x7c\x67\xa0\xe3\x67\xbe\x33"
- "\x5b\xfa\x33\xdf\xf1\x90\xf1\xcc\xd5\x0e\x9e\x99\xf3\x73\x08\xf8"
- "\x39\xd8\x81\x9f\x83\x39\x3f\xbf\xb2\xda\xf1\x33\x57\xf5\x72\xfc"
- "\xcc\x55\x11\x32\x9e\xd9\x20\xfd\x99\xef\x54\x88\x3f\x73\x08\xe7"
- "\xe7\x10\xf0\x73\x88\x03\x3f\x87\x70\x7e\x9e\xf4\x9a\xe3\x67\xbe"
- "\xdb\xc5\xf1\x33\xdf\x9d\x20\xfd\x99\xab\x2a\xa5\x3f\x73\x55\x99"
- "\xd8\x33\xd7\x40\xdc\xf6\x82\x67\xa9\xfd\x3e\x6c\xa4\xc9\x6f\xa4"
- "\xd1\xab\x1c\x29\xb3\x97\x9a\xa3\xbd\x2b\x50\x2b\x78\xb6\x68\x66"
- "\xc3\xa4\xde\xf8\x5f\xb3\xdf\x48\x43\x8d\x5f\x90\xe7\xc3\x76\xde"
- "\x69\x1f\x4e\x41\x2d\x31\x1f\x5f\x65\x46\x01\xe6\x8c\x91\xd5\xa9"
- "\x6f\x22\x75\x92\x1e\xf9\x14\x25\xea\x50\xa2\x86\xd1\x17\xa1\x2b"
- "\xa8\x75\x05\xd6\x9e\x3f\xa0\x82\xca\x7c\x34\x27\x96\x61\xae\x2b"
- "\xab\xb7\xe1\x77\xc0\xc0\x93\x93\xd3\xbe\x43\x6a\xf8\x8d\xde\x5b"
- "\xe0\x83\xdb\xf1\x1e\x05\xe3\xe7\x86\x49\x2f\x6f\x4d\x44\x01\x27"
- "\x66\x55\x20\x7c\x3c\x07\x3e\xa6\x0d\x61\xe1\x89\x53\x90\x72\x7f"
- "\x55\xa9\x92\x8c\xcd\xd5\xb3\x6d\xc7\xe6\x51\x11\x60\xcb\x69\xec"
- "\x77\x47\xb3\xdf\x94\x6a\xcb\xea\x01\x96\xb1\x9b\xb5\x65\x99\x89"
- "\x8c\xf7\x36\x63\xf7\x09\xf8\x7d\x6a\xcb\xea\x40\x6c\x4b\x26\x23"
- "\xc8\xa7\xb8\xa2\x06\xeb\x26\x9f\xeb\xf1\x48\xa9\x53\xde\x2d\x2d"
- "\xd2\x54\x21\x61\x1b\x07\x85\x52\x1b\x07\x25\x78\x95\xb7\xa8\x12"
- "\xb6\x71\x50\x3c\xd8\x38\xc5\xde\xc6\x41\x71\xae\xd9\xf8\x7e\x0b"
- "\xf7\x6d\x7c\xef\x9c\xb8\x8d\xef\x77\x92\x6e\xe3\x7b\xd9\xd2\x6d"
- "\x7c\x2f\x95\xb3\x71\x1a\xdf\xc6\xf7\x06\x3b\xb0\xb1\x15\x8e\x83"
- "\x00\xc7\x4f\x5d\x15\xb1\x31\xe0\x38\x58\x00\xc7\x41\x2e\xe2\xf8"
- "\xc1\x4c\xf7\x6d\xfc\xa0\x9f\xb8\x8d\x1f\x2c\x91\x6e\xe3\x07\x48"
- "\xba\x8d\xef\xeb\x89\x8d\x83\x6d\x70\x7c\x3f\x57\xdc\xc6\xc1\x56"
- "\x38\x0e\x06\x1c\xfb\x7e\x2b\x6c\xe3\x60\xc0\x71\xb0\x00\x8e\x83"
- "\x5d\xc4\xb1\xa1\xd0\x7d\x1b\x1b\x36\x8a\xdb\xd8\x70\x4d\xba\x8d"
- "\x0d\x91\xd2\x6d\x6c\x18\xcf\xd9\xd8\x06\xc7\x06\x0f\x07\x36\xb6"
- "\xc2\x71\x30\xe0\xf8\x95\xd5\x22\x36\x06\x1c\x87\x08\xe0\x38\xd8"
- "\x45\x1c\xd7\xf4\x71\xdf\xc6\x0f\x4d\xe2\x36\xae\x09\x96\x6e\xe3"
- "\x87\xf9\xd2\x6d\xfc\x30\x8f\xd8\x38\xc4\x06\xc7\x0f\xa3\xc5\x6d"
- "\x1c\x62\x85\xe3\x10\xc0\xf1\xa4\xd7\x84\x6d\x1c\x02\x38\x0e\x11"
- "\xc0\x71\x88\x8b\x38\xae\xcd\x74\xdf\xc6\xb5\x11\xe2\x36\xae\xdd"
- "\x27\xdd\xc6\xb5\x3d\xa5\xdb\xb8\xb6\x23\x67\x63\x1b\x1c\xd7\x14"
- "\x88\xd9\xb8\x16\x34\x60\x6b\xb0\x71\xeb\x4a\xa4\xcc\xc1\xb6\x2d"
- "\x25\xb6\x35\xb5\x9b\xd4\x3b\x47\x69\x8e\xc6\x36\x61\x73\x40\xbf"
- "\x04\xb4\x31\x65\x8c\x34\x32\x4a\x78\xa6\x44\x9c\x77\x35\xfa\x1b"
- "\x97\xa2\x36\xea\x44\x9c\xff\x35\xb1\xf3\x03\xd4\x89\x2b\x2f\xc1"
- "\xef\xa9\x70\xde\xcb\x98\xd9\x46\x63\xf2\x1f\x35\x14\xbe\x1b\xcd"
- "\x74\x1b\x58\x02\xda\xcb\x87\xf9\x73\x80\x5f\x71\xe5\x41\xb0\xcf"
- "\xd7\xa8\xa8\xf4\xef\xc8\xdc\x6e\xd2\xcb\x2f\x19\x51\x20\xf3\x4b"
- "\xa0\x5f\x41\x9c\x0e\x99\xa6\x07\x78\x15\xc7\xe7\xa3\xe2\xf8\xbf"
- "\xa2\xb1\x15\xcc\x7d\xe6\xe7\x40\xaf\x5a\xff\x88\x78\x93\xff\x24"
- "\x1f\x53\xe6\x2c\x83\xd1\x3f\x22\x7a\xdf\x02\x9d\xd2\xcb\x80\x02"
- "\x63\xca\x19\x66\xed\x34\xe4\xb1\xf6\x2a\xf2\x5c\x37\x0d\x79\xad"
- "\xbb\x8a\x7c\x0a\xca\x4b\x51\xe1\xcd\x7c\x54\x58\x75\x11\x15\xde"
- "\x87\x4f\x0d\x7c\xcc\xf0\x49\xbe\x08\xbe\x46\x68\xf4\x2d\x84\xf7"
- "\x6e\xd4\xbf\x50\x86\xfc\x0a\x8c\xa5\x08\xaf\x7f\xbd\xad\x34\xde"
- "\xf0\x0a\x47\x7e\xcc\xcf\x01\x88\x99\x1e\xa0\x84\xef\x3c\xf0\xf1"
- "\x62\xa3\x1e\x15\x94\x1b\xf0\xf7\xf9\xf0\xbd\x47\x52\x39\xb4\x6f"
- "\xce\xc7\x7b\x33\xea\x0b\x92\xcf\x22\x63\xfa\x89\x70\x06\x6b\xe8"
- "\x76\x23\x4b\xd2\xc0\xd4\x66\x26\xe0\x39\x82\x03\xb3\x62\x8b\x59"
- "\xaa\xaf\x4d\x01\xac\x8d\xff\x1c\xd0\x16\xec\xdc\xc1\xfc\xe7\x30"
- "\x9f\x31\x17\x2f\x33\x45\xd5\xa5\x08\xe7\x12\x8a\xaa\xbf\x46\xc5"
- "\xcb\xcd\x68\xec\x42\x84\x46\x99\x10\xc2\xb6\x28\x8e\xaf\x40\x63"
- "\x34\xc8\x1b\xe7\x9f\xcd\xbf\x04\xb6\x2d\x2e\xd7\xa3\xc5\x46\xb8"
- "\xc7\xdb\x86\xba\x7b\x2c\x5a\x5e\x84\xe0\xbb\x0e\x45\xd1\x3a\xe4"
- "\xa5\x41\x3e\xd8\xbe\xc6\x8c\x91\x86\x31\xd0\x7f\xe6\x54\x33\x0c"
- "\xb6\x2d\xb6\x29\xb6\x2f\x6e\xcf\x62\xf3\xe2\x48\x3d\x4a\x32\x20"
- "\x9f\xe2\x44\xf8\x37\x9e\xd1\x17\xa3\x3b\x48\xa7\x34\x1a\x19\xdf"
- "\x13\xe1\x80\x8b\xbe\x18\x0b\xf0\xb7\x17\xf8\xbf\xad\x30\xa6\x82"
- "\xe2\x08\xa6\x5a\x54\x39\xc7\x54\x50\x02\xc5\x94\x79\x66\x1d\xa6"
- "\x54\x68\x84\x38\xa6\x98\x6d\x1c\xa6\xd2\x9a\x26\xa6\x98\x21\x8e"
- "\x31\xc5\x74\x74\x80\xa9\x14\xa6\x5d\x50\x28\x0f\x53\x2a\x34\x41"
- "\x3a\xa6\x98\x98\xc6\xc3\x54\x50\xbc\x3c\x4c\x31\xa1\x7c\x4c\x99"
- "\xc3\x1d\x60\x8a\x8b\x53\x4f\x5d\x75\x01\x53\x34\x4e\xa9\xd0\x71"
- "\x8a\x29\xe5\x46\x51\x4c\xa9\x14\xf7\x08\xa6\x82\x9b\x66\x9c\x52"
- "\x29\xd2\x1d\x62\x4a\xa5\xd0\x88\x63\x2a\x18\xe2\x54\x10\x3f\x4e"
- "\xa9\x94\xbb\x24\x63\x4a\xa5\xd0\x36\x22\xa6\xe4\xc5\x29\x95\x62"
- "\x3b\x0f\x53\x2a\x74\x58\x1c\x53\xc1\x5c\x9c\xf2\xfd\xd6\x39\xa6"
- "\x82\x69\x9c\x52\xa9\x7c\x29\xa6\x3c\x6e\x89\x63\xca\x23\x98\xc3"
- "\x54\xd3\x8c\x53\x2a\xd5\x35\xc7\x98\x52\x9d\x76\x80\x29\x88\x53"
- "\xc1\x36\x71\xca\xc3\x24\x1d\x53\x1e\x7e\x8d\x87\xa9\x60\x79\x71"
- "\x4a\xa5\x32\xf0\x31\xa5\xf2\x74\x80\x29\x2e\x4e\xbd\xb2\xda\x05"
- "\x4c\x59\xc5\xa9\x16\x51\x14\x53\x4f\x0c\x13\xc7\x54\xcb\x1c\x82"
- "\xa9\x90\x26\x1a\xa7\x5a\x0e\x74\x8c\xa9\x96\x01\xe2\x98\x0a\x81"
- "\x38\x15\x6c\x13\xa7\x9e\x18\x27\x1d\x53\x2d\xa3\x1b\x11\x53\x32"
- "\xe3\x54\xcb\x51\x7c\x4c\xb5\x98\x2c\x8e\xa9\x10\x2e\x4e\x4d\x7a"
- "\xcd\x39\xa6\x42\xac\xe2\xd4\x13\x47\x29\xa6\x5a\x65\x8a\x63\xca"
- "\xf3\x0e\x87\xa9\x26\x1a\xa7\x3c\xd7\x38\xc6\x94\x67\x8c\x03\x4c"
- "\x41\x9c\x0a\xb1\x89\x53\xad\x76\x48\xc7\x94\xe7\xb1\xc6\xc3\x54"
- "\x88\xcc\x38\xe5\x99\xcb\xc7\xd4\x13\x07\xc5\x30\x55\x83\x75\x9f"
- "\x02\x30\x15\x0d\xba\x0f\x30\xe4\x5d\x42\x30\x55\x0b\x98\xda\x6c"
- "\x8d\xa9\x1f\x6d\x74\x9f\xea\xc9\xd6\xe6\x3a\x4c\x79\xb5\xb7\xc5"
- "\x94\x19\x30\x55\xcb\x62\xea\xa9\x3e\x16\xdd\x57\x5c\x99\x0b\xbe"
- "\xba\x89\x8a\x43\x01\x4f\x1b\x38\x3c\xfd\x08\x78\x82\xe7\x31\xc3"
- "\xf3\x16\x94\x95\xa2\xb1\x7a\xf2\x5c\x35\xf0\xbc\x66\x6b\x2c\xd5"
- "\x54\x28\x31\x86\x30\x76\x2c\x38\x2a\x9c\x03\xf8\x89\x3d\x87\x0a"
- "\x17\xc0\x67\x11\x7c\x12\xe1\x83\xce\xa1\x82\x0a\xc4\xe6\xec\x29"
- "\x7e\x4a\x38\xfc\x3c\x59\xe8\x18\x3f\x4f\xee\x95\xa4\xf1\x54\x5e"
- "\xdd\xa5\xe3\xe7\x49\x23\x37\x97\xce\x67\xec\xb8\xcb\x0c\x9e\x03"
- "\x4b\x30\x72\x13\x8d\x35\x22\x6f\x66\x52\x60\x5b\xaf\x30\xe4\xf3"
- "\xa1\x09\x29\xd7\x4c\x43\x3e\x6b\x7e\x80\xe7\xb5\xf4\x9d\xab\xc8"
- "\xeb\x6b\xc3\xdf\x51\x41\x55\x29\x2a\xb8\x7f\x16\x15\x98\xe1\x73"
- "\x13\x3e\x70\x8f\x63\xa3\xac\x9f\x57\xcf\x3d\xef\x53\xc7\xa1\xad"
- "\xae\xe2\xcf\xfb\x54\x36\xfb\xbc\x91\xf0\xbc\x35\xf4\x79\x8b\x01"
- "\x8b\xe0\x97\x0e\x66\x4e\x27\x8e\xd5\xa3\x56\xef\x1b\x19\xa6\x86"
- "\xc3\x20\xf6\xcb\xd7\xe7\x0d\x68\xac\x06\x7c\x35\x1d\x30\x58\xbe"
- "\x13\x25\x25\x00\x06\x6b\x0c\xf8\xbd\xbe\xbe\x38\xf9\x21\x60\xf0"
- "\x49\x1d\x03\x76\xab\xc5\x18\xfc\x11\x63\xf0\x49\x0f\xb3\x28\x06"
- "\x41\x27\xb2\x18\x04\x9d\xe8\x14\x83\x56\x3a\x51\xe5\x95\x4e\x31"
- "\xd8\x26\x47\x1c\x83\xad\x8f\x58\x74\xe2\xa3\xc7\x60\xeb\x71\x8e"
- "\x31\xd8\xba\xb7\x34\x4d\xd8\x66\x9f\x74\x0c\xb6\x4e\x6e\x3c\x0c"
- "\xb6\x19\xe6\x18\x83\x6d\xd4\xce\x31\x18\x14\x2f\x0f\x83\xad\x23"
- "\xf9\x18\xf4\x4a\x71\x80\x41\x2e\x0e\x82\xae\x74\x8e\x41\xab\x38"
- "\xe8\xed\x4f\x31\xe8\xdb\x45\x1c\x83\x3e\x03\x2d\xba\xf2\xd1\x63"
- "\xd0\xfb\x82\x63\x0c\x7a\x1f\x96\xa6\x21\x7d\xfb\x48\xc7\xa0\x8f"
- "\x47\xe3\x61\xd0\xe7\x8c\x63\x0c\xfa\x6c\x77\x01\x83\x32\xe3\xa0"
- "\x77\x05\x1f\x83\xde\x5e\xe2\x18\x0c\xe6\xe2\x20\xe8\x50\xa7\x18"
- "\xb4\xd6\xa1\xbe\x1b\x29\x06\x9f\xde\x21\x8e\xc1\xb6\xc7\x2d\x3a"
- "\xf4\xd1\x63\xb0\xed\x3b\x8e\x31\xd8\x76\x80\x34\xcd\xf9\xf4\x11"
- "\xe9\x18\x6c\x9b\xd2\x78\x18\x7c\x3a\xd8\x31\x06\x9f\x0e\x74\x8e"
- "\xc1\x60\x99\x71\xb0\x6d\x0c\x1f\x83\xbe\x69\x0e\x30\xc8\xc5\x41"
- "\xd0\xad\xce\x31\x68\x15\x07\xfd\x3a\x51\x0c\xb6\xeb\x2e\x8e\x41"
- "\xff\x61\x16\xdd\xfa\xe8\x31\xe8\x77\xc9\x31\x06\xfd\x8e\x49\xd3"
- "\xa8\xed\x06\x4a\xc7\xa0\xbf\x57\xe3\x61\xd0\xbf\xd0\x31\x06\xfd"
- "\xf7\xba\x80\x41\x99\x71\xd0\x4f\xcf\xc7\xa0\x9f\x9f\x38\x06\x43"
- "\xb8\x38\x08\x3a\xd7\x29\x06\xad\x75\x6e\xbb\x6d\x14\x83\x01\xfb"
- "\xc4\x31\xf8\x9b\x33\x16\x9d\xfb\xe8\x31\xf8\x9b\x08\xc7\x18\xfc"
- "\xcd\x50\x69\x9a\x36\xe0\xb8\x74\x0c\xfe\x26\xad\xf1\x30\x18\x30"
- "\xce\x31\x06\x03\x7a\x3b\xc7\x60\x88\xcc\x38\xf8\x9b\x38\x3e\x06"
- "\xdb\x65\x89\x61\xd0\x0c\xba\xb8\x76\xfb\xc0\x12\x73\x46\x44\xbc"
- "\xb7\x42\x8d\x8c\x7e\xa3\x86\x16\xc7\x55\xa3\x31\xf7\xc0\x3e\x9a"
- "\x7b\xe8\xdd\x7b\x3e\xc8\x94\x11\x11\xcd\x80\x3e\xb2\xd2\xcf\xec"
- "\xdc\x32\x63\xda\x89\xf0\x75\x73\x90\x07\xe8\xef\x97\xf1\xb1\xe2"
- "\xeb\x06\x84\x7f\x7f\x31\xbe\x9f\x9b\xf4\x7e\x70\x9e\x80\xf9\x35"
- "\xd0\x87\x7d\xc7\x5c\xa3\x43\xe5\x83\x91\xaa\xa0\x5c\x07\x76\x58"
- "\xc4\xfa\x17\xdb\xe5\xba\xaa\x7d\xda\xd6\xdb\xc8\xc3\xf8\x73\x40"
- "\x07\xb0\xb7\x5f\xeb\x0f\x90\xa2\x63\x39\x63\xc6\x76\xc5\xf6\xc2"
- "\x36\x56\x2f\x62\x18\x38\xef\x4a\x11\x60\xcc\xf8\x73\x60\x87\x2d"
- "\x70\x9e\xb0\x5e\x6d\x7f\x43\x3a\x36\xda\x93\xf5\xb0\xaa\xf6\x29"
- "\x05\x65\x48\xf0\xdd\xb1\x19\xf4\x9b\x6b\xb6\x0a\x8a\xb7\xd2\x79"
- "\x0d\x60\xab\x0e\xc7\x5c\xb3\xd5\x33\xad\x6d\x6c\x25\xa0\xab\x9e"
- "\xf1\x97\x6e\xab\x0e\xa4\x4e\xa4\xaa\xc3\x61\x07\xb6\x72\x11\x57"
- "\x41\x06\x2b\x3d\xd2\x00\xb6\x7a\xa6\xc2\x35\x5b\x75\x1c\xc8\xb7"
- "\x95\x10\xff\xef\x38\x4c\xba\xad\x3a\x7a\x10\x5b\x3d\xa3\x13\xb7"
- "\x55\xb0\x8b\xb8\x0a\x8e\xb7\xe2\xcd\x0d\x60\xab\x4e\x7e\xae\xd9"
- "\xaa\x53\x94\x8d\xad\x04\x78\x6a\xa7\xd9\xd2\x6d\xd5\xa9\x37\xb1"
- "\x55\x27\x2f\x07\xb6\x72\x11\x57\xc1\x06\x2b\x7e\xd7\x00\xb6\xea"
- "\x3c\xd4\x35\x5b\x75\x4e\xe7\xdb\x4a\x88\x4f\x75\xde\x28\xdd\x56"
- "\x9d\x27\x13\x5b\x75\x1e\x20\x6e\xab\x10\x17\x71\x15\x12\x6f\xc5"
- "\x43\x1a\xc0\x56\xcf\xc6\xb8\x66\xab\x67\x8f\xdb\xd8\x4a\x60\xdc"
- "\x7f\xf6\x8c\x74\x5b\x3d\x9b\x42\x6c\xf5\x6c\xa4\x98\xad\x4c\x19"
- "\x23\xab\xbd\xc1\x06\x0f\x37\x8c\x2c\xf1\x8e\x47\xca\x9a\xae\x60"
- "\x37\x3f\xb0\xdb\x12\x35\xaa\xcd\x00\xbb\xe9\x8d\x68\xcc\xdc\xcb"
- "\x4c\x51\xa5\x09\xd5\x80\xcd\x1e\xfa\x8d\x34\x14\xeb\x2b\xf0\x9c"
- "\xa3\xdf\x5f\x55\x75\xd9\x31\x69\xae\x0f\xc2\x76\xc3\x76\xc0\xb6"
- "\x63\xc0\x6e\xac\x1d\xfd\x66\x19\x4c\x7e\x93\x7c\x46\xdf\xba\xcc"
- "\xbc\xaf\x63\x18\xfc\xbc\x8c\x5f\x1b\x0d\x7e\x2f\x30\xb6\x02\xb5"
- "\x52\xbf\x89\x9f\xa9\xcb\x04\x7c\xbc\x58\x5f\x0a\xfc\xa0\x0a\xb1"
- "\xdc\xec\x72\xa0\x9f\xe9\xed\x40\x2f\x53\x71\xd8\x48\xa6\x9d\x77"
- "\x9a\xb1\x5d\x58\x78\xd2\x2d\xd4\x12\xf3\x87\xb5\x66\x14\xb0\x78"
- "\x36\x52\xee\x9f\xa5\x55\xb2\x6b\xd7\x62\xd9\x36\xba\x80\x5d\x02"
- "\x98\xbb\x56\x73\xba\xef\x46\xa3\xe2\xeb\x69\xac\xdf\x6c\x39\x02"
- "\xeb\xb7\xef\x03\x7d\x80\x67\xf6\x66\xfc\x82\x3c\xd3\x8a\x90\x9a"
- "\xa9\x05\x1b\xe3\xf5\x44\xaa\xe7\x5a\x6f\xad\x91\x6a\x63\x35\x3b"
- "\xff\xdb\xac\xe6\xe6\x6f\x81\x9d\xf0\xef\xb3\xf3\xb7\x34\x56\xf3"
- "\xb7\xe0\x9e\xeb\xe6\x6f\xa9\xd4\x07\xf1\xfc\x2d\xf3\xe5\x80\x0e"
- "\x96\x67\x7f\x3f\x86\x61\xe0\xd9\xdb\x16\x55\xeb\x11\x7e\xfe\xa2"
- "\x6a\x2d\x4a\x8a\x43\x3e\x45\x35\x15\x28\xb1\x9a\xd1\x17\x25\xdf"
- "\x40\x63\xef\x61\x1e\x8c\xf1\xd2\x25\x87\xf8\x55\xad\x31\x5f\x0e"
- "\xec\xa0\x53\x75\xc9\x28\x2a\x41\xc8\x6a\x1d\x4f\x34\x70\x66\x4f"
- "\xf0\x43\x74\x71\xf2\x55\x04\x3e\x49\x2b\x36\xfe\x80\xfd\x14\x0d"
- "\xdf\x0f\xae\xe3\xd7\xed\x26\xad\xc7\xc7\xb0\xcf\xf0\xfb\x26\x5c"
- "\x1f\x60\xab\x15\xff\xc6\xb8\xf0\x8e\x4f\x46\xc5\xf1\x35\xa8\xc8"
- "\x88\x80\x5f\xa9\x3b\x7e\x13\x56\x2a\x82\xa3\xa0\x38\x82\xa3\xa0"
- "\x50\xef\xf8\x16\x55\xce\x71\x14\x14\x4f\x71\xf4\xdb\x5b\xee\xe1"
- "\xe8\xb7\x39\xee\xe3\xe8\xb7\x33\xdd\xc0\x51\x0a\x1f\x47\x5d\x27"
- "\x48\xc7\xd1\x6f\xfb\x4a\xc7\xd1\x73\x06\xf7\x70\xf4\xdb\x6b\x04"
- "\x47\xcf\xe5\x11\x1c\xfd\xb6\x8c\xe2\x88\x5d\x1b\xd5\x40\x38\x7a"
- "\x2e\xd2\x01\x8e\xb8\x78\x14\x04\xf1\xe8\xa9\xab\x2e\xe0\xc8\x2a"
- "\x1e\xfd\xae\x9f\x7b\x38\xea\x76\xcd\x7d\x1c\x75\x3b\x24\x1f\x47"
- "\xc1\x36\xf1\xe8\x77\x39\xd2\x71\xd4\x2d\x41\x3a\x8e\xba\x0d\x75"
- "\x0f\x47\xbf\xeb\x45\x70\xd4\x0d\x11\x1c\xfd\xae\x2b\xc5\x11\xbb"
- "\xde\xac\x81\x70\xd4\x75\xaf\x38\x8e\x82\xb9\x78\x14\x0c\xf1\xc8"
- "\xf7\x5b\xe7\x38\x0a\xb6\x8a\x47\x81\x8b\xdd\xc3\x51\x60\x2f\xf7"
- "\x71\xf4\xfc\x43\x37\x70\x64\x13\x8f\x02\xaf\x49\xc7\xd1\xf3\xa7"
- "\xa5\xe3\xe8\xf9\x14\xf7\x70\x14\x38\x9f\xe0\xe8\xf9\x20\x82\xa3"
- "\xc0\x18\x8a\x23\x76\x0d\x5f\x03\xe1\xe8\x77\xd5\x0e\x70\xc4\xc5"
- "\xa3\x60\x88\x47\xaf\xac\x76\x01\x47\x56\xf1\xa8\xc7\x19\xf7\x70"
- "\xd4\x63\xbe\xfb\x38\xea\x31\x4c\x3e\x8e\x42\x6c\xe2\xd1\x0b\xbd"
- "\xa4\xe3\xa8\x87\x97\x74\x1c\x75\x2f\x71\x0f\x47\x3d\x8e\x13\x1c"
- "\x75\x4f\x23\x38\xea\x71\x98\xe2\x88\x5d\x17\xd9\x40\x38\xea\x3e"
- "\x58\x1c\x47\x21\x5c\x3c\x0a\x81\x78\x34\xe9\x35\xe7\x38\x0a\xb1"
- "\x8a\x47\xbd\x5a\xbb\x87\xa3\x9e\xc7\xdd\xc7\x51\xcf\x55\x6e\xe0"
- "\xc8\x26\x1e\xf5\x9a\x2f\x1d\x47\x3d\xc7\x4b\xc7\x51\xcf\x00\xf7"
- "\x70\xd4\xab\x05\xc1\xd1\x0b\xa5\x04\x47\x3d\x8d\x14\x47\xec\x5a"
- "\xd3\x06\xc2\xd1\x0b\xcb\xc5\x70\x84\x6b\x11\x7c\x4c\xea\x42\x54"
- "\xaf\x5b\x84\x06\x6c\xc5\xff\xd6\xa0\xde\x0f\xd6\xf6\xda\x7b\x32"
- "\x81\xd4\x03\xd0\xa9\x7a\xb1\xf9\x5e\xa1\xeb\x9f\xda\x05\x7e\xf1"
- "\x1b\xa9\x1f\x7b\x89\xd4\x68\xc0\x75\x41\xee\x26\x45\xa3\x97\x70"
- "\x5d\x06\xd5\x8b\xe5\xb8\x8e\x55\x5d\xed\x00\x3f\x91\xda\x01\x13"
- "\xc5\x6b\x07\xd4\x6c\xb0\xac\xbb\xdd\x49\xd7\xdd\xaa\x5e\x3c\xe4"
- "\x70\xdd\xad\xea\xc5\x8d\x39\x13\xa5\xe2\xe1\x45\x76\xfd\xd7\xdd"
- "\x76\x23\x4b\x1e\xac\x7d\x71\x27\x3c\x73\x32\x79\xf6\x97\xd8\x7a"
- "\x2b\xce\xd7\xe3\xee\xb4\xc2\xc9\x8b\xe3\x27\x4c\x46\xc9\xcc\xea"
- "\x5b\x3b\x19\xff\x91\x7a\x26\x33\x48\x5a\xfd\x2c\xd5\x8b\x7a\xc7"
- "\xf6\x0e\xd2\x08\xdb\xbb\xf7\x78\x62\x6f\xae\x6e\x81\x9f\x48\xdd"
- "\x82\x89\xe2\x75\x0b\x84\xed\xdd\xdb\xf1\x3a\x67\x55\xef\x56\xd2"
- "\xed\xfd\xd2\x79\x62\xef\xa0\xd0\x07\x6b\x7b\x07\x50\x7b\xf7\xce"
- "\x90\x6e\xef\x97\x4e\x13\x7b\xdf\xce\x66\xfc\x83\x34\x60\xef\x64"
- "\x69\xf7\xd2\x3b\xdc\x89\xbd\x45\xf0\xdd\xe7\x34\x67\x6f\x0e\xdf"
- "\x22\x35\x13\x26\x8a\xd7\x4c\x10\xb6\x77\x9f\x74\xc7\xf6\xee\xb3"
- "\x50\xba\xbd\xfb\x0c\xe7\xec\x0d\xf8\xee\x93\x42\xed\xfd\xb2\x8b"
- "\x75\x05\xac\xed\xdd\xa7\x2f\xb1\xf7\xaf\x69\x60\x6f\xc0\x77\xb0"
- "\x44\x7c\xf7\x11\xad\x3b\x44\xec\x1d\x2c\x82\xef\xff\xe9\x4b\xec"
- "\xcd\xd5\x6b\xf0\x13\xa9\xd7\x30\x51\xbc\x5e\x83\xb0\xbd\xff\x47"
- "\xe1\xd8\xde\x2f\xdf\x90\x6e\xef\x97\x0f\x13\x7b\x07\x03\xbe\x5f"
- "\x36\x50\x7b\xff\x4f\x9c\x74\x7b\xbf\xbc\x9d\xd8\x5b\xbf\x9c\xf1"
- "\x0f\x06\x7c\x07\x4b\xc4\xf7\xff\x0c\x75\x62\x6f\x11\x7c\xf7\xdd"
- "\xce\xd9\x9b\xc3\xb7\x48\xad\x88\x89\xe2\xb5\x22\x84\xed\xdd\x77"
- "\xae\x63\x7b\xf7\x7d\x47\xba\xbd\xfb\x76\xe5\xec\x0d\xf8\xee\x1b"
- "\x4d\xed\xdd\xb7\x5c\xba\xbd\xfb\xfa\x11\x7b\xdf\x89\x07\x7b\x03"
- "\xbe\x43\x24\xe2\xbb\xef\x41\xc7\xf6\x0e\x11\xc1\xf7\x2b\x7e\xc4"
- "\xde\x5c\x9d\x0a\x3f\x91\x3a\x15\x13\xc5\xeb\x54\x08\xdb\xbb\xdf"
- "\x15\xc7\xf6\xee\x77\x56\xba\xbd\xfb\x65\x10\x7b\x87\x00\xbe\xfb"
- "\x95\x52\x7b\xbf\x32\x5e\xba\xbd\xfb\x2d\x27\xf6\xae\x8a\x61\xfc"
- "\x43\x00\xdf\x21\x12\xf1\xfd\x8a\x5a\xcc\xde\xde\x60\xef\x33\xc0"
- "\x63\x80\x77\x18\xcc\x19\xc0\x53\x4c\x7c\xbb\x17\xc7\x0f\x40\x2f"
- "\xde\xc7\xb6\x1f\x80\x60\xac\x36\x34\x5a\xbd\x0c\x55\xff\x1b\x6e"
- "\xaf\x1d\x56\xf5\x3f\x22\xba\x76\x58\xd5\x3f\x47\xf2\xda\x61\x55"
- "\xff\x68\xca\x81\xfa\xef\xa5\x3e\x1d\xc0\xc6\x0f\x49\x6b\x8a\x55"
- "\xfd\xc3\x04\xeb\x68\xa8\xfa\x7b\xe2\x35\xc5\xcc\xea\xbb\xe1\xe6"
- "\x4c\x39\xdc\x68\x80\x97\x73\x5f\x07\xc5\x9b\x33\x80\x23\x89\xfa"
- "\x7a\x60\x25\x8c\x5b\xf1\x8d\x56\xb7\x43\x35\xf0\x82\xfb\xbe\x1e"
- "\xb8\x4d\xdc\xd7\x03\x57\x49\xf7\xf5\xc0\xf1\x94\x7f\x0d\xcc\xa2"
- "\xbe\x1e\x24\x7d\xfd\xb8\x6a\xe0\x70\xc1\x7a\x1e\xaa\x01\xd5\xc4"
- "\xd7\xd5\xa7\xcd\x99\x72\x78\xd9\x40\x83\x0b\xbe\x86\x7e\x1d\xe4"
- "\xa0\x5f\xff\xbe\x14\x7c\x6d\x68\xb4\xfa\x21\xaa\xdf\x9f\x74\xdf"
- "\xd7\xbf\x5f\x23\xee\xeb\xdf\xcf\x97\xee\xeb\xdf\x0f\xa5\xdc\xef"
- "\xf7\xcb\xa9\xaf\x07\x07\x48\xf7\xf5\xef\x7b\x0b\xd6\x15\x51\x0d"
- "\xd2\x11\x5f\xdf\x0f\x04\x5f\xcb\xe0\x84\xbf\x2f\x77\xee\xeb\x60"
- "\xe8\xd7\xc1\x0e\xfa\xf5\x90\xd3\x30\x5e\xc7\x37\x5a\x1d\x13\xd5"
- "\x90\x7d\xee\xfb\x7a\xc8\x42\x71\x5f\x0f\x89\x90\xee\xeb\x21\x3d"
- "\x29\xef\x1c\xa2\xa1\xbe\xfe\x83\x87\x74\x5f\x0f\xe9\x28\x58\xdf"
- "\x44\x35\xb8\x80\xf8\xfa\x41\xaa\x39\x53\x0e\x1f\x1d\x22\xca\xff"
- "\xad\x7c\x0d\xfd\x3a\xd8\x41\xbf\x7e\xf5\x20\xf8\xda\xd0\x68\xf5"
- "\x54\x54\xaf\x6e\x74\xdf\xd7\xaf\x46\x89\xfb\xfa\xd5\xd1\xd2\x7d"
- "\xfd\x6a\x00\xe5\xbc\xaf\x4e\xa6\xbe\x7e\x55\x2f\xdd\xd7\xaf\x7a"
- "\x0a\xd6\x59\x51\xfd\x21\x8f\xf8\xda\xa0\x07\x5f\xcb\xe0\xc2\xaf"
- "\x1e\x73\xee\xeb\x10\xe8\xd7\x21\x0e\xfa\xf5\x30\xd0\xf5\x21\xf1"
- "\x8d\x56\xd7\x45\x35\x6c\x85\xfb\xbe\x1e\x36\x4e\xdc\xd7\xc3\x06"
- "\x4a\xf7\xf5\x30\x0f\xca\xb7\x87\x05\x51\x5f\x0f\x2b\x93\xee\xeb"
- "\xa1\xd5\x82\xf5\x5e\x54\x43\xb7\x13\x5f\xd7\x8c\x37\x67\xca\xe1"
- "\xe1\xc3\x44\xf7\x3f\x70\xc4\xc3\xe7\xe5\x20\x4f\xbe\xbf\x5f\x4f"
- "\x6d\x5c\x2e\xfe\xfa\x7c\xf7\xfd\xfd\xfa\x30\x71\x7f\xbf\xde\x5d"
- "\xba\xbf\x5f\xab\xa6\x5c\xfc\xf5\x01\xd4\xdf\xaf\x17\x48\xf7\xf7"
- "\x6b\xe5\xc2\x5c\xfc\xb5\x0c\xf7\xb8\xf8\xeb\x59\x72\xb8\xb8\xbd"
- "\xbf\x47\x24\x34\x2e\x1f\x1f\x11\xe5\xbe\xbf\x47\xf4\x11\xf7\xf7"
- "\x88\xf6\xd2\xfd\x3d\xbc\x9c\xf2\xf1\x11\x81\xd4\xdf\x23\x8e\x49"
- "\xf7\xf7\xf0\xf3\xc2\x7c\x7c\xf8\x72\xf7\xf8\xf8\x88\x14\x39\x7c"
- "\xdc\xde\xdf\x23\x63\x1a\x97\x93\x8f\x9c\xe0\xbe\xbf\x47\x76\x11"
- "\xf7\xf7\xc8\x56\xd2\xfd\xfd\xc7\xf3\x94\x93\x8f\xb4\xca\x7f\x8f"
- "\xdc\x2b\xdd\xdf\x7f\x3c\x2d\xcc\xc9\xff\x18\xe7\x1e\x27\x1f\x19"
- "\x2f\x87\x93\xdb\xfb\x3b\x78\x72\xe3\xf2\xf2\xe0\x11\xee\xfb\x3b"
- "\xd8\x57\xdc\xdf\x41\x0f\xa5\xfb\x3b\xe8\x34\xe5\xe5\xc1\x9e\xd4"
- "\xdf\xc1\xd2\xeb\x67\xaa\x82\x0e\x0b\xf3\xf2\xa0\x48\xf7\x78\x79"
- "\x70\xb4\x1c\x5e\x6e\xef\xef\x37\x46\x35\x2e\x37\x7f\xa3\x9f\xfb"
- "\xfe\x7e\x43\x21\xee\xef\x90\x1b\xd2\xfd\x1d\x72\x98\x72\xf3\x10"
- "\xab\xfc\xff\x1b\xa9\xd2\xfd\x1d\xb2\x5d\x98\x9b\x87\x8c\x77\x8f"
- "\x9b\xbf\x11\x26\x87\x9b\xdb\xfb\x7b\xf4\xe0\xc6\xe5\xe7\xa3\xbb"
- "\xb9\xef\xef\x51\x77\xc4\xfd\x3d\xea\xa2\x74\x7f\x8f\xda\x4e\xf9"
- "\xf9\xa8\x0a\xea\xef\xd1\x09\xd2\xfd\x3d\x2a\x43\x98\x9f\x8f\x1a"
- "\xee\x1e\x3f\x1f\x1d\xe4\x7e\x9e\x3c\x34\x00\x73\x73\xa9\xf5\x1f"
- "\x8b\xe3\x2c\x6b\xee\xc6\xd0\xfa\x8f\xaa\xd0\x56\x48\xb4\xb6\xcc"
- "\xd8\xa8\x26\x5d\xff\x51\x35\xc6\x71\xfd\x47\xd5\x18\x69\xf5\x1f"
- "\x55\x63\x47\x4b\x9f\x8f\x3f\x36\x80\x6a\x84\xb1\x56\xfa\x3f\x94"
- "\xec\x51\xdc\x94\xeb\x42\xaa\xc6\xf0\xeb\x42\xaa\xc6\xb0\x75\x21"
- "\x99\xd5\xb5\x79\xf2\xb4\x48\x68\x57\xf7\xdf\x0b\xbc\x59\x8d\x75"
- "\x88\xd4\x3a\x94\x14\xdb\xa1\x77\x28\xb6\xdf\xbc\x26\x8e\xed\x37"
- "\x87\x35\xe9\x3a\x94\xaa\x71\x67\x1c\x63\x7b\xdc\x76\x69\x35\x47"
- "\xde\x94\x51\xf7\x66\x5c\x35\xd5\x43\x6f\x5a\xe9\xdf\xb7\xfa\x36"
- "\x1e\xb6\x65\xd6\xa7\x54\x8d\x2b\xe5\x63\x3b\xb4\x82\x60\xdb\xec"
- "\x25\x4f\x77\xbd\x85\xdc\x7f\x0f\x32\xa1\x04\x6b\x2e\xa9\xf5\x30"
- "\x29\xb6\xdf\x2a\xa4\xd8\x9e\x70\x52\x1c\xdb\x13\x3a\x35\xed\x7a"
- "\x98\xe3\xb7\x39\xc6\xf6\xf8\x64\x69\xb5\x4c\x26\xb4\x90\x8e\xed"
- "\xf1\x25\x54\xfb\x4d\xf0\xa3\xd8\xfe\x93\x4f\x23\x62\x5b\x66\xdc"
- "\x1e\x7f\x98\x8f\xed\xb7\x4e\xb3\xd8\x5e\x8b\xc2\xe5\x69\xcc\x09"
- "\x65\xee\xbf\xf7\x09\xdb\x8b\xf5\xa5\xd4\xba\x9c\x14\xdb\x7f\xda"
- "\x45\xb1\x1d\x66\x57\x17\x8a\x62\xfb\xed\x87\x4d\xbb\x2e\xe7\xdb"
- "\x8b\x1d\x63\xfb\xed\xc9\xd2\x6a\xa4\xbc\x7d\x45\x3a\xb6\xdf\xde"
- "\x4b\x75\xee\xdb\x7a\x8a\xed\xb0\xca\xc6\xc3\xb6\xdc\x7a\x9d\x6f"
- "\xa7\xf1\xb1\xfd\xa7\x5c\x82\x6d\xe5\x61\x79\x7a\x3a\x2c\xcf\xfd"
- "\xf7\x5c\x93\x52\xb0\x96\x96\x5a\x1f\x94\x62\xfb\x9d\x15\x14\xdb"
- "\x93\x16\x8a\x63\x7b\xe2\x85\xa6\x5d\x1f\x74\xa2\x93\xfa\x3f\x13"
- "\x1d\xd4\xff\x11\x5a\x2b\x3c\x51\x46\xdd\x8b\x89\x29\x54\xd3\x4f"
- "\x2c\xa0\xd8\x9e\x94\xdf\x88\xd8\x96\x19\xb7\x27\xc6\xf0\xb1\xfd"
- "\x4e\x02\xc1\x76\x0b\x4f\x79\xb9\x83\x49\x19\xee\xbf\xd7\x7b\x37"
- "\x12\xe7\x0d\xa4\xd6\x29\xa5\xd8\x9e\x1c\x41\xb1\xfd\xee\x04\x71"
- "\x6c\x4f\x39\xd4\xb4\xeb\x94\x4e\xe9\xe7\x18\xdb\x53\xfc\xa4\xd5"
- "\x74\x99\x22\x63\x1d\xfc\x94\x48\x9a\xbf\x98\x62\x35\xff\xfd\xdd"
- "\xed\x8d\x87\x6d\xb9\xf5\x4b\xa7\x04\xf1\xb1\x3d\x39\x8c\x60\xfb"
- "\x89\xc9\xf2\xf2\x24\xef\x6a\xdc\xcf\x93\x44\x68\xd8\x77\x98\x12"
- "\xeb\xa5\x52\x6c\x4f\x1d\x42\x6b\x13\x45\x44\xd8\x62\x9b\xd6\x26"
- "\x0a\x5f\xd8\x74\xea\xa5\x4e\x35\x39\xc6\xf1\xd4\x32\x69\x39\x91"
- "\xf0\x08\xe9\x38\x0e\xef\x49\x73\x22\xe1\x56\xf3\x5f\x22\x2c\x7b"
- "\x92\x37\x42\xcd\xa2\x88\x16\x8e\x6b\x16\x85\x97\x37\x5c\x1d\xd5"
- "\x70\x1f\x7e\xcd\xa2\xa9\x7d\xcd\x6c\x5f\x68\x75\x50\x5e\x5e\x25"
- "\x22\xc1\xfd\xbc\x4a\x24\x79\xbf\x2b\xb1\x6e\x2b\xed\x0b\xd3\x82"
- "\x69\x5f\x88\x9c\x2d\xde\x17\xa6\xaf\x68\x3a\x75\x5b\xa7\xb7\x72"
- "\xdc\x17\xa6\x55\x48\xcb\xa1\x4c\x97\x51\x07\x66\xfa\x00\x9a\x43"
- "\x99\x9e\x40\xfb\x42\xe4\xb1\xc6\xeb\x0b\x91\xbe\x8e\xfb\xc2\x74"
- "\x7d\xc3\xd5\x73\x9d\xde\x91\xdf\x17\xa6\x0d\x25\x7d\xc1\xab\xaf"
- "\xbc\x3c\x4c\xa4\xac\xf7\xdf\xfc\xbe\xf0\x5e\x0a\xfb\xee\x5b\x62"
- "\xfd\x58\xda\x17\xa2\x26\xd0\xbe\xf0\x9e\x1d\x9f\xa7\x7d\x61\x46"
- "\x7a\xd3\xa9\x1f\x3b\xc3\xdf\x71\x5f\x88\xaa\x96\x96\x73\x99\xb1"
- "\x50\x7a\x5f\x98\x61\xb5\xfe\x69\x86\xd5\xfa\xa7\xf7\xf2\x1b\xaf"
- "\x2f\xbc\xd7\xc9\x71\x5f\x98\x61\x6c\xb8\xba\xb2\x33\x02\xf9\x7d"
- "\x21\x6a\x14\xe9\x0b\x6d\xf2\xe4\xe5\x6d\xde\x73\x81\xff\x3b\xcb"
- "\xdb\xcc\xca\x60\xe7\x05\x48\xac\x63\x4b\xfb\x42\x74\x04\xed\x0b"
- "\xb3\x56\x88\xf7\x85\x99\x39\x4d\xa7\x8e\xed\xcc\x2e\x8e\xfb\xc2"
- "\x4c\x24\x2d\x47\x33\x73\x85\xf4\xbe\x30\x33\x94\xe6\x68\x66\x66"
- "\xd0\xbe\x30\xeb\x7c\xe3\xf5\x85\x59\xdd\x1d\xf7\x85\x59\x9e\x0d"
- "\x57\xdf\x76\x66\x5f\x7e\x5f\x88\x0e\x23\x7d\xc1\x77\xb0\xbc\x3c"
- "\xcf\xac\x5c\xf7\xf3\x3c\xb3\x73\xd9\x39\x13\x12\xeb\xe9\xd2\xbe"
- "\xf0\xe7\xd9\xb4\x2f\xcc\x4e\x17\xef\x0b\x31\xbb\x9a\x4e\x3d\xdd"
- "\x98\x5e\x8e\xfb\x42\x8c\x97\xb4\x9c\x4e\x4c\xba\xf4\xbe\x10\x33"
- "\x99\xe6\x74\x62\x72\x69\x5f\x98\xad\x6b\xbc\xbe\x30\xbb\x9f\xe3"
- "\xbe\x30\xdb\xaf\xe1\xea\xec\xc6\x0c\xe5\xf7\x85\x3f\x47\x92\xbe"
- "\xf0\xb4\x56\x5e\x5e\x68\xf6\x5e\xf7\xf3\x42\x9a\xbd\xec\x7c\x12"
- "\x89\x75\x7d\x69\x5f\x98\xb3\x90\xf6\x05\x8d\x83\x7d\x1e\xde\x3f"
- "\xd2\x74\xea\xfa\xbe\xef\x64\xff\xa3\xf7\x1d\xed\x7f\x24\x90\x03"
- "\x7a\x3f\x47\x7a\x5f\x78\x3f\x9a\xe6\x80\xde\xb7\x5a\xff\xa7\xa9"
- "\x6c\xbc\xbe\xa0\x71\xb2\xff\x83\xc6\x85\xfd\x1f\xe4\xd6\xfb\x7d"
- "\x7f\x14\xbf\x2f\xcc\xd1\x90\xbe\xd0\x6e\xb8\xbc\x3c\x92\xc6\x69"
- "\xfe\x1f\xeb\xfc\x5a\x3f\xfb\x3c\x52\x41\xf9\x00\xf4\xc2\x44\xdc"
- "\x17\x62\xc3\x8d\x99\x23\x0d\xb8\xbe\xb0\xa9\x2b\x57\x83\x72\x09"
- "\x57\xe3\xa5\xda\x48\x6a\x50\xea\x4d\x75\x35\x28\x49\xed\x0f\xa4"
- "\xc4\x6b\x81\xf1\x9a\x60\xa3\x0f\xa9\x3f\xc9\xe0\x39\x51\x78\x8e"
- "\xd4\xd5\x7c\xb6\xbe\x4a\x82\x11\x9e\xfd\xba\x93\xfa\x93\xe1\x3a"
- "\x54\x10\xbe\x08\x19\x7d\x4f\x84\x93\x75\xc2\x73\xf5\x6c\xfd\xc9"
- "\xa9\x01\x1d\xd6\xfe\x84\xfc\xbc\x71\xfd\xc9\x70\xc6\x9c\xa4\x63"
- "\xf4\x45\x06\x04\xe7\x82\x7d\x23\x2c\x35\x28\x63\xdf\xc1\xcf\x6e"
- "\x9c\x1a\xd8\x61\xcb\x4f\x62\xf5\x85\x63\x65\xd4\x81\x8d\xf5\xa2"
- "\xf9\x9d\xd8\x50\x8a\xd1\x58\x76\x0c\xd6\xa9\xe6\x56\x14\x84\x41"
- "\x8c\x59\x1b\x90\x5f\x2b\xab\xf6\x46\x6c\x8c\x73\x9f\xb1\x73\x44"
- "\xec\xe2\x17\xf5\x59\x9c\x9f\x31\x33\x28\x1e\xd7\x39\x76\xdd\x67"
- "\x2d\xaa\x1a\xc6\x67\xf3\xb6\xbb\xee\xb3\xb8\xd6\x36\x3e\x13\xc8"
- "\x43\xcc\xbb\x27\xdd\x67\xf3\xb4\x34\x0f\x11\xe7\x41\x7d\x16\x37"
- "\x9e\xf8\x6c\x5e\x36\xf1\x59\xfb\xea\x5a\x59\xf5\x3b\xe2\xd4\x2e"
- "\xf8\x0c\xcf\x7d\x70\xd0\xcf\xe6\xe7\x83\xcf\x0c\xb8\xde\xb2\xeb"
- "\x3e\x7b\xea\x6a\xc3\xf8\x6c\x7e\x98\xeb\x3e\x9b\x7f\x92\xef\x33"
- "\x21\xbd\x3c\x5f\xc6\x9e\x9d\xf3\xe3\xa8\x5e\x9e\x9f\x47\x7d\xb6"
- "\xc0\x93\xf8\x6c\x7e\x28\xf1\xd9\x33\xea\x5a\x59\x35\x40\xe6\x9f"
- "\x77\xee\x33\xf6\x9d\xbe\x83\x7e\xf6\x41\x82\x31\x13\x34\x26\xe8"
- "\x47\xd7\x7d\xe6\xfb\x6d\xc3\xf8\xec\x03\x2f\xd7\x7d\xf6\xc1\x7c"
- "\x1b\x9f\x09\xe8\xba\x0f\xa6\x48\xf7\xd9\x07\x81\x54\xd7\x7d\x10"
- "\x43\x7d\xf6\xc1\x31\xe2\xb3\x0f\x3c\x88\xcf\x3a\x8e\xaa\x95\x55"
- "\x47\xe4\x03\xa7\xf9\x2f\xcc\x43\x6b\xfd\xec\x75\x0e\xf5\xd9\xc2"
- "\xde\xe0\x33\x03\xae\x3f\xed\xba\xcf\x5e\x59\xdd\x30\x3e\x8b\xd7"
- "\xba\xee\xb3\x85\xdd\xf9\x3e\x13\xd2\x1f\x0b\x7d\xa5\xfb\x2c\xbe"
- "\x8c\xea\x8f\x85\x6a\xea\xb3\x85\x1a\xe2\xb3\xf8\x3c\xe2\xb3\x4e"
- "\xf1\xb5\xb2\x6a\x91\x2c\x1c\xec\xdc\x67\xec\x3b\x58\x07\xfd\x6c"
- "\x51\xb9\x31\x13\x38\x3b\xf0\x71\xd7\x7d\x36\xe9\xb5\x86\xf1\xd9"
- "\xa2\x38\xd7\x7d\xb6\xe8\x92\x8d\xcf\x04\x78\xf2\x22\x19\x75\xb0"
- "\x17\xa5\x51\x9e\xbc\xe8\x3c\xf5\xd9\x87\x5d\x89\xcf\x16\xc5\x10"
- "\x9f\x75\xde\x5e\x2b\xab\x9e\xc9\x22\xd1\xfa\x5f\x8e\x78\xa3\x65"
- "\x5e\x3e\xf5\x5b\x42\x76\xd3\xe1\x8e\x09\x3d\x5d\xf7\x5b\x42\xa6"
- "\x73\xee\x98\xb0\x58\xba\xdf\x12\x82\x28\x77\x4c\x48\xa5\x7e\x4b"
- "\x28\x23\x7e\x4b\xe8\xea\x1e\x77\x4c\x70\xba\xfe\x55\x88\x3b\xda"
- "\xfb\x2d\x71\x7c\xd3\xe1\x8f\x8b\xcb\x5d\xf7\x5b\xe2\x68\xe7\xfc"
- "\x31\xb1\x9f\x74\xbf\x25\x22\xca\x1f\x13\x87\x53\xbf\x25\x66\x10"
- "\xbf\x2d\x2e\x73\x8f\x3f\x26\x86\xcb\xe1\x8f\xf6\x7e\x4b\xf6\x6a"
- "\x3a\x1c\x32\x29\xdb\x75\xbf\x25\xb7\x70\xce\x21\x93\x6e\x49\xf7"
- "\x5b\x52\x1e\xe5\x90\x49\x46\xea\xb7\xe4\x51\xc4\x6f\x49\x19\xee"
- "\x71\xc8\xe4\x00\x39\x1c\xd2\xde\x6f\x4b\x4e\x37\x1d\x1e\xb9\x64"
- "\xbc\xeb\x7e\x5b\x72\xdc\x39\x8f\x5c\x22\x63\xcf\xe2\x25\x1a\xca"
- "\x23\x97\x1c\xa6\x7e\x5b\xca\xed\xc1\xb2\x64\x94\x7b\x3c\x72\x89"
- "\xd3\xfa\x1f\x42\x3c\xd2\xde\x6f\xcb\x12\x9a\x0e\x97\x5c\x26\x81"
- "\xff\x2f\x9b\xef\x9c\x4b\x2e\x93\xc1\xff\x97\x05\x52\x2e\xb9\xcc"
- "\x8a\xff\x2f\xe3\xf8\xff\x32\x0f\xf7\xb8\xe4\x32\x17\xf8\xbf\x3d"
- "\x97\xb4\xf7\xdb\x8a\xbe\x4d\x87\x4f\x2e\x3f\xed\xba\xdf\x56\xf4"
- "\x72\xce\x27\x57\xc8\xd8\x07\x6a\xb9\x8e\xf2\xc9\x15\x5d\xa9\xdf"
- "\x56\xc4\x11\xbf\x2d\x3f\xe6\x1e\x9f\x5c\x31\xd4\x99\xdf\x4c\x7e"
- "\x23\x0d\x8c\x40\x1e\xb2\x30\x7a\x00\x57\x9b\x30\xc5\xc3\xe4\x3f"
- "\xd2\x20\x75\x7f\x17\x4b\xcd\xe9\xb3\xd1\x08\x5d\x55\xfd\x25\xc7"
- "\xbd\xba\xd3\x7f\x19\xed\x7e\xdd\xe9\xbf\xb4\xaf\xbf\xfd\x5d\xfe"
- "\xa2\x90\x5e\x77\x7a\x65\x01\xe5\xa0\x7f\xf1\xa1\xbe\x4e\x61\xe7"
- "\x27\x48\xab\x47\xbd\x32\xcd\xbd\x7a\xd4\x7f\xc9\x24\xf8\x5a\x19"
- "\x4a\xea\x51\xff\x25\xb5\x71\xf6\x7d\x59\x61\xc4\xf5\xa8\x99\xb5"
- "\xcf\x96\xc8\xab\x8f\x9c\xe2\xe3\x1c\xcf\x41\xf1\x8c\x40\x8e\x96"
- "\xe2\x79\xf5\x79\x93\x7f\x50\xbc\xd4\x7d\x66\xf8\x78\x5e\x3d\xdb"
- "\x3d\x3c\xaf\xee\xe4\x3e\x9e\x57\xdd\xa8\xbf\x7d\x66\x56\x9d\x93"
- "\x8e\xe7\x55\xd9\x94\x9b\xaf\xd2\x51\x3c\x7f\xe4\x27\x1d\xcf\xab"
- "\xc2\xdd\xc3\xf3\xea\x28\x82\xe7\x55\x6a\x82\xe7\xd5\x93\x1b\x67"
- "\xff\x99\x94\x02\x82\xe7\xe7\x02\xe4\xd5\x9f\x5e\xad\x73\x01\xcf"
- "\x06\x46\x20\x7f\x4d\xf1\xbc\x66\x3b\xe0\xd9\x20\x75\xbf\x1b\x3e"
- "\x9e\xd7\x0c\x71\x0f\xcf\xa9\xb7\xdc\xc7\x73\xea\xd1\xfa\xdb\xef"
- "\x26\x75\x9b\x74\x3c\xa7\xc6\x50\xcd\x92\x7a\x90\xe2\x79\x4d\xb9"
- "\x74\x3c\xa7\xf6\x76\x0f\xcf\x6b\xfa\x11\x3c\x7f\xa4\x27\x78\x5e"
- "\xd3\xb3\x71\xf6\xc1\xf9\x28\x9b\xe0\xb9\x6b\xb8\xbc\xfa\xde\x6b"
- "\x44\xeb\x1f\x53\x3c\x07\xc7\x33\x02\xb9\x7d\x8a\xe7\xb4\x38\x93"
- "\x7f\x70\xbc\xd4\x7d\x77\xf8\x78\x4e\x73\x73\x9f\x8b\x75\xf5\xb0"
- "\xcf\xc5\x3a\x37\xf6\xb9\xb0\xdd\x77\x67\xdd\x5c\xe9\x78\x5e\x37"
- "\x98\x6a\xb9\x75\xc9\x14\xcf\x69\x87\xa5\xe3\x79\x1d\x72\x0f\xcf"
- "\x69\xdc\xfe\x17\x6b\xb5\x04\xcf\xeb\x8c\x8d\xb3\x1f\xcf\xda\x18"
- "\x82\xe7\xdf\xed\x94\x57\x3f\x3d\x2d\xd9\x05\x3c\x1b\x18\x81\xf7"
- "\x1e\x14\xcf\x1f\x0f\x07\x3c\x1b\xa4\xee\xff\xc3\xc7\xf3\xfa\x4b"
- "\xee\xe1\x79\xfd\x1a\xf7\xf1\xbc\xfe\x9d\xfa\xdb\xff\x67\xfd\x30"
- "\xe9\x78\x5e\xef\x45\x35\xee\x7a\xab\xf7\xff\x1f\x2f\x97\x8e\xe7"
- "\x74\x37\xf7\x05\x5a\x7f\x81\xe0\x39\x9d\xdb\x17\x68\x7d\x41\xe3"
- "\xec\x0b\x94\x3e\x98\xe0\x39\x50\x2f\xaf\x3e\xfd\xc7\xa1\xce\xf1"
- "\x1c\x12\xcf\x08\xbc\x13\xa2\x78\xde\xe0\x67\xf2\x0f\x89\x97\xba"
- "\x0f\x11\x1f\xcf\x99\xfb\xdc\xc3\x73\xe6\x14\xf7\xf1\x9c\xd9\xbd"
- "\xfe\xf6\x21\xca\xf4\x95\x8e\xe7\x8c\x32\xaa\xfd\x33\xad\xde\xff"
- "\x6d\x90\xb1\x3f\x51\x46\xae\x7b\x78\xce\xdc\x41\xf0\x9c\x11\x4e"
- "\xf0\x9c\x99\xdd\x38\xfb\x13\x65\x78\x11\x3c\xbf\x30\x40\x5e\xfd"
- "\xff\x0d\x4e\xe7\x7f\x08\xe5\x37\x2c\x79\x29\x8a\xe9\xac\x0a\xf7"
- "\x73\x1c\x59\x4b\xdc\xc3\x74\x56\x1f\xf7\x31\xfd\x89\xa9\xfe\x72"
- "\x1c\x9f\xc8\xd8\xeb\xef\x93\x83\x34\xc7\xf1\x49\x35\xc5\xf4\xc6"
- "\x40\xe9\x98\xfe\x24\xce\x3d\x4c\x67\x2d\x24\x98\xfe\xa4\x2f\xc1"
- "\x74\x96\xa6\x71\x72\x1c\x1b\x74\xee\xe5\x38\xb2\xaa\xe5\xe4\x38"
- "\xec\x31\xbd\xf9\x98\xfb\x79\x8e\xcd\x13\xdc\xc3\xf4\xe6\x16\xee"
- "\x63\x7a\xd3\xb9\xfa\xcb\x73\x6c\x3a\x2a\x1d\xd3\x9b\x96\xd3\x3c"
- "\xc7\xa6\x7c\x8a\xe9\xcd\x46\xe9\x98\xde\x14\xe4\x1e\xa6\x37\x8f"
- "\x26\x98\xde\xe4\x49\x30\xbd\x79\x78\xe3\xe4\x39\x36\x1e\x76\x2f"
- "\xcf\xb1\x39\x5f\x4e\x9e\xc3\x1e\xd3\x5b\xd2\xdc\xcf\x75\x6c\xe9"
- "\xee\x1e\xa6\x73\x2e\xba\x8f\xe9\x9c\x1d\xf5\x97\xeb\xc8\x59\x23"
- "\x1d\xd3\x39\x61\x34\xd7\x91\x93\x4d\x31\xbd\xa5\x44\x3a\xa6\x73"
- "\x3a\xba\x87\xe9\x2d\x5d\x08\xa6\xb3\xcb\x08\xa6\xb7\x04\x34\x4e"
- "\xae\x23\x3b\xc5\xbd\x5c\xc7\x96\x6c\x39\xb9\x0e\x7b\x4c\x6f\x8b"
- "\x74\x3f\xdf\x91\x6b\x72\x0f\xd3\xb9\xfb\xdc\xc7\x74\xee\xc2\xfa"
- "\xcb\x77\xe4\x46\x48\xc7\x74\xae\xd5\xfe\x17\xb9\x56\xeb\xff\xb7"
- "\x6d\x97\x8e\xe9\xad\x7a\xf7\x30\x9d\x7b\x8f\x60\x7a\xeb\x41\x82"
- "\xe9\xdc\xca\xc6\xc9\x77\x6c\x9d\xec\x5e\xbe\x63\x9b\xd3\xfa\x17"
- "\x42\xf9\x0e\x7b\x4c\x6f\x1f\xe0\x7e\xce\xe3\xb3\x73\xee\x61\xfa"
- "\xb3\x25\xee\x63\xfa\xb3\xd1\xf5\x97\xf3\xf8\xac\x9f\x74\x4c\x7f"
- "\x86\x68\xce\xe3\x33\xab\xf9\x4f\xdb\xe3\xa5\x63\xfa\xd3\xd3\xee"
- "\x61\xfa\xb3\xb3\x04\xd3\x9f\x2e\x27\x98\xfe\x4c\xdb\x38\x39\x8f"
- "\x4f\x7b\xbb\x97\xf3\xd8\x3e\x5c\x4e\xce\xc3\x1e\xd3\x5f\x78\xb9"
- "\x9f\xf7\xf8\x7c\x87\x7b\x98\xfe\x7c\x82\xfb\x98\xfe\xbc\x4b\xfd"
- "\xe5\x3d\x3e\x6f\x25\x1d\xd3\x3b\xce\xd3\xbc\xc7\xe7\x56\xf5\xef"
- "\xbf\x18\x25\x1d\xd3\x3b\xb2\xdc\xc3\xf4\xe7\x39\x04\xd3\x3b\xc2"
- "\x08\xa6\x3f\xcf\x68\x9c\xbc\xc7\x0e\x0f\xf7\xf2\x1e\x5f\xd8\xcd"
- "\x7f\x9b\x17\x35\x27\x52\xfd\xfe\x8c\x19\xf3\xa2\xe2\xd4\xf3\x62"
- "\x66\x4e\x8f\x1a\xd2\xcd\xf2\xf7\x90\xde\xf1\xdd\xe2\x9f\x44\x91"
- "\xb3\x23\xa6\x2e\x78\x99\x7e\x19\x13\x35\x07\xfe\x79\x12\x45\x47"
- "\xcc\x8b\x56\xc7\x2d\xd4\x44\xa9\xf1\x5f\xb3\xa7\x6b\xe0\x94\xf7"
- "\xe3\xe8\x91\x37\xa3\x62\x22\xe2\x67\xce\x79\x4f\x1d\x11\x33\xf3"
- "\xbd\x39\xb3\xa3\xe6\xc4\xa9\x63\xa3\xe6\xce\x9f\x19\x1b\x85\xff"
- "\x3f\x4f\x3d\xe3\xfd\x58\x38\x30\x3d\x6a\xe6\x82\x28\xf5\xb4\xf9"
- "\x33\x66\x44\xc5\xce\x7b\x12\x8d\x9e\x1f\x13\x37\x53\x13\x13\xa5"
- "\x1e\x3e\x7a\x58\xaf\xf1\x23\xde\x1a\xff\xea\xab\x4f\x22\xab\xbd"
- "\xa7\xd5\x4c\xc6\x2c\x3d\x60\xc8\xe3\xba\xea\xcb\xb3\x45\xf0\x34"
- "\x6b\x00\x9b\xeb\x62\x91\xcf\xaa\x58\xe4\x91\x52\x85\x3c\xd7\x54"
- "\x21\x2f\xf5\x2c\x34\x94\xf1\x5d\x91\xb6\xae\x0a\xf9\x31\xed\xda"
- "\xc4\x33\xe9\xc7\x73\x19\xdf\xe3\x3a\xbd\xef\xe7\xf8\x98\x0f\x93"
- "\xbe\x23\x1f\x7f\x07\xbe\xf0\x60\xd2\x4f\x04\x5d\x55\x7d\x99\xa2"
- "\xf7\xfd\x42\x93\x74\x03\x29\x99\x36\x3b\xe3\xf7\x9b\xf5\xca\x93"
- "\x78\x26\x0d\xd8\x0a\xa9\x76\xa5\xc1\x27\x01\xa9\x76\xf7\x84\xcf"
- "\x60\xf8\x2c\x87\xcf\x5e\xf8\x1c\x46\xaa\x3d\x6a\xf8\x44\xc3\x27"
- "\x0b\x3e\x70\x6c\x8f\x16\x3e\x05\xf0\x39\x8f\x54\x7b\xe1\xf8\xde"
- "\x14\xf8\xc0\x77\x7b\x0f\x92\x76\xf6\xe6\x21\xd5\xbe\x01\xf0\x49"
- "\x86\x0f\x5c\xbf\x1f\x8e\xef\x2f\x43\xaa\x03\x70\xde\x7e\x23\xfc"
- "\x1b\x00\x1f\x68\xf3\xc0\x70\xf8\xe0\xeb\x8f\x91\xef\x0e\xf6\x85"
- "\x8f\x06\x3e\xd0\xc6\x41\xf8\x9d\x83\x3a\xf8\x54\x23\xd5\x21\x04"
- "\x1f\x4f\xf8\xc0\xbd\x1d\x82\x73\x0e\x05\xc1\x07\xee\xe1\x50\x3e"
- "\x7c\x2a\x91\xea\xaf\xd0\xce\x5f\xe1\x37\xbe\xf4\x80\x4f\x0a\xf7"
- "\x19\x65\xf5\x7f\xfc\x49\xb6\xf9\xdb\xf6\x93\xeb\xbd\xe4\x59\x9d"
- "\xb6\x87\x11\xfa\xed\xae\x5b\xa6\xa5\x48\x65\x4a\xff\x42\xa3\xe9"
- "\x81\x14\x37\x55\xbb\x8e\x16\x83\xca\x65\x7c\x8e\xe7\x6a\x17\xd5"
- "\xe0\xef\x8f\x62\x9b\x3d\x58\xbb\x2b\x4f\x87\x3e\x0e\xc2\xfd\x53"
- "\x1a\x3e\x77\xe5\x71\xd7\x1b\x74\x8a\x5e\x3a\x7c\x3d\xb3\x3e\xa4"
- "\x2f\x93\x14\xb6\x19\xaf\xc3\xbd\x8e\x6d\x88\xfb\x4d\x5a\x70\x2a"
- "\xe3\x33\xdc\x0b\xc7\x18\xed\x22\xf6\xbe\xd2\xa1\xbf\xb5\x81\xeb"
- "\xd3\x18\xf0\xa3\xde\x1f\x7c\xbe\x14\x79\xb0\x7f\xa7\x7f\x9e\xc6"
- "\xe4\xce\x2f\x25\x71\x67\x37\xab\x5f\x1e\xfa\x4f\xed\x8d\xbf\x33"
- "\xec\xe8\x5f\xc2\x6c\x1f\x14\xae\x9d\x53\x83\xca\x55\xbb\x17\x43"
- "\xfc\x53\x32\xbf\xeb\x5f\x62\xde\x30\xb5\x77\x1e\x60\x00\x9f\x73"
- "\x34\xb1\x02\xff\x9b\x0a\xcf\xad\x64\x32\xa6\x1a\x70\x0e\x48\x9b"
- "\xb8\x1e\x62\xf2\xae\xf4\x87\xfe\xf3\xb5\xea\x10\x6f\xe6\x2a\xfe"
- "\x1d\x25\xae\xb7\xbe\x9b\x9b\xcf\xbf\x2b\xed\xa1\x7f\x9b\x64\xdc"
- "\xb6\x29\x77\x41\x32\x7c\xe7\xc1\x00\xf6\xe0\x1e\x14\xb7\xe1\x3a"
- "\x53\x66\x9b\x78\x6d\x08\xfe\xcd\x3d\xed\xe1\x3e\x95\x49\xc1\xd0"
- "\xf6\xa7\x0b\x92\x0f\x2c\x32\x28\x19\x7c\xef\x7e\x6d\xe2\x01\xeb"
- "\x5e\xa6\xb5\x5f\x84\x6d\x6c\x8b\x3c\x72\xd6\x23\xb4\xb5\x2d\xf2"
- "\x7c\xb0\x76\x8f\x8f\xce\xa3\x97\x17\x89\x7b\xbb\xd2\x94\x70\x0e"
- "\xfc\x66\x25\x03\xfe\x60\x7f\x2b\x63\xa2\xc6\xc1\x6f\x45\xd4\xfd"
- "\xd6\x86\x89\x1a\xfc\x5b\xac\x7d\x88\xad\xc8\xff\x2d\xed\x6c\x1f"
- "\xe0\xe8\x9e\xa7\xe0\x36\x74\xaa\x3d\xa1\xcc\xe7\x03\x92\x4d\x1b"
- "\x22\x92\xf1\x77\xf8\x7c\x62\xff\xcf\xd3\xbc\x97\xa0\x6a\x06\x8e"
- "\x99\x38\x1f\x98\xb0\x0f\x94\xc9\x10\xbf\x76\xf7\xc6\xbf\x07\xd7"
- "\x66\x9b\x96\xaa\x91\x3a\x04\xa1\x4a\xd5\x5e\x36\x37\xc1\xf8\x84"
- "\x54\x13\x1f\xef\xb9\x17\x9f\xcf\x98\xe1\x63\x7a\xe9\xff\xb5\xf7"
- "\x3d\x00\x51\x55\xd9\xff\x67\xde\x3c\x15\x0d\x9d\xd1\x00\xc7\x42"
- "\x7d\x2a\xe8\x58\xa8\x58\x96\xd6\xcf\x5a\xb6\x6c\x05\x34\x61\xf7"
- "\x67\x7d\xa7\xb2\xc4\x22\x43\x33\xc5\xff\x93\x1a\x20\x59\x3f\x6b"
- "\x0d\x90\x90\xaf\x15\x82\xed\xea\xae\xed\x62\x51\xab\x1b\xb6\x96"
- "\x53\xe2\x7e\x51\x51\xa8\x74\xd7\x5a\xdd\x46\x22\x63\x0d\x6d\xd2"
- "\x49\x46\x98\x99\xfb\x3d\xe7\xdd\xf7\x98\x37\xc3\xa0\x80\xb6\x5b"
- "\xfe\x7c\xf5\x9c\x79\xf7\x9d\x7b\xee\xb9\xe7\x73\xfe\xdc\x7b\xdf"
- "\xf0\x6e\x25\xe8\x6c\x89\x84\x6f\x69\x98\xf4\x8b\x6e\xa8\xe7\xd2"
- "\xf0\x16\xfd\x0e\x5a\x42\x3a\x32\xa2\x5e\x42\x3d\xcf\x0f\x75\x30"
- "\x41\x02\xea\x87\x56\x5f\xd4\x9f\xc6\x9c\xd2\x09\x01\x3a\x33\x26"
- "\x24\x64\x32\x0d\xef\x9e\xda\xfe\x23\xfd\x22\xbb\x6e\x98\x99\xe8"
- "\xa5\xc1\xb2\xcd\xad\xf5\x28\xf7\xc9\xee\x09\x67\x16\x3e\xdb\x41"
- "\xd7\xf7\x0d\x07\xa3\xa1\x12\x04\x29\x23\xaa\x9c\xdb\xc3\x74\x17"
- "\xf6\x2d\x85\xf3\xc3\x3e\x16\x4e\x8e\xc7\xba\x66\x9f\xfd\x95\x3a"
- "\x3c\x6b\x13\x1b\xce\x87\xa7\x94\xb9\xd6\x3d\x90\xce\xf2\x12\x1b"
- "\xe8\xef\xcf\xb1\x5f\xff\x92\x75\x90\x1d\x02\x5c\x8e\x44\x47\xc6"
- "\x1c\xe6\xc8\xf8\x0e\xdb\x8a\x48\x29\xdb\xb1\xc4\x81\x98\x3d\x90"
- "\x4e\x36\x51\x7e\xce\x25\xd0\x3b\x01\x59\xaf\xdf\x2f\x2b\xe6\x7d"
- "\x0d\xc1\xbe\x02\xf1\x6d\xcc\xd9\x1a\xeb\xeb\x6b\xe9\x21\xb2\x0f"
- "\x96\x37\x49\xe4\x6d\x23\xdf\x6c\x6c\x63\xed\x24\x11\xe9\x2c\x76"
- "\xdd\xa7\xe9\xb2\x7f\x2d\x61\x87\x72\x9b\x00\xce\x2e\x61\xee\x24"
- "\xf7\x17\x5e\xcc\xcb\x80\xf7\xad\x76\x98\x10\xa2\xea\x8c\xfb\x5c"
- "\x0b\x1f\xf9\x5d\x11\x8e\xde\x32\x9f\x8d\xc1\xf8\xd8\xf5\x5b\xd3"
- "\xa6\xbb\x25\x5d\xd3\x39\x56\x93\x7b\x3f\xca\x96\x0d\xac\x69\x09"
- "\xab\x7a\x26\x9e\xb9\x72\x3e\x01\x1c\x1b\x1d\x05\x8c\xb5\x91\xbd"
- "\x74\xcc\x91\xf4\x34\x18\x7a\xa5\x1b\xd8\xde\xca\xa3\xb0\x3c\x9e"
- "\xd5\x57\x5b\x3d\x70\xd0\x59\x07\x2b\x3e\x83\xd0\xcc\x03\x10\xb6"
- "\x22\x9e\x39\xaa\x52\x8e\x02\x2f\x3f\x00\x99\xc7\x41\x5c\x5e\xc1"
- "\x5c\x53\x30\x4f\xef\x3f\x4a\xe5\x75\x58\xee\x81\xcc\x7a\xe6\xce"
- "\x78\x18\x42\xe9\xfb\x81\x0a\x2a\xff\x0a\xd0\x9f\xc5\x24\xab\xc3"
- "\x50\x8c\x6d\x52\xfd\x12\x94\xc5\x7b\x8e\xed\xcc\x3d\x07\xb0\xfc"
- "\x01\x30\xad\x98\x01\xc6\x24\x1c\x2e\x54\xbb\xb7\x43\x92\x87\xe1"
- "\x38\x60\x0f\x3c\x33\x0b\x42\x92\xdc\xf4\xf7\xe3\x87\xf1\xdc\x00"
- "\x25\x48\x8b\x7d\xb3\x51\xdf\x96\x1f\xc3\x71\xd1\x29\xb5\xce\xfb"
- "\x4a\x9d\x63\x40\x3a\x3b\xdf\xfb\xfd\x1a\xd7\xda\x0f\x92\xb1\xef"
- "\x73\x48\x07\xd8\x4e\x8d\x97\xea\x9d\x93\xf3\x13\xe9\x40\x37\xdd"
- "\x8d\xb6\xba\xce\x92\x3c\xdd\x6a\x93\xf9\xda\xf5\x6f\x6e\x29\x59"
- "\x20\xcb\xe4\x47\x9b\xe4\x66\x67\x1d\xe1\x16\xe4\xf5\x66\x4d\x92"
- "\xf5\x67\x4c\xc1\x0d\x71\x79\xcb\xa8\xea\x5b\xc5\xc5\xae\x7f\x4b"
- "\x44\x2c\x40\x9f\x0e\x88\xc7\x5b\xb1\x76\xdd\xdf\x26\x6b\x6c\x97"
- "\xe2\x56\x57\x95\x56\xa1\x99\x6a\xd7\x1d\x2a\xf0\xd1\xfc\x21\x0a"
- "\x6d\xba\x85\x06\xef\xa3\xfd\x1f\x2e\xf2\xdd\x97\xed\xb9\xe5\xbe"
- "\x92\x7f\x55\xde\x7a\x66\xbc\xdb\xee\x09\x4f\x01\x16\x6e\x30\xb2"
- "\xb3\xa6\x50\x26\x20\x36\x6e\xe6\xf2\xae\x9b\x94\x8c\x39\x36\xb4"
- "\xda\xed\x04\x4e\x5f\xd6\x8f\xad\x33\x98\xf8\x6f\x5e\xcb\x74\xc4"
- "\x13\xc7\x62\x1b\x31\x5f\x1b\x93\x2a\x99\x8b\xe2\x87\x67\x5d\xdf"
- "\xbc\x9c\x05\x98\xb3\xd7\x4d\x77\x78\xc3\x1f\x02\xd7\xeb\x8b\x6b"
- "\x28\x27\x90\xbf\xb1\x02\xac\xab\xf0\xc1\x76\xbb\x60\xbf\x8f\x78"
- "\xb0\x3e\x2b\x98\x94\xcc\xcb\x79\x7c\xe3\x71\xe8\xad\x23\x2c\x1a"
- "\xef\xe5\xdd\x5d\x87\xf7\xba\xd4\xea\xcb\x52\xb1\x1c\x58\xde\x84"
- "\x48\x5b\xc6\x19\xe2\x31\x8b\xdb\xf4\xdd\x76\xbf\x6b\x81\xf4\xf9"
- "\xc7\x6d\x14\xa3\x28\x36\x61\xf9\x0b\xbe\x38\xc1\x73\x00\x8f\xed"
- "\x93\x52\x1a\x73\xca\x8a\xec\xba\xd1\x16\xd2\x13\x61\xeb\xe4\x71"
- "\x6d\xa3\xe7\xf5\xc5\x47\x76\xc7\x03\xec\xae\x20\x3f\x2a\xb3\xd9"
- "\x75\x37\xcf\xf1\xe9\xb2\xec\x33\xa2\x95\xe5\xc4\x58\x42\xdf\xe5"
- "\xb8\x82\x75\xd0\xcf\x37\x52\xce\xe2\xf1\xb1\xec\x10\xe5\x2d\x8c"
- "\x13\x21\x3c\x4f\x8d\xb3\x20\xef\x0a\xd6\x27\xa3\x0c\xe5\xca\xaa"
- "\x55\x64\xd1\xca\xa6\xc6\x45\xb6\x36\x33\x96\xd3\x4e\xc2\x7c\xf1"
- "\x76\x9c\x5d\x37\x66\x82\xd6\x5e\x78\xbf\xde\x7e\x03\x6d\xfa\xc8"
- "\xa8\x0a\xbc\xc6\xb1\x94\xca\x0f\xe3\x4b\x08\xc6\x95\x7c\xb2\x37"
- "\x8a\x29\xeb\xf3\x69\x7c\x94\x39\xce\xb5\x36\x33\x0e\x79\xad\x51"
- "\x63\x0b\xd5\x25\x7f\xc0\xf8\x12\x22\xc7\x0d\x8f\x5b\x2f\xfb\xbc"
- "\x07\x62\x5a\x62\x09\x96\x9d\xef\x9d\x39\x4e\x29\x17\x65\x99\x04"
- "\xbd\x17\xdb\xd7\xa9\xed\x9d\xef\x9d\xe8\x42\xbe\x75\x76\xdd\x20"
- "\xab\x5f\xac\xc9\x8f\xcb\x62\xcc\x42\x76\xa3\x3f\xa1\x7f\xa7\x3b"
- "\x7e\x76\x53\xec\xf4\x9a\xdd\x95\x00\x13\xee\xc1\x36\x10\xcf\x57"
- "\x22\x98\xa3\x31\xe7\x9d\x28\x3b\xcc\x97\xe5\x7a\x01\xaf\xa9\x9c"
- "\x68\xb0\x7c\x3c\x96\xbb\x39\xdf\x3f\xc4\x12\x3e\x01\x7c\x67\x71"
- "\xbe\xef\x3c\x45\xfc\x94\x1c\x7f\x0d\x7d\xa7\xfa\xc4\x7b\x43\x21"
- "\x6b\x20\x7e\xc8\x6b\xb5\xda\xc6\x4b\x58\xa6\xb6\x33\xe1\xa9\x96"
- "\xb6\xb6\xe0\xfd\x55\xda\x3e\xac\x2f\x64\x4e\x45\xbe\x0a\x3b\x3c"
- "\xe7\xa0\x7b\xab\xb1\x8c\xea\x72\x5b\x78\xe7\x38\xd9\x89\x9d\xf7"
- "\x4b\xcf\xed\xe5\x1d\x87\x1d\x56\x59\xb5\xb9\x07\xb1\xe8\xa9\xe6"
- "\x26\xce\xef\x4f\x61\x2a\x3f\x1f\x2f\xce\x83\xe5\x65\xc5\x2a\xbe"
- "\x40\x3e\x1b\x4a\xfc\x91\x7e\x82\x1d\x16\x56\x71\xd9\xfe\xb8\xcd"
- "\xc9\x6d\x1b\x31\x90\xeb\x70\xcc\x73\x7e\xbf\x91\xf2\x66\x49\x3e"
- "\xc5\xb1\x44\x27\xd6\xb1\x06\xe4\xcc\x10\x9e\xcf\x52\x24\xb2\x0d"
- "\xc5\xff\x77\x90\x4c\x6a\x7f\x91\x8f\x88\x7c\xde\x21\x9b\x26\x3e"
- "\x18\xe7\xec\xc8\xc7\x16\xc0\x47\x24\x3a\x1c\xd7\x7c\x4d\x39\xfa"
- "\xe5\x08\x56\x8f\x34\x75\x2a\x0d\xdd\x47\xbd\xde\x89\x65\x2e\x3b"
- "\xac\x5d\x41\x65\x39\x48\x63\xd7\x6f\x69\xf3\xef\x76\x32\x06\x81"
- "\x50\x5d\x64\xa7\x39\x2d\xf9\xef\xf8\xea\x48\x27\x54\x17\x79\xc1"
- "\xfb\xbb\xdb\x20\x2e\x83\xd9\x4e\xe8\xb7\x2d\x3e\xe8\xaa\xef\xe0"
- "\xdc\x7f\x5b\x9c\x6c\x87\x4d\x38\xf7\x5a\x71\x13\xd0\xb8\xe4\xb4"
- "\x7e\xfb\xe6\x6a\xc7\x19\x39\x96\xe1\x77\x39\x07\xbe\x8c\x73\x35"
- "\x9a\xaf\xe1\x9c\x3c\x2d\x4f\xe0\x73\x36\x2f\xd2\x16\x53\x39\xcd"
- "\xe7\x30\x47\x95\x68\xee\xb1\xdf\x8d\xcd\xe2\xba\xdb\xfe\xb0\x1c"
- "\xd3\x49\x5e\xf7\x44\x1b\xc9\xec\xdd\x34\x36\x8b\xfa\x90\x69\x65"
- "\xde\x6a\x77\xa3\x8d\xf2\x98\xb4\x84\xe6\x9a\xdb\x6f\x4b\xda\x00"
- "\xcc\xbb\x79\x6c\x07\xe7\x7a\xdb\xe5\xbf\xbd\xc1\xf9\xf8\x69\x47"
- "\xf4\xd8\xac\x4c\x0f\x08\xb9\x19\x5d\x42\xee\x2e\x62\xb6\xb3\x43"
- "\x6f\x43\xbb\xd8\x3e\xed\x43\x2b\x40\xc7\xc7\xe8\xdb\xa7\xa9\x7d"
- "\x2f\x56\xfa\x8e\xfa\x92\xff\x5e\x64\xd4\xfa\x2c\xb9\xbf\x48\xd3"
- "\xe6\xbb\xde\x58\xb6\x81\xed\x2e\x72\xc3\xc2\x22\xd6\xb4\x70\x03"
- "\x08\x38\x46\xaa\x79\xab\xf8\x08\xc5\xed\x38\x55\x9f\xb2\xee\xdc"
- "\x0e\x48\xcf\x00\xe3\x49\xfd\x9f\xef\x48\x5a\x91\x25\xef\xdd\xb4"
- "\x0b\xe9\x3a\x26\xeb\x9f\xe5\x77\x0f\x1c\xc4\xf9\x7d\x92\x3b\x93"
- "\xf1\xdc\xf3\xe7\xc7\xa7\x28\xfc\xe8\x9e\x8a\x5f\xb1\x32\xef\xee"
- "\x44\x1b\x6d\xbe\xff\xe3\x02\x7d\x35\x06\xef\xeb\xbb\xc3\x2f\xa1"
- "\xaf\xce\xd6\x7d\x7d\xf7\x97\x97\xb7\xaf\xef\xb6\xb9\xff\xd7\x05"
- "\xfa\x2a\x05\xef\x6b\x79\x78\xe7\xfb\xfa\xae\xbd\x75\x5f\xcb\xef"
- "\xb8\xbc\x7d\x2d\x6f\x73\xfd\xef\x02\x7d\x8d\x0d\xde\xd7\x1d\xba"
- "\xce\xf7\xb5\xbc\xaa\x75\x5f\x77\x0c\xbf\xbc\x7d\xdd\x11\xdb\x66"
- "\x5f\x05\x03\xa3\xf8\x84\x71\xa9\x29\xe3\x3c\x8e\xd9\x0a\x1f\xcd"
- "\x7b\xe6\x75\x10\xaa\x9c\x2e\x38\x18\x79\x04\x32\x9f\x06\x61\x64"
- "\x3a\xc6\xbd\x6c\x18\xcf\x0a\x7b\xe5\x1d\x2c\x6a\xc0\xf2\x13\x70"
- "\xc0\xea\x82\xb8\x05\x14\x7f\x77\x7c\x5f\x9d\xda\xd1\xf8\xbb\xc3"
- "\xd6\x12\x7f\xdd\x37\x29\x31\xf7\x2f\x83\x0e\x36\x34\x01\xf5\x1f"
- "\xbf\xf7\x6c\x89\xbf\xd9\x5c\xdf\x81\xf1\x97\xf4\x51\xed\x72\xf9"
- "\xc5\x5f\xfe\xf7\x5b\xef\x7d\x16\x18\x7b\x73\x4e\x02\x04\x8f\xbd"
- "\xef\x6d\xa7\xd8\x5b\x8c\xf7\x3b\x26\xff\x7b\x59\x6a\xec\xcd\xc3"
- "\x36\xb5\xb1\x77\x77\x2a\xe5\xe4\xf7\x8e\x74\x2e\xf6\xbe\x77\x44"
- "\xed\xf7\x06\xa5\xdf\x58\x36\xde\x3f\xf6\xfe\xa5\xcd\xbf\x75\xd1"
- "\xda\x2d\x2b\x9c\x58\xf6\xd6\x00\x57\x17\xef\xa6\xdb\x6c\x94\xdf"
- "\x1a\x51\x27\xef\x16\xbb\xc4\x13\xfa\xbf\xf0\x77\x15\x34\xa6\xea"
- "\xd8\xa6\x71\x69\x49\x8b\xd8\x17\x2c\xfa\x36\x1b\xad\xa1\xd2\x5a"
- "\x00\xde\xdf\xc3\x36\x8f\x4b\xeb\x98\xdc\x9c\x27\xe6\x3f\xc8\x40"
- "\x7f\x79\x6b\x89\x4b\xf0\x2e\xb7\x18\x10\x07\x23\x5b\x37\xc9\xc1"
- "\x9e\xbf\x75\xe7\xd9\x75\x33\x52\xf6\x98\xbf\x02\xa2\x65\x2b\xc5"
- "\xb8\xce\xcb\xbf\x33\xf9\xc2\xf2\xef\x7c\xae\xe3\xf2\x73\x9e\xed"
- "\x93\x7f\x67\x72\xbb\xe4\x8f\x40\xf9\x9b\xc6\x75\xc1\x39\xa1\xb0"
- "\xab\x69\x9c\xd8\x41\x79\xec\xed\xc2\xf8\x92\xda\x78\xbf\xdd\xf1"
- "\x8f\x45\x58\x1c\x6f\x15\x3b\x04\x8c\x01\x72\x0e\x27\xdf\xe3\xf1"
- "\xaf\x1e\x63\xd6\x17\x8c\xc7\x24\x47\x07\x63\xd2\xfb\x15\xed\x6f"
- "\xff\xde\xe4\xcb\xdf\xfe\x07\x6d\xf7\x3f\x30\x26\xbe\x79\xbb\xbd"
- "\xed\x98\x38\x39\xb9\x75\x4c\xdc\xd5\xbd\xe3\x31\xf1\x83\x43\xad"
- "\x63\xa2\xed\x16\x5f\x4c\xb4\x0d\xea\x7c\x4c\xdc\x75\xaa\xfd\x31"
- "\x71\xd7\xde\xce\xc5\xc4\x5d\x05\x17\x8e\x89\xbb\x1a\x3a\x17\x13"
- "\x77\x35\xb4\x8e\x89\xbb\x92\xfd\x63\xa2\xad\xcd\xbd\xfe\x58\x5e"
- "\x6c\x3c\xe6\xe8\xd0\x93\x7a\x9b\xd3\x9d\x0d\xe0\xcd\xfb\xe3\xea"
- "\x24\x0f\x6b\x64\x6b\x63\xe3\xbd\xc2\x18\x8a\x2b\x71\x8d\x8d\x69"
- "\x21\xde\xa5\xe6\x50\xd6\xe7\xee\x17\x59\xb3\x09\x50\x4f\x51\x28"
- "\xbf\x81\x35\x9a\x7b\xb1\xa5\xe6\x3e\x45\xe7\x20\x0c\x4f\x53\x91"
- "\x92\x8f\xf1\x7b\x2c\x5b\x6a\xea\x91\xb3\x04\x62\x0c\x4e\x08\x41"
- "\x19\x2c\x86\x95\x46\xc0\x18\x14\x46\xdf\x59\xf6\x6e\xb1\xe4\x1c"
- "\x88\x06\x2b\x62\xd3\x1b\xdb\xb3\x1a\x18\x5b\x68\x86\x92\x05\x10"
- "\xe2\x15\xc0\x54\x2c\xb0\x32\x77\xa3\x59\xf0\x84\xa5\x18\x39\x3e"
- "\x1f\x6e\x61\x11\x38\xf7\x2a\x98\x7e\xd4\x1b\x31\xbd\xc2\x93\x99"
- "\xa6\x67\xcb\x2d\x7a\x92\xd5\x53\x30\xdd\xc6\x0a\xf1\xcc\x4c\xeb"
- "\x45\x63\xe8\x92\x25\xd8\x76\xa3\xa9\x47\x2e\xb6\x5d\xbc\x04\xa2"
- "\x36\x9c\x03\x33\x3b\x6b\x16\x10\x7f\x0b\xed\x81\x8a\x3a\xb2\x78"
- "\x85\xdd\x22\xde\x13\x29\x26\x32\x6a\xdf\x8d\xed\x37\x9b\x69\x1d"
- "\x0b\x6d\x1b\x4c\x25\xd8\xbe\x67\xa9\xb9\x83\xfe\x22\x3f\x31\xd1"
- "\xa9\x72\x79\x63\xee\xb2\xb3\x37\xf1\x24\xb9\x50\x87\x25\xa4\x93"
- "\x91\x77\xd5\x91\x6c\x2f\x9d\x83\x18\x94\x33\x0a\x65\x30\x63\xbb"
- "\xf4\xfe\x18\xcb\x23\xf3\x8d\x64\xa3\x7e\xb2\x79\xd6\x2a\xb2\x7d"
- "\x8b\xb2\x9d\xf6\xc9\x46\x6d\x91\x7e\xda\x7a\x36\x9b\xf4\xcc\x00"
- "\xf2\xcd\xaf\x0d\xd6\x6e\xf1\xf4\x9c\xf6\xec\xf2\xb4\x0e\xda\xea"
- "\x47\x71\x6d\xd9\x4b\xee\x9b\x10\xc9\x8c\x9b\xcb\xa7\x3c\xf7\x05"
- "\xa3\x75\xc2\xe7\xde\x84\x98\x6a\xf4\xeb\x83\xae\x53\xc0\x7a\x6f"
- "\x2e\xdf\x63\x6e\xe8\x68\x5b\x6d\xbe\xff\xf4\xc5\x6c\x56\xe3\x0d"
- "\x4b\x01\x16\x36\xc3\x92\x9b\xcd\xac\xcd\x51\x63\x37\x36\x45\x8d"
- "\x4b\x9f\xee\x36\xa2\x5d\x33\xab\xb4\x00\xa4\x13\xfa\xca\xef\xf6"
- "\x1d\xc2\x79\xe9\x83\x10\x52\xab\xdf\x6b\xce\xfc\x8c\x9e\x61\xed"
- "\x1e\xef\xff\x0c\x6b\x77\x0a\xe8\x2b\x6a\x40\xbf\xc7\x0e\xfa\xff"
- "\x11\x01\xe9\xfc\xcf\x4a\x89\xf3\xaa\xd8\x9a\xf4\xc6\x00\xc8\x70"
- "\xb3\xaf\x59\x81\xa1\x32\x47\x60\xae\xa4\xe1\x3a\xbb\x6d\x09\x3d"
- "\xdb\xa9\xd8\x8c\x3a\xfd\x06\x73\xad\x01\xbf\xcf\x47\x4c\x21\x7d"
- "\x01\x5c\x7b\x52\x5f\x91\x4e\x7e\x63\x70\x76\x8b\xf7\x64\x5a\xc0"
- "\x2d\x2d\xae\x69\x2e\x98\xee\xf0\x14\x4c\x4a\xf6\x1a\xff\xb8\x9a"
- "\xd6\x79\xe9\x99\x2c\xfa\x86\x65\xba\x27\x84\xfc\xd1\x62\x7b\x74"
- "\x1f\x9c\x58\x04\x42\xe6\xf7\xd0\x13\x6d\xb3\xc5\xaf\xee\x6d\x30"
- "\xb8\x9e\x69\x60\x5e\xf2\x2d\x5a\x57\xc5\x7b\xbd\x32\xbe\xc7\xf9"
- "\xbd\xa3\x1e\x8a\x16\x40\x98\x67\x61\x5a\x1f\xc7\xd9\xb4\x6b\x5f"
- "\xf3\x42\x58\x2f\x27\x18\x8b\xce\xa0\x4d\x2d\x44\x7b\x3a\x83\x7e"
- "\xe6\xe0\x7e\x46\xef\x00\x28\x26\x1f\x7b\xf1\xe4\xfa\x92\x33\xdc"
- "\xc7\x64\x3b\x22\x1f\x9b\x87\x76\x34\x97\xf2\x07\xda\x51\x36\xfa"
- "\x18\xfa\x05\xcb\xf9\x48\x2a\xca\x66\xb4\xee\x2b\x94\x9c\xec\x46"
- "\xf7\x74\x5d\x86\x0b\xd2\xbe\x64\x17\xf8\xd6\x3a\xf6\x0e\x6f\x8a"
- "\x1e\x97\x2e\xfd\x8a\x7d\x5b\xab\xaf\x28\xc2\xf2\x10\xe9\xfe\x61"
- "\x46\xd4\xf7\x70\xbe\xee\xb6\xd7\x4c\x6b\x99\x76\xd4\x05\xe9\x45"
- "\xfa\x15\x0c\xab\xd5\xef\x9e\x4f\x7a\x5c\xba\x05\xf4\xe9\x77\xb2"
- "\x3a\xd4\x19\x3d\x67\x41\xda\xdd\xf2\x6f\x65\xe8\xb9\xff\x7e\xf9"
- "\x99\x1a\xaf\xe3\x41\xbd\xb9\xc3\x0c\x26\xc4\x5b\xb2\xcd\x6e\x92"
- "\xe3\x10\xe9\xf1\xc4\x1c\x10\xa6\x37\xa0\xae\x3c\xa8\xab\x46\x73"
- "\x28\xc6\xa3\x64\x8a\x47\x2c\xef\xee\x55\x2b\xec\xcc\x9b\x94\xaa"
- "\x67\x19\xf3\x21\x84\xd6\xb7\x1f\x49\x07\xf6\xcc\x29\xd4\x97\xf3"
- "\x08\x60\x5c\xea\x85\x31\xab\xcf\x86\x25\x10\x46\xfa\xea\xd9\x80"
- "\x63\x95\xfc\xdf\x67\xbd\x99\x51\xd9\xc5\x83\xf6\x4b\xf1\xc9\xb0"
- "\x52\xd7\x1d\xfd\xac\xd7\x1a\xf2\x47\xf4\x4f\xc3\x4a\x39\x5e\x5a"
- "\x8a\xd0\x0f\xdd\x4b\xcd\x83\x9b\x97\x9a\x25\x3c\x07\xa8\x31\x4c"
- "\x8d\x1f\xa8\xb3\xd5\x14\xbf\xaa\xad\x76\x70\xa3\x6e\x7b\x51\xae"
- "\x5b\x6a\x8e\x94\x75\xfc\x84\x19\x46\xb9\x40\x87\x32\x19\x51\x5e"
- "\x28\x99\x09\x21\x07\xd2\x6a\xc1\x83\xbe\xa1\xea\xfd\xde\x59\x12"
- "\x20\x5f\x61\x8f\xf9\x30\x28\x3a\xd3\xb5\x6d\x77\x7f\xf5\xf8\xec"
- "\xee\xaf\x1e\xd2\x1d\xb7\xbb\xbf\xba\xaf\x44\xbb\xdb\x6f\x91\xed"
- "\x4e\xdf\x1c\x2d\xdb\x93\xb5\xda\xfd\x0e\xea\xe8\xaf\xf5\x64\x23"
- "\x64\x33\x7b\xff\x40\x36\x53\x69\xfc\xb1\xda\xcc\xf9\x46\xb3\x84"
- "\xe7\x0f\x62\x33\xc8\x57\xb6\x19\xd2\xd5\x7e\x4b\x13\xa8\x3a\x92"
- "\x7d\x35\x6f\x73\xb9\x94\x09\x3f\x43\x5f\x35\x1b\x56\x0e\x80\x03"
- "\xb2\x9e\xf6\x9a\xa5\xfb\x99\xb7\x56\x5f\x99\x90\xf9\x31\x18\x9b"
- "\xb2\x19\xab\x76\x6f\x05\x6f\xd8\x43\x40\xcf\x27\xbd\x05\x7d\xf3"
- "\x70\xce\x4a\xbf\x0f\xb0\xd3\xda\xbb\x21\x9d\xd6\xbb\x7f\x97\xe7"
- "\x59\x37\xdb\xe1\x5d\xbb\xb9\x92\xf5\xfe\x20\x9e\x9e\x31\x78\xd7"
- "\x3e\x97\xe7\xed\xfd\xfe\xc6\xc6\x9c\xca\x3c\x3b\x7c\xc9\x9f\x77"
- "\x15\xa4\xd0\x18\x8c\xe2\xef\x0e\xfe\x3c\x8c\x9e\x1d\x56\x96\xa9"
- "\xcf\xbd\x29\x26\x28\xcf\x18\x94\x67\x10\x95\x84\x61\x0f\x7a\x06"
- "\xc1\x63\x4a\xe5\xeb\xea\x33\x08\xf5\x9a\xee\xdb\xf5\x95\x9b\xe4"
- "\xe7\xb0\x2d\xf5\xf6\x4a\x9c\x4e\xad\xb7\x3b\x9a\x62\xbd\xaf\x1e"
- "\xbf\xc6\xb8\x22\x35\x0b\x10\x12\x74\x8c\x13\x36\xdb\x81\xfe\x83"
- "\x73\xa3\x7d\xaf\xe3\xa7\x80\x7a\xf9\x10\x3f\xf5\xf8\x29\xaf\x63"
- "\x76\x2c\x5f\xed\x9d\xc6\x9f\x03\xcd\x58\xa5\xc4\xc6\x87\x65\x9f"
- "\xbc\x01\x7a\x9e\x54\xbe\x37\xe6\xec\x2d\x57\x9f\xdf\xb7\xd0\xfb"
- "\xf0\x99\x4a\x6d\x23\x46\x22\xff\x4d\x01\xbf\xa6\xdf\xeb\x28\xfc"
- "\xe4\x6b\x6f\xd4\xed\x29\xb6\x8c\x5a\x68\xd0\xef\x8b\xaa\xc6\x1c"
- "\xee\x2d\x9c\xb1\x8a\x9e\x8f\x91\x5f\xa9\xed\xa2\x2f\x86\xd8\x96"
- "\xc9\x34\xf2\xdf\x89\x7a\x0b\x2c\x29\xac\xd0\x90\x47\x73\xc1\x46"
- "\x96\x76\xa7\xf2\x79\x07\xf9\x13\x5f\x37\xd9\x37\x9f\x21\xb6\xb4"
- "\x87\x7b\xcb\x6f\x98\x68\x6f\xf5\x2c\x51\xfa\x70\x05\xcf\x95\xaa"
- "\xbc\xb4\xff\x3a\xfd\x46\x68\x58\x16\x64\x35\x06\xd9\x7f\xdd\xf7"
- "\x5b\xa2\x7d\xd3\xbc\xeb\x2c\x29\x8d\x39\xfb\x4a\x31\x97\x37\x68"
- "\xfb\x1c\x0c\x0b\xa4\x6f\xf3\x37\xed\x1d\xc3\x61\x5f\x5d\x5b\x7c"
- "\xee\x31\x7b\x58\xc7\x78\xed\x6f\x7b\xfd\x27\x6a\x2c\x24\x6d\xf1"
- "\xd8\xbc\xcd\x16\xc3\x9e\x15\xa7\x3a\x38\xb6\xd9\xdf\xe6\xfb\x7f"
- "\x3c\x05\x0f\x49\xcd\x43\xc7\x92\x2f\x87\x7a\xe6\x59\x26\x1e\xdc"
- "\xe2\x86\x37\xe6\xd6\x0b\x14\x0f\x4b\x4f\x96\x09\x49\xc3\x95\x31"
- "\x5c\x1d\x18\x69\xdd\x8b\xc6\x72\x39\xa7\x21\xaa\x29\xd3\x62\x68"
- "\x6a\xb6\xc0\xaf\x4f\xc3\x78\xef\x13\xa6\x1e\x6b\x66\x82\x78\x1e"
- "\x63\xe1\xf9\xaf\xd3\x0c\xfb\x8f\xd6\xc3\x2e\xac\x7b\xd0\x69\x87"
- "\x62\xa4\x65\x5f\x5b\x7a\x4d\x4a\x61\xae\xaa\x94\x77\x20\xc9\xec"
- "\xb1\x65\x1c\x87\x9e\x18\x13\x8d\xd5\xd6\xcd\x38\x87\x3a\x05\x5d"
- "\x9e\x16\xa4\x6a\xf7\x57\xf0\xd2\x4c\x8c\xa5\x18\x3b\x33\xef\xc3"
- "\x9c\x81\x36\xf1\x9a\x36\x67\xcc\x7e\xd5\x97\x33\xbe\xc5\x9c\x91"
- "\x8f\x39\x23\xd3\x04\x07\xd3\x6d\x80\x31\xac\xdb\x94\x74\x83\x2b"
- "\x23\x1d\x73\xc7\xd3\x98\x3b\xac\x5f\x81\x9c\x37\x1a\xea\x01\x63"
- "\x7e\xaf\x0d\x73\x21\xac\xe9\x5b\xcc\x1d\xdf\x62\xee\xc8\xe0\xb9"
- "\xe3\x95\xd3\x98\x3b\xe6\xe1\xdc\x60\x2e\xe6\x8e\x86\x20\xb9\xe3"
- "\x74\xf0\x79\x81\x1a\x07\xcf\x7f\x6b\x16\x5e\xc1\xbc\xb1\xec\x30"
- "\x08\xaf\xdc\xdf\xad\x83\x36\x73\xa0\xcd\xe7\x28\xac\x70\xc6\x63"
- "\x5e\x66\x01\xd2\xfb\x32\x17\xe6\x61\xc4\xa5\xda\xec\x06\xc3\xa1"
- "\x6e\xf1\xe7\xb1\xbc\x39\x62\x62\xcd\x96\xcf\x1d\x02\x2b\x98\xe4"
- "\x38\x8f\xb8\x2d\x5b\x0c\x42\x33\x62\x58\xfa\xab\x3c\x81\xe6\x89"
- "\xde\x75\xf1\x61\x7c\x4e\x5a\x3d\x9a\xd6\x44\x0c\x76\x8e\x9b\x9b"
- "\x59\x0c\xec\x31\x4b\xcf\x97\x1e\x05\xd1\xf3\xa5\xa9\x87\xf7\x31"
- "\x53\x48\xc6\x61\x30\x3a\x1e\x4b\x43\x7d\x9d\x82\x5d\x9f\xe4\x09"
- "\x25\x0f\x82\x44\xef\x6b\x64\xcf\x1f\x4f\x2b\x79\x04\xc6\x95\xfc"
- "\x13\xc6\x14\x3f\x08\x31\x1b\x3e\xa7\xf7\xba\x23\x86\xf5\xcc\x75"
- "\x20\xed\x3d\x28\xf9\x1c\xe2\x58\x61\x62\x0d\x0b\x7f\x48\xc2\xef"
- "\xe3\xf2\x1e\xc4\xf9\x03\xde\x4f\x32\x9f\xb7\x55\x5b\x0f\xc0\x9a"
- "\x5a\x80\x8c\x7f\x29\x18\xb7\xe0\x7b\x0c\xdc\x02\xc6\x0f\x1a\x13"
- "\xdc\xcb\xf1\xa5\xe7\x5e\x34\xe7\x68\xc1\x78\xe6\x47\xfe\xe3\x02"
- "\x05\xe3\x03\x0d\x35\x80\x39\xb0\x5b\xcb\xf8\x40\xc6\xf8\x18\xa8"
- "\x63\x03\xc4\xa6\x17\x8e\x05\xc2\xce\x9f\x0d\x18\x1f\x2c\xe8\xe4"
- "\xf8\x40\x99\xdf\xb8\x17\x9a\x85\x22\x81\x41\xe6\x01\x10\xd6\x7b"
- "\x3b\x8a\xf1\x41\xf9\xef\x8b\x68\xed\x8b\xff\x76\xe7\xc0\x76\xc2"
- "\x02\xb1\xdf\x76\x9f\x59\x07\x9d\xc3\x3e\x3e\xf9\x22\xd8\x17\x70"
- "\xec\x3f\x1e\xd1\x39\xec\xe3\x93\x11\x7b\x5b\xe7\xb0\xff\xbe\x83"
- "\xd8\xcb\xef\xbd\xbc\x42\xb1\xaf\x71\xf9\x63\x5f\xfd\x36\xc7\xbe"
- "\xba\xec\x12\xb0\xbf\x88\xdf\x27\x28\x7e\xff\xe9\xf0\x4e\x62\x8f"
- "\x7e\x5f\x6b\xea\x1c\xf6\xa7\x3a\x88\xbd\xfc\xee\xcc\x2b\x14\xfb"
- "\x4f\x9c\xfe\xd8\x7f\xbc\x95\x63\xff\x71\x69\xe7\xb1\x4f\xb8\x88"
- "\xdf\x27\x28\x7e\x7f\x38\xba\x73\xd8\x27\xa0\xdf\xd7\xa6\x77\x0e"
- "\xfb\x63\x1d\xc4\x5e\x7e\xff\xe6\x15\x8a\xfd\x21\x87\x3f\xf6\x9f"
- "\xbe\xc1\xb1\xff\x74\xcb\x25\x60\x7f\x11\xbf\x4f\x54\xfc\xfe\xef"
- "\x83\x3a\x89\x3d\xf9\x7d\x65\xe7\xb0\x7f\xbf\x83\xd8\xcb\xef\xf0"
- "\xbc\x42\xb1\xff\x5b\x83\x3f\xf6\x87\x37\x73\xec\x0f\x6f\xea\x3c"
- "\xf6\x89\x17\xf1\xfb\x44\xc5\xef\x3f\xeb\xdf\x39\xec\x13\xd1\xef"
- "\xbf\x94\x3a\x87\xfd\x33\x1d\xc4\x5e\x7e\x0f\xe8\x15\x8a\xfd\x91"
- "\x7a\x7f\xec\xff\xfe\x3a\xc7\xfe\xef\x1b\xdb\x83\xfd\x72\x2d\xf6"
- "\x47\xbb\xc5\xe3\xdc\x4a\x1e\xe7\xbf\xf1\xa0\x82\xfd\xef\x10\x7b"
- "\xec\x7f\xe9\xfd\xeb\x03\xc6\xf8\xff\xe8\x2d\xe3\x9e\x82\xb8\x5b"
- "\x11\x77\x9c\x1b\xaa\x98\x23\x46\x3d\x09\x77\xc2\x3c\xe3\x18\x18"
- "\x77\x61\x5d\xc2\x87\x30\x46\x1c\x25\x19\xe7\xae\xc7\xd3\x98\x4e"
- "\x34\x11\x9e\x34\xee\x27\xcc\x2f\x36\xb6\x27\x9b\xb8\x28\xe6\xbf"
- "\xfc\x61\xc6\xf7\x4d\x81\xeb\x7f\x97\x0b\xf3\x8f\x71\x0e\x97\xd1"
- "\x51\xcc\x3f\x3f\xea\x8f\xf9\x67\xaf\x10\x0e\x76\xfd\x67\xeb\x3b"
- "\x8f\x79\x42\x72\xdb\x98\xab\x39\xfe\x58\x97\x4b\xc3\xbc\x36\xdd"
- "\x87\x79\x42\xf2\x85\x31\x3f\xd6\x09\xcc\x2f\x6f\x7e\xff\x71\x61"
- "\x7e\xb4\xc6\x1f\xf3\x7f\xbc\xc4\x31\xff\xc7\x9a\xb6\x30\xf7\x62"
- "\xbc\xa6\x35\x75\xfa\xbb\x44\x4f\xa3\x65\x62\x33\xe2\x4a\x7f\x9f"
- "\x48\x6b\xbd\x5b\xe7\x96\x0b\xcd\x88\x7b\xee\x12\x88\x5a\xb3\x04"
- "\xc6\x1b\xea\x79\xfc\x6e\xc2\xf8\xfd\xc2\x39\x10\xbd\x4f\x9a\x7a"
- "\xac\x39\x09\x62\x13\xea\xb8\xe9\xc9\x34\x43\x55\x8a\x03\x76\x9d"
- "\x2e\x17\x68\xed\x96\x9e\xdb\xb1\x6f\x2c\xbd\x12\x52\x99\xab\xaa"
- "\x2e\x9f\xaf\xab\x7c\xa5\xae\xab\x6c\xf5\x5b\x57\xf9\xf5\x49\x65"
- "\x5d\xe5\x01\x8e\x51\x91\x16\x9f\x47\x7e\xd3\xc6\xba\x4a\xe5\x45"
- "\xd7\x55\xe4\xf5\x94\xd3\x10\xd6\x3c\x2f\xad\xcf\x2b\xca\xba\xca"
- "\xab\x73\x2f\x6d\x5d\xa5\x69\x9e\x59\x78\x15\xf1\x59\xfe\x00\xe2"
- "\xf3\x79\x47\xf1\xf9\x67\x9b\x7f\xff\x1c\x98\x6b\xd5\x1c\xab\xe6"
- "\x55\xf2\x39\xca\xad\xae\x82\x89\x87\x02\xd7\x52\xc8\xdf\x4e\xeb"
- "\xed\x2b\x29\x26\x77\x6e\x3d\xe5\x4b\xeb\x4f\x6d\x3d\x85\x7c\x4e"
- "\xcd\xb3\x3f\x8e\x1c\x6b\x9f\xec\xef\x7b\x5f\x74\xe1\x39\xf6\x0b"
- "\xb1\xbd\xe3\xab\xb6\x31\x8f\x9f\x1a\xb8\x86\xc2\x31\xaf\x5d\x4c"
- "\x6b\x2e\x9d\x5b\x47\xf9\xb2\xea\xa7\xb6\x8e\xf2\xe3\xc3\xbc\x36"
- "\xce\x1f\x73\xfb\x79\x8e\xb9\xdd\x75\x19\x30\x3f\x14\xb8\x76\xc2"
- "\x31\xaf\x9b\x45\x6b\x2d\x9d\x5b\x3f\xa9\xeb\xe4\x58\xfa\x3f\xb7"
- "\x7e\xf2\xe3\xc3\xbc\x6e\x8c\x3f\xe6\xb5\xa7\x38\xe6\xb5\x0d\x97"
- "\x8e\x79\xc2\xd4\xc0\x35\x13\x8e\xf9\x89\x87\x69\xec\xd5\xb9\x75"
- "\x93\xba\x45\x3f\xb5\x75\x93\x1f\x1f\xe6\x27\xcc\xfe\x98\xd7\x1d"
- "\xe7\x98\xd7\xd9\x2f\x03\xe6\x87\x02\xd7\x4a\x38\xe6\xf5\xbf\xa4"
- "\xb5\x95\xce\xad\x97\xd4\xfd\xe4\xd6\x4b\x7e\x7c\x98\xd7\x47\xfa"
- "\x63\x7e\xe2\x30\xc7\xfc\xc4\xa1\x4b\xc7\x3c\x71\x6a\xe0\x1a\x09"
- "\xc7\xfc\xe4\x3d\xb4\xa6\xd2\xb9\x75\x92\xaf\x22\x7f\x6a\xeb\x24"
- "\x3f\x3e\xcc\x4f\x1a\xfd\x31\xaf\xdf\xcb\x31\xaf\xaf\x6c\xef\x9c"
- "\x59\x9d\x2b\xab\xf3\x63\x79\xae\x1c\x86\x63\xf6\x80\xb5\x11\x8e"
- "\x77\xc3\x68\x79\xcc\xde\xe9\xb9\xf2\x97\xd6\x9f\xca\xfa\x88\x8a"
- "\x35\xcd\x97\x7f\x1c\x73\xe5\x6f\x02\x9e\x7f\x9e\xdc\xc1\xe7\xca"
- "\x27\xcb\xdb\xc2\x3a\xd8\x6f\x11\x0e\xe2\x5c\x53\xfd\x2d\xc2\x0b"
- "\x4b\x10\x47\xb4\x03\xfa\x2d\x02\xfd\x26\x21\xd8\xef\x11\xe8\x77"
- "\x08\xea\x6f\x12\xb4\xbf\x47\x88\xb7\x33\x17\xfd\x26\x81\xe6\xc9"
- "\x55\x29\x2f\x82\xfa\xdb\x04\xfa\x0d\x42\xe6\x71\xe8\x49\x18\xd1"
- "\xef\x0f\x68\xbe\xfc\x43\xff\x06\x61\xbd\xf7\xc7\xf0\x1b\x84\x53"
- "\x6d\xbe\xff\x4e\xf5\xb9\x7b\xdf\x18\x00\x68\x6f\x2d\xeb\x54\xcd"
- "\x85\x13\x6b\xc8\xe7\x08\x23\x43\x03\xf7\xc3\xad\xf7\x97\x09\xd5"
- "\xd6\x72\x78\x61\x19\x18\xd5\xf5\x0b\xf2\x41\x8c\xcb\x06\x37\xe2"
- "\xb9\x66\x36\x5f\xc7\xf0\x7e\x63\xe9\xe9\x78\x32\xcd\x40\x7f\xb7"
- "\xbf\xeb\x6f\x65\x02\xad\x3d\x96\xcc\x84\x31\xaf\x9d\x80\x71\x07"
- "\x9d\xc7\x40\xf6\xa9\x75\xf1\x21\xde\x75\x13\x1d\xcd\xeb\x1e\x92"
- "\xbc\xe1\x13\x9d\x8e\xf0\x89\x2e\xc2\x6d\xcd\x49\x00\xf2\x2f\xc2"
- "\xad\xda\xba\xa1\x05\x2f\x19\x2b\x41\x59\xdb\x68\xd3\xa7\x3e\xe9"
- "\x34\x66\x45\xa7\x11\xb3\x79\xfe\x98\x6d\xe8\xec\xfa\x86\xfa\x7b"
- "\xee\x79\x66\x61\x03\xfa\xd4\xb2\x5f\x22\x66\xbf\xea\x28\x66\xdf"
- "\xb6\xf9\xfe\xef\xb6\x31\x8b\x4f\x6e\x27\x66\x05\xed\xc0\xcc\x16"
- "\x04\xb3\xd5\x58\x37\x9d\x63\x16\xbf\xc8\x11\x1e\x6f\xf5\x61\xf6"
- "\x7d\x3b\x31\x0b\x9c\xc3\x5e\x49\x98\x7d\x27\x76\x02\xb3\x76\xfa"
- "\x59\x42\x3b\xfc\xac\xd6\xd4\x1a\xb3\x04\xf4\xb3\x78\xc5\xcf\xe2"
- "\xd1\xcf\xe2\x35\x7e\x76\xaa\x9d\x98\x05\xce\x41\xaf\x24\xcc\xce"
- "\x94\x77\x1c\xb3\x84\x76\xfa\x59\x42\x3b\xfc\xac\x36\x3d\x08\x66"
- "\xe8\x67\x09\x8a\x9f\x25\xa0\x9f\x25\x68\xfc\xec\x58\x3b\x31\x0b"
- "\x9c\x43\x5e\x49\x98\x39\xdb\xfe\xfb\xef\xb6\x31\x6b\xa7\x9f\x25"
- "\xb6\xc7\xcf\x2a\x5b\x63\x96\x88\x7e\x96\xa0\xf8\x59\x02\xfa\x59"
- "\x82\xc6\xcf\xde\x6f\x27\x66\x81\x73\xc0\x2b\x09\xb3\x73\x52\xc7"
- "\x31\x4b\x6c\xa7\x9f\x25\xb6\xc3\xcf\xbe\x94\x82\x60\x86\x7e\x96"
- "\xa8\xf8\x59\x22\xfa\x59\xa2\xc6\xcf\x9e\x69\x27\x66\x81\x73\xb8"
- "\x2b\x09\xb3\xc6\x43\x1d\xc5\x4c\xc6\x0b\xc7\x8e\x41\x31\x6b\xf2"
- "\x1f\x37\xba\x71\x1c\x4f\xcf\xbc\x82\xe2\xf5\xfc\xf1\x34\xb6\x52"
- "\x34\x11\x56\x34\x1e\x24\xbc\xaa\xad\x7b\x20\xd8\xb8\x91\x9e\x8b"
- "\x21\xee\x40\xcf\xc6\x32\xbf\xea\xc0\x78\xf1\xd1\xb6\xb0\xba\xf8"
- "\xf3\xb0\xa2\xb9\x3e\xac\xd4\xe7\x61\x97\x15\xab\x4f\x3a\x8a\xd5"
- "\xf9\xac\xce\x61\x95\x90\x7c\x71\xac\x12\x0a\x2e\x8c\x55\x6d\xba"
- "\x0f\xab\x63\x1a\xac\x5a\xe7\xb1\xf6\x63\x15\x90\xbf\xae\x28\xac"
- "\x9a\x63\xda\xc2\xca\x1d\xf6\x90\x44\x7f\xf3\x3e\x05\xe7\xbe\xec"
- "\x31\xcb\xc4\x9c\x5a\x88\x7a\xb1\x16\xc6\xd3\xdf\x37\x6f\x5d\xe6"
- "\x12\xb0\x8f\x5f\xef\x3b\x54\x0f\xcd\xdf\x98\x7a\xd0\xdf\xcf\xc8"
- "\x71\xf2\x49\x53\x48\x75\x8a\x43\x8e\x89\x2f\x21\x46\x07\x9d\xe5"
- "\xa8\x93\x6e\xf1\x07\x9d\xef\x40\xd3\x42\x0b\xec\x3f\x7a\x12\x71"
- "\x61\xcd\xd5\x0d\xe5\x50\x82\xf7\x6d\x4b\xde\x01\xef\x37\xe6\x1e"
- "\xd3\xad\x20\x9c\xd6\x37\x3b\x68\xee\x3c\xca\x0a\xc6\xc9\x0d\xcc"
- "\x75\xb0\x61\x1f\xbc\xf6\x28\x44\xed\xb1\x02\x90\xae\xe5\xb9\xf2"
- "\x6c\x9a\x2b\xbf\xef\x87\xcf\xab\x9a\xb9\xb2\xfc\xf7\xb2\xe9\x88"
- "\xcd\x77\x01\xd8\xe0\x5c\x1c\x75\xdd\x6d\x8a\x13\xb1\x71\xaa\xd8"
- "\x9c\x82\x8c\xf9\x84\x8d\xdd\x37\x57\x56\xb0\x29\xa2\x98\x97\xae"
- "\x99\x2b\x9f\xd6\x60\xa3\xfc\xad\xaa\x1f\x36\xea\x5a\xc6\x52\x33"
- "\x3d\x23\x6f\x35\x57\xee\xdc\x5a\x86\xbb\xcd\xbf\x15\x91\xfd\x08"
- "\x7d\x64\x0a\xfa\xd1\x8a\x45\xb2\x1f\x71\xfd\x47\x4c\x44\x7b\x2f"
- "\x03\x83\xbd\x5b\xfc\x8b\x88\x41\x13\xfa\x1a\xe5\xa2\x4c\xec\x27"
- "\x61\x49\xb8\x4d\xd9\xd2\xdc\xfc\x88\x13\x04\x1c\x83\x87\x11\x76"
- "\x9e\x6f\x4c\x21\x39\x98\xab\xaa\xa7\x7d\x8e\xf8\x9c\x81\x6a\x87"
- "\x82\xcd\xb2\xcf\xe1\xb4\xde\xb3\x8a\x3d\x69\xee\x31\x12\xed\x14"
- "\x73\x8f\x71\x3a\xfd\xed\x0b\xc6\xbc\xd7\x66\xc2\xb8\xc9\xe9\xcc"
- "\x25\xff\x96\x07\x7d\x8c\xf2\x19\xc5\xc3\x83\xe9\x1f\x81\x67\xdd"
- "\x44\x67\x73\xf8\x43\xd2\x9e\x45\x00\x14\x13\x09\x8b\x2e\x8b\x7d"
- "\xd8\xd1\xdf\xed\x69\xd7\x3a\x5a\xc5\xc2\xd9\xfb\x82\xfb\xd7\x34"
- "\x7b\x87\xd6\x3b\x8a\x14\xff\x2a\xea\xec\x7a\x87\xba\x1e\x85\x18"
- "\xd2\xdf\xea\x65\x1e\x06\xe1\xd5\x0e\x63\xe8\x5d\xd3\x71\x0c\xe3"
- "\x93\x2f\x8e\x61\xa3\x8a\x61\xc1\xc5\x31\x64\xf1\xad\x31\x8c\x4f"
- "\xd7\x60\x68\xd3\x60\xb8\x9a\x63\x18\xbf\xc8\x87\x61\xbc\xf5\xe2"
- "\x18\x06\xcc\xa5\xaf\x24\x0c\x45\xb8\xf0\xfa\x47\x70\x0c\xdb\xe1"
- "\x87\xdf\x2a\x18\x26\x5c\xdc\x0f\x45\x5d\x68\x10\x0c\x35\x7e\x58"
- "\x6b\xf2\x61\x98\xa0\xf8\x61\xbc\xc6\x0f\xe3\xdb\xe1\x87\x01\x73"
- "\xeb\x2b\x0a\x43\x21\xac\xe3\x18\x26\xb4\xc3\x0f\xbf\x50\x31\xbc"
- "\xb8\x1f\x8a\x42\x4d\x6b\x0c\x13\x34\x7e\x88\x63\x17\x1f\x86\x8a"
- "\x1f\x26\x68\xfc\x30\xa1\x1d\x7e\x18\x30\x56\xb9\xa2\x30\xd4\x1f"
- "\xe9\x04\x86\xed\xf0\xc3\x5d\x0a\x86\x89\xed\xf0\x43\xb1\x20\x08"
- "\x86\x5a\x3f\xac\xf4\x61\x98\xa8\xf8\x61\x82\xc6\x0f\x13\xda\xe1"
- "\x87\x01\x73\xef\x2b\x0a\xc3\x2e\x17\x5e\xff\x0f\x8a\x61\x62\x3b"
- "\xfc\x30\x53\xc5\xb0\x1d\x7e\xd8\xd5\xd2\x1a\xc3\x44\x8d\x1f\x7e"
- "\x29\x69\x30\x54\xfc\x30\x51\xe3\x87\x89\xed\xf0\xc3\x80\xb9\xf8"
- "\x15\x85\x61\xb7\x94\xf6\x60\x88\xe3\xec\xd6\xe3\x52\xa7\x0f\x43"
- "\x2d\x7e\x81\x63\xd1\x24\x1c\xa3\x12\x76\xd3\xdc\x20\xb4\xc6\x2f"
- "\xc4\x44\xf8\xc5\xd0\xf3\xb8\xef\x7d\x63\x52\x19\x3b\xe5\x79\x0e"
- "\x61\xb6\x27\x15\x80\xc6\xa7\xea\x78\x94\x9e\xa9\xb6\x8c\x47\x1f"
- "\xff\xff\x74\x3c\x2a\x76\x8f\xec\x38\x76\x4a\x1e\x6c\x13\x3b\xff"
- "\xdc\x97\x84\x39\xb1\x6d\xec\xba\x1f\x6a\x8d\x5d\x42\xba\x0f\x3b"
- "\x9e\xf7\x38\x76\xb5\xe9\x6a\xfe\xe3\xd8\x29\xf9\xef\x82\xd8\x5d"
- "\xc9\xf9\xaf\x47\x9b\xf9\x2f\x4f\xf0\x96\xe1\x59\x8e\xa7\x0d\xcf"
- "\x4a\x8f\x00\xf7\x6c\x10\xbc\xfc\x77\xe3\xdc\x9e\x03\xef\x77\x65"
- "\xcf\x8f\x58\x45\x34\x6c\xa5\x28\x8f\x8d\x54\x1e\x9e\x1e\x00\x58"
- "\x6e\x33\xe8\x52\x68\x3f\x12\xa2\xed\xa6\xf2\x32\xac\x84\x38\xec"
- "\x33\xa7\x13\x20\x8b\xd3\xc5\x75\x25\x3a\x96\xb3\xaf\x0e\xcb\x42"
- "\x14\x9e\xb2\x9d\x79\x04\x81\x78\x05\xb6\xdd\x5d\xa1\x91\x3c\xd9"
- "\x20\x69\xdb\x46\x5e\xd4\xa6\x4a\xd7\x83\xe8\x3c\x5d\x85\xa3\x1e"
- "\x9d\x18\xa5\xa5\x63\x77\x81\x96\xee\x1a\x85\x9f\xd9\xaf\x1f\x83"
- "\x01\x0c\x3a\x89\xf7\xc5\x2a\xa8\x7d\x09\x95\x79\xf6\xda\x3b\x1e"
- "\x79\xc6\xf8\xf1\xec\x0a\xd0\x13\xe9\x89\x6f\xcf\x34\x59\x6e\xa2"
- "\xef\xc9\xba\x9e\x98\x23\xf3\xd7\x89\xb1\x5e\x01\x62\x79\xbf\x40"
- "\xdc\xd0\x22\xb3\x04\x79\xfe\x6d\xf4\x52\xf5\xa5\xa5\x23\x1a\x26"
- "\xb4\xd0\x18\x78\xdf\xbe\x4a\x47\x39\xc6\x69\xe5\xe0\x74\x30\x5a"
- "\xa1\x33\x62\xbf\xc6\xb7\x60\x59\x60\xa8\x54\xe9\x32\x3d\xd0\x0f"
- "\xb1\xb0\x55\xa7\x01\x28\x7a\xe8\xcd\x72\xf6\x5b\x15\x5d\xc4\x69"
- "\x79\xf6\xd4\xe9\xec\x1b\x14\x7d\x79\x73\xf6\xc7\x20\x6d\x1f\xef"
- "\x4a\x71\x42\x0b\xdf\x6c\x7a\xa7\x94\xa2\x87\x6c\xf7\xb5\x32\xdf"
- "\x7a\xf4\x2d\x41\x27\x29\x7a\xb8\x96\x68\xb1\x4e\x3c\xef\x97\xb1"
- "\x05\x57\x8f\x20\xd2\x3d\x9b\x86\x36\x8c\xeb\xf8\xb3\x78\xec\xdb"
- "\xe4\xd6\xf4\x21\x81\xf4\xe1\x9c\xfe\x40\x0a\xd2\x27\xb7\xa6\x37"
- "\x06\xd2\x47\x70\xfa\xea\x69\x48\x3f\xb5\x35\xbd\xbb\x4f\x00\x7d"
- "\x5f\x4e\xff\xb1\x05\xe9\x2d\xad\xe9\xa5\x40\x7a\x13\xa7\xff\x07"
- "\xd9\xc8\xb4\xd6\xf4\x71\x81\xf4\xfd\x38\xfd\xa7\x53\x91\x3e\xa5"
- "\x35\x7d\x56\x20\xfd\x75\x9c\xfe\x70\x32\xd2\xa7\x06\xd2\x97\xc8"
- "\xb4\x30\x58\xa1\xbd\x9e\xd3\xfe\x7d\x32\xd2\xa6\x05\xe9\xab\x5e"
- "\xe1\x1d\xab\xd0\x47\x72\xfa\xfd\x35\x48\x3f\x27\x08\x56\x81\xf4"
- "\xfd\x39\xfd\x49\xb2\xc3\xf4\x20\x58\x05\xd2\x0f\xe0\xf4\xff\x2c"
- "\x47\xfa\x45\x41\xb0\x0a\xa4\x1f\xc8\xe9\xed\xa5\x48\x6f\x0d\xa2"
- "\x7b\x7f\xfa\x5e\xb5\x1b\x91\x6e\xc5\x86\x6c\xd5\x7f\xfc\xf4\x1e"
- "\xc8\x7b\x10\xe7\x5d\x57\x80\x75\xb2\x82\xe8\x3d\x90\x7e\x30\xa7"
- "\x3f\xb1\x1a\xe9\x57\xb5\xa6\x07\x1d\xa7\x87\x9b\x14\xfa\x21\x9c"
- "\xbe\x7e\x05\xd2\xaf\x0e\xa2\x7b\xba\x6f\x53\xfc\x34\x8a\xd3\x1e"
- "\x8b\x45\xda\x35\x41\xf4\xae\xa5\x8d\xe6\xb4\xae\x48\xa4\xcd\x0b"
- "\xa2\x73\x2d\xed\x50\x4e\x7b\xaa\x0e\x69\x0b\x82\xe8\x5b\x4b\x3b"
- "\x8c\xd3\x7e\xbb\x1e\x69\xd7\x07\x91\x77\xb0\x86\xd6\xcc\x69\xbf"
- "\x23\xbb\x2a\x0a\x82\x8b\x96\x76\x38\xa7\x3d\x5f\x89\xb4\x1b\x83"
- "\xe0\xa2\xa5\xbd\x81\xd3\x9e\x05\xa4\xdd\x14\x04\x13\x2d\xed\x8d"
- "\xac\x97\x73\x9b\x12\x5b\xb7\x04\xd2\xa2\x0d\xd8\x30\x0e\x55\x62"
- "\x2c\x8c\x61\x39\xe7\xe8\xdd\x8e\x14\xd7\xe4\xf7\xe5\xa9\x34\x4c"
- "\x70\xdf\xac\xc9\x03\x23\x58\x4e\xc3\x34\x25\xfe\x95\x05\xf2\x63"
- "\x82\xa8\xa5\x1d\xc9\xf2\xbb\x6d\x51\x68\xb7\xb5\xa6\x0d\xd1\xd2"
- "\x8e\x62\x39\x1e\xa3\x42\x5b\xde\x9a\xd6\xd8\x42\xcb\x72\xbc\x87"
- "\x90\x66\x67\xb1\x12\x57\x35\x72\xde\xa4\xe1\x37\x9a\xe5\xc3\x7a"
- "\x85\x9f\xad\x35\x3f\x49\x4b\x7b\x13\xcb\xef\x9e\xaa\xd0\x56\xb4"
- "\xa6\x8d\xd3\xd2\xde\xcc\xf2\x05\xb5\xff\x95\xad\x69\xb3\xb4\xb4"
- "\x63\x58\xbe\x28\x29\xb4\x55\x81\xb4\xc5\x3c\x07\x09\x0a\x4e\xb7"
- "\xb0\xfc\x2e\x75\x0a\x6d\x8d\x5f\x8e\x15\x74\xb2\x8f\x15\x73\xba"
- "\x5b\x59\xaf\xe6\x45\x0a\x9e\x87\xfc\x72\x6b\xb6\xae\x0f\xe5\x94"
- "\x0d\x84\xe7\xf3\xb7\x86\x22\xed\x58\x85\xdf\x91\xc0\xdc\xa7\xc8"
- "\x37\x0e\xef\x1d\x55\xf3\x13\xe6\x1d\x7b\xb0\x71\x4f\xfa\x0d\x70"
- "\xcd\x49\x31\x2c\x85\xe7\x46\x65\x6f\x30\x31\x5c\x7e\x37\x92\x77"
- "\xd3\xd8\x8d\x49\x4e\xe6\xd6\x96\xe5\x0a\xac\x66\x94\x13\x44\x7a"
- "\x5f\x1f\x0b\x9f\x61\xb1\x63\xb9\x23\x7a\x5c\x7a\x63\x7e\xd8\x1c"
- "\xbb\xce\x9e\x4c\xef\x6f\xc2\xef\x56\x3b\xbc\xb4\x9e\xbe\xe7\x66"
- "\xd3\xde\x24\x71\x3a\x4f\xa1\x21\x8f\xf6\x32\x29\xc1\xeb\x1c\x3c"
- "\xe5\x7d\x43\xd2\x71\x0c\xfc\x3c\xc4\xd9\x96\xb8\xe1\x84\x15\x04"
- "\x79\x9f\x3c\x31\x6c\x0f\x9b\x97\x36\x1e\x65\xa9\xc1\x76\x53\x6b"
- "\xf1\x5a\x96\x85\xf6\x0d\x2a\x30\x94\xda\x16\x34\x21\x4d\x78\x3f"
- "\x47\xf8\xec\x1a\xf6\xec\x43\xff\x4a\xcf\x80\x81\x27\xc5\x70\x93"
- "\xfa\xfe\x2a\xf9\x9d\x55\xdf\xa6\xdd\x29\xbf\xaf\x4a\x0c\xdf\xee"
- "\x0d\x37\x94\x06\xbe\xaf\x8a\xb7\x13\xbe\xf1\x2c\xc6\x2b\xb6\x71"
- "\x49\xba\xfc\x3e\x2c\x31\xfc\x2b\xb9\x7f\xd9\xac\x86\x45\x8d\x5d"
- "\xed\x6d\x5a\x95\x45\xfb\xda\xd9\x32\x4e\x42\xad\x72\x8f\xf8\x2b"
- "\x7c\xe7\x13\x3f\xe2\xab\xf2\xa4\x7a\x8e\x41\x4b\xd2\x49\x1f\xa8"
- "\x9b\xd5\xed\x7e\xff\x95\x18\x9e\x22\xbf\xff\x2a\x3f\xbc\xd4\xae"
- "\x8b\x71\xc9\xef\xbf\x52\xfb\xd3\x7e\x1e\xa1\xc4\x23\xf8\xbb\x7e"
- "\xc1\xc0\xd6\x19\x2a\x1b\xf3\x23\x42\xed\xe2\x35\x26\x8e\x4f\x84"
- "\xc9\xae\x93\x42\x95\xef\x51\x76\xdd\x90\x78\xe5\x7b\xac\x5d\xf7"
- "\x69\x99\xf2\x7d\xbc\xfa\x0e\xb2\xe0\xef\x44\x33\x14\x21\x1e\xdb"
- "\xbc\xaf\x59\x42\x68\xbc\x2e\xcb\x13\x6e\x28\x92\x06\x80\xee\x84"
- "\x18\x61\xc3\x36\xb7\x71\x5d\x45\xbc\x82\x9f\x06\xe5\xd3\xa1\x7c"
- "\x32\xa2\x91\x6d\x2e\xec\xd1\xd5\x2c\x6f\xca\x16\xd9\x1e\xc4\x88"
- "\xb7\xa9\x4c\xc6\x16\xf1\x67\xbd\xa7\x6c\x91\xf9\xae\x9b\x5d\xa3"
- "\x95\x81\x5e\x34\x16\x3b\xfa\xa6\x9b\xc7\xdc\x72\xeb\xd8\x71\xb7"
- "\xcd\x78\xf4\xb1\xd4\xc7\x67\x3e\x91\x36\x6b\xf6\x93\x73\x9e\x9a"
- "\x3b\x2f\x7d\xfe\x82\x85\x8b\x16\x2f\x59\x6a\x7d\x7a\x19\xd1\xb5"
- "\xc8\xfb\xda\x04\x9d\x53\x00\xc4\xf3\x2e\x6c\xa7\x6f\xb4\xdc\x36"
- "\x96\x71\xec\xfb\x86\x89\x52\xf0\x79\x41\x35\x22\x41\x7b\x84\x34"
- "\x88\x7d\xe7\xd3\x9e\x25\x68\x87\xba\xea\xa2\x89\x36\xda\xaf\xad"
- "\x4e\xec\x9b\x7a\xd0\x31\xd1\x46\xfb\x0b\xee\x36\xd5\x43\xd4\x60"
- "\xd0\x9d\x14\xfb\x26\xd3\xfd\x92\xa1\x00\x15\x58\x37\x18\xcf\xc1"
- "\x46\x30\xbd\x1c\xc1\x1c\x05\x11\xac\x81\xf8\x17\x14\xb2\x7a\xc7"
- "\xf2\x34\xc8\xc1\x6b\xb4\x4d\xe3\x09\xd1\x14\xbd\x1b\x47\xff\xde"
- "\x6c\x88\x2c\x2e\x64\x75\xab\x22\x58\xdd\xb3\x85\xac\xa1\x24\x82"
- "\xd9\xa3\x0a\x20\xb4\x31\xbf\xef\x11\xbb\xd8\x37\x56\xf6\x2f\xbc"
- "\xef\xed\x13\x51\x93\x8b\xf7\x46\xb9\x41\x5f\x82\xd7\x58\xe6\xdc"
- "\x2d\x71\xb9\xdf\x3a\xe3\xea\x82\xfd\xdb\xc9\x9a\xe7\xe8\x72\xb0"
- "\x1d\x8e\x89\x29\xa1\x02\x47\x12\xd8\x9e\xa3\xda\x55\x0b\x76\xd1"
- "\x14\x4f\xfb\x29\x61\x7b\x86\xea\xf5\x0d\x40\xfc\xde\x5c\xe0\xea"
- "\xb2\xf0\x3a\xe6\x46\x5a\xb3\x77\xf9\x1c\x1d\xd2\x88\xc8\xdb\xa9"
- "\xed\x8f\x79\xe6\x53\x8b\xa4\xb9\x8b\xe7\xcc\x19\xde\x03\xcc\xf2"
- "\x27\x68\xf7\x1a\x5c\x84\xfc\xe0\xe5\x42\x56\x81\xfd\xb4\x61\x7f"
- "\x2b\x0f\xe0\x0c\x04\xed\x03\xb0\x4f\x79\xc8\x77\x03\x96\xef\xc4"
- "\xef\x3b\x51\xf6\x4a\x79\xef\x32\x71\xf8\x5e\x96\x6f\x9a\x8a\x72"
- "\x52\xce\xa2\xbd\x52\xe0\xec\xd2\xa9\x3a\xec\x77\x01\xd2\x55\x4a"
- "\xd7\x41\xf4\x09\xb1\x5f\x34\xca\xb1\x09\xbf\x13\xfd\xc7\x84\x23"
- "\xd2\x57\xf0\x7e\x0d\x97\xdf\x25\x88\xba\xb2\x6d\x88\x60\x6b\x1a"
- "\xf3\xfb\x01\xbd\xc3\x55\xde\x77\x06\xaf\x51\x2f\x95\x48\x9b\x77"
- "\x36\x73\xaa\x8e\xf6\xe5\x2c\x69\xe1\x69\xaa\x21\x99\x48\x0e\x9a"
- "\x0f\xef\xc7\x11\xa5\xb7\xd9\x02\x23\x5c\xa0\xdb\x8f\x51\xaf\xa8"
- "\x90\x6d\xc4\xb3\x08\xcf\xf5\xfb\xf0\xde\x5e\x3c\x2b\xb1\xbc\x0a"
- "\x3f\xe9\x2d\x72\x7b\xeb\xe4\xe7\xab\x26\x92\x7b\xe1\x0a\x56\x3f"
- "\x6a\x3d\x0c\x91\xf7\xfd\xcc\x80\xff\xaa\x15\x87\x4b\x24\x3b\xbd"
- "\xaf\x99\xf5\xe9\x57\xe0\xf7\x5e\x59\xf1\xfa\x10\xc0\xfb\xf8\x19"
- "\xc9\x3f\xb5\xe7\xf5\xa9\x78\xae\x52\xbe\x57\x81\x78\x9d\x53\xf9"
- "\x6e\xc7\xb3\xe1\xe2\x67\x20\xbf\xb6\xce\x48\x4b\xfb\x69\xdb\x75"
- "\x16\xb4\x8f\x6e\x80\x11\x44\x29\x0d\xcf\x8d\xfe\xe5\x92\x95\x97"
- "\x45\x4f\xe0\xd7\xd1\xc9\xca\xe7\x0a\x10\x87\xa2\x9e\x86\x22\xff"
- "\xa1\xe5\xbc\x6c\x68\x05\x7e\x86\xe2\x69\x0a\x68\x9f\x78\x96\x12"
- "\x9e\xcd\x98\x0f\x08\x4b\xbb\xd8\x2f\x95\x30\xca\xe5\xb6\xa5\xa3"
- "\xdf\x50\x60\x59\x0a\xda\x56\x91\xcf\x7e\xae\xbf\xcf\xdf\x7e\xae"
- "\x8f\x0b\xb0\x9f\x3c\x8a\x47\xe8\x0b\xa5\x25\xdc\x5e\x76\x9e\x5d"
- "\x9e\x8a\xd7\xd7\x4f\x40\x3e\x3b\xa5\x47\x64\x1e\xf2\xf8\x26\xf7"
- "\x24\xce\x85\xa9\x77\x19\x14\x3b\xae\x5f\x47\x36\x4b\x6d\x2b\xed"
- "\x72\x59\x50\x3e\x2c\xdb\x48\xf2\xcd\x43\xbe\x78\xbd\x09\xe9\x36"
- "\x56\xc3\x19\x55\x36\xb9\xce\x8b\xb3\xd1\x1e\x15\x79\x89\x27\xd5"
- "\x63\xbe\x7e\xa5\x50\x1d\xde\x76\x64\x02\x96\xd3\x1c\x1b\x32\xbf"
- "\x03\x7d\xb5\xdb\x0e\x64\x93\xf4\x59\xed\x8e\x45\x5f\x8a\x07\x2f"
- "\xe5\x42\x13\xc4\xa2\xbf\x75\xaf\x15\x23\x63\x46\xae\x80\x58\xe2"
- "\x47\x31\x1c\xfb\xe1\x28\x21\x5f\xe4\xbc\x7e\x4e\xfd\x20\xfe\xfb"
- "\x70\x56\x43\x9f\xc5\x24\x0f\xde\xd7\xb4\x5b\x40\x73\xe7\xdc\x65"
- "\xbc\xaf\xd8\xd6\x26\xac\x5f\x46\x7d\x27\x7d\xe2\xfd\x72\xe4\xb3"
- "\x9a\xee\xd1\x9e\x2d\x4a\x7f\x36\xd1\xdf\x7b\x90\x3e\x88\x9e\xf6"
- "\xbf\x94\xdf\x53\x2b\x9a\xb6\xca\x7a\xc3\xfa\x84\x07\xc3\x36\x88"
- "\x47\xa6\x9b\xb9\x19\xc6\xa3\xdf\x2e\x73\xe1\x18\x64\x80\xce\x1f"
- "\x9f\x48\xbb\x16\x1f\xac\x57\x86\xf5\x2b\x28\x2f\x53\x3c\xc1\x36"
- "\x0d\x34\xe6\xc0\xb2\x3c\x6f\x3e\xf2\x58\xe2\x92\xd7\x96\x4e\x88"
- "\xfd\xbf\x43\x59\xf2\x88\x0f\xca\x53\xc1\x79\xf5\x8f\xa1\x77\x58"
- "\x6a\xb1\x56\xf8\x6d\x22\xcc\x65\x7f\x5e\x26\xf7\x09\x63\x57\xff"
- "\x0f\x8b\xf9\xbd\x72\xa4\x29\x67\xcd\xf1\xc0\x96\x5b\xf8\x3e\x6d"
- "\xfc\xde\xb6\xcc\xf3\x32\xbe\x15\x3c\xae\xf5\x3f\xbe\xf0\x19\x56"
- "\xef\x93\xbb\xff\x7a\xf5\x5d\xed\x8a\xdc\xdb\xa8\x3d\xb6\x74\x9a"
- "\x9c\x47\xa9\x0d\xaa\xaf\xf0\x5b\x44\xfc\x54\x5d\x8d\x44\x39\xb8"
- "\xbe\x22\xb7\x60\xf9\x26\xb2\x45\x59\x6f\x18\x47\xcf\x66\x92\x2d"
- "\xf6\x2f\xc2\xfa\x3b\x73\xe8\x7a\xa9\x7c\x1d\x2b\xc7\xd8\x96\xfb"
- "\x91\x75\x74\x9f\xd6\x26\x72\x9f\x44\x5b\xf2\x02\x0c\x09\x83\x58"
- "\x67\xb6\xdc\xb7\x52\xe7\xf2\x09\xba\xdd\x6e\x00\x92\x13\x75\x54"
- "\xde\x98\x3f\x60\x02\xe6\x1a\x79\x6f\x2e\x8c\xd7\xdb\xd8\x6f\x2d"
- "\x40\x32\x63\x3c\x53\xe4\x1b\xb0\x5d\xc1\x7e\x1b\xf5\x91\xf4\x39"
- "\x92\xc7\x3e\xbc\x27\x3d\x40\xb2\xfb\xfa\x3d\x20\x4f\xab\x63\xb9"
- "\xdf\x88\x03\xe1\x45\xb8\x68\x78\x92\xed\xe7\x21\xaf\x52\x7e\xcd"
- "\x6d\x83\x74\x9d\x17\xc1\xaa\x88\xde\x47\x3b\x50\xde\x1f\x3b\x03"
- "\xdb\x1e\x95\x2e\xef\x0d\xa7\xa3\xf7\xed\x23\xdf\x52\xda\xdb\x14"
- "\x79\x94\x93\x4e\x51\x96\xfe\x64\x8f\x78\x5d\xa5\xd4\x8b\xc4\x7c"
- "\x1e\x83\xe7\x78\x9f\xff\x4b\x3d\xfd\xed\x6b\x60\xa0\xff\x13\xde"
- "\x79\xde\xcc\x78\x50\xf6\x75\x96\x4e\x8b\x03\xdf\x50\x72\x87\x82"
- "\xf5\x40\x0f\xbd\xa1\x5a\xc3\x63\x55\x00\xd6\xe5\xb2\x3d\x2e\x9d"
- "\xac\xa3\x3e\x63\xdd\x72\x85\x8f\xdc\x67\xd9\x9e\xb2\x65\x1b\xa8"
- "\x62\x4b\xb1\x9f\x2d\x76\x30\xc0\xae\xe0\x5c\x15\xa0\x13\x35\x76"
- "\x51\x5f\xee\xa4\x98\x84\x63\xe0\x3b\x1b\x9b\x7d\x71\x89\xb0\xf7"
- "\xca\xd8\x0f\x5c\x5d\xc2\xf3\xad\x12\xb7\x06\xf2\xfb\x11\x7e\x36"
- "\x4c\xb2\xbc\x2f\xdb\x2f\xc9\x92\x39\x8d\x64\x29\x97\xe5\xc8\x94"
- "\xe0\xb4\x28\x8d\xa1\xf6\xb1\xae\x4d\xf1\x57\x85\xd7\x80\x02\xe2"
- "\xf5\x2c\xc6\x2a\x92\x09\xdb\x96\xe4\xf8\xf7\x0b\x59\xaf\xeb\x14"
- "\xd9\x2b\x5d\xd9\x54\xf7\xfa\xd5\xe7\x05\xb9\x6e\xa5\x5d\xbc\xce"
- "\xed\xe2\x7b\x27\xf4\xc0\xfa\x5b\xa4\x47\x89\x3e\xca\x49\x31\x5a"
- "\x7a\x50\xfe\x7e\x4c\xba\x1f\x6d\xf5\x24\x88\xc8\x2f\x84\x6c\x54"
- "\xb5\x8b\x06\x31\xea\x00\x8e\x31\x08\xaf\x52\x1c\x23\x6d\x21\x7d"
- "\x93\x2d\xe3\x18\x69\x4c\x63\xbe\xe4\x56\xed\x16\xdb\x29\x22\xdd"
- "\x73\x7c\x06\xfd\x1c\xed\xb8\xdc\x67\x5b\x83\x7e\xae\xe8\x71\x0b"
- "\xea\x31\x04\xdb\xfb\x50\xe9\xd7\x16\xa4\xc7\xb1\x58\xd4\xdb\x8a"
- "\xec\xeb\x15\xfa\x87\x55\x1c\x14\x5f\xad\xca\xa1\xf8\x2b\x63\x30"
- "\xc8\xa9\xd4\xdd\xa4\xb4\xf5\xbd\x4a\x4b\x63\x44\x79\x1f\x34\x2c"
- "\xa3\x38\x38\x0a\xb1\x97\x63\x1f\xed\xfb\xab\x94\x91\xef\xf0\x36"
- "\xa2\xe4\xfd\xb1\x9f\xc5\x71\x8f\xcf\x8e\x06\x55\x05\xc4\x27\x8a"
- "\xc5\x79\x07\x57\xf1\x7d\x26\xc8\x96\x28\xa6\xd2\x7c\x05\xf9\x6d"
- "\x52\xfc\x47\x91\x79\xf0\x6d\xfe\xb6\x12\xf5\x02\xda\xca\x08\x1f"
- "\xef\xc1\xe6\x60\x79\xae\x84\xc7\xc0\x22\x5e\x67\xf0\xd3\x4a\xdf"
- "\x4a\x79\xdf\x94\x6b\xd2\x5b\x86\xac\xb7\x3b\x34\x7a\x44\xbd\x0d"
- "\x79\x43\xa1\x2f\xa7\x58\xee\xf3\xd7\xc1\x5f\xa9\xbe\xdc\x3a\x5e"
- "\x0c\x79\x85\xfc\x41\x23\x97\x2d\x20\x5e\x94\x07\x8f\x17\x83\xf3"
- "\x94\xfe\x6e\x0c\xf0\x8d\x4d\xca\x78\x77\xab\x8a\xc3\x41\xa7\xb2"
- "\xdf\x07\x96\x51\xfc\xa4\xb6\xb5\x39\xa8\x98\xeb\x55\xf1\xe5\x21"
- "\xcf\xb5\xc6\x61\xc8\x54\xad\x3f\x13\xd6\x14\x13\x88\x07\x61\x2a"
- "\x8f\x2b\xb1\x8c\xe3\x3a\x24\x86\x62\x83\x36\x46\x23\x6d\x81\x97"
- "\x91\xbf\x0c\xb1\xf8\xfb\xe2\xe0\x0a\xc5\x17\x95\xb6\xa3\x86\x23"
- "\x46\xb1\x9a\x76\xab\x02\xda\x25\x6c\x2a\xe4\xf7\x39\x73\x4c\xc3"
- "\xd5\x9c\x46\xf4\x58\xd7\xda\x98\x1f\x05\x01\xf9\x31\x8f\xe4\xc3"
- "\xb6\xac\x72\xcc\x2a\x94\x63\x85\xb5\x51\x96\x27\x4a\x2c\x51\xf2"
- "\x04\x96\xc5\xf2\xb2\x21\x35\x4a\x2e\x51\xed\x66\xb1\xbf\x4c\x51"
- "\x29\xc1\xc7\x47\x83\xad\xea\xf8\x48\xe6\x25\xc7\xa2\xa8\x54\xa5"
- "\x7f\x54\x36\x82\x97\x0d\x8e\xa1\xb2\x1c\xae\x87\x02\x26\xe7\xab"
- "\x41\x35\x4a\xbe\x22\xff\x12\xf0\x3a\x8e\x7c\x8c\xae\x91\x87\x1c"
- "\xcb\xab\xb3\x9a\x68\x0e\xb1\xde\x2e\x4a\x47\x29\x1e\x50\xbc\x90"
- "\x66\xf2\xb8\x21\x4d\xa1\xcf\xe8\x2e\x14\x77\x68\x1c\x42\xf7\x91"
- "\xae\x8a\x62\x11\x96\xf7\xa3\xfd\x3b\xd9\x37\x21\xc8\x37\xca\xcd"
- "\xeb\x46\x8f\x90\xc7\x0a\xdf\xc4\xeb\xd5\x32\xb5\x1e\xc6\xad\x63"
- "\x54\x8f\xea\xab\xf1\x8b\x62\x97\x9b\x62\x93\xdc\x5e\xf4\x7c\xc5"
- "\xc6\xe5\x79\x83\x3a\x2e\x6a\x16\x34\xb4\xb4\x07\x82\x1c\xd3\xa2"
- "\x77\xf2\x78\x16\xbd\x95\xea\xca\xf8\x61\xac\xcc\x38\xcf\x8e\x97"
- "\x2c\x00\xb1\xf8\x0c\xc5\x45\x53\x29\x97\x73\x68\x88\xd2\x8f\x8f"
- "\xe5\x7e\xf0\x98\x9a\xc7\x65\x31\x95\x16\x37\xc9\xf7\x4e\x51\x5f"
- "\xe8\x5e\xae\xe6\x1e\xed\x43\x82\xf5\xbb\xcb\x72\x05\xd4\xf3\x36"
- "\xa7\xb5\xa2\xa7\xbd\x77\x31\x86\x86\x14\x17\xaa\xb1\x77\xe8\x6a"
- "\x2e\xe7\xd0\x7b\xd4\xb8\x8b\x7a\x39\x44\xb1\x57\xbe\x37\x53\xa1"
- "\x99\xa2\x7c\xca\xf1\x7d\xe8\x62\xae\x57\x93\xa0\xe8\xfb\xa8\xd2"
- "\x8f\x17\xe4\x79\xf6\x37\x16\xd4\xed\xd0\x39\xaa\x6e\xb5\xdf\xc9"
- "\x7f\xb0\x7d\x23\x5d\xcb\x76\xbf\x42\x9e\xc3\x16\x11\x0d\xc9\xc4"
- "\x73\x44\x74\x6a\xe0\x98\x1a\xe7\x7a\x72\x5e\xe2\x63\x55\xf3\x71"
- "\x65\x8d\x08\x6c\x0b\x7e\x83\x79\x61\x58\x8c\x1a\x63\x58\x63\x3c"
- "\xd0\x7b\xd0\x4f\x88\xc3\x46\x50\x19\xbd\x37\x5f\x4b\x43\xf1\xe9"
- "\xad\x26\xbb\xc2\x73\x58\x88\x1a\x37\x28\x96\x1c\x74\xd6\x2a\x63"
- "\xba\x61\xe5\xc5\x4a\x2c\x39\x2d\x0e\xdb\xe1\x3f\x0e\x1b\xb6\xc3"
- "\x3f\x66\x98\x0f\x04\xc6\x0c\x1c\x37\xaf\x6a\xcc\x1f\xb6\xc6\x6f"
- "\x1c\x80\x65\x17\x8e\x1d\xc3\x52\xc8\x47\x69\x1f\x24\x39\x3e\xc9"
- "\xeb\x5e\xe6\x41\xaa\xcc\x14\x37\xcf\x2e\x57\xd7\x2f\xcc\xef\xd3"
- "\x58\x2d\xa0\x3d\xb7\x5f\xec\xa4\xf6\x54\x7e\x22\xd0\x5e\x3a\xa8"
- "\x07\x5a\x73\x19\x56\xa5\xc4\xf9\x8d\x7e\xb1\x52\xc9\x61\x14\x27"
- "\xfd\x73\x95\x69\xab\x7f\xae\x32\xbf\xd1\x3a\x46\x9a\xad\xed\xcf"
- "\x55\xe6\x64\x8a\x5b\x6a\x8c\xf4\x8f\x05\xe6\x15\xc5\x7e\x63\x59"
- "\xb3\xa8\x8e\x65\x7d\x71\x74\x58\x01\xc5\x28\x6c\xbf\x5c\x69\xdb"
- "\x69\x17\x23\x5c\x6a\xdb\x78\x3f\xe6\xa0\x84\xb6\x99\x6f\x4a\x41"
- "\x9b\x3a\xa2\x8c\x01\x65\xdf\x6c\xa2\xfd\x44\xc4\xa1\x12\xda\x5f"
- "\x0f\xb2\x33\xdb\xdc\x33\x50\xe7\xcb\x15\x15\x67\xe7\xa9\xfa\x1d"
- "\xfe\x9c\x76\x5c\xb8\xa1\x90\xad\x6e\xcc\x1f\x3e\x4d\xdb\xc7\x97"
- "\xb0\x2c\x57\x59\x43\x90\x75\x2b\xf3\x1a\x1e\x5b\x52\xe8\xdf\x37"
- "\xde\x8f\xe1\xa9\xd4\x0f\x9a\x13\x61\xfb\x51\x34\xee\xa1\xbd\xd0"
- "\xd0\x0a\xb7\x94\xb4\xd8\xfc\x75\xee\xf3\xd9\xda\xf1\x55\x3f\x91"
- "\x62\xa5\x32\xf7\xac\xc4\xf1\x4e\x9e\x76\x2d\xe6\xde\xbb\x93\xa5"
- "\xf4\x05\xb3\xe6\x2e\x9a\x79\x93\x34\x6b\xee\xac\x45\xb3\x66\xcc"
- "\x99\xb5\x6c\xc6\xa2\x59\xf3\xe6\xc6\x3c\x35\xe3\x89\x59\x8f\x49"
- "\x4b\x67\x2c\x94\x62\xad\xd1\xd6\x1e\xe0\x23\xbd\x5d\x9a\xb1\x70"
- "\xe1\xe2\xa7\x1e\x4f\x95\xe6\xce\x7a\x6c\xc4\x82\xc7\x17\x3e\xbe"
- "\x48\x9a\xb1\x60\xde\xe2\xb9\xa9\x52\x74\xea\xc8\xe8\xd8\x5b\x53"
- "\x7b\x68\xd7\xd0\x06\x1b\xa1\xc1\x7b\xae\xbe\x3e\xf7\x1c\x84\x18"
- "\x74\xe9\x0b\x0c\xd6\x59\x73\xf9\xba\xdd\x0d\x07\x46\x15\x80\xbc"
- "\xbf\x3a\xed\x5d\xcb\xf2\x87\xdb\xf1\x53\x24\x3a\xec\xa7\x54\x42"
- "\x7b\xac\x47\xb0\xc8\xc6\xfc\x1b\x50\x17\x23\xe5\xfd\x79\x51\x17"
- "\x12\xf6\x2d\x92\x9d\xab\xac\xc7\x31\x5b\x3a\xfd\xe6\xbb\xe4\x1c"
- "\x84\xe5\x2d\x01\x11\xcf\x50\x3c\x8d\xb4\xff\x3a\xd6\xc1\xb1\xe4"
- "\x8d\x7c\x2f\x04\xf1\xc6\x54\x47\xef\xc9\x63\x58\xde\xe4\x31\x1c"
- "\x97\x1b\x67\xa8\x6b\xd2\x49\xcf\x41\x12\xd9\x67\xad\x78\xa3\xbc"
- "\x96\xfd\x2c\xda\x32\xad\xc9\x9e\xfd\xe0\xae\x38\x1c\x0f\x1e\xb5"
- "\x5d\x27\xdf\x9b\xe1\x14\x20\x14\xe5\x12\x77\xaf\x88\x85\x97\xb1"
- "\xad\x85\x26\xc6\x1a\xf3\x6f\x34\xab\xeb\x69\xd8\x07\x23\xf6\xe5"
- "\x08\xef\xc7\x0d\xd7\xc8\xfd\x28\x64\x51\x05\x7d\x50\xbe\x7c\x92"
- "\xe7\xc6\xa9\x6a\x1f\x50\xee\x23\x76\xf1\x86\x72\x94\xd3\x48\x72"
- "\x05\x5b\xeb\xa3\xf5\x2e\x94\x73\x83\x77\x09\xea\x6d\x00\xdf\x4b"
- "\x29\xb7\x98\xfb\x1f\xf6\xe7\x50\x09\x7e\xcf\x39\x03\xa1\x2f\xd1"
- "\xbe\xdd\xd9\x03\xd9\x01\xa7\x1b\xaa\xd3\x8e\x80\xe1\x69\xe6\x60"
- "\x7f\xae\xaf\x57\xfa\x54\x49\xb1\xe1\x4f\xb3\x8f\x88\xd4\x27\xcc"
- "\x15\xa1\x25\x67\xda\x5c\x5b\x14\x5f\x8e\x60\x4e\xf6\x9a\x76\xcc"
- "\x15\x33\x9a\x74\x42\xe3\xad\xb3\x98\xa7\x1a\xf3\x63\x4c\xd8\x76"
- "\xba\x32\x36\x76\xb2\xe6\x69\x9a\xb1\x54\x0c\xd9\x99\xb3\x0d\xde"
- "\x21\x2a\x6f\xda\x0f\x9c\xea\x70\xfc\x63\x36\x60\x1d\x87\x86\xbf"
- "\x35\x90\x3f\xf1\xc4\xef\x0e\xb5\x1d\x3e\x0f\x8f\xa1\x31\x81\x03"
- "\x6d\xd9\xd1\x46\x7b\x51\xf9\x85\xec\x50\x35\x96\xe7\x9e\x07\x92"
- "\xeb\x50\x49\xa1\xcc\x9f\xf4\x3e\x9e\xf8\x3f\x1b\x01\xb0\x0a\x69"
- "\xce\xe6\xdf\x98\x4e\xeb\xbb\x78\x0f\xfd\xdf\x94\x16\xb8\x6e\xad"
- "\xd8\xf3\xed\x01\xf6\x1c\x97\x4f\x63\xc2\x02\xe4\x8f\x36\x94\xfb"
- "\x3d\x50\x7c\xa9\x1a\x59\x00\x66\x6a\x07\xbf\xd7\xd0\x7a\x48\x63"
- "\xfe\x88\x78\xb5\x3d\x86\xf6\x9f\xe3\xe5\x6b\x30\x8a\x6d\xc5\x54"
- "\x5b\xeb\x69\xaf\x05\xb6\x1b\xe3\x3b\xc9\x48\x36\x86\x75\x56\xa8"
- "\x36\x85\xb6\x7e\x48\xb6\xab\x30\x30\xb3\xfc\x11\x40\x7b\x83\x93"
- "\x5d\x15\xa3\x3d\x91\x5d\x21\xed\x16\xd5\xa6\xd0\xd6\x6a\x88\x0e"
- "\x65\xe8\x51\xb6\x2c\x4e\xa4\x18\x59\x27\x8e\xec\x4f\x36\xc6\xfe"
- "\x7b\xd2\x11\xd6\xf7\xa1\x23\x1c\xa7\x91\xfd\xab\x5d\x1c\x03\x9f"
- "\xde\x47\x38\x34\x7a\xaf\x41\x3b\xee\x41\x7a\xe6\x6b\xd5\x23\xfb"
- "\xa3\x6c\x35\xf2\x58\xfc\x19\xc4\x40\xce\x55\x23\x8e\x52\x7d\x45"
- "\x87\x55\x3e\x1d\x8e\x1c\x17\x4c\x87\x01\xba\x93\xf7\xa2\x66\xf9"
- "\x23\x27\x90\xaf\x60\x9d\x39\xea\x3e\xd4\xc1\xb0\xc4\x36\x44\xb1"
- "\x00\x42\xa8\x8d\x8a\x30\x99\xbe\x48\x6d\x23\x17\x75\xed\xc8\x4c"
- "\xbb\xa0\x3d\x57\x6c\x04\xa0\x35\x71\xaa\x1f\x15\x46\xfa\x1d\x79"
- "\xd4\x57\x9f\x39\x03\xeb\x47\x3f\xe6\x27\xab\x7c\xa2\xac\x8e\x97"
- "\x95\x7d\xba\x1b\xf3\x47\x45\x5e\x48\xde\x28\x89\xe7\x49\xdb\x60"
- "\xb2\xef\x51\xf7\x55\xaf\x07\xa0\x32\xe5\x7a\xc2\x59\xcc\x3d\x81"
- "\xeb\xfb\x6d\x3f\x6f\x18\xb5\xce\xff\x79\xc3\xa8\x55\x6d\x3d\x6f"
- "\x08\x68\xf7\x63\x6a\xd7\x5b\x32\x55\xa7\x69\x7b\xa7\x37\x48\xdb"
- "\x6a\xfd\x91\x1b\xb5\xf3\x99\xd8\x41\x24\xc3\x41\xcc\x53\xec\xfa"
- "\xa9\x3a\x86\x7c\x2a\xe4\x1c\x1e\x2b\xf1\xf1\x0b\x8d\x8b\x62\x81"
- "\x68\x02\xfb\xd1\x72\x84\x84\xd1\x7c\x18\xce\xcb\x17\x5d\x7e\x01"
- "\xf4\x26\x18\x18\x68\x51\x6f\x0b\x7e\xc4\xc0\x82\x5c\x84\x02\x48"
- "\x32\x3d\xc3\x83\x17\x29\xd7\x0e\xf9\x42\x6c\xa1\x6f\xb9\x7f\x09"
- "\x47\x77\x2e\xaf\xcc\xcf\x05\x3a\xa5\x3d\xab\x86\x62\xc2\x05\x6a"
- "\x33\x50\xab\x04\x3b\x68\xb4\x9f\x35\xb5\x0b\xf2\x5b\x2f\x13\x33"
- "\xe6\x56\xf8\xab\xd7\x4c\x7b\x4d\x25\xfe\xd7\x78\xe8\xa7\x69\x1a"
- "\x18\xa8\x4f\x95\x7f\xbe\x35\xa4\xaa\xa5\x48\xd8\x68\xd4\x36\x69"
- "\x84\xac\x2e\xf2\x17\x03\xfd\xe3\x42\x7e\x66\xbc\x2f\x95\xb7\x10"
- "\x5c\xeb\x5c\xa9\x21\xdf\xcf\xc5\x1f\x1c\x72\x81\x3e\x76\xf4\x18"
- "\xa0\xf9\x3e\x90\x7f\x0c\xaa\xbc\x8c\xfc\x2f\x7c\x48\x35\xdd\xd5"
- "\xaf\x3e\xf3\x18\x3c\x39\x18\xa9\x4f\xff\x83\x4b\xd5\x22\xad\x85"
- "\xfa\xee\x0f\x35\xfb\x5f\x0f\x73\xf9\x5f\xdf\x10\x7f\x39\x44\xb7"
- "\xd1\x3f\x99\xf6\xde\x00\xc3\xc3\x5a\x0a\x0d\x01\x2e\x63\xc8\x0b"
- "\x70\x21\xdf\xa1\x48\xa3\x47\x79\x8a\x34\xc5\x62\x70\xea\x1f\xe6"
- "\xb8\x6e\xa5\xe2\x10\x03\x1d\xc6\x56\x37\x7f\x16\x50\x46\xd7\x5d"
- "\x25\xa5\x6c\xf4\x87\xad\xe8\xe5\x32\x49\x73\xad\x8b\xc3\x7f\x36"
- "\x62\x64\xb5\xb4\xa6\xbd\x7a\x5c\x3d\xda\x71\xe8\xc8\x3f\xae\x1e"
- "\x3f\xd0\xc1\x78\x16\xc7\x48\x24\x7f\xd0\x7f\xac\x25\x50\x32\xe5"
- "\x06\x53\x0a\x98\xf2\xe5\xb2\xe4\xf1\xab\xc7\xd5\xe3\xea\x71\xf5"
- "\xb8\x7a\x5c\x3d\xae\x1e\x57\xc0\xa1\xd3\x4e\xac\x69\x7e\xda\x4d"
- "\xf9\xd4\xce\x7f\x74\xca\xa9\x2d\x13\x2e\xa5\x1e\x53\x0e\xc8\x8a"
- "\xb3\x49\x1b\x53\xec\xc6\xbc\xe4\x9a\xd8\xb2\x74\x47\xc8\xea\xf8"
- "\x4a\xf3\x96\xb4\x7a\xd3\x7a\xcb\x91\x71\xe5\x56\x97\xb8\x6a\x42"
- "\x45\xd4\xa6\xd4\xba\xb0\x82\xa9\x87\xc6\x6c\x5b\xe4\x0c\x5d\x33"
- "\xb9\x2a\xa6\x74\x4e\x43\x64\xd1\xb4\xa3\xe3\x77\xae\x70\x0b\xd9"
- "\x77\x7d\x34\xf8\x37\x8f\xd6\xf6\xc9\xff\xd5\x27\x37\xbd\xb3\xe0"
- "\x4c\x8f\x17\x13\xf7\xdd\xf0\x87\xd9\x27\xaf\x7b\xf5\xc1\xcf\x6f"
- "\x7f\x6f\x59\x53\xd7\xe7\x7f\xf1\xd7\xa1\xbf\x9b\x79\x22\xa2\xf0"
- "\xfe\xbf\xdd\xfa\xe7\x25\xe7\x7a\xe5\x4c\x39\x38\xf2\xcd\xb9\xa7"
- "\x07\x14\x3f\xf2\xcf\x3b\x3f\xc8\xf0\xea\x56\xfe\xfc\xc3\x41\xaf"
- "\xcf\x38\xde\x7b\xed\x2f\x3f\x1e\xfd\xf6\xfc\xef\xba\xbf\x90\xb0"
- "\x77\xf8\x1b\xb3\xfe\xd5\xef\x95\x07\x3e\xbb\x6d\xc7\xd3\xe7\xbb"
- "\x3c\x77\xcf\x9e\xe8\xcd\x8f\x7f\x15\xbe\xee\xbe\xc3\xb7\x6c\x5f"
- "\xfc\x7d\xcf\x97\xee\x3d\x30\x62\xeb\x53\xa7\xfa\x6f\x78\xf8\xd8"
- "\x1d\xef\x3f\xe3\xd1\x3f\x7b\xf7\xee\x21\xbf\x7d\xec\xcb\x6b\x5f"
- "\xfe\xbf\x9f\xde\xfc\xa7\x85\x67\xaf\xf9\xf5\xa4\xfd\x37\xfe\xf1"
- "\xc9\x6f\xae\x7f\xed\xa1\x7f\xfc\x9f\xbf\x2c\x6f\xee\xf6\xff\x26"
- "\xfe\xcf\xb0\xdf\x3f\xf1\x75\xdf\xff\xfe\xaf\xbf\x8f\x7d\x77\x69"
- "\xa3\x21\x37\xa9\x7a\xd4\x5b\xf3\xbe\x1d\x58\x32\xfd\x8b\x9f\xed"
- "\xca\x64\x97\xa2\x3f\x10\xb3\x86\xfc\xbb\x71\xe3\x1f\xcf\xaf\xee"
- "\x4c\x7d\x26\xe8\x14\xdc\x79\x41\xd6\x2d\xa0\x0b\x81\xae\x62\x27"
- "\x66\x0a\x9d\xed\x6f\x1b\x87\xa4\xad\xdf\x9e\x83\xfe\x56\x8e\xd6"
- "\xee\x6f\xc6\xf3\x7a\xb9\xc4\x37\xfb\x1f\xdc\x4e\x1e\x3f\xfc\xa1"
- "\xc3\xbe\xeb\x51\xb2\x2e\xd0\x15\xb5\x15\x02\xdd\xa1\x07\x5c\x03"
- "\xa1\xd0\x13\x7a\x81\x01\x8c\xd0\x1b\xfa\xc0\xb5\x10\x06\xe1\x10"
- "\x01\x7d\xc1\x04\xfd\xe0\x3a\xec\x4d\x24\xf4\x87\x01\x30\x10\x95"
- "\x32\x28\x78\x5f\xb2\x20\xce\x84\xff\xe0\xff\xc9\x10\x27\x5f\xa7"
- "\x5c\x2d\xff\xb7\x96\xdb\x94\xf2\x1a\xa5\xdc\x7e\xb5\xfc\xdf\x5a"
- "\x2e\xfd\x87\x3f\x07\xfd\x47\x3f\x75\x38\x64\xe0\xa3\x06\xbf\xb1"
- "\x43\xcb\x11\x58\xaa\x53\x8e\x96\x6b\xb8\x48\xfd\x56\xfc\xfc\xeb"
- "\x07\x1e\x71\x78\x8e\xe1\x5f\x33\x01\xf8\x73\x06\xa6\x3d\xdc\x85"
- "\xba\x8f\xc4\xde\x59\xf4\xc8\x24\x04\xc2\xe4\x7f\x2f\x7e\x6c\x8e"
- "\xc2\x13\xe3\xfc\xe6\xf1\x78\xfe\x0c\xcf\x49\x78\xde\xa7\xf2\x06"
- "\x9d\x70\x14\x74\x62\x18\xe8\xf4\x56\xfc\x2c\x03\x5d\x97\x09\xa0"
- "\xeb\x56\x01\xba\xae\xab\x40\xd7\x5d\xf4\x09\xdf\x47\x6a\x91\x52"
- "\x67\x54\xca\xb1\x48\x17\xb6\x45\xd3\x58\x47\xf3\x59\xf9\x3d\x53"
- "\xe3\xa5\xd1\x23\xc7\x8c\xbc\x25\x56\x1a\x31\x42\xba\x29\x76\x74"
- "\xec\xa8\xd8\x31\xa3\x46\xdf\x2a\x8d\xbe\xf9\xf6\x9b\x63\x6f\x8f"
- "\x1d\x2b\x3d\xf5\xf4\x82\x59\xa3\x63\x9f\x78\x5c\x9a\x9b\x3a\x6b"
- "\xa1\x34\x73\xd6\x82\xa7\x96\xce\x58\xf0\x78\x3b\x3a\xde\xb1\x83"
- "\x7a\xd7\xdf\xc3\xc5\xd4\x22\xa4\xc3\x0c\x22\x8e\x4b\x07\x71\xf2"
- "\x38\xf0\xdd\x31\x2b\x67\xab\xe3\xa9\x07\xef\xff\x3c\xfa\xa1\x5e"
- "\x1f\xfd\xfc\x89\xe8\x3b\xee\xfe\x6d\x6e\x19\x08\xc9\x63\x40\x98"
- "\xe8\x04\xe1\x8e\x7a\x10\x6e\x4a\x01\x21\x7a\x1a\x08\x2f\x86\x81"
- "\xb0\xb2\x1c\x84\xa5\x79\x20\x3c\xd9\x00\xc2\x23\x55\xad\xcb\xd6"
- "\x57\xf0\xb2\x7d\x0e\x10\x6c\x9b\x40\xd8\x66\x07\xe1\xf7\x2b\x78"
- "\x99\x1d\xcb\xfe\xb6\xe6\xb2\xeb\xe0\xd2\x8f\x8e\xe2\xaf\xfb\x5f"
- "\x9b\xb3\x38\x57"
+static unsigned int rss_eth_z8e_uncompressed_length = 561364 ;
+static unsigned int rss_eth_z8e_length = 157863 ;
+static unsigned char rss_eth_z8e[157863 + 1] =
+ "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\x32\x19\x60\xc4\xc0"
+ "\xcc\x84\x88\x53\x8b\xed\x60\x01\x47\xcb\x8f\x68\xb1\x8d\x16\x34"
+ "\x08\x28\x58\x7e\x29\xd8\x46\x09\x04\x14\x68\xd0\x08\x11\x22\x0c"
+ "\x10\x32\x61\x82\x36\x56\x20\x93\x18\x35\x42\x48\xf0\x8a\x2d\x6d"
+ "\x69\xc5\x16\x2b\xde\x62\x1d\x4b\x7c\x5f\xda\x26\x19\xda\x97\x7e"
+ "\x6f\x6e\x5f\x6c\x47\x1a\x69\xca\x0d\x30\x25\x03\x19\xc9\xcc\xd9"
+ "\xef\x67\xed\x7d\x4e\x32\x33\x4c\x50\xee\xbd\xcf\xf3\xfe\xd3\x3c"
+ "\xcf\xe4\x9c\xb3\xcf\xde\x6b\xaf\xbd\xf6\x5a\x6b\xaf\xbd\xf7\xda"
+ "\xeb\x10\x5d\xfd\x5f\x90\x2c\x7c\x49\x23\xf3\xcd\xb6\x0f\xfe\x1b"
+ "\xe5\xff\xf5\xf7\xaf\xbf\x7f\xfd\xfd\xeb\xef\x5f\x7f\xff\xfa\xfb"
+ "\xd7\xdf\xff\xbf\x7f\xa1\x34\x9a\x78\xde\x64\xa6\xdf\xf8\x88\xba"
+ "\xbd\x96\x11\x41\xd2\x8a\x5e\x79\x51\x44\xf1\x2a\x0d\xe3\xfc\x08"
+ "\xbe\xf2\xaf\x06\x69\x26\x1f\x59\x6e\xb2\x91\x4d\xbc\xe2\x30\x4d"
+ "\xdd\x4d\x54\x3b\x5c\x74\xbe\xf8\xb2\x08\x35\x95\x12\x1d\xd9\x8b"
+ "\xe7\x97\x45\xc7\x8b\xc3\x45\x18\x70\x96\x04\xa9\xa0\x96\xe1\x54"
+ "\xe0\xb9\x02\xe9\x48\x2b\x09\xd2\x92\xad\x9c\x56\x85\x72\x46\x7a"
+ "\x60\xeb\x45\x6a\x72\x46\xa9\x8a\xe1\x38\x63\x34\x6d\xa4\xc4\x63"
+ "\x0f\xf2\x66\x70\xde\x2d\xc3\x51\x6f\x16\x91\xf7\x65\x11\x89\xc3"
+ "\xc1\xc2\xf5\x70\xdd\x7a\xfe\x63\x49\xf5\x85\x90\xd6\x6e\xd4\xd7"
+ "\x0f\x0c\x1b\x97\xe7\x36\x38\xbf\x44\xe9\xa7\xe8\xda\xeb\x18\x26"
+ "\xe3\x26\xbc\x64\x09\x5c\x8a\xd2\x29\xba\xc6\xd5\xe5\xa5\xf4\x23"
+ "\xa0\xc6\x8e\x97\x65\x7a\x7a\x20\x1c\x25\x67\x19\xa5\xe1\xdd\x6c"
+ "\x5c\x4d\x28\x37\x84\xe9\x33\xbf\x9e\x46\x71\xdd\x80\x6b\x16\x26"
+ "\x7f\x5a\x63\x26\x11\xd3\x28\x6c\xa2\x9b\xc3\x5e\x4a\xeb\xf6\x5e"
+ "\x83\xf6\x5b\x5c\xb2\xfd\xa8\x17\x65\xcd\xa7\x68\xf0\x3f\x4d\xc8"
+ "\x8f\x3a\x43\xce\x8d\x8c\xc3\xe0\x0f\x85\xd7\x6f\x32\xe0\x68\x5e"
+ "\xff\xb5\x0d\x35\x44\x5d\x5e\xd3\xcc\xb0\xc9\x2a\x74\x38\x87\x0d"
+ "\x38\x9c\x0f\x75\x65\x70\x5d\x5d\x5e\x73\x4d\x5c\x9e\xa0\x91\x07"
+ "\x78\x87\x26\x84\x29\x9d\x71\x3e\x49\x83\x73\xb8\x3e\xbd\x2d\x66"
+ "\xae\x23\xb0\x2e\x4a\x01\xf4\x3d\xea\xce\x42\x5b\x9d\x47\x22\x44"
+ "\x80\x69\x6f\x2c\x23\x62\xf8\xc0\xdf\xa9\x60\x0e\x9e\x68\xc0\x64"
+ "\x18\xbd\x6d\xf5\xfa\x33\x1b\x25\x8e\xdc\x56\x0b\xe9\x79\x97\xc4"
+ "\xe3\xc8\x70\xd1\x96\xeb\xb9\x2d\x4d\xe0\x28\x3d\xcf\xd6\x5e\x7a"
+ "\xf4\xb6\xff\xda\xdc\x24\xd8\x0e\x05\x3b\x0d\xb0\xd3\xfc\x7a\xb9"
+ "\xde\xf6\x07\x93\xf2\xab\xbc\xb6\x6b\xc2\x26\xa1\xd3\x61\x70\x47"
+ "\x5f\xde\x6b\x6a\xe3\xf3\x02\x1f\x93\xa2\x2d\x99\x82\x34\xb8\x0d"
+ "\xed\x4c\x47\x9e\x59\xe8\x47\xa7\xfe\xfe\x3a\xfd\xbd\x03\xef\xee"
+ "\x51\xf0\xae\xcd\x89\x83\x67\x63\x78\xf1\xbc\xa5\x24\xca\x8c\xdf"
+ "\x00\x18\xc8\x03\xf1\x1b\x64\x31\xf8\x6d\xad\x43\x68\x9e\x2f\xa0"
+ "\x4d\x35\x56\xbf\xe6\x15\x14\x70\x47\xc8\x79\x03\x79\x4e\xd2\xb5"
+ "\x07\x00\x9f\x76\x6c\x24\x8b\xa7\x58\x44\x02\xee\x4e\x6a\x0d\x75"
+ "\x92\x27\x04\xd9\x88\x5e\xa0\xb2\x0b\xe0\xc5\xe8\x19\x2a\x7b\x9a"
+ "\x1c\x4d\xa5\x9f\x50\x2a\x5e\xd6\x4c\x82\x3c\x23\xb8\x6c\x3b\xb5"
+ "\xd6\xb7\x93\xa7\x3e\xb1\xac\xe7\x46\x72\xb4\xe0\x19\x7d\x6e\x65"
+ "\x3c\x58\xde\xa2\x99\x56\x7f\xe9\xab\x64\xf6\x8c\x24\x53\xcb\x32"
+ "\xbf\x8e\x4b\x86\x9b\x71\xd9\x7a\x9a\x2c\xaf\xaf\x00\x1f\x9e\x66"
+ "\x7c\xaf\xf7\xbf\xb9\x31\x62\x3a\xe2\x98\x45\x47\x1c\x27\xa8\xc9"
+ "\x31\x99\x9a\xdc\xd3\x68\xc7\x69\xca\x38\x12\x99\x44\x4d\xe6\xfb"
+ "\xa8\x69\xd4\x34\x0a\x74\xe2\x1e\xf2\x7b\xc4\x11\x26\xe7\x3a\xe6"
+ "\xa7\x8c\xc2\xda\x27\xc8\x12\x54\x30\x41\xbb\x8c\x92\x0f\x4a\x88"
+ "\x98\x76\xfc\x9c\xaa\x1d\x6b\xbf\x40\x0e\xe0\xd7\x01\x5c\xee\x04"
+ "\x2e\x3f\x1d\xe5\xa0\x6c\xe0\x3c\x28\x50\x17\x25\x73\x29\x5d\xd3"
+ "\x8f\x1c\x67\x69\xe0\x3d\xc8\x6e\x67\x03\xf4\x09\xcb\x6f\xd7\xa6"
+ "\x3c\xe8\x84\x0c\xc8\x7f\xc6\x56\x5d\x06\x3a\x3d\xaf\x91\xb9\x6b"
+ "\x7d\x5e\x5a\xe3\xcb\xa2\xbd\xdb\x3b\x84\x8c\x77\x90\xc5\x76\xbc"
+ "\xef\x98\x90\x45\xb6\x40\x34\x97\xde\xbf\xd4\xc1\xf2\xd8\x39\x34"
+ "\x4c\x69\x0c\xcf\xea\x86\xec\xac\xa3\x01\xc0\xe7\x0f\x8d\x48\xff"
+ "\x0a\xf2\xa1\x7c\x6e\x90\x5e\xea\xe4\xf2\xe2\xfa\x85\x61\xed\xfa"
+ "\x85\x17\xb4\x57\x16\x76\x89\x57\x16\x9e\x8f\xbd\xb2\xf0\x9f\x9e"
+ "\x0d\x64\x89\x5d\xbf\x30\xd4\x5a\x2c\xfb\xc0\xd6\x5a\x8c\x3e\x88"
+ "\x91\x65\xf3\x19\xb2\x2d\x7e\x1a\x7d\x1f\xfd\x88\x36\xaf\x24\x87"
+ "\x66\x1f\xee\x0e\x44\xff\x44\x8b\x4b\x49\xe0\xbe\x32\x55\xfb\xba"
+ "\x32\x1d\xbd\xb2\x85\x7a\x0f\x05\xcd\x43\x0f\x71\xbd\x21\xbb\x93"
+ "\xf0\x33\xe3\x67\xc1\x2f\x43\x64\x3a\x32\x40\x2b\xcf\xd0\x2d\x69"
+ "\xd4\x70\x89\x68\x82\x46\x69\xa7\x69\xc8\x71\xe0\x6f\xeb\x87\x6e"
+ "\x23\xb4\x9a\x85\xc1\x9b\xcb\xa9\xac\xbb\xbb\x90\x58\x17\xb2\xfe"
+ "\x63\x7d\xd8\xed\x1d\xea\x44\x3d\x11\x29\xbf\x2f\x43\xc7\x64\x2e"
+ "\x0c\x22\xbd\x23\xbc\xa9\x30\x2d\xb4\xa9\xd0\xd4\x95\xb9\xf0\x6f"
+ "\xc8\x33\x2d\x68\xb6\x66\xeb\x34\xec\x60\x58\x90\xad\xd0\x90\x28"
+ "\xa5\x03\x66\xf1\x3b\x17\xdb\xcc\xbb\x5f\x16\x27\x90\xaf\xa8\x17"
+ "\x16\x60\x03\x0e\xe8\x3f\xb4\xdc\x48\x03\xad\xdb\xb7\x23\x1f\x97"
+ "\x0f\x44\x72\x79\x4c\x09\x06\x8a\x3a\xc8\x1a\xa5\xc1\xa2\x47\xd5"
+ "\x87\x3c\x1d\xac\xd3\x87\x44\x68\x60\xb7\x97\xe6\x31\x6c\x2e\x17"
+ "\xe8\xec\x20\x94\xfb\x9b\xf0\x14\x9a\x90\x3e\xa7\x5b\x14\xa6\x6d"
+ "\x45\xfa\x11\x94\xd7\xeb\xee\x30\x70\xe4\x3a\xb8\xaf\x25\x9e\xe0"
+ "\x87\x23\x45\x11\x1a\x52\x47\xe9\x28\x37\x9f\xe1\x31\x2c\xf0\x41"
+ "\x10\x6d\xfd\xdb\x91\xa2\x10\x69\x22\x01\x66\x50\xc1\xb3\xe6\x24"
+ "\xc0\x43\xba\x00\x3c\xe6\xbf\x26\x94\x19\xb2\x47\xc2\x7b\xe8\x1d"
+ "\x8d\xe1\x45\xc8\xec\x94\xf8\x7e\x9b\x61\x74\xb3\xfe\x00\x4c\xff"
+ "\xba\x7b\xa9\x93\xac\x7b\x42\x9e\xc2\xf4\x56\x8c\x9b\x5c\xfe\xcd"
+ "\xb2\x8e\x01\xa2\x2b\x2f\x9d\x79\x8e\xdf\x07\xa2\xe7\x39\xcf\x16"
+ "\xd1\x55\x98\x3e\xa4\x13\xba\x08\x79\x50\xde\xcd\x78\xc6\xf7\xe5"
+ "\x43\xd3\xbf\x3d\x99\xbe\x3d\x6d\xe6\xb4\xc9\x34\x7b\xca\xd4\xc9"
+ "\x94\x7d\xe7\xb8\xec\x89\x5f\xfb\xc6\xd7\xe4\xcd\xd7\xbe\x91\xf3"
+ "\x35\x9a\xf7\x9d\x87\x26\xd3\xbc\x39\x93\x69\x3e\x7e\xf3\xe6\x4f"
+ "\x7f\x68\xda\xf4\xf9\x93\x29\xef\xbe\x99\x78\x9a\x3a\xf9\xb6\xec"
+ "\xfb\xc7\xcd\x9b\x3a\x73\x3a\x3d\xb8\xe0\xf6\xec\xdb\x6f\xa7\x29"
+ "\xd3\x67\xdd\x96\x9d\xad\x5f\x6f\xcb\xe6\x2c\x8f\xe6\x4c\x9f\x3f"
+ "\x6e\xde\x9a\xd5\x25\xab\xc7\xcd\x99\x39\x95\x53\xa0\xdd\xe2\x78"
+ "\xc8\x15\xbb\xa8\x31\xad\xc3\xe2\xdc\x0c\xd2\xa0\x3b\x1a\xc0\x03"
+ "\xf8\x75\xfa\xcb\x4e\x42\x07\xd8\x9f\x69\xe0\xbe\x93\x63\x80\xf5"
+ "\x30\xe4\xde\xdc\xed\xb5\x95\x82\x86\xc5\x4c\x43\xe7\x4d\xac\x27"
+ "\xae\x7f\x17\xef\x3e\xd0\xc7\x9a\x01\x78\x5f\x9f\xf8\x7e\x18\xf8"
+ "\xdf\xfa\x7f\xb7\x3a\x89\x02\xf8\x81\xee\x61\xe8\x42\xd0\x37\x44"
+ "\x5d\x9e\xbc\x01\xe0\xef\x34\xd4\xd1\x0e\xd9\x3c\x86\xb2\x6d\x71"
+ "\x32\xdf\x8e\xfe\x39\xc6\xe3\xca\x59\xb2\xbd\xd5\x5a\x92\x4b\xdc"
+ "\x4f\x81\x12\x1d\xc6\x85\x5e\x18\x83\x25\x0c\xf4\x3d\xe0\x1c\x57"
+ "\x70\xec\xce\x38\xfd\x10\x64\x38\x3b\xf0\x4e\x87\x75\xa1\x15\x7a"
+ "\x02\x7a\xfc\x77\x9a\xc7\x45\x22\xd3\x7a\x54\xeb\x71\xc9\xb1\x12"
+ "\xe5\xf2\xe2\xf8\x3a\xdc\xe4\x46\xbe\xd7\x67\xa4\x81\x0f\xd2\x30"
+ "\xfe\xa2\x2d\xb6\x65\xe0\xef\x70\xac\xc6\x69\x17\xe7\xf2\xd8\x8e"
+ "\x18\x78\x8a\x32\xff\x80\xf6\x35\x6b\x35\x4e\x9b\xe8\x96\x69\x4c"
+ "\xb7\x43\x82\x9f\x33\x91\xaf\xa7\x37\xed\x5d\x4e\x03\x1f\xa4\xb3"
+ "\xbc\x0a\x21\xd3\x31\x66\x66\x6e\x80\x4e\x6b\x43\x5e\x1b\xe7\x9d"
+ "\x10\xa5\x41\xd0\x35\x0e\xa7\x27\x8d\x4e\x52\x26\x69\x99\xce\xcc"
+ "\xb8\xfa\x00\x27\x93\x07\x29\xe6\x47\x73\xf7\x39\xc0\xe9\x92\xe9"
+ "\xb0\x63\x32\x17\x01\xfe\x30\xd6\x95\x4a\x7f\x5f\xff\x9f\x9c\x4f"
+ "\x1f\x9b\xfb\x9e\x21\xeb\x0a\xce\xf5\xff\x79\x04\xb4\x64\x7b\x81"
+ "\xed\xbf\x6e\x6f\xe6\x82\x20\x0d\x09\xa9\xb1\xf1\xfa\x36\xce\xab"
+ "\x01\x47\x61\x7b\xcd\x02\xb8\x59\xfe\x8d\x9d\x74\xaa\x98\xc7\xda"
+ "\x4c\x9b\xe6\x29\xa4\x44\x9c\xec\xcd\x8c\x3f\xeb\x0f\xd0\xe2\x4f"
+ "\xe0\x83\x6b\x00\x6f\x6f\x22\x1f\x64\xfa\x01\xc7\x0e\xfc\xda\xd0"
+ "\x26\x7b\x90\xec\x47\xb5\xae\x42\xd4\x4b\x26\xc8\x15\xf4\x79\x1f"
+ "\x0c\xbd\x7c\x7b\x62\x79\x7b\x25\x97\x43\xfe\x01\xdd\x5d\x32\xff"
+ "\x36\xa6\xb9\xce\x77\xe0\xcb\x61\x59\x49\x7c\xb9\x1b\xb8\xfc\x25"
+ "\xee\xfd\xc4\xa4\xf7\x5b\xf0\xfe\x6f\xfa\x7b\xc8\xfd\xb0\x05\x49"
+ "\x7c\x5b\x8c\xf7\x7f\x07\xbe\x61\xc8\x35\x6c\x0b\xfb\x0c\xf0\x58"
+ "\x28\x2e\xff\xd6\xa4\xfc\x7b\x90\xff\xbf\x98\x6f\x78\xcc\xe1\xfc"
+ "\x8d\xba\xec\x20\xbf\x05\xf9\x0f\x26\xd5\xbf\x14\xf9\xc3\x71\xf8"
+ "\x1d\x4f\x7c\x9f\x55\x8f\xf7\x9f\x32\xaf\xc3\x26\x1a\x80\x3c\x83"
+ "\x58\x97\xb0\x1e\x3b\x52\xc4\xfd\x95\x65\x4e\xca\x3f\x0a\xf9\x32"
+ "\x74\x1a\x99\x74\x1a\xcd\xe0\x7e\x44\x1d\x27\x14\x0e\x59\x39\x49"
+ "\x65\xf2\x50\x26\x0b\x74\xb4\x1b\x7c\x99\xa2\x4c\x51\x52\x99\x6d"
+ "\xdc\x8f\x42\xd5\x63\xee\xee\xe9\x2b\xa3\xeb\xc8\x78\x18\xdc\xb6"
+ "\x6b\x01\xe3\x40\x22\x8c\xe1\x1d\xa8\x77\xc4\x76\xa5\x77\xae\x05"
+ "\x0f\xdd\x8e\xb4\xff\x04\xcc\xeb\x58\x06\x20\xab\xe1\x40\x28\x42"
+ "\xc2\x33\x23\x43\xf1\xee\x75\xf6\xa1\x51\xe2\xfb\x71\x7c\xcf\xb0"
+ "\x45\xf7\x2c\x5d\x26\xaf\xb3\xe3\x8a\xf4\x2c\xb6\xdf\xd2\x58\x07"
+ "\x8b\xee\x6f\x69\x0a\xe6\x75\x77\x08\x13\x99\xf0\x1c\xd3\xeb\xf8"
+ "\x03\x9e\xd3\x80\x7f\x26\xc6\x1c\x12\xeb\x91\x6f\x23\x4d\x45\xfa"
+ "\x07\x52\x56\x55\x3e\xf9\xac\xea\x98\xc1\xfc\x3d\x11\xcf\xef\xea"
+ "\xe5\xdf\x62\x78\xb8\xbf\x4d\xbf\x4f\x8b\x31\xac\x73\x86\x0c\x0e"
+ "\xff\x91\x2c\x07\x39\x94\xf0\x51\x5e\xac\x97\xef\x18\xe6\x4b\xb8"
+ "\xce\xc4\x75\x0b\xae\x0f\xe2\xba\xc8\xf3\x29\x39\x3c\x31\x29\x8f"
+ "\xfc\x3c\x13\xd7\x87\x70\xbd\x03\xd7\xf9\xb8\x8e\xc4\xf5\x5e\xb4"
+ "\x21\xc6\x72\x81\x71\x94\xe7\x58\x61\x8c\xab\x8a\xb7\x78\x0e\xd0"
+ "\x3d\x83\x69\x30\x1d\x79\x3a\xa4\xbc\x2a\xfd\x62\x51\xfd\x78\x5d"
+ "\xa7\x4c\xcb\x94\x69\x83\x14\x3f\xa8\xb4\x98\xa1\x87\xce\xf5\xa5"
+ "\xe9\xba\x49\x97\x45\x3d\x4d\xc1\x9f\x07\xf8\x7e\xc6\x55\x28\x58"
+ "\x03\x54\x9f\xeb\xf0\x55\x39\x73\x8a\x3a\xd3\xe2\xeb\xc4\xb5\xd6"
+ "\xe3\x16\x02\xd7\x72\xee\xa3\x20\x0d\x3f\x20\x24\xdf\x63\x8c\x55"
+ "\xf0\xf2\xf5\x7c\x13\x99\xc6\xb2\xbc\x4c\xcf\x3a\x16\xc7\x4b\x99"
+ "\xdd\xde\xe1\xd1\x24\x39\xca\x06\x2f\x8d\x67\x9e\x61\xba\x73\xdb"
+ "\x86\x16\xcb\x71\x5c\xb6\x45\xc2\x3f\xa7\x78\xb2\x41\x9f\xb7\x2a"
+ "\xf9\xbd\x7e\x5a\x92\x7e\x91\x3c\x9b\x24\xef\x9d\x4c\xf3\xf4\x52"
+ "\x96\x83\xeb\x31\xff\x7b\x73\x84\xb4\x19\x6b\x9c\xc3\xf9\x7d\x18"
+ "\x7d\xcc\xf5\xa6\x17\x73\x3b\xae\xaf\x35\xde\xcb\x77\xf6\xfc\x25"
+ "\xcc\xdf\xe9\x45\xf2\xdd\x01\x8c\x47\x87\x8c\x77\x46\x3d\xe9\x25"
+ "\xf2\x5d\x73\x1f\x5c\x6b\x87\x0e\x37\x3d\x95\xcd\x27\x7c\xd6\xb6"
+ "\x71\x44\xa6\x5b\xcb\x69\x40\x20\x7a\x9c\xe6\x46\x45\x6c\x5c\x39"
+ "\x5d\x13\x88\xee\xa7\x5b\x88\xec\x81\xe8\x09\xba\x95\x68\x64\x20"
+ "\x5a\x0b\x1b\x64\x2f\xbf\x7f\xff\x66\x4a\x4b\xc3\xd5\x33\xa6\xdc"
+ "\x94\x16\x88\x96\xd0\xa8\x72\x33\xae\x45\x74\xdf\x00\xd1\x1d\x88"
+ "\xce\x42\xbe\x65\x34\x37\x26\xce\x4d\x1b\x20\xfe\x5a\x10\x23\xdb"
+ "\xac\x67\x85\x27\x10\xc5\x7c\x20\xda\x8c\x74\x4d\xcc\x8d\x7d\x8a"
+ "\x5f\xb7\xd0\x7c\xd6\x8e\xb9\xb1\x73\x62\xea\xb3\xef\xe3\xf9\xaf"
+ "\x02\x7d\x24\x02\xd1\x49\xd4\x1a\x0e\x23\x9f\x47\x88\x6a\x6b\xdb"
+ "\xe2\x0b\x26\xea\x81\x0d\xa1\x55\x5b\x3b\xd0\x96\x48\x0f\xda\x81"
+ "\xf1\xb5\xbb\x67\x13\xae\x35\xd6\x8b\xf2\xd9\x67\xb3\x08\x9b\x35"
+ "\x32\x1e\x93\x2b\x6e\x43\x20\xda\x4e\x05\x98\x1e\xcc\xdd\x10\x12"
+ "\x8c\xff\xd0\x2d\x3c\xb7\x9a\x44\xe8\x03\xeb\xdc\x0d\x1e\x81\x77"
+ "\x16\x61\xb7\x46\x02\xd1\x4e\x12\xd5\x28\x9b\x69\x1b\x20\xe1\xf9"
+ "\x6c\x2e\xe4\x0d\x71\xbe\x78\x38\x0c\x83\xf3\xce\x8d\x91\x15\xf9"
+ "\x5d\x3d\x76\x9b\x03\xbf\x1c\xfc\x0a\x51\x76\xa3\xf0\x66\x7d\x20"
+ "\x30\xde\xa3\x7c\x25\x9e\xeb\x22\x90\x61\x49\xcb\x18\x0d\x42\xfe"
+ "\x4a\xf0\xcb\x34\xf0\x1d\xf0\xb5\x1d\x92\xf8\xd6\xd8\xde\x89\xc8"
+ "\x76\xd8\x7e\xa9\xda\x61\x7b\x9b\xd3\xbb\x60\xeb\xe0\xbe\xad\x4b"
+ "\xbd\xfb\x0f\x94\x5b\x20\xcb\xf9\x6c\x6d\xc2\x66\xeb\x88\x40\xbe"
+ "\x40\xd7\x72\xa6\x23\xe8\x5a\xce\xb4\x04\xfc\xb6\x80\x7b\x1b\x09"
+ "\xbb\xad\x03\xf8\x44\x44\x8d\x7d\x70\x8f\xb4\x41\xec\x8e\x88\x84"
+ "\x6d\xbf\x1e\x70\xf2\xc1\xb7\xe9\xc2\x66\x77\x08\x9f\xdd\xd5\xe3"
+ "\x75\xd2\xdc\x0d\x22\x32\x37\xba\x25\x5a\xb0\x81\xd2\xc7\x52\x39"
+ "\xf0\x7d\x0f\x34\x5a\x86\x76\x36\xe1\x3a\x0d\xef\x69\x18\xea\x7a"
+ "\x5f\xd8\xed\x0e\xae\x4f\x54\xdb\x5d\x80\x39\x1a\xb0\x96\x31\x4e"
+ "\x9f\x7a\x09\xb6\x88\x3d\xe7\x53\x89\x9f\x3d\x4f\xf3\xd9\xdd\x9a"
+ "\xcd\x5e\x68\xf0\x10\xf3\x8f\xa2\x5b\x2d\xcd\x09\x8b\x68\x20\xba"
+ "\x9b\xc0\x63\xb6\xd6\xf0\x09\x7e\x8f\xf9\xcf\x7e\xf4\x33\xf3\x54"
+ "\x09\xae\x7b\x89\xf9\xa7\xb5\xf8\x59\xce\xfb\x3e\xf3\xd0\x9c\xe2"
+ "\xf0\x96\x71\x54\x9c\x86\x67\x4f\x41\xd4\x42\x8b\x8b\xcd\xe5\x31"
+ "\x9f\x7d\x46\x6b\x31\xf7\xcb\x71\x94\xe1\x72\x45\x64\x4d\xc3\x1c"
+ "\x20\x4d\x44\xad\xee\x90\x79\x48\xa1\x47\xb4\x86\x67\x21\x6f\x31"
+ "\x71\x7b\x98\x8f\x38\xff\xec\x4e\x11\x8c\xd9\xec\x11\x6e\x9b\x18"
+ "\x5a\x4e\x2d\x9d\x77\x10\xcf\xc3\x5a\x3a\xf7\x32\x9f\x6a\xa0\xcb"
+ "\x51\xf0\x68\xcf\xec\xce\xf2\x01\x8b\x2f\x50\x1a\xd2\x62\x2d\x85"
+ "\xfb\xf1\xbe\x09\xf9\x9a\x25\xdf\xce\xb9\x10\xb5\x46\x6d\xf6\x9c"
+ "\xa8\xcf\xde\x36\xe7\x42\x8f\x68\x29\xac\xa5\x45\x9d\xe5\xa0\xd5"
+ "\x7e\x9a\x7d\x26\x9a\xde\x5a\xbc\x0c\x79\xba\x91\xbe\x57\xf2\xff"
+ "\xec\x33\x5d\x62\xce\xd3\xe2\xdc\x9c\x0b\x7f\x15\xb3\x0b\xc5\xfb"
+ "\x05\x6e\x1a\x7a\xed\x16\xa1\xb1\x5c\x34\xb7\xef\xa7\x6b\x4f\x04"
+ "\x89\x65\x62\xd6\x52\x4d\xcc\x3e\x73\x4e\x2c\x7e\x9a\x69\x33\x89"
+ "\x5a\x0a\x21\x3f\xee\x5a\xa6\x77\x5e\x4b\xe1\x61\xd4\x3f\x0d\x70"
+ "\x3d\x22\xe0\xde\x8d\xbc\x7e\xeb\xa2\x33\x36\x6a\x6e\xaf\xa5\xa8"
+ "\xdd\x9e\x13\xab\xb6\xcf\xd0\xec\xf6\x42\xad\xda\xee\x46\x3f\x1d"
+ "\x8d\x56\xdb\xdb\x62\x76\x3b\x78\x20\x73\x06\xfa\xe9\x1a\xee\xf3"
+ "\x4b\x5e\x72\xe2\xf9\xbe\x4b\xdc\xff\xbe\xcc\x3c\x61\xcb\x74\xc3"
+ "\xe6\x15\x8a\xf7\x33\xf3\x78\x6d\x41\xd8\x33\xdd\x3d\xf6\xcc\x42"
+ "\xe4\x73\x2b\xf9\xca\xac\x64\xbe\x44\x3e\x13\xd2\xbe\x87\x79\x4f"
+ "\x3a\xde\xd7\xe1\xb7\x0f\x3f\xd8\xa1\xc3\xa0\xbb\xc8\x2e\x79\xca"
+ "\x37\xcc\x22\xee\xf6\xc1\x86\xbe\x00\x38\xc3\x5c\x73\x63\xf7\x08"
+ "\xd0\x10\x72\x32\xcc\xa2\x55\x0f\x83\x7e\x1f\x36\x23\x22\x79\x7f"
+ "\xd8\xfd\x0c\xbb\x67\x93\x8b\xd7\x1c\xcc\x78\x9f\x87\xb4\xdf\x45"
+ "\x98\x57\x6d\xc3\x8e\x6a\xb6\x2c\x17\x60\xb5\x7d\xeb\x59\x11\x8a"
+ "\xf9\x86\x45\x34\xdf\xb0\x8e\xe8\x40\xd8\xe6\xee\xc3\xc4\xfa\x29"
+ "\xfa\x6b\x01\x1a\x7c\x08\x7a\xec\x95\xfd\x1f\x70\x43\x06\x36\xdc"
+ "\x50\xde\xd2\x09\x5e\x28\xfe\xa9\xd4\x4d\xad\xe1\xe3\x92\xa6\xc0"
+ "\xe3\x28\xf3\x14\xf7\xef\xe2\x62\x2a\x47\x5d\x6d\xc0\xa5\x23\x56"
+ "\x0d\xb8\x76\xd4\x93\x39\xfc\x89\x88\x94\xd7\xe1\xe0\xd7\xc3\x28"
+ "\xf3\x21\x29\x1e\x1f\x5e\xd8\x9f\x8e\x64\x5d\xc5\xfa\x69\x6e\x34"
+ "\xc2\x3c\xf3\x77\xd6\x6b\x4a\x4f\x51\x81\xa1\xa7\x58\x47\xf1\x7c"
+ "\x87\xf5\x94\xa6\xeb\x29\x4d\xd7\x53\xf2\xd9\x66\x63\x58\x11\xd6"
+ "\x47\x73\xdd\x4a\xcf\xcc\x8d\x65\x0b\xf0\x46\x06\x60\x44\x54\x5f"
+ "\x20\x4f\x8d\x6d\x80\xcc\x2f\xe9\x64\x73\x69\xd0\x37\xf8\xe5\x68"
+ "\x4a\xdf\xb8\x75\x7d\x63\x32\xf4\x4d\x0c\xe3\x1a\x64\x4a\x4b\xa5"
+ "\x6f\x34\x5d\xdf\xc4\x84\xd2\x37\x9a\xae\x6f\x38\x3d\xa6\xeb\x9b"
+ "\x58\x0a\x7d\xa3\xf9\x6c\xdc\xde\x74\x5d\xcf\x94\xb3\x9e\xe1\xf6"
+ "\x6a\xd5\xb6\x0e\x4d\xe9\x19\x0b\xe6\x3a\x26\xd6\x33\x31\x94\xd1"
+ "\x0c\x3d\xd3\x2d\xf5\x81\x8b\x75\x4d\xcf\x73\x04\xfd\xe9\x24\xd6"
+ "\x31\x52\x9f\x44\x47\x46\x59\x9f\x80\x7e\xf7\x24\xeb\x13\xc0\xcb"
+ "\xc1\xbd\x4d\xd7\x53\x85\x98\xe9\x46\xa1\x4f\x66\xcc\x75\x87\xd1"
+ "\xd7\x1f\x61\xee\x0f\xbd\xed\x2e\x29\x0f\xb8\xa3\x04\x3d\xe0\x16"
+ "\xad\xe5\x04\x9d\x03\xfe\x8d\x41\x57\x10\x41\x2e\x8f\x42\x3e\x23"
+ "\xa8\xbb\xad\xb5\xf8\x4f\x04\x79\xcf\x99\xdd\xd9\x15\x58\x1c\x76"
+ "\xd9\x66\x9f\x11\x21\xd0\x27\xb8\xb8\xb8\x1c\xfa\xc5\x15\x6a\xe9"
+ "\x7c\x8f\x66\xb5\x0b\x6d\xd6\x92\xa0\x13\x78\xb4\xcd\x5e\xe9\xb7"
+ "\x2e\x7e\xda\x06\x39\x13\x7e\xe8\xc5\xff\x67\xf6\x19\x9b\x35\xbf"
+ "\x9d\xbe\x34\x6b\xa9\xd0\x20\x4f\xa0\x3b\xe4\x0c\xf2\x08\xdc\x0b"
+ "\x21\x73\x6e\xc8\xd9\xd1\x68\x92\x9c\x41\x66\xee\xc3\xbd\x53\xd1"
+ "\x2f\xd3\x0d\x39\xcb\xd3\xe4\x78\xd6\x2e\xe7\x98\x90\x35\x37\xaf"
+ "\xc5\x41\xd6\xf2\xb4\x6a\x25\x6b\x9a\x2a\x57\xa9\x31\xfd\x4c\xba"
+ "\xac\xa1\x2f\xf0\xbe\x0e\xbf\x7d\xf8\xa5\x96\xb5\xe2\x38\x59\x7b"
+ "\x5a\x97\x35\xbb\x92\x35\xf4\x69\x7a\x6c\x93\x92\x37\x86\xcf\xf3"
+ "\xd0\x5e\x79\xcb\x1c\x76\x14\xf7\x69\x8a\x77\x58\xe6\x86\x61\x5c"
+ "\x19\x16\x81\xbc\x75\x68\xbe\x2c\xc0\x13\x21\xd6\x9b\xe0\xcd\xbf"
+ "\xf0\x58\x37\xa7\x58\xfc\xa5\x20\x76\x43\x39\xea\x8a\x40\x97\xfd"
+ "\x15\x7a\xf4\x2f\x8b\xc3\xb4\x07\xb0\x8e\xa2\xbe\x36\xc8\x53\x87"
+ "\x56\x2d\xe5\xa9\x30\xb6\x89\x61\x0e\x2f\xec\x85\x21\xc7\xca\x44"
+ "\x79\xea\x6f\x1d\xb4\xdb\xeb\x2c\x0d\xd2\xaf\xa4\xdd\x84\xfb\xca"
+ "\x20\x1d\x9e\xa6\xdf\xc3\xfe\xd9\xe3\x90\x76\x0c\x64\xb0\xb8\x8c"
+ "\xae\x3b\x4d\x23\x67\x80\xdf\x09\xf7\x19\xb8\x9f\x35\xf7\x96\xf7"
+ "\x61\x47\x54\xe6\xa0\xde\x6e\x96\x43\xe1\x9d\xc8\xf6\x59\x2e\xf8"
+ "\xd0\x22\xba\x5d\x19\xb0\x2f\x1b\x44\x8f\x83\xd7\xda\xac\x78\x1e"
+ "\x8a\xf6\x8f\xc2\x35\x73\xf7\x45\xca\xc2\xcf\xb1\xdb\xab\x95\xb3"
+ "\xed\x84\xfb\x6c\xb1\xde\x31\x78\xc7\x3a\x1a\x6b\x0d\x93\xa5\xd1"
+ "\xab\xe5\x59\xb7\xd8\x78\xcd\x29\x8b\xef\x85\x77\xef\xa4\xc6\x8b"
+ "\x64\xe6\x75\x01\xcd\x8e\xfa\xdc\x56\x21\xd6\xba\xa8\x71\x0d\xf4"
+ "\x83\x97\x1c\x8d\x5e\x71\x20\xd6\xcd\x34\xb0\xb6\x19\xb8\x30\x6e"
+ "\xc0\xf3\x46\xe0\x99\xff\xf0\x86\x5c\xfa\xd0\x4d\x29\xd7\x6a\xbb"
+ "\xbd\x23\x7b\xdb\xdf\xcf\xfb\x7a\x83\x26\xfd\xbc\x3f\x6c\xd0\xa9"
+ "\x9f\x75\x3d\x33\x8f\xd1\xb1\x75\x22\x54\xf5\x04\x31\x2d\x1c\x9e"
+ "\xa8\xf8\x1b\xe8\x58\x5e\x16\xa3\x1b\xe7\x6e\xf8\xb2\x08\x74\x0a"
+ "\x7f\xc0\x7d\x86\x1a\xf1\xbe\xac\x54\x68\x9a\xdd\x09\x99\x77\x96"
+ "\x76\xad\x13\x51\x5e\xcb\xe9\xf6\xde\xe4\x0c\xd2\x37\xfd\xaa\x2f"
+ "\xec\x79\x72\x0e\x69\x73\x96\x02\x96\x9d\x61\xb5\xa0\x7c\xac\xda"
+ "\xb9\x15\xf9\x66\x04\xe9\xb7\x79\x32\x9f\xcd\x9e\x57\xbc\x91\xbe"
+ "\x78\x9a\x6e\x92\x34\x16\x3e\x67\x2d\xeb\x03\xa4\xd9\x90\xb6\x0d"
+ "\xf0\xeb\x90\xdf\x1d\xa4\xb7\x6b\x95\x1d\x7b\xd3\x36\x23\x1f\xee"
+ "\x97\xf0\x7d\x02\xff\xa4\xc9\xc5\x74\xc0\x72\xf6\x6d\x56\xa5\xe9"
+ "\xcb\xeb\xc6\x9f\x0d\xbf\xdc\xd4\xaf\xfb\xf4\xb9\xbd\x0d\xb6\x16"
+ "\x79\x36\xd3\x08\xf4\x0f\xf0\xfb\x4a\x1a\xe6\x11\xa7\x84\xf7\xa6"
+ "\xba\xd7\x37\x46\x30\x4f\xf8\x4a\x46\x90\x5e\x68\xea\x8f\x9e\x82"
+ "\x6d\x9d\x8b\xa2\xa3\x6a\x5d\x2f\x2d\x3f\x9e\xbb\x41\x13\x7c\xcf"
+ "\xfa\xa8\x11\xe9\x4c\x37\xc0\x59\x60\xd0\xac\xff\x7e\x71\xfa\xd4"
+ "\x9c\xf3\x2b\x07\x85\x57\x90\xff\x4b\xbc\xc7\xf4\x95\xb7\x15\x1d"
+ "\x32\x0b\xbb\xa0\x47\x78\x9d\x18\x73\xb3\xf0\x5a\x87\x88\x00\xe6"
+ "\xbe\x20\x8d\x35\xd6\x58\xc3\x81\xe8\x74\xd6\x2d\x29\xc7\x2d\xde"
+ "\x13\xeb\x83\x3f\xea\x78\xeb\x08\xe8\x21\xa9\x9b\xf2\xf7\x96\x29"
+ "\xbc\x23\x0c\xd7\x5f\x76\x9e\xda\xf1\x7e\x6d\x58\x74\x08\x5f\x7e"
+ "\x1d\xcf\x23\xfc\xeb\x2e\x71\xda\x9f\xc0\xdb\xc2\xbf\x86\x71\x1a"
+ "\xf5\x27\xff\x97\x2e\xd1\x29\x37\xa5\x37\xf6\xae\xff\x8c\xf2\xf3"
+ "\x7a\x8f\x5a\xe7\x1a\x95\x1b\xa4\x71\x11\x03\x2f\xb6\x31\x40\x5f"
+ "\x0b\xdb\x1c\x6c\x6b\xf0\xde\xc3\xda\x52\x11\x61\x9b\x03\x79\x8b"
+ "\x8c\x36\x70\xfb\x54\xbb\x46\x95\xc7\xb7\x8b\xf7\xa8\xac\xa5\x8a"
+ "\x06\x6b\x37\x90\xc5\xa9\x68\x6d\xe1\xf6\x72\x5b\xb8\xcd\xb2\x2d"
+ "\x52\xc7\x62\x8c\x88\xde\x81\xf9\x98\x4c\x77\x03\x16\xe6\x3f\x63"
+ "\x75\x9e\x1a\x95\x9b\xcc\x47\xbd\xfd\x68\xb3\xbb\x30\x07\xfd\x92"
+ "\x47\x13\x27\x4f\xd1\xe8\x47\xd4\xda\xd9\xe8\x47\x34\xb6\xb3\x23"
+ "\xcc\xbf\x63\xdc\x3c\x26\x07\x4a\x59\xdf\xca\xbc\xc3\x90\xb7\x1d"
+ "\x79\x66\xea\x79\x67\xaa\x3d\x3b\x79\x1d\xc4\x57\x8c\x63\xa3\x83"
+ "\x34\x7a\x49\x48\x8e\xf7\xf9\x4b\x8c\x67\xcc\xdd\x31\xff\x1b\xed"
+ "\x10\xd5\x63\xdc\xa9\x71\xc9\x72\xf1\x78\x16\xbb\x28\x3a\x51\xcf"
+ "\xf5\xcc\x53\x9e\x0d\xf4\x05\xf0\xe5\xc7\x65\x9b\x69\x18\xf3\x93"
+ "\xb0\x3b\xeb\x15\xdd\x47\xef\x17\x5e\xd8\x9e\xd0\xa8\xc5\xeb\xe8"
+ "\x8b\x90\xa3\xda\xd3\x34\xfa\x83\x82\x52\x27\x70\x25\xaa\x3a\x4b"
+ "\x24\x75\x90\xdd\x59\x17\x88\x7e\x42\x8d\x67\x79\x6d\x67\x74\xd0"
+ "\xe0\x45\xdc\x77\x5e\x49\x5f\x80\xae\xfb\xd4\xda\xc3\x98\x47\x78"
+ "\x9f\xe1\x24\x8d\x99\xc6\xed\x55\x7b\x9c\x63\xee\x10\x17\x45\xbe"
+ "\x50\x63\x5a\x5d\x90\xc6\x14\xe3\xba\x4f\xfe\xbc\xb4\x44\x7f\xae"
+ "\x43\xbe\x51\xe2\xa2\xc6\x79\xc0\xaf\x63\x26\x09\x6f\x1a\xcb\xc4"
+ "\xe1\x6e\xef\x98\xc2\x20\xdd\xdd\xa6\xfa\x66\xcc\x44\x86\xd5\x0f"
+ "\x0e\x75\xe8\x5b\x62\xde\x04\xac\x3f\x38\xcb\x78\xed\x72\xcc\x1b"
+ "\x52\x2e\x00\xab\xd1\xa4\xf4\xb6\x06\x5c\x1b\xbc\x5a\x21\x74\x74"
+ "\xa1\x56\xe3\x8a\xc8\x7b\xfd\x9d\xd0\xc7\xd1\xd4\xf0\xf3\xf7\xfa"
+ "\x6f\x60\x1e\xbf\x79\xac\x82\x93\x5f\xe7\xbf\xe1\x34\x3f\x8f\xe3"
+ "\xe7\xb0\xed\x96\x48\xa0\x2e\x17\xf5\x9f\x46\xbd\x37\x8f\x55\xf3"
+ "\xf9\x9b\xc7\x75\xa1\x8e\x6e\xef\xcd\x63\x83\x34\xc1\xac\xf6\x5c"
+ "\x6e\x89\xf4\xb7\x97\xcc\xb2\xc3\x32\xa7\x64\xda\x75\xa6\x65\x8f"
+ "\x94\xbf\x4a\xf0\xfc\x3e\x5d\x6f\xf0\x3a\x4d\xc6\x49\x72\x75\xb6"
+ "\x38\x24\x7f\x9b\x84\xe9\xe6\x6d\x3f\xd3\x42\x26\xde\x17\x53\xea"
+ "\xcb\xd5\x79\xf9\xef\x66\x3f\x7e\xc7\xf0\x3b\xa1\x3f\x77\xe0\x17"
+ "\xc5\xfd\x2c\xfc\x4e\x48\xda\xed\x5a\x96\x16\xc4\xbb\x2e\xd8\xec"
+ "\xfc\x1c\xa4\x9b\x8f\x8a\x5d\xa3\x4c\xb0\x4b\xe4\x7d\xe3\x17\x78"
+ "\x9d\xe0\xe6\x30\xfa\xa0\x54\xf5\x85\x4b\xae\xa9\x00\x37\xa6\xbb"
+ "\xf0\xd4\x89\x48\x53\x59\x98\xf1\x1e\xd5\x54\x17\x26\xe7\x18\x6e"
+ "\xbf\xcb\xc5\x6d\x0a\x83\xfe\x7c\x5d\x5b\x27\x42\x47\xea\xa3\xc4"
+ "\xfb\x73\xdd\x5e\x17\xe4\x7f\xe5\x2c\xb5\xe6\x90\xef\x67\x78\x3a"
+ "\x4f\x08\xa3\xfd\x4a\xa7\xdd\x12\xe1\xbe\xc4\xf3\x33\x68\xbb\xf5"
+ "\x2c\xb9\xde\x16\x99\xae\xc8\x91\x42\xa2\xdd\xd0\x23\x18\x6b\xe4"
+ "\x5e\x41\xa3\xf4\x0f\x70\x61\x1c\x18\x73\xc2\xd8\x4f\xda\x8e\xf7"
+ "\x3b\xf0\x0e\x63\x4f\xa8\xa5\x30\x42\x0c\x2b\xc6\xed\x43\xf9\xf7"
+ "\xb4\x90\x19\x63\x35\xfa\xfc\x96\x48\x59\x31\xf4\x4c\xaf\xde\x72"
+ "\xe5\x6f\x3e\x23\x22\x46\xfb\x8e\xec\x61\x59\x70\x81\xff\x9f\x2c"
+ "\xec\x97\xff\x7b\x71\xbe\xf5\x9a\x23\xa3\x54\x9f\x69\xa0\x4b\x62"
+ "\x9f\xdd\x6a\x51\xfd\x75\xcb\xa4\xc4\xfe\xba\x15\xb6\xcd\x2d\x5b"
+ "\xf1\xab\xc7\x6f\xbf\x7a\x8e\xff\xdd\x52\x1c\x77\x7f\x18\x3f\xe8"
+ "\xce\x5b\x30\xfe\x8f\x8e\xa8\x7e\xe0\x74\xb4\x83\x79\xe4\x9f\x64"
+ "\xd1\x7a\xf2\x88\xf7\x6b\x39\x9d\xf9\x99\xd3\x35\xd8\x33\x41\xba"
+ "\xc5\x87\xf7\x36\x96\xd5\x2a\x8d\x12\xde\x07\x50\xbb\x7f\x23\x74"
+ "\x35\xdd\xf2\x31\xc3\xb2\x6e\xa9\xac\x64\x3e\x45\x99\x5a\x6b\xb4"
+ "\x12\xf3\x83\x5b\x3a\x0d\xba\x22\xed\x38\xbf\x67\x9e\xec\xf6\xde"
+ "\x6a\x06\x5d\xf6\xc9\xfd\x58\xcc\xf7\x52\xdb\x1a\xb7\xba\x7a\x6d"
+ "\x32\xdb\x30\x0b\xeb\xa3\x4e\xfa\xea\x44\xe8\x2c\xf4\xad\x2b\xa4"
+ "\xc6\x9a\xaf\xde\xc1\xcf\xd0\x95\x1f\xe3\x3e\xbb\x05\x3a\xe9\x52"
+ "\x8d\x93\xd7\x71\x06\x5d\x32\x51\x6e\xb4\xa6\x32\x3f\x9a\xe9\xc8"
+ "\x08\x74\x1c\xa4\xd6\xe8\xcf\xc9\xf9\x84\x84\x71\x4b\x00\x3c\xe0"
+ "\xd9\x20\x62\x6f\x5e\xda\x67\x0e\x44\xcf\xf9\x31\x36\x7f\xf9\x34"
+ "\x7d\x55\xd2\xe3\x85\x93\x18\xf5\x17\x4b\xd8\x3a\x7d\x2a\x73\x76"
+ "\xac\x10\xd1\x1d\xa7\x44\x18\xf6\xdd\xe0\xed\x97\x68\xec\xce\x8d"
+ "\x94\x5d\x7f\x89\x46\x35\x5c\x22\x97\xf8\xbb\xcb\x54\x0f\xbb\x6d"
+ "\xf1\x05\x1b\x41\x27\xe4\x0d\x2d\x26\x4b\xc3\x46\x92\x3c\x12\xab"
+ "\x86\xfd\x16\x85\xfd\x76\xce\xc5\xba\xb1\xd7\x7e\xeb\x91\x76\xf1"
+ "\x48\x9d\x8f\x46\x9a\x87\x14\x52\x5a\xc6\x12\xb2\x01\x3f\xcf\x59"
+ "\xba\x75\x65\x06\x06\x44\x6e\x73\x50\x6f\x2f\x68\x5e\x6a\x2d\xa4"
+ "\x41\xb2\xad\xd0\xd7\xa2\xda\x15\xea\x77\x1c\x36\x31\x4f\x85\x59"
+ "\x6e\xb8\x0d\x5b\x78\xcf\xf8\xe0\x0d\x11\xf3\xda\x7a\x11\xe1\xf4"
+ "\x92\x91\x22\x82\xf4\x42\xae\xfb\x00\xd2\xbb\xbd\x5f\xf5\x05\xcd"
+ "\xd7\x36\xf7\xc7\xa3\x98\x1f\xe9\x7a\x65\xac\x5d\x98\xca\xc1\xa3"
+ "\xc3\x66\x6c\x8e\xc2\xf6\x3e\xcb\x32\x3b\xd6\x36\xb7\x48\x44\x9d"
+ "\xab\x78\xff\x7e\x2c\xb1\x6f\x01\xef\x29\xfe\x0c\xb6\xcd\x67\xf9"
+ "\x13\xf0\x78\xc1\x73\x05\x6b\x11\x60\xd6\x0c\x9b\x21\x30\x3f\xff"
+ "\xbc\xfe\x0c\x68\x67\xc6\x8b\xc3\xd9\xcf\x66\xec\xac\x20\xcd\xda"
+ "\xcb\xb8\x4b\x5f\x1a\xe8\x4e\xd8\x5b\xc3\x80\x57\x65\x18\x74\xc0"
+ "\x7b\x8c\xff\x33\xdd\xfa\xfe\x6f\x88\xf7\x5e\x91\x86\xf1\xff\x81"
+ "\xc3\x9c\x56\x32\x92\x1c\x25\x4e\xd1\xd1\x9f\xcd\xc4\x7b\xd2\x80"
+ "\x87\xf9\xe6\xd8\x83\x06\x1c\x8c\x53\x3f\xee\x32\x3d\xfc\x30\xd2"
+ "\x8e\x1a\x70\x90\xe7\x3a\x3c\xb7\xf5\xe6\x51\x65\x3a\xe2\xca\x3c"
+ "\xdc\x65\xba\xf5\xc7\x48\x8b\x26\x96\x19\x97\x91\x58\x66\xdc\x88"
+ "\xb8\x32\xe5\xaa\x9e\x71\xd9\x49\x65\x72\x93\xca\xcc\xbb\x1c\xb7"
+ "\x71\xcb\x92\xca\x94\x24\x95\xd9\x7a\x39\x6e\xe3\xea\x92\xca\xec"
+ "\x4b\x2a\x73\x28\x8e\x96\xec\x57\x93\x8d\xb4\xe6\xa4\x32\x27\x92"
+ "\xca\x74\x1a\xcf\xfd\xd0\x38\x63\xed\x6e\x72\x80\x37\xd9\x77\x2b"
+ "\xf4\x22\xfa\xa7\xeb\x95\x27\xbb\x55\xd9\xf1\xae\xcb\xdb\x35\x7e"
+ "\x52\x62\x7d\xe3\x67\x25\xd6\x37\x3e\xff\xf2\x76\x8d\x2f\x4e\x2a"
+ "\x53\x9e\x54\xc6\x17\x57\x66\x8f\x5e\xcf\xde\xa4\x32\x07\x93\xca"
+ "\x34\x5d\xce\x57\xe3\xdb\x92\xca\x74\x24\x95\x89\x7c\x06\x2d\x78"
+ "\x1c\x57\x7e\x6d\xc3\xd9\x56\xbe\x17\x36\xc2\x84\xa5\xec\x1b\xc1"
+ "\xfb\xa0\xaf\x5f\x8a\x0c\xe0\xfd\x39\x1e\xaf\x8e\xb8\x23\x18\x5b"
+ "\x26\x60\xfe\x33\xd1\x6f\x8c\x59\xec\x37\xc2\x32\xad\x6c\xec\x09"
+ "\xae\xfe\x6c\x51\xe9\x7b\xa6\xfb\xaf\x71\x5d\x47\x46\xf0\x38\x35"
+ "\xa1\xb6\xd7\x26\x56\x3e\x68\xa4\xc3\xf9\x87\xb1\x0f\xdb\xa8\xfc"
+ "\x51\xd2\xd8\x26\x3f\xe2\x96\x65\x8e\xc6\xd9\xd1\x5c\x7f\xf8\xe0"
+ "\xc6\x88\x39\x09\x8f\x7d\x57\xc0\x23\x03\xb6\x51\x65\x2b\x46\x2f"
+ "\xde\x5f\x6f\xa9\x87\x0d\x04\xbb\x9f\x71\x3b\x49\xd9\xd9\xd2\x26"
+ "\x5b\x75\x89\xf8\x3e\x50\x7a\x97\xdc\x7f\x57\x36\x69\x76\x61\x13"
+ "\xea\x67\xdb\xbd\xa9\xf8\x3c\xfb\xa7\x60\xfc\x65\xdb\x2d\xfb\xa5"
+ "\x23\xa5\x21\xe0\x95\xbd\xc4\xf0\x53\x09\x52\x76\xad\xb4\x35\x7c"
+ "\xf9\xe5\xec\x1b\xc0\x3e\x34\x47\xc2\x39\x9c\x07\xfc\x3f\xa1\xc8"
+ "\x68\x2f\xc6\xfa\x10\xf2\x4e\xba\x12\xcd\x54\x1f\x66\x1f\x4e\xe4"
+ "\xc9\x01\xe0\x95\xec\x63\x89\xfd\x9e\x1d\x4c\xec\xf7\xec\x50\x22"
+ "\x4f\x9a\xc0\x93\xb7\x99\x13\xcb\xdc\x96\x95\x58\xe6\xb6\x51\x71"
+ "\x65\x7c\xaa\x9e\xdb\x72\x92\xca\xcc\x48\x2a\x93\x17\xf7\x8c\x36"
+ "\xde\x56\xd8\x3b\xf7\x91\x3e\x50\xb7\xb9\xe3\x9e\x4d\xb5\x52\x7f"
+ "\xde\xb6\xcd\x48\xe3\xb5\xa3\x86\x97\x95\x0f\x8e\x0e\x6f\x5f\x92"
+ "\xbc\x73\xfe\xc3\x49\x38\x34\x27\xe1\xd0\x2b\xff\xfa\xde\xfd\x6f"
+ "\x4e\xd1\xed\x07\xf5\xbd\xfb\x4e\x8c\xd9\x73\xf9\x19\xb0\xea\x90"
+ "\x1f\x74\xb8\x3d\x23\x11\xde\xed\x23\x12\xe1\xdd\x3e\x36\xee\xd9"
+ "\x86\xe7\x49\x71\x6d\xb0\xa5\x3b\x28\x0d\xfc\x02\xfb\xed\xf6\x05"
+ "\x46\x3a\xcf\x29\x81\x6f\x87\x47\x8e\x35\xb9\xec\x5b\x96\x79\x92"
+ "\x6e\x9f\xc2\xf3\x4f\x1d\x66\xbc\xfc\x93\x6a\xd7\xed\xb5\x49\x78"
+ "\xec\x4d\xc2\xe3\x60\x5c\xbb\xc2\xd6\x2d\xf4\xa0\x35\xfa\xd0\x23"
+ "\x6c\xfb\xb0\x3f\xa5\xf4\xf1\xda\x0c\x9b\xed\x02\xd9\xd8\xb7\xee"
+ "\x54\x09\xa5\x07\xdc\x1d\x98\xcb\x8d\x4c\xb9\x0e\x23\xf9\x29\x33"
+ "\xdf\xa7\x7c\xab\xc8\xd9\xed\xfd\x5a\x96\xc1\x8f\x5a\x4d\xbe\x4f"
+ "\xab\xbe\xb9\x09\x69\xd0\x7f\xd9\x7b\x94\x9d\x7b\xb3\x4d\x78\xf2"
+ "\xea\x40\x4f\xcc\x8b\x26\x5e\xa7\xcf\x23\xf6\xb2\x8f\x18\xfb\xb1"
+ "\x62\x8c\xcf\x50\xfb\xf0\x5f\xcb\x8f\xe3\xeb\xb0\x73\xe3\x3d\xe2"
+ "\x24\x4d\x1c\xc9\x36\x00\xcb\x28\xfb\x9a\x1d\x89\x86\x88\xe7\xde"
+ "\x81\xe8\x69\x69\xbb\xe1\xbd\x53\x2f\x5b\x17\x57\x36\xa4\xcf\x8d"
+ "\x3b\xf8\xdd\x84\x28\x99\x8f\x84\x43\x04\x38\x59\xca\xde\x9b\x38"
+ "\xf2\x08\xe4\x15\x65\x9a\x8d\x32\x3c\x8f\x96\x7b\xbc\x25\x64\x1e"
+ "\x5f\x4a\x66\xff\xc6\x93\x12\xb6\xe1\xb7\x01\x5b\xba\x33\x50\xda"
+ "\x41\x81\x70\x1b\xaf\x75\x99\x95\x8f\xce\x44\x67\x7a\x84\x2c\x5d"
+ "\xd5\xf9\xe8\x93\x89\xce\x58\x75\x7e\x25\x70\xdb\x13\xa4\xaf\x4d"
+ "\x63\x7d\x13\x4f\xbb\xe9\xd3\xe7\x3d\x34\x77\xf6\xb8\xef\x3c\x34"
+ "\x73\xc1\xf4\xbb\x9c\x0b\x56\x3e\xb5\x7c\xd9\xb8\xd5\xcf\x94\x38"
+ "\xd7\xaf\x59\x59\xb2\x72\xd5\x77\x9d\xd9\xee\xd1\x6e\xe7\xd2\x12"
+ "\x75\x75\x15\x2d\x5d\x5b\x32\x99\x6f\xc7\x3a\x8b\xd7\x2c\x5f\x27"
+ "\x6f\x6f\x19\x4c\x89\x40\x56\x96\x2c\x5f\xe3\x1c\xbd\x6c\xac\xf3"
+ "\xbe\xa5\x2b\x8b\x9e\x59\xb3\x3c\x25\xac\xbb\x9c\x6b\x96\xaf\x59"
+ "\xbe\x74\x99\x73\xb2\x33\x9b\x21\xc7\x83\x8b\xeb\xcf\x6c\x63\x1c"
+ "\xe3\xf1\xab\xca\x2b\x8e\xe9\xe3\x59\x50\xf1\xcf\xc4\xf0\xe5\x63"
+ "\xd9\x1d\x96\x44\x9e\xbb\xc3\x91\xc8\x73\x77\xb8\x2e\x1f\xcb\xee"
+ "\x48\x1a\xff\xee\x48\x1a\xff\xee\xc8\xbf\x7c\x2c\xbb\x23\x69\xfc"
+ "\xbb\x23\x69\xfc\xbb\xa3\x77\xfc\x03\x2f\x49\x3f\x3a\xa4\x25\x8d"
+ "\x7f\x77\x24\x8d\x7f\x77\x34\x25\x3d\x1f\x8f\x7b\x1e\x86\xe7\xf6"
+ "\xf8\xf1\x11\xcf\x61\x43\x3e\xfb\xf4\xcb\xd7\x2d\x46\x1e\xd6\xf5"
+ "\xd0\xcd\xed\x2a\xef\xd7\x9d\x71\x79\x3b\xf4\xbc\x13\x7b\xe5\x8f"
+ "\xf7\xb5\x91\xae\xe6\xeb\x5f\x7f\x95\x75\x3a\xfb\xe3\xf1\xd8\x04"
+ "\xf9\xf8\xf2\x59\xfa\xba\x9d\x61\x31\x0f\xb3\x7f\xa6\x78\x65\x61"
+ "\x77\x63\x26\x59\xb8\x4c\x63\x0d\xfb\xf5\x4e\x1c\xcb\xbe\xba\x48"
+ "\x63\xdf\x65\xe8\x94\xaf\xc3\xfe\xcd\xa8\x57\xe3\xc5\xd7\x83\xd2"
+ "\xe6\x47\x19\x1d\xbe\x9c\xd7\x00\x0e\xfb\x02\x5b\xaa\xd4\x58\xdc"
+ "\x8e\xfb\x0c\xe6\x69\x94\x37\x0b\xd3\xc4\xa7\xd9\x07\x1a\x69\x36"
+ "\xfc\xb2\x00\x2f\x68\xc0\xdb\x3a\x3c\xb5\x6d\x99\x6c\xe7\xf6\xce"
+ "\x07\x4d\x64\xad\xf2\x6a\x6d\x01\x8d\x6d\xeb\x6f\x64\xa9\xb5\x05"
+ "\xa7\x53\x78\xdf\xcf\x6b\x44\x7a\xea\x79\xd2\x37\x60\xff\x7d\xc3"
+ "\xa2\xd6\x5b\xbe\x81\xfe\x9f\x3d\x51\xad\x9d\x3a\x9d\xd0\xb7\x97"
+ "\x00\xe7\x02\xae\x3d\xb8\xfe\xa7\x01\xdf\x2f\xe7\xdb\xdf\x28\x11"
+ "\xde\xb4\xf9\x0c\x37\x29\x7d\x1b\xf4\xdb\x25\x6b\xb4\x3c\x2f\xc5"
+ "\x3b\xcc\xb3\xd3\x1f\x4a\x91\xee\x87\xcd\x70\x09\x78\x84\x19\xdf"
+ "\xb8\xf4\x36\xe1\x1d\xba\x80\xf3\x07\xb9\x3e\x94\xe9\xcf\xd6\x36"
+ "\xfc\x6f\x95\x0f\x7f\xce\xa8\xa4\x76\x7c\x7a\x8a\x72\x5e\x53\xed"
+ "\xc8\x89\x25\xd6\x9d\x33\x29\x75\x3b\x72\x16\xa0\x1d\x9f\xa6\x6e"
+ "\x47\x4e\xb1\xa4\xad\x09\x6d\x31\x5d\xf6\x6e\x1b\xda\xf2\xa9\xa4"
+ "\x7b\x62\xfa\x5e\xdd\x16\x0a\x63\x1e\x66\xc3\x3b\x59\x76\x7e\x69"
+ "\x5f\xbf\xe9\xf9\x9a\xad\x75\x34\x2f\x45\x9d\xed\xc2\x3b\x68\x7e"
+ "\x90\xee\x94\xe7\x1a\xe2\xd2\xa3\x0a\x17\xd0\xc9\xc4\x74\x42\x7b"
+ "\x50\xae\xbf\xfe\x36\xe6\x25\x6a\x2d\xe4\x4e\xc8\x7f\x0e\x19\x6b"
+ "\x99\x6b\x4b\x45\xc8\xa0\x23\xde\x15\x26\xbd\x8b\xc4\xbd\xdb\x9a"
+ "\xf0\x6e\x73\x6f\x7a\xbd\x91\xfe\xf9\xfa\xe9\xce\xe6\xa4\x7e\x42"
+ "\xff\xdc\xb5\x28\xb1\xdd\x77\x9e\x50\xed\x43\x1f\x5d\x46\xeb\x3b"
+ "\x23\xe8\xa3\x9e\xd4\x7d\x74\x57\x56\x6a\x5e\xbb\x4b\xae\xa3\x89"
+ "\x4c\x4a\x01\xef\xae\x19\xe8\xbb\x1e\xc9\x83\x7a\x3f\x5d\xde\x3f"
+ "\x77\x15\x19\xfd\xf3\xf9\xda\x78\xd7\x81\xa4\x36\xc6\x4e\xd1\x37"
+ "\xc7\xa9\xb6\x7e\x73\x73\x12\xec\xa3\xa9\x79\xf1\xae\x20\xda\x19"
+ "\xeb\xa7\x9d\xd1\xfe\x79\xf1\x9b\x0e\xb4\x27\x76\x39\x2f\x7e\x33"
+ "\x5b\x95\xa1\x54\x65\x66\x09\x6f\xaa\x7a\xbe\xb9\xcc\x13\x65\x3b"
+ "\xf7\x9b\xf5\xbc\xbe\x14\x97\x5e\x9a\xc8\x7f\x68\x03\x97\x63\xfa"
+ "\x45\x95\x9e\xe5\x7e\x38\xe5\x24\xd3\x67\xf1\x64\xb7\xf7\x9b\x27"
+ "\x92\x68\x75\xee\x14\x4d\x5a\xd4\x65\x4a\xdb\xab\xe8\x35\x79\x64"
+ "\x12\x4e\x91\xd4\xf4\x9a\x64\x03\xbd\xce\xa5\xa6\xd7\xa4\xb1\xfd"
+ "\xd3\x6b\x12\xf7\xff\xb9\xcb\xe9\x35\x69\x49\x3c\xbd\x60\xeb\xca"
+ "\xf6\x7d\xc5\x01\xde\xe8\x29\x10\x8d\xdc\xd6\x18\xd9\xac\xe0\x15"
+ "\x55\xa6\x93\xcb\xd4\x5a\x23\x8a\x4f\x60\x43\x5a\xce\xd2\xa4\x52"
+ "\x43\xfe\x87\xd6\xd1\x20\xd1\xb3\x90\xfd\x88\xd2\xb8\x5c\xc0\x7d"
+ "\xce\x1f\x88\x66\x13\xcf\x3f\x92\xea\x6d\x4b\xad\x0b\x26\x85\x40"
+ "\xd3\x9a\xcb\xd3\x27\x5b\x94\x1f\xd9\xe4\xdc\x44\x1d\x31\xd9\x99"
+ "\xd8\x47\xa0\x1b\xca\xe9\xdb\x4e\x9f\xf9\xbb\x72\x9f\x4d\xf6\x5d"
+ "\xde\x67\x77\xdf\xa6\xfa\xeb\x6e\x7b\x12\x7e\xfb\x52\xf7\xd7\x64"
+ "\x7f\xff\xfd\x35\xf9\x44\xff\xfd\x35\x99\xd7\x4f\xcf\x05\xe9\xee"
+ "\xec\xc4\x71\xe3\x6e\x5b\x62\x7b\x51\x2f\xca\x09\xd3\xc0\x61\xfc"
+ "\xfc\x79\xdb\x6d\xfc\x58\xc7\x71\x5f\xf1\xb9\x22\xe0\x3f\x92\x71"
+ "\xbc\x5a\x18\xfd\xc2\x06\x0d\x7d\x1b\x53\xef\xb7\xf2\x1c\xb7\xb5"
+ "\x8e\x88\xf7\x91\x9d\x5f\x62\xdb\xfd\x9e\x01\x9a\x89\xda\x70\x6f"
+ "\x3a\x45\xb9\x7f\xd0\x4c\xa6\x52\xde\xf3\x94\x7e\xeb\x72\x0d\xe1"
+ "\x9e\x11\xf1\x7d\xc1\x7b\x9f\x3c\x37\xdd\xa1\xe6\x4e\x7f\x45\xf9"
+ "\x37\x54\xbf\xe4\xbe\x95\x48\xc7\x7b\x72\x53\xf7\xcb\x3d\x79\xe8"
+ "\x97\xbf\xa6\xee\x97\x7b\x4a\xfa\xef\x97\x7b\x7c\xe8\x97\xbf\x5e"
+ "\x2e\x47\xf7\xec\xd3\xe5\xa8\x82\xcb\x38\x57\xf1\x7c\x3c\xf7\x0b"
+ "\x9c\x07\xf7\x90\x91\x5c\x49\x93\x71\x9d\x86\x1c\xc9\x32\x27\x00"
+ "\x4b\xd6\xaf\xf2\xdc\xd3\xa6\xc3\x88\x83\x9b\x4b\xd6\xce\x54\x72"
+ "\x92\xeb\xe0\xbc\xe3\x8b\xc9\x02\x1a\xe6\xed\x66\x18\x6b\x88\x50"
+ "\xcf\x53\x9c\x8f\xd3\xc7\x87\xe3\xe5\x24\x77\x86\x91\x8f\x75\x9d"
+ "\x9e\x37\x57\x74\x17\x12\xe7\x4b\x82\xad\xb7\x7f\x90\x1c\x47\x38"
+ "\x3f\xe7\x4b\xca\x53\xa7\xe4\x31\xf7\x44\xa2\x3c\xe6\x1e\x48\xe4"
+ "\x4f\xd0\x1f\xe5\x34\xe8\x39\xdc\x9b\x81\xc3\xe7\xe6\xaf\x2b\xcb"
+ "\xe6\x94\xb1\x49\xb2\x09\x1e\x98\xd2\xa2\x78\x60\xca\x4f\x13\x71"
+ "\x9d\x32\x2d\x35\x0f\x4c\xc9\xef\x9f\x07\xa6\xb8\xfb\xe7\x81\x29"
+ "\xb5\xcc\x03\x41\x9a\xd2\x9c\x28\x9b\x53\xf6\x27\xb6\x1d\xf5\x4a"
+ "\xd9\x24\xfb\xd5\xc8\x26\x6c\xa1\x61\xfd\xc9\x21\xcb\x14\xfb\x8f"
+ "\x34\x5e\x32\xf6\x3a\x3e\x17\xcd\x2c\x90\x2b\xe0\x77\xef\x12\x5e"
+ "\x53\x82\x8e\xcf\x61\x1a\x36\xc8\xf3\x98\xf7\x96\xc4\xd3\x71\x87"
+ "\x3a\x03\xe9\x41\xde\x4f\x79\x5f\x59\xd1\x73\xea\x07\x89\xed\xbf"
+ "\xb7\x36\x35\x3d\xef\xdd\x0f\x7a\x7a\x52\xd3\xf3\xde\xa3\xfd\xd3"
+ "\xf3\xde\x76\x3e\x23\x75\xb9\x4c\xdd\x1b\x75\xae\x93\x36\x8a\x2c"
+ "\x73\x96\xa6\x3e\xfc\xf9\xc6\xa7\xa9\x13\x13\xc7\xa7\xa9\x23\xae"
+ "\x7e\x7c\x9a\xea\x4e\x3d\x3e\x4d\xf5\xa5\x1e\x9f\xa6\xee\x53\xf2"
+ "\x30\x35\x98\x28\x0f\x53\xfd\x89\x3c\x01\xda\xfd\xaf\x8d\x4f\xd3"
+ "\xb2\x93\x64\xa0\xea\x14\x4d\x7b\x0b\x36\x45\xb9\xea\xb7\xe9\xcf"
+ "\x24\xe2\x38\x6d\x56\xea\x7e\x9b\xb6\x0c\xfd\x56\x95\xba\xdf\xa6"
+ "\x95\xf7\xdf\x6f\xd3\xea\xd1\x6f\x55\x97\xf7\xdb\xb4\x83\x57\x6f"
+ "\x53\x4c\xeb\x48\xec\xb3\x69\xc7\xae\xbe\xcf\xa6\x8f\x4d\xdd\x67"
+ "\xd3\xa7\xa5\xee\xb3\xe9\xba\x6f\xfa\xf4\xda\xc4\x3e\x9b\x5e\x92"
+ "\xd8\x67\xa0\xdb\xff\xb0\xcf\xd0\x3f\xa3\x94\x7f\xc2\xf4\x0b\x98"
+ "\xb7\x0f\xea\xf6\x4e\xef\x0c\xd2\x7d\x07\xd5\xdc\xfa\x3e\x35\x76"
+ "\xa8\x3e\x7c\x13\x79\x82\x97\x8f\x03\xf7\x59\xf4\xb4\xef\x5c\xde"
+ "\x0f\xf7\x8d\x82\x8e\xee\x6c\x2a\x95\x7b\x5b\xaa\x0f\x99\xe6\xc8"
+ "\xe7\xdf\xc8\xfb\x53\xf7\x4d\xe3\xb2\xe8\x63\x11\x88\x44\x89\xf5"
+ "\x3a\xf2\x87\x19\x0e\x9f\x0d\x4d\x82\x55\x7c\x35\x63\xfc\x15\x7c"
+ "\x6a\x46\xf9\xcb\x6e\x07\xbc\xfb\x9f\x55\xbc\x7a\x5f\xb2\xfd\xdb"
+ "\x88\x77\x8f\x28\x3e\x9d\x39\x3a\x09\x87\x70\x6a\x3e\xbd\x3f\x03"
+ "\x6d\x68\x4c\xcd\xa7\xf7\xbb\xfa\xe7\xd3\xfb\xd1\xff\xd4\x18\x37"
+ "\xf7\xc9\x5c\x1c\x0d\x26\xcd\x7d\xee\x2f\xb4\x86\x15\xef\x48\x9b"
+ "\xa8\xda\x39\xaa\xdb\x7b\x7f\xb2\xfd\x87\xbe\x99\x31\x44\xc7\x79"
+ "\x40\x52\xf9\x7e\xec\xbf\xfb\xd9\xfe\x7b\xb3\x1f\x9c\xaf\x60\xff"
+ "\xdd\xcf\xf6\xdf\x9b\x97\xcb\xd6\x0c\xdd\xfe\x4b\x35\xc7\x9b\x31"
+ "\x36\x75\xff\xcf\x48\xea\x7f\xca\x2b\xc1\x7c\x58\x96\x4f\xcc\x57"
+ "\x14\x9f\x8f\x7d\x93\x38\x2f\xf3\x48\x8a\xbc\x75\xc9\x30\xfb\xc9"
+ "\xe7\xbf\x8c\xf7\xd8\x97\x2a\x25\xef\xcd\xd0\xcf\x94\xcc\x9c\x96"
+ "\x28\x8f\x33\xcd\x89\xf2\x78\xff\xbe\xc4\x72\x33\x47\x25\xbe\xbf"
+ "\x2f\xfc\xbf\xa7\x63\x67\xd6\x26\xf1\xc0\xfb\xa7\xe8\x01\xbb\xe2"
+ "\x81\x07\x56\x26\xe1\xb1\x3f\x35\x0f\xcc\x6c\x42\xfb\xdf\x4f\xcd"
+ "\x03\x33\x83\xfd\xf3\xc0\xcc\x28\x68\xf9\x7e\x3c\xdf\xce\x2f\xcd"
+ "\x1d\x94\x98\xe7\x01\x67\x6a\x9d\xf7\x40\x4e\xea\x35\x82\x07\xe6"
+ "\x29\x1a\x3f\x50\x99\x48\xe3\x07\x0a\x13\x69\x88\xb6\xfc\xcf\x69"
+ "\xd8\x1b\x0f\xa2\xdb\xfb\x40\xb2\xfc\x07\x4e\xd1\xb7\x74\xf9\x9f"
+ "\xf5\x60\x12\x8e\x61\x85\x4b\xaa\x75\x91\x6f\xf1\xfc\x37\x90\x9a"
+ "\x96\xdf\x1a\x9b\xba\xcd\xdf\x9a\x86\x31\x28\xa0\x5d\x26\x4b\xdf"
+ "\xca\x47\xfa\x7c\x5e\x0f\xe5\xf5\x90\x06\xa4\xcf\x8f\x92\x45\x8e"
+ "\x57\xbd\xe3\xd2\xb7\xca\xd9\x17\x85\xe9\xcf\xfc\x6b\x1d\x41\xf3"
+ "\x78\x0c\x62\xbc\x0a\x4a\xa5\xdf\x82\x75\x2b\xf3\xfa\x4d\xcc\xeb"
+ "\xdf\x92\xf6\x1f\xef\xb3\xb0\x1f\xa1\xd5\x4d\xf3\x38\x2e\x85\xc1"
+ "\xef\x9c\x3f\x09\xf6\x09\x96\x0b\xce\x6f\xe4\x55\xeb\x66\xe5\x49"
+ "\xba\x69\x96\x39\x75\x1f\xcf\x1a\xd1\x3f\xef\xcc\xca\x51\xfd\x3c"
+ "\xab\x28\xb1\x9f\x67\xcd\xd3\xbc\x43\x17\x70\x5b\xc1\x03\x57\x25"
+ "\x27\x25\x4e\xd1\x9f\x6f\x85\x59\x54\x2c\x64\xdf\xe0\x2f\x9d\xa6"
+ "\x59\xc7\x65\x7d\x26\x11\xb1\x6e\x49\xa3\x26\xa9\x03\x66\xdf\x22"
+ "\xf1\x44\x9e\x82\x28\x99\x44\xc5\x93\x6d\xfc\xae\xd1\x2b\x22\xc8"
+ "\x77\x8c\xf7\x04\xf8\x6c\x35\x78\x61\xd8\x49\x9a\x75\x26\xa1\x3c"
+ "\x24\x3f\xa0\x60\xb8\x1a\xa5\x3c\xce\x1e\x65\xac\xe9\x6e\xc5\x73"
+ "\xea\x75\xdf\xd9\x33\x0c\xdf\x07\xe5\x33\x36\xbb\xdf\xfd\x4b\xc6"
+ "\x89\xcf\xca\x30\x4e\x57\xd6\x03\xb3\xeb\x0d\xfe\x55\xbe\x96\xb3"
+ "\xf7\xf7\xf9\xf2\xcd\x3e\x84\x77\x4b\xae\xb0\x36\x18\x27\x07\xb3"
+ "\xdb\xe3\xe1\xa8\x98\x28\xb3\x23\x86\x3f\x5e\xb7\x77\x8e\xf9\x33"
+ "\x60\xe9\xf8\xcc\x19\x9b\x88\xcf\x9c\x49\xb0\x53\xb2\x74\x18\x33"
+ "\xae\x04\x83\xfb\x5c\xf1\x2c\xf3\xc3\x9c\x25\x57\x5a\xf3\x4b\x77"
+ "\xd0\xbc\x17\x2f\xe3\xad\x39\xd2\x5e\x62\x18\x9f\x81\xe3\xb1\x84"
+ "\xb9\x85\xdc\xbb\xe7\xbd\xad\xb9\xbb\x95\xdc\xcf\x4d\x5a\x23\x9c"
+ "\xd3\x29\xfd\xa9\x74\xb9\x5f\x1c\x4d\x96\x83\xb9\x19\xc6\x18\x9d"
+ "\x94\x3e\xca\x90\x7b\xcc\x6b\x19\x6e\xd2\x3a\xeb\xdc\x69\x4a\x16"
+ "\xe6\xd6\x6b\xf6\xf8\xf9\xda\x5c\x69\xff\x19\xeb\xa5\x78\x3f\x2d"
+ "\xa9\x5c\xd2\xfa\xdf\x9c\x4e\xd1\xff\x3a\x7d\x06\xfa\x37\xcc\x7b"
+ "\x5b\x2a\x56\xc3\xdc\xe6\xa4\xf5\x8a\xd0\x0e\x79\xfe\xfe\xcf\x80"
+ "\x3b\x4f\xd7\x7b\x0f\x4e\x49\xaa\xaf\xd3\x73\xe6\x4a\xed\x9f\xd7"
+ "\x4f\xfb\xe7\xf5\xb5\x7f\x95\x84\x9b\xb4\x96\x38\x4f\xb6\x3f\x76"
+ "\x99\xfe\x9b\xc7\x3e\xa4\x06\xdd\x60\x73\xcf\x7b\xdb\xb0\xd5\x79"
+ "\xfd\xa0\x7f\x5b\x7d\x5e\xdf\xfa\x9f\x2a\xd7\xb7\xfe\x17\x4a\x65"
+ "\xab\x07\x49\xee\xad\x26\xd6\xdd\x66\xad\x4f\xd9\x96\x7e\xd6\xff"
+ "\x1e\xd4\xd7\xff\x1e\x5c\x92\xa8\xcf\x1e\x74\x26\xf6\xe1\xbc\xa4"
+ "\x3e\x7c\x30\x37\xb1\x0f\xe7\x76\xfe\x77\xc7\x35\x3c\x53\x7a\x7a"
+ "\xba\x29\x3d\xcd\x94\x96\x8e\xd7\x68\x22\x0d\x4a\x37\xa7\x0f\xc0"
+ "\x6f\xa0\x7e\x1d\x64\x4a\x37\x99\xf1\x1b\xa0\x5f\x07\x26\x3d\x0f"
+ "\xe2\xb2\xf8\x99\xf5\xeb\x80\xa4\xe7\x81\x9f\xf1\x7e\x90\x5e\xaf"
+ "\x51\xbf\x39\xe9\x79\xc0\x67\xbc\x1f\xf8\x3f\x2c\x4f\x97\x3d\x27"
+ "\xfa\xa1\xcd\x5c\xb5\x6e\x69\xd1\xca\x65\x72\xbf\x78\xb9\x73\xe9"
+ "\xe3\x8f\x2f\x5f\xbb\xd6\x59\xb2\xda\x79\xef\x94\x87\x6e\xbf\xcb"
+ "\xa9\xb6\x9d\x8b\x26\x8f\x5e\x36\x98\x66\xaf\x5f\xc3\x2f\x66\xcf"
+ "\x9f\x99\xe7\x9c\x77\xef\x94\xc4\x97\x06\x18\xb9\xbd\x7c\x25\x28"
+ "\x71\xf2\x97\xfb\xfc\x70\xa2\x6d\x2f\x4b\xdd\xd3\xce\x7e\xbe\x6a"
+ "\xcd\xe3\x3b\x1f\x34\xb3\xff\xe8\x25\x8f\xf0\xdf\xc4\x7b\xfa\xf3"
+ "\x97\x73\x23\xc6\xed\x29\xa7\xe2\xc7\xf8\xfc\xca\xfc\x2d\xe2\xd7"
+ "\x21\x72\x3e\x40\xa6\x93\x94\xff\x87\xa6\x19\xc8\x8b\xe7\x40\x30"
+ "\x4a\x4e\x0f\x59\x50\xfe\x69\xbc\x4b\x13\x77\x6b\x48\x0b\xeb\xbe"
+ "\xd0\xdf\xde\x22\xd3\x7e\x5d\x6e\xe4\xb3\x9e\xa2\x05\xa3\xc5\xaf"
+ "\x85\x7c\xe6\xf3\x41\x2a\xdf\xfc\x4f\x85\xe9\xa1\x43\xac\x1b\xea"
+ "\x33\xc9\xcc\x7b\xa1\xaf\x66\x92\xe5\xd5\xe1\x1c\xb3\x64\x7e\xa7"
+ "\xb1\x17\xfa\x3c\x9e\x83\x94\x7f\x8c\xeb\xe6\xbc\x9a\xe9\xa1\x93"
+ "\x9c\xbf\x21\x21\xff\x82\x11\x7d\x7b\xb1\xf3\x3b\x4d\xc8\x37\xf7"
+ "\x63\xb2\x5a\x63\xe2\x9f\x91\x4c\x07\x8d\x9f\x41\x69\x01\x74\x45"
+ "\x73\xb4\x9c\x94\xcf\xcf\x82\xe5\x1b\x62\x22\xca\xfe\xe9\xb3\x3b"
+ "\x3d\xa2\xea\x29\x32\x43\xa6\xd3\xfc\x6b\xd8\x47\x61\xc1\xac\xc6"
+ "\xe5\x64\x46\xfb\x47\x9c\xa6\x87\x4b\x9d\x73\x88\x3c\xb3\xc9\xfc"
+ "\x3b\x37\xfb\x1b\x3a\x1b\x76\xfc\x91\xcc\x3f\xb9\x54\x6e\xba\x24"
+ "\x1c\x54\x5a\x22\x3a\x04\xc7\x31\x0a\x8b\x08\xfb\xf8\x37\x2f\x89"
+ "\x71\x9e\x1d\xdd\x1e\x07\xb5\x96\x84\x69\xf3\x09\x11\xa9\xfc\xa3"
+ "\x3a\x1b\xd0\xd2\x19\x66\xff\x45\xcb\xe6\xd9\x94\x7e\x2a\x8f\x4c"
+ "\x2d\x85\x75\x14\xc8\x0f\x53\xe9\x09\xd1\xd1\xbc\xe4\x13\x6a\x2d"
+ "\x3c\x40\x05\x6d\x64\x6a\x6e\xff\x88\x64\x2c\x9e\x9a\xca\x79\x65"
+ "\x17\xc8\xb1\x79\x25\xa7\x5d\xa0\x8d\x9b\x69\xc8\xc6\x3f\x91\x35"
+ "\xd0\xd1\x86\x7a\xce\xd0\xa3\xc7\x29\x0d\xf0\x4c\x9b\x3e\x22\xc7"
+ "\xa6\x47\xd8\xcf\x37\x97\xea\xcb\xc8\x21\x3c\xae\x8c\x4b\x1e\x97"
+ "\xed\x92\x70\x65\x76\x7b\x5c\x59\xad\xc5\xc8\xdf\xfe\x1e\x0d\x6d"
+ "\xa3\xac\x5f\x9f\x6e\x33\xd5\x9d\xa7\x11\xdc\xa6\x53\x68\x5b\xfd"
+ "\x79\xe4\xaf\x59\x74\x4c\x43\xd9\xf8\x32\x51\xfb\xa2\x8e\x40\x5e"
+ "\x84\x34\xc0\xaa\xbb\x44\x23\xea\x2f\x91\x43\xab\x5e\x74\x8c\xcb"
+ "\x75\xd2\xb7\x37\x04\x9a\x89\x4a\x37\x8b\x58\x4f\x8d\x93\xd7\xcb"
+ "\x06\xbd\xf9\xd8\x21\x73\xa0\xb9\x93\x5a\xc2\x97\xa8\x95\xfe\x4c"
+ "\x01\xf7\xdf\xfd\x3f\x79\xec\x10\xaf\x59\xa7\xf9\x37\xb6\xa3\x2e"
+ "\xc5\x3b\x9e\x16\x3e\xab\x5c\x4e\x55\x65\x94\x51\xbc\x91\x06\x9d"
+ "\x46\xba\x9a\xdb\x0f\xb3\x04\xa2\x7f\xf7\x6f\x94\xfe\xb8\xf9\xc7"
+ "\xca\x5a\x28\xbd\x35\x5c\xc7\x7e\x9f\xa6\x58\x66\x25\x6c\xbf\x63"
+ "\x14\x28\xfe\xab\x5f\xb3\x55\xe6\x6c\xd3\xc8\xf2\xd3\x8b\xc7\x4c"
+ "\x01\xf3\x45\x0a\xe4\x85\xe9\x7d\xd4\x2d\x6a\x2a\xf3\xa1\xb7\x72"
+ "\x5b\xc3\x11\x3e\xef\x94\x2d\xba\x1c\x83\xab\xd6\xd0\xd8\x86\xf3"
+ "\x34\x6a\xf7\x79\x72\x89\x6e\x97\x89\x7d\x6c\xf9\x6c\xea\x6e\x5c"
+ "\x33\xda\xc9\x82\xb6\x2b\x3f\x5a\xbb\xee\x6b\xdb\xe3\xa2\xc6\x4b"
+ "\x7d\xbe\xb6\x97\xba\xfa\x7c\x6d\xc1\x53\x21\xf6\xb7\x0d\xd2\xc3"
+ "\x5b\xad\xcd\x34\x08\x72\xb2\x8f\xf9\xbb\xea\x2c\x99\x2b\xce\x12"
+ "\x8d\x2f\x37\x91\x73\x05\x9f\xb3\xf8\xce\xf2\x00\xfa\x86\xef\x4f"
+ "\xd2\x77\x46\xe0\x9a\x81\x5f\x1a\xd2\x65\xfc\x86\x76\x9d\x8f\x91"
+ "\x66\x42\xda\x00\x5c\xd3\x21\x2f\x31\x4f\xbd\x08\xa1\xae\xbc\x2e"
+ "\x13\x0d\x66\x7e\xd6\xfd\x7b\xf3\xba\xbd\xdf\x0e\x07\xe9\xa9\x4e"
+ "\x83\xaf\x95\x8e\x9f\x1f\x7a\xff\xe4\x19\x8e\x97\x15\x92\x78\xf5"
+ "\x14\xa6\x71\xec\x2c\x3d\x9d\x71\x58\xc4\xf5\xa2\xfe\x5c\x5c\xad"
+ "\xf8\x41\x4e\xbf\x7d\xdc\x28\xdb\xd5\x53\x88\x3a\xbf\xf3\x30\xd2"
+ "\x85\x91\x8e\x76\x9b\xf9\xdd\x2f\x4e\x9e\x31\xa9\x3c\x2e\x13\x60"
+ "\x46\x74\xf8\x90\xfd\xf9\xb5\x2c\xe3\x5d\x26\xab\x38\xb2\x64\x22"
+ "\xd5\xbf\x2c\x9a\x77\xbf\x2c\x9a\x94\xec\x7d\xa7\x2e\x48\xab\x7d"
+ "\x8c\x23\xc6\xf1\xa6\x6d\x78\x77\x04\xa3\x0e\xd3\xa5\x69\x19\xfb"
+ "\x93\x7d\x07\xf6\xdf\xb5\x87\xe3\xdb\x20\xbc\x0f\xd6\xf1\x58\xfa"
+ "\xb3\xb2\xa3\x03\xa0\x03\xea\x5a\xdb\x3b\xe9\x27\x97\x3a\x06\x78"
+ "\x7e\x4b\xa6\x40\xf4\x24\x4d\xc8\x22\x07\xdb\x83\x8d\x2f\x8b\xe0"
+ "\x8b\x1c\x9f\xef\x65\xd1\x09\x7e\xb9\xf1\x34\xe5\x0d\xf8\x6a\x16"
+ "\x65\xfd\xde\x4d\xba\x7e\xca\xbb\x31\x4e\x3f\xbd\xd1\x12\x3c\x14"
+ "\xa7\x9b\xf2\x1f\xbe\x5c\x37\x2d\x7c\x50\xe9\x26\xc8\xbe\xd4\x45"
+ "\xb1\xa0\x9e\x3e\x39\x29\x5d\xf7\x13\x59\x38\x32\x29\x3d\xa2\xa7"
+ "\x0f\x49\x4a\x0f\xa9\xf4\x47\x67\x1b\xba\xaf\x95\xf1\x58\xcf\xba"
+ "\xef\xd1\xdb\x58\xf7\xb5\x2e\xd1\x75\x9f\xd4\x3f\x8f\x5e\x27\xfe"
+ "\x0d\xba\x68\x1d\xeb\x9b\x47\xce\x30\xfe\xe2\xd7\x64\xe0\x7e\x0d"
+ "\xd2\x7e\xca\x69\xbe\x3f\x93\x19\x3f\x43\xef\x09\xd6\x7b\xac\xf3"
+ "\x58\xf7\xed\x1a\x2e\xda\x76\xbd\x2c\x8e\xd7\xcb\xd8\x3f\x8f\xf4"
+ "\xea\xbf\x17\x90\xb6\x0d\x69\x2f\xe0\x3d\xeb\x41\xa6\x49\x4b\xde"
+ "\x21\x62\xff\x13\xd8\x5a\xf5\x9a\x29\x9b\x76\xa0\xbf\xf9\xbc\xe1"
+ "\x56\xd0\xd7\x9a\x46\xc5\x81\x12\x3e\xc3\x1a\x63\x9f\xb4\xf6\xd6"
+ "\x92\x76\x96\xbb\xe1\x15\x90\xb3\x80\xfb\x13\x2a\x0b\x8b\xd3\x7c"
+ "\xee\x8e\x71\x28\xd8\xf0\x00\xc7\x4b\x4a\x6b\xc2\x6c\x98\xfd\xc2"
+ "\x59\x67\x03\x17\xb3\x0f\x38\xa9\xf8\x2c\x8f\xec\x0d\xd2\xde\x72"
+ "\xd5\xd7\xf9\xc7\x38\x2e\xdb\x49\xca\xeb\xc0\x7c\x2f\xc2\x6d\xb3"
+ "\xc6\xca\x89\xcf\xc1\x70\xac\x42\xbe\xee\x32\x69\x85\x3e\xe3\x2c"
+ "\x8c\x17\xba\x01\x79\x02\x6d\x11\x62\x9c\x83\xf4\xc8\xc4\x96\xd2"
+ "\x43\x5c\xbe\x8d\x69\x23\xbc\x1e\x03\x46\x9a\x84\x61\x92\xf3\xc6"
+ "\x42\xe4\x53\x6b\xe7\x99\x4e\x6a\xc9\x0f\x11\xeb\xfd\x40\x07\x60"
+ "\x94\x9e\x54\x30\x00\x4b\x60\x0c\x48\x78\xa7\xc3\x1f\xb2\x59\xfc"
+ "\x13\xf0\xf7\x72\x7f\xf1\xb9\x48\xde\x6f\x03\x5d\x32\xd8\x57\x5e"
+ "\xd9\xa2\x8f\x8c\x6b\xfc\x33\x91\x7e\xb6\x13\xfc\xf6\xc8\x58\x3e"
+ "\xb7\xc4\xe7\x39\xaf\x74\x96\x13\x34\x1a\x65\x9c\xe7\xd4\xd6\xff"
+ "\xef\x9e\xe5\x04\x6c\x47\x83\x49\x1c\x00\xfe\x63\xf9\x3c\x27\xf0"
+ "\xdf\xc6\x7c\xa8\xb7\x29\xfb\xa5\x47\x25\xcd\x4b\x38\x0d\x73\xc7"
+ "\xa3\x46\xff\x73\x7b\xb9\x2d\x78\x97\xa7\x6c\x44\x81\xf9\xc7\xc2"
+ "\x6c\x7e\x8f\xb4\x69\x9c\x7f\x02\xf4\x58\x00\x63\xd8\x9b\x27\x63"
+ "\xa6\xaa\x8d\x64\x56\x3a\x2d\x7f\x26\x97\x57\x3a\x2d\x9f\xfa\x74"
+ "\xda\xc2\x0b\x4a\xa7\x29\x1a\x2b\x9d\xb6\xf0\x1f\x4a\xa7\x2d\xfc"
+ "\x58\xee\x8b\x41\xa7\xf1\x3b\xd6\x6b\x86\x4e\xdb\x3d\x5c\x1c\x65"
+ "\xdd\xd1\xed\x5d\x78\xcc\xd0\x6d\xdb\x91\xc6\xba\x83\x71\x54\x7a"
+ "\xea\x51\x97\xf8\x7f\x5d\xa4\xfc\x0e\xf8\xbe\x90\xcf\x2f\x74\xe8"
+ "\xf7\x3c\x9e\x4c\x51\x3a\x2e\x7f\x54\x9f\x8e\x5b\xb8\xaf\xaf\x2c"
+ "\xeb\xb8\xfc\x3b\x95\x8e\x53\xe9\x8d\x8f\xb2\x8e\x7b\xd4\xc5\x34"
+ "\xd0\xe1\x9b\x78\x0d\x4f\xcf\xcf\x74\xcc\x8e\xd7\x71\x89\xf2\x95"
+ "\x5f\x6a\xe8\x38\xd6\x6d\x78\xde\x06\x9d\x26\xe7\x90\x2c\x67\xb5"
+ "\xa0\xb9\x21\x77\xdc\x07\xdc\x66\x8e\xbf\xc6\x74\x9b\x7a\x86\x06"
+ "\xe9\x67\x87\xf4\x76\xe7\x1f\x35\x7c\x1f\x41\xff\x63\xa9\xec\xe8"
+ "\xbe\x18\x89\xf4\x65\x3e\x3b\x1f\x28\x3f\x49\x81\x3a\x51\xde\x1a"
+ "\x3d\x41\x05\x25\xd0\x15\xe9\x4f\x7e\xcc\x7d\x8b\x79\xc7\x37\xf9"
+ "\xca\xba\xe7\x34\x2d\x1a\x52\x10\xa6\x81\x98\xab\x7f\x5c\x65\xc2"
+ "\x3b\x77\xc2\x3b\xb9\xc6\x30\x7e\x0d\xc7\xd7\x83\x20\xf4\x33\xdf"
+ "\xbf\xca\xfa\x36\x5f\xa1\xbe\x57\x65\x7d\xb0\xa9\x30\x07\xb2\x9f"
+ "\xa5\x45\x72\x5e\x22\xe3\xdb\x54\xa4\x84\xf5\x5b\xfd\xfd\x80\x7e"
+ "\xde\xff\xe3\xca\xe5\x17\x5f\x73\xe5\xf2\x8b\x6f\x61\x5d\x84\xf6"
+ "\x59\x63\xde\x44\x38\x43\xa3\x46\xbe\xd3\x9c\xef\x41\x7d\x2d\xe6"
+ "\x63\xcf\x48\x39\x47\x73\x18\x30\x99\xff\x76\x20\x9f\x8c\x19\x02"
+ "\x5d\x39\x6d\x03\x71\xbc\x96\xf8\xb2\xdb\xfb\x68\xbc\x38\xf7\x0a"
+ "\xeb\x7e\x19\x81\x3a\x92\x31\x63\x8f\xc0\x26\xe5\x98\x46\xb5\xbd"
+ "\xeb\x1f\x8b\xdb\xa1\x37\x83\x71\x7e\xb1\x3c\x1f\xfb\x32\xc7\x35"
+ "\x60\xfb\xb2\x4a\xcd\x37\xaf\x87\x7e\xce\xe4\xf3\x30\x7c\x36\xa6"
+ "\x20\x36\xcf\x74\x44\xc6\x32\x2b\x70\x1a\x65\xfb\x5b\x67\xe1\x7a"
+ "\xf5\x3a\xd9\xc7\x34\x8c\x32\x0b\x8c\x32\x0c\x9b\xfd\x14\x31\x2e"
+ "\x7f\x59\x9e\x29\x8d\x76\xb2\x2e\xbc\x1e\xb6\x68\xa6\xaa\x67\x09"
+ "\xe9\xf5\x54\x06\x69\xd1\xbc\x2b\x9d\xcd\xe8\xbf\x7d\x05\x4d\x57"
+ "\xdf\x3e\xd2\xdb\xb7\x84\x3e\xa3\x7d\x57\xa8\x77\xc9\xa4\xab\xaf"
+ "\xd7\x66\xd4\xeb\xbe\x7a\xba\x2e\xd9\xff\xf9\xe9\x9a\xad\xd3\x75"
+ "\x49\xf0\x33\xe8\x9a\xa2\x9e\xa5\x59\x9f\xbf\x1e\xa7\x5e\xcf\xd2"
+ "\x19\xa9\xea\x21\xf9\xd7\xef\xb9\x29\x8b\x11\x6b\xb3\x0b\xb2\xa3"
+ "\x62\xd5\x2d\xf5\xc5\xc7\x2f\xee\x92\x72\xb5\x74\x6f\x6f\xbc\x64"
+ "\xb5\x57\x0e\x5d\xbd\xf4\x83\x82\x3d\x3c\xbe\x0b\x2d\x48\x4b\x9b"
+ "\x38\x8e\xeb\xb4\xcd\xea\x4c\xb6\x5e\xa6\xed\x4a\x71\x93\x39\x46"
+ "\x17\xc7\xe4\x0b\x38\xd0\xf6\x3a\x8e\x5d\x92\x7f\x80\xfd\xef\x31"
+ "\xa7\x82\x8e\x7f\xec\x46\x8e\x39\x86\xfb\x41\xb8\x77\x29\x1d\xf0"
+ "\x98\x0b\xf5\xf4\x7f\x76\xb2\x26\xdf\xbf\xb7\x2c\x7b\x40\x7f\xfe"
+ "\xf5\x28\x0f\x9b\xe2\x69\xb9\x36\xa5\x65\xde\x6a\xc1\x5c\x42\x8f"
+ "\xf7\xb7\xec\x13\x19\x03\xce\x93\xc7\xe7\x49\x30\x2e\x2e\x1b\xa2"
+ "\x9f\x03\x00\x3d\xca\x41\xd7\xc7\xf6\x18\xf4\x30\xd2\x91\x76\xd0"
+ "\xa0\x07\xec\x9b\x8c\xc0\x9e\x28\x9f\xd3\x09\xab\x33\xd9\x8f\xfd"
+ "\xa7\xa8\xce\x3f\xa4\x60\x3f\xae\xf6\x68\xb8\xbe\x9e\x3c\xb3\x9c"
+ "\x37\x95\xf1\xbc\xe9\xf1\xc3\x21\x7b\xfe\x21\x03\x0f\xb1\xd6\x61"
+ "\xe2\xb3\xdf\x13\x30\x96\xee\x50\x31\xf7\xd2\xf8\x9c\x9c\x7c\xbf"
+ "\xd6\x65\x52\x34\x79\x7c\xb2\xe8\xe2\xd8\x31\x12\x76\x06\xf0\x6c"
+ "\x67\xb8\x41\x5c\x43\x9b\x5c\x1c\xf7\x42\x6f\xcf\xe3\xa3\xb5\x9a"
+ "\x5b\x2d\x5a\xb7\xc3\x64\xe0\xdb\x20\xcf\xb4\x3e\x8e\xf6\x2f\x51"
+ "\x71\x62\x25\x3e\x0e\x13\xfb\xf3\x6b\x99\xf9\x7e\xb1\xc9\x41\x07"
+ "\xd7\x74\xc8\x39\x11\xd7\x39\x01\xf5\x0b\x9e\x27\xc1\x36\x41\xb9"
+ "\x3d\xbd\x74\x03\x5c\xd1\x6d\xd0\xed\xf1\x59\x6a\x5c\x56\x6d\x0c"
+ "\x6f\x72\x98\x8e\x84\xe4\x79\x3b\x1a\xe5\xf4\x7c\xaa\x62\x61\x3f"
+ "\x7e\xc2\xa0\x5d\x2f\x4e\xc0\x87\xf3\x28\xff\xa6\xc7\xa3\x06\x4e"
+ "\x52\x76\x33\xf9\xfc\xee\x63\x21\x3e\x37\xa4\xe8\x7f\x24\xa3\xdb"
+ "\xbb\xcc\x79\x39\xfd\x97\x4d\x8c\xa3\x7f\x3a\xf3\x1e\xd3\x9f\xd7"
+ "\x3a\x40\x97\x45\xa0\xa5\x45\x9d\x77\x60\x7b\x66\xd9\x72\x3c\x67"
+ "\x30\x9e\x5a\xb5\x41\xf3\x3c\xb3\x5a\x27\x5b\x56\x17\xd7\x0f\x68"
+ "\xaf\x83\x6d\xb5\x34\xa3\xfd\x5c\x86\x69\xc0\x71\x25\xb9\x6e\xe0"
+ "\x73\x2d\xea\x3e\x90\xdc\xa6\x0a\x75\x96\x84\x94\x6f\xc9\xb2\x63"
+ "\x71\xb1\xc5\x43\x25\x4e\x11\x51\xe7\x92\x97\xb9\x0f\x96\x85\xcc"
+ "\xfd\xe9\x00\xe6\x41\x19\xa3\xd2\x24\xd7\x15\x60\x73\xad\xf8\x50"
+ "\x00\x37\xd5\xf7\x2b\x76\xab\xb4\xe5\xff\xc0\x15\x3c\xb6\x7c\x8a"
+ "\x40\xdd\x21\x8f\x8c\xb1\x82\xb6\xad\x08\x32\xcf\x19\x7c\xc6\xeb"
+ "\x90\xca\x67\x7c\xf9\x1b\xac\x53\x0c\x9a\x03\xff\xc1\xdd\xde\xe5"
+ "\xc5\x06\xfe\x46\x7e\xee\x3b\xce\xc3\x7b\x36\x4d\xce\x88\xd4\xb5"
+ "\xea\xcc\xd0\xf2\x7a\x43\x86\xb9\x0e\xee\x67\xd6\x35\x4c\x0f\x45"
+ "\x8b\xe5\x87\x13\x61\x39\x4c\x2a\x6e\x26\xf3\x3c\xe4\x71\x63\x64"
+ "\x00\xf2\x04\xfb\x60\x2c\xcf\x57\xef\x7a\xf1\x64\x3f\x7f\xe9\x8b"
+ "\xa7\xfa\x63\xc5\x4c\x6e\x57\x1f\xbe\x2c\x7f\x2b\x7a\xfb\x9f\xdf"
+ "\x85\x3d\x0e\x8e\xc1\x2b\x75\x4c\xc9\x48\xc6\x37\xc4\xb1\x6d\x25"
+ "\xaf\x03\xbe\x8f\x71\xe7\x3c\x46\x9f\xf5\xf1\xe2\x8a\xc2\x78\x38"
+ "\xc2\x23\x71\x95\x70\x94\xee\x08\xf1\xde\xb6\x53\xed\xb7\xac\xa8"
+ "\x8d\x6b\x77\x86\x81\x4f\x9f\x4e\x58\x71\x30\x99\x27\xb9\x6e\x8e"
+ "\xc5\xa7\xc3\x66\x5d\x62\x3b\x49\x2b\xf6\xe8\x78\x39\xb8\x1f\xfb"
+ "\x1b\xdf\x38\xce\x25\xc7\x3e\x7d\x51\xe9\x10\xf4\x73\xe1\xc8\x17"
+ "\xd5\x39\xa2\xb0\x8a\x7f\xfa\xdd\xd1\xc2\xf4\x1a\xd3\x8a\xd7\xd3"
+ "\x43\x32\x5e\x87\x3c\x63\xfe\x5d\xde\xe3\x17\x43\x8b\x5f\x93\xb1"
+ "\x6e\x75\xdf\xc0\x50\x53\x71\x54\xc6\xf2\xf3\x94\xf0\x99\xdb\x28"
+ "\xcf\xf5\xa4\xef\xdb\x91\x92\x28\xcd\x8f\xb0\x4c\x7c\xb7\x84\xcf"
+ "\xd2\xab\x38\xe2\xdf\x2d\x37\xce\xcf\x73\xec\x4c\x8e\xfb\x0a\x3d"
+ "\x94\xde\x17\xb7\xb5\x30\x8f\x6d\x2c\xbd\x7f\x69\x87\x49\x1c\x53"
+ "\xf2\xff\xdd\xdf\xf2\x79\x79\xb5\x8f\x75\x12\x3a\x21\xfd\xef\x27"
+ "\xe9\xbb\x1f\xab\x75\x1f\x43\x47\x15\x3e\xc2\x7b\x59\x41\x1d\x06"
+ "\xea\xea\x84\x7c\xcf\xbb\x5c\x97\x7c\xf7\xb7\xc6\xdc\x85\xcf\xdf"
+ "\xa9\x7d\xb1\x3e\x78\x41\xfa\xae\x9c\x0b\xf6\xf5\xc1\x6f\x00\xab"
+ "\x30\xe7\x72\xbd\x50\x38\xcb\x90\xbd\xe2\x9b\xf8\x0c\xf7\x77\x6d"
+ "\x5c\x7f\x7f\xe3\x85\xf0\x3c\xc2\xfd\x64\x39\xe5\x4c\xdd\x37\xa9"
+ "\xf7\xd9\x0a\x0f\x18\x6d\x30\x68\xa2\xda\xb0\xf2\x9a\xae\x4c\xe7"
+ "\xd8\xbe\xb6\xaf\x94\xb6\x6b\xdc\xfb\x29\x71\xb4\xe1\xe7\x5c\x35"
+ "\xae\xad\x04\x7d\x96\xe9\xb1\x6a\x55\x1a\x64\xe7\x57\x62\x53\x1e"
+ "\x29\x1c\x57\x92\x21\xeb\xc8\x3b\x36\x48\x17\x1c\x6a\xbf\x6b\x25"
+ "\xda\x5f\x58\xa9\xca\x15\x1e\x67\x5c\x52\xb6\x33\x11\xc7\x43\x6c"
+ "\x6b\xa8\x98\x0a\x2b\xdf\x65\x7c\x9d\x63\xb8\x8f\x57\x3e\x2b\x75"
+ "\x38\xc7\x57\xe8\x29\x1c\x10\xee\x71\x51\x57\x4f\x21\xf4\x82\xcb"
+ "\x84\x7a\xa0\xff\xbb\xc2\x7a\x9d\xfb\x0d\x5c\x19\x37\x19\x9f\x53"
+ "\xac\x4c\x4d\x5f\xae\x57\xc6\x7c\x2a\x1c\x84\x1f\x70\x28\x1c\xf8"
+ "\x79\xed\x12\xd8\xe9\x1d\xa1\xea\x31\x07\xb4\x75\xe2\x28\xc7\x17"
+ "\xc3\x5c\xa4\xa3\x0a\xfc\x3b\x74\x8b\x1f\xb6\xf9\x22\x53\xc1\x06"
+ "\xca\xc5\x9c\x99\xc4\x45\x91\xd3\xa0\xe1\xba\x4e\x4c\xe4\x38\xe3"
+ "\x78\xce\xd6\x9f\xc7\xf2\x73\xd7\x3a\x91\xdf\xed\x7d\x62\x89\xb1"
+ "\x47\xa8\x62\xe3\x3c\x51\xdc\x1b\x4f\x28\x7d\x21\x9f\x27\xe2\xb8"
+ "\x53\x1a\xe6\x42\x1d\x5c\x6f\x01\xcf\x67\x51\x1f\xf2\xd5\xc1\xde"
+ "\x68\xe7\x7c\xa1\xf4\x5b\x33\xf1\x73\xf5\xb3\x97\xda\xc1\x78\x75"
+ "\xd9\xc7\x1c\x30\x70\x1d\x1a\xce\x35\x7d\x4e\xdc\xa2\x06\x6e\x48"
+ "\x3f\x5a\xa5\xd2\xa3\x1c\xff\x90\x7d\x1d\xbb\xbd\x4f\x8e\x30\x70"
+ "\x35\x70\xe0\xfa\xf8\xfc\xa6\xc8\x74\xe6\x70\xec\x19\xae\x8f\xe3"
+ "\xa9\x22\xef\x0c\x03\xdf\xcf\xcb\xcb\x65\xf5\x42\xf0\xf8\xc9\xfa"
+ "\xd7\x79\x03\x51\x6b\x98\x75\xca\x93\xf5\x47\xea\xc3\xbc\xde\x7d"
+ "\x17\xea\xb8\xb3\x4b\x14\x92\xd6\x53\x98\xb2\x8f\xb9\x0c\xf2\xb7"
+ "\x49\xfd\x50\xe3\xbc\x53\x13\x33\xa0\x27\x50\xae\x67\x06\xaf\x35"
+ "\x41\x6e\x8b\xcc\x4d\xa5\x1d\x7c\xe6\x12\x3a\xa7\xc8\x8c\x3c\x39"
+ "\x6c\x67\x61\xbe\x15\x91\xdf\xaf\x80\x6e\xf2\xaf\x9b\x08\x18\x45"
+ "\x03\xcc\x6e\x32\x37\x25\xc5\xa9\xea\x8f\x3f\xba\x6c\xb7\xe6\x76"
+ "\xd5\xdc\x8a\x39\x5c\x11\xec\xff\xa7\xfa\xdd\xf3\xad\x18\x0e\x7a"
+ "\x22\x9f\xef\x06\x9e\xef\x15\x15\x5e\x29\xaf\xb1\x5f\xcd\x3a\x68"
+ "\x82\x83\x32\x84\xfd\xd6\x5c\xd6\xb7\x5d\x99\xb7\x3a\x78\x2c\x41"
+ "\xf9\x7d\x46\x79\x1e\xd7\x79\xec\x40\x7f\x39\xaa\x7a\xf5\x61\xd1"
+ "\x31\x25\xcf\x45\xc7\x0c\x19\x4d\x55\x4f\xc9\x5e\xa1\x79\x46\x93"
+ "\x29\x80\x71\x6b\x7c\x84\x32\x1a\x76\x12\xf9\x36\x8a\xc8\x8b\x1b"
+ "\x31\x87\xb9\x81\xbf\x77\x51\x34\x83\x65\x94\xf9\x7b\x07\xf8\x25"
+ "\x1d\xb8\xbc\x78\x11\x75\x96\xa9\x7c\xba\xdf\xba\x03\xf9\x4a\x70"
+ "\xcd\x12\x26\x13\xd5\x96\x91\xa5\x56\x23\xb3\xaf\x8c\x46\x20\x0d"
+ "\xb6\xee\x53\x0b\x0c\x99\x4d\x85\x43\x55\x03\x51\x0d\xea\xdd\x52"
+ "\x26\xa2\xbf\xc1\x78\xee\xd5\x44\xe4\xf3\xd0\x1d\xed\x3f\xa8\xda"
+ "\xf8\xd4\x41\xc3\x26\xc4\xbd\x3f\xd1\xef\xe0\xa9\xcb\xce\x78\x3f"
+ "\xb6\x7a\x75\x49\xc1\x9a\xe5\x7c\x71\x8d\x7e\xe6\x96\xc1\xf1\x6b"
+ "\x21\x3c\xfe\xa9\x38\x15\x4f\xb5\xf1\xba\xe3\x8b\x99\xc6\x3e\xfa"
+ "\x2a\x87\xb1\xf6\xa9\xfb\xeb\xdf\xc3\x73\x3a\x9e\xfb\xe0\xdd\xc4"
+ "\x0f\x4a\x37\x33\x98\xb4\x8f\x2d\x64\x4a\xae\x6f\xc5\xd2\x92\xa5"
+ "\x45\x77\xf1\x8e\xd9\xe0\x14\xf5\xac\x9a\x91\x54\x4f\x79\x6f\x3d"
+ "\x6a\xfc\x09\x9b\x38\x5f\x75\x43\x48\xd8\x2b\x7c\xea\xac\xf4\xaa"
+ "\xbd\xc6\x9a\x56\x3f\x7e\x8e\xee\x58\xcd\x62\x1b\xcb\x83\x67\x33"
+ "\x99\x7e\xb1\xb1\xcd\xc4\x76\x64\x19\xee\x79\x6d\x41\xae\x91\xe9"
+ "\xf1\xa2\x7e\x7d\xbe\x0d\xe3\xfb\xaa\x88\xa8\x76\x62\xfe\xb9\xaa"
+ "\xdf\x35\x9b\x78\x1f\x11\xf6\x29\x6c\xa7\xd5\xb6\x2b\xf9\x1c\x71"
+ "\x7e\x6e\x0f\xf3\x6c\x52\xb9\x67\x55\x9f\xad\x06\xff\x17\x39\x7b"
+ "\xcf\xf3\xea\x79\xaa\x86\x1b\x71\xb8\x56\xe7\xf7\xeb\x2f\xe2\xbb"
+ "\x75\x86\xe2\xf1\xd5\x1f\x36\x61\xbe\x86\x76\x7e\xef\x24\xad\xfe"
+ "\xc0\xec\x80\x8d\x70\x03\xfd\x10\xf7\x1f\x72\x59\x7e\x97\xc0\x47"
+ "\x37\x9e\xd9\x63\x86\x76\x81\x96\x49\x13\xea\x8f\xcc\xfa\x4d\x3a"
+ "\x7e\x26\x91\x26\x77\x53\xd3\xd1\x83\x83\x06\x9a\xc9\x3a\x34\xc3"
+ "\xf2\xe5\x2f\x8d\x70\xdc\x73\xf7\xa4\x1c\x4f\x59\x29\xb4\x72\x34"
+ "\x62\x15\xf1\xf1\xd3\x2a\x72\x1e\xbe\xa5\x9c\xa4\x3f\x4d\x75\x45"
+ "\x4e\x2a\x5c\xb7\x7b\x45\x31\x9f\x5d\xd7\x32\x77\x2e\xf1\x3c\x43"
+ "\xa6\x37\x2f\x05\x4d\x1c\xa3\x99\xed\x67\xfe\xd6\xc5\x49\x2a\x7e"
+ "\xf0\x7d\xa4\x81\x5e\x6e\xe1\xdb\xb9\x44\xd9\x9d\xc5\xd5\x5a\xcd"
+ "\xce\x25\x7d\xf0\xcd\xc4\xf0\x3d\xaf\x92\x69\x6f\x59\x87\x29\x60"
+ "\xbe\x9b\x02\xce\x30\xbd\x8f\xfb\x94\x7d\x85\x3a\xd9\x96\x65\x18"
+ "\x8d\x5e\xad\xd2\xf3\x29\x99\xf4\xf3\xa7\xa6\xb3\x54\xfc\xdb\x03"
+ "\xfd\x94\xe3\xf3\xde\x5d\x99\x63\xd6\x75\x7b\x9f\x36\x07\xe9\xde"
+ "\x69\xba\x2d\x83\x31\xf7\x69\xcc\xff\x57\xcb\x38\x4f\x78\xff\x0c"
+ "\x7f\x17\x06\x69\x2e\x23\x4f\xca\x3e\xfa\x3e\xaf\xc1\x0b\x3f\xf3"
+ "\x81\xb8\xf8\x8f\x0e\x3e\xdb\xd2\x8f\x1f\xcc\xa0\x80\xfb\x76\xde"
+ "\x8b\x1c\x30\x14\xfa\xc7\x73\x41\xf4\xc4\xbc\x94\x05\x71\x32\xc5"
+ "\x4c\xf4\xe5\xe8\x45\x91\xd7\xd2\x79\x5e\xc6\x34\x65\x5d\xf3\xb3"
+ "\x15\xbf\x31\x05\x22\xe7\xfc\x81\xad\x1a\xb5\xc2\xae\x0c\xd4\x9f"
+ "\xf3\xab\xd8\xa7\x31\x6a\xa1\x3f\x53\x8b\xfb\x3f\xca\x03\xe5\x7f"
+ "\x46\xba\x90\xb1\xb0\x7b\x2e\x8a\x05\x01\xf3\xff\x21\xfe\x4e\x11"
+ "\x8f\x71\xa0\xbb\xf3\x2c\x3d\xfd\xcf\x5f\x03\xce\x9b\x7f\x01\x2c"
+ "\x19\x33\x6d\x32\xbd\x8f\x7b\xb4\xa9\x77\xfc\x4b\x19\x6b\x26\xcd"
+ "\xbf\xdd\xea\x5e\x64\xd2\x30\x96\x72\x6c\x3b\x8c\xa1\x13\xb9\x5d"
+ "\x78\xce\xe6\x67\x5c\xc7\xf2\xd5\xba\xc5\xbf\xdb\x1a\x5d\xc4\x63"
+ "\x6b\x1e\x8f\x9b\x48\x5f\xd0\x78\x51\x8e\xb5\xf3\xf4\xe7\x59\xfa"
+ "\xf3\x0c\xfd\x79\x9a\xfe\x9c\xab\x3f\xf3\xba\xbc\x3e\x26\xaf\xf1"
+ "\xf5\xda\x0b\xa6\x41\xc7\xf0\xbc\xc7\xe8\x0b\xe0\x33\xc4\xea\xde"
+ "\x2c\xc7\x76\x1d\x8f\x89\x3a\x5e\xd9\xfa\xb3\x81\xcf\x8d\xd6\xe8"
+ "\xe6\xff\x25\x7c\xd6\x3a\x13\xf1\x59\x9b\x1d\x87\x0f\x59\xdd\xb9"
+ "\x9f\x07\x1f\x9b\x95\xbf\x13\xf1\x3f\xc0\x87\x71\xe1\x34\xd4\x7f"
+ "\x20\x09\x1f\xbf\x81\x4f\x4a\x7e\x5b\x27\x3a\xd8\xae\x59\xfb\x05"
+ "\x19\xd7\x79\x10\xdb\x2c\x8d\x97\x8c\x38\x85\x6b\xa3\x57\x8a\x53"
+ "\x08\x59\xc0\xb8\x5d\x82\xf6\xaf\x6d\xd6\xed\xb7\xc3\xca\xce\x2f"
+ "\x99\x68\xf8\x8e\xa1\xad\xfb\xaa\x54\x5b\xf7\x6f\xe5\x58\x7d\x1b"
+ "\xe8\x8b\x1e\xb7\xe8\xc0\xbc\xfb\x6f\x3c\x37\x8c\x87\x5b\x54\xb2"
+ "\x76\xed\x53\x77\x39\x8b\x96\xae\x5a\xee\x1c\xbd\xcc\xb9\xb6\x70"
+ "\xe5\x8a\x92\xe5\x89\xfe\x14\x36\xfd\xfb\x3d\xf2\x9c\x08\xcf\xa5"
+ "\xe4\x5c\x1a\xfc\x2f\xf5\xa4\xf4\xc9\x2b\xb9\x20\xbc\x25\x4b\x58"
+ "\xe7\x36\xd4\xa8\xef\x3c\x01\x9f\x26\x63\x0c\x31\xe6\xbf\x3c\x86"
+ "\x20\xfd\x04\xc6\xc9\xfc\xb8\x74\xce\x1b\x32\xd2\x18\xbe\xae\x9b"
+ "\x06\x9d\xa4\x92\x6a\xae\x33\x25\x0d\x2f\x8a\x3d\xb0\x9b\xf8\x1b"
+ "\x16\x26\xe8\x14\xc1\x71\xb7\xf8\xfc\x25\xca\x89\x53\xf4\x8c\x9c"
+ "\x57\x2c\xc0\xb3\x9a\xb3\x09\xe0\xf8\xcc\xc3\x28\xb3\x17\x69\x66"
+ "\xb6\x21\x30\x0f\xec\xe0\x72\x48\x7f\x8a\xe3\x60\x20\xdd\xa2\xc7"
+ "\x13\xe3\xb4\x2d\x1c\xa7\x02\x69\xb6\xb8\xb4\x97\x90\xe6\x40\x9a"
+ "\x53\x87\xf7\x06\xd3\x19\xcf\xb9\xfa\x3a\x19\xe7\x79\x57\xaf\xb7"
+ "\x3c\x1e\x67\xfe\x86\xcb\xed\xe3\xb3\x9d\x0b\xe6\x7f\x7d\xf2\xdd"
+ "\x8f\xaf\x5e\xb5\x62\x30\x49\xb2\xbb\x30\x1c\x67\xdf\xee\xbe\xe5"
+ "\x2e\x67\xf1\xf2\xe5\x6b\x9c\xeb\x97\xaf\x2a\x71\x2e\x5d\xbf\x74"
+ "\xc3\x60\x5a\xb1\x7a\xcd\xe3\x1c\x65\x81\xbb\x65\x6d\xc1\xe3\x2b"
+ "\xbe\xcb\x4e\x2f\x2a\xf7\xe0\x04\x3b\x61\x01\xeb\x36\x3d\x2e\xc9"
+ "\xd1\x2a\xb6\x21\xed\x5f\xb5\xe1\x9e\xe3\x75\x39\x70\x6d\xc2\xef"
+ "\x30\x7e\x87\xf0\x3b\x8e\xdf\xb1\xd3\xb4\x69\x2b\xae\x07\xbb\xbd"
+ "\xeb\x96\x19\xf6\x4a\x1f\x0f\xad\x73\x1b\x3c\x04\xfb\xe2\xa0\x1a"
+ "\xdf\xd6\xed\x6b\x8d\x4a\xf9\xe9\xe5\xa9\xaa\x8b\x7d\x3c\xc5\xf1"
+ "\x46\x5b\xd9\xa7\x6b\x1d\xde\x5f\x92\x6b\x95\xbc\x66\x72\x0d\xd3"
+ "\xed\x14\x6d\xd8\xdd\xf8\xb2\x68\xe6\x58\x39\xb8\x36\x81\x5f\x9a"
+ "\x55\x7c\x9a\xf5\xa3\x90\x6f\x24\xea\x38\xac\xea\xd0\x9f\x87\x8b"
+ "\xa3\xfc\x0d\x97\x93\xfa\x33\xc3\x02\x8c\x3b\xf8\x9e\xaf\xfa\xde"
+ "\xa9\x55\xff\xc6\x9b\xa9\xef\xdd\xfa\x16\xbd\x0e\x3f\x68\x51\xde"
+ "\xe0\x95\x73\x29\x39\x77\xe6\x35\x62\x6b\xda\x3d\x02\xf8\x9c\xd3"
+ "\xd2\x17\xb6\xc9\xf8\x97\xe5\x97\xa0\x23\xbe\xf6\xb5\x80\x5b\xe6"
+ "\x4f\xe3\x35\xe4\x39\xc5\x42\xe3\x38\xe4\x5a\xfa\x93\x6d\x5c\x4e"
+ "\xd8\xbe\x6a\xd3\x76\x0c\xc9\x55\x36\x03\xc7\x1d\x5c\xbf\x4f\x87"
+ "\x19\x61\xda\x9e\xa6\x75\x8f\xa8\x79\xf8\xa6\xad\xca\x96\x58\x7f"
+ "\xd0\xf0\xb5\x84\x8c\xba\xf0\xdc\x64\xe8\x80\x20\xad\xf7\xe9\x7e"
+ "\x71\x7e\xbd\xfd\x51\xfd\xf9\x90\x8e\x63\x1a\xc7\x42\x01\xfe\xc7"
+ "\xb8\xef\x60\xaf\x1c\xc2\xfd\x71\xd0\xa7\x59\xd1\xc7\x2d\xe3\x1c"
+ "\xc0\x6e\xe2\xf7\xc7\xf9\x7b\x37\x78\x77\x5c\xc5\x19\x59\x3f\x91"
+ "\xdb\xdc\xe7\x3b\x5b\x9f\x0b\x5c\xef\xe0\x3d\x66\xc8\xd2\xa1\xc0"
+ "\x45\x96\xcf\xf5\xd9\x80\x77\xc0\xd0\x3b\xac\x67\x0a\x62\x90\x53"
+ "\x39\x9f\x72\x17\x19\xfa\xa6\x8f\x0f\xdc\xe5\xa9\x74\x49\xaa\x7e"
+ "\x57\xf4\x77\xff\x43\x78\x9f\x69\x02\x4e\x07\x64\x1f\x70\x3c\xd6"
+ "\x8b\xbd\xf3\xb6\x1e\xa5\x23\xdd\xc7\x7b\xe7\x98\x3a\x1e\x1c\xdb"
+ "\x3d\xc8\xb8\x5d\x92\xfb\xfe\xba\xde\x70\x47\x0d\xbd\x61\xc0\xb1"
+ "\xa6\x09\xcd\xea\xc6\x3f\xdf\x48\x07\xef\x91\xf0\x78\x29\xed\x11"
+ "\xc0\x19\x7a\x41\x9d\x81\xd3\xaa\x47\x3a\x82\xe4\x3e\xc8\xdf\x7c"
+ "\x93\x36\xad\xf7\x99\xff\xe8\xd3\x45\x1b\xe6\xc5\xc3\x14\xb6\x91"
+ "\x0e\x86\xcb\xfa\x88\x6d\x92\x82\x98\x99\xe3\xd0\x38\xf4\xf1\x05"
+ "\x3a\x78\x43\xb9\x81\x2b\x68\x78\xd4\xc0\x57\xff\xe6\xd8\x51\xd4"
+ "\x13\x9c\x1b\xeb\x61\x5f\xf0\x26\xd5\x9f\x9b\xa4\xbe\xc1\xbb\xfd"
+ "\x28\x7b\x38\x48\xcf\xd8\x74\x19\x6a\x46\xf9\xfd\x47\xca\xa6\x21"
+ "\xcf\x86\x36\xdd\x9f\xf9\x18\xfa\xf7\x78\x1f\xef\xaf\x6b\x89\x5b"
+ "\xe7\x39\xae\xfa\xf0\xee\xf2\x93\xb4\xd1\x11\x97\xae\xf7\xed\x91"
+ "\x79\x48\x6f\x51\x6b\x26\xce\x36\x55\x7e\xa3\xf2\x5d\xd5\x71\x64"
+ "\x5d\xc0\xe7\xf5\x58\xc6\x25\xed\x65\x1f\x6f\x9c\x67\x8c\x17\x80"
+ "\x75\x50\xd2\x7c\xb8\x38\xcc\x74\x52\xf1\x3e\x9e\xb9\xa8\xe8\xb4"
+ "\xd1\x9d\x40\x7b\x1e\x37\x51\x0f\xd3\x69\xe8\x16\xa1\x0d\x0d\xa7"
+ "\x89\x82\x0d\x66\x62\x79\x61\x19\xe7\xbd\x41\xf0\x87\xb4\xab\x14"
+ "\xdd\x36\x1e\x32\xe8\x66\xf4\x1d\xd3\x29\x48\x1b\x5d\x4c\xdb\xc4"
+ "\x36\x0e\x3a\x76\xd2\x68\x3b\x68\xca\x31\x4d\xf1\xdc\xac\xcb\x45"
+ "\xb3\xff\x06\xf6\x1d\x59\xf7\x87\x23\xe6\xaf\xd3\x11\xf7\x44\x52"
+ "\xb4\xdd\x84\x3e\x2e\x71\xc7\xcd\x4b\x8e\x32\x7d\x59\x56\x84\x6f"
+ "\x64\x96\x1e\x7b\xeb\xa8\xf2\x63\x5a\xd7\x2c\xaa\x47\x66\x49\x59"
+ "\x5e\x27\x63\xa4\x70\xdc\xde\x63\x4c\x23\xd6\x8b\x2c\x4b\x2c\x03"
+ "\x2c\x4f\x8a\x46\x9b\x4a\xe2\x68\xd4\xc4\xf4\xd1\xe9\x74\x30\x49"
+ "\x97\x2f\x77\x16\x4d\x56\xba\xd8\xe9\x1a\xbd\x6c\x82\x0c\x74\xe3"
+ "\xbc\x6f\xea\x5d\xce\x79\x93\x47\xbb\x0b\xc7\xce\x51\x97\xa9\xf3"
+ "\x66\xf1\x75\x70\xe2\xbc\xce\x89\x7a\x4e\x24\xce\x0d\xb7\x14\x2a"
+ "\xfd\xb1\x29\x1c\x4c\xb3\x4a\xda\x71\xdc\xd9\xaa\x55\x44\x31\xe0"
+ "\xbd\xe3\x34\xfa\xd4\xe6\x3c\xc8\x71\x8e\xe7\xba\x89\xe3\xa2\x7f"
+ "\xda\x88\x77\x0d\x48\x1f\x5a\xcc\xdf\x47\xf8\xab\xd0\xec\xce\x83"
+ "\xbc\x66\x23\xaa\xed\xee\x90\xbd\x22\x07\x3f\x0a\xd9\xc7\x54\x4e"
+ "\xbf\xc5\x23\xba\xbd\xa5\xb3\x8c\x76\xf1\xda\x0e\xfa\xf3\xe0\x5c"
+ "\xb7\x88\x31\x8d\x0a\xdc\x1c\x8b\x1c\xb0\xd3\x79\x6d\xa7\x14\xed"
+ "\x2f\x3e\xa0\xe6\xaf\xa5\xe0\xff\x75\xba\x3d\x43\xf3\xf0\x0c\xfb"
+ "\xef\xeb\x72\x8d\x4b\xf3\x3a\x64\x0c\x73\xad\xe2\xd6\x87\x30\x1f"
+ "\x20\x03\x26\x60\x0d\x54\x7e\x0f\x0a\xde\xe7\xf5\xab\xd5\x6a\x46"
+ "\x36\x59\xd3\x54\x5c\x48\xc8\x78\x79\xa3\x49\xcb\xeb\xf5\x93\xc1"
+ "\xbb\xa1\x5b\x6c\xec\x47\x93\x07\xde\x2b\xe7\x3c\xc6\xbb\x2a\xaf"
+ "\x16\xac\x32\x69\x11\xf4\xa3\x4d\xd9\xcf\x9d\xac\x3f\x31\x77\xdd"
+ "\x3c\xc9\x18\xd7\xe4\x78\x68\xa2\x72\x35\x9f\xd9\xbc\x88\xcb\x9d"
+ "\xf7\x9a\x09\x3a\xbb\xf9\xa6\x2c\x39\x47\x89\x68\xde\x34\x52\xbe"
+ "\xcc\x9b\x6f\x33\x74\x2c\xef\x97\x5a\xb7\x88\x10\xaf\x11\x5b\xa3"
+ "\x22\x24\x63\xed\xf3\xd8\x41\xa7\x29\x50\xda\x5d\x1e\x90\xdf\xe0"
+ "\xe4\xef\x8a\x84\xf5\x71\x23\xa6\xc6\x0d\xd4\x1f\x4a\xbf\x75\x09"
+ "\xc6\x87\xb4\xd3\x04\x5b\x17\xf8\x33\x6d\x78\xaf\x45\x03\xad\x02"
+ "\x3c\x4e\x32\x7d\x32\xbf\x32\x8d\x7d\x60\xb8\xad\xd6\x28\xda\x1c"
+ "\xdf\x2e\x93\x16\xdc\xe1\x45\xbb\x4c\x68\x97\xfb\x0c\xcb\x4c\x84"
+ "\x7d\x93\x20\x6f\xc3\x65\x3c\x6b\x39\x3f\x2f\x73\xc6\xb7\x91\xf5"
+ "\xbf\x6a\x43\xd9\x94\x54\x6d\x14\x26\x6e\x23\xd3\xa0\xec\x3a\x5d"
+ "\xde\x24\x9e\xac\x3f\x3a\x69\xf3\xf1\xa1\x5b\xd8\x27\xc8\x79\x10"
+ "\xfa\x6d\x2a\xf7\x21\xc6\x4f\x1f\xe3\x99\xaa\xbf\x18\x9e\x0e\x2b"
+ "\x68\xdd\x52\xbe\x04\xb8\xec\x4f\x4d\xef\xb2\x96\x2b\xd3\xbb\xec"
+ "\x35\x2e\xcf\x78\xf0\xfe\x8e\x35\x6a\x82\x0e\xae\xe0\xf9\x5a\x65"
+ "\xaa\x7a\x87\x6e\xd9\xc3\x78\xa5\x7c\x27\x58\x5e\x74\x1d\x04\x3e"
+ "\x14\x90\x13\xc1\x3a\xa9\xdb\xeb\x99\x61\xe8\x23\x6b\x9a\x33\x5d"
+ "\xea\x07\x93\xf0\xa5\x82\x61\xdd\xe2\xe3\x7d\xae\xa9\xa8\x3f\xe5"
+ "\x7b\x8d\xbf\xdd\xe1\x73\xee\xd1\x2a\xbe\x7a\x93\x35\x8d\xee\x09"
+ "\xa5\x7f\x75\xb0\xd5\x1d\xe5\xb3\x9c\xe8\x47\xe1\x86\x1c\x3f\xcc"
+ "\xf3\x54\xb5\x36\xe2\x81\xfd\x5f\x2d\xe3\x33\x85\xec\xce\x3d\x6a"
+ "\xdf\xc8\x83\xf1\xaf\xce\x69\xac\xcd\xe3\xb9\x3d\x48\xff\x28\x54"
+ "\x72\xf9\xc5\x9d\xa2\x66\xcc\x02\xcd\x6b\x15\xce\x8d\x56\xd8\x91"
+ "\xe5\x9b\x35\xc1\xdf\x73\x18\xb3\xa0\x8f\x4f\x94\xbf\x94\xc1\x27"
+ "\xdd\xde\xf2\x51\xa9\x79\xa0\x7c\xfa\x95\x79\xa0\xfc\x0b\xfc\x9e"
+ "\xe9\xae\xe6\x2a\xe5\x45\x86\x9d\x22\x2a\xbe\xb8\xd3\x59\x26\xeb"
+ "\x27\x55\x37\xd3\x24\x97\xf7\x8c\x66\x81\x2e\xe5\xc8\x5b\x67\xe8"
+ "\x01\xe6\x17\x6b\x8c\xbf\x75\x41\x92\xa7\xf1\x0e\xe3\x4a\x89\x45"
+ "\xad\x83\xdf\x6c\x93\xdf\xaf\xf4\x6e\xf2\x85\x3c\x85\xbb\xf8\x3b"
+ "\xad\x61\xfb\xc8\x11\xc8\xd3\x16\xa4\x26\xb5\xdf\x6a\x1b\x99\x05"
+ "\x9d\xed\xa8\x55\xfe\xd0\x16\x19\x2f\x0a\x32\xcd\x31\xa2\x58\xae"
+ "\x91\xc6\xba\x9b\xe3\x45\x61\xbe\xb3\xc5\xd6\x3b\x2e\x79\x73\xa1"
+ "\x2b\x84\xb4\xc5\x30\x2e\x8d\xe8\x02\xed\x5e\x32\x69\xfb\x2e\x4e"
+ "\x70\x10\xb7\xf9\x62\xc5\x0d\xfb\xbe\x37\x9e\xcc\xff\x97\xe3\x31"
+ "\x2a\xbe\x9d\xb2\xb6\x7c\xdd\x4c\xff\x95\x43\x26\xa6\x43\x90\xb6"
+ "\x38\x15\xed\xb6\x2c\x31\xfa\x27\x48\x9e\xa3\x52\x77\x56\x2c\xec"
+ "\x98\x1b\x15\x9f\xaa\x75\xee\x2d\xd0\x7f\x4f\xd5\xa9\xf7\x9b\x3a"
+ "\x92\xd7\x80\xd8\x9e\x77\xae\x5c\xeb\x5c\xb6\x7a\xfd\xaa\x91\x23"
+ "\x13\xe6\x4a\x66\xf5\x5d\xdc\x2d\xb5\x6a\x3c\xdd\x72\xd4\xc0\x9b"
+ "\xed\x12\x3c\xa3\xfd\x9b\x2e\x8b\x65\x3f\xab\x40\x77\x73\x2f\xc8"
+ "\xa6\xbe\xfb\xdb\x68\xd6\x6d\x71\x8f\x5f\xa3\x59\xb7\x7f\xad\xe0"
+ "\xa1\xe5\x4b\x97\x6d\x88\x4b\xbd\x23\x7e\xdd\xb0\x6a\x27\xea\x4e"
+ "\xbf\xe1\x5e\xe8\x8a\xb4\x39\x9b\x78\x6c\xf1\xbe\x57\x16\x15\x7f"
+ "\x87\xbe\xce\x81\x8c\x15\xb4\x94\x44\xa9\x05\xba\x4c\x7c\x91\x75"
+ "\xf8\x20\x75\xb6\x13\xf6\x14\x78\xcb\x8a\xb6\x87\x60\xd7\x5d\xe0"
+ "\xf5\x19\x94\xfb\xb8\xb5\x8e\x63\x3a\x8f\xd1\xe3\xd5\x7b\x39\xd6"
+ "\xb9\x1d\xd7\x0f\x71\x1d\x88\xeb\x6f\x9d\xab\x30\xef\x61\x5f\xfa"
+ "\x75\xec\x4b\xef\x7d\x4b\xfa\x03\x85\xcb\x89\x7d\x82\xf0\x7e\x01"
+ "\xdb\x20\x41\xaa\x30\xf3\x3a\x38\xe7\x45\xda\x6e\xe7\x13\x94\xcd"
+ "\x57\x21\xf7\x06\xbd\xf5\xa2\x7a\x8c\x4f\xec\xca\xe3\xef\xad\x8d"
+ "\x3a\x45\x15\x69\xe9\x69\x1f\x53\xba\xc3\x92\xd1\xed\xad\x40\xd9"
+ "\x55\x0b\x98\x4e\xfd\x7d\x8b\x56\x7e\x03\x38\xc9\x3e\xec\xb3\x0d"
+ "\xbf\x4f\xd2\xbe\xd5\xed\xb9\x06\x39\x2e\x54\x2c\x88\xb3\xe9\x78"
+ "\x6f\x7a\xb0\xb2\x4f\x44\x4c\xd9\xa7\x15\x25\x86\x1c\xe0\xbe\xdc"
+ "\xe0\xd3\x84\xf8\x7a\xab\x4a\x96\xaf\x59\xbe\xcc\x39\x7a\xed\x60"
+ "\x8a\x8b\xae\x57\xb8\x7c\x95\x73\xcd\xf2\xa7\x9f\x59\xbe\x56\x46"
+ "\xc6\xe3\xb7\x09\x63\x7e\x96\xc8\x1c\xd5\x64\x9c\xfb\x72\xde\xc0"
+ "\xf4\xad\xf8\x84\x63\xb2\x89\x9a\xd1\x1c\xc3\xaf\x53\xcd\x37\x76"
+ "\xba\x13\xe7\x1b\xcf\xaa\xb8\x13\xbe\x31\xe5\x6a\xae\xf3\xac\xfc"
+ "\x8e\xf5\x49\xda\xea\xeb\x8b\xff\xbe\x75\x0a\x68\x69\xd2\xe9\x76"
+ "\xa1\xdb\xbb\x35\xc7\xa0\x5b\x90\x9e\xf5\xeb\xb6\x54\xa7\xd4\x1f"
+ "\x18\x63\xa1\xff\x12\xc6\x57\xf5\x0d\xda\xad\x1c\x97\x23\x5d\xae"
+ "\x27\xdb\xc7\x6c\xe5\xba\x18\x26\xea\xf3\xa3\x7f\xca\xa1\x37\x59"
+ "\xbf\x55\x1a\xf0\x50\xa7\x8b\xeb\xd3\xe7\x41\xd7\x9f\xa6\x67\xe5"
+ "\x9a\xb3\xe6\x1b\xb3\x95\x75\x0a\xc7\x10\xd1\xaa\x01\x47\xee\xd1"
+ "\x3e\xeb\x97\xeb\xb0\xfc\x0d\x02\xc0\xe2\x75\x60\xe8\xb9\x5a\xfe"
+ "\x5e\x31\xa7\xa9\xd8\x70\x15\xdb\x78\xed\x19\x75\x95\x02\xff\x48"
+ "\xdf\xd9\x86\x67\xfd\x6c\x77\x32\xdc\x20\x6d\x3d\xcc\xf0\x54\xec"
+ "\xbb\x67\x47\x80\x77\x46\xf5\xd9\x4f\xcf\x2e\x89\x9b\x97\x31\x3e"
+ "\x12\xcf\x30\x70\x91\x71\x56\x95\xaf\xa9\x6c\x37\xeb\xcf\x5a\xbd"
+ "\xed\x46\x7b\x00\x0f\xfa\xaf\xc2\x66\xf8\x4d\x04\xf5\x76\x33\x7e"
+ "\x8c\x7b\x3c\xce\x3a\xbe\x75\x8c\x2f\xca\xed\x8d\x93\x6d\x5e\x97"
+ "\x19\x80\xb4\x43\x7d\x3e\xec\x5b\x29\x59\x6f\xac\x5e\xe5\x2c\x5a"
+ "\xb9\xea\xc9\x82\xf5\x4b\x9f\x5c\x5e\xf0\x4c\xf1\x58\xe7\x33\xab"
+ "\x1e\x2b\x5a\xfd\xf8\x93\xcc\x35\x6b\x4b\x9e\x79\xfc\x49\x27\x6b"
+ "\x96\x82\x69\xb3\x66\x15\xdc\xfb\xf0\xfc\x47\x06\xd3\xbd\x4b\x91"
+ "\x86\x99\xff\xac\xec\xb1\xea\xd5\x43\xd3\xa7\x7e\xbb\x60\xea\xdc"
+ "\x87\xe7\x2c\x90\x87\x5e\x7a\xdf\x4f\x5b\x95\x3a\x43\x02\x1f\xda"
+ "\xc0\x4b\xa5\xe8\xdf\x01\x27\xe9\xf9\x49\x2a\x5e\xfa\x73\x45\x89"
+ "\xf1\xd2\x9f\x03\xd2\xcf\xed\xc1\xef\x30\xd1\xf7\x42\xf8\x41\xbb"
+ "\x3f\x9f\xad\xf8\xeb\x9a\xc5\xdd\xde\xe7\xea\xfa\xf8\xeb\x79\x79"
+ "\x96\x92\xfd\x94\xd4\xfa\xec\x73\xd0\xff\x15\x87\xe2\xdf\xf5\xcd"
+ "\x27\x9f\x3b\xd6\x3b\x9f\xec\xd5\x29\xcf\xf5\xce\x2d\x91\x56\x89"
+ "\x79\xe5\x35\x3c\xaf\x54\xeb\x49\xcf\x4f\x96\x3c\xd5\xaf\x7c\x5b"
+ "\xc8\x98\x57\xb2\x6c\xcb\x3d\x29\x39\xff\xf8\x5e\x4e\xbc\x8c\xcb"
+ "\x35\x7d\x5d\xc6\xb9\x9c\x5c\xbf\xb3\xed\x5c\xc6\x6b\xda\xb0\x8f"
+ "\x4b\x61\x2b\x60\xfc\xea\x16\xc2\xbe\x73\x99\xc2\xe9\x7b\x6e\x5e"
+ "\xe3\x66\xbb\x59\xe7\xa7\xa1\xa7\xe9\x7b\x6f\x0b\xef\xb3\xcd\x6a"
+ "\x4e\xf9\x6c\x8c\xf5\xba\xa8\xb8\xe1\x5e\xf6\x2d\xe2\xb9\x13\xea"
+ "\xdc\xdf\xc7\xb3\xcf\x4f\x62\x5e\xe8\x9b\xcb\x7e\x2f\x41\xff\x77"
+ "\xc9\xef\x12\x7e\xef\x84\x11\xef\xa1\x64\x24\x99\xcc\x23\x7d\x54"
+ "\x6b\x12\xd0\x37\xdf\xdb\xc6\x75\x30\x3d\x83\xf4\xdc\x3e\xe4\x35"
+ "\xf7\xd1\xaf\xd2\xd6\x4b\x3f\x7d\x9d\xc5\x58\x63\x51\x78\x3f\x3f"
+ "\xb9\x3f\x5a\xa5\xa6\x53\xe5\x92\xcf\xa4\x93\x97\x06\xb0\x4c\x1a"
+ "\xf4\xba\x9c\x56\x95\x7b\x2f\xa7\x55\xe5\x85\x3e\x5a\x3d\x77\xe3"
+ "\xe5\xb4\xaa\x6c\x8b\xdb\x57\xd2\xd7\x51\x9e\x9f\xcc\x34\x63\x1e"
+ "\x43\xbb\xb7\x81\xcf\xea\xfa\xe8\xf7\xbc\xe5\x72\xfa\x3d\x3f\x22"
+ "\x35\xfd\x2a\xf9\x7c\x55\x3c\x9c\x86\x54\xe3\xc6\xd0\x2d\x26\xfd"
+ "\x3c\xd8\xf3\xd5\xfc\xad\x7b\xc6\xe3\x45\x93\x56\xf8\xa2\x17\x3f"
+ "\x5c\x79\x1e\xd1\x67\x8b\x8b\x88\x4e\x5f\x5f\x13\xe6\xbc\xbc\xae"
+ "\x74\x85\xb1\xe8\x84\xb1\xe6\x81\xfb\x36\x9e\x3b\xf3\x37\xa1\x38"
+ "\x9d\xe9\xc9\xdf\x18\x03\xbf\xb7\x29\xbb\xf4\xf9\xde\xef\x7f\x74"
+ "\x8d\x1f\xed\x4f\xdf\x42\xce\x23\xf5\xb7\x73\x7a\x04\x3c\x34\x83"
+ "\xd3\xd9\x77\xab\x3f\x98\x05\xb1\x5c\x4a\x0d\xf7\xfb\xbd\xfc\xdf"
+ "\xdf\x99\xe8\x24\x7d\x54\xb8\x74\xd5\xb2\xd5\x2b\x56\x7c\xb6\x2a"
+ "\x8a\xdf\x57\xf3\x79\x35\xfe\xae\xd9\xc0\xee\x8a\x27\x36\xa2\x4e"
+ "\xd8\xff\xc5\x1d\x6a\xdc\xfc\x3e\xf4\xdf\xca\x26\x65\x4b\x2e\xec"
+ "\x50\xe7\xc0\x5f\xc8\x8a\xd3\xcf\xe0\x91\x17\x9c\xc2\xfb\xfd\xfc"
+ "\xbe\x3e\xfe\x7e\xe7\xe5\x7d\xfc\x02\xa5\xee\xe3\x17\x46\x69\xeb"
+ "\xf8\x1c\xce\x0b\x98\xff\xac\x91\xb6\x26\x3f\xb3\x1f\x04\xe6\xcc"
+ "\x1d\x98\x2f\x77\xce\xdd\xe0\xbf\xa7\x60\x43\x9a\xdc\x2b\xe6\x6f"
+ "\xaf\x44\x2f\x8a\x76\xf6\x45\xe0\xfd\x31\xfe\xf6\x0a\x7f\x73\x89"
+ "\xbf\xff\x29\xf3\xe0\xbe\xea\x14\xc9\xb9\x23\xde\x3b\x1b\x4f\xc9"
+ "\xef\x63\xc3\x56\x78\xa1\xdc\xb0\xad\xad\x30\x19\xf9\x7c\xfa\x0e"
+ "\xd5\x1f\x6d\xdc\x17\x5c\x5f\xc1\x06\xbf\xaa\xe3\x22\x7f\x57\x8d"
+ "\xac\xca\x86\x78\xe1\xd0\x15\xd7\xee\xed\x15\xce\xfe\xbf\x49\x50"
+ "\x3e\xa8\x77\xaf\x52\xff\x0e\x31\xcb\x3e\xfb\x8f\x76\x7b\xb7\xd9"
+ "\x92\xfd\x4f\x95\xef\xd0\x36\x97\xe1\x93\x55\x25\x7d\xa0\xc8\xca"
+ "\xfa\x93\xe7\x39\xa7\x68\xdb\xac\x46\x39\x5e\x6e\x9b\x15\xbf\xc7"
+ "\xe9\xdc\xb8\x65\xe0\x59\x7a\xe1\xc2\x15\xf6\x4d\x33\xfa\x7c\x5f"
+ "\xcb\x07\xa1\xfc\xb6\x5e\x1f\x31\x6f\xf9\xa0\xc6\x38\xdc\xf0\x6e"
+ "\x5f\x9c\xaf\x62\x88\xc7\x63\x9e\x3f\x36\xaa\xef\xaa\x86\x80\x43"
+ "\x0b\xd2\x30\x9f\xd8\x2e\xe3\x11\xae\x8f\xd2\x88\xe2\xbb\xf9\x9b"
+ "\x3d\xdb\x2e\xe8\xf3\xd0\x4e\x67\x19\xe3\xb3\xed\x25\x86\x1b\x44"
+ "\x3e\x21\xf7\x03\xb6\x53\x2f\xce\x71\xf5\x19\xb0\x15\x4d\xb6\x8f"
+ "\x32\xf0\x0a\xd2\x36\x19\x3f\x85\xbf\x73\x1d\xdf\x26\xf7\x8a\x95"
+ "\x05\xc5\x85\x1b\x0a\x56\xae\x5a\x59\x32\x98\xdc\x4b\x9f\x59\x39"
+ "\x01\x49\xce\xc7\x0b\x57\x16\x17\xac\x94\xd1\x8a\x65\x20\xe4\x92"
+ "\x0d\xc5\xbc\xf7\x71\xd9\x1e\xbc\x4d\xda\xf2\xa6\xed\x93\xd4\x78"
+ "\xbf\xbd\xd6\xe0\x53\xf9\xed\x6f\x91\x47\x7d\xbe\x57\xf2\x9b\xc1"
+ "\xe9\x68\xe7\x07\xcc\xc3\x2a\xbe\xcf\x8e\x36\x65\x5f\x6c\x6f\xbe"
+ "\xdc\x27\x6b\x7b\xd0\xf0\xc9\x02\x7f\xdb\x58\xd6\xe3\x60\x81\xff"
+ "\x77\xd0\xe5\x65\x76\x64\xf5\xfa\x77\xea\xdf\x1d\xe7\xbe\x92\xf1"
+ "\xee\x6b\x58\xdf\x6e\x7f\x20\xe0\x9e\xce\x31\x7b\x75\xb9\xda\x31"
+ "\x2d\x0e\x5f\xe9\xcb\xcb\xb0\xf8\x9c\xd4\x84\x48\xbc\x2f\xdb\x8e"
+ "\x0f\x31\xf6\x3a\x8c\x7a\x9c\x9b\x4c\xd0\x77\x3b\x5e\x0d\x9b\xfc"
+ "\xe9\xd2\xff\x18\xe5\x00\xcb\x67\xf8\xd1\x04\x7b\xdb\xb5\x63\x6f"
+ "\x32\x8e\xc0\x7d\x24\xd2\x0f\xf7\xf9\x09\xee\x28\x67\x18\x48\xc3"
+ "\xf8\x5f\x35\x36\x3e\x2d\xbe\x9f\xa6\x4c\x9f\x05\x03\x7a\xed\x72"
+ "\x74\xd2\xd4\xa5\x45\x45\xac\x83\x96\x2e\x2f\x7a\x66\xcd\xea\xb5"
+ "\x7a\xd7\x4d\x59\xc1\x61\xa8\x65\x96\xbb\xf4\x37\xce\x55\xcb\x97"
+ "\x2f\x53\x49\x7a\x47\x26\xee\x59\x29\x3f\x86\x2a\xcc\xff\xb7\x15"
+ "\xf6\xd9\x8a\x55\x7b\x84\x69\x47\x3b\x7e\xe7\xa4\xfe\x91\xfd\x5a"
+ "\x55\x94\x38\x47\xab\x2a\x35\x64\x5f\xf6\xb3\x87\x7d\xce\x9c\xf6"
+ "\x2e\x21\xf7\x78\xd0\xaf\xbe\x3f\xa0\x9d\x03\x82\xe4\xe3\x33\x5f"
+ "\x69\x71\x70\x0e\xf6\xd2\xbb\x62\x61\x5b\x85\xf2\x99\x30\xf3\x37"
+ "\x6b\x39\xa6\x04\xde\x63\xfe\xff\xc2\x09\xa5\x27\xab\x82\xbd\x7b"
+ "\x2f\xa6\x74\xcc\x37\xab\xc0\xfb\xab\xb3\x2f\x97\x6f\x9f\xe5\x72"
+ "\xb9\x67\x5f\x4b\x9f\xd3\xa0\x71\xdc\x37\xe8\xc1\x7f\xbe\xf7\x8c"
+ "\x35\xe3\x46\xfd\x9b\x08\x7c\xcf\x65\x79\x5e\x21\x86\x0e\xb9\x87"
+ "\xfd\x1a\x4e\x92\x6f\x9b\xe2\x29\x5f\x61\x9c\x6f\xa0\xed\x34\xf9"
+ "\x2a\x55\xdf\xfa\xca\x0d\xf9\x43\x3b\xa5\x2d\xc7\x30\xd4\xb8\x5e"
+ "\x35\x40\xf1\x97\x6f\xaf\x41\x5b\x9e\xc3\xe3\xf9\x60\x9f\x1d\x54"
+ "\xb5\x40\xfa\x8b\xa8\x98\x1a\x3d\xdc\x7e\xc0\x99\x68\xc0\x41\x5e"
+ "\xb4\xdf\x12\x32\x68\x65\xe4\x89\xe7\x89\xa9\x4b\x8b\x31\xc1\x5e"
+ "\xb9\x62\xc5\xf2\x35\x6b\x8d\x38\xe3\xae\xd5\x45\xcb\x54\x5c\xf1"
+ "\xbb\xd0\xfd\xeb\x21\xc3\x93\x39\x34\x39\x52\xd5\x6d\x92\xbd\x3b"
+ "\x96\xd7\x44\xa4\xff\xa8\x9c\x73\xbd\xf4\x5e\x83\x3e\xff\x3a\x49"
+ "\x35\xf3\x94\xff\x55\x8d\x5d\xd9\xb6\xd7\xbe\xde\xed\xad\x2e\x31"
+ "\x6c\x5b\x5e\x6b\xed\xa2\x9b\xf8\x5b\x9e\xf2\x2c\xc1\xee\x97\x45"
+ "\x3b\xaf\xad\x22\x4f\x9d\xf1\x2d\x3a\xb6\x9b\xb6\xbf\xac\x62\x68"
+ "\xfb\x57\xb1\xaf\xc8\x4b\x1f\x69\xd5\x4e\x9f\xc8\xb4\xfa\x61\x9f"
+ "\x65\xb0\x4c\x0c\xe9\x64\x1f\x5e\x8e\x7d\x55\xdd\xce\x76\x1d\xeb"
+ "\x32\xfe\x5e\x43\x3b\x55\x1f\x84\x8e\x86\x4e\x7f\x29\x18\xb2\x3b"
+ "\x7d\x5b\x37\x92\x85\xeb\x80\xbe\x0e\x36\xed\x61\xda\xd6\xd0\x07"
+ "\xd0\x65\xba\xce\x0e\x72\x3d\x41\xaa\x6e\xd6\xd7\xfd\xf7\xea\xeb"
+ "\xac\x7b\x91\x0f\xfa\x7f\x48\x9d\xe2\x55\xfb\x37\x6e\x2e\x27\x37"
+ "\x7f\x9b\x52\xc5\xad\xba\x75\x06\xda\xc1\xdf\x62\x0c\xc1\x16\xc4"
+ "\x7c\xa7\xba\x04\x6d\xc8\xd1\x7d\xc0\xc1\x2b\x35\x2d\xca\xb7\xbf"
+ "\x7a\x19\xd3\x00\x70\x0f\xe8\x70\x21\xaf\x35\xe8\xff\x1b\xf5\x78"
+ "\xd9\x35\xdb\x8c\x3a\x30\xfe\x85\x60\x37\xbb\xd9\x76\x06\xde\x95"
+ "\xf8\x6d\xab\x92\x7b\xe9\x41\xe8\x7d\xab\x60\xdf\xb5\xbe\xef\xed"
+ "\xd5\x34\x19\x63\x21\xd7\xad\xe3\xce\xb1\x84\x2c\xbc\xce\xa7\xd7"
+ "\xb5\x9f\xd7\x02\x0c\x98\x78\xae\xd4\x2e\x9e\xd9\x03\x98\x16\x8c"
+ "\xeb\x21\xfd\x3b\x6b\xdb\xaa\xce\xb3\x9f\x63\x10\xe3\xf6\x97\x45"
+ "\x41\xd4\xc6\x7b\x50\x43\x8c\xef\xd8\x35\x9e\x67\x7a\xbd\x98\xdd"
+ "\xb7\xb7\x84\xf2\xa0\x3f\xe4\xa1\xbc\x9d\x5e\x9c\xc9\xf5\xb2\x2c"
+ "\x70\x5f\x5e\x42\xdf\xa0\x7f\x8e\x8a\x8b\x67\x0e\x38\x57\xd1\x90"
+ "\x53\xf4\xe2\x53\xdc\x47\xbc\x1f\xcc\xfe\x87\x48\xb3\x72\xdc\xfd"
+ "\x93\xf4\xe2\x23\xdc\x3f\x8c\x8b\xf0\xd9\xea\xa2\xdd\x79\xf7\xf3"
+ "\x99\x6b\xd6\x99\x9b\x4b\x61\x73\xaf\x60\x5d\x52\xfb\x11\xcf\xe1"
+ "\xf9\x7b\x49\x7c\xef\x59\x26\x34\xd9\xbf\x1b\xb9\x7f\x6b\x3f\xda"
+ "\xdc\x21\xb4\x4f\xbd\x24\x8e\x86\x89\x3e\x35\x51\x34\x62\x4a\x63"
+ "\xbc\x4d\x9e\x33\x7c\x2e\x7c\x0f\x05\xdc\x95\xec\xcb\x66\xd9\xb1"
+ "\x91\x6c\x7c\xa6\x9e\xbf\x05\xd4\x1a\xae\xa7\xd6\xe2\x7a\xfa\x5d"
+ "\xb4\x96\xfc\xeb\x38\x3e\xca\x4b\x5b\x7f\xef\xae\xe5\x3d\xb6\x6b"
+ "\x70\x3f\xdd\xf9\x6d\x59\xd7\x88\xdf\x1f\xff\x23\xfd\xde\xff\x47"
+ "\x72\x3e\x2a\x9f\xc7\x36\xe7\xfd\x8e\x9a\x73\x7f\x47\x9e\x76\xa1"
+ "\xf1\xbc\xae\xec\x29\xae\xa3\x12\xb0\xf6\xf0\xf9\x73\x9b\xd6\xe5"
+ "\x18\x8c\xf6\x9b\x79\xff\xa0\x35\x1c\x22\xff\xaa\x7f\x67\x1c\x7f"
+ "\xda\x70\x9e\x2c\xfe\x55\xbf\x91\xf7\x6a\xbe\x75\x66\x4f\x60\x59"
+ "\x1b\xdb\x94\x51\x3e\x7b\xcf\x7b\x92\x98\x63\x68\x55\x8c\x63\x4c"
+ "\xe1\x0d\x7a\x99\x8d\xf2\xb0\x39\x8d\xf2\x32\x56\xdc\x6e\xa6\x07"
+ "\x70\x6a\x59\xa0\x68\xd2\x8c\x91\x42\xc7\xf9\x23\x4f\x5e\x3c\x7d"
+ "\x5e\x6c\x66\xfa\x70\xcc\x56\x0d\xfd\x05\xdc\x72\x41\x03\xcd\xa8"
+ "\x03\x38\x5b\xf4\x35\x5c\xcb\x8e\xf3\x94\xe1\x5f\xc5\xdf\x82\x7b"
+ "\xe9\x36\xeb\x3c\xb3\x45\xbb\x78\xf6\x40\xd5\x05\x32\x73\xbf\xf1"
+ "\xbe\x4d\x95\x7c\xcf\x30\x5f\xe2\xfd\x1f\x1b\x78\x92\xf0\x33\xe3"
+ "\x67\x61\xbe\xc3\x95\xcf\x70\x56\x02\x87\xfd\xe8\xab\x3d\x7c\x55"
+ "\xbc\x68\xcf\xe1\xb8\x24\xfa\x1c\xaa\x2f\x1d\x72\x14\x15\xf2\x7b"
+ "\xcb\x90\x99\xda\xfd\x1a\xe4\x88\xd7\x70\x1a\x6a\x28\x43\xf3\xfa"
+ "\x22\xbb\xa1\xeb\xea\x6b\xe4\xb9\x64\x1b\xaf\x6b\xee\x94\xdf\xd6"
+ "\x78\xe9\x80\xa1\xfb\xbe\x3f\x9c\xcf\x6e\xd6\x9e\x30\xf1\xba\x8f"
+ "\xcf\xb9\x4f\xe7\xf3\x7d\xc8\x03\xfd\x7f\xbd\x3e\x86\xd6\xc8\xf9"
+ "\x05\xcb\x7e\x7f\xf3\x09\xd8\xb2\xcd\x62\x57\x1e\xf1\xfe\x4f\xc6"
+ "\x16\x11\xca\x68\xb7\x8a\xd6\x70\xb3\x3c\xb3\xdb\x1a\x8e\xc9\xfd"
+ "\x1f\xbc\x4f\x9b\x13\x0e\x59\x61\xfb\x1e\x63\xda\x19\xe9\xbc\x77"
+ "\xc4\xeb\x6a\x73\xc2\x22\x34\x77\x83\x95\xbf\x85\x39\x42\xee\x1d"
+ "\xe8\xe9\xad\x0e\xcc\x1b\x36\x84\xac\x68\x7b\xb4\x17\x56\x57\x5e"
+ "\x3a\xcb\x1b\xf2\x66\xf5\xe6\xed\xca\x33\xf3\xb7\x9d\xb9\xce\xb8"
+ "\xb4\x01\x73\xdd\x28\xcb\x7d\xa5\xa7\x29\x9b\xf9\xe5\x83\xbd\x73"
+ "\x4a\x3e\xbf\xd0\x85\x71\x73\x6d\x5e\x9a\xd6\x95\x67\x8a\x01\x36"
+ "\x78\xdf\x26\xbf\xc9\x19\x0d\xe9\xdf\xb8\xea\x80\xfc\xb6\x91\xa8"
+ "\x6e\x28\x47\x3e\x33\xc3\xe5\x58\x10\xfc\x6d\x10\x61\x7f\x2d\xb5"
+ "\xdf\xb6\xaf\x32\xc7\x5f\xf6\x28\xf8\xe9\x95\xc3\x2c\xcf\x31\xdb"
+ "\xc8\x83\xce\x27\xd8\x86\x79\x45\xfa\x06\xc4\x20\x63\x31\xfb\xc8"
+ "\x83\x13\x3a\x28\xad\x0c\x7c\xab\xd6\xa0\x5e\x79\x38\x00\x19\xf4"
+ "\x68\x02\x76\xe8\x2b\x33\x98\x6f\xac\x9d\xec\x2b\x37\xf2\x90\xf4"
+ "\x4f\xcb\xdc\x9a\x1d\x88\x74\x50\x73\xf9\x9f\xa9\x39\x1a\x28\x3f"
+ "\x7c\x3e\x64\x56\x7e\x6a\x66\x86\xbb\x92\xdf\x79\xc0\xab\x05\xb1"
+ "\x3d\xd4\xdf\xde\x00\xcf\x8f\x31\x86\xfd\x55\xcd\x15\x5f\x39\x6c"
+ "\xcc\x8b\xaf\xdc\x86\xba\x2c\x8e\x9f\x21\x84\x83\xb4\x9a\xc7\xf8"
+ "\x5b\x3e\x1e\xd1\xed\xa2\x09\x1b\x79\x4d\xee\x95\x4e\xcc\x51\x72"
+ "\x75\xb8\xe7\x14\x5c\xe4\xbf\x02\x5c\xe6\x99\xe6\x3a\xb9\x2f\x85"
+ "\x36\x3d\xe6\x8c\x01\x76\x2c\xf3\xb1\x25\xd0\xf1\x1e\xcf\xa7\xbc"
+ "\x66\xfb\xea\x23\xa8\xc7\xd9\x1a\x3d\x46\x1c\x87\xa7\x41\xc3\xf8"
+ "\x78\xce\x41\xba\x4f\x9e\xe7\x2c\xd5\x4d\xd7\x84\xcb\x86\xf9\x3a"
+ "\xef\xc7\x78\x58\xc7\xf1\x5a\x40\x59\x8c\x06\x06\x30\x32\x72\xec"
+ "\x08\xc0\x98\xfd\x21\xef\x7d\x41\x4f\xc4\x84\xc3\xf4\xde\x45\x8c"
+ "\xf4\xd0\x9d\x32\x96\x44\xc5\x17\x77\x0e\xdd\x42\xf7\x08\x93\x55"
+ "\xfa\x74\x6a\xd5\xde\x1c\xf4\x6d\xa5\xf2\x01\x74\x1e\x8a\xf3\xff"
+ "\x4b\x47\x5d\xd2\xff\x4f\xd8\x9c\xa5\xf5\x72\xdd\x71\xe4\xc1\x6e"
+ "\x6f\x5d\x38\x48\xaf\xc8\xf5\xd7\x6d\x7c\xc6\x43\xea\xd8\x57\x97"
+ "\x86\xec\x8b\x65\x9b\xf8\x2c\xab\xb6\x2e\x76\xa0\xea\x9f\xd2\xbe"
+ "\xe6\x77\x53\x5a\x3b\xbb\xfd\xc2\xb7\x58\x7e\x93\x4f\x87\x6d\x3d"
+ "\x4b\xaf\xda\x45\xf5\x62\xd8\xcf\xaf\x2e\x51\x7d\x23\xef\xc7\xf2"
+ "\xfb\x68\x8f\x0b\xf7\x75\xfb\xea\x2f\xf1\x5e\x40\xdd\x02\xe1\xfd"
+ "\xb2\xbf\xcb\xb6\x98\xe6\x3b\xd8\xa6\x7a\xb5\x24\x68\xfa\x5d\x96"
+ "\xbe\x0e\x28\xe3\x62\xf4\x37\x47\x12\xbb\x1c\x83\x03\x00\x82\xf9"
+ "\x6c\xd6\x69\xda\xf5\xc9\x25\x2f\x99\x7a\x60\x0b\x5e\x32\x91\x0d"
+ "\xf2\x95\xb1\xe3\x06\xca\xc6\xbb\x1b\x4e\xd3\xab\xbf\x8d\x9a\x28"
+ "\x0b\x3f\x5b\xe8\x8b\x85\xd7\x00\x6e\x2e\xaf\x91\xb6\x9c\xe7\x35"
+ "\xae\x9d\xf2\x9c\x72\xd5\x4e\x1a\xa5\x01\x1e\xef\xf7\x54\xdd\x40"
+ "\xa3\x78\x9d\x12\x69\xae\x82\x98\xda\xf7\x34\xd6\x22\x2a\x6e\xa0"
+ "\xb1\x89\xf5\xbe\x7a\x40\xad\x63\xee\x6a\x97\x73\xab\x10\x7d\x09"
+ "\x73\xab\x93\x80\xbb\x57\x78\xd3\x85\xf8\xa2\xc3\xa4\x7c\x13\x76"
+ "\x6e\xb7\xd6\x29\xbe\x93\xfb\x7c\xe0\x37\xde\x47\xd5\xf7\x94\xd2"
+ "\x64\x3c\x90\xcc\x31\xd3\xf8\x3b\xd4\x71\xeb\xc4\x36\x89\x87\x7e"
+ "\x86\x3f\x56\x71\x2b\xc7\x06\x93\x67\xf7\x0b\x96\xaa\xfd\x28\x3e"
+ "\xdf\x1f\xa4\x9d\x32\x1e\xe3\xb6\x9d\x94\xf1\xc2\x4e\xb2\xb5\xac"
+ "\x90\xed\x3a\xac\x64\xd1\x4c\x8c\xaf\xe6\x63\x39\x03\x4f\x00\x6f"
+ "\xae\x8f\x79\xa3\x35\x7a\xce\xef\x29\x11\x9a\xff\x09\xb6\x45\x77"
+ "\xc6\xfc\x6b\xf6\xd3\xdc\xf6\xa8\x3a\x8b\x9a\x4f\xa1\x46\xc0\x6b"
+ "\xbc\x81\x6c\xa7\x68\xd7\x35\x81\x22\xe2\xfd\x8a\x9b\xfc\x6b\x0e"
+ "\x02\xf6\xae\x1b\x79\x2c\xd8\x0e\xfa\xa8\x31\x61\xd7\xb1\x40\xa4"
+ "\x8d\x5a\x20\xdf\x73\x8a\x85\x84\x83\x3c\x0f\xcb\xf6\xee\x72\x38"
+ "\x0b\x54\x0c\x06\xd9\xd6\xde\x7d\x3e\xbd\x1d\x81\xf3\x12\x5e\x61"
+ "\x00\x5c\x62\xb4\xc9\xa0\xb5\xe2\xaf\x5d\x6f\xf8\xd7\xec\x25\xee"
+ "\x1f\xce\x8f\xe7\xda\x40\x27\xf2\x9e\x49\xec\x17\xce\x83\x77\x1f"
+ "\x02\xee\x37\xfa\xf6\xaa\x79\x0f\xb5\x2f\x4f\xfd\x4e\x3e\x8f\xb6"
+ "\xd3\xb2\x0b\x34\x52\x6b\xfb\xbb\x6e\x63\x5c\xd1\x77\xd9\x81\x92"
+ "\x3f\xa7\xf6\x49\x85\xec\x83\xef\xb7\xb4\xca\x3d\xbb\xfa\x91\x73"
+ "\xa2\x9a\x50\xfa\xac\xfe\xb8\x06\x3d\x10\xc4\x95\x75\x81\xd4\x27"
+ "\xe3\xd9\x0f\xa8\xfe\x4f\xd6\x34\xd5\xbf\xdc\x16\xb6\x57\x52\xf5"
+ "\x71\xdc\x7e\xa2\x8d\x71\x35\xfa\x98\xbf\xe1\xa8\xf1\x9e\x30\xfb"
+ "\xdb\xf7\x38\x48\xf1\x9f\xf0\x01\xee\x87\xba\xed\x16\xd1\xc7\xb2"
+ "\x48\x97\x7d\xa4\x3c\x1f\x69\xf8\x06\x43\x7e\x0f\x17\x28\x7f\x6e"
+ "\x07\xeb\xa8\x46\x93\xd0\x79\xb3\xfe\xb8\x5e\x36\xac\x7c\x32\xea"
+ "\x6b\x51\x3e\xe5\xba\x94\x48\x87\xde\xf1\x42\x4d\xa3\x3d\x6c\x47"
+ "\x0a\xe8\x2a\x8c\x07\x03\x03\xe1\x4b\xfa\xf7\x33\x77\x3f\x08\x9b"
+ "\x7a\x20\x9f\x8f\x32\x70\xbb\xba\xbd\xbf\xdd\x23\xd4\xdc\x66\x77"
+ "\xbe\xb1\xb6\x24\x6c\xa0\xb1\xd7\x2a\xf8\xac\x24\x9f\x77\x09\xdb"
+ "\x2b\x73\x43\xf6\x9d\xc5\x4a\x6e\x76\x6f\x85\x9d\x2a\xf5\x6d\x41"
+ "\x84\xca\xb9\x5d\xbc\xb7\x8b\x79\xd3\x40\x6e\x33\xe0\x60\xfe\x53"
+ "\x3c\x49\x8d\xe7\x0a\x76\xbf\x6b\x3b\x46\xdb\xd0\x26\xd9\x36\xb4"
+ "\x51\xb6\x4d\xff\xbe\xd4\x29\x6a\x18\x29\xd7\xcb\xaf\xae\x3d\x2a"
+ "\xbe\x8c\xaf\x32\x97\xbf\x9d\x7b\x8a\x1a\xdf\x95\x67\x60\xd0\x27"
+ "\x6a\x1f\xa4\xa1\x44\x0c\x7e\x61\xf0\xd5\xc1\x6c\xc8\x55\x30\x77"
+ "\x16\xbf\xc4\xb1\x28\xf5\x6f\xd4\x01\xf6\x6b\xa2\x7a\x67\xb1\x3c"
+ "\x63\x88\xfa\xf8\x1b\x9f\x7d\x7a\xa8\x71\x14\xf7\xd5\xf8\xfd\x94"
+ "\xab\xf8\xb0\xf1\x0b\xbc\xd6\xac\xe6\x79\x0d\x47\xa1\x7b\xb7\xa9"
+ "\x39\x95\xe1\x47\x9e\x26\xfd\xc8\xe3\x75\xec\x55\xe2\x28\xf5\x9d"
+ "\xc8\xdc\x82\x39\x64\xc3\x21\x79\x56\x12\xf8\xae\x8f\x1a\xfa\xaf"
+ "\xe1\x10\xfb\x24\xf5\xfa\x03\x6c\x00\xaf\x94\xa9\x73\xe4\xdd\xde"
+ "\xc6\x3c\xc3\x46\x91\xdf\x24\xf3\x8a\xa3\x9c\x6f\xee\x86\x73\xd2"
+ "\x5f\xa0\x4a\xc6\x3c\x38\xad\x9f\xb3\x6b\x7c\x4a\x5f\xd7\x70\xb1"
+ "\x0f\x3f\xca\xd6\x06\xe9\x03\x79\x26\x90\x69\xc0\x75\x4b\xdc\xe5"
+ "\x77\xc1\x1a\x0f\xf4\xed\xfb\x34\xc8\xef\xa6\x2b\xbf\xd6\xc6\xa3"
+ "\x06\x8f\xa0\xbd\x03\x55\x6c\xd0\x86\xdb\x8e\x8c\x25\xc9\x03\x5d"
+ "\xc2\x31\xf8\x2b\xf5\xcc\x93\x8d\xa1\x78\x3a\xcd\x8d\x6a\x1e\xa5"
+ "\x83\x1a\xda\x84\x94\xf5\x86\xb6\xcf\xb6\x27\xf6\x4c\x37\x6c\x11"
+ "\x45\x67\x1b\xf4\xcb\xeb\x36\x49\x6b\x9f\xad\x8d\x63\xb4\x6c\x2a"
+ "\xe3\x98\x53\xaf\x0d\xe0\xd8\x5e\x51\x9f\x2d\x12\xe3\x33\x99\x18"
+ "\x67\x35\x9f\xdd\x72\xaa\x98\x4c\x05\xc5\xbc\xd7\xb5\xe8\x18\xcf"
+ "\xaf\x84\x07\xb6\x40\x26\xec\x13\xc8\xf9\xe6\x95\x64\x5d\x54\x08"
+ "\xd8\x1e\x57\x16\xc7\xde\xe2\xb8\x5b\x1c\x3b\x2f\xe6\x71\x65\xe2"
+ "\x7e\x38\xec\x39\x9b\xb0\xd9\x3a\xd8\x5f\x26\xe6\x15\xd0\xc7\x27"
+ "\x38\xfe\x97\x29\x10\x8a\xd0\xe6\x33\x64\xe1\xd8\x5e\xd1\xea\x45"
+ "\x1d\xad\xe1\x8f\xe4\xdc\x62\x68\x31\xec\x69\x4d\x9e\xcb\x71\x68"
+ "\xf6\x45\xc7\x42\xf6\x45\xc7\x55\xbb\xcf\x09\xd5\x6e\x85\x37\xe3"
+ "\xaf\x74\xdc\x30\x4b\x99\xc4\xfd\xdf\x7e\x14\x05\x7c\xcd\xe7\x30"
+ "\xc7\x7c\x0e\x52\x67\x39\x9b\xa9\xac\x44\x74\x04\x60\x1b\xb3\xff"
+ "\x26\x9f\xd7\x65\x7f\x1c\x6e\x23\xb7\x8f\xeb\xfe\xfd\xf9\x33\x32"
+ "\x56\x59\x14\xcf\x9e\x22\xbd\x4c\x27\xca\x74\x36\xd3\x25\x9f\x43"
+ "\xb6\xbd\x35\xac\xca\x16\xc8\x7b\x2e\x1f\x47\x07\xbd\xcd\xbd\x74"
+ "\x40\xdb\xb9\x7d\xdc\xfe\x28\xd3\x04\x34\xd0\xdb\xea\xe8\xd1\xdb"
+ "\xc9\x6d\xfc\x1d\x46\x9d\x9d\x68\x27\xda\x2a\xdb\xd9\x83\x76\x1e"
+ "\x2d\x24\x8a\xd4\x54\xce\xfb\x34\xd3\x41\x3c\x3f\xf4\xfc\x01\x76"
+ "\x74\xa9\x8f\x30\x0f\x34\xff\xb4\xcc\x67\xfa\x3e\x6c\x93\xb2\x10"
+ "\xe6\x83\x21\xd1\xc1\xf6\x7e\xa0\x18\xbf\x68\xbd\xb4\x71\xa4\x7d"
+ "\xcc\xdf\x88\x7d\x1a\x6d\xd2\x3e\xa1\xb2\x0e\xd1\x01\xdb\x34\x12"
+ "\x88\x22\x4f\x21\xda\x8f\xf9\xe3\x29\x1d\x7f\xce\xbb\xf9\x9f\xaa"
+ "\x5d\xd6\x22\xca\x7a\xff\xd1\x4a\x53\xa0\xad\x92\x8c\xb6\x2c\x46"
+ "\x3e\xb4\xc7\x01\x58\x43\xe4\x77\x19\xd0\xce\x5d\xc0\x33\x12\xd7"
+ "\xa6\x96\xce\x08\x60\xfe\x89\x06\xcf\xa3\xb4\x9d\x67\xd1\x8e\xb3"
+ "\xe4\xf0\x95\xc1\xfe\x7a\x88\xed\xc5\xd7\x3e\xbe\x36\x8f\x46\x05"
+ "\x69\x4f\x87\xe2\x3b\x19\x37\xe8\xba\xd3\xf4\xfa\x35\xbd\xb1\x81"
+ "\x38\xde\x9a\x7d\x51\x27\xf3\x91\x8c\x11\xc4\x63\x46\x37\x78\x86"
+ "\x7d\x69\xd6\xa3\x8e\x6e\xd7\x70\x89\x8f\x77\x22\xe1\x39\x03\xcf"
+ "\xfc\xcd\xa8\x2c\x5e\x13\x40\xb9\x0e\x01\x9a\x31\x7c\x51\xbd\xe8"
+ "\x38\x5f\x99\x86\x29\xcf\x9a\xfc\x8c\x72\x50\xc7\x21\x9e\xfb\x1e"
+ "\x28\x0b\x99\x9e\xfd\x19\x8d\xbd\x3a\x9d\xf2\x7a\x4e\x7f\xfa\x9b"
+ "\xf7\x2d\x18\x1e\xda\x96\x79\x9a\xf6\xde\x98\x28\x63\x4e\xa9\xcb"
+ "\x94\x1e\x7c\xbd\x9d\xf7\x0a\xae\xb2\x5e\xa9\xff\xd8\xe7\xe9\x2a"
+ "\xcb\x75\x18\x78\xe0\x7e\x6f\x7f\xb8\x5f\x3d\x1d\xf6\xe6\xf6\x07"
+ "\x6b\xfb\xcb\x32\x5e\x9c\x67\xc7\xcb\xec\x8f\x58\x99\x73\xc4\xc1"
+ "\x31\xbc\x31\x76\xee\x0d\xd3\xda\xdd\x64\xf1\x9c\xe1\x35\x99\xd9"
+ "\x74\xa4\x3e\x9b\x1a\x30\x27\x17\x5d\xae\xcc\x17\xcf\xb3\xef\x83"
+ "\xd2\x21\x6c\x93\xf2\x59\x4a\xb1\xd6\x65\xab\x7a\xd9\xb0\xe1\xdf"
+ "\xb8\xa6\xf4\x02\x99\xd4\x37\x52\xde\xb0\x4c\x73\x8a\x68\xad\x49"
+ "\x2b\xac\xe7\x98\x57\x99\x5e\xde\xb3\x2f\x34\xe2\x48\x49\xdb\xc7"
+ "\x0d\x99\xeb\x72\x0c\xde\xbe\x86\xc6\x72\xec\x3b\x6b\x48\xd9\x72"
+ "\x6a\xbc\x7e\x83\xc7\x14\x9b\xbe\xdf\x6f\x53\xb1\xa5\x5e\x2f\x6f"
+ "\x3c\x8f\xba\xd4\xfb\x95\x31\xcc\x61\x24\xdc\x35\x34\xaa\xfe\x3c"
+ "\xb9\xd8\x0e\x2a\xf8\x44\xd9\x6c\x3c\x2f\x9c\xdd\x69\x15\xb1\xff"
+ "\x72\xd1\xee\xd3\x7d\xb1\xf1\x42\x6b\x39\x9e\x9e\x70\xf4\xb7\x57"
+ "\x52\x35\x5c\xfa\xfc\xc8\x78\x2c\xea\x1b\x7a\x44\xb5\x35\x64\xe6"
+ "\x6f\xc6\xf2\x5a\x1e\xaf\x0d\xf3\xb9\x1f\x35\x86\xbc\xd1\x66\xc4"
+ "\x0c\xeb\x77\x1f\xd1\xa7\xe6\x3b\xda\x40\xcc\xbf\x42\xdd\x7e\xff"
+ "\x3a\x1e\x33\x7e\xe0\xe4\xb3\x46\x7d\x73\x9c\x1f\xa4\xf1\x3b\x4e"
+ "\x63\x5f\xf8\x5c\x49\xcb\x1f\xcc\xe0\x79\x8f\x3e\x67\x7c\xdf\xd9"
+ "\x9b\xa6\x6c\x18\x1e\xcb\x18\x87\x46\xb5\x8e\x3c\xb4\xdb\xfb\x83"
+ "\x65\xc6\x78\xc6\xe3\xba\xfa\x5e\xed\x0f\xdc\x41\x53\xf3\xac\x2b"
+ "\xe0\x67\xd3\xbf\xf7\xcc\xb1\x11\x72\x91\x7f\x9f\x31\xbe\xc9\xef"
+ "\x91\x54\xdc\x70\xef\xda\x0d\x34\x62\xfe\x17\x2c\x32\xf6\x06\x7f"
+ "\x77\x54\x8d\xbb\x3f\x38\xd6\xb7\x9f\x96\x2b\xe9\x2d\xbf\x35\xc8"
+ "\x73\x0c\x13\xc6\x60\x15\xff\xae\x53\x8d\xbf\xc6\x39\xf7\x1f\x9c"
+ "\xe9\xab\xe7\x87\xb6\xde\x71\x14\x75\xb0\x5f\x07\xc3\x57\xb6\xc9"
+ "\x0f\x9a\xb8\x0e\x9e\x5b\xa9\xf1\xf5\x07\x4d\x57\xb0\xc5\x5c\x4c"
+ "\x5f\x4d\x9f\x4f\x06\x3a\xff\xae\xe8\xeb\xa6\xf4\x09\xb5\xe4\x78"
+ "\xbf\x2c\x68\x1e\xaa\xe2\x38\x59\x4f\xd2\x0f\x97\xf2\x7b\xe6\x75"
+ "\xff\x78\x5e\x8b\xfb\xe1\x7b\x01\x1e\xb7\x7b\xf2\x32\xe6\xf0\x5c"
+ "\x5f\xda\xe2\x3f\xdc\x3f\x0e\xe5\x90\x96\xf9\xeb\xb3\x11\x73\xd5"
+ "\x46\x1a\xcb\xdf\xf4\x44\xba\x5c\x27\x08\x5d\xff\x64\xf7\x57\xb2"
+ "\xc8\xf1\x95\x5a\x3e\x0f\xf0\xc3\xe3\x98\x5f\xca\xb3\xe9\xb2\xfe"
+ "\x9a\x86\x3d\x1c\xfb\xef\xcd\x4b\xc1\x01\xaa\xaf\xf6\x3d\x8d\x67"
+ "\x57\xdc\xf3\x10\x63\x2d\x3f\x48\xfb\x8a\xe5\xde\x25\xfb\x3c\xaf"
+ "\xe2\xf1\xba\xc2\xd9\xe7\x27\xb4\xef\x69\x85\xcb\xbe\xa7\x8f\x14"
+ "\x13\xaf\x55\x1f\x6f\x90\x71\xbc\xf6\x4d\x0b\xd2\x0f\xb6\xea\xeb"
+ "\x31\xc7\x24\x5f\xb1\xbd\xfb\x1c\xcf\xc1\xfe\xee\xdf\x8e\x7c\x3c"
+ "\x4e\x14\xb8\x29\x57\xd9\xf0\x15\x39\x1a\xf8\x27\xae\xfd\x1f\xf1"
+ "\x5a\x5f\x4a\x9d\xb8\x93\x48\x96\xa9\xf6\x16\x4b\x9f\xb3\xea\xd7"
+ "\x78\x9e\x64\x11\xd5\x5b\x9d\xb8\x66\x80\xe7\xb2\x71\xe5\x31\xdc"
+ "\x85\x6b\x96\xa8\x6e\x08\x32\x5f\x62\x0e\xeb\xc0\x3c\xc1\xd2\x65"
+ "\xf7\x16\xf6\x77\x56\x91\x69\x13\xd8\xfa\x6d\x52\x3e\xb4\x3f\x5a"
+ "\xd0\x12\x82\x7d\xb6\x9b\x68\x6d\x54\x5c\x72\x7e\x89\xcf\x04\xfd"
+ "\x68\x81\x67\x37\xfb\xae\xfc\xc8\x95\xe8\xbb\xf2\xa3\x19\xf8\x55"
+ "\xe2\x77\x82\xe8\xc7\x19\xb8\x2e\xe8\xfb\xfd\x78\x46\xb7\xf7\x47"
+ "\x0b\x40\x47\x69\x63\x5d\x9d\x4e\xe4\xf2\xe8\x07\x9e\x17\xd9\x1f"
+ "\xb3\xa9\xf6\xee\x9c\x87\x67\x8b\xb0\x37\xf8\xf4\xf6\xe6\xe2\xd9"
+ "\xe6\xf4\x60\x5c\xb3\x83\x26\x37\xa0\xcd\xf6\xd7\x88\xdb\xcb\xf8"
+ "\x76\xd9\xb7\x3a\xe3\xcf\x69\x32\x4c\x6e\x7f\xc8\x8e\x72\xa0\xa5"
+ "\x18\x3f\xda\x6f\xd0\x53\xa7\x13\xef\x1b\x99\xba\x00\x43\xd9\x41"
+ "\xc8\x0f\x18\x46\xfe\x5e\xda\xdf\xc0\xdf\xd7\x40\x9f\x22\x1f\xe6"
+ "\xc4\x16\xe3\x0c\x68\xb7\xf7\xc7\xb9\x1f\x14\xa9\xfd\x03\x2e\x1b"
+ "\x8e\x2b\xcb\x31\x2f\x52\x95\x47\x9d\x16\x55\xe7\x56\xe7\x29\xfa"
+ "\xd1\xc3\xaa\xde\x1f\x4f\xec\x4f\x96\xca\x46\xc2\xbe\xab\x0f\x72"
+ "\x5c\x0c\xb6\x87\x26\x05\x46\x84\x29\x50\xaf\x61\xcc\xaf\x98\x97"
+ "\x5b\x26\xfc\xa7\xe8\xc7\x17\x5a\x23\x1d\x57\x39\x1e\xfe\x58\xfa"
+ "\x64\x89\x4b\xe5\x14\x28\xbd\x5d\x7e\xcb\xfa\x2c\xed\x1f\x1d\x08"
+ "\xc9\x98\xf0\x7c\x2f\x63\x8b\xb2\x9f\x06\x8f\x0d\x98\x63\xf7\xc6"
+ "\x54\xd4\x90\xb7\x81\xd3\x91\x16\x08\x87\x64\xec\xc5\x3e\x3f\x72"
+ "\xaf\x4b\xc9\xd4\x4f\x3e\x92\xf1\x17\x18\xdf\xe8\xfd\x7e\xc6\x59"
+ "\xf3\x79\x5d\xdc\x06\x0f\xe6\x7f\x81\x68\xb7\x9f\x65\xc2\xb9\x8e"
+ "\xd7\x0a\x7f\xf2\x2e\xf8\x4e\x68\xd5\x5e\xd7\xd5\xb5\xe1\x27\xf2"
+ "\x3c\x90\x27\x2a\xce\x86\xec\x5e\x17\xdb\x24\x55\x65\x03\x2c\x53"
+ "\xeb\x85\xbf\x2b\xb3\x62\x5e\xb7\xf7\x27\x27\x3e\x70\xab\xbe\xb9"
+ "\x4a\xb8\x27\x8c\xb6\x37\xe8\x6d\x47\x9a\xdc\x9b\x9b\x50\xa7\x62"
+ "\x4d\x06\x69\x7f\x56\xbf\x6b\x56\xe8\x67\xb6\x07\xd8\xc7\x55\xd1"
+ "\x62\xff\xb2\xde\xb1\xe1\xaa\xf0\xd8\xbf\xec\x73\xd4\xd1\xa3\xd7"
+ "\x71\xf4\xbf\x59\xc7\xd1\x2b\xd5\x01\xdd\x70\xe3\x69\xfa\xe9\x82"
+ "\xab\x9f\x3b\xfe\xd4\x29\x79\xc5\x57\x91\xab\x74\xe6\xcf\x3e\x8c"
+ "\x61\xfe\x16\xb5\xed\x9c\x27\xbf\x3b\x65\xa2\x72\x8e\xbb\x19\xf5"
+ "\x3d\x66\x6b\x71\x5f\x22\xff\xba\x3f\x52\x3b\xfd\x54\xc6\xba\x6b"
+ "\x29\xe1\x39\x5b\x83\xaf\xa7\xa6\x62\x4f\x8f\x69\xff\x5e\xa6\xf7"
+ "\x6e\xf4\xc3\xae\x38\x3e\x6b\x0d\xff\x91\x02\x4b\x78\x7d\xf5\x18"
+ "\xaf\x6b\xfb\x84\x7d\xe7\x3c\x0d\xba\x01\x36\x7a\x4c\xd2\x03\xf6"
+ "\x8b\x9a\x6f\x55\xe6\xc8\xf9\x56\x48\x9e\x4f\x1c\x22\xe3\x69\x7a"
+ "\x57\x87\x79\xed\x3b\xd6\x93\xe7\xec\xf6\xd2\x3c\x8e\xb3\xc9\xeb"
+ "\xce\xc2\xe6\xac\x9d\x1b\x4d\x17\x72\x3e\x05\xdb\x9f\xe3\x6c\x06"
+ "\xc2\x41\x8a\xc1\x8e\xae\xbf\x48\x59\xf5\xb0\x3d\xa1\xb3\x6d\xac"
+ "\xd7\x1b\xf5\x58\x9b\xdb\x2f\xf6\xc5\xda\x6c\xe0\xb5\x9e\x36\xdc"
+ "\x5f\x24\x73\xac\xba\x32\x67\xd7\x45\x1a\xb5\x7b\x1d\xb9\x76\xf1"
+ "\x5a\xde\x3f\x94\xed\xc3\x76\x85\x8c\xbb\xb9\xda\xc5\xeb\xf9\x7d"
+ "\xb6\xcf\x7a\x8e\x0b\xdc\xab\xb7\xcc\x72\x0d\xe4\xaa\xe8\xfd\x33"
+ "\x39\x0e\x46\x7d\xde\xe2\xa8\xed\x35\xea\xa9\xd9\xea\x44\x1f\x34"
+ "\x81\x7e\xb9\xa9\xfa\xd6\xf0\xc3\xaa\x8d\x8b\x95\xfa\xc1\x28\xa5"
+ "\xdf\x83\xf4\xa6\xa5\x3f\x9e\x88\xed\xca\xa3\x09\x9d\x94\xad\x7c"
+ "\x1a\xae\xc1\x98\xf8\x66\x11\xef\x9f\x97\x3d\x45\x8e\xd8\xae\xfc"
+ "\x34\xcf\x6b\x94\xce\xdf\x39\xe7\x5f\xd9\x3f\x45\xc7\x84\x22\xca"
+ "\xe6\xfd\x07\xf6\x7b\x70\x6e\x92\xf9\x27\x8f\x2a\xa5\xec\x78\xd8"
+ "\x33\x94\x63\xd4\x5d\xce\x99\xab\x1e\x5f\xfd\x54\xf1\xd2\x92\x95"
+ "\x8f\xad\x2c\x5a\x59\xb2\x41\x86\x50\x18\x2b\xff\xdd\x37\x7a\xd9"
+ "\x02\xb9\xe9\x1c\x67\x5f\x8c\xea\x5b\x8f\x7b\xf3\x42\x94\xd7\x0f"
+ "\xae\x8a\x5e\x6f\x4a\xfd\x57\x0f\x5b\xaa\x5e\xfa\xee\x1c\xb0\x04"
+ "\x4d\xbf\x97\xe7\x62\xb7\x21\x6d\x9b\xee\x63\x73\x4a\xcf\xa7\xf9"
+ "\x1a\x82\xe0\xe3\x49\x27\xe9\xe7\x51\xde\x0f\x41\x5f\x65\x07\x4a"
+ "\x4f\xf3\x5c\x72\x12\xaf\xf1\xb7\xf0\x5a\xc6\x1a\xce\x7f\x60\x33"
+ "\xfb\x30\xb0\x3f\x14\xf8\x70\xef\x49\xfd\x59\xff\x66\xfa\xae\xe8"
+ "\x6a\xc7\xde\xe8\x39\xc7\x0f\x84\xc8\xdb\x29\x56\x17\xee\x12\xe7"
+ "\x0a\x77\xc6\xc5\x7f\x1b\x88\xf2\xd5\x90\x93\x6f\xe0\x77\xbd\xf0"
+ "\xd9\x5d\x90\xbf\x11\xa7\xe9\xc0\x1b\x8c\xc3\xec\x42\x71\xae\x2f"
+ "\x16\xc2\x81\x77\xf1\xdc\x83\x9f\x26\x7c\x99\x33\xe2\xf6\xd7\xf8"
+ "\xdd\x47\x9c\xbf\x78\x05\xfb\x84\x1d\x38\xc3\x78\x89\x9a\xcc\xfb"
+ "\x43\x9e\xc2\x74\xe4\x8f\x29\x3c\xdf\xba\x26\xb0\xb5\x95\x9c\x8f"
+ "\xc9\x7b\x8b\xff\x09\xb6\xe7\xde\x7a\x4d\x98\x3c\x82\xf7\xe0\x02"
+ "\x1d\x51\x52\xe7\xd5\xde\x74\xb3\x0f\x42\x03\xec\xed\xfa\x4c\xb2"
+ "\xf9\x32\x29\xa3\xdb\xfb\xd6\xc4\x5e\xff\x0b\x9b\x1a\x6f\x79\xcc"
+ "\xe3\xd8\xd9\xd0\x47\xdd\x3c\x7e\x32\x1e\xcc\xc3\x80\xb9\x84\xf7"
+ "\xe7\xd4\xf9\xa8\xb7\x8a\x60\x5b\x3a\xae\x5e\x1f\xbf\x25\xbf\xa7"
+ "\x32\x61\x1b\x2d\xe1\x35\x6d\xde\x77\xe6\xd8\xd2\x90\xd7\x4a\x35"
+ "\xdf\xf8\xf9\x9f\xe4\xbe\x3a\x74\x0a\xef\x97\x34\x96\xc1\x4e\xb0"
+ "\x39\xb7\xb1\x7d\x13\xf5\x52\x39\xef\x6d\x6a\x17\xcf\x1c\xe0\xfd"
+ "\x68\x79\xb6\x50\xc6\x64\xff\x1d\x35\x5e\x20\x73\x3b\xbd\xc5\xdf"
+ "\xea\xb6\xf5\xd1\xf5\xe7\x77\x32\x0c\x51\x63\xf5\x5b\x4b\x4d\x95"
+ "\x0c\x43\xbb\x78\x36\xc7\x28\x07\xda\x0d\xe2\x72\xe0\x83\x1b\x65"
+ "\x39\xce\x2b\x63\xa2\xd8\xf2\x85\xcd\x5b\x2c\xeb\x54\xcf\xf3\x04"
+ "\xe4\x30\x7a\x31\x76\x00\xf7\x0b\x98\x4e\xb8\xe6\xc9\xb5\x5f\xcc"
+ "\xd7\x65\x2c\x1e\xdb\x62\x0a\x04\xff\xee\x97\xf8\xb0\x2f\x6e\x09"
+ "\x74\x96\xb4\x07\x7f\xfe\x74\xc3\x27\x64\x2e\x7e\x82\xfb\xef\x17"
+ "\x72\xdd\x1f\xfc\xb4\x4f\xe1\xf7\x8b\x01\x5d\x35\x0e\xea\xb2\x55"
+ "\x64\x87\x4d\x16\x3a\xe2\xe0\xb3\x03\x0d\xc1\x23\x8e\x4b\x98\x53"
+ "\xfc\xbc\x39\x68\xb6\xea\x67\x2d\x54\x39\xde\x27\x86\x9d\xda\x91"
+ "\xee\xb0\x79\xf0\xbe\xd3\xf0\xbb\x80\x4d\xda\xb1\x1d\xef\x40\xdb"
+ "\x26\xa6\x5b\x90\x0e\xe4\xb6\x16\xa9\xb3\x19\x78\x1e\xc8\xe7\xed"
+ "\x25\xad\x2b\x9e\xec\xb0\x6e\xf1\xf3\xf9\xcf\x1c\x6b\x34\xd7\xc4"
+ "\xfb\xc0\x7c\xee\x9f\x63\x21\xf0\xd9\x7f\x5e\xcb\xd3\xdf\x67\x27"
+ "\xbd\x1f\x6b\xbc\xef\xf6\xfe\x62\x99\x71\x66\x9f\x63\x2a\xb1\x8f"
+ "\x41\x4c\xf7\x15\x94\xb1\x86\xce\xab\x7d\x54\xf6\x15\xe4\x75\x44"
+ "\x3e\xf3\xc8\x7b\x9d\x28\x57\xdf\xeb\xbb\x29\xcf\xfa\xfc\x62\xbf"
+ "\xe1\x1b\x85\xfb\x43\xbd\x7e\x3d\xa0\x45\x97\xaf\xc2\x15\xb6\x35"
+ "\x04\xc3\x3e\x6f\x21\xde\x1d\x87\x3e\xec\x37\x16\x91\x9c\xfb\x71"
+ "\x4c\xe6\x67\xc8\xa4\x65\x3a\x0f\x71\x8c\x8e\x23\x61\xd2\xcf\x39"
+ "\x1f\xbc\x43\x3f\x13\x9f\x7e\x96\x7e\xf1\xcf\xbe\x3d\xc7\x98\xbe"
+ "\x5e\x76\x30\x5f\xd9\x6b\x07\xf3\xe5\x7a\x59\x4d\x85\xed\xf5\x8d"
+ "\x11\xd3\x81\x8d\x41\x93\x3a\xfb\x70\x70\x5e\x90\x0e\x6f\x35\xfc"
+ "\x56\x90\xcf\xd6\x5f\xec\x35\xe1\x1b\xb3\x4d\xc1\x7c\x5b\xae\x27"
+ "\xf6\xcd\x7f\xde\x96\xbe\x41\xbc\x3f\xa8\xf1\x58\x99\xf9\x98\x53"
+ "\xfa\x60\x14\x9f\xe7\x75\xb3\x81\x6a\x2e\xf6\xb6\xfe\x2d\x29\xe9"
+ "\xeb\x39\xec\x74\xe2\x73\x26\x3f\x2b\x9a\x1d\x0c\x1a\x6b\xf0\x3b"
+ "\x4c\x1a\xc7\xe5\x16\x9e\x3d\x22\x1c\x28\x0e\x13\xec\xb0\x50\x00"
+ "\x63\x2f\xea\x10\xc5\x6b\x38\x6e\xfe\xdb\xd7\x31\xed\x95\x4c\xbd"
+ "\xfd\xbc\xc4\xc9\x7b\x8f\xf0\xb0\xfd\x19\x62\x1f\x90\xf3\x84\x7c"
+ "\x76\xe4\x9b\xd2\x54\xda\xc9\x7e\x2c\xe5\x1c\xf3\xb0\x5d\xaf\x3b"
+ "\x64\x1f\xb3\xed\x2b\x19\xb4\xa4\xdb\xfb\x36\xec\xff\xe7\x72\xaf"
+ "\x5e\xce\xdf\x5e\x70\x25\x5b\x44\x8d\x8d\xb9\xd4\xdf\x7c\x86\xe7"
+ "\xab\xe3\x51\xff\x6c\xc1\xf8\xff\x72\x4a\xd4\x14\xa1\x1e\xd3\x20"
+ "\xf1\xd5\x72\x37\xf4\xc0\x20\x11\xdb\x88\xfe\xea\x72\xc0\xde\x6d"
+ "\xa6\xd6\x68\x93\xf4\x11\x81\x0c\x5b\xcb\xc2\xe2\x7c\x20\x7a\x50"
+ "\xfa\xf7\xaa\x73\xf0\xbf\xbc\x33\x10\x7d\x8f\x5a\x8b\x43\xe4\x5f"
+ "\xf3\x47\x8c\x59\xbf\x1c\xcd\x78\x8d\x2f\x2e\xa7\x71\x67\xf9\xfd"
+ "\xdb\xed\x6a\x9c\xfc\x65\xae\x7e\xb5\x71\x6c\xcc\x78\x9c\xee\x7b"
+ "\x66\xd5\xe3\x25\x2b\x57\xaf\x1a\x37\x6b\xf9\xba\xe5\x45\xce\x87"
+ "\x94\xcb\x5d\xc2\xf8\x65\xe9\x8b\xff\xfd\x4e\x06\x8f\x29\x6c\xab"
+ "\x70\x1c\xf0\x2b\xc5\x00\x37\xe2\x7f\xc3\x6e\x18\xc5\xeb\x7b\xff"
+ "\x9b\x31\xc0\x0d\x5b\x84\xe3\x7f\xf7\xad\x75\xbf\xd3\xdc\x2b\x03"
+ "\xda\xfb\xdd\xfc\xcc\x67\x3f\x35\xef\x2f\x67\xb1\x1c\x35\x48\xff"
+ "\xb4\x77\xa6\xc5\xc7\x4a\x62\x5f\x3c\x5e\x1f\x41\x7a\xbe\x71\xce"
+ "\x16\xbc\x88\x71\xe3\x9d\xa2\xbe\x73\x3f\xef\xb8\xd1\xdf\x87\x94"
+ "\xfc\xca\xbc\x95\xc6\x9e\xb0\xfe\xdd\x35\xb9\x87\xad\x79\x7b\x72"
+ "\xd5\x3a\xcc\x3b\xdb\x1b\xb4\x41\x16\xb5\x07\xf0\xce\x41\xe3\x4c"
+ "\x99\x92\xcd\xf7\x75\xd9\x7c\xa7\xf9\x4a\xfb\xf6\x7d\xb2\x71\xc8"
+ "\xd2\x27\xd7\x7f\xd5\xcb\x1e\xb2\x7c\xd6\x9e\xbf\x6e\x0f\x5f\x77"
+ "\x9a\xfe\xfd\x46\x5e\x9b\xc1\xfd\x97\x71\x3f\x40\x8e\xb5\xd2\xbf"
+ "\xfe\xdd\x8f\xf5\x7b\xd4\xf1\xee\x6f\xf5\xfb\x2f\xe2\xfe\x2d\xfd"
+ "\xfe\x06\xdc\xbf\xaa\xdf\x43\x66\xdf\xdd\xa2\xdf\x67\xe1\x7e\xa5"
+ "\x7e\x0f\x9d\xff\xee\x83\xfa\xfd\x70\xdc\xdf\xa9\xdf\x7f\x01\xf7"
+ "\x23\xf5\x7b\xc8\xe0\xbb\xd7\xe8\xfb\xa7\x16\xe0\x7e\xe1\xea\xed"
+ "\xf3\x43\x7e\xb5\x47\xf7\x2e\xc1\x16\xda\xab\xc6\x8c\xde\xb4\x2c"
+ "\xf0\xf4\x32\x83\xbe\x48\xe7\x98\x81\x16\xa4\x8f\x0d\xd2\x1b\xed"
+ "\x71\xe9\xfb\xf4\xfc\xd3\x30\xde\x04\xe3\xd2\xeb\xf5\xf4\x7c\xd8"
+ "\xa0\x96\xb8\x74\x9f\x9e\x5e\x02\xbd\x58\x18\x97\xae\xc7\x75\x78"
+ "\x77\x5b\x90\xf6\x38\xe2\xd2\xdd\x7a\xfa\x5e\xc3\x5f\x41\x4f\x2f"
+ "\xd2\xd3\x0f\x23\xfd\x68\x5c\xfa\x12\x3d\x1d\xfa\xff\x9d\xb6\xb8"
+ "\x74\xb5\xae\x20\xcf\xa2\x59\xc5\x91\x52\x96\xad\x77\x23\x41\xda"
+ "\x7d\x28\x2e\xcf\x0c\x55\xf6\xdf\x6d\x41\xaa\x8f\x6f\xcb\x24\x3d"
+ "\xdd\x15\xa4\x7f\xec\x89\x4b\xcf\xee\x4f\x57\xa5\xd5\xd1\x92\xfe"
+ "\xd6\x30\xf9\x3b\x55\xd2\x4f\x52\xda\x96\xbf\x5a\xce\xe7\xd4\xac"
+ "\xbb\xc5\x49\x67\x99\x10\x27\xe9\x57\xb3\x74\xff\xc0\x52\xf6\xd7"
+ "\x52\xe7\xfd\x7e\x35\x51\x9e\x01\x63\x9f\x73\x3e\x03\xb8\x91\xd3"
+ "\xfe\x5d\xc6\x3e\x99\xe0\x2e\x57\x31\x39\x95\xff\x69\xa7\x9c\xcb"
+ "\xeb\xfb\x9c\xc8\xf3\x31\xaf\x6d\x32\x1c\x5e\xef\x0b\x94\x5c\x92"
+ "\x3e\x91\x3c\x97\xe2\x34\x9e\xd3\xca\x73\x61\x71\x73\x2a\xa5\xf7"
+ "\x7f\xb5\x5c\xe3\x73\xfb\x5e\x35\xef\x67\x59\xe4\xfc\xec\x9b\x13"
+ "\x9f\x37\x48\xbf\x92\x73\xd3\x74\x87\xfd\xff\x74\x7b\x7f\x35\xad"
+ "\xef\xac\xd2\xbf\xd7\xeb\xe9\x7f\x42\x7a\x7e\x5c\x7a\x65\xff\xba"
+ "\x1d\xfa\xce\x66\xb3\xf4\x5c\x14\xe1\xe8\x45\x11\xd9\xf1\x17\xe0"
+ "\xbd\x42\x9e\xbb\xf9\x52\xcc\x67\x73\xe8\x31\x30\x3e\x8e\xae\x13"
+ "\x21\xe8\x6c\xfe\xc6\xc4\xb5\x73\xc2\x21\x9a\x53\xdc\x2d\xb6\x3f"
+ "\xc6\x7e\x76\x17\x64\x3c\x28\x4f\x27\xc7\xdf\x66\xdf\xad\x30\xef"
+ "\x0f\x65\xb4\x62\x8c\x6b\x58\xc1\xef\x3f\xa2\xd9\x85\x21\x6a\x29"
+ "\x8c\x51\x03\x60\xef\x7e\xcc\xf0\x9b\xfc\x55\x6f\xfc\x1f\xc6\x81"
+ "\xeb\xf3\xc8\x6f\xc5\x1c\x1e\xc7\xb8\xf2\xb7\xf0\x44\xf5\x6b\x36"
+ "\xf1\x1b\xb6\x65\xbd\xd9\xd6\x2d\x84\x39\xd5\xe1\x1c\xdc\x3b\xd5"
+ "\x0f\xef\x90\xde\x5f\x9b\x94\x2c\x1f\xd6\xfd\x31\x6d\x95\x4a\x5f"
+ "\x1c\x2e\x11\xff\xc6\xe7\x8e\x0e\xf3\xf9\x27\x0b\xec\xe6\x94\xfe"
+ "\x57\x9b\x77\x93\xa9\xa7\x06\xb6\xc9\xd9\x43\x26\xa5\x9f\xde\x5b"
+ "\xa6\x99\x2c\x5b\x78\x5d\x51\x7e\x27\xa2\xc6\x79\x74\xff\xaa\x88"
+ "\xa9\x65\x63\x3b\x6d\xfa\x02\x39\xf2\x23\xec\x4b\x7e\xf8\x93\xa1"
+ "\x25\x1c\x5b\xb4\xc2\x06\x3b\xd4\xf4\x0b\xbc\xff\xf5\xaa\x43\xa6"
+ "\xa8\xb4\x57\xde\x5b\x26\xd7\xa2\x7c\xce\x7a\x1e\x43\x02\x6d\x31"
+ "\x3e\x7b\x24\xed\x64\xe8\x7f\x4b\x6c\x7d\x61\x66\x74\x6d\xe1\xb5"
+ "\xbb\xd7\x50\x46\x6c\xad\x2b\xeb\xc5\x8b\x94\x63\x8c\x3f\x98\xc3"
+ "\x66\x8b\x6e\xc7\xe0\x2a\x8c\x29\x3c\xc7\x1d\x9a\x66\x93\x7b\x6e"
+ "\x7c\xaf\x99\x5e\x1f\xd5\xb0\xee\xca\xdf\xbc\x89\x61\x6e\xcb\xb1"
+ "\xa7\x19\x97\x54\x6d\xdd\xb6\x13\xf3\x65\xfd\x9c\x6c\xd9\x27\x34"
+ "\x1c\xf3\x16\xd3\xd0\x0b\xc2\x7f\xba\x88\x4c\xfc\x9d\x90\xb2\xe5"
+ "\x72\x1d\x69\x40\x4b\x61\x94\x02\xee\x3f\x53\xd9\x1a\xee\xa3\xf7"
+ "\xde\x65\x3b\x8d\xfd\x26\x91\xdf\x76\x9a\xde\xfb\xad\x35\x82\x31"
+ "\x23\x02\x5b\xfa\x09\x9e\x13\xbe\xf7\x51\x58\xc6\xbe\xfd\xb5\x93"
+ "\x7d\xc7\xfd\x6b\xee\xe5\xb4\x4f\x3d\x9f\x48\x1f\x89\x72\x25\x5b"
+ "\xef\x1d\xe7\x67\x0f\x9f\xdb\xcd\x1c\xdd\xf4\xb3\x4b\x91\x01\x6a"
+ "\xad\xe2\xff\x63\xef\x7b\xe0\x9a\xb8\xb2\xfd\x6f\x02\x5a\x6a\x51"
+ "\x02\x8d\x94\x2a\x6d\x63\xd7\x3f\xa9\xff\x4a\xf7\xd9\xb7\x6e\xab"
+ "\x5b\x6a\x75\xd7\xf6\xf9\xaf\x5d\xed\xc6\xfa\x0f\x2d\x6c\xd1\xf5"
+ "\x4f\x44\x44\x44\x04\x8c\x96\x47\xbb\x8a\xd1\xa2\x8b\x16\x11\xf7"
+ "\xe9\x2e\xed\xfa\x87\xdd\x67\xdf\xd2\xae\xd5\xd8\x62\x0b\x16\x08"
+ "\xb5\xd8\xa2\x05\x9b\x52\xb4\xc8\xa2\x8d\x10\x25\x60\x32\xf3\x3b"
+ "\xe7\xde\x99\x4c\x26\x24\x60\xac\xd6\xee\xef\x3d\x3e\x1f\x3e\x93"
+ "\x3b\x73\xe7\xce\x9d\x7b\xce\xfd\xde\x73\xce\x9c\x7b\xce\xfb\xa7"
+ "\x85\xf5\x81\x30\xfd\xeb\xfd\x6a\x5f\xbc\xcb\x19\xd5\x5a\x1e\x63"
+ "\xa3\xe7\x39\xc8\x14\x1b\x6f\xa1\xdf\x33\x31\x5e\x41\xf2\x53\x26"
+ "\xfe\x9a\x91\xb0\x3d\x76\x47\x77\x70\x5b\xd4\x5a\x16\xaf\xf2\xe8"
+ "\x16\xc2\x7c\x91\x60\x8d\x54\x8f\x66\xb6\x5c\xf5\x44\x66\xdb\x54"
+ "\xeb\xd6\xf7\x43\x5f\xe5\xa3\xb9\xad\xa1\xea\x78\x38\x2e\x6e\x0d"
+ "\x1b\x3a\xcd\xf7\x7a\x14\xaa\xd3\x3c\x48\xd4\x68\x53\x47\xbf\xe3"
+ "\xdd\xcc\xdf\x18\x9e\x71\x2c\x8f\xdf\x42\xaf\x3d\x54\xaf\x27\x01"
+ "\x4c\xdf\x3b\x7a\xf1\xd1\x3c\xa2\x81\xbe\xf6\xe6\x55\xea\x20\xea"
+ "\xe3\x65\x54\x47\x98\x9b\x79\x13\xfa\x16\xb2\x6f\x1f\xc7\x0a\xf9"
+ "\x50\x75\x10\xab\x7f\xec\xe7\x95\xcd\xf0\x0e\xaa\x7b\x6b\xcc\xf6"
+ "\x4b\x82\x4c\x78\x0c\x78\xff\xde\x1a\xde\x78\x6f\x23\xdb\xff\x7e"
+ "\xec\x35\x11\x57\x19\x8f\x1e\x5b\xcb\xc6\x2d\x54\xc7\xc6\xed\x58"
+ "\xa1\xb0\x5e\x3d\x84\xbf\x61\xed\x8e\x62\xdf\xea\x8f\x25\x8a\x32"
+ "\xb2\x45\xa8\x83\xf7\xc0\x6f\x1d\xc3\xda\x63\x39\xf0\xee\xc2\x1e"
+ "\x86\x63\xf4\x7b\x21\xbc\x1f\xac\x59\x47\xab\xf0\xbd\x7c\x61\x2b"
+ "\x1d\x8b\x54\x12\x00\x7d\xc6\x3d\xfa\xe8\x8b\x6c\x33\xdb\x9e\x32"
+ "\xb1\x5c\x96\xc7\x1f\xa3\xfb\x80\xe1\x39\x40\x1f\x25\xe2\x26\xee"
+ "\x5b\xc6\xf6\xa4\xfe\x9b\xfa\x8a\x7d\xc1\xe7\xe1\x35\x78\x57\xcc"
+ "\x89\x07\x63\x75\x2f\xd5\xad\x91\xae\x17\xf4\x68\xe3\xb8\x0a\x63"
+ "\x86\xfe\x42\xc7\xa3\x71\x4c\xd8\x98\x1d\x77\xe5\x3c\x67\xe3\x75"
+ "\x3c\x54\x3e\x1e\xac\xcc\xa9\x00\x1b\x12\xd0\x6f\xe4\x78\xb4\x30"
+ "\x7e\xcd\xc2\xf3\x69\x1e\x4e\x76\xcd\xb4\xcf\xed\xde\x07\x5c\x75"
+ "\x59\xde\x54\x25\x7e\x83\x45\x9b\x3c\xe3\x57\x53\x95\xdb\x7d\x55"
+ "\xf3\xae\xa0\x8c\x1c\x52\x83\x79\x2e\x71\xcc\xdb\x0c\xa6\x06\x69"
+ "\xbc\x59\x3b\x5e\x9e\xf1\xa0\xf8\x0c\x0b\x31\xed\x15\xfb\x09\xbf"
+ "\x85\x35\xf8\xb8\x56\xa2\x89\x69\xa2\x78\x5f\x3e\xdd\x4b\x74\xcc"
+ "\x86\x7b\x20\xbd\xe2\x20\x7e\xfb\x81\x51\xa9\x74\x3c\x65\xa2\xfc"
+ "\x48\x8e\x17\xa0\x4f\x2c\x8c\xab\x9d\xf1\xd0\xf1\x0d\x6c\x2d\x3c"
+ "\x5e\x80\x6d\xe2\x77\x15\x16\xef\xf4\x78\x2e\xb4\x2b\xe4\xea\x3e"
+ "\xbe\x5f\xe8\x03\xe8\x7f\x47\xf7\x7a\xea\x75\xe3\xe6\xc7\xd2\xcd"
+ "\xbe\x23\x56\xea\x3d\xf7\x15\x05\x49\xfb\x3a\x8f\x37\xba\xed\x8b"
+ "\x2d\x62\xe3\xfd\xc1\x28\xd0\x53\x0f\x67\xb3\xb8\xb8\xc5\xd9\x40"
+ "\xb3\xf4\xab\xa4\x1f\xe6\x87\x49\xd3\xf3\x4d\x95\x7a\xd0\xad\x55"
+ "\x1a\xcc\x6f\xd4\x98\x76\x95\xf4\x42\x9f\x0b\xc4\x1b\xb4\xf7\xf0"
+ "\xa1\x70\x7e\x8b\xa6\x51\xda\x7b\x57\x62\x01\xdd\xb6\x70\x13\xe8"
+ "\xb2\xe9\x97\x48\x3f\xe6\x43\xf1\xc1\x72\xc1\xee\xb3\x93\x33\x6a"
+ "\x9a\x71\x5f\x67\x25\x68\x84\x7c\x7a\xfc\x4e\x6e\x8b\x06\x78\x51"
+ "\xe3\x48\x5f\x42\xc2\x70\x7d\x43\x5f\x5d\xc6\x33\x25\x26\x68\x17"
+ "\xf7\xeb\x16\x70\xbc\x4e\xc1\xab\x06\x44\x73\xaa\xc1\x59\x9b\x38"
+ "\x42\x7d\xc4\x81\xcf\x94\xf5\xe4\x83\xe3\x7c\xe8\x80\x68\xcc\x5b"
+ "\x89\x36\x1f\xb3\x1d\xfa\xb9\x65\x40\x34\x5c\xeb\x03\xd7\xd0\xde"
+ "\xc3\x61\xfc\x35\x8c\xe7\x0e\xed\xd3\xf5\x93\x37\x0e\x88\x66\x7d"
+ "\xb7\xd2\xba\xf5\xe4\xc3\x01\x58\x47\x8c\xeb\xc6\xa5\xeb\x02\xf0"
+ "\x3a\xee\x13\x76\x62\x5e\x04\x90\xce\xd9\x3d\x35\xae\x7b\x04\xf9"
+ "\x19\xe6\x72\xc9\xbb\xfc\xd6\xa1\xf1\x50\xb7\x18\x7d\x52\x99\x2c"
+ "\x5b\x72\x58\x98\xeb\x20\x1f\x97\xbc\x23\xfc\x0e\x76\xd5\x4d\xd7"
+ "\x91\xb4\x76\x12\x41\xbf\xab\xae\x0a\x00\xec\x2d\x09\xc6\x1c\x0b"
+ "\x6e\x6d\x7e\x8d\xed\x6d\xc4\x78\x71\x71\x24\x18\x70\xf9\x1e\xe8"
+ "\x37\xe6\x47\xf9\x1a\x6d\xb5\xc2\xd8\x58\x80\x4e\x45\x9b\x59\x4c"
+ "\xc0\xc3\x9b\x80\xf7\xd3\xd6\x82\x3c\xb0\x96\x04\xaf\x75\x92\x48"
+ "\x7c\x4f\xa0\x5b\x23\xfa\x55\xa3\xee\x86\x63\xc3\x68\x38\x60\x36"
+ "\xbc\x4b\xec\xda\x78\xbe\x61\x6d\x33\xdf\x58\x11\x5f\x43\x60\x9d"
+ "\x09\xab\xd4\x57\x61\x6c\xf2\xaf\xf1\x5d\xd1\x46\x09\x63\x0a\xf2"
+ "\x0a\x3c\x63\xcb\x80\x58\xdc\x2b\x43\xed\x04\xca\xe3\xc5\xe2\xbe"
+ "\xa2\x7c\xba\xf7\xa8\x24\xca\x65\xfb\x4a\xe2\x4b\x84\xbe\x94\x72"
+ "\xf8\x3b\x89\xee\x4f\xec\x85\xfa\x0f\xda\x34\xe6\xad\x2e\x70\xed"
+ "\xd1\x60\xb6\x81\x92\xc5\x6e\x71\xb9\xe8\xbd\x68\x23\xc0\x7b\xa7"
+ "\x3a\xf8\xab\x9b\x85\xba\x78\xef\xd4\xd5\xf3\x78\xbc\x17\xee\x29"
+ "\x70\xdd\x23\xdb\xe3\xf3\x21\x93\x2b\x60\x6c\xf1\xb7\x15\xc6\x52"
+ "\xf0\xa1\xd2\xb0\xef\xdf\x25\x35\xe2\x37\x67\x0b\xf9\xc0\x88\xfc"
+ "\xe4\x3d\x9e\xf8\x09\x22\x8f\x91\x74\xa2\x0a\xe3\x37\xc1\xf9\x08"
+ "\x31\x96\x11\xfc\x1e\x08\x6d\x31\x39\xdb\x2d\x46\x59\xb6\x5b\xbc"
+ "\xc3\x74\x2b\xff\x0d\xf2\x09\xe0\x4a\x40\x13\x39\xa1\xe7\xb7\x0c"
+ "\xce\x62\xfb\xa4\x4e\x1c\xc7\x7e\xd6\x93\x13\xb8\x17\x3d\x84\xc5"
+ "\x52\x38\xb1\x4e\xc0\x8f\xe4\xa9\x4e\x47\x88\x05\x9e\x89\x7b\x7e"
+ "\xdc\xca\xc9\x80\x27\x2a\xa8\xf7\x57\x16\x0f\xf0\x84\xde\xa3\x3e"
+ "\x5e\xcf\xf0\x28\x47\x7b\x94\x35\x36\x98\x37\xbe\xbe\xad\x6f\xea"
+ "\x47\xed\x87\x79\x7d\xd6\x11\x7d\xfa\x45\x12\x00\xbc\x72\x1e\xfb"
+ "\x56\xd9\xd8\x8c\xef\x14\xc2\x1b\xa2\x08\xda\x40\xa9\x6c\x09\x6b"
+ "\x7a\xfd\x40\xa8\x73\x91\x84\xa3\xdf\x37\xe6\x48\x81\xfa\x4d\x2c"
+ "\x8e\xf9\xc7\x33\x67\xaf\xec\x45\xb8\x57\x74\xf7\xf0\xca\xe7\x73"
+ "\xf1\xdb\xde\x81\x0e\x4b\x0f\xfc\xce\x95\xb6\x03\x78\xd2\x49\xc2"
+ "\x81\xc7\x1a\x30\x1f\x1d\xdc\xd3\xfc\x5f\x1d\x8d\x3d\xcc\x8e\xb3"
+ "\x44\xbf\x88\x28\x9b\xc8\xc7\x93\x02\x53\x49\xe0\xe6\x0b\x44\x05"
+ "\x74\x75\x7c\xe8\x18\x4d\xc4\x58\x08\x79\x61\x6c\x1f\x77\x1e\xe0"
+ "\xeb\x8a\x08\xde\xde\x66\xf8\xa8\x10\x74\xaf\x1c\x51\xc7\xde\xc8"
+ "\xf2\xa0\x04\xc2\xf3\xfb\x2a\x85\xb8\x0f\x6c\x6c\x3f\x3a\xcf\xf6"
+ "\x59\xa9\x5f\x81\x7b\x6a\x25\xf9\xfb\x63\x96\x6b\xdc\x38\x78\x3f"
+ "\xc3\xbe\x8f\xe3\x3f\x04\x09\x7e\x03\xf3\x51\x50\xb7\x19\x3e\x0e"
+ "\x72\xf9\x28\x50\xbb\xd5\xc7\xf1\x40\xc3\xfd\x4c\x36\x1f\xbc\x7f"
+ "\x9e\x33\x48\x98\x83\x78\x3e\xa4\x06\xef\x85\xfb\x42\x6c\xd4\xc6"
+ "\xf4\xf1\x78\x89\xd7\x3e\x0e\x46\xcc\x87\x77\x0a\xb6\x90\x8f\x32"
+ "\xf0\xbd\x70\x4c\xa0\x5e\x20\x94\x37\x7c\xb8\xd7\x47\x5c\x58\x95"
+ "\x2a\xcb\x41\x6d\x20\xeb\x83\x80\x9f\x2e\x01\x0d\xee\xc5\xd8\x4f"
+ "\x66\x78\x4e\x45\x7e\x07\xa9\x88\x68\x25\x95\xf0\x1b\x7d\x91\x4d"
+ "\x8b\xbe\x21\x0d\x1a\xef\xeb\x0d\x07\x7a\x04\xc8\xda\x11\xd8\x16"
+ "\x62\x01\xfa\x6f\x99\x53\x61\xfd\xb1\x42\x5b\x0d\x84\xb6\x51\xc1"
+ "\x35\x92\x8a\x64\xd4\xb3\xf6\xa8\x2a\xf3\xcf\x92\xca\x88\xcf\xe8"
+ "\x73\x50\x26\x34\x25\xb4\x76\xd5\xb6\x16\xda\x1e\x2d\xb4\xdd\x0c"
+ "\x6d\xab\x7d\xb7\x6d\x88\xf2\xb3\x6d\x3f\xfa\x6d\xd0\xf8\xd3\x36"
+ "\xac\x33\x1b\x31\xcf\x0d\xee\xeb\x4a\xbb\x9f\xf4\x76\x5e\xc3\xb8"
+ "\x9f\x0f\xf1\xcc\x1f\xb6\x6c\x2c\xdd\xfb\x65\xa0\xfe\xc6\x59\x74"
+ "\x0f\xd8\x65\x42\x7d\x1a\xd9\xbe\xaf\xf3\x04\xfd\x21\xda\x0c\x65"
+ "\x5a\x49\x57\x72\x7d\xa7\x02\x59\xb5\x6c\x12\xf3\x7b\xd4\x64\x31"
+ "\xbe\x2a\xc3\xb8\x91\x3e\xf4\xbc\x01\x87\x99\xff\x6c\xd9\xab\xa2"
+ "\xfd\xa5\x35\x74\xc0\x61\xa1\x2d\x8d\xa7\x5d\x4f\x4c\x48\x1b\x97"
+ "\x9c\x28\xe6\xb6\x4d\x14\xb6\x9f\xbe\x10\xf7\x72\xdc\xc2\xa4\xb8"
+ "\x58\xcd\xf4\x95\x09\x4b\x47\x2c\xfb\xed\x6f\x35\x93\xe3\x56\xac"
+ "\x98\xff\x4a\x5c\x2f\x32\x3d\x61\xfe\xd2\x15\x0b\xd1\xf6\xa6\xd1"
+ "\x8c\xff\xb7\x79\xf1\xcb\x12\x47\xfc\x62\x7c\x94\x87\xed\x0d\xf7"
+ "\x2a\xd6\xa2\x0c\x0e\x6b\x47\x78\x9a\x93\x84\x62\x1c\x9f\x90\xd5"
+ "\xbc\x69\x0d\xe8\x7f\xc0\x7f\x4d\xb8\x4e\xe1\xda\x80\xba\x01\xc6"
+ "\x10\x04\xfc\x2e\x7f\x73\x3b\x5f\x75\x81\x7c\xe9\x04\xb9\xb2\x66"
+ "\x37\x8b\x87\x57\x0b\x3a\xb9\x95\xe5\x5b\xfc\xf2\x0c\xc6\xba\xfb"
+ "\x3d\x9c\xb3\x86\x0e\xde\xbf\xf9\x1c\x09\x84\x75\x0d\xf4\x92\x93"
+ "\xb9\xbc\xf2\x2e\x7e\x63\x38\x5f\xc2\x7f\x13\x41\x84\x18\xe2\x4a"
+ "\xb3\xc5\x8e\xdf\xf3\x83\xa6\x3a\xd2\x79\xc4\x53\x36\xb7\x4e\xee"
+ "\x60\xe3\xa2\xd6\x32\xbf\xe2\x2f\xdf\x45\x1d\x66\x3d\xcd\x87\x79"
+ "\x12\xe6\xff\xfb\x7a\x09\xa7\x3f\x2b\x11\x64\x47\x8c\x4d\xb8\xaa"
+ "\x1e\xca\x2c\xce\xc8\xc9\x6a\xb9\xaf\x46\x39\xac\xcb\x5f\x34\xb2"
+ "\x7f\xbc\xa7\x26\x88\xfd\xe3\x6f\xf7\xff\x2f\xf3\xd8\xbf\xe7\xf9"
+ "\xef\xfb\x2f\x3e\xff\x66\xef\xaf\x4e\xed\xfa\xff\x46\x9e\x8f\xc7"
+ "\x3b\xf9\xfe\xdf\xe7\xfe\xea\x0d\x5d\xfd\x23\xbf\x01\x6f\xd5\xfe"
+ "\xfe\x1c\x09\x02\xfe\xcc\xd9\xb4\x00\x78\xba\x8e\x44\xa4\x3a\xf8"
+ "\x86\xf4\x39\x24\x32\xed\x22\xc1\x7c\x84\x8d\x89\xc9\x7c\x43\xda"
+ "\x35\x94\x49\xab\x67\x00\xff\x16\x67\xd7\x93\xe0\x4d\xf5\x44\x55"
+ "\x99\x88\xb9\x8a\x31\xd6\x17\xe0\x4c\x33\xfc\x43\xb9\x3c\xc9\x4e"
+ "\x3e\xb1\x5e\x41\xff\x26\x53\x65\x0c\xe0\x4e\x2d\x21\xc8\xbf\xc1"
+ "\x31\x44\x9d\x17\xce\x1f\xe1\x0d\xcb\x60\x3d\x5b\x86\x79\x09\xab"
+ "\x0f\x71\xd1\x3d\x0e\xa5\x94\xf6\xd0\x2c\xc0\x35\xbe\x62\xa6\xc0"
+ "\x9b\x27\xd8\x9e\xa2\xcf\xe8\x7e\x06\x98\x27\xd5\xcc\xae\x5e\xfd"
+ "\x34\x5b\xcf\xab\x43\x05\x7b\x13\xfc\xfe\x8c\xca\x8a\xf0\x1e\xc5"
+ "\x98\xbf\x15\xdb\x3c\xc8\x15\xd3\xfc\xad\x87\x52\xa2\x7b\xa4\xce"
+ "\x27\xca\x4a\x4b\x13\xc1\xdc\x4e\x98\x0b\x14\xe6\xdd\x7e\x98\x67"
+ "\x45\xbb\xc2\x79\x23\xf4\x6f\x63\x7e\x38\x9f\x05\x7d\x2a\x6c\x33"
+ "\x54\x94\xc2\xda\x73\x44\xf8\xee\x62\x82\x79\xb1\x7f\x13\xd4\x99"
+ "\xba\x92\x3c\xb4\x09\xea\x65\x43\x3d\x94\x93\x59\xff\x3e\xdd\x04"
+ "\x63\x70\x18\x9e\x59\xa5\x99\x8b\x65\x33\xf5\xbd\xc1\x67\xc3\x7b"
+ "\x68\xea\x89\x39\x02\xd6\xb6\x40\x7c\x86\xf8\xdc\x36\x43\x25\xe0"
+ "\x5f\x69\x22\xfd\x76\x06\xe7\x59\x3b\x95\xd3\xd9\x7c\x1d\x80\xb1"
+ "\x01\xc4\xfc\xba\xc1\x9b\x52\x60\x4d\xef\xa0\x31\x30\x73\xd0\xde"
+ "\x82\x32\x06\x95\x2b\x9c\x24\x84\xd9\x07\x40\xb6\x88\x07\x1c\x00"
+ "\x79\x82\xfa\x42\x83\x2c\x01\x7d\xc9\xc1\x3c\x8f\x78\x1d\xf4\xb6"
+ "\xc3\xb0\x2e\x17\xa1\x1c\x30\xf7\xea\x73\x04\x6d\xec\x98\xa3\x75"
+ "\xc5\x6c\xde\xce\x72\xe6\x54\x1e\x16\x65\x01\xc4\x20\x5c\xff\x41"
+ "\x16\x0e\xbc\x0e\x34\x04\x1e\x28\x05\xd9\x22\xb4\x89\xae\x1c\x74"
+ "\xec\x4b\xe9\x9a\x9f\x44\x63\x36\x07\x30\x8c\xae\x74\xc2\xfb\x05"
+ "\xc3\x33\x60\xcc\x6a\xa9\x2d\x9c\x61\x8c\x39\x58\x5c\xc7\x51\xe7"
+ "\xb5\x40\x1b\x3c\x60\x99\x70\x0d\xde\xff\x84\x98\xeb\x0e\xe4\x8a"
+ "\xca\x23\xc2\x98\x95\xb3\x6f\xc8\x66\xaa\xfb\x83\xcc\xb5\x5f\x18"
+ "\x9b\x52\x94\x2b\x84\x7b\x5d\xfe\x8f\xa8\x97\x73\x20\x57\xe0\x78"
+ "\xe1\x38\x41\x3b\xa5\x02\x8e\x55\x33\xf9\xe5\xd3\x95\xc2\x77\x4b"
+ "\x23\xd0\x7a\x83\x34\xfe\xe6\x42\xf7\xf1\x87\xfb\x05\xbd\xf1\xd3"
+ "\x01\x6e\xb4\x03\xdd\xa8\xca\x8e\x76\x52\xe8\xe3\x11\x66\xe3\x31"
+ "\x7f\x8d\xb1\xd2\x30\x36\x33\x8c\xf1\x91\x8d\x18\x07\x18\xb0\x79"
+ "\xfd\x39\x82\xdf\xbe\x41\x7e\xaa\xfa\x9a\xc9\xa7\x55\x19\xc8\xc3"
+ "\x50\xa6\x76\xf8\x06\xe8\x17\xb6\x07\xe5\xe7\xe1\x08\x72\x6c\xd5"
+ "\xb3\xee\xf9\x94\xa5\x5c\xca\x55\xd1\xd2\x7e\x04\xf3\x62\xa6\x3f"
+ "\x9b\x17\xa3\x0d\x8c\xd6\xbf\x1e\x8f\x7d\xab\xc5\x79\x29\xbe\x2b"
+ "\xe6\x55\x86\xf3\x28\xfb\xd7\x22\xdd\xc4\xf3\x18\x43\x18\xe8\x14"
+ "\x0c\xcf\x3a\x23\xf4\xe9\x30\x94\x83\xa0\x3c\x90\xda\xf7\xaf\xd3"
+ "\xfd\xe6\xb5\x9b\xd2\xa4\x7b\x70\xde\x00\x0f\x87\x40\x9d\x4f\xe1"
+ "\xc8\x8b\x75\x59\xee\xe5\x2a\xdd\x1b\x1d\x68\x03\xab\xd2\x8b\xb9"
+ "\x97\x31\xef\x32\x62\xc6\xa6\xb9\xb2\xb1\xc7\xb1\x41\x3a\x53\xbe"
+ "\xfb\xd0\x51\x0c\xe3\xfd\x29\xc8\xff\xef\xe9\xd8\x7b\x55\xe9\x84"
+ "\xfe\x99\x58\xfc\x94\x32\x23\x8d\xf7\x4b\xf5\xa1\x4f\xa3\x5d\xfa"
+ "\x90\x4b\xb6\xac\xd2\x21\x4f\x42\x5b\xe5\x48\x7f\x94\x13\xa1\x5e"
+ "\xbc\x8b\xb7\xe8\x7e\xdf\xaa\x46\x94\x2f\x85\xfe\x23\xbf\x94\x09"
+ "\x63\x67\x74\x9f\x77\xee\xf3\x1c\xda\x00\xfd\xff\x63\x17\x0f\x88"
+ "\xf3\x9a\xf1\xc1\x29\x21\xf7\xd3\x7a\xcc\xbd\x56\x05\xed\x9a\x50"
+ "\x06\x67\xeb\xea\xa9\xc3\x1f\xd6\x3a\xd0\x86\x5e\x0d\x65\x98\xdf"
+ "\xa7\x8c\xad\x61\x43\xf5\x1b\x28\x6e\x9c\x82\xf1\x79\x94\xe6\x2a"
+ "\xc1\x71\x11\xe7\xeb\xe6\xb9\xa8\xfb\x45\xb1\x39\x9b\x0c\xdc\x60"
+ "\x6f\x26\x82\xaf\x3f\xcc\xd9\xf3\xf8\xed\xb4\x09\x78\x28\x08\xe7"
+ "\x2f\xd0\x17\xf9\x19\x31\xa7\x6a\xc3\x76\x3a\x6f\x83\x71\xde\x5e"
+ "\xc7\x18\x12\xf0\x9c\x92\x98\x68\xf2\x61\xb2\x89\xce\x63\x8c\x1f"
+ "\xf2\x26\x8c\x1d\xe6\x39\x86\x67\xa7\x8a\x3e\xca\xc8\x23\x18\x2f"
+ "\x44\xe0\x93\x12\x9c\xcb\xc2\xd8\x05\x42\xbd\xbd\xe2\xdc\x73\xa3"
+ "\x3f\xad\xe3\x31\xdf\x42\xd8\x7c\x3b\x55\x2d\x8e\xb5\x83\xce\xe3"
+ "\x2a\xbd\x03\xe6\xb1\xfb\x98\xe2\x78\xe2\xb8\xb6\x19\x3e\x83\xf7"
+ "\x2f\x8d\x10\xc7\x54\x1a\xcf\xcf\x96\x0b\x34\xaf\x62\x36\xa6\xcf"
+ "\x46\x09\xf6\x27\xd7\x18\x0a\xfc\x87\xeb\x40\xf1\x7a\x7c\x77\x58"
+ "\x1b\xf0\xf9\xc8\x23\x6f\x0a\x98\x55\x62\x45\x1e\xf9\x0c\xe6\xff"
+ "\xaf\xb5\x12\x76\x54\x25\x52\x9d\x05\xe8\xc4\xe8\xf3\xd9\x2e\x1a"
+ "\x6f\xc3\x0b\x76\x58\xc8\xa7\xb3\x25\x7c\xfa\x6c\xbf\x38\x0e\x22"
+ "\x4f\x8a\xf3\x1e\xda\x68\x97\xe3\xcf\x67\x75\xd0\x46\x18\xe2\x9b"
+ "\x24\x43\x7d\xd6\x2c\xc7\xb7\xcf\xaa\x11\xdf\x90\xaf\xf5\x49\x68"
+ "\x63\x63\xeb\x95\x85\x54\xa4\xca\x31\xa9\x62\x39\xf3\x0d\x60\x32"
+ "\x17\xf2\x96\x7e\x2e\xab\x8f\x6b\x18\xd4\xa7\xba\xb8\xb0\xe6\x95"
+ "\xe0\x1a\x07\xe7\xe2\x85\xf1\xaa\x85\xfa\x25\xb8\x6f\x12\x63\x25"
+ "\xdc\x53\xcb\x74\x3d\xc0\xe9\x23\x18\xbf\x1b\xea\x69\x2b\xe1\x69"
+ "\xd7\x33\x19\x76\x8b\x58\xc1\xbf\xac\xbb\x67\x55\x23\xb9\x5b\xff"
+ "\x0b\xfe\x9b\x0b\xe4\x34\xee\x67\xb5\x63\x0c\x49\x68\x5b\x73\x81"
+ "\x7c\xf1\x29\x3c\x57\x2d\x1c\x23\xe0\xf8\x2e\x1c\xef\x87\xe3\x1e"
+ "\x38\xf6\x87\xe3\x6b\x50\x9f\x13\xea\x47\x41\x79\x39\x9c\xff\x37"
+ "\xe1\x08\x7d\x3c\x8d\xf2\xe6\x34\x41\x76\xc4\xf3\x13\xb0\x0c\xc7"
+ "\xc7\x05\x9a\x97\x33\x9a\x9f\x1e\x01\xed\x24\x43\xff\x6b\xcc\xb5"
+ "\xb4\x2d\xfd\x05\xf2\xf9\x55\x6c\x1b\xf7\x31\xc3\xef\xb7\xdc\x64"
+ "\x50\x68\xe7\xf4\x69\x38\x8e\x82\xe3\x0e\x38\x26\xc2\x71\x89\x30"
+ "\x06\x55\x88\x0d\xb1\xc9\x74\xcc\xa9\x9e\xc0\x9e\xc7\xe6\x3c\xae"
+ "\xc3\x12\x76\x54\x96\xc6\xce\x66\xf4\xb6\x90\x53\x94\x0f\xa0\xee"
+ "\xd3\x58\x17\x8e\xcf\x08\xc7\x68\xe1\x38\x41\x38\xfe\x4a\x38\x8e"
+ "\x17\x8e\x13\x2d\xe4\xb4\x5e\x90\x31\x60\x5c\x4e\xd3\x7d\x86\x30"
+ "\xb7\x4b\xd8\x33\x3e\x37\xa2\x8e\x0c\x38\xfe\x38\xb4\x1f\xd0\x66"
+ "\xf8\x3c\x50\xb4\x8f\xa2\xcd\xe7\xba\xa1\xec\x2f\x6f\xd2\xef\xda"
+ "\x9f\x47\xba\x61\x5b\x6a\xb0\x22\x9a\x80\x0c\xd4\x37\x4f\xc9\x0b"
+ "\x71\xf5\x3e\x4f\x54\x0a\xdf\x85\x85\xdc\x00\x01\x18\x2f\x8f\xea"
+ "\x43\xa1\x3b\x93\x71\xae\x52\xdb\x31\xc6\x76\x0b\x1d\x9c\x01\xff"
+ "\x1b\x41\x37\x30\x8a\xf8\x8d\x7a\x0f\xd3\xd5\xef\xfa\x0c\x9e\x95"
+ "\x25\xe9\xea\x9f\x8f\x66\xdf\xd0\xee\x5b\x0e\xe7\x0b\xa4\xf3\xa7"
+ "\x71\x3f\xc0\xe3\x30\x9e\x35\xf0\x3e\xa3\xea\xc9\xe7\x18\xc3\xff"
+ "\xa7\x0d\xec\x9d\xa3\xc4\x77\x16\xe8\xa1\x17\xc7\xb7\x81\x9c\x4e"
+ "\x06\x2c\x4c\x40\x1e\xae\x77\xe1\xec\x69\x6a\xd7\x15\x78\x04\x68"
+ "\x79\xfa\x31\xa4\xa9\xdb\x1c\x74\xc7\x20\x75\x9b\xe1\x0b\xad\x1c"
+ "\x53\xcc\x5a\xc4\x14\xe4\x0d\xc0\x6f\xa4\x75\x90\xc7\xfc\xab\xc6"
+ "\xf9\xc7\xe6\xdd\x17\xb1\xf2\x7b\x3f\xab\x76\xb0\x79\x57\x03\x7c"
+ "\x06\xfc\x59\x8d\xf9\x21\x00\x87\xbe\x18\x2f\xcc\xe9\x1a\x98\xd3"
+ "\x8f\xc3\xf9\x2a\xd6\x57\x76\x5e\x78\x16\xf0\x59\x35\xbe\x77\x7f"
+ "\xf1\xbc\xf0\xbe\xd8\x0e\xc6\xfc\xbf\x5f\x3c\x2f\xb4\x0f\xfc\x58"
+ "\x5d\x8c\xf3\x44\x3c\x2f\xbc\x13\xc8\x51\x5f\x38\x44\x3c\xd9\xc8"
+ "\xf8\x6d\x83\x78\x1f\xd2\x0d\xe3\x63\x31\x1b\xff\x17\xb8\xb7\xa2"
+ "\x00\xd7\x87\xf5\x73\x49\xf0\xaa\x5c\xd2\x9b\xcd\xcb\x2f\x1a\xe5"
+ "\x18\x79\xb6\x8c\x37\x84\x38\x78\xd5\xe0\xe4\x0a\xc7\x28\x51\x5e"
+ "\xcd\x6b\x33\xd4\xc4\x8a\x79\xbe\xa5\x3c\x03\x35\x3b\x2a\x0a\x5c"
+ "\xe3\x0b\x7d\xa9\xc9\x12\xfb\xe2\xb6\x3e\x53\x1a\x60\xdf\xb0\xad"
+ "\xf5\x20\xaf\xdb\x00\x17\x18\x6e\xd7\x14\x5b\xc8\x3d\xa2\xbc\x4b"
+ "\xd7\xad\x10\x05\xd1\x67\x27\xd1\xef\xa3\x21\xb8\x36\xa2\x8f\x0f"
+ "\x87\x76\xac\x64\x27\xa9\xd4\x83\x2e\x9f\x7c\x9e\xcc\x5b\xdd\x0b"
+ "\x63\xaf\xe8\xa0\xaf\x07\xa0\x6f\x7b\x9d\x68\xfb\x5f\x8a\x7a\xea"
+ "\xd9\xf9\xce\x24\xde\x2e\x8c\x19\xcc\xa3\xb3\x13\x84\xb1\x45\xfc"
+ "\xda\x8b\x98\xbe\x3e\x8d\xe5\x0c\x42\x5b\x0e\xce\x8f\x37\x70\x1d"
+ "\x8b\xe0\xed\x25\x79\x38\x57\xce\x4c\x14\x65\x52\xe8\x6f\x01\x93"
+ "\x09\x4f\xed\xa3\xb1\x89\x8c\x83\x93\x99\x2d\xf0\xcc\x69\xf6\xee"
+ "\x67\x8e\xb0\xef\xdc\x34\x46\x26\x96\x0b\x03\x22\xc2\xbf\x60\x7e"
+ "\x59\x65\x1f\x31\x9f\x92\x33\xb9\x2e\x9f\x12\x49\x56\x34\xb1\xb8"
+ "\x51\x67\x0e\x4b\x73\xe2\xcc\x06\xbc\x0f\xee\x6f\x82\xf3\xe5\xd2"
+ "\xf9\x53\x7b\x05\x7b\x57\x6a\x9f\x75\xd1\xe8\x5b\xd6\x17\x63\x6d"
+ "\xb3\xe7\x9d\x1d\x4e\x9f\x4f\x6d\x1e\x30\x37\x85\xf9\x8b\xe3\x8c"
+ "\x6b\x36\x9d\xc3\x30\x7f\x71\x1e\x5f\xdf\x32\x38\x03\xfe\xd9\xbc"
+ "\x65\x6b\x33\xdd\x3f\xc0\xe6\xec\xd9\x31\x6e\xfd\xb0\x51\xbb\x17"
+ "\xd2\x73\x4d\x44\x30\x5c\xd3\xc1\xba\x5a\x25\x5c\x63\x39\x25\x9a"
+ "\x68\x8c\x3c\x2b\x7e\xdb\xc6\x6f\x9d\xb8\x47\x2b\x04\xb8\x1b\x63"
+ "\x82\x88\xdf\xaa\x27\x37\xa7\xf3\x4e\xfc\xee\x74\x8d\xb7\x19\x5d"
+ "\xb1\xfe\xcf\xee\x95\xe2\xfb\x9c\x09\x14\xde\x2b\x19\x9e\x95\xc7"
+ "\x7c\xc1\x6a\xae\x32\x99\xaa\xc6\x86\x7c\x6a\x06\xde\x83\x63\x2e"
+ "\xcb\xcb\x7c\xd6\x22\xf2\x1e\xcc\xcb\xd8\x0b\xe4\xcb\xe5\x39\xe1"
+ "\x7c\x2e\xd0\x34\x17\xe6\xd2\x62\x28\xcf\x81\x63\x2c\x3b\x2a\x54"
+ "\x78\x14\xe6\x48\x6e\x9b\xe1\xcb\x48\x31\x1f\x3d\x8e\x8d\x2d\xd4"
+ "\x90\x81\x7c\x96\x0d\xe3\x80\xbc\x46\xbf\x23\x43\xbf\x91\xbf\x90"
+ "\xcf\x90\xc7\x42\xd6\x3d\x47\xf9\x8c\xc6\x1f\x80\xf3\xd8\x5f\xe4"
+ "\x33\x68\x2b\x5e\x8c\xf3\x6b\x21\x5f\x06\xb3\xef\x39\x5f\xa6\x8a"
+ "\x3e\xb7\xf8\x2d\x29\x71\x00\xe9\x0b\xed\x02\x48\xd3\x58\x9a\x5f"
+ "\x99\x1d\x13\x08\xd6\xc5\xef\x70\x0c\x27\xef\x2b\x81\x7b\x8a\xa4"
+ "\x31\x37\xd3\xdc\xcc\x1f\xce\xa6\xb6\xc8\x7b\xe1\x5a\xb9\xbb\x9e"
+ "\x61\x21\x27\x73\x51\xd7\x40\xdf\xbe\x9f\xa8\x09\x7e\x07\x06\x1c"
+ "\xfb\xd2\x2a\xca\xb5\x8f\xaa\xf1\x7b\xfe\xc9\xf1\xd0\x3f\xd4\xa1"
+ "\xab\xe0\x77\x14\xe8\x92\xa5\x3e\x6c\xc6\xa3\xd0\xd6\x23\xe4\xe7"
+ "\xa9\x45\x3b\x16\xe6\x33\xb8\x40\xbe\x5a\x5e\x81\xb1\x40\x96\x75"
+ "\x8e\xf3\x9c\x96\xcc\x5f\xc5\x58\xcf\x9a\x04\x72\x6f\x3d\xf9\x6a"
+ "\x3a\xda\x8d\xd2\xaf\xa0\x8d\xa6\x36\x59\x6e\xa3\xa9\x2d\x15\xfe"
+ "\x41\xd3\xae\x8b\x76\xfb\xaf\x12\x8e\x93\xba\xf9\x6f\x14\xea\xc2"
+ "\x9b\x9e\x13\xd6\x94\x08\x98\x27\xb5\x2e\xfb\x2f\xf2\x25\xce\x6d"
+ "\xf4\xe3\x40\x9b\x93\xc2\x41\x30\xf6\x08\xd0\x09\xfa\xbd\x7e\xe8"
+ "\x0b\xa6\x14\xe4\xa3\x3a\xba\x0f\x0a\x63\x10\xfb\xe7\x4b\x54\x47"
+ "\xe9\xc9\xe2\x81\xd6\x56\xc1\xb3\xd5\x9b\x2f\x93\x40\x7d\x02\x79"
+ "\x00\xed\xdf\x21\x4e\xde\x84\x3a\xae\x10\x53\xb0\xaa\x89\xd4\x7d"
+ "\x9a\xb8\x96\x28\xe1\xfa\x43\xf0\xdb\x24\xca\x49\x70\x8f\x2a\xc0"
+ "\x4e\xd4\x28\x1f\x3d\xb3\x96\x3c\xd4\x66\xa8\xcb\x13\x69\x85\x32"
+ "\x04\xda\xe1\x04\x5b\x02\xf4\xb5\x96\xfa\x38\x63\x9c\x7a\x0b\x1d"
+ "\x37\x8a\xc3\xd8\x06\xe8\xb0\x75\x59\x01\x36\xa2\x62\x6b\x4f\x1d"
+ "\xf0\x7f\x99\x20\x33\xd6\xed\x05\xde\xaf\x76\xeb\xe7\x2f\xdd\x7e"
+ "\x67\xe2\xfd\x21\x36\x94\xcf\x7c\x8d\xcf\xb9\x11\xe2\xf8\xa0\xbf"
+ "\x6a\x08\xe8\x09\x94\xde\x0e\xbe\x19\xfa\x56\xae\x4f\x21\x41\x4d"
+ "\xe4\xab\x07\x76\x6f\xa7\xfb\xec\x4a\x99\x7d\xfe\xab\x50\x51\x0f"
+ "\x67\xfd\x3e\x57\x17\xb2\x2e\x80\xa0\x5d\x1d\xe3\x9d\x51\x5f\xbf"
+ "\xef\x22\xa8\x2d\xdd\xec\x18\x43\x4c\x69\x4f\x60\x1d\x51\xae\xaa"
+ "\x6d\x4d\x8f\x20\x1f\x46\x8c\x81\x79\x7c\xae\x10\xe6\x4a\x89\xff"
+ "\x3e\x95\xe7\x0a\x85\xf1\x2d\x67\xbe\x08\xe7\x56\xe3\x5a\x82\xba"
+ "\x3f\xac\x23\x25\xb8\x46\xb7\x19\xbe\x0a\x14\xe7\x0d\xac\x1b\x25"
+ "\x70\x8f\x10\x0f\x1b\xbf\xff\x9e\x4b\xc4\x18\x10\x54\x6f\x60\xf5"
+ "\x83\x99\xcd\xff\xab\xd1\x2e\x59\x1a\xea\xe1\x7d\xcc\x47\xed\xdc"
+ "\xa4\x79\x4e\x05\x8c\xe9\xb9\x49\xf8\x6e\x02\x2f\xc2\x7a\xf5\x55"
+ "\xbc\x34\x6f\xeb\x28\x36\x7f\xd8\xec\x3e\x2f\xbf\xca\x92\xf4\xcd"
+ "\xda\x31\x23\x72\x88\xd7\xf8\x9d\xfa\x3e\xb8\x56\x7d\xd5\xbe\x79"
+ "\x33\x5f\x60\x54\x72\xe3\xd6\x67\x93\x60\xc5\x46\x18\x36\x9c\x67"
+ "\x49\x31\x7d\x2f\x10\xcb\xdd\x21\xc1\xf7\x4d\x7b\x26\xf1\x2e\x3e"
+ "\x2d\x82\x28\x37\xb5\xdc\x15\x34\xc0\x7e\x5f\x01\x1f\x30\xf4\x85"
+ "\xc9\x89\x76\xa2\x59\x64\x24\xdf\x2e\x26\x01\xcf\x38\xe1\xd9\xc1"
+ "\x44\x6f\x21\xf5\x6a\xdc\x33\xfa\x61\x30\xca\x1f\xf5\x6a\x6c\x33"
+ "\x35\x8f\x04\xa5\x36\xf0\x8d\x1b\x7f\xdb\x23\x08\xd6\x03\xd5\x9b"
+ "\xc0\x63\xf7\x04\xdf\x57\x70\x1d\xda\x38\x1e\x43\xef\x2b\xf2\xdd"
+ "\x37\xcb\x36\xef\x7d\xd3\x87\x43\xdf\xf6\xf9\xd7\xb7\x6f\x0e\x4b"
+ "\x7d\xfb\xe6\xf0\xf7\xef\xdb\xd7\x8f\xb9\xf5\x4d\x25\xf5\x2d\x1e"
+ "\xfa\xf6\xf5\xd3\xfe\xf5\xed\xfc\x74\xa9\x6f\xe7\xa7\xdf\x60\xdf"
+ "\xf6\x77\xd1\xb7\x0a\xef\x7d\x4b\xbe\x0f\xfa\x56\xe7\x5f\xdf\x2e"
+ "\xd8\xa4\xbe\x5d\xb0\x7d\x9f\xbe\xa1\x2e\x9f\x16\xc9\x9f\xa7\xf1"
+ "\xe4\x13\x58\xbc\xd6\x0b\xe4\x9b\xb1\x69\x79\xb4\x1c\x76\x81\xd4"
+ "\xb7\x0b\xf3\xdb\x9a\x6e\xe3\xbf\x61\x72\x4e\x7d\xdc\x48\x3d\xfa"
+ "\xbb\xd6\xcf\x06\x5e\x56\x33\x9e\xfe\x86\xfa\x37\xa4\x5b\x79\xc1"
+ "\xdf\xb4\xfe\xd5\x7c\xea\x8f\x32\x2c\x42\x28\x97\xb6\x86\x0d\x3e"
+ "\x8c\xbe\x20\x1c\xcc\x67\x3e\x6c\xb0\x09\xf3\x77\x1e\x4a\xb0\x2a"
+ "\x79\x03\xc6\x0e\xc3\x78\x7f\x81\x84\xdf\x3a\xb8\xea\x50\x82\x9d"
+ "\xe6\x0e\x5f\x4f\xf7\xfb\xd6\x9b\xc4\x3d\x6e\xe2\x33\xac\xa1\xc3"
+ "\x22\xe0\x7c\x8d\x98\x07\x96\x57\xa2\x3c\x33\xb8\x18\xdb\x87\xf3"
+ "\x56\x31\x37\x2b\xf0\xfb\x06\x01\x1b\x6c\x21\xf6\xae\x70\xef\x9b"
+ "\x41\x22\xee\x3d\x93\x48\x42\x30\x2f\xe5\xe6\xb4\xbb\xf0\x9b\x23"
+ "\xb4\x55\x7f\x18\xc7\x7d\xaa\xed\x2e\x3e\x24\x95\x04\xe0\xde\x3e"
+ "\xf4\xd1\x33\x47\x58\xc9\xc0\x54\xd2\x63\x6a\x32\xb4\x69\x27\x31"
+ "\x21\xc9\xd0\x1e\x8c\x35\xd3\x0d\xbe\xa1\x36\xbe\x1c\x68\x0f\xbf"
+ "\x7f\x07\x24\x92\xe0\x67\x22\xd2\xf9\xf5\x3b\x48\x20\xee\x03\xc4"
+ "\xfd\x7c\x6c\x2f\x5f\xcf\xa0\x36\xc3\x37\x05\xe2\xfb\xdd\x00\x7d"
+ "\xfa\x30\xfa\x34\xd4\x49\xf4\x69\xd8\xd1\x99\x3e\x0d\x3d\x18\x7d"
+ "\xbe\x71\x48\xf4\x39\x1f\x2d\xa7\x4f\xc3\x20\x39\x7d\x1a\xe2\x6f"
+ "\x8e\x3e\x0d\x31\x12\x7d\xd8\x33\x18\x7d\x1a\x92\xbd\xd3\xa7\xc1"
+ "\x28\xd1\xa7\x61\xe0\x8d\xd1\xa7\xe1\x84\x6f\xfa\x34\x4c\xef\x82"
+ "\x3e\x3d\xbd\xd3\xe7\x7c\xdf\x1b\xa7\xcf\xf9\x68\x3f\xe8\xd3\x9b"
+ "\xd1\xe7\xc2\x5a\x89\x3e\x17\x7e\xde\x99\x3e\xe7\xf7\x31\xfa\x9c"
+ "\xcf\x93\xe8\x73\xc1\x22\xa7\xcf\xf9\x13\x72\xfa\x5c\x08\xba\x39"
+ "\xfa\x5c\x20\x12\x7d\xd8\x33\x18\x7d\x2e\x44\x78\xa7\xcf\x85\x28"
+ "\x89\x3e\xe7\x4b\x6e\x8c\x3e\x17\xe2\x7c\xd3\xe7\xbc\xcd\x7f\xfa"
+ "\x5c\x78\xc7\x83\x3e\x2a\xdf\xf4\xb9\x60\xf1\x83\x3e\x21\x8c\x3e"
+ "\x8d\x0f\x48\xf4\xf9\xf6\x4c\x67\xfa\x7c\x3b\x81\xd1\xe7\xdb\x31"
+ "\x12\x7d\x1a\x33\xe4\xf4\xf9\x36\x4e\x4e\x9f\x6f\x0b\x6f\x8e\x3e"
+ "\xdf\x16\x48\xf4\x61\xcf\x60\xf4\xf9\xb6\xd8\x3b\x7d\xbe\xad\x92"
+ "\xe8\xf3\x6d\xec\x8d\xd1\xa7\xb1\x87\x6f\xfa\x7c\x9b\xd3\x05\x7d"
+ "\xee\xf2\x4e\x9f\xc6\x19\x37\x4e\x9f\xc6\x8c\xae\xe8\xe3\x9f\xac"
+ "\xd7\x98\x83\xcf\xbd\x05\xed\xd4\xfa\x6a\x07\xc7\x0e\xfd\x0f\x39"
+ "\x43\x63\x6d\x3e\xd7\x33\x88\xed\xd1\x68\xcc\xd1\xa4\x90\xa7\xea"
+ "\xc9\xc5\x47\xf2\xb9\x1e\x41\xbc\xa1\x10\xf4\xa4\xb7\x73\xf9\x75"
+ "\x3d\x03\xb9\x75\x77\x05\xe2\xde\x6c\xdf\xf9\xdb\x2f\xbe\x16\x70"
+ "\x3f\x79\x10\xf7\xd1\xad\x07\x79\x19\x7f\xb7\x19\x2e\xe6\x80\x2c"
+ "\x18\xdd\xd5\xfe\x2d\xf4\x75\xfa\x70\x03\xea\xb7\x17\x4d\xae\xb8"
+ "\x18\x06\x3e\x19\xe3\x8b\xe9\x1f\xc6\x7d\x16\x17\x1b\x73\x68\xbc"
+ "\xaa\x01\xe3\xa3\x1f\xe6\xbf\x42\xdd\xe3\x02\x69\x3a\xcf\x6f\x19"
+ "\x30\x1e\xf9\x01\x64\xf5\x7b\x9b\x48\x53\x94\xcb\x3f\x8f\xd7\xed"
+ "\x14\x6c\x84\x56\x56\xb7\x79\x06\xbf\x45\x63\xc5\x3c\xa4\x2b\xd2"
+ "\x30\xbf\x66\xf3\x58\x90\x7d\x07\xe3\x33\x30\x76\xd2\x6e\x38\xa2"
+ "\x9f\x0c\xf3\xcd\x6c\x9a\x46\xe5\xe5\xf5\xfd\x77\x32\x5f\xb8\xe6"
+ "\x41\x22\xdf\xc1\x73\x7a\x41\xb9\xb7\x20\xcf\x63\xfd\x7b\x9a\xc8"
+ "\x3f\xaf\xba\x5d\x0f\x86\xf2\x19\x68\x3b\x54\xb8\xde\x1b\xca\xef"
+ "\xa3\x9c\x4d\xe3\x7c\x64\x67\x08\x3e\xc4\xff\x2c\x80\x73\x2a\xa1"
+ "\x4e\x28\xd4\x79\x15\x65\x77\xa1\x8d\x30\x28\x2f\x44\x1d\x58\xb8"
+ "\xae\x86\xf2\x64\xfc\x76\x20\x5c\xef\x0b\xe5\xc7\xa0\x3c\x84\xed"
+ "\x79\xb9\x2e\xcc\xd1\x26\xc7\xcd\xed\x19\x6f\xa2\x39\x35\x91\x06"
+ "\x4c\x17\xf8\xa7\x9b\xff\x4f\x53\x83\xc7\xb5\x18\xb7\x6b\xd5\xe2"
+ "\x35\xe6\xa3\xf6\xcf\x54\xb7\x6b\x25\x1e\xd7\x72\xdd\xae\x1d\xf6"
+ "\x68\xf3\xb0\xdb\xb5\xbd\x1e\xf7\x55\xb9\x5d\x33\x7a\x5c\x6b\x76"
+ "\xbb\x96\x21\x5c\x0b\x68\x33\x34\x07\x4a\xdf\xf0\x9a\xf4\xc2\x79"
+ "\x25\x9c\x8f\x74\x3b\x1f\x23\x9c\x87\xe7\x37\x8f\xb2\x90\x37\xad"
+ "\xc2\x79\x4a\x7b\xd6\x7e\xf3\x24\xb7\xf6\xa3\x98\x8d\xa3\x39\xc6"
+ "\xe5\x3b\x17\x36\x44\xc5\x5d\xd7\xed\x84\x6b\x11\xc8\x57\xee\xbc"
+ "\xbd\x34\x49\xb3\x60\xe5\x2b\x9a\x84\xb8\x44\x74\x5f\x59\xb2\x30"
+ "\x51\xb3\x64\x59\x6c\x9c\x2c\xce\xba\x1a\x63\x0e\x62\x4e\x35\x8c"
+ "\xdd\x42\xf3\x17\x6c\xe7\x1b\x5d\x39\x3f\x00\x57\xe1\x59\xe5\x16"
+ "\x32\x81\x3e\x2b\x87\xc5\x23\x2f\xc5\xd8\x2f\x2c\xce\x0b\x79\xae"
+ "\x9e\x34\x7f\x2a\xc4\x79\x31\x41\x5d\xbb\xef\x38\x2f\x97\xab\x69"
+ "\x7c\x43\xa8\xc7\xe2\xbc\x5c\xae\x81\x79\xfe\x0c\xdf\x8b\xe5\xf0"
+ "\x60\xb9\xcd\x2e\x89\xb2\x89\x75\x5e\x3b\x8d\x11\x98\xc1\x6c\x19"
+ "\x9e\xf1\x5a\x07\x0c\xc4\xfb\x84\xef\xa5\x03\xdd\xee\x8f\x65\xd7"
+ "\xc5\xf5\x41\x78\xa6\x71\x00\xc6\x8f\xe8\x55\x0f\x65\x6a\xbf\xa7"
+ "\xd7\x2e\x31\x5b\xde\x96\x01\xc3\xf1\x9d\xf0\xbd\xe5\xef\xa6\xfc"
+ "\x4d\x3d\xb9\x74\x40\x7a\xb7\x4b\xd5\x6e\xb1\xe0\x84\x77\xb8\xe4"
+ "\x60\x73\xb4\xd3\xbb\x52\xff\x44\x5e\x35\x60\x38\x3e\x1b\xf1\x8c"
+ "\xed\x65\x80\xf2\x96\x01\x5a\xb1\x3f\x6e\xfd\x1b\x8e\x7a\x3d\xf4"
+ "\xef\x0c\x1d\x13\xa0\x29\x0f\x34\x15\xde\x61\x07\x6f\x68\x4e\x65"
+ "\xb9\x0c\x60\x3d\xc1\x9c\x2c\x74\xad\xba\x1c\x2b\xda\x32\x71\x8d"
+ "\x62\x36\xcc\xcb\x92\xfc\x87\x31\xba\xb6\x88\xeb\xd7\x65\x37\xf9"
+ "\x8f\x3d\x13\xce\xed\x75\xe7\x21\xb7\xe7\x7d\x8a\xcf\x83\x7a\x93"
+ "\xd8\x7e\x80\x01\x5a\x9c\xef\x50\x56\xa1\x2f\x26\xde\x8b\x7d\xf4"
+ "\x95\x87\xcf\x57\x0c\x45\x69\x1c\xbf\x8b\x14\xc7\x31\x87\xee\x91"
+ "\xff\x6e\xb8\x68\xaf\x13\x72\x60\x98\x72\x5c\x79\xa9\xbf\xd3\xd1"
+ "\xdc\x6e\xc6\xfc\xc6\x47\x83\x49\x0c\x1b\xdb\xef\xe6\x23\xc6\xe3"
+ "\x9c\x61\x58\xff\x9d\x89\xd1\x7c\xa8\x95\xf5\xff\xbb\xd7\xf0\xbc"
+ "\xe4\x7f\xff\x9d\x45\xac\x27\xe2\x32\xfb\x5e\xf5\xdd\xbb\xb4\x1e"
+ "\xcd\xdd\x35\xd4\xce\x68\x3e\x44\x55\x4f\xbe\x2b\x17\xea\x5f\xa4"
+ "\xbc\x48\xe3\xf7\x7c\xd7\xc8\x6f\x19\x6a\x87\xbe\x82\xfe\xd3\x2c"
+ "\xe4\xac\x60\xcf\x85\x63\x39\xf6\x05\xc7\x08\xf7\x92\xf3\x5b\xf2"
+ "\x1b\xf9\xd0\xa1\xde\x73\x5e\x33\xbf\xee\x87\x9a\xc8\x15\x26\x43"
+ "\x28\x79\x3b\xda\x58\xd9\xbb\x5e\x89\x73\xf3\x7d\x0e\x16\xeb\x30"
+ "\xec\xa6\xd7\xa8\x4f\xb9\x3e\x09\xed\x41\xc2\xb5\x24\xdc\x5f\xeb"
+ "\xfa\xdd\xd3\xed\x77\x0f\xfc\x4d\xfd\x9a\x53\xe8\xda\x1a\x28\xed"
+ "\xe3\xbf\x12\x0b\xe5\x60\x8f\xb2\x5a\x56\x5e\xcd\xfc\x9e\x41\x36"
+ "\x6b\xa0\x3e\xe4\xc2\x79\xa1\xed\xbb\x69\x7f\x92\xf8\xd1\xc0\x1b"
+ "\xa3\x71\x4f\xb7\x30\x0f\x47\xe3\x9e\xed\x10\xc7\x1c\xba\x5f\x1b"
+ "\xae\x8f\x12\x8e\x51\xc2\x71\x38\xcb\xd3\x7a\x25\x52\xca\xb5\x8e"
+ "\x36\x9a\x2b\xc3\x7d\xe5\x7e\xc7\xfd\xe0\xc2\x31\x4a\x38\x0e\x17"
+ "\x72\xd5\xce\x86\xfb\x5c\xfb\xbf\xbd\xfb\x20\x5f\xd9\x20\xee\xe5"
+ "\x76\x1a\x35\xb5\x9c\x71\x48\x29\xe6\x05\xc5\x38\x61\xe9\xcd\x18"
+ "\x2b\xc6\x46\xcc\xa4\x83\x98\x13\xdb\x32\x30\x37\x68\x25\xcb\x09"
+ "\x8a\x7b\x60\x15\x68\x37\x47\xd9\xb1\x52\x7f\x89\xe6\x05\x5d\xd5"
+ "\x2c\xe6\x3d\xb9\xd2\xe8\xdc\xa2\xa9\x15\xe6\xcb\x0e\xe6\xa3\xdf"
+ "\x42\xed\xc5\x34\xaf\x75\x33\xfd\xee\x15\x74\x81\xb4\x24\x8b\x75"
+ "\xd8\xd8\xb5\x50\xdb\xd7\x6e\x83\x98\xfb\xb1\x45\x23\xe6\x9a\xb6"
+ "\x90\x96\xd4\xab\xa1\x73\x80\xb7\x5a\x46\xc9\x7d\xa6\x5b\x26\x63"
+ "\x9b\xd8\x77\x0b\xb9\x62\xc5\xb6\xa1\x8e\xce\x35\x67\xe1\xfc\x2a"
+ "\x07\xe9\x07\xfd\xba\x20\xb6\x0f\xd7\x61\xfe\x5b\xe9\x58\x62\x9b"
+ "\x57\xb7\x6c\xd0\xc2\xb9\x8d\x96\x80\xd6\x52\xe6\x73\xdd\x02\xeb"
+ "\xdf\x9f\xc7\x77\x25\x03\xf1\xaa\x61\x80\x4f\xc3\xa2\x38\xe3\x30"
+ "\x0d\x8b\xe5\x3d\x4c\xcb\x6c\x8c\x2d\xe7\xd1\x3b\x7c\xf3\x35\x12"
+ "\x88\x3e\x10\x8c\x67\x5b\x59\x0c\x64\x38\x07\x58\x5d\xc8\x6f\x19"
+ "\x46\xd7\x27\xff\xd6\xfd\x16\x1b\x6d\xa3\x1f\x8b\x6d\x86\x7b\x97"
+ "\xda\x0c\xad\xd1\xae\xfc\x09\xae\x79\xdc\xba\x10\xbf\x3d\xc0\xfc"
+ "\xa0\x7d\xf4\xec\x03\xf6\x17\xda\x6a\xf0\x29\x63\xaa\x86\x69\xe8"
+ "\xf7\x99\xad\x83\x2d\xcc\x47\xb5\xf5\xaf\x01\x11\xfd\x1b\xe1\x59"
+ "\xfb\x5d\x79\x23\xa0\x4e\x36\xfa\xde\x43\xfb\xae\xf7\x4c\xa0\xcf"
+ "\xa8\x66\x73\xbd\xb5\x91\xdb\x32\x4c\xb3\xb9\x83\x04\x0a\xe7\x1b"
+ "\x2b\x1d\x76\xcc\x3d\xe0\x35\xce\x16\xcd\x9d\x87\x3e\xe1\x5b\x87"
+ "\x69\x70\xdf\xd0\xa3\x76\xb1\xcf\xb6\x46\xdc\xaf\x82\x7d\x66\x63"
+ "\x6b\xab\x13\xc7\x71\x53\x0b\xb4\x9d\x76\x96\x34\x10\x5b\x1c\xfa"
+ "\xcd\xd1\x31\x49\x11\x7d\x39\x6d\x54\xe7\xa3\xcf\x67\x75\xa8\xee"
+ "\x4f\xf3\x18\x41\xfb\xf9\x34\x17\x1b\xbc\x03\xd0\xc2\x94\x86\x7b"
+ "\xfe\x6d\x34\x2f\xc0\x7a\x1a\xab\x03\xde\x9b\xfa\xc9\x5e\x15\xbe"
+ "\x93\xd8\xf6\x8a\x6b\x85\x45\x38\xb7\x19\x9f\x9d\xd4\x41\x2e\x13"
+ "\xdb\xab\x98\x63\x1d\xc6\x23\x0a\xe3\xd3\x55\xda\x60\x9e\x24\x77"
+ "\x20\x2f\x44\x61\xee\x4e\x0b\xb1\x6d\x60\xeb\x1b\x8e\xb9\x2d\x1e"
+ "\x9f\x8f\x63\x0b\xba\x99\x15\xc6\xf4\x5a\x9b\xe1\xaa\x2b\xff\x63"
+ "\x76\x38\xea\x3b\xb6\x2e\xe3\xeb\x3a\xa1\xcf\x95\xb9\xb0\x76\xf6"
+ "\x3b\x8b\xfd\x2b\xe3\xc2\x86\x69\xd0\x27\x1b\x7e\x2f\x11\xd6\x73"
+ "\x4a\x3b\xc6\x07\x57\xf7\x04\x44\x44\x0e\xa8\x64\xbc\x40\x63\xa8"
+ "\xc1\xb9\x89\xc2\xf8\xd1\x7c\x12\xc6\x24\x36\x0e\x42\x7d\x07\xb3"
+ "\x17\x47\x0e\x81\x7e\xb9\xe5\xbf\xbb\x4a\xd7\x6e\x8c\x7d\x9f\x4f"
+ "\x75\xc2\xab\x87\xdd\xfa\x6c\xa3\xfb\x5f\x5b\xd0\xd6\x77\x75\x36"
+ "\x3e\x6b\x13\xc6\x0f\x43\xbe\x68\x72\xe7\xff\xab\x63\xb1\x9f\xe8"
+ "\xf3\xeb\x0c\x1d\x6c\x81\xf5\xb6\x01\xc7\x19\xee\x49\x84\xb9\xe0"
+ "\x33\x57\x14\xae\x17\x98\x4f\xa4\xcd\x70\x4d\x2b\xae\x85\xa0\x5f"
+ "\xc0\xba\xd0\x36\x80\xea\x9d\x20\x4f\x9b\x39\x94\x67\xda\x28\xdf"
+ "\x00\xce\x6a\x04\x8c\xd5\xc0\x3d\xb3\xc5\x6f\x5e\x4e\xdc\x37\x71"
+ "\x99\x7e\xef\xb5\x89\xf9\xe4\x58\xbc\xbe\x6b\x19\xd2\x3e\x8b\x6b"
+ "\x1b\x3b\xed\xb3\xc0\xbd\x3f\xdb\x69\xde\xb1\xfd\xb8\xa6\x54\x34"
+ "\x37\xe0\x1a\x41\xef\xc7\xbd\x17\x69\xa0\x93\xb3\xfd\x43\x0d\x68"
+ "\x9f\xa7\x39\x4f\xb0\x2f\x2c\xf7\x44\x3d\xfd\x0d\x7c\x1b\x88\x47"
+ "\xc6\x4b\xd7\xac\xae\x9c\xe9\x40\x6f\xfc\xd6\xf6\x61\xe0\x2f\x89"
+ "\xe9\x61\x5c\xaf\xdb\x06\x60\xfe\xef\x36\x43\x9b\x5a\xcc\xfd\x4d"
+ "\x73\x7d\xb3\xf7\x51\xfb\x8c\xcb\x38\x92\x44\x61\xbc\x00\xdc\x5f"
+ "\x47\xc7\x40\x95\x9f\x85\xb1\x9e\x31\x6e\xa5\x29\x05\x73\xb2\xb4"
+ "\x7d\xfa\x46\x38\xdd\xa3\x6c\x33\x8d\x6c\x41\x3f\xac\xe6\x0b\xa9"
+ "\x34\x1e\x53\xd0\xd4\x64\x07\x8f\xf7\x51\x79\x22\x34\x3f\x0b\xaf"
+ "\xd1\x5c\x07\xd8\xe6\x4d\xc7\x2d\x6e\xcb\x13\x64\xd3\x66\xd0\x7d"
+ "\xee\x03\x5a\x51\xd9\x1d\x7e\x87\x37\x11\x7b\x3b\xcb\x41\xcb\x62"
+ "\xef\x0b\xfe\xd8\x3d\x59\x8c\x0d\x18\x33\x1a\xf3\xc0\xbe\x44\x33"
+ "\x14\xf3\x35\xdb\x97\xd3\x38\xd8\xc6\x01\x51\xc2\x18\x44\x6d\x66"
+ "\xfd\x0a\x99\x97\xac\xa4\x7d\xc4\xfe\xf9\xd7\x37\xfb\x68\x41\x8f"
+ "\xe8\xd9\x66\xb0\xa7\x8a\xb1\x39\x98\x3c\xc5\xe2\x63\x33\x5a\xd8"
+ "\x2f\x0a\xf2\xf3\x28\xe1\xd9\xa3\x6e\xc1\xb3\x0f\x0b\x6d\x06\xb1"
+ "\x18\xe1\x6d\x20\x03\x0d\x00\x0c\x6f\x0f\x14\xf5\x19\x61\x0f\xd1"
+ "\x70\xa6\x67\xb5\x47\x4a\xfa\x0c\x1b\x43\xd9\xbe\xbb\x65\xcb\x12"
+ "\x35\xb1\x0b\x57\xe8\xe7\x27\xbe\x1c\xaf\x89\x4b\x48\x58\x96\xa0"
+ "\xc1\x20\x4d\xee\xf3\x87\xe5\x31\x6a\x8f\x12\xf2\x13\x16\x4a\xf9"
+ "\x09\xdb\x93\xdd\x73\x7a\x5a\x48\x7b\xea\xad\xb1\x5d\xb4\xe7\xfa"
+ "\x6a\xc7\xa8\xe4\x8a\xe0\xbf\x18\xfe\x4d\xf0\x8f\x32\x06\x99\x67"
+ "\x27\xd1\xb0\xd6\x53\x3f\x13\x29\xe6\x44\xfb\x34\xf4\x31\xaa\x27"
+ "\xed\x57\xf3\xb9\x40\xd4\x83\x30\x6f\x78\x11\xd6\xdf\x0d\xf7\xc3"
+ "\xbf\x09\xfe\x4b\xe1\x9f\xde\xc7\x7d\x40\xf7\xcb\x17\xb9\x5f\x63"
+ "\xfe\x23\xeb\xf6\x63\x1d\x7e\x1d\x7e\xb2\xc7\xfc\xeb\xac\x9e\x47"
+ "\x1f\x94\xbc\xa1\x45\xac\x47\xbf\xed\xf7\x59\x47\x34\x5e\xea\x05"
+ "\xf0\x86\x8b\x85\x42\x3d\xea\x6b\x23\xbe\x0f\xe6\x1a\x80\xfa\x62"
+ "\xbd\x40\xde\xd0\x36\x4a\xa8\x47\xd7\x0a\xce\xa0\xf4\xf6\xdc\x1e"
+ "\xbc\xa1\x38\x52\xa8\xa7\x72\x6f\xcf\xad\x4e\x4f\xce\xf0\xd5\x5e"
+ "\xac\xc3\xad\x0b\x54\x33\xd9\xa9\x3d\x17\xea\x7b\x8d\xd1\xea\x1f"
+ "\x9d\xae\x47\x7b\xd2\x49\xff\xf2\xc2\xb8\x27\x16\x2e\x4d\xc2\x4c"
+ "\x53\x89\xcb\x56\x26\xe2\x71\xe9\xfc\xdf\xd1\xc3\xb2\x79\xbf\x7d"
+ "\x99\xfd\x48\x5c\x1c\x85\x3f\x16\x03\xbf\xe1\x31\x76\xa5\x1e\x0f"
+ "\x2f\x2f\xc3\x62\x72\xfc\xf0\x95\x2f\xe3\xc1\x73\x1f\x28\xc8\x56"
+ "\xd7\x1b\x81\x37\x6a\x18\xce\x5e\x07\x1d\xe9\x62\x24\x95\x63\xd7"
+ "\x59\xc8\x09\xad\x83\x88\x76\x2d\x79\xcc\x11\x87\x02\x63\x8e\x84"
+ "\xac\xd3\xbf\x1c\xe2\x58\x18\xc7\x6f\x19\x02\x32\xb0\x23\xca\x42"
+ "\x16\x11\x01\x1b\xa3\x69\x9c\x53\xc3\xf5\x0c\xc1\xb7\x33\x90\x33"
+ "\x6a\x6c\x18\xbf\x1f\xca\x34\xcf\x36\x07\xeb\x01\xd4\x1b\x03\x65"
+ "\xcc\xaf\xad\x86\xeb\x78\xdf\x78\x28\x47\x40\x39\x92\x33\xaa\x83"
+ "\x70\x8f\x31\x94\x35\x50\x1e\x08\xed\x1b\xc5\x79\xe1\x5d\x56\x76"
+ "\x14\x89\xb9\xbf\x59\x9e\x6f\x87\xc9\x95\xe7\x1b\xf3\x39\xa5\xa9"
+ "\x66\xd3\xf5\x97\xca\x20\x8e\x86\x80\x88\x07\x92\xa0\x4e\x83\xb8"
+ "\x5e\x32\x7b\x87\xc3\x26\xc6\x4f\x61\xf6\x0c\x67\xa0\x5b\xbe\x74"
+ "\x2c\xab\xc5\x7c\xe9\x68\xef\xa2\xf9\x1a\xe1\xc8\x1b\x30\x9e\x2c"
+ "\x5f\xe8\xd5\x96\x47\xf3\x7c\x3a\x57\x63\x6c\x5e\x6b\x7a\xac\xe2"
+ "\x27\xf9\x68\x43\x83\x32\x8b\x2d\xc9\x5f\x26\x4e\x9a\x1f\x4a\x8c"
+ "\x3b\xe7\x1e\x4b\xc2\xeb\x7e\xa8\x53\x20\x33\xd0\x7c\x57\x8b\x97"
+ "\x85\x38\xe6\xc7\x31\x39\xd0\x79\x86\xe1\xd7\x10\x21\xa6\xb1\xb3"
+ "\x84\x7f\x81\xe5\x44\xb1\x10\x6e\x22\x8b\x3d\xb5\x78\x19\x0f\xf7"
+ "\x86\x24\xcf\x8f\xa3\xe7\xa0\xde\x7a\x90\xd5\x84\xfe\xbd\x65\x8e"
+ "\xc4\x3d\xae\x9c\x10\x23\xc3\x59\x38\xf7\x81\x0c\x7c\x4e\x10\x95"
+ "\x43\x4e\x91\x60\xcc\xb7\x89\x7d\xcb\x77\x8b\x8b\xb7\x19\xce\xa1"
+ "\x0f\x69\xeb\x0b\x24\x18\xe3\x00\x0b\x7d\x29\x64\xf9\xc3\xb8\x68"
+ "\x31\xd6\x94\x05\xce\x79\xbe\xcf\x0b\xbf\xa6\x5c\x39\xe8\xe5\xe1"
+ "\xd3\x26\xc0\xaf\xe1\x42\xca\x6a\x77\xde\x8c\x6c\x0d\xd3\x5a\x5b"
+ "\x0f\x0e\xfa\x98\xe5\x25\xe5\x40\xff\x77\x52\x5d\x88\x43\x1d\xb8"
+ "\x4d\x97\xcb\x7c\x50\xb9\x32\x8c\xbb\xcb\x19\x50\x9e\xc4\x7d\xd3"
+ "\x1c\xcd\xa9\xc3\xab\x86\x04\xed\x5e\x8b\x31\x9e\x15\x30\xc6\xdc"
+ "\x01\xbc\x26\xc4\xf0\x52\xd2\x18\x57\x4e\x12\x41\xf7\x08\x83\x8c"
+ "\x82\x7b\x50\x2f\x28\x14\x15\x28\x77\xa0\x3d\x89\x33\x70\xd3\x91"
+ "\x6f\x81\xc6\x18\x43\xc4\xc6\x87\x69\x2c\x7c\xe8\x90\xfd\xc8\xc7"
+ "\x28\xeb\x9a\x55\x38\x66\x3c\xc6\x0c\x78\x06\xfe\x7f\xc3\x72\xcf"
+ "\xcc\x6a\x14\xdb\x84\x72\x30\xe8\xe9\x6a\x38\xaa\xda\x0c\xfc\x44"
+ "\xb7\x9c\x7c\xc2\x9e\x68\x7e\x21\xc6\x7e\xc3\xb6\xa9\xec\xac\x50"
+ "\xbc\xcb\x64\x10\x3e\xd1\x42\x54\xa3\xd8\x5c\xc4\x5c\xa3\xaf\x67"
+ "\x09\xbf\x41\xfe\xf9\xa9\xd5\xa3\x8d\xd3\xa2\xad\x94\xf1\x34\xac"
+ "\x79\x4a\xf2\x0c\xfc\xff\x06\xea\x1f\xb1\x90\x7f\xa7\xf5\xd7\x2b"
+ "\xe9\x3e\xc9\x0b\x01\x11\xb8\xdf\x9d\xaf\x16\xcf\xf7\x50\x44\xc3"
+ "\x98\x62\x4e\x37\x36\xf7\x5b\xc3\x06\x37\x43\xd9\x26\xda\x58\xa8"
+ "\xcd\x25\x13\xfd\xba\x5c\x65\x3b\x94\xd5\x62\x19\x7e\x6b\x44\xac"
+ "\x40\x9b\x44\x6b\xba\x6e\x07\xea\x9d\x2f\x47\x80\x5c\x08\xf2\x0d"
+ "\x5c\x07\xfa\xbf\x3e\x91\xdd\x6b\x88\x6e\x35\x6c\xd2\xdb\xc2\x76"
+ "\x66\xd8\x00\xff\xe0\x1a\xc8\x7f\x8b\x6b\x85\x76\xe2\x2d\x01\x57"
+ "\x33\xc4\x77\xe3\x0c\x01\x21\xdc\x96\x21\xa5\xf4\x1d\x15\x8a\xbd"
+ "\xf0\xbb\xdc\x1a\xaa\x29\x80\x7a\x40\x7f\x87\xb0\xbf\xf8\x52\xc1"
+ "\xc6\x0e\xd5\x74\x33\x48\xf0\xa6\xdf\x76\xe0\xf8\x51\x9f\xec\x4d"
+ "\x29\xaa\x69\x28\x77\x62\x1c\x10\x9a\x13\x0d\xe3\x5b\x3a\x48\x4f"
+ "\x9a\x53\x60\xcb\xfa\xd1\x34\x96\xfe\x2a\x6d\xb0\x18\xdb\x12\xf0"
+ "\x28\x87\x57\x2e\xb3\x61\xbc\x4b\x9a\x3b\xa4\x4d\xdb\x87\xc6\xb8"
+ "\x14\x62\x5b\xee\x4a\x22\xea\x3c\x8e\xc5\xb6\xa4\x31\x42\x7a\x82"
+ "\x9e\x92\xe4\x3d\xbe\x25\x6f\xd8\x3f\x51\x8c\x6f\xc9\x5f\x73\xda"
+ "\xe1\xf7\x40\x18\x0f\xcc\xff\xae\xa5\x65\x29\xde\x54\xa0\xd7\x78"
+ "\x97\x4a\xc0\x3d\x25\x8b\x77\xe9\xd7\x7a\xa1\x50\x50\xbb\x6c\x5b"
+ "\xa6\x02\xf0\x6f\x0d\xf5\x83\x71\x3b\x57\x02\x6f\x22\xc4\x37\xe0"
+ "\xe3\x85\x73\x35\x16\xf2\x9a\x18\x93\xca\x8a\x3a\x7e\x0e\xb5\x8d"
+ "\x71\xcd\xfc\xf5\xf8\x1d\xde\x30\xa7\x25\x6c\x0f\xf4\x03\xe6\x74"
+ "\xa6\x32\xc2\xa2\x50\xa6\xe2\xbd\x54\x97\x54\x28\x23\x3c\xe7\xf5"
+ "\x82\x97\x97\xc5\xc6\xcd\x5b\xb4\x44\xaf\x79\x61\xfa\x33\x34\x51"
+ "\xe2\x70\xcd\xc2\xc4\x38\xba\x24\x69\x5e\x98\x30\x6e\xea\xd4\xe9"
+ "\xf3\x7e\x3d\xfd\xe9\xe9\x33\x7e\x3d\x96\xed\x58\x9c\x9e\xb0\x1a"
+ "\x93\x6d\x26\x2e\xd3\xe0\x4d\x0b\x84\x6c\xe2\x29\x71\x09\xcb\x3c"
+ "\xf1\x40\x4d\xed\x5c\x4a\x6a\xd3\xb5\xe1\x6f\x6a\x4b\x53\x28\x0f"
+ "\x8b\x36\x2e\x8a\x7d\x0a\xe5\x3e\x1c\x5b\x9a\x6b\x3c\x53\x39\x1c"
+ "\xe5\x2b\x21\xcf\x3b\xae\x3b\x81\x38\xa7\x71\xfd\x81\x77\xb1\xb8"
+ "\xc7\xe6\x62\xf7\x06\x04\x2a\xf1\x3e\x61\x2e\x0b\xe7\xee\xe7\xfb"
+ "\xf5\x4b\xa7\xf1\xb5\x32\x03\xd4\xa2\xdd\x1b\xcf\x89\x7d\xa8\xc7"
+ "\x3a\x99\xca\x39\xae\x7c\xc2\x99\x01\x63\xa4\x3c\x94\xf4\x4f\x36"
+ "\x46\x84\xa0\x38\xd3\x03\x64\x95\x9e\xf0\x7f\x17\xfe\x4f\x74\xe1"
+ "\x7b\x12\x5f\x83\x3a\x5b\x88\x02\xd6\xe0\xe4\x00\x96\xc7\x2a\xb3"
+ "\x9a\xe6\x5e\x98\xea\x74\x04\xcc\x73\x2a\xe1\x18\xc0\xcf\x73\x06"
+ "\x52\x3d\x91\x4f\xe2\xab\xe9\x5e\xfb\x24\xbe\x0a\xf3\xb5\x01\x1f"
+ "\x67\x4d\x75\xa4\x65\x4d\x75\xf2\x8e\x79\x20\xbf\xc3\xf1\x5b\xdc"
+ "\x33\x3e\xd5\xf9\x2d\x4f\x73\xd6\xe0\xde\x7a\x16\x67\xb0\x14\x7d"
+ "\x28\xe7\x02\x0f\xe7\xb7\xb0\x9c\xc4\x53\x57\x7f\xf7\xd5\xbc\xd5"
+ "\x16\x96\x93\xf8\x32\xcb\xe3\xcd\x72\x9d\x93\x34\x68\xa7\x6c\x9e"
+ "\x33\x40\x33\xd5\x79\x9d\xa7\xfb\x5e\x33\x03\x35\x5d\xe5\x19\xf6"
+ "\x6a\xbf\xc8\x1e\x19\xcc\x6f\x1b\x9a\xc3\x67\x47\x35\xf2\xdb\x86"
+ "\xa9\x61\xbd\xaa\x45\x0c\xe7\xb3\xff\xad\x04\xca\x70\xfe\xdf\x0b"
+ "\xf8\x6d\xc3\xd5\x7c\xf6\xcf\x53\xe1\x08\xe5\x31\x3a\x7e\xdb\x08"
+ "\x28\xf7\x19\x0f\xf7\x19\xf9\xec\x90\xc3\x50\x4f\xc5\x67\x87\x0e"
+ "\x84\x23\x94\xc3\x72\xa0\x1e\x94\xd5\x81\x70\x84\x72\xdf\xc4\x0b"
+ "\x8a\xc0\x06\xb8\x07\xce\x3d\x35\x8a\x3d\x6b\x5c\x34\x7d\x56\xf6"
+ "\x84\x49\xec\x19\x13\x75\xec\x19\xff\x11\xcb\x9e\x31\x45\xcf\x9e"
+ "\x11\x0e\xf7\x0d\xcd\xe5\xb3\x23\xaa\xa0\x5e\x04\x9f\xdd\xef\x08"
+ "\x1c\xa1\x1c\x59\x08\xf5\xa0\xfc\x20\x3e\x0b\xca\x9a\x0c\xa8\x0f"
+ "\xe5\x87\x17\x43\xfd\x3c\x3e\x7b\xe0\x6c\xa8\x17\xc9\x67\x0f\xc6"
+ "\xf6\xa1\xac\x1d\x03\xf5\xa0\x3c\x74\x38\x1c\xa1\x0c\xbf\xb7\x8d"
+ "\x80\xf2\xf3\xf0\x4e\x43\x0b\xf8\xec\x5f\x47\x41\x3d\x0d\x9f\x3d"
+ "\x1d\x9e\x37\x0c\xca\x2f\xe6\x42\x3d\x28\xeb\xe0\xfe\xe1\x50\x7e"
+ "\x89\x40\x7d\x28\xcf\x82\x77\x1d\xba\x97\xcf\x9e\x03\xcf\x19\x36"
+ "\x90\xcf\x9e\x87\xef\x0c\xe5\x98\x5a\xa8\x07\xe5\x05\xd8\x1f\x28"
+ "\xc7\xc2\x7d\x23\xa0\xfc\x5b\x18\x83\xa1\x85\x7c\x76\x7c\x35\xd4"
+ "\xd3\xf2\xd9\xbf\xdb\x0b\x47\x28\x2f\x4d\x84\x7a\x50\x5e\x0e\x63"
+ "\x38\x1c\xca\x89\x6a\xa8\x0f\xe5\x24\x7c\xdf\xfd\x7c\xf6\xea\x62"
+ "\xa8\x37\x9c\xcf\x4e\xdd\x08\x47\x28\xa7\xc7\x40\x3d\x28\x1b\x60"
+ "\xfc\x86\x43\xf9\xd5\x20\xa8\x3f\xdc\x3b\x3d\xb3\x32\xf8\x75\x3d"
+ "\x09\x9f\xfd\x86\x83\x5f\x77\x17\x1c\xb7\xed\xe7\xd7\xf5\x80\xb6"
+ "\x77\xcc\x86\xf3\x70\xdc\x0e\x32\x71\x8f\xe1\x42\x19\x8e\x7f\xd8"
+ "\x00\xe5\x28\xa1\x0c\xc7\x5c\x3d\x94\x47\x09\x65\x38\xee\xc2\xf2"
+ "\x68\x3e\x3b\x1f\x8e\x3d\xe1\xb8\xcb\x0a\xe5\x31\x42\x19\x8e\x05"
+ "\x63\xe0\xe8\xe0\xb3\xdf\xd4\xc2\xf9\x68\x38\x36\x42\x19\x8e\x79"
+ "\x85\x50\x1e\x0f\xf5\x83\xa1\x3c\xde\x3a\xa8\x1f\xca\x03\x84\x0f"
+ "\xbb\x32\x8d\x0b\x7f\x54\x95\x7e\x95\x28\x31\x26\x52\x51\x9a\x05"
+ "\xe3\xc2\x3c\x54\xaf\xe8\x79\x1c\x73\x74\x60\x1d\xe7\xf6\xa1\x46"
+ "\x2e\x7c\x18\xc6\xa2\xec\x09\xf5\xee\xba\xa0\xb8\xeb\x34\x62\x8c"
+ "\x39\xd5\x42\x73\x03\x0a\x31\x2f\x7b\xc2\x3d\x17\x41\x66\xc2\xfc"
+ "\x0e\x4a\x18\xb7\x72\xde\xd0\xa3\x05\xc6\x6b\x12\x6f\xb8\xa7\x1e"
+ "\x8e\x50\x0e\x3d\x05\xe3\x05\xe5\x7f\x7f\x1d\x8e\x50\x9e\x35\x0e"
+ "\xc6\x6d\x52\x5b\xe6\x5d\x13\x2d\x8a\x40\xfa\xcd\x96\x3f\x38\xc8"
+ "\x14\xe2\xe0\xf9\xa9\x80\x9e\xfc\x9e\x99\xd1\x21\x0e\x13\xd0\x7a"
+ "\x2c\xc6\x07\x25\xfc\xbe\xfe\xd1\x7c\x58\x47\x0c\xed\xb7\x01\x74"
+ "\xeb\xeb\x03\x95\xec\xd9\xf7\xf0\xf5\x8a\xbb\x56\x62\x3e\x09\x3e"
+ "\x3c\xcc\xd7\xf5\x6d\xf4\xfa\xc3\x33\x4d\xec\xba\x8a\x48\xd7\x7f"
+ "\x83\xd7\xdf\x09\xc1\xb8\xec\x83\xef\x36\x59\x14\x77\xd5\x62\x1d"
+ "\x8b\xa2\xa7\x9d\x37\x04\x10\xb3\xad\x51\x78\xc7\xbb\xb0\x5e\x1d"
+ "\xde\xe7\xcb\xe6\xc3\xe5\x8c\x2b\xde\x04\x98\x87\x3a\x30\xac\x7d"
+ "\x4a\x4d\xda\xc0\xe2\x7a\xc5\xdd\xfb\x77\xa1\x8c\xa4\xd6\x65\x30"
+ "\x2c\x0c\x5a\x7e\x7d\xab\x56\xad\x49\x09\x81\xf6\xee\x3e\x90\x6e"
+ "\xe7\x6d\xa6\xb4\x71\x80\xa3\xf4\xfc\x34\xba\x5f\x88\xfd\x1e\x43"
+ "\xfd\x40\xd9\x6f\x2d\xb5\x39\x43\x5b\x78\xaf\xbb\xce\xe1\xcc\x2c"
+ "\x4d\xe4\xc2\x75\x46\xfa\x1d\x5d\x11\xb4\xf2\x7d\xce\xa2\x0c\x49"
+ "\x24\x3d\x34\x29\xc7\xa0\xfd\xa0\x23\x32\xfd\xd4\x55\x97\x5e\xdb"
+ "\x73\x14\xea\xbe\x89\xb6\xa4\xcc\xa0\x72\x57\x3e\x65\x78\x87\xdf"
+ "\xe3\xba\xa7\x24\xd1\xb8\x16\x53\x79\x57\x71\xf7\x24\xdc\xd9\xe4"
+ "\x50\x3f\x59\xe0\x30\x5e\x89\x76\xe6\xe8\x32\xf8\xed\x3a\x63\x1f"
+ "\x87\x82\xc5\x01\x56\xdc\xbd\xee\x51\x3b\xca\x97\x27\xb1\xee\xcf"
+ "\xb9\x9e\xa7\x46\x8f\x4c\x26\x4a\x53\xc2\x59\x2c\xaf\xe6\x33\xeb"
+ "\x86\x9b\x9b\x6b\x88\x29\x81\xb6\x95\xcc\x67\xb6\x9a\xb8\x9e\x8d"
+ "\xa3\xf3\x51\x4e\x4f\x46\x3b\xdb\x29\x1c\x17\x27\x8c\x33\xac\x21"
+ "\x77\xeb\xc4\xbe\xe0\xfa\xb1\x09\xc6\x0e\x65\x68\x8c\x7d\x31\xcf"
+ "\xe9\xc4\x58\x72\x59\x16\x18\x07\xb6\xbe\xde\x8d\x31\x29\x89\xf0"
+ "\xdc\x2d\x5c\x98\x96\x54\xce\xc6\x6f\x86\x2a\x8c\xcd\x65\xa3\xfb"
+ "\xe5\x31\xd3\x31\x87\x6b\x3e\xab\xeb\x4e\xbb\x85\x42\x9c\x80\x85"
+ "\x4b\x13\x13\x96\x6b\x56\x2c\x4c\x89\x1b\x3b\x68\xe5\x70\x4d\x42"
+ "\xb2\x26\x01\x97\x5c\x76\x02\x96\xe5\x15\x8b\x97\x25\x6a\x30\x03"
+ "\x79\xe7\xfc\xc5\x11\x20\x47\xd7\x50\xf9\x52\x11\x42\x65\x7e\xbe"
+ "\x60\xe6\xe8\xc4\x54\x9e\xd3\x3c\x7c\x17\x7f\x59\xd1\x6b\x52\x7b"
+ "\xcf\xbb\x8b\x71\xad\xe5\x0c\x1a\xaa\xe7\xc1\x3a\x1b\xbc\x23\x8c"
+ "\xe0\x9e\xbe\xa0\xb6\xcc\x5e\xae\xf8\x97\x16\x45\xc8\x46\x6a\x3b"
+ "\xc9\xec\xa5\x03\x1e\x74\x08\xdf\xce\x58\xbc\x3f\xe1\x1a\xfd\xb6"
+ "\x9c\xd9\x2b\x19\xf4\xc8\xfd\x94\x56\x05\x54\xc6\x87\xeb\xbd\x58"
+ "\x2c\x2c\xcd\xcc\xd1\xfc\xde\xfe\xd1\x20\xc7\x29\xe8\x77\x3c\xc7"
+ "\x43\xbc\x99\xb4\xd0\xd8\x01\xfc\xb6\x31\x45\x18\xb3\xc3\xb9\x7d"
+ "\x64\x14\x17\x3e\xa6\x88\xfb\x53\x24\x49\xdf\x43\x94\x87\x60\xce"
+ "\x07\x6a\x80\xbf\x1f\x26\x0f\x1d\x4b\x6b\x54\x42\x9f\xdf\x3d\x96"
+ "\x56\xa3\xe4\x73\x1e\x0d\x6a\x1d\xf8\x80\xc6\x2e\xe4\xb9\x36\x3b"
+ "\xec\xe4\xe3\xf1\x04\xf5\xb8\x62\x5b\xdf\x09\x13\x6d\x7d\x47\x46"
+ "\xd8\xb7\x4d\x2e\x32\x3d\xfc\x53\x32\xe1\x11\xfe\xbb\x8f\x4a\x08"
+ "\x69\x56\x84\x24\x7e\x34\x9e\xea\x16\x55\x76\xd5\x90\x6a\xdb\xf6"
+ "\x31\x51\x18\x2f\xab\x7d\xfb\x14\xd2\x11\x1e\x65\xfc\x10\xea\x9c"
+ "\x04\xdd\xe7\x13\x0d\xf0\xef\x00\xa2\x6c\x1f\xdc\xcf\x78\xa8\xc3"
+ "\xa8\x2c\x2d\x19\xc3\xec\xbe\x31\x30\x67\x28\x3f\xdd\x33\xe7\xa3"
+ "\xc3\x25\x04\x9e\x4d\x0e\x75\x4c\x54\x7e\x3c\xba\xd3\xf5\xb5\x1f"
+ "\x45\x95\x90\x36\x8c\xb1\x0c\xba\xe5\xd1\xb3\xb9\x84\xdf\xfe\x8c"
+ "\xfe\x40\x8a\x5d\x09\x82\xb3\xb2\xa2\x26\x97\xa4\x9e\x27\xbd\x1d"
+ "\xdf\x69\x03\xff\x02\xf7\xb7\x63\x0c\xd4\x4f\x22\x68\x2c\xc4\x34"
+ "\x13\xcd\x61\x1b\x52\x09\xf2\x02\xf7\x9d\xb6\x67\xe5\x74\x13\x81"
+ "\xeb\xd9\x8e\xff\x88\x20\x15\xf1\x56\x62\xd6\x15\x90\x76\x65\x34"
+ "\x79\xf7\xa5\x02\xf2\x26\xe8\x29\x6f\x5e\x26\xc1\x54\xf6\xbd\xae"
+ "\xed\xe9\xb8\xae\x0d\x74\xac\xd1\x62\x6c\x2a\x9e\xff\x4e\xdb\x0b"
+ "\x65\x61\xc7\x32\x6d\x50\xa5\xb5\x80\x3c\xda\x48\xb4\xed\x4a\x12"
+ "\xd2\xbe\x46\xdb\xab\x52\x9f\x0b\x6d\x81\x70\x0b\xe3\x8a\x71\xf1"
+ "\x30\x5e\x1e\x8e\xd3\x3d\x3a\x32\xbd\x59\x71\xcf\xe3\xbd\xaa\x49"
+ "\x5f\x8c\xcb\x8a\xf2\x25\xc6\x74\xe6\xd4\xcf\xe8\x9d\xea\x31\x51"
+ "\x69\x57\xa1\x5f\x18\x77\xe8\xe0\xa0\x02\x94\xcf\x41\xf6\x50\xe0"
+ "\x3b\x73\xbc\xb6\xd7\x3c\x3c\x6e\xd5\x64\xa3\x8c\xce\xb5\x45\x60"
+ "\x7e\xa8\x20\xec\x27\xe6\x6a\x5e\xfb\x35\x8c\x65\xba\x36\x10\xea"
+ "\x05\xc3\xf9\x3e\xe6\x66\x3b\x71\x8e\x18\x54\x34\x52\x4f\x73\xf0"
+ "\xaa\xf3\xd3\x88\xca\x98\x46\xd4\x9a\x7f\xa7\xbc\x34\xc3\x79\x60"
+ "\x50\x01\x9f\x19\x39\x10\xed\x31\xec\x5c\x9f\xc7\x35\xbf\x24\x44"
+ "\xf3\x53\xfc\xdd\xbb\x4e\xf3\x04\xd0\x50\x3d\xae\x8a\xea\x0f\xa8"
+ "\xb3\x2a\x7a\x7f\xca\x78\xbc\x77\x59\x7b\xcf\xdf\xc6\x73\x99\x3b"
+ "\x36\x70\xeb\x02\x23\x31\x3f\xf7\x65\x45\xef\x03\x7c\xf6\xdb\xfb"
+ "\xf9\x9c\xc9\x94\x17\xa1\xfc\x56\x7b\xcf\xfb\xca\xf9\xec\xbf\xa8"
+ "\xa0\xfd\x31\xed\x8a\xc0\x6a\xf8\x17\xe6\x48\xef\x02\x7c\x6f\xe7"
+ "\xde\xfe\x11\xf8\xde\x34\xa7\x10\xbc\xd7\x3c\xa0\x19\x1f\x3e\x2e"
+ "\x83\xc6\xd9\xbf\x0e\xe3\x2b\xe4\x5c\xc5\xf1\xc0\x31\xe0\xae\x6b"
+ "\x7b\xd1\x77\xbd\xae\x0d\x86\xf1\xc5\x18\xcc\x21\x69\xf3\xe1\x9e"
+ "\xed\xe3\x72\xe0\x5a\x9f\x76\xf5\xb8\x52\xcc\xed\x65\xd6\x5b\x89"
+ "\x73\xdb\x38\x23\xc6\x18\xdc\x91\x02\x73\xae\xef\x38\x90\x45\xc6"
+ "\xe5\x09\x73\x8b\x60\x3f\xb9\xec\xbf\xcc\x6e\xc7\xbd\x75\xd0\x37"
+ "\xe8\x5f\x35\xfc\xd7\x58\x14\xbd\x07\xb6\x0f\xea\xaf\xb5\x28\x82"
+ "\xed\xd0\xd7\x48\x3e\x73\xd4\x74\xfc\x0d\xd7\x22\x61\x6c\x7a\xe3"
+ "\x38\xe0\x78\xb0\xb1\xe8\xd3\x43\x1a\x8b\x18\x23\xd4\xb3\x71\x99"
+ "\x39\x70\x6f\xef\x6a\x3e\xf3\x51\xb5\x5b\xbd\x11\x52\xbd\xc5\xa3"
+ "\x58\xbd\xfc\x1a\x56\xef\xe7\x1b\xe1\x7a\x19\x1b\xef\x3e\xcb\x3b"
+ "\x8f\x77\x9f\x85\xd2\xbd\xd3\x6b\xd9\xbd\xaf\xc5\xb3\x7b\x07\xe2"
+ "\xbd\x7b\x3c\xfa\xb4\x43\xaa\x3f\x55\xc5\xea\x6f\x88\x60\xf5\x1f"
+ "\xd2\xb9\xd5\x3b\x2e\xd5\x7b\x29\x8f\xd5\xcb\x2e\x62\xf5\x1e\x29"
+ "\x86\xeb\x4e\x2f\x7d\xb9\x2a\xdd\x93\xac\x61\xf7\xbc\x55\xce\xee"
+ "\x19\x3f\x11\xf8\x69\x84\xbc\x2f\x21\x83\xa4\xfa\x09\xc2\x7b\xef"
+ "\x9d\xcd\xea\xff\xc2\xe6\x56\x6f\x32\xab\x87\xd7\x0f\x41\xbd\xde"
+ "\xa5\xed\x3d\xd3\x02\x59\xbd\x67\x73\x90\x1f\xa1\xce\x12\x2e\xf3"
+ "\x81\xc3\xed\x3d\xfb\x15\x40\x3b\x47\x80\x36\x11\x78\x04\xda\x45"
+ "\x70\xc6\x21\x55\xf0\x7b\x14\x7e\xd7\x41\xcc\xb5\x28\x7a\xa9\x01"
+ "\x77\x9d\x5e\x6d\x5f\x99\x21\xfb\x5d\xb6\x37\x0e\x64\x83\x6d\x43"
+ "\x7d\xc5\x59\x0d\xa4\x31\xfa\xb7\x0f\x2d\x32\x72\x2c\x37\x3c\xf0"
+ "\x28\xc8\x36\x21\xa7\x61\x2d\xcc\xa0\xb1\x96\x73\xc6\x46\x71\x03"
+ "\xfb\x63\x0c\xb5\x00\x73\x6a\x23\x29\xe2\x1a\x95\xc6\x0e\x12\x58"
+ "\x09\xeb\x0c\xd6\x2f\x82\x35\x55\xb3\x34\x00\xd6\xd7\x90\x4b\xc6"
+ "\x6b\x42\x7b\x05\x33\xa3\xd3\x97\xb0\x7c\xd8\x28\x57\x21\x36\xc3"
+ "\x7c\x0c\xa6\x79\xda\x96\xa2\x5c\xa1\x1a\x00\xbf\x31\xb6\x22\x69"
+ "\x1f\x7c\xbf\xa9\xfd\x8f\x33\xa3\x3b\xc2\x1f\x35\x76\xfc\x29\xb2"
+ "\xe0\x7a\xf8\xd8\xa8\xeb\xdb\x9f\x2c\x72\xfc\x51\x57\xe4\x18\xdc"
+ "\x3f\xda\x19\x1e\xa5\x82\x67\x03\x6e\xe7\x2a\x0f\x72\x45\xca\x83"
+ "\x69\x26\x25\xb6\x7b\x2c\xad\x40\x79\x34\xad\x4a\x79\x94\x2b\x56"
+ "\x1e\x4b\x33\xc2\xb1\x10\x73\x76\x81\x2c\xa7\x5a\x7e\x34\xad\x14"
+ "\xd6\x0d\x15\xd0\x39\x24\x57\xb4\x5d\xf2\xe3\x1c\xa4\xb2\xd0\x41"
+ "\x4e\x24\x5e\x25\xd6\xd0\x21\x35\xf0\x5f\x6b\xed\x3b\xae\xd8\xda"
+ "\x77\x72\x11\xed\x73\xf8\x78\xfa\x8e\xb8\x37\xf5\x28\xc7\xfa\x2c"
+ "\x8c\x07\xb6\x79\x26\x1f\xbf\xd1\x8a\x71\xa8\x15\xa1\x39\x9d\xe2"
+ "\x50\x2b\x59\xbe\x38\x57\x2c\xea\x1f\x22\x0e\xb5\x60\x23\xa0\x71"
+ "\xa8\x41\xdf\xa3\x7a\x1f\xac\x5f\x34\xc7\xa4\x03\xe4\xb3\x6d\x4f"
+ "\xaa\x50\xbf\x43\x79\xac\x2d\x33\xd4\x24\xea\x67\x28\x63\x38\xb7"
+ "\x0c\x69\x84\xff\x06\x38\x0f\x73\xf4\x9d\x28\xf1\x3c\xbf\xb5\x65"
+ "\x1a\xda\xd0\x9d\x7c\xfc\x2f\xda\x70\xbf\x25\x1f\xff\x94\x73\xdb"
+ "\x48\x8d\x73\xdb\x64\x23\x9c\x1b\x03\xff\x63\x9d\x5b\x5a\xa6\xc3"
+ "\xbf\x0e\xfe\x67\xc3\x7f\x0c\xfc\xc7\xc2\x7f\x3c\xfc\xeb\xe1\x3f"
+ "\x11\xfe\x93\xe1\x3f\x15\xfe\x33\xe0\x7f\x03\x1f\xda\xb2\x18\xe3"
+ "\x68\x42\xdb\x46\xa0\x7b\x84\xd8\xae\x34\xbe\x61\x63\xe1\x7d\x31"
+ "\x6e\x5e\x15\x97\xfd\x36\xfd\x26\x80\x3c\xcf\xef\xeb\x37\x11\x71"
+ "\x97\x1f\xf4\x80\xc6\x3a\x60\x66\x94\x75\x80\x2e\xd7\x1a\x3a\xcb"
+ "\x04\xff\xa5\xf0\x5f\x65\xdd\x36\xae\x0a\xe8\x97\x6b\xed\xfb\x4c"
+ "\x4c\x5b\x66\x18\xcc\x99\xfb\x53\x99\x0d\x29\x6c\x3f\xfc\xce\x13"
+ "\x7e\x17\x5b\x14\xe1\xd4\x7f\xc0\xda\x77\xbc\x06\xca\xa5\x16\xc5"
+ "\x7d\xb4\x5e\x6b\xf8\x38\x8b\xb0\x4f\x33\x03\xce\x83\xfe\xdf\xa7"
+ "\x98\xd5\x7b\x52\x16\x03\x6e\xc9\xcb\xfa\x79\x4b\xe6\x27\xcf\x5b"
+ "\xb1\x78\xe1\xcb\x71\x2b\x9e\xd0\x0c\x8a\xd5\x68\x17\x26\x2c\x9f"
+ "\xb7\x7c\x65\xdc\xca\x38\x2a\x36\xc1\xa9\x47\xe4\x3e\x68\x98\x67"
+ "\xc3\x01\xf2\x7d\x9f\x06\x9e\xc7\xf5\x6a\x92\x0d\x78\xec\xe1\x99"
+ "\xd1\x47\x2e\x5b\x95\x4e\x90\x5b\x82\x1b\x32\x60\xde\x8d\x8d\x3a"
+ "\x72\xd9\xae\x0c\x6e\xd0\x10\x1e\x78\x1d\xaf\x99\x1b\xaa\x04\x39"
+ "\xe6\x14\x29\x47\x39\x06\xea\x1c\x5c\x6a\x57\x4e\xc1\xfb\xff\xd4"
+ "\x3f\xfa\x10\xfc\xe6\xb7\x8f\x29\xc2\xfb\x78\x90\x6d\xe8\x11\x64"
+ "\x1b\x56\x7e\xd4\x78\x94\x1e\x9f\x2c\x3a\x4a\xeb\x45\xa9\x8e\xe1"
+ "\xf1\xda\x5a\xbe\x1c\xda\x45\xdb\x18\xff\xa7\xfb\x4d\x47\xd9\x3d"
+ "\x05\xb4\x0e\xcc\xb3\x7a\x85\x3a\x11\xeb\x51\x5d\x01\xfa\x78\x08"
+ "\xfa\x91\xbe\x92\x04\x8a\x73\x17\xf5\x01\xd7\xfc\x4d\x42\x39\xef"
+ "\xde\x3a\x9c\xbf\xd8\x1f\x1e\xe6\xeb\x01\xb8\xf7\xe0\x52\xa6\x3f"
+ "\x81\xce\x14\x80\xba\x12\x62\x04\x62\x83\x39\xb5\x8a\xde\x5f\xc4"
+ "\x55\x81\xae\x15\x00\xf7\xaa\x1f\xc0\x6b\x34\x9f\x08\x95\xc5\xd5"
+ "\x2e\xf9\x57\xcc\x27\x12\x1c\x03\x7c\xb1\x80\x3c\x04\xcf\x79\x0c"
+ "\xc7\x0f\xc7\x0b\xbf\x9f\xf2\x99\x61\x56\x8c\x95\xb0\x2b\x8c\x04"
+ "\x39\xfa\xea\xb2\x98\x6d\x45\xed\xda\xff\x6a\x53\xeb\x64\x71\xec"
+ "\x18\xbd\x34\x71\x4b\xe7\x2f\x58\x1c\x17\x4b\x3f\xb9\xcd\x5f\xb1"
+ "\x62\xe5\x92\x38\x4d\xdc\xfc\x97\xe3\x35\xf4\xb2\x66\xe5\x0a\xa8"
+ "\xb2\x30\x71\x85\x66\xd9\xaa\xa5\x9a\x25\x2b\x16\xa2\x74\x1c\x97"
+ "\x90\xb0\x52\x9f\xd8\x8b\xb0\x3b\x35\x4b\x56\x2e\x4e\x5c\xa8\x87"
+ "\x1f\x2b\xe2\x96\xc6\x6a\x28\xd5\x57\x40\x53\x8b\x17\x6b\x84\x27"
+ "\xac\x88\x9f\x9f\x80\x8c\xb0\xf4\x15\xa8\xe4\x76\xbf\x5c\x76\x0e"
+ "\xc6\x78\x78\xe8\x87\x75\x59\xd1\xb7\xbd\x24\x10\xc6\x3a\x47\x97"
+ "\x85\xfe\x0b\x50\xb6\x53\x7d\x2a\x53\x5d\x88\x76\xe6\x37\xe0\x1d"
+ "\x5b\x81\xe7\xdb\x32\xfb\x26\x8a\xef\x46\xed\xce\x18\x23\x14\xe3"
+ "\xcf\x2a\xfa\x9e\xa7\xfb\x85\x81\xff\xa9\x7f\x4b\xa6\xfa\x1f\x6c"
+ "\x2c\xfa\xee\x75\xb7\x61\x31\x9b\x69\xdf\xf7\xd1\x8f\xce\x02\xcf"
+ "\x40\x99\x40\xc8\xe9\xa0\x80\x7b\x2e\xe2\x3d\xdc\xb6\xc9\xb9\x70"
+ "\x5f\xad\x24\x97\xf7\xa5\x7e\x77\xb4\x5e\x66\xdf\x9e\x7c\xdf\x71"
+ "\xb0\xee\xf4\xcd\xc5\x7e\xf9\x58\x43\x34\xd7\xa0\xdd\x4f\x8a\x08"
+ "\x19\xa6\x26\xda\x6b\x5b\x87\x45\xb7\x85\x0d\xb1\x76\x18\xc8\x5d"
+ "\x1d\x30\x8f\xed\x4a\xf2\x50\x3b\xf0\xc5\xea\xc7\x48\xc0\xda\xc9"
+ "\x44\x59\xb4\xa8\x08\x63\x1c\x93\xf2\x89\xb9\xc4\x1c\x03\x3a\xb5"
+ "\x7d\x3f\x29\x37\xd5\x93\x0a\xc7\xdb\x2c\x6f\x48\x0a\xca\xd5\xf7"
+ "\xcd\xc1\x98\x76\xe9\x6b\x79\xe7\xa1\xf7\xac\x3d\x0e\x36\x15\x61"
+ "\xbe\x8f\x87\xcc\x8e\xaf\x4c\xe6\xd4\xbd\xc4\x9c\x6c\x36\x61\x3c"
+ "\x91\xcb\x8a\xf0\x67\x8f\xc2\xb5\xbb\xcb\xe1\xbe\x29\xe4\x2e\x28"
+ "\x8f\xc5\x67\x64\x6d\xe7\x6b\x5e\x0b\xe7\x6b\x5f\xdb\xce\x5b\x80"
+ "\xa7\x1a\x36\x0a\x39\x3c\xd0\x3f\x00\xfd\x20\x90\x4f\xf5\x49\x24"
+ "\xa2\x49\x11\x5e\x4d\x75\xfb\xf1\xb4\x7c\x3f\x94\xa9\xaf\x8d\x39"
+ "\x79\x3b\x96\xfb\x41\xd9\xc6\xca\xf9\x58\xee\xdf\xa4\xb8\x2f\x90"
+ "\x95\x3f\xc2\x72\x24\x94\xd5\xac\x5c\x49\x68\x5c\x0c\xc5\x7d\x03"
+ "\x59\xf9\x73\x2c\xc3\xd8\xdf\x37\xca\x94\x84\xfd\x3d\x07\x34\xbb"
+ "\xef\xe9\xf4\x3a\xd0\xcf\x92\x2f\xd0\xf9\x70\x2c\x2d\x1e\x6d\x0f"
+ "\x30\x1f\xc2\x4f\xdc\x53\x8b\xba\xdd\x7d\xb1\x3d\xa3\xf0\x18\x1e"
+ "\x1f\x62\x27\x77\x81\xac\x74\x0f\x5c\x7b\x1c\xc7\xce\xab\xad\xe5"
+ "\xe0\x03\xcb\xa6\x3a\x78\x13\xbf\xaf\xff\x68\x7e\xdb\xd8\x22\x7e"
+ "\x5f\x64\x06\x4f\xd7\xb1\xa1\xfa\xa2\x14\x3b\x8d\x33\x0d\xf2\x29"
+ "\xcc\xa1\xfb\xf6\x60\x9f\xac\x20\xef\xf9\x88\x3b\xab\xe2\xb7\x8d"
+ "\x2c\x02\x3d\x4a\x3b\x59\xeb\x40\x7f\x67\x90\x71\x23\x1e\x3f\x11"
+ "\x8f\x72\xc1\xf8\x9f\x70\x7b\x23\x33\xb8\x74\x1d\xe1\x07\xf6\x1f"
+ "\x3d\x39\x9e\x37\xc1\x1a\xa5\x60\xb6\x6a\xfe\x2b\x78\xfe\x57\xf4"
+ "\xb9\x83\xfa\x8f\xe6\x56\xc5\x63\x9e\x28\x8a\x2f\x69\xb8\x5e\x27"
+ "\x01\x9e\xac\xd1\x85\x38\xb7\x8d\xd7\x9c\x88\x3f\xef\x5f\xce\x21"
+ "\x45\x84\xcf\x1c\x6f\xd8\x27\x8c\xbb\xea\x80\xe7\x38\xe0\x5d\x51"
+ "\x36\x38\xc8\x95\x2a\x41\x46\x19\x7d\x60\x41\x4d\x0f\x7e\x95\x2e"
+ "\x04\xde\xe9\x31\xb3\xf6\x2a\xa9\xec\xc0\xb9\x12\x61\x3b\x91\x4c"
+ "\xc8\x84\x64\x87\x29\xc4\x4a\xe3\x63\xab\x30\x5f\x0c\xdf\x77\x64"
+ "\x51\x93\xe2\xfe\xf1\x53\x52\xe1\x1d\xe0\xdd\x8f\xd6\xd7\x04\x72"
+ "\xf0\x1e\x8f\xb2\x71\x83\xfb\xee\xd7\xc2\xd8\x6a\x45\xb9\xde\xcf"
+ "\xfe\x53\xbe\xe1\x56\xe8\x08\xee\x63\x3e\x04\xf2\x08\x77\x5d\x17"
+ "\xc2\xc1\xfa\x83\xd7\x4e\x68\x2f\x11\x7c\xa6\x30\xd6\xd4\xc7\x9d"
+ "\x1f\x08\xe3\x0c\xcf\xc7\xb8\xdc\xe2\xb8\xc2\x1a\xa6\x75\x5e\x8f"
+ "\xf7\x4e\xff\xed\xcf\x58\xa1\x7f\x1a\x7e\x4b\x8b\xd7\xbc\x55\xb0"
+ "\xd6\x3e\xc4\xf8\xa3\x9f\x0e\xfe\xe3\xf9\x3d\xba\x02\xeb\xa0\x7e"
+ "\xc9\x34\x8f\xe7\xf6\x27\x35\xa2\x8d\x04\xe6\x1b\xf0\xc8\xfd\x27"
+ "\x8a\x40\x17\xf6\x1e\x8b\xd0\xc0\xf2\xa7\xf5\xf8\x8a\x0f\x71\x62"
+ "\x5e\xe0\xab\x18\xe3\x7d\xf4\x09\xad\xcd\x4f\x9a\xf6\xf3\x99\x2b"
+ "\x0b\xdb\x07\x9d\xfa\xba\x9f\xed\xe9\x7c\xf2\xc8\x5e\x18\x17\x55"
+ "\x4b\x74\x07\x3f\x5e\xc1\x64\xef\xfe\x4e\x1c\x2b\x07\xac\x23\x29"
+ "\xa7\x89\xd2\x0e\xeb\xe5\xdb\x2f\x66\x29\x87\xc3\x3a\xe3\x84\xb5"
+ "\xbf\xac\xaa\x84\x4c\x9d\x44\xd2\x2b\xe2\x5b\x88\x98\x17\x8d\x0f"
+ "\x1f\x53\xf4\xd6\x8b\x56\x25\x7e\x33\xc2\x3c\x68\x54\x4f\xdd\xfe"
+ "\xb4\xf5\x2f\x9f\xdb\x51\x77\xb3\x1c\xf8\xdc\xaa\x74\xb4\xea\x34"
+ "\x34\xc6\x3c\xe8\xe4\xe9\xf1\x3c\xe7\xfa\x8e\x84\x79\x48\x8c\x9a"
+ "\x1c\xcc\x33\xfd\xc9\xb4\x2a\xba\xef\xff\x13\x5d\x09\xf9\xa4\x36"
+ "\x97\x94\x37\xd4\xe1\x7e\xe8\x3d\x9f\xe8\x8c\x28\x2f\xf6\x71\x80"
+ "\x4c\xf8\x26\xc8\x84\x30\x5f\xef\xe6\x54\x86\xd1\xe2\xb7\x24\xcc"
+ "\x9b\x26\xca\x83\x0e\x98\xa3\x79\x42\x6e\x34\x47\xe6\xfd\xcd\x79"
+ "\xc2\x77\x25\xcc\x99\xb6\x33\x89\x0c\xdc\xa9\xe4\x74\xde\xbe\x21"
+ "\xf5\x59\x4e\x7d\xa6\x23\xb8\x50\xc3\x68\x31\x77\xda\x94\xe5\x1a"
+ "\xf2\x0f\x78\xf7\x13\x5a\x7f\xe7\x64\x7f\x1a\x03\xcb\x01\x7c\xe7"
+ "\x00\x9e\x73\xc0\x78\x02\x0d\x8a\x81\x6e\x5e\x75\x10\x91\x06\xd7"
+ "\xd3\x45\x1a\x3c\xb0\x89\xd2\x00\x74\x97\x35\x33\x05\x1a\x9c\x05"
+ "\x1a\x34\x00\x0d\x0c\x24\xe3\xe4\xf4\x72\x32\x75\x1a\xd0\xa0\xb9"
+ "\x05\xf3\x13\xb0\xdc\x74\x89\x6c\xec\x29\x2d\xce\x5a\x95\x95\x36"
+ "\x46\x83\xfd\x2f\x31\x1a\x1c\x7c\xc9\x0a\x72\x4c\x3f\xe3\x5b\x50"
+ "\x76\xae\xd2\x69\x30\x67\x14\x6f\x88\xc1\x3c\xda\x8c\x16\xd7\x81"
+ "\x16\xd7\x19\x2d\xd2\x96\x03\x2d\xaa\x6b\x68\x6c\xaa\x4f\x6a\xcb"
+ "\x49\x79\x4c\x01\xa9\x00\x5c\x02\x5a\xcc\x47\xba\xa0\x5e\xed\x5c"
+ "\xa3\x0d\x03\x3d\x5a\x9d\x97\x42\x22\x44\x7a\x80\xde\xde\x6b\x53"
+ "\x0a\x41\x3f\xdf\x28\x98\x9b\x22\x3d\xd4\x94\x1e\x97\x04\x7a\x74"
+ "\xa0\xaf\x1c\xd0\xa3\x03\xe8\xd1\x01\xf4\x30\x30\x7a\x20\xce\x4f"
+ "\xb1\x85\xf0\xdc\x3f\xb5\x18\xbb\xa2\x33\x3d\xd6\x08\xf4\x38\x7b"
+ "\x33\xf4\x78\x40\xd7\x99\x1e\x91\x63\xba\xa3\x87\x34\x27\x1e\x7a"
+ "\x0c\xe9\x71\xbd\x40\x98\x13\x83\x71\x4e\x64\x28\x87\xc1\x5a\x84"
+ "\x63\x5a\x56\x75\x84\xce\x09\xcc\x0b\xf6\xd6\x8b\x76\x65\x79\x03"
+ "\xd0\x25\x16\xe8\x92\x22\xd1\x85\xd1\x63\x4c\x51\xe1\xe7\x6c\xfc"
+ "\x35\xcf\xe1\x9a\x81\x73\x03\xe9\x03\x74\x82\xf9\xe3\x2d\xaf\xa0"
+ "\xfb\xf7\x56\x68\x93\xc3\x79\x82\x73\x04\xe7\x43\x45\x7c\x1d\xcd"
+ "\xd3\xfe\xc9\xb4\x52\x82\xdf\x5d\x3f\xd1\x1d\x01\x5a\xe5\x12\xe7"
+ "\x2a\xa0\x4d\x12\xee\xed\x20\x03\x30\xbf\xe0\x27\xba\x2c\x94\x17"
+ "\x54\xc0\xf3\x77\x3b\x81\x4e\xce\xb6\x88\x5e\x1b\x41\x87\xc2\xef"
+ "\xb1\xee\xdf\x61\x31\x97\x32\xdf\xf3\xfe\x66\x38\x1f\xe8\x00\x1a"
+ "\xc1\xdc\x91\xcd\x19\x57\x8e\xe5\x6f\xb4\x64\x57\x3d\x09\xea\xbd"
+ "\x90\xd1\xc8\xe9\x36\x67\x26\x2f\xc4\x39\x93\x01\x34\x3a\xed\x27"
+ "\x8d\x1e\x64\x7b\x29\xc2\x01\xab\x43\x5b\xa2\x61\x9d\x04\x1a\x3d"
+ "\x50\xee\x8b\x46\xce\xbd\xfd\x74\x4e\xd5\x90\x6a\xcc\x93\xc0\x2d"
+ "\x9b\xae\xe0\x40\x5f\xea\x00\xbd\xf4\x13\xab\x83\xa4\xce\x21\xca"
+ "\x94\x3a\xd2\xd3\x3c\xfd\x14\x31\x5b\x8a\x69\x8c\x73\xb4\xf7\x62"
+ "\xee\x11\xb3\xa3\x18\xf0\x6a\x8a\x0a\xcb\xbb\x68\xd9\x4a\xd6\xcc"
+ "\x21\x01\x34\xef\xa8\xae\x80\x6c\x04\xfe\x3c\xf0\x52\x81\x92\xcb"
+ "\x79\x34\x88\x57\x61\xce\x24\x62\xaa\xd4\x3b\x30\x46\x5b\x70\x45"
+ "\x7c\x39\xc6\xb5\xfc\x0a\x63\x88\x57\xda\xa0\x4d\x2b\xdf\xe1\x84"
+ "\x35\x23\xdf\xc0\x17\x63\x1e\x89\x47\x71\x8d\xc0\xb8\x73\x0a\x4d"
+ "\x6f\x94\x45\xd0\xee\x65\x4a\xdb\x09\xb2\x97\x86\xc6\x6b\x80\x73"
+ "\x8a\x8a\x45\x36\xb8\xfe\x93\x75\xd8\x2f\x66\x83\x66\xc7\x47\x31"
+ "\x1e\x78\xf8\x94\x5f\xbf\x9f\x66\x0d\x34\x82\xbe\x0b\x32\x1a\xb6"
+ "\x33\x87\x67\xba\x60\x96\xb9\xda\x4e\xed\x8f\xd6\xf4\xf8\x9e\xc6"
+ "\x14\xf4\xc7\xc2\x9c\x14\xb8\x66\xff\xe4\x31\xf4\xe1\xe0\xf7\xc2"
+ "\x7a\x15\xfe\xa4\xa6\x68\x81\x55\x29\xad\xcb\x9a\x2c\x58\xcf\x92"
+ "\x27\x68\xf9\x74\xcc\xdd\x71\x14\xde\x0b\xf5\xa0\xb7\xeb\xed\x14"
+ "\x53\xfe\xb2\x20\x4b\x89\xf6\x11\x3b\xe0\x43\xf9\xe7\x7f\xa3\xb9"
+ "\x60\x2f\x28\x06\xec\x38\xa9\x73\x10\x7c\xfe\x8c\x47\xf0\x1b\x83"
+ "\xa6\xbc\x5d\xb9\x77\x54\x7b\xcf\x7e\x13\xd3\x1b\xa4\x3c\x98\xee"
+ "\xf9\x2e\x11\x67\x0e\x2c\x80\x36\x11\x67\xea\x33\x94\x0c\x5b\xa2"
+ "\xd1\x46\x17\xe4\x89\x2d\x15\xcd\x97\x48\x1a\xf0\x71\x45\x7c\x01"
+ "\xcd\xaf\xd2\x07\xf0\x9d\x5b\x03\x78\x72\x1d\xf4\x7d\xc0\x13\xc4"
+ "\x81\x7c\xc0\x0f\x6e\x0d\xe8\xf9\x1d\xa0\xe7\x0b\x38\x82\xb2\x17"
+ "\x1e\xe7\x00\x8f\x86\x94\xc2\x39\xa0\x13\x07\xb8\x0e\x78\xa2\x7d"
+ "\x33\x85\x0c\x7c\x13\x78\x74\x17\xe2\x08\xc8\xc5\x53\xf4\x80\x23"
+ "\xab\x00\x47\x92\x68\x3e\xe2\x88\x7c\x25\xc3\x8f\xf7\xea\xb3\x94"
+ "\x46\x31\x1f\x39\x1d\xdf\x87\x47\x54\x22\x7f\xc4\x64\x60\x5f\x95"
+ "\x4e\x5c\x9f\xd6\xe8\x02\x2a\x6d\xc0\x23\xdb\xa7\xd0\x73\x74\xde"
+ "\xae\x8a\xef\xc5\x31\x5e\x8b\xc6\x31\xd9\x7d\x99\x44\xd1\x9c\x9d"
+ "\xdf\x45\xf4\xda\xbc\x94\x0c\xcf\xbf\x4c\x06\xe6\x2f\x25\x5a\x98"
+ "\xaf\xca\x7c\xe8\xc3\xdc\xe5\x2a\x42\xf3\x98\xf4\xec\x37\x0d\xce"
+ "\x7b\xcd\x63\x02\x72\x75\x44\x3e\xce\x99\x65\x5a\x57\x9f\x1c\xc6"
+ "\x39\x55\x4e\x18\x3b\x1a\xf3\x4d\xf1\x30\x8b\x67\xac\xba\x37\x88"
+ "\xc9\xf9\x0f\x17\x33\x3f\xa5\x88\x60\xd0\x55\xee\x6a\x52\x3c\xbc"
+ "\x84\xdf\xaa\x21\xfa\x14\xa2\x68\x12\xaf\x81\xec\xc9\x01\xad\x46"
+ "\x66\x90\x0c\x2e\x34\x4b\x67\x4e\xbe\x84\x79\x01\xfc\x9c\x87\x0f"
+ "\x53\xdf\x6e\xa7\x71\x0e\x7d\x5f\x6e\xeb\x9c\xda\xdd\x4d\x24\x8a"
+ "\xff\x1d\xd0\x63\x11\xbc\x6b\x13\x19\x98\xd7\x04\xef\xba\x8a\xbd"
+ "\xab\x98\x7f\x9d\x33\xec\x1d\x03\xd7\xba\xcc\x01\x66\xfd\x1d\xe6"
+ "\x00\x0b\xa9\x01\x0c\xbb\x97\x7f\x18\xfd\x8e\x69\x4c\x9e\x36\xb3"
+ "\xa3\x8e\xe0\x73\xd1\x36\x64\x6e\xa1\x3c\x3d\x1f\x79\x99\x2b\xd0"
+ "\x15\xcc\xab\x05\xde\x6e\x8b\x27\x3c\xfc\x3e\x5a\x6f\xc5\x18\x38"
+ "\x54\xe6\xb3\x28\x34\x46\x94\xd3\x8e\xc1\x39\xe4\x7d\x37\x9e\x37"
+ "\x22\xcf\xe3\x75\xca\xf7\x70\x9f\xb9\xf6\x3c\xc1\xf6\xdc\xdb\x41"
+ "\xfa\x8b\x6d\x5d\x50\x0c\x9c\x80\x6d\x21\x2f\xa0\x4d\x07\xe7\x1a"
+ "\xa3\x7d\x31\xfa\x98\x47\xf0\xe1\x51\x46\x56\xb6\x62\x7e\x1b\x15"
+ "\xf2\x00\xe5\x15\xc0\x6f\x8c\xb9\xcc\xf3\xba\x00\xe0\x33\xec\x67"
+ "\x2f\xa0\x77\x94\xc8\x17\x70\x4e\xed\xc9\x1b\x7d\xd6\xa9\x50\xa7"
+ "\x51\xe3\xef\x1b\xe5\x0f\xff\xe8\x37\x70\xbc\x4f\xff\xb7\x81\xfd"
+ "\x70\x1e\x3d\x84\xb8\xe9\x6c\x75\xc3\xcc\x66\x86\x99\x88\x49\x22"
+ "\x6e\x52\x6c\xa2\xb9\x1d\x8a\xd1\x3f\x35\x9e\xf6\xd1\x4f\xdc\xac"
+ "\x68\x96\x70\x73\x8a\xde\x0d\x37\x9b\xf9\x0e\x6e\x90\x37\xdc\x1c"
+ "\x34\x41\x8e\x9b\x83\x9e\x95\xe3\xa6\xf6\x80\x27\x6e\x76\xc6\xcc"
+ "\x41\xaf\x79\xc3\x4b\xd0\x63\x1e\x6a\x52\x68\x67\xfb\xc6\xca\x41"
+ "\x87\xfd\xc7\xca\xc1\x27\xe4\x58\x39\xc8\xfe\xff\x2f\x56\x0e\x99"
+ "\x29\xc3\x4a\xd5\x0d\x62\x65\x13\xc5\x4a\x35\xff\x4f\x98\x13\x02"
+ "\x7e\xe4\x2f\xf2\x81\x95\x8b\xba\x99\x0b\xbf\xf3\x85\x95\x43\xfe"
+ "\x2a\xc7\xca\x21\x0d\x72\xac\x1c\xb2\x43\xc2\x4a\xe1\xda\x2d\xc1"
+ "\xca\x21\x45\x77\x06\x2b\x87\x14\x51\xac\xbc\x8c\x58\xa9\xdd\xd4"
+ "\x3d\x56\x0e\x3a\xe2\x1d\x2b\xe1\x3c\xc5\xca\x41\x47\x24\xac\xac"
+ "\xeb\x06\x2b\x1f\x59\xee\x07\x56\xaa\x29\x56\xaa\x7c\x60\xe5\x22"
+ "\x18\x2b\x81\x2f\x28\xef\x79\xf0\x86\x80\x95\x11\x2e\xac\xbc\x01"
+ "\xfe\xf0\x8f\x7e\x8f\xe8\xbb\xc2\x4a\xce\xc8\xe4\x4b\xc4\x4a\x3e"
+ "\x4c\xc0\xca\xc5\x0e\x92\x72\x06\x30\xb2\xba\x89\xe6\xb0\xa1\x7e"
+ "\xbd\xf0\x9f\x3a\x13\xb1\x68\x4c\xd4\x41\x18\x2f\xb3\xa5\x88\x62"
+ "\x13\xf5\x4f\x9d\x84\x58\x55\x04\x75\x73\x5d\x72\x27\xc5\xce\x33"
+ "\x02\x76\xce\x16\xb0\x73\xee\xf7\xc0\xce\x97\x90\x96\x43\xd7\xb5"
+ "\x2b\x45\xec\xdc\x0a\xd8\x39\x94\xca\x0f\xf8\x3d\x93\x61\xe7\x08"
+ "\xa7\xd8\x2f\xb4\x69\x9a\x13\x77\x12\xd6\xaf\x96\xce\x38\xfa\x1c"
+ "\x6d\xef\xb4\x69\x51\x33\x71\x61\xe9\x6c\x09\x4b\xa1\xad\x03\xbe"
+ "\x71\x74\xa8\xc3\x85\xa3\x06\xc0\xd1\x73\x6e\x38\x0a\x7a\xd3\x5f"
+ "\x10\xf3\x00\x47\xdb\x28\x8e\xbe\x27\xe0\xe8\xf0\xde\x27\x67\x03"
+ "\x8e\x3e\x27\xe2\xe8\xb0\x68\xbb\x61\xef\x28\x7b\x66\xf7\x38\xda"
+ "\x46\x71\x54\x7f\xfb\x71\xb4\xc4\x03\x47\x41\x77\xc5\x1c\xec\x5e"
+ "\x71\x54\xe4\x47\x8a\xa3\x19\x12\x8e\xd2\x71\x1d\xfe\x56\x65\x0c"
+ "\x8c\x7b\x8c\x9e\xea\x6e\x2e\x1c\xd5\x17\x31\x1c\x85\x73\xd4\x7e"
+ "\xb2\x02\x70\x14\xf8\x2f\xbd\x02\x63\xfb\x91\x68\xe8\xa3\x0a\xf1"
+ "\x75\x37\xcc\x19\x1c\x23\x17\x9e\x2e\x82\x39\x83\x18\xd3\x0a\x73"
+ "\x06\x70\x74\xee\x55\x15\xa1\xf3\x25\x13\xe6\x4b\x93\x8f\x1c\x7a"
+ "\xa2\xbf\xac\x4f\x3c\x1d\xa1\x90\xe3\xe9\x88\x51\x72\x3c\x1d\x7e"
+ "\x51\xc2\x53\xe1\x1a\xe2\x29\xd0\x0c\xc6\x47\x87\x98\x7a\x73\x78"
+ "\x3a\x82\xb8\xf0\x54\x29\xe0\xe9\xa2\xee\xf1\x94\x7e\xf7\xf3\x81"
+ "\xa7\xee\xd8\xe0\x1b\x4f\x47\x10\x09\x4f\x47\xd4\xb9\xf0\xb4\xc6"
+ "\x17\x9e\x0e\x0b\xf4\x8e\xa7\x70\x9e\xe2\xe9\xb0\x40\x17\x9e\xd6"
+ "\x78\xc1\xd3\xe7\xdc\xf1\x74\x64\x05\xc3\xd3\x22\x8a\xa3\x88\xa9"
+ "\x95\x36\xe0\x0f\x9c\x73\x89\xb9\x14\x53\x39\xc0\x54\xcc\x2b\x8c"
+ "\x39\xa5\xd0\x2f\xde\x1b\xa6\x32\xcc\xb5\x10\xc4\x55\x9c\x9b\xe9"
+ "\x93\x41\xdf\x85\xb5\x08\xc6\x84\xae\xbd\xe2\xf8\xed\x76\xc3\xd7"
+ "\x79\xab\x55\x28\xdb\xc9\x78\x85\x13\x79\xa5\x55\x8b\x3e\xb2\x32"
+ "\x5e\xf1\x8f\x96\x23\xcb\x7d\x61\xab\x2f\xdd\xfd\x24\xea\xee\x33"
+ "\x88\x72\xcd\x0c\xc0\x57\x1d\xea\xee\x85\x1e\xba\x7b\x61\x67\xdd"
+ "\xfd\x74\xd7\x38\xea\x97\xee\xfe\x22\xd2\xf0\xd1\x32\x39\x8e\x3e"
+ "\x5a\x21\xc7\xd1\x7f\x7b\x16\xfb\xc5\x70\xbc\xd0\xbb\xee\x4e\xe7"
+ "\x79\xd4\xfd\x2e\xdd\xbd\x46\x8e\x9f\x92\xee\xfe\xd3\x76\xdf\x38"
+ "\x1a\x35\x5e\x26\x8f\xce\x15\x70\x74\x81\x80\xa3\x0b\x24\x1c\xfd"
+ "\xe4\x94\x28\x8f\x3e\x36\xbf\xac\xc6\x1d\x47\xa3\xb2\x5c\x38\x5a"
+ "\xdb\x19\x47\x45\x0c\x45\x3c\xc5\x76\xd0\x96\xb5\x1f\x70\xfa\xd0"
+ "\x02\xbd\x92\xd9\x6a\x63\x70\xec\x82\x3c\x6d\xb5\x15\xcd\x57\x49"
+ "\xda\x6c\xc4\xd3\x5c\x8a\xa7\x21\x0a\x32\x1f\xb0\xaf\x0f\xfa\xfd"
+ "\xe7\xe1\x37\xfb\x24\x96\x93\x0d\xed\x4b\xdc\x2a\x96\xe3\x53\xb4"
+ "\x33\xc1\xfb\xd2\x6f\xf5\x73\xea\x04\x4c\xbd\x06\xe3\x01\x3c\xf7"
+ "\xe6\x35\xc0\xd4\x24\x2f\xb2\xe9\x1a\xc0\xd4\x14\x37\xd9\x14\xe6"
+ "\xfe\x7b\x0b\x3c\x31\xf5\xb1\xab\x95\xc8\x2b\x88\xa9\x32\x3d\xbe"
+ "\xf0\x47\xa0\xc7\xff\x74\xb2\x1c\x4b\x7f\x9a\x21\xc7\xd2\x9f\x3e"
+ "\x2e\x61\xa9\x70\xed\x96\xc8\xa6\x3f\x9d\x74\x67\x64\xd3\x9f\x4e"
+ "\x92\xf4\xf8\x7f\x7b\xc4\x85\xa5\xd5\xbe\xb0\x34\x6a\x92\x77\x2c"
+ "\x85\xf3\x14\x4b\xa3\x26\xb9\xb0\xb4\xda\x8b\x1e\x2f\xc3\xd2\x51"
+ "\xbd\x19\x96\x16\x32\xd9\xb4\x46\x94\x4d\x0b\xff\x05\xf5\xf8\x51"
+ "\xc1\xfe\xea\xf1\x27\x9b\x19\x7e\x22\x3e\x89\x18\x2a\xe9\xf1\x85"
+ "\xbe\xf5\xf8\x6e\x30\xd4\x2f\x59\x94\x62\xe8\xe3\xbd\xe5\x18\xfa"
+ "\x78\xa8\x1c\x43\x47\xaf\xf3\xc4\xd0\xce\xf8\xf9\xf8\xf3\xde\xb0"
+ "\x93\xe9\xf1\xa3\xa3\x7c\xe3\xe6\xe3\xa9\xfe\xe3\xe6\xbf\xef\x90"
+ "\xe3\xe6\xe3\xa6\xff\x1d\xb8\xf9\xb3\x11\x32\xdc\x54\xdd\x20\x6e"
+ "\xfe\x20\x3a\xfd\xcf\x3c\xec\x9f\x3f\xf3\xb0\x7f\xfe\xcc\xcd\xfe"
+ "\xf9\xb3\x5b\x68\xff\xfc\xd9\x1d\xb2\x7f\xfe\x6c\x83\x24\x83\x8e"
+ "\x9e\xdf\x3d\x6e\x3e\xbe\xc1\x3b\x6e\xc2\x79\x8a\x9b\x8f\x6f\x90"
+ "\x70\xb3\x3b\x19\xf4\xe7\x13\xfc\xc0\xcd\x1f\xb9\x4e\xff\xf3\x2e"
+ "\xed\x9f\xde\x74\x7a\xc4\x4d\x8a\x97\x35\x1e\x3a\xfd\x0c\x77\x9d"
+ "\xbe\x50\xd2\xe9\x27\x32\xdc\x32\x3b\x8c\x72\x9d\xfe\x96\xe3\xe8"
+ "\x13\x33\xec\x2e\x7b\xe8\xeb\x80\xa3\x4f\xcc\xc4\x77\xb3\xbb\xec"
+ "\xa1\x63\xeb\xc4\x7e\x31\x9d\x7e\x2b\x61\xfd\xf2\xa2\xd3\x53\x9f"
+ "\xd9\x27\xde\x72\xe9\xf4\x35\x9e\x3a\xfd\xd8\x4d\xbe\x31\xf5\x89"
+ "\x2a\xaf\x3a\x3d\xea\xdf\x14\x53\xf5\x14\x53\xaf\x6d\x77\xc7\xd4"
+ "\x27\x2f\x51\x4c\xfd\xa5\x88\xa9\x4f\xaa\xed\x30\x37\xed\x3d\xbb"
+ "\xc7\x54\x6c\x47\xc2\xd4\xf8\x1f\x06\x53\x4d\x37\x8e\xa9\xee\xfb"
+ "\x4d\xdf\x83\x77\x77\x61\x2a\x1d\xe3\x31\xaf\x55\xc6\x20\xa6\xc6"
+ "\x7b\xe8\xf7\x85\xde\xf5\xfb\x32\xa2\xc4\xf1\x11\xf5\x7b\xa4\x01"
+ "\xc5\x9b\xdb\xaa\xdf\x8f\xf9\x5a\x8e\xad\x63\xd5\x72\x6c\x1d\x53"
+ "\x26\x61\xab\x70\xed\x96\xe8\xf7\x63\x2c\x77\x46\xbf\x1f\x63\x91"
+ "\xb0\x75\xec\xfb\xdd\x63\xeb\x13\x35\xde\xb1\x15\xce\x53\x6c\x7d"
+ "\xa2\xa6\x4b\x6c\xfd\xa5\x3b\xb6\xfe\xe2\x80\x88\xad\x92\x7e\x0f"
+ "\xfc\x81\xf3\x2f\xd1\x78\xf3\xfa\xfd\xb3\x77\x5a\xbf\xff\xc5\x7e"
+ "\xbf\xf4\xfb\xed\x80\xb3\xa0\x8b\xaf\xf9\x14\xf4\xfb\xe7\x05\xfd"
+ "\xbe\xb6\xc0\x43\xbf\x2f\xe8\xa4\xdf\xa7\x3e\x2f\x60\x2a\xcc\x29"
+ "\x8a\xa9\x0b\x0a\x6f\x5e\xbf\x7f\x01\x69\xf8\xd4\x5b\x72\x4c\x7d"
+ "\xea\x80\x1c\x53\x9f\x19\x8b\xfd\x62\x98\x5e\xe0\x5d\xbf\xa7\xf3"
+ "\xfc\xa9\x76\x99\x7e\x0f\xfd\xeb\xac\xdf\x8f\xbb\x24\xc3\xd4\xb9"
+ "\xee\x98\x1a\x3d\x50\x26\xa7\xc2\x7b\x21\xa6\xbe\x75\x8e\x61\xea"
+ "\xdb\xe7\xdc\x30\x75\xca\xdb\x02\xa6\x3e\x3d\xa3\x6c\xba\x3b\xa6"
+ "\x46\xc7\x8b\x98\x4a\xf1\x72\xae\x5d\x99\xae\xeb\xec\x77\x42\xfd"
+ "\x7d\xd0\x17\x08\xda\xc6\x3d\x52\xd8\xe6\x81\x73\xf1\xdd\xfb\x9b"
+ "\xe8\xbc\xfb\x9b\x98\x13\x2d\xa4\xbc\xc1\x48\xfd\x4c\xf2\xd0\xcf"
+ "\x64\x1d\x19\x90\xd7\xc1\xf6\xfa\xd3\x7c\x1c\xd7\xbc\xef\xf3\x9f"
+ "\x33\x53\xc2\x59\xf4\xc9\x7a\x13\x7d\xb2\xae\x31\x1f\x20\xa0\x77"
+ "\xe7\x7d\xfd\xa2\xdc\x04\x78\xf0\xee\x39\x4f\x9c\x7d\xfa\x62\x25"
+ "\xf2\xcf\xec\x78\x0f\x9d\xbf\xe0\x47\xa0\xf3\x8f\x7b\x5a\x8e\xaf"
+ "\xe3\x12\xe5\xf8\x3a\xee\x11\x09\x5f\x85\x6b\xb7\x44\x76\x1d\x17"
+ "\x7d\x67\x64\xd7\x71\xd1\x92\xce\xff\xcc\x03\x2e\x7c\xad\x72\xc3"
+ "\xd7\x73\xee\xf8\x1a\x3d\x9c\xe2\xeb\x39\x4f\x7c\x85\xf3\x14\x5f"
+ "\xa3\x87\xbb\xf0\xb5\xca\x43\xe7\x3f\xe7\x89\xaf\xe3\x15\x14\x5f"
+ "\x81\x17\xe4\xb2\x6b\x41\xf7\x3a\x7f\xed\x8f\x4d\xe7\x1f\x4f\xfc"
+ "\xd2\xf9\x11\x53\x17\x33\x4c\x45\xcc\x12\x71\x55\xd2\xf9\x0b\x7c"
+ "\xea\xfc\xdd\xe1\xaa\x5f\xb2\x2a\xc5\xd5\x09\x0a\x39\xae\x4e\xe8"
+ "\x21\xc7\xd5\x89\xaf\x79\xe2\x6a\x67\x4c\x9d\x30\xc1\x1b\x9e\x32"
+ "\x9d\x7f\xe2\x68\xdf\x58\x3a\x41\xef\x3f\x96\xfe\x72\x8f\x1c\x4b"
+ "\x27\x1c\xfe\xdf\x8b\xa5\xbf\x7a\x5c\x86\xa5\xaa\x1b\xc4\xd2\x1f"
+ "\xc4\x0e\xf0\xab\x4d\x72\x2c\xfd\x95\x49\x8e\xa5\xbf\x5a\x29\x61"
+ "\xa9\x70\xed\x96\x60\xe9\xaf\x36\xde\x19\x2c\xfd\xd5\x46\x49\x56"
+ "\x9d\xb8\xb0\x7b\x2c\x9d\x90\xec\x1d\x4b\xe1\x3c\xc5\xd2\x09\xc9"
+ "\x12\x96\xd6\x75\x83\xa5\xcf\x4e\xf6\x03\x4b\xe5\x76\x00\x4f\x2c"
+ "\xbd\xe3\x76\x80\x67\x27\xf9\x65\x07\x10\xb1\xf4\xf9\xce\x76\x00"
+ "\xc4\x57\x6a\x07\x80\xf1\x12\x31\x8c\xda\x01\xc6\x33\x2c\x33\x3b"
+ "\xb2\x64\x76\x80\x5b\x8f\xad\xcf\xcd\xb1\xbb\xec\xa9\x06\xc0\xd6"
+ "\xe7\xe6\x53\x6c\x75\xd9\x53\x27\xb7\x8b\xfd\x62\x76\x80\xd7\x09"
+ "\xeb\x97\x17\x3b\xc0\x38\xda\xde\x5f\x65\x76\x00\x37\xac\x85\xb6"
+ "\xde\xf2\x8d\xb3\xcf\xd5\xc8\xec\x00\xf5\x12\xce\x5e\x43\x1f\x75"
+ "\xc0\x41\x8a\xb3\xe1\xee\x38\x3b\xe9\x6e\x8a\xb3\xe3\x44\x9c\xfd"
+ "\x8f\xc8\x36\x98\x9b\x6d\xfe\xe2\x2c\xee\x23\x38\x17\x73\x67\x70"
+ "\xb6\xd8\x0f\x9c\x75\xb3\x0d\xbc\x0b\xe3\xe1\xc2\x59\x3a\xee\x93"
+ "\xf6\x55\xce\x46\x9c\x8d\xf1\xb0\x0d\x14\x78\xb7\x0d\x9c\xb8\x13"
+ "\xb6\x81\x49\x4e\x39\xde\x4e\x8e\x92\xe3\xed\xa4\xf3\x12\xde\x0a"
+ "\xd7\x6e\x89\x6d\x60\x92\xe3\xce\xd8\x06\x26\x39\x24\xbc\x9d\x7c"
+ "\xa6\x7b\xbc\x7d\xce\xe2\x1d\x6f\xe1\x3c\xc5\xdb\xe7\x2c\x5d\xe2"
+ "\xed\x38\x77\xbc\x9d\x52\x26\xe2\xad\x64\x1b\x28\x10\x6c\x03\x59"
+ "\xdd\xdb\x06\x6a\x7d\xd8\x06\x26\xdc\x69\xdb\xc0\x94\x52\x7f\x6c"
+ "\x03\xed\xdb\x99\xdf\xfe\x1a\xf4\xdb\x9f\x03\xf8\x3b\xed\x14\x8c"
+ "\x41\xf7\x7e\xfb\xa9\xa2\xff\x69\x4c\xae\x80\xb3\xb9\x5e\x6d\x03"
+ "\x27\x1b\x7d\xdb\x06\x4e\x56\xbb\xfb\x9f\x4e\x3d\x21\xff\x6e\x35"
+ "\xb5\x4c\xfc\x6e\x75\xf2\x73\xc4\xd9\x5f\x7f\x8a\x65\x2e\xe7\x99"
+ "\x18\x16\x7b\xf0\xd7\x55\xd8\x4f\x6f\x7e\xfc\xef\x71\xee\xdf\xb2"
+ "\xa6\x0d\x72\xd9\x0a\xaa\x10\x6f\x73\x09\xc7\xc7\xf7\xc4\xb8\xe1"
+ "\xd4\x56\xf0\x22\xf2\xde\xaf\xd7\xb9\xe3\xee\xd1\xb3\xee\xb8\x3b"
+ "\x6d\x9a\x88\xbb\x4e\xc0\xdd\xf7\xeb\x73\x99\xfd\xf5\x25\xe6\x9b"
+ "\xba\xff\x25\x37\xdf\xd4\x53\x1f\x08\xb8\xfb\xfc\xe4\x32\x0b\xbc"
+ "\x7f\x57\xfe\x53\x70\xff\xc1\xb3\x37\xea\x83\x9a\xeb\xd5\x77\x4a"
+ "\xc0\x27\xaf\xfe\x53\xd0\x57\xd5\x2e\x61\xae\x3a\x61\x9e\xee\x72"
+ "\xf3\x9f\xca\x4b\x81\xf9\x2c\xec\x2b\xe9\xd2\x0f\xf5\x25\xc9\x0f"
+ "\x95\xcf\x19\x97\x87\xeb\x1b\xb7\xed\x99\x98\x0e\x3e\x3e\x80\x57"
+ "\x8f\xcb\xc3\xe7\x5f\xbf\x0e\xeb\xce\x33\xba\x00\x41\xaf\xcb\x00"
+ "\xec\xe9\xc3\xc6\xfd\xf9\x2c\x27\xac\x35\x4e\x58\x6b\xb8\x9c\x71"
+ "\x19\x0e\x94\x4d\xb6\x8f\xdb\x90\x07\x7a\x9e\xc3\x40\xf3\xab\xf6"
+ "\xca\x06\x5d\x6f\x37\xea\x79\x97\x61\x6e\xa4\x6b\x95\xd8\x1f\x11"
+ "\x47\x43\x1a\xe1\x3d\x2e\x77\x2d\xcb\x39\xbe\x93\x70\xd4\xf4\xdc"
+ "\x49\x78\xe6\x0b\x6b\x2b\x91\x77\x75\xd2\x9e\x02\x2a\x33\xfb\xf0"
+ "\x95\xc5\xbe\xb0\x18\x89\xc0\x0b\xb7\xc0\x26\xe1\xde\x1f\x39\xae"
+ "\xbf\x70\x5a\x8e\xeb\xbf\x0e\x92\xe3\xfa\x0b\xef\x4b\xb8\x2e\x5c"
+ "\x03\x5c\x07\xba\x51\x39\x1a\xd6\xbe\x9b\x94\xa3\x5f\xa8\x16\x71"
+ "\x9d\x13\x70\x3d\xff\x06\x70\xbd\x4b\x39\xda\x0d\x97\x7c\xe3\xfa"
+ "\x0b\xd5\x92\x4d\xe2\xd7\x7f\xf5\xea\x23\x7b\xd6\x1d\xd7\xa7\xe9"
+ "\x28\xae\x9f\xf5\xc4\xf5\x69\x3a\x86\xeb\xd3\x74\x3e\xf7\x13\x9c"
+ "\xf5\xfc\x9e\x36\x7d\x1b\xc5\xf5\x1a\xc1\x47\xb6\xca\x8f\xfd\x04"
+ "\x35\x0c\xd3\x45\x2c\x47\x7b\xd5\x9d\xb5\x49\x4c\xf7\x99\xff\xcb"
+ "\x9b\x4d\x82\x62\x79\x33\xc3\x72\xc4\x46\x11\xcf\x6f\x64\x3f\x41"
+ "\x77\x78\x2e\xca\xcd\x88\xe7\xbe\xe4\x66\x39\x9e\xcf\xd8\x26\xc7"
+ "\xf3\x19\x3b\xe4\x78\x3e\x73\x9b\x1c\xcf\x67\xe6\x78\xe2\x79\x67"
+ "\x2c\x9f\x71\xd1\x1b\x8e\xeb\x5f\x44\x1b\xc5\xcc\xf1\xbe\x31\xfc"
+ "\x45\xb5\xff\x18\xfe\x9b\xd0\xff\x75\x18\xae\xf2\xc4\xf0\xdf\x4c"
+ "\x42\x0c\x72\x66\x7a\x60\xf8\x22\x01\xc3\x05\x1c\xd9\xdd\x24\xc8"
+ "\xc2\x9e\x18\xde\x0c\xef\xd1\x8d\x3e\xee\xf8\xa7\x27\x86\xeb\x9e"
+ "\x96\x61\xb8\xaa\x1b\x0c\x5f\xc4\xec\x20\x32\xbf\x5c\x1f\xb6\x10"
+ "\x78\x8f\x69\xbb\x7c\xc8\xe6\xe2\x98\xb9\xf7\x47\x8e\xe1\xba\x1d"
+ "\x72\x0c\xd7\x95\xcb\x31\x5c\xb7\x4e\xc2\x70\xe1\xda\x2d\x91\xcd"
+ "\x75\xb9\xb7\x5c\x36\x17\xf9\xa3\x4b\x0c\xd7\xe5\x4a\xb2\xf9\xcc"
+ "\x95\xdd\x63\xf8\x8b\x91\xde\x31\x1c\xce\x53\x0c\x7f\x31\xd2\xe7"
+ "\x3e\x87\x4e\x18\xfe\xd2\x0c\x3f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0"
+ "\x85\xec\x76\xb3\x85\x38\x0d\xcc\x16\xb2\xab\x89\xf1\x46\x1f\x05"
+ "\xe3\x53\xe0\x9f\x88\x7c\x65\xd7\xba\xdb\xae\x9b\xb2\x83\xbc\x34"
+ "\xdd\x1f\x3b\x08\xc5\x6f\xdc\xe3\x30\x13\x70\xbb\xea\x06\xf7\x38"
+ "\x4c\x14\xf7\x38\x18\x7d\xec\x71\x10\xf0\x7c\xee\xf7\xc0\x73\xba"
+ "\xc7\x61\x56\x9c\xdc\xc6\x3c\x6b\xa1\x68\x63\x66\x78\x3e\x6f\xb5"
+ "\x1c\xcf\xe7\x25\xbb\xf6\x3c\x00\xe6\x9b\xf5\x5b\x3b\xed\x79\x70"
+ "\x61\x3b\xb5\x83\xce\x2a\x33\xbd\xd8\x40\x5c\xf8\x3e\x5b\xc2\x77"
+ "\x68\xeb\x11\x19\xb6\xd7\xbb\x63\xfb\x2c\xab\x0c\xdb\xcf\xe5\xca"
+ "\xfd\x23\xea\xf5\x6e\xd8\x2e\xee\x79\x98\x7d\xa9\xac\xb6\x1b\x6c"
+ "\x87\xfb\x6f\x7c\x8f\xd8\xad\xc5\x76\x71\x7f\x83\x57\x6c\x77\xdf"
+ "\xdf\xe0\xe6\xff\x80\xd8\x4e\x73\x54\xf4\xf5\xc0\xf6\x35\xf1\x4a"
+ "\xe7\x87\x30\x1f\x00\xd7\x71\x8e\x38\x79\xc0\x76\x3a\xde\x73\xb4"
+ "\xee\xd8\x7e\xdd\xc0\xb0\xfd\xcd\xa6\xef\x8f\xed\x2e\x79\xd8\x1d"
+ "\xdb\x7f\x89\xd8\x3e\x77\x10\xdb\x7f\x91\x71\x63\xfb\x2f\x3c\xfc"
+ "\x33\xde\xbc\x01\xfb\x4b\x97\x18\xef\xa5\x5f\x72\x8c\x9f\xbb\x56"
+ "\x8e\xf1\x73\x8b\xe4\x18\x3f\x37\x4e\xc2\x78\xe1\xda\x2d\x91\xd3"
+ "\xe7\xa6\xde\x19\xfb\xcb\xdc\x54\x09\xe3\xe7\xcd\xec\x7e\xef\xc5"
+ "\x2c\xbb\x77\xdf\x0c\x38\x4f\x31\x7e\x96\xbd\xcb\xbd\x17\x32\x7b"
+ "\x77\xcc\xb3\x5e\xf7\x5e\x54\xfd\x70\xbe\x19\xee\xbc\xe2\x69\x7f"
+ "\xb9\x79\xdb\x77\xcc\x44\x7f\xed\x2f\xb8\xf7\x62\xcd\x69\xb7\xbd"
+ "\x17\xb5\xdd\xef\xbd\x48\x9d\x71\x83\xf6\x97\x2e\x7c\x33\x4e\x4e"
+ "\x73\xf7\x77\x9b\x3f\x41\x8e\xef\xf3\x9f\x75\xe1\xfb\x0b\x88\xef"
+ "\x71\x73\xe4\xf8\x1e\x37\x1b\xfb\xe9\x6d\x2f\xc6\x7b\xb2\xef\x8a"
+ "\xf3\xf7\xc9\x7d\x35\x3c\xec\x2f\x2f\x20\xef\xc5\xf5\x96\xe1\xfb"
+ "\x39\x77\x7c\x9f\x5f\xe5\x4d\x76\x47\xbb\x37\xf5\x29\x9e\xeb\xb6"
+ "\xa7\x6d\x8a\xe8\xff\xb6\xe0\x4c\x99\x0e\xde\xdf\xe2\xc3\xd7\x6d"
+ "\x2e\xf3\x75\xa3\xbe\x6d\x68\x07\x87\xb6\x0e\xcd\xd5\x2b\xd3\x62"
+ "\x78\x0e\x7d\xdd\x3c\xfd\xdc\xd0\xf7\x0d\x7d\xdd\x2a\xe2\x8d\x3e"
+ "\xfd\xdc\x90\x37\x7d\xf9\xba\x41\xbf\xd5\x14\xeb\xbf\x16\xb0\x5e"
+ "\xf0\x75\xcb\x4b\x92\x7c\xdd\x64\x58\xef\xc5\x7f\xf8\xdd\x73\x19"
+ "\xde\xe5\xf8\x74\x09\xeb\x3b\x50\x8e\x7f\xd2\xc3\x16\x43\x69\xf0"
+ "\xb2\xfa\x07\xb5\xc5\x50\xac\x8f\xbd\xbb\x12\xf9\x78\xb6\xde\x8b"
+ "\x2d\xa6\xb3\x8f\xf3\x0f\x67\x8b\x89\x9d\x2f\xc7\xf8\xd8\x1c\x39"
+ "\xc6\xc7\x3e\x2b\x61\xbc\x70\xed\x96\x60\x7c\x6c\xcc\x9d\xb1\xc5"
+ "\xc4\xc6\x48\xb6\x98\xb8\xb1\x5e\xfd\xef\x64\x36\xf6\xf9\x35\xde"
+ "\x6d\xec\xf3\x05\xff\xbb\xf9\x35\x3e\xf7\x84\x74\xfa\xa6\xf9\xdb"
+ "\x01\xcc\xc6\x7e\x13\x7b\x42\x6a\x7f\x6c\xb6\x98\xdf\x6a\xfc\xb5"
+ "\xc5\x50\xdf\xe6\xd3\xe8\x1f\xe2\xdf\x9e\x90\xee\xb0\xdd\x25\xbb"
+ "\x77\xf1\x0d\x53\x8e\xed\xaf\x0c\x90\x63\xfb\x2b\x83\xe4\xd8\xfe"
+ "\xbb\x11\x72\x6c\xff\xdd\x70\x4f\x6c\xef\x8c\xeb\xaf\xac\xf4\x86"
+ "\xe9\xfa\x17\xd0\x16\xb3\xa8\xd6\x37\x9e\xbf\x52\xe0\x3f\x9e\xc7"
+ "\xbf\xf5\xbf\x1a\xcf\x55\x9e\x78\x1e\xdf\xf0\x83\xda\x65\x28\x9e"
+ "\x2f\x3c\x23\xc3\x73\x55\x37\x78\xfe\x83\xd9\x65\x16\x3d\x26\xc7"
+ "\xf3\x45\xb1\x72\x3c\x5f\x74\xbf\x84\xe7\xc2\xb5\x5b\x62\x97\x59"
+ "\x14\x75\x67\xec\x32\x8b\xa2\x24\x99\xfd\x77\xbd\xbb\xc7\xf3\x57"
+ "\x0a\xbd\xe3\x39\x9c\xa7\x78\xfe\x4a\xa1\x4f\x7f\xea\x4e\x78\xfe"
+ "\xbb\x4b\x7e\xe0\xb9\x57\x1f\x95\x1f\x87\x5d\xe6\x77\xcd\xfe\xda"
+ "\x65\x7c\xed\x53\x41\x7c\x97\xfc\x53\xdc\xf6\xa9\x44\x8b\xfb\x54"
+ "\x32\xe4\xfe\x29\xb7\x1c\xdb\x17\x3b\xe5\xd8\xbe\x44\x21\xc7\xf6"
+ "\xe5\x0f\xc8\xb1\x7d\x79\xa4\xd8\x4f\x66\x97\x31\x74\xda\xb7\x22"
+ "\xc7\xf9\x25\xf3\x4d\x2f\x34\x10\x6f\x58\x7f\x41\xa1\xaf\xf0\x8d"
+ "\xf3\x4b\xb2\x7c\xe1\x3c\xfa\xab\xfc\x65\x6e\xbc\x17\x9c\x5f\xba"
+ "\xe5\xff\x07\x9c\xf7\xe5\x87\x42\xf5\x20\xc0\x78\xc4\x7b\x8a\xef"
+ "\x02\xd6\x23\xce\x3b\xff\xe1\xcd\x46\xb3\xb4\xfc\x76\xe1\xbc\x6f"
+ "\x1b\xcd\xb2\xb2\xca\xd9\x02\xce\xdf\xc8\x1e\x9a\xe3\x72\x1b\x4d"
+ "\xde\xa2\xdb\x6d\xa3\xd1\x0f\x90\xe3\xbd\x7e\xba\x1c\xef\xf5\x77"
+ "\x4b\x78\x2f\x5c\xbb\x25\xf2\xbb\x5e\x73\x67\x6c\x34\x7a\x8d\x84"
+ "\xf7\x7a\x67\xf7\x78\xbf\xc4\xe8\x1d\xef\x97\x08\xb1\xd9\x96\x18"
+ "\x6f\x1c\xef\x97\xbb\xf0\xbe\xf3\xfe\x99\x8c\x9b\xf7\x91\x79\xfa"
+ "\x4e\xdb\x68\x96\xfb\xc4\xff\xae\xe2\x63\xdc\xbc\x8d\x46\xd8\x93"
+ "\xb8\xc0\x7b\x7c\x8c\xb2\x2e\x7c\x64\xca\xca\xdd\xb1\x3e\xe1\xa2"
+ "\xdc\x17\x31\xe1\x92\xe8\x8b\x58\x56\x89\x58\xbf\xaa\xaf\x1c\xeb"
+ "\x57\xa9\x7d\xd9\x68\xde\xe5\xdc\x7d\x12\x57\x3c\x2b\xb7\xd1\x14"
+ "\xc8\x6d\x34\x53\x90\xf7\x92\x4e\xf8\xc6\xfa\x15\x89\x72\x1f\x70"
+ "\xb6\x47\xf1\xad\xb9\x82\x0f\xf8\x5c\x37\x1f\xf0\xe7\xfe\x28\x60"
+ "\x7d\xe2\x96\xd2\x2a\x07\xf1\xc7\x0f\xf1\xfb\xfb\x7a\x67\x79\xf5"
+ "\x41\xa4\x6b\x40\x17\x7e\x88\xf3\xce\xa8\xd0\xa7\x79\x4c\x7e\x92"
+ "\x9b\x1f\x62\x17\xf1\x8c\x65\xf8\x3f\x57\xef\x13\xff\xdb\x79\x09"
+ "\xff\xb9\x9f\x49\x76\x1b\x0e\xe5\x7c\x4a\x97\xc4\xf2\xdb\x65\xb7"
+ "\xf1\x66\x27\x31\x8d\x43\xfc\x5f\x79\x9c\xc9\xf9\xf1\x3f\x32\xbb"
+ "\x4d\xd2\xfd\x72\xdc\x4f\x9a\x24\xc7\xfd\x24\x85\x84\xfb\xc2\xb5"
+ "\x5b\xe2\x8b\x9e\x14\x71\x67\xe4\xfc\xa4\x08\xc9\x6e\x93\x74\xb5"
+ "\x7b\xdc\x5f\x91\xea\x1d\xf7\x57\xa4\x32\xdc\x5f\x91\xda\xa5\xdd"
+ "\x46\xe6\x1b\xb9\xea\xcc\xf7\xb6\xdb\x88\x72\xfe\x1d\xdf\xd7\xb3"
+ "\xaa\xc6\x1f\xbb\x8d\x6b\x4f\xfa\xf7\xb2\xdb\x78\xc7\x7b\x51\xb6"
+ "\x2f\xeb\xe2\x9b\xab\x1c\xef\x93\xcf\xc8\xf1\x3e\xb9\x4e\x8e\xf7"
+ "\xa9\xed\x72\xbc\x4f\xb5\x7b\xb3\xdb\xc8\xb1\x7e\xf5\x08\x6f\x38"
+ "\xaf\x9f\x82\x76\x9b\xd4\x42\xdf\x18\xbf\x5a\xe7\x3f\xc6\xa7\xac"
+ "\xfc\x3f\x8c\xf7\xc0\x78\x95\x27\xc6\xa7\x14\xfd\xa0\x32\x3e\xc5"
+ "\xf8\x35\xfb\x64\x18\x7f\x0b\x6d\x39\x37\xb2\x9f\xc4\xb7\x6c\xbf"
+ "\xc6\xc3\xff\x3d\xd5\xc3\xff\x7d\x8d\x9b\xff\x7b\x6a\xd4\xad\xc3"
+ "\xf8\x35\xb7\xde\xff\xfd\x86\x30\x7e\x8d\x9b\xff\x7b\xea\x99\xee"
+ "\x31\x7e\x75\x8c\x77\x8c\x87\xf3\x14\xe3\x57\xc7\x74\x29\xdb\xcb"
+ "\x30\x7e\xed\xfb\xb7\xc3\x96\x73\x67\xf6\x1b\xad\x3d\xe2\x8f\x3d"
+ "\xa7\xab\xb8\x23\x3e\xed\x39\xa3\x45\x7b\x8e\xde\x87\x3d\xe7\x56"
+ "\x61\x7e\x5a\x85\x1c\xf3\xd3\x3e\x95\x63\xfe\x7a\x85\x1c\xf3\xd7"
+ "\x13\xb9\x3d\x27\xa1\x93\x3d\x47\x8e\xff\xe9\x8f\x99\xa6\xb8\xdb"
+ "\x73\x0a\xdc\xec\x39\x86\xbf\xfa\xc6\xff\x74\x9f\xf8\x7f\x8d\xe2"
+ "\x7f\x8c\x17\xfc\xcf\xf8\x5f\x82\xff\x31\xdf\x03\xff\x33\xee\x00"
+ "\xfe\xaf\x3b\xc0\x6c\x3c\x37\x18\x27\xe5\x5d\xff\x6d\x3c\xdf\x6f"
+ "\x1d\x30\xf4\x90\xaf\x03\x86\xd1\xf2\x75\x60\xdd\x25\x69\x1d\x10"
+ "\xae\xdd\x92\x75\xc0\x10\x78\x67\xd6\x01\x43\xa0\xb4\x0e\x18\xbe"
+ "\xee\x7e\x1d\x48\xf7\xb1\x0e\xa4\x0b\xeb\x40\xba\x1f\xeb\xc0\xfa"
+ "\x4f\x7d\xdb\x78\xf4\x37\x6f\xe3\xf9\xf9\x9d\xde\x07\xb5\xbe\xca"
+ "\x2f\x1b\xcf\xf6\xf1\xd1\xe5\x18\x23\xe5\x6b\xa2\x5c\x33\x5f\xb4"
+ "\xf1\x98\x3c\x6c\x3c\xa6\x4e\x36\x9e\xd5\x5f\x0b\xf8\x3f\x49\xd8"
+ "\x6f\x3a\xe5\x7b\xc4\x48\xa1\x39\x94\x37\x54\xc8\xfd\xe6\x37\x50"
+ "\xfc\x97\xe2\xf7\x65\xcd\xc1\x7e\xb1\xf5\xc7\xd4\x45\x0c\xd4\x57"
+ "\x1f\x90\xd9\x74\x26\x79\x8b\x91\x92\x25\xf3\xbb\x91\xef\x37\x7d"
+ "\x75\xa2\x0c\xef\xa7\xb0\xfd\xa6\x6f\x7b\xfb\x4e\xeb\x8a\xc9\x9f"
+ "\x39\x93\xc6\xe4\x77\xc5\xf2\x7b\x75\xe3\x0d\xc5\x92\x9e\x2b\xc4"
+ "\x92\x3e\x77\x07\x62\x49\xdf\x68\x4c\xfe\x73\x9e\xf1\xfb\x32\xaf"
+ "\x9a\xcb\x4d\xa4\x12\x79\x64\xb6\x67\xec\x53\x93\xf7\xbd\xfb\x4a"
+ "\x61\xef\xfe\xd2\xdb\x13\x07\x05\xfb\x43\xd7\xfc\xb0\xac\x69\x07"
+ "\xd2\xac\xb4\x3f\x98\xaf\xfa\x82\xe2\x3f\x57\x97\x03\xaf\x72\x88"
+ "\xa7\x09\x88\xa7\xff\xb9\x9f\xd6\xfd\x1a\x78\x21\x2c\x82\xca\x3f"
+ "\xd9\x1c\x09\xd6\x27\x21\xb6\xfe\x27\xf5\xfb\x02\x31\x02\xb0\x95"
+ "\xd5\x5b\xfb\x35\xef\x74\x86\x69\x30\xa7\xf5\x5d\x07\x97\x56\xf5"
+ "\xa8\xb4\xd8\x60\x5e\x34\xe1\x9e\x58\x85\xd9\xd1\x66\x42\x5a\x1c"
+ "\x5d\x5a\x15\xc8\x03\xfe\xee\xfe\x2d\x09\xf2\x6f\x9e\xfe\x67\x32"
+ "\x95\x67\x70\xdd\x0b\xcb\x9a\x8d\x71\x40\x44\xd9\x8a\xfb\x4e\xb2"
+ "\x6f\xed\x82\xf1\xe1\x78\xb6\xf6\xcd\x5b\xc8\x70\x03\x9e\x37\x06"
+ "\xc6\x92\xfa\xd8\x22\x6e\xd0\x1c\x56\x80\x1b\xf9\x2d\xd2\x77\x6c"
+ "\x6c\x1f\xc7\x88\xd9\x51\xb2\x24\xff\x17\x8b\x2f\x6c\x7d\x75\x9a"
+ "\x77\x6c\x7d\x75\x1a\xc3\xd6\x57\xa7\xb9\xb0\xd5\xe2\xc5\x8e\x22"
+ "\xf3\x63\x7f\x4d\xf0\x7f\x31\x79\xc8\xd8\xa6\x7f\xc1\xf8\x28\xaf"
+ "\xf9\xe5\xff\x42\xf1\x74\x31\xc3\x53\xc4\x2b\x11\x53\x25\x3b\x8a"
+ "\xc9\xa7\x1d\xa5\x3b\x4c\xf5\x6b\x0f\x3f\xc5\xd4\xd7\x07\xc8\x31"
+ "\xf5\xf5\x41\x72\x4c\xdd\xb4\xcf\x13\x53\x3b\xe3\xe9\xeb\x71\xde"
+ "\xb0\x94\xc5\x47\xd9\x34\xdd\x37\x8e\xbe\x6e\xf4\x85\xa3\xd4\x3f"
+ "\x7d\xae\x9b\x7f\xba\x0b\x47\x7f\xbf\x47\x8e\xa3\xaf\x57\xdf\x28"
+ "\x8e\xd2\xdc\x26\xe7\x7e\x80\xdc\x26\x37\x8d\xa3\x7a\x0f\x1c\xdd"
+ "\x38\x56\xc2\x51\xcf\xfc\x26\xdd\xe0\xe8\xa2\xdb\x13\x03\x45\x86"
+ "\xa3\x9c\x95\xf6\x47\xb3\x94\xf6\xf5\xb8\x1c\x47\x37\xda\x7c\xe3"
+ "\xe8\xc6\x2d\x12\x8e\xb2\x7a\xb7\x17\x47\x37\x9a\x64\x38\xba\xc8"
+ "\x0d\x47\xff\x29\xe9\x10\xe8\x63\xe1\xc2\xd1\x25\x6e\x38\xba\xa8"
+ "\x3b\x1c\xdd\x68\xc2\x31\x62\x32\xea\xa6\x57\xbb\xc7\xd1\xd7\x73"
+ "\xbd\xe3\x28\x9c\xa7\x38\xfa\x7a\xae\x84\xa3\x5e\x64\x54\x19\x8e"
+ "\x66\x2f\xf4\x03\x47\x7f\xe4\xb1\x51\xb2\xe3\xfd\xb2\x55\x48\x7b"
+ "\x3a\x3b\xc7\x48\x9d\xe3\xbe\x27\xa8\xd8\x23\xef\x49\x71\xa7\xbc"
+ "\x27\xab\xc5\x3d\x9e\x13\x05\x5c\x7d\xee\x7b\xe0\x2a\xdd\xe3\xb9"
+ "\x79\xb5\xdc\xf7\x64\xf3\x5a\xd1\xf7\x84\xe1\xea\x1b\xa1\x62\xbf"
+ "\xa4\xbc\x27\xc5\x5d\xc4\x48\xdd\x5c\x21\x8b\x8d\x32\xd1\x3d\x36"
+ "\xca\xd6\xe3\xbe\x63\xa4\x6e\xb6\xc9\x62\xa3\x9c\x2c\x74\xe5\x3d"
+ "\xf1\x8c\x91\x2a\x61\xec\x96\x1e\x14\x63\x5d\x31\xa8\x8c\xa3\x5d"
+ "\x31\x52\xbb\xd9\x17\x84\xed\x1c\xac\x8f\xbf\xfd\x18\x6b\xf2\x03"
+ "\x63\x65\x79\x4f\x3c\x63\x4c\x6d\x79\xcb\x5c\x5a\x4c\x2a\x63\x8a"
+ "\xbd\xc4\x46\x2d\xbe\xa3\xb9\x4f\xb0\x5f\xde\xb1\x76\xeb\x08\x39"
+ "\xd6\x6e\x8d\xa1\x75\xeb\xbc\x61\xed\x16\xa7\x84\xb5\xac\xde\xda"
+ "\x3a\x0f\xac\xad\xf5\x81\xb5\xb0\xae\xee\xbe\xe0\x2f\xd6\x6e\x1d"
+ "\x4e\xb1\xd6\x20\x60\x6d\xd3\xad\xc6\xda\xad\xc3\x25\xac\xdd\x7a"
+ "\xa5\xfb\x1c\x53\x9b\x1d\xde\xf7\xe5\x6c\x76\x30\xac\xdd\xec\xe8"
+ "\x32\xc7\x94\xcc\xe7\xe3\x8d\xaf\xc5\x1c\x53\x92\x3d\xa0\x58\xb0"
+ "\x07\xfc\x2b\xe7\x44\x79\xc3\xe2\xaf\x3d\xe0\x13\xd0\xdd\x71\xdf"
+ "\xe5\x1a\xcc\x39\x35\x1b\x73\xa2\x14\x79\xd8\x03\x8a\x3a\xdb\x03"
+ "\x66\x76\x8d\xb1\x7e\xd9\x03\xe8\xbe\xcb\x9c\x3a\x39\xc6\xe6\x7c"
+ "\x2d\xc7\xd8\xdc\xd5\xe2\x3e\x4b\xec\x8f\xef\x98\xa9\xdb\x46\xb8"
+ "\xec\x01\xb5\x72\x6c\x95\xec\x01\xb9\x8f\xf8\xc6\xd8\x6d\x72\xfb"
+ "\xef\x73\x85\xb2\x7d\x96\x6f\xd7\xbb\xc7\xa1\x16\xe3\x4f\x6d\x5f"
+ "\x59\x56\xed\x8e\xb1\xdb\xf2\xfe\x95\xe2\x50\xbb\x62\x4d\x75\xe3"
+ "\xcb\xdd\x39\x0e\xf5\x1f\x42\xcd\xa5\x45\x04\xf7\xb6\x51\xbc\x95"
+ "\xd9\x06\x8a\xee\x8c\x6d\xa0\xb4\xc8\x87\x6d\xe0\x0f\xdb\xe4\x38"
+ "\xfb\x87\x52\x5a\xf7\x8c\x37\x9c\xfd\x43\x9c\x84\xb3\xac\xde\xda"
+ "\x33\x1e\x38\x5b\x73\x2b\x65\xda\x3f\xe4\xdc\x5e\xdb\xc0\x1f\x72"
+ "\x24\xdb\x40\xee\x0d\xec\x7f\xdc\x16\xe3\x1d\x67\xb7\x09\x76\xd7"
+ "\x6d\x92\xdd\xb5\xc6\x4b\xbe\x14\x19\xce\xee\x18\x2b\xee\x7f\xa4"
+ "\x32\x6d\xad\x28\xd3\x16\xfd\x0b\xe6\x4b\xd9\x31\xc6\x5f\xdb\x00"
+ "\xee\x73\x47\x6c\x45\xec\x12\xf1\x55\xb2\x0d\x14\xf9\xb6\x0d\x74"
+ "\x83\xaf\xfe\xe7\xee\xdb\x39\x56\x8e\xaf\x3b\x9f\x96\xe3\xeb\xae"
+ "\x0a\x4f\x7c\xed\x8c\xad\x3b\xd7\x79\xc3\x55\x66\x1b\xd8\x95\xea"
+ "\x1b\x53\x77\xee\xf7\x85\xa9\x34\xa6\x5f\xbd\xe4\x23\x2d\x61\xea"
+ "\x9b\x65\x72\x4c\xdd\x69\xbd\x51\x4c\xbd\x23\xf9\x52\x6e\x1a\x53"
+ "\xe3\x3d\x30\x35\x2f\x4e\xc2\x54\xcf\x9c\x29\xdd\x60\xea\xed\xb2"
+ "\x13\xb8\x63\xaa\x4c\x76\xcd\xbb\x28\xc7\xd4\x5d\x91\xbe\x31\x35"
+ "\xef\x5d\x09\x53\x59\xbd\xdb\x8b\xa9\x79\x8d\xb7\xd7\x4e\x90\xd7"
+ "\x28\xc9\xae\xbb\x0e\x74\x8f\xa9\x3b\x0f\x7b\xc7\xd4\x9d\x87\x19"
+ "\xa6\xee\x3c\x7c\xe3\x7b\xca\xf3\xb7\xf8\x81\xa9\x3f\xf2\x5c\x2a"
+ "\xf9\x46\xbf\xed\x04\x68\x6f\x45\x2c\xad\xfd\x7e\xb1\x43\x92\xc5"
+ "\xd8\x21\xe3\x05\x8c\xfd\xe5\xf7\xc5\xd8\xdd\x7b\xe4\x3e\x0d\xbb"
+ "\xf7\x89\x3e\x0d\x0c\x63\xff\x6b\x82\x3c\x3f\x6a\xe7\x58\x21\xf2"
+ "\x18\xaa\xbb\xaf\xba\xec\x04\x88\xb9\xe3\xdd\xed\x04\x7f\xbc\xea"
+ "\x1b\x6f\x0b\x22\x65\x76\x82\x8f\xbc\xe3\xed\x35\x19\xde\xee\xf9"
+ "\x39\xc5\x5b\x57\x0c\xd5\x82\x18\x31\x86\x6a\xb7\x32\xac\x0c\x6f"
+ "\x63\x7e\x18\xbc\x2d\xbe\x71\xbc\x95\xe7\x52\xf1\x8c\x97\xba\xa7"
+ "\xce\x5c\x02\x78\x4b\xe3\x75\x78\xc6\x4c\xbd\xb1\x78\x1d\xb7\x2b"
+ "\x66\x2a\xf6\xcb\x3b\xee\xfe\x71\xbe\x1c\x77\xff\x98\x43\xeb\x7a"
+ "\xc5\xdd\x3f\x3e\x26\xe1\x2e\xab\x77\xc3\xb8\x7b\x53\x36\x83\x3f"
+ "\xc6\xdc\x5e\x9b\xc1\x1f\x63\x24\xdc\xfd\xaf\x41\xdd\xe3\x6e\xc1"
+ "\x40\xef\xb8\x5b\x30\x90\xe1\x6e\xc1\xc0\x2e\x71\x57\xe6\x43\xb0"
+ "\xb7\xaf\xd7\x58\x1e\xb5\xff\xea\x79\x56\xf6\xaa\x6f\xc6\x66\x00"
+ "\x18\xac\x4c\xc5\x18\x4e\x31\xe8\x43\xd0\xbd\xcd\xa0\x3b\xbc\xf5"
+ "\xdf\x66\xb0\x2f\x54\x8e\xb7\xfb\xfa\xca\xf1\xb6\xf0\x38\xf6\xab"
+ "\x4b\x9b\x01\xc5\x80\x7d\xf3\x5d\x36\x03\x8b\x1c\x67\x25\x9b\x41"
+ "\xe1\x72\xdf\xdf\xbe\xf6\x6d\x94\xc9\xb7\xbf\xf4\x88\x59\x3d\x57"
+ "\xc2\xdb\x93\x95\xa2\xcf\xd8\x9f\xde\x2f\x9b\xe6\x8e\xb7\xfb\xaa"
+ "\x3a\xc5\xac\x9e\x7e\x0b\x63\x56\x4f\xbf\xc5\x31\xab\x67\xc8\x63"
+ "\x56\xef\xbc\x26\xf9\x91\xf9\x1f\xb3\xfa\xcf\x33\x29\x06\x23\x0f"
+ "\x61\xdc\xea\x1b\xb1\x23\xdc\xe6\x5c\x2b\x32\xec\x95\xd9\x11\xfe"
+ "\x5c\x27\xc7\xde\x42\x95\x6f\xec\xfd\xf3\x01\x09\x7b\x59\xbd\xdb"
+ "\x2b\xf3\xfe\xb9\xf6\xf6\xda\x11\xfe\x5c\x2b\xd9\x11\x0a\xf7\x78"
+ "\xc5\x5e\xd9\xb7\xb1\x7d\x39\xde\xbf\x8d\xc1\x79\x8a\xbd\xfb\x72"
+ "\x7c\xda\x11\x3a\xf9\x6f\xbd\xf5\x2a\xfb\x36\x26\xc8\xbc\x16\x3f"
+ "\xec\x08\x3f\x3a\x1f\x83\xb7\x36\xdc\x8c\x1d\x01\xf1\x16\xf1\x4c"
+ "\xc4\xdc\x1b\xb1\x23\xdc\x7a\x19\xf7\xed\x57\xe5\x98\xfb\xf6\x6b"
+ "\x72\xcc\x3d\xf8\x88\x27\xe6\x76\xc6\xdb\xb7\xcb\xbc\x61\x2d\xb3"
+ "\x23\x1c\xa8\xf1\x8d\xb3\x6f\xdb\x7c\xe2\xac\x87\x6f\xae\x84\xb3"
+ "\xfb\x07\xc9\x71\xf6\x2f\xa3\x6f\x0a\x67\x6f\x34\x07\xcb\x8f\x0a"
+ "\x67\x63\x3c\x70\x76\xff\x71\x09\x67\x3d\xf3\xb0\x74\x83\xb3\xb7"
+ "\x29\x0f\x8b\x6f\x19\xf7\xc0\x04\x39\xce\x1e\x48\xf6\x8d\xb3\x07"
+ "\xfa\x4a\x38\xcb\xea\xdd\x5e\x9c\x3d\x30\xfe\xf6\xda\x16\x0e\x8c"
+ "\x97\x64\xdc\x83\x77\x77\x8f\xb3\x6f\x3b\xbc\xe3\xec\xdb\xc2\x77"
+ "\xb1\xb7\x1d\x3e\x65\xdc\x4e\x38\x7b\xf0\x92\x1f\x38\xfb\x23\xf7"
+ "\x41\x38\xe8\x57\xfc\x0b\x37\x7b\x6d\x4f\xb3\xc5\x63\xbf\xc4\x19"
+ "\xf7\xfd\x12\x6e\xb6\x85\xf1\xa2\x6d\x41\x9e\x9f\x25\x59\xb4\xdf"
+ "\x46\x0b\xb8\x3b\xee\xfb\xe2\xee\x21\x67\x9b\x0b\x77\x13\x00\x77"
+ "\x8b\xe8\xfe\x88\x36\x17\xee\xfe\xf7\x3b\x62\xbf\xa4\xfc\x2c\x3e"
+ "\x6c\x0b\x4f\x60\x7b\x45\xcf\xbb\x6c\x0b\x88\xc3\xd1\xee\xb6\x85"
+ "\xff\x8e\xf3\x8d\xc1\x45\xc9\x32\xdb\xc2\x07\xde\x31\xd8\x26\xc3"
+ "\xe0\xbf\xbe\x45\x31\xf8\x09\x11\x83\x8b\x8e\x5c\x03\xdd\xf2\x5a"
+ "\xa6\x7f\x18\x6c\xa3\x18\x3c\xf1\xce\x60\xf0\xe1\x5b\x80\xc1\x74"
+ "\xdc\xff\x36\xd9\x6c\x02\x0c\x9e\x8d\x18\x3c\xf1\xc6\xec\x0d\x3f"
+ "\x50\x8e\x16\xec\x97\x77\x2c\xfe\xdb\xa7\x72\x2c\xfe\xef\x40\x5a"
+ "\xd7\x2b\x16\xff\x6d\x8f\x84\xc5\xac\xde\xed\xb5\x37\xfc\xad\xea"
+ "\xf6\xda\x1b\xfe\x56\x25\x61\xf1\x7f\x6f\xeb\x1e\x8b\x8b\x32\xbc"
+ "\x63\x31\x9c\xa7\x58\x5c\x94\xd1\x25\x16\x3f\xe1\x8e\xc5\x87\x5d"
+ "\x32\xaf\xcc\xde\x60\xf9\x57\xcf\xdd\x72\xd8\xa7\xfc\xab\x79\x90"
+ "\x64\xd4\x2b\x0e\xd7\x99\xf3\x08\x69\x35\x90\x0c\xb3\xe3\x09\x02"
+ "\xe7\x60\xfc\xde\xe9\x61\x8e\x18\x4d\xb8\xad\x5a\x8a\xc7\x6f\xe0"
+ "\x3f\xc8\xb8\x46\xa5\x30\xb7\xe8\x18\xbf\x43\xfd\x5d\xf1\x3c\x62"
+ "\xef\x6e\xb7\xeb\xde\x9e\xc5\x1b\x87\x34\x08\xf7\xc5\xb0\x7d\x37"
+ "\x43\x1a\xc5\x32\xf2\xa6\x45\xf1\x4e\x2c\xbf\x65\x88\xc5\x1a\x3a"
+ "\xc4\xe2\xed\xfe\x87\x55\x24\xa8\xcf\x3a\x9e\xcf\xdf\xce\xdb\x5a"
+ "\x07\x3f\x10\xd5\xfa\x3a\x21\xc6\xed\xbc\xb5\x2d\xf3\x9d\x3c\x78"
+ "\xc7\x92\x3f\x40\xbd\xd6\xb0\x3d\x51\xad\x86\x69\x04\xce\x15\x89"
+ "\xe7\x60\xdc\x08\x67\x08\xe0\x39\xb8\xc6\x6f\xbd\x12\xb9\x3b\x0d"
+ "\xb0\x2a\x95\x90\x91\xd7\x70\xce\xbc\x63\x02\x9e\x51\x67\x43\x9b"
+ "\x9b\xa1\x2d\xfe\xbe\xfe\x36\xe0\xc7\xc0\x4a\x18\x31\x78\xef\x2c"
+ "\x78\xaf\x82\x6c\x1c\xfb\x80\xa1\xb9\xbc\x32\x90\x70\xfb\x22\xb3"
+ "\xf8\xbe\x13\xa2\x81\x1e\xc4\x98\x40\x68\x4e\x8d\xcd\x50\x8f\x57"
+ "\xa6\xf3\xdc\xa0\xfe\x2a\xb3\xc3\xc6\xe6\x34\xf4\xef\x28\xe8\xb1"
+ "\x3c\x3c\x37\x3f\x81\xa8\xe0\x3f\x98\xdf\x36\x21\xba\x2d\xf3\x7f"
+ "\x26\xc2\x7b\x46\x61\xbf\x7c\xbd\xe3\xe6\x9d\xb0\xee\xf4\x8f\xc0"
+ "\xb5\x83\x3e\x1f\x9f\x4d\x9f\xa3\xe4\xb2\x9c\x70\x9e\x37\xa4\xf3"
+ "\xe6\x64\x07\x09\x81\xb1\xd8\x0d\xfd\x46\x7e\xe4\xfe\xf4\x40\xd4"
+ "\xfa\x7e\x84\x1c\x4c\x69\x54\x9a\xa1\xef\xce\x3f\xf4\xb7\x99\xd2"
+ "\x7e\x4a\xe0\xba\x15\x75\x96\x0b\x8a\xbf\x4f\x98\x7a\x91\x10\xc4"
+ "\x13\xf8\xfd\xbc\x0d\xd6\xb1\xc9\x50\xde\x0c\xef\xc1\xb5\x46\x04"
+ "\x62\xdd\x0b\x8a\xff\x71\x9a\x92\xce\x92\x10\x3d\x09\xca\x86\x77"
+ "\x63\x75\xff\xa7\x1c\xeb\x5a\x14\x7f\x9f\x86\x7d\x80\xb2\x05\xca"
+ "\x78\x1f\xfa\x90\x11\x7e\x6f\x64\x16\xe5\xcd\x9c\x09\xd1\xdc\xa0"
+ "\xc8\x2c\x8a\x7d\xf0\x9e\x9b\xe1\x9d\xa1\x4e\x30\xd4\x09\xa6\xc7"
+ "\x34\xa2\xca\x81\x73\xd8\x0e\x1c\x83\x4d\x4b\x3b\xb0\xed\x23\xd8"
+ "\xb6\x8f\x71\x08\xe4\xd5\x13\xa2\x79\xe0\x6d\x5c\x53\x35\x69\x8a"
+ "\x4f\xeb\x15\x7f\xb7\x86\x28\x78\x9e\xdf\xdb\x5f\xb5\x3e\x8d\x04"
+ "\x1b\x39\x42\x4c\xfd\xb0\x9d\xbf\x97\x41\xfb\x81\x38\x16\x6d\x99"
+ "\x7f\x2f\xb4\x28\xfe\x67\x3a\x8e\x2f\xd0\xd3\xa6\x79\x18\xdf\xa1"
+ "\x98\xe0\x73\xf0\x1e\xa1\x3e\x1d\x4f\xec\xb3\x26\x2d\x80\x87\xf2"
+ "\xc5\x00\xc5\xd7\x24\x20\xa2\xf7\x40\xb8\xbf\xd1\x42\x96\xd2\xfb"
+ "\x2d\xec\x3e\xe0\xa5\xbf\xc3\xef\x77\xf4\x78\x0e\xcb\x3e\xfa\x1b"
+ "\x2c\xd2\xad\x22\x02\x78\xc3\x93\x76\x22\x8f\x00\x5f\x88\x3c\x82"
+ "\xfd\x3d\x94\x66\x51\xd2\x75\x58\x51\x4c\xf5\xba\x6c\xa0\xa1\xf3"
+ "\xcd\x88\xc0\xcd\x30\xb6\xdc\x75\xa4\x4b\x3d\x5c\x7b\xf7\x69\xa4"
+ "\xcb\xe6\x14\x12\x24\xd4\x8d\x95\xfa\x8f\xe5\x77\x29\x3d\x39\xa0"
+ "\x05\xdb\xbb\xf9\x6e\x5f\x7c\x9f\xcd\xd7\x80\x8e\xe1\xbc\xad\x24"
+ "\x19\xfa\x85\x7c\x0b\x3c\x72\x30\xc1\xae\x44\xbf\x3e\x3c\x7f\xb4"
+ "\xc5\xae\xdc\xdc\x44\x50\xae\x24\x9b\x00\x97\x77\x25\xc1\x98\x43"
+ "\x9b\xfc\xc0\xfe\xaa\x47\x45\x3a\xa6\x00\xed\x92\x80\x77\x61\xcc"
+ "\x37\xc3\xf8\xe5\x03\xe6\xe1\xef\x7c\x58\x7f\x38\xa8\x67\x51\xbc"
+ "\x3b\x0d\xda\x53\xed\x0a\xe7\xad\xbb\xc3\xf9\x66\x18\xc3\xd1\x6d"
+ "\x99\xef\x0e\x17\xc7\x10\xfb\xb4\x19\xce\x6f\x82\xeb\x30\x9e\x85"
+ "\x8c\x87\x8a\x93\xc5\x77\xf6\x35\x9e\x1b\x0f\x92\xd1\x9b\x0e\x92"
+ "\xc8\xd7\x0f\x92\x31\x6b\x1a\x60\x5e\x1a\x9e\xe2\x3f\x99\xed\x80"
+ "\x35\xd1\x30\xba\x23\x7c\x64\x14\x7e\x7b\xe2\xd6\xf7\x2f\x78\xf5"
+ "\x20\x19\x8e\x7b\x63\xa7\x82\xe4\x89\x6b\xf8\xd4\x1e\x5f\xf1\x66"
+ "\xfd\x55\xc2\x85\x1a\x46\x3b\xd7\x0f\x0d\x9b\x72\x95\x90\x13\x5a"
+ "\x1b\x49\x4b\x84\xb5\xbc\xa5\x91\xa4\xd9\x78\x6b\x65\xc6\x45\x02"
+ "\xd8\x53\xc3\xc6\xee\xbd\xe6\xa9\x71\x84\xe0\x9e\x41\xee\x9f\x5a"
+ "\xd2\x3b\x9e\x04\xa6\x9e\x21\x11\xe9\x0d\x7c\xa3\x73\xfb\x93\x9a"
+ "\xb4\xb5\x44\x79\xb0\xa5\x86\xc9\x9e\x8a\xf7\xde\x7f\x1f\xf7\xa7"
+ "\xb6\xe9\xc8\x3c\x87\xb0\x1e\xe5\x4c\x98\x98\xbe\x90\xdc\x8f\xef"
+ "\x13\x42\x65\xaf\xf7\x66\xc2\xb8\x4d\xf4\x0f\x9f\xdf\x1b\x48\xe9"
+ "\xb9\x7d\x4c\xd1\xc1\x05\x76\x90\xb7\x5a\xa2\xd3\xe3\xf8\x46\x94"
+ "\xeb\x60\x7d\xa1\xb2\xa0\xb9\xd1\x01\xb2\x55\x2c\xac\xdf\x16\x72"
+ "\xac\xbe\x40\xc9\x6d\x69\x89\xf6\xf3\x19\x59\x74\xdd\xc6\xb5\x14"
+ "\xfa\x3e\x43\x4b\x32\x68\xff\x61\xcd\x0c\x49\x44\x79\x8a\xff\x0a"
+ "\xfb\x7f\x14\xde\x95\x1f\xa0\x2b\x80\xfa\xc1\xb8\x7e\x4e\xad\x35"
+ "\x91\x72\xbb\x93\xec\x6c\xa2\x63\xd4\x13\xc6\x28\x10\x68\x6e\x81"
+ "\x71\x0a\xf2\x46\x37\xa4\x19\x67\x34\x8c\xe6\x02\x18\x6d\x28\x5d"
+ "\x6c\x8c\x2e\x53\x96\x13\x58\x47\x81\x36\x5b\x18\x6d\xb8\xbe\xe3"
+ "\xa3\x90\x36\xfe\xbd\xc7\x3f\xa6\xf9\x5a\x5f\xf0\xd9\x3c\xf0\x07"
+ "\xf2\x05\xa7\x1e\x1f\x85\xcf\xc6\x3e\xe0\xf7\x33\xe4\x83\xa9\xaf"
+ "\x7e\xc5\x57\xea\x1b\x89\x19\xde\x87\x0f\x75\xef\x83\xc3\xdf\x3e"
+ "\x54\xfb\xea\xc3\xc6\x91\xc0\xb7\x23\x81\x6f\x47\x02\xdf\x5a\x18"
+ "\xdf\x9e\xac\x65\x7c\xeb\x84\x7e\xb5\x83\xec\xbe\x66\x06\x51\x62"
+ "\xbf\xf6\x9f\xc5\x18\x7d\xd0\xcf\x46\x89\x77\x27\x5f\x82\x31\x12"
+ "\xf9\x37\x60\x68\x18\x8e\x4f\xa5\xad\x86\xa4\x23\xff\x76\x78\xe3"
+ "\xdf\xf7\xf7\x4f\x9d\x0f\xb4\x79\x05\xf8\xf7\x5b\x2d\x09\x6e\x20"
+ "\x81\x6b\x67\x00\xff\x36\x7a\xe3\xdf\xf7\xd7\x1e\x81\x67\x76\xe2"
+ "\xdf\x38\x77\xfe\x7d\xff\x7e\xff\xf9\xf7\x48\x83\x8b\x7f\x5f\x12"
+ "\xf8\x77\xa1\x07\xff\x36\xb8\xf1\x2f\xbe\xb7\xdf\xfc\xfb\xfe\x44"
+ "\xff\xf8\xf7\x48\xb9\x8b\x7f\x41\x2f\xd9\xf9\x5b\x3a\x46\x3d\x61"
+ "\x8c\x80\x7f\x8f\x14\xc0\x38\x79\xe5\xdf\x1f\x9e\x7e\xc7\x16\xdf"
+ "\x38\xfd\x8e\x8d\xed\x9e\x7e\x47\xcf\xf8\x4f\xbf\xa3\x7b\x6f\x3f"
+ "\xfd\x8e\x05\xf9\x47\xbf\xa3\x1b\x7d\xd3\xef\x68\xcc\x8f\x87\x7e"
+ "\xc7\x87\xdf\x38\xfd\x4c\xce\xee\xe9\x67\xda\xe1\x3f\xfd\x4c\xb1"
+ "\xb7\x9f\x7e\xa6\x52\xff\xe8\x67\x9a\xe4\x9b\x7e\x26\x8d\x2f\xfa"
+ "\x3d\x73\x3f\xc7\x73\xe8\x37\x17\x3e\xd4\x88\x32\x10\x93\xd7\x8e"
+ "\xb7\xa3\xce\x08\xe5\x40\xb1\x4c\x65\x2a\xd0\xab\x3d\xca\xc1\x1e"
+ "\x65\x95\x47\x59\xed\x51\x8e\xf0\x28\x47\x8a\x65\xa0\x57\x8f\xcb"
+ "\x8a\xe3\x0b\x41\x67\xcb\xb0\x28\x3e\x08\x14\xae\x0f\x9c\xe7\xd4"
+ "\xa0\xde\x37\xd0\x5b\xdf\x37\x1b\x78\xbb\x3e\x8d\xf4\x6f\x52\x7c"
+ "\xa0\xa7\xf4\x58\xdf\x4f\xcb\xa7\x64\x10\xa0\x47\xe2\x94\xb5\xc8"
+ "\x57\x56\xc2\x5f\x8f\xe8\x09\xe3\x74\x1f\xe8\x9b\x56\xe4\x39\x4d"
+ "\xc2\x31\xbe\x5e\xf1\xc1\x1c\x7c\xbf\x91\x7a\x13\xe1\x02\x86\x6a"
+ "\x51\x17\x02\xfa\x24\x5a\x03\x86\xf6\xe3\xf7\xcc\x8c\xca\x56\x72"
+ "\x41\xd9\x06\x4e\xb3\xd6\xca\x5b\x27\x5d\x81\x75\x0c\xd6\x32\x73"
+ "\xb3\x1d\x78\x92\xb7\x9a\x12\x2e\x41\x7f\x3f\x38\x51\x91\x0a\x6d"
+ "\xc3\x73\xe0\x59\x7a\x5e\xd5\x32\xdd\xec\xa8\x22\x3c\xb4\x51\x69"
+ "\x2b\x05\xdd\xbf\x86\x08\x6d\xea\xf9\xd0\x96\xe9\xd8\xa6\x57\xfd"
+ "\x2c\x67\x68\x09\x3c\xf3\x89\x19\xda\x40\xc2\xaf\x0b\x54\xfb\xc7"
+ "\x1f\x1f\x34\xfa\xd4\xfb\x72\x86\x8d\x67\xed\x06\xdd\x44\xbb\x1f"
+ "\x46\x77\xd1\xae\xd0\x5f\xd5\xcd\xb4\x9b\xeb\xbb\xdd\xe1\x42\x7f"
+ "\x35\x37\xd3\xae\xb5\x8b\x76\x85\xfe\x46\xdf\x44\xbb\x25\x3e\xf3"
+ "\x7f\xf0\x39\x23\x84\xfe\x66\xdc\x4c\xbb\x05\xbe\xdb\x1d\x5a\x72"
+ "\x73\xbc\x50\x62\xeb\x8a\x17\x6e\x8e\x0f\x4e\x74\xf1\xfe\xc3\x4a"
+ "\x6e\x8e\x07\x4e\xe4\x75\xc5\x03\x37\x47\xff\x13\x5d\xd2\xff\xe6"
+ "\x68\xff\xd1\xf8\xae\x68\x7f\x73\x74\xff\xc8\x27\xff\xa3\x2e\x0b"
+ "\xb4\x8f\xe1\xc3\x75\x46\x6e\x6b\x47\x0c\x17\x3e\x74\xc1\x7a\x2e"
+ "\x9a\x3c\x03\x18\x16\x92\x4b\x42\xa3\xa9\x7d\xe8\xe3\xe1\x6b\xf3"
+ "\x88\xd2\xa8\xe4\x94\x07\x52\x6a\x94\x66\xc7\x68\x92\xee\xe0\x9d"
+ "\x7b\x93\xec\x8a\x9f\xc0\xf9\xe3\xf1\x84\xd8\x56\x68\x09\x6d\x27"
+ "\xac\x23\x26\x3b\x2d\x9a\x4c\x75\x12\xb4\x47\xd8\x3e\x4c\x05\x0c"
+ "\x03\x1c\x33\xe7\xda\x71\xcd\x0b\x85\xfb\x1c\xc0\xbf\xd0\x86\x9d"
+ "\x1c\xe2\xac\x8a\xe8\x04\x5a\xcf\x0a\x7a\xa3\x95\xdf\x3e\x74\x01"
+ "\x9f\xae\x25\x1b\xe0\x37\x3c\x73\x5b\x80\x95\x28\xf3\x41\x9f\x6c"
+ "\xcb\xfc\xd8\x68\x51\x94\x2e\x46\x1d\x13\x74\xd9\xe6\xf4\x2b\x68"
+ "\x73\xd7\x19\xd7\x83\x5e\x8b\x75\x0f\x72\x56\xe5\x48\x3d\x51\xe2"
+ "\x6c\x84\xba\x47\x8e\x27\x12\xd2\x85\xcd\x25\x90\x53\x8f\xdb\x8b"
+ "\xf7\x63\x3b\x68\xcb\xdc\xcc\xc1\xd8\xaa\x27\x4c\xc4\xfe\xf2\x39"
+ "\x23\x23\x4c\x29\xb8\x2e\x94\x8e\x9f\xf0\x08\xdf\x26\xe0\x7c\xbf"
+ "\x26\x28\x53\x9d\xdd\xc0\x57\xf1\xaa\x2b\x13\xf9\xec\xde\xd1\x95"
+ "\xb6\x16\x62\x4a\xea\x20\xf5\x8a\xd2\x09\xf8\xec\x56\xf5\xb8\x02"
+ "\x9b\x7a\x5c\x61\x5b\x66\x69\xb4\xd8\x5f\x7c\x96\x78\x1e\x6d\x14"
+ "\xac\x8f\xa5\x31\xc7\x53\x7d\xf7\x11\xd6\x92\xb0\xa9\x11\xbc\x15"
+ "\xc7\xd0\x94\xd6\x02\x7d\x29\x3b\x8d\xe3\xcc\xe7\x8c\xd3\xdb\xd2"
+ "\xb5\x0f\x32\x9b\x5d\xa9\x03\x6d\x3f\xb0\x0e\xc4\x52\x3b\xcc\x96"
+ "\x96\x58\xea\x67\x03\x78\x0f\x3a\xbb\x16\xe5\x95\xcb\x8a\x52\x9a"
+ "\xff\x78\x86\x56\xe9\xa7\xce\x53\x4a\xd7\x7f\xd3\x83\x38\x0e\x65"
+ "\xef\xc3\xf3\x9e\xac\x57\x94\x69\x98\x1d\xaf\x25\x19\x9f\x07\x75"
+ "\xf6\xc3\x33\x93\x79\xe3\x95\x68\xac\x07\xd7\xa3\x85\xeb\x19\x6e"
+ "\xd7\x33\xa0\xcf\xc5\xc2\x75\xc1\x0e\xd8\xb2\xc1\xed\xfa\x06\xfd"
+ "\x83\x68\x97\x2b\xcb\xc2\x77\x82\xb5\x2c\x06\xd7\x35\xb4\xf9\x33"
+ "\xbb\x7a\x4b\x8c\x50\x2f\xb1\x59\x51\xb6\xa7\x15\xf8\x0a\xae\xa7"
+ "\xba\xdd\x9f\xfa\x61\x72\x14\x79\x66\x17\x8e\x69\xd9\x61\x4b\xc0"
+ "\xd5\x1a\x66\xcb\x29\x2d\xa2\x63\xa1\x6a\xd1\xb9\xb7\x67\x51\x94"
+ "\x65\x40\x9b\x3a\x1b\xc8\x7a\x50\x27\x17\x9f\xe9\x3e\xfe\x71\x09"
+ "\x09\xcb\x12\x34\x83\x62\x35\xb1\x4b\xe6\x6b\x5e\x5e\xb6\x72\x69"
+ "\xe2\xd8\x41\xb1\xbd\x08\x71\xe3\x1d\x15\x6f\x08\xe1\xb9\x9c\xb1"
+ "\x8d\xe6\x5c\x90\xb1\x94\x2a\x58\x6f\x3b\x48\x0e\xd0\xd5\xb1\x7d"
+ "\xb2\xc9\x19\x3e\x79\x9a\x73\xfb\x48\x53\xfa\x55\xa2\x4c\x8b\xe0"
+ "\xbf\x36\xa5\x8c\x03\x1a\x9c\x9c\x8c\xeb\xbd\x19\x46\x6f\x23\xf0"
+ "\xab\x29\xe5\x03\x3c\x47\xf7\xc0\x98\x63\xd8\xb9\xff\x4e\x2b\x55"
+ "\x1e\x4b\xab\x51\x96\xc7\xb4\x90\x0f\x23\xac\xa4\x44\xd3\x42\xf2"
+ "\xf0\x3c\x57\x45\xbf\xcd\x40\xfd\x77\xf0\x59\x68\xdf\xc2\xdf\xcc"
+ "\x56\x77\xf2\xe7\xf8\x1c\x4d\x3f\xfc\x66\x70\x72\x2c\x3e\xcf\xa2"
+ "\x38\x39\x26\x20\x8f\x28\x40\x9e\x09\x86\x7a\xed\xdc\xb6\xb1\x8d"
+ "\x74\x7e\x67\x96\x35\x3b\x94\x61\x23\xf2\xb7\x92\xa0\xdd\x5b\x09"
+ "\xc9\x0b\x23\x81\x6d\x99\x27\x1b\x2c\x81\xc1\x79\x38\x5e\xd0\x74"
+ "\x70\xab\x92\x3c\x05\xe7\xec\x16\xb2\xa4\x19\xcf\xc1\xbc\xb2\xf9"
+ "\xc2\x0b\xfc\x56\x66\xdf\xdb\x6f\x1a\xa7\x1e\x5b\xc3\xc3\x58\xd8"
+ "\x07\xf6\xcb\x08\xd1\x03\xbf\xc0\xbc\xe1\xfb\x8e\xad\x69\x56\x94"
+ "\xdb\x3e\x2a\x26\x24\x0d\xe7\x29\x8c\xc7\x5f\xae\xd9\x61\xbe\x4e"
+ "\x36\xed\xbf\x66\x85\xf2\xe4\x69\x6f\x25\xd9\x95\x27\xc7\x17\x13"
+ "\xcd\x0b\x28\x0f\x7d\xb2\xe4\x3f\x62\x79\xc7\xd0\x69\x20\x3b\x36"
+ "\xfc\x8d\x7c\x52\x5b\x4a\x82\x67\x93\x00\x57\xfc\xf6\x44\xa2\x9c"
+ "\x6a\x81\xf2\x4a\xa2\xac\x04\x5d\x1e\xed\xed\x69\x4f\xa3\xcd\xbd"
+ "\x82\xa0\x1d\x9e\x57\x2e\xb3\x1d\x68\xb1\x03\x2e\x35\xf6\xc0\xfd"
+ "\xde\x9c\x2a\x6b\x34\xde\x33\xcf\x26\x7c\xbf\x6a\x15\xbe\x5f\xb5"
+ "\xd2\xef\x57\xb9\xf8\xed\x0a\xbf\x59\xa5\xc6\xf0\x9c\x73\x85\x36"
+ "\x6c\x6a\x4c\x00\x8f\x6d\xe2\xf7\xac\xde\x20\xf7\xf3\x2b\xb4\x7d"
+ "\x76\x24\x10\x75\xa5\xb5\x91\x98\x1b\x4b\xc9\x9b\x49\x44\xcd\xb7"
+ "\xc6\xdf\x5d\x5e\x72\x92\xf0\x5b\x37\x44\x1d\x4a\x33\xf5\x70\xa2"
+ "\xcd\xa3\x35\xa2\x57\xc8\x3a\x05\xda\xee\xfb\x6c\x4c\x20\xc3\x77"
+ "\xb7\x90\xa8\x79\xe7\x33\x68\x2c\x27\xcc\xbb\xe7\x68\xd5\x6a\xae"
+ "\xb7\x6a\x1f\xee\x58\xa1\x7d\x30\xc4\xca\xbe\x77\xcd\x59\xa8\x22"
+ "\xf8\x4d\x8b\xcf\xfc\x47\xee\x6e\xb4\x3b\xdb\xac\xc4\x11\x9a\x35"
+ "\x1a\xf9\x13\x9e\x1b\x89\xdf\x48\xd2\x57\x13\x15\xf7\x8d\x96\x54"
+ "\x34\xb7\x90\x47\x81\x6f\xf0\x7b\x40\x7e\x3d\xfb\x1e\xe0\xdc\x62"
+ "\x18\x8d\xdf\x04\xda\x56\x68\x95\x93\x2f\xc1\x7a\x95\xf9\x89\xaa"
+ "\x63\x50\xbf\x69\x27\xb4\x75\xb8\x26\xb8\xcd\xfb\xf2\xe3\x37\x37"
+ "\xef\xcb\x4d\x78\x1f\x7e\x23\x03\x3a\x99\xf6\xb7\x20\xdd\x80\x7e"
+ "\x2d\x56\xe5\x73\x0d\xbc\xa3\xa2\xe1\x6d\xa0\x4f\x8d\x8c\x3e\x94"
+ "\x9e\x09\x76\xe5\x85\x58\xa0\xcb\x79\x46\xab\x72\x1b\xd0\xe9\x38"
+ "\xb6\x31\xce\x72\x00\x68\x0d\x3a\x8f\xb2\xdc\x5e\x47\x63\x51\x20"
+ "\xbd\xf6\x77\x94\xf6\xe8\x50\x0f\x8d\xc1\x6f\x8d\x6d\x03\xfb\xe9"
+ "\xdb\x73\xc6\x16\x5f\x57\x8f\x2d\xed\xe2\xbb\x63\x2e\xd2\x6b\xed"
+ "\x42\x12\x54\xde\x70\x9a\x50\x9a\x2d\x17\x68\x86\xfe\x69\xab\xb4"
+ "\x7d\x1c\x6d\xda\xb0\x1d\x40\xab\xca\x44\x0b\xd9\xd9\x42\xd4\xe6"
+ "\xc6\x1a\xfc\x26\x73\xf7\x73\xcf\x13\xf2\xdc\x5b\x3c\x57\x51\x72"
+ "\x96\xd2\xef\x20\xd0\xcf\x01\xf4\xc3\x6f\x91\x2e\xfa\x25\x01\xfd"
+ "\xae\x01\xfd\x2e\x49\xf4\x73\xb6\x01\xfd\xda\x80\x7e\xab\x80\x7e"
+ "\x36\x4f\xfa\x1d\x89\xc4\xef\x95\xf8\x5d\x08\xe9\x87\x3e\xd1\xdc"
+ "\x2a\x6d\x24\xfd\x4e\xf9\xb2\x96\xec\x5e\x40\x82\x46\xd8\x89\x22"
+ "\xfd\x38\x51\x41\x3f\x55\x43\x60\x7c\xa1\x3d\xe0\xef\x7a\x62\x2e"
+ "\x76\x92\x35\x33\xc9\x83\x48\x4f\x87\x40\x4f\xb3\xe3\x1d\x72\xad"
+ "\x4d\xab\x84\x36\x47\xef\xb8\x46\xc6\x4c\x3a\xaf\x21\x27\xa6\x57"
+ "\x10\xa0\xc7\x7e\x6e\xdb\x38\xfd\xcd\xcf\xc3\xaa\xd4\x1b\x9f\x87"
+ "\x95\x57\xff\x6f\x1e\xde\xec\x3c\xac\xcc\xf5\x3e\x0f\xab\x9e\xbd"
+ "\xb9\x79\x58\x35\xf1\xff\xe6\xe1\x8f\x69\x1e\x56\x8d\xf2\x9c\x87"
+ "\x2e\x59\x21\x21\x6e\xc9\xfc\x85\x4b\x17\x2e\x7d\x45\xb3\x60\x75"
+ "\x62\xdc\x0a\x26\x31\xc8\x64\x06\xad\x93\x8b\x56\xbe\x01\xeb\xe9"
+ "\x27\x11\x35\xe4\x50\xbf\x1a\x25\x37\x2b\x22\x90\x37\xe6\x67\x70"
+ "\xc6\x3d\x41\x6f\x80\xec\x8b\xf3\x35\x07\xe4\xda\x0b\x8a\x5a\xdd"
+ "\xc7\x91\x20\xf3\x25\x34\x11\xfc\xcd\xe4\xa5\x59\xa5\xb8\xb7\x30"
+ "\x77\x3b\xdf\x88\x7b\x0b\x4f\x8e\xc7\xb5\xff\xd4\x99\x7b\x74\xb0"
+ "\xae\xcf\x8a\x20\xed\xb3\x74\xca\xd7\xcf\x92\xa0\x90\x1a\x32\x89"
+ "\xe3\x78\xde\x94\xd6\x04\xb2\xd6\x99\x02\xd3\x4b\x4d\x44\x93\x12"
+ "\x04\x75\x6b\x14\x9a\x94\x75\x70\xfc\xe2\xbc\x26\x25\xf3\x2b\x38"
+ "\xd2\x7d\x33\x20\x6f\x37\xf2\xdb\xc7\x46\x39\xff\x14\x59\x80\xdf"
+ "\x14\x77\x87\xf3\x0d\x07\x41\xb6\x3f\xd8\x61\x57\xae\x4f\x40\xdf"
+ "\xec\x87\x78\xfc\x36\x88\xdf\x1e\xd7\xb7\x80\xfc\xbe\x41\xb4\xcf"
+ "\x7c\x11\x8a\xf3\x65\xe3\x76\xbe\xe1\xe8\x85\x1a\x25\xce\x1f\x9b"
+ "\xea\x4a\xf4\x06\x78\x0f\xe8\xa3\x65\x67\x38\x5f\x6b\xed\x3b\xb6"
+ "\x31\x50\x43\x94\x6d\x99\x9f\x4d\x04\x99\x24\x10\xe5\x89\x2c\xb8"
+ "\xf6\x3a\x5c\x63\xdf\xe8\x3e\x2f\xe7\x7b\x9e\x8a\x40\xcc\x02\xde"
+ "\x55\x5c\x56\x7c\xb6\xad\x1d\xde\x71\x23\xd3\x03\x1a\xed\xdb\xc6"
+ "\x96\x3a\xf6\xf5\xd3\x3b\x50\x86\x1b\xd4\x2f\xa3\xa3\xef\xd8\x62"
+ "\xc7\xb6\xb1\x35\x33\x1e\xa1\xdf\xa2\xa1\xfe\xe9\xe7\xf1\x1d\xae"
+ "\xab\x47\x9a\xa0\xbe\xad\x55\x3d\xd9\xd4\x9a\x33\x79\xda\xc9\xe4"
+ "\x22\x01\xcb\x3e\x3b\xfe\x5c\xae\x80\x65\xb9\x30\x57\x74\x80\x65"
+ "\xba\xce\x58\xc6\xbe\xdd\x3b\x09\xc3\xb4\x0a\x02\x6d\x35\xe0\x5c"
+ "\x41\xb9\xf0\x00\x8c\x03\xce\x03\xe4\x77\x8a\x6d\x80\x6b\xe2\x9c"
+ "\xc0\xf9\x82\xf8\x45\xe7\xa7\xc7\xfc\xc0\x39\x71\x8f\x95\xa8\x70"
+ "\x4e\x20\xbe\xe1\x9c\x40\x9f\x98\x37\xae\xb1\x39\x11\x52\x4b\x54"
+ "\x74\x5e\x38\x4a\xe9\xbc\x40\x9d\xa0\xdc\xe1\x81\x69\x6e\x73\x62"
+ "\x93\x38\x27\x44\x4c\x03\xbe\x77\xe0\x9c\x58\x25\x9f\x13\xb3\xea"
+ "\x54\x84\xe2\x5d\xe6\x3f\x22\xf3\x60\x4e\x54\xea\xad\xc4\x29\x62"
+ "\x1a\xcc\x09\xdc\xb3\x43\x31\xed\x77\x02\xa6\x59\xe1\x3c\xcc\x85"
+ "\xfc\x45\x72\x4c\x6b\x6f\xeb\x4e\xb6\x38\xfd\xc0\xcd\x61\xda\xe9"
+ "\x48\xbc\x0f\x69\x85\x74\x43\x7a\x21\x8d\xfe\x95\xe8\x83\x98\xe5"
+ "\x54\xf9\xc0\x2c\x2f\xf4\x01\x7e\x6e\x86\xdf\x9d\x68\xc4\x67\xbe"
+ "\x1b\xeb\x8e\x5b\x88\x57\x88\x5d\x88\x59\x88\x5f\x38\x0f\x10\xb7"
+ "\x28\x66\x01\x9e\x43\xb9\xb1\x22\xbe\x9e\xe2\x59\xfa\x79\xa2\x4a"
+ "\x9f\x40\x1e\x44\xfc\x32\x3b\xae\x12\xc4\x33\x4a\xbf\x50\x89\x7e"
+ "\x88\x5f\x3b\x93\xc8\x98\xc9\x0b\x35\x04\x71\x0b\xc6\x3e\xe8\x84"
+ "\xf6\x34\xa1\xba\x80\x41\x7d\xff\xee\x30\xd0\xb9\xb7\x92\xc0\x9c"
+ "\x30\x12\xd4\x96\xf9\x79\x73\x67\x3d\xe0\x0b\x22\xea\x01\x38\x67"
+ "\x71\xee\x5a\x14\x9f\xcd\x66\xdf\xa1\x9f\x54\x31\x5b\x78\xdd\xdd"
+ "\xb4\x0c\x7a\xb3\xa4\x33\x7f\xf1\x34\xfb\xfe\x0d\x3a\x72\xdf\x91"
+ "\x11\xfc\x96\x2b\x13\x71\xfc\xf0\x7d\xe6\x3d\x02\x7c\xb6\x6d\x5c"
+ "\xc1\x66\x1c\x93\x6d\xa0\x7f\x6f\x1b\x57\x28\xf1\xd4\x17\xcb\x4f"
+ "\x24\x13\x32\x23\xd9\x5f\x9e\xfa\x82\xd9\x5e\xbf\xd4\xdd\xcb\xcf"
+ "\xd2\x05\x72\x5f\xea\x7a\x00\xfd\x23\x96\x39\x33\xc8\x35\xe3\x2c"
+ "\x53\xba\x83\x6f\xd4\xa4\x90\xa1\xd0\xaf\x4f\x4f\x82\xbe\x7d\x32"
+ "\x11\x70\x6c\xda\x62\xa0\xe5\xac\xe8\x43\x9c\x35\xd0\xa2\x38\x55"
+ "\x03\x3a\x7f\x23\x60\x69\xa0\x3b\x96\x32\xdc\x3c\x45\x63\xfe\xdb"
+ "\x8d\xb3\xaa\xb0\xad\xa9\xa5\x24\x44\xf3\x4b\xf4\xaf\x3b\xb3\x7c"
+ "\xf5\x5a\x82\x7b\x46\x7b\xc0\xef\xb1\xed\x5b\x87\x45\xc3\xfd\x7d"
+ "\xf8\x2f\xa7\x2b\xf4\xbf\x84\xf5\x64\xd6\x74\x05\x7e\xef\x7f\x3b"
+ "\x2d\x57\xc9\xc1\x39\xe6\x3f\x94\x4b\xf0\xfa\xc6\x8e\x40\x2a\x37"
+ "\x71\x50\xa7\xd2\x96\x4b\x36\x26\x05\x11\xac\xcf\x7c\xd2\x72\x09"
+ "\xd6\xdf\x94\xa0\xa2\xfe\x02\xf4\x3e\x47\x2e\xc1\x7b\x9d\x70\xfe"
+ "\xf7\x5c\x30\xc9\x4e\x51\x93\x93\xd3\x2a\x69\x1b\x27\xa7\x7d\x44"
+ "\xb0\x0d\xe0\x73\xf8\x7d\x94\x6c\x4e\x8a\x80\x79\x9d\x0b\xd7\x3f"
+ "\x27\x9b\x2f\x47\xc2\xf1\x02\xfc\x5f\x23\x4d\x8a\x1a\xcb\xc9\x69"
+ "\x1c\x09\x59\xf7\x14\x0f\xfc\xca\x9b\x71\x1f\x62\x1a\xe9\x09\xeb"
+ "\xc2\x45\x73\x8d\x11\xd6\xb6\x2f\xaa\x70\x9f\x3a\x9f\x3e\xab\x99"
+ "\xe3\x67\x5d\xe2\xd2\x67\x5d\xc6\x67\x3b\xf9\x59\xdf\xe1\xb3\x37"
+ "\xa5\x68\x04\x1f\xd5\x5c\xea\x3b\xb7\xf1\xda\x40\x82\x7d\xc5\xe7"
+ "\xe2\xf3\x36\x27\x68\x85\x67\x0e\xa7\x7d\xc3\x67\x62\x9b\xee\xcf"
+ "\xc4\x1c\xf0\x9a\x17\xf1\x99\x67\xe6\xc0\x31\x14\xe8\x51\x8d\x74"
+ "\xc0\xe7\x73\xbc\xae\x07\x9f\xae\x0b\xa0\xf7\x24\x37\x7a\xbb\x67"
+ "\x8b\x70\x0f\xf5\x45\xc3\x7b\x3a\x58\x7d\xda\x06\xac\x75\x74\x1f"
+ "\xc8\x30\x9d\x89\x74\xa6\xe1\xd9\x67\xd9\xda\x77\xf6\x7e\xb6\xf6"
+ "\x31\x9a\x52\x5e\x99\xa5\xeb\x01\x74\x53\xe1\x3a\x09\x6d\x5c\x71"
+ "\xb5\xf1\xa5\x2e\x00\xe9\x8d\x7c\x23\xf2\x12\xf2\x91\xc8\x43\xb4"
+ "\x9f\xc0\x75\xee\x3c\x03\xbf\x83\x58\x3b\x67\x7f\x2e\xb6\x03\x7d"
+ "\x20\x22\x1f\x0d\x83\xeb\x9d\xf9\xa8\x36\x54\xe2\xa3\x2f\xff\x6a"
+ "\x4f\xe3\x79\xe4\x23\xd3\x4b\x06\x6c\x67\x9d\xd4\x9f\xe9\x0a\xe4"
+ "\xb1\x7f\x31\xde\xb2\x20\x9d\x86\xa5\x12\x35\x7b\x9f\x2f\xe9\x7a"
+ "\x3d\x2c\xd5\xa4\xc6\xbe\x8a\xef\x81\x7d\xc8\xe6\x34\x44\x7c\x8f"
+ "\xcd\x1d\x03\xa1\xdd\xcb\x44\xb8\xe7\x55\x6c\x5b\x1c\x03\xa0\x19"
+ "\x11\xef\x11\xeb\x67\x73\x5a\xe8\xf7\x70\x7a\x0f\xe3\xb9\x0b\x5e"
+ "\xf8\xe7\xcb\x4f\x3d\x79\xee\x9e\x54\x02\x82\x2b\xc8\x4a\x2f\xb5"
+ "\xe0\x73\x2e\xb1\xbe\x1d\x73\x76\xc0\x33\x80\x06\x4a\x76\xbe\xb6"
+ "\x87\x1b\x4f\x08\xed\xdb\xbd\xb4\x5f\xfb\x98\xac\x7d\x1d\xb4\x9f"
+ "\x0c\xed\xa3\x2c\xf6\x12\xda\xbd\x6a\x27\xd3\x76\x92\x59\xfb\x22"
+ "\xdf\xf2\xc6\x21\x16\x7d\x0a\xfa\x74\xd6\xda\x18\x9e\x9e\xa2\x34"
+ "\xa7\xbe\x44\x4a\xae\x80\xf3\xf0\x25\x72\xf7\x35\x3b\x94\x66\x15"
+ "\xfc\x88\x6a\x4f\x63\x1d\xc0\x57\x1b\xca\x94\x07\x40\x1e\x93\x7c"
+ "\x89\xce\xe2\xf5\x3a\x53\x52\xbd\x9b\x2f\x51\x2d\xcd\x37\x6f\x51"
+ "\xd4\x05\x81\xee\xa8\x84\x72\x09\x3b\x7f\x2a\xc3\xfd\xbc\xe4\xab"
+ "\xc7\xce\xa3\x1f\xb4\x60\x6b\x6d\xfe\xb0\x18\x6d\x6d\x75\x1a\xd1"
+ "\xbe\xe9\x43\x37\xf5\x43\xe6\xfd\x36\x56\x92\x79\xbf\x8d\xf5\x2d"
+ "\xf3\xd6\x55\x74\x2d\xf3\x36\xec\x97\x64\xde\x6f\x7a\xb3\x79\x5f"
+ "\x7f\x85\xcd\xfb\xfa\xbf\x52\xdb\x2d\xb4\xe7\xf8\xa3\xae\x88\xff"
+ "\x53\xff\x68\xe4\xf3\x7c\x90\x61\x0f\x25\x95\x2a\x0f\x82\x6e\xe4"
+ "\x04\x79\x77\x7d\x0a\x09\xc4\x18\x6a\xeb\x61\x0c\xcd\x8e\x5a\x52"
+ "\x11\x88\x32\xef\x29\x6c\xe7\x81\x4a\xab\x9d\xc0\x3a\xa7\x61\xe3"
+ "\x72\xee\x11\xa0\x45\x80\xd9\x6e\xa7\xf5\xf0\x1a\xac\x6b\x0d\x28"
+ "\xf7\x1e\xe5\x4a\x95\xbb\xa0\x1d\x9b\x5a\x97\xe1\x2e\x13\xb7\x65"
+ "\x9e\x9b\xee\x5d\x16\xfe\xba\xc6\x91\xe9\x2e\x0b\x9f\xdb\x83\xb2"
+ "\x30\xda\xc3\x71\xdd\xe7\x98\x0c\xac\x07\x79\x38\x03\xe5\x62\x94"
+ "\x85\x39\x99\x2c\x6c\x99\xd3\xb5\x2c\x7c\xae\xe2\xff\x64\xe1\xef"
+ "\x2b\x0b\xfb\xd2\xef\x2d\x8f\xdc\x9c\x2c\x6c\xd1\xfe\x9f\x2c\x7c"
+ "\xa7\x64\x61\x8b\x5a\x94\x85\x39\x83\xba\x67\xde\x56\x42\xf2\x5d"
+ "\xb2\xf0\xd7\xf6\xce\xb2\x70\x7d\x70\x67\x59\xf8\x5c\xbc\x5c\x16"
+ "\x6e\xec\xdb\x59\x16\xae\x9f\xec\x4b\x16\x06\x1c\x6a\x46\x59\x18"
+ "\xf9\x08\xe5\x62\x94\x87\xa1\x6f\x85\x8c\xa7\xea\xd7\xde\x9c\x2c"
+ "\x5c\x9f\x7a\x63\xb2\x70\x7d\x9d\x77\x59\xb8\xae\xdc\xb7\x2c\x5c"
+ "\x57\xee\x5d\x16\x6e\x58\x2b\xc9\x30\x0d\xcf\xfe\xf8\x65\xe1\x6f"
+ "\x9a\xbd\xcb\x2b\xdf\x5c\xfd\x7f\xec\x7d\x7d\x5c\x14\xd5\xfe\xff"
+ "\x61\x16\x15\x0d\x64\x31\xf0\x22\xa9\xad\x25\x89\xb0\x24\x95\xd6"
+ "\x76\xd3\x42\xc3\xc2\x7b\x45\xb0\xac\x8b\xcf\x68\x60\x68\xa8\xf8"
+ "\x18\x1a\x22\x98\x76\xd1\x00\x97\x02\xaf\x1a\xf8\x70\xc3\x7e\x7a"
+ "\x53\xc3\xd2\xef\xc5\xae\x16\x16\xf6\xc3\x42\xc0\xbe\x76\x2f\x76"
+ "\xf1\xb6\x79\xd1\xd0\xd0\x56\x04\x79\xda\xdd\xf9\x7d\xce\x9c\x59"
+ "\x66\x67\x77\x66\xd9\x99\x45\x82\x7e\xfe\xb1\x2f\x74\xe6\xcc\x99"
+ "\x99\xcf\xfb\x7d\xce\x79\xbf\xcf\x9c\x07\xa2\x85\x2f\x55\x77\xbe"
+ "\x16\xbe\x54\x2d\xac\x85\x6b\x16\x12\xdd\x70\x49\x67\xab\x85\xe1"
+ "\x1a\x41\x2d\x5c\x93\xcf\x5e\x53\xcd\xd7\xc2\x24\x0f\x68\x03\x8f"
+ "\x8b\x6b\xe1\xcb\x2f\x91\x36\xf1\xb2\x3f\x69\x13\x09\xa6\xb6\x5a"
+ "\xb8\xc6\xd8\xb1\x16\x26\x1c\x62\x9e\x53\x54\x0b\x5f\x9e\x68\xab"
+ "\x85\x2f\x96\x09\x6b\xe1\x9f\x86\x70\x3c\xba\x72\x92\xaf\x85\x2f"
+ "\x67\xf6\x0c\x2d\x2c\xca\xad\x3a\xbe\x16\xbe\x32\x5b\xba\x16\xbe"
+ "\x92\x2d\x4d\x0b\x63\xce\x09\x69\xe1\x2b\x17\xad\x39\xc7\xd7\xc2"
+ "\x57\x5a\x84\xb5\xf0\x4f\x5e\x7c\x2d\x8c\xf3\x17\xd2\xc2\x3f\x8d"
+ "\xe3\xe5\x6f\xa3\x85\x7f\x9a\xce\xd7\xc2\x24\x1d\xa7\x85\x6b\x11"
+ "\xdb\xb7\xb0\x4a\xba\x16\xfe\xe9\x47\xfb\x5a\xf8\xa7\xab\x7c\x2d"
+ "\xfc\xd3\x09\xa2\x79\x6b\xbd\x89\x16\xfe\xa9\x92\x1c\xbf\xb8\xd2"
+ "\xf2\x38\xa7\x85\xc9\x71\x5b\x2d\x5c\xab\xee\x40\x0b\x6b\x1c\xd7"
+ "\xc2\xf5\x75\xa5\xed\x5a\xb8\xbe\xce\xac\x85\x4d\x14\xb4\x51\xd0"
+ "\xde\xc3\xaf\x16\xcf\x11\xc0\x65\x0e\xda\x9c\x8b\xf6\xf5\xb0\x3e"
+ "\x80\xd3\xc3\x37\xd6\x90\xb2\x7f\x63\x36\x29\xfb\x37\x86\xb4\xf7"
+ "\x01\x83\x16\xc6\x9a\x98\xed\x03\x3e\x9f\x05\xbf\x8f\xd6\x96\x32"
+ "\x7a\xf8\x70\x7d\x33\x85\x35\xf1\x66\x88\x23\xd6\xc5\x5f\xb2\x9a"
+ "\xb8\xa2\x41\xc3\xea\xe2\xeb\x9b\xa1\xcd\xd0\x65\xa5\x30\x73\x98"
+ "\xdc\xe0\xf9\xaa\x18\x3d\xbc\xb2\x19\xbd\x7f\x5b\x43\x41\x7b\x57"
+ "\x55\x9c\x42\xd2\xc1\x7b\x56\x73\xfa\xf9\xea\x42\x9e\x7e\x5e\xc9"
+ "\xe8\xe7\xf3\x58\x3f\x7f\x09\xb5\xd2\x67\x29\x44\x43\x63\xfd\x8c"
+ "\x75\x34\xe8\xe7\xca\xfc\x81\x74\x59\xd3\x5b\x57\xb7\x9b\x35\x74"
+ "\x26\xfc\x1f\xb0\xd6\xe1\x11\x4d\xf9\x0b\x90\x2b\x60\x52\xf5\x26"
+ "\xdc\x03\xa7\x87\x74\xc5\xe6\x74\xd0\x66\x57\x12\x9d\x7d\x3d\xdc"
+ "\xc4\xeb\x73\xbe\xe6\x81\xd7\xf3\x67\xda\x63\x88\x03\xd6\x53\xe6"
+ "\x3e\x67\x93\xbf\x5f\x2a\xed\x43\xb4\x36\xbf\xdf\xf9\xe7\x33\x66"
+ "\xad\x9d\xc5\x6a\xed\x16\xac\xb5\x13\xcd\x5a\xfb\xda\x93\x32\xb5"
+ "\xf6\x79\x46\xcb\x4d\xe9\x7c\x2d\xb7\xa3\x1b\x68\x6d\xac\xb3\xb1"
+ "\xb6\xc6\x3a\x1b\xeb\x6e\xac\xb5\xb1\xee\x36\xb1\x5a\x1b\xaf\xd7"
+ "\xd7\xf2\x3a\xab\xb5\x7b\x5b\x68\x6d\x17\x4b\xad\xfd\x73\xae\x3c"
+ "\xad\xfd\x73\x8e\xa5\xd6\xc6\xfc\x96\xaa\xb5\x31\xc6\x36\xdf\x38"
+ "\x01\x2b\x8c\x13\xc6\xc4\xee\xb7\x32\x16\x2f\x8c\x0f\xc6\x06\x63"
+ "\xe4\x10\x3e\xc0\xaf\xb2\xe6\x5f\x4f\x6b\x07\x58\x69\x6d\xac\xad"
+ "\x21\x76\x35\x58\x73\x57\x14\x43\x6c\x96\x81\xee\x06\xcd\xcd\xd3"
+ "\xdb\xaf\x0b\xe9\xed\x9f\x53\xdb\xfb\x9e\x29\xef\xde\xbb\x70\xdf"
+ "\xf3\x00\xb3\xde\xbe\x1e\x6f\xab\xb7\xaf\x27\x5b\xe8\xed\x4a\x9d"
+ "\xcb\xd5\x4a\xbe\xd6\xbe\x95\x6f\xab\xb5\xaf\x1f\x17\xd5\xda\x03"
+ "\x05\xb4\xb6\x8f\x59\x6b\x5f\xbf\x2a\x4f\x6b\x5f\xaf\x15\xd3\xda"
+ "\x4d\x4a\x4b\xad\x7d\x63\x12\xa7\xb5\x57\x5a\x68\xed\xda\x6a\x71"
+ "\xad\x5d\xcb\x68\x3b\x5a\x39\xb3\x12\xe7\x85\x35\x12\xfe\x36\xa7"
+ "\x62\xe6\x8e\xff\xd2\x82\x75\x12\xee\x6b\x80\xe7\x07\xad\xf4\xcb"
+ "\x69\x4b\xcd\x8d\xbf\xc9\xd9\xd3\x45\x89\x0b\xd0\x50\xac\x8d\xb0"
+ "\x2e\x32\xeb\x58\x9c\x1e\xeb\xa3\x3b\xab\x8d\x7e\x89\x15\xd6\x46"
+ "\xbf\x2c\x63\x74\x2f\x33\xe7\xf0\x46\x38\x6e\xe3\x3a\x57\x7b\xdf"
+ "\x08\x17\xd6\xde\xbf\x5c\x26\x3a\xe5\xc6\x64\x8c\x0b\x5f\x7b\xc3"
+ "\x35\x82\xda\x5b\x3f\x88\xbd\x26\x9c\xaf\xbd\x49\x1e\xd0\xde\x8e"
+ "\x11\xd7\xde\xfa\x73\xa4\xfd\xd5\xef\x25\xed\x2f\x8b\xb1\x8d\xf6"
+ "\xd6\xaf\xb1\xd4\xde\x18\x7f\x5b\xed\x4d\x38\xc5\x3c\xa7\xa8\xf6"
+ "\xd6\x9f\xb2\xd5\xde\xb5\xd5\x58\x7b\x0b\xf3\xaa\x7e\x1f\x9f\x57"
+ "\xf5\x13\x9b\x4d\x66\x0d\xbe\x05\xf2\xbb\xe9\x65\xad\xc1\x7b\x20"
+ "\xd7\x62\x39\x1d\xce\xbc\xd3\x65\x69\x3a\x1c\x5f\x53\x3f\x48\x9a"
+ "\x0e\xc7\xfc\x13\xd2\xe1\xf5\x71\xd6\xfc\xe3\xeb\xf0\xfa\x34\x61"
+ "\x1d\x5e\xbf\x83\xaf\xc3\x71\xfe\x42\x3a\xbc\xfe\x34\x2f\x7f\x1b"
+ "\x1d\x5e\xff\x23\x5f\x87\x93\x74\x9c\x0e\xbf\x95\xce\xf6\x6b\xc8"
+ "\xe8\x93\xbe\xb5\xd0\xbe\x0e\xbf\xb5\x8c\xaf\xc3\x6f\x85\x11\xbd"
+ "\x7d\x2b\xaf\x99\xd1\xe1\xb7\xa2\xc9\xf1\xda\x54\xcb\xe3\x9c\x0e"
+ "\x27\xc7\x9b\x2d\x75\x78\x31\xd6\xe1\xb7\x8e\x76\xa0\xc3\x43\x1d"
+ "\xd7\xe1\xa6\x13\x9c\x0e\x37\x9d\xb0\xaf\xc3\x1b\xe2\xec\xeb\xf0"
+ "\xb6\x66\x4e\x87\xb7\xb2\xdf\xa3\x5a\x83\x49\x3d\xd0\x72\xdd\xdc"
+ "\x2f\x8d\x75\xb8\xf1\x81\xe8\x42\xb6\x5f\xba\xf4\xf0\xea\x4a\xea"
+ "\x23\x73\xbf\xf4\x72\xd0\xd7\x7a\xe4\xb6\xb9\x1e\x21\xac\xc1\xf1"
+ "\x58\x8c\xb2\x66\x0d\x3b\x1e\xa3\x65\x7a\x1e\xd6\xe0\x57\x20\x4d"
+ "\x0d\x68\x70\xd0\xd1\xef\xb7\x6a\x28\x78\x9f\x2a\x5e\xda\xd5\xed"
+ "\x69\xab\xcd\x69\xb1\xf6\x86\xf4\x65\xe5\xa0\xc3\xf1\x35\x50\xfe"
+ "\xcb\xca\xf0\x38\x8f\x94\xaf\x99\xb4\x90\x47\x25\xa7\xd9\x1b\x87"
+ "\x30\x9a\x5d\xcf\x6a\x76\xb8\x06\x34\x4a\x69\xbb\x66\x6f\xad\xa4"
+ "\xb4\xf5\x3c\xcd\x5e\xd2\xf4\x56\x63\xfb\xf8\x8f\xad\xac\x56\xd7"
+ "\x9a\x18\xad\x7e\x1e\xb4\x7a\x15\xd1\xea\x8d\x09\xe6\x34\xc0\x99"
+ "\x6a\x26\xcd\x15\x26\x4d\x19\xa4\xa9\x64\xd3\x68\x2d\xf4\x7c\x09"
+ "\xd1\xf3\x2d\xbe\x7c\x3d\xdf\x78\x11\xeb\x79\x73\xbf\x39\xd6\x2a"
+ "\x96\x7d\xe7\x26\x1f\xa1\xbe\xf3\xa6\x1d\xd6\x7d\xe7\x2d\xbc\xbe"
+ "\xf3\xdb\x7d\xa5\xe8\x79\xb8\x67\xa9\x59\x33\xfe\x9a\x7a\xb1\x3b"
+ "\xe9\x79\x93\x45\xdf\xb9\x89\xd7\x77\xde\x14\x27\x4f\xcf\x37\xc5"
+ "\x5a\xea\xf9\x16\x79\x7d\xe7\xa5\xbf\xa6\xdf\xea\xd9\x7a\xbe\x29"
+ "\xca\xb2\xff\x1c\xeb\x79\xae\xff\xbc\x45\x63\xab\xe7\x5b\x26\x5b"
+ "\xe8\xf9\x12\x9d\x4b\xe3\x1e\xbe\x9e\xa7\x17\xdb\xea\xf9\x96\xcd"
+ "\xf2\xf4\x7c\xcb\x71\x79\x7a\xbe\xa5\xc8\x31\x3d\xdf\x3a\x48\x58"
+ "\xcf\x37\xc4\x8a\xeb\xf9\x06\x86\xaf\x26\x2d\xa7\xbb\xf0\x77\x47"
+ "\xd5\x6a\xac\xbb\xda\xce\x30\xba\x8b\xe8\x30\xd0\x5d\x6d\xb9\x3d"
+ "\x43\xcf\xb7\x8d\x16\xd6\x58\x6d\xe3\x39\x3d\xdf\xea\xdb\xf9\x7a"
+ "\xbe\xd5\x57\x58\xcf\xb7\x1d\x23\x7a\xa7\x75\xb0\xad\x9e\x87\x6b"
+ "\x04\xf5\x7c\xdb\x55\xf6\x1a\x5f\xbe\x9e\x27\x79\x5c\x72\x31\x70"
+ "\xdf\xff\x6d\x30\x35\xec\x25\xed\xb8\x61\x19\x69\xc7\x09\xc6\xb6"
+ "\x7a\xde\x30\xa9\x63\x3d\x4f\x38\xc5\x3c\xa7\xa8\x9e\x37\x64\xdb"
+ "\xea\xf9\x86\x58\xac\xe7\x85\x79\x65\x5a\xc5\xe7\x95\xc9\x87\xaf"
+ "\xe7\x0d\x3f\xf6\x1c\x3d\x2f\xca\xb5\xd1\x7c\x3d\x6f\x3c\x26\x5d"
+ "\xcf\x1b\xaf\x4a\xd3\xf3\x98\x7f\x42\x7a\xde\x34\xc6\x9a\x7f\x7c"
+ "\x3d\x6f\x9a\x2a\xac\xe7\x4d\x0b\xf9\x7a\x1e\xe7\x2f\xa4\xe7\x4d"
+ "\xb9\xbc\xfc\x6d\xf4\xbc\xe9\x08\x5f\xcf\x93\x74\x9c\x9e\xa7\xa3"
+ "\x49\x5d\xdb\xd0\x57\xba\x9e\xa7\x9f\xb4\xaf\xe7\xe9\xf1\x7c\x3d"
+ "\x4f\x7b\x13\xdd\x4e\x27\x10\x3d\x4f\x07\x90\xe3\x0d\x6e\x96\xc7"
+ "\x39\x3d\x4f\x8e\xdb\xea\x79\x7a\x63\x07\x7a\xde\xdd\x50\xe0\x97"
+ "\xd8\x3a\xdc\x2f\xb5\xcd\x3b\x62\x4f\x50\xcd\x33\xc6\xf6\xb5\xf4"
+ "\x63\xa0\xdd\xaf\x06\x1d\x30\x0f\x51\x78\x3e\x7a\xca\x39\x68\xdf"
+ "\xe7\x91\x71\xf0\xb8\x8d\xc7\xe3\x3d\x0e\xad\x2d\xee\x85\xd7\xfe"
+ "\x6b\xcd\x09\x8c\x31\xa8\x87\x68\x71\x5b\xdf\x52\xe0\x17\xd5\x9c"
+ "\x33\xae\xa8\x05\x8f\x81\x4f\x40\xd4\xdc\x3a\x61\x9d\xf6\x46\x35"
+ "\x6d\x02\xce\xbb\x45\xce\x22\x1a\xed\x6c\xfc\x65\x86\xc7\xb8\xfd"
+ "\xc7\xf3\x14\x2a\x1a\xaa\x18\x3d\xe0\x1e\x13\x8a\xf2\x52\x90\xb7"
+ "\x47\x1d\x52\x7a\xb8\xb8\xf4\xfe\xc3\x77\x08\x19\x41\x0b\x4c\x1c"
+ "\x49\x9b\x82\x62\x43\xf1\xfa\x33\xfd\x89\x1e\x28\xea\x65\x60\xf5"
+ "\xc0\xdb\xb7\x91\x3a\x7f\x35\xe8\x80\xb3\x9c\x0e\x68\x31\xeb\x34"
+ "\x0b\x0d\x30\xfb\xba\x12\xe5\x6f\xe0\x8f\x81\x6f\xcb\xe6\x34\x00"
+ "\x6e\xff\xe9\xb9\x01\x68\x54\x33\x19\xdb\xb0\x76\x2a\x19\x03\xaf"
+ "\xae\x41\xd4\xee\x39\xc8\xad\x2c\xe6\x12\x9e\x27\xee\x5b\x56\xb3"
+ "\x0f\xad\x99\x84\x86\x1a\x70\x9b\xbf\x81\x2e\x2c\xab\xc9\x45\x78"
+ "\x6d\x3d\xd0\x7e\x9a\xed\xb7\xd1\x58\xdc\xce\x4e\x9e\x47\xda\x7e"
+ "\xa6\x8d\xa5\x5c\x86\x9c\x0e\x38\x8d\x24\xeb\x36\xca\x85\x19\xff"
+ "\x2b\x3a\x07\xb5\xc0\x2f\xd5\x30\xdc\x2f\xca\x08\x58\x92\x35\x15"
+ "\x27\xe8\x4c\x7f\x9d\x5e\x7c\x18\x78\xf8\xe1\xa5\x5a\x17\xbc\x3e"
+ "\x34\xde\x2b\xd1\x74\x70\x88\x96\x87\x4d\x1b\x8b\x4d\x1b\xc1\x06"
+ "\xe3\x32\x27\x11\xe1\xb5\xf8\xfa\x63\x4c\x2a\x9a\xab\x90\xe9\x0d"
+ "\xf3\x7e\x89\x21\x68\x97\x89\xe0\x61\x6c\x8b\xef\x6b\x82\xd8\xe3"
+ "\x35\xa7\x80\x0f\x8c\x1e\xcb\xc0\x7b\x28\xa6\xb9\x78\x60\x3d\x06"
+ "\xfc\xee\xb7\xbb\x15\x70\xf8\x91\xe0\x40\x6f\x50\x32\x7f\x0d\x6f"
+ "\x04\xa8\x20\xef\x07\xda\xda\x00\x8b\x66\x6b\x2c\xfe\xb1\x1d\xef"
+ "\xb5\x88\xd7\x83\x33\x64\x93\x35\xef\x18\x2c\xde\x08\x18\x8c\xd7"
+ "\x8b\x60\xe6\x91\xb4\x05\xe0\xfa\x52\xb9\xeb\x0a\x9e\xff\x42\x30"
+ "\x30\xb2\xb1\xc7\xfb\x2e\xe2\x78\x63\xad\x55\x01\x1a\x8b\x99\xd7"
+ "\xf1\x16\xbd\xbd\x6d\x9f\x5f\x14\x1e\x77\x72\x83\xa2\x76\xc8\xd2"
+ "\x37\x14\x65\x7f\xfe\x6f\x97\xc4\x5e\xd5\xf3\x62\xbf\xc5\x25\x96"
+ "\x8b\xbd\xab\x8f\xbc\xd8\xbb\x8a\xae\xff\xdf\x75\xb1\x57\xf6\xc0"
+ "\xd8\x53\x3a\x2e\xf6\xbd\xb2\xe5\xc5\xbe\x97\xe8\xfe\x37\x38\xf6"
+ "\xb8\x3f\xc8\xdc\x17\x64\xee\x07\xc2\x6d\x1c\xe3\x41\x28\x8f\xf0"
+ "\xf6\x71\x89\xf0\x6f\xcb\x71\x89\xdf\x94\xe0\x3e\x12\x76\x5c\x22"
+ "\xd5\xdb\x7e\xff\x0f\xd5\x4f\xdb\xde\xff\x43\xb9\xdd\x64\x74\x23"
+ "\xe5\xf6\x1d\xa3\x1b\x29\x37\xe6\x9b\xd6\xba\x8b\x88\x32\x3c\x34"
+ "\x78\xcf\xe1\x25\xc5\x14\x9e\x93\x73\xf8\x46\x33\x95\x51\x0f\x3a"
+ "\x90\xba\x9f\xc6\xfd\x3e\x99\xcb\xf1\x78\xc4\x06\x04\x1a\xec\xfe"
+ "\x6b\x94\x9b\x07\x5e\x63\xeb\xb3\x1b\xc5\x4c\x7f\x0b\xfd\xc0\xf4"
+ "\xe2\x83\x7e\x7a\x17\xdc\xb6\x1d\x5e\xd2\x4c\x99\xf9\x62\x9e\x7b"
+ "\x07\x31\x4c\x35\xfa\x44\xec\xb9\xb5\xcf\x2f\xd1\x3c\x7e\xd0\x70"
+ "\x68\x88\x56\x90\x43\x78\x4e\x1f\xf0\x08\x73\x06\xcf\xc1\x33\xf3"
+ "\x09\xf3\xa8\xbc\xb9\x16\xe1\x3d\x64\x3c\x6b\xc1\xef\x03\x87\x66"
+ "\x1e\x00\x7c\x2d\x79\xa4\x15\xe1\xd1\x0e\x3e\x8f\x6e\xb1\x3c\x02"
+ "\x3e\x71\x3c\xe2\xe6\xe3\x0d\x96\xc4\xa3\x3a\x96\x47\xd9\x56\x3c"
+ "\xba\xae\x42\xdf\x54\x5f\x64\x79\xe4\x3a\xcb\xe0\x6f\xe6\x51\x9f"
+ "\x0b\xa7\x67\x01\x8f\x66\x49\xe5\x51\x9f\x2a\x9e\x67\xa5\x3c\x1a"
+ "\x6d\x3c\x2b\xe5\x36\xce\xda\xb3\x9a\x3d\xea\x2d\x9f\x09\x7b\x6e"
+ "\x81\x4f\x6d\x30\xfb\x54\xca\x6d\x9e\x3c\x3e\xbb\xc5\x38\x34\xc6"
+ "\x8b\x72\x3b\x65\x3d\xc6\xeb\x43\xec\x53\xa9\xde\xf1\x98\x6b\x82"
+ "\x3e\x95\x3d\x67\x33\x36\x87\xea\x37\xaf\x7d\x6c\x0e\xd5\x2f\xb8"
+ "\xdb\x8f\xf1\xa2\xfa\x56\x0a\xfa\x05\xaa\xef\x05\x66\x8c\x17\xe5"
+ "\x56\xdc\xe9\x63\xbc\x20\x4f\x41\x5f\x4a\xf5\x8b\x60\x74\x3b\xe5"
+ "\x56\x62\x33\xc6\x0b\x5f\x23\xe4\x4b\xa9\x7e\x69\xec\x35\xc5\x3c"
+ "\x5f\xca\xe6\x01\xf5\x49\xbe\xa8\x2f\xa5\xee\x79\x92\xd4\x2f\xf7"
+ "\xf4\x25\xf5\x0b\xc1\xd4\xc6\x97\x52\xfd\x7e\xb4\xf4\xa5\x82\x63"
+ "\xbc\x58\x0e\x31\xcf\x29\xe6\x4b\xa9\x7b\x46\xda\xf8\x52\xaa\x77"
+ "\xac\xe0\x18\x2f\xca\xc3\x85\xe3\x91\xfb\x5e\xde\x18\x2f\xea\x9e"
+ "\x65\x3d\x62\x8c\x97\x38\xb7\x2a\x79\x63\xbc\x28\xf7\xf1\x92\xc7"
+ "\x78\x51\xee\xab\x24\x79\x51\x86\x73\x02\x5e\x94\x72\x3f\x65\xcd"
+ "\x39\x9e\x17\xa5\xdc\x2f\x0a\x7a\x51\xca\xbd\x91\xe7\x45\x99\xfc"
+ "\x05\xbc\x28\xe5\x31\x8c\x97\xbf\xb5\x17\xa5\x3c\xc6\xf1\xbc\x28"
+ "\x9b\xae\xdd\x8b\x52\x1e\x3a\x52\x87\xf6\xf6\x90\xec\x45\x29\x0f"
+ "\xe6\xbb\xe6\xa1\x9d\xe4\xdb\x0d\xcf\x87\x52\x1e\x67\x78\x3e\x94"
+ "\xf2\x60\xd6\xfb\xd1\x51\x1e\x0d\xcc\xf8\x2e\xca\xa3\x90\x1c\xef"
+ "\xed\x6e\x79\xbc\xdd\x87\xb2\xc7\xf1\xf8\x2e\x66\x5c\xd7\x96\xfe"
+ "\xae\xd2\xfc\xe7\xa8\x6e\xe8\x3f\x43\xec\xf8\xcf\x90\x1e\xea\x3f"
+ "\x3d\xf3\xe5\xf9\x4f\x4f\xd1\xf5\x9f\xee\x7a\x20\x7b\x3a\xbc\xbf"
+ "\x2f\xa7\xc3\xbd\x06\xc9\xd3\x2d\x5e\xbe\xbf\x7e\xec\x7b\xa2\x07"
+ "\xf2\xac\xe1\x62\x3f\x20\x57\x5e\xec\x07\xe4\xc8\xf7\x40\x7e\x93"
+ "\x39\x0f\xe4\x37\x59\xdc\x03\xdd\xbb\xd0\xbe\x07\xfa\x5d\x0e\xe7"
+ "\x81\x7c\x1a\x89\x46\xf1\xb9\x40\x34\x8a\xcf\x0e\xe9\x1e\xc8\xc7"
+ "\xeb\xae\x07\x92\xe2\x81\xbc\x62\x38\x0f\xe4\x7d\x51\x9e\x07\xf2"
+ "\xae\xe6\x7b\x20\xbf\x16\x5b\x0f\xe4\x63\x33\xff\x5b\xdc\x03\xf9"
+ "\xc4\xc9\xe3\xb3\x4f\xac\x63\x1e\xc8\xe7\xb4\xb0\x07\xba\x37\x41"
+ "\xdc\x03\x91\x73\xb6\xda\xf5\x77\x71\x9c\x76\xfd\xdd\x23\xdd\xdf"
+ "\x03\x0d\x3c\x2f\xac\x53\x07\x5e\x24\x1e\xc8\xa7\xa4\xf3\x3d\x90"
+ "\x4f\x89\xb0\x07\xfa\xdd\x54\xa2\x17\x7d\x4a\x6d\x3d\x10\x5c\x23"
+ "\xe8\x81\x7e\xb7\x89\xbd\xa6\x84\xef\x81\x48\x1e\x50\x9f\xec\x15"
+ "\xf7\x40\xbe\xe3\x48\xfd\xe2\xeb\x41\xea\x17\x82\xa9\xad\x07\xfa"
+ "\xdd\xe5\x8e\x3d\x10\xe1\x10\xf3\x9c\xa2\x1e\xc8\x37\xd8\xd6\x03"
+ "\xdd\x1b\x2f\xec\x81\xfc\x7a\x71\x3c\x1a\xb4\x8f\xef\x81\x7c\x57"
+ "\xf5\x0c\x0f\x24\xca\xad\xf3\x7c\x0f\x34\x68\xa2\x74\x0f\x34\x68"
+ "\x8d\x34\x0f\x84\x39\x27\xe4\x81\x06\x9d\xb6\xe6\x1c\xdf\x03\x0d"
+ "\xfa\x51\xd8\x03\x0d\x6a\xe1\x7b\x20\x9c\xbf\x90\x07\xf2\xf3\xe7"
+ "\xe5\x6f\xe3\x81\xfc\xc6\xf3\x3d\x10\x49\xc7\x79\x20\x3f\xb2\x37"
+ "\x0a\x75\xaf\x97\x74\x0f\xe4\x77\x5a\xdc\x03\xf9\x9d\xe5\x7b\x20"
+ "\xbf\x3d\xc4\xeb\xf8\x35\x13\x0f\xe4\x77\x94\x1c\xbf\x57\x69\x79"
+ "\x9c\xf3\x40\xe4\x38\xe7\x81\xee\x73\x93\xe6\x81\xee\xef\x86\x1e"
+ "\x48\x65\xc7\x03\xa9\x7a\xa8\x07\x1a\xbc\x57\x9e\x07\x1a\xbc\xe7"
+ "\xae\x0e\x97\xa3\xc3\xef\x1b\xcc\xe9\xf0\xa1\x43\xe4\xe9\x96\xa1"
+ "\x76\xbf\x7f\xda\xd7\xe1\xfe\xe7\x39\x1d\xee\x7f\x5e\x5c\x87\x0f"
+ "\xbd\x69\x5f\x87\x3f\x38\x98\xd3\xe1\xc3\xd6\x91\x76\x72\xd8\x3c"
+ "\xd2\x4e\x0e\x1b\x26\x5d\x87\xab\x76\xdc\xd5\xe1\x52\x74\xf8\xe0"
+ "\x5a\x4e\x87\xab\xe2\xe4\xe9\x70\x55\x2c\x5f\x87\x3f\x94\x66\xab"
+ "\xc3\x55\x67\x1c\xd7\xe1\xaa\xeb\xf2\xf8\xac\xaa\x73\x4c\x87\x0f"
+ "\x8b\x10\xd6\xe1\x43\x1b\xc4\x75\x38\x39\x67\xab\x9f\x1e\xb8\xce"
+ "\xe9\xa7\x07\x8e\x77\x7f\x1d\xfe\xc0\x2c\x61\xad\xf4\x40\x1c\xd1"
+ "\xe1\xc3\x26\x77\xbe\x0e\x1f\x36\x59\x58\x87\x3f\x70\x81\x68\x96"
+ "\x61\x51\xb6\x3a\x1c\xae\x11\xd4\xe1\x0f\x7a\xb0\xd7\x4c\xe6\xeb"
+ "\x70\x92\x07\xd4\x27\x23\xc5\x75\xf8\x83\xa7\x49\xfd\xf2\x60\x2e"
+ "\xa9\x5f\x08\xa6\xb6\x3a\xfc\xc1\xc5\x1d\xeb\x70\xc2\x21\xe6\x39"
+ "\x45\x75\xf8\x83\xc7\x6c\x75\xf8\x50\xbd\xb0\x0e\xf7\xcf\xe4\x78"
+ "\xe4\x1f\xcc\xd7\xe1\x0f\x1a\x7b\x86\x0e\x17\xe5\xd6\x2c\xbe\x0e"
+ "\x1f\x7e\x56\xba\x0e\xf7\x77\x91\xa6\xc3\x31\xe7\x84\x74\xb8\x7f"
+ "\x84\x35\xe7\xf8\x3a\xdc\x7f\xa1\xb0\x0e\xf7\x4f\xe3\xeb\x70\x9c"
+ "\xbf\x90\x0e\xf7\x3f\xc4\xcb\xdf\x46\x87\xfb\x9f\xe1\xeb\x70\x92"
+ "\x8e\xd3\xe1\x0f\x25\x90\x3a\x74\xe8\x0e\xe9\x3a\xfc\xa1\x08\x71"
+ "\x1d\xfe\xd0\x4b\x7c\x1d\xfe\x50\x00\xd1\xdb\x0f\xa5\x12\x1d\xfe"
+ "\xd0\x58\x72\x7c\xe8\x76\xcb\xe3\x9c\x0e\x27\xc7\x39\x1d\xfe\x90"
+ "\x56\x9a\x0e\xf7\xec\x86\x3a\x5c\x69\x47\x87\x2b\x7b\xa8\x0e\x0f"
+ "\x18\x29\x4f\x87\x07\x04\xc8\xd7\x82\xa3\x74\x9c\x16\x1c\xa5\x13"
+ "\xd7\x82\x01\x46\xfb\x5a\x30\x98\x5b\x1f\x80\x0a\xda\x4c\xea\xea"
+ "\xa0\xc5\xa4\xae\x0e\x0a\x96\xae\x05\x03\xf7\xdd\xd5\x82\x52\xb4"
+ "\xe0\x43\x05\x9c\x16\x0c\x5c\x26\x4f\x0b\x06\x26\xf2\xb5\x60\x48"
+ "\xa6\xad\x16\x0c\xfc\xce\x71\x2d\x18\xd8\x22\x4f\x0b\x06\x36\x3b"
+ "\xa6\x05\x83\xa6\x0b\x6b\xc1\x91\x48\x5c\x0b\x92\x73\xb6\x6d\xb8"
+ "\xba\x85\x6b\xc3\xd5\xa7\xbb\xbf\x16\x54\xc7\x0b\xb7\xd7\xea\x65"
+ "\x44\x0b\x06\x45\x77\xbe\x16\x0c\x8a\x16\xd6\x82\x6a\x32\xff\x99"
+ "\x0a\x9a\x65\xab\x05\xe1\x1a\x41\x2d\x18\x3c\x88\xbd\x26\x9a\xaf"
+ "\x05\x49\x1e\x50\x9f\x88\xcf\x7f\xa6\x82\xc9\xfc\x67\x2a\x98\xcc"
+ "\x7f\x66\x31\xb5\xd5\x82\xc1\x6b\x3a\xd6\x82\x84\x43\xcc\x73\x8a"
+ "\x6a\xc1\x60\xdb\xf9\xcf\x54\x80\x41\x58\x0b\x8e\xda\xc1\xf1\x68"
+ "\xd4\x93\x7c\x2d\xf8\x70\xdf\x9e\xa1\x05\x45\xb9\x15\xcf\xd7\x82"
+ "\x0f\x5f\x90\xae\x05\x47\x79\x48\xd3\x82\x98\x73\x42\x5a\x70\xd4"
+ "\x74\x6b\xce\xf1\xb5\xe0\xa8\x55\xc2\x5a\x70\x54\x26\x5f\x0b\xe2"
+ "\xfc\x85\xb4\xe0\xa8\xe3\xbc\xfc\x6d\xb4\xe0\xa8\xef\xf8\x5a\x90"
+ "\xa4\xe3\xb4\x60\x48\x12\xa9\x43\x03\xf6\x49\xd7\x82\x21\xd3\xc5"
+ "\xb5\x60\xc8\x3c\xbe\x16\x0c\x19\x4d\x34\x5f\x48\x06\xd1\x82\x21"
+ "\xe1\xe4\x78\x40\x81\xe5\x71\x4e\x0b\x92\xe3\x9c\x16\x0c\xc9\xeb"
+ "\x48\x0b\xda\xd7\x0f\x1a\x0d\xa7\x1f\x34\x1a\x4b\xfd\x70\x86\xa7"
+ "\x1f\x1e\x19\x67\x5f\x3f\x8c\x49\xe5\xf4\xc3\x63\x3f\x92\xf2\xfd"
+ "\xd8\x69\x52\xbe\x1f\xdb\xc4\xe8\x87\x08\x68\xe7\x41\x3f\x1c\xba"
+ "\x56\x48\xf4\xc3\xb5\x66\xea\xed\x1b\xac\x7e\xa8\x43\x6e\x19\x4b"
+ "\x58\xfd\x30\x07\xeb\x87\x47\x8d\x58\x3f\xb8\xe7\x81\x56\xad\x61"
+ "\xb5\x6b\x22\x68\xd7\x1a\xf8\x3f\x94\x9d\xcf\x20\x8f\x72\xd0\x97"
+ "\x5a\x7c\x3d\xde\xcf\x00\xf2\x62\xe6\x65\x32\x73\x36\x75\xbd\xf0"
+ "\x3e\x39\x58\x5b\xe0\x7d\x27\x3a\xdc\x73\xa2\x86\xdd\x73\x22\x96"
+ "\xbf\xe7\x04\xde\x6b\x02\xef\x3b\x91\xb7\x1c\x79\xbf\xc7\x6a\x8a"
+ "\xfe\x69\x2e\xfd\xf1\xbe\x13\xfd\x1b\x88\x3e\x3d\x64\x2a\x25\xfa"
+ "\x74\x85\x6f\x3f\xd0\x42\xea\x5d\xf5\x9c\x96\x78\x17\xeb\x88\x15"
+ "\x01\xaa\x86\x15\x01\x43\x6f\xdd\x0a\x78\xc0\x76\xbf\x89\xe3\xb1"
+ "\x78\xbd\x7c\xbc\x47\x9f\x81\xd5\xa7\xf4\xab\x01\x68\xf7\x02\xe4"
+ "\x06\xba\xd8\xe5\x61\xd0\xa7\x23\x06\xc3\xb3\x9f\x45\x4a\xe3\xad"
+ "\x80\xc1\x96\x6b\x1b\xc2\xb3\x2b\x4d\xb7\x02\x50\x59\xcc\xf7\xcc"
+ "\x1c\x4d\x03\x3b\x47\x53\xbf\x22\x00\xaf\xc1\xaf\xd9\xb9\xdc\x42"
+ "\x9f\xfa\x98\xf5\xe9\xa3\x67\xe4\xe9\xd3\x47\x4b\xf9\xba\x42\x73"
+ "\xd9\x56\x57\x3c\x16\xec\xb8\xae\x78\x6c\xaa\x3c\x5d\xf1\x58\x94"
+ "\x63\xba\xe2\xb1\x23\xd6\xba\xe2\x00\xa3\x2b\x1e\x09\xc5\x1c\x14"
+ "\xd6\x15\xe4\x9c\x6d\x7b\x30\x66\x2a\xd7\x1e\x8c\x19\xd2\xfd\x75"
+ "\xc5\xe8\x62\xe1\xba\x7f\xf4\x19\xa2\x2b\x1e\x2b\xec\x7c\x5d\xf1"
+ "\x58\xa1\xb0\xae\x18\x43\xd6\x7f\xa3\x1e\x3b\x6a\xab\x2b\xe0\x1a"
+ "\x41\x5d\x31\x66\x19\x7b\x4d\x21\x5f\x57\x90\x3c\xa0\x9e\xc9\x14"
+ "\xd7\x15\x8f\x8f\x24\xf5\xce\x98\x16\x52\xef\x10\x4c\x6d\x75\xc5"
+ "\x98\x73\x1d\xeb\x0a\xc2\x21\xe6\x39\x45\x75\xc5\xe3\x83\x6c\x75"
+ "\xc5\x23\x63\x85\x75\xc5\x13\x37\x39\x1e\x3d\x91\xcd\xd7\x15\x8f"
+ "\xcf\xeb\x19\xba\x42\x94\x5b\xc5\x7c\x5d\xf1\xc4\x23\xd2\x75\xc5"
+ "\x13\x71\xd2\x74\x05\xe6\x9c\x90\xae\x78\xe2\x88\x35\xe7\xf8\xba"
+ "\xe2\x89\xb3\xc2\xba\xe2\x89\xcb\x7c\x5d\x81\xf3\x17\xd2\x15\x1a"
+ "\x2f\x5e\xfe\x36\xba\x42\x13\xcc\xd7\x15\x24\x1d\xa7\x2b\x34\x95"
+ "\xac\x37\xbb\x2c\x5d\x57\x68\x8e\x88\xeb\x0a\xcd\x71\xbe\xae\xd0"
+ "\x64\x10\xfd\xa0\xa9\x21\xba\x42\xb3\x87\xd5\x1b\x35\x96\xc7\x39"
+ "\x5d\x41\x8e\x73\xba\x42\xd3\x70\x77\xbe\x65\x77\xec\x63\xfa\x7d"
+ "\xa6\xbc\x36\xfc\xf7\x19\xbf\xfe\xb7\xde\x1e\x38\xdf\x72\xcb\x93"
+ "\x6e\xdc\xb7\xde\xb1\x7d\xe5\xe9\x96\xb1\x6e\xbf\x7e\xec\x7b\xe2"
+ "\x58\xe3\xdf\x9f\xe7\x62\x3f\x6e\x93\xbc\xd8\x8f\xdb\xf8\xeb\xc7"
+ "\xbe\x27\x8e\x71\x18\x1b\xc5\xc5\xfe\x19\x17\x79\xb1\x7f\x06\xc9"
+ "\xef\xd7\x7e\xce\x62\x8c\xc3\x73\xe7\xc5\x7d\xe9\x33\xdf\xd9\xf7"
+ "\xa5\x61\x16\x63\x1c\x26\xb0\x63\x1c\x26\xb0\x63\x1c\x26\x30\x63"
+ "\x1c\x52\xb0\x2f\xfd\x6b\x74\xe1\x47\xcb\x8b\x28\xbc\xee\xd6\xa1"
+ "\xe5\xcd\x14\x60\xe2\x6a\xc0\xbe\x14\x62\x9d\xc9\xec\xff\x50\xc2"
+ "\xf6\x6b\x8f\xdf\x51\x5e\x6b\xb1\xf7\x03\x15\xea\xcf\xad\x5d\x5b"
+ "\x82\xf0\xb9\xcf\xea\x8b\x28\x6d\xab\x55\x9f\x37\xe4\xa9\x5a\xc2"
+ "\xef\xf3\xc6\x7d\xdd\x2d\x16\xfb\x38\x18\x73\x23\xf6\x74\xd4\xe7"
+ "\x6d\xdd\xdf\x9d\xdf\x8a\xbc\x7b\x6e\x9f\xf7\xb8\x32\xae\xcf\x7b"
+ "\xbc\xcc\xf1\x0f\xe3\xad\xc6\x3f\x3c\x2f\x30\xfe\x61\xbc\x84\xf1"
+ "\x0f\xe3\x65\x8e\x7f\x18\xef\xe0\xf8\x87\x09\x36\xe3\x1f\x88\x37"
+ "\x7d\xa6\x2a\x45\xd4\x9b\x92\x73\xb6\x9e\xe2\x59\x8b\xf1\x0f\xcf"
+ "\xf6\x80\xf1\x0f\xcf\x8a\x7c\xa3\x7e\x96\x1d\xff\x30\xe1\x0e\x8c"
+ "\x7f\x98\x20\x32\xfe\xe1\x59\x76\xfc\xc3\x04\x81\xf1\x0f\x13\x44"
+ "\xc6\x3f\x84\xb1\xe3\x1f\x26\x58\x8d\x7f\x98\xc0\x8e\x7f\x08\xb3"
+ "\x33\xfe\x21\x8c\x1d\xff\x10\xc6\x8e\x7f\x20\x98\xda\x7a\xd3\x30"
+ "\x07\xc6\x3f\x4c\x60\xc7\x3f\x4c\xb0\x33\xfe\x21\x4c\x60\xfc\xc3"
+ "\x33\xe7\x85\xbd\xe9\x73\x16\xe3\x1f\x9e\xb3\x1a\xff\x10\xd6\x43"
+ "\xc6\x3f\x88\x72\xcb\x6a\xfc\xc3\x44\x19\xe3\x1f\x9e\x93\x38\xfe"
+ "\x61\x82\xc8\xf8\x87\xe7\x22\xac\x39\xc7\xf7\xa6\xcf\x89\x8c\x7f"
+ "\x78\xce\x6a\xfc\xc3\x04\x91\xf1\x0f\xcf\x1d\xe2\xe5\x6f\xe3\x4d"
+ "\x9f\xb3\x1a\xff\x30\xc1\x6a\xfc\xc3\xf3\xec\xf8\x87\x67\xd6\x49"
+ "\xf7\xa6\xcf\xdb\x19\xff\xf0\xbc\xd5\xf8\x87\xe7\xd9\xf1\x0f\xcf"
+ "\xb3\xe3\x1f\x9e\x67\xc7\x3f\x3c\x93\x6c\x79\x9c\xf3\xa6\xe4\x38"
+ "\xe7\x4d\x9f\x97\x38\xfe\xe1\xee\x5c\xcc\xae\xf1\xa6\x93\x64\x8e"
+ "\x7f\x98\x64\x77\xfc\xc3\x5d\x7f\x24\xa6\xd1\x9f\x2f\xe0\x34\xfa"
+ "\x1f\xf6\xc9\xd3\x2d\x7f\x28\xf8\xf5\x63\xdf\x13\xfd\xd1\xa4\x44"
+ "\x2e\xf6\x93\x87\xc9\x8b\xfd\x64\x95\x7c\x7f\xf4\x62\x03\xe7\x8f"
+ "\x5e\x6c\x10\xf7\x47\x93\x1b\xed\xfb\xa3\xa9\x63\x39\x7f\x14\x99"
+ "\x4f\x34\x4a\x64\x1a\xd1\x28\x91\xe3\xa5\xfb\xa3\x29\xc7\xf9\xfe"
+ "\x28\x62\xe2\x5d\x7f\x24\xd7\x1f\xfd\xa1\x8e\xf3\x47\x53\x36\xc9"
+ "\xf3\x47\x53\x36\xf2\xfd\xd1\xb4\xbd\xb6\xfe\x68\xca\x55\xc7\xfd"
+ "\x51\xa4\x87\x3c\xae\x47\xba\x3b\xe6\x8f\x22\x17\x0b\xfb\xa3\xc9"
+ "\xcd\xe2\xfe\x88\x9c\xb3\xd5\xb5\x53\x3d\x38\x5d\x1b\x75\xa1\xfb"
+ "\xfb\xa3\xa8\x64\x61\x0d\x1b\xb5\x89\xf8\xa3\xc8\x84\xce\xf7\x47"
+ "\x91\x09\xc2\xfe\x28\xaa\x85\x68\xc9\xc8\x44\x5b\x7f\x04\xd7\x08"
+ "\xfa\xa3\xa9\xc1\xec\x35\x09\x7c\x7f\x44\xf2\x80\xba\x66\x92\xb8"
+ "\x3f\x9a\x7a\x99\xd4\x3d\x53\x8f\x91\xba\x87\x60\x6a\xeb\x8f\xa6"
+ "\x66\x76\xec\x8f\x08\x87\x98\xe7\x14\xf5\x47\x53\xbf\xb3\xf5\x47"
+ "\x93\x1b\x84\xfd\xd1\x8b\x87\x38\x1e\xbd\x18\xc1\xf7\x47\x2f\x0c"
+ "\xe9\x19\xfe\x48\x94\x5b\xc9\x7c\x7f\xf4\xc2\x75\xe9\xfe\xe8\xc5"
+ "\x61\xd2\xfc\x11\xe6\x9c\x90\x3f\x7a\x71\xb1\x35\xe7\xf8\xfe\xe8"
+ "\xc5\xcd\xc2\xfe\xe8\xc5\xbd\x7c\x7f\x84\xf3\x17\xf2\x47\x2f\x9e"
+ "\xe5\xe5\x6f\xe3\x8f\x5e\xbc\xca\xf7\x47\x24\x1d\xe7\x8f\xa6\x65"
+ "\x90\x3a\x74\x72\xbe\x74\x7f\x34\x6d\xb1\xb8\x3f\x9a\xb6\x8a\xef"
+ "\x8f\xa6\x85\x13\x1f\x34\x6d\x0f\xf1\x47\xd3\x66\x91\xe3\x93\xf3"
+ "\x2c\x8f\x73\xfe\x88\x1c\xe7\xfc\xd1\xb4\xc2\xbb\xf3\x34\xbb\xa3"
+ "\x3f\x7a\x79\x92\x3c\x7f\xf4\x72\xf8\x5d\x8d\x2e\x47\xa3\x4f\x2b"
+ "\xe1\x34\xfa\x9f\x4e\xcb\xd3\x2d\x7f\x2a\x91\xaf\xd1\xe7\x6e\xe7"
+ "\x34\xfa\xdc\xed\xe2\x1a\x3d\x7a\x87\x7d\x8d\x3e\x4b\xc7\x69\xf4"
+ "\x99\xe3\x49\x3b\x39\x93\xec\xdb\x49\xcd\xb8\x2c\x5d\xa3\xcf\x98"
+ "\xcd\xd7\xe8\xd1\x57\xef\x6a\x74\xb9\x1a\xfd\x65\x2d\xa7\xd1\x67"
+ "\x8c\x94\xa7\xd1\x67\x04\xf0\x35\x7a\xcc\x44\x5b\x8d\x3e\x23\xd3"
+ "\x71\x8d\x3e\xe3\x88\x3c\xae\xcf\x28\x74\x4c\xa3\xcf\xf4\x12\xd6"
+ "\xe8\xd1\x79\xe2\x1a\x9d\x9c\xb3\xd5\x56\xb3\x8e\x70\xda\x6a\xd6"
+ "\xba\xee\xaf\xd1\x67\xa9\x84\x75\xd4\xac\x91\x44\xa3\xcf\x54\x76"
+ "\xbe\x46\x9f\xa9\x14\xd6\xe8\xb3\xc8\xfe\xbf\xd4\x4c\x6f\x5b\x8d"
+ "\x0e\xd7\x08\x6a\xf4\x59\xe7\xd8\x6b\x94\x7c\x8d\x4e\xf2\x80\xba"
+ "\xe6\xba\xb8\x46\x9f\xcd\xce\x0b\x9a\x3d\x9d\xd4\x3d\x04\x53\x5b"
+ "\x8d\x3e\xfb\x91\x8e\x35\x3a\xe1\x10\xf3\x9c\xa2\x1a\x7d\xf6\x1a"
+ "\x5b\x8d\x1e\xbd\x5d\x58\xa3\xcf\xb5\x18\xa7\x39\xe7\x26\x5f\xa3"
+ "\xcf\x3e\xd5\x33\x34\xba\x28\xb7\x54\x7c\x8d\x3e\x27\x5b\xba\x46"
+ "\x9f\x73\x5a\x9a\x46\xc7\x9c\x13\xd2\xe8\x73\xbd\xac\x39\xc7\xd7"
+ "\xe8\x73\x83\x85\x35\xfa\xdc\x89\x7c\x8d\x8e\xf3\x17\xd2\xe8\x73"
+ "\x97\xf1\xf2\xb7\xd1\xe8\x73\x33\xf9\x1a\x9d\xa4\xe3\x34\x7a\x4c"
+ "\x08\xdb\xa6\x8d\x97\xae\xd1\x63\xbc\xc4\x35\x7a\xcc\x20\xbe\x46"
+ "\x9f\x5b\x47\xb4\x78\x4c\x18\xd1\xe8\x31\x88\x1c\x8f\x0e\xb5\x3c"
+ "\xce\x69\x74\x72\x9c\xd3\xe8\x31\xd3\xee\xce\xe1\xec\x8e\x1a\x7d"
+ "\xde\x75\x79\x1a\x7d\x5e\x9d\x7c\x9d\xb8\xb0\x98\xd3\x89\x0b\x8b"
+ "\xc5\x75\xe2\xfc\x53\xf6\x75\xe2\xab\x6e\x9c\x4e\x8c\x5b\x48\xea"
+ "\xea\xb8\x08\x52\x57\xc7\x79\x48\xd7\x89\xb1\x9b\xf8\x3a\xf1\x15"
+ "\xaf\xbb\x3a\x51\xae\x4e\x8c\x89\xe7\x74\x62\xec\x54\x79\x3a\x31"
+ "\x36\x8a\xaf\x13\x17\xd9\xee\x95\x45\xc5\x1e\x73\x5c\x27\xc6\x5e"
+ "\x90\xa7\x13\x63\xab\x1c\xd3\x89\x71\x4f\x0a\xeb\xc4\xf9\x25\xe2"
+ "\x3a\x91\x9c\xb3\x6d\xdf\x17\x5c\xe0\xda\xf7\x05\xfb\xba\xbf\x4e"
+ "\x5c\x10\x2e\xdc\x96\x2f\x98\x4a\x74\x62\x9c\xa6\xf3\x75\x62\x9c"
+ "\x46\x58\x27\x2e\x60\xd7\x3f\x8b\x1b\x6b\xab\x13\xe1\x1a\x41\x9d"
+ "\xb8\x80\xed\xff\x8d\xd3\xf0\x75\x22\xc9\x03\xea\x1a\x1f\x71\x9d"
+ "\xf8\xea\x11\x52\xf7\xbc\xca\x7e\x47\x22\x98\xda\xea\xc4\x57\xa7"
+ "\x77\xac\x13\x09\x87\x98\xe7\x14\xd5\x89\xaf\xee\xb5\xd5\x89\xf3"
+ "\x8b\x85\x75\xe2\xc2\x35\x1c\x8f\x16\x0e\xe2\xeb\xc4\x57\xaf\xf6"
+ "\x0c\x9d\x28\xca\xad\x70\xbe\x4e\x8c\x3f\x2e\x5d\x27\xc6\x5f\x97"
+ "\xa6\x13\x31\xe7\x84\x74\xe2\xc2\x27\xad\x39\xc7\xd7\x89\x0b\x5f"
+ "\x12\xd6\x89\x0b\x17\xf3\x75\x22\xce\x5f\x48\x27\x2e\xdc\xc1\xcb"
+ "\xdf\x46\x27\x2e\x3c\xc6\xd7\x89\x24\x1d\xa7\x13\x17\x91\x3d\xb0"
+ "\xa8\xf9\x0b\xa5\xeb\xc4\x45\x4f\x8a\xeb\xc4\x45\xfc\xfd\xaf\xa8"
+ "\x45\x64\xff\x2b\x6a\x51\x02\xd1\x89\x8b\xc8\xfe\x57\xd4\xfc\x78"
+ "\xcb\xe3\x9c\x4e\x24\xc7\x39\x9d\xb8\x28\xd9\xb9\xf9\x9d\xcb\x47"
+ "\x73\xda\x62\xf9\x68\x71\x6d\xf1\xda\x10\xfb\xda\x62\x69\x32\xa7"
+ "\x2d\x16\x5f\x24\xe5\x7b\xf1\x29\x52\xbe\x17\x33\xe3\x93\xd6\x9d"
+ "\x05\x6d\xf1\x40\x74\xe1\xe1\x1b\x85\x8c\xb6\xf8\x68\x49\x33\x05"
+ "\x7a\xcf\xd5\x84\xb5\x05\xe8\xba\x8c\xd5\x58\x5b\xd4\xb0\xf3\x3b"
+ "\x13\x5a\xce\x26\x59\x6a\x8b\xd7\x96\x31\x73\x3d\xb1\xbe\x68\x68"
+ "\x66\xd2\xe1\xf3\x42\x73\x3f\x4f\x2e\x61\xe7\x7e\x42\xde\x96\x73"
+ "\x3e\x99\x79\xa0\x37\x40\x7b\xcc\x07\x3c\x2c\xb4\xc7\xdd\xb9\x9f"
+ "\xb8\xad\x4f\x38\x2d\x4f\xd7\x26\x94\xf0\x35\xc7\xf2\x1f\x6d\x35"
+ "\xc7\xe2\x91\x8e\x6b\x8e\xc5\x11\xf2\x34\xc7\xe2\xc9\x8e\x69\x8e"
+ "\xc5\x87\x84\x35\xc7\x6b\x2a\xcc\x4f\x61\xcd\x41\xce\xd9\xb6\x15"
+ "\x4b\x23\xb8\xb6\x62\xe9\xa0\xee\xaf\x39\x96\x9c\x10\x6e\x17\x96"
+ "\x9c\x26\x9a\x63\xf1\xc1\xce\xd7\x1c\x8b\x0f\x0a\x6b\x8e\xa5\x6c"
+ "\xfd\xbf\xb8\xd0\x56\x73\xc0\x35\x82\x9a\x63\x29\xfb\xfd\x6f\xf1"
+ "\x41\xbe\xe6\x20\x79\x40\x1d\xb4\x59\x5c\x73\x24\xfa\x93\x3a\x69"
+ "\x69\x23\xa9\x93\x08\xa6\xb6\x9a\x63\xe9\xd9\x8e\x35\x07\xe1\x10"
+ "\xf3\x9c\xa2\x9a\x23\xd1\xc7\x56\x73\xbc\x36\x58\x58\x73\x2c\xb3"
+ "\x18\xa7\xbd\x2c\x93\xaf\x39\x12\x67\xf7\x0c\xcd\x21\xca\xad\x13"
+ "\x7c\xcd\xb1\x2c\x58\xba\xe6\x58\x36\x4f\x9a\xe6\xc0\x9c\x13\xd2"
+ "\x1c\xcb\x0e\x59\x73\x8e\xaf\x39\x96\x9d\x11\xd6\x1c\xcb\x7e\xe4"
+ "\x6b\x0e\x9c\xbf\x90\xe6\x58\xee\xc1\xcb\xdf\x46\x73\x2c\x1f\xc9"
+ "\xd7\x1c\x24\x1d\xa7\x39\x96\x97\xb1\xbe\xed\xb4\x74\xcd\xb1\xfc"
+ "\x90\xb8\xe6\x58\x7e\x8c\xaf\x39\x96\xa7\x13\x6d\xb1\x5c\x47\x34"
+ "\xc7\xf2\x3c\x56\x8b\x94\x58\x1e\xe7\x34\x07\x39\xce\x69\x8e\xe5"
+ "\x7a\x09\x7d\x53\x05\x52\xe6\x7e\x1e\xba\xcd\xef\x9b\x32\xf7\x4b"
+ "\x19\xd4\x43\x72\xda\xfb\xa6\xa0\xad\x17\xdb\x13\x1d\xf7\x4d\xe1"
+ "\xb6\x9b\xeb\x9b\xba\xc8\xd4\x55\x5c\xdf\x94\x8e\xe9\x9b\xc2\xfd"
+ "\x52\xe0\xd9\xdb\xfb\xa5\x4c\xaf\xdb\xce\xfb\x3c\x64\x92\xde\x2f"
+ "\x35\x67\x99\x12\xed\x62\xda\xef\x93\xd5\xa4\x5f\xaa\xaa\xbd\x5f"
+ "\x0a\xb7\xdb\xc6\x26\xdb\x7e\x29\xdc\x5e\x73\xfd\x52\xdf\xcb\xec"
+ "\x97\x5a\xb9\x49\x5e\xfb\xbd\xb2\x1b\xcc\x7f\xeb\x89\xf3\x3e\x57"
+ "\xb8\x72\xdf\x8e\x57\xcb\x9c\xff\xb6\xda\xee\xfc\xb7\xbb\xe3\x9a"
+ "\xc5\x62\xbf\xb2\x8c\x8b\xfd\xeb\xeb\xe4\xc5\xfe\xf5\xe4\x5f\x3f"
+ "\xf6\x3d\x71\xcc\xc4\xea\x70\x2e\xf6\x49\x32\xd7\x7f\x4b\x6a\x96"
+ "\xdf\x17\x9e\xaa\xe7\xfc\x6a\xaa\xde\xd2\xaf\x96\x86\x59\xfa\xd5"
+ "\x35\x67\xed\xfb\xd5\x14\x0d\xe7\x57\x93\x77\x10\x6d\x98\xbc\x8e"
+ "\x68\xc3\x64\x66\x4f\xb2\x75\xe3\x11\xe3\x53\x0d\xd8\xb3\x2e\x6a"
+ "\xa6\x0e\x5f\x2b\xa6\x0c\x1b\x88\x57\xad\x30\x94\xa1\xb3\xfa\x66"
+ "\xf4\xf6\x6a\xe4\xba\xf9\x06\x72\xfd\x5b\x7d\x33\xe5\x99\x80\xdc"
+ "\xa0\x9d\x00\x2d\x55\x06\xda\x22\x1f\x25\xa6\x60\x1f\xfb\xc6\xb1"
+ "\x8a\x44\xbd\x85\x8f\x5d\x3b\x86\xf3\xb0\x90\x2e\xb1\x19\x7d\xbe"
+ "\xa8\x98\xc2\x5e\xb5\x2d\x37\x62\x4f\x5b\xf0\x10\x2d\xb3\x66\x91"
+ "\x65\x7f\x39\xdc\x5b\x35\x87\xdf\x5f\xde\x9a\x1b\x51\xd0\x72\x68"
+ "\x48\x0e\xb3\x1e\xa2\x3f\xd7\x6f\xee\x68\x7f\xf9\x7b\xad\xc8\xdb"
+ "\xbc\x1e\x22\x6e\x17\x7b\x5e\x7f\xf9\xeb\x25\x5c\x7f\xf9\x1b\x69"
+ "\xf2\xfa\xcb\xdf\x48\xe5\x7b\xd7\xb4\x7c\x5b\xef\xfa\xc6\x65\xc7"
+ "\xbd\x6b\xb2\xcc\xf9\xff\xc9\x6e\x8e\x79\xd7\xe4\x85\xd6\xde\x75"
+ "\x7f\x0a\xf6\xae\x6b\x2a\x31\x57\x85\xbd\x2b\x39\x67\xeb\x39\x52"
+ "\xfa\x72\x9e\x63\xdd\x77\xdd\xdf\xbb\xae\x4b\x12\xf6\x17\xeb\xd2"
+ "\x88\x77\x4d\x8e\xef\x7c\xef\x9a\x1c\x2f\xec\x5d\xd7\x35\x12\x9d"
+ "\x9f\x1c\x6f\xf6\xa1\x9c\x77\x85\x6b\x04\xbd\x6b\xca\x48\xeb\x6b"
+ "\x88\x77\x4d\x4e\x20\xde\x35\x65\xa2\xb8\x77\x4d\x61\xd7\x4b\x4b"
+ "\x39\x42\xea\x27\x82\xa9\xad\x77\x4d\xd9\xdc\xb1\x77\x25\x1c\x62"
+ "\x9e\x53\xd4\xbb\xa6\x9c\xb3\xf5\xae\x6b\xca\x84\xbd\x6b\xea\x01"
+ "\x8e\x47\xa9\x93\xf8\xde\x75\xfd\xa0\x9e\xe1\x5d\x45\xb9\x95\xc4"
+ "\xf7\xae\xeb\xaf\x4a\xf7\xae\xa9\x43\xa4\x79\x57\xcc\x39\x21\xef"
+ "\x9a\xba\x90\xe5\x4f\x82\xb0\x77\x4d\xdd\x24\xec\x5d\x53\xf3\xf9"
+ "\xde\x15\xe7\x2f\xe4\x5d\x53\xcf\xf0\xf2\xb7\xf1\xae\xa9\x97\xf9"
+ "\xde\x95\xa4\xe3\xbc\x6b\x5a\x3a\xa9\x43\xd7\xac\x92\xee\x5d\xd3"
+ "\x16\x8a\x7b\xd7\xb4\x65\x7c\xef\x9a\x16\x46\x3c\x6a\x5a\x1e\xf1"
+ "\xae\x69\xd1\xe4\xf8\x9a\x95\x96\xc7\x39\xef\x4a\x8e\x73\xde\x35"
+ "\xed\xa0\x04\xef\xba\xbf\x93\xbc\xeb\xf6\x9e\xe5\x5d\x3f\xcf\xeb"
+ "\x5a\xef\xfa\xe6\x78\x79\xde\xf5\xcd\x50\x07\x35\x7c\x41\x07\x1a"
+ "\x3e\xe7\xff\x2f\x0d\x9f\x56\xcc\x69\xf8\x8d\x27\xe5\x69\x96\x8d"
+ "\x27\x7e\xed\xd8\xf7\xbc\xb8\xbf\x99\xce\xc5\xfd\xad\x31\xf2\xe2"
+ "\xfe\xd6\xe8\xbb\xbe\x55\x4e\xec\x37\x59\xf4\xd7\xfc\x59\xe6\xf8"
+ "\xe7\x3f\x17\xca\xf7\xad\x5b\xcb\x38\xdf\xba\xb5\xcc\xd2\xb7\x7e"
+ "\xc5\xfb\xce\x9a\xbe\xc9\xbe\x6f\xcd\xf4\xe6\x7c\xeb\xdb\xab\x88"
+ "\x2e\x7c\x9b\x1d\x6f\xfb\x36\xa3\xb7\x92\x8f\x11\xdf\x7a\x1b\xfb"
+ "\xd6\x2b\xe0\x5b\x17\xc4\x50\x06\x76\x0d\x7e\x3c\x2e\xeb\x2c\x78"
+ "\x4f\xec\x55\x2b\x92\xe0\xdf\x2b\xf5\xe8\xed\xe5\xc8\x75\x0b\x78"
+ "\xce\x03\xd0\x7e\x1d\x58\xad\xa7\xd2\x17\x41\xdd\x5f\x75\x08\x79"
+ "\xc6\x83\x9f\xad\xc7\x7e\xb6\x04\xbc\xea\x26\xd6\xcf\x6e\xc9\xae"
+ "\x58\x69\xe9\x67\x37\xf7\x62\xfc\xac\x9e\x8c\xf9\xaa\x58\x09\x7e"
+ "\x16\xee\x87\xd7\xf4\xb7\xf4\xb3\x2d\xe0\x57\x5b\xc1\xaf\x6a\xaf"
+ "\x59\x79\xdb\x05\xb6\xde\xb6\xc5\x27\x62\x7f\x73\xf0\x90\xed\xd8"
+ "\xdb\xde\xde\xf7\xff\xa3\xb7\x7d\x2b\x99\xf3\xb6\x5b\x66\xcb\xf3"
+ "\xb6\x5b\x66\xf1\xbd\xad\x76\x8d\xad\xb7\xdd\x72\xca\x71\x6f\xbb"
+ "\xe5\xb2\xbc\x32\xb3\xa5\xc6\x31\x6f\xfb\xf6\x44\x6b\x6f\xfb\x01"
+ "\xf3\x5d\x36\x3d\x1d\xf3\x59\xd8\xdb\x92\x73\xb6\x9e\x24\xe3\x32"
+ "\xe7\x49\x32\x8e\x74\x7f\x6f\x9b\x31\x4d\xd8\x7f\x64\xcc\x26\xde"
+ "\xf6\xed\xb0\xce\xf7\xb6\x6f\x87\x09\x7b\xdb\x0c\x76\xfc\xff\xdb"
+ "\x61\xb6\xde\x16\xae\x11\xf4\xb6\x99\xbd\xac\xaf\x21\xde\xf6\xed"
+ "\x70\xe2\x6d\x33\x87\x89\x7b\xdb\xcc\x93\xa4\x0e\xcb\xcc\x24\x75"
+ "\x18\xc1\xd4\xd6\xdb\x66\xc6\x75\xec\x6d\x09\x87\x98\xe7\x14\xf5"
+ "\xb6\x99\x87\x6c\xbd\x6d\xfa\x46\x61\x6f\xbb\x75\x13\xc7\xa3\xad"
+ "\xfe\x7c\x6f\x9b\xd9\xd8\x33\xbc\xad\x28\xb7\xa6\xf1\xbd\x6d\xd6"
+ "\x69\xe9\xde\x36\xab\x45\x9a\xb7\xc5\x9c\x13\xf2\xb6\x5b\x27\xb2"
+ "\xfc\x09\x17\xf6\xb6\x5b\xe7\x09\x7b\xdb\xad\x6b\xf8\xde\x16\xe7"
+ "\x2f\xe4\x6d\xb7\xee\xe3\xe5\x6f\xe3\x6d\xb7\x9e\xe2\x7b\x5b\x92"
+ "\x8e\xf3\xb6\xda\x58\x52\x87\xa6\x07\x4b\xf7\xb6\xda\x89\xe2\xde"
+ "\x56\x1b\xc1\xf7\xb6\x5a\x15\xf1\xb0\xda\x24\xe2\x6d\xb5\xa3\xc9"
+ "\xf1\x74\xb5\xe5\x71\xce\xdb\x92\xe3\x9c\xb7\xd5\xa6\x4b\xfb\x2e"
+ "\xeb\xd4\xba\x47\x39\x5d\x3f\x67\xa0\xb3\xd6\x3d\x32\x7f\x9b\xed"
+ "\xaa\x39\x03\xef\x0c\x93\xe7\x6f\xdf\x51\xdd\xf5\x58\x52\x75\xbe"
+ "\x36\x8f\xd3\xf9\xef\xee\x90\xa7\x59\xde\xdd\x7e\xd7\x63\xc9\x89"
+ "\xfd\x3b\xf1\x5c\xec\x73\x7d\xe4\xc5\x3e\xd7\x5b\xbe\xc7\xca\x77"
+ "\xe7\x3c\x56\xbe\xbb\xf8\xb7\xc1\xdc\xab\xf6\x3d\xd6\xce\x69\x9c"
+ "\xc7\xda\x7e\x8c\xe8\x93\xed\x3b\x88\x3e\xd9\x3e\xbd\xf3\xbe\x0d"
+ "\xfe\xe5\x1c\xff\xdb\xe0\xb6\xa9\x77\xbf\x0d\x76\x86\x7f\x7a\x57"
+ "\xc7\xf9\xa7\xbf\xe4\xcb\xf3\x4f\x7f\xc9\xe3\xfb\xa7\xfc\xe3\xb6"
+ "\xfe\x69\xbb\x8b\xe3\xfe\x69\xbb\xbf\xbc\xf2\xb0\x7d\xb8\x63\xfe"
+ "\x69\xfb\x26\xe1\x6f\x83\xb9\x75\xe2\xdf\x06\xc9\x39\x5b\xdd\xbb"
+ "\xd3\x9f\xd3\xbd\x3b\x6e\x76\x7f\xff\xb4\x23\x47\x58\xe3\xee\xc8"
+ "\x27\xfe\x69\xfb\xc6\xce\xf7\x4f\xdb\x37\x0a\xfb\xa7\x9d\xec\xfc"
+ "\xd7\xed\x1b\x6d\xfd\x13\x5c\x23\xe8\x9f\x76\x4e\xb4\xbe\x86\xf8"
+ "\xa7\xed\xe9\xc4\x3f\xed\x9c\x27\xee\x9f\x76\x1a\x49\xfd\xb4\xf3"
+ "\x2c\xa9\x9f\x08\xa6\xb6\xfe\x69\xe7\xbe\x8e\xfd\x13\xe1\x10\xf3"
+ "\x9c\xa2\xfe\x69\xe7\x75\x5b\xff\x94\x5b\x2b\xec\x9f\xf2\x4e\x73"
+ "\x3c\xca\x8b\xe3\xfb\xa7\xf7\xc6\xf4\x0c\xff\x24\xca\xad\x1c\xbe"
+ "\x7f\xca\xeb\x25\xdd\x3f\xe5\x3d\x29\xcd\x3f\x61\xce\x09\xf9\xa7"
+ "\xbc\x4d\x2c\x7f\xd2\x85\xfd\x53\xde\x5e\x61\xff\x94\x77\x9c\xef"
+ "\x9f\x70\xfe\x42\xfe\x29\xef\x32\x2f\x7f\x1b\xff\x94\xef\xc2\xf7"
+ "\x4f\x24\x1d\xe7\x9f\xf2\x0b\x48\x1d\x9a\x9b\x2d\xdd\x3f\xe5\x6f"
+ "\x12\xf7\x4f\xf9\x99\x7c\xff\x94\x1f\x43\x7c\x52\x7e\x11\xf1\x4f"
+ "\xf9\x2b\xc9\xf1\x5c\xad\xe5\x71\xce\x3f\x91\xe3\x9c\x7f\xca\x2f"
+ "\x95\xe6\x9f\x1c\x5f\x17\xe9\xd7\x1f\xd7\xaa\xea\xa1\xe3\x5a\x77"
+ "\xcf\x96\xe7\x9d\x76\xcf\xba\xab\xe1\xe5\x68\xf8\xfc\x6a\x4e\xc3"
+ "\xef\x91\x39\xff\x77\x4f\x95\x7c\x0d\xbf\xbf\x92\xd3\xf0\xfb\x2b"
+ "\xc5\x35\xfc\xde\x43\xf6\x35\xfc\x07\xbe\x9c\x86\x2f\x58\x43\xda"
+ "\xc8\x82\xd9\xa4\x8d\x2c\x18\xd2\x79\x1a\xfe\xfd\x5c\xbe\x86\xff"
+ "\xab\xcf\x5d\x0d\xdf\x19\x1a\x7e\xb7\xc5\x7e\xc7\xef\xcf\x93\xa7"
+ "\xe1\xdf\x8f\xe1\x6b\xf8\x03\xeb\x6c\x35\xfc\xfb\xa7\x1d\xd7\xf0"
+ "\xef\x5f\x95\x57\x1e\xde\xaf\x75\x4c\xc3\x17\x4c\x12\xd6\xf0\x7b"
+ "\x0b\xc5\x35\x3c\x39\x67\xab\xbd\xf6\x5d\xe5\xb4\xd7\xbe\x63\xdd"
+ "\x5f\xc3\xef\x8b\x16\xd6\x59\xfb\xe6\x11\x0d\x5f\x10\xde\xf9\x1a"
+ "\xbe\x20\x5c\x58\xc3\xef\xfb\x8e\xe8\x9d\x82\x70\x5b\x0d\x0f\xd7"
+ "\x08\x6a\xf8\x0f\xfa\x5a\x5f\x43\x34\x7c\xc1\x64\xa2\xe1\x3f\xf0"
+ "\x17\xd7\xf0\x1f\x9c\x22\xf5\xd3\x07\xd9\xa4\x7e\x22\x98\xda\x6a"
+ "\xf8\x0f\x16\x76\xac\xe1\x09\x87\x98\xe7\x14\xd5\xf0\x1f\x1c\xb1"
+ "\xd5\xf0\x7b\x0f\x0a\x6b\xf8\xfd\x9b\x39\x1e\xed\x1f\xc9\xd7\xf0"
+ "\x1f\xb4\xf4\x0c\x0d\x2f\xca\xad\x68\xbe\x86\xff\x3f\x67\xa4\x6b"
+ "\xf8\xff\x63\x94\xa6\xe1\x31\xe7\x84\x34\xfc\xfe\x49\x2c\x7f\x26"
+ "\x0b\x6b\xf8\xfd\x71\xc2\x1a\x7e\xff\x3a\xbe\x86\xc7\xf9\x0b\x69"
+ "\xf8\xfd\x07\x78\xf9\xdb\x68\xf8\xfd\xa7\xf9\x1a\x9e\xa4\xe3\x34"
+ "\xfc\x81\x78\x52\x87\xee\x7d\x49\xba\x86\x3f\x30\x49\x5c\xc3\x1f"
+ "\x98\xca\xd7\xf0\x07\x86\x13\xad\x7e\x20\x99\x68\xf8\x03\x1a\x72"
+ "\x7c\xef\x34\xcb\xe3\x9c\x86\x27\xc7\x39\x0d\x7f\x20\xe3\xee\xba"
+ "\x49\xdd\x71\xdd\xa4\x0f\xfd\xe5\xe9\xf8\x0f\x87\xcb\xd7\x92\x1f"
+ "\x37\x73\x5a\xf2\xe3\x66\x4b\x2d\xc9\x5f\xdb\xe0\xc3\x16\xfb\x5a"
+ "\xb2\x30\x94\xd3\x92\x87\xf7\x92\xba\xfa\xf0\x26\x52\x57\x1f\x66"
+ "\xbe\xef\x49\x5b\x37\xe9\xd0\x49\xfe\xba\x49\x07\x27\xdd\x5d\x37"
+ "\x49\xae\x4e\x3c\xb0\x87\xd3\x89\x87\x36\xcb\xd3\x89\x87\xd2\xf9"
+ "\x3a\xf1\x93\x7d\xb6\x3a\xf1\xd0\x75\xc7\x75\xe2\x61\x2f\x79\x3a"
+ "\xf1\xb0\xd2\x31\x9d\x78\x78\x99\xf0\x1a\x06\x1f\x1a\xc4\xd7\x4d"
+ "\x22\xe7\x6c\xdb\xf7\x42\x2f\xae\x7d\xff\xe8\x62\xf7\xd7\x89\x1f"
+ "\xa5\x0a\xb7\xe5\x1f\x6d\x26\x3a\xf1\x70\x62\xe7\xeb\xc4\xc3\x89"
+ "\xc2\x3a\xf1\x23\x23\x69\x53\x0f\xaf\xb4\x5d\xc3\x00\xae\x11\xd4"
+ "\x89\x85\x8f\xb0\xd7\x24\xf2\x75\x22\xc9\x03\xea\x9a\x08\x71\x9d"
+ "\x58\x78\x95\xd4\x3d\x85\xc7\x49\xdd\x43\x30\xb5\xd5\x89\x85\xd9"
+ "\x1d\xeb\x44\xc2\x21\xe6\x39\x45\x75\x62\xe1\x05\x5b\x9d\xf8\x61"
+ "\xb3\xb0\x4e\xfc\xd8\x62\x9d\xd6\x8f\xa7\xf2\x75\xe2\x91\x61\x3d"
+ "\x43\x27\x8a\x72\x2b\x95\xaf\x13\x8f\xdc\x94\xae\x13\x3f\xf6\x97"
+ "\xa6\x13\x31\xe7\x84\x74\xe2\xc7\xcb\xac\x39\xc7\xd7\x89\x1f\x67"
+ "\x0a\xeb\xc4\x8f\xf7\xf1\x75\x22\xce\x5f\x48\x27\x7e\x7c\x8e\x97"
+ "\xbf\x8d\x4e\xfc\xf8\x3a\x5f\x27\x92\x74\x9c\x4e\xfc\x44\x4b\xea"
+ "\xd0\x0f\xf7\x4a\xd7\x89\x9f\x2c\x13\xd7\x89\x9f\xac\xe1\xeb\xc4"
+ "\x4f\x26\x13\x3d\xf8\x49\x01\xd1\x89\x9f\xc4\x90\xe3\x1f\xee\xb1"
+ "\x3c\xce\xe9\x44\x72\x9c\xd3\x89\x9f\x1c\x95\x36\x0f\xa4\x53\xfa"
+ "\x7a\xbb\x68\x1e\x48\x67\xf5\xf5\x76\xf5\x3c\x90\x63\x32\xd7\xbf"
+ "\x3f\xe6\xe8\xfa\xf7\x77\xc7\xc9\xb4\xf7\xf3\x7e\x52\xca\xf5\xf3"
+ "\xfe\xcf\x29\x79\x7a\xe5\x7f\x8a\xe5\x6b\xf3\xcf\x2c\xf6\xef\xfd"
+ "\x8c\xb7\x7f\x2f\x7f\x3c\xfc\xdf\x73\xed\x6b\xf3\x13\x16\xfb\xf7"
+ "\x7e\xca\xee\xdf\xfb\x29\xbb\x7f\xef\xa7\xc3\xe4\x8c\x87\xdf\x52"
+ "\x8f\x5c\xdf\xb6\x1e\x0f\x7f\xfe\x24\x19\x0f\xbf\xdc\x7a\x3c\xfc"
+ "\xf1\x1d\xfc\xf1\xf0\x45\x3e\x62\xe3\xe1\x71\xbf\x6f\xdb\xa1\x21"
+ "\x39\x78\x2c\xbc\xe0\x38\xf8\x19\x9d\x3b\x0e\x1e\x73\xf3\xbd\xb5"
+ "\x44\xdb\xef\xec\x91\xda\xfe\x98\xc5\xda\xf9\xc7\x65\xee\xff\x7b"
+ "\xdc\x6a\xff\xdf\xcf\x05\xf6\xff\x3d\x2e\x61\xff\xdf\xe3\x32\xf7"
+ "\xff\x3d\xee\xe0\xfe\xbf\x9f\xda\xec\xff\x4b\xc6\xc1\xff\x7d\xbb"
+ "\xf8\x38\x78\x72\xce\x56\x93\xfd\xc3\x62\x5d\xa9\x7f\xf4\x80\xfd"
+ "\x7f\xff\x21\xb2\x47\xeb\x3f\xd8\xfd\x7f\x3f\xbd\x03\xfb\xff\x7e"
+ "\x2a\xb2\xff\xef\x3f\xd8\xfd\x7f\x3f\x6d\xdf\xcb\x97\xd3\xf6\x9f"
+ "\x8a\xec\xff\x7b\xc2\xc3\xfa\x1a\xa2\xed\x3f\x65\xf7\xff\x3d\x61"
+ "\x67\xff\xdf\x13\xec\xfe\xbf\x27\xd8\xfd\x7f\x09\xa6\xb6\xda\xfe"
+ "\x84\x03\xfb\xff\x7e\xca\xee\xff\xfb\xa9\x9d\xfd\x7f\x4f\x08\xec"
+ "\xff\xfb\xf7\x1c\x61\x6d\xff\x99\xc5\xfe\xbf\x9f\x59\xed\xff\x7b"
+ "\xa2\x87\xec\xff\x2b\xca\x2d\xab\xfd\x7f\x4f\xca\xd8\xff\xf7\x33"
+ "\x89\xfb\xff\x7e\x2a\xb2\xff\xef\x67\xec\xfe\xbf\x9f\x8a\xec\xff"
+ "\xfb\x99\xc8\xfe\xbf\x9f\x59\xed\xff\xfb\xa9\xc8\xfe\xbf\x9f\x1d"
+ "\xe2\xe5\x6f\xa3\xed\x3f\xb3\xda\xff\xf7\x53\xab\xfd\x7f\x3f\x67"
+ "\xf7\xff\xfd\xfb\x38\xe9\xda\xfe\x73\x3b\xfb\xff\x7e\x6e\xb5\xff"
+ "\xef\xe7\xec\xfe\xbf\x9f\xb3\xfb\xff\x7e\xce\xee\xff\xfb\xf7\xb1"
+ "\x96\xc7\x39\x6d\x4f\x8e\x73\xda\xfe\x73\x29\xfb\xff\x16\x48\xe9"
+ "\x03\xfe\xf5\xc7\x71\x28\x7b\xe8\x38\x8e\x53\x32\xfb\x7f\x4f\x39"
+ "\xd1\xff\x7b\xc6\x9b\xd3\x98\x67\xbc\xc5\xc7\x12\x9c\xea\xa0\xff"
+ "\xf7\xab\x59\x9c\xc6\x2c\x61\xe7\x2b\x95\xec\x25\xf5\x74\xc9\x3c"
+ "\x47\xc7\x12\x6c\xb9\xcd\xea\x4a\xf3\x58\x82\xd5\xec\x58\x02\xd0"
+ "\x96\x44\x4b\x7e\x79\x81\x3f\x96\xe0\x8b\x79\x62\x63\x09\x04\xc7"
+ "\x10\x58\xe9\x47\xb3\xd6\x94\x3b\x86\xa0\xe7\xeb\xc7\xcf\x2d\xc6"
+ "\x10\x7c\xb9\x4f\x9e\x7e\xfc\xb2\x80\xaf\x1f\xcf\x9c\xb2\xd5\x8f"
+ "\x25\x7d\x1d\xd7\x8f\x25\xc1\xf2\xf4\x63\x89\xda\x31\xfd\x58\x92"
+ "\x29\x3c\x86\xe0\x94\x41\x7c\x0c\x01\x39\x67\xdb\xee\x7f\x15\xcc"
+ "\xb5\xfb\xa7\x5b\xba\xbf\x7e\x3c\x9d\x27\xdc\xc6\x9f\xde\x47\xf4"
+ "\x63\x49\x46\xe7\xeb\xc7\x92\x0c\x61\xfd\xf8\xd5\x20\xd2\xd6\x96"
+ "\x64\xd8\xea\x47\xb8\x46\x50\x3f\x7e\x15\x61\x7d\x0d\xd1\x8f\x25"
+ "\x5a\xa2\x1f\xbf\x5a\x28\xae\x1f\xff\x6f\x2f\x52\x2f\x7d\xf5\x1d"
+ "\xa9\x97\x08\xa6\xb6\xfa\xf1\xab\x43\x1d\xeb\x47\xc2\x21\xe6\x39"
+ "\x45\xf5\xe3\x57\x8d\xb6\xfa\xf1\x94\x48\xdf\x70\xe9\x59\x8e\x47"
+ "\xa5\x8b\xf9\xfa\xf1\xff\x8e\xeb\x19\xfa\x51\x94\x5b\x79\x7c\xfd"
+ "\x58\xea\x21\x5d\x3f\x96\x8e\x97\xa6\x1f\x31\xe7\x84\xf4\x63\x69"
+ "\x26\xcb\x1f\xad\xb0\x7e\x2c\x3d\x20\xac\x1f\x4b\x4f\xf1\xf5\x23"
+ "\xce\x5f\x48\x3f\x96\x5e\xe7\xe5\x6f\xa3\x1f\xcf\xf4\xe5\xeb\x47"
+ "\x92\x8e\xd3\x8f\x67\x0e\x92\x3a\xf4\x94\x8c\xbe\xe1\x33\x99\xe2"
+ "\xfa\xf1\x4c\x2e\x5f\x3f\x9e\x61\xd7\xce\x3f\x53\x4c\xf4\xe3\x99"
+ "\x64\x72\xfc\xd4\x1e\xcb\xe3\x9c\x7e\x3c\x65\xd5\x37\x7c\xa6\xd2"
+ "\x9e\x7e\xa4\xb5\xf5\xe9\x5a\xca\x54\x08\x3f\xdc\x96\x0e\x82\x76"
+ "\xac\x18\xfe\x5d\x0a\xed\x91\x12\xfe\x5d\x29\xa6\x57\xf4\x5e\xf5"
+ "\xe9\x26\xd0\x1e\x26\xb8\x4f\x85\xfe\x97\xe2\x62\x3f\x03\xdc\xfb"
+ "\x6b\xb2\x67\x0b\xe4\xe9\x69\xe8\x13\x6e\xa2\xe3\xa1\x0d\x87\x7f"
+ "\x27\xc1\x31\x48\xdf\x1f\xda\x3d\xd5\x6a\xd4\xff\x06\xf5\x75\xa2"
+ "\x39\x1d\x3c\x73\xff\x4b\xd4\xd7\xc1\x38\x8f\xa6\x2d\x5f\x27\xc3"
+ "\xfb\x54\x8b\x3e\x2b\xe4\x15\x79\x60\x28\x5a\x67\xa0\x7f\x2a\x5e"
+ "\x52\x8f\x6a\xa8\xaf\x4f\x7b\xd6\xf5\x09\x87\x7a\x08\x61\xbd\x57"
+ "\xe8\xa7\x77\xc5\x79\x16\x2f\x69\xc5\xe7\xf6\xe3\x73\x46\x78\xc6"
+ "\x94\xc5\x88\xca\xaa\xef\xe3\x06\xba\xaa\xd7\xfa\x06\xba\x76\xa9"
+ "\x01\x9e\x39\xc9\x80\x3e\x1f\x5a\xe5\xfa\xd1\xce\x2a\xa6\xed\x29"
+ "\x6f\x30\x32\x79\xa8\x96\x30\xcf\x73\x66\x17\xa4\x17\x7a\x86\x4d"
+ "\x87\x91\xba\xd7\x48\x5a\x27\xad\xbd\xfb\x66\xb0\x58\x1c\x3d\xd3"
+ "\x86\xa2\xe2\x40\x88\x9d\x0a\x51\x42\xe7\x25\xde\xc7\xde\xfa\xb7"
+ "\x6e\xef\x0e\xa4\x1b\xd6\xef\x40\xd4\x56\x53\x1f\xb7\x2f\xa1\x4e"
+ "\xdc\xbd\x8d\xd6\x37\x6d\xf9\x46\xaf\x73\x39\x35\x0d\xc7\xfc\x4d"
+ "\x38\xbf\x75\x20\xad\xbf\xb5\x01\xf3\xa6\xcc\xed\x14\xb4\xed\xd6"
+ "\x58\x2c\x8f\x5d\x3c\x4f\xb5\x72\xe1\xe2\xb8\xa5\xab\x56\xaa\xfc"
+ "\x63\xfb\xa1\x69\x4b\x97\xaa\x16\xcf\x5b\xb2\x46\x65\x79\xe6\xf7"
+ "\xaa\xd8\x85\x2b\xe6\xcd\x4f\x88\x0b\x5e\xfc\x4a\x62\x3f\x78\x26"
+ "\x64\xf1\x1c\xde\xf8\x59\x4c\x5b\xca\xbc\x77\xbd\x83\xd0\xbb\x03"
+ "\x90\x2b\x7e\x2e\xb8\x5f\x92\xce\xd5\x3d\x0f\xdf\x2f\x6b\x1b\xdd"
+ "\x40\x41\x9a\xf5\x50\xa7\x6d\x4d\xe9\x03\x69\xbf\xd9\xb8\x1b\x9e"
+ "\x6b\x17\x3c\x37\x3c\x23\x3c\x73\x59\x81\xf9\x99\xcd\x9c\x58\x8f"
+ "\x39\x91\x52\x0f\x1c\x2c\x3b\xed\xd9\xdc\xe7\x79\x9a\x8e\xc6\xef"
+ "\xd7\x00\x65\xc5\xe5\x0a\x75\x76\x36\xe3\x01\xb2\xeb\xd3\xe1\x5a"
+ "\x9d\x99\x63\xa6\x9c\xa7\x54\xf4\x3b\xf5\x51\xa0\x1d\x5d\x9a\xe8"
+ "\xf8\xa7\x81\x9b\x70\xfd\xd9\xe0\x51\x08\xa5\xd2\x4d\xd1\xcc\xfe"
+ "\x03\x74\x13\x70\x98\xf0\x14\xce\x95\xa3\x5b\x14\x7a\xa6\x69\xcb"
+ "\xd9\xe1\x3a\xb4\xb8\x0e\xe7\xa1\x83\x63\x38\xe6\xa6\x3d\xd1\x7b"
+ "\x5e\x0a\x40\xa9\x23\x52\x51\x6a\x13\xbe\xa6\xc0\x2f\xc9\x73\x25"
+ "\x72\x89\x4c\xa2\x7f\x80\x7a\xc7\x85\x1e\x16\xbd\x87\xde\xe7\x97"
+ "\xa4\xa3\xce\xba\x99\x72\x9f\x52\xc1\xfb\xd4\x41\x3e\x09\x3a\xd4"
+ "\x56\x89\xf3\xd9\xba\x8d\x89\x7d\x1d\x7e\x77\x88\x0f\x78\x19\xba"
+ "\x98\xde\xc0\x96\x21\xad\x67\x95\x49\x3b\x07\x55\xb8\xde\x46\x91"
+ "\x06\xba\x8d\xce\xf6\xac\x2a\x6f\x68\x80\x3a\x2d\xf1\x15\xba\x5f"
+ "\x99\xbf\xa7\x61\x61\xdc\xee\x01\x50\x16\xb3\xe7\x20\x3a\x7b\x84"
+ "\xf7\x4b\x23\x91\x12\xf2\x2e\x35\xc7\x13\x62\xe9\x2a\x8d\x47\x67"
+ "\x99\x35\x5d\x30\x1f\xe0\x79\x58\x3e\x94\xfb\x9e\x5a\x69\xcb\x87"
+ "\xf6\xb2\xb9\x2d\x50\x6b\xa0\xa3\x9f\x6f\xcb\x09\x2c\xa5\xbd\x03"
+ "\x8f\xa6\x5c\x46\xbd\x71\x6c\xcb\x41\xef\x67\xad\x46\xbe\x99\x73"
+ "\x90\x6a\xee\x1a\x25\xd2\xe7\x06\x16\x7a\xa6\xa5\xba\x40\x4c\x28"
+ "\xa8\x5f\x42\xa0\xce\x0c\x69\x1b\xf8\x94\x2a\x39\x0e\x51\x87\x2e"
+ "\x15\x52\x58\x27\xe3\x71\x21\x10\xeb\x0b\xbb\xe0\x3a\xfa\x97\x68"
+ "\x84\xf1\x60\xb0\xf8\x25\x1e\x45\x80\x6a\xc0\xdf\x38\xae\x50\x15"
+ "\x1e\xf9\x90\xa7\xb4\xf7\x2a\x67\xf4\xaf\x11\xb0\x1a\x05\x38\x55"
+ "\xd4\x18\x99\x3c\x19\xac\x12\x38\xac\x4e\xc2\x73\x70\x78\x95\xe7"
+ "\x60\x5c\x85\xdf\x39\x48\x49\xde\x39\x28\x9c\xf6\x0e\x1a\x2d\xfe"
+ "\xce\x41\x21\xe4\x9d\x7b\xd5\xdb\x7f\xe7\x8a\xb3\xf6\xdf\xb9\xd2"
+ "\x45\xfa\x3b\x57\x6c\x97\xfe\xce\x15\xe9\x76\xde\x99\xc5\x39\x08"
+ "\x70\x0e\xb2\x83\x73\x10\x8b\xf3\x3d\x97\xec\xbf\x73\xe5\xa9\x0e"
+ "\xde\xb9\x51\xfa\x3b\x57\x66\x48\x7f\xe7\xca\x64\xf1\x77\x56\xb3"
+ "\x38\xab\x01\x67\xb5\x1d\x9c\xd5\x2c\xce\x5e\xdf\xda\x7f\xe7\x73"
+ "\xc7\xec\xbf\xf3\xb9\xab\xd2\xdf\xf9\x5c\xaa\xf4\x77\x3e\x97\x68"
+ "\xe7\x9d\x59\x9c\xd5\x80\xb3\xda\x0e\xce\x6a\x16\xe7\xc7\xb7\xd8"
+ "\x7f\xe7\x6f\x0f\xd8\x7f\xe7\x6f\x2f\x4a\x7f\xe7\x6f\x57\x4a\x7f"
+ "\xe7\x6f\x63\xc5\xdf\x39\x98\xc5\x39\x18\x70\x0e\xb6\x83\x73\x30"
+ "\x8b\xf3\xcc\x09\xf6\xdf\xf9\x7f\xf3\xed\xbf\xf3\xff\x9e\x93\xfe"
+ "\xce\xff\x1b\x2f\xfd\x9d\xff\x37\x5a\xec\x9d\x5b\xa1\xde\x76\x87"
+ "\x77\x69\xfb\x57\xf4\xf3\x46\xef\xc0\x13\xee\x35\x88\xca\xdb\x60"
+ "\x8a\xf7\xac\x45\x7d\xe1\xdd\xe2\xe9\x6d\xe3\xf4\xf8\xaf\xc9\x3b"
+ "\xb0\xa8\xd5\x3b\xb0\xb4\x65\x40\x7d\xd4\x1b\xb3\x51\x6f\xac\xc7"
+ "\x37\x9b\x90\xaf\x29\x27\xf0\x68\xc6\x0b\x48\xb5\x5e\x8f\x94\xe5"
+ "\x29\x3a\x94\x92\x48\xeb\xcb\xd1\x8f\xc8\xa3\x16\x7b\xcf\xef\x51"
+ "\x59\x5d\x29\x5a\xb2\x9c\xa6\xaf\x50\xdf\x0d\xc1\xdf\x80\x41\x27"
+ "\xa7\x6a\xff\x89\x54\x70\x8f\x90\x5d\xf0\xc3\xf9\x78\x4e\x86\xf6"
+ "\x73\xdb\xb8\xfa\xdd\x29\xc8\xf7\xb3\x45\xb5\x08\x1f\xcf\x87\x9f"
+ "\x71\xdb\x53\xaa\x94\xd9\x88\x3a\x5c\x5f\x45\x91\xb6\xf9\xfc\x55"
+ "\xeb\xb6\x79\xf2\x3c\x88\xe5\x7c\x7c\xee\xbb\x31\x79\x2f\x48\x8d"
+ "\xe5\xf9\xa3\xe6\xb6\x9b\x89\x65\xb5\x91\xb4\xf7\x56\x6d\xf7\x67"
+ "\x70\x7f\x2e\x96\xe7\x0b\x70\x2c\xe9\x9c\xc0\xca\x8a\xda\x56\xec"
+ "\x9b\x94\x57\x92\x10\x05\xc7\xa7\x95\x27\xd6\x23\xe1\x18\x07\x29"
+ "\xb9\x18\x07\x8d\x75\xaf\xe9\x55\x2f\x1c\xe3\x20\x4d\xab\x77\x50"
+ "\xb8\x6d\x8c\x83\x46\x3b\x16\xe3\x7f\xa6\x39\x1f\xe3\x7f\x46\x88"
+ "\xc7\xf8\x9f\x3b\xa4\xc7\xf8\x9f\xbe\xd2\x63\xfc\x4f\x37\x12\xe3"
+ "\xa0\x28\x7e\x8c\xbf\x2b\xb2\x13\x63\x0b\x1e\x07\x01\x8f\xef\xb9"
+ "\x24\x12\x63\xe0\x71\x90\x00\x8f\x83\x1c\xe4\xf1\xbf\x2e\x3b\x1f"
+ "\xe3\x7f\x1d\x11\x8f\xf1\xbf\x8c\xd2\x63\xfc\xaf\x64\xe9\x31\xfe"
+ "\x57\x02\x1b\x63\x2b\x1e\xff\x6b\xb0\x78\x8c\xd5\x16\x3c\x56\x03"
+ "\x8f\xbd\xbe\x15\x8e\xb1\x1a\x78\xac\x16\xe0\xb1\xda\x41\x1e\x5f"
+ "\x98\xe4\x7c\x8c\x2f\xf8\x88\xc7\xf8\xc2\x3c\xe9\x31\xae\xd2\x49"
+ "\x8f\x71\x55\x25\x89\xb1\xda\x8a\xc7\x55\xa9\x76\x62\x6c\xc1\x63"
+ "\x35\xf0\xf8\xf1\x2d\x22\x31\x06\x1e\xab\x05\x78\xac\x76\x90\xc7"
+ "\xdf\x1f\x72\x3e\xc6\xdf\xaf\x11\x8f\xf1\xf7\xa7\xa5\xc7\xf8\xfb"
+ "\x30\xe9\x31\xfe\x7e\x34\x1b\x63\x2b\x1e\x5f\xa8\x11\x8f\x71\xb0"
+ "\x05\x8f\x83\x81\xc7\x33\x27\x08\xc7\x38\x18\x78\x1c\x2c\xc0\xe3"
+ "\x60\x07\x79\x5c\xed\xe5\x7c\x8c\xff\x7d\x51\x3c\xc6\xd5\x23\xa5"
+ "\xc7\xf8\xdf\xfb\xa5\xc7\xf8\xdf\xdb\x49\x8c\x83\xad\x78\xfc\xef"
+ "\x70\xb1\x18\xb7\x81\x07\xf4\x80\x18\x7b\xd4\x21\x2a\x1f\xc7\xb6"
+ "\x8a\xc4\xd6\x38\x70\x9c\x3e\x9f\x32\xc5\xe3\x98\x30\x7d\x40\x3f"
+ "\xfb\xf6\x37\xe6\x04\x9e\xa0\x29\x78\xa7\x14\xdc\xef\x5a\x9d\x6d"
+ "\xd8\x80\xfa\xab\x52\x70\xff\xef\x7f\x98\xf1\x01\xaa\x94\xb7\x2e"
+ "\xc2\xfd\x14\xb8\xdf\xcb\x90\x7d\x33\xc4\x08\x25\xfb\x0a\x75\xf1"
+ "\x0c\xed\x3f\x58\x0b\x7e\xb3\x92\x7e\xcd\xd7\xbb\xa2\xae\x10\xe2"
+ "\xf3\x35\x2a\xaf\xfa\x14\x99\x06\x8e\xab\x1f\x65\x40\x01\xf4\xcf"
+ "\x01\xde\x65\x2b\x75\xc8\xf8\x8a\xaf\x7b\x45\x52\x29\xaa\x48\xfa"
+ "\x18\x45\xd6\xd2\xb7\xe9\xff\x06\xb8\xb7\xf9\x84\x69\x8c\x3e\xe3"
+ "\x2a\x8d\xb9\x11\x45\x06\x9f\xb0\x80\x43\xab\x75\x94\x7b\x33\x0a"
+ "\x48\xa8\xa1\xe9\xac\xf9\xc8\x35\xeb\x12\x72\xdb\x3a\x1f\xb9\x6f"
+ "\xbd\x84\x94\x65\x35\x55\xe8\xec\xb5\x52\x74\xb6\xfe\x02\x3a\x7b"
+ "\x1b\x7e\xad\xf0\x33\xc1\x2f\xf5\x02\x60\x8d\x50\xc4\x75\x84\xf7"
+ "\x6e\xd4\x07\x55\x23\xef\x32\x43\x15\xc2\xf3\x5f\x6f\x50\x17\xe3"
+ "\xdc\x63\x90\x37\xfd\x5f\x5f\x44\xbf\xe2\x4b\xc1\x39\x57\x7c\xbc"
+ "\xc2\xa0\x47\x65\x35\xcd\xf8\x7c\x18\x9c\x77\x5d\x5f\x03\xf9\x9b"
+ "\x4a\xf1\xde\x8c\xfa\xb2\xd4\x33\xf0\x7e\x7b\x55\x34\xf6\xd0\x03"
+ "\x03\xb5\x5a\x08\xb5\x89\xf6\x7d\x80\xf0\xe0\x3f\xeb\x76\x99\xa4"
+ "\x62\x7d\x31\x87\x89\xf1\x6b\xbe\x03\x20\xce\x7e\xa6\xd7\xa2\x95"
+ "\x53\x2e\xfc\x40\x97\x37\x54\x31\x7d\x09\xe5\x0d\x5f\xa3\x8a\x8d"
+ "\x26\x14\xb9\x06\xa1\xc9\x46\x84\x70\x2c\x2a\x92\x6a\xd1\x94\x44"
+ "\xe4\x89\xfb\x9f\x4d\x3f\x07\x0c\xa8\xa8\xd1\xa3\x75\x06\x78\xc6"
+ "\x1b\xcd\xed\xcf\x58\xbe\xb1\x1c\xc1\x39\xbf\xf2\x78\x1d\x72\x4f"
+ "\x44\x4a\x1c\x5f\x43\x4e\x60\xd1\x14\x28\x3f\x4b\x1a\x68\x1a\xc7"
+ "\x16\xc7\x14\xc7\x17\xe7\x67\x8e\x79\x45\xac\x1e\xad\x6f\x46\xca"
+ "\x8a\x14\xf8\x9b\x44\xeb\x2b\xd0\x4d\x04\xcf\x98\x44\x7b\xed\x55"
+ "\x01\x2f\x1a\x30\x17\x74\x54\x75\x3a\xe0\x3f\x40\x98\x53\x41\xa3"
+ "\x09\xa7\x7a\xd5\x77\xcc\xa9\xa0\xb1\x1c\xa7\xfe\x73\x99\xe3\x94"
+ "\xee\x94\x38\xa7\x74\x43\x08\xa7\x82\xa2\xba\x27\xa7\x7e\x38\x6e"
+ "\x9f\x53\x3f\x6c\x17\xe7\x54\x50\x38\x3d\x30\x48\xc9\xe7\x94\xee"
+ "\x9c\x74\x4e\xfd\x50\xdb\x75\x9c\x0a\xd2\xc8\xe3\xd4\x0f\x65\x7c"
+ "\x4e\xfd\xa7\xda\x0e\xa7\xd8\x7a\xea\x9e\x4b\x0e\x70\xca\xa2\x9e"
+ "\xfa\xf1\x49\x8e\x53\xff\xf5\x11\xe7\xd4\xa5\x65\x2c\xa7\xba\x69"
+ "\x3d\x75\xc9\xc3\x3e\xa7\x7e\xac\xb3\xc3\x29\xa8\xa7\x82\xac\xea"
+ "\xa9\xff\xfa\x4b\xe7\xd4\xa5\xb1\x5d\xc8\x29\x99\xf5\xd4\x25\x15"
+ "\x9f\x53\x3f\x86\x88\x73\x4a\xcd\xd6\x53\x5e\xdf\x76\xcc\x29\xb5"
+ "\x45\x3d\xf5\xdf\x4c\x8e\x53\x97\x17\x8a\x73\xaa\xe6\x34\xe1\x94"
+ "\xba\x9b\xd6\x53\x35\xf3\xec\x73\xaa\x26\x54\x9c\x53\x6a\xa8\xa7"
+ "\xd4\x56\xf5\xd4\xe5\x35\xd2\x39\x55\xa3\xed\x3a\x4e\xa9\x65\xd6"
+ "\x53\x35\x2b\xf9\x9c\xfa\xef\x46\x3b\x9c\x62\xeb\xa9\xc7\xb7\x38"
+ "\xc0\x29\x8b\x7a\xea\xf2\x8f\x1c\xa7\x7e\x3a\x29\xce\xa9\x9f\x06"
+ "\xb1\x9c\xea\xa6\xf5\xd4\x95\x63\xf6\x39\x75\x25\xc7\x0e\xa7\xa0"
+ "\x9e\x52\x5b\xd5\x53\x3f\x9d\x95\xce\xa9\x2b\x35\x5d\xc8\x29\x99"
+ "\xf5\xd4\x95\x52\x3e\xa7\x2e\x57\x89\x73\x2a\x98\xad\xa7\x66\x4e"
+ "\xe8\x98\x53\xc1\x16\xf5\x54\xed\x18\x8e\x53\xd7\xbc\xc4\x39\x75"
+ "\x75\x31\xe1\x54\x70\x37\xad\xa7\xae\xf6\xb5\xcf\xa9\xda\x5a\x71"
+ "\x4e\x05\x43\x3d\x15\x6c\x55\x4f\x5d\x1b\x26\x9d\x53\x57\x35\x5d"
+ "\xc7\xa9\x60\x99\xf5\xd4\xd5\xc1\x7c\x4e\xd5\xaa\xc5\x38\xd5\x8a"
+ "\x7d\x9f\x0b\x70\x2a\x1e\x7c\x1f\x70\xc8\xb3\x92\x70\xaa\x0d\x38"
+ "\xf5\x9e\x25\xa7\xfe\x6d\xed\xfb\xae\x6d\x36\xb5\x73\xaa\x2e\xd7"
+ "\x9a\x53\x26\xe0\x54\x1b\xc3\xa9\x9f\x0f\x99\x7d\x5f\x45\xdd\x1e"
+ "\xc0\xea\x1a\xaa\x88\x02\x3e\x6d\x63\xf9\xf4\x6f\xe0\x13\xbc\x8f"
+ "\x09\xde\xb7\xac\xba\x0a\x45\xea\xc9\x7b\xb5\xc2\xfb\x9a\x2c\xb9"
+ "\xd4\x5a\x4b\x61\x0e\x61\xee\x98\x79\x74\x76\x09\xf0\x67\xf9\x39"
+ "\x74\x76\x35\xfc\xd6\xc2\x2f\x05\x7e\xe8\x1c\x2a\x03\xc5\x8b\xfb"
+ "\xec\x39\xfe\x54\xb2\xfc\xf9\x79\x92\x7d\xfe\xfc\x1c\x20\xcd\xe3"
+ "\xd5\xed\x93\xce\x9f\x9f\x93\xd8\xb1\x74\xca\xc8\xa9\x3f\xd0\x78"
+ "\x0c\x2c\xe1\xc8\x35\x14\x69\x40\x9e\xf4\xcc\x80\x01\xee\xd1\x48"
+ "\xf9\x86\x11\x51\x99\xf3\x91\x32\xf3\x7b\x78\x5f\x73\xd9\xb9\x84"
+ "\xdc\xbf\x6e\xfe\x14\x95\xd5\x57\xa1\xb2\xdb\x67\x50\x99\x09\x7e"
+ "\xd7\xe0\x07\xcf\x18\x19\x67\xf9\xbe\x7a\xf6\x7d\xeb\x9e\x84\xbc"
+ "\x86\x8b\xbf\x6f\x9d\x2f\xf3\xbe\xb1\xf0\xbe\xad\xdc\xfb\x56\x00"
+ "\x17\x01\x17\x3f\x13\xeb\x13\x23\xf5\xa8\xef\x52\x03\x4d\xb7\xb2"
+ "\x1c\xc4\xb8\x7c\x7d\xbe\x19\x45\x26\x02\x56\xaf\x00\x07\x6b\xf6"
+ "\xa3\xf5\xc9\xc0\xc1\xd6\x66\xfc\x5d\x5f\x5f\x91\xda\x02\x1c\xfc"
+ "\x79\x16\x0d\x71\x6b\xc3\x1c\xfc\x37\xe6\xe0\xb5\x54\x93\x28\x07"
+ "\xc1\x27\x32\x1c\x04\x9f\xd8\x21\x07\x2d\x7d\xe2\x75\x0f\x8e\x83"
+ "\xbf\x0c\x12\xe7\xe0\x8d\x47\xcc\x3e\xf1\xd7\xe7\xe0\xf5\xb3\xf6"
+ "\x39\x78\xfd\xa0\x34\x4f\xf8\xcb\x48\xe9\x1c\xbc\x6e\xe8\x3a\x0e"
+ "\xde\x38\x69\x9f\x83\x37\xf2\x3a\xe6\x60\x90\x46\x1e\x07\xaf\xeb"
+ "\xf8\x1c\xbc\xee\x6a\x87\x83\x6c\x3d\x08\xbe\xb2\x63\x0e\x5a\xd4"
+ "\x83\xbf\x64\x73\x1c\xbc\x99\x2f\xce\x41\xfd\x31\xb3\xaf\xfc\xf5"
+ "\x39\xa8\x9f\x6a\x9f\x83\xfa\x10\x69\x1e\xf2\xe6\x21\xe9\x1c\xd4"
+ "\xa7\x76\x1d\x07\x6f\x8e\xb7\xcf\xc1\x9b\x2a\x07\x38\x28\xb3\x1e"
+ "\xd4\xc7\xf2\x39\xf8\x4b\xba\x38\x07\xd5\x6c\x3d\x08\x3e\xb4\x43"
+ "\x0e\x5a\xfa\xd0\x7a\x1f\x8e\x83\x0d\xc3\xc4\x39\x78\xeb\x49\xb3"
+ "\x0f\xfd\xf5\x39\x58\xff\x9d\x7d\x0e\xd6\x1f\x95\xe6\x39\x1b\x1e"
+ "\x91\xce\xc1\x5b\xae\x5d\xc7\xc1\x5b\xa7\xed\x73\xf0\x56\x41\xc7"
+ "\x1c\x54\xcb\xac\x07\xeb\x6b\xf9\x1c\xac\x77\xb7\xc3\x41\xb6\x1e"
+ "\x04\xdf\xda\x31\x07\x2d\xea\xc1\x86\x1d\x1c\x07\x6f\xef\x13\xe7"
+ "\x60\xe3\x49\xb3\x6f\xfd\xf5\x39\xd8\x38\xdd\x3e\x07\x1b\x35\xd2"
+ "\x3c\xea\xed\x63\xd2\x39\xd8\x98\xde\x75\x1c\xbc\x3d\xc9\x3e\x07"
+ "\x6f\x07\x38\xc0\x41\x99\xf5\x60\x63\x02\x9f\x83\x0d\x5a\x71\x0e"
+ "\x06\xb3\xf5\x20\xf8\xdc\x0e\x39\x68\xe9\x73\x9b\x86\x70\x1c\x6c"
+ "\x19\x29\xce\xc1\xe6\xf1\x66\x9f\xfb\xeb\x73\xb0\xe9\xa2\x7d\x0e"
+ "\x36\x9d\x90\xe6\x69\x5b\x9e\x94\xce\xc1\x66\xf7\xae\xe3\x60\xf3"
+ "\x59\xfb\x1c\x6c\x3e\xd8\x31\x07\x83\x65\xd6\x83\x4d\x7a\x3e\x07"
+ "\x9b\xbc\xc5\x38\x68\x02\x5f\xdc\x56\x30\x58\x6b\xca\x09\xd3\x78"
+ "\xba\xa8\x90\xc1\x7b\x14\xaa\x58\xd9\x80\xa6\x34\x42\x7c\x12\x1b"
+ "\xd1\x9c\x46\x25\x32\xe6\x84\x05\x80\x2f\x2c\xb2\xf0\xcf\xcc\xd8"
+ "\x32\x83\x76\xaf\x6a\xeb\x12\xe4\x0a\xfe\x1b\xfb\x99\x90\x8a\x2b"
+ "\xcd\x08\xdf\x7f\x1d\x7e\x9e\x6b\xdc\xf3\xe0\x7e\x02\xfa\x97\x00"
+ "\x25\xf3\x8d\xb9\x55\x87\x6a\xc6\x22\x45\x59\x8d\x0e\xe2\xb0\x96"
+ "\xc1\x17\xc7\xe5\x0a\xd5\xea\xbe\xfb\x06\x72\x35\xfc\xd7\xd7\x0f"
+ "\xe2\xed\xed\xf1\x3a\x72\x19\x5c\x43\x9b\x70\x5c\x71\xbc\x70\x8c"
+ "\x55\x6b\xf1\xb7\xeb\xd6\xd9\xe5\xc0\x31\xc3\x7f\x03\xfc\x76\x41"
+ "\x3a\x61\xbf\xda\x1a\x27\x9d\x1b\xad\xec\x7c\xd8\x56\xd7\xb2\x6a"
+ "\x24\xf8\xed\xd8\x04\xfe\xcd\xb1\x58\x05\x69\x2c\x7c\xde\x1d\x88"
+ "\x55\x9b\xc6\xb1\x58\xb5\x6d\xe6\xc7\x4a\xc8\x57\xb5\x65\x4b\x8f"
+ "\x55\x1b\xbb\x4e\x64\x5b\x88\x9d\x58\x39\xc8\xab\xa0\x22\x0b\x3f"
+ "\x72\x07\x62\x65\x88\x75\x2c\x56\x86\x63\x56\xb1\x12\xd0\xff\x86"
+ "\x93\xd2\x63\x65\x48\x25\xb1\x32\xcc\x12\x8f\x95\xda\x41\x5e\xa9"
+ "\x35\x16\xba\xf9\x0e\xc4\xca\xa8\x75\x2c\x56\xc6\x1f\xf9\xb1\x12"
+ "\xd2\xa9\xc6\xab\xd2\x63\x65\x3c\x48\x62\x65\x4c\xb7\x13\x2b\x07"
+ "\x79\xa5\x2e\xb2\xd0\x77\x77\x20\x56\xa6\x13\x8e\xc5\x8a\xf6\xb0"
+ "\x8a\x95\x80\x9e\xa2\x7d\xa4\xc7\xca\x54\x45\x62\x65\x3a\x2a\x1e"
+ "\xab\x60\x07\x79\x15\xac\xb1\xd0\x21\x77\x20\x56\x74\xad\x43\xb1"
+ "\x52\xa0\x27\xf9\xb1\x12\x68\xf7\x15\x68\xbc\xe4\x58\x29\x90\x2b"
+ "\x89\x15\xad\x13\x8b\x95\x31\x27\xf0\xa8\x27\xc4\xa0\x65\x5b\xa0"
+ "\xd6\x33\x09\x51\xad\xc3\x21\x6e\xde\x10\xb7\x34\x15\x6a\xcb\x81"
+ "\xb8\xe9\x0d\x68\xca\xb2\x1f\xe8\xf2\x3a\x23\x6a\x85\x98\xb5\x78"
+ "\x07\x16\x55\xe8\x6b\xf1\x98\xa3\xa7\x2e\x29\xa8\x61\x33\x97\x29"
+ "\x11\x8e\x1b\x8e\x03\x8e\x1d\x0d\x71\x63\xe2\xe8\x1d\x51\x64\xf4"
+ "\x1e\x57\x19\x71\xfd\x07\x7a\xa9\x8e\xa6\xf1\xfb\xd2\xca\x9b\x21"
+ "\xf8\xbb\x40\x64\x2d\xea\xab\x7a\x01\xbf\x93\xcb\x39\x7c\xbc\x42"
+ "\x5f\x05\xfa\xa0\x1e\x31\xda\xec\x87\x00\x6f\xe3\x9f\x02\xdc\x8d"
+ "\x15\xd1\xcf\xd3\x03\xea\xa3\x0c\x03\x9f\x52\xad\xbf\x8e\x7a\x63"
+ "\xfd\x90\x65\x42\xbe\xeb\x16\x23\xea\xf0\xa2\x62\x8a\x99\xbb\xb6"
+ "\x9c\xc9\x23\x1f\xe2\xe2\x4b\xdf\xb2\x18\xd3\x7d\x2b\x1e\x55\x5c"
+ "\xd1\x32\xb8\x59\x6b\x04\x06\xb7\x7f\x05\x28\x41\x67\x86\xd0\xde"
+ "\x81\xa5\xda\x72\xa4\xa2\xdb\x20\xc6\x78\x3e\x91\x82\xda\xbc\xbb"
+ "\x55\x6a\x8c\x5d\x98\xf1\xdf\x26\x15\x3b\x7e\x0b\xe2\x84\xef\xcf"
+ "\x8c\xdf\x4a\xb4\x18\xbf\x05\xcf\xdc\x3e\x7e\x4b\xe1\xa2\xc6\xe3"
+ "\xb7\x4c\x3f\xf8\xfa\x99\xdf\x7d\x69\x02\x4d\xc3\xbb\x0f\x28\x6f"
+ "\xd0\x23\xfc\xfe\xe5\x0d\xc5\x68\xfd\x4a\xa4\x2c\x6f\xad\x45\x29"
+ "\x0d\xb4\xbe\x3c\xf5\x2a\x8a\x6c\xc4\x3a\x18\xf3\x85\x62\xfa\x42"
+ "\x01\xdf\x3a\xd3\x0f\x01\x7e\x3a\x05\xa5\x2c\xaf\x44\xc8\x62\x1e"
+ "\x4f\x3c\x68\x66\x37\xc0\x21\xbe\x22\xf5\x12\xa2\x07\x3e\x1d\x55"
+ "\x61\xf8\x1e\xe3\x14\x0f\xe7\xc7\xb6\xeb\xeb\x81\x4f\xbf\x80\x8f"
+ "\x61\xcc\xf0\xf7\x26\xbc\x3e\xc0\x6e\x0b\xfd\x8d\x79\xe1\x99\x94"
+ "\x8a\x2a\x92\x5a\x51\xb9\x01\x21\xb8\xdf\xf6\x6f\xa2\xab\x44\x78"
+ "\x14\x34\x9a\xf0\x28\x48\xe9\x99\xd4\xab\xbe\x63\x1e\x05\x69\x38"
+ "\x1e\xb9\x2e\x74\x8e\x47\xae\x83\x9c\xe7\x91\xe2\xb2\x7c\x1e\x05"
+ "\x85\xf3\x79\xe4\x7a\x4e\x3a\x8f\x14\x85\xd2\x79\xa4\x58\xe9\x1c"
+ "\x8f\x5c\xe7\x11\x1e\x29\x46\x13\x1e\xb9\x46\x73\x3c\x62\xe6\x46"
+ "\xdd\x21\x1e\x51\x3a\x3b\x3c\x62\xeb\xa3\x20\xa8\x8f\xee\xb9\xe4"
+ "\x00\x8f\x2c\xea\xa3\xde\x47\x9c\xe3\x51\xef\x79\xce\xf3\xa8\x77"
+ "\xb0\x13\x3c\xb2\xaa\x8f\xfa\x0c\x92\xce\xa3\x5e\xcd\xd2\x79\xd4"
+ "\xeb\x84\x73\x3c\xea\x7d\x80\xf0\xa8\x57\x32\xe1\x51\xef\x3d\x1c"
+ "\x8f\x98\xf9\x66\x77\x88\x47\xbd\x02\xc4\x79\xa4\x66\xeb\x23\x35"
+ "\xd4\x47\x5e\xdf\x76\xcc\x23\xb5\x45\x7d\xe4\xd6\xe2\x1c\x8f\xdc"
+ "\x0e\x38\xcf\x23\xb7\x55\xf2\x79\xa4\xb6\xaa\x8f\xfa\xce\x93\xce"
+ "\x23\xb7\x50\xe9\x3c\x72\x73\x75\x8e\x47\x6e\x37\x09\x8f\xfa\x94"
+ "\x10\x1e\xb9\xd5\x72\x3c\x62\xe6\xf0\xdd\x21\x1e\xf5\x49\xb4\xc3"
+ "\x23\xb6\x3e\x52\x43\x7d\xf4\xf8\x16\x07\x78\x64\x51\x1f\xdd\x33"
+ "\xde\x39\x1e\xf5\xbb\xe9\x3c\x8f\xfa\x9d\x74\x82\x47\x56\xf5\xd1"
+ "\x3d\x07\xa4\xf3\xa8\x5f\xba\x74\x1e\xf5\x9b\xec\x1c\x8f\xee\x79"
+ "\x92\xf0\xa8\x9f\x3b\xe1\xd1\x3d\x21\x1c\x8f\x98\x79\x91\x77\x88"
+ "\x47\x7d\x8b\xc4\x79\x14\xcc\xd6\x47\xc1\x50\x1f\xcd\x9c\xd0\x31"
+ "\x8f\x82\x2d\xea\x23\x8f\xcd\xce\xf1\xc8\xe3\x49\xe7\x79\xe4\xd1"
+ "\x4b\x3e\x8f\x82\xad\xea\x23\x8f\x9b\xd2\x79\xe4\x5e\x29\x9d\x47"
+ "\xee\x39\xce\xf1\xc8\x23\x8d\xf0\xc8\x7d\x1a\xe1\x91\x47\x12\xc7"
+ "\x23\x66\xae\xe9\x1d\xe2\x91\x3b\x12\xe3\x11\x5e\x8b\xe0\x5d\xb2"
+ "\x2e\x44\xc3\xd6\xb5\x48\xb3\x1b\xff\x6d\x45\x21\x4d\x59\xfd\x03"
+ "\x4e\x25\x93\xf5\x00\x74\x8a\xfe\x4c\x7f\xaf\xd0\xf5\xf7\x1c\x00"
+ "\x5c\xbc\x03\x0b\x23\x2f\x92\x35\x1a\xf0\xba\x20\xb7\xd6\xc7\xa3"
+ "\x51\x78\x5d\x06\x85\x67\x0c\x5e\xc7\xaa\x7d\xed\x00\x6f\x91\xb5"
+ "\x03\x66\x88\xaf\x1d\xd0\xba\xcd\x3c\xef\x76\x3f\x37\xef\x56\xe1"
+ "\x19\x6c\x77\xde\xad\xc2\xd3\x27\x7f\x86\x54\x3e\xf4\xd7\xe1\x77"
+ "\xbc\x35\x30\x50\xdb\x94\xe5\x39\x1c\xb0\x31\x90\x77\xf7\xdc\x83"
+ "\x1c\x9a\x8f\xbb\xdf\x82\x27\xfd\x2b\x5f\x9a\x85\x52\xe9\x2d\xe5"
+ "\xc3\x69\x9f\xc0\x42\x3a\x37\xb0\x58\xda\xb3\x40\xce\x76\xe3\x1d"
+ "\x14\x22\x1c\x6f\x65\x25\x89\x37\xbb\x6e\x81\xb7\xc8\xba\x05\x33"
+ "\xc4\xd7\x2d\x10\x8e\xb7\xd2\xfe\x3c\x67\x85\x72\x93\xf4\x78\x2b"
+ "\xa3\x48\xbc\x83\x94\x4d\x59\xca\x1c\x2e\xde\x5e\x4a\xe9\xf1\x56"
+ "\x86\x92\x78\x57\xf8\xd2\x3e\x41\x21\x74\x6e\x50\xa8\xc4\x67\xa9"
+ "\xee\x20\xde\x22\xfc\x1e\x10\xca\xc6\x9b\xe5\xb7\xc8\x9a\x09\x33"
+ "\xc4\xd7\x4c\x10\x8e\xf7\x00\x0f\xfb\xf1\xf6\x6a\x94\x1e\x6f\xaf"
+ "\x62\x36\xde\xc0\xef\x01\xae\x5c\xbc\x07\xa4\x4a\x8f\xb7\x57\x21"
+ "\x89\x77\xa5\x3b\xc4\x1b\xf8\x1d\x24\x91\xdf\x03\x26\xdb\x8f\xb7"
+ "\x5a\x84\xdf\xf7\x16\x92\x78\xb3\xeb\x35\x78\x8b\xac\xd7\x30\x43"
+ "\x7c\xbd\x06\xe1\x78\xdf\xbb\xce\x7e\xbc\xef\x8d\x93\x1e\xef\x7b"
+ "\x43\x48\xbc\xd5\xc0\xef\x7b\x57\x72\xf1\xbe\x57\x2f\x3d\xde\xf7"
+ "\xaa\x48\xbc\xcf\x21\xda\x47\x0d\xfc\x56\x4b\xe4\xf7\xbd\x27\x3a"
+ "\x88\xb7\x08\xbf\x7d\x54\x6c\xbc\x59\x7e\x8b\xac\x15\x31\x43\x7c"
+ "\xad\x08\xe1\x78\x7b\x5f\xb7\x1f\x6f\xef\xef\xa4\xc7\xdb\x7b\x0f"
+ "\x1b\x6f\xe0\xb7\x77\x0d\x17\x6f\x9f\x18\xe9\xf1\xf6\xd6\xb2\xf1"
+ "\x6e\x80\x78\x03\xbf\xd5\x12\xf9\xed\xa3\xb6\x1f\xef\x60\x11\x7e"
+ "\x0f\xd4\x92\x78\xb3\xeb\x54\x78\x8b\xac\x53\x31\x43\x7c\x9d\x0a"
+ "\xe1\x78\x0f\x9c\x6d\x3f\xde\x03\x27\x4a\x8f\xf7\x40\x25\x89\x77"
+ "\x30\xf0\x7b\xe0\x34\x2e\xde\x03\x2b\xa5\xc7\x7b\x20\x22\xf1\xfe"
+ "\xb6\x96\xf6\x09\x06\x7e\x07\x4b\xe4\xf7\xc0\x3c\xb1\x78\x7b\x42"
+ "\xbc\x4f\x83\x8e\x01\xdd\x51\x64\xca\x01\x9d\x62\xe4\xc7\xbd\x22"
+ "\x49\x83\x1e\xbe\x8d\x63\xef\x9b\x0c\x6d\x75\x51\x97\xad\x97\xa1"
+ "\xf0\x8d\x73\x7a\xee\xb0\xc2\xf7\x11\xd1\xb9\xc3\x0a\xdf\x41\x92"
+ "\xe7\x0e\x2b\x7e\x57\xc3\x69\x20\xdf\x00\x0e\x53\x5f\xa6\xfe\x90"
+ "\x34\xa7\x58\xf1\xbb\xf3\x82\xeb\x68\x28\x7e\xb7\x11\xcf\x29\xa6"
+ "\xb7\xfc\x6f\xb5\x29\x57\x8e\x36\xf2\x4d\xef\x18\xeb\x20\x8d\x29"
+ "\x07\x34\x92\x28\xd6\x7e\xf1\xd0\x6e\x69\xba\x6c\xdd\x0e\x85\xdf"
+ "\x54\xe7\xb1\xf6\x1b\x22\x8e\xb5\x5f\x2f\xe9\x58\x0f\xaa\xe4\xf4"
+ "\x97\x9f\x37\x87\xb5\x9f\xf4\xf9\xe3\x8a\x41\xc5\x82\xeb\x79\x28"
+ "\x06\x25\x12\xac\xbf\x0b\x35\xe5\xca\xd1\x65\x7e\x2b\x1d\xc0\x1a"
+ "\xca\x75\x90\x9d\x72\x3d\x78\x1a\x60\x5d\xd4\x65\xeb\x87\x28\x06"
+ "\x8f\x73\x1e\xeb\xc1\x7d\xc5\xb1\xbe\xef\xa6\x74\xac\xef\x3b\xc1"
+ "\x69\xbf\xc1\x88\xc3\x7a\x70\x8e\x74\xac\xef\x3b\x28\xb8\xae\x88"
+ "\xe2\xbe\x59\x04\xeb\x7f\x16\x00\xd6\x32\x34\xe1\xe0\x98\x8e\xb1"
+ "\x56\x43\xb9\x56\xdb\x29\xd7\x43\x43\xa1\xbd\xd6\x74\xd9\x3a\x26"
+ "\x8a\xa1\x23\x9d\xc7\x7a\x48\xa3\x38\xd6\x43\x2e\x4a\xc7\x7a\xc8"
+ "\x7e\x4e\x77\x0e\xa9\xe3\xb0\x1e\x9a\x2a\x1d\xeb\x21\xdb\x05\xd7"
+ "\x37\x51\x0c\x09\x27\x58\x57\xb9\x99\x72\xe5\xe8\xd1\xa1\xa2\xfa"
+ "\xdf\x02\x6b\x28\xd7\x6a\x3b\xe5\x5a\xa5\x06\xac\x8b\xba\x6c\x3d"
+ "\x15\x85\xca\xc7\x79\xac\xef\xff\x51\x1c\xeb\xfb\xcf\x48\xc7\xfa"
+ "\xfe\x1c\x4e\xf3\xde\x5f\xc5\x61\xad\x4a\x90\x8e\xf5\xfd\x1b\x05"
+ "\xd7\x59\x51\xdc\x3f\x9a\x60\x7d\x21\x01\xb0\x96\xa1\x85\x55\x9a"
+ "\x8e\xb1\x0e\x86\x72\x1d\x6c\xa7\x5c\x3f\x00\xbe\x3e\x58\xd3\x65"
+ "\xeb\xba\x28\x1e\x70\x71\x1e\xeb\x61\x67\xc5\xb1\x1e\x76\x4c\x3a"
+ "\xd6\xc3\x52\x39\xbd\x3d\xac\x84\xc3\xfa\x81\x68\xe9\x58\x0f\x4b"
+ "\x14\x5c\xef\x45\x31\x4c\x45\xb0\xfe\xbe\xd2\x94\x2b\x47\x87\x3f"
+ "\x20\xba\xff\x81\x3d\x1d\xbe\x22\x1f\xb9\xf1\xf1\x1e\xee\xd6\xb5"
+ "\x5a\xfc\xc1\x9b\xce\xe3\xfd\xe0\x49\x71\xbc\x1f\xdc\x27\x1d\xef"
+ "\x07\x13\x39\x2d\xfe\xe0\x51\x0e\xef\xe1\xe1\xd2\xf1\x7e\x30\x46"
+ "\x58\x8b\x3f\xa8\x74\x4e\x8b\x0f\xf7\x96\xa3\xc5\x6d\xf1\xf6\x6f"
+ "\xee\x5a\x3d\xee\xff\xa3\xf3\x78\xfb\x1f\x12\xc7\xdb\x3f\x57\x3a"
+ "\xde\xfe\x31\x9c\x1e\xf7\x2f\xe0\xf0\x7e\x48\x23\x1d\x6f\xff\x28"
+ "\x61\x3d\xee\x8f\x9c\xd3\xe3\x0f\xb9\xca\xd1\xe3\xb6\x78\x8f\xa8"
+ "\xed\x5a\x4d\x3e\xe2\x9c\xf3\x78\x8f\xc8\x17\xc7\x7b\xc4\x26\xe9"
+ "\x78\x8f\x88\xe2\x34\xf9\x08\x8b\xfe\xef\x80\x00\xe9\x78\x8f\x08"
+ "\x15\xd6\xe4\x0f\xe9\x9d\xd3\xe4\x23\x1a\xe4\x68\x72\x5b\xbc\x47"
+ "\x56\x75\xad\x2e\x1f\x79\xca\x79\xbc\x47\x66\x8a\xe3\x3d\x72\x95"
+ "\x74\xbc\x47\x86\x72\xba\x7c\xe4\x46\x0e\xef\x40\xe9\xeb\x67\x2a"
+ "\x46\x86\x08\xeb\xf2\x00\x9d\x73\xba\x7c\x64\x8d\x1c\x5d\x6e\x8b"
+ "\x77\x50\x69\xd7\x6a\xf3\xa0\x23\xce\xe3\x1d\xb4\x4e\x1c\xef\xa0"
+ "\x38\xe9\x78\x07\x85\x70\xda\x3c\xc8\xa2\xff\x5f\xed\x26\x1d\xef"
+ "\x20\x95\xb0\x36\x0f\xac\x74\x4e\x9b\x07\x9d\x97\xa3\xcd\x6d\xf1"
+ "\x0e\x2e\xea\x5a\x7d\x1e\xbc\xd7\x79\xbc\x83\x17\x8b\xe3\x1d\xfc"
+ "\x92\x74\xbc\x83\x55\x9c\x3e\x0f\x8e\xe5\xf0\x0e\x6e\x96\x8e\x77"
+ "\xb0\x52\x58\x9f\xab\x8b\x9d\xd3\xe7\xc1\x25\xce\xf7\x93\x87\xe4"
+ "\x60\x6d\x2e\x75\xfd\xc7\x8a\x95\xec\x9c\x3b\xc5\xc3\xdc\xfa\x8f"
+ "\x8a\x90\x4d\x48\x6c\x6d\x19\xc5\xa8\x1f\xbb\xf5\xfa\x8f\x8a\x51"
+ "\xf6\xd7\x7f\x54\x8c\x92\xb6\xfe\xa3\x62\xd4\x19\xe9\xe3\xf1\x47"
+ "\xe5\x70\x1e\x61\x94\x85\xff\x0f\x21\x7b\x14\x77\xe7\x75\x21\x15"
+ "\xa3\xf8\xeb\x42\x2a\x1e\x66\xd6\x85\xa4\xb7\x54\x8f\x96\xe7\x45"
+ "\x42\xf6\x38\xff\x5d\xe0\xb1\x44\xec\x43\xa4\xae\x43\xc9\x71\xfb"
+ "\x91\xc5\x1c\xb7\x1f\x9b\x27\xce\xed\x47\x4f\x76\xeb\x75\x28\x15"
+ "\x8f\x8e\xb7\xcf\xed\x47\x55\x92\xd6\x1c\x51\x3c\x2a\x7d\xdd\x1b"
+ "\xc5\xa3\x89\x9c\x1f\x7a\xd4\xc2\xff\x3e\x56\xd8\x75\xdc\x96\xb9"
+ "\x3e\xa5\xe2\xd1\x69\x7c\x6e\x3f\x12\x4b\xb8\xfd\x9f\x74\x79\xbe"
+ "\xeb\xb1\x64\xe7\xbf\x83\x3c\x3e\x19\x7b\x2e\xa9\xeb\x61\x72\xdc"
+ "\x1e\x3d\x89\xe3\xf6\xe3\xe3\xc4\xb9\x3d\x66\x47\xb7\x5e\x0f\x53"
+ "\x31\x66\x88\x7d\x6e\x8f\x36\x48\x5a\xcb\x44\x31\x26\x4d\x3a\xb7"
+ "\xc7\x4c\xe6\xbc\xdf\x18\x2d\xc7\xed\xc7\x33\xba\x90\xdb\x32\xeb"
+ "\xed\x31\x21\x7c\x6e\x8f\x0e\x25\xdc\xd6\x55\xcb\xf3\x98\x8f\x47"
+ "\x3b\xff\xdd\xe7\xc9\x00\xec\x2f\xa5\xae\xcb\xc9\x71\xfb\x09\x7f"
+ "\x8e\xdb\x4f\xda\xac\x0b\xc5\x71\x5b\xb3\xaa\x5b\xaf\xcb\xa9\x78"
+ "\xa2\xc5\x3e\xb7\x9f\xa8\x92\xb4\x46\x8a\x42\x33\x5b\x3a\xb7\x35"
+ "\x01\x9c\xcf\xd5\x24\x70\xdc\x7e\x32\xbe\xeb\xb8\x2d\x73\xbd\x4e"
+ "\x85\xc6\x9d\xcf\xed\x27\x06\x13\x6e\xff\x37\x44\x9e\x9f\x7e\x72"
+ "\xb4\xf3\xdf\xb9\xc6\xba\x62\x2f\x2d\x75\x7d\x50\x8e\xdb\xbf\x77"
+ "\xe1\xb8\xfd\x54\xa3\x38\xb7\x9f\x9a\xda\xad\xd7\x07\x55\xfc\xde"
+ "\xfe\xfa\x3f\x8a\xdf\xdb\x5b\xff\xc7\x76\xae\xb0\xe2\x29\xe9\xeb"
+ "\x5e\x28\x9e\x72\xe5\x3c\xfd\x53\xe1\x1c\xb7\xc7\x86\x75\x21\xb7"
+ "\x65\xd6\xdb\xbf\xaf\xe5\x73\xfb\xc9\x66\xc2\xed\xcb\x1b\xe5\xf5"
+ "\x1d\x8c\x55\x3a\xff\x5d\xef\x69\x1d\xee\x37\x90\xba\x4e\x29\xc7"
+ "\xed\xb1\x17\x39\x6e\x3f\x7d\x4e\x9c\xdb\x4f\x07\x77\xeb\x75\x4a"
+ "\x15\xe3\x8e\xd8\xe7\xf6\x38\xad\xa4\x35\x5d\x14\x4f\x4b\x9f\x07"
+ "\xaf\x18\xa7\xe3\xfa\x2f\x9e\xb6\x18\xff\xfe\x8c\xaa\xeb\xb8\x2d"
+ "\x73\xfd\x52\xc5\xb8\x12\x3e\xb7\xc7\x9e\x27\xdc\xfe\xa9\x4a\x5e"
+ "\x3f\xc9\xd3\x75\xce\xf7\x93\x8c\xaf\x63\xbe\x61\x4a\x5c\x2f\x95"
+ "\xe3\xf6\x33\xc7\xdb\xd7\x26\x52\x8c\xbf\x68\xcd\xed\xf6\xb5\x89"
+ "\x14\xa1\x8d\xdd\x66\xbd\x54\x45\xe8\x1a\xfb\x3c\x0e\x8d\x96\xd6"
+ "\x27\x12\x7a\x51\x3a\x8f\x43\xf7\x73\x7d\x22\xa1\x16\xe3\x5f\x26"
+ "\x98\xf7\x24\xbf\xf3\x6b\x16\x29\xc6\xa7\xd9\x5d\xb3\x48\x31\x3e"
+ "\xe6\x8e\xad\xa3\xaa\x08\xcd\xe0\xad\x59\xa4\x78\xa6\xd0\xc4\x94"
+ "\x85\x6b\x6a\x79\xfd\x2a\xe3\x9b\x9d\xef\x57\x09\x23\xdf\x77\x25"
+ "\xae\xdb\xca\x95\x85\x09\xa7\xb9\xb2\x10\x76\x55\xbc\x2c\x84\xb9"
+ "\x74\x9b\x75\x5b\x15\xcf\x6e\xb2\x5f\x16\x9e\x8d\x95\xd6\x87\xf2"
+ "\xac\xf4\x75\x60\x14\xcf\x1e\xe5\xfa\x50\x9e\x6d\xe6\xca\xc2\x44"
+ "\x4d\xd7\x95\x85\xb0\x4c\xfb\x65\x21\x2c\xe1\x8e\xad\xe7\xaa\x78"
+ "\x76\x3b\xbf\x2c\x4c\x38\x41\xca\x42\x5d\xa1\xbc\x7e\x98\x89\xb2"
+ "\xbe\x7f\xf3\xcb\x42\xb8\x2b\xf3\xed\x5b\xe2\xfa\xb1\x5c\x59\x98"
+ "\x78\x8e\x2b\x0b\xcf\xdb\xe8\x79\xae\x2c\x3c\xef\xd1\x6d\xd6\x8f"
+ "\x55\x3c\x97\x6d\xbf\x2c\x3c\x97\x28\xad\xcf\xe5\xb9\x46\xe9\x65"
+ "\xe1\x39\x8b\xf9\x4f\xcf\x5b\xcc\x7f\x0a\x0f\xeb\xba\xb2\xf0\xfc"
+ "\x0e\xfb\x65\xe1\xf9\xa4\x3b\xb6\xae\xac\xe2\xb9\x02\x7e\x59\x98"
+ "\x58\x4a\xca\xc2\x2f\xa3\xe5\xf5\xdb\x84\x3b\xa0\xff\x3b\xea\xb7"
+ "\xf9\xa3\x92\x19\x17\x20\x71\x1d\x5b\xae\x2c\x84\x5f\xe4\xca\xc2"
+ "\x1f\x5d\xc4\xcb\xc2\x1f\x06\x75\x9b\x75\x6c\x15\x93\xf2\xed\x97"
+ "\x85\x49\xc9\xd2\xfa\x68\xfe\xe0\x22\xbd\x2c\x4c\x2a\xe3\xfa\x68"
+ "\xfe\xa0\xe4\xca\xc2\x1f\xa3\xba\xae\x2c\xfc\x61\x9f\xfd\xb2\xf0"
+ "\x87\x8d\x77\x6c\x7d\x5b\xc5\xa4\x42\x7e\x59\x08\x3f\x4f\xca\xc2"
+ "\xcd\x22\x79\xfd\x3c\x7f\x1c\xec\x7c\x3f\xcf\x94\xc1\xcc\x98\x09"
+ "\x89\xeb\xe9\x72\x65\xe1\x8f\x57\xb9\xb2\x30\xc5\x43\xbc\x2c\x44"
+ "\xf8\x77\x9b\xf5\x74\x15\x93\x0f\xd8\x2f\x0b\x93\xd3\xa5\xf5\xe9"
+ "\x44\x78\x48\x2f\x0b\x93\xab\xb8\x3e\x9d\x88\xc1\x5c\x59\x98\x32"
+ "\xab\xeb\xca\x42\xc4\x11\xfb\x65\x21\x42\x7b\xc7\xd6\xd9\x55\x4c"
+ "\x3e\xc1\x2f\x0b\x7f\xd4\x91\xb2\xd0\x30\x56\x5e\xbf\xd0\x94\x00"
+ "\xe7\xfb\x85\xa6\x06\x30\xe3\x49\x24\xae\xeb\xcb\x95\x85\x29\x8d"
+ "\x5c\x59\x98\x2a\xbe\xcf\x83\x22\xea\x91\x6e\xb3\xae\xaf\x22\xd2"
+ "\xfe\xfe\x47\x8a\x48\x3b\xfb\x1f\x09\xf5\x01\x45\x0d\x92\x5e\x16"
+ "\x22\x6b\xb8\x3e\xa0\x28\x8b\xf9\x7f\x53\xe3\xbb\xae\x2c\x44\xd9"
+ "\xdf\xff\x41\x11\xe5\xc0\xfe\x0f\x32\xd7\xfb\x55\x44\x96\xf2\xcb"
+ "\xc2\x94\x3a\x52\x16\x6e\x17\xcb\xeb\x47\x9a\xda\x61\xff\x3f\xf6"
+ "\xf9\x6d\xde\xb6\xfd\x48\x65\x35\x1a\x14\x34\x03\x97\x85\x17\xaa"
+ "\x0d\xb9\x81\x45\x78\x7d\x61\xe3\x70\x76\x0d\xca\x34\x76\x8d\x97"
+ "\x06\x03\x59\x83\x52\x6f\x6c\x5f\x83\x92\xac\xfd\x81\x28\x3c\x17"
+ "\x18\xcf\x09\x36\x28\xc9\xfa\x93\x34\x1e\x13\x85\xc7\x48\x5d\x2a"
+ "\x65\xd6\x57\x49\x36\xc0\xbb\x5f\xe9\x60\xfd\xc9\x18\x1d\x2a\x8b"
+ "\x59\x8b\x0c\x5e\x7b\x55\x64\x9e\xf0\x0b\x09\xcc\xfa\x93\x73\x7d"
+ "\xfd\xb2\xfe\x83\xbc\x3d\xf1\xfa\x93\x31\xb4\x69\xbd\x8e\xd6\x97"
+ "\x37\x23\x48\x0b\xf1\x9d\x67\x5e\x83\xf2\x85\xef\xf0\xbb\x1b\xe6"
+ "\x06\xf8\xed\xfa\x8f\xc8\xfa\xc2\x8a\x17\xa4\xaf\x03\xab\x78\x21"
+ "\x9d\xeb\xdf\x79\xa1\x8c\xe3\xe8\x8b\x4c\x1b\x0c\xe7\x63\xcb\xa2"
+ "\xa1\x8e\xd9\xd2\x12\xd6\x26\x6b\xed\x8d\x17\x6a\x3b\xc6\x8c\x19"
+ "\x23\x62\x53\x7f\x71\x98\x4d\xd3\x1a\x72\x83\x34\x78\x9d\x63\xc7"
+ "\x31\xeb\x55\x7f\x67\x30\x9b\xa6\x72\x1c\xb3\x69\x9b\xf9\x98\x09"
+ "\xf5\x43\x4c\x5b\x26\x1d\xb3\x69\x63\xb9\x7e\x88\x69\xa9\x1c\x66"
+ "\xd3\x2a\x09\x66\xd3\x7c\x09\x66\xad\x89\x6d\xb2\xd6\xef\x98\xd6"
+ "\xe1\xfc\x6f\xec\x9b\xda\xbc\x6d\x7d\x39\x87\xd9\xcb\x61\x80\x59"
+ "\x11\x5e\x6f\xd9\x71\xcc\xee\xb9\x74\x67\x30\x7b\xe9\xbc\xe3\x98"
+ "\xbd\x3c\xce\x0a\x33\x01\xbf\xfc\xb2\xf4\x3d\x3b\x15\x2f\xe9\x39"
+ "\xbf\xfc\xf2\x68\x0e\xb3\x97\x37\x12\xcc\x5e\x2a\x23\x98\xb5\xe5"
+ "\xb5\xc9\x5a\x03\xe4\xe5\xa8\x8e\x31\x63\xbe\xe9\xdb\x29\x67\x7f"
+ "\x6a\x36\xe4\x82\xc7\x04\xff\xe8\x38\x66\x5e\xdf\xde\x19\xcc\xfe"
+ "\x94\xee\x38\x66\x7f\xba\xc9\xc7\x4c\xc8\xd7\xfd\xe9\x82\x74\xcc"
+ "\xfe\x54\xc0\xf9\xba\x3f\xd5\x72\x98\x45\x6b\x08\x66\x7f\x4a\x25"
+ "\x98\x19\x4a\xdb\x64\xad\x23\x12\xdd\x61\xff\x17\xd6\xa1\x6d\xde"
+ "\xb6\x3e\x87\xc3\x6c\xfa\x41\xc0\xac\x08\xaf\x3f\xed\x38\x66\x8f"
+ "\x6f\xb9\x33\x98\x4d\x1f\xeb\x38\x66\xd3\xf7\x59\x61\x26\xe0\x3f"
+ "\xa6\x67\x4a\xc7\x6c\x7a\x34\xe7\x3f\xa6\xe7\x71\x98\x4d\xaf\x23"
+ "\x98\x4d\x1f\x4d\x30\x33\x36\xb4\xc9\x5a\x8b\x64\x7a\x51\xc7\x98"
+ "\x31\xdf\x60\xed\x94\xb3\x99\x31\x86\x5c\xd0\xec\xa0\xc7\x1d\xc7"
+ "\x6c\xe6\x84\x3b\x83\xd9\x0c\xbd\xe3\x98\xcd\x9c\xce\xc7\x4c\x48"
+ "\x27\xcf\x94\xb1\x0e\xf6\x4c\x77\x4e\x27\xcf\x8c\xe2\x30\x9b\xb9"
+ "\x87\x60\x36\xa3\x96\x60\x46\xab\xda\x64\xad\x67\x32\x53\x74\xfd"
+ "\x2f\x7b\xba\xd1\x3c\x2e\x9f\xc3\x6d\xb6\x6f\xf7\xd1\x8e\xb3\xf6"
+ "\x3b\x8e\xdb\x6c\xaf\x8e\xb5\xe3\xac\x16\xe9\xb8\xcd\x2a\xe1\xb4"
+ "\xe3\x6c\x37\x0e\xb7\xd9\xd1\x04\xb7\x59\x7b\x9c\xd3\x8e\xb3\x3b"
+ "\x9c\xff\x2a\xa4\x1d\x6d\x71\x9b\x53\xd9\x7d\xf4\xe3\x9c\x18\xc7"
+ "\x71\x9b\x73\xa6\x63\xfd\x38\xe7\x88\x74\xdc\xe6\x24\x73\xfa\x71"
+ "\x4e\x31\x87\xdb\x5c\x25\xc1\x6d\x4e\xb4\x73\xfa\x71\x8e\xe8\xfa"
+ "\x6f\xf6\xf4\xa3\x2d\x6e\x31\xe9\xdd\x47\x43\xc6\xf8\x3a\x8e\x5b"
+ "\x4c\x5a\xc7\x1a\x32\x66\xa1\x74\xdc\x62\x46\x73\x1a\x32\x26\x89"
+ "\xc3\x2d\xa6\x94\xe0\x16\xa3\x74\x4e\x43\xc6\xe4\xc8\xd1\x90\xb6"
+ "\xb8\xcd\x0f\xed\x3e\x3a\x72\x5e\xa5\xe3\xb8\xcd\x7f\xb2\x63\x1d"
+ "\x39\x5f\xfa\x9e\xc5\x8a\x79\x75\x9c\x8e\x9c\x1f\xc2\xe1\x36\x3f"
+ "\x95\xe0\x36\xaf\xd4\x39\x1d\x39\xbf\xc3\xf5\x3f\x84\x74\xa4\x2d"
+ "\x6e\xaf\x34\x77\x1f\x2d\xf9\x8a\x04\xfd\xff\x8a\xb5\xfe\x17\xd0"
+ "\x92\xaf\xc8\xd0\xff\xaf\x98\xf5\x3f\x94\xb7\x57\x2c\xf4\x7f\x2c"
+ "\xab\xff\x5f\x49\x75\x4e\x4b\xc6\x3a\xa0\xff\x6d\xb5\xa4\x2d\x6e"
+ "\x71\x85\xdd\x47\x4f\xc6\x85\x3a\x8e\x5b\xdc\x81\x8e\xf5\x64\x9c"
+ "\xf4\x7d\xa0\x14\x71\xb3\x38\x3d\x19\xb7\x87\xc3\x2d\x4e\x4f\x70"
+ "\x8b\xd3\x38\xa7\x27\xe3\x44\xd7\x7f\x34\xe3\x66\xf4\x0e\x2c\xa2"
+ "\x05\xfa\x21\xcf\xc6\x6b\xd8\xb5\x09\xe3\x53\x8d\x3e\x81\x45\x52"
+ "\xf7\x77\x31\xaf\x39\x7d\x26\x1e\xa1\x4b\x8a\xf8\x41\xce\xad\x3b"
+ "\xfd\xea\x19\xe7\xd7\x9d\x7e\x35\xb7\xf3\xf6\x77\x79\x75\x9d\xf4"
+ "\x75\xa7\x5f\x0d\xe7\x34\xe8\xab\x19\x1c\xd6\xf1\xcc\xf8\x04\x69"
+ "\xeb\x51\xbf\xea\xee\xdc\x7a\xd4\xf1\x5e\x84\x5f\x0b\xca\xc8\x7a"
+ "\xd4\xf1\x6e\x5d\xb3\xef\xcb\x82\x24\xbc\x1e\x35\x9d\x85\x26\xcb"
+ "\x5b\x1f\x39\x3e\xa3\x63\x3e\x07\x69\x68\x81\x3e\x5a\x8e\xcf\xaf"
+ "\x45\x19\x7d\x82\x34\x52\xf7\x99\xe1\xf3\x79\xd1\x55\xe7\xf8\xbc"
+ "\x68\x87\xf3\x7c\x5e\x14\xd7\x79\xfb\xcc\x2c\x8a\x90\xce\xe7\x45"
+ "\xbe\x9c\x36\x5f\x34\x8b\xe3\xf3\x6b\x5a\xe9\x7c\x5e\x58\xed\x1c"
+ "\x9f\x17\xfd\x48\xf8\xbc\x30\x8f\xf0\x79\x51\x55\xd7\xec\x3f\xb3"
+ "\x30\x9c\xf0\x99\xca\x91\xb7\xfe\xf4\x6b\xb3\x1c\xe0\x73\x11\x2d"
+ "\xd0\x7f\xcd\xf1\x79\x89\x0a\xf8\x5c\x24\x75\xbf\x1b\x3e\x9f\x17"
+ "\x1f\x77\x8e\xcf\x8b\x17\x3a\xcf\xe7\xc5\x63\x3a\x6f\xbf\x9b\xc5"
+ "\x43\xa4\xf3\x39\xa1\x96\xf3\x2c\x8b\xd5\x1c\x9f\x97\xc4\x48\xe7"
+ "\x73\xc2\x41\xe7\xf8\xbc\xf8\x08\xe1\x73\x42\x02\xe1\xf3\xe2\xfd"
+ "\x5d\xb3\x0f\x4e\x82\x2f\xe1\xb3\x6b\xb5\xbc\xf5\xbd\x97\x88\xae"
+ "\x7f\xcc\xf1\x59\xad\xa1\x05\xfa\xf6\x39\x3e\x27\xea\x8d\x3e\x6a"
+ "\x8d\xd4\x7d\x77\xf8\x7c\x4e\x74\x72\x9f\x8b\xc4\x4e\xd8\xe7\x22"
+ "\xd1\x89\x7d\x2e\xac\xf7\xdd\x59\x7a\x5d\x3a\x9f\x97\x16\x71\x5e"
+ "\x6e\xa9\x81\xe3\xf3\xb2\x10\xe9\x7c\x5e\x9a\xec\x1c\x9f\x13\xd9"
+ "\xfd\x2f\x96\x8e\x25\x7c\x4e\x4c\xea\x9a\xfd\x78\x96\xd4\x12\x3e"
+ "\xf7\x19\x2e\x6f\xfd\xf4\x44\x83\x03\x7c\x2e\xa2\x05\xbe\x7b\x70"
+ "\x7c\x5e\x51\x0c\x7c\x2e\x92\xba\xff\x0f\x9f\xcf\x2b\xa6\x3b\xc7"
+ "\xe7\x15\x7d\x9d\xe7\xf3\xf2\xef\x3a\x6f\xff\x9f\xe5\x27\xa5\xf3"
+ "\x79\x79\x3a\xe7\x71\x97\x5b\x7c\xff\xc7\x4b\x05\x4b\xe5\xf3\x72"
+ "\x27\xf7\x05\x5a\x31\x95\xf0\x79\x39\xbb\x2f\xd0\x8a\xf0\xae\xd9"
+ "\x17\x68\x59\x11\xe1\x73\xdf\x04\x79\xeb\xd3\xaf\x28\xeb\x98\xcf"
+ "\xc1\x1a\x5a\xe0\x9b\x10\xc7\xe7\xd5\x5a\xa3\x4f\xb0\x46\xea\x3e"
+ "\x44\x7c\x3e\xaf\x1e\xe9\x1c\x9f\x57\x5d\x70\x9e\xcf\xab\xf6\x75"
+ "\xde\x3e\x44\xab\x32\xa5\xf3\x79\x55\x34\xe7\xfd\x57\x59\x7c\xff"
+ "\x5b\x2d\x63\x7f\xa2\x55\x83\x9d\xe3\xf3\xea\x61\x84\xcf\x2b\xab"
+ "\x09\x9f\x57\xfb\x76\xcd\xfe\x44\x2b\xd3\x09\x9f\xef\x39\x2a\x6f"
+ "\xfd\xff\xd5\x1d\x8e\xff\x10\xea\xdf\x30\xf7\x4b\x71\x9c\x5e\x13"
+ "\xeb\x7c\x1f\x47\x92\xd1\x39\x4e\x27\x1d\x72\x9e\xd3\x49\x6b\x3a"
+ "\xaf\x8f\x23\x49\xc6\x5e\x7f\x49\x6a\xae\x8f\x23\x29\x91\xe3\xf4"
+ "\x9a\x02\xe9\x9c\x7e\x5d\xef\x1c\xa7\x93\x1a\x09\xa7\x5f\x2f\x24"
+ "\x9c\x4e\xaa\xeb\x9a\x3e\x8e\xd7\x67\x39\xd7\xc7\xb1\x26\x51\x4e"
+ "\x1f\x87\x2d\xa7\x93\x35\xce\xf7\x73\xbc\x71\xce\x39\x4e\xbf\x91"
+ "\xe6\x3c\xa7\xdf\x88\xe8\xbc\x7e\x8e\x37\xc6\x48\xe7\xf4\x1b\x88"
+ "\xeb\xe7\x78\x23\x8c\xe3\x74\x72\x92\x74\x4e\xaf\x2d\x71\x8e\xd3"
+ "\x6f\x9c\x21\x9c\x5e\xbb\x91\x70\xfa\x8d\xe2\xae\xe9\xe7\x58\x1b"
+ "\xe2\x5c\x3f\x47\x72\x98\x9c\x7e\x0e\x5b\x4e\xaf\x77\x77\xbe\xaf"
+ "\x23\x65\x9f\x73\x9c\x4e\x79\xc9\x79\x4e\xa7\x0c\xeb\xbc\xbe\x8e"
+ "\x94\xbe\xd2\x39\xbd\xee\x3c\xd7\xd7\x91\xe2\xcb\x71\x7a\xfd\x64"
+ "\xe9\x9c\x5e\xb7\xdd\x39\x4e\xa7\xe4\x13\x4e\xaf\x8b\x26\x9c\x4e"
+ "\xc9\xe9\x9a\xbe\x8e\x75\xae\xce\xf5\x75\xac\xf7\x95\xd3\xd7\x61"
+ "\xcb\xe9\x34\x9d\xf3\xfd\x1d\x69\x6b\x9c\xe3\x74\xda\x48\xe7\x39"
+ "\x9d\xda\xd8\x79\xfd\x1d\xa9\x17\xa5\x73\x3a\xd5\x62\xff\x8b\x54"
+ "\x8b\xf9\xff\x1b\x54\xd2\x39\x9d\x9a\xe0\x1c\xa7\xd3\x96\x11\x4e"
+ "\xa7\xaa\x09\xa7\xd3\xe2\xbb\xa6\xbf\x63\x7d\x95\x73\xfd\x1d\x69"
+ "\x1d\xae\x7f\x21\xd4\xdf\x61\xcb\xe9\x8d\x47\x9d\xef\xf3\xd8\x18"
+ "\xe1\x1c\xa7\xdf\x34\x3a\xcf\xe9\x37\xcf\x74\x5e\x9f\xc7\x9b\x47"
+ "\xa4\x73\xfa\xcd\x64\xae\xcf\xe3\x4d\x8b\xf1\x4f\x1b\x1b\xa4\x73"
+ "\xfa\xcd\x50\xe7\x38\xbd\x71\x22\xe1\xf4\x9b\x88\x70\x7a\xe3\xd8"
+ "\xae\xe9\xf3\xd8\x70\xd0\xb9\x3e\x8f\x8d\xc5\x72\xfa\x3c\x6c\x39"
+ "\xfd\xe7\x74\xe7\xfb\x3d\xfe\x3c\xcc\x39\x4e\xbf\x75\xce\x79\x4e"
+ "\xbf\x95\xdf\x79\xfd\x1e\x6f\x6d\x92\xce\xe9\xb7\xa2\xb8\x7e\x8f"
+ "\xb7\x2c\xd6\xbf\xff\x73\xa9\x74\x4e\xbf\xe5\xed\x1c\xa7\xff\x3c"
+ "\x88\x70\x7a\xd3\x79\xc2\xe9\x3f\x2b\xbb\xa6\xdf\x63\x53\xaa\x73"
+ "\xfd\x1e\x7f\xb6\x19\xff\xb6\x22\x6e\x49\xac\x6a\xe9\x82\x05\x2b"
+ "\xe2\x56\xaa\x56\x24\x2c\x7c\x25\x6e\x9c\xbf\xf9\xff\xe3\x42\x92"
+ "\xfc\x93\xfa\xa1\xd8\xc5\xf3\xe6\xae\x7e\x94\x3b\x99\x10\xb7\x04"
+ "\xfe\xf4\x43\xf1\xf3\x56\xc4\xab\x56\xae\x49\x8c\x53\xe1\xff\x2d"
+ "\x7e\x25\x11\x92\x2c\x5d\xc9\x1d\x79\x21\x2e\x61\x5e\xd2\xc2\x25"
+ "\xaf\xaa\xe6\x25\x2c\x7c\x75\xc9\xe2\xb8\x25\x2b\x55\xcb\xe3\x96"
+ "\xad\x5a\xb8\x3c\x0e\xff\x7b\x85\x6a\xc1\xd2\xe5\x70\xe0\x95\xb8"
+ "\x85\xab\xe3\x54\xf3\x57\x2d\x58\x10\xb7\x7c\x45\x3f\x14\xb1\x2a"
+ "\x61\xe5\xc2\xc4\x84\x38\x55\x58\xc4\xf8\xe0\x69\x13\x5f\x9c\xf6"
+ "\xcc\x33\xfd\x90\xc5\xde\xd3\x2a\x3a\x27\xa2\x10\x38\xe4\x7a\x45"
+ "\xf1\xee\xa1\x72\x50\x52\x99\xc0\xcd\xad\xcb\x91\x72\xcb\x72\xe4"
+ "\xba\xb9\x1e\xb9\x65\xd6\x23\x77\xd3\x3b\x37\x35\xaa\x45\x28\x94"
+ "\xf6\x9a\xaf\xdc\x5a\x8f\xbc\x4d\xd9\xbb\xb4\x74\xf6\xce\x28\xbd"
+ "\xd7\x9b\xa1\x38\x2d\xed\xb5\x21\x11\x1f\x07\x2c\x5c\xe9\xec\xbd"
+ "\x50\xbe\xde\x4d\xd0\x7b\x6d\x54\xad\xbf\x8a\x28\xba\x7f\x7a\xc3"
+ "\x61\x93\x9e\x3a\xc5\x74\x0f\x23\x17\xa4\xd8\xe2\x8e\x14\x9b\x9b"
+ "\xe1\xef\x7e\xf8\x15\x21\xc5\xdb\xae\xf0\x53\xc3\x6f\x34\xfc\xf6"
+ "\xc0\xaf\x06\x29\x32\xbc\xe1\xa7\x82\x1f\x1c\xcb\x08\x87\x5f\x14"
+ "\xfc\xe0\x78\x26\xa4\xcd\x84\x73\x99\x6a\x92\x4f\x26\x9c\xcf\x3c"
+ "\x0a\xbf\x6a\xf8\x35\x20\x45\x16\xe4\x99\x55\x8a\x14\x5b\xa7\xc1"
+ "\x5f\x1d\xfc\xea\xe0\x07\xc7\xb7\x2a\xe1\x87\xd3\x6a\xc8\x39\x2d"
+ "\x82\xdf\x58\xf8\xcd\x82\x5f\x12\xfc\x0e\xc2\xaf\x18\x7e\x65\xf0"
+ "\x3b\x0f\x3f\x78\xbe\x6c\x48\x93\x0d\xf7\xca\x86\x73\xd9\x70\x8f"
+ "\xec\x2a\xa4\x78\x27\x04\x7e\x39\xf0\xab\x45\xf0\x8e\xec\x2f\xc4"
+ "\xe2\xdf\xf8\x17\x6b\xf5\x7f\xeb\xdf\x46\xcf\xb4\xfb\x75\xc5\x81"
+ "\x06\x28\xb7\x5b\x16\xd2\x1b\x90\x82\xce\xde\xa8\x4a\x0c\x44\x2e"
+ "\xd7\x14\x5b\xc6\x54\x6c\x44\x50\xdf\xec\x8c\x2a\x5e\xdb\x8a\xcf"
+ "\x8f\xc1\x31\x6b\xca\xda\x32\x5a\x87\x12\x7d\x71\xf9\x94\xc6\xcf"
+ "\x2d\xa3\xd9\xeb\x57\xea\x5c\x3c\x8b\xf1\xf5\xf4\x3b\x23\x94\xf4"
+ "\xfa\xe8\xf7\xf0\x3c\x5c\xc8\xdf\x1d\xcf\xd3\xa5\xb5\x0f\xa5\xd3"
+ "\xca\x61\x83\x71\x1d\x53\xbc\x96\x79\x2e\x0f\x52\x1e\xe1\x3c\x3c"
+ "\x9b\xde\xeb\xa6\x06\xca\x9f\x2b\xfe\x3f\x0d\x98\xd3\x7b\xa2\xb7"
+ "\x93\x7a\x67\x0b\xe3\x5f\x5a\x7d\xc6\xeb\xf1\xb9\x96\x7d\x7e\x5a"
+ "\xba\x60\x88\xaa\x78\x49\x2b\xaa\x51\x6c\xe9\x0b\xef\x46\x41\x1d"
+ "\x48\xd1\x0f\xf9\x69\x4d\xdb\xc6\xeb\x8f\x03\x0f\x70\xba\x4f\x53"
+ "\x6a\xf1\x5f\x37\x7c\x9e\xce\x99\x50\x84\xfb\x81\x8a\x53\xfe\x0a"
+ "\xbc\xd9\xe2\xd1\xea\x13\x9d\xaa\x7a\xc1\x93\xbe\x44\x9e\x0d\xa7"
+ "\xdb\x63\x7e\x96\x56\xaf\x9b\xa1\x38\x7f\x5a\x35\x3d\x14\xce\xb9"
+ "\x9a\xb2\xdf\x0c\x85\xe7\x70\xb9\x01\xd7\xd1\xf0\x8c\xc5\x2f\xe0"
+ "\xfb\xbe\xbd\x03\x9e\x95\x5a\x3f\x15\xf2\xfe\xeb\xf4\xd0\x8f\xd6"
+ "\x36\x53\xf8\x9c\x49\x7b\x53\x03\x7c\x77\xa7\xb3\xfe\x7c\x7e\xe7"
+ "\x00\xe4\xba\xfb\x1d\x84\x76\xbd\x83\xdc\x9a\xb2\xde\xd6\xea\x5c"
+ "\xdd\xf3\x48\xdd\xb7\xc5\x9d\x82\x34\x3a\xc5\xdb\x09\x34\xf0\x97"
+ "\xb9\x97\xf7\xb8\x10\x3b\xf7\xba\xd8\x7e\xaf\x6d\xe3\x42\xf0\xbd"
+ "\x48\x8c\x6e\x6a\xc8\x5f\x92\x87\xa9\xe0\xbe\x50\x1c\x3f\x1c\x3b"
+ "\x73\x1e\xa6\x6c\x73\x1e\x5b\x8c\xf8\x7a\xb8\x67\x25\xfd\xc1\x7d"
+ "\xa1\xa6\x6d\x61\xa1\x70\xed\x41\x7c\xde\x33\x0d\x35\xd0\xf0\x17"
+ "\xdf\x9f\x60\x01\xb1\xa7\x52\x11\xce\x9f\x66\x8f\xd1\x70\x4c\xa7"
+ "\xc8\xf0\x35\x81\xbc\xc6\x6d\x53\x9d\x22\x83\xe9\x9b\xa0\x95\x23"
+ "\xaa\x08\xc6\x19\xcb\xd6\x54\xd2\x26\xf8\x19\x47\x55\x22\x97\xe2"
+ "\x17\x30\xbe\x19\x5a\xd5\x94\x3e\x10\xe3\x8c\xec\xf6\xd8\x0e\x9b"
+ "\x8e\xe3\xa3\xdc\x3d\x00\xca\xfb\x5b\x7d\x8b\x68\x4a\x85\x30\x3e"
+ "\x38\x56\x10\x27\x04\xc7\xdd\x30\x4f\x9b\xb2\x32\x8a\xad\xe2\xa5"
+ "\xfc\xc3\xd4\xf5\xb4\x45\xde\x9b\x69\x82\x9b\x3b\x9b\x5e\xaf\x73"
+ "\xe9\xab\xc7\xe9\x55\x0f\x30\x9c\xf1\x60\x71\x65\xb8\x85\xe3\x47"
+ "\xfb\x44\x14\xe2\xff\xbf\x34\x12\x29\x3d\x2b\x11\xa5\x4a\x19\x5e"
+ "\x44\xb8\x30\xa1\xc8\xcc\x13\xe6\x1d\xb7\x8d\x72\x33\x6e\x80\xb6"
+ "\xb6\x9d\x7f\x99\x09\xc6\xec\x11\x95\xad\x3e\xcf\x26\xb6\xe4\x8e"
+ "\x0d\xa1\xb5\x23\x2a\xf1\xfc\xf3\x4b\x8a\xcc\x38\x26\x06\x1b\xdc"
+ "\x10\x79\x8e\x11\xe7\x53\x12\x68\x7d\xca\x4d\xb8\xd7\xc0\x67\x13"
+ "\x3f\x5d\xad\x07\xbc\xc6\x86\x60\x3e\x1c\xbf\xdd\x4c\xe1\x35\x01"
+ "\xe9\xfe\x7f\xbe\xbd\x0b\xde\x35\x1f\x38\x01\xef\x8a\x70\xbe\x4d"
+ "\x59\x99\x07\xb9\x77\xcd\x8c\xc2\xdc\x80\x7b\xd4\xb2\xdc\x77\x87"
+ "\xe7\x72\x81\xbc\x6b\x21\xdd\x79\x9d\xcb\xb1\x10\x73\x4c\x98\x7b"
+ "\x73\xe9\xd8\xb2\x94\x59\xaa\xf7\x1a\x51\xdb\xb6\x9a\xae\xdc\xfa"
+ "\x3d\xe4\xbf\x01\xd1\xad\xb7\xe9\xb2\xe4\x28\xba\x39\xeb\x65\x3c"
+ "\xce\xb1\x1a\xad\x9f\x87\x06\xdf\x93\x46\xeb\x23\x8d\xc8\xf3\x9e"
+ "\x6a\x4f\xfa\x6c\x54\x35\xb3\x37\x42\x72\x25\x5d\x5b\x9e\x78\x02"
+ "\x25\x5f\x46\xee\xeb\x16\x22\xef\xf5\x51\xf0\x2e\x65\x74\x73\x45"
+ "\x52\x35\x2a\x6f\x80\x5f\xe2\x59\x48\xf7\x1d\xfc\x4e\xa0\xf5\x6b"
+ "\x90\xeb\x14\x68\xf7\x52\x1a\x91\x7b\x79\x62\x23\x1c\xbb\x8e\x92"
+ "\x63\x68\xc3\xd9\x32\x9c\xee\x34\x8a\x34\xe8\x3d\xd7\x5d\x07\x4c"
+ "\x5f\xc6\x73\xba\x2f\xa2\xdd\xf0\x2c\xad\x5e\xbb\x52\x5b\xb2\xf7"
+ "\xba\xdd\x5a\x4d\x1b\x9a\xb2\xb2\xf6\xe8\xd0\x53\xc5\xbc\x77\xc1"
+ "\xcf\xdc\x8a\x10\xe0\xe6\x82\xd3\x98\x72\x9f\x52\xce\x35\xe0\xfa"
+ "\x25\x2b\x07\x74\x07\x32\x9f\xc7\xe7\xf4\x3e\x4f\x29\xe1\x78\x71"
+ "\xa4\x81\x6e\xc2\xf1\xc1\xef\x0d\x31\xaa\x61\xdf\xbf\x46\x91\x88"
+ "\x5c\x9b\xb2\xb6\xba\xea\x5c\x8a\xdc\xf1\x3d\x20\xcf\xde\x70\x9f"
+ "\xed\x98\x1b\xec\x39\x95\xce\xe5\x7f\xa6\x71\x7c\x79\xbb\x1a\x38"
+ "\xd2\xdb\xfc\x2c\x70\x3e\x54\xe7\xf2\xf7\x59\x16\x7c\xc2\xfc\x68"
+ "\x3f\xcf\xb6\x67\xf8\xf8\x1e\x13\xae\x5b\x95\x2a\xbd\xd1\x67\x42"
+ "\x31\x94\x99\x4a\xfa\x96\xaf\x3b\x4d\xd1\xcd\x53\x0c\x74\xb3\x29"
+ "\xf7\x61\xdc\x96\xb9\x57\x18\x1a\x10\x49\xbf\xf5\x32\x94\xb5\x2a"
+ "\x32\x86\x74\xeb\x59\x9c\x27\x68\x9b\x98\xac\x7a\xa4\x8c\xac\xa4"
+ "\x9b\x71\xf9\x35\x65\xb7\x46\x65\x2d\x47\xde\x74\xee\x84\x42\x93"
+ "\xcf\xb8\xe2\x96\xbd\xd1\x5a\x5c\xc7\x62\xfe\xd2\x5a\xb8\x96\xcd"
+ "\x07\xee\xdb\x4b\xa7\xd8\x5a\x60\x82\xeb\xe9\x9c\x87\x95\xec\xf3"
+ "\x30\xf5\x21\xa9\x47\xb7\x16\xd0\xfe\x70\x4e\xab\x6a\x80\x73\xbd"
+ "\x2e\x29\xb4\x21\x70\x1c\xd1\xda\x61\xea\xe2\x94\x7a\x48\xab\x1d"
+ "\x43\x38\xa4\xd2\xf3\xfe\x4f\xe1\x78\x66\x04\xe0\xf2\x4f\x74\xa8"
+ "\xf6\x25\xae\xdc\x31\xef\xcb\x94\xab\x56\x9f\x87\xa1\xdc\x69\xe3"
+ "\x75\x2e\xf7\xfa\xb2\x31\x76\x69\x20\x75\xd2\x41\xd3\xde\xe8\xed"
+ "\x5f\x82\xf2\xfb\xb2\x0c\x21\x48\x93\xa1\x73\xf1\x51\x73\xb1\xd4"
+ "\xee\xc3\x69\x99\xe7\x84\xb2\x69\xda\xc0\xb6\x01\x70\x0d\x94\x9b"
+ "\x18\x5c\xe7\x90\xba\x4d\xbb\x07\xd7\x3b\x50\x3e\x4b\x49\xbd\x7f"
+ "\x9f\x2f\x3c\x97\x86\x1e\x30\x33\x14\x9e\x2b\xf5\x12\xfb\x2c\x96"
+ "\xcf\x66\xae\x67\xe8\xec\x99\xc5\x24\xed\x08\x7d\x53\x56\xb6\xbb"
+ "\xce\x65\xa0\xab\x25\xd7\xc8\x7b\x65\xa7\x8d\x2a\x83\x7f\x83\x2e"
+ "\x31\xe7\x05\x65\xd5\x0d\xb4\x44\x7f\xcc\x29\x5c\x3e\x77\xbc\x83"
+ "\xb5\xc6\xcc\xd2\x96\xec\x99\x50\x4e\xb3\xa7\x99\xcb\xa9\x69\x35"
+ "\x5d\x05\xb8\x22\xd3\x6d\xfa\xfc\x56\xc0\x32\xd2\xa8\xa0\xe7\x1a"
+ "\xd5\x08\x74\xab\x61\x37\x1c\xdf\xbd\x1a\xeb\xbe\x2c\x2d\x94\x65"
+ "\x37\xe1\xb4\xae\x08\xa7\x63\xd2\xb3\x69\x5b\xbd\x66\x96\x32\xcf"
+ "\x4c\x29\x4c\xf0\x7c\x2e\xe6\x67\x6a\xf5\x1a\x51\x0d\xf7\xae\xd4"
+ "\xb9\xb8\x86\xf2\xca\xcb\x3b\x2a\x25\x4d\x47\x63\x5e\x29\xe0\x5d"
+ "\x1a\xe1\x6f\x1f\x96\xc7\xf7\x7c\x09\xba\x36\x2c\x02\xca\x0a\xe0"
+ "\xbd\x73\x20\x0d\x31\x78\x47\xa9\x43\x73\x73\xf0\xf5\x5b\xe0\xff"
+ "\xf8\x38\x4e\x03\xc7\x03\x74\x28\x66\x23\xc9\x37\x63\x2c\xc6\x8f"
+ "\x9f\xef\x3b\x11\x24\x5f\xe6\x59\xee\xc1\x79\xe2\xeb\x70\x9e\xf9"
+ "\xdb\xe8\x3a\x9c\x0f\xe4\x91\x60\xce\x3b\x13\x8e\x99\xf3\x0f\x5b"
+ "\xdc\x7e\x8f\x0c\xb8\x87\xbb\xe5\xb3\xef\xd8\x46\x37\xb0\xcf\xb5"
+ "\x5f\x87\xe2\x63\xf1\xb9\xcd\x70\x0c\x5f\x4b\x38\xf2\xce\x69\xcc"
+ "\x1f\x1d\x79\x1f\x05\xe1\xd1\x3b\xe7\x75\x68\x41\x9d\x65\x1d\x0f"
+ "\x38\x79\x98\xdb\x00\x36\xbf\x66\x73\x7e\x5c\x5e\x24\x0f\x5a\x3b"
+ "\xab\x88\x2d\x23\xb8\x2c\xbb\xe3\xfc\x9b\xb2\xde\x85\xf7\x9f\x3f"
+ "\x9a\x7d\xff\x80\x06\xc2\x79\x88\x3d\x73\x0d\xe1\x43\x56\xfa\x60"
+ "\x73\x5b\x0e\x58\x54\xc1\x35\xb3\xac\xda\x26\x37\xd2\x6e\x4c\xd0"
+ "\x61\xde\xb0\xf7\x18\x83\x9f\xc9\xfc\xbe\x90\x8f\x2b\xe4\xf3\x30"
+ "\xe6\x3a\xce\x07\xea\xb6\x3d\x90\x4f\x81\x55\x3e\xae\x38\x9d\x29"
+ "\x2b\xfd\x15\xdc\x16\xbe\x3b\x90\x86\x3a\xff\xdd\x52\x73\x1a\x7c"
+ "\x1e\xe2\xfa\x34\x1c\xab\xd6\xa1\xc5\x4c\x1c\xb2\x20\x8d\x4e\x91"
+ "\x2e\x3a\x3f\x26\x65\x18\xa2\x2a\xf2\x74\xd8\x3b\xe2\x72\x3d\xb6"
+ "\x62\x70\x03\xaa\xc8\x33\x21\xd3\x07\xf7\x15\x87\xa6\xd0\xc5\x57"
+ "\x14\x39\xd3\xcb\x9b\x6b\x91\x34\xbd\x97\xc3\xcc\x7f\xa3\x5b\xc1"
+ "\xe3\x24\x3f\x8a\x70\xfb\x7f\x43\x91\xbb\xb9\x42\x5f\xcf\xd4\x71"
+ "\xf0\xef\x55\xf8\xfc\xbb\xe0\x89\xb0\x2f\x02\xef\x1b\xaf\xa5\x88"
+ "\x37\x32\x41\xda\x5d\xf8\x38\xf6\x4d\xe0\xd9\x76\x5b\x9c\xa3\x3f"
+ "\xf0\x0b\x25\xb1\xcb\x1d\xcf\xb4\x79\xf8\x79\x0d\xcf\x17\xe3\x67"
+ "\x36\x15\xf8\x85\xe2\x77\x58\x9f\x44\x9b\x2a\x0c\x4d\xc5\xe5\x0d"
+ "\x46\xa4\x5a\x8d\x3d\x5d\xee\x90\xc8\x7c\x44\x43\x1d\x28\xd1\x53"
+ "\xe5\x30\xe3\xff\xc0\xf7\xde\xd0\xfb\xfb\x85\xae\x37\x22\x6a\x6b"
+ "\x4a\x2f\xb7\x67\xf3\xe8\xe2\x5b\x0f\xdd\x57\xdc\x94\x95\x1b\x7a"
+ "\x2a\x09\x21\xe9\x5a\x38\x37\xd4\xfc\xee\xbb\xd8\x77\x87\x7b\x31"
+ "\xf5\xd2\xa8\xed\xa9\xcc\xfb\x42\x9a\x24\x31\xbc\xe8\x0d\x9e\xf4"
+ "\x97\x79\x06\xb4\x22\x8f\x6e\x5d\x91\x8f\x28\xe3\xb6\x51\xda\x8f"
+ "\x76\x55\xe1\xfa\x3c\xd4\x1c\x4f\x26\x76\xe0\xf7\x13\x53\x90\xf2"
+ "\x9a\x62\xdb\xb0\xc8\xe4\x54\x66\x8f\xa4\xcf\x21\x9d\xc4\x67\x65"
+ "\xfa\xff\xca\xc1\x47\x47\x1a\xd6\xd3\xa4\x4d\xda\x36\x69\x0a\x9b"
+ "\x1f\x3e\x67\xc6\x6f\x17\xeb\x6f\xa5\xdf\x63\x9b\xe8\xfc\x7f\x3b"
+ "\xef\xaa\x14\x7e\xd7\xbf\x78\xc8\x7f\xd7\x6d\x55\xb6\xef\xfa\x97"
+ "\x31\x9d\xfb\xae\x7f\x19\x2b\xe3\x5d\x55\x22\xef\xda\x22\xff\x5d"
+ "\xff\x52\x62\xfb\xae\xdb\x87\x75\xee\xbb\x6e\x17\x5d\xff\xc9\xce"
+ "\xbb\x86\x08\xbf\xeb\xf6\xcb\xf2\xdf\x75\x7b\xa1\xed\xbb\xee\xf0"
+ "\xe8\xdc\x77\xdd\x21\xba\xff\x29\x4d\x79\xd2\xb8\x7e\x82\x7a\xa9"
+ "\x35\xa5\x05\xb4\xdc\xb6\x89\x51\xeb\xf6\x22\xaa\xac\xa1\x19\x95"
+ "\x0f\xae\xc2\x3a\x99\x7a\x38\x11\xea\xbd\x0d\x68\x2c\xfd\xce\xcd"
+ "\xa8\xf2\xbc\x3a\x38\x7e\x05\x9d\x4d\x6a\x46\xa1\xcb\x71\xfd\xbb"
+ "\xe3\x42\x45\xac\xd4\xfa\x77\x47\x41\x7b\xfd\x6b\x78\x94\xad\x73"
+ "\xdf\xeb\x55\x5e\xd7\x8a\xf0\xfb\xdf\x50\xec\xbc\xd9\x5e\xff\x6e"
+ "\x20\xf1\xb6\xae\x7f\x71\x3c\x2a\x9a\x9b\x79\xf5\x2f\x99\x27\xb5"
+ "\xf3\xa4\x75\xdd\x9b\x75\x0d\x21\xe1\xba\x77\xe7\x0e\x5c\xf7\xee"
+ "\x82\xf3\xd2\x9e\x7f\x67\xac\xb9\xee\xd5\xc2\x3d\x2d\xeb\xde\x2f"
+ "\x63\x71\x9b\xbc\xf3\x84\xbc\xba\x77\xe7\x09\xf3\x7b\xe7\xb3\xef"
+ "\x0d\xc7\x54\xfc\xba\x77\xa7\xe8\x5e\x97\x96\xbc\xa5\xb7\x05\x26"
+ "\x7e\x34\xb4\xb9\x97\xa9\x60\x70\x2a\x6e\xdf\x9a\x20\x26\x7f\xdf"
+ "\xd5\xec\x7a\x45\xf1\xde\x4a\xa6\x3f\xb3\x29\xd6\x85\x2e\xb8\x2f"
+ "\x20\x72\x25\xfd\x03\xed\x3f\x38\x15\xf7\x55\x62\xcf\x0d\xe7\x0f"
+ "\xd0\xfb\xee\x0b\x90\xf6\xdc\x24\x4f\xfa\x83\x41\xc5\x29\x50\x5e"
+ "\x3e\x5a\xdd\x4c\x99\xde\x88\xf6\x04\x1c\x94\x74\xee\xc3\x85\xf4"
+ "\x5b\xbe\xc9\xb7\x72\xc3\x54\xa7\x03\x2e\x23\x9c\x96\x4e\x73\x1d"
+ "\x2b\xff\xf9\xf3\x46\xdb\x7f\xfe\xbc\x85\xd2\x9f\x9f\xe4\xe9\xd8"
+ "\xf3\xe7\x8d\x76\xe8\xf9\x07\xc2\xf3\xb7\x6a\x7a\x81\xff\xa3\x3e"
+ "\x6f\xd5\xb8\x4a\x7c\x1e\xd1\xfd\xef\x3a\xef\x1e\xf9\x0e\xd7\x7f"
+ "\xf4\xc0\xa7\x0a\x3f\xda\xa5\xa7\xa0\x0e\x60\xda\x70\x5c\xf6\x48"
+ "\xfd\x57\x0b\x75\xd6\x0f\x34\xa9\x93\xf4\x12\xeb\xa4\xfc\xfd\x8e"
+ "\xdf\x3f\x44\xd9\xf9\xf7\xdf\x25\xfe\xfe\xd6\x75\xe2\xe1\x21\x7b"
+ "\x44\xeb\xc4\x6d\xa3\x94\xb6\x75\xe2\xae\xeb\xd2\xeb\xc4\x5d\x45"
+ "\xb6\x75\xe2\x9e\x41\x5c\x9d\xb8\xa7\x97\xfc\x3a\x71\xf7\x39\xc7"
+ "\xeb\xc4\xdd\x87\xe4\xd5\x89\xbb\x93\xec\xd7\x89\xbb\x2b\xe5\xd5"
+ "\x89\xbb\x2b\x6d\xeb\xc4\xdd\xa3\xf9\x75\xe2\x1e\x37\x51\x2c\xb5"
+ "\x9e\x55\xd0\x46\xbb\x5f\x53\xec\xa9\x32\x6c\x00\xdf\xa2\x4d\xd7"
+ "\x44\x1a\xe9\x26\x3a\xdb\xb3\xca\x44\x8d\xc6\xf5\x4a\x68\x53\x53"
+ "\xbc\x9b\xe9\xf5\x00\x77\x7a\x80\x6a\x17\xdd\xe6\x8b\x20\x4e\xc3"
+ "\xe1\xf9\x3d\xe9\xa6\x80\xfe\xf4\xeb\x01\x03\xf2\x6e\x23\x6f\xf8"
+ "\xf9\xe6\xb1\xed\x31\xfc\x3b\x84\x7e\xdd\xb7\x5f\xd6\x6a\xa4\xf6"
+ "\x6c\x40\x6e\xf0\x0c\xd1\x9e\x69\x4a\x04\x75\x90\x37\xfe\x37\xbd"
+ "\xa1\x60\xec\xee\xdb\xc8\xd5\x33\x09\xb0\xf1\x82\xfb\x25\x79\xd2"
+ "\xf4\x8a\x00\xb4\x7b\x39\x78\x69\x0a\xf9\xee\xa2\xe8\x42\x43\x53"
+ "\x00\x65\xf4\x9e\x50\x49\xf0\xd9\x9b\x41\x0f\x04\xef\x95\x33\x21"
+ "\xcf\x34\x70\xc2\x46\xe3\xfa\x78\x05\xfd\x46\xb4\x02\x3f\xab\x31"
+ "\x67\x42\x2a\xbd\x0d\x7e\xeb\xe3\xfb\x63\x0d\x0d\x5e\x3b\x84\x6e"
+ "\xf2\xed\x07\x3e\x5c\xbd\x6b\x35\x1a\x9e\x7f\x1b\x05\xd0\xb7\x02"
+ "\x28\xc0\x3f\x1a\xef\x35\x0a\x31\x8a\x36\x51\x05\x63\xe1\x9c\x2b"
+ "\xae\x13\x69\x7c\x7f\x03\xdc\xbf\x0d\xee\xdf\x8a\xb9\x8d\x7c\x77"
+ "\xc3\xfd\x8d\xaf\x07\x48\x2c\x2f\x7b\x99\xf1\xbf\xe6\xe7\x32\xa9"
+ "\xfd\xf7\xd0\x87\xe1\x87\x9f\x0b\x62\xb8\x1b\xc7\xe4\x61\xff\x02"
+ "\xfc\x6c\x99\xb7\x91\x1a\x9e\x73\x38\x3c\x43\x00\xdc\x17\xaf\xd3"
+ "\x12\x3d\x67\x99\x12\x73\x94\xf7\x6c\xc6\x6c\xf6\xd9\x7e\x81\x67"
+ "\xbb\xc1\x3d\x1b\xbe\x17\x8e\x8f\xd8\x37\xd0\xc8\x75\x43\x71\xd9"
+ "\xfc\xc9\x33\xa9\x4f\x38\xfe\x1e\x7a\xeb\x8d\x78\x89\x5c\xfd\xab"
+ "\xe8\xfa\x27\x5b\x0f\xa3\xc1\xb4\x72\x83\x66\xca\xa6\x1f\xe8\x48"
+ "\x03\x42\x9b\x0e\x23\x75\x05\x94\xeb\xf2\xe6\xeb\x88\xf6\xda\xa0"
+ "\x39\x1d\x50\x27\xf5\x5e\x5a\xb1\x7b\x6d\xd9\x40\x57\x9a\xbc\x27"
+ "\x14\xd3\xde\x61\xbe\x5b\x37\xd0\x49\x6d\xc3\xfd\x62\x5a\x87\xdf"
+ "\x17\x32\xd7\xa0\x04\x5e\xd3\x49\xaa\xe5\x48\x75\x45\xb1\xff\xbb"
+ "\xaf\xcf\x83\x2f\x9d\x81\xdc\x2e\x29\x0e\xb8\xaf\xbf\x80\xbf\x15"
+ "\xbd\xaf\xe2\x7f\x2b\x7a\x3f\x0c\x29\x0a\x8e\x22\xc5\xbe\x12\xa4"
+ "\xf8\xa0\x16\x41\x3a\xfe\x6f\xbf\x2b\xc9\xab\x20\x3b\xf2\xc0\x50"
+ "\x94\x62\xa0\x7f\xa2\xb5\xf5\xe9\x59\x14\xdd\x1c\x39\xd2\x45\x57"
+ "\xbc\x1a\x7f\x43\x29\xd8\x0c\x31\xfd\x19\xda\x5a\x4f\xf8\xf7\x4b"
+ "\x80\x29\x4a\x5c\x8e\xee\xbd\xa6\x28\x98\x86\xcb\x8d\x67\x43\x9f"
+ "\x70\xe3\xfa\x68\x64\x50\x45\x6b\xdb\x72\x26\x14\x1a\x73\x1e\x56"
+ "\x9a\x94\xe9\x9a\xf5\x57\xd1\x60\xfc\xed\x13\xca\x46\xf4\x5c\xa3"
+ "\x1b\x2e\x8f\xd1\xc5\xf3\xbf\x46\x57\x56\x22\x6a\x7d\x23\xf2\x00"
+ "\x6e\xb6\x97\xab\x88\x3a\xcf\xe6\x75\x75\xb4\x09\x97\x2d\xdc\xa7"
+ "\x0a\xe7\xfa\xa7\x34\x82\xbf\xd7\xd7\xa2\xbc\xe5\xc8\xdb\xb8\x22"
+ "\x7e\x80\xfe\x56\xfc\xbd\xef\x99\x90\x77\xff\x06\xa4\xcc\xab\x07"
+ "\x4e\xad\x00\x3e\xd5\x43\x39\xd3\x93\x72\x86\xe7\xda\xef\xc2\x65"
+ "\x6c\xcb\x37\xde\xbb\xeb\x49\x19\x63\x78\x84\xcb\xd8\x52\xe0\xd1"
+ "\x12\xdc\x7e\x00\x8f\x36\x40\x19\x83\x72\x41\x67\xfd\xd5\x35\x6f"
+ "\x03\x8d\xd6\x2d\x44\xd4\xee\x6b\x7d\xf0\x39\x97\x5e\x23\x29\xd5"
+ "\xd7\x51\xcd\x88\xeb\xeb\x38\xe0\xd1\xea\x7f\x5f\x88\xea\x05\xfa"
+ "\x97\x4b\x8a\x82\x54\x38\xee\xa6\x7a\x79\x84\x12\xe2\xcd\xf6\x49"
+ "\x1f\x70\xc7\x7d\x9c\x3a\x88\x05\x8e\x8b\xea\x05\x34\xe2\x92\xe2"
+ "\xfd\x97\x70\x1c\x5f\xdf\x8f\x14\x89\x4f\xd3\x35\x10\xb3\x59\xa4"
+ "\x1f\xf7\xfd\x69\xcc\x37\xd4\x34\x15\xfa\x86\xf9\x76\x45\xae\x31"
+ "\x42\xdc\x0c\xca\x9b\x55\x80\xb7\xae\x78\x51\x2b\x53\x0f\xe1\x38"
+ "\x5e\x49\x40\xd4\xdc\x3a\x88\x95\x11\x62\xd5\x14\xe0\x0e\xf5\x51"
+ "\x14\xae\x8f\x68\xad\x6a\x7b\xb2\x8e\x36\x45\xc6\x2a\xe8\x94\x65"
+ "\xc8\xad\x22\xc9\x88\xe6\x24\x22\x7a\xdd\x75\x88\x57\x43\x15\x82"
+ "\x7a\xa9\x3f\xd4\x59\x03\xf2\x57\x23\x6f\x1c\x2f\x8f\x3a\xd0\x2a"
+ "\xef\x6c\x0c\x39\x9c\x52\xda\xcb\x08\xfc\xc5\xf5\x93\x67\x9a\x4b"
+ "\x5f\x28\x67\xfd\x33\x70\x79\x84\xf2\xe9\x99\xc6\xd4\x97\xd1\x79"
+ "\x50\x0e\x0d\xaf\x07\x3c\xd0\xf6\x7a\x80\x0a\x7e\x43\xcd\x75\x98"
+ "\xb9\xfe\x80\x98\x25\xe0\xfa\xab\x22\x49\x87\x0c\x10\xdb\xfe\xb8"
+ "\xad\x7b\x3d\x60\x30\x13\xe3\x57\x03\xd0\xa8\x66\xe4\x02\xcf\xa4"
+ "\x84\xe7\x45\xbb\x17\x20\xb7\xb3\xf1\x97\x90\x11\xca\x86\x39\xee"
+ "\x11\x0b\x55\x08\xf2\xa5\x4e\x07\x7c\x87\xd8\x98\xb9\x88\xf3\xee"
+ "\x83\x1f\x39\xde\x7d\xc0\xcc\x8b\x25\xbc\xfb\x40\xf7\x5b\xe4\xdd"
+ "\x37\xd1\x0c\xef\x14\x6d\xfe\x0c\x9f\x66\x55\x18\x3e\x86\x18\x7d"
+ "\x50\x86\x39\x82\x39\x73\xe6\x6f\x98\x33\xff\xa7\xa1\xbb\x72\xa6"
+ "\xa5\x29\x40\x05\xbf\x3b\xc2\x19\xc8\x97\xe1\x0c\x8e\xd5\x37\xd1"
+ "\xad\xc8\x1c\x23\xa6\xac\x6a\x37\x68\x54\xeb\xd1\x33\x50\x56\xdd"
+ "\x3d\xd3\x86\xa2\xb3\x4c\x9c\x0e\xb8\xab\x5e\xa6\x4d\x97\x14\xfb"
+ "\x83\xd7\x9f\x43\xca\xd6\x0d\x34\x5d\x61\x38\x84\x4c\xde\xe3\x8a"
+ "\x99\xef\x81\xda\xd6\x28\xf0\xac\x1a\x1a\x7f\x87\xdf\x00\x98\x25"
+ "\xe2\xbe\xf0\x37\x43\x8d\xb9\x11\x85\xa6\xec\x0d\x89\xb4\xd7\x5e"
+ "\x64\x84\x72\x6d\xca\x9e\xaf\x34\x79\xed\x8c\x6a\xca\xda\xbf\x52"
+ "\x87\x4e\x95\x32\xdf\x7f\x73\x26\x14\x43\xdd\x80\xeb\x5f\x66\xbc"
+ "\x27\xfe\x4e\x0f\xe7\x73\xcc\xdf\x97\x71\x9d\xc0\x7e\x7b\x60\xbf"
+ "\x4d\xec\xc7\x18\xf6\xc3\xdf\x26\x48\x9d\xb2\x7f\x93\xf9\xdb\x84"
+ "\xf9\xff\xf8\xbc\x4e\xb1\x3f\x1d\xf7\xab\x72\xd7\x1d\x70\x25\xe9"
+ "\xcc\xd7\xbd\xdf\x17\xd7\xf5\xdc\x75\xe4\xff\x50\xaf\xb8\xb6\x51"
+ "\xc8\x4d\x50\xe3\x78\x47\x14\x42\xf9\x01\x6f\xf4\xb7\x4d\xf0\x97"
+ "\x82\xb8\xec\x83\xbf\x0a\xf8\xcb\xf4\x63\x4a\x6b\xaf\x0e\x84\x92"
+ "\xef\x43\x61\x61\x6c\xdd\x38\x9e\x29\x93\x81\xc8\xe3\x1a\xfb\xef"
+ "\xa6\xac\x03\x79\xe6\xef\xe4\xed\xe9\x39\x7c\x34\xf8\xde\x80\x91"
+ "\x2b\xf9\x76\x4f\xfe\x8f\xc7\xc5\xb0\xf9\x31\xff\x37\x0d\x1f\xa2"
+ "\x2a\x4e\xb9\x84\xea\x14\x7f\x73\xab\x80\x36\xdc\xb4\x2d\x2c\x6c"
+ "\xeb\x6d\x28\x03\x49\xed\x75\xf2\x78\x28\x8b\x6e\xc5\x6b\x71\x9a"
+ "\x03\xcc\x5e\x3a\xa6\x9c\xa7\x54\xf4\x3b\xf5\x51\xd8\x0b\x36\xd1"
+ "\xf1\x4f\xb3\x7f\xc7\xe1\xf2\x44\xfa\x4d\xfe\xf6\x12\x0d\xd8\xe2"
+ "\xbd\xd2\xdb\xc7\x0a\xe1\x3d\xcc\x53\x5d\x07\x9f\x4a\x26\x6d\xa5"
+ "\xf9\x79\xf1\x3e\xe7\x78\x2c\xce\x88\x54\x94\xda\x24\xb0\xcf\x39"
+ "\x37\x66\xe7\x6f\xa1\xa6\xdc\xa7\x00\xfb\xbf\x69\xa1\x2d\xaf\xb4"
+ "\x7c\x67\x21\x2c\x20\xfd\x41\xb1\x73\xd2\x70\xf8\x5b\xa9\x58\x3e"
+ "\x13\x03\x8c\xb4\xb4\xbc\x3e\x14\xef\xff\x19\x3e\xa8\x38\x72\xbf"
+ "\xb1\xd8\xd4\x16\xed\x79\x3a\xf9\xba\x44\x6d\xf3\xa1\xe8\xfa\x7f"
+ "\xc6\x9c\x71\xba\xb6\x87\x06\x15\xe3\xef\x14\xc6\xa5\xd1\xcf\x97"
+ "\xef\x37\xa0\x03\x4b\x6a\x29\x5c\x1f\x1e\xbc\x56\x48\x45\x8e\x64"
+ "\x35\x5c\x0d\x52\xe2\x7e\x2f\xac\xe5\xb2\x6e\xa0\xe1\xad\xeb\xa3"
+ "\x3d\x5b\xdb\xa2\xd1\xdb\x37\xd0\x58\xd3\xab\xbe\xfd\x32\x16\x20"
+ "\xd7\x16\xa8\x0b\x5b\x7e\x8a\xf7\xfc\xa6\xba\x16\x7d\x0e\xd7\x96"
+ "\x37\xe8\xd0\x2e\x48\x4b\xff\x14\xdd\xff\x8f\x31\x74\x73\x59\xcc"
+ "\xc7\x28\x32\xc0\x58\x9c\xf2\x23\xf2\x80\x3a\x51\x59\x91\xb4\x8f"
+ "\xf9\x9e\xdb\x6b\x0d\xa5\xaa\x30\x5c\x46\x99\x0b\xa0\x2e\x85\xba"
+ "\x73\xfd\x4b\xd0\x66\x00\x27\xde\xb3\x6c\x33\x16\xed\xe4\xda\x8c"
+ "\x5f\xa0\xcd\x78\x07\xda\x8c\xf5\xbe\xa8\x3c\xb1\x18\x41\x1d\xd6"
+ "\x67\x4a\xa2\x67\x73\x4a\x22\xb4\x1d\x6b\xa0\xed\x48\xba\x8c\x98"
+ "\x76\xa3\xae\x16\x41\x9d\xdf\x3f\x7f\x09\xf2\x6e\xfd\x05\xda\x8e"
+ "\x5f\xa0\xed\x48\x21\x6d\xc7\x8e\x1b\xd0\x76\x2c\x05\x6f\xb0\x04"
+ "\xda\x8e\x3a\x81\xb6\xe3\x86\xb0\x2f\x30\xd7\x83\x2d\xbf\x04\x50"
+ "\x3b\xa0\xdd\x58\xfb\x1d\xa2\x76\xbc\xdc\x47\x22\x67\x0e\x8a\xce"
+ "\xff\xa5\xb7\x85\x3d\x68\xa2\xa3\x11\x8e\xfb\xda\x66\x68\x87\x01"
+ "\x97\x8a\x00\x03\xf2\x3c\xdf\x27\xbc\x05\x8e\xb7\x0d\x0c\xd4\xee"
+ "\xff\x5e\x4f\xd1\x39\x0f\x17\xb6\x00\x6e\x6b\x57\x21\xaa\x0d\x30"
+ "\x3c\xf8\x82\x96\xc2\x3e\xd1\x94\x1b\x78\x9e\x78\xd2\x8f\x7c\x70"
+ "\x9f\x88\xa7\x8e\xe0\x66\xa0\xa3\x3d\xe9\x57\xa2\x3d\x32\xe7\x23"
+ "\x57\xe3\x7f\x7d\xfb\x99\x5e\xf1\x75\x4b\xf9\x0e\x29\xf5\xaf\xc4"
+ "\x43\xbc\xae\xa3\xcf\xbf\xd5\x52\xbb\x67\x20\x15\x5e\x17\x91\x7e"
+ "\xeb\x8b\xaa\xdd\x73\x90\x66\xf7\x7f\xd0\xe8\x5d\x33\x90\x3a\xff"
+ "\x7b\xbc\x7e\x3a\x60\x58\x4b\x37\x9f\x8d\xff\x14\x7f\x63\x0f\xa5"
+ "\xb7\x05\x6b\x69\x9f\x71\x3a\xf8\xb7\x46\x3b\x03\xfc\x03\x9c\x8f"
+ "\x0c\x68\x29\xae\x48\x3a\x8b\x32\x2e\x21\x94\x72\x95\xc5\xb8\x1d"
+ "\xdf\x8b\xc8\x40\x41\xfd\x81\x35\x41\x04\xc1\x17\x7f\xf7\xc2\x9e"
+ "\xa3\x1d\xe3\x05\x5f\xf0\x75\x01\x8b\xf1\xd9\xba\x4a\x04\x6d\x60"
+ "\x9f\x76\x7d\xc0\x60\x7c\x11\x99\xb5\x01\x60\xd3\x1f\xb4\x80\x77"
+ "\xcb\x2d\x2b\x7d\xb0\x5c\xa6\x3e\x60\xfd\x8d\x61\x45\x00\x95\x47"
+ "\xd1\x68\xfd\x59\x44\x6d\x37\x49\xc5\xf8\xb0\x8e\xa9\x6f\x0b\xee"
+ "\x0b\x20\x63\x64\x0e\xed\xc0\x58\xe8\x14\x87\xb6\xbf\x14\xe0\x82"
+ "\xe4\x61\x1f\xa4\xb4\x8f\x7d\xd0\x34\x82\xfd\x11\x2f\x79\xd8\x07"
+ "\x29\xe9\xb7\xbe\x0c\x91\x87\x7d\xa3\x44\xec\x99\xf5\x25\x7f\xa3"
+ "\xd8\x17\x56\xf3\xb1\xff\x28\x97\x60\xff\x51\x8e\x13\xd8\x77\x50"
+ "\xee\x83\xd8\x72\xff\x89\x87\x4c\xec\xa1\xdc\x7f\x99\x2e\x0f\xfb"
+ "\xeb\x12\xb1\x67\xd6\xa8\xfc\x8d\x62\xff\x71\x15\x1f\xfb\x23\xd9"
+ "\x04\xfb\x23\x5a\xf9\xd8\xab\x3b\x28\xf7\x6a\xb6\xdc\x1f\xeb\x2b"
+ "\x0f\x7b\x35\x2e\xf7\x3a\x79\xd8\x5f\x94\x88\x3d\xb3\xce\xe5\x6f"
+ "\x14\xfb\xa3\xe7\xf9\xd8\x7f\x92\x49\xb0\xff\x24\xc3\x09\xec\x3b"
+ "\x28\xf7\x6a\xb6\xdc\xff\xbd\x97\x4c\xec\xa1\xdc\x97\x68\xe4\x61"
+ "\x7f\x52\x22\xf6\xcc\x5a\x99\xbf\x51\xec\xff\xa7\x92\x8f\xfd\xb1"
+ "\xcd\x04\xfb\x63\xe9\xf2\xb1\x0f\xee\xa0\xdc\x07\xb3\xe5\xfe\xb8"
+ "\x8b\x3c\xec\x83\xa1\xdc\x97\x68\xe5\x61\xbf\x4e\x22\xf6\xcc\x7a"
+ "\x9b\xbf\x51\xec\x8b\xca\xf8\xd8\xff\x7d\x13\xc1\xfe\xef\x1b\x1d"
+ "\xc1\xfe\x0d\x4b\xec\xab\xfb\x84\x83\xb7\x62\x74\xfe\x81\x19\x2c"
+ "\xf6\x1f\x00\xf6\xf0\xfe\x07\x5f\xde\x6e\xa5\xf1\x3f\x6d\x64\x70"
+ "\x8f\x01\xdc\x93\x00\x77\xf0\x86\x66\xcc\x01\x23\x0f\x8c\x3b\xc6"
+ "\x3c\xe5\x22\x52\x7e\x0e\xd7\x62\x7c\x30\xc6\x80\xa3\x8a\xc1\xb9"
+ "\xf7\x17\x55\xb4\x8b\xab\x37\xc6\x13\xeb\x7e\x8c\x79\x47\xda\x1e"
+ "\x73\xa2\x43\xcc\xa7\xde\x19\x7d\xdf\x6a\xdd\xff\xd7\x59\x98\x9f"
+ "\x03\x0f\x97\x22\x15\xf3\x4f\x8b\xf9\x98\x1f\x5f\x87\x71\xd0\x29"
+ "\x8e\x27\xcb\xc7\x5c\xad\x14\xc7\xdc\xdc\xc6\x9f\xb8\xea\x1c\xe6"
+ "\x5f\xea\x38\xcc\xd5\x4a\xfb\x98\x5f\x94\x81\x79\xe7\xb6\xef\xdd"
+ "\x0b\xf3\x13\x47\xf9\x98\xff\x63\x19\xc1\xfc\x1f\x89\x62\x98\x9b"
+ "\xa0\xbe\xc6\x7d\xea\x78\xfe\x9f\xb1\x29\xfa\xf9\x36\xc0\x15\xcf"
+ "\x03\xc4\x7d\xbd\x87\x96\x14\x51\x6d\x80\xfb\xd6\xd5\x68\x78\xc6"
+ "\x6a\x34\xd6\xb3\x96\xd4\xdf\xad\x50\x7f\x6f\xbe\x8d\x5c\x4d\xaf"
+ "\xf9\xf6\xcb\xb8\x86\x5c\x5b\x21\xc6\xad\xaf\xc5\x7b\x96\xc5\xe8"
+ "\xd1\xe7\x37\x8a\x28\xdc\x77\x8b\xbf\xdb\xd1\x3f\x47\xf7\x9f\x14"
+ "\x4b\x37\x97\xd5\xbc\x43\xfa\x55\x2e\x9b\xfb\x55\x0e\xf1\xfa\x55"
+ "\xde\xbe\xc6\xf6\xab\x4c\x27\x18\xe5\x59\xe2\x33\xe7\xaf\x22\xfd"
+ "\x2a\xa5\x1d\xf6\xab\x30\xfd\x29\x37\x90\x77\xdb\xd2\xf8\x01\x3b"
+ "\xd8\x7e\x95\x9d\x4b\x9c\xeb\x57\x69\x5d\x1a\x40\xed\x04\x7c\xde"
+ "\x98\x0e\xf8\x7c\x2f\x15\x9f\xcf\xa6\x39\xda\xaf\x62\x6e\x63\xcd"
+ "\xed\x2a\x2e\x73\xb8\x6d\x6d\xce\x09\xcc\xb1\xee\x4b\xc1\xe5\xed"
+ "\x86\xa2\x38\x0e\xd7\xc9\xf2\xfa\x53\x4a\x6a\x7b\x5a\x7f\x0a\x2e"
+ "\x73\xe6\x76\xb6\x7b\xb4\xb1\xc5\x21\xfc\xb2\xf7\xd9\x55\xd2\xc6"
+ "\x7e\x56\xeb\xa8\xbe\x12\xc7\x3c\xc8\xdb\xba\x0f\x85\x60\xfe\xc5"
+ "\x74\xdc\xe7\x22\xaf\x1f\xe5\xf4\xd8\x9e\xd6\x8f\xd2\xfd\x30\xff"
+ "\x62\x38\x1f\xf3\xe2\x8b\x04\xf3\xe2\xea\x4e\xc0\x3c\xc7\xba\xef"
+ "\x84\x60\x5e\x12\x81\xfb\x5a\xe4\xf5\x9f\x9c\x96\xa9\xa5\x7f\xbd"
+ "\xfe\x93\xee\x87\x79\x89\x2f\x1f\xf3\x2f\xce\x11\xcc\xbf\xa8\x74"
+ "\x1e\x73\xb5\xb7\x75\x9f\x09\xc1\xfc\xab\xf1\x58\x7b\xc9\xeb\x37"
+ "\x39\x5d\xd3\xd3\xfa\x4d\xba\x1f\xe6\x5f\xb9\xf3\x31\x2f\x39\x4d"
+ "\x30\x2f\x29\xe9\x04\xcc\x73\xac\xfb\x4a\x08\xe6\xa5\x63\x70\xdf"
+ "\x8a\xbc\xfe\x92\xaf\x7a\x5c\x7f\x49\xf7\xc3\xbc\x14\xf1\x31\xff"
+ "\xea\x38\xc1\xfc\xab\x22\xe7\x31\x0f\xf6\xb6\xee\x23\x21\x98\x7f"
+ "\x3d\x12\xf7\xa9\xc8\xeb\x27\xf9\x2a\xa3\xa7\xf5\x93\x74\x3f\xcc"
+ "\xcf\x34\xf0\x31\x2f\x3d\x44\x30\x2f\x3d\xe8\xa8\x67\x36\x7b\x65"
+ "\xb3\x3f\x66\xbc\xb2\x37\x68\x76\xab\xbe\x11\x82\x77\x99\x0f\xa3"
+ "\xd9\x65\x7b\xe5\x92\xda\x9e\xd2\x3f\x62\xc6\x1a\xfb\xe5\xee\xe1"
+ "\x95\xbf\xb1\xfa\xfe\xf9\x75\x3e\xf1\xca\x5f\xe7\x89\x61\x2d\x34"
+ "\x16\xa1\x1c\xbc\xa6\x79\x2c\xc2\xe6\xd5\x80\x23\xf0\x00\x8f\x45"
+ "\xc0\x63\x12\x84\xc6\x23\xe0\x71\x08\xe6\x31\x09\x96\xe3\x11\xc2"
+ "\x75\x74\x33\x1e\x93\x80\x7d\x72\x59\xcc\x16\x64\x1e\x9b\x80\xc7"
+ "\x20\xac\xff\x11\x79\x60\x8c\xf0\xf8\x03\xec\x97\xef\xf4\x18\x84"
+ "\xed\xa6\xee\x30\x06\xe1\x6c\x6a\x47\x5e\x39\xe2\xc0\x50\x04\x7c"
+ "\x6b\xef\xa7\x6a\xdb\x16\xa8\xc5\x65\x0e\x63\xe4\x59\x47\xca\xe1"
+ "\xa1\x97\x0b\xa9\x8a\xa4\x22\xb4\x79\x2d\x52\x9a\xfb\x2f\x70\x19"
+ "\x84\x7a\xd9\xd3\x00\x78\x66\x2c\x22\xfd\x18\xa6\x9f\xa3\x3d\xf4"
+ "\xaf\xc5\xe3\xb9\xfa\xca\xcf\xff\x59\x48\xe1\xbe\xc7\xdd\x0b\xd0"
+ "\xe8\xf7\xae\x20\x4d\x79\xc3\x45\xc4\x94\xa9\xdc\xc0\x52\xb8\xb6"
+ "\xb0\x2d\x77\x9c\xce\xe4\x13\x78\x54\xef\x13\x58\x84\x71\xcb\xb8"
+ "\x86\x10\x2e\x5f\x18\xb7\x8a\xa4\xfc\x76\xbc\x18\xac\x28\xb6\x6f"
+ "\x43\xb4\x4c\x7d\x2b\x1b\xb3\xbc\x1b\x80\xd9\x52\x3e\x66\xf9\x72"
+ "\xfb\x37\xcc\xe3\xb9\x97\x06\x50\xf9\x50\xa6\xd6\x4e\x05\xcc\x5e"
+ "\x90\x8a\x59\x85\xe8\xfe\xef\xe2\x98\x05\x29\x1d\xc3\x2c\x68\x5a"
+ "\xc7\x98\x7d\x19\x62\x8b\x59\x50\x38\x5c\x1b\x42\x30\x0b\x1a\xad"
+ "\xf7\x09\xd2\x70\x98\x35\x3a\x88\x99\xb5\x87\xfd\x2d\x61\x56\x29"
+ "\xba\xff\xbb\x1d\xcc\x1c\x2c\x67\x41\x0e\x94\xb3\x2f\xd3\x05\x30"
+ "\x83\x72\x16\xc4\x96\xb3\x20\x28\x67\x41\x16\xe5\xec\xba\x83\x98"
+ "\x59\x7b\xd0\xdf\x12\x66\xdf\x8a\xae\xff\x2d\x8e\x99\xda\xc1\x72"
+ "\xa6\x76\xa4\x9c\xe9\x6c\x31\x53\x43\x39\x53\xb3\xe5\x4c\x0d\xe5"
+ "\x4c\x6d\x51\xce\x2e\x3a\x88\x99\xb5\x87\xfc\x2d\x61\x76\x5e\x7c"
+ "\xfe\xb7\x38\x66\x0e\x96\x33\xb5\x03\xe5\xac\x44\x23\x80\x19\x94"
+ "\x33\x35\x5b\xce\xd4\x50\xce\xd4\x16\xe5\xec\xa4\x83\x98\x59\x7b"
+ "\xc0\xdf\x12\x66\xff\x14\xdd\xff\x51\x1c\xb3\x60\x07\xcb\x59\xb0"
+ "\x03\xe5\xac\x44\x6b\x8b\x59\x30\x94\xb3\x60\xb6\x9c\x05\x43\x39"
+ "\x0b\xb6\x28\x67\xeb\x1c\xc4\xcc\xda\xc3\xfd\x96\x30\xfb\x97\xe8"
+ "\xfe\xef\x62\x98\x31\x78\x81\x76\x14\xc4\xac\x95\xaf\x1b\x0d\xa0"
+ "\xe3\xf1\x37\x2f\x41\xbc\xde\xfa\xa2\x8a\x4e\x73\xf5\xc6\x58\x61"
+ "\x3d\x88\xf1\xaa\x48\x3a\x8d\x84\x74\x23\xfe\x2e\x06\xb8\x23\xfc"
+ "\x6d\x6c\xfd\x65\x09\x7a\x71\xbe\x18\x56\x1d\x7f\x0f\xcb\x5b\xc2"
+ "\x61\x65\xfe\x1e\xd6\xa9\x58\x7d\x2b\x15\xab\x0b\xb1\xf2\xb0\x52"
+ "\x2b\x3b\xc6\x4a\x3d\xcd\x3e\x56\x5f\xea\x38\xac\x2e\x5a\x60\x65"
+ "\xdb\x8e\x39\x8e\x95\x55\xfb\xf5\x9b\xc2\xea\xdf\x4a\x31\xac\x0c"
+ "\xde\xe3\x74\x78\xce\xfb\x14\xf0\xbe\xf4\x2b\xd1\xcf\x67\x5d\x42"
+ "\xc3\xb7\x5c\x42\x63\xf1\xfc\xe6\x43\x6b\x9b\x29\x78\xc7\x9f\xbe"
+ "\x3e\x5f\x8b\xda\x7e\xf6\xed\x87\xe7\xcf\x30\xf5\xe4\x6b\xbe\x6e"
+ "\x15\x31\x7a\xa6\x4e\xcc\x04\x8c\xca\x1b\x8a\x20\x26\x7d\xc2\xcb"
+ "\x1b\x3e\x46\xad\x2b\xa2\xd1\x37\xd5\xd7\x00\x17\xba\xad\xa2\xae"
+ "\x08\xed\x86\xf3\xc5\xab\x3f\x46\xa6\x9f\x03\xfa\xcd\x4d\x42\xd4"
+ "\x0d\xc5\xbf\xcf\x63\xef\x3c\x2a\x09\x29\x27\xd7\xd1\xcd\xe5\x75"
+ "\x5f\xa3\xf7\xe6\xa3\xe1\xa7\x93\x10\xc2\xb1\x66\xbc\xf2\x22\xec"
+ "\x95\x4f\xf2\xf0\xd9\x69\xe1\x95\x99\xf9\xb2\x89\x80\xcd\x4d\x2b"
+ "\x6c\xc0\x8b\x43\xac\xfb\x4c\x69\x00\x6c\x1a\xcc\xd8\x5c\x47\x29"
+ "\xcb\x30\x36\x3a\xce\x2b\xb3\xd8\xe4\xe1\x3a\x2f\xd1\xc2\x2b\xdf"
+ "\xb0\xc0\x86\x9d\xab\xca\xc3\xc6\xdc\x97\xf1\x7a\x00\xfe\x46\x6e"
+ "\xe3\x95\xe5\xf5\x65\x54\x8b\xce\x15\x61\xca\x11\x94\x91\x29\x50"
+ "\x8e\x92\x57\x32\xe5\x88\xc4\x7f\x60\x20\xf0\xbd\x10\x79\xea\xfa"
+ "\x84\x6f\x01\x0c\x5a\xa1\xac\xe1\xb6\x68\x3d\xbc\x27\xc6\x12\xe3"
+ "\x36\x65\x7f\x5b\xdb\x9c\x06\x44\x41\x9d\x75\x1e\x63\x67\xfc\xd9"
+ "\xd7\x2d\x0b\xda\xaa\x8a\x59\xdf\x03\x3e\xf5\xa8\x42\xcf\x62\xb3"
+ "\xf6\x7b\x74\x43\x71\x31\x9e\x7e\x2d\xa0\xdf\xc3\xc0\x53\x68\x7b"
+ "\xf0\x7a\x75\x2e\x50\xef\x15\xbe\xb7\x00\x69\x26\x27\xd2\xcd\xcc"
+ "\x58\x1e\x28\x63\xb8\x3d\xc3\xf5\x61\x79\xe2\x17\xc8\x98\x1b\x78"
+ "\xb4\xcd\x67\x9c\xee\xf4\x4a\x84\x70\x9d\x88\xb1\xe8\xb5\x8a\xc3"
+ "\x0e\xcf\xdb\xb3\xec\xeb\xb0\xa9\x0b\x17\x7d\x2d\x5c\xbe\x66\xe9"
+ "\x24\xf5\x77\xe4\xb1\xe5\x2b\x4f\x6e\x7f\x87\xb9\x3f\x0a\x30\xc4"
+ "\x73\xf5\xd6\x7f\x87\xa8\x9d\x92\x31\xfc\x8f\xe8\xfe\x27\xe2\x18"
+ "\x06\x29\x3b\xc6\xb0\x89\xc5\x30\x68\x5a\xc7\x18\xfe\xa0\xb6\xc5"
+ "\x30\x28\x84\xc3\xf0\xcb\x10\x0e\xc3\xa0\x70\x82\x61\xd0\x68\x0e"
+ "\xc3\x20\x4d\xc7\x18\x5a\x79\xe9\xdf\x14\x86\x3a\xfb\xfd\x1f\xc2"
+ "\x18\x3a\x50\x0e\x7f\x31\x63\xe8\x40\x39\xd4\xe9\x05\x30\xb4\x28"
+ "\x87\x5f\xa6\x5b\x60\xc8\x96\xc3\x20\x8b\x72\x18\xe4\x40\x39\xb4"
+ "\xf2\xd6\xbf\x29\x0c\x7f\x6c\x96\x8e\xa1\xda\x81\x72\xf8\x03\x8b"
+ "\xa1\xda\x81\x72\x78\xe9\xa8\x2d\x86\x6a\xcb\x72\xa8\xe3\x30\x54"
+ "\xb3\xe5\x50\x6d\x51\x0e\xd5\x0e\x94\x43\x2b\xad\xf2\x9b\xc2\xf0"
+ "\xbf\xa2\xfb\xbf\xdb\xc1\xd0\x81\x72\xf8\xb9\x19\x43\x07\xca\x61"
+ "\x4d\x92\x00\x86\x16\xe5\xb0\x44\x63\x81\x21\x5b\x0e\xd5\x16\xe5"
+ "\x50\xed\x40\x39\xb4\xf2\xde\xbf\x29\x0c\x2f\xdb\xef\xff\x17\xc4"
+ "\x30\xd8\x81\x72\xb8\x9e\xc5\x30\xd8\x81\x72\x78\x65\xac\x2d\x86"
+ "\xc1\x16\xe5\xb0\x44\xcb\x61\x18\xcc\x96\xc3\x60\x8b\x72\x18\xec"
+ "\x40\x39\xb4\xf2\xe2\xbf\x29\x0c\x7f\x12\xdd\xff\xca\x12\x43\xd0"
+ "\xd9\xb6\xba\xb4\x81\xc3\xd0\x12\x3f\x6b\x2d\x1a\x09\x1a\x15\x63"
+ "\x37\xcb\x80\x28\x5b\xfc\x7e\x32\x60\xfc\xd4\xf8\x7b\x5c\x23\xa7"
+ "\x49\x19\xec\xd8\xef\x39\x18\xb3\xd3\xe0\x42\xb1\x3e\x35\xeb\x51"
+ "\xfc\x4d\xb5\x5d\x8f\xc6\xfd\xff\xaa\x47\xaf\x22\xe9\xd8\xb1\xed"
+ "\xa0\x28\x76\xfc\xb6\x2f\x12\xda\x44\x71\xec\xae\x16\xd9\x62\xa7"
+ "\x0e\xe1\xb0\x23\xed\x1e\xc1\xee\x4b\x9d\xb9\xfd\x23\xd8\xb1\xed"
+ "\x9f\x5d\xec\x7e\xcb\xed\xdf\x35\xd1\xf6\xcf\xb8\x01\x51\xf9\x1b"
+ "\x4c\x85\x5a\xca\x54\x04\xbf\x62\xf8\x95\xc2\xb1\x5e\x70\x8c\x99"
+ "\x1f\x04\xff\x67\xce\x99\xfa\x31\x6b\x81\x15\x7b\xba\xc4\xe0\x3d"
+ "\x3d\x70\x9a\xde\xe6\x34\x9e\x69\x28\x74\x37\x9b\x07\x1c\x4f\x85"
+ "\xe3\xc5\xfd\x5d\x42\x7b\x43\xfa\x52\x3a\xeb\x6f\x38\x6d\x1f\x9c"
+ "\x96\x4e\x73\x25\x63\xe5\x28\x0a\xe7\x61\x7d\x4f\x37\x36\xcd\x60"
+ "\xcb\xfb\x7a\xa4\x85\xe2\x75\x40\xcc\x69\xfa\x9a\xa8\x1f\x0a\x70"
+ "\x3a\x93\x8b\x2b\x5e\x1f\x5b\x65\x99\x96\x9e\x80\x70\xbe\xe6\xb4"
+ "\xfd\xd8\xfc\x86\x5b\xa6\x31\xfe\x15\xa1\xfe\x2e\x2a\x26\xcf\xfe"
+ "\x89\x14\x7e\x27\x9c\xf6\x1e\xba\xff\x01\x15\x93\xde\xc5\x35\x80"
+ "\x97\xfe\x2d\xc4\xa4\x65\xd3\xb9\xd3\xbd\xff\x6f\x25\x9b\x8e\xd9"
+ "\xe3\x13\x8e\xb9\x5a\xc6\x8f\x4d\xe7\x61\x8e\x0d\x5e\x6f\xdc\xf2"
+ "\x5d\x8d\x1b\x28\x9c\x1f\x4e\xd3\xdf\xd4\xfb\x2b\x1d\xfb\x2e\xa3"
+ "\x2d\xef\x89\xd3\xc1\x75\x8f\xb0\x71\xf6\x84\x77\xd0\xb4\xe7\xa7"
+ "\xad\x4f\x37\xa7\x5b\x6f\x44\x83\x76\x73\xb1\x51\xd2\x59\x1f\xce"
+ "\xc2\x6b\x08\x5a\x63\xd7\xdf\xc5\x45\x87\xb1\xab\xa8\x43\x08\xa7"
+ "\xa5\xfb\x7f\xa8\x84\xf4\x5e\xec\x7b\x84\x92\xf7\x60\xd6\x5b\x21"
+ "\x58\x53\x86\x7b\x77\x31\xcf\xea\xa2\x62\x9f\x75\x00\xa4\x0b\x33"
+ "\xe7\x6b\xa2\x98\x7e\x0c\x36\xad\x2b\x93\xb6\x3c\x01\xaf\xa9\xdf"
+ "\x9e\xfe\x5e\x9c\xd6\x98\x75\x5c\x6d\x4c\x73\x0d\xb7\xce\xdf\xb8"
+ "\xc1\x0d\x9f\xb7\xcc\xdf\x9b\xa4\x3f\x14\x06\xe9\x27\xdb\xa6\x57"
+ "\x5a\xa7\xf7\x21\xe9\x3f\x0a\x85\xf4\x51\xb6\xe9\x0d\x03\xac\xd2"
+ "\x0f\x24\xe9\x8f\x8c\x85\xf4\xd3\x6c\xd3\xab\xac\xd3\xff\x8e\xa4"
+ "\xff\x87\x0a\xd2\x47\xdb\xa6\x0f\xb5\x4e\xef\x4b\xd2\x7f\xa2\x81"
+ "\xf4\xb3\x6c\xd3\xa7\x5a\xa7\x1f\x44\xd2\x1f\x1b\x0d\xe9\x63\xac"
+ "\xd3\xef\x66\xd2\xa2\x07\xd8\xb4\x7e\x24\xed\xdf\x43\x20\x6d\xac"
+ "\xc0\xbb\x2a\xd8\xbc\x43\xd8\xf4\xf7\x91\xf4\x1f\x1e\x85\xf4\xf1"
+ "\xb6\xe9\x5d\xad\xd3\x0f\x26\xe9\xbf\x9e\x06\xe9\x13\x04\xb0\xb2"
+ "\x4e\x3f\x84\xa4\xff\x2c\x0f\xd2\x27\x0a\x60\x65\x9d\x7e\x28\x49"
+ "\x5f\xac\x85\xf4\x2b\x05\x62\x6f\x9d\xfe\x7e\x92\xfe\x8b\x8d\x90"
+ "\x3e\x49\x20\xf6\xfc\xf4\x59\x25\x49\x90\x2e\x79\x17\xcb\x4d\xab"
+ "\xb8\x5b\xe7\x3d\x8c\xe4\xfd\x55\x02\x5c\x93\x6a\x9b\x1e\xb9\x90"
+ "\xf4\xe8\x51\x36\xfd\x03\x24\x7d\x69\x0c\xa4\xdf\x28\x10\xfb\x07"
+ "\x71\xfa\xdd\x24\xed\x83\x24\xed\x49\x6f\x48\x9b\x2e\x10\x77\xcb"
+ "\xb4\xc3\x49\xda\x2a\x04\x69\x33\x04\x62\x6e\x99\xd6\x9f\xa4\x3d"
+ "\x5b\x0a\x69\xb5\x02\xf1\xb6\x4c\xfb\x10\x49\x5b\x91\x0c\x69\x73"
+ "\x04\x9e\xf7\x01\x8b\xb4\x23\x48\xda\x73\x98\x57\xdb\x05\x70\xb1"
+ "\x4c\x1b\x40\xd2\x5e\x38\x08\x69\xf3\x04\x30\xb1\x4c\x3b\x92\xa4"
+ "\xfd\xb6\x06\xd2\xee\x11\xc0\xc4\x32\x6d\x20\x9d\x75\x7e\x3b\x5b"
+ "\x4f\x17\x58\xa7\xdd\xc5\xd5\xbb\x41\xa6\xfe\xff\x9c\xcc\xd6\x95"
+ "\xcc\xfa\x9e\xf4\x06\xbc\x96\x5d\xfb\x7b\x3d\x66\x6e\x23\x4c\x14"
+ "\x52\xd3\x59\x65\xa1\x70\x1d\xce\xf3\xa0\x6d\xdd\xe6\xfa\xd8\x2e"
+ "\xae\x8d\x08\xa6\xb3\x7e\xca\x60\xef\x5f\x68\x9b\xd6\xcd\x32\xed"
+ "\xc3\x74\x56\x75\x03\x9b\xf6\xa8\x6d\x5a\xa5\x65\xda\x51\x74\xd6"
+ "\x7f\x8a\xd8\xb4\x45\x02\xf5\xeb\xa3\x16\x69\x43\xe8\x2c\x5d\x32"
+ "\xa4\x3b\x21\x54\xbf\xd2\x1b\x54\x8f\xe2\xfa\xc0\x5c\x77\x43\xfa"
+ "\x47\x48\x7c\xaf\x86\x43\x7c\x99\x39\x7d\xe6\xb4\x80\xc3\xa3\x16"
+ "\x6d\xe5\xa3\xa6\xfe\x97\x42\xd9\x98\x95\xd8\x3e\x43\xaa\xe5\x33"
+ "\x3c\x46\xf2\xac\x71\x85\x3c\x4b\xad\x9f\x81\xad\x8f\xb0\x4e\xc0"
+ "\xf1\x1d\x6d\xcc\xba\x5c\x8a\xe3\x0b\x69\xcb\x78\x1a\x81\x72\x51"
+ "\xe0\x3c\x59\x6c\xc7\xd0\x59\xff\x8e\x66\x63\xc0\x6b\x8f\xa0\x3c"
+ "\x32\xf5\x21\xe0\x5b\x4a\xbf\xf5\xbb\x32\x48\xfb\x38\x9b\xee\xbc"
+ "\x75\x3b\xc8\x3e\xdf\x13\x70\xae\xaa\xbd\x0d\x74\x71\xad\x16\xd2"
+ "\x32\x89\x81\xe8\x9e\x6b\x8a\x06\xa2\x31\xda\xf7\xd5\x6a\x64\xea"
+ "\x1c\x53\x81\x5f\x4c\x64\x03\x6d\xb0\x3c\xb6\x95\xa2\x2b\x47\x35"
+ "\x20\x57\xbc\x06\x1f\xed\x13\xe6\xab\x83\xe3\x7a\xff\xfb\x42\x9a"
+ "\xb2\x1a\x86\xeb\x5c\xbe\x50\xe2\x35\x99\xe0\xdf\x21\x3a\xf4\x1a"
+ "\xb3\x1f\xca\xd6\x0d\x74\x33\xde\xa7\xc0\xf8\x4e\x7d\x54\x85\xa9"
+ "\x0e\xaf\xa5\xd8\x0c\x79\x34\x5f\x49\x44\x0a\xbc\xa7\x1c\x5e\xd7"
+ "\xb5\x22\xa9\x0e\x5d\x51\x34\xac\xa2\x97\xc6\x8f\x85\x67\xd0\xc2"
+ "\xfd\x62\x2f\xc1\xff\x49\x4c\x41\xfb\x6a\xeb\x13\x8a\x97\xe3\xf5"
+ "\xe9\x1a\x4e\xea\x7d\x22\xb4\xf4\x9b\x33\x6b\x13\x53\xd0\xfd\xf0"
+ "\xdc\x27\xcc\x6b\x51\x31\xeb\x4f\xfd\x12\xff\x34\x59\x7b\xaa\x71"
+ "\xa2\xc9\xab\x3e\xc1\x66\xed\xa9\x3d\xd3\x43\xc8\x7a\x56\x8d\x4c"
+ "\xde\xf0\x6c\x95\xf4\x70\xbf\x70\x53\xeb\xc6\x54\xbc\xff\x5b\x71"
+ "\xca\x35\x74\x89\x3d\x87\xf3\x64\xf3\xf2\xc1\x79\xe0\xbc\xcc\xf9"
+ "\xe0\xeb\xf4\xc3\xa6\x87\xe0\x77\x87\x38\x84\x3b\xbe\x7e\x55\xa3"
+ "\x2b\x5e\xbf\xca\xf1\xf4\x0d\x27\x70\x7a\xe1\x75\x79\x41\xe3\x64"
+ "\xd7\xa7\x37\x65\x35\xe6\x81\x56\x35\x90\xb8\x37\xee\xd7\xb9\x28"
+ "\x62\xd9\x7f\x1f\xd5\xb9\xf4\x66\xf1\x68\x2c\xd6\xb9\x1c\x4b\x64"
+ "\xff\x5d\x66\x5e\x2f\x4c\x30\x5f\x65\xfd\x2c\x88\xf7\x4a\xd3\x7b"
+ "\xd1\x6e\x58\x5b\x93\x75\x4b\xeb\x67\xa9\x86\xe2\xf5\x9c\x6f\x47"
+ "\xc1\x3d\x57\x92\xb8\xdc\x1e\x09\x7f\x3d\xd9\xbf\x7a\xf6\x2f\x8d"
+ "\xd3\x30\x5c\xf2\x9e\x18\x4e\x6b\x83\x34\x64\x2f\x98\xdb\xcc\x5a"
+ "\x65\x0c\x76\x80\x2f\xed\x15\xa4\x61\xf2\xcd\x8d\xd0\x5a\x3e\x03"
+ "\x36\x4b\x21\x8f\x3c\xfa\xd8\xe8\x31\x8f\x3f\xa1\x79\x72\xde\xfc"
+ "\x57\x62\xe3\x16\xbc\x1a\xbf\xf0\xff\xb1\xf7\x3e\x70\x51\x56\xd9"
+ "\xc3\xf8\x99\x3f\xc8\xa8\x28\x03\x91\xa1\x99\x8d\x86\x85\x25\x3a"
+ "\xb5\xb6\x6b\x2e\x26\x25\x16\x26\x08\x29\x15\x25\x0a\x24\x28\x24"
+ "\xea\x04\xa8\x68\x28\x38\x6a\xd9\xa6\x32\x10\x19\x26\x02\x16\xbb"
+ "\x6b\xad\xfb\xcd\xfd\x7e\xdd\x77\xdd\xf7\x63\xdb\x14\x64\xd4\x0a"
+ "\xc3\xee\xd7\x3e\x2f\xbb\xaf\xbb\x4d\x7e\xc9\x25\xbf\xa8\x53\x8c"
+ "\xce\x24\x33\x73\xdf\x73\xee\x7d\x1e\x66\xe6\x61\xb0\x7a\xb7\xf7"
+ "\xfd\xfe\x3e\xbf\xb7\xd1\x87\xe7\x79\xee\x3d\xf7\xdc\x73\xcf\x39"
+ "\xf7\xdc\x73\xef\x73\xff\x3c\xb3\xa6\x78\xed\xba\xf5\xa6\x67\x4b"
+ "\x4a\xcb\x36\x6c\xdc\x54\xbe\x79\x0b\xc1\x0d\xd2\x7b\x30\x59\xe5"
+ "\x54\x03\xca\xee\x41\xca\xe7\xb7\x3c\x6f\x0c\x13\x72\xbe\xda\xa2"
+ "\x35\x84\xf6\xe1\x6d\xa8\xf1\x74\x9e\x47\x9f\xc6\xa5\xa2\xf3\x45"
+ "\x50\xcf\x54\xb6\x86\x87\xad\x74\x86\x59\x8f\xe6\xaa\xb3\xd3\xf1"
+ "\xb0\x95\xce\xdc\x6b\x8d\xed\x85\xb8\x29\x74\xce\xd9\x55\x3b\xc5"
+ "\x37\xdd\x0e\x40\xab\x57\x42\xe1\x9c\xa2\x87\xd8\x97\xc7\x31\x47"
+ "\xdd\x38\xd6\x47\xf8\xeb\xf6\xb3\x5e\xc7\x73\x85\xb0\x0f\xdf\x51"
+ "\xd7\xf5\xe7\x35\xae\xdf\xb6\x4e\xe4\x67\x12\x4d\x6c\xdc\xcf\x7a"
+ "\x76\x8e\x63\x3d\x3b\xf6\xb3\xbe\xa6\x71\xcc\x1e\x57\x07\x11\xae"
+ "\x7d\xae\x42\xbb\xe6\x2a\x97\x4d\x35\xc6\xfb\xc6\x5e\xcd\xad\xc6"
+ "\xb8\x99\x1e\xd0\x34\xe1\x3b\x86\x39\x5b\x0d\x82\xee\xb7\xbf\x72"
+ "\x87\x21\xbe\x54\x36\x50\xac\xda\x87\xf9\x08\x99\xb8\xfe\xd2\x86"
+ "\xad\x3f\xe6\xe7\xb0\xb9\xcf\x81\x5d\xe3\xea\x6e\xba\xca\xf3\x8b"
+ "\xb4\xd5\xf7\x01\xe1\xfb\x97\x12\x77\x58\xe9\x04\xe6\x41\xd8\x13"
+ "\xbe\xe7\x8a\x55\x08\x53\x87\xb8\x9d\x81\xe5\x89\x5f\xb5\xb6\xcc"
+ "\xb0\x6e\x43\x71\xf1\xb4\x51\x10\xcf\xef\x10\x78\xfe\x5e\x19\xe2"
+ "\x83\x97\xf7\xb3\x36\x2c\xa7\x15\xcb\xdb\xde\x81\xbd\x05\xd4\x0f"
+ "\xc0\x32\x59\xce\x6b\xdc\x09\x18\x7e\x12\x9f\x4f\x22\xed\xed\xfc"
+ "\x3c\x2f\xed\xc8\x27\xd9\x3e\x57\x0f\xd2\xd9\x4e\x67\x14\xd0\x7e"
+ "\x8a\xfd\x9b\x32\x55\x58\xee\x3a\x84\x6b\x37\x4c\x80\xa9\x98\xee"
+ "\xb7\x48\x47\x0b\x3e\x13\x7c\x1e\xc9\x11\xe1\xdb\x78\xb9\xb4\x23"
+ "\x17\xd2\x3b\xf2\xca\x7a\x68\x1c\xdb\xe3\xda\xe7\xb6\xd0\x7e\xab"
+ "\xfc\x8c\x18\x7c\x47\xbe\xb4\x23\xac\xa5\xbf\x32\x53\x45\x67\x55"
+ "\x36\xf9\x71\xe6\x12\x4d\x44\x07\xf5\x5d\xff\x88\x9e\xa0\x6f\x20"
+ "\x0b\x12\xdc\xa0\xfa\x63\x0f\x40\xc3\x7e\xd6\x8c\x57\x03\x5e\xf5"
+ "\x1f\x63\xdc\x47\x78\xb5\x63\xf8\x69\xbc\x7f\x8c\xf7\x8f\x7a\xf8"
+ "\xb7\xd0\x58\xa2\xbb\xb4\x82\xf5\xce\xac\x87\xdb\xf8\x59\x98\xdb"
+ "\xe0\x89\x73\x5a\xdd\x31\xa2\x9d\xf6\x56\x66\x63\xbf\x8e\x0b\xde"
+ "\x03\xf6\x5a\x3d\x60\x3c\xde\x8f\xf2\x7b\xe0\xa5\xb9\xe6\x04\xcd"
+ "\x40\x8c\x78\x1e\xc8\xc6\xf7\x9d\xd2\x33\x5a\xc4\x81\x8a\x6f\xbc"
+ "\x94\xf8\x86\xbb\x34\x03\xbd\xdf\x1a\xf6\x5b\x5d\x23\xe3\xbe\x5d"
+ "\xbe\xde\x66\xd0\x60\x5d\xd6\x82\x31\x38\x0e\x74\x22\x0c\xdb\x2b"
+ "\xfe\xae\xb5\x8b\x7b\x58\x04\x5e\xc8\xa7\x11\x88\x7f\x44\x8a\x08"
+ "\x1b\x91\x89\xf7\x06\xbc\x8e\x04\xe7\x3f\x12\xd3\x8f\x4c\x24\x79"
+ "\x0e\xa0\xbd\x27\x59\xda\x35\x6e\x27\xc9\xa8\x5a\xe8\x96\x8a\xe6"
+ "\x3b\x60\x98\x03\x75\xab\x61\x50\x7f\x34\xd7\x3e\x0f\xd6\x9f\x6b"
+ "\x5d\x0a\xfd\xb1\x90\x3d\xc2\x74\x89\x4d\x42\x5f\x4e\xf6\x3f\x97"
+ "\x8f\xef\xd7\xce\x20\x9e\x93\x86\x15\x84\x63\x80\xf7\xc9\xaa\x2f"
+ "\x00\x8c\x29\x04\x2d\xd9\x97\x3e\xcd\xc0\x54\xd2\x59\xca\x5b\xca"
+ "\x57\xd0\x82\xf4\x61\x58\x33\xd1\xb7\x1e\xf1\xe2\x7b\x0b\xc2\x35"
+ "\xdb\xe0\x2b\x99\x36\x9e\xe6\x67\xcf\xa0\x3e\x4a\xf4\x12\x4e\x4a"
+ "\xc7\xfc\xe5\x72\x50\x1a\x29\xef\xbf\x60\xb8\x11\x6d\x14\x54\x7e"
+ "\x09\x1a\x9b\xc7\x0e\xa4\x93\x74\xb7\x79\x8c\x58\x97\x52\xc0\x47"
+ "\x6d\x5d\x2c\x18\xb1\xbe\x8d\x3c\xa7\x19\x38\x39\xa3\x02\x8c\x84"
+ "\x8f\x6c\xb8\x5d\x33\x50\xd5\x44\x75\x51\xe0\xfa\x13\xf0\xbd\x17"
+ "\xdd\x8e\x8f\x4d\xc0\xf3\x69\x24\x7a\x30\x3e\x20\xdf\x3a\x1b\xf6"
+ "\x82\xaa\xb7\x88\xb2\x62\x5e\x2d\x98\xfe\x18\x95\x9d\xf8\x89\xf1"
+ "\x27\xce\x6b\x3c\xb1\x14\x47\xe7\xab\x48\xe5\x69\xa1\xb5\x19\xc4"
+ "\x0f\x82\xa7\x33\x21\xc5\x9e\xb2\xee\xb9\x9c\x6f\x98\x9e\xe4\xc1"
+ "\x30\x0f\xc2\x51\xe9\x61\x1e\x86\xf6\xe8\x8d\x2d\x74\x8e\x80\xb7"
+ "\x26\x58\x3e\x1e\x53\xa0\x7c\x30\xdd\x31\x4c\xdf\x46\x6d\x30\xd9"
+ "\x13\xcc\x33\x92\xce\x40\xc3\x30\x8b\x6f\x1f\xe2\xd8\xe8\xe6\xe3"
+ "\x40\x88\x67\x3b\xd2\x62\x21\x3c\x48\x4f\x9b\x84\xeb\x24\xed\x37"
+ "\x19\x28\x6b\x09\x5f\x0b\xc9\x9c\xd7\xe7\x2d\xbc\x4c\x68\xbb\xbc"
+ "\x8f\x36\x8a\xb8\x13\x08\x73\x82\xa1\xc8\xd9\x73\x59\xd2\x59\x6b"
+ "\x3c\xee\x78\xe5\xd7\x5c\xbe\x6d\xe2\x9c\x42\xef\xb3\xa5\x5b\x59"
+ "\xaf\x9f\x6e\x6f\xbc\xbc\xaf\xba\x44\xf7\x71\xca\x8f\x6d\xca\xe6"
+ "\xed\x28\xe5\x41\xe9\x25\x7c\x5a\xc2\x27\xf3\x6a\x06\xd2\x21\xf8"
+ "\xe5\x99\x8d\xe1\x2d\xa4\x8b\x9c\x6f\x68\x47\xfb\x2b\x49\x17\xbd"
+ "\xd3\x31\xfd\xc9\x7d\xf4\xbe\x89\xde\x3d\x56\x6e\x63\x07\xe3\x3d"
+ "\x65\x14\x6f\xeb\x45\xb9\xad\x41\x5d\xf2\x01\xdc\x16\x03\x46\xa7"
+ "\x99\x97\xed\xa8\xf3\xb9\x64\x55\xab\x07\x80\xe8\x44\x1e\x9d\x40"
+ "\x5a\xcf\xa0\xed\x8f\x21\x5a\xd1\x5e\x1f\x67\x6f\x64\x01\xd1\x8c"
+ "\xf6\x4c\xa2\xcf\xb7\x40\x92\xfd\x71\x2a\x23\xf1\x73\x86\xb0\x7d"
+ "\x18\xc7\xbe\x20\xda\xfd\xe5\xf6\x19\x02\x79\xcc\xcb\x8d\x72\x20"
+ "\x79\x91\x5c\xfc\x38\xbd\xa4\xfb\x16\xc4\x75\x54\xbc\x0b\xdd\x20"
+ "\x5e\x5b\xc6\xb1\xd3\x04\xef\x87\x65\x4f\x52\xdc\x36\xcc\x7b\xa6"
+ "\x89\x9f\xef\xa6\xa2\xbd\xf1\x11\xef\x51\x3a\xef\x13\x71\xd0\x19"
+ "\x9c\x28\x73\xf6\x6b\xd2\x47\x7c\x3f\x2d\xd1\x7d\x14\xdb\xf3\xe9"
+ "\x78\x25\xfa\xeb\x3f\x3b\x14\xac\x5f\x3e\x65\xfd\x27\x79\x5b\x7c"
+ "\x95\x29\x20\x9d\x75\x6c\xb8\xa4\x61\xf7\x49\x6d\x87\x24\x6b\xb6"
+ "\xb7\x15\xeb\x8b\x1f\x07\x8b\x51\xc8\xfa\x04\xd7\xc7\x4d\xa9\x2a"
+ "\x2a\x33\xa6\x3d\x21\xf0\xf8\x78\x99\xb9\x3e\x99\xb9\x0e\x9c\x66"
+ "\x9b\xb0\x9c\x83\x7a\xe0\x33\x49\x72\x3e\xad\xe0\x89\x6c\xbb\x4e"
+ "\xd2\x39\x5d\x64\x93\xd0\xc7\xbd\xdf\x35\xe0\xb7\x4b\x24\x7b\x1f"
+ "\x97\x3d\x8b\x6d\x12\xed\xad\x64\xb7\x7c\x22\x7e\x5c\x90\x0e\x53"
+ "\x99\xd2\xb8\xfe\x12\x2d\x95\xd9\x44\xcb\x09\x4e\x47\xa5\x01\x30"
+ "\xae\x8d\xf2\x47\x5c\x19\x52\x7d\x95\x71\xc5\x11\xae\x1d\x68\xab"
+ "\x88\x26\xcc\xfb\x18\xb7\x7f\x0f\x51\xbb\x0c\x53\x25\xda\xdb\xdd"
+ "\x66\x4a\x3b\x10\xfb\xb5\x9a\xa7\x6d\x47\xb8\x3d\x6e\x71\xce\xc1"
+ "\x28\x4c\x7f\xc4\xf0\x34\xc1\x6b\x77\x92\x8d\x36\x3c\xc5\x9f\xd7"
+ "\x1a\x1e\x47\x5d\xbd\x00\x5a\xc4\xa7\x23\x1d\x95\xf5\xa2\x4f\xab"
+ "\x5d\x4e\x7d\x06\xe4\xf5\x51\xf4\x91\x8e\x10\xbf\x49\x97\xd1\x47"
+ "\x9a\xe5\xaa\x85\x3d\xb2\xde\x62\x3e\x0d\xc4\x7b\xe1\x63\xc0\x9f"
+ "\x50\x8f\x4f\x0c\xea\x16\xbe\x4b\x7c\x3c\x82\x7c\xd4\x61\x7e\x8f"
+ "\x4a\xe5\x3a\x82\xf0\x7a\x7c\x7f\x40\xa2\xbd\x5e\x82\xbf\x28\xcb"
+ "\x41\xaa\xab\xa7\xf7\x91\xfd\xe5\xfe\x87\x6a\xa7\x94\xb6\x45\xe4"
+ "\xa5\xda\x25\xc3\x92\x8f\xc8\xcf\x2c\xc3\x30\xb2\x83\x33\x51\xf6"
+ "\xdc\xf6\xd1\x59\xb8\x52\x18\xd5\x1d\x91\x87\x36\x81\xeb\x21\xfa"
+ "\x3d\x83\x7a\x54\xab\xca\x56\xd8\x27\xb2\xc5\x96\xce\x9d\xe2\x4c"
+ "\x08\xd2\x25\xb2\xa9\xd4\x37\x41\x7c\xb3\xa4\xfa\x23\xd1\xac\xfa"
+ "\x28\xd8\x4f\xd2\x8e\x47\x5d\x49\x08\xc0\x7d\x22\x54\x3b\xd7\x24"
+ "\x6c\x60\x83\x48\xa3\x1e\x29\x95\xed\xa8\x28\x9b\xf4\x4e\x7c\xdb"
+ "\x46\x7c\xd3\x74\x04\xf0\x11\xf9\xa6\xb9\x4f\x82\x3f\x41\xb6\x7c"
+ "\xb0\xbe\x6a\xd5\x1b\xe4\xba\x3c\xc4\x5e\x68\x35\xd3\xa8\x3e\xf8"
+ "\xe9\x52\x67\x28\xec\xc5\x89\x90\xf6\x42\xab\x36\x48\xe5\x6d\x56"
+ "\xd4\x8d\x16\x51\x37\xa4\xb6\x05\xe5\xd0\xe9\x94\xcf\xe6\x70\xcf"
+ "\x25\xfb\x49\x79\x07\xb6\x41\x8d\x82\xaf\xa2\x2e\x6b\x35\x37\x0e"
+ "\x95\x83\xba\x27\xb0\x3e\x93\xac\xc9\x26\x10\x0e\x92\x29\xf7\x2b"
+ "\x31\x4c\xc8\x55\x4d\xfe\xad\x25\xd0\x46\x23\x6c\x9d\x8f\x61\x7d"
+ "\xd1\xaa\x7b\x83\xea\xa2\x56\x9d\x29\xd5\x45\x39\xef\xdf\xa3\x8c"
+ "\x8c\xfe\x7c\x35\xd9\x8a\x7c\x49\x36\x6d\x7c\xef\x65\x2e\x1f\xcd"
+ "\xcf\xe5\x36\x8d\xe0\x31\x6d\x39\xa6\xb1\x28\xda\x47\x0b\xd1\x87"
+ "\x79\xe9\xb8\xcd\xda\xcf\x6d\x45\xb9\x8b\xd3\xa3\xa9\x6b\x92\xda"
+ "\x09\x0c\x33\x4a\x61\xb9\x52\x5b\x22\xeb\x4d\x98\x82\x26\x47\x48"
+ "\xff\x08\xf1\xcb\xfe\x11\xc7\x35\xc0\x71\x39\xa5\xf2\x51\x58\x82"
+ "\x08\x53\x9d\xa4\xb0\x7d\x82\x0f\x75\x6c\x13\x0f\xcb\x95\xda\x2b"
+ "\xaa\x5f\x6a\xbb\x16\xba\xa8\x8e\xd1\xbb\x5d\xab\x4d\x21\xfc\xb6"
+ "\xaa\x6b\xd4\x87\xa8\xc7\xb8\x62\xb2\x07\x64\x2f\x0c\xab\x84\xdd"
+ "\x30\x2c\xe6\xf7\x57\xc8\xee\x90\x1f\x42\xf1\x08\x97\x4d\xb6\x08"
+ "\xc3\xdf\x34\x3c\x82\x7e\xc1\x7f\xea\x10\xaf\x76\x8f\x94\xf6\x1d"
+ "\xee\x2b\xfc\x67\x8a\x46\x0e\x93\xd3\x61\x5d\x5f\x4b\xe9\x28\xbd"
+ "\x6c\xbf\xc8\x76\x79\xc8\x36\xf1\xfc\xc2\x54\x92\x8e\xf3\x7e\x83"
+ "\xec\x17\x0d\xa8\x03\x60\xe9\xbc\x02\x6e\xd3\xc2\x52\x85\x3d\x0b"
+ "\x9b\x4b\x69\xb9\xfc\xd0\x56\x6e\xfb\x9a\x7d\xd6\x54\x02\xda\xc6"
+ "\xaf\xb8\x8f\x95\x28\xe8\x0c\xab\x17\xe5\x08\xcb\xe3\xe5\x10\x36"
+ "\xd5\xc2\x69\x41\x98\xc6\x6b\x3c\x6e\x2b\x95\x85\xe2\xaa\x03\xe2"
+ "\xe8\xcc\x10\x8c\x3b\xc0\xe9\x52\xa4\xf3\x0d\x14\x0e\x81\x6f\x12"
+ "\x67\xdf\x92\x3e\x48\xb6\x77\x44\xac\x44\xe7\x27\xb2\xdd\x45\xbe"
+ "\xe4\x93\xed\xe5\x71\xab\x24\x98\xc5\xd2\x9d\xdb\xf7\x11\x61\x82"
+ "\xaf\xb1\x6a\x89\xdf\xc5\xa2\x1c\x23\xc6\xf3\x7e\xf6\x7f\x66\x21"
+ "\x6f\xc3\x3c\x32\x6f\x03\x9f\xa9\xfe\x60\xfe\x7a\x7a\xe7\x7a\x5f"
+ "\xc1\xfb\xb0\x0d\x04\x43\x34\xf1\x36\x42\xab\x75\x2a\x7d\xea\xf3"
+ "\x5a\x5d\x0d\xb5\x4b\xdc\x57\xd5\xea\x9e\x95\xc6\x80\xc0\x5a\xf2"
+ "\x3a\xb6\x0b\x23\x4e\xca\x36\x86\xb9\x52\x80\xf6\x2c\x47\x5a\xde"
+ "\xa1\x30\xda\xe3\x3e\x10\x86\xec\xd3\xdb\xd7\xec\x12\xce\x11\xf5"
+ "\xb2\xdd\x20\x5b\xd2\xe9\x3c\x27\x7c\x3a\x6d\x78\x4a\xa3\x64\x4b"
+ "\x2e\x69\xc3\x17\x06\xf9\x61\xf8\x1e\x6c\x33\x74\xcb\x95\x36\x03"
+ "\xfd\xe6\x9d\xae\xda\xf0\x89\x41\x7e\x00\x86\x5d\xdf\x76\x8c\x70"
+ "\x50\x1d\xa5\x33\x8b\xb8\x7d\x2a\xe1\x79\xfd\x46\xa6\x99\xec\x66"
+ "\xff\x73\xd2\xf8\x85\x56\x97\x46\xbe\x9a\x22\xbf\x3d\x41\xb6\x93"
+ "\xf2\x93\xf1\x69\x81\xce\xbd\x41\x3e\x7c\x45\x38\xb3\x25\x3b\xdf"
+ "\x1c\x64\x2b\xa5\x36\x8c\xec\x64\x50\x5b\x85\xef\xc1\x6d\x95\xee"
+ "\xbe\xa1\x36\x52\xa7\xfb\xf6\x6d\x55\xb8\x9d\xec\x96\x6c\x23\x83"
+ "\x6d\x81\x2e\xa2\x31\xd0\x97\xd5\x86\xd7\xc9\xbe\xac\xdf\x8e\x86"
+ "\xc7\x91\x8d\xc2\xfc\x4f\x48\x79\xef\xb4\x6b\xae\xee\x96\xf3\xb6"
+ "\xa3\x9c\x3b\x0d\xa8\x9b\xfb\x5c\x0e\x7c\x2e\x94\x7c\x40\x5e\x37"
+ "\xaf\xd1\xd9\x1f\xda\xb0\x63\xa8\x7f\xa3\x48\xcf\xac\xeb\xbe\x82"
+ "\x1e\x7f\x5b\xd1\xd6\xbf\x5e\xe6\xef\xc8\x1b\x03\xfd\xc2\x43\xfb"
+ "\xd9\x6e\xcc\xa7\x2f\xb0\x8c\x7b\x31\xac\x5a\x1a\x43\xe0\xbc\x25"
+ "\x5c\x5a\x9d\xb5\x69\x7f\x70\xd9\x44\x39\x74\x4e\x2a\x07\xf5\x89"
+ "\x30\xff\xe3\xe4\xf7\xd0\xb9\x65\x58\x6f\x66\x37\xc9\x3a\x8f\x7e"
+ "\xd1\xd7\xe6\x40\xff\xca\x5d\x47\xb6\x52\xea\x7b\xb6\xa3\xbf\x13"
+ "\x34\x26\x96\x36\x3f\xc3\x60\x2a\x29\x5a\x57\xb6\xea\x1e\x43\xd1"
+ "\xba\xa2\xb2\xa2\xbc\xe2\xa2\x2d\x79\x65\x45\xeb\xd7\x4d\x5f\x9b"
+ "\xb7\xba\x68\xa5\x61\x53\x5e\xa9\xc1\x58\x3e\xb5\x7c\x14\xf8\x41"
+ "\xe7\x18\xf2\x4a\x4b\x37\xac\x2d\xc8\x37\xac\x2b\x5a\x99\x50\x52"
+ "\x50\x5a\x50\x66\xc8\x2b\x59\xbf\x61\x5d\xbe\x61\x6a\xfe\x8c\xa9"
+ "\xc6\x1f\xe7\x8f\x0a\x1c\x43\x9b\xa2\x87\x3e\xdf\xd5\x2f\x7a\xab"
+ "\xaf\x82\x2e\x52\x65\x2a\x89\x2c\x2f\x5a\xc7\xc7\xed\xb4\xa3\x96"
+ "\xcf\xac\x03\x13\x9d\x39\x4e\xe7\xcc\xb2\xda\x91\x26\xbc\x6b\x09"
+ "\x0e\xcb\x69\x68\xa2\x73\xc7\xc7\xb1\x89\xae\xda\x51\x06\xbb\x76"
+ "\xac\x8e\x9f\x21\x8b\xe1\x58\xb6\x89\xec\xea\x47\xbd\xe8\xb3\x99"
+ "\x68\x7e\x76\xd3\x55\x88\xb1\x6c\x04\x2d\x5e\x11\x78\xe9\xe9\x4c"
+ "\x72\x4c\x93\x69\xd7\x8e\xe6\x63\x92\x76\xed\x28\xa7\x23\x2a\xbe"
+ "\x97\x59\xe2\xc5\xf9\xe3\xda\x51\x5f\xca\x63\xcd\xe9\xbb\x20\x9d"
+ "\xf4\xf3\x9c\x76\x94\x83\xcb\x0a\x75\x99\xc6\x5f\xfb\xff\xf0\x60"
+ "\x12\xfa\x83\x67\xad\x13\x78\xdc\x97\x4e\x35\x44\x20\x5d\xda\xd6"
+ "\x0a\x23\xbc\x8c\x79\x95\xc6\x32\x86\x79\x9c\x90\xc7\xd3\xe8\x9c"
+ "\x78\x2c\x4b\xb7\x54\x8e\x83\xbc\x1c\xfb\x59\x5c\x5d\x34\xd2\x57"
+ "\xcb\xe9\xe9\x91\xcb\x80\x74\x77\x23\x4d\x29\x74\x4e\x3c\xd1\x15"
+ "\x6a\xac\x8f\xc6\xbb\xce\x6b\x47\x27\xf8\x36\x22\xdf\x26\x89\x73"
+ "\x8f\xaa\x1b\x45\xfd\xc3\x72\xe5\x37\xe1\xf3\xbe\xaf\x20\x62\x2f"
+ "\x9d\xbd\x6d\xbe\x95\x75\x38\x3d\x60\x2b\xec\x86\xc8\xcd\xcc\xc1"
+ "\xfe\xdb\x17\xbd\xa2\x4c\xa3\xb3\xc8\x36\xfc\xdb\x33\xdd\x5a\x2a"
+ "\x13\xb6\x15\x11\x74\x8e\xf3\x30\x63\x8b\xda\x97\xc7\x31\x27\x3b"
+ "\x18\xe8\x73\x8d\x7e\x8f\x78\x42\xfe\x56\x3f\xb6\x53\xae\xda\xd1"
+ "\x47\x30\x6f\x90\x7c\x63\x27\x1b\xc8\x0e\xf0\xa5\x46\x93\x9e\x39"
+ "\x87\xc1\xad\x93\x71\xd3\x99\xde\x94\x46\xc8\x3f\x22\x01\xd3\x38"
+ "\xfc\xf8\x23\x74\x4a\xfc\x84\x13\x9f\x1d\x72\x3e\xbc\x1f\xae\x1d"
+ "\x4d\x3e\x81\x03\x75\xd9\x31\x4c\x7e\x71\xb5\xfb\xd9\x19\x1b\x86"
+ "\x57\x7f\x0d\x5a\x84\x3d\xd3\xb4\x9f\xe3\x2f\xb4\x6b\x47\x9e\x26"
+ "\xfc\x3b\xc6\x01\xec\x44\x98\xfe\xda\xd1\x40\xe3\xbb\x18\x87\xf5"
+ "\xdf\xe5\x56\x8e\x5b\x4b\xfa\x3c\x47\xa1\xcf\x49\xb5\xe4\x13\xd6"
+ "\x21\x7e\xd4\xa1\xea\x2b\x40\x7d\xed\xd3\x33\xea\x20\x9e\xf2\xc1"
+ "\xe7\x2e\x1a\x0f\x41\x9c\xdd\x72\x7e\x0c\xf5\x7f\x9f\x4f\x8c\xc1"
+ "\x48\xba\x35\xdd\x56\xde\x4b\xdf\x27\x58\x2b\xda\x77\xa2\x91\x74"
+ "\xcc\x55\x3b\x26\x42\xd6\x29\xd4\xf5\x33\x5c\xaf\x62\x20\x9e\xd5"
+ "\x46\x58\xe8\x8c\x6f\xd2\xab\x46\xd4\x27\xd2\x2b\x84\x9d\x2d\xeb"
+ "\x14\xea\x5a\x17\xc1\x21\x0d\xa3\x8e\x6d\x49\xd2\x92\x8d\xec\xd1"
+ "\x8e\xf9\x35\xe9\x18\x7b\x75\x51\x37\xbb\x69\x99\x38\x8b\x1d\xc3"
+ "\x6c\x6e\x21\x03\x3f\xdf\xc7\x54\x05\xf0\xbd\x0b\xf5\x78\x14\xf1"
+ "\x99\x8f\x55\x23\x3c\xd2\xd6\xc5\x7d\xf1\xad\x28\x03\xde\x56\x8d"
+ "\x29\xa6\xf4\x12\x0f\x4f\xfb\x79\x38\xa6\x3d\x14\x0f\x15\xbc\xe3"
+ "\xe7\x46\xb3\xda\x31\x67\xa8\xae\x60\x1a\x8f\x7c\x66\x74\x28\x59"
+ "\x62\x1e\x5a\x6d\x1d\xe8\x28\x8f\xb6\x18\x82\x1f\x3b\x5d\xce\xa3"
+ "\x1a\x79\xed\xa8\x2c\xbc\xae\x3e\xb7\x35\x03\xd0\x98\x38\xa5\x8f"
+ "\x8b\x21\xfe\x8e\x2d\xf6\xa7\x67\x4e\x65\xfa\xa9\x2b\x83\x68\xe5"
+ "\x17\xab\x1d\x5b\xf5\xb2\x74\xa6\x36\xa6\x3f\x7a\x3d\x7a\xe3\x0c"
+ "\xa2\x9d\xb4\x4e\x21\xfd\x1e\xfb\xb9\x0d\x3d\x03\x0a\x93\xde\xcf"
+ "\xf4\x63\xdb\xa3\x1c\xdf\x1f\xf6\x7b\x83\x36\x72\x6a\xd0\xf7\x06"
+ "\x6d\x64\xcc\x70\xdf\x1b\x82\xf3\x8d\xcc\xa3\x7c\x7d\x4d\x99\x2a"
+ "\x7f\xde\x91\xa9\xbe\x10\x79\xcb\xe9\x67\x34\x07\xf4\x67\xb4\x91"
+ "\xbf\x21\x1a\x3a\xb1\x9d\x62\x37\x67\xaa\x18\xe2\x69\xe3\xbe\x45"
+ "\xe4\x31\xe1\xbf\x90\x5f\x14\x69\x21\x18\x65\x39\x06\x7f\xba\x18"
+ "\xb2\x1d\xf0\x35\x7f\x09\x7b\x08\x68\x65\x12\x18\x0a\xe5\x68\x75"
+ "\x10\x30\xb0\x10\x2f\x11\x00\x93\x39\x3c\xc3\x9f\x08\x92\xde\x1d"
+ "\xfc\x45\x3b\x08\x3f\x18\xff\x4f\xfc\x46\x0a\x7a\x39\x3e\x37\xa8"
+ "\xa4\xfc\x76\x07\x40\x24\x5f\x27\x35\x03\x39\x49\xa8\x1f\x79\x99"
+ "\x55\x99\x61\x88\xef\x08\x07\x66\xcc\x23\xe1\x97\xdf\x59\xe0\x3b"
+ "\x85\x04\xbf\xe3\x4f\x93\x1d\x90\xc1\xad\x9a\x7c\x3e\xcd\x2a\xce"
+ "\x3e\x18\xa4\x6e\xd6\x07\x66\xa9\x87\xaa\x30\xfe\x10\x49\x7f\xdc"
+ "\x88\x2f\x1e\xe3\x27\xb7\x0f\x02\xdc\xe0\xdc\x1e\x00\xfe\x47\x41"
+ "\xfe\x6d\xb1\xd7\x29\xe3\x77\xfd\x4d\x0a\x78\xbe\x55\xdc\xa6\x74"
+ "\x7f\x8f\xf8\xaf\xff\x33\x74\x8d\x94\x1f\xfd\xea\x71\x5b\x6e\x28"
+ "\x50\x3f\xff\x6f\xb3\xca\x41\x81\x1a\xea\x8f\xbf\x23\x31\xf8\x3d"
+ "\xde\x1d\xfc\x7e\x57\xca\x3f\x4f\x38\xd6\x41\xfa\x53\x69\x8f\x02"
+ "\xb8\x33\x66\x30\x30\x52\x51\x65\x22\x2d\x8a\x2a\xe4\xff\x49\xd4"
+ "\x68\x90\x9e\x86\x80\x60\x6d\x68\xe8\xff\x33\xbf\x09\xdb\xa5\x0a"
+ "\x71\xab\x43\x3f\x24\x72\x9e\x22\x8c\xde\x47\x18\xa4\xb0\xbb\xdf"
+ "\x1b\x02\xcf\xc3\x0c\x01\xef\xaa\x24\xfc\xd3\x0c\x30\xb5\xf8\xfb"
+ "\xa0\xf5\x87\xdf\xff\x83\x3f\x15\xd5\x8f\x1f\x7e\xff\x87\x7e\x4c"
+ "\xb4\xe2\x68\x89\xf8\x8d\xfe\xb1\x41\x43\xc9\xa4\x08\x26\x05\x30"
+ "\xe9\xe1\x7b\x69\xc7\x7f\xf8\xfd\xf0\xfb\xe1\xf7\xc3\xef\x87\xdf"
+ "\x0f\xbf\x1f\x7e\xff\x3f\xf8\xa9\x78\x3f\x82\x49\xbf\xc1\xe7\xc1"
+ "\x78\xea\x06\x15\x36\x30\xb5\x0a\x58\x40\x44\xd5\xbd\xa0\xd2\xc1"
+ "\x08\xed\xf7\xe7\xe5\x19\x06\x09\xfa\x96\x09\xe8\xac\x81\xbb\xf1"
+ "\xfa\x11\x5e\x37\x07\x84\x4f\xf9\xbe\x28\xfa\xa7\x7f\x2a\x64\x9e"
+ "\x06\xfb\x85\x61\x30\x02\xc2\x41\x07\x23\x61\x14\x8c\x86\x08\x18"
+ "\x03\x63\xb1\xbf\xa9\x87\x28\x88\x86\x1b\x20\x06\x6e\x84\x71\x70"
+ "\x13\xc4\xc2\x78\x98\x80\x25\x99\x08\xb7\x60\xdf\xfe\x56\x64\xc8"
+ "\xe4\xd0\x65\xa9\x82\xa4\x58\xfc\x83\xff\x33\x20\x89\xbf\xe7\xfe"
+ "\x10\xfe\x7f\x35\xdc\x2a\x85\x77\x49\xe1\xf6\x1f\xc2\xff\xaf\x86"
+ "\x1b\xfe\x8b\xef\x93\xff\x4b\xef\x2a\x34\xd9\xc2\x6a\xab\x42\xda"
+ "\x4a\x65\xa8\x4a\xfa\x0d\xbe\xc3\x37\xa4\x1f\x82\x2f\x38\xbd\xf2"
+ "\x97\x84\xd7\x2c\xf1\x58\x09\x20\xc6\x79\x59\xe0\xcf\x33\x5c\x4a"
+ "\xf9\xb7\xbd\x07\x2f\x07\x5e\x08\xb9\x1d\x5b\x18\xf3\x68\xbc\x6e"
+ "\x94\xf1\x08\x18\x1d\x5e\x97\x30\xfe\xd3\x16\x00\xfb\x59\xbc\x30"
+ "\xdb\xcf\xca\x01\xce\x45\x00\x7c\x9e\x0a\xf0\x1f\x47\x01\xce\xf7"
+ "\xf9\x71\xf6\x57\xf9\xa9\xfb\xd2\x24\x9e\x0d\x78\x5d\x25\x44\x60"
+ "\x57\x0d\x0e\xef\x59\x17\x64\xa6\x18\xee\x9e\x31\x6b\xc6\xbd\x3f"
+ "\xca\x33\x24\x24\x18\xee\x31\xde\x7d\xf7\x4c\xe3\x8f\x67\xde\xfd"
+ "\x13\xc3\x3d\xf7\xcc\xb9\xdb\x38\xc7\x68\x34\xac\xdd\x5c\x52\x74"
+ "\xb7\x71\x75\x81\x61\x5d\x7e\x51\xa9\x61\x55\x51\xc9\xda\x4d\x79"
+ "\x25\x05\xdf\x54\xac\xef\xfa\x23\xf2\x6e\xf1\x01\x97\x40\x30\xb7"
+ "\xe7\x01\x2d\x23\xd6\xc6\x3b\x60\xa8\x78\xe2\xa5\x2b\xe4\x6f\xed"
+ "\x53\x8f\xff\x75\xea\xb2\xb1\xef\x3f\xb0\x7a\xea\xdc\xf9\x6f\x54"
+ "\x1f\x03\xb5\x11\xaf\x78\x13\xa8\x27\xe5\x83\x3a\xfa\x2c\xa8\xc3"
+ "\xba\x41\xfd\x8c\x05\xd4\x4f\xcf\x02\x75\x56\x04\xa8\x53\x0b\x41"
+ "\x3d\x2f\x65\x68\xd8\xe6\x24\x11\xf6\xab\x62\x50\x1f\x36\x80\xfa"
+ "\x95\x6c\x50\xbf\xe0\x16\x61\xef\x61\xd8\xef\x74\xdf\x2f\x33\xfe"
+ "\xe9\xdf\xb7\xf5\x23\x86\xfc\xec\x5c\xd7\x30\xbd\xb6\xe0\x4c\x88"
+ "\xc1\xd2\x1f\x7e\x3f\xfc\x7e\xf8\xfd\xf0\xfb\xe1\xf7\xc3\xef\x87"
+ "\xdf\xff\xc7\x7f\x0e\x15\xcc\xfa\x4a\xad\x85\xf7\x2d\x00\x2e\xb3"
+ "\x6e\xa2\x5d\x75\xdf\x2c\x9a\x5b\x02\xb4\x86\x0a\x74\x7c\xdf\x15"
+ "\x71\x69\xf1\x16\x86\x0d\xff\x08\xbc\xc2\x75\x81\x73\x54\x68\x0e"
+ "\x52\x6b\xac\x11\x34\xb1\x20\xe6\x4b\x99\x59\x97\x58\x6f\x7c\x0f"
+ "\xf4\x81\x8e\xef\x39\x40\xeb\x46\x11\x7f\xb9\x1d\xde\x6a\x96\xe7"
+ "\x57\xc9\x70\x34\xbf\x8a\xe6\x63\x21\xec\x5a\x82\x1d\x66\x3e\x8d"
+ "\x9e\xbd\x1a\xab\x9e\x7f\x08\x80\xd6\x9f\xbe\xbc\x9f\x39\xda\x2a"
+ "\x00\x5a\x5b\xc4\x3a\x54\x9a\x6b\x83\xf8\xbb\xed\xb0\xbb\x45\xcc"
+ "\xaf\x62\xce\x1d\x18\x8e\x61\x7d\x76\x78\xb1\x4e\xca\xb3\x4f\x0e"
+ "\xb7\xed\xbc\x0a\x6d\x06\xbe\xce\xc6\xd1\x66\xf0\x42\xf2\x64\x2a"
+ "\xff\xc8\x58\x84\x9d\x38\xdc\xdc\x1a\x79\x1e\x19\xe5\x2d\xc1\xa7"
+ "\x28\xf2\xc3\x32\x8e\xcc\x96\xf3\x1b\x06\x47\x04\xa5\x95\xf1\x20"
+ "\xed\x7d\x98\xc6\x22\xe3\x41\x7a\x64\x1a\x1d\xc9\x5b\x79\x1e\x47"
+ "\x43\xd1\x64\xf8\x20\x31\xac\xe0\xc7\x33\x7b\x12\xcf\xac\x8a\x33"
+ "\xdc\x78\xf7\x82\x82\xb8\x3b\x98\x31\x72\xfa\x4b\xc6\xd1\x49\x23"
+ "\x93\xc6\xce\x5c\x62\x54\xeb\xd5\x53\xd4\xc6\x68\xbd\xfa\xf6\xa7"
+ "\xe9\x6f\xd7\xa4\x78\x7e\x37\x68\x13\x77\xe6\xff\xd8\x10\x3e\xef"
+ "\x85\xe7\x37\x26\xfd\xee\x97\x0f\x25\x3d\xfc\x78\xe9\xb4\xf7\x8d"
+ "\xea\x1b\xfe\xfc\xd2\x3b\xf1\x5f\x11\xc4\xe4\x29\xf4\x37\xbb\x55"
+ "\x13\x33\xcd\x4c\x58\xba\xc6\x1b\xde\xa7\x90\x3b\xb5\x89\x65\xf9"
+ "\xf7\xce\x6c\xa1\x1c\x1f\x5b\x99\x60\xa6\x34\x0f\xa5\x89\x34\x02"
+ "\x62\xe6\xf1\xc0\xb8\x19\xff\x4a\xa9\x0d\x9c\x06\xd0\x0a\x5c\x83"
+ "\xb8\x6f\x12\x14\x8a\xd0\x29\x1d\xc6\x5b\xa4\xbc\x5f\xa7\xbf\x4f"
+ "\xbd\x31\x43\x8d\x18\xa2\x13\x1e\xa4\xd8\x99\x2e\xa3\xcb\xd0\x96"
+ "\xa8\x5d\x1d\x17\x1f\x7e\xf7\x2f\xf1\x29\x6e\x75\x9c\x5e\x8d\xcf"
+ "\x2f\x88\x67\xe2\x41\xfe\x4f\x04\x84\x5e\x3d\x35\x26\x31\x3f\xff"
+ "\xc7\x9f\x3a\xf3\x7f\xac\x57\x27\xb5\xe4\x27\x26\x8d\xdb\x53\x7c"
+ "\x57\x5c\x62\x5c\xfe\xbd\x7a\x35\xbf\xcf\x49\x9a\xfa\xb3\xa7\xf4"
+ "\xea\x3b\xde\x33\x46\xe9\x55\x1f\x36\xab\xe0\x03\xf5\xd2\xa3\x1f"
+ "\x68\x3e\xf9\xe4\x14\xdc\xb9\xf6\x94\xea\xce\xd4\x53\x6a\x55\xd4"
+ "\xa9\x88\x27\xe1\x43\x7d\x38\x7c\x18\x8b\x97\xe1\x61\x68\x57\x55"
+ "\x66\xb4\xab\x37\xe5\xb6\x6b\x2a\x3b\xdb\xb5\x4f\x40\x7b\x58\x4e"
+ "\x54\xfb\x88\x87\x1f\x6d\x0f\x7f\xe2\xb3\x76\xdd\x1d\xd0\x3e\x12"
+ "\xa0\x7d\x32\xa8\xdb\xa7\x40\x4c\xfb\x3d\x51\xcf\xb7\x3f\x3c\x49"
+ "\x6d\xbd\xa1\xff\x01\xeb\x04\xed\x43\xd6\x38\x3d\x58\xa7\x8e\x02"
+ "\xeb\xed\x11\x11\xd6\x3b\xf0\x9a\x06\xcd\x56\x23\xbe\x27\xc2\x44"
+ "\x6b\xd8\x96\x11\x00\x82\x96\x53\x06\x80\x53\x93\x61\xde\xa9\x29"
+ "\x78\xbf\x0d\xaf\x38\xbc\xa6\xe2\x75\x07\x5e\xd8\x7f\x39\x45\x7b"
+ "\x0b\x41\xfc\x88\xc4\xff\xf6\x5e\x5e\xde\xac\xbc\x7b\x33\xe7\x6b"
+ "\x34\x05\x71\x30\x1a\xb9\xa6\x4d\x8c\x9b\x1c\x36\x3b\xac\x20\xee"
+ "\x53\x67\x12\xfe\xd5\xab\x97\xff\xbb\x66\xc4\x4c\xd7\x6c\x57\xee"
+ "\xef\x3e\xf5\xc2\x28\xe4\x3f\x28\x75\xb8\xdf\x0c\x2a\x27\xd2\xe8"
+ "\x34\xf7\x3f\xe0\x32\x47\xe8\xed\x30\xb2\x50\xd6\x63\x11\xf7\xbe"
+ "\xde\x69\xae\x42\xfd\x8b\x98\x1e\x3a\x6e\x3b\xc5\xa5\x5c\x27\x5d"
+ "\x7e\xe8\x38\xd2\xe9\x88\x2a\x39\xae\x5f\xdd\x9a\x81\xef\xa8\xff"
+ "\xba\xd9\xc1\xb0\x56\x8d\xd3\xac\xda\x8e\x71\x47\x87\xe2\xb1\x22"
+ "\x9e\xe4\x9f\x61\x5c\x7b\x88\xb8\x47\x9c\xe6\x25\x94\x47\x8f\x22"
+ "\x0f\xa7\x9c\x07\xad\xef\x6e\xc4\xfa\x45\x76\xc7\x67\x1e\x79\x82"
+ "\xd2\xda\xdc\x0e\x68\xf1\xf5\xaa\xb4\xe5\xa7\x81\xf0\xb8\xcc\x63"
+ "\xe2\xe4\xf4\x04\x47\xfb\x11\xd0\xba\x3c\x3e\xff\x13\xc6\x3c\x46"
+ "\xf3\x3f\xf7\x21\x0e\xc3\x46\xd5\x4d\xe7\x20\xc2\x4b\x69\xec\x30"
+ "\xa6\xd0\xa9\xfe\x18\xf3\x1e\x93\x2b\xdb\x39\x0c\xe3\x73\xa8\x29"
+ "\x0f\x2c\x7b\x15\xc6\x55\x0c\xa5\xf9\xe3\x68\xc1\x97\x31\xf5\x72"
+ "\xdc\xf5\xe6\x14\x8a\x34\x8c\x39\xcd\x1f\xfb\x30\xcd\xe9\xa1\xf8"
+ "\x58\x95\xd3\xac\x7e\x1e\xe3\x7a\x43\xc4\x6d\x17\x79\x8d\xd5\x86"
+ "\x88\x33\x63\x9c\x1a\xe3\x0c\xc3\xc4\x69\x30\x2e\x31\x54\x5c\x5b"
+ "\x03\xc7\x99\x35\xc8\xf3\xb1\x63\x92\xf0\xbd\x50\xe6\xf9\x37\x97"
+ "\x87\xe4\x7d\x37\xf2\x7d\x6c\x83\x12\x3f\xe1\x76\xaa\x3b\x08\xdf"
+ "\x89\xa1\x79\x9f\x56\x39\xcd\x29\xa8\x0b\x63\xcf\x0c\x8d\xfb\xe3"
+ "\xcd\xc8\x07\xa2\xcb\x11\x22\x6e\x22\x96\x07\xed\x75\x64\x44\x08"
+ "\x9c\x23\x30\xce\x8e\x71\xf1\xdf\x20\x0f\x3d\xb7\xe1\xb4\xff\xc1"
+ "\x24\x08\x3b\x0f\xd1\x73\xa9\x3c\x42\x2f\x60\xc4\x79\x88\xea\xe8"
+ "\x17\x73\xe1\x1d\x86\x2d\xa0\xc1\xf7\xc3\xcc\x6c\xbd\x11\xe3\xfb"
+ "\x50\x9f\x74\xb6\xab\x1e\x38\x0f\x91\x7b\x10\x46\x43\x6b\x57\xa9"
+ "\x7d\xc2\x70\x8d\xcd\xed\xa1\xf5\x1b\xa8\x67\x91\xbf\xc1\xbb\x1a"
+ "\xd3\xf1\x75\x31\x4b\x1b\x20\x8e\x68\xe4\xf3\x57\xcd\x56\x15\xcd"
+ "\x07\xa5\xf6\xd0\xa9\x86\x3b\x9c\x5c\x67\x23\xb1\xfd\xd3\x35\x4b"
+ "\x73\x77\x89\x06\x2d\xa6\xdd\xaa\xd6\xf3\xb9\xe0\x0e\xc4\x45\x34"
+ "\x3c\xea\x33\x5b\xd5\x83\x78\xd4\xd6\xd1\x34\xaf\xb7\xdf\xac\x5e"
+ "\xe8\x54\x47\x32\x81\x47\x6f\x90\xf1\x10\x1c\xe6\xc5\xe7\xc7\xf7"
+ "\x9b\xb5\xb5\x01\x30\xc9\x81\x79\xcd\x74\x82\x86\x68\x3e\x07\xfa"
+ "\x06\xca\x4f\x2a\x23\x9f\x6b\x6b\xdb\xe8\x01\x1b\xfa\x17\xe7\x41"
+ "\x5f\x8e\x65\x35\xb4\xba\x69\x8d\xb3\x35\xaa\x69\x1b\x00\xaf\x17"
+ "\x6a\x30\x48\x38\xeb\x65\x9c\x84\x23\xa0\xac\xd1\x22\x7f\x2a\xab"
+ "\x0e\x24\xd8\xb6\x40\x1a\x09\x2f\x96\xeb\xa6\x46\x84\x6b\x43\xaf"
+ "\x45\x82\xe9\x95\x61\x02\x64\x30\x59\xa2\x8f\xf8\x43\x32\xcb\x96"
+ "\xeb\xa7\xcb\x1c\x85\xed\xff\xe8\x5e\x51\x6f\xfd\xe1\x12\x0d\xb1"
+ "\x82\x06\x15\xd2\xa0\xb2\x0a\xfc\x51\x29\x32\x7e\x3b\xe8\xdd\x81"
+ "\x34\x37\x72\x58\xfd\x48\x51\x4f\x39\x6c\x99\x1f\x36\x32\x08\x16"
+ "\x79\xa1\x16\x32\x00\xb5\x1d\xa2\xf2\x91\x1f\x1a\x84\x39\x86\xf2"
+ "\x36\xc8\x30\x52\xf9\x63\x31\x6e\x9e\x84\xaf\x2d\x00\x5f\x19\xe1"
+ "\xa3\xf9\xb0\xc2\xf6\x46\xd9\xfd\xb6\x0f\xda\xf1\xdd\x31\xd4\xbe"
+ "\x52\x7d\x8d\xd6\x21\x5c\x1c\x85\x9b\xa6\x80\xfe\x02\x44\x7d\xde"
+ "\xaf\xd6\xf4\x0a\x5e\x44\xa3\xfd\x1b\x33\xe8\xdb\xe0\xfb\x2c\x3b"
+ "\x18\xdc\x52\x7e\xf9\xc4\x1b\xbf\xbd\xa5\x3c\xa3\x33\xe5\x3c\xe5"
+ "\xf8\xc0\x3a\x93\x34\x72\x26\xfa\x27\x49\x6f\x25\x4d\x4c\x9a\x24"
+ "\xfb\x2e\x73\xdb\x56\xc5\xcd\x74\xce\x6d\x33\xdc\x6b\xfc\x79\x41"
+ "\xdc\x74\xde\xf6\xdf\x71\xce\x38\x05\x5b\xf7\x3f\xf3\xbf\xb5\x14"
+ "\x12\xc7\x43\x30\x9c\x9e\xa7\xd0\xb3\xe4\x2f\xe0\xd3\x63\x4b\x35"
+ "\xe1\x53\x4b\xe8\x49\x78\x0e\x49\xe3\x56\xac\xd4\x24\x4b\xcf\x63"
+ "\x45\xcc\x5d\xdc\xe7\x88\x7f\x90\x9e\x6f\xe7\xb8\x66\xb6\x50\xce"
+ "\x33\x5e\x32\xfe\xf4\xf1\x7f\xd3\x9c\x7a\x7e\x4d\x52\xc4\x1d\x66"
+ "\x82\x99\xbe\xc8\x78\x10\x43\x5a\x29\x64\xca\xeb\x9c\x82\xc0\x54"
+ "\xc7\x29\x95\x14\x3f\x71\xfa\x02\xe3\x2b\xcb\x96\xde\xf6\x67\x63"
+ "\xf4\x0d\xef\x67\xb7\x52\xfa\x1b\xa2\x83\x72\x9a\xe2\xa7\xea\xe9"
+ "\xea\x69\xbb\x7e\xf4\x73\x81\xe5\xf1\xa5\x9a\x3f\x27\x4d\x5a\x5f"
+ "\x42\xa1\xb7\x71\x5f\x8c\x7c\x95\x99\x57\x8c\x61\xcf\x3f\xfe\xe9"
+ "\x7f\x7f\xfc\x8d\xae\xa7\xa6\x61\x49\x6f\xa8\xed\x7a\xea\xf1\x37"
+ "\x3e\xfd\xef\x9a\x1d\x04\x79\x67\xbe\x31\xc6\x10\x36\x77\x43\xdb"
+ "\xa3\xd3\x38\x55\x37\xed\x89\xad\x1f\xdf\x32\xe1\xd8\xcd\x27\x27"
+ "\xb6\xdf\xf2\xef\x93\xfe\x7e\xeb\x17\x06\xe7\x64\x86\x7e\xc4\x03"
+ "\xc6\xc9\x83\x7e\x04\xa0\x1f\x71\x0e\xfd\x88\x4a\xf4\x23\x3a\x03"
+ "\xfd\x88\x8f\x46\xcd\xa9\x10\xbe\x84\x80\x17\xfe\xcf\xf4\x7f\x47"
+ "\xff\x67\x1d\xfa\x3f\xd3\x4f\x85\x3d\xf6\xc4\xa9\x88\x4c\xe1\xff"
+ "\x44\x45\x8e\xe0\x3e\xd0\x78\xbc\xa3\x1f\xf4\xe1\x64\xbc\xc7\xe3"
+ "\xfb\xb4\xe8\xf0\x60\x9f\x68\xc9\xd8\xf6\xb0\x6c\xf4\x89\x12\xd1"
+ "\x27\x4a\xca\x6b\xd7\x2d\x7c\xaf\x7d\xe4\xec\xa4\xf6\x51\x83\x7e"
+ "\xd1\x43\xed\xc9\xb1\x33\xdb\x17\x6a\xa1\xfd\x11\x10\xbe\xd1\x4e"
+ "\x30\x7e\xa4\x8d\x51\xfd\x31\x02\xb4\x7f\x1c\xdb\x3c\xea\x8f\x91"
+ "\x56\xeb\x1f\xf5\x78\x45\x41\xf3\x1f\xa3\x21\xfc\xfd\x07\x9a\xe1"
+ "\xfd\xf9\x95\xf6\x53\x5a\x18\x7b\x6a\x24\x5c\x39\x15\x85\xf7\xdc"
+ "\xfd\x70\xea\x05\xd0\x9e\x1a\xa5\xbd\xe2\x2f\x6f\xcc\xe7\xa7\x26"
+ "\x7f\x30\xf7\xd4\x94\xc4\x3f\x9c\xba\x2d\x79\xc9\xa9\xb8\x0f\x3e"
+ "\x38\x35\xd5\x3e\x29\xd0\x6f\xa2\x32\x03\xdc\xb5\x93\x3c\x58\xe4"
+ "\xf7\xbd\xf1\x23\x8c\x23\x76\x15\x70\x7f\xf0\xc7\x92\x5f\xf8\xe3"
+ "\xa4\x05\xcf\x3f\xfe\xf8\x4a\x8d\x3a\x69\x12\xf7\x2e\x25\x4f\xd3"
+ "\xef\x7d\x06\xfb\x9c\x73\xdb\xfc\x3e\x67\x9c\xd3\xef\x73\x1a\x46"
+ "\xcc\xdd\x18\xe4\x9f\x0d\x60\xd8\x99\xc4\x38\xc3\x54\x23\xf7\xcc"
+ "\xba\xc6\x2b\xbd\xb5\x19\x7b\x8d\x73\xe3\x74\xf7\x76\xa3\xcf\x16"
+ "\xbe\xfb\x85\x95\xbf\xa4\x0b\xbd\xb6\xaf\xf5\xea\xe7\x9f\xc9\x9b"
+ "\x9d\xb5\xe3\x4e\x94\xf9\x0d\xe4\x05\x87\xbf\xb0\xeb\xc4\x0b\x2f"
+ "\x3c\x7f\xe2\xd4\x53\x4b\xa7\xfd\x2b\x86\xbd\x1f\x57\x86\xfa\xf3"
+ "\x3f\xf2\xff\xc7\xcc\x2b\x89\x61\x2f\x3c\x71\xe2\xf9\x57\x57\xaf"
+ "\x6e\x23\x7d\x21\xd9\xca\x6d\x54\xbf\x39\x1a\x7d\x12\xd5\xef\x5c"
+ "\xe6\x1b\xd1\xff\x19\xdf\xae\x6c\xcb\x7e\xa8\x97\x3f\xd4\xcb\x1f"
+ "\xea\xe5\x7f\x45\xbd\x1c\x07\xa2\x5e\x8e\xdf\x13\xaa\x5e\x2e\x5c"
+ "\xfc\x50\xfa\x1c\xc3\x86\x95\x06\x53\xc9\xfa\xd5\x25\x79\x6b\x0d"
+ "\xc5\xeb\xf3\xf2\x0b\xf2\x47\xc1\x60\x44\xde\xca\xb2\xa2\x8d\x79"
+ "\x65\x05\x43\xd6\x3a\xc6\xca\x3e\xe9\x50\xdf\x7a\xbc\x7b\x78\xdf"
+ "\x7a\x42\x4c\xe8\x7e\x89\x0a\xdb\xf6\x09\xc6\x10\x71\x53\xa4\xb8"
+ "\xd4\x10\x71\x0f\x4a\x71\x85\x21\xfa\x80\x63\x44\x1f\x63\xc2\xce"
+ "\x50\x71\x18\xde\x20\xfb\x24\xd8\x4f\x53\xb7\x4d\xe9\x03\xf2\x49"
+ "\xce\xc3\x84\x0f\xb0\x4c\xbd\x18\x7f\x52\xf6\x65\xec\x30\x61\xa7"
+ "\xec\xa3\x49\xfd\x90\x78\xa7\x39\x09\xcb\x39\xc1\x1e\xa2\x8f\x72"
+ "\xa7\x94\xaf\xc7\xef\x1b\x2d\x36\xb8\xcc\x37\x47\x0c\xf5\x8d\xba"
+ "\x40\xf4\x21\x6f\x8e\x57\xc0\xce\x96\x61\xd1\x9f\xa4\x3d\x20\xfa"
+ "\x68\x8d\x5a\x1f\xdc\x7c\x92\x99\xc7\xd7\x93\x4f\x49\xfd\x48\xc2"
+ "\x23\xfa\x92\xdd\xbc\x2f\x89\x7d\xc5\x1e\x4c\x5b\x16\xd0\x9f\xec"
+ "\x41\xdf\x38\x9c\xfa\x93\xe7\xe1\xe6\xc3\xd4\xa7\xdc\xc7\x71\x5d"
+ "\x20\x5c\x69\x84\xcb\x0e\x37\x5b\xb9\xdf\x27\xd2\x1e\x0b\x18\x37"
+ "\xc3\x7e\xed\xcd\x7c\x2f\x51\xd9\x2f\xc4\xf8\x2e\xbb\x36\x65\xd0"
+ "\x57\x23\x5f\x50\x2a\x47\x95\x90\xc3\xcd\x21\xfa\x3f\x5d\xb5\xa2"
+ "\x1f\x38\x71\xb0\xff\x43\xf8\x7c\xe6\xf1\xbf\x69\xe4\x38\x27\xc6"
+ "\xc9\x38\x03\xf5\x72\xe5\xfa\x75\xab\x8a\x56\x6f\x28\x29\x30\x94"
+ "\xa6\xa6\x1a\xd6\xae\xcf\x2f\x98\x31\x63\xc6\xa8\x20\xfd\x8b\x10"
+ "\x3e\xed\xc7\x49\xa4\x87\xe4\xd7\x4a\x7a\x98\x84\x3e\xa7\xe4\x37"
+ "\x4f\xac\x0a\xee\x5f\x7c\x9c\x24\xf9\xb7\x7a\x84\x31\x4a\x30\x2d"
+ "\x41\x30\x88\x4f\xf2\x91\xc9\xcf\x1d\x2b\xc1\xb4\x2b\xf1\x60\x1c"
+ "\xef\x17\xd1\xba\xbb\x7e\x51\xbe\x3e\x05\x9e\x07\xa4\xfe\x0e\xea"
+ "\xfd\x08\xa9\x9f\x70\x8b\x5e\x81\xe7\x01\x7f\x7f\x43\x25\xc3\xcc"
+ "\x0a\xec\x9b\xe0\x7b\xb2\x2c\x13\xbf\x1f\xdf\xda\x2b\x70\xab\xf4"
+ "\x7e\xbf\xff\x96\x62\x45\x5f\x6a\x9c\x1f\x37\xe8\x25\x18\x4b\x30"
+ "\x8d\xad\x17\xa4\xb2\xea\x02\xf0\x1c\x0f\xc6\xd3\xfa\x9f\x12\x1e"
+ "\x4d\x00\x4c\xb7\x82\xc6\xde\xa1\x34\x5a\xc7\x0a\xdc\xcd\x98\xbf"
+ "\x5d\x2a\xdb\x24\x45\xf9\x11\x86\xe3\x8e\x41\x98\x89\x32\xcc\xac"
+ "\xc0\xbe\x14\xf5\xe7\xf8\x5a\x4c\x98\x94\x4a\xfa\x84\xd7\x08\xa4"
+ "\xfb\x1f\x01\x7d\xba\x70\x29\x9d\xb2\xfc\x63\xfa\xb1\xbf\xd0\x14"
+ "\xd4\x4f\x9b\xa4\x28\x3f\xf6\x0d\xa3\x65\x1e\x69\x65\x18\x65\xf9"
+ "\xed\x82\xc6\xa8\x28\x7f\xf9\x27\x75\x2b\xf0\x8c\x23\x9d\x22\x5c"
+ "\x01\x79\x79\x14\x78\xce\x49\x7c\x0c\xe0\xf5\xad\x06\x85\x3c\xfe"
+ "\x43\xa2\x27\x80\xd7\xb7\x26\x2b\xf0\x5c\xa6\xf8\xe0\x72\xdd\x5a"
+ "\xa8\xc0\x73\xd9\x5f\x2e\xd4\x63\x01\xb3\x47\xd1\x8f\x55\x33\xf3"
+ "\xfb\x63\x14\x78\x8e\xc9\x30\xfd\x23\x9e\x6f\x16\xb2\xbd\xb5\x4d"
+ "\xb6\x45\x42\xae\x13\x8d\x84\x1b\xc3\xcf\x06\xda\x02\xa4\xab\x77"
+ "\x28\x9f\x0c\xa0\xe4\x53\x00\x5d\x52\x5f\xdc\x10\xa7\x28\xdf\x05"
+ "\x89\x4f\xa3\x02\xf0\xa4\x28\xca\xf7\x9f\x12\x9e\xb0\x00\x18\x85"
+ "\xfc\x5b\xfb\x24\x3c\xda\x00\x18\xa5\xfe\x5f\x94\xf0\x04\xe6\x75"
+ "\xfc\x9b\xf9\x64\x08\xd2\x7f\xe2\x15\x86\xf5\x7d\xc3\x18\x94\x4e"
+ "\x7c\x3b\x98\x8c\xed\xdf\x1b\x7c\x5d\x2d\x8b\x5e\x91\x4c\x7b\x4a"
+ "\xa1\x8d\x4e\xe2\x63\x83\xd7\xc8\x4e\x4f\x2e\x6f\x42\x7b\x26\xca"
+ "\x00\x46\x61\xbb\x27\xf3\x7d\x1c\x31\x6d\x86\x1d\xc6\x96\x05\x7e"
+ "\x07\xb0\xc3\xe4\x3d\x52\x1c\x96\xff\xc6\x6e\x39\x8e\xc2\xc5\xf8"
+ "\xe2\x64\x6c\xff\xc6\x8b\xfd\x01\x60\x72\xb1\x04\x8b\x76\x7f\x62"
+ "\x4a\xa8\xf5\xcb\xc3\x7d\x7f\x29\x8d\x65\xbe\xca\xf1\xb4\x9e\x79"
+ "\x51\xbb\xcf\xcc\xc0\x56\xee\x06\xc3\x04\xa8\x3c\x07\x53\x74\xd4"
+ "\xc7\xdf\xb7\x05\x74\x95\x26\xe6\xa6\x3d\x68\x3b\x1d\x7d\x50\xe9"
+ "\x60\xbd\xb4\xcf\xeb\xb6\x2b\xa0\xb3\x79\xf8\x99\x75\xb1\x6d\x15"
+ "\x9f\x87\x5c\x93\xeb\x53\x33\xa8\x9c\x48\x69\x7b\xa0\xb3\xa1\x07"
+ "\x2a\x1b\x82\xd3\x56\xde\x02\xb1\x1d\xb4\x67\xac\x19\x22\x89\x0e"
+ "\xfa\x9e\xe2\x89\x5e\xd4\x5e\x71\x00\xb4\x95\xe8\x5d\x76\xe4\x5b"
+ "\x65\x5a\xba\x88\x96\x9d\x17\x40\xf7\xc6\x2a\xab\x7a\xc7\x05\xa2"
+ "\x77\x69\xfb\xdb\x5b\xdc\xea\xd6\xd8\x54\x68\x8d\x3d\x0b\x6d\xb1"
+ "\x73\xa1\xad\x3c\x19\xf6\x5d\x80\x88\x56\x77\x22\xb4\x69\x1f\x82"
+ "\xb6\xb8\x64\xb0\xf5\xe1\xb3\xc1\x8b\x30\x4e\xbe\xff\xd1\x79\x98"
+ "\x62\xad\x7b\x06\x74\x76\x81\x13\x79\x36\xe5\xb4\xbc\x97\x0f\xbd"
+ "\x87\x2a\x47\xe9\x78\x88\x45\xfa\x7a\x91\x96\xfb\xce\xc1\x6d\x61"
+ "\x71\xb1\x60\xa4\xf6\xd7\x56\xef\x01\x6d\x05\x8c\x1c\x46\x2f\x62"
+ "\xf8\x3e\xa0\xe8\x47\x35\xee\xc7\xb6\x1e\xef\xfd\xa8\x13\x2e\xf3"
+ "\x6d\x89\x98\xf7\x59\x69\xdc\xab\xaf\xf2\x30\xea\xd9\xa6\x2c\xda"
+ "\x17\x04\xdb\xe9\xdb\xb2\xe4\x38\xda\xdf\x94\xf6\x2d\x9d\x19\x03"
+ "\x7a\x9b\x27\x09\xde\xbd\xd6\x4b\x6b\xef\xfb\x68\x3f\x04\xc2\x87"
+ "\x6d\xbe\x86\xc6\x9f\x90\x9e\x69\xd8\xc6\xf7\xdd\x86\x70\x98\x1e"
+ "\xe5\xdf\xc5\xf7\x15\x66\x37\x2d\x73\xfa\x6e\x5a\x76\xc5\xf7\xea"
+ "\xb2\x7e\xf6\xea\xb2\xaf\xbc\xaf\x2e\xfb\xb2\x72\x33\xe8\xbc\x37"
+ "\x2d\x73\x74\x9a\xb8\x0c\xf4\x9d\xa6\x8b\xb4\x8e\x5e\x47\xe7\x55"
+ "\xae\x78\x16\x65\xef\xf9\x1b\x6c\x2d\x82\x58\x5f\xd4\x92\x2a\x9b"
+ "\xe7\x13\x58\x51\x01\x0c\x9f\x2d\xa1\xca\xd7\x1f\x9d\xa9\x93\xc7"
+ "\xd3\x5c\xe6\x38\xbd\x5d\xfb\x08\x5f\xf3\xef\x88\xca\xd6\xe1\x15"
+ "\x81\x97\x1e\xaf\x18\x16\x9d\x19\x83\xbc\xaa\x1c\xbb\x5d\x05\xb4"
+ "\x7f\xcf\x4c\x1f\xa8\x2e\x40\xdc\x74\xa4\x5f\x3f\x0c\xdf\x26\xfa"
+ "\x6a\x0f\x1a\xee\xa8\x82\x6d\xb4\xf7\x2f\xf9\x00\x54\xbf\xc8\x1f"
+ "\xc5\x7c\xca\xed\xda\x45\x5c\x56\x58\x47\x9c\x2c\xfa\xa0\x81\x7c"
+ "\x3a\xe7\x73\x85\x2a\xc7\x73\x85\xea\xfe\xe8\x83\xb7\x21\x4c\x03"
+ "\xc2\xcc\x96\x78\xd8\x4b\xb8\xb0\xde\x38\xc6\x78\x40\x83\x38\x4d"
+ "\xbf\xbb\xda\xad\x3d\xb4\x9f\x9d\x45\xb8\xb6\x41\x5c\x88\xbb\x8e"
+ "\xfb\x49\x71\xdd\x72\x18\xf9\x49\x7b\x11\x8e\xd2\xdb\xdc\x49\xf4"
+ "\xcd\xd0\x6e\x2b\xee\xa5\xfd\x2b\x46\xb1\x01\x91\x1f\xf9\x70\x54"
+ "\x57\xc7\xb8\x61\x84\xcb\x0c\x19\x84\x9b\xd2\xd1\x99\x1d\x98\xee"
+ "\x36\x56\x59\x88\xfe\x22\x2c\x76\xb1\x42\x15\xed\x65\xdb\x8a\xe9"
+ "\x45\xde\x53\x93\x64\x1a\x29\x0f\xbe\x97\x2d\xd1\x89\xfa\xd0\x5a"
+ "\xec\x86\x31\xf5\x34\x4e\x0e\x4b\x09\x1f\xe1\x42\x3d\xb0\x63\x59"
+ "\x6f\x6b\x2d\x76\x80\x8f\x05\xe1\xb4\x4b\xf8\x2c\x41\xf8\x30\x9c"
+ "\x21\x3e\xd2\xbf\x36\x4c\x33\xa6\x99\xe3\x5b\xf2\x3b\x1f\xe1\x73"
+ "\x83\xd6\xc0\xe9\x7d\x9c\x70\xf0\x7d\xa1\x11\xa7\x75\xe3\x83\xe8"
+ "\x3b\x4e\x75\x3b\x2a\x0b\x35\x7c\xdd\x3c\xa6\x7f\x7b\x5b\x6f\x18"
+ "\xeb\xcf\xd2\x8c\xe5\x6b\xe6\x1f\x04\xfa\xd6\x8a\x30\x7f\x61\xfd"
+ "\x85\x9a\x31\x7d\xe8\xeb\x21\x0c\xed\xa3\x45\x74\x06\xca\x72\xc9"
+ "\x82\xc7\xe7\xc2\xe3\xc9\x0b\x93\xe7\x42\xda\x03\xf3\xe7\x82\xf1"
+ "\xbe\x04\xe3\xac\x1f\xfd\xe4\x47\xfc\xe1\x47\x3f\x99\xfd\x23\xc8"
+ "\x78\x62\xc9\x5c\xc8\x58\x3c\x17\x96\xe2\x95\xb1\x74\xc1\x92\xe4"
+ "\x05\x4b\xe7\x42\xd6\x43\x0b\xf1\x6d\xfe\xdc\xbb\x8d\x0f\x27\x64"
+ "\xcc\x5f\xb8\x00\x1e\xcd\xbc\xc7\x78\xcf\x3d\xf0\xc0\x82\xd4\xbb"
+ "\x8d\x46\xe9\x7e\xb7\x91\x40\x9e\x9a\xbd\x60\x69\x42\x46\xc9\xfa"
+ "\xb2\xf5\x09\x8b\x17\xce\xa7\x10\x58\xb0\x60\x6e\x46\x90\x1f\x19"
+ "\xef\xbd\xea\x25\x7e\x3b\xd9\xe5\x14\xda\xbf\x18\x1a\x51\x0f\xf0"
+ "\xea\xe3\xfb\x22\xc1\x1d\x7f\x6a\x24\xf9\xf1\xb6\xe0\xf6\x18\x6a"
+ "\x4f\x5d\xe6\xdb\x49\xfe\xe5\xc4\x47\xda\x43\xf8\x3c\xcc\x98\x8b"
+ "\x71\xe3\x25\x7f\x24\x0c\xe3\xdd\xc1\xf1\xd3\xb2\x31\xfe\x56\xda"
+ "\x67\xc7\x86\x17\xf2\xde\x89\xf6\x10\x79\xec\x80\xfe\xca\xac\x30"
+ "\xbe\xcf\x21\xca\x9d\xf6\x9f\x70\x99\xef\x98\x15\x50\xef\x7b\x68"
+ "\x9f\x0a\x1a\x4f\xbe\x04\x77\x8c\xe9\x2c\x4b\xa2\xbd\xa8\xc0\x56"
+ "\x26\xe1\xb8\x32\x88\x63\x94\xb4\x57\xa2\xbd\x91\xf6\x00\x11\x78"
+ "\x2a\x02\x6c\x84\x9d\xf0\xec\xc3\x38\x09\xd7\xa3\x9d\x68\x2b\xd0"
+ "\x96\xff\xd9\x57\x19\x0f\x2c\x7a\x51\x97\x6f\x20\x1e\xc4\xf8\xeb"
+ "\x1d\xc7\x03\x74\xdb\xd9\x56\x8e\x70\x6f\xa4\xa8\x68\x3f\x06\xbe"
+ "\x37\x03\xdc\x6e\x45\x1d\x77\x7a\x6b\xb3\xc7\xb3\xcb\x7c\x3f\xc4"
+ "\x11\x58\xbe\x04\x2c\x5f\x9c\xaf\x36\x3b\x96\xef\x2d\xca\xe1\xe2"
+ "\x63\x18\xbd\x47\x23\xdc\xc0\x60\xd8\x8d\x14\xe6\xa2\xef\x3b\xb4"
+ "\x5f\x37\xe3\xe1\x1a\x0c\xff\x04\xed\x5a\x37\xc2\xc6\x12\xec\x4c"
+ "\x0f\x84\xf3\x7d\x50\x2a\x55\x70\x0e\xe2\xb3\x7d\xd1\xd9\x13\x02"
+ "\xf2\x23\x3c\xd9\xa2\x1d\x43\x59\x5c\x46\x3c\xfd\x3c\x5c\x8d\xe1"
+ "\xbf\x47\xfc\x37\x93\xbd\x14\x36\x7c\x06\xdf\x6b\x4a\x1a\x93\xf7"
+ "\xbf\xd3\x3e\xcf\xdb\xc4\x7b\x2b\xf2\x92\xbe\x13\xd0\x37\x7e\x97"
+ "\x39\x1e\xfd\x9f\xb8\x14\xd1\x56\xce\xe0\x79\xd0\xbe\xb2\x4c\xff"
+ "\xf7\x0c\xc4\x3b\xd1\xba\xa5\x8f\x9f\xd3\x6a\x87\xf8\x62\x5f\x65"
+ "\x21\x28\x68\x8a\x27\xfa\xc9\x86\x20\x2f\x12\x50\x0f\x46\xba\xcc"
+ "\xd3\x40\xa1\x07\x13\x11\xcf\x78\xa4\xaf\x1b\xcb\x34\x1e\xf1\xc4"
+ "\xf9\xfa\x0b\x31\x5f\xec\x2f\xb2\x42\xf4\x95\xfc\x38\xa4\xf4\x49"
+ "\xc1\xe9\xef\xe8\xa1\x74\x08\x1f\xe6\xea\x27\xf8\x3b\x7a\x89\xe7"
+ "\x92\xde\xa1\x5e\x4e\x33\x29\xf4\x72\x32\xd2\xf2\xe3\x80\x78\x8b"
+ "\x22\x3e\x0c\xe3\x7f\x2a\xc5\x63\xdd\x9f\x76\x4c\x41\xef\x69\x8c"
+ "\x9f\x87\xf4\x3a\xb1\x6e\x6b\x30\xbf\x96\x46\xc9\x37\x91\xe0\xed"
+ "\x0a\x78\x0f\xc2\xcf\x27\xbd\xa1\x76\x87\xe0\x9b\xa4\xba\x83\xf0"
+ "\x3a\x97\xf9\x4e\x7d\x30\x7c\xc2\xe7\x08\x9f\xea\xa7\xef\x4e\x63"
+ "\x70\xfc\x9d\x6e\x8c\x7f\x94\x74\x1d\xef\xcb\xc9\xd7\x27\x7b\x42"
+ "\xb6\xac\xb5\x98\xe4\x75\x67\xae\x02\xbe\x0a\xe1\xf2\x25\x1e\xa9"
+ "\x25\x1e\xb5\x48\x7d\xf7\xb3\x12\x0d\x75\x8a\x34\xc7\x31\x4d\x31"
+ "\xf2\x71\xbc\xac\x97\x21\xd2\xb4\x2b\xd2\xf4\x92\x1c\x99\xc8\x47"
+ "\xeb\x1a\xf0\xa7\x91\xec\x64\x20\x0e\x2a\xdb\x68\x97\xf9\xae\x08"
+ "\x45\xd9\x93\x31\xdf\xb2\xbd\xc2\xee\x8c\x46\x1d\xba\x07\xc3\xee"
+ "\x45\x9c\xb7\x50\x1d\xd8\x47\xfe\xa0\xc3\x0d\xac\x32\x25\x42\xe8"
+ "\xee\x5d\x6b\xc7\x7a\x80\x9e\x13\xe8\x99\x70\x33\x57\xaa\x54\x27"
+ "\xef\x5a\x8b\x77\x0a\xe7\xe7\xcb\x90\x1d\x66\xae\x45\x3e\x81\xf3"
+ "\xae\x1a\x3a\x1b\x0c\xdf\xbd\x52\x1e\x09\xb4\x77\x28\xd2\x3f\x01"
+ "\xdb\x1d\x60\x9b\x10\x6e\x0b\xcc\xc7\xf0\x5b\x78\x5d\x15\x70\xfc"
+ "\x5d\xe4\x91\x42\xfa\x3d\x0b\xdf\x6f\x94\xd2\x8f\x21\x7c\xf8\x7c"
+ "\xb7\xf4\xac\xf2\x12\xae\xcb\x72\x1d\x4c\x08\xe3\xe9\xb0\x1e\x72"
+ "\xfc\x98\x9e\xf6\x69\x15\x38\xa7\x7f\x89\xf7\x85\x78\xff\x1b\xde"
+ "\x1f\xc5\xfb\xef\x69\xdf\xd4\x4a\x2f\xaf\x8f\xf4\xfe\x73\xbc\x2f"
+ "\xc1\x7b\x0d\xde\x97\xe2\x7d\x2b\xde\x1f\xc4\xfb\x93\x54\x2f\x68"
+ "\x0f\x78\xda\xcb\x06\xdb\x56\xa1\x5b\xf4\xed\xcf\x95\x42\x3c\x58"
+ "\x80\x30\xc9\xbc\xbe\x0a\xfb\xa2\x13\x72\x9c\xce\xf7\x9a\x46\x7d"
+ "\xa0\xb0\x70\xa1\x0f\x22\xcc\x2b\xdb\xa1\xcb\xfe\x30\xc9\x36\x49"
+ "\x75\x51\x0a\x13\xf8\x33\x10\xff\x44\xa2\x95\x09\x5c\x61\x42\xe6"
+ "\x12\x7e\x91\x4e\x1b\x22\x4f\x55\x60\x9e\x76\xb8\xcb\x41\xfb\x20"
+ "\xe1\xfd\x2c\xdf\x67\x12\x12\x22\x18\xd7\x7b\x6c\x67\x39\xbe\xbb"
+ "\x4e\x48\x70\x16\xe2\x31\x4f\x2f\xc2\xa7\x07\xe8\x52\xb4\xcb\x9c"
+ "\x90\xa5\xd0\x25\xf4\xf5\x6f\x7f\x9e\x74\x86\xf8\x4e\x65\x1b\x6b"
+ "\xe2\x6d\x39\x2f\x0b\xc7\x7f\x59\xe8\x64\xa3\x34\x37\x49\xd4\xdf"
+ "\x84\x66\x05\x9e\x93\x88\xe7\x67\x8a\xfa\xde\xe7\x6f\xd7\x12\xba"
+ "\x14\xf6\xa8\x05\xf3\xc3\x7e\xe5\x9d\xbd\x92\x5d\x75\x6a\x2a\xa8"
+ "\xbe\x24\xb8\xed\x70\x81\xef\xd7\x84\xf1\x93\x08\x8f\xb3\x92\xef"
+ "\xdf\xef\xd4\x98\xa8\xbc\x33\x62\xe5\x78\x1e\x17\x75\xb0\x99\xea"
+ "\x81\xa6\x98\xc7\x61\xfb\x77\x9b\x5e\x8e\x03\xb1\x2f\x9c\x53\x53"
+ "\xc6\xe3\x32\xfc\x78\x17\x39\x24\xbc\x9a\x90\xe7\x2f\x58\x16\xd9"
+ "\x13\x00\xd4\x77\x56\x41\x98\xcd\x73\x06\xd2\x3d\xcc\x9b\x50\x05"
+ "\x23\x6d\x9e\xa3\x30\x0d\x20\xca\xe6\x39\x0b\x77\x02\x4c\xb6\x79"
+ "\xea\xd0\x5f\x69\xa1\xf8\x77\xef\x00\x95\x0a\xef\x95\xb7\x57\xa9"
+ "\x55\x36\x4f\x19\xc4\x55\x69\xf1\x5e\x0c\x0f\x85\x31\x97\xcd\x93"
+ "\x8a\x70\xf9\x90\xee\x65\x97\x93\xc3\xd8\xa7\x39\x5e\xd0\xa7\xee"
+ "\x62\x95\x36\x0f\xf6\x1d\x3c\xa7\x31\xdc\xc7\xd2\xbd\x5f\xe3\xe5"
+ "\x62\x3e\xcb\x22\x47\xba\xf7\x32\x9b\xbf\xeb\x5d\x7c\xff\x94\xa1"
+ "\x2c\x99\xcd\x93\x08\x9d\x4e\x27\xc2\x55\x32\x56\xb3\xc8\xbe\xe2"
+ "\x8a\x1a\x06\xe8\xbc\x84\x9a\x45\x0e\x56\x9b\x0a\x03\x58\x0e\x6c"
+ "\x87\xd9\xc0\x73\x78\xaf\x5d\xe4\xe3\xef\x96\x54\x3d\xd3\xa7\xc2"
+ "\x0c\xec\x88\x51\x19\x6c\x9e\x1e\xc8\xc1\xae\x44\xfa\x66\x07\x23"
+ "\xfa\xc7\x6e\xa7\x7e\x58\x22\xed\xb5\x1c\x99\xbe\xb9\x92\x61\x9c"
+ "\x8e\x45\x11\x9d\x7d\xc0\x6a\x30\x6d\x74\xea\x18\x8e\xcf\x92\x6a"
+ "\x44\x58\x07\xc1\x05\xe2\x21\x1c\x04\x9b\xee\xa5\x33\x30\x52\x8d"
+ "\x03\x51\xa9\x06\xbc\x92\xf0\x32\x61\x5a\x33\x33\xc7\xbc\x47\xfb"
+ "\x65\x62\x7a\x0b\xbe\x37\xbb\xe9\x6c\x07\xe2\xa5\x17\xc2\x11\xde"
+ "\x82\x7a\x95\x8c\xfa\x89\xf4\xa6\x5a\x39\xbd\xb5\xa9\xef\xba\x79"
+ "\x39\x52\xff\x20\xca\x91\xfa\x0e\x85\xf7\xa3\xee\xe0\xb3\xbd\x5f"
+ "\xc4\x7d\x8a\xe9\x32\x79\x3a\x4b\xaa\x1d\xcb\xe7\x70\x63\x3d\x44"
+ "\xbe\x56\x11\x1f\x91\xaf\x55\xc4\x4b\xc4\x6f\xb7\x95\xef\x01\x2c"
+ "\x8f\x63\x20\x2a\x0d\x7d\x95\xb4\xe8\x01\xee\xab\xa4\x19\xdc\x1c"
+ "\x77\xda\xad\x88\x27\x1b\xf5\x5b\xc3\xf4\x69\x06\x66\x49\x33\x0e"
+ "\x98\x0d\x90\xbe\x99\xb9\xd3\x3d\xdb\x3d\x39\x9b\x41\x33\x1d\xaa"
+ "\x54\x74\xde\x9e\xad\x3c\x1f\xcb\xd9\x86\xf7\x64\x8c\x87\x1b\x30"
+ "\xaf\x77\x59\x54\x9a\x81\xf2\x63\x35\x69\x46\xc4\x99\x80\xb8\xf2"
+ "\x89\xa6\xaf\xe9\x2c\xb3\xe8\xb4\xa4\xaf\x39\x7d\x69\xb9\x3e\x4b"
+ "\x5a\x95\x4f\x9f\x66\x92\x75\x88\xf4\x47\xf0\xad\x0e\x16\x3b\x99"
+ "\xc7\xe6\x39\x84\xad\x0e\xf6\x91\x9c\x67\x29\x1e\xfb\x4a\x47\x51"
+ "\xce\xa4\x53\x65\x78\x6f\x01\xd2\x9f\x4e\xd3\x2e\x82\x7d\x97\x74"
+ "\x68\xb1\xc9\xb9\x3d\x01\x4c\x2a\x7c\xaf\xcc\xf1\xe8\x60\x85\x49"
+ "\x5b\xe5\xb5\xa4\x65\x74\x9a\x48\x2e\x67\x30\x0d\xa5\x2b\x86\x48"
+ "\x15\xf6\x17\x54\xcc\x13\x59\xee\xd0\x8e\x29\xac\x64\x9d\xce\x54"
+ "\x84\x35\xf1\xf3\x03\x49\x8f\x08\x3e\xad\x8f\xd9\xbd\xfa\xc5\xbc"
+ "\x6c\x6c\x6c\x15\x74\xf4\xdd\x0b\xd4\x67\xeb\xe8\x6b\x21\x3d\xf5"
+ "\x21\x5f\xba\x50\x47\x07\xd2\xfa\xaa\xc2\x56\x5c\x01\x15\x86\x79"
+ "\x3b\x0a\x8f\x62\x7c\x1b\xc2\x9d\xe6\x7a\xbb\xf8\x8a\x27\xd2\xa3"
+ "\x4f\x4b\xf2\x58\xd2\xec\x8b\xaf\x0c\xb0\x8e\xc2\x3a\x58\xde\x57"
+ "\x85\xbc\x3a\x0a\x69\x17\x3d\x9a\x4e\x53\x3e\xc2\xb8\x30\xbc\x85"
+ "\xeb\x7f\xda\xc5\x7e\xb6\xf8\x59\x76\x79\xf1\x95\x4f\x59\x5a\x21"
+ "\x7b\x37\xa7\x1c\xc6\x8e\xde\xce\x7c\x54\x2f\x4e\xf7\x1c\x85\xd1"
+ "\x67\x69\x2f\xfd\x64\x48\xcd\xf3\xb1\xb4\x8b\x97\xd9\x8a\x67\x89"
+ "\x37\x89\xd0\x51\x88\x7a\x59\x5e\x47\xfc\xce\xed\x28\x3c\x89\xf9"
+ "\x27\x23\xde\x4a\x66\x2b\x3f\x84\xb0\xd6\xc8\xe5\x17\xf5\x70\xba"
+ "\xa7\x0e\x3c\x51\x69\x49\xde\x9a\xb4\x0c\x5f\x54\x9a\xc9\x57\x93"
+ "\x56\x85\x72\xea\xf2\xd4\xa4\xd9\xbd\x51\x8b\x51\x07\x16\x67\xa0"
+ "\x9c\x46\x92\xcc\xaf\x99\xc1\x80\xef\x8b\xaf\x91\xfc\x2d\x8b\x73"
+ "\x99\x7e\x71\x15\xfa\xc6\x4c\xe8\xfe\xe2\x5c\x1a\x87\x60\x51\x8b"
+ "\xab\x06\xa2\x16\x9b\x10\xae\x4a\xd4\xaf\xc5\x16\xd2\x4b\x1a\xef"
+ "\xc7\xb0\x6a\xec\x23\x69\x30\xbe\x19\xaf\x63\x78\x59\x59\x6d\x3a"
+ "\xf6\x8d\x21\x8a\xeb\x94\x25\x5d\xcf\xee\xb7\xa0\xaf\x7d\x05\xf1"
+ "\xa4\x1b\xd3\xbd\xf3\x18\xf2\x10\xeb\x49\xba\xde\x57\x93\x6e\x60"
+ "\xd1\xe9\x19\x6e\xae\xfb\xe9\xe9\x84\x7b\xe0\xb9\x78\x1a\x9f\xd0"
+ "\x62\x7c\x2e\x86\xfd\xd9\x4d\xba\xaa\x4f\xef\xf2\xe9\x33\x8c\x88"
+ "\xcb\xbe\x68\x17\x73\x78\x2d\x19\xe0\xb3\xa4\x3b\x3c\x23\xd0\x87"
+ "\x2f\x3f\x09\x64\x9f\x3c\x7f\x60\xc8\x83\x0f\x90\x1f\x2d\x5c\xfe"
+ "\xb6\x72\xac\x03\x9b\x27\x54\x75\xf4\xa1\x2e\x98\x7e\xcd\x6d\x53"
+ "\xa7\xf3\x0c\xe7\x29\xd2\xd1\x45\x3a\x45\xf2\x5d\x61\x82\x2a\xcc"
+ "\xcb\x8e\xb4\x38\xbc\x35\x88\x37\x0a\xf3\x89\x5e\x52\xe2\xe6\xf5"
+ "\x75\x09\xea\xeb\x49\x4c\xf3\x01\x08\x1d\x5f\x62\x1a\xce\x46\x92"
+ "\xad\x22\xfb\x94\xee\x71\x93\xce\xfc\x83\xec\x9a\xb0\x53\x90\x23"
+ "\xdb\x29\xb2\x51\xd4\x2f\x22\x3b\xe5\x93\xec\x94\x4f\xb2\x53\xfc"
+ "\x5d\x8f\xb6\xc6\x92\xca\xed\x51\x7a\xb9\xb0\x33\xe9\x5e\x23\x43"
+ "\xdd\x88\xc0\x7a\x0c\x42\x16\x08\x53\x9b\x3a\x86\xc3\x73\x3e\xa5"
+ "\x1a\x7d\x68\x6f\xf0\x4a\xf2\x09\x7b\x53\x25\xd9\x1b\xb5\x6c\x6f"
+ "\xe8\x4c\x34\xac\x53\xbe\x50\xf6\xc6\x27\xd9\x1b\x2f\x13\xf6\xc6"
+ "\x27\xd9\x1b\x0a\xf7\x4a\xf6\xc6\x1b\xc2\xde\xf8\x2c\xa9\x54\x5e"
+ "\x8d\x64\x67\xaa\xc8\xce\x50\x79\x7d\x35\xa9\x0e\x9f\xb0\x33\x7a"
+ "\xec\x13\xa9\xc9\xce\x78\x31\x8d\x4f\xb6\x33\x2e\x6e\x0f\x8c\x64"
+ "\x6b\x06\x9e\x07\xb4\x9f\x06\x20\x1b\xc3\xed\x89\x67\xb2\x87\xec"
+ "\x09\xf2\x6f\x9e\xd2\x9e\x20\xbe\x24\x7c\xd6\x4b\x76\xca\x14\xb9"
+ "\x9d\x79\xd0\x9e\x64\xa4\x97\x3b\x91\x2f\x7f\x83\x48\x0f\xda\xed"
+ "\xf2\xb2\x2a\x5b\xb9\x07\xd0\x0e\x54\xb1\xce\x2a\xd4\x91\x34\xd4"
+ "\x5f\x2f\xda\x0a\x00\xac\x97\x5d\x1e\xac\xe3\x98\xb7\xbd\xd3\xf4"
+ "\x09\x78\xb1\xae\xa6\xf5\xf5\xdb\x56\x38\xe3\xf5\x69\x17\x99\x03"
+ "\xf9\x63\x5f\x61\xaa\x42\xfb\x12\xef\xe8\xe8\x7b\x07\x52\x7b\x98"
+ "\x2f\x35\xd7\x6e\x40\x3a\xec\x69\x45\xd6\xc8\x15\xcf\xea\xb1\x9e"
+ "\x31\x2b\xda\xc5\x7f\x4f\xbb\xa8\x8f\xcc\xee\x81\x49\xa9\x79\xcc"
+ "\xe7\xc5\x7a\x86\xe5\xcd\xc0\x3a\x96\x8b\xb4\x9b\xb0\xce\x55\x61"
+ "\x3d\xeb\xf2\x28\xea\x19\xd6\x99\xc5\xf8\x6c\x10\xfc\x5b\x5c\x85"
+ "\xf5\x2c\xd7\xc7\xdb\xb3\x1e\xde\x17\xc5\xba\x56\x45\xe3\x76\x58"
+ "\xd7\x72\x7d\x35\xa2\xae\xf9\x44\x3a\x8b\x8f\xf8\xa7\x96\xea\x1a"
+ "\xca\x02\xe3\x9b\xf1\x3a\x86\x57\xe8\xba\x66\x0a\xa8\x6b\xcf\x4a"
+ "\x75\x2d\x4a\xd4\x35\x94\xa9\xc6\xfb\x9c\xa8\x6f\x84\x9f\xfa\xab"
+ "\x83\xf5\x2d\x3a\xbd\x8b\xce\x04\x10\xba\x43\x75\x2e\x1d\xdb\x95"
+ "\x0c\xe4\x67\xba\xc3\x67\xc9\x40\x7c\xcc\x41\x76\x13\x75\xf3\xef"
+ "\xd4\xd6\x21\x95\x7f\xcf\xf1\x4e\x40\xdb\x92\x01\x68\xcb\x3e\x45"
+ "\x3b\xfa\xf7\x15\x4e\x68\x46\x5c\x5d\x98\x9f\xdd\x8b\x75\xca\x57"
+ "\xc3\xeb\x93\xc9\xfb\x1c\xe1\x5c\x62\x1a\xc4\xc1\xdb\xca\xe0\xfa"
+ "\x74\xbd\x71\x53\x97\xf9\x27\x5a\x3b\x7c\x2d\xce\x8c\x32\xff\x44"
+ "\x6f\x87\x6b\xc9\xd2\xf3\x44\x3b\xfc\x4f\x2d\xf7\x65\xb0\x1e\x9a"
+ "\xb6\xc1\x8d\x17\xe0\x27\x5d\xa8\xf3\x80\xcf\x11\xf8\x7c\x26\x7d"
+ "\xda\xbb\xe8\x4b\x7c\xb8\x1b\xf3\x76\x51\x5d\x64\xe6\x59\xe4\xcb"
+ "\x25\xa1\x2e\xea\x98\x2b\x3e\x82\x45\xe7\xdc\xc9\x06\x62\x69\x6c"
+ "\x2e\x12\xdf\xc7\x22\x0f\xe2\xf0\x1e\x7d\xe8\x2a\xc4\xe0\x45\xe7"
+ "\x42\x56\x91\xff\x84\xcf\x46\xb6\x29\x76\xd4\xbe\x8d\x30\x3d\xd2"
+ "\x29\xce\x7f\x8d\xdc\xae\xa7\x31\xaa\x18\x7a\x66\xe6\x4f\xe3\x9b"
+ "\xae\xca\x67\xc0\x62\x7e\x81\x67\xc0\x9a\x21\xb6\xc9\xcc\x8e\x79"
+ "\x5d\xc4\x87\x45\x76\x99\x16\xa2\x0d\xe9\xbc\x05\xe9\xec\x79\x6c"
+ "\x73\x12\x7c\x50\x1e\x7a\xbf\x45\x97\x79\xf6\x60\xf9\x87\x89\x8f"
+ "\x93\x79\x32\x4c\x7c\xb2\xcc\xa7\xe1\xe6\x76\x52\x3b\xed\xdd\xc8"
+ "\xfa\x68\xef\x6e\x1a\x37\xa8\xf4\xb0\xff\xa0\xb3\x60\xb7\x79\x41"
+ "\x97\x5e\xee\x66\xb6\x3e\x66\xb5\x95\x5f\x84\x26\xda\x4f\xbc\x82"
+ "\xf9\x7c\x51\x39\x68\x97\x72\x74\xfd\x1b\x99\x87\xc6\x7d\x30\x8f"
+ "\x23\x76\x58\xd6\x2c\x64\x91\x96\xcb\xfb\x9b\xfa\x1c\x1d\xe2\x8a"
+ "\x22\x5c\x1d\x98\xde\x5b\x93\x83\xfa\x3a\xbb\xcb\xae\xd2\x9d\xe0"
+ "\x70\xfa\xb4\x5c\xd3\x16\xb8\xf9\x02\xdc\xa7\xe3\xfd\x04\x4b\x8e"
+ "\x81\x6c\x02\x86\xe9\x31\x2c\x06\xf1\xc7\xb9\xcc\xf7\xa1\xcf\xdd"
+ "\x5f\x27\x7c\xd9\xfb\x62\x64\x38\x3b\xcc\xee\x55\xce\x5b\x93\x56"
+ "\x49\x56\x05\xed\xff\xa6\x82\xe0\xdd\xec\x68\xe7\xb8\xa4\xd0\xd1"
+ "\x7e\x9b\x9e\x66\xa7\x73\xb8\x2a\xb7\xc2\x44\x94\x0f\xd1\xf7\x22"
+ "\xf6\x39\xce\x33\xf3\x7d\x86\x37\xb6\xb8\xb1\x4f\x71\x5f\x9d\x1d"
+ "\x3e\x1e\x96\x9f\xbe\xab\xac\x07\x71\x54\x55\x6f\x04\x20\xfe\x10"
+ "\x3f\xb1\xde\xf8\x90\x0f\x9f\x91\x4d\x6a\xda\x48\xfd\xee\xfb\xba"
+ "\x65\x7e\x0d\x2f\x93\x9c\x89\xa2\x6f\x3a\x67\x36\x33\x33\xb0\x4e"
+ "\xa2\xef\x18\x73\xee\x13\x3c\x58\x6c\xea\x47\x3b\x42\x63\xca\x74"
+ "\x66\x56\x69\x2c\x73\xbb\xcc\x73\xa6\xdb\xe1\xc1\x76\x69\xbc\xca"
+ "\x69\xf3\x2c\x20\xdb\x12\xb2\xdd\xe2\x7b\x95\x0e\xe2\xff\x69\x56"
+ "\xe7\x44\xb4\x43\xdc\x36\x1d\xec\xd9\x26\xe4\xef\x26\xbc\xb4\xd6"
+ "\xa3\x07\xe3\x4b\x9d\xac\x97\x59\x0e\x76\x53\x3f\x82\xf6\xfd\xc4"
+ "\xb0\x27\x51\xaf\x99\xb5\x84\x68\xfa\xe9\x93\xd6\x49\xd7\xe0\x7c"
+ "\x39\x68\x9a\x06\xc7\x89\x7e\x9a\x4c\xe3\x42\x62\x3c\x6c\x4e\x9b"
+ "\x1d\x16\xe4\xcb\x74\x91\x8f\x81\xbc\xd5\x91\xcf\x41\xbe\x06\x7d"
+ "\xa7\x28\xad\x60\x6e\xf2\x39\x10\xd6\x21\x97\x81\xca\x27\xca\xf5"
+ "\x53\x6d\x60\xb9\xe8\xdb\x7d\x64\x85\xe0\x41\xe9\x66\xd0\xf1\x33"
+ "\x7c\xbc\xf4\x9d\x63\x01\x2f\x0b\x95\x99\x97\x85\xdb\x58\x6c\x23"
+ "\x3c\xf7\xa2\x0e\xf1\xf0\x2a\xc4\x85\xfd\x9f\xf9\x5d\x42\x9f\xe6"
+ "\xb4\x0d\xb7\x86\x05\x75\xd3\x88\x7d\xd5\x49\x95\x3e\x76\x0e\x71"
+ "\xfe\x4d\x8c\xb1\xfd\xf4\x6f\x3e\xf2\xb3\xdd\xa4\xbb\x05\x13\xa9"
+ "\x4d\xb6\x55\x90\xbd\xe5\xb0\x37\x20\x6c\x0f\xc2\x74\x48\xb0\x1d"
+ "\xfc\xac\x42\x71\x0f\xa7\x3b\xb6\x63\x09\x48\x47\x8f\x83\xb7\xf7"
+ "\x07\x9b\xe5\x77\xec\xe3\x63\x3f\xf1\xa7\x0d\xac\xa6\x60\x62\x68"
+ "\x5a\x32\x8c\xd4\x9e\x79\xaf\xb2\x3e\xcc\xe7\x26\xd2\xa3\xca\xcd"
+ "\x30\x1e\x75\xf2\xb3\x6d\x5b\xe1\x46\xd2\x31\x16\x95\x13\x2f\xf8"
+ "\x9e\x68\x64\x66\xf4\x3d\xd1\xa2\x9a\x36\xc2\xcd\x58\x87\x0c\x17"
+ "\x20\x71\x41\x4e\x85\x01\x69\x05\xa8\xbe\x04\xe4\xa3\x7c\x8a\xf0"
+ "\x71\x36\xcf\xe7\xd0\x74\x89\x74\x31\x31\x5f\xd6\x45\x7c\x36\x5d"
+ "\xcf\x56\x20\x5f\x8f\x89\x31\x8a\xc4\xbf\xd1\x37\x89\x73\x90\xd8"
+ "\x4e\xe5\x15\x73\xa0\x13\x7f\xcf\xae\xb2\x89\x4c\xb4\x69\xcd\x76"
+ "\x48\x74\xe2\xfd\x18\xbf\xd0\x96\x48\xef\xcd\x08\x77\x84\x5d\xf5"
+ "\x12\xcc\x31\x0c\xb3\x32\xb3\x8a\xea\x49\x03\xe6\xdd\x67\x87\x15"
+ "\x27\x84\x6c\x12\x4f\x10\xae\x61\x68\x68\x66\x7c\xdf\xdb\xaf\xb0"
+ "\xbc\x73\x1f\x33\x6c\xa3\x31\xce\xb9\xd3\x78\xbd\x40\x5c\x4d\x6a"
+ "\x61\xb3\x7d\x48\x6b\xa3\xd9\x57\x88\xf6\xb9\xd0\x57\xbb\xba\x97"
+ "\x3f\x4b\x71\x4c\x6a\x47\x43\xe3\x3f\xd8\x43\x7b\x79\xf7\xc0\xdc"
+ "\x63\x02\xcf\xc1\x6e\xeb\x84\x0b\xf4\xce\xf7\xc6\x77\xea\x0b\x7b"
+ "\x6d\xf5\x49\xe2\x8c\x46\x84\x11\xfd\xf8\xb9\xbf\xe9\xc7\x3c\x5c"
+ "\xe6\xb9\x58\xa6\x87\x9a\xc5\xf7\x99\xc2\x90\xfb\x75\xf3\xf5\x51"
+ "\x58\x07\xa8\xce\x89\x3a\x3d\x6f\x57\x47\x33\xaf\x7f\x16\xd4\xf9"
+ "\x63\x92\xfd\xa5\xf1\x9c\x88\x73\x30\x6f\x67\x47\x2c\xd7\x6f\x35"
+ "\x53\xdf\xaf\x0f\x3a\xdb\x0d\xe3\x86\x5e\xf7\x27\xe3\x95\x89\x57"
+ "\xae\xf4\x5e\x8c\x17\x96\xf9\xfe\x2e\x7c\x2f\xe3\xbc\x3b\x98\xaf"
+ "\xb2\x63\x5c\x3f\xfa\xec\xf4\x6e\x87\xfb\x53\xd9\xc1\x38\xb5\xfc"
+ "\xdc\x74\x80\xc6\x09\xee\x2f\xb7\xc3\x5c\x10\xb2\x98\xc7\xe7\xee"
+ "\x20\x6d\xc4\x77\x56\x59\xcf\xdc\x6d\xdb\x9c\x48\xf7\xfd\x47\xda"
+ "\xea\x9d\x60\xb8\x9d\xca\x7f\xff\x51\x2a\x13\xcd\x61\xa1\x7b\x69"
+ "\x3d\x73\xb4\x36\x78\x80\xbe\xe5\x21\x2e\xac\xff\x4d\x71\x62\xcc"
+ "\xa1\x41\x4f\xf8\x24\x9d\x60\x72\xf9\x05\x9f\x0b\x7b\x0d\x1b\x55"
+ "\xf4\x1e\xd5\xb8\x9f\x8f\xc3\xec\x61\x95\x59\xd2\xdc\x85\x79\x23"
+ "\xb1\x9e\xcf\xa3\x73\x1e\x2f\xc1\xbc\x34\x86\xbc\x6e\x2d\xe4\x67"
+ "\x48\x39\xb0\xfd\xe9\x6b\xe4\xf3\x8d\xe6\xa1\xfd\x9b\x9b\xcb\xbf"
+ "\xcd\x60\x38\xb7\x35\x88\x73\x1f\xc6\x61\x7b\xd4\xd7\x51\xe8\x06"
+ "\x2f\x95\x19\xd3\xbe\x73\xd5\xad\xa5\x73\x2e\xb7\xd1\xf9\xf3\x48"
+ "\x07\x43\x59\x09\x5b\x76\xbf\x7d\xeb\x45\xe6\x96\xcb\xdc\xda\x4c"
+ "\xf5\x63\xde\x4e\x3b\xbc\x79\x66\xd8\x3a\x31\x58\x8e\xa4\xc3\xad"
+ "\x71\x42\x8e\x3e\xe4\x55\xb0\x1c\x93\x9a\x85\x0c\xe7\x9d\x09\x96"
+ "\x61\x12\xe6\x90\x84\x9a\x90\x34\x0b\xaf\x64\xe9\x3d\xf0\xd2\x05"
+ "\x3c\xa3\x5c\x93\xf6\xb8\xcc\x49\x31\x58\x3f\x2a\x84\x6c\x28\x1c"
+ "\xf5\x99\xf4\xe6\x4b\x6c\x7b\x06\xe8\x6c\xd0\x8b\x40\xe1\xa4\xe3"
+ "\x14\xee\x43\xff\x06\xdf\xe3\x31\x5e\x4f\xf5\x97\xce\xe3\x0a\x8c"
+ "\x1f\x3c\x77\x01\x92\x36\x13\xae\xc8\xed\xbb\x77\x93\xee\x22\xcc"
+ "\xf4\x48\xcf\xee\xdd\x98\xdf\x4e\x99\xaf\x18\x56\x4c\xf1\xa4\xa7"
+ "\x18\xde\x60\x87\xb7\xf8\xf9\x47\x4e\xec\x03\x86\xf6\x3d\x92\xac"
+ "\x83\x3e\x9a\x3e\x5d\x4f\xb2\xec\x83\x07\x4e\xa3\x1d\x43\xfb\xbd"
+ "\xda\x2e\xda\x9f\x07\x3a\xe8\x1d\xed\xe7\x67\xf8\xdc\xde\x81\x76"
+ "\xea\x5a\x6d\xb6\x6e\x40\x0d\xe1\xd7\xd4\x90\xe4\xa9\xfd\xf0\xa8"
+ "\x27\x3a\x33\xc6\xd6\x7b\x1c\x3a\x3d\xff\x0a\x86\x67\x38\x8e\xf7"
+ "\xe8\x5c\xb8\xca\xcd\xcc\xfb\xf6\xb5\x23\x5a\x9b\xe7\xb2\x95\x9f"
+ "\xc3\x0a\x0f\x70\x7e\xbc\x74\x0e\xbd\x80\x15\x1c\xb7\xc4\x9f\x0f"
+ "\x77\xef\x5b\xc5\x3c\xfb\xce\xd3\x5e\xf1\xb1\xa3\xf6\x5e\x83\xe9"
+ "\xaf\x6d\x01\x63\xc3\x35\x88\x6b\xbc\x06\xf1\xec\x1f\xf1\xea\x06"
+ "\xf4\xe3\x56\x5c\xd1\x03\xda\x89\xac\xb1\x26\xd0\x35\x6e\x41\x7f"
+ "\xce\x03\x2a\x6f\x0d\xfa\x73\x1e\xf4\xe7\x2e\xc7\x93\xbd\x1c\xf4"
+ "\xe7\x06\xb8\xaf\x9c\x53\xc7\xcf\x0f\xad\xc9\xa9\x1b\x53\x08\xaa"
+ "\x88\x5c\xd0\x23\x7d\x95\x97\xe0\x01\x55\x44\x0f\xfa\x92\x58\x66"
+ "\xbb\x54\x5e\xbc\xc7\x44\x16\x42\x38\x2f\x2b\xda\x70\x56\xb3\xda"
+ "\x3e\x6c\xdb\xac\x26\x9d\x72\x52\x5d\xc2\x32\x3c\x38\x9e\xbe\x39"
+ "\x1f\x9f\xe0\xd6\x96\x36\x30\x37\x85\x97\x4d\x66\x6e\x0c\xe7\x7b"
+ "\xfc\x1f\xc3\x70\x97\xf9\xc1\x78\xbb\xf6\xe1\x61\x75\x14\xfb\x4c"
+ "\x92\xad\x79\xf0\x4d\xa6\xae\x42\x1d\x4d\xcf\xd8\xea\x41\x7f\xfc"
+ "\x12\xd5\xe3\x07\x8f\xa4\x17\x33\x8f\x61\x1d\x7d\xff\x7f\xb0\x9e"
+ "\xe6\x26\xd0\x37\xc9\x7f\x41\x5f\xe7\x9b\xe6\x23\x50\x1b\x42\xfd"
+ "\x87\xc8\x62\xc4\x59\x9b\x9e\xc1\xb0\xcf\xfe\x6d\xfd\x7a\x9a\x7f"
+ "\x26\xd6\x9a\x3e\xd8\x63\x87\x75\xfc\x9b\x2a\x5f\x9f\xc3\xed\xe9"
+ "\xfc\x36\x27\xf2\x20\xd8\x06\xcc\xaf\xa7\x7d\xcb\xfb\x2d\xd9\x75"
+ "\xd6\x49\x64\xfb\xe7\xd7\x08\x5f\x28\xdb\x22\xda\x82\xf9\xcf\x8a"
+ "\xef\x07\xf3\x67\xd9\x61\x09\x6f\xe3\x4d\x53\x48\x27\xe6\x17\xb3"
+ "\xe8\xec\x97\x09\x6e\x46\x15\x54\xad\xf7\x40\x2e\xab\xc9\xb6\x30"
+ "\x5e\x57\x2e\x01\x7b\x75\x8d\x8b\xd6\xdc\x38\x6f\x5a\xe6\x42\xdf"
+ "\xa0\x0d\xe3\xea\x28\x0f\x07\xc2\x20\xdf\x47\x8a\xb9\x0b\xf3\x77"
+ "\xdb\xe1\x51\xc9\x1e\xce\xcf\x16\x63\xcc\xf3\xb3\xfb\x31\x2d\xfa"
+ "\x8a\x37\x60\x3c\xfa\xbf\x6b\x22\xa4\x6f\xdc\x8e\x1d\x7c\xad\xe8"
+ "\xfc\x93\x76\x28\xce\xa0\xb0\xb2\xc9\x10\x5b\x66\x60\xc3\xb5\x07"
+ "\xda\xe0\x72\x2e\x78\x80\xcf\xc3\x53\xc3\x4d\x2e\x73\x32\xc8\x78"
+ "\xb1\xbd\x7d\xab\x5f\xfd\xd8\x63\x18\x16\x23\xe3\x45\x98\x1b\xf1"
+ "\x3d\x6e\x10\x46\xa4\x99\x15\x90\xe6\xb1\x7e\xf5\x9d\x6f\x61\x58"
+ "\x8a\x22\x4d\x96\x22\x4d\x61\x40\x9a\x2a\x29\x9f\x0a\x45\x9a\x3d"
+ "\x8a\x34\x0d\x21\x68\x3b\xa6\x48\x63\x55\xa4\xe9\x0a\x41\x5b\x8f"
+ "\x22\x8d\x33\x38\xcd\x02\x6d\x00\x6f\x69\x3e\x91\x11\xc3\x62\x83"
+ "\xd3\x2c\x88\x57\xa4\x99\x2d\xbf\xa3\xef\x99\x25\x7c\x03\xd4\x27"
+ "\x94\x29\xca\xb5\x0e\xe3\xb1\xfc\x8f\x15\x5f\xc7\xff\xc6\xbe\x61"
+ "\xf6\x9e\xca\x43\xe2\x1c\x5d\xb2\xab\x34\xff\x80\xec\x39\x7d\x33"
+ "\x21\x9d\x20\xbf\x93\xf2\x3a\x0f\x0f\xed\x22\x1d\x42\x9c\x47\x87"
+ "\xf2\x63\x81\x55\x41\x67\x97\x82\x4e\xfb\x50\x7e\x2c\x70\x06\xa7"
+ "\x79\x48\x1b\x9c\xe6\xa1\x98\x80\x34\xcd\x22\x9f\x87\xe2\x15\x69"
+ "\x66\x2b\xd2\xa4\x0c\xd5\xcf\x87\xb2\x15\x69\x8a\x15\x69\x2a\xfc"
+ "\x3c\x7c\x88\xaf\x0d\xa7\xfa\x80\xe1\xd8\xff\x59\x7a\xf2\x3a\xbc"
+ "\xd3\xcb\xfa\x2c\xaf\x9d\x16\x7a\xfd\xf0\xf8\x3a\xb1\x6e\x8e\x9f"
+ "\x59\xd0\x03\x0f\x27\xc8\xdf\x96\xdf\xb8\xe6\x0e\xa3\x6f\x9e\xc8"
+ "\xdb\xde\xd6\x72\x37\xb6\xb9\x0f\x61\x1b\x9c\x66\x94\xe7\x96\xd0"
+ "\x7c\x1c\x7e\xe6\x0d\xef\x8f\x3c\xd4\x2d\xea\xdf\xc3\xf2\x37\x1d"
+ "\x2a\x0f\xf6\x33\x1e\x9e\xfe\xbf\x49\x57\x07\xd1\x45\x67\x3f\x20"
+ "\x0e\xd3\x60\x5f\x63\x90\x56\xca\xf3\xe1\xbf\xc8\xb4\x36\x89\x39"
+ "\x41\x34\x57\xd8\x41\xe7\x71\x60\x9a\x96\x80\xfe\x09\xd1\xea\x3c"
+ "\xbe\xc5\xad\x0d\xa6\xf9\xe1\x9d\x12\xcd\xdd\xc2\x46\x3d\xdc\x2d"
+ "\xdb\x93\x61\xf5\xcf\x72\xb0\xbd\xb3\x01\x80\xe6\x3c\x74\x34\xa0"
+ "\xbf\x89\x7d\x2c\xa2\xfb\x1c\xa4\x18\xb8\xff\xbb\xee\x1a\xd0\xb3"
+ "\xad\x62\x0e\x9f\x13\x21\xca\x92\x92\x45\xe7\x2e\x93\xef\xd3\x66"
+ "\xfa\x8a\xe6\xe5\x31\x7e\x06\x13\xa4\xec\x6a\xad\x70\x20\xad\x29"
+ "\x19\xf2\xfc\x21\x3b\xa4\x08\xbf\xce\x72\xd0\x4a\xf3\x35\x68\x6e"
+ "\x53\xab\x73\x36\xc1\x94\x21\x9d\xf2\xdc\xe9\x3e\x3a\xc3\x19\x61"
+ "\xa7\x0f\xd7\x57\x0a\xe4\xab\xa0\xe1\x91\x2f\x85\xfe\xa4\x9c\x0c"
+ "\xae\x0f\x61\xa8\xa7\x29\x5d\xc1\x3a\x97\x62\x0f\xd6\xb9\x14\x47"
+ "\x70\x7d\x50\x63\x7d\x58\xa8\x0d\x4e\xb3\x30\x26\x38\xcd\xc2\xb8"
+ "\x80\x34\x16\x91\xcf\xc2\xd9\x8a\x34\x29\x8a\x34\x81\xf6\x0f\xcb"
+ "\xbc\xb0\x70\xb0\xdf\xc9\xed\xfd\xc2\xf2\x80\x77\x75\x1d\x6f\xa7"
+ "\x16\xee\x91\xc3\xa4\x75\xc9\x7c\xae\x94\x84\xef\x88\xc2\x46\x11"
+ "\xfc\x49\x05\x0d\xa7\x15\x34\x9c\x95\xdf\xa5\xf9\x15\xef\x23\xef"
+ "\x26\x4b\x7a\xe6\x8c\xdc\x0e\x8f\x46\x7a\x96\x3c\x49\xbe\x19\xb5"
+ "\x4f\x7c\x0e\xdb\x56\xf4\x29\xaf\x80\x9e\xe6\x0e\x9e\x2f\x03\x0d"
+ "\x9d\x0b\x63\x87\x45\x99\xd8\x9f\xa3\xb3\xf6\xfa\xd0\x9f\x4a\x3f"
+ "\x0f\x0b\xfb\x30\xff\x7a\xcc\x03\x79\xf7\x48\x52\x30\x0d\x8f\x64"
+ "\x04\xd3\xf0\x48\x6e\xc0\xbb\x1e\xdf\x4d\x01\xe5\xd6\xd3\x3e\x11"
+ "\x2f\x73\xdf\xfa\x91\xdd\x72\x38\x8d\x01\x60\x19\x7b\x2b\xb9\x1f"
+ "\x90\x44\xf3\x06\xa3\xcf\xc1\x23\x1b\x68\xbc\x40\xc2\x79\x3c\x90"
+ "\xb7\x82\x17\x8f\xb4\x2b\xe8\xe8\x56\xd0\xd1\xeb\xb7\x35\x0b\xfb"
+ "\x44\x1d\x79\x04\x9f\x1f\x8f\xa7\x30\xe4\x85\x21\xd2\x63\xb8\xc1"
+ "\x3a\x85\xfc\xd4\x45\x0b\x9d\x58\x5e\xf6\xbc\x3a\x5a\x7a\x4f\x63"
+ "\x53\xc8\xef\xce\xb1\xa0\x7d\xa6\xb5\xb3\xb7\x62\x58\xa6\x90\xeb"
+ "\x22\x2c\xff\xd2\x24\x81\x77\x11\xff\xb6\x4f\xb0\xf8\x6c\x60\x51"
+ "\x07\xbb\x87\xd3\xe7\xfe\xe8\x83\x5d\xf2\x1c\x5b\xc4\xb1\x53\xae"
+ "\x0f\xbe\xda\x83\x5d\xbe\x9a\x55\xe8\x13\x2f\xaa\xc7\x3a\x61\x11"
+ "\x7d\x9a\x82\x33\xa8\xfb\xf5\x28\x3f\xec\x03\xa7\x4a\x7d\x99\x83"
+ "\x3d\x34\x77\x90\xf6\xaf\x40\x9b\x19\x21\xe6\x66\x2c\x3a\x1d\x50"
+ "\xaf\x9c\x86\x2d\xf3\xd8\x39\x48\xad\x21\xdf\x8e\xec\x06\xcd\x41"
+ "\x6c\xf5\x38\x80\xc6\x59\x6c\x9e\x0b\xdc\x27\xc7\x78\x8b\x48\x9b"
+ "\xaa\x0b\x48\xeb\x90\xc6\x41\x7a\x29\x6e\xa6\x07\xb4\xad\x4e\x07"
+ "\x9d\xb1\x1b\x23\xfc\xf8\xd4\x9a\x56\xb4\x17\x98\x26\x51\x4e\x43"
+ "\x63\x26\xfc\xbb\x7f\x19\x68\x67\x54\x80\xd6\xba\xe5\x1c\xc7\x2d"
+ "\x7d\x73\xe6\xfd\x23\x5b\x45\x2f\xd8\x9c\xdd\xe4\x53\x6a\xc5\xbc"
+ "\xad\x54\x8b\xc6\x0d\xba\xfe\x9a\x83\xd8\x86\xa5\x5a\xbc\x35\x07"
+ "\xdb\x91\x36\xac\xaf\x8b\x8e\x93\x0d\x0c\xe4\xdd\x82\x05\x19\x4b"
+ "\xd2\xd3\x12\x9e\x58\xb2\x30\x73\xc1\x1c\x43\x66\xd1\xda\x82\xfc"
+ "\x84\xf5\x1b\xca\x0c\x9b\x4a\x8a\xca\x8a\xd6\xad\xe6\xc7\x82\x19"
+ "\xf2\xca\xc4\x3d\xbe\x38\xaf\xb4\x6c\x2e\x3d\x4e\x37\x98\x4a\x0a"
+ "\x36\xf2\xc7\x69\xa3\x20\x18\x49\x51\x59\x41\x89\x61\x6a\xfe\x74"
+ "\xc3\x43\x79\x45\xc5\xb4\x8a\x21\x14\xae\x39\x86\x92\x82\x92\x82"
+ "\xbc\x7c\xc3\x5c\x83\x91\x30\x07\xa2\x0b\x90\xa7\x51\xb6\x4f\xa5"
+ "\xd8\x9e\xa3\x0f\xdd\x4b\x76\x8a\xda\xf5\xf3\x90\xbe\x81\x7c\x38"
+ "\x7e\x8e\x17\xea\x21\xb6\x09\x76\x97\x39\xad\x6c\x68\x3b\x9e\xb6"
+ "\x3b\x58\x7f\xd3\xea\x83\xf5\x37\xed\xc8\xd0\x76\x3c\x4d\x51\xff"
+ "\xd3\x14\xf5\x3f\xed\xec\xd0\x76\x3c\xcd\x11\x9c\x66\x31\x04\xa7"
+ "\x59\xac\x1f\xb4\x33\x48\xeb\x0e\x6e\x97\x16\xc7\x29\xd2\xcc\x52"
+ "\xa4\x49\x56\xbc\x67\x06\xbc\xa3\xef\xba\x38\x3f\xd0\x37\xc0\xf7"
+ "\x32\xb9\xae\xfb\xed\xdb\xe2\xdd\x32\x0c\xb5\x3d\xb4\xd6\x45\x82"
+ "\x6d\x0e\x80\xed\x95\x60\x07\xeb\x3f\xd9\x24\x9a\xbb\x29\xfc\xf3"
+ "\xf4\xa9\x92\x6d\xeb\xa9\xf6\xb7\xa1\x3d\x28\x8b\x5b\x2f\xc1\x62"
+ "\x3a\x6b\x91\x60\x1d\x34\x9f\x97\xbd\xba\xcc\xd5\x14\x0d\x3a\x4a"
+ "\x4b\xe7\x58\x31\x73\x6a\x03\xcd\x1f\xc7\xb0\x08\xbc\xd0\x4e\xa5"
+ "\xc7\xca\x73\xe7\x77\x22\x8c\x1d\xd2\xb9\x2e\x53\xba\x9d\x7c\xde"
+ "\x21\xcf\xaf\x86\xd6\x58\xd1\xd9\x70\xd5\x62\x0f\x89\x1e\x3a\x5f"
+ "\x8d\xf2\x46\x1c\x5a\xa6\x4e\xfd\x4c\x3a\x27\x4b\x8f\x57\x0c\xe2"
+ "\x2c\x96\x71\x22\xbe\x58\x10\xe7\xf1\xd1\x3c\x32\xc9\xef\x49\xdf"
+ "\x23\xfb\x17\xd4\x57\x08\x65\x3b\x42\xcf\xcd\x86\xc8\x6a\xb3\xaf"
+ "\xdb\xba\xad\x87\x68\x3a\x49\x7e\xa8\x2d\xd6\x03\x9d\x0d\x1e\xec"
+ "\xbf\x82\x9e\xf7\xa7\xca\x2f\x82\xad\xd9\x03\x34\x3e\x9c\x53\x0e"
+ "\x55\x4d\x6a\x5f\x37\x1b\x4c\x47\x7d\xb4\x74\x7e\x3e\xe5\x4e\x0a"
+ "\xc7\xf4\xd8\x97\x70\xd0\x1c\xee\x61\xc6\x23\x22\x09\xce\x3a\x85"
+ "\xfa\x7b\x19\xd3\x25\xdf\x77\x77\x13\xe2\x0a\x39\xbf\x58\x0d\x36"
+ "\x97\x39\x03\xdb\xbf\x4d\x5d\xb2\xcd\x6e\xad\xe7\xb6\x4f\x8d\xe1"
+ "\x55\xc8\x8b\x63\xc3\xf9\x29\x92\x7d\x37\xd1\xbc\x32\x84\x3d\x7a"
+ "\x3d\x58\xa2\xbb\x15\xcb\x8d\x75\xb1\xfe\x8d\x6d\xc6\x30\xc9\xbe"
+ "\xea\x30\x5d\x8f\x9c\xee\xdb\x94\x8f\x7c\x23\x6a\x8f\xb1\xae\x3a"
+ "\x45\x5f\x71\xc9\x93\x2f\xf3\x39\xcb\x8f\xa2\xff\x97\x21\xd7\x83"
+ "\xd1\xf8\x8e\xf6\x2f\x83\x8f\x27\xf2\x79\x3d\xd8\x9f\x2c\x35\xa1"
+ "\xcf\x16\xeb\x44\xdb\xf8\x68\x96\x1c\xc7\xc7\x89\x28\xae\x82\xb9"
+ "\x5b\x63\x7b\x28\xae\x6c\x30\x4e\xac\x21\x60\xad\xe5\x1e\x0a\xdf"
+ "\x23\x87\x8b\xb6\xe5\xd1\x06\xc5\xfb\x51\xf9\x1d\x9f\x4f\xe0\xb3"
+ "\x41\xc2\xef\x40\x9b\xab\x12\x7b\x2e\x2c\x19\xdf\xc8\xeb\xcd\xa3"
+ "\xdd\x72\x3c\x1f\x53\x3b\x4c\xdf\xc6\x9c\xe0\x8b\xce\xae\xe7\x3e"
+ "\x17\xa6\x79\xfb\x2b\x77\x18\xf6\x31\x54\x8c\xce\x54\xc5\x30\xc2"
+ "\x43\x75\x86\x9f\x6d\x8f\xef\xe7\xe0\xd1\xd3\xb4\xce\x81\x74\x64"
+ "\x93\x07\x26\x9a\xee\xa7\xf1\xe7\x25\x5c\x6f\x29\x8c\xf0\x12\x3e"
+ "\x6a\x13\x09\x37\xe1\xdb\x47\x3e\x2d\x9f\x2f\xb9\x84\xca\xbf\x67"
+ "\x38\x59\x61\x7c\x79\x00\x2f\xc3\xf0\x7d\x77\x70\x59\x97\xd4\x2b"
+ "\xde\x8f\xc8\xef\x34\xd6\x2b\x74\x6f\x49\x83\x14\xd7\x76\xbd\xbc"
+ "\xa6\xf0\x35\x32\x4b\x7a\x15\xf9\xb9\x83\xf1\x2f\xd5\x29\xde\x63"
+ "\xe5\xf7\x3a\xfe\x8d\x61\x69\xbc\x9c\x47\xb5\x98\xc3\x55\xdf\xb2"
+ "\xcd\x11\x76\xbd\xbd\x4c\x30\x4d\x76\x40\x9e\x23\xf0\xbd\xd8\x2f"
+ "\xbf\xa5\xe5\x32\x3e\x7c\xde\x19\x00\x87\x7e\xc9\xd2\x3a\x19\x4e"
+ "\x7c\xdf\x58\xda\x12\x90\xee\xd8\x37\x94\x55\xa1\xbb\x99\x5e\xa1"
+ "\xbb\x4b\x7b\x15\xb4\xb8\xfd\x38\x33\xb5\x7e\x5a\x32\xf5\x01\x70"
+ "\x58\x3f\x33\x0d\x4a\x5d\x2d\x2d\x27\x1d\x27\x7d\xcd\x4c\x0c\x11"
+ "\xe7\x96\xe2\xb2\x42\xeb\x78\xa6\x29\x20\x5c\xea\x1f\x65\x7e\x22"
+ "\xf9\x09\x64\x9f\x9d\xfd\x95\x99\xf2\xf9\xaa\x5c\x27\x69\x1f\xb1"
+ "\x99\xe2\x2c\x6f\xd4\xeb\xcc\x63\x4a\xbc\x62\xfd\x8d\x84\xc3\x8f"
+ "\xb3\x4a\xf8\x78\x99\xf6\x80\xb2\xf5\xd9\x61\x89\xfc\x9d\xc8\x21"
+ "\xc6\x06\x97\x9e\x1d\xae\xdf\xe1\x32\x3f\x36\x31\x98\x67\x8f\x4d"
+ "\xf7\xf3\xec\xb1\xd9\x7e\xbc\x8f\x25\x07\xc0\x7d\x88\xef\x99\x01"
+ "\x70\xb9\xdf\xa4\x9b\x42\x57\x1e\xdb\xad\xc8\xab\x3e\x00\x47\x4b"
+ "\x40\x5e\xc7\x02\xe0\xba\xf1\xdd\x3a\xbc\x7c\x1e\x3b\x3b\xbc\x7c"
+ "\x1e\x73\x87\x96\xcf\xe3\x7a\x7f\xbe\x8f\x4f\xfc\xe6\x7a\xf5\x78"
+ "\x52\x00\x3d\x4d\xf8\x9e\x11\x5c\x8f\x1e\xcf\x55\xbc\x0f\xca\x9f"
+ "\xa1\xed\x68\xd9\x92\x44\xe7\x71\x43\xd9\x64\xd0\x8b\x7a\xf6\xb8"
+ "\x25\x30\xfe\xed\x6b\x22\x9e\x68\xe4\xdf\xe0\xe8\xfb\xa6\x80\x3b"
+ "\xa1\x84\x23\x98\x80\xf8\x6e\x99\x76\x6c\xaf\x43\x9e\x05\x2a\xb7"
+ "\x7f\x36\x1f\xb5\x7f\x8f\x3b\xc5\x77\x9b\xe5\xa7\x99\xf9\xdd\xac"
+ "\xe1\xda\x32\x97\xf9\x09\x23\xf6\x19\x7a\x05\x7f\x9e\x40\xfd\x5f"
+ "\xc7\x7d\x13\x66\x59\x7e\x1a\xf5\xe9\xda\x79\x78\xe2\x13\xbc\x0f"
+ "\xe0\xfd\xf7\xc1\xed\xeb\x13\x99\xcc\xac\x5a\xda\x64\x56\xb6\xbb"
+ "\x4f\x14\x63\xdf\xe3\x5a\xa4\xa7\x2a\x2b\x44\xdc\x6e\x66\xd6\x2c"
+ "\x09\x11\xde\x8c\xf2\xba\x66\x87\x27\xce\x10\xbd\x01\xe1\x27\x98"
+ "\x79\x6c\x26\xc1\xdb\x29\x3f\x4c\x33\x9c\xdc\xe4\x75\x50\x42\xf7"
+ "\xb2\xb4\x8a\x72\x7c\x7d\x1e\xb2\xb6\x8b\x72\x64\xfd\x2d\x38\xef"
+ "\xac\x89\xa1\xcb\x91\x35\x0b\xcb\xf1\x75\xe8\x72\x64\x65\x70\xde"
+ "\xaa\xb1\x2c\x43\xfc\x8e\xac\x62\x2c\xcb\xd7\x9c\xef\xc1\xe1\x3b"
+ "\xe5\x7e\x6a\xe5\xd7\xd8\xff\x57\x03\x4f\xbb\xb4\xc2\x2f\x37\x09"
+ "\xee\x68\x64\x3d\x64\x84\xc8\xb3\x8d\x99\xc3\x97\xda\x21\xcb\x23"
+ "\xb7\x57\x52\xf8\x59\x41\x0b\xf2\x49\x4d\x7c\xc2\xf2\x60\xba\xe1"
+ "\xe4\x2d\xd7\x4f\xf1\x9d\xe9\x49\xac\xff\x4f\xd8\xe5\x36\x1d\xdb"
+ "\x73\x87\xcc\x47\x8c\x4b\x51\xc4\xb9\x03\xe2\xf2\x83\xe2\xb6\x0e"
+ "\x86\x57\xc8\xe1\xdf\x4e\x4e\x4f\x1e\x55\xc8\x09\xe5\xf3\xd4\xdc"
+ "\xe0\x72\x3f\x79\x52\x94\x0f\x65\x34\x84\xd7\x4f\x76\xa3\x8c\x06"
+ "\x42\xcb\xe8\x49\x67\x68\x5d\x7b\x2a\x82\xe3\x8b\x86\x10\xf8\x9e"
+ "\x8a\x47\xd9\x0d\x70\x1d\x94\xe4\x34\x54\x3e\x4f\xa5\xca\xf2\xf9"
+ "\x76\x65\x7c\xca\xa2\x28\xa3\xf7\x3c\x2c\x1b\x23\xca\xba\x6c\xb9"
+ "\x02\xf7\x91\xd0\xba\xf8\x94\x15\xcb\xe9\x0d\x5d\xce\xa7\xce\x0e"
+ "\xaf\x8b\x4f\xd1\xb7\x3a\xef\x50\x5d\x5c\xa6\x17\x69\x20\x44\x9a"
+ "\x65\xd3\x99\x39\x54\x3e\xcb\x92\xc9\x2f\xb2\xc3\xb2\x0a\xfa\x4e"
+ "\x17\x10\x9e\x1d\xac\x7f\x58\x06\x4a\x47\xfc\xf3\x88\x7e\x0c\xc9"
+ "\xe1\xbc\x01\xd4\xdf\xa4\x93\x2e\xf3\xb2\x93\x0a\x5e\x5d\x3e\x0f"
+ "\xd9\x73\xfb\xd5\xea\x87\x04\xbf\x96\xab\x14\x34\x75\x87\xe6\xd7"
+ "\x32\x07\xf2\xeb\x72\x68\x7e\x65\x47\x0c\xcf\xaf\x6c\x92\xff\xe5"
+ "\xa1\xfc\xca\x4e\x0a\xe4\x97\xcf\x2c\xca\x77\x5b\x2c\xea\xc6\x40"
+ "\x0e\x6b\x12\xb6\x5c\x1f\x89\xba\x22\xd2\xf4\x51\x9a\xb2\x48\xb7"
+ "\xd0\x13\xc3\x04\xd0\x5d\x82\xec\x6c\xb9\xfe\x8f\xad\x87\x70\x36"
+ "\xb0\x8c\xe6\x68\xd3\x19\xcf\x7a\x5b\xf9\x65\xab\xcd\x63\x04\x1a"
+ "\x6f\x54\xe4\x7b\x22\xb4\x2d\xc8\xee\x42\x9e\xd6\x86\x08\xef\x15"
+ "\x63\xa6\xcb\x0d\xc1\x36\x62\x39\x04\xcb\x68\x19\x4f\x07\x83\xfb"
+ "\x9f\x5e\xff\xba\xbe\xcc\x96\x9b\x86\xca\x6c\x45\x94\x24\xaf\x2f"
+ "\x83\xe9\x5b\xbe\x3b\xb4\xbc\x96\x37\x0f\x2f\xaf\xe5\x27\x87\x97"
+ "\xd7\x72\xea\xfb\x5c\xb6\xc3\x0a\x7d\x70\xbb\xb1\xdc\x11\x5c\x5e"
+ "\xcc\x17\xd3\x31\xf5\x88\x1b\xe8\xfd\xdb\x96\x5b\xbe\xc8\xc6\x91"
+ "\xac\x68\xfd\x3f\xd2\x3f\x99\x68\xfc\xae\x38\x86\xc5\x8d\x3c\xb4"
+ "\x6c\x19\xf6\xdc\xf0\x88\x4e\xec\x57\xd2\xfc\x3c\xc3\x24\x1a\x2b"
+ "\x5b\xf1\xb9\x4f\xad\x9a\x83\xcf\xea\xf3\x90\xfb\x1b\x9f\x5a\x53"
+ "\x45\x73\xc9\xf8\xda\x41\xfe\x7d\x62\x85\x27\x50\x16\x34\xa7\x6c"
+ "\x9f\xd8\xcb\x91\xc6\x39\x3f\x3d\x0f\x39\xbb\x84\x5c\x72\x6b\x82"
+ "\xf9\x98\x63\x08\x2d\x97\x9c\xd9\x28\x97\x4f\x43\xcb\x25\x27\x73"
+ "\x78\xb9\xe4\x98\x50\x2e\x9f\x0e\xad\x47\x39\xbb\xa5\x7a\xb4\x83"
+ "\xd2\x18\xd6\x91\xbf\x9a\xf3\x35\xc1\xe0\x33\xd6\x91\x9c\xcf\x28"
+ "\x3e\xa1\x4f\xae\x47\x3c\x0d\xf5\xff\x79\xfe\x12\xcc\x09\x09\x47"
+ "\x20\x5e\x7b\x64\x5f\xa8\x7a\x92\x43\xdf\x53\x55\x33\x4c\xa0\x43"
+ "\x1e\x66\x1d\x22\x1c\x25\x00\x97\x20\x37\x8d\xe0\x28\x9c\xce\x5c"
+ "\xf6\xc3\xe7\xc6\xcb\x70\x7c\x5c\x54\xc0\x1a\x98\xab\x10\x08\x2e"
+ "\x18\x77\xae\x54\xfe\x70\xde\x8e\x10\x3c\xc1\x29\x60\xca\x45\x7d"
+ "\xcc\x3d\x19\x5c\x1f\x73\x2d\xc1\xfa\x99\x43\xdf\x27\x22\x7d\x68"
+ "\xe7\x50\x97\x7b\xbc\x66\xd5\x9c\xef\xa7\x6e\xe6\x45\x28\xea\x26"
+ "\xea\x40\xde\xaf\x85\x0e\xe4\xed\x0d\xa6\x35\x2f\x2e\xb4\x0e\xe4"
+ "\x25\x0e\xaf\x03\x79\x59\xc3\xeb\x40\x5e\x19\xe9\x80\x1d\xf2\x8e"
+ "\x06\xd7\xcd\xbc\x3d\xc1\x65\xc7\x7c\x79\xdd\x84\xa8\xef\x52\x37"
+ "\xd1\x17\xba\x61\xb8\x7a\x28\xf9\xff\xaa\xa6\x6b\x00\xdf\x81\x67"
+ "\x3a\xac\x57\x48\xdf\xd3\x49\xf4\x0d\x09\x6d\x7c\x21\xf1\xb0\x91"
+ "\xf7\xd1\x9e\xce\x0c\xe4\xe3\x3e\xd1\xd7\xaa\x44\xd8\xbf\xd0\x9c"
+ "\x3d\xc1\xcf\x95\x87\x83\xcb\xff\x74\x59\x68\x7e\x3e\xbd\x07\xf9"
+ "\x59\x19\x9a\x9f\x4f\x1f\x19\x9e\x9f\x4f\xb7\xd1\x5a\xf5\xa1\x75"
+ "\xea\xe9\xb3\x86\x8d\xdc\x47\xe1\x69\x2e\xc1\xca\x7b\xbf\x5d\xfb"
+ "\xb4\x32\x26\xb8\x7d\x7a\xda\xf3\xdd\xdb\xa7\x95\x59\xa1\xdb\xa7"
+ "\x95\xa6\xd0\xed\xd3\xca\xdd\xa2\x3e\xac\xb4\x06\xd7\x87\x95\xcd"
+ "\xc1\x3a\x81\xbc\xfb\xde\xda\xa7\x7c\xbd\xa2\x0e\x54\x9f\x87\xfc"
+ "\x1a\xf4\x29\x24\x5b\x58\xf0\x58\x30\x8d\xf9\xd3\x43\xcb\x2d\x3f"
+ "\x19\xe5\x56\x1d\x5a\x6e\xf9\xb9\xc3\xcb\x2d\xbf\x02\xe5\x56\x3d"
+ "\x54\x6e\xf9\x75\xdf\xdd\xa7\xc8\x6f\x0f\x96\x59\xfe\xb1\xef\x2e"
+ "\xb3\x82\x88\xd0\x32\x2b\x88\x0b\x2d\xb3\x82\x44\x21\xb3\x82\xb2"
+ "\x60\x99\x15\x64\x06\xcb\x0c\xf9\xf6\xbd\xc9\xac\xa0\x4d\x21\xb3"
+ "\xf5\xe7\x61\xd5\x02\x94\x59\x97\x90\xd9\xea\x91\x0a\x1a\xed\xa1"
+ "\x65\x56\xe0\x46\x99\xad\x0f\x2d\xb3\x55\x31\xc3\xcb\x6c\x15\xed"
+ "\xa1\xb1\x7e\xa8\xcc\x56\xa5\x7c\x77\x99\xad\xaa\x08\x96\xd9\xaa"
+ "\xfc\xef\x2e\xb3\x55\xd6\xd0\x32\x5b\xd5\x1d\x5a\x66\xab\x1c\x42"
+ "\x66\xab\xe3\x83\x65\xb6\x5a\x17\x2c\x33\xe4\xdb\x3f\x29\x33\x94"
+ "\x4f\x97\x98\xaf\xbb\xfa\xc5\x7e\x3e\xa6\xbd\xba\xca\x0e\x85\xd2"
+ "\x7a\xf6\x42\xae\x3b\x92\x0c\xdf\x46\x98\xb2\xa1\x6d\xf7\xea\x06"
+ "\x29\xec\x89\xa1\x72\x58\x7d\x02\xdb\xd5\xbe\xb6\x0a\x3e\xaf\x4b"
+ "\xc8\x90\x78\x8e\x70\x62\x8c\x6c\x35\xb7\xff\x28\x63\x46\xfb\x0a"
+ "\x53\x5b\x8c\xf0\x4e\xc2\x43\xfb\xaa\x04\xe3\x2a\xd4\x7e\x17\xbf"
+ "\x6c\xf8\x39\xe6\xcb\xbb\x68\xef\xff\xf3\x50\x34\x5e\xe8\x6a\xa1"
+ "\xd2\xff\x6d\xc2\xbc\x2e\x0a\x3d\x7d\x46\x31\x66\x52\x38\x8c\xff"
+ "\x5b\x48\xfe\x6f\x53\x68\x3d\x2d\xbc\x8e\xff\x5b\x48\xfc\x68\x0a"
+ "\xe8\xaf\x46\xa3\x07\xa8\xe8\xaf\x16\x7a\x22\x9d\x42\x77\xb8\x1f"
+ "\x5b\xb3\xbc\xcb\x65\x2e\x8a\x53\xd0\x8c\xb2\x29\x3a\x2c\xd1\x7c"
+ "\x20\x38\x7d\x51\x62\x68\x9a\x8b\x32\x91\xe6\xb7\x43\xd3\x5c\x64"
+ "\x1a\x9e\xe6\xa2\x3d\x48\xf3\xdb\x43\xeb\x56\x51\x8b\xa4\x07\x21"
+ "\xfa\xe5\x45\xd6\xd0\xf2\x2f\x52\xc8\x1f\xb2\xca\x2a\x98\x83\xa7"
+ "\x0f\x82\x7b\x06\x02\xe1\x68\xae\x3e\xc1\x92\x8e\x84\x80\x9d\xae"
+ "\xc4\x39\x0c\x5c\xe6\x10\xdd\xa3\xb5\x05\x21\x75\xef\x99\x2a\x51"
+ "\x1f\x9f\xe9\x0e\xae\x8f\xcf\xd4\x07\xd7\x47\xe4\x75\x70\xba\x13"
+ "\xc1\xf1\x85\xbb\xbf\x3f\x1b\xbb\x26\x5e\xa1\x03\xef\x9e\x87\x35"
+ "\x3f\x17\x3a\xb0\xc6\x1b\x4c\xc7\x9a\xa4\xd0\x3a\xb0\x26\x0b\xcb"
+ "\xff\x6e\x68\x1d\x58\x53\x36\xbc\x0e\xac\xb1\x20\x2f\xdf\x0d\xd4"
+ "\xdb\xa5\x15\x49\xe1\x0a\x98\xe3\xa1\x6d\xde\x9a\xd3\xa1\xc7\x75"
+ "\xd6\xf4\x08\x1e\x17\x4f\x0c\xe6\xf1\x1a\x4f\x30\x0f\xb1\x2c\xff"
+ "\x3c\x0f\x07\xcf\xca\x70\x99\x8b\x95\xf5\xdf\x76\x1e\x8a\xa5\xfa"
+ "\xbf\xf6\xf3\x60\x1a\x8b\xa5\xfe\x4f\xa8\xb1\xac\xe2\x16\xe4\xa5"
+ "\x2d\x34\x2f\x8b\xad\xa1\xcb\x5c\x4c\x6d\x90\xcd\x37\xa4\x2e\x15"
+ "\x3b\x30\x7c\x29\x7d\x3b\xa0\x31\xac\x46\x0c\x5f\xea\x01\x1d\x6f"
+ "\xaf\x06\xdb\xa5\xb5\xb4\xf7\x11\xe3\x63\xcc\xa8\xbf\x91\x13\x21"
+ "\x83\xda\x20\xa2\x2b\xa7\x42\xf9\x4d\x74\x6d\x12\xd1\x4d\xf3\x58"
+ "\x68\x5d\x4d\x64\x39\x64\xd8\x9c\x1e\x90\xf5\x9d\xe0\x15\xb8\x4d"
+ "\x54\x2f\x08\x5e\x86\x15\x63\x9d\x55\x0a\xdb\xb4\xb6\x3e\xb4\x8c"
+ "\xd7\x1e\x1b\x5e\x77\xd6\x9e\x16\x72\x5e\x07\xc1\x72\x5e\xdb\xe3"
+ "\x33\x8f\xcd\xa4\xb2\xa2\x0e\x7c\xa7\x7a\x42\xdf\x4e\x87\xb5\xf7"
+ "\x3b\x96\x75\x9b\xb6\xc1\xa4\x0b\xb0\xae\x90\xe7\xa7\x66\xe8\x53"
+ "\xa8\xa0\x8d\xdb\x80\x75\xef\x70\x3a\x11\x26\xc7\x03\x6a\xb6\x63"
+ "\x4d\x37\xc5\x35\x99\x99\x9b\xce\x8d\x91\xcf\x80\x41\x5d\xb8\xe1"
+ "\x1c\xac\xdb\x1e\x94\x1e\x5b\x23\x9b\xc0\x71\x52\x8c\xef\xaf\x3b"
+ "\x21\x8f\xc3\x0f\x37\xbe\x8f\x30\x67\xe5\x79\xbf\xe2\x5b\xd8\xba"
+ "\xae\x61\xdb\x65\xa4\x89\xd6\x8e\x13\x4d\xd7\xb7\x03\xeb\x8d\xb2"
+ "\xfe\x8a\x6f\x73\xeb\x93\xfc\x6b\x5b\xd6\xa7\x62\x9c\xf3\x3a\xe3"
+ "\xb9\x01\xf5\x60\x7d\x79\x20\x1e\x71\x5e\xcc\xfa\x3d\xf2\xfa\x14"
+ "\x7c\xae\xff\x06\x5c\x32\x3d\x56\x05\x3d\x5d\xd8\x5f\x70\x4a\x38"
+ "\xce\x7e\x03\x8e\x18\x5b\xcb\x1c\x98\xe1\x03\xcd\x05\x28\x99\x46"
+ "\xe7\xcf\xd8\x1a\x7a\x21\xc2\x03\x5a\xd1\xb7\x33\xdd\x4d\x6b\x43"
+ "\xa8\x6f\x68\xf3\xcc\xb3\xd2\x37\x38\x3e\x87\x20\x76\x9e\xb5\xa3"
+ "\xdc\x2b\xed\xc1\x66\x7a\x80\x78\xda\x51\x78\xd9\xda\xb0\x9f\xf5"
+ "\x1e\xe2\x7b\x6f\x99\x82\xfa\x7f\x7b\x68\xfe\x0f\xcd\xc3\xd8\x06"
+ "\xf3\x10\xfe\x2f\xa2\xae\x97\x28\x7c\x52\xd3\x30\xfd\x3f\x13\xf5"
+ "\xff\xe6\x85\xae\xe7\xa6\xeb\xf4\xff\x4c\xd4\xff\x9b\x17\xd8\x6e"
+ "\x8a\xef\x3c\xa6\xb3\x81\x3e\x29\xed\x8f\x65\x58\x45\x7e\xe6\xb3"
+ "\x8f\xde\x55\x07\x7a\x0f\x7d\xd3\xc6\xba\x69\xeb\x6d\xa3\xfa\xaa"
+ "\xef\x70\x9c\xa0\x7d\x18\x74\x63\x4d\xa4\x8b\xd4\x96\x51\x7d\x7d"
+ "\xd6\xc0\xdb\x32\x8f\xa8\x8b\x95\xe5\xcc\x31\xbd\x07\x75\x68\x7d"
+ "\xa1\x8c\x2b\x62\x6b\xa1\x58\xf7\x31\xb6\x07\xc2\x6d\xbd\xbc\x5d"
+ "\x54\x91\xbf\xca\xfd\x56\xcf\x15\x20\xbc\xad\x15\x1d\x40\x78\x7d"
+ "\x83\xed\x24\xc7\x5d\x41\x75\x9c\x70\x12\xee\x4e\x84\x23\xbc\x04"
+ "\x27\x97\x43\xac\x8d\x79\xb6\x25\xb0\xec\x7c\xfc\x05\xf3\xc6\xf0"
+ "\xcf\x68\x5c\xc5\x46\xe9\x2a\x97\xb1\x19\x3d\xf4\xcd\xec\xb2\x95"
+ "\x55\xae\x61\x33\x4a\x68\x4c\xac\x84\xce\x81\x56\xbd\xfd\x77\x7b"
+ "\x58\xd9\x64\xd0\x89\xb0\x67\xfb\xda\x0c\x6e\xb0\x43\x89\x31\xd8"
+ "\x46\x94\x28\xfc\x5f\x13\xef\x67\xe2\x5d\x4b\xf3\x13\xa5\xf9\xab"
+ "\x64\x0f\x98\xcd\xe3\xe2\xfa\x71\xbd\x39\x15\xf4\x4d\x9a\xe6\x44"
+ "\x89\xfd\xdf\x4a\xca\x15\x63\x6f\x8e\x7d\x7c\x5e\xcd\x5f\x31\xdf"
+ "\xd2\x30\xa1\x23\x65\x61\xc1\x32\x2d\xa9\xaf\xbc\x48\xdf\x82\x44"
+ "\x7b\xb0\xc2\xa3\xb4\x8f\x25\x27\x64\xdf\x4d\x11\xde\x25\xb7\x07"
+ "\x86\x75\x84\xb7\x54\xd1\xce\x94\x70\xff\xdf\x3b\xa4\x5d\x28\x25"
+ "\xbb\x1e\xa4\x93\x9d\x5c\x87\x4a\x0d\x1d\x4e\xd4\x9b\x12\xd2\xff"
+ "\xd2\x03\x08\xb3\x9d\xd6\x1c\xe2\x7b\xf8\x25\x28\xcd\xf0\x9a\x41"
+ "\xd7\xe1\xe0\x6b\xaa\xf4\xa8\x23\x5c\x6f\xa9\xdd\x98\x29\xe6\x23"
+ "\x39\x15\x79\x14\xcb\x3c\x27\x98\xce\x92\xbf\x82\x98\x4f\x41\xba"
+ "\x50\x9a\x44\x73\x33\xc6\xf6\xf1\xbd\xb6\xf4\xb2\x0e\xd9\x3c\xdd"
+ "\xd0\xe9\x51\xf6\x79\x4a\x8f\x87\x2e\x7b\x29\xb5\xff\xb5\x76\x28"
+ "\x8b\x0b\x96\x6d\x29\x6f\xff\xe5\xef\x3a\x28\x7b\x47\x70\xba\x32"
+ "\x6d\xb0\xec\x4b\xea\x29\x7e\xd8\x39\x3e\x96\xe5\x67\xb0\x3f\x93"
+ "\xe3\xe4\xf3\xbd\xca\xb0\xfe\x97\x64\x5e\xcf\x0e\x32\xfd\xf2\x33"
+ "\x3e\x84\x95\xe6\x05\xa3\xdd\x2a\xdb\x1d\x34\x66\x34\x8e\x8f\x19"
+ "\xe5\x9c\x87\x0d\xd2\xb7\x9f\x0d\x1d\x0a\xfa\x5a\x86\xf7\x0d\xca"
+ "\xe8\xfb\x4f\x4e\x68\x9b\x51\x76\x36\xb4\x6f\x50\xe6\x94\xec\x42"
+ "\x0e\x8b\x52\xea\xc1\x06\x5a\x4f\xc7\xd3\xc8\x7d\x58\x1a\x0b\x1d"
+ "\xbe\x0f\xbb\x21\x69\xb0\x0f\x5b\x42\xf6\x60\x43\xfc\x60\x1f\xd6"
+ "\x11\xaa\x0f\x6b\x0f\x21\xcf\x0d\x3b\x43\xcb\x73\x43\x43\xe8\x3e"
+ "\xec\x86\xe3\xa2\x9d\xdf\xd0\x1b\x2c\xe7\x0d\xa7\xfd\xdf\x84\xcb"
+ "\x5a\xbe\x3f\x7f\x78\xe3\xec\xa1\xfe\xf0\xc6\xdf\x0a\x59\x6d\xbc"
+ "\x12\x4c\xdb\xc6\x8c\xd0\xb6\x7d\x63\xe1\xf0\xfe\xf0\xc6\x9d\xc3"
+ "\xdb\xf6\x8d\xcd\x43\xfd\x61\xc3\x08\x05\x4c\xdb\xa0\xaf\x14\xe4"
+ "\x9b\x6d\x3c\x2b\xf8\xb4\x89\xfc\x39\x4d\x00\xbc\x33\x58\xdf\x91"
+ "\x66\xc4\x87\xb6\xed\x02\xd9\x34\x59\x67\x86\xe3\x09\xed\xbd\x74"
+ "\x5b\x1d\x8c\xc4\x3a\xf0\xae\xcb\xbc\x69\x50\xff\x69\x1e\x1f\xe5"
+ "\x43\x36\x72\xd8\xf9\x74\x6a\x99\x3e\xa2\x63\x53\xc5\xf5\xbe\x97"
+ "\x6a\x62\x21\xe3\xe5\x21\xfc\xd8\xc4\xfd\x3f\xc2\x71\x7d\x99\x6d"
+ "\xea\x53\xd4\x31\xa7\x98\x87\x5b\xfe\x7b\x21\xb7\x72\x45\x5f\xb6"
+ "\x5c\xc7\xd7\xf4\x0d\x6b\x6f\xcb\xe3\x43\xeb\x68\x79\xd2\xa0\xbd"
+ "\x2d\xe1\x78\x37\x2b\xe2\x73\x85\x0c\xca\x4f\xf8\xa2\x02\xc7\xba"
+ "\xcb\xcb\x83\x6d\x52\x79\xae\x22\x9d\xa2\xff\x57\xce\xe9\xf9\x76"
+ "\xed\x4d\x79\xef\xf0\xed\xcd\xe6\x0d\xa2\xfc\x5b\x14\xdf\x97\x37"
+ "\xeb\xae\xdf\xde\x6c\x1e\xa6\xfc\x9b\x93\x82\xdb\x9b\x2d\x8a\x6f"
+ "\xf4\x9b\x73\x43\xb7\x37\x9b\xcb\x65\x3b\x23\xec\xc6\xe6\x3f\x7d"
+ "\x3b\x7b\xb3\xf9\x58\xb0\xbd\xd9\x5c\xff\x4d\xf6\xa6\x75\x88\xbd"
+ "\xd9\xec\x8c\x6c\x08\x55\x96\x2d\x11\xa1\xed\xcd\x96\x38\x21\xc3"
+ "\x2d\x15\xc1\xf6\x66\x4b\x62\xb0\x0c\x37\x2b\x64\xb8\x45\xf1\xfd"
+ "\x7b\xb3\xee\x7f\xd7\x26\x69\x34\x1a\xb5\x46\xa5\x56\x69\x30\x0a"
+ "\x8b\x07\xe1\x1a\xad\x26\x0c\xaf\x11\xd2\x3d\x5c\xad\x51\x6b\xf1"
+ "\x0a\x93\xee\x23\x14\xef\xe1\x94\x16\x2f\xad\x74\x0f\x53\xbc\x8f"
+ "\xf8\x86\xf8\x70\x29\x5f\x39\x7f\xad\xe2\x3d\xec\x1b\xe2\x47\xfc"
+ "\x93\xe9\x61\xc8\x7b\xf0\x3a\xc8\x85\xeb\x36\xe6\x15\x17\xe5\xf3"
+ "\x79\xed\x05\x86\xbc\x95\x2b\x0b\x4a\x4b\x0d\x65\xeb\x0d\x0f\x3e"
+ "\xb0\xe4\x9e\x39\x06\x31\x3d\xbe\x78\xee\xd4\xfc\x51\x90\xb6\xa9"
+ "\x84\x22\xd2\x96\x2e\xcc\x32\x64\x3c\xf8\x40\x70\xa4\x8c\x86\x4f"
+ "\x83\xbf\x1e\x96\x80\xba\x97\xf4\xe2\x38\x80\x3d\xfb\xb9\xdd\xe9"
+ "\xa1\xb5\xe7\xa2\x3f\x51\xf5\x97\xd3\xb4\x7e\xf9\x5a\x25\xa3\x75"
+ "\x15\xe7\xa0\x62\x2b\x15\x22\xa1\xb9\x0a\x4c\x4f\xd3\x7e\x2a\x15"
+ "\x07\xd8\x1f\x1c\x60\x78\x04\xd4\xe7\x60\xd7\x17\x6d\x29\x08\x8b"
+ "\xef\x36\xbb\x07\x0c\x95\xe4\xdb\x56\xbd\x88\x71\x2a\x76\xbf\x0f"
+ "\xc3\x9c\xd2\xfa\xfc\xca\x03\x3c\xec\x0f\x55\x32\x5c\xe4\x79\xd8"
+ "\x3a\x97\xfd\x81\xf1\x77\xda\xb3\x46\xc0\x6d\x8d\x62\xea\xe7\xba"
+ "\xc8\x2e\x34\x44\x83\x96\xe6\x65\x1f\x88\x06\xdd\x81\x71\xb4\xe7"
+ "\xee\x56\xad\x3c\x2f\xfb\x45\x7c\xb7\xc3\xae\x5e\xca\x9b\x60\x7d"
+ "\xea\xe7\xae\x11\x7c\x63\x30\xfc\x2c\xff\x3c\xee\xad\x5a\x35\xc2"
+ "\xa5\x7f\x06\x91\x91\x5e\xf6\xa5\x3b\x3a\x53\x37\x23\x05\xfd\x34"
+ "\x14\xc5\x69\x4f\x15\x88\xb5\x51\x5b\xb7\x6e\xf6\x32\x0f\xed\x99"
+ "\x90\xd6\x57\xc9\xaa\xd7\x82\x16\xeb\xb3\xca\x5a\x42\x6b\x29\xb6"
+ "\xe6\x37\x15\x80\x16\xcb\x3f\xf1\x02\x6c\xab\x33\x2c\x46\xbf\x31"
+ "\x0d\xb4\x1f\x97\xd3\x7a\xd7\x9c\x3b\xf7\xfd\x19\xb4\xbf\xba\x56"
+ "\xa5\xbe\xc6\x62\xa1\xa2\x8c\xf5\x32\xda\x87\xdb\xc9\xdc\x34\xdf"
+ "\xf6\x74\xae\x97\x60\x26\xb8\x2a\x63\xa1\x13\xdd\x97\xad\x67\x99"
+ "\x7b\xf7\x9f\xc5\x7e\x15\x1d\x7d\x4e\x5a\x3f\xab\xdb\x9a\x06\x9a"
+ "\xf3\x59\xa0\xee\x28\xac\x07\x5b\xb6\x13\x2a\xce\xb2\xde\xd3\xb9"
+ "\x9f\x43\x67\xe1\x31\xc8\xe9\x06\xf5\xe9\x9e\xbf\x01\xdf\x4b\xba"
+ "\xf6\xc3\xe6\x6d\x57\x20\x76\x6b\x11\x85\x5d\x81\x2d\x5b\x61\xcc"
+ "\x96\x4f\xa8\x1f\xd4\x8d\xf9\x5c\x84\xa7\xce\x80\x0a\xf1\xa9\x9f"
+ "\xfb\x1b\xc4\x3e\xf7\x24\xad\x33\x4f\x82\x86\x6d\x10\xcb\x2a\xe3"
+ "\x23\xae\x55\xc6\xeb\xaf\xb1\xf8\x68\x57\x65\x7c\x4c\xa7\x09\xe1"
+ "\x7b\xde\x81\xb1\xdd\x10\xf3\x87\x0b\xdd\xea\xfa\xaf\x60\x22\x95"
+ "\xe9\x3c\x96\xad\xe1\x2b\x84\xaf\x3d\x64\xf0\x61\xda\xc0\x34\x9e"
+ "\xa8\x43\xb3\x6d\x59\x6e\xf0\x21\xae\xfa\x6b\x30\xb1\xe1\x1a\xc4"
+ "\xfa\x6a\x0e\x19\x28\x5d\x1f\x54\xd6\xd8\x4e\x03\x6a\x0a\xf3\x0e"
+ "\xd4\x66\xd3\xb8\x49\xf8\xdb\x4f\x9f\xd0\xda\x4e\xf7\x41\x87\xf3"
+ "\x1a\x74\xc2\x5f\xc1\x56\xfe\x0f\xeb\xaf\x9e\x3e\x11\x86\xfe\xa4"
+ "\xca\xba\x85\xe6\xc0\x0b\xdd\xa9\xec\xa0\xfd\xf3\xaa\xa0\x7a\x1b"
+ "\x44\x98\xb6\x40\xf8\x05\x0c\xe7\xb6\xc7\x92\x8e\x7d\xb0\x7f\x58"
+ "\xb7\xf0\xf5\xe0\xbb\x7a\xb7\x75\x80\xa6\xd3\x59\x4f\xeb\x8e\xd5"
+ "\xde\xe8\x0f\x9b\x6d\xce\x2e\xb0\x99\x3e\xb5\xfa\xf4\x1f\xee\xde"
+ "\xe3\x03\xdd\xaf\xaf\x76\xa9\x6d\xda\xab\x60\xcb\x72\xc2\xbb\x98"
+ "\x37\xab\xfd\xf0\x28\xda\xac\xa4\x4e\xa7\x9b\xf6\xdf\x31\xb2\xfe"
+ "\xd8\x51\xd5\x25\x30\xbd\xf1\x2b\x88\x3b\xf4\x15\xc4\x33\x57\xbc"
+ "\x9a\xd6\x78\xd3\x7e\x69\x87\xf0\x1e\x81\x7d\x30\x2c\x3b\x5f\xeb"
+ "\xcd\xa2\xa4\xb5\xde\x03\xf1\xd0\x74\xcd\xbf\xd6\xfb\x5a\xbf\x7f"
+ "\xad\x37\xea\x94\x8e\xd6\x7b\xdb\x61\x5b\x43\xe4\x69\x08\xc7\x7a"
+ "\x62\x25\xfd\xae\xbe\x04\xda\x1d\x97\x00\x66\x54\xa9\xa9\x9f\xa9"
+ "\xc5\xfa\xb0\xd5\x86\xb2\xa1\xe7\x73\x50\x35\x0b\xef\x11\x78\x61"
+ "\x7f\xae\x8a\xef\x55\xd1\x23\xe9\x31\x86\xa9\x31\xec\x16\xbc\x6b"
+ "\xf0\x7e\x63\x65\x03\x73\x60\x5e\xb4\x96\x62\x14\xe9\xb3\xb4\xbe"
+ "\xbc\xd7\x65\xae\x8a\xb0\xc3\xd1\x62\x59\xaf\x85\x7d\xdf\xaa\x7b"
+ "\xf7\xdc\x45\xda\xef\xdd\xc1\xe9\x1a\x28\x54\xd1\xde\xef\x52\x38"
+ "\xd1\xb0\x81\xf2\xc5\xfc\xb3\xf0\x1e\x29\xfa\xa0\x95\x7d\x72\xda"
+ "\xfe\x81\x42\xca\x73\x2d\x86\x33\x39\x1c\xcb\xad\xa5\xb8\x7f\x3b"
+ "\x77\x51\x2d\x60\xe2\xd5\x88\xd3\x2d\xe1\xc7\xba\x5f\x71\x94\xea"
+ "\x78\xbf\x3a\x92\xb5\xe6\xce\x82\x86\xfd\xec\xf4\xa1\xfd\xac\x4d"
+ "\xd4\xbd\xaa\x63\x76\xf8\x17\xbe\xf7\x24\xb6\xe1\x6d\x7b\x30\xae"
+ "\x15\x7b\xe3\xc4\x97\xb6\x7c\x9a\x5f\x5a\xd5\x65\x87\x29\x31\x81"
+ "\x65\x60\xe6\x2d\xc7\xa8\x1d\xfd\x97\x6d\xed\xd8\x9f\x7c\xee\x58"
+ "\x67\x4f\x1f\xfc\xea\x5a\x6f\x58\xe5\x47\xa0\xb6\x79\xce\xc1\xcc"
+ "\x18\x71\x4e\x4e\xd3\x7e\x66\x7f\x99\xce\x0f\xde\xcf\xfa\x50\x5f"
+ "\x6e\xb9\x00\xdb\x6f\xb9\x2b\x06\x62\xfe\x88\x5e\x89\xb0\x4f\xdb"
+ "\xef\x0d\xb0\x4f\xef\x74\xd8\x4f\x04\xd8\xa6\x5d\x6b\x87\xda\xa6"
+ "\x9d\x45\xc2\x36\x61\xdd\xe7\xb6\xc8\x6b\x97\xc2\x1f\x53\x84\x4b"
+ "\xeb\x57\x76\xde\xa7\x08\x77\x4b\xe1\x53\x15\xe1\x0e\x11\xbe\xa3"
+ "\x40\xb6\x7d\x9d\x44\xc7\x26\xb2\x7d\x3b\x16\x92\xed\xeb\xcc\x95"
+ "\x6c\x1f\xb7\x3f\x3b\x12\xd8\xeb\x68\x8b\x36\x92\xbd\xd9\x11\x46"
+ "\xf4\xb3\x3f\x80\x4c\xfb\xc8\xf3\x60\xfe\x80\xc2\x2c\x7f\x05\x2d"
+ "\x5e\x92\xdd\xab\xb8\x89\xec\x1e\xd9\x3c\xb2\x7d\x07\xc7\xb1\xee"
+ "\x83\xfb\xd9\x99\x06\xbe\x6f\xb5\x79\xd0\xfe\xbd\x84\x61\x7b\x30"
+ "\xec\x25\x8c\x27\x3b\x48\x3c\xe9\xc8\x3a\x01\xfc\x5c\x1b\x4b\x4e"
+ "\xbc\x4f\x6d\x84\x7d\x28\x6f\xda\xff\x6a\x27\xf2\x37\x52\x05\x26"
+ "\x5b\x99\x93\xaf\x43\xa1\xbd\xd2\x3b\xcb\x7a\xa8\xde\x8d\xdb\xe1"
+ "\xa3\x71\x8a\xcf\x61\x9b\x93\x5d\xa0\xb5\x2a\x44\x43\xce\xe6\x47"
+ "\x68\xaf\x6f\x55\x5b\x21\x00\xed\x4b\x40\x36\x1b\x69\xd1\x5a\x90"
+ "\x26\xb1\xb7\xb0\xf9\xa4\x1d\x3e\x95\xf4\x75\x17\xad\x55\xc3\x36"
+ "\x05\x3b\xe2\x66\xb4\x8f\x58\xb6\x48\x6f\x15\xd0\xde\x2c\x74\xbe"
+ "\x26\xdd\x0f\xaa\x7d\x85\x16\x79\x7f\x16\x33\xda\x06\x84\xb1\x75"
+ "\xbb\x81\x68\xb6\x83\x39\xb5\xa3\xe2\x04\xa6\xdf\xee\x20\xde\x30"
+ "\x73\xa5\x8c\x43\xc5\x71\xa8\xf9\xd8\x6d\x21\xc2\xd9\x85\x7f\x93"
+ "\xad\xeb\xc8\x76\x00\xd9\x7d\x5b\x2f\xe2\xa8\x38\x27\x70\x20\x2e"
+ "\x86\x6d\x40\x50\x9c\x84\x7f\xcc\x56\xf6\x25\xe2\x3f\x49\xf2\xa2"
+ "\x7d\xba\x68\x9e\x12\xf2\x25\x82\xf6\x6a\x10\x7e\xa8\x79\x41\xd3"
+ "\x5f\x01\xa4\xbd\xc6\x50\xdf\xcc\xc9\xb4\x97\x17\xed\x2f\x76\xbd"
+ "\xbd\xc5\x90\x47\x71\xf2\xfe\x62\xbe\x4d\xdf\xef\xde\x62\x88\x3b"
+ "\xb6\x51\xcd\xb0\xce\x99\x93\x69\x7f\x31\xa4\xbf\x85\xf4\x50\x2a"
+ "\x53\xca\x2b\x4f\x11\xcf\xb7\xef\xa1\xb0\x6a\x33\x6b\x97\xe5\x4f"
+ "\xe5\xa5\xb2\x60\x9c\x49\xf8\x87\x0c\xeb\xe5\xce\x14\x8a\xc7\xb0"
+ "\x6c\x82\x9f\x89\x76\xcc\x86\x6d\xd8\xdb\xe7\xbc\xea\xea\x2d\xa0"
+ "\x15\x36\x6d\x57\x1e\xa5\x17\x36\x6d\x57\xac\xdf\xa6\xed\x1a\x23"
+ "\x6c\x9a\xe0\xb1\xb0\x69\xbb\x54\xc2\xa6\xed\xfc\x9a\xcf\x27\x42"
+ "\x9b\x46\x71\x64\xd7\x64\x9b\x76\x68\x1c\x6b\x27\xdb\xe1\x32\xef"
+ "\xec\x95\x6d\xdb\x5e\x0c\x23\xdb\x41\x34\x0a\x3b\xb5\x23\x89\xfd"
+ "\xcf\x78\x10\xf3\x35\xe9\xb9\x90\xf6\xcf\xe8\x95\x9e\xa9\x3d\x79"
+ "\x52\xd8\xb8\x5d\x89\x7e\x1b\xb7\xd3\xea\x4f\x4b\x36\x6e\xd7\xa3"
+ "\xc2\xc6\x89\xf0\xa6\xa7\xc8\xc6\xed\x48\x22\x1e\x48\xf8\xd5\xf4"
+ "\x1d\x4d\x82\x27\x3e\xa6\x04\xda\xb8\xe0\xfa\xb5\xab\x4e\xb6\x71"
+ "\x64\xdb\xf0\xbd\xc5\x0e\x93\xf9\xb8\x30\xd5\xb3\x3a\xe4\xb9\x5c"
+ "\xef\x48\x06\x54\x66\x3a\x3f\x80\xf8\x36\xff\x22\x84\x4b\xfb\xd6"
+ "\x48\xe5\xde\x65\x97\xd7\x68\x22\xff\x87\xee\x69\x06\xfe\x7d\xc9"
+ "\x50\xd6\xb7\xd2\x7e\x8e\xb6\xaa\x73\x60\xab\x67\x55\x9d\x9e\xb3"
+ "\xe0\xdb\xb1\xe6\x33\x92\x2b\xf6\x37\x7e\x4a\x77\xb2\x3b\x17\xe0"
+ "\xf9\xc9\x39\x4e\x3e\x7e\xff\x59\xb5\x1a\xe3\xca\x83\xe2\xe6\x52"
+ "\x1e\x34\xae\x88\xcf\xba\xe1\xc6\x11\xbe\x43\x5e\x7b\xaf\x93\xd7"
+ "\x9b\x3c\x2f\xf4\xa5\xb0\xdf\x13\x75\x09\x9e\xe7\xdf\xd0\xf8\x9e"
+ "\xcc\xa1\x71\xfd\x45\x8a\xd7\x0c\x13\xff\xf5\xf5\xd3\xbf\x30\xfe"
+ "\xfa\xe9\x5f\xb8\x8f\x6c\x10\xad\xc7\xf3\x9a\x83\xf1\x8c\xf5\xc8"
+ "\x70\x17\x08\x2e\x4f\xfa\x0e\xf2\x59\xe5\x64\xde\x2f\x8b\x95\x71"
+ "\x92\xde\xed\x43\x38\xbe\x7f\x2d\xda\xc8\xe4\xcd\x40\x7b\x07\x07"
+ "\xa6\x3d\xe4\xe7\xef\x0b\x19\xd7\x19\xa7\x89\xb0\x61\x2f\x90\xce"
+ "\x97\x6f\xc5\x56\x90\xd6\xd2\xd4\x0d\x7e\x7b\x78\xc1\x89\xf6\x92"
+ "\x9f\xdf\x2a\xad\xdb\xed\x43\xfb\x76\x2b\xed\xb1\x49\x7e\xa5\xb4"
+ "\xd6\xe2\x26\xb4\xcb\xd1\xb4\x0f\x0b\x8d\x57\xe7\x78\x33\xd4\xad"
+ "\x7c\xff\xfd\xdd\x46\x39\xed\x70\x63\x7b\x94\xaf\x94\x27\x5f\x87"
+ "\x84\x69\xf2\xe5\x34\x84\x9b\xd6\xde\x60\x7b\x7c\x2b\xdf\xdf\xcc"
+ "\xd3\x47\x36\xf0\x26\xf4\x41\xa3\x45\x3e\xb9\x20\xe5\x53\x6f\x87"
+ "\xe7\xf3\xaf\xb7\xce\x69\xf8\xf2\xed\x3e\xf3\xdd\xcb\x07\x52\xf9"
+ "\x5e\xd4\x7f\x43\xf9\xae\x93\xef\x8b\xa9\xdf\x3d\x5f\xbd\x9c\xef"
+ "\xee\xef\xce\xd7\x17\x4f\x7e\x7b\xbe\x1a\x25\xbe\xbe\xe8\xf8\x06"
+ "\xbe\x86\xc8\xe7\x67\x71\xdf\x3e\x1f\x83\x94\xcf\xcf\xb2\x42\xe5"
+ "\x03\xfc\x37\xec\x7e\x3d\x3a\xf9\x8c\x18\xe9\x5c\xe2\x91\x88\xa7"
+ "\xd9\x0e\xbb\x07\xcf\xb0\x12\xe7\x25\xfd\xec\xb8\x1d\x5e\xac\x0b"
+ "\x5e\xc7\xf5\xb3\x3f\xe5\x34\x53\xbb\xce\x7c\x76\xf8\xd9\x19\x1a"
+ "\x6b\x4b\xde\x2a\xf6\x07\x94\xd2\xa0\x3d\x7f\x71\xe2\xf5\xbe\xa7"
+ "\xf1\xb3\x30\xa4\xbd\x3b\x68\x7d\x2a\xab\x6d\x80\xfe\xca\x42\x10"
+ "\x67\x45\xbf\x74\x37\xad\x43\xc2\xe7\x70\x7c\x16\xe3\x50\x74\xbe"
+ "\x80\xd8\x93\x62\x04\x86\x6d\xa7\xf3\x27\xc4\xfa\xbd\x97\x32\x91"
+ "\x06\xbe\x07\xbb\xd8\x63\x9f\xef\xed\xe2\x44\x38\x35\xa5\x15\x7b"
+ "\x7a\xbc\x54\x2e\xc3\xd8\x65\x7c\x83\xfb\x5b\xbc\xb4\x50\xb4\x2d"
+ "\x2f\xa5\xf4\x0f\x73\x8e\x11\xed\x73\xd6\xb2\xcd\x18\xb4\xfe\x70"
+ "\x41\x49\xc9\xfa\x92\x39\x86\xd2\xb5\x4f\x27\x94\x96\xe5\x95\x6d"
+ "\x28\xe5\x0b\xd5\x47\x01\x06\x18\xca\x8a\xd6\x16\xac\xdf\x50\x16"
+ "\xbf\x29\xaf\x48\x2c\x6c\x9f\x86\x80\x81\x40\x10\x7c\x6e\x24\xda"
+ "\xa0\x2e\xa6\xe6\x7b\x50\xf0\xb3\x23\x69\x2f\x12\x79\xdd\x6e\x5b"
+ "\x2c\x3f\x63\x0b\x6d\xd6\x9e\x44\x3b\xac\xef\x95\xe5\x40\xfb\x23"
+ "\xa2\xdf\x12\x7b\x01\xf6\x3c\x49\xba\x93\x8e\x2e\x68\x93\xd8\x57"
+ "\x82\xef\x0d\x60\x2b\xc3\x80\x4e\xd0\x59\x37\xd2\x38\xec\x9e\x2e"
+ "\x9f\xf9\x25\x2b\xdf\xef\x71\xcb\x05\x7a\xbf\x22\xfb\x09\xf4\x5d"
+ "\x49\x7c\x07\xbe\x75\xde\x39\xd8\x33\x95\xf2\xa5\x7a\xd7\x58\x2b"
+ "\xce\xea\x66\xe6\x97\xba\x69\xad\x36\xbe\xeb\x90\x06\xab\xec\x8b"
+ "\x22\xbd\x11\x2c\xaa\x41\x67\x87\x3d\xce\xf7\xf5\x0e\x90\xd6\x7a"
+ "\xeb\x1a\xc5\xba\x6e\x2d\xc2\xf6\x0d\xc2\x9a\x69\xdf\xe3\x06\x1d"
+ "\xb6\x9b\x21\xbf\x65\xb3\xe8\x22\xda\xeb\x2c\x2c\xb0\xcc\xd8\xaf"
+ "\x46\xf9\xed\xfd\x39\x96\x3d\x46\xd6\x15\x21\xfb\xbd\x7b\xc5\xde"
+ "\xcb\x45\x3a\x0c\x1b\x81\x77\x43\x3f\xc6\xd1\x1e\x08\x18\x97\x4b"
+ "\xdf\xc8\x3a\x2b\x2e\x5b\x5b\x63\xcf\xa1\xdc\xf7\x9a\xec\xb0\x71"
+ "\xa2\x58\xb7\x86\xf0\x98\x87\xad\xea\x1a\xb4\x19\x98\x95\xc6\xe8"
+ "\xec\xb0\xf7\x64\x9b\xc1\x09\x4c\xb3\xec\x33\x4a\x87\xf5\x2a\xb6"
+ "\xb2\x9c\x7c\x11\x0c\xe7\xeb\xf3\xf6\x1e\x93\x79\x5e\x66\x60\x17"
+ "\x09\x66\xb8\x71\x65\x6a\x2f\xab\x79\x5b\xf2\x15\xd0\x1c\xac\x1e"
+ "\xd8\x7b\x46\xd9\x5e\x4c\xcd\x9f\x63\xc8\xcf\x2b\x33\x14\x17\xad"
+ "\x2b\x30\xe4\x17\xe5\x1b\xd6\xad\x2f\x33\xac\x5e\x4f\x03\x3c\x34"
+ "\xa4\x13\xa4\x13\x3e\x2a\xdf\xa6\xac\x30\xf9\x1b\x76\xff\xa6\xc2"
+ "\x11\x42\xa7\xab\x13\xfa\x5d\x85\xe1\xc1\x3c\xa9\x8e\x12\x6d\xe5"
+ "\xbe\x5c\xa4\x5d\x2b\xd6\xff\x69\xb0\x8f\xb9\x0f\xcb\xbf\xb7\x3d"
+ "\xb8\xee\x56\x2f\x97\x60\xf7\xc8\xb0\x5c\x2f\xa6\x5c\x18\x8c\xab"
+ "\x96\xf4\xb1\x49\xac\x53\xe6\xfb\xde\x34\xf1\x39\xfc\xfb\xac\xc3"
+ "\xa6\xa1\xbd\xbe\xb6\xc0\xca\x4b\xb0\xef\x4d\x66\xde\xeb\x94\x74"
+ "\x48\xe7\xb3\x14\xc5\x4a\xfa\x83\x3a\x51\x0d\x43\xf5\xa7\x3a\x9b"
+ "\xf4\x87\xb9\xb2\x74\x7c\xbe\x87\xc7\x8d\x76\x0e\xdf\xb1\x7d\xb6"
+ "\xc3\xbe\x7c\x2a\x87\x73\x53\x96\xae\xf2\x00\xdf\x7f\xef\x0b\xfa"
+ "\x76\x4a\xe7\xd3\xa0\xae\x8c\x14\xe7\x68\x56\x67\xca\x32\x92\xe1"
+ "\x43\xd7\x61\xae\x2f\xc1\x3a\x26\xf8\xf9\x6b\xae\x63\xe8\x1f\x20"
+ "\x4d\x6a\x79\x9f\x3f\x6a\x43\x90\xb6\xb6\xb2\xad\x8c\x61\x1e\x27"
+ "\x02\xf4\xe0\x52\x28\x3d\x40\xd9\xae\x2c\x5e\xbf\x72\x0d\x56\xf4"
+ "\x92\x82\xb2\x95\x85\xb4\xb7\x05\xd9\x01\xbe\x71\xc6\xd4\x7c\xc3"
+ "\x86\xd2\x82\x95\xa3\x20\x14\xd4\x60\x64\xa0\xfc\xf5\x3e\xd4\xd7"
+ "\xfe\xfe\xac\x30\x5a\x63\x21\xd6\x54\xd4\x6c\xed\x2f\xc5\xbe\x48"
+ "\x90\xdc\x6b\x9e\xb5\xc5\x1a\xd1\xa7\x33\xf2\xbd\xe3\x88\x67\x62"
+ "\x9e\x40\xcd\x6f\x89\x0f\xfd\x6a\x15\xb6\x27\x96\x32\x59\x07\xf0"
+ "\xb9\x0a\xcb\x54\xe8\x9f\xa3\x51\x73\xbc\x5f\x1d\x76\x96\xec\x8f"
+ "\x98\x0f\x72\x01\xed\x40\x64\xd3\x39\xb0\xf0\xb9\x60\x8d\xbc\x3d"
+ "\xb2\x1c\x97\xd3\xec\x1b\x5c\xe7\x5c\x33\x51\xd6\x93\x80\x34\x3f"
+ "\xa7\x30\xbe\xd7\x91\xb9\xba\x8b\x64\xce\x84\xec\xb5\x32\x1c\xf2"
+ "\x95\x35\x71\x3b\x52\xa3\x53\xda\x86\xf7\xf5\xf4\x4d\x5c\xd0\xc3"
+ "\xf5\x4f\x5f\xe8\xe0\xfb\xa6\xa0\xaf\x77\x0e\x6a\x6e\x94\xe6\xa7"
+ "\xf0\x31\x45\x5b\x39\xe2\x72\x0b\x5c\x98\xd7\x55\x39\x2f\x16\x55"
+ "\xe8\x68\xe2\x7a\x56\x53\xe8\x1f\x33\xac\x89\xa1\xbe\x32\xeb\xcf"
+ "\x1a\x61\x07\x4b\x26\xd7\x2d\x7c\x2e\x1b\x2f\xf6\x70\x23\x7d\xa3"
+ "\x72\x92\x5e\xf9\x75\xaa\xe6\x88\x2c\x6f\x2a\x33\xa6\xcb\x36\xf0"
+ "\x7d\x7e\x6b\xac\x32\x2f\x87\xdb\x6b\x86\xd7\x5b\x7d\x11\x9d\xfb"
+ "\xc4\xeb\x2e\xef\xe7\x89\xfd\x85\x68\x9d\x8b\x86\x45\x15\xc5\x9e"
+ "\x87\xda\x3f\xd1\xdc\xfd\x48\x37\xf5\x9b\x8a\x62\x69\xef\x04\xd1"
+ "\x96\xd5\x1a\x50\x87\x63\xfc\x6b\xd3\x6b\xd1\xff\xb3\xc4\x08\xd9"
+ "\xd5\x26\x06\xd4\x3d\x87\x34\x1f\x20\x9c\x78\x44\xf6\xcc\x56\xbe"
+ "\x80\xd7\x57\xb1\xee\xb7\xb6\x50\x4e\xc7\xf7\x19\x40\xdd\xa0\x79"
+ "\xb0\x97\xa0\x76\x37\xb5\x11\x44\x9f\x1d\x6a\x75\x94\x3f\x95\x8f"
+ "\xda\x6c\xae\x37\xb1\x74\x06\x4a\x6d\x8b\x82\x86\xe3\x32\x2e\x09"
+ "\x77\x9b\xfc\x4e\xfb\x8e\xd9\xa1\x2e\x83\xce\x81\x6c\x75\xf2\x32"
+ "\x8c\x6e\xc3\x5e\x41\x9b\x93\xc3\xf5\xc9\x3c\xc4\xf0\x2a\x7c\x47"
+ "\x59\xec\x01\xf1\x4d\xa8\x41\x27\x6c\x51\x1d\x9d\x61\xca\x2a\x0d"
+ "\xb4\x2f\x61\xa2\xb0\x37\x7c\x2f\x1d\x1e\x37\x52\xaa\xb3\x23\x69"
+ "\x8d\x10\x9f\x17\xe3\xf4\x70\xdb\x20\xf6\x5e\xc0\x78\xac\x23\x2e"
+ "\x3a\xd3\x65\xa0\x70\xa4\xa0\xed\xe5\xdc\xc1\x3c\xe8\x7c\x4a\xfe"
+ "\x0d\xf2\xe5\x0c\xb1\x97\x49\x38\xf6\xf5\x5e\xae\x92\xe5\xb7\x73"
+ "\x3f\x86\xd1\xf9\xa9\x6a\xd0\xb5\xf1\xbd\xc2\x5e\x6e\x90\xe9\x95"
+ "\xe2\xd4\x5c\x1f\x38\x0f\x5e\x1e\xac\xff\xfd\xfc\xac\xcf\x97\xdb"
+ "\xe5\x7c\x38\x2c\xc2\x11\x7c\x5b\x1c\x8f\xeb\x19\xc4\x23\xf6\x50"
+ "\xd1\xf1\xf3\x9e\x9b\x29\xae\x0e\xfc\xb6\xaa\x96\xef\x57\xcc\xe7"
+ "\xad\x61\x39\x1c\xcf\x15\x8e\xe4\x32\x30\x00\x9d\x0f\x42\xe7\x08"
+ "\xab\x85\x2e\xd6\xcd\x92\xd3\x68\x54\xc4\xc7\xba\x64\x39\x6f\x19"
+ "\x07\xd1\x7f\x5d\x9b\x27\xca\xa2\xa5\x3a\x22\x9d\xd9\xc9\xed\x85"
+ "\xf0\xb5\xea\x3a\xb8\x0e\xf2\x72\xd6\x35\x07\xca\x5a\xf8\x72\x75"
+ "\xc7\x03\xf4\x81\xe8\x19\x94\x3f\xca\xde\x29\xda\x92\xba\xee\x00"
+ "\x1a\x93\xf0\xbd\xd7\x2f\x07\x2e\x23\x3a\x03\x2a\xe4\x79\x8f\xbc"
+ "\xae\x20\x8c\x8f\x71\x3a\x49\x1e\xd8\x17\x9b\x0d\x6d\xe4\x13\x62"
+ "\x5d\x41\x9e\x20\x8d\xaf\xac\x25\xbd\x72\x99\x5f\x49\x0a\xd6\xcd"
+ "\x57\x32\x02\xe8\x55\x91\x5d\xc7\xb0\x7c\x19\xc6\x0e\xaf\xf0\xb5"
+ "\x4c\x32\x3f\x31\xae\x6a\x50\x8e\xf7\x70\x58\x8b\x4c\xe7\x37\xb4"
+ "\x19\x12\xaf\x5e\xf9\x48\xca\xa3\x5d\xce\x03\x9f\xb1\xff\x53\x97"
+ "\xad\xc4\xf1\xf4\xe6\xb2\x02\xb1\xb9\x11\x35\xf2\x79\x2b\xd7\x14"
+ "\xe4\x4f\x37\xe4\xad\xa2\x6d\x90\x4a\x8b\x0b\x0a\x4c\xfc\x23\x4e"
+ "\xb0\x1f\x18\xc3\xf3\x43\x3e\x88\x3d\xa7\x5f\x7d\xf4\x65\x31\x7f"
+ "\x85\xea\x05\xd5\x77\x07\xd5\xf7\xd6\x8a\xaf\x78\xdf\xc6\x56\x75"
+ "\x0f\xd8\xdc\xac\x8a\xfc\x7f\x6e\xfb\xa8\xfc\xb1\x4e\xd1\x0e\xa0"
+ "\x3c\xa9\x8d\x74\x99\xf7\x9b\x82\xf9\xb5\xbf\x2a\xb8\x2e\xef\xb7"
+ "\x84\xb6\x13\xfb\xef\xe6\x76\xc2\x22\xf4\x82\xec\x13\xcd\xfd\x27"
+ "\xbc\x98\xa6\x4d\x81\xf3\x8c\xdf\x46\xed\xb7\xcb\x36\x4a\xb4\x13"
+ "\xaf\x6a\xb1\x0d\xb2\x48\x79\x79\xfc\x7a\xf3\x6a\x85\xd0\x9b\x57"
+ "\xb1\xff\xf7\xeb\x9d\x72\x5f\x47\xb4\x1d\xaf\xd8\xc9\x7f\x14\xe7"
+ "\x6b\xbf\x6a\x94\xf1\xd5\x45\x53\xbb\xf1\x6a\xd2\x50\xff\x61\x7f"
+ "\x1f\xf9\x0f\x34\x2f\x91\x78\xc1\xcf\x13\xe6\xf5\xe6\xd5\xe2\x00"
+ "\xfb\xa3\xc7\xf7\x8a\x50\xb2\x7e\x9a\x9a\xe3\x04\xfa\xdc\x96\xb0"
+ "\x72\x5d\xd9\x5c\xda\xa2\xaa\xa0\xdc\x54\xb0\xb2\xac\x20\x5f\xf9"
+ "\x9d\x2d\x5e\xf6\xc5\xe8\x1b\x77\x1d\xd6\x7b\x47\x14\xf1\xe3\x55"
+ "\x2c\xff\x01\x8f\x5c\x06\x6e\xa7\xd0\x77\x94\x6c\x5c\xc4\x79\x38"
+ "\xf0\x91\x38\x4b\xfc\x55\x8f\xac\x27\x04\x37\xbf\x9c\xf9\x5c\xe6"
+ "\x7a\x2c\xff\x7e\x9d\xd4\xdf\xc2\x3e\x6d\xbd\x41\x7e\xf7\xa7\xaf"
+ "\x2f\xe0\x6d\xdf\x7e\x3e\xa7\x0f\x79\x5a\xdf\x13\xe0\x6f\xd1\xfb"
+ "\x49\xe9\x9d\xef\xc3\x24\xce\x45\xaf\xdf\x2c\xf8\x5b\x8f\xf2\x7f"
+ "\x45\xb2\x15\x07\xda\x05\x1e\x80\x37\xb6\x39\xc2\x9a\xf8\xf8\x7e"
+ "\xbd\x45\xce\x0f\xd3\x9f\x0d\xcc\x93\xda\x2d\x25\x3e\x3b\xd4\xf3"
+ "\xf5\x21\x3b\xf8\x1e\x72\xf5\xa7\x43\xd0\x9a\x11\x08\x87\x30\xd8"
+ "\xff\x7d\xa5\x41\x2e\xf3\xd2\x72\x0a\x3b\xa0\xbd\x4e\x19\xfb\x44"
+ "\x19\x0f\x54\x91\x6e\x51\xfe\xa4\xff\x12\x0d\xf9\xd2\xbe\x24\x76"
+ "\x3a\xbf\x91\xe8\xe7\xfb\xa3\xc5\x52\xbd\x3e\x80\xfd\xdf\x9a\xd3"
+ "\x72\x39\xa8\x8c\xc7\xb7\x39\xb4\xf2\xbe\x54\x22\xfd\x81\xb9\xc1"
+ "\xb4\x1d\xd8\x13\x90\xa6\xd7\x3a\x85\xc6\xee\x0f\x4c\x65\xe6\x57"
+ "\x77\x93\x1e\xd2\x7e\x55\x75\x83\x7a\x78\xe0\xc4\x50\xbd\x3b\x10"
+ "\x47\x7a\x17\xa8\x4b\x45\xf7\xac\x44\x4d\x2a\x2d\x28\x9b\xc3\xbd"
+ "\x7b\x74\xec\x68\xdb\xb3\xbc\xb2\xa2\xf5\xeb\x4a\xa7\x1b\x4a\xf3"
+ "\xf3\xa4\x4a\x1f\x54\xe7\xcd\xbc\xef\xef\x94\xeb\x99\xcb\xfc\x5a"
+ "\x9c\xdf\xb6\xbc\xe6\xd7\x7f\x9a\xa3\x35\x85\xc6\x66\x5f\xdb\x2c"
+ "\xea\xd3\x6b\xa9\x01\x75\x97\xa7\xa7\x3a\xda\xc4\x7d\xb6\xd7\x02"
+ "\xdb\x7f\x27\xf2\x74\xe4\x25\x78\xed\x46\x89\xa7\x4e\xc1\xe3\xd7"
+ "\xde\xe3\xe5\xe4\xfb\x71\x1d\x38\x43\xe5\xe4\xfb\xbf\x70\xff\xec"
+ "\xb5\x23\x72\x79\xfd\xfd\x86\xd7\xac\xdc\x8f\x92\xfc\xb5\x6f\xea"
+ "\xd7\x0b\xff\xf4\x60\xb6\x34\xf6\xd6\x2d\xf7\xf1\x64\xff\x1a\x69"
+ "\xc9\x17\xbe\xea\xc1\x1b\xd3\x2b\xd8\x40\x4e\x39\xed\x53\x47\x32"
+ "\x38\xf8\x80\xec\x5b\xf2\xf9\x7b\x35\x85\x6e\x97\xf9\xe0\xec\x40"
+ "\x3b\xc1\x34\x6b\xba\x25\x1f\xd1\x2d\xfa\xae\xa3\x7f\x77\x0e\xf3"
+ "\xa2\x6f\x0f\xd7\xa1\x0d\xcb\x75\x10\xed\xdf\xdb\xc7\x09\x0f\xf9"
+ "\xd7\xac\x3f\x56\x3a\xab\xb2\x81\x7f\xc3\x6b\x44\xdc\x0e\x94\x2d"
+ "\xc2\xa1\xff\xf7\x1a\xd7\x0d\x1f\xea\x28\xcd\xdd\x71\xca\x3e\x12"
+ "\x1c\xfc\x84\xda\x22\x7c\x46\xbd\x6d\x88\x17\x3a\xd5\x10\xef\x28"
+ "\x8d\x87\xfe\xfe\x58\x75\x7f\x69\x96\x96\xc6\x0b\x88\x17\xb6\x06"
+ "\x37\x08\xfd\x39\xe8\x46\x9b\x77\x24\x10\x9f\x84\x8b\x78\xaa\x25"
+ "\x3a\x58\x69\xac\x9a\xf4\x9b\xf4\x95\xf5\xc7\xa3\x9f\x70\xd0\xca"
+ "\x4a\xe3\xd5\xc3\xec\xbd\x75\xbd\x72\x46\xd0\x79\x8f\x74\x06\x28"
+ "\xd9\x2b\xb1\xbf\xff\xa1\x5d\x2f\x8b\xb1\x01\x29\xdf\x86\x17\x99"
+ "\xfa\x30\x6f\x57\xf6\xf1\x76\x85\x81\xd8\x2f\xbd\xe1\x08\x9f\x47"
+ "\x6b\x3a\xcc\xcf\x7c\x95\xd6\x67\x3b\xda\x4c\x1e\x7e\x56\x5d\x65"
+ "\x19\xf9\x69\x1e\xfa\x6e\xc4\xd7\x1f\xb7\x96\x79\x60\xa9\x9b\x74"
+ "\xb2\xa1\x9b\xf6\x8a\x17\x67\x81\x37\xf4\xc8\xfb\xc3\xd3\x19\x92"
+ "\x74\xfe\x29\x96\x4b\xe3\x3f\xbf\xf4\xd0\x49\x1a\xb7\x15\xfd\xf1"
+ "\x58\xd8\x87\x3e\xbd\x90\xc1\xa1\x04\x3a\x8b\x4f\xf4\x15\xce\xa1"
+ "\x5c\x34\xff\x40\xd8\x05\xe2\x1b\xb2\x6c\x27\x0e\xbd\x43\x73\xd3"
+ "\xed\x12\x0e\x97\xf9\x10\xb6\xff\x07\x0b\x45\x5e\x88\xcf\x25\xcb"
+ "\xf3\x50\xc2\xd0\xf1\x0d\x3f\x3e\x4c\x3f\x5d\xf2\x0b\x40\x8c\x7d"
+ "\xbd\x4f\xb8\x1a\xe4\xb1\x2f\xbf\xef\x73\xe8\x98\x3c\xf6\x25\xf6"
+ "\x9e\x6e\x28\xa3\xfc\x87\x1b\x23\x62\x95\x4f\x92\xde\xeb\xc8\x87"
+ "\x1b\xd6\x9f\xc0\xf6\x9d\x68\x97\xfd\x42\x21\x9f\xc6\x85\xe4\x1f"
+ "\xd2\x99\xab\xb2\x2f\x29\x7c\x80\xc6\x4c\xd1\x96\x35\xce\x96\xdb"
+ "\x32\x4c\x7b\x5c\xb2\x15\x52\x3b\xd7\x38\xd8\xff\x0d\x3d\x2f\xbf"
+ "\xb1\x4c\xe6\x91\xcc\x73\xc1\xa3\xc6\x8e\xfe\xe8\x15\x29\x7e\xde"
+ "\x36\x76\x70\x5e\x0f\xc6\x37\x85\x05\xf0\x9e\xde\xb5\xc2\x6e\x36"
+ "\x62\xfb\xdf\x30\x4b\xb4\x29\x22\x8c\x45\x37\x8c\xe6\xe7\xb6\x73"
+ "\x1e\x14\xf1\xb1\x19\x47\x65\x3c\xd1\xe6\xb0\xab\x8c\x06\x61\xcb"
+ "\x1a\x11\xfe\x50\x9f\x48\xd7\x58\x4f\xb4\x04\xd2\xfb\xd8\xba\x35"
+ "\xeb\xd6\x6f\x5a\x47\x03\x6a\x1b\x4a\x0d\x2b\xd7\xe7\x17\x8c\x0a"
+ "\x31\x1e\x12\x4b\xe7\x5a\x3b\xeb\x06\xf7\x9d\x7a\x5d\x47\xf3\xe8"
+ "\xc5\x99\x05\xaf\x8f\x34\xdc\x4e\xfa\xd5\xb4\x96\xc6\x0a\xf8\xd9"
+ "\x11\xb4\xc7\xaa\x18\x37\xe8\xa5\xf4\x82\xd7\x87\xaf\xf4\x6f\x2a"
+ "\x94\x7c\xac\xc3\xbf\x21\x3e\x4a\x7d\x0e\x86\x65\xfc\x42\x6e\x87"
+ "\x88\x3e\xee\x9b\x0f\xc4\x73\xbb\xe8\x1b\x28\xd4\x72\x7e\x0d\xc4"
+ "\x63\x7b\xd3\xd4\x6e\x57\xcd\xf0\x88\x72\x35\x9d\x91\xf9\x41\xe5"
+ "\x77\xd1\x59\x9b\xac\x08\x75\xf4\x75\x9d\x84\x8b\xec\x27\xe1\x6e"
+ "\x90\xe7\x71\xd3\x5e\xa2\xd6\x8d\xb4\x8f\x70\xf3\x27\xbe\x1a\xb2"
+ "\x37\xcd\xb1\xb2\x5d\xa2\xb6\xc8\x87\x78\xde\xbe\xea\x08\xc3\x7a"
+ "\xf3\x00\xa6\x1d\x77\x0e\x0e\xe7\x8b\xf3\x06\x9a\x93\x83\xcf\x1b"
+ "\x38\x6c\xc0\x2b\x5f\xba\x76\x06\x3c\x5f\xef\x92\xd3\x64\xf8\xc3"
+ "\x9a\x9b\x15\x30\x3b\x91\xa6\xa3\x83\xfe\x8a\xd8\xcf\x54\xda\xff"
+ "\x98\xce\xce\x68\xfe\x82\xf6\x0c\xf5\xeb\x46\xf3\x18\xc9\x07\xe9"
+ "\x25\xde\x51\x7b\xdb\x03\x87\xc5\x5e\x26\xb5\xa8\x1b\x2c\x0b\xa8"
+ "\x4c\xcc\x55\x84\x3a\x71\x58\xeb\xd7\x03\xc1\x23\x0c\x8b\xf5\xfb"
+ "\x29\xcd\x7d\x94\x26\x90\x0f\x98\xc7\x03\xa2\x6f\x7a\x38\x49\x6e"
+ "\xb3\x69\xbf\x54\x71\xfe\x44\xf3\xd1\xe3\xdb\x7a\xb1\xcf\x7f\x38"
+ "\x3b\x00\xc7\x51\x69\x2c\x42\xcb\xd4\x4d\xfa\x26\xde\x67\x3b\x5c"
+ "\xe1\x1f\x13\x68\x3e\x4a\x76\x97\xe3\x88\x6e\xd0\xdb\x9c\xfc\xcc"
+ "\x68\x95\x7c\x46\x3c\xc2\x1e\x91\x7d\x14\x19\x57\x9b\x18\x73\xe2"
+ "\x7b\x5c\x62\x1d\xb4\x20\xcc\xe9\xc1\xf1\x58\x0c\x1b\xec\x03\x96"
+ "\x63\x3d\xe6\xbe\xf7\xe1\x3e\x7f\x5f\xaf\x89\xef\x2b\xc0\xfb\x81"
+ "\x02\x0f\xfa\x0f\x87\xed\xca\x7e\x1b\xfa\x0f\x86\xa2\x75\x45\xe8"
+ "\x3e\xac\x36\xad\x9f\x8b\x5d\x87\xd5\xa6\xa2\xb9\x34\xe5\x2b\x2d"
+ "\x79\x21\xbf\x63\xe5\x98\x1b\x62\xfc\x98\xc6\xbd\xf9\xb9\xcc\x34"
+ "\x66\x84\xfd\x5c\x1a\x3b\x75\x89\xb3\x52\xc3\xa5\xbb\x4e\xba\x8f"
+ "\xc0\x76\xcf\x80\x75\x65\x2f\x9d\x7d\x83\xfc\x6f\xf6\x99\xc5\x39"
+ "\xaf\x52\x9b\x8d\xb6\xfc\xf5\x5d\xf2\xf7\x32\x3e\x07\x9e\xf6\x31"
+ "\xec\x2f\xe4\xe3\x71\x2e\xf3\xeb\x83\xe3\x1f\x62\x7c\x51\x7c\x73"
+ "\xc3\xf0\x6e\x39\x5c\x1e\x8f\xc5\xb0\x3e\x79\xec\x55\xc0\xbe\xee"
+ "\xf1\xa7\x0d\x1a\xdb\x8e\x91\xbf\xc7\xb9\xcc\x6f\x18\x64\x9e\xc9"
+ "\x78\x2a\x0d\xec\x92\xe4\x27\x69\xb8\x5f\x6d\x7e\x3d\x86\xef\x1d"
+ "\x4a\xbe\x38\x1f\x67\x7e\x23\x53\xce\x87\xfa\x08\x44\xb7\xf4\xed"
+ "\x87\xd7\x7b\xda\x23\x54\xec\x31\xfa\xc6\xa0\xfc\x15\x3c\x8f\xff"
+ "\xd1\x34\x3e\x2e\x1f\x5f\x8a\xfe\xd9\x34\xc5\x38\x1c\xe9\xd0\xcc"
+ "\x3a\x18\xc9\xc7\x98\x44\x3f\x3d\x8c\x7c\x04\x2c\xc3\x61\x94\xa7"
+ "\x86\x6c\xb9\x68\xf7\xde\x38\x3b\xd8\xc6\xeb\x1b\x74\x2c\x7a\x45"
+ "\x32\xed\x33\x2f\xd6\x2d\xbc\xf1\x35\xe9\x9b\xe3\xa6\x35\x2e\x46"
+ "\x73\x94\x5f\x5d\xe6\x12\xe3\xf0\x2d\xf7\xfa\xc7\xcc\xde\xd8\x2d"
+ "\xed\x89\x4a\xf3\xdf\x50\x5e\x2d\xd3\x07\x7d\x4e\x84\xe7\xbe\x17"
+ "\xe2\xa4\x35\x0a\x94\xff\x77\xf8\xce\x83\xfd\xfe\xf7\x8e\x88\x7a"
+ "\xda\x62\xe5\x38\xd0\x56\x8b\x75\x00\x2d\xe8\xff\xbf\xd1\x20\xda"
+ "\x06\xc2\x9d\x05\xfd\xd1\xef\x59\xfa\xcd\x1f\x4f\x27\x1e\x3a\xa3"
+ "\xff\xd2\x25\xf6\x20\x6e\x79\xcf\x69\xd6\xa2\x4c\x5b\x50\xfe\xbf"
+ "\x1a\xd2\xd7\x95\xf3\x1a\xd8\xc8\xda\x3c\x57\xd9\x89\x7d\x7f\x45"
+ "\x3b\xb7\x0a\xc0\xb3\x91\x1d\x1b\xb8\xca\x8e\xf3\x33\xc8\x9f\x06"
+ "\xd8\xfb\x77\x00\xaf\x66\xd9\x17\xd7\x50\x57\x17\x5f\xf1\x5d\xa2"
+ "\xf3\x02\x9b\x10\x6e\xb1\xf3\x32\x6b\xc4\x34\x8b\x4d\xec\x52\x23"
+ "\xc2\xa5\x5d\xbc\xc4\x0e\x21\x6c\x5a\x21\xea\xca\x46\xe6\xf1\x6a"
+ "\xd6\x7c\x61\x78\x9c\x6c\xf7\xcf\x93\x1d\x35\x05\x99\xcc\xac\xae"
+ "\x66\x3b\xee\xba\xd3\x65\xfe\x79\xc6\xe0\x39\x65\x88\x97\xf4\x2a"
+ "\xbd\x9c\x9e\xd7\x7c\x81\x7a\xf0\x45\x0e\xfa\x1d\xa8\xb7\x5f\x20"
+ "\x1c\x7d\xff\xe1\x6b\xb3\x1c\x9a\x3b\xa3\xf1\x8a\x0f\x49\xff\x55"
+ "\xd6\xe6\xdd\xc8\x4e\x54\xaf\x40\xfa\x2f\x20\xfd\x57\xd9\x31\x2c"
+ "\xc3\xf1\x7d\xe7\x01\x88\x7e\x2f\xe1\xf4\x82\x26\x67\xb3\x2a\xaa"
+ "\x09\xe3\x73\xca\xf5\xd0\x84\xb0\x2b\x9c\x10\xd5\x88\x30\x2b\x9e"
+ "\x8d\x02\x4e\x7f\x1f\xd2\x1d\x55\x90\xe9\xc5\xbc\x89\x7e\xcc\xdf"
+ "\x2d\xd3\x29\xe7\x4f\xf4\xca\xf5\x36\x87\xc6\x08\xa3\x57\xec\x21"
+ "\xba\xc5\x77\x8f\x5f\xe4\x39\x4a\x51\xce\x9a\xbb\xee\x14\x7d\xec"
+ "\x5f\xcc\x96\xe9\x0f\xfe\x0e\xf6\x8b\x2a\x61\x3f\x7f\x81\xfd\x9f"
+ "\x16\xe9\x4c\x17\x11\x46\xe5\x77\x60\xbd\x95\xd6\xfe\x7d\x21\xf3"
+ "\x0c\xe3\xa7\x2b\xbf\x73\x65\xac\x2f\xe1\x63\xd4\x79\x2b\xcb\x8a"
+ "\x36\xe6\x61\xcf\x77\x14\x98\x28\x88\xf7\x8d\x0b\xf2\x0d\xeb\xd7"
+ "\x19\x56\xe5\x15\x15\xaf\xdf\x58\x50\x32\x9d\x0f\x67\x94\x16\xac"
+ "\xcb\xa7\xa1\xeb\x92\xbc\x12\xd3\x28\x45\x7f\xc6\x52\x90\xd9\x49"
+ "\x67\xd0\x6c\x23\xfd\x7e\xf3\x23\x69\xdc\xd6\xcd\xcc\x49\xbc\x5f"
+ "\x2c\x6c\xcc\x2f\xef\x35\x6c\x49\xa2\xf8\x77\x44\x3b\xfe\x66\x3b"
+ "\xab\x5d\xb1\x97\x31\x7e\xb6\xb6\xea\x12\xbc\xf9\x5b\xce\x8f\xfe"
+ "\x14\x19\x0f\xef\xbb\x92\xce\x9a\xb6\x90\x1f\xf6\xcb\x6c\x46\xf1"
+ "\x41\xbc\x78\x73\xaf\xf0\x45\x30\x7c\x20\x05\xfc\xf3\xed\xdf\xfc"
+ "\x88\xa9\xb1\xec\xc8\x4b\xd1\x67\x28\x8a\x97\xd6\x3d\x7e\x78\x0e"
+ "\xde\xa4\xbe\x14\x7d\xb7\xe9\xe2\x3e\x39\x5f\x9f\xf5\x66\x11\xab"
+ "\x29\x8a\x67\xe6\x11\x11\xc4\xaf\x7d\xa2\x4f\xaf\x8e\x54\xd1\xd9"
+ "\xb9\xe7\x68\xad\xa8\x91\xbe\xef\x36\x99\x7d\x46\xff\xfc\xa6\x5f"
+ "\xec\xa1\xfe\x05\xff\xce\xc1\x6d\xd2\x2f\x7b\xe5\xba\xab\xa6\xf5"
+ "\x37\x3b\x26\xcc\x11\xf5\xef\x97\x17\x09\x1e\xe5\x3f\x47\x94\x8f"
+ "\x9f\x03\x8e\xbe\xc1\x9b\x61\x58\xfe\x7d\xac\x32\x45\xfa\x26\xf9"
+ "\x66\x98\x2f\xfa\x6f\x5d\xde\x52\xec\x17\xe8\xff\x9e\x81\x71\xbf"
+ "\xf0\xd5\xae\xd8\xef\x45\x9f\xca\x87\xfd\x04\x56\xfb\xf7\xa5\xde"
+ "\xda\x15\x16\xdf\xa6\x78\x35\xb5\xad\x95\xe5\xc8\xdf\xf5\x85\xa3"
+ "\xd8\xe5\xc2\xd1\xde\x4d\xf1\xe8\x7f\xad\xa8\x67\x0c\xd3\x46\xaf"
+ "\x38\xc2\xcf\x2b\xae\x5d\xf1\x9a\xf4\xfe\x16\xbd\xfb\xd0\x4f\xc6"
+ "\xb0\x63\xf8\xfe\xaf\x3e\x16\x00\x1f\x0c\x7b\x9c\xde\x23\x55\x7c"
+ "\x5e\xa5\x11\xfb\x25\x89\x54\x76\xb9\xcc\xbc\x7f\x46\x63\x44\x83"
+ "\x65\x7b\x13\xe4\x70\xea\x37\x08\x1f\x1e\x56\x22\x8f\xc5\x5e\x16"
+ "\x83\x70\x47\xfe\x22\xf3\x40\x9c\xcf\xbd\x02\xfb\xe1\x6f\xb6\xfb"
+ "\xe8\x6c\xf4\x1d\x37\xdf\xc9\xd4\xbf\x68\x22\x9b\x95\xee\xe5\xb6"
+ "\x10\xc4\x77\xa7\x37\x67\xcb\xfc\xa4\x75\x04\x64\x4b\x51\x6e\xf1"
+ "\x39\x0e\x18\x25\xec\xc0\x9b\x59\x01\xfd\xc3\x3e\x92\xb5\x1d\x8e"
+ "\x48\xfb\x6c\xe9\x76\x88\xf7\x5f\x1e\x11\x75\xe5\xcd\x9d\x32\x2c"
+ "\x86\x89\xfd\x7e\x2c\x39\xc5\x9b\x3c\x30\xc1\x74\x3f\x3b\x8f\x32"
+ "\xca\x92\xe0\x8e\xfa\xeb\x94\xd0\x37\xbc\xcf\xa6\xfe\x35\x7d\x7f"
+ "\xa4\xe7\xc6\x61\xd6\xc2\x6e\x6b\x60\x8c\xda\x2b\x6a\x3f\x0d\x13"
+ "\x00\x3a\x9d\xd4\xb7\x7a\x4b\xd7\xda\xe0\x04\x2e\xe7\xe8\x15\x7b"
+ "\xfb\x59\x21\xa0\x4f\x19\xb2\x2f\x41\x69\x10\x3e\x99\xf7\x93\xb0"
+ "\x5e\xf8\xb0\x5e\x60\x9a\x7d\xa4\xd7\xdb\xae\x50\xff\xe5\xad\x9d"
+ "\x6d\x15\xbd\xb4\x57\x3f\xea\xeb\x5b\x3b\x89\x87\x54\x0f\xf6\x99"
+ "\xf9\x3a\x48\xde\x4e\x5a\x37\xce\x22\x1c\xcf\x8e\x75\x83\xb6\x13"
+ "\x5b\x08\x94\x8b\xdb\xb4\x0d\xa2\x2e\x20\xbc\xb6\x0c\x74\xd4\x87"
+ "\x0d\x6e\x43\x42\xb7\x1f\xfd\xfa\xa2\xac\xfe\xda\x22\xa3\xcb\xfc"
+ "\xd6\x49\xb4\xfd\xc3\xee\x9f\xb8\x63\x1c\xfa\x35\x08\x67\x99\x40"
+ "\xdf\xaa\xdf\xea\xbd\x1e\xac\xbc\x36\x97\x74\x65\x66\x2c\x8d\xa7"
+ "\x14\x65\xf1\x6f\xde\xd1\x45\x46\x31\x6e\xf9\xab\x78\x39\x3d\x8d"
+ "\x7b\xd2\xbc\x82\xea\x6b\x10\x5b\x3d\xd8\x57\xfc\x55\x86\x90\xd1"
+ "\xaf\x32\xe4\xfe\x45\xa8\x7c\xca\x5a\x98\xaf\x72\x2a\xa8\x6d\x06"
+ "\x07\xcc\x70\x43\x44\xe3\x6b\x00\x96\xff\x45\xdc\xdb\x80\x47\x55"
+ "\x5d\xfb\xc3\xfb\x4c\x86\x10\x30\x64\x26\x31\xe0\x88\x41\x06\x0d"
+ "\x36\x6a\x80\xa8\xd8\xa2\x7f\xac\x51\xa0\xc5\x0a\x26\xb5\xd8\xc6"
+ "\x16\x3b\x41\x12\x4c\x90\x8f\x31\x04\x18\x62\xc8\x17\xdc\xfc\x53"
+ "\x0b\x61\xc0\xc0\x45\x09\x10\x7b\xb1\x2f\xde\x8b\x10\x5b\x6c\x63"
+ "\x8b\x30\x40\xd4\xa8\x21\x93\xda\x68\x83\x17\x75\x88\x01\x23\x0d"
+ "\x30\x92\x81\x0c\xc9\xcc\xd9\xef\x6f\xed\x7d\x4e\x66\x82\x09\x2d"
+ "\xbd\xf7\x79\xdf\x3c\xcf\xe4\x9c\xbd\xcf\xfe\x5c\x7b\xef\xb5\xd7"
+ "\x5a\x7b\xed\xb5\x0a\xb8\xff\xc5\x02\xcc\x23\xc0\x98\x1b\xfe\xb3"
+ "\x81\xf4\x2f\x76\x62\x8f\xae\x54\x19\x8b\x40\x5b\x5e\xbc\x84\x3a"
+ "\x8b\x64\x3a\x2e\xed\xaa\x59\x90\xce\x87\x67\x3c\xf0\x08\xab\x2a"
+ "\x62\x51\x55\x2a\x33\x3a\x8b\x58\x02\xe2\x40\x57\xfc\x57\x8b\xce"
+ "\x0b\x0c\x78\x2e\xbc\x03\xf8\x11\xf5\x96\x16\xf1\xc0\x11\xf0\x77"
+ "\x65\x2a\xf7\xff\x33\x70\xf7\xb0\x3d\x93\x65\x1f\xf7\x4c\xd6\x79"
+ "\x03\xbc\xa7\xf6\xbf\x63\xbd\x27\xe9\xca\x33\xe6\xa7\x97\x2e\xcd"
+ "\xb7\xe5\x65\xd3\x23\x69\xfc\xf2\xdb\xaf\xa4\x15\xa3\xa5\x3f\xaa"
+ "\x3d\x19\xb4\xb6\x88\x7e\x92\x77\x95\xf6\x6c\x0d\x93\xf7\x90\xcc"
+ "\xf9\x41\xa2\xfb\x48\xd7\x04\xdf\xf6\x1f\x16\x57\x07\x98\x72\x32"
+ "\x8a\x19\xae\xac\x6f\xc1\xbc\xfc\x79\x8b\xee\x97\x6a\x0d\x03\xd4"
+ "\xd3\xd0\xbf\x9e\xd7\xfb\xce\x7f\x35\xde\xdc\x27\xf0\xe3\xc6\xcf"
+ "\x53\x79\xec\x11\x8f\xdc\xeb\x5e\x4f\xd4\x75\x07\x07\xb6\xe9\x62"
+ "\x33\x06\x37\x6d\xcf\xa4\x35\x52\xbc\x9a\x19\x7e\x5f\xd0\x6a\x20"
+ "\xbe\xa4\x08\xef\xa4\xcb\x25\xe4\xdf\x9a\xaf\xc8\x83\x17\x5a\xb1"
+ "\x97\xbe\xee\xe0\x1b\x6d\xe0\x39\x5e\xb7\x0f\xa6\xbf\x15\x7e\x1f"
+ "\x5e\x9e\xdd\xbf\xee\xbc\x8a\xae\x97\x48\xaf\xeb\x69\xf4\xcf\xb7"
+ "\x77\x88\x1c\xb3\xd7\x31\xff\xff\xb3\x46\x9f\xbf\x7a\x9a\x0d\xa3"
+ "\x74\x1f\x9c\xaf\x0f\x6a\x07\x99\x3b\x73\x33\xe5\x1c\xdf\x3b\x43"
+ "\x9c\x51\x8f\x66\xff\xb7\x8d\xed\x7d\xc8\x68\x61\x16\xbc\xff\x3f"
+ "\x78\x17\x32\x0c\xfa\xd6\x6f\x1e\x8d\xe9\xac\x31\x02\xe3\x00\xf3"
+ "\x28\x5c\xfe\x81\xf0\x93\x7f\x11\xf8\x19\xb8\x22\x6e\xad\x44\x60"
+ "\x04\x87\x46\x1a\x99\x29\x26\x3a\x6a\xec\xcd\x09\x96\x07\xbf\x3f"
+ "\x75\x4a\x71\x51\xa1\x83\xab\x01\xbf\x89\x87\xfb\x4d\x3d\x52\xf1"
+ "\xc4\xed\x25\x92\x7e\xd8\x78\xa4\x62\xa0\xb6\xae\x2f\xe3\x76\xe2"
+ "\x69\xd5\xb8\xe3\xb5\xc5\xcb\x99\x61\x5f\x8f\xc7\x40\x3c\x14\xd1"
+ "\x30\xee\xc0\x67\xe0\xc5\xf7\xfe\xe5\x10\xe2\x00\x2f\x07\x77\x1e"
+ "\xaf\x95\x77\x92\xf6\xc5\xaa\x9b\x8e\xd7\x86\xca\x37\x32\x2a\x1f"
+ "\x7c\xba\x61\x57\x51\x87\xc1\x6d\xfc\x3e\x73\x5b\x7d\xec\x10\xde"
+ "\x07\x1c\x2b\xd4\x49\x32\x61\x2a\x03\x7b\x70\x45\xf1\x65\xec\xcd"
+ "\x0e\x71\x3e\x63\x38\xc7\xf6\x3d\x52\x3b\x48\x3e\x71\xc6\x1a\x97"
+ "\x1d\xd9\x5d\xb6\x0f\xf8\xff\xe9\x44\x8d\x0f\x01\x9f\xb4\xaf\x4a"
+ "\xdf\x0f\xf0\x7d\x88\x3c\x27\xda\xb7\x5b\x4f\x33\xe0\x18\xbd\x40"
+ "\xba\xce\xdc\x45\xf3\x80\x5f\xea\xe8\x20\xdb\x8b\x83\xcc\x95\xe9"
+ "\xa0\x51\xc6\x10\x6e\x1e\x51\x6a\x8e\x8c\x29\x4d\x59\xdc\x08\xda"
+ "\x68\x44\xe7\x48\x16\xe3\x7b\x8a\xda\x4c\xfa\xf6\xcd\xdb\xc1\x73"
+ "\xd2\xf9\xb0\x49\x49\xc9\x35\x95\xa6\xcc\x0b\x96\x4d\xbd\x87\x68"
+ "\x28\x93\xe3\x11\xc5\x14\x78\x48\x09\x94\x4d\xbe\x67\xa7\xf4\x55"
+ "\xe4\x73\x8e\xe2\xad\xc8\x73\x02\x79\x3c\xf8\x91\x5f\x92\xc6\xd3"
+ "\xac\x36\x17\xcf\x06\x93\xc2\x77\x9a\x30\x92\x93\x4a\x84\xef\x56"
+ "\xda\x9f\x1b\x79\x1c\x78\xbb\x5e\x21\x83\x1b\x12\x92\xc1\xd5\xae"
+ "\xc3\xb8\x45\xce\xfa\x37\x7e\x08\x65\x35\x04\x2f\xa9\x0d\x3b\xce"
+ "\x11\x3e\x14\x7c\x55\x0b\x70\x40\x4b\x72\x15\xb3\x68\x3a\xd3\x86"
+ "\xc6\x40\x03\xed\xc3\x64\x73\xa0\x1e\x75\x1e\xc0\xaf\xce\xba\x84"
+ "\x45\x9c\x63\xb5\x9f\xe9\x3a\x57\x92\xae\xfb\xdd\x13\x9a\x1c\xc0"
+ "\x35\x11\xf9\x57\x2f\xa6\x39\xd1\x61\x08\xa0\x7c\xf0\xda\x0d\xee"
+ "\x9c\x06\xa1\xc3\x46\x77\x12\x28\x0d\xea\x48\x72\xfb\x1b\x98\xca"
+ "\x2d\x06\x84\xeb\xe8\x7e\x01\x47\xda\x26\x47\x2b\x6b\xb2\xfb\xb1"
+ "\x6f\x36\x82\xf7\x4c\x4a\x44\x7b\x44\x79\xf8\xde\xb2\x0f\xe3\x6b"
+ "\x05\xcf\x80\xf2\x9a\x49\x27\x8e\xee\xee\xf3\x65\x49\xb7\x21\x7f"
+ "\x3d\xef\xb5\x18\xa8\xfc\x73\xec\x8d\x53\xbc\x2b\x29\x69\x52\xa7"
+ "\xf4\x65\xda\xc6\xde\x38\x80\x76\xde\x1c\xd6\xce\x19\x68\xbf\x11"
+ "\x7b\xa5\x0b\x65\x1e\xe0\x2b\x50\x67\x3b\xea\xf4\x79\x49\xff\x33"
+ "\x91\xaf\xb4\x18\xa9\xcd\x4d\xd4\x5e\x47\x90\xf1\x95\x49\xc6\x0d"
+ "\x17\x98\x11\x6b\xc1\xb5\x13\x4f\xf4\x7f\x3f\xe8\xfa\x84\xee\xb2"
+ "\x37\xfa\xec\x3f\x10\x1d\x89\xb0\x47\x9f\x4b\xeb\x91\x06\x6d\xac"
+ "\x43\xbb\x0e\x8c\xe8\x64\x24\x5b\x18\x82\x79\x3a\x04\xf5\x0e\xc5"
+ "\x58\xd5\x01\x76\x87\x01\xeb\x03\xd4\x27\xf5\x92\xda\xa1\xa2\xbc"
+ "\x0d\x97\xd0\xa6\x65\x16\x63\x74\x3b\xf9\x79\xef\xe6\x80\x77\x4b"
+ "\x9a\xa3\x9b\x93\xbe\x38\xe9\x5e\x23\xcf\x76\xf4\x15\xb8\xec\x77"
+ "\x85\xc4\xe7\x9f\x66\x6f\xac\x95\xbe\x58\xdf\xa8\xd0\xce\x92\x5b"
+ "\xa4\x7c\xb7\xf6\x33\x82\x3d\xf5\x2b\xba\xd4\x5c\xee\xee\xf0\xb2"
+ "\xe8\xf6\x91\xa0\x59\xde\x60\xd5\x2a\xd1\xa7\xbf\xab\xd0\xdb\x39"
+ "\xc8\x1a\xf3\xbb\x81\x5f\xd4\x4b\xbc\x83\xf8\x17\xa9\x67\xf6\xbb"
+ "\x03\x36\x47\x44\x2a\x78\x15\x03\xda\x49\xf7\x98\x46\x81\x46\x7b"
+ "\x90\xf4\x10\xd1\x3e\xec\xd9\xbf\x3b\x71\x35\x1f\xc8\x80\x0f\xe8"
+ "\x82\xdf\xa3\x0d\xbf\x13\xf2\x54\xf2\x11\x2b\x65\xac\xbf\x8f\xd7"
+ "\xed\x70\xf0\x4b\xbc\x90\xf6\x5e\xd4\x5b\xb2\x76\x85\xa8\x83\xfc"
+ "\xe2\x76\xe4\x5b\xf9\xc9\x7a\xab\x77\x50\x5b\x07\x61\xfa\x73\x5e"
+ "\xcd\xd7\x9e\xd0\x25\xe8\xaf\x3f\xf7\xfb\xc2\x30\x79\x0d\xe9\x13"
+ "\x94\x90\xce\x84\xb4\x97\xf4\x7b\xa1\x13\x98\xe6\x90\x76\x61\xdc"
+ "\xfe\x4e\x8d\xef\xf8\xfd\xfb\xc2\xff\x16\xd1\xb4\x42\xe7\xee\x8c"
+ "\xa6\x27\xf7\xfb\x79\x54\x47\xfd\x15\x3e\xbe\xb3\x97\xcc\x7b\x7a"
+ "\x51\xb6\x14\x61\x4e\x58\x98\x3f\xef\x99\xfe\xbc\x91\x51\xf0\xe2"
+ "\x65\xbf\x6f\x91\x67\x02\xfb\xa3\xc3\x78\x04\x63\x9f\x4c\xd7\xc0"
+ "\xf6\x4b\xb9\xee\xfe\xe4\x81\xe4\xba\x8f\x3c\xb3\x64\x69\x9e\xa8"
+ "\x43\xa8\x14\x66\xcb\x5b\x81\xc3\xd9\x13\xd3\x1f\x99\x3e\x61\x59"
+ "\x76\xbe\x70\xaa\x23\x85\xa8\xf3\xb2\xb2\xf2\x34\x85\xc3\x5c\xca"
+ "\x45\x5f\x16\xac\x14\x59\xed\xcf\xe6\x4b\x55\xc5\x65\x8b\xe6\xad"
+ "\xc8\xd6\x8a\x08\x6f\x6b\x02\xe1\xcb\xfa\x6a\x21\xab\x1a\x2e\xf5"
+ "\x23\xf6\x1f\x08\x3b\x4f\x0d\x97\xdf\xdc\x88\x6f\x7d\xe7\xff\xf6"
+ "\x5b\x68\xae\xbc\x99\xdb\x54\x23\x6c\x99\x18\x8f\xfe\x86\xe0\xfb"
+ "\xe6\x0c\xf2\x03\x81\xbd\xad\x84\xfc\x16\x6b\xba\x07\xc0\xd7\x6f"
+ "\x8e\x03\xaf\x55\x02\xf8\x3a\xd2\x82\x2a\x07\x4e\x05\x9f\xfe\x56"
+ "\xbc\x26\x13\x89\x52\x0d\xfb\xa7\x90\xde\xd8\x0e\x21\xbf\x7b\x73"
+ "\x6a\x48\x7e\xf7\x16\xe9\xf4\x44\x61\xbc\xdb\xa9\x6d\xd4\x4e\x7c"
+ "\x9f\x1b\xa6\xb3\xd3\xee\x01\x18\xa9\x1c\xd2\x2d\x11\x3e\x5a\x40"
+ "\x13\x6b\xf6\x20\x0c\x4d\xbf\xa1\x7d\xe8\x8f\x6b\x09\xe7\xaa\xce"
+ "\x5c\x87\x5c\x33\x7f\xd8\xce\x37\x65\x0f\x9d\xe4\x63\xf1\x12\x67"
+ "\xbc\x49\xbc\xf8\xf5\x68\x63\x3d\xe2\xa3\x80\x77\x86\x10\x6d\x24"
+ "\xcf\xa8\xde\xfc\x5a\x93\xe7\x11\x7c\x86\x84\xb5\xc1\x13\x92\xf9"
+ "\xbd\x15\xef\x8d\xcd\x75\xac\x95\x3a\x39\x42\xff\x40\xea\x80\xfc"
+ "\xc1\xd8\x27\xe3\x42\xdd\xda\x99\x7b\xfc\x69\xa4\x07\x2c\x1c\xda"
+ "\x39\x38\xf5\x3d\x9d\xfa\x2d\x75\x29\xff\xd0\x8f\xff\x91\x3e\x31"
+ "\xb2\x87\xaa\x52\x5f\x96\xda\x9e\x2d\xe8\x28\x92\x2f\xf6\x10\xbc"
+ "\xff\xb0\x0a\xdf\xb1\xd7\xfd\xc1\xee\x61\xbf\xef\x6b\x0f\xb5\x39"
+ "\xdf\x01\x62\x00\xf9\x68\xef\x43\x9b\x86\x22\x4d\x55\xa8\xcd\x7f"
+ "\x10\x67\xa3\xc4\x53\x4a\x1a\xe4\x8f\x51\x52\xce\x9b\x5b\x11\x36"
+ "\x6e\xc6\x73\xec\x0f\x5f\xa3\xad\x15\x6b\xa4\xee\xcb\x10\x5d\xa7"
+ "\x04\x65\xf5\xeb\x7f\x48\x06\xbb\x7f\x89\x94\xc1\xfe\x91\x85\xc6"
+ "\xf0\x0f\xf5\x34\xef\x49\x6f\x48\xd7\x19\xa2\xf1\x94\xfe\x42\xfe"
+ "\x98\xa4\x97\xa3\xc6\xe5\xe6\x10\x9f\x5c\x29\xcf\xbf\x31\x2e\x7f"
+ "\xcc\x8d\x50\x4e\x0a\x5a\x6a\x92\x9f\xd5\x20\x2e\x12\x71\x4f\x51"
+ "\x3a\xaa\x53\xc8\x2a\x01\x1b\xea\x8b\x0a\x1e\x2b\xc2\x12\x99\x86"
+ "\xf2\x30\xaf\xf6\xb4\x84\xe6\xc6\x1f\x53\x05\xbe\xd4\x60\xcd\xcb"
+ "\xf6\xaf\x09\xf1\xee\x7f\xdc\xd5\x27\x77\x43\x39\xa1\x3d\xe3\x8f"
+ "\xef\x13\x8c\x37\xf4\xc9\x20\xea\x02\xa2\x1d\xf2\x3c\xf5\xc8\x69"
+ "\x56\x77\x96\x83\xbe\xa0\xbd\x96\xf8\x43\x1a\x7b\x41\xef\x09\xf9"
+ "\x59\xdd\xab\x3b\xe4\x99\xc5\x16\xbc\xbf\xa6\x1a\x06\x9a\x3b\x75"
+ "\x09\xe1\xfa\xbd\x12\xfe\x75\x59\x2a\x95\x89\xfe\x53\x59\xd8\x7f"
+ "\x14\x5d\xae\xa9\x95\xfb\x04\xca\xfc\xf7\xd3\x1a\xac\xc5\x59\xde"
+ "\x26\x0d\x0e\x34\xc6\x02\xe6\x75\xf9\x98\x03\xc2\x67\x5a\x71\x0d"
+ "\x3f\xbb\x14\x65\x48\xdf\xba\x75\x55\x9c\x60\xab\xa5\xf7\x12\xff"
+ "\x8d\xb6\xcb\x3b\x91\x98\x8b\xe0\x4d\xa9\x9d\xea\xa6\x5c\x3b\xb5"
+ "\x9d\xce\xf1\x42\x32\x95\xba\xf7\x29\xaf\xf7\x79\x99\x67\x83\x3c"
+ "\x67\xc4\xd8\xd4\x29\x7c\x65\x0e\xd3\xce\xb7\x30\xcf\xff\x40\x7e"
+ "\xd7\x0c\x54\x8e\x4f\xf0\xcc\x75\x1e\x15\x70\xc1\x98\xc4\x75\x97"
+ "\xbd\x15\xad\x8f\x09\xc6\xa3\xe1\x2a\xf4\x36\xc6\xe4\xad\x29\xba"
+ "\x6d\x25\xda\x9b\xb0\x86\x4b\x24\x2d\xf9\xd6\x65\x53\xe9\x83\xdc"
+ "\x14\xb8\xe7\x1e\xa2\x8d\x76\x1a\x84\x2c\x54\xd7\x5f\x1d\x0b\x38"
+ "\x9d\xd7\xef\x02\xa8\x6b\x7e\xd1\x4a\xba\xbf\x6e\xbf\xd4\xfd\xa5"
+ "\xf8\xc7\x7c\x5c\x6d\xf2\x05\xe9\x2e\x4c\x2b\xea\xa8\xd6\xf9\x2c"
+ "\xc2\x6f\x11\xa5\x0a\x60\xf7\x16\xdd\x7f\x3c\xa0\xe1\xb5\xa1\x67"
+ "\xd8\x5b\xc7\xb5\xf2\xc3\xdb\x30\x47\x9e\x29\xbe\xe5\x97\xb4\xff"
+ "\x5b\x84\x7b\xaa\x24\xbf\xf6\x96\x57\x6f\x37\xbe\x1f\xb8\xb2\x8f"
+ "\xe9\xd3\x1e\xc9\xb6\x2e\x22\x14\x9d\x72\xb7\xc3\x9a\x34\x3e\x6b"
+ "\x92\x50\x16\xb7\xfe\x60\xda\xfd\xd6\xf4\x07\xc6\x3b\x72\x92\x1f"
+ "\x93\x8f\x69\xe9\xb3\xe8\x79\x85\xee\x80\xb5\xbb\xec\x4f\xe9\xfd"
+ "\xf9\xc1\x43\x5a\x1b\xfe\x94\xe3\x51\x7e\x24\x64\x17\xdc\x6c\x4b"
+ "\xe5\xce\xd9\x25\xd8\x53\x3b\x89\x4e\x4e\x0b\x7e\xc1\xf9\xc6\xd9"
+ "\x25\x3c\xd6\x96\xea\x8d\x3d\x52\x81\x5f\xba\x37\x36\x3b\x79\x03"
+ "\x70\xa0\xa9\x94\xfb\x4d\x81\xa1\x12\x57\x22\x0c\x9a\xa4\x03\x74"
+ "\x0f\x8d\x25\x9b\x71\x7b\x31\x4f\x0b\x72\x37\xe8\x1f\xc0\xe5\x4f"
+ "\x0d\xfa\x3e\x2e\xe4\x98\x4e\x5b\x6a\x9a\x83\xf7\xd2\xdc\x01\x7d"
+ "\x40\xf7\x69\x53\x49\x96\x89\x74\xe8\xff\xbe\x14\x09\x8b\x3f\x11"
+ "\x0c\xac\x1a\x7c\xd3\xbb\xcb\xfe\x8c\xf1\x4f\x13\xb2\x67\xb5\xcc"
+ "\x22\xf6\x0a\x75\xcd\x1d\x8f\x83\x17\x48\xd7\xcb\x44\x59\xd1\xda"
+ "\xdd\x32\x51\x1e\x0b\xb3\x4d\x70\xb5\x9f\xba\x29\x73\x0e\xc9\xad"
+ "\xe8\x5e\xb0\xc9\xa1\x90\xff\xad\x8c\x3e\x59\x1d\xbe\xc5\x94\x9a"
+ "\x49\x7e\x97\x11\xe3\x53\x4a\x28\x4d\x48\xa6\xa5\x7a\x36\x18\x54"
+ "\x3f\xe8\x09\x33\xcd\x0f\x41\xab\x0a\x7d\x8a\x3f\xd7\xf5\x9d\xcf"
+ "\xf5\x1b\xfb\x3f\x8b\xf9\x70\xa1\xcc\x88\xb9\xfd\xa7\xd4\x5b\xe2"
+ "\x25\xed\xa4\x96\x29\x4c\xda\x8a\xf8\xf3\xeb\x62\x5d\x6a\xf3\x11"
+ "\xf0\xf5\xd2\xd9\xb9\x29\xc0\xbd\x74\x4f\x45\x8d\xc0\x9c\x64\x67"
+ "\x98\xbb\xb0\xbb\x84\xee\xab\xf7\xcd\x4b\x3b\xe6\xa5\x1d\xf3\x92"
+ "\xf4\x1c\x50\xbf\x37\xe2\x8e\x4c\xac\x59\xe5\x0c\xfb\x73\x21\xb5"
+ "\x9f\x60\x03\xfa\x3d\x5a\x05\xac\x84\x3e\x2b\xc1\x27\x6e\x5e\x0b"
+ "\xdd\x33\xa4\xbe\x9a\x02\xe8\x73\x78\xbf\x0c\xaa\xa7\xb2\x0c\xfd"
+ "\x32\xa0\x5f\x8e\xb3\x42\x16\x44\xf7\x3f\x81\x4b\x46\x85\x7c\xb8"
+ "\x1c\xa8\x0e\xef\xa3\x4a\x7e\x9f\x44\x1f\x0e\xbc\x3d\x50\x1f\xb9"
+ "\x81\xfa\x48\x30\x38\xb0\x51\x3b\xe7\x14\xed\x24\xbc\xd5\xc9\x0e"
+ "\xa4\xc7\x94\xd2\xbd\x4b\x5b\x2a\xe8\xde\x69\x34\x86\x3b\xca\xb8"
+ "\x93\xda\x39\xd0\x78\x51\x79\xb2\xac\xb7\xe7\x9a\x4a\x4b\x32\xbb"
+ "\xcb\xde\x4e\x1a\x18\xde\x6f\x3f\x72\x75\x78\xbf\x3d\x86\xf2\x53"
+ "\x3b\xe8\x0e\xa9\x89\x0c\x8c\x61\x7e\x83\xae\xa8\x18\xa8\xde\x98"
+ "\xd2\x1a\x6a\xd7\x80\xdf\x30\xf7\x3b\x37\xe4\xf5\x5f\x13\xea\x0e"
+ "\x3f\x23\xf8\x91\xbc\x48\xca\xf5\xdf\x6e\xee\x3b\x7f\x70\xda\x72"
+ "\x4c\x8a\x35\x82\xd6\x98\xa0\x89\xd1\xdf\x81\xca\x35\x29\x4e\xb2"
+ "\x51\x38\x0d\xb8\x6a\xc0\xef\x58\x07\x56\xbe\xe6\xce\x5b\x50\x5e"
+ "\x72\x4c\xa9\xc2\xbd\x11\x77\x0e\x8f\xf1\x05\x12\x09\xae\x68\xab"
+ "\x03\x6b\xfc\x94\xd8\xbb\x85\xac\xe4\x20\xd6\xff\x87\xc2\xef\x8e"
+ "\x37\xd6\x96\x2c\xf5\x82\x0e\x66\x79\xd8\x5f\xc3\x7c\xa1\x1e\xcc"
+ "\xf7\x28\xdf\xa9\x90\x6b\xf5\xa6\x97\xf9\xa6\xac\x76\xb5\xcc\xc4"
+ "\xad\x05\x26\x8e\xb2\x46\xa8\x3c\xc9\xc0\xe3\xb2\xda\x43\x73\x47"
+ "\xde\x53\xd5\xe7\x0e\xf2\xef\x1f\x78\x5e\x1c\xfc\xf8\xea\xf3\xe2"
+ "\xe0\x6b\x9a\x9c\x37\x53\xea\xde\x1e\x0c\xe8\x3c\x07\x5f\x73\xd3"
+ "\xcb\xd6\x22\xaa\xff\xa0\x53\xd6\x0d\x98\x04\x52\x09\xcf\xcc\x02"
+ "\xdc\x4a\xba\xcb\x0e\x25\xe9\xb8\x81\xe6\x90\x29\x48\xfc\x10\x13"
+ "\xf3\x1c\xdf\xa6\x03\xf7\x68\x67\x84\xd9\x2d\x44\xab\xaa\x65\x7f"
+ "\x32\x62\xff\xda\x46\x77\x4f\x7c\xb1\xb6\x3d\x48\x03\xfc\x67\x9c"
+ "\xa9\xe1\xbf\x5d\x28\x63\x77\x95\xb4\x43\x11\x25\x7c\x06\x62\x9d"
+ "\x93\x9f\x40\x5a\xeb\x88\x8b\x47\xbb\xc9\x67\x20\x78\x84\x43\x35"
+ "\xfa\xde\xaf\x96\xa5\x12\xbc\x85\xcc\xd8\x40\xf4\x30\x60\xb7\xd9"
+ "\xa0\xee\xbe\x34\xc9\xc2\xa8\xcf\x97\xd6\x8c\xde\xfd\x7f\x27\x32"
+ "\xe3\xbb\x96\xa7\x99\xfd\x6e\x16\x5f\xfa\x5d\x23\xfb\xfb\x14\x66"
+ "\x20\x38\x78\xd8\xa1\x5a\x09\xbb\x43\x5e\x7d\x7c\x3c\xec\x60\x06"
+ "\x8d\x07\x9d\xcb\xa4\x05\x78\x97\x3c\x97\x72\x99\xb1\x07\x5a\xe4"
+ "\xf7\x3f\xcd\x1d\x60\x7f\x98\x61\xcd\x5d\x66\xcd\x5a\xba\x72\xc9"
+ "\xb8\x71\xc3\x07\xe0\x25\x5c\x89\x92\x97\x70\x65\x84\xf3\x12\x08"
+ "\x63\x4f\xff\xd3\x94\x2b\x79\x87\x59\x36\xcd\xbc\x88\x2d\x85\x85"
+ "\xde\xef\x62\xb3\xee\x0a\x0b\xde\xc3\x66\xdd\x7d\x8f\xed\xf1\xec"
+ "\x79\x59\xab\xc2\x62\xef\x0d\x97\x23\x6e\x78\x19\x75\x47\x8c\x7e"
+ "\x18\xf8\x43\x79\xec\x79\xda\x77\x0e\xcf\x2e\x0a\xf0\xaf\x30\x77"
+ "\xa7\x90\x4d\xaf\x63\xf9\x01\x76\x0c\xf8\x8d\xdf\x44\x78\x7d\xa8"
+ "\xb4\x6b\x1b\x64\x24\xa7\x33\xa1\xef\x5e\xf0\x74\x17\xe5\xdd\x8b"
+ "\xc3\xcf\x35\x6d\xf5\x03\x4f\x64\x4f\x96\xf4\xce\xe1\x64\xc4\xc7"
+ "\xe2\xf9\x84\x3c\xd3\x39\xfc\x24\xf8\xe5\x54\x61\xc3\x64\x05\xd9"
+ "\x30\x39\x2c\x74\xc3\x26\xfa\x4a\x98\xb4\xa5\xe7\x6a\x27\x1b\xf7"
+ "\x1e\x76\xb8\x8a\xe8\x0b\x4a\x8b\x3c\x13\xac\x0b\x59\x0a\x3d\x89"
+ "\x1e\xc6\xb7\x64\xbe\x31\x7b\x32\xdf\x96\x41\x3a\x35\x89\x88\xdf"
+ "\x48\x74\x5b\x84\x25\x2a\xba\xbb\xec\xb0\x53\xa7\x41\x7c\x83\xdc"
+ "\xfd\x22\x38\xeb\xfb\x60\x0c\xf0\x77\x8c\xcf\xc4\x6d\x64\x13\x48"
+ "\x61\x89\xb4\x3f\x98\x1c\xe9\xe2\x6e\x21\xed\x8b\x84\x13\x76\x08"
+ "\x5c\x7a\xb8\x43\xc7\x0b\x95\x92\x1f\x1d\x4e\xf9\xb1\x7f\x9e\x97"
+ "\xfb\xe7\x91\x28\x7d\x2d\xe0\x3d\x5e\x9f\xab\xfd\xee\x97\x2d\xc9"
+ "\xcf\xce\xcb\xce\xb2\x8e\x5f\x36\x9c\x85\x79\x60\xcd\xc9\x5e\x62"
+ "\xcd\xcb\x7e\x6e\x79\xf6\x32\xc1\xe8\xd1\xd7\xfe\xe7\x6f\xc0\x41"
+ "\x21\x7f\xd8\xa3\x09\xc6\x47\x56\x11\x2f\x6c\x2a\x1d\x27\xce\x52"
+ "\xe4\x19\xd8\xf1\x06\xb5\x72\x44\xaa\x94\x5b\x9e\x01\x5c\x8f\x4a"
+ "\x7b\x5c\xce\x6c\xc2\x33\x80\xeb\xd1\xf5\x52\x57\xe6\xc8\x3b\x1a"
+ "\xac\xaa\xd0\xce\x03\x21\x7a\xad\x5e\xd8\x1d\x92\x3a\xab\x47\x5a"
+ "\x3c\xcc\xb5\x3f\x44\x83\xd4\x3f\x40\x78\x50\xe0\xc3\x7f\x80\x0b"
+ "\x35\xda\x19\xf5\x1c\x2d\xe5\x2b\x78\xfb\x86\x1e\x26\xe4\x81\xe4"
+ "\x1b\x41\xe2\xd7\xa3\x29\x3a\x1c\x41\xbf\xb4\x93\xdc\x41\xe7\x8f"
+ "\xd2\x02\x97\x79\xd1\x2a\x66\x20\xd9\x03\xe8\xee\x29\x7b\xf3\xbc"
+ "\x06\x5e\x76\xc4\x0a\x5a\x26\x91\xd2\xec\xd0\x74\x37\x79\x6c\x36"
+ "\xe8\xa4\xa3\x8e\x10\xdf\x51\x3f\x55\xd0\xf1\x3d\x34\x6f\x8e\x26"
+ "\xd8\x68\x8f\x90\xb8\xfb\xba\x7f\xd4\x5e\x3e\x5c\x9e\xa3\x48\xfc"
+ "\x76\xb4\x4e\xeb\x43\x27\xe1\x2c\x4d\xf7\xd7\x20\xe7\x75\xfd\x54"
+ "\xcc\xb9\x44\x1a\x0b\xe0\xf9\x0a\x1d\x5e\xd4\x5f\x6a\x3b\xc9\xad"
+ "\x81\xbb\xa6\xec\x2b\xf0\x1b\xa4\xef\xd2\x23\xc9\x92\x3f\xaa\xb7"
+ "\x86\x9f\x1b\x4a\x5e\xa8\x7e\x72\xc8\x4e\xc8\x91\xaa\x2b\x71\xc4"
+ "\xd2\x25\x74\x9d\xec\x59\xdb\xca\x79\xcf\x66\xdb\x96\xdb\x93\xad"
+ "\xcb\x97\x88\x63\x5b\x21\x06\xc8\x5f\x3e\xff\x59\x2b\x61\x11\xdb"
+ "\xf4\x59\xb3\x6c\x0f\x3f\xf1\x93\x27\x87\xb3\x87\xe7\x21\x2e\x7f"
+ "\xa9\x75\x56\x4a\xb2\xfc\xf4\xf8\x8c\x69\x3f\xb5\x4d\x4b\x7b\xe2"
+ "\xb1\x39\x03\xe8\xa4\x47\x63\x4e\x58\x31\x46\x43\xda\xd8\xbb\xeb"
+ "\xa4\x0e\x52\x7d\x43\x7f\x1d\xa4\x7a\x0f\x7e\xc0\xce\xef\x58\x18"
+ "\x7b\x17\xb1\xef\xae\xc3\xaf\x44\xce\x9b\x61\x66\xb4\xdf\x17\x9a"
+ "\x37\xef\x8a\xf3\x36\x92\x1d\x48\xd9\xeb\x3b\xc0\x7f\x47\x66\x85"
+ "\x7f\x0b\xe1\x82\x77\x82\x02\x5f\x6a\xf3\x82\xe6\x83\x2d\x10\x25"
+ "\xe6\x86\xa4\x57\xde\x99\xa5\xcf\x8d\x0d\xf2\x7c\x88\x91\xcc\x8c"
+ "\xbe\x63\x7e\xef\x27\xf9\x32\xe6\x82\x95\xce\xd6\x29\x9e\xc7\x1e"
+ "\xdf\xaf\x95\xbb\x96\xe4\xcd\x44\xcf\x6a\x67\x62\x31\x67\xd8\x3b"
+ "\x87\x79\x59\xfd\x4c\xc9\x0b\xd6\xaf\x12\xf3\x66\xcd\xe8\x87\xc5"
+ "\x19\xa4\xb8\x4f\xf4\x4e\x5d\x68\xfe\xbc\xbb\x8e\xc6\x86\xf0\x82"
+ "\xc4\xbd\xef\xb4\x5c\x21\xc7\x89\x40\x5c\x87\x6e\x67\x3e\x7f\x1c"
+ "\x33\x18\xc7\x39\x59\x95\x81\x97\x78\xd8\x3b\x5b\xa5\x1e\xea\xbb"
+ "\x51\x3a\xfd\x8c\xf7\x78\x0f\xe3\xad\x57\xca\xbf\x2a\xc3\xe4\x5f"
+ "\x45\x76\x7e\xb2\xc9\xee\x25\x1a\xd9\xe5\xf6\x0a\xfb\xa6\x0f\x36"
+ "\xd9\x7d\xa4\x5b\x32\xfc\x34\x7b\xf7\xa9\xe2\x20\xef\xc1\xfb\x68"
+ "\xf4\x4d\xec\x21\x93\xa4\x4c\x01\xfc\xd8\xbb\xeb\x25\x6f\x22\xe3"
+ "\x09\xee\x78\xa7\x36\x1a\x69\x7c\x30\x2f\x3b\x30\x46\x69\x03\xe1"
+ "\xbd\x98\x52\x83\x66\x47\xea\xdd\x93\xc4\xa3\x12\xac\x5e\x34\xa8"
+ "\x39\x2f\x96\xe1\x87\x27\xe1\xbe\x10\x7d\xc9\xfd\x12\xb6\xef\x7a"
+ "\xea\x1d\x9d\xb4\x6f\xfa\x07\xc3\xa5\x18\xcf\x13\xfa\x78\xa6\x05"
+ "\xbd\x0f\xd2\x78\x75\x97\xbd\x67\xd1\xc7\xb2\x6b\xe2\x7c\xf0\x5e"
+ "\xcc\x7a\xb4\xfa\x6e\x8a\xc7\xfa\x7f\x77\xab\xd0\xed\xa1\xf5\x75"
+ "\x45\x5e\xe0\xe1\x54\x2d\x7f\x86\x9e\xff\x4a\xfb\xc4\xe2\x82\x2e"
+ "\x09\xb9\xee\x97\x3a\x3e\x9a\x3b\xe9\x7e\x3a\x3e\x74\x06\x58\x2f"
+ "\xe7\xa4\x2e\x83\x33\xcb\xfe\x34\xfc\x58\xdd\x04\xfe\x7b\xd3\xdc"
+ "\xd1\x9a\x1c\x00\x6b\xfb\xbd\x8b\x13\x19\x5b\xe4\x5b\x99\xd1\x27"
+ "\x43\x21\xd9\x07\xd9\x1c\x44\x3b\x3c\x61\x32\xb2\x3e\x1d\x4d\x0f"
+ "\x6b\x48\x27\x9d\x31\xba\xb3\x4c\xe5\xd0\xba\x92\x72\x9b\x06\xb3"
+ "\x1b\x98\x17\xe5\x2d\x11\xe7\xdf\x65\xef\xe5\x88\xb9\x07\x5e\x5b"
+ "\xf0\xf9\x85\xfc\x2b\x4d\x87\x49\xd0\x2e\xf2\x3e\x5e\xc3\xf4\x3e"
+ "\x59\x90\xb8\x9b\xf6\x9e\xd0\xcb\x46\xfc\xdc\x81\xe4\x85\xc0\x0f"
+ "\x39\xf3\x96\x64\x2d\x5d\xb0\xe0\x1f\xa3\x86\xf0\x33\x2e\x67\x99"
+ "\x5a\x81\x32\xc1\xff\xee\xcb\x91\xf3\xb4\x01\xf8\xff\x37\xa9\x92"
+ "\x7e\xfb\xc5\xd7\x58\x37\x63\xce\xb0\xf7\x2d\x3a\xfd\x2e\xd7\xd1"
+ "\xfb\x89\xbc\xac\x21\x27\xb4\x36\x1a\xbc\xdf\x5e\x1b\xef\x1b\x07"
+ "\x5e\x1b\xef\x27\x61\x9f\x3d\x81\xef\x89\xa8\xf3\x84\xc0\xf9\x34"
+ "\xde\x92\x06\x77\x99\x02\x0f\x0a\x1a\xdc\xb6\x8a\x29\x44\x7f\x93"
+ "\x6c\x9a\xf6\x83\x20\xf8\xda\x20\x70\x84\x2d\xc0\xcc\xb4\x17\x6c"
+ "\x58\x42\x72\xc7\xb1\x3c\x70\x89\x7b\x6c\xab\x80\x2f\x10\xae\x3c"
+ "\x23\xcf\xe0\x7f\x79\x11\x7c\x08\xde\x37\x9c\x26\x5c\xa1\x92\x33"
+ "\x04\x26\xf7\xeb\xf7\xb7\xea\x34\xae\xa9\xd4\x2a\x6c\x64\xd3\xbe"
+ "\x1d\x94\xfa\x4c\xb5\xb4\x77\xa3\x9e\xfd\x02\x07\x05\x4d\x74\x06"
+ "\xc0\x36\x2c\x44\xb9\xa4\x17\xb4\x84\xda\x17\x71\x8f\x29\x90\x22"
+ "\xce\x0a\x76\x2e\x14\xfa\x40\xf7\x48\x7d\xa0\x7b\xd8\x8e\x25\x04"
+ "\x87\xf7\xfd\x57\x95\x8d\xc7\x1e\xb1\x87\xc7\x3b\x16\xe4\xda\xec"
+ "\x39\xab\x6c\xa4\x0b\x78\xc5\xfe\x2e\xd7\x50\xd9\x07\x09\x12\xbe"
+ "\x1f\xa4\x87\x64\x55\x52\x87\x8f\x70\xe6\x24\xbf\xb0\x61\xab\x9d"
+ "\xf5\x7c\x38\x99\x60\x5f\x7c\x99\xc2\x51\x98\x73\x1f\x4e\xa0\xb3"
+ "\x9f\x2e\xd2\x9d\xd9\x99\xc1\x9c\x65\xdc\x45\x32\x34\xc4\x8f\xd4"
+ "\xef\xd4\x77\x21\x1e\x6b\x9f\xe2\x86\x89\xb3\xc6\x7c\x21\x9b\x03"
+ "\x9c\x3e\x70\x79\x98\x49\xd3\x75\x9d\x7b\x13\xe9\xe7\x09\x9d\x72"
+ "\x41\x67\x7c\x70\x56\xde\xd1\xfa\xa0\x5d\x87\x25\x68\xdf\x29\x74"
+ "\xaf\x9f\xf4\x74\xba\x38\xe9\x04\x7e\xc8\xf4\xfc\x1e\xf6\x81\xb8"
+ "\x63\xfa\x98\x4f\xbc\xef\xf9\xa5\x2f\xfc\x4e\xfe\x07\x5b\x25\xde"
+ "\xfa\xa0\x1a\xf1\xc0\x95\x1f\x94\xa0\xcd\x31\xd2\x46\x80\x28\x67"
+ "\xa6\xae\x0f\x15\x0e\xb7\x69\xf3\xec\x20\x96\x73\x17\x2c\xc8\xce"
+ "\x5b\xa6\xfb\x94\x4f\x5a\xba\x28\xeb\x01\xed\x0e\xfe\x92\xec\x95"
+ "\xb6\xdc\x2c\x71\xc7\x07\xb1\xf2\xf5\x0a\xf8\x26\x13\x7f\x23\xf4"
+ "\xe6\x45\x9f\x9a\xc7\xef\xd0\xe8\xa8\x36\xd6\xb8\x5f\xea\x5b\x34"
+ "\x2e\x96\x7b\xdb\x75\xff\x81\x76\x34\xeb\x7b\x1b\xc9\x58\xba\xd8"
+ "\x7d\x56\x3a\x33\x23\xbb\x0c\x74\x36\x47\x72\x16\xa4\xc1\x1a\xfd"
+ "\xa0\xef\xce\xf4\x7a\xc4\xd3\x99\xb0\x6b\x09\x9d\x03\x37\xcf\x50"
+ "\x37\xda\x12\x78\xdc\xa3\x0d\xc0\x6b\xd1\x34\x76\x74\x56\x24\x7d"
+ "\x78\x34\xa6\x12\xbe\x26\x59\xa0\x6b\x09\xe9\xd3\x36\x9a\x41\x9f"
+ "\x60\xbf\x6c\x9e\x09\x5e\x2f\x61\x6d\x01\x8b\xa2\x3a\xb0\x17\x7a"
+ "\xa4\x5c\xb9\x71\xee\xe1\x42\xc6\xb4\xfd\xd0\xb3\x5e\xc8\x39\x1b"
+ "\x93\xe4\x9e\x6a\x4b\xd1\xe4\x28\x29\x48\xb7\xd6\xc3\x6e\xf5\xca"
+ "\x36\x3f\xea\x15\xf3\x44\xe0\xba\xc6\xdd\x7c\xd3\xac\x12\xa1\xf3"
+ "\xbc\xe9\x51\xaf\xca\x73\x22\x28\x8c\xbd\x66\x38\xc6\xb1\x99\x17"
+ "\x27\x31\x4d\x4f\x3a\xe2\x34\x3b\x76\x17\xc9\x81\x31\x3f\x5c\x04"
+ "\x0b\x94\x3f\x55\x2b\x7f\x2a\xca\x47\xbd\xf7\x68\xfe\x73\x1b\xbd"
+ "\x7a\x5d\x58\xaf\x5e\xec\xc7\x09\xb4\x27\xa3\xfd\xf1\xf8\x59\xa4"
+ "\xcc\xc9\x0f\xde\x6f\x6c\x9f\xcc\x49\xd2\x7d\xc7\x92\xf4\xf5\x42"
+ "\x75\x6b\x7d\x98\xa2\x96\x09\xfb\xad\x8a\x56\xd7\x14\x92\x7f\xe8"
+ "\x65\x72\x94\xc9\x2f\x75\xd6\x60\xff\x8c\x02\xde\xf0\xc6\x94\x62"
+ "\x9f\xa4\x3a\x88\x6e\xf7\x8d\xe5\xd8\x47\x83\xb6\xa0\x51\xda\xd0"
+ "\x58\xc5\x46\x84\xd3\xec\xa8\x6f\x6b\x88\xce\x44\x19\x97\x80\x9f"
+ "\x8b\x58\x49\x3b\x3b\xf6\x06\xd5\x4d\x7a\x4e\x34\xae\x3d\x18\x27"
+ "\x8c\x55\x33\xea\xa9\x05\xaf\x31\x02\x70\xf8\x98\xc6\x8b\x74\x47"
+ "\x76\xf4\x08\xfe\xc3\x84\xb6\x19\xdb\xd8\xb1\xc3\x34\x56\x54\x16"
+ "\x77\xce\xaa\x09\x74\x67\xfc\x90\x6c\xd8\x11\xac\x57\x17\xf2\x0e"
+ "\x3a\xbf\x3c\xcd\xdc\x33\x88\x2e\x07\xaf\x22\xde\x8b\xb3\xb8\x2a"
+ "\xc6\x5a\xe8\x4e\xbb\x67\xac\xee\xe0\xea\xe5\x32\xc6\x1b\xb0\x3f"
+ "\x5c\x36\xb0\x80\x1f\x7c\x35\xda\x6d\x28\x3e\x4b\x76\xf6\x6a\x80"
+ "\x6b\x2a\x48\x67\x25\xaa\xb2\x80\x99\xc9\x46\x61\xb1\x9d\xfb\x9b"
+ "\x7c\xd5\xac\xc9\x5e\xcd\x3e\x08\x54\x31\xd7\x0a\x92\xd3\xba\x3b"
+ "\x3f\x74\x54\xd1\x5d\x95\x61\x78\x7f\xdd\xfa\x53\xaa\xab\x69\xed"
+ "\x87\x2d\x1f\x61\xe4\x3e\x62\xd6\x9f\x8b\x70\x55\x63\xc6\x07\x98"
+ "\x6d\x1f\xb0\xe2\x76\xae\x12\x8d\x57\xb4\x98\xea\xa8\x40\x59\x35"
+ "\x64\xcf\xcf\xac\x76\x59\x86\xa3\xff\xc6\x34\x07\x13\x67\xa4\xae"
+ "\x25\x7f\xa2\x36\x8e\xdc\x71\x81\x45\xb9\x96\x1c\x11\xef\x42\x66"
+ "\x82\xfe\xba\xb3\x5a\x85\x0e\x26\xd9\x32\x74\x3b\x3a\xe8\xce\xb7"
+ "\xba\x81\xda\x18\x94\xed\x06\xbc\x8c\x7a\xfe\x9d\x45\x7a\xfe\x26"
+ "\x81\x0b\xb6\x13\x3c\xd0\xa6\x63\x73\x24\x4c\x1a\x11\x2b\xdb\x0c"
+ "\xf8\x64\x84\xc3\xa7\x69\x32\xc1\x87\x74\xd2\xd5\x15\x9d\x35\x68"
+ "\x5b\x2a\x60\xa0\xea\x75\xd0\x1c\xa0\xb3\x3c\x2a\xbf\xf2\x02\x8b"
+ "\x76\x2d\x21\x9d\x75\xf7\x4b\xa6\x74\x63\x94\x7a\xe9\x6c\xed\x86"
+ "\x8b\xcc\x48\xe3\x46\xb4\xc3\x06\xf1\x5d\xc0\xbc\x90\xc6\xcc\x1b"
+ "\x3b\x37\x0a\xbf\x68\xfc\xcc\x34\xf7\xf0\x8c\xc7\x78\x55\xa0\x0d"
+ "\xf1\x18\xab\x1a\x7a\xca\xf9\x38\x9b\xc6\xd3\x4c\xfb\x33\xe6\x4a"
+ "\x28\x7e\xd3\xec\x07\x03\x58\x3b\xaa\xe0\x3d\xdd\xf1\xea\xc6\xdc"
+ "\x4c\xa9\xbf\xfc\xe1\x9c\xed\xa0\xf5\xab\x37\x09\x1b\x19\xd1\xe0"
+ "\x4f\x48\xe6\xc0\x5e\x16\x77\xe9\x9a\x2d\x3a\x1e\x7f\x61\x14\xd9"
+ "\x9f\x70\x4f\x37\x08\x5d\x4a\xdb\x64\x6d\xae\x4f\x46\x9a\xa9\x1e"
+ "\x36\x31\x47\xae\x89\x46\x71\x07\x90\xf0\xc0\x60\x74\x16\xf6\xae"
+ "\x46\xd2\x61\xe5\x37\x65\xb0\x68\x85\x7b\xa3\x33\x4d\xdc\x1d\xa8"
+ "\xa7\x39\x14\x2d\xe6\xbe\xfc\x06\xda\xd8\x6b\xc2\xde\xd6\x8c\x78"
+ "\xa3\x1e\x4f\x7b\xa8\x0a\x7e\x99\x78\xf5\xb4\x55\x26\x5e\x74\x91"
+ "\x25\x08\xb9\x97\x1e\xbf\xca\x6b\x6a\xc2\xce\x5f\x04\xdc\x4d\xb6"
+ "\x75\x28\x0f\xe2\x23\xb0\x57\x1e\x40\xbd\x2e\xa4\x8f\xd7\xd3\xf3"
+ "\xae\x0c\xa3\xdb\x51\x2f\xd6\x19\xd9\x5f\x13\x7b\xa4\x8c\x1f\x92"
+ "\xe6\xf0\x9a\xc4\x98\xe9\x71\xcb\x32\xc4\xde\x4c\x76\x38\x40\x7b"
+ "\x73\xd1\x9e\xd3\x22\x5e\x01\xef\x4c\xf1\xe6\xb0\x38\x03\xd9\x3c"
+ "\x21\x7b\x9a\x61\x71\x11\x68\x33\xeb\x0b\xa3\x6e\xda\xa7\x69\xdd"
+ "\xa5\xad\xa2\x33\x40\xb9\x3f\x8b\xba\x57\x71\x26\x6d\xf4\xca\x38"
+ "\x49\x07\xfc\xa5\x26\x9c\x6f\xa7\x73\x17\xaa\x5b\xed\xca\x30\x04"
+ "\xbb\x32\x22\xa8\x7e\x2a\x8b\x64\xae\xe8\x23\xea\xed\x60\x64\x1f"
+ "\x9e\x6f\xfc\xac\x99\xd3\xbd\x2f\x94\x2b\xda\xe3\xf0\x03\xf7\x7c"
+ "\x9e\x3e\xb0\x7e\xcf\x7b\x15\xae\xa2\x9f\x63\x4e\x7f\xb4\x9b\x70"
+ "\x4a\xd0\x9c\x39\xdd\xba\x90\xf6\xe9\x8f\xc6\xd1\x98\x06\xb1\xce"
+ "\x83\xb1\x99\xd3\x27\x75\x30\xa5\x08\x6b\x47\x9e\x4d\x7e\xf4\x10"
+ "\xd1\x89\xc5\x2a\xe7\x78\x9f\x4c\x73\xd7\xd4\x49\x7a\x39\x99\x33"
+ "\x85\x2e\x4c\xdc\xd1\x12\xb7\xbf\x83\x35\x96\x7c\xca\x1a\x03\xee"
+ "\x92\x03\x17\xbc\x46\xa9\x13\x63\xa4\x72\x9f\xa0\x6f\xc5\x58\x2f"
+ "\xb6\x60\xcd\xe0\xbc\x2d\xf8\x25\xc0\xee\x0b\xb9\x17\x7c\xb4\x5b"
+ "\xe7\x91\xae\xde\x87\xbf\x0a\x9b\xa8\xa4\x2f\xaa\x6e\x7a\x85\xf6"
+ "\x8a\x62\xde\x9d\xc4\x26\x15\x90\xac\xfa\xa3\xd6\x18\x1f\x4b\xd5"
+ "\xca\x3d\x2f\xcb\xfd\x2b\xbb\x5a\xb9\x34\x6f\x1b\xb7\x4a\x3d\x14"
+ "\x35\xee\x15\x7b\x10\x65\x07\xe3\x5e\xa9\xc5\x5e\x53\x0c\xfa\x05"
+ "\xf4\x48\xcb\x0c\xd4\x63\x6f\x0a\x34\x33\xb2\xab\xbc\x43\xc5\x7e"
+ "\x7d\xde\xc2\x34\xfd\x9f\xe2\x73\xec\xaf\x77\xa9\x3c\xc9\x0c\xde"
+ "\x8d\xe4\xbf\xc5\x84\x67\x49\x9e\x5e\x14\x64\x91\xee\x7c\x70\x59"
+ "\xb1\xef\x61\x1d\xb7\xdc\xf7\x0e\xc9\xda\x81\xab\x82\xdc\x62\x78"
+ "\xfb\x92\x87\x6d\x00\xfe\x16\xf6\x41\xd7\xdc\xf4\x72\x4c\x29\x7b"
+ "\x90\x1b\x4c\x42\x7f\x4c\xdd\x78\xb8\x02\x63\xdb\x2a\xf5\x8d\x6c"
+ "\xd3\xc3\x74\x8d\x22\x50\xd7\x9b\xa4\x6b\xc4\xcd\xb6\xa8\x6a\xda"
+ "\x33\x31\x66\xdd\x65\x7f\x05\xfd\xff\x17\xb1\xdf\xad\x23\xba\x48"
+ "\xe0\xf9\x96\xd9\xde\xd8\xed\x64\xdf\x9c\x7c\xa5\x2a\xea\x8a\x40"
+ "\xed\x86\x6f\x98\x51\xc2\xa3\x65\x42\x53\x67\xb7\x8b\x3b\xb7\xa7"
+ "\xd3\x3a\xd2\xca\x36\xa1\xec\x20\xdf\x48\x77\xdb\x5a\x66\xc9\xb1"
+ "\x11\xef\x16\xfa\x1e\xe8\xa5\xbb\x81\x7f\xad\xaa\xee\x21\xba\xe8"
+ "\xaf\xa9\xa0\x75\x5d\x5d\xe6\xed\xe9\x3f\xb1\x94\x80\x06\x68\xc9"
+ "\xf4\x44\x0c\x11\xe7\x2d\xba\xad\xd3\xc1\xce\xd5\xf8\x36\xcb\x70"
+ "\x37\x0a\x01\xdd\x1e\x7f\x86\x7d\xf2\x97\x9e\x32\x66\xe8\xc5\xde"
+ "\xda\x03\xde\x87\x6f\xcb\x88\xae\x1c\xcd\x52\xf0\x6d\xf4\x19\xd6"
+ "\xf2\x66\xc0\xc0\xe2\xf1\x33\x7b\x6f\xca\x19\x86\x72\x53\x49\xa6"
+ "\x7b\xec\x02\x9d\x33\x7f\x2c\xed\x72\xbc\xcc\x12\x55\x94\x47\xb2"
+ "\xe4\x0d\xa3\x59\x22\xc9\x91\x11\x97\x64\x0b\xca\x73\x16\x9d\x4f"
+ "\x5c\x33\x9a\x25\xf7\xaf\xb7\xa5\x5a\xd2\x79\x9f\x88\x3d\x7e\xa5"
+ "\x97\xdd\x6c\xff\x3e\x6f\x43\xb9\x4e\x5e\x16\xc1\xf9\x4d\x16\x83"
+ "\xa4\x07\x3f\x5e\x65\xda\x2a\xe7\x9d\x38\x57\xc0\x7c\xa3\x73\x1b"
+ "\x4d\x5e\xad\x08\x1b\xaf\x71\x59\x2d\x74\x37\x4b\xc4\x29\x66\x82"
+ "\xa5\x59\xb4\x43\xb3\xcb\x18\x5c\x73\x47\x26\x95\x41\xed\xb1\xcd"
+ "\x93\xb2\x6e\xb2\xd9\x08\xb8\x0a\x3d\xe1\x75\x2f\xb3\xe8\x5f\xbf"
+ "\xcc\xcc\xc7\x16\x88\x7e\xed\x96\x6b\xd1\xc8\xa8\xbd\xaa\x93\xd6"
+ "\x19\xe6\x04\xda\x4d\xf5\xd1\xdc\x68\x0a\x9c\x77\x15\xe7\x73\xd5"
+ "\xb5\x90\xec\x93\x7c\xfc\xb5\x2b\x6f\x0f\x4b\x6b\x0f\x48\x3b\x63"
+ "\x73\x99\x77\x27\xca\xdb\x39\x9a\x99\x51\xd6\x45\xf7\x22\xc2\xb5"
+ "\x96\x5b\x5c\x79\xfb\x51\xf6\x27\xc3\x68\x3f\x5a\x0f\xf8\xc8\x7d"
+ "\xe9\x93\x03\x6e\x7f\x2b\x23\x1f\x17\x8f\xd9\x79\x90\xca\x41\x9a"
+ "\x87\x44\x7f\xb7\x59\xac\x36\x69\x57\x53\xf4\xb5\xef\x0c\x41\xeb"
+ "\x87\xfb\x82\x28\x6f\x8e\x3b\x13\x34\xa7\xd6\x27\x1d\xd6\x72\x7e"
+ "\x7d\xb2\xd1\x95\xb7\x8b\xd1\xf8\x50\x7a\x84\x4b\xdc\x9d\x48\x7b"
+ "\xb6\xff\xb8\x50\x1a\x7c\x7b\x03\xe5\x7e\x2f\x74\x36\x46\x67\x36"
+ "\xa1\x34\xd5\xe8\x0f\x60\xe5\xdb\x06\x18\x49\x99\xe1\x27\x63\xa8"
+ "\xad\x18\xbb\x04\x77\xfe\xa7\x03\xdf\x89\xc4\xda\xc7\xbc\x2f\x6d"
+ "\x12\xf2\xb2\xbf\x8d\x78\x2c\xa0\x72\x89\xcf\xfe\xe6\x02\xed\x56"
+ "\xe1\xc1\x93\x70\x81\xc0\x27\x13\xe9\x3c\xfb\x6f\x87\x4d\x8a\x1c"
+ "\x5f\xea\x0b\xd1\x4c\x03\x8d\x71\xd8\x59\x85\x99\xda\xaa\x8f\x31"
+ "\x37\xbf\x57\xa1\xd2\x19\x14\xe9\xf6\xf6\x5a\x98\x9c\x7f\xdc\x89"
+ "\x72\xdf\xd0\x68\xc8\x0a\x6d\x3f\xad\xe8\x8a\xcd\x4c\xe7\xcf\x5b"
+ "\x98\xae\x87\x88\xf5\x3b\xcb\x26\x75\x47\x2d\x84\xa3\x76\x1a\xe4"
+ "\xda\xa1\x36\x6a\x79\xd7\xca\xb3\xf1\xbf\x95\x20\xff\xda\x01\xfb"
+ "\x1b\x31\x9a\xec\x4f\x15\x93\x0d\x51\x71\x57\x09\xb8\x0a\xfb\x41"
+ "\xa4\xdb\xd7\xc3\xe4\x79\x7d\xeb\x03\xa0\xf1\x23\xe9\x9e\xaa\xde"
+ "\xb6\x6b\x3b\x57\x68\xd5\xee\xcb\xb5\xce\xd4\x79\x68\x6e\x06\x8c"
+ "\xcb\x4c\xc2\xdf\x01\xe8\x2e\xd5\x17\xfb\x9e\xd3\x1b\x7b\xdc\x25"
+ "\xd7\x4d\xab\x9d\xc7\x4a\x7c\x6b\xf3\xb3\x12\xea\x97\x26\x97\x88"
+ "\xa4\x3e\xa3\x1c\xa7\x7e\xbe\xad\x97\x3d\xa8\x0f\x11\xbd\x6f\xe8"
+ "\x93\xb4\x6f\xf0\x5e\x85\xe8\x1b\xd9\xe8\x11\x7d\x3b\x2e\xee\x00"
+ "\x5e\x63\x7f\x5a\x25\x6c\xdf\x73\xba\x46\x53\x19\x9f\xbe\x4a\xed"
+ "\xa3\x31\x01\x7e\xb8\xe1\x0c\x3b\x9e\xc9\x87\xff\x7a\xf8\xb5\x95"
+ "\x79\x3c\x59\x96\x79\xdc\xb5\x19\x38\x58\xde\x59\x24\x9d\x9d\x4f"
+ "\xd7\xf3\x8d\xc7\x5d\xc4\xc3\x74\xa1\x3e\xcc\x8f\x30\x3c\xf4\xa9"
+ "\x99\xc6\x6a\xe2\x1e\x96\x2a\xe7\xe1\xa7\x43\x88\xdf\x95\x3e\x9e"
+ "\x8e\xef\xc7\xbc\x97\xf6\xe5\xfa\x74\x56\x15\xb1\x8f\x85\xe3\xd8"
+ "\x6b\x6c\xa3\xe4\x69\xe2\x0e\xa7\xe0\x7d\x97\xd0\x4b\x42\x7b\x57"
+ "\x06\x74\xfc\x77\x7c\x17\x27\x79\x77\x91\x26\xf7\x24\x5c\x56\x24"
+ "\x6d\x04\x76\x97\x7d\x3a\xbd\x4f\xee\x49\x77\xba\xcb\x78\x03\xa5"
+ "\xc3\xd8\x9f\xa7\x34\xd2\x06\xd9\x19\xed\xbe\xf3\xa7\x4f\x6a\x77"
+ "\x99\x93\x48\x57\x0b\x79\x81\xef\xb8\x90\xb7\x12\x0c\xa8\x6e\xd1"
+ "\x76\x03\xc9\x38\x3f\xad\x0e\xc9\x99\x8f\x0b\xdf\x10\xd2\x1e\xc1"
+ "\xa7\xfb\xf5\x39\x82\xfe\x46\x4a\xbf\x1e\xc7\xc7\x1c\x4d\x66\x62"
+ "\x0e\x74\x71\xcb\xf0\x5b\xab\x69\x4e\x7e\x7a\x22\x1c\x4e\x69\x01"
+ "\xb5\x58\xe2\xa0\xe3\xf5\x5c\xac\xf5\xe3\xf5\xff\x98\x9e\xf8\xef"
+ "\xbb\x74\x5a\x44\xc2\xd9\x0c\xfc\xf2\x59\x40\xc0\xda\x39\xcb\x43"
+ "\x76\x77\x9f\x2f\x22\x3b\xe2\xff\xfd\x0d\xd9\x6b\x0f\x38\x67\xb3"
+ "\x60\xb1\x85\xec\xd3\x32\xd5\x39\xdb\x7c\xda\xce\x0c\x36\x3b\xc9"
+ "\xd6\xb7\x5b\x89\xc7\x03\xcf\x6a\xe6\x71\xa0\x4f\xb0\xce\x57\xe7"
+ "\x32\xd3\x53\x39\x24\x63\x48\x8a\x27\x7b\xea\x64\x4b\x9d\x7c\x21"
+ "\x04\x8b\x93\xe2\xf0\x3e\x0a\xf4\x9c\x99\x9b\x67\x89\xf3\xf9\x60"
+ "\x19\x07\x3e\x3e\x41\x36\xdd\x0d\x6e\xaf\x9f\xad\x3e\xcb\xa2\xc8"
+ "\x5e\x7b\x60\xe3\xf6\x29\x4d\xbe\xcf\x04\x7f\x13\x63\x67\xf1\xa0"
+ "\x3f\xe8\x0e\x80\x45\x8d\xdd\x0e\x9e\x76\x7b\xa2\xec\xf7\x79\x2e"
+ "\xfb\x2d\xdb\x4d\xed\x97\x38\x2e\xcd\x5c\x24\xda\xfe\xd9\xe6\x00"
+ "\xca\x57\x9d\x73\xa2\x83\xce\x39\x51\xf2\x4e\x7d\x23\x2b\xca\xe7"
+ "\x1d\x6e\x5f\x23\x78\xae\x8b\xc2\x77\x1d\x9d\xff\x53\x1f\xa9\x7f"
+ "\x54\xf7\x87\x17\xce\x0a\x5a\x2b\x80\x70\xf1\x22\x2d\x4f\x27\xf2"
+ "\x74\x36\xb2\x1e\xe7\x1c\xd1\xf7\x26\x9f\xcc\x6b\x13\xef\x94\x3f"
+ "\x0c\x0e\x5a\x9f\xfb\xe0\x80\xbe\x53\xff\xa8\xff\x01\x82\x09\x60"
+ "\xa0\xf5\xd5\xd2\xab\xf5\x93\xfa\xf8\x01\x76\x9d\x97\xd1\x4f\xf4"
+ "\x55\xf4\xb3\x17\xfd\x6c\xc8\x61\xcc\xbf\xe9\xbd\x9a\xcb\x71\x73"
+ "\xa2\x88\x47\x2d\xfe\x0b\x68\xf8\x42\x27\x03\x2f\x6a\x7c\xbd\xc8"
+ "\x69\x78\x01\xb4\x49\x91\x17\x3c\xa9\x97\x77\x90\x0e\xaf\xdb\x8e"
+ "\x5f\xa0\x9a\x11\x8d\xa3\xd3\xeb\xa8\xdb\xf2\xa1\x7a\x8a\x15\x75"
+ "\xf0\x0e\xd0\xa6\x7e\x77\x00\x69\x72\xd0\x7f\xf0\xb0\xa7\xb5\xf6"
+ "\x53\xda\xd5\xdf\xc8\x7e\x99\x16\xb1\xf8\x43\x3f\xaf\x30\xb8\x5b"
+ "\x2b\x98\xde\x97\x5f\x22\x1d\xfa\x63\x41\x59\x23\xa8\x3f\x2a\xfa"
+ "\xb9\x0d\xed\xf4\x87\xf5\xe9\x58\x27\xe9\x11\x7f\xcc\x86\xa7\x33"
+ "\xe5\xe5\x73\xe8\xc7\x39\x66\x71\x16\x81\xfe\x7a\x9c\xe8\xc5\x13"
+ "\xc7\xae\xcb\x60\x89\x1e\xf6\xdf\x2d\x72\xde\x09\x5b\xd0\x23\xcf"
+ "\xb0\xcf\x2e\xf6\xd9\x7b\x26\x1b\xfa\xb1\xdb\xa7\xd2\x3c\x12\x76"
+ "\x9f\x69\xcf\xe8\xc6\x9c\xa1\x73\xfa\x95\xa8\xa3\x3b\x69\x94\x68"
+ "\x4f\xd9\x64\xd2\x13\x8e\x46\x98\x7c\x47\xd1\x7d\x55\x05\xf9\xa6"
+ "\x70\xc0\x8c\xca\x07\x3d\x27\xea\x21\x18\x0e\xa8\x73\xbb\x97\x4d"
+ "\x41\x1d\xd3\x89\xff\xae\x2d\xf2\x1a\xfe\x6d\x2f\x4b\xbe\x36\x9c"
+ "\xf2\x79\xe2\x60\xf8\x9b\xe4\xb3\x54\x1e\xfa\x16\x77\x86\x7d\x31"
+ "\xac\xff\x1a\xb3\x0a\x5c\x26\xf1\xe0\xe7\xcd\x24\xff\xbc\xc6\x7a"
+ "\x05\x0d\x47\x3a\x16\xd7\x98\xaf\x45\x6f\x07\xde\x07\xbd\x6f\x71"
+ "\xed\x70\xf8\x22\x79\xb0\xb2\xd6\x6f\x11\x3a\x92\xc5\x95\x5b\x80"
+ "\x2f\x40\x2b\x1c\xb5\xd0\x59\x0a\xf6\xce\x5d\x3e\xb6\x6c\x3b\x23"
+ "\xff\x33\x23\xdc\x81\xd9\xec\x68\x75\x0a\xdb\x71\x81\x6c\xc6\x25"
+ "\xc5\xbd\x78\x01\x63\xa9\xe1\x10\xa2\x49\x49\x8e\xcc\x97\x25\x99"
+ "\x37\x6c\xd1\x69\xf8\x2f\x2e\x16\x5e\x64\x06\xeb\x12\xf1\xee\x9b"
+ "\x6e\xe5\x81\x2a\x83\x9a\x53\x4d\x76\xcc\xe3\x0e\x37\x93\x1d\x73"
+ "\xdd\x36\xb8\xa0\x7d\x1c\x58\x73\x5d\x96\xe1\xeb\xf3\x58\x32\xf9"
+ "\x33\x30\x79\x25\x2d\x27\xf7\x6b\x4f\x22\xda\x67\xd6\xec\x85\x9b"
+ "\xa5\xbd\xf0\xcf\x17\x91\xce\xb9\xf6\xfd\x89\x20\x78\x18\x51\x6e"
+ "\x1e\x4b\xac\xbe\xc0\x92\x88\x0e\xb2\x9d\x92\x34\x1b\xf1\x85\xb3"
+ "\x3b\x4d\x3c\xf8\xf7\x24\xb6\xfd\x4c\xc8\xdf\x81\x77\x19\xf9\x48"
+ "\xe0\x96\xc1\xf4\xa7\x37\x8c\x12\xfa\x04\xc2\xd6\x2e\x9d\x33\x20"
+ "\xcc\xaa\x36\x31\xe3\x51\xd2\x4d\xac\x91\xf7\xf0\x8e\x06\xa4\xbe"
+ "\x6f\x77\x99\xa7\x5e\xb7\x03\x3f\xe8\x79\xb9\x53\xf2\x3b\x6a\x24"
+ "\xf8\x2f\x6f\xb7\x4b\xda\x20\x3d\x19\xed\x5e\xab\x86\xf1\x38\x9e"
+ "\xb3\xf4\x8d\xe2\xc8\xae\x5b\xaa\x80\xe5\xc9\xc9\xc4\xf7\x68\x3c"
+ "\xe3\x21\x6b\x5f\x9c\xa4\x61\x84\xce\xb5\x45\x9e\xff\x61\x6f\x8a"
+ "\xe9\x2e\x3b\x99\xae\xef\x67\xb4\xaf\x4b\x5b\xaf\x27\xb3\x3c\x11"
+ "\x43\x73\xae\xd2\x3e\xb3\xa6\x23\x4e\x67\x37\xa9\x48\x5f\xa5\xef"
+ "\x6f\xe2\x0c\x77\xcd\xe8\x87\x97\xad\x62\x09\x3f\xb9\x31\x8a\xd1"
+ "\xf9\x1f\xd2\x76\xc8\x7d\xf7\xe4\x81\xd0\x19\x41\xaa\x80\x37\xd9"
+ "\x28\x10\x3c\x06\xd9\xfe\x94\x3e\x0d\x3a\x75\x1b\xa0\x72\xff\x3d"
+ "\x79\x3c\xac\x9e\x40\xdf\x3e\x8a\x3a\x48\x07\x9d\xca\x97\xb4\xc9"
+ "\xc9\x5a\x71\x97\x12\xe9\xe4\xfe\x7a\x72\x50\xbe\x8d\xec\x50\x11"
+ "\x7c\x55\x8d\x9f\x74\x77\x7e\x25\xe1\xeb\x60\x11\x93\xaa\x98\xe5"
+ "\x50\x91\xc7\x18\x23\x6d\x74\x9b\xda\x58\xdb\x6c\xfa\x4e\x73\xdd"
+ "\x35\x91\xe4\x81\x6d\xaf\xb9\x69\xdf\xee\xcd\x88\x7e\x8c\x78\x7d"
+ "\x41\x8b\xb7\x6d\x9d\x80\x7c\x88\x8b\x3b\x78\xce\x6f\xdc\x50\xc0"
+ "\x92\xa5\x2d\xd5\x36\x61\xa3\x8b\xee\xac\xdf\x1a\xcf\x2c\xb7\x56"
+ "\xb1\xa4\xee\xb2\x36\x17\xf8\x4b\xa9\x1f\x43\xf5\x6f\xfa\xcc\x4b"
+ "\xfe\x1c\xf6\xf5\x78\x86\xc8\xb1\xfa\xf2\x29\x84\x93\x42\xe1\xb6"
+ "\xcb\xda\xf9\x50\xb3\x87\x7d\x39\x77\xe7\x39\xa9\x4b\x2f\xe4\x4b"
+ "\xce\x23\xf6\x90\xfe\xc1\x97\x4f\xc9\xb6\x7c\xf9\xd4\x51\x3b\x23"
+ "\xd9\x79\xcb\x0e\x61\x9b\xfd\x4b\xd0\x47\x27\xed\x9a\x3c\xa6\x59"
+ "\xcc\x2b\xa2\x77\xcb\x89\x07\xfb\xca\xb5\x1e\xe9\x68\x9f\x00\x7d"
+ "\x94\x2a\x69\xf8\x23\x15\x2a\xe6\x4f\x58\xff\xdf\x27\x79\xe3\x80"
+ "\x38\xf1\x65\xc6\x44\x9e\x8d\x87\x5d\x42\x9f\x65\xe3\xe7\x33\xf1"
+ "\x8c\xe2\x1b\x8f\xda\xf1\x8c\xc6\x9c\x2b\xc1\xd3\x8c\xa7\x03\xcf"
+ "\x78\x7c\x4f\xa1\x79\x09\x1e\xd6\x42\x3e\x2a\xbb\x62\x0f\xd7\x0d"
+ "\x76\x2f\x8a\x60\xe3\x5e\xfb\x53\x26\x75\xf6\xda\x53\xc9\x3f\x61"
+ "\xda\x76\xc6\x96\x05\x78\x8f\xf5\x66\xf2\x31\xd2\x9e\x5a\xbc\x9d"
+ "\xce\xd2\xdb\xe3\xfb\x9f\xa5\xb7\x4f\xc6\x0f\xa1\xf6\x06\xfc\xfc"
+ "\xf8\xa5\x86\x7e\xa7\x26\x77\x97\xb5\xa7\x02\x8e\x82\xc6\xba\x36"
+ "\x9c\x48\xf9\x31\x0e\xc4\x17\xc5\xbe\x92\x29\xfb\x7b\xbc\x06\xe1"
+ "\x28\x1e\xfb\x99\x47\xeb\xaf\x13\x61\xb3\xb5\x18\xfb\x5a\x2c\x60"
+ "\x32\x1a\x7d\x8e\xfd\x7c\x26\xf5\x97\xda\xdb\x15\x7b\xd4\x1e\x7e"
+ "\x27\x8c\xca\xa4\xfe\x7b\x63\x91\x0f\xb0\xe4\x13\xe7\xf7\xc1\x53"
+ "\x83\x13\xdd\x97\x31\x74\xa1\x0c\x49\x07\x21\x3d\xca\xd0\xd3\xf7"
+ "\xc1\x7e\x34\xd9\x27\xc0\x98\x22\x1d\x78\xe2\x28\xfd\xbe\x59\x77"
+ "\xd9\xa9\xe4\xc3\x8b\x98\x66\xcf\xa3\x3d\xd5\x17\x96\x97\x6c\x2a"
+ "\x0c\x94\x1f\x75\x46\xc9\x3a\x8f\xda\x4f\xb3\xf6\x87\x64\xbd\xa7"
+ "\xac\x83\xad\xa5\xa2\x71\xa0\xef\x40\xf5\x4e\x92\x7c\xdf\x54\x77"
+ "\x82\x8f\xb9\xab\x55\xec\xf9\x47\x6a\x52\x8b\xb8\xeb\x34\x3b\x75"
+ "\xb2\xc9\xdf\x71\x8d\xfb\xe1\x29\x61\x2f\x84\xf7\x94\x30\x77\xe1"
+ "\xdd\xe2\x3c\xeb\x1c\xfb\x2a\xd6\xed\x15\x77\xce\xf1\x7e\x3a\x48"
+ "\xdf\xe9\x0c\x9d\xf6\x06\xf0\xd8\x7d\x7e\x32\x54\xa4\xdd\x41\xf1"
+ "\x88\x23\x9b\x24\x3b\xc3\xbe\xf1\x4d\x87\x1d\x72\x4d\x9d\x7e\x9f"
+ "\x68\x0b\xd1\xde\xc0\x0f\x5d\xd4\x66\xd5\x79\xd8\x41\x7d\x28\x06"
+ "\xff\x47\xbe\x41\x69\x4d\x58\x57\x90\xac\xf0\xf4\xab\x98\x77\x5c"
+ "\xdd\x78\xd8\x71\x6d\x7d\x38\x2d\xee\x4a\x16\x07\xf8\x39\x6f\xec"
+ "\x61\x07\xd1\x24\x1b\x8a\x86\x44\x4d\xab\xe6\xae\xae\xb8\x23\x35"
+ "\xdd\x65\xa7\x1b\x0e\x3b\xe4\xd8\x5c\x63\xb9\x0d\x7a\xdf\x77\x68"
+ "\x7d\x47\x9c\x38\xa3\x9a\xb4\x55\xfa\x0f\xf1\xb0\xaf\xd8\xa0\x32"
+ "\x2b\x8c\x33\xd1\x03\xd8\x1b\x2e\x4b\x58\x7c\x95\xde\xb7\x37\x5c"
+ "\x53\x3b\xbe\x1a\xd4\x96\x7f\x58\x1d\xbd\x5a\x1d\xfb\xff\xc5\x3a"
+ "\xf6\x5f\xad\x0e\x79\x7e\xde\x91\x7a\xed\xbc\x63\x87\xb0\xab\x03"
+ "\xfc\xe9\x94\x38\xf3\xeb\x37\x82\xe0\xdf\x02\xe6\xe3\xe4\xa7\xb1"
+ "\x98\x74\x65\xc9\x97\x4a\xc0\xf9\x4a\xe6\x31\x47\x0f\x73\xad\xf8"
+ "\x88\xb5\xb3\x0e\x61\xbf\xef\x58\x3e\xf1\x6c\x9f\x79\x7a\x37\x1d"
+ "\xf1\xf6\x1a\xbe\x72\x12\xbc\xb7\x63\x1c\xb6\x85\xcd\xb3\x26\xdf"
+ "\x47\xcc\x9d\x49\xf2\xd5\x66\x92\x6b\x7b\x78\xec\xf1\x1a\x15\xb8"
+ "\x01\x34\x7a\x50\xc0\x03\xf4\x8b\xe4\xb7\xde\xab\x10\xfc\x96\x57"
+ "\xd8\x4c\x1e\x21\x7c\xa4\x94\xed\xcd\x27\xd9\x77\xb0\x37\xc3\xda"
+ "\x5d\xc6\xd2\xc9\x77\x0a\xc9\x9d\xb9\xd9\x66\x4d\x0b\x44\x70\xc1"
+ "\x4f\x81\xf6\x27\xdf\x29\x6e\x9f\x87\x05\x41\x47\x57\x5f\x62\xf1"
+ "\xd5\xa0\x3d\x81\xb3\xcd\x84\xd7\x77\x6a\xfe\x53\xd6\x5f\x0a\xf9"
+ "\x4f\xd9\x41\xb2\x9e\x56\xbc\x5f\x62\xc6\xe0\xc6\xf7\x2a\xb6\x5d"
+ "\x62\x89\xdb\x57\xb0\xa4\x6d\x24\xcb\xfb\x5a\xd2\x3e\x42\xb7\x9d"
+ "\x7c\xa9\x2c\x4d\xa2\xb3\x84\x10\xed\x43\x36\x12\x42\x78\xcb\x28"
+ "\x64\x20\xd7\x04\xef\xaf\xc5\x3e\x18\x70\x1e\x76\x05\xcc\x9f\xcf"
+ "\xec\xdd\x74\xd4\x8e\x31\xa8\x05\xfc\x92\x07\x1a\x5b\x5d\x47\xa6"
+ "\x2a\xcc\xff\xcd\xe1\x44\x89\xdf\x51\x96\x6f\xb0\x39\x11\xdc\x96"
+ "\xc1\x26\x75\xb2\x14\x79\x6e\x3f\x0c\x7b\xe2\x99\x0c\xd2\x69\x2c"
+ "\x5a\xcc\x2c\xc1\x6d\x73\x95\xe2\x57\x58\x84\x3b\x90\xca\xe8\x57"
+ "\xf4\x0d\xef\x98\xb4\x88\xa5\xd0\xf9\x03\x9d\x95\x58\x9f\x17\xe9"
+ "\x6f\x4f\x2c\x64\x29\xe1\x65\x2f\x5e\x95\x97\x7b\x57\xca\x33\xd9"
+ "\xd6\x05\xb9\x79\x8b\x57\xce\xcb\xcb\x66\x33\xa5\x2a\x88\x30\x47"
+ "\xbf\x8a\xf4\x40\x56\xe6\xe6\xe7\x58\xe7\x2f\xcf\xcb\xcb\x5e\x92"
+ "\x6f\x9d\x3d\x2d\xfd\xdb\x36\x49\xb7\x59\x76\xd1\x59\x8f\xd4\x0b"
+ "\xec\x1c\xc6\xff\xfd\xce\x4b\x95\xe4\x5f\xab\x74\xc6\x1c\x53\x60"
+ "\xa6\x55\xfa\x39\xea\x9c\x4b\xba\xb8\xbc\x38\x63\xab\xa4\x53\x3b"
+ "\x9f\x92\xb4\x7d\x76\xab\xbc\x47\xd7\x29\xed\x00\x76\xcd\x4c\x90"
+ "\x6b\xea\xef\x0f\x44\xd8\x19\xbd\x2f\xa6\x77\x93\x9d\x55\xb8\x46"
+ "\xd3\x79\xf8\xdf\x85\x8d\x46\xbe\x6d\x96\xa2\xa7\xd3\xd3\x68\xdf"
+ "\x85\xdd\xe9\x1d\x64\x57\xb7\xec\x4c\x16\xe0\x13\xd7\x5d\xf6\xf7"
+ "\x39\x1e\xe3\xa3\x0e\x8d\x46\xe8\x90\x3a\x88\x9d\x73\xc9\x46\x27"
+ "\xff\xf7\x9b\x2e\x69\xe5\xac\x43\x7d\xd7\x21\x6d\x89\x87\x9d\x89"
+ "\xd2\x74\x15\xc7\xb6\x69\xed\x92\x3a\x15\x67\x56\x48\x9d\x8a\xbf"
+ "\xef\x0a\xbb\x0b\x2f\x6c\x4d\xd0\xde\xa8\xd1\xa4\xdd\x5a\x79\x0d"
+ "\x3a\x4e\x40\xfa\x16\xd0\x75\x5b\xaf\x1d\x17\xfe\x5d\xf2\x3f\xfd"
+ "\x6c\x2f\x75\xce\xe8\x6f\xd3\x44\x87\x9b\xe5\xb7\x52\x16\x2f\xe1"
+ "\x8a\x3e\x1c\x90\x70\x12\xf1\x09\x67\x10\xa6\x7c\x1e\xd6\x99\x70"
+ "\xe5\xfc\xea\x1b\xf1\x47\x96\xcc\x5f\xba\xd8\x3e\x2f\x3f\xf7\xe9"
+ "\xdc\x45\xb9\xf9\xab\xc4\x95\xfd\x64\xf1\xef\x07\xe3\xb3\xe6\x5c"
+ "\x69\x7f\x3e\x89\x64\x32\x9a\xdd\x6a\x1f\xe9\x40\x48\xb9\x58\xe7"
+ "\x37\x81\x32\xf6\xe0\xb5\xf5\xb3\x53\xb4\xb5\x5a\xd8\xf1\x38\xcb"
+ "\x3c\x11\x91\x0e\xed\x7c\xa4\x53\x1b\x2b\xf1\xbd\xcb\xfc\x79\x8a"
+ "\x75\x34\x9b\xda\xc6\xbc\xfb\xe9\x5c\x0c\xf0\x2e\xa1\xfd\x73\x7d"
+ "\x01\xed\x73\xcd\xec\x58\x00\x7b\xa9\x38\x2b\x3f\x37\x82\x60\x46"
+ "\x34\x24\x60\xb4\xab\x8d\x9d\x5d\x2e\x60\x71\xde\xb2\x4b\xd8\xe6"
+ "\x38\x6f\xf9\x2d\xcd\x45\x6a\xb3\xca\x33\xb6\x71\x9e\xf1\xb2\x7a"
+ "\x3e\x67\x1b\x3f\x9f\xf3\x72\xc8\xf6\xe5\x59\x0f\xf2\xee\x41\xde"
+ "\x53\xe4\xdb\xaa\xf2\x1c\xdb\x43\x78\x92\xc2\xa6\x7c\x33\x78\xc3"
+ "\x23\x0e\x6a\x8f\xdb\x9b\xc2\xe4\x7d\xfd\xb3\x1e\xb7\xef\x6e\x06"
+ "\xda\x53\xe8\x47\xc8\xf3\x3d\xd0\x87\xc8\xe7\x46\xbb\xdc\xde\x1e"
+ "\xe2\xa1\x1d\x2a\x68\x44\x0f\x3b\x6b\xc6\x7e\x5b\x47\xe5\x52\x9f"
+ "\xb7\x63\x4e\x92\x9e\x06\xfa\x0e\x3a\xe6\x4c\xb5\x76\x37\xb8\x7d"
+ "\x3d\xe2\x09\x06\xfd\xc7\xff\xdc\x38\x1a\x47\xc0\xf8\x7b\xa1\x39"
+ "\x70\x4e\xd8\x88\x9a\xd5\xce\xbf\xe0\xce\xd9\x29\x72\xbc\xcf\x3d"
+ "\xa2\xc5\x9d\x0f\xd9\x0b\x38\xf7\x14\xc2\xbd\xf8\xa9\xdc\xf9\x58"
+ "\x7a\xd8\xd9\x34\x7d\x13\x36\xbd\x48\xef\xc4\x5e\xc0\x6e\x46\xfe"
+ "\x8d\x72\xee\x3d\x96\xe6\x2d\xce\x89\x40\x9e\x20\xdd\x6f\xd5\xe0"
+ "\xfb\x86\x7b\xed\x39\x5d\xd7\x03\x6d\x3a\xff\x63\xd7\x82\x00\x13"
+ "\xfe\xeb\xdb\x03\x42\x1f\x52\xb3\x11\xa1\xa8\x65\x9d\xa4\xaf\x46"
+ "\xf6\xd5\xa2\xb7\xc7\x49\xdf\x0f\xdd\x65\xe7\xda\xfb\x74\x92\xcc"
+ "\x92\x66\x24\xba\x8d\x7c\xfa\xd1\xfa\x21\x1a\x90\xda\x44\xeb\x07"
+ "\x65\x9b\xe9\x9c\x5b\xae\xa3\xf3\x09\xff\xda\x3a\x3a\x2f\xe6\x3c"
+ "\xda\x5d\xcb\x0d\xc5\x7c\xd2\x3a\x96\x29\xf4\x10\x02\x3e\xba\x97"
+ "\x6c\xc4\xde\x13\x2f\x71\x92\x77\xbd\xd0\x55\x59\xd1\x49\xfb\x64"
+ "\xc9\xce\x1e\x16\xad\x3a\x6d\x16\xa2\xd5\x8f\x15\x0a\xfd\x8d\x28"
+ "\xe4\xab\x25\xfd\x0e\xd2\x31\x8c\x11\x3e\x23\x3f\x62\x3b\x2f\x32"
+ "\x63\x3b\x3b\x5f\x4d\xe7\x49\x21\x58\x9f\xff\x86\xce\x0f\xf9\xa6"
+ "\x47\x1b\x4c\x85\x86\x0a\x2a\x43\xbd\x74\x76\x8a\x9e\x8f\x7c\x93"
+ "\x53\xbe\x36\x76\xfe\x63\x91\x8f\xd2\x0a\x5b\x22\xe6\xb9\xa0\xd5"
+ "\x5c\x94\x3e\x80\xf0\x0e\xd5\x0c\x7e\xe6\xf3\x99\xc1\x15\x81\x5a"
+ "\x7c\x9b\xa3\x3a\x8f\xda\x11\x97\x21\xce\x31\x7a\x2d\x74\xbe\x89"
+ "\x39\xb7\x3d\xdd\xed\xf9\xca\x25\xda\x43\x77\x95\xf3\xb1\xff\x0a"
+ "\xde\xc6\x7b\xfb\x8e\xaf\x99\xd1\xbe\x80\xc6\xd3\x2b\x6d\x00\x9f"
+ "\x63\x9a\x9d\x2f\xef\xdb\x5d\x9b\xe6\x44\x75\x61\xbe\xfa\x0c\x51"
+ "\xec\xa8\x85\x74\xec\x3f\x4f\x39\x6a\xe9\xc1\xf8\x78\xd7\x02\x5f"
+ "\x6a\x3e\xaa\xbc\x7d\x6b\x93\xe6\x68\x84\xc5\x5c\x8c\xef\xbb\x74"
+ "\x9d\x26\x9a\xa7\xeb\x84\x8d\xf7\xf3\x85\x04\x37\xcc\xed\xc9\xc7"
+ "\x16\x85\x6c\x2c\x77\xc9\x7b\x7d\x66\xe4\xe9\xbb\xff\x1b\xbc\xa4"
+ "\x36\xa2\x1d\x64\x8b\xc6\x11\x5c\xa1\x9e\xa0\xf3\xf7\xc7\x2e\xaa"
+ "\x9c\xee\x3c\xd0\xfd\x15\xe2\x9d\xd2\x1c\xbc\x8b\x78\x41\xba\x2b"
+ "\x46\x67\xef\x74\x97\x3e\xb4\x4e\xbe\x49\xd4\xef\xd4\xd3\x1a\xa1"
+ "\x36\xd0\x7d\xb0\xca\x85\x62\x9d\x92\x0e\x6c\xb4\x38\x7f\x88\x78"
+ "\xf6\xeb\xc7\x7c\x28\xf3\x9c\x38\x37\xeb\xda\xa1\x95\x43\x36\xb3"
+ "\x50\x46\x8e\x5e\x86\x4a\xfa\xc3\x79\x42\x7f\xcf\x23\xf3\x4b\x5d"
+ "\xa3\xc7\x7c\xaa\xb8\xc7\x43\xf9\xa5\x0e\xd0\x37\xd5\x7d\x3a\xa8"
+ "\xe2\x6e\xcd\x37\x7b\x74\x1d\x33\xbc\xf7\xdd\xff\x22\x98\x76\x39"
+ "\x8f\x38\x7c\xc0\x0f\x3e\xe7\xe1\x3a\x7c\x03\xfe\xff\xba\xf9\xaa"
+ "\xf2\x10\xb2\xa3\xb0\x9c\x19\xd4\x38\xdb\x74\xb2\x91\x41\xda\xf6"
+ "\x52\xef\xfd\xc2\xbd\x9a\xbd\x8c\x88\x73\xec\x9b\x6f\x42\xe7\xf0"
+ "\x41\x4d\x86\x7c\x61\xae\xe4\x61\x2e\xcc\x15\x32\xe4\x4d\x47\x32"
+ "\xff\xa3\xc0\x6f\xa8\x2d\xf0\x18\xa4\x3e\xde\x85\x74\x0f\xeb\x59"
+ "\x1b\xd2\x05\xbd\x60\xa6\xb2\x06\xa6\x39\xb3\x53\x64\x99\x5d\xc2"
+ "\x7e\x48\x48\x26\xd0\x25\xee\x3f\xd1\x99\xb9\x4a\xf4\x63\xdc\x2b"
+ "\x76\xd2\x91\x72\xdb\x2f\x90\x2c\x39\x52\xca\x27\x64\x1a\x4d\xcf"
+ "\xf3\xfa\x33\xfd\xc3\x71\x14\x96\x30\xbb\xe0\xd1\xcf\xa5\x2a\x0d"
+ "\x2a\xf9\x1f\xe4\xc5\x35\xc0\x97\x76\x9f\xb0\xd3\xe0\x06\x3d\x8a"
+ "\x3a\xb8\x3d\x8f\xee\x52\x76\x8d\x24\xfb\x0d\x72\x6d\x76\xfd\x4a"
+ "\xb4\xa9\xec\x41\x5e\x4c\x3c\x99\x97\x7c\x1d\x5d\x60\x48\x17\x8b"
+ "\x74\x0f\xd5\x17\x76\x92\x8e\x59\x34\xf9\xb1\x6d\xd7\xea\xf6\xc6"
+ "\x66\xa7\xdc\x1a\xcd\x32\xbb\xcb\xba\xe6\x78\x58\x7d\xf5\xb5\xe3"
+ "\x8d\xae\x39\x57\xa3\xcf\x25\xbd\x98\xca\x06\xe3\xf1\x49\x86\x33"
+ "\x11\xf5\xcf\xe6\xd4\x7e\xdf\x43\x01\x83\x9f\xf5\x1a\x86\xf2\x3b"
+ "\x4b\x1c\x2c\x50\x36\x94\x07\x0b\x30\x5e\x5d\x16\xf0\x80\x8d\xac"
+ "\x49\xea\xdd\x90\xee\x80\xa9\xc8\xc7\x2f\xb8\x03\xfb\xe9\x0c\xc1"
+ "\x8b\xb1\x02\xde\xf2\xdd\xe7\x0e\xbc\xcd\x48\xbf\x9b\xf0\x4d\x1b"
+ "\xf3\x8d\xa7\x76\x4d\xb4\x97\xb0\x09\xe7\xe8\x7b\x57\xbb\xdc\xf3"
+ "\x7d\xa9\xda\xd3\x4c\xf6\x81\xc3\xdb\xf4\x83\xe5\x4b\xe6\x93\x91"
+ "\xe9\x09\xb3\xb2\x57\x64\x2f\xb2\x3e\x4e\x26\xa8\xaf\xd4\x1b\x0d"
+ "\xf9\x39\xbc\x18\x4d\xfb\x2b\xd1\xef\xe4\xef\xf0\x6a\xbe\x0e\x75"
+ "\x3f\x87\x58\x73\x89\x24\xf3\xfe\xdf\xf4\x75\xa8\xd3\xe7\xe4\xe7"
+ "\x30\x74\xfe\x73\xb1\xb1\x6f\x0d\xa8\x87\xba\x29\x2c\xf6\xf4\x32"
+ "\xdf\x2c\x5a\x47\x72\x7f\xb9\x38\x3d\xdc\x56\x91\xa4\xcf\xb6\xa7"
+ "\x23\x7e\xae\x7e\xe7\x15\x73\x31\x1a\xe1\x45\xa1\x3b\x36\x17\x1d"
+ "\x18\xef\x3a\xb9\x7e\x45\xda\x0a\x5d\x4f\x42\xf3\x69\x2f\xf4\x3a"
+ "\xd4\xf2\x7b\x0b\xa5\x6c\xf2\xe2\xfa\x1d\xea\xd0\x28\x79\x2e\x76"
+ "\x71\xbf\x7e\x87\x4b\xae\xcd\x43\xda\xda\xbc\xd8\x78\x35\x5d\x96"
+ "\xd0\xda\xb8\x14\x15\x5a\xd7\x5f\x68\x79\x2f\x45\xfd\x23\x3d\x18"
+ "\x8d\x47\x1c\x79\x86\xf9\xc7\x90\xbc\x52\xde\xd9\xf6\x0b\xfb\x42"
+ "\xd2\x1e\x47\xf7\x49\xed\x1d\x75\x74\xbf\xaf\xbd\xdf\x84\xf7\x37"
+ "\xb4\x77\xd0\x8b\xdd\x2f\x69\xef\x58\xb3\xdd\xa5\xda\x7b\x3c\xde"
+ "\x73\xb5\x77\xec\x1d\xdd\x3f\xd6\xde\x47\xe1\xfd\x3e\xed\xfd\x46"
+ "\xbc\x8f\xd3\xde\xb1\x06\xbb\xc5\x99\x01\xda\x1e\x85\xb6\x5f\xbc"
+ "\x76\x9e\xf5\x92\x4b\x9e\x5b\x77\x33\xd0\x83\x55\x72\xef\xe9\x8b"
+ "\x8b\xc7\x9c\xce\xd2\xe1\x8b\xf8\x3a\xaa\x07\xf1\xc9\x1e\xe6\x69"
+ "\x0e\x8b\xd7\xec\xb7\x75\x4f\xf7\xb0\x6f\x3c\x61\xf1\xd5\x5a\xfc"
+ "\x5c\xf0\xdc\xbe\xb0\x78\xa7\x16\x9f\x0f\xbc\x98\x13\x16\xbf\x56"
+ "\x8b\x5f\xe7\x61\xff\x6d\x0c\x8b\x77\x68\xf1\xbb\x74\x1d\x1e\x2d"
+ "\x7e\x91\x16\x7f\xc0\xc3\x3e\xda\x1f\x16\x9f\xa9\xc5\x03\xff\x5f"
+ "\x6c\x0d\x8b\x17\x78\x45\xda\x64\x37\xf1\xa3\x85\xb4\xb6\xba\xfd"
+ "\x1e\xd6\xba\x2b\x2c\xcd\x4c\x99\xd7\x6f\xf6\xb0\xbf\x35\x86\xc5"
+ "\x4f\xd5\xe2\x93\x3c\xca\x77\xc2\xcb\x4c\x19\x0c\x57\x29\x5b\x59"
+ "\xe6\x60\x72\x7d\xe2\x81\x84\x2e\xb3\xa0\xb3\x2f\x67\xd3\x9d\x30"
+ "\xd3\x76\xde\x66\x2d\xe2\xbc\x8d\x5d\x9e\xa5\xe9\xee\x92\x9d\xe3"
+ "\x4e\x79\xbf\xee\xf2\x64\xcd\xb6\x82\x57\xdc\xb9\x2b\xa0\x38\xff"
+ "\x5b\x42\x3e\xe3\x28\x91\xf6\xc2\x75\xdf\x33\x24\xdf\xd2\xce\xfe"
+ "\x91\x86\x6c\xc5\x92\x2e\x78\x27\xc9\xc0\xdd\xf9\x3d\xd2\x96\x3c"
+ "\xf8\x60\x8a\x23\x39\x0f\xc1\x23\x5c\x9e\x25\xf1\xfe\xe5\x6c\xb5"
+ "\x87\xee\xb5\x4a\x59\x18\xad\x45\x4a\x4f\xfa\x6a\xe1\x69\x3d\xec"
+ "\xb2\xb0\x4b\x11\x61\x89\xfd\xa4\xbb\xec\xf2\xf4\xd0\x7d\x22\x7f"
+ "\xb5\x16\xff\x31\xe2\xe7\x86\xc5\x57\x0c\x8e\xdb\x81\xef\xcc\xb3"
+ "\xcc\xbd\x97\xb8\x2f\x70\x89\xfb\x2b\x3f\x47\xbb\x17\x08\x1d\xc1"
+ "\x9b\x83\xce\x59\x56\xba\x6f\x43\x3e\x62\x03\x2b\xb8\x97\x74\x22"
+ "\x11\x7f\xdd\x63\x3e\x2f\x68\x8c\x6e\xbe\xfe\x69\xd2\x7f\xbd\xc8"
+ "\xe8\x6c\xb6\xb8\x93\xfc\x0d\x9a\x38\xdd\xe3\x5e\x7d\x96\x45\xd3"
+ "\x7d\x9c\x1d\x0b\xe8\xfb\x67\x6c\x76\x8e\x97\x1d\xcb\x09\xb2\x1d"
+ "\x28\x7b\xfb\xd3\x3a\x7d\x71\x39\x10\xba\x2b\xfc\x28\x9d\x65\xdf"
+ "\x5c\x2c\x7c\x62\xf7\x08\x5b\xe5\xa6\x52\xd2\x29\xf8\x3c\x83\x1f"
+ "\x21\xda\xf8\x70\x89\xa9\x94\x59\xb1\xb7\x4f\xc1\xbb\x5d\xfe\xf0"
+ "\x0d\xf1\x83\xf5\x49\xae\xe5\x9e\x7c\x89\x6b\x66\x39\x25\xbe\xe8"
+ "\xc9\xe7\xbf\xa1\xfb\x27\x3d\x0e\xe0\x9b\x0c\xd0\xe1\x19\x03\xe5"
+ "\x5f\xbd\x9d\x19\x7a\x37\x81\x36\x39\x57\x67\x90\xf8\xa9\x37\x4b"
+ "\x35\x44\x95\x92\xac\x5d\xf8\xc3\xdd\x64\x9b\xb3\x67\x89\xdf\x70"
+ "\xac\xa0\x9d\x3d\x7f\x23\xb3\xcc\xf5\x1b\x90\xa6\xe7\x54\x4c\x3e"
+ "\xd9\x34\x3f\x92\x09\x7a\xd6\xf0\x7b\x7c\x3f\xb8\xa4\xce\x10\x10"
+ "\xf4\x4a\x6f\x96\x90\xcf\x3a\x6d\x49\xb4\x87\xb8\x5b\x83\x44\x8b"
+ "\x47\x83\x16\xb7\x00\xff\x47\x05\x57\xe6\xc4\x05\x96\xe5\x5c\xb7"
+ "\x3d\x8f\x45\x07\x97\x25\xc5\xbf\x78\x89\x4d\xd1\xf7\x9f\xed\x2b"
+ "\xb0\xa7\x74\x5b\x86\x6f\xc0\x9e\x42\x72\x9f\x18\xc5\x2c\xce\xa1"
+ "\xe9\x5d\x35\x7c\x6e\xde\xb1\xe2\xea\xbe\xbd\x83\x2b\x93\x84\xbd"
+ "\x09\x6a\xcb\x40\x7d\x5d\xf7\x32\x33\x06\xb5\x7b\xa9\x45\xa7\xd8"
+ "\x28\xd0\xcf\x86\x98\x8b\xdc\x75\x66\x11\x33\x90\x3f\xe4\xa2\x6c"
+ "\x21\x5b\x1d\x72\x2c\x27\xc0\xdc\x8e\x4f\x59\x51\x1e\x8d\x51\xef"
+ "\x5b\x44\xa7\x91\x3e\x33\xd2\x9b\xcf\xb0\xde\xf7\x4d\x7e\xec\x19"
+ "\x7e\xd0\xe4\x0b\x89\x2f\xee\xfd\x4c\xda\xb7\x08\x58\xe9\x1e\xa9"
+ "\x2b\xef\x61\x8a\xbb\x5c\x7c\x4a\xe8\x0d\x45\xcb\xb5\xd5\xdb\x42"
+ "\xe1\x62\xba\x27\x1b\x97\x35\x67\x6f\x8f\x7f\x88\x94\xdf\xf5\x7e"
+ "\xac\xed\x0f\xe9\x92\xb7\xeb\x6d\x19\x6c\xee\xaa\xce\xf4\x14\x4e"
+ "\xbe\x20\xab\x89\x7e\xe5\x1e\x71\xc6\x4f\x36\x03\x1c\x0f\xba\x38"
+ "\xd0\x9d\xb4\x65\x14\x78\x49\xdd\x98\x9e\x22\x6d\x48\x06\xe4\xdd"
+ "\x7c\x21\xef\x4f\x4f\x95\xe7\x1b\xe9\xe9\x52\xde\x9f\x9e\xb9\x66"
+ "\x34\xdd\x27\x08\x6c\xed\x8a\x4d\xb7\xe3\xb9\xa8\x2b\x2e\xd7\x39"
+ "\xf8\x7e\x34\x3b\xd3\x7a\x33\x8b\xa7\x73\x26\x5b\x50\xda\x62\x95"
+ "\x6b\x38\x58\xcd\x37\x8a\x6f\x63\xdb\xec\x2c\x42\xda\x3b\x0e\x7c"
+ "\x3d\xa9\x9a\x59\xd1\xd6\x11\xdc\x9c\x6e\x16\x7a\x8f\xce\x74\xab"
+ "\xbb\x93\xfc\x54\x05\x99\x3c\x0f\x0c\xee\xe6\xb1\xe9\x66\x99\x3e"
+ "\x78\x5f\x53\x27\xfa\x60\x4e\xf3\xb8\xfd\x67\x35\x9a\x30\x88\xb9"
+ "\x9f\xe6\xe1\xce\x34\xaf\xbc\x6f\x1e\xfc\x95\x8e\x57\xe5\x1c\x0d"
+ "\xae\x96\x70\x9b\x9d\x29\xe1\x16\xdc\xad\xed\x57\x63\xe9\x1d\x7b"
+ "\x77\x8a\xd4\x5f\x09\xe6\xeb\x34\xb2\x47\x4b\x43\x79\xf0\xae\xd9"
+ "\xf9\x0c\x56\xa1\xef\xc9\xda\xf7\x29\x14\x87\xfe\x61\xcf\x0a\x34"
+ "\x53\xbf\x06\xc3\xad\x02\x16\x85\x2c\x02\xfd\x23\x9a\x96\xee\x08"
+ "\xf8\xdc\xbe\x07\x5d\x6e\x31\x06\xfc\x2e\xd2\xed\xa7\x7a\xc8\xde"
+ "\x10\xe1\x4d\x94\x69\xa4\xf2\x42\xed\x57\x47\xea\x6d\xa1\xfa\xe8"
+ "\x1b\xfa\xea\x11\x7c\x35\xfa\x4c\x69\x68\x5c\x4f\xdb\x49\xee\x77"
+ "\x11\x30\x23\x1d\x3a\x9e\x4a\x30\x91\x30\xe3\x09\x1a\x4f\xaf\x8d"
+ "\x03\x8f\xed\x0f\x0f\x19\x56\xcd\xc0\x0d\x79\xa4\x4b\xc5\x53\x35"
+ "\xf8\x69\x3e\x56\x54\x61\x8b\x56\x7e\x53\x5f\x0d\xcb\x3b\xa6\x2f"
+ "\x2d\xda\x4d\xb4\x11\xe9\x25\xd0\x39\x95\x9c\xaf\x6a\x73\x58\xbe"
+ "\x66\xdb\x37\x44\x23\x3f\xea\x59\xb3\x45\xf8\xac\x4c\xe9\x2e\x53"
+ "\xdb\x43\xf0\x96\xe5\x0c\x50\xc7\xcd\x7a\x1d\x1e\xa6\xee\xd2\xdb"
+ "\x89\x77\x6d\x0f\xe6\x49\xa1\x31\x51\x67\xea\xf9\x48\xa6\x83\x31"
+ "\xf2\x91\xff\xd8\x41\xfc\x62\x28\x6e\x40\xa5\x29\xf0\xa0\x4b\xcc"
+ "\x47\xc6\x6b\x48\x76\xc9\x9d\xe9\x9a\x7d\x08\xbe\x56\xee\x85\xbc"
+ "\x86\xca\xa4\xb3\x46\x69\x6f\x94\x6f\x45\xb9\xda\x9d\x25\xbe\x47"
+ "\x6b\x03\xf8\xbf\xc0\xb7\xec\x85\x3f\x3c\x2f\xcb\x9a\x7e\x97\xb8"
+ "\x73\x3b\x61\xb9\x9d\xae\xd3\x66\x85\x02\xfd\x69\x6e\x73\xc8\xc6"
+ "\x19\xf9\xa2\xd6\x6c\x9c\x39\xb3\xe7\x08\xf8\x2b\x6c\x3a\xbf\xc4"
+ "\xab\xe8\xee\x08\x5f\xc1\xb7\x56\x62\x0c\x8b\x2f\xb2\x1b\xc8\x2f"
+ "\x76\x91\x9d\x7f\x45\xf6\xef\x80\x2f\xf3\x81\x3f\x1c\x45\x17\xd9"
+ "\x50\xd2\x4b\x22\xfc\x43\x7a\xcf\x3c\x16\xf1\x1b\x6d\x8e\xbe\x7b"
+ "\x78\x8a\x71\x2a\xdd\x1d\xe5\xc5\x19\xa0\xa5\x6d\xeb\x68\x3e\x90"
+ "\x8e\xfa\x69\xc5\x98\x80\x74\xeb\xf0\x2d\x7f\xbd\x90\x25\xd8\x9a"
+ "\x83\xe6\xec\xe4\xe2\xb3\x2c\x52\xf8\x38\x74\xf8\x49\xa6\x66\x68"
+ "\x53\xd8\xab\x28\xb3\x19\xf1\x31\x22\xde\xef\x27\x5b\x0b\xcd\xf8"
+ "\x16\x83\x6f\x27\xf1\x54\x51\x86\xa3\x12\xed\x2e\x3a\xcb\x6e\x46"
+ "\x5b\x3a\x50\x4f\x33\xda\x79\xba\x78\x31\x1b\xd5\x64\xef\x20\xfe"
+ "\x0e\xe5\x79\x98\x66\x8f\xa4\xb9\x4d\x51\xee\x45\xbf\x1c\x24\x13"
+ "\xc1\xb3\x70\x3d\x9e\x45\x41\x16\x53\xb4\x1a\xfb\xde\x6a\xd4\x4f"
+ "\xf7\x5a\x51\x0e\xd9\x20\x91\x6d\x41\xdf\x48\xae\x86\x72\x57\x77"
+ "\xf2\xd3\x28\xbb\xe3\x58\x27\xca\x73\xb4\xf6\x95\xa9\xd1\xd4\x63"
+ "\xd1\xdf\x91\x7c\x53\xee\x6e\xb4\x69\x2b\xe9\x6e\x23\xce\x8c\x38"
+ "\x73\x1f\x3d\xac\x18\x63\xb5\xf7\x61\x7d\x69\x8b\x33\x58\xd1\x65"
+ "\x26\x74\xa8\xad\x2b\x23\x58\x9b\x12\x51\x43\x76\xb0\x42\x65\x1a"
+ "\xc6\x50\x79\xeb\x50\x5e\x71\x36\x1b\x06\x5c\x1d\x85\x36\x92\x8f"
+ "\xe8\x93\x02\x4e\xb4\xc6\x14\x43\x02\xfa\xe2\xa4\x3e\xa9\x18\xbb"
+ "\xf5\x58\x0f\xe8\x8f\x82\xfe\x0c\x5b\x1d\xec\xbb\xab\x4b\x7d\x8a"
+ "\x25\x7e\x8e\xfa\xa5\x8d\x23\x70\x81\xcd\xb7\x3a\x87\x9f\x44\xdf"
+ "\x3a\x8e\xe5\xb4\x32\xec\x3d\xa6\x26\x7b\x33\xdd\xa1\x38\x29\xe1"
+ "\xd6\x41\xe3\xda\x89\x7e\xfa\xfa\x6c\xf5\x2a\x11\x2f\xa1\xed\xb5"
+ "\x68\xd7\x3a\xad\x9f\x14\x57\xd5\x47\xd3\x2b\x11\x9b\xb5\xf7\xe1"
+ "\x7d\x69\xbf\xdd\xcf\xa8\xb0\x7e\x22\xbf\xf1\x01\x2a\x4f\xeb\xe7"
+ "\x70\xf4\x73\xd8\xb7\xfb\x89\xf9\xb4\x82\xaf\xd5\xfa\x59\xa1\xf5"
+ "\xd3\x80\x7e\x0e\x47\x3f\x47\x87\xf5\x33\xee\x8a\x7e\x92\x5f\x78"
+ "\x3f\xfa\xd9\x16\xd6\x4f\xf3\x00\xfd\xf4\x7a\xa8\x8e\x8d\x36\xbf"
+ "\xb4\x0f\xc6\xeb\xc4\xfd\xf7\xf2\x88\xbe\xfb\xef\x2a\xdd\xbb\xbc"
+ "\x24\x6c\x10\xed\x27\xf9\x0d\xc9\x8d\x88\xd7\xa3\x3b\x9e\xb6\x55"
+ "\x15\x25\x42\x76\x33\x4a\xca\xa6\x05\x7d\x55\x1e\x31\xb7\xef\xee"
+ "\xc6\x16\xe1\xbb\xc6\x47\xf1\xc2\x66\x40\x1e\x13\xb2\xc7\xb4\x55"
+ "\x2b\x8b\x29\x3f\xe5\x45\xfa\x75\x7d\x77\xcc\x14\x83\x5d\xca\x43"
+ "\x73\x6b\xe9\x9d\x6c\x61\xc9\x33\x01\xde\x20\xce\x04\xca\x23\x42"
+ "\xfe\x9f\x56\xf0\x7a\x82\x8b\xb8\xcf\x2a\xee\x83\xb2\x0a\x5b\xa0"
+ "\x42\xbf\x97\xde\x89\xb4\xed\x61\xf7\xd2\x3b\x45\x1b\x7a\x84\xed"
+ "\x87\x95\x69\x81\x95\xe2\x7e\x7a\x77\xb9\x31\x2a\x54\xb7\x52\xa1"
+ "\xd5\xbd\x9b\xde\xbd\xd2\x36\x1b\xc9\xd8\xac\x42\xdf\xa6\xdc\x38"
+ "\x59\xd7\x71\xf1\x28\xcc\x4e\x6b\x79\x40\x3f\x2f\xe5\xc6\xb9\xfd"
+ "\x6c\x41\x29\x43\xc8\x1e\x0c\xc5\xe7\xf7\xdd\x35\x2f\x37\x96\xfc"
+ "\xa3\xbb\xe6\xc5\x5e\x8c\x13\xd6\x9b\x9d\x7c\x9e\x2b\x46\xf0\xb8"
+ "\xd9\xc9\xc2\x57\x8a\x32\x64\x0c\xb5\xb3\x4d\x31\xd2\xfe\x61\x12"
+ "\xe7\x41\x8a\xf1\x33\x0d\x37\x97\xa4\x05\x03\x26\x0f\xea\x14\xb6"
+ "\xa5\xfa\xc2\xc6\x16\xb2\x95\x81\xbc\x23\x84\x9d\x73\x94\xd7\x3f"
+ "\xbd\xf8\x7e\x65\xfa\xd4\x2b\xc2\x56\x1f\x70\xd6\x60\xba\x3c\xeb"
+ "\x47\x0b\x19\x6f\x52\x4c\x29\xb3\x17\x7f\xcd\x22\x30\x17\x4f\x51"
+ "\xdb\x9a\x3a\xc4\x3d\x3f\x13\x2f\x4b\x61\xee\x8e\x80\xa4\xdb\x41"
+ "\x2f\xb5\x25\x22\xcd\xd7\x6c\x14\xdd\x33\x21\x5f\x32\x48\x7f\x46"
+ "\xf8\x8f\x51\x22\xdf\x9c\xbb\x7c\x38\x53\x9f\xc9\xb8\x8e\x1b\x0a"
+ "\x6a\x49\x97\xe0\xf5\x1e\x0f\xf9\x60\x51\x8a\x5e\x62\x09\x84\xa7"
+ "\x30\x87\xdb\xb9\xe1\xf9\x5a\xe4\xe9\xfc\x8f\x9e\x8e\x21\xee\xc0"
+ "\xa7\xcc\x0e\xfc\x79\x46\x89\xdc\x6d\x2c\x64\xc6\x0d\xa7\x99\x19"
+ "\xf3\x2c\x70\x34\x30\x85\xe9\xb6\x1e\xaa\xe3\xa4\x0d\x81\x6a\xcc"
+ "\xc9\x65\x16\xee\xef\x2e\x8f\x34\x82\xaf\x2d\xd1\xe5\x17\xeb\xa4"
+ "\xad\x37\x23\xea\x7f\x4e\xd8\xa5\x90\xf4\x01\x60\x1b\xf9\x90\xbc"
+ "\x67\x1a\xff\x0c\xf2\x4c\xe9\xe3\x6d\x94\xc8\x7a\xed\x6c\x2d\x5d"
+ "\xee\x23\x91\xf5\x47\xc1\x1d\xad\x95\x3a\x51\xf1\x48\x9b\xd5\xa7"
+ "\x13\x45\x32\x41\x7c\xc7\x18\xa6\x4b\xbe\x27\x3b\xdd\x16\x8c\xd2"
+ "\xd6\x38\xc5\x3f\xea\xa1\xbc\xc8\x67\x12\x7e\x2e\xcb\x23\x6b\x42"
+ "\x73\x2d\x32\x87\xf6\x53\xf4\x29\x1a\xe3\x7a\x82\xfa\x45\x30\xf1"
+ "\x91\x5d\x37\x65\x88\xe7\xe8\xae\x41\xfc\x20\x99\x67\x39\x03\x42"
+ "\xbe\x74\x24\x03\xf3\xe9\x2c\xc6\xe0\x7a\xb2\x6d\xe5\x46\x3d\xc7"
+ "\x76\xf4\xb0\x63\x96\x2e\xd6\x84\x77\xba\xfb\xe0\x5a\xf8\x25\x6b"
+ "\xb7\x0e\xbc\x97\xab\xe0\xd1\xc0\xc7\x58\xa9\x2c\xc2\x35\xa4\x2f"
+ "\x4a\x36\x08\x9b\xbc\x28\xab\x9d\x89\x32\x8e\xa9\x1d\xec\x98\x83"
+ "\x78\xd8\xcf\x33\x9a\x76\x7c\xca\x9a\x2c\x7f\x15\xf5\x10\xbd\xed"
+ "\xca\xeb\xba\x5a\xd9\x29\x28\x3b\x55\x2b\xbb\x13\x65\xc7\x0f\x5e"
+ "\xf6\xe1\x92\x6b\x2c\xfb\x1a\xda\x7d\xd8\x7e\x2d\x65\x17\x6f\xe5"
+ "\x41\xe0\xe1\x11\xc0\xb1\x16\xb2\xcf\x4a\x77\x5c\x83\x97\xc8\x26"
+ "\xcd\x58\xc1\xab\x9f\x56\xa2\xb6\x13\xbe\x11\xfa\x21\x1b\x6d\xf1"
+ "\xe2\xfe\x2b\xc9\xd9\xb5\x7b\xaf\xee\xc0\x29\x46\x72\xf7\xee\xf2"
+ "\xa8\x8a\x10\x2f\xda\x77\x36\x6e\xf6\x28\x51\x7b\xa4\xae\xb5\x2d"
+ "\x5e\xce\xad\xa8\x79\x54\xd6\xc0\x3c\x67\xe6\x74\xa1\xb3\xaf\x44"
+ "\x9d\xd2\xe5\x5b\x5d\xb1\x99\xd3\xb5\xb2\xac\x57\xca\x4d\x35\x43"
+ "\x42\xd6\x6c\x47\xbe\x75\x65\x5e\x6e\x7e\xb6\x7e\x41\x7b\x38\x7b"
+ "\x3c\x7b\x7e\x76\xee\x8a\xec\x2c\xeb\x9c\xe5\x79\x4b\x26\x2c\x5d"
+ "\xb0\xc0\x3a\x3b\x7b\xd9\xb2\x79\xcf\x64\x0f\x67\x73\xf2\xe6\x2d"
+ "\x59\x96\x4b\xb2\x4d\xab\x75\xfa\x3d\xb6\x9c\xa5\xf9\x13\xbe\x3f"
+ "\x3d\xe5\x0a\xd9\x26\xdd\xd7\x3e\x41\x3c\x0e\xf6\xa7\x51\xa0\x31"
+ "\x62\xc9\x2e\x91\x69\x15\x77\x3d\x0f\xfe\x1a\x73\xf0\x0c\xed\x85"
+ "\xb4\xff\x10\xef\x45\xf6\x8d\xc9\x66\xf2\xb6\x2d\xbc\xf9\xb4\x72"
+ "\xd3\x76\xd0\xed\xad\x88\x23\xfb\xc4\x27\x78\x4f\xb1\x57\x9c\x67"
+ "\x2b\x37\xad\x42\x9a\xfa\x5f\x23\xce\x1b\x9b\x9d\xbe\xe1\x73\x66"
+ "\x94\x34\xc6\x30\x3f\x37\x0c\xe5\xeb\xc8\xd6\xf0\x97\x16\xa6\xd9"
+ "\x48\x37\xb8\x3d\x7e\xd2\x21\x8a\x4a\x0b\x14\x73\xc2\xa9\x72\x7d"
+ "\x0d\xbb\x2c\xe1\x92\x9e\x22\xee\x32\x28\x37\x3d\x49\x3c\xe2\x1a"
+ "\xf2\xbb\x58\x3e\x1c\xf8\xbf\xd7\x1e\xc2\xd5\xd7\xeb\xb4\x79\x2b"
+ "\xe0\xbe\xb2\x0d\x61\x61\x6b\x25\x72\xf8\xe4\x7e\xfa\x61\x4a\x74"
+ "\x3c\x53\x6e\x28\x94\x3f\xe4\x51\x6e\xa8\x90\x3f\x7a\x0f\xff\xdd"
+ "\x34\x55\xfe\xae\x8c\xff\x9f\xfe\xf4\xfa\xff\xe5\x32\xfc\xff\xe0"
+ "\xf7\x4f\xd4\x2f\xfa\xfd\xff\x63\xff\xff\x27\xf9\xb1\x18\xae\xf2"
+ "\xa3\xf9\x86\xb9\x75\xe2\xd7\x9f\xb3\x28\xcc\xcf\xaa\xf5\x4f\x63"
+ "\x4e\x7f\xc6\x2c\x85\x01\xde\x5e\xfc\x14\x4b\x28\xfa\x1a\x34\x18"
+ "\x68\xad\x7c\x07\x6f\x2f\xba\xc4\x4f\x62\xde\xfc\x05\xf3\xb7\xae"
+ "\xb2\x8d\x45\xaf\x6f\x03\x9d\x95\x2f\x7d\xcf\xd0\x79\x13\xdd\xf3"
+ "\x72\x23\xdc\xb8\xc2\xcf\x3e\xf4\x7e\x43\x3a\x95\xae\xa6\x4c\xe0"
+ "\x9e\x13\x8c\xd1\xfc\x8d\xce\x64\xf1\xd5\xa3\xf8\x01\x5e\xb6\x37"
+ "\x8b\x1b\xf6\xce\x41\x5c\xcb\x3e\x35\x75\xc8\xbe\x82\x86\x21\xd6"
+ "\xa7\x69\x9f\x8f\x7e\x4b\x9b\x9b\x0f\x89\x7b\x8c\x78\xd2\x1c\xd4"
+ "\x6c\x4c\x63\x7f\xba\xfe\x6d\xb9\xa7\x5f\xbf\x5e\x93\xe7\xd1\xbb"
+ "\xb8\xbf\x81\x7e\xd4\xf1\xb2\x82\x5a\x2a\x73\xaf\x5a\x37\x84\xf6"
+ "\xcc\x7d\x05\xa9\x43\x0a\xe7\x31\x43\x93\xe7\x0c\x3b\x0a\x5c\x48"
+ "\xe7\xe3\x58\x77\x7b\xb0\xce\x6a\xb7\x8f\xe2\x4e\xb4\x6f\x1d\xe8"
+ "\xb9\x0a\xb4\x69\x77\x77\xf9\x88\x24\x8f\x32\xd4\xa2\xd1\x72\x2e"
+ "\xac\x8b\x3d\xeb\x91\x26\x6d\x39\x1b\xbb\x1e\xe9\x40\xdb\x55\x10"
+ "\x8f\x22\xdb\x17\x3b\x0e\x30\xd8\x8f\x3a\x9b\xad\xbf\xa4\x70\x8c"
+ "\xa0\x31\xa8\x6e\xf4\xc3\xda\xa6\xc4\x08\x9e\x9f\xea\xd0\xeb\x45"
+ "\xf9\x15\x28\xbf\x59\x3b\x63\x74\xca\x72\x46\xec\x97\xeb\xd5\x56"
+ "\x4d\x3e\x44\xb5\x7b\x62\xd5\xeb\x0b\xb0\xaf\xf7\x30\xb2\x83\x5b"
+ "\x85\x3a\x5c\xa6\x52\xc6\x4d\x74\xc7\xf8\x44\x00\x7c\x8d\x2a\xf5"
+ "\x77\x95\x98\x97\xb4\xbc\x82\x0e\x11\xb4\x47\x10\xf4\xbd\x90\xcf"
+ "\x80\xfe\xc8\x01\x9e\x00\xcd\x21\xee\x67\x80\xde\xa0\x78\xd4\x51"
+ "\x85\x7e\x35\x83\x6f\xde\x8f\xbd\xbb\x96\x68\x85\x5f\x5e\xfc\x11"
+ "\xa3\x33\x0e\xa2\x17\x96\x39\xb8\x5f\xf8\x95\x2a\x8f\x99\xac\xd3"
+ "\x0b\x34\x3f\x88\x46\x58\xff\x4b\x66\xec\xc5\x18\x63\x8e\x34\x80"
+ "\xfe\x00\x4d\x1f\x63\xd7\xc6\xa6\x41\xd0\x05\x9a\x1f\x69\x89\xc3"
+ "\x63\x56\x63\x7f\x8f\x46\x1d\x0d\x1e\xe5\x26\x01\x0b\x89\x83\x62"
+ "\xd6\xe9\x7b\x3d\xc9\x1c\x3c\x28\x83\x03\xd7\x01\x6e\xfb\x93\x33"
+ "\x15\xe6\x51\x46\xb4\x60\x2c\xf6\x53\x5a\xe4\x37\x22\xfd\x01\xec"
+ "\xfb\x53\xb5\x31\x39\x01\x9e\x00\x74\x40\xcc\x74\x6a\x07\xf2\x34"
+ "\x02\xd6\xa8\xcb\xec\xd3\xf0\x58\x8b\xa4\x61\xcc\x9f\xe9\xb0\xc7"
+ "\x58\xaf\x0d\xc1\xdf\x14\x15\x0e\x7f\xc0\x42\xf2\xe5\x8a\xf9\x57"
+ "\x61\x63\x07\xbe\xd4\x9c\x49\x72\x68\xd4\x77\x40\xc8\xd0\x14\xd3"
+ "\x43\x64\xfb\x0d\x73\xe6\x00\x60\x71\x00\xe9\xea\x08\x37\xaf\xf9"
+ "\x1c\x38\xf7\x69\xa2\xa1\xcc\x8f\x48\x1a\xd5\xd4\x41\x73\xf8\xb4"
+ "\x62\xfa\x0b\x85\xdb\x95\x98\x99\x54\x1e\xc2\x6f\xe1\x09\x5a\xd6"
+ "\xf4\x46\x71\x35\xf9\x37\xb6\x91\xfd\xe2\xe1\xda\x58\x77\xa0\x5d"
+ "\x35\xfa\x1d\x28\x9a\x03\x34\xf6\xe8\xa3\x90\x3f\x78\x14\x53\x0d"
+ "\xc9\x1a\x45\xbe\xde\x1c\x6a\xe3\x09\x5a\x9f\xfa\x77\xc4\x77\x90"
+ "\xcd\xdc\x30\xd8\xcc\xd4\xc6\xa4\x4e\xf8\x0a\x55\xcc\x0f\xc9\xb6"
+ "\x99\x13\x10\x8e\x42\x1b\xc4\x39\x44\x57\x6f\x4e\xc4\x06\xca\x53"
+ "\x14\xca\x43\xeb\x07\x73\xd9\x84\x3c\xf7\xe1\xc9\xf5\xb4\x64\x37"
+ "\x1f\xed\x70\xbd\x48\xb6\xcb\x14\x53\x6b\x57\x6f\x92\x01\xf5\xfa"
+ "\x51\xaf\x81\xe6\x06\xcd\x0b\xbd\x8c\x0d\x12\x46\x7b\x30\x7e\x62"
+ "\x7e\x1d\x0d\xd4\x01\xee\x66\xd0\xff\xfe\x0c\x49\xdf\x99\x5c\x5a"
+ "\xfb\x5c\xe2\x7c\x30\x32\xca\xbb\x43\xda\x19\xa2\x74\x7d\xfe\x5f"
+ "\x43\x74\xa6\x89\xec\x0c\x45\xa1\xac\x46\x6d\x4e\x98\x90\xae\xb9"
+ "\x6f\x0e\x91\xbd\x03\xc5\x9c\x4e\xb4\xa6\xd6\x7e\x9a\x7b\x8f\x48"
+ "\xd8\xc5\x78\x69\x0e\x80\x8e\x4f\x97\xe3\x1c\x33\x93\x68\x55\x39"
+ "\x0f\x63\xe3\xf5\x32\x84\xcd\x04\xc0\x59\x45\x19\xfa\x5c\x09\xc7"
+ "\x0d\x48\x9b\x0a\xba\xb4\x6f\xde\xe8\xb8\x40\x96\x19\xb7\x4a\xa3"
+ "\x43\x32\x30\x36\x64\xaf\xdd\x25\xec\x60\x89\x79\x19\x37\xeb\xa8"
+ "\x2f\x40\xf8\xb5\x05\xed\x02\x4e\x88\x7d\xad\x2b\x2e\xb7\x2e\x34"
+ "\xb7\x63\xb7\xea\x73\x3b\x6c\x5c\xc5\xdc\x5e\x2b\xf0\x51\x6c\x9d"
+ "\x87\xfd\xb0\x5d\x9f\xfb\xb4\xce\x55\xac\xeb\x0d\x2b\xc4\xf9\x80"
+ "\x89\xe4\x81\x62\xdd\xfb\x3b\x05\x8f\x41\xe3\xd9\xe4\x68\x17\x36"
+ "\xf2\xd7\xa8\x2c\xaa\xc9\x77\x8a\xe4\x23\x67\x68\xfd\xeb\x6b\x9c"
+ "\xc6\x06\x75\xb9\xc8\x8f\xc1\x5a\xe0\x40\x5a\x83\x3e\xb4\x09\xdf"
+ "\xa2\xc8\x26\x5c\xfd\xdc\x54\xb6\x0c\x63\x7b\x34\x93\xc6\x2d\x6e"
+ "\x8a\x7e\xe7\x62\x83\xc4\x01\xd1\xda\x7c\x11\x6d\xbc\x02\xae\x26"
+ "\x09\xd7\xb8\x45\xfd\xd7\xb7\x39\x9a\xd6\x77\x38\x5c\x09\xa6\x04"
+ "\x5b\xa4\x45\xff\x87\xe6\xeb\x70\x0d\xc1\xf4\xfa\x61\xda\x7c\xd4"
+ "\x70\x6b\xdc\x80\xb8\x75\x83\xf4\x19\x51\xb7\x86\xfa\x82\x3d\x85"
+ "\xea\x17\xfe\xb0\x34\xde\xa7\xde\x4b\x73\x2a\x2e\xe0\x61\x85\xa9"
+ "\x3a\x1e\x43\x7b\xe6\xd0\x7c\xa2\xb1\xd2\x71\x07\xc9\xca\x64\xdb"
+ "\xaf\x4f\xd2\xc7\x83\xda\x1d\x8e\x13\xd0\x26\xa1\xef\x15\xea\xf3"
+ "\xf5\x4f\x22\x5f\x1c\xe1\xb6\x10\x7d\x75\x7d\x4e\xff\xbe\x5f\x9f"
+ "\x4e\x7d\xa7\x39\x61\x5f\x41\xf2\x32\xb9\x97\x79\x94\xe8\x13\xfd"
+ "\xf1\x55\xf4\x5f\x84\x5e\x86\x46\x8f\x11\xbe\xb7\xff\x52\xa6\xa7"
+ "\xfd\x0d\xe9\x85\x6c\x5e\xdb\x0f\x53\x69\xff\x43\x5c\x83\x06\x83"
+ "\x13\x48\x5f\x4f\xf7\xb8\xc9\x96\xcf\x75\x27\x24\x2f\x08\x1c\x7d"
+ "\x80\x7c\x67\x20\x5d\x45\x13\xf8\x80\x40\x24\x63\xd5\x1a\xbd\x49"
+ "\x78\x82\xaf\xcc\xb8\x6e\x65\x07\x1b\x66\xff\x3e\xff\xf2\xb4\x12"
+ "\xff\x6f\x58\x47\x7e\xb2\x97\x89\xb2\xad\xa7\x95\x1b\xb2\x51\x6f"
+ "\xbc\xf6\xb4\xe0\x39\x1b\xcf\x1b\xf1\xbc\x17\xcf\x9b\xf0\x1c\x83"
+ "\xf4\xaa\x96\x3e\x05\xe1\x21\x88\xbf\x47\x7b\xa2\x8d\xf1\x74\x9e"
+ "\x4d\xeb\xb1\x15\xe3\x87\xf8\x51\xc7\x29\x8c\xe7\xfb\x5a\xbf\x1b"
+ "\xe5\xda\x8e\x7f\x0d\xe5\x38\x28\x1d\xed\x6b\x88\xb3\x23\xcd\x7a"
+ "\x2a\x9b\xec\x2a\xe0\xfd\xa1\x30\xfa\x14\xe5\x8c\x5c\x8c\xe7\x64"
+ "\x3c\xef\xc2\x33\x1f\xf9\xc9\x9e\x67\x3a\x60\xd0\x1c\xc2\x17\x31"
+ "\x33\xb3\x1c\x72\x3c\x31\x86\xf5\xb4\xde\x75\x7c\x40\xf3\xa9\x5f"
+ "\xba\xb9\x32\x9d\xe4\x5f\x47\x26\xea\x63\x17\x10\x63\x67\x6a\x0d"
+ "\x60\xec\x50\xfe\x43\x94\x1f\xcf\x69\xda\x33\x55\x7b\xce\xd0\x9e"
+ "\x3f\xd4\x9e\xd3\xb5\xe7\x4c\x8f\x12\xef\xd3\x68\x13\xc0\x2c\x5e"
+ "\xc8\xc9\xb1\x76\xb5\x7a\x47\x25\x11\x7f\x0d\xfc\x7f\x2f\xf9\x71"
+ "\x44\xbd\xd5\xba\xdc\x9a\x64\x3f\xbd\xe5\xc3\xae\xdb\x26\x64\x3f"
+ "\x23\xf7\x87\xe1\x42\x6b\xb4\x92\xca\x40\x3b\x45\x56\x1b\x40\x37"
+ "\xc8\x72\xa2\x0d\xda\x79\x3d\xf9\x83\x21\xbf\x9a\x64\xa7\x50\xf0"
+ "\x51\xb1\xc7\xe9\x5e\xd0\x09\x21\xd3\xdf\x48\x36\x8a\xb2\x13\xf1"
+ "\x4b\x01\x4f\x31\x59\xc7\xf7\xc4\x2f\x49\x3e\x7f\xe8\x5f\xbb\xcb"
+ "\x47\x59\x43\x7c\xfe\xc8\x66\x79\xb6\x79\xc3\x73\x88\x0f\xe3\xff"
+ "\x47\xae\xa3\x36\x03\xd6\xad\xe8\xcf\xe4\x36\x65\x54\x26\x9e\x77"
+ "\xb7\xcb\x3e\xa7\xe8\x7d\xd6\xc6\xca\xae\xc3\xbc\x5d\x89\x0f\x00"
+ "\x1f\xe6\xd1\xfc\x6e\xeb\xc3\xcb\xf1\x01\x7a\x6a\xf3\x07\xe3\x1c"
+ "\xff\x3a\x8d\x77\x18\x3e\x49\x0d\xe1\xe9\x51\x07\xfa\x8f\x4b\xcc"
+ "\x81\x80\xa4\x17\x5a\xb1\x2e\x69\x0e\xac\xbd\x62\x5d\xa6\xd3\xba"
+ "\xd4\xf2\xfa\xfb\xe3\xf8\xeb\xd3\x09\xc7\x6b\x6d\xc4\xbc\x8d\xcf"
+ "\xa2\xb1\xf1\x28\xa3\x5a\xb5\x3d\xa9\x15\x7b\xe4\xbd\x88\x9f\x25"
+ "\xdb\x29\xe3\xb5\xba\x30\xff\xe2\xa7\xd3\xfc\xd7\xe3\xb5\xf9\x4d"
+ "\xe5\x4c\xa5\xb1\xd6\xe3\xb5\xf2\x31\x4f\xe3\x27\xd3\xfa\xd1\xe3"
+ "\xe5\x9c\x8c\x5d\x47\xf8\x86\xf2\x06\x84\x2e\x23\xf8\xef\x5f\xd6"
+ "\xa3\xdd\x37\xd4\x81\xbe\xa8\xa1\xf5\xbc\xa6\x80\x45\xaf\xdc\xca"
+ "\x46\xc8\xb5\x79\xc3\x71\x3d\xaf\x90\xe9\x97\xdf\xd0\xa8\xe3\xa8"
+ "\x0d\x02\x9f\xc5\xa5\xf6\xc7\x95\xa3\x73\x79\x99\x29\x10\x30\x67"
+ "\x27\x1c\x0b\x4c\x16\x38\x17\xeb\xbe\xba\xbb\xdc\x62\xf4\xb0\xbd"
+ "\x66\x6d\x2f\x69\x14\xb4\x9a\x62\xb9\xef\x58\x8d\xc4\x5d\xb2\x6c"
+ "\x4b\x1f\xfe\x0b\xa3\x43\x04\xae\xa7\xba\xa8\x2c\xec\x2b\x66\x5f"
+ "\x71\xc6\x75\x12\x7f\x5b\x32\x3c\xec\x96\x78\x1d\xb7\xd2\xfe\x64"
+ "\x52\x98\xbd\xf2\x97\x72\x7f\x52\x49\x06\x66\xf7\x09\xfb\x74\x4d"
+ "\xf6\x4e\x46\xfb\x26\xd9\xff\xb6\xad\x1a\x4e\x36\xab\x32\xd0\xd6"
+ "\xd9\xa0\xcf\x76\x69\x67\x33\xe0\x73\x6f\x0c\x12\x2f\xab\xc1\x15"
+ "\xeb\xe9\xc6\x93\xda\xb8\x9c\x40\x7b\x76\x11\x6e\x5f\xb3\x42\xfa"
+ "\x54\x22\x79\x90\xf0\xf1\x45\x34\xab\x85\xfb\x85\x2f\x83\x72\x4b"
+ "\x47\x98\x8c\xab\x46\xae\x93\x1b\x8e\x09\x1f\x15\xce\xec\x04\x29"
+ "\x4f\xbc\x71\xb9\x8c\xbf\x31\x43\xea\x21\x08\x3b\xa3\x14\x9e\x1e"
+ "\x61\x19\xf5\x37\x21\x7f\x8d\x1c\x76\x9b\xa4\x47\x6e\x9c\x12\xa6"
+ "\xf3\x23\x60\x2d\xec\x1c\x97\xdf\x98\x1e\x5a\x17\x37\x26\x52\x1e"
+ "\xe4\x3d\x83\xf8\x1c\x3d\x5e\xee\x35\x31\x53\x35\x99\x99\xf5\xba"
+ "\xd2\x54\x06\xdc\x1c\xb9\xad\x4c\x5f\xbf\x37\x36\xc8\xfa\xe5\xfa"
+ "\xa5\x3e\xd2\x7c\xa0\x35\x1c\x10\x76\xc5\x8e\x0b\x5d\x6f\xbc\x27"
+ "\x06\xf4\xb5\x2b\xe9\x3b\x71\xe7\x4c\xae\xdb\x1b\x5b\xc3\xda\xe1"
+ "\xd4\xe6\xea\x89\xae\xf9\x96\x68\x7c\xf3\x79\x94\x28\x79\x96\xa5"
+ "\x58\x24\x8f\xb1\x71\x76\xa6\x7a\x89\xfb\x49\x36\x4d\xf2\x04\x92"
+ "\xd9\x68\xfa\xaa\x74\x56\xe2\x23\x5b\x69\x4e\xac\x87\x90\x7d\x34"
+ "\x33\xd3\xed\xa3\x75\x97\x8f\x9e\x1e\x92\x1d\x5b\x76\x69\xfd\x4a"
+ "\x40\x7d\xd5\xae\xa2\x23\x34\x97\x36\xcb\x35\x66\xa9\xa2\x79\xec"
+ "\xc6\xdc\xc3\xfe\xb3\xf5\x68\xa1\xc8\x5b\xa2\xcf\x3d\xac\xd1\xac"
+ "\xd3\xca\x4d\xb1\x55\xa3\xf8\x56\x8c\x29\xe9\xed\x2f\xc2\x3c\x08"
+ "\xe2\x99\x25\x9f\x8a\x99\x9e\xda\x9c\xdf\x8a\xbc\x58\xff\xe3\xea"
+ "\xf4\x31\xf0\xc5\x1e\x6e\x16\x73\xac\x88\xf4\x1b\x53\xc4\x59\x3f"
+ "\xcd\x31\x9a\x5f\xe2\xcc\x1f\x73\xcd\x54\xfa\x23\x46\xf3\x4c\xd8"
+ "\x4c\x41\x98\xda\x4b\xf3\xac\xbb\xfc\xa6\x28\xdd\xe6\xb1\x47\x19"
+ "\x2d\xcf\xdb\xca\x6f\x4a\xd0\x75\xc3\x69\x1e\xe6\x8f\x63\x23\x51"
+ "\xbe\xb5\xde\xea\x23\xd9\xf9\x17\xee\xc0\x0c\x46\x69\x09\x76\x12"
+ "\x5f\xde\x50\x8f\x3c\x61\xe3\x1f\x23\x74\x59\x8f\xce\x15\xf2\xcc"
+ "\xeb\xf1\x6d\x51\x7f\x9c\x33\xcc\x2f\xe8\x4a\x60\xc7\x5b\xe3\x19"
+ "\x9d\xd3\x63\xaf\xb9\xc9\xa9\xd3\xc3\x93\x10\x87\x34\xd4\x3e\xe2"
+ "\xc1\x9b\xf1\xee\xa4\x7d\x7a\x10\xb9\xf3\x64\x92\x15\x11\xce\x20"
+ "\xd9\x13\xc9\xc1\x00\xeb\x96\xd3\xca\xd8\xd8\x63\x64\xbf\x68\xe9"
+ "\xb7\xed\x5e\x17\x39\xf8\x45\xb2\xa7\x65\xcd\x63\xd7\xb7\x29\x37"
+ "\xfb\x48\xee\x54\xfc\x0d\xc9\x78\x12\x2c\xfd\x65\x3c\x09\x39\xda"
+ "\xaf\x10\x3f\x4f\xe8\x37\xc6\xae\xbd\x77\x5e\xfd\x37\xa6\x42\xa6"
+ "\x1d\x53\x85\x5f\x8d\x84\x95\x05\x6b\x25\xa1\x50\x87\x15\xe1\x14"
+ "\xc2\xb1\xa4\x67\x43\xeb\x5c\x09\x30\x3a\xa7\xc6\x38\xa1\xdd\x6b"
+ "\xee\x78\xdc\x55\x40\x3c\x6d\x82\xf0\x5d\x40\xf6\x8b\xaf\x49\xd7"
+ "\x4b\x49\x10\xe3\x29\xec\xcb\x2a\x09\x76\xd4\x1d\xbf\xe1\x1c\x33"
+ "\xda\xf3\xd8\x18\x92\xa1\x9b\x82\xdc\x45\x3c\x30\xcd\x09\xc0\xa0"
+ "\xf9\x8c\x32\xe6\xb9\xfc\xd5\xcc\x80\xef\x63\xf1\x9e\xa9\xd3\x52"
+ "\xc8\x63\x8e\xf0\xb3\x78\xa2\xa1\xa6\xad\x66\x63\xbb\xcb\xc7\x4c"
+ "\xd5\xc7\x8a\xe8\x0c\x92\xe3\xf5\xf9\xbb\x52\x12\x84\x2e\x00\xd9"
+ "\xf2\xf7\x10\xdc\x74\x5c\x75\x8e\x64\xd7\x63\x92\x22\x7c\xcc\x2c"
+ "\xf7\xa1\x31\x25\x18\xd7\x54\x39\x5f\xc6\x4c\xc7\xdc\x6f\x09\x6b"
+ "\xe7\x0f\xc2\xde\xcb\x29\xbf\xc9\x47\x34\xdc\x60\xf0\x19\x73\x4c"
+ "\x87\xcf\x06\x61\x03\x94\xd9\xc5\x78\x07\x78\x27\xda\xd6\x68\x2f"
+ "\x60\x51\x67\x94\x9b\xdf\x46\x1f\x89\x06\x68\x90\x32\xfe\x9b\xdf"
+ "\xd0\xf9\x74\xd9\xee\x9b\x57\x9b\x4a\x23\x18\xc9\xe6\xc9\x66\xa4"
+ "\xd0\xc5\x3c\x6f\x11\xf2\x78\x77\x60\x2a\x73\x15\xdd\x4f\x69\x1e"
+ "\xd1\xf6\xb2\x13\x5d\xc5\x16\x76\xd4\x32\x15\xeb\xf8\xe6\x99\x58"
+ "\x2b\x9e\x6b\xd6\x79\x55\x6e\x9e\xa9\xc1\xb7\x51\xe8\x8a\x28\x37"
+ "\xdf\x48\x7b\x09\xc9\x06\xb0\x8f\x10\x8d\x16\x87\xb2\x77\xe9\xeb"
+ "\x06\xfb\x44\x3d\xf2\x58\x24\x8e\x79\xd4\x83\xf7\x78\xb2\x5b\x23"
+ "\xf8\x07\x99\x3e\x5a\x9e\x1b\xdc\xdc\xda\x47\x6f\x23\x1d\xe5\x13"
+ "\x3a\x84\xca\x98\x4e\x5b\x90\x64\x09\x63\x3a\xa9\x6f\xda\x5c\xc4"
+ "\x7e\x35\x36\x2a\xb4\x6e\xc7\x4c\x17\xeb\xb6\x33\x7c\x5d\x8e\x4d"
+ "\x0a\xf1\xa9\x37\x9d\x98\x50\xc5\x06\xb4\x99\x60\x8f\xa1\xbd\x6a"
+ "\xec\x4b\x1b\x36\xf0\x1a\xa7\x41\x7d\x78\x4d\x25\x8b\x56\xd6\x01"
+ "\x6c\xb4\xce\x56\x64\x8e\xc4\x7a\x7c\xcd\x14\x7d\x43\xfa\xb4\xfc"
+ "\xa1\xbc\xc8\xc2\x0c\xeb\x2f\x0c\x8d\x1a\xe7\xbf\xa1\x86\x47\xdc"
+ "\xf1\xf8\xec\x7c\x3a\xfb\x76\xb2\xaf\x16\xb1\x88\x69\xc0\x72\xb7"
+ "\x46\x33\xbb\x47\x19\xb7\x9f\xee\xb9\x1f\x8d\x26\x5a\x64\xdc\x7e"
+ "\x2a\xb3\xb0\x9a\x45\x15\xb6\xf3\x8e\x75\x0b\x86\x44\x61\xff\x35"
+ "\x63\xdf\xa8\xb8\x2e\xfa\x86\x9a\x5e\x94\x71\x38\x53\xe4\xab\x1d"
+ "\xbc\x6d\xd6\x7b\x07\x6e\x9b\x7d\xd4\x69\xc5\x3a\xe3\xda\xda\x76"
+ "\x8b\x2f\xd4\xb6\x5b\x7c\xff\x0b\x6d\xfb\x4b\x58\xdb\xcc\xa1\xb6"
+ "\xe5\x50\xdb\x4e\x5e\x5b\xdb\x12\x27\x87\xda\x96\x38\xf9\x9f\x6c"
+ "\xdb\x9e\xc1\xdb\x36\x6e\xf1\xc0\x6d\x73\xdc\x70\x5a\x19\xb7\xfa"
+ "\xda\xda\x36\x3e\x3f\xd4\xb6\xf1\xf9\xff\x93\xb6\x15\x55\xf3\x53"
+ "\x4d\x09\x8c\xec\x69\x46\x13\x9e\x3f\xad\xdc\x52\xba\x3a\x41\xe8"
+ "\x71\xc7\xe1\xfd\xde\xe2\x6a\xfe\xa5\xa4\x6d\xc6\x5d\x96\x7b\xda"
+ "\x38\x2f\xe6\xaf\xd4\x2b\x51\x6e\xf1\x08\x3d\x97\x88\xd1\xbb\x79"
+ "\x19\x0f\x4c\xf4\x91\xce\x60\x80\x6c\xbb\x90\x2d\xf8\x8c\x7d\x97"
+ "\xfc\x06\x1e\x97\x9d\xb3\xf3\x82\x91\xed\xbb\xe4\x35\x74\x97\xdf"
+ "\x92\xac\xdb\x73\xd5\xf3\x9a\xb6\x5e\x0d\x1f\xdd\x32\x6f\x5a\x0e"
+ "\x33\x11\x3e\xa2\x27\xf9\xd3\xdc\x50\x34\x34\x6a\xda\x37\xb4\xef"
+ "\xdf\xe2\xd0\xef\xeb\xea\x65\xa5\x75\x0c\xe5\xa6\x42\x16\x41\x77"
+ "\x86\x85\xed\x47\x8b\x97\x25\x16\xb2\x21\x69\x0e\x94\xef\x67\x99"
+ "\x26\x07\xca\x06\x3c\x24\x2d\x7f\xcb\xdb\x11\x8b\x58\x74\x15\xca"
+ "\xa6\xe7\x34\x4b\x31\x5f\xf3\x12\x33\xd2\xdd\x62\xba\x23\x2c\xef"
+ "\x07\x47\x46\xa1\x1e\x8f\x5e\xcf\x3f\x80\x5f\x8c\x84\xdf\xad\x87"
+ "\x43\xf0\xbb\x75\x79\x08\x7e\xb7\xde\x27\xe1\x77\x6b\x4a\x08\x7e"
+ "\x89\xd6\x6b\x83\xdf\xad\x8b\x42\xf0\x93\x79\xaf\x0e\xbf\x5b\x5f"
+ "\x19\x1c\x7e\xb7\xd6\x85\xe0\x27\xcb\x1a\x04\x7e\x91\x03\xc3\xef"
+ "\xd6\xe0\x3f\x07\xbf\x44\xeb\x3f\x09\xbf\x11\x12\x7e\xe3\x95\x10"
+ "\xfc\x12\xdf\x0c\xc1\x2f\x71\x95\x84\x5f\xa2\x3d\x04\xbf\xf1\x99"
+ "\xd7\x06\xbf\xc4\x3d\x21\xf8\xc9\xbc\x57\x87\x5f\xe2\xc9\xc1\xe1"
+ "\x97\xe8\x0f\xc1\x4f\x96\x75\x6d\xf0\x1b\xff\x00\xe0\x66\xd6\xe0"
+ "\x67\x1e\x1c\x7e\xe3\x33\xff\x49\xf8\x99\x24\xfc\x6e\x7b\x28\x04"
+ "\xbf\xf1\x17\x43\xf0\x1b\xff\x96\x84\xdf\xf8\xda\x10\xfc\x6e\xab"
+ "\xb9\x36\xf8\x8d\xef\x0c\xc1\x4f\xe6\xbd\x3a\xfc\x6e\x1b\x37\x38"
+ "\xfc\x6e\x9b\x12\x82\x9f\x2c\x6b\x10\xf8\x0d\x1d\x18\x7e\xb7\xad"
+ "\xfe\xe7\xe0\x77\x5b\xcd\xd5\xe0\x77\x6d\xb4\xc6\x6d\x83\xde\x7f"
+ "\xbf\xc6\x72\x02\x83\x95\x43\x30\x24\xfd\x44\xb5\xfc\xb6\xc0\x0e"
+ "\x35\x32\x4a\xde\xe1\xb8\x6d\x3f\x78\x98\x07\xdb\x94\xef\x3c\xb2"
+ "\x43\x1d\x12\xc5\xcb\xbe\x3c\xa1\x96\x9d\x5a\xcb\x4b\x23\x8d\x6a"
+ "\xe9\x50\x23\xd9\x33\x18\xd4\xe7\xba\xf2\x9d\xd7\x22\x6e\x64\x37"
+ "\xd3\x7d\xbd\x35\xa0\xd7\xe8\xbd\xbb\xfc\x3b\xfb\x41\x8b\xa4\x5e"
+ "\x09\x93\xac\xdc\x65\xc2\xd9\x67\x5e\x76\xd6\xf2\x25\x59\xf3\x96"
+ "\xe4\x5b\xe7\xcd\x7f\x76\x59\x7f\x1b\xfa\xc2\x4f\xe6\x5a\x1a\xbf"
+ "\xef\xf8\xfb\x6c\xcc\x94\x71\x07\xd9\xea\xb3\xdf\x42\xba\x69\x49"
+ "\x53\x84\x5f\x83\xb8\xec\x16\xde\x9b\xf1\x72\xea\xad\xfc\x90\xb0"
+ "\x41\xd8\x9b\xf3\x32\xf8\xa9\x42\xb2\x2b\xa3\x9d\x4d\x14\x9e\x56"
+ "\xee\xf8\x31\x8f\x5d\x98\x41\x3a\x1d\xe2\x6e\x87\x92\xa4\xdf\xc1"
+ "\x6a\xe0\x66\x5b\x8b\xea\x5c\x98\xc1\x37\x2e\x4c\x27\x18\x34\x91"
+ "\xfd\xb7\x15\x11\x63\xdb\x94\x64\xd2\x01\x68\x41\x59\xad\x5a\x39"
+ "\xad\xa4\x2f\x9a\x5a\xc0\xbf\xa0\xf2\x34\x5a\x90\xfc\x96\xb8\x24"
+ "\x3d\x98\x74\xcc\x54\x6a\x8d\xa0\xb4\x64\x87\x91\xec\x13\xea\xbe"
+ "\xaa\xa8\xdd\x94\x16\xf4\xf8\x83\xc8\xff\x20\xf9\xea\xec\x2b\x43"
+ "\xb6\xe9\xfa\x33\xca\xed\x46\xd1\x17\xa7\xad\xa4\xeb\xf9\x8c\x97"
+ "\x85\xbf\x48\x01\xd7\x3b\x2f\xa3\x6e\xe9\xe7\x33\x70\x5e\xf8\xf9"
+ "\xd4\xf2\x8c\x41\x1e\x81\x4f\xc9\xf6\xaa\x2c\xe3\xce\x93\x7a\xbb"
+ "\x40\x43\x0f\x47\xf8\xfd\xb0\x3a\xae\x43\xf8\x8d\xb0\xef\xd1\x08"
+ "\x6f\x06\x1d\x1a\xab\x7d\x1f\x81\xf0\x2a\xa2\x4b\x45\xbf\x2a\x4b"
+ "\xa4\x4e\xb4\x72\xe7\x5c\xc4\x99\xb5\x34\xb1\x48\xf3\x10\xd1\xba"
+ "\x5a\x19\x71\x08\x8f\x27\x9e\x51\xfb\x1e\x8f\xf0\x30\x3a\x17\xd0"
+ "\xbe\x8f\x3c\xa3\xdc\x71\x16\xe1\xef\x68\xdf\x41\xd7\xdf\x21\x6c"
+ "\x6d\x01\xee\x8d\xd4\x27\xc0\x7e\x0a\xc1\x1d\xb0\x6e\x44\x5c\x21"
+ "\xf8\xd5\x62\x1a\x47\xea\xa7\xab\xe0\x0c\x6b\x53\xee\xb8\x91\xee"
+ "\xe5\xc9\xb1\x5a\x98\x21\xed\x03\x19\x32\x10\x6f\xa1\x78\xd2\x2d"
+ "\x57\x37\x2e\x9c\x42\xef\x80\xe9\x1b\x04\x43\xad\x2e\xf0\x44\x77"
+ "\xa4\x6a\xe3\x0c\xd8\x91\x0d\x5f\x56\xb2\x53\x1b\x0b\xb4\x6d\x28"
+ "\xbe\x6f\xd7\xce\x3d\x2a\xd2\x02\xbd\xf2\x7e\x91\x72\x47\xce\xbf"
+ "\x64\xb3\x02\xf9\x24\xde\xbb\x63\xb7\xee\xc3\x10\x71\xc2\x56\x06"
+ "\xcd\x4f\x92\xaf\x78\x63\x6d\x39\xc2\x46\x0b\xe6\xa8\x3e\x57\x68"
+ "\x9e\xf0\xc8\xef\xb8\xa4\xac\xe6\x8e\xbe\xfb\xbf\xc8\x6b\xd5\xfc"
+ "\x3e\x30\xc9\x27\xdc\xc9\x42\xfa\x45\xb7\x0b\xfc\x10\xf6\x2d\x21"
+ "\xec\x9b\x6e\x97\x50\xda\x9c\x2a\xbf\x73\x4a\xd8\xb7\xaa\x2b\xbe"
+ "\xcd\x09\xfb\xb6\xf6\x8a\x32\xed\x61\xdf\xf2\xaf\xc8\xb7\x2e\xec"
+ "\x5b\xe6\x15\xdf\x76\x87\x7d\x4b\xd7\xbe\x45\x20\xde\xd5\x67\x23"
+ "\x51\xb9\x3d\x55\x8b\x07\xae\xbf\xb3\x35\x2c\x3e\x45\x8b\xa7\xfa"
+ "\xbd\x1e\xf6\xc9\x09\x2d\x5e\xcc\x73\xcc\xa3\xdb\x64\x1d\xc9\xd1"
+ "\x61\x75\x30\x39\x86\xb6\x1c\x39\x7e\x49\x0e\x93\x62\x1d\x4a\x73"
+ "\xca\x54\x5a\x42\x3e\x84\x9c\xd2\x1e\x98\x5c\x87\xc2\x0f\x35\xf9"
+ "\xca\x45\xba\xc1\x70\xe3\xc0\x3a\x82\xc9\x25\xfa\x3d\xd6\xa0\xd3"
+ "\xb6\x48\x75\x2e\x58\x47\x7e\x09\xc9\x6e\x58\x71\x27\xd9\x8e\xd1"
+ "\x7d\x12\xf6\x30\x77\x7e\x77\x49\x93\x5f\xdc\xb7\xa5\xfb\x10\x31"
+ "\x64\xf7\xac\x49\xc8\x77\xce\x4a\xbf\x84\x74\xbf\x77\xa3\x6d\xd1"
+ "\xca\x4e\x96\x60\xff\x3e\x6f\x27\x3e\x4f\xe2\x84\x64\xc2\x27\x26"
+ "\x0d\xa7\xbd\x24\x74\xbd\x95\x09\x74\x6f\xc1\xe4\xee\x14\x72\xe6"
+ "\xa8\xd3\xca\x84\x12\xfd\xbb\xec\xef\x84\x12\xc1\x4b\x6b\xf7\x0a"
+ "\xbb\xcb\x27\x24\xf5\xf9\xcd\x54\x26\xac\xbd\x18\xbb\x7d\x26\xe2"
+ "\xa6\xf6\xd7\x6f\x9c\xf0\x04\x95\x49\xfd\xf0\x28\xc9\x7e\x2a\x1b"
+ "\x69\x32\xfb\xf4\x1b\x11\xbf\x32\xc0\x46\xa3\x6d\xa7\xf5\xf2\xf1"
+ "\x1d\xfc\x7f\xb2\xe0\x2b\xa9\xcc\x8b\x1b\x8f\x3a\x10\x57\xe5\x31"
+ "\x4e\xda\x2d\xf5\x23\x27\xd4\x78\x58\x5b\xca\x60\xfb\x9f\x90\x49"
+ "\x9a\x17\xda\xb9\x73\x21\xad\xf9\x1c\x69\x07\x60\xa1\x5d\xf2\xf2"
+ "\x13\xce\x92\x2f\x32\xf2\xe1\x4d\xe7\x8e\x12\xef\x4c\x14\xfa\x10"
+ "\x14\x07\xd8\xec\x06\x7e\x96\x76\x35\xaf\x69\x4d\x4e\x10\xfb\x1f"
+ "\xd9\x6e\xa2\x3b\x17\x74\x87\xa3\xbb\x7c\xe2\xcc\x3e\x5f\x0f\xfa"
+ "\x7d\x02\x65\xe2\x73\x24\xe3\xdb\xa0\xca\x36\x5e\xd9\x06\x6a\x2f"
+ "\xca\xea\x1c\x74\x2f\x35\x2f\xcc\x11\x72\xd0\x4d\xd9\x0e\xa9\x4b"
+ "\x36\xf1\xad\x08\xcb\x4d\x1d\xa8\x6b\x7f\x9f\x8f\x0b\xa4\xa9\x24"
+ "\x9d\x60\x94\xdf\xd7\xcf\x3c\x51\xc7\x09\x29\xa7\x9f\xe8\x05\x1e"
+ "\xcb\xd9\xd0\xc3\x8c\x5a\xbc\xb7\x29\xe0\xa7\xbb\xf5\x03\xda\xe0"
+ "\xa2\x3d\x52\xd8\x6f\xda\xb4\x30\x87\xee\x4f\x4c\xf2\xeb\x6d\x9e"
+ "\xe4\x25\xbd\x7d\x6a\xb3\x84\xed\xa4\x53\x3a\x1c\xd7\x5f\x40\xd9"
+ "\x45\x9f\xb2\x76\x65\xd2\x62\xd2\x6f\x11\x30\x29\xd0\x75\xae\x26"
+ "\x2d\x16\xe9\x7a\xfa\xd2\x08\x79\x07\xe9\xfb\x12\x9c\x76\x90\xdd"
+ "\x01\x94\x59\x89\xb1\x10\x7e\x6c\x95\x49\x6f\x0a\xf9\x26\xbe\x8b"
+ "\x7e\x0b\x7d\xb6\x94\x78\x39\x57\x26\xed\xf1\x28\x29\x56\x39\x07"
+ "\x65\x1c\xf9\x80\x27\x3d\x84\x73\xca\xa4\xf5\xe4\x4b\x16\xf0\x70"
+ "\x90\xed\xba\x26\x1f\xd6\x8b\xa3\x87\xe6\x82\x83\x7c\x06\x7a\x94"
+ "\x49\xd2\x97\x95\x99\x60\x3e\xc9\x4e\xf5\x13\x6c\xc9\x8f\x2e\x60"
+ "\x7a\xa9\xbb\x3c\xa5\x4f\xfe\x41\x3e\x7b\x91\x66\x50\xdb\x8d\x04"
+ "\xa3\x20\xda\xdc\x04\x7a\xd5\x35\xfa\x53\x6a\xdf\x5f\xd4\xb8\x85"
+ "\x39\xa4\x3f\x89\x77\x69\xfb\xc2\x29\xc7\x4e\xce\x83\x94\xd7\x22"
+ "\x2c\x09\xe3\x9a\xe4\x5c\x90\x7e\xcc\x95\x94\x74\x0d\x7e\xc2\xe7"
+ "\x85\x73\x85\x84\x83\x4c\x7f\x97\x51\xca\x65\x12\xbe\x83\x76\xd5"
+ "\x84\xe4\x32\x77\x19\x85\x4c\x4d\xd3\xb1\xc6\xb7\x03\x61\x6d\xf6"
+ "\x89\x7b\x80\x17\x88\xa7\x4e\xc9\xa2\xba\xd6\x93\x6d\x31\x9a\x17"
+ "\x67\xc2\xe7\x7f\xca\x0c\x6a\x27\xe9\xe6\x05\x63\xb3\x1d\x7c\x63"
+ "\x76\x21\xc1\x19\x79\x0a\xb1\x16\x72\x06\xf1\x13\x2f\xfc\x54\x75"
+ "\x97\xdf\x95\x1c\xe6\x7b\x17\xfb\xe0\x5d\x4f\xe9\xfb\x1c\xed\xd1"
+ "\x64\xe7\xa1\x2f\x6e\xe3\xe7\x53\xb0\xde\x6b\x35\x1a\x67\x40\x99"
+ "\x87\xb0\x73\x38\x91\xa5\xd0\x5d\x63\xd2\xd3\xa6\xf9\xc6\xcd\x9f"
+ "\xb5\x92\xed\x64\xb2\x03\xe9\x2a\xb8\x1b\xed\xbd\x7b\xc4\x8b\xa3"
+ "\xc4\xfd\x46\x9f\x6b\xe2\x05\xd2\xd1\xe9\x3c\x5d\x28\xec\x1b\x45"
+ "\xa5\x39\x02\x7c\xa7\xf4\xbd\xed\xe5\xb1\x9f\x11\x1d\xd5\x29\x7c"
+ "\x07\x50\x99\xff\xaa\x1d\x60\xe5\xae\x56\x8d\x96\xe9\xc4\x5e\x7e"
+ "\x03\xfa\x23\xee\x33\xe2\x7d\xd4\x19\xe5\x9e\x7b\xa5\xbf\x48\x69"
+ "\xcb\x5e\xd3\x35\x8c\x94\xf7\xf3\xbd\x4c\xdc\x97\x56\xee\x7e\xcd"
+ "\x7a\x07\x63\x9d\xca\xdd\xaf\x0b\xbb\xd2\x4e\x9b\x4b\x83\x81\x6b"
+ "\x83\x6c\x97\xc9\xe6\x30\x88\x36\x52\xfb\xae\xad\x6d\x77\xeb\xfb"
+ "\x65\x64\x77\xf9\xdd\x75\xfa\xbd\x7e\xd1\x7f\xcd\xde\xb4\xeb\x16"
+ "\xe2\x5b\xee\x19\xaf\xed\x5d\xf5\x5a\xdd\xf5\xff\x0b\x75\x7b\xb5"
+ "\x32\xb7\x0a\x9b\xdb\x80\x0b\xca\xdd\xda\x5d\x7e\x4f\xaa\xbe\x9f"
+ "\x6a\x3a\xf2\xc9\x72\x9f\xbf\x27\x23\xb4\x97\x4a\x18\xf6\xbb\xb3"
+ "\xb3\x74\x69\xbe\x15\x04\xbb\x7d\x5e\xfe\xfc\x1c\x6b\x76\x5e\xde"
+ "\xd2\x3c\x2b\x19\xbc\xb9\xc2\xaf\x52\x14\x2f\xbf\x67\x91\xe6\xfb"
+ "\x6d\x77\x9f\xef\xb7\xf2\x7b\xf6\x87\xfb\xe4\xf3\x28\xf7\xd4\xfd"
+ "\xef\xf0\x35\xf7\x0c\x7a\xcf\xcf\x69\x50\x6b\xf1\xab\xc3\xcf\x85"
+ "\x5f\x03\xf1\x39\x36\x3f\x4b\xc5\xfe\x28\xce\x84\x43\xf7\xd5\xef"
+ "\xa1\xbb\x3e\xa9\x6d\xca\xe4\xbb\x76\xa8\x46\x26\xec\x9a\x94\xa9"
+ "\xa4\x4b\x42\xf6\xd1\xeb\xf0\x73\xe1\xd7\x80\x9f\xc8\xa7\x1e\x11"
+ "\x77\x6d\x6b\xc3\xbf\xd1\xd9\x34\x2f\x73\x4d\xa5\x34\xbc\xd4\x28"
+ "\xe8\x10\x75\x93\x4c\x77\x45\x1b\x0c\xbc\x7c\xc2\x7e\x2d\x9d\xc0"
+ "\x0d\x31\xa5\xcc\x3a\x40\xba\x08\x5e\xfe\x1d\x8f\x96\x4e\xdc\x7d"
+ "\xd7\xfb\x43\xb6\xfb\x91\x5e\x4f\x67\xe4\xe5\x77\xd9\xb5\x74\xd2"
+ "\xa6\x59\x99\x61\xa0\x7a\x87\xf0\xb2\x4b\x09\x5a\x3a\x73\x78\x79"
+ "\x61\x69\x22\xd5\xf2\xb1\xd3\x29\x8d\x5a\x6a\x94\x7e\x58\xca\xef"
+ "\x69\x41\xfa\x01\x6d\x9e\x5e\xdb\x38\xdd\x5b\x78\xe5\x38\xd9\xe7"
+ "\xe7\x66\xdf\x9f\xbb\x64\x05\x79\x92\xca\x5f\xba\x3c\x9f\x9e\x4b"
+ "\xe6\x3d\x2b\x1e\x4b\x6d\x0b\xe6\xcb\x97\xfc\x45\x29\xf4\xb2\x08"
+ "\xf3\x8d\x9e\x59\xcb\xed\xf4\x98\xbf\x94\x82\x8e\x9c\xe4\xe5\xf3"
+ "\x75\x97\xde\xfd\xec\x2e\x75\x97\x7f\x37\xd1\xa3\x4c\x8e\x97\xf4"
+ "\xc8\x77\x53\x3c\xca\x77\xc4\x39\xb0\xa9\xd4\xc3\xde\x49\x12\xbe"
+ "\xff\xd8\xb7\xec\x15\x28\xdf\x7d\x80\xec\x15\x98\x4a\xed\xf3\x4d"
+ "\x81\xdc\x6c\xe0\xd9\x56\xe4\x5d\xe4\x61\xbb\xb4\xbb\xe5\xb6\x66"
+ "\x61\x37\xb4\xfc\xde\x03\xba\x7e\xa1\xea\xb4\xad\x25\x7b\xf8\x42"
+ "\xdf\x68\x93\xb0\x85\x53\x8b\x70\xe3\x8e\x4d\xc2\x2f\x4d\x3c\xc2"
+ "\xeb\x10\x6e\x41\xd8\x82\x70\x82\xea\x4c\x37\xd3\xfd\x44\x84\xad"
+ "\x08\x27\xa2\xfc\x46\x7d\x5d\x84\xc3\x46\x73\x36\x77\xff\x80\xfc"
+ "\x71\x7f\x1b\x53\x58\x5b\xdf\x33\xeb\xbe\x7c\x85\xdf\xde\xf2\xef"
+ "\x59\xfb\xfc\xf6\x0a\x5f\x4e\xe6\xb9\x62\x5f\x13\x7b\xfb\xf7\xb6"
+ "\x47\x58\xc6\xac\x90\x74\xf8\xf7\x66\xea\x36\x19\x24\x9d\xfd\xbd"
+ "\x8c\x30\x9f\xc7\x14\xce\xe9\xf3\x79\x2c\xed\x92\xbd\x2c\xec\x1e"
+ "\x29\xdf\xab\xe5\xe5\xdf\x6d\xed\xf3\x4f\x57\xfe\x3d\x67\xb8\x7f"
+ "\x3a\x0f\xbe\x13\x7f\x83\xf8\xdd\xa1\x7d\xf0\x7b\x53\xa9\xce\x81"
+ "\xfc\x3b\x83\x3f\x77\xd8\x56\x81\x16\xc7\x53\xd0\xe5\x1a\x0d\x4c"
+ "\xf1\xbc\x2c\x95\xec\xdb\x58\xe9\x1b\xd1\x7e\x03\xca\x1c\xc8\xbf"
+ "\xa2\x32\xe5\x21\xb2\xbb\xeb\x2d\xce\x52\x6e\xdd\x41\x3a\x48\x08"
+ "\x4b\xbb\x91\xfc\x9c\x32\x45\xdc\x63\xd3\x6d\xca\x85\xdf\x89\x1f"
+ "\xf0\xee\xc1\x47\xfa\x99\xf1\xa2\xa5\xa6\xc0\xbc\x6c\x49\xc7\x4d"
+ "\x79\x45\xe2\xd2\xec\x6a\xb9\xdf\x4f\x59\xc7\x1f\x97\xfe\x4e\x3c"
+ "\xca\x7d\x66\xba\x8f\x64\x52\x16\x2d\xe5\xc8\x6b\x72\xcc\xcb\x16"
+ "\x71\x48\xb7\x06\xb4\x96\xd6\xbe\xe7\xdc\x09\x1d\x8c\x5f\x0a\xca"
+ "\xbb\xfe\xca\x14\xfb\x2f\xc7\x94\x50\x3d\x51\x82\x8e\xf8\x88\x45"
+ "\x93\xaf\x40\x6a\xdb\x8e\x30\x9b\x77\x1b\x10\x47\xfa\x58\x5d\x8f"
+ "\x33\x61\xf7\x57\x6b\x8b\x5d\xf8\x2a\x2b\xbf\x2f\x4a\xb7\x99\xe3"
+ "\x41\xdc\x95\xfd\x79\xfc\x27\x62\x85\x8c\x9f\x9f\x9c\x3e\x03\x6f"
+ "\xc9\x9a\x9b\xdb\xf0\xb9\x93\xd0\x15\xf7\x8c\xa7\x6b\xef\xfc\xa1"
+ "\xc2\x4f\x64\xf9\x7d\x19\x18\xa7\x80\x18\xef\x35\xbf\xf8\x9a\x70"
+ "\x8b\xf0\x9f\x48\xf7\x0a\x55\x1f\xea\x9d\xfa\x88\xb0\xaf\x6b\x90"
+ "\xf4\xa2\xb0\x6b\x57\x7e\x5f\x02\x8f\xb3\xd9\xa5\x8f\xd8\x05\x76"
+ "\x8c\x9f\xd8\xf7\x69\x6d\x88\xfb\x93\x66\xea\xfb\x7d\xb5\xc0\xa9"
+ "\xd3\xf0\xfb\x99\xf4\x0f\xf3\x8b\xaf\xf5\x72\xc9\x7e\x14\xe6\x56"
+ "\x2b\x9e\x66\xd4\xdf\xda\xa7\x23\xd4\x77\x27\xf3\xbe\xcb\x64\xdb"
+ "\xaa\xef\x7e\xae\x32\xf5\x5e\x49\x57\xde\x6f\xf4\xb0\xdb\x9c\x72"
+ "\x7d\xdf\x8f\xf9\xdf\xa0\xdd\xcd\xba\x1f\xfc\xef\xa3\x99\xfd\xcb"
+ "\xb8\x3f\x5b\x97\x7d\xc8\xb1\xbb\x3f\x15\x73\x71\x1a\x7e\x3f\x43"
+ "\xfa\x59\xba\x8f\xec\x35\x06\x71\xb7\xe8\x74\x84\x85\xa5\x20\x3e"
+ "\x4b\x8f\x1f\xa2\xa4\x02\x36\xf7\xe7\xeb\xf8\xa4\x2b\x2e\x7b\x2d"
+ "\xc2\x6b\x41\xa7\x07\xb4\xb0\x13\xe1\x2a\x3d\x8c\xf7\x1a\x1d\xdf"
+ "\x10\x7f\xd6\xf5\x7c\xc6\x4b\xc4\xff\xcd\xb7\x80\x26\xb3\x10\x7f"
+ "\x75\x3f\xf8\xdf\xf7\x4a\x64\xde\xc3\xce\xae\xb2\x0f\x92\x7d\x71"
+ "\xc7\x9b\x7d\xc0\xa1\xf8\x76\xc2\xc3\xfe\x6b\xae\x56\x4e\x87\xc7"
+ "\x78\x57\x45\x68\x3c\x22\x4c\x80\xf1\x3a\xd9\xa7\xa9\x56\xbc\x3b"
+ "\xc9\x5f\x79\x77\xf9\xff\x31\x7b\x94\xef\xfa\x45\xba\x15\x9d\x35"
+ "\xeb\x7a\xcc\x73\xdc\xe0\xe0\x5d\x0b\x68\xae\xfc\x1f\x71\x3f\x79"
+ "\x7d\x81\x59\xd8\x83\x26\x3b\x04\xc2\x3e\x19\xd9\x9c\x0c\xb0\x48"
+ "\x61\xe7\x7f\xe3\x91\x0a\x61\xdf\x7e\x65\x52\xb4\x6e\x6f\x12\xeb"
+ "\xd4\xca\x0d\x7b\xf3\xc9\x06\xa5\x90\xa5\x75\x27\xc5\x08\xbb\x93"
+ "\x9a\xbd\xc9\xed\x2b\x58\x7c\xb5\x2a\xed\x4d\x0a\x1b\x05\x57\xb1"
+ "\x39\xc9\xcb\xbe\x9a\xac\xdb\x9c\x04\x1c\xe8\xee\x61\x12\xbf\x14"
+ "\xf0\xe3\x99\x18\x66\xeb\xc6\x38\xa0\xfd\x49\x03\xf0\xa6\x41\xda"
+ "\x9f\xbc\xb6\xfd\xe6\xff\x74\xca\x79\x32\x35\x59\xf7\xe1\x1d\x16"
+ "\x97\x8a\xf5\xa2\xd1\x39\xf7\xf9\xb5\xb8\x39\x1e\xf6\x6e\x67\x1f"
+ "\x6d\x06\x7c\x47\x32\x45\x7c\x2f\xe4\xc5\x39\x2f\x85\xaf\x2b\x26"
+ "\xfe\x68\xeb\x1e\x82\x7d\x39\x12\xbf\xa1\xf4\x9b\xd9\x87\x3f\x2e"
+ "\xf1\x56\xe2\x11\x4c\x0a\xf6\x1b\x47\x04\x4f\x0b\x04\x22\x6c\x01"
+ "\xa5\x85\x68\x4f\xba\x73\x9d\x16\x0c\xd0\xdd\x7f\x63\x5a\xb0\x8b"
+ "\xfc\x6b\xb6\xd0\x5d\xb2\x0d\x0b\xe8\x6e\xe3\x58\x4e\x7e\x6a\xd2"
+ "\x82\xe7\xf9\x4e\x79\x67\xb3\x59\xf3\x99\xd9\x18\x5c\xc1\x1b\x30"
+ "\x0e\xd1\xc4\x77\x90\xfd\xad\x18\xc5\xcf\x62\xec\x11\x87\x1e\xbb"
+ "\x78\x88\x93\xed\x2d\xf2\x51\xa6\x96\xfb\x81\x2b\xad\x8a\x2d\x10"
+ "\x51\xe2\x0e\xb4\x0b\x3f\x01\x69\xc1\xa1\x3c\xcd\xf1\x00\x17\xbe"
+ "\xc5\x56\xf0\x7a\xe0\xd9\x08\xe1\x43\x7b\x15\xef\xc2\x7b\x54\xda"
+ "\xaa\x2e\x4e\xfe\x3d\x51\x76\x43\x5a\x40\xed\x49\x73\xa8\xc5\x36"
+ "\x87\x82\x7c\x5f\x22\xdf\x97\x68\x4f\x0a\xca\x34\x23\xfc\x20\xdf"
+ "\xb9\x80\xee\x40\x95\x08\xde\x07\x7d\x74\x69\xf7\x4a\xeb\xc8\xa7"
+ "\x27\xd9\x19\xb7\x05\x5c\x25\x3b\xb5\x7b\xa2\xc2\xb7\xac\xa3\x97"
+ "\x6b\xf5\x4c\x49\x5b\xc5\x1e\xb4\xad\x1a\x2b\xee\x9b\xd2\x5d\xaa"
+ "\xb4\x80\x15\x75\x96\x10\x3c\xa2\x85\x3f\x6f\x71\x9f\xea\x81\xd6"
+ "\xab\xf9\xf7\x1c\x90\xdf\xae\xcc\x4d\xe2\x9b\x9f\x69\xe1\x95\x8b"
+ "\x8c\x7c\x73\xce\x1c\xee\x5c\x40\x7a\x52\x0a\xaf\x5c\xe2\x41\x18"
+ "\xf1\xcf\x1d\xe0\x9b\x73\xe7\xf0\xca\xfc\xad\x78\x22\xbc\x32\x9f"
+ "\x6f\x5e\x88\xf0\x23\x99\xc8\xd7\xcc\x2b\x7f\xd4\x8c\x74\xe9\xbc"
+ "\x72\x56\x2a\x9e\x08\xcf\xae\x45\x3a\x84\xd3\xac\x78\x22\x9c\xee"
+ "\x3c\xad\x7c\xbf\x1a\x79\x10\x57\x90\x2e\xeb\x5a\x3d\x57\xd4\x55"
+ "\x59\x92\x23\xeb\x58\x93\x2f\xeb\x28\x2f\x91\x75\xfc\x6a\x9d\xac"
+ "\xe3\x71\x86\xf4\xad\xbc\xf2\x27\x9d\x48\x97\xc1\x2b\x9f\x68\xc5"
+ "\x13\xe1\x9f\xd5\x23\x1d\xc2\x4f\x52\x5d\x08\xff\x82\xca\x47\xf8"
+ "\xa9\x0a\xa4\x3f\xc1\x2b\x6d\x0e\xa4\x9b\xcb\x2b\xe7\x51\xf9\x08"
+ "\xcf\xcf\x40\x3a\x84\xb3\x67\xe2\x89\xf0\x33\x53\x90\x1e\xe1\x75"
+ "\xe8\xd3\x33\x1e\x5e\x59\x39\x0b\xe9\x32\x79\xa5\x13\xf5\xe5\x20"
+ "\xbc\x71\x3f\xd2\x21\xfc\x22\xf2\xe7\x22\xbc\x39\x01\xe9\x11\xde"
+ "\x82\xbe\x3e\xd3\xce\x2b\xb7\xa2\x9e\x9c\x2c\x5e\xf9\x32\xf5\x19"
+ "\xe1\x6d\x7e\xa4\x43\x78\x3b\xb5\x07\xe1\x9d\xc8\xb7\x10\xe1\x57"
+ "\x00\x83\x67\x3a\x78\xe5\x7f\x78\x91\x2e\x87\x57\xfe\xd6\x85\x27"
+ "\xc2\xaf\x39\x91\x0e\xe1\x3d\x80\x61\x2e\xc2\xfb\x52\x90\x1e\xe1"
+ "\xdf\x51\x7f\x3b\x79\xe5\xfe\x16\xa4\x5b\xc4\x2b\xff\xb8\x1b\x4f"
+ "\x84\xff\x54\x88\x74\x08\xbf\x0d\xf8\xe5\x22\xec\x4a\x44\xfa\x45"
+ "\x03\x8f\xe7\xd1\x6a\x5e\x1a\xc9\x78\xa5\xbb\x96\x97\x0e\xc5\xf3"
+ "\x2f\x99\xbc\x74\x48\x12\xaf\xfc\xd8\x8c\x78\x3c\x3f\x9a\x85\x70"
+ "\xb2\x16\xc6\xf3\xaf\x53\x10\x4e\xd1\xc2\x78\xb6\x24\x22\x3c\x59"
+ "\x0b\xe3\x79\x9c\xc2\x53\x78\xe5\xa7\x78\x46\xe2\x79\x7c\x17\xc2"
+ "\x53\xb5\x30\x9e\xff\xed\xc5\x33\xc0\x2b\x3f\x39\x81\xf8\x54\x5e"
+ "\xf9\x37\xaa\x1f\xcf\xd6\xb9\x08\x4f\xc7\xd3\x85\xf0\x74\xef\xf8"
+ "\x9f\x91\xef\x54\xc6\x47\x4d\x74\xaa\xa3\x16\xa5\x17\x5f\x64\x06"
+ "\x92\x37\xd7\x16\x79\xc8\x9e\xc3\xd8\x36\x25\x75\x15\xf9\x9b\xa0"
+ "\x34\xc1\x2d\xcf\x34\xab\xa3\x72\xe8\xfe\x48\x24\xd2\x0d\x3d\xad"
+ "\x3c\xb4\x9e\xf6\x4c\x77\xa1\x47\xf8\xb9\xd3\x6c\xd5\x45\x22\xcf"
+ "\x2b\xa0\x11\xa6\x90\xbf\x73\xc0\x29\x9a\x97\x0d\xb9\x80\xe7\x3a"
+ "\x5e\x76\x5d\x1b\xe0\x84\x70\xec\x47\x78\x22\xfc\xdd\x17\x00\x2f"
+ "\x84\x7f\xf1\x30\x9e\xeb\xba\xcb\x1f\x62\x1e\xe5\x01\x89\xef\xf7"
+ "\xce\x07\xee\xe4\xc0\x31\x68\xdb\x2b\x5b\x4a\x4c\x01\x17\xc6\xa0"
+ "\xc0\x6e\x22\x9b\x6b\xaf\x66\x94\xf0\x51\xdf\xab\x11\xed\x2e\x03"
+ "\x5f\xdb\x9b\x68\x90\x75\x5f\xc7\xdb\x94\x87\x26\x90\x2c\x94\x8f"
+ "\x4a\x1b\xec\xfb\x6c\xf1\xfd\x96\x7f\x67\xf2\xbb\x99\x85\xbe\xff"
+ "\x8c\xbe\x2f\x36\x91\xfc\xfa\xb6\x1f\xa2\x2d\x0f\x55\x51\x1a\x8f"
+ "\x92\x8a\x7d\x3e\x82\xb9\x7d\x1d\x5a\x1f\x87\x52\xba\xcd\x94\x6f"
+ "\x30\x99\x8c\x5a\x55\xec\x5f\x5f\xc6\x9b\x89\xff\xc4\x9e\x61\xb0"
+ "\x16\x25\xd6\xb5\x29\xd3\xb2\xb6\x93\x5c\x21\x7e\xb3\x8b\xee\x05"
+ "\xb5\x29\x0f\xdf\xde\xbb\x69\x41\x8b\xb5\xc0\x84\xf2\xa6\x65\x17"
+ "\xfb\xb9\xcf\x55\xf4\x30\xf6\x36\x8a\x7f\xc6\x2c\x75\xcd\x45\x9a"
+ "\x80\xd4\x0f\x12\xef\x1d\x52\x46\x3a\x2d\x8b\xf2\x86\xd3\xfb\xc1"
+ "\x17\x22\x30\x86\x9b\x9b\xe5\xf9\xd6\xc3\x13\xde\x56\x3d\x06\x53"
+ "\x3e\x1b\x62\x2d\x38\x84\xf2\x1f\xce\xef\xc7\x1b\xf6\xa5\x15\xdf"
+ "\x9e\x3c\x88\xb4\xdb\x84\x1c\xe7\xe1\xb5\xba\x0c\x98\xa3\x0f\xbf"
+ "\x96\x74\x51\x2a\xed\x63\x92\xbe\x9b\x66\x24\x7b\x98\x81\x78\x87"
+ "\x27\x50\x35\xb1\x24\x58\xb5\xd9\xc5\xb7\x6c\x6e\x8e\x09\x28\x4c"
+ "\xea\xe9\x4f\xbb\x6f\x92\x9f\xe4\x6b\x1f\x50\xff\xbe\x51\x87\x8f"
+ "\x98\x33\xd1\xc1\x0c\xae\xbc\x4f\x29\xef\x5d\xfc\x05\xcb\x4c\x77"
+ "\x67\x2b\x73\xe5\x89\xb2\x52\xf8\x0b\x13\x4f\xa8\xc3\x6f\x9d\xb3"
+ "\x83\xe8\x52\x07\xc9\x85\x3e\xa2\x7c\x6f\x02\xce\xa0\xff\xa7\x99"
+ "\xf5\xb6\x90\x5f\x80\xf5\x80\x1d\xd1\x8c\x74\xaf\xda\x16\x0c\x92"
+ "\x0d\xa8\x0a\x0f\xe0\x20\x65\x8b\x0f\xfb\x08\x47\xcb\x7a\xa7\x3d"
+ "\xa2\xc6\x2d\x70\x35\xcd\xa5\x33\x54\x33\xd9\xd4\xf1\x89\x7b\x98"
+ "\x01\xf2\xe5\x47\x7b\xa3\x4c\x1b\x3e\x76\xb9\xda\xfd\xd3\xdc\x25"
+ "\xf9\x79\xcf\x59\x97\xe5\x16\x64\x3f\x30\x7e\x79\xb2\x35\xcf\x61"
+ "\xcd\x13\xfe\xb0\x45\x44\x56\xb2\x75\xd9\xa2\xa5\xf9\xd6\xfc\x55"
+ "\xf6\xec\x6f\xfb\x06\xb6\x70\xf3\x82\x6a\x49\xcb\x3d\x22\xec\xc4"
+ "\xf0\x9a\x2d\x8e\xfc\x42\xae\x5a\x6f\x19\x0a\x5a\x7d\xba\xf1\x72"
+ "\xe4\x34\x3b\xdd\x49\x57\xcb\xac\x4c\xf3\xd9\x1d\xfd\x52\x1c\xa3"
+ "\xfb\x1e\x51\xe8\x6b\x20\x74\x2e\xf2\xc8\x74\x29\xb7\x98\x0e\xfa"
+ "\xe7\x21\xd1\xff\x2a\xdd\x4e\x97\xf6\x4d\x9e\x2b\x4c\x4f\xf1\xb0"
+ "\x57\xa5\xed\xb9\x9a\xcd\xad\x92\x06\x9c\x2e\xce\x2a\xb8\x75\x8b"
+ "\x83\xef\xca\x28\x01\xfd\xa3\x90\x3c\x48\xf8\xd0\x65\x17\xc4\x9d"
+ "\x54\xbe\x79\x95\x97\xee\x83\x07\xb7\x3c\x6b\x57\x47\xad\xf2\xaa"
+ "\xbf\x7d\x32\xb5\xf8\x15\x66\xd8\x87\x35\x6f\xb4\x62\x7e\xdf\xc2"
+ "\xc6\x1e\x2a\xea\x30\xa0\xcd\xcf\x1d\x2a\x6a\x35\xf0\xaa\x45\x33"
+ "\xbb\x12\x7f\x9e\xe9\x2f\x13\xf6\x3c\x51\x86\x9f\xbd\x37\x9d\x11"
+ "\x2f\x53\xe7\x1b\x59\x56\xe1\x1b\xf9\x6c\x86\x7f\xf3\x0b\x5e\xd7"
+ "\x2d\x77\xb3\x19\xb7\xf3\xf3\xef\xd6\x93\xcc\xe9\x91\xe4\x77\xa7"
+ "\x93\xcc\x6f\x41\x95\xdf\xbc\x60\xab\x6f\xcb\x2a\x3b\xd9\xb9\xb9"
+ "\xbc\xe5\xd7\xa9\x3d\xa3\x16\x37\x1f\x45\x9a\x0f\x40\xeb\x7f\x68"
+ "\xc5\xfc\x1d\xc7\x0c\x97\x6f\xfb\x59\xf3\xbe\x1e\xa7\xa1\xa1\x7e"
+ "\xaa\x94\x53\x66\x62\xcd\x88\xf9\x34\x63\xe4\xbb\xfb\xeb\x19\xea"
+ "\x66\xfb\x7a\x66\x1a\xde\x9b\xf2\xad\xef\xf7\xbe\x9b\x52\xcf\xba"
+ "\xc9\xc6\x2a\x78\xaa\x83\x9f\x6e\x65\x7c\x4b\x49\xed\xeb\x05\x7e"
+ "\xc3\x5c\x0f\x33\x1c\x6b\xdd\xca\x0a\x4f\xb1\x11\x81\xf3\x49\xc6"
+ "\xff\x42\xfe\xcb\x64\xbb\xf0\x43\x8b\xb0\x61\x56\xe4\x12\x3e\x61"
+ "\x4d\x4d\xa0\x27\xd4\xf3\x49\x91\x4d\x73\x5c\x0c\xdf\x47\x07\x1e"
+ "\xb5\xb0\x63\x39\x5e\xe6\xce\xa8\x61\x97\x0d\xa9\xec\xad\x9f\xd7"
+ "\xb0\x6d\xa0\xe7\xb7\x9d\x63\xd1\xf2\xfc\x35\x29\x32\xd0\x9b\x64"
+ "\x0c\x3c\x9f\x44\x36\x65\x38\x3f\x9f\x34\x9c\x68\xc8\xc0\xd2\xa4"
+ "\xa8\x26\x6f\x0d\x9b\xd4\xc1\x92\x2e\x1b\x98\xe9\xf2\xf3\x49\xc3"
+ "\x9b\xec\x5b\x51\x16\x88\x43\xc0\x95\xec\x59\x91\x9d\x2b\x82\xd3"
+ "\x75\x19\x6c\x4e\xa7\x32\xfd\xec\xf0\x16\x36\x92\xec\x29\x92\x3d"
+ "\x34\xb2\xe9\xaa\xc6\x97\xd4\x06\xe3\x57\xd9\x8b\x2e\x92\xfd\x0f"
+ "\x3f\xe3\x7b\x9f\xf6\x58\xa5\xcf\x70\x85\xfa\xac\xf2\xa4\xe1\x36"
+ "\x7a\x6e\xb2\x8d\x26\xda\x56\xed\xb6\x90\xaf\xa3\x28\x6a\x27\xd6"
+ "\x69\xd4\xea\x93\x80\x65\x71\x92\x11\xe9\xa2\x11\x1f\xe3\xee\xf4"
+ "\xb3\xe0\x84\xa7\xbd\x13\xed\xc2\xa7\x6d\xfc\x8e\x22\x66\x76\x16"
+ "\xb1\x78\xeb\x77\xc5\x5c\x1a\x11\x7c\xfd\x69\x0f\x2f\xff\x69\x3b"
+ "\x2f\x35\x26\xc8\xb8\x1f\x9e\xb5\xfe\x80\x31\xeb\xdd\xe2\x7d\xb3"
+ "\xf5\x7e\x8c\x61\x7c\x89\x59\xd0\xdd\x82\x47\xfb\xe1\xaf\xe4\x1c"
+ "\xff\x61\xe9\xe5\xc8\x57\x92\xd4\xf2\x96\xe9\x6a\xa9\xd1\x4a\xbe"
+ "\xaf\xcf\x29\x3f\xcc\xe6\x95\xa7\x33\x79\xd5\x0b\x62\x2e\x22\x3c"
+ "\xef\x72\xe4\xe3\xeb\x10\x57\x8f\xf2\x53\x2f\x2b\xc6\x56\xfc\x4e"
+ "\x68\xf9\x33\xa8\xdf\xc1\x5d\x19\x19\xd4\x6f\xe1\x1f\x07\xfd\xb2"
+ "\x61\xcc\xf8\xa8\x62\x97\xb0\x19\xdf\x0b\xf8\x6a\xfe\x43\x09\x1e"
+ "\x04\x03\xb5\x37\x69\xb8\xe8\x6b\x6f\x52\x34\xe0\x4b\xb6\x53\x4d"
+ "\x45\xf3\x90\x67\x4b\x71\x0b\xbe\xc5\x5c\x8e\x2f\x89\x22\x3f\x55"
+ "\x6e\xbb\x97\x05\x37\x17\x37\x93\x6d\xb0\x97\x0a\xb0\xe6\x46\x16"
+ "\x63\x8f\x2f\x3e\xa1\xad\x2d\x46\xed\x54\x2b\xbf\x32\x5f\x26\xdd"
+ "\x7e\xb4\x0d\xed\x6b\xc5\x0f\xdf\x7f\x70\xe2\xf2\xf8\x8c\x1c\x3c"
+ "\x6b\xd1\x56\x2b\x2f\x5f\x1a\x4f\xef\xf8\x66\x45\x9b\xdf\x21\x38"
+ "\x10\x3c\x34\x58\xbc\x1d\x82\xc5\xb6\x74\xa4\xdb\xa3\x96\x37\x75"
+ "\x78\x94\x1f\xae\xe3\xe5\xa0\x97\x42\xe9\x4e\x85\xd2\xfd\xd6\x27"
+ "\xd3\x1d\xdf\x2a\xd3\xe5\xcf\x3a\xad\xcc\x2c\x95\xf0\x9e\x79\xfb"
+ "\xb7\xe1\x3d\x73\x5c\x28\xef\x86\x6a\x99\xb7\x3e\x49\xe6\xb5\x51"
+ "\xde\x27\xfb\xb7\x69\xe6\x8f\x43\xe9\x7f\xd5\x2c\xd3\x1f\x6c\x95"
+ "\xe9\x7f\x6e\x09\x4b\xb7\x2a\x94\x6e\xf3\x5c\x99\xee\x7d\xbb\x4c"
+ "\x97\xe5\xc0\xf7\x37\x07\x68\xcb\xeb\xa1\x3c\xbf\xf3\xc8\x3c\xed"
+ "\xeb\x64\x9e\x62\xec\x49\x33\x4f\x5d\xd1\x96\xcf\x42\xe9\xf7\x68"
+ "\xfd\xfe\x22\x41\xa6\x5f\xb5\x3f\x94\xee\x11\xed\x3e\x12\x7d\xff"
+ "\x1a\xe9\x7e\x58\x72\x39\xb2\xae\x5e\xa6\x5b\x3b\x87\xe6\x23\xd2"
+ "\x8c\x57\xcb\x33\xf2\x2f\x47\x3e\x91\x89\x72\xf2\x31\x36\x09\xf4"
+ "\xc4\xd8\x25\xa8\xce\x05\xe0\x51\x67\x74\xd2\x39\x04\xe1\x5c\xec"
+ "\x09\x8d\xc0\xbb\xc1\x81\xcf\x38\x1f\xc9\xea\x93\x7b\xa9\xa0\x0d"
+ "\x36\x3f\x53\x33\x20\xbd\xb6\xe9\x97\xeb\x48\x37\x81\x70\x0a\xea"
+ "\xfe\x98\x6c\xc6\xf1\xe2\x99\x9a\xac\xe9\x11\x71\xaf\x8d\x6c\x36"
+ "\x90\x3c\x52\x8b\x13\xfa\xe5\x2a\xe6\x26\x78\xc3\x3a\xb2\xd3\x47"
+ "\xf2\x47\xec\x51\x0d\x98\x73\x1d\xc0\x13\x43\x5e\x34\xa8\xb5\xf8"
+ "\xd5\xe1\xe7\x7a\x91\xe4\x92\x65\x6c\x86\x2e\xb3\x1d\xb8\xad\x3f"
+ "\xc2\xfe\xf7\xdb\xc6\x90\xdc\xea\x47\x56\x94\x75\xed\xfe\x5d\x94"
+ "\x1f\x59\xaf\x72\x7e\x64\x14\xf6\xd4\xb7\x3c\xe3\x75\xaa\xd2\xbf"
+ "\x3c\xd6\x22\x68\xb8\x1f\x2d\xc7\x9e\x5f\x22\x6c\xc1\x56\x15\xd8"
+ "\xd5\x44\xec\x25\x67\x59\x84\xbb\xb0\x83\xd5\xaa\x1d\x06\x67\x0f"
+ "\x33\x36\x61\x3f\xa5\xf4\xb5\xa0\x1d\xac\x4b\x22\x40\x47\xfc\x68"
+ "\xbd\xf3\x92\x56\x5e\xcd\x96\x92\xe2\xc5\xd2\x8f\x36\xd1\x8f\xb4"
+ "\x07\x01\xef\x44\x0b\xdf\x6a\x4b\x88\x7e\xfa\xd1\x61\xbc\x47\x51"
+ "\x5a\xe0\x7e\x76\xf9\x37\x5b\x4a\x7a\xb6\x2c\x6a\xee\xb9\xed\x49"
+ "\x4f\xef\xa8\x02\x7b\xef\x16\x87\x37\xf0\x9b\xcd\xde\xc0\x6d\x19"
+ "\x25\xc1\x51\x8b\xd3\x51\x37\xf6\xa7\xad\x86\xbd\x6a\xad\x61\x6f"
+ "\x91\xcb\x40\xe5\x1e\x2a\xda\x6d\x38\x58\xd4\x6c\x38\xa8\xd6\x19"
+ "\x0e\x15\x39\xf1\xac\x21\x3f\x5b\xa0\x59\x1f\x8d\x3d\x58\xd4\x80"
+ "\xfd\xf1\x51\xac\xc9\x47\xd2\x75\xf9\x28\x7f\x38\xc0\x9a\x76\x07"
+ "\xd8\x3b\xf9\x17\x99\x37\x76\x41\x35\x7e\x35\xde\x91\xc5\x7e\xef"
+ "\xc8\x17\x84\xff\x76\x3e\xaa\x54\xf4\x91\xee\x68\x1d\x54\x65\x9b"
+ "\x35\x78\x50\x99\xab\x76\xd0\xd9\xa9\x6e\x27\x57\x99\x35\xf9\x5b"
+ "\x76\x72\x0d\xd2\xc7\x5b\x9f\xad\xdc\xff\x2f\xec\xe4\x6a\x72\x04"
+ "\xb2\x93\x0b\xde\xb5\x59\xe3\x5d\x5d\x9a\x4d\xa4\x68\xe2\x57\x85"
+ "\x4d\x24\x87\x4b\xd8\x35\x12\xe7\xf5\x9b\x1d\xe9\x44\x87\x76\x97"
+ "\xcf\xb2\xeb\x7c\x29\xd1\x56\xc1\x8d\x0b\xf6\xe0\xb7\x1b\xf1\xa0"
+ "\xab\xce\x7b\xf5\x78\xbe\x65\x92\x93\x60\x12\xe4\x39\xdf\xef\xa6"
+ "\xfb\x47\x3c\xe7\xc1\xe0\xe6\x67\x33\x83\x9b\x5f\x68\x46\xdc\x54"
+ "\xfc\x1e\x08\x6e\x9e\x54\x85\xdf\x56\xfc\xaa\xf1\xab\xc1\x6f\x17"
+ "\x7e\xbb\xf1\xab\xc5\x6f\x3f\x7e\x75\xf8\x1d\xc0\xcf\x85\x5f\xbd"
+ "\xba\x79\xd2\x1e\xb2\xfb\x87\xb2\x9b\x31\x0f\x2c\x7a\xb9\x21\x78"
+ "\xcf\x3a\x8b\xfe\xa7\x12\xdd\xc7\x63\x4e\x17\x72\xb2\x55\xf6\xea"
+ "\xcf\x2a\x44\xfb\x09\x2f\xbf\xfa\xf3\x4c\xef\xb8\x2d\x76\xef\xb8"
+ "\xcd\xad\xde\xd8\x6d\x51\xf8\x99\xf1\xb3\x78\x37\x97\x98\x31\x9e"
+ "\xad\xde\x91\x25\x35\xdd\xe5\xb3\x31\xfe\x73\xa6\x4a\x99\xd3\x6c"
+ "\xe0\xb8\x39\x9a\xfc\x69\x36\xf0\x7b\x7a\x3d\xbd\x7b\x47\x96\x66"
+ "\x22\x0c\x9c\xf1\xb8\x48\xd7\x35\xaa\xc4\xaa\xdd\x5b\x2a\x41\xbc"
+ "\xd3\x63\xfc\x91\x4b\xa6\x73\x78\xe8\x4c\x09\x71\xbb\xf4\x35\xd8"
+ "\xcf\x97\xc6\x7c\xbb\x6d\xf1\x3c\x87\x6d\xd9\xa2\xdc\xf9\xd9\xcb"
+ "\xee\xb7\x8e\xcf\xb2\x26\xe5\xe6\x3d\x67\x7b\x6e\x79\xf6\xf2\x6c"
+ "\x41\x3e\x22\xea\xf6\x7e\x67\x4a\xe4\x33\x99\x05\xc0\xe7\xc4\xb4"
+ "\x73\x4e\xfb\xf6\x2c\x1f\xc6\xe7\x96\x2d\x25\x07\xce\x79\x0d\x41"
+ "\xd0\x6f\xd1\xed\x25\x58\x97\x05\xf6\x03\xe7\xfc\x86\xe8\x76\x2b"
+ "\xe3\x58\x0b\xf4\xcd\xdd\xde\xac\xd1\x73\x1f\xb1\x46\xa2\xe7\x90"
+ "\x66\xef\x12\xbf\xe1\x31\xca\xff\xdb\x8c\x92\x7d\x78\xe7\x5b\x56"
+ "\x79\x29\x1f\x07\x8d\x27\x9e\xa0\xf1\x64\x78\x51\xf3\x41\xf1\x74"
+ "\x78\x0f\x8a\x74\x8b\xd3\x0f\xd1\xf3\x52\x21\x6f\x44\xb9\x24\x5b"
+ "\xe3\xbf\xfd\x19\x3b\x28\xf3\x78\x44\x1a\xac\xc3\x36\x25\x6d\x32"
+ "\xa5\x13\x3c\x13\xda\xb8\x0f\xed\x28\x5e\xce\x8c\xfa\xda\x26\xbe"
+ "\xa8\x6f\x7d\xaf\x20\x7a\xf7\xb1\xed\xb4\xbe\xa9\x3d\x1c\xeb\xf9"
+ "\x75\xe4\xdd\xbb\x44\xf2\x91\xe0\x1d\x23\x88\x67\x24\x1c\x42\xb8"
+ "\xc3\x5d\xd8\x2c\xf2\xd7\xaa\xcd\xe0\x39\x23\x28\xef\x67\xf4\xad"
+ "\x1a\x34\x6a\xb5\xe0\x49\xd2\x2c\x3a\x1f\xb0\x6e\x94\xb4\x89\x14"
+ "\x9d\xc9\xe8\xee\xf6\xd8\x73\xca\xec\x6f\x08\x7e\x04\x2f\x3a\xc3"
+ "\xe5\xe5\xb3\x6b\xab\xe3\x98\x91\xfc\x0d\x04\x46\x6e\xd6\xec\x73"
+ "\xa5\x65\xe8\xb4\xb5\x2f\x7e\x73\xbf\x3b\x3b\x72\xbc\xac\xd9\x4b"
+ "\xe8\x34\x22\x4b\x1c\xfb\xcd\x5b\xb6\x6c\xf9\xe2\x6c\x6b\xf6\xbc"
+ "\xf9\x39\x56\xf1\xd9\xba\x7c\x19\x92\xe4\xe6\x2f\xb3\x2e\x5d\xb9"
+ "\xc4\xba\x78\x59\x2e\x71\x09\xd9\x79\x79\xcb\xed\xf9\xc3\x99\xcc"
+ "\x69\x5d\xbc\x7c\x51\x7e\xae\x1d\x2f\xcb\xb2\x97\x64\x59\xc5\xa8"
+ "\x2f\x43\x51\x8b\x16\x59\xb5\x1a\x96\xe5\xcc\xcb\xa3\x89\xb0\xe4"
+ "\x19\x24\x0a\xcb\xdf\x9f\x87\x88\x26\x9b\x53\xb4\xef\x9c\x53\xd2"
+ "\xdf\xaa\x37\x02\xd6\x55\x9b\x1b\x48\xef\x00\xe1\x3a\xc1\x57\x96"
+ "\xa7\xe5\xd0\x19\xcd\x8b\xe8\x63\xd7\xf8\x9f\x63\xee\xa6\x4f\xd6"
+ "\xfb\x46\x36\xde\x85\x8d\x43\xb2\x9f\xa9\xa4\xbf\x2a\xee\xd3\x61"
+ "\x3d\x08\xbd\x94\xf2\xb4\xe7\x25\x2c\xd2\xb3\xc2\xed\x63\x4b\xfd"
+ "\x9b\xf4\xd5\xf2\x7c\x23\xbd\x8e\x68\x23\xcd\x26\xbd\x82\x3c\xaf"
+ "\x51\x1e\x75\xf3\x0b\xad\xc8\x57\x1d\xe2\x4f\xd2\xf3\x29\xbd\x48"
+ "\x57\x9e\xf6\x2e\x1f\x59\x02\x3e\x25\x3d\x83\xda\x35\xc8\x1e\x63"
+ "\xbd\x84\x72\x3f\xac\x65\xec\xce\x78\x96\x74\x69\xd3\xc2\x8a\xee"
+ "\xb8\x05\xb5\x3d\x65\x6c\x68\x0f\xf6\x35\xbf\x81\x8d\xbd\x8c\x79"
+ "\xb1\xea\x2e\x16\xb1\x7a\x36\x33\xd4\x2e\xac\x25\x1b\xad\xac\x71"
+ "\xe6\x56\xe6\xce\xf4\x30\xb7\x7f\x0f\x6b\x74\xb5\xb1\x63\x81\xff"
+ "\x94\xfe\x13\x0a\x88\xbf\x78\x7c\x0c\xd9\x8d\x2a\x5e\xcd\x83\xfb"
+ "\xfe\xe4\x1d\xb2\xf7\x4c\x2d\xf9\x3d\x18\xeb\x0e\x7c\xe1\x72\x17"
+ "\xee\x62\x6e\x87\xdb\x45\xf7\xe9\xcf\x29\x3f\x1e\x76\x10\xdf\x86"
+ "\x35\x22\xdf\x63\x6c\x28\xe0\x18\xa4\x3a\x2a\xb6\xf0\xd6\x5f\x8d"
+ "\xe2\x27\x7e\xb5\x85\x7b\x30\xa7\xc8\x8f\x41\xc7\xfa\x51\xbc\x73"
+ "\xbd\x66\x1b\x8e\xe6\xa9\x7d\x05\xb3\x9c\x51\x7e\x5c\x25\x64\x1c"
+ "\xd3\x45\xf8\x46\x84\x85\xee\x99\xdb\xb1\x85\xc2\xa3\x11\xde\x2f"
+ "\xc3\x3b\x28\x7c\x13\xc2\xf5\x32\xfc\x2e\x85\x13\x10\x6e\x91\xe1"
+ "\x26\x26\xef\x96\xff\xb8\x5d\x86\x3f\xa1\x30\x60\xff\x63\x9f\x6b"
+ "\x05\xb5\xf7\x73\x8c\xd9\xe3\x4a\xf1\x67\xe0\x53\x1d\xa7\xc5\x7a"
+ "\x38\x54\x94\x43\x32\x18\xac\x87\x1f\xff\xdb\x75\x27\x88\xc7\x7d"
+ "\x3c\x31\x32\x85\x9e\x3f\x4e\x32\xf9\xd9\x50\xd0\x8c\xd7\xa1\x3f"
+ "\x17\x09\x76\x03\xd2\x30\x7b\x7f\xbe\x2f\x2d\xc0\x5d\xfc\xd5\x0c"
+ "\x07\xdf\x5c\xe0\xe5\xaf\x3e\xe9\xe2\x62\x9f\x7b\xa6\xb6\xb6\xc0"
+ "\x2f\xec\xe4\x82\x4e\xc7\x1a\x7a\x7c\x1e\xb5\xc9\x0b\xba\x77\x10"
+ "\xbb\x99\x66\xbe\xf9\x59\x2f\xf8\xc9\x9c\xd9\x49\x01\xd2\x21\x04"
+ "\xad\xff\xf8\xc5\x77\x72\x88\x6e\x28\x9d\xaf\xee\x7a\xd2\xa5\x16"
+ "\x67\x30\x9e\x98\xe1\x98\x9d\xc3\x5d\xd8\xc3\x14\x29\xef\xe6\x5f"
+ "\xa0\xfe\x2f\x44\xbd\xe3\x33\x1c\xea\xca\x1c\xf2\xfd\x24\xf0\x4b"
+ "\x11\xed\xe7\x2b\x80\x4f\x9e\xcf\x30\x05\x37\x97\x66\xbe\x93\x73"
+ "\xea\xda\xfc\xa8\x29\x8f\x0f\xea\x2b\x89\xda\x14\xe4\x19\x2c\x80"
+ "\x7a\x02\xe8\x2b\xd1\x0e\x7b\xd5\x06\x03\x68\x18\xc7\xeb\x4f\xb7"
+ "\x0e\xe1\x2b\x33\x4c\xe8\xd3\x5d\xee\xa4\x8b\xac\xa9\x87\xd6\xca"
+ "\x4f\xf6\xbf\xe3\x60\x6c\x86\x23\xe0\x32\x79\x85\x3e\x9b\xd9\xbe"
+ "\x90\xdd\xcc\x47\x3e\xeb\x3d\xa3\xcc\x31\x3e\x56\x88\x3e\xa0\xef"
+ "\x07\xdb\x5a\x8d\x2a\xfa\x31\x49\xc2\x8d\xf2\x75\x00\xb6\x39\x3a"
+ "\x7f\x73\x6d\xed\xff\x89\x98\x37\xea\xb2\x0c\x46\xf7\xfc\xf6\x81"
+ "\x5e\x51\x7b\x33\x4c\x2a\xf6\x23\xfa\xf6\x4e\xd2\x59\x46\x75\x4a"
+ "\x58\xff\x44\xe8\x21\xf1\x44\xc0\x19\xf5\x93\x5d\x61\x1d\xae\x48"
+ "\xdb\x11\xec\xcd\x19\x78\xfc\xb7\x94\xa6\xa0\x7d\x99\x7c\xf3\xa4"
+ "\x81\xed\x42\x6f\x99\x64\x93\xf3\xe3\x67\x5b\xf1\xdb\xcd\x5f\xd9"
+ "\xec\xf1\x8e\xff\x59\x9d\xf0\xcd\xb9\xc5\x91\xa9\xcb\x8a\xb0\xde"
+ "\x30\x47\xe6\xfc\x5b\x6d\x51\xc7\xc0\x76\x55\x9d\x87\xa5\x4f\xb4"
+ "\x21\x5f\x70\x53\x90\x7c\xfd\x5e\x24\x1b\xd5\x15\xef\x24\xf9\xae"
+ "\x71\x4c\xe7\x34\x0c\x36\xa6\x54\xfe\x8c\xdb\x79\xef\xb5\x95\xf7"
+ "\x84\x65\xd0\x39\xb2\x0b\x70\x89\x9f\x54\xd2\xc3\xa7\x2b\x92\x07"
+ "\xf9\xe9\xdb\x04\xab\x00\xf6\x91\x82\x8f\x99\xc1\x8f\xfd\xf2\x3f"
+ "\x7f\x5a\x61\x48\xc6\x3e\x13\x04\x2d\xf0\x7e\x73\x3d\x4b\x9b\xc5"
+ "\x8a\x8f\xe5\x5c\x60\xba\xaf\x33\x3e\x6a\x95\xf7\xb5\x9f\x7a\x0d"
+ "\x74\xe6\x44\xbe\xcd\x04\xbf\xbe\xa5\x38\xe5\xbf\x3e\xc1\x9e\x09"
+ "\x3a\xe2\xf5\x4f\xbc\x86\x40\x57\x86\x55\xd8\xc8\x06\x1f\x51\x9c"
+ "\xc3\xd5\xbe\x73\x28\xf2\xa3\xe0\xb4\x59\xc9\x77\xf4\x87\xe9\xcd"
+ "\xe2\xee\xf5\x87\x19\xf5\xec\xc3\x13\x5b\x59\x63\xfb\x67\x74\x5f"
+ "\xf0\x95\x0f\x33\x9c\x44\x4f\xc6\x04\x40\x33\x6e\x03\xcd\x88\xf5"
+ "\x3a\x4c\x35\x1f\xae\xd0\xcf\xa2\xe8\x5c\x4a\xa7\x17\x03\x58\xa3"
+ "\xd5\x9a\xbf\xb3\x40\xf9\x9c\x3d\xd5\xda\xb9\x14\xf9\x41\x7b\x79"
+ "\x05\x4b\x7c\xd9\xa0\x66\x0c\x74\x0e\x15\xf3\x9c\xb0\xcd\x62\x51"
+ "\x63\x0f\x57\xe8\xfe\xd0\x1e\x7b\xce\xca\xfe\x8c\xbe\xbf\x93\x74"
+ "\xad\x6b\xf2\xa7\x42\xe7\x3c\x80\x79\x17\xc0\x9c\x0b\x00\x9e\x18"
+ "\x03\x07\xc6\x6d\x40\x5e\x4c\x1f\x83\xde\x62\x7d\x0c\x32\x66\x8b"
+ "\x31\x00\x0f\xf7\xfc\x93\xda\x18\x7c\x8a\x31\x68\xc7\x18\x94\xb1"
+ "\x92\x0f\xe6\x34\xb2\xb4\x74\x8c\x41\xe7\x05\xb2\xaf\x2e\xfd\xcd"
+ "\xe5\x4b\xd8\x8b\xb1\xf8\xd4\x6b\x68\xf2\xc9\x31\xd8\xf3\x73\x39"
+ "\x06\x7b\x7f\xee\x05\x1d\xf3\xb3\xe6\xd7\x10\x0e\xae\xcc\xb0\x92"
+ "\xef\x1c\x5e\x96\x49\xbe\xb1\xe5\x58\xf4\x62\x2c\x7a\xe5\x58\x14"
+ "\x3d\x87\xb1\x68\x69\x15\x36\x5a\x3e\x3c\xd1\xc8\x1a\x33\x6b\xd8"
+ "\x31\xe0\x25\x8c\xc5\x3c\x1a\x17\x92\x2f\x04\x9f\x4f\x8a\x7b\xa9"
+ "\x80\xc5\x57\x17\x30\x8b\x3e\x1e\x6a\x2f\xc6\xa3\x00\xe3\xd1\x83"
+ "\xf1\xf0\xf7\x8d\x47\xbc\x18\x8f\xb3\xda\x78\xf4\x90\x8e\x1b\xc6"
+ "\xa3\x07\xe3\xd1\x83\xf1\x28\x93\xe3\x41\x78\xfe\x31\x9f\x89\xab"
+ "\x7f\x4f\x62\x3b\xce\x0c\x30\x1e\xcf\x6b\xe3\xf1\xe9\xbf\x32\x1e"
+ "\x19\x96\x6f\x8f\xc7\x4f\x03\xff\x68\x3c\x42\x6b\xe2\xc9\x6f\x68"
+ "\x3c\x7a\x6b\xb4\x35\x71\x1b\xad\x89\x12\xc3\x9d\xff\x2f\x7b\x5f"
+ "\x1f\x17\x55\x95\xff\x7f\x18\xa0\xb0\x50\x47\x17\x0c\x4b\x0b\x4d"
+ "\x77\xb1\x7c\xaa\xaf\x96\xb6\xf6\x4d\x4b\x4b\x5b\x1f\xb0\x24\x51"
+ "\xd1\xd0\x7c\x18\x48\x8d\x14\x0d\x1f\x78\x4c\x5b\x24\x1f\xb0\xc0"
+ "\x50\x41\xb1\x2f\xee\x17\x4b\x8c\xf6\xab\x1b\xb6\x5a\xb8\x69\xa1"
+ "\xf1\x64\xe9\x86\x2e\xea\x68\xe8\xa2\xa1\x4d\x88\x32\xe0\xcc\xdc"
+ "\xdf\xe7\x73\xcf\x1d\xee\x3d\x33\xf7\xce\xcc\x1d\x51\xe4\xb7\xfe"
+ "\xc1\x4b\xe7\xde\x3b\x67\xce\xfd\x7c\xde\xf7\x7d\xde\x9f\xcf\xfd"
+ "\x9c\x73\x60\x2c\x42\x9b\x1e\x2e\xdf\xc7\x3f\x13\x70\xaf\x09\x3b"
+ "\x5e\x33\x6a\x8a\xab\xc0\x2f\x33\x39\x33\x1f\x0f\x0b\x7e\xa1\xfe"
+ "\x58\x62\xc8\xfd\x27\xb5\x7f\xe0\xcb\x38\x66\xe0\xb3\x81\xfe\x01"
+ "\x3f\xc1\xf3\x23\xb7\x57\xa0\xf4\x7d\x2d\xb4\x69\xc1\xe7\x04\x9f"
+ "\x11\x7c\x1e\x4a\x74\xa7\xf8\xbd\xd7\xbf\x0f\x2e\x22\xf8\xde\xf6"
+ "\xfb\xd0\x7d\xe0\xab\x0c\x62\x7e\x07\x7c\xb3\x18\x9e\x13\x0f\xd2"
+ "\x0d\xf7\x0c\xfc\x3e\x34\x19\xf5\x82\x16\x30\xdf\xc6\x0c\x7e\x32"
+ "\xd7\x07\xdc\xb7\x1a\x62\xac\xad\x8b\xc5\xe7\x66\x8b\xb0\x3f\x32"
+ "\x77\xcf\x84\x9d\x70\xdc\xcb\x04\x3e\x82\x67\x87\x79\x66\x9a\xf6"
+ "\x4d\xfe\x39\x88\x64\x9d\x23\x3e\x6d\x23\xa8\x8f\xcc\x92\x67\x66"
+ "\x4c\x04\x3e\x33\x09\xe0\xa3\xe3\x2a\x7d\x34\x89\xee\xd5\xd6\x09"
+ "\xb8\xda\xbf\x5f\x02\x8c\x93\xe0\xa3\xd0\xd5\x4a\x3e\x32\xe7\x4c"
+ "\xcc\x30\x6b\x67\x67\xe0\x3a\xef\x96\xb7\x26\x78\x58\x20\x7e\x6a"
+ "\x84\xb8\xf5\x7b\x83\x89\x2c\x9f\x4a\x34\x4b\x4f\x91\x7b\xca\x26"
+ "\xfc\x40\xca\xf4\x05\x04\xd7\x4c\xc6\xbc\x37\xee\x9d\x50\x66\x2a"
+ "\x00\xbe\x7a\x1f\xf7\xfd\xd2\x64\xf1\x9f\x0d\x64\xd9\x54\xe2\xc9"
+ "\xef\x25\x1a\x9a\x4d\x56\x03\x3e\xf3\x26\x67\x6b\x2c\x69\x73\x47"
+ "\x72\x5a\xdc\xf3\x85\x14\xe2\xfc\xa5\xf8\x25\xc4\xb7\x44\x57\x8c"
+ "\xeb\xc6\x9d\xc1\x75\x80\x4b\xeb\xa0\x4d\x03\xd7\x68\x86\x31\x63"
+ "\x4b\x12\x57\x80\xeb\xe0\xf7\xc3\x31\x82\x5f\xd3\x62\x72\x09\x6a"
+ "\x11\xcc\xff\x15\xc6\x6d\x02\xed\x35\x99\x5f\x5f\x0b\x8e\x79\x94"
+ "\x44\x62\x9d\xc5\xb4\x61\xd8\x2f\x9a\x8b\xa7\xff\xf6\xc3\x3d\x17"
+ "\x3b\xbd\xff\xe1\xfe\x38\x83\x57\x2a\xc4\xc3\xa0\xd1\xe0\xba\x29"
+ "\x5d\x39\x1a\x1b\x16\x95\x1d\x33\xf2\x79\x58\x43\xbc\xee\x9e\xd4"
+ "\xa5\xb8\xe6\x2e\xae\xa9\x8f\x63\xf6\xd4\xdf\x70\x3f\x64\x2e\x07"
+ "\xc6\xab\x4e\x31\xe1\xf9\x33\x0c\x1a\x71\x5c\x9e\x32\x12\xc6\xb3"
+ "\x82\x11\x41\x5c\x3c\xee\x3d\xf0\x15\xdc\x17\xc6\x41\x9f\x9c\x33"
+ "\xf2\x9c\xf2\xe9\x8c\x64\x0d\xe6\x89\x8c\xc0\x0f\xc5\xff\xfc\x2b"
+ "\xbf\xbf\xeb\x05\x8f\xb0\x49\x47\x42\x4d\x04\x7f\x3f\xa4\x17\xbe"
+ "\x6b\x99\xb2\xba\x41\x73\x26\xb0\xe1\x9e\x10\x9f\xf8\x2a\x71\x6f"
+ "\x4b\xe9\x1e\x96\xc8\x33\x79\x33\xa0\x4d\xe4\x99\x73\x09\x1a\xca"
+ "\x2d\x43\x31\x57\xe9\x63\xcb\x2d\x25\x35\x97\x49\x1c\xe0\xb8\x44"
+ "\x97\xcd\xef\x0f\xd1\x0e\xf8\xdd\xb2\x0c\xf8\xe4\x46\x50\xc7\x2c"
+ "\xe0\x13\xe4\x81\x2d\xc0\x1f\x96\x65\x01\xf7\xad\x6d\x24\xbd\xad"
+ "\x3c\x82\xda\x0b\xff\x9d\x0a\x18\x6d\x5f\x04\xc7\xc0\x4f\x16\xe0"
+ "\x75\xe0\x93\xa0\xcd\x4b\x49\x8f\xcd\x80\xd1\x2c\xe4\x11\xd0\xc5"
+ "\x63\xa3\x80\x47\xde\x01\x1e\x59\xcc\xef\x31\x1c\xb0\x45\x43\xf9"
+ "\xe3\xcb\x73\xc9\x9a\x54\xeb\x1e\xe3\xbc\x7d\xc3\x2e\x97\x22\x3e"
+ "\xc2\x13\xf8\xf9\x69\x66\x1c\x9f\x96\x85\x7a\x96\xd6\x01\x46\x36"
+ "\xbc\x3f\x14\x8f\xf1\xcf\xed\x3b\xba\xfb\x2c\x14\x6b\x43\xd1\x26"
+ "\x5b\xaf\x90\xfe\xfc\x3e\x9c\xbf\x06\xdc\xb7\x6e\x3e\xe9\xbd\xe5"
+ "\x0a\xe9\xb1\x65\x3e\x09\x82\xe7\x55\xb3\x05\xfa\x30\xed\x6d\x2d"
+ "\xe1\xf7\x61\xb8\x27\x44\x0b\xc7\x65\xf7\x61\x00\x5d\x1d\xb0\x05"
+ "\x9f\x99\xb7\x82\x9a\xfa\x64\x4a\xcd\x0a\x34\x83\xed\xe8\xba\x49"
+ "\x53\x47\xd0\xda\xe8\x71\x5a\xaa\xf3\xa7\xc6\xd0\xfa\xa4\x09\x7e"
+ "\x10\xab\xdc\x7b\xc9\x63\x6a\x1f\xee\x83\x30\x9f\xa8\xa5\xb8\xfe"
+ "\xb0\x70\x0e\xb4\xa7\x05\x7c\xd5\x37\x81\x24\x58\x3a\x7c\x97\x5b"
+ "\x16\x03\xda\x09\xd7\x49\x56\xf5\x1c\x4e\xe5\xe7\x99\x9b\x53\xb3"
+ "\x70\x8f\xf5\xa1\x96\x0f\xb2\x7a\x6f\xbd\x44\xfa\x73\x6f\x82\x3f"
+ "\x22\xe1\x5e\x2f\x91\x1e\x99\x97\xe0\x5e\xdf\xa1\xf7\x6a\xdd\x53"
+ "\xdd\x92\x74\x26\x08\xce\x39\xdc\xc3\xc8\xf0\x26\xee\x61\xf4\x27"
+ "\x3d\x70\xd8\xef\xb8\xee\x84\x94\xd4\xf0\x6b\x56\xd4\x97\x99\x4e"
+ "\x11\xfc\x5d\xcc\x1d\x95\xd5\x22\xa6\xa7\x75\x43\x2c\x5b\xb2\xd3"
+ "\xf5\xaf\x57\x02\xb6\xeb\x75\x84\x83\xff\x7f\x75\xce\x80\x6b\x44"
+ "\xf0\x9a\x4f\xef\x31\x25\x18\x75\xda\xd7\x70\x0c\xb1\x2f\xc1\x7c"
+ "\x30\x62\x1e\xcf\xf3\xb8\x87\xef\x95\x55\x9e\x27\xd8\x9e\xb4\x1d"
+ "\xf4\xbf\xb5\xad\x0b\x1e\xaf\x7b\x63\x5b\x88\x05\xcc\xf1\xe0\xb3"
+ "\x46\x7d\x5f\x80\xb5\xe1\x01\x5c\xa7\x79\xe5\xf4\xb3\x01\xd7\x1e"
+ "\xd1\x22\x06\x78\xac\x00\x7f\xe3\x9a\xa6\x1c\x17\xea\x09\x38\xc3"
+ "\x7e\xde\x07\xfe\xee\x6f\xc5\x05\x1c\xf3\xb3\xc5\x46\xbb\x44\x2d"
+ "\xc6\x34\x7e\xf8\x7f\x57\xf1\xa1\xce\x7f\xaf\x7b\x29\xd6\xbd\xf5"
+ "\x98\xc8\xf3\x25\xf2\xa6\xf9\xaa\x84\x33\x6b\x28\x67\x22\x27\x59"
+ "\x79\x93\xe7\x26\x7e\x1d\xfd\x02\xac\x91\xd5\xf1\x7d\x54\xc9\x9b"
+ "\x25\x35\x22\x6f\x8e\x8d\x92\xf0\x66\x0d\xd7\x68\xe9\x29\xc7\x9b"
+ "\xe1\xde\x2c\x6f\x86\xb7\x61\x79\xf3\x8d\x79\xb6\xbc\x69\xcf\x99"
+ "\xe1\xa3\xe4\xf8\x12\xe2\x98\x47\x2e\x79\xbc\xd1\x45\x99\x2b\xc3"
+ "\xa3\xd5\x73\xe5\xf4\x95\x2c\x57\x86\x17\xfc\xff\xcb\x95\x33\x3a"
+ "\x33\x5c\xa9\x75\x91\x2b\x2f\xf1\x5c\xe9\xc7\xfd\x02\xcf\x84\xc0"
+ "\x1f\x5b\x22\x15\xb8\x32\xd2\xc9\xb3\xf0\xa6\x12\x57\xce\x78\x9b"
+ "\xe5\xca\x19\x39\x2c\x57\xce\x98\x24\x72\xa5\x70\xae\x59\xb8\x72"
+ "\x46\x54\xcb\x70\xe5\x8c\x28\x9e\x2b\xaf\x20\x57\xbe\x31\xc6\x39"
+ "\x57\x86\x2f\x97\xe7\x4a\x38\xce\x73\x65\xf8\x72\x91\x2b\x4f\x39"
+ "\xe1\xca\x99\x4f\xa8\xe0\x4a\x3f\x9e\x2b\xb5\x0a\x5c\x19\x09\xb6"
+ "\x12\x70\xc1\x63\xcf\x06\x1b\x02\x57\x06\x34\x71\xa5\x0b\xf8\x50"
+ "\xe7\xbf\x99\x8a\xfb\x85\x21\x57\x5a\x52\xa9\xbe\x44\xae\xe4\x3a"
+ "\x09\x5c\x39\xd7\x44\x96\x9e\x00\x8e\x3c\x76\x89\xdf\x6f\x83\xaf"
+ "\xe7\x85\xbf\xe5\x93\x90\x8b\x96\x44\xed\x02\x7b\x95\xe9\xf3\x79"
+ "\x6e\xe2\xe7\x64\x8d\x46\xae\xca\x87\x6b\x33\x9a\x74\x27\xcf\x9d"
+ "\x27\x04\xee\x0c\x13\xb8\x73\xda\x4d\x70\xe7\x64\xf4\xe5\xac\x61"
+ "\x0d\x1a\x2b\x77\x7e\x00\xdc\x39\x8b\xd7\x0f\xf8\x5e\x97\x72\xa7"
+ "\x6e\xbf\xb5\x5f\x98\xd3\x2c\x8b\xde\x44\x68\xbf\x6a\xed\x79\xf4"
+ "\x65\xbe\xbd\xf4\xc2\xc8\x1a\xd2\xc4\xa5\x61\x22\x97\x42\x5b\xf3"
+ "\x94\x79\x74\xd6\xbe\x26\x1e\x4d\x02\x1e\x3d\x2d\xe1\x51\x88\x9b"
+ "\x3e\x45\xce\x03\x1e\xad\xe7\x79\xf4\x4b\x81\x47\x67\x97\x1c\x09"
+ "\x03\x1e\x7d\xd9\xca\xa3\xb3\x89\x31\xe9\x4c\xa0\xf1\x3d\xe7\x3c"
+ "\x5a\xcf\xf3\x68\xd4\xad\xe7\xd1\x83\x36\x3c\x0a\xb1\x2b\xee\xab"
+ "\x2e\xcb\xa3\x56\x3c\xf2\x3c\x9a\x20\xf2\x28\x6f\xd7\x39\x11\xa5"
+ "\xe1\x60\xf7\xf0\x28\x3e\x76\x6b\xe2\xd1\xa8\x7c\xca\xa3\x70\x8c"
+ "\xcf\x9f\x2c\x04\x1e\x05\xfc\xc5\x97\xc0\x7d\xc3\xf3\x02\x7d\xd4"
+ "\x22\xbf\x6e\x85\x67\x06\x6d\xd4\xc4\xa7\x91\xf0\xcc\x20\xc7\x5c"
+ "\x85\x67\x06\x78\x74\xda\x35\x2d\xe1\x9f\x97\xf7\xe0\x79\xb9\xa4"
+ "\xb0\x07\x98\xb5\xe6\x56\x91\x4f\xe7\x1c\x60\xf9\x74\x4e\x1d\xcb"
+ "\xa7\x73\x76\x88\x7c\x2a\x9c\x43\x3e\x05\x9f\x81\x7d\x72\x91\x53"
+ "\xdd\xe3\xd3\x39\x85\x4d\x7c\xaa\x11\xf8\x34\xd2\x39\x9f\xf2\xef"
+ "\x05\x15\xf8\x54\xca\x0d\xca\x7c\x3a\xa7\x50\xe4\x53\x5d\x56\x13"
+ "\x9f\x56\x28\xf1\xe9\xac\x83\xf2\x7c\x0a\xc7\x79\x3e\x9d\x75\xb0"
+ "\x89\x4f\x2b\x64\xf8\xf4\x65\x29\x9f\x46\xac\xa1\x7c\x9a\x4f\xd7"
+ "\xc8\x00\x4e\x2d\xad\x03\x7c\xe0\x33\x17\x9d\xc1\x73\xaa\x05\x38"
+ "\x15\xf7\x45\xc5\x7d\x61\xb0\x8e\x5e\x8e\x53\x29\xe7\xea\x09\xf2"
+ "\x2a\x3e\x9b\xf1\x63\x20\xde\x85\xb1\x08\x6c\xc2\x8f\xbd\x56\xfb"
+ "\x6d\x95\xf0\xeb\xeb\x4b\xb4\xa8\xed\x18\xac\x58\xac\x58\xb9\x1a"
+ "\x84\x75\xc0\x0c\x56\xd4\xf9\x32\x62\xb5\x12\xb7\x2a\xc5\xee\x47"
+ "\x30\x76\x0f\x21\x9a\x65\x21\xc0\xaf\xa1\x18\xbb\xe7\xda\xc4\xee"
+ "\xb9\xf6\xb1\xfb\x71\xc7\x3c\xaa\x2a\x76\x7f\x0d\x7d\x18\xb9\x8a"
+ "\xe5\xd1\xc8\x35\x2c\x8f\xce\x6f\x83\xfd\xa2\x3c\x9e\x2b\x1f\xbb"
+ "\xf3\xcf\x79\xe4\x89\xa6\xd8\xbd\x82\xe5\x4f\x31\x76\x9f\xb7\x57"
+ "\x99\x47\xdf\xf4\x62\xf4\xe8\x34\x81\x47\x67\x08\x3c\x3a\x43\xe4"
+ "\xd1\xef\x7f\xb0\xea\xd1\xb9\xdd\x0e\x57\x48\x79\xf4\xcd\x91\x4d"
+ "\x3c\x5a\x69\xcf\xa3\x56\x0e\x45\x3e\xc5\x76\x30\x97\xb5\x13\x78"
+ "\xfa\xb3\x19\x51\x1a\x9a\xab\x0d\x47\xdb\xf9\xd8\xe6\x6a\x4b\x6a"
+ "\xae\x91\xb8\x30\xe4\xd3\x0c\x9e\x4f\xdb\x7b\x90\xe9\xc0\x7d\xed"
+ "\x70\xde\x40\x26\xbe\xd3\x5f\x4c\xf7\x55\xc2\xfc\x92\xe5\x1d\xba"
+ "\x47\xa1\x35\xcf\x04\xf7\xcb\xbf\xcb\x9f\x7a\x4a\xe0\x54\xdc\x7b"
+ "\x1c\x30\xb7\xf9\x3a\x70\xea\x62\x19\x6d\xba\x0c\x38\x75\xa9\x44"
+ "\x9b\xc2\xb3\xff\xe5\x0c\x5b\x4e\x9d\xbb\xa7\x14\xb1\x82\x9c\xca"
+ "\xc4\xf1\xb9\x77\x40\x1c\x3f\xaf\x2d\xcb\xa5\xf3\x86\xb2\x5c\x3a"
+ "\xf7\x9a\xc8\xa5\xc2\xb9\x66\xd1\xa6\xf3\x7c\x5b\x46\x9b\xce\xf3"
+ "\x15\xe3\xf8\x79\x17\x9b\xb8\xf4\x98\x12\x97\xbe\xe9\x2b\xcf\xa5"
+ "\x70\x9c\xe7\xd2\x37\x7d\x9b\xb8\xf4\x98\x4c\x1c\xcf\x70\xe9\xfc"
+ "\x12\xca\xa5\xb9\x54\x9b\x56\x58\xb5\x69\x6e\x2b\x8c\xe3\xe7\x17"
+ "\xab\x8d\xe3\x8f\xd4\x50\xfe\x44\x7e\xb2\x72\xa8\x18\xc7\xe7\x2a"
+ "\xc7\xf1\x4e\x38\x54\x95\x16\xe5\x39\xf4\xad\x12\x96\x43\xdf\x3a"
+ "\xca\x72\xe8\xc2\x61\xb6\x1c\x6a\xcf\x9f\x51\x1d\xe4\xb8\x93\xc6"
+ "\xf1\x0b\x0c\xca\xbc\x19\x35\x44\x3d\x6f\xbe\x3d\x89\xe5\xcd\xa8"
+ "\x84\xff\x0c\xde\x7c\xfb\x32\xc3\x9b\x5a\x17\x79\xf3\xb6\xc4\xf4"
+ "\x0b\x6c\xf2\x9f\x0b\x6c\xf2\x9f\x0b\x24\xf9\xcf\x05\xcd\x98\xff"
+ "\x5c\xd0\x42\xf9\xcf\x05\xc3\x45\x0d\xba\xb0\x9b\x73\xde\x8c\x1a"
+ "\x2e\xcf\x9b\x70\x9c\xe7\xcd\xa8\xe1\x22\x6f\x3a\xd3\xa0\xd1\xde"
+ "\x2a\x78\xf3\x0e\x8f\xe9\xa3\x1d\xe6\x3f\xe5\x62\x7a\xe4\x4d\x9e"
+ "\x2f\x2b\x6c\x62\xfa\x10\x69\x4c\x9f\x2b\xc6\xf4\x23\x29\x6f\x95"
+ "\x99\x52\xd9\x98\xbe\xd9\x79\x74\x91\xbf\xb1\x29\x1f\x9a\x02\x3c"
+ "\xba\xa8\x33\xde\x9b\xb1\x29\x1f\x1a\x93\x65\xed\x17\x8d\xe9\x3f"
+ "\x20\xb4\x5f\x32\x31\x3d\x5f\x3b\xbc\x28\xa2\x29\xa6\xaf\xb0\x8d"
+ "\xe9\x63\xc6\x28\x73\xea\xa2\x54\xd9\x98\x1e\xe3\x6f\x9e\x53\xa3"
+ "\x78\x4e\xbd\xbe\x41\xca\xa9\x8b\xf3\x78\x4e\x7d\xd1\xca\xa9\x8b"
+ "\x8e\x19\xe1\xd9\x34\xde\xe3\x9c\x53\xb1\x1d\x91\x53\x75\xb7\x87"
+ "\x53\x0b\x5d\xe7\x54\xe9\x9c\xd5\x2f\xe1\xde\x9b\x38\x95\xb7\xf1"
+ "\x3b\xa3\x4a\xc3\x91\x53\x75\x36\xf1\x7d\xae\x7c\x7c\x7f\x98\x68"
+ "\xd0\x3e\xd6\xf8\x1e\x7d\xc0\xf3\xcd\x2d\x8d\xef\xdf\xd9\xc6\x72"
+ "\xeb\x3b\xc7\x58\x6e\x7d\x67\x95\xc8\xad\xc2\xb9\x66\x89\xef\xdf"
+ "\xc9\x6e\x99\xf8\xfe\x9d\x6c\x91\x5b\x63\x62\x9d\x73\xeb\xa2\x0c"
+ "\x79\x6e\x5d\x94\x41\xb9\x75\x51\x86\x43\x6e\x7d\x51\xca\xad\x4b"
+ "\xe6\x59\xb9\x55\x8c\xef\x01\x1f\xf8\xfc\x45\xa7\xba\x1f\xdf\x8f"
+ "\x6a\xe9\xf8\x7e\xc9\x5c\x55\xf1\xfd\x06\xe0\x59\x88\xc5\x97\x1d"
+ "\x85\xf8\x7e\xbc\x10\xdf\x57\x66\xdb\xc4\xf7\xd9\x76\xf1\xfd\xf2"
+ "\xf1\x02\xa7\xc2\x33\xc5\x73\xea\x8c\x5c\xf7\xe3\xfb\x57\xd0\x87"
+ "\x4b\x23\x58\x4e\x5d\x3a\x8f\xe5\xd4\x58\x33\xf6\x8b\x72\x7a\xb6"
+ "\x7c\x7c\xcf\x3f\xe7\x4b\xf7\x32\xf1\x3d\xf4\xcf\x3e\xbe\x8f\xcd"
+ "\x63\x38\x75\x9a\x94\x53\x97\x56\x31\x3a\x15\xee\x0b\x39\x75\xc7"
+ "\x69\xca\xa9\x9f\x9c\x96\x70\xea\xd8\x4f\x04\x4e\x5d\xee\x7f\x78"
+ "\x82\x94\x53\x97\x05\x59\x39\x95\xe7\xcb\x69\x46\x4d\x7c\xa8\x7d"
+ "\xdd\x09\x5f\xef\x83\xb5\x40\xd0\x36\xce\x15\xc3\x36\xf3\x4e\xeb"
+ "\x9c\xd7\x9b\x84\xca\xd7\x9b\x94\x45\xeb\x49\x71\x55\x2a\x5f\x67"
+ "\x92\x89\x75\x26\x89\xa4\x5b\x66\x23\x5d\x2b\x80\x5f\xe7\x50\x61"
+ "\x9d\x80\xa9\x93\x44\x9e\xc5\x9a\xac\xcd\x58\x93\x75\x9d\xd6\x00"
+ "\x81\xbf\xed\xd7\x06\xb0\xea\x26\xe0\x83\xbd\xa7\x6d\x79\x76\xf9"
+ "\x8e\x52\xc4\x4f\x98\xce\x26\xe6\xcf\xbe\x03\x62\xfe\x58\x0f\x96"
+ "\x5f\x63\x07\xb0\xfc\xba\xfc\xa2\xc8\xaf\xc2\xb9\x66\xd1\xae\xb8"
+ "\xbc\x7f\x4b\x68\xd7\x58\x22\xc6\xfc\xb1\xa7\x9a\xf8\xb5\x5c\xc2"
+ "\xaf\xa7\xa5\xfc\xba\xb4\x86\xe7\xd7\xd3\xb6\xfc\x0a\xc7\x79\x7e"
+ "\x5d\x5a\xd3\xc4\xaf\xe5\x36\x31\xff\x69\x5b\x7e\x8d\x3b\xc0\xf3"
+ "\x6b\x65\xb6\x8d\x76\xcd\x76\x1e\xf3\x57\xde\x69\x31\x7f\x5c\xa1"
+ "\xaa\x98\x1f\x39\x75\x2e\xe5\x54\xe4\x2c\x2b\xaf\x8a\x31\x7f\xb6"
+ "\x62\xcc\xef\x8c\x57\x55\x69\x55\x9e\x57\xe3\x0f\xb0\xbc\x1a\x7f"
+ "\x88\xe5\xd5\x77\x47\xd9\xf2\xaa\x3d\xa7\x26\x78\xcb\xf1\x29\x8d"
+ "\xf9\x93\x8c\xca\x5c\x9a\xd0\x5f\x3d\x97\x26\x4e\x67\xb9\x34\x21"
+ "\xfa\x3f\x97\x4b\x13\xaf\x31\x5c\xaa\x75\x91\x4b\x6f\x4b\x1e\x20"
+ "\x69\x0c\xcb\xa5\x49\x09\x2c\x97\x26\x0d\x14\xb9\x54\x38\xd7\x2c"
+ "\x5c\x9a\x34\xba\x65\xb8\x34\x69\xb4\xa8\x55\xdf\xed\xe5\x9c\x4b"
+ "\x13\x06\xc9\x73\x29\x1c\xe7\xb9\x34\x61\x90\xc8\xa5\xa7\x9c\x70"
+ "\xe9\x8a\xb6\x2a\xb8\x94\xcd\x03\xd8\x72\x69\x8b\xe7\x01\x56\xf8"
+ "\xaa\xca\x03\x58\xb9\x74\xbc\x7d\x1e\x00\xf9\x95\xcf\x03\x80\xbd"
+ "\xac\x1c\xc6\xe7\x01\x86\x53\x2e\x2b\x33\x25\x33\x79\x80\xe6\xe7"
+ "\xd6\x95\x5d\x8d\x4d\xf9\xd4\x24\xe0\xd6\x95\xdd\x78\x6e\x6d\xca"
+ "\xa7\x26\xef\xb5\xf6\x8b\xe6\x01\x52\x08\xed\x97\x4c\x1e\xe0\x79"
+ "\xbe\xbd\xb7\x99\x3c\x80\x84\x6b\xa1\xad\x08\x65\x9e\x5d\x99\xc1"
+ "\xe4\x01\xce\x89\x3c\x7b\x1d\x6b\xd4\x81\x07\x79\x9e\xed\x24\xe5"
+ "\xd9\xf7\x0e\xf3\x3c\xfb\xbc\x95\x67\x57\x56\xd6\xc3\xb3\x59\xaf"
+ "\x96\x67\x71\x1e\xc1\xe9\xf0\x96\xe1\xd9\x02\x15\x3c\x2b\xc9\x0d"
+ "\xec\x05\x7b\x34\xf1\x2c\x6f\xf7\x3f\xcf\x2a\x0d\x43\x9e\x0d\xb7"
+ "\xc9\x0d\x64\xcb\xe7\x06\x0e\xb5\x44\x6e\xe0\xcf\xfb\x59\xbe\xfd"
+ "\xb3\x81\xe5\xdb\x3f\x6f\x17\xf9\x56\x38\xd7\x2c\xb9\x81\x3f\xef"
+ "\x6b\x99\xdc\xc0\x9f\xf7\x89\x7c\x9b\xbc\xd1\x39\xdf\xae\xcc\x96"
+ "\xe7\x5b\x38\xce\xf3\xed\xca\x6c\x87\x7c\xfb\xbc\x94\x6f\x57\xad"
+ "\xb2\xf2\xad\x98\x1b\xc8\x16\x72\x03\xc9\xce\x73\x03\x95\x0a\xb9"
+ "\x81\x11\x2d\x9d\x1b\x58\x95\xac\x26\x37\xd0\xb0\x81\xd6\xed\x2f"
+ "\xc3\xba\xfd\xa9\xc0\xbf\xc1\x3f\x80\x0d\x9c\xd7\xed\x2f\xb7\xd6"
+ "\x9f\x86\x67\x08\x3c\x9b\x21\x9b\x1b\x38\x52\xad\x9c\x1b\x38\x72"
+ "\x4c\x5a\x7f\x9a\xb2\x92\x7d\x6f\x95\xb2\xca\xfa\xde\xea\xc8\x3f"
+ "\x91\x67\xd7\xae\xc7\xcf\x96\xb4\x84\x6c\xba\xde\xf6\xda\x54\xec"
+ "\xa7\x5c\x1d\xff\x97\x16\xe9\xbb\xac\x94\xf3\x4d\xb9\x82\x72\xe4"
+ "\xdb\x0c\x62\xe1\x74\xf7\xe0\x7a\xdf\x7c\xae\xe0\x35\xc4\xde\xda"
+ "\x61\x52\xde\xfd\xea\xa4\x94\x77\xdf\xd7\x5a\x79\xd7\x0c\xbc\xbb"
+ "\xff\x5c\x06\xcd\xbf\x4e\xa6\xb5\xa9\x3b\x27\x4b\x6a\x53\x7f\xf8"
+ "\x87\xc0\xbb\xab\xdb\x1e\xd6\xc3\xfd\x3b\xaa\x9f\x82\xef\xef\x3a"
+ "\xe9\x6a\x0d\x6a\x86\x6c\xed\x94\xc0\x4f\xb2\xf5\x53\xd0\x57\x6d"
+ "\x96\xf0\xac\x9a\xe1\x39\xcd\x92\xd4\x4f\x65\x2e\x85\xe7\x59\x98"
+ "\x57\xe2\xb0\x0e\x75\xb2\x58\x87\xca\xa5\xc5\x57\xe2\xf8\x66\x49"
+ "\x4f\xc8\x6e\xe4\x74\x9e\x9c\x5f\x7c\x25\xfe\xfe\x8d\x1b\x30\xee"
+ "\xbc\x10\xea\x49\xe3\xba\xf8\x42\xe0\x9e\x76\xd4\xee\xab\x47\x9a"
+ "\x61\xac\x31\xc3\x58\x63\x49\x8b\x2f\x34\xa1\x36\xd9\x10\x7f\x30"
+ "\x13\xe2\x3c\x53\x12\xbf\xff\xe0\x7d\x6b\x21\xd6\xdb\x8a\x71\xde"
+ "\x15\x78\x36\xe2\x83\x34\xd8\x1f\x2b\x8f\xb6\xaf\x86\xfb\xb8\xe2"
+ "\x58\xcb\x99\x7e\x15\x79\xb4\xf0\xe5\x23\xf0\x9b\x6b\x9e\x2d\x45"
+ "\xec\x86\x8a\x73\x0a\x78\xcd\xac\x50\x2b\x8b\x7d\xa1\x6b\x2c\x02"
+ "\x16\x9a\x21\x27\x21\xed\x0f\xcb\xeb\x6b\xd2\x59\x5e\x5f\x53\xc4"
+ "\xf2\xfa\x9a\x58\x91\xd7\x85\x73\xc0\xeb\xe0\x37\x5e\x47\xc3\xd8"
+ "\xe7\xa6\x8e\x5e\x93\x66\xe5\x75\x8b\xc0\xeb\x5b\x5c\xe0\x75\x87"
+ "\x3a\x5a\xc2\x4b\xca\xbc\xbe\x26\x4d\xcc\x49\xac\x7d\x5b\xb6\x46"
+ "\xf6\xa4\x94\xd7\xdf\x0f\xe0\x79\xfd\xa4\x2d\xaf\xc3\x71\x9e\xd7"
+ "\xdf\x0f\x50\x9c\x4f\x70\xd2\xf6\x7d\xda\xba\x10\x9e\xd7\x2b\x84"
+ "\x1a\xd9\x72\x15\xf3\x09\x2a\x28\xa7\x5b\xb9\x1c\xf3\x55\x2d\x9b"
+ "\x93\x58\x37\x41\x4d\x4e\x82\xe7\xf2\x1a\xca\xe5\xc8\x8d\x56\x3e"
+ "\x77\x65\x3e\x81\x33\x3e\xb7\xea\x66\xe4\x73\x25\xdd\xcc\xf2\x79"
+ "\x6a\x08\xcb\xe7\xa9\x93\x58\x3e\x4f\x0b\x61\xf9\x3c\x6d\x82\x2d"
+ "\x9f\xdb\x73\x79\xea\x0e\x39\x1e\x8f\x7a\x0d\x73\x14\x69\x5e\xca"
+ "\x1c\x9e\x7a\x4c\x3d\x87\xaf\x3f\xfa\x1f\xc7\xe1\x5a\x5b\x0e\xff"
+ "\xc0\x17\x39\xc8\xfc\x9e\x0d\x87\x47\x0a\x1c\x2e\xf0\xc8\xd6\x4b"
+ "\x82\x16\xb6\xe5\xf0\x1a\xb8\x0f\x27\xf1\xb8\xe9\x17\x5b\x0e\xff"
+ "\xd0\x83\xe1\x70\xad\x13\x0e\x8f\xa4\x79\x10\xa6\x2e\x57\x21\x17"
+ "\x02\xf7\xa1\xcd\x52\xd0\xe6\x56\x9b\x49\xfb\xc3\x72\xf8\x87\x93"
+ "\x58\x0e\xff\x70\x35\xcb\xe1\x1f\x0e\x13\x39\x5c\x38\xd7\x2c\xda"
+ "\xfc\xc3\xd0\x66\xd7\xe6\x56\x7c\x38\xe4\xf0\x0f\x43\x45\x6d\x9e"
+ "\x36\xd0\x39\x87\xa7\x56\xca\x73\x38\x1c\xe7\x39\x3c\xb5\x52\x71"
+ "\x9e\x83\x1d\x87\xa7\xfb\xab\xe0\x70\x36\x17\x62\xe5\x70\x21\x17"
+ "\xb2\x55\x92\x0b\x31\x27\xd1\x5c\x48\xd6\x25\x8a\x8d\x76\x1e\x14"
+ "\xa7\x80\x9f\x80\x2d\x1a\xc7\xb1\x5b\x96\x5b\x79\x90\x74\x3f\x35"
+ "\x79\x10\x9e\xbf\x71\x8e\xc3\x24\xe0\xed\x72\x17\xe7\x38\x8c\xb4"
+ "\xce\x71\x48\x55\x98\xe3\x20\xf0\xf9\xb4\x9b\xe0\x73\x7e\x8e\xc3"
+ "\x86\x9e\x6c\x8e\x79\x43\x2f\x6b\x8e\x99\xf2\xf9\xa6\xc1\x2c\x9f"
+ "\x6f\x1a\xd4\x34\xe7\x01\x38\xbf\x2c\xea\x03\xbb\x39\x0f\x4d\xdc"
+ "\xce\xe7\x41\x37\xac\x2a\x7c\xad\x8a\x34\xf1\x7b\x98\xc8\xef\x17"
+ "\x3c\x36\x5e\x64\xb8\xfd\x9c\x94\xdb\x37\xe4\x33\xdc\x7e\x3a\x83"
+ "\xad\x8f\x38\x17\x25\xe1\x76\xeb\x9c\x87\x8f\xf2\x0e\x57\x3a\xe1"
+ "\x76\xf8\xbe\xeb\x73\xc4\x9a\x97\xdb\xad\xf3\x1b\x64\xb9\x5d\x3a"
+ "\xbf\x41\x52\xff\x80\xdc\xce\xef\x93\xe1\x6f\xc3\xed\xcb\x74\x1a"
+ "\xf3\x37\xf0\x3c\x00\xaf\xe3\x33\x62\xe6\x80\xdb\x79\x7b\x7f\x54"
+ "\x2d\xe5\xf6\x1b\x49\x94\xdb\x37\x5f\xba\x79\x6e\x6f\xd2\xc3\x52"
+ "\x6e\x7f\x11\xb9\x3d\xe3\x3c\x9d\x7f\x91\xe0\xda\xfc\x0b\x9b\xfa"
+ "\x8c\xcd\x2e\xe4\x5f\x1c\x72\xbc\x4c\xbf\x58\x8e\xdf\xf8\x2c\xcb"
+ "\xf1\x1b\xa3\x58\x8e\xdf\xd8\x53\xe4\x78\xe1\x5c\xb3\xe8\xf4\x8d"
+ "\x43\x5a\x26\xff\xb2\x71\x88\xc8\xf1\x9b\x3a\x3b\x9f\x7b\xb1\xa1"
+ "\x40\xbe\x36\x03\x8e\xf3\x1c\xbf\xa1\xc0\xe1\xdc\x0b\x26\xdf\xbd"
+ "\xb9\x8d\xec\xdc\x8b\xf2\xdb\x57\x9b\x21\xc5\x8a\x6d\xfe\xc5\xfd"
+ "\xdc\xf7\x66\x1f\xb5\xf9\x17\x9c\x7b\xb1\xec\xb8\x64\xee\x45\xa5"
+ "\xf3\xb9\x17\xcb\x43\x5c\xcc\xbf\x38\xa8\xcd\x38\x12\x2c\xad\x77"
+ "\xcb\xf4\x66\xf9\x3d\xb3\x4d\x13\xbf\xbf\x82\xfc\x9e\xdd\x95\xe5"
+ "\xf7\xec\x2e\xd8\x4f\xb9\xb9\x18\x5f\x32\xef\x15\x33\x67\xb1\xb5"
+ "\x1a\x36\xf9\x97\x57\x10\x7b\x5b\x4b\x18\x7e\x3f\x2d\xe5\xf7\xcc"
+ "\x54\x39\xed\x8e\x79\x6f\xbe\xa6\x78\x9a\x64\x4e\xdb\x58\x6b\xfd"
+ "\x5b\xd6\xc6\xc3\xa1\x70\xff\x7a\x85\x5a\xb7\x69\xb4\xd6\x8d\xaf"
+ "\x6d\xc3\x3c\x38\xb4\xf5\xd9\xb4\x28\x4d\x5c\x38\x67\xc1\x5a\x37"
+ "\xdb\x3a\x37\xac\x7d\xc3\x5a\xb7\x12\x5d\xaa\x62\x9d\x1b\x62\x53"
+ "\xa9\xd6\x0d\xfa\xed\xc7\x73\xfd\x59\x81\xeb\x85\x5a\xb7\xcc\xc5"
+ "\x62\xad\x1b\xc3\xf5\x32\xf5\xc3\x7b\x4f\x27\xc8\xeb\xf8\x78\x91"
+ "\xeb\x1b\x51\xc7\xff\xd1\x26\x17\xc3\xfb\x20\xeb\xd8\x6d\xcd\xc5"
+ "\xf0\x5c\xbf\xe5\x70\x29\xe2\x38\x2c\x4a\x26\x17\x63\x5f\xe3\x7c"
+ "\xfb\x72\x31\x5b\xbb\xb1\x1c\xbf\x75\x02\xcb\xf1\x5b\xdb\x88\x1c"
+ "\x2f\x9c\x6b\x16\x8e\xdf\x1a\xd8\x32\xb9\x98\xad\x81\x62\x2e\x66"
+ "\xab\x59\xb6\xfe\x8e\xc9\xb1\x67\x66\xc8\xe7\xd8\x33\x85\xfa\xbb"
+ "\xcc\x0c\xc5\x39\x21\x76\xef\x34\xb3\xcf\xd2\x1c\xbb\x1b\x73\x42"
+ "\x2a\xef\xb4\x5c\x4c\xb6\x5e\x6d\x2e\x86\xaf\x6d\x3e\x8e\xf5\x21"
+ "\xea\xe6\x84\x38\xe3\xf6\x26\xed\xee\xe0\x1d\x26\xcb\xed\xdb\xce"
+ "\xb2\xdc\xbe\xed\x3c\xcb\xed\xdb\x2f\xb3\xdc\xbe\xbd\xc6\x96\xdb"
+ "\xed\x79\xfd\xe3\x81\x72\x9c\x1e\xf5\x0a\xe6\x62\xb6\x67\x2a\xf3"
+ "\xf9\xc7\xe1\xea\xf9\xfc\x7f\x22\xfe\xa3\xf9\x5c\x6b\xcb\xe7\xff"
+ "\x93\x73\x5b\xf3\x32\x3c\x9f\xe7\x6c\x64\xf8\x5c\xeb\x84\xcf\x6f"
+ "\x5b\x5e\x26\xe7\x37\x96\xcf\xb7\xf7\x60\xf9\x3c\xe7\x84\xc8\xe7"
+ "\xc2\xb9\x66\xc9\xcb\xe4\x18\x5a\x26\x2f\x93\x63\x10\x35\xfb\xf6"
+ "\x12\xe7\x7c\xfe\xb1\x4e\x9e\xcf\xe1\x38\xcf\xe7\x1f\xeb\x14\xeb"
+ "\xa9\xed\xf8\xfc\x2f\x79\x2a\xf8\x5c\xb6\x46\xe5\xce\xc8\xcb\xfc"
+ "\x65\xa7\xda\xbc\x8c\xd2\x3c\x15\xe4\x77\xb1\x3e\x45\x32\x4f\x65"
+ "\xa8\x75\x9e\x4a\x02\x5b\x9f\xd2\xec\xdc\xfe\xbf\xfb\x59\x6e\xff"
+ "\xdf\x03\x2c\xb7\x7f\x7a\x8a\xe5\xf6\x4f\x2b\xad\xfd\xa4\x79\x99"
+ "\x24\xbb\x79\x2b\x2c\xcf\xe7\x76\x2b\x7c\xa5\x8a\xc8\x71\x3d\xb4"
+ "\xb5\x46\x99\xe7\x73\x47\x2a\xf1\x3c\xd6\xab\x7c\x3a\x4d\x27\xc3"
+ "\xf3\x3b\xc6\xff\xff\xc0\xf3\x4a\x75\x28\x7c\x1c\x04\x1c\x8f\x7c"
+ "\xcf\xf3\xbb\xc0\xf5\xc8\xf3\xe6\xbf\xcb\xe5\x68\x76\xac\xbe\x55"
+ "\x3c\xaf\x9c\xa3\xf9\x64\x55\x69\x98\xc0\xf3\xae\xcc\xa1\x39\xc0"
+ "\xe6\x68\x32\x23\x6f\x75\x8e\xe6\x93\xb3\x2c\xdf\x7f\xea\xc7\xf2"
+ "\xfd\x27\x87\x45\xbe\x17\xce\x35\x8b\x7e\xff\x44\xdf\x32\x39\x9a"
+ "\x4f\xf4\x22\xdf\x7f\xba\xdf\x39\xdf\xe7\x06\xcb\xf3\x7d\xae\xb0"
+ "\x36\x5b\x6e\xb0\xeb\x7c\xbf\xb3\x89\xef\xed\xe7\xcf\x24\xb8\x5f"
+ "\x23\x33\xac\xa5\x73\x34\x3b\x15\xf9\xdf\xd1\xfa\x18\xee\xe7\x68"
+ "\x84\x39\x89\x33\xe4\xd7\xc7\x38\xec\xa0\x46\xe6\x70\xb1\x94\xeb"
+ "\xf3\x76\xb0\xb5\x88\x79\x79\xd6\x5a\xc4\xc3\xa5\xc8\xf5\x9f\x1f"
+ "\x67\xb9\xfe\xf3\x63\x4a\x39\x9a\xbd\x16\x69\x4d\xe2\xae\x36\x6c"
+ "\x8e\x26\x9b\xcd\xd1\x8c\x45\xec\x7d\xbe\x52\x99\xeb\x77\x0d\x60"
+ "\x6b\xc0\xe9\x1c\xc5\x1d\xd3\x84\x1a\xf0\x69\x92\x1a\xf0\x97\x3f"
+ "\x16\xb8\xfe\xb3\xf1\x45\xe5\x26\xa2\xa6\x0e\xf1\xe6\x6b\xbd\x93"
+ "\x65\x6b\x10\xf9\x31\xc0\x41\x1d\xe2\xeb\x27\xb4\x58\xd3\x1c\xb4"
+ "\x65\xb1\xa4\x0e\xd1\xc1\x7a\xc6\x0c\xff\x4f\x8b\x52\xe4\xff\x06"
+ "\x4e\xe4\x7f\xcb\xd3\x62\xde\xc6\x82\x3a\x9f\xf7\xcb\x67\xab\x6f"
+ "\x55\xde\x46\x2e\x4f\x52\xf8\x3c\xf2\x7f\x7e\x22\xd5\xf9\xba\x3b"
+ "\x2c\x6f\x93\x7f\x82\xe5\xfd\xcf\x7d\x59\xde\xcf\x3f\x20\xf2\xbe"
+ "\x70\xae\x59\x6a\xd1\xf3\x2b\x5a\x46\xe7\xe7\x57\x88\x79\x9b\xcf"
+ "\xf7\x38\xe7\xfd\x5d\x43\xe4\x79\x7f\xd7\x10\xca\xfb\xbb\x86\x38"
+ "\xcc\xdb\x30\xb5\x91\x7f\xdd\x78\xd3\x79\x1b\xab\xce\x6f\xf1\x79"
+ "\x3d\x7f\xcd\x50\x93\xb7\x69\x9a\x93\x7e\x53\x79\x1b\x79\xbe\xb7"
+ "\x6a\xfb\xc3\x0e\xde\xb9\xb2\x7c\xff\x7f\x1b\x59\xbe\xff\xbf\x2c"
+ "\x96\xef\xbf\xd8\xcb\xf2\xfd\x17\x05\x72\x79\x1b\x96\xeb\xff\xef"
+ "\xb2\x1c\xcf\x47\x8d\xc5\xbc\xcd\x17\x3a\x65\x8e\xdf\x1d\xa0\x9e"
+ "\xe3\xf7\x0c\xbc\xcb\xf1\x36\x1c\xaf\xb5\xe5\xf8\x3d\x51\xb7\x55"
+ "\xe3\xf3\x1c\xff\xb7\x59\x0c\xc7\x37\x63\x2e\xc7\x95\xf9\x24\xca"
+ "\xda\xfe\x6f\x36\xf5\xef\x7f\xb3\xa9\x7f\xff\x9b\xa4\xfe\xfd\x6f"
+ "\x86\xe6\xe3\xf8\xbf\x35\x7f\xfd\xbb\x4b\x1c\xff\x37\x49\xfd\xfb"
+ "\x17\x1b\x9d\x73\xfc\xee\x40\x79\x8e\x87\xe3\x3c\xc7\xef\x0e\x74"
+ "\xa8\xed\x19\x8e\x2f\x88\xbd\x15\xb9\x9c\x96\x99\x6f\x54\xb0\x5c"
+ "\x4d\x3e\xc7\xd1\xba\x23\x8a\xf9\x9c\x41\xd6\x7c\x4e\x94\x42\x3e"
+ "\xa7\xb9\x38\x7f\xef\x1a\x96\xf3\xf7\xae\x67\x39\x7f\xff\x01\x96"
+ "\xf3\xf7\x17\xb2\xf9\x9c\x05\x76\xf9\x1c\x96\xff\xf7\xfe\x56\x38"
+ "\x56\x9a\xcf\xc9\x96\xe4\x73\xf6\xbf\xad\xcc\xff\x5f\x2a\xf2\xff"
+ "\x75\x9e\xff\xc3\x65\xf8\xff\xef\xff\x21\xfc\x1f\x7e\x13\xfc\xff"
+ "\xf7\x16\xe0\xff\x7d\xf3\x68\x8e\xc7\xc5\x75\x52\xf6\xaa\xcf\xf1"
+ "\xdc\xdc\x38\xb0\xef\x10\x3b\x0e\xec\x33\xb2\xe3\xc0\xbe\x3c\x71"
+ "\x1c\x10\xce\x35\xcb\x38\xb0\xef\x60\xcb\x8c\x03\xfb\x0e\x8a\xe3"
+ "\xc0\xfe\x6d\xce\xc7\x81\x2f\x15\xc6\x81\x2f\x85\x71\xe0\x4b\x15"
+ "\xe3\xc0\x57\xeb\x95\x73\x3c\x51\xee\xe7\x78\x06\xb7\xf4\x3c\xa8"
+ "\xaf\x52\x55\xe5\x78\x36\x24\x26\x14\xe3\x1a\x29\x67\x89\x66\xd9"
+ "\x74\x6b\x8e\xa7\xd0\x26\xc7\x53\x68\x97\xe3\x59\x72\x56\xe0\xff"
+ "\xd1\xc2\x7c\xd3\xb1\x37\xb1\x46\x0a\xbf\x97\xf4\xd7\x6b\xd8\xba"
+ "\xf9\xaf\x79\xfe\x17\xd7\xef\xfb\xa6\x2b\xf6\x8b\x8e\x3f\x85\x0e"
+ "\xd6\x40\xfd\xfa\x14\x93\xd3\x19\x2d\xb7\x46\xca\x3f\x98\xba\x1b"
+ "\x76\xbe\x69\xa1\x0f\xc3\xf7\x63\xe9\x7c\xd3\x4f\xe4\xde\xd3\x36"
+ "\xad\xc9\x7f\xa0\x33\xbf\x26\x7f\xd3\x5a\x7e\x85\xa3\x5d\x5a\x4b"
+ "\x7a\x9a\xb0\x96\xf4\xe9\x16\x58\x4b\xda\xd5\x35\xf9\x4f\xdb\xae"
+ "\xdf\x77\x60\x4f\x59\x71\x21\x29\x45\x8c\x84\xd9\xae\x7d\x5a\x28"
+ "\x3f\x77\x5f\x23\xcc\xdd\x9f\x7f\x6b\xd6\x41\xc1\xfe\xf0\x63\x7e"
+ "\xc7\xef\xb2\xf3\xe2\x0c\x7c\x7f\x70\xdf\x6e\xf0\xf3\xe0\x62\xc0"
+ "\xaa\x05\xf9\x74\x01\xf2\xe9\x3f\xe6\xf2\xd7\x9e\x05\x2c\x74\x9c"
+ "\xe0\x83\x38\x5e\x6b\x21\xbe\x51\x8b\x91\x5b\xff\xc1\xd7\x7d\x81"
+ "\x8c\x00\x6e\xa5\xd7\xc5\x9e\xe5\xcc\xe6\x8e\x61\xf8\x2c\xde\xbb"
+ "\x6b\x7e\xb9\x77\xa9\xbe\x0e\x9e\x8b\x4b\xfc\x3e\xae\x65\xa6\xfa"
+ "\x42\xf4\xc5\x57\xf3\xcb\xbd\x38\xe0\xdf\xad\xb3\x89\x8f\xba\xe7"
+ "\xf4\x1f\xfc\x3e\xf5\xfc\xdc\xf5\x8e\xdf\xed\xc4\x75\x40\xac\xda"
+ "\xca\xf2\xab\x98\xdf\xca\x02\xfb\x58\x38\x3a\xf6\xbd\x1e\x41\x79"
+ "\x03\x7e\x2f\x08\x6c\xc9\xd7\xd8\x22\x6f\xf0\x7b\x58\x01\x6f\x6c"
+ "\xa9\x15\xdf\x63\x63\xfb\x68\x23\x9a\x47\xf9\x87\x58\xff\xa2\x57"
+ "\xe2\xd6\x42\xad\x3c\xb7\x16\x6a\x29\xb7\x16\x6a\x9b\xb8\x55\x2f"
+ "\x93\x47\x61\xea\xd8\xbf\x11\xea\x5f\x0a\x6d\x34\x76\x61\x2b\x5c"
+ "\x1f\xe5\x1b\x55\xf5\x2f\x3c\x9f\xce\xa5\x7c\x8a\x7c\x65\xe5\x54"
+ "\x31\x8f\x52\xa8\x98\x47\x71\xc6\xa9\xaa\xe6\xf0\xf3\x9c\x7a\xf0"
+ "\x2c\xcb\xa9\x07\xcf\xb3\x9c\x5a\x34\xcb\x96\x53\xed\xf9\xf4\x50"
+ "\x4f\x39\x2e\xa5\xeb\xa3\x14\xf9\x29\xf3\xe8\xa1\x60\x25\x1e\xe5"
+ "\xeb\xd3\xa7\x49\xea\xd3\x9b\x78\xf4\xdb\xe9\x2c\x8f\x1e\x4a\x73"
+ "\x95\x47\xf9\xbd\x4d\x4e\xdf\x86\xbd\x4d\xdc\xe6\xd1\x28\x1b\x1e"
+ "\xfd\xd6\x2c\xf2\xa8\xed\xfe\x26\x4e\x78\x34\xf2\xd6\xac\x81\xc2"
+ "\xf0\xa8\xc5\xc0\xf7\x27\x70\x3e\xf6\xf5\xbb\x44\x96\x47\xbf\xdb"
+ "\xad\xcc\xa3\xdf\x8d\x17\x79\x94\x5e\x77\x6b\x79\xf4\xbb\x04\x86"
+ "\x47\x23\x25\x3c\xfa\x8b\x18\x43\x60\x8d\x45\x13\x8f\xce\x93\xf0"
+ "\x68\xa4\x33\x1e\xfd\x2e\x01\x6d\x44\x35\x6a\xd1\x08\xe7\x3c\x7a"
+ "\x28\x54\x9e\x47\xe1\x38\xcf\xa3\x87\x42\x45\x1e\x95\xd1\xa8\x0c"
+ "\x8f\x1e\xee\xa5\x82\x47\xef\xf0\xb5\x51\x0e\x07\xa9\xca\x55\x88"
+ "\x73\x3a\xed\xd7\x48\x9d\x2a\x9d\x13\x54\x60\xb3\xef\x49\x81\xdd"
+ "\xbe\x27\x4b\xac\x73\x3c\x47\x0a\xbc\xfa\xf2\x4d\xf0\x2a\x3f\xc7"
+ "\xf3\xc8\x60\xb6\xf6\xe4\xc8\xb3\xd6\xda\x13\xca\xab\x25\x47\xad"
+ "\xfd\x12\xf7\x3d\x29\x70\xb0\x46\xea\x91\x35\xcc\xda\x28\x23\xa5"
+ "\x6b\xa3\x94\x24\x2a\xaf\x91\x7a\x64\x37\xb3\x36\xca\x91\xdc\xa6"
+ "\x7d\x4f\x6c\xd7\x48\x15\x39\xf6\xfb\x43\x3c\xc7\x36\xad\x41\x75"
+ "\xc4\xd8\xb4\x46\xaa\x93\x79\x41\xd8\xce\xae\x73\xba\x5b\xcf\xb1"
+ "\x85\x2a\x38\x96\xd9\xf7\xc4\x76\x8d\xa9\xe2\x88\xb2\xa2\x02\x52"
+ "\x1a\x5e\x20\xb3\x36\x6a\x41\x8b\xee\x7d\x82\xfd\x92\xe7\xda\xe2"
+ "\xcb\x2c\xd7\x96\x04\xf2\xd7\x9e\x92\xe3\xda\xe2\xfd\x22\xd7\xd2"
+ "\xeb\x62\x4f\xd9\x70\x6d\xa5\x02\xd7\xc2\xb8\xba\xf5\x82\x5a\xae"
+ "\x2d\xae\xe1\xb9\x36\x49\xe0\xda\x4b\xcd\xcd\xb5\xc5\x35\x22\xd7"
+ "\x96\x7c\xee\x7c\x8f\xa9\x23\xfb\xe4\xe7\xe5\x1c\xd9\x47\xb9\xf6"
+ "\xc8\x3e\x87\x7b\x4c\x31\x35\x1f\xa5\xdb\xac\x7b\x4c\x89\xf9\x80"
+ "\x02\x21\x1f\xd0\x9a\xf7\x44\x29\xcd\x56\x9b\x0f\xf8\x1e\x62\x77"
+ "\x9c\x77\xb9\x0c\xf7\x9c\x0a\xc3\x3d\x51\xf2\x6d\xf2\x01\xf9\xf6"
+ "\xf9\x80\x49\x8e\x39\x56\x55\x3e\x80\x9f\x77\x59\x96\xc5\x72\x6c"
+ "\xd9\x36\x96\x63\x7f\x1c\x6c\x9d\x67\x89\xfd\x51\x5e\x33\xb5\xec"
+ "\x72\x53\x3e\xa0\x92\xe5\x56\x31\x1f\xf0\xc3\x45\x65\x8e\x2d\x67"
+ "\xf3\xbf\x2f\xe7\x32\xf3\x2c\x3f\x39\x27\x5d\x87\xda\xba\xfe\xd4"
+ "\xd1\x81\x87\x8f\x49\x39\xb6\x3c\xac\x35\xad\x43\xdd\xb4\xd6\x94"
+ "\x93\x5a\x6e\xfb\x75\xa8\x8f\x1e\x2d\x2b\xca\x27\x38\xb7\x8d\xe7"
+ "\x5b\x26\x37\x90\xdf\x32\xb9\x81\xa2\x7c\x85\xdc\xc0\x0f\x21\x2c"
+ "\xcf\xfe\x90\xcc\x5f\x7b\x42\x8e\x67\x7f\xe8\x29\xf2\x2c\xbd\x2e"
+ "\xf6\x84\x0d\xcf\x56\x34\xa7\xa6\xfd\x61\xc2\xad\xcd\x0d\xfc\x30"
+ "\x41\xcc\x0d\xfc\xe8\xc2\xfc\xc7\xf2\x40\x79\x9e\x2d\x17\xf2\xae"
+ "\xe5\x62\xde\xb5\x42\x66\xbf\x14\x86\x67\x7f\x34\x5b\xe7\x3f\xf2"
+ "\x9a\xb6\xd2\xaa\x69\xf3\x5b\xe1\x7e\x29\x3f\x9a\xd4\xe6\x06\x70"
+ "\x9e\x3b\x72\x2b\x72\x97\x95\x5f\xc5\xdc\x40\xbe\x72\x6e\xc0\x09"
+ "\xbf\xaa\xdf\xbb\xef\x98\x99\xe5\xd7\xe3\x1e\x2c\xbf\x56\xac\xb1"
+ "\xe5\x57\x7b\x6e\x3d\x3e\x4c\x8e\x57\x69\x6e\xa0\x62\x88\x32\xa7"
+ "\x1e\x9f\xab\xc4\xa9\xfc\x9a\x7e\xe7\xc4\x1a\x69\x91\x53\xff\xb9"
+ "\x8a\xe5\xd4\xe3\xf9\xae\x72\x6a\x8b\xec\x97\xe2\x36\xa7\xea\x6c"
+ "\x38\xf5\xa7\x9e\x22\xa7\xda\xee\x99\xe2\x84\x53\x6f\x55\x9e\x40"
+ "\xca\xa9\x8c\x76\xfd\x69\x07\xcb\xa9\x3f\x55\x2a\x73\xea\x4f\x4b"
+ "\x44\x4e\xa5\xd7\xdd\x5a\x4e\xfd\x29\xf7\xd6\xe6\x09\x7e\xca\x15"
+ "\xb5\x6b\xc5\x3c\xe7\x9c\x7a\x3c\x5a\x9e\x53\x8f\x47\x53\x4e\x3d"
+ "\x1e\xed\xfa\x9c\xf2\x13\xe3\x55\x70\xea\x1d\xbe\x97\xca\x89\x60"
+ "\xd5\x79\x02\xcc\xb7\x22\x97\x56\xde\xdc\xda\x21\x31\xd6\xb5\x43"
+ "\x86\x0b\x1c\xfb\xe2\xcd\x72\xec\xc9\xe9\x6c\x4d\xc3\xc9\x59\xd6"
+ "\x9a\x06\xca\xb1\xa7\xbd\xd9\xfd\x51\xed\xd7\x0a\x61\xd7\x50\x3d"
+ "\xb9\xa7\x29\x4f\x80\x9c\x3b\x5c\x9a\x27\x38\xb5\x47\x99\x6f\x4f"
+ "\x56\x32\x79\x82\x6f\xe5\xf9\xf6\x3a\xc3\xb7\xff\x6a\xe0\xf9\xb6"
+ "\x69\x0d\xd5\x7f\x05\x5a\xd7\x50\x75\xaa\x61\x19\xbe\x0d\xbf\x3d"
+ "\x7c\x5b\xe0\x3a\xdf\xb2\x7b\xa9\xd8\xae\x97\x5a\x99\x55\x76\x10"
+ "\xf8\x96\x5f\xaf\xc3\x76\xcd\x54\xd7\xd6\xeb\xb8\x55\x6b\xa6\x62"
+ "\xbf\xe4\x79\xf7\x54\x37\x96\x77\x4f\x4d\xe0\xaf\x95\xe5\xdd\xca"
+ "\xdf\x44\xde\xa5\xd7\xb9\xcc\xbb\x6e\xe5\x0c\x4e\x05\xde\xda\x9c"
+ "\xc1\xa9\x40\x91\x77\x4f\x9d\x77\xce\xbb\x27\xab\xe4\x79\xf7\x64"
+ "\x15\xe5\xdd\x93\x55\x0e\x79\x97\xa9\x21\x38\x7d\x5c\x76\x2d\x8f"
+ "\xca\xd6\xbe\xcf\xca\xe9\x63\xee\xe4\x0c\x80\x83\x35\xcb\x71\x0d"
+ "\xa7\x70\xac\x21\x70\x9e\x33\x70\xc6\xb7\xea\x73\x06\x67\x8e\xb2"
+ "\x7c\x7b\xe6\x38\xcb\xb7\x3f\x27\x62\xbf\x1c\xe6\x0c\x78\x0e\xd0"
+ "\x77\x6b\xca\x19\xe8\x59\x9e\x15\x73\x06\x3f\x3f\xa1\xfc\xee\x4b"
+ "\x3f\x9a\xd1\xb7\x2f\xda\xac\x59\x3d\x4d\xe4\xdb\x23\xa5\xd6\x9a"
+ "\xb1\xb3\xb1\x87\x83\xa5\x7c\xab\x4f\xb5\x5b\xb3\x7a\x42\x33\xae"
+ "\x59\x3d\xa1\x99\xd7\xac\x0e\x61\xd7\xac\xde\x74\x5d\xac\x23\x53"
+ "\xbf\x66\xf5\xb9\xce\x3c\x07\x23\x86\x70\xdd\x6a\x57\xf2\x08\xb7"
+ "\x78\xaf\x15\x86\x7b\x99\x3c\xc2\xb9\x2c\x96\x7b\xcf\x95\x2b\x73"
+ "\xef\xb9\x79\x22\xf7\xd2\xeb\x6e\xad\xe6\x3d\x97\x79\x6b\xf3\x08"
+ "\xe7\x32\xc5\x3c\xc2\xcf\xd3\x65\xb9\x97\x79\x37\xa6\x9f\x20\xff"
+ "\x6e\x0c\x8e\xf3\xdc\xab\x9f\xa0\x98\x47\xb0\xab\xdf\xaa\x1a\x41"
+ "\xdf\x8d\x09\x9a\x57\xaf\x22\x8f\x70\xc7\xd5\x18\x54\x0d\x77\x27"
+ "\x8f\x80\x7c\x8b\x7c\x66\xe5\x5c\x57\xf2\x08\xcd\xaf\x71\xcf\x8f"
+ "\x60\x39\xf7\xfc\x28\x96\x73\xab\x2f\xda\x72\xae\x3d\xdf\x9e\x5f"
+ "\x25\xc7\xb5\x34\x8f\x50\x9d\xa1\xcc\xb3\xe7\x77\x2b\xf2\xac\x4d"
+ "\x6d\xae\xc8\xb3\x17\xce\xb3\x3c\x7b\xde\xe8\x16\xcf\xba\xba\x07"
+ "\xcb\x1d\xc5\xb3\xe1\x36\x3c\xfb\xef\x44\x91\x67\x6d\xf7\x61\x71"
+ "\xc2\xb3\xb7\x68\x1f\x16\x65\x8d\x5b\xed\xcd\xf2\x6c\xf5\x20\x65"
+ "\x9e\xfd\xf7\x71\x91\x67\xe9\x75\xb7\x96\x67\xab\xbd\x6e\x6d\x6e"
+ "\xa1\xda\x4b\xd4\xb8\xd5\x87\x9d\xf3\xec\xf9\x7d\xf2\x3c\x7b\x5e"
+ "\x78\x2f\x76\x7e\x9f\xa2\xc6\xb5\xe3\xd9\x8b\x79\x2a\x78\xf6\x0e"
+ "\xaf\x41\xb8\xa8\x6a\xfd\x0b\x49\xbe\xf6\x9e\x32\xbd\xcd\x7c\x89"
+ "\x13\xd2\xf9\x12\x92\xdc\xc2\x70\x6b\x6e\x81\xdd\x9f\x25\xc6\x9a"
+ "\xbf\x1d\x2a\xf0\xee\xf3\x37\xcb\xbb\x97\xf6\xd7\x37\xf1\xee\x02"
+ "\xe0\xdd\x4b\xfc\xfc\x88\xfa\x26\xde\xbd\xb2\xc8\xda\x2f\x71\x7f"
+ "\x16\x85\xdc\xc2\x33\xd8\xde\x2f\x1d\x9a\x72\x0b\xc8\xc3\x43\xa5"
+ "\xb9\x85\x2b\x3d\x95\x39\xf8\x97\x41\x4c\x6e\xe1\x1f\xf2\x1c\x5c"
+ "\xc7\x70\x70\x4d\x04\xcf\xc1\xcf\x58\x39\xf8\x97\xe5\xd7\x21\xb6"
+ "\xbc\xfe\x9e\x3a\x0e\xae\xe3\x39\x78\x64\xcb\x70\xf0\xee\x66\xe0"
+ "\x60\xde\xee\x97\xdb\x96\x15\x02\x07\x87\x21\x07\x8f\x74\x2d\xdf"
+ "\x70\x9b\xf6\x68\xc1\x7e\xc9\x73\xf1\xe5\xf5\x2c\x17\x5f\x3e\xc8"
+ "\x5f\x2b\xcb\xc5\x97\xa7\x8b\x5c\x4c\xaf\xbb\xb5\xf9\x86\xcb\xa9"
+ "\xb7\x36\xdf\x70\x39\x55\xe4\xe2\x2b\x21\xce\xb9\xf8\x97\xa1\xf2"
+ "\x5c\x0c\xc7\x79\x2e\xfe\x65\xa8\x43\x2e\x7e\x46\xca\xc5\xbf\x36"
+ "\x69\x5e\x26\xdf\xa0\x6f\xed\x7b\xb7\xfc\xaa\xa8\x7f\x03\x1f\x26"
+ "\x09\xe7\x3c\x7e\xcd\x2a\x83\x48\xe6\x6a\x12\x49\x28\x33\x3d\x43"
+ "\xe0\x18\xd8\xef\xd7\x43\x65\x01\x83\x88\xe5\x83\x39\x41\xc8\xc7"
+ "\x1f\xe2\x1f\x68\xdc\x54\x8d\xf0\x6c\xf1\x36\xfe\x95\xaf\x77\xc5"
+ "\xe3\xc8\xbd\x5b\x25\xe7\xe5\x7e\x8b\x4b\x9d\x9d\x4b\xbf\x67\x08"
+ "\xa4\xf3\x6e\x66\xef\xb4\x7e\x46\x6c\xea\x3d\x0c\x3d\xb8\xf5\xb3"
+ "\x73\x0c\x1d\x66\xe7\xc8\x7d\xbf\xbb\x96\xf8\xb4\x4b\xe4\xb8\x2d"
+ "\x1b\xb8\xba\xab\xbf\x9f\x1c\x75\x35\x85\x90\xd4\x0d\x9c\xa1\xfe"
+ "\x3d\x43\x18\xdc\xe3\x8a\x8f\xe0\xba\xab\x1d\x4f\x47\x5d\x4d\x0a"
+ "\x26\x70\x2c\xca\x7a\x0c\xec\x46\x2c\x49\x9e\x9c\x05\xce\x71\x1b"
+ "\xfa\x86\x6d\x8d\x03\xae\x5a\x4e\x48\xdf\xeb\xf8\xcc\x18\x12\x00"
+ "\x33\x7e\x6b\xa1\xcd\x75\xd0\x16\xf7\xc0\x43\x75\x80\x47\xaf\xd2"
+ "\x15\x04\x9f\xe9\x64\xb8\xaf\xec\xb5\x68\x7b\xcf\xc7\x32\x38\x8d"
+ "\x17\xb1\x6c\x9f\x54\xc4\xf9\x27\x25\x80\x3f\x48\xea\x02\xc2\xaf"
+ "\xc9\xba\x0e\xae\xe3\x34\xf1\x9c\xa5\x67\x68\x70\x99\xa9\x8e\x3e"
+ "\xd3\xd0\xbf\xaf\x20\x8e\xe5\xe0\x77\xb7\x2c\x20\x5a\xf8\xf3\xe5"
+ "\xd2\x93\x12\xea\xdf\xfb\x0d\xfd\x61\xc0\x7e\x29\xdd\xe3\xba\x4d"
+ "\x30\xee\x3c\x14\x80\x63\x07\xff\xfb\xf8\xdb\xfc\xef\x68\x2c\xc9"
+ "\x66\x38\xce\x25\xc5\x73\x65\x31\x26\xd2\x1e\x6c\xb1\x15\xfa\x8d"
+ "\x78\xb4\xfc\x65\x72\xd4\xbb\x0f\x12\xb2\x6b\x69\xb5\xa6\x0c\xfa"
+ "\x6e\xfe\xe8\xa1\xba\xc2\xb8\x27\x09\x9c\x37\x60\xcc\x72\xc1\xa3"
+ "\xd6\x7b\xdc\x45\x42\x90\x4f\xe0\xff\x1d\xea\x60\x1c\x1b\x03\x9f"
+ "\xd7\xc1\x7d\x58\xae\x06\x78\xe1\xb5\x17\x3c\x7e\xdb\x5f\xb8\xf8"
+ "\x24\x69\x1f\x45\x7c\xd6\xc2\xbd\xd1\x6b\x7f\x5b\x8d\xd7\xea\x3d"
+ "\x6a\xb5\xd8\x07\xf8\x9c\x0d\x9f\xf1\x7b\x58\x43\x46\xb8\x9c\x49"
+ "\x45\x3c\x36\xd3\x92\x12\x2c\x3d\x27\x15\xf1\xdc\x07\xf7\xb9\x0e"
+ "\xee\x19\xae\xf1\x85\x6b\x7c\xf9\x7f\xe3\x88\x36\x0d\x8e\x61\x3b"
+ "\xf0\xaf\x6f\xe1\xfc\x46\x6c\x7b\x39\xb6\xad\x60\x07\x2f\xce\x2f"
+ "\x29\x81\x03\x6c\xe3\x98\x1a\x18\xe7\x71\xf4\x9c\x47\x6d\x7e\x7b"
+ "\x0f\x8e\xe3\x72\x42\x83\xdf\x8d\x23\xbe\xa9\x16\x42\x0a\x1f\xc4"
+ "\x76\x6a\x57\x41\xfb\x5e\x68\x8b\xfa\xf7\x6a\x75\x7a\x8f\xdf\xfc"
+ "\xd0\xbe\xe0\xcf\xba\xc0\xee\xfc\xfd\x16\xe2\xef\xe0\x77\x84\xeb"
+ "\xf9\xb5\xef\xb1\xcf\x81\x71\x9e\x1c\x7c\xde\xe1\xe9\x71\x96\x78"
+ "\x06\xb4\xed\x01\xdf\xcf\xd5\x93\x9d\xc7\xf0\xfb\x7a\xfa\x3d\xc0"
+ "\x52\xed\x3e\xc0\x66\x7f\x3c\x86\x9f\x15\xfa\xeb\x6b\xf5\x5b\x49"
+ "\x00\x60\xc3\xd6\x77\x56\x8c\x00\x2e\xac\x18\xc1\xfe\x7e\x16\xa7"
+ "\xd7\xf0\xe3\xb0\xc7\x55\x3e\xae\x5b\x0b\x3e\x34\x6f\x0e\xf0\x5a"
+ "\x07\xb6\xb5\xdc\x40\xbf\x9c\x83\x73\x75\x1e\xe8\x97\x75\x4b\xc1"
+ "\x27\xf4\xda\x1e\x62\xff\xf1\x73\x1d\xef\x4f\x0b\xf8\x82\xce\xdd"
+ "\xbc\x7a\x1c\xef\x67\xdd\x75\xf0\x63\x27\xae\xee\x60\x0c\xf4\x0b"
+ "\x71\x0b\x18\xd9\xb5\xc0\xa8\xc1\xba\x3e\x3c\xfe\x55\xad\x51\xb3"
+ "\xee\x12\x41\x5d\x49\xd6\x00\x2f\x67\x2d\x06\x9b\x43\x9b\x5c\x8f"
+ "\xd0\xe0\x7e\x56\x3f\x2e\x05\xdf\x2d\x06\xec\x82\xcd\xd7\x81\xfd"
+ "\xb6\x00\xe7\xe1\xff\xb7\xc0\xf8\x63\x81\xeb\xf4\x1e\x75\x5a\x68"
+ "\x4f\x9b\xd5\x89\x33\x6c\xed\xc4\xd5\x80\x0d\x07\xd5\xbf\x77\xb5"
+ "\xc6\x6a\x43\xec\xd3\x3a\x38\xbe\x06\xce\xeb\x3d\xae\xea\x28\x86"
+ "\xae\x0e\xb2\xde\xb3\x92\x3d\x57\xef\x22\x83\xd6\xec\x22\x5d\x52"
+ "\x76\x91\x21\xcb\xaa\xe0\xb9\x4c\x7a\x8e\xfb\x3e\xcc\x04\x63\xe2"
+ "\x81\xe4\xc6\x4e\x6f\x46\xe1\xbb\x27\xcb\xbb\x0f\x65\xaf\xdc\x45"
+ "\x7a\xe3\xdc\xd8\x71\x35\x84\xe0\x18\x3e\xce\xfb\x0c\x57\x16\x75"
+ "\x8d\x58\x3a\x1c\x48\x36\xbf\xfb\x58\xc7\xb1\xd7\x08\x39\x14\x54"
+ "\x47\xe2\xa2\x61\x2c\xaf\xad\x26\x71\x75\x9c\xa1\x34\xe1\x22\x01"
+ "\xee\xc9\xa4\xb6\xbb\xb6\x73\xdc\x2c\x42\x70\xce\xa0\xe5\x97\x20"
+ "\xd2\x56\x47\xbc\x96\x9f\x20\x01\xf1\x55\x5c\xb5\x79\x43\x4c\x78"
+ "\x5c\x2c\xd1\xec\xaa\xad\xa0\xda\xd3\xe3\x5a\xec\x7e\x9c\x9f\x5a"
+ "\x1f\x4a\x5e\x37\x09\xe3\x51\x5a\x52\x72\x7c\x04\xe9\x8c\xf7\xd3"
+ "\x9e\xd7\x5e\xd7\x3a\x83\xdd\x92\xd5\xf1\x73\x5d\x15\xef\xcf\x0d"
+ "\x4b\x0c\xbb\x66\x18\x41\xb7\xf6\x4b\x88\x9f\xc5\x55\xa3\xae\x83"
+ "\xf1\x85\xd7\x82\x65\xd5\x26\xd0\x56\x33\x61\xfc\xd6\x93\xaf\xcf"
+ "\x65\x6b\x2c\xe9\xfd\x12\xd4\xfd\xc6\xb5\x91\xfc\xb8\x8d\x63\x29"
+ "\xf4\x3d\x24\x88\x24\xf0\xfd\x87\x31\xb3\x7d\x34\xea\x29\xee\x0c"
+ "\xf6\xff\x2b\xb8\x57\xae\x5b\xba\x1e\xfa\x54\x8c\xe3\xe7\xb8\xca"
+ "\x42\x52\x6c\x34\x93\x4d\x97\x78\x1b\xdd\x03\x36\xf2\x82\x73\xd9"
+ "\x60\x27\x1f\x39\xbf\xa1\xcf\x2c\xa9\x07\x92\x2d\x9e\xd4\x37\xbc"
+ "\x5f\xea\xa8\x5f\xc6\xbe\x4d\x60\x1c\x05\xdf\xac\xa7\xbe\xb1\xf8"
+ "\x27\x46\xa1\x6f\xd4\xdd\xc7\x75\xad\xd2\xf8\x82\xbf\xcd\x01\x3e"
+ "\x10\x17\x16\xbf\xc4\x28\xfc\x6d\xec\x03\xbe\x3f\x43\x1c\x8c\x5b"
+ "\x79\x86\x2b\x8d\xaa\x26\x65\x70\x3f\x5c\x07\x69\x1f\x4c\x6a\xfb"
+ "\x90\xa6\xd4\x87\xd5\x7d\x01\xb7\x7d\x01\xb7\x7d\x01\xb7\x7a\x8a"
+ "\xdb\x23\x95\x14\xb7\x66\xe8\x57\x03\x68\xf7\x65\x21\x44\x83\xfd"
+ "\xda\x79\x12\xd7\xe8\x83\x7e\x56\x8b\xd8\x1d\x73\x19\x6c\x64\xc5"
+ "\xaf\xe7\x63\x1d\xd1\x3e\xa5\x75\x15\x24\x1e\xf1\xdb\x28\x87\x5f"
+ "\xe3\xdc\x71\xa0\x00\x4d\x73\x00\xbf\xff\x0e\x22\xbe\x55\xc4\x2b"
+ "\x36\x04\xf0\x5b\x2d\x87\x5f\xe3\xb3\xfb\xe0\x37\xed\xf0\x3b\x4b"
+ "\x8a\xdf\xfa\x13\xea\xf1\x5b\x9f\xd3\x84\xdf\xc9\x02\x7e\x23\x6c"
+ "\xf0\x5b\x25\xc1\x2f\xde\xb7\x6a\xfc\x1a\x7d\xd4\xe1\xb7\x7e\x75"
+ "\x13\x7e\x21\x2e\xd9\x34\x9b\xb7\xd1\x3d\x60\x23\xc0\x6f\x7d\x38"
+ "\xd8\x49\x16\xbf\xb7\xdf\x7f\x8d\xbd\x5d\xf7\x5f\x83\xd9\xb9\xff"
+ "\x1a\x36\xaa\xf7\x5f\xc3\xcc\x5b\xef\xbf\x86\x22\x75\xfe\x6b\x18"
+ "\xad\xec\xbf\x86\xc0\x3b\xc7\x7f\x37\x6a\x5c\xf7\xdf\x8d\xfd\xce"
+ "\xfd\x77\x63\x92\x7a\xff\xdd\xe8\x71\xeb\xfd\x77\x23\x59\x9d\xff"
+ "\x6e\xf8\x2a\xfb\xaf\x51\xaf\xe4\xbf\x17\x3a\x5b\x38\x0b\xd6\xcd"
+ "\x75\x9a\x53\x8e\x1a\x88\xea\x35\xd3\x5e\x8c\x19\xe1\xb3\x97\xf5"
+ "\x33\xaf\xa9\x20\xae\xb6\xf9\xec\x6b\xf3\x59\x6b\xf3\xd9\xcf\xe6"
+ "\x73\x80\xcd\xe7\x2e\xd6\xcf\xe0\x2f\xef\x2b\x1e\xa6\x5e\x10\xb3"
+ "\x25\xe8\x3d\x4c\x07\x85\xf3\x3d\x5e\x37\x07\x62\xdc\xd7\x43\xae"
+ "\xef\xeb\x92\x38\x63\x5b\x0f\xc2\xdd\xd0\x70\x24\x2a\x8e\x3c\x74"
+ "\xc9\xc3\x3c\xa8\x31\x09\x42\x42\xcf\x07\x83\xb8\xc6\x04\x02\x7e"
+ "\xd9\x3d\x76\x09\xe0\xcb\x00\x71\x62\x7c\xc0\x3d\xd0\xf6\x03\x60"
+ "\x37\x43\x69\x94\x01\x74\xf9\xd7\xdc\x39\x0f\x73\x4f\xbc\xcf\xbe"
+ "\x51\x85\xc4\xe2\xf9\x58\x10\xc7\xaf\xdd\xdc\x6f\xb7\xc1\xf3\xb1"
+ "\x07\xb9\x6d\x1b\xa2\xd6\x24\x59\x7c\xca\x6a\x8e\x91\xb5\x1a\x4b"
+ "\xe0\xf2\xe5\xa0\xeb\x6b\x76\x93\x65\x35\x5c\xf5\x72\x13\x67\x2c"
+ "\x0b\x2b\xc4\xf7\xb6\xd5\x65\x31\x45\xa4\xd4\x70\x8c\xe0\x98\x87"
+ "\x58\x2d\x33\xec\xa6\xef\x89\xf1\x1a\x38\x56\x6a\xd8\x49\x4a\xe0"
+ "\x73\xe1\xfc\xf3\x70\x9f\xe6\xe3\x65\x35\x3b\x89\x39\xad\x5f\xbe"
+ "\xc5\xaf\x5f\x1a\xe7\xd7\x2f\xa3\xa4\x06\xfa\x96\xd6\x2f\x13\xfb"
+ "\x5a\x0a\xfd\xe0\xf7\xe8\x4c\xef\x97\xc9\xb7\x5b\x57\xce\xe7\x10"
+ "\xcc\xe9\x70\xbd\x3f\x5c\xef\xdf\x2f\x03\xfb\x87\x7d\x93\x8d\xf7"
+ "\xd2\x74\x5e\xd0\xf7\x67\x42\x82\xbc\x08\x97\xe8\x15\xa0\x0e\x6f"
+ "\x66\xa3\x62\x1c\x99\xa6\x5b\x41\xdb\xf5\x71\xa3\x5d\x8b\x62\xfd"
+ "\x13\x97\x16\x21\xf4\x57\xeb\x4e\xbb\xb9\x0e\xda\x15\xfa\x1b\xe8"
+ "\x46\xbb\x1c\x51\x6e\x37\x52\xe8\xef\x50\x77\xda\x0d\x75\xd0\xae"
+ "\xd0\xdf\x04\x77\xda\xcd\x77\xe0\x37\x2f\xb7\xb0\xa0\x21\x5e\x8e"
+ "\xb0\xe0\x16\x0e\x34\xc4\xc1\xfd\x47\x78\xb9\x85\x01\x0d\x51\xcc"
+ "\x7f\x23\x06\xdc\xf2\xbf\xc6\xc3\xa1\xff\xdd\xf2\xbd\xc6\x43\x71"
+ "\xff\x47\xf4\xbd\x5b\x7e\xd7\x78\x28\xe2\x1f\x63\x63\x2e\x6d\x4e"
+ "\x36\xd7\x29\xbd\xdc\xb2\xe1\xe9\x6c\x4b\xa7\x39\x1f\xbf\x6b\x19"
+ "\x4a\x5e\x88\x85\x31\x2f\x83\x74\x78\x21\xeb\x0c\x37\x14\x73\x4e"
+ "\x1a\xcd\xd0\xd8\x4c\xa2\x49\xd5\x58\x34\x79\x4b\x2b\x34\x65\xa6"
+ "\x41\xc8\x5b\xe6\x9c\xc5\x46\x8f\x47\xe1\xf8\x01\x88\x1e\xeb\x16"
+ "\x06\x11\xda\xd6\xd3\xd9\x6b\xe3\x86\x92\x71\x66\x82\x39\x8e\xba"
+ "\xb1\x6f\x9f\xe1\xbe\x59\x0e\x1a\xff\x37\xe0\xd7\x0c\x23\x8e\xa5"
+ "\x1d\xe0\xbb\x26\xc0\x31\xb4\x63\x24\x9f\x59\x0c\x1e\x63\x0d\xfc"
+ "\xb5\x06\x88\x47\x0d\xdc\x86\x39\x1f\xe3\x98\xcc\xc5\x07\x91\x15"
+ "\xf0\x19\x7e\xfb\x73\x4f\x03\xd1\x6c\x81\x58\xb5\x3e\x45\xb3\x53"
+ "\xaf\xf1\x4c\xc6\xf8\x15\xe2\xe4\x9a\xf8\xdf\x30\x9f\x9f\x5e\xbe"
+ "\xcb\x62\xd0\xbc\x0b\x71\x33\x5e\xdf\x37\x8a\x68\xbe\x81\xf6\xe0"
+ "\xda\x8a\x03\xd1\x84\x38\xc8\xe7\x78\x59\xfc\x20\x9a\x84\xef\x63"
+ "\x3b\x98\x27\x5d\x67\x01\x3b\xfb\x25\x25\x63\xbf\xb9\xb4\x37\x43"
+ "\x0b\x97\xc2\x98\xa3\xf1\x0c\x1f\xd1\x8b\xab\xc7\x31\x04\xc6\x8e"
+ "\x07\x2f\xc1\x67\x3e\x1f\x90\xc4\x95\x73\x7e\x7d\x93\xb9\xb5\x6d"
+ "\x87\x96\xd6\xd5\x92\xc2\xc5\x8d\xe4\x9c\xc6\x73\x3a\xfe\xf6\x55"
+ "\xbf\x78\x7d\x9d\x5f\x7c\x75\x7d\x8a\x67\x98\xb5\xbf\xf8\x5b\xd6"
+ "\xe3\x98\xff\xa0\x7d\xf4\x5c\x7e\x60\xb9\x72\x1f\xb9\x77\x1f\xec"
+ "\x38\x2e\x80\x33\xa0\x2d\x0b\xe3\x6a\xa1\x2f\x5e\xbf\xa1\xbd\xb9"
+ "\xb4\xf8\xfc\xba\xf8\xa0\x87\xf9\x7c\xa0\xc6\x2b\x00\xf3\x4a\x30"
+ "\x36\xe4\xd0\x1c\x4f\xbf\x1c\xbe\x86\x07\xb8\x9f\xcb\x09\xd5\xa1"
+ "\x16\xba\xa2\xf1\xe4\xf3\x81\x21\x41\x1a\x75\xf1\x94\xc6\x93\x8f"
+ "\x7f\x0b\x1f\x46\x3b\x78\x9d\x80\xdf\xfb\xe3\x39\x8d\xd7\x10\x9a"
+ "\xe3\xe8\x57\x80\xbf\x07\xd7\x14\xc1\x6f\x16\x70\x69\x7d\x13\xf0"
+ "\x3a\x38\x1f\x26\x9c\x2f\x94\x9c\x2f\x84\x3e\x1b\x85\xf3\xcb\x85"
+ "\xf3\x07\x25\xe7\x0f\x46\x3d\x4c\x3c\x2e\x69\xbc\x72\xf0\x9e\x60"
+ "\xbc\xcb\x86\xf3\xbb\xf1\x7d\x02\x7f\x4f\xfe\xfd\xb2\x85\xeb\x76"
+ "\xd7\x68\xbc\xf6\x5f\x05\x7c\xc1\xf9\x7d\x92\xef\xef\xfb\x26\xa6"
+ "\x3f\x79\x21\x0b\x6d\xea\x55\xae\xf7\x7a\x42\xcf\xe7\x89\x34\x9e"
+ "\xc5\xbc\x2d\x60\xfc\x94\xb6\xa7\xd7\x78\x65\xe2\x18\x59\x07\x3a"
+ "\x12\xae\xd9\x8d\xbf\x29\xb5\xff\xac\x05\x0b\xde\x5a\x10\xd8\x73"
+ "\x66\xe0\xcc\x79\xd3\x03\xdf\x78\x6b\xd1\xfc\xe8\x67\x7b\xce\xbc"
+ "\x8f\x10\x09\x76\xb4\x5c\x52\x7b\xce\x92\xb6\x2c\xa8\x2c\x03\xf4"
+ "\x9b\x46\x0b\x63\x79\x23\x49\x03\xbf\x9a\x36\xbc\x4f\xcc\x9d\x52"
+ "\x52\xcd\x1b\xe6\x92\xf8\x6b\x44\x13\x17\xc0\x9d\x2d\x5c\xfa\x3c"
+ "\xf8\xc0\x3b\x02\x35\x44\x59\x20\x21\xab\x01\xab\x85\x4b\xff\x81"
+ "\xc7\x12\xf9\xf7\x0d\xe1\xf4\xd8\xff\xc5\x15\x69\xbe\x8e\xab\xd0"
+ "\x14\x87\xd7\x92\x6f\x02\x0c\xe4\x60\x60\x2d\xc9\xc4\xe3\x96\x72"
+ "\xfe\xbd\x0f\x5c\x7f\x14\x7f\x0b\x73\x67\xf8\x7f\x3e\x0f\xa8\xf1"
+ "\x0e\xc1\xdf\x09\x7c\x90\x90\x1a\x8d\xf7\x24\xfc\x3d\xbd\xc6\x3b"
+ "\xd4\x33\x93\x78\xc0\x73\xe4\x7b\x45\x73\x8f\xbf\x25\x7d\x59\x10"
+ "\xff\xac\xa7\x78\xfb\x98\x34\x1d\xfb\x6c\xf9\x80\xf8\x6c\xfd\x80"
+ "\x90\xcc\x8e\xc4\xab\x3e\xe5\x1e\xa2\xf7\x1a\x99\x83\xf6\x82\xa6"
+ "\x7d\xaf\x6a\xc8\x73\x70\xcc\x4f\x4f\x76\xce\xc5\x63\xf0\x4c\xd5"
+ "\x29\x71\x07\xbe\x87\x33\xe6\x4c\x4c\xb5\xf8\x2d\x0b\xe0\xc0\x16"
+ "\xc6\x1e\x13\x0b\xdb\x47\x01\x5e\xe0\xb9\xe1\xfc\x97\x05\xd4\x68"
+ "\x7c\xb4\xdf\x16\x10\x12\x87\xcf\x29\xd8\xe3\xd3\xeb\x46\x7c\xff"
+ "\x46\x76\x5e\x37\xc0\xe7\x94\xd4\x1d\x8b\x8d\x9a\x23\xc3\x0b\x48"
+ "\xe0\x2b\xa0\xb1\x34\xf7\xac\xfa\xd3\x4c\xce\xf4\x58\x30\xe8\xd2"
+ "\xaa\xbf\x92\xef\x2b\x8b\x88\x6f\x18\xf1\x6c\x5a\x1b\x3e\x9a\x68"
+ "\xc6\xe9\xe1\xf3\x22\xa2\x29\x35\x9a\xf9\xf7\x00\x71\xc3\x30\x9f"
+ "\x5f\x42\x30\xc7\xcf\x69\x76\x45\xe7\xd5\x1a\x81\x9f\xaa\xbd\x71"
+ "\x2e\xb9\x45\xfb\x5d\x32\x7e\xe7\xf5\x3a\xe1\xdd\xd8\x55\xe1\xdd"
+ "\xd8\x55\xfe\xdd\x58\x0f\x7c\x2f\x86\xef\xc3\x96\x87\x73\x16\xf3"
+ "\xc2\xa0\x8e\xe3\xc2\x3d\x39\x6c\x13\xdf\x95\xb5\x85\x98\x82\x5b"
+ "\x18\xd4\x6e\xe3\x02\xe2\x57\x6a\xa8\x26\x65\xd5\x45\x64\xf3\x62"
+ "\xe2\xc7\x5d\xd5\xb5\x29\x3e\x78\x84\x70\x1f\x7c\x93\xf0\x59\x5c"
+ "\xa1\xb7\x19\xf3\x29\x57\x03\xee\x6b\x9f\xe8\x81\xef\x05\xda\xad"
+ "\x5e\x40\x7a\x6f\xad\x25\xfd\x5f\x3f\x9f\xc0\xaf\x13\x85\x7b\xfa"
+ "\x99\xae\x06\x05\xde\xb8\x1a\xd4\xbd\x71\x61\xd0\xc3\xed\x0d\xf4"
+ "\x5d\xda\xd4\x08\x2d\xc1\xf7\x65\xdc\x7b\xd7\x43\xb7\x62\x4e\xbb"
+ "\xce\x40\x4c\x1d\xbe\x4b\x46\x7c\xc2\xef\x76\xc1\xf7\x2f\xf1\x4b"
+ "\x88\xd6\xf2\x73\x10\x29\xa9\xa9\x25\xfd\x00\x37\xf8\xae\x61\xcb"
+ "\x39\xfa\xae\xc1\xbc\xfe\x40\x32\xbe\x6f\xa8\x5f\x18\xa4\x19\x73"
+ "\x19\xc6\xae\x94\x7b\x7a\x37\xf6\x9c\x98\x7a\x28\xe8\x14\x8e\x0f"
+ "\x03\xc4\xe7\xfe\xde\x53\xee\x3d\xf7\xf7\x56\xe2\xf7\xf0\xfd\x1b"
+ "\x07\x78\xde\x59\x8b\x7e\x03\xff\xd5\x1a\x34\x2f\x57\x71\xa6\x92"
+ "\xaa\x4f\xc0\x3f\x15\x8c\x7f\x78\x7f\x2e\x30\x6a\x2e\xcc\x04\xbf"
+ "\x9c\xa7\xbe\x2a\xae\x03\x3f\x1d\xc0\x36\x12\x02\xf3\xc0\xd7\x10"
+ "\x4f\x69\x8a\x8d\xa7\xf8\x75\x2e\xd0\x5f\x3b\x1b\x8b\xbc\x1b\xfd"
+ "\xe6\x64\xe3\x7b\xcc\xfa\x1e\x13\xf3\x1b\xd2\x96\x1a\x6f\xf8\x2d"
+ "\xf3\x71\xf0\x4e\xb3\x07\xfa\x2b\x36\x82\xf8\x14\x57\x1d\x27\xbc"
+ "\xcf\xde\x16\x7c\x86\xb5\x6f\xef\x04\xb5\x33\xd5\x07\x75\xdc\x08"
+ "\xbe\x2a\x8d\xd6\x93\x4d\xb5\xc4\xaf\xac\xba\x02\xdf\xf7\xb4\x79"
+ "\x79\x3c\x21\x2f\xef\xe0\x2c\x25\x07\x4f\xf2\xfe\xdb\x05\xfe\x33"
+ "\x81\xff\xf0\x3d\x67\x93\xff\x16\x83\xff\xae\x83\xff\x2e\x8b\xfe"
+ "\x33\xd7\x83\xff\xea\xc1\x7f\xef\x80\xff\xea\xec\xfc\x57\x89\xef"
+ "\x42\xf1\x9d\x13\xfa\x0f\xeb\xad\x2d\xef\x04\x75\xe1\xdf\x81\xbe"
+ "\x11\x44\xb6\xce\x20\x3e\x7d\x8c\xc4\x23\xfe\x00\xd1\x42\x3f\xb5"
+ "\x7f\x00\xfb\x42\x7b\x80\xef\x73\xa4\xac\xc0\x4c\x96\x4d\x22\x0f"
+ "\xa3\x3f\x4d\x82\x3f\xcb\x4c\x7b\xc8\xf5\xfa\x20\x0d\xb4\x39\x68"
+ "\xe3\x75\x32\x64\xf4\xf9\x40\x72\x68\x42\x09\x01\x7f\x14\x59\xd2"
+ "\xe3\xf3\xdd\x7f\x0e\xef\xcf\x70\xfd\x39\xbc\xaf\xc3\xdd\xe7\xd0"
+ "\xdd\xe7\xb0\xcd\x6e\xf9\xe7\xf0\xfe\x59\xee\x3d\x87\xf7\xcf\xbc"
+ "\xfb\x1c\xde\x49\xcf\xe1\xfd\xc1\xb6\xcf\x61\x93\x56\x58\x30\x6b"
+ "\xde\xf4\x88\xf9\x11\xf3\xe7\x04\xce\x58\x12\x3d\x6b\x21\x55\x0c"
+ "\x8c\x66\x08\x32\x5b\x86\x6a\x3e\x84\xf1\xf4\xfb\x80\x0a\xf2\xd9"
+ "\x83\x15\x1a\xcb\x94\x00\x2f\x2e\xf5\x54\xb9\x25\xf5\x74\xf0\x87"
+ "\xa0\x7f\xf1\x79\x4d\x03\x5d\x7b\x41\xf3\x40\xf4\x77\x5d\x40\xf3"
+ "\x2d\xb8\x44\xf0\xff\xf4\x9d\xec\x66\x2d\xce\x5b\xcc\xd8\xc0\x55"
+ "\xe3\xbc\xc5\x23\xc3\x71\xec\x6f\x7b\xed\xfe\x50\x18\xd7\xa7\x04"
+ "\x90\x86\x29\xa1\x9a\x94\x93\xc4\xa7\x7d\x05\x19\x6d\xb1\x70\x5c"
+ "\x61\xdc\x25\xd0\x5a\x7e\xfb\x0a\x27\x5f\x22\x81\x4b\x7d\xe0\xda"
+ "\xdf\x75\x0d\x5c\x9a\x88\xff\x7a\x04\x2e\x7d\xef\xcc\x05\x4d\x47"
+ "\xbe\x6e\x06\x34\x77\x35\xb7\x61\x69\x94\xf9\x2f\x93\xf4\xf8\xbe"
+ "\x72\x6b\x27\xae\x6a\x17\x68\xfc\x5d\x8d\x46\xcd\xbb\x0b\xb0\xee"
+ "\xfb\x11\x0e\xdf\x3b\xe2\x7b\xcd\x77\x6b\x41\xc3\xaf\x10\x72\x3f"
+ "\xa0\x23\xf0\x79\x59\xbd\x81\xab\xfa\xea\x42\x85\x06\x9f\x9f\x3a"
+ "\xbf\xbe\x09\x2b\xe0\x3e\xa0\x8f\xfa\x4d\x9d\xb8\x4a\x83\xff\xb2"
+ "\x20\xaf\x40\xa2\xa9\x4f\x69\x37\x13\x34\x49\x20\xea\x89\x64\x38"
+ "\x97\x02\xe7\xf8\xf7\x7f\x9a\x0e\xd5\xdc\x7d\x6d\x07\x20\x67\x01"
+ "\x76\x3d\xae\x68\xda\x7d\xde\x00\xf7\xb8\x9a\xc6\x02\xd5\xc6\xf4"
+ "\x65\x3e\xa6\xed\x13\xf3\x4d\xa8\xe1\x7a\x4e\x2c\x6c\xf4\x5f\x6a"
+ "\x34\xa5\x2f\xc3\x3d\x5c\x3c\xe8\xf5\x5a\xbe\xae\xf8\x86\xdf\x5c"
+ "\x02\xd7\xd7\x5d\xf5\x7b\x9f\x5c\x4d\x4b\x49\x3d\x12\x93\x2f\x70"
+ "\x59\xbb\x53\x2f\x67\x08\x5c\x96\x01\xcf\x4a\x28\x70\x59\xa8\x3d"
+ "\x97\xd1\xba\x00\x33\xa1\x9c\x56\x82\x6d\x55\xe1\xb3\x82\xba\x30"
+ "\x0f\xec\x80\xcf\x01\xe2\x9d\xe7\x36\xe0\x35\xeb\x33\x81\xcf\x0b"
+ "\xf2\x17\xff\x7c\xda\x3c\x1f\xf8\x4c\xdc\x6f\x20\x5a\x7c\x26\x90"
+ "\xdf\xf0\x99\xc0\x7a\x9b\x0f\xaf\xd3\x67\xa2\x7d\x25\xd1\xf2\xcf"
+ "\x85\xa9\x88\x7f\x2e\x30\x26\x28\x36\xd9\x70\x9a\xe4\x99\x58\x63"
+ "\x7d\x26\xac\x9c\x06\xb8\x37\xe1\x33\xf1\x0e\xfb\x4c\x4c\x39\xa5"
+ "\x25\x3c\xdf\xbd\x77\xad\x32\x13\x9e\x09\xcc\x61\x99\xad\x9c\x06"
+ "\xcf\x04\xce\x07\xe2\x39\xed\x4d\x81\xd3\x0c\x70\x1c\x9e\x85\x2d"
+ "\x91\x2c\xa7\x35\xd4\x3b\xd3\x16\xda\xc1\xee\x71\x9a\x96\x5f\xff"
+ "\x0d\x7d\x85\x7e\x43\x7f\xa1\x8f\x5a\x93\x7f\x90\xb3\xcc\x5a\x05"
+ "\xce\x92\xf1\x0f\xe0\xb9\x06\xfe\x6f\xe7\x23\xee\xbd\xba\x1e\x52"
+ "\xde\x42\xbe\x42\xee\x42\xce\x42\xfe\xc2\xe7\x00\x79\x8b\xe7\x2c"
+ "\xe0\x73\xf8\x5c\x5d\xa2\x3b\xc7\xf3\x59\xfc\x79\xa2\x8d\x1f\x41"
+ "\x1e\x46\xfe\x2a\x33\x5d\x23\xc8\x67\xbc\xff\x3a\x88\xfe\x43\xfe"
+ "\xda\xb4\x98\x0c\x19\x13\x11\x48\x90\xb7\xc0\xf6\x3d\x0e\x05\x1d"
+ "\x27\x7c\x2c\x90\xe4\xd7\x79\x6b\x47\x88\xbb\x3f\x20\x5e\x69\x1d"
+ "\x89\x4f\x7d\x4a\x47\x1f\xfb\x38\xa0\x63\x17\x6b\x1c\x80\xcf\x2c"
+ "\x3e\xbb\x7a\x4d\xbb\x18\x1a\xbf\xc5\x04\xf3\x3e\xd2\x04\xf0\x6b"
+ "\x04\x60\xdc\x2c\xc6\xcc\x1d\xa7\xd2\x77\xeb\x10\x23\xfb\xbf\x19"
+ "\xca\xa5\xf7\x4d\x46\xfb\xe1\xfd\xbc\xde\x0b\x70\x96\x1e\xaf\x5f"
+ "\x87\x36\x49\x87\xf8\x3b\x3d\xbe\x5a\xc4\x54\xc7\x35\x87\xa0\xf5"
+ "\x90\x18\xb5\x98\xea\xb8\x9a\xef\xc3\xbf\x42\x7f\xc7\x4d\x09\xf5"
+ "\xb2\xfc\x2b\xd4\x1b\xfc\x1f\xf0\x96\x39\x81\x5c\x4f\xdd\xec\x13"
+ "\x6f\xe2\xaa\x03\x97\x92\xc7\xa0\x5f\x97\x8f\x40\xf4\x79\x04\x18"
+ "\xb5\x2c\x78\x2e\xf8\x72\x53\xf2\x67\x16\x83\x97\x5e\xd3\xb6\x0e"
+ "\x62\xfe\x6a\xe0\x52\x2f\x29\x97\x52\xde\x6c\x5b\xc7\xd7\x75\xa7"
+ "\x6e\x0e\xc0\xb6\xc6\x15\x91\xf6\x81\x2f\x12\xaf\x0b\x1a\xbf\x35"
+ "\x4b\x62\x09\xce\x47\xf5\x86\xff\x4f\x6a\xf8\x20\x32\x19\xbe\xdf"
+ "\x8e\xfb\xd7\x04\x8f\xa8\x17\x61\x3c\x99\x32\xc1\x03\x6b\x09\x3e"
+ "\x89\xcb\xd0\x58\xe0\x18\xad\x4d\xca\x20\x78\x7e\x75\xa3\x17\xaf"
+ "\x9b\x2c\x70\x4d\x69\x5d\x06\x59\xbd\xd8\x87\xe0\xf5\xb4\xde\x2d"
+ "\x83\xe0\xf5\x6b\x16\x68\xf9\x5a\x04\xfe\x7b\xa6\x0c\x82\xdf\x35"
+ "\xc3\xf1\xf7\x2d\xbe\x64\xed\x52\x3f\x72\x24\xb8\x94\x6f\xe3\x48"
+ "\xf0\xb7\x04\xdb\x00\x9c\xc3\xff\xbf\x22\xeb\x16\x07\xc0\x73\x9d"
+ "\x01\xe7\xff\x49\xd6\x5d\xe9\x02\xff\x5e\x80\xbf\xeb\xe4\x92\xe6"
+ "\x77\xa6\x23\xc1\x16\xd2\x3e\xf1\x39\x0e\xf0\xca\x95\xe1\x1c\xc7"
+ "\x38\x72\x0f\xf4\xdd\xbb\xac\x22\x15\xc6\xb6\x8e\x35\x38\x07\x9e"
+ "\x8b\x9f\x52\x63\xe1\xa6\x5c\xb6\xc4\x4f\xb9\x82\xbf\x6d\xe6\xa6"
+ "\xfc\x8a\xbf\xbd\x66\x69\xa0\x50\xff\x9a\xc1\xd7\xea\xad\xbe\xde"
+ "\x83\x60\x5f\xf1\x77\xf1\xf7\xd6\x2d\x08\x12\x7e\xb3\x37\xdf\x37"
+ "\xfc\x4d\x6c\x53\xfa\x9b\xb8\xbf\x7c\xe0\x6b\xfc\x6f\x2e\x81\x7f"
+ "\x3b\x80\x3f\x0c\xe8\x07\xfc\x7d\x0b\x17\xea\xcd\xc5\x87\x7a\xf2"
+ "\xdf\x89\xa9\x96\xfb\x4e\x9e\xf0\x1d\x7e\x2d\x1e\xfc\x4e\x23\xbd"
+ "\x9e\x6f\x03\xc6\xba\xc3\x78\xfc\xf1\xd0\x42\x62\xef\x43\xff\x59"
+ "\x74\xec\xf3\x1f\x48\xc7\x3e\xea\x53\x1e\x2b\x53\x42\xbd\xc1\x6f"
+ "\x5a\x1c\x27\xcf\x69\xfc\xdb\x36\xb5\xf1\xaf\x50\x4f\xf4\x37\xe2"
+ "\xc6\x8a\x25\xc4\x91\x15\x43\x7c\x3f\xa3\x08\x91\x62\x06\xfe\xef"
+ "\x23\xb4\x13\x62\x6d\x07\xfa\x40\xac\x38\x7a\x1c\xce\xdb\xe3\xe8"
+ "\x81\x3e\x22\x8e\x3a\x95\x18\xe3\x38\x0e\x71\x54\x38\x39\x09\xdb"
+ "\xc9\x12\xfb\x33\xc1\x03\x31\xd6\xba\xb0\xf5\x3b\x13\xfa\xe9\xf1"
+ "\xe5\xc4\x8f\xde\x4f\x27\x7e\xbc\x7e\x7c\x79\xa1\x1f\xf6\xd5\x7a"
+ "\x1f\xd8\x87\xb5\x96\x40\x62\xbd\x8f\x75\x8d\x3d\xa0\xdd\x2b\x44"
+ "\xf8\xce\x36\x6c\xdb\x6a\x03\xf0\x19\xb1\x7e\xc7\x7a\xfd\x5a\x4b"
+ "\x10\xf4\xbb\x37\xff\x1d\x8a\xb9\x0b\x32\xf8\xe9\x74\xd9\x16\x73"
+ "\xf7\x2f\x27\x20\x5c\x41\x2b\x4d\xae\x85\xdf\x79\xa0\x0d\xed\xdb"
+ "\xd7\xe6\x46\xf8\x0d\xf0\x81\x46\x38\xde\x4d\x82\x09\xa1\x7d\xa3"
+ "\x4c\xfb\x0f\x8c\x61\xda\x0f\x85\xf6\x63\xa0\x7d\xd4\x62\x93\x31"
+ "\xef\xf5\x40\x04\xdf\x4e\x0c\x6d\xdf\x8a\x5b\x2e\x75\x76\x4e\xd4"
+ "\x52\x72\xef\x25\x4d\x80\x96\xf2\x69\x5b\xde\xe7\x7c\x9d\x92\xc6"
+ "\x92\x6d\xb1\xa9\x53\x92\xd6\xb1\x7d\x16\x67\xa0\x35\x4a\x9a\x07"
+ "\xf8\xb9\xad\xc0\xaf\x75\xa8\x29\xf3\x40\x8f\x89\x75\x4a\x27\xf1"
+ "\x7c\x43\xe1\xe2\x73\x62\x9d\x92\xe6\x81\x62\xbc\x5e\xaf\x09\xe8"
+ "\x01\xb1\xa3\x06\x3e\xeb\xe9\xf1\xb6\x99\xd2\xe3\x4d\x75\x80\xc2"
+ "\x71\xac\xb1\x16\xf2\xac\x35\xdf\x14\x60\xae\x2d\x60\x88\x35\xbf"
+ "\xa9\x10\x9b\xaa\xd0\xbc\xdd\x13\x44\xcd\xdb\x3d\x41\x59\xf3\x06"
+ "\x5c\x74\xac\x79\x1f\x29\x12\x35\xef\xc3\xbd\xe8\x73\xff\x70\x5b"
+ "\xfa\xdc\x77\x2d\xe1\x73\xb7\xd0\x9e\xe9\xe3\x74\x03\xf7\x97\xd0"
+ "\x04\xc4\xf9\x16\xd0\xb0\x9f\x2d\x2e\xd2\xec\x82\xd8\xc8\x0c\x7a"
+ "\xf7\xdd\xa5\xc4\x0b\xd7\x67\x7b\x17\x6c\x58\x66\xaa\x24\x25\x5e"
+ "\xa8\x79\x7f\x80\x76\xba\x0e\x2e\xc5\x77\x84\x69\x6f\x86\x53\xbb"
+ "\x74\x1e\x01\xbe\xf0\x2c\x33\x1a\xf9\xeb\xf0\x1c\x8c\x6b\x55\xa8"
+ "\x7b\xbf\xb2\x14\x69\xb2\x96\xa2\x26\x4e\x2f\x94\x6a\xe2\xfa\x94"
+ "\xce\x51\xf2\x5a\xb8\x4b\x9d\x29\x45\xaa\x85\x3b\xef\x47\x2d\x8c"
+ "\x39\x71\x1c\xf7\x2d\x54\x03\xe7\x83\x1e\x2e\x44\x5d\x8c\x5a\xd8"
+ "\xc2\x68\xe1\x87\x96\x38\xd6\xc2\x9d\x2f\xde\xd5\xc2\x37\xab\x85"
+ "\x95\xe2\xfb\x87\x46\xb8\xa7\x85\x1f\x1a\x7e\x57\x0b\xb7\x94\x16"
+ "\x7e\xa8\xbf\x55\x0b\x5b\x92\xfc\xee\xc9\xfc\x80\x90\x2d\x4d\x5a"
+ "\xb8\xab\x9f\xbd\x16\xee\x1a\x64\xaf\x85\x3b\xaf\x60\xb5\xf0\xa3"
+ "\x4f\xd8\x6b\xe1\xae\x11\x4a\x5a\x18\x78\xa8\x06\xb5\x30\xe2\x08"
+ "\x75\x31\xea\x61\xe8\x5b\x35\xc5\x54\xd7\x8d\xee\x69\xe1\xae\x19"
+ "\xae\x69\xe1\xae\x0d\xf2\x5a\x38\xa0\x5a\x59\x0b\x07\x54\xcb\x6b"
+ "\xe1\x47\x36\x8a\x1a\xe6\x91\x59\x77\xbe\x16\x7e\xc4\x47\x5e\xaf"
+ "\x3c\xd2\x81\x6a\xe1\xae\xc6\xe6\xd7\xc2\x5d\x8d\xf2\x5a\xf8\x91"
+ "\x95\x54\x37\x74\x35\xd9\x6b\x61\xf8\x8e\xac\x16\x7e\x64\xaf\xf0"
+ "\x1d\x23\xab\x85\x69\x1b\x30\x06\x1e\x57\xd6\xc2\x81\x6f\xd3\x31"
+ "\x31\x70\x18\x1d\x13\xa9\x4f\xed\xb5\x70\x60\x67\xe7\x5a\x98\x62"
+ "\x88\xef\xa7\xa2\x16\x0e\x9c\x6e\xaf\x85\x03\xaa\xe5\xb5\x70\xf7"
+ "\xc1\x22\x8e\xba\x9d\x60\xb5\x70\xe0\x8e\xd6\xa1\x85\x15\xb1\xe5"
+ "\xc3\x6a\xe1\x6e\x4b\xd4\x6b\xe1\x6e\x79\xea\xb4\x30\x62\x4e\x4e"
+ "\x0b\x77\x6b\xb0\xc5\x1c\xab\x85\xbb\xfb\xcb\x6b\xe1\xee\x7d\x58"
+ "\x2d\x8c\xed\xcb\x69\xe1\xee\x93\x98\xf6\xed\xb4\x70\xf7\x45\xac"
+ "\x16\xa6\xd7\x89\x5a\xf8\xd1\x2e\x42\x6e\x61\xbd\x7a\x2d\xdc\xdd"
+ "\xec\x58\x0b\x3f\xea\xcd\x6a\xe1\xee\x15\x54\xf3\x3e\xda\x9f\x6a"
+ "\xe1\xee\x35\xf4\x78\x40\xaa\xf4\xb8\xa8\x85\xe9\x71\x7b\x2d\xfc"
+ "\xe8\x48\x27\x5a\x78\x90\xeb\x5a\xb8\xaf\x4f\x51\x93\x16\xee\xeb"
+ "\x63\xd5\xc2\x16\x0d\x8c\x51\x30\xde\xc3\x5f\x35\xce\x3f\xc0\x67"
+ "\x0e\xee\xa7\xc1\xb1\x1e\x7e\x7c\xb8\xa8\x87\x7b\xa5\xd3\x67\xbf"
+ "\xd7\x12\xfa\xec\xf7\x1a\xdc\x94\x03\x06\x2d\x8c\x9a\x58\xc8\x01"
+ "\x1f\x5b\x0b\x7f\x9f\x2d\x2d\xe2\xf5\xf0\xae\x5a\xa3\x06\x35\xf1"
+ "\x2a\xb0\x23\xea\xe2\x6f\x04\x4d\x5c\x56\x37\x48\xd0\xc5\x41\xdb"
+ "\x61\xcc\xd0\xaf\x8d\xe3\xe7\x47\xf9\x40\xff\x2a\x78\x3d\x1c\x6d"
+ "\x24\xff\x73\x7d\x90\x06\xc6\xbb\x8a\xc2\x38\x7a\x1d\xdc\x67\xa5"
+ "\xa8\x9f\x7b\xac\x64\xf4\x73\x34\xaf\x9f\x8f\xa1\x7e\xfe\x06\x22"
+ "\x94\xaf\xe2\xa8\x86\x46\xfd\x8c\x3a\x1a\xf4\x73\x79\x56\x27\xae"
+ "\xb8\x3e\xa5\xc7\x6e\xab\x86\x5e\x03\x9f\xc1\xd7\xfa\x83\xd9\x84"
+ "\x64\xcd\x26\x5e\xe0\x93\x8a\x77\xe1\x37\xf0\x7a\xb8\xae\xd2\x7a"
+ "\x1d\x8c\xd9\xe5\x54\x67\x07\xcd\xb4\x30\x39\xe7\x9e\xbd\x70\xaf"
+ "\x00\x7e\x3c\x06\x3b\xa0\x9e\xb2\xe6\x9c\x2d\x3d\x27\x16\x72\xfe"
+ "\x54\x6b\xb3\x79\xe7\xdf\x9f\xb7\x6a\xed\xb5\x82\xd6\x6e\x40\xad"
+ "\x1d\x65\xd5\xda\x3d\x43\xdc\xd4\xda\xc7\x78\x2d\x37\xb6\xf9\xb5"
+ "\xdc\xc6\x3b\x40\x6b\xa3\xce\x46\x6d\x8d\x3a\x1b\x75\x37\x6a\x6d"
+ "\xd4\xdd\x16\x41\x6b\xe3\x5a\x80\x0d\xef\x08\x5a\xfb\x3e\x89\xd6"
+ "\xf6\x90\x6a\xed\xdf\x7f\xee\x9e\xd6\xfe\x7d\xbe\x54\x6b\x23\xbe"
+ "\xd5\x6a\x6d\xf4\xb1\xdd\x3b\x4e\xf0\x15\xfa\x09\x7d\xe2\xf0\x5d"
+ "\x99\xe0\x2f\xf4\x0f\xfa\x06\x7d\xe4\x92\x7f\x00\x5f\xc5\xc6\x96"
+ "\xd3\xda\x41\x36\x5a\x1b\xb5\x35\xd8\xae\x0a\x35\x77\x59\x21\xd8"
+ "\xe6\x6d\xd0\xdd\xa0\xb9\x19\xbd\xfd\x8e\x9c\xde\xfe\x7d\x66\x53"
+ "\xee\x59\xe3\x77\xcf\x16\xcc\x3d\x77\xb4\xea\xed\xa0\x15\xf6\x7a"
+ "\x3b\x28\x43\xa2\xb7\xcb\xf5\x9a\x1e\x35\xac\xd6\xee\xbb\xd7\x5e"
+ "\x6b\x07\x1d\x57\xd4\xda\x9d\x64\xb4\xb6\xbf\x55\x6b\xf7\xf2\x76"
+ "\x4f\x6b\xf7\xf2\x52\xd2\xda\xf5\x5a\xa9\xd6\xee\x35\x4b\xd4\xda"
+ "\xd1\x12\xad\xfd\xa8\x51\x59\x6b\x3f\x4a\xf7\x39\xd3\x6e\x0e\xc0"
+ "\xb6\x50\x23\xe1\xbb\xb9\x40\x9c\x97\xae\x79\xdc\x1f\x75\x12\xe6"
+ "\x1a\xa0\xff\xa0\x95\x1e\x3b\x2b\xd5\xdc\xf8\x4e\xce\x91\x2e\x8a"
+ "\x9a\x4d\x1e\x46\x6d\x84\xba\xc8\xaa\x63\xf1\x7a\xd4\x47\xb7\x56"
+ "\x1b\x3d\x96\x20\xaf\x8d\x1e\x5b\xc3\xeb\x5e\x9c\xcf\xa8\xe9\x35"
+ "\x13\xc7\xb8\xe6\xd5\xde\xbd\x66\xca\x6b\xef\xc7\x3d\xa8\x4e\xe9"
+ "\xa5\x43\xbf\xb0\xda\x1b\xbe\x23\xab\xbd\x1f\x1f\x28\x7c\x67\x26"
+ "\xab\xbd\x69\x1b\x30\xde\x8e\x57\xd6\xde\x8f\x5f\xa6\xe3\xef\xe3"
+ "\xfb\xe9\xf8\x2b\xf8\xd8\x4e\x7b\x3f\x9e\x2e\xd5\xde\xe8\x7f\x7b"
+ "\xed\x4d\x31\xc5\xf7\x53\x51\x7b\x3f\x7e\xca\x5e\x7b\x3f\x6a\x44"
+ "\xed\x2d\x8f\xab\x3e\x07\x58\x5c\xf5\x99\x6e\xb4\x58\x35\x78\x0a"
+ "\xb4\xd7\xbb\x8f\xad\x06\x6f\x85\x58\x4b\x10\x75\x38\xde\x53\x1f"
+ "\x0f\x75\x3a\x9c\xff\xce\x40\x75\x3a\x1c\xf1\x27\xa7\xc3\xfb\x24"
+ "\xda\xe2\x8f\xd5\xe1\x7d\xb2\xe4\x75\x78\x9f\x3d\xac\x0e\xc7\xf6"
+ "\xe5\x74\x78\x9f\xb3\x4c\xfb\x76\x3a\xbc\x8f\x99\xd5\xe1\xf4\x3a"
+ "\x51\x87\xf7\xcd\x11\xf2\x1a\x6e\xe4\xa4\xfb\xae\x74\xac\xc3\xfb"
+ "\xae\x61\x75\x78\xdf\x70\xaa\xb7\xfb\x16\x18\x79\x1d\xde\x37\x9a"
+ "\x1e\x7f\x34\x53\x7a\x5c\xd4\xe1\xf4\xb8\x51\xaa\xc3\x0b\x51\x87"
+ "\xf7\x2d\x77\xa2\xc3\x87\xba\xae\xc3\x07\x57\x88\x3a\x7c\x70\x85"
+ "\x63\x1d\xde\x2f\xd1\xb1\x0e\x7f\xda\x4f\xd4\xe1\x03\x85\xf7\x51"
+ "\x03\x47\x51\x1e\x18\xd8\xc6\x9a\x97\x46\x1d\x6e\xee\x9e\x6e\x10"
+ "\xf2\xd2\x45\xbb\x16\x97\x6b\x3e\xb3\xe6\xa5\x17\x80\xbe\x36\x10"
+ "\x9f\x55\xb5\x84\xa0\x06\xc7\x5a\x8c\x62\xe3\x20\xa1\x1e\x63\xc0"
+ "\xa2\x4c\xd4\xe0\x17\xe0\x9a\x2a\xd0\xe0\xa0\xa3\xff\xa7\x71\x90"
+ "\x06\xee\xa7\x82\xb9\x76\x71\xd3\xb5\x95\xd6\x6b\x51\x7b\xc3\xf5"
+ "\xc5\xa5\xa0\xc3\xf1\x3b\xf0\xfc\x17\x17\x63\x9d\x47\xdc\x11\xfe"
+ "\x5a\x68\xa3\x5c\xd4\xec\xfd\x07\xf3\x9a\xdd\x20\x68\x76\xf8\x0e"
+ "\x68\x94\xa2\x26\xcd\xde\x58\xae\x49\xad\x65\x34\xfb\xc1\xfa\x94"
+ "\xfe\x4d\xf5\x1f\xeb\x04\xad\x9e\x6a\xe1\xb5\xfa\x31\xd0\xea\x15"
+ "\x54\xab\xf7\x4f\xb6\x5e\x03\x98\xa9\xe4\xaf\xb9\xc0\x5f\x53\x0c"
+ "\xd7\x94\x0b\xd7\xec\x94\xe8\xf9\x83\x54\xcf\x0f\x18\xc0\xea\xf9"
+ "\xfe\x0d\xa8\xe7\xad\x79\x73\xd4\x2a\xd2\xdc\xb9\xc5\x5f\x2e\x77"
+ "\xfe\xe4\x1e\xdb\xdc\x79\x03\x93\x3b\x7f\xa2\xa7\x1a\x3d\x0f\xbf"
+ "\x59\x64\xd5\x8c\x2d\xa9\x17\xef\x24\x3d\x6f\x91\xe4\xce\x2d\x4c"
+ "\xee\xfc\xc9\x44\xf7\xf4\xfc\x93\x09\x52\x3d\xdf\xe0\x5e\xee\xbc"
+ "\xa8\x25\xe3\xad\xd6\xad\xe7\x9f\x9c\x2b\xcd\x9f\xa3\x9e\x17\xf3"
+ "\xe7\x03\x26\xd8\xeb\xf9\x01\x3a\x89\x9e\x3f\xa8\xd7\xf4\xdf\xc7"
+ "\xea\xf9\x67\x56\xd9\xeb\xf9\x01\xdb\xdd\xd3\xf3\x03\x8e\xbb\xa7"
+ "\xe7\x07\x1c\x73\x4d\xcf\x0f\x1c\x28\xaf\xe7\xfb\x25\x28\xeb\xf9"
+ "\x7e\x3c\x5e\x2d\xa9\xa2\xee\xc2\xf7\x8e\x81\x8b\x51\x77\x3d\x75"
+ "\x9e\xd7\x5d\x54\x87\x81\xee\x7a\xea\xf3\xd6\xa1\xe7\x9f\x0a\x96"
+ "\xd7\x58\x4f\x4d\x15\xf5\xfc\xc0\x01\xcd\xaf\xe7\x07\x0e\x90\xd7"
+ "\xf3\x4f\x1d\xa5\x7a\x67\xe0\x20\x7b\x3d\x0f\xdf\x91\xd5\xf3\x4f"
+ "\x7b\x0b\xdf\x19\xc0\xea\x79\xda\x06\x8c\xdb\xe2\xfb\x7f\x3b\x9f"
+ "\x3e\xbd\x9f\x8e\xe3\x4f\xaf\xa1\xe3\x38\xf5\xb1\xbd\x9e\x7f\x7a"
+ "\x96\x73\x3d\x4f\x31\xc5\xf7\x53\x51\xcf\x3f\x9d\x67\xaf\xe7\xfb"
+ "\x25\xa0\x9e\x97\xc7\xd5\xe0\xf5\x2c\xae\x06\x3f\xc1\xea\xf9\xa7"
+ "\xcd\xad\x47\xcf\x2b\x62\x2d\x98\xd5\xf3\x83\x8e\xaa\xd7\xf3\x83"
+ "\xbd\xd5\xe9\x79\xc4\x9f\x9c\x9e\x1f\x3c\xde\x16\x7f\xac\x9e\x1f"
+ "\x3c\x4f\x5e\xcf\x0f\x5e\xc9\xea\x79\x6c\x5f\x4e\xcf\x0f\xfe\x9c"
+ "\x69\xdf\x4e\xcf\x0f\x2e\x61\xf5\x3c\xbd\x4e\xd4\xf3\xcf\x44\x53"
+ "\xae\xed\xd7\x53\xbd\x9e\x7f\x26\xc4\xb1\x9e\x7f\x66\x2a\xab\xe7"
+ "\x9f\xe9\x4f\x75\xfb\x33\xc9\x54\xcf\x3f\x33\x9c\x1e\xef\xd7\x43"
+ "\x7a\x5c\xd4\xf3\xf4\xb8\xbd\x9e\x7f\x26\xdb\x89\x9e\xf7\x35\xe5"
+ "\x4c\xcc\x6f\xec\x31\xb1\xf0\x86\x5f\x8a\xfe\xf1\xaa\xe7\xcc\x4d"
+ "\xeb\xf4\x87\xc3\xb8\x5f\x09\x3a\x60\x3a\xd1\xe0\x5c\xf7\xb8\xa3"
+ "\x30\xbe\x4f\xa7\x75\xf0\x38\xc6\x63\xbd\x47\xde\xd2\x42\x6f\x5c"
+ "\x57\xb0\x31\x6d\x4e\xb6\xa9\xf7\xe4\x72\x1c\xeb\x1b\x72\x26\xa6"
+ "\x1a\xd3\x96\x1a\x1b\xb0\x06\x7e\x2e\xd1\xbc\x5e\x23\xaf\xd3\x96"
+ "\x55\x72\x16\xc0\xbc\xcf\xb8\x30\xaa\xd1\x4a\x74\xe7\x79\x1c\xe3"
+ "\xf8\x8f\xf3\x14\xca\xea\x2a\x78\x3d\xe0\x1b\x3e\x94\x64\xc6\x11"
+ "\xbf\xb6\x35\x44\xdb\xd6\xc3\xe3\x9e\x97\x8f\x13\x62\x06\x2d\x30"
+ "\xa2\x17\x67\x79\x7c\xe6\x50\x5c\xdb\xa6\x1d\xd5\x03\x05\xde\x26"
+ "\x41\x0f\xbc\x7f\x9d\xf4\xce\x5a\x0c\x3a\xa0\x44\xd4\x01\x0d\x56"
+ "\x9d\x26\xd1\x00\x53\x2f\x6b\x49\x56\x12\x5b\x03\x7f\x63\xbd\xa8"
+ "\x01\x70\xfc\xe7\x5e\x0f\x22\xfd\x8c\xb4\xb6\x61\xe9\x78\x5a\x03"
+ "\xdf\xbb\x8a\x68\xb6\x4e\x23\x3e\xc5\xe1\xe7\x70\xee\x78\x40\x71"
+ "\xd5\x76\xb2\x64\x14\x79\xd8\x84\x63\x7e\x12\x97\x5f\x5c\x95\x4e"
+ "\x70\xdd\x3e\xd0\x7e\x83\x32\xae\x93\x21\x38\xce\x8e\x9e\x4e\xc7"
+ "\x7e\x3a\xc6\x0e\x19\x7c\x28\xe8\x10\x51\xaf\xdb\x86\xf0\xf5\xbf"
+ "\x8a\xf3\x51\x73\x26\x16\x9a\x7a\x4c\x4c\x35\x83\x2f\xe9\x7a\x8d"
+ "\x09\x81\x96\x8f\x3f\x22\xbb\x00\x87\x9f\x9e\xab\xf6\xc0\xb5\xa7"
+ "\x71\x1f\x46\xcb\xce\xc9\xe5\x8c\x6f\x6e\x08\xbe\xb9\x41\x7d\x83"
+ "\x7e\x99\x16\x45\x70\x9d\xbf\x76\xe8\x93\x32\x63\x05\xb1\x2c\xb3"
+ "\xee\xc5\xd8\x9f\x6c\xb1\x50\x7f\x98\x6f\xe8\xda\x58\xc0\xf6\xb8"
+ "\x9e\x15\xe0\x81\xd7\x63\xab\x71\x7f\xc6\x44\x8f\xb6\xa8\xc7\x00"
+ "\xdf\xf7\x6d\x6d\x04\x3f\x9c\xa5\x7e\xe0\x92\xb4\xfc\xbf\x26\x08"
+ "\x37\xa0\xed\xee\x37\x6e\x80\x2f\x8c\x76\xbe\x08\xc5\x7d\x1c\x71"
+ "\xad\x39\xd3\x7a\xba\x9e\x1e\xef\x8b\x65\x41\x5d\x70\x2d\x0a\x7e"
+ "\x1e\xc9\x8d\x20\xe4\x4b\xed\x96\x0b\x38\xff\x85\xfa\xc0\x2c\xd8"
+ "\x1e\xf7\x74\x44\x7b\xa3\xd6\x2a\x03\x8d\xc5\xcf\xeb\x48\x79\x66"
+ "\xf7\x8d\xed\x13\x53\xb1\xee\xe4\x8a\xe6\xd9\x3d\xee\xe9\x9b\x67"
+ "\x77\xb7\xbc\xed\x03\x5b\xa1\xed\x87\x24\x88\xb6\x7f\xee\x09\xf7"
+ "\x6c\xff\x5c\xff\x96\xb7\xbd\xb6\x15\xda\xfe\x59\x93\x68\xfb\xa1"
+ "\x79\xee\xd9\x7e\xa8\xe2\xfc\x7f\xb4\x3d\xe6\x83\xac\xb9\x20\x6b"
+ "\x1e\x08\xc7\x38\x1a\x83\x8c\x9c\x29\xd6\x25\x8e\x9c\x29\xad\x4b"
+ "\xfc\xfe\x20\xe6\x48\xac\x75\x89\xc3\x9c\xe4\x7f\x46\xec\x14\xf3"
+ "\x3f\xc3\xdb\x52\xdd\xf8\xc2\x6f\x54\x37\xbe\xc0\xbf\xd3\x8a\x3d"
+ "\x45\x34\xa6\xdf\x4f\xd2\xef\x9a\x5f\xa8\xc1\x39\x39\xbb\xae\x18"
+ "\x35\xab\x6b\x41\x07\x6a\x1e\xe1\x30\xef\xb3\x66\x01\xd6\x23\xd6"
+ "\x11\xd0\x60\x8f\x5c\xd2\xbc\xd0\x0b\xd7\xef\xfa\xea\x4a\x21\x9f"
+ "\x6f\xe1\xba\x7f\x44\x76\x3e\x68\xf0\xc0\xb1\x6d\xd7\x7c\xa3\xc6"
+ "\x8a\x17\xeb\xdc\x3b\xb0\x61\xa1\xd9\x3f\x45\x7f\x75\xfb\xc4\x7c"
+ "\x6b\xfd\xa0\x29\x6f\x72\xb9\x2c\x86\x70\x4e\x1f\xe0\x08\x31\x83"
+ "\x73\xf0\xac\x78\x42\x1c\x95\x1a\xab\x09\xee\x4f\xd3\xbe\x1a\xe2"
+ "\x7d\xc0\xd0\x94\x1d\xe0\x5f\x29\x8e\x52\x15\x70\xb4\x91\xc5\xd1"
+ "\x55\x01\x47\x80\x27\x11\x47\x4d\xf3\xb9\xae\x55\xaa\xc2\x51\x8d"
+ "\x80\xa3\xf5\x36\x38\xba\x1c\x48\xbe\xaf\x3c\x25\xe0\xe8\xb9\x18"
+ "\x53\x4f\x2b\x8e\x9e\xbf\x76\x28\x0c\x70\x14\xa6\x16\x47\xcf\xd7"
+ "\xb1\x31\xeb\xa8\x0e\xf6\x31\xeb\x0b\x93\x6c\x63\x56\x6b\x8c\x7a"
+ "\xd5\x3f\x5e\x7f\x15\xe2\xd4\xba\xa6\x38\xf5\x85\x58\xf7\xf0\xfc"
+ "\xc2\x72\xd7\x6a\xbc\x5e\x38\x65\x5b\xe3\xf5\x29\x1f\xa7\x0e\x5b"
+ "\x81\x58\x93\x8f\x53\xe9\x39\xfb\xda\x9c\x11\xb1\x62\x6d\xce\x88"
+ "\x51\x77\x7e\x8d\xd7\xf0\x1a\xf9\x78\x61\xf8\x35\x5a\xe3\xf5\x42"
+ "\x65\xf3\xd7\x78\xbd\x50\x29\x1f\x97\x8e\x88\xa0\xba\xfd\x05\xbd"
+ "\x7d\x8d\x17\x7c\x47\x36\x2e\x1d\x91\x25\x7c\xa7\x92\x8d\x4b\x69"
+ "\x1b\xc0\x27\x7b\x95\xe3\xd2\x17\x43\x28\xbf\xbc\xd8\x93\xf2\x0b"
+ "\xf5\xa9\x7d\x5c\x3a\xc2\x2c\x8d\x4b\xe5\x6b\xbc\x28\x86\xf8\x7e"
+ "\x2a\xc6\xa5\x2f\x8e\xb0\x8f\x4b\x87\x25\xc8\xd7\x78\x8d\xec\x2a"
+ "\xe2\xe8\xa5\xfd\x6c\x8d\xd7\x8b\x6b\x5a\x47\x8d\x97\x22\xb6\x6a"
+ "\xd8\x1a\xaf\x97\xa6\xaa\xaf\xf1\x7a\x69\xbd\xba\x58\x14\x31\x27"
+ "\x17\x8b\xbe\x74\xca\x16\x73\x6c\x2c\xfa\x52\x83\x7c\x2c\x3a\xb2"
+ "\x03\x1b\x8b\x62\xfb\x72\xb1\xe8\xc8\x67\x99\xf6\xed\x62\xd1\x91"
+ "\x93\xd8\x58\x94\x5e\x27\xc6\xa2\x23\x4d\x94\x43\x87\xf5\x52\x1f"
+ "\x8b\x8e\xe4\xdf\x6b\xe6\x6d\xa2\xef\x6e\xd8\x38\x74\xe4\x79\x36"
+ "\x0e\x1d\x59\x40\xe3\xcd\x51\x5a\x5a\xdf\x35\xb2\x98\x1e\x1f\x16"
+ "\x24\x3d\x2e\xc6\xa1\xf4\x38\xd6\x77\xd1\xba\xae\x51\x81\xea\xe2"
+ "\xcf\x7e\x77\x60\xfc\xd9\xdf\x41\xfc\xd9\xbf\x95\xc6\x9f\x2f\xef"
+ "\x75\x2f\xfe\x7c\xb9\xa0\xe5\x75\x78\x6b\x8c\x81\x46\x0d\x10\x75"
+ "\xf8\xe8\x81\xee\xe9\x96\xd1\x03\x5a\xde\xf6\xad\x31\x06\xfa\x13"
+ "\x11\x6d\x3f\xe6\x73\xf7\x6c\x3f\x46\x71\xfd\x37\xe7\x31\x50\x88"
+ "\x4e\x8c\x81\x42\x74\xca\x31\xd0\xd8\x95\x8e\x63\xa0\x57\xf2\xc5"
+ "\x18\x68\x7c\x07\xaa\x51\x82\xaf\x51\x8d\x12\xbc\x47\x7d\x0c\x14"
+ "\xdc\xe7\x6e\x0c\xa4\x26\x06\x1a\xbd\x5c\x8c\x81\xc6\x35\xb8\x17"
+ "\x03\x8d\x33\xb2\x31\xd0\x6b\xfe\xf6\x31\x50\xb0\xdd\xfc\x6f\xe5"
+ "\x18\x28\x38\xd1\x3d\x3c\x07\x27\xb8\x16\x03\x05\x9f\x95\x8f\x81"
+ "\xc6\x26\x2b\xc7\x40\xf4\x9c\xbd\x76\x7d\x25\x51\xd4\xae\xaf\x8c"
+ "\xb9\xf3\x63\xa0\xf1\x06\x79\x9d\x3a\xbe\x81\xc6\x40\xc1\xfa\xe6"
+ "\x8f\x81\x82\xf5\xf2\x31\xd0\x2b\xf3\xa8\x5e\x0c\xae\xb2\x8f\x81"
+ "\xe0\x3b\xb2\x31\xd0\x2b\xdb\x84\xef\xe8\xd9\x18\x88\xb6\x01\x7c"
+ "\xb2\x5f\x39\x06\x7a\x75\x12\xe5\x97\x57\x7b\x51\x7e\xa1\x3e\xb5"
+ "\x8f\x81\x5e\xf5\x70\x1e\x03\x51\x0c\xf1\xfd\x54\x8c\x81\x5e\x1d"
+ "\x65\x1f\x03\x8d\x5d\x21\x1f\x03\x85\x74\x13\x71\x34\xe1\x00\x1b"
+ "\x03\xbd\xba\xbe\x75\xc4\x40\x8a\xd8\x32\xb0\x31\xd0\x84\xe9\xea"
+ "\x63\xa0\x09\xe9\xea\x62\x20\xc4\x9c\x5c\x0c\x34\xe1\xac\x2d\xe6"
+ "\xd8\x18\x68\x82\x59\x3e\x06\x0a\xf1\x67\x63\x20\x6c\x5f\x2e\x06"
+ "\x0a\x19\xc6\xb4\x6f\x17\x03\x85\x4c\x65\x63\x20\x7a\x9d\x18\x03"
+ "\xbd\x46\x28\x87\x8e\xed\xa3\x3e\x06\x0a\x39\xab\x1c\x03\x85\x5c"
+ "\x64\x63\xa0\x90\x7d\x34\xd6\x79\xcd\x8f\xc6\x40\x21\xe5\xf4\xf8"
+ "\xd8\xde\xd2\xe3\x62\x0c\x44\x8f\x8b\x31\xd0\x6b\x3d\xd4\xc5\x40"
+ "\x8f\xdc\x81\x31\x50\xa0\x83\x18\x28\xb0\x95\xc6\x40\x13\xf7\xbb"
+ "\x17\x03\x4d\xdc\x77\x57\x87\xbb\xa3\xc3\x5f\x1b\x24\xea\xf0\x49"
+ "\x83\xdd\xd3\x2d\x93\x1c\xbe\xff\x74\xac\xc3\xc3\x0d\xa2\x0e\x0f"
+ "\x37\x28\xeb\xf0\xc9\x6d\x1d\xeb\xf0\x69\x83\x44\x1d\x1e\xb6\x91"
+ "\x8e\x93\x61\xb1\x74\x9c\x0c\x7b\x56\xbd\x0e\x9f\xb2\xe7\xae\x0e"
+ "\x57\xa3\xc3\x43\xbd\x44\x1d\x3e\x25\xd1\x3d\x1d\x3e\x25\x81\xd5"
+ "\xe1\xd3\xb3\xec\x75\xf8\x94\xf3\xae\xeb\xf0\xb0\x36\xee\xe1\x39"
+ "\xcc\xc7\x35\x1d\x1e\x16\x21\xaf\xc3\x27\x6b\x95\x75\x38\x3d\x67"
+ "\xaf\x9f\xa6\xb5\x11\xf5\xd3\xd4\xe3\x77\xbe\x0e\x9f\x1a\x23\xaf"
+ "\x95\xa6\x26\x52\x1d\x1e\xa6\x6b\x7e\x1d\x1e\xa6\x93\xd7\xe1\x53"
+ "\xaf\x51\xcd\x12\x36\xd7\x5e\x87\xc3\x77\x64\x75\xf8\xb4\x5e\xc2"
+ "\x77\x74\xac\x0e\xa7\x6d\x00\x9f\x8c\x50\xd6\xe1\xd3\xce\x52\x7e"
+ "\x99\xf6\x39\xe5\x17\xea\x53\x7b\x1d\x3e\x6d\x95\x73\x1d\x4e\x31"
+ "\xc4\xf7\x53\x51\x87\x4f\x3b\x6a\xaf\xc3\x27\xfb\xca\xeb\xf0\xf0"
+ "\x1d\x22\x8e\xc2\x47\xb1\x3a\xfc\xf5\xce\xad\x43\x87\x2b\x62\x2b"
+ "\x86\xd5\xe1\xaf\x5f\x54\xaf\xc3\xc3\xbb\xaa\xd3\xe1\x88\x39\x39"
+ "\x1d\x1e\x1e\x61\x8b\x39\x56\x87\x87\xaf\x94\xd7\xe1\xe1\x59\xac"
+ "\x0e\xc7\xf6\xe5\x74\x78\xf8\x61\xa6\x7d\x3b\x1d\x1e\x7e\x9e\xd5"
+ "\xe1\xf4\x3a\x51\x87\x4f\x4f\xa6\x1c\x3a\x69\x8f\x7a\x1d\x3e\x3d"
+ "\x42\x59\x87\x4f\x7f\x9b\xd5\xe1\xd3\x87\x53\xbd\x3d\x3d\x93\xea"
+ "\xf0\xe9\xa1\xf4\xf8\xa4\xdd\xd2\xe3\xa2\x0e\xa7\xc7\x45\x1d\x3e"
+ "\x7d\xa7\x3a\x1d\xde\xfe\x0e\xd4\xe1\x5a\x07\x3a\x5c\xdb\x4a\x75"
+ "\xf8\x1b\x23\xdc\xd3\xe1\x6f\x28\xee\xff\xe9\x5c\x0b\x46\x9a\x44"
+ "\x2d\x18\x69\x52\xd6\x82\x33\x3b\x3b\xd6\x82\x3a\xc9\xfa\x00\xb3"
+ "\xb7\x53\xae\x9e\xbd\x8a\x72\xf5\xec\x51\xea\xb5\xe0\xac\x03\x77"
+ "\xb5\xa0\x1a\x2d\x38\xbd\x50\xd4\x82\xb3\xd6\xb8\xa7\x05\x67\xad"
+ "\x66\xb5\xe0\x9b\x3b\xec\xb5\xe0\xac\xdf\x5c\xd7\x82\xb3\xfd\xdd"
+ "\xd3\x82\xb3\xfd\x5c\xd3\x82\xb3\x17\xc9\x6b\xc1\x99\x5d\x94\xb5"
+ "\x20\x3d\x67\x3f\x86\xeb\xfc\xc5\x31\x7c\xce\xd9\x3b\x5f\x0b\xce"
+ "\x59\x21\x3f\x5e\xcf\x59\x43\xb5\xe0\xec\xe8\xe6\xd7\x82\xb3\xa3"
+ "\xe5\xb5\xa0\x4e\x98\xff\x3c\x3b\xc6\x5e\x0b\xc2\x77\x64\xb5\xa0"
+ "\x4e\x98\xff\x3c\x3b\x9a\xd5\x82\xb4\x0d\xe0\x13\x07\xf3\x9f\x75"
+ "\xc2\xfc\x67\x9d\x30\xff\x99\xfa\xd4\x5e\x0b\xea\xd2\x9d\x6b\x41"
+ "\x8a\x21\xbe\x9f\x8a\x5a\x50\x27\x33\xff\x79\x66\x80\xbc\x16\x8c"
+ "\xdc\x23\xe2\x28\x32\x84\xd5\x82\x11\x3d\x5b\x87\x16\x54\xc4\xd6"
+ "\x0a\x56\x0b\x46\x5c\x53\xaf\x05\x23\x7b\xa9\xd3\x82\x88\x39\x39"
+ "\x2d\x18\xb9\xc8\x16\x73\xac\x16\x8c\x5c\x2f\xaf\x05\x23\x77\xb0"
+ "\x5a\x10\xdb\x97\xd3\x82\x91\xc7\x99\xf6\xed\xb4\x60\xe4\x6f\xac"
+ "\x16\xa4\xd7\x89\x5a\xf0\xcd\x34\xca\xa1\x6f\x1c\x50\xaf\x05\xdf"
+ "\x5c\xa4\xac\x05\xdf\x8c\x65\xb5\xe0\x9b\xc1\x54\xf3\xbd\x99\x4b"
+ "\xb5\xe0\x9b\x33\xe9\xf1\x37\x0a\xa5\xc7\x45\x2d\x48\x8f\x8b\x5a"
+ "\xf0\xcd\x02\x67\x5a\xd0\xb1\x7e\x58\x38\x41\xd4\x0f\x0b\x27\x48"
+ "\xf5\xc3\x61\x46\x3f\xcc\x9d\xe4\x58\x3f\x44\x65\x8a\xfa\x61\xbe"
+ "\x99\x3e\xdf\xf3\xcf\xd2\xe7\x7b\xfe\x36\x5e\x3f\x8c\x81\x71\x1e"
+ "\xf4\x43\xde\xa5\x7c\xaa\x1f\x2e\x19\x35\xef\x5f\x11\xf4\x43\x0d"
+ "\xf1\x59\x3d\x5f\xd0\x0f\xd3\x50\x3f\xcc\xef\x8c\xfa\xc1\x37\x13"
+ "\xb4\x6a\x95\xa0\x5d\xa3\x40\xbb\x56\xc1\x67\x78\x76\xbe\x82\x36"
+ "\x4a\x41\x5f\xa6\xe2\xf7\x71\x3f\x03\x68\x8b\x9f\x97\xc9\xcf\xd9"
+ "\xd4\x7b\xe3\x3e\x39\xa8\x2d\x70\xdf\x09\xa7\x7b\x4e\x54\x09\x7b"
+ "\x4e\xcc\x64\xf7\x9c\xc0\xbd\x26\x70\xdf\x89\xcc\x05\xc4\x6f\xb3"
+ "\xa0\x29\xda\x25\x7a\xb4\xc3\x7d\x27\xda\xd5\x51\x7d\x9a\x67\x29"
+ "\xa2\xfa\x74\x61\xc0\x7d\xa0\x85\x7a\x6f\xa9\x15\xb5\xc4\x87\xa8"
+ "\x23\x16\x06\x05\xd6\x2d\x0c\x7a\xf8\xea\xd5\xa0\xee\xf6\xfb\x4d"
+ "\xd4\xf5\xc0\xf5\xf2\xcb\x62\x2a\x78\x1d\xc1\xef\x53\x30\x27\x88"
+ "\x6c\x9d\x4d\x7c\x40\x17\x7b\xf4\x05\x7d\xfa\x87\x2e\xd0\xf7\x12"
+ "\xa2\x35\x5f\x0d\xea\x22\x5d\xdb\x10\xfa\xae\xb5\x5c\x0d\x22\xc5"
+ "\xe1\x27\xf9\x39\x9a\x26\x61\x8e\xa6\x61\x61\x10\xae\xc1\x3f\x68"
+ "\xd3\x02\x89\x3e\xf5\xb7\xea\xd3\x79\xe7\xdd\xd3\xa7\xf3\xaa\x58"
+ "\x5d\x11\xed\x61\xaf\x2b\xe6\x8f\x72\x5d\x57\xcc\x9f\xe7\x9e\xae"
+ "\x98\x3f\xd7\x35\x5d\x31\xbf\xc4\x56\x57\xec\xe0\x75\xc5\xdc\x30"
+ "\xc4\xa0\xbc\xae\xa0\xe7\xec\xc7\x83\xa8\x79\xe2\x78\x10\x35\xf8"
+ "\xce\xd7\x15\x6f\x55\xca\x73\xff\x5b\xe7\xa9\xae\x98\x5f\xdc\xfc"
+ "\xba\x62\x7e\xb1\xbc\xae\x88\x12\xd6\x7f\x9b\x5f\x6e\xaf\x2b\xe0"
+ "\x3b\xb2\xba\x22\x6a\x8d\xf0\x9d\x62\x56\x57\xd0\x36\x80\x67\x76"
+ "\x28\xeb\x8a\xb7\x47\x50\xde\x79\xdb\x9f\xf2\x0e\xf5\xa9\xbd\xae"
+ "\x88\xba\xec\x5c\x57\x50\x0c\xf1\xfd\x54\xd4\x15\x6f\x0f\xb4\xd7"
+ "\x15\x73\x43\xe5\x75\xc5\xc2\xb6\x22\x8e\x16\xe4\xb1\xba\xe2\xed"
+ "\xd8\xd6\xa1\x2b\x14\xb1\x55\xc9\xea\x8a\x05\x63\xd4\xeb\x8a\x05"
+ "\x89\xea\x74\x05\x62\x4e\x4e\x57\x2c\x28\xb1\xc5\x1c\xab\x2b\x16"
+ "\x5c\x94\xd7\x15\x0b\x3d\x58\x5d\x81\xed\xcb\xe9\x8a\x85\x7d\x98"
+ "\xf6\xed\x74\xc5\xc2\x51\xac\xae\xa0\xd7\x89\xba\x62\x61\x0d\xe5"
+ "\xd0\xb9\x1e\xea\x75\xc5\xc2\x12\x65\x5d\xb1\xf0\x38\xab\x2b\x16"
+ "\xe6\x52\xfd\x10\x4d\xa8\xae\x58\xb8\x8f\x1e\x47\x0a\x15\x8f\x8b"
+ "\xba\x82\x1e\x17\x75\x45\xb4\xf6\xee\x7c\xcb\x3b\x31\xc7\xb4\x68"
+ "\x87\x7b\x63\xf8\x22\xc7\xfb\x7f\xde\x9d\x6f\xa9\xf0\xae\x37\xba"
+ "\x87\xf8\xae\xf7\x9d\x9e\xee\xe9\x96\x77\x7a\xb4\xbc\xed\x5b\x63"
+ "\xad\xf1\x22\x83\x68\xfb\x98\x6d\xee\xd9\x3e\x26\xbb\xe5\x6d\xdf"
+ "\x1a\x6b\x1c\xde\x99\x2b\xda\x7e\x69\x57\xf7\x6c\xbf\xb4\x8b\xfb"
+ "\x79\xed\x44\x49\x8d\x43\xa2\x41\x39\x2e\x5d\xfa\x9b\xe3\xb8\x34"
+ "\x5e\x52\xe3\x10\x2b\xd4\x38\xc4\x0a\x35\x0e\xb1\x7c\x8d\x43\x1c"
+ "\xc6\xa5\x1f\xa7\x1b\x3e\x5b\x50\xa0\xc1\x75\xb7\xf2\x16\x18\x35"
+ "\xe0\x13\x2f\x13\xc6\xa5\x60\xeb\x35\xfc\xfe\x0f\x07\x85\xbc\xf6"
+ "\xf2\x3d\xa5\xd5\xd2\xbd\x1f\x96\x0d\x13\xd7\xae\x3d\x48\xf0\xdc"
+ "\x57\xb5\x05\x9a\xd4\x46\x9b\x9c\x37\xb4\x19\x38\x9f\xcd\x79\x63"
+ "\xae\xbb\x41\xb2\x8f\x83\x39\x3d\x45\xef\x2c\xe7\x6d\x9b\xef\xce"
+ "\x6a\x24\x7e\xad\x37\xe7\x1d\x53\x2d\xe6\xbc\x97\xbb\x59\xff\xb0"
+ "\xdc\xa6\xfe\x21\x49\xa6\xfe\x61\xb9\x8a\xfa\x87\x58\x37\xeb\x1f"
+ "\x62\x5d\xac\x7f\x88\xb5\xab\x7f\xa0\xb1\xe9\xd2\xba\x38\xc5\xd8"
+ "\x94\x9e\xb3\x8f\x29\xe2\x25\xf5\x0f\x71\xad\xa0\xfe\x21\x4e\xe1"
+ "\x1d\x75\x9c\x50\xff\x10\x7b\x0b\xea\x1f\x62\x15\xea\x1f\xe2\x84"
+ "\xfa\x87\x58\x99\xfa\x87\x58\x85\xfa\x87\x78\xa1\xfe\x21\xd6\xa6"
+ "\xfe\x21\x56\xa8\x7f\x88\x77\x50\xff\x10\x2f\xd4\x3f\xc4\x0b\xf5"
+ "\x0f\xd4\xa7\xf6\xb1\x69\xbc\x0b\xf5\x0f\xb1\x42\xfd\x43\xac\x83"
+ "\xfa\x87\x78\x99\xfa\x87\xa5\x06\xf9\xd8\x34\x51\x52\xff\x90\x68"
+ "\x53\xff\x90\xd0\x4a\xea\x1f\x14\xb1\x65\x53\xff\x90\xe0\x46\xfd"
+ "\x43\xa2\xca\xfa\x87\x58\x85\xfa\x87\xc4\x08\x5b\xcc\xb1\xb1\x69"
+ "\xa2\x42\xfd\x43\xa2\x4d\xfd\x43\xac\x42\xfd\x43\xe2\x61\xa6\x7d"
+ "\xbb\xd8\x34\xd1\xa6\xfe\x21\xd6\xa6\xfe\x21\x49\xa8\x7f\x58\xba"
+ "\x51\x7d\x6c\x9a\xe4\xa0\xfe\x21\xc9\xa6\xfe\x21\x49\xa8\x7f\x48"
+ "\x12\xea\x1f\x92\x84\xfa\x87\xa5\x19\xd2\xe3\x62\x6c\x4a\x8f\x8b"
+ "\xb1\x69\x92\xca\xfa\x87\xbb\x73\x31\x6f\x4f\x6c\xba\xc2\xcd\xfa"
+ "\x87\x15\x0e\xeb\x1f\xee\xc6\x47\x4a\x1a\x3d\xa9\x50\xd4\xe8\x2b"
+ "\x0f\xb8\xa7\x5b\x56\x16\xb6\xbc\xed\x5b\x63\x7c\xb4\x62\xb5\x68"
+ "\xfb\x3f\x3f\xeb\x9e\xed\xff\x3c\xc4\xfd\xf8\x68\x9d\x56\x8c\x8f"
+ "\xd6\x69\x95\xe3\xa3\xe4\x0e\x8e\xe3\xa3\xd5\xa1\x62\x7c\x94\xb2"
+ "\x97\x6a\x94\x94\x2c\xaa\x51\x52\xa6\xaa\x8f\x8f\x56\x1d\x67\xe3"
+ "\xa3\xe4\xe9\x77\xe3\x23\x77\xe3\xa3\xf7\x7c\xc4\xf8\x68\xd5\x36"
+ "\xf7\xe2\xa3\x55\xd9\x6c\x7c\xb4\x6e\xbf\x7d\x7c\x94\xe2\xed\x7a"
+ "\x7c\x94\xd2\xcb\x3d\xac\xa7\x04\xb9\x16\x1f\xa5\xac\x92\x8f\x8f"
+ "\x92\xfd\x94\xe3\x23\x7a\xce\x5e\xd7\xae\xee\x25\xea\xda\xf7\xaf"
+ "\xdd\xf9\xf1\xd1\xfb\x19\xf2\x1a\xf6\xfd\x6d\x34\x3e\x4a\x49\x6e"
+ "\xfe\xf8\x28\x25\x59\x3e\x3e\x5a\xed\x4f\xb5\x64\xca\x6a\xfb\xf8"
+ "\x08\xbe\x23\x1b\x1f\xad\x1e\x25\x7c\x27\x99\x8d\x8f\x68\x1b\xc0"
+ "\x35\xb3\x94\xe3\xa3\x35\x1e\x94\x7b\x56\x1f\xa5\xdc\x43\x7d\x6a"
+ "\x1f\x1f\xad\xde\xe1\x3c\x3e\xa2\x18\xe2\xfb\xa9\x18\x1f\xad\xfe"
+ "\xcd\x3e\x3e\x4a\xd6\xca\xc7\x47\x6b\x0f\x8b\x38\x5a\x1b\xc1\xc6"
+ "\x47\x6b\x06\xb7\x8e\xf8\x48\x11\x5b\x19\x6c\x7c\xb4\xb6\x8d\xfa"
+ "\xf8\x68\xed\xb3\xea\xe2\x23\xc4\x9c\x5c\x7c\xb4\x76\x95\x2d\xe6"
+ "\xd8\xf8\x68\xed\x76\xf9\xf8\x68\xed\x7e\x36\x3e\xc2\xf6\xe5\xe2"
+ "\xa3\xb5\x17\x99\xf6\xed\xe2\xa3\x75\xde\x6c\x7c\x44\xaf\x13\xe3"
+ "\xa3\x75\xb9\x94\x43\xff\xbc\x57\x7d\x7c\xb4\x6e\x95\x72\x7c\xb4"
+ "\x6e\x3d\x1b\x1f\xad\x9b\x49\xe3\xa0\x75\xfb\x68\x7c\xb4\x2e\x86"
+ "\x1e\xff\x73\x81\xf4\xb8\x18\x1f\xd1\xe3\x62\x7c\xb4\xae\xf8\xee"
+ "\x3c\xcd\x3b\x31\x3e\x5a\x3f\xcb\xbd\xf8\x68\xfd\xcc\xbb\x1a\xdd"
+ "\x1d\x8d\xbe\x4e\x2f\x6a\xf4\x0f\xce\xba\xa7\x5b\x3e\xd0\xbb\xaf"
+ "\xd1\x37\xed\x16\x35\xfa\xa6\xdd\xca\x1a\xfd\xc3\x3d\x8e\x35\xfa"
+ "\x47\x26\x51\xa3\x6f\x98\x4a\xc7\xc9\x0d\xc2\xbe\x9d\x1b\x3c\xd4"
+ "\x6b\xf4\xf4\x25\xac\x46\x4f\xf3\xbe\xab\xd1\xdd\xd5\xe8\xeb\x77"
+ "\x8a\x1a\x3d\x7d\x84\x7b\x1a\x3d\x7d\x38\xab\xd1\x37\x4f\xb7\xd7"
+ "\xe8\xe9\x3b\x5c\xd7\xe8\xe9\x25\xee\x61\x3d\xbd\xd8\x35\x8d\xbe"
+ "\xa1\x8f\xbc\x46\xff\xb0\x40\x59\xa3\xd3\x73\xf6\xda\xea\xa3\x12"
+ "\x51\x5b\x7d\xb4\xf1\xce\xd7\xe8\x1f\x0d\x91\xd7\x51\x1f\x8d\xa0"
+ "\x1a\x7d\x43\xef\xe6\xd7\xe8\x1b\x7a\xcb\x6b\xf4\x8f\x84\xfd\x7f"
+ "\x37\xf4\xb7\xd7\xe8\xf0\x1d\x59\x8d\xfe\xd1\x65\xe1\x3b\xbd\x59"
+ "\x8d\x4e\xdb\x38\xa7\xc9\x68\xa3\xac\xd1\x33\x84\x79\x41\x19\x8b"
+ "\x28\xf7\x50\x9f\xda\x6b\xf4\x8c\x31\xce\x35\x3a\xc5\x10\xdf\x4f"
+ "\x45\x8d\x9e\x91\x6e\xaf\xd1\x3f\xdc\x2d\xaf\xd1\x37\x49\xea\x34"
+ "\x37\xb5\x65\x35\x7a\xc6\xa9\xd6\xa1\xd1\x15\xb1\x35\x84\xd5\xe8"
+ "\x1b\xf3\xd4\x6b\xf4\x8d\x67\xd5\x69\x74\xc4\x9c\x9c\x46\xdf\xd4"
+ "\xc7\x16\x73\xac\x46\xdf\x34\x4a\x5e\xa3\x6f\x9a\xce\x6a\x74\x6c"
+ "\x5f\x4e\xa3\x6f\x5a\xc3\xb4\x6f\xa7\xd1\x37\xed\x60\x35\x3a\xbd"
+ "\x4e\xd4\xe8\x9b\x47\x53\x0e\xfd\x70\xaa\x7a\x8d\xbe\xb9\x8f\xb2"
+ "\x46\xdf\x3c\x90\xd5\xe8\x9b\x7d\xa8\x16\xdf\x1c\x4e\x35\xfa\xe6"
+ "\x2e\xf4\xf8\x87\x61\xd2\xe3\xa2\x46\xa7\xc7\x45\x8d\xbe\x39\xea"
+ "\xee\x1c\xce\x3b\x51\xa3\x67\xb5\x71\x4f\xa3\x67\xf9\xb8\xaf\x13"
+ "\x73\x2a\x45\x9d\x98\x53\xa9\xac\x13\xb3\x4e\x39\xd6\x89\x1f\xf7"
+ "\x10\x75\x62\xf6\x4a\xca\xd5\xd9\x11\x94\xab\xb3\x7b\xa9\xd7\x89"
+ "\x5b\xb7\xb1\x3a\x71\x4b\x9f\xbb\x3a\xd1\x5d\x9d\xb8\x79\x85\xa8"
+ "\x13\xb7\xce\x73\x4f\x27\x6e\x9d\xcb\xea\xc4\xed\x32\x7b\x65\x6d"
+ "\x3d\xea\xba\x4e\xdc\x7a\xcd\x3d\x9d\xb8\xb5\xce\x35\x9d\x98\x1d"
+ "\x22\xaf\x13\xb3\xf4\xca\x3a\x91\x9e\xb3\x1f\xdf\xb7\x5d\x13\xc7"
+ "\xf7\x6d\x07\xee\x7c\x9d\xb8\x6d\xa6\xfc\x58\xbe\x6d\x1e\xd5\x89"
+ "\xd9\x13\x9a\x5f\x27\x66\x4f\x90\xd7\x89\xdb\x84\xf5\xcf\xb2\x43"
+ "\xed\x75\x22\x7c\x47\x56\x27\x7e\x2c\xe4\x7f\xb3\x27\xb0\x3a\x91"
+ "\xb6\x01\x5c\xf3\x84\xb2\x4e\xfc\xb8\x84\x72\xcf\xc7\xc2\x7b\x24"
+ "\xea\x53\x7b\x9d\xf8\xf1\x22\xe7\x3a\x91\x62\x88\xef\xa7\xa2\x4e"
+ "\xfc\x78\xbf\xbd\x4e\xcc\xaa\x94\xd7\x89\x39\xe9\x22\x8e\x72\x06"
+ "\xb2\x3a\xf1\x7f\xbc\x5b\x87\x4e\x54\xc4\xd6\x4c\x56\x27\xfe\xcf"
+ "\x71\xf5\x3a\x31\xa7\x8d\x3a\x9d\x88\x98\x93\xd3\x89\x39\x21\xb6"
+ "\x98\x63\x75\x62\xce\xdb\xf2\x3a\x31\x67\x15\xab\x13\xb1\x7d\x39"
+ "\x9d\x98\xb3\x87\x69\xdf\x4e\x27\xe6\x1c\x65\x75\x22\xbd\x4e\xd4"
+ "\x89\xdb\x85\x3d\xb0\xb2\x56\xaa\xd7\x89\xdb\x43\x94\x75\xe2\x76"
+ "\x9b\xfd\xaf\xb6\x0b\xfb\x5f\x6d\x4f\xa6\x3a\x71\xbb\xb0\xff\x55"
+ "\xd6\x0a\xe9\x71\x51\x27\xd2\xe3\xa2\x4e\xdc\x9e\x71\x73\xf3\x3b"
+ "\xf3\x82\x45\x6d\x91\x17\xac\xac\x2d\xfe\x32\xd8\xb1\xb6\xf8\x24"
+ "\x43\xd4\x16\xb9\x0d\xf4\xf9\xce\x3d\x45\x9f\xef\x5c\xbe\x3e\x29"
+ "\xb6\x04\xb4\x45\xf7\x74\xc3\xae\x2b\xf9\xbc\xb6\xf8\x6c\xbe\x51"
+ "\x03\x7a\xcf\xcb\x82\xda\x02\x74\xdd\xea\xc5\xa8\x2d\xaa\x84\xf9"
+ "\x9d\xb9\xfe\x25\x31\x52\x6d\xf1\x97\x35\xfc\x5c\x4f\xd4\x17\x75"
+ "\x46\xfe\x3a\x3c\x2f\x37\xf7\x73\xff\x7c\x61\xee\x27\xb4\x2d\x9d"
+ "\xf3\xc9\xcf\x03\xbd\x02\xda\x63\x06\xf8\x43\xa2\x3d\xee\xce\xfd"
+ "\xc4\xb1\xfe\x7f\xcf\xba\xa7\x6b\xff\x57\xcf\x6a\x8e\x3c\xb3\xbd"
+ "\xe6\xc8\x1d\xe1\xba\xe6\xc8\x8d\x70\x4f\x73\xe4\xea\x5c\xd3\x1c"
+ "\xb9\x87\xe5\x35\xc7\x5f\x86\x20\x3e\xe5\x35\x07\x3d\x67\x3f\x56"
+ "\x7c\x12\x21\x8e\x15\x9f\x0c\xbc\xf3\x35\xc7\x8e\x0a\xf9\x71\x61"
+ "\xc7\x59\xaa\x39\x72\x8b\x9a\x5f\x73\xe4\x16\xc9\x6b\x8e\x4f\x04"
+ "\xfe\xcf\x2d\xb6\xd7\x1c\xf0\x1d\x59\xcd\xf1\x89\xf0\xfe\x2f\xb7"
+ "\x88\xd5\x1c\xb4\x0d\xe0\xa0\xed\xca\x9a\xe3\xd3\x61\x94\x93\x3e"
+ "\xed\x40\x39\x89\xfa\xd4\x5e\x73\x7c\x72\xd1\xb9\xe6\xa0\x18\xe2"
+ "\xfb\xa9\xa8\x39\x3e\x7d\xc2\x5e\x73\xfc\x65\x90\xbc\xe6\xc8\x93"
+ "\xd4\x69\xef\xdc\xc1\x6a\x8e\x4f\x97\xb4\x0e\xcd\xa1\x88\xad\x0a"
+ "\x56\x73\xec\x1c\xa5\x5e\x73\xec\x8c\x55\xa7\x39\x10\x73\x72\x9a"
+ "\x63\xe7\x61\x5b\xcc\xb1\x9a\x63\xe7\x79\x79\xcd\xb1\xd3\xcc\x6a"
+ "\x0e\x6c\x5f\x4e\x73\xe4\xf5\x62\xda\xb7\xd3\x1c\x79\x23\x58\xcd"
+ "\x41\xaf\x13\x35\x47\x5e\xb5\x10\xb7\x9d\x55\xaf\x39\xf2\x0e\x2b"
+ "\x6b\x8e\xbc\xa3\xac\xe6\xc8\xcb\xa1\xda\x22\xcf\x44\x35\x47\x5e"
+ "\x81\xa0\x45\xf4\xd2\xe3\xa2\xe6\xa0\xc7\x45\xcd\xb1\xcb\x57\x45"
+ "\x6e\xaa\x4a\xcd\xdc\xcf\xbc\xeb\x6c\x6e\xca\x9a\x97\x32\xf5\x9e"
+ "\x7c\xac\x29\x37\x05\x63\xbd\xd2\x9e\xe8\x98\x9b\xc2\xb1\x5b\xcc"
+ "\x4d\x9d\xe2\xb9\x4a\xcc\x4d\xe9\xf9\xdc\x14\xe6\xa5\x20\x66\x6f"
+ "\xca\x4b\x59\xde\xb1\x9f\xf7\x99\x67\x51\x9f\x97\x9a\xf6\xb6\x96"
+ "\x6c\xe1\xc7\x6f\x63\x26\xcd\x4b\x55\x34\xe5\xa5\x70\xdc\x36\xd7"
+ "\xdb\xe7\xa5\x70\xbc\x16\xf3\x52\x27\xdd\xcc\x4b\x7d\xb6\xcd\xbd"
+ "\xf1\xfb\xb3\x3b\x60\xfe\x5b\x6b\x9c\xf7\xb9\x2b\x50\x7c\x77\xfc"
+ "\xb9\x9b\xf3\xdf\x3e\x77\x38\xff\xed\x6e\x5d\xb3\x92\xed\x3f\xab"
+ "\x16\x6d\xff\xd7\x8d\xee\xd9\xfe\xaf\x19\x2d\x6f\xfb\xd6\x58\x33"
+ "\xf1\xf9\x4c\xd1\xf6\xbb\xdd\x5c\xff\x6d\xb7\x9f\xfb\xb9\xf0\x7d"
+ "\xbe\x62\xbc\xba\xcf\x57\x1a\xaf\x16\x0d\x97\xc6\xab\xbb\x2f\x3a"
+ "\x8e\x57\xf7\x4e\x10\xe3\xd5\x2f\xf6\x50\x6d\xf8\xc5\x46\xaa\x0d"
+ "\xbf\xe0\xf7\x24\x8b\x1d\x46\xf8\x38\xd5\x84\x31\x6b\xa4\x51\xb3"
+ "\xeb\x52\xa1\xc6\x94\x44\x63\xd5\x32\x53\x31\x29\x31\x18\xc9\xfb"
+ "\x8b\x89\xd7\xaa\x2b\xc4\xeb\x93\x5a\xa3\xa6\xfd\x5c\xe2\x03\xe3"
+ "\x04\x68\xa9\x62\xd0\x16\x59\x24\x2a\x0e\xe3\xd8\xbf\x1d\x2d\x8b"
+ "\x32\x48\xe2\xd8\x3d\xe3\xc5\x18\x16\xae\x8b\x32\x92\xaf\x23\x0b"
+ "\x35\x18\xab\xde\x48\x4f\xd1\xdf\xe8\x33\xb9\x9c\x5f\xb3\x48\x9a"
+ "\x2f\x87\xdf\x0e\x9c\xc6\xe6\xcb\x1b\xd3\x53\xaa\x1a\xf2\x26\x1f"
+ "\xe3\xd7\x43\xec\x29\xe6\xcd\x5d\xcd\x97\x6f\x6e\x24\x7e\xd6\xf5"
+ "\x10\x71\x5c\x6c\x7d\xf9\xf2\xbf\xea\xc5\x7c\xf9\xdf\xb2\xdc\xcb"
+ "\x97\xff\x2d\x93\x8d\x5d\xf7\xed\xb5\x8f\x5d\xbf\xf0\x70\x3d\x76"
+ "\xfd\xc2\xcd\xf9\xff\x5f\xf4\x70\x2d\x76\xfd\x62\xa5\x6d\xec\x9a"
+ "\x1b\x87\xb1\xeb\xee\x1a\xc4\xaa\x7c\xec\x4a\xcf\xd9\xc7\x1c\x7b"
+ "\x7b\x8a\x31\x47\xc1\x6f\x77\x7e\xec\x5a\x90\x26\x1f\x5f\x14\x64"
+ "\xd1\xd8\xf5\x8b\x15\xcd\x1f\xbb\x7e\xb1\x42\x3e\x76\xdd\xdb\x81"
+ "\xea\xfc\x2f\x56\x58\xe3\x50\x31\x76\x85\xef\xc8\xc6\xae\x7b\x47"
+ "\xd8\x7e\x87\xc6\xae\x5f\x24\xd3\xd8\x75\xef\x74\xe5\xd8\x75\xaf"
+ "\xb0\x5e\xda\xde\x12\xca\x4f\xd4\xa7\xf6\xb1\xeb\xde\xed\xce\x63"
+ "\x57\x8a\x21\xbe\x9f\x8a\xb1\xeb\xde\xcb\xf6\xb1\xeb\xee\x6a\xf9"
+ "\xd8\xf5\xef\x87\x44\x1c\xfd\x7d\x16\x1b\xbb\x7e\x39\xb0\x75\xc4"
+ "\xae\x8a\xd8\x4a\x63\x63\xd7\xbf\x7b\xab\x8f\x5d\xff\x3e\x58\x5d"
+ "\xec\x8a\x98\x93\x8b\x5d\xff\xbe\x52\xc0\x4f\xb2\x7c\xec\xfa\xf7"
+ "\x6d\xf2\xb1\xeb\xdf\xf7\xb2\xb1\x2b\xb6\x2f\x17\xbb\xfe\xfd\x3c"
+ "\xd3\xbe\x5d\xec\xba\xcf\x83\x8d\x5d\xe9\x75\x62\xec\xba\x2f\x87"
+ "\x72\xe8\xee\xf5\xea\x63\xd7\x7d\x2b\x95\x63\xd7\x7d\x6b\xd8\xd8"
+ "\x75\x5f\x38\x8d\x51\xf7\x15\xd0\xd8\x75\x5f\x34\x3d\xbe\x3b\x55"
+ "\x7a\x5c\x8c\x5d\xe9\x71\x31\x76\xdd\x57\xa4\x22\x76\xad\x6e\xa6"
+ "\xd8\xb5\xa2\x75\xc5\xae\x8d\x61\xb7\x37\x76\xfd\x6a\xaa\x7b\xb1"
+ "\xeb\x57\x61\x2e\x6a\xf8\x2a\x27\x1a\xfe\xd8\x7f\x96\x86\xdf\x57"
+ "\x29\x6a\xf8\xaf\x4f\xb8\xa7\x59\xbe\xae\x68\x69\xdb\xb7\x3e\xbb"
+ "\x7f\x95\x23\xda\xfd\xc0\x78\xf7\xec\x7e\x20\xf8\x6e\xdc\xea\x8e"
+ "\xed\x0b\x25\xf9\x9a\x7f\xb8\x59\xff\xfc\x8f\x62\xf7\xe3\xd6\x23"
+ "\xd5\x62\xdc\x7a\xa4\x5a\x1a\xb7\x7e\xcb\xbc\x67\xfd\x66\x9b\xe3"
+ "\xb8\xb5\xa8\xbf\x18\xb7\x7e\xbb\x9e\xea\xc2\x6f\x85\x7a\xdb\x6f"
+ "\x79\xbd\xb5\x7c\x0f\x8d\x5b\xaf\x63\xdc\x7a\x01\xe2\xd6\xd9\xe1"
+ "\x1a\x93\xb0\x06\x3f\xd6\x65\x95\x40\xec\x89\xb1\x6a\x59\x0c\xfc"
+ "\x3f\xda\x40\xde\x5f\x40\xbc\x52\x20\xe6\xdc\x01\xe3\xd7\x8e\xc5"
+ "\x06\x4d\x72\x24\x70\x7f\x45\x1e\x69\xaf\x83\x78\xb6\x16\xe3\xd9"
+ "\x83\x10\xab\xae\x14\xe2\xd9\x43\x79\x65\xd1\xd2\x78\xf6\x60\x37"
+ "\x3e\x9e\x35\xd0\x9a\xaf\xb2\x68\x88\x67\xe1\xf7\x70\x4d\x7f\x69"
+ "\x3c\xdb\x00\xf1\x6a\x23\xc4\xab\xa9\x97\x6c\x62\xdb\xd9\xf6\xb1"
+ "\x6d\x83\x7f\x4a\xb5\xb1\xcf\xe4\x0a\x8c\x6d\xaf\x6f\xff\x4f\x8c"
+ "\x6d\x0f\x64\x88\xb1\xed\xa1\x25\xee\xc5\xb6\x88\x70\x69\x6c\xfb"
+ "\x7d\xba\x7d\x6c\x7b\xe8\x94\xeb\xb1\xed\xb7\x1e\xee\x3d\x33\xdf"
+ "\x12\xd7\x62\xdb\x6f\xa7\xdb\xc6\xb6\x7f\xe1\xdf\xcb\x7e\x93\x83"
+ "\x78\x96\x8f\x6d\xe9\x39\xfb\x98\xa4\xc8\x43\x8c\x49\xbe\x2b\xb9"
+ "\xf3\x63\xdb\xef\xa2\xe4\xe3\x8f\xef\x96\xd0\xd8\xf6\xdb\xf0\xe6"
+ "\x8f\x6d\xbf\x0d\x97\x8f\x6d\xbf\x13\xea\xff\xbf\x0d\xb7\x8f\x6d"
+ "\xe1\x3b\xb2\xb1\x6d\x51\x37\xdb\xef\xd0\xd8\xf6\xdb\x99\x34\xb6"
+ "\x2d\x7a\x56\x39\xb6\x2d\x3a\x41\x39\xac\x68\x07\xe5\x30\xea\x53"
+ "\xfb\xd8\xb6\x28\xd1\x79\x6c\x4b\x31\xc4\xf7\x53\x31\xb6\x2d\x3a"
+ "\x6c\x1f\xdb\x7e\x93\x2d\x1f\xdb\x1e\xd9\x26\xe2\xe8\xc8\x30\x36"
+ "\xb6\x3d\xdc\xa1\x75\xc4\xb6\x8a\xd8\x8a\x62\x63\xdb\xc3\x67\xd5"
+ "\xc7\xb6\x47\xfc\xd5\xc5\xb6\x88\x39\xb9\xd8\xf6\xc8\x74\x01\x3f"
+ "\x33\xe5\x63\xdb\x23\xb1\xf2\xb1\xed\x91\x74\x36\xb6\xc5\xf6\xe5"
+ "\x62\xdb\x23\x07\x98\xf6\xed\x62\xdb\x23\xa7\xd8\xd8\x96\x5e\x27"
+ "\xc6\xb6\xdf\x27\x50\x0e\xfd\x66\x94\xfa\xd8\xf6\xfb\xe9\xca\xb1"
+ "\xed\xf7\x11\x6c\x6c\xfb\xfd\x10\x1a\xc3\x7e\x9f\x46\x63\xdb\xef"
+ "\x83\xe9\xf1\x6f\x46\x4a\x8f\x8b\xb1\x2d\x3d\x2e\xc6\xb6\xdf\xe7"
+ "\xa8\x7b\x2f\x7b\x53\xeb\x1e\x1d\xbb\xfd\x73\x06\x9a\x6b\xdd\x23"
+ "\xeb\xbb\xd9\xdb\x35\x67\xa0\xe4\x59\xf7\xe2\xdb\x12\x87\xeb\xbf"
+ "\xdc\x8d\xb1\xe4\x74\xfe\xf7\x05\xa2\xce\x2f\xdd\xe3\x9e\x66\x29"
+ "\xdd\x7d\x37\xc6\x72\xc7\xf6\x25\x2b\x44\xdb\x97\x3f\xe1\x9e\xed"
+ "\xcb\xfb\xbb\x1f\x63\x55\x04\x89\x31\x56\x45\x90\xf2\xbb\xc1\xa3"
+ "\xde\x8e\x63\xac\xe3\x51\x62\x8c\xf5\xe3\x51\xaa\x4f\x7e\xdc\x43"
+ "\xf5\xc9\x8f\x8b\x9a\xef\xdd\xe0\x0f\x97\xd9\x77\x83\x47\xe7\xdd"
+ "\x7d\x37\xd8\x1c\xf1\x53\xa9\x49\x8c\x9f\x7e\xd8\xeb\x5e\xfc\xf4"
+ "\x43\x01\x1b\x3f\x55\x1c\xb7\x8f\x9f\x7e\xec\xea\x7a\xfc\xf4\xe3"
+ "\x30\xf7\x9e\x87\x1f\x87\xba\x16\x3f\xfd\xb8\x4d\xfe\xdd\xe0\x51"
+ "\x1f\xe5\x77\x83\xf4\x9c\xbd\xee\x3d\x3e\x4c\xd4\xbd\xc7\xdb\xde"
+ "\xf9\xf1\xd3\xb1\x7c\x79\x8d\x7b\x6c\x2f\x8d\x9f\x7e\xcc\x6e\xfe"
+ "\xf8\xe9\xc7\x6c\xf9\xf8\xe9\xb8\x30\xff\xf5\xc7\x6c\xfb\xf8\x09"
+ "\xbe\x23\x1b\x3f\x1d\x9f\x6e\xfb\x1d\x1a\x3f\xfd\x98\x43\xe3\xa7"
+ "\xe3\xb1\xca\xf1\xd3\x3f\x3b\x53\x7e\x3a\x7e\x91\xf2\x13\xf5\xa9"
+ "\x7d\xfc\x74\xfc\x80\xf3\xf8\x89\x62\x88\xef\xa7\x62\xfc\xf4\xcf"
+ "\x36\xf6\xf1\xd3\x51\x2f\xf9\xf8\xe9\xa7\xb3\x22\x8e\x7e\x4a\x64"
+ "\xe3\xa7\x7f\x8e\x6f\x1d\xf1\x93\x22\xb6\xf2\xd9\xf8\xe9\xa7\x6e"
+ "\xea\xe3\xa7\x9f\x42\xd4\xc5\x4f\x88\x39\xb9\xf8\xe9\xa7\x6d\x02"
+ "\x7e\x72\xe4\xe3\xa7\x9f\xf6\xcb\xc7\x4f\x3f\x1d\x67\xe3\x27\x6c"
+ "\x5f\x2e\x7e\xaa\xf0\x60\xda\xb7\x8b\x9f\x2a\xba\xb2\xf1\x13\xbd"
+ "\x4e\x8c\x9f\x2a\x0a\x29\x87\x96\xe7\xa9\x8f\x9f\x2a\xb6\x29\xc7"
+ "\x4f\x15\x3b\xd8\xf8\xa9\x62\x39\x8d\x93\x2a\x8e\xd1\xf8\xa9\x22"
+ "\x95\x1e\x2f\xdf\x29\x3d\x2e\xc6\x4f\xf4\xb8\x18\x3f\x55\x54\xa9"
+ "\x8b\x9f\x5c\x5f\x17\xa9\xe5\xeb\x5a\x03\x5b\x69\x5d\xeb\xc9\x25"
+ "\xee\xc5\x4e\x27\x63\xee\x6a\x78\x77\x34\x7c\x85\x51\xd4\xf0\xff"
+ "\x72\x73\xfe\xef\xbf\xea\xdc\xd7\xf0\x3f\xd7\x88\x1a\xfe\xe7\x1a"
+ "\x65\x0d\x5f\x79\xd8\xb1\x86\x3f\x3b\x40\xd4\xf0\x67\xd2\xe9\x18"
+ "\x79\x66\x09\x1d\x23\xcf\x0c\x6e\x3e\x0d\x7f\xfa\x73\x56\xc3\x9f"
+ "\x7a\xe2\xae\x86\x6f\x0e\x0d\x7f\x52\xb2\xdf\xf1\xe9\x58\xf7\x34"
+ "\xfc\xe9\xe5\xac\x86\xaf\xda\x68\xaf\xe1\x4f\x9f\x75\x5d\xc3\x9f"
+ "\xf1\x76\xef\x79\x38\xe3\xe5\x9a\x86\x3f\x33\x4b\x5e\xc3\x57\x16"
+ "\x2b\x6b\x78\x7a\xce\x5e\x7b\x9d\xf5\x16\xb5\x97\xfe\xe8\x9d\xaf"
+ "\xe1\xf5\xd1\xf2\x3a\x4b\x1f\x4b\x35\xfc\x99\x99\xcd\xaf\xe1\xcf"
+ "\xcc\x94\xd7\xf0\xfa\xdf\xa8\xde\x39\x33\xd3\x5e\xc3\xc3\x77\x64"
+ "\x35\xfc\xd9\x9e\xb6\xdf\xa1\x1a\xfe\x8c\x8e\x6a\xf8\xb3\xc3\x94"
+ "\x35\xfc\xd9\x53\x94\x9f\xce\xe6\x51\x7e\xa2\x3e\xb5\xd7\xf0\x67"
+ "\x57\x3a\xd7\xf0\x14\x43\x7c\x3f\x15\x35\xfc\xd9\x12\x7b\x0d\x5f"
+ "\x59\x24\xaf\xe1\x7f\xde\x2e\xe2\xe8\xe7\x11\xac\x86\x3f\xe7\xdf"
+ "\x3a\x34\xbc\x22\xb6\xa2\x59\x0d\x7f\xee\xbc\x7a\x0d\xff\x73\x67"
+ "\x75\x1a\x1e\x31\x27\xa7\xe1\x7f\x9e\x25\xe0\x47\x27\xaf\xe1\x7f"
+ "\x4e\x94\xd7\xf0\x3f\x6f\x64\x35\x3c\xb6\x2f\xa7\xe1\x7f\x3e\xc4"
+ "\xb4\x6f\xa7\xe1\x7f\x3e\xcb\x6a\x78\x7a\x9d\xa8\xe1\xab\x56\x50"
+ "\x0e\xad\x7c\x5b\xbd\x86\xaf\x9a\xa5\xac\xe1\xab\xe6\xb1\x1a\xbe"
+ "\x6a\x28\xd5\xea\x55\x19\x54\xc3\x57\x4d\xa0\xc7\x2b\xa3\xa4\xc7"
+ "\x45\x0d\x4f\x8f\x8b\x1a\xbe\x2a\xf7\xee\xba\x49\x77\xe2\xba\x49"
+ "\x17\x86\xb9\xa7\xe3\x2f\x0c\x75\x5f\x4b\x5e\xf1\x13\xb5\xe4\x15"
+ "\x3f\xa9\x96\x64\xd7\x36\xf8\xb7\xbf\x63\x2d\xf9\x4b\x98\xa8\x25"
+ "\x2f\xee\xa7\x5c\x7d\x71\x1b\xe5\xea\x8b\xfc\xfb\x3d\x75\xeb\x26"
+ "\x55\x9f\x60\xd7\x4d\xfa\xf7\xac\xbb\xeb\x26\xb9\xab\x13\xab\xf6"
+ "\x89\x3a\xb1\x7a\xbb\x7b\x3a\xb1\x3a\x87\xd5\x89\x57\x0e\xd8\xeb"
+ "\xc4\x8b\x6d\x5c\xd7\x89\x17\xfb\xb8\xa7\x13\x2f\xf6\x76\x4d\x27"
+ "\x5e\x5c\x23\xbf\x86\xc1\xbf\x03\x94\xd7\x4d\xa2\xe7\xec\xc7\xf7"
+ "\x5f\xfa\x88\xe3\xfb\xa5\x86\x3b\x5f\x27\x5e\xca\x94\x1f\xcb\x2f"
+ "\x6d\xa7\x3a\xf1\xe2\xea\xe6\xd7\x89\x17\x57\xcb\xeb\xc4\x5f\x3a"
+ "\xd3\x31\xf5\x62\xaa\xfd\x1a\x06\xf0\x1d\x59\x9d\xf8\xcb\x18\xe1"
+ "\x3b\xab\x59\x9d\x48\xdb\x00\xae\x89\x50\xd6\x89\x35\xde\x94\x7b"
+ "\x7e\x39\x4e\xb9\x87\xfa\xd4\x5e\x27\xfe\x92\xe7\x5c\x27\x52\x0c"
+ "\xf1\xfd\x54\xd4\x89\xbf\x5c\xb3\xd7\x89\xff\xf6\x93\xd7\x89\x97"
+ "\x25\xeb\xb4\x5e\x9e\xc7\xea\xc4\x9a\x67\x5b\x87\x4e\x54\xc4\x56"
+ "\x26\xab\x13\x2f\xb7\x55\xaf\x13\x2f\x0f\x53\xa7\x13\x11\x73\x72"
+ "\x3a\xf1\xf2\x1a\x5b\xcc\xb1\x3a\xf1\xf2\x0e\x79\x9d\x78\xf9\x00"
+ "\xab\x13\xb1\x7d\x39\x9d\x78\xf9\x32\xd3\xbe\x9d\x4e\xbc\xd2\x86"
+ "\xd5\x89\xf4\x3a\x51\x27\x5e\x11\x74\xd9\x85\xfd\xea\x75\xe2\x95"
+ "\x35\xca\x3a\xf1\x4a\x3a\xab\x13\xaf\xe8\xa8\x1e\xbc\x52\x48\x75"
+ "\xe2\x95\xe5\xf4\xf8\x85\x7d\xd2\xe3\xa2\x4e\xa4\xc7\x45\x9d\x78"
+ "\xa5\x5c\xdd\x3c\x90\x66\xc9\xf5\xde\xa6\x79\x20\xcd\x95\xeb\xbd"
+ "\xdd\xf3\x40\x0c\x6e\xae\x7f\x6f\x70\x75\xfd\xfb\xbb\x75\x32\x4d"
+ "\x79\xde\x2b\x55\x62\x9e\xf7\xb7\x53\xee\xe9\x95\xdf\x2a\xdd\xd7"
+ "\xe6\x0d\x92\xfd\x7b\x1b\x98\xfd\x7b\xd9\x7a\xf8\xda\xcf\x1d\x6b"
+ "\xf3\x7a\xc9\xfe\xbd\xd7\x84\xfd\x7b\xaf\x09\xfb\xf7\x5e\x7b\xd6"
+ "\x9d\x7a\xf8\x94\x5a\xe2\xf5\xbe\x6d\x3d\xfc\xb1\xfd\xb4\x1e\x7e"
+ "\x81\x6d\x3d\x7c\xdd\x1e\xb6\x1e\xfe\xea\x13\x4a\xf5\xf0\x98\xf7"
+ "\xbd\x91\x37\xf9\x18\xd6\xc2\xcb\xd6\xc1\x4f\x6e\xde\x3a\x78\xc4"
+ "\xe6\xe6\xa5\x54\xdb\x6f\x6a\x95\xda\xde\x20\x59\x3b\xbf\xce\xcd"
+ "\xfd\x7f\xeb\x12\x58\x6d\xdf\x28\xb3\xff\x6f\x9d\x8a\xfd\x7f\xaf"
+ "\xb9\xb9\xff\xef\x35\x17\xf7\xff\xbd\x66\xb7\xff\x2f\xad\x83\xaf"
+ "\xdd\xad\x5c\x07\x4f\xcf\xd9\x6b\xb2\x7a\xc9\xba\x52\xd7\x5b\xc1"
+ "\xfe\xbf\xd7\x15\xf6\x68\xbd\x2e\xec\xff\x7b\xed\x16\xec\xff\x7b"
+ "\x4d\x61\xff\xdf\xeb\xc2\xfe\xbf\xd7\x9a\xf6\xf2\x15\xb5\xfd\x35"
+ "\x85\xfd\x7f\xeb\x7b\xd9\x7e\x87\x6a\xfb\x6b\xc2\xfe\xbf\xf5\x0e"
+ "\xf6\xff\xad\x17\xf6\xff\xad\x17\xf6\xff\xa5\x3e\xb5\xd7\xf6\xf5"
+ "\x2e\xec\xff\x7b\x4d\xd8\xff\xf7\x9a\x83\xfd\x7f\xeb\x65\xf6\xff"
+ "\xad\xcd\x97\xd7\xf6\x0d\x92\xfd\x7f\x1b\x6c\xf6\xff\x35\xb6\x92"
+ "\xfd\x7f\x15\xb1\x65\xb3\xff\xaf\xd1\x8d\xfd\x7f\x1b\x54\xee\xff"
+ "\x7b\x4d\x61\xff\xdf\x06\x61\xff\xdf\x6b\x0a\xfb\xff\x36\x28\xec"
+ "\xff\xdb\x60\xb3\xff\xef\x35\x85\xfd\x7f\x1b\x0e\x33\xed\xdb\x69"
+ "\xfb\x06\x9b\xfd\x7f\xaf\xd9\xec\xff\xdb\x28\xec\xff\x5b\x3b\x49"
+ "\xbd\xb6\x6f\x74\xb0\xff\x6f\xa3\xcd\xfe\xbf\x8d\xc2\xfe\xbf\x8d"
+ "\xc2\xfe\xbf\x8d\xc2\xfe\xbf\xb5\xa1\xd2\xe3\xa2\xb6\xa7\xc7\x45"
+ "\x6d\xdf\xa8\x66\xff\xdf\x2a\x35\x39\xe0\x96\xaf\xe3\xd0\xb6\xd2"
+ "\x3a\x0e\x93\x9b\xf9\x5f\x93\xfb\xf9\x5f\x4f\xaf\xfe\x4d\x1a\x13"
+ "\xfe\xaf\x5c\x4b\x60\x76\x9c\xff\xf5\xf4\x88\x11\x35\x26\x27\xcc"
+ "\x57\xe2\xf6\x53\x9e\xe6\x62\x5d\xad\x25\x48\xb9\x2e\xe8\x4a\x6b"
+ "\x2d\xc1\x62\xa1\x96\x00\xb4\x25\xd5\x92\x96\x6b\x6c\x2d\x81\x39"
+ "\x56\xa9\x96\x40\xb6\x86\xc0\x46\x3f\x5a\xb5\xa6\xbb\x35\x04\xad"
+ "\x5f\x3f\x36\x4a\x6a\x08\x2c\x07\xdc\xd3\x8f\x96\x42\x46\x3f\x7a"
+ "\x7a\x9d\xb2\xd7\x8f\x5c\x4f\xd7\xf5\x23\x37\xca\x3d\xfd\xc8\x8d"
+ "\x74\x4d\x3f\x72\x3b\xe4\x6b\x08\xcc\x01\xca\x35\x04\xf4\x9c\xdd"
+ "\xb8\xef\xe9\x31\xaa\x69\xdc\xf7\xf4\xf0\xbf\xe3\xf5\xa3\x27\x29"
+ "\x90\x1d\xe3\x3d\xc9\x01\xaa\x1f\xb9\xdc\xe6\xd7\x8f\x5c\xae\xac"
+ "\x7e\xf4\xf4\x18\x48\xc7\x5a\x2e\xd7\x5e\x3f\xc2\x77\xe4\xf4\xa3"
+ "\xa7\x47\x84\xed\x77\xa8\x7e\xe4\x76\xf2\xfa\xd1\xd3\x63\xa5\xa2"
+ "\x7e\xf4\xd4\x74\xe3\x79\xc9\xd3\xe3\x37\xca\x4b\xd4\xa7\x76\xfa"
+ "\xd1\xd3\xe3\xb0\x73\xfd\x48\x31\xc4\xf7\x53\x49\x3f\x7a\x6a\x3a"
+ "\xd8\xeb\x47\xb3\x7c\x6e\xd8\xd3\xf3\xa2\x88\x23\xcf\x55\x8c\x7e"
+ "\xf4\xd4\x4c\x6a\x15\xfa\x51\x19\x5b\x05\x8c\x7e\xf4\xf4\xec\xa5"
+ "\x5a\x3f\x7a\x7a\x4e\x55\xa7\x1f\x11\x73\x32\xfa\xd1\xd3\x73\x87"
+ "\x80\x9f\x9d\xb2\xfa\xd1\xd3\xf3\x90\xac\x7e\xf4\xf4\x3c\xc5\xea"
+ "\x47\x6c\x5f\x46\x3f\x7a\x7a\xb5\x61\xda\xb7\xd5\x8f\x9e\x5e\x3d"
+ "\x59\xfd\x48\xaf\x6b\xd2\x8f\x9e\x5e\x45\x74\x5c\x33\xa9\xcf\x0d"
+ "\x7b\x7a\xed\x50\xd4\x8f\x9e\x5e\x9f\x33\xfa\xd1\xd3\x8b\xae\x9d"
+ "\xef\xe9\x55\xc9\xeb\x47\x4f\xaf\x0c\xaa\x1f\x4d\xfb\xa4\xc7\x45"
+ "\xfd\x68\x62\x73\xc3\x6b\xbd\x6a\x1c\xe9\x47\x2e\xad\x5f\x51\xaa"
+ "\xc6\x92\x0f\x7f\x05\xd0\xcf\xce\x30\x8e\x15\xc2\xff\x8b\x60\x3c"
+ "\xea\x00\xff\x2f\x57\xd2\x2b\x06\xff\x7e\x45\x16\xd0\x1e\x16\xf8"
+ "\x9d\x32\xc3\xaf\x85\x85\x0f\x9a\xa0\xaf\xde\xc2\x9e\x2d\xfd\x8a"
+ "\xda\x9b\xee\x1d\x69\xe1\x74\x84\xf3\x83\xff\xc7\xc0\x31\xb8\xbe"
+ "\x1d\x8c\x7b\x81\x8b\x49\xbb\x2b\x9e\xde\xab\xad\xd7\x41\x9f\xdb"
+ "\x9d\xf3\xf4\x1e\x85\x6d\xd4\xaf\xf5\xce\x80\xfb\x31\x2a\xf6\x15"
+ "\xda\x1a\xb7\xe3\x61\x12\x6b\xe2\xfe\x5d\x38\xbf\x96\x54\x79\x7a"
+ "\x9f\x6d\x5f\x73\xef\x48\xe0\x21\x82\x7a\x2f\xff\x41\x83\x17\xb6"
+ "\x59\x38\xbf\x11\xcf\x1d\xc4\x73\x66\xe8\x63\xdc\x3c\xa2\x59\x5b"
+ "\x7b\xaf\x0f\xe8\x2a\xef\xf8\x3a\xae\xfa\x2d\x13\xf4\x39\xc6\x44"
+ "\xbe\x7e\xb8\xc2\xeb\xb3\x4d\x15\xfc\xd8\x53\x5a\x67\xe6\xdb\x08"
+ "\x9c\xcf\xf7\xe7\xfc\x16\xb8\x5e\xae\x0f\x2b\x77\x91\xde\xde\xbd"
+ "\x38\xbd\xaa\xf1\xce\xf3\x9e\x41\x4a\x76\x6c\x9f\xf8\x30\x29\x7c"
+ "\x0c\x6c\x17\x48\x34\x72\xe7\x55\xfe\x4e\xb6\x03\x7d\xe9\xf3\x61"
+ "\x27\xae\x2e\x7e\x23\xd1\xac\xb3\xdc\xeb\xf3\x0d\x70\xe2\xd6\x0d"
+ "\x9c\xa1\x7e\xed\xbd\xbe\x7a\x0f\x93\x1f\xda\xfc\x5d\x38\xbf\xae"
+ "\x13\x67\xb8\x9a\x84\xb8\xb9\xb7\xc7\x01\x18\xdb\x6d\x7d\xb1\x60"
+ "\xe6\xbc\xe9\x81\xd1\x11\xf3\x66\xbd\xb5\x28\x3a\xb0\xe7\xcc\xfb"
+ "\xc8\x84\xb7\xde\x0a\x9c\x37\x7d\xfe\x92\x40\xe9\x99\x67\x02\x67"
+ "\x46\x2c\x9c\x3e\x63\xee\xac\x3e\xf3\xde\x88\xba\x0f\xfa\x44\x24"
+ "\xfd\xf0\xc3\xbe\x58\xd6\xde\xdb\x7f\xcb\x07\x84\x7c\xd8\x91\x78"
+ "\x61\xbf\xe0\xf7\xd2\xf4\x5e\x23\x73\xf0\xf7\xd6\x6e\xe0\xea\x34"
+ "\x70\x4d\x3c\x70\xda\xba\xb8\x7b\xe1\xda\x7b\xb2\xb7\x42\xbf\xb6"
+ "\x40\xbf\xa1\x8f\xd8\xe7\x42\x6b\x9f\xad\x98\x88\x47\x4c\xc4\xd5"
+ "\x02\x06\xef\x3d\xdb\xde\x78\xef\x4b\x1c\x17\x8a\xf7\x57\x07\xcf"
+ "\x8a\xc7\x05\x4f\x9f\x25\x7c\x0c\x90\xde\xaf\x08\xbe\x6b\xb2\x62"
+ "\xcc\x92\x16\x13\xce\x6d\xe8\x97\x0a\xda\xd1\xa3\x9e\xd3\xfd\x37"
+ "\x60\x13\xbe\xef\x33\xaa\x1f\x21\x09\x5c\x7d\x28\xbf\xff\x00\x57"
+ "\x0f\x18\xa6\x38\x85\x73\x6d\xba\x5c\xd5\x90\xe7\xea\xd7\xfa\x0c"
+ "\xd5\x93\x9d\x73\xb1\x0d\x3d\x1c\x43\x9b\x5b\xb2\xd3\xf5\x21\x41"
+ "\x24\xe1\x0f\x09\x24\xa1\x1e\xbf\x93\x33\xb1\xa0\x7d\x34\xf1\x18"
+ "\x17\xc3\x9d\x01\xde\xf1\xe0\xba\xa5\xeb\xb9\xed\x13\x0b\xf4\x9e"
+ "\x3e\x3d\x2c\xe9\x31\xe1\x70\x3f\x35\xd0\x4e\xb2\xde\xe3\x29\x5f"
+ "\x6c\x67\xdd\x06\xde\xf6\x35\x78\xef\x60\x1f\x88\x65\xb8\x42\x2e"
+ "\x49\x78\x86\x52\xff\xa4\xb7\xa4\x66\x05\x97\x79\x5d\x27\xe3\x4c"
+ "\xdc\x0d\x6e\xfd\x9f\xf4\xa5\x75\x75\xc0\x69\x51\x6f\x70\xed\xee"
+ "\x1d\xd6\xde\x14\x31\x6b\x6b\x47\x78\x16\xd7\x67\x05\x73\xeb\x67"
+ "\x55\x84\xf4\x22\x5a\x68\xbb\xca\x6a\x4f\xb0\xa5\x97\x3a\x1c\xf9"
+ "\xf0\x6b\xba\x20\x1e\xa0\x3f\x02\x1e\xda\x0c\x38\x10\x6d\x8f\x87"
+ "\xa6\x67\x73\xc3\x9c\x72\x13\x17\xfa\xd2\x8d\x34\xd0\xe0\x7e\x73"
+ "\xea\xe2\xce\x93\x7b\xd0\xb6\xa5\xa0\xf7\xd7\x2e\x26\x01\x6b\xa6"
+ "\x91\xc0\xd7\x97\x68\x89\x21\x7d\x8e\xa1\x7d\x62\x82\x07\xd8\x44"
+ "\x03\xfc\xd2\x1f\x38\xb3\xff\x8d\x4e\x31\xe1\xcb\x67\x11\x4d\xde"
+ "\xb9\x7c\x0d\xea\x64\xac\x0b\x01\x5b\x5f\xdb\x02\xdf\xe3\x7e\x0d"
+ "\x25\xe8\x0f\xde\x17\xbf\xea\xc8\x18\x88\xbc\xf1\x1d\xc7\x05\xcf"
+ "\xfb\x7a\x65\x41\x9b\xea\xee\xab\x0d\xaf\x7f\xcd\xe0\xab\x7e\xe0"
+ "\xa7\xb2\x2a\x33\xdf\x26\xef\xab\xb9\xa2\xaf\xf6\x43\x3f\x44\x7f"
+ "\xb5\xc9\x47\xbf\xca\xdf\xb3\x2e\x58\xb8\xe7\x64\xce\x4f\x17\xad"
+ "\x7c\xcf\xba\x28\x7a\xcf\xde\xb5\x8e\xef\xf9\xbe\x8b\x8e\xef\xf9"
+ "\xfe\xae\xea\xef\xf9\xbe\xdd\xea\xef\xf9\xbe\x1c\x07\xf7\x2c\xf8"
+ "\x39\x02\xfc\xac\x73\xe0\x67\x9d\xe0\xe7\xfb\xcf\x39\xbe\xe7\xfb"
+ "\x4f\x39\xbe\x67\xdf\x0e\xea\xef\xf9\xfe\x5c\xf5\xf7\x7c\x7f\x86"
+ "\xf2\x3d\x47\x08\x7e\x8e\x00\x3f\x47\x38\xf0\x73\x84\xe0\xe7\x0e"
+ "\x3f\x38\xbe\x67\xdf\xa3\x8e\xef\xb9\xad\xb7\xfa\x7b\xf6\xcd\x54"
+ "\x7f\xcf\xbe\xab\x1d\xdc\xb3\xe0\xe7\x48\xf0\x73\x84\x03\x3f\x47"
+ "\x08\x7e\x7e\x2a\xc5\xf1\x3d\xb7\x3d\xe4\xe4\x9e\x1b\xd4\xdf\x73"
+ "\xdb\x54\xf5\xf7\xdc\x36\x41\xf9\x9e\x23\x05\x3f\x47\x82\x9f\x23"
+ "\x1d\xf8\x39\x52\xf0\xf3\x94\xe7\x1d\xdf\x73\xbb\xbd\x8e\xef\xb9"
+ "\xdd\x65\xf5\xf7\xdc\x6e\x85\xfa\x7b\x6e\x17\xad\x74\xcf\x8d\xc0"
+ "\xdb\xbe\x70\x2f\x37\x7e\x0a\x7d\xc9\xec\x37\xc7\xe4\x5b\x45\x34"
+ "\x99\x49\x16\x5d\xfb\x6a\xd2\x06\xee\x4d\xc7\x6d\x58\xd6\x1f\xff"
+ "\xb5\xf8\xcd\x31\x36\xfa\xe9\x7c\x1a\x3a\xf5\x4b\x5d\x36\x95\xdc"
+ "\x83\x7a\x7c\x95\x85\x04\x58\xd2\xe6\xd4\xad\x7e\x85\x04\xc6\x1b"
+ "\x88\xb6\x34\x4e\x4f\xe2\xa2\x38\x43\x29\x39\x4b\xda\x56\x63\xec"
+ "\x79\x92\x14\xd7\x14\x91\xf9\x0b\x38\xee\x82\xa7\x76\x30\xbe\x03"
+ "\x06\x9d\x9c\x90\xfa\x4f\x12\x08\xbf\xd1\x7f\x0b\xfc\x61\x3b\xed"
+ "\x47\xc3\xf8\xb9\x61\xd9\x93\x5b\xe3\x48\xc0\x57\x91\xd5\x04\x8f"
+ "\x67\xc1\x9f\x79\x43\x4c\x78\xdc\x54\xa2\xd9\x55\x5b\xa1\xa1\x63"
+ "\xb3\xd6\xdb\x76\x6c\x1e\x3d\x1d\x6c\x39\x83\x3f\x37\x3e\xf3\x15"
+ "\xb5\xb6\x6c\x5f\x6e\x1d\xbb\x79\x5b\x56\x9a\xe9\x78\x6f\x33\x76"
+ "\x7f\x05\xbf\x2f\xda\xb2\x7d\x21\xda\x92\x4b\xd3\x69\xcb\xaa\x1b"
+ "\x31\x6e\xd2\x5e\x88\x21\x1a\x38\x1e\x55\x1a\x55\x4b\xe4\x6d\xac"
+ "\x0b\x16\x6d\xac\x5b\xee\x5b\xe5\x5d\x2b\x6f\x63\x5d\x0c\xd8\x38"
+ "\xd9\xde\xc6\xba\x68\xd7\x6c\xdc\x21\xeb\xe6\x6d\xdc\x21\x42\xd9"
+ "\xc6\x1d\xf6\xa8\xb7\x71\x87\x01\xea\x6d\xdc\xa1\x87\x60\xe3\x54"
+ "\xd6\xc6\xda\x63\x0e\x6c\x2c\xc1\xb1\x0e\x70\x7c\xff\x39\x05\x1b"
+ "\x03\x8e\x23\x64\x70\xac\x73\x11\xc7\xbf\xf3\xb8\x79\x1b\x77\x2c"
+ "\x51\xb6\xf1\xef\x3a\xab\xb7\x71\xc7\x0c\xf5\x36\xee\x98\x4c\x6d"
+ "\x1c\x61\x83\xe3\x8e\x83\x94\x6d\x1c\x21\xc1\x71\x04\xe0\xb8\xc3"
+ "\x0f\xf2\x36\x8e\x00\x1c\x47\xc8\xe0\x38\xc2\x45\x1c\xfb\xcd\xba"
+ "\x79\x1b\xfb\x3d\xa1\x6c\x63\xbf\x58\xf5\x36\xfe\x9d\x49\xbd\x8d"
+ "\x7f\x57\x23\xd8\xd8\x06\xc7\xbf\xcb\x74\x60\x63\x09\x8e\x23\x00"
+ "\xc7\x4f\xa5\x28\xd8\x18\x70\x1c\x29\x83\xe3\x08\x17\x71\xec\x7f"
+ "\xf8\xe6\x6d\xec\x9f\xae\x6c\x63\xff\xb3\xea\x6d\xec\x1f\xae\xde"
+ "\xc6\xfe\xc1\xd4\xc6\x91\x36\x38\xf6\x27\xca\x36\x8e\x94\xe0\x38"
+ "\x12\x70\x3c\xe5\x79\x79\x1b\x47\x02\x8e\x23\x65\x70\x1c\xe9\x22"
+ "\x8e\x1f\xe8\x73\xf3\x36\xee\xd4\xa0\x6c\xe3\x07\x46\xa8\xb7\x71"
+ "\xa7\x83\xea\x6d\xdc\x69\xb7\x60\x63\x1b\x1c\x77\x9a\xa9\x64\xe3"
+ "\x1b\x10\x03\xb6\x05\x1b\xb7\xad\x21\x9a\x2c\xb4\x6d\x05\xb5\xad"
+ "\xb9\xd3\xb2\xfe\x59\x1a\x8b\x0e\x6d\xc2\xe7\x80\x7e\x09\x68\x67"
+ "\x4e\x9b\x63\xe2\x34\x70\x4f\x71\x98\xfb\x7d\x20\xcf\x94\x44\xda"
+ "\x05\xc6\x61\xfe\xb7\x33\x5f\x1f\x10\x18\xf7\xde\x29\xf8\x3d\x4f"
+ "\xcc\x7b\x99\xd2\xfb\x46\x99\xfd\xe7\x0e\xbd\xe0\x19\x70\x9e\xeb"
+ "\x39\xa9\x1c\x62\x2f\x2d\xf7\x66\x80\x5f\x59\x4d\x3e\xd8\xe7\x08"
+ "\x29\xad\xf8\x92\x58\x3a\x2d\x7b\xb2\x9f\x89\x04\x71\xbf\x04\xf9"
+ "\x15\x47\xeb\x89\xf9\x8d\x00\xdf\xb2\x98\x22\x52\x16\xf3\x57\x32"
+ "\xae\x9a\xbb\xce\xfd\x1c\xe4\x7b\xc3\x3f\x31\xc6\xec\xbf\x4c\x6b"
+ "\x4e\x4f\x31\x9a\xfc\x13\x75\x79\x8b\xf5\x1a\x5f\x23\x09\x9a\x5b"
+ "\xc5\x71\x6b\x67\x10\xaf\xb5\xe7\x88\xcf\xba\x19\xc4\x77\xdd\x39"
+ "\xa2\x2d\xae\xaa\x20\x25\x97\x8a\x48\x49\xed\x09\x52\x72\x1d\xfe"
+ "\x1a\xe1\xcf\x02\x7f\x09\x27\xc0\xd7\x84\x8c\xb9\x4c\x70\xef\x46"
+ "\xc3\xe3\x95\xc4\xaf\xd8\x54\x41\x70\xfe\xeb\x15\xcf\x80\x44\xdf"
+ "\x70\xe2\xc7\xfd\x1c\x40\xb8\x37\x02\x34\x70\xce\x0b\x8f\x97\x99"
+ "\x0c\xa4\xb8\xca\x88\xe7\xc3\xe1\xbc\x57\x7c\x15\xb4\x6f\x29\xc2"
+ "\xbd\x19\x0d\xc5\x09\x87\x89\x69\xfd\xe9\x70\x0e\x63\xe8\x4e\x73"
+ "\xca\x53\xc1\xd4\x16\x2e\xa0\x3b\xc5\x41\xe7\x8d\x5b\x2c\x6a\x7d"
+ "\x1d\x90\xcf\xdb\xf8\xcd\x80\x8e\x60\xe7\x07\x2d\x6f\x86\x6a\xc7"
+ "\x9e\x38\xc3\x95\xd6\x55\x10\xcc\x25\x94\xd6\x1d\x21\x65\x2b\x2c"
+ "\x64\xdc\x12\x42\x46\x9b\x09\x41\x5b\x94\xc5\x54\x93\xb1\x51\xa4"
+ "\x3d\xe6\x9f\x2d\xbf\x04\x75\x2c\xab\x32\x90\x58\x13\xf4\xf1\x8a"
+ "\xb1\xa9\x8f\xa5\x2b\x4a\x09\x9c\x7b\xb0\x54\xa7\x27\xbe\x51\x44"
+ "\x8b\xf6\x35\xa5\xcd\x31\x8e\x85\xe7\x67\x7e\x1d\xc7\xa1\x6d\xd1"
+ "\xa6\x68\x5f\x6c\xcf\x6a\xf3\xb2\x99\x06\x12\x6f\x24\xda\xb2\x38"
+ "\xf8\x37\x86\x33\x94\x91\xdf\x08\xf4\x31\x8d\xeb\x70\x3a\x1c\x70"
+ "\x31\x00\xb1\xa0\xf7\x7c\x20\x07\xfc\xdf\x51\x1e\x53\xba\x68\x8a"
+ "\x29\xef\x5a\xe7\x98\xd2\x2d\x17\x31\xf5\xa0\x87\x88\xa9\x87\x4e"
+ "\x29\x63\xea\xa1\xc1\x02\xa6\x52\xef\x4c\x4c\x3d\x78\xdc\x31\xa6"
+ "\x1e\xdc\xed\x00\x53\xc9\x5c\x27\x5d\x30\x8b\xa9\x87\x2e\xab\xc7"
+ "\xd4\x43\x5e\xb7\x0f\x53\xba\x18\xf7\x30\xf5\x60\x35\x8b\xa9\xce"
+ "\x46\x07\x98\x12\x78\xea\xfe\x73\x2e\x60\x4a\xc2\x53\x5d\x42\x44"
+ "\x4c\x3d\xfc\x84\x32\xa6\xba\xae\xa1\x98\x8a\xb8\x43\x79\xaa\x6b"
+ "\x2f\xc7\x98\xea\xea\xa3\x8c\xa9\x08\xe0\x29\x9d\x0d\x4f\x3d\x3c"
+ "\x4c\x3d\xa6\xba\x86\xde\x46\x4c\xb9\xc9\x53\x5d\x87\xb0\x98\xea"
+ "\x32\x5a\x19\x53\x11\x02\x4f\x75\xf8\xc1\x39\xa6\x22\x24\x3c\xf5"
+ "\xf0\x0e\x11\x53\x81\x2b\x95\x31\xf5\xc8\x59\x01\x53\x77\x28\x4f"
+ "\x3d\x12\xeb\x18\x53\x8f\x84\x39\xc0\x14\xf0\x54\x84\x0d\x4f\x05"
+ "\xa6\xab\xc7\xd4\x23\x3b\x6f\x1f\xa6\x22\xdc\xe4\xa9\x47\x52\x59"
+ "\x4c\x3d\x9c\xed\x00\x53\x02\x4f\x3d\x95\xe2\x02\xa6\x24\x3c\x15"
+ "\x68\x16\x31\xd5\xfd\x84\x32\xa6\xba\x0f\xa4\x98\x8a\xbc\x43\x79"
+ "\xaa\xdb\x51\xc7\x98\xea\x96\xaf\x8c\xa9\x48\xe0\xa9\x08\x1b\x9e"
+ "\xea\x7e\x51\x3d\xa6\xba\x93\xdb\x88\x29\x37\x79\xaa\x5b\x15\x8b"
+ "\xa9\xc0\x3a\x65\x4c\x45\x0a\x3c\x35\xe5\x79\xe7\x98\x8a\x94\xf0"
+ "\xd4\xa3\xe3\x45\x4c\xf5\xec\xa3\x8c\xa9\x1e\xab\x04\x4c\xdd\xa1"
+ "\x3c\xd5\xa3\xa7\x63\x4c\xf5\xf0\x72\x80\x29\xe0\xa9\x48\x1b\x9e"
+ "\xea\xf9\xac\x7a\x4c\xf5\x98\x70\xfb\x30\x15\xe9\x26\x4f\xf5\x18"
+ "\xc4\x62\xea\xd1\x91\x4a\x98\x6a\xc4\xb8\xcf\x03\x30\xa5\x83\xb8"
+ "\x0f\x30\xd4\xbe\x9c\x62\xea\x06\x60\x6a\xb3\x14\x53\xff\xb2\x8d"
+ "\xfb\x7a\x6e\xb7\x34\x61\xea\x0f\x9f\xdb\x62\xca\x02\x98\xba\xc1"
+ "\x63\xea\xf7\x87\xad\x71\x5f\x59\x4d\x36\xf8\xea\x12\x29\x0b\x06"
+ "\x3c\x6d\x10\xf0\xf4\x2f\xc0\x13\xdc\x8f\x05\xee\xb7\xb8\xb2\x82"
+ "\x8c\x33\xd0\xfb\x6a\x84\xfb\xb5\x48\xb1\xd4\x58\xad\x41\x0c\x21"
+ "\x76\xac\x38\x2a\x99\x0f\xf8\x59\x70\x94\x94\x2c\x86\xbf\xa5\xf0"
+ "\x17\x07\x7f\xe4\x28\x29\xae\x26\x7c\xce\x5e\xc4\x4f\xb9\x80\x9f"
+ "\xdf\xcf\x72\x8c\x9f\xdf\x0f\x57\x17\xe3\xfd\xe1\x80\x7a\xfc\xfc"
+ "\x3e\x4d\xa8\xa5\xd3\x8e\x1b\x7f\x86\xc3\x1a\x58\x8a\x91\x4b\x64"
+ "\x9c\x89\xb4\xe7\xa6\x04\x75\xf4\x0d\x25\xda\x65\x66\xa2\x59\x33"
+ "\x83\x68\xd7\x9c\x84\xfb\xb5\x3e\x3b\xe7\x88\xef\x11\xe3\x97\xa4"
+ "\xb8\xb6\x82\x14\x5f\x3f\x4c\x8a\x2d\xf0\x77\x09\xfe\xa0\x8f\xe3"
+ "\x66\x49\xef\xd7\x20\xdc\xef\x1f\x42\xa0\xad\x1e\xca\xf7\xfb\x87"
+ "\x01\xfc\xfd\xce\x84\xfb\x6d\x14\xef\xb7\x0c\xb0\x08\x7e\x79\xd0"
+ "\x22\xc4\x89\xe3\x0c\xa4\xcd\x5b\x26\x8e\x6b\x14\x30\x88\x7e\x39"
+ "\x72\xcc\x48\xc6\x45\x81\xaf\xde\x00\x0c\x56\xe5\x92\xf8\xe5\x80"
+ "\xc1\x46\x23\xbe\xd7\x37\x94\x25\x34\x00\x06\x7f\x1f\xc3\x81\xdd"
+ "\x6e\x20\x06\xff\x85\x18\xec\x99\x69\x51\xc4\x20\xc4\x89\x3c\x06"
+ "\x21\x4e\x74\x8a\x41\x69\x9c\x18\xd4\x4b\xc4\xe0\x63\x03\x95\x31"
+ "\xd8\x6b\x8c\x35\x4e\x6c\x79\x0c\x06\x5d\x74\x8c\xc1\xa0\x22\x75"
+ "\x31\xe1\x63\x23\xd4\x63\xb0\x57\xc0\xed\xc3\x60\xaf\x13\x8e\x31"
+ "\xd8\xab\xc0\x39\x06\x75\x31\xee\x61\x30\xc8\xc4\x62\x30\x28\xd0"
+ "\x01\x06\x05\x1e\x84\xb8\xd2\x39\x06\x25\x3c\xf8\x58\x9e\x88\xc1"
+ "\xde\x7b\x95\x31\xf8\xf8\x51\x6b\x5c\xd9\xf2\x18\x7c\x7c\x9e\x63"
+ "\x0c\x3e\x3e\x5a\x5d\x0c\xd9\xfb\xb0\x7a\x0c\x3e\x9e\x79\xfb\x30"
+ "\xd8\x7b\xaa\x63\x0c\xf6\x1e\xe2\x02\x06\xdd\xe4\xc1\xc7\x13\x58"
+ "\x0c\x3e\x96\xa3\x8c\xc1\x08\x81\x07\x21\x0e\x75\x8a\x41\x69\x1c"
+ "\xda\xe7\x09\x11\x83\xfd\x9e\x55\xc6\x60\xdf\x10\x6b\x1c\xda\xf2"
+ "\x18\xec\xf3\x9b\x63\x0c\xf6\x29\x57\x17\x73\xf6\x1b\xa3\x1e\x83"
+ "\x7d\x03\x6f\x1f\x06\xfb\x9e\x75\x8c\xc1\xbe\x85\xce\x31\x18\xe1"
+ "\x26\x0f\xf6\xf5\x62\x31\xd8\x27\xc8\x01\x06\x05\x1e\x84\xb8\xd5"
+ "\x39\x06\x25\x3c\xd8\x6f\x8f\x88\xc1\x27\x0e\x28\x63\xb0\xff\x09"
+ "\x6b\xdc\xda\xf2\x18\xec\xbf\xc8\x31\x06\xfb\x4f\x50\x17\xa3\x3e"
+ "\x71\x54\x3d\x06\xfb\xe7\xdc\x3e\x0c\x3e\x31\xcb\x31\x06\x9f\x18"
+ "\xee\x02\x06\xdd\xe4\xc1\xfe\xc9\x2c\x06\xfb\xed\x54\xc6\x60\xa4"
+ "\xc0\x83\x10\xe7\x3a\xc5\xa0\x34\xce\x7d\x72\xb0\x88\xc1\x01\x23"
+ "\x94\x31\xf8\x5f\x53\xad\x71\x6e\xcb\x63\xf0\xc9\x06\xc7\x18\x7c"
+ "\xb2\x42\x5d\x4c\x3b\x20\x44\x3d\x06\xff\x2b\xe8\xf6\x61\xf0\xbf"
+ "\x2e\x3a\xc6\xe0\x7f\x15\x39\xc7\x60\xa4\x9b\x3c\xf8\x5f\xbe\x2c"
+ "\x06\x9f\xec\xaf\x84\x41\x0b\xc4\xc5\x37\x72\x26\x95\x5b\xd2\x12"
+ "\x63\xda\x7b\x04\x12\x93\xdf\xdc\xa1\x65\xd1\x75\x64\xec\x35\xb0"
+ "\x4f\xd4\x35\x32\xed\x9a\x96\x98\xd3\x12\x75\x1c\xc4\x47\x92\xf8"
+ "\x99\xaf\x2d\x33\xa5\x9e\x0e\x5f\x37\x9f\x78\x41\xfc\xfd\x24\x1e"
+ "\x2b\xbb\x60\x24\xf8\xfb\xb1\xd8\x9f\x4b\x62\x7f\x30\x4f\xc0\xfd"
+ "\x1a\xa4\xe5\xdf\x31\x37\xea\x49\xd5\x10\xe2\x59\x5c\xa5\x07\x3b"
+ "\x2c\xe5\xfd\x8b\x76\xb9\xe0\x39\x30\x68\xeb\x15\xe2\x65\xfa\x39"
+ "\xe0\x41\xb0\xb7\x5f\xdb\x77\x88\x47\x97\x2a\xce\x82\x76\x45\x7b"
+ "\xa1\x8d\x03\x97\xe2\xbb\xeb\x81\x4b\x4a\x01\x63\xa6\x9f\x83\x1e"
+ "\xdc\x02\xd7\xc9\xc7\xab\x03\x13\xd5\x63\x63\x20\x9d\x0f\xeb\x39"
+ "\x30\xb0\xb8\x92\xc8\xbe\x3b\xb6\x40\xfc\xe6\x9a\xad\x74\x31\x92"
+ "\x38\xef\x16\xd8\xea\xa9\x09\xae\xd9\xea\xa9\xed\x36\xb6\x92\x89"
+ "\xab\x9e\xca\x53\x6f\xab\xa7\xe8\x3a\x91\x9e\x4f\x8d\x76\x60\x2b"
+ "\x17\x71\xa5\x33\x4a\xe2\x91\x5b\x60\xab\xa7\x13\x5c\xb3\xd5\xd3"
+ "\x47\x59\x5b\xc9\xe9\xff\xa7\x4f\xa8\xb7\xd5\xd3\x99\xd4\x56\x4f"
+ "\xc7\x28\xdb\x2a\xc2\x45\x5c\x45\xc4\x48\x74\xf3\x2d\xb0\xd5\xa0"
+ "\x9d\xae\xd9\x6a\x90\xd9\xc6\x56\x32\x3a\x75\xb0\xb7\x7a\x5b\x0d"
+ "\x2a\xa2\xb6\x1a\x94\xe3\xc0\x56\x2e\xe2\x2a\xc2\x28\xd1\x77\xb7"
+ "\xc0\x56\x83\x2b\x5c\xb3\xd5\x33\xbd\x58\x5b\xc9\xe9\xa9\x67\x9e"
+ "\x50\x6f\xab\xc1\x75\xd4\x56\x83\xcb\x95\x6d\x15\xe9\x22\xae\x22"
+ "\x63\x24\x3a\xe4\x16\xd8\xea\x8f\x5e\xae\xd9\xea\x8f\x21\x36\xb6"
+ "\x92\x19\xf7\xff\x38\x55\xbd\xad\xfe\x18\x48\x6d\xf5\x8c\x49\xc9"
+ "\x56\xe6\xb4\x39\x75\xed\xc1\x06\x0d\x1b\xe6\x94\xb7\x8f\x21\x9a"
+ "\xc6\x1e\x60\x37\x3f\xb0\x5b\x62\x20\xb9\x91\x06\x76\x33\x98\xc8"
+ "\xd8\xb7\xcf\x70\xa5\x35\x66\xd2\x08\x36\x6b\xf0\x9b\x63\x2c\x33"
+ "\x54\x63\xcd\xd1\x1f\xcf\x79\x3e\xfb\xec\x94\xb7\xb5\x04\xed\x86"
+ "\x76\x40\xdb\x71\x60\x37\xde\x8e\x7e\x29\x46\xb3\xdf\x32\xed\x98"
+ "\xcb\x67\xb8\xb7\xf4\x1c\x87\xf7\xcb\xf9\xf5\x8d\xc2\xf7\x02\xe3"
+ "\xaa\x49\x9b\xc0\x57\xf0\x9e\x86\x5c\xc6\xe3\x65\x86\x0a\xd0\x07"
+ "\xb5\x84\xd7\x66\x67\x82\xfc\xcc\x13\x83\x7c\xcd\x65\xa1\x2f\x71"
+ "\x9d\xfa\xa5\x9a\x3a\xc5\x84\xc7\x5f\x26\xf7\xa0\x7e\x58\x6b\x21"
+ "\x01\xb1\xf3\x88\x66\x57\x64\xa1\x86\x9f\xbb\xb6\x80\x6f\x63\x2f"
+ "\xd8\x25\x80\xbb\x2a\xa9\xe9\xbe\xaa\x23\x65\x17\x52\x79\xbf\xd9"
+ "\x6a\x04\xde\x6f\x3f\x05\x69\x41\x67\xf6\xe7\xfc\x74\x3e\xa9\xa5"
+ "\x24\x90\xbb\x01\x36\xe6\xe7\x13\x3d\xbb\x7d\x6b\xa3\x5a\x1b\x0f"
+ "\xe1\xeb\xbf\x2d\x81\x42\xfd\x16\xd8\x09\x7f\x9f\xaf\xdf\x8a\x92"
+ "\xd4\x6f\x41\x9f\xc5\xfa\xad\x21\x23\xb1\x7e\xcb\x72\x26\xe0\x41"
+ "\xeb\xbd\xbf\x35\x97\xe3\xe0\xde\x3b\x96\xd6\x19\x08\xde\x7f\x69"
+ "\x5d\x21\x89\x8f\x26\xda\xd2\xc6\x6a\x12\x57\xc7\x19\x4a\x13\x2e"
+ "\x92\x71\xd7\x50\x07\x23\x5e\x9e\x1d\x48\xfd\x3a\xc4\xc7\x72\x26"
+ "\xe8\x41\xbd\xe7\xb3\xbd\x4b\xcb\x09\x91\xcc\xe3\xd1\x81\x66\xf6"
+ "\x01\x3f\xe8\xca\x12\xce\x11\xf0\x49\x6a\x99\xe9\x24\xfa\x49\x07"
+ "\xe7\x87\x34\xe9\xeb\x4e\xcb\x3e\xc0\x63\xe8\x33\x7c\xdf\x84\xeb"
+ "\x03\x6c\x95\xe8\x6f\xc4\x45\xfb\x98\x04\x52\x16\xd3\x48\x4a\x4d"
+ "\x04\xf4\xd5\x1f\x77\x7f\x1f\x5a\xa1\x80\x23\x5d\x34\xc5\x91\x2e"
+ "\xb8\x7d\x8c\x77\xad\x73\x1c\xe9\x62\x44\x1c\x3d\xb7\xf2\xe6\x70"
+ "\xf4\xdc\xc0\x9b\xc7\xd1\x73\x1e\x37\x81\xa3\x64\x16\x47\xcf\x5d"
+ "\x56\x8f\xa3\xff\x2e\x56\x8f\xa3\xff\x4e\xbd\x39\x1c\x3d\x17\x4b"
+ "\x71\xf4\xdf\xc1\x14\x47\xcf\x45\x8b\x38\xe2\xe7\x46\xdd\x22\x1c"
+ "\x3d\x6b\x72\x80\x23\x81\x8f\x74\xc0\x47\xf7\x9f\x73\x01\x47\x12"
+ "\x3e\x1a\x56\x72\x73\x38\x1a\x16\x7b\xf3\x38\x1a\x36\xca\x7d\x1c"
+ "\x45\xd8\xf0\xd1\xf3\x03\xd5\xe3\x68\x98\x9f\x7a\x1c\x0d\xad\xb8"
+ "\x39\x1c\x0d\x3b\x44\x71\x34\x34\x83\xe2\x68\xd8\x3e\x11\x47\xfc"
+ "\x7c\xb3\x5b\x84\xa3\xa1\xc3\x95\x71\x14\x21\xf0\x51\x04\xf0\x51"
+ "\x87\x1f\x9c\xe3\x28\x42\xc2\x47\xc3\xfd\x6f\x0e\x47\x2f\x1c\xba"
+ "\x79\x1c\xbd\xb0\xfe\x26\x70\x64\xc3\x47\xc3\x63\xd5\xe3\xe8\x85"
+ "\x30\xf5\x38\x7a\x21\xf0\xe6\x70\x34\xbc\x2d\xc5\xd1\xf3\x7a\x8a"
+ "\xa3\xe1\x5e\x22\x8e\xf8\x39\x7c\xb7\x08\x47\xcf\xaf\x76\x80\x23"
+ "\x81\x8f\x22\x80\x8f\x9e\x4a\x71\x01\x47\x12\x3e\x7a\x71\xea\xcd"
+ "\xe1\xe8\xc5\xb6\x37\x8f\xa3\x11\x27\xdc\xc7\x51\xa4\x0d\x1f\xbd"
+ "\x78\x48\x3d\x8e\x46\xe4\xa8\xc7\xd1\x08\xdd\xcd\xe1\xe8\xc5\x10"
+ "\x8a\xa3\x11\x41\x14\x47\x2f\x8e\x16\x71\xc4\xcf\x8b\xbc\x45\x38"
+ "\x1a\x7e\x4c\x19\x47\x91\x02\x1f\x45\x02\x1f\x4d\x79\xde\x39\x8e"
+ "\x22\x25\x7c\x34\x72\xfb\xcd\xe1\x68\x64\xc8\xcd\xe3\x68\x64\xb7"
+ "\x9b\xc0\x91\x0d\x1f\x8d\x6a\xab\x1e\x47\x2f\xd5\xa8\xc7\xd1\x4b"
+ "\xf9\x37\x87\xa3\x91\x59\x14\x47\x2f\x45\x51\x1c\x8d\x4c\x13\x71"
+ "\xc4\xcf\x35\xbd\x45\x38\x7a\xa9\x8b\x12\x8e\x70\x2d\x82\x0f\xe9"
+ "\xba\x10\x75\xeb\x96\x92\x41\x5b\xf1\xdf\x46\xd2\xbf\x7e\xed\xa8"
+ "\xe1\x07\x96\xd3\xf5\x00\xf4\x9e\xa3\xf8\x7c\xaf\xdc\xf7\xef\xdf"
+ "\x01\x7e\xf1\x9b\x63\x18\x77\x8a\xae\xd1\x80\xeb\x82\x5c\x8d\xd7"
+ "\x91\x7e\xfc\xba\x0c\x2f\x2f\xc7\x75\xac\x9a\xd6\x0e\xf0\x53\x58"
+ "\x3b\x60\xb2\xf2\xda\x01\x8d\x1b\xac\xf3\x6e\x73\x25\xf3\x6e\x5f"
+ "\x1e\xe5\x78\xde\xed\xcb\x4f\x64\x4d\x56\x8b\x87\x51\xfc\xfc\xaf"
+ "\xab\x9d\xe6\x94\xd7\xaf\x7d\x79\x28\x7c\x0e\xa0\xf7\xfe\x32\xbf"
+ "\xde\x8a\xf3\xf9\xb8\xb9\x12\x9c\x8c\xaa\x09\x09\x23\x09\xdc\xda"
+ "\x36\x43\x39\xff\x39\x06\x2e\x5d\xa7\x6e\xfd\x2c\xcf\x97\x93\x1d"
+ "\xdb\x5b\x17\x25\x6f\xef\x3f\xd5\x50\x7b\x0b\xeb\x16\xf8\x29\xac"
+ "\x5b\x30\x59\x79\xdd\x02\x79\x7b\xff\xc9\xc9\x3c\xe7\x3f\x6d\x53"
+ "\x6f\xef\x3f\xcd\xa5\xf6\xd6\x05\xd7\xaf\xfd\x53\xbe\x68\xef\xd1"
+ "\xbd\xd5\xdb\xfb\x4f\x61\xd4\xde\xf7\x0d\xe0\xfc\x75\x51\x60\xef"
+ "\x04\x95\x7d\x31\x3a\xb1\xb7\x02\xbe\xc7\x84\x09\xf6\x16\xf0\xad"
+ "\xb0\x66\xc2\x64\xe5\x35\x13\xe4\xed\x3d\xa6\x97\x63\x7b\x8f\xe9"
+ "\xa0\xde\xde\xa3\x2b\x05\x7b\x03\xbe\xc7\x04\x8a\xf6\x1e\xe3\xe2"
+ "\xba\x02\x52\x7b\x8f\x2e\xa6\xf6\xbe\x3f\x08\xec\x0d\xf8\x8e\x50"
+ "\x89\xef\x31\x3a\xc7\xf6\x8e\x50\xc0\xf7\xd8\x62\x6a\x6f\x61\xbd"
+ "\x06\x3f\x85\xf5\x1a\x26\x2b\xaf\xd7\x20\x6f\xef\xb1\x1b\x1d\xdb"
+ "\x7b\x6c\xa2\x7a\x7b\x8f\x1d\x4d\xed\x1d\x01\xf8\x1e\x9b\x2a\xda"
+ "\x7b\x9c\xaf\x7a\x7b\x8f\x1d\x42\xed\xed\xdb\x85\xf3\x8f\x00\x7c"
+ "\x47\xa8\xc4\xf7\xd8\x0a\x27\xf6\x56\xc0\x77\xf0\x10\xc1\xde\x02"
+ "\xbe\x15\xd6\x8a\x98\xac\xbc\x56\x84\xbc\xbd\x83\xdb\x38\xb6\xf7"
+ "\xb8\xdf\xd4\xdb\x7b\xdc\x3e\xc1\xde\x80\xef\x60\x22\xda\x3b\x78"
+ "\xb9\x7a\x7b\x8f\xdb\x49\xed\xdd\x56\x0b\xf6\x06\x7c\x47\xaa\xc4"
+ "\x77\xf0\x48\xc7\xf6\x8e\x54\xc0\xf7\xf8\x9d\xd4\xde\xc2\x3a\x15"
+ "\x7e\x0a\xeb\x54\x4c\x56\x5e\xa7\x42\xde\xde\xe3\x97\x38\xb6\xf7"
+ "\xf8\xe9\xea\xed\x3d\xbe\x37\xb5\x77\x24\xe0\x7b\x7c\x94\x68\xef"
+ "\xf1\x35\xea\xed\x3d\xbe\x0b\xb5\x77\x3b\x2f\xce\x3f\x12\xf0\x1d"
+ "\xa9\x12\xdf\xe3\x0b\x94\xec\xdd\x1e\xec\x7d\x08\x10\x00\xba\xc3"
+ "\x68\x49\x03\x9d\x62\x66\xed\x5e\x16\x33\x88\xf4\xbd\x8e\xb6\x7f"
+ "\x35\x03\xc6\x6a\xe3\xed\x5b\x2f\xe3\xd5\xc4\x9b\x9f\x3b\xfc\xea"
+ "\x18\xe5\xb9\xc3\xaf\x0e\x54\x3f\x77\xf8\x55\x22\x6a\xa0\x57\x87"
+ "\x8b\x3e\x7d\x95\xe7\x0f\x75\x73\x8a\x5f\x31\xc8\xaf\xa3\xf1\x4a"
+ "\x36\xce\x29\x06\x5f\x1b\x2d\xe9\xee\x68\xa3\x57\x73\x9c\xfb\x5a"
+ "\x17\x63\x49\x03\x8d\xa4\xe8\xeb\x90\x15\x30\x6e\xc5\xdc\xbe\x75"
+ "\x3b\x42\xe6\xdd\xbc\xaf\x43\x06\x2b\xfb\x3a\xa4\x9b\x7a\x5f\x4f"
+ "\xa8\x11\xf5\x57\x48\x7f\xd1\xd7\x21\x6e\xcc\x1f\x9f\x50\x29\xbf"
+ "\x9e\xc7\x84\xd5\xd4\xd7\xda\x30\x4b\xba\x3b\xba\x2c\x24\xd5\x05"
+ "\x5f\xc3\x73\xad\x73\xf0\x5c\x4f\x8c\x02\x5f\x1b\x6f\xdf\xfa\x21"
+ "\x13\x27\xdd\xbc\xaf\x27\xf6\x54\xf6\xf5\xc4\xb6\xea\x7d\xfd\x5a"
+ "\x85\xa8\xfd\x26\x76\x11\x7d\x3d\x31\x5f\xbd\xaf\x5f\x2b\x92\x5f"
+ "\x57\xe4\xb5\x18\xea\xeb\x0e\x85\xe0\x6b\x37\x34\xe1\xc4\xe5\xce"
+ "\x7d\x1d\x01\xcf\x75\x84\x83\xe7\x7a\x52\x18\x8c\xd7\x31\xb7\x6f"
+ "\x1d\x93\x49\x23\x6e\xde\xd7\x93\x3a\x28\xfb\x3a\xb4\x41\xbd\xaf"
+ "\x43\x0f\x8a\xba\x73\x92\x8f\xe8\xeb\x49\x99\xea\x7d\x1d\xba\x5b"
+ "\x7e\x7d\x93\xd0\x99\xd4\xd7\xbf\xeb\x61\x49\x77\x47\x8f\x4e\x52"
+ "\xd4\xff\x12\x5f\xc3\x73\x1d\xe1\xe0\xb9\x9e\x32\x12\x7c\x6d\xbc"
+ "\x7d\xeb\xa9\x4c\x79\xe2\xe6\x7d\x3d\xd9\xac\xec\xeb\xc9\xe7\xd5"
+ "\xfb\x7a\x72\xbe\xa8\x79\x27\xd7\x89\xbe\x9e\x92\xac\xde\xd7\x93"
+ "\xb3\xe5\xd7\x59\x99\x1c\x4c\x7d\xed\x97\x0c\xbe\x76\x43\x0b\x4f"
+ "\x99\xe0\xdc\xd7\x91\xf0\x5c\x47\x3a\x78\xae\xa7\x42\x5c\x1f\x19"
+ "\x73\xfb\xd6\x75\x99\xda\xf5\xe6\x7d\x1d\x76\x51\xd9\xd7\x61\x47"
+ "\xd5\xfb\x3a\x2c\x53\xd4\xdb\x61\x7a\xd1\xd7\x53\xa3\xd5\xfb\x3a"
+ "\x6c\xb5\xfc\x7a\x2f\x61\x43\xa8\xaf\xfd\x6b\x2c\xe9\xee\xe8\xf0"
+ "\xa9\x43\xdd\xd1\xe1\x0b\xb3\x88\x0f\xeb\xef\xd7\xff\x5f\x7b\xdf"
+ "\x03\x10\x55\x95\xfd\x7f\xe7\x8f\x89\x86\x32\x1a\xb8\xd4\x5a\x4d"
+ "\x2d\xee\x52\x5f\x52\x34\x4a\x2c\x4d\x54\x4c\x2c\x4d\xda\xaf\x5b"
+ "\xd4\xba\x89\x8a\x38\x83\xa8\xa8\xa8\xa3\x22\x20\x69\x4b\x86\x80"
+ "\x04\x2c\x26\xff\x2c\x6c\x69\xc3\xa2\xcd\x5a\xdc\xb5\x1a\x15\x37"
+ "\x54\x04\x6a\xad\xaf\x95\xd6\xe4\xa2\x91\xa1\x4d\x8a\x32\xc0\xcc"
+ "\xdc\xdf\x39\xef\xbe\xc7\x9b\xbf\x30\x7f\x94\x75\xfd\x35\xfa\x98"
+ "\x79\xf7\x9d\xfb\xf7\x73\xce\xb9\xe7\x9e\xf7\xde\xb9\x41\x7d\x6b"
+ "\x8b\xcf\x1d\xe4\x3d\xde\xcf\x7d\xe1\x1c\xef\xe7\xf6\xbb\x8f\xf7"
+ "\x73\x59\xa2\x2d\xfe\x5c\x93\x88\xf7\xdc\x38\xf7\xf1\x7e\x2e\xc5"
+ "\xb1\x2d\xfe\x5c\x88\x77\xb6\xf8\xdc\x50\x4f\x6c\x71\x7b\xbc\xe7"
+ "\xf9\xf7\xad\x3d\x1e\x6b\xf2\x1e\xef\xd8\xc3\xce\xf1\x8e\x7d\xc7"
+ "\x7d\xbc\x63\x53\x44\x7b\x3c\x56\x2b\xe2\x3d\x6f\xb6\xfb\x78\xc7"
+ "\x26\x3a\xb6\xc7\x63\x87\x7b\x67\x8f\xcf\x53\x7a\x62\x8f\xdb\xe3"
+ "\xbd\x40\xde\xb7\x36\xf9\xfc\xf3\xde\xe3\x3d\x7f\xaf\x73\xbc\xe7"
+ "\xef\x74\x1f\xef\xf9\x89\xa2\x4d\x3e\xdf\xc2\xff\xbd\x20\xd2\x7d"
+ "\xbc\xe7\xcf\x71\x6c\x93\xcf\xf7\xf5\xce\x26\x5f\xa0\xf0\xc4\x26"
+ "\xb7\xc7\x3b\xae\xad\x6f\xed\xf2\xb8\x53\xde\xe3\x1d\xf7\x86\x73"
+ "\xbc\xe3\xb6\xb9\x8f\x77\xdc\x1c\xd1\x2e\x8f\x2b\x17\xf1\x5e\xe8"
+ "\x41\xfc\xcc\xb8\x19\x8e\xed\xf2\x05\x46\xef\xec\xf2\x85\xc4\x13"
+ "\xbb\xdc\x1e\xef\xf8\xe6\xbe\xb5\xcd\xe3\x8f\x79\x8f\x77\xfc\x76"
+ "\xe7\x78\xc7\x6f\x74\x1f\xef\xf8\x19\xa2\x6d\x1e\x6f\xe1\xff\x5f"
+ "\x14\xe4\x3e\xde\xf1\xe3\x1d\xdb\xe6\x0b\x5b\xbd\xb3\xcd\xe3\xf5"
+ "\x9e\xd8\xe6\xf6\x78\xab\x8e\xf7\xad\x7d\xae\xfa\xc0\x7b\xbc\x55"
+ "\x2f\x3a\xc7\x5b\xb5\xdc\x7d\xbc\x55\xe3\x45\xfb\x5c\x95\x2e\xe2"
+ "\xad\xf6\x77\x1f\x6f\x55\x88\x63\xfb\x7c\xd1\x49\xef\xec\x73\x95"
+ "\xce\x7b\x3f\xf9\xe2\x6a\xb4\xcd\xdd\x8d\xff\xd8\x98\x2c\xbc\x73"
+ "\xa7\xb6\x88\xff\xb8\x78\x27\x71\x1a\x5b\x26\xc1\x74\x7d\xc7\x7f"
+ "\x4c\xe8\x25\xfe\x63\x82\x9b\xf1\x1f\x13\xce\xb8\xff\x3c\x7e\x42"
+ "\xb5\xb8\x46\x48\xb0\x58\xff\x2f\x66\x7b\x14\x5f\xd7\x71\x21\x13"
+ "\x6c\xe2\x42\xaa\xb9\xb8\x90\x34\xfb\x17\xd1\x9e\xad\x45\x16\xef"
+ "\xf3\xfe\xbe\xc0\xd2\x2c\x5c\x87\xb8\x1b\x87\x52\xe4\xed\xc4\x17"
+ "\x45\xde\x5e\xba\xc1\x39\x6f\x2f\xf9\xe2\xfa\x8e\x43\xb9\xe4\x0f"
+ "\x3d\xf3\xf6\x92\xf1\xee\xc5\x1c\x59\xe2\x41\xdc\x9b\x25\x59\xe2"
+ "\x7a\x68\x89\xc5\xfa\x77\x69\x7d\xdf\xf1\xb6\xa7\xf1\x29\x97\x24"
+ "\x59\xf3\x76\x62\x3a\xe3\xed\x5b\x2b\x3c\x5b\x77\x2d\x2d\xf2\xfe"
+ "\x3e\xc8\x72\x15\xae\xb9\xdc\x8d\x87\x29\xf2\xf6\xb2\x85\x22\x6f"
+ "\x2f\x7f\xc6\x39\x6f\x27\xbd\x77\x7d\xc7\xc3\x4c\x1a\xd7\x33\x6f"
+ "\x27\x05\xba\x17\xcb\x24\xa9\xc4\x7d\xde\x4e\x52\x89\x6b\xbf\xa4"
+ "\x2a\x91\xb7\x97\x57\xf6\x21\x6f\x7b\xa8\xb7\x93\x66\x58\xf3\xf6"
+ "\xb2\x39\x8c\xb7\x7f\x69\xf0\x6c\x8d\xb9\x3c\xd9\xfb\xfb\x3e\xc9"
+ "\x91\xb8\xbe\x74\x37\x2e\xa7\xc8\xdb\x2b\x26\x89\xbc\x9d\x6c\x17"
+ "\x17\x4a\xe4\xed\x95\xdb\xae\xef\xb8\x9c\x2b\x03\x7a\xe6\xed\x15"
+ "\x6d\xee\xc5\x48\x59\xb9\xd6\x7d\xde\x5e\x19\x29\xae\x73\x57\x66"
+ "\x8a\xbc\x9d\xbc\xa9\xef\x78\xdb\xd3\x78\x9d\x2b\x83\xad\x79\x7b"
+ "\x45\x38\xe3\xed\x3b\x66\x78\xb6\x9e\x4e\x8e\xf6\xfe\x3e\xd7\x1a"
+ "\x25\xae\xa5\xdd\x8d\x0f\x2a\xf2\xf6\xaa\xdb\x45\xde\x5e\x33\xc4"
+ "\x39\x6f\xaf\x5e\x72\x7d\xc7\x07\x5d\xd5\x4b\xfc\x9f\x55\x3d\xc4"
+ "\xff\x71\xf4\xae\xf0\x6a\x0f\xe2\x5e\xac\x56\x8a\x6b\xfa\xd5\x71"
+ "\x22\x6f\xaf\x89\xed\x43\xde\xf6\x50\x6f\xaf\x96\x5b\xf3\xf6\x2a"
+ "\x7f\xc6\xdb\xca\x72\xcf\x7c\x07\x6b\x42\xbc\xbf\xaf\xb7\xd6\x88"
+ "\x7e\x03\x77\xe3\x94\x8a\xbc\xbd\xa6\x43\xe4\xed\xb5\xe7\x9d\xf3"
+ "\xf6\xda\xe9\xd7\x77\x9c\x52\xcd\xb1\x9e\x79\x5b\x53\xe5\x5e\x4c"
+ "\x97\xb5\x1e\xbc\x07\xaf\x31\x8a\xfe\x8b\xb5\x16\xcf\xbf\xaf\x1b"
+ "\xdf\x77\xbc\xed\x69\xfc\x52\x8d\xce\x9a\xb7\xd7\xe8\x19\x6f\xdf"
+ "\xdd\xe6\x99\x9f\x64\x9d\x8f\xf7\x7e\x92\x0d\x3e\xdc\x3d\x4c\x37"
+ "\xe3\xa5\x8a\xbc\xbd\xee\x33\x31\x36\x51\x4a\x87\x2d\x6f\x8b\xb1"
+ "\x89\x52\x86\x5c\x3f\xf1\x52\xd7\x17\xf4\xcc\xc7\xeb\x93\xdd\xf3"
+ "\x89\xac\xef\x70\x9f\x8f\xd7\xd7\x8a\x3e\x91\x14\x8b\xe7\x5f\x36"
+ "\x08\x7b\x92\xf7\x41\xcc\xa2\x94\x92\x9e\x63\x16\xa5\xa4\x5c\xbb"
+ "\x38\xaa\xeb\x2b\xad\x63\x16\xad\xab\x37\x73\xb2\x30\x22\xca\x33"
+ "\xbf\xca\x06\x7f\xef\xfd\x2a\xe9\xec\xfe\xae\x9b\x71\x5b\x45\x59"
+ "\xd8\xf0\xad\x28\x0b\xe9\xfd\x9c\xcb\x42\xda\xed\xd7\x4f\xdc\xd6"
+ "\xd4\x9d\x3d\xcb\x42\x6a\xba\x7b\x3e\x94\x34\x0f\xe2\xc0\xa4\x36"
+ "\x89\x3e\x94\x34\x7f\x51\x16\xd2\x67\xf7\x9d\x2c\xa4\xbd\xd1\xb3"
+ "\x2c\xa4\x65\x5e\xbb\x78\xae\xa9\x7b\xac\x65\x61\xc3\x09\x26\x0b"
+ "\xbf\xa9\xf7\xcc\x0f\x93\xee\xd1\xfd\x6f\x6b\x59\x78\x5e\xc9\xdd"
+ "\xfb\x76\x33\x7e\xac\x28\x0b\xe9\xe7\x45\x59\x78\xde\xce\x9e\x17"
+ "\x65\x21\xe3\x9e\xeb\x27\x7e\xec\xc6\xdd\x3d\xcb\xc2\xc6\x2c\xf7"
+ "\x7c\x2e\x19\x43\xdc\x97\x85\x8d\x16\xef\x3f\x65\x58\xbc\xff\xf4"
+ "\x7c\x6c\xdf\xc9\x42\xc6\x7b\x3d\xcb\x42\x46\xfe\xb5\x8b\x2b\xbb"
+ "\x51\x6b\x2d\x0b\xe9\xcd\x4c\x16\xee\x8d\xf6\xcc\x6f\xf3\xbc\x0b"
+ "\xf6\x7f\x6f\x7e\x9b\x17\x42\xb8\xe7\x02\xdc\x8c\x63\x2b\xca\xc2"
+ "\xf3\x1d\xa2\x2c\xbc\x70\xbb\x73\x59\xd8\xfc\xc0\xf5\x13\xc7\x76"
+ "\xd3\xde\x9e\x65\x61\x53\x91\x7b\x3e\x9a\xcd\xb7\xbb\x2f\x0b\x9b"
+ "\x5a\x44\x1f\xcd\xe6\x10\x51\x16\x5e\x48\xec\x3b\x59\xd8\xbc\xbf"
+ "\x67\x59\xd8\x5c\x7e\xed\xe2\xdb\x6e\xaa\xb7\x96\x85\xe7\xf5\x4c"
+ "\x16\x42\x8e\x7b\xe6\xe7\x79\x21\xdc\x7b\x3f\xcf\x8b\xe1\xdc\x33"
+ "\x13\x6e\xc6\xd3\x15\x65\xe1\x8f\xfd\x44\x59\x78\xf1\x1e\xe7\xb2"
+ "\x90\x39\xe9\xfa\x89\xa7\xfb\xc7\x43\x3d\xcb\xc2\x1f\x2b\xdc\xf3"
+ "\xe9\x64\xde\xe3\xbe\x2c\xfc\xb1\x4d\xf4\xe9\x64\x86\x8b\xb2\xf0"
+ "\xa2\xa6\xef\x64\x21\xf3\x58\xcf\xb2\x90\x59\x75\xed\xe2\xec\xfe"
+ "\xf1\x84\xb5\x2c\xbc\x60\x64\xb2\x30\x2a\xc6\x33\xbf\xd0\x8b\x91"
+ "\xde\xfb\x85\xb2\x22\xb9\xe7\x49\xdc\x8c\xeb\x2b\xca\xc2\x96\x21"
+ "\xa2\x2c\x64\xf5\xb0\xcf\xc3\x4b\x33\xaf\x9f\xb8\xbe\x5b\x7a\xd9"
+ "\xff\x68\x4b\x4f\xfb\x1f\x39\xf0\x01\xbd\xf4\x80\xfb\xb2\xf0\x12"
+ "\x11\x7d\x40\x2f\x59\xbc\xff\x97\xb5\xa9\xef\x64\xe1\xa5\x5e\xf6"
+ "\x7f\x78\xc9\x85\xfd\x1f\x3c\x8d\xf7\xbb\xa5\xd9\x5a\x16\xb6\xf8"
+ "\x30\x59\x18\x7d\xd2\x33\x3f\x52\x56\xaf\xfe\x7f\x5c\xe7\x77\xf9"
+ "\xdb\xfb\x91\xea\x9b\xc3\xc9\xff\x3c\x8b\xb2\xb0\xd5\x60\x2c\x58"
+ "\x64\xc0\xf8\xc2\xa6\x20\x3e\x06\xe5\x46\x3e\xc6\x4b\x9b\x91\xc5"
+ "\xa0\xd4\x9b\xba\x63\x50\xb2\xd8\x1f\x44\x8a\xef\x02\xe3\x3b\xc1"
+ "\x46\x05\x8b\x3f\x49\xf1\x99\x28\x7c\x46\xea\x74\x1d\x17\x5f\x25"
+ "\xc5\x08\x7d\x3f\xdb\x4b\xfc\xc9\x58\x1d\xa9\x8f\x5d\x47\x8c\x43"
+ "\xbe\x8e\x65\xef\x09\x6f\xcd\xe4\xe2\x4f\xce\x0d\xbc\x2d\xfb\x6b"
+ "\xe2\xef\x87\xf1\x27\x63\xa9\x39\x4d\x47\xf5\x0d\x06\x02\xb4\x30"
+ "\xbe\xf3\x84\x18\x94\x5b\x7f\xc2\xbe\x1b\xe7\x06\xdf\x56\xfa\xb5"
+ "\xb3\xf8\xc2\x5b\x3d\x88\x03\xbb\xb5\x42\xf4\xef\x6c\x6d\x11\x79"
+ "\x34\x9b\x9b\x83\xe1\x7a\x7a\x7d\x0c\xe8\x98\xec\xb0\xd8\x2e\x8f"
+ "\x62\x6f\x64\xcb\x7b\xc7\x8c\x7b\x46\xc4\x4e\x7f\x89\x98\xe5\x54"
+ "\x19\x0b\x54\x1a\x8c\x73\xec\x3a\x66\xfd\x2e\x5e\x1b\xcc\x72\xc6"
+ "\xbb\x8e\x59\xce\x2e\x1b\xcc\x1c\xf8\x21\x72\xb6\xba\x8f\x59\x4e"
+ "\x8c\xe8\x87\xc8\x29\x16\x31\xcb\x69\x65\x98\xe5\x84\x31\xcc\x1e"
+ "\xc8\xea\xf2\x28\x7e\x47\x4e\xaf\xef\x7f\xe3\xba\xa9\xcb\xdf\x7e"
+ "\x5d\x2e\x62\xb6\x2d\x16\x30\x33\x60\xbc\x65\xd7\x31\xbb\xf9\xf4"
+ "\xb5\xc1\x2c\x57\xef\x3a\x66\xdb\x9e\xb1\xc6\xcc\xd1\x7a\x79\x9b"
+ "\x07\x7b\x76\x6e\xf3\x15\xd7\xcb\xdb\xa2\x45\xcc\xb6\x95\x33\xcc"
+ "\x72\x5b\x18\x66\x0f\xd6\x74\x79\x14\x03\x64\x5b\x62\xef\x98\x71"
+ "\xf7\xf4\x7b\x90\xb3\x97\xfd\x8d\x05\xb0\xc6\x84\xf5\xa3\xeb\x98"
+ "\x0d\xf9\xf4\xda\x60\x96\x57\xe1\x3a\x66\x2f\x0f\xb2\xc1\xcc\xc1"
+ "\xba\x2e\xef\xb2\xfb\x98\xe5\x69\xc5\x75\xdd\xcb\x72\x11\xb3\x97"
+ "\x67\x33\xcc\xf2\x8a\x19\x66\x63\x9b\xbb\x3c\x8a\x23\xf2\x72\xaf"
+ "\xfe\x2f\xb4\x43\xbb\xfc\xed\xd7\x39\x22\x66\xf9\x75\x80\x99\x01"
+ "\xe3\x4f\xbb\x8e\xd9\x83\x5b\xae\x0d\x66\xf9\x31\xae\x63\x96\xbf"
+ "\xdf\x1a\x33\x47\xeb\x8f\xfc\x37\xdc\xc7\x2c\x3f\x59\x5c\x7f\xe4"
+ "\xd7\x88\x98\x15\xf8\x30\xcc\xf2\xa3\x19\x66\xe3\x14\x5d\x1e\xc5"
+ "\x22\xc9\x3f\xde\x3b\x66\xdc\x3d\xd8\x1e\xe4\xac\x30\xc5\x58\x00"
+ "\x36\x3b\xd8\xe3\xae\x63\xf6\xfb\xc9\xd7\x06\xb3\x42\x5f\xd7\x31"
+ "\x2b\x5c\x65\x83\x99\x03\x3b\xb9\xd0\x83\x38\xd8\x85\xc1\xa2\x9d"
+ "\x5c\x98\x28\x62\x56\xb8\x8f\x61\x56\x28\x67\x98\x3d\x34\xbe\xcb"
+ "\xa3\x78\x26\x85\x4e\xe3\x7f\xf5\x64\x37\x0a\xcf\xe5\x8b\xb8\x15"
+ "\x85\x5d\x3f\xb6\xe3\x9f\x6a\x5d\xc7\xad\xe8\xbe\xde\x6d\xc7\xa2"
+ "\x00\xf7\x71\xfb\x93\x4e\xb4\x1d\x8b\x82\x44\xdc\x8a\x92\x19\x6e"
+ "\x7f\xda\xe7\x9d\xed\x58\x14\xe1\x89\xed\x68\x8f\xdb\xf6\xd6\xeb"
+ "\xc7\x7e\xdc\x9e\xe2\x3a\x6e\xdb\xcf\xf4\x6e\x3f\x6e\x3f\xe6\x3e"
+ "\x6e\xdb\x8b\x44\xfb\x71\xfb\x49\x11\xb7\x57\x42\x18\x6e\xdb\x93"
+ "\xbd\xb3\x1f\xb7\x3b\x8d\xff\xd6\x93\xfd\x68\x8f\xdb\x8e\x8a\xeb"
+ "\xc7\x86\xdc\x11\xe6\x3a\x6e\x3b\x4a\x7a\xb7\x21\x77\x6c\x76\x1f"
+ "\xb7\x1d\xd1\xa2\x0d\xb9\x23\x5f\xc4\x6d\x47\x33\xc3\x6d\x47\x88"
+ "\x77\x36\xe4\x8e\x6a\x4f\x6c\x48\x7b\xdc\x4a\xe6\x5c\x3f\x76\x64"
+ "\x71\xab\xeb\xb8\x95\xfc\xae\x77\x3b\xb2\xc4\x83\x3d\x8b\x4b\x7c"
+ "\x44\x3b\xb2\x64\x86\x88\x5b\x09\xbf\x07\x4b\x71\xb3\x77\x76\x64"
+ "\x49\xaf\xf1\x3f\x1c\xd9\x91\xf6\xb8\x95\xf9\x5f\x3f\xb6\x64\xa9"
+ "\x1b\xf6\x7f\xd9\xa0\xde\x6d\xc9\x52\x0f\xec\xff\x52\xc1\xfe\x07"
+ "\x79\x2b\xb3\xb0\xff\xcb\x78\xfb\xbf\xb4\xd8\x3b\x5b\xb2\xcc\x05"
+ "\xfb\xdf\xde\x96\xb4\xc7\xad\xbc\xfe\xfa\xb1\x27\xcb\xe7\xb8\x8e"
+ "\x5b\xf9\xa1\xde\xed\xc9\x72\x0f\xf6\x81\x2a\xd7\x88\xf6\x64\xf9"
+ "\x3e\x11\xb7\x9d\xbe\x0c\xb7\xf2\xd9\xde\xd9\x93\xe5\x4e\xe3\x3f"
+ "\x0a\xb8\x99\xfc\x17\x19\xa8\x03\x3f\xe4\x31\x55\x38\x1f\x9b\xf0"
+ "\xb5\x62\x53\xc0\x22\x83\xbb\xfb\xbb\x08\x31\xa7\x0f\x83\xc4\x9f"
+ "\x96\xbd\xf6\x80\x77\x71\xa7\x5f\x3d\xe3\x7d\xdc\xe9\x57\xdf\xb9"
+ "\x7a\xfb\xbb\xbc\xba\xdd\xfd\xb8\xd3\xaf\xc6\x89\x36\xe8\xab\x95"
+ "\x22\xd6\xaf\x71\xcf\x27\xb8\x17\x8f\xfa\xd5\x60\xef\xe2\x51\xbf"
+ "\x76\x1f\xe3\xaf\x9d\x2d\x2c\x1e\xf5\x6b\x41\x7d\xb3\xef\xcb\xce"
+ "\x7c\x8c\x47\x4d\xb3\x1f\x56\x79\x16\x1f\xf9\xb5\xca\xde\xf9\x59"
+ "\xa5\xa1\x0e\x7c\xb4\x22\x3f\xbf\x9e\x68\x0a\x50\x69\xdc\xdd\x67"
+ "\xc6\x9a\x9f\x5f\xef\xe7\x1d\x3f\xef\x7a\xcf\x7b\x7e\xde\xb5\xf1"
+ "\xea\xed\x33\xb3\x4b\xed\x3e\x3f\xef\x0a\x13\x6d\xf3\x5d\x1a\x91"
+ "\x9f\x5f\xaf\x72\x9f\x9f\x2b\x0c\xde\xf1\xf3\x2e\x13\xe3\xe7\x8a"
+ "\x1a\xc6\xcf\xbb\xda\xfa\x66\xff\x99\x8a\x38\xc6\xcf\x13\xaa\x3d"
+ "\x8b\x3f\xfd\xba\xc6\x05\x7e\x36\x50\x07\xfe\x6b\x91\x9f\xdf\x18"
+ "\x0f\xfc\x6c\x70\x77\xbf\x1b\x6b\x7e\xae\xfc\xcc\x3b\x7e\xae\xdc"
+ "\xec\x3d\x3f\x57\x3e\x79\xf5\xf6\xbb\xa9\x1c\xe7\x3e\x3f\x57\xca"
+ "\xc5\x35\x4b\x65\x94\xc8\xcf\x6f\xa4\xb8\xcf\xcf\x7f\xae\xf3\x8e"
+ "\x9f\x2b\x8f\x31\x7e\xfe\x73\x26\xe3\xe7\xca\xda\xbe\xd9\x07\xe7"
+ "\xcf\x61\x8c\x9f\x27\x1a\x3c\x8b\xef\xfd\x86\xd3\xf8\xc7\x22\x3f"
+ "\xab\x35\xd4\x81\x6f\x5f\xe4\xe7\x2a\x5f\x53\x80\x5a\xe3\xee\xbe"
+ "\x3b\xd6\xfc\xfc\xa6\x97\xfb\x5c\xbc\x79\x15\xf6\xb9\x78\xd3\x8b"
+ "\x7d\x2e\x6c\xf7\xdd\x79\x73\x80\xfb\xfc\xfc\x97\xe3\xe2\x5a\xee"
+ "\xcd\x40\x91\x9f\xab\x66\xb8\xcf\xcf\x7f\x29\xf2\x8e\x9f\xdf\xe4"
+ "\xf7\xbf\xf8\x4b\x0c\xe3\xe7\x37\xf3\xfb\x66\x3f\x9e\xbf\xc8\x19"
+ "\x3f\x4f\x8e\xf0\x2c\x7e\x7a\x55\xa0\x0b\xfc\x6c\xa0\x0e\xee\x7b"
+ "\x88\xfc\xfc\xd6\x49\xe0\x67\x83\xbb\xfb\xff\x58\xf3\xf3\x5b\xab"
+ "\xbc\xe3\xe7\xb7\x46\x78\xcf\xcf\xbb\x7f\xba\x7a\xfb\xff\xec\xfe"
+ "\xc2\x7d\x7e\xde\x5d\x21\xae\x71\x77\x5b\xdc\xff\x7f\x7b\xb8\xfb"
+ "\xfc\xbc\xdb\xcb\x7d\x81\xde\x5a\xc2\xf8\x79\x37\xbf\x2f\xd0\x5b"
+ "\x71\x7d\xb3\x2f\x50\xd5\x71\xc6\xcf\x91\x99\x9e\xc5\xa7\x7f\xab"
+ "\xa5\x77\x7e\x4e\xd0\x50\x07\xf7\x84\x44\x7e\x7e\xa7\xca\x14\x90"
+ "\xa0\x71\x77\x1f\x22\x6b\x7e\x7e\x67\xaa\x77\xfc\x5c\x7d\xd9\x7b"
+ "\x7e\xae\xde\x7f\xf5\xf6\x21\xaa\x7e\xc3\x7d\x7e\xae\x4e\x16\xd7"
+ "\xfe\xd5\x16\xf7\xff\xde\xf1\x60\x7f\xa2\xea\x70\xef\xf8\xf9\x9d"
+ "\x09\x8c\x9f\xdf\x36\x30\x7e\x7e\x27\xac\x6f\xf6\x27\x7a\xbb\x82"
+ "\xf1\xf3\xa3\x4d\x9e\xc5\xff\x7f\xa7\xd7\xe7\x3f\x1c\xf9\x37\x04"
+ "\xbf\x94\xc8\xd3\x7b\xd2\xbd\xf7\x71\xec\xb9\xd5\x3b\x9e\x7e\xf7"
+ "\xb0\xf7\x3c\xfd\x6e\xc1\xd5\xf3\x71\xbc\xeb\xc1\x5e\x7f\xef\x46"
+ "\x89\x3e\x8e\x77\xb3\x44\x9e\xde\xa3\x75\x9f\xa7\xdf\xf5\xf5\x8e"
+ "\xa7\xf7\x0c\x61\x3c\xfd\xd7\x7a\xc6\xd3\x7b\x7c\xfa\xc6\xc7\xf1"
+ "\x57\x8d\x77\x3e\x8e\x3d\x59\x9e\xf8\x38\xec\x79\xfa\x6f\xb3\xbd"
+ "\xf7\x73\xbc\x7f\xde\x3b\x9e\x7e\xbf\xc4\x7b\x9e\x7e\x5f\x7d\xf5"
+ "\xfc\x1c\xef\x3f\xe9\x3e\x4f\xbf\x3f\x5c\xf4\x73\xbc\x1f\x2b\xf2"
+ "\xf4\xdf\xf2\xdd\xe7\xe9\xf7\x74\xde\xf1\xf4\xfb\x67\x18\x4f\xbf"
+ "\x57\xce\x78\xfa\xfd\x93\x7d\xe3\xe7\x78\x6f\x86\x77\x7e\x8e\xbf"
+ "\xc5\x7a\xe2\xe7\xb0\xe7\xe9\xbf\x07\x7b\xef\xeb\xd8\xbb\xdf\x3b"
+ "\x9e\xde\xbb\xdc\x7b\x9e\xde\x3b\xe1\xea\xf9\x3a\xf6\x8e\x70\x9f"
+ "\xa7\x6b\xf4\xa2\xaf\x63\x6f\x98\xc8\xd3\x7f\x57\xb9\xcf\xd3\x35"
+ "\x7b\xbc\xe3\xe9\xbd\x7b\x19\x4f\xd7\x24\x33\x9e\xde\x5b\xdd\x37"
+ "\xbe\x8e\x1a\xa5\x77\xbe\x8e\xbf\x87\x79\xe2\xeb\xb0\xe7\xe9\x7d"
+ "\x46\xef\xfd\x1d\xfb\x0a\xbc\xe3\xe9\x7d\x53\xbd\xe7\xe9\x7d\x43"
+ "\xae\x9e\xbf\xe3\x1f\x1d\xee\xf3\xf4\x3f\x2c\xf6\xbf\xd8\x67\xf1"
+ "\xfe\xff\x07\xe3\xdd\xe7\xe9\x7f\x64\x7a\xc7\xd3\xfb\xb6\x32\x9e"
+ "\xfe\x47\x14\xe3\xe9\x7d\x9b\xfa\xc6\xdf\xf1\xf7\x36\xef\xfc\x1d"
+ "\x1f\xf4\x1a\xff\xc2\x91\xbf\xc3\x9e\xa7\x3f\x6a\xf2\xde\xe7\xf1"
+ "\x91\xda\x3b\x9e\xfe\xe8\x56\xef\x79\xfa\xc3\x33\x57\xcf\xe7\xf1"
+ "\xe1\x31\xf7\x79\xfa\xc3\x22\xd1\xe7\xf1\xa1\xc5\xf3\x4f\x5a\x85"
+ "\xfb\x3c\xfd\xe1\x1c\xef\x78\xfa\xa3\x79\x8c\xa7\x3f\x1c\xce\x78"
+ "\xfa\xa3\x98\xbe\xf1\x79\x7c\x50\xe7\x9d\xcf\xe3\xa3\x93\x9e\xf8"
+ "\x3c\xec\x79\xfa\x40\x85\xf7\x7e\x8f\x03\x13\xbc\xe3\xe9\xfd\xe7"
+ "\xbd\xe7\xe9\xfd\x7b\xaf\x9e\xdf\x63\xff\x4e\xf7\x79\x7a\x7f\xa2"
+ "\xe8\xf7\xd8\x6f\x11\xff\xfe\x40\xb3\xfb\x3c\xbd\x3f\xd4\x3b\x9e"
+ "\x3e\xf0\x00\xe3\x69\xad\x9e\xf1\xf4\x81\x90\xbe\xf1\x7b\x68\x8b"
+ "\xbd\xf3\x7b\x1c\xb0\x7b\xfe\x6d\xe5\xc2\xa5\x71\xca\x65\xf1\xf1"
+ "\x2b\x17\x26\x2b\x57\x26\xaa\x17\x2c\x9c\x30\x42\x38\x9f\x10\xaa"
+ "\x19\xa1\x19\x48\xe2\x96\xcc\x9b\xbb\x7a\x8c\x78\x31\x71\xe1\x52"
+ "\xf8\x1a\x48\x54\xf3\x56\xaa\x94\xc9\x6b\x93\x16\x2a\xf1\x6c\xc9"
+ "\x82\x24\x20\x59\x96\x2c\xa6\xfc\x76\x61\xe2\x3c\x8d\x7a\xe9\x22"
+ "\xe5\xbc\x44\xf5\xa2\xa5\x4b\x16\x2e\x4d\x56\xae\x58\xb8\x7c\x95"
+ "\x7a\xc5\x42\xfc\xbd\x52\x19\xbf\x6c\x05\x24\x2c\x58\xa8\x5e\xbd"
+ "\x50\x39\x7f\x55\x7c\xfc\xc2\x15\x2b\x07\x92\x99\xab\x12\x93\xd5"
+ "\x49\x89\x0b\x95\x91\x33\x27\xdd\x37\x7b\xea\xff\xce\x9e\x38\x71"
+ "\x20\xb1\xd8\x7b\x5a\x49\xf3\xb7\xe8\x81\x87\xe4\x67\x65\x8d\xf3"
+ "\x1a\x02\x09\xd9\x0a\xbc\x99\xb3\x82\x28\x5e\x5c\x41\xe4\x99\x17"
+ "\x89\xcf\xd6\x8b\xc4\x57\x99\x40\x22\xe8\x90\x9d\xb1\x39\x17\x89"
+ "\x3f\x1d\x36\x52\x43\xb7\x7d\x51\x4e\x87\x9c\xd2\xe9\x87\x1c\xc8"
+ "\x85\x34\x05\xdd\xb6\x5f\x8b\xd7\x00\x0b\x39\xdd\xf6\x75\xd4\x69"
+ "\x59\xa3\x52\x3f\xe4\x60\x52\xda\xf7\x44\x4a\x07\xd7\x2a\xde\x32"
+ "\xeb\xa5\xfb\xd1\xcb\x06\x63\x45\x64\x87\x82\xe1\xf0\x87\xa3\x16"
+ "\x8e\xe3\x44\xf6\xcf\xe1\x70\x44\xc2\x31\x03\x8e\x1a\x22\xfb\x98"
+ "\xc0\x11\x0a\x07\xa4\x7d\x1c\x03\x47\x1c\x1c\x89\x44\x56\x07\xe9"
+ "\x75\x4a\x38\xe0\x5a\x5d\x14\x2b\xa7\x2e\x1a\x8e\x26\x22\x3b\x1c"
+ "\x08\x07\xe4\x3f\x02\xe9\x47\x92\x89\xec\x28\xd0\x1d\xc9\x87\xa3"
+ "\x1a\x0e\x28\xf3\xc8\x49\x48\xc3\xfc\xb3\xd9\xb5\xa3\xf5\x44\x56"
+ "\xef\x03\x07\x94\x51\x0f\xf5\xd4\x6b\xe0\xc8\x82\xa3\x08\x8e\x72"
+ "\x38\xa0\x6d\xf5\x48\xa3\x23\xb2\x63\xd0\x86\x63\xb1\x70\x6c\x82"
+ "\x03\xca\x69\x80\x3a\x1a\x8a\x09\xf4\x91\x1d\x0d\xcd\xe2\x6f\xee"
+ "\x08\xb4\x39\xb7\x3d\xc2\xfd\x36\xde\xa9\xd3\xde\x6b\x04\xb9\x3d"
+ "\xb4\xd9\x94\x41\x64\xa6\x6d\x07\x93\x92\xee\x25\x92\x73\xb2\x43"
+ "\x4f\x36\x6e\x22\x84\x2a\xbe\x28\xd7\xae\xeb\xc4\xeb\x4f\xe2\x98"
+ "\xb5\x67\x1f\x8a\xd6\x91\xb7\x8a\x50\x3e\xdd\xe3\xcf\x43\xd1\x7c"
+ "\xfe\x5c\x9d\xe4\xb1\x58\xcc\x4f\xf3\x16\x1e\xa7\x69\x31\x3b\xf0"
+ "\x3d\xdc\xb3\x38\x86\x28\x37\xb9\x0b\x43\xa8\x62\x6e\x15\xea\x18"
+ "\xed\x3a\xae\x5d\xf7\x80\xbc\x0d\x86\xfc\xc1\x14\x70\xd4\x07\x00"
+ "\xe6\x19\x44\xce\x9d\x6f\x3b\x90\x4b\xcb\x0b\x4e\x30\xbd\x73\x88"
+ "\x5b\xbf\x74\x04\xa4\x85\xe2\x35\xc3\xae\xa7\x9b\x68\xc5\xb3\xb1"
+ "\xda\xa5\x9d\xa4\x59\xf6\xcf\x00\xd0\x7f\x52\xfa\xeb\xa7\x9b\xcc"
+ "\x85\x69\xa1\x35\xc0\x03\x48\xb3\x37\xb5\x05\xbf\x83\xa0\xdf\x52"
+ "\x9a\x9f\x66\x40\x1f\x90\x36\x35\x0f\x74\xf2\xa1\x7b\x3a\x02\x0a"
+ "\xb4\xca\xc7\xfc\xe8\x69\xac\x47\x8a\xf1\xd6\x0f\xf1\xcf\xf3\x1f"
+ "\x0a\xee\x08\x18\x99\x8e\x65\x9b\xca\x0b\xd3\xe1\x9a\x9c\x02\xef"
+ "\x41\x1b\x24\x17\x20\x9f\xa9\x60\xa4\x46\xfb\x18\x57\xe7\x3b\xd0"
+ "\x4e\x69\xda\x74\x28\xfb\xd5\xc2\xf4\xb7\xd7\x19\xa4\x14\xdb\xee"
+ "\x3f\x52\x03\xbc\xee\x6b\xca\x3e\xa0\xdf\x3e\x94\xc8\x4b\xf2\x08"
+ "\x29\x1b\x4a\x7c\xda\xb3\xff\x59\xa9\x93\x47\x55\x30\xbd\x77\x28"
+ "\x58\x0a\x34\x3a\xd9\x3f\x37\x51\xc0\x83\xab\x2b\x7f\x5d\x52\x0f"
+ "\x75\x75\x74\xd7\x55\xb8\x2e\x09\xeb\xe2\xc6\x87\x8d\x15\xfb\x2d"
+ "\x94\x53\x11\xd3\x53\x9b\x2f\x63\x19\x50\x6f\x0b\x7d\x3d\x26\xdd"
+ "\x54\xb8\x31\x1d\xaf\x21\x3d\x1b\xff\x03\xb9\x7e\x1b\x49\x1b\x85"
+ "\x34\x13\x8f\x81\x09\x31\x90\xa6\x83\xfe\x3a\x54\x87\xf5\xe9\x64"
+ "\x1f\x87\x99\x32\x94\x44\xf9\x18\x21\xad\xb2\x8f\x39\xdf\x04\x55"
+ "\xc4\x17\x33\x8c\x3f\xde\xaa\xa9\xa3\x66\x38\x4c\xa3\xea\x88\x44"
+ "\xfb\x18\xe2\xfb\x71\x95\xf2\xd1\xfe\x30\xce\x1f\xef\xee\x1e\xdf"
+ "\xbb\x0a\x71\x8c\x14\x30\x2e\xbe\xa6\x17\xa6\x40\xbf\x95\x04\xfb"
+ "\x61\x39\x5e\xd8\x9f\xf6\xec\x8f\x4f\xda\x8c\x99\x62\xfa\xf4\x34"
+ "\x6a\x51\xf6\x2e\xcb\xfe\xb7\x67\xd7\xf9\xea\x24\x53\x2a\x91\x5e"
+ "\x79\x37\xc7\x33\xf7\x98\xf8\xeb\xc8\xf7\x88\x33\x0d\xd8\xa2\xc7"
+ "\xf3\xdf\xdd\x43\x14\x7e\x75\x44\xaa\x4c\x0d\xaa\x61\xfc\x90\x66"
+ "\x80\x71\x31\xb0\xf2\xa0\x8f\x85\x89\x51\x90\x37\x58\xe4\xbf\xba"
+ "\x4c\xd3\xb6\xf8\xfc\x8e\x80\xf4\x6a\x43\xc1\xda\x24\x9a\x1b\x9f"
+ "\x8f\xef\x9f\x9f\x96\xd5\x6d\xe4\xc6\x20\xc3\x87\xb0\x76\xc4\x17"
+ "\xa5\x26\x52\x7d\xea\x4f\x50\xd7\xb0\xf4\xea\xbd\xab\xf5\x80\xd9"
+ "\xda\x24\xe4\x89\x9a\x2b\x06\x29\xc6\x04\xa4\x83\x0f\x0e\x2d\x65"
+ "\x7d\xf5\x81\xbe\x12\x2c\x17\xda\x5e\x27\xf6\xb5\x2e\x11\xf9\x03"
+ "\xea\xa8\xe2\x79\x3f\x18\xda\x25\x81\xb2\xab\x80\x4e\xaf\x93\xfc"
+ "\xa8\xe7\xe4\x6b\x35\x3d\x9e\xd3\x49\xc8\xa5\xd5\xd4\x38\xcb\xf8"
+ "\x8d\x19\xe6\x65\xd2\x9e\x7d\x58\xa1\x23\xbf\x2f\x17\xc6\x8c\xc9"
+ "\x5c\x77\x39\x5c\xac\x08\xfd\x10\x2c\xe7\x70\xb8\xa3\x72\x74\xb2"
+ "\xc3\x64\xae\x51\x29\xe9\xbc\x42\x9b\x72\x9e\x82\xb6\x65\x10\xda"
+ "\xb9\x9a\xd6\x6f\x88\xa2\x86\xec\x4f\x09\xd8\x46\x27\x09\xe8\xda"
+ "\xe1\x83\x25\x54\x3f\x6b\x2d\xf1\x1b\x9c\xe4\x47\x0f\xd7\x9d\x24"
+ "\xeb\xa3\x68\x4b\xa3\xc6\x44\x1a\xda\x9a\x49\xca\x17\xc4\x37\xed"
+ "\x18\xf1\x4f\x89\xa2\xfa\xfa\xd8\x93\x84\xa5\x1f\x23\x69\xdf\x12"
+ "\xf9\xfa\x5a\x6a\x78\x02\xe6\xe9\xa3\x27\x31\xbd\x19\xd2\x4d\x24"
+ "\xad\x85\x1a\x53\xff\x40\x7c\xf1\xf7\xb1\x5a\x4c\x3f\x43\x40\x9e"
+ "\xe5\xb3\x34\x7a\xbf\x52\xa8\x13\xf3\x97\x41\x5b\xcc\x57\xe8\xbe"
+ "\x9c\x2b\x84\xac\x7f\x86\x04\xa6\xcc\x23\x8a\x59\x60\x2e\x34\x1a"
+ "\xdf\x23\xb3\x4c\x14\xec\x80\x43\x64\x83\x9a\xf8\xcc\x32\xe2\xfb"
+ "\xe3\x9f\xc1\x51\x42\xca\x80\x16\xfa\xa6\xc5\xbe\xad\x3f\x05\x76"
+ "\xd1\x79\x21\xcf\x07\x7c\x9e\x53\x04\xc7\xac\x63\xc8\xa9\x26\xc3"
+ "\xb6\xaf\xa3\xa1\xef\x72\x1c\x03\xa8\xa7\xc9\x8c\xf9\xae\x70\xf3"
+ "\x13\x8e\x81\x64\xae\x11\x78\xb5\x40\x13\x3d\x57\xa3\xe5\xca\xd5"
+ "\xc9\x8e\x44\x94\xad\xe0\xda\x64\x45\x3b\xcb\x48\x2f\xe9\x03\x34"
+ "\x50\xd6\x11\xd5\x2c\xcd\x44\xca\xe3\x56\xd9\x9e\x7d\xa4\x52\x18"
+ "\x6f\x01\x17\xa0\x29\x06\x2c\x2a\x65\x49\x44\x0e\xd7\xeb\x74\x92"
+ "\x8b\xf5\x16\xbc\x8b\x7a\xeb\x26\x81\x96\xa7\x69\xd5\x49\x7e\xf2"
+ "\xb7\xa0\xd9\x07\x3c\xdd\x4d\xd3\x9e\x7d\x14\xf8\xff\xe2\x70\xf1"
+ "\x3a\xc7\xcf\xdd\xd7\xf9\xf9\x57\x28\x5b\x06\x7a\x38\xdd\x14\x90"
+ "\x4e\x68\xc0\x28\x05\xbd\x14\xe8\x4b\xa5\x80\x8d\x91\x1a\xcc\x05"
+ "\x8b\xa3\x61\x8e\xf5\x6d\x34\xb6\x11\x46\x7f\xf4\x1d\x5a\x30\x2a"
+ "\x90\x3d\xf3\x7a\x74\x3b\x96\x09\xb6\x58\x39\xcc\xd7\x8a\x59\x75"
+ "\xd4\x80\xfa\xc3\x54\x30\x36\x37\x7b\x05\xcc\xd9\x05\x69\x7a\x73"
+ "\xc0\x7a\x62\xd8\x59\xd0\x84\x73\x02\xca\x1b\xcd\x87\xbc\x7c\x39"
+ "\x50\x6f\x3f\x9d\xec\x68\x92\x09\xf2\xd3\xfc\xc5\xd1\x2c\x9d\xe9"
+ "\x37\xa6\x87\x8e\x26\xd1\x11\x70\x2d\x77\xee\x26\xb8\xd6\xef\xb4"
+ "\xec\xa8\x11\xd2\x09\x9c\xef\xd3\xa6\x5e\x04\xda\x7a\x09\xe3\xe9"
+ "\xb9\xe9\x56\xe7\x52\x1c\xcf\x8f\x67\xa0\x8e\x42\xdd\x04\xe9\x77"
+ "\x89\x7a\x82\xcd\x01\x4c\xb7\x2f\x8e\x6d\xcf\xae\x0f\xd3\x49\x66"
+ "\x9e\xc0\x71\x42\x6c\xdb\x98\x5e\x0b\x37\xed\x2c\x38\x71\x30\x8a"
+ "\x90\x83\xb5\x28\x47\xf5\x31\x3a\xc9\xac\x56\x71\x2c\xeb\x97\x23"
+ "\x2d\xd7\x4e\xd0\x25\xf8\x9b\xd3\x2b\x90\x07\xe4\xbc\x1c\xe7\x2c"
+ "\xa6\x1f\xeb\x13\x71\xde\x02\x3d\xe1\xc3\xe6\xa9\x98\x18\x28\x7b"
+ "\x0e\x1d\xfa\x4a\x26\xb4\x2b\xfd\x34\xdf\x16\xcb\xb6\x09\x7a\x91"
+ "\x6e\xdb\xe1\xc3\x68\xe3\xab\xa1\xfe\x13\x3a\x49\x74\xad\x25\xbf"
+ "\xb0\x7e\x1d\x9b\x04\x3c\x7d\x62\x54\x2d\x9c\x83\x2d\x25\x94\x07"
+ "\xfa\xc5\x07\xf4\xca\xbd\xc8\x6f\xa8\x53\x8a\xf2\xd0\x3e\xda\xa1"
+ "\x30\x6c\xdb\x11\xd8\x9e\x7d\x2c\x48\xd0\x2d\x98\x17\xe5\x01\xf4"
+ "\x8b\x0f\xa7\x37\x4c\x46\x19\x27\xf3\x26\x12\xd2\xad\x4b\x20\xad"
+ "\x63\xc8\x0e\x05\x9f\x2e\xe7\xda\x24\x95\x99\xa1\x7e\x89\x50\x5f"
+ "\xc7\x90\xf8\x72\x28\x37\x45\x27\x99\x60\xb0\xd2\x35\x79\x73\x02"
+ "\x29\x8d\x41\xbe\x91\x41\x5b\x77\xc2\x77\x7f\x9e\x4f\x6f\x3e\x08"
+ "\x66\x55\xe4\x54\xa8\x03\xf0\xdc\x3e\x8c\xea\x21\xff\x3e\x1d\xc9"
+ "\xe4\xda\xf5\x22\x9c\x63\x3a\xd2\x40\xfa\x71\x1d\x79\x31\x9f\x2f"
+ "\xb7\x0e\xf1\xb1\x2e\xb7\x41\xc2\xca\x6d\xe8\x87\xe5\xf1\x73\xfc"
+ "\xcd\xf8\x1b\xf3\x63\xd9\x25\x85\xb4\x15\xcb\x6b\xcf\x6e\x50\x0a"
+ "\x75\x6c\x85\x34\xa1\x9e\xc8\x25\x42\x5d\x0d\x11\x50\xd7\x70\xcb"
+ "\x3e\x14\x15\xd2\x36\xd6\xbe\x86\x39\x3a\x52\x52\x87\xd7\x32\x21"
+ "\x0d\xf3\x32\x5e\x68\x58\x8b\x7c\xa2\x63\xfd\x92\x31\x7e\x69\xc8"
+ "\xd4\x91\xe2\x68\xcb\xb9\x07\xb0\x18\x24\xcc\x4d\x7c\x79\x55\x42"
+ "\x79\x62\x59\xac\x0c\x9a\x5b\xec\xc3\xcb\x02\xca\xac\x2f\x96\x0f"
+ "\xf4\x27\x75\xe4\x25\x7e\x4e\xf8\x78\x46\x1b\xe3\x6d\xc4\x00\xf3"
+ "\x30\xcc\xb3\x0f\x86\xe3\xbc\x59\x96\x87\x7a\x2c\xbe\xb8\x3d\xbb"
+ "\x51\x61\x33\x67\xfa\xb0\xf9\x2c\x5d\x89\xbc\xc1\xcb\xff\x93\xd8"
+ "\x26\xa1\xbf\x50\x8e\x1c\xca\x79\x0c\x79\x1a\xcb\x01\x3d\xa7\x83"
+ "\x72\x62\x6c\xca\x91\x23\x9d\x29\xfb\x60\x1a\xce\xd1\x2f\x0f\xa3"
+ "\x2d\x40\x93\x22\xd0\xe0\x75\x18\xd7\x47\x20\x2d\x57\x47\xaa\x12"
+ "\x31\x2d\x1b\x68\x74\xb2\x83\x4e\xdf\xdb\x49\xbd\x8b\x48\x1b\x8b"
+ "\x75\xb8\xa6\x45\xf9\x1d\xdf\x38\xbc\x8d\x34\x16\x9b\x89\xf9\xf5"
+ "\x67\x48\x44\x2a\xd5\x9e\x95\x35\x0d\x6a\x30\xb4\xb8\xb9\xf6\x6f"
+ "\xe4\x9e\x7f\xa7\x9d\xb0\xf6\x4a\x19\x43\xd0\x2e\xb9\x20\xfb\x64"
+ "\x42\xa3\xfe\x22\xa7\xcb\xe0\x37\x37\x07\xbe\x0c\x6b\x35\x5c\xaf"
+ "\xc1\x9a\x5c\x95\x2b\x65\x6b\x36\x33\xd0\x96\x62\x3a\xae\xe7\x60"
+ "\x8e\x2a\xb3\xb8\x46\x5f\x7f\x3a\x9d\x8d\x5d\xd3\x65\x4e\xa7\x63"
+ "\x7b\x8d\xd3\xb4\xd8\x66\x73\xc5\xd3\xe9\xd8\x87\x34\x0d\x35\x37"
+ "\x1a\xdb\xb5\x38\x8f\x29\x57\xe3\x5a\xb3\xe9\x93\x59\x25\x84\x9a"
+ "\x77\x3d\xed\xe6\x5a\xaf\x89\x7b\xf7\x06\xd6\xe3\x17\xf4\x23\x9e"
+ "\x4e\x4f\x33\x11\x69\x4e\x6a\x3f\x9f\x29\xc5\x54\x7b\xe9\xd7\xcf"
+ "\x00\x5f\x34\xb5\xed\xd7\x10\xe2\xbe\x8d\xde\xd4\x26\xf4\xbd\x94"
+ "\xef\x3b\xa4\x71\xef\x8b\x8c\x2a\x4a\xe7\xfa\xab\x93\x7d\xe2\x34"
+ "\xd6\x1b\xcd\xf0\xa3\x07\x8b\x8d\x64\x65\x31\xed\x5c\x59\x42\xa4"
+ "\x60\x23\x35\xbd\x5d\x7a\x02\xf5\x76\x84\x30\x9e\xdc\xd8\x19\xf5"
+ "\x24\x29\x95\x28\xce\xc9\x3e\xf9\x6c\x56\x4a\x3a\xb7\x77\xd3\x47"
+ "\x40\xe7\x5e\x5b\x3f\x29\xc7\x76\x34\xc0\xfa\x7e\x96\x31\x8d\xb2"
+ "\xb9\xe7\x13\xd3\x13\x7c\x79\x78\x4d\xc0\xaf\x94\x5f\x77\xbb\x5f"
+ "\xc7\xa7\x4e\xe3\x7f\xf4\xd0\x57\x85\xe3\xbe\x7e\xba\xdf\xf3\xbe"
+ "\x7e\x9a\x65\xdf\xd7\x4f\xbf\xbf\xca\x7d\x75\xba\xff\x57\x0f\x7d"
+ "\x55\x3a\xee\xeb\xbf\x76\x7b\xde\xd7\x7f\x69\xec\xfb\xfa\xaf\xcf"
+ "\xae\x6e\x5f\xff\xe5\xd4\xff\xd7\x43\x5f\x43\x1d\xf7\xf5\xf8\x76"
+ "\xcf\xfb\x7a\x3c\xce\xbe\xaf\xc7\xf7\x5f\xdd\xbe\x1e\xaf\x73\xda"
+ "\x57\xa9\x1f\x45\xfd\x04\x7a\xa9\x33\xb5\x03\x6c\xb6\xc2\x8c\xdc"
+ "\x0d\x3b\x89\xb4\xbe\xcd\x40\x1a\x86\x9f\x20\x69\x6b\x89\x74\x64"
+ "\x12\xe8\xbd\x0c\x32\x9e\x16\x8e\xcc\x6d\x28\x6e\x85\xf4\xb3\xe4"
+ "\x98\xc6\x40\x22\x56\xa0\xfe\xfd\x6c\x6b\x63\x9c\xbb\xfa\xf7\xb3"
+ "\x98\x6e\xfd\x6b\x1c\xc3\xeb\xdc\xcf\xf7\x36\xb4\x76\x12\xec\x3f"
+ "\xfc\xde\xd5\xad\x7f\x33\xd8\x78\xdb\xea\x5f\x1c\x8f\x46\x83\xc1"
+ "\x4a\xff\xb2\xf7\xb7\x3e\x5f\x6e\xab\x7b\xb3\xcf\x11\xe2\x58\xf7"
+ "\x7e\x3e\x13\x75\x6f\x29\x5c\x77\xaf\xfd\x9f\x07\x0a\xba\x37\x17"
+ "\xea\xb4\xd4\xbd\x07\xe3\x70\x4e\xfe\x3c\xc9\x33\xdd\xfb\x79\x92"
+ "\xd0\xef\x12\xbe\xdf\x30\x56\xc7\xad\x75\xef\xe7\x4e\xdf\x75\xb1"
+ "\xe4\x5b\x5a\xb8\xa8\xfa\xed\x3b\x0c\xfd\xcc\x15\xcf\x68\x71\x7e"
+ "\x6b\x87\x31\xf9\x5b\xa9\x41\x7e\x56\xf6\x7f\x2c\x56\x41\x7b\x9c"
+ "\x84\x56\xc4\xa8\x66\x25\xd3\x6f\xe8\x88\x67\xb4\xe8\x43\x45\x5f"
+ "\x00\x5c\xff\x03\xdd\x15\xa3\x72\xaf\xdd\xac\x4c\x98\xff\x48\x2a"
+ "\xc8\xcb\xdb\xab\x0d\x52\xf3\xfa\x18\x3f\xc0\x41\x41\x0b\x16\xeb"
+ "\xe9\x0b\xff\x3b\xfe\x52\xc1\xc6\xd8\x43\xc1\x67\x08\xd2\xd2\x8d"
+ "\xf2\x08\x2f\xda\xdf\xd2\x73\xfb\x4f\xdc\xee\x41\xfb\x5b\xdc\x68"
+ "\x7f\x8b\x4b\xed\x1f\x06\xed\xef\x0c\xef\x07\x6b\x42\xe9\x47\x9d"
+ "\xe1\x72\xf7\xda\x73\xc2\xe9\xfb\x1f\x57\xb1\x0e\x97\xf5\x1f\x1d"
+ "\xa6\xd1\xbf\x5d\xaa\x97\x82\x0e\xe0\xe6\x70\x94\x3d\xa6\xff\x5a"
+ "\x40\x67\x7d\x43\x99\x4e\xd2\xbb\xa9\x93\xbe\x98\xe3\x7a\xfd\x4b"
+ "\xa2\xaf\x41\xfd\xce\xfb\x6f\xab\x13\xdf\x7a\x56\xe7\x5c\x27\x26"
+ "\x46\xdb\xeb\xc4\x2f\x77\xba\xaf\x13\xbf\x4c\xb4\xd7\x89\x5f\x1d"
+ "\x13\x75\xe2\x57\x7b\x3d\xd7\x89\x5f\x6d\x76\x5d\x27\x7e\x35\xcf"
+ "\x33\x9d\xf8\x55\x48\xcf\x3a\xf1\xab\x4d\x9e\xe9\xc4\xaf\x36\xd9"
+ "\xeb\xc4\x2f\x5b\xac\x75\xe2\x57\x4e\xf7\xfa\xa3\xb9\x8f\xeb\x60"
+ "\x8e\xf6\x3d\x27\x3b\x99\x65\xcc\x20\xc4\x9c\xfb\x71\xe6\x2c\x13"
+ "\x6d\xa7\xdb\x1e\xd7\x99\xa5\x61\xa8\x57\x22\xda\xdb\x55\x3e\xe6"
+ "\x35\xc1\xbe\x74\xe8\xdc\x7b\x69\x57\x20\x81\x71\x0a\x82\xf6\xfb"
+ "\xd1\xf6\xe0\xc1\x74\x4d\xf0\xd0\xe2\x2b\xc4\x1f\x8e\xc0\x62\x7e"
+ "\x3e\x86\xdf\xa1\x74\x4d\xe0\xc0\xec\xd5\x24\xc4\xaf\x8d\xf8\x40"
+ "\x1b\x62\xfc\x36\x2a\x08\xe8\x20\x7f\xfc\x4d\x33\xbe\x09\x2e\xbb"
+ "\x42\xe4\x7e\x1a\xc0\x66\x08\xd4\xa7\xf1\xa3\x74\x65\x30\x29\x5b"
+ "\x41\x7c\xcc\x52\x12\x58\x2a\xa5\xd5\xc6\xf6\x60\xa9\xc9\x3f\x5d"
+ "\xc1\xf0\x39\x15\x41\x87\xc1\xda\x2b\x3f\xed\xa4\x79\x58\x5a\xad"
+ "\x29\x4d\x25\xa3\xeb\x63\x64\xd8\x56\x53\x7e\x9a\x96\x16\xc2\x91"
+ "\xa6\x1a\x8c\x36\x74\xd9\x6a\xa8\xbb\x3d\x70\x60\x0e\xd4\x5d\xba"
+ "\x9a\x04\x95\x5c\x21\xc1\xf4\x52\xb0\x14\xf0\x8f\xc1\x3d\x50\x61"
+ "\x8c\x62\xcc\xd2\x6f\x82\xe1\x9a\x1c\x75\x22\xc5\xfa\x8d\x50\x7f"
+ "\x57\x30\xfa\xb1\x80\xb7\x49\x60\x19\xd4\x6f\x5a\x13\xec\xa6\xbc"
+ "\x9c\xe2\xde\x3d\x16\xda\x65\x0e\x99\xaf\xa3\x6f\xc1\x81\xed\x82"
+ "\x31\x2c\xc3\x31\x19\x39\xbf\x19\xdb\xb6\xf5\x0a\x09\x81\x76\x06"
+ "\x41\x1b\x82\xa1\x5e\x8c\x1f\x13\xf3\xdc\x72\x05\xf2\xa8\x55\xdb"
+ "\x4c\xdb\xf8\xb6\xfd\x08\x6d\xbb\x20\xb6\x0d\xeb\xc2\xf1\x71\x76"
+ "\x6f\x76\xd6\x86\x3b\x50\x36\xbf\xf3\xd3\xf4\x8f\xc2\xfb\xb4\x97"
+ "\xd6\xbb\xfb\x2c\xe5\x29\xa7\xef\x3f\xe7\xbc\x45\x86\x53\xc5\xfe"
+ "\xcc\x27\x36\x7f\x43\xd1\x4f\xb8\xf9\x2d\x12\xd2\x08\x72\xdd\x60"
+ "\x38\x4f\xe8\x90\xfd\x99\x87\x82\x5b\xdd\xac\xeb\x6b\xa7\xf1\x4f"
+ "\xb7\x64\xd0\x26\xb3\x7f\x3a\xa1\xfe\x1b\x63\x72\x32\xa8\xa6\x2b"
+ "\xe8\xe9\xf2\xce\xa0\x98\xa4\xb9\x46\x05\xf0\x35\xd5\x28\x57\x10"
+ "\xe5\x59\x59\xf3\x8b\x47\x8e\xc3\xba\xf4\x59\xe2\x73\x5a\xd6\xac"
+ "\x4d\xfb\x02\xef\x61\x7d\x7d\xdc\xfa\x1e\xd6\xd7\x06\x22\xd3\xa9"
+ "\x88\xec\x5b\x0d\x91\x9d\x2e\x26\x40\x67\x7d\xfc\xbb\x86\x95\xa5"
+ "\x9b\x3a\xeb\x8d\x3b\x48\xaa\x91\x7e\x47\xf3\x47\xd5\x65\x4b\xa9"
+ "\x61\xd6\x3d\x12\x9d\x76\x35\xde\xdb\xd1\x4d\x80\x31\xfd\x01\xe6"
+ "\x5a\x3f\xf8\x3d\x00\x30\x25\x49\x2b\xc8\x2d\xe7\x64\x3a\x1f\x94"
+ "\x1b\xbf\xb6\xfe\x51\xa6\xb4\x18\x62\x54\x16\x34\x75\xe5\xa7\xe9"
+ "\x4d\xf9\x8b\xa3\xcd\x8a\x8f\x33\xd1\xcf\x8b\xf7\x64\x41\x36\x62"
+ "\xe6\x9a\x7c\x50\x1e\x63\xb4\xf3\x8f\x90\xb3\xc9\x44\x9a\x76\x99"
+ "\x0c\x02\xde\xec\x96\xab\x99\xad\x7e\x86\x0d\xad\xd4\x8c\xb2\x85"
+ "\x7e\x55\xb8\x36\x38\xf5\x32\xac\xef\xf5\x2d\xa4\x78\x05\xf1\x37"
+ "\xad\x54\x0d\xd5\x5f\x52\xdd\xb2\xc3\x4c\xfc\x07\xb7\x11\x45\xf1"
+ "\x45\xe0\xa9\x95\xc0\x4f\x17\x41\xce\xf4\x4c\xce\x30\x06\x40\x29"
+ "\xca\x58\xf6\x4d\xa1\x65\x17\x99\x8c\x71\x7c\x84\x32\xb6\x0c\xf8"
+ "\x68\x29\xce\x1f\xc0\x47\x19\x20\x63\x20\x17\x34\xfb\x54\x4d\x71"
+ "\x06\x45\xbf\xaf\xb4\xec\x5c\x7f\xbc\x26\xe9\x77\x8f\x54\x79\x24"
+ "\xda\x40\x44\x5f\x47\xf3\xfe\xce\x11\x31\x49\xca\xdf\xd2\x1f\x4f"
+ "\xcb\x74\x61\x90\xee\xa3\x7c\xea\x37\x0a\x18\xef\xfd\xcc\xef\xd6"
+ "\xac\x45\x5f\xa6\x0e\xc6\x02\xc7\x45\xf9\x5b\xf2\x9b\xd3\xb2\x6f"
+ "\x06\xe0\x38\xae\xa9\x24\xb2\xa4\x47\x68\x33\x8c\x99\x82\x72\xfe"
+ "\xbe\x6f\xb8\x67\x65\xf0\xbe\xff\x51\xee\x9e\x1a\xcb\x63\x82\x71"
+ "\x33\xfa\x8f\x0a\x04\xbc\x95\xda\x84\x4e\x4e\x0f\xe1\x38\x9e\x4d"
+ "\x24\xd2\xb9\xad\x30\x56\x26\x18\xab\xf6\x60\x5f\xd0\x47\xd1\xa8"
+ "\x8f\x68\xee\xdc\xa0\x14\x1d\x35\xcf\x8a\x93\xd1\xd4\xe5\xc4\x07"
+ "\xfd\xdb\xcf\x25\x11\xba\xe1\x3c\x8c\x57\xdb\x09\x02\x7a\x69\x30"
+ "\xe8\xac\xa1\x25\xab\x89\x3f\x8e\xd7\xa0\x56\xb0\x55\xf2\x0e\xa6"
+ "\xbf\x95\x5a\xd7\xcf\x04\xfc\x8b\xfa\xc9\x6f\xa3\x64\x00\xc8\xd9"
+ "\xe0\x2c\x94\x47\x90\x4f\xbf\x8d\x9c\xbe\x8c\x29\x06\x39\x34\xae"
+ "\x09\xbe\xbb\x6b\x4d\xb0\x12\x8e\x3b\x04\x1d\x26\xe8\x0f\x9a\xfd"
+ "\xb5\x12\xf5\x57\xa3\x46\x47\x8c\x30\xb6\x83\x71\xae\x5b\x13\x3c"
+ "\x9c\x1b\xe3\x45\xc1\x64\x94\x81\x48\xa0\x4d\x0a\x68\x2f\x29\x8b"
+ "\x27\x3e\xc7\x54\xa7\x89\x09\x64\x43\x18\xf7\x99\x6a\x25\x81\x72"
+ "\xa5\x87\x82\x3f\x23\xfc\x98\x49\x9c\xf3\xdd\xe9\x02\x91\xef\x4e"
+ "\x17\xe0\xd8\x31\xbe\x3b\x9d\x7f\x23\xf2\xdd\xd1\x18\x8e\xef\x64"
+ "\x5d\x23\x38\x7e\x52\x34\x1a\xff\x0a\x63\x74\x3a\x1d\x79\x04\x79"
+ "\xe6\xf0\x5f\x90\x67\xfe\x5d\x79\xbd\xf2\x4c\x47\x7b\xb0\x12\x8e"
+ "\x6b\xc2\x33\x50\x2e\xc7\x33\x38\x56\x47\x63\x3a\x89\x30\x46\x9c"
+ "\xac\xe6\xee\xcf\x54\xa6\x91\x89\x20\xab\x5a\xbf\x8d\x77\x90\x63"
+ "\xdc\x38\x35\x6b\x95\x4f\x51\xf3\x69\xd9\xbf\xbf\x4d\xfb\x84\x28"
+ "\x3a\x33\x28\x6d\x34\xee\x26\x66\xff\xf5\x04\xef\x4f\x9a\xf3\xc7"
+ "\xe6\xc2\x9a\x55\x43\xb7\x9d\xd2\xa1\xef\xdd\x2f\x09\xfd\xdd\x07"
+ "\x72\x4d\x05\x5b\xf4\xe6\x6d\xfb\xb5\x74\xc8\xd7\x51\x78\x8f\xc1"
+ "\xbc\x6d\x67\xac\x79\xc8\x17\xe5\xed\xd9\xcd\xc1\x3a\x42\x39\x9f"
+ "\x3f\xcd\x4f\x47\x1b\x0c\xf5\xef\x93\xec\x7e\x18\xde\x3b\x6c\x8e"
+ "\x12\xee\x7b\xa3\x4e\xe0\xef\x31\xf0\xf7\x20\x9a\x11\xc3\x81\x78"
+ "\x0f\x82\xd7\x29\xe3\x84\x7b\x10\xc2\x39\x5e\x87\x7c\xe3\xb9\xfb"
+ "\xb0\x62\xbe\x1a\x9e\x8e\xcf\xf7\xf5\x07\xa8\xeb\xc5\x7c\xec\x1c"
+ "\xe6\x91\x9a\x2e\x29\xf1\x71\x68\xe3\xf8\x6f\xd1\x83\xfc\xc0\xda"
+ "\xe8\xec\x38\xf8\x96\x9e\x95\x9d\x79\x06\xbe\x65\xf0\xcd\xf9\x31"
+ "\xdd\x9b\xaf\x9a\xdb\xd8\x7d\xa0\x8d\x9b\xf8\x76\x5f\xe6\x64\xf2"
+ "\x5e\x32\xe8\x1c\xff\xbb\x3d\xfb\x4c\xb4\x70\xff\xbe\x9b\x5e\xc4"
+ "\xa7\x15\xeb\x06\x8c\xe4\xec\x99\x02\x76\x8e\xcf\xeb\xf0\xe5\x71"
+ "\xe7\xe6\xa0\x67\x63\xb5\xa9\xa7\x49\xab\xec\xcc\xbe\x46\x98\xc3"
+ "\xcd\x85\x1b\x37\xe1\xfd\x31\x94\x2b\xa1\x5e\x90\x45\x1f\xed\x3a"
+ "\x8e\x86\x7b\x4f\xd4\x9c\xaf\x89\xa5\x85\xa3\x72\x71\x2d\xd8\x4e"
+ "\x55\x8f\xf0\xdf\x13\x50\x9e\x98\xdf\xe4\xec\x00\x0a\xd8\xe2\x1e"
+ "\xee\xdd\xcf\x30\xe1\xde\xea\xe9\x72\xe5\xfe\x14\x36\x57\x0a\xed"
+ "\xc5\xfd\xd7\xf1\x19\xa1\xdf\xa4\x93\xf4\x76\x07\xfb\xaf\x8b\xcf"
+ "\x12\x9d\x69\x33\x17\x68\x62\xdb\xb3\xcf\x46\x02\x06\x9b\x2c\xfb"
+ "\xec\x08\x0b\x9d\xec\x6c\xac\xb3\x6b\xee\xe1\x70\x36\xc5\x59\x39"
+ "\x53\x83\x4d\xd4\xcd\xb2\x9c\xfb\x7f\x82\x9e\x26\xb3\x2a\x4d\x5a"
+ "\x73\x57\x8c\xdf\xa1\x94\xf3\x6e\xda\x36\xdf\x29\x9d\x95\x6b\xca"
+ "\x5f\xaf\xec\xfa\xf5\xd3\x28\xcb\xbe\xa6\x65\x31\xd3\x1a\x2a\x8d"
+ "\xe4\x8d\xa5\x2d\x52\xd4\x87\x55\xe7\xaa\xa5\xb3\xee\xe1\x6d\xb8"
+ "\x66\xa2\x40\xbf\x17\xda\x72\xd9\x17\x48\x50\x67\x5a\x8c\x5f\x67"
+ "\x57\x0c\x79\xe9\x02\x19\x6f\x5e\x14\x38\x30\x2b\x9e\xc8\x3b\x40"
+ "\x17\x76\x7c\xa7\xf2\x3b\x7a\xb2\x85\x7c\x04\x79\x1b\xda\x74\xa4"
+ "\x14\x68\xe9\x77\x31\x83\x1f\x8f\xa5\x86\xfa\xd8\xbf\x92\x59\xc1"
+ "\x26\x6d\xea\xb7\x64\x10\xe8\x44\x45\xa3\x66\x17\xac\xa1\xce\x93"
+ "\x7e\x6b\xa5\xca\x46\xe3\x19\xb2\x35\x1e\x74\x29\xe8\xce\xb4\xdf"
+ "\xc1\x9c\x01\x3c\xb1\xc3\x72\xce\x48\x78\x45\x9c\x33\x7e\x84\x39"
+ "\x23\x0f\xe6\x8c\xb4\x40\xd2\x90\xa4\x25\xa0\xc3\xfa\x3f\x91\xe4"
+ "\x67\x48\x4d\x82\xb9\x63\x2d\xcc\x1d\x9a\x33\x84\x9b\x37\x5a\x5b"
+ "\x08\xe8\xfc\xc1\x25\x4b\x89\x7f\xe7\x8f\x30\x77\xfc\x08\x73\x47"
+ "\x2a\x9b\x3b\xb6\x5f\x80\xb9\x63\x19\xac\x0d\x96\xc2\xdc\xd1\xea"
+ "\x60\xee\xb8\xe0\x78\x5d\x20\xe8\xc1\x8e\x1f\x83\xa5\xdb\x61\xde"
+ "\x58\xf7\x19\x91\x6e\x7f\xaa\xbf\x9b\x3c\xd3\xe2\xf4\x3e\x0a\x2d"
+ "\xdc\xb8\xc0\x4c\x63\x08\x8e\xfb\x3a\x03\xcc\xc3\x80\x4b\x63\xb0"
+ "\x91\xf8\x1d\xef\x1f\xd5\x01\xe9\x5d\xc3\x16\x35\x55\x7e\xa9\x97"
+ "\xd2\xfc\xc5\xfa\x0e\xc0\x6d\xdd\x2a\x22\xed\x02\x0c\xab\x7e\x9b"
+ "\x2b\xc5\x75\xa2\xb9\x40\xe5\xcf\xd6\xa4\xe7\x0e\xa3\x4f\xc4\x4f"
+ "\xc7\x70\x33\xd2\x18\x3f\xba\x20\x66\xd0\xd6\xf9\x44\x6e\xfa\x77"
+ "\xe0\x40\xf3\x82\x40\x9f\xd4\xcf\x88\x42\xbf\x40\x05\xe3\x75\x9e"
+ "\x7c\xf4\x69\xae\xb4\xec\x59\xa2\xc4\x78\x8d\xf4\x05\x53\x4b\xd9"
+ "\x73\x24\xbc\xec\x6b\x12\x56\xfa\x2c\x09\x29\xf9\x12\xe3\xba\x03"
+ "\x86\x2d\xd4\x70\x4c\xf5\x77\x52\xf6\x25\x89\xa0\x85\x09\x4d\x34"
+ "\x60\xbd\x12\x7e\x87\xe7\x3e\x0b\xeb\x07\xb8\x3e\x2b\xb8\x43\xdb"
+ "\xa8\x39\x46\xb2\x4e\x13\x92\xfa\x3d\x8f\x71\x37\xbe\xa7\x88\x51"
+ "\x0a\xfa\x03\x6d\x82\x99\x0c\x5f\xbc\xef\x85\x6b\x8e\x6e\x8c\xe3"
+ "\x0f\x58\xdb\x05\x3c\xc6\xc7\x5a\x9b\x08\xcc\x81\xfd\xbb\xed\x03"
+ "\x0e\xe3\x53\x44\xb0\x0d\x00\x9b\xc1\x60\x0b\xf8\x77\x5c\xb2\xb1"
+ "\x0f\x56\x78\x68\x1f\xf0\xeb\x1b\xe3\xca\x60\x69\xb1\x94\x92\xb4"
+ "\x63\x44\x5a\x64\x76\x17\xe3\x73\xdc\xfb\x45\xe8\xfb\x62\xcf\xee"
+ "\x7c\x3f\x13\xb1\xd0\xc9\xbe\x9f\xf1\xbb\x60\x09\xf1\x0c\x7b\x55"
+ "\x74\x2f\xd8\xe7\x33\xec\x5b\x0f\x79\x86\xbd\x2a\x9a\xbe\x60\x8e"
+ "\xf0\x0c\xfb\xcb\x6e\x62\xcf\xc5\xbd\xbc\x41\xb1\x6f\xcd\xb5\xc6"
+ "\xfe\x87\xe9\x0c\xfb\x1f\xa2\xbc\xc0\xbe\x17\xb9\x57\xf3\x72\x7f"
+ "\x61\xbf\x87\xd8\x83\xdc\x9b\x8b\x3c\xc3\xfe\xbc\x9b\xd8\x73\xb1"
+ "\x33\x6f\x50\xec\x2f\x64\x59\x63\x7f\x7e\x2a\xc3\xfe\x7c\xa4\xe7"
+ "\xd8\xab\x7b\x91\x7b\x35\x2f\xf7\xfa\x0f\x3c\xc3\x5e\x8d\x72\xaf"
+ "\xf7\x0c\xfb\x53\x6e\x62\xcf\xc5\xdf\xbc\x41\xb1\xd7\x67\x5a\x63"
+ "\xff\xe3\x24\x86\xfd\x8f\x11\x5e\x60\xdf\x8b\xdc\x27\xf0\x72\x7f"
+ "\x71\xaf\x87\xd8\x83\xdc\xd3\x28\xcf\xb0\xff\xc0\x4d\xec\xb9\x18"
+ "\x9e\x37\x28\xf6\x17\x37\x59\x63\xff\xd3\x04\x86\xfd\x4f\xe3\x3d"
+ "\xc7\x3e\xa1\x17\xb9\x4f\xe0\xe5\xbe\xed\x3d\xcf\xb0\x4f\x00\xb9"
+ "\xa7\xe5\x9e\x61\xbf\xc1\x4d\xec\xb9\x38\xa0\x37\x28\xf6\x6d\xe9"
+ "\xd6\xd8\x5f\x1a\xc7\xb0\xbf\x14\xee\x0a\xf6\xeb\x2d\xb1\x3f\xd9"
+ "\x3f\x0a\xd6\x56\x9c\x9d\xff\xc6\xb3\x3c\xf6\xaf\x03\xf6\xd0\xff"
+ "\xaa\xa7\x8a\x6c\x6c\xfc\x2b\x6f\x70\xb8\xc7\x02\xee\x1a\xc0\x1d"
+ "\xd6\x86\x02\xe6\x80\xd1\x20\xc4\x1d\x31\x4f\x3d\x45\x14\x1f\x41"
+ "\x5e\xc4\x07\x31\x06\x1c\x95\x1c\xce\x37\x99\x5a\xa8\x44\x1e\x88"
+ "\x78\xa2\xdd\x8f\x98\xf7\x66\xdb\x23\x4f\xf4\x8a\xf9\x93\xd7\xc6"
+ "\xbe\xef\xb4\xf5\xff\x5d\x2d\xcc\x3f\x81\x35\x5c\xaa\xbb\x98\x5f"
+ "\x49\xb6\xc6\xfc\xf2\x68\xc4\x41\x27\xbb\x1c\xea\x39\xe6\xea\x68"
+ "\xe7\x98\x0b\x73\xbc\xa1\xc4\x3b\xcc\xcd\x7a\x11\x73\x75\x74\xcf"
+ "\x98\x9f\xf2\x00\xf3\xab\x3b\xbf\x5f\x5f\x98\x1b\x54\xd6\x98\xb7"
+ "\x8f\x60\x98\xb7\x07\x39\xc3\xdc\x0c\xfa\x1a\x7d\xea\xf8\x5e\xa2"
+ "\xa9\x3d\x66\x5a\x17\xe0\x8a\xef\x27\xa2\xaf\x77\xf7\xd2\x1a\x69"
+ "\x17\xe0\x9e\xb3\x9a\x04\x65\xad\x26\xe3\xfd\x5a\x98\xfe\xee\x04"
+ "\xfd\xfd\xe2\x15\x22\x37\x2f\x0e\x1c\x98\x75\x8e\xc8\x3b\x61\x8c"
+ "\x3b\x17\xab\xfc\xea\x63\xf5\xe4\xa3\x0b\x35\x52\xf4\xdd\xe2\x7d"
+ "\x3b\xfa\x43\xcc\xe0\xe9\x71\xd4\x50\xdf\x9c\xc7\xfc\x2a\x67\x04"
+ "\xbf\xca\x6e\x2b\xbf\xca\x4b\xe7\x78\xbf\xca\x33\x0c\xa3\x62\x4b"
+ "\x7c\x9e\x7b\xd5\x89\x5f\xa5\xae\x57\xbf\x0a\xe7\x4f\xb9\x40\xfc"
+ "\xbb\x96\xa9\x86\x6e\xe7\xfd\x2a\xaf\x2c\xf5\xce\xaf\xd2\xb9\x2c"
+ "\x58\xfa\x0a\xe0\xb3\xfe\x19\xc0\xe7\x4b\x77\xf1\xe9\x74\xfa\xfe"
+ "\xb3\xed\x5c\x2b\xcc\xb1\xc2\xbc\x8a\x32\x87\x73\xab\x21\x7f\xd1"
+ "\x71\x5b\x5f\x0a\xca\xdb\x05\x99\xf1\x56\xd4\xc9\x9e\xf9\x53\x40"
+ "\xc6\xfe\xcb\xfc\x29\x28\x73\xc2\x3c\x7b\x7d\xcc\xb1\x5d\xcd\xd6"
+ "\xb2\xd7\x59\xc2\xe6\xd8\xce\x62\x57\xed\x2b\xe7\x98\xab\x66\xdb"
+ "\xfa\x50\x18\xe6\xe6\x41\xe8\x73\xf1\xc8\x8f\xb2\x85\xcc\xf8\x6f"
+ "\xf3\xa3\x5c\x7f\x98\x9b\x4e\x58\x63\x6e\xdc\xc6\x30\x37\xe6\x5e"
+ "\x05\xcc\x8f\xdb\xfa\x4e\x38\xcc\xe5\x44\x82\xbe\x16\x8f\xfc\x27"
+ "\x5b\x88\x87\xb6\xf4\x7f\xce\x7f\x72\xfd\x61\x4e\xeb\xad\x31\x37"
+ "\x6f\x66\x98\x9b\x37\x79\x8f\xb9\x7a\xb6\xad\xcf\x84\x61\x2e\xb9"
+ "\x8c\xb6\x97\x47\x7e\x93\x2d\xa4\xed\xbf\xcd\x6f\x72\xdd\x61\x2e"
+ "\x97\x68\xad\x30\x97\x93\xb5\x1c\xe6\x72\xa2\xb9\x0a\x98\x1f\xb7"
+ "\xf5\x95\x30\xcc\x65\xdf\xa3\x6f\xc5\x23\x7f\xc9\x16\xc9\x7f\x9d"
+ "\xbf\xe4\xfa\xc3\x5c\xb6\xc7\x1a\x73\xe9\x12\x86\xb9\x34\xd1\x7b"
+ "\xcc\x13\x66\xdb\xfa\x48\x18\xe6\xfd\x4e\xa1\x4f\xc5\x23\x3f\xc9"
+ "\x16\x49\xf1\x7f\x9b\x9f\xe4\xfa\xc3\xbc\x5f\xa5\x35\xe6\xf2\x79"
+ "\x0c\x73\x79\xac\xab\x6b\x66\x61\xad\x2c\xac\x8f\xb9\xb5\xb2\x3f"
+ "\xd8\xec\x36\xbe\x11\x86\x77\xff\xc3\x9c\xcd\xee\xf1\x5a\x99\x1a"
+ "\xfe\x5b\xfc\x23\x02\xd6\xb8\x5e\xbe\x2e\xd6\xca\xf2\xfe\xd6\xf7"
+ "\x3f\xe5\x37\x3d\xc9\xad\x95\xe5\x37\x45\x3b\xc3\xda\xd1\xb3\x08"
+ "\x0d\xb0\xd6\x14\x9e\x45\x78\x71\x35\xe0\x08\x7c\x80\xcf\x22\xe0"
+ "\x33\x09\x8e\x9e\x47\xc0\xe7\x10\x84\x67\x12\x2c\x9f\x47\x88\xd2"
+ "\x51\x03\x3e\x93\x80\xeb\xe4\xfa\xd8\x2d\x44\x78\x36\x01\x9f\x41"
+ "\x48\xfb\x96\x0c\x42\x8c\xf0\xf9\x03\x5c\x2f\x5f\xeb\x67\x10\x8a"
+ "\xcc\xd7\xc1\x33\x08\xf2\x01\x4e\xe3\xdf\x09\x32\x37\xf3\x8d\x3b"
+ "\x08\xf0\x5b\xb7\x9f\xaa\xab\x70\x51\x13\xca\x1c\x62\xe4\xd7\xca"
+ "\xe4\x70\xf7\x53\xd5\xd2\x46\x4d\x0d\x79\x71\x1d\x51\x08\xfe\x0b"
+ "\x94\x41\xd0\xcb\x7e\x46\xc0\x33\x2b\x81\xf9\x31\xcc\x3f\xc4\x0c"
+ "\xd2\x2f\x56\xf9\xe1\x7b\xfb\x1f\x7d\x5e\x2d\x45\xdf\x63\x59\x3c"
+ "\x09\xdb\x71\x96\x84\x37\xb4\x9d\x22\x9c\x4c\x15\xa8\x7c\xcc\x05"
+ "\x8b\xf4\x5d\x05\xeb\x95\xe6\x80\x45\x6d\xfa\x80\x45\x06\xc4\x2d"
+ "\xeb\x1c\x21\x28\x5f\x88\x5b\xa3\xa6\xa4\x1b\x2f\x0e\x2b\x29\xef"
+ "\xdb\x70\x2a\x53\x9f\x7a\x8c\x59\xf1\x05\xc0\x6c\x99\x35\x66\x25"
+ "\x9e\xfa\x37\x84\xe7\xb9\x97\x05\x4b\x4b\x40\xa6\xd6\x3d\x09\x98"
+ "\xfd\xd6\x5d\xcc\x06\x3a\x8d\xff\xed\x1c\x33\x55\xb4\x8b\x98\xe5"
+ "\xf7\x8e\x99\x39\xc2\x01\x66\x99\x90\x37\x89\x61\xa6\x4a\xd6\x07"
+ "\xa8\x34\x22\x66\x97\x5d\xc4\xcc\x76\x0d\x7b\x23\x61\xe6\x5b\xec"
+ "\x01\x66\x2e\xca\x99\xda\x05\x39\x33\x17\xd9\x63\xa6\x06\x39\x53"
+ "\xf1\x72\xa6\x02\x39\x53\x59\xc8\xd9\x79\x17\x31\xb3\x5d\x83\xde"
+ "\x48\x98\x0d\x8e\x76\x1f\x33\xb5\x8b\x72\xa6\x76\x45\xce\xf4\x0e"
+ "\x30\x03\x39\x53\xf3\x72\xa6\x06\x39\x53\x5b\xc8\xd9\x29\x17\x31"
+ "\xb3\x5d\x43\xde\x48\x98\x29\x9c\xbf\xff\xed\x1c\x33\x17\xe5\x2c"
+ "\xc1\x05\x39\xa3\x51\xf6\x98\x25\x80\x9c\xa9\x79\x39\x53\x83\x9c"
+ "\xa9\x2d\xe4\xec\x03\x17\x31\xb3\x5d\x03\xde\x48\x98\x0d\x71\x1a"
+ "\xff\xdf\x39\x66\x09\x2e\xca\x59\x82\x0b\x72\x46\xcb\x1d\x60\x06"
+ "\x72\x96\xc0\xcb\x59\x02\xc8\x59\x82\x85\x9c\x6d\x70\x11\x33\xdb"
+ "\x35\xdc\x8d\x84\xd9\x2d\x89\xee\x62\xc6\xe1\x05\xb6\xa3\x43\xcc"
+ "\x3a\xad\xed\x46\x23\xd8\xf1\x78\xcf\xcb\x21\x5e\x2f\x98\xf0\x9d"
+ "\xde\x40\xc4\x0a\xed\x41\xc4\xab\x51\x73\x88\x38\xb2\x1b\xf1\xbe"
+ "\x18\xe0\x4e\xf0\xde\x58\xda\x19\x37\xec\xc5\xf9\xce\xb0\xea\xfd"
+ "\x7e\x58\xf1\x52\x11\x2b\xe1\x7e\xd8\x55\xc5\xea\x53\x77\xb1\x0a"
+ "\x70\xba\xff\x51\xcf\x58\xa9\xa3\x7b\xc7\x4a\x9d\xdf\x33\x56\x66"
+ "\xbd\x88\xd5\x29\x0b\xac\xec\xe7\x31\xd7\xb1\xb2\x99\xbf\x6e\x28"
+ "\xac\x86\xd5\x3a\xc3\xca\xe8\xbf\x5e\x89\xef\xbc\x3f\x01\x6b\x5f"
+ "\xba\x20\x66\x5a\xf6\x69\x12\xb4\xe5\x34\x19\x8f\xef\x37\xef\x5e"
+ "\x67\x90\x42\x1f\xbf\x3b\x72\xbc\x85\x74\xfd\x10\x38\x10\xdf\x9f"
+ "\xe1\xf4\xe4\xe2\x40\x9f\xc6\x58\x3d\xa7\x13\xb7\x02\x46\x0d\x6d"
+ "\x35\x30\x26\xfd\xa3\x1a\xda\xfe\x4a\x3a\x57\xc6\x90\xa3\x27\xcf"
+ "\x01\x2e\xb4\xab\xb1\xb5\x86\x94\xc1\x75\xed\xea\xbf\x12\xf3\x0f"
+ "\xc1\x03\xe7\x6a\x88\xf4\x82\xfc\x17\x99\xb8\x76\x1e\xa5\x21\x8a"
+ "\x19\xad\xd4\xd0\xd0\x7a\x84\xec\x98\x4f\x82\x0e\x69\x08\xc1\xb1"
+ "\xe6\xd6\xca\x09\xb8\x56\xfe\xc0\x0a\x9f\x57\x2c\xd6\xca\xdc\xfb"
+ "\xb2\x49\x80\xcd\x4f\x36\xd8\xc0\x5a\x1c\xc6\xba\xff\x13\x6d\x80"
+ "\x4d\x9b\x80\xcd\x79\x92\xba\x1c\xb1\xd1\x89\x6b\x65\x1e\x9b\x62"
+ "\xd4\x79\x49\x16\x6b\xe5\x0b\x16\xd8\xf0\xef\xaa\x5a\x61\x23\xf8"
+ "\x32\xd6\x04\xe3\x3d\x72\xbb\xb5\xb2\x67\xbe\x8c\x40\xa7\xef\x8a"
+ "\x70\x72\x04\x32\xf2\x04\xc8\x51\x4a\x32\x27\x47\x6c\xfc\x87\x2d"
+ "\x02\x7e\xaf\x26\x7e\xba\xfe\x51\x5b\x00\x83\x4e\x90\x35\x9c\x8b"
+ "\xd2\xa0\x9f\x88\x25\xe2\xf6\x44\x65\x57\xd7\x73\x6d\x44\x0a\x36"
+ "\xb8\x3f\x62\x67\xfa\x21\xd0\x27\x1b\xe6\xaa\xc6\x39\x5f\x02\x3e"
+ "\x17\x49\xa3\x9e\xc7\x66\xdd\x97\xe4\x82\xfc\xd6\xe1\x74\x71\xf0"
+ "\xc0\x91\xc0\xa7\x30\xf7\x28\xe6\xe2\xbb\x2f\xa0\xf3\x76\xc4\x93"
+ "\xf0\x19\x49\xd4\xc0\x3d\xcb\x03\x32\x86\xf3\x19\xea\xc3\x86\xa4"
+ "\x03\xc4\x54\xb0\xa8\xad\x2b\x60\xbd\xf2\x50\x32\x21\xa8\x13\x11"
+ "\x8b\x7e\xab\x44\xec\xf0\xbd\x3d\x4b\x5f\x87\x9d\x2e\x4c\x38\xe2"
+ "\x58\xbe\xe6\xe8\xdc\xf2\x77\x14\xf3\xf2\x55\xec\xa9\xbf\x43\xf0"
+ "\x47\x01\x86\xf8\xae\x5e\xda\x67\x44\xfa\x8a\xdb\x18\xde\x16\xe4"
+ "\x3e\x86\xaa\xe8\xde\x31\x6c\x17\x30\xcc\xef\x1d\xc3\xdb\x74\xf6"
+ "\x18\xaa\x92\x44\x0c\xcd\x11\x16\x18\x66\x32\x0c\x55\xc9\x22\x86"
+ "\x2a\x4d\xef\x18\xda\xac\xa5\x6f\x28\x0c\x7f\xd9\xb3\xff\xc3\x31"
+ "\x86\x2e\xc8\xe1\x8f\x3c\x86\x6a\x17\xe4\x70\x78\x85\x03\x0c\x2d"
+ "\xe4\xd0\x5c\x24\x62\xa8\xe6\xe5\x50\x65\x21\x87\x2a\x17\xe4\xd0"
+ "\x66\x6d\x7d\x43\x61\x78\x7b\x95\xfb\x18\xaa\x5d\x90\xc3\x6f\x04"
+ "\x0c\x5d\x90\xc3\x3b\x54\xf6\x18\xaa\x2d\xe5\x50\x6f\x81\x21\x2f"
+ "\x87\x6a\x0b\x39\x54\xbb\x20\x87\x36\xb6\xca\x0d\x85\xe1\x9d\x49"
+ "\x1e\x60\xe8\x82\x1c\x7e\xc4\x63\x98\xe0\x82\x1c\x2a\x43\x1c\x60"
+ "\x68\x21\x87\x34\x4a\xc4\x30\x81\x97\x43\xb5\x85\x1c\xaa\x5d\x90"
+ "\x43\x9b\xb5\xf7\x0d\x85\xe1\x5d\x3d\xfb\xff\x1d\x62\x98\xe0\x82"
+ "\x1c\xa6\x09\x18\xba\x20\x87\x77\xe9\xed\x31\x4c\xb0\x90\x43\x5a"
+ "\x6e\x81\x21\x2f\x87\x09\x16\x72\x98\xe0\x82\x1c\xda\xac\xc5\x6f"
+ "\x28\x0c\xef\x36\xb8\x82\x21\xd8\xd9\xf6\x76\x69\x9b\x88\xa1\x25"
+ "\x7e\xb6\xb6\xe8\x2c\xb0\x51\x11\xbb\x39\x46\x22\xb5\xc7\xef\x57"
+ "\xd5\x88\x5f\x08\xde\x8f\xbb\x2c\xda\xa4\x1c\x76\xfc\xfd\x1c\xc4"
+ "\xec\x50\x1c\x21\x68\x9f\x0a\xf6\x28\xde\x53\xed\xb6\x47\x17\xfe"
+ "\xff\x6a\x8f\x06\xed\x71\x1f\x3b\x7e\x1e\x74\x8a\x9d\xf5\xdc\x37"
+ "\x0b\xe6\x44\xe7\xd8\x8d\x48\xb4\xc7\x4e\x9d\x24\x62\xc7\xe6\x3d"
+ "\x86\x9d\x59\x2f\xcc\x7f\x0c\x3b\x7e\xfe\xeb\x11\xbb\x1b\x79\xfe"
+ "\xfb\xb5\xd3\xf9\x2f\x57\x6a\xae\x86\xa3\x06\x0e\x2d\x1c\x75\x26"
+ "\x29\x99\x5a\x22\x35\x37\x11\x16\xd7\x1a\xf9\xd9\xf6\xfa\x4d\xf4"
+ "\x85\xc7\xe4\x48\x43\x37\xca\xfd\x91\x4e\x28\xc3\x34\x90\x10\x48"
+ "\xd7\xfa\x49\x62\x71\x3f\x12\xa4\xed\x2f\x94\xe5\xb7\x91\x44\x40"
+ "\x9f\x19\x9d\x94\xa4\x33\xba\x88\x9b\x90\x8e\x66\x9f\x4d\x81\x34"
+ "\x1f\xbe\x4c\x6e\xff\x43\x93\x54\x8a\x65\xd9\xd6\x3d\x80\xa7\x51"
+ "\x9a\x32\x88\xd2\xb2\x6e\x28\x0b\xeb\x14\xe8\x06\x22\x9d\xe9\xa6"
+ "\x3b\x23\x4d\x12\x79\x90\x25\x1d\x9d\x4c\x2c\xe9\x6e\xe6\xcb\x0b"
+ "\xb6\xea\xc7\xdd\x84\xf8\x49\x94\xac\x2f\x1a\xa9\xd0\x17\x5f\xae"
+ "\xcc\xc1\xcd\xc7\xa1\xcc\x10\xab\x32\x6f\x22\x64\x10\xd0\x63\xb9"
+ "\x83\x54\x5c\xbb\x91\x7e\x10\x1d\x28\x6d\xe5\xca\x97\xc8\x43\xcd"
+ "\x52\x12\xca\xfa\x45\xe4\x25\xdd\x6d\x56\x92\x5c\xeb\x3a\x06\x0b"
+ "\xe3\x65\x49\x87\x34\x54\xda\x4d\xe3\xc7\xb5\x63\xa0\x44\x0f\xed"
+ "\x08\xb7\x6c\x07\xa3\x23\xa3\x79\x3a\x05\xf4\x6b\x7c\x37\x96\xf9"
+ "\xa3\xea\x04\xba\x34\x13\xb9\x15\xb0\xd0\x36\xaa\x08\xe1\xc7\x61"
+ "\x08\xcd\xfe\x4e\xc1\x8f\x45\x84\x65\x99\x83\x24\x12\x5d\x09\x3f"
+ "\x5e\xe6\xec\xb3\xb5\x40\x3b\xd4\xbc\x51\x1e\xd9\x5d\x6e\x06\xc6"
+ "\x94\xe2\xc7\x21\xc3\x78\x0b\x57\x2e\xac\x7a\x4c\x52\x89\x92\x1f"
+ "\x87\x5b\x90\x16\xf2\x44\xb1\x7e\x29\xba\x71\x35\x49\xe5\x78\x4d"
+ "\x6b\x41\xeb\xcf\xc6\xb8\x4d\x07\x7d\x9b\x61\x4f\xef\x63\x4b\x1f"
+ "\xc0\xe8\x5b\x0c\x40\x1f\x6d\x4f\xaf\xb0\xa5\x1f\xc6\xe8\xcf\xb5"
+ "\x01\xfd\x6c\x7b\x7a\xe3\x50\x1b\xfa\x5f\x30\xfa\x56\x1c\xeb\x18"
+ "\x7b\x7a\xa5\x2d\x7d\x20\xa3\xbf\x82\x3c\x32\xc7\x9e\x3e\xc2\x96"
+ "\xfe\x56\x46\x7f\xa1\x15\xe8\x63\xed\xe9\xd3\x6d\xe9\x6f\x63\xf4"
+ "\xfa\x16\xa0\x8f\xb3\xa5\x2f\xe3\x68\xc9\xdd\x3c\xed\x2f\x19\xed"
+ "\xc5\x66\xa0\x55\x39\xe8\xab\x8c\x2f\x3b\x94\xa7\x1f\xce\xe8\xbf"
+ "\x53\x01\x7d\xa2\x03\xac\x6c\xe9\x6f\xe7\xe8\x87\xde\xe4\x03\xf4"
+ "\x49\x0e\xb0\xb2\xa5\xbf\x83\x95\xdf\x19\x0d\xf4\xc9\x0e\xb0\xb2"
+ "\xa5\xbf\x93\xd1\x1b\x51\x86\x35\x0e\xc6\xde\x9a\x7e\xb0\x39\x1c"
+ "\xe8\x52\x4a\x32\x04\xf9\xb1\x1a\x77\xdb\xb2\xef\x62\x6d\x27\x21"
+ "\x90\x27\xdd\xc1\xb8\xdb\xd2\xdf\xcd\xe8\xa5\x4a\xa0\xdf\x64\x4f"
+ "\x4f\x24\x8c\x9e\x8c\xe1\xe9\x7f\xc5\xe8\xe5\xfe\x40\x9f\xe9\x60"
+ "\xec\xf1\xba\x96\x97\xd3\x20\xd6\x4f\x43\x1d\xd0\x66\x39\x18\x77"
+ "\x4b\xda\x11\xac\xdc\x5b\xf6\x00\x6d\xae\x83\x31\xb7\xa4\xfd\x35"
+ "\xa3\x1d\x90\x02\xb4\xf9\x0e\xc6\xdb\x92\xf6\x37\x8c\xf6\xe6\x50"
+ "\xa0\x2d\x72\xd0\xde\xbb\x2d\x68\x83\x19\xad\x2f\xf2\x55\xb1\x03"
+ "\x5c\x2c\x69\xef\x61\xb4\x01\xb1\x40\x5b\xee\x00\x17\x4b\xda\x7b"
+ "\x19\xed\xe0\x22\xa0\xad\x70\x80\x89\x25\xed\xff\xd0\xa1\x8a\x19"
+ "\xbc\x6e\xad\xb4\xa5\x05\x1e\xd0\x82\x1e\xaa\x03\x5d\x18\x42\xf3"
+ "\x86\xa2\xde\x44\xbd\xc6\xad\xe3\x05\x1a\x2a\x35\xde\x6f\x31\x0f"
+ "\xdc\x47\xf3\xfa\xb7\xf1\xfa\xaf\xda\xb6\x3c\x2a\x95\x5b\xd2\x8e"
+ "\xa4\x79\xbf\x8a\xe0\x69\xf7\xd8\xd3\xfa\x58\xd2\x8e\xa2\x79\x81"
+ "\x95\x3c\x6d\x8d\x3d\xad\xa2\x9b\x96\xe6\xdd\x96\x08\x34\xfb\x4a"
+ "\x79\xbd\x6a\xd1\xce\x31\x16\xe5\x8d\xa6\x79\xc3\x43\xf9\xf2\xb4"
+ "\xf6\xe5\x29\x2d\x69\xc7\xd0\xbc\x20\x23\x4f\x5b\x6b\x4f\x1b\x61"
+ "\x49\x7b\x3f\xcd\xbb\x5d\xe8\x7f\x9d\x3d\x6d\xba\x25\x6d\x18\xcd"
+ "\xbb\xb3\x86\xa7\xad\xb7\xa5\x2d\x65\x73\x90\x94\xc7\xe9\x01\x9a"
+ "\x77\x57\x0a\x4f\xdb\x64\x35\xc7\x4a\x25\x9c\x8c\x95\x32\xba\x07"
+ "\xe9\xd0\x5f\xf8\xf2\x78\x1e\xb7\x9a\x5b\x33\x24\x43\x71\x4e\x29"
+ "\x41\x3c\x5f\xf8\x6d\x16\xd0\x8e\xe5\xcb\x3b\x61\x3b\xf7\xf1\xed"
+ "\x0b\x87\x6b\x27\x85\xf9\x09\xe6\x1d\x9d\x23\xbb\x27\xe9\x5e\x72"
+ "\xf3\x39\xf9\x28\x03\x9b\x1b\xf9\xbd\xc1\xe4\xa3\xb9\xd8\x48\xe6"
+ "\x8a\xa7\xcb\x67\xb5\x51\xa3\x65\x5a\x8e\x94\x36\x8d\x6a\x23\x72"
+ "\x8c\xd7\x47\x03\x36\xc6\xe8\x20\x5d\x3f\x22\x26\xa9\x3d\x2f\x54"
+ "\xae\x93\x18\x9b\x30\x7e\x13\xfc\x56\xe8\xc8\xeb\xdc\x3e\x2a\x39"
+ "\x19\xb8\x37\x49\x84\xc4\x54\x38\x2a\x17\xf7\x32\x29\x83\xf3\x6c"
+ "\x38\xb8\x7d\x43\x92\xc0\x06\x7e\x81\x44\x68\x57\x1b\xc9\x59\x0d"
+ "\x91\x72\xfb\xe4\xc9\x43\xff\x40\x97\xa9\xc6\x43\x5b\x9a\xa0\xde"
+ "\xb8\xd3\x70\xce\xb5\x05\xf7\x0d\xca\x1f\x55\xa5\x5d\xd1\x89\x34"
+ "\xef\xe8\x03\xb6\x34\xd1\xe7\x7f\xff\x7d\x52\x2a\xb9\xf3\x9c\x3c"
+ "\xb4\x5a\x88\x5f\xc5\xc5\xac\xfa\x51\xf5\x08\x17\xaf\x4a\x3e\x7a"
+ "\xa6\x39\x60\x54\x95\x6d\xbc\x2a\x56\xcf\xe8\xf0\x4b\xa0\xaf\x68"
+ "\x79\x61\x12\x17\x0f\x4b\x3e\x7a\x03\xd7\xbf\x0c\xda\x44\x83\x9e"
+ "\xce\x34\x77\x6e\x4a\xc7\x7d\xed\xb4\xa9\xe7\xc8\x69\xfe\x1a\x96"
+ "\xcf\x97\x3b\x00\xcb\xc3\x72\x85\x32\x31\x9f\xfe\xae\xc2\x24\x1c"
+ "\x0f\x18\x9b\x4c\x97\xe3\x5f\xc9\x43\x0d\x5c\xfc\xab\xbc\xd1\x91"
+ "\x3a\xc9\x74\x0d\x17\xff\x4a\xe8\x8f\xeb\x65\x54\x60\x19\x8e\x63"
+ "\xfd\x12\x3f\x5a\x30\xaa\x0e\xca\xaf\x00\xfb\xb7\x9a\xe1\x33\xba"
+ "\x5a\x27\x19\x9f\xc5\xff\xde\xa7\x93\x4c\xac\xe3\x7f\xd7\xe9\x24"
+ "\xfa\x50\xfe\xf7\x71\x21\x06\x99\xe3\x98\x68\xa3\x8a\x01\x8f\x3d"
+ "\xe6\x1d\x31\x3e\x68\xaf\x73\xed\x09\x18\x55\xac\xbc\x83\x48\xce"
+ "\xca\xc7\xc4\x40\x9d\x7b\xd8\x58\x8d\x19\x0d\xdf\x7e\xfc\xb7\x9e"
+ "\xff\xa6\x48\xc3\xf1\x9c\x7f\x46\x26\xcd\x4d\x60\xfb\xc8\xc8\xc7"
+ "\x4c\xc7\x34\x0e\x5b\xc0\x9f\x0e\x49\x48\xe7\xca\x2d\xd8\xd2\x64"
+ "\xd9\x06\x0c\x34\x16\x3a\x7a\xcc\xfd\x61\x0f\x3c\x38\x36\x7c\xdc"
+ "\xbc\xf9\x0b\xe2\x16\xc6\x2f\x52\xa9\x13\x16\x27\x2e\x59\xba\x2c"
+ "\x69\xf9\x8a\x95\xc9\xab\x56\xaf\xd1\xac\x5d\x87\x74\xdd\xed\xdd"
+ "\x11\x29\x69\x93\x12\xc0\x73\x32\xd6\xf3\x01\x57\x37\xa4\x31\xec"
+ "\xc7\x54\xc9\x95\x8e\xd7\x05\x8d\x81\x84\xe0\x1e\x21\xad\xf2\xfb"
+ "\x07\xe0\x9e\x25\xc0\x87\x92\xc6\xe2\x69\x5a\xdc\xaf\xad\x59\x3e"
+ "\xc6\xd8\xa0\x9f\xa6\xc5\xfd\x05\x0f\x06\xb6\x90\xa0\xbb\x89\xe4"
+ "\x9c\x7c\x4c\x0b\x5e\x2f\xfb\x35\x21\xb5\x90\xd7\x51\x99\x77\x2b"
+ "\x48\xe0\xcb\xc3\xa8\x3e\x7f\x18\x6d\xc5\xf2\xf3\x0b\x69\x8b\x7e"
+ "\xbd\x8a\x64\xc3\x39\xf0\xa6\xe2\xac\xfc\xfe\x0f\x0e\x82\xf5\x6f"
+ "\xce\x20\xc3\x4b\x0b\x69\xf3\xa6\x61\xb4\xf9\xf9\x42\xda\x5a\x36"
+ "\x8c\xea\x82\xf2\x89\x6f\x7b\xde\xfd\xc0\x67\x63\x38\xcc\x72\xe0"
+ "\xba\x79\xe8\x18\x55\x0e\x5c\x1b\x65\x24\xb2\x32\x38\x87\xb4\xb6"
+ "\x83\x4a\xd6\xee\xb7\x2f\x1a\xfa\x41\x79\xb3\x69\x57\xa2\x24\x1b"
+ "\xea\x61\x98\xdc\xff\x6d\x2d\x58\x12\x50\x9f\xbe\xd1\x70\x9a\xe8"
+ "\xe4\xf7\xeb\x70\x3f\x25\xa8\xcf\xaf\xb1\xa8\x95\x60\x79\x6f\xad"
+ "\x30\xf4\x5b\x79\x1b\x35\x02\xad\xd6\xbc\x3e\x51\x02\x34\xc5\x50"
+ "\x76\x9b\x65\x7f\x82\xe3\x97\x24\x2b\x97\xae\x4a\x4c\xbc\x67\x20"
+ "\x09\xe6\xbe\x89\xe5\x5e\x83\xc9\x50\x1e\x79\xb9\x90\xd6\x42\x3f"
+ "\xb5\xd0\xdf\xba\x63\xb0\x02\x01\xfe\x20\xd0\xa7\xdc\xb3\xf2\xb0"
+ "\x07\x20\x7d\x1f\xfc\xde\x07\x6d\xaf\xe3\xf6\x2e\x93\x4f\x9d\x47"
+ "\xf3\xee\x6f\x85\x76\xe2\x9c\x85\x7b\xa5\x90\x4b\x6b\x66\x4b\xa0"
+ "\xdf\xf9\x40\x57\xa7\xbc\x8d\x8c\x80\x7c\x1f\x40\x3b\x2a\xe0\x37"
+ "\xd2\xab\x11\x47\xa0\xaf\x65\xfd\x9a\xca\xc5\x12\x84\xb1\xd2\x96"
+ "\x0c\xa3\x59\xed\x79\x61\x45\x18\xc3\x95\xdb\x77\x06\xce\x61\x5c"
+ "\xea\x80\x36\xf7\x52\xda\x6c\x09\xee\xcb\x59\x26\x96\xa9\xc2\x36"
+ "\x61\x3b\x70\x3d\x7c\x14\x2c\x4a\x73\x57\x0c\xb9\xcf\x40\x24\x47"
+ "\x9b\x09\x29\x2e\xa4\xe5\x70\x14\xc3\x51\x74\x04\xae\x1d\x86\xa3"
+ "\x0e\xd2\xeb\xe1\xfb\x08\x7c\x1f\x6e\xe6\xee\xaf\x06\x62\xbb\x57"
+ "\xa6\xd0\x96\x51\x45\xe4\x57\xdc\xbe\x9f\xa9\xe4\xe9\xd3\xf2\xc8"
+ "\x1a\x6c\x3b\xc6\x6b\xa6\x43\x1f\x08\xb1\x8a\x2b\x2b\x7f\xb0\x9c"
+ "\xc0\x75\xf8\xde\xc3\xbe\x2d\x8f\x07\x8d\x44\x3e\x76\x38\xfb\x3d"
+ "\x36\x0e\xce\xb3\xf8\xdf\x1a\x38\x36\xf5\x7e\xd8\x96\xe7\xec\x18"
+ "\xab\x77\x9d\xd6\x95\x63\x6a\x88\x6b\x74\xe3\x2a\x89\x7c\x3c\x81"
+ "\x23\xdc\x3a\x7d\xbc\x82\xa5\x45\x9c\x64\xe7\x11\x2d\xec\x7b\x92"
+ "\x3f\x1c\x30\x4e\x93\xa1\xfc\xc9\xd1\x2c\x6d\xf2\x1c\xf8\xae\x80"
+ "\xa3\xda\xba\xfe\xa9\x90\x7f\x6a\x24\xe2\xd9\x05\xf3\x01\x62\xa9"
+ "\x93\x87\x19\x11\xa3\x1c\xc6\x5b\x12\x7c\x86\x02\xd2\x0c\xc0\x5b"
+ "\xc5\x22\xff\x3c\x78\xde\x9a\x7f\x1e\x3c\x61\xc3\x3f\xb9\xa8\x8f"
+ "\x20\x5f\x64\x19\xe3\x97\x7d\x97\xd6\xc7\xc1\xf9\x83\x27\xa1\x9c"
+ "\x7d\xca\xe7\xb0\x8c\xb1\xdc\xfa\x2b\xe7\x1c\xac\x85\x55\x44\x8e"
+ "\xfa\xa5\x55\x3e\xf6\x3e\xe4\x59\xac\x9b\xaf\x97\xb5\x05\xda\x07"
+ "\x69\xe5\xd8\xbe\x65\x50\x2e\x9c\x57\x00\x5d\x79\x23\xb9\x28\xb4"
+ "\x8d\xcb\xb3\x25\x01\xf8\x91\x6f\x2f\x96\x89\xf9\xa8\xd8\x2f\x03"
+ "\xe6\xe1\xeb\xfe\x16\xd2\x71\x8d\x4d\xd2\x7e\x22\xb2\x46\xa3\x8e"
+ "\x20\x4f\xe2\x77\xa3\x31\x14\x64\x29\x8a\x98\x71\x2e\x0c\x24\xa1"
+ "\x20\x6f\x03\x4e\xcb\xc7\xd6\x8e\x4c\x21\xa1\x58\x1e\xea\x70\x9d"
+ "\x7c\x6c\x66\x19\xca\x22\x2b\xeb\x0b\xec\x07\x96\x7f\x04\x56\x35"
+ "\xf8\x5d\x8a\xed\x81\xeb\x16\xf5\xe6\xe3\xda\x39\x67\x1d\xeb\x2b"
+ "\xd4\x55\x01\xf9\xab\xb1\xef\x38\x9e\x70\xbd\xe6\xac\x3c\x5c\x89"
+ "\xd7\x70\xcf\x16\xbe\x3f\x15\xf8\xbe\x07\x8e\x07\xd2\xe3\xfe\x97"
+ "\x5c\x9c\x5a\x79\xd8\x54\x6e\xdc\x20\x3f\xe2\x41\xa1\x0e\x2c\x23"
+ "\xcd\x48\x8d\x14\xf4\xd1\x6b\xeb\x0c\x60\x83\x8c\xdb\x6e\x8d\x4f"
+ "\xb8\xc6\x12\x1f\xc8\x57\x0d\xf9\x6b\x71\x5e\x46\x7d\x02\x75\xfa"
+ "\xa1\xcd\x01\x69\xb9\xe6\x3c\x28\x63\xb5\x81\xf3\x2d\x41\x39\x2f"
+ "\x42\x5b\x72\xb1\x1c\x68\x4f\x2d\x5f\x56\x2d\xc6\xb0\xb4\xc4\x9a"
+ "\x2f\xaf\x02\x31\xe7\xe4\x79\x1d\xd7\x27\xd0\x5d\xe3\x9e\x29\x65"
+ "\xd7\x6a\x80\xa6\x86\x76\x45\x11\xba\x3e\x86\xed\xd3\xc6\xae\xed"
+ "\x49\xeb\xe0\xf0\xad\x65\x7a\x6d\xdc\xda\x95\x1b\x68\x8b\xd8\xee"
+ "\x71\xa1\x42\xac\x76\xbe\xdd\x7b\xb0\x3e\xba\x66\x0e\x37\x8f\x62"
+ "\x1d\x98\x9f\x2f\xcf\x17\xcb\x13\xc6\x6a\x24\xb4\x83\x8d\x57\x78"
+ "\x04\xa4\x57\x20\x2f\x72\xe3\x06\x7a\xf4\x52\x1a\xf2\xe2\xb8\x30"
+ "\xc8\xbf\x2f\x1b\xcf\xd7\xe0\x79\x78\x1d\xa7\x63\xbb\xaf\x87\xa7"
+ "\xe0\x75\xf4\x4d\xe4\x2c\x06\x5e\x32\x13\xf2\x2b\x7f\x12\xda\x96"
+ "\xc1\xf5\xad\xaa\x6d\x7d\xa4\xe4\xa0\x91\x10\x6c\x27\x8c\x51\x0d"
+ "\xb4\xf5\x24\xe8\x7e\x6e\x6f\x2e\xd0\xd7\x7b\xe8\x6b\x31\x04\xdb"
+ "\x0c\xfa\x8c\x6f\xdf\x43\x33\x79\xec\xf7\x60\x1f\x71\x3c\x47\x32"
+ "\xdd\x07\xd7\x1e\xfe\x09\xdb\x2e\xf6\xfb\xa1\x60\xcb\x31\xe6\xfa"
+ "\x0d\x38\x20\x5e\x88\x8b\x58\xe6\x38\xe4\xfd\x5c\x28\x8b\xed\x99"
+ "\xc8\xf3\x06\x8e\x75\xee\x30\x5a\x8f\xf4\x22\xed\xc3\xdc\xfe\xd8"
+ "\xa9\x50\xf7\xa8\x24\x6e\x6f\x38\x09\xc6\xdb\x87\x72\xab\x70\x6f"
+ "\x53\x28\xa3\x06\xc7\x14\xe8\xde\x43\x7e\x84\xf3\x7a\xbe\xdd\x7b"
+ "\x60\x3e\x0f\x81\x63\xbc\x28\xff\x0f\xef\xb2\xe6\xaf\x87\x6c\xe5"
+ "\x1f\xf1\xce\x35\xa7\x45\x11\x7e\x5f\x67\xe5\x05\xf9\xc3\x93\xf8"
+ "\xb9\x83\xc7\xfa\xe1\x82\x83\x20\x2f\x62\x19\x0f\x0f\xb7\xc1\xba"
+ "\x86\xe3\xc7\x35\x33\x24\xd8\x67\xc8\x5b\xc3\xca\x79\x88\xeb\x33"
+ "\xc7\x4f\x19\x1c\x0f\xd4\xd3\x35\xd0\xcf\x6e\x3e\x78\x48\xc3\xe3"
+ "\x5c\x6f\x33\x26\x82\xee\xaa\xc5\xbd\xbf\x50\x27\x81\x0d\xfc\x48"
+ "\x7b\x97\xa8\x97\x10\x7b\x33\x87\xfd\xc3\xca\x32\x36\xdf\xf2\x7a"
+ "\xeb\x21\x76\x7d\x98\x15\x0f\x63\x9f\x7e\xc7\xf1\x2f\xb6\x25\x6d"
+ "\x0e\xb6\xa5\x86\x6b\x47\x9a\x92\xc0\x35\xae\x7e\x28\x2b\x86\x97"
+ "\x57\xa1\xac\x10\x2c\xeb\x79\xd0\x55\xd8\x26\xa8\xbb\x86\xd3\x7f"
+ "\x8f\x62\xdb\xc6\xdf\xc7\xb7\xbd\xce\x90\x81\x79\xc7\x2a\x3b\xa4"
+ "\x5c\xde\x3a\xa0\xcb\x37\xb0\xbd\x13\x06\x42\xfe\x4a\xe5\x7c\xa4"
+ "\x8f\xc8\x42\x1d\xad\x7c\x96\xfb\xbd\x4a\xf9\x14\xf0\xea\x39\x22"
+ "\x87\xf2\x7c\x90\x47\x05\xbe\x68\x95\x47\x2c\x04\x1b\x03\xf1\xaa"
+ "\x02\x1b\xa9\x12\xc7\x1b\x79\x19\x6c\xa4\xb0\xf6\xbc\xf1\xf9\x02"
+ "\xdf\x42\x3d\xc5\x38\xf6\x0c\x9f\xf1\x5f\x00\x1f\xd7\x88\xbc\x35"
+ "\xfe\x0b\x7e\x1c\x2b\x61\x1c\x7d\xa0\xbe\x67\xf8\x7e\x55\x02\x3d"
+ "\xd8\x62\x11\xd3\xf9\xb6\x17\xf1\xf4\x97\x05\x1c\x78\x59\xad\xcf"
+ "\x46\xfd\xcb\x61\x30\x21\x8b\xcf\x5b\xc1\xea\x9a\xb0\x55\xa0\x45"
+ "\x1b\x91\xdb\x07\x0d\xd2\x50\x0f\x8e\x02\xec\x39\xdd\x87\xfb\xfe"
+ "\xf2\x69\x28\x3b\xac\x8e\x08\x6e\x7f\xec\xe7\xc1\xee\x11\xf9\x68"
+ "\x42\x9c\x8d\x7e\x42\x5d\x9c\xdb\xb0\x89\xed\x33\x81\xbc\x84\x3a"
+ "\x15\xd7\x2b\x50\xde\x78\x5e\x7e\xf8\x36\x4f\xf8\xc4\x9a\x57\x22"
+ "\xee\x02\x5e\xb9\xcf\xa2\x6c\xad\xa3\x79\xae\x8c\xe9\xc0\x62\x96"
+ "\xe7\x91\x21\x7c\xdf\xaa\x58\xdf\xf8\x73\x1c\xb7\x54\x1c\xb7\x89"
+ "\x9f\x59\x8c\x23\x8c\xdb\xc4\x49\x3c\x7d\x0d\xea\x72\x51\x5e\x1f"
+ "\xd9\x20\xc8\xb2\xbd\xbe\x98\x38\x1a\xe5\x41\x6c\xd7\x23\x31\x36"
+ "\xfa\xa2\xc6\xb1\xbe\x78\x24\x98\xef\x6f\xb9\x8d\x6c\x54\xb0\xb6"
+ "\xf3\x73\x0b\xe0\xd0\xd0\xc6\xef\xf7\x01\x69\xa8\x3f\xb1\x6e\xcb"
+ "\x39\xa8\x94\x8d\x2b\x2f\xcb\x13\x6f\xb7\xc7\xe1\x91\x56\x4b\x79"
+ "\x46\xac\x51\x27\x60\x19\x88\x29\x67\x57\x42\x1a\xc3\xf5\x91\x5a"
+ "\xd4\x0d\x96\x3a\x1a\x68\xf3\xcd\x14\xe5\xe5\x11\xbd\xb5\x2c\x3e"
+ "\x32\x87\x97\x45\xa1\xee\xfd\x80\x51\xa8\x58\xef\xc4\x38\x9b\x7a"
+ "\x11\x9b\x5a\x2e\x9e\x33\xd7\xc7\x89\xbb\x85\x39\x0d\xe9\x21\xaf"
+ "\x06\xf2\x14\xd9\xcc\x8f\xb9\xd8\x3e\xa8\x4b\xc1\xe9\xac\x42\x4e"
+ "\x57\x68\xda\xb9\xf6\x4c\x2c\x2e\xe3\xe7\x09\x48\x0b\xe5\xd3\x54"
+ "\xfc\x5c\x22\xf0\xcd\x20\x9b\x36\x19\x1c\xdb\x47\x8f\x28\x04\xfb"
+ "\x88\x2b\x8b\xd3\x45\x13\x8d\x7c\xff\x30\xed\x3e\x96\x36\xa1\x16"
+ "\xd3\xb2\xd9\x38\xe4\x53\x6e\xbe\x9a\xa0\xe2\xe7\x2b\x94\x2f\xa9"
+ "\x4e\x3e\xfe\x04\xca\x18\x9e\xeb\xe4\x11\xd1\x58\x7e\x63\x7a\x27"
+ "\xae\x21\x8a\xe0\x5a\x32\xea\x03\xd4\x17\xca\x78\xa6\x37\x94\x4f"
+ "\x70\xdf\x25\xa8\x77\xd0\x0e\xc1\xeb\x40\x17\x87\xba\x08\xd2\xdf"
+ "\xc1\xfd\x3b\xe9\x0f\x3e\x50\x6e\x44\x3e\x9f\xf7\x10\x67\x2b\xfc"
+ "\x10\x25\x13\xd2\x84\x7c\x20\xeb\xab\x30\x1f\xe6\x17\xf4\x17\xea"
+ "\x2e\x23\xea\x26\xae\xbe\x49\x03\x78\x1e\xe7\xd6\x0d\x82\x5d\xd4"
+ "\x25\xb5\xa0\xc5\x3d\x10\x38\x9d\x36\x69\x36\xd3\x67\x93\xa6\x62"
+ "\x5e\x0e\x3f\xd0\x95\xa9\x1d\xf4\xdb\xb2\x15\x44\x5e\x7a\x91\xb3"
+ "\xb1\x22\x59\x3b\x27\x95\xb3\x7e\x4c\x52\x73\xfd\x60\x3a\x35\x97"
+ "\xb5\x25\x2c\xb2\xb4\x93\xbb\xb6\x19\xfb\x82\xd7\x72\x2c\xae\xe1"
+ "\x3e\x24\x70\x6d\x27\xd7\x2e\x9b\x7c\xe6\x2e\x95\x1d\x3d\xee\xbd"
+ "\x0b\x3a\xd4\xa7\xb4\x50\xd0\xbd\x93\x95\x7c\x3b\x4f\x09\x7a\x17"
+ "\xc6\x25\x11\x75\x2f\x77\x2d\x9e\xa7\x79\x82\xff\xe6\xf4\xfb\xe4"
+ "\x41\x6c\x5c\x03\xa5\xfc\x78\x27\xb3\x7e\x4c\xbe\x8b\x5b\x67\xff"
+ "\x10\x03\x63\x3b\x59\x2e\x8c\xad\xe5\x6f\x94\x1f\xa8\x1f\xf9\x85"
+ "\xe9\x95\x14\x6e\x0d\x5b\x8c\x34\xd8\x26\x36\x47\x44\x18\x6d\x6d"
+ "\xea\xb3\xf2\xc8\xed\x38\x2f\x31\x5b\x35\x72\x2d\xef\x23\x22\xda"
+ "\x15\xaf\xc2\xbc\x30\xb9\x56\xd0\x31\xb4\x3d\x8a\x60\x1c\x74\x68"
+ "\xcb\x21\x4c\xc3\xb8\xf9\x96\x34\xa8\x9f\xde\xee\xd4\xf1\x65\x4e"
+ "\x2e\x17\xf4\x06\xea\x92\x86\xb6\xd3\xbc\x4d\x37\x25\xba\x94\xd7"
+ "\x25\x17\xe4\x53\x9e\xb4\xb6\xc3\xa6\x3c\x69\xad\x33\x22\x17\xda"
+ "\xea\x0c\xb0\x9b\x37\xb5\xe7\x4d\x09\xb2\xb2\x03\x20\xad\x67\xdd"
+ "\x31\xd9\x80\x32\x8a\xfb\x20\x71\xfa\x89\xf3\x7b\x4d\xd9\x2b\xb4"
+ "\x19\xf5\xe6\xa5\xf5\x82\xff\x22\xf2\x77\x68\xab\xd9\xd4\x97\x6f"
+ "\xa5\x3b\xb1\x3e\xa1\x3c\x39\xc1\xbd\x74\x60\x1c\xd0\xe7\x32\x25"
+ "\x8e\xd7\xf3\xe5\x56\xba\x92\x9f\xc3\x50\x4f\x5a\xcf\x55\x61\x53"
+ "\xad\xe7\xaa\xc8\x49\xf6\x3a\x32\x52\xe1\xfa\x5c\x35\xa5\x05\xf5"
+ "\x96\xa0\x23\xad\x75\x41\xa4\x7f\xa9\x95\x2d\x3b\xa5\x58\xb0\x65"
+ "\x45\x3d\x3a\x25\x04\x75\x14\xd4\x5f\xc3\xd7\x9d\xa5\x93\x8f\xc9"
+ "\x15\xea\x06\x3e\xaa\x6d\x50\x02\x6f\xe6\xdd\x6f\x80\xdf\x49\xbc"
+ "\x0d\xc8\xc9\x66\x27\xee\x27\x22\x9f\x54\x03\xfc\x37\x10\xf9\x4c"
+ "\xbb\xf4\x22\x69\x16\xe7\x8a\xda\x4b\xcb\x84\xf1\x9d\x7a\xbb\xa5"
+ "\x5d\x58\x52\x48\x33\xa1\x9e\x36\xcb\x3e\x6e\x85\xb4\x1c\xde\x87"
+ "\xc0\x8d\x2d\x57\x56\x64\x5d\x59\xa1\x75\xdf\x58\x3f\x22\x8d\xd8"
+ "\x0f\x5c\x13\x41\xfd\xfb\xd0\xee\xc1\xbd\xd0\x40\x6e\x22\xca\xba"
+ "\x79\xfe\xc1\xfc\x8e\x0c\x4b\xfb\x2a\xac\x18\x75\x25\xbf\xf6\xac"
+ "\x03\x7b\x27\xd7\xd2\x17\x33\x73\x4a\xb4\x32\x69\x85\x7a\x69\x72"
+ "\xfc\x18\xa5\x7a\xa9\x3a\x59\x3d\x2f\x51\xbd\x6e\x5e\xb2\x7a\xd9"
+ "\xd2\x90\x25\xf3\x16\xa9\x17\x28\xd7\xcc\x5b\xa9\x0c\xd5\x8c\xd0"
+ "\x0c\x24\x22\xe9\x43\xca\x79\x2b\x57\xae\x5a\xb2\x30\x4e\xb9\x54"
+ "\xbd\xe0\xbe\x15\x0b\x57\x2e\x4c\x56\xce\x5b\xb1\x6c\xd5\xd2\x38"
+ "\xe5\x88\xb8\x91\x23\x42\x1f\x8c\x1b\x68\xe9\x43\xbb\x5b\x41\x5a"
+ "\xcd\x57\x5a\x5a\x72\xae\x10\x1f\x3f\x49\xd2\x0a\x3f\x8d\x7a\x29"
+ "\xf3\xdb\x3d\xba\x70\x54\x3e\xe1\xf6\x57\xc7\xbd\x6b\x69\xde\x54"
+ "\x0d\x7c\xcb\x91\x0e\xfa\xa9\x2c\xc3\x3d\xd6\x87\xd1\xe1\xed\x79"
+ "\x8f\x06\xeb\xe4\x8f\x29\xb8\x7d\x69\x21\x1d\xfa\x36\x9c\x5e\xa9"
+ "\x6b\x01\x9b\x2d\x09\x9f\xf9\x2e\xbb\x42\xfc\x73\x57\x13\x39\x1c"
+ "\xbe\x70\x28\x70\xff\x75\xc8\x33\x47\x27\x9f\xc6\xfb\x45\x1f\x35"
+ "\xea\x87\x2c\x3a\x49\x73\x17\x9d\x64\xb8\x3c\xda\x21\xf8\xa4\x67"
+ "\x6d\x26\xb3\x90\x3f\x4f\xcb\x1f\xe5\x7c\xd9\xcf\x03\x2f\xa3\x4f"
+ "\xf6\xd2\x87\x93\x23\xc0\x1e\x3c\xa9\xbd\x8d\xbb\xd6\xd1\x26\x25"
+ "\xbe\xd0\x2e\xf9\xc1\x94\x50\xf2\x32\xd4\xb5\x32\x90\x52\xa8\x43"
+ "\x2b\xf8\xd3\xa0\x0f\x0a\xe8\xcb\x09\xbe\x1f\xaf\x71\xfd\x28\xa4"
+ "\x41\xf9\x43\xa1\x7d\x79\x5c\x7b\x5a\x85\x3e\x40\xbb\x4f\x40\x9b"
+ "\xa2\xa1\x9d\x0a\x6c\x97\x23\x5f\x1f\xfa\xbb\xce\xca\xa7\x3d\x60"
+ "\x5e\x0d\xe3\x76\x07\xdb\x4b\x29\xa7\x94\xc9\x1f\xf4\x2b\xb1\x0c"
+ "\x7e\x67\x5f\x24\xbe\x5b\x71\xdf\xee\x8c\x3b\xe9\xb1\x36\x23\x69"
+ "\x54\x9d\x20\x7e\x6b\xa9\x9e\xbe\xdf\xd2\xc2\xfa\x34\x2d\x16\x75"
+ "\xc3\xbb\x09\x27\xe4\xd8\x27\x98\x2b\x7c\xcb\x2e\x3a\xf5\x2d\xca"
+ "\x5f\x1e\x46\xdb\xe8\x0e\x4b\x9b\x6b\xda\x61\x1c\x13\xb4\xb7\x2e"
+ "\xc1\x3c\xd5\x9e\x37\xad\x1a\xea\xf6\xe1\x6d\xe3\x36\xda\x35\xc7"
+ "\xc2\x96\x9a\x86\x7c\xd6\xe6\xa4\x6c\x1f\xa1\x6c\xdc\x0f\x1c\xf3"
+ "\x30\xfc\xa3\x1e\x80\x3c\x7a\xb1\xfc\x28\x85\x6d\xf9\x58\x26\xfc"
+ "\xd6\x0b\xf5\xb0\x75\xf8\x34\xb4\x09\xf4\xc0\xcb\x7a\x27\xf5\x05"
+ "\xe5\x15\xd2\xe3\x8d\x90\x9e\xd3\x41\xe4\x40\x7b\xbc\xac\x90\x2b"
+ "\x3f\x49\x27\x9f\x7a\x1c\xcb\x7f\x7e\x18\x21\x9b\x80\xe6\x52\xde"
+ "\x34\x1f\xf4\xef\xc2\x35\x90\xf9\x30\x62\xeb\xb7\xe6\xf9\xf9\x21"
+ "\x1b\x7e\x8e\xc8\x43\x9b\x30\x1f\xca\x07\x1e\xca\xb9\x4c\x70\xce"
+ "\xa9\x1f\x99\x4f\x82\xb1\x1e\xf8\xdd\x84\xfe\x10\x28\x53\x27\xd4"
+ "\x47\x81\xff\xb3\xcd\xcc\x07\xc3\xf3\x56\x48\xa3\xa6\x05\xf7\x5a"
+ "\xa0\x07\x41\xbf\x63\x1b\x91\xc7\xda\xf3\xa6\xfb\x0b\x3c\x05\xbc"
+ "\x7e\x9c\xe3\x2b\x7f\x12\x4c\xf3\xa2\x8a\x70\x6f\x70\xe4\xab\x52"
+ "\xe0\x27\xe4\x2b\xa0\x8d\x10\x78\x0a\x78\xad\x09\xe9\xa0\x0d\x03"
+ "\xab\xd7\x45\xc8\x51\x47\x36\xcb\xa7\xbf\x87\x3c\x46\xff\xf4\xf8"
+ "\x09\xfa\x8b\xdf\x9f\x60\x38\x4d\x7f\xaf\xd1\xc0\x30\x10\xc7\x7d"
+ "\x7a\xa6\xc5\xb8\x37\x01\x1f\x0f\xc4\x71\x66\xbe\xea\xe9\xef\x41"
+ "\xdb\x9a\x38\x5b\x7c\x03\x60\xc0\xcd\x55\xd3\x93\x31\x3f\x3f\x86"
+ "\xf5\xe2\x18\x4e\x6f\x72\x34\x86\x36\x63\xc7\xed\x45\x4d\xf3\xa6"
+ "\x9f\x44\x59\x69\xcf\x7b\x4c\x2e\xec\x43\xed\x08\x4b\xa8\x43\x2e"
+ "\xcf\x27\x3e\x58\x47\xad\x3f\x47\x1f\x26\xd4\x91\x03\x63\xad\x4f"
+ "\x53\xf5\xc8\xcf\xb5\x30\x33\xa3\x4f\x1c\xf3\x07\xf9\xe3\xf8\x3e"
+ "\x96\x2c\xe6\xa7\x6d\xb6\xf9\x47\x2c\xb0\x6a\x2b\x77\xd0\xbc\xc7"
+ "\x32\x5f\xe6\xf7\xe9\x86\xfc\x7b\x7a\x6a\x6f\x90\x92\xcd\x93\xda"
+ "\xbb\x91\xbf\x1f\x3b\xdf\x58\x44\x08\xa6\xf1\xe7\x27\x2f\xc1\xdc"
+ "\x63\xeb\xdf\x77\x7e\xbf\xe1\xf1\xfb\xac\xef\x37\x3c\x3e\xdc\xd9"
+ "\xfd\x06\xeb\x7a\x1f\x57\x63\xbd\xe6\xb2\xd9\x12\xb1\xee\xc7\x67"
+ "\x9b\x1d\xd4\x2d\xe4\x1f\x59\x6e\xb9\x9e\x79\x7c\x2f\xb6\xa1\x01"
+ "\xe6\x29\xfa\xcb\xd9\x12\x0a\xe5\xd4\x72\x73\xf8\xe3\x35\xcc\x7e"
+ "\x41\xbb\xe8\xf1\x22\xa4\xb1\xed\x47\xf7\xc7\xc7\x1f\xf7\xe8\x22"
+ "\x1d\xdc\x49\xbf\x47\x89\x02\xbf\x1f\xd4\x0b\x97\xa5\x56\xc4\x84"
+ "\x3a\x38\xf1\x25\x64\x2c\x47\x4f\xe1\xc3\x92\xf8\x73\x56\x8a\xbc"
+ "\x9b\xbe\xfb\xba\x17\x9f\x01\xac\xbd\x5c\x79\x06\x22\x61\xbf\xc2"
+ "\x15\x16\x14\x91\x3d\xe4\xa6\x44\xc8\xe2\xe8\xb3\x1c\x8e\xf4\xd9"
+ "\xfd\xa0\xbc\x50\x8e\x98\x52\x23\x5f\xbe\x70\x4e\x2d\xcf\x31\xc5"
+ "\xfa\x1c\x3e\xb2\x39\x16\x15\xdc\x29\x8b\xe3\x1e\xdf\x7a\x38\xae"
+ "\x3b\x49\x5a\x6e\xd9\x56\x18\xee\xf4\x7e\xdc\x0f\x3f\xfc\x63\x80"
+ "\xf2\x82\xe1\x7a\x78\x74\x37\xc1\x2d\x6d\x1b\x2d\xc8\x8f\xb2\xe6"
+ "\x8f\x2b\xef\xa1\x8f\xee\x7e\xee\xb0\xf8\x7d\x27\xfb\x1a\x17\x7b"
+ "\x15\xcb\xef\xf9\xa3\x6c\x1a\x20\xfc\x14\xd9\x63\x5c\xb3\x23\x52"
+ "\x71\xfc\x1f\x12\x30\xa6\x96\x1c\x2a\x5e\x9f\xa0\xb5\x3e\x9f\x98"
+ "\x6b\x7d\x3e\x49\x77\x15\x5a\x4e\xb8\x4a\xd2\x74\x43\x08\x89\xa8"
+ "\xea\x4e\xf4\xb3\x11\x19\xbf\x5c\x1b\x11\x12\x3f\x7c\x6b\x64\x84"
+ "\x4c\x0e\xb3\x48\x96\x3b\xa6\xbe\x36\x9f\xdb\x36\xf2\x02\x71\xa7"
+ "\x5e\x61\x77\x71\xa2\x4d\x1a\x9e\xdf\xa4\xe4\xd3\x46\xef\xb7\xa3"
+ "\xe7\xd2\x94\x16\xe7\x92\x08\xf8\x53\x0e\xfc\xaf\xb7\xa7\xfd\xf9"
+ "\xf3\xf3\xc7\x85\x8f\x04\xe5\xe3\xe7\xcf\x35\xfa\x50\x36\x8b\x83"
+ "\x26\xe2\xbe\xf0\x1f\xed\x56\x94\x94\xbf\x40\xf9\x04\xca\xff\xb8"
+ "\x2a\xf3\xf8\xcf\x9f\x9f\x3f\x3f\x7f\x7e\xfe\xfc\xfc\xf9\xf9\xf3"
+ "\xf3\xe7\x06\xf8\x48\x2c\x17\xd6\xb8\xdf\x43\x7f\xfe\xdb\x72\xfd"
+ "\x23\xe1\x0f\xcb\x34\xa9\x37\xf9\x28\xff\x21\xe9\x11\x5a\x65\x79"
+ "\xac\x4e\x91\x1b\xdd\x14\x5a\x9d\xa4\xf7\xc9\x8c\xaa\x0b\xae\x54"
+ "\xb5\x04\x16\xc5\x9c\x08\xaf\xd1\x18\xe4\x9b\x22\x6b\x83\x2a\xe2"
+ "\x9a\xfd\xf3\x67\x1f\x0f\xdb\x93\xdc\xe6\x9b\x35\xa3\x3e\xa4\x2a"
+ "\xb1\x75\x78\xf1\x9c\x93\xe3\xf7\xa5\x18\xa5\x19\x93\x0f\xdc\xfd"
+ "\xea\xfc\xd3\x43\xf3\x7e\xfb\xe9\x98\xbf\xae\xb8\x38\x70\xcb\x63"
+ "\x47\xee\xfd\x4b\xc2\xb9\xdb\x5e\x79\xf6\xcb\x87\xfe\xbe\xae\xf3"
+ "\xa6\x17\x1e\xfd\xe7\xaf\x5f\x8f\x3f\x3b\xac\xf0\xa9\xcf\x1f\x7c"
+ "\x7f\xf5\x95\xc1\xd9\x4f\x34\x8c\x7c\x6b\xe9\x85\x3b\x4a\x9f\xfb"
+ "\xfa\x91\x0f\x53\xcd\x92\x8d\x93\xf6\xdf\xb5\x73\xde\xb7\x43\xb6"
+ "\x3d\xf9\xc9\xe8\x77\x96\xff\x34\xe0\xc5\xe9\x87\xef\x79\x43\xfd"
+ "\xfd\xad\xdb\x9f\xf9\x62\xdc\xde\xb5\x1d\xfd\x36\x4f\x3d\x34\x62"
+ "\xd7\xc2\x33\x01\x05\xbf\xfb\xec\x81\xf7\x56\x5d\x1e\xb4\x75\xe6"
+ "\xb1\xfb\x76\x2f\x39\x7f\x7b\xc9\x1f\x4e\x4d\xf8\x60\x83\x49\xf6"
+ "\xfc\x94\x83\xbf\x7a\x6d\xc1\xbf\x6f\x79\xf9\x7f\xff\x75\xff\xbb"
+ "\x2b\x2f\xdd\xfc\xd2\xe3\x47\xff\xe7\xcd\xc5\x3f\xfc\x72\xc7\xef"
+ "\xbf\x7a\xf8\x1f\xeb\xbb\xfa\xff\x71\xda\xc7\xbf\xf9\xf3\xa2\xef"
+ "\x7e\xf1\xa7\xa7\xff\x6f\xec\xdf\xd6\xb4\xfb\xe5\xcc\x6a\x1c\xf5"
+ "\xf6\xb2\x1f\xef\x2c\x9b\xfb\xcd\xc4\x8f\xd2\xa8\x37\xe3\x47\xe4"
+ "\x3b\x2e\xf5\x25\x6e\xa2\xf1\x88\xc9\xa5\xb1\x1e\x97\x23\x95\xf0"
+ "\xf8\xb3\x84\xf4\x07\x88\xc4\x87\xdc\x24\xf7\x60\xc5\xe0\x69\xbf"
+ "\x9d\x7c\x94\x96\xf9\x5d\xf9\xa0\xff\x68\x34\x1c\xf7\xc3\xf1\x4b"
+ "\x2e\x45\xf4\x02\xdc\xed\x62\x19\xd7\xfe\x23\x81\xbe\xcb\xa0\x65"
+ "\xfd\xc8\x4d\x30\x5a\x3e\x64\x00\x19\x48\x6e\x26\xbe\x64\x10\x19"
+ "\x4c\xfc\x88\x82\x0c\x21\x43\xc9\x2d\xc4\x9f\x04\x90\x61\xe4\x17"
+ "\x24\x90\xdc\x4a\x6e\x83\xde\x0c\x27\xb7\x93\x3b\xc8\x9d\x30\x28"
+ "\x77\x39\xee\x4b\x3a\x89\x08\x84\x3f\xf0\x3f\x9a\x44\x70\xe7\xb1"
+ "\x3f\xa7\xf7\x69\xba\x96\x4f\x6f\xe2\xd3\x75\x3f\xa7\xf7\x69\xba"
+ "\xf2\x3f\xfc\x7d\xd7\x7f\xf4\x5b\x02\xa6\x03\xb3\x1e\xac\x6c\x88"
+ "\xee\x8f\x6d\xaa\x84\xff\x74\x9f\x93\x5e\xf2\xdb\x95\x67\x9d\xdf"
+ "\xf6\x13\x01\x07\xef\x90\x4d\x23\x84\xdd\x6f\xa0\x96\x1f\x63\xa1"
+ "\xe4\x80\x7c\x48\x3a\xde\x3a\xf1\x21\xfe\xdc\xdf\xde\x3f\xda\x64"
+ "\x38\xd2\xe1\xc8\x82\x23\x07\x8e\x1d\x70\xec\x12\xca\x26\x92\x3b"
+ "\x23\x89\x44\x99\x02\xdf\x3a\x22\xb9\x2b\x10\x8e\x2a\x22\x09\x0a"
+ "\x21\x92\xbb\x5b\x89\x64\x44\xa2\xd8\xf8\x91\x99\xdd\xad\x94\x84"
+ "\xf0\xe9\x4a\xf8\x3d\xda\xd2\x57\xeb\xee\x7c\xa6\x9d\x3a\x3b\x4a"
+ "\x39\x7a\x64\xd8\xc8\x07\xee\x9f\xa7\xbc\xef\x3e\xe5\x98\xd0\xd1"
+ "\xa3\x47\x85\x3e\x38\x6a\xf4\x58\xe5\x98\x31\x0f\x8d\x0e\x7d\x28"
+ "\x34\x54\xb9\x64\xed\x0a\xf5\xe8\xd0\x45\x0b\x95\x4b\xe3\xd4\x2b"
+ "\x95\xf1\xea\x15\x4b\xd6\xcc\x5b\xb1\xd0\x85\x9e\xbb\xf5\x81\xae"
+ "\x90\xdb\x4d\xac\x99\x96\x08\x49\xc8\x44\x22\x9f\xed\x43\xe4\x8b"
+ "\x74\xc4\x1e\xd2\x60\xfe\xb0\xfb\x2c\x79\xf6\xa9\x2f\x47\xfc\x7e"
+ "\xf0\x81\x49\x8b\x46\x4c\x98\xf2\x5a\x4e\x35\x91\x2e\xae\x27\xd2"
+ "\x05\x59\x44\xfa\x4c\x3a\x91\xce\x34\x10\x69\x44\x1b\x91\xee\xaa"
+ "\x22\xd2\x92\x68\x22\x7d\x39\x98\x48\xff\xb8\x89\x48\xd7\xc5\xd9"
+ "\xa7\xed\x99\xc3\xd2\xce\x66\x12\xe9\xc9\xf1\x44\xda\xa4\x21\xd2"
+ "\x83\xfe\x2c\xcd\x08\x69\x17\x83\xae\xf6\x50\x5c\x85\x8f\xbb\x7c"
+ "\x20\xf9\x7f\xee\x2b\xa9\x0f"
;
diff --git a/sys/dev/mxge/rss_ethp_z8e.h b/sys/dev/mxge/rss_ethp_z8e.h
index 6b0ecc7..34b0e9e4 100644
--- a/sys/dev/mxge/rss_ethp_z8e.h
+++ b/sys/dev/mxge/rss_ethp_z8e.h
@@ -1,6 +1,6 @@
/*******************************************************************************
-Copyright (c) 2006-2010, Myricom Inc.
+Copyright (c) 2006-2011, Myricom Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -28,9744 +28,9944 @@ POSSIBILITY OF SUCH DAMAGE.
$FreeBSD$
***************************************************************************/
-static unsigned int rss_ethp_z8e_uncompressed_length = 563868 ;
-static unsigned int rss_ethp_z8e_length = 155786 ;
-static unsigned char rss_ethp_z8e[155786 + 1] =
- "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x37\xbe\x32\x19\x64\xc0\xc0"
- "\x4c\x62\xc4\x11\x51\x07\x08\x35\x58\x7e\x24\x88\x12\x11\x34\x0a"
- "\xd8\x58\xf9\x91\x2a\xda\xa8\x68\x40\x03\x0e\x1a\x20\x92\x00\x03"
- "\x86\x4c\x18\xd0\xc6\xca\x8f\x49\x88\x1a\x20\x90\x68\xb1\x97\x5e"
- "\xa2\xd2\x8a\xb7\xd8\xa2\xa6\x25\xfd\x3e\xdc\x7b\x49\x86\xf6\x8b"
- "\xef\x9b\xf6\x4b\x6f\x47\x6e\xa4\x91\x37\xc0\x48\x06\x32\x26\x33"
- "\xb3\xdf\xcf\xda\xfb\x9c\x64\x66\x98\xa0\xdc\x7b\x9f\xe7\xfb\x4f"
- "\xf3\x3c\x93\x73\xce\x3e\x7b\xaf\xbd\xf6\xda\x6b\xad\xbd\xf6\xde"
- "\x6b\xaf\x43\x74\xf5\x7f\x5e\x32\xf1\x25\x81\x8c\x59\x19\xbf\xfb"
- "\x2f\x94\xff\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc\xfd\xe3"
- "\xef\x1f\x7f\xff\xff\xfe\xf9\x12\x68\xf2\x05\x83\x91\x7e\xef\x26"
- "\xea\x72\x99\x46\x78\xa9\xbb\xe8\xad\xed\x22\x88\x57\x09\x18\xe7"
- "\x47\xf0\x95\x7f\x55\x48\x33\xb8\xc9\x34\xca\x42\x49\x33\x76\x13"
- "\x55\x0f\x13\x1d\xdb\xdf\x14\xbe\x8d\x6f\x8a\x8e\x99\xef\x12\x35"
- "\xa5\x11\x6d\x1f\x26\xfc\x80\xb1\xc0\x4b\xcf\xcc\x67\x18\x1b\xf1"
- "\xcc\xef\x37\x0d\x13\x3e\xa4\x97\x20\xfd\x18\xa7\x6f\x18\x06\x58"
- "\xa9\x44\xae\x37\x45\x20\x02\xae\x89\xcb\x33\xcc\x99\x23\x25\x2e"
- "\x7b\x63\xe0\x30\x8c\x43\x5e\xca\x9f\x79\x05\x18\x49\x3a\x5e\x7e"
- "\x03\x25\x30\xbc\x4e\x17\x59\xfd\xae\xc6\xeb\x51\xd6\x8f\xf6\xa4"
- "\x73\xd9\x6d\xc8\x23\x5c\x94\xd8\xe4\x08\x92\x6d\x14\x25\x9c\xa6"
- "\xc1\x6f\xe3\x6a\xc0\xf5\x0d\x6e\xeb\x46\x55\x2e\x8d\x61\xa0\x6c"
- "\x42\x97\x6b\x50\x46\x6f\x59\xc0\xb6\x95\x91\x11\x79\x97\xfa\x0d"
- "\x8d\x06\x95\xd7\x32\x48\xcb\x6b\x40\xde\x05\x7a\x5e\xf5\xce\xf0"
- "\x90\xf6\xee\x5a\xbc\x73\x44\xbf\x33\x56\x69\xef\x92\xf0\xae\x3a"
- "\x06\x3f\xa3\xa7\x3b\x48\xa7\x69\x50\x03\x70\xb1\x1d\x41\x8f\x70"
- "\x19\x2d\x7f\x32\xf2\x37\x45\xc3\x22\xd2\xde\xa5\xe0\x9d\x37\xfa"
- "\xdd\xa7\x19\xda\xbb\x1b\xf0\x2e\x18\xfd\x2e\x41\x2f\x67\xed\x72"
- "\x0d\xb6\xc6\x69\x27\xd7\x9f\xa0\xea\xe6\x36\x0c\x9e\x86\x3c\xe5"
- "\x9c\x67\xbe\xad\x9c\xb8\xaf\xf8\xdd\x91\xfa\xde\xfa\x39\xcf\x42"
- "\x1d\x8e\x17\xe5\x23\x68\x0a\x5a\x0e\x2e\xd5\xcb\xcf\xb4\x31\x0c"
- "\x92\x34\x64\x38\x5e\x1a\x94\xc3\x70\xf8\x19\xf7\x23\xb8\xdd\xda"
- "\xbd\x8d\xdb\x17\xd9\xe7\x44\x46\x80\x1d\x00\x43\xf4\x1a\xfc\x06"
- "\x9a\x74\x1e\x28\xb6\x8a\xb0\xf3\x46\x32\x8a\x2a\x9b\x37\xec\x12"
- "\xe4\x71\x04\xc8\x36\x9c\x9c\xa7\xe8\x5a\x2b\xf0\xa3\xad\xeb\xc8"
- "\xe4\x2c\x12\x01\x8f\xa3\x83\x5a\x7c\x1d\xe4\xf4\x89\x76\x4f\xf0"
- "\x22\x95\x5d\x24\x93\x27\x78\x96\xca\x5e\x22\x6b\x53\xe9\x97\x14"
- "\x8f\xbf\xc2\x06\x41\xce\x11\x5c\xb6\x8d\x5a\x6a\xdb\xc8\x59\x1b"
- "\x5d\xd6\x79\x33\x59\x9b\xf1\x8c\xbe\x33\x33\x1e\x4d\xb6\x20\x05"
- "\x53\x6c\xde\xd2\x1d\x64\x74\x8e\x24\x43\x73\x41\xa3\x8e\x8b\x97"
- "\x71\xd9\x74\x86\x4c\x3f\x5b\x02\x1e\x3a\xc3\xf8\xa6\x7b\x3f\x58"
- "\x17\x30\x1c\xb1\xce\xa6\x23\xd6\x93\xd4\x64\x9d\x4e\x4d\x8e\x99"
- "\xb4\xf5\x0c\x25\x1d\x09\x4c\xa3\x26\xe3\x83\x90\xb1\x99\xe4\xe9"
- "\xc0\xbd\x2d\x84\x3c\x7e\xb2\xad\x26\xf0\xc7\xb5\xc7\xab\x5f\x20"
- "\x93\x57\xc1\x04\x7d\xaf\x3d\xf9\xbb\x12\x22\xa6\x2f\x3f\xc7\x6b"
- "\x47\xf1\x8d\x64\x05\x7e\xed\xc0\xe5\xee\x53\x94\x74\x7d\x9a\x95"
- "\x32\x80\xf3\x40\x4f\x4d\x90\x8c\xa5\x34\xa8\x1f\xd9\x4a\x0d\xbb"
- "\xa4\x8c\x77\xec\x79\x53\xb4\x33\x8f\x76\xbe\x9c\x07\x39\x4d\x9a"
- "\x8d\xba\x3b\xb8\xbe\xad\x90\x75\xe7\xdb\x64\xec\x5c\x93\x97\x50"
- "\xf7\xa6\x68\xc3\x3b\xbb\xfe\x0e\xfc\xd4\x86\xf7\xed\x13\x53\xc9"
- "\xe2\x09\x66\xd3\x67\xdd\xed\x46\x86\x31\xd4\x4f\x09\x0c\xcf\xec"
- "\xa0\x44\xb4\x67\x00\xf0\xb9\xbb\x0e\xe9\xa3\x91\x0f\xe5\xf7\x79"
- "\xa9\xca\xca\xe5\xc5\x0d\x4f\xf9\xc3\x37\x3c\x75\x31\xfc\xd6\x53"
- "\x9d\xe2\xad\xa7\x2e\x84\xde\x7a\xea\x6b\xe7\x5a\x32\x85\x6e\x78"
- "\xca\xd7\x52\x24\xfb\xc0\xd2\x52\x84\x3e\x08\x91\x69\xfd\x59\xb2"
- "\x3c\xf3\x12\xfa\x3e\xf8\x57\x5a\xbf\x94\xac\xe1\xe4\xdb\x6a\x3c"
- "\xc1\xcf\xe9\x99\x52\x12\xb8\xdf\x17\xaf\x7d\x9d\x29\x63\x6d\x4a"
- "\x86\x4c\x68\xd3\x10\x9b\xd7\x78\x6b\x2b\xd7\xeb\x4b\xce\xb4\xe1"
- "\x97\x86\x5f\x3a\x7e\xe3\x44\xca\xd8\x71\xa0\x95\x73\xe8\x86\x04"
- "\xda\xd3\x4d\x34\x31\x4c\x09\x67\x68\xc8\x34\xe0\x6f\xe9\x87\x6e"
- "\x23\xc2\x55\x85\xde\xdb\xca\xa9\xac\xab\xcb\x4e\xac\x9b\x58\x2f"
- "\xb1\x9e\x42\x3d\x15\x5e\xa3\x4d\xb6\x0f\xfa\xcd\x2f\x52\x0a\xbd"
- "\x48\x6f\xf7\xbf\x6c\x4f\xf0\xbd\x6c\x37\x74\xa6\x14\xfe\x27\xf2"
- "\x34\x20\x4f\xae\x46\xc3\x76\x86\x05\x99\xf0\x0d\x09\x52\x22\x60"
- "\x16\xfd\xfa\x52\xab\x71\xf7\x9b\xe2\x24\xf2\x9d\xe8\x85\x05\xd8"
- "\x80\x03\xfa\x0f\x69\xd7\xd3\x40\xeb\xb6\x2d\xc8\xc7\xe5\x3d\x81"
- "\x6c\xd6\xdf\x5e\x4f\x61\x3b\x99\x83\x34\x58\xf4\xa8\xfa\x90\xa7"
- "\x9d\xf5\xec\x90\x00\x5d\xd3\xe5\xa2\x5c\x86\xcd\xe5\x3c\x1d\xed"
- "\x84\x72\xff\x29\x9c\x76\xe8\x37\x9a\xdb\x25\xec\x09\xd0\xe9\x6d"
- "\x47\x50\x5e\xd5\x3d\x34\x57\xc7\x91\xeb\xe0\xbe\x96\x78\x82\x1f"
- "\x8e\x14\x06\x68\x48\x0d\x25\xa2\xdc\xa3\x0c\x8f\x61\x81\x0f\xbc"
- "\x68\xeb\x7f\x1e\x29\xf4\x51\x58\x44\xc1\xf4\x6a\xf0\xea\xa3\xe0"
- "\x21\x5d\x00\x1e\xf3\x5f\x13\xca\x0c\xa9\x97\xf0\x1e\xf9\x75\x98"
- "\xe1\x05\xc8\x68\x93\xf8\x3e\xce\x30\xba\x58\xc7\x00\x66\xe3\xea"
- "\x07\xa8\x83\xcc\x26\x9f\xd3\x9e\xd8\x52\x4a\xc4\xe5\x3f\x28\x6b"
- "\x1f\x20\x3a\xf3\x12\x99\xe7\xf8\xbd\x27\x78\x01\x79\x86\x7e\x25"
- "\x3a\xed\x89\x43\x3a\xc8\xc8\x38\xa3\xbc\x83\xf1\x8c\xec\xcb\x47"
- "\x66\x3d\x3e\x9d\x1e\x9f\xf9\xd0\xcc\xe9\x34\xe7\xfe\x19\xd3\x29"
- "\xe3\xee\xf1\x19\x77\x4c\xc9\xba\x83\x72\x7f\xfc\xc8\x74\xca\x9d"
- "\x3b\x9d\x1e\xc5\x2f\xf7\xd1\x59\x8f\xcc\x9c\xf5\xe8\x74\xca\x7b"
- "\xf0\x21\x3c\xcd\x98\x9e\x99\xf1\x83\xf1\xb9\x33\x1e\x9a\x45\x3f"
- "\x9a\x3f\x29\x63\xd2\x24\xba\x7f\xd6\xec\xcc\x8c\x0c\xed\x9a\x99"
- "\xc1\x59\x9e\xcc\x9a\xf5\xe8\xf8\xdc\x95\x2b\x4a\x56\x8c\x9f\xfb"
- "\xd0\x0c\x4e\xe1\x31\x39\x82\x77\xd2\x43\x97\xc2\x4c\x63\xbf\x38"
- "\x9f\x43\x61\xe8\x8c\x3d\xe8\x7b\xfc\x3a\x1a\xcb\x4e\x41\xf6\x2d"
- "\x9f\xef\xe1\x3e\x93\xba\xd5\xcc\xe3\x95\xb1\xcb\x65\x3e\x09\xda"
- "\xb9\x99\x76\x18\xd3\x90\x67\xd8\x5a\xbc\x1b\xab\x8d\x1d\x03\xf0"
- "\x3e\x18\xfd\x3e\x05\x7a\xd6\x3c\xb1\xc5\x46\xe4\xc1\x0f\xf4\xf6"
- "\x43\x07\x82\xae\x3e\xea\x74\xe6\x0d\x00\x5f\x27\xa0\x8e\x36\xc8"
- "\xe4\xf1\x2e\x97\x25\x2b\x42\xd6\xdb\xd0\x2f\xc7\x6d\xeb\x28\xf1"
- "\x1c\x59\x92\x5b\x4a\xb2\x89\xfb\xc7\x53\xa2\xc1\xb8\xd8\x0b\x63"
- "\xb0\x84\x81\x3e\x07\x9c\x13\x1a\x9c\xf2\x08\xbd\xe0\x65\x38\x5b"
- "\xf1\x4e\x83\xf5\x58\x0b\xf4\x03\xf4\xf7\x99\xb0\x33\x9d\x44\x8a"
- "\xad\x3d\xdc\x93\x2e\xc7\x04\x94\x3b\xa4\xf3\x33\xea\xf7\x37\xa1"
- "\x4e\xf1\xb3\x9c\x04\xf4\x7f\x02\xc6\x2a\xb4\xc5\xdc\x04\xbe\x86"
- "\x1c\x65\x66\x88\x9e\x3c\x52\x69\xc9\xc6\x50\x15\x9e\xab\x32\x33"
- "\x85\x13\x69\xeb\x64\xda\x00\x3c\x67\xa0\xaf\x13\xc1\x2b\x14\x3a"
- "\x8f\xf4\xe5\x94\x88\xf4\x3f\x80\xd6\xad\x32\xff\x79\x59\x7e\x20"
- "\xd2\xde\x05\xbc\xcc\x70\x4a\xe6\x24\xf0\x0e\xa7\xc1\x4e\x48\x7e"
- "\x0d\xe5\xef\x60\x7d\xa7\x74\xf0\xb0\x1d\x3c\xc6\xa1\x1d\x3e\x05"
- "\x5f\x7b\x86\xbc\x2a\x1c\x86\xed\x38\x02\xba\x1c\xc1\xa8\xd5\x54"
- "\xca\xb6\x4d\x32\xda\x3f\x24\x4f\x8d\x8f\xc3\x6a\x38\x6f\x58\xe4"
- "\x91\xb0\xbc\xd7\x0a\xb8\x93\x1b\xd7\x75\xd0\xe9\x22\x32\x78\x29"
- "\x79\x5a\xd8\x69\xa7\x88\xb6\xa4\x33\x1e\xc0\xdb\xd8\xd5\x63\xc7"
- "\x78\x99\x3c\x4e\x96\x05\x7e\x1a\x6e\x9c\xc7\xca\xf8\xb3\x8e\x40"
- "\xbf\x4e\x46\x9f\x0f\x42\x7d\xbe\x98\x3e\x4f\x62\x7a\x00\xdf\xd6"
- "\x30\xae\x80\x93\x2a\xd6\xd8\x81\x17\x19\x98\x1e\xde\x3e\x18\x7e"
- "\xc5\x53\x29\x19\x31\x3c\xf5\x34\x60\x4f\x8f\x78\x9f\x1b\xf3\xfe"
- "\x7e\xbc\x7f\x40\x7b\x0f\x59\x4d\x29\x8a\xa9\x7f\x33\xde\x3f\xc8"
- "\x7d\x08\x59\x4c\xf4\x92\x65\xdf\x1e\xb6\x25\xfb\xf2\xd7\xc7\xe4"
- "\x3f\x8c\xfc\x3f\x04\xbe\x7e\x1e\x27\x38\x7f\x9d\xc6\xf7\xc8\x6f"
- "\x42\xfe\xe3\x31\xf5\x8f\x44\xfe\x47\x23\xf0\x8b\x69\xff\x75\x87"
- "\xf0\x3e\x8f\xf9\x14\xd7\x02\xe4\x19\xc8\xf2\xcf\xba\xe7\x48\x21"
- "\xf7\xcf\x75\xb6\x98\xfc\xd9\xc8\xf7\x22\xd3\x59\xd2\xa8\x93\x69"
- "\x64\xd9\xa7\xd9\x35\x27\x15\x0e\xd7\xcd\x8f\x29\x53\x82\x32\xc5"
- "\x4c\x5f\xc9\x67\x5d\x71\xcb\x54\xc4\x94\xd9\x27\xf9\x54\xd5\xa3"
- "\xf5\xb1\x2a\xa3\xe9\xb5\x48\x18\xdc\x36\xd8\x5a\xd7\x1d\x8b\x86"
- "\x71\xfd\x3e\xd4\xfb\xf2\x16\xa5\x33\xae\x05\x4f\x4c\x42\xda\x0e"
- "\xc0\xbc\x93\xf9\x08\x72\xe6\xf7\xf8\x02\xd0\xbb\x39\x49\x8a\x77"
- "\x53\xc7\x9b\x4b\x89\xef\xc7\xf3\x3d\xc3\x16\x3d\xb3\x35\x79\x4a"
- "\x1d\x8f\x2b\xa7\xa7\x72\x3a\xcb\xb1\xe8\x79\x38\xac\x60\xa6\xfe"
- "\x08\xf2\x6e\xc0\x73\x48\xab\xa3\x12\xcf\x09\xc0\x7f\x12\x74\x3a"
- "\x78\x36\x87\xf9\x71\x32\xd2\x5f\xd3\xde\x6f\xe0\xfc\xb8\xcf\xd4"
- "\xee\x13\xc0\x63\x93\x34\x39\x83\x4c\x5d\xbf\x56\xd6\x0d\xb9\xd2"
- "\xcb\x87\x15\xdf\xcf\xc0\xbb\xc5\xb8\x3e\x84\xeb\x8f\x70\xfd\x11"
- "\xae\xe3\x9d\x17\xc9\xea\x0c\x49\xf9\xe2\xe7\x1b\x71\x7d\x04\xd7"
- "\x01\xb8\x3e\x0a\xdc\xbe\x06\xdd\x33\x7c\xe0\xe9\x18\x9e\xe9\x40"
- "\x1f\xb2\xdc\x0f\x54\x7d\x98\xea\xe5\x3a\x43\xba\x2e\x38\xdf\x97"
- "\xa6\xe9\x07\x4d\x1e\xb4\xb4\x9e\x1c\xa6\x4b\x2e\xe0\x1f\xe6\xfa"
- "\x85\x82\x35\x40\xf5\x93\xca\x13\x56\xe5\x8c\xaa\xbf\xb5\x34\x95"
- "\x2f\x21\xb2\x4e\x5c\xdd\x65\x7e\x21\x70\x2d\x65\xba\x7a\xe9\xfa"
- "\x72\xd0\xc4\x88\xe7\x5c\xa6\x93\xcc\x2f\xe1\x5e\xd7\x11\xd1\xdf"
- "\xb0\xed\xaf\x3f\x1c\xd3\xdf\x2c\xe7\x5b\x64\x7f\x83\x76\x3a\xce"
- "\x8c\x3f\x78\x9a\xc7\xc9\x6b\x74\xbe\x01\x7f\x77\xf4\xc9\xd8\x30"
- "\x63\x34\x1c\xc5\x57\xcc\x1f\x43\x8b\x34\x99\x04\xbd\xa0\xc3\xfc"
- "\x89\xa5\xcc\xab\xc3\x26\x7b\x69\x7f\x8e\xb4\xc5\xaa\x32\xef\xe2"
- "\xf7\x7e\xe8\x26\xce\x9f\x58\xc4\x32\x36\x6c\xbe\xfe\x5e\xbe\x4b"
- "\x5e\xb6\x90\x71\x4a\x2c\x94\xef\x8a\xbc\x60\x31\xfd\x9d\xac\x87"
- "\xdf\x95\xc8\x77\x9b\xfb\xe0\x8e\x34\x69\x70\x13\xe3\xd9\x52\xc2"
- "\x6d\x0b\x80\x41\x0d\xb7\x97\xd3\x00\x4f\xf0\x04\xcd\x0b\x8a\xd0"
- "\xf8\x72\x1a\xe4\x09\x36\xd0\x58\xa2\x64\x4f\xf0\x24\xdd\x4e\x34"
- "\xd2\x13\xac\xc6\xd8\xbe\x97\xdf\x7f\x76\x1b\x25\x24\xe0\xea\xfc"
- "\x5e\xb9\x21\xc1\x13\x2c\xa1\xb4\x72\x23\xae\x85\xf4\xe0\x00\xd1"
- "\xe5\x09\xce\x46\xbe\x02\x9a\x17\x12\xe7\x67\x0e\x10\x7f\xcb\x0f"
- "\x91\x65\xf6\x2b\xc2\xe9\x09\xc2\xce\x0e\x1e\x43\x7a\x58\xcc\x0b"
- "\x7d\x83\x5f\x97\x08\xbb\x47\x9a\xe6\x85\xce\x8b\x19\xaf\x7c\x86"
- "\xe7\xbf\x09\x61\x20\xe1\x09\x4e\xa3\x16\xbf\x1f\xf9\x9c\x42\x54"
- "\xda\x02\xcf\x5c\x34\x50\x0f\xc6\xe8\x70\xe5\x48\x13\xda\x62\xed"
- "\x41\x3b\x44\xca\xc8\x1b\x7a\x5e\xc6\xb5\x6a\xe4\x30\xf9\xec\x1e"
- "\x99\x2e\x2c\x23\xad\x13\x30\x69\xe1\x36\x78\x82\x6d\x94\x0f\xb3"
- "\x7b\xde\x5a\x9f\x60\xfc\x87\x6e\xe0\x39\xcb\x34\x82\x5e\x34\xcf"
- "\x5b\xeb\x14\x78\x67\x12\xc9\x23\xad\x9e\x60\x07\x89\x4a\x94\x4d"
- "\x19\x39\x46\xc2\x73\x8f\xcc\x41\x5e\x1f\xe7\x8b\x84\xc3\x30\x38"
- "\xef\xbc\x10\x99\x91\x3f\xa7\x27\x79\x64\x16\x7e\x79\xf8\x55\xa0"
- "\xec\x4e\xe1\x4a\xfd\x9d\xc0\x78\x8a\xf2\xfb\xf0\x7c\x28\x80\x39"
- "\x82\xa4\x65\x88\x06\x22\xff\x3e\xf0\xcb\x4c\xf0\x1d\xe3\xdb\x2a"
- "\xf1\xad\x1a\xf9\xbf\x03\xaa\x1d\xff\x4b\x6b\xc7\xe7\x9c\xde\x09"
- "\x5b\x02\xf7\x81\x4e\xf5\xae\x0b\xe5\xe6\xcb\x72\xee\x91\x01\x61"
- "\x19\x65\x0a\x40\x9e\x40\xd7\x72\xa6\x23\xe8\x5a\xce\xb4\x04\x7c"
- "\xcc\x9d\x36\x93\x48\x1e\x65\xea\x49\x1e\x65\x15\x55\xa3\x6e\xef"
- "\x91\x63\xfc\xa8\xac\x80\x84\x3d\x6a\x0a\xe0\x2c\x00\xbf\x26\x02"
- "\x46\x96\x70\x8f\xca\xe9\x71\xd9\x68\xde\x5a\x11\x98\x17\xdc\x10"
- "\xcc\x5f\x4b\x89\xe3\xa8\x1c\xf8\x7e\x02\x1a\x15\xa0\x9d\x4d\xb8"
- "\xce\xc4\x7b\xba\x0e\x75\x7d\x06\xb8\x59\x5c\x9f\xa8\x1c\x95\x03"
- "\x98\xb3\x00\xab\x80\x71\xfa\xc6\x45\x16\x3c\xe7\x7d\x23\xf1\x1b"
- "\xe5\x08\xbb\x47\xd5\x84\x2d\xa3\x2a\x74\x1e\x62\xfe\x51\x74\xab"
- "\xa6\xb9\x7e\x11\xf4\x04\x77\x13\x78\xcc\xd2\xe2\x3f\xc9\xef\x31"
- "\xaf\x68\x40\x3f\x33\x4f\x95\xe0\xba\x97\x98\x7f\x5a\x8a\x5e\xe1"
- "\xbc\x9f\x31\x0f\xcd\x2d\xf2\x6f\x18\x4f\x45\x09\x78\x76\xe6\x07"
- "\x4d\xf4\x4c\x91\xb1\x3c\xe4\x1e\x65\x6f\x29\xe2\x7e\x39\x81\x32"
- "\x5c\xae\x90\xcc\x09\xb0\xad\x13\x44\xd0\xec\xf0\x19\x87\xd8\x9d"
- "\xa2\xc5\x3f\x1b\x79\x8b\x88\xdb\xc3\x7c\xc4\xf9\xe7\x74\x08\x6f"
- "\xc8\x32\xda\xca\x6d\x13\x43\xcb\xa9\xb9\xe3\x4e\xe2\xf9\x4d\x73"
- "\xc7\x5e\xe6\xd3\x30\xe8\xd2\x0e\x1e\xed\x99\xd3\x51\x3e\xe0\x99"
- "\x8b\x94\x80\xb4\x50\xb3\xbd\x01\xef\x9b\x90\xef\x98\xe4\xdb\xb9"
- "\x17\x83\xe6\xa0\x65\x54\x5e\xd0\x3d\x2a\x30\xf7\x62\x8f\x68\xb6"
- "\x57\xd3\xd3\x1d\xe5\xa0\x55\x03\xcd\x39\x1b\x4c\x6c\x29\x2a\x40"
- "\x9e\x2e\xa4\xef\x95\xfc\x3f\xe7\x6c\xa7\x98\xfb\x92\x38\x3f\xf7"
- "\xe2\xdf\xc4\x1c\xbb\xf8\x2c\xdf\x41\x43\xaf\xdd\x20\xc2\x2c\x17"
- "\xc7\xda\x1a\xe8\xda\x93\x5e\x62\x99\x98\xbd\x28\x2c\xe6\x9c\x3d"
- "\x2f\x9e\x79\x89\x69\x33\x8d\x9a\xed\x90\x1f\x47\x35\xd3\xdb\xd1"
- "\x6c\x3f\x8c\xfa\x67\x02\xae\x53\x78\x1c\xbb\x91\xb7\xd1\xfc\xf4"
- "\x59\x0b\x1d\x6b\xab\xa6\x60\xf2\xa8\xbc\x50\xe5\x28\x7b\x38\x79"
- "\x54\x45\xb8\x72\x54\x0d\xfa\xa9\x3d\x58\x39\x2a\x10\x4a\x1e\x0d"
- "\x1e\x18\x6d\x47\x3f\x0d\xe2\x3e\xef\xc6\x7c\x1f\xcf\x4b\xba\xb9"
- "\xff\xdd\xa3\x1d\xc2\x32\xba\x06\xba\x50\x28\xde\x1f\xed\xe0\x39"
- "\xbb\x48\x1e\x5d\xd3\x93\x3c\xba\x02\xf9\x6a\x94\x7c\x8d\xde\xc7"
- "\x7c\x29\xc7\xa2\xaa\xd1\xff\x84\xb1\x23\x11\xef\x0f\xe1\x77\x14"
- "\x3f\xd8\x53\x69\xe9\x80\x9f\x2c\x79\xca\x9d\x96\x2e\xee\x75\xc3"
- "\x46\xc5\x1c\x3d\x39\x2d\x67\x5e\xe8\x3e\x01\x1a\x42\x4e\xd2\xd2"
- "\xc3\x95\x69\x59\x22\x25\xcd\x1e\x90\xbc\x9f\xf6\x3c\xc3\xee\x79"
- "\x39\x9d\xe7\xf2\x46\xbc\x77\x20\xed\x4c\x80\x79\xd5\x92\xd6\x1e"
- "\xb6\x8c\xc9\x01\xac\xc0\xc3\xaf\x08\x5f\xc8\x3d\xc6\x1a\x76\x8f"
- "\x31\x05\xaf\x81\xed\xeb\x38\x4c\xac\x9f\x82\x9f\x0a\xd0\xe0\x0f"
- "\xa0\xc7\x5e\xd9\xff\x1e\x07\x64\x60\xed\xf0\xf2\xe6\x0e\xf0\x42"
- "\xd1\x7b\x52\x37\xb5\xf8\x4f\x48\x9a\x02\x8f\x76\xe6\x29\xee\xdf"
- "\x67\x8a\xa8\x1c\x75\x05\xc2\x95\x63\x4c\xa1\x4a\xc0\x4d\x46\x3d"
- "\x29\xb7\xfd\x34\x20\xe5\xf5\x36\xf0\xeb\x61\x94\xf9\x03\x29\x1e"
- "\xbf\xad\xa2\x3f\x1d\xc9\xba\x8a\xf5\xd3\xbc\x60\x80\x79\xe6\xef"
- "\xac\xd7\x94\x9e\xa2\x7c\x5d\x4f\xb1\x8e\xe2\xf9\x04\xeb\xa9\xb0"
- "\xa6\xa7\xc2\x9a\x9e\x92\xcf\x16\xe8\x1a\xf7\x48\x2b\xeb\xa3\x79"
- "\x0e\xa5\x67\xe6\x85\x32\x04\x78\x23\x09\x72\x6c\x55\x7d\x81\x3c"
- "\x55\x23\xc7\xc8\xfc\x92\x4e\x23\x73\xc2\xd0\x37\xf8\xe5\x85\x95"
- "\xbe\xa9\xd1\xf4\x8d\x41\xd7\x37\x21\x8c\x6b\x90\xa9\x70\x3c\x7d"
- "\x13\xd6\xf4\x4d\x48\x28\x7d\xa3\xe1\xf3\x39\xa7\x87\x34\x7d\x13"
- "\x8a\xa3\x6f\x20\xcf\xdc\xde\x44\x4d\xcf\x94\xb3\x9e\xe1\xf6\x82"
- "\xd7\x4c\x61\xa5\x67\xd2\x31\x97\x30\xb0\x9e\x09\xa1\x4c\x58\xd7"
- "\x33\x5d\x52\x1f\xe4\xb0\xae\xe9\x79\x95\xa0\x3f\x6d\xc4\x3a\x46"
- "\xea\x93\xe0\xc8\x20\xeb\x13\xd0\xef\xbe\x58\x7d\x02\x78\x79\xb8"
- "\xb7\x68\x7a\xaa\xc2\xbc\x41\x04\xa1\x4f\xec\xf3\x1c\x7e\xf4\xf5"
- "\x5f\x31\xa7\x86\xde\x76\x94\x94\x7b\x1c\x41\x82\x1e\xa8\x11\x2d"
- "\xe5\x04\x1c\xc1\xbf\x21\xe8\x0a\x22\xc8\x65\x7b\x10\x32\x8e\xba"
- "\x03\x2d\x45\x9f\x53\x08\xb2\x3a\xa7\xa3\xd3\xf3\x8c\x3f\xdd\x32"
- "\xe7\xac\xf0\x81\x3e\xde\x67\x8a\xca\xa1\x5f\xd2\x7d\xcd\x1d\x9f"
- "\xd0\xec\x36\x11\x9e\xbd\xd0\x6b\x03\x1e\x81\x39\x4b\x1b\xcd\xcf"
- "\xbc\x64\x81\x9c\x89\x46\xe8\xc5\xff\x77\xce\x59\x8b\x79\x41\x1b"
- "\xdd\x32\x7b\x91\x08\x87\x20\x67\x68\xaf\x1d\xed\x76\x00\xf7\x0a"
- "\xc8\x5c\x0d\xe4\xac\x3d\x18\x23\x67\x90\x99\x25\xb8\xb7\x29\xfa"
- "\x8d\xae\x81\x9c\x39\xc2\x72\x3c\x6b\x93\x73\x38\xc8\x5a\x0d\xaf"
- "\x71\x41\xd6\x1c\xe1\x4a\x25\x6b\x61\x55\x6e\x5f\x98\xe9\x67\xd0"
- "\x64\x0d\x7d\x81\xf7\x87\xf0\x3b\x8a\x5f\x7c\x59\x2b\x8a\x90\xb5"
- "\x97\x34\x59\x4b\x56\xb2\x86\x3e\x4d\x0c\xbd\xac\xe4\x8d\xe1\xf3"
- "\x3c\xaf\x57\xde\x52\xd2\xda\x05\xdb\x93\x92\x77\x58\xe6\xd2\x30"
- "\xae\x8c\xb1\x42\xde\x4c\x90\x37\xc0\x13\x3e\xd6\x9b\xe0\xcd\xff"
- "\xe0\xb1\x6e\x6e\x91\xf8\x8f\xfc\xd0\xf0\x72\x91\x3c\xc6\x0a\x5d"
- "\xf6\x37\xe8\xd1\xff\x78\xc6\x4f\xf5\x80\xd5\x8e\xfa\x02\x90\x27"
- "\x13\xe4\x8a\xe5\xa9\x22\xf4\x32\xc3\xbc\xad\xa2\x17\x86\x1c\x2b"
- "\xa3\xe5\xa9\xbf\xf5\xc5\x2e\xd7\xad\xd3\xbc\xf4\xeb\x12\xb6\x57"
- "\x70\x9f\xe3\xa5\x43\x39\xda\x3d\xec\x9f\x5a\xb9\x36\xcd\x32\x58"
- "\x54\x46\xd7\x9f\x21\x9b\x09\xfc\x4e\xb8\x4f\xc2\x7d\xd2\xbc\xb1"
- "\x9f\xc1\x8e\xd8\x01\x3b\x42\x74\xb1\x1c\x0a\xd7\x64\x9e\x73\x65"
- "\x83\x0f\x4d\xa2\x2b\x3d\x09\xf6\xe4\xa7\xa2\xc7\xca\x6b\x58\x66"
- "\x3c\x0f\x45\xfb\xd3\x70\x4d\xd9\x7d\x89\x52\xf1\xb3\xee\x76\x85"
- "\xcb\xd9\x76\xc2\x7d\x86\x58\x63\x1d\xbc\x75\x35\x8d\x33\xfb\xc9"
- "\x54\xe7\x0a\xe7\x99\x37\x58\x78\x2d\x27\x95\xef\x85\xab\xde\x5e"
- "\x77\x89\x8c\x6c\x57\x86\x93\x51\x9f\xc3\x2c\x44\x71\x3a\xd5\xad"
- "\x84\x7e\x70\x91\xb5\xce\x25\x0e\x84\xba\x98\x06\xb6\x80\x8e\x0b"
- "\xe3\x06\x3c\x6f\x06\x9e\x23\x1e\x5b\x9b\x4d\x7f\x70\x50\xdc\x35"
- "\xd0\x2e\x97\xad\xb7\xfd\xfd\xbc\x5f\xa0\xd3\xa4\x9f\xf7\xa5\x3a"
- "\x9d\xfa\x59\x2f\x33\xf2\x18\x1d\x5a\x2d\x7c\xdb\x5e\x20\xa6\x85"
- "\xd5\x19\x14\xff\x09\x3a\x96\x97\x85\xe8\xe6\x79\x6b\x6f\x15\x9e"
- "\x0e\xd1\xe8\x71\x9c\xa5\x3a\xbc\x2f\x2b\x15\xe1\x70\x72\x26\xfa"
- "\x39\xb3\xb6\x73\xb5\x08\xf2\x5a\x09\xea\xf0\x7a\x69\x6a\xb9\xea"
- "\x8b\x51\x0e\x39\xcf\xb3\x64\xd6\x02\x56\x32\xc3\x6a\x46\xf9\x50"
- "\x65\xe6\xde\x2e\x17\xdb\x9b\x7f\x58\x20\xf3\x59\x46\x39\x8a\xd6"
- "\xd1\x4d\x67\x68\x64\xb6\xb4\xf5\xdd\x99\x07\x59\x1f\x20\xcd\x82"
- "\xb4\xd9\x80\x7f\x08\xf9\xb3\xbc\xf4\xcb\x1a\x65\xc7\x8e\x9c\xad"
- "\xe7\xc3\xbd\x8d\xef\xa3\xf8\x27\x41\x6e\xaf\xa0\xbf\x6c\x7d\x9b"
- "\x2d\x9c\x66\x8c\xd8\x7c\xb1\xe0\x97\x1d\xff\x75\x9f\x3e\x1f\x15"
- "\x80\xad\x45\xce\xf5\x34\x02\xfd\xc3\xf8\xfd\xce\xe9\x10\xa7\x85"
- "\x6b\x64\xde\xcf\xd6\x05\x30\x4f\x18\x79\xcc\x4b\x15\xb5\xfd\xd1"
- "\x53\xb0\xad\x73\x49\xb4\x6f\x5b\xdd\x4b\xcb\x2f\xe6\xad\x0d\x0b"
- "\xbe\x67\x7d\x54\x87\x74\xa6\x5b\x97\x6b\x54\xaa\x4e\xb3\xfe\xfb"
- "\x25\xf3\x80\x9a\x17\x8e\x2a\x11\x2e\x41\x8d\xb7\xf0\xfe\xc4\xa8"
- "\x55\x8a\x0e\xa3\x2b\x3a\xa1\x47\x78\xfd\xb5\x0e\xf4\x2e\xb6\x8a"
- "\x00\x60\xda\xbd\x74\xbb\x4f\x5b\xe7\xf1\x7b\x82\xb3\x58\xb7\xc4"
- "\x1d\xb7\x78\xff\xa7\x0f\xfe\xe8\xea\x96\x11\xd0\x43\x52\x37\x2d"
- "\xdb\x5b\xa6\xf0\x0e\x30\xdc\xc6\xb2\x0b\xd4\x86\xf7\xc5\x7e\xd1"
- "\x2e\xdc\xcb\x6a\x78\x1e\xd1\xb8\xba\x9b\xd3\xde\x00\x6f\x8b\xc6"
- "\x95\x8c\xd3\xe8\x37\x1a\x6f\xe9\xa6\xd3\x98\xf7\xd5\xf5\xae\xc9"
- "\x8c\x2e\xe7\x35\x18\xb5\x8e\x34\x1a\xf3\xa1\x71\x87\x74\xbc\xd8"
- "\xc6\x00\x7d\x4d\x6c\x73\xb0\xad\xc1\x6b\xfa\xc5\xa5\x22\xc0\x36"
- "\x07\xf2\x8e\xd3\xdb\xc0\xed\x53\xed\x1a\x9d\x1d\xd9\x2e\xe0\xe0"
- "\xc3\x1c\x5a\xd2\xa0\x78\x2d\x99\x6c\x8a\xd6\x26\x6e\x2f\xb7\x85"
- "\xdb\x2c\xdb\x22\x75\x2c\xc6\x88\xe0\x9d\xa8\x5f\xa6\xd7\x00\x16"
- "\xe6\x3f\xdf\x9f\xaf\x78\x6a\x34\xc5\xf2\x51\x6f\x3f\x5a\x46\xe5"
- "\x38\xbf\xa1\x5b\x9c\x61\x71\xea\x34\xa5\xf1\x7c\x37\x91\xaf\x61"
- "\xb6\xb3\x03\xcc\xbf\x53\x6a\x78\x4c\xf6\x94\xb2\xbe\x95\x79\xaf"
- "\x43\xde\x36\xe4\x19\xa4\xe5\x1d\xa4\xf6\x73\xe4\x75\x20\x5f\x31"
- "\x8e\xcd\xf2\x52\x9a\xcd\x27\xc7\xfb\x65\x0b\xf5\x67\x81\x67\xe0"
- "\xd2\x2a\x2a\xa7\xd4\xc4\xc7\x65\x4c\x0e\x8f\x67\xa1\x4b\xa2\x03"
- "\xf5\xdc\xc0\x3c\xe5\x5c\x4b\x37\x82\x2f\xbf\x28\x5b\x4f\xd7\x31"
- "\x3f\x89\xe4\xcc\xc3\x8a\xee\x69\x85\xc2\x05\xdb\x13\x1a\xb5\x68"
- "\x35\xdd\x04\x39\x3a\x78\x86\xd2\x36\xe4\x97\xda\x80\x2b\xd1\xb6"
- "\x73\x44\x52\x07\x25\x67\x1e\xf2\x04\xbf\xa4\xba\x73\xbc\xfe\x92"
- "\x56\xaf\xf3\x22\xee\x1b\xae\xa4\x2f\x40\xd7\xa3\x6a\xfd\x60\xcc"
- "\x8d\xbc\x7e\x7f\x8a\xc6\x18\xb9\xbd\xf8\x25\xa0\xee\x8b\xe2\x92"
- "\x58\x20\xd4\x98\x76\xc8\x4b\x63\x32\x70\x3d\x2a\x7f\x2e\x5a\xa8"
- "\x3d\x1f\x42\xbe\x36\x71\x29\xcc\x79\x8e\xa2\xfd\x41\xe1\x4a\x60"
- "\x99\x38\xdc\xe5\x1a\x93\xee\xa5\xe9\x9a\xbc\xa7\xf9\x19\x56\x3f"
- "\x38\x1c\x42\xdf\x12\xf3\x26\xf0\xa8\xb4\x95\x25\x30\x1e\x8b\xa5"
- "\x5c\x00\x56\x9d\x41\xe9\xed\x30\x70\xdd\xe3\x0a\xdb\xa1\xa3\xed"
- "\xe1\xaa\xa9\x56\x79\xaf\xbd\x13\xda\x38\x1a\x1f\xfe\xb2\xbd\x8d"
- "\xc3\x99\xc7\xc7\x74\x28\x38\xcb\x6a\x1a\x87\x9f\xe1\xe7\xb3\xfc"
- "\xec\xb7\xdc\x63\xf5\xd4\x64\xa3\xfe\x33\x5c\x6f\x87\x9a\xcf\x8f"
- "\x39\xdb\x89\x3a\xd0\x86\x0e\x2f\x8d\x6f\x52\x7b\x19\xf7\x58\xfb"
- "\x91\x3d\x0b\xcb\x0e\xcb\x9c\x92\xe9\xdb\xde\x6b\xae\x97\xf2\xb7"
- "\x0f\x3c\x7f\x54\xd3\x1b\xbc\xd6\x92\x74\x8a\x6e\x6b\x68\xb6\x4a"
- "\xfe\x36\x08\xc3\xf7\x66\xbf\x1f\xf6\x19\x78\xbf\x49\xa9\xaf\xdb"
- "\x1a\x2e\xff\x7d\x0f\xed\xfb\x9e\x1b\xbf\x5a\xed\x19\xf3\xff\xef"
- "\x1d\xc6\x7d\x12\x7e\xb5\x92\x76\xbb\x0a\x12\xbc\x78\xd7\x09\x9b"
- "\x9d\x9f\xbd\xf4\xbd\x0a\xb1\x2b\xcd\x00\xbb\x44\xde\xd7\xdd\xc8"
- "\xeb\x04\xdf\x83\x9e\x1d\x33\x4d\xf5\xc5\x6d\x72\x4f\x11\xb8\x31"
- "\xdd\x85\xb3\x46\x04\x9a\xca\xfc\xc0\xfb\x7b\x6d\x4d\x35\x7e\xb2"
- "\x7d\x8f\xdb\xff\x3d\xb6\x1f\x84\x1f\xf4\xe7\x6b\x71\x8d\xf0\x1d"
- "\xa9\x0d\x12\xef\x7b\x75\xb9\x6e\x83\xfc\xd9\x49\xad\x39\x2c\x6b"
- "\x64\x78\x1a\x4f\x08\xbd\xfd\x4a\xa7\xdd\x63\xe5\xbe\xc4\xf3\x9d"
- "\x68\xbb\xf9\x1c\xdd\xb6\x4a\xa4\x4c\xb5\x1e\xb1\x13\xed\x86\x1e"
- "\xc1\x58\x23\xd7\xe2\xa1\x97\x18\x26\xc6\xff\x31\xb5\xfa\x3e\xcd"
- "\x16\xbc\xdf\x8a\x77\x18\x7b\x7c\xcd\xf6\x00\x31\xac\x10\xb7\x0f"
- "\xe5\x3f\x09\xfb\x8c\x18\xab\xd1\xe7\xf7\x58\xcb\x8a\xa0\x67\x7a"
- "\xf5\xd6\x6d\x23\xd6\x9f\x15\x01\xbd\x7d\xbc\x17\x0a\xb8\xe0\xff"
- "\x17\xac\xfd\xf2\x7f\x2f\xce\xe9\xff\x7a\x24\x4d\xf5\x59\x18\x74"
- "\x89\xee\xb3\xf4\xa3\xaa\xbf\x6e\x0b\x46\xf7\x57\xfa\x51\xfc\x66"
- "\xe2\xb7\x00\xbf\x42\xed\x39\xf2\x97\x11\x71\x0f\x69\x4d\x3f\xd8"
- "\xe5\x4a\xc7\xf8\x9f\x76\x48\xf5\x03\xa7\xa3\x1d\xcc\x23\x5f\x93"
- "\x89\xd7\xeb\x78\x1f\x94\xd3\x99\x9f\x39\x3d\x0c\x7b\x06\xcf\xb9"
- "\x78\x6f\x61\x59\xdd\x16\xa6\xa8\xf7\x9e\x4d\xe0\xb9\x75\xdd\x8c"
- "\xff\xdb\x72\x8d\x71\x43\x45\x05\xf3\x29\xf2\xcc\x37\x07\x2b\x2a"
- "\x50\x5f\x83\x4e\x57\xa4\x55\xf3\x7b\xe6\x49\xa4\x37\x81\x2e\x72"
- "\x0d\xdd\x8f\xf9\x5e\x7c\x5b\x23\xbd\xbd\xd7\x26\xb3\xa4\xa5\xb3"
- "\x3e\xea\xa0\xb1\x7e\xe8\x2c\xf4\xed\x54\x8b\x1a\x6b\xc6\x5e\xe4"
- "\x67\xe8\xca\x2f\x70\xef\x6b\x46\x2b\xbb\xab\x32\x6d\x3d\x06\x1a"
- "\xd8\x6d\xa0\xec\x60\xd5\x8e\x71\xc1\x94\xb1\xe3\x3c\xed\x07\xa9"
- "\x25\xf8\x2b\xb2\xbd\x20\x61\x7c\xe5\x01\x0f\x38\xd7\x8a\xd0\x07"
- "\xdd\xfb\x8c\x9e\xe0\xf9\x46\x8c\xcd\xb7\x9e\xa1\xb1\x92\x1e\xaf"
- "\x9f\xc2\xa8\xff\x8c\x84\xad\xd1\x67\x87\x69\xeb\x12\x11\xdc\x7a"
- "\x5a\xf8\x61\xdf\x0d\xde\xd2\x4d\xe3\x76\xae\xa3\x8c\xda\x6e\x4a"
- "\xdb\xd3\x4d\xe9\xe2\xef\xe9\x86\x5a\xd8\x6d\xcf\x5c\xb4\x10\x74"
- "\x42\xde\xd0\x22\x32\xed\x59\x47\x92\x47\x42\x95\xb0\xdf\x82\xb0"
- "\xdf\xce\xa7\xb3\x6e\xec\xb5\xdf\x7a\xa4\x5d\x3c\x29\x4d\xf1\xd1"
- "\xa4\xb4\x21\x76\x4a\x48\x5a\x48\x16\xe0\xe7\x3c\x47\x63\xc7\x26"
- "\xb5\xc1\x76\x44\x9b\xbd\x5a\x7b\x71\x9d\x66\xb6\xd3\x40\xd9\x56"
- "\xe8\x6b\x51\x39\xb5\xbf\xfd\x4a\x39\x77\x6c\xbc\xc5\xcf\x72\x83"
- "\x36\xdc\x7e\x3f\xef\xc5\x1e\x1c\x1e\x30\x16\xd7\x8a\x00\xa7\x97"
- "\x8c\x14\x01\xa4\xa7\x73\xdd\x07\x90\xde\xe5\xba\x3d\xd7\x6b\x1c"
- "\xd1\xd1\x1f\x8f\x62\x7e\xa4\xe9\x95\xdb\xff\x28\x0c\xe5\xe0\xd1"
- "\x34\xfb\xfa\x20\x6c\xef\x73\x2c\xb3\xb7\x1f\x9f\x57\x28\x82\xb6"
- "\xe5\xbc\x2f\x7e\x7b\x23\xef\xd9\xf3\x5e\xdd\xfb\xb0\x6d\xbe\x6d"
- "\x9f\x9e\xc7\x0b\x9e\x2b\x98\x0b\x01\xb3\x2a\xcd\x2e\x30\x3f\x8f"
- "\xb6\xe1\x89\xfa\xb3\xe3\xd9\x57\x64\xbb\xf4\x4b\xf9\x7e\x92\x97"
- "\x1e\x2e\x60\xdc\x79\x4f\x96\x75\x27\xec\xad\xeb\x4e\xd3\xf7\x73"
- "\xfc\xa0\x03\xde\x63\xfc\xcf\xc9\xd2\xf6\x55\xa5\xbf\x0b\xd2\x30"
- "\xfe\x3f\x54\xca\x69\x25\x23\xc9\x5a\x62\x13\xed\xfd\xd9\x4c\xd2"
- "\x07\xc5\x40\x37\xa0\x4c\x89\x0e\x07\xe3\xd4\x3f\x77\x1a\x1e\x7b"
- "\x0c\x69\x15\x3a\x1c\xe4\xb9\x1e\xcf\x35\xbd\x79\x54\x99\x7d\x11"
- "\x65\x1e\xeb\x34\xdc\xfe\xcf\x48\x3b\x1c\x53\xe6\x58\x4c\x99\x93"
- "\x11\x65\xca\xb5\x7a\x7c\xd1\x65\xc6\x51\x74\x99\x71\x96\xcb\x71"
- "\x1b\x97\x16\x53\x66\x72\x4c\x99\x99\x97\xe3\x36\x2e\x2f\xa6\x8c"
- "\x3d\xa6\x8c\x23\x82\x96\xec\x0f\x92\x81\xb4\xcd\x31\x65\x6a\x63"
- "\xca\x34\xe8\xcf\xfd\xf9\xfc\x14\xef\x26\x2b\x78\xb3\x9d\xfb\x73"
- "\x3b\xfa\xa7\xf3\xad\x17\xbb\xb4\xb2\xed\x71\xda\x15\x8c\xae\x6f"
- "\x7c\x52\x74\x7d\xe3\x47\x5c\xde\xae\xf1\x19\x31\x65\xb2\x63\xca"
- "\xe4\x46\x94\xa9\x57\xf5\x8c\x2f\x88\x29\x53\x12\x53\x66\xd3\xe5"
- "\x7c\x35\xbe\x26\xa6\xcc\xbe\x98\x32\x87\xbe\x85\x16\x3c\x8e\x2b"
- "\xdf\xac\x61\x6c\x2b\x3f\x00\x1b\x61\xc2\x48\xf6\x39\xe0\xbd\xc9"
- "\x9f\x75\x07\x06\xf0\x7e\x08\x8f\x57\x47\x1c\x01\x8c\x2d\x13\x30"
- "\xff\xb9\xa3\x5c\x1f\xb3\xd8\x1f\x83\x65\x5a\xd9\xd8\xe3\xdb\xfb"
- "\xb3\x45\xb9\x1e\xdd\x57\x8b\xeb\x3a\x32\x82\xc7\xa9\x09\xf3\x7b"
- "\x6d\x62\xe5\xbf\x44\x0a\xce\x84\x5f\xe8\x7b\xa3\x75\xca\xcf\x23"
- "\x81\x6d\xf2\x23\x0e\x59\xa6\x22\xc2\x8e\xe6\xfa\xfd\x07\xd7\x05"
- "\x8c\xd1\x78\x4c\xb0\x5f\x01\x8f\x24\xd8\x46\x15\x2d\xb0\x2c\x78"
- "\xff\xba\xb9\x16\x36\x10\xec\x7e\xc6\xed\x14\x4d\xf0\x49\x9b\x6c"
- "\x79\x37\xf1\xbd\xa7\x74\xaa\xdc\xdf\x56\x36\xe9\xc4\xf4\x26\xd4"
- "\xcf\xb6\x7b\x53\xd1\x05\xea\x94\xe3\x2f\xdb\x6e\x13\x1f\x3b\x52"
- "\xea\x03\x5e\x13\x7b\xfd\x3f\xbc\x34\x71\xbe\xb4\x35\xdc\xcb\xca"
- "\x79\xef\x9d\xf7\x90\x8e\xf8\xb3\x38\x0f\xf8\x7f\xc2\x38\xbd\xbd"
- "\x18\xeb\x21\x63\x13\x82\x57\xa2\x99\xea\xc3\x89\xa5\xd1\x3c\x39"
- "\x00\xbc\x32\xd1\x1d\xdd\xef\x13\xeb\xa3\xfb\x7d\xe2\x81\x68\x9e"
- "\x34\x80\x27\x27\x36\xc5\x94\x39\x11\x53\xa6\x2d\xa2\x8c\x5b\xab"
- "\x27\x10\x5d\x26\xc3\x14\x5d\x26\xc3\x1a\xf1\x8c\x36\x66\xa4\xf7"
- "\xce\x7d\xa4\x6f\x51\x46\x56\xc4\xb3\xa1\x5a\xea\xcf\x8c\xd9\x7a"
- "\x1a\xaf\x1d\xed\x79\x53\xf9\xb6\x68\xf0\xec\x31\xf2\xce\xf9\x4b"
- "\x63\x70\xd8\x1c\x83\x43\xaf\xfc\x6b\xfb\xe9\xbf\x3f\x4d\x99\x25"
- "\xda\x7e\x7a\x07\xc6\xec\x79\xfc\x0c\x58\x35\xc8\x0f\x3a\x64\x1c"
- "\x8b\x81\x77\x32\x06\x5e\x47\xc4\xb3\x05\xcf\xc1\x88\x36\x58\x12"
- "\xad\xd2\x4f\x10\xf6\x5b\x66\xaa\x9e\xce\x73\x4a\xe0\xdb\xee\x94"
- "\x63\x4d\x36\xfb\x6c\xa5\x9c\xa2\x4c\xf6\x69\xd2\x74\x79\x66\xa4"
- "\xfc\x93\x6a\x57\xe6\xfc\x68\x3c\x32\x0b\xa2\xf1\xc8\x2c\x89\x68"
- "\x97\xdf\xbc\x81\x7e\x64\x0e\x3e\xf2\x04\xdb\x3e\xec\x6b\x27\x7d"
- "\xa7\xd6\xc3\x66\xbb\x48\x16\xf6\x59\x3b\x5d\x42\x89\x1e\x47\x3b"
- "\xe6\x72\x93\x6c\xfd\xf2\x53\xca\x32\xb7\xe6\xf7\x67\x03\xfc\x13"
- "\x3a\x3f\x86\xab\x96\xb9\xc3\x95\x59\x6d\x48\x83\xfe\x9b\xb8\x50"
- "\xd9\xb9\x59\x19\xc2\x99\x57\x03\x7a\x62\x5e\x34\xe9\x73\x6d\x1e"
- "\xb1\x97\x7d\xaf\xa0\x7b\xda\x31\xc6\x27\xa9\xbd\xf2\x49\x23\x22"
- "\xf8\xda\x6f\x5b\x77\x9f\x38\x45\x93\xbe\x60\x1b\x80\x65\x94\x7d"
- "\xb8\x8e\x04\x7d\xc4\x73\x6f\x4f\xf0\x8c\xb4\xdd\xf0\xde\xab\x95"
- "\xcd\x8b\x28\xeb\xd3\xe6\xc6\xed\xfc\x6e\x62\x90\x8c\x47\xfc\x3e"
- "\x02\x9c\x54\x65\xef\x4d\xfa\xe2\x08\xe4\x15\x65\x36\xeb\x65\x78"
- "\x1e\xcd\x65\xcc\x25\x64\x9c\x50\x4a\xc6\xc6\x75\xa7\x24\x6c\xdd"
- "\x97\x02\xb6\x74\x87\xa7\xb4\x9d\x3c\xfe\x56\x5e\xeb\x32\x2a\x1f"
- "\x98\x49\xde\xc4\x00\x99\x3a\x2b\x97\x95\x7b\x71\x1f\xaa\x5c\x86"
- "\xb9\xf6\x32\xc8\xcf\x24\x23\xeb\x9b\x48\xda\xcd\x9a\x95\xfb\xc8"
- "\xbc\x39\xe3\x7f\xfc\xc8\x43\xf3\x67\x4d\xb5\xcd\x5f\xba\x6c\x71"
- "\xc1\xf8\x15\xab\x4a\x6c\x6b\x56\x2e\x2d\x59\xba\xfc\x79\x5b\x86"
- "\x63\x8c\xc3\xb6\xa8\x44\x5d\xd3\x0b\x17\x15\x97\x4c\xe7\xdb\x71"
- "\xb6\xa2\x95\x8b\x57\xcb\xdb\xb1\x83\x29\x1a\xc8\xd2\x92\xc5\x2b"
- "\x6d\x63\x0a\xc6\xd9\x1e\x5c\xb4\xb4\x70\xd5\xca\xc5\x71\x61\x4d"
- "\xb5\xad\x5c\xbc\x72\xf1\xa2\x02\xdb\x74\x5b\x06\x43\x8e\x04\x17"
- "\xd1\x9f\x19\xfa\x38\xc6\xe3\xd7\x36\x97\x38\xae\x8d\x67\x5e\xc5"
- "\x3f\x77\x1c\xbc\x7c\x2c\xbb\xe3\x68\x34\xcf\xdd\xd1\x1a\xcd\x73"
- "\x77\xb4\x5f\x3e\x96\xdd\x11\x33\xfe\x4d\x8e\x19\xff\x26\x8f\xb8"
- "\x7c\x2c\x9b\x1c\x33\xfe\x4d\x8e\x19\xff\x26\xf7\x8e\x7f\xe0\x25"
- "\xe9\x9f\x86\xb4\x98\xf1\x6f\x72\xcc\xf8\x37\x79\x53\xcc\x73\x75"
- "\xc4\xf3\x75\x78\xde\x1b\x39\x3e\xe2\xf9\xa0\x2e\x9f\x7d\xfa\x65"
- "\xf2\x51\x3d\x0f\xeb\x7a\xe8\xe6\x36\x2d\xaf\x37\x22\x6f\xbb\x96"
- "\xd7\xdf\x2b\x7f\xe0\x23\xf6\x75\x53\xf3\xf5\x3b\x9f\x60\x9d\xce"
- "\x7e\x6e\x3c\x36\x41\x3e\x6e\x3d\x47\x93\xff\xc8\xb0\x98\x87\xd9"
- "\xef\x51\xbc\xf5\x54\x57\x5d\x0a\x99\xb8\x4c\x5d\x15\x19\x85\x6b"
- "\x52\x07\xae\x84\xb4\x24\xfc\xa0\x53\xee\x84\xfd\x7b\xf3\x61\x35"
- "\x5e\xdc\x59\x2f\x6d\x7e\x94\xd1\xe0\xcb\x79\x0d\xe0\x58\x51\xc6"
- "\xb4\x4d\x8d\xc5\x6d\xb8\x4f\x62\x9e\x46\x79\xa3\x30\xdc\x91\x89"
- "\x2b\x21\xcd\x82\x5f\x2a\xe0\xd5\xeb\xf0\x36\x0d\x8b\x6f\x5b\xc6"
- "\xda\xb9\xbd\xf3\x41\x03\x99\xb7\xb9\xc2\xad\x9e\x30\xdb\xd6\x77"
- "\x9e\x50\x6b\x0b\x99\xd9\xc2\xf5\x59\x5e\x1d\xd2\xe3\xcf\x93\xee"
- "\x82\xfd\x77\xe7\x51\xb5\xde\x72\x17\xfa\xff\x61\xbf\x5a\x3b\xcd"
- "\xcc\x86\xbe\xed\x3e\x4d\x77\x7d\x84\x6b\x0f\xae\x3b\x74\xf8\x8d"
- "\x72\xbe\x7d\xd7\x64\xe1\x4a\x78\x94\xe1\xc6\xa4\xcf\x86\x7e\xeb"
- "\x36\x07\xcb\xf3\xe2\xbc\xb3\x0b\x57\xe2\x23\x71\xd2\xcb\x61\x33"
- "\x74\x7b\xe9\xae\x83\x8c\x6f\x44\x7a\x8d\x70\x0d\x9d\xcf\xf9\xbd"
- "\x5c\x1f\xca\xf4\x67\x6b\xeb\x7e\xad\xca\x0f\xfd\xae\xb6\x98\x76"
- "\x7c\x73\x9a\xa6\x2c\x52\xed\x98\xf2\x49\x4c\xdd\xc1\xf8\xed\x98"
- "\x92\x8a\x76\x7c\x13\xbf\x1d\x53\x32\x24\x6d\x0d\x68\x8b\xe1\xb2"
- "\x77\xb3\xd1\x96\x6f\x24\xdd\xa3\xd3\x0b\x34\x5b\x88\xe7\x64\x16"
- "\xbc\x93\x65\x1f\x2d\xed\xeb\x37\x2d\xdf\x66\x73\x0d\xe5\xc6\xa9"
- "\x73\xaf\x70\x0d\x7c\xd4\x4b\x53\x4e\x4a\x38\x7d\xe9\x87\x15\x2e"
- "\xa0\x93\x41\xd2\x89\xe5\xc1\xdc\x5f\x7f\xeb\xf3\x12\xb5\x16\x92"
- "\x05\xf9\xbf\xab\x51\x5f\xcb\x2c\x2e\x15\x3e\x9d\x8e\x78\x97\x1e"
- "\xf3\x2e\x10\xf1\x6e\x66\xd4\xbb\xf5\xbd\xe9\x0b\xf4\xf4\xef\xd6"
- "\x4f\x59\x9b\x63\xfa\x09\xfd\x73\xf7\xcd\xd1\xed\xce\xaa\x55\xed"
- "\x43\x1f\x5d\x46\xeb\xac\x43\xe8\xa3\x9e\xf8\x7d\x94\x75\x22\x3e"
- "\xaf\x65\xc9\x75\x34\x91\x42\x71\xe0\xdd\xcd\x73\xec\x1e\xc9\x83"
- "\x5a\x3f\x5d\xde\x3f\x77\x8f\xd3\xfb\xe7\xbb\xb5\xf1\xee\xa2\x98"
- "\x36\x86\x00\xe3\xac\x6a\xeb\xd4\xe9\x31\xb0\x2b\xe2\xf3\xe2\xdd"
- "\xf5\x68\x67\x28\x7e\x3b\xef\x3e\xdc\x3f\x2f\xde\xdd\x8a\xf6\x84"
- "\x2e\xe7\xc5\xbb\x7d\xaa\x0c\xc5\x29\x33\x35\x49\xb8\xe2\xd5\x33"
- "\x35\xcd\x19\x64\x3b\x77\xea\x02\x5e\x5f\x8a\x48\x9f\x16\xcd\x7f"
- "\x68\x03\x97\x63\xfa\x05\x95\x9e\xe5\x7e\x38\x6d\x23\xc3\xb7\xf1"
- "\x64\x97\x6b\x6a\x6d\x0c\xad\xce\x9f\xa6\x7b\x6e\xee\x34\x24\xec"
- "\x55\xf4\xba\xe7\x8b\x18\x9c\x0e\xc5\xa7\xd7\xd4\xe3\xa0\xd7\xf9"
- "\xf8\xf4\x9a\xda\xd1\x3f\xbd\xee\xe1\xfe\x3f\x7f\x39\xbd\xee\xb1"
- "\x45\xd2\x0b\xb6\xae\x6c\xdf\x68\x2b\x78\xa3\x27\x5f\xd4\x71\x5b"
- "\x43\x64\x31\x83\x57\x54\x99\x0e\x2e\x33\xdf\x1c\x50\x7c\x02\x1b"
- "\xd2\x74\x8e\xee\x99\xa6\xcb\xff\xd0\x1a\x1a\x28\x7a\x9e\x62\x3f"
- "\xa2\x04\x2e\xe7\x71\x9c\x6f\xf4\x04\x33\x88\xe7\x1f\x31\xf5\xd6"
- "\xc4\xd7\x05\xf7\x1c\x00\x4d\xab\xe2\xa4\x1f\x55\xfe\x65\xd3\x28"
- "\x5a\x47\xdc\xe3\x8d\xee\xa3\xa9\xbc\x76\x6a\xd6\xb6\x9d\xbe\xf5"
- "\x77\xe5\x3e\x9b\x96\x7b\x79\x9f\x4d\xfb\x5a\xf5\xd7\xb4\x3f\x46"
- "\xe3\x37\xcd\x1e\xbf\xbf\xa6\x95\xf7\xdf\x5f\xd3\x6a\xfb\xef\xaf"
- "\x69\x87\xb8\xbf\xd0\x5e\x5f\xf4\xb8\x31\xed\x78\x74\x7b\x51\x2f"
- "\xca\x09\xc3\x35\xd7\xf1\xf3\x77\x6d\xb7\xfe\x63\x1d\xc7\x7d\x55"
- "\x57\x46\xe0\xe5\x84\x91\x8c\xe3\xd5\xc2\xe8\x17\x36\x68\xe8\x5e"
- "\x17\x7f\xbf\x95\xe7\xb8\x2d\x35\x44\xbc\x8f\x6c\xbb\x85\x6d\xf7"
- "\xe9\x7f\x08\x1b\xa8\x15\xf7\x86\xd3\x74\x5f\x65\xd8\x60\x28\xe5"
- "\x3d\x4f\xe9\x17\x2e\xd7\x10\xa6\x9f\x8c\xec\x0b\xde\xfb\xe4\xb9"
- "\xe9\x56\x35\x77\xfa\xdb\x69\xba\x77\xb1\xea\x97\xfb\x5e\x8a\xa6"
- "\xe3\xbd\x14\xbf\x5f\xee\xb5\xa2\x5f\xfe\x16\xbf\x5f\xee\x9d\xdc"
- "\x7f\xbf\xdc\x9b\x8b\x7e\xf9\xdb\xe5\x72\x74\xaf\x5d\x93\xa3\x8d"
- "\x5c\xc6\xb6\x9c\xe7\xe3\xf7\xfe\x99\xf3\xe0\x1e\x32\x72\x2f\x1f"
- "\x29\x4f\x18\xdf\xa1\xcb\x91\x2c\x53\x0b\x58\xb2\x7e\x2d\x4f\x8d"
- "\x06\x23\x12\x6e\xa3\xb9\x23\x9e\x9c\xdc\x2b\xfb\x69\x42\x11\xf1"
- "\x5e\x7c\xde\x6e\x86\xb1\x92\xe8\x1c\xdd\x37\x9e\xf3\x71\xfa\x04"
- "\x7f\xa4\x9c\xdc\xd7\x9b\x8f\x75\x9d\x96\x97\x44\x97\x9d\x38\x5f"
- "\x34\xec\xfb\xb4\xf6\x0f\x94\xe3\x08\xe7\xe7\x7c\x31\x79\xf2\x94"
- "\x3c\xde\x57\x1b\x2d\x8f\xf7\x15\x45\xf3\xe7\xbd\xb2\x5c\x18\x7a"
- "\xce\x4b\xd3\x9b\x80\xc3\x77\xe6\xaf\x2b\xcb\xe6\x7d\x1d\x31\xb2"
- "\x09\x1e\xc8\xde\xa2\x78\x20\x7b\x59\x34\xae\xd9\xc6\xf8\x3c\x90"
- "\x3d\xa2\x7f\x1e\xc8\xce\xea\x9f\x07\xb2\xe7\x33\x0f\x78\x29\x7b"
- "\x73\xb4\x6c\x66\x17\x46\xb7\x1d\xf5\x4a\xd9\xa4\xe4\xab\x91\x4d"
- "\xd8\x42\xd7\xf5\x27\x87\x2c\x53\xec\x3f\x52\xd7\xad\xef\x75\x7c"
- "\x27\x9a\x99\x20\x57\xc0\xef\x7e\x1b\xaf\x29\x41\xc7\x67\x31\x0d"
- "\xf7\xc8\xb3\x87\xf7\x4f\x8e\xa4\xe3\x56\x75\x3e\xce\x89\xbc\x1f"
- "\xf3\xbe\xb2\xa2\xe7\x03\x1b\xa2\xdb\x7f\xff\xfc\xf8\xf4\xbc\xbf"
- "\x10\xf4\x74\xc6\xa7\xe7\xfd\x15\xfd\xd3\xf3\xfe\xbd\x7c\xf6\xe8"
- "\x72\x99\xba\xff\xb0\x6d\xb5\xb4\x51\x64\x99\x73\xf4\xc0\xf5\xdf"
- "\x6d\x7c\xba\xdf\x1f\x3d\x3e\xdd\x7f\xf2\xea\xc7\xa7\x07\xb2\xe2"
- "\x8f\x4f\x0f\xe4\xc6\x1f\x9f\x1e\xb0\x2b\x79\x78\xa0\x3e\x5a\x1e"
- "\x1e\x28\x8f\xe6\x09\xd0\xee\x7f\x6c\x7c\x7a\xc0\x17\x23\x03\xdb"
- "\x4e\xd3\x8c\x97\x60\x53\x94\xab\x7e\x9b\x79\x67\x34\x8e\x33\x92"
- "\xe2\xf7\xdb\x8c\x34\xf4\xdb\xb6\xf8\xfd\x36\x23\xbb\xff\x7e\x9b"
- "\xc1\x7b\xd0\xdb\x2e\xef\xb7\x19\x25\x57\x6f\x53\xcc\xd8\x17\xdd"
- "\x67\x33\xdc\x57\xdf\x67\x33\x3a\xe2\xf7\xd9\x4c\x63\xfc\x3e\x9b"
- "\x39\x42\xf5\xd9\xcc\xf9\xd1\x7d\x36\x73\x72\x74\x9f\x81\x6e\xff"
- "\xcd\x3e\x43\xff\xcc\x54\xfe\x09\x33\x3f\xc2\xbc\x7d\x60\x97\x6b"
- "\x66\x83\x97\x66\x95\xa8\xb9\xf5\x2c\x35\x76\xa8\x3e\xfc\x00\x79"
- "\xea\x2f\x1f\x07\x66\x1e\xd5\xd2\x7e\x7c\x79\x3f\xcc\x6c\x83\x8e"
- "\xee\x68\x2a\x95\x7b\x5b\xaa\x0f\x99\xe6\xc8\xd7\xb8\x8e\xf7\xa7"
- "\x66\xf1\x66\x51\x02\xfa\x58\x78\x02\x41\x62\xbd\x8e\xfc\x7e\x86"
- "\xc3\x67\x2e\xa3\x61\xcd\xca\xb8\x9a\x31\xfe\x0a\x3e\x35\x33\x1b"
- "\xcb\x26\x01\xde\x83\xb3\x14\xaf\xce\x8a\xb5\x7f\xeb\xf0\xee\x46"
- "\xc5\xa7\x3f\xf8\x32\x06\x87\x83\xf1\xf9\x74\xd6\x31\xb4\xa1\x2e"
- "\x3e\x9f\xce\x6a\xef\x9f\x4f\x1f\x44\xff\x53\x5d\xc4\xdc\x27\xe5"
- "\x99\xa0\x37\x66\xee\xf3\x60\xba\xd9\xaf\x78\x47\xda\x44\x95\x99"
- "\x33\xbb\x5c\x0f\xc6\xda\x7f\xe8\x9b\x07\x9b\x35\x9c\xff\x10\x53"
- "\xbe\x1f\xfb\xef\x41\xb6\xff\x3e\x88\x8f\xf3\x83\x57\xb0\xff\x1e"
- "\x64\xfb\xef\x83\xcb\x65\xeb\x41\xcd\xfe\x8b\x37\xc7\x7b\xb0\x23"
- "\x7e\xff\xff\x20\xa6\xff\x29\xaf\x04\xf3\x61\x59\x3e\x3a\xdf\xb8"
- "\xc8\x7c\xec\x9b\xc4\x79\x99\x47\xe2\xe4\xcd\x8b\x85\xd9\x4f\xbe"
- "\xf2\xcb\x78\x8f\x7d\xa9\xe2\xf2\xde\x0f\x1a\x94\x3c\xe6\x18\xa3"
- "\xe5\xf1\x07\x4d\xd1\xf2\xf8\xa0\x3d\xa6\x5c\x5b\xf4\x7b\xf0\xcf"
- "\xff\x98\x8e\xcd\x99\x1f\xc3\x03\x9f\x9d\xa6\x9c\x3f\x2a\x1e\x78"
- "\x68\x6c\x34\x1e\x39\x85\xf1\x79\x20\x67\x13\xda\xff\x59\x7c\x1e"
- "\xc8\xa9\xef\x9f\x07\x72\x0e\x83\x96\x9f\x45\xf2\xed\xa3\xa5\xd9"
- "\x03\x63\xf2\x78\xe3\xeb\xbc\x9c\x40\xfc\x35\x82\x87\x2c\x8a\xc6"
- "\x0f\xe5\x44\xd3\xf8\xa1\xf4\x68\x1a\xa2\x2d\xff\x7d\x1a\xf6\xc6"
- "\x3e\xe8\x72\x3d\x14\x2b\xff\x9e\xd3\xf4\x43\x4d\xfe\x1f\x4e\x8e"
- "\xc1\xf1\xa0\xc2\x25\xde\xba\xc8\x43\x3c\xff\xf5\xc4\xa7\xe5\x43"
- "\x1d\xf1\xdb\xfc\x43\x23\xc6\x20\x4f\xf8\x32\x59\xfa\xe1\x08\xa4"
- "\x3f\xca\xeb\xa1\xbc\x1e\xb2\x07\xe9\x8f\x06\xc9\x24\xc7\xab\xde"
- "\x71\xe9\x87\xd9\xec\x8b\xc2\xf4\x67\xfe\x35\x8f\xa0\x5c\x1e\x83"
- "\x18\xaf\xfc\x52\xe9\xb7\x60\xde\xc4\xbc\x3e\x8a\x79\xfd\x87\xd2"
- "\xfe\xe3\x7d\x16\xf6\x23\x34\x3b\x28\xd7\xe3\x0f\x92\xce\xef\x9c"
- "\x3f\x06\x76\x2d\xcb\x05\xe7\xd7\xf3\xaa\x75\xb3\xf2\x18\xdd\xf4"
- "\xc3\xa6\xf8\x7d\xfc\xc3\x93\xfd\xf3\xce\x0f\x03\xaa\x9f\x1f\x1e"
- "\x17\xdd\xcf\x0f\x5b\xc2\xae\xa1\xf3\xb9\xad\xe0\x81\xab\x92\x93"
- "\x12\x9b\xf0\xf5\xab\xef\x37\x3e\xd5\x5a\x54\x46\xb7\x9c\xa1\x87"
- "\xab\x65\x7d\x06\x11\x30\x6f\x48\xa0\x26\xa9\x03\x1e\xfe\x4a\xe2"
- "\x89\x3c\xf9\x41\x32\x88\x8d\x2f\xb6\xf2\xbb\x3a\x97\x08\x20\xdf"
- "\x71\xde\x13\xe0\x33\xcb\xe0\x85\xeb\x4e\xd1\xc3\xef\x45\x95\x87"
- "\x26\xf0\x28\x18\xed\x75\x52\x1e\x1f\x6e\xd3\xd7\x74\x37\xe1\x39"
- "\xfe\xba\xef\x6c\x93\xee\xfb\xa0\x7c\xc6\x1e\xee\x77\xff\x92\x71"
- "\xe2\xb3\x32\x8c\xd3\x95\xf5\xc0\xec\x05\x3a\xff\x2a\x5f\xcb\xd9"
- "\x85\x7d\xbe\x7c\xb3\x1d\x5e\x9a\x6d\xbb\xc2\xda\x60\x84\x1c\xcc"
- "\xde\x1b\x09\x47\xc5\xff\x98\x7d\x48\xf7\xc7\xc3\x7d\xd3\xb7\xc0"
- "\xd2\xf1\xe9\x88\xc1\x07\x76\xc4\x03\x27\x14\x8c\x39\xa6\x2b\xc1"
- "\xe0\x3e\x57\x3c\xcb\xfc\x30\xc7\x76\xa5\x35\xbf\x44\x2b\xe5\x6e"
- "\xbf\x8c\xb7\xe6\x48\x7b\x89\x61\x5c\x19\xc7\x39\xee\xa8\xb9\x85"
- "\xdc\xbb\xe7\xbd\xad\xb9\x4f\x2b\xb9\x9f\x1b\xb3\x46\x38\xa7\x41"
- "\xfa\x53\x69\x72\xff\x4c\x30\x56\x0e\xe6\x1c\xd3\xc7\xe8\x98\xf4"
- "\x36\x5d\xee\x31\xaf\x65\xb8\x31\xeb\xac\x73\x8d\x4a\x16\xe6\x2e"
- "\x08\x27\x47\xce\xd7\xe6\x4a\xfb\x4f\x5f\x2f\xc5\x7b\x63\x4c\xb9"
- "\x98\xf5\xbf\x39\x0d\xa2\xff\x75\xfa\x24\xf4\xaf\x9f\xf7\xb6\x54"
- "\x0c\x84\xb9\x9b\x63\xd6\x2b\x7c\x5b\xe5\xf9\xf6\xbf\x00\xee\x3c"
- "\x4d\xef\xe5\xc6\xd8\x78\x73\x1b\x9c\x67\xaf\xd4\xfe\xb9\xfd\xb4"
- "\x7f\x6e\x5f\xfb\x97\x33\xdc\x79\x31\x6b\x89\xf3\x64\xfb\x43\x97"
- "\xe9\xbf\x79\x23\xa0\xbf\x74\xba\xc1\xe6\x9e\xb7\x4a\xb7\xd5\x79"
- "\xfd\xa0\x7f\x5b\x7d\x5e\xdf\xfa\x9f\x2a\xd7\xb7\xfe\xe7\x8b\x67"
- "\xab\x7b\x49\xee\xad\x46\xd7\x5d\x63\xae\x8d\xd7\x96\x79\xfd\xac"
- "\xff\xcd\xd3\xd6\xff\x72\x6d\xd1\xfa\x6c\x9e\x37\xba\x0f\xe7\xc5"
- "\xf4\x61\x2e\x45\xf7\xe1\xdc\x86\xff\xea\xb8\xc6\x80\x12\x13\x13"
- "\x0d\x89\x09\x86\x84\x44\xbc\x46\x13\x69\x60\xa2\x31\x71\x00\x7e"
- "\xd7\x68\xd7\x81\x86\x44\x83\x11\xbf\x01\xda\xf5\x9a\x98\xe7\x81"
- "\x5c\x16\x3f\xa3\x76\x1d\x10\xf3\x7c\xcd\xb7\xbc\x1f\xa8\xd5\xab"
- "\xd7\x6f\x8c\x79\x1e\xf0\x2d\xef\xaf\xf9\x6f\x96\xa7\xcb\x9e\xa3"
- "\xfd\xd0\x1e\x5a\xbe\x7a\x51\xe1\xd2\x02\xb9\x5f\xbc\xd8\xb6\xe8"
- "\xb9\xe7\x16\x17\x17\xdb\x4a\x56\xd8\x1e\xb8\xff\x91\x49\x53\x6d"
- "\x6a\xdb\xb9\x70\xfa\x98\x82\xc1\x34\x67\xcd\x4a\x7e\x31\xe7\xd1"
- "\x87\xf2\x6c\xb9\x0f\xdc\x1f\xfd\x52\x07\x23\xb7\x97\xaf\x04\x25"
- "\x42\xfe\xb2\x5f\x1b\x46\xb4\xf9\x4d\xa9\x7b\xda\xd8\xcf\x57\xad"
- "\x79\x3c\xbe\xe1\x18\xfb\x8f\x76\x3b\x45\xe3\x28\xde\xd3\x7f\x64"
- "\x0c\x37\x62\x7c\x7d\x39\x15\x3d\xcb\xe7\x57\x1e\xb9\x5f\x7c\xea"
- "\x23\xdb\x0f\xc9\x70\x8a\x9e\xaa\x6c\x82\x55\xc4\xcf\x1e\x6f\x90"
- "\x6c\x4e\x32\xa1\x7c\x26\xde\x25\x88\x7b\xc3\x48\xf3\x6b\xbe\xd0"
- "\x8f\xdd\x2f\xd3\x3e\x2d\xd7\xf3\x99\x4f\xd3\x23\x5f\x8a\x4f\x85"
- "\x7c\xe6\xf3\x41\x2a\xdf\x23\x1f\x0b\xc3\x8f\x1c\xac\x1b\x6a\x53"
- "\xc8\xc8\x7b\xa1\x3b\x52\xc8\xb4\x63\x18\xc7\x02\x79\xa4\x41\xdf"
- "\x0b\x7d\x0d\xcf\x5e\x7a\xca\xcd\x75\x73\xde\xb0\xe1\x47\xef\x70"
- "\xfe\x3d\xd1\xf9\x4f\xf6\xed\xc5\x3e\xd2\x60\x40\xbe\x79\x5f\x90"
- "\xd9\x1c\x12\x5f\x07\x52\xc6\xda\x26\xe4\x50\x82\x07\x5d\x71\x2c"
- "\x58\x4e\xca\xe7\xe7\xd1\x31\x6b\x43\x22\xc8\xfe\xe9\x73\x3a\x9c"
- "\x62\xdb\x32\x32\x42\xa6\x13\x1a\x57\xb2\x8f\xc2\xa3\x49\x75\x8b"
- "\xc9\x88\xf6\x8f\x38\x43\xf3\xa7\xd9\xe6\x12\x39\xe7\x90\xf1\xdf"
- "\x1c\xec\x6f\x98\xf9\xe9\xd6\x3f\x91\x71\x7f\x77\xb9\xa1\x5b\x58"
- "\xa9\xb4\x44\xb4\x0b\x8e\x0f\xe4\x17\x01\xf6\xf1\x3f\xb6\x30\xc4"
- "\x79\xde\xef\x72\x5a\xa9\xa5\xc4\x4f\xeb\x4f\x8a\x40\xc5\x9f\xd4"
- "\xd9\x80\xe6\x0e\x3f\xfb\x2f\x9a\xd6\xcf\xa1\xc4\xd3\x79\x64\x68"
- "\xb6\xd7\x90\x67\x81\x9f\x4a\x4f\x8a\xf6\x63\x0b\xbf\xa4\x16\xfb"
- "\x01\xca\x6f\x25\xc3\xb1\xb6\xbf\x92\x8c\x71\x53\xb5\xc3\x56\x76"
- "\x91\xac\xeb\x97\x72\xda\x45\x5a\xb7\x9e\x86\xac\xfb\x9c\xcc\x9e"
- "\xf6\x56\xd4\x73\x96\x9e\x3c\x41\x09\x80\x67\x78\xf9\xaf\x64\x7d"
- "\xf9\x09\xf6\xf3\xcd\xa6\xda\x32\xb2\x0a\x67\x7a\x52\xb7\x33\xdd"
- "\xd2\x2d\xd2\x53\xba\x9c\xe9\xa9\x2d\x45\xc8\xdf\xf6\x09\x0d\x6d"
- "\xa5\xd4\x4f\xcf\xb4\x1a\x6a\x2e\xd0\x08\x6e\xd3\x69\xb4\xad\xf6"
- "\x02\xf2\x57\x2d\x3f\x1e\x46\xd9\xc8\x32\xc1\xe4\xe5\xed\x9e\xbc"
- "\x00\x85\x01\xab\xa6\x9b\x46\xd4\x76\x93\x35\x5c\xb9\xfc\x38\x97"
- "\xeb\xa0\xc7\xee\xf6\x1c\x23\x2a\x5d\x2f\x42\x3d\x55\x99\x36\xe8"
- "\xc4\x81\x1f\x3c\x7b\xc8\xe8\x39\xd6\x41\xcd\xfe\x6e\x6a\xa1\xbf"
- "\x90\xc7\xf1\xf7\xc6\xfd\xcf\x1e\x1a\x10\x86\x10\x34\xae\x6b\x43"
- "\x5d\x8a\x77\x9c\xcd\x7c\x56\xb9\x9c\xb6\x95\x51\x52\xd1\x3a\x1a"
- "\x78\x06\xe9\x6a\x6e\x9f\x96\xee\x09\xfe\xbd\x71\x9d\xf4\xc7\x7d"
- "\xca\x5d\xd6\x4c\x89\x2d\xfe\x1a\xf6\xfb\x34\x84\x52\x76\xd8\x3c"
- "\xfe\xe3\xe4\x29\xfa\x5b\x63\xd8\xb2\xc3\xb4\x39\x4c\xa6\xf7\x2e"
- "\x1d\x37\x78\x8c\x97\xc8\x93\xe7\xa7\xcf\x50\xb7\xa8\xda\x31\x0e"
- "\x7a\x2b\xbb\xc5\x1f\xe0\xf3\x4e\x19\xa2\xd3\x3a\x78\xdb\x4a\x1a"
- "\xb7\xe7\x02\xa5\xed\xbe\x40\xe9\xa2\x2b\xdd\xc0\x3e\xb6\x7c\x36"
- "\x75\x37\xae\x49\x6d\x64\x42\xdb\x95\x3f\x76\xb2\xe6\x6b\xdb\x93"
- "\x4e\x75\xdd\x7d\xbe\xb6\xdd\x9d\x7d\xbe\xb6\xe0\xa9\x03\xec\x6f"
- "\xeb\xa5\xf9\x33\xcd\xc7\x68\x20\xe4\xc4\xce\xfc\xbd\xed\x1c\x19"
- "\x37\x9e\x23\x9a\x50\x6e\x20\xdb\x12\x3e\x67\xf1\xf8\x18\x0f\xfa"
- "\x86\xef\x4f\xd1\x63\x27\x71\x4d\xc2\x2f\x01\x32\xf1\x47\x6e\x67"
- "\x9b\xc6\xc7\x48\x33\x20\xed\x0f\xb8\x26\xe2\xfa\x89\xb3\x56\xf8"
- "\x50\x97\xa3\xd3\x40\x83\x99\x9f\x35\xff\x5e\x47\x97\xeb\xb1\x83"
- "\x5e\x7a\x31\x4d\xe7\x6b\xa5\xe3\x1f\x39\xf0\xd9\xa9\xb3\x1c\x87"
- "\xca\x27\xf1\xea\xb1\x27\x70\x4c\x2a\x2d\x9d\x71\xb8\x99\xeb\x3d"
- "\x45\x8f\x73\x3d\x66\xfc\x20\xa7\x8f\x55\xeb\x65\x3b\x7b\xec\xa8"
- "\xf3\xf1\xeb\x91\x2e\xf4\x74\xb4\xdb\xc8\xef\x3e\x3c\x75\xd6\xa0"
- "\xf2\xa4\x1b\x00\x33\xa0\xc1\x87\xec\x3f\x32\x9f\x65\xbc\xd3\x60"
- "\x16\x47\x16\x4e\xa6\xda\x37\xc5\xb1\xdd\x6f\x8a\x26\x25\x7b\x8f"
- "\xe7\x79\xa9\xd0\xce\x38\x62\x1c\x6f\xda\x8c\x77\x47\x30\x0a\x31"
- "\x5d\x9a\x0a\xd8\x9f\xec\x71\xd8\x7f\xd7\x46\xb5\x41\xb8\x72\xf3"
- "\x78\x2c\x7d\xbf\xec\xe8\x00\xe8\x80\xbc\x96\xb6\x0e\xda\xdf\xdd"
- "\x3e\xc0\xf9\xaf\x64\xf0\x04\x4f\xd1\xc4\x54\xb2\xb2\x3d\x58\xf7"
- "\xa6\xf0\xe2\xda\xce\xfe\x9d\xe0\x97\x9b\xcf\xd0\xe3\x7f\xf8\x7e"
- "\x2a\xa5\xfe\xbb\x83\x34\xfd\xf4\xf8\x5f\x23\xf4\xd3\xe2\x66\xef"
- "\xa1\x08\xdd\xf4\xd4\xf5\x97\xeb\xa6\x27\x93\x95\x6e\x82\xec\x4b"
- "\x5d\x14\xf2\xaa\xf4\x27\x42\x31\xe9\x9a\x9f\xc8\x13\x5f\xc4\xa4"
- "\x07\xb4\xf4\xe6\x98\x74\x9f\x96\x3e\x44\xd7\x7d\x2d\x8c\xc7\x1a"
- "\xd6\x7d\x79\x5f\xb3\xee\x6b\x59\xa8\xe9\x3e\xa9\x7f\xf2\x3e\x17"
- "\xef\x40\x17\xad\x66\x7d\x93\xf7\x1e\xe3\x2f\x3e\x25\x1d\xf7\x41"
- "\x48\x5b\xc6\x69\xee\xbf\x90\x11\x3f\x5d\xef\x7d\xc6\x7a\x8f\x75"
- "\x1e\xeb\xbe\x5d\xc3\x44\xeb\xae\x37\xc5\x89\x5a\x19\x5b\xe7\xc7"
- "\xbd\xfa\xef\x75\xa4\x6d\x46\xda\xeb\x78\xcf\x7a\x90\x69\xd2\x9c"
- "\x77\x88\x63\x62\xb4\xc1\xd6\x3a\x1c\x36\x64\xd0\x56\xf4\x37\x9f"
- "\x37\xdc\x04\xfa\x9a\x13\xa8\xc8\x53\xc2\x67\x58\x43\xec\x93\xd6"
- "\xd6\x52\xd2\xc6\x72\x37\x6c\x23\xe4\xcc\xe3\xf8\x92\xca\xfc\xe2"
- "\x0c\x9f\xbb\x63\x1c\xf2\xd7\xfe\x90\xe3\x11\x25\x34\xd9\x89\xd8"
- "\x2f\x9c\x75\x36\x70\x31\xba\x81\x93\x8a\xa1\x92\x57\xe0\xa5\xfa"
- "\x06\xd5\xd7\x4f\xb9\x39\xde\xd9\x29\xfa\xf1\x3e\xcc\xf7\x02\xdc"
- "\x36\x73\xa8\x9c\xf8\x1c\x0c\x64\x8c\xcf\x2f\xda\x77\x19\xc2\x76"
- "\xb7\x7e\x16\x86\x63\xdf\x21\x8f\xa7\x35\x40\x8c\xb3\x97\x7e\xec"
- "\x6f\x2e\x3d\xc4\xe5\x6b\x98\x36\xc2\xe5\xd4\x61\x24\x48\x18\x06"
- "\x39\x6f\xb4\x7b\x29\x4f\xad\x9d\xa7\x64\xda\x9a\x17\xf8\x88\xf5"
- "\xbe\xa7\x1d\x30\x4a\x4f\x29\x18\x80\x25\x30\x06\x44\xbd\xd3\xe0"
- "\x0f\x59\x2f\xbe\x06\xfc\x02\xee\x2f\x3e\x17\xc9\xfb\x6d\xa0\x4b"
- "\x12\xfb\xca\x2b\x5b\xf4\xc7\x67\xeb\xfe\x42\xa4\x9d\xed\x04\xbf"
- "\xfd\xb8\x83\xcf\x2d\xf1\x79\xce\x2b\x9d\xe5\x04\x8d\xd2\xf4\xf3"
- "\x9c\xe1\x35\xff\xb3\x67\x39\x01\xdb\xba\xc7\x20\x0e\x00\xff\x0e"
- "\x3e\xcf\x09\xfc\x67\x33\x1f\x6a\x6d\xf2\xbd\xf1\xa4\xa4\xf9\x64"
- "\x4e\xc3\xdc\xf1\xa8\xde\xff\xdc\x5e\x6e\x0b\xde\x59\x95\x8d\x28"
- "\x8e\x7b\xe9\x09\x1f\xbf\x47\x9a\x91\xf3\x4f\x84\x1e\xf3\x60\x0c"
- "\xfb\xe0\x54\xc8\xb0\x6d\x1d\x19\x95\x4e\x7b\x6a\x10\x97\x57\x3a"
- "\xed\xc9\xc6\x3e\x9d\xf6\xe4\x47\x4a\xa7\x29\x1a\x2b\x9d\xf6\xe4"
- "\x2f\x94\x4e\x7b\xf2\x6d\xb9\x2f\x06\x9d\xc6\xef\x58\xaf\xe9\x3a"
- "\x6d\xf7\x30\x71\x94\x75\x47\x97\xeb\x49\xb7\xae\xdb\xb6\x20\x8d"
- "\x75\x07\xe3\xa8\xf4\x54\x5e\xbb\xf8\xff\xd2\x49\xf9\x1d\xf0\xbd"
- "\x9d\xcf\x2f\xb4\x6b\xf7\x3c\x9e\x24\x28\x1d\xf7\x64\x5b\x9f\x8e"
- "\x7b\xd2\xde\x57\x96\x75\xdc\x93\xdf\x28\x1d\xa7\xd2\xeb\x9e\x64"
- "\x1d\x97\xd7\xce\x34\xd0\xe0\x1b\x78\x0d\x4f\xcb\x0f\x3a\x3e\xee"
- "\x8b\xd4\x71\xd1\xf2\xf5\xd4\x34\x5d\xc7\xb1\x6e\xc3\xf3\x6c\x2f"
- "\x0d\x96\xf3\x6c\x96\xb3\x6a\xd0\x5c\x97\x3b\xee\x03\x6e\x33\xc7"
- "\x35\x63\xba\xcd\x38\x4b\x03\xb5\xb3\x43\x5a\xbb\x9f\xaa\xd0\x7d"
- "\x1f\xbd\xf4\xa4\x3b\x9e\x1d\xdd\x17\x7b\x90\x6e\xe5\xb3\xf3\x9e"
- "\xf2\x53\xe4\xa9\x11\xe5\x2d\xc1\x93\x94\x5f\x02\x5d\x91\xf8\xe2"
- "\x17\xdc\xb7\x98\x77\xdc\xc3\x57\xd6\x3d\x18\x4b\x9b\xf3\xfd\x74"
- "\x0d\xe6\xea\x5f\x6c\x33\xe0\x9d\x23\xea\x9d\x5c\x63\x98\xb0\x92"
- "\xe3\xd6\x3d\x75\xa0\xbf\xf9\xfe\xd5\xd5\xb7\x60\x7a\xff\xf5\x2d"
- "\x78\x42\xd6\x07\x9b\x0a\x73\xa0\xe4\x73\xb4\x40\xce\x4b\x64\x7c"
- "\x9b\x8d\x71\x61\xbd\xa6\xbd\x1f\xd0\xcf\xfb\x5f\x7c\x4b\xf9\x7f"
- "\xfd\x96\xf2\x5f\xb1\x2e\x42\xfb\xcc\x21\x57\x34\x9c\xa1\x41\x3d"
- "\xdf\x19\xe4\x7b\x3a\x59\x5b\x8b\xf9\xc2\x39\x52\xce\xd1\xac\x3a"
- "\x4c\xe6\xbf\xad\xc8\x27\x63\x86\x40\x57\xce\x5c\x4b\x1c\xaf\x25"
- "\xb2\xec\x9c\x3e\x1a\x3f\x4d\x57\x58\xf7\x4b\xf2\xd4\x90\x8c\xa1"
- "\x79\x04\x36\x29\xc6\x38\x8e\xdb\xa7\xad\x7f\x3c\xbd\x17\x7a\xb3"
- "\x3e\xc2\x2f\xb6\x03\x7a\xee\x56\x8e\x6b\xc0\xf6\xe5\x36\x35\xdf"
- "\xbc\x01\xfa\x39\x85\xcf\xc3\xf0\xd9\x98\xfc\x50\xae\xe1\x88\x8c"
- "\x2f\xf6\xb4\x57\x2f\xdb\xdf\x3a\x0b\xd7\xab\xd5\xc9\x3e\xa6\xfe"
- "\x2e\xd7\x33\xa9\x7a\x19\x86\xcd\x7e\x8a\x18\x97\x6f\x95\x67\x4a"
- "\x83\x1d\xac\x0b\x6f\x80\x2d\x9a\xa2\xea\x59\x48\xaa\x9e\x67\x72"
- "\xbc\xb4\xc0\x72\xa5\xb3\x19\xfd\xb7\xef\x99\x4d\x57\xdf\x3e\xd2"
- "\xda\xf7\x4c\xe3\xb7\xb4\xef\x4a\xf5\x06\xaf\xbe\x5e\x8b\x56\x6f"
- "\x7e\xd6\xd5\xd3\x35\xbf\xf0\xbb\xd3\x35\x43\xa3\x6b\x7e\xfd\xb7"
- "\xd0\x35\x5e\x3d\x27\xbe\x7b\x3d\x36\xad\x9e\x85\xa6\x78\xf5\x90"
- "\xfc\xeb\xf7\xdc\x94\x49\x8f\x61\xc9\xf1\x5c\x55\x7c\xb9\x85\xb9"
- "\x91\xb1\x7a\x55\x9c\xd7\x85\x05\x7a\xac\x5e\x2d\x96\x2c\x74\xf5"
- "\xc2\x0d\xf9\xf5\x3c\xbe\x8b\xb0\x97\x16\x6e\xe2\xf8\xa8\x33\xd7"
- "\xab\x33\xd9\x5a\x99\x9a\x2b\xc5\x08\xe6\x98\x56\x42\xe4\xd1\x91"
- "\x1a\xb9\xdf\x0e\xbd\xbe\xf0\x8f\xec\x7f\xaf\xf6\x0b\x17\x9e\x54"
- "\x72\xbf\x10\x73\xc4\x85\xe9\xfd\xc3\x58\xd6\xb8\xb7\x2c\x63\x40"
- "\x7f\x3e\xf5\x5d\xae\x45\x23\xbc\xb4\x3c\x49\xfa\xd1\xa7\xdc\x93"
- "\x8e\xf9\x83\x16\x57\xef\xb9\x1d\x11\x31\x04\x31\x16\x3e\xfb\x3b"
- "\xcd\xf7\x1f\x34\x28\x07\x2d\x17\xcd\xd7\x69\xa0\xa7\x23\xcd\xae"
- "\xd3\x00\x36\x4d\x92\xa7\x3e\xc8\x67\x73\xfc\xea\x1c\xf6\xa2\x2d"
- "\xa2\x72\x99\x76\xde\x7d\x51\xab\xb2\x5b\x50\x5f\x4f\x9e\x51\xce"
- "\x95\xca\x78\xae\xf4\x6c\x91\x2f\x79\xd9\x01\x1d\x0f\x51\x6c\x35"
- "\xf0\x79\xef\x89\x41\x15\xa7\x8b\x6d\x02\x3e\x1b\x27\xdf\x17\xa7"
- "\x1b\x30\xb7\x04\x4d\x16\x7d\x2d\x3a\x39\x5e\x8c\x84\x9d\x04\xbc"
- "\x6b\x18\xae\x17\x57\xdf\xcb\xe9\x1c\xeb\x42\x6b\xcf\xa2\x3f\x87"
- "\xab\xee\x49\x0f\x77\x59\x0d\x3a\xbe\x7b\xe4\x39\xd6\x67\xd1\xfe"
- "\x7c\x69\xb7\x29\x7c\xac\x06\xf6\xe1\x0f\xa7\x2c\x6b\x14\x2f\x5b"
- "\xe9\xe0\xca\x76\x39\x57\xe2\x3a\x27\x72\x3c\x38\x9e\x1b\xc1\x1e"
- "\x41\xb9\xf9\xbd\x74\x03\x5c\xd1\xa5\xd3\xed\x59\x52\x63\xb1\x6a"
- "\xa3\xff\x65\xab\xe1\x88\x4f\x9e\xb1\xa3\x34\x9b\xf3\x1b\x15\xeb"
- "\xf9\x59\xb7\x4e\xbb\x5e\x9c\x80\x0f\xe7\x51\x3e\x4d\xcf\x1e\xd0"
- "\x71\x92\xf2\x9a\xc2\x67\x76\x17\xed\xe5\xb3\x42\x8a\xfe\x47\x92"
- "\x90\xe7\xc4\xe5\xf4\x7f\xb6\x3d\x82\xfe\x89\xcc\x6f\x4c\x7f\x5e"
- "\xdf\x00\x5d\x92\x41\x4b\x93\x3a\xe3\xc0\x36\xcc\x73\x7c\x96\x3e"
- "\x89\xf1\x0c\x57\xea\x34\xcf\x33\xaa\xb5\xb1\xe7\x66\x47\xf4\x03"
- "\xda\x6b\x65\xfb\x2c\x41\x6f\x3f\x97\x61\x1a\x70\x7c\x47\xae\x1b"
- "\xf8\x5c\xdb\xe5\x7a\xae\x20\xb6\x4d\x1b\xd5\xf9\x11\x52\xfe\x24"
- "\xcf\x6d\xea\x95\x8f\x61\xc2\x57\x62\x13\x01\x75\x16\xf9\xb9\x71"
- "\x07\xcb\x7c\xc6\xfe\xe4\x9e\x79\x50\xc6\x8a\x34\xc8\xb5\x04\xd8"
- "\x59\x8b\xd7\x0a\xe0\xa6\xfa\x7e\xf1\x8f\x54\x5a\xc1\x6e\x5c\xc1"
- "\x63\xcf\x5d\x14\xa8\xdb\xe7\x94\x71\x55\xd0\xb6\xc5\xd5\xcc\x73"
- "\x3a\x9f\xf1\xda\xa3\xf2\x13\x2f\x78\x82\xf5\x88\x4e\x73\xe0\x3f"
- "\xb8\xcb\x55\x90\xa6\xe3\xaf\xe7\xe7\xbe\xe3\x3c\xbc\x4f\xd3\x64"
- "\x0b\x48\xfd\xaa\xce\x09\x15\xe4\xea\x72\xcb\x75\x70\x3f\xb3\x7e"
- "\x61\x7a\x28\x5a\x14\x14\x45\xc3\xb2\x1a\x54\x7c\x4a\xe6\x79\xc8"
- "\xe3\xba\xc0\x00\xe4\xa9\xee\x83\x51\x60\x51\xef\x7a\xf1\x64\xdf"
- "\x7e\xe9\x7f\xa7\xfa\xa3\x20\xc4\xed\xea\xc3\x97\xe5\xaf\xa0\xb7"
- "\xff\xf9\x9d\xdf\x69\xe5\x78\xb6\x52\xaf\x94\x8c\x64\x7c\x7d\x1c"
- "\x27\x56\xf2\x3a\xe0\xcf\x64\xdc\x39\x8f\xde\x67\x7d\xbc\xb8\x78"
- "\x44\x24\x1c\xe1\xb4\x1a\x74\xfd\xa4\x74\x87\x0f\xf3\x54\xb2\xa9"
- "\x3d\x96\xc5\x39\x11\x38\x37\xea\xf8\xf4\xe9\x84\xc5\xf6\x58\x9e"
- "\xe4\xba\x39\xfe\x9e\x06\x9b\x75\x89\xe5\x14\x2d\x9e\xaf\xf0\x7a"
- "\xee\x18\xf7\x63\x7f\x63\x9a\x1e\xe7\x73\xbb\xd2\x21\xe8\xe7\x25"
- "\x9f\x6f\x57\x67\x87\xfc\x2a\x96\xe3\xe2\x3f\x0b\xc3\xdb\x4c\x2b"
- "\x5e\x43\xf7\xc9\x18\x1d\xf2\x5c\xf9\x62\x79\xc6\x7c\x68\xd1\xdb"
- "\x32\x7e\xac\xe6\x0f\xe8\x6b\x2a\x0a\xca\xf8\x7d\xce\x12\x3e\x67"
- "\x1b\xe4\xf9\x9d\xf4\x77\x3b\x52\x12\xa4\x47\x03\x2c\x13\x4b\xd2"
- "\xf9\xfc\xbc\x5f\xca\xd2\x92\xc9\xfa\x99\x79\x8e\x69\x29\xba\xf2"
- "\x08\x7a\x28\x91\xed\x22\x9b\x93\xe3\x1d\x3c\xcf\xe7\x87\x48\xeb"
- "\x5f\xda\x6a\x10\xc7\x95\xfc\x2f\x59\x2f\xe3\x08\xca\xbd\xab\x53"
- "\xd0\x09\x89\x7f\x3f\x45\x4b\xde\x50\x6b\x3d\xba\x8e\x7a\x7e\x08"
- "\xef\x5f\x79\x35\x18\xa8\x0b\xe3\xdf\x22\xe3\xe5\xba\x64\xc9\x7a"
- "\x7d\xbe\xc2\x67\xee\xd4\x5e\x58\x1f\x3c\x2f\x2d\x29\xe5\x6b\x5f"
- "\x1f\xfc\x9e\x61\x75\x5c\xae\x17\x9e\x27\x5d\xf6\x8a\x46\xf1\xb9"
- "\xed\xc5\x4d\x5c\x7f\x7f\xe3\x85\x70\x3e\xc1\xfd\x64\x3a\x6d\x8b"
- "\xdf\x37\xf1\xf7\xd6\x9e\x2f\xd0\xdb\xa0\xd3\x44\xb5\xe1\xf9\x4f"
- "\x3a\x53\x32\x73\x22\xda\xfe\x89\xa4\x45\xdf\xfb\x8b\x11\xb4\xe1"
- "\x67\xbf\x1a\xd7\x9e\x3f\x08\xfe\xd8\xab\x78\x4d\xa5\x41\x76\x3e"
- "\x14\x2f\x43\x17\x48\x1c\x97\x92\x2e\xeb\xc8\x0b\xfb\xef\xeb\x11"
- "\x6a\x8f\xeb\x79\xb4\xff\x79\x2d\x6e\xc2\xf3\x15\x8c\x4b\xdc\x76"
- "\x46\xe1\x68\x2f\x64\xfb\x42\xc5\x51\xb0\x2f\x63\x7c\x6d\xdf\xe3"
- "\x3e\xb6\xdf\x2d\x75\x38\xc7\x54\xe8\xb1\x0f\xf0\xf7\xa4\x53\x67"
- "\x8f\x1d\x7a\x21\xdd\xd0\xe5\xb2\x43\xff\x9f\x0f\xa8\x3a\xed\x0b"
- "\x75\x5c\x19\x37\xd8\xcd\xa6\x2e\xb1\x34\x3e\x7d\xb9\x5e\x19\xe7"
- "\xc9\x3e\x10\x3f\x13\x7e\xd7\x7c\x97\x38\x4c\xb0\xcb\xdb\x7d\x95"
- "\x53\x8e\x87\x57\x8b\xa3\x1c\x4f\x0c\x73\x8f\xf6\x6d\xe0\xdd\xa1"
- "\x1b\x1a\x61\x8b\x3f\x6d\xc8\x5f\x4b\xd9\x98\x23\x93\xb8\x24\xb2"
- "\xf6\x84\x71\x5d\x2d\x26\x73\xbc\x6e\x3c\x67\x68\xcf\xe3\xf8\xb9"
- "\x73\xb5\x58\xd0\xe5\x5a\x6a\xd1\xf7\x04\x55\x2c\x9c\xa5\xb6\xde"
- "\xf8\x41\x89\x4f\xf1\xf9\x21\x8e\x33\x15\xc6\xdc\xa7\x9d\xeb\xcd"
- "\xe7\xf9\x2b\xea\x43\x3e\xc8\xff\x42\xd9\x4e\x5f\xe2\xed\x29\xf8"
- "\xc5\xa7\x2d\xca\x30\x5e\x9d\xc9\x53\x8e\xeb\xb8\x0e\xf5\x67\x1b"
- "\xbe\x23\x6e\x0d\x3a\x6e\x48\x3f\xba\x4d\xa5\x07\x39\xde\x21\xfb"
- "\x36\xe2\xfd\x31\x1d\x57\x1d\x07\xae\x8f\xcf\x6b\x8a\x94\xcc\x3c"
- "\x8e\x35\xc3\xf5\xf9\x5e\xe6\xf8\xbe\x4b\x03\x3a\xbe\xdf\x95\x8f"
- "\xcb\x6a\x85\xe0\xb1\x93\x75\xaf\x6d\x38\x51\x8b\x9f\xf5\xc9\x0b"
- "\xb3\x8f\xd4\xfa\x79\x7d\xfb\x49\xd4\xf1\x44\xa7\xb0\x53\xb8\xc7"
- "\x1e\xb7\x7f\xb9\x0c\xf2\x57\x48\xdd\x50\x95\xf9\x44\x58\xe4\x40"
- "\x47\xa0\x5c\x4f\x0e\xaf\x2d\x41\x66\x5f\x38\xd8\x54\xda\xce\x67"
- "\x2c\xa1\x6f\x5e\x38\x88\x3c\x79\x6c\x63\x61\x7e\xc5\x3a\x2b\x91"
- "\xf5\x52\xe3\xea\xc9\x0c\xe3\x23\xa3\x83\x8c\x4d\x8e\xef\xf6\x1d"
- "\x00\xc0\xed\x50\x72\xf3\x42\x87\x6e\x97\xe0\x3e\x10\xbd\xdf\xfd"
- "\x82\x37\x76\x6e\xf6\xec\x8a\x15\x25\xf9\x2b\x17\xf3\x25\x7d\xcc"
- "\xaa\xb1\x83\x23\xe7\xe0\xac\x83\x55\x7c\x84\x17\x2d\xbc\xde\xb5"
- "\x3d\x45\xdf\xbf\x7d\xb1\xf7\xfc\x97\xe6\x27\x7e\x1f\xcf\x25\xd8"
- "\xe6\xc6\xbb\xc2\xdf\x95\xae\x97\x36\xd0\x17\x26\x32\xc4\xd6\xb7"
- "\x64\x51\xc9\xa2\xc2\xa9\xbc\x53\x33\x38\x5e\x3d\xe5\x31\xf5\x1c"
- "\xea\xad\x47\xe9\x40\xbf\x81\xf3\x55\xee\x6f\x14\xc9\xd5\x0b\xd5"
- "\x19\xdd\x17\x4f\xea\x6b\x29\xfd\xf8\xd7\xd5\x84\xaa\x56\x58\xb8"
- "\x5f\x9c\xeb\xc9\xf0\xe1\xba\x56\x03\xdb\x32\x65\xb8\xe7\x39\xad"
- "\x5c\x9b\xd1\xe2\x14\x7d\x7a\xa1\x15\x63\x4c\x61\x86\xa8\xcc\x84"
- "\x5d\x5e\x98\xde\xdf\x3c\x36\xd2\x37\x81\x7d\xd9\xda\xa8\x30\xa7"
- "\x5f\x3f\x02\xf7\x3d\x59\x4a\xc7\x14\xee\x6e\xb2\x12\xf7\xfb\x4f"
- "\x4e\x51\xe1\x0e\xa3\x15\xe3\xc8\x70\xfa\x27\xdc\xef\xe6\xb2\xfc"
- "\x2e\xaa\x9f\x6f\x3e\x5b\x6f\x04\x17\x82\x1b\x13\x84\xfa\x23\xa3"
- "\x76\x93\x88\x9f\x41\x24\xc8\x5d\xb6\x44\x50\x78\xe0\x35\x46\x32"
- "\x0f\x4d\x32\xdd\x7a\xcb\x08\xeb\x7d\xf7\x4e\xcb\x72\x96\x95\x42"
- "\x7a\x83\x01\xb3\x88\x8c\xab\x55\x6d\x7a\x6c\x6c\x39\x49\x3f\x8b"
- "\xca\xea\xb8\xbc\xbf\xc5\x25\x8a\xf8\x4c\x73\x38\x65\x7f\x86\x73"
- "\x15\x19\x3e\xe8\xf6\x1a\x38\x76\x3c\xdb\x58\xfc\x6d\x81\x53\xb4"
- "\x6c\xec\x67\x48\x43\xfb\x1d\xc2\xbd\x3f\x43\xd9\x26\xcb\x96\x86"
- "\xab\xf6\x67\xf4\xc1\x37\x12\xc3\x77\xee\x20\xc3\xde\xb2\x76\x83"
- "\xc7\x78\x2f\x79\x6c\x7e\xfa\x0c\xf7\x71\x69\x89\x3a\xd9\xde\x61"
- "\x18\x75\xae\x70\x85\xf3\x1b\x32\x68\xe7\x12\x0d\xe7\x68\xd9\xdb"
- "\x07\xfa\x29\xc7\xe7\x80\x3b\x53\xa6\xbc\xd9\xe5\x5a\x86\xfe\xbf"
- "\xdf\xa8\x8d\x77\xd0\xcb\xcb\xc0\xff\x85\x52\xff\xe3\xfd\x1b\x9d"
- "\x32\xb6\xf0\x72\xd2\xf3\xc4\xed\xa3\x9f\xf2\xda\xac\x68\xe4\x7e"
- "\x15\x97\xbe\x6a\xe7\x33\x0f\xfd\xf8\x47\x0c\xf4\x38\x26\xf1\x1e"
- "\xd5\x80\xa1\x01\x4a\x72\x5e\x14\x3d\x21\x17\xa5\x82\xdd\x0d\x21"
- "\xcc\xa9\x83\x97\x44\x5e\x73\xc7\x05\x19\xeb\x92\xf5\xc7\xfb\x4b"
- "\x7e\x6f\xf0\x04\xce\x37\x7a\x36\x85\xa9\x05\xb6\x87\xa7\xf6\x7c"
- "\xa3\x8a\x89\x19\xa2\x66\xfa\x0b\x35\x3b\xfe\x77\xb9\xa7\xfc\x2f"
- "\x48\x17\xe5\x4c\xe7\x9e\x4b\x62\xbe\xc7\xf8\xbf\x88\xbf\x7d\xc2"
- "\xba\x10\x74\xb7\x9d\xa3\xe5\xff\xfa\x29\xe0\x7c\xf0\x1f\x80\x25"
- "\x63\x69\x4d\xa7\xcf\x70\x8f\x36\x9d\xd0\xf5\x64\xdc\x18\x24\x09"
- "\x8d\x5b\xcc\x8e\xa7\x0d\x61\xe8\x5c\x8e\x79\x06\x5d\x3b\x99\xdb"
- "\x85\xe7\x0c\x7e\xc6\x75\x1c\x5f\xcd\x1b\x1a\x77\x9b\x83\x4f\xb3"
- "\x0e\xce\x63\xfd\x8a\xf4\xf9\x75\x97\xa4\x4e\xce\xd5\x9e\x67\x6b"
- "\xcf\x39\xda\xf3\x4c\xed\x39\x5b\x7b\x9e\xc6\xcf\x4a\x77\xaf\xb0"
- "\xf7\x8e\x2b\x86\x81\xc7\xf1\xec\xd0\xfb\x02\xf8\x0c\x31\x3b\xd6"
- "\xcb\x31\x40\xc3\x63\xb2\x86\x57\x86\xf6\xac\xe3\x73\xb3\x39\xb8"
- "\xfe\x7f\x0a\x9f\x40\x34\x3e\x45\xa6\x08\x7c\xc8\xec\xc8\xfe\x2e"
- "\xf8\x58\xcc\x1c\x9f\xff\xbf\x81\x0f\xe3\xc2\x69\xa8\xbf\x22\x06"
- "\x9f\x1a\x1d\x9f\xb8\xfc\xb6\x5a\xb4\xf3\xf8\x57\x7c\xa3\x8c\xf7"
- "\x3b\x90\xc7\xb6\xba\x6e\x3d\x7e\x5d\xd1\x89\x2b\xc5\xaf\x83\x2c"
- "\x58\x91\x07\xed\x2f\xda\xab\x8d\xf3\x87\x95\x2d\xf8\x52\x92\xee"
- "\x53\x84\xb6\xee\xdb\xa6\xda\xda\xb0\x89\x63\xb8\xad\xa5\x9b\x9c"
- "\x0e\xd1\x8e\xb9\xd9\x7f\xf2\xfc\x21\x12\x6e\x61\x49\x71\xf1\xb2"
- "\xa9\xb6\xc2\x45\xcb\x17\xdb\xc6\x14\xd8\x8a\xed\x4b\x97\x94\x2c"
- "\x8e\xde\x67\xb7\x68\xdf\x4b\x91\xe7\x07\xd8\xde\x96\xf3\x2d\xf0"
- "\x3f\xeb\x6d\xe5\xf3\xf9\x52\xb3\x70\xbd\x94\xc5\xba\x7e\x4f\x15"
- "\x19\xf9\x4c\x31\xf0\xa9\xd5\x75\xbc\x3e\x47\x62\x1d\x8f\x74\xd8"
- "\x7f\xcb\x27\x47\xa4\x73\xde\xa3\x7a\x1a\xc3\xd7\x74\xd3\xc0\x53"
- "\xf4\xd2\x52\xae\x33\x2e\x0d\x2f\x89\x7a\x8c\xaf\xfc\xbd\x01\x03"
- "\x74\x8a\xe0\x78\x4c\x7c\x2e\x0f\xe5\xc4\x69\x5a\x79\x23\xeb\x5e"
- "\xfe\x26\x8f\xb2\xeb\x05\x70\x5c\x39\x1e\x65\xf6\x22\xcd\xb8\x15"
- "\x79\x31\x57\x68\xe7\x72\x48\x9f\xc5\xf1\x11\x90\x6e\xd2\xe2\x4c"
- "\x71\xda\x13\x1c\xbf\x00\x69\x96\x88\xb4\x65\x1c\x2b\x1d\x69\x36"
- "\x0d\xde\x7a\xa6\x33\x9e\xb3\xb5\xb5\x14\xce\x53\xa9\xd5\x5b\x1e"
- "\x89\x33\x7f\x3c\x63\xd2\x84\x0c\xdb\xfc\x47\xef\x9a\x7e\xef\x73"
- "\x2b\x96\x2f\x19\x4c\x92\xec\xe9\x18\x2e\x33\x26\x39\xc6\x4e\xb5"
- "\x15\x2d\x5e\xbc\xd2\xb6\x66\xf1\xf2\x12\xdb\xa2\x35\x8b\xd6\x0e"
- "\xa6\x25\x2b\x56\x3e\xc7\xa7\xef\xb9\x5b\x8a\xf3\x9f\x5b\xf2\x3c"
- "\x3b\x43\xa8\xdc\x83\xa3\xc6\xf1\xf9\xac\xdb\xb4\x78\x15\x47\xb7"
- "\xb1\xad\x91\x3c\x8d\xef\x39\x8e\x93\x15\xd7\x26\xfc\x0e\xe3\x77"
- "\x08\xbf\x13\xf8\x1d\x3f\x43\x8e\x05\xb8\x1e\xec\x72\x15\x4f\xd3"
- "\xed\x89\x3e\x1e\x2a\xce\xd5\x79\x08\xe3\xff\x41\x35\xbe\x15\x97"
- "\xb7\x04\xa5\xfc\xf4\xf2\xd4\xb6\x4b\x7d\x3c\xc5\x71\x28\x5b\xd8"
- "\xd7\x67\x35\xde\x83\x87\x41\x7f\x9e\x57\x0f\x62\xba\x9d\xa6\xd5"
- "\xab\x30\x1f\x3f\xc6\x31\x54\x70\x6d\x02\xbf\x1c\x53\x71\x4b\x8a"
- "\x83\xc8\x37\x12\x75\x1c\xd6\xea\x50\xcf\xc3\xc4\x51\xfe\x76\xc6"
- "\x29\xed\x99\x61\x01\xc6\x10\xbe\xe7\xab\xb6\xa7\x66\x66\xbf\x49"
- "\x35\x6f\xd4\xdf\x95\xbc\xab\xd5\xd1\x08\x5a\x94\xef\x71\xc9\xb5"
- "\x3f\x39\xbf\xe2\xb5\x43\x73\xc2\x7d\x02\xf8\x9c\x0f\x27\x3e\xd5"
- "\x2a\xe3\x22\x96\x77\x43\x47\xdc\x71\x87\xc7\x21\xf3\x27\xf0\xda"
- "\xe2\xdc\x22\x11\xe6\xf8\xd4\xe1\xc4\x17\x5b\xb9\x9c\xb0\x4c\xa3"
- "\xf0\xd6\x21\xd9\xca\x16\xe0\x78\x74\x25\xe5\x1a\x4c\xde\x37\xb3"
- "\x9e\xa1\xe2\x4c\x35\x57\x73\x2c\x50\xf6\x59\xc9\x66\xdd\x07\x0f"
- "\x32\x9a\x8e\xe7\x5a\x5d\x07\x78\xa9\xc4\xae\xf9\x4b\x35\xaa\xf6"
- "\x97\x9c\xd0\x9e\x0f\x69\x38\x26\x70\x8c\x0c\xe0\x7f\x9c\xfb\x0e"
- "\xf3\xde\x43\xb8\x3f\x01\xfa\x1c\x53\xf4\x29\x91\x36\x20\xec\x1a"
- "\x7e\x7f\x82\xbf\x33\x82\x77\x27\x54\xfc\x89\x92\x24\x6e\x73\x9f"
- "\x4f\x65\x6d\x36\x70\x1d\xc2\x7b\x8f\x90\xa5\x43\x9e\x4b\x2c\x9f"
- "\x25\x1c\xcb\xf2\x80\xae\x77\x58\xcf\xe4\x87\x20\xa7\xd2\xee\x5e"
- "\x35\x53\xd7\x37\x7d\x7c\xb0\x2a\x2f\x9e\x2e\x89\xd7\xef\x8a\xfe"
- "\xab\x7e\x27\x5c\x2b\x6b\x81\xd3\x01\xd9\x07\x1c\xa7\xf3\x52\xaf"
- "\x7d\xdf\xa3\x74\xe4\xaa\x86\xde\xb9\x88\x86\x07\xc7\xfc\xf6\x32"
- "\x6e\xdd\x72\x3f\x58\xd3\x1b\xab\x4e\xe8\x7a\x43\x87\x63\x4e\x10"
- "\x61\xb3\x03\xff\xdc\x93\xb2\x78\xed\x9c\xc7\x4b\x69\x8f\x00\xce"
- "\xd0\x8b\xea\x6c\x54\xb8\x72\x52\x96\x97\x56\x6d\x86\x8e\x31\x4a"
- "\x9b\xd3\xb5\xf2\x83\x3e\x5d\xb4\x3a\x3d\x12\xa6\xb0\x4c\xca\x62"
- "\xb8\xac\x8f\xd8\x26\xc9\x0f\x19\x39\x3e\x49\x96\x36\xbe\x40\x07"
- "\xaf\xce\xd3\x71\x05\x0d\x8f\xea\xf8\x6a\xdf\x78\x82\xae\x5a\x75"
- "\x68\x5e\xa8\x87\x7d\x84\x9b\x54\x7f\x3a\xa4\xbe\xc1\xbb\x06\x94"
- "\xad\xf6\xd2\x4b\xed\x9a\x0c\x1d\x43\xf9\x86\x23\x65\x33\x91\x67"
- "\xf5\x01\xcd\xcf\xf5\x38\xfa\xf7\x44\x04\xef\xbf\x1b\xb1\x16\x70"
- "\x42\xf5\xe1\xbd\xe5\xa7\x68\xb5\x2f\x22\x5d\xeb\xdb\x23\xb9\xa7"
- "\x68\xcd\xbb\x6a\x5e\x9d\x19\x50\xe5\xd7\xa8\xb3\x2b\x1a\x8e\xac"
- "\x0b\xf8\x1c\x17\xcb\xb8\xa4\xbd\xec\xe3\x35\xe9\xfa\x78\x01\x58"
- "\x07\x25\xcd\x87\x89\xc3\x4c\x27\x15\x07\x62\x65\x8b\xa2\xd3\x9a"
- "\xdc\x28\xda\xf3\xb8\x89\x7a\x98\x4e\x43\x37\x88\xf0\x50\x7f\x82"
- "\xc8\x5f\x6b\x24\x96\x17\x96\x71\xde\x33\x02\x7f\x48\xbb\x4a\xd1"
- "\x6d\x8d\x5b\xa7\x9b\xde\x77\x4c\x27\x2f\xad\x21\xa6\x6d\x74\x1b"
- "\x07\x1e\x3f\xa5\xb7\x1d\x34\xe5\x75\x70\x3c\xef\xd5\xe4\xe2\x58"
- "\xe3\x70\xf6\x29\x28\xfe\xc5\x11\xe3\x5d\x74\xc4\x31\x99\x14\x6d"
- "\xd7\xf8\x40\xdb\xdc\x88\x79\xc3\x51\xa6\x2f\xcb\x8a\x70\x4f\x9a"
- "\xac\xc5\x64\x3a\xaa\xfc\x5b\x8a\xf7\x8a\xca\x49\x93\xa5\x2c\xaf"
- "\x96\xb1\x33\x58\x06\x8e\x33\x8d\x58\x2f\xb2\x2c\xb1\x0c\xb0\x3c"
- "\x29\x1a\x39\x66\x47\xd0\xa8\x89\xe9\xa3\xd1\xe9\x60\x8c\x2e\x5f"
- "\x6c\x2b\x9c\xae\x74\xb1\x2d\x7d\x4c\xc1\x44\x19\x00\xc5\xf6\xe0"
- "\x8c\xa9\xb6\xdc\xe9\x63\x1c\xf6\x71\x73\xd5\x65\x46\xee\x6c\xbe"
- "\x0e\x8e\x9e\x77\xd9\x50\xcf\xc1\xe8\xb9\x5b\x59\xb6\xd2\x1f\x8e"
- "\x63\xde\x84\x24\xb9\x2e\xc5\xf1\x48\xb7\x2d\x27\x0a\x01\xef\xad"
- "\x67\xd0\xa7\x96\xcc\x13\x1c\xff\x76\x1e\xe6\x8c\x73\x2f\x8a\x6f"
- "\xea\xf0\x6e\x0f\xd2\x87\x16\x71\xdc\xfc\xbf\x89\x70\x72\xe6\x09"
- "\x9e\xdb\x8b\xca\x51\x35\xbe\xe4\x6a\x93\x2f\x79\xfb\x71\x5f\xf2"
- "\x94\x7d\xb3\xc6\x3a\x45\x97\x6b\x6d\x9a\xde\x2e\x5e\x03\x40\x7f"
- "\x9e\x98\xe7\x10\x21\xa6\x51\xbe\x83\x63\x54\x03\x76\x22\xaf\x01"
- "\xac\x45\xfb\x97\x55\xa8\xf9\xe5\x5a\xf0\xff\xca\x0e\x4d\x97\xe5"
- "\xe2\x19\xf6\xdf\x9d\x07\x64\xbf\xba\xac\x32\xb6\x75\x78\xe3\xed"
- "\x8f\x88\xca\xed\xc7\x75\x98\x80\x75\x8d\xda\x0f\x57\xf0\xbe\xab"
- "\xbf\x65\xb8\x6a\x52\x9b\x39\x41\xc5\x0b\x84\x8c\x97\xd7\x19\xc2"
- "\x79\xbd\xfe\x13\x78\x37\x74\x83\x85\xfd\x2b\xf2\xc0\x7b\xe5\x9c"
- "\x47\x7f\xb7\xcd\x15\xf6\x6e\x33\x84\x03\xe8\x47\x8b\xb2\x9f\x3b"
- "\x58\x7f\x62\x6e\xb9\x2e\x55\x1f\xd7\xe4\x78\x68\xa0\x72\x35\x9f"
- "\x59\x77\x27\x97\xbb\xe0\x32\x62\xce\xe0\xd8\x3b\x2a\x55\xce\x51"
- "\x02\x61\x57\x02\x29\x1f\xd7\x75\x83\x74\x1d\xcb\xfb\x68\xe6\x0d"
- "\xc2\xc7\xeb\x88\xe6\xa0\xf0\xc9\x18\xec\x3c\x76\xd0\x19\xf2\x94"
- "\x76\x95\xb3\x8f\x9d\xb4\x81\x50\xaf\x1a\x37\x42\x6a\xdc\x40\xfd"
- "\xbe\xc4\xdb\x17\x62\x7c\x48\x38\x43\x6b\x5b\x19\x7f\xa6\x0d\xaf"
- "\xc7\x87\x41\x2b\x0f\x8f\x93\x4c\x9f\x94\xc9\x05\xec\x1b\xc1\x6d"
- "\x35\x07\xd1\xe6\xc8\x76\x19\xc2\xde\xad\x2e\xb4\xcb\x80\x76\x39"
- "\xce\xb2\xcc\x04\xd8\x67\x05\xf2\x36\x4c\xc6\x39\x96\xf3\xe7\x75"
- "\x81\xc8\x36\xb2\xfe\x57\x6d\x78\xf9\xc6\x78\x6d\x14\x06\x6e\xa3"
- "\xa4\xc1\x59\x4d\xde\x24\x9e\xac\x3f\x3a\x68\x5d\xc3\xd0\x0d\xec"
- "\x2b\x92\x79\x02\xfa\x6d\x06\xf7\x21\xc6\x4f\x37\xe3\x19\xaf\xbf"
- "\x18\x9e\x82\xf5\xf2\x21\xf3\x86\xf2\x85\x5d\xae\x97\x37\xc5\xa7"
- "\xf7\xcb\xef\x5e\x99\xde\x2f\xaf\xe5\xf2\x8c\x07\xef\x01\x98\x83"
- "\x98\xac\x83\x6f\x31\x5f\xab\x88\x57\xef\xd0\x0d\xf5\x8c\x57\xdc"
- "\x77\x82\xe5\x45\xd3\x41\xe0\x43\x01\x39\x11\xac\x93\xba\x5c\xa5"
- "\xbd\xeb\x5f\xe6\x04\x5b\xa2\xd4\x0f\x06\xe1\x8e\x07\xc3\xbc\xc1"
- "\xcd\x7b\x21\x33\x50\x7f\xdc\xf7\x61\xfe\xa6\x83\x3b\xb3\x31\xbc"
- "\xf1\xfb\xa3\xcc\x09\x74\x9f\x2f\xf1\xfb\x83\xcd\x8e\x60\x1a\xd3"
- "\x10\x30\x1d\x90\xe3\xf1\x3c\x4f\x55\x6b\x17\xa5\xb0\xff\xb7\xc8"
- "\x78\xdc\xbe\xe4\xcc\x46\xb5\xb7\x50\x8a\xf1\xaf\x7a\xb6\xbe\x7e"
- "\x8b\x67\xe8\x97\x2f\x0b\x95\x5c\xde\xb4\x53\x54\x4d\x29\x09\xbb"
- "\xcc\xc2\xb6\xce\x0c\x3b\x72\xfd\x63\x61\xc1\x71\xfe\xa7\x94\xf4"
- "\xf1\x89\xf2\xa3\xd1\xf9\x04\xe5\x83\xf1\x79\x60\xfd\xcd\x57\xe6"
- "\x81\xd2\xaf\xf9\x3d\xd3\x5d\xcd\x55\xd6\xcf\xd4\xed\x14\xb1\xf1"
- "\xa6\x9d\xb6\x32\xae\xbf\xb4\x55\xd5\xcd\x34\xc9\xe6\x7d\x85\xd9"
- "\xa0\x4b\x39\xf2\x16\xe9\x7a\x80\xf9\xc5\x1c\xe2\x6f\x20\x90\xe4"
- "\x69\xbc\x83\xfd\x53\xe4\x55\x6b\xa5\x59\x19\xf2\x7b\x81\x2e\x87"
- "\xdd\xe7\xb4\xef\xc2\x38\x4c\xfe\xe4\x49\xd3\x90\xe7\x80\x97\x1a"
- "\x65\x3c\x23\x8c\xc1\x93\xa1\xb3\xb3\xaa\x95\x9f\xac\x49\xc6\x11"
- "\x82\x4c\x73\xec\x20\x96\x6b\xa4\xa5\x02\x6f\x8e\x23\x84\xf9\xce"
- "\xfa\xf6\xde\x71\xc9\x95\x0d\x5d\x21\xe4\xb7\x77\x30\x2e\x8d\xe8"
- "\x04\xed\xde\x30\x84\xf7\x5d\x9a\x68\x25\x6e\xf3\xa5\x8d\xc3\xf7"
- "\xfd\x64\x02\x19\xff\x1f\xeb\xb3\x54\x34\x89\x52\x37\xdc\x65\xa4"
- "\xff\x93\x45\x06\xa6\x83\x97\xd6\x07\x14\xed\xca\xb2\xf4\xfe\xf1"
- "\x52\x69\xbd\xd4\x9d\x1b\x9f\x6a\x9f\x17\x14\xdf\xa8\xf5\xd0\x32"
- "\xe8\xbf\x17\x8e\xab\xf7\x8e\xc6\xd8\x35\x20\xb6\xe7\x6d\x4b\x8b"
- "\x6d\x05\x2b\xd6\x2c\x1f\x39\x32\x6a\xae\x64\x94\x67\x63\x5c\x65"
- "\x85\x6a\x3c\x2d\xeb\x8d\x7f\xc4\x76\x09\x9e\xd1\x7e\xc7\x65\x31"
- "\xce\x67\xe7\x6b\xee\xcf\xf9\x19\xd4\x77\x9f\x49\xb3\x33\x23\x1e"
- "\xef\xa0\xd9\x93\xee\xc8\x7f\x64\xf1\xa2\x82\xb5\x11\xa9\x77\x46"
- "\xae\xeb\x6d\xdb\x89\xba\x13\x87\x3f\x00\x5d\x91\x30\xf7\x65\x1e"
- "\x5b\x9c\x6f\x94\x05\xc5\xdf\xa1\xaf\xb3\x20\x63\xf9\xcd\x25\x41"
- "\x6a\x86\x2e\x13\x37\xb1\x0e\x1f\xa8\xce\xfc\xc1\x9e\x02\x6f\x99"
- "\xd1\x76\x1f\xec\xba\x8b\xbc\x3e\x83\x72\x1f\xb7\xd4\x70\xac\xdf"
- "\x29\xda\xda\xbd\xb3\x04\xe9\xc9\xb8\xee\xc6\xf5\x1a\x5c\xdf\xb6"
- "\x2d\xc7\xbc\x87\x7d\xac\x57\xb3\x8f\xb5\x53\xfa\xba\x4c\xf0\x97"
- "\x13\xfb\x8a\xe0\xfd\x38\xb6\x41\xbc\xe4\xe4\xef\x83\xf1\x37\xe9"
- "\xb2\x91\xb6\xca\xf6\x02\x65\xf0\x55\xc8\xfd\x23\xcc\xc0\x2a\xa7"
- "\x1c\x10\xbb\xf2\xf8\x5b\x5a\x69\x48\xff\x73\x62\xc2\x17\x94\x68"
- "\x1d\x18\xea\x72\x39\x5b\xbd\xf4\xe2\x66\xa6\x53\x7f\xdf\xfe\x64"
- "\x3a\xc7\xda\x87\x7d\xb6\xe1\x4f\x49\xda\xb7\x9a\x3d\xb7\x47\x8e"
- "\x0b\xe5\xe3\x22\x6c\x3a\xde\xbf\x1c\xac\xec\x13\x11\x52\xf6\x69"
- "\xf9\x6c\x5d\x0e\x70\x9f\xa7\xf3\x69\x54\xdc\xb5\xe5\x25\x8b\x57"
- "\x2e\x2e\xb0\x8d\x29\x1e\x4c\x11\x51\xd7\xec\x8b\x97\xdb\x56\x2e"
- "\x7e\x69\xd5\xe2\x62\x19\x31\x8d\xdf\x46\x8d\xf9\xa9\x22\xe5\xce"
- "\x36\xfd\x3c\x90\x6d\x38\xd3\xb7\xfc\x13\x8e\xd5\x25\xaa\xee\x2a"
- "\x60\x9f\x0e\x35\xdf\xd8\x9f\x13\x3d\xdf\x70\xe5\x2a\x3b\x6f\x4a"
- "\xbd\x9a\xeb\x6c\xf8\x92\x9f\x4f\xd1\x06\x7b\x5f\x5c\xf0\x0d\x37"
- "\x82\x96\x06\x45\x37\xd3\xe9\x2e\xd7\x06\x8b\x4e\x37\x2f\xb9\x6a"
- "\x34\x5b\xaa\x43\xea\x0f\x8c\xb1\xd0\x7f\x51\xe3\xab\xfa\xe6\xe7"
- "\x06\x2b\x78\x23\x51\xae\xf7\x26\x4f\xe1\xd8\x34\x06\x86\x79\x1a"
- "\xe5\xd1\x3f\xf5\xd0\x9b\xac\xdf\x2a\x74\x78\xa8\x93\xb8\x3e\x6d"
- "\x1e\x74\x03\xca\xcb\xfd\xf0\xb0\x7b\xca\x5e\xd6\x29\x1c\x5b\x22"
- "\x5c\x09\x38\x72\x1f\xcf\x55\xc3\x36\xa6\x8c\x4d\x0f\x58\xbc\x4e"
- "\x0b\x3d\x77\x90\xbf\x0f\xcb\x69\x2a\x66\x58\x79\x01\xaf\x0d\xa3"
- "\xae\x5a\xe0\x7f\xbc\xcf\xe7\xdd\x55\xc3\x76\x27\xc3\xf5\xd2\x86"
- "\x6a\x86\xa7\x62\xa2\x6d\xf0\x7b\xa9\x2c\xd8\x67\x3f\xb9\xb2\x22"
- "\xe6\x65\xc0\x47\xe1\xe9\x07\x2e\x32\xfe\xa6\xf2\x41\x94\xed\x66"
- "\xfd\x59\xad\xb5\x5d\x6f\x4f\x97\xcb\x05\xfd\xe7\x6c\xd7\xf7\xd6"
- "\xbd\x5a\xbb\x19\x3f\xc6\x3d\x12\x67\x0d\xdf\x22\xc6\x17\xe5\x4a"
- "\x23\x64\x9b\xd7\x65\x06\x20\xcd\xdd\xe7\xdb\x5c\xde\x1a\xab\x37"
- "\x56\x2c\xb7\x15\x2e\x5d\xfe\x62\xfe\x9a\x45\x2f\x2e\xce\x5f\x55"
- "\x34\xce\xb6\x6a\xf9\xb3\x85\x2b\x9e\x7b\x91\xb9\xa6\xb8\x64\xd5"
- "\x73\x2f\xda\x58\xb3\xe4\xcf\x9c\x3d\x3b\xff\x81\xc7\x1e\x7d\x62"
- "\x30\x3d\xb0\x08\x69\x98\xf9\xcf\xce\x18\xa7\x5e\x3d\x32\x6b\xc6"
- "\xe3\xf9\x33\xe6\x3d\x36\x77\xbe\x3c\x0c\xd1\xfb\x7e\xe6\xf2\xf8"
- "\x19\xa2\xf8\xd0\x02\x5e\xaa\x45\xff\x0e\x38\x45\xaf\xa6\xaa\x38"
- "\xda\x1b\x67\x46\xc7\xd1\xde\x88\xb9\xec\x46\x58\x99\x1b\xab\x89"
- "\x36\x1d\xc5\x0f\x36\xc0\xab\x26\xc5\x5f\x83\xe6\x75\xb9\x36\x16"
- "\xf5\xf1\xd7\xab\xa9\x72\x7f\xbc\x46\xee\x3b\x1b\xf0\x0e\xfa\xbf"
- "\xdc\x1d\xf9\xae\x6f\x3e\xb9\x71\x5f\xef\x7c\xb2\x57\xa7\x6c\x3c"
- "\xa1\xcf\x2d\x91\xb6\x0f\xf3\xca\x41\x3c\xaf\x54\xeb\x49\xaf\x5e"
- "\x2f\x79\xaa\x5f\xf9\x36\x91\x3e\xaf\x64\xd9\xe6\x7d\x62\x35\xff"
- "\xd8\x64\x89\x94\x71\x19\xbb\x51\x93\x71\x2e\x27\xd7\xef\x2c\xfb"
- "\x27\xf3\x9a\x36\xec\xe3\x5a\xd8\x0a\x18\xbf\xba\x84\x48\xde\x3f"
- "\x59\xe1\xb4\x29\x97\xd7\xb8\xd9\x6e\xd6\xf8\x69\xe8\x19\xda\xb4"
- "\x45\xb8\x5c\x7b\xd5\x9c\xd2\xf5\x39\xeb\x75\xb1\x71\xf8\x03\xec"
- "\x7f\xc2\x73\x27\xd4\xb9\xa9\x8f\x67\x5f\x4d\x65\x5e\xe8\x9b\xcb"
- "\x6e\x8a\xd2\xff\x9d\xf2\x7b\x75\x9b\x0e\xea\x71\x00\x4a\x46\x92"
- "\xc1\x38\xd2\x4d\xd5\x06\x51\xee\xa5\x4d\x05\x5c\x07\xd3\xd3\x4b"
- "\x1b\xcb\x91\xd7\xd8\x47\xbf\x4d\xed\xbd\xf4\xd3\xd6\x59\xf4\x35"
- "\x16\x85\xf7\xab\xd7\xf7\x47\xab\xf8\x74\x7a\x25\xeb\x5b\xe9\xe4"
- "\xa2\x01\x2c\x93\x3a\xbd\x2e\xa7\xd5\x2b\xa5\x97\xd3\xea\x95\xe6"
- "\x08\x5a\x5d\xbc\x9c\x56\xaf\x1c\x88\xd8\xf7\xd1\xd6\x51\x5e\xbd"
- "\x9e\x69\xc6\x3c\x86\x76\x17\x80\xcf\x5e\xeb\xa3\xdf\x2b\xde\xcb"
- "\xe9\xf7\x8a\x3f\x3e\xfd\x5e\x71\x8f\x8a\x86\xb3\x2d\xde\xb8\x31"
- "\x74\x83\x41\x3b\x27\xf4\xea\xd2\xa6\x11\x72\x4e\x1a\xd8\x6e\x08"
- "\xdb\xb7\xbb\xf0\xc3\x95\xe7\x11\x7d\xb6\xb8\xd0\xe6\xd8\xaf\xda"
- "\x9b\x30\xe7\xe5\x75\xa5\x2b\x8c\x45\x27\xf5\x35\x0f\xdc\xb7\xf2"
- "\xdc\x99\xbf\x15\xc4\xe9\x4c\x4f\xfe\xf6\x14\xf8\xbd\x55\xd9\xa5"
- "\xaf\x1e\xea\x5d\x73\x99\xf0\x40\x7d\xe2\x06\xb2\x1d\xa9\x9d\xc4"
- "\xe9\xc7\xc1\x43\x72\x0d\x89\xfd\x7b\xfa\x83\x99\x1f\xca\xa6\xf8"
- "\x70\x7f\xd2\xcb\xff\xfd\x9d\x95\x8d\xd1\x47\xf6\x45\xcb\x0b\x56"
- "\x2c\x59\xf2\xed\xaa\x28\xd2\x77\xc7\xed\x0a\x57\x74\xf1\xf7\x18"
- "\x37\xbe\xb0\x0e\x75\xc2\xfe\x5f\xd6\xa8\xc6\xcd\x9f\x40\xff\xd9"
- "\x1d\xca\x96\x7c\xaa\x5d\x9d\x0f\xfe\x49\x47\x84\x7e\x06\x8f\xfc"
- "\x24\x20\x5c\x3f\x99\xdc\xd7\xc7\x3f\x69\xba\xbc\x8f\x7f\xd2\x1a"
- "\xbf\x8f\x7f\x12\x0c\xaf\xe6\xf3\x19\x3f\xe1\xf9\x8f\xb4\x35\xf9"
- "\x99\xf7\xcb\x31\x67\x6e\xc7\x7c\xb9\x63\xde\xda\xc6\xfb\xf2\xd7"
- "\x26\xb0\x5f\xb9\xfc\x26\x47\xf0\x92\x68\xe3\x3d\x6b\xde\x1f\xe3"
- "\x6f\x72\xf0\xb7\x78\xf8\x5b\xad\x32\x0f\xee\xb7\x9d\x26\x39\x77"
- "\xc4\x7b\x5b\xdd\x69\xf9\x5d\x62\xd8\x0a\x15\x79\xba\x6d\x6d\xde"
- "\x60\x93\xe7\x96\xb7\xaa\xfe\x68\xe5\xbe\xe0\xfa\xf2\xd7\x36\xaa"
- "\x3a\x2e\xf1\xf7\xb6\xc8\xac\x6c\x88\x0a\xf7\x15\xd7\xee\x93\xb7"
- "\xf7\x77\x9e\x1a\xf2\x52\x3e\x70\xbb\x8a\x69\xcd\xbe\x9c\x3e\xdd"
- "\x57\x87\xfd\x0a\x01\xb7\x3d\xd6\x2f\x51\xf9\x97\xbc\x46\xba\xdf"
- "\x0e\xee\x93\x7a\xe7\x03\xfc\x1d\x17\xcc\xe3\x6c\x65\x1b\xae\x39"
- "\x47\x15\xcd\x75\xfd\xac\xa1\xeb\xe7\x94\x35\x3f\x9f\x81\x80\xd1"
- "\xeb\xff\x88\x71\x6e\x20\xeb\x8b\x3e\x9f\xc6\xd7\x0a\x23\x7c\xd7"
- "\x7c\x3c\xf6\xf2\xb7\x62\x4e\xd3\x6b\x5b\xe4\xb7\x69\x46\xf1\xfa"
- "\xf7\x6b\x0d\xea\xbb\xc0\xaf\xd5\x44\xe2\xa2\xf0\x78\xed\x09\x5e"
- "\xa3\xe5\xf7\x91\xb8\x38\x16\xad\x5a\x3a\xd1\xb1\x64\xa9\xed\x39"
- "\xfb\xd2\xa2\xfc\xa5\x32\xb6\xac\x0c\x5b\x5b\xb2\xb6\x88\x77\x24"
- "\xc6\x0e\x8e\x19\xc3\x34\xdf\x49\xdd\x07\x46\xf9\x4f\xfe\x34\x19"
- "\xf4\x30\x28\xff\xc9\xd7\x8d\x6a\x5c\xff\xe9\x88\xcb\xfd\x65\x7e"
- "\x9a\xa1\xfb\xcb\x80\xaf\x2c\xd5\x2a\xa6\xbd\xe6\x63\xc3\x7c\xf7"
- "\xd3\xdc\x38\x65\x7a\xfd\x3f\xf9\x7b\xb6\xfc\xed\x59\xde\xd7\x96"
- "\xf1\xc7\xab\xb8\xdf\x5e\x3b\xe4\x71\xcc\xe2\x18\xaa\x1a\x3f\xff"
- "\xb4\x5a\xe7\x67\xdd\xcf\x92\x61\xf1\xb9\x95\x89\x81\x48\x3f\xa3"
- "\x9f\x7e\x83\x31\xcf\xda\xdb\x8e\x97\x0d\xc4\xb8\xfb\x0d\x8d\x8c"
- "\x47\x6b\x2c\x1e\xc0\x6f\x24\xd2\x7d\x7d\x7e\x5a\x7a\x3b\x5f\x37"
- "\xe2\x3e\x2f\x96\xe7\xee\x9f\x35\x1b\x46\x69\xf1\xe2\x92\xc1\x34"
- "\x63\x51\x61\x21\xcb\xf5\xa2\xc5\x85\xab\x56\xae\x28\xce\x5f\xba"
- "\x7c\x29\x52\xef\x5f\xc2\x21\x7f\x65\x96\xa9\xda\x1b\xdb\xf2\xc5"
- "\x8b\x0b\x54\x92\xd6\x0d\xd1\xfb\x40\x6a\xef\xfe\xf5\x12\x2f\xbd"
- "\x36\xae\xcf\xfe\x7a\xfd\x98\x30\xbc\x6e\xc1\xef\x26\x29\xd3\xd2"
- "\x36\x7a\xbd\x26\x7a\xde\xf3\xfa\x3e\x9d\x1f\x64\xff\x39\xd9\xd7"
- "\x27\x33\xb3\x53\xc8\x7d\x13\xf4\xd9\xe6\x10\x7f\xd3\xdb\x4b\x9b"
- "\xa5\xbd\x1f\x01\xa7\x57\xff\xf3\xb9\xfd\x8d\xca\x4f\xc0\xc8\xdf"
- "\x07\xe5\xf3\xfb\x5d\xae\xcd\xe0\xff\x8a\x83\x8a\xff\x37\xf7\xf2"
- "\x7f\xa7\x21\x11\x73\xb8\xcd\x23\x74\x7b\x3e\x5a\x66\x36\x4f\xbe"
- "\x5c\x96\xd8\xc7\x6d\xf3\x6c\x9d\xb6\x7a\x3f\x2b\xde\xda\xfc\x95"
- "\xbe\x0e\x5b\xa7\xc5\x9f\xe7\x7b\x2e\xcb\xb6\xba\x18\x3a\xe4\x3e"
- "\xf6\xc7\x3f\x45\x9b\x0f\x29\x7e\xd9\x5c\x1d\xe1\x93\x65\x39\x43"
- "\x9b\x0f\xaa\x7e\xda\xdc\xa0\xe3\x87\x76\xca\xfd\x00\x86\xa1\x64"
- "\xff\xf5\x4c\xc5\x3b\x9b\x8f\xeb\xb4\xe5\x79\x31\x9e\xbd\x7d\xb6"
- "\xc5\xeb\xe5\xd2\x47\x42\xc5\x2f\xe8\xe1\xf6\x03\xce\x42\x1d\x4e"
- "\x97\x6b\x0b\xda\x6f\x6a\xd2\x69\xa5\xe7\x89\xe4\x89\x19\x8b\x8a"
- "\x30\x69\x5d\xba\x64\xc9\xe2\x95\xc5\x7a\x4c\xe7\xf4\x15\x85\x05"
- "\x2a\x86\xf3\x54\x74\xff\x1a\x48\xe0\x74\x0e\x03\x8d\x54\x75\x1b"
- "\x63\x43\x8e\xe3\x75\x06\xe9\xb7\x27\xe7\x31\x95\x5f\xed\xd1\xe6"
- "\x34\xa7\x68\x6b\xa9\xf2\x7d\xd9\x3a\x5d\xd9\x8b\xd7\xae\x01\x4e"
- "\xf5\xba\xbd\xc8\xeb\x97\x9d\x34\x32\x8f\xcf\x23\xb1\xdf\xf6\xee"
- "\x37\x45\x1b\xaf\x57\x22\x4f\x93\xfe\xdd\x2f\xb6\x45\xb6\xa8\xef"
- "\xb1\xfb\x1a\x97\x73\xcc\xfc\xaa\x41\xe1\xca\xcc\x03\x22\xc5\xe6"
- "\x85\xcd\x93\xc4\xb2\x30\xa4\x83\x7d\x27\x39\xce\xd0\x56\x0b\xdb"
- "\x4a\xac\x5f\x38\x36\x7e\x1b\x6d\xf1\x62\x7e\x83\xf1\xaf\x2a\xc9"
- "\x97\x9c\x79\x60\xd3\x3a\x32\x71\x1d\xd0\x4d\xde\xa6\x7a\xa6\xed"
- "\xd6\x71\xbf\x83\xee\xd1\xd6\x77\xbd\x5c\x8f\x97\xb6\x04\xb4\xb5"
- "\xf4\x26\x6d\xed\xb2\x09\xf9\xe6\x7b\x69\x88\xf6\x4d\x9d\x51\x3f"
- "\xbe\xad\x9c\x1c\xfc\x1d\x40\x15\x23\xe8\x1e\xfe\x96\x6b\x1e\x7f"
- "\x6f\x0f\xf6\x15\xe6\x10\x5b\xea\xd1\x86\x3c\xcd\xf7\x16\xbc\xb2"
- "\xf5\x1b\xe5\x53\xbd\xc5\xcd\x34\x00\xdc\xe3\x1a\xdc\xe3\x80\x8b"
- "\xfe\xbf\x49\x8b\x4d\xbc\xf5\x90\x5e\x07\xc6\x14\x1f\x6c\xd1\x1a"
- "\xb6\x47\x81\xf7\x3e\xfc\x1a\xb6\xc9\xfd\x69\x2f\xe6\x2d\x66\xc1"
- "\x7e\x43\x7d\xdf\x36\xdb\xea\xd3\xc7\x17\xae\x5b\xc3\xfd\x18\xaf"
- "\x9f\xf1\xda\x99\x56\x17\xef\xb7\x25\xe8\x30\xf1\xbc\x2f\x7c\xe9"
- "\x6c\x3d\x60\x9a\x30\x56\xfa\xb4\x6f\x5a\x35\x6c\xbb\xc0\x3e\x66"
- "\x5e\x8c\x85\xb7\x8a\xfc\xa0\x85\xf7\x75\x86\xe8\xdf\x0c\xab\xbb"
- "\xc0\xf4\xda\xb6\xa0\x6f\xbf\x06\xe5\x41\x7f\xc8\x43\x79\x1b\x6d"
- "\x93\xdf\x49\x63\x59\xe0\xbe\xec\x46\xdf\xf0\xb7\xed\xc5\xa5\xb3"
- "\x07\x30\xcf\x1f\x72\x9a\xb6\xed\xe0\x3e\xe2\x3d\x56\xf6\xfd\x42"
- "\x9a\x99\x63\x9c\x9f\xa2\x6d\xaf\x70\xff\x30\x2e\xc2\x3d\xf2\x50"
- "\xb0\x2b\xef\x07\x7c\xbe\x95\xf5\xe1\xfa\x52\xd8\xb1\x4b\x58\x97"
- "\x54\x0e\xe2\x79\x31\x7f\x9b\x86\xef\x9d\x05\x22\x2c\xfb\x77\x1d"
- "\xf7\x6f\xe5\xa0\xf5\xed\x22\xfc\x8d\x8b\xc4\x51\x3f\xd1\x37\x06"
- "\x0a\x06\x0c\x09\x8c\xb7\xc1\x79\x96\xcf\xe0\xd6\x93\xc7\x51\x41"
- "\xa8\xd7\xb4\x75\x1d\x59\xf8\xfc\x32\x7f\x77\xa5\xc5\x5f\x4b\x2d"
- "\x45\xb5\xf4\x6f\xc1\x6a\x6a\x5c\xcd\xb1\x28\x2a\x0f\xfc\xbb\xa3"
- "\x9a\xf7\xad\x06\xe1\xfe\x25\xdb\xe3\x5c\x97\x3b\xe7\xdf\x4f\xfc"
- "\x89\xfe\xbd\xf1\x4f\x64\x7b\x52\x3e\xe7\x1d\xcb\xfb\x37\x3a\x96"
- "\xfd\x6f\xe4\x6c\x13\x61\x9e\x2b\x95\x2d\xe3\x3a\x2a\x00\xab\x9e"
- "\xcf\xfa\x5a\xc2\x9d\xd6\xc1\x68\xbf\x91\xd7\xe4\x5b\xfc\x3e\x6a"
- "\x5c\xfe\x1b\xe0\xe8\xfe\xf3\x9e\x0b\x64\x6a\x5c\xfe\x7b\x79\xaf"
- "\xe6\x30\x67\xeb\x3d\x05\xad\x6c\xa7\x05\xf9\x9c\x33\xef\xf3\xc1"
- "\x6e\x0f\x6f\x63\x1c\x43\x0a\x6f\xfe\x66\xbb\x5e\x1e\x76\x9c\x5e"
- "\x5e\xc6\x8a\xda\xcd\xf4\x00\x4e\xcd\xf3\x15\x4d\x8e\x61\x56\xa9"
- "\x70\x06\x7d\xf2\x22\xe9\xb3\x2d\xc0\xf4\xe1\xf8\x98\x61\xf4\x17"
- "\x70\xcb\x06\x0d\xc2\x7a\x1d\xc0\xd9\xa4\xad\x8b\x9a\xb6\x5e\xa0"
- "\xa4\xc6\xe5\xfc\xdd\xad\xca\xa7\xcd\xb9\x46\x53\xf8\xd2\xb9\x03"
- "\xdb\x2e\x92\x91\xfb\x8d\xf7\x42\xb6\xc9\xf7\x92\xe6\xd9\xdc\x67"
- "\xe0\x49\x1b\x7e\x69\xf8\xa5\x33\xdf\xe1\x3a\x0e\xfd\x55\x01\x3a"
- "\xb5\xa2\xaf\xea\xf9\xaa\x78\x71\x54\x1e\xc7\x80\xd0\xe6\x25\x7d"
- "\xe9\x90\xa3\xa0\x90\xdf\xb6\x85\xcc\xb8\x5b\xc3\x90\x23\x5e\x17"
- "\xd9\x53\x45\x49\x61\xd7\x96\xb4\xdd\xd0\x75\xb5\x55\xf2\x0c\xa8"
- "\x85\xd7\x0a\x77\xca\xef\x18\x54\xf6\x9e\xff\xfc\xe9\x30\x3e\x27"
- "\x57\x69\x32\xf0\x5a\x8a\x3b\xf3\xa8\xc6\xe7\x47\xbb\x5c\x55\xd0"
- "\xff\xc3\x34\x5f\xd2\xad\xf2\x1c\x2e\xcb\x7e\x7f\x36\x3a\xec\xc3"
- "\x63\x62\x57\x1e\xf1\x9e\x4a\xd2\x06\xe1\x4b\x6a\x33\x8b\x16\xff"
- "\x31\x79\x3e\xb2\xc5\x1f\x92\x7b\x2a\x78\x9f\x30\xd7\xef\x33\xc3"
- "\x9e\x3c\xce\xb4\xd3\xd3\x79\x3f\x86\xd7\xaa\xe6\xfa\x85\x6f\xde"
- "\x5a\x33\x7f\x77\x70\x84\x5c\x8f\xd7\xd2\x5b\xac\xb0\xc5\xd7\xfa"
- "\xcc\x68\x7b\xb0\x17\x56\x67\x5e\x22\xcb\x1b\xf2\xa6\xf6\xe6\xed"
- "\xcc\x33\xf2\x77\x74\xb9\xce\x88\xb4\x01\xf3\x1c\x28\xcb\x7d\xa5"
- "\xa5\x29\x3b\xb4\xaa\xf7\xfb\x8f\x6c\x7f\xb2\xcf\xb4\x28\xce\x4b"
- "\x08\x77\xe6\x19\x42\x80\x0d\xde\xb7\xc8\xef\x1f\x06\x7d\xda\xf7"
- "\x84\xda\x21\xbf\xad\x24\x2a\xf7\xe7\x22\x9f\x91\xe1\xf2\xb9\x7b"
- "\xfe\x0e\x83\x48\x7e\x2f\x6e\xec\x16\xe1\xde\x61\x6a\x2c\x7b\x12"
- "\xfc\xb4\xbd\x9d\xe5\x39\x64\x99\x74\xc2\xf6\x02\xdb\x27\xdb\x17"
- "\x31\x3d\x43\x90\xb1\x50\xf2\xa4\x13\x13\xdb\x29\xa1\x0c\x7c\xab"
- "\xd6\x75\xb6\x6f\xf0\x40\x06\x9d\x61\x01\x9b\x6f\x7b\x09\xf3\x8d"
- "\xb9\x83\xfd\xcf\x26\xb5\x4a\x9f\xaf\x94\x37\xc8\x13\x68\xa7\x63"
- "\xe5\x7f\xa1\x63\x41\x4f\xf9\xe1\x0b\x3e\xa3\xf2\xfd\x32\x32\xdc"
- "\x37\xf8\x9d\x13\xbc\x9a\x1f\xaa\xa7\xfe\xd6\xdb\x79\xce\x89\x31"
- "\xec\x6f\x6a\xfe\xb5\xbd\x5d\x9f\x6b\x5e\xb9\x0d\xd5\xd9\x1c\xab"
- "\x40\x08\x2b\x85\xab\x8a\x33\x80\x8b\x53\x74\xa5\xd3\xc4\x75\xbc"
- "\xce\x55\x6d\x85\xdd\x9f\xad\xc1\x3d\xaf\xe0\x22\xff\x15\xe0\x32"
- "\xcf\x1c\xab\x91\x7b\x3d\x68\x53\xb1\x2d\x04\xd8\xa1\x94\xe2\x85"
- "\xd0\xf1\x4e\xe7\x37\xbc\x0e\xfa\xc6\x2b\xa8\xc7\xd6\x12\x3c\x4e"
- "\x1c\xf3\x64\x4f\x18\xe3\xe3\x79\x2b\x69\x7e\x6e\xce\x73\x54\xfd"
- "\x52\x58\xa4\x5b\x30\x07\xe6\x3d\x0e\x27\xeb\x38\x9e\x5f\x97\x85"
- "\xe8\x1a\x0f\xac\x28\x3e\xa7\x0f\x18\x6b\xff\xc0\xfb\x49\xd0\x13"
- "\x21\x61\x35\x7c\x72\xc9\x4b\xec\xcb\x22\xcf\xed\x6f\xbc\x69\xe7"
- "\xd0\x0d\x74\x9f\x30\x98\xa5\x1f\x63\xb8\x72\x7b\x16\xfa\x36\x4f"
- "\xf9\xd5\x65\xb6\x46\xf8\xd4\x25\xa2\xae\x8b\xec\x53\x27\x2c\x99"
- "\xb5\xb5\x72\x2d\x6f\xd2\x89\x2e\xd7\x1b\x36\x2f\x6d\xcf\x60\xfe"
- "\xd9\xcc\xbe\xf5\x52\xc7\xbe\xb1\xc5\x97\xbc\x42\xb6\x89\xcf\x0d"
- "\x86\x57\x87\x0e\x6c\xfb\x9a\x8c\x8a\x1e\x6f\x2c\x6b\xe9\xe8\x6a"
- "\x14\xee\x15\xf2\xfb\x67\x1a\x6c\xf3\x39\x7a\x63\xba\xa8\x5c\x01"
- "\x59\x7b\x63\xb3\xea\x1b\x79\x9f\xc7\xef\x83\x3d\xe9\xb8\xaf\x3e"
- "\x51\xdb\xcd\xeb\xeb\xd5\xe5\xc2\x75\x6b\x63\xa7\x65\x05\x3d\x6a"
- "\x65\x9b\xea\x8d\x7a\xaf\xa1\x25\x43\x5b\x5b\x93\x31\x08\x62\xd7"
- "\xc4\x7a\xfb\x70\x97\x75\xb0\x07\x40\x30\x47\x4c\x3d\x43\x35\xc9"
- "\xdd\x2e\x32\xf4\xc0\x16\xec\x36\xc0\xe6\xdf\x95\x97\xb4\x75\x38"
- "\x65\xe0\xdd\xf0\x33\xf4\xc6\xc5\xa0\x81\x52\xf1\xb3\xf8\x6e\xb2"
- "\x0f\x02\xdc\x6c\x5e\x77\x6c\xbe\xc0\xeb\x46\x6f\x3e\x26\x6d\xb5"
- "\x9d\x94\x16\x06\x3c\xde\x43\xd9\x36\x9c\xd2\x78\xed\x0f\x69\xe9"
- "\xf9\x21\xb5\x97\xa8\xcf\xef\x37\x0e\xa7\x71\xd1\xf5\xbe\x71\x52"
- "\xad\x0d\xd6\xc8\x98\x69\x6b\x7c\x74\x4b\xd1\xbd\xfc\x9d\xca\x37"
- "\x8f\x0b\x57\xa2\x10\x37\x59\x0d\x6a\xbf\xff\xcd\x8f\xcd\x35\x8a"
- "\xef\xe4\xde\x19\xf8\x8d\xf7\x26\xb5\x7d\x9a\x04\x19\x7b\x21\x65"
- "\x4a\x01\x7f\xf3\x37\x62\xed\xd5\x22\xf1\xd0\xce\x4b\x87\x36\xde"
- "\xbe\x90\x61\x30\x3e\xf9\x8b\xd4\x1e\x0f\x9f\xa5\xf6\xd2\x9b\x32"
- "\x1e\xe3\xe6\x9d\x94\xf4\xfa\x4e\xb2\x34\x2f\x91\xed\x6a\x57\xb2"
- "\x68\x24\xc6\x37\xec\x66\x39\x03\x4f\x00\x6f\xae\x8f\x79\xa3\x25"
- "\x78\xbe\xd1\x59\x22\xc2\x8d\x2f\xb0\x2d\xfa\xd6\xd8\xc6\x95\x0d"
- "\x34\xaf\x2d\xa8\xce\xfd\x2d\x20\x5f\x1d\xe0\xd5\x0d\x27\xcb\x69"
- "\x7a\xeb\x4e\x4f\x21\xf1\x1e\xc0\xa8\xc6\x95\x07\x01\xfb\xad\x87"
- "\x78\x2c\xd8\x02\xfa\xa8\x31\xe1\xad\xa0\x27\xd0\x4a\xcd\x90\xef"
- "\xb9\x45\x22\xc4\x70\x90\x67\x83\x6c\xef\x2e\xab\x2d\x5f\x9d\x77"
- "\x97\x6d\xed\xdd\x3b\xd3\xda\xe1\xb9\x20\xe1\x55\x7b\x60\x95\xea"
- "\x6d\xd2\x69\xad\xf8\xeb\xad\x3f\x36\xae\xdc\x4b\xdc\x3f\x9c\x1f"
- "\xcf\x8d\x9e\x0e\xe4\x3d\x1b\xdd\x2f\x9c\x07\xef\xbe\x06\xdc\x29"
- "\x7d\xfb\xbf\xbc\x2f\xd9\x97\xa7\x76\x27\x9f\x03\x7a\x73\xf2\x2e"
- "\xd0\x48\xad\x97\xbf\xf5\x34\xe3\xea\xa5\xb7\x16\x78\x4a\xfe\x12"
- "\xdf\xcf\x13\xb2\x0f\xbe\xdf\xd0\x22\xf7\xc1\x6a\xe6\xcc\x0d\x86"
- "\x85\xd2\x67\x3b\x20\x5b\xd5\xe0\xdf\x1d\xc4\xba\x40\xea\x93\x09"
- "\xec\x5b\xb3\x23\xc1\x9c\xa0\xfa\x97\xdb\xc2\xf6\x4a\xbc\x3e\x8e"
- "\xd8\xa3\xb3\x30\xae\x7a\x1f\xf3\xf7\xf2\xc2\xbc\xcf\x3a\x1c\xf4"
- "\xee\xb1\x92\xe2\x3f\xe1\x46\xdd\x5f\x2b\x39\x9a\x64\xd5\xce\x90"
- "\x5b\x3b\x93\x27\x79\xf9\x5c\x9a\xee\x6f\x0b\xf9\x3d\x99\xaf\x7c"
- "\x98\xad\xac\xa3\xea\x0c\x4a\x76\x18\x47\xad\x6c\xaa\xf2\x73\xa8"
- "\x69\x44\xf9\xd4\xb8\xed\x4d\x84\xde\x71\x41\x4d\xa3\x3d\x6c\x47"
- "\x0a\xe8\x2a\x8c\x07\xd7\x78\xfc\xdd\xda\xb7\x0a\x77\xac\x87\x4d"
- "\x7d\x0d\x9f\x4b\xd1\x71\xbb\xba\xfd\xb4\x1d\x39\x6a\x6e\xb3\xa3"
- "\x42\x5f\xaf\x11\x16\xd0\xd8\x65\x16\x7c\x46\x8d\xcf\x1a\xf8\x93"
- "\x77\xc0\x7e\xd8\x9f\xad\xe4\x66\xc7\x01\x91\xac\xf4\x6d\x7e\x80"
- "\xbf\x11\x5f\xcd\xeb\xe6\x09\x98\x37\x5d\xc3\x6d\x06\x1c\xcc\x7f"
- "\x96\xa5\xaa\xf1\x7c\x47\xbf\xbe\xd7\x72\xce\xa4\xb7\x0d\x6d\x92"
- "\x6d\x43\x1b\x65\xdb\xb4\x6f\xf9\x9c\xa6\x9d\xf2\xec\xf2\xd5\xb5"
- "\x67\xa7\x55\xd1\x76\x87\x85\xbf\x53\x7a\x9a\x76\x7d\x29\xcf\x1f"
- "\xa0\x4f\xd4\xde\xc2\xce\x7a\x31\xf8\xf5\xc1\x57\x09\x53\xc5\x88"
- "\x76\xef\xcf\x7e\x83\xe3\xfe\x69\xdf\x03\x03\xec\x66\xe8\x72\x19"
- "\xe7\xb1\x13\xf5\xf1\xf7\x14\xfb\xf4\xd0\xae\x5c\xee\xab\x09\x0d"
- "\x94\xad\xf8\x70\xd7\x2c\x5e\xbf\x55\xf3\xbc\x9d\x7e\xe8\xde\x43"
- "\x6a\x4e\xa5\xfb\x66\x27\x48\xdf\xec\x48\x1d\x7b\x75\x38\xee\x92"
- "\xfa\x4e\xa4\xb0\xbd\xb1\xb3\x4d\x9e\x51\x03\xbe\x6b\x82\xba\xfe"
- "\xdb\xd9\xc6\x7e\x3e\xbd\x7b\xec\x6b\xc1\x2b\x65\xea\xcc\x6e\x97"
- "\x6b\xd7\x26\xdd\x46\x91\xdf\x7f\x72\x89\xa3\x9c\x6f\xde\xda\xf3"
- "\x72\x0f\x7e\x9b\x3c\x5f\x7e\x46\x3b\xdf\xb4\x6b\x87\xb6\x9e\x91"
- "\xce\x7e\xf1\x28\xdb\xe8\xa5\x4f\xa4\x3f\x0f\xd3\x80\xeb\x96\xb8"
- "\xcb\x6f\x30\xed\x3a\xd9\xb7\x97\xb2\xf3\x90\x4c\x97\xbe\xa2\xbb"
- "\xfc\x3a\x8f\xa0\xbd\xd7\xa8\x38\x8c\x3b\x9f\x3e\x32\x8e\x24\x0f"
- "\x74\x0a\xeb\xe0\xd1\xb5\xcc\x93\xb5\x23\x22\xe9\x34\x2f\x18\x76"
- "\x2a\x1d\xb4\xcb\x28\xa4\xac\xef\x32\x7e\xbb\x3d\x51\xfb\x92\x6e"
- "\x8b\x28\x3a\x5b\xa0\x5f\xea\xa6\x49\x5a\xbb\x47\x06\x38\x1e\xc6"
- "\xcb\x65\x1c\xdf\x67\x77\x26\xc7\x51\x0a\xba\x47\x59\x43\x7c\x16"
- "\x0e\xe3\x6c\xd8\x3d\x2a\xfd\x74\x11\x19\xf2\x8b\x78\xff\x68\xf9"
- "\x71\x9e\x5f\x09\x27\x6c\x81\x14\xd8\x27\x90\xf3\xf5\x4b\xc9\xfc"
- "\xb4\x1d\xb0\x9d\xe9\xa9\x1c\xe7\x88\x63\x1c\x71\x9c\xb2\x90\x33"
- "\x3d\x05\xf7\xc3\x60\xcf\x59\x84\x65\x94\x89\x7d\x50\x42\x2e\x01"
- "\x7d\x7c\x92\x63\x2d\x19\x3c\xbe\x00\xad\x3f\x4b\x26\x8e\xa3\x14"
- "\xac\x5c\xde\xde\xe2\xff\xab\x9c\x5b\x0c\x2d\x82\x3d\x1d\xa6\x11"
- "\xa0\xb9\x35\x9c\xbc\xfc\xb8\x2f\x79\xf9\x09\xd5\xee\xf3\x42\xb5"
- "\x5b\xe1\xcd\xf8\x2b\x1d\x97\x96\x5e\x26\x71\xdf\xf3\x79\x10\xf0"
- "\xc3\xee\xb1\x69\x21\xf7\x58\x9b\x3a\x43\x77\x8c\xca\x4a\x44\xbb"
- "\x07\xb6\x31\xfb\x44\xf2\x39\x49\xf6\x71\xe1\x36\x72\xfb\xb8\xee"
- "\x7f\xbf\x70\x56\xc6\x85\x0a\xe2\xd9\x59\xa8\x95\xe9\x40\x99\x8e"
- "\x63\xd4\xed\x1e\x2b\xdb\xde\xe2\x57\x65\xf3\xe5\x3d\x97\x8f\xa0"
- "\x83\xd6\xe6\x5e\x3a\xa0\xed\xdc\x3e\x6e\x7f\x90\x69\x02\x1a\x68"
- "\x6d\xb5\xf6\x68\xed\xe4\x36\xfe\x1b\x46\x9d\x9d\x68\x27\xda\x2a"
- "\xdb\xd9\x83\x76\x1e\xb5\x13\x05\xaa\x76\xd8\xbe\x49\x19\x6b\xe3"
- "\xf9\xa1\xf3\x8f\xb0\xa3\x4b\xdd\x84\x79\xa0\xf1\xbd\x32\xb7\xe1"
- "\xa7\xb0\x4d\xca\x7c\x98\x0f\xfa\x44\x3b\xdb\xfb\x9e\x22\xfc\x82"
- "\xb5\xd2\xc6\x91\xf6\x31\x7f\x8f\xf3\x25\xb4\x29\xfc\x25\x95\xb5"
- "\x8b\x76\xd8\xa6\x01\x4f\x10\x79\xec\x68\x3f\xe6\x8f\xa7\x35\xfc"
- "\x39\xef\xfa\xaf\x55\xbb\xcc\x85\x94\xfa\xd9\x93\x15\x06\x4f\x6b"
- "\x05\xe9\x6d\x79\x06\xf9\xd0\x1e\x2b\x60\x0d\x91\x31\xf0\xd1\xce"
- "\x5d\xc0\x33\x10\xd1\xa6\xe6\x8e\x00\x60\x7e\x4e\x83\x73\x29\x61"
- "\xe7\x39\xb4\xe3\x1c\x59\xdd\x65\xb0\xbf\x1e\x61\x7b\x71\xcf\x90"
- "\x6b\xf3\x28\xcd\x4b\xbb\x53\x15\xdf\xc9\x18\x2d\xd7\x9f\xa1\xba"
- "\x3b\x7b\xe3\xb0\x70\x6c\xab\xe4\xe5\x1d\xcc\x47\x32\x1e\x0b\x8f"
- "\x19\x5d\xe0\x19\xf6\x4f\x59\x83\x3a\xba\xd2\x87\x49\x7c\x5c\x93"
- "\x09\xcf\x49\x78\xe6\xef\xf3\xa4\xf2\x9a\x00\xca\xb5\x0b\xd0\x8c"
- "\xe1\x8b\x4a\x3e\x67\xb0\x3b\x95\x69\x18\xf7\xfc\xc6\xfb\x94\x85"
- "\x3a\x5a\x79\xee\x7b\xa0\xcc\x67\x78\xe5\x7d\x1a\x77\x75\x3a\xa5"
- "\xae\xa0\x3f\xfd\xcd\x7b\x01\x0c\x0f\x6d\x4b\x39\x43\xf5\x0f\x45"
- "\xcb\x98\x4d\xea\x32\xa5\x07\xeb\x2d\xbc\xfe\x7e\x95\xf5\x4a\x1b"
- "\x8e\xfd\x88\xae\xae\x5c\x7d\xaa\x8e\x07\x60\x1c\xef\x0f\xf7\xab"
- "\xa7\x43\x7d\x61\x7f\xb0\xb6\xbc\x29\x63\x73\x39\xb7\xbe\xc9\x3e"
- "\x7e\x3b\x4c\x47\xac\x1c\x2f\x19\x63\xe7\x5e\x3f\x15\xef\x26\x93"
- "\xf3\x2c\xaf\xc9\xcc\xa1\x23\xb5\x19\xb4\x07\x73\x72\xd1\x99\x9e"
- "\xb2\xfd\x02\xfb\x13\x28\x1d\xc2\x36\x29\x9f\x63\x13\xc5\xe9\x96"
- "\x6d\x6f\xea\x36\xfc\xdb\x77\x96\x5e\x24\x83\xfa\x1e\xc5\xdb\x93"
- "\x67\xda\x44\xb0\xda\x10\xb6\xd7\x72\x7c\xa1\x94\xed\xb9\x1c\x5f"
- "\x48\x8f\xd9\x23\x6d\x1f\x07\x64\xae\xd3\x3a\x78\xcb\x4a\x1a\xc7"
- "\x71\xc6\xcc\x3e\x65\xcb\xa9\xf1\xfa\xed\x02\xe0\x67\xd1\xf6\xd0"
- "\x2d\x2a\x8e\x4f\x5d\x43\xdd\x05\xd4\xa5\xde\xbf\x11\xc2\x1c\x46"
- "\xc2\x5d\x49\x69\xb5\x17\x28\x9d\xed\xa0\xfc\x2f\x95\xcd\xc6\xf3"
- "\xc2\x39\x1d\x66\x11\xfa\x3f\xe9\xb4\xfb\x4c\x5f\x1c\x32\x5f\x31"
- "\xc7\x2e\x13\xfd\x7d\xc3\x3b\x69\xdb\x30\xe9\x47\x23\x63\x5f\xa8"
- "\xef\x95\x11\x55\x57\x91\x91\xbf\xcf\xc9\x6b\x79\xbc\x36\xcc\x67"
- "\x69\xd4\x18\xf2\x8e\x51\x8f\xcf\xd4\xef\xde\x9c\x5b\xcd\x77\xc2"
- "\xd7\x60\xfe\xe5\xeb\x6a\x6c\x5c\xcd\x63\xc6\x3b\xb3\xf9\xfc\x4e"
- "\xdf\x1c\xe7\x9d\xf1\xfc\x8e\xd3\xd8\xbf\x3c\x5b\xd2\xf2\x9d\x12"
- "\x9e\xf7\x68\x73\xc6\xcf\x6c\xbd\x69\xca\x86\xe1\xb1\x8c\x71\xa8"
- "\x53\xeb\xc8\x43\x81\x8b\x5b\x1f\xcf\x78\x5c\x57\xdf\x06\x7d\x67"
- "\xaf\xd7\x70\xdc\x7e\x05\xfc\x2c\xda\xb7\x75\xf9\x4c\x7a\x36\xf2"
- "\x9f\xd0\xc7\x37\xf9\xed\x87\x8d\xc3\x1f\x28\x5e\x4b\x23\x1e\xbd"
- "\xd1\x24\x63\x1e\xf0\x37\x1e\xd5\xb8\xfb\x4e\xb0\x6f\x8f\x2a\x5b"
- "\xd2\x5b\x7e\xd7\x8d\xe7\x18\x06\x8c\xc1\x2a\xd6\x58\x87\x1a\x7f"
- "\xf5\xf3\xc5\x3f\xbb\xb1\xaf\x9e\x9f\x4d\xeb\x1d\x47\x51\x07\xfb"
- "\x4a\x30\x7c\x65\x9b\xbc\xc3\x65\x7d\x3c\xb7\x52\xe3\xeb\x3b\xbe"
- "\x2b\xd8\x62\xe9\x4c\xdf\xb0\x36\x9f\xf4\x74\xfc\x5d\xd1\xd7\x41"
- "\x89\x13\xab\xc9\xfa\x59\x99\xd7\x38\x54\xc5\xcc\x31\xa3\xfe\x2d"
- "\xfc\x9e\x79\xbd\x71\x02\xaf\xc5\xfd\xec\x2b\x0f\x8f\xdb\x3d\x79"
- "\x49\x73\x79\xae\x2f\x6d\xf1\x9f\xb5\x8e\x47\x39\xa4\xa5\x7c\x7a"
- "\x2e\x60\xdc\xb6\x8e\xc6\xf1\xf7\x13\x91\x2e\xbf\x0d\xe5\xbb\xe1"
- "\xc5\xae\xd1\xa9\x64\x1d\x5d\xcd\x3e\xf6\x7b\x09\xf3\x4b\xb9\xfe"
- "\x23\xeb\xaf\xda\x5f\xc4\x71\xd6\x3e\xe8\xf6\x0e\x50\x7d\xb5\x77"
- "\x37\x9e\xd3\x23\x9e\xef\xd6\xd7\xf2\xbd\xb4\xb7\x56\xee\x07\xb2"
- "\x1f\xf1\x72\x1e\xaf\xb7\xfb\xfa\x7c\x6f\xf6\xee\x56\xb8\xec\xdd"
- "\x7d\xa4\x88\x78\xad\xfa\xc4\x1e\x19\x33\x69\x6f\x91\x97\xde\x39"
- "\xa0\xad\xc7\x1c\x97\x7c\xc5\xf6\xee\xab\x3c\x07\xfb\x7b\xe3\x16"
- "\xe4\xe3\x71\x22\xdf\x41\xd9\xca\x86\xaf\x36\x85\xc1\x3f\x7d\xed"
- "\xdf\x3b\x88\xd7\xfa\xe2\xea\xc4\x9d\x44\xb2\x4c\xe5\xf6\x1c\xe9"
- "\xc7\x55\xf9\xde\x71\x5c\x4d\xe0\x35\x1f\xae\x49\xb8\xf2\xbc\xc9"
- "\x82\xf7\x01\x5c\xa1\xbf\xf7\x1f\x60\xbe\xc4\x1c\xd6\x8a\x79\x02"
- "\xef\x2d\x66\xf7\x77\xfe\x8f\x69\xe3\xd9\xf4\x38\x29\xbf\xd4\x77"
- "\xcb\x9b\xd1\x9b\xf3\x76\x13\x15\x07\x45\xb7\xed\x16\x3e\x67\xf3"
- "\x6e\xb9\x73\x37\xfb\x83\xbc\x3b\x3f\xda\x1f\xe4\x5d\xdc\xbd\x7b"
- "\x90\xe8\xe7\x26\xfc\xb2\x70\x5f\xde\xf7\xfb\x79\x49\x97\xeb\x5d"
- "\xcc\x57\xf7\x4a\x1b\xeb\xea\x74\xe2\xbb\x6a\x7f\x9d\xe7\x45\xc9"
- "\xc5\x16\xd5\xde\xfd\x36\x3c\x9b\x44\xf2\xfe\x85\x5a\x7b\x2d\x78"
- "\xb6\xd8\x9c\x18\xd7\x92\x41\x93\xe1\x68\x73\xf2\x7b\xc7\xb9\xbd"
- "\x8c\x6f\x67\x72\xb5\x2f\xf2\xec\x23\xc3\xe4\xf6\xfb\x92\xab\x19"
- "\x1e\x89\x09\x0f\xd4\xeb\xf4\xd4\xe8\xc4\xfb\x46\x86\x4e\xc0\x50"
- "\x76\x10\xf2\x03\x86\x9e\xbf\x97\xf6\xc3\xf9\x5b\x06\xe8\x53\xe4"
- "\xc3\x9c\xd8\xa4\x9f\xab\xec\x72\xfd\xbc\xf0\x77\x85\x6a\xff\x80"
- "\xcb\xfa\x23\xca\x72\xac\x81\x78\xe5\x51\xa7\x49\xd5\x59\xed\x3b"
- "\x4d\xef\x6e\x50\xf5\xfe\x7c\x61\x7f\xb2\x54\x36\x12\xf6\x5d\xad"
- "\x97\xe3\x11\xb0\x3d\x34\xcd\x33\xc2\x4f\x9e\xda\x30\xc6\xfc\x6a"
- "\x5b\x76\x99\x68\x3c\x4d\xff\x34\xb2\x25\xd0\x7e\x95\xe3\xe1\xcf"
- "\xd5\x37\xc2\xba\xcb\xc9\x53\x3a\x49\x7e\x37\xf8\x1c\xed\xfb\x91"
- "\xc7\x27\xe3\x6f\xf3\xfd\x74\x7e\xcf\xbe\x0f\x3c\x36\x60\x8e\xdd"
- "\x1b\xbf\x2e\x8c\xbc\x7b\x38\x1d\x69\x1e\xbf\x4f\xc6\xb9\xeb\xf3"
- "\xcd\xde\x9e\xae\x64\x6a\xdf\x20\x79\xee\x9d\xf1\x0d\xfe\xa0\x91"
- "\x71\x86\x2c\xa5\x73\x1b\x9c\x98\xff\x79\x82\x5d\x8d\x2c\x13\xb6"
- "\xd5\xbc\x56\xf8\x4f\x5f\x82\xef\x44\xb8\x72\x7b\xfa\xd5\xb5\xe1"
- "\x9f\xe4\x9c\xc6\x19\x14\xe7\x7c\xc9\xdb\xd3\xd9\x26\xd9\x56\x36"
- "\xc0\x34\xa3\x56\x34\x76\xa6\x54\xdb\xba\x5c\xfb\x4c\xbf\x73\xa8"
- "\xbe\xb9\x3a\xb8\xfb\x4c\x7a\xdb\xf7\x68\x6d\x47\x5d\x72\x6f\x6e"
- "\x62\x8d\x8a\xeb\x87\x3c\xd9\xfd\xae\x59\xa1\x9f\xd9\x1e\x60\xbf"
- "\x51\x8d\x16\xee\xde\xb1\xe1\xea\xf0\xb8\x2c\x66\x5a\x9c\x3a\x7a"
- "\xb4\x3a\xfc\xff\xc5\x3a\xfc\x57\xaa\x03\xba\xe1\xe6\x33\xf4\x8b"
- "\xf2\xab\x9f\x3b\xfe\x62\xb6\xe4\x15\x77\xb5\x45\xe9\xcc\x7f\xfe"
- "\x3a\x84\xf9\x5b\xd0\xb2\xdf\x26\xbf\xf1\x63\xa0\x72\x8e\x71\x18"
- "\x74\x17\x5b\x9a\x1d\xdd\xd4\xb8\xfa\x4f\xd4\x46\xbf\xf8\x98\xcb"
- "\x34\x97\xf0\x9c\x6d\xff\xc2\x9e\xaa\xea\xa2\x1e\xc3\xbe\xe3\x4c"
- "\xef\xdd\xe8\x87\x5d\x11\x7c\xd6\xe2\xff\x13\x79\x16\xf2\xfa\xea"
- "\x71\x5e\xd7\x5e\x08\xfd\x60\x0b\x43\x37\xc0\x46\x0f\x49\x7a\xc0"
- "\x7e\x51\xf3\xad\x1d\x26\x39\xdf\xf2\xc9\x33\x7f\x43\x64\xec\x42"
- "\x57\xe1\x31\x5e\xfb\x0e\xf5\xe4\x81\x47\x28\x97\x63\x1a\xf2\xba"
- "\xb3\xb0\x64\x1e\x9c\x17\x4c\x14\x72\x3e\x05\xdb\x9f\x63\x1a\x7a"
- "\x30\xab\x0c\xc1\x8e\xae\xbd\x44\xa9\xb5\xb0\x3d\xa1\xb3\x2d\xac"
- "\xd7\xeb\xb4\xb8\x86\x5b\x2e\xf5\xc5\x35\xdc\xc3\x6b\x3d\xad\xb8"
- "\xbf\x44\xc6\x50\xe5\x0e\xd3\xae\x4b\x94\xb6\x7b\x35\xa5\xef\xe2"
- "\xb5\xbc\xaf\x94\xed\xc3\x76\x85\x8c\x71\xb8\x22\x9d\xd7\xf3\xfb"
- "\x6c\x9f\x35\x1c\x83\xb5\x57\x6f\xc9\xb9\xe8\xd5\xd1\xfb\x9f\xe5"
- "\x38\x18\x74\x6f\xcf\x09\x5a\xde\x3b\x0e\xda\xf9\xd0\x07\x3e\xd0"
- "\xaf\x30\x5e\xdf\xea\xbe\x4d\xd5\x11\x71\x29\x7f\x97\xa6\xf4\xbb"
- "\x97\xf6\x4f\xee\x8f\x27\x42\xbb\xf2\x68\x62\x07\x65\x28\x7f\x85"
- "\x41\x18\x13\xf7\xd7\xf0\xfe\x79\xd9\x32\xb2\x86\x76\x2d\x48\x70"
- "\xbe\x4d\x89\xfc\x4d\x69\xfe\x95\x7d\x2d\xda\x27\x16\x52\x06\xef"
- "\x3f\xb0\x4f\x83\xed\x65\x99\x7f\x69\x5a\x29\x65\x44\xc2\xce\x51"
- "\xce\x46\x53\x6d\x0f\x2d\x7f\x6e\xc5\xb2\xa2\x45\x25\x4b\x9f\x5d"
- "\x5a\xb8\xb4\x64\xad\x0c\x1b\x30\x4e\xfe\x7b\x70\x4c\xc1\x7c\xb9"
- "\xe9\x1c\x61\x5f\xa4\xf5\xad\xc7\x35\x8c\x0c\xf1\xfa\xc1\x55\xd1"
- "\x6b\x7f\x87\xb6\x8f\xe6\xdb\x2d\xf7\x95\x1a\x26\x7b\x0d\x1e\xe9"
- "\xa3\xb4\x45\xc5\x90\x69\x57\x7e\x0c\x2a\x5f\xd8\xbd\x9f\x63\x10"
- "\x4d\x3b\x45\x1f\x58\x78\x3f\x04\x7d\x05\xbd\x79\x86\x60\x87\x4c"
- "\xe3\x7d\x96\x66\x5e\xcb\x90\xb6\x6f\xc3\xdb\x72\x0c\x3b\x27\xe3"
- "\x50\xed\x3d\x85\x67\xf6\x7b\x0f\x8b\xbc\x5d\xa1\x15\xd6\xbd\xe1"
- "\x15\xd6\x9f\x0b\x91\xb7\x33\x7c\xde\xbe\x4b\x9c\xb7\xef\x14\xee"
- "\x51\x39\x90\xb1\x11\x67\xa8\xe1\xa3\xa0\x8b\x6e\xc0\x6f\x60\x5f"
- "\x0c\x81\x86\x7f\x9d\xdd\x26\x7a\xf0\x0b\x0b\xf7\x68\x7b\xc4\x1e"
- "\x1a\xbf\x93\x67\x36\x8a\x56\xb2\x2f\x55\x43\x88\xeb\x16\x55\xa3"
- "\x9f\xf7\x39\xed\x89\xc8\x1f\x52\xb8\xbc\x77\xa3\x67\xd3\x69\x52"
- "\xfb\xa6\xef\x59\x1b\xe5\x9a\xf1\x7b\xbf\xe4\x72\xbc\xcf\xc6\x36"
- "\xb4\xa7\x8d\xe7\x16\xfb\xf7\xb2\x1f\x1e\xdb\xcf\xbb\x53\xc8\xe2"
- "\x4e\xa1\xa4\x2e\xd7\x7b\x33\x7b\x7d\x2c\x2c\x6a\x4c\xe5\x71\x8d"
- "\x63\x11\x43\xe7\x74\xf1\x18\xc9\x78\x30\x9f\x02\x66\x11\xef\xc1"
- "\xa9\x73\x45\xef\x95\x7a\xa9\xd0\x77\xf5\x3a\xf7\x3d\x19\xdb\x46"
- "\x18\x9c\x62\xe2\x66\x5a\x28\xf7\x47\x95\xcf\xa1\x11\x72\xb9\x4f"
- "\xb5\xe7\xfd\xaf\xe4\xfe\xf9\xea\xb3\xf5\x90\x9b\xf2\xba\x6e\x4a"
- "\x0a\xbb\x33\x1b\xd8\x8e\x69\x2e\x95\xfb\xca\x26\x94\x63\xbf\x00"
- "\x75\x2e\x4f\xc6\xb9\xfe\x13\xd5\x5d\x24\x63\x1b\xbd\x17\xe0\xb5"
- "\xf6\x3e\xda\xbe\x3f\x87\xf7\x56\x44\x95\xcd\x6b\x2e\x35\x54\x30"
- "\x8c\xf0\xa5\x73\x59\x7a\x39\x8c\xdd\x03\xb9\xdc\x29\x7a\x3f\x53"
- "\x96\xe3\xbc\xf2\xfb\x88\x96\x05\x18\xc7\x72\x38\x7f\x10\xcf\x7b"
- "\xc2\x96\x5c\x01\x79\x0b\xad\x0e\x1d\xc0\xbb\xf9\xd0\x77\x3e\xa4"
- "\xe5\xc9\x35\x5e\xcc\xcb\x65\xbc\x13\xcb\x0a\xf2\x78\xff\xde\x28"
- "\xf1\x61\x3f\xd6\x12\xe8\x26\x69\xf7\xbd\xff\xca\x9e\xaf\xc8\x58"
- "\xb4\x84\xfb\xf0\x03\xab\xc6\x37\xfb\x14\x7e\x1f\xdc\xd8\x59\x35"
- "\xd6\xd6\x69\xa9\x26\xbf\xc1\x44\x47\xac\xec\x77\xbf\xff\xc0\x11"
- "\x6b\x37\xe6\x0e\xef\x7b\xbd\x46\x5b\xae\xb2\x39\x54\x39\xde\xdb"
- "\x81\x3d\xda\x91\x68\xb5\xcc\xed\x72\x7d\x40\xba\x7f\x05\x7f\x53"
- "\x9c\xf7\x78\x40\xdf\x56\xa6\x9b\x97\x1a\x0a\xe5\x3a\xff\xc6\xa7"
- "\xda\xd1\x9e\x6b\xd8\x07\x8e\xe9\xcc\xe7\x1b\xcc\xb8\x17\xab\x45"
- "\x96\x39\x98\x6d\xa8\x93\xe7\x1a\xe5\x79\xf9\xc9\x5a\xcc\x96\x0c"
- "\x2d\x86\xcb\x38\x7e\x56\xe7\xed\x3f\xe8\x3d\xff\xcf\x71\x6a\xd8"
- "\x77\x20\xa4\xf9\xd5\xc9\xf8\x2d\x17\xd4\xfe\x28\xfb\xd5\xf1\xfa"
- "\x20\x9f\x0f\xe4\x3d\x4c\x94\xab\xef\xf5\x73\x94\xe7\x62\x3e\x38"
- "\xa0\xc7\x6d\xc1\xfd\xe1\x5e\x7f\x1d\xb4\xbd\xd3\xbd\x3d\xe0\xb7"
- "\xec\x3f\xe0\x77\x6f\xc7\xdc\xe4\x83\x56\xc8\xed\x95\xe2\x06\xf2"
- "\xf7\x5d\x88\x63\x59\x84\x53\x32\x5b\x39\x9e\xc5\x11\x3f\x69\x67"
- "\x82\x0f\xdc\xad\x9d\x1f\x4f\x3c\x47\x1f\x5c\xec\xdb\x4b\x0c\x69"
- "\xeb\x60\x07\x16\x2a\x3b\xec\xc0\x42\xb9\x0e\x56\xb5\xdd\xfb\xb3"
- "\x75\x01\xc3\x81\x75\x5e\x83\x3a\x27\x70\x60\xbe\x97\x0e\x55\xe8"
- "\xfe\x28\xc8\x97\xda\x5f\x2c\x2b\xe1\x9e\xd2\xa0\x60\xfe\x52\xae"
- "\x61\xf4\xcd\x6b\x7e\xa9\xf6\xc9\x36\x0e\x5f\x18\xe6\x31\x30\xa5"
- "\xd8\x26\x7d\x2b\x8a\x2e\xf0\x7a\xd8\x35\x6a\x8e\xa5\xf2\x68\x7e"
- "\x91\xd7\x9d\x89\x7e\x4e\xe1\x67\x45\xb3\x03\x6d\xfa\xda\xfa\x56"
- "\x43\x98\x63\x1b\x0b\x67\xbd\xf0\x7b\x8a\xfc\x04\xfb\xca\xe7\xc1"
- "\x98\x8a\x3a\x04\xf4\xc3\x40\x94\xb9\x91\x69\xaf\x64\xe8\x97\x5b"
- "\x24\x4e\xae\xfb\x84\x93\xed\x4a\x1f\xfb\x76\x5c\x20\xe4\x4b\x46"
- "\xbe\x59\x4d\xa5\x1d\xec\x9f\x52\xcf\x31\xe4\xda\xb4\xba\x7d\xc9"
- "\x53\x1a\x46\x27\xd1\xc2\x2e\xd7\x2f\xf3\xbc\xb4\xd1\x7a\xf5\xb2"
- "\xfd\xcb\xbc\x2b\xd9\x18\x6a\xcc\xcb\xa6\xfe\xe6\x29\x3c\x0f\x9d"
- "\x80\xfa\xe7\x08\xc6\xff\x57\xb3\x82\x86\x00\xf5\x18\x06\x8a\xef"
- "\x97\x3b\x28\xe8\x1a\x28\x42\xeb\xd0\x5f\x9d\x56\xe8\xe3\x63\xd4"
- "\x12\x6c\x92\xbe\x1f\x90\x59\x73\x99\x5f\x5c\xf0\x04\x0f\x4a\x5f"
- "\x58\x75\x66\xfc\x57\xd3\x3d\xc1\x4f\xa8\xa5\xc8\x47\xac\x17\x4e"
- "\xd1\xaf\xc6\x32\x5e\x13\x8a\xca\x69\xfc\x39\x7e\xff\xcb\x76\x35"
- "\xfe\xfd\x6a\xa6\x76\x4d\xe5\x58\x83\x91\x38\x3d\xb8\x6a\xf9\x73"
- "\x25\x4b\x57\x2c\x1f\x3f\x7b\xf1\xea\xc5\x85\xb6\x47\x94\x2b\x5d"
- "\xd4\xb8\x64\xea\x8b\xa1\xfc\xa1\x1c\x2b\xd8\x06\xe1\x58\xca\x57"
- "\x8a\xa3\xac\xc7\x50\x86\x5e\x4b\xe3\x75\xbb\xff\xc9\x38\xca\xba"
- "\x8d\xc1\x31\x94\xfb\xd6\xb0\x3f\x3c\xde\x2b\x03\xe1\xcf\xba\xf8"
- "\x99\xcf\x49\x86\x5d\xbf\xca\x65\x39\xda\x23\xfd\xce\x3e\xcc\x89"
- "\x8c\xfb\xc3\x3e\x76\xbc\xee\x81\xf4\x85\xfa\x99\x54\xf0\x22\xc6"
- "\x8a\x0f\x8b\xfa\xce\xc8\x7c\x08\xfd\xff\xcb\xc3\x4a\x7e\x65\xde"
- "\xcd\xfa\x5e\xaf\xf6\xed\x2a\xb9\x37\x1d\x76\x75\xcd\x54\xeb\x2b"
- "\x1f\x56\xee\x09\x0f\x34\xa9\xb5\xfd\x0f\x0f\xe9\xe7\xaf\x94\x6c"
- "\x7e\xa6\xc9\xe6\x87\xc7\xaf\xb4\x1f\xdf\x27\x1b\x07\x93\xfa\xe4"
- "\xfa\x6f\x5a\xd9\x83\x49\xdf\xb6\x97\xaf\xd9\xb9\xd7\x9f\xa1\x7f"
- "\x19\xc9\x6b\x2e\xb8\xbf\x15\xf7\xf2\xdc\xa7\xf2\x45\xff\xe8\x4b"
- "\xed\x1e\x75\x7c\xd4\xac\xdd\xdf\x84\xfb\x8f\xb4\xfb\xe1\xb8\xdf"
- "\xad\xdd\x43\x66\x3f\x7a\x45\xbb\x4f\xc5\xfd\x32\xed\x1e\x3a\xfe"
- "\xa3\xc7\xb4\xfb\x61\xb8\x9f\xae\xdd\xdf\x88\xfb\x31\xda\x3d\x64"
- "\xf0\xa3\x21\xda\xbe\x28\xc6\xd5\x83\xdf\x5c\xbd\xdd\x7d\xb0\x49"
- "\xed\xbd\x7d\x64\x84\xae\xd4\xce\xaa\xf5\xa6\x59\xc1\xd3\x76\x9d"
- "\xbe\x48\xe7\xb3\xe6\x98\xc3\x7e\x94\xe1\xa5\x77\x2c\x11\xe9\x0d"
- "\x5a\xfe\x1c\x8c\x2f\x6d\x11\xe9\xf5\x5a\xfa\x42\xd8\x96\x93\x23"
- "\xd2\xab\xb5\x74\x07\xf4\x62\x61\x44\x7a\x85\x96\xee\xf6\x52\xed"
- "\xcc\x88\xf4\x52\x2d\x7d\x9f\xee\x87\xa0\xa5\x17\x69\xe9\x8d\x48"
- "\xf7\x47\xa4\x17\x68\xe9\xd0\xff\x1f\x9e\x8c\x48\x97\x7a\x65\x9b"
- "\x3c\xb7\x65\x16\x47\x4a\x59\xb6\x3e\xe2\x3d\xc2\x48\x9c\x67\xab"
- "\xb2\xff\x92\x8a\xf4\xa4\x88\xf4\x6c\x2d\x7d\x9c\x97\xbe\xdc\x1b"
- "\x91\xde\xaf\xed\x9b\x50\x43\x0b\xfb\x5b\x9b\xe4\x6f\xfd\x48\xff"
- "\x47\x69\x33\xfe\x7a\x29\x9f\xe9\x32\xef\x16\xa7\x6c\x65\x42\x9c"
- "\xa2\x5f\xe7\x6a\x7e\x7f\xb5\xec\x87\xa5\xce\xc6\xfd\x3a\x4b\x9e"
- "\x97\xe2\x38\x86\x7c\x5e\x6e\x1d\xa7\xfd\x8b\x8c\x95\x37\xd1\x51"
- "\xae\x62\x1c\x2a\xbf\xd2\x0e\x39\x47\xd7\xf6\x2f\x91\x87\xbf\x91"
- "\x48\x0c\x87\xd7\xf1\x3c\x25\xdd\xd2\xd7\x91\xe7\x48\x9c\xc6\x73"
- "\x55\x79\x86\x2a\x62\xae\xa4\xf4\xfe\xaf\x97\x86\xf9\x8c\xbb\x4b"
- "\xcd\xe7\x59\x16\x39\x3f\xfb\xdc\x44\xe6\xf5\xd2\xaf\xe5\x3c\x37"
- "\xd1\x9a\xfc\x6e\x97\xeb\xd7\x39\x7d\xe7\x7a\xfe\xa5\x5e\x4b\xdf"
- "\x8b\xf4\x85\x11\xe9\x9b\xfb\xd7\xed\xd0\x77\x96\x91\xe9\x3d\x97"
- "\x84\x3f\x78\x49\x04\xb6\xfe\x07\xf0\x5e\x22\xcf\xa8\xdc\x12\x72"
- "\x8f\xcc\xd2\xe2\x45\x7c\x11\x5c\x2d\x7c\xd0\xd9\x1c\xa7\xff\xda"
- "\xb9\x7e\x1f\xcd\x2d\xea\x12\x5b\x9e\x65\xff\xb9\x8b\x32\x76\x92"
- "\xb3\x83\x63\x18\xb3\x4f\x96\x9f\xf7\x7d\x92\x5a\x30\xc6\xed\x59"
- "\xc2\xef\xff\x4a\x73\xec\xb0\xbd\xed\x21\xda\x03\xd8\xbb\x9f\xd5"
- "\xfd\x21\x39\x06\xbc\xe6\xa3\x08\x1c\xb8\x3e\xa7\xfc\xde\xc6\x21"
- "\x19\x9b\x83\xbf\x27\x26\x2a\xdf\xf3\x8a\xdf\xb3\xfd\xba\x3d\xc3"
- "\xbc\x81\x6c\x18\xdb\xa7\xe1\xde\xa6\x7e\x78\x87\xf4\xfe\xda\xa4"
- "\x64\xf9\x90\x43\xe9\x9a\x91\xfb\x94\xbe\x38\xe4\x10\xef\xf0\x19"
- "\x9d\x43\xa5\x28\xdb\xea\x4b\xde\x1e\xd7\xaf\x6a\xfd\x6e\x32\xf4"
- "\x54\xc1\x36\x39\x77\xc8\xa0\xf4\xd3\xc7\xf6\xb0\xc1\xb4\x81\xd7"
- "\x0b\x65\xac\xfd\xaa\xcc\xf6\x86\xe5\x01\x43\xf3\xba\x36\x3e\xb5"
- "\x6d\x5d\x10\x60\xff\xef\x43\x5f\x0d\x2d\xe1\x58\x8d\xdb\xbd\xb0"
- "\x3b\x0d\x1f\xe2\xfd\xa7\xcb\x0f\x19\x82\xd2\x5e\xf9\xd8\x2e\xd7"
- "\x98\xdc\x99\x87\x79\x0c\xf1\xb4\x86\xd8\x66\x4e\x82\xcd\xdc\x00"
- "\xfd\x6f\x0a\xad\xb1\xa7\x04\x8b\xed\xd7\xee\x5e\x49\x49\xa1\xe2"
- "\xf4\xd4\xed\x97\x28\x4b\x1f\x7f\x30\x37\xcd\x10\x5d\xd6\xc1\xdb"
- "\x30\xa6\xf0\xdc\x75\x68\x82\x45\xee\xa5\xf1\x7d\xd8\x50\x97\xbb"
- "\x67\xf5\x95\xbf\x1b\x12\xc2\x9c\x95\x63\xf9\x32\x2e\xf1\xda\xba"
- "\x79\x27\xe6\xc1\xda\x99\xd2\xb2\x2f\x69\x18\xec\x5c\xc3\xd0\x8b"
- "\xa2\xf1\x4c\x21\x19\xf8\x5b\x0b\x65\x8b\xe5\xfa\xd0\x80\x66\x7b"
- "\x90\x3c\x8e\xbf\x50\xd9\x4a\xee\xa3\x8f\x3f\x61\x3b\x8d\xfd\x21"
- "\x91\xdf\x72\x86\x3e\x6e\x36\x07\x30\x66\x04\x60\x3b\xbf\xc0\x73"
- "\xbd\x8f\xbf\xf0\xcb\x58\xa2\xbf\x49\x63\x9f\xf0\xc6\x95\x0f\x70"
- "\x5a\xc8\xf9\xa5\xf4\x79\xad\x57\xb2\xf5\x71\x2b\x3f\x3b\xf9\x8c"
- "\x6b\xca\x5d\x6d\xef\x77\x07\x06\xa8\x35\x88\x8f\xff\xac\xfa\x6c"
- "\xfb\x71\x35\xe7\xfa\xf8\xb2\xb3\x78\xbd\x6b\xa3\xee\x31\x39\x82"
- "\xe3\x4b\xd7\x06\x69\xae\x5f\x78\xe5\x3e\x25\x9f\xed\x77\xdc\xd7"
- "\x28\x2e\xb9\x49\x9d\x47\xfb\xcd\xee\x70\xe5\x98\x1c\x15\x03\xf0"
- "\x37\x32\x46\xa7\x5a\xb3\x1c\x93\xa7\xd6\x68\xc7\xd8\xd5\x9a\xe5"
- "\x18\xc7\xc6\xe1\xec\x83\xfc\x9b\xda\xce\xe4\x31\x15\xb8\x16\x75"
- "\xa6\xdc\x93\xdd\xff\x78\x34\xca\x61\xbb\x85\x52\x79\xad\x9c\xfd"
- "\x89\xeb\x94\x1f\x31\xea\xf8\x2d\xfb\x15\xf3\xbb\x5b\x4f\x15\x51"
- "\x22\xaf\x2f\xa2\xde\xb3\x13\x6b\x89\xd7\x54\x86\x08\xcb\x98\x74"
- "\xe9\xbb\xe5\x1e\x93\xe5\xe9\x10\x8d\xec\x33\xa8\xf6\x34\x7e\xdb"
- "\x20\x92\xc7\xa4\xab\xfc\xbf\x9d\xde\xd2\x81\x36\x58\xd2\x02\x9e"
- "\xc0\x59\xcd\x26\xfc\x2d\x78\x3f\x2d\x20\xdc\x63\x4c\xea\xac\xf8"
- "\x6f\xb7\xe8\x7a\x55\xf1\xe8\x6f\x37\x28\xba\x8d\x72\x28\xba\xfd"
- "\xb6\x41\x1b\xaf\x6e\xe5\x7b\x8c\xdd\x19\x6a\x0f\xfe\xb7\x0e\xdd"
- "\x46\xf6\x6a\x79\xb8\x0c\xee\xb5\x58\x38\xbf\xad\x41\xdb\x33\xb4"
- "\xf7\xf2\x5b\x61\x68\x1f\x78\xf8\x37\x27\xb8\x5d\xfd\xe9\x56\x49"
- "\x8b\x52\x4a\x44\xfb\xac\xec\x2b\xca\x76\x8a\xc7\x7f\x5f\xa3\xfa"
- "\x1e\xe0\x27\x77\xca\x33\xb3\xa8\x07\xfd\x63\x60\xbd\xc9\x67\x7c"
- "\x19\x5e\x1f\xfe\x87\x6f\xd4\x71\xe1\xfa\xf8\x9d\x70\xa7\x71\x4c"
- "\x02\xa6\x95\x89\xf3\x70\xbf\x9e\x2e\xe2\xb5\x8b\x8b\xa0\x19\xfb"
- "\x01\x7d\x32\x93\x69\xa2\x68\xf6\x89\x4d\xd2\xa3\xb7\x1f\x3e\xb9"
- "\x3e\x9a\x1e\xea\x39\x6c\x81\x6e\x58\xc9\xfe\x20\x9f\xcc\xd4\xe8"
- "\xd7\xa1\xd5\xff\xb5\x36\x57\xc7\xbb\xc3\xbf\x88\x28\x7b\x73\x6f"
- "\x5e\xf5\xed\x49\x03\xef\xad\xf2\x5a\xbb\xe2\xd7\xc3\x27\x22\xca"
- "\x9d\xc8\xff\x9a\x6d\x64\x5b\x80\xbf\x15\xc8\x34\xef\x72\x1d\x6e"
- "\xef\xa3\xb7\x82\x13\xa7\x8e\x5b\xf4\x3a\xbc\x74\x78\x9f\x8e\x27"
- "\xee\xb5\x31\xf8\x93\x71\x7d\x7d\x72\x78\xb6\x5e\x8e\xfd\xf7\xd1"
- "\x47\x01\x3e\x2f\x18\x57\x0f\xf2\x9e\xce\x08\xe8\xe0\xe0\x7d\x8d"
- "\x92\x1f\xe9\x93\xbd\xec\xeb\x0a\x1e\xb2\x2a\x1e\xfa\xa4\x42\x8d"
- "\x85\x9f\xc8\xd8\x2d\xbc\x5f\xc2\xb1\x88\x51\x5f\x2d\xe0\x1e\xd2"
- "\x70\x3e\xa0\xe1\x80\xf9\xdf\x6f\xf6\xc5\xce\xeb\x1e\x58\x54\x20"
- "\x0f\xc6\x8e\x5f\x55\x14\x1b\xa7\xd2\xd4\x77\x06\xf2\x93\x8e\x88"
- "\x33\xa4\x5a\x4c\xde\x4f\xb3\x30\x4f\x3d\xb8\xf5\xff\xb2\xf7\x3d"
- "\x70\x51\x1d\xd7\xfe\xb3\x0b\x12\x34\x44\x16\x83\x74\x93\x90\x64"
- "\x4d\x31\xae\xa9\x49\xd0\xda\x8a\x86\xb4\x98\x68\xaa\x3e\x13\xd0"
- "\xa7\x2d\x31\x46\xf1\x0f\x16\x2c\xea\x06\x11\x11\x11\x10\x0d\x4f"
- "\x5b\x45\x54\xe4\x61\x82\x48\xfa\x4c\x8a\x89\xff\xf2\x6a\xde\xc3"
- "\xd6\x98\x4d\x45\x8b\x0a\x2c\x49\x31\x45\x83\xba\x12\xb4\xc4\xa0"
- "\xd9\x08\xca\x82\xbb\x77\x7e\xe7\xcc\xdc\xbb\x77\xef\xb2\x0b\xae"
- "\xd1\x98\xfe\xfa\xf8\x7c\xf8\xdc\x9d\x7b\xe7\xce\x9d\x3b\xe7\xcc"
- "\x77\xce\x39\xf7\xcc\x39\x5c\x6f\x2d\xcf\x03\x9a\x65\x5d\x23\x0f"
- "\x62\x8e\x8d\x4c\x03\xbd\x54\x63\x00\x5d\x5a\x33\x0c\xe6\xd9\x30"
- "\xf4\x97\xe8\x83\xbe\x14\x88\x37\xe8\xab\x49\x83\xe0\xfc\xc6\x61"
- "\xfe\xf2\x3e\x35\x63\x13\xe8\xb6\x65\xeb\x41\x97\xcd\xba\x4c\x1e"
- "\xe4\xbe\x11\x87\x96\xa0\x4d\x87\x66\xc5\xbe\x21\xe4\x0f\x0b\xc0"
- "\x3d\x90\x35\xa0\x11\xd2\xac\x84\x37\x84\x8d\xc3\x02\xa0\xdd\xd0"
- "\xac\x05\xa4\x1f\xae\x6f\x68\x1b\xe2\x3c\x63\xac\x80\x76\x43\x31"
- "\x3e\x99\x40\x63\x55\xf0\xfc\x38\x41\x33\xa2\x6c\xbd\x40\x98\xef"
- "\x37\xf0\x99\xba\x91\x1c\x3a\x02\xcf\x8f\xc3\xdc\x7f\x68\xe7\x31"
- "\x59\xa1\x9f\x1b\x87\xc5\xc1\xb5\xbe\x70\xed\x1b\x38\x0a\x18\xab"
- "\x0c\xe3\x63\x43\xfb\x5a\x6c\x1f\x9e\x15\xc7\xfb\x6e\x61\x75\x1b"
- "\xc9\x47\x03\xb1\x8e\x14\x03\x4d\xc8\x8a\xf5\xc1\xeb\xb8\xa7\xd6"
- "\x0e\xf7\x99\x60\x36\xf2\x7b\xea\x1d\xf7\x88\xf2\x33\xcc\x65\xe3"
- "\x87\x74\xd3\x33\xb1\x50\xb7\x1c\x7d\x4d\xb9\x2c\x6b\x2c\x17\xe7"
- "\x3a\xc8\xc7\xc6\x03\xe2\xef\x00\x47\xdd\xac\x58\x92\xd9\x41\xb4"
- "\xec\x7b\xe9\x52\x1f\xc0\x5e\xa3\x06\xc6\x81\x38\xb5\x79\x01\xdb"
- "\x5b\x87\xb1\xd5\xe2\x49\x00\xe0\xf2\xbd\xd0\x6f\xcc\x31\x71\x1e"
- "\x6d\xb0\xe2\xd8\x34\x01\x9d\xf6\x6d\xe0\xf1\xf3\xf6\xaf\x07\xde"
- "\xcf\x5c\x01\xf2\xc0\x0a\x12\xb0\xc2\x4e\x42\xf1\x3d\x81\x6e\xcd"
- "\xe8\x2f\x8d\xba\x1b\x8e\x8d\x48\xc3\x0c\x78\x97\xd5\x2b\x12\x68"
- "\xd3\x8a\x16\xda\x5c\x9d\x50\x4f\x60\x9d\xe9\x57\x63\xa8\xc5\x58"
- "\xcf\xe7\xf1\x5d\xd1\xf6\x08\x63\x0a\x3a\x09\x3c\x63\xe3\xb0\xd5"
- "\xb8\x07\x86\xd9\x09\xd4\x1f\x1e\x94\xf6\x0b\x95\xb0\x3d\x45\xc6"
- "\xe1\x0e\x7b\x57\x2a\xad\x10\xfb\x52\x29\xe0\xef\x54\xb6\x97\xaf"
- "\x0f\xea\x3f\x68\xd3\x98\xb9\xac\xd4\xb1\xf7\x82\xdb\x06\x8c\x06"
- "\xa7\x18\x56\xec\x5e\xb4\x11\xe0\xbd\xd1\x36\x7a\x6d\x83\x58\x17"
- "\xef\x8d\x5e\x36\x93\xe2\xbd\x70\xcf\x0e\xc7\x3d\x8a\xbd\x3b\x1f"
- "\x71\xb9\x02\xc6\x16\x7f\x5b\x60\x2c\x45\xdf\x28\x1d\xff\xae\x6d"
- "\x6c\x90\xbe\x25\x9b\xc9\xa1\x02\xe4\x27\xf7\xf1\x99\x3f\xf6\x55"
- "\xc6\x13\xfa\x18\x63\x01\xe1\xf9\x50\x29\xee\x0f\xfc\xd6\x43\x5b"
- "\x7c\x6f\x93\x53\x3c\xaf\x3c\xa7\xd8\x80\x59\x16\xfa\x05\xf2\x09"
- "\xe0\x8a\xcf\x25\xf2\x31\xc6\x66\x28\xe3\xfb\x9f\x3e\x3e\x82\xfd"
- "\x6c\x24\x1f\x17\x40\x39\x90\xc7\x1d\xf8\xf8\x75\x11\x3f\x8a\xa2"
- "\xed\xb6\x40\x33\x3c\x13\xf7\xf2\x38\x95\x33\x00\x4f\x34\x50\xef"
- "\x03\x1e\x3b\x8f\x7d\x51\x54\xb9\x5c\xcf\x76\x29\x47\xb9\x94\x75"
- "\x6d\x30\x6f\x3c\x7d\x33\x5f\xff\x20\xb3\x17\x1e\xec\xbb\x92\x18"
- "\xb2\xbe\x24\x3e\xc0\x2b\x17\xb0\x6f\x35\xcd\x2d\xf8\x4e\x81\x34"
- "\x27\x9c\x98\x9a\x6d\x5c\xb6\x84\x35\xbd\x31\x0c\xea\x7c\x49\x42"
- "\xd0\x9f\x1b\xf3\x4c\x40\xfd\x4b\x3c\x2e\xf4\xe1\x57\xa7\x2f\xe9"
- "\x43\x84\x5f\xc7\xde\x4b\xd5\x31\xb1\xf8\xcd\x6e\x77\xa7\xb9\x17"
- "\x7e\xbf\xca\xdc\x0a\x3c\x69\x27\x21\xc0\x63\x4d\x98\xd3\x0b\x73"
- "\xae\xff\x57\x67\x73\x2f\x93\xed\x34\x31\xcc\x27\xea\x4b\xe4\x70"
- "\x8c\x6f\x06\xf1\xdd\x70\x91\x68\x80\xae\xb6\xc3\xb6\x08\x22\xc5"
- "\x0d\x28\xee\xc7\xf7\x3c\x17\x03\xbe\x2e\xd6\x52\x6b\x7b\xce\x5f"
- "\x76\x99\xc9\x5b\x46\x49\xc7\x5e\xc7\x73\x49\xf8\xc2\xf3\x1f\x50"
- "\x8b\x31\x12\xf8\xd8\xfe\xe5\x4b\xbe\x7f\x2a\xf8\xa7\x70\x8f\x59"
- "\x96\xbf\x0f\x8b\x7e\x84\x23\xc4\x98\x70\x87\x93\x0e\x83\xb6\xb4"
- "\x9a\xfb\x1e\x04\xb7\xe7\x1c\x0e\x70\xf8\x1e\x30\xbb\xd5\xe1\x24"
- "\xa0\x61\x15\x97\xcd\x47\x54\xcd\xb4\xfb\x8b\x73\x10\xcf\xeb\xac"
- "\x78\x2f\xdc\x17\xd8\xc6\x6c\x4c\x87\xc7\xc9\xbc\x76\x58\x83\x98"
- "\x0f\xef\x04\xed\xfd\x65\x35\xbe\x17\x8e\x09\xd4\x03\x3e\xfb\xcb"
- "\x9a\xc3\x3b\x3c\xc4\x50\xd5\x0c\x28\xb3\x31\x1b\xc8\xe6\x7a\xe0"
- "\xa7\xcb\x40\x83\xfb\x31\x4e\x92\x09\x9e\x53\x5d\xd2\x49\xaa\xb5"
- "\xad\xa4\x06\x7e\xa3\x8f\xb1\x71\xfe\x17\xa4\x49\xe7\x7e\xbd\x11"
- "\x40\x8f\x00\x59\x3b\x02\xdb\x42\x2c\x40\xbf\x2c\x13\xac\x60\x35"
- "\x16\x68\xab\x89\xb0\x36\xaa\x85\x66\x52\x9d\x86\x7a\xd6\x6e\x73"
- "\x4d\xc9\x69\x52\xa3\xfd\x1b\x7b\x0e\xca\x84\xc6\xe4\xd6\xee\xda"
- "\x1e\x07\x6d\xc7\x8a\x6d\xb7\x40\xdb\xc1\x9e\xdb\xde\x1c\xee\x65"
- "\xdb\x5e\xf4\x7b\xb3\xce\x9b\xb6\x41\xde\xdd\x65\xd2\xf2\xfd\x5a"
- "\x99\x0f\x90\xfb\xec\xd7\x31\x46\xe6\xa3\x94\xfb\xb9\x1e\x19\xcd"
- "\xf6\x74\xe5\xb0\x3d\x31\x65\x6c\x6f\xd7\x15\xc2\x7c\x15\xf9\x7e"
- "\xae\x0b\x04\xfd\x1c\xda\x73\x8e\x0c\x91\x75\x25\xc7\xf7\x27\x90"
- "\x55\x8f\xc4\x70\x7f\xc6\xa1\xa2\x3d\xfa\x48\x2f\x6c\xcb\x7d\x3f"
- "\x86\xd5\x71\xbf\xd8\x23\x6b\x25\xfb\x4b\x6b\xd0\xb0\x3a\xb1\x2d"
- "\x9d\xab\x5d\x4f\x4a\xea\x19\x9f\x96\x22\xe5\x07\x4d\x11\xb7\x95"
- "\x4e\x8e\x9f\x13\x9f\x98\x1a\x3f\x57\x37\x65\x49\xf2\xc2\x27\x17"
- "\xcd\x9b\xa7\x7b\x31\x7e\xf1\xe2\x59\xbf\x8e\xef\x43\xa6\x24\xcf"
- "\x5a\xb8\x38\x11\x6d\x6f\x3a\xdd\x98\x1f\xcf\x4c\x58\x94\xf2\xe4"
- "\xcf\xc6\x84\xbb\xd8\xde\x70\x0f\x62\x03\xca\xe0\xb0\x76\x84\x64"
- "\xda\x49\x10\xc6\xbc\x09\x5c\x46\x8d\xcb\x41\xff\x03\xfe\xbb\x84"
- "\xeb\x14\xae\x0d\xa8\x1b\x60\xbc\x3d\xc0\xef\xaa\x37\x0b\x69\xed"
- "\x45\x52\x8f\x72\x65\xfd\x76\x1e\x3b\xae\x01\x74\x72\x0b\xcf\x59"
- "\xf7\xf7\x33\x18\x17\xee\x77\x70\xce\x12\x34\xa2\x6a\xc3\x59\xe2"
- "\x0b\xeb\x1a\xe8\x25\x47\x8b\xa9\xfa\x1e\xba\x2e\x84\x56\xd0\x2f"
- "\xb4\x44\x8c\x87\xad\x36\x99\xad\xf8\x9d\x1e\xf4\xa5\x2c\x8a\x78"
- "\xca\xe7\xd6\xd1\x6d\x7c\x5c\x06\x8e\xe3\xfe\xc2\x7f\xff\x10\x75"
- "\x98\x55\x2c\xa7\xe0\x51\x98\xff\x07\x52\x64\x9c\x36\x55\x8a\xb2"
- "\x63\x3d\x8c\xfb\xd2\x46\x28\xf3\x98\x1c\x47\xeb\x95\x3e\x18\x95"
- "\xb0\x2e\xff\xad\x85\xff\xe3\x3d\x75\x01\xfc\x1f\x7f\x3b\xff\xff"
- "\xbd\x94\xff\xbb\x9e\xff\xb6\xff\xd2\xf3\x6f\xf5\xfe\xda\xec\xee"
- "\xff\x6f\xe6\xf9\x78\xbc\x9b\xef\xff\x6d\xee\xaf\x5d\xd3\xdd\x3f"
- "\xf2\x1b\xf0\x56\xc3\xef\xce\x12\x7f\xe0\xcf\x82\xf5\xb3\x81\xa7"
- "\xcf\x10\x6d\x86\x8d\x36\x65\xbd\x4a\x42\x33\xbf\x24\x98\xd3\xad"
- "\x39\x25\x8d\x36\x65\x5e\x47\x99\xb4\x16\x73\x9c\x94\xe7\x35\x92"
- "\x80\xf5\x8d\x44\x53\x93\x82\xf9\x5e\x31\x2e\x16\x3c\x0d\x47\x08"
- "\xca\x55\xa9\x56\x72\xc2\xf2\x0d\xfa\x2d\x19\x6b\xe2\x00\x77\x1a"
- "\x08\x41\xfe\x0d\x88\x23\xc1\xc5\x21\xf4\x20\xcd\x49\x3a\x48\xd5"
- "\x49\xbb\xe0\x5c\xdd\x5e\x21\xaa\xd7\xde\xf4\xca\x5e\xba\xd9\xb8"
- "\xc6\x1f\x7b\x55\xe4\xcd\x63\x7c\xaf\x90\x89\xe5\x20\x83\x79\x52"
- "\xc7\xed\xea\xb5\x63\xf9\x7a\x5e\xdb\x5f\xb4\x37\xc1\x6f\x13\x93"
- "\x15\xe1\x3d\xca\x31\x07\x26\xb6\xb9\x47\x28\x67\x39\x30\xf7\xa6"
- "\x47\xf5\xca\x98\x45\xd4\x35\x66\x58\x29\x01\x07\x71\x05\x83\x79"
- "\xb7\x0b\xe6\xd9\xbe\x6d\x21\x34\x1f\xfa\xb7\xae\x24\x84\xae\x81"
- "\x3e\x95\xb5\xe7\x1c\xab\x82\xb5\xc7\x28\x7e\x77\x31\xc2\xbc\xd8"
- "\xb5\x1e\xea\x44\x2f\x21\x8f\xae\x87\x7a\x79\x50\x0f\xe5\x64\xde"
- "\xbf\xea\x8d\x30\x06\xfb\xe1\x99\xb5\xba\x19\x58\x3e\xc1\x62\x00"
- "\xe1\xb3\xe1\x3d\x74\x8d\xe4\x44\x28\xac\x6d\xbe\xf8\x0c\xe9\xb9"
- "\xed\x39\xc7\x01\xff\x2a\xa4\xef\xbe\xf9\xbc\x9d\xe3\xb1\x7c\xbe"
- "\x0e\x1b\xb2\x41\xce\x51\x3a\x64\x7d\x3a\xac\xe9\x9d\x2c\x5e\x64"
- "\x01\xda\x5b\x50\xc6\x60\x72\x85\x9d\x04\x72\xfb\x00\xc8\x16\x09"
- "\x80\x03\x20\x4f\x30\x1f\x67\x90\x25\xa0\x2f\x05\x98\x2b\x0f\xaf"
- "\x83\xde\xb6\x1f\xd6\xe5\x7d\x28\x07\xcc\xb8\x36\x81\xa0\x8d\x1d"
- "\xf3\x5c\x2e\x9e\x4e\xad\x3c\x07\xc9\xf1\x72\x49\x16\x40\x0c\xc2"
- "\xf5\x1f\x64\x61\xdf\x1b\x40\x43\xe0\x81\x4a\x90\x2d\x82\x2e\x91"
- "\xe3\x6d\xe2\xd8\x57\xb2\x35\x3f\x95\xc5\x37\xf6\xe1\x18\x7d\x02"
- "\x7d\xe1\x03\xe0\x19\x95\x66\x52\xcf\x6c\xe1\x1c\x63\x4e\x68\xa4"
- "\x75\x1c\x75\x5e\x33\xb4\x41\x01\xcb\xc4\x6b\xf0\xfe\x1f\x37\x49"
- "\xcf\x84\x6b\x46\x71\xcc\xaa\x60\xcc\xb0\x4d\xa6\xfb\x83\xcc\x55"
- "\x25\x8e\x4d\x15\xca\x15\xe2\xbd\x09\x52\xbb\xa8\x97\x0b\x20\x57"
- "\xe0\x78\xe1\x38\x41\x3b\x55\x22\x8e\xd5\x71\xf9\xa5\x7a\x19\xe1"
- "\xdf\xdb\xf3\x81\xd6\xab\xe5\xf1\x3f\xb1\xcb\x79\xfc\xe1\xfe\xd5"
- "\x22\x2d\x07\x3a\xd1\x0e\x74\xa3\x2a\x1b\xda\x49\xa1\x8f\x07\xb9"
- "\x8d\xe7\xc4\x05\x8c\x2b\x86\x71\x8c\x61\x8c\x0f\xae\xc3\x98\xb9"
- "\x80\xcd\xab\xce\x02\xe6\xce\x46\xf9\xa9\x4a\x8c\x8b\x55\xb5\x1a"
- "\x79\x18\xca\xcc\x0e\xdf\x04\xfd\xc2\xf6\xa0\x3c\x15\x8e\x20\xc7"
- "\x56\xbd\xe8\x9c\x93\x56\xce\x47\x5b\x35\x46\xde\x67\x70\xc2\xc0"
- "\xf5\xe7\x13\x06\xb4\x81\xb1\xfa\x37\x12\xb0\x6f\x0d\x38\x2f\xa5"
- "\x77\xc5\xdc\xb4\x70\x1e\x65\xff\x06\xa4\x9b\x74\x1e\xe3\xed\x02"
- "\x9d\x02\xe0\x59\x67\xc4\x3e\x61\xd9\x1f\xca\x2c\xe7\x00\xe6\xa9"
- "\xdd\x80\xf7\x64\xca\xf7\xe0\xbc\x01\x1e\x0e\x84\x3a\x27\xe1\x48"
- "\xa5\xba\x3c\x7f\x6d\xd5\xf4\xcd\x9d\x68\x03\xab\x4a\x91\xf2\xd7"
- "\x62\xee\x5a\xc4\x8c\xf5\x33\x14\x63\x8f\x63\xb3\x0b\x68\xc5\xf8"
- "\xee\xb0\xad\x1c\xc6\xbb\x1a\xe4\xff\xff\x11\x63\xdc\x55\x4d\x17"
- "\xfb\x67\xe4\xf9\x18\x8e\x14\x94\x6c\x92\x62\x2c\x54\xcb\xdf\xff"
- "\x1d\xb2\x65\xd5\x74\xe4\x49\x68\x8b\xf1\x0e\xca\x89\x50\x2f\xc9"
- "\xc1\x5b\x6c\x1f\x6f\x55\x0b\xca\x97\x62\xff\x91\x5f\xaa\xc5\xb1"
- "\x2b\x70\x9e\x77\xce\xf3\x1c\xda\x00\xfd\xff\xb0\x83\x07\xa4\x79"
- "\xcd\xf9\xa0\xe6\x82\x68\xb3\xab\xc7\x78\xb7\xd0\xae\x11\x65\x70"
- "\xbe\xae\xd6\x94\x1f\x6e\xb0\xa1\x0d\xbd\x0e\xca\x30\xbf\x6b\x0a"
- "\x5a\xfb\x3d\x13\xb7\x9a\xe1\x46\x0d\x8c\xc3\x53\x2c\x06\x04\x8e"
- "\x8b\x34\x5f\x37\xcc\x40\xdd\x2f\x9c\xcf\xd9\xb4\x26\x52\x63\x6d"
- "\x21\xa2\x0f\x3f\xcc\xd9\x0b\xf8\xed\xf4\x12\xf0\x90\x3f\xce\x5f"
- "\xa0\xef\x2e\x8c\xcd\x0c\xe3\x58\xbb\xba\x90\xcd\xdb\x00\x9c\xb7"
- "\x37\x30\x36\x04\x3c\xa7\x22\x2e\x0a\x7a\x6d\x64\xf3\x18\x63\x7e"
- "\xbc\x09\x63\x87\xb9\x62\xe1\xd9\xd9\x92\xef\x31\xf2\x08\xc6\xf8"
- "\x10\xf9\xa4\x12\xe7\xb2\x38\x76\xbe\x50\xaf\x4c\x9a\x7b\x4e\xf4"
- "\x67\x75\x5c\xe6\x5b\x20\x9f\x6f\x35\xf5\xd2\x58\xdb\xd8\x3c\xae"
- "\x4a\xb1\xc1\x3c\x76\x1e\x53\x1c\x4f\x1c\xd7\xf6\x1c\x13\xb4\x55"
- "\x11\x2a\x8d\xa9\x3c\x9e\xa6\x25\x22\xcd\x6b\xb9\x8d\xc9\x14\x21"
- "\xda\x9f\x1c\x63\x28\xf2\x1f\xe6\xf8\x2c\x5f\x85\xef\x0e\x6b\x03"
- "\x3e\x1f\x79\xe4\x4d\x11\xb3\x2a\x2c\xc8\x23\x26\x98\xff\x93\x9a"
- "\x65\xec\xa8\x4a\x63\x3a\x0b\xd0\x89\xd3\xc7\xf4\x16\x8b\xa3\xe1"
- "\x06\x3b\xcc\xa4\x3a\x4e\xc6\x27\xd3\x3e\x69\x1c\x24\x9e\x94\xe6"
- "\x3d\xb4\x61\x57\xe2\x8f\xe9\x3c\xb4\xd1\x0f\xf1\x4d\x96\xa1\x4c"
- "\x16\x25\xbe\x99\xea\x11\xdf\x90\xaf\x0d\xa9\x68\x63\xe3\xeb\x95"
- "\x99\x1c\xcb\x56\x62\xd2\xb1\x25\xdc\x37\x80\xcb\x5c\xc8\x5b\x86"
- "\x19\xbc\x3e\xae\x61\x50\x9f\xe9\xe2\xe2\x9a\x87\xb1\x88\xf1\x5c"
- "\x92\x38\x5e\x0d\x50\xbf\x02\xf7\x43\x62\x0c\x84\x7b\x1b\xb8\xae"
- "\x07\x38\x7d\x10\x63\x5d\x43\xbd\x21\x35\x20\xe7\xdf\xc8\xe5\xd8"
- "\x2d\x61\x05\x9d\x13\x7b\xef\xd2\x66\xd2\xdb\xf0\x33\xfa\xc5\x45"
- "\xf2\x09\xc6\xe3\xb6\x62\xbc\x45\x68\x5b\x77\x91\xfc\xed\x24\x3c"
- "\x37\x58\x3c\x6a\xe1\xf8\x21\x1c\x1f\x80\xe3\xdb\x70\x7c\x08\x8e"
- "\xeb\xa1\xbe\x20\xd6\x0f\x87\xf2\x12\x38\xff\x63\xf1\x08\x7d\xfc"
- "\x04\xfd\xef\x63\x44\xd9\x11\xcf\x8f\xc7\x32\x1c\x47\x8a\x34\xe7"
- "\xeb\x05\xf9\x64\x28\xb4\x93\x06\xfd\xaf\x37\x35\xb0\xb6\x0c\x17"
- "\xc9\xa7\x1d\xd8\x36\xee\x4f\x86\xdf\xbb\x9d\x64\x50\x68\xe7\x93"
- "\x53\x70\x1c\x0e\xc7\x6d\x70\x4c\x81\xe3\x6b\xe2\x18\xd4\x22\x36"
- "\xcc\x4d\x63\x63\xbe\x4e\xc7\xe5\xdd\x18\x69\xce\xe3\x3a\x2c\x63"
- "\xc7\xf1\xaa\xb9\xd3\x39\xbd\xcd\xa4\x86\xf1\x01\xd4\x1d\x8d\x75"
- "\xe1\xf8\xbc\x78\x8c\x12\x8f\x63\xc5\xe3\x2f\xc4\xe3\x18\xf1\x08"
- "\xfa\xe8\x27\x29\xa2\x8c\x01\xe3\xf2\x49\x0a\xf3\x7b\xca\x1f\xda"
- "\xc4\x9f\xf1\x69\x01\xea\xc8\x80\xe3\x3f\x81\xf6\x7d\xda\x73\x3e"
- "\xf5\x97\xec\xa3\x68\xf3\xb9\x91\x73\x64\xef\x9b\xec\xbb\xf6\xa7"
- "\x3a\x27\x6c\x2b\x0e\x50\x45\x11\x90\x81\xfa\x17\xab\x61\xfd\xe7"
- "\xed\xa4\xa9\xc5\xef\xc2\x62\x1c\x7d\x1f\x8c\x2d\xc7\xf4\xa1\xa0"
- "\xf7\xc6\xe1\x5c\x65\xb6\x63\x8c\x83\x16\x34\xa2\x14\xfe\x77\x81"
- "\x6e\xb0\x4f\xc2\x6f\xd4\x7b\xc4\x98\x95\x15\xf0\xac\x75\xb2\xae"
- "\xfe\x69\x24\xff\x86\xf6\x83\x28\x38\xbf\x43\x3e\xff\x89\x15\xfb"
- "\x0c\xe3\x59\x0f\xef\x33\xbc\x91\x7c\x8a\xf1\xf0\x87\x35\xf1\x77"
- "\x0e\x97\xde\x59\xa4\x87\x41\x1a\xdf\x26\xf2\x49\x06\x60\x61\x32"
- "\xf2\x70\xa3\x03\x67\x3f\x61\x76\x5d\x91\x47\x80\x96\x9f\xfc\x04"
- "\x69\xea\x34\x07\x9d\x31\x28\xb8\x3d\xe7\x6f\x43\x94\x98\x72\x62"
- "\x08\x62\x0a\xf2\x06\xe0\x37\xd2\x3a\xc0\x65\xfe\xd5\xe3\xfc\xe3"
- "\xf3\xee\x6f\x09\xca\x7b\x4d\xf5\x36\x3e\xef\xea\x81\xcf\x80\x3f"
- "\x6b\x5b\x90\x3e\x66\xf2\xb7\x71\xe2\x9c\xae\x87\x39\xfd\x13\x38"
- "\x5f\xc7\xfb\xca\xcf\x8b\xcf\x02\x3e\xab\xc5\xf7\x7e\x48\x3a\x2f"
- "\xbe\x2f\xb6\x83\xf1\xd4\x1f\x90\xce\x8b\xed\x03\x3f\xd6\x1e\xc4"
- "\x79\x22\x9d\x17\xdf\x09\xe4\xa8\x3a\x22\xe1\xc9\x3a\xce\x6f\x6b"
- "\xa4\xfb\x90\x6e\x18\x6f\x8a\xdb\xf8\xff\x86\xdf\x50\x4b\x71\x7d"
- "\x58\x35\x83\x04\x2c\x2d\x22\xf7\xf1\x79\xf9\xb7\x16\x25\x46\x7e"
- "\x56\x4d\x73\x02\x6d\x54\x33\xa2\xa8\xda\x36\x5c\x92\x57\x8b\xe1"
- "\x39\x09\x52\xae\x64\x39\x26\x7f\xdd\xb6\xea\x52\xc7\xf8\x62\x5f"
- "\xd6\x49\x7d\x71\x5a\x9f\x19\x0d\xb0\x6f\xd8\xd6\x2a\x90\xd7\xdb"
- "\x00\x17\x38\x6e\xd7\x1d\x94\x72\xc8\xe7\x89\xeb\x16\xe6\x2d\xcf"
- "\x4b\xe5\x79\xcc\x71\x6d\x44\x1f\x1f\x01\xed\x58\x69\x76\x52\x63"
- "\x00\x5d\x3e\xed\x02\x99\xb9\xac\x0f\xc6\x54\x89\x85\xbe\xbe\x0f"
- "\x7d\xdb\x61\x47\xdb\xff\x42\xd4\x53\x3f\x8b\xb7\xa7\x52\xab\x38"
- "\x66\x30\x8f\x3e\x1b\x2f\x8e\x2d\xe2\x17\x8b\xc9\xb7\x2a\x93\xe7"
- "\xd7\x41\x5b\x0e\xce\x8f\xcd\xb8\x8e\x69\xa9\xb5\xa2\x18\xe7\xca"
- "\xc9\x89\x92\x4c\x0a\xfd\x2d\xe5\x32\x61\xcd\x4e\x16\x73\x28\x7f"
- "\x44\x11\xb7\x05\x9e\x3c\xc5\xdf\xfd\xa4\x91\x7f\xe7\x66\xf1\x24"
- "\xb1\xbc\xcb\x47\x1b\xf2\x0e\xf7\xcb\x3a\x72\x9c\xfb\x94\x9c\x74"
- "\xe4\xff\x70\x92\x15\x2b\x78\x3c\xa8\x93\xe5\xf2\x9c\x38\xb9\x06"
- "\xef\x83\xfb\x0f\xc0\xf9\x5a\xf9\x7c\x4d\x99\x68\xef\x2a\xee\xbb"
- "\x32\x0a\x7d\xcb\xfa\x63\x5c\x6a\xfe\xbc\xcf\xc2\xd9\xf3\x99\xcd"
- "\x03\xe6\xa6\x38\x7f\x71\x9c\x71\xcd\x66\x73\x18\xe6\x2f\xce\xe3"
- "\x1b\x1b\x47\x94\xc2\x3f\x9f\xb7\x7c\x6d\xae\x60\xf3\x96\xcd\xd9"
- "\xcf\xa2\x9c\xfa\x61\x65\x76\x2f\xa4\xe7\x72\x6d\x00\x5c\x9b\x0e"
- "\xeb\x6a\x9d\x78\x8d\xf9\xde\x61\xdc\x10\xdb\x75\x6a\xc1\x6f\xdb"
- "\xf8\xad\x13\xf7\x5e\x05\x02\x77\x63\xac\x0f\xe9\x5b\xf5\x8b\x2d"
- "\x59\xd4\x8e\xdf\x9d\xae\xd3\xb6\x7c\x47\x5c\xfc\xcf\xca\xe4\xb8"
- "\x3d\x27\xfd\xc5\xf7\x2a\x82\x67\x15\x73\x5f\xb0\xba\x0e\x2e\x53"
- "\xd5\x59\x91\x4f\x4d\xc0\x7b\x70\x2c\xe2\xb9\x6d\x3f\x6b\x92\x78"
- "\x0f\xe6\xe5\xdc\x8b\xe4\xef\x4b\x0a\x42\x68\x11\xd0\xb4\x08\xe6"
- "\x52\x12\x94\x67\xc1\x71\x2e\x3f\xaa\x34\x78\x14\xe7\x48\x51\x7b"
- "\xce\xdf\x75\x52\x4e\x6f\x1c\x9b\xb6\xa0\xcd\x31\xc8\x67\x79\x30"
- "\x0e\xc8\x6b\xec\x3b\x32\xf4\x1b\xf9\x0b\xf9\x0c\x79\x2c\x70\xe5"
- "\x04\xc6\x67\x2c\xae\x00\x9c\xc7\xfe\x22\x9f\x41\x5b\x49\x52\x4c"
- "\x5c\x33\xf9\xbb\x86\x7f\xcf\xf9\x7b\xb6\xe4\x4b\x8b\xdf\x92\x52"
- "\x06\x90\xfe\xd0\xae\xae\x42\xc7\xe2\x4e\x9e\x33\xd9\xc6\x12\xac"
- "\x8b\xdf\xe1\x38\x4e\xfe\x60\x33\xdc\xb3\x5f\x1e\xf3\x13\x43\xd8"
- "\x37\xa3\xe9\xcc\x16\x79\x3f\x5c\xab\x75\xd6\x33\xcc\xe4\x68\x31"
- "\xea\x1a\xe8\xdb\xf7\xc3\x60\xa2\x03\xbe\x05\x1c\xfb\x7b\x9b\x24"
- "\xd7\x3e\x1d\x8c\xdf\xf3\x8f\x8e\x83\xfe\x35\xf0\x3c\xe5\x47\x87"
- "\x83\x2e\x59\xe9\xc1\x66\x3c\x1c\x6d\x3d\x62\x2e\x9b\x06\xb4\x63"
- "\x61\xec\xff\x8b\xe4\xf3\x25\xd5\x18\xe3\x63\x51\xd7\x98\xc8\x99"
- "\x69\xf4\x1a\xc6\x45\xd6\x25\x93\xfb\x1b\xc9\xe7\xb1\x68\x37\xca"
- "\xfa\x06\x6d\x34\xf5\x19\x4a\x1b\x4d\x7d\x95\xf8\x6f\x26\xe4\xd4"
- "\x18\xa7\xff\x3a\xf1\x18\xd3\xc3\x7f\x8b\x58\xd7\x4a\xc8\x69\x5f"
- "\x71\xac\xfe\xd6\x9e\x53\xef\xb0\xff\x22\x5f\xe2\xdc\x46\x3f\x0e"
- "\xb4\x39\xa9\x6c\x04\x63\x8a\x00\x9d\xa0\xdf\xab\x9e\x98\x6c\x4c"
- "\x47\x3e\x3a\xc5\x72\x7d\x63\xbc\x5e\xef\x7c\x89\x4e\x31\x7a\xf2"
- "\xd8\x99\xf5\x75\xf0\xec\x2f\x36\x5c\x21\xbe\x86\x64\xf2\x30\xda"
- "\xbf\x03\xed\xd4\x88\x3a\x2e\xf2\xc4\x76\x96\x43\xe6\xd4\xc9\x94"
- "\x15\x44\x0d\xd7\x1f\x85\xdf\x15\x92\x9c\x04\xf7\x68\x7c\xac\x24"
- "\x18\xe5\xa3\xe7\x57\x90\x47\xdb\x73\x4e\x95\x4a\xb4\x42\x19\x02"
- "\xed\x70\xa2\x2d\x01\xfa\x5a\x7f\x1e\xef\xc3\x98\xee\x66\x36\x6e"
- "\x0c\x87\xb1\x8d\x00\xe8\xcf\x3a\x9f\x36\xa2\xe1\x6b\xcf\x29\xe0"
- "\xff\x23\xa2\xcc\x78\xaa\x0c\x78\xbf\x4e\xee\xa7\xb6\xbf\xd3\xef"
- "\xa9\x78\x7f\x60\x1b\xca\x67\x9e\xc6\xe7\xf4\x50\x69\x7c\xd0\x5f"
- "\x35\x10\xf4\x04\x46\x6f\x1b\x6d\x81\xbe\x55\x19\xd2\x89\xff\x25"
- "\xf2\xf9\x80\xed\x85\x6c\xff\x5c\x25\xb7\xcf\x7f\xde\x5f\xd2\xc3"
- "\x79\xbf\x4f\x9f\x0f\x5c\xe9\x43\xd0\xae\x8e\x71\xcc\x98\xaf\xdf"
- "\xd7\x5a\x66\x4b\x37\xd9\x22\x89\x31\x73\x14\xd6\x91\xe4\xaa\x86"
- "\xd6\x2c\x2d\x39\xac\x8d\x84\x79\x7c\x7a\x17\xcc\x15\xb3\xf7\x3e"
- "\x95\xa7\x77\x89\xe3\x5b\xc5\x7d\x11\x4e\xaf\xc0\xb5\x04\x75\x7f"
- "\x58\x47\x2a\x70\x8d\x6e\xcf\xf9\xdc\x5f\x9a\x37\xb0\x6e\x54\xc0"
- "\x3d\xdc\xc7\x3a\x1f\xbf\xff\x9e\x4e\xc3\xd8\x0e\x4c\x6f\xe0\xf5"
- "\x03\xb8\xcd\xff\xf3\x48\x87\x2c\x0d\xf5\xf0\x3e\xee\xa3\x76\x3a"
- "\x66\xa6\x5d\x05\x63\x7a\x3a\x06\xdf\x8d\xf3\xa2\xf6\x15\xa8\x9f"
- "\x24\xcf\xdb\x53\x0c\x9b\x0f\xb7\x38\xcf\xcb\xcf\xd7\xc9\xfa\x66"
- "\x7d\xd4\x93\x05\x44\xe7\x6e\x1e\x1a\xfa\xe2\x5a\xf5\xb9\x7d\xc3"
- "\x06\x5a\x9a\xaf\x16\x9e\x5b\x95\x47\x02\x54\xeb\x60\xd8\x70\x9e"
- "\xa5\xc6\xf5\xbf\x48\x1a\xee\x0b\x0c\xf8\x41\xcc\xf3\x29\xf7\xd0"
- "\x4c\x2d\x51\xaf\xbf\x7a\x8f\xff\x00\xeb\x0f\x4a\xa9\xcf\x13\x93"
- "\x5f\x4c\xb1\x12\xdd\xfc\x7c\xf2\x8f\x24\xe2\xf3\x3c\x68\x0b\x3f"
- "\x0c\x20\x06\x33\x39\xab\xc5\xbd\xa0\x87\x03\x50\xfe\x38\xab\xc5"
- "\x36\x33\x8a\x89\x7f\x46\x13\x6d\x5e\x37\xaf\x97\x3f\xac\x07\x9a"
- "\x37\x81\xc7\xee\x0d\xf8\x41\xe9\x0d\x68\xe3\xe3\x38\x76\x9f\xdb"
- "\x18\x51\xbc\x6f\x0d\x5b\xdd\xf7\xcd\x10\x02\x7d\xdb\xe9\x5d\xdf"
- "\xce\x95\xcb\x7d\x3b\x57\xfe\xed\xfb\x76\xe6\x27\x4e\x7d\xd3\xc8"
- "\x7d\x4b\x80\xbe\x9d\x19\xeb\x5d\xdf\xce\xc7\xca\x7d\x3b\x1f\x7b"
- "\x93\x7d\xdb\xd5\x4d\xdf\x3e\x71\xdf\xb7\xb4\x1f\x40\xdf\xce\x7b"
- "\xd7\xb7\x46\xab\xdc\xb7\x46\xeb\xb7\xe9\x1b\xea\xf2\x99\xa1\xf4"
- "\x02\x8b\xbd\x9e\x4c\x02\xd0\x77\xef\x22\x39\x37\x3a\xb3\x98\x95"
- "\xfb\x5d\x24\x67\xed\xe2\xfc\xb6\x64\xb5\xd1\x2f\xb8\x9c\x73\x36"
- "\xf1\x29\x03\xfa\xbb\x9e\x8d\x03\x5e\xd6\x72\x9e\x3e\xc7\xfc\x1b"
- "\xb2\x2c\x54\xf4\x37\x3d\xbb\xb6\x84\xf9\xa3\x44\xfa\x8b\xe5\xaa"
- "\xd6\x7e\x23\x30\xaf\x4f\x8b\x00\xf3\x99\xf6\x1b\x61\xc6\x5c\x94"
- "\x7b\x93\x2d\x6a\x9a\x83\x31\xc1\x30\x8e\x9f\x2f\xa1\x9b\x46\x58"
- "\xf6\x26\x5b\x59\x2e\xe6\x55\x6c\x1f\xef\xd9\x0a\x69\xef\x9a\xf4"
- "\x0c\x4b\x50\xa4\x3f\x9c\x6f\x90\x72\xdf\x52\x35\xca\x33\x23\xea"
- "\xb1\x7d\x38\xdf\x26\xe5\xa7\x05\x7e\x5f\x23\x62\x43\x5b\xa0\xb5"
- "\x3b\xdc\x3b\x37\x58\xc2\xbd\xe7\x53\x48\x20\xe6\x70\xdc\x90\x79"
- "\x0f\x7e\x73\x04\x7d\xfa\x6c\x39\x8e\x7b\x74\xdb\x3d\x34\x30\x83"
- "\xf8\xe0\x9e\x3d\xf4\xd1\x33\x69\x2d\x24\x2c\x83\xf4\x8a\x4e\x83"
- "\x36\xad\x24\x2e\x30\x0d\xda\x83\xb1\xe6\xba\xc1\x39\x66\xe3\x2b"
- "\x80\xf6\xf0\xfb\xb7\x4f\x0a\x09\x78\x5e\x9b\x45\x57\x6d\x25\xbe"
- "\xb8\xbf\x0f\xf7\xe9\xf1\x3d\x7a\x7e\xf0\x1e\xe7\x76\x48\xef\x77"
- "\x13\xf4\xe9\xcb\xe9\x63\x3e\x2f\xd3\xc7\xbc\xad\x2b\x7d\xcc\xbd"
- "\x39\x7d\xcc\x44\xa6\xcf\xf9\x31\x4a\xfa\x98\x07\x2b\xe9\x63\x4e"
- "\xba\x35\xfa\x98\xe7\xca\xf4\xe1\xcf\xe0\xf4\x31\x67\xb8\xa7\x8f"
- "\xb9\x40\xa6\x8f\x59\x7f\x73\xf4\x31\x1f\xf3\x4c\x1f\x73\x6c\x37"
- "\xf4\xf1\x73\x4f\x9f\xf3\x0f\xdc\x3c\x7d\xce\x8f\xf1\x82\x3e\xf7"
- "\x71\xfa\x34\xae\x94\xe9\xd3\xf8\x6c\x57\xfa\x9c\xdf\xc9\xe9\x73"
- "\xbe\x54\xa6\x4f\x63\x93\x92\x3e\xe7\x8f\x29\xe9\xd3\x18\x70\x6b"
- "\xf4\x69\xf4\x95\xe9\xc3\x9f\xc1\xe9\xd3\x18\xea\x9e\x3e\x8d\xc3"
- "\x65\xfa\x9c\xaf\xbc\x39\xfa\x34\x26\x7a\xa6\xcf\x79\xab\xf7\xf4"
- "\x69\x3c\xe0\x42\x1f\x8d\x67\xfa\x34\x36\x79\x41\x9f\x40\x4e\x9f"
- "\xa6\x01\x32\x7d\xbe\x38\xd3\x95\x3e\x5f\x8c\xe7\xf4\xf9\x22\x4a"
- "\xa6\x4f\xd3\x6a\x25\x7d\xbe\x48\x54\xd2\xe7\x8b\x5d\xb7\x46\x9f"
- "\x2f\x76\xc8\xf4\xe1\xcf\xe0\xf4\xf9\xe2\xa0\x7b\xfa\x7c\x51\x27"
- "\xd3\xe7\x8b\x84\x9b\xa3\x4f\x53\x6f\xcf\xf4\xf9\xa2\xa8\x1b\xfa"
- "\xdc\xe3\x9e\x3e\x4d\x2f\xdf\x3c\x7d\x9a\x56\x77\x47\x1f\xef\x64"
- "\xbd\x26\x96\x93\xe2\x36\xb4\x63\xf6\xd4\x0e\x8e\x1d\xfa\x1f\x0a"
- "\x39\x4d\xe6\x12\xc1\xcf\x9f\xef\xd1\x68\x2a\xd2\xa5\x93\x9f\x37"
- "\x92\x0b\x4f\x96\x08\xbd\xfc\x69\xce\xdb\xa1\x42\xce\x3b\x15\x74"
- "\xa5\x9f\xaf\xb0\xf2\x1e\x5f\xdc\x73\xed\x39\x27\xf6\x85\xf5\x3e"
- "\x0f\x90\x47\x70\xdf\xdc\x2a\x90\x97\xf1\x77\x7b\xce\x85\x22\x90"
- "\x05\xc7\x74\xb7\x7f\x0b\x7d\x9d\x0e\xaf\x46\xfd\xf6\x42\x85\x23"
- "\xde\x45\x0e\x4d\xc3\xb8\x61\x86\xc7\x70\x9f\xc5\x85\x96\x02\x16"
- "\x87\x6a\xd8\xdc\xa8\xc7\xe8\x39\xd4\x3d\x2e\x92\x8b\x5f\xd2\x8d"
- "\xc3\xe6\x22\x3f\x80\xac\x7e\xff\x25\x72\x71\xb8\xc3\x3f\x8f\xc6"
- "\xbe\xc1\x6d\x84\xc3\x34\xbc\x6e\xf3\xcb\x50\x57\x83\x39\x3b\x17"
- "\x67\x62\x2e\xca\xe6\xd1\x20\xfb\x3e\x8e\xcf\xc0\x98\x48\xdb\xe1"
- "\x88\x7e\x32\xdc\x37\xf3\xe2\x14\x26\x2f\xaf\x7a\xe8\x0d\xee\x0b"
- "\xd7\x3c\x58\xe2\x3b\x78\x4e\x1f\x28\x07\x89\xf2\x3c\xd6\xbf\xf7"
- "\x12\xf9\x47\x87\xd3\xf5\x00\x28\x9f\x81\xb6\x83\xc4\xeb\xf7\x41"
- "\xf9\x63\x94\xb3\x59\xfc\x8e\xbc\x6c\xd1\x87\xf8\x1f\x3b\xe0\x9c"
- "\x46\xac\x13\x04\x75\xd6\xa2\xec\x2e\xb6\xd1\x0f\xca\x0b\x50\x07"
- "\x16\xaf\x07\x43\x79\x12\x7e\x3b\x10\xaf\xf7\x87\x32\xda\x3a\x07"
- "\xf1\x3d\x2f\x37\xc4\x39\xfa\x0f\x72\x6b\x7b\xc1\xff\xc1\xf4\x56"
- "\xa4\x01\xd7\x05\xfe\xe1\xe4\xff\x73\xb1\xd9\xe5\xda\x5c\xa7\x6b"
- "\xf5\xd2\x35\xee\xa3\xf6\x8f\x6c\xa7\x6b\x95\x2e\xd7\x8a\x9d\xae"
- "\x95\xbb\xb4\x59\xee\x74\xad\xcc\xe5\xbe\x3a\xa7\x6b\x05\x2e\xd7"
- "\x2c\x4e\xd7\x56\x8b\xd7\x7c\xda\x73\x9a\xfd\xe5\x6f\x78\x17\x53"
- "\xc4\xf3\x6a\x38\xaf\x73\x3a\x3f\x57\x3c\x0f\xcf\x6f\x8e\x30\x93"
- "\xa2\x50\xf1\x3c\xa3\x3d\x6f\xbf\x39\xc6\xa9\xfd\xe1\xdc\xc6\xd1"
- "\x3c\xd7\xe1\x3b\xd7\x2f\x22\x5c\xb8\x11\xfb\x06\x5c\x0b\x45\xbe"
- "\x72\xe6\xed\x85\xa9\xba\xd9\x4b\x7e\xad\x4b\x8e\x4f\x41\xf7\x95"
- "\x05\x89\x29\xba\x05\x8b\xe6\xc6\x2b\xe2\xa7\x07\x63\x2c\x41\xcc"
- "\x3f\x86\x31\x59\xc4\x58\xff\xcd\x8e\xfc\x18\x80\xab\xf0\xac\x5a"
- "\x33\x19\xc3\xec\xd8\x05\x3c\xce\x78\x25\xc6\x74\xe1\xf1\x5b\xc8"
- "\x84\x46\xd2\x7c\x52\x8c\xdf\x62\x84\xba\x36\xcf\xf1\x5b\x2e\xd5"
- "\xb3\xb8\x85\x50\x8f\xc7\x6f\xb9\xd4\x00\xf3\xfc\x79\xda\x87\xe7"
- "\xbb\xe0\x79\xc0\xbe\x94\x64\x13\xcb\xcc\x0e\x16\xfb\x2f\x9b\xdb"
- "\x32\x5c\xe3\xb0\x0e\x1b\x83\xf7\x89\xdf\x4b\xc7\x38\xdd\x9f\xc0"
- "\xaf\x4b\xeb\x83\xf8\xcc\xfc\x61\xe3\xa0\xdc\xa7\x11\xca\xcc\x7e"
- "\xcf\xae\x7d\xc9\x6d\x79\x1b\x87\x4d\xc4\x77\xc2\xf7\x56\xbe\x9b"
- "\xfa\x57\x8d\xe4\xcb\xf7\xe5\x77\xfb\xb2\xde\x29\xc6\x9b\xf4\x0e"
- "\x84\xcf\xd1\x2e\xef\xca\xfc\x13\xa9\x66\xd8\x44\x7c\x36\xe2\x19"
- "\xdf\xcb\x00\xe5\x8d\xc3\xc6\x49\xfd\x71\xea\xdf\x44\xd4\xeb\xa1"
- "\x7f\x67\xd8\x98\x00\x4d\x29\xd0\x54\x7c\x87\x6d\x34\xa7\x39\x9b"
- "\xf9\xe6\xe3\x1e\x60\xcc\x5f\xc2\xd6\xaa\x4b\x09\x92\x2d\x13\xd7"
- "\x28\x6e\xc3\xbc\x24\xcb\x7f\x18\x7b\x6b\xa3\xb4\x7e\x5d\x72\x92"
- "\xff\xf8\x33\xe1\x5c\x99\x33\x0f\x39\x3d\xef\x24\x3e\x0f\xea\xc5"
- "\xf0\xfd\x00\xc3\xc6\xe1\x7c\x87\x72\x30\xfa\x62\xe2\xbd\xd8\x47"
- "\x4f\x39\xeb\x3c\xc5\x46\x94\xc7\xf1\x2b\x9d\x34\x8e\x05\x2c\x77"
- "\xd2\x57\xe1\x92\xbd\x8e\xed\x47\x82\x3a\x05\x8e\x1c\xce\x5f\x4d"
- "\x67\x79\xd0\xf2\xdf\x2b\x7f\x3a\x80\xc4\xf1\xb1\xfd\x2a\x1e\x31"
- "\x1e\xe7\x0c\xc7\xfa\xaf\x2a\x38\xcd\x9f\x31\xf3\xfe\x7f\xb5\x1e"
- "\xcf\xcb\xfe\xf7\x5f\x35\x49\xf5\x24\x5c\xe6\xdf\xab\xbe\xfa\x90"
- "\xd5\x63\x79\xae\x9e\x11\x69\x3e\x48\xd3\x48\xbe\xaa\x15\xeb\xf3"
- "\xbc\x84\x2c\x2e\xcf\x57\x2d\x74\xe3\x33\xcd\xd0\x57\xd0\x7f\x9a"
- "\x8b\xf8\x38\xf2\xe7\xc2\xb1\x16\xfb\x82\x63\x84\x7b\xc7\xe9\xc6"
- "\xf7\xca\x69\xd0\x33\x66\xf7\x7b\x49\x99\x5f\xf7\xa3\x97\xc8\x65"
- "\x2e\x43\xa8\x29\xb3\xef\xf2\x77\xbd\x9c\xe8\xe4\xfb\x1c\x20\xd5"
- "\xe1\xd8\xcd\xae\x31\x9f\x72\x43\x2a\xda\x83\xc4\x6b\xa9\xb8\xbf"
- "\xd6\xf1\xdb\xcf\xe9\x77\x2f\xfc\xcd\xfc\x9a\xd3\xd9\xda\xea\x2b"
- "\xef\xdd\xbf\x9c\x00\xe5\x00\x97\x72\xb0\xa2\xbc\x8c\xfb\x3d\x83"
- "\x6c\xd6\xc4\x7c\xc8\xc5\xf3\x62\xdb\xbd\x59\x7f\x52\x69\x04\xf0"
- "\x46\x2c\xee\xc5\x16\xe7\x61\x2c\xee\xe1\x0e\xb4\xbd\xca\xf6\x6f"
- "\xc3\xf5\xe1\xe2\x31\x5c\x3c\x0e\xe1\x39\x4d\x2f\xeb\xe4\xbc\xe4"
- "\x68\xa3\xb9\x1c\xee\x29\x4f\xba\x94\x47\x5e\xca\x93\x8e\xfb\xbf"
- "\xc5\xbc\xae\xd3\xe1\xbe\x84\xee\x72\xd2\xc3\xf5\x35\xd2\x5e\x6e"
- "\x7b\xfe\x50\x9b\x90\x5f\x80\x39\xc5\x1e\xc5\xf8\x5f\x59\x2d\x18"
- "\x03\xa6\x8d\x98\x48\x27\x31\xa5\xb4\x67\x63\x1e\xcd\x1a\x9e\x3f"
- "\x13\xf7\xc0\xaa\xd0\x6e\x8e\xb2\x63\x8d\xe1\x32\xcb\xa1\xb9\xb4"
- "\x85\x84\x1a\x7e\x46\x9b\x60\x0c\x5a\xec\x1b\x87\xda\x44\x3e\xda"
- "\x0a\x6b\xe0\x23\x97\xc8\x15\x66\x2f\x66\x39\xa0\x5b\xd8\x77\x2f"
- "\xff\x8b\xe4\x4a\x06\xab\x43\x63\xb7\xf2\xb1\xbb\xc2\x6c\x5f\xdb"
- "\x73\xa4\x3c\x89\x57\xc2\xa4\xbc\xcc\x66\x72\x25\xfb\x5a\xd0\x42"
- "\x2b\x9c\x8b\x50\xfa\x4c\x5f\x99\x84\x6d\x62\xdf\xcd\xe4\x72\x1b"
- "\xb6\x0d\x75\xa6\x3b\xe6\x2c\x9c\x5f\x6a\x23\x0f\x42\xbf\x2e\x4a"
- "\xed\xc3\x75\x98\xff\x2d\xfe\x78\x1d\xdb\xbc\xb6\xb1\x00\xdb\xcd"
- "\x37\xfb\xfa\x1a\xb8\xcf\xf5\x15\x58\xff\xfe\xcb\xd0\x9d\x0c\x44"
- "\x35\x91\x5a\xc0\x4f\x9d\x90\x1f\xa9\xe1\x31\xba\x23\xb5\xdc\xc6"
- "\x78\xe5\x4b\xf4\xeb\xda\x70\x9d\xf8\xa2\x0f\x04\xe7\xd9\xaf\x9f"
- "\x64\x7c\x0c\xe7\x00\xab\xcb\xe8\xc6\x48\x1d\x5b\xcf\xbc\x5a\xf7"
- "\xaf\xf0\xbc\xd8\x57\x89\x7f\x5e\xb2\x14\x63\xfc\xeb\x31\x4e\x79"
- "\x11\xc4\x7d\x2f\x5f\x2f\xa8\x49\x63\xdf\xbb\x59\x1f\x5d\xfb\x80"
- "\xfd\x85\xb6\x9a\x3d\xca\x98\x9a\x48\x0d\xfb\x3e\xb3\x29\x42\x8c"
- "\xc5\xfa\xf5\x07\x3e\xda\x87\xca\xe1\x59\xfb\x1c\xf9\x20\xa0\x4e"
- "\x1e\xfa\xde\x43\xfb\x8e\xf7\x4c\x66\xcf\xa8\xe7\x73\xfd\xeb\x16"
- "\x61\x63\xa4\x06\xfb\x20\x9e\x6f\xa9\xb1\x59\x31\xf6\x83\xdb\xf8"
- "\x59\x2c\xcf\x1c\xfa\x84\x6f\x8a\xd4\xe0\xbe\xa1\xa7\xad\x52\x9f"
- "\x2d\x2d\xb8\x5f\x05\xfb\xcc\xc7\xd6\x72\x5e\x1a\xc7\xf5\x57\xa1"
- "\xed\xcc\xd3\xa4\x89\x58\x12\xd1\x6f\x0e\xf7\x5f\xe1\x1c\xe6\x63"
- "\x60\x61\x3a\x1f\x7b\x3e\xaf\xc3\x74\x7f\x96\xf3\x07\xda\x2f\x61"
- "\x79\xcb\xe0\x1d\x80\x16\xc6\x4c\xdc\xf3\x6f\x61\xf1\x36\x56\x25"
- "\x13\xfe\xde\xcc\x4f\xf6\x1b\xf1\x3b\x89\xa5\x4c\x5a\x2b\xcc\xe2"
- "\xb9\x0d\xf8\xec\xd4\x4e\x72\x85\x58\xd6\x62\x3e\x72\x18\x0f\x1d"
- "\xc6\x9d\xab\x69\x83\x79\x92\xd6\x89\xbc\xa0\xc3\x3c\x97\x66\x62"
- "\x59\xc3\xd7\x37\x1c\x73\x4b\x12\x3e\x1f\xc7\x16\x68\x67\x81\x31"
- "\x3d\xda\x9e\xf3\x8d\xaf\x34\xa6\x79\x21\xa8\xef\x58\x74\xdd\xad"
- "\x0d\x76\xe8\x73\x0d\x68\x19\xc6\x07\x4f\x63\xff\xaa\x85\x7e\x91"
- "\x1a\xf4\xc9\x86\xdf\x62\xac\x53\x4e\x3b\x3e\x97\xbe\x79\x1b\x9e"
- "\xf1\x0d\xfa\x37\x20\x56\x62\x6c\x34\x38\x37\x51\x1c\x3f\x96\x27"
- "\x22\x3f\x95\x8f\x03\xaf\x7f\x55\xfc\x1e\xfe\x50\x3b\xf4\xab\x58"
- "\xb6\x17\x5f\x65\x6b\x37\xf2\x5b\x09\xd3\x09\xbf\x29\x77\xea\x73"
- "\x1b\xdb\xff\x7a\x15\x6d\x7d\xdf\xc4\xe1\xb3\xd6\x63\x5c\x30\xe4"
- "\x8b\x4b\xce\xfc\xff\xcd\x68\xec\x27\xfa\xfc\xda\x83\x22\x40\xee"
- "\x8d\xf0\xc5\x71\x86\x7b\xd2\x60\x2e\x68\xba\x59\x0b\x59\x8e\xba"
- "\xf6\x9c\xab\x43\xa4\xb5\x10\xf4\x0b\x58\x17\x5a\x07\x32\xbd\x13"
- "\xe4\x69\x93\x80\xf2\x4c\x6b\x18\xf2\x0d\xe0\x6c\x94\x88\xb1\x51"
- "\x70\x4f\x9c\xf4\xcd\xcb\x8e\xfb\x26\xae\xb0\xef\xbd\x6d\x52\xee"
- "\x35\x1e\x87\xef\xea\x6a\x79\x9f\xc5\xd5\xfc\x2e\xfb\x2c\x70\xef"
- "\x4f\x21\xcb\xd1\xb5\x0b\xd7\x94\xea\x96\x26\x5c\x23\xd8\xfd\xb8"
- "\xf7\x22\x13\x74\x72\xbe\x7f\xa8\x09\xed\xf3\x2c\x97\x09\xf6\x85"
- "\xe7\x94\x68\x64\xbf\x81\x6f\x7d\xf1\xc8\x79\xe9\x6a\x9b\x23\xbf"
- "\x38\xd0\x1b\xbf\xb5\x1d\xf6\x7d\x81\x18\x1f\xc3\xf5\xba\x75\x20"
- "\xe6\xca\x6e\xcf\x69\xd5\x4a\x79\xb2\x59\x5e\x6c\xfe\x3e\xc3\x3d"
- "\xc6\x5b\x7c\x8a\x84\x63\xbc\x00\xdc\x5f\xc7\xc6\x40\xf3\x5e\x2c"
- "\xc6\x70\xc6\x78\x94\xc6\x74\xcc\xb5\xd2\x7a\x72\x73\x08\xdb\xa3"
- "\xdc\x66\x7c\xea\x2a\xfa\x61\xb5\x5c\xcc\x60\x71\x96\xfc\xa3\xd3"
- "\x6c\x14\xef\x63\xf2\x44\xd0\x7b\x18\x83\xb0\x85\xe5\x30\xc0\x36"
- "\x6f\x39\x1e\x71\x6b\xa9\x28\x9b\xb6\x00\xee\xff\x00\x68\xc5\x64"
- "\x77\xf8\x1d\x72\x89\xb4\xd9\x79\xbe\x56\x1e\x53\x5f\xf4\xc7\xf6"
- "\xe3\x31\x36\x60\xcc\x58\xcc\x83\xb6\xd7\x74\x4f\x60\x6e\xe3\xb6"
- "\x25\x2c\xbe\x75\xfe\xb0\x18\x71\x0c\x62\x36\xf0\x7e\x05\xce\x4c"
- "\x53\xb3\x3e\x62\xff\xbc\xeb\x5b\x5b\xa4\xa8\x47\xf8\xb5\xe7\xb4"
- "\x65\x4b\xb1\x39\xb8\x3c\xc5\xe3\x5e\x73\x5a\xb4\x5d\x16\xe5\xe7"
- "\x29\xe2\xb3\xa7\xdc\x86\x67\x97\x8b\x6d\xea\x79\xec\xef\xd6\xb9"
- "\xd0\xae\xbe\x3d\xe7\x9a\xbf\xa4\xcf\x88\x7b\x88\x86\x70\x3d\xeb"
- "\x9a\x4e\xd6\x67\x5a\xbb\xc4\x63\x7d\x6e\xd1\xa2\x14\xdd\xdc\xc4"
- "\xc5\x86\x59\x29\x73\x12\x74\xf1\xc9\xc9\x8b\x92\x75\x18\x7c\xc9"
- "\x79\xfe\xf0\xfc\x44\xd7\x86\x8b\xb9\xfc\xca\xe4\x5c\x7e\xd7\x14"
- "\xf9\x2f\xcd\xe4\x5a\xf6\xed\xb1\x5d\x5c\x2b\xf6\xd4\x4e\xbe\x5a"
- "\xd8\x07\xff\xf8\x1d\xc5\x08\xff\x95\x68\xcb\x98\x69\x25\x51\xb0"
- "\xd6\xb3\x18\x17\x72\xcc\x89\x6b\x53\xd0\xc7\xa8\x91\x5c\xeb\x28"
- "\x11\x7c\x09\x8b\x21\x94\x23\xec\xc3\xfa\xdb\xe1\x7e\xf8\x37\xc2"
- "\x7f\x25\xfc\xb3\xfb\x84\xbf\xb0\xfd\xf2\xfb\x9c\xaf\x71\xff\x91"
- "\xcc\xd5\x58\x87\xae\xf4\x65\xf8\x25\x6c\xe2\xf5\x5c\xfa\xa0\xa6"
- "\x39\x57\xf6\x89\xf5\x58\x4e\xae\xbe\x2b\x89\xce\x4d\x3d\x1f\x9a"
- "\x73\x61\x97\x58\x8f\xf9\x00\x48\xef\x83\x39\x04\xa0\xbe\x54\xcf"
- "\x97\xe6\xb4\x46\x88\xf5\x98\x4f\x8e\x90\xa3\x76\xf7\xdc\x5e\x34"
- "\x67\xbf\x4e\xac\xa7\x71\x6e\xcf\xa9\x8e\x9f\x90\xf3\x79\x19\xd6"
- "\x11\x56\xfa\xf2\xf8\xb6\x39\xd7\x8a\xa1\xbe\xdb\xd8\xab\xde\xd1"
- "\xa9\x7d\x8c\x2b\x9d\x0c\x73\x12\xe3\x47\x25\x2e\x4c\xc5\x0c\x52"
- "\x29\x8b\x96\xa4\xe0\x71\xe1\xac\xdf\xb0\xc3\xa2\x99\xf3\xe6\xf0"
- "\x1f\x29\x49\xe1\xf8\x23\x09\xf8\x0d\x8f\x73\x97\x18\xf0\x30\x67"
- "\x11\x16\xd3\x12\x86\x2c\x99\x83\x07\xd7\x7d\xa0\xc0\xe3\xed\x2d"
- "\xc0\x1b\x0d\x1c\x67\xdb\xad\x66\x72\x81\xc9\x74\x98\x27\xe9\x88"
- "\xde\x46\x24\xbb\x96\x32\xe6\x88\xb5\x17\xc6\x1c\x09\x5c\x69\x98"
- "\x13\x68\x4b\x8c\x87\x35\x63\x78\x7b\x8e\x75\xb8\x99\x24\x88\x39"
- "\xac\x87\xc5\xb1\xf8\xa5\x39\xed\xab\x45\xdf\x4e\x5f\x21\x7f\x58"
- "\x30\xc6\xe5\x87\x32\xcb\x49\x0d\xe5\x28\x28\x4f\x87\x32\xe6\xa2"
- "\x0e\x86\x72\x28\xda\xa4\xa0\xac\x85\x72\xa8\x90\x3f\x50\x8f\x7b"
- "\x8c\xa1\xac\x83\x72\x18\xb4\xef\xc8\xff\xe6\x5e\x56\xb6\xee\x97"
- "\xf2\x64\xf3\x9c\xd8\xd6\x0a\x47\x4e\x6c\xcc\xd3\x94\xa9\x99\xce"
- "\xd6\x5f\x26\x83\x58\x9b\x7d\xb4\x0f\xbf\x00\x75\x9a\xa5\xf5\x92"
- "\xdb\x3b\xac\x56\x29\x7e\x0a\xb7\x67\x74\xf8\x3b\xe5\x16\xc7\xb2"
- "\x56\xca\x2d\x8e\xf6\x2e\x96\xdb\x10\x8e\x34\x07\xe3\xc4\x52\xb7"
- "\x7b\xea\x78\x4e\xcc\x8e\x15\x18\x73\xd7\x92\x35\x57\xf5\xc3\x12"
- "\xb4\xa1\x41\x99\xc7\x8c\xa4\x57\x48\x07\x8b\xa7\x2f\xc5\x93\x73"
- "\x8e\x25\xe1\x76\x3f\xd4\xa7\x20\x33\xb0\x3c\x56\x49\x8b\x02\x6d"
- "\xb3\xe2\xb9\x1c\xd8\x71\x86\xe3\x57\x44\x18\x97\x17\x3a\x2a\xe9"
- "\x64\x9e\xeb\xc4\x4c\x3a\x27\xa2\xce\x12\xa8\x4a\x5a\x44\xe1\xde"
- "\xc0\xb4\x59\xf1\xec\x1c\xd4\x5b\x05\xb2\x9a\xd8\xbf\xdd\xa6\x50"
- "\xdc\xe3\x2a\x88\x31\x32\x3a\x76\xcd\x78\x38\x1b\x9f\xe3\xcf\xe4"
- "\x90\x4f\x49\x00\xe6\xa6\xc4\xbe\x95\x38\xc5\xbb\xdb\x00\xe7\xd0"
- "\x87\xb4\x75\x32\x09\xc0\xf8\xbe\x62\x5f\x76\xf1\xbc\x60\x9d\x63"
- "\xa4\x58\x53\x66\x38\xe7\xfa\x3e\x93\xff\x9d\x71\xe5\xc0\x39\x43"
- "\x62\xc6\xc2\xaf\x21\x62\x7a\x67\x67\xde\x0c\x6d\xed\x37\x4a\xd3"
- "\xba\xe7\xb9\x3f\xf0\x1c\x9e\x9d\xa0\xff\x77\x44\x30\x1f\x16\xd4"
- "\x4b\xda\x63\x8b\xb8\x0f\x6a\x67\x35\xc6\xd3\x15\x72\x50\x9e\xc4"
- "\x7d\xd3\x9d\x07\x91\x67\xa9\x26\x42\xbf\x7d\x05\xc6\x6e\x56\xc1"
- "\x18\x77\xbe\x8f\xd7\xc4\x98\x5d\x6a\x16\xe3\xca\x4e\xb4\x6c\x8f"
- "\x30\xc8\x28\xb8\x07\xf5\x22\xb1\x7f\x88\x72\x07\xda\x93\x84\x9c"
- "\xce\x58\xe4\x5b\xa0\x31\xc6\x10\x69\xa3\xfd\x86\x81\xdc\x18\x51"
- "\x85\x7c\x8c\xb2\xae\x49\x83\x63\x76\x23\x0c\x9e\xfb\x3c\xfc\xff"
- "\x8a\xe7\x94\x79\xa5\x59\x6a\x13\xe3\xaa\x81\x0c\x85\xba\xa3\xa6"
- "\x3d\xe7\xc6\x44\xa7\x5c\x7b\xe2\x9e\xe8\x1b\x0b\x30\xde\x1b\xb6"
- "\xcd\x65\x67\xfb\x4e\x2e\x83\xdc\x48\x33\x93\xc0\x02\x3e\x17\x6f"
- "\x80\xfc\xf3\x1f\x71\xe2\x6f\x90\x7f\x86\xee\x73\x69\xe3\x94\x64"
- "\x2b\xe5\x3c\x7d\x63\x3f\xf0\xe8\xf3\xf0\xff\x2b\xa8\x6f\x94\xf2"
- "\xc9\xaf\x52\xb3\x7d\x92\x17\x7d\xb4\xb8\xdf\xfd\x46\xbd\x74\xbe"
- "\x97\x2a\x0a\xc6\xf4\x46\xb3\x34\xf7\x5b\xfb\x45\x04\x40\xd9\x2a"
- "\xd9\x58\xb8\xcd\xc5\xe6\x2f\x97\x23\xb4\x50\xd6\x4a\x65\xf8\x1d"
- "\x26\x61\x05\xea\x89\xad\xa0\x4b\xa2\xde\x39\x47\x0b\x72\xa1\x16"
- "\xf5\x3c\x1b\xd0\xff\x3f\x74\x62\xdd\x18\x33\x59\x2b\x62\x8c\x6d"
- "\xba\xd9\xd7\x6f\x87\xf4\x2e\x42\x8e\x4f\x20\x7f\x1f\x7b\x81\xb0"
- "\xb1\x40\x6b\x09\x1a\x6a\x84\x3a\xb0\xfe\x5b\x4b\x59\x9d\xd4\xcb"
- "\xa5\xeb\x3a\x35\x53\x4c\xab\x41\x4e\x9e\x87\xfc\x65\x67\x7e\x58"
- "\xeb\xd3\x35\x31\x28\x63\x62\xcc\x0f\x16\x9f\x0f\x63\x54\xda\x88"
- "\x1f\xcb\x0b\xb0\xb1\xc0\x9f\xc5\xc3\x5f\xaa\x0f\x90\xe2\x53\x82"
- "\xae\xb9\x9f\xaa\x93\xaa\x30\x66\x25\xcb\xff\xd1\xae\xef\xcb\xe2"
- "\x54\x8a\xf1\x29\xb7\xa5\x92\xe0\x62\x81\xc7\xa7\x64\xf1\x40\xfc"
- "\x40\x27\x49\x75\x1f\xa3\x92\xe6\x94\xa5\x48\x31\x2a\xe9\x75\xbb"
- "\x15\x7e\x23\x2f\x60\x5e\x74\x3d\x2b\xcb\xb1\xa5\x7c\xdd\xc6\xac"
- "\x54\x03\xc6\xa9\x79\xcc\x4a\xef\xd6\x06\x7b\x1c\xe7\x13\x7b\xa9"
- "\x94\xef\xde\xe9\x1c\xe0\x5f\x87\x18\xcb\xe0\x46\x92\x78\xae\xd2"
- "\x4c\x72\x53\x44\xff\x4a\x0b\xda\xc8\x0a\x98\x1d\xac\x13\xf7\x5f"
- "\x6c\x75\x87\x2f\x57\xfb\xed\xae\xbd\xca\x62\x51\x08\xf0\x3c\x81"
- "\x61\x1d\xd7\x1b\x05\x7f\xd7\x39\x3c\x7b\xce\xa2\xb9\xf1\x33\xe7"
- "\x2f\x30\xe8\x26\x4f\x79\x9e\x25\x3b\x1c\xa2\x4b\x4c\x89\x67\xcb"
- "\x8f\x6e\xf2\xd8\xe7\xa2\xa3\xa7\xcc\xfc\xf7\x29\xa3\xa7\x4c\xfd"
- "\xf7\x67\xf9\xee\xc4\x29\xc9\xcb\x30\x61\x66\xca\x22\x1d\xde\x34"
- "\x5b\xcc\xb2\x9d\x1e\x9f\xbc\xc8\x75\xee\x07\x33\x9b\x96\x9a\xd9"
- "\x6f\xdb\xf0\x37\xb7\x9b\x09\x3b\x24\x7b\x16\xc7\x39\x61\x0b\x8e"
- "\x2d\xcb\x5f\x9a\x23\x84\xa2\x2c\x25\xe6\x3f\xc7\x35\xc6\x17\xe7"
- "\x2f\xae\x35\xf0\x2e\xb5\xce\x71\xb8\xc4\x7b\x31\x1e\x97\x46\x9a"
- "\xb7\xfc\x1c\xed\x4d\x1f\x7c\x30\x8b\xc7\xd2\xa2\xbe\x92\x8d\x1b"
- "\xcf\x49\x7d\x68\xc4\x3a\x39\xc2\x8b\x72\x9e\x5d\x3a\x44\xce\x25"
- "\xc9\xfe\x14\x63\x44\x08\x8a\x2e\xbd\x60\xec\xfc\xe0\xff\x1e\xfc"
- "\x1f\xe7\xc0\xf2\x54\x5a\x8f\xfa\x59\xa0\x0a\xd6\xdb\x34\x1f\x9e"
- "\x8b\x2a\xb7\x8e\xe5\x4f\x88\xb6\xdb\x7c\x66\xda\xd5\x70\xf4\xa1"
- "\x33\xed\xbe\x4c\x27\xa4\xa9\xb4\x8e\xed\xab\x4f\xa5\xb5\x98\x73"
- "\x0d\xf8\x78\x4d\xb4\x2d\x73\x4d\xb4\x9d\xda\x66\x82\xac\x0e\xc7"
- "\x7f\xe0\xfe\xf0\x68\xfb\x3f\x28\xcb\x3b\x83\xfb\xe8\x79\x4c\xc1"
- "\x4a\xf4\x97\x9c\x01\x3c\x5c\x72\x95\xe7\xea\x8d\x5e\xf6\xf5\xb9"
- "\x99\xcb\xcc\x3c\x57\xef\x15\x9e\xdf\x9a\xe7\x00\x27\x99\xd0\xce"
- "\xb1\x99\x76\x1f\x5d\xb4\xfd\x06\x65\x7b\x5c\x73\x89\xa6\xbb\xfc"
- "\xbb\x88\xa7\x8b\x1f\x20\x6a\xb4\xad\xd8\xdf\x79\x82\xc5\x0f\xcc"
- "\xb2\x50\x2b\xc6\xa1\xf9\xa8\xb3\x5e\xad\x4b\xf5\x25\x8d\x2a\xf2"
- "\x93\x1a\x43\xb8\xfb\x3d\xce\x79\xc3\xf4\x74\xcb\x88\xb9\x34\xef"
- "\x27\xbe\x70\x6c\x82\x75\xcc\x86\xd8\x4e\xf3\x46\x98\xe9\x96\x08"
- "\x38\x3f\xea\x20\x1c\x9b\x68\xde\xb3\x45\x74\xcb\x48\x28\x47\xa5"
- "\xc0\x11\xca\xfd\xe2\xa0\x7e\x1c\xcd\xbb\xbf\x16\x8e\x66\x9a\xd7"
- "\x3f\x0a\xea\x41\x39\x64\x1f\x1c\xa1\xac\xd5\x41\x3d\x28\x3f\x90"
- "\x7f\x51\xa5\x22\xf0\x1b\xce\x3d\x1f\xc3\x9f\xf5\xc2\x74\xf6\xac"
- "\xbc\xf1\x09\xfc\x19\x13\x53\xf8\x33\xa2\xb3\xf9\x33\x26\xaf\xe3"
- "\xcf\x78\x08\xee\x1b\x91\x40\xf3\x42\x5b\xe0\xd8\x4c\xf3\x1e\xa9"
- "\x87\x7a\x50\xd6\x55\xc0\x11\xca\x8f\xc1\xb3\x46\x42\x39\xac\x18"
- "\x8e\x50\x7e\x7c\x0d\xd4\x4b\xa2\x79\xfa\x34\x38\xb6\xd0\xbc\x27"
- "\xb0\x7d\x28\x0f\x89\x85\x23\x94\x9f\x1a\x07\xf5\xa0\x1c\x1e\x01"
- "\x47\x28\x4f\x85\x77\x1a\x61\xa0\x79\xbf\x9a\x08\x47\x0b\xcd\x7b"
- "\x19\x9e\x17\x01\xe5\x69\xfb\xe1\x08\xe5\xe9\x70\xff\x48\x28\xcf"
- "\x08\x85\x23\x94\x67\xe2\xbb\xa6\xd0\xbc\x59\xf8\x9c\x36\x9a\x37"
- "\x07\xdf\x19\xca\x73\xad\x70\x84\xf2\x3c\xec\x0f\x94\x13\xf0\x3e"
- "\x28\xcf\x87\x31\x18\x91\x46\xf3\x92\x2c\x70\xb4\xd2\xbc\x45\x46"
- "\xa8\x07\xe5\xe4\x7c\x38\x42\x79\x09\x8c\xe1\x48\x28\xa7\x85\xc3"
- "\x11\xca\xcb\xf1\x7d\x33\x68\xde\x8a\x3a\x38\xda\x68\x5e\x76\x19"
- "\xd4\x83\xf2\xaa\x0c\x38\x42\x39\x17\xc6\x6f\x24\x94\xd7\x86\xc1"
- "\xd1\x2d\x3f\xd0\xbc\x75\x20\x0b\xfb\x11\x9a\x57\x34\x9c\xae\xbc"
- "\x07\x8e\x5b\x9b\xe8\xca\x5e\x7a\x9a\xb7\xad\x00\xce\xc3\xf1\x0d"
- "\x90\xad\x7b\x0d\x11\xcb\x70\x7c\xf3\x20\x94\xc3\xc5\x32\x1c\x8b"
- "\xcb\xa0\x3c\x5c\x2c\xc3\xf1\x2d\x2c\x47\xd0\xbc\xdf\xc3\xd1\x0f"
- "\x8f\x7a\x28\x47\x8a\x65\x38\xee\x48\x81\x23\xf4\x6d\x7b\x1c\x9c"
- "\x8f\xa2\x79\xa5\x3a\x28\xe3\xd1\x0c\xe5\x31\x70\xff\x18\x28\x8f"
- "\xb1\x0c\x1c\xa4\x43\x5e\x15\xfa\x09\x3a\x1a\xf2\x8c\x39\xeb\x1a"
- "\x51\x23\x8f\x62\x1e\x0e\x58\x87\x1f\x6d\x54\xa9\xcf\xec\xcb\x34"
- "\x33\xf9\xc0\x5e\x38\x22\x4e\x08\x19\x61\x86\xf3\x7e\x50\xef\x9e"
- "\x8b\x2a\xdf\xde\x88\x47\xa6\x0c\x33\xcb\x05\x28\xc6\xc2\xf4\x6b"
- "\x54\xf9\xf4\x02\x59\x2a\x02\xf0\x5f\x0d\xe3\x55\x4c\x73\x7a\x5d"
- "\x85\x71\x0a\xa5\x39\xf7\x36\xc2\x11\xca\x41\x9f\xc2\x38\x41\xf9"
- "\xa7\xbf\x85\x23\x94\x5f\x79\x8e\x6e\x19\x15\xda\x9e\xeb\x33\xd7"
- "\xac\x22\x3c\x56\xdf\x9e\xe7\x4a\x03\x6d\x94\x46\x03\xd2\xd2\xb7"
- "\xe6\xe9\x02\x6d\x46\xa0\xc1\x04\x58\x3f\xa2\x08\x7d\x5b\x0f\x7d"
- "\xbd\x27\x1c\xfb\x84\x79\x79\xe8\x8d\x30\x35\x7f\xf6\xbd\x14\x9e"
- "\xbd\x11\xf3\x47\xd0\x90\x47\x3d\x5d\x7f\x9f\x5d\x7f\x6c\x5e\x29"
- "\xbf\xee\x4f\xe4\xeb\xaf\xe0\xf5\x4f\x02\x31\x0e\xfb\xe3\x8f\xb0"
- "\xeb\xa6\xb6\x66\xf1\xbd\x7c\xf0\xda\x65\xac\x6b\x56\x71\x1d\xc8"
- "\xac\xf2\x09\xa6\x39\x3e\xa4\x55\x13\xd1\xdc\x9e\xeb\xab\x83\xbe"
- "\x87\x8a\xb2\x7e\x30\xd5\x0c\xd3\xf2\x58\x28\x91\x11\x9e\xec\x45"
- "\x42\x41\xf4\x9a\xf5\x80\xa1\xa8\x3f\xc3\x5a\xaa\xd6\x65\x86\x95"
- "\x37\xaa\x7a\xb5\x6c\x43\xf9\x2a\x38\x9e\x7d\x17\x69\x54\xf9\xbe"
- "\x7f\x63\xd3\xc8\xe1\xba\xf4\x40\x78\x7e\xaf\xcb\x59\x56\x7a\xcd"
- "\x98\xf9\x1c\xb9\xc8\xcf\x1b\xd8\x5e\x23\xfe\x7b\x3a\xf3\x21\xe5"
- "\xbf\xc7\x31\x7b\x35\xb4\x85\xf7\x3a\xeb\x2b\xf6\xdc\x8a\x72\x21"
- "\x24\xde\xc0\xbe\xc1\xab\x7c\x3f\xf8\x50\x30\xab\x03\x53\x48\x2f"
- "\x5d\xfa\x47\xd0\xbe\xaf\x4d\xa1\xdb\x3a\xea\xb2\x6b\xe7\x0f\x41"
- "\xdd\x37\xd1\x0e\x95\xdb\xcb\x91\xff\x98\xc2\x3b\xfc\x0e\xd7\x51"
- "\x35\x41\x5b\x96\x2f\x93\x95\x55\xbd\xd6\x61\xec\x5c\x5b\xf0\x38"
- "\x83\x2d\x5f\xd0\xd8\x0b\xe2\xe3\x68\x61\xbc\xa1\xaf\x4d\x45\x98"
- "\xaf\xbf\xaa\xd7\xc7\x4f\x5b\x51\x36\x3d\x8e\x75\x97\x09\x7e\x26"
- "\xff\xa7\xd2\x88\xda\x98\x7c\x1a\xcb\x07\x68\xee\xe9\x48\x53\x4b"
- "\x3d\x31\x26\xb3\xb6\xca\x69\xee\x37\xf9\x82\xdf\x85\x35\x25\x28"
- "\xe3\xa7\xa1\x8d\xee\x53\x3c\xff\x2c\xd0\xc5\x17\xfa\x22\xe7\xff"
- "\x86\xb1\x5c\x0f\x63\x87\xf2\x37\xc6\xcd\x98\x69\xb7\x63\x1c\xba"
- "\x35\x66\x18\x07\x4e\xaf\x5e\x19\x98\x3b\x5d\x7c\xee\x27\x42\xbf"
- "\x91\xba\x9a\xe9\xf8\xbd\xd1\x1f\xe3\x7a\x5d\x63\x7b\xed\x6d\x98"
- "\x13\x11\xd6\x2d\xb1\xae\x33\xed\x12\xc5\x18\x03\x89\x0b\x53\x92"
- "\x5f\xd3\x2d\x4e\x4c\x8f\x7f\x76\xe0\x92\x21\xba\xe4\x34\x5d\x32"
- "\xcb\x65\xcf\x4e\xc0\x32\xbf\x38\x69\x51\x8a\x0e\x73\x8a\x77\xcd"
- "\x69\xac\x05\x19\xdc\xca\x64\x53\xd5\xbd\x46\xa6\x9f\x94\xce\xd3"
- "\xa6\x64\x50\x41\xf7\xd8\x3d\xf4\x8a\xca\x6f\x5d\x87\x5f\x2f\x2b"
- "\xae\xdd\x42\x8e\x8e\x88\xf1\x93\x03\xb6\xf6\x23\xb8\x1f\xd0\xbf"
- "\x3d\xd7\x6f\xb5\x63\x5d\x55\xdd\x5b\xc5\xec\x2e\xb9\x7e\x45\xc0"
- "\x8f\x91\xe2\x77\x37\x1e\x2b\x50\xbc\xc6\xbe\x4b\xe7\xfa\x95\x9b"
- "\x49\x22\x9f\x53\xa5\xf1\x69\x6c\x4d\x57\xf9\x31\x7b\x3a\xd5\xcd"
- "\xd3\xd2\x1d\x7a\xcc\xd3\xa6\x62\xdf\x00\x6d\x8f\x52\x13\xb9\xca"
- "\x63\xf7\x6e\x19\x9f\x8d\xf1\x3e\xec\x85\xcf\x10\x21\x64\x7c\xb6"
- "\xf0\x8e\xde\x9c\xf5\x16\x51\xef\x05\x2c\xf0\xd5\xc1\x7c\x78\x8c"
- "\x3c\xfa\x51\x66\xb3\x1a\xfa\xdc\xf1\x51\x66\xbd\x9a\x16\x3c\x53"
- "\xdf\x1a\x36\xca\xdf\x2a\xe6\xbe\x36\xd9\xac\xe4\xaf\xa0\xb5\x83"
- "\x0e\x58\xde\xd6\x7f\xb2\xbe\xad\xff\xa8\x66\xeb\x96\x69\xf9\xc6"
- "\xc7\x86\x91\xb1\x83\xe9\xd7\x47\x2b\x08\x69\x51\xdd\xbb\xff\xe8"
- "\x18\xa6\x97\x58\xac\x9a\x88\xb6\xb6\xc2\xf1\x2c\x46\x61\x47\xe1"
- "\x34\x73\x67\xc8\xb3\x71\x87\xa1\xce\x71\xd0\x9b\x4e\xe8\x80\x7f"
- "\x07\x10\x75\xc7\xe3\x83\x0c\x7b\x3b\xf3\xd5\x95\x15\x91\xdc\x66"
- "\x1c\x07\x73\x86\xf1\xd3\x3d\xdb\x8e\xee\xaf\x20\xf0\x6c\xb2\xb7"
- "\x73\x9c\xfa\xaf\x11\x5d\xae\x7f\x78\x34\xbc\x82\xb4\x63\x3c\x66"
- "\xd0\x4b\x0f\x9d\x2e\x22\xb4\x30\x26\x6a\x77\xba\x55\x3d\xdd\x4c"
- "\xd4\xd5\xf5\x45\x24\xe3\x02\xb9\xcf\xf6\xb5\xde\xf7\x3d\xb8\xbf"
- "\x03\xe3\xa7\x9e\xd0\xb2\x38\x8a\x99\x46\x96\xd7\x36\xb0\x06\xe4"
- "\x0f\xe1\x6b\xbd\x5f\xcd\x14\x23\x81\xeb\x7b\x6c\xff\xa6\x25\xd5"
- "\x09\x16\x62\x8a\x2d\x25\x1d\xea\x28\x72\x60\x5a\x29\x79\x13\x74"
- "\x9c\x37\xaf\x90\x00\x26\x4b\xdf\xd0\xfb\xd9\x6e\xe8\x7d\x6d\xcb"
- "\xf5\x18\xd7\x8a\xd2\xaf\xf5\x7d\x50\xb6\xb6\x2d\xd2\xfb\xd7\x58"
- "\x4a\xc9\xd3\xcd\x44\xdf\xa1\x26\x81\x1d\xcb\xf5\x7d\x6a\x0c\x45"
- "\xd0\x16\x08\xcb\x30\xae\x18\x53\x0f\x63\xed\xe1\x38\xdd\x1b\x4b"
- "\xa6\xb4\xa8\xee\x59\xd2\xa7\x8e\xf4\xc7\x98\xae\x28\xaf\x62\xfc"
- "\x67\x21\x38\x26\xca\x1e\x3c\x1e\x73\x63\x05\xb2\x98\x45\x7b\x9e"
- "\xcb\x46\x79\x1f\x64\x19\x15\xbe\xb3\x40\xf5\x7d\x66\xe2\x71\xd3"
- "\xd0\x3d\x28\xf3\x0b\xed\x5a\xcc\x19\xe5\x8f\xfd\xc4\xfc\xcd\x2b"
- "\xce\xc3\x58\x66\xe9\x7d\xa1\x5e\x00\x9c\xef\x6b\x6a\xb1\x12\xfb"
- "\x93\xcf\xe5\x3f\x65\x60\x79\x79\x83\x4b\x32\x89\x26\x3f\x93\x04"
- "\xeb\x7e\xca\x78\x69\x8b\x7d\xf7\x73\xd9\x34\x57\x9b\x80\xb6\x1c"
- "\x7e\xae\xcf\x12\xdd\x0b\x84\xe8\x86\xb1\xdf\x0f\xeb\x46\x01\x0d"
- "\x83\xa3\x4b\x99\x3e\x82\xfa\xae\xaa\x4f\x10\xe7\xf1\x3e\xbd\x3b"
- "\xfc\x66\xef\x12\x72\xb7\x54\x0a\x2b\x7d\x43\x31\x67\xf7\x15\x55"
- "\xef\xcb\x34\x6f\x6f\x28\x2d\x98\xc6\x78\x11\xca\x5f\x76\xf8\x05"
- "\x6b\xe0\x5c\x36\xb4\x1f\xd9\xa1\xf2\xad\x83\xff\x7a\x7e\x7f\x6f"
- "\x33\xbe\xb7\x7d\xc7\x20\x2b\xbe\x37\xcb\x33\x04\xef\x35\x13\x68"
- "\x46\x43\xa2\x63\x58\xec\xfd\x1b\x7a\x7f\x29\x0f\x2b\x8e\x07\x8e"
- "\x81\x70\x43\xdf\x87\xbd\xeb\x0d\x7d\x00\x8c\x2f\xc6\x6f\x0e\xcc"
- "\x9c\x05\xf7\x14\x46\xcf\x85\x6b\x7d\x3b\x82\xa3\x8b\x30\xdf\x97"
- "\xc9\x60\x21\xf6\x2d\xd1\x71\x18\x9f\x70\x6b\x3a\xcc\xb9\xfe\xd1"
- "\xb0\x8e\x47\x27\x89\x73\x8b\x60\x3f\x85\xbc\xbd\x55\x1d\xb8\x2f"
- "\x0f\xfa\x06\xfd\xab\x83\xff\x7a\xb3\xaa\xf7\xdc\x8e\x81\x7a\x7f"
- "\x38\x46\x40\x5f\x43\x69\x6e\x78\x11\xfe\x86\x6b\xa1\xf0\xce\x2f"
- "\xe2\x38\xe0\x78\x88\x63\x31\x56\x1e\x8b\xe9\x75\x50\x6f\xb8\x90"
- "\x9b\x0f\xcf\xe8\x13\x4c\x73\x7f\x14\xeb\x54\x6f\x81\x5c\x2f\x21"
- "\x8d\xd7\x7b\x33\x94\xd7\xfb\x49\x2d\xd0\xa1\xb7\x38\xde\xef\xbb"
- "\x19\xef\x9d\xf2\xbd\x93\x74\xfc\xde\xd7\x77\xf1\x7b\x75\x70\x6f"
- "\x9f\xf3\x2e\x7d\x3a\x25\xd7\xff\xb7\x29\xbc\x7e\xf6\x74\x5e\xff"
- "\xa1\x62\xb9\xde\xbd\x2a\xb9\xde\x2f\xcd\xbc\xde\x6f\xdb\x78\xbd"
- "\x81\x36\xb8\xfe\x6c\xd7\xbe\xdc\xfb\x13\xf9\x9e\x94\xb9\xfc\x9e"
- "\x77\x34\xfc\x9e\xa8\x75\x70\x7d\x81\xb2\x2f\xf7\xc6\xcb\xf5\x17"
- "\x8a\xef\x5d\x5a\xca\xeb\x3f\x13\xe1\x54\x6f\xbd\xc8\x13\x70\xfd"
- "\x3d\xa8\xd7\xc7\xbf\xc3\x2f\x7d\x1c\xaf\x37\xb6\x1e\xf9\x11\xea"
- "\xec\x16\x72\x1f\xb0\x76\xf8\x85\x34\x99\x55\xfe\x36\xa0\x8d\x16"
- "\x8f\x40\x3b\xad\x90\x1f\x61\x81\xdf\x29\xf8\x4d\x08\x31\xd7\xac"
- "\xf2\x9b\x02\xb8\x6b\x77\x6b\x37\xcb\xbd\xb7\xc5\x61\xb7\x13\x40"
- "\x7e\xd8\x32\xc2\x6d\xdc\x4e\x96\xe7\x19\x65\x88\xc2\x11\xd9\xf9"
- "\x02\xcf\x17\x0f\x3c\x0a\xf2\x4f\x40\x7f\x58\x0b\xb3\x59\x9c\xe6"
- "\x82\x09\x44\x08\x03\x8c\xbd\x4c\x7c\x4c\x19\xcd\x64\x9f\xd0\xac"
- "\xce\xef\x24\xbe\x35\xb0\xce\x60\xfd\x7d\xb0\xa6\xea\x16\xa2\x6c"
- "\x11\xf0\x64\xfe\x75\xb1\xbd\xd2\x79\xba\xac\x05\x3c\x47\x36\xca"
- "\x61\x88\xcd\x30\x1f\x03\x58\xee\xb6\x85\xf7\x60\xdd\x59\xf0\xdb"
- "\x1f\xeb\x76\x3c\xfe\x78\x69\xc7\xef\xe7\xe9\x3a\x43\x22\xe3\x3a"
- "\xdf\x19\x9c\x7d\x23\x64\x02\xb9\x51\x38\x2e\xdb\xf6\xfb\xf8\x7c"
- "\xdb\xe3\x7a\x9d\x3d\x24\xd2\x0c\xcf\x06\xdc\x2e\x52\xef\x11\xf6"
- "\xa9\xf7\x64\x1a\xd5\xd8\xee\x47\x99\xa5\xea\x43\x99\xb5\xea\x43"
- "\x42\xb9\xfa\xa3\xcc\x7c\x38\x96\x61\x1e\x2f\x90\xf7\x02\xde\x3f"
- "\x94\x59\x09\xeb\x46\x00\x8c\xd7\xbd\xf5\x92\xdd\x93\x3e\x67\x23"
- "\x35\x65\x36\x72\x24\xe5\x1a\xb1\x04\x45\x58\xe1\xdf\x66\xe9\x1f"
- "\xbd\xc6\xd2\x7f\x5a\x3e\xeb\x73\xc8\x24\xf6\x8e\xb8\xaf\xf5\x90"
- "\xc0\xfb\x2c\x8e\x07\xb4\x79\xdf\x03\x25\x02\xfa\x9c\x88\x31\xac"
- "\x55\xf7\xd5\x75\x89\x61\xad\xe6\x39\xe4\x1c\x71\xac\xbf\x8b\x18"
- "\xd6\xa2\xcd\x81\xc5\xb0\x06\xfd\x91\xe9\x91\xb0\x7e\xb1\xbc\x93"
- "\x36\x90\xcf\xb6\xfc\xc2\x8c\xfa\x22\xca\x63\xed\xb9\x7d\x1d\xf1"
- "\x5f\x51\xc6\xb0\x6f\x1c\xe9\x0f\xff\x20\x7f\xf4\x05\x5e\x7a\x3f"
- "\x45\x3a\x4f\x37\x51\x1d\xda\xdf\xed\x34\xe1\x67\xed\xb8\x57\x93"
- "\x26\xfc\xdc\xbe\x65\x94\xc5\xbe\x65\x9a\x01\xce\x45\xc2\xff\xb3"
- "\xf6\x8d\x34\x0c\xfe\xf5\xf0\x3f\x04\xfe\xc3\xe1\x7f\x38\xfc\x47"
- "\xc0\x7f\x14\xfc\x8f\x81\xff\x71\xf0\x3f\x11\xfe\x63\xe0\x7f\x0a"
- "\x0d\xa2\x91\x18\x83\x13\xda\x8e\x03\xba\x6b\xa5\x76\xe5\xf1\xed"
- "\xbb\x02\xde\x37\x0a\xe5\x1f\xc0\xab\x08\xca\xf1\x4a\x4b\xdf\x1e"
- "\xa4\x47\xdc\xa5\x03\x47\xf9\x5b\x06\xcc\xd3\x58\xfa\x4f\xd2\x58"
- "\x06\xc4\xa7\x59\x82\x92\x8c\xf0\x5f\x09\xff\xb5\x96\x2d\xd1\xa5"
- "\x40\xc3\x34\x4b\xff\x98\x70\x78\x17\x98\x37\xfd\xd9\xbe\x4c\xf8"
- "\x0d\xf4\xef\x6f\x16\x7f\x83\xbc\xd1\x6f\x1c\xfe\x86\x7a\x20\xff"
- "\x05\x06\x98\x55\xf7\xb3\x7a\xad\x21\xd1\xfb\xc4\x7d\x9e\xd9\x70"
- "\x3e\xcc\xec\xfb\x68\x3d\xaf\x37\xce\xe0\x3c\x67\x16\xcc\x31\xcc"
- "\x5c\x30\x2b\x6d\xe6\xe2\xa4\xc4\x39\xf1\x8b\x47\xe9\x06\xce\xd5"
- "\xe9\x13\x93\x5f\x9b\xf9\xda\x92\xf8\x25\xf1\x4c\x74\x82\x53\x83"
- "\x95\x3e\x6c\x36\xcc\x87\x00\x7a\x40\xdf\x26\x4a\x71\xcd\x9a\xd8"
- "\x06\x7c\xf6\xd8\x3c\xdd\xc1\x2b\x16\xb5\x1d\x64\x97\x80\xa6\x6c"
- "\x98\x7b\x13\xc8\xc1\x2b\x56\x75\x40\x93\x8e\x50\xe0\x77\xbc\x66"
- "\x6a\xaa\x15\x65\x99\x4f\x49\x15\xca\x32\x50\x67\xcf\x42\xab\xfa"
- "\x25\xbc\xff\x1d\xbd\x6e\x2f\xfc\xa6\x85\xe3\xb3\xf1\x3e\x0a\xf2"
- "\x0d\x3b\x82\x7c\xc3\xcb\x91\x71\x87\xd8\x71\x5c\xf6\x21\x56\x2f"
- "\xd2\xfc\x11\x1e\xaf\xaf\xa0\x55\xd0\x2e\xda\xdb\xe8\x3b\x8f\x97"
- "\xb2\x3a\x30\xdf\x58\x1d\x98\x6b\x8d\x2a\x4d\x39\xd6\x63\x3a\x05"
- "\xf4\x71\x2f\xf4\x03\x74\x7e\x5f\x69\xfe\xa2\x0e\xe1\x98\xc3\xa9"
- "\x28\xeb\x69\x06\xe0\x1c\xc6\xfe\x50\x98\xb3\xbb\xe1\xde\x3d\x0b"
- "\x2d\xdc\x0e\x7b\x0d\xb1\xc2\x4c\x10\x27\x10\x1f\x4c\x19\xb5\xec"
- "\xfe\x7d\x42\xad\x1a\xf5\x10\xb8\x77\x16\x5e\x2b\x06\xf9\xac\x98"
- "\xc9\xe3\x9a\x62\x49\x06\x5e\x17\xc2\xe3\xbd\x05\xc4\x01\x6f\xcc"
- "\x26\x8f\x5e\x51\x05\x2e\xc1\xf1\xc3\xf1\xc2\xef\xaf\x34\x37\x70"
- "\x38\xc6\x5a\xd8\xd6\x8f\xf8\xdb\xfa\xc7\x27\x30\x7b\x4d\xae\xa6"
- "\x41\x92\x2b\xdb\x82\xe3\x13\x9c\xe9\xc6\xe9\xa5\x8b\x5f\x38\x6b"
- "\x76\x52\xfc\x5c\xf6\xc9\x6e\xd6\xe2\xc5\x4b\x16\xc4\xeb\xe2\x67"
- "\xcd\x49\xd0\xb1\xcb\xba\x25\x8b\xa1\x4a\x62\xca\x62\xdd\xa2\xa5"
- "\x0b\x75\x0b\x16\x27\xa2\x84\x1c\x9f\x9c\xbc\xc4\x90\xd2\x87\xf0"
- "\x3b\x75\x0b\x96\x24\xa5\x24\x1a\xe0\xc7\xe2\xf8\x85\x73\x75\x8c"
- "\xea\x8b\xa1\xa9\xa4\x24\x9d\xf8\x84\xc5\x09\xb3\x92\x91\x11\x16"
- "\xfe\x1a\x2a\x39\xdd\xaf\x94\x9f\x03\x30\x9e\x1e\xfa\x71\x5d\x51"
- "\xf5\x7b\xb6\xc2\x17\xc6\xba\x20\x3e\x01\xfd\x1f\xa0\x1c\xc9\x74"
- "\xaa\x5c\x4d\x0b\xda\xa9\x37\xc3\x3b\xb6\x02\xdf\xb7\xe7\x06\x95"
- "\x4b\xef\xc6\xec\xd6\x18\x63\x14\xe3\xd7\xaa\xfa\x0d\x66\xfb\x8d"
- "\x81\xff\x99\x7f\x4c\xae\x86\xf2\xb1\x08\x6a\x76\xb6\x8b\x31\x3b"
- "\xac\xaa\x9f\x0a\xfd\xf0\x60\x0e\x44\xa2\x5c\x20\xe6\x84\x50\xd1"
- "\xdc\xa0\x27\xf1\x1e\x61\xcb\xb4\xb4\xf6\xdc\x7e\x3a\x59\x36\x0f"
- "\xb2\x62\x7d\x56\x2f\x37\x68\x02\xed\x1f\x0d\xeb\x59\x50\x03\xf6"
- "\xcb\xc3\x3a\xa2\xbb\x0e\xed\x9e\xd8\x47\xc8\x8f\x82\x89\xfe\xfa"
- "\xa6\xc8\xa8\xf6\x7e\x23\x35\x9d\x39\xe4\x9e\x4e\x98\xcb\x56\x35"
- "\x79\xb4\x03\xf8\x62\xd9\x50\xe2\xb3\xe2\x45\xa2\xde\x37\x7f\x1f"
- "\xc6\x48\x26\x55\xe3\x8a\x88\x29\x0e\x74\x6f\xeb\x2e\x52\x65\x6c"
- "\x24\xd5\xb6\x77\x79\x9e\x91\x74\x94\xad\xef\x7f\x0b\x63\xe2\x65"
- "\xad\xa0\xf6\xbd\x7f\xb2\xf4\xda\x73\x69\x1f\xe6\x07\x79\xd4\x64"
- "\x3b\x67\x34\x65\xec\x20\xa6\x34\x93\x11\xe3\x91\xc0\xb8\xad\x3f"
- "\x04\xd7\x7a\x57\xc1\x7d\x2f\x91\x7b\xa0\xbc\x12\x9f\xb1\xa6\x90"
- "\xd6\xaf\x0d\xa1\x0d\x6b\x0b\xa9\x19\x78\xaa\x09\x78\xaa\x79\x7d"
- "\x08\x6d\x41\xff\x02\xf4\xa3\x40\x3e\x35\xa4\x12\xed\x25\xd5\xfd"
- "\x5a\x66\x03\x18\xc3\xca\x0f\x40\x99\xf9\x7a\x9a\xd2\x0a\xb1\xfc"
- "\x20\x94\x23\x78\xb9\x04\xcb\x0f\x41\x79\x1c\x2f\x1f\xc5\x72\x28"
- "\x94\x63\x79\xb9\x86\xb0\xb8\x1a\xaa\xfb\x13\x78\xf9\x33\x2c\xc3"
- "\xd8\xdf\x9f\x66\x4c\xc5\xfe\x9e\x05\x9a\xdd\xff\x7a\xd6\x19\xd0"
- "\xd1\xd2\x2e\xb2\xf9\xf0\x51\x66\x02\xda\x28\x60\x3e\xdc\xdf\xfb"
- "\xde\x06\xd4\xef\xee\x2f\xf3\x0b\xc7\x63\xbf\x5d\x81\x56\x72\x0f"
- "\xc8\x4b\xf7\xc2\xfb\x2c\xc3\xb1\x73\x6b\x93\xd9\x33\x2a\x3a\xda"
- "\x46\x8d\xf4\x6d\xbd\x96\x6e\x99\x90\x4d\xdf\x1e\x8c\x79\x9e\x61"
- "\x2d\x1b\x11\xb5\x2f\xdd\xca\xe2\x54\x83\x8c\x0a\x73\xe8\x7e\x16"
- "\x2f\xc6\x02\x32\x9f\x87\xb8\xb5\x1a\xba\xe5\x99\x6c\xd0\xa5\xfc"
- "\x5f\xd4\xdb\xd0\x5f\x1a\xe4\xdc\xe0\x65\x47\x12\x50\x36\x88\x69"
- "\x15\x76\x0c\x8e\x13\xb2\x62\x09\x0d\xd3\x6b\x5f\x4c\xa0\x46\x58"
- "\xa7\x54\xdc\xfe\x4d\xcf\xc1\xf3\xcf\xb1\xe7\x0e\xd4\x6b\x85\xa5"
- "\x09\x98\x3f\x8a\xe1\x4b\x26\xae\xd9\xa9\x80\x27\xcb\x63\x03\xed"
- "\x5b\x62\x2c\x47\x12\x2e\x78\x97\x8b\x48\x15\x9c\xe6\xd1\x67\x0a"
- "\xfa\x84\x71\x5b\x6d\xf0\x1c\x1b\xbc\x2b\xca\x07\x7b\x84\x4a\x35"
- "\xc8\x29\xda\xdd\xb3\xeb\x7b\xd1\xa5\xb1\x81\xf0\x4e\x43\x4d\xfa"
- "\x6b\xa4\xa6\x13\xe7\x4a\xff\x88\x23\xd0\xda\xd8\x34\x9b\x31\xd0"
- "\xc2\xe2\x6b\x6b\x0c\xf3\xc9\x23\xb4\xff\x33\xd9\x97\x54\xfd\xd7"
- "\xbc\x94\x01\xef\x00\xef\x7e\xa8\xb1\xde\x57\x80\xf7\x78\x9a\x8f"
- "\x1b\xde\x97\x04\x63\xeb\x2f\xc9\xf6\xde\xf5\xbf\x3f\xe3\x1b\x61"
- "\x71\x2c\xc1\x7d\xd0\x7b\x41\x26\x11\x6e\xc4\x06\x0a\xb0\xfe\xe0"
- "\xb5\x23\xfa\xcb\x04\x9f\xc9\xc7\xba\x3f\x8b\x45\x42\xc3\x60\x9c"
- "\xe1\xf9\x18\xd7\x5b\x1a\x57\xa8\x9b\x64\xbf\x91\xe0\x9e\xfe\x85"
- "\x31\x48\x7b\x42\x37\x52\xb7\x3e\x3d\x74\x93\xf0\x35\xe7\x8f\x41"
- "\x11\xf0\x3f\x8e\xbe\x15\x9f\x6d\x19\x38\x28\x96\xe5\xf7\x2c\xfc"
- "\x85\x45\xb2\x93\xc0\x7c\x03\x1e\x09\xe9\xbd\x0f\xf4\x61\xf7\xb1"
- "\x0c\x37\x47\xb0\xbc\x6a\xbd\xce\xd1\x40\x3b\xe6\x0b\xbe\x86\x31"
- "\xe2\xe1\x1d\xda\xbc\xa4\x69\xc8\x44\x4f\x34\xc5\xf6\x41\xaf\xbe"
- "\xe1\x65\x7b\x1e\xfd\x1f\x60\x6c\x41\x2f\xa7\x9a\x4e\x3a\x46\xc5"
- "\xe5\x6f\xed\x68\x1c\x2b\x1b\xac\x23\xe9\x27\x89\xda\x0a\xeb\xe5"
- "\xbb\xbf\x5c\xa3\x1e\x02\xeb\x8c\x1d\xd6\xfe\x63\xb5\x15\x24\x7a"
- "\x22\xc9\xaa\x4e\xb8\x4a\xa4\x7c\x69\x34\x64\x7c\xf6\xce\x5f\x5a"
- "\xd4\xf8\x1d\x0a\xf3\xa3\x31\x5d\xb5\xf0\x25\xe3\x7b\x9f\x59\x51"
- "\x7f\xdb\xb7\xfb\x33\x8b\xda\xd6\x1a\xab\x63\x31\xea\x41\x2f\xcf"
- "\x4a\xa0\x82\xe3\xdb\x14\xe6\x31\xc9\x1f\xba\x1f\xf3\x4f\x9f\x88"
- "\xa9\x65\x71\x03\x4e\xc4\x56\x90\x13\x0d\x45\xa4\xaa\xe9\x0c\xee"
- "\xa7\x7e\xeb\x44\x6c\x3e\xca\x8c\x7d\x6d\x20\x17\xbe\x09\x72\x21"
- "\xcc\xd7\xde\x82\x66\x73\x84\xf4\x7d\x0a\xf3\xa9\x49\x32\xa1\x0d"
- "\xe6\x68\xb1\x98\x33\xcd\x96\x1b\x12\x5e\x2c\x7e\xab\xc2\x5c\x6a"
- "\x6f\xa4\x92\xb0\x37\xd4\x42\xac\xbb\xef\x52\x7d\x5f\x63\x3e\xd7"
- "\x5a\x21\x68\x73\x84\x94\x53\xed\xa5\xd7\x74\xe4\xcf\xf0\xee\x47"
- "\xf4\xde\xce\x49\x2d\xf3\xb1\xb0\x01\xdf\xd9\x80\xe7\x6c\x30\x9e"
- "\x40\x03\x1b\xd0\xcd\xad\x1e\x22\xd1\xe0\x46\x96\x44\x83\x07\x3e"
- "\x61\x34\x00\xfd\x65\xf9\xcb\x22\x0d\x4e\x03\x0d\x9a\x80\x06\x39"
- "\x24\xfb\xf8\x94\x2a\x12\x1d\x03\x34\x68\xb9\x8a\xf9\x0d\x78\xce"
- "\xba\x14\x3e\xf6\x8c\x16\xa7\x2d\xea\x9a\x36\x4e\x83\x5d\xd3\x38"
- "\x0d\xf6\x4c\xb3\x80\x1c\x33\xc8\xb0\x13\xca\xf6\xa5\xb1\x3a\xcc"
- "\x31\x45\x73\xe2\x30\xbf\x36\xa7\xc5\x0d\xa0\xc5\x0d\x4e\x8b\xcc"
- "\xd7\x80\x16\x75\xf5\x2c\xb6\xd5\x89\x86\x2a\x52\x15\x57\x4a\xaa"
- "\x01\x97\x80\x16\xb3\x90\x2e\xa8\x5b\xdb\x97\xeb\xfb\x81\x2e\x1d"
- "\x5c\x9c\x4e\xb4\x12\x3d\x40\x77\xef\xb3\x3e\x9d\xa0\x9f\x70\x38"
- "\xcc\x4d\x89\x1e\xc1\x8c\x1e\x97\x45\x7a\x74\xa2\xaf\x1d\xd0\xa3"
- "\x13\xe8\xd1\x09\xf4\xc8\xe1\xf4\x40\x9c\x7f\xa9\x2d\x90\x0a\x5f"
- "\xe9\x31\xf6\x45\x57\x7a\x2c\x17\xe9\x71\xfa\x56\xe8\xf1\x40\x71"
- "\x57\x7a\x68\xb3\x7b\xa2\x87\x3c\x27\x1e\x5a\x82\xf4\xb8\x51\x2a"
- "\xce\x89\xc7\x71\x4e\x64\xab\x7f\x04\x6b\x11\x8e\xe9\xb1\xda\x83"
- "\x6c\x4e\xc0\xbb\xc2\x3c\xb0\xaa\xab\x9a\x80\x2e\x73\xc5\x3c\x6a"
- "\x22\x5d\x38\x3d\xc6\x67\x97\x7d\xc6\xc7\x5f\x37\x01\xd7\x0c\x9c"
- "\x1b\x48\x1f\xa0\x13\xcc\x1f\x77\xf9\x06\x9d\xbf\xe1\x42\x9b\x02"
- "\xce\x13\x9c\x23\x38\x1f\xaa\x13\xce\xb0\xfc\xed\x27\x62\x2a\x09"
- "\x7e\xcb\x3d\x11\x7b\x10\x68\x55\x44\xec\x4b\x81\x36\xa9\xb8\x37"
- "\x84\x0c\xc0\xbc\x83\x27\x62\xd7\xa0\xbc\xa0\x01\x9e\xef\x6d\x07"
- "\x3a\xd9\xdb\xb5\x7d\xd6\x81\x1e\x85\xdf\x78\x9d\xbf\xed\x62\x8e"
- "\x65\xea\x17\x12\x0e\xe7\x7d\x6d\x40\x23\x98\x3b\x8a\x39\xe3\xc8"
- "\xbd\xfc\x85\x9e\x6c\x6b\x24\xfe\xf7\x25\x72\x1a\xd9\x9d\xe6\xcc"
- "\x8b\x89\x38\x67\xb2\x81\x46\x27\xbd\xa4\xd1\x43\x51\x0c\xdb\x43"
- "\x00\xab\x83\x60\xf4\x07\x22\x8d\x1e\xd4\x78\xa2\x91\x7d\xc7\xa0"
- "\x08\xbb\x26\x02\xe5\xbc\x47\x85\x45\x53\x54\x02\xe8\x4c\x9d\xa0"
- "\x9b\x9e\xb0\xd8\x48\xc6\xab\x44\x9d\x7e\x86\xf8\x99\xa6\x7c\x4a"
- "\x4c\xe6\x72\x16\x23\x1d\x6d\xbe\x98\xbb\xc4\x64\x2b\x07\xbc\x9a"
- "\x66\xc1\xf2\x36\x56\xb6\x90\xe5\xaf\x12\x1f\x96\x8f\x34\xb6\x94"
- "\xac\x03\xfe\xdc\x3d\xad\x54\x2d\x14\x3c\x53\x4f\x35\x98\x73\x89"
- "\x18\x6b\x0c\x36\x8c\xf1\x16\x50\x9d\x50\x85\x71\x31\xcf\x61\x0c"
- "\xf2\x9a\x36\x68\xd3\x42\x3b\xed\xb0\x66\x94\xe4\xd0\x72\xcc\x43"
- "\xf1\x34\xae\x11\x18\xb7\x4e\x15\x3a\x09\x65\x11\xb4\x7d\x19\x33"
- "\xdf\x00\xd9\x2b\x94\xe5\xee\x81\x73\xaa\xea\xf9\x6d\x70\xfd\xd1"
- "\x23\xd8\x2f\x6e\x87\xe6\xc7\xa7\x31\x9e\x78\xc8\x2b\x3f\xfe\x30"
- "\xd3\xe2\x9b\x0f\x3a\x2f\xc8\x68\xd8\xce\x5b\x94\xeb\x83\xb1\xa6"
- "\x3a\x2b\xb3\x41\x5a\xb2\x12\xfc\xf2\xd3\xd1\x9f\x0b\x73\x5a\xe0"
- "\x9a\xfd\xe8\x12\xf4\x01\xa1\x3b\x60\xbd\x0a\xf9\x85\x65\xdf\x6c"
- "\x8b\x5a\x5e\x97\x43\xab\x60\x3d\x8b\x1d\xab\xa7\x59\x98\xfb\xe3"
- "\x10\xbc\x17\xea\x41\xef\x36\x5a\x19\xa6\xbc\x37\x7b\x8d\x1a\x6d"
- "\x24\x56\xc0\x87\xaa\xcf\xfe\x9b\xe5\x88\xbd\xa8\x7a\xf8\xcc\xf1"
- "\x58\x1b\xc1\xe7\x4f\x1d\x8c\xdf\x19\x1e\xd6\x74\xa8\x4b\xe3\x3a"
- "\xfc\x42\xd6\x65\x35\xc9\xf9\x31\x9d\xf3\x60\x22\xce\xec\x9e\x0d"
- "\x6d\x22\xce\x34\x66\xab\x39\xb6\x44\xa1\x9d\xce\xdf\x15\x5b\xaa"
- "\x5b\x2e\x93\x4c\xe0\xe3\xea\x84\x52\x96\x9f\xa5\x2f\xe0\xbb\xb0"
- "\x1c\xf0\xe4\x06\xe8\xfc\x80\x27\x88\x03\x25\x80\x1f\xc2\x72\xd0"
- "\xf5\x3b\x41\xd7\x17\x71\x04\x65\x2f\x3c\xbe\x0a\x3c\x1a\x58\x09"
- "\xe7\x80\x4e\x02\xe0\x3a\xe0\x89\xfe\xcd\x74\x12\xf6\x26\xf0\xe8"
- "\x36\xc4\x11\x90\x8b\x5f\x32\x00\x8e\x2c\x05\x1c\x49\x65\x79\x8a"
- "\xb5\x25\x6a\x8e\x1f\x7f\x6a\x5c\xa3\xce\x97\xf2\x94\xb3\xf1\x7d"
- "\xe4\xb5\x1a\xe4\x8f\xb8\x6c\xec\xab\xda\x8e\xeb\xd3\xf2\x58\x9f"
- "\x9a\x36\xe0\x91\xc2\x69\x66\x3c\xc7\xe6\xed\xd2\x84\x3e\x02\xe7"
- "\xb5\x28\x1c\x93\xed\x57\x48\x38\xcb\xe5\xf9\xb5\xb6\xcf\x86\x85"
- "\x64\x48\xc9\x15\x12\x56\xb2\x90\xe8\x61\xbe\xaa\x4b\xa0\x0f\x33"
- "\x5e\xd3\x10\x96\x07\xc5\x2f\xa4\x00\xce\xbb\xcd\x83\x02\x72\xb5"
- "\xb6\x04\xe7\xcc\x22\xbd\xa3\x4f\xb6\xfc\x85\xb5\x76\x18\x3b\x16"
- "\x33\x4e\xf5\xc8\x31\xee\xa3\x1d\xa6\xe7\x72\xfe\x23\x36\xee\xe7"
- "\x34\x18\x73\xdc\xdf\x73\x49\xf5\xc8\xfb\x74\xd3\x50\x9d\x21\x9d"
- "\xa8\x2e\x49\xd7\x40\xf6\x14\x80\x56\x4f\x65\x93\x6c\x21\x68\xab"
- "\xde\x94\x76\x19\xf3\x0a\x78\x39\x0f\x1f\x61\x7b\xee\xec\xf9\x0b"
- "\xeb\x98\x6f\xd1\xa6\x85\x0d\xdb\x2f\x91\x70\xfa\x1b\xa0\xc7\x7c"
- "\x78\xd7\x4b\x24\xac\xf8\x12\xbc\xeb\x52\xfe\xae\x52\x5e\x76\x21"
- "\xa7\x34\x01\xae\x75\x9b\x43\xcc\xf2\x1b\xcc\x21\xa6\xb3\x02\x86"
- "\xdd\x4f\x1f\x43\xbf\x65\x16\xd3\xa7\xdd\x64\x3b\x43\xf0\xb9\x68"
- "\x1f\x32\x5d\x65\x3c\xfd\x36\xf2\xb2\x50\x1a\x9f\x3d\xb3\x01\x78"
- "\xbb\x3d\x81\x50\xf8\x7d\xa8\xd1\x82\x31\x74\x98\xcc\x67\x56\x85"
- "\xd6\xa1\x9c\xf6\x11\x9c\x43\xde\x77\xe2\xf9\x3a\xe4\x79\xbc\xce"
- "\xf8\x1e\xee\x33\x35\x5c\x20\xd8\x9e\x73\x3b\x48\x7f\xa9\xad\x8b"
- "\x2a\xdd\x5a\x6c\x0b\x79\x01\xed\x3a\x38\xd7\x38\xed\xcb\xd1\x47"
- "\x5d\x4b\x43\x9e\x8d\xe3\x65\x0b\xe6\xc7\xd1\x20\x0f\x30\x5e\x01"
- "\xfc\xc6\x98\xcd\x94\xc6\xfa\x00\x9f\x61\x3f\xfb\x00\xbd\xc3\x25"
- "\xbe\x80\x73\xc1\xae\xbc\xd1\x77\xa5\x06\x75\x9a\x60\xfc\x7d\xb3"
- "\xfc\xe1\x1d\xfd\x74\x6b\x3c\xfa\xcf\x85\x0d\xc2\x6f\xb5\x8f\x22"
- "\x6e\xda\x5b\x9d\x30\xb3\x85\x63\x26\x62\x92\x84\x9b\x0c\x9b\x58"
- "\x6e\x88\x72\xf4\x6f\x4d\x60\x7d\xf4\x12\x37\xab\x5b\x64\xdc\x7c"
- "\xc9\xe0\x84\x9b\x2d\xb4\x53\x18\xe8\x0e\x37\x07\xac\x55\xe2\xe6"
- "\x80\xf5\x4a\xdc\x0c\xfb\xc6\x15\x37\xbb\x62\xe6\x80\x6a\x77\x78"
- "\x09\x7a\xcc\xa3\x97\x54\x61\xa5\x9e\xb1\x72\x80\xd5\x7b\xac\xfc"
- "\x61\x6f\x25\x56\x3e\x16\xf9\xff\x2f\x56\xfe\x70\x9b\x02\x2b\x35"
- "\x37\x89\x95\x97\x18\x56\x06\xd3\xaf\x60\x4e\x88\xf8\x51\x32\xdf"
- "\x03\x56\xce\xef\x61\x2e\xfc\xc6\x13\x56\xfe\xf0\x9a\x12\x2b\xc3"
- "\xf4\x4a\xac\xfc\xe1\x19\x19\x2b\xc5\x6b\xb7\x05\x2b\x7f\xd8\x76"
- "\x77\xb0\xf2\x87\x6d\x0c\x2b\xaf\x20\x56\x86\x7d\xd2\x33\x56\x3e"
- "\x46\xdc\x63\x25\x9c\x67\x58\xf9\x18\x91\xb1\xf2\x4c\x0f\x58\x39"
- "\xf0\x03\x2f\xb0\x32\x98\x61\xa5\xc6\x03\x56\xce\x87\xb1\x12\xf9"
- "\x82\xf1\x9e\x0b\x6f\x88\x58\xa9\x75\x60\xe5\x4d\xf0\x87\x77\xf4"
- "\x1b\xb8\xbf\x3b\xac\x14\xf2\xb9\x7c\x89\x58\x49\xfb\x89\x58\x99"
- "\x64\x23\xe9\xa7\x00\x23\xeb\x2e\xb1\x1c\x38\xcc\x2f\x18\xfe\x33"
- "\x5e\x46\x2c\x1a\x4f\xf6\xc0\x78\x99\xcc\xfb\x18\x36\x31\xff\xd6"
- "\x89\x88\x55\xfb\xa0\x6e\x91\x43\xee\x64\xd8\x79\x4a\xc4\xce\xe9"
- "\x22\x76\xce\xf8\x16\xd8\x39\x0d\x69\xf9\xf8\x91\x0e\xb5\x84\x9d"
- "\x9b\x00\x3b\x1f\x67\xf2\x03\x7e\xd3\xe4\xd8\xf9\xc4\x68\xa9\x5f"
- "\x68\xd3\x34\xa5\xbc\x41\x78\xbf\xae\x76\xc5\xd1\x09\xd8\xde\xa0"
- "\x07\x8c\xf3\x5b\x88\x03\x4b\xa7\xcb\x58\x7a\x51\x35\xf8\x1b\xcf"
- "\x38\x3a\x28\xca\x81\xa3\x39\x80\xa3\x67\x9d\x70\x14\xf4\xa6\xf7"
- "\x10\xf3\x00\x47\xdb\x19\x8e\xfe\x49\xc4\x51\xfd\xa4\xe3\xd3\x01"
- "\x47\x27\x48\x38\x3a\x68\xb5\x35\xa7\x34\xce\x9a\xdb\x33\x8e\xb6"
- "\x33\x1c\x35\xdc\x79\x1c\xad\x70\xc1\x51\xd0\x5d\x31\x37\xbb\x5b"
- "\x1c\x95\xf8\x91\xe1\x68\xb6\x8c\xa3\x6c\x5c\xf5\x97\x6b\xe2\x60"
- "\xdc\xe3\x0c\x4c\x77\x73\xe0\xa8\x61\x1f\xc7\x51\x38\xc7\xec\x27"
- "\x8b\x01\x47\x81\xff\xb2\xaa\x31\x36\x20\x89\x82\x3e\x6a\x10\x5f"
- "\xb7\xc3\x9c\xc1\x31\x72\xe0\xe9\x7c\x98\x33\x88\x31\xad\x30\x67"
- "\x00\x47\x67\x5c\xd3\x10\x36\x5f\x72\x61\xbe\x5c\xf2\x90\x83\x4f"
- "\xf2\xc1\xf5\x88\xa7\x83\xc7\x2a\xf1\x74\x70\x9a\x12\x4f\x07\x3f"
- "\x29\xe3\xa9\x78\x0d\xf1\x14\x68\x06\xe3\xa3\x47\x4c\xbd\x35\x3c"
- "\x1d\x3c\xc6\x81\xa7\x6a\x11\x4f\xe7\xf7\x8c\xa7\xec\xdb\x9f\x07"
- "\x3c\x75\xc6\x06\xcf\x78\x3a\x78\x8c\x8c\xa7\x4f\x0c\x70\xe0\x69"
- "\xbd\x27\x3c\xe5\x36\xc2\xae\x78\x0a\xe7\x19\x9e\x0e\x1a\xe7\xc0"
- "\xd3\x7a\x37\x78\x3a\xc1\x19\x4f\x7f\x14\xc4\xf1\x74\x1f\xc3\x51"
- "\xc4\xd4\x9a\x36\xe0\x0f\x9c\x73\x29\x45\x0c\x53\x05\xc0\x54\xcc"
- "\x4b\x8c\x39\xa9\xd0\xaf\xde\x1d\xa6\x72\xcc\x35\x13\xc4\x55\x9c"
- "\x9b\x59\x2f\x82\xbe\x0b\x6b\x11\x8c\x09\x5b\x7b\xa5\xf1\xdb\xee"
- "\x84\xaf\x33\x97\x69\x50\xb6\x53\xf0\x8a\x20\xf1\x4a\xab\x1e\xfd"
- "\x6e\x15\xbc\xe2\x1d\x2d\x7f\xa4\xf1\x84\xad\x9e\x74\xf7\xe3\xa8"
- "\xbb\x4f\x25\xea\xe5\x53\x01\x5f\x63\x51\x77\x2f\x73\xd1\xdd\xcb"
- "\xba\xea\xee\x27\xbb\xc7\x51\xaf\x74\xf7\x5f\x22\x0d\x87\xdc\xa7"
- "\xc4\xd1\x21\x41\x4a\x1c\x7d\x7a\x3d\xf6\x8b\xe3\x78\x99\x7b\xdd"
- "\x9d\xcd\xf3\x21\xaf\x3a\x74\xf7\x7a\x25\x7e\xca\xba\xfb\xd3\xcf"
- "\x7a\xc6\xd1\x21\x6b\x14\xf2\xe8\x0c\x11\x47\x67\x8b\x38\x3a\x5b"
- "\xc6\xd1\x13\x9f\x4a\xf2\xe8\x93\x6f\x1f\xab\x77\xc6\xd1\x21\x55"
- "\x0e\x1c\x6d\xe8\x8a\xa3\x12\x86\x22\x9e\x62\x3b\x68\xcb\xda\x05"
- "\x38\xbd\x77\xb6\x41\xcd\x6d\xb5\x71\x38\x76\xfe\xae\xb6\xda\xea"
- "\x96\x6b\x24\x73\x3a\xe2\x69\x11\xc3\xd3\x40\x15\x99\x05\xd8\xd7"
- "\x17\xf7\x12\x14\xe3\x77\xfb\x54\x9e\xd3\x0d\xed\x4b\xc2\x52\x9e"
- "\x23\x54\xb2\x33\xc1\xfb\xb2\xef\xf5\xaf\x9e\x11\x31\xf5\x3a\x8c"
- "\x07\xf0\xdc\x9b\xd7\x01\x53\x53\xdd\xc8\xa6\xcb\x01\x53\xd3\x9d"
- "\x64\x53\x98\xfb\x7f\x9a\xed\x8a\xa9\x4f\x8d\xac\x41\x5e\x41\x4c"
- "\x55\xe8\xf1\x65\xdf\x03\x3d\xfe\xa9\x8d\x4a\x2c\x7d\xaa\x42\x89"
- "\xa5\x4f\x2d\x93\xb1\x54\xbc\x76\x5b\x64\xd3\xa7\xf2\xef\x8e\x6c"
- "\xfa\x54\xbe\xac\xc7\x3f\xbd\xc0\x81\xa5\x75\x9e\xb0\x74\x48\xbe"
- "\x7b\x2c\x85\xf3\x0c\x4b\x87\xe4\x3b\xb0\xb4\xce\x8d\x1e\xaf\xc0"
- "\xd2\xf0\x49\x1c\x4b\xcb\xb8\x6c\x5a\x2f\xc9\xa6\x65\xff\x84\x7a"
- "\x7c\x78\x8c\xb7\x7a\xfc\xf1\x16\x8e\x9f\x88\x4f\x12\x86\xca\x7a"
- "\x7c\x99\x67\x3d\xbe\x07\x0c\xf5\x4a\x16\x65\x18\x3a\x74\x92\x12"
- "\x43\x87\x4e\x55\x62\xe8\xf0\x23\xae\x18\xda\x15\x3f\x87\x6e\x71"
- "\x87\x9d\x5c\x8f\x1f\x9e\xe2\x19\x37\x87\x1a\xbd\xc7\xcd\x61\x67"
- "\x94\xb8\x39\xcc\xf7\x5f\x03\x37\x7f\xfc\x9a\x02\x37\x35\x37\x89"
- "\x9b\xdf\x89\x4e\xff\x63\x17\xfb\xe7\x8f\x5d\xec\x9f\x3f\x76\xb2"
- "\x7f\xfe\xf8\x36\xda\x3f\x7f\x7c\x97\xec\x9f\x3f\xae\x94\x65\xd0"
- "\xe1\x6f\xf7\x8c\x9b\x43\x2b\xdd\xe3\x26\x9c\x67\xb8\x39\xb4\x52"
- "\xc6\xcd\x9e\x64\xd0\x9f\xac\xf5\x02\x37\xbf\xe7\x3a\xfd\x4f\xba"
- "\xb5\x7f\xba\xd3\xe9\x11\x37\x19\x5e\xd6\xbb\xe8\xf4\x53\x9d\x75"
- "\xfa\x32\x59\xa7\x1f\xc7\x71\xcb\x64\xcb\x57\xea\xf4\xb7\x1d\x47"
- "\x7f\xba\xd5\xea\xb0\x87\xfe\x16\x70\xf4\xa7\x2c\x6e\xad\xd5\x61"
- "\x0f\x1d\x35\x40\xea\x17\xd7\xe9\x37\x11\xde\x2f\x37\x3a\x3d\xf3"
- "\x9b\xfd\xe9\x65\x87\x4e\x5f\xef\xaa\xd3\x8f\xfc\xc4\x33\xa6\x8e"
- "\x08\x76\xab\xd3\xa3\xfe\xcd\x30\xd5\xc0\x30\xf5\x7a\xa1\x33\xa6"
- "\x46\x0c\x65\x98\xfa\x82\x84\xa9\x23\x62\xad\x30\x37\xad\x7e\x3d"
- "\x63\x2a\xb6\x23\x63\x6a\xc2\x77\x83\xa9\xc6\x9b\xc7\x54\xe7\x3d"
- "\xac\x7f\x82\x77\x77\x60\x2a\x1b\xe3\x88\xea\x9a\x38\xc4\xd4\x04"
- "\x17\xfd\xbe\xcc\xbd\x7e\x7f\x8c\xa8\x71\x7c\x24\xfd\x1e\x69\xc0"
- "\xf0\xe6\x8e\xea\xf7\x23\x07\x2a\xb1\x75\x64\xac\x12\x5b\x47\xde"
- "\x27\x63\xab\x78\xed\xb6\xe8\xf7\x23\xc3\xee\x8e\x7e\x3f\x32\x4c"
- "\xc6\xd6\x51\xaa\x9e\xb1\x75\x44\xa8\x7b\x6c\x85\xf3\x0c\x5b\x47"
- "\x84\x76\x8b\xad\x2f\x38\x63\xeb\xa8\x6f\x24\x6c\x95\xf5\x7b\xe0"
- "\x0f\x9c\x7f\x29\xf9\xb7\xae\xdf\x8f\xbf\xdb\xfa\xfd\x28\x8b\x57"
- "\xfa\x7d\x21\xe0\x2c\xe8\xe2\xcb\x3f\x01\xfd\x7e\x92\xa8\xdf\x37"
- "\x94\xba\xe8\xf7\xa5\x5d\xf4\xfb\x8c\x49\x22\xa6\xc2\x9c\x62\x98"
- "\x3a\xbb\xec\xd6\xf5\xfb\xc9\x48\xc3\x67\x2e\x2b\x31\xf5\x99\x6f"
- "\x94\x98\xfa\xf3\x95\xd8\x2f\x8e\xe9\xa5\xee\xf5\x7b\x36\xcf\x23"
- "\x9f\x55\xe8\xf7\xd0\xbf\xae\xfa\xfd\xcf\x87\x2a\x30\x75\x86\x33"
- "\xa6\x46\x26\x28\xe4\x54\x78\x2f\xc4\xd4\x9d\x67\x39\xa6\xbe\x7b"
- "\xd6\x09\x53\x5f\x7a\x57\xc4\xd4\x67\xb7\x1e\x9b\xe2\x8c\xa9\x91"
- "\xbb\x24\x4c\x65\x78\x39\xc3\xaa\xce\x8a\xed\xea\x77\xc2\xfc\x7d"
- "\xd0\x17\x08\xda\xc6\x7d\x52\xd8\xe6\xee\xb3\x09\x3d\xfb\x9b\xc4"
- "\xba\xf7\x37\x31\xa5\x98\x49\x55\x53\x3e\xf3\x33\x29\x46\x3f\x93"
- "\x95\x64\x40\x71\x27\x8f\x1f\xc0\xf2\x79\x5c\x77\x1f\x3b\xe0\xd5"
- "\x97\x65\x9c\x45\x9f\xac\x37\xd1\x27\xeb\x3a\xf7\x01\x02\x7a\x77"
- "\x8d\x15\x20\xc9\x4d\x80\x07\x07\xce\xba\xe2\xec\xcf\x9e\xac\x41"
- "\xfe\x99\x9e\xe0\xa2\xf3\x97\x7e\x0f\x74\xfe\x9f\xbd\xae\xc4\xd7"
- "\x9f\x95\x2b\xf1\xf5\x67\x0b\x64\x7c\x15\xaf\xdd\x16\xd9\xf5\x67"
- "\xab\xef\x8e\xec\xfa\xb3\xd5\xb2\xce\xff\xf3\x59\x0e\x7c\xad\x75"
- "\xc2\xd7\xb3\xce\xf8\x1a\x69\x60\xf8\x7a\xd6\x15\x5f\xe1\x3c\xc3"
- "\xd7\x48\x83\x03\x5f\x6b\x5d\x74\xfe\xb3\xae\xf8\x1a\x35\x96\xe1"
- "\x2b\xf0\x82\x52\x76\x2d\xed\x59\xe7\x6f\xf8\xbe\xe9\xfc\x51\x5d"
- "\xe2\x1f\x75\xab\xf3\x23\xa6\x26\x71\x4c\x45\xcc\x92\x70\x55\xd6"
- "\xf9\x4b\x3d\xea\xfc\x3d\xe1\xaa\x57\xb2\x2a\xc3\xd5\xd1\x63\x95"
- "\xb8\x3a\x7a\xbc\x12\x57\xc7\x54\xbb\xe2\x6a\x57\x4c\x1d\xbd\xd6"
- "\x1d\x9e\x72\x9d\x7f\x4c\x86\x67\x2c\x1d\xbd\xdf\x7b\x2c\x7d\xee"
- "\x82\x12\x4b\x47\x5b\xff\x75\xb1\xf4\xf9\x65\x0a\x2c\xd5\xdc\x24"
- "\x96\x7e\x27\x76\x80\xe7\x3f\x51\x62\xe9\x18\x5f\x25\x96\x3e\x7f"
- "\x40\xc6\x52\xf1\xda\x6d\xc1\xd2\xe7\x6b\xef\x0e\x96\x3e\x5f\x2b"
- "\xcb\xaa\x63\x76\xf7\x8c\xa5\xa3\x0f\xba\xc7\x52\x38\xcf\xb0\x74"
- "\xf4\x41\x19\x4b\xcf\xf4\x80\xa5\x63\x37\x7a\x81\xa5\x4a\x3b\x80"
- "\x2b\x96\xde\x75\x3b\xc0\xd8\x7c\xaf\xec\x00\x12\x96\x4e\xea\x6a"
- "\x07\x40\x7c\x65\x76\x00\x18\x2f\x09\xc3\x98\x1d\x60\x0c\xc7\x32"
- "\x93\x6d\x8d\xc2\x0e\x70\xfb\xb1\xf5\x85\xb7\xac\x0e\x7b\x6a\x0e"
- "\x60\xeb\x0b\x6f\x33\x6c\x75\xd8\x53\x27\x3c\x2b\xf5\x8b\xdb\x01"
- "\x7e\x4b\x78\xbf\xdc\xd8\x01\x9e\x63\xed\x5d\x53\xd8\x01\x9c\xb0"
- "\xf6\xa2\x6a\xfc\x65\xcf\x38\xfb\x8b\x50\x85\x1d\xa0\x51\xc6\xd9"
- "\xeb\xe8\xa3\x0e\x38\xc8\x70\x36\xc4\x19\x67\xc7\xbd\xc8\x70\xf6"
- "\x39\x09\x67\x7f\x11\xd7\x0e\x73\xb3\xdd\x5b\x9c\xc5\x7d\x04\x67"
- "\xe3\xee\x0e\xce\x96\x7b\x81\xb3\x4e\xb6\x81\x03\x30\x1e\x0e\x9c"
- "\x65\xe3\x3e\xee\xcb\x9a\xe9\x88\xb3\x71\x2e\xb6\x81\x52\xf7\xb6"
- "\x81\x23\x77\xc3\x36\x30\x7e\xb4\x12\x6f\xc7\xa7\x28\xf1\x76\xfc"
- "\x60\x19\x6f\xc5\x6b\xb7\xc5\x36\x30\x3e\xea\xee\xd8\x06\xc6\x47"
- "\xc9\x78\x3b\xe1\xe1\x9e\xf1\xf6\x17\x61\xee\xf1\x16\xce\x33\xbc"
- "\xfd\x45\x58\xb7\x78\xfb\x9c\x33\xde\xfe\xdb\x7d\x12\xde\xca\xb6"
- "\x81\x52\xd1\x36\xb0\xa6\x67\xdb\x40\x83\x07\xdb\xc0\xd8\xbb\x6d"
- "\x1b\xf8\xb7\x00\x6f\x6c\x03\x1d\x85\xdc\x6f\x7f\x39\xfa\xed\xbf"
- "\x0a\xf8\x1b\xf3\x29\x8c\x41\xcf\x7e\xfb\x19\x92\xff\x69\x5c\x91"
- "\x88\xb3\x45\x6e\x6d\x03\xc7\x9b\x3d\xdb\x06\x8e\xd7\x39\xfb\x9f"
- "\x4e\xec\xad\xfc\x6e\x35\xf1\x3e\xe9\xbb\xd5\xf1\xcf\x10\x67\x63"
- "\x58\xde\x46\xa1\x20\x26\x9c\xe1\xbf\x2a\x26\x18\xfb\xe9\xce\x8f"
- "\xff\x4f\x82\xf3\xb7\xac\x89\x89\x0e\x5b\x41\x2d\xe2\x6d\x11\x11"
- "\x68\x82\x1f\xc6\x1d\x67\xb6\x82\x5f\x22\xef\x45\x1f\x71\xc6\xdd"
- "\x43\xa7\x9d\x71\x77\x62\x81\x84\xbb\x76\xc0\xdd\x0f\x1b\x8b\xb8"
- "\xfd\x75\x1a\xf7\x4d\xdd\x35\xcd\xc9\x37\xf5\xd3\xbf\x88\xb8\xfb"
- "\xe2\xc6\x63\x66\x78\xff\xee\xfc\xa7\xe0\xfe\x3d\xa7\x6f\xd6\x07"
- "\xb5\xc8\xad\xef\x94\x88\x4f\x6e\xfd\xa7\xa0\xaf\x9a\x6d\xe2\x5c"
- "\xb5\xc3\x3c\xdd\xe6\xe4\x3f\x55\x9c\x0e\xf3\x59\xdc\x57\xd2\xad"
- "\x1f\xea\x34\xd9\x0f\x95\x16\x44\x27\xe1\xfa\x26\x6c\x89\x09\xef"
- "\xa4\x09\x3e\x34\x38\x3a\x09\x9f\x7f\xe3\x06\xac\x3b\xcf\xc7\xfa"
- "\x88\x7a\x5d\x0c\x60\x4f\x5f\x3e\xee\x2f\x56\xd9\x61\xad\xb1\xc3"
- "\x5a\x23\x14\x44\xc7\xd8\x50\x36\x29\x8c\x9e\x52\x0c\x7a\x9e\x2d"
- "\x87\xe5\x67\xed\x93\x07\xba\xde\x76\xd4\xf3\xae\xc0\xdc\xc8\xd2"
- "\xab\xb1\x3f\x12\x8e\x06\x36\xc3\x7b\x5c\xe9\x5e\x96\xb3\x7d\x2d"
- "\xe3\xa8\x71\xc2\x71\x78\xe6\x4b\x1f\xd7\x20\xef\xc6\xca\x7b\x0a"
- "\x98\xcc\xec\xc1\x57\x16\xfb\xc2\xe3\x2e\x02\x2f\xdc\x06\x9b\x84"
- "\x73\x7f\x94\xb8\x1e\xfd\x80\x12\xd7\xa3\x27\x2a\x71\x3d\x5a\x25"
- "\xe3\xba\x78\x0d\x70\x1d\xe8\xc6\xe4\x68\x58\xfb\x6e\x51\x8e\x8e"
- "\xd6\x4a\xb8\x2e\x88\xb8\x5e\x72\x13\xb8\xde\xad\x1c\xed\x84\x4b"
- "\x9e\x71\x3d\x5a\x2b\xdb\x24\xa2\xaf\xb9\xf5\x91\x3d\xed\x8c\xeb"
- "\x13\x8b\x19\xae\x9f\x76\xc5\x75\x38\xcf\x70\x7d\x62\xb1\xc7\xfd"
- "\x04\xa7\x5d\xbf\xa7\xc5\x9c\x62\xb8\x5e\x2f\xfa\xc8\xd6\x7a\xb1"
- "\x9f\xa0\x9e\x63\xba\x84\xe5\x68\xaf\xba\xbb\x36\x89\x98\x7a\x6f"
- "\x6c\x12\x0c\xcb\x5b\x38\x96\x23\x36\x4a\x78\x7e\x33\xfb\x09\x7a"
- "\xc2\x73\x49\x6e\x46\x3c\xf7\x24\x37\x2b\xf1\x7c\xd2\x29\x25\x9e"
- "\x4f\x3a\xa3\xc4\xf3\xa9\xa7\x94\x78\x3e\xb5\xde\x15\xcf\xbb\x62"
- "\xf9\xe4\x27\xdd\xe1\xb8\xe1\x97\x68\xa3\x98\xba\xc6\x33\x86\x4f"
- "\x8e\xf5\x1e\xc3\xff\x7d\xea\xbf\x1c\x86\x6b\x5c\x31\xfc\xdf\xf3"
- "\x11\x83\xec\xb9\x2e\x18\x3e\x5f\xc4\x70\x11\x47\xb6\x5f\x12\x65"
- "\x61\x57\x0c\x6f\x81\xf7\xe8\x41\x1f\xb7\x7d\xe5\x8a\xe1\x53\x5e"
- "\x57\x60\xb8\xa6\x07\x0c\x9f\xcf\xed\x20\x0a\xbf\x5c\x0f\xb6\x10"
- "\x78\x8f\x82\x6d\x1e\x64\x73\x69\xcc\x9c\xfb\xa3\xc4\xf0\x29\x67"
- "\x94\x18\x3e\x55\xa3\xc4\xf0\x29\x47\x64\x0c\x17\xaf\xdd\x16\xd9"
- "\x7c\x4a\xc3\x6d\x97\xcd\x25\xfe\xe8\x16\xc3\xa7\x34\xc8\xb2\xf9"
- "\xd4\x03\x3d\x63\xf8\xe4\x38\xf7\x18\x0e\xe7\x19\x86\x4f\x8e\xf3"
- "\xb8\xcf\xa1\x0b\x86\xff\x72\xab\x17\x18\xae\xb4\x85\x48\x18\x2e"
- "\xda\x42\xb6\x3b\xd9\x42\xec\x39\xdc\x16\xb2\xed\x12\xe7\x8d\xbe"
- "\x2a\xce\xa7\xc0\x3f\xda\x12\x75\xf7\xba\xdb\xb6\x5b\xb2\x83\xfc"
- "\xd2\x63\xfe\x47\x77\x76\x10\x86\xdf\xb8\xc7\xe1\x65\xc0\xed\xda"
- "\x9b\xdc\xe3\x30\x4e\xda\xe3\x90\xef\x61\x8f\x83\x88\xe7\x33\xbe"
- "\x05\x9e\xb3\x3d\x0e\xbf\xda\xa9\xb4\x31\xff\x6a\xb7\x64\x63\xe6"
- "\x78\xfe\xca\x87\x4a\x3c\x7f\xe5\xa0\x63\xcf\x03\x60\xbe\xc9\xb0"
- "\xa9\xcb\x9e\x07\x07\xb6\x33\x3b\x68\xec\x7d\xc6\x5f\x36\x11\x07"
- "\xbe\x4f\x97\xf1\x1d\xda\x5a\xa0\xc0\xf6\x46\x67\x6c\x8f\x1d\xae"
- "\xc0\xf6\xb3\x45\x4a\xff\x88\x46\x83\x13\xb6\x4b\x7b\x1e\x5e\x1e"
- "\x7a\xac\xa1\x07\x6c\x87\xfb\x6f\x7e\x8f\xd8\xed\xc5\x76\x69\x7f"
- "\x83\x5b\x6c\x77\xde\xdf\xe0\xe4\xff\x80\xd8\xce\x72\x5c\xf4\x77"
- "\xc1\xf6\xe5\x09\x6a\xfb\x61\x98\x0f\x80\xeb\x38\x47\xec\x14\xb0"
- "\x9d\x8d\xf7\xcb\x49\xce\xd8\x7e\x23\x87\x63\xfb\x9b\x97\xbe\x3d"
- "\xb6\x3b\xe4\x61\x67\x6c\x7f\x01\xb1\x7d\x5a\x22\xdf\x7f\x91\x7d"
- "\x73\xfb\x2f\x5c\xfc\x33\xde\xbc\x09\xfb\x4b\xb7\x18\xef\xa6\x5f"
- "\x4a\x8c\x9f\xf6\xb1\x12\xe3\xa7\xb5\x29\x31\x7e\xda\x4e\x19\xe3"
- "\xc5\x6b\xb7\x45\x4e\x9f\x66\xbc\x3b\xf6\x97\x69\x46\x19\xe3\x5f"
- "\xd9\xd6\xf3\xde\x8b\xd8\x48\xf7\xbe\x19\x70\x9e\x61\x7c\x6c\x64"
- "\xb7\x7b\x2f\x14\xf6\xee\xe9\xeb\xdd\xee\xbd\xa8\xfd\xee\x7c\x33"
- "\x9c\x79\xc5\xd5\xfe\x72\xeb\xb6\xef\xe9\xeb\xbc\xb5\xbf\xe0\xde"
- "\x8b\xe5\x27\x9d\xf6\x5e\x34\xf4\xbc\xf7\x22\x63\xea\x4d\xda\x5f"
- "\xba\xf1\xcd\x38\x1e\xe3\xec\xef\xf6\xea\x5a\x25\xbe\xbf\xba\xde"
- "\x81\xef\x93\x11\xdf\x67\xbd\xa5\xc4\xf7\x59\xa5\xd8\x4f\x77\x7b"
- "\x31\xfe\xa4\xf8\xae\xf8\xea\x97\x4a\x5f\x0d\x17\xfb\xcb\x64\xe4"
- "\xbd\x59\x93\x14\xf8\x7e\xd6\x19\xdf\x67\x04\xbb\x93\xdd\xd1\xee"
- "\xcd\x7c\x8a\x67\x38\xed\x69\x7b\x49\xf2\x7f\x9b\xf9\xf0\xb1\x58"
- "\x78\x7f\xb3\x07\x5f\xb7\x19\xdc\xd7\x8d\xf9\xb6\xa1\x1d\x1c\xda"
- "\xda\x3b\xc3\xa0\xce\x8c\xa3\x02\xfa\xba\xb9\xfa\xb9\xa1\xef\x1b"
- "\xfa\xba\x55\x27\xe4\x7b\xf4\x73\x43\xde\xf4\xe4\xeb\x06\xfd\x0e"
- "\x66\x58\x7f\x5e\xc4\x7a\xd1\xd7\xad\x38\x55\xf6\x75\x53\x60\xbd"
- "\x1b\xff\xe1\x03\x67\xb3\xdd\xcb\xf1\x59\x32\xd6\x77\xa2\x1c\xff"
- "\x8c\x8b\x2d\x86\xd1\x60\x66\xec\x77\x6a\x8b\x61\x58\x1f\xf7\x62"
- "\x0d\xf2\xf1\x74\x83\x1b\x5b\x4c\x57\x1f\xe7\xef\xce\x16\x13\xf7"
- "\xb6\x12\xe3\xe3\xea\x95\x18\x1f\xb7\x5e\xc6\x78\xf1\xda\x6d\xc1"
- "\xf8\xb8\x1d\x77\xc7\x16\x13\xb7\x43\xb6\xc5\xcc\x5a\xe9\xd6\xff"
- "\x4e\x61\x63\x9f\x11\xea\xde\xc6\x3e\x43\xf4\xbf\x9b\x11\xea\x71"
- "\x4f\x48\x97\x6f\x9a\xb3\xe3\xb9\x8d\xfd\x16\xf6\x84\x34\x7c\xdf"
- "\x6c\x31\xb3\xbb\xe4\x5b\xeb\xc9\x16\xc3\x7c\x9b\x4f\xa2\x7f\x88"
- "\x77\x7b\x42\x7a\xc2\x76\x87\xec\xde\xcd\x37\x4c\x25\xb6\xcf\x89"
- "\x57\x62\xfb\x9c\x44\x25\xb6\xff\xfa\x35\x25\xb6\xff\xda\xe0\x8a"
- "\xed\x5d\x71\x7d\xce\x01\x77\x98\x6e\x98\x8c\xb6\x98\x5f\xeb\x3c"
- "\xe3\xf9\x9c\x26\xef\xf1\x7c\xee\xe5\x7f\x69\x3c\xd7\xb8\xe2\x79"
- "\xbc\xfe\x3b\xb5\xcb\x30\x3c\x9f\xf7\xb0\x02\xcf\x35\x3d\xe0\xf9"
- "\x77\x66\x97\x99\xb7\x44\x89\xe7\xf3\xca\x94\x78\x3e\xef\x55\x19"
- "\xcf\xc5\x6b\xb7\xc5\x2e\x33\x2f\xe5\xee\xd8\x65\xe6\xa5\xc8\x32"
- "\xfb\xaf\x27\xf5\x8c\xe7\x73\x5a\xdc\xe3\x39\x9c\x67\x78\x3e\xa7"
- "\xc5\xa3\x3f\x75\x17\x3c\x4f\x18\xea\x05\x9e\xbb\xf5\x51\xf9\x7e"
- "\xd8\x65\x12\xc2\xbd\xb5\xcb\x78\xda\xa7\x82\xf8\x2e\xfb\xa7\x38"
- "\xed\x53\x89\x92\xf6\xa9\x64\x2b\xfd\x53\x6e\x3b\xb6\x27\x8e\x56"
- "\x62\x7b\xe2\x58\x25\xb6\x2f\x98\xa5\xc4\xf6\x05\x71\x52\x3f\xb9"
- "\x5d\x26\xa7\xcb\xbe\x15\x25\xce\x27\xbe\x6d\x9c\xdc\x44\xdc\x61"
- "\x3d\xb4\x15\xe4\x19\xe7\x13\xab\x3c\xe1\x3c\xfa\xab\xbc\x37\x23"
- "\xc1\x0d\xce\xcf\x3f\xf9\xff\x03\xce\x7b\xf2\x43\x61\x7a\x10\x60"
- "\x3c\xe2\x3d\xc3\x77\x11\xeb\x11\xe7\xed\x7f\x76\x67\xa3\xf9\x8d"
- "\xe6\x4e\xe1\xbc\x67\x1b\x4d\xd2\x7d\x35\xd3\x45\x9c\xbf\x99\x3d"
- "\x34\x1f\x2b\x6d\x34\xc5\xf3\xef\xb4\x8d\x26\x29\x5e\x89\xf7\x49"
- "\x45\x4a\xbc\x4f\x7a\x51\xc6\x7b\xf1\xda\x6d\x91\xdf\x93\xe6\xde"
- "\x1d\x1b\x4d\xd2\x5c\x19\xef\x17\x8c\xee\x19\xef\x13\xeb\xdc\xe3"
- "\x7d\xa2\x18\x9b\x2d\xb1\xee\xe6\xf1\x7e\xa1\x03\xef\xbb\xee\x9f"
- "\xc9\xbe\x75\x1f\x99\xd1\x77\xdb\x46\xb3\xd0\x23\xfe\x77\x17\x1f"
- "\xe3\xd6\x6d\x34\xe2\x9e\xc4\xd9\xee\xe3\x63\x1c\xeb\xc6\x47\xe6"
- "\x58\x95\x33\xd6\x2f\x7a\x52\xe9\x8b\xb8\x68\xa8\xe4\x8b\x78\xac"
- "\x06\xb1\x7e\xf1\xcb\x4a\xac\x5f\x1c\xeb\xc9\x46\x73\x40\x70\xf6"
- "\x49\x5c\xb4\x5e\x69\xa3\x29\x55\xda\x68\x5e\x42\xde\x5b\xdc\xdb"
- "\x33\xd6\x2f\x2a\x57\xfa\x80\xf3\x3d\x8a\x3b\x67\x88\x3e\xe0\x33"
- "\x9c\x7c\xc0\x27\xfc\x5e\xc4\x7a\xc3\xc9\xca\x5a\x1b\xf1\xc6\x0f"
- "\xf1\xdb\xfb\x7a\xaf\x71\xeb\x83\xc8\xd6\x80\x6e\xfc\x10\x67\x9e"
- "\xd2\xa0\x4f\x73\x42\x49\xaa\x93\x1f\x62\x37\xf1\x8c\x15\xf8\x3f"
- "\xc3\xe0\x11\xff\x3b\xa8\x8c\xff\xc2\x08\xd9\x6e\x23\xa0\x9c\xcf"
- "\xe8\xf2\x9a\xe6\x4e\xd9\x6d\xdc\xd9\x49\x8c\xcf\x21\xfe\x27\xf7"
- "\xe2\x72\x7e\xc2\xf7\xcc\x6e\x93\xfc\xaa\x12\xf7\x93\xf3\x95\xb8"
- "\x9f\x3c\x56\xc6\x7d\xf1\xda\x6d\xf1\x45\x4f\x9e\x7e\x77\xe4\xfc"
- "\xe4\xe9\xb2\xdd\x66\xf1\xc8\x9e\x71\x7f\x91\xd1\x3d\xee\x2f\x32"
- "\x72\xdc\x5f\x64\xec\xd6\x6e\xa3\xf0\x8d\x4c\x79\xf8\x5b\xdb\x6d"
- "\x24\x39\xff\xae\xef\xeb\x49\x09\xf5\xc6\x6e\xe3\xd8\x93\xfe\xad"
- "\xec\x36\xee\xf1\x5e\x92\xed\x8f\x75\xf3\xcd\x55\x89\xf7\x4b\x1e"
- "\x56\xe2\xfd\x92\x01\x4a\xbc\x5f\xf6\xac\x12\xef\x97\x45\xba\xb3"
- "\xdb\x28\xb1\x7e\xc9\x6b\xee\x70\xde\xf0\x12\xda\x6d\xd2\x5a\x3c"
- "\x63\xfc\x92\x62\xef\x31\x3e\xf5\xc0\xff\x61\xbc\x0b\xc6\x6b\x5c"
- "\x31\x3e\xb5\xed\x3b\x95\xf1\x19\xc6\x2f\xfd\x52\x81\xf1\xb7\xd1"
- "\x96\x73\x33\xfb\x49\x3c\xcb\xf6\x69\x2e\xfe\xef\x69\x2e\xfe\xef"
- "\x69\x4e\xfe\xef\x69\x29\xb7\x0f\xe3\xd3\xa2\xee\x0e\xc6\xa7\x39"
- "\xf9\xbf\x2f\x7b\xb8\x67\x8c\x5f\xb2\xc3\x3d\xc6\xc3\x79\x86\xf1"
- "\x4b\x76\x74\x2b\xdb\x2b\x30\x3e\x5d\x75\x27\x6c\x39\x77\x67\xbf"
- "\x11\x30\xcb\x6d\x8a\x3b\xe2\xd1\x9e\x13\x21\xd9\x73\x0c\x1e\xec"
- "\x39\xb7\x0b\xf3\x97\x07\x29\x31\x7f\x79\x7f\x25\xe6\x67\x8d\x55"
- "\x62\x7e\xd6\x18\xa5\x3d\x27\xb9\x8b\x3d\x47\x89\xff\xcb\x97\x18"
- "\x5f\x72\xb6\xe7\x94\x3a\xd9\x73\x32\xaf\x79\xc6\xff\xe5\x1e\xf1"
- "\xff\x3a\xc3\xff\x38\x37\xf8\x9f\xf1\x2f\x82\xff\x71\xdf\x02\xff"
- "\x33\xee\x02\xfe\xaf\xf8\x86\xdb\x78\x6e\x32\x4e\xca\x01\xef\x6d"
- "\x3c\xdf\x6e\x1d\xc8\x1c\xaf\x5c\x07\x32\x33\x94\xeb\x40\xe6\x50"
- "\x79\x1d\x10\xaf\xdd\x96\x75\x20\x73\xdc\xdd\x59\x07\x32\xc7\xc9"
- "\xeb\x40\xd6\xc0\x9e\xd7\x81\xe5\x1e\xd6\x81\xe5\xe2\x3a\xb0\xdc"
- "\x8b\x75\x20\xbb\xbf\x67\x1b\x8f\xe1\xd6\x6d\x3c\x23\xef\xf6\x3e"
- "\xa8\xec\x60\xaf\x6c\x3c\x85\x93\x74\x55\x18\x23\xe5\x3c\x51\x2f"
- "\x9f\x25\xd9\x78\x8c\x2e\x36\x1e\x63\x17\x1b\xcf\xb2\xf3\x22\xfe"
- "\x4f\x14\xf7\x9b\xbe\xf4\x2d\x62\xa4\xb0\x3c\xca\x2b\x83\x94\x7e"
- "\xf3\x2b\x19\xfe\xcb\xf1\xfb\x56\xbf\x85\xfd\xe2\xeb\x8f\xb1\x9b"
- "\x18\xa8\x2b\x67\x29\x6c\x3a\x13\xdd\xc5\x48\x59\xad\xf0\xbb\x51"
- "\xee\x37\x5d\xb9\x4e\x81\xf7\x2f\xf1\xfd\xa6\xef\xba\xfb\x4e\xeb"
- "\x88\xc9\x9f\xb3\x8d\xc5\xe4\x77\xc4\xf2\x5b\x59\x7b\x53\xb1\xa4"
- "\x67\x88\xb1\xa4\xcf\xde\x85\x58\xd2\x37\x1b\x93\xff\xac\x6b\xfc"
- "\xbe\x55\x23\x4d\x55\x46\x52\x83\x3c\x32\xdd\x35\xf6\xa9\xd1\xfd"
- "\xde\x7d\xb5\xb8\x77\x7f\xe1\x9d\x89\x83\x82\xfd\x61\x6b\x7e\xbf"
- "\xad\xba\xdd\x99\x16\xd6\x1f\xcc\x59\x0d\x7d\xfd\xb0\x0a\x78\x55"
- "\x40\x3c\x4d\x46\x3c\x5d\x65\x61\x75\xcf\x03\x2f\xf4\x1b\xac\x43"
- "\x3e\xce\x13\x48\x80\x21\x15\xb1\x75\x15\xf3\xfb\x02\x31\x02\xb0"
- "\x95\xd7\x5b\x71\x9e\xda\xed\xfd\x86\x62\xce\xd5\x7b\xf6\x2c\xac"
- "\xed\x55\x63\x6e\x83\x79\x71\x09\xf7\xc4\xaa\x4c\xb6\x76\x23\xd2"
- "\xe2\xd0\xc2\x5a\x5f\x0a\xf8\xbb\x7d\x1e\xf1\xf7\x6e\x9e\xae\x3a"
- "\xc8\xe4\x19\x5c\xf7\xfa\x6d\x1d\x82\x71\x40\x24\xd9\x4a\xf8\x5a"
- "\xb6\x6f\x6d\x83\xf1\x11\x28\x5f\xfb\x66\x26\x72\xdc\x80\xe7\x25"
- "\xc0\x58\x32\x1f\x5b\xc4\x0d\x96\xc3\x0a\x70\xa3\xe4\xaa\xfc\x1d"
- "\x1b\xdb\xc7\x31\xe2\x76\x94\xd5\xb2\xff\x8b\xd9\x13\xb6\xae\x2c"
- "\x70\x8f\xad\x2b\x0b\x38\xb6\xae\x2c\x70\x60\xab\xd9\x8d\x1d\x45"
- "\xe1\xc7\xfe\xba\xe8\xff\x62\x74\x91\xb1\x8d\xff\x84\xf1\x51\x5e"
- "\xf7\xca\xff\x85\xe1\x69\x12\xc7\x53\xc4\x2b\x09\x53\x65\x3b\x8a"
- "\xd1\xa3\x1d\xa5\x27\x4c\xf5\x6a\x0f\x3f\xc3\xd4\xdc\x78\x25\xa6"
- "\xe6\x26\x2a\x31\x75\xed\x97\xae\x98\xda\x15\x4f\x73\x77\xba\xc3"
- "\x52\x1e\x1f\x65\x6d\x91\x67\x1c\xcd\xad\xf3\x84\xa3\xcc\x3f\x7d"
- "\x86\x93\x7f\xba\x03\x47\xff\xe3\x82\x12\x47\xff\x43\x7b\xb3\x38"
- "\xca\x72\x9b\x9c\xfd\x0e\x72\x9b\xdc\x32\x8e\x1a\x5c\x70\x74\xcd"
- "\x4a\x19\x47\x5d\xf3\x9b\xf4\x80\xa3\xf3\xef\x4c\x0c\x14\x05\x8e"
- "\x0a\x16\xd6\x1f\xdd\x42\xec\xeb\xda\x5e\x4a\x1c\x5d\x1b\xe1\x19"
- "\x47\xd7\x9c\x94\x71\x94\xd7\xbb\xb3\x38\xba\xd6\x57\x81\xa3\xf3"
- "\x9d\x70\xf4\x2b\x59\x87\x40\x1f\x0b\x07\x8e\x2e\x70\xc2\xd1\xf9"
- "\x3d\xe1\xe8\x5a\x5f\x1c\x23\x2e\xa3\xae\x3d\xd6\x33\x8e\xe6\x36"
- "\xb8\xc7\x51\x38\xcf\x70\x34\xb7\x41\xc6\x51\x37\x32\xaa\x02\x47"
- "\x7f\xbb\xdb\x0b\x1c\xfd\x9e\xc7\x46\xf9\xed\x2e\xaf\x6c\x15\xf2"
- "\x9e\xce\xae\x31\x52\x5f\x75\xde\x13\x54\xee\x92\xf7\xa4\xbc\x4b"
- "\xde\x93\x65\xd2\x1e\xcf\x71\x22\xae\x4e\xf8\x16\xb8\xca\xf6\x78"
- "\xfe\xee\x43\xa5\xef\xc9\xef\x3e\x96\x7c\x4f\x38\xae\x6e\x98\x2a"
- "\xf5\x4b\xce\x7b\x52\xde\x4d\x8c\xd4\x75\x41\x8a\xd8\x28\xe3\x9c"
- "\x63\xa3\x6c\xe8\xe5\x39\x46\xea\xba\x08\x45\x6c\x94\xe3\x65\x8e"
- "\xbc\x27\xae\x31\x52\x65\x8c\x5d\x3f\x9e\x61\xac\x23\x06\xd5\xba"
- "\x0c\x47\x8c\xd4\x1e\xf6\x05\x61\x3b\x7b\x1a\x13\xee\x3c\xc6\x1a"
- "\xbd\xc0\x58\x45\xde\x13\xd7\x18\x53\xeb\x2f\x9b\x2a\xcb\x49\x4d"
- "\x5c\xb9\x9b\xd8\xa8\xe5\x77\x35\xf7\x09\xf6\xcb\x3d\xd6\xe6\xbd"
- "\xa6\xc4\xda\xbc\x1d\xac\xee\x19\x77\x58\x9b\x37\x5a\xc6\x5a\x5e"
- "\x6f\xc5\x19\x17\xac\x6d\xf0\x80\xb5\xb0\xae\x6e\xbf\xe8\x2d\xd6"
- "\xe6\x19\x18\xd6\xe6\x88\x58\x7b\xe9\x76\x63\x6d\x9e\x41\xc6\xda"
- "\x0d\x3f\xe9\x39\xc7\xd4\xba\x28\xf7\xfb\x72\xd6\x45\x71\xac\x5d"
- "\x17\xd5\x6d\x8e\x29\x85\xcf\x47\xfe\x40\x29\xc7\x94\x6c\x0f\x28"
- "\x17\xed\x01\xff\xcc\x39\x51\xf2\xc3\xbc\xb5\x07\x9c\x00\xdd\x1d"
- "\xf7\x5d\x2e\xc7\x9c\x53\xd3\x31\x27\xca\x3e\x17\x7b\xc0\xbe\xae"
- "\xf6\x80\x97\xbb\xc7\x58\xaf\xec\x01\x6c\xdf\xe5\xc6\x01\x4a\x8c"
- "\xdd\x38\x50\x89\xb1\x05\x1f\x4a\xfb\x2c\xb1\x3f\x9e\x63\xa6\x6e"
- "\x7c\xcd\x61\x0f\x68\x50\x62\xab\x6c\x0f\x28\x58\xe0\x19\x63\x37"
- "\x2a\xed\xbf\x13\xca\x14\xfb\x2c\xdf\x6d\x74\x8e\x43\x2d\xc5\x9f"
- "\xda\x74\xe0\x58\x9d\x33\xc6\x6e\x34\xff\x33\xc5\xa1\x76\xc4\x9a"
- "\xea\xc1\x97\xbb\x6b\x1c\xea\xcd\x53\x4d\x95\xfb\x08\xee\x6d\x63"
- "\x78\xab\xb0\x0d\xec\xbb\x3b\xb6\x81\xca\x7d\x1e\x6c\x03\x9b\x4f"
- "\x29\x71\xb6\x20\x80\xd5\x3d\xe5\x0e\x67\x37\xef\x94\x71\x96\xd7"
- "\x5b\x71\xca\x05\x67\xeb\x6f\xa7\x4c\xbb\xb9\xfe\xce\xda\x06\x36"
- "\xd7\xcb\xb6\x81\x82\x9b\xd8\xff\xb8\x71\x87\x7b\x9c\xdd\x28\xda"
- "\x5d\x37\xca\x76\xd7\x7a\x37\xf9\x52\x14\x38\xbb\x65\xa5\xb4\xff"
- "\x91\xc9\xb4\x0d\x92\x4c\xbb\xef\x9f\x30\x5f\xca\x96\x6c\x6f\x6d"
- "\x03\xb8\xcf\x1d\xb1\x15\xb1\x4b\xc2\x57\xd9\x36\xb0\xcf\xb3\x6d"
- "\xa0\x07\x7c\xf5\x3e\x77\x5f\xe1\x4a\x25\xbe\x16\xbe\xae\xc4\xd7"
- "\x37\x82\x5c\xf1\xb5\x2b\xb6\x16\x1e\x71\x87\xab\xdc\x36\xb0\xd5"
- "\xe8\x19\x53\x0b\x2d\x9e\x30\x95\xc5\xf4\x6b\x94\x7d\xa4\x65\x4c"
- "\x2d\xba\x4f\x89\xa9\xff\x39\xfc\x66\x31\xf5\xae\xe4\x4b\xb9\x65"
- "\x4c\x4d\x70\xc1\xd4\xa2\x9d\x32\xa6\xba\xe6\x4c\xe9\x01\x53\xef"
- "\x94\x9d\xc0\x19\x53\x15\xb2\xeb\xd6\x27\x95\x98\xba\x35\xce\x33"
- "\xa6\x16\xd9\x65\x4c\xe5\xf5\xee\x2c\xa6\x6e\x1d\x72\x67\xed\x04"
- "\x5b\x87\xc8\xb2\xeb\xd6\x6f\x7a\xc6\xd4\x42\xab\x7b\x4c\x2d\xb4"
- "\x72\x4c\x2d\xb4\xde\xfc\x9e\xf2\x37\x4e\x7a\x81\xa9\xdf\xf3\x5c"
- "\x2a\x6f\xd4\x79\x6d\x27\x40\x7b\x2b\x62\x69\xc3\xb7\x8b\x1d\x92"
- "\x26\xc5\x0e\x19\x23\x62\xec\x0b\xdf\x16\x63\xdf\xbc\xa0\xf4\x69"
- "\x78\xf3\x4b\xc9\xa7\x81\x63\xec\xf6\xb5\xca\xfc\xa8\x5d\x63\x85"
- "\x28\x63\xa8\x16\x8f\x74\xd8\x09\x10\x73\xc7\x38\xdb\x09\xb6\x8f"
- "\xf4\x8c\xb7\xc5\x71\x0a\x3b\xc1\x51\xf7\x78\x7b\x5d\x81\xb7\xdb"
- "\x56\x30\xbc\x75\xc4\x50\x2d\xde\x21\xc5\x50\xed\x51\x86\x55\xe0"
- "\x6d\xdc\x77\x83\xb7\xe5\x37\x8f\xb7\xca\x5c\x2a\xae\xf1\x52\x4b"
- "\x06\x98\x2a\x00\x6f\x59\xbc\x0e\xd7\x98\xa9\x37\x17\xaf\xe3\x4e"
- "\xc5\x4c\xc5\x7e\xb9\xc7\xdd\x92\xb7\x95\xb8\x5b\x52\xcf\xea\xba"
- "\xc5\xdd\x92\x25\x32\xee\xf2\x7a\x37\x8d\xbb\xb7\x64\x33\x28\xd9"
- "\x71\x67\x6d\x06\x25\x3b\x64\xdc\xdd\x9e\xd8\x33\xee\x16\x27\xb8"
- "\xc7\xdd\xe2\x04\x8e\xbb\xc5\x09\xdd\xe2\xae\xc2\x87\xa0\xf4\x65"
- "\xb7\xb1\x3c\x1a\xfe\xd9\xf3\xac\x94\xc6\xde\x8a\xcd\x00\x30\x58"
- "\x9d\x81\x31\x9c\xe2\xd0\x87\xa0\x67\x9b\x41\x4f\x78\xeb\xbd\xcd"
- "\xe0\xad\xa9\x4a\xbc\x7d\xeb\x65\x25\xde\xbe\xdd\x0b\xfb\xd5\xad"
- "\xcd\x80\x61\xc0\x5b\x6f\x3b\x6c\x06\x66\x25\xce\xca\x36\x83\x1d"
- "\x1f\x78\xfe\xf6\xf5\x56\xad\x42\xbe\x7d\xc1\x25\x66\xf5\x0c\x19"
- "\x6f\x8f\xd7\x48\x3e\x63\xff\xa5\x3a\x16\xe3\x8c\xb7\xbf\x0f\xee"
- "\x12\xb3\x7a\xca\x6d\x8c\x59\x3d\xe5\x36\xc7\xac\x9e\xaa\x8c\x59"
- "\xfd\xc6\x75\xd9\x8f\xcc\xfb\x98\xd5\xff\xb5\x8d\x61\x30\xf2\x10"
- "\xc6\xad\xbe\x19\x3b\xc2\x1d\xce\xb5\xa2\xc0\x5e\x85\x1d\x61\xc7"
- "\x00\x25\xf6\xee\x98\xe2\x19\x7b\xff\xeb\x1b\x19\x7b\x79\xbd\x3b"
- "\x2b\xf3\xee\xd0\xdd\x59\x3b\xc2\x0e\x9d\x6c\x47\xd8\x71\xc1\x2d"
- "\xf6\x2a\xbe\x8d\xbd\x55\xef\xfe\xdb\x18\x9c\x67\xd8\xfb\x56\xbd"
- "\x47\x3b\x42\x17\xff\xad\xb7\x8f\xf1\x6f\x63\xa2\xcc\x6b\xf6\xc2"
- "\x8e\xf0\xbd\xf3\x31\x78\xbb\xf2\x56\xec\x08\x88\xb7\x88\x67\x12"
- "\xe6\xde\x8c\x1d\xe1\xf6\xcb\xb8\xef\x1c\x53\x62\xee\x3b\xd5\x4a"
- "\xcc\x7d\x77\x81\x2b\xe6\x76\xc5\xdb\x3f\xdc\xe7\x0e\x6b\xb9\x1d"
- "\xe1\xdd\x50\xcf\x38\xfb\x87\x08\x8f\x38\xeb\xe2\x9b\x2b\xe3\x6c"
- "\x59\xa2\x12\x67\xff\x90\x71\x4b\x38\x7b\xb3\x39\x58\xbe\x57\x38"
- "\x1b\xe7\x82\xb3\x3b\x7b\xc9\x38\xeb\x9a\x87\xa5\x07\x9c\xbd\x43"
- "\x79\x58\x3c\xcb\xb8\x3b\xd7\x2a\x71\x76\xe7\x41\xcf\x38\xbb\xf3"
- "\x65\x19\x67\x79\xbd\x3b\x8b\xb3\x3b\xd7\xdc\x59\xdb\xc2\xce\x35"
- "\xb2\x8c\xfb\xee\x8b\x3d\xe3\xec\x1f\xa2\xdc\xe3\xec\x1f\xc4\xef"
- "\x62\x7f\x88\xf2\x28\xe3\x76\xc1\xd9\xf7\x86\x7a\x81\xb3\xdf\x73"
- "\x1f\x84\xf7\xbc\x8a\x7f\xe1\x64\xaf\xf5\x33\x99\x5d\xf6\x4b\x9c"
- "\x72\xde\x2f\xe1\x64\x5b\x18\x23\xd9\x16\x94\xf9\x59\xd2\x24\xfb"
- "\x6d\x94\x88\xbb\xcf\x7d\x5b\xdc\xdd\x35\xba\xdd\x81\xbb\xc9\x80"
- "\xbb\xbb\xd8\xfe\x88\x76\x07\xee\xee\xed\x90\xfa\x25\xe7\x67\xf1"
- "\x60\x5b\x18\xc5\xda\xdb\xe2\xb0\x2d\x20\x0e\x47\x39\xdb\x16\xf6"
- "\xee\xf4\x8c\xc1\xbb\x0e\x2a\x6c\x0b\x7f\x71\x8f\xc1\x6d\x0a\x0c"
- "\xde\x7d\x99\x61\xf0\x28\x09\x83\x77\x93\xeb\xa0\x5b\x5e\xcf\xf5"
- "\x0e\x83\xdb\x18\x06\x8f\xbb\x3b\x18\xbc\xff\x36\x60\x30\x1b\xf7"
- "\x3d\x1b\x4d\x46\xc0\xe0\xe9\x88\xc1\xe3\x6e\xce\xde\xf0\x1d\xe5"
- "\x68\xc1\x7e\xb9\xc7\xe2\xbd\xfd\x95\x58\xbc\x77\x1c\xab\xeb\x16"
- "\x8b\xf7\x5c\x90\xb1\x98\xd7\xbb\xb3\xf6\x86\xbd\xc1\x77\xd6\xde"
- "\xb0\x37\x58\xc6\xe2\xbd\xa7\x7a\xc6\xe2\x5d\x15\xee\xb1\x18\xce"
- "\x33\x2c\xde\x55\xd1\x2d\x16\x8f\x72\xc6\xe2\x7d\x0e\x99\x57\x61"
- "\x6f\x30\xff\xb3\xe7\x6e\xd9\xe7\x51\xfe\xd5\x3d\x42\xb2\x1b\x55"
- "\xef\x0f\x30\x15\x13\xd2\x9a\x43\xb2\x4d\xb6\x51\x04\xce\xc1\xf8"
- "\xbd\x3f\xde\xa4\x8d\x20\xc2\xa6\x91\x6b\x10\x8f\x37\xe3\x3f\xc8"
- "\xb8\xf9\x6a\x71\x6e\xb1\x31\x7e\x9f\xf9\xbb\xe2\x79\xc4\xde\xed"
- "\x4e\xd7\xdd\x3d\x8b\xe6\x8f\xf4\x15\xef\xdb\xc1\xf7\xdd\x8c\xf4"
- "\x97\xca\xc8\x9b\x66\xd5\xfb\x65\x74\xe3\x48\x62\x09\x1a\x49\xdc"
- "\xdd\xff\x98\x86\xf8\xf7\x5d\x49\x69\x49\x21\x6d\x6b\x7d\x7c\x94"
- "\xa6\xf5\xb7\x84\xe4\x17\x52\x4b\x7b\xee\xfb\x66\xb8\xd7\xff\x3f"
- "\xa1\x5e\x6b\xbf\x3d\xf0\x1e\x31\x04\xce\xb5\x49\xe7\x60\xdc\x88"
- "\x90\xe3\x43\x05\xb8\x46\x37\xd9\x5b\xb6\x67\x02\x56\x65\x10\xf2"
- "\xd4\x75\x9c\x33\xff\xed\x0b\x3c\x13\x9c\x07\x6d\x6e\x80\xb6\xe8"
- "\x0f\x1e\x6a\x03\x7e\xf4\xad\x59\x4d\x70\x4e\xaf\x81\xf7\x2a\xcd"
- "\xc3\xb1\xf7\x79\xa2\x88\xaa\x7d\x89\xf0\xf6\xe0\x04\xda\x7f\xb2"
- "\x0e\xe8\x41\xf2\x93\x89\x3f\xbe\xc7\x06\xa8\x47\xd5\x59\x14\xd6"
- "\x11\x8b\xc9\xd6\xc6\xe7\x34\xf4\xef\x10\xe8\xb1\x14\x9e\x5b\x92"
- "\x4c\x34\xf0\x1f\x40\xb7\x4c\xd6\xb5\xe7\xfe\xf7\x3a\xe8\x57\x0a"
- "\xf6\xcb\xd3\x3b\x6e\x78\x03\xd6\x9d\x87\xb4\xb8\x76\xb0\xe7\xe3"
- "\xb3\xd9\x73\xd4\xc2\x1a\x3b\x9c\xa7\x39\x59\xd4\x94\x66\x23\x81"
- "\x30\x16\xdb\xa1\xdf\xc8\x8f\xc2\x3b\xa3\x34\xab\x1e\x24\x64\x4f"
- "\x7a\xb3\xda\x04\x7d\xb7\xff\xe7\x43\x6d\xc6\xcc\x61\x04\xae\x5b"
- "\x50\x67\xb9\xa8\xfa\xe3\xda\xe8\x2f\x09\x41\x3c\x81\xdf\x5b\xda"
- "\x60\x1d\x7b\x11\xca\x1b\xe0\x3d\x84\x56\xad\x2f\xd6\x85\xf3\xa3"
- "\x8d\xa9\xa7\x49\xa0\x81\xf8\xe7\xc1\xbb\x89\x75\x35\x58\xd7\xac"
- "\xfa\x63\x01\xf6\x01\xca\x61\x50\xc6\xfb\xd0\x87\x8c\xd0\x1d\x83"
- "\x13\x18\x6f\x16\x4c\xd6\x09\x03\x07\x73\x9d\x08\xde\x73\x03\xbc"
- "\x33\xd4\x09\x80\x3a\x01\xec\x98\x49\x34\x05\x70\x0e\xdb\x81\x63"
- "\x80\x71\x61\x27\xb6\x4d\xb0\x6d\x0f\xe3\xe0\x4b\x83\x27\xeb\x28"
- "\xf0\x36\xae\xa9\xba\x4c\xd5\x27\x8d\xaa\xfd\xc3\x03\x55\x94\xc2"
- "\x3c\xb7\xac\xca\x24\x01\xf9\x02\x21\xc6\x07\xb1\x9d\xfd\xf7\x41"
- "\xfb\xbe\x38\x16\xed\xb9\x7f\x6c\x31\xab\xfe\xbb\x08\xc7\x17\xe8"
- "\xd9\xa6\x7b\x0c\xdf\x61\xff\x18\x7c\x0e\xde\xc3\xeb\xff\x91\xc5"
- "\xbe\xc7\x3e\xeb\x32\x7d\x28\x5c\x7f\xd2\x47\x75\x9e\xf8\x68\x03"
- "\xf2\xda\x73\xf7\x0f\x31\x93\xdf\xac\xc3\xfb\xcd\xfc\x3e\xe0\xa5"
- "\xfd\x51\x40\xb3\xfd\x78\x0e\xcb\x1e\xfa\x1b\x20\xd1\xad\x5a\x0b"
- "\xbc\xe1\x4a\x3b\x89\x47\x80\x2f\x24\x1e\xc1\xfe\xee\xcd\x34\xab"
- "\xd9\x3a\xac\xda\xcf\xf4\xba\x3c\xa0\xa1\xfd\x4d\xad\xef\x06\x18"
- "\x5b\xe1\x06\xd2\xa5\x11\xae\x7d\xf0\x3a\xd2\x65\x43\x3a\xd0\x84"
- "\xd7\x2d\x93\xfb\x8f\xe5\x0f\x18\x3d\x05\xa0\x05\xdf\xbb\xf9\xc1"
- "\xcb\xf8\x3e\x1b\xae\x03\x1d\x43\x68\x5b\x45\x1a\xf4\x0b\xf9\x16"
- "\x78\x64\x4f\xb2\x55\x8d\x7e\x7d\x78\xfe\xd0\x55\xab\x7a\xc3\x25"
- "\x82\x72\x25\x59\x0f\xb8\xbc\x2d\x15\xc6\x1c\xda\xa4\x61\x83\x2c"
- "\x4f\x4b\x74\x4c\x07\xda\xa5\x02\xef\xc2\x98\x6f\x80\xf1\x2b\x01"
- "\xcc\xc3\xdf\x25\xb0\xfe\x80\x4c\x67\x31\xab\x3e\x28\x80\xf6\x34"
- "\xdb\x42\xa8\x65\x7b\x08\x6d\x81\x31\xfc\x7d\x7b\xee\x07\x06\x69"
- "\x0c\xb1\x4f\x1b\xe0\xfc\x7a\xb8\x0e\xe3\xd9\xc2\x79\x68\xff\x41"
- "\xe9\x9d\x3d\x8d\xe7\xba\x3d\x24\x62\xfd\x1e\x12\xfa\xdb\x3d\x24"
- "\x72\x79\x13\xcc\xcb\x9c\x9f\xd3\x13\xd3\x6d\xb0\x26\x6e\x8e\xe8"
- "\x0c\x79\x86\x7d\xe3\x17\x56\x3d\x54\xfa\xfa\x1e\x32\x04\xf7\xc6"
- "\x46\x43\xcb\xb8\x86\x47\xf7\x3a\x47\x4d\x86\x6b\x44\x08\xda\x1c"
- "\x61\x5f\xf5\x44\xbf\x97\xae\x11\x72\x44\xdf\x46\x32\x53\x60\x2d"
- "\xbf\xda\x4c\x32\xdb\xa8\xa5\x26\xfb\x4b\x42\xf3\x23\xac\x7c\xec"
- "\xfe\x37\x3c\x3a\x9e\x10\xdc\x33\x28\x7c\xa5\x27\xf7\x25\x10\xdf"
- "\x8c\x53\x44\x9b\xd5\x44\x9b\xed\x85\xbf\xb0\x64\xae\x20\xea\x3d"
- "\x57\xeb\xb9\xec\xa9\xfa\x5f\xd5\x87\xb8\x3f\xb5\x3d\x96\xcc\xb4"
- "\x89\xeb\x51\xc1\x64\x7d\x56\x22\x79\x00\xdf\x27\x90\xc9\x5e\xff"
- "\xb3\x0d\xc6\x4d\xef\x1d\x3e\xff\x4f\x02\xa3\x67\xe1\xf8\xec\x3d"
- "\xb3\xad\x20\x6f\x51\x4d\x56\x3c\x6d\x46\xb9\x0e\xd6\x17\x26\x0b"
- "\x9a\x9a\x6d\x20\x5b\xcd\x85\xf5\xdb\x4c\x3e\x6a\x2c\x55\x0b\x1b"
- "\xa9\xc6\xcb\x67\x54\xb1\x75\x1b\xd7\x52\xe8\xfb\x54\x3d\xc9\x66"
- "\xfd\x87\x35\x33\x30\x05\xe5\x29\x7a\x0e\xfb\x7f\x08\xde\x95\x0e"
- "\x88\xcf\x86\xfa\x31\xb8\x7e\x46\x37\x18\x49\x95\xd5\x4e\xde\xb8"
- "\xc4\xc6\xc8\x0f\xc6\xc8\x17\xae\x85\xc1\x38\xf9\xbb\xa3\x1b\xd2"
- "\x4c\xc8\xdf\x1c\x21\xf8\x70\xda\x30\xba\xb4\x71\xba\xbc\xf4\x1a"
- "\x81\x75\x14\x68\xb3\x91\xd3\x46\xe8\x3f\x89\xd1\xc6\xbb\xf7\xf8"
- "\xdf\x02\x4f\xeb\x0b\x3e\x9b\x02\x7f\x20\x5f\x08\xc1\x93\x08\x3e"
- "\x1b\xfb\x80\xdf\xcf\x90\x0f\xa2\x5f\x3f\x47\x6b\x0c\xcd\xc4\x04"
- "\xef\x43\x83\x9c\xfb\x60\xf3\xb2\x0f\xe5\x5a\x4f\x7d\x58\xf7\x14"
- "\xf0\xed\x53\xc0\xb7\x4f\x01\xdf\x9a\x39\xdf\x1e\x6f\xe0\x7c\x6b"
- "\x87\x7e\x75\x80\xec\xbe\x7c\x2a\x51\x63\xbf\x76\x9d\xc6\x18\x7d"
- "\xd0\xcf\x66\x99\x77\x5f\xbc\x0c\x63\x24\xf1\xaf\xcf\x13\xfd\x70"
- "\x7c\x6a\xda\xea\x49\x16\xf2\x6f\xa7\x3b\xfe\x3d\x60\x89\x9e\x05"
- "\xb4\xf9\x35\xf0\xef\x3f\xf4\x24\xa0\x89\xf8\xae\x98\x0a\xfc\xdb"
- "\xec\x8e\x7f\x0f\x7c\x7c\x10\x9e\xd9\x85\x7f\xe3\x9d\xf9\xf7\xc0"
- "\xab\xde\xf3\xef\x01\xbd\x83\x7f\xa7\x89\xfc\x9b\xe8\xc2\xbf\x4d"
- "\x4e\xfc\x8b\xef\xed\x35\xff\x1e\x58\xe7\x1d\xff\x1e\xd0\x38\xf8"
- "\x17\xf4\x92\x37\xe6\xb1\x31\xf2\x83\x31\x02\xfe\x2d\x6f\x82\x71"
- "\x72\xcb\xbf\xdf\x3d\xfd\xfe\xbc\xef\xe6\xe9\xf7\xe7\x95\x3d\xd3"
- "\xef\xcf\x0f\x7b\x4f\xbf\x3f\x35\xdf\x79\xfa\xfd\x79\xa2\x77\xf4"
- "\xfb\x53\xad\x67\xfa\xfd\x69\xc7\xf7\x87\x7e\x1f\x1a\x6e\x9e\x7e"
- "\x1f\x8e\xee\x99\x7e\x07\xcf\x78\x4f\xbf\x83\x65\x77\x9e\x7e\x1f"
- "\x06\x78\x47\xbf\x83\xf9\x9e\xe9\x77\x70\xae\x27\xfa\x3d\xff\x80"
- "\x40\x05\xf4\x9b\x0b\x19\x11\x87\x32\x10\x97\xd7\x0e\x3d\x8b\x3a"
- "\x23\x94\x7d\xa5\x32\x93\xa9\x40\xaf\x76\x29\x07\xb8\x94\x35\x2e"
- "\xe5\x60\x97\xb2\xd6\xa5\x1c\x2a\x95\x81\x5e\xbd\xae\xa8\x3e\xdc"
- "\x0d\x3a\x1b\xbc\xcb\xa1\x71\xe2\xf5\xb0\x99\x76\x1d\xea\x7d\x61"
- "\xee\xfa\xbe\x21\x87\x5a\x0d\x99\xe4\xa1\x4b\xaa\x43\xfb\x19\x3d"
- "\x56\x3d\xa8\xa7\xe9\xd9\x04\xe8\x31\xe6\xa5\x15\xc8\x57\x16\x42"
- "\x6f\x68\xfd\x60\x9c\x7e\x00\xfa\xa6\x05\x79\x4e\x97\xfc\x11\x6d"
- "\x54\x1d\x7a\x0b\xdf\xef\x29\x83\x91\x08\x3e\x4f\xe8\x51\x17\x02"
- "\xfa\x8c\xb1\xf8\x3c\xf1\x20\x7d\x6b\x9e\x26\x4f\x2d\xf8\xe7\xe5"
- "\x08\xba\x15\x16\x6a\x99\xf8\x0d\xac\x63\xb0\x96\x99\x5a\xac\xc0"
- "\x93\xd4\x62\x4c\xbe\x0c\xfd\xfd\xa8\x77\x75\x06\xb4\x0d\xcf\x81"
- "\x67\x45\x51\x0d\x0d\x33\xd9\x6a\x09\x85\x36\x6a\xda\x2a\x41\xf7"
- "\xaf\x27\x62\x9b\x51\x34\x88\x86\x61\x9b\x6e\xf5\xb3\x82\x11\x05"
- "\xf0\xcc\x51\x53\xf5\xbe\x84\xae\xf4\x0d\xf6\x8e\x3f\x3e\x1a\xe2"
- "\x51\xef\x2b\x88\x08\xe6\xed\xfa\xdf\x4a\xbb\xab\xbb\x69\x57\xec"
- "\xaf\xe6\x56\xda\x6d\xf0\xdc\xee\x48\xb1\xbf\xba\x5b\x68\xd7\x38"
- "\xbc\x9b\x76\xc5\xfe\x46\xdd\x4a\xbb\x1e\xf3\x7f\xd0\x82\x51\x62"
- "\x7f\xb3\x6f\xa5\xdd\x26\xcf\xed\x8e\x28\xb8\x35\x5e\xf8\x38\xa2"
- "\x3b\x5e\xb8\x35\x3e\xf8\xb8\x9b\xf7\x8f\x28\xb8\x35\x1e\xf8\xd8"
- "\xdc\x1d\x0f\xdc\x1a\xfd\xff\xd2\x2d\xfd\x6f\x8d\xf6\x7f\x59\xd3"
- "\x1d\xed\x6f\x8d\xee\x7f\xf1\xc8\xff\xa8\xcb\x02\xed\xc3\x69\x48"
- "\xbc\x41\x28\xbc\x27\x5c\x08\x19\x31\x6c\x95\x10\x45\x9e\x07\x0c"
- "\x0b\x2c\x22\x41\x51\xcc\x3e\x74\xd8\xb0\xa2\x98\xa8\xf3\xd5\x82"
- "\x7a\x77\x7a\xbd\xda\x64\x8b\x20\x59\x36\x6a\xdf\x91\x6a\x55\xfd"
- "\x10\xce\x7f\x0c\x1a\x4d\xdb\x62\x3d\xe1\xed\xdc\x13\x9e\x97\x19"
- "\x45\xa2\xed\x04\xed\x11\x6d\x87\x33\x00\xc3\x00\xc7\x4c\x45\x56"
- "\x5c\xf3\x82\xe0\x3e\x1b\xf0\x2f\xb4\x61\x25\x7b\x05\x8b\x2a\x2a"
- "\x99\xd5\xb3\x80\xde\x68\xa1\x85\x23\x86\xd1\x2c\x3d\x59\x0d\xbf"
- "\xe1\x99\xa7\x7c\x2c\x44\x5d\x02\xfa\x64\x7b\xee\xe1\x3a\xb3\xaa"
- "\x62\x1f\xea\x98\xa0\xcb\xb6\x64\x7d\x83\x36\xf7\x78\xc3\x2a\xd0"
- "\x6b\xb1\xee\x1e\xc1\xa2\x7e\xca\x40\xd4\x87\x2d\xa8\xbf\x57\x90"
- "\x8f\x53\x08\xe9\xc6\xe6\xe2\x2b\x04\x47\xa7\xe0\xfd\xd8\x0e\xda"
- "\x32\x37\x08\x30\xb6\xc1\x93\xf5\xd8\x5f\x18\xe3\x66\x63\x3a\xae"
- "\x0b\x15\x6b\xc6\x0e\xa6\xed\x22\xce\x3f\x78\x09\xca\x4c\x67\xcf"
- "\xa1\xb5\x54\x23\x68\x69\xde\x7d\x51\x35\x6d\x57\x89\x31\xb5\x93"
- "\x34\xaa\x2a\xd6\xe2\xb3\x5b\x83\xa3\x0d\x6d\xc1\xd1\x69\xd0\x87"
- "\xd5\x52\x7f\xf1\x59\xd2\x79\xb4\x51\x88\x7d\xdc\xf1\x71\x86\xe7"
- "\x3e\xc2\x5a\xd2\x2f\x5a\x4b\x2d\x38\x86\xc6\xcc\xab\xd0\x97\xa3"
- "\x0f\xe0\x38\xd3\x82\xe8\xa8\xb6\x2c\xfd\x23\xdc\x66\x77\x24\x0a"
- "\x6d\x3f\xb0\x0e\x0c\x67\x76\x98\x8d\x74\x38\xf3\xb3\x01\xbc\xa7"
- "\x3b\xf4\xcc\xd6\x76\x45\x75\x84\xe5\x3f\x9e\xaa\x57\x7b\xa9\xf3"
- "\x1c\x61\xeb\xbf\xf1\x11\x1c\x87\xa3\x2a\x78\xde\x33\x8d\xaa\x23"
- "\x73\xb9\x1d\x8f\x8e\xc3\xe7\xc1\xfb\x59\xe0\x99\xe3\x68\xbe\xa0"
- "\xc1\x7a\x70\x7d\xb5\x78\x3d\xc6\xe9\x7a\x0c\xf4\x79\x8d\x78\x5d"
- "\xb4\x03\xd2\x29\x4e\xd7\xa7\x18\x1e\x41\xbb\xdc\x91\x2a\x7c\x27"
- "\x58\xcb\xc2\x71\x5d\x43\x9b\x3f\xb7\xab\xd3\x70\xb1\xde\x98\x16"
- "\xd5\x91\x0b\xad\xc0\x57\x70\x7d\xa2\xd3\xfd\x13\x0f\xa7\x85\x93"
- "\xe7\xb7\xe1\x98\x1e\xb1\x9a\x7d\xfd\x6c\xdc\x96\x53\xd1\xc6\xc6"
- "\x42\x43\xf5\xce\xed\xc1\x7b\x55\x40\x9b\xfa\x36\x90\xf5\xa0\x4e"
- "\x03\x3e\xd3\x79\xfc\xe3\x93\x93\x17\x25\xeb\x06\xce\xd5\xcd\x5d"
- "\x30\x4b\x37\x67\xd1\x92\x85\x29\xcf\x0e\x9c\xdb\x87\x10\x27\xde"
- "\xd1\xd0\x9c\x40\x2a\x14\x4c\x28\x37\x15\x81\x8c\xa5\xd6\xc0\x7a"
- "\xdb\x49\x0a\x80\xae\xf6\x90\x69\xa5\xf6\xc2\x69\x30\x7f\x9e\xc9"
- "\x37\xa6\x3f\x07\x63\x7f\x74\x2d\xb3\xfb\xeb\x08\x59\x07\xd7\x8d"
- "\xe9\xc7\xf1\xdc\x36\x76\x0e\x46\x92\xd9\xab\xd2\xfd\x49\x85\xee"
- "\x2a\xb3\x79\xc1\xb5\x93\xcc\xbe\x77\x8d\xa8\x6d\x39\xfe\xe4\x8f"
- "\x99\xb5\xea\x83\x82\x59\xfd\x47\xa1\x5e\x8d\xf2\xc2\x61\x6d\x25"
- "\x79\x3a\xcd\x9f\xe0\xf5\x8f\x32\xe1\x3c\x5c\xc7\x6b\xac\x1d\x46"
- "\xeb\xbf\x0e\xc4\x7a\x68\x03\xc3\xdf\x59\x45\xf4\xfc\x61\xad\x85"
- "\x70\xb9\xf5\xe8\x32\xec\xab\xee\x41\xfc\xbe\x70\x74\x05\xf6\xcf"
- "\xac\x3a\x9a\xe1\x53\x0c\xf5\x53\x49\x00\xd4\x4f\x14\xb6\x4c\x28"
- "\x47\x2c\xb0\xe5\x1e\x0d\xa7\x39\x41\x0b\x4b\x36\x11\xff\xe2\x4d"
- "\x30\x37\x37\x11\xdf\xf6\xdc\xbf\x4e\x31\xfb\x3e\x7c\x10\xc7\x16"
- "\x9a\x09\x68\x55\x93\x9f\xc3\xb9\x04\x33\xf9\x4d\x18\x9e\x83\x39"
- "\xd8\xe6\x09\x5b\xae\x83\x7c\x67\x0d\x1b\x14\x2e\x04\x4f\x28\xa3"
- "\x30\x6e\xed\x61\x83\xe2\x02\x0d\xc0\x5b\x30\xc7\x68\xff\x09\x65"
- "\x2d\xaa\x63\x19\x47\x01\x45\x33\x71\x4e\x17\x3e\x93\xff\xee\x75"
- "\x2b\xcc\xed\x69\xa5\xbb\xae\x5b\xa0\x3c\x2d\xbc\x0c\xca\xc7\x8c"
- "\x65\x44\xf7\x12\xca\x4e\x7f\x3d\xf3\x6f\x73\xa9\x6d\x70\x15\xc8"
- "\x99\x4d\xff\x4d\x4e\xd4\x55\x92\x80\xe9\xc4\xc7\x11\xeb\x3d\x85"
- "\xa8\xa3\xcd\x50\x5e\x42\xd4\x35\xa0\xf7\xa3\x6d\x3e\x73\x24\xda"
- "\xe7\xab\x09\xda\xec\xa9\x3a\xa9\x6a\xf7\x55\x2b\x60\x58\x73\x2f"
- "\xf4\xf9\x16\x34\x5b\xfd\xf1\x9e\x99\x6d\xe2\xb7\xae\x56\xf1\x5b"
- "\x57\x2b\xfb\xd6\x55\x9e\x11\xc7\xbf\x75\xe1\x37\xae\xe8\x38\x1f"
- "\x8a\xed\xe1\x77\xaf\xfb\xda\x80\x0f\x16\xeb\xfb\xda\x17\xeb\xfb"
- "\x15\x5d\x25\xc1\x35\x96\x66\x90\xd1\x2a\xc9\x9b\xa9\x24\x98\xb6"
- "\x26\xf4\xae\x32\x1e\x27\x74\xd3\x16\xb2\x37\xd3\xd8\xcb\x8e\x36"
- "\x8a\x56\x6d\x9f\xc0\x95\x2a\xb4\xf3\xf7\x5d\x97\x4c\x86\x6c\xbf"
- "\x4a\xc2\x67\x5e\xc8\x66\x71\x9f\x30\x47\x9f\xad\x55\xaf\xbb\xd1"
- "\xaa\x7f\xac\xa3\x55\xff\x48\xa0\x85\x7f\x1b\x7b\xf5\xb2\x86\xa0"
- "\xbf\x2d\xcd\xfd\xdf\x86\xed\x68\xa3\x6e\xb3\x10\x5b\xd0\x56\x7f"
- "\xe4\x65\x78\x76\x28\x7e\x4f\xc9\x5a\x46\x34\xc2\x17\x7a\x52\x9d"
- "\x70\x95\x3c\x0d\xb4\xc7\x6f\x07\x25\x8d\xfc\xdb\x81\x1d\x74\x1a"
- "\xfc\x7e\x70\xbd\x55\xaf\xa6\xc1\x93\x34\x2f\x26\xea\x48\xc7\xdb"
- "\x83\xc2\x4d\x69\xef\x92\xac\x0e\x7a\xde\xb4\x5a\x20\x68\x57\xa6"
- "\xb9\x7f\xcd\xa6\xfd\x27\x69\x8e\xe8\x4f\xe2\xba\x12\x2e\x63\xc7"
- "\xb1\xf1\xb7\x86\x1d\xc7\x98\xfc\x8c\xdf\xd9\x80\x7e\xa5\xbb\xae"
- "\x22\x3d\x81\xae\x57\x2d\xea\x09\x40\xbb\xea\xa6\xdf\x03\xdd\xea"
- "\x15\x74\x63\x74\x86\x7a\x17\xe7\x02\xbd\x2e\x70\x1a\x56\xb5\x01"
- "\xfd\x0e\x60\x1b\xd1\xfb\x76\xa7\x5a\xd5\xa0\x37\xa9\xab\xac\x67"
- "\xd8\x9e\x15\xa4\xe3\xae\xce\xca\x5e\x1d\xb0\xde\xe0\xf7\xca\xeb"
- "\x3b\x06\xc5\x74\x04\x4f\x58\x73\x23\x78\x42\x51\x37\xdf\x2e\x39"
- "\x3d\x13\x89\x7f\x55\xd3\x49\x4e\xcf\xd7\x44\x7a\xa2\x8f\xdb\x52"
- "\x7d\x5f\x5b\x3b\xd0\xf3\x3a\xd0\x33\xc5\x4c\xde\x48\x26\xc1\xa6"
- "\xe6\x7a\xfc\xae\xd3\x7b\x7c\x35\x21\x13\x06\x53\xa1\xda\x78\x9a"
- "\xd1\x75\x0f\xd0\xd5\x96\xbf\x39\x02\xbf\x67\x3a\xe8\x9a\x0a\x74"
- "\xbd\x0e\x74\xbd\x2c\xd3\xd5\xde\x0e\x74\x6d\x07\xba\xb6\x03\x5d"
- "\xc5\x6f\x9e\xaf\x26\x02\x5d\xf1\xfb\x58\x6e\x79\x1c\x7e\xf3\xc4"
- "\x6f\x4b\x48\x57\xf4\xab\x16\x96\xea\x43\xd9\xb7\xce\x39\x7a\xb2"
- "\x7d\x36\xf1\x7f\xd2\x4a\x54\x59\x07\x88\x06\xfa\xa9\x79\x7c\x3f"
- "\x51\x43\x7b\xc0\xf7\x8d\x04\xe9\x6b\xda\x6f\x27\xcb\x5f\x26\x8f"
- "\xd8\x36\x72\x3a\x9b\x6c\x1f\xa0\x6d\x37\xe2\xfa\x52\xbd\x7a\x6b"
- "\x2a\x89\x44\x9a\x4f\xbc\xa0\x23\x47\x62\xaa\x89\x2b\xcd\x85\x2d"
- "\xd1\x51\x40\xa7\xe1\x48\xf7\x5b\x9f\xb7\xd5\xc3\x6f\x7e\xde\x9e"
- "\xd8\xf2\x7f\xf3\xf6\x76\xcf\xdb\x13\x11\xee\xe7\x6d\xb5\xea\xd6"
- "\xe6\x2d\x7e\x92\xf8\xbf\x79\xfb\xfd\x9f\xb7\x55\x2d\xae\xf3\xd6"
- "\x21\xb7\x24\xc7\x2f\x98\x95\xb8\x30\x71\xe1\xaf\x75\xb3\x97\xa5"
- "\xc4\x2f\xe6\xd2\x8b\x42\x7e\xd1\xdb\x85\x28\xf5\x66\x58\xaf\x4f"
- "\x68\xeb\xc9\xde\x07\xeb\xd5\xc2\x2b\x5a\x5f\x9a\xff\x5e\x8c\x90"
- "\xbf\xbb\x7e\x33\xc8\xe1\x38\xbf\x0b\x40\xc6\xbe\xa8\x3a\x95\xf0"
- "\xd7\x50\x90\x3f\x93\x2f\x11\xfc\xcd\x65\xb7\xa4\x4a\xdc\xe7\x58"
- "\x54\x48\x9b\x71\x9f\xe3\xb1\x0a\x94\x2d\x4c\x3b\xef\x8d\x05\x1d"
- "\xe2\x15\x2d\xe9\x78\x25\x56\xfd\xdb\xd3\xc4\x3f\xb0\x9e\x4c\x14"
- "\x04\x4a\x8d\x99\x97\x40\xee\xfb\x6c\x9f\x71\xda\x25\x82\xb2\xce"
- "\x45\xd5\xc9\x20\x5d\xfa\x4a\x38\xd6\x5d\xd3\xa5\xe7\x9e\x83\xe3"
- "\x07\xcc\xd6\x12\x42\x9b\x69\xe1\x04\x62\x7f\x67\x70\x36\x7e\xdf"
- "\xdc\x1e\x42\x9b\xf6\x80\x9e\xb1\xa7\xd3\xaa\x5e\x75\x15\xf8\x26"
- "\xe7\x51\x8a\xdf\x29\x71\x0c\x56\x25\xc3\xd8\x83\xa4\xc9\x65\xd3"
- "\xba\xfe\x38\xbf\x40\xbe\x6a\x3a\x74\xb1\x5e\x8d\xdf\x69\x71\xce"
- "\xb5\x69\x04\xcd\x6a\x78\x17\xe8\xa7\x79\x6b\x21\x6d\xb0\xf4\x9f"
- "\x50\xee\xab\x23\xea\xf6\xdc\xda\x50\x90\x7b\xc6\xa1\xcc\xb2\x06"
- "\xae\xad\x85\x6b\xfc\x9b\xe1\xdf\x6a\xa9\x5f\x4d\x33\xe2\x1c\xf0"
- "\xb5\xea\x8a\xaa\x36\x11\x63\x3d\xad\xe3\x7a\x49\xb3\x75\xcb\x84"
- "\x22\xdb\xdb\x83\x62\x6c\x28\x53\x0e\x1c\x14\xd7\xb1\x65\xc2\x1a"
- "\xdb\x96\x09\x65\x53\x07\xb3\x6f\xe3\x50\xff\x53\x66\x53\xea\x28"
- "\x78\x26\x1f\xea\xb7\xb5\x06\x4f\x2b\x6d\x2d\x98\x16\x7e\x3c\xad"
- "\x88\xe8\x26\x23\xfe\xd5\x42\x0b\xd4\xf6\x44\x0c\xe0\x5f\xd1\xbb"
- "\xe4\xc4\x44\xc0\xbf\xd8\xae\xf8\xc7\x7d\x09\xec\x84\xe3\x60\x35"
- "\x81\xb6\x9a\x70\x1e\xa1\x9c\xba\x1b\xc6\x02\xe7\x08\xce\x05\x86"
- "\x87\x80\x85\xd2\x7c\xc1\xb9\x84\x78\xc7\xe6\xae\xcb\xdc\xc1\xf9"
- "\x72\xaf\x85\x68\x70\xbe\x20\x1e\xe2\x7c\x41\x1f\x9d\xcd\xe2\x7c"
- "\x09\x6c\x20\x9a\x37\x00\x0b\x4d\xb6\x4a\x36\x67\x50\x9e\xac\xb2"
- "\x39\xe1\x20\x7e\xdf\x71\x9a\x2f\xeb\xa5\xf9\x22\xe1\x20\xcc\x09"
- "\x1b\xce\x97\xa5\xfa\xc7\x3a\x97\xca\xf3\xe5\x95\x33\x1a\xc2\x30"
- "\x32\xf7\x7f\xe3\x8a\x61\xbe\xd4\x18\x2c\xc4\x2e\xe1\x20\xcc\x17"
- "\xdc\x43\xc4\x70\xf0\x37\x80\x83\x2d\x80\x83\x16\x38\x0f\xf3\xa4"
- "\x64\xbe\x88\x83\xe2\xfc\xe8\x58\x2a\xe2\xe0\x65\x1d\xe9\x1c\x88"
- "\x38\xf8\x86\x07\xf9\xe5\x8c\x0b\x0e\x7e\xda\xfb\xd6\x70\xf0\x53"
- "\xf6\x9d\x1f\x69\xd8\x09\xf4\x44\x3a\x4e\xd0\x52\x5b\x55\x11\xe0"
- "\xdf\x94\xef\x19\xdd\x92\xdd\xd3\x6d\x8f\xb8\x7e\xb9\xc5\x39\x37"
- "\x74\x03\x3e\x6f\xb1\xb5\x77\xa5\x1d\xcd\xfd\xa0\xcc\x19\xeb\x10"
- "\xe3\x10\xef\x10\xe7\x10\xf3\x70\x7e\x20\xd6\x21\xce\x0d\x82\x35"
- "\x00\xca\xcd\xd5\x09\x8d\x0c\x03\xb3\x2e\x10\x4d\xd6\x58\xf2\x88"
- "\xa9\xdc\x0e\xfa\xcd\x35\x82\x18\xe8\xbc\xbe\x21\xe6\x21\x6d\xb7"
- "\x5e\xe7\x98\x87\xeb\x1c\xe2\x5b\x97\x75\x0e\x68\x6b\x56\x7d\xd2"
- "\x86\xeb\x1c\xb3\x55\xe4\xdc\xff\x8b\xed\xfd\xb8\x5e\x52\xd0\x8f"
- "\xf8\xb7\xe7\xfe\xcd\xd2\x55\x37\xa9\xf3\x95\x74\x13\x9c\xe3\x38"
- "\xd7\xcd\xaa\x5a\xe6\xaf\x68\x7c\x70\x14\x62\x16\xff\x06\x52\xf0"
- "\x0b\x33\xd7\x8f\x4e\x3f\xc0\xca\xc1\x93\xf5\xb2\xfe\x5f\x37\x89"
- "\x7f\xcb\x07\x7d\xbf\xff\xa8\x66\xba\x51\xd0\xe2\x18\xe3\x3b\xcf"
- "\x1c\x0c\x3c\xba\x25\xda\xb0\x01\xc7\x6d\x4b\x74\x0a\xfc\x4e\x93"
- "\xf9\xae\x6e\xe5\x91\x34\x42\xa6\xa6\x79\xcb\x77\x75\xcc\x97\x86"
- "\x7e\x1e\x7b\x3f\x7d\x25\xd6\x57\xf8\x3c\xb6\x17\xf0\x88\x76\x91"
- "\x3d\x9b\x5c\xcf\x4f\x32\x66\xd9\x68\xb3\x2e\x9d\x3c\x01\xfd\x3a"
- "\x7f\xcc\x46\xc8\xb1\x36\x42\x4c\x13\x93\x80\xde\x49\x51\x7b\x05"
- "\x8b\xaf\x59\x65\x2a\x03\xfd\xb1\x19\xb0\xd8\xd7\x19\x8b\x39\xee"
- "\x9a\xd8\x37\x03\x6b\x7e\x52\x2d\xb6\x15\x5d\x49\x02\x61\x3d\xf6"
- "\xbd\xa8\xfa\x6c\xe5\xb2\x15\x04\xf7\xbf\xf6\x82\xdf\x2f\x76\xf6"
- "\x8b\x8c\x82\xfb\xfb\xd2\xcf\xa7\xa8\x0c\x2f\x90\x47\xe8\x2b\x53"
- "\x54\xe8\xbb\xb0\x53\x28\x55\x0b\x70\x8e\xfb\x42\x95\x12\xbc\xbe"
- "\xae\xd3\x97\xc9\x69\x02\xd4\xa9\x69\x2b\x25\xeb\x52\xfd\x09\xd6"
- "\xe7\xfe\x75\xa5\x04\xeb\xaf\x4f\xd6\x30\xdf\x07\x76\x9f\xad\x94"
- "\xe0\xbd\x76\x38\xff\x3b\x21\x80\xe4\xa5\x07\x93\x63\x55\x35\xac"
- "\x8d\x63\x55\x47\x09\xb6\x01\x73\x01\x7e\x1f\x22\x1b\x52\xb5\x80"
- "\x09\xa5\x70\xfd\x33\xb2\xe1\x4a\x28\x1c\x2f\xc2\xff\x75\x72\x49"
- "\x75\xd2\x72\xac\x4a\x20\x81\x2b\x7f\x4e\x81\xa7\xa9\x09\xf7\x54"
- "\x66\x12\x3f\x58\x57\x3a\x4c\xf5\xf9\xa0\xd3\xd6\x99\x71\xcf\x3d"
- "\xcd\x7a\xa5\x45\xa0\xaf\x5c\x16\xb2\x5e\xb9\x82\xcf\xb6\xd3\x57"
- "\xbe\xc6\x67\xaf\x4f\xd7\x89\xfe\xb6\xa5\xcc\x37\x70\xdd\xf5\x30"
- "\x82\x7d\xc5\xe7\xe2\xf3\x36\x24\xeb\xc5\x67\x0e\x61\x7d\xc3\x67"
- "\x62\x9b\xce\xcf\xc4\x7c\xf6\xba\x5f\xe2\x33\x3f\x5b\x00\xc7\x20"
- "\xa0\x47\x13\xd2\x01\x9f\x2f\xd0\xd8\x5e\x34\x2b\xd6\x87\xdd\x63"
- "\x6d\x76\x77\xcf\x5b\xe2\x3d\xcc\x16\x89\xf7\x74\x50\x56\x9f\xb5"
- "\x01\x6b\xe5\x87\x78\xfe\x47\xb1\x46\xd2\x95\x86\x7f\x7f\x99\xaf"
- "\x9d\x7f\x1f\xcc\xd7\x4e\x4e\x53\xc6\x2b\xaf\xc4\xf6\x02\xba\x69"
- "\x70\x9d\x6d\x54\xfd\x5d\xe5\x68\xe3\xf3\x58\x1f\xa4\x37\xf2\x8d"
- "\xc4\x4b\xc8\x47\x12\x0f\xb1\x7e\x5a\x08\x71\xe6\x19\xf8\xed\x2f"
- "\xb6\x33\x5e\x6a\x07\xfa\x40\x24\x3e\xfa\x11\x5c\xef\xca\x47\xa7"
- "\x06\xc8\x7c\x54\xff\xb1\x35\x93\x52\xe4\x23\xe3\xb4\x1c\x6c\x67"
- "\xa3\xdc\x9f\x29\x2a\xe4\xb1\x7f\x32\xde\xb2\x20\x9d\x7e\x94\x41"
- "\x82\xf9\xfb\xd4\xb3\x5c\x78\x3f\xca\x30\x06\x63\x5f\xa5\xf7\xc0"
- "\x3e\xe4\x09\x3a\x22\xbd\xc7\x86\xce\x30\x68\xf7\x0a\x11\xef\xd9"
- "\x82\x6d\x4b\x63\x00\x34\x23\xd2\x3d\x52\xfd\x3c\x41\x0f\xfd\x1e"
- "\xc2\xee\xe1\x3c\x77\xd1\x0d\xff\xd4\x9f\x77\xe5\xb9\x7b\x33\x08"
- "\x08\xc4\x20\x6b\x4d\xbb\x8a\xcf\xb1\xf3\xbe\x7d\x64\xef\xf8\x3c"
- "\x16\xe9\xaa\xe6\xe7\x4f\xf5\x77\xe2\x09\xb1\x7d\xab\x9b\xf6\x4f"
- "\x8d\x56\xb4\x1f\x0b\xed\xa7\x41\xfb\x28\xcb\x4d\x43\x1b\xde\x29"
- "\x96\x3f\xe7\x47\x69\xbc\x7d\x89\x6f\x69\xfe\x48\x62\x48\x47\xff"
- "\xd4\xd3\xa2\xcf\x9f\x89\x61\x27\xf3\x8b\x52\x0b\xa5\x82\x8b\x5f"
- "\x94\xb3\xdf\xdc\xde\x4c\x8b\xe8\x13\x75\x8a\xf9\xb6\xa2\xad\x0c"
- "\x65\xd2\xdd\x20\xcf\xc9\x7e\x51\xa7\xf1\xfa\x65\x63\x6a\xa3\x93"
- "\x5f\xd4\x29\x23\xd6\x37\xab\x4e\x6b\xdb\xd5\x44\x0d\xe5\x3a\x7e"
- "\xde\x14\xe3\x7c\x5e\xf6\x3b\xe4\xe7\xd1\xa7\x5b\xb4\x1b\xb7\x1c"
- "\x2e\x47\xbb\xe1\xe9\x70\xc9\x56\xeb\x41\x17\xf6\x42\x66\x6e\xda"
- "\x2f\xcb\xcc\x4d\xfb\x3d\xcb\xcc\xa7\xcf\x74\x2f\x33\x9f\xb7\xc9"
- "\x32\xb3\xf9\x55\x3e\xef\xcd\xa3\xf9\xbc\x37\xb3\xf9\x9d\x07\xed"
- "\xd9\x7e\x1f\x9f\x4f\xdf\xd1\xeb\x90\xcf\x4b\x40\x06\xde\x9b\x5a"
- "\xa9\xde\x0d\x7a\xb7\x5d\xfd\x28\x5d\x05\x63\x87\xf1\xe0\x56\xa5"
- "\xc3\xfa\x6d\xab\x23\x35\xbe\x28\x33\xa3\x7f\xd9\xb9\x59\x35\x2d"
- "\x56\x02\xeb\x9c\x85\x8f\xcb\xe7\x23\x81\x16\x3e\x26\xab\x95\xb0"
- "\x7a\x70\x0d\xd6\xb5\x26\x94\x99\x0f\x09\x95\xea\x12\x18\x53\xf8"
- "\xf7\x6d\x0b\x8e\x8f\x73\x96\xa9\xdb\x73\x3f\x4f\x70\x2f\x4b\x9f"
- "\x0b\xb5\xe5\x3a\xcb\xd2\x9f\x7f\x80\xb2\x34\xda\xf7\x51\x3e\x10"
- "\xb8\x0c\x1d\x03\xf2\x74\x1c\xca\xd5\x28\x4b\x0b\x0a\x59\xfa\xcc"
- "\xda\xee\x65\xe9\xcf\xcf\xff\x9f\x2c\x7d\xa7\x64\x69\xc9\xa6\xe0"
- "\x2a\x4b\x9f\x99\x7a\x6b\xb2\xf4\x99\x29\xff\x27\x4b\x7f\xdf\x64"
- "\xe9\x33\x51\x92\x2c\x2d\xe4\xdc\x3f\x0c\x6d\xfc\x25\x0e\x59\xfa"
- "\x5c\x64\x57\x59\xfa\x5c\x4c\x57\x59\xfa\xf3\x0c\x59\x96\xfe\x3c"
- "\x54\x29\x4b\x5f\x88\xef\x2a\x4b\x9f\xdb\xe6\x49\x96\x06\x1c\x6b"
- "\x41\x59\x1a\x79\x0d\xe5\x6a\x94\xa7\xa1\xef\x69\x9c\xef\xce\x55"
- "\xdf\x9a\x2c\x7d\xae\xea\xe6\x64\x69\xf3\x93\xee\x65\xe9\xd3\x0d"
- "\x9e\x65\xe9\xd3\x0d\xee\x65\xe9\xf3\xd5\xb2\x0c\x74\x7e\xeb\xf7"
- "\x5f\x96\x3e\x1f\xe9\x5e\xde\x39\x3f\x96\xcb\xd2\xe6\x21\xb7\x5f"
- "\x96\x36\x0f\x71\x2f\x4b\x9f\x3f\xc0\xe5\x0e\x73\x78\x57\x59\x1a"
- "\xee\x71\x2b\x4b\x9f\xbf\x2c\xde\x33\x44\x29\x4b\xf3\x36\x1a\x55"
- "\x8d\xbd\x3d\xcb\xd2\x8d\x6f\xf3\x35\xb5\x71\x09\x5f\x53\x39\x4d"
- "\xbb\xca\xd2\x8d\x2f\xf6\x2c\x4b\x73\x1e\x62\xfd\xf4\x28\x4b\x37"
- "\x6e\xe9\x2a\x4b\x9f\x6e\x70\x2f\x4b\x37\x2d\x90\xf9\xa8\xe9\x3e"
- "\xa5\x2c\xdd\x78\xe6\x9f\x43\x96\xf6\xc8\x5b\x91\x4a\x59\xfa\x8b"
- "\xdd\xde\xcb\xd2\x5f\x9c\xf7\x4e\x96\x46\x9e\x73\x27\x4b\x37\x3d"
- "\xe9\xca\x73\x4a\x59\xba\x69\xbc\x7b\x59\xba\x69\x96\x52\x96\xc6"
- "\xf6\xdd\xc9\xd2\x4d\xeb\x15\xed\x77\x91\xa5\x9b\x76\x2a\x65\x69"
- "\x5e\x4f\x96\xa5\x2f\xc4\x88\xb6\x89\xd7\xbd\x97\xa5\x2f\x0c\xed"
- "\x5e\x96\xbe\x30\x52\x29\x4b\x5f\x08\xe0\x32\xf3\x85\xb9\x5c\x96"
- "\xbe\xa0\xe3\xe7\x4f\xaf\x76\x3e\x2f\xcb\xd2\xfc\x7c\x57\x59\xfa"
- "\x42\x46\x0f\xb2\x74\xd4\xcd\xcb\xd2\x96\x83\x95\x0e\x59\xda\x72"
- "\x50\x92\xa5\x31\x9f\x51\x31\xc8\xa7\xc5\x4c\x9e\x3e\x4e\x8e\x35"
- "\x61\x7f\x2e\x3e\xd9\xbd\x3c\x7d\xb9\x45\x96\xa7\x5b\x9e\xe5\x73"
- "\xbf\x65\x00\x9f\xfb\x5f\x9d\x77\xd8\xa0\x41\x96\x46\x99\x5a\xb4"
- "\x41\xd7\xad\x83\xff\xbd\xe9\x95\x4c\x9e\x46\x5f\x7d\x94\xa9\x51"
- "\x9e\x46\xb9\x1a\x65\xe5\x6a\x18\x85\x1a\x8b\x15\xfd\x57\x6a\x8d"
- "\x8f\xe0\xb8\x7e\x55\x0d\x72\xb8\x19\xd6\xb6\x5a\xb8\xd7\xbc\xf7"
- "\xaa\x15\xf7\x7d\x34\xe4\x35\xc2\x3d\x66\x7e\x0f\x5c\xaf\xc7\x7b"
- "\xa0\x4e\x03\xa7\xc5\x57\x83\xf9\xfa\x29\xc9\xe3\x17\x8f\x29\xe4"
- "\x71\x5e\xb7\x4e\x92\xc7\xb7\x41\x1f\xe0\xdf\x17\x65\x71\x94\xc9"
- "\x41\x16\xaf\xda\x56\x48\x2b\x4b\x42\x68\x45\x7b\xee\x45\x9b\x24"
- "\x93\xff\x3f\xf6\xbe\x3f\x2e\x8a\xe3\xfc\x7f\xd8\x3b\xf4\x34\x28"
- "\x87\x05\x83\x7e\xd5\x9e\x06\xe2\x91\x68\xd5\x44\xc3\x1d\xd5\xc6"
- "\xa4\x5a\x7f\x54\x05\x53\x4d\xd1\x68\x44\x83\x14\x14\x15\x15\x0d"
- "\x1a\x04\x34\x9a\xa2\x51\x04\x03\x7e\x30\x82\x92\x7e\x48\xa2\x8d"
- "\x18\x4d\x4d\xaa\xad\x26\x98\x68\x3f\x68\xf8\x65\xaa\x2d\xa6\x98"
- "\x9c\x16\x0d\x1a\xd4\x53\x51\x0e\xb8\xbb\xfd\x3e\xb3\xb3\xc7\xee"
- "\xde\xed\x1e\xb7\x77\x48\xd1\xfa\xc7\xbd\xc4\xdd\xd9\xd9\xd9\xe7"
- "\x79\xcf\x33\xef\xf7\xb3\x33\xb3\x5b\xe0\x58\x06\x1c\x83\x76\x54"
- "\x9e\x28\x40\xe8\xd8\xed\x62\xcc\x29\x0c\xf9\x57\x90\x12\x7c\x56"
- "\xf5\x26\xdc\x1f\x5f\xdf\xf0\xd6\x0f\x43\x6d\xd7\xc0\xf8\x5e\x4a"
- "\x38\xfc\xb5\x5a\xab\x20\x1f\xfe\xc3\x9a\x16\x0e\x0f\x76\xc2\xf9"
- "\x76\xfc\x9d\x30\x86\xc7\x07\x0f\x8c\x32\xdb\x78\x7c\x00\x9f\xc7"
- "\x5f\x9d\x6a\xe3\xf1\x78\xbd\x55\x0b\x8f\x4f\xb4\xf1\xf8\x1f\xf6"
- "\xba\xc9\xe3\xcf\x76\x14\x1e\xef\xe3\xe5\xa5\xf4\x89\x22\x3c\x3e"
- "\x6f\x65\xdb\xf0\x78\xcc\xe1\x31\x6f\xc7\x1c\x1e\x73\x7a\xcc\xe3"
- "\x31\xa7\xb7\xb2\x3c\x7e\x97\x1d\x8f\xb7\x02\x67\xb7\xe7\xf1\x98"
- "\xdb\xdb\x78\xbc\x55\xc0\xe3\xaf\xf6\x75\x8f\xc7\x5f\xed\xd3\x06"
- "\x3c\xbe\x7d\xfc\xd6\x81\x78\xbc\xd6\x8e\xc7\x63\xde\x0e\x7d\xb2"
- "\x06\xf3\xf9\x8a\x62\xb0\xcd\x52\xe0\xf4\xc0\xe7\xdd\xe7\xf2\x57"
- "\x55\x7c\x2e\xbf\xab\x07\x9f\xcb\xff\xa8\x72\xe4\xf2\x3f\xf6\xe1"
- "\x71\xf9\x52\x83\xd7\x0f\xa3\x99\x71\x02\xe2\x41\xf1\x3c\xcc\xd3"
- "\xaf\xec\x13\x72\xf9\x5b\x8b\x1c\xb9\xfc\x8f\x71\xa2\x5c\x9e\xe8"
- "\x7b\x21\x97\x0f\x08\x4f\x34\xb7\x70\xf9\x1f\x77\xb8\xc7\xe5\x7f"
- "\xcc\xe5\xb4\xc6\x95\x24\x32\x1e\xfd\xa8\x93\xe2\xf7\x0d\x6a\x3e"
- "\xbf\xaf\xeb\xc6\xf1\xfb\x44\x1e\xbf\xbf\x32\x48\x9a\xdf\x5f\x21"
- "\x7b\x5b\xaa\xe3\x2b\x71\x5d\x98\x97\x41\x6c\xad\xd1\x2c\xc3\xdc"
- "\xec\xfa\x31\xcc\xcd\x20\x9e\xd5\xe0\x39\xe3\xf0\xff\x8d\x36\x9e"
- "\xcf\xe8\x54\xcc\xf5\x57\x77\x44\x3e\x76\x5d\x2b\xce\xc7\xae\x8f"
- "\xc0\xbc\x87\xac\xc7\xad\xf3\x01\x9b\xd4\xb4\x2d\xdf\xaf\xf3\x11"
- "\xe7\xfb\xd7\xf7\x12\x6e\x54\xa7\xc6\x7e\x11\xf2\x7d\xb8\x46\x94"
- "\xef\x5f\xbf\xc0\x5e\xe3\x23\xe4\xfb\xa4\x0e\x18\xe3\x1b\xa5\xf9"
- "\xfe\x8d\x1c\x32\xe6\xdf\x98\x4f\xc6\x7c\xe2\x63\x47\xbe\x7f\x63"
- "\x14\x9f\xef\x63\xff\x3b\xf2\x7d\x82\x29\xa6\x9d\x92\x7c\xff\xc6"
- "\x06\x47\xbe\x7f\x65\x10\xe6\xfb\x66\x1e\xae\xf2\x30\xae\xe6\x61"
- "\x5c\x19\x57\x60\x5c\xe1\x71\x55\x13\x83\x71\x65\x0c\x30\x59\x6d"
- "\xbc\x7f\x13\xae\xef\x9c\x3d\xef\xc7\x71\xc4\x19\xce\x12\x96\xa1"
- "\x7e\x18\x6b\x18\x67\x36\xbf\xe1\xf2\x18\x6f\xf7\x17\x6b\x37\xb3"
- "\xc5\xb1\x76\xf3\x3d\xc6\xcf\x2c\xd6\x70\xbe\x92\xe8\x00\xfc\x7c"
- "\x37\x3f\x95\xa7\x03\x98\x6b\xae\xca\xd3\x01\x18\x8b\x62\x3a\xc0"
- "\x38\xc2\x1e\x8b\x42\x1d\x60\x9c\x2a\xae\x03\x8c\x71\x42\x1d\x80"
- "\xeb\x17\xd3\x01\xc6\x1c\x41\xfd\x0e\x3a\xc0\x78\x50\xa8\x03\x48"
- "\x39\x4e\x07\xdc\x8a\x64\xf3\x2a\x67\xe4\xeb\x80\x5b\x7a\x36\xbe"
- "\x13\x1d\x70\xc9\x5e\x07\xdc\x7a\x41\xa8\x03\x6e\xf9\x93\xf8\x7a"
- "\x2b\xde\xc4\xe8\x80\x5b\x5a\x56\x1f\x54\xf2\x8f\x73\x3a\x80\x1c"
- "\x37\xf1\x75\x40\x31\xd6\x01\xb7\xd6\xb7\xa2\x03\x22\x5c\xd7\x01"
- "\x96\xe1\x9c\x0e\xb0\x0c\x77\xae\x03\x6e\x8f\x70\xae\x03\x9a\x12"
- "\x38\x1d\x60\x3a\x4e\x62\x82\xe9\x7d\x12\x13\x4c\x4c\xde\x0a\xfa"
- "\x15\x97\x57\x5f\xca\xcc\x3f\x2f\xd9\x7f\xbb\x84\xfa\x78\x19\x9b"
- "\x57\xbf\x07\x1a\x60\x25\xf0\xf9\x7a\xc2\xe7\x21\x66\x9e\xc0\x3a"
- "\x00\xf3\x75\xa2\x01\x4c\x53\xe1\x98\x01\x6c\x7e\x02\xea\x32\xec"
- "\x5b\x5d\x4c\xe1\xb9\x61\xb8\x2c\xf4\xf7\xaa\xcd\x30\x8e\xc0\xf1"
- "\x2a\x28\x53\x8c\xaf\x81\x63\x67\x8b\x97\x31\xd7\x8d\xc2\x5a\x01"
- "\xae\x2b\x86\xf3\xd5\x76\xd7\x55\xe2\xeb\xca\x93\x18\x2d\x50\x49"
- "\x7c\xd7\x90\x0f\xc7\x4b\x39\xdd\x70\xc7\x8b\xd1\x0d\xf5\xac\x6e"
- "\x80\xb2\x50\x57\x09\xa3\x1b\xe6\x81\x6e\x80\x76\xc3\x8f\xaf\x1b"
- "\x8e\x82\x6e\x38\x0c\x3a\xe7\x50\xc3\x5b\x77\x86\xf3\x74\xc3\x61"
- "\xac\x13\xb0\x66\xc0\x5a\x01\xc6\xb5\x43\x58\x47\x1c\x6b\x32\x50"
- "\xe0\xe3\xb3\xa0\x1b\xaa\xf0\xf5\xbc\x6b\x13\xf8\xd7\xe2\xf2\xd0"
- "\xc6\x62\x46\x73\x00\xcf\x83\x36\x54\xe7\x5f\x62\x34\x47\x29\x5c"
- "\x5b\x49\x34\xc7\x9d\x42\x9e\xe6\x38\x4a\x34\x47\xc3\x2c\xe1\x7b"
- "\x83\x3b\xb7\xe4\x6b\x8e\xbb\x27\x9d\xbf\x3b\xa8\xef\x2b\x47\x73"
- "\xc0\x73\x97\xd8\xf8\xab\xc3\x3c\x44\x3c\x07\x1f\x38\x2c\xe6\xab"
- "\x4e\xe7\xad\xb1\x5c\x16\x73\x57\xcc\x5b\x31\x7f\x75\x49\x73\x40"
- "\xfb\x4b\x4d\x6d\xf8\xee\xa0\x13\x68\x8e\x95\xd2\x9a\x83\xaf\x37"
- "\xb0\xfe\xc0\x9a\x03\xfa\x18\xa3\x39\xf2\xd6\xd9\x69\x8e\x4e\xad"
- "\x68\x0e\x2f\xbe\xe6\xb8\x9b\xe5\x9e\xe6\xb8\x9b\xd9\x06\x9a\xa3"
- "\xe4\x91\xe6\x68\x6b\xcd\x71\x37\xb9\x45\x73\x50\xec\xfb\x83\x1e"
- "\x36\xcd\xd1\x90\xec\xa8\x39\x1a\x32\x79\x9a\xe3\xa8\xc1\xeb\x0e"
- "\xf3\x5e\x94\xe8\x8d\xdb\x35\x42\xbd\x61\xb9\xec\xa8\x37\x1a\xce"
- "\xbb\xa7\x37\x4c\x5d\xdc\xd3\x1b\x26\x15\x69\x1f\x7e\x57\x7a\xfb"
- "\x10\x19\xf7\x1a\xf6\x70\x1a\xe4\x76\x32\xff\x58\xeb\x1a\xc4\x94"
- "\x25\xae\x41\x6e\x0f\x97\xd6\x20\xb7\x87\x4b\x6b\x90\xa6\x17\x30"
- "\x57\xc4\x7a\x03\xea\x07\xae\xd8\xd4\x8d\xff\xae\x61\x73\x2b\xbc"
- "\xd0\x5e\x7f\x24\xcc\x23\x7a\xe5\xfe\xf3\xc2\xc6\x7d\xe2\xbc\xb0"
- "\xf1\x08\xe6\x5c\x66\x86\x17\x9a\x32\xf3\xda\x5c\x83\x98\x32\xc5"
- "\x35\x48\x13\x9b\xff\x35\x65\x3b\x6a\x10\xb8\x46\x54\x83\x34\xcd"
- "\x65\xaf\xc9\x14\x6a\x10\x52\x07\xf0\x8b\x35\xd2\x1a\xa4\xb9\x17"
- "\xe1\x1b\x4d\x57\x09\xdf\x20\x3e\x76\xd4\x20\x4d\xc7\x5b\xd7\x20"
- "\x04\x53\x4c\x3b\x25\x35\x48\x73\xcb\xfb\x0f\x4e\x83\xdc\x1e\x8e"
- "\x35\x88\x38\xae\xcc\xd7\x85\xb8\x32\x6f\x11\x6a\x90\xe6\x19\xf6"
- "\x1a\xe4\x01\xc4\xda\x3e\xee\xfd\x03\x7e\x26\xf3\x60\xf9\xba\xc3"
- "\x3c\x57\x9e\xee\xc0\xf8\x13\xd3\x1d\xe6\x22\x7b\xfc\x09\x75\x87"
- "\xf9\x94\xb8\xee\x30\x5f\x14\xea\x0e\x5c\xbf\x98\xee\xb0\x74\x13"
- "\xd4\xef\xa0\x3b\x2c\x21\x42\xdd\x41\xca\x71\xba\xc3\x52\xc9\xe6"
- "\x80\xce\xcb\xd7\x1d\x96\x83\xce\x75\x87\xe5\x88\x50\x77\x58\x36"
- "\x93\x98\x6a\xa9\x21\xba\xc3\x52\xc0\xea\x91\x2a\xfe\x71\x4e\x77"
- "\x90\xe3\x8e\xba\xc3\x62\x6e\x45\x77\xf8\x98\x0b\x07\x46\x34\x05"
- "\x0d\x8c\x6a\xca\x9e\x99\xf6\x74\xcd\x4f\x2d\x2d\xdf\x5f\x88\x02"
- "\x0e\x51\x0d\x9c\x62\x2e\xa2\xf0\x1e\x06\x29\x67\x80\x2b\xcc\x25"
- "\xeb\x18\x30\x5f\xd8\xbf\x12\xf3\xbe\x62\x6f\xb0\x29\x6a\xf6\x0f"
- "\x1d\x6a\x1e\x14\x96\x80\x79\x43\x63\xe1\xc0\xa1\xa6\xec\x89\xe9"
- "\x8d\x78\x0d\x43\x3c\xa2\xe6\xd4\x89\x73\xc1\x37\xaa\x69\x2b\x60"
- "\x5e\x15\x3e\x8b\xf0\xc0\xb2\xd8\xcb\x0c\x8e\x31\x97\x78\x17\xb8"
- "\x44\x45\x7d\x15\xc3\x2d\x7c\xa2\x34\x28\x2f\x05\xf9\x77\xab\x43"
- "\xea\x6e\x5e\x5e\x9d\x7e\x0d\xbd\xce\x02\xbc\x62\x6c\x08\x6d\x7d"
- "\xaa\x46\x83\xf7\x2c\xea\x4e\xb8\xc5\x61\x6f\x33\xcb\x2d\xde\xbe"
- "\x87\x06\xe5\xe3\xfc\x73\x19\xe1\x14\xf8\x5b\x0d\x8d\x84\x53\xf4"
- "\x6b\x6a\xd0\x0e\x68\x59\xc3\xd0\xb2\x36\x85\x5b\xc3\xd0\x9c\xc5"
- "\xf1\x09\xcc\x25\xe8\x39\xc0\x05\x4d\x64\xfe\xc8\xea\xa9\x64\x0d"
- "\xc3\xa0\x1a\x44\xed\x7e\x15\xa9\x4a\xa3\x2e\xe1\x5c\x51\x60\x69"
- "\xcd\xfb\x68\xd5\x04\xd4\xcf\x8c\xf9\x03\x70\xc3\xd2\x9a\x1c\x84"
- "\xf7\x63\xcc\x03\x1e\x91\xcb\x72\x88\x49\x73\x25\x38\x04\x8c\xd5"
- "\x98\x47\x90\x31\x9a\x2e\x3a\xa9\x3d\x89\xe4\x73\x43\x5a\xf2\xfb"
- "\xa7\xcc\x1c\xe1\x42\xd0\x07\x41\x03\x87\x5a\xfc\x67\xa6\x91\xfd"
- "\x39\xc3\x0f\x58\xff\x10\x53\x80\xf7\x5d\xfc\xe8\x52\xad\x17\xde"
- "\x6b\x1c\x7f\x77\xd3\xba\x2f\x2c\x41\xb0\xee\xa4\x99\xf5\x59\x33"
- "\xf1\x19\xe6\x84\xb3\xeb\x10\x3d\xc7\x4c\x21\x38\xd7\x9d\x59\x77"
- "\x62\x32\x20\xee\xfb\x9b\x81\x68\x97\x95\xec\x71\x69\x7d\x23\xb6"
- "\x8b\x15\xfc\x42\xaf\xa3\x50\xd1\x3d\x13\xc3\xfb\x36\xe3\x6f\x72"
- "\xae\xf5\xea\x86\x79\x1f\x60\xbf\xeb\xee\x26\xf0\xd1\x45\xe2\x23"
- "\x7a\x9d\x8a\xf9\xd7\xfc\x86\x56\x03\x75\x0f\x68\x6e\x06\xde\xc7"
- "\x7e\xbf\xd3\xb6\xdf\x2f\xb3\x86\xa8\x09\xaf\x21\xaa\x42\xe6\x2c"
- "\xb2\x87\x22\xe0\xc2\x0b\xef\x3d\x02\x6d\xe8\xc3\xac\x1d\x6a\xd6"
- "\x62\x1c\xa9\x77\x5d\xc1\xeb\x9d\xbe\x65\xfc\x63\x61\xfd\x82\xbf"
- "\xe3\x69\xe3\x73\xe5\x7b\xce\x91\xf5\xa3\x76\xbe\x68\x7e\x9f\xf0"
- "\x76\x66\x3d\xcf\x5b\x56\x35\x9e\xf7\x73\x83\xf2\x1a\x7b\x32\x11"
- "\xb8\x53\xa2\x4c\xbf\x50\x5e\x63\x3a\x86\x5f\xd4\x0f\x99\x5f\xe8"
- "\x7a\xe2\x17\xea\x82\x7b\x7e\xa1\x9c\xaf\xff\x6f\x37\xbf\xa8\x1e"
- "\x2e\xbf\x6c\xf2\xda\x4c\xfc\xa2\x5c\xe1\x9e\x5f\x94\x89\xce\xfc"
- "\x82\x73\x64\xb6\xfc\x98\x2d\x37\x86\xc7\x53\x46\x17\x51\x3e\xe3"
- "\x5b\xe6\x9a\xc2\xdf\xfc\xb9\xa6\x5f\x9f\xc0\xfb\x06\x6c\x42\xa7"
- "\xa1\x37\x5e\xa1\xbc\x27\x38\xcd\x89\x51\x5d\x32\x5b\x72\x62\x54"
- "\xe7\x5b\x0c\x47\xa5\x3a\x9f\x63\x38\x2a\xd5\x99\x99\xb7\xb2\xe6"
- "\x02\xa2\xcc\x4f\x86\xa4\xed\x5f\x5c\x4c\xe1\x75\x5a\xfb\x6f\x98"
- "\xa8\xcd\xb7\x81\x73\x52\x3f\xa5\x71\x8e\x6a\xcb\x32\xd0\x36\xc0"
- "\x03\x12\x62\xd0\x4f\xaf\x51\x9d\xbb\xe1\x3d\xe0\x3e\xbf\x51\x4c"
- "\x65\xe2\x32\x03\x62\x0a\xf6\xf5\x36\x7a\xe1\x71\x74\xff\x62\x13"
- "\x65\xc3\x92\x6d\xfd\x26\xd8\x33\xea\xce\xfb\x03\x23\xf0\x5c\xd0"
- "\xa6\x80\x89\xe9\x96\x80\x99\x69\xe6\xa2\xb0\x04\x31\x7c\x31\xeb"
- "\x42\x61\x0c\xc5\xeb\x38\x5f\x4d\xe0\x70\x66\x7d\x83\xe0\xab\x1c"
- "\x38\x3b\xfe\xce\x91\x2f\x8c\x9d\x74\x73\x6c\x97\x57\xf6\x82\xef"
- "\x59\x8c\xc1\xf8\x2d\x8d\xb1\x1d\x42\x8c\xdd\x61\x31\x06\x58\x6b"
- "\xc1\x18\x6f\x5d\x67\x14\xc1\x98\xa1\x05\x63\xcc\xd8\xf9\x86\xb6"
- "\x0f\xc6\x99\x0d\x63\x78\xdc\x24\x18\xbb\x24\x89\xb1\xaf\xab\xc5"
- "\x31\x66\x0e\xe6\x63\x4c\x11\x44\x30\xd6\xe9\xfc\xc9\x59\x80\xb1"
- "\x59\x72\x31\xd6\xa9\x4a\xa0\xb1\x29\x9f\xbb\x0e\x1a\x9b\xea\x3c"
- "\xca\x5e\x63\xdb\x34\xf5\x9d\x80\xf0\x84\x3b\x39\xe1\x89\xf5\x01"
- "\xac\xae\xa6\x3a\xcf\x75\x4b\x57\x53\x9d\xa3\x5c\x9a\x93\x47\x75"
- "\x3e\x7e\x1a\x14\xf6\x69\xe8\x19\x15\x11\x64\x4e\xde\x47\x58\x2f"
- "\x53\xde\x93\x30\x0e\x45\xf5\x32\x7b\xce\x61\x2e\x15\xd5\x65\x6e"
- "\xcb\x5c\x2a\xaa\xcb\xe0\xc6\x6d\xe2\x73\xf2\xfe\x98\x92\xcb\xd3"
- "\x2e\xb9\x22\xda\x25\xd7\xee\x3d\x5d\xae\x88\x6e\xc9\x45\xf8\x5a"
- "\xbe\x6e\x39\x1d\x41\x74\xcb\xe9\x08\xac\x5b\x72\x19\xbe\x77\x3a"
- "\xc2\xa6\x5b\x72\xe1\x3c\xd1\x2d\xa7\x23\xae\xc0\x0f\x74\x0b\xa5"
- "\xaa\x3c\x1d\x21\xa2\x5b\x28\xd5\x79\x66\x4e\x1e\xd5\xb9\x58\x7a"
- "\x4e\x5e\x2e\x4f\x1f\xe7\xf2\xf4\x71\x2e\xab\x8f\x73\x19\x7d\x4c"
- "\xee\x39\x88\x69\x1b\xbe\x27\xae\x93\x7f\xcf\x16\xfd\x40\x75\x99"
- "\xcc\xe8\x07\xaa\xf3\x09\xec\x07\x81\x3e\xc6\xd7\x24\x89\xe8\x63"
- "\xaa\xcb\x5a\xf6\x9a\x62\x9b\x3e\x6e\x22\xe5\x99\x3a\x20\xd6\xe4"
- "\x4b\xea\x63\xaa\xab\x9e\xc4\x9e\xae\x5d\x48\xec\x21\x3e\x75\xd0"
- "\xc7\x54\x17\xbe\xfe\x11\x9f\x93\xc7\x62\x88\x69\x67\x82\x84\x3e"
- "\xa6\xba\x86\x38\xe8\x63\xca\x7b\xbc\xe8\x9c\x3c\xca\xc7\x8b\xc3"
- "\xd1\x63\xef\x09\xe6\xe4\x51\x5d\x97\xf2\x75\x31\xc6\xd8\x03\x86"
- "\xad\x4a\xc1\x9c\x3c\xea\xb1\x17\xc4\x35\x71\x2e\x4f\x13\xe7\x32"
- "\x9a\xf8\x74\x04\x3b\x27\x8f\x7a\x6c\x05\xae\xdb\x51\x13\xe7\xb6"
- "\x94\xb7\x69\x62\x7c\x0d\xc1\x9c\x88\x26\xa6\x1e\x3b\x6e\x8f\x39"
- "\x81\x26\xa6\x1e\xbb\x60\xd3\xc4\x4d\xaf\xf0\x34\x31\xf5\xd8\x5d"
- "\x81\x26\x66\xea\x17\xd1\xc4\x94\x4f\x7f\x41\xfd\xf6\x9a\x98\xf2"
- "\x19\x65\xd3\xc4\xb8\x7e\x1b\x6e\x5b\x34\x31\xe5\xc3\xc6\x50\xe5"
- "\x2d\xd9\x9a\x98\xf2\x61\xf2\x3a\x45\xef\x92\x77\x5d\x02\x3d\x4c"
- "\xf9\x9c\x12\xe8\x61\xca\x27\x8f\xd1\xbd\x94\x4f\x3d\x33\x1f\x8f"
- "\xf2\x39\x40\x8e\x2b\x8d\xfc\xe3\x2d\x7a\x98\x3d\x8e\xe7\xe3\x31"
- "\xf3\xf0\x36\x75\x53\xca\xd3\xc1\x8f\x77\x40\x1d\x1c\xe8\x44\x07"
- "\x07\x3e\x5c\x3a\x98\xea\xfe\xa9\x5b\x3a\x98\xea\x7e\xa8\x63\xf0"
- "\xfa\x87\x4c\x6f\x6d\xea\x16\x48\x38\x97\x7a\xb2\x7b\xbc\x5e\x3d"
- "\xa9\x63\xf8\xe5\x61\xd3\x5b\xdd\xcd\xc4\x2f\x7e\x97\xdd\xf3\x8b"
- "\x9f\xe4\xfe\x87\xad\xeb\xad\x5e\x87\x39\xbd\xd5\xeb\xb0\xb4\xde"
- "\xea\x71\xc4\xb9\xde\x7a\x1c\x71\x7a\x2b\x60\x2e\xe1\x3c\x01\x63"
- "\x09\xe7\x09\xf0\x96\xaf\xb7\xfc\xd7\x3c\xd2\x5b\x6d\xa9\xb7\xd4"
- "\xd9\x04\x63\xfe\x13\xdc\xd3\x5b\xfe\xe3\x85\x7a\xab\xb7\xe3\x7a"
- "\x28\xca\xbf\xc8\x75\xbd\xe5\x7f\xc6\x3d\xbd\xe5\x5f\xe9\x9a\xde"
- "\x0a\x18\x26\xae\xb7\x7a\x1c\x95\xd6\x5b\xe4\x9c\x23\x4f\xee\x79"
- "\x86\xe3\xc9\x3d\xf3\x3b\xbe\xde\xea\x39\x5a\x9c\x13\xf7\x9c\x40"
- "\xf4\x56\xc0\xd0\xb6\xd7\x5b\x01\x43\xc5\xf5\x56\xcf\x63\x84\x9b"
- "\x06\x0c\x77\xd4\x5b\x70\x8d\xa8\xde\xea\x79\x8b\xbd\x66\xa8\x50"
- "\x6f\x91\x3a\x20\xd6\x74\x93\xd6\x5b\x8f\xef\x25\xb1\xe7\xf1\x55"
- "\x24\xf6\x10\x9f\x3a\xea\xad\xc7\xa7\xb6\xae\xb7\x08\x86\x98\x76"
- "\x4a\xea\xad\xc7\x77\x38\xea\xad\x1e\x87\xc5\xf5\x56\xaf\xa5\x1c"
- "\x8e\x7a\xf9\x09\xf5\xd6\xe3\x17\x1f\x0c\xbd\x25\x89\xad\xd1\x42"
- "\xbd\x15\x78\x50\xbe\xde\x0a\xbc\x2c\x4f\x6f\x61\xcc\x89\xe9\xad"
- "\x5e\xc3\xec\x31\x27\xd4\x5b\xbd\x26\x8b\xeb\xad\x5e\xf3\x85\x7a"
- "\x0b\xd7\x2f\xa6\xb7\x7a\x65\x09\xea\x77\xd0\x5b\xbd\x8a\x84\x7a"
- "\x8b\x94\xe3\xf4\x56\x6f\xb2\x06\x8a\xea\x31\x57\xbe\xde\xea\x3d"
- "\x4c\x5a\x6f\xf5\x16\xae\x7f\xa2\x7a\x93\xf5\x4f\x54\x6f\xb2\xfe"
- "\x89\xea\x4d\xd6\x3f\x51\x3d\xa2\xf8\xc7\x39\xbd\x45\x8e\x73\x7a"
- "\xab\x77\xa2\x3c\xbd\xe5\xdb\x01\xf5\x96\xda\x89\xde\x52\x3f\x64"
- "\x7a\xab\x4f\xb0\x7b\x7a\xab\x4f\xd0\x23\x5e\x7f\x3f\x78\x7d\xef"
- "\x74\xc2\xb9\xfa\x1e\x73\x8f\xd7\xf7\x3d\xea\x3e\xaf\x0f\xce\xe4"
- "\x78\x7d\x70\xa6\x34\xaf\xef\x97\xe5\x9c\xd7\x0f\xa8\xe2\x78\x7d"
- "\x7f\x36\x97\xd9\xbf\x2f\x19\x5b\x35\x17\xe4\xf3\x7a\xcd\xf4\x47"
- "\xbc\xbe\x2d\x79\x7d\x9f\x78\x82\x31\x4d\x7f\xf7\x78\xbd\x46\x23"
- "\xe4\xf5\x4f\x8e\x72\xe4\xf5\x9a\x0d\xae\xf3\x7a\xcd\x5e\xf7\x78"
- "\xbd\x46\x72\xde\xa1\x90\xd7\xf7\xef\x22\xce\xeb\xfb\x65\x4b\xf3"
- "\x7a\x72\xce\x91\x8f\x0d\xd8\xcb\xf1\xb1\x01\x2b\x3a\x3e\xaf\x1f"
- "\x10\x28\xce\xbd\x06\xf4\x27\xbc\xbe\xbf\xaa\xed\x79\x7d\x7f\x95"
- "\x38\xaf\x1f\x40\xd6\x7f\x50\xfd\x7d\x1c\x79\x3d\x5c\x23\xca\xeb"
- "\x07\x9c\x62\xaf\x51\x09\x79\x3d\xa9\x03\x62\xcd\x65\x69\x5e\xff"
- "\xc4\x5a\x12\x7b\x9e\x98\x4a\x62\x0f\xf1\xa9\x23\xaf\x7f\x22\xa4"
- "\x75\x5e\x4f\x30\xc4\xb4\x53\x92\xd7\x3f\xb1\xd4\x91\xd7\xf7\xcb"
- "\x14\xe7\xf5\xc1\x13\x38\x1c\x05\x5d\x15\xf2\xfa\x27\x8e\x3c\x18"
- "\xbc\x5e\x12\x5b\x81\x42\x5e\x1f\xb4\x51\x3e\xaf\x0f\x3a\x26\x8f"
- "\xd7\x63\xcc\x89\xf1\xfa\xe0\x2e\xf6\x98\x13\xf2\xfa\xe0\x60\x71"
- "\x5e\x1f\x3c\x4a\xc8\xeb\x71\xfd\x62\xbc\x3e\x38\x4e\x50\xbf\x03"
- "\xaf\x0f\xde\x20\xe4\xf5\xa4\x1c\xc7\xeb\x9f\xd4\x92\x18\xda\x4f"
- "\x2f\x9f\xd7\x3f\xd9\x45\x9a\xd7\x3f\xe9\x27\xe4\xf5\xc1\x35\x84"
- "\xbf\x3f\x39\x92\xf0\xfa\x60\x13\x39\xde\x4f\xc7\x3f\xce\xf1\x7a"
- "\x72\x9c\xe3\xf5\x4f\x4e\x92\xc7\xeb\x3b\x77\x40\x5e\xaf\x72\xc2"
- "\xeb\x55\x0f\x19\xaf\x1f\x68\x71\x8f\xd7\x0f\x34\xbb\xcf\x1f\x87"
- "\x54\x72\xfc\x71\x48\xa5\x34\x7f\xd4\x9e\x71\xce\x1f\x07\x07\x72"
- "\xfc\xf1\xe9\x55\x24\x86\x3f\x3d\x9b\xc4\xf0\xa7\xfb\xca\xe7\x8f"
- "\x4f\xe5\x3c\xe2\x8f\x6d\xc9\x1f\x9f\x8c\x22\xfc\xf1\xa9\xb9\xee"
- "\xf1\xc7\xa7\xa2\x84\xfc\x71\xe8\x1a\x47\xfe\xf8\xd4\x49\xd7\xf9"
- "\xe3\x53\x57\xdd\xe3\x8f\x4f\xd5\xba\xc6\x1f\x9f\x9e\x20\xce\x1f"
- "\xb5\x67\xa5\xf9\x23\x39\xe7\x38\xee\x0f\xba\xca\x8d\xfb\x83\x3e"
- "\xed\xf8\xfc\x71\x50\xa4\xf8\x18\x3f\x68\x2e\xe1\x8f\x4f\x8f\x6f"
- "\x7b\xfe\xf8\xf4\x78\x71\xfe\x38\xe8\x1c\x19\x6b\x9f\x9e\xe4\xc8"
- "\x1f\xe1\x1a\x51\xfe\x38\x98\x1d\xff\x9f\x1e\x2f\xe4\x8f\xa4\x0e"
- "\x88\x35\xc1\xd2\xfc\x71\x30\x59\x17\x4b\x0d\xce\x22\xb1\x87\xf8"
- "\xd4\x91\x3f\x0e\x8e\x6b\x9d\x3f\x12\x0c\x31\xed\x94\xe4\x8f\x83"
- "\x0f\x3a\xf2\x47\x6d\xa5\x38\x7f\x1c\xb2\x91\xc3\xd1\x90\x10\x21"
- "\x7f\x1c\xdc\xf8\x60\xf0\x47\x49\x6c\x45\x0a\xf9\xe3\xcf\x4e\xc9"
- "\xe7\x8f\x3f\xb3\xc8\xe3\x8f\x18\x73\x62\xfc\x71\xc8\x04\x7b\xcc"
- "\x09\xf9\xe3\x90\xf9\xe2\xfc\x71\xc8\x1a\x21\x7f\xc4\xf5\x8b\xf1"
- "\xc7\x21\x7b\x05\xf5\x3b\xf0\xc7\x21\x27\x85\xfc\x91\x94\xe3\xf8"
- "\xe3\xd0\x58\x12\x43\xb5\xab\xe4\xf3\xc7\xa1\x13\xa4\xf9\xe3\xd0"
- "\xa9\x42\xfe\x38\x34\x88\xf0\xc4\xa1\xc9\x84\x3f\x0e\xd5\x91\xe3"
- "\xda\x24\xfe\x71\x8e\x3f\x92\xe3\x1c\x7f\x1c\xba\xb9\x35\xfe\xe8"
- "\x9c\x5b\xe8\x46\x73\xdc\x42\x37\x9a\xcf\x2d\x4e\x09\xb8\xc5\x30"
- "\xe7\xfb\x5f\x51\x23\xd2\x39\x6e\xf1\xec\x55\xd2\xbf\x9f\x2d\x23"
- "\xfd\xfb\xd9\x2d\x0c\xb7\x98\x0c\x1c\x00\xb8\x45\xd1\xb5\x03\x84"
- "\x5b\x5c\x33\x51\x6f\xdf\x60\xb9\x45\x1d\x52\x6d\x5e\xcc\x72\x8b"
- "\x57\x31\xb7\x78\xd6\x1b\x73\x0b\x9f\x3c\xe0\xb7\x35\x2c\xdf\x4d"
- "\x00\xbe\x5b\x03\xff\x87\xbe\xf3\x39\xd4\x51\x0e\x9c\x34\x13\x5f"
- "\x8f\xbf\x03\x02\x75\x31\x6b\x6b\x99\x75\xb7\x06\x6f\xcd\x3c\xb2"
- "\x66\x17\x7f\xc7\x45\xea\x1b\x2e\xb6\xef\xb7\x24\xd7\xd0\x56\xfc"
- "\xbd\x96\xf0\x68\xde\x77\x5c\xf0\xf7\x59\x8d\xb5\x08\x7f\xcb\x25"
- "\x6f\x19\xf2\xdf\x89\xb9\x46\x2d\x52\x77\x5f\xeb\xd5\x1d\x7f\xc7"
- "\xa5\x7b\x3d\xe1\xb4\x45\xd6\x12\xc2\x69\x97\x07\x76\x05\x9e\x34"
- "\x68\xd7\x6d\x8e\x63\xbc\x83\xf9\xc5\x72\xad\xa6\x7e\xb9\xb6\xdf"
- "\x9d\x3b\xc0\x69\x8d\xf6\xdf\xf9\xf8\x74\x0f\xfe\x96\x04\xfe\x9e"
- "\xa6\x99\xe5\xb4\xf4\xef\xb4\x68\x77\x0c\xf0\x9e\x3a\xe4\xf5\x33"
- "\xfc\x8d\x8f\x32\xa4\x1e\xd8\x07\xe2\xfe\x1d\x6d\x1f\xfe\xfe\x9c"
- "\x38\x2f\x6a\xbd\xa3\x45\xa5\x51\xdf\x32\xeb\x6c\xcd\xb6\x75\xb6"
- "\xb7\x91\xce\xb8\x5c\x4b\xbd\xbb\x8c\xc7\x69\x03\x30\xa7\x0d\x73"
- "\xc2\x69\x9f\x39\xe3\x1e\xa7\x7d\xa6\x52\xc8\x37\x74\xd7\x1d\xf9"
- "\xc6\xb3\x23\x5c\xe7\x1b\xcf\xce\x70\x8f\x6f\x3c\x1b\xe9\x1a\xdf"
- "\x78\xf6\x88\x3d\xdf\xd8\xcb\xf0\x8d\x61\x43\x31\x36\xc5\xf9\x06"
- "\x39\xe7\x38\x4e\x8c\x98\xc1\x8d\x13\x23\x82\x3b\x3e\xdf\x18\x5e"
- "\x22\x3e\x26\x0c\x3f\x43\xf8\xc6\xb3\x87\xdb\x9e\x6f\x3c\x7b\x58"
- "\x9c\x6f\x8c\x18\x4b\x62\xf3\xb3\x47\x1d\xf9\x06\x5c\x23\xca\x37"
- "\x46\xac\x62\xaf\x39\x2c\xe4\x1b\xa4\x0e\x88\x3f\x39\xd2\x7c\xe3"
- "\xb9\x61\x24\x1e\x3d\xe7\x45\xe2\x11\xf1\xa9\x23\xdf\x18\x71\xbe"
- "\x75\xbe\x41\x30\xc4\xb4\x53\x92\x6f\x3c\xd7\xdf\x91\x6f\x0c\x1b"
- "\x24\xce\x37\x42\x1b\x39\x1c\x85\xee\x10\xf2\x8d\xe7\xe2\x1e\x0c"
- "\xbe\x21\x89\xad\x12\x21\xdf\x08\xd5\xcb\xe7\x1b\xa1\x8b\xe4\xf1"
- "\x0d\x8c\x39\x31\xbe\x11\x7a\xc4\x1e\x73\x42\xbe\x11\x7a\x4e\x9c"
- "\x6f\x84\x5e\x17\xf2\x0d\x5c\xbf\x18\xdf\xd0\xf5\x12\xd4\xef\xc0"
- "\x37\x74\x23\x84\x7c\x83\x94\xe3\xf8\x86\xae\x8a\xd5\x6c\xe7\xe4"
- "\xf3\x0d\xdd\x11\x69\xbe\xa1\x3b\x2e\xe4\x1b\xba\x6c\xc2\x2b\x74"
- "\x75\x84\x6f\xe8\xf6\xb0\x3c\xe4\x2c\xff\x38\xc7\x37\xc8\x71\x8e"
- "\x6f\xe8\x1e\xad\x7f\x7d\xa0\xf2\x55\x61\xee\xad\x7f\xa5\xc2\x1e"
- "\xad\x7f\xbd\x2f\xef\xa1\xf5\xec\xfa\xd7\x91\x6e\xae\x7f\x1d\xf9"
- "\x68\xfd\xeb\x7d\xf1\x4b\x18\xbb\xfe\x75\x94\x9b\xeb\x5f\x47\x3d"
- "\x5a\xff\x7a\x5f\xfc\x32\x92\x5d\xff\xfa\xbc\x9b\xeb\x5f\x9f\xf7"
- "\x60\xfd\xeb\xb8\x68\x4e\x1b\x8f\x8b\x96\xd6\xc6\xa3\x5b\x59\xff"
- "\x3a\x66\x1f\xa7\x8d\x7f\xd9\x8d\x70\xd1\x17\x6f\x11\x2e\xfa\x22"
- "\x93\x9b\x4a\xc1\xda\xf8\x0f\xf3\x33\x3f\x5e\x76\x98\xc2\xfb\xc2"
- "\xe1\x6f\x63\x6e\x59\x8d\x94\x66\xac\x8d\xc1\x07\x5b\x9a\xb0\x36"
- "\x3e\x81\x12\x16\x60\x6d\xfc\x62\x48\x79\x0d\xef\xfb\x2a\xd4\xe8"
- "\x1d\xdc\x7e\xce\x27\x10\x3e\xf7\xf9\xed\xc3\x54\x66\x93\x5d\x4e"
- "\x7e\x99\x89\xd2\x2c\x16\xe6\xe4\x2d\x39\x33\xd3\x70\x4e\xbe\x91"
- "\xfd\x56\x0a\x93\x97\x1f\xec\x3c\x27\x9f\xdf\x04\x63\xa7\x48\x5e"
- "\x1e\xe7\xe4\x61\x8c\x7c\xc8\x72\xf2\xbf\x60\xd7\xc6\xbe\x70\xd7"
- "\xbd\x9c\xfc\x0b\xf5\x42\x8d\x3c\xde\xcf\x51\x23\xbf\x38\xc3\x75"
- "\x8d\xfc\xe2\x1a\xf7\x34\xf2\x8b\xc9\xae\x69\xe4\x17\x2f\x88\x6b"
- "\xe4\xd1\x93\x52\x24\x35\x32\x39\xe7\xa8\x6d\xc6\xac\xe1\xb4\xcd"
- "\x98\x09\x1d\x5f\x23\xff\xb2\x4e\x5c\xc7\xfc\xf2\x2e\xd1\xc8\x2f"
- "\x56\xb7\xbd\x46\x7e\xb1\x5a\x5c\x23\x8f\x61\xdf\x7f\xbf\x68\x70"
- "\xd4\xc8\x70\x8d\xa8\x46\x1e\x93\xcf\x5e\x53\x2d\xd4\xc8\xa4\x0e"
- "\x88\x43\x47\xa4\x35\xf2\xd8\xe9\x24\x2e\x8d\x0d\x26\x71\x89\xf8"
- "\xd4\x51\x23\x8f\xb1\xb4\xae\x91\x09\x86\x98\x76\x4a\x6a\xe4\xb1"
- "\x63\x1d\x35\xf2\x68\x89\xb5\xb1\xe3\xfa\x72\x38\xfa\xd5\x31\xa1"
- "\x46\x1e\xbb\xe5\xc1\xd0\xc8\x92\xd8\xaa\x13\x6a\xe4\x5f\xcd\x96"
- "\xaf\x91\x7f\x95\x25\x4f\x23\x63\xcc\x89\x69\xe4\x5f\x5d\xb0\xc7"
- "\x9c\x50\x23\xff\xaa\x51\x5c\x23\x8f\xf3\x13\x6a\x64\x5c\xbf\x98"
- "\x46\x1e\x37\x4a\x50\xbf\x83\x46\x1e\x37\x43\xa8\x91\x49\x39\x4e"
- "\x23\x8f\x33\x93\x18\xfa\xbc\x1b\x6b\x63\xc7\x5d\x90\xd6\xc8\xe3"
- "\x2e\x0b\x35\xf2\xb8\xc3\x44\x0b\x8f\x57\x13\x8d\x3c\xae\x94\x1c"
- "\x7f\xde\xc8\x3f\xce\x69\xe4\xe7\xed\xd6\xc6\x8e\xd7\x3c\x5a\x1b"
- "\xfb\x20\x69\xe4\x09\x6e\xe6\xbf\x27\x54\x76\x0c\xce\xff\xb0\x69"
- "\xb1\xf1\xc3\x09\xe7\xfa\x75\x9c\x7b\x9c\xff\xd7\xb1\x1d\xc3\x2f"
- "\x0f\x9b\x16\x9b\xc8\xae\x59\x9e\xec\xe5\x9e\x5f\xf0\x52\x1f\x77"
- "\xb5\xd8\x34\x23\xa7\xc5\xa6\x19\xa5\xb5\xd8\xe4\x73\xce\xb5\xd8"
- "\x4b\x3a\x4e\x8b\x45\xec\x20\x9c\x27\x62\x0d\xe1\x3c\x11\xa3\xe4"
- "\x6b\xb1\xf0\x4f\x85\x5a\x6c\x4a\xf0\x23\x2d\x76\xbf\xb4\xd8\xaf"
- "\x0f\x10\xfc\x85\xaf\x75\x4f\x8b\x85\xa7\x09\xb5\xd8\xf4\x7c\x47"
- "\x2d\x16\x7e\xd9\x75\x2d\x16\xe1\xde\xfe\xbf\x54\x84\xca\x35\x2d"
- "\x16\x11\x27\xae\xc5\x26\x57\x49\x6b\x31\x72\xce\x91\x43\xbf\xd4"
- "\x85\xe3\xd0\x53\xcf\x75\x7c\x2d\x36\x35\x49\x9c\x2f\x4f\x5d\x4b"
- "\xb4\x58\x44\x6c\xdb\x6b\xb1\x88\x58\x71\x2d\x36\xf5\x2e\xe1\xad"
- "\x11\xf1\x8e\x5a\x0c\xae\x11\xd5\x62\x2f\x85\xb0\xd7\xc4\x0a\xb5"
- "\x18\xa9\x03\xe2\xd0\x58\x69\x2d\xf6\xd2\x45\x12\x97\x5e\x3a\x48"
- "\xe2\x12\xf1\xa9\xa3\x16\x7b\x69\x63\xeb\x5a\x8c\x60\x88\x69\xa7"
- "\xa4\x16\x7b\xe9\x8c\xa3\x16\x9b\x7c\x56\x5c\x8b\x4d\xe3\xad\xd3"
- "\x98\x36\x41\xa8\xc5\x7e\xd3\xeb\xc1\xd0\x62\x92\xd8\x4a\x12\x6a"
- "\xb1\xdf\x5c\x95\xaf\xc5\xa6\xf5\x95\xa7\xc5\x30\xe6\xc4\xb4\xd8"
- "\xb4\x38\x7b\xcc\x09\xb5\xd8\xb4\x0d\xe2\x5a\x6c\x5a\xbe\x50\x8b"
- "\xe1\xfa\xc5\xb4\xd8\xb4\x53\x82\xfa\x1d\xb4\xd8\xb4\xcb\x42\x2d"
- "\x46\xca\x71\x5a\x6c\x7a\x3a\x89\xa1\x93\xd7\xc8\xd7\x62\xd3\xe3"
- "\xa4\xb5\xd8\xf4\xa5\x42\x2d\x36\x7d\x0c\xd1\x5c\xd3\xf3\x88\x16"
- "\x9b\x1e\x49\x8e\x4f\x4e\xe6\x1f\xe7\xb4\x18\x39\xce\x69\xb1\xe9"
- "\xfb\x1e\xad\x9b\x7d\x90\xb4\xd8\x6f\x67\xbb\xa7\xc5\x7e\x3b\xeb"
- "\x11\xe7\xbf\x1f\x9c\x7f\x7a\x31\xe1\x5c\x91\x77\xdd\xe3\xfc\x91"
- "\xf5\xee\x73\xfe\xa8\x1a\x8e\xf3\x47\xd5\x48\x73\xfe\x19\xa7\x9c"
- "\x73\xfe\x57\x07\x71\x9c\x7f\xd6\x16\x32\xb6\xce\x5a\x4a\xc6\xd6"
- "\x59\xc3\xe4\x73\xfe\x57\xf6\x0a\x39\xff\xcc\x5e\x8f\x38\xff\xfd"
- "\xe2\xfc\xbf\x2d\x24\xf8\x7b\x65\x85\x7b\x9c\xff\x95\x44\x21\xe7"
- "\x9f\x9b\xe5\xc8\xf9\x5f\x71\xf8\xfe\x87\x34\xe7\x7f\xc5\xe2\x1e"
- "\xe7\x7f\xc5\xec\x1a\xe7\x9f\x35\x5b\x9c\xf3\xcf\x28\x95\xe6\xfc"
- "\xe4\x9c\x23\x57\x9b\x6d\xe1\xb8\xda\xec\x53\x1d\x9f\xf3\xcf\x8e"
- "\x17\xe7\x65\xb3\x57\x10\xce\x3f\x6b\x56\xdb\x73\xfe\x59\xb3\xc4"
- "\x39\xff\xec\xab\x84\x1f\xcd\x8a\x72\xe4\xfc\x70\x8d\x28\xe7\x7f"
- "\xb5\x2f\x7b\xcd\x2c\x21\xe7\x27\x75\x40\x1c\xd2\x4b\x73\xfe\x57"
- "\xcf\x91\xb8\xf4\x2a\xf9\x56\x18\xeb\x53\x47\xce\xff\xea\x9a\xd6"
- "\x39\x3f\xc1\x10\xd3\x4e\x49\xce\xff\xea\x49\x47\xce\x3f\xa3\x44"
- "\x9c\xf3\x47\xe5\x73\x38\x8a\x1a\x25\xe4\xfc\x73\xba\x3d\x18\x9c"
- "\x5f\x12\x5b\xf1\x42\xce\x3f\xe7\x82\x7c\xce\x1f\xe5\x27\x8f\xf3"
- "\x63\xcc\x89\x71\xfe\xa8\xd9\xf6\x98\x13\x72\xfe\xa8\x55\xe2\x9c"
- "\x3f\x2a\x4b\xc8\xf9\x71\xfd\x62\x9c\x3f\xea\x98\xa0\x7e\x07\xce"
- "\x1f\x75\x5e\xc8\xf9\x49\x39\x8e\xf3\xcf\x4d\x26\x31\x74\xc6\x52"
- "\xf9\x9c\x7f\xee\x6c\x69\xce\x3f\x77\xbe\x90\xf3\xcf\x65\xd7\xce"
- "\xce\xcd\x24\x9c\x7f\xee\x24\x72\x7c\x46\x02\xff\x38\xc7\xf9\xc9"
- "\x71\x8e\xf3\xcf\x2d\x78\xb4\xa6\xf6\x41\xe2\xfc\xaf\x4d\x75\x8f"
- "\xf3\xbf\x16\xe1\x3e\xb7\x5c\xc8\x5b\xf7\xb2\xd0\xc9\xba\x97\xe8"
- "\x60\xe7\xdc\x32\x96\xb7\xee\x25\x86\x5d\xf7\x12\xc3\xae\x7b\x89"
- "\xd9\x22\x9f\x5b\xc6\x78\x0b\xb9\x65\xf4\x8a\x47\xdc\xf2\x7e\x71"
- "\xcb\xb9\x87\x08\xb7\x9c\x7f\xc6\x3d\x6e\x39\xdf\x6e\xfd\xcb\x42"
- "\x91\xf5\x2f\x31\x32\xd6\xbf\xc4\xb8\xb9\xfe\x25\xc6\xc5\xf5\x2f"
- "\x31\x12\xeb\x5f\xa2\xb5\xd2\xdc\x92\x9c\x73\xe4\x04\xb1\xbc\xf5"
- "\x2f\xb1\x0f\xc0\xfa\x97\xdf\x49\xac\x51\xf8\x1d\xbb\xfe\x25\xe6"
- "\x3e\xac\x7f\x89\x91\x58\xff\x12\xcb\xae\x7f\x89\x11\x59\xff\x12"
- "\x23\xb1\xfe\x25\x96\x5d\xff\x12\x63\xb7\xfe\x25\x86\x5d\xff\x12"
- "\xeb\x64\xfd\x4b\x1c\xbb\xfe\x25\x8e\x5d\xff\x42\x7c\xea\xc8\x2d"
- "\x63\x5d\x58\xff\x12\xc3\xae\x7f\x89\x71\xb2\xfe\x25\x4e\x64\xfd"
- "\x4b\x74\x90\x38\xb7\x5c\xc0\x5b\xff\xb2\xc0\x6e\xfd\x4b\xdc\x03"
- "\xb2\xfe\x45\x12\x5b\x76\xeb\x5f\x16\xb8\xb1\xfe\x65\x81\xcc\xf5"
- "\x2f\x31\x12\xeb\x5f\x16\x1c\xb1\xc7\x9c\x90\x5b\x2e\x90\x58\xff"
- "\xb2\xc0\x6e\xfd\x4b\x8c\xc4\xfa\x97\x85\xbd\x04\xf5\x3b\x70\xcb"
- "\x85\x76\xeb\x5f\x62\xec\xd6\xbf\x2c\x64\xd7\xbf\xbc\x56\x26\x9f"
- "\x5b\x2e\x74\xb2\xfe\x65\xa1\xdd\xfa\x97\x85\xec\xfa\x97\x85\xec"
- "\xfa\x97\x85\xec\xfa\x97\xd7\x4a\xf9\xc7\x39\x6e\x49\x8e\x73\xdc"
- "\x72\x61\xab\xeb\x5f\x9c\xf3\x8e\xe5\xa5\x1c\xef\x58\x5e\x2a\xcd"
- "\x3b\xe2\xf3\x9d\xf3\x8e\xa5\xfe\x1c\xef\x58\xb2\x82\xf4\xef\x25"
- "\x33\x48\xff\x5e\xc2\xbc\x87\x59\x53\x06\xbc\x63\xc0\xfc\xcc\xfd"
- "\x37\x0e\x30\xbc\xe3\xe3\xc5\x26\x0a\x38\xa2\xd2\x8a\x79\x07\x70"
- "\xc1\xcd\x2b\x31\xef\xa8\x61\xd7\xdb\x2e\xce\x2a\x4b\xe2\xf3\x8e"
- "\xf8\x5b\xcc\xda\xdb\x96\xef\x3d\xd7\x20\x7c\x5e\x6c\x2d\xee\xb1"
- "\xc5\xec\x5a\x5c\xa8\x9b\xbf\x06\x97\x59\x97\x7b\x03\x78\xc9\x3c"
- "\xf0\x07\x8f\x97\x3c\x5a\x8b\xeb\x6c\x2d\xee\x62\x37\xf3\xdf\x8b"
- "\x67\x09\xb9\x48\xe2\x2a\x47\x2e\xb2\xf8\xb8\xeb\x5c\x64\xf1\x65"
- "\xf7\xb8\xc8\xe2\x1a\xd7\xb8\xc8\x92\xb1\xe2\x5c\x24\xbe\x00\xe3"
- "\x56\x9c\x8b\x90\x73\x8e\x63\x48\xc2\x65\x6e\x0c\x49\x38\xd8\xf1"
- "\xb9\x48\xc2\x34\xf1\xf1\x22\x61\x36\xe1\x22\x4b\xc6\xb4\x3d\x17"
- "\x59\x32\x46\x9c\x8b\x24\x9c\x21\x71\x7b\xc9\x78\x47\x2e\x02\xd7"
- "\x88\x72\x91\xa5\xde\xec\x35\x63\x84\x5c\x84\xd4\x01\xb1\xa9\xbf"
- "\x34\x17\x59\x7a\x8c\xc4\xaa\xa5\x5b\x48\xac\x22\x3e\x75\xe4\x22"
- "\x4b\xe7\xb7\xce\x45\x08\x86\x98\x76\x4a\x72\x91\xa5\x45\x8e\x5c"
- "\x24\x3e\x4f\x9c\x8b\x2c\xdf\xc0\xe1\x68\x79\xb0\x90\x8b\x2c\xbd"
- "\xfb\x60\x70\x11\x49\x6c\x4d\x13\x72\x91\x65\x27\xe5\x73\x91\x65"
- "\x8d\xf2\xb8\x08\xc6\x9c\x18\x17\x59\x3e\xd6\x1e\x73\x42\x2e\xb2"
- "\x7c\xae\x38\x17\x59\xbe\x4a\xc8\x45\x70\xfd\x62\x5c\x64\xf9\xfb"
- "\x82\xfa\x1d\xb8\xc8\xf2\xe3\x42\x2e\x42\xca\x71\x5c\x24\x31\x9a"
- "\x1d\x03\xc7\xca\xe7\x22\x89\x63\xa5\xb9\x48\xe2\x64\x21\x17\x49"
- "\xd4\x10\xce\x91\x98\x44\xb8\x48\xe2\x70\x72\x3c\x7e\x0c\xff\x38"
- "\xc7\x45\xc8\x71\x8e\x8b\x24\xa6\xcb\xc8\x73\xad\x97\xb3\x16\xb7"
- "\xe8\x9e\x30\xcf\x65\xcb\x71\x99\x07\x85\x25\xb6\xe4\xb9\xf8\xef"
- "\x49\x45\xf2\x5c\x78\x4c\xe7\xf2\x5c\x17\x98\x58\xc5\xe5\xb9\x0c"
- "\x4c\x9e\x0b\xe7\xb8\xf0\xbb\x52\x5b\x8e\xcb\xfa\xba\xe3\x3a\xdc"
- "\x22\xab\xfc\x1c\x17\xf7\xbe\xf4\x2f\x1a\x92\xe3\xaa\x6a\xc9\x71"
- "\xe1\xf1\xdc\xd2\xe0\x98\xe3\xc2\xe3\x38\x97\xe3\xfa\xb6\x8d\x73"
- "\x5c\x2b\x47\xb8\x37\xae\xaf\x1c\xde\x31\xde\x6b\x3f\x6c\xeb\x70"
- "\x13\xf3\x48\xee\xe7\xf5\x32\xf7\xde\x6b\xbf\x5e\xda\x31\xfc\xf2"
- "\xb0\xcd\xfd\x5e\x99\x4c\xfc\xb2\x6a\xbe\x7b\x7e\x59\x15\xdd\x31"
- "\xfc\xf2\xb0\xcd\x03\x49\xf2\x27\x7e\x59\x6d\x71\xcf\x2f\xab\x3d"
- "\xd8\xff\xf2\x4d\x35\xa7\x99\xdf\x54\xf3\x35\x73\xc9\x18\xbe\x66"
- "\x7e\xa3\x95\xfd\x2f\xd3\x22\x39\xcd\x9c\x72\x84\xf0\xd0\x94\x7c"
- "\xc2\x43\x53\x98\xf7\x53\x6b\x5e\x40\x8c\x56\x36\x63\xdd\xbc\xc0"
- "\x44\xed\xbf\x56\x4c\x99\xd7\x11\xbd\x5c\x61\x2e\x45\x65\x46\x13"
- "\x7a\x7b\x25\x52\x6e\xbc\x81\x94\x7f\xbc\x6d\xa2\x7c\xe3\x91\x0a"
- "\xc6\x24\xb0\x59\x29\xf0\x98\x7c\x94\x90\x82\xb5\xf4\x9a\x73\x15"
- "\x09\x46\x9e\x96\x4e\xd6\x73\x3a\x1a\xca\x25\x98\xd0\x17\x0b\x8a"
- "\x29\xac\x97\x9b\x73\x66\xa6\x35\x0f\x0e\x4b\x60\xf6\xb1\xe2\xe7"
- "\xf3\xe1\xde\x9a\x57\x85\xf9\xfc\xa6\x9c\x99\xeb\x1b\x8b\xc2\x12"
- "\x99\x3d\x34\x83\xb9\x9c\xbe\x9c\xfd\x33\x77\x36\x21\x7f\x5b\x3e"
- "\x7f\xe7\x43\x97\xcf\x5f\xb5\x8f\x60\x74\xcd\x7b\xee\xe5\xf3\xd7"
- "\x14\x08\x35\xf4\x9b\xc7\x1c\x35\x74\x8a\xb7\xeb\x1a\x3a\x25\xc4"
- "\x3d\x0d\x9d\xa2\x75\x4d\x43\xa7\x6c\xb4\xd7\xd0\x7b\x52\xb0\x86"
- "\x7e\xe3\x2c\xc6\xb1\xb8\x86\x26\xe7\x1c\xb5\x4f\x5a\x08\xa7\x7d"
- "\x52\xef\x76\x7c\x0d\x9d\x9a\x2b\xae\x73\x52\xdf\x23\x1a\x3a\x25"
- "\xbd\xed\x35\x74\x4a\xba\xb8\x86\x4e\x0b\x20\x7a\x23\x25\xdd\xa6"
- "\x87\x39\x0d\x0d\xd7\x88\x6a\xe8\xb4\x09\xf6\xd7\x10\x0d\x9d\xb2"
- "\x99\x68\xe8\xb4\xf9\xd2\x1a\x7a\xad\x17\x89\x5d\x69\x67\x48\xec"
- "\x22\x3e\x75\xd4\xd0\x69\x7b\x5b\xd7\xd0\x04\x43\x4c\x3b\x25\x35"
- "\x74\xda\x2d\x47\x0d\xfd\x86\xc4\xfe\x99\xeb\x4e\x71\x38\x5a\x17"
- "\x27\xd4\xd0\x6b\xf5\x0f\x86\x86\x96\xc4\x56\xae\x50\x43\xaf\xeb"
- "\x22\x5f\x43\xaf\x1b\x25\x4f\x43\x63\xcc\x89\x69\xe8\x75\x1b\x59"
- "\xfc\x6c\x16\xd7\xd0\xeb\xde\x17\xd7\xd0\xeb\x8e\x09\x35\x34\xae"
- "\x5f\x4c\x43\xaf\xbb\x2a\xa8\xdf\x41\x43\xbf\xe9\x2d\xd4\xd0\xa4"
- "\x1c\xa7\xa1\xdf\xdc\x43\x62\xe8\x1b\x6e\xec\x9f\xf9\xe6\x46\x69"
- "\x0d\xfd\x66\x96\x50\x43\xbf\x19\x4d\xb4\xf2\x9b\x47\x89\x86\x7e"
- "\x33\x89\x1c\x7f\x23\x89\x7f\x9c\xd3\xd0\x6f\xd8\xed\x9f\xf9\x66"
- "\xa9\x0c\x0d\x9d\xde\x46\x1a\x3a\xe9\xc1\xd2\xd0\x7f\x35\x74\x0c"
- "\x0d\xbd\x61\x95\x7b\x1a\x7a\x43\x92\x8b\x9a\x60\x7d\x2b\x9a\x20"
- "\xf1\x91\x26\xe0\xf3\xad\x37\x0d\x84\x6f\xfd\xde\xcf\x3d\x4d\xf0"
- "\x7b\x75\x47\xf0\xcb\xc3\xe5\x93\x0d\xec\x7c\xfd\xf4\xf7\xdd\xf3"
- "\x49\x7a\xe1\x23\xfd\x7c\x3f\xfc\xf2\xfb\x48\xe2\x97\x4d\xa3\xdc"
- "\xf3\xcb\xa6\x91\xee\xeb\xe7\x6d\x89\x9c\x7e\xde\x96\xc8\xd7\xcf"
- "\x7f\x13\xbc\x73\x7e\xdb\xcf\xb9\x7e\xde\x7a\x94\xd3\xcf\x19\x7d"
- "\x09\x07\xcd\x60\xe7\x94\x6c\x61\x72\xea\xc9\x9f\x12\xfd\x7c\x0f"
- "\xeb\xe7\x2b\xa0\x9f\x63\xa2\x28\x33\xfb\xed\x08\x3c\x7f\xad\x0c"
- "\x34\x30\xd6\xcc\x15\x49\xf0\x77\xa2\x11\xbd\xbd\x0c\x29\x37\x81"
- "\xf6\xdd\x0b\x63\xe5\xde\x95\x46\x2a\x7d\x01\x8c\x33\x55\x45\xc8"
- "\x37\x16\x74\xf5\x6d\xac\xab\x4f\x80\x66\xde\xc0\xea\xea\x2d\xfa"
- "\x8a\x44\xbe\xae\x7e\x3b\x8b\xd1\xd5\x46\x32\x37\xae\x22\x11\x74"
- "\x35\xdc\x0f\x7f\x8b\x82\xaf\xab\x1b\x41\x37\x37\x81\x6e\xce\xbc"
- "\x66\xa7\xb1\x63\x1c\x35\x76\x63\xc0\xcc\x74\xd3\xe0\xb0\x24\xac"
- "\xb1\xef\xbd\xff\x48\x63\x3b\x6a\xec\xf4\x3a\x82\xe3\x2d\xde\xee"
- "\x69\xec\x2d\x4a\xa1\xc6\x7e\xa7\xbf\xa3\xc6\xde\x12\xe7\xba\xc6"
- "\xde\xb2\xc5\x3d\x8d\xbd\x65\xb3\x6b\x1a\x7b\xcb\x75\x7b\x8d\xfd"
- "\x01\xf3\x9e\xfa\x6d\x7f\x8c\x75\x71\x8d\x4d\xce\x39\x6a\xa3\xad"
- "\x5b\x38\x6d\xb4\x75\x46\xc7\xd7\xd8\x19\x66\x71\x1d\xb4\xd5\x9b"
- "\x68\xec\x2d\x75\x6d\xaf\xb1\xb7\xd4\x89\x6b\xec\xad\xec\xfc\xb7"
- "\x2d\x75\x8e\x1a\x1b\xae\x11\xd5\xd8\x5b\x8b\xec\xaf\x21\x1a\x7b"
- "\x8b\x91\x68\xec\xad\xa7\xa4\x35\x76\xe6\x7c\x12\xdf\x32\x47\x90"
- "\xf8\x46\x7c\xea\xa8\xb1\x33\xbb\xb5\xae\xb1\x09\x86\x98\x76\x4a"
- "\x6a\xec\xcc\xe9\x8e\x1a\xfb\x6d\xb5\xb8\xc6\xde\x36\x98\xc3\x51"
- "\x56\x99\x50\x63\x67\xe6\x3f\x18\x1a\x5b\x0a\x5b\x19\x66\xa1\xc6"
- "\xce\x5a\x24\x5f\x63\x67\xbd\x27\x4f\x63\x63\xcc\x89\x69\xec\xac"
- "\xeb\x2c\x7e\x8c\xe2\x1a\x7b\x5b\x17\x71\x8d\xbd\xad\xbf\x50\x63"
- "\xe3\xfa\xc5\x34\xf6\xb6\xc9\x82\xfa\x1d\x34\xf6\xb6\x38\xa1\xc6"
- "\x26\xe5\x38\x8d\xfd\x8e\x0f\x89\xa1\x9b\x8e\xc8\xd7\xd8\xdb\xae"
- "\x4b\x6b\xec\x6d\x77\x85\x1a\x7b\x5b\x09\xd1\xd2\xef\x68\x88\xc6"
- "\xde\x56\x4d\x8e\x6f\x3a\xcc\x3f\xce\x69\x6c\x72\x9c\xd3\xd8\xef"
- "\x0c\x95\xf7\x9e\xda\xa3\xfd\xb0\x12\xdb\x7f\x3d\x46\x5b\xed\x87"
- "\x65\x7b\x57\xfd\x9f\x5e\x8f\x91\x7d\xd1\x3d\x9d\x9d\x6d\x78\xa4"
- "\xe7\xda\x5a\x37\xbc\x33\x86\xf0\xad\xed\x6e\xee\x7f\xbb\xdd\xe9"
- "\xfe\xb7\x8f\xf4\x9c\xbb\x7e\xc9\xd1\x12\xbf\xe4\x76\x73\xcf\x2f"
- "\xb9\x3e\xee\xeb\xb9\x02\x0d\xa7\xe7\x0a\x34\xd2\xef\x43\x73\x2f"
- "\x3a\xd7\x73\xf9\xb1\x9c\x9e\xdb\x79\x8a\xf0\x9d\x9d\x45\x84\xef"
- "\xec\x5c\xd4\x76\xef\x43\xdf\xbd\x2c\x7c\x1f\xba\x63\xc2\xa3\xf7"
- "\xa1\xed\xa1\xd5\xb6\x1f\x25\x18\x7d\xf7\xa0\x7b\x5a\xed\xdd\x03"
- "\x42\xad\x56\x50\xe6\xa8\xd5\x76\x06\xb8\xae\xd5\x76\xea\xdd\xd3"
- "\x6a\x3b\x75\xae\x69\xb5\x9d\x3b\xc4\xdf\x87\xe6\xd6\x48\xbf\x0f"
- "\x25\xe7\x1c\x39\x76\xbe\x9e\xe3\xd8\xf9\xde\x1d\x5f\xab\xe5\xed"
- "\x11\xe7\xd3\x79\x07\x89\x56\xdb\x99\xdb\xf6\x5a\x6d\x67\xae\xb8"
- "\x56\xcb\x0f\x26\xbc\x76\x67\xae\xa3\x56\x83\x6b\x44\xb5\x5a\xfe"
- "\x0c\xfb\x6b\x88\x56\xdb\x99\x47\xb4\x5a\xfe\x0a\x69\xad\xb6\xcb"
- "\x8f\xc4\xae\xfc\x8b\x24\x76\x11\x9f\x3a\x6a\xb5\xfc\x23\xad\x6b"
- "\x35\x82\x21\xa6\x9d\x92\x5a\x6d\x97\x97\xa3\x56\xcb\x35\x88\x6b"
- "\xb5\xdd\xe7\x39\x1c\xed\x5e\x25\xd4\x6a\xbb\x26\x3c\x18\x5a\x4d"
- "\x12\x5b\x7b\x84\x5a\x6d\x77\x2f\xf9\x5a\x6d\xf7\x64\x79\x5a\x0d"
- "\x63\x4e\x4c\xab\xed\xde\xc1\xe2\x27\x4f\x5c\xab\xed\xfe\x54\x5c"
- "\xab\xed\x2e\x13\x6a\x35\x5c\xbf\x98\x56\xdb\xdd\x28\xa8\xdf\x41"
- "\xab\x15\x04\x08\xb5\x1a\x29\xc7\x69\xb5\x82\xc3\x24\x86\xe6\x6e"
- "\x94\xaf\xd5\x0a\x76\x48\x6b\xb5\x82\xf7\x84\x5a\xad\x20\x91\x68"
- "\xb2\x82\x52\xa2\xd5\x0a\xd2\xc9\xf1\xdc\x74\xfe\x71\x4e\xab\x91"
- "\xe3\x9c\x56\x2b\xa8\x96\xa7\xd5\x5c\xdf\x2f\xeb\x3f\x3f\xa7\x58"
- "\xfd\x90\xcd\x29\xfe\xc3\x46\xf7\x74\xda\x1f\xd2\x1f\x69\x82\xfb"
- "\xa1\x09\x0a\x8c\x84\x6f\x15\xf6\x77\x4f\x13\x14\x6a\xdc\xd7\x04"
- "\xfb\x86\x73\x9a\x60\xdf\x70\x69\x4d\x50\x78\xd7\xb9\x26\xd8\x9b"
- "\xcc\x69\x82\x0f\x2f\x90\x71\xf5\xc3\xe3\x64\x5c\xfd\x70\x6d\xdb"
- "\x69\x82\x0f\x1a\x85\x9a\xe0\xfd\xd9\x8f\x34\x41\x7b\x68\x82\x3f"
- "\x54\x12\x8c\x7e\x70\xd2\x3d\x4d\xf0\xc1\x09\xa1\x26\xd8\x77\xd1"
- "\x51\x13\x7c\x18\xe2\xba\x26\xf8\x70\xb2\x7b\x9a\xe0\xc3\x49\xae"
- "\x69\x82\x0f\x8b\xc4\x35\x41\xa1\x49\x5a\x13\x90\x73\x8e\x5c\x6e"
- "\xef\x64\x8e\xcb\xed\xed\xd5\xf1\x35\xc1\x9e\xa3\xe2\xbc\x6d\xcf"
- "\x49\xa2\x09\x3e\xdc\xd7\xf6\x9a\xe0\xc3\x7d\xe2\x9a\x60\xaf\x9e"
- "\xf0\xa7\x0f\xf7\x39\x6a\x02\xb8\x46\x54\x13\xec\x5d\x64\x7f\x0d"
- "\xd1\x04\x1f\x1e\x20\x9a\x60\xef\x46\x69\x4d\xf0\xc7\x60\x12\xbb"
- "\xf6\xde\x25\xb1\x8b\xf8\xd4\x51\x13\xec\x2d\x6b\x5d\x13\x10\x0c"
- "\x31\xed\x94\xd4\x04\x7f\x0c\x70\xd4\x04\x85\xf5\xe2\x9a\xe0\xa3"
- "\xeb\x1c\x8e\x3e\xda\x22\xd4\x04\x7f\x9c\xfd\x60\x68\x02\x49\x6c"
- "\x1d\x15\x6a\x82\x8f\x06\xcb\xd7\x04\x1f\xcd\x95\xa7\x09\x30\xe6"
- "\xc4\x34\xc1\x47\xec\xfb\x3f\x82\x17\x47\x4d\xf0\xd1\x29\x71\x4d"
- "\xf0\xd1\x45\xa1\x26\xc0\xf5\x8b\x69\x82\x7d\xdd\x04\xf5\x3b\x68"
- "\x82\x7d\x21\x42\x4d\x40\xca\x71\x9a\x60\x5f\x29\x89\xa1\x85\xf9"
- "\xf2\x35\xc1\xbe\x22\x69\x4d\xb0\xef\x53\xa1\x26\xd8\xc7\x72\xff"
- "\x7d\x06\xa2\x09\xf6\xe5\x91\xe3\x85\x79\xfc\xe3\x9c\x26\x20\xc7"
- "\x39\x4d\xb0\xcf\xf8\x68\x3f\xad\x07\x69\x3f\xad\xfd\xef\xb9\xa7"
- "\x0b\xf6\x17\xb8\xcf\x3f\x3f\xcb\xe4\xf8\xe7\x67\x99\x7c\xfe\x29"
- "\xdc\xd7\xe2\xe3\x15\xce\xf9\xe7\x9f\xaa\x38\xfe\xf9\x89\x9e\xc4"
- "\xf0\x4f\xfa\x92\x18\x7e\x90\xd9\x9b\x4f\xde\x7e\x5a\x07\xa7\x0b"
- "\xf7\xd3\xfa\xf8\xe4\xa3\xfd\xb4\xee\x17\xb7\x2c\x52\x12\x6e\x79"
- "\xb0\xbf\x7b\xdc\xf2\xa0\x46\xc8\x2d\xff\x3c\xca\x91\x5b\x1e\xdc"
- "\xe0\x3a\xb7\x3c\xb8\xd7\x3d\x6e\x79\x70\x8f\x6b\xdc\xf2\x93\x2e"
- "\xe2\x7b\x58\x7c\x9c\x24\xbd\x9f\x16\x39\xe7\xc8\x09\xfe\xc4\xdb"
- "\x57\xff\x4f\x2b\x3a\x3e\xb7\xfc\x53\xa0\xf8\xf8\xff\xa7\xfe\x84"
- "\x5b\x7e\xa2\x6a\x7b\x6e\xf9\x89\x4a\x9c\x5b\xfe\x29\x87\x8c\xc3"
- "\x9f\xf8\x38\xee\x61\x01\xd7\x88\x72\xcb\x3f\xb1\xfb\xdf\x7f\xa2"
- "\x12\x72\x4b\x52\x07\xc4\xa1\xcb\xd2\xdc\xf2\xd0\x5a\x12\x97\x0e"
- "\x4d\x25\x71\x89\xf8\xd4\x91\x5b\x1e\x0a\x69\x9d\x5b\x12\x0c\x31"
- "\xed\x94\xe4\x96\x87\x96\x3a\x72\xcb\x8f\x13\xc5\xb9\xe5\x67\x13"
- "\x38\x1c\x7d\x7a\x55\xc8\x2d\x0f\x1d\x79\x30\xb8\xa5\x24\xb6\x02"
- "\x85\xdc\xf2\xd3\x8d\xf2\xb9\xe5\xa7\xc7\xe4\x71\x4b\x8c\x39\x31"
- "\x6e\xf9\x59\x17\x7b\xcc\x09\xb9\xe5\x67\xc1\xe2\xdc\xf2\xb3\x51"
- "\x42\x6e\x89\xeb\x17\xe3\x96\x9f\xc5\x09\xea\x77\xe0\x96\x9f\x6d"
- "\x10\x72\x4b\x52\x8e\xe3\x96\x7f\xd6\xb2\xe3\x5d\x5f\xf9\xdc\xf2"
- "\xcf\x5d\xa4\xb9\xe5\x9f\xfd\x84\xdc\xf2\xb3\x1a\xc2\x21\xff\x3c"
- "\x92\x70\xcb\xcf\x4c\xe4\xf8\xc7\x7d\xf8\xc7\x39\x6e\x49\x8e\x73"
- "\xdc\xf2\xcf\x93\xe4\xad\xbf\x69\x93\x7c\x73\x3b\xad\xbf\x69\xab"
- "\x7c\x73\x47\x59\x7f\x73\xb8\xd1\x3d\x5e\x79\xd8\xf4\x68\x5e\x50"
- "\x5b\xe7\x9a\xff\x1c\x45\xb8\xd6\x5f\xb6\xb8\x97\x6b\xfe\xcb\x66"
- "\xf7\xb9\xfe\x97\x47\x39\xae\xff\xe5\x51\xe9\xf5\x04\x7f\x9d\xeb"
- "\x9c\xeb\x17\x2b\x39\xae\xff\x39\x3b\xdf\xf6\xf3\x09\x64\x4c\xfd"
- "\xbc\x8b\x3b\xeb\x09\x36\xdd\x46\xca\xb7\xed\xd7\x13\x9c\x3d\x46"
- "\xd6\x13\x2c\xb3\x5f\x4f\x70\x6c\xad\x70\x3d\xc1\x5f\x2f\x4a\xad"
- "\x27\xc0\xb9\xe7\xe6\xa2\xb0\x44\xbc\x96\x40\x74\x1d\xc1\xcc\xb6"
- "\x5f\x47\x80\x75\xc2\x4e\xc0\x2d\xd6\x0a\x38\xde\x3c\x5c\x5a\xe1"
- "\xc8\x68\x82\xdf\x63\x93\xdd\xd3\x0a\xc7\x26\x09\xb5\xc2\x57\x71"
- "\x8e\x5a\xe1\xd8\x41\xd7\xb5\xc2\xb1\x73\xee\x69\x85\x63\x67\x5d"
- "\xd3\x0a\x9f\x8f\x10\x5f\x47\xf0\xd7\x68\xe9\x75\x04\xe4\x9c\x23"
- "\xc7\xfb\xe2\x1c\xc7\xf1\xbe\x78\xaf\xe3\x6b\x85\x2f\xc6\x88\xf3"
- "\xb9\x2f\x26\x13\xad\xf0\xf9\xf0\xb6\xd7\x0a\x9f\x0f\x17\xd7\x0a"
- "\x5f\x1c\x27\xbc\xea\xf3\xe1\x8e\x79\x68\xb8\x46\x54\x2b\x7c\x71"
- "\xd7\xfe\x1a\xa2\x15\x3e\xd7\x11\xad\x50\xec\x27\xad\x15\x8a\x8b"
- "\x48\x5c\x2b\x66\xbf\x31\x49\x7c\xea\xa8\x15\x8a\xa7\xb7\xae\x15"
- "\x08\x86\x98\x76\x4a\x6a\x85\xe2\x7c\x47\xad\xf0\xd7\x28\x71\xad"
- "\xf0\xe5\x0a\x0e\x47\x5f\x06\x08\xb5\x42\xf1\xe5\x07\x43\x2b\x48"
- "\x62\x6b\x8c\x50\x2b\x1c\xff\x54\xbe\x56\x38\x7e\x55\x9e\x56\xc0"
- "\x98\x13\xd3\x0a\x5f\x8e\x60\xf1\xa3\x13\xd7\x0a\x5f\x4e\x15\xd7"
- "\x0a\x5f\xc6\x09\xb5\x02\xae\x5f\x4c\x2b\x7c\x99\x23\xa8\xdf\x41"
- "\x2b\x7c\x79\x50\xa8\x15\x48\x39\x4e\x2b\x7c\x35\x8d\x1d\xff\xba"
- "\xc8\xd7\x0a\x5f\x8d\x90\xd6\x0a\x5f\x8d\x12\x6a\x85\xaf\xd4\x44"
- "\x13\x7c\x15\x4b\xb4\xc2\x57\x41\xe4\xf8\x5f\x55\xfc\xe3\x9c\x56"
- "\x20\xc7\x39\xad\xf0\x55\x92\xbc\xb9\x29\xae\xe7\xa1\xff\xf3\x73"
- "\x53\x54\x0f\xd9\xdc\x94\x93\xc1\xee\x69\x85\x93\x41\xee\xf3\xd2"
- "\xb2\xa1\x1c\x2f\x2d\x1b\x2a\x3d\x07\xe2\x64\xa3\x73\x5e\x7a\x3a"
- "\x89\xe3\xa5\x25\xe7\x49\xfc\x2e\x39\x46\xe2\x77\xc9\x1a\x57\xe7"
- "\x40\x6c\xba\xc7\x72\x51\xdb\x1c\x88\x95\xec\x1c\x08\xe0\xa3\x84"
- "\x7f\xfe\xdf\x5d\xe1\x1c\x88\xbf\xcd\x95\x9a\x03\x21\x3a\xf7\xc1"
- "\x8e\x73\xda\xf8\xa9\x27\x73\x1f\x1e\x6e\xce\xf9\xd5\x66\xc2\x39"
- "\xff\xef\xb8\x7b\x9c\xf3\xff\x8a\x85\x9c\xb3\xec\x82\x23\xe7\x2c"
- "\x09\x76\x9d\x73\x96\x4c\x70\x8f\x73\x96\x8c\x77\x8d\x73\x96\xec"
- "\x15\x9f\xfb\x70\xd2\x2c\x3d\xf7\x81\x9c\x73\xe4\x0a\xa7\x79\x79"
- "\xc5\xd3\x01\x1d\x9f\x73\x9e\x3a\x2c\xce\x0b\x4e\x1d\x27\x9c\xb3"
- "\x64\x4f\xdb\x73\xce\x92\x3d\xe2\x9c\xf3\x34\x3b\xfe\x97\xec\x71"
- "\xe4\x9c\x70\x8d\x28\xe7\x3c\x1d\x67\x7f\x0d\xe1\x9c\x25\xfb\x08"
- "\xe7\x3c\xbd\x41\x9a\x73\x7e\xdd\x9f\xc4\xac\xd3\xb7\x48\xcc\x22"
- "\x3e\x75\xe4\x9c\xa7\x4f\xb5\xce\x39\x09\x86\x98\x76\x4a\x72\xce"
- "\xaf\xfd\x1c\x39\xe7\x49\x93\x38\xe7\x2c\xbd\xca\xe1\xa8\x74\xa3"
- "\x90\x73\x7e\x3d\xe3\xc1\xe0\x9c\x92\xd8\x3a\x2c\xe4\x9c\xa5\x21"
- "\xf2\x39\x67\xe9\x6c\x79\x9c\x13\x63\x4e\x8c\x73\x96\xee\x65\xf1"
- "\xb3\x4f\x9c\x73\x96\x9e\x14\xe7\x9c\xa5\x17\x84\x9c\x13\xd7\x2f"
- "\xc6\x39\xcb\xba\x08\xea\x77\xe0\x9c\x65\xc1\x42\xce\x49\xca\x71"
- "\x9c\xb3\xac\x84\xc4\xd0\x93\xef\xc9\xe7\x9c\x65\x7b\xa5\x39\x67"
- "\xd9\x41\x21\xe7\x2c\x5b\x4f\xb8\x65\x59\x35\xe1\x9c\x65\xb9\xe4"
- "\xf8\xc9\x02\xfe\x71\x8e\x73\x92\xe3\x1c\xe7\x2c\xab\x73\xc6\x39"
- "\xe9\x4c\x3a\x32\x93\xb2\x1e\x80\xdf\x61\x68\x67\x2f\x18\xdf\x8a"
- "\xe1\xef\x12\x18\xa7\xd4\xf0\x77\xa5\x14\x97\x31\xfa\xd1\x91\x56"
- "\xe0\x25\x56\xb8\x4f\x85\xf1\x66\x71\x71\x6f\x33\xdc\xbb\x3c\x9e"
- "\x70\x16\x3a\xd2\xd7\xdc\x79\xbc\x95\x8e\x85\xf1\x1d\xfe\x4e\x82"
- "\x63\x50\xbe\x3b\x8c\x87\x9a\x95\xa8\xfb\x0d\xaa\x7c\xb3\xad\x1c"
- "\xb4\xb9\xfb\x25\xaa\x7c\x02\xae\xa3\x61\x53\x79\x2e\x3c\x8f\x49"
- "\xb2\xad\x50\x57\xf8\xde\x7e\x68\x8d\x99\xfe\xa1\x78\xf1\x6d\x54"
- "\x43\x95\x5f\xf4\xad\xeb\x3c\x1e\xe2\x10\xc2\x1c\xf1\x40\x6f\xa3"
- "\x12\xd7\x59\xbc\xb8\x09\x9f\x3b\x81\xcf\x59\xa0\x8d\x29\x8b\x10"
- "\x95\x71\xbb\xb3\x0a\x38\x97\x77\x6a\x3d\x5d\xbb\xc4\x0c\x6d\x86"
- "\xf1\xf5\x8b\x7e\x55\xca\x8f\xdf\xad\x62\xc6\x9e\xf2\x7a\x0b\x53"
- "\x87\x66\x31\xd3\x9e\xcb\xbb\xa0\xbc\x58\x1b\x36\xec\x47\x83\xbc"
- "\x43\x68\x83\xbc\xf1\xae\x42\x27\x65\x47\xdf\xb5\xfd\x50\xf1\x53"
- "\x60\x3b\x0d\xa2\xc4\xce\xcb\xbc\x8f\xb3\xf9\x0f\xaa\x77\x7a\xd2"
- "\xf5\xa9\x3b\x10\xb5\xd5\xda\x59\xf5\x15\xc4\xc4\xdd\xdb\x69\x63"
- "\xc3\xa6\x4a\x1f\x83\xd7\xb1\x5c\x6c\xf3\x37\xe1\xfc\xd6\x9e\xb4"
- "\xf1\xce\x3a\x8c\x9b\xca\xa0\xe3\x30\xb6\xdb\xfb\x62\x59\xf4\xa2"
- "\xb9\x9a\xc4\xb8\x45\xf3\x97\xac\x48\xd4\x04\x47\x77\x45\xd3\x96"
- "\x2c\xd1\x2c\x9a\xbb\x78\x95\x86\x7f\x26\x4c\x13\x1d\xb7\x7c\xee"
- "\xbc\xf8\xf9\x83\x17\xbd\x96\xd0\x15\xda\x84\x78\xed\xf0\xc7\x6d"
- "\xb1\x6e\xaa\x1c\xba\x6b\x1b\x42\xef\xf4\x40\x4a\xdc\x2e\xb8\x5f"
- "\xb6\x41\xd9\xf7\x28\xbe\x5f\xc6\x76\xba\x9e\x82\x32\xa9\x10\xd3"
- "\xb6\xa6\x74\x86\xb2\x15\x05\xbb\xa1\x5d\xbb\xa0\xdd\xd0\x46\xdc"
- "\xe6\x62\x5b\x9b\x6d\x98\x48\xc5\x98\x48\xb9\x0d\x18\xac\xbc\xe8"
- "\x6b\xea\x3c\x8e\xa6\x23\xf1\xf3\xd5\x43\x5f\xf1\xba\x42\x9d\x59"
- "\xc5\xe8\x86\x2c\x3a\x12\xae\x35\xdb\x30\x66\xcd\x1e\x67\xa4\xb7"
- "\xd1\x1a\xe0\x95\x5e\x0d\x74\xec\x2f\x00\x9b\x70\xfd\x99\x09\x43"
- "\x10\x4a\xa3\x1b\x22\x99\x6f\x63\xd0\x0d\x80\x61\x82\x53\x38\xf7"
- "\x4d\x9f\x3b\x14\x7a\xbe\x61\xd3\x99\xd1\x06\xb4\x30\x08\xd7\x61"
- "\x80\x63\xd8\xe6\xd6\x82\xf9\x69\xd3\xb5\x28\x6d\x60\x1a\x4a\x6b"
- "\xc0\xd7\x14\x0e\x8c\xf4\x4d\x44\x5e\xe1\x49\xf4\xf7\x10\x77\xbc"
- "\xe8\xfe\xf3\xd3\xe8\xf7\x07\x46\x1a\xa8\x33\x41\xd6\x9c\x71\x46"
- "\x78\x9e\x3a\xa8\x27\xdd\x80\x1a\xce\xe2\x7a\xb6\x6e\x67\x6c\x5f"
- "\x87\x9f\x1d\xec\x03\xfa\x87\x2e\xa6\xd7\xb1\x7d\x28\x53\x63\xb2"
- "\x66\x2e\x41\x15\xca\x7b\x28\xdc\x4c\x37\xd3\x59\x1a\x53\x79\x7d"
- "\x3d\xc4\xb4\x84\xd7\xe8\xae\x95\x2f\xf8\x9a\xe3\xe6\xef\xee\x01"
- "\x7d\x31\x6b\x09\xa2\xb3\x74\xc3\xa7\x87\x20\x35\xd4\x5d\x63\xb3"
- "\x27\xd8\x52\x29\x0f\x47\x67\x6a\xf1\x33\x61\x3c\x40\x7b\x58\x3c"
- "\x7c\x33\xfc\x78\xa2\x23\x1e\x5a\xfa\xe6\xf6\xd0\x28\x33\x1d\x39"
- "\xae\x39\x3b\x34\x97\xf6\x0f\x5d\x9f\x72\x19\x75\xc2\xb6\x2d\x07"
- "\x2d\x90\xb1\x12\x05\x6e\x79\x15\x69\xe6\xac\x52\x23\x63\x4e\x68"
- "\x9a\xef\xda\x34\x2f\xb0\x09\x05\xf1\x65\x28\xc4\xcc\xa1\xcd\x3d"
- "\xc7\x19\x93\xe7\x23\xaa\xe8\xd2\x01\x0a\xf3\x67\x3c\x6f\x05\x6c"
- "\x7d\x77\x17\x5c\x47\xdf\x8c\x44\xd8\x1f\x8c\x2f\x6e\xc6\xa2\xc9"
- "\x71\x30\x3e\x2f\xc0\xe7\xff\x1e\x92\x0f\x75\xca\x7b\xae\x6f\x18"
- "\xfe\x6b\x01\x5f\x0d\x01\x3f\x55\xd4\x58\x98\x3a\x19\x5f\xc5\x73"
- "\xbe\x3a\x06\xed\xe0\xfc\xf5\xcd\x01\xec\x57\x89\x67\x36\x90\x67"
- "\xd6\x05\xd2\xfe\x3a\xa5\xf4\x33\xeb\x10\x79\x66\xef\xdb\xce\x9f"
- "\xf9\xef\x57\x9d\x3f\xf3\xd9\xbe\xf2\x9f\xf9\xef\x87\xe4\x3f\xf3"
- "\xdf\x0b\xa5\x9f\x59\xc7\xfa\x59\x07\x7e\xd6\x39\xf1\xb3\x8e\xf5"
- "\xf3\x63\x97\x9c\x3f\xf3\xd9\x0b\xce\x9f\xf9\x9c\x9f\xfc\x67\x3e"
- "\xbb\x47\xfe\x33\x9f\xcd\x75\xf2\xcc\xac\x9f\xf5\xe0\x67\xbd\x13"
- "\x3f\xeb\x59\x3f\xfb\x7d\xe3\xfc\x99\xcf\x9d\x71\xfe\xcc\xff\xf0"
- "\x96\xff\xcc\xe7\xf2\xe4\x3f\xf3\xb9\xcd\xd2\xcf\xac\x67\xfd\xac"
- "\x07\x3f\xeb\x9d\xf8\x59\xcf\xfa\xf9\xb9\x4d\xce\x9f\xf9\x1f\x27"
- "\x5b\x79\xe6\x46\xf9\xcf\xfc\x8f\x4c\xf9\xcf\xfc\x8f\x34\x27\xcf"
- "\xcc\xfa\x39\x0c\xfc\x1c\xe6\xc4\xcf\x61\xac\x9f\x5f\x79\xd1\xf9"
- "\x33\xff\xf3\x88\xf3\x67\xfe\xe7\x75\xf9\xcf\xfc\xcf\xf5\xf2\x9f"
- "\xf9\x9f\x89\x52\xcf\xdc\x04\x71\xdb\x07\x9e\xa5\xf9\x9f\x91\xe3"
- "\x2c\xfe\xa1\x9b\x7d\x6a\x10\x95\xb7\xce\x1a\xeb\x5b\x8b\xba\xc0"
- "\xb3\xc5\xd2\xdb\x27\x16\xe3\x7f\xad\xfe\xa1\xe9\x4d\xfe\xa1\xb9"
- "\x8d\x3d\x68\xcd\x1b\xb3\x51\x27\xcc\xc7\x37\x5a\x51\xa0\x35\x3b"
- "\x74\xfd\xe6\x97\x90\x26\xd5\x88\xd4\xe5\x29\x06\x94\x92\x40\x1b"
- "\xcb\xd1\x45\xd4\xad\x16\x6b\xcf\x6f\x51\x69\x5d\x09\x5a\xbc\x8c"
- "\xa6\xaf\x50\xe7\xf5\x38\x6f\x02\x3c\x39\x2d\xf3\x1f\x48\x03\xf7"
- "\x18\xba\x0b\x7e\xb8\x1e\xdf\x49\x30\x7e\x6e\x9f\xf8\xe5\xee\x14"
- "\x14\xf8\xf9\x82\x5a\x84\x8f\xe7\xc3\xcf\xb2\x7d\x9c\x31\x65\x36"
- "\xa2\xf6\xdf\xae\xa2\xc8\xd8\x7c\xde\xdb\x7e\x6c\x9e\x34\x17\x6c"
- "\x39\x8f\x39\x37\x35\xef\x25\xb9\xb6\xac\xaa\xb4\x8d\xdd\x8c\x2d"
- "\xab\x2d\x64\xbc\xb7\x1b\xbb\x3f\x87\xfb\x73\xb6\xac\x2a\xc6\xb6"
- "\xa4\xb3\x43\x0b\x2a\x6a\x9b\xb0\x6e\x52\x5f\x49\x42\x14\x1c\x4f"
- "\x28\x4f\xb8\x8d\x24\x6c\x6c\xe0\x6c\xac\xf3\xf1\xa9\xf1\xbe\x2d"
- "\x6e\x63\x9d\xaa\xc9\x5f\x17\xe8\x68\x63\x9d\xd2\x35\x1b\x7f\x9b"
- "\xef\xb9\x8d\xbf\x8d\x93\xb6\xf1\xb7\x9f\xca\xb7\xf1\xb7\xc3\xe5"
- "\xdb\xf8\xdb\x20\x62\x63\x9d\x46\x68\xe3\xf3\x67\xa5\x6d\xac\xe3"
- "\xe1\x58\x07\x38\x7e\xec\x92\x84\x8d\x01\xc7\x3a\x11\x1c\xeb\x5c"
- "\xc4\x71\xb5\x97\xe7\x36\xfe\x57\x99\xb4\x8d\xab\x7b\xc9\xb7\xf1"
- "\xbf\x72\xe5\xdb\xf8\x5f\xe9\xac\x8d\xed\x70\xfc\x2f\x9d\x13\x1b"
- "\xf3\x70\xac\x07\x1c\xfb\x7d\x23\x6e\x63\x3d\xe0\x58\x2f\x82\x63"
- "\xbd\x8b\x38\xbe\x30\xdf\x73\x1b\x5f\x18\x26\x6d\xe3\x0b\x6b\xe4"
- "\xdb\xb8\xda\x2c\xdf\xc6\xd5\x75\xc4\xc6\x7a\x3b\x1c\x57\xe7\x49"
- "\xdb\x58\xcf\xc3\xb1\x1e\x70\xfc\xdc\x26\x09\x1b\x03\x8e\xf5\x22"
- "\x38\xd6\xbb\x88\xe3\xef\x4e\x79\x6e\xe3\xef\x72\xa4\x6d\xfc\xdd"
- "\x45\xf9\x36\xfe\x2e\x4a\xbe\x8d\xbf\x8b\x60\x6d\x6c\x87\xe3\xef"
- "\x90\x13\x1b\xf3\x70\x1c\x06\x38\x7e\xe5\x45\x71\x1b\x87\x01\x8e"
- "\xc3\x44\x70\x1c\xe6\x22\x8e\x0d\x83\x3d\xb7\xf1\xf7\x8d\xd2\x36"
- "\x36\x8c\x95\x6f\xe3\xef\x4f\xc8\xb7\xf1\xf7\x87\x88\x8d\xc3\xec"
- "\x70\xfc\x7d\xb4\x94\x8d\x9b\x41\x03\x76\x03\x1b\x77\xab\x43\x54"
- "\x3e\xb6\x6d\x15\xb1\xad\xa5\xe7\xc4\xe2\x7c\xca\x1a\x8b\x6d\xc2"
- "\xe4\x80\x7e\x0c\xec\x6e\xc9\x0e\xdd\x4c\x53\xf0\x4c\x29\x38\xef"
- "\x6a\x28\x32\xaf\x43\xdd\x35\x29\x38\xff\x7b\x89\x99\x1f\xab\x49"
- "\x79\xeb\x02\xdc\x4f\x81\xf3\x5e\xe6\x2c\x2b\xb2\x04\xfc\xbc\xf2"
- "\x0a\x75\xf1\x32\x1d\x1c\x92\x00\x7a\xb3\x80\x5e\x18\xe8\x5f\x51"
- "\x77\x00\xec\x73\x1a\x95\x57\xfd\x05\x59\x7b\x4e\xfc\x72\x88\x19"
- "\x69\xe9\x1f\xb5\xfe\xa5\x89\x06\x64\x79\x2d\xd0\xa7\x22\xa9\x04"
- "\x55\x24\x7d\x82\xc2\x6b\xe9\x7b\xf4\xbf\xb5\x3e\xcd\x01\x53\x55"
- "\x96\x80\x89\x05\x96\x9c\x99\xb9\xe6\x80\x08\x53\xd1\x4a\x03\xe5"
- "\x63\x42\xda\xf8\x1a\x9a\xce\x98\x87\x94\x19\x97\x90\x6a\xeb\x3c"
- "\xe4\xb3\xf5\x12\x52\x97\xd6\x54\xa1\xb2\x6b\x25\xa8\xec\xf6\x79"
- "\x54\x76\x0f\x7e\x4d\xf0\xb3\xc2\x2f\xed\x3c\xf8\x1a\xa1\xc9\xd7"
- "\x11\xfe\xae\xa8\xf1\xe9\x6a\xe4\x5f\x6a\xae\x42\x78\x4d\xef\x0d"
- "\xea\xe2\x5a\x9f\x28\xe4\x4f\xff\x3b\x10\xd1\xaf\x05\x52\x70\x4e"
- "\x89\x8f\x57\x98\x8d\xa8\xb4\xc6\x84\xcf\x47\xc1\x79\x65\x6a\x0d"
- "\xd4\x6f\x2d\xc1\xdf\x0d\x35\x96\xa6\x9d\x82\xe7\x2b\x32\xd2\x58"
- "\x43\xf7\x0c\x8d\xca\x04\x53\x5b\xe9\xc0\x01\x04\x07\x97\x76\xec"
- "\xb2\xca\xf5\xf5\x45\xb2\xff\xcd\xc2\xc0\x1e\x60\xe7\xde\xd6\x85"
- "\x91\xea\x29\xe7\xbf\xa7\xf1\x1c\x3f\x9c\x4b\x28\xaf\x3f\x8d\xf0"
- "\xbb\xa6\xf0\x55\x08\x4d\xb2\x20\x84\x6d\x51\x91\x54\x8b\xa6\x24"
- "\x20\x5f\x9c\x7f\xb6\xfe\xa8\xed\x51\x51\x63\x44\x6b\xcc\xd0\xc6"
- "\x1b\xa6\x96\x36\x96\xaf\x2f\x47\x70\xae\x77\x79\xac\x01\xf9\x24"
- "\x20\x35\xb6\xaf\x39\x3b\x34\x7d\x0a\xf4\x9f\xc5\xf5\x34\x8d\x6d"
- "\x8b\x6d\x8a\xed\x8b\xeb\xb3\xd9\xbc\x22\xda\x88\x52\x4d\x48\x5d"
- "\x91\x02\xff\x26\xd1\xc6\x0a\x74\x0b\x41\x1b\xb3\x69\xbf\x22\x23"
- "\xe0\xe2\x04\xc6\x82\x81\x32\x14\x82\xff\x7b\x88\x63\x4a\xa7\x24"
- "\x98\xf2\xbe\xdd\x3a\xa6\x74\x3e\x1c\xa6\xfe\xed\xc5\x61\xaa\xe6"
- "\x82\x34\xa6\x6a\xf4\x04\x53\x3a\x4d\xc7\xc4\xd4\xbf\xcf\x39\xc7"
- "\xd4\xbf\x0f\x49\x63\x4a\x17\x08\x98\x32\x08\x31\x55\x73\x5d\x3e"
- "\xa6\x6a\x94\xed\x87\x29\x9d\xca\x3d\x4c\xfd\xbb\x56\x88\xa9\x4b"
- "\x26\x27\x98\x62\xe3\xd4\x63\x97\x5c\xc0\x14\x2f\x4e\x5d\x9e\xce"
- "\x61\xea\x87\x61\xd2\x98\xba\xb2\x85\xc5\x54\x07\x8d\x53\x57\x42"
- "\x9c\x63\xea\x8a\xca\x09\xa6\x20\x4e\xe9\xec\xe2\xd4\x0f\x2f\xc8"
- "\xc7\xd4\x95\xc8\x76\xc4\x94\x9b\x71\xea\xca\x48\x21\xa6\x2e\x4f"
- "\x92\xc6\x94\x9e\x8d\x53\x7e\xdf\xb4\x8e\x29\x3d\x2f\x4e\xfd\xb0"
- "\x97\xc3\xd4\xd5\x0d\xd2\x98\xaa\xbd\x48\x30\xa5\xef\xa0\x71\xaa"
- "\x76\x8d\x73\x4c\xd5\xce\x92\xc6\x94\x1e\xe2\x94\xce\x2e\x4e\x5d"
- "\xcd\x91\x8f\xa9\xda\x7d\xed\x87\x29\xbd\x9b\x71\xaa\x36\x53\x88"
- "\xa9\x1f\x0a\x9c\x60\x8a\x8d\x53\xcf\x6d\x72\x01\x53\xbc\x38\x75"
- "\xd5\xc2\x61\xea\xc7\xf3\xd2\x98\xfa\x71\x04\x8b\xa9\x0e\x1a\xa7"
- "\xae\x9d\x71\x8e\xa9\x6b\x07\x9c\x60\x0a\xe2\x94\xde\x2e\x4e\xfd"
- "\x78\x55\x3e\xa6\x7e\x44\xed\x88\x29\x37\xe3\xd4\xb5\x1a\x21\xa6"
- "\xae\xd6\x4b\x63\x2a\x8c\x8d\x53\xaf\xbc\xd8\x3a\xa6\xc2\x78\x71"
- "\xaa\x6e\x2a\x87\xa9\x1b\x83\xa5\x31\x75\x7d\x23\xc1\x54\x58\x07"
- "\x8d\x53\xd7\x83\x9d\x63\xea\xba\x52\x1a\x53\x61\x10\xa7\xf4\x76"
- "\x71\xea\xc6\x28\xf9\x98\xba\x3e\xad\xfd\x30\x15\xe6\x66\x9c\xba"
- "\xae\x13\x62\xaa\x6e\xbc\x14\xa6\x9a\xb0\xee\xf3\x02\x4c\xc5\x82"
- "\xee\x03\x0c\xf9\x56\x12\x4c\x35\x03\xa6\x76\xf2\x31\xf5\x2f\x7b"
- "\xdd\x77\xe3\x7d\x6b\x0b\xa6\x8c\x07\xed\x31\x65\x05\x4c\x35\x33"
- "\x98\xba\x79\xca\xa6\xfb\x2a\xea\x0a\xc0\x57\xd7\x50\x45\x04\xe0"
- "\x69\x3b\x8b\xa7\x7f\x01\x9e\xe0\x79\xac\xf0\xbc\xa5\xd5\x55\x28"
- "\xdc\x48\x9e\xab\x09\x9e\xd7\xca\xc7\x52\x53\x2d\x85\x31\x84\xb1"
- "\x63\xc3\x51\xd9\x62\xc0\xcf\xb2\x33\xa8\x6c\x25\xfc\x56\xc3\x2f"
- "\x05\x7e\xe8\x0c\x2a\xad\x45\x4c\xce\x9e\xc3\x4f\x25\x8b\x9f\x9b"
- "\xf3\x9d\xe3\xe7\xe6\x18\x79\x1a\xcf\x78\x5c\x3e\x7e\x6e\x66\xb3"
- "\x73\xe9\xd4\xe1\x53\xbf\xa7\xf1\xbc\x59\x82\x91\x6b\x28\xdc\x8c"
- "\x7c\xe9\x57\xb4\x3d\x7c\x22\x91\xfa\x0d\x0b\xa2\xb6\xcc\x43\xea"
- "\x2d\xdf\xc2\xf3\xda\xfa\xce\x25\xe4\x73\xda\xf4\x17\x54\x7a\xbb"
- "\x0a\x95\xde\x3b\x85\x4a\xad\xf0\xbb\x06\x3f\x68\x63\xf8\x7c\xfe"
- "\xf3\x1a\xd9\xe7\x35\x4e\x87\xba\x82\xa4\x9f\xd7\x38\x9c\x79\xde"
- "\x68\x78\xde\x26\xee\x79\x2b\x00\x8b\xe0\x97\xde\x56\x56\x27\x86"
- "\x1b\x51\x97\x25\x66\x9a\x6e\x62\x31\x88\xfd\x72\xfa\xac\x09\x85"
- "\x27\x80\xaf\x5e\x03\x0c\xd6\xec\x41\xa9\xc9\x80\xc1\x26\x13\x7e"
- "\xaf\x6f\xac\x48\x6b\x04\x0c\xde\x4c\xa2\xc1\x6e\xcd\x18\x83\xff"
- "\xc2\x18\xbc\x91\x67\x95\xc4\x20\xe8\x44\x06\x83\xa0\x13\x5b\xc5"
- "\x20\x5f\x27\xde\x0a\xe1\x30\x78\x67\x84\x34\x06\x6f\x4f\xb6\xe9"
- "\xc4\xff\x3c\x06\x6f\x5d\x75\x8e\xc1\x5b\x25\xf2\x34\xe1\x9d\xb1"
- "\xf2\x31\x78\x3b\xb0\xfd\x30\x78\xfb\xbc\x73\x0c\xde\x3e\xdc\x3a"
- "\x06\x75\x2a\xf7\x30\x78\xcb\x2c\xc4\xe0\x2d\x8d\x13\x0c\xb2\x71"
- "\x10\x74\x65\xeb\x18\xe4\xc5\xc1\x3b\x45\x1c\x06\xef\x1e\x91\xc6"
- "\x60\xfd\x19\x9b\xae\xfc\xcf\x63\xb0\x7e\x91\x73\x0c\xd6\x4f\x92"
- "\xa7\x21\xef\x9e\x92\x8f\xc1\xfa\xbc\xf6\xc3\xe0\xdd\xd9\xce\x31"
- "\x78\x77\xa4\x0b\x18\x74\x33\x0e\xd6\xa7\x09\x31\x78\xa7\x50\x1a"
- "\x83\x7a\x36\x0e\x82\x0e\x6d\x15\x83\x7c\x1d\x7a\x6f\x18\x87\x41"
- "\xd3\x28\x69\x0c\x36\x4c\xb7\xe9\xd0\xff\x3c\x06\xef\xdd\x72\x8e"
- "\xc1\x7b\x95\xf2\x34\xa7\x69\xb2\x7c\x0c\x36\x68\xda\x0f\x83\x0d"
- "\x17\x9d\x63\xb0\xa1\xb8\x75\x0c\xea\xdd\x8c\x83\x0d\x4a\x21\x06"
- "\xef\x69\x9d\x60\x90\x8d\x83\xa0\x5b\x5b\xc7\x20\x2f\x0e\x9a\x3e"
- "\xe5\x30\xd8\x74\x5c\x1a\x83\x8d\xe7\x6d\xba\xf5\x3f\x8f\xc1\xc6"
- "\x15\xce\x31\xd8\x38\x4d\x9e\x46\x6d\x3a\x23\x1f\x83\x8d\x85\xed"
- "\x87\xc1\xa6\xf9\xce\x31\xd8\x34\xc6\x05\x0c\xba\x19\x07\x1b\xd3"
- "\x85\x18\x34\xed\x93\xc6\x60\x18\x1b\x07\x41\xe7\xb6\x8a\x41\xbe"
- "\xce\x6d\xd6\x73\x18\xb4\x8c\x95\xc6\xa0\x79\xb6\x4d\xe7\xfe\xe7"
- "\x31\xd8\xdc\xe8\x1c\x83\xcd\x55\xf2\x34\xad\x65\xba\x7c\x0c\x9a"
- "\xb5\xed\x87\x41\xf3\x55\xe7\x18\x34\x97\xb4\x8e\xc1\x30\x37\xe3"
- "\xa0\xd9\x47\x88\xc1\xe6\xa1\x52\x18\xb4\x82\x2e\x6e\x2e\x0c\x49"
- "\xb0\x66\x4f\x55\xf9\x7a\x69\x90\xd9\xff\xe7\x95\x15\x89\xf5\x68"
- "\xca\x5d\xb0\x4f\xc2\x5d\xf4\xea\x5d\x35\xb2\x64\x47\x98\x40\x17"
- "\xa6\xf3\xf4\x33\x33\xb7\xcc\x9c\x59\x64\xdc\xba\x18\x29\x41\x7f"
- "\x7f\x89\x8f\x55\x5c\x31\x21\x7c\xff\x35\xb8\x3d\xd7\xb8\xf6\xe0"
- "\x3c\x01\x7d\x53\xab\x66\xde\x31\x37\x19\x50\xcd\x48\xa4\x28\xad"
- "\x31\x80\x1d\x56\x33\xfe\xc5\x76\xb9\x42\x59\xb5\xbb\x6f\x20\xa5"
- "\xf9\xdf\x81\xbd\xc1\xde\xfe\xdd\x5e\x47\x5e\x7d\x6a\x68\x2b\xb6"
- "\x2b\xb6\x17\xb6\xb1\x66\x35\x7e\x77\x6d\x5d\x55\x0e\x18\x33\xff"
- "\x5b\xdb\x7b\x17\x94\x13\xd7\xab\xd6\xb5\xf2\xb1\x61\x1d\x43\xd6"
- "\x2d\x58\x35\xa5\xd5\x48\xf4\xdd\xb1\x15\xf4\x9b\x6b\xb6\xd2\xa9"
- "\x78\x3a\xef\x3e\xd8\x8a\x9e\xe6\x9a\xad\xe8\xf7\x85\xb6\x12\xd3"
- "\x55\x74\x91\x7c\x5b\xd1\x09\xc4\x56\xf4\x24\x27\xb6\x72\x11\x57"
- "\xba\x74\x9e\x1e\x69\x7b\x5b\x29\x50\x9a\x4b\xb6\x52\xa0\x33\x76"
- "\xb6\x72\xe4\xff\x0a\x74\x5e\xb6\xad\x14\x88\xec\x05\xaa\x40\x49"
- "\xd2\xb6\xd2\xbb\x88\x2b\xbd\x8a\xc7\x9b\xef\x83\xad\xbc\xf6\xb9"
- "\x66\x2b\x2f\x8b\xd0\x56\x22\x3c\x55\x41\x79\xcb\xb7\x95\x17\xf9"
- "\x1e\x9e\xc2\xab\xd0\x89\xad\x5c\xc4\x95\x3e\x9d\xc7\xef\xee\x83"
- "\xad\xa8\x2a\xd7\x6c\xa5\x08\xb1\xb3\x95\x23\x9f\x52\x28\x86\xc9"
- "\xb7\x15\x55\x4f\x6c\x45\x55\x4a\xdb\x2a\xcc\x45\x5c\x85\xa9\x78"
- "\x3c\xe4\x3e\xd8\x4a\xa9\x74\xcd\x56\xca\xe9\x42\x5b\x89\x8c\xfb"
- "\x0a\xe5\x6c\xf9\xb6\x52\x6a\x88\xad\x14\x66\x29\x5b\x59\xb2\x43"
- "\xd7\xfb\x82\x0d\x1a\xb7\x87\x46\xf9\x26\x21\xaa\x29\x08\xec\xe6"
- "\x0f\x76\x5b\xab\x41\xcd\xd9\x60\x37\xa3\x19\x4d\x59\xfa\x3d\x5d"
- "\x5e\x67\x41\x4d\x60\xb3\x46\xff\xd0\xf4\x0a\x63\x2d\x9e\x73\xf4"
- "\xf3\x4b\x8a\x4e\xa3\x5e\x59\xaa\x46\xd8\x6e\xd8\x0e\xd8\x76\x34"
- "\xd8\x8d\xb1\xa3\xff\xcc\x5c\x8b\xff\xc4\x82\xc9\xd7\xbf\xa7\x97"
- "\x18\x68\x1a\x3f\x2f\xad\xb6\x22\xfc\x5e\x20\xbc\x16\x75\xd1\xbc"
- "\x84\x9f\xc9\xfb\x3a\x3e\x5e\x61\xac\x02\x7e\x70\x1b\x31\xdc\xec"
- "\x7b\xad\xbf\xe5\xb7\x5a\x1f\x4b\x45\xe4\x38\xba\x07\xad\x31\xf7"
- "\x1c\x67\x4c\xbd\x8e\x3a\x61\xfe\x90\x61\x45\x81\x6b\x16\x21\x6a"
- "\xff\x82\x62\x8a\x59\xbb\xb6\x8c\xa9\xe3\x08\xd8\x25\x90\xbe\xc3"
- "\x9b\xd3\x7d\x27\x16\x55\x5c\xc9\x64\xfc\x66\xcf\x11\x18\xbf\xfd"
- "\x53\xab\x06\x9e\x39\x94\xf6\x0f\xcd\xcd\x2c\x47\x1a\xba\x19\x6c"
- "\x8c\xd7\x13\x29\x3a\xbd\xbf\xbb\x49\xae\x8d\xbd\x99\xf9\xdf\x56"
- "\x0d\x3b\x7f\x0b\xec\x84\xef\xcf\xcc\xdf\x4a\xe0\xcd\xdf\x82\x36"
- "\xb7\xcc\xdf\x52\x78\x8f\xc7\xf3\xb7\xac\xdf\x07\xf6\xb6\x3d\xfb"
- "\x92\x78\x9a\x86\x67\xef\x51\x5e\x6f\x44\xf8\xf9\xcb\xeb\x8b\x51"
- "\x6a\x22\x52\x97\x37\xd5\xa2\x94\x7a\xda\x58\x9e\x76\x15\x85\xdf"
- "\xc5\x3c\x18\xe3\xa5\xd3\x08\xe2\x57\x6f\x95\xf5\x7b\x6d\x6f\x83"
- "\xa2\xd3\xa0\xf2\x4a\x84\x78\xeb\x78\x62\x81\x33\xab\xc0\x0f\xb1"
- "\x15\x69\x97\x10\xdd\xf3\xd7\x9a\x0a\xf3\xb7\xd8\x4f\xb1\x70\x7e"
- "\x64\x0b\xbf\xee\xf9\xeb\x01\xf8\x18\xf6\x19\x7e\xdf\x84\xf7\x0e"
- "\xd8\xcd\xe3\xdf\x18\x17\xbe\x49\x69\xa8\x22\xa9\x09\x95\x9b\x11"
- "\x02\x3c\x1d\xfa\x3a\xb2\x4a\x02\x47\x3a\x25\x8b\x23\x83\x6f\x92"
- "\xf7\xed\xd6\x71\xa4\x53\x71\x38\x52\x6d\xf0\x0c\x47\xaa\x11\x9e"
- "\xe3\x48\xe5\xe5\x3e\x8e\x74\x81\x42\x1c\xa9\xae\xcb\xc7\x51\xe7"
- "\x52\xf9\x38\xea\x9c\xe9\x19\x8e\x54\x6b\x08\x8e\x3a\x47\x10\x1c"
- "\xa9\x12\x39\x1c\x31\x6b\xa3\xee\x13\x8e\x3a\x99\x9d\xe0\x88\x8d"
- "\x47\x3a\x88\x47\x8f\x5d\x72\x01\x47\xbc\x78\xd4\xb5\xcc\x33\x1c"
- "\x75\x5d\xe3\x39\x8e\xba\x4e\xf0\x00\x47\x76\xf1\xe8\xb1\x11\xf2"
- "\x71\xd4\xd5\x5f\x3e\x8e\xba\x54\x79\x86\xa3\xae\x27\x09\x8e\xba"
- "\xe4\x12\x1c\x75\x3d\xca\xe1\x88\x59\x6f\x76\x9f\x70\xd4\x65\x8c"
- "\x34\x8e\xf4\x6c\x3c\xd2\x41\x3c\xf2\xfb\xa6\x75\x1c\xe9\x79\xf1"
- "\xa8\x5b\x80\x67\x38\xf2\x39\xe9\x39\x8e\x7c\xb2\xdc\xc7\x91\xde"
- "\x2e\x1e\x75\x5b\x23\x1f\x47\x3e\xb3\xe4\xe3\xc8\x47\xe3\x19\x8e"
- "\xba\x75\x23\x38\x7a\xcc\x40\x70\xd4\x4d\xc9\xe1\x88\x59\xc3\x77"
- "\x9f\x70\xf4\xd8\x66\x27\x38\x62\xe3\x91\x1e\xe2\xd1\x73\x9b\x5c"
- "\xc0\x11\x2f\x1e\xf9\xce\xf6\x0c\x47\xbe\xdd\x3c\xc7\x51\xf7\xf3"
- "\x1e\xe0\xc8\x2e\x1e\xf9\x9e\x94\x8f\xa3\xee\x85\xf2\x71\xd4\x3d"
- "\xd6\x33\x1c\xf9\x4e\x27\x38\xea\xae\x25\x38\xf2\x9d\xc4\xe1\x88"
- "\x59\x17\x79\x9f\x70\xd4\xed\xac\x34\x8e\xc2\xd8\x78\xa4\x87\x78"
- "\xf4\xca\x8b\xad\xe3\x28\x8c\x17\x8f\xfc\xde\xf7\x0c\x47\x7e\xd3"
- "\x3d\xc7\x91\x5f\x7f\xf7\x71\x14\x66\x17\x8f\x7a\x74\x93\x8f\x23"
- "\x75\x9d\x7c\x1c\xa9\x0f\x78\x86\x23\xbf\x7c\x82\x23\x75\x02\xc1"
- "\x91\x5f\x36\x87\x23\x66\xad\xe9\x7d\xc2\x91\xba\x8f\x14\x8e\xf0"
- "\x5e\x04\xef\x90\x7d\x21\xea\xb7\xae\x46\xba\xdd\xf8\xdf\x26\x34"
- "\xb4\x21\xa3\xc7\x98\xe3\xc9\x64\x3f\x00\x83\xa2\x07\x93\xef\x15"
- "\xbb\xfe\xb1\xbd\xe0\x17\xff\xd0\xb4\xf0\x0b\x64\x8f\x06\xbc\x2f"
- "\xc8\x9d\xd4\x58\x34\x04\xef\xcb\xa0\xf8\x49\x32\xde\xc7\xaa\x65"
- "\xef\x00\x7f\x89\xbd\x03\x66\x4a\xef\x1d\xd0\xb4\xdd\xb6\xee\x76"
- "\x0f\xb7\xee\x56\xf1\x93\x09\x4e\xd7\xdd\x2a\x7e\x32\x2c\x7f\xa6"
- "\x5c\x3c\xf4\x60\xd6\x7f\xdd\xe9\x19\x1a\xd5\x90\xf1\x93\xd1\xf0"
- "\xff\x40\xf2\xec\x3f\x61\xf6\x0f\x6e\x7d\x3d\xee\x1e\x1e\x4e\x7a"
- "\xd4\x4d\x9f\x85\xd2\xe8\x4d\xdf\x8c\xa6\x03\x42\xd3\xe8\x9c\xd0"
- "\x4c\x79\x6d\xf9\x89\xe4\xf7\x0f\x89\xbd\x75\x48\xdc\xde\xfe\x75"
- "\xac\xbd\xc9\x3a\x67\x7f\x89\x7d\x0b\x66\x4a\xef\x5b\x20\x6e\x6f"
- "\x7f\xe7\xeb\x9c\x15\xfe\xef\xc9\xb7\xb7\x7f\x3c\x6b\x6f\x43\x43"
- "\x86\xff\x01\xce\xde\x01\x83\xe4\xdb\xdb\x7f\x16\xb1\xf7\xdf\x87"
- "\xd3\x01\x3a\x44\xe7\xe8\xd4\x32\xdb\x22\xb9\xff\x37\x6b\x6f\x09"
- "\x7c\xf7\x9c\x45\xec\xcd\xee\x99\xe0\x2f\xb1\x67\xc2\x4c\xe9\x3d"
- "\x13\xc4\xed\xdd\x33\xc4\xb9\xbd\x7b\xfa\xc9\xb7\x77\x40\x35\xb1"
- "\xb7\x0e\xf0\xdd\x53\xc3\xd9\xbb\xa7\x8b\xfb\x0a\xf0\xed\x1d\x50"
- "\x4a\xec\x7d\x56\x0b\xf6\x06\x7c\xeb\x64\xe2\xbb\x67\xac\x73\x7b"
- "\xeb\x25\xf0\xfd\x78\x29\x6b\x6f\x16\xdf\x12\xfb\x35\xcc\x94\xde"
- "\xaf\x41\xdc\xde\x8f\xef\x70\x6e\xef\xc7\xd7\xca\xb7\xf7\xe3\x93"
- "\x58\x7b\x03\xbe\x1f\xcf\xe4\xec\x1d\xe8\x23\xdf\xde\x8f\x8f\x24"
- "\xf6\x3e\xd7\x87\x0e\xd0\x03\xbe\xf5\x32\xf1\xfd\x78\x55\x2b\xf6"
- "\x96\xc0\x77\xaf\x91\xc4\xde\xec\x5e\x11\xfe\x12\x7b\x45\xcc\x94"
- "\xde\x2b\x42\xdc\xde\xbd\xba\x38\xb7\x77\xe0\x2d\xf9\xf6\x0e\x3c"
- "\x4a\xec\xad\x07\x7c\xf7\x42\x9c\xbd\x7b\x25\xcb\xb7\x77\xe0\x3e"
- "\x62\xef\x7f\xa8\xc1\xde\x80\x6f\xbd\x4c\x7c\xf7\x1a\xef\xdc\xde"
- "\x61\x12\xf8\xee\xbd\x8f\xb5\x37\x8b\x6f\x89\x7d\x2a\x66\x4a\xef"
- "\x53\x21\x6e\xef\xde\xab\x9c\xdb\xbb\xf7\x5c\xf9\xf6\xee\x3d\x88"
- "\xb5\x37\xe0\xbb\x77\x02\x67\xef\xde\x75\xf2\xed\xdd\xbb\x0f\xb1"
- "\xf7\x3f\x95\x74\x40\x18\xe0\x3b\x4c\x26\xbe\x7b\x1f\x96\xb2\xb7"
- "\x2f\xd8\xfb\x24\x20\x00\x78\x47\xba\x35\x1b\x78\x8a\x45\x68\xf7"
- "\x8a\x24\x1d\xfa\xd9\x3d\x6c\xfb\x3e\xb9\x30\x56\xa7\xb7\xdb\x7e"
- "\x19\x8a\x3e\x6b\x3d\x5e\x3b\xac\xe8\x33\x59\x72\xed\xb0\xa2\xcf"
- "\x08\xd9\x6b\x87\x15\x7d\x10\xc7\x81\xfa\x8c\xe1\x7c\xda\x87\x89"
- "\x1f\xb2\xd6\x14\x2b\xfe\x9f\x51\x74\x1f\x0d\xc5\xff\x2b\xc0\x6b"
- "\x8a\xc1\xd7\x26\x6b\x8e\x3b\xdc\xa8\x4f\x61\xeb\xbe\xd6\xa9\xac"
- "\xd9\xc0\x91\x24\x7d\xdd\x6f\x3d\x8c\x5b\xed\xb7\x6f\x87\xa2\xdf"
- "\x22\xcf\x7d\xdd\x4f\x2f\xed\xeb\x7e\xfd\xe5\xfb\xba\x6f\x1d\xc7"
- "\xbf\xfa\x0d\xe5\x7c\xdd\x4f\xfe\xfa\x71\x45\xdf\x6a\xd1\xfd\x3c"
- "\x14\x7d\x37\x13\x5f\x9f\x9f\x65\xcd\x71\x87\x97\xf5\xcb\x74\xc1"
- "\xd7\xd0\xaf\x75\x4e\xfa\xb5\x26\x01\x7c\x9d\xde\x6e\xfb\x87\x28"
- "\x34\x33\x3c\xf7\xb5\x26\x58\xda\xd7\x9a\x6e\xf2\x7d\xfd\xd3\x2a"
- "\x8e\xfb\x69\xfa\x70\xbe\xd6\x1c\x90\xef\xeb\x9f\x96\x88\xee\x2b"
- "\xa2\xf8\x69\x12\xf1\xf5\xb7\xc5\xe0\x6b\x37\x38\xa1\x26\xb9\x75"
- "\x5f\xeb\xa1\x5f\xeb\x9d\xf4\xeb\x01\xb3\x60\xbc\x6e\xbf\x7d\x4c"
- "\x14\x03\xc6\x7a\xee\xeb\x01\x7e\xd2\xbe\xee\xdf\x28\xdf\xd7\xfd"
- "\x4f\x70\xbc\x73\x80\x8a\xf3\xf5\x80\x3c\xf9\xbe\xee\x7f\x48\x74"
- "\x7f\x13\x45\xff\x68\xe2\xeb\xea\x20\x6b\x8e\x3b\x7c\x74\x80\x24"
- "\xff\xe7\xf9\x1a\xfa\xb5\xde\x49\xbf\x0e\x1a\x0f\xbe\x4e\x6f\xb7"
- "\xfd\x54\x14\x41\xc3\x3c\xf7\xf5\x13\x16\x69\x5f\x3f\x71\x59\xbe"
- "\xaf\x9f\x38\xc0\x71\xde\x27\xea\x39\x5f\x07\xa5\xcb\xf7\xf5\x13"
- "\x05\xa2\xfb\xac\x28\x9e\x88\x20\xbe\xbe\x90\x0e\xbe\x76\x83\x0b"
- "\x07\x4d\x6b\xdd\xd7\x61\xd0\xaf\xc3\x9c\xf4\xeb\x27\x41\xd7\x87"
- "\xb5\xdf\xbe\x2e\x8a\x27\xfb\x7a\xee\xeb\xe0\xab\xd2\xbe\x0e\x3e"
- "\x23\xdf\xd7\xc1\x79\x1c\xdf\x0e\x36\x70\xbe\x7e\x32\x51\xbe\xaf"
- "\x83\x37\x8b\xee\xf7\xa2\x08\x1e\x49\x7c\xfd\x5d\x9d\x35\xc7\x1d"
- "\x1e\xfe\xe4\x68\x77\x78\xf8\xf2\x7c\xa4\x12\xfa\x5b\x1b\xd4\xbe"
- "\x5c\x5c\xdb\xcd\x73\x7f\x0f\x3c\x2f\xed\xef\x81\xc7\xe5\xfb\x7b"
- "\xe0\x66\x8e\x8b\x0f\xac\xe4\xfc\xad\x8d\x96\xef\xef\x81\xc9\xe2"
- "\x5c\x7c\xe0\x20\xcf\xb8\xb8\x76\xa8\x3b\x5c\xdc\xd1\xdf\x4f\xf9"
- "\xb7\x2f\x1f\x0f\xb1\x78\xee\xef\x90\x53\xd2\xfe\x0e\x39\x28\xdf"
- "\xdf\x21\xc9\x1c\x1f\x0f\x29\xe6\xfc\xfd\xd4\x34\xf9\xfe\x0e\x89"
- "\x17\xe7\xe3\x21\x7d\x3c\xe3\xe3\x4f\x69\xdc\xe1\xe3\x8e\xfe\x1e"
- "\xa4\x6c\x5f\x4e\xfe\xf4\x75\xcf\xfd\xfd\xf4\x11\x69\x7f\x3f\xfd"
- "\x9e\x7c\x7f\x3f\x1d\xcf\x71\xf2\xa7\x79\xf9\xef\x41\x63\xe4\xfb"
- "\xfb\xe9\x59\xe2\x9c\xfc\x69\x1f\xcf\x38\xf9\x20\xb5\x3b\x9c\xdc"
- "\xd1\xdf\x83\xeb\xdb\x97\x97\x0f\xbe\xe0\xb9\xbf\x07\xef\x95\xf6"
- "\xf7\xe0\x2c\xf9\xfe\x1e\x3c\x8b\xe3\xe5\x83\x0b\x38\x7f\xff\x4c"
- "\xfe\xfe\x99\x8a\xc1\x93\xc4\x79\xf9\x20\xb3\x67\xbc\xfc\x67\xc8"
- "\x1d\x5e\xee\xe8\xef\x21\x35\xed\xcb\xcd\x87\x94\x79\xee\xef\x21"
- "\x3b\xa4\xfd\x3d\x64\xad\x7c\x7f\x0f\x99\xc4\x71\xf3\x21\xbc\xfc"
- "\xff\xd0\x20\xf9\xfe\x1e\x32\x52\x9c\x9b\xff\xac\xce\x33\x6e\x3e"
- "\xc4\xe8\x0e\x37\x77\xf4\xf7\xb0\xb3\xed\xcb\xcf\x87\x1d\xf3\xdc"
- "\xdf\xc3\x36\x4a\xfb\x7b\xd8\x52\xf9\xfe\x1e\x36\x92\xe3\xe7\xc3"
- "\xd2\x38\x7f\x3f\xe3\x2f\xdf\xdf\xc3\x06\x89\xf3\xf3\xa1\xd5\x9e"
- "\xf1\xf3\x61\x06\xcf\xf3\xe4\xc3\x0f\x60\x6e\x2e\x77\xff\xc7\x8a"
- "\x44\x76\xcd\x9d\xe2\x19\x6e\xff\x47\xc5\x70\xe6\xdb\x2a\xa2\x7b"
- "\xcb\x28\x9e\xb5\x74\xe8\xfd\x1f\x15\xcf\x3a\xdf\xff\x51\xf1\xac"
- "\xbc\xfd\x1f\x15\xcf\x5e\x96\x3f\x1f\xff\xd9\x03\x9c\x46\x78\x96"
- "\xa7\xff\x87\x33\xfd\xba\x43\xef\x0b\xa9\x78\x56\xb8\x2f\xa4\xe2"
- "\x19\x66\x5f\x48\x7a\x93\x21\xc2\x3d\x2d\x32\xfc\xa8\xe7\xef\x05"
- "\x42\x37\x63\x1d\x22\x77\x1f\x4a\x0e\xdb\x23\x36\x72\xd8\x0e\x5d"
- "\x23\x8d\xed\xe7\xce\x77\xe8\x7d\x28\x15\xcf\xcd\x76\x8e\xed\xe7"
- "\x46\xca\xda\x73\x44\xf1\x9c\xfc\x7d\x6f\x14\xcf\x6d\xe6\xf4\xd0"
- "\x73\x3c\xfd\x1b\x5a\xda\x7e\xd8\x76\x73\x7f\x4a\xc5\x73\x09\x42"
- "\x6c\x8f\x48\x23\xd8\xbe\x54\xe8\x9e\xee\x0a\xcd\xf5\xfc\x3d\x48"
- "\x58\x2c\xd6\x5c\x72\xf7\xc3\xe4\xb0\xad\x9b\xcf\x61\x3b\x6c\x86"
- "\x34\xb6\xf5\x9f\x76\xe8\xfd\x30\x15\x7a\xbd\x73\x6c\xeb\x03\x65"
- "\xed\x65\xa2\xd0\xe7\xcb\xc7\xb6\x3e\x96\xd3\x7e\xfa\x7d\x1c\xb6"
- "\xc3\xf6\xb4\x23\xb6\xdd\x8c\xdb\xfa\x49\x42\x6c\xeb\x66\x11\x6c"
- "\xd7\x98\xdc\xd3\x98\x61\x89\x9e\xbf\xf7\x19\x35\x06\xeb\x4b\xb9"
- "\xfb\x72\x72\xd8\xfe\xf9\x0b\x1c\xb6\x47\x39\xec\x0b\xc5\x61\x7b"
- "\x64\x56\x87\xde\x97\x53\x31\x32\xc0\x39\xb6\x7f\x5e\x2f\x6b\x8f"
- "\x14\xc5\xc8\x55\xf2\xb1\x3d\x72\x0c\xa7\x73\x47\xa6\x73\xd8\x1e"
- "\xb5\xbe\xfd\xb0\xed\xe6\x7e\x9d\x8a\x91\x5a\x21\xb6\x7f\xae\x23"
- "\xd8\xfe\x61\x92\x7b\x7a\x7a\x54\x84\xe7\xef\xb9\x46\x6b\xb0\x96"
- "\x96\xbb\x3f\x28\x87\xed\x5f\xf4\xe5\xb0\x3d\xda\x4f\x1a\xdb\xcf"
- "\x2f\xea\xd0\xfb\x83\x2a\x7e\xe1\x7c\xff\x1f\xc5\x2f\x9c\xed\xff"
- "\x23\xb2\x56\xf8\x79\xf9\xfb\x5e\x28\x9e\xd7\x70\x9a\xfe\xf9\x68"
- "\x0e\xdb\xa3\xa3\xda\x11\xdb\x6e\xc6\xed\xe7\x95\x42\x6c\xff\xc2"
- "\x9f\x60\xfb\x6a\x81\x7b\xb9\x83\xd1\x83\x3c\x7f\xaf\xf7\xa2\x19"
- "\xe7\x0d\xe4\xee\x53\xca\x61\x7b\x74\x23\x87\xed\x17\xaf\x4b\x63"
- "\xfb\xc5\x09\x1d\x7a\x9f\x52\xc5\x0b\x65\xce\xb1\xfd\xc2\x3e\x59"
- "\x7b\xba\x28\x5e\x74\x63\x1d\xfc\x0b\x66\x2e\x7f\xf1\x22\x6f\xfe"
- "\xfb\x2f\x47\xb6\x1f\xb6\xdd\xdc\xbf\x54\xf1\x82\x41\x88\xed\xd1"
- "\x46\x82\xed\x1f\xeb\xdd\xcb\x93\xfc\x52\xe5\x79\x9e\xe4\x57\x2a"
- "\xe6\x1d\xa6\xcc\xfd\x52\x39\x6c\xff\xf2\x5c\xcb\xde\x44\x8a\xb1"
- "\x8d\xf6\xd8\x6e\xd9\x9b\x48\x31\xd6\xaf\xc3\xec\x97\xaa\x18\x93"
- "\xe3\x1c\xc7\x63\x12\xe5\xe5\x44\xc6\x34\xca\xc7\xf1\x98\x13\x5c"
- "\x4e\x64\x2c\x6f\xfe\xcb\xaf\x6c\xdf\x24\xbf\xff\x7b\x16\x29\xc6"
- "\xe6\x3b\xdd\xb3\x48\x31\x36\xf9\xbe\xed\xa3\xaa\x18\xb3\x47\xb0"
- "\x67\x91\xe2\x97\xa5\x56\xa6\x2f\xdc\x18\xef\x5e\x5e\xe5\x57\xfe"
- "\x9e\xe7\x55\x26\x90\xf7\xbb\x32\xf7\x6d\xe5\xfa\xc2\xaf\x2e\x72"
- "\x7d\x61\x82\xb7\x74\x5f\x18\xdf\xb7\xc3\xec\xdb\xaa\x18\xf7\x9e"
- "\xf3\xbe\x30\x2e\x4d\x5e\x0e\x65\xbc\x1b\xfb\xc0\x8c\xab\xe4\x72"
- "\x28\xe3\xfd\xb9\xbe\x30\x61\x5a\xfb\xf5\x85\xf1\x7b\x9d\xf7\x85"
- "\xf1\xe9\xf7\x6d\x3f\x57\xc5\xb8\x43\xc2\xbe\xf0\xab\x2a\xd2\x17"
- "\x8c\xa5\xee\xe5\x61\x26\xb8\xf5\xfe\x5b\xd8\x17\x26\x69\x98\x77"
- "\xdf\x32\xf7\x8f\xe5\xfa\xc2\x84\xeb\x5c\x5f\x98\xe4\xc0\xe7\xb9"
- "\xbe\xf0\xeb\x90\x0e\xb3\x7f\xac\x62\x62\x91\xf3\xbe\x30\x71\xb3"
- "\xbc\x9c\xcb\xaf\xfd\xe4\xf7\x85\x89\xbc\xf5\x4f\xbf\xe6\xad\x7f"
- "\x9a\x14\xd5\x7e\x7d\xe1\xd7\x9f\x3a\xef\x0b\xbf\xce\xbe\x6f\xfb"
- "\xca\x2a\x26\x16\x0b\xfb\xc2\x84\x1a\xd2\x17\xee\x44\xb8\x97\xb7"
- "\x99\xe4\x02\xff\x6f\x2d\x6f\x13\x3e\x88\x99\x17\x20\x73\x1f\x5b"
- "\xae\x2f\x4c\x6a\xe4\xfa\x42\x78\x5f\xe9\xbe\x30\x65\x44\x87\xd9"
- "\xc7\x56\x31\xf9\x88\xf3\xbe\x30\x39\x57\x5e\x8e\x66\x4a\x5f\xf9"
- "\x7d\x61\x72\x2d\x97\xa3\x99\x32\x88\xeb\x0b\xe1\xf1\xed\xd7\x17"
- "\xa6\x1c\x77\xde\x17\xa6\x14\xdc\xb7\xfd\x6d\x15\x93\x4b\x85\x7d"
- "\x61\x92\x91\xf4\x85\xbb\x67\xdd\xcb\xf3\x84\xeb\x3c\xcf\xf3\xbc"
- "\xa4\x63\xe6\x4c\xc8\xdc\x4f\x97\xeb\x0b\x11\xde\x5c\x5f\x78\x29"
- "\x44\xba\x2f\x4c\x7d\xa1\xc3\xec\xa7\xab\x88\x38\xe9\xbc\x2f\x44"
- "\x14\xca\xcb\xe9\x4c\x0d\x91\xdf\x17\x22\xea\xb9\x9c\xce\x54\x1d"
- "\xd7\x17\x5e\x4a\x6a\xbf\xbe\x30\xb5\xcc\x79\x5f\x98\xba\xef\xbe"
- "\xed\xb3\xab\x88\xa8\x12\xf6\x85\x70\x33\xe9\x0b\xa6\x48\xf7\xf2"
- "\x42\x2f\x8d\xf1\x3c\x2f\x34\x7d\x0c\x33\x9f\x44\xe6\xbe\xbe\x5c"
- "\x5f\xf8\x8d\x1f\xd7\x17\xa6\x4b\x7f\xe7\x41\x31\x6d\x72\x87\xd9"
- "\xd7\x57\xf1\x1b\xe7\xdf\x3f\x52\xfc\xc6\xc9\xf7\x8f\xc4\x72\x40"
- "\xd3\x46\xc8\xef\x0b\xd3\x10\x97\x03\x9a\xc6\x5b\xff\x37\x7d\x7d"
- "\xfb\xf5\x85\x69\xce\xbf\xff\xa0\x98\xe6\xc2\xf7\x1f\xdc\xdc\xef"
- "\x57\xf1\x9b\x1a\x61\x5f\xf8\x8d\x8a\xf4\x85\xa6\x6a\xf7\xf2\x48"
- "\xd3\x5b\xcd\xff\x63\x9d\xdf\xec\xef\x98\x47\x2a\xad\xd1\xa1\xa7"
- "\x67\xe2\xbe\xf0\xb2\xc9\x9c\x13\x9a\x8e\xf7\x17\xb6\x04\xb1\x7b"
- "\x50\xae\x65\xf7\x78\xa9\x37\x93\x3d\x28\x8d\x96\x96\x3d\x28\xc9"
- "\xde\x1f\x88\xc2\x6b\x81\xf1\x9a\x60\xb3\x9a\xec\x3f\x49\xe3\x39"
- "\x51\x78\x8e\xd4\xa5\x12\x66\x7f\x95\x64\x33\x3c\xfb\x95\x56\xf6"
- "\x9f\x8c\x32\xa0\xd2\xa8\xd5\xc8\xec\x57\x64\x24\xeb\x84\x5f\x4e"
- "\x67\xf6\x9f\x9c\x13\xd8\x3b\xe3\x3b\xe4\xef\x8b\xf7\x9f\x8c\xa2"
- "\xad\xa9\x06\xda\x58\x6e\x42\x50\x16\xec\x3b\xd7\xb6\x07\xe5\xcb"
- "\xb7\xf0\xb3\x9b\xe7\x68\x7b\xef\xfa\x4e\x62\x7f\x61\xc5\xcb\x6e"
- "\xec\x03\xfb\x72\x21\x97\xdf\x79\xb9\x96\xc3\xe8\x6f\x99\x31\x18"
- "\xce\xa7\x95\x46\x42\x8c\xd9\x64\x89\x6a\x76\x6b\xef\x8d\xdf\x2a"
- "\x5b\xf7\x19\x33\x47\xc4\x21\x7e\x71\x3e\x8b\xdc\x67\xce\xd1\x31"
- "\xfb\x1c\xbb\xee\x33\xef\xdb\xf7\xc7\x67\x91\x23\x5d\xf7\x59\xe4"
- "\xfb\x42\x9f\x89\xe5\x21\x22\xb7\xc8\xf7\x59\x64\x24\x97\x87\x88"
- "\xcc\xe3\x7c\x16\x59\x47\x7c\x16\x39\x9c\xf8\xcc\xba\xb9\xd9\xad"
- "\xfd\x3b\x22\x5b\x5d\xff\x8d\x75\x53\xb3\xbf\xa3\x2e\xe7\x7c\x36"
- "\x33\x0a\x7c\x96\x8e\xf7\x5b\x76\xdd\x67\x8f\x5d\xba\x3f\x3e\x9b"
- "\x61\x74\xdd\x67\x33\x67\xd8\xf9\x4c\x44\x2f\xcf\x94\xff\xcd\x4e"
- "\xc5\x4c\x1f\x4e\x2f\xcf\x8c\xe0\x7c\x36\xb3\x80\xf8\x6c\x46\x2d"
- "\xf1\x19\x7d\xb8\xd9\xad\x3d\x40\x66\xc6\xb7\xee\x33\xe6\x9d\xbe"
- "\x93\x7e\x36\xcb\xdf\x9c\xa3\x67\xf6\x7d\x76\xdd\x67\x7e\xdf\xdc"
- "\x1f\x9f\xbd\x52\xe8\xba\xcf\x66\x75\x13\xfa\x4c\x4c\xd7\xbd\x72"
- "\x57\xbe\xcf\x5e\x29\xe6\x74\xdd\x2c\x25\xe7\xb3\x59\xd3\x88\xcf"
- "\x5e\xc9\x63\x7c\x96\x81\x6a\x9a\xdd\xda\x47\x64\x56\xab\xf9\x2f"
- "\xcc\x43\x9b\xfd\x1d\x75\x0e\xe7\xb3\xd9\x25\xe0\xb3\x74\xbc\xff"
- "\xb4\xeb\x3e\x7b\x6e\xd3\xfd\xf1\xd9\xec\x48\xd7\x7d\x36\xfb\xb8"
- "\x9d\xcf\x44\xf4\xc7\xec\xbd\xf2\x7d\x36\x3b\x91\xd3\x1f\xb3\x0f"
- "\x73\x3e\x7b\x55\x45\x7c\x36\x3b\x82\xf8\x8c\x52\x37\xbb\xb5\x17"
- "\xc9\xec\xb3\xad\xfb\x8c\x79\x07\xeb\xa4\x9f\xcd\x49\x36\xe7\x84"
- "\x31\xfb\x60\xbb\xee\xb3\x57\x5e\xbc\x3f\x3e\x9b\xe3\xe3\xba\xcf"
- "\xe6\xac\x10\xfa\x4c\x8c\x27\xcf\x71\x63\x1f\xec\x39\x5a\x8e\x27"
- "\xcf\x89\xe7\x7c\x36\xe7\x28\xf1\xd9\x1c\x25\xf1\x99\x62\x64\xb3"
- "\x5b\xfb\x99\xcc\x91\xdc\xff\xcb\x19\x6f\xb4\xcd\xcb\xe7\xfc\x36"
- "\x77\x78\xc7\xe1\x8e\x51\x27\x5c\xf7\xdb\xdc\xc1\xad\x73\xc7\xb9"
- "\x01\xf2\xfd\x16\x65\xe0\xb8\xe3\xdc\x20\xce\x6f\x73\x13\x89\xdf"
- "\xa2\x8e\x7a\xc6\x1d\xe7\x8e\x76\x87\x3b\x3a\xfa\x6d\x5e\x5d\xc7"
- "\xe1\x8f\xf3\x92\x5d\xf7\xdb\xbc\xcb\xad\xf3\xc7\x79\x65\xf2\xfd"
- "\x36\x2f\x97\xe3\x8f\xf3\xaa\x39\xbf\xbd\x36\x88\xf8\x6d\x5e\xa2"
- "\x67\xfc\x71\x9e\xe4\xfe\x6f\xce\xf8\xa3\xa3\xdf\xa2\x0b\x3b\x0e"
- "\x87\x8c\x1e\xee\xba\xdf\xa2\xf3\x5b\xe7\x90\xd1\x1b\xe4\xfb\x2d"
- "\x3a\x82\xe3\x90\xd1\xd9\x9c\xdf\xa2\x6b\x88\xdf\xa2\x07\x79\xc6"
- "\x21\xa3\x0f\xb8\xc3\x21\x1d\xfd\x16\x33\xab\xe3\xf0\xc8\xf9\x75"
- "\xae\xfb\x2d\x66\x7a\xeb\x3c\x32\x46\xfe\x37\x8b\x15\x31\x2a\x8e"
- "\x47\xc6\x4c\xe2\xfc\x16\xc3\x7e\x83\x65\x7e\x8d\x67\x3c\x32\xa6"
- "\xd5\xfd\x3f\xc4\x78\xa4\xa3\xdf\x62\xfd\x3b\x0e\x97\xfc\x9d\x0c"
- "\xfe\x1f\x6b\xcf\xff\x45\xb8\xe4\xef\xdc\xe0\xff\xbf\x2b\xe6\xb8"
- "\x64\x2c\x8f\xff\xc7\xb2\xfc\xff\x77\x79\x9e\x71\xc9\x58\x17\xf8"
- "\xbf\x23\x97\x74\xf4\x5b\x5c\x69\xc7\xe1\x93\x71\xb3\x5c\xf7\x5b"
- "\xdc\xc9\xd6\xf9\x64\x9c\xfc\xef\x40\x29\xe2\x92\x38\x3e\x19\x77"
- "\x94\xf3\xdb\x02\x1f\xe2\xb7\xb8\x69\x9e\xf1\xc9\x38\xc9\xfd\x1f"
- "\x6d\x7e\xb3\xf8\x87\xa6\xd3\x22\x79\xc8\xb2\x58\x1d\xbb\x37\x61"
- "\x7c\x9e\x25\x20\x34\x5d\xee\xf7\x5d\x6c\x7b\x4e\x9f\x82\x1e\x7f"
- "\x49\x11\x3f\xc2\xb3\x7d\xa7\x17\x5e\xf6\x7c\xdf\xe9\x85\x07\xdb"
- "\xee\xfb\x2e\x0b\x77\xc8\xdf\x77\x7a\x61\x34\xc7\x41\x17\xee\xe1"
- "\x7c\x1d\xcf\xcc\x4f\x90\xb7\x1f\xf5\x42\xad\x67\xfb\x51\xc7\x0f"
- "\x26\xf8\x5a\x50\x4b\xf6\xa3\x8e\x0f\x6a\x9f\xef\xbe\x2c\xc8\xc6"
- "\xfb\x51\xd3\x19\xca\x58\xf7\xf6\x47\x8e\xdf\xd3\x3a\x9e\x75\x2a"
- "\x5a\x24\x47\xcb\xe1\x79\x49\xbc\x25\x40\x27\xfb\x3b\x33\x42\x3c"
- "\x2f\xf1\xf6\x0c\xcf\x8b\x3f\xf5\x1c\xcf\x8b\xd7\xb6\xdd\x77\x66"
- "\x16\xc7\xc9\xc7\xf3\xe2\xe1\x1c\x37\x5f\x9c\xc4\xe1\x79\xc9\x3e"
- "\xf9\x78\x5e\x64\xf2\x0c\xcf\x8b\x2d\x04\xcf\x8b\x0e\x13\x3c\x2f"
- "\xae\x6f\x9f\xef\xcf\x2c\x8a\x26\x78\xee\x74\xc0\xbd\xfd\xa7\x97"
- "\x24\xb9\x80\xe7\x74\x5a\x24\x7f\xcd\xe1\x79\xd9\x48\xc0\x73\xba"
- "\xdc\xef\xdd\x08\xf1\xbc\xf4\x9c\x67\x78\x5e\xba\xc1\x73\x3c\x2f"
- "\x9d\xda\x76\xdf\xbb\x59\xaa\x97\x8f\xe7\xa5\x4a\x4e\xb3\x2c\x1d"
- "\xcf\xe1\x79\x59\xb2\x7c\x3c\x27\x94\x78\x86\xe7\xa5\x65\x04\xcf"
- "\x09\xe9\x04\xcf\x4b\x4f\xb4\xcf\x77\x70\x12\x86\x13\x3c\xab\x4c"
- "\xee\xed\xef\xbd\x4c\x72\xff\x63\x0e\xcf\x7a\x15\x2d\x92\xdb\xe7"
- "\xf0\xbc\xc2\xc7\x12\xa0\x97\xfd\xdd\x1d\x21\x9e\x13\x3d\xfc\xce"
- "\x45\x62\x1b\x7c\xe7\x22\xd1\x83\xef\x5c\xd8\x7f\x77\x27\xb1\x8b"
- "\x7c\x3c\x2f\x3f\xcb\x69\xb9\xc4\x40\x0e\xcf\x2b\x26\xc9\xc7\xf3"
- "\xf2\x5c\xcf\xf0\x9c\xc8\x7e\xff\x62\x79\x24\xc1\x73\x62\x76\xfb"
- "\x7c\x8f\x67\xb9\x92\xe0\xf9\xb1\xd1\xee\xed\x9f\xbe\x22\xd0\x05"
- "\x3c\xa7\xd3\x22\xef\x3d\x38\x3c\xbf\x5e\x0d\x78\x4e\x97\xfb\xfd"
- "\x1f\x21\x9e\x5f\x5f\xe1\x19\x9e\x5f\x0f\xf6\x1c\xcf\x2b\x6f\xb5"
- "\xdd\xf7\x7f\x56\x9e\x97\x8f\xe7\x95\x85\x9c\xc6\x5d\xc9\x7b\xff"
- "\x9f\xd4\x47\x3e\x9e\x57\x7a\xf8\x5d\xa0\xd7\x17\x11\x3c\xaf\x64"
- "\xbf\x0b\xf4\x7a\x74\xfb\x7c\x17\x68\xc5\x59\x82\xe7\x6e\xe9\xee"
- "\xed\x4f\xff\x7a\x6d\xeb\x78\x0e\x53\xd1\x22\xef\x84\x38\x3c\xaf"
- "\xde\x67\x09\x08\x93\xfd\x1d\x22\x21\x9e\x57\x8f\xf5\x0c\xcf\xab"
- "\xee\x7a\x8e\xe7\x55\xc7\xdb\xee\x3b\x44\xab\xf6\xca\xc7\xf3\x2a"
- "\xdb\xfb\x3f\x88\xcf\xab\x78\xef\xff\x56\xbb\xf1\x7d\xa2\x55\x3a"
- "\xcf\xf0\xbc\x7a\x14\xc1\x73\x92\x89\xe0\x79\xf5\xf0\xf6\xf9\x3e"
- "\x51\x52\x21\xc1\xb3\x6f\xa5\x7b\xfb\xff\xaf\x6e\x75\xfe\x87\x58"
- "\x7e\xc3\x96\x97\xe2\x30\xbd\x26\xcd\xf3\x1c\xc7\x9a\x5e\x9e\x61"
- "\x3a\xf9\x94\xe7\x98\x4e\xce\x69\xbb\x1c\x47\xb2\x1b\xdf\xfa\x4b"
- "\x1e\xcf\xe5\x38\x92\x37\x73\x98\x5e\x53\x2c\x1f\xd3\xc9\x3e\x9e"
- "\x61\x7a\x8d\x1f\xc1\xf4\x1b\xa5\x04\xd3\x6b\x54\xed\x93\xe3\x78"
- "\x23\xc9\xb3\x1c\xc7\x9a\xcd\xee\xe4\x38\x1c\x31\x9d\x36\xcd\xf3"
- "\x3c\x47\xea\x75\xcf\x30\x9d\x9a\xef\x39\xa6\x53\xe3\xda\x2e\xcf"
- "\x91\x3a\x55\x3e\xa6\x53\xfb\x70\x79\x8e\xd4\x28\x0e\xd3\x69\xd9"
- "\xf2\x31\x9d\x62\xf0\x0c\xd3\xa9\x97\x09\xa6\x53\x0a\x08\xa6\x53"
- "\xab\xdb\x27\xcf\x91\x32\xc9\xb3\x3c\x47\x5a\x94\x3b\x79\x0e\x47"
- "\x4c\xbf\xa9\xf5\x3c\xd7\xb1\xee\xb8\x67\x98\x5e\xb7\xd4\x73\x4c"
- "\xaf\x1b\xd5\x76\xb9\x8e\x75\xc1\xf2\x31\xbd\xd6\xc8\xe5\x3a\xd6"
- "\x0d\xe7\x30\xfd\x66\xac\x7c\x4c\xaf\x3d\xe4\x19\xa6\xd7\x1d\x21"
- "\x98\x5e\x9b\x48\x30\xbd\xee\x40\xfb\xe4\x3a\xd6\x6a\x3c\xcb\x75"
- "\xbc\x39\xdc\x9d\x5c\x87\x23\xa6\x37\x98\x3d\xcf\x77\x6c\xc8\xf1"
- "\x0c\xd3\x1b\xc6\x7a\x8e\xe9\x0d\x7e\x6d\x97\xef\x58\xdf\x28\x1f"
- "\xd3\xeb\x79\xdf\xbf\xd8\xc0\x5b\xff\xff\xd6\x48\xf9\x98\x5e\x9f"
- "\xee\x19\xa6\x37\x6c\x21\x98\x5e\x3f\x9e\x60\x7a\xc3\xfa\xf6\xc9"
- "\x77\xbc\x59\xef\x59\xbe\xe3\xad\x56\xf7\xbf\x10\xcb\x77\x38\x62"
- "\x3a\xbd\xd2\xf3\x9c\x47\x7a\x9c\x67\x98\x4e\xef\xe5\x39\xa6\x7f"
- "\x7f\xb9\xed\x72\x1e\xbf\x2f\x93\x8f\xe9\xdf\xe7\x72\x39\x8f\xdf"
- "\xf3\xe6\x3f\x6d\x54\xcb\xc7\xf4\xef\x67\x79\x86\xe9\xf4\xb9\x04"
- "\xd3\xbf\xef\x43\x30\x9d\x1e\xd9\x3e\x39\x8f\xb7\x4a\x3c\xcb\x79"
- "\xa4\x57\xbb\x93\xf3\x70\xc4\xf4\xdb\x85\x9e\xe7\x3d\xde\x1e\xe5"
- "\x19\xa6\x37\x5d\xf7\x1c\xd3\x9b\x8e\xb4\x5d\xde\x63\xd3\x7b\xf2"
- "\x31\xbd\x29\x9e\xcb\x7b\x6c\xe2\xed\x7f\xff\x76\x8d\x7c\x4c\x6f"
- "\x1a\xea\x19\xa6\xdf\x1e\x41\x30\xbd\xd1\x48\x30\xfd\xf6\xa0\xf6"
- "\xc9\x7b\x6c\xcc\xf3\x2c\xef\xf1\xb6\xc3\xfc\xb7\xe5\xf3\x17\x47"
- "\x6b\x96\xc4\xc4\x2c\x9f\x9f\xa8\x59\x1e\x1f\xf7\xda\xfc\x51\xc1"
- "\xb6\xff\x8f\x1a\x9a\x14\x9c\xd4\x15\x45\x2f\x9a\x3b\x67\xe5\x33"
- "\xdc\xc9\xf8\xf9\x8b\xe1\x9f\xae\x28\x76\xee\xf2\x58\x4d\xe2\xaa"
- "\x84\xf9\x1a\xfc\xbf\x45\xaf\x25\x40\x91\x25\x89\xdc\x91\x97\xe6"
- "\xc7\xcf\x4d\x8a\x5b\xfc\x3b\xcd\xdc\xf8\xb8\xdf\x2d\x5e\x34\x7f"
- "\x71\xa2\x66\xd9\xfc\xa5\x2b\xe2\x96\xcd\xc7\x7f\x2f\xd7\xc4\x2c"
- "\x59\x06\x07\x5e\x9b\x1f\xb7\x72\xbe\x66\xde\x8a\x98\x98\xf9\xcb"
- "\x96\x77\x45\x93\x57\xc4\x27\xc6\x25\xc4\xcf\xd7\x8c\x99\xfc\xc2"
- "\xe0\x69\x63\x7f\x33\xed\xf9\xe7\xbb\x22\xde\xb7\xa7\x35\x74\xf6"
- "\xcc\x4c\xc0\x90\xf2\x8a\xe2\x7f\x2e\x97\x07\x22\xb4\x05\xb0\xb9"
- "\x75\x19\x52\x6f\x5a\x86\x94\x1b\x6f\x23\xd5\x96\xdb\xc8\xc7\xba"
- "\xcd\xaa\xd2\x2c\x40\xa3\x69\xbf\xe5\xea\xad\xb7\x91\xbf\x35\xeb"
- "\xa3\x28\x3a\xeb\x23\x8d\xd1\x2f\x5b\x8d\xcb\xd2\x7e\xef\x8c\xc7"
- "\xc7\xc1\x17\x4a\x3a\xab\xa8\xf2\x92\xe2\x7f\x0a\xe1\x9c\x31\xf5"
- "\x2a\xa2\xe8\xee\x5b\xd4\xfb\xad\x46\xea\x38\xce\xb2\x81\xad\x90"
- "\x22\x43\x0b\x3f\x7f\xf8\x9d\x80\xdf\x59\xa4\xd8\xaa\x81\xdf\x78"
- "\xf8\x45\xc0\xef\x28\x52\x64\x22\xf8\x0d\x85\xdf\x48\xf8\xc1\xb1"
- "\xcc\x68\xf8\xc5\x23\x45\x16\x1c\xcf\x82\xb2\x59\x70\x2e\x6b\x3c"
- "\xa9\x27\x0b\xce\x67\x55\xc2\xcf\x84\x14\xdb\xd4\xf0\x83\x3a\xb7"
- "\xd5\x20\xc5\x3b\x09\xf0\xaf\x19\xfe\x55\xc1\x0f\x8e\xbf\x33\x08"
- "\x7e\xb8\xec\x34\x72\x2e\xbb\x0f\xfc\x22\xe1\x97\x04\xbf\x6c\xf8"
- "\x95\xc0\xaf\x1a\x7e\xb5\xf0\x33\x22\x45\x0e\xb4\x2f\x07\xca\xe4"
- "\xc0\xbd\x72\xe0\x5c\x0e\xdc\x23\xa7\x1e\x29\xb6\x4f\x82\xdf\x01"
- "\xa4\xf8\x1f\x25\xfc\x0a\xd9\x1f\x1c\xfb\x9f\x34\xde\xff\xf3\x78"
- "\x7f\x8b\xfd\x8e\xfa\xae\xfd\xa9\xa1\xf8\x29\x33\xf4\xdb\x8c\x0d"
- "\xf4\x3a\xa4\xa0\xb3\xb2\x8d\x09\x4f\x21\xaf\x6b\x8a\x8c\xa9\x15"
- "\xeb\x11\xc4\x9b\x8f\x34\xc5\xab\x9b\xf0\xf9\xa9\xd8\x66\x0d\x19"
- "\x19\x11\x06\x14\x6f\xc4\xfd\x53\x1e\x3e\x33\x22\xd8\xeb\x33\x0d"
- "\x5e\x3e\xcc\xb7\xc4\xe9\x6d\xba\xa1\x74\x6a\xe4\x4e\xbc\x0e\x17"
- "\xea\xd7\xe2\x75\xba\x74\x66\xe8\x1e\x5a\xfd\xcc\x48\x1c\x63\x8a"
- "\x57\x33\xed\x0a\x21\xfd\x11\xce\x43\xdb\x8c\x7e\x56\x15\xf4\x3f"
- "\x25\xfe\x3f\x0d\x3e\xa7\x0b\xe6\x27\x91\xb8\x93\xc1\xe8\x97\xa6"
- "\x80\x29\xc5\xf8\x5c\xe3\xfb\x03\x13\xe8\xc2\x30\x55\xf1\xe2\x26"
- "\x54\xa3\xc8\x08\x86\x67\xa3\x20\x06\x52\xf4\x93\x03\x13\xac\xdb"
- "\xa7\x14\x1f\x01\x1c\xe0\x72\x7f\x49\xa9\xc5\xff\x06\xe1\xf3\x74"
- "\x76\x78\x3a\xce\x03\x15\xa7\xfc\x01\xe2\x72\x46\x48\x53\xc0\xfc"
- "\x28\xcd\x4b\xbe\xf4\x25\xd2\x36\x5c\xee\xa8\xad\x2d\x4d\x7e\x56"
- "\x35\xae\x9f\xd6\xc4\x68\xe0\x9c\x12\xda\xa6\x86\x76\x78\xdd\x80"
- "\xeb\x68\x68\x63\xf1\x4b\xf8\xbe\x5b\x3f\x85\xb6\x52\xa9\x53\xa1"
- "\xee\x3f\xc4\x68\x3e\x5e\x6d\xa2\xf0\x39\x6b\xa6\x15\xe3\xdd\x87"
- "\xce\x78\xdb\xf8\x6e\x0f\xa4\xdc\xbd\x0d\xa1\x5d\xdb\x90\xaa\x21"
- "\x63\xeb\x3e\x83\xb2\xef\x51\x12\xfb\x32\xb4\x14\x94\x31\x28\xb6"
- "\xa6\xc3\x73\x1a\x99\x7b\xf9\x4f\x44\x4e\xee\xd5\xd8\x72\xaf\xed"
- "\x13\x11\xbe\x17\xb1\x91\x55\xc5\xda\x8a\xa9\xc3\x5a\xa8\xd5\x60"
- "\xfb\x61\xdb\xd9\xea\xb0\x66\xb5\xd4\xd1\x0b\x5f\x0f\xf7\xac\xa3"
- "\x3f\xd0\x6a\xac\xdb\xa7\x6a\xe0\xda\x12\x7c\xde\x77\x2d\xaa\xa7"
- "\xe1\x5f\x7c\x7f\xd6\x17\x6a\x9a\x4a\x43\xb8\x7e\x9a\x3d\x06\xd8"
- "\x51\x1b\x14\x99\xc3\xad\xeb\x34\x08\x8f\x4d\x75\x8a\x4c\x26\x37"
- "\x41\xab\x75\x26\xe2\xe3\xcc\x2d\xab\x2a\x69\x2b\xfc\x2c\x43\x2a"
- "\x91\x57\xf1\x4b\xd8\xbf\x99\xfb\x34\x53\x3a\x83\x8d\x33\x8b\x5a"
- "\x6c\xdb\x3f\x26\x10\xec\xa3\xde\xdd\x03\xfa\xfb\x5b\xde\x26\x9a"
- "\xd2\x20\xec\x1f\x6c\x2b\xb0\x13\x82\xe3\x2a\x8c\xd3\x86\x8c\xcc"
- "\x6a\x3b\x7b\xa9\x27\x4e\x4d\xa5\x79\x75\xbf\x4f\x13\xbf\x69\x49"
- "\xf9\x2c\x1f\x83\x57\xa7\xa1\xb8\xbc\x66\x00\x83\x99\x10\xd6\xaf"
- "\x0c\xb6\xb0\xfd\xe8\x80\x99\x99\xf8\xff\xd3\x43\x90\xda\xb7\x12"
- "\x51\x9a\x94\xa0\xc3\x04\x0b\xe1\xe9\x36\x9c\x30\xcf\xb8\xfd\xe7"
- "\x55\x96\x75\x30\xd6\xb6\xe0\x2f\x2b\xdd\x92\xa5\x33\x36\x05\x44"
- "\x8c\x6e\xcc\x99\x80\xe8\x4c\x9d\x11\xaf\x3f\xbf\xa4\xc8\x5a\xcb"
- "\xd8\x60\x9d\x0a\x91\x76\xe8\xea\x53\xe2\x69\x63\xca\x2d\xb8\x57"
- "\xcf\x88\xd1\x7f\x59\x69\x04\x7f\x4d\x40\x18\x0f\x47\xee\x99\x28"
- "\xbc\x27\x20\xdd\x7d\x73\x8f\x5d\xf0\xac\xf9\x80\x09\x78\x56\x84"
- "\xeb\x85\xb6\x97\x70\xcf\x9a\x15\x8f\xb1\x41\x67\xea\x55\x2c\xf6"
- "\xb5\xd0\x2e\x2f\x3a\x4b\x0f\x18\xca\x32\x1a\xbc\x0e\x26\xda\x6c"
- "\xc2\xdc\x9b\x2b\xc7\xf6\xa5\xac\x1a\xa3\x9f\x5e\xd5\xbc\x92\xae"
- "\xdc\xfa\x2d\xd4\xbf\x0e\xd1\x4d\xf7\xe8\xd2\xe4\x08\xda\x94\xf1"
- "\x32\x9e\xe7\x58\x8d\x52\xe7\xa2\x3e\x8f\xad\xa5\x8d\xe1\x16\xe4"
- "\xfb\x58\xb5\x2f\x5d\x16\x51\xcd\x7c\x1b\x21\xb9\x92\xae\x2d\x4f"
- "\x38\x8a\x92\x2f\x23\x9f\x35\x71\xc8\x3f\x35\x02\x9e\xa5\x94\x36"
- "\x55\x24\x55\xa3\xf2\x7a\xf8\x25\x94\x41\xb9\x73\xf0\x3b\x8a\x52"
- "\x57\x21\xe5\x14\x18\xf7\x52\xee\x22\x9f\xf2\x84\xbb\x70\xec\x3a"
- "\x4a\x8e\xa2\xcd\x65\xa5\xb8\xdc\x49\x14\x6e\x36\xfa\xae\xb9\x0e"
- "\x3e\x7d\x19\xaf\xe9\xbe\x80\x76\x43\x5b\x9a\xfc\x3e\x8a\x68\xcc"
- "\x2a\xaa\xba\xb3\x92\x36\x37\x64\x6c\x3b\x6a\x40\x61\x69\x82\x67"
- "\xc1\x6d\x6e\x42\xb8\x1f\x78\xe1\x32\xd6\x9c\x71\x86\x39\x66\x1c"
- "\x5f\xb6\x1d\x00\xde\x81\x6c\xe7\xf1\x39\x63\xc0\x38\x03\x1c\xaf"
- "\x0e\x37\xd3\x0d\xd8\x3e\xf8\xb9\xc1\x46\x4a\xf6\xf9\x95\x8a\x04"
- "\xa4\x6c\xc8\x78\x47\x63\xf0\x3a\x14\x81\xef\x01\x75\x76\x82\xfb"
- "\x1c\xc2\xd8\x60\xcf\x8d\x34\x78\x7d\x92\xcb\xe1\x65\x2b\x60\x91"
- "\x29\xa3\x25\xb1\xec\x9d\x59\x06\xaf\x3f\x15\xf0\xf0\x84\xf1\xd1"
- "\x72\x9e\x1d\xcf\xf0\xf1\xa3\x56\x1c\x5b\xd5\xcf\xa8\x2d\x01\xe1"
- "\x99\xd0\x67\x0a\xe8\x3b\x81\x3e\x34\x45\x9b\xa6\x98\x69\x93\x35"
- "\x27\xcc\x00\x63\x96\x4f\x85\xb9\x1e\x91\xf2\xd9\xe0\x4b\xeb\x1e"
- "\x32\x87\xf4\x9d\xab\xb8\x4e\xe0\x36\xa3\x33\x6e\x23\x75\x78\x25"
- "\x8d\xdb\xa0\xb4\xe6\x74\xd6\x64\x2c\x43\xfe\x74\x4e\x78\x9a\x35"
- "\x60\x62\x66\xe3\x7b\xf3\x13\x70\x8c\xc5\xf8\xa5\x33\xe1\x5a\xb6"
- "\x1e\xb8\xaf\xb7\x41\xf1\x4e\xb1\x15\xae\xa7\xb3\xc3\x0c\x6c\x7b"
- "\x98\x78\x48\xe2\xe8\x3b\xc5\x74\x30\x9c\xcb\x7c\xc6\x1f\xce\x79"
- "\x5f\x52\x64\x4f\x82\xe3\x80\xdf\x67\x26\x15\xa7\xdc\xc6\x75\x4c"
- "\x25\x18\x7a\x46\x2d\xf8\x3f\x85\xed\x99\x39\x06\xf7\x7f\xc2\x43"
- "\xb3\x97\x72\xfd\x8e\x79\x5e\xa6\x5f\x35\x05\x84\x01\x76\xb3\xd7"
- "\x1b\xbc\x7c\x67\xb1\x36\xf6\xaa\x27\x31\xa9\xc4\xfa\xde\xfc\xa4"
- "\xaf\x60\x54\xf8\xaa\x14\x21\x28\xb3\xc7\xe0\xe5\x97\xc0\xd9\x32"
- "\xfb\x38\x2e\xcb\xb4\x13\xfa\xa6\x75\x1d\x3b\x06\xc0\x35\xd0\x6f"
- "\x86\xe2\x98\x43\x62\x5b\xf6\x51\x1c\x77\xa0\x7f\xe6\xb2\x71\xdf"
- "\x04\xed\x9a\x46\xf7\x88\x1f\x0d\xed\x4a\xbb\xc4\xb6\x85\xdf\x36"
- "\x5b\x9c\xa1\xb3\xe2\x8b\x49\x59\xbd\xba\x21\x23\x47\x6b\xf0\xea"
- "\x31\x9e\x8f\x35\xf2\x5c\x39\xf9\x43\x4a\xe1\x6f\xe0\x25\xb6\xba"
- "\xa0\xaf\xaa\xa0\x8f\x3e\x85\x31\x85\xfb\xe7\x8e\x6d\x98\x6b\xc4"
- "\x97\x34\x66\xc5\x57\x42\x3d\x09\xb6\x7e\x6a\x5d\x49\x57\x81\x5f"
- "\x91\xf5\x1e\x7d\x76\x2b\xf8\x32\xdc\xa2\xa0\xe7\x58\x06\x21\xe0"
- "\xad\xe6\xdd\x70\x7c\xf7\x4a\xcc\xfb\xb6\xed\x83\xbe\xac\x12\x2f"
- "\xab\x44\xb8\x1c\x53\x9e\x2d\xdb\xe4\x17\x5f\xc2\xb4\x99\x52\x58"
- "\xa1\x7d\x5e\xb6\x36\x35\xf9\xe9\xa0\xbf\xe4\xd4\x19\xbc\xd0\x2c"
- "\x41\x7f\xd9\x36\x6c\x28\x4d\x47\x62\x5c\x29\xae\x28\xb6\xfb\xc1"
- "\xbf\x9d\x59\x1c\x3f\xf6\x15\xf0\xda\x31\x93\xa1\xaf\x80\xbf\xdf"
- "\xed\x49\x83\x9f\xb6\x0f\x32\xa0\x57\xa7\xe1\xeb\x37\xc1\xff\xf1"
- "\x71\x5c\x06\x8e\x8f\x31\xa0\x39\x63\x48\xbd\x99\x91\xd8\x7f\x76"
- "\xf5\xc6\x91\x7a\x99\xb6\x3c\x86\xeb\xc4\xd7\xe1\x3a\xf3\xb7\xd3"
- "\x75\xb8\x1e\xa8\x23\xdd\x56\xf7\x16\x38\x66\xab\x7f\xcc\xa2\x96"
- "\x7b\xec\x81\xf3\xa5\xfc\xb6\xef\xd8\x4e\xd7\xb3\xed\x3a\x61\x40"
- "\xbf\x63\x34\xc1\x46\x38\x86\xaf\x25\x18\xd9\x7e\x11\xe3\xc7\x40"
- "\x9e\x47\x41\x70\xb4\xdd\x68\x40\xf3\xf9\x7d\x32\x04\xfc\xd4\xcd"
- "\x36\x06\x90\xfa\xfe\xc7\xdf\x56\x1f\x57\x17\xa9\x83\xce\x5c\x74"
- "\x80\xed\x23\xb8\x2f\xfb\xe0\xfa\xa1\x3c\x3c\x7f\x54\x2d\xfb\xfc"
- "\x63\xea\x09\xe6\xc1\xf6\xcc\x35\x04\x0f\x19\x9b\x75\xb6\xb1\x1c"
- "\x7c\x61\x82\x6b\x92\xec\xc6\x26\x15\x1c\xaf\x65\xeb\xcb\x06\x3f"
- "\xf5\xe1\x3f\x2b\x19\x53\xc2\x0f\x60\x4c\xb1\xf7\x9f\x8a\xdb\x6b"
- "\x3b\x0f\xf7\x50\xc2\x3d\x26\xe2\x7e\x80\xef\x61\xcd\x19\x9f\x00"
- "\xf5\xd8\x8f\x7f\x4a\x5c\xce\x9a\xb1\x39\x15\x8f\x93\xef\xf4\xa4"
- "\x6b\x1b\x32\x72\x91\xad\x0c\x3e\x0f\x36\xff\x05\x1c\x83\xe7\x5f"
- "\x18\x84\x8f\x65\x40\x19\x83\x62\xb3\xe4\xda\x99\x94\xfe\x88\xaa"
- "\xc8\x33\x60\x5d\x89\xfb\xfc\xc8\x8a\x3e\xf5\xa8\x22\xcf\x8a\xac"
- "\x1f\x68\x0b\x46\xa7\xd0\xc5\x57\x14\xb9\x59\xe5\xa6\x5a\x24\x8f"
- "\x0b\xe6\x32\xdf\xbf\xa2\x9b\x40\xff\x24\x3f\x83\x30\x37\xb8\xa1"
- "\xd8\x71\xbc\xc2\x78\x9b\x89\x7f\xf0\x37\xc3\x05\xde\x01\xbd\x84"
- "\x35\x13\xe8\xe2\xd8\x4c\x8a\xe8\x26\x2b\x94\xdd\x85\x8f\x63\x4d"
- "\x05\x7a\x6e\x37\xef\x1c\xfd\xc1\x40\x0d\xb1\xdd\x8e\x55\xcc\x78"
- "\x88\xdb\x6b\x1e\x57\x8c\xdb\x6c\x2d\x1c\xa8\xc1\xcf\x90\x9a\x44"
- "\x5b\x2b\xcc\x0d\xc5\xe5\xf5\x16\xa4\x59\x89\xf5\xde\x8e\xe9\xe1"
- "\xf9\x88\x86\xf8\x28\x53\xb3\xee\xd0\xe0\x7b\x82\x26\xbe\x61\x0c"
- "\x1e\xa8\x49\xb5\x20\x6a\x6b\x8a\xb7\xea\x97\x79\x74\xf1\x9d\x27"
- "\xb5\x05\x0d\x19\x3b\x92\x8e\x27\x21\x24\x9f\x27\xef\x48\xb2\x3d"
- "\xfb\x2e\xf6\xd9\xc1\x5e\xcc\x9c\xfd\x21\xb9\x69\xcc\xf3\x42\x19"
- "\x49\x7f\xd1\xeb\x7c\xe9\xaf\xf2\xcc\x68\x79\x1e\xdd\xb4\x3c\x1f"
- "\x51\x96\xed\x23\xa3\x3e\xde\x55\x85\x63\xfd\x68\x9b\x3d\x19\xdb"
- "\x99\x8d\x28\x21\x05\xa9\xaf\x29\xde\x9d\x11\x9e\x9c\xc6\x7c\x3f"
- "\xe9\x0b\x28\x27\xaf\xad\xef\x32\xdf\xaf\x2a\x07\x8d\x1d\x6e\x4e"
- "\xa5\xc9\x78\xf5\xee\xda\x29\x6c\x7d\xf8\x9c\xcd\x7f\xbb\x58\xed"
- "\xeb\xc6\x3d\x24\xd7\xbf\x3a\x79\x56\xb5\xf8\xb3\xee\x1c\xeb\xfe"
- "\xb3\xee\x54\x3b\x3e\xeb\xce\x45\x6d\xfb\xac\x3b\x25\xbf\x7f\xe0"
- "\xe4\x59\x35\xe2\xcf\x9a\x37\xcc\x83\x67\x35\x3b\x3e\x6b\xde\x8c"
- "\xb6\x7d\xd6\x3c\xc9\xf7\x7f\x4e\x9e\x75\xa8\xf8\xb3\xe6\xf7\x75"
- "\xff\x59\xf3\x6a\x1d\x9f\x35\x7f\x6c\xdb\x3e\x6b\xfe\x24\xc9\x67"
- "\xa5\x7c\x69\x1c\x9f\x20\x2e\x35\xa5\x34\x02\xcf\xdb\xfe\xd2\xd0"
- "\x35\xef\x21\xaa\xb4\xde\x84\xca\xfb\x54\x61\x0e\x4d\xfd\x2c\x01"
- "\x61\x1e\x37\x92\xde\x66\xd5\x94\xe7\xd5\xc1\xf1\x2b\xa8\x2c\xc9"
- "\x84\x46\x2f\xc3\xf1\x77\x97\x5f\x45\xb4\xdc\xf8\x9b\x5f\xdd\x12"
- "\x7f\xcd\xcf\xb0\x31\x77\xf7\xa8\xf2\xba\x26\x84\x9f\x1f\xfe\x0e"
- "\x69\x89\xbf\xeb\x88\xbd\xed\xe3\x2f\xb6\x47\x85\xc9\x24\x88\xbf"
- "\x64\x0d\xd5\xae\xbb\xf6\xb1\x37\xe3\x1a\x42\xe2\xb1\x77\xd7\x19"
- "\x1c\x7b\x77\xc1\x79\x79\xed\xdf\x95\x67\x8b\xbd\x99\x70\x4f\x7e"
- "\xec\xfd\x2a\x1a\x8f\xaf\xbb\xea\xdd\x8b\xbd\xbb\xea\x6d\xcf\x9d"
- "\xcf\x3e\x37\x1c\x8b\x14\xc6\xde\xdd\x92\x7b\x5d\xf2\x71\x4b\x6f"
- "\x0f\x1d\xfd\x71\x3f\x93\xb7\xb5\x30\x24\x0a\x8f\x6f\x0d\x60\x93"
- "\x3f\xef\x32\x29\xaf\x28\x76\x33\x6b\x21\xee\x34\x44\x7b\xd1\x85"
- "\x5a\x55\x78\x22\xfd\x3d\x1d\x1c\x12\x85\xf3\x98\x58\x8f\xc3\xf9"
- "\x8b\xf4\xfb\x5a\x95\xbc\x76\x93\x3a\xe9\x0f\x9e\x2c\x48\x81\xfe"
- "\xf2\xf1\x4a\x13\x65\x7d\x23\xd2\x17\xfc\xa0\xa6\x73\x7e\x9e\x46"
- "\xbf\xe5\x5f\x7c\x27\x27\xc2\x78\x52\x7b\x19\xe1\xb2\xf4\x5a\xe5"
- "\x48\xf7\xdb\x5f\x10\xef\xbc\xfd\x05\xef\xc9\x6f\x3f\xa9\xd3\xb5"
- "\xf6\x17\xc4\xbb\xd4\xfe\x9e\xd0\xfe\x26\x9d\x37\x68\x43\xea\x8b"
- "\x26\x9d\x52\x66\x7b\xcc\x2e\xf9\xd8\xa3\x7b\xbc\xe7\x72\xfc\xa3"
- "\x7b\x8e\x4f\xfb\x78\x97\x91\x82\x18\xc0\x8c\xe1\xb8\xef\x91\xf8"
- "\x57\x0b\x31\xeb\x7b\x9a\xc4\x24\xa3\xcc\x98\xf4\x9e\xc1\xf5\xfb"
- "\x8f\x34\xb4\xfd\xfd\xff\x20\xfd\xfc\xf6\x31\x71\x7f\x58\x9a\x64"
- "\x4c\xdc\xfe\x73\x83\x63\x4c\xfc\xdf\x60\xf9\x31\xf1\x0f\x46\xc7"
- "\x98\x58\x38\x95\x8b\x89\x85\xa3\xdc\x8f\x89\x85\x5d\x5c\x8f\x89"
- "\xff\x7b\xd9\xbd\x98\xf8\xbf\x07\x9c\xc7\xc4\x42\x95\x7b\x31\xb1"
- "\x50\xe5\x18\x13\xff\x37\x5e\x18\x13\x0b\x47\x4b\xfa\x32\x53\x63"
- "\x82\x31\xda\xe7\x9a\xe2\x7d\xb5\x79\x1d\xe8\x96\xcc\x1d\xaa\x70"
- "\x0b\xdd\x40\x67\x69\x4c\x56\x6a\x38\x8e\x2b\xa3\x1b\x1a\x62\x55"
- "\xd6\xd7\xb5\x3e\x74\x8f\x61\x9f\xd3\xcd\x81\x08\xec\x14\x04\xed"
- "\xf7\xa5\x1b\xb4\xdd\xe9\xd7\xb5\x3d\xf2\xee\x21\x7f\xf8\x05\xe6"
- "\xb1\xe3\x31\xfc\x3d\x94\x7e\x3d\xb0\x6b\xc6\x4a\x34\xc8\xb7\x1e"
- "\xa9\xa0\x0d\x91\xbe\x6b\xd5\x08\x62\x90\x3f\xfe\x9b\x5e\x57\x10"
- "\xbb\xfb\x1e\x52\xfa\x26\x81\x6f\xfc\xe0\x7e\x49\xbe\x34\xbd\x5c"
- "\x8b\x76\x2f\x03\x9d\x4d\xa1\xc0\x5d\x14\x7d\xc0\xdc\xa0\xa5\x2c"
- "\xfe\xe1\x05\xc4\x3f\xef\x9f\xa0\x7b\x82\xf6\xca\x0e\x8f\xb7\xf6"
- "\x0c\x9f\x66\x49\x8d\x55\xd0\x6f\x44\x2a\x70\x5b\x2d\xd9\xe1\x11"
- "\xf4\x76\xf8\xa5\xc6\x76\xc7\x1c\x1a\x74\xf8\x50\xba\x21\xb0\x2b"
- "\x68\xf4\x41\xbb\x56\xa2\xa0\xfc\x7b\x48\x4b\xdf\xd1\x52\xe0\xff"
- "\x48\xfc\x1d\x52\xb0\x51\xa4\x95\x2a\x88\x85\x73\x4a\x1c\x13\x69"
- "\x7c\x7f\x33\xdc\xbf\x19\xee\xdf\x84\xb1\x8d\x02\x77\xc3\xfd\x2d"
- "\xaf\x6b\x65\xf6\x97\xf7\x33\x19\x7c\xb2\xed\xb2\x0e\x7a\x31\x8d"
- "\xde\x0f\x3f\xdc\x2e\xb0\xe1\x6e\x6c\x93\x9f\xbd\xb8\x1e\xb7\x6d"
- "\xcb\x3d\x34\x08\xda\x19\x04\x6d\xd0\xc2\x7d\xf1\x1e\x2e\x91\xaf"
- "\x2e\x55\x63\x8c\x0a\xda\x66\xc9\x62\xdb\x76\x13\xda\x76\x83\x6b"
- "\x1b\xbe\x17\xb6\x8f\xd4\xfb\xd1\xf0\x35\xfd\x70\xdf\xfc\xc1\x37"
- "\xa9\xf3\x78\xfc\xae\xf4\xce\x1b\xb1\x32\xb1\xfa\xc1\x2c\x29\xbc"
- "\x6c\xdd\x8f\xfa\xd0\xea\x77\x74\x53\x36\x7c\x4f\x87\x43\x14\xde"
- "\xb0\x1f\x0d\xaa\x80\x7e\x5d\x6e\xba\x8e\x68\xbf\x77\x74\x27\xb5"
- "\x75\x72\xef\x55\x22\x75\xaf\x4d\xeb\xe8\xca\xe6\x20\x9c\x17\x8b"
- "\xa8\xdd\x4a\xd1\x49\x4d\x41\x5a\xf5\xe9\xb3\x4d\x68\x4e\x12\x7e"
- "\x1f\x4b\x27\x69\x66\x22\xd5\x25\x45\x51\x72\xea\x79\xfc\xee\xe8"
- "\xc3\x49\xc2\x77\x47\x1f\x26\x20\xc5\x5e\x7f\xa4\xf8\xe3\x18\xa4"
- "\xf8\xa8\x14\x41\x39\xbb\x9f\x32\x7c\x6f\x3f\x94\x62\xa6\x7f\xa0"
- "\x33\xe9\xc8\x0c\x8a\x36\x85\x87\x78\x19\x8a\x57\xe2\x77\x29\x7b"
- "\xbb\x81\xfd\x7e\x84\x71\xd5\x17\xff\x8d\xeb\x4b\x58\x86\x7e\x72"
- "\x4d\xb1\xd7\xc7\xb7\xbe\xf3\x78\xb3\xff\x54\xb5\x99\x8e\x44\xcd"
- "\x9a\xf9\x09\x8d\xd9\xe1\x69\xcd\x38\x6f\x37\x0f\xc7\xa0\x3d\xde"
- "\xbe\x5e\x69\x88\x06\xff\xd3\x74\x20\x7e\x9f\x18\x99\x07\x3f\xec"
- "\x4b\xc6\x8f\x3d\x42\xa3\xb1\xbf\x71\x5f\xd8\x4d\x8e\xab\x71\x7f"
- "\xd8\xca\xf6\x1b\xa3\xe2\xa9\x28\x0b\x85\x90\x05\xae\x4f\xbd\x8c"
- "\xfa\xe0\xef\xcf\xe6\x43\xb9\x39\x16\x15\xee\xc7\x91\xc5\x33\xbf"
- "\x41\x57\x12\x10\x95\x7a\x0b\x75\x03\x4c\x30\xfd\xd1\x0a\xfd\x31"
- "\xbc\xda\xd7\x04\x71\xc5\x9a\x72\x17\xf9\xe2\x38\x85\xbf\xe5\x52"
- "\x51\x67\x40\xd6\x9b\xda\xee\x3b\x17\x23\x7f\xf3\xcd\xd8\x1e\xc6"
- "\x9b\xb1\x3f\xd9\x61\x45\xfe\xdd\x13\x90\x3a\x7f\x31\x60\x71\x09"
- "\xf4\xcf\x1b\xd0\x3f\xeb\x48\xff\xb4\xe1\x8f\xde\x54\x31\x14\xaf"
- "\xb1\x67\xfa\x66\x16\xdb\x37\x5f\xd7\xe2\x5c\x58\x0b\xfe\xcc\x4b"
- "\xb4\x54\x3e\x45\x23\x68\x23\xd8\xfd\x83\x91\xbb\x53\x3a\xab\x70"
- "\xee\x92\x7e\xf2\x29\x26\xef\x1b\x6e\xa6\xcd\x1f\x83\x2f\xbc\x43"
- "\x28\x0d\x9d\x33\x55\x7d\x3a\xa2\x16\x71\x79\x93\xa2\x35\x4d\xc1"
- "\x5a\xb5\xe6\x25\xfa\xe6\x25\xc5\x5e\x25\x1c\x57\x69\x5e\x1e\xa8"
- "\x06\x3f\xae\x21\x79\x96\xa2\x64\x9c\x4b\x35\x28\xf6\xe0\xfd\xff"
- "\x11\x7e\x47\xff\x35\xf3\xfe\xeb\x8f\x23\xa1\x2c\xb2\x80\xcd\xcd"
- "\x6a\xeb\x1e\xab\x7f\xf8\x81\xe2\x05\x4d\x4c\xbc\x6a\x06\x1f\x5c"
- "\x89\x47\xd4\x9c\x3a\xb0\x8d\x05\x6c\xd3\xa0\xf5\x81\xb8\x15\x81"
- "\xe3\x16\x9d\x39\xec\x70\xb2\x81\xb6\x86\x47\x2b\x68\xb0\x8b\xaa"
- "\x22\xc9\x82\x5e\x4d\x40\xf4\x9a\xeb\x60\xa3\xfa\x2a\x04\xcf\xd6"
- "\x1d\x62\x5b\x8f\xfc\x95\xc8\x7f\x27\xd8\xa7\x5b\x1d\x70\x9a\x6d"
- "\x39\x68\x7f\x4a\x89\xb7\x05\x70\x8e\xe3\x98\xef\x5a\xaf\x2e\xe0"
- "\xab\xee\x9b\x71\xbf\x85\x7e\xec\xbb\x96\x89\xab\x8c\x6f\xcd\xaf"
- "\x6b\x07\x34\xbf\xae\xd5\xc0\xaf\x9f\x2d\xd6\xd9\xe2\x0c\x9d\xf1"
- "\x41\x21\x8e\x73\x15\x49\x06\x64\x06\x5b\x76\xc7\x63\xe2\xeb\xda"
- "\x3e\x8c\x4d\x7f\x07\x36\x8d\x41\xaa\x21\x26\xe4\x05\xed\x52\x43"
- "\x9b\x51\x59\xec\x25\x1c\x5b\x03\x2d\xd0\x8f\xb0\x9d\xa1\x4e\x8a"
- "\x06\xac\x59\x33\xad\x7b\x26\xc7\x69\xd0\x49\xed\x39\x84\xf7\x71"
- "\x4d\x6d\xa4\x2f\xe2\xf7\x6f\x15\x49\x66\x44\x07\x4c\x55\x93\xdc"
- "\xf9\x9e\xea\xd3\x11\x26\x24\x8d\xe9\x8f\x4e\x72\x98\xfe\xe8\x24"
- "\x87\xe9\x8f\x98\x39\x58\x7c\x5c\x37\x16\x00\xae\xfd\xf9\xb8\xfe"
- "\xe3\x85\xfb\x8a\xeb\x29\xf2\x71\xbd\xe3\x06\x0f\xd7\x29\xff\x19"
- "\x5c\x7f\x1d\xc9\xe0\x5a\xd1\x1c\xcc\xe0\xd5\x50\x61\xfe\x04\xf8"
- "\xef\x47\x07\x6c\xb8\x3d\xf5\x47\x8c\xdb\x7d\xf5\x1d\x15\xb7\x8d"
- "\x0d\x5a\x0d\xfc\xda\x1c\xb7\x50\xa7\xcb\xb8\xfd\x3a\xb2\x09\xd9"
- "\xec\x87\xf1\x4b\x67\xbe\xa3\xd3\xa4\xa2\xe7\x21\x4e\x24\xfb\xae"
- "\xed\x87\xca\x18\x1b\x16\x25\x6b\x5e\xa6\xad\x10\x23\x98\x3d\x10"
- "\x9a\xd6\xd1\xb4\xd5\x7f\x62\x66\xea\x19\xa4\xb6\x66\x77\xd6\x54"
- "\x98\x8b\x90\x6f\x02\xce\xf1\x5b\x55\xb4\x5f\x51\x25\xe8\x70\xe6"
- "\x1d\xb4\x35\xeb\x9d\xf1\x96\xac\x6c\xa3\x05\xe2\x89\x25\x67\x66"
- "\xa6\x35\x6b\xb9\xda\xea\xf7\x91\x86\xc6\x73\x12\xfc\xb2\xd5\x0d"
- "\x19\x45\xc9\xb6\x77\xe5\xa2\xdc\xc8\x7f\x66\x26\xf4\x17\xd0\x54"
- "\xfb\xef\xc2\xbf\x14\xfc\x1b\x00\xff\x2a\xa0\x3d\xcc\x7b\x53\x79"
- "\xe3\x5c\xd1\x01\xf2\xce\x69\x6a\x10\x1b\x07\x0f\x32\x7d\xf0\x29"
- "\xd4\xed\x1a\xfb\x77\x43\xc6\x7e\x1f\xdb\xbb\xf7\x96\xf2\x9c\x3d"
- "\xf6\xe0\x7b\x83\x4d\x94\x64\x3e\x00\xf9\x3f\x9e\x6b\xc3\xd6\xc7"
- "\xfc\xdf\x1a\x14\xa6\x2a\x4e\xb9\x84\xea\x14\xfb\x93\x2a\x60\xec"
- "\xb7\x6e\x9f\x1a\xb4\xf5\x1e\xe0\x31\xa9\x25\xfe\x1e\xec\x0e\xfe"
- "\x2e\x5e\xcd\x94\x61\xf6\x23\xb5\x66\x8f\x33\xd2\xdb\x68\x0d\xd6"
- "\x90\x0d\x74\xec\x2f\xd8\x7f\x47\x61\x6c\x93\x7c\xcb\xfe\x93\x34"
- "\xd8\x0f\x7f\x7f\xbd\x65\xfe\x11\xfe\x2e\x7a\x9a\xb2\xcf\xf1\x64"
- "\x32\xde\xda\xda\x8b\xbf\x9d\x8e\xe7\xf7\x0c\x4c\x43\x69\x0d\x22"
- "\xdf\x4e\xe7\xe6\x01\xed\x3f\x60\xcd\x19\x67\x6c\xc8\xf8\x18\xfa"
- "\xcc\x87\x2a\xfe\x33\x8b\xf9\xc2\xa0\xf8\xb8\x8f\xd4\x39\x79\x7e"
- "\xf8\x58\x72\xff\xff\xb1\x5a\x0b\x2d\xb3\xae\xf5\x92\xbc\x3a\xe8"
- "\xc9\x82\xf0\x3d\x96\x62\x6b\x73\xa4\xef\xc9\xe4\xeb\x32\x39\xd1"
- "\xc7\x92\xf3\xdf\x2c\xd9\x13\x0f\x98\x9f\x84\xba\x43\xfa\x21\xcb"
- "\x92\xc8\x71\xf8\x1d\x08\xe6\x7a\x6b\xe2\xc8\x9c\xb1\xd2\x3d\x66"
- "\x84\x79\xdf\xde\xc5\x25\x54\x53\x73\x24\xea\x6e\x44\xea\x29\xf5"
- "\xa9\xf4\xd6\x1b\x28\x88\x7e\x3d\xd2\x77\xf3\x0d\x34\xb2\xf9\x4e"
- "\x60\xd7\xb7\x97\x21\x65\x13\xc4\xe4\xa6\xe5\xb1\xbe\x78\x7e\xda"
- "\xe7\xd7\x8a\xa9\x0a\xf3\x61\xcc\x33\x83\xf0\x38\x80\xdb\x6e\xb9"
- "\x13\xd9\x7d\xe3\x6d\xc4\xbc\x57\x2e\x9e\xf7\x07\x18\x07\x0e\x5c"
- "\xf5\x5e\x03\xb1\x0f\x62\x17\x33\x1e\xb8\x31\x16\x34\xc1\x58\x30"
- "\x39\x92\x36\x95\x57\x7d\x83\x52\xaf\x23\x75\xea\x0a\xd4\x0d\xd7"
- "\x5f\x61\x3e\x46\xc6\x87\xe9\x30\x3e\xc0\xff\x41\x4b\xb4\x8c\x0f"
- "\x9a\x29\xc8\x61\x7c\xc0\x3a\xa4\xbc\xba\x16\x01\x96\x3b\x4f\xa9"
- "\xf7\x35\xa5\xd4\xd3\x56\xac\x49\xf0\x3b\x6c\x28\xd3\xdd\x36\x56"
- "\xe0\x71\xa2\x89\x1d\x27\xf2\xd9\x71\xe2\xdd\x36\x18\x27\xde\xc5"
- "\xe3\xc4\x39\x44\xed\xc0\x63\x04\x8c\x0f\x1f\x7d\x67\xa4\x9a\x61"
- "\x4c\x90\xe7\xe7\x83\x27\x24\xf1\xb3\x3d\xe2\x8e\x15\xc6\x62\xec"
- "\xe7\x37\xc0\xbf\xd8\xcf\x15\x5a\xf0\x6d\x55\xe7\xf1\x8d\x70\xdc"
- "\xbc\x3d\x34\x6a\xcf\x15\x23\x45\x67\xff\x3c\xad\x11\xf0\xb0\xfa"
- "\x2e\xa2\xcc\xfe\x13\x0f\x14\xbd\x9c\x49\x61\xdd\x6a\xcd\x09\x2d"
- "\x24\x1a\xf9\x90\x1e\xe7\x68\x7c\x6b\x91\x1a\xe7\x4f\x2d\x74\xa4"
- "\xaf\xf5\xc7\xc8\x6e\xd6\x85\x81\xaa\xe6\x1f\x03\xbb\x6e\x5a\x80"
- "\x94\xc6\x85\xb1\xbe\xa9\x33\x90\xfa\x8b\x7f\x64\x52\xe5\xf5\xd0"
- "\xb7\x3b\x7d\xd1\x87\x86\xfa\x77\x5f\x42\xba\xdd\xf3\xd0\xf0\x5d"
- "\x57\x90\x66\x57\x0c\x1a\xb4\xf3\x0a\x60\x68\x61\x64\xf7\x66\x06"
- "\x1f\x8d\xc5\xcc\x9c\x80\x18\x34\x9a\xee\x19\x16\x05\xff\xea\x32"
- "\x63\x40\xcf\xf4\x0c\x8d\xa2\x03\x26\x1e\xb0\x42\xb9\xcd\xa0\xdd"
- "\x80\xa3\x43\x1b\xfe\xd4\x5f\x0c\x37\x3b\x65\x72\x88\xc9\x11\x80"
- "\x9b\x4a\xc0\xcd\x2d\x21\x6e\xb0\x6e\x65\xb0\x33\x99\x60\x07\xbf"
- "\xf3\xdb\xcd\xe7\x17\xf3\x4e\xbb\x8d\x9f\x3c\xe0\xcf\x8d\x76\xf8"
- "\xc9\xbb\xe1\x19\x7e\x9a\x01\x3f\x79\xeb\x00\x3f\x65\x88\xca\xb5"
- "\x7a\x82\x9f\x43\xcc\xfe\x17\x38\xcf\x47\xe6\x0a\x7d\x32\x17\xfb"
- "\xd9\xa0\xf8\x24\x6a\xba\xd6\x0b\xb9\x89\x2b\x83\x73\x5c\xe9\x82"
- "\x08\xae\x3e\xcb\x72\x03\x57\x89\x80\x2b\x83\x73\x5c\xdd\x95\xc2"
- "\x95\xc1\x11\x57\x9f\xae\x6a\x5f\x5c\x31\xfb\x76\xfe\x17\xe0\xea"
- "\xb3\x59\x42\x5c\x1d\x3a\x42\x70\x75\xe8\xb0\xfb\xb8\xd2\xb5\x12"
- "\xaf\x74\x6c\xbc\x3a\x7c\xd5\x0d\x5c\x95\xd2\x50\xbf\x73\x5c\x5d"
- "\x97\xc0\x95\x4e\x24\x5e\xfd\xf9\x4c\xfb\xe2\x8a\xd9\x57\xf4\xbf"
- "\x00\x57\x87\x0f\x09\x71\xf5\x67\x3f\x82\xab\x3f\xab\x3d\xc0\x55"
- "\x2b\xf1\x4a\xcf\xc6\xab\xbf\xbe\x20\x1f\x57\xc5\x41\x80\xab\x56"
- "\xe2\xd5\x05\x29\x5c\x89\xc4\xab\xbf\x84\xb4\x2f\xae\x98\x7d\x4f"
- "\xff\x0b\x70\xf5\x57\x1f\x21\xae\x8e\xc4\x11\x5c\x1d\x89\x75\x1f"
- "\x57\xfa\x56\xe2\x95\x9e\x8d\x57\xc7\x76\xb8\x81\xab\x64\x1a\xea"
- "\x77\x8e\xab\x63\x12\xb8\xd2\x8b\xc4\xab\xa3\x6b\xdb\x17\x57\xcc"
- "\xbe\xac\xff\x05\xb8\x3a\x16\x2d\xc4\xd5\x5f\x8f\x13\x5c\xfd\xb5"
- "\xd8\x03\x5c\xb5\x12\xaf\xc2\xd8\x78\xf5\xc5\x2d\x37\x70\x75\x16"
- "\x70\xd5\x4a\xbc\x5a\x23\x85\x2b\x91\x78\xf5\xf9\xf9\xf6\xc5\x15"
- "\xb3\x6f\xec\x7f\x01\xae\xbe\x38\x2a\xc4\xd5\xe7\xbd\x08\xae\x3e"
- "\x0f\x74\x09\x57\x26\x1e\xae\xaa\x3b\x8f\x6f\x4a\x25\x7a\x70\x6f"
- "\x0c\x8b\xab\x0f\x9e\x2c\x78\x63\x05\xa2\x8a\x66\xe6\xda\x69\xc1"
- "\x2f\x47\xd9\x63\x0a\x70\xc1\x60\xca\xbc\x10\x30\x75\x8d\x60\x2a"
- "\xe5\x02\x60\xea\xdb\x5c\xaa\x22\xe9\x3a\xc6\x09\x83\xa1\xbc\x18"
- "\xc0\x10\xd6\x85\x5e\x4a\x7f\x39\x1a\xf0\xed\x6b\x36\x2c\x1d\x0f"
- "\x6e\x13\x2c\x4d\x03\x2c\x9d\xb5\xc7\xd2\x49\x0e\x4b\x53\x25\x34"
- "\xe0\xab\x12\x58\x32\xb4\x8e\xa5\x9d\x38\x87\xb0\xe4\x3e\x61\xe9"
- "\x0c\x97\x43\xd8\x37\xcf\x48\x99\x03\xe4\x62\xe9\x4b\x95\x10\x4b"
- "\xc5\x8b\x08\x96\x8a\xe3\xdd\xc7\x92\xce\x20\x8d\x25\x1b\x9f\x3a"
- "\xb1\xd1\x33\x2c\x01\xb7\x12\x60\xa9\x75\x1e\xc5\x61\xe9\xab\xa5"
- "\xed\x8b\x25\x3b\x1e\xf5\xd0\x62\xe9\xc4\x34\x21\x96\xbe\x64\x75"
- "\xdf\x97\x92\xba\xcf\x0a\x63\x17\x7e\xe7\x84\xd7\xe0\x5a\xee\x44"
- "\x8e\xb3\xc0\x98\x86\xd7\xe2\xe2\xf7\x14\x1f\x2f\xae\xa4\x30\x9e"
- "\x32\x6e\xa3\xa0\xcd\xcb\xd0\x48\x5f\x13\xc1\x8a\x19\xb0\x92\x7e"
- "\x1b\x29\x9b\x9b\x01\x27\x4d\x48\xd9\x08\xf6\x6e\x6c\x8e\xf5\x2d"
- "\x8d\xaa\x45\x5f\xdc\xa8\x84\xb1\xec\x30\xda\x05\xd7\x34\xb3\x79"
- "\x48\xeb\x1b\x91\xdd\x37\xae\xc6\x79\xc8\x32\x54\x3c\xf3\x5d\xf0"
- "\xff\x49\x8f\xfd\xdf\xf8\xa6\x94\xff\x8f\x09\x7c\x9f\xc7\xf3\xbb"
- "\x66\xa2\xfb\x79\x48\xe6\x3d\xd5\x62\xe2\x7b\x9b\xdf\x77\xb4\x81"
- "\xdf\x77\xb0\x7e\xf7\x6c\x3c\xfa\x9b\xf4\xfc\x47\x5e\xac\x60\xe6"
- "\x14\x98\x48\x8c\xb0\xc5\x05\x1c\x23\x30\x7f\x69\xf4\x0f\x8d\xb6"
- "\x1f\x6f\x70\x7c\xb8\xa1\x28\x39\x82\xc7\x26\x49\x1e\xc3\xc6\x89"
- "\xd4\x55\x24\x4e\x10\x1e\x73\x7c\x50\xdb\xe6\x1f\xff\xef\xbd\xfb"
- "\x17\x2f\x8e\xb5\x3e\xf6\x78\xc0\x63\x30\x6e\xf2\xec\x70\x73\x3f"
- "\xe2\x85\x7b\xb8\x29\x59\x2f\x8c\x17\x7f\xbb\x48\xe2\xc5\xdf\x0c"
- "\xae\x8c\x3d\xad\xe0\xa9\x86\xc3\x13\xc9\x39\x12\x3c\x7d\xdd\x05"
- "\xe7\x28\x65\xe2\x29\xad\x6d\xf3\x8e\xa7\x6e\xb5\x2f\x9e\xda\x2e"
- "\xef\xd8\xb1\xf1\x74\xfa\xac\x10\x4f\xa7\x86\x11\x3c\x9d\x1a\xea"
- "\x39\x9e\x74\xbc\xf8\xa4\xe3\xc5\xa7\xb2\x19\x38\x37\x29\x13\x4f"
- "\x67\xdb\x36\xdf\x58\xfa\x42\xfb\xe2\xa9\xed\xf2\x8d\x1d\x1b\x4f"
- "\x65\x41\x42\x3c\x7d\xbd\x96\xe0\xe9\xeb\xb4\x36\xc0\x53\x8d\x3d"
- "\x27\x26\x78\xaa\xd8\x8b\xf9\xb3\x3c\x3c\x7d\xa9\x6d\xdb\x3c\x63"
- "\x79\x56\xfb\xe2\xa9\xed\xf2\x8c\x1d\x1b\x4f\x15\x89\x42\x3c\x95"
- "\x9d\x21\x78\x2a\xab\xf4\x1c\x4f\x7a\x5e\x7c\xd2\xf3\xe2\xd3\x99"
- "\x46\x9c\x8b\x94\x89\xa7\x36\xce\x2f\x56\x5e\x6c\x5f\x3c\xb5\x5d"
- "\x7e\xb1\x63\xe3\xe9\xcc\x09\x21\x9e\x2a\xfb\x13\x3c\x55\x6a\xda"
- "\x00\x4f\xbc\xf8\x14\xc6\x8b\x4f\x67\x27\xe0\x1c\xa4\x4c\x3c\x55"
- "\xb6\x6d\x5e\xf1\xef\xc3\xda\x17\x4f\x6d\x97\x57\xec\xd8\x78\x3a"
- "\xeb\x2f\xc4\xd3\x37\x4b\x09\x9e\xbe\x49\x70\x35\x17\x64\xcb\x01"
- "\xf1\xf1\x24\xad\xed\xfe\xb1\xc5\x5e\xdb\xc9\xcb\x01\x81\xce\x73"
- "\x3b\x9f\x78\x6e\xc5\x83\x9a\x4f\xc4\x18\xb2\xe5\x81\x3a\x5e\x0e"
- "\xe8\x1f\x91\x42\x0c\x9d\x3d\x46\x30\x74\xf6\xa8\x14\x86\xcc\xfc"
- "\x39\x69\x3f\xf0\xe6\xa4\x5d\x47\x54\xd1\xe2\x62\xaa\x9c\x9d\x93"
- "\x86\xe7\xa3\x95\xd7\xd4\xa2\x8d\xf7\x90\xba\x7b\x2c\x52\x4f\x49"
- "\x48\xa5\xb7\xe2\x18\xb2\x3c\xd2\xf7\xed\x2b\x68\x64\x33\x60\x26"
- "\xe3\x1a\x3b\x2f\x0d\x70\xf3\x75\xb5\x09\x7d\xbe\x18\xcf\x4b\x3b"
- "\x80\x76\x43\x39\x73\x36\xc9\x07\xe1\x38\xc2\xcc\x49\x8b\xc1\x73"
- "\xd2\xfe\xb9\x46\x74\x4e\xda\x3a\x99\x73\xd2\x12\x01\x07\xf5\x80"
- "\x83\xbb\x18\x03\x9f\x0a\xe6\xa2\xed\x5c\xc7\xcb\x01\xcd\x93\xc8"
- "\x01\x55\xb9\xf6\x4e\xa2\xcd\xe7\xa2\xdd\xe4\xcd\x45\xb3\xe5\x80"
- "\x66\x42\xec\x90\xed\xf7\xaa\x08\x67\x39\x20\x0b\xc4\x84\x29\x78"
- "\x6e\x79\x3d\x97\x2f\x4e\x8e\xc3\x6b\x7f\x43\xa3\xcc\x10\x2b\xf0"
- "\xfc\xf1\xfd\xf3\x4a\x98\x7c\x5f\x45\x52\x15\xda\xd8\x84\xd4\xbe"
- "\x46\x36\x2e\x04\x84\x16\x36\x43\x6c\xb0\xc0\xb8\x04\xbe\xee\xd6"
- "\xbc\x1c\x62\xc3\x6d\x88\x0d\xcb\x21\x36\xdc\x85\xd8\x70\xa9\x84"
- "\x89\x0d\xf4\x5b\x5f\xf4\xc1\xfb\x6f\xef\xbe\x86\x86\xe7\x5f\x43"
- "\x3a\x1c\x03\x2c\x39\x13\x0f\x34\x07\x84\xae\x37\x06\x84\xa6\xc3"
- "\xb9\x5c\x82\x81\xc6\xe2\xcd\xcb\x10\x13\xeb\xb1\xef\x35\x31\x38"
- "\x1e\x9c\xdf\xd0\xbc\x0e\x21\x4f\x70\xd0\xcc\xcf\x09\xf2\x71\x20"
- "\x11\x03\x3c\xc6\x82\x5d\x1e\x78\xa7\x87\x31\x00\x63\x61\xa7\x2d"
- "\x06\x78\x84\x85\x6f\x25\xd7\xff\xb4\x82\x05\x43\xeb\x58\xd0\x05"
- "\xb9\x88\x85\x44\xbc\x6f\xb5\x23\x16\x74\x4a\x63\x80\x4e\x05\xe7"
- "\x02\x09\x16\xee\x8a\x60\xe1\x5f\x59\xf7\x1f\x0b\xc2\x9c\xcc\xc3"
- "\x8b\x85\x6a\xc9\xef\xbf\x3a\xc7\x82\xce\x85\xb8\xa0\x73\x35\x2e"
- "\x94\xe2\xfd\x9e\x45\xb0\x00\x71\x41\x07\x71\x41\xc7\xc6\x85\xeb"
- "\x22\x58\xb8\x90\x7f\xff\xb1\x20\xcc\xa7\x3c\xbc\x58\xf8\x4e\x7a"
- "\xff\x0b\xe7\x58\x70\x21\x2e\xe8\x5d\x8c\x0b\xc5\x41\x78\x9f\x64"
- "\x47\x2c\xe8\x21\x2e\xe8\x21\x2e\xe8\xd9\xb8\x70\x41\x04\x0b\xdf"
- "\xef\xbd\xff\x58\x10\xe6\x42\x1e\x5e\x2c\x18\xd2\xdc\xc3\x82\xde"
- "\x85\xb8\xa0\x77\x31\x2e\x14\x27\xe3\xfd\x85\x45\xb0\x00\x71\x41"
- "\x8f\xf7\x1e\x66\xe3\xc2\x31\x11\x2c\x5c\xfc\xf4\xfe\x63\x41\x98"
- "\xc7\x78\x78\xb1\x70\x49\xf2\xfb\x27\xad\x60\xc1\x85\xb8\x10\xe6"
- "\x6a\x5c\x38\x8b\xf7\xe5\x75\xc4\x42\x18\xc4\x85\x30\x88\x0b\x61"
- "\x6c\x5c\x58\x23\x82\x85\x7f\x1f\xbf\xff\x58\x10\xe6\x20\x1e\x5e"
- "\x2c\xd4\xe4\x3a\xc5\x02\xed\x88\x05\x9c\x43\xc0\xfa\x11\xef\x7b"
- "\xcd\x60\x61\x41\x31\xd5\x44\x63\x2c\x94\xa0\x4d\xab\x79\x58\xc8"
- "\x21\x3a\xc2\x86\x83\x2d\x7c\x1c\xe0\xf5\x4b\x18\x07\xa0\x1f\xcc"
- "\xe0\x77\x7a\x7b\x58\x14\x33\x5f\x29\x27\x34\x17\xeb\x07\x9c\x67"
- "\xc0\x1a\x42\x5a\x3f\x5c\x3e\xd9\x26\x18\x88\x07\x0c\xd4\x89\xeb"
- "\xc8\x36\xd7\x0f\x37\xef\x13\x06\x40\x4b\xbe\x9b\xe2\x09\x06\xae"
- "\xe4\xc9\xc7\x00\x70\x04\x97\x30\x40\x78\x82\x73\x0c\xe8\x11\x87"
- "\x01\xe0\x0b\x39\xfa\x40\xcc\x0f\x08\x06\xf4\x2a\x69\x7e\xf0\xc3"
- "\xa9\xfb\x8f\x81\x36\xe6\x07\x1d\x16\x03\xb5\x05\x92\x6b\x18\x71"
- "\x2c\x87\xb8\x3f\x25\xa4\x1f\xa2\x17\x46\x8e\xcb\xb8\x86\x82\xde"
- "\x5e\x80\x46\xe2\x7d\x63\x8a\x9a\x4c\x54\x4a\x02\xfd\x03\x5e\x5b"
- "\x6d\x86\xe7\xc0\xfb\x88\x32\xf8\xb8\x19\xa8\xaa\x88\x35\xa2\x8d"
- "\x80\x85\xb7\xe1\x19\xf0\x1e\xf1\xdd\x13\x3a\x8f\x2f\xaf\x3f\x8d"
- "\x9a\xee\x44\xa2\xd2\xa8\x6b\x28\x5c\x4b\x37\x57\x54\x17\xe3\x35"
- "\x8c\xca\xe2\x95\xa7\xf1\x3a\xf1\xae\x73\x92\x10\x75\x43\x71\x35"
- "\x1a\xe7\x94\x86\x24\x21\x75\xde\x35\x92\x47\xda\x78\x03\xa1\x93"
- "\x49\x08\x11\xbf\x5f\x3d\xee\xbd\xaa\x0d\x72\x48\xb3\xc0\xef\xd5"
- "\x36\xbf\x9f\x14\xe6\x90\x28\x17\xd6\x33\xba\x90\x3b\xbc\x2f\xeb"
- "\x19\x6f\x3a\xae\x67\x74\x2f\x77\x78\x2d\xdb\xe9\x3c\x22\x96\x07"
- "\xbc\x91\xc8\xf4\x7b\xc6\xaf\xcd\x10\xfb\x2b\x92\x0e\x33\xf3\xa3"
- "\x71\x3f\xc7\x7d\x1e\xe3\x23\x15\x9e\x17\x63\x04\xe3\x61\xca\x9e"
- "\xe6\xe6\x57\xeb\x11\x65\x0d\x08\x2d\xc4\x98\xb0\x2e\x09\x54\x6d"
- "\x86\x67\xaa\x88\xba\x04\x7e\xbf\x8d\x2a\x6a\x58\x9f\xaf\xbe\x04"
- "\xbe\xfc\x31\x82\x5e\xa2\xed\xfa\xb3\x7a\xa4\x4e\x3d\x8f\xd4\x73"
- "\xf0\x9a\x63\x18\x07\x76\x02\x27\xd8\xbd\x00\x0d\x87\xf1\x20\xad"
- "\x99\x8d\x0d\x56\x5b\x5e\x09\x8f\x11\x80\x89\xb7\x17\x03\x26\x40"
- "\xe1\x68\x5e\xc5\x98\xf8\xf1\x9c\xf7\x0a\x91\xfc\xb2\x0c\x4c\x30"
- "\xf9\xe5\x68\xc0\x44\x0d\x87\x89\x96\xbc\xb2\xc4\x98\x50\x3c\xd3"
- "\x83\xb9\x85\x22\xf1\xc0\xe3\xbc\xf2\x4d\x36\xaf\xcc\x8b\x07\xee"
- "\x61\xa3\x4e\x7a\x4f\x4c\x69\x6c\x18\x5a\xc7\x46\x03\x8b\x0d\x5d"
- "\x50\xeb\xd8\xb8\x1e\x2f\x82\x8d\x44\x0e\x1b\x3a\xc4\x61\x83\xcd"
- "\x33\xe5\xe8\x02\x1d\xb1\x71\xfd\x56\xfb\x60\xc3\x6e\xde\xcf\x43"
- "\x8b\x8d\x1b\xa5\xf2\xb1\xa1\x73\x21\x6e\xdc\xb4\x61\xc3\x85\xb8"
- "\x71\x33\x5d\x04\x1b\xa5\x3c\x6c\xf0\xe2\x06\x9b\x77\xca\xd1\x89"
- "\xc4\x0d\x63\xb7\xf6\xc1\x86\xdd\x1c\x9e\x87\x16\x1b\x46\xc9\xef"
- "\x1f\x3b\xc1\x86\x0b\x71\xe3\x7b\x16\x1b\x7a\x17\xe2\xc6\xad\x42"
- "\x47\x6c\x14\x07\x71\xd8\xd0\xf3\xe2\x06\x9b\x87\xc2\x9c\xd3\x01"
- "\x1b\xb7\x43\xda\x07\x1b\x76\xf3\x71\x1e\x5a\x6c\xdc\x51\xca\xc7"
- "\x86\xde\x85\xb8\xf1\x85\x0d\x1b\x2e\xc4\x8d\x3b\xc5\x22\xd8\x48"
- "\xe6\x61\x83\x17\x37\xd8\xbc\x54\x8e\x5e\x24\x6e\xd4\x8f\x6d\x1f"
- "\x6c\xd8\xcd\xad\x79\x68\xb1\x71\x57\xe3\x06\x36\x5c\x88\x1b\xa9"
- "\x2c\x36\xc2\x5c\x88\x1b\x77\xab\x45\xb0\x71\x96\xc3\x46\x18\x2f"
- "\x6e\xb0\x79\xaa\x9c\x30\x91\xb8\x71\x6f\x6e\xfb\x60\xc3\x6e\x9e"
- "\xcc\x43\x8b\x8d\x86\x91\xae\x60\x23\xb9\x5e\x44\xa7\xd4\x10\x6c"
- "\x34\x43\x19\x3e\x2e\xf8\xda\x04\x9e\x4f\x19\x0e\x9a\x05\x63\x62"
- "\x76\x32\xa2\x18\x5c\xd4\xf3\x71\xd1\x50\x8f\x71\x31\x38\x16\x70"
- "\x71\x99\xc5\x85\x4d\x97\x30\x7b\xaf\x10\x6d\x62\xcb\x59\xd9\xf4"
- "\xc9\x26\xac\x59\x63\x6d\x98\x30\xad\xf0\x8e\x6b\x03\x4c\x08\xe6"
- "\x3d\xf0\x30\x31\x43\x42\x9f\xbc\xec\x3e\x26\xde\x05\xed\xda\xdc"
- "\xd6\x6b\x9f\x6c\x98\x38\xef\x29\x26\x1a\x9d\xce\x7f\x10\xc7\x04"
- "\xcb\x33\x24\x31\xc1\x71\x0b\x82\x89\xef\x9d\x60\xa2\x49\xe5\x88"
- "\x09\x96\x57\x30\xfb\x10\x10\x6e\x61\xcb\x61\xd9\xf8\x85\x10\x13"
- "\x4d\x1b\xdb\x07\x13\x76\xfc\xe2\xa1\xc5\x44\x73\xb4\x64\x0e\x6b"
- "\x1d\xa2\xf2\xd7\x59\x0f\x64\x52\xd6\xc3\xf0\x2b\x86\x5f\x09\x1c"
- "\xf3\x86\x63\x95\xf8\x1a\xf8\x3f\x73\xce\xda\x95\xd9\x7b\xb8\xd8"
- "\xd7\x2b\x0a\xdb\x1b\x97\xe9\x64\x2b\xe3\xbb\x16\x8d\xde\xcd\xd6"
- "\x01\xc7\xd3\xe0\x78\x71\x77\xaf\xd1\x9d\xa0\x7c\x09\x9d\xf1\xb1"
- "\x0e\x8e\x75\xc6\x65\xe9\xb5\xca\x40\x66\x4e\x16\x45\xe1\x3a\xec"
- "\xef\xa9\x62\xcb\xf4\xe1\xdf\xb7\xdb\xda\xd1\x78\x2f\x3f\x5b\x99"
- "\x2e\x56\xea\x5f\x7b\x70\x39\xab\x97\x12\x7f\x0f\x4d\xc3\x2f\x4b"
- "\xbf\x88\x70\xbd\xb6\xb2\x5d\xd9\xfa\x82\xf8\x65\x2c\x7f\x40\xa8"
- "\xbb\x97\x86\xa9\xb3\x7b\x02\x85\x9f\x09\x97\x7d\x8c\xee\x5e\x94"
- "\xc9\x94\xf7\x52\x6a\x05\xe5\xdf\x42\x4c\x59\xb6\x9c\x0f\xdd\xe9"
- "\x84\x3f\x5b\x8e\xd9\x9f\x1d\x8e\x29\xf9\xf6\x63\xcb\x75\xb3\xd9"
- "\x06\xef\xdf\xc7\x7f\x56\xcb\x3a\x0a\xd7\x87\xcb\x74\xb7\x76\xfa"
- "\x2a\x88\x7d\x96\xe1\xfc\x7b\xe2\x72\x70\xdd\x30\xd6\xce\xbe\xf0"
- "\x0c\xba\x96\xfa\x32\xe9\x48\x5b\x39\xc0\x61\xaf\xdd\x9c\x6d\xd4"
- "\x60\xeb\x52\xbc\x67\xb9\xbd\xef\xba\x7b\x79\x19\xb0\xef\x2a\xea"
- "\x10\xc2\x65\xe9\xee\x1f\xa7\x41\x79\x3f\xf6\x39\x46\x93\xe7\x60"
- "\xf6\x4c\x24\xbe\xa6\xcc\x3f\xd9\xc5\xb4\xd5\x4b\xc3\xb6\xb5\x07"
- "\x94\x1b\x63\xab\xd7\x4a\x31\x18\x66\xcb\x2a\x99\xb2\xe5\xf1\xf8"
- "\xfb\x5e\x2d\xe5\x7f\x82\xcb\x5a\x32\x8a\xfb\x58\xd6\x2a\xc7\xdb"
- "\xd7\x6f\x59\xa7\xc2\xe7\xf9\xf5\xfb\x93\xf2\x9f\xf8\x40\xf9\x49"
- "\x8e\xe5\xd5\xf6\xe5\x03\x48\xf9\x43\xd1\x50\x3e\xc2\xb1\xbc\xb9"
- "\x87\x5d\xf9\x9e\xa4\xfc\x67\x47\xa1\xfc\x34\xc7\xf2\x1a\xfb\xf2"
- "\x8f\x93\xf2\x5f\xc6\x42\xf9\x48\xc7\xf2\xa3\xed\xcb\x07\x92\xf2"
- "\x47\xfc\xa1\xfc\x2c\xc7\xf2\x69\xf6\xe5\x7b\x91\xf2\x7f\x8d\x87"
- "\xf2\x51\xf6\xe5\x77\x33\x65\xd1\x00\xb6\x6c\x6f\x52\xf6\xd8\x09"
- "\x28\x1b\x2d\xf2\xac\x0a\xb6\xee\xa1\x6c\xf9\xff\x47\xca\x1f\x08"
- "\x82\xf2\xb1\x8e\xe5\x95\xf6\xe5\xfb\x90\xf2\x67\x13\xa1\x7c\xbc"
- "\x88\xaf\xec\xcb\xf7\x25\xe5\xff\x96\x0d\xe5\x13\x44\x7c\x65\x5f"
- "\xbe\x1f\x29\x5f\x52\x03\xe5\x13\x45\x6c\x6f\x5f\xfe\xa7\xa4\xfc"
- "\xd7\xc3\xa1\x7c\x92\x88\xed\x85\xe5\x33\xca\xd6\x43\xb9\xe4\x5d"
- "\x2c\x36\xed\xec\x6e\x5f\x77\x7f\x52\x77\xc5\x59\xb8\x26\xcd\xb1"
- "\x3c\xf2\x22\xe5\xd1\x33\x6c\xf9\x01\xa4\xfc\x37\xd8\x96\xeb\x45"
- "\x6c\xff\x04\x2e\xbf\x9b\x94\x7d\x82\x94\x3d\x71\x08\xca\xa6\x8b"
- "\xd8\x9d\x5f\x36\x88\x94\xad\x31\x40\xd9\xcd\x22\x36\xe7\x97\x0d"
- "\x26\x65\xab\x72\xa1\x6c\xa6\x88\xbd\xf9\x65\x9f\x24\x65\xbf\x2d"
- "\x84\xb2\xd9\x22\xed\x1d\xc0\x2b\x3b\x90\x94\xad\x3e\x00\x65\x73"
- "\x45\xfc\xc2\x2f\xab\x25\x65\xaf\x60\x1f\xe6\x89\xf8\x84\x5f\x36"
- "\x84\x94\xfd\x0e\xf7\xb5\x02\x11\x9f\xf0\xcb\x3e\x45\x67\x18\x4a"
- "\xd8\x38\x5d\x68\x5f\x76\x17\x17\x77\x9f\xb6\x76\xbf\x74\x96\x8d"
- "\x95\x7b\x98\x38\x08\xe5\xb8\x31\xc7\xfc\xac\x6d\x8c\xb0\x52\x68"
- "\x10\x9d\xf1\x8f\xc3\x70\x1d\xae\x73\x9f\x63\x6c\x53\x3e\xbb\x8b"
- "\x1b\x23\x06\xd3\x19\x0d\xeb\xd9\xfb\x1f\x70\x2c\xab\xe2\x97\xfd"
- "\x19\x9d\x71\xad\x9a\x2d\x7b\xc8\xb1\xac\x9a\x5f\x76\x08\x9d\x51"
- "\x67\x62\xcb\x1e\x16\x89\xaf\xcf\xf0\xca\x0e\xa5\x33\x6e\xfa\x43"
- "\xb9\xa3\x62\xf1\x95\x5e\xa7\x79\x06\xc7\x03\x5b\xec\x86\xf2\xc3"
- "\x88\x7d\x1b\x31\x1e\x8a\x71\x79\x5b\x59\xf0\xc3\x33\xbc\xb1\xf2"
- "\x19\x6b\xf7\x5b\x43\x59\x9b\x9d\x70\x6c\x43\x1a\xbf\x0d\xcf\x92"
- "\x3a\xef\x4c\x82\x3a\x4b\xec\xdb\xc0\xc6\x23\xcc\x13\xb0\x7d\x87"
- "\x5b\x32\xee\xe2\x6f\xd4\x54\x42\xd9\x52\x01\x47\xa0\xbc\x14\xb8"
- "\x4e\xd6\xb7\x23\xe8\x8c\xda\x5a\xd6\x06\x82\xf1\x08\xfa\x23\x13"
- "\x0f\xc1\xbf\x25\xf4\x5b\xfe\x6a\x28\xfb\x1c\x5b\xee\xac\xfd\x38"
- "\xc8\xb6\x2f\x14\xce\x55\xb5\x8c\x81\x5e\xca\x6a\x31\x2e\x93\xf0"
- "\x14\x7a\xec\x9a\x92\xd8\xa4\xe5\x1b\xbf\xca\x4e\x0c\xb6\xad\x85"
- "\x03\x47\x87\xd7\xd3\x66\xfe\xb1\xad\x14\x5d\x39\xa4\x1e\x29\xf1"
- "\x3e\xdd\x74\x40\x44\xad\x01\x8e\x1b\x83\xb5\xea\x86\x6d\xca\x52"
- "\x83\xd7\xe7\xcc\x37\xe4\xe0\xef\x2a\x03\x5a\xa0\xc4\x7f\x6f\x5d"
- "\x47\x9b\xf0\xfe\xc9\x96\x6d\xb4\xa6\xc2\x5a\x07\xf8\xa3\x4d\x50"
- "\x87\x09\x38\xa3\x02\x7f\xdf\x1a\x7f\x47\xa2\x22\xa9\x0e\x5d\x51"
- "\x7a\xf7\xa5\x97\xc4\x8e\x84\x36\x24\xc0\xfd\xa2\x2f\xc1\xff\x89"
- "\x4d\x81\x53\x67\xd2\x23\x8b\x97\x35\xe1\x32\xf3\x8d\x01\x33\x13"
- "\xe8\x37\x5f\xa9\x4d\x48\x41\x3f\xbd\xa6\xf4\x66\x62\x3b\xde\xc3"
- "\xd6\xea\x47\x8f\x64\xf6\xae\xbd\x19\xfb\x0b\x66\xdf\x5a\x65\xa7"
- "\x38\xbc\x5f\x2d\xde\xb7\xb6\x65\xcf\xda\x82\x18\x35\xb3\x0f\xae"
- "\xd2\xfb\x08\xf3\x2c\xeb\xe8\x4a\x3a\x68\xa0\xd6\xda\xb4\x3e\x0d"
- "\x7f\x8b\xba\x38\xe5\x1a\xba\xc4\x9e\xc3\x75\xb2\xf5\xe8\xed\xeb"
- "\xc1\xd7\x19\xfb\xc7\xa8\xc1\x06\x5a\x4b\xe6\x33\x81\x56\xf5\x33"
- "\xfe\x74\xe6\x48\x5d\x45\xbc\x01\x31\xdf\x61\x54\x76\xda\x41\x77"
- "\x9f\x51\x61\xcd\x1c\x66\x86\xe3\xda\x8a\xfa\x26\xe6\xf8\x25\x65"
- "\x27\x25\xe6\xbd\x77\xd4\xba\xff\xcf\xde\xdb\xc0\x47\x59\x5d\xfb"
- "\xc2\x6b\x26\x13\x08\x18\xc8\x24\x04\x1c\x29\xea\xa0\xc1\x46\xe5"
- "\x23\x7c\x68\x91\x82\x44\x49\x20\xd4\x00\x51\x40\xa2\x7c\x06\x13"
- "\x4d\x4a\x80\x48\x22\x0c\x10\x32\xc3\x80\x16\x5b\x3e\x86\x18\x31"
- "\xd6\x90\xc4\x4a\x7f\x2f\xe7\x1e\x5a\xd3\x5b\x7a\x4f\xee\xb9\xb4"
- "\xa6\x25\xe7\x5e\xda\x42\x86\xd3\x97\xfe\x6e\x4e\x2f\xb6\x23\x37"
- "\xa5\x91\x13\x70\x34\x03\x19\xc8\x64\xf6\xfb\x5f\x7b\x3f\x4f\xe6"
- "\x23\x13\xd4\x7b\xbc\xf7\xbc\xbf\xf7\x35\xfa\xf0\xcc\xb3\xf7\xda"
- "\x6b\xaf\xbd\xd6\xda\x6b\xaf\xfd\xdd\x29\x5c\x33\xbb\x5a\xc6\xde"
- "\xa2\x0e\xd3\x10\x79\x77\x15\x87\x8b\xc3\xb3\x67\x32\x3f\x83\x87"
- "\x67\xa7\xc7\x59\xc8\xd4\x9d\x3c\xb3\xb3\xa7\x7a\x48\x9a\x7e\x1f"
- "\x9d\x9e\x17\xe3\xf5\x68\xb8\xbe\xf0\x99\xbb\xa6\xf8\x13\x7c\xe6"
- "\xee\x97\x80\x2f\x64\xf8\xd8\x77\x90\xc0\xbf\x3a\x2c\xf2\x41\x5b"
- "\x0b\xfc\xe4\x63\x4a\xe6\x43\xce\xa2\x04\x9a\xfc\x87\xb4\x7b\x0c"
- "\xc6\x89\xda\xef\x0e\x8f\xe1\x67\x27\xb5\xdf\x5e\xfd\x8c\xe3\x98"
- "\x78\xcd\x62\x22\x64\x9d\x15\x7c\x27\x3f\x81\x7d\x7c\x75\x47\x83"
- "\x98\x68\xbd\x87\x0c\x97\x4d\x43\x2b\x90\x67\x96\x92\xc9\xd0\x45"
- "\x78\x27\x69\x6f\xaf\xf6\x16\x0c\x23\xf5\x38\xf5\x99\x74\xf0\x3d"
- "\x43\xc9\x62\x68\x91\xec\xdb\xb0\xde\x40\xb7\x44\xf2\xec\x0c\x89"
- "\xf7\xcd\xe7\xcb\xc2\x69\xc8\x98\x3a\x6d\xfa\x8c\x47\x1e\xfd\xd6"
- "\xcc\xc7\x0a\xd6\xbf\x50\x58\xf4\xe2\x4b\xc5\x25\xdf\xdd\x50\xba"
- "\x71\xd3\xe6\xb2\x97\xb7\x94\x57\xbc\xb2\x75\x9b\x6d\xfb\x0e\xe0"
- "\xe9\xbf\x13\x5b\xbc\x93\x65\xf0\x19\x09\x72\x7d\x92\xf3\xf8\xa3"
- "\xcc\x17\x61\x4a\xbf\x86\xb6\x9a\xac\xb1\xfb\x0e\x6e\x78\xf3\x7c"
- "\xa7\x61\x97\x29\x61\x3c\xdf\xb1\x08\xfd\x36\xb8\xeb\x16\xb4\xf0"
- "\x3d\xce\x1d\xa6\x84\xd4\x36\xef\x82\x16\xbe\x77\xfc\xb4\xa5\x93"
- "\xd2\xee\x23\xc3\x15\x53\x02\x71\x7c\xc3\x03\x44\xad\x48\x1b\x0b"
- "\xe7\x7d\x66\xb2\xbc\x31\x46\x78\x6b\xc6\x88\x2e\xc6\x5f\x73\x44"
- "\x74\x7a\x77\x16\xd3\x41\x7c\xa3\x8e\x99\x2f\x9b\x12\xfe\x78\x7a"
- "\x9c\xbc\x97\x75\x5c\xfd\x11\xd1\xb1\x77\x8c\xe8\xd8\x73\x44\x74"
- "\x35\x8c\x11\x9e\xb4\x1a\x4a\xec\xa9\x4e\xd8\xe7\x31\x0d\xf5\xc8"
- "\xfa\x8a\xf8\x60\xca\x50\xc7\x21\xc4\x4d\x09\x50\x5c\x03\xbe\x11"
- "\xe6\x3b\x6d\x55\x74\xbf\xff\x99\x3f\x1e\xf8\x4a\x45\x6f\xa9\xe1"
- "\x20\xf2\x51\xf2\x48\xb8\xd9\x0a\xaf\x03\xf9\x79\xdd\xfe\x4b\xe4"
- "\x31\x25\xf8\x1b\x6e\xc8\xfc\x92\xdc\xb5\x5d\xc4\xf8\x7e\xba\xc5"
- "\x1f\x5f\x3e\x56\x04\x00\xdb\x1e\xdc\x59\x6a\x00\xcc\x49\xe0\xf6"
- "\x85\x97\x27\xfd\xc5\x8d\x15\xd6\x4d\xaf\x94\x96\x3e\x38\x9c\xd2"
- "\xe5\x9b\xc2\xef\x20\xaf\xe0\xb3\xd5\xdf\x38\x22\x5a\x51\xce\x16"
- "\x94\xf7\x0c\xef\xf0\x85\x6e\x10\xca\xe4\xba\x6c\x1a\xb6\x08\xe1"
- "\xa7\xf0\xfb\x14\x68\x3f\x23\xef\x34\x36\x8d\xdd\x2e\xaa\x87\x99"
- "\x40\xe7\x19\xbe\x8b\x8d\xcf\x62\xef\xde\xb6\xcc\x80\x72\xd7\x00"
- "\xee\x8c\x75\x2c\x4d\x40\xba\x3f\x82\x8e\x63\xf8\xcd\xf0\xf2\x3e"
- "\x60\xc0\xb7\xaa\x72\x8d\x2d\xe1\x6f\xf0\xaa\xe5\xe8\x18\xb1\xbf"
- "\xa7\x7a\x58\x13\xdf\x31\x21\xef\xc9\xc4\x37\xf8\x72\x06\xb0\xae"
- "\x6e\xfb\x32\x03\xfa\xba\x86\x86\x10\x4e\x07\xd3\xc4\x74\x70\xff"
- "\xf9\xf7\xb0\x52\xc1\xde\x7c\x9a\xe4\x27\xc3\xef\x3b\x88\xea\x8e"
- "\x88\x46\x3c\x75\x78\x6a\x7f\x87\xb8\xdf\xe2\x39\x83\xf0\xb3\x78"
- "\xff\x0e\xef\xdf\xe2\x41\xff\xdb\xc2\x74\x97\x57\x8a\xce\x29\xb5"
- "\x74\x3f\xe3\x87\x6e\xad\xb8\x64\xba\xeb\x3c\xd3\xce\x77\xc8\x88"
- "\x94\xe1\x59\x11\xf7\x5e\x98\xee\x68\x26\xc4\xe3\x7d\x56\xbd\xc3"
- "\x9f\xc4\x54\x3c\x33\xb4\xdf\x95\x80\x39\xa6\xfd\x76\xe1\xa9\xfb"
- "\xfc\x27\x1a\xdf\x60\xcf\x88\x84\x2f\x0e\xfb\x45\x9e\xb1\x59\x5f"
- "\x0c\x6e\x64\x0b\x99\x92\x61\x35\x93\xf3\x22\xc3\x93\xd3\x55\xd8"
- "\x68\x9f\xfa\x1e\x43\xda\x7b\x22\x1e\xf0\xe9\x4e\xe0\xbf\xb3\x58"
- "\x85\xdd\x59\x81\xf7\x29\x3c\x67\x22\xf3\x1f\x8b\xf4\x63\x57\xb1"
- "\x3c\x7b\xd1\xc6\xb0\x2c\x3d\xa6\xe1\xa9\x2c\xa3\x43\x4a\xb7\x0c"
- "\xbc\x8f\x0e\x61\x66\xe8\x56\x5d\x48\x7f\x12\xe3\x23\xf5\xe7\x0e"
- "\x6f\x94\xfe\xb8\xd8\x16\x79\x4c\xc3\x56\x35\x28\x7d\x39\xd5\xbd"
- "\xb3\x10\xdf\x77\xf8\x80\xe7\x14\x8f\xeb\x00\x87\xec\x8f\x1c\xba"
- "\x42\x34\x02\x54\xb2\x7d\xe9\x32\x25\x66\xb3\xce\x72\xde\x5a\xbe"
- "\x8a\x16\xd0\x87\xb0\x46\xa6\x6f\x33\xf0\xe2\xfb\x18\xe0\x1a\xdd"
- "\xf4\x99\x4e\x9b\x4c\xf3\xfd\xef\x42\x1f\x35\x7a\x19\x27\xa7\x13"
- "\xa1\x72\x99\x39\x8d\x96\xf7\x4d\x84\x67\xc0\x46\xf1\x1e\xb9\x38"
- "\x77\xc0\x43\xac\x93\xfc\x76\x07\x32\x50\x97\x72\x28\xc8\xe7\xc2"
- "\x5b\x28\x03\xf5\x6d\xd8\x25\x53\xe2\xc5\xc9\x95\x94\xc1\xf8\xd8"
- "\x7e\x7b\x4c\x89\x8d\x0d\x5c\x17\x15\xae\x4f\xb9\x1c\x8c\xff\x77"
- "\xe8\x01\xf1\xbb\x9e\xe9\x41\x7c\x58\xbe\x35\x6e\x94\xf6\xd0\x0e"
- "\x55\x56\xe4\x75\x0c\xe9\x9b\xb8\xec\xcc\x4f\xc4\x37\x5f\x36\x8d"
- "\x98\xc9\x71\x7c\x8f\xa4\x56\x9e\x63\xbc\x37\x91\xf9\xc1\xf0\x6e"
- "\xf4\x38\xe4\x9d\x17\xa6\x61\xab\x25\xdf\x90\x9e\xe5\x21\x90\x07"
- "\xe3\xb0\x07\x44\x40\xc0\x1e\xbd\xb7\xc3\x0f\x9f\x66\xe4\xcf\x22"
- "\xe5\x33\xc2\x15\x2e\x1f\xa4\x6b\x42\xfa\x56\x6e\xfb\xd9\x9e\x20"
- "\xcf\x24\xbe\x07\x1a\x61\xae\x60\x35\x70\x6c\xf5\xcb\xb1\x28\xe0"
- "\x79\x17\xb4\xb8\x18\x0f\xe8\x69\xd5\x70\x5d\xe4\xf3\xf1\xc3\x65"
- "\xad\xe1\x3b\xc6\x32\x97\xf5\x79\x87\x2c\x13\x6c\xd7\xc8\x97\xeb"
- "\x55\x5c\x33\x60\x9a\x45\x6f\x0e\x89\x9d\xf9\xea\xbe\x69\x15\x77"
- "\xd2\x7e\x53\xca\xb7\x55\xd9\xb5\x91\x87\xcb\x77\x89\xce\x10\xdd"
- "\x23\x73\xf4\xfb\xa3\x34\xba\x4f\x72\x7e\x62\xdb\x2a\xd9\x86\x72"
- "\x1e\x9c\x5e\xc3\x97\xc6\xf8\x74\x5e\x4d\x06\x1d\x8a\x5f\x23\xf2"
- "\x11\x7e\x8c\x75\x51\xf2\x0d\x76\xb4\xdb\xce\xba\x38\x32\x17\xe9"
- "\x4f\x1d\xe4\xef\x6d\xfc\x3d\xc2\x23\x6d\x6c\x7f\xfc\x88\x1a\x8e"
- "\x77\x77\x42\x6e\x1b\xa0\x4b\x41\xa2\xfb\x53\x29\xc3\xe7\x94\x65"
- "\x3b\xe1\xdb\x99\x65\x38\x1d\x20\x62\x3a\xc1\xa3\x66\xd0\xea\x83"
- "\xed\x9f\xc1\xb4\xc2\x5e\x9f\x14\xef\xe5\x13\xd3\x0c\x7b\xa6\xd1"
- "\x97\x54\xa4\xc9\xfe\x24\x97\x91\xf9\x39\x59\xd9\x3e\xc4\x25\x0f"
- "\x63\xda\x43\xe5\x4e\xca\x0c\xe7\xb1\x2c\x37\xe4\xc0\xf2\x62\xb9"
- "\x84\xe1\x64\x5d\x71\x01\xd7\x09\xf5\xad\x74\x83\x79\xed\x1a\x23"
- "\xce\x32\x7c\x08\xd6\xbc\x9d\xe3\xaa\x90\xf7\x94\x32\x79\xc7\xb5"
- "\x81\xef\x00\x03\xde\x13\x2d\x3b\x02\x04\x1c\xcd\xcc\x53\xc0\x9d"
- "\x63\x7d\xc4\xf7\x59\x2d\x8f\xb3\x68\xcf\x27\xe2\x99\x1d\xaa\xff"
- "\xe6\x5f\x46\xea\x57\x52\x74\xfd\x67\x79\xbb\x82\xf6\x1c\x92\xfa"
- "\xb0\x85\xac\xd7\x4c\xe6\xe7\xb4\xb6\x43\x93\xb5\xf9\x27\xa7\x51"
- "\x5f\x42\x38\xcc\x33\xa2\x64\xdd\x2c\xf5\x71\x5b\xae\x81\xcb\x8c"
- "\xb4\xcd\x1a\x1e\x59\x66\xa9\x4f\x4e\xa9\x03\x67\xc5\x36\x94\xb3"
- "\x5f\x0f\x92\x5c\x9a\x9c\xcf\x46\xf1\x44\xa3\xfd\x8e\x8b\x7c\x1f"
- "\x31\xdb\x24\xf8\xd5\x8f\xf7\xf4\x86\xec\x12\xcb\x3e\x28\x65\x6f"
- "\x9e\xd9\xa0\xda\x5b\xcd\x6e\x25\xa9\xf8\x31\x11\x3a\xcc\xb4\x6c"
- "\x94\xfa\xcb\xb4\xd8\x57\x31\x2d\xcd\x92\x0e\xbb\x95\x10\xd7\xc1"
- "\xf9\x03\x57\x99\x56\x5f\x75\x5c\x59\x8c\x6b\x0f\x6c\x15\xd3\x84"
- "\xbc\xcf\x4b\xfb\x37\x5f\xea\x41\xb6\x46\xfb\x19\xbf\x93\xd3\x26"
- "\xce\xbc\x69\x94\x69\xcf\x00\xee\x84\x5f\xdd\xe7\x36\x1c\xe9\x8f"
- "\xcb\x35\x96\xa6\xd1\xc7\xd8\x46\xf3\xde\x61\xfc\x3e\x60\x7d\x16"
- "\xba\x7a\x05\x2d\x55\x31\x25\xb0\x8e\xea\x7a\xd1\x65\x1a\xbd\x8b"
- "\xfb\x2a\xe0\xf5\x09\xf8\x48\xc7\x99\xdf\xac\xcb\xf0\x91\x66\xf4"
- "\x54\x27\x9f\xd0\xf5\x16\xf9\xd4\x31\xef\x95\x7c\x92\x3f\x85\x1e"
- "\x37\x87\x74\x2b\xf9\x53\x8d\x8f\x7c\x47\x7c\x02\xf2\x7b\x59\x2b"
- "\x17\xdf\xd1\x01\x5f\x6c\x74\x81\x46\x7b\xad\x82\x4f\x19\xa1\xcb"
- "\x41\xab\xab\x67\x0f\xb2\xfd\x95\x32\x48\x39\xa6\xa5\x3d\xa6\xf2"
- "\x4a\xf9\xb1\x0e\xcb\x3e\xa2\xbc\x9b\x19\x61\x6c\x07\xa7\x40\xf6"
- "\xd2\xf6\xed\xb8\x25\xe1\x34\xdb\xd8\xaa\xf2\x18\xbd\x48\xea\x21"
- "\xfc\x9e\x90\x1e\xa5\x54\x46\xd9\x27\xb6\xc5\xae\xb6\xbd\xea\xee"
- "\x3b\xd6\x25\xb6\xa9\xdc\x27\x02\xbe\x65\x5a\xfd\xd1\x69\xfe\x38"
- "\x52\x57\x46\x3f\x06\x5d\x99\x14\x86\xbb\x3d\x56\x3b\xd7\xa0\x6c"
- "\x60\x9d\x4a\x33\xea\x41\xad\x6c\x27\x54\xd9\xb4\x6f\xe6\x5b\x15"
- "\xf3\x2d\xf5\x6a\x18\x1f\xc1\xb7\xd4\xe7\x34\xf8\x66\xb6\xe5\xa1"
- "\xfa\x3a\xea\x4d\xbd\x2e\x0f\xb4\x17\xa9\x0b\xb9\x3e\x84\xe8\x1a"
- "\x55\x16\x65\x2f\x9a\x63\xdb\x8b\x51\x99\x5a\x79\x1b\xa3\xea\xc6"
- "\x31\x45\xbb\xd6\xb6\x40\x0e\x6d\x3e\xed\x0e\x42\x84\xb1\xfd\xe4"
- "\xbc\xc3\xdb\xa0\x7a\xc5\x57\xad\x2e\xa7\x3e\x32\x50\x0e\xa9\xa6"
- "\xf0\xfa\xcc\xb2\x66\x9b\xc0\x38\x58\xa6\xd2\xaf\x44\x98\x92\xeb"
- "\xa8\x8b\x6c\x1b\xc2\x6d\x34\x60\x6b\x82\x82\xeb\x4b\x6a\x42\x64"
- "\x5d\x1c\x55\xa1\xd5\x45\x3d\xef\x7f\x81\x8c\x32\xc2\xf2\xad\x8c"
- "\xca\x97\x65\xd3\x2a\xef\x8a\x91\x65\x4c\xfd\x27\xbd\x4d\x63\x78"
- "\xa4\xb5\x21\x4d\x53\x54\xfb\xe8\x62\xfa\x90\x57\xba\xb4\x59\x47"
- "\xa4\xad\xb0\xf5\x28\x7a\x4e\x36\x68\xed\x04\xc2\x32\xb4\x30\x87"
- "\xd6\x96\xe8\x7a\x33\x21\x92\xa6\xd1\xe6\xd8\xfe\xd1\xa8\x74\xdd"
- "\x3f\x92\xb8\xa4\x2d\x1a\x9d\xaa\x95\x8f\xc3\x26\xa9\xb0\x94\x8b"
- "\x1c\x76\x50\xf1\xa1\x46\xc8\xf6\x2a\xc5\xa1\xb5\x57\x5c\xbf\x8c"
- "\x1e\x53\xb2\x97\xeb\x18\x7f\x03\x47\x31\xe3\x77\x3b\x6e\x71\x1f"
- "\xa2\x16\x71\xfb\xd9\x1e\xb0\xbd\xe0\xb5\xc1\xf2\xbd\x58\xbe\x7f"
- "\xc1\x76\x87\xfd\x10\x8e\x07\x5c\x25\xdb\x22\x84\xff\x96\xcf\x05"
- "\x14\xff\x9a\x00\xbc\xa3\x4f\x68\x69\x3f\x94\xbe\xc2\xbf\xe6\xc4"
- "\xe9\x61\x7a\x3a\xd8\x86\x03\x9c\x8e\xd3\xeb\xf6\x8b\x6d\x57\x80"
- "\x6d\x93\xcc\x6f\xcc\x78\x4d\xc7\x65\xbf\x41\xf7\x8b\x7a\x8d\x61"
- "\xb0\x7c\x97\x9a\xb4\x69\x63\x4a\x95\x3d\x1b\xb3\x9a\xd3\x4a\xf9"
- "\xc1\x56\x56\xdd\x14\x1f\x35\x6c\x21\x53\xfd\x67\x6c\x17\x87\xad"
- "\x52\x74\x8e\x69\x56\xe5\x18\xb3\x5b\x96\x43\xd9\x54\x97\xa2\x65"
- "\xd8\xaa\xfa\x5b\x32\xee\x28\x97\x85\xe3\x0e\x85\xc5\xf1\xdd\x88"
- "\x88\x53\xe3\x25\x51\xe9\x82\xbd\xc5\x03\xe0\x1b\x6e\xc9\x7e\x5f"
- "\x42\xfd\x11\xdd\xf6\xde\x39\x53\xa3\xf3\xba\x6e\x77\xc1\x97\xbd"
- "\x6c\x7b\x65\xdc\x8b\x1a\xcc\x62\xed\x2d\xed\xfb\x9d\x13\x14\x5f"
- "\x2d\x46\x8d\xdf\xfb\x55\x39\xee\x7c\x4c\xf6\xb3\xff\x35\x1f\xbc"
- "\xbd\x73\x9c\xce\xdb\xf0\xdf\x5c\x7f\x90\x3f\xfb\x92\xca\xae\x54"
- "\xca\x3e\x6c\x1d\xc3\x30\x4d\xaa\x8d\x18\x93\x1a\xed\x53\x5f\x36"
- "\xdd\xf5\x33\x6e\x97\x94\xaf\x7a\xd7\x61\x6d\xec\x89\x5a\xb6\xfc"
- "\x08\xed\xc2\x9d\x17\x75\x1b\x23\x7a\x72\x88\xef\x58\x02\x2d\x1f"
- "\x72\x18\xdf\x8f\x15\x0e\xc3\xf6\xe9\xfd\x5b\x1e\x0d\xe7\x9d\xcd"
- "\xba\xdd\x60\x5b\xd2\xe6\xbb\xa4\xf9\x74\x96\xe2\x7a\xcd\x96\x5c"
- "\x33\x59\x4a\x22\xfd\x30\x4b\x49\xa4\xcd\xb8\x6b\x57\xb4\xcd\x80"
- "\xdf\xbc\xb7\xa7\xda\x32\x3b\xc2\x0f\x40\xd8\xed\x6d\x87\xc5\xcc"
- "\x75\x94\xef\x66\x95\xf6\x49\x8e\xa7\x59\xfe\x59\xa7\x99\xed\x66"
- "\xf7\x4e\x7d\xfc\xe2\xae\x8d\xec\xab\x45\xe5\x77\x22\xc2\x76\x72"
- "\x7e\x3a\x3e\x13\xf1\xfd\x9e\xe0\x03\x8f\xb7\x58\x2a\x35\x3b\xdf"
- "\x18\x61\x2b\xb5\x36\x8c\xed\x64\x64\x5b\x35\x6c\x75\x64\x5b\x75"
- "\xd7\x73\x03\x6d\xe4\x5d\xe9\x5f\xbc\xad\xba\x8b\xd8\x6e\xe9\x36"
- "\x32\xd2\x16\xdc\x35\xb1\x3e\xc2\x97\xb5\x9c\xd4\x7d\xd9\x90\x1d"
- "\xb5\x64\xb1\x8d\x42\xfe\xcd\x5a\xde\xf0\x89\x87\x1e\xd7\xf3\x86"
- "\x1e\x5d\x6c\xb3\x42\x37\xab\x87\x99\xf1\x7b\x9f\xe6\x03\xca\xba"
- "\x79\x8b\xef\xe2\x33\x8d\x39\x0f\xfd\x1b\xce\x7a\xd6\xb2\xe9\x33"
- "\xea\x08\xb5\x15\xad\xdd\x9b\x75\xfe\x8e\x7d\x24\xdc\x2f\x3c\x7a"
- "\x44\xec\xeb\xa9\x1e\x9b\x18\x5e\xc6\x03\x08\x3b\xa4\x8d\x21\x48"
- "\xde\x4a\x5c\x77\x79\x1a\x8e\x44\x96\x4d\x95\x63\x6c\x2a\x97\x83"
- "\xfb\x44\xc8\xff\x02\xfb\x3d\x7c\x3f\x33\xea\x4d\x7e\x43\xbf\xce"
- "\xdf\x71\xe2\xa6\x33\xdc\xbf\x1a\x76\x92\x6d\xa5\xd6\xf7\x3c\x03"
- "\x7f\xc7\x15\x3e\x16\xb3\x68\x5e\x9e\xb5\x6c\x4b\xc9\xa6\x8a\x17"
- "\xa7\x59\x4b\x36\x95\x54\x94\x14\x94\x96\xec\x28\xa8\x28\xd9\xbc"
- "\x69\xe2\xc6\x82\x97\x4a\x5e\xb0\x6e\x2b\x28\xb7\x66\xd8\x26\xd8"
- "\x86\x53\x08\x74\x96\xb5\xa0\xbc\xfc\x95\x8d\x45\x85\xd6\x4d\x25"
- "\x2f\x4c\xda\x52\x54\x5e\x54\x61\x2d\xd8\xb2\xf9\x95\x4d\x85\xd6"
- "\x09\x85\x93\x27\x64\x3c\x5a\x38\x3c\x7c\x0c\xed\x3e\x33\x75\x05"
- "\x6f\x7c\xdc\x79\xe8\x06\x25\x24\x19\xca\xb6\x24\xd9\x4a\x36\xa9"
- "\x31\xbb\x6f\xec\x9a\x52\x43\x65\x88\x4f\x6c\xa8\x66\x5e\x8f\x75"
- "\xe1\x6d\x62\x38\x94\xd3\x8a\xdf\x09\xa0\x7d\x5c\x4f\xf5\x37\x32"
- "\x3d\xa6\x7b\xd3\x99\x67\xe0\x85\x15\x65\x1b\x27\x6e\xfc\xb6\x13"
- "\x3e\x5b\x19\xaf\x09\x68\xb8\x41\xa9\xae\xad\x64\xc2\x93\x88\xc7"
- "\x6c\x34\xf3\x58\xd7\x37\x2a\x3c\xa6\x71\x2e\x79\xe7\x98\x69\x5c"
- "\xaa\x37\x79\x56\x82\x70\xcd\x4a\x50\x72\x19\x97\xac\x8f\x71\x2f"
- "\x79\x95\x96\xb0\x7e\x5e\x32\x8d\x93\xe3\xb3\x7b\xa0\xcb\x3c\xee"
- "\xdb\xfd\xab\x27\x33\xe1\x0f\x5e\xe4\xb1\x5b\xc4\x25\xfb\x8c\x94"
- "\x08\xba\x4c\xa7\x2b\x33\xe8\x0d\xe4\x55\x6e\x11\x02\x79\xb4\xeb"
- "\xe3\x69\x28\x83\x19\x65\x69\xd7\xca\xf1\x5f\x64\x39\x8e\x88\xb4"
- "\x9a\x14\xd0\x57\xcd\xf4\x8c\x33\xe9\x65\x00\xdd\x48\xf7\x8d\x62"
- "\xd0\x69\x66\xba\x62\x8d\xf5\xf1\x78\x17\xe8\x5c\x14\xdc\x0a\xbe"
- "\xdd\xa3\xee\x77\x3d\x54\xaf\xea\x1f\xca\xb3\xb7\x01\xbf\x0f\x7e"
- "\x46\x89\x07\xb6\x50\xaa\x70\xde\x2b\xce\xf9\x02\xe4\x2e\x6e\xa7"
- "\xa4\xed\xc2\x2b\xfe\xd3\xc7\x9d\x5a\x99\x6c\x6c\x1b\x7e\xfe\xdd"
- "\x76\x13\x97\x09\x6d\x45\x62\xc3\x67\x83\x8e\x2d\x9a\xde\x18\x23"
- "\x7c\xe2\x9d\x70\x9f\x6b\xdc\x47\xcc\x13\xf6\xb7\xba\xd1\x4e\xa1"
- "\x0c\xd0\xaf\x71\x56\xcd\x37\xf6\x89\xde\x55\x61\xbe\xd4\x38\xd6"
- "\x33\xdf\x20\xb8\x13\x74\xdc\xc2\x28\xef\x45\xb6\x28\xf9\xdf\xbd"
- "\x08\x69\xbc\x21\xfc\x77\xa7\x47\xe3\x67\x9c\xf8\xed\xd5\xf3\x51"
- "\xfd\xf0\xbb\xd9\x27\xf0\x42\x97\x63\x8e\x5b\x23\xbf\xb4\xea\x23"
- "\xe2\x82\x1b\xe1\x87\x6e\x92\x09\xb0\x17\x1a\x8e\x48\xfc\xfb\x50"
- "\x87\xba\x18\xff\x9e\x31\x44\x7b\x01\xd3\x5d\x3d\xce\xca\xe3\xbb"
- "\x88\xe3\x3e\xb1\x25\x7a\xcc\x5a\xd3\xe7\x59\x51\xfa\x9c\x59\xcd"
- "\x3e\x61\x0d\xf0\x43\x87\x0e\x5d\x47\x3b\x8c\xef\xc9\x35\x94\xce"
- "\xf9\xe0\xf7\x79\x1e\x0f\x01\x4e\xbf\x9e\x9f\x80\xfe\x1f\x0c\xaa"
- "\x31\x18\x4d\xb7\x26\xba\x6d\x9d\x3c\x2f\x22\x4e\xc3\xbe\x33\x8d"
- "\xac\x63\x3d\xd5\xf7\x4c\xd4\x75\x0a\xba\x7e\x41\xea\x55\x2a\xa5"
- "\x8b\xea\xbb\x9b\x1a\x52\x00\x07\xbd\xaa\x87\x3e\xb1\x5e\x01\x36"
- "\x5f\xd7\x29\xe8\xda\x79\x86\x03\x0d\xc3\x9b\x76\x64\x9a\xd8\x46"
- "\x76\x98\xee\x39\xc7\x3a\x26\xde\x7a\xaa\x5d\xdc\xb9\xb2\x5d\xc9"
- "\xe9\x9e\x73\x6e\xbf\x92\x41\x88\xef\xf7\x34\x86\xf1\xfd\x3c\xf4"
- "\x78\x38\xf3\x59\x8d\x55\xdf\x73\x0e\xb4\x9d\x97\xbe\xf8\x2e\xc8"
- "\x40\xb6\x55\xf7\xc8\x7e\xbc\xc6\xc3\xb3\x21\x1e\xde\xd3\x19\x8b"
- "\x87\x51\xbc\x33\xf1\x23\xaa\xef\xf1\x71\x5d\xe9\xa9\xbe\x77\x9c"
- "\xc7\x74\xf7\xa9\xc1\xe6\x0a\x90\x87\xc9\x54\x43\x09\x9c\x47\x6b"
- "\xaa\x84\xcf\xd5\xf3\x38\x04\x5e\x7b\xed\xc5\xb7\xd5\xe7\xd6\x46"
- "\x22\x1e\x13\xe7\xf4\x69\xa9\xcc\xdf\x7b\xf7\x87\xd2\x0b\x5f\x74"
- "\xfa\x09\x2f\x44\xd0\x2a\x1f\x51\x7d\x6f\xe3\x1b\x29\xd0\x23\x45"
- "\xef\xd9\xdb\xd1\x9b\x66\x55\xed\x64\xcb\x7d\xac\xdf\xd6\x78\x77"
- "\x2d\x11\x87\xa9\xef\x7b\x7d\xdd\x68\x7b\xa2\xc7\xf7\x07\x9f\x6f"
- "\xb0\x66\x47\xce\x37\x58\x67\x0c\x36\xdf\x10\x95\xef\x6e\xce\x37"
- "\xd8\xb0\xcc\x10\xca\xdb\x5a\x1a\x8c\x91\xb7\x9e\x7e\x72\x63\x78"
- "\x7f\xc6\xfa\xcf\x4c\x43\x1b\xda\x29\xf1\x8d\x65\x06\x01\x3c\xad"
- "\xb2\x0d\xb7\x9e\x57\xfe\x0b\xfb\x45\xd6\x26\x86\x89\x2e\x47\xff"
- "\x5f\x42\xea\xaf\xf9\x75\x53\x7e\xc4\xcf\x27\xb6\xae\x74\x6f\xba"
- "\x1e\x6d\x8c\x00\x26\x11\xe3\x23\x91\xc8\x2a\xe1\x05\xfe\x54\x90"
- "\xf6\xed\x95\x1f\xa6\x7e\xf8\xfe\xf8\x7f\xc3\xdf\x30\x45\xaf\xc4"
- "\xe7\x27\x83\x96\x5f\x4e\x18\x44\xd6\x6d\x52\x0b\xd2\x93\xc4\xfa"
- "\xe3\x91\x01\xc7\xb2\x78\xe0\x2b\x96\xc0\x42\x04\x34\xfc\xfa\xb7"
- "\x08\xff\xe6\x90\xc8\x6f\xfc\xc5\xad\x0a\xcb\xe0\xde\xb8\x42\xb9"
- "\xbc\xeb\xfe\xc6\xfe\x20\x63\xa3\x39\x3c\x4b\x33\x39\xe2\xe5\x8f"
- "\x24\xfe\xc7\x0f\x7c\xe9\x88\xb7\xee\xeb\x07\x18\xe5\xdb\x1d\x06"
- "\xfe\x7b\x45\xfe\xf8\xf6\xdb\x94\xf1\xcb\xfe\xdd\x13\xf6\xfb\x5e"
- "\xf5\x1a\x5f\xfb\x15\xe2\xbf\xfd\x9f\xf5\xfc\x30\xfd\x67\x48\x3d"
- "\xee\xb3\xc6\x02\x0d\xf1\xff\x3e\x87\x1e\x14\xae\xa1\xa1\xf8\x09"
- "\x81\xc8\xef\x6f\x36\x47\x7e\x3f\x94\xf0\x15\x50\x4e\x2d\xfc\x8f"
- "\xdd\x03\x1f\x25\xfd\x42\x7f\x60\x52\x54\x95\x49\x72\x45\x55\xa1"
- "\xd0\x9f\x46\x4d\x1c\xe8\x59\x15\x16\x6c\x8a\x0d\xfd\xbf\xe7\x6f"
- "\xec\x6e\xad\x42\xdc\xeb\x35\x0f\x88\x9c\x1b\x15\xc6\xdf\x43\xac"
- "\x5a\xd8\xd4\x5f\x0f\x80\x97\x61\xd6\xb0\x6f\x43\x26\xfe\x69\x84"
- "\x65\x9d\xf8\x55\xd0\xfa\xf5\xdf\xff\x0f\xff\x0c\x5c\x3f\xbe\xfe"
- "\xfb\xdf\xf4\x27\x54\x2b\x0e\x4b\x24\x5f\xfc\x9f\xe8\x37\x94\x42"
- "\x8b\x10\x5a\x80\xd0\x7e\x7c\x25\xed\xf8\xd7\x7f\x5f\xff\x7d\xfd"
- "\xf7\xf5\xdf\xd7\x7f\x5f\xff\x7d\xfd\xf7\xff\x81\x3f\x83\xec\x47"
- "\x08\xed\x4f\xff\xad\xe2\xb8\x0b\xf4\x52\x9e\x0c\x33\x1a\x28\x04"
- "\x81\xee\xf6\x23\x64\x48\xa0\x21\xa6\xaf\xce\xcb\xb3\xf6\x13\xf4"
- "\x05\x13\x64\xe0\x99\x8a\x67\x3a\x9e\x6f\x84\x85\xdf\xf7\x55\x51"
- "\xf4\x6f\xfe\x33\x80\x81\x71\xe8\x17\xc6\xd3\x10\x1a\x4a\x09\x34"
- "\x8c\x86\xd3\x1d\x94\x48\x23\x68\x24\xfa\x9b\x66\x4a\xa6\x14\x1a"
- "\x45\xa9\x34\x9a\xc6\xd0\x9d\x64\xa1\xbb\x68\x2c\x4a\x32\x8e\xee"
- "\x46\xdf\xfe\x5e\x30\x64\x7c\xec\xb2\x38\x28\xd3\x82\x7f\xf0\x7f"
- "\x1e\x65\xca\xef\x75\x5f\x87\xff\x1f\x0d\x6f\xd1\xc2\xcf\x6b\xe1"
- "\x9e\xaf\xc3\xff\x8f\x86\x5b\xff\x9d\xdf\xe3\xff\x5d\xdf\x06\x98"
- "\x6c\x65\xb5\x0d\x31\x6d\x65\x74\xa8\x41\xfb\xeb\xff\xa6\xcf\x49"
- "\x3f\x00\x5f\x64\xfa\xe8\xbf\x4c\x3c\x33\xd4\x4f\x3b\x91\x1a\xe7"
- "\x15\xe1\x7f\x81\xc1\x52\xea\x7f\x55\xa7\xf0\x9c\xc1\x73\x01\xcf"
- "\x7f\xc7\xf3\x3f\xf1\x5c\xd5\xf1\x28\x18\x1e\xfa\xfb\x57\x3c\xff"
- "\xe3\x38\xd1\x45\x0f\x9e\x2c\xa2\x0f\x2b\x89\xfe\x6c\x26\xfa\x08"
- "\x6d\xd4\x5f\x9a\x88\x2e\x79\x43\x38\x3f\xd9\x1b\xa2\xee\xaa\x5a"
- "\xd9\x2d\xe5\xf7\x19\xdf\x73\x0e\x4d\xea\xd3\x61\x9b\xb3\x97\xe5"
- "\x58\xa7\x4e\x9e\x31\xf9\x91\x0c\xeb\xa4\xbc\x49\xd6\x69\x19\x53"
- "\x33\xa6\x64\xcc\x98\x32\xf5\x51\xeb\xd4\xe9\xb3\xa6\x67\xcc\xca"
- "\xf8\x96\x75\xe3\xf6\x2d\x25\x53\x33\x5e\x2a\xb2\x6e\x2a\x2c\x29"
- "\xb7\xbe\x58\xb2\x65\xe3\xb6\x82\x2d\x45\x9f\x57\xac\x2f\xfb\xc7"
- "\xe4\xdd\x1d\x24\x29\x81\x48\x6e\xdf\x4b\xa6\x07\xad\x64\x9a\x65"
- "\xa6\xfe\x18\x83\x4b\x1b\x43\x4d\xd7\x9e\x98\x7f\x1b\x9f\x7f\xf6"
- "\x4f\x13\x56\x8e\xfc\xcd\x13\x2f\x4d\x98\x33\xef\xbd\x43\x4d\x64"
- "\xcc\x68\x24\x63\x7a\x16\x19\xef\x31\x91\x31\x65\x22\x19\x4d\xa7"
- "\xc8\x58\x6a\x26\xe3\x0b\xb5\x64\x7c\x6e\x36\x19\x17\xe5\x90\x71"
- "\x6e\x8c\xb0\x9d\x59\x2a\xec\xa7\x9d\x64\x3c\x56\x4c\xc6\xda\x65"
- "\x64\xfc\xfe\x5e\x15\xf6\x4f\xa5\x64\xfc\xc7\x0b\x83\xd1\xf0\xef"
- "\xf4\xf7\x45\xfd\x88\x01\x7f\x1e\xa9\x6b\xbc\x0f\x60\x4d\x65\x8c"
- "\xc1\xd2\xaf\xff\xbe\xfe\xfb\xfa\xef\xeb\xbf\xaf\xff\xbe\xfe\xfb"
- "\xfa\xef\xff\xe5\x7f\x5e\x03\xcd\xf8\xcc\x68\xa2\xdf\xc0\x5b\xea"
- "\x71\x26\x8c\xf3\x18\xc6\x9d\xe5\xb5\x25\xc4\x7b\xa8\x28\x41\x9e"
- "\xf7\xc2\x4f\xd8\x9a\x94\xc4\x79\x47\x89\x78\x0f\xe8\x1b\x47\x84"
- "\x97\xf7\x77\x66\xfd\x98\xa8\x35\x8d\x88\xd7\xbb\x00\xc7\x2a\x0f"
- "\xbd\x9c\xa8\xd6\x38\x09\x1f\xc7\xf3\x3a\x29\x84\x57\x20\x7c\xef"
- "\x60\xeb\x56\xf4\x35\x5a\x8c\x33\x6b\xbc\xa4\xe5\x58\x14\x1e\xc6"
- "\xd1\x8c\xb0\xc0\x6d\x70\x24\xea\x74\xf9\x8c\x64\x60\x7c\xdd\x4e"
- "\xb2\xf8\x9c\x2d\xa3\x91\xd6\x87\xf2\xa4\x6b\x6b\x8c\xba\x84\x93"
- "\xe2\x5a\x6d\x01\xde\x6b\x6a\xb8\x4c\xc3\xdf\xc5\xdb\x88\xb7\x5c"
- "\xe3\xbf\x47\xa5\x4b\x63\x1c\x48\x6b\xe8\x71\x0e\xcb\xe8\x4f\x0b"
- "\xdc\x72\x9f\x3a\x0d\x2f\xf1\x19\x5b\x8c\x0a\xd6\x3c\x4c\x83\x35"
- "\x02\x76\x95\x0e\xab\xe2\x8c\x0b\xb5\xb8\x3b\x10\x67\x8b\x8c\x33"
- "\x55\x6b\x71\x89\x88\xab\x89\xa2\xcf\xe4\xbe\x15\xa0\xcb\x34\xec"
- "\x04\x68\xb1\xf2\xde\x26\x4e\xa3\xc1\x27\x03\xbe\x35\x12\x17\x91"
- "\x16\x97\x82\x38\x4f\x64\xdc\xaf\x32\xb4\xb8\x3b\x11\x17\x88\x8c"
- "\x33\xe8\xe9\x2c\x3d\xce\xe1\x96\x18\xe5\xe4\xfc\x0d\x2a\x6f\x2e"
- "\xc3\xf0\xd9\x80\x71\x30\xcc\x32\xab\x83\x58\x56\x1c\x77\xba\xb1"
- "\x3f\x7f\x86\x59\xa7\xe3\xf1\x20\x7d\x18\x4f\xc1\xcb\xe1\x95\x7a"
- "\xfa\x2c\x2b\xe3\x20\xc9\x43\xc6\xe3\xa1\x61\x39\x8c\x87\xbf\xf1"
- "\x7b\x1c\x97\x5b\xfb\x6d\xe5\xf2\x45\xae\xf5\x31\x01\x6d\x3c\x1c"
- "\xd1\x21\x78\x86\x26\xe8\x3a\x50\x6e\x11\x41\xfb\x5d\xbc\xbe\x2b"
- "\xcb\x16\x74\x0a\x72\xdb\xfc\x64\x1d\x4b\xf6\x4b\x74\x87\x85\xd7"
- "\x0b\x1d\xdc\x41\x09\xf6\x32\xe1\xe7\xb3\x00\xda\xbc\x5d\x64\xf7"
- "\x8a\x4e\xde\x6f\x5f\x75\x9d\x12\xf8\xdc\xa8\xaa\x97\xc9\xd2\x5a"
- "\xf9\xd7\x98\x6b\x94\x82\x7c\x7e\xf5\x38\x4e\xdb\x41\x6d\x75\x1d"
- "\x64\xaf\x8b\x4c\x6b\xbf\x9b\x2c\xe7\x78\xef\xbe\x93\x92\x98\x8e"
- "\x56\x6b\x80\x02\x29\x59\xb6\xca\xb7\xc9\x64\x1f\x4f\xc6\x73\x85"
- "\x2d\x3a\x2d\x1e\xa6\x65\xef\x15\x4a\x78\xef\x45\xe8\xd0\x15\xa6"
- "\x37\xd7\xf6\xfe\x0e\xbf\xf1\xb4\x25\x97\x4e\x5b\x2e\x52\xab\x65"
- "\x0e\xb5\xda\xb2\xe8\xe0\x15\x4a\x3c\xed\x9f\x4d\xad\xa6\xf9\xa8"
- "\x63\x59\xe4\xee\xc2\x6f\x6b\x1f\x60\x7c\x72\x3f\xc8\x65\xba\xe3"
- "\x7c\xcd\x77\x29\xc1\xa3\x70\x82\xbf\x77\x5c\xd4\xf7\x36\xf0\x77"
- "\xac\x72\x94\xdf\x45\x16\xd0\xd7\x09\x5a\x1e\xbb\x44\x89\xa3\xd3"
- "\x2c\x94\x01\x9a\x87\xba\x6b\x03\x64\xaa\xa4\x61\x83\xd4\xad\x54"
- "\xb9\x2f\x1a\xba\x59\x7f\x44\x74\xb2\x8e\x76\xef\xcc\x47\x3d\x4d"
- "\xcc\x45\xde\x5d\xda\x7a\xc1\x2e\xfb\xbb\x64\xea\xde\x96\xcf\xeb"
- "\xa4\x3b\x10\x57\xac\xc7\xf1\x7e\x6f\xde\xc7\x3d\x25\x95\xcc\xee"
- "\x40\x26\x7d\x70\xab\x93\xd7\x22\x76\xf1\xfa\x50\xc6\x97\x64\xa3"
- "\x38\x94\x27\x1e\xf4\x3c\xd6\x80\xf0\xfb\x01\x87\xf4\xc7\x3d\x74"
- "\x32\x43\xae\x5f\xbc\x73\xa5\x2f\x78\xe7\xca\xeb\xc1\xb7\x56\x76"
- "\x8b\xb7\x56\x7e\xd6\xf7\xd6\xca\x4f\xed\xdb\x29\xa1\xef\xce\x95"
- "\xde\xb6\x32\x29\x03\x73\x5b\xd9\x55\x5e\x57\x98\xb0\xeb\x2a\x99"
- "\xd7\xbc\x0c\xd9\x07\x3e\xa4\x5d\x25\x64\x09\x26\x3f\x95\xe1\x0e"
- "\xfc\x91\xd6\x54\x92\xc0\xef\xcc\x58\xe5\xeb\x4e\xc9\x6d\x56\x75"
- "\x28\x01\x65\x1a\x61\xf5\x98\xe6\x95\x71\xbe\xde\xe4\x65\xcd\x78"
- "\x4e\xe1\x69\xc1\xd3\x2a\x52\x72\x5b\xc1\x2b\xfb\xc8\xdd\x06\xe2"
- "\xfd\x0c\x53\x82\x64\xb8\x42\x23\x66\x83\x7e\xf3\x20\x7c\x1b\x17"
- "\xac\x7e\xa3\xe9\x9b\x0e\xaa\xe2\x73\x10\xd8\x36\xb1\x5d\x62\x3b"
- "\x85\x7c\xf6\x21\x9f\x26\x59\x17\x8f\x08\x9f\x48\x79\xa3\x09\xe1"
- "\x9d\xbe\x9d\xc5\x06\xef\xce\x62\x63\x77\xca\x1b\x3f\x07\xcc\x09"
- "\xc0\x74\x6a\x3c\xec\x64\x5c\xa8\x13\xde\x11\x01\x8a\x03\xce\xb2"
- "\x7f\xb8\xd1\x6e\x3a\x7a\x44\x5c\x04\xdc\x85\x7e\x5c\xc0\x0d\x3c"
- "\xe0\xff\x88\x4e\x3d\x0c\xbc\xee\x38\x00\x38\x4e\xef\xf6\x67\xb2"
- "\xfd\xf6\xb8\x4b\x3b\x79\x3d\xef\x70\xd1\xab\xf2\x03\x0c\xef\xf5"
- "\xf4\x8e\xf0\xd3\x90\x1e\x27\xe5\x31\x6e\x4e\xe7\xee\xea\x24\xa4"
- "\xfb\xb9\xb0\x17\xc3\xbe\xd1\xe2\x1e\x51\x6c\xe0\xbd\xfd\xa7\x91"
- "\x5e\xe5\x3d\x32\x4f\xa7\x91\xf3\x90\x7b\xfb\x99\x4e\xe8\xc3\xe9"
- "\x52\x3f\x8d\xa8\xa5\x38\xa4\x5b\xca\xf8\x18\x17\xf4\xc0\x83\xb2"
- "\xfe\xfc\x74\xa9\x97\x82\x22\x02\xa7\x47\xc3\xd7\x18\x81\x0f\xe1"
- "\x02\xf8\x58\xff\x5a\x91\x66\x44\xa3\xc4\xf7\xcc\x3f\x04\x19\x9f"
- "\x9f\x4c\x56\x49\xef\xb3\x8c\x43\x9e\xcd\x01\x9c\x2d\x5b\x9f\xa4"
- "\x2e\x4a\x4a\xf0\xda\x8b\xe3\xe4\x3a\x42\xa4\x7f\xbf\xaa\x33\x5e"
- "\x74\xe7\xc7\x8d\x94\x6b\x08\x9f\x24\x3e\x8b\xa3\x8b\x46\x7e\x2c"
- "\xba\x8b\xe3\x46\x74\x91\x89\x69\xe6\x7d\x45\x4c\x67\xb8\x2c\x9f"
- "\xc9\x7e\x76\x0e\x3d\x9b\xb5\x30\x6b\x0e\x2d\x7a\x62\xde\x1c\xca"
- "\x78\x6c\x52\xc6\xf4\x6f\xcd\x9c\x4e\x79\x2b\x9e\x99\x43\x79\x8b"
- "\xe7\xd0\x52\x3c\x79\x4b\xb3\x9f\xc9\xca\x5e\x3a\x87\xf2\xe7\x2f"
- "\xc4\xd7\xbc\x39\x53\x33\x16\x4c\xca\x9b\xb7\x30\x9b\x9e\x5e\x36"
- "\x2d\x63\xda\x34\x7a\x22\x3b\x77\x6a\x46\x86\xf6\x9e\x9a\xc1\x20"
- "\xcf\xcf\xcc\x5e\x3a\x29\x6f\xcb\xe6\x8a\xcd\x93\x16\x2f\x9c\xc7"
- "\x21\x94\x9d\x3d\x87\x27\x14\xc2\xf4\x27\xbd\xef\x46\x1f\xf3\xd9"
- "\x27\x3e\xc9\xe1\x73\x1c\xa8\x1e\xf2\xc7\xd3\x25\xf7\x87\x90\xf9"
- "\x5f\xea\x59\x6e\xd2\xbe\x26\x71\x9b\x65\xea\x71\x26\x79\x3c\xa6"
- "\x2c\x69\x7f\xf9\x2c\x85\xcb\x34\xe6\xc7\x88\x7b\x50\x6b\x3f\xe2"
- "\x7b\x9c\x66\x8a\x8c\x4f\x81\x7d\x4d\x9a\xc2\xfb\x0d\xdc\x78\xc0"
- "\x73\x1f\xec\x20\x78\xeb\xa5\x6e\x7b\x7e\xbc\xdc\xef\x09\x79\xf3"
- "\x3a\x5c\xa4\x9d\x1d\x56\xdf\x3b\x78\xbd\xae\x75\x07\xc5\x5d\x23"
- "\xf3\xe8\xb6\x8a\x4c\xde\x93\x43\x7c\x83\xb5\xc4\x71\xbd\x1f\xc7"
- "\x70\x6d\xcf\xa8\xa7\x9e\xd7\x42\x2b\x3c\x7b\xc3\x6c\x83\x87\xf1"
- "\x1c\x44\x9c\x86\xeb\xb9\x36\xd8\x08\xd8\x70\x67\xd0\x9e\x4e\x22"
- "\x25\xcb\x11\xec\x4d\x97\xed\x02\xd2\x9d\xd2\x75\x1a\xf9\xfb\x5a"
- "\x91\xa7\x78\x2f\xc7\xc0\xeb\x52\xe5\x1a\x55\x4a\x3a\x53\xc3\x6b"
- "\xb7\x53\x96\x9d\x91\x7b\xb1\x65\x58\x72\x42\x5f\x35\xbe\xab\x97"
- "\xfd\x56\xd8\xd5\x1e\x6b\x84\x0d\xc3\xf7\x19\xc8\x3b\x0e\xfa\x42"
- "\x7d\x9f\x20\x7c\x13\xc5\x21\xfc\xb7\xe0\x75\xbb\x84\xff\x44\xa6"
- "\x1f\x8a\xb0\xbf\x03\xbe\xdf\x06\x53\x96\xfd\x0e\xfa\xc3\x61\xf0"
- "\x15\x92\x0f\x20\xfd\xef\xd9\xe6\x29\x3b\x3c\xe6\x9f\x48\xed\x3f"
- "\xf1\x2a\xfc\xda\x37\x9f\x5d\x51\xa5\xbe\x4f\x83\x2f\xa7\xd1\x72"
- "\xb5\x56\xb2\x7f\x93\x8c\xf2\x8f\xc8\x57\x6d\xe4\x98\x56\x86\xe5"
- "\xbd\xf2\xc2\xfc\x87\x26\xe0\x3d\xdb\xb2\xa3\x4b\x9e\x77\xe8\xa1"
- "\xe4\xcc\xa0\xbd\x98\xc2\xca\x32\x91\xe9\x00\xdd\xa6\x9e\xde\x62"
- "\xb4\x99\xc9\x19\x32\x2d\xe8\xd3\x68\x63\x98\x71\x4c\x3f\xdb\x09"
- "\xc8\x75\x06\x64\x3e\x0c\xf9\xf9\xa2\x64\x6e\x66\x7e\x80\xde\xf6"
- "\x20\xde\xc0\x63\x11\xdb\x8a\x41\x17\x19\x99\x1f\x9e\x10\x0e\x9f"
- "\xd2\xa9\x94\x19\x51\x3a\xf5\x3a\x70\xcf\x09\x8b\x5f\x16\x15\xbf"
- "\x11\xf1\x4f\x6a\xf1\xa8\xaf\x29\x15\x51\xf9\xbb\x10\x3f\x9f\x65"
- "\x88\xfa\x18\xe7\x21\xf3\x89\x7a\xf6\x27\x43\xf0\xc7\xa2\xe0\x5b"
- "\x00\xff\x1d\x5e\x97\xcf\x6d\x05\xc3\x37\x68\x7a\x0f\xf8\x04\xc0"
- "\x5f\x88\xca\x7f\x11\xe0\x97\x86\xd1\x17\x55\xfe\x51\xa7\x10\x9f"
- "\xcf\x7a\x8a\x77\x21\x60\x86\xb2\x0d\x60\xfb\x73\xba\x94\xe5\x33"
- "\x2a\x2d\x0a\x3e\x0b\x70\x1b\x98\xcf\x92\x47\xdd\xcc\x23\xb3\xee"
- "\xdb\x5c\x54\x34\x8c\xca\x8f\x4a\x63\x43\x9a\x72\xe6\xaf\xd4\xb3"
- "\x9e\x98\x69\xf6\x47\xa5\x39\x21\xf5\x54\xe5\xa3\xc9\x58\xa5\xd1"
- "\x6c\x5b\x38\x0e\x2e\x1b\xfc\xad\x51\xe7\x23\x71\x8c\x86\xcf\x96"
- "\xb4\xf3\x80\xb2\x19\x77\x40\x27\xa6\x21\xec\x28\x70\x9e\x63\x3d"
- "\x42\x3d\xf3\xb9\xbd\x7e\xd8\xde\x9c\x44\xa5\xbb\xa9\x53\x93\x2a"
- "\x89\x7f\x4f\xe2\xdf\x8c\x5b\xf4\xe6\x6a\xf5\x29\x75\x2a\xde\x1c"
- "\x2e\xcf\x87\xe4\x7a\x2c\x7a\x9f\x0a\x2a\x9c\xa9\xcb\x51\xdf\x8d"
- "\xf8\xee\xd3\xf2\x78\x93\xf7\x35\x83\xfe\xdf\xc1\xae\x13\xef\xcd"
- "\x46\xf8\x0c\x84\x1f\xd0\xe2\x5f\x65\x78\xfc\x9e\xaa\xfd\x36\x40"
- "\xc7\x7e\xa7\xd5\x33\xd4\xa9\xd1\x72\x0f\x1a\xd7\x2b\x3d\x7d\x50"
- "\xe9\xfd\x3c\xc4\x95\xe0\xbd\x10\xef\xe5\x78\x3f\x8d\xf7\x54\x3e"
- "\x8b\xc2\xde\x27\xeb\x17\x7f\xdf\x8d\xf7\x33\x78\x0f\xc3\x7b\x29"
- "\x68\xbb\x0e\xbe\x9f\xf1\x42\xa7\xa3\x74\xa6\x0b\x32\xe4\x7a\x3f"
- "\x54\xc9\x30\xb5\x83\xf3\xec\xd3\x6d\xc1\x27\xa1\x30\xcd\x3e\x68"
- "\xf5\x41\x0b\xeb\xcd\x61\xbe\xe4\x01\x7f\x0b\xe7\x2f\x14\xae\x78"
- "\x25\x27\x05\x13\x54\xe9\x4c\x4a\xde\x5a\x98\x82\x33\x84\xe7\x89"
- "\x77\x4d\x95\x4f\x08\xbc\x1d\xf2\x1c\x0b\x1a\xbd\x17\x3c\x31\xe1"
- "\x7b\x19\xf3\x49\xc2\x4b\xbc\xa3\xbc\x61\xf2\x86\x7f\x3f\xba\x25"
- "\x4a\xde\xac\xc3\x07\xa4\xbc\xc1\x3b\x9d\x66\xa6\x1f\x3a\xcd\x6d"
- "\xe5\x10\x5d\x6f\xa0\xdf\x5d\xa1\x3a\x36\x26\x21\xaa\xce\xa4\x01"
- "\xcf\x61\xd6\x8f\x91\x65\x5a\x9d\x1c\xd3\x0f\x8f\x76\x63\xcc\xcc"
- "\x48\x78\x33\x74\x75\x39\xda\x83\x51\x27\x34\x5b\xe7\x8b\xab\x64"
- "\x9d\x1e\x03\xff\xff\x5c\x87\xf4\xdb\xaa\x97\xb5\x31\x1e\x9f\x5d"
- "\x9e\x13\xe4\x8b\x2b\xe3\xba\x38\xc6\xa1\xc7\xcb\xb8\xe4\x9a\x0c"
- "\xa6\x3d\xae\x54\xc6\xd5\x79\xa0\x8a\x7a\x1c\xa9\xfd\x67\xbe\xb8"
- "\x0a\x19\xd7\x1c\xc2\x9b\xd5\xa8\xe1\x8d\x8b\x79\xc6\x93\x2b\xcb"
- "\x35\x89\xc8\xf8\x90\x83\xe2\xdd\x81\x0b\xb4\x24\x20\xfa\x26\x39"
- "\x68\x98\x3b\x70\x82\x1e\x24\x4a\x76\x07\x2e\xd2\x43\x44\xe3\xdd"
- "\x81\x1a\xf8\x01\xc7\x38\xfe\x83\x6f\x92\xc1\x80\xb7\xfd\x01\x87"
- "\xd1\xe0\x0e\x54\x50\x9a\xc3\x84\x77\x29\xcd\x8f\x17\x3d\xee\x40"
- "\x2e\xe0\x0a\x69\x49\x9f\xf8\x24\x2b\x5e\xfc\x65\x6d\x1f\x99\x73"
- "\x5f\x15\x76\x77\x00\x3e\x79\xe0\x2c\xc2\x83\x62\x49\xdf\x4d\x3c"
- "\x3d\x22\xe8\xca\x6a\x5c\xd2\xf7\x89\x98\xf7\xea\x07\xf8\xfe\x8b"
- "\x10\x46\x12\xee\xc0\x6c\x6a\xf3\xf9\x00\x67\x17\xe2\x70\x96\x6b"
- "\xcd\x75\x23\xf5\xf2\xb9\x4c\x87\xb3\x1a\x51\x96\xa6\x5e\x94\x03"
- "\xed\xdc\xfb\xbd\x3b\xf1\xae\xce\xfa\xa9\xfc\x76\x65\xb5\x08\x73"
- "\x56\xd3\x64\x74\x70\xb8\x0c\xee\x40\x07\xad\x85\x8b\xbe\x64\xbb"
- "\x57\x30\xfd\x23\x77\x73\xff\x66\x36\x9f\xe9\x90\xb4\x64\xbb\x5d"
- "\x20\x2e\x41\x24\x67\x35\xb9\x03\x5d\x84\x3c\x5a\x80\xef\x97\x12"
- "\x9f\x2b\xcb\x03\x58\x2f\xc3\x85\xe3\x61\x1c\x0c\xbb\xa4\x8f\xcf"
- "\xd9\xca\xf2\xf4\x26\x67\x9d\xc7\xe3\xed\x4d\xce\xb6\x8a\x94\xec"
- "\x69\xc2\x99\xfa\x6b\xde\x97\x2b\x5c\xd9\x99\xf8\xce\xf3\xf3\x19"
- "\x52\xcc\xcb\x3e\x1a\x2a\x0e\x67\x67\x42\xaf\xb2\xa0\x9f\xa0\x37"
- "\xbb\x4c\xd2\x5b\x9d\xbd\xd9\x2f\xcb\x91\xbd\x49\x95\x23\x7b\x23"
- "\x87\x77\x43\x77\xf0\xdb\xd5\xad\xe2\x0e\x21\xdd\x32\x99\xce\x95"
- "\xed\x12\xe6\xec\x46\x3f\xea\x1d\xf8\xea\x60\x3e\x82\xaf\x0e\xe6"
- "\x25\xf0\xbb\xdc\xb6\xfd\x24\x92\xb3\x1b\x41\x0f\xda\xc4\xec\xdf"
- "\xf4\x4a\x5f\x20\xfb\xbc\x5f\xe1\x76\x03\xcf\x2a\xe8\x75\x1c\x70"
- "\x9c\x07\x2e\x4f\xaf\xd3\x4a\x4b\xb6\x0b\xff\x92\xc0\xee\xc0\xda"
- "\xed\x14\x37\x91\x1c\x06\xbe\x7b\xcb\x6d\x2b\x44\x39\x5b\xf1\xce"
- "\x42\x3c\x8d\x42\x5e\x1f\x00\xef\x79\xce\x0f\xf9\xc0\x17\xcd\xfe"
- "\x10\xb8\x0a\x99\xa6\x9b\x7c\x56\x6b\x4a\xb6\xf7\xa6\xa4\x6f\xbe"
- "\x39\xe8\x9a\x9f\x11\x34\xcf\xb7\xea\x3a\xc4\xfa\xa3\xf8\x56\x43"
- "\x8b\x7d\x22\xe0\x0e\x1c\x25\xe8\x98\xb9\xcd\x77\x91\xe3\xd1\x07"
- "\x39\x01\x39\xb3\x4e\x55\xe0\x7d\x8c\x58\x7f\xda\xca\x5e\x65\xd8"
- "\x0f\x58\x87\x16\x97\xf9\x76\x4f\xa2\x32\x03\xbe\xed\x6b\x03\x09"
- "\xb4\xa6\xcc\xe4\xe8\x73\xcd\x07\x0c\xcb\xe5\x02\xd2\x70\xba\x52"
- "\x4a\x32\xc0\x0f\x37\x88\x40\x92\xcd\x6b\x1a\x51\x6c\x17\x6d\xbe"
- "\x5c\xc0\x96\xc9\xbb\xc4\x58\x8f\x18\x7e\x51\x97\xf0\xf4\x99\xe7"
- "\x37\x71\xd9\xc4\x48\x07\x9d\xeb\x7a\x84\xb8\x2f\x74\xae\xeb\x18"
- "\xeb\x69\x50\x98\xe7\x3b\xa0\xa3\xbd\x8b\xba\x1c\xf1\x6b\xae\x93"
- "\x01\x61\x7d\xe7\x8a\x4f\x20\xbe\x15\x70\x67\xa5\xde\x2e\xbe\x1e"
- "\x48\x0a\x98\xb3\xbd\x01\xd7\x7c\xd7\xe2\xeb\xbd\xe2\x5c\x71\x0d"
- "\xad\xee\x72\x80\x57\x27\x68\xd1\xd5\x40\x5c\x5b\x59\x21\x60\x7a"
- "\x10\x7e\x4c\xea\xff\xa2\xab\xdd\x62\xf1\xcb\xe2\x93\xc5\xd7\xff"
- "\x22\x16\x15\x8b\x0f\xd6\xda\x68\xe4\x1d\xbb\x45\x90\xeb\xc5\xd9"
- "\x8e\x13\x74\xc7\x45\x3e\xb3\x27\x8b\x72\x0b\x82\x62\xd1\xd5\x4f"
- "\xc4\x9a\x97\x99\x37\xb3\xe9\x5c\x31\xea\x8f\xad\x06\xfc\x9e\x6f"
- "\x3e\x57\x7c\x0a\xf9\x67\x01\xaf\x5d\xb8\x6d\x47\x01\xdb\x92\xb4"
- "\xfa\xaa\x99\xce\x76\xd4\x50\x20\x39\xdb\xdb\x77\x78\x3e\x05\x93"
- "\xe7\x5b\x83\x87\xe7\x67\x88\xe4\xf9\x8e\xc0\xe1\xf9\xae\xbe\xe4"
- "\xf9\xd0\x81\x05\xec\x9f\x0c\x63\x99\xdf\x72\x92\x55\x54\xcf\x0f"
- "\xde\x62\xf9\xbb\x16\x98\x85\x79\x41\x06\x6c\xa6\x50\xba\xbf\xc0"
- "\xcc\xfd\x7b\x91\xbc\x20\xa3\x37\x79\x01\xe0\xf0\x96\xba\xb7\x20"
- "\x93\xf5\x52\xb6\x59\xd5\x0b\xe6\xa2\x8d\x89\x43\x7c\x1e\x9e\x75"
- "\x78\xca\x10\xd6\x02\xfc\xc9\x3d\x0a\x67\x8b\x78\xdc\x05\x5f\xf6"
- "\x3a\xe3\xf1\x2c\xe9\x9b\x2b\xc0\x43\xd4\x93\x05\x2d\xc1\xc3\x0b"
- "\xce\x8b\x94\x1c\xf2\x4b\xdd\x5f\x20\x18\x77\xef\xce\x74\xee\xf7"
- "\x9b\xc4\xe1\x1c\xf8\x55\x39\x4e\x3f\xeb\xaa\x39\xc7\x11\x34\xe7"
- "\x78\x84\x2b\xc7\xf5\xd4\xab\xc2\xdb\xe7\xca\x69\x0a\xba\x72\x1a"
- "\x03\x43\xe0\x23\xdb\x4e\x11\xdb\xa7\xc0\xaf\x04\x78\xf0\x4f\xe0"
- "\xc7\x31\x29\x7f\xb7\x0d\x75\x60\xfb\x58\xc7\xb9\x2e\xe8\x42\xd9"
- "\x4f\xa4\x6d\x6a\xf3\x5d\x90\x3c\x15\xc9\x39\x0e\xd6\x29\x96\xef"
- "\x9a\x32\x72\x20\x2f\x57\xf0\x70\x4e\x63\xdf\x61\xe0\x4d\x46\x3e"
- "\x29\x4f\xdd\xe7\x97\xf5\xf5\x29\xe8\xeb\x29\xe2\x73\xb5\x95\x8e"
- "\x3f\x65\x1d\xcc\x46\xb2\xad\x62\xfb\xb4\x24\xe0\x67\x9d\xf9\x1b"
- "\xdb\x35\x65\xa7\x68\xad\x6e\xa7\xd8\x46\x71\xbf\x83\xed\x54\x50"
- "\xb3\x53\x41\xcd\x4e\xc9\x6f\x33\x6c\x8d\x2b\xab\x89\xed\xd1\x12"
- "\x9b\xb2\x33\x4b\xfa\x32\x04\x74\x23\x11\x38\x9a\x94\x2c\x00\x53"
- "\x9d\xf5\x4b\x09\x2f\xf9\x94\xe5\x09\xc2\xde\xe0\xf1\x06\x95\xbd"
- "\xc9\xd0\xec\x8d\x51\xb7\x37\x7c\xe6\x2b\xea\x54\x30\x96\xbd\x09"
- "\x6a\xf6\xa6\x4f\x28\x7b\x13\xd4\xec\x0d\x87\xf7\x69\xf6\xa6\x2f"
- "\x86\xbd\x09\xba\xb2\xb9\xbc\x71\x9a\x9d\x71\xb0\x9d\xe1\xf2\x06"
- "\x0f\x67\x37\x06\x95\x9d\x69\x41\x9f\xc3\xc8\x76\xa6\x0f\x69\x82"
- "\xba\x9d\xe9\x91\xe9\x3d\x6c\x6b\x7a\x5f\x23\xd8\x4f\x2b\xb1\x8d"
- "\x91\xf6\x24\x30\x3e\xc0\xf6\x04\xfc\x9b\x1b\x6d\x4f\x80\xcf\x8b"
- "\xdf\x66\x65\xa7\xe6\x5b\x93\x76\x8b\x00\xec\x09\xf8\xe4\x83\xac"
- "\x3f\x44\xff\x1b\x76\xdb\x56\xe1\x70\xdb\x02\x04\x3b\x90\x21\xda"
- "\x1c\x04\x9b\x03\xfd\xed\x83\xad\x20\x42\xbd\x74\x04\x50\xc7\x61"
- "\x8b\x5c\x6d\x65\x7f\xa4\x3e\xd4\xd5\x45\x5d\xdd\xee\x35\xbe\x74"
- "\xf3\xa2\xab\xc2\x0b\xfe\x78\xd6\x94\x39\x60\x5f\xd2\xbd\xe7\xba"
- "\x7e\x49\xb9\x1d\x22\x98\xbb\xce\x63\x45\x3d\x73\x2d\x2a\x69\x49"
- "\xe2\x33\xcd\x17\x5f\x17\x2d\xb0\x8b\xff\xf7\xa2\xab\xe6\xa4\x55"
- "\x1d\x74\x4f\x6e\x81\x08\xf6\xa1\x9e\xa1\x8e\xa1\xdc\xf3\xcd\xa8"
- "\x63\x56\xd4\xb9\x0c\xd4\x33\x47\x20\xaa\x9e\x89\x94\xf9\x41\xfc"
- "\xb6\x2a\xfe\x2d\xc8\x40\x3d\x33\x07\x65\x7b\xd6\x21\xfb\x7a\xa8"
- "\x0f\x19\x3c\x1e\x86\x3a\x62\x46\xbd\x90\x75\x2d\x28\x54\x5d\x0b"
- "\x32\xff\x8c\x5a\x5d\x83\x2c\x10\x9f\x87\x67\x1d\x9e\xd8\x75\xad"
- "\x2c\xac\xae\xbd\xac\xd5\xb5\x64\x55\xd7\x20\xd3\xb8\xbe\x9d\xaa"
- "\xbe\x31\x7e\xee\x0f\xf6\xd7\xb7\x94\x1c\x07\x9f\x3d\xa4\x74\x47"
- "\xd6\x39\xb4\x2b\x39\x4d\xa8\x6f\x8d\xa8\x6f\xc0\x27\xbc\x6c\x37"
- "\xa1\x9b\x7f\xe6\xb6\x6e\x71\x99\xf8\xf3\xda\xbe\xb1\x0e\xd4\xa7"
- "\x26\xd8\xb2\xbf\xc0\x8e\xfe\x79\x8d\x8f\x1a\x81\xcb\x81\x7a\xe4"
- "\x42\x7d\x6a\x44\xbd\xe2\xfa\x64\xed\xdb\xc9\x38\x9f\xb2\xf6\xe3"
- "\x90\x6d\x65\x64\x7d\x52\x23\xe9\xb1\xc7\x23\x7b\x9c\xf7\x96\x7a"
- "\xe8\xc3\x04\x79\x2e\xa5\xf3\x5e\x1b\x7e\x5f\xd4\x7e\xa3\xff\xf7"
- "\x2b\xb9\xcf\x96\xeb\x61\x59\x15\x8d\xbe\x42\x56\x3e\x8f\x9d\xf0"
- "\x3b\x11\xbf\x67\x2f\x79\xf0\x03\xf8\x12\x1f\x74\x22\xef\x1e\xae"
- "\x8b\xc2\x39\x83\xe5\x92\x09\x5d\x4c\x10\x3d\x7c\x06\xfe\x8a\x3f"
- "\xf0\x19\xf8\x7c\xe6\x3d\xbe\x47\x82\x07\x69\x78\xa7\x1c\xbd\x41"
- "\xa9\x78\xf8\xdc\x6b\x07\xfb\x4f\xf8\x9d\x21\xb6\x59\x86\x1f\xdc"
- "\x4a\x13\x93\x7c\xea\xac\x7b\x3e\x9b\x3f\x29\x40\xa9\xfc\x5b\x38"
- "\x4f\x9b\x1a\x6e\x68\xe7\xdd\x27\x23\x3f\x3e\xef\xbe\x3c\x9d\x1a"
- "\xb6\xc8\x33\x38\x2d\x0d\x4e\xd1\xd4\xd7\xc3\x7c\xc8\x72\xe9\xb4"
- "\x30\x6d\xa0\xf3\x6e\xd0\x99\xbb\x7c\x7b\xa6\xbc\xe7\x30\x96\x8d"
- "\xe9\x71\x5a\xfb\xcb\x3f\x48\xfc\x7e\x9d\x27\x83\xc4\x9f\xd0\xf9"
- "\x34\xd8\x3e\x5b\x6e\xa7\xfb\xb6\x8a\x2e\x3e\x23\x84\xf7\x05\xdb"
- "\x03\xe2\x7f\xf2\x59\xf7\x55\x7d\x94\xb0\xc4\xe6\x17\xee\x2e\xd1"
- "\xc2\x77\x76\x36\xf0\xb9\x25\x95\x22\x18\x4c\x5e\x71\x52\x1c\x5e"
- "\xd1\xd4\xbd\x55\x04\x78\x5c\xa5\xc7\x39\xde\xec\xa1\xac\x04\x25"
- "\x8b\xf9\x66\xd9\x27\x34\xaf\x68\x02\xae\x64\xc6\x75\x0e\xe9\xfb"
- "\x0e\xaf\x68\x06\xdc\x4c\x0f\x75\xe5\x49\x38\xf3\x7c\x73\xd9\x0e"
- "\xfa\xc6\x15\x1a\x2f\xcf\x93\x12\xae\x15\x67\xd8\x26\x20\xcc\x8c"
- "\xb0\x4a\xe0\x3f\x0b\xf8\x62\x0f\xfd\xf7\x89\xca\x97\x1d\x5f\xa9"
- "\xc3\xe1\xf7\x80\x7b\x20\xb4\xd5\x18\x8e\x88\x7d\x66\x06\x8a\xdc"
- "\x35\xc7\xab\x5b\x32\x63\x47\x87\x6c\xfa\x7c\x17\x9f\xf7\x69\xdf"
- "\x45\xe3\x20\x1f\xa6\xef\x53\xbb\x4d\x5c\x16\xce\xf1\xfb\xde\xdb"
- "\xe1\x47\x9f\x62\x3c\x68\xf9\x69\xe5\x60\xfc\x0c\xde\x10\x1d\xc0"
- "\x91\x71\x08\xfd\x42\xe6\x0f\xf3\x13\xf5\x26\x08\x3e\x7c\xc4\x36"
- "\xa9\x61\x2b\xf7\x8d\xef\xcb\xd4\xf9\x35\xb8\x4c\x56\xa8\x73\x36"
- "\xe8\xbe\x46\xe1\x14\xd4\x72\x0f\xcf\x65\xdc\xf7\xae\xe2\xc1\x02"
- "\x6b\x37\xec\x08\x8f\xd5\xf2\xd9\x9c\xe5\x16\xe1\x07\xce\x1a\x0f"
- "\x3d\x9c\xa1\xef\x8b\x76\x07\xb2\xd9\xb6\xc4\x6c\xb7\xe4\x9e\xe8"
- "\x7e\xfc\xf7\xb7\xb4\x8d\xe3\xfb\x54\xd9\x36\xd5\x54\x54\x29\xf9"
- "\xfb\x19\x2f\xef\xf1\xef\x40\x7c\xb9\x4f\x74\x0a\x57\x4d\x31\xf7"
- "\x23\x78\x7f\x31\xc2\x7e\x0d\xbd\x16\x2d\x5b\x98\xa6\xfb\x7f\xdd"
- "\x72\xcf\x2d\xba\x8c\xfe\x61\x43\xff\xd8\xcd\xfd\x27\x78\xac\x46"
- "\x8d\x37\xdd\x3f\xd1\x43\x93\xce\xea\x74\xb1\x8f\x01\xde\x26\xb0"
- "\xcf\xc1\xbe\x06\x8f\xff\x97\x57\x0a\x3f\xfb\x1c\x80\xcd\xd7\xcb"
- "\xc0\xe5\x53\xe5\xba\xbf\x34\xbc\x5c\xa0\xc1\x8b\xbe\xb6\xe4\x41"
- "\xf9\x76\x4a\x90\x67\x05\xf6\xf1\xfc\x41\xb6\x2c\x0b\x97\x59\x96"
- "\x45\xda\x58\xb4\x11\x81\x47\xd0\x6f\x93\xe1\x19\xc0\x85\xfe\xcf"
- "\xc4\x99\x4a\x9f\xee\x9f\x18\xad\x43\xa1\xf3\x6d\xb3\x3d\xf6\x9b"
- "\x74\x8f\x3d\x28\x2e\x5d\xa6\xb4\x6c\xf0\x29\x8e\xdf\x41\xf6\xb3"
- "\xfd\xac\xbb\xab\x5b\xb9\x4d\x76\x57\xb2\xbd\x95\xb0\xa3\x00\xdb"
- "\x01\x98\x47\x34\xd8\x47\xd4\xdc\x8f\x7c\x0f\xe5\x37\xda\xb1\x0f"
- "\x3d\x94\x96\xeb\x95\xed\x7d\x4d\x86\xfe\x2d\xf0\x8d\x37\xec\xf0"
- "\xea\xd6\xd8\xb4\xe4\x78\xb8\x3d\xeb\xbb\x21\xba\x90\xcf\x9d\xac"
- "\x47\xf6\xed\x74\x17\x74\xf2\xa3\xaa\x5d\x34\x9a\x75\x4c\x24\xaf"
- "\x38\xaf\xf8\x9e\x56\x2b\x9c\xf0\x3d\x61\x51\xcb\xb6\xd2\x37\x50"
- "\x87\xce\x5c\xa1\xb4\x9f\xac\xad\xb4\x82\x56\xa2\x43\xd7\x88\x7d"
- "\x94\xbf\x00\xfe\xac\x3b\xf0\x57\xbe\xd7\x04\xba\x98\x76\x56\xd7"
- "\x45\xfc\x6e\xbf\x9d\xad\x00\x5f\xd7\xa9\x71\x86\x09\xd9\x3c\xd6"
- "\x7f\x89\x26\x64\x70\x79\xf1\x18\x10\x36\x5e\xdc\x10\xe3\x84\x6a"
- "\xd3\xf2\x3c\x34\x61\x15\xde\xeb\xe4\x03\x5b\xa2\x7d\xa3\xdf\x3f"
- "\xc1\x2c\x6e\xf4\x31\x0c\xfa\xb8\x13\xd2\x85\xd3\xc0\xf5\xa4\xae"
- "\xc7\x39\x61\x99\x87\x16\x68\xfd\xd6\x09\x56\xc6\x35\x08\x0d\x79"
- "\x42\xee\xaf\xff\x0c\xe5\x9d\xf0\x4b\x6b\x95\x81\xe9\x90\xe7\x00"
- "\x31\xae\x06\xa3\xb2\xd9\x41\xd0\x5a\xef\x0c\x16\xc3\x3e\x17\x07"
- "\xab\xd7\xb9\xe4\x6f\x2d\x4e\x68\xed\x68\x6c\xfc\x35\x15\xf2\xbc"
- "\x67\x7a\xc0\xa2\xf0\xd4\x14\xb7\x8c\xbd\xc2\xdf\x77\xf1\xb7\xcf"
- "\x5c\xe0\x72\xd7\x66\xaa\x33\xa8\x01\xa3\xfa\xf1\x0f\xdc\xd5\x8d"
- "\x3c\x7a\x9c\x0f\x58\x3c\x34\x25\x41\xcd\x7b\x14\xb8\x06\xa9\x7b"
- "\x66\xae\x3b\x5c\xe7\x54\x9d\xfe\xe6\xd5\x73\x8d\xb2\xfe\x65\x42"
- "\xe7\xd7\x69\xf6\x97\xc7\x64\x12\x2f\xd1\x37\xbb\xce\x59\xa4\x7e"
- "\x1b\x85\xf1\x01\x5b\xc4\x19\xb2\x88\x1b\xf8\x3c\x80\xfe\xfe\x03"
- "\xa7\xf0\x9c\xd1\xbe\x2f\xe0\xe9\xc4\xef\x99\x78\x2e\x4a\xde\xbd"
- "\x53\x68\xf0\x20\xae\x1b\x3e\x3b\x7f\x7b\xe8\x81\x93\xe2\x9d\x34"
- "\xa3\xfe\xbb\xe1\x6d\x1e\x27\x78\xc0\x03\x19\x14\x2b\x59\x30\x1e"
- "\x32\x80\x36\xe6\xbb\xb0\xd7\x0a\x7f\x6b\x95\x8f\xe9\x36\xb7\xd6"
- "\xfa\xc8\xfa\x00\x97\xff\x9b\xa9\x5c\x26\x1f\xf8\xcf\xef\xf2\x5a"
- "\xe1\x3d\x5d\x17\x20\x9e\x23\xeb\x71\x7e\x13\xf5\xff\x7b\xb9\x6a"
- "\xcc\xa1\xa6\x91\xf1\x69\x3a\x21\xf4\xf2\x2b\x3e\x17\xb8\xac\x5b"
- "\x0d\xfc\xbd\xbd\x5e\x8e\xc3\x2c\x9f\x1d\x1a\x6b\xfe\xe6\xcb\xa8"
- "\xe7\x73\xf9\x2c\xe9\x6b\xf4\xcd\x5f\x08\xf0\xfa\x74\xb1\x3c\xab"
- "\xd2\xcb\xe3\x31\x3c\x7e\x8f\x7c\x60\xff\x26\x9c\xd1\xce\xe5\xf1"
- "\x4a\x5b\x03\x9c\x07\x11\x87\xf6\xa8\xeb\x5c\xb1\x9f\xfa\xb8\xcc"
- "\x48\xfb\xcb\x1b\x7e\x13\x9f\xa5\x5d\x55\x06\xbb\x03\x3a\x04\x64"
- "\xa5\x6c\xd9\x37\x73\x76\x5d\x15\x7e\xbd\xcc\x3c\x97\x0a\xbc\x5d"
- "\x1e\x72\xe5\x0f\x5a\x27\xfa\xcb\xf1\xe0\xb0\xd3\x69\x4a\x8e\x41"
- "\xf0\x2a\x52\x8e\x0f\x26\x28\x19\xa6\xcf\x8e\x94\xe1\x83\xf0\x75"
- "\xd2\xf7\xe2\xa9\xc3\x73\x42\x7d\x87\x3f\xe9\x65\x61\xbf\x21\xd7"
- "\x74\xd8\xd3\xf4\x4a\xd8\x0b\x6d\xec\x87\xc3\xa1\xcf\xac\x37\x9f"
- "\xa2\xed\xe9\xe5\xb3\xcf\xaf\x12\x87\xb3\x8e\x73\x78\x10\xfe\x8d"
- "\x87\xd2\x5d\x88\x37\x73\xfd\xe5\x73\x3f\xc3\xe3\xfb\xcf\x77\xa2"
- "\x74\x79\x56\x4c\xd2\xee\x7d\xfb\x58\x77\x91\xa6\x26\x29\xb0\x6f"
- "\x1f\xf2\xeb\xd2\xf9\x8a\xb0\x0b\x1c\xcf\x7a\xda\xe3\x7c\xd0\x04"
- "\xbe\xd4\xca\x79\x52\xf4\x01\x63\xfb\x1e\x0f\xa6\xf7\xfb\x68\xe6"
- "\x05\x2d\x2c\xcb\x2e\x7a\x68\x06\xec\x18\xec\xf7\xba\x7d\xaa\xfd"
- "\x79\xe8\x11\xfe\x86\xfd\xfc\x08\xbf\x33\xce\xc1\x4e\xdd\xaa\x5e"
- "\xd6\xdc\x6b\xa4\xa1\xb7\x8c\x94\x19\xa8\x6e\x49\x0c\xa4\xe4\xb6"
- "\xba\x3b\x4f\x52\x5b\xe0\x3f\x92\xf5\xbb\x12\xc7\x83\x7c\xfe\xac"
- "\x7d\xbb\xe8\x7b\xff\xd6\x71\x93\x3b\xf0\x49\x8b\x3c\x67\x5e\xed"
- "\xdf\x37\xfc\xe0\x92\xba\x6b\xe9\xb2\xf6\x2d\xcc\x1f\x74\x1e\x7c"
- "\x51\x04\x0e\x5e\xe6\x33\x69\x2c\xc3\x0f\xdc\xa2\x89\x3f\xdc\x41"
- "\x19\x75\xb7\x28\xad\xfe\x16\xa5\x8b\xbf\xf1\x5d\x44\xc1\xfc\x35"
- "\xd7\xcd\x04\x3b\x91\x3f\xb2\x8c\x12\xea\x77\xc0\x9f\x0b\x90\xa1"
- "\xef\x30\xfc\x39\xbe\x93\xe9\x93\x74\xb6\x97\xfd\xfe\x5c\xaf\xf4"
- "\x95\xf3\x67\xcb\x33\xca\x0f\xe7\xcf\x1e\x51\x4c\x86\xc4\x75\x64"
- "\x06\x7d\xf6\x6b\xf4\x60\x49\x62\x07\x7c\x49\x94\xd9\xa3\x95\x17"
- "\x3c\xaf\x4c\x2a\xa6\xa1\xb2\xac\xb0\xe1\xe2\xf0\xba\x7d\x83\xb6"
- "\xcd\x46\xd6\x29\x1f\xd7\x25\x2e\xc3\x6e\x9e\xcb\x3d\x39\xd6\x6f"
- "\x2a\xaf\x13\x7e\x0e\xaf\x18\x2f\xfc\x08\x97\x67\xe2\x35\x21\xbc"
- "\xc7\xf9\x90\xcb\x63\xca\x1c\x74\x6d\x08\xfa\x4c\x9a\xad\x79\x38"
- "\x59\x18\x1d\xd0\xd1\x1c\xda\x15\x80\x3f\x7e\x8d\xeb\xf1\xc3\xe6"
- "\x25\xa5\x22\x60\xdd\xc4\xf3\xea\x0f\x13\xcf\xf9\xf3\x5c\xdf\x4f"
- "\xe1\xeb\x7c\xde\x3c\x3f\xb7\x21\xdc\x7f\x48\x2a\x05\xce\xea\x1c"
- "\x18\x87\xf4\x18\xe7\x89\xc4\xf6\xeb\x79\xad\xc9\x1b\x72\x5d\xcb"
- "\xc3\xb9\x1e\x7a\xb6\x51\x3b\x67\xb6\x4b\xd9\xd3\x89\x13\x7d\xe0"
- "\x41\xa4\x0d\x98\x48\x7c\x3e\x4a\xb7\x6b\x79\x56\xcb\x3d\x6c\xfb"
- "\x1f\xbe\xa9\x7c\xa1\xe5\x99\xaa\x2d\x78\xf8\x5f\xd4\x18\xff\xc3"
- "\x75\x1e\xfa\xb6\x6c\xe3\xcb\xee\x63\x9d\x78\xf8\x82\x48\x59\x3e"
- "\x8f\xe1\x26\x3b\xc8\xb1\x39\x40\x68\x93\x96\x67\x0a\x59\x57\xae"
- "\x91\x78\x6b\x43\x0f\xaf\xd5\xf0\xdd\xb9\xb2\x07\xbe\xc1\x44\xc4"
- "\x65\x71\x1e\x5e\xc0\x80\xef\xc3\xd4\x9a\x80\x87\xbd\x1e\x7a\x4c"
- "\xb3\x87\x0f\xb7\xaa\xb1\xe7\x87\x5b\xbb\x91\x16\xbe\xe2\xa8\x1e"
- "\xe7\x44\xf8\xbf\x4b\x2b\xb4\xb9\x63\xb9\xa6\x07\x61\x69\x1e\x5a"
- "\xd6\xcc\x61\x15\xe3\xc9\x52\x61\x15\x9d\x83\xfa\x7a\x11\xe5\x9c"
- "\xf4\x77\x72\xdd\x8d\x91\xee\x04\x8e\x62\x1d\x2f\xda\xdb\xff\xd0"
- "\x6d\x5c\xbe\x1c\x61\x95\x3a\x5e\xc0\x8c\xc6\xf7\xfe\x7e\x18\x95"
- "\xa6\x2e\x2c\xcd\xf2\x6e\xe3\x43\xff\x01\x61\x4d\x51\x69\x5a\xa2"
- "\xd2\x9c\x0f\x4b\xe3\xd0\xf2\xe9\x88\x4a\xe3\x8b\x4c\x33\xc9\x34"
- "\x90\xb6\x49\x96\xc8\x34\x93\xd2\xa3\xd2\xcc\x1c\x48\xdb\xa4\xdc"
- "\xa8\x34\xab\xa2\xd2\x94\x86\xf1\x96\xd7\xc0\xc0\x8f\x9b\xe4\x88"
- "\x4a\xe3\x8a\x4a\xd3\xa8\x7f\xc3\xf7\x6c\x51\xbe\x01\xf4\x09\x32"
- "\x85\x5c\xb3\x10\x8f\xf2\xcf\xb9\x70\xbb\x75\x50\xd0\x99\xd9\xf6"
- "\xa3\xea\xbc\x7e\xb6\xab\x3c\xaf\xcf\xf6\x1c\x7e\x71\x17\xeb\x04"
- "\xfb\x9d\x9c\xd7\x65\x9a\x7c\x95\x75\xa8\xc7\x39\x39\x75\x20\x3f"
- "\x26\xa7\x47\xd2\x39\x79\x66\x24\x9d\x93\x73\x06\xf2\x63\xf2\xaa"
- "\xa8\x34\xa5\x51\x69\x2a\xc3\xd2\x34\x6a\xf9\xb8\xa2\xd2\x34\x46"
- "\xa5\x69\x1a\xa8\x9f\x93\x5b\xa3\xd2\x5c\x88\x4a\xd3\x11\xe2\xe1"
- "\x64\xb9\x9e\x8d\xeb\x03\xc2\xf1\x3d\x3b\xed\x36\xbc\x33\xeb\xfa"
- "\xac\xaf\x47\x53\x7a\x3d\x65\x77\x8d\x5a\x97\x25\xcf\x46\xea\xa0"
- "\x29\x6f\xea\xf3\xbd\xef\xdd\xf2\xc7\xf3\x1c\x13\x78\xdb\x79\xda"
- "\xe6\x47\x9b\x3b\x05\xbe\xe1\x23\xb5\xfa\x9a\x0d\x5e\xe7\x22\xcf"
- "\xd6\x93\xfd\x91\x29\x99\xaa\xfe\x4d\xa9\xd1\xe6\x74\xb8\x3c\x68"
- "\x17\xa7\xd4\xfc\xaf\xd1\x95\xf1\x08\xd3\xc5\x67\x4c\x01\x47\x7b"
- "\x7f\x5f\xa3\x9f\x56\xce\x33\xe3\x09\x9d\xd6\x06\xb5\xd6\x86\xcf"
- "\x35\xf3\xf2\xb9\x5f\x3d\xce\x8c\xc4\xb0\xfe\x09\xd3\xea\x3b\xb9"
- "\xc3\x6f\x8a\xa2\xb9\x4b\xd1\x9c\x91\xa9\x6c\x54\x46\xa6\x6e\x4f"
- "\x06\xd5\x3f\x57\x4d\x7e\x1b\xbc\x02\x5e\x53\x70\xae\x0e\xfe\x26"
- "\xfa\x58\x4c\xf7\x25\xca\xd8\x27\xfd\xdf\x4d\xb7\x88\x7f\xbb\x2b"
- "\x67\xc9\x35\x07\x5a\x59\x5a\xf8\x7e\x07\xf6\x7d\x5a\xcb\x3e\xa3"
- "\x6e\xd9\x47\x63\xdb\x98\x71\xf5\x74\xa5\x97\x69\x6d\xd6\xd7\xe5"
- "\x80\x16\xe5\xd7\xb9\x6a\xf2\x78\x3d\x04\xcf\xeb\x9d\xf6\xcd\x64"
- "\x98\x8b\xe0\x6d\xa3\xce\x03\xbe\x2b\x02\xb0\x35\x83\xf5\x95\xc2"
- "\xf9\xaa\x68\x98\xfe\x9c\xd2\x9f\xa9\x69\x91\xf5\x21\x1e\x7a\x3a"
- "\x75\x66\xa4\xce\x4d\xcd\x89\xd4\xb9\xa9\xf9\x91\xf5\xc1\x88\xfa"
- "\x30\xb5\x34\x2a\x4d\x65\x54\x9a\xfd\x61\x69\x5c\x5a\x3e\x8d\x51"
- "\x69\x9a\xa2\xd2\x84\xdb\x3f\x94\x79\xea\xf9\xfe\x7e\xa7\xb4\xf7"
- "\x53\x3d\x61\xdf\xc6\x1a\xd9\x4e\x4d\xf5\xe9\x61\x3c\x6e\xc7\x3e"
- "\x2a\xeb\x8d\xc2\x37\xcd\x1c\x65\xa3\x00\x3f\x2d\x2d\x92\x86\x69"
- "\x33\x22\x69\x98\x96\xa5\x7f\x6b\x6b\x1e\x7e\x73\x99\xa6\xbd\xae"
- "\xe9\x99\x2f\x69\x37\x3d\x9d\x14\x78\xe6\x39\xf6\xcd\xb8\x7d\x92"
- "\x6b\xc3\x76\xc1\xa7\xbc\x4e\x66\x5e\x93\x77\xb9\x82\xe2\xf8\xfc"
- "\x39\x0f\x4d\x3f\x25\x92\xf3\x67\x1e\xe2\x75\x14\x55\xb4\x04\x38"
- "\x96\x21\xff\x5a\xe4\x01\xde\x4d\x3b\x1e\x45\x43\x73\x14\x0d\x67"
- "\xc2\xbe\xd1\xff\x9e\xd6\x1e\x56\x6e\x73\x9c\x45\xae\x01\x85\x6f"
- "\x3d\xcd\xab\x87\xf3\x18\x00\xca\xd8\x69\x97\x7e\x40\x26\xaf\xc7"
- "\x4b\xb9\x44\xd3\x3e\xe4\xf1\x02\x85\x73\xfa\xb8\x70\xde\x2a\x5e"
- "\x4c\xcf\x88\xa4\x63\x7a\x66\x24\x1d\xd3\xf3\x42\xb6\x66\xda\x32"
- "\x55\x47\xa6\x17\x7a\xe8\x71\x79\xfe\x23\x78\x61\x4d\x0a\x58\x47"
- "\xb5\xdc\xc7\x7e\xea\xf4\x9f\xf9\x50\x5e\xf1\x9a\x31\x45\xfb\xfe"
- "\x85\xb8\x8f\xfd\xee\xfc\x99\xb0\xcf\xbc\xe6\xf2\x5e\x84\x9d\x52"
- "\x72\x9d\x8e\xf2\x7f\xfb\xb8\xc2\x3b\xfd\x94\x6c\x07\xee\x63\xff"
- "\x77\xfa\x3e\x91\x5c\x53\x3c\x98\x3e\x77\xa7\xd4\xac\xd3\xd6\x83"
- "\x5a\x81\xa3\x4b\xaf\x0f\xc1\xea\x9a\x75\xc1\xc3\x6b\xd1\xfe\xcc"
- "\x00\x8e\x0c\xbf\xea\xd3\xac\xa9\x84\xee\xd7\x42\x7e\xe8\x03\xcf"
- "\xd0\xfa\x32\x35\x15\xbc\x26\x0f\x76\x89\xcf\xb8\x4c\x54\xeb\x27"
- "\x66\xcc\x08\xab\x57\x3e\xeb\x8e\xb9\xe2\x12\xcd\xb8\xc9\xbe\x1d"
- "\xdb\x0d\x5e\xdb\x77\x3a\xe0\x25\x1e\x67\x71\x07\xae\x48\x9f\x1c"
- "\xf1\x7e\x2d\x6d\x59\x58\x5a\xaf\x36\x0e\xd2\xc9\x71\x53\x02\x64"
- "\x3a\xed\xf3\xf2\x59\xfe\xa9\xca\x8f\x9f\x71\xf3\x34\xec\x05\xd2"
- "\x1c\xd3\xd3\xf0\x98\x09\xa7\x41\x9f\xc7\x34\xb9\x52\xdd\x65\xca"
- "\xb8\xf5\xf5\x35\xdc\x3f\x72\x57\x76\x92\xdb\xd7\xce\x63\x9a\x26"
- "\xb5\x2e\x6a\x86\x3f\xce\x4f\x09\xdd\x87\x6b\x20\x9b\x19\xfe\xbe"
- "\xc3\x35\xf9\xa0\x0d\x74\xcc\xe0\x33\x7c\x23\x7c\x99\xec\xec\xbc"
- "\x67\x96\x2c\x9a\xb4\xe2\x99\x85\xcb\xb2\x67\x59\x97\x95\x6c\x2c"
- "\x2a\x9c\xb4\xf9\x95\x0a\xeb\xb6\x2d\x25\x15\x25\x9b\x5e\x92\xc7"
- "\x8f\x5a\x0b\x2a\xd4\x3b\xbd\xb4\xa0\xbc\x62\x0e\xff\x9c\x68\x2d"
- "\xdb\x52\xb4\x55\xfe\x7c\x70\x38\x45\x22\x29\xa9\x28\xda\x62\x9d"
- "\x50\x38\xd1\x3a\xbf\xa0\xa4\xf4\x95\x2d\x45\x31\x71\xcd\xb2\x6e"
- "\x29\xda\x52\x54\x50\x68\x9d\x63\xcd\x60\xcc\xe1\xe8\xc2\xe4\x99"
- "\xa1\xdb\xa7\x72\xb4\xe7\xf0\xa1\x3b\xd9\x4e\x71\xbb\x7e\x99\xbe"
- "\xf5\x21\xfb\x70\xf2\xbc\x50\xe8\x21\xda\x04\x4f\x8f\xf3\x91\x8b"
- "\x03\xdb\xf1\x47\xbc\x91\xfa\xfb\x28\x45\xea\xef\xa3\xe6\x81\xed"
- "\xf8\xa3\x51\xf5\xff\xd1\xa8\xfa\xff\x68\xd6\xc0\x76\xfc\xd1\xfc"
- "\xa8\x34\xc5\x51\x69\x6c\xfd\x76\x06\xb4\xee\x91\x76\xe9\xd1\xfd"
- "\x51\x69\xea\xa2\xd2\x9c\x88\xfa\x3e\x15\xf6\x0d\xdf\xf5\xd1\xb3"
- "\xe1\xbe\x01\xbe\x2f\xea\x75\x3d\x64\xdf\x1e\xf5\xea\x30\xdc\xf6"
- "\x34\xf0\xbd\x44\x12\xf6\x5b\x09\x61\xb0\x9d\x0a\xf6\x5b\xfd\xf5"
- "\x9f\x6d\x12\xaf\x89\x54\xfe\xf9\xb7\x0e\x68\xb6\x8d\xef\x29\xd2"
- "\xdb\xd0\x0e\xc8\xe2\xde\x6b\xf4\xe8\xcd\x06\x05\xeb\xe5\x75\xb2"
- "\xe2\xad\x95\x3d\x0d\x29\x94\xc0\x69\xf9\xbc\x4c\xe1\x7c\x44\x9e"
- "\xdd\x88\xb0\x44\x3c\xb0\x53\xdf\x72\x78\x4c\x4f\xc8\x3b\xac\xf6"
- "\x02\xc6\x43\xdf\x92\xba\xcc\xe9\xf6\xca\x75\x7d\x32\xbf\x9b\x7c"
- "\xdf\x12\x9f\x41\xcb\xf6\x93\xf3\xe5\x73\x5c\x39\x6f\xe0\x30\x09"
- "\xe3\x23\x0b\xb5\xf3\x38\xcd\x78\x52\x81\xf3\x82\x8e\x13\xf8\xe4"
- "\x38\xd1\x1e\x6d\x1d\xbc\xf2\x7b\xbe\xe5\xd3\xfd\x0b\xee\x2b\xc4"
- "\xb2\x1d\xb1\xd7\x3c\x53\xd2\x21\x67\xb0\xbd\xa5\xaa\x03\x34\xcd"
- "\x4c\x63\x3f\xd4\x6d\x09\x50\x5b\x5d\x00\xfd\x57\x32\xcb\xfe\x94"
- "\xed\x2a\xb9\x1b\x03\xc4\xe3\xc3\x6b\x6d\xe4\x68\x30\x06\xdb\x45"
- "\x7f\x3a\xee\xa3\xcd\x94\xe7\x08\xef\xe5\x70\xa4\x47\x5f\xc2\xcb"
- "\x6b\xa3\x07\xbb\xf3\x8b\xe1\x5a\xee\xe3\xfe\xde\xcc\x1a\xcd\xf7"
- "\xdd\xd7\x00\x5c\x31\xd7\xed\x1a\xc9\xdd\xe3\x9c\x89\xf6\x6f\xdd"
- "\x4c\xdd\x66\x9f\xae\x95\xb6\xcf\x88\x70\xf0\x76\xe6\x80\xf3\x40"
- "\xc3\xd2\xb2\x7d\x2f\xe3\xb5\x5f\x3d\xce\xc7\x52\x6f\x07\xcb\x74"
- "\x9f\x46\xb9\x51\x17\x73\xde\xab\xca\x88\xd7\xec\x6b\x02\xd2\xe5"
- "\xea\xe9\xbe\x48\xf9\xb4\x3d\x0a\x5e\xd4\x55\x9f\xea\x2b\xce\xfa"
- "\xf5\x1b\x72\x2d\xf0\x63\xf0\xff\x66\xea\xf5\xe0\x0e\x7c\xc3\xfe"
- "\x3d\x26\xc7\x13\x79\xdd\x0c\xf7\xa9\xcb\xcb\xe0\xb3\x59\x7c\xb0"
- "\x8d\x8f\xb5\xe8\x71\x72\x9c\x88\xe3\x2a\x85\xff\xb4\xa5\x83\xe3"
- "\x2e\xf6\xc7\x71\x3a\xa6\xdb\x16\xe0\x70\x9f\x1e\xae\xda\x96\x59"
- "\xa6\xa8\xef\x54\xfd\x1b\xbf\xad\xa0\x65\x9f\x86\xdf\x0b\x9b\xcb"
- "\x6b\x9e\x0c\x97\x68\xd6\xee\x7a\x59\x6f\x66\x65\xea\xf1\x72\x4c"
- "\xed\x5d\x9e\x1b\xf3\x51\x30\x65\x79\x8e\xf4\xb9\x90\x86\xef\xef"
- "\x42\x1f\xc3\x20\x7a\xe5\xfa\xab\x2e\xc6\xc3\x75\x46\xde\xa1\x83"
- "\x6f\xe0\x9a\xd1\xc0\x7a\x0d\xb9\x6e\x0b\xd0\xb8\xb2\xc7\x79\xfc"
- "\x79\x96\xd4\x5b\x0e\x63\xbc\x8c\x8f\xdb\x44\xc6\xcd\xf8\xf8\x9e"
- "\x31\xd1\xcd\x6b\x14\x67\xa1\xfc\x33\x7d\x83\xc9\x0a\xf1\x9e\x30"
- "\x5e\xc6\xe3\xdb\x1b\x59\xd6\x6f\x53\xd4\xb7\x59\xff\xe6\xb1\x5e"
- "\xa5\x7b\xdf\x36\x69\x71\x13\x6f\x97\x17\xf7\x7f\x01\x93\x17\x99"
- "\xdf\xb7\xd7\x45\xe1\x2f\x8b\xfa\x76\xe8\xdf\x35\x72\x8e\xe1\xdb"
- "\x2e\x3d\x0f\x29\x33\xe8\xd8\xb1\x2a\x6f\xfc\xed\xce\x95\x45\x9a"
- "\xd6\xb0\x3c\x87\xe0\xfb\x42\x48\x7e\xdf\xf6\xe8\xf8\xf0\xbb\x2b"
- "\x0c\x0e\x7e\xc9\xb7\x03\x3a\x9c\x9a\xdf\x98\x9d\x18\x4a\x37\xdb"
- "\xf2\x39\x65\x8d\xd2\xdd\x39\x45\x4a\x77\x67\xe7\x45\xd2\x32\x7b"
- "\x5d\x18\xce\xd2\x10\x2d\xb3\x6d\x61\x70\xa8\x9f\xb3\xf7\x45\xeb"
- "\x6a\xb9\x8d\x75\x9c\xf5\x75\xf6\xb1\x18\x71\x7e\x2d\xae\x25\xb6"
- "\x8e\xcf\x6e\x0f\x0b\xd7\xfa\x47\x73\xe6\x68\x7e\x02\xdb\x67\x1f"
- "\xdf\xa1\xa6\x9d\xe3\x2e\x75\x92\xcf\x77\xd6\xee\x75\x82\x5e\xcf"
- "\xb1\x44\xe3\xe5\xbb\x78\xfa\x71\xf4\xe3\x9c\xdd\xa9\x7c\xbc\x39"
- "\x39\xa1\xb2\xcd\x59\xe6\xa1\x59\xfa\x3c\x91\x57\x8d\x0d\xce\xce"
- "\x1a\xac\xdf\x01\xf8\xbd\x91\x3c\x9b\x53\x13\xe2\xd9\x9c\xc6\x30"
- "\xbc\x27\xc2\xe0\xfe\x1b\xbe\x4f\x85\xc1\x9d\xf9\x3c\xdd\x54\xba"
- "\x32\xc7\x1b\x99\xd7\xe3\x14\xc2\xf1\x78\x62\x28\xaf\xc7\x2d\x61"
- "\x70\xed\xf8\x4e\x1f\x5c\x3e\x8f\x67\x0d\x2e\x9f\xc7\xd7\xc5\x96"
- "\xcf\xe3\xb6\xb0\x7c\xf7\x7e\x7e\xbd\x7a\xfc\x78\x18\x3d\x0d\xf8"
- "\x6e\x8e\xac\x47\x8f\x9f\x89\xfa\xee\x97\xbf\x80\xed\x38\xb6\x23"
- "\x33\x9e\xc3\x2b\xc6\x93\x59\xd5\xb3\xc7\xfd\xe1\xf1\xef\xdf\x52"
- "\xf1\x4c\xa3\x9c\x83\xe3\xf9\x4d\x09\x37\xd7\x1a\x0d\xc7\x30\x61"
- "\xf1\x99\x3a\xed\x7b\x07\x39\x73\x5c\x6f\xff\xdc\x41\x6e\xff\xe6"
- "\xae\x52\xf3\x36\xcf\x56\x0a\xe7\x07\xf9\x83\xb5\x65\xc0\x5b\xeb"
- "\xa1\xb9\x79\x8a\x3f\x73\xa1\xff\x2b\xd4\xde\x17\xd7\xb3\x95\xd0"
- "\xa7\x5b\x97\x29\x73\x0e\xde\xbd\x78\x8f\x8f\x6c\x5f\xe7\x9e\x12"
- "\x4e\xc3\xd2\x06\x67\x74\xbb\x3b\xf7\x02\xfa\x1e\xb7\x92\x02\x8e"
- "\xfc\x18\x71\x5e\xe1\x8c\x7b\x66\x60\x78\x26\xb7\x75\xb7\x3c\x94"
- "\x39\x9b\xe9\x0d\x0b\xb7\x0a\xe7\xc8\x65\x0c\xef\xe1\xfc\x90\x66"
- "\x30\xb9\xe9\xfb\x8b\x94\xee\x65\x96\x46\x95\xe3\x26\x70\x7d\xac"
- "\xca\xf1\x44\x76\x54\xde\x7b\x63\x97\x23\xb3\x0e\xe5\xb8\x19\xbb"
- "\x1c\x99\xf2\xee\x0b\x61\x44\x59\x06\xf8\x1d\x99\x17\x50\x96\x9b"
- "\x92\xef\x91\xe1\x5d\x7a\x3f\xd5\x7e\x13\xfd\x7f\x23\xc9\xb4\x4b"
- "\x2b\x43\x72\x53\x70\x4f\xa4\x26\xd5\x52\xde\xc0\x3c\x9f\x98\x28"
- "\x9c\x43\x97\x7a\xe8\x89\x42\xbd\xbd\xd2\xc2\xb3\x14\x2d\xe0\x93"
- "\x91\xf9\x84\xf2\x20\xdd\x60\xf2\xd6\xeb\xa7\x9a\x67\x7a\x02\xf5"
- "\x3f\x33\x47\x6f\xd3\xd1\x9e\x7b\x75\x3e\x22\xae\x29\x2a\xce\x1f"
- "\x16\x77\x36\x22\x6e\x57\x7f\x78\x87\x1e\xfe\xc5\xe4\xf4\x64\x6a"
- "\x94\x9c\x20\x9f\x27\x7f\x1c\x59\xee\x27\xd3\x54\xf9\x20\xa3\x01"
- "\xbc\x7e\x32\x13\x32\xea\x8d\x2d\xa3\x27\x57\xc5\xd6\xb5\x27\xd5"
- "\x3d\xaa\x29\x14\x0b\x9f\x0b\xb2\xeb\x95\x3a\xa8\xc9\x69\xa0\x7c"
- "\x9e\x3c\xa9\xcb\xe7\x0b\x96\xd1\x1f\x55\xc6\xbe\xcb\x34\xef\x15"
- "\x55\xd6\x79\xff\x14\x89\x7b\x9e\x39\xb6\x2e\xce\x4b\x47\x39\xfb"
- "\x62\x97\x73\x5e\xd6\xe0\xba\x38\x8f\xe7\x0c\xfb\x06\xea\xe2\x3c"
- "\x9b\x4a\x43\xb1\xd2\xd4\x08\x67\xcc\x7c\x4e\xb0\x5f\xe4\xa1\x79"
- "\x1d\x3c\x4f\x17\x16\xde\x1a\xa9\x7f\xf3\xcc\x32\x1d\xf3\x2f\xa0"
- "\xfa\x31\x2c\x87\xcb\x56\x32\x7e\x9e\x4e\xf6\x38\xb3\xd2\xa2\x78"
- "\xf5\xc9\x65\xca\xfa\x71\xb7\xd1\x38\x5f\xf1\x2b\xbb\x24\x92\xa6"
- "\xac\xcc\xd8\xfc\xca\xca\x07\xbf\x3e\x89\xcd\xaf\xac\x8a\xc1\xf9"
- "\xc5\xeb\x9d\xe8\x93\x81\xfc\xca\x3a\x1e\xce\x2f\xbe\xfb\x95\xcb"
- "\x77\xbf\x05\xba\xd1\xbb\x56\x34\x28\x5b\x6e\x4e\x82\xae\xa8\x34"
- "\x5d\x9c\xe6\x62\x92\x5f\xe9\x89\x75\x2c\x25\x5c\xa3\xac\x56\xbd"
- "\xfe\x8f\xac\xa5\xa1\xa2\x77\x25\xaf\xd1\xe6\xbb\x24\xcc\x6e\xdb"
- "\x27\x2d\x7c\xe7\x24\x8f\x37\x46\xe6\x9b\x6d\x8d\x6d\x0b\xb2\x67"
- "\x82\xa7\xd5\x31\xc2\xf3\xd4\x98\x69\xf6\xbe\x48\x1b\x91\x5d\x1c"
- "\x29\x23\xf0\xcd\x28\x4f\x49\x37\x7c\x91\xe7\xf6\x32\xcb\x6e\x1f"
- "\x28\xb3\xf9\xdb\x95\xbc\xe6\x3f\x17\x45\x9f\x37\xb6\xbc\xe6\x27"
- "\x0c\x2e\xaf\xf9\x69\x83\xcb\x6b\x7e\x26\xcb\xcb\x43\xf3\x6d\x91"
- "\xed\xc6\xfc\xfc\xc8\xf2\x22\x5f\xa4\x13\xc6\x21\xa3\xf8\xfb\x8b"
- "\x96\x5b\x7f\xd8\xc6\xb1\xac\x1a\xe0\x5f\x81\xfe\xf1\x4c\xe3\x97"
- "\xc5\x31\x28\x6e\xf0\xd0\xb5\x63\xd0\xfb\x49\x12\xdb\xd0\xaf\xe4"
- "\xf5\x79\xf2\x9e\x68\x5a\xb0\x28\x68\x34\xcc\xc2\x6f\xe3\x65\x5a"
- "\x78\x57\xd0\x18\xe7\xe0\xb5\x64\x72\x6f\x9e\x9c\x9f\x58\x50\x18"
- "\x2e\x0b\x5e\x53\xc6\x63\xd1\x07\xd5\x38\xe7\x5f\x90\xfe\xaa\x92"
- "\x4b\xce\xcd\x48\x3e\x2e\xd8\x17\x5b\x2e\x0b\x1a\x21\x97\xbf\xc4"
- "\x96\xcb\x82\x53\x83\xcb\x65\x01\xf7\x49\xff\x32\xb0\x1e\x2d\xf0"
- "\x6a\xf5\x68\x0f\xa7\xb1\x6e\x62\x7f\x35\xa7\x80\x61\xf0\x1b\x75"
- "\x24\x67\x21\xc7\x4f\xea\xd2\xeb\x11\xa7\xc9\xe1\xfe\xbf\xcc\x5f"
- "\x83\xb1\x6a\x38\xc2\xf0\xe6\xe4\x24\x75\xc5\xaa\x27\x39\xeb\x18"
- "\x76\x72\x19\x25\x80\x87\xf9\x47\x19\xc7\x16\x22\xe0\xf8\x05\xc3"
- "\x71\x38\xdf\xed\x10\x06\xef\xd2\xe1\xe4\xb8\xa8\x82\xdd\xc7\xf7"
- "\xa2\x33\x5c\x14\x6e\xad\xfc\x43\x65\x3b\xc2\xf0\xf2\x1e\xf6\x48"
- "\x18\x8f\xaa\x8f\x0b\xd3\x22\xeb\x63\x8e\x3f\x52\x3f\x17\xf0\xfc"
- "\x44\x52\x10\x76\x0e\xbf\x73\xfb\x9c\x86\x59\x5f\x4d\xdd\x5c\x58"
- "\x11\x55\x37\xa1\x03\xdf\x19\xad\x74\x60\xe1\xf5\x48\x5a\x17\xee"
- "\x8f\xad\x03\x0b\x8f\x0d\xae\x03\x0b\x5b\x06\xd7\x81\x85\x17\x59"
- "\x07\x3c\xf4\x9d\xd4\xc8\xba\xb9\xd0\x17\x59\x76\xe4\x2b\xeb\x26"
- "\x25\x7f\x99\xba\x09\x5f\x68\xd4\x60\xf5\x50\xf3\xff\x0d\x7c\x5f"
- "\xdb\x97\xe0\x99\xba\x7f\x88\xbe\x73\x9c\xe7\x90\x60\xe3\x8b\x99"
- "\x87\xf5\xb2\x8f\xf6\x9d\x53\xe1\x7c\x3c\xa8\xfa\x5a\xf6\xcb\xf4"
- "\xd4\x13\xbc\x66\x4f\xf1\x33\x77\x58\x64\xf9\xbf\x73\x31\x36\x3f"
- "\xbf\xc3\xf3\x14\xf6\xd8\xfc\x7c\xca\x3c\x38\x3f\x9f\x9a\xc8\x7b"
- "\xc0\x07\xd6\xa9\xa7\xf8\xde\xf8\x04\xbd\x6d\xba\x46\x4f\x1d\xfd"
- "\x62\xed\xd3\x53\x95\x91\xed\xd3\x53\x85\x5f\xbe\x7d\x7a\xaa\x25"
- "\x76\xfb\xf4\x54\x7b\xec\xf6\xe9\x29\xaf\xaa\x0f\xb9\xe9\x91\xf5"
- "\x21\x37\x21\x52\x27\xc0\xbb\xaf\xac\x7d\xca\xb5\x45\xd5\x81\x43"
- "\xc8\xef\x26\x7c\x8a\x57\x95\xdc\x16\xfd\x32\x92\xc6\xdc\x9a\xd8"
- "\x72\xcb\x3d\x01\xb9\x1d\x8a\x2d\xb7\xdc\x33\x83\xcb\x2d\xb7\x03"
- "\x72\x3b\x34\x50\x6e\xb9\x81\x2f\xef\x53\x2c\xca\x88\x94\xd9\x22"
- "\xcb\x97\x97\xd9\xa2\x8a\xd8\x32\x5b\xb4\x3f\xb6\xcc\x16\x1d\x53"
- "\x32\x5b\x74\x31\x52\x66\x8b\x4e\x45\xca\x0c\x7c\xfb\xca\x64\xb6"
- "\x78\x62\x94\xcc\x36\x5f\xa6\xc5\x3f\x81\xcc\xce\x2b\x99\x2d\x79"
- "\x39\x92\xc6\xc5\x39\xb1\x65\xb6\x78\x1d\x64\xb6\x39\xb6\xcc\x16"
- "\x57\x0e\x2e\xb3\xc5\xb5\x90\xd9\xe6\x81\x32\x5b\xdc\xf4\xe5\x65"
- "\xb6\xb8\x23\x52\x66\x8b\xcf\x7e\x79\x99\x2d\x49\x8f\x2d\xb3\x25"
- "\x99\xb1\x65\xb6\x24\x5f\xc9\x6c\x89\x2b\x52\x66\x4b\xca\x22\x65"
- "\x06\xbe\xfd\x1b\x65\x06\xf9\x38\xd4\x7a\xdd\x25\x9f\x76\xcb\x31"
- "\xed\x25\x9d\x1e\xca\x6b\x52\x73\x02\x79\x52\x77\x34\x19\xbe\x0f"
- "\x98\x8b\x03\xdb\xee\x3c\x93\x16\xb6\x62\xa0\x1c\xf2\xac\x68\x57"
- "\xbb\x5a\x2b\xe5\xba\x2e\x25\x43\xe6\x39\xe0\xd4\x18\x59\x5e\x26"
- "\xa7\x85\x8c\x85\xdb\x1f\x20\x6e\x8b\x01\xef\x63\x3c\x7c\x5e\x49"
- "\x14\xae\xd2\x2f\xe3\x97\x0d\xbe\xc6\xfc\x59\x47\x4b\xd5\x34\xe0"
- "\x7b\x7a\xb7\xd2\xd5\xbc\x68\xff\xb7\x01\x71\xcb\x95\x9e\x2e\x8d"
- "\x1a\x33\xc9\x1b\xc4\xff\x7d\x9a\xfd\xdf\x86\xd8\x7a\xfa\xf4\x6d"
- "\xfc\xdf\xa7\xd9\xff\x6d\x08\xeb\xaf\xa6\xac\x09\x78\xa2\xfa\xab"
- "\x4f\x17\x26\xf9\x94\xee\x48\x3f\xf6\xf0\xb3\x8e\x1e\xe7\xd3\xfb"
- "\xa3\x68\x86\x6c\x9e\x19\xa6\xd1\x1c\x25\x9f\xa7\x8f\x0d\x42\xf3"
- "\x29\xd0\xfc\xfe\x20\x34\xb7\xdf\x86\x66\x6e\x9b\xdf\x1f\x58\xb7"
- "\x9e\x49\xd4\xf4\x20\x46\xbf\xfc\x99\xf4\xd8\xf2\x7f\x26\x4a\xfe"
- "\x94\x5f\x51\x29\xbc\x32\x7d\x24\x5c\x71\x38\x1c\xaf\xd5\x67\x58"
- "\xd6\x91\x18\xb0\x35\xd1\x38\x07\x81\x3b\x35\x40\xf7\x78\x6f\x41"
- "\x4c\xdd\x7b\xa6\x53\xd5\xc7\xa5\x99\x91\xf5\x71\x29\x45\xd6\xc7"
- "\xa7\x8f\x45\xa6\x5b\x6a\x8d\x8c\xcf\xf3\x7e\x75\x36\x76\xa9\x2b"
- "\x4a\x07\x3e\xb8\x4c\xcb\x46\x28\x1d\x58\x56\x14\x45\xc7\xf1\xd8"
- "\x3a\xb0\xb4\x05\xe5\xff\x20\xb6\x0e\x2c\xbd\x38\xb8\x0e\x2c\xe5"
- "\x35\xc4\x1f\x84\xeb\xed\xd2\xca\xcc\xa1\x91\x30\xcb\xc6\xc5\xb6"
- "\x79\xcb\x66\xc4\x1e\xd7\x59\x96\xab\x78\xbc\x6c\x6f\x24\x8f\x97"
- "\x15\x46\xf2\x10\x65\xf9\xb7\xf3\xb0\xff\xdc\xb0\x1e\xe7\xb2\xe8"
- "\xfa\xef\xbe\x4c\xcb\xb5\xfa\xff\xec\xa2\x28\x1a\xb5\xfe\x4f\xac"
- "\xb1\xac\xe5\x89\xe0\xa5\x3b\x36\x2f\x97\xa7\xc7\x2e\xf3\xf2\x4c"
- "\xb4\x41\xee\xe0\x80\xba\xb4\x3c\x1f\xe1\x4b\xe5\x1d\x92\x37\xc9"
- "\x5c\x8f\xf0\xa5\x01\x4a\x90\xed\x55\x7f\xbb\xb4\xbc\x92\xc7\xc8"
- "\xe5\x18\x33\xf4\x37\x69\x1c\xf1\xfa\x6b\x33\xd3\xb5\xb6\x32\x7a"
- "\x4e\x74\xb9\x1c\xff\xe0\x75\x2c\xbc\xaf\x26\xc9\x46\x79\x6e\x5f"
- "\x80\x74\x7d\x67\xf8\x28\xdc\xed\x5c\x2f\x18\x5e\x87\x55\x63\x9d"
- "\x8e\x28\xdb\xf4\x2c\xc5\x96\xf1\xb3\x96\xc1\x75\xe7\xd9\x19\x4a"
- "\xce\xcf\x16\x47\xca\xf9\xd9\xdc\xa0\x73\xe4\x32\x2e\x2b\x74\xe0"
- "\x4b\xd5\x13\x9e\x3b\x1d\xd4\xde\xef\x59\xd9\x5e\x56\x45\xf7\x5c"
- "\xa1\x67\xcf\xcb\xfc\x8c\xc2\x9f\xb4\xdb\x40\xad\xd2\x06\xac\x98"
- "\x20\xe9\x04\xcc\xda\x00\x19\xc5\x9e\x0d\xed\x1c\xd7\xe0\x14\x7e"
- "\x79\x47\xa6\x53\x9c\xe7\xf3\x7e\xa0\x0b\xa3\x2e\xd1\xb3\x1f\x47"
- "\xa4\x47\xab\xe7\x56\x38\xd2\xd4\xf8\xfe\x0a\xab\x3e\x0e\x3f\xd8"
- "\xf8\x3e\x60\xb2\xf4\x75\xbf\x6a\x2e\x6c\xc5\xcc\x41\xdb\x65\xd0"
- "\xc4\x7b\xc7\x99\xa6\xdb\xdb\x81\x15\xb5\xba\xfe\xaa\xb9\xb9\x15"
- "\xc7\x43\x7b\x5b\x56\x9c\x44\xdc\xaa\xdb\x8c\xe7\x86\xd5\x83\x15"
- "\x9e\x70\x3c\xea\xec\xbc\x15\x3e\x7d\x7f\x4a\x8f\x33\x9f\x3e\x07"
- "\x97\x46\x4f\x7e\x7a\x24\x3d\xf9\x33\xe1\x5b\xae\xd2\x70\x64\x7d"
- "\x0e\x8e\x54\xf7\xb1\x59\x34\x39\x48\x71\x57\xe8\xf9\xc3\x35\xbc"
- "\x46\xa7\xae\x93\x12\x03\x64\x52\x7d\xbb\xfc\xb7\x79\x6f\x08\xf7"
- "\x0d\xdd\x81\xb9\x2d\x3c\x07\x27\xd7\x10\x58\xe6\xb6\x9c\xb3\xf5"
- "\x69\x67\x9b\xe5\xff\x1d\xf3\xf4\x5c\xf1\x27\x2d\x75\x47\x44\xe7"
- "\x51\x79\xa6\x55\x7e\x44\xff\x6f\x3f\xaf\xff\xe1\x75\x18\x55\x34"
- "\xf7\x32\x3d\xf7\x84\xaa\xeb\xcf\x47\xf9\xa4\xf9\x83\xf4\xff\xf2"
- "\xb9\xff\x37\x37\x76\x3d\x7f\xee\x36\xfd\xbf\xe7\xb8\xff\x37\x37"
- "\xbc\xdd\x54\xf3\x3c\xcf\x65\x85\xfb\xa4\x7c\xee\x94\xf5\x45\xf6"
- "\x33\x9f\xfb\xcf\x0f\xd7\x90\x39\xc0\x73\xda\xa8\x9b\xee\xce\x56"
- "\xae\xaf\xe6\x73\xde\x66\x3e\x87\x21\x81\xef\xf6\x56\x6d\x19\xd7"
- "\xd7\xe7\xe4\x78\x61\x52\x40\xd5\x45\xbb\x4d\x78\x27\x76\x40\x87"
- "\x36\x17\xeb\xb8\x2a\x76\x15\xab\x7d\x1f\x23\x3b\x68\xa8\xbb\x53"
- "\xb6\x8b\x06\xf6\x57\xa5\xdf\x1a\xb8\x4e\x8c\xf7\x74\xe5\x39\x62"
- "\xbc\xc1\xfe\x76\x52\xe2\xee\xe0\x3a\xce\x38\x19\x77\x1b\xe0\x18"
- "\x2f\xc3\xe9\xe5\x50\x7b\x63\x9e\x4f\x0c\x2f\xbb\x1c\x7f\x41\xde"
- "\x08\x5f\xc8\xe3\x2a\x6e\x4e\x67\x5f\x29\x26\x77\xf0\x9c\xd9\x27"
- "\x2d\xc2\xbe\x41\x4c\xde\xc2\x63\x62\xcf\xbf\xcd\xe9\xde\xff\xb3"
- "\x27\xbe\x62\x3c\x25\x68\x61\xcb\x5a\xad\x7e\xe8\xdb\xf3\xb5\x91"
- "\x36\xe2\xf9\x28\xff\x37\x5f\xf6\x33\xf1\x2e\xe5\xf5\x89\xda\xfa"
- "\x55\xb6\x07\xc2\x1d\xe8\x91\xfa\x71\xbb\x35\x15\x3c\x27\xcd\x6b"
- "\xa2\xd4\xb9\x6a\xcf\x7b\xa2\xc6\xde\xbc\x07\xe5\xba\x9a\x3f\x21"
- "\xdf\x95\x1b\x95\x8e\xac\xda\x18\x29\xd3\x95\x64\xbf\xca\x73\x41"
- "\xaa\x3d\x58\x13\x88\xb6\x8f\x2b\xad\xba\xef\x16\x15\x3e\x53\x6f"
- "\x0f\xac\x9b\x24\xde\xa8\x76\x66\xa5\xf4\xff\xfb\x06\xb4\x0b\x2b"
- "\xcb\x50\xbe\x08\x9d\x6c\x93\x3a\xb4\x72\xdf\x39\x1f\xf4\x66\x0b"
- "\xeb\xff\x2a\x5e\xfb\xb2\x9b\xf7\x1c\xe2\x7b\xe8\x35\x5a\xd9\xdc"
- "\xe7\xa4\x84\x73\x5e\xb9\xa7\xca\x0c\x1d\x91\x7a\xcb\xed\xc6\x14"
- "\xb5\x1e\xc9\x17\x95\xc7\x05\x9d\xe7\x0c\xd3\xb6\xe5\x4f\xa4\xd6"
- "\x53\xb0\x2e\xac\x3c\xce\x6b\x33\x46\x76\xd1\x50\xc6\xa5\xeb\x90"
- "\x3b\xd0\x4e\x6d\x81\xe8\x3e\xcf\xaa\x71\xb1\xcb\xbe\x8a\xdb\xff"
- "\x6a\x0f\xad\xda\x1f\x29\xdb\x55\xb2\xfd\xd7\xe7\x75\x3c\xe0\x41"
- "\x54\xba\xd2\x48\xd9\xaf\x94\xf9\x0d\xba\xc6\xc7\xf5\xec\x5e\xf4"
- "\x67\xd6\xfa\xe4\x7a\xaf\x55\xa8\xff\xcf\x0f\x7a\xff\xad\xdc\x7f"
- "\x62\x7e\x76\x6f\x10\xb0\xda\xba\x60\xd8\xad\x55\xde\x88\x31\xa3"
- "\x31\x72\xcc\x68\xed\x65\x5a\xad\xcd\xfd\xac\x79\x24\x92\xbe\xd5"
- "\x89\x83\xfb\x06\xab\x79\xfe\x67\x6d\x6c\x9b\xb1\x3a\x2b\xb6\x6f"
- "\xb0\x7a\x95\x66\x17\xd6\x8a\xe4\x68\x3d\x58\x6d\x83\x8c\x65\x1a"
- "\xbd\x0f\xcb\x63\xa1\x83\xf7\x61\x57\x1f\xef\xef\xc3\x6e\x61\x7b"
- "\xb0\xda\xd5\xdf\x87\xf5\xc6\xea\xc3\x7a\x62\xc8\x73\x75\x57\x6c"
- "\x79\xae\x31\xc5\xee\xc3\xae\x19\xa7\xda\xf9\x35\x79\x91\x72\x5e"
- "\x33\x23\x34\x27\xbc\x3a\xf1\xab\xf3\x87\xd7\x34\x0e\xf4\x87\xd7"
- "\xde\xad\x64\xb5\x76\x75\x14\x6d\xcd\xb1\x6d\xfb\x9a\xf3\x83\xfb"
- "\xc3\x6b\xba\x06\xb7\xed\x6b\x13\x06\xfa\xc3\xd6\x21\x51\x30\x13"
- "\xfb\x7d\xa5\x08\xdf\x6c\x6d\x96\xe2\xd3\x5a\xf6\xe7\xe2\xc2\xe0"
- "\x57\x45\xea\x3b\x68\x06\x3e\xd8\xb6\x2b\x6c\xd3\x74\x9d\x19\x8c"
- "\x27\x7c\xf6\xd2\xfd\x35\x34\x0c\x75\xe0\x83\x1e\xe7\xda\x7e\xfd"
- "\xe7\x75\x7c\x9c\x0f\xdb\xc8\x41\xd7\xd3\x19\x75\xfa\x24\x1d\x1d"
- "\xb7\x9b\x2f\x8d\xb3\x50\xde\x1b\x03\xf8\xb1\x4e\xfa\x7f\x8c\xe3"
- "\xf6\x32\x5b\xb7\x2c\xaa\x8e\xf9\xd4\x3a\xdc\x82\xf1\x4a\x6e\x05"
- "\x51\x7d\xd9\x75\x65\x72\x4f\xdf\xa0\xf6\x76\x9d\x2b\xb6\x8e\xae"
- "\x3b\xde\x6f\x6f\xb7\x30\xde\x75\x1f\x45\xc5\x9f\x51\x32\x28\xb0"
- "\x06\x93\xc3\xc7\xba\xd7\x79\x22\x6d\xd2\xba\x33\x91\xe9\x0a\xa2"
- "\xfa\x7f\xeb\xca\x38\xfe\x8b\xb5\x37\x05\x79\x83\xb7\x37\x05\x1f"
- "\xaa\xf2\xaf\x8f\x9a\x5f\x2e\x28\xbb\x7d\x7b\x53\x30\x48\xf9\x0b"
- "\x8e\x47\xb6\x37\xeb\xa3\xe6\xe8\x0b\xce\xc4\x6e\x6f\x0a\x3c\xba"
- "\x9d\x51\x76\x63\xfd\x63\x5f\xcc\xde\xac\xb7\x44\xda\x9b\xf5\xf4"
- "\x79\xf6\xe6\xf4\x00\x7b\xb3\x7e\x55\x52\x5d\xac\xb2\xac\xaf\x88"
- "\x6d\x6f\xd6\xef\x57\x32\x5c\xdf\x11\x69\x6f\xd6\x1f\x8b\x94\x61"
- "\x41\x94\x0c\xd7\x47\xcd\x7f\x17\x94\xfd\xaf\xda\xa4\xb8\xb8\x38"
- "\x63\x9c\xc1\x68\x88\x23\xbe\xa4\xca\x40\x43\xe3\x4c\x71\xf1\x78"
- "\x86\x68\xef\xa1\xc6\x38\xa3\x09\x4f\xbc\xf6\x1e\x12\xf5\x3d\x94"
- "\xd3\xe2\x31\x69\xef\xf8\xa8\xef\x21\x9f\x13\x3f\x54\xcb\x57\xcf"
- "\xdf\x14\xf5\x1d\xff\x39\xf1\x43\xfe\x8d\xe9\x69\xc0\x77\xe4\x3e"
- "\xc8\x85\x9b\xb6\x16\x94\x96\x14\xca\x75\xed\x45\xd6\x82\x17\x5e"
- "\x28\x2a\x2f\xb7\x56\x6c\xb6\x3e\xf9\xc4\x33\xd3\x66\x59\xd5\xf2"
- "\xf8\xd2\x39\x13\x0a\x87\xd3\xa2\x6d\x5b\x38\x62\xd1\xd2\x85\xf9"
- "\xd6\xbc\x27\x9f\x88\x8c\xd4\xd1\xc8\x65\xf0\xb7\xc3\x12\x56\xf7"
- "\x32\x5f\x1f\x43\xb4\xff\x88\xb4\x3b\x1d\xbc\xf7\x5c\xf5\x27\x4a"
- "\x9e\x38\xcb\xfb\x97\x6f\xd9\x05\xef\xab\xb8\x44\x85\x7f\xe5\x42"
- "\x4c\x6a\x74\x50\xd9\x7a\x3e\x4f\xa5\xc8\x20\x7e\xe5\x25\xeb\x77"
- "\xc8\x78\x89\x36\x3d\xdd\x9a\x03\x58\x7c\xbb\x3d\x01\xb2\xda\xd9"
- "\xb7\x2d\xfe\x14\x71\x06\xf1\x78\x10\x61\x3e\x6d\x7f\x7e\xb1\x41"
- "\x86\xfd\xca\xa1\xc3\x25\x5d\xa6\xa2\x1f\x8b\x5f\x09\xf9\xcd\x67"
- "\xd6\x28\xb8\xa2\xed\xc2\x58\x38\x93\xed\x42\x5d\x0a\x99\x78\x5d"
- "\xf6\xdb\x29\x94\xf0\xf6\x18\x3e\xcb\xb6\xa8\x54\x5f\x97\xfd\x3a"
- "\xbe\x3d\xb4\x29\x8f\xf3\x66\xd8\xa0\xb1\x70\x3d\xc3\xd7\x47\xc2"
- "\xd7\x85\xd6\x71\x17\x95\x1a\x01\xb7\xe4\x23\x4a\x4a\xea\x13\x9f"
- "\xfa\x53\x72\x9b\x27\xe7\xc0\x4f\x83\x28\xce\x06\x1c\xa4\xf6\x46"
- "\x15\xfd\x75\x7b\x9f\x08\xf0\x99\x09\x8b\xba\xec\xe2\xd0\x46\x32"
- "\xa1\x3e\x1b\x5a\xb6\xf0\x5e\x8a\xa2\xb3\x0d\x45\x64\x42\xf9\xc7"
- "\x5d\xa1\x17\x03\xd6\xc5\xf0\x1b\x17\x91\xe9\x77\x36\xde\xef\xba"
- "\xe2\x0f\x07\xff\x40\xa6\xbf\xbf\xe5\x30\xde\x12\x16\xaa\xac\x10"
- "\x9d\x82\xcf\xb7\xf6\x09\x3f\xaf\xb7\x3d\xbb\xae\x8f\x61\x7e\xd3"
- "\x63\xb7\x50\x5b\x85\x8f\x76\x5d\x14\xfe\x7d\x7f\x50\xe7\x55\x9c"
- "\xeb\xf2\xf1\xfe\xd9\x84\x5d\x8b\x28\xee\x72\x3e\x19\xcf\x15\xd7"
- "\x92\x7b\x95\x8f\x2a\x2f\x8a\xce\xb3\xeb\xfe\x4a\x6d\xc5\x4d\xb4"
- "\xb6\x9d\x8c\x67\x3b\x3e\x24\x79\x46\x73\x75\x0b\xef\xbb\xb5\xec"
- "\x2a\xe1\xb0\xeb\xb4\x63\x17\x8d\xd8\xf1\x47\xee\x07\xb5\x23\x9f"
- "\xab\xf4\xfc\x05\x32\x00\x9f\x71\xe7\x87\x64\xd9\xf9\x1c\xef\x33"
- "\xcf\xa4\xba\x2a\xb2\x08\x7b\x7a\xe2\x2d\x7b\xba\xf9\x96\x48\x4f"
- "\xe9\xb1\xa7\xa7\xb6\x95\x01\xbe\xe3\x97\x34\xb2\x9d\x52\x7f\x75"
- "\xa5\xdd\x58\xfb\x19\x8d\xe3\x32\x5d\x46\xd9\xea\x3e\x03\x7c\xf5"
- "\x9b\x4d\x41\xa4\x0d\x4f\x13\x48\x7e\xf3\x8c\x3b\xdf\x4f\x41\xe0"
- "\xaa\xbd\x45\xe3\xea\x6e\x91\x25\x78\xf8\xcd\x26\x4e\xd7\x45\x2f"
- "\xdd\x74\x9f\x25\xaa\xdc\x25\xfa\x7a\xab\x97\x35\xc3\x1e\x0e\x7d"
- "\x7f\x7d\xb3\xc9\x7d\xb6\x8b\xce\xf9\x6e\x51\x1b\xfd\x89\xdc\xb6"
- "\xbf\xb5\xfc\xfd\xfa\xe6\x78\xf8\x93\x86\x96\x1d\xbc\x06\x5e\xe9"
- "\x8e\xfd\x1c\x9f\x9f\xe7\xa0\x43\x55\x94\x58\xb6\x83\x86\x5e\x41"
- "\xb8\xb4\x3d\xae\x05\xb0\x81\x7f\x6b\xd9\x21\xf7\x83\x6f\xca\xab"
- "\x3a\x47\x71\x6d\xbe\x5a\x2e\xbf\xb1\x2f\xa5\x85\xdc\xbe\xf3\xe4"
- "\x2e\xfb\x4b\x4b\xd0\xfc\x41\xe7\xfe\x20\x25\xfc\xe4\xc6\x79\xa3"
- "\xdb\x74\x83\xdc\xf9\x3e\xfa\x00\x79\x8b\xea\x16\xf6\xa3\x32\xdb"
- "\x7c\x7e\x3e\x7f\x27\x43\x74\x5b\x86\x1f\xda\x42\x13\xeb\x3f\xa3"
- "\xb4\xa3\x9f\x51\xba\xe8\x49\x37\xf2\x1e\x6f\x3e\x2f\xed\x28\xde"
- "\x89\xe8\x83\xa1\xec\x72\xaf\xb7\x48\xd6\xf6\x7a\xf7\xa6\x53\xc3"
- "\xad\xd0\x5e\xef\x5b\xdd\xa1\xbd\xde\xd0\xa9\x32\xde\xef\xed\xa1"
- "\x97\x4c\x49\x67\x69\xe8\x25\x2a\x4a\x67\xfd\x3e\x74\x8d\x4c\x7b"
- "\xae\x11\x4d\x76\x18\xb9\x9f\x69\x82\xee\xff\xd5\x0d\xd9\xf0\xef"
- "\x4b\x54\x5c\x87\x77\x22\x1e\xf4\xe7\x8a\xe5\x59\x15\x1d\x9a\x1e"
- "\x23\xcc\x88\xb0\x57\xf1\x8e\xc3\x7b\x97\xbd\x4e\x78\x91\x17\x9f"
- "\x41\x33\x9c\xf5\x59\xdb\x5f\xee\xea\x71\x16\x57\x78\xe8\x70\xa5"
- "\xae\xd7\xca\xbe\x17\x95\x7d\x70\xe9\x2a\x9f\xa3\xee\x95\x74\xf5"
- "\x16\x1b\xf8\x4c\x75\x2d\x9c\x69\xf8\x90\xf3\x45\xfe\x2d\x78\x27"
- "\xa9\x3e\x68\xf1\x32\x3d\x6d\x77\x6f\x31\xe7\xf9\x47\x84\x0b\x3d"
- "\x1c\xe5\x36\x71\xdc\xcf\x2f\x5d\x35\x2a\x98\x74\x23\x70\xfa\x35"
- "\xfc\xa8\xfb\x45\xa9\x5c\xc7\xbb\x8d\x49\xe2\xf4\xba\x19\x54\x77"
- "\x44\x9c\x3d\x7a\x44\xb4\xaa\xba\x57\x62\xf1\x50\x75\x0b\xd3\x88"
- "\x36\xbc\x75\x3f\xe2\x4e\x5b\x89\x98\x2f\xad\x85\xbc\xbe\xb4\x64"
- "\xa6\x87\xee\x48\x0b\x2f\x83\x70\xbe\x60\xe1\x76\xf4\xa7\x55\x67"
- "\xe2\x61\x03\x2c\x6d\x1d\x5d\xf4\xf7\xb7\x3a\xe3\xed\xbf\x25\xa3"
- "\x3b\x70\x89\xa6\xa4\x92\x85\xc7\x64\x1a\x8e\x08\x0f\xde\x9d\x78"
- "\xba\xa0\x2f\x77\x5f\xa1\x92\x57\x1f\x4e\xa5\xd4\xdf\xdb\x48\xb3"
- "\x4f\x25\x47\xc3\xec\xd3\x84\x73\x9e\xe6\x30\xdb\xb4\xf1\x8f\x03"
- "\x6d\x53\xe9\x3f\x2b\xdb\x84\xba\x2f\x6d\x51\x9f\x47\x0b\xff\x65"
- "\x54\xb8\xb6\x7f\xa5\xf4\xdd\xa8\x70\xbf\x16\x7e\x20\x2a\xdc\xab"
- "\xc2\x37\x9c\xd3\x6d\x5f\x1b\xd3\xb1\x8d\x6d\xdf\x86\x9f\xb1\xed"
- "\x6b\x5b\xa7\xd9\x3e\x69\x7f\x36\xbc\x29\x7e\x04\x5b\xb4\x95\xed"
- "\xcd\x86\x8d\x4c\xbf\xf8\x15\xe9\xb4\x0f\x43\xd8\x24\x0e\x73\xfd"
- "\x89\x4c\x78\x74\xbb\x67\x67\xbb\xc7\x36\x8f\x6d\xdf\x3b\x63\x44"
- "\xfb\x3b\x47\xc4\x85\x3a\x79\x2e\xf4\x77\xfb\xed\xdf\x0f\x10\xb6"
- "\x1f\x61\x3f\x40\x3c\xdb\x41\xe6\xc9\xb9\xfc\x66\x1e\x1b\xe8\x10"
- "\xae\x15\xe7\x83\xc6\x0c\x3a\x08\x79\xf3\xf9\x57\x7b\xc1\xdf\x24"
- "\x03\x95\xb9\x2b\x7c\x72\x1f\x0a\x9f\x41\xde\x56\xd1\xc1\xf5\x6e"
- "\xcc\x9e\x20\x8f\x53\xfc\x95\xaa\x7c\xe2\x0a\xef\x55\x61\x1a\xd6"
- "\x6e\xff\x0e\x9f\xa5\x6d\x68\x2d\x26\xe2\x73\x09\xd8\x66\x83\x16"
- "\x93\x0b\x34\xa9\xf3\x7f\x37\xa4\xc1\x93\xc9\x51\xb2\xde\x94\xc7"
- "\xe7\xf5\x5f\xa2\xef\x16\x0b\x27\xec\x23\xca\x96\xd4\xe7\x20\x3e"
- "\x9b\x05\x75\x8c\xcf\xd3\x2a\x7e\xc7\x18\x2c\x76\xe9\xe7\xb3\xf0"
- "\xdd\x0d\x80\x71\xb7\xfb\x89\x69\xf6\xd0\x77\x4f\x9e\xab\x6c\xe6"
- "\xf4\xf9\xcc\x1b\xe1\xb4\xeb\x38\x0c\x12\x87\x51\x8e\xdd\x16\x7b"
- "\x68\x43\x8e\xf2\x6f\x96\x35\x9f\x5b\xe5\x25\xb6\xfb\xee\x4e\xe0"
- "\xa8\xbc\xa4\x70\x00\x97\x40\x1b\x10\x11\xa7\xe1\x1f\xb1\x4b\x7c"
- "\x0a\xfc\x69\x2c\x2f\x3e\xa7\x8b\xd7\x29\x81\x2f\x89\x7c\x56\x83"
- "\xf2\x43\xbf\xfb\x93\x86\x3f\x11\x69\x67\x8d\x41\xdf\xbe\x7b\x82"
- "\xcf\xf2\xe2\xf3\xc5\x6e\x77\xb6\x18\x78\x94\xa6\x9f\x2f\x16\xdc"
- "\xf6\xd5\x9e\x2d\x06\xdc\x96\x7a\xa3\x68\x02\xfd\x27\xf8\x7c\x31"
- "\xd0\x9f\xc8\x7a\xa8\x95\xa9\xe9\xcd\xe7\x99\xe7\x25\x3e\x0e\x3b"
- "\xe4\x14\x67\x74\xf9\x73\x79\xb9\x2c\x88\x6b\x57\xfe\xa1\x38\xef"
- "\xa1\xd2\x26\x8e\x47\x58\x2b\xc3\x4f\x81\x1d\x73\xa3\x0d\x7b\xff"
- "\x52\x9f\xf1\xd0\x0e\x32\x29\x9b\xb6\xf1\xb7\x9c\x5e\xd9\xb4\x8d"
- "\x8e\x90\x4d\xdb\xf8\x8a\xb2\x69\x8a\xc7\xca\xa6\x6d\x2c\x51\x36"
- "\x6d\x63\x81\x5c\x4f\x04\x9b\xc6\x71\x6c\xd7\x74\x9b\x76\x74\x8c"
- "\x38\xc3\xb6\xa3\xc7\xb9\x31\x4f\xb7\x6d\x07\x10\xc6\xb6\x83\x69"
- "\x54\x76\x6a\xc3\x71\xf1\x3f\xd2\x49\xad\xd7\xe4\xdf\xc5\x7c\x7e"
- "\x46\xa7\xf6\x1b\x72\xd9\xf8\x6b\x65\xe3\x36\x1e\x0b\xd9\xb8\x8d"
- "\xe9\xa1\xb4\x6c\xe3\x36\xfe\x67\x65\xe3\x54\x78\xc3\xf3\x6c\xe3"
- "\x36\x1c\x67\x1e\x68\xf8\x8d\x3c\x8f\xa6\xc1\x83\x8f\x25\x4d\xe1"
- "\x36\x2e\xb2\x7e\x6d\x0c\xe8\x36\x8e\x6d\x5b\x8f\x73\x53\xa2\x87"
- "\x86\xcb\xf3\x51\xb8\x9e\xd5\x80\xe7\x7a\xbd\x63\x19\x70\x99\xf9"
- "\x5c\x7e\xe6\xdb\xbc\xab\x34\x54\x3b\xb7\x46\x2b\xf7\xa6\x1c\x7d"
- "\x8f\xa6\x87\x36\x0e\x3c\xd3\x8c\x42\xe7\x92\x41\xd6\xf7\xf2\x79"
- "\x8e\x6e\xc7\x25\x72\xd7\x0a\x47\x5b\xe0\x22\x05\xf7\x6c\xf8\x88"
- "\xe5\x8a\xfe\xc6\xb7\xf9\xcd\x76\x07\xed\xe8\xeb\x6b\x7d\x72\xfc"
- "\xfe\xa3\x43\x46\xc4\xd9\x22\xe2\x7e\xcc\x79\xf0\xb8\x22\x7e\x97"
- "\x0d\x36\x8e\xf0\x25\xf2\xba\x3e\x78\x5e\x9b\x93\x65\x5e\xf0\xa5"
- "\xd0\xef\x49\xbe\x46\x9b\xe4\x1c\x9a\x3c\x93\x39\x26\xae\xcd\x4f"
- "\x68\xf1\x71\x83\xc4\x17\x7c\x4e\xfa\xdd\x9f\x93\xfe\x5d\xb6\x41"
- "\xbc\x1f\xaf\xcf\x19\x89\x67\x64\x40\x87\xbb\xc2\x70\xbf\xd5\xe6"
- "\x41\x3e\xb2\x8f\x97\xfd\x32\x8b\x8e\x93\xf5\xee\x20\xe0\xe4\xf9"
- "\xb5\xb0\x91\x59\xdb\x89\xcf\x0e\x0e\x4b\x5b\x16\x1f\xe2\xef\xe6"
- "\xe6\xdb\x8c\xd3\x24\xba\x6b\x49\xde\xfd\x72\x1a\xbe\x28\xef\xa5"
- "\xa9\xe9\x9f\x7b\x28\x5b\x05\x7b\xb9\x4e\xee\x5b\x53\xfb\x76\xbb"
- "\x60\xdf\xee\xe5\x33\x36\xd9\xaf\xd4\xf6\x5a\xdc\x09\xbb\x9c\xc2"
- "\xe7\xb0\xf0\x78\xf5\xda\xbe\x3c\xe3\x69\x79\x26\x7e\x59\xad\x9e"
- "\x76\xb0\xb1\x3d\xce\x57\xcb\x53\xee\x43\x42\x9a\xb3\x7a\x1a\xc6"
- "\xcd\x7b\x6f\xd0\x1e\xdf\x2b\xcf\x37\x0b\x74\xb1\x0d\xbc\x13\x3e"
- "\x68\x8a\xca\x67\x1d\xa9\x7c\x5e\x46\xbd\xd9\x74\xf6\x76\xfb\x9c"
- "\x06\x2f\xdf\xcb\xb3\xbf\x7c\xf9\x48\x2b\xdf\xcb\xb6\xcf\x29\xdf"
- "\xed\xf2\x3d\xf9\xe5\xf3\x35\xeb\xf9\x7a\xbf\x3c\x5f\xb7\xa4\x7d"
- "\x71\xbe\x66\x68\x7c\xdd\x92\xff\x39\x7c\x8d\x95\xcf\xfe\x2f\x9e"
- "\x8f\x55\xcf\xa7\x25\x56\x3e\x24\xff\x06\x3d\xaf\x27\x41\xbf\x7b"
- "\x85\xef\x21\x52\x77\x22\x94\x27\x84\xdf\x31\xa5\xee\x27\x2a\x1f"
- "\xa7\xdf\x31\x15\xda\xc7\x55\xfe\xd8\xda\x46\x6e\xd7\x45\xd0\x43"
- "\xe5\xb3\x79\xac\x2d\x6b\x97\x3a\x1f\x50\x4b\x93\xf7\x39\x77\x5b"
- "\x99\xf8\x2c\x76\xce\x5b\x08\x79\x16\x8b\x4f\x9d\xb3\x57\x7e\x98"
- "\xf7\xe4\xa9\x35\x3b\xe5\x2d\xaa\xfe\x97\xd7\x79\x68\x8b\x3a\x73"
- "\xaa\x7a\xd9\xef\xbb\xed\x1a\xfc\x58\x6e\x93\xfa\x61\x5a\x74\x98"
- "\x98\x63\x7e\xd5\x35\x8d\xc7\xaa\x32\x22\xf6\x0f\x66\x6f\xd9\xb2"
- "\x79\xcb\x2c\x6b\xf9\xc6\xf5\x93\xca\x2b\x0a\x2a\x5e\x29\x97\x1b"
- "\xcd\x87\x13\x02\xac\x15\x25\x1b\x8b\x36\xbf\x52\x91\xbe\xad\xa0"
- "\x44\x6d\x4c\x7f\x10\x80\xe1\x40\x14\x71\x1f\x89\x05\x36\xe4\xbc"
- "\x30\xca\x33\x24\xba\xb8\x4c\x7c\x96\x88\xbe\xef\xb6\xd5\x42\xe4"
- "\x73\xb2\xcd\xa9\x28\xf4\x50\x7e\x9e\xce\x47\x3e\xdf\x10\x7e\x87"
- "\xe5\x0a\x55\xec\x66\xd9\x2f\x81\x0b\xd9\xa0\xce\x85\x90\x7b\xfb"
- "\xdd\x15\x08\x68\xa3\x84\x96\xad\x3c\x8e\x5a\xe1\x0f\x3a\xcb\x3b"
- "\xe5\x79\x8d\x3b\xae\xe0\xfb\x95\xbb\xf5\x76\x9e\xe7\x85\xd4\x3c"
- "\xee\xbd\x73\x2f\x51\xc5\x22\xce\x97\xeb\x4d\x7d\x35\x99\x18\x97"
- "\x70\x56\xf0\x9e\x68\xc2\x77\x02\x68\xe8\xd4\x7d\x49\xd0\x9b\x28"
- "\x92\x6b\x5c\x1e\x7a\x65\xdc\x6f\xcc\x5e\xd2\xf6\x6a\x27\xd4\xab"
- "\x7d\xd9\xa6\x1e\xe7\x2b\xa9\xfd\xb0\x4e\x3e\xb7\xb8\xc6\xc5\xf7"
- "\x96\xc5\xe4\x6f\x4a\x41\x53\xb0\x37\x3f\x3e\xbc\xcc\xe8\x17\x43"
- "\x3e\xaf\x9c\x43\xd9\x53\x59\xd6\xda\x79\x22\x43\x10\xf6\x0b\x75"
- "\x76\x72\x41\x13\xc2\x86\xe0\x7d\x86\x65\xca\x67\x18\x20\x6e\x1f"
- "\xcf\x71\xb5\x55\x7e\xd2\x72\xda\x72\x09\x7a\xfd\x0a\xec\xdf\x9a"
- "\xbd\x6a\xdf\x19\xe0\x91\x87\xdb\x71\x8b\x5a\xad\xa2\x85\xc7\xd8"
- "\x40\x7b\x47\xab\xd5\x47\x22\x6e\xe5\x47\x9c\x0e\xf5\xc2\x62\xb7"
- "\xb1\x2f\x81\x70\xb9\xbf\xee\x95\x76\x9d\xe7\x15\x56\x71\x95\x61"
- "\x06\x1b\x17\xe6\xf6\xee\x90\x6c\x0b\x3e\x23\x5e\x43\xd5\x41\xaf"
- "\x04\xa2\xed\xfd\x84\xc2\x59\xd6\xc2\x82\x0a\x6b\x69\xc9\xa6\x22"
- "\x6b\x61\x49\xa1\x75\xd3\xe6\x0a\xeb\x4b\x9b\x79\x80\x86\x87\x64"
- "\x22\x74\x22\xc8\xe5\xdb\x96\x1f\xaf\xcf\x41\x77\x6f\x2b\x1e\x82"
- "\xf2\x83\x27\xdb\x96\x77\xf7\x14\x0f\x8d\xe4\xc9\xb6\xc7\x94\x1e"
- "\x6f\xdd\x07\xda\x27\xaa\xfd\x7b\x71\x9d\xf8\x46\xf9\x5f\xf1\x46"
- "\xd6\xbd\x6d\xaf\x6a\xb0\x27\x75\x58\xa9\x17\xf7\x5d\xe9\x8f\x3b"
- "\xa4\xe9\x63\x83\xda\x67\x2c\xcf\xad\x69\x90\x6b\xf0\xb7\x76\x0e"
- "\x9a\x86\xcf\xea\xda\x41\x2f\x5c\xa3\xad\xff\x2c\x9c\x5b\xc7\x69"
- "\x3a\x94\x10\x74\x15\xb4\x68\xfa\x03\x9d\xd8\x96\x3e\x50\x7f\xb6"
- "\xed\x65\xfd\x11\x3d\xf9\x09\x72\xbd\x46\xc0\x0f\x3b\x85\x6f\xb4"
- "\xaf\x1e\xda\xba\x9f\xcb\xe1\xdb\x96\x9f\x60\x7f\x5b\x9e\x9f\xf7"
- "\x31\xcf\x7d\xf2\x9d\x2f\xd0\x95\x61\xd0\x0d\xc8\x68\x5b\xa5\x2e"
- "\x23\x1d\x3e\x76\x1d\x96\xfa\x12\xa9\x63\x8a\x9f\x7f\x94\x3a\x86"
- "\xf6\x1d\x34\x19\xf5\x73\xfa\xb8\x0d\x00\x6d\x5d\x15\xbb\x84\x40"
- "\x1e\x9e\x30\x3d\xb8\x16\x4b\x0f\x20\xdb\x17\x4a\x37\xbf\xb0\x01"
- "\x15\x7d\x4b\x51\xc5\x0b\xc5\x7c\x36\x05\xdb\x01\x79\xf0\xc5\x84"
- "\x42\xeb\x2b\xe5\x45\x2f\x0c\xa7\x58\x50\xfd\x91\xe1\xf2\x37\x07"
- "\xa1\xaf\xdd\xdd\xf9\xf1\xbc\x47\x42\xed\x89\xd8\xfe\xe3\xee\x72"
- "\xf4\x25\x22\xe4\xbe\xfd\x6d\xb7\x25\x03\x3e\x59\x06\x49\x1f\x1a"
- "\x3c\x53\xf3\xfc\xdb\x3f\x64\x3e\x74\x1b\x0d\x68\x0f\x6c\x75\xba"
- "\x0e\xe0\xf7\x71\x94\xc9\x15\x5a\x63\xb1\xfd\x62\xb7\x31\xfe\x22"
- "\xdb\x1f\xb5\x9e\xe3\x0a\xec\x40\x52\xc3\x25\xda\x2e\xc7\xa4\xeb"
- "\x65\x7b\x62\xbb\xa8\xa7\x39\xd8\xbf\x4f\x79\x7b\x96\xae\x27\xa1"
- "\x34\xb6\x73\x1c\x26\xcf\x2a\x72\x6e\xf3\xb3\xcc\x85\x92\xbd\x49"
- "\x87\x03\x5f\x45\x83\xb4\x23\xdb\x33\xa2\x6d\xc3\x6f\xcc\x3c\xa7"
- "\xad\xe8\x91\xfa\x67\x2e\xa8\x95\xe7\x9e\xc0\x57\x03\x3d\x73\xb4"
- "\xf5\x25\xe7\x65\x9b\x6e\x03\x2e\xbf\xc2\x25\x9c\xb6\x7b\xf4\xbc"
- "\x44\x72\x41\x6d\x83\xd4\xb3\xed\xae\xd0\x98\xdf\xf6\xd9\xdc\xd7"
- "\x15\xdd\xf9\x43\x3c\x64\xab\x94\xba\x85\xdf\x15\x77\xa9\x33\xd8"
- "\x58\xdf\xb8\x9c\xac\x57\x21\x9d\xda\x7e\x5e\x97\x37\x97\x19\xe9"
- "\xf6\x5a\xe5\x39\xbd\xdb\x3b\x75\x5e\x0e\x76\x56\x8c\xac\xb7\x66"
- "\xd0\xd2\xa3\xea\xae\xec\xa7\xa9\xf3\x81\x78\x9f\x4a\x1c\x68\x6c"
- "\xb9\x4c\x3b\x6e\xf2\xda\xfb\x24\x3f\xf7\x7b\x0a\x5a\xf8\xec\x03"
- "\xb5\x97\x7c\x07\xfc\xff\xad\xb3\x43\x7b\xcb\x77\xa0\xfd\xb7\xcd"
- "\x56\xb2\xdb\x51\x18\x56\xf7\xbc\xda\x7c\xfe\x50\xe6\x11\xdb\x33"
- "\xb7\x2d\x5b\xd6\x57\xb5\x6f\x77\x87\x4b\x4f\x27\xcf\x09\x08\xa8"
- "\x36\xf1\x1a\xed\x68\xe2\x36\x82\xe9\xf3\xd0\x0e\x5e\x6f\x2d\xd7"
- "\x3d\x71\x9b\x2b\xf5\xc6\xc2\x77\x98\xec\x38\x1b\x45\xc3\x45\x1d"
- "\x97\x86\xbb\x4b\xff\xe6\x73\xc3\x3c\x54\x69\x6b\x1d\x87\x3a\xe5"
- "\x93\x65\xb8\xa3\xb5\x02\x75\xcb\xc7\x70\x3b\x53\x75\x1e\x22\xdc"
- "\x81\x6f\xf8\x3f\x15\xe9\x6a\x4e\xa7\xc6\xa5\x6c\x51\x65\x05\x9f"
- "\x49\x65\xb7\xf2\xb9\x82\xb3\x95\xbd\x91\x67\xe1\xc8\xb8\xa9\x5a"
- "\x9d\x1d\xc6\x7b\x7c\xe4\xba\x16\x5f\x40\xda\x06\x75\x76\x02\xe2"
- "\x51\x47\x7a\xf8\x6e\x96\xde\xe2\x61\x8a\xb6\x9d\xfb\xfa\xf3\x80"
- "\x4e\xb4\xca\x39\xc4\x9d\x36\x75\x16\xc9\x50\xf4\xd5\x76\x1e\xd7"
- "\xe5\xb7\xf7\x08\xc2\x80\x13\xe9\x12\x5a\xe5\x59\x5f\x3b\x5b\x75"
- "\x7a\xb5\x38\xa3\xd4\x07\xc9\x83\x9d\xfd\xf5\xbf\x3b\x45\xc2\x7a"
- "\xf5\x7c\x24\x2c\xe0\x18\x9e\xef\xec\xec\x71\x56\x26\xf6\xe3\x51"
- "\x67\xa0\x24\x70\x3e\xad\x8d\x32\x2e\x3d\x64\xab\x76\xc8\x39\x53"
- "\xb9\xee\x0c\xe5\xf0\xee\x2c\x1e\x26\x65\x60\x25\xbe\xdf\xc3\xc4"
- "\xf8\x94\x2e\x56\xae\xd2\xd3\xc4\x19\x98\x8f\x95\xa5\x7a\xde\x3a"
- "\x0e\xa6\xff\xb6\x36\x4f\x95\xc5\xc4\x75\x84\x61\x19\xaf\xd4\x89"
- "\x1d\xec\x33\x55\x5e\x97\x3a\x28\xcb\x59\x79\x26\x5c\xd6\xca\x17"
- "\xab\xbc\x18\xa6\x0f\x4c\x4f\xbf\xfc\x3d\xb4\x6b\x9c\x6a\x4b\x76"
- "\x51\x18\x8d\x99\xf8\x36\x87\xe4\x20\x65\xc4\xf7\x2c\xc5\xbc\x07"
- "\x51\xd6\x15\xc0\x04\x85\xa4\x93\xe5\x81\xbe\xd4\x4c\x6a\x85\xdd"
- "\xe3\xba\x02\x9e\x80\xc6\x5d\x6f\xb2\x5e\x01\x6f\x71\xa4\x6e\xee"
- "\xb2\x85\xd1\x6b\x60\xbb\x8e\xb0\xfd\x3a\x0c\xe8\x93\x7d\x2e\x9d"
- "\x9f\x88\x3b\xde\x2f\xc7\x69\x12\xb6\x59\xa7\xf3\x73\xda\x0c\x8d"
- "\x57\xbb\x3e\xd5\xf2\xf0\xea\x79\xe0\x37\xf2\xa9\x1c\xe0\xab\xae"
- "\xdf\x5e\x51\xa4\x0e\x27\xe2\x46\xbe\xe0\x85\x0d\x45\x85\x13\xad"
- "\x05\x2f\xf2\x31\x46\xe5\xa5\x45\x45\x65\x72\x12\x26\xd2\x0f\x4c"
- "\x95\xf9\x81\x0f\xca\x97\xb5\x6f\x7f\x43\xad\x3f\xe1\x7a\xc1\xf5"
- "\xdd\xcb\xf5\xfd\x74\xe5\x67\xb2\x6f\xe2\x76\x4c\x23\xb7\x5f\x38"
- "\xd8\x7f\x97\xb6\x8f\xcb\x6f\xf1\xa9\x76\x00\xf2\xe4\x36\xb2\xc7"
- "\x59\x55\x1b\xc9\xaf\xaa\xe3\x91\x75\xb9\xaa\x39\xb6\x9d\xa8\x7a"
- "\x4e\xda\x09\x97\xd2\x0b\xb6\x4f\xbc\x76\x9f\xf1\x22\x4d\x57\x14"
- "\xce\x40\xc8\x46\xd9\x13\x74\x1b\xa5\xda\x09\xfb\x44\xb4\x41\x2e"
- "\x95\x97\x3d\x2d\xa4\x37\xf6\x63\x4a\x6f\xec\x33\x3d\x54\x5d\xa3"
- "\xf7\x55\x54\xdb\x51\x95\xc0\xfe\x23\xdb\x74\xc4\xe7\xeb\xf8\x6a"
- "\x52\xb8\xdd\xb0\x17\x0f\xf4\x1f\xec\xa9\xec\x3f\xf0\xba\x42\xe6"
- "\x05\x68\x4d\x50\xf5\xc6\x5e\x13\x66\x7f\xcc\xf8\x3e\x16\x4b\xd6"
- "\xeb\xb9\x39\x9e\xc4\xd3\x65\x93\x5e\xd8\x54\x31\x87\x8f\x98\x2a"
- "\xb2\x95\x15\xbd\x50\x51\x54\x18\x3d\x4f\x96\xae\xfb\x62\x3c\x47"
- "\x5d\x83\x7a\xef\x4d\x66\x7e\xd8\x51\x1e\x67\x9a\x5e\x06\x69\xa7"
- "\xe0\x3b\x6a\x36\x2e\xf1\x32\xed\xfe\xb4\x41\xae\xb3\x73\xa4\xe9"
- "\x7a\xc2\x70\xf3\x6c\x22\x88\x30\x94\xbf\x4a\x5f\x0f\x88\x3e\xa9"
- "\x23\x47\xff\x0e\xa5\x77\xa8\x73\x92\x8e\xc8\x35\x79\xe0\xe9\xee"
- "\xc4\x30\x7f\x0b\xdf\x8e\x0e\xed\x5b\x9e\xa3\xc4\x67\x7e\x75\x91"
- "\xe3\x5d\xc5\x5f\x07\xe4\xbf\x4b\xb3\x15\xbb\xbd\x0a\x0f\xd1\x7b"
- "\x55\xde\xf8\x06\x39\x3e\xef\x68\xd6\xf3\x43\xfa\x8b\xe1\x79\x72"
- "\xbb\x15\x8d\xcf\x43\x0e\x39\x8f\xbc\x47\x9e\x01\xe7\xf0\xc5\xa0"
- "\xd5\x16\x0e\xd7\xe3\xdc\x6d\x41\xfe\xad\x7a\x99\x97\xda\x64\xd8"
- "\xc4\xdb\x94\xb1\x4b\x2b\xe3\x71\xd6\x2d\xce\x9f\xf5\x5f\xa3\x61"
- "\xbf\x76\xae\x88\x87\xef\x37\x64\xfa\xe5\xf9\x66\x16\xae\xd7\xbb"
- "\x1d\x68\xe7\xf5\xf3\x5e\x2e\x72\x19\x4f\x56\x79\x4d\xfa\xb9\x52"
- "\x2a\xfd\xee\xa2\x28\xda\x4e\x86\xa5\xe9\x6c\xb9\x8f\xc7\xde\x77"
- "\x2f\x12\x4e\x7b\x13\xeb\x21\x9f\x37\x55\xd3\xaf\x87\xbb\x3d\x03"
- "\xf5\x6e\x77\x2e\xeb\x5d\xb8\x2e\x95\x4c\x7b\x01\x9a\x54\x5e\x54"
- "\x31\x4b\x7a\xf7\x70\xec\xf8\xd8\xb2\x82\x8a\x92\xcd\x9b\xca\x27"
- "\x5a\xcb\x0b\x0b\xb4\x4a\x1f\x51\xe7\x9d\xb2\xef\xee\xd3\xeb\x59"
- "\x8f\xd3\x99\x1b\xb2\x2d\xce\x90\xfe\xf3\x1a\x2b\x79\xb7\xb2\xf3"
- "\x5d\x55\x9f\x9c\x15\x61\x75\x57\xa6\xe7\x3a\xda\x20\x7d\x36\x67"
- "\x78\xfb\xcf\x7d\xe3\x61\xd7\xc8\x39\x47\xe3\xa9\x4f\xf1\xd8\xf9"
- "\xb1\x2c\xa7\x3c\x4f\x6b\x77\x80\xcb\x29\xcf\x6f\x91\xfe\x99\xf3"
- "\xbc\x5e\xde\x50\xbf\xc1\xd9\x29\xfd\x28\xcd\x5f\xbb\x5d\xbf\x3c"
- "\xe4\x9f\xee\xd9\xab\x8d\x9d\xb5\xeb\x7d\x3c\xdd\xbf\x06\x2d\x85"
- "\xca\x57\xdd\x33\x67\x49\xa5\xe8\x5d\x6b\xe3\x73\xe6\x58\x06\x7b"
- "\x4a\x74\xdf\x52\xae\xbf\x3b\x5c\xd0\xd8\xe3\xdc\xb3\x2e\xdc\x4e"
- "\x88\xb8\x0d\xed\x9a\x8f\xd8\xa8\xfa\xae\x77\xfc\xc3\x25\xe4\xc5"
- "\x73\x07\xb7\xa1\x0d\xe5\xda\x03\xfb\x57\x53\xc8\x78\xd8\xbf\x16"
- "\xdd\x16\xed\x7e\xc7\xbd\x72\xae\xb1\x1e\xb8\xbd\x90\x2d\xe0\xe0"
- "\xff\x39\xa5\x6e\x04\xa1\xa3\xbc\xf6\xc6\xa7\xfb\x48\xb4\xa7\x8f"
- "\xdb\x22\xfc\x86\xde\xee\xd5\xf6\xa4\xef\xcd\xf3\x96\xa7\x53\x77"
- "\xb7\xc5\xd8\x5d\x9e\x6f\xe2\xf1\x02\xe6\x85\xbb\xce\x4f\x4a\x7f"
- "\xf6\x5a\x61\xa7\xce\x87\xe3\xd3\x70\x31\x4f\x4d\x4c\x87\x28\xb7"
- "\x18\x59\xbf\xe5\x7d\x80\xdd\xe9\x68\x4f\xf7\x74\x8a\xf2\x74\xe3"
- "\x20\x67\x67\xdd\xae\x9c\x89\xfa\xdd\x95\x6c\xaf\xd4\xf9\xfc\xaf"
- "\xfe\xe4\x0d\x35\x36\xa0\xe5\xbb\xf7\x67\xc2\xf8\xae\x6c\x57\x0e"
- "\xca\x76\x45\x90\x3a\xef\x7c\xef\x79\xb9\x0e\xb6\xec\x5d\x79\x27"
- "\xaa\xb6\xbf\xda\xdb\x5a\x16\x90\x77\xcd\xd9\x2b\xd8\x4f\x0b\xf0"
- "\xbc\x8f\xdc\x3f\x7c\xba\x22\x40\x4b\xfd\xac\x93\xaf\x12\x9f\xf5"
- "\xee\x93\xfe\xc2\xab\x89\xfa\xf9\xee\x7c\x4f\x23\xfc\x60\x42\xb9"
- "\xe2\x58\xee\x56\x3b\x9f\xcd\xff\x6a\x07\x8f\xbb\xaa\xfe\xb8\x85"
- "\x0e\xc2\xa7\x57\x32\x78\x75\x39\xdf\x8d\xa7\xfa\x0a\x97\x20\x97"
- "\xb8\xbf\x01\x76\xa3\x9a\x03\xd6\xed\xc4\xab\x7f\xe5\xb5\xe5\x1e"
- "\x0d\x07\xf2\x42\xfb\xbf\xc7\xa5\xf2\x02\xbe\x1e\x5d\x9e\xaf\x2e"
- "\x1f\x38\xbe\x11\xc2\x87\xf4\xcb\x34\xbf\x80\xd4\xd8\xd5\x6f\x18"
- "\x57\xab\x3e\x76\x15\xf2\x7d\x5e\x6d\xd7\xc7\xae\xd4\xd9\xd1\x7b"
- "\xeb\x38\xff\xc1\xc6\x88\x84\xfd\x39\xd6\xfb\x04\xf6\xe1\x06\xf5"
- "\x27\xd0\xbe\x33\xed\xba\x5f\xa8\xe4\xf3\xda\xcb\xec\x1f\xf2\x3d"
- "\xa6\xba\x2f\xa9\x7c\x80\xd7\x2a\x55\x5b\xf6\xda\x3a\xbd\x2d\x43"
- "\xda\x93\x9a\xad\xd0\xda\xb9\xd7\xfa\xfb\xbf\xb1\xd7\xd5\xbf\x56"
- "\xa7\xf3\x48\xe7\xb9\xe2\xd1\x6b\xd7\xbb\x53\x9e\xf5\x85\x78\xfb"
- "\xda\x75\xc9\xeb\xfe\xf8\xef\x4d\x0a\xe3\x3d\x7f\x4f\x54\x76\xf3"
- "\x35\xb4\xff\x7b\x57\xa9\x36\x45\x85\x89\x94\x9a\x37\xc4\xce\x7c"
- "\x52\x3c\x28\x91\x63\x33\x5e\x7b\x3a\x68\xfb\x9e\xc5\x63\x18\xd5"
- "\xac\x6c\xd9\xf7\xd0\xfe\xbd\x96\xaa\xd2\xbd\xd6\xc2\xb4\x84\xd3"
- "\xbb\x7c\xd3\x86\x4d\x9b\xb7\x6d\xe2\x01\xb5\x57\xca\xad\x2f\x6c"
- "\x2e\x2c\x1a\x1e\x63\x3c\xc4\xc2\xf7\x3d\xfb\x6a\xfa\xcf\x8d\xfa"
- "\x7e\x06\xaf\x83\x57\x77\x0e\x7c\x7f\xaa\xf5\x01\xd6\xaf\xef\xbd"
- "\xc9\x63\x05\xf2\xee\x07\x3e\x23\x55\x8d\x1b\x74\x72\x7a\xc5\xeb"
- "\xef\xdf\xdd\xbd\xad\x58\xf3\xb1\x5e\xff\x17\xe6\xa3\xd6\xe7\x10"
- "\x97\x69\x5f\xb2\xde\x0e\x31\x7d\xd2\x37\xef\x4d\x97\x76\x31\xd8"
- "\x5b\x6c\x92\xfc\xea\x4d\x47\x7b\xf3\x3d\xaf\xc7\x90\x52\xa3\x95"
- "\x2b\xa0\xf3\x83\xcb\x0f\x5f\x37\xa1\x47\x94\x40\x47\xbf\x9f\xa1"
- "\xe1\x62\xfb\x09\xdc\xdf\x6b\xd5\xd7\x61\xf3\x59\xa0\x2d\x5b\xf9"
- "\x1c\xe0\x7d\x7d\xc1\xc3\x6c\x6f\xf6\x65\xea\x76\x89\xdb\xa2\x20"
- "\xf0\xbc\x7f\xc3\x1b\x8f\x7a\xc3\xeb\xef\xc7\x5c\xa2\xd7\xf7\xab"
- "\xfb\x02\xf6\x95\x46\xde\x17\xf0\x7a\x0e\x9e\xfd\xda\x73\x22\xec"
- "\xf7\xed\x1e\x3d\x8d\x2d\x14\xb6\xef\x4c\x14\xcc\x09\xd0\x74\xa1"
- "\xdf\x5f\x51\xe7\x91\x6a\xe7\x17\xf3\xdd\x17\xaf\x27\xf3\x99\x9f"
- "\x21\xdd\xd8\xf7\x88\xe6\x83\x74\x32\xef\xb8\xbd\x05\x8c\xdc\xcb"
- "\x02\x9e\xbc\xc1\x63\xb4\x5c\x26\xd1\x53\x02\x9d\x78\x7d\x62\x48"
- "\x0f\x14\x8f\x10\x96\x19\xf2\x53\x5e\x4f\xe5\x34\xe1\x7c\x40\x1e"
- "\x4f\xa8\xbe\xe9\xeb\xc5\x7a\x9b\xcd\xe7\x9d\xaa\xfb\x23\xf6\x5d"
- "\x38\x59\xd5\x89\x3e\xff\xeb\x7b\x43\x38\xf6\x5d\xd0\xc6\x22\x4c"
- "\xc2\xf8\xbd\x99\x0d\xb2\xcf\xf6\xfa\xb1\xd0\x98\xc0\xbe\x0b\x6c"
- "\x77\x25\x8e\x94\x9a\x46\xb7\x4f\xde\xa9\x6c\xd0\xef\x4e\x07\xec"
- "\x79\xdd\x47\xd1\x71\xb5\xaa\x31\x27\x79\x46\x25\xea\x20\x64\xf6"
- "\xba\xaf\x7f\x3c\x16\x61\xfd\x7d\x40\x70\xb5\x55\xfa\xde\xdf\x4f"
- "\x0d\xf5\xf5\xbe\x27\xe7\x2e\x65\x3f\x50\xe1\x81\x9f\xfc\xfd\x84"
- "\xe8\x7e\x1b\xfc\x07\x6b\xc9\xa6\x12\xb8\x0f\x2f\x95\x6d\x9e\x83"
- "\xae\xc3\x4b\x65\x25\x73\x78\xc9\xd6\xa2\xac\x85\xf2\x8d\xca\x31"
- "\x27\xc6\xf8\xb1\xba\xdf\x35\x5f\xda\x54\xee\xe7\xf2\xd8\x69\x8f"
- "\xba\xeb\x74\xa8\xf6\x4e\xd0\xde\x43\xd0\xee\x9d\x41\x1d\xf8\x05"
- "\xdf\x5d\x03\x1a\xce\x68\xf7\xcb\xea\x6d\x36\x6c\xf9\xf7\x7f\xa2"
- "\xcf\x77\xc9\x35\xec\x7c\x0e\x61\x77\xb1\x1c\x8f\x43\x99\xfa\xc7"
- "\x3f\xd4\xf8\xa2\x9a\x33\xeb\x71\xfe\x80\xf4\x70\x7d\x3c\x16\x61"
- "\xa9\xfa\xd8\xab\x82\xfd\x41\x5a\x28\x6d\xc4\xd8\x76\xaa\x3e\x9f"
- "\x06\x98\x1c\x9d\x67\x3a\x1e\xbb\x55\x5c\xd3\xfc\xa4\x38\xe9\x57"
- "\x3b\xbf\x3f\x5b\x9e\xfd\xc9\xbe\xb8\x1c\x67\xfe\x41\xa5\x9e\x0f"
- "\xf7\x11\x98\x6e\x6d\xee\x46\xd6\x7b\x3e\xe3\x53\x9d\x11\xfa\x83"
- "\x7e\xf9\x47\xce\x71\xc4\x9e\xdf\xe8\xdd\x2a\x5a\x03\x37\x44\xf3"
- "\xc1\x3f\xa1\xce\xbe\x48\x14\xd8\x2a\x9a\x7a\x6f\x88\x93\xf2\x8e"
- "\xea\xf5\x44\x07\xfe\x4c\xd4\x17\xb7\xf2\xe3\x5b\xe0\xfb\xe2\xeb"
- "\xc1\x6b\x7c\x77\x5d\x03\xe0\x16\xfb\x3e\x11\xf5\x48\xb3\xb8\x4c"
- "\x5c\xab\x07\xdc\xa2\xab\xd7\xc4\x51\xc0\x2e\x2a\x46\xb9\xb7\x8a"
- "\x40\x5f\xdc\x86\x8f\xad\xcf\xb2\x1d\xda\x3f\xd3\x7b\x78\x75\x40"
- "\x38\x8d\x87\xc4\x9e\x87\x1f\xea\x71\xee\xcf\xea\xbf\x33\x0b\x78"
- "\x99\x47\x4b\x6c\xfc\x7b\xc3\xc7\x28\xd3\xc7\x6b\xd1\x86\x42\x06"
- "\x1f\x03\x0e\xfd\xff\x72\x69\x6f\xbc\x71\x0f\xa5\xe0\x49\x8f\x65"
- "\xf7\x41\x6b\x6b\xdf\x56\xd1\x7c\x68\x0d\xe8\xbf\x02\xfa\x6f\x88"
- "\x26\x94\xe1\xe4\xc1\xcb\x44\x4c\x7f\x1f\xe3\xec\xa3\xb8\xb5\xdb"
- "\x0d\xc9\x0d\x88\x5f\x6b\x33\x53\x03\x60\xd7\xf8\x28\xb9\x1e\x30"
- "\x6b\x5e\x4e\x26\x49\x7f\x17\xe8\x4e\x5e\x1d\xe8\x43\xde\x4c\x3f"
- "\xf2\xef\xd2\xe9\xd4\xf3\x67\x7a\x75\x1d\x5c\xcb\xe3\x5d\x29\x2b"
- "\x66\x30\xdd\x6a\x0c\xff\xc0\x04\x6f\x79\x31\x79\xe3\x1e\x7e\xc8"
- "\x43\x07\x32\xb9\x0e\x71\x79\xbc\xd0\x29\x6d\x5f\xd9\xc7\x3a\x0f"
- "\x54\x7f\xf2\x40\xae\x5e\xbe\xf0\x72\xe5\x6d\xde\x22\xc7\x51\x0b"
- "\x5e\xa8\x28\xd9\x5a\x80\xde\xd9\x70\x2a\xe3\x20\xd9\x7f\x2b\x2a"
- "\xb4\x6e\xde\x64\x7d\xb1\xa0\xa4\x74\xf3\xd6\xa2\x2d\x13\x65\x97"
- "\xbb\xbc\x68\x53\x21\x0f\xaf\x6e\x29\xd8\x52\x36\x3c\xca\xe7\x76"
- "\xad\x0e\xb4\xf1\x3d\x27\x55\x3c\x7e\xed\x5a\xa4\x8d\x2d\xfa\x85"
- "\x33\x53\xf6\xdd\x54\x3d\x38\x88\x3e\x7f\x26\xc7\x3f\xa1\xda\x1a"
- "\x57\xae\xa8\x5e\xf1\x88\x10\xf2\x0e\x66\xc3\x35\x72\x3d\x26\xcb"
- "\xd9\x9d\xa3\xe3\x91\x7b\x34\xa4\xcf\xca\xe1\xbd\x39\x14\x5a\xb3"
- "\xed\x5a\x24\x8c\x28\x23\x78\xa0\xf9\xad\xfa\xde\xb9\xff\x76\x89"
- "\x5c\x13\x50\x6e\x9e\x3b\x38\x2f\xfd\x42\xb9\xc7\xc7\x35\x1a\x7e"
- "\x2f\x7c\xb1\x21\x89\xcc\x97\x83\xaa\x5f\x69\x4c\x32\xf0\xfd\xab"
- "\x97\x78\xbf\x61\x06\xcf\x11\x36\x38\x83\x19\xa1\x35\x32\x07\xf2"
- "\xd9\xc7\x95\x63\xed\xb2\x5e\x1c\xac\xd1\xf5\xdd\xc8\x7b\x38\xf6"
- "\x8c\x9d\xa5\x6c\xf5\x41\xb9\xa7\x08\x72\x9b\xa5\xe8\x97\xf7\x41"
- "\xa3\x7d\x3a\xf4\x33\x94\xef\x51\x61\xcf\xd1\xce\x6d\x3f\xf4\xb3"
- "\x60\xca\x1f\x32\xfa\xca\x2d\xda\x1d\xea\x2b\x16\x07\xab\x57\x3c"
- "\xde\x87\x76\x3d\x08\x5f\x55\x54\xff\xe1\xe7\x7d\xd5\x2b\x66\x06"
- "\xb7\xa5\x1b\xd9\xbe\xdb\x6d\xe0\xdf\xe6\xe2\xe1\xe2\x93\xe2\x3b"
- "\xfa\xb6\xa5\xf3\x5a\xc7\x4c\x21\x90\x36\x65\x45\x9e\xbc\xf3\xb6"
- "\x7a\xc5\x93\xda\xf7\x33\xfc\x1d\x84\xaf\x86\xb0\x7c\x7c\x3f\x1f"
- "\x14\x61\xf0\x91\xb0\xab\xf8\x3b\xc9\x20\xd7\xe6\x65\xc0\x37\x9e"
- "\xcd\x65\xd7\xcb\x2c\xfb\x08\x3c\x4e\xd1\x5f\xb6\x43\x27\xf4\x70"
- "\xf6\x5d\x95\x1f\x49\x2f\x5c\xa2\x43\x2d\xca\xa6\xf5\xc3\xbd\xaa"
- "\xf3\x40\xf2\xb6\x7a\xc5\x0c\x0f\xe4\x27\xef\x85\xdf\xf3\x8d\x87"
- "\x84\xf1\xc0\x06\x6e\x3b\x96\xf4\xc9\xb9\x2c\x52\x73\x1f\x87\x3a"
- "\x74\x7e\xf2\x5a\x74\x6e\x3f\x20\xb7\xf4\xb5\x5e\x1a\xae\xea\xaf"
- "\xcb\x14\xd6\x47\xe9\x12\x52\xdf\x0f\xd5\xc9\x7c\x8d\x09\x7b\xd4"
- "\xf7\x41\xed\x2c\x73\x57\x86\x0e\x8b\xb0\x99\xca\x27\x3d\x68\xe2"
- "\xbe\x1b\xcf\x6d\xf1\xef\xfa\x41\xf6\x49\x56\xd5\x09\xc1\xb6\x90"
- "\x6d\xb3\x75\x2c\x51\x9b\x8f\xfd\x76\xd7\xfe\xd3\x75\x3e\x92\xf2"
- "\x4b\x59\xf1\x48\xb7\x28\x26\xf8\x2b\x31\xfd\x54\x4e\x03\xf8\x33"
- "\xd2\x07\x87\x3e\x07\xa1\xcf\x48\xf3\x28\xeb\x6b\xd5\x75\xa6\xe3"
- "\x70\x42\x6b\x65\x27\x9f\xe3\x0e\x3d\x3c\x9c\xc0\xbc\xe1\xb6\xe1"
- "\xa0\x53\xee\x91\x93\x36\xb8\x65\xeb\x0c\xc6\x71\x7d\xa4\x9f\x4c"
- "\x6d\xb0\xa0\xe0\xb7\xbf\xac\x8a\x92\xaf\x00\xde\x54\x41\x09\xdc"
- "\x3f\xfa\xa2\xf3\xc8\xc8\x2f\x4b\xf1\xe4\x70\x96\xee\x03\xe1\x77"
- "\x5e\xe4\x5e\xd0\xc3\x03\xf6\x82\xae\xdf\xbc\xb9\x62\xed\x96\x22"
- "\x7e\xa5\x4f\x78\xe5\xc1\xe8\x36\x31\x51\xdd\x9b\x73\xb8\x98\xe5"
- "\xc7\xed\x84\xda\x53\x71\xf8\x78\x58\xbf\x96\xc7\xd6\xe6\x72\xfb"
- "\xc6\x73\xe2\x88\x6b\xfd\x75\xe5\x2e\xe9\x57\x7d\x94\x40\xc6\xe8"
- "\xfc\x5e\x2c\xa8\x28\x28\x9d\xa5\xa6\x6f\x63\xe4\xd3\x1e\x99\x4f"
- "\xb5\xb9\x3f\x1f\xd5\x07\xf1\xc9\x3a\x78\xf8\x0f\x8d\x22\xf9\xbf"
- "\x64\x2a\x3b\x57\x3d\x43\x5f\xe3\x14\xfb\xec\x89\x15\x27\xfa\xaa"
- "\xdf\xf4\xb2\xbc\xec\xbb\xc8\xf8\xf3\x1d\xed\x46\xf6\xbf\xaa\xf0"
- "\x9b\xd7\x9c\xc8\x71\x3e\xed\x4e\xbb\x5f\x7d\xd6\x0e\x3b\x5b\xbd"
- "\x4f\x1c\x5e\x71\x02\x7a\xe5\x18\x6c\x9d\x49\xf8\xbe\x5d\x35\x47"
- "\x59\xdd\x38\x18\xac\x70\x15\xb4\xab\xba\x52\x7d\x5d\xce\x95\x8d"
- "\xa5\xef\x5d\xa2\xea\x4f\x4d\x16\xf4\xe3\xc6\xd2\xff\x85\xdf\xb2"
- "\xbf\xc0\x71\x11\xb2\xbe\xbb\xab\xd1\x04\xed\x84\x96\x1a\x84\xfa"
- "\x83\x13\xa6\xfe\xe2\xf0\x18\x85\x41\xae\x7e\x8f\x03\x87\x87\x0e"
- "\x31\x51\xd2\xc8\xc4\x84\x7b\xef\x19\x67\x99\xfb\xf8\xec\x99\xf6"
- "\xaa\x4a\x9b\x08\x06\xfc\x49\x22\xfc\xfe\xc5\x7f\xec\x5c\xfe\xa0"
- "\x43\xb5\x15\x87\xff\x31\xe6\xdc\xde\x01\xa7\x28\x63\xdf\x1a\xf6"
- "\xca\x6c\x7f\x85\x8c\xef\xdf\xf2\x18\xd9\x97\xe3\xf6\xc7\x1d\xf8"
- "\x10\x7d\x82\x37\x76\x7f\x80\x30\x94\xdf\x26\x5c\x7f\x30\xab\xbd"
- "\x0d\x6f\xfc\x3a\x58\xfd\x07\x73\x08\xbf\x89\x18\x3f\xfa\x0b\xc6"
- "\x63\x55\x9d\x46\xb7\xe9\x71\x72\x5b\x7d\xf4\x01\x7e\xc7\xe4\x25"
- "\xf2\xe4\xb1\x29\xc6\x01\x3b\xbc\xcf\x7e\x13\xf6\xd9\x26\xc7\x89"
- "\x8d\xd7\xe8\x8d\x9b\x4d\x83\xa4\x93\x73\x3d\x29\xab\x7f\xda\xe3"
- "\xac\x81\xfc\xbf\xb3\x5f\xf3\x87\xe0\xaf\xd5\x64\xe9\x36\x01\xf1"
- "\x3f\x51\xe3\xd5\x35\xf9\x3a\x4c\x4c\x19\x7d\x9f\xd7\x4c\x8a\x16"
- "\x96\xab\xb8\xd1\xd9\xc9\x67\xb8\x0d\x32\x26\x90\x85\xf6\xf9\x1c"
- "\xd7\xe3\x11\xbb\xcd\x43\x46\xee\xce\xd8\x78\x16\xed\xdf\x88\xae"
- "\xd1\x34\xd2\xb7\x9a\x69\xe6\x75\xbb\xe7\x8f\xc2\xf7\xe5\x79\xaa"
- "\x24\x43\x46\x49\xd2\xee\x8c\x82\x3e\xe7\xec\xe9\xdc\x4e\x26\xd9"
- "\x16\x1a\x92\x02\x4f\x18\x02\xce\x19\xd3\x1b\xd4\x9d\x27\x3e\xd7"
- "\x18\xd1\x8e\x34\x17\x91\xc6\x83\xa7\x03\xe9\xce\x5e\xa6\x37\xef"
- "\xc2\xfb\x4c\x92\x41\x34\x24\x41\x92\x53\x1c\xf2\x0e\x48\xb6\xd1"
- "\x67\x45\x0a\x7c\xcc\x5e\x39\x16\x10\x1f\x1a\x0b\x78\x73\x36\xe4"
- "\x36\x24\xf7\x55\xf1\x01\x70\x9d\xe9\xbb\x11\x3c\x53\x7f\x8d\x48"
- "\x1b\xf3\xbe\x80\x3a\x7a\x61\x62\x0d\x59\xb4\xb5\x97\xc6\xb3\x81"
- "\x33\x6c\x8b\x79\xef\x72\x2b\xf2\x3c\x85\xa7\xd9\xba\x89\xe2\xae"
- "\xd1\x9b\x07\xd8\xff\x08\xf9\xb0\x6f\xc5\x6b\xfd\x91\x96\xc9\x48"
- "\xbf\x6b\x23\xeb\x44\xa7\x31\x00\xfc\xf0\xf9\xcf\xb8\x8b\xcf\xc8"
- "\xb5\x30\xbc\xb6\x99\x61\x90\x47\xba\xdb\x7f\x86\x82\xc2\x62\xc4"
- "\x77\x33\xaf\x53\x16\x80\x6d\xb3\xb5\x53\x5b\x99\x1f\x36\xf6\x2c"
- "\x7c\xe0\xf4\x34\xd0\x23\xf1\x21\xfe\xc2\xfb\x90\xaf\x15\xfe\x1e"
- "\xf0\x9d\xe7\xb5\x35\xbc\x07\x58\x94\xa7\x3f\x80\xf4\xad\xe8\x43"
- "\x1b\x19\xff\x35\x3a\xf2\xa6\xe8\x4e\x4f\x9f\xd2\xa5\xee\x44\xbc"
- "\x44\x47\x4a\x41\x67\x5b\x88\xce\x23\xd7\x41\xbf\x09\x76\xb5\x05"
- "\x38\x4f\x89\xad\xc8\xb3\x03\x79\xa2\x3f\x02\xfd\x4d\x43\x7f\xd7"
- "\xc4\x34\xb7\x31\xbd\xb6\x3e\x12\xdb\xd2\x4d\x87\x3e\x23\x13\xea"
- "\x42\x4b\x03\xde\x28\xff\x49\xf8\x64\xe3\x7a\x9c\x47\x1c\xfa\x3e"
- "\x72\xf6\x25\xf0\xed\xd2\x75\xe9\x00\x60\x40\x63\x33\xe8\x3a\x35"
- "\xa2\x8b\xb8\x8f\x13\x0f\x3d\x8d\x47\xbe\x43\x21\xab\x66\xf0\xee"
- "\x65\xf0\xfa\x14\x97\x29\x78\x23\xd8\x19\x04\xbe\x43\x37\x40\x53"
- "\xb9\xc5\x94\xd8\xc1\xf7\x45\xf7\x08\xf0\xfb\xc2\x12\x5b\x8f\xe0"
- "\x75\xa7\xbc\x86\x13\x69\x16\xa1\xac\x68\xef\xde\x9a\xc8\xfd\x0d"
- "\x94\x63\x86\xba\xd3\xf1\xc8\x4c\x6d\x4e\xeb\x82\x1a\x67\x7a\xf3"
- "\x00\xf3\x9e\xcb\x95\xb8\xdb\xfc\x9a\xbb\xd3\x4b\x89\x1d\xa3\xd1"
- "\xbe\xbd\xd9\x54\x17\x64\x1f\xe5\xad\xfe\xf1\xff\x41\xea\x98\xdf"
- "\x0d\xfb\x12\xbc\x21\x3a\xd9\xf7\x54\xeb\x5d\xde\x2a\x5d\x6b\x8b"
- "\xcb\x84\x9f\x69\x04\x9d\xbc\x1f\x62\x0c\xda\xe9\xb9\xbc\x9e\x09"
- "\xf4\xa1\xdf\xf1\xd6\xfe\xdb\xdd\xa5\x0a\xfe\x58\x00\xd3\x04\xda"
- "\xb3\x24\xbf\xb6\x8a\x3a\x35\xd6\xf3\x56\xab\xbe\x9f\x5f\xdc\x10"
- "\x95\x87\xaa\x64\xbe\x8e\xbd\x5b\x65\x1e\x7c\xbf\x66\x67\x85\x55"
- "\x7c\xd4\x6a\xf5\x0e\xba\x67\x3a\x6c\x1d\x8f\x57\xbb\xb3\x4b\xce"
- "\x69\x46\xae\xe3\xa9\x9d\x18\xd6\x6f\xe4\x79\x4d\x07\xcf\xdd\xaa"
- "\x73\x57\x6a\xe5\x7a\xe5\x25\x36\x75\xbe\x84\xdb\xdf\xa5\xf9\x96"
- "\xb5\xdb\xe5\x3d\x3e\xec\xd7\xc8\xb5\x3f\x57\xb4\xf5\x3a\xb5\xc9"
- "\x9c\x47\x6b\xd4\x5d\xc1\x45\x9b\x0a\xd6\x97\x16\xa9\xa1\x94\x49"
- "\xdf\xad\x28\x78\x29\xd2\xff\x35\xc9\x7e\xb1\xb3\x76\xaf\x1a\x9b"
- "\xac\x3d\x15\xe6\x27\x9a\xfa\xc7\x96\x8c\x74\x52\x8d\x2f\xd5\x5e"
- "\x8c\x35\xbe\xb4\xf0\xa5\x4d\x9b\xb7\xc8\x3c\xe4\xd2\xa6\x22\xb5"
- "\xbb\x68\x38\x2d\xcf\x5a\x98\x35\xa9\xbc\xa8\x42\x5e\xce\xa1\x06"
- "\x73\x0a\x0a\x0b\xb7\x68\x0b\x9f\x4a\x38\x15\xc7\xbc\xb8\x4d\x26"
- "\x2d\xdb\x50\xa1\x96\x4c\x95\x97\x16\x6c\x2d\xd2\x50\x84\xd3\x3a"
- "\x8e\xed\x65\x6b\x9d\xec\x33\x0f\x57\xf3\xb4\x6f\x97\x86\xcd\xeb"
- "\x84\xf7\x23\xef\x42\xdc\x3e\x3d\xae\xec\x3e\xd6\x95\x1f\xde\xd5"
- "\xd6\x28\xcf\x44\x30\x9d\xfe\x11\xf3\xf7\xed\xeb\x7c\x9e\x3c\xda"
- "\x36\x3f\xdf\x7f\xaa\xcd\x81\xc2\x5e\xbf\xfd\xcf\xf0\xb7\xfd\xe0"
- "\xaf\x6d\x49\x5f\x50\xc0\xa6\xda\x3c\x74\xb4\x55\x1b\x43\x48\x08"
- "\x1a\x6b\x3b\x79\xfd\x4a\xbd\x1c\x47\x78\xbb\x2b\x34\x8e\x70\xb4"
- "\x95\xdb\x75\xc8\xbb\x83\x69\x63\x3a\x7b\x9c\x3f\x4c\x0c\x5b\x3b"
- "\xd0\xe1\xa1\xb7\xe5\x5c\x17\xcf\x71\xcb\xbb\x1e\xe0\x3f\x69\xfb"
- "\xca\x8d\x6d\x3f\xe2\x76\xa8\x6e\x06\xdb\xdc\xa0\xab\xc0\xab\xea"
- "\xcc\x3b\x8b\x44\xf5\xea\xf7\xa7\xf8\x28\x55\xd9\x8c\x1f\xbe\x8d"
- "\xf0\x51\xd7\xe8\x87\x15\x08\x6f\x82\xdd\x89\x67\xdf\x45\x8d\x95"
- "\xff\xf0\x6d\x6d\x5c\x81\xf9\x13\x1f\x46\x83\x2b\x34\xf6\x70\xb4"
- "\xd5\x9b\x5c\xe0\xdd\xab\xd6\x06\xc8\x79\x50\x35\x17\xfd\xc3\x93"
- "\xfd\x7d\x6d\xe4\xad\xcd\xfd\xa5\x5e\x06\x3c\x78\xe1\xd5\xe6\xe3"
- "\x50\xf6\xb7\xb9\x3f\xa1\xad\xe9\xfa\x61\x67\xb8\x0f\xac\xce\xd6"
- "\x5f\xfd\x3e\xfb\xcd\xaa\xcf\xf0\xce\x68\xe9\xe7\xf0\x38\xc7\x2d"
- "\xe6\xf7\x3b\x0f\x22\x1e\x6d\xdd\x3b\x56\x0f\xd5\xd6\xea\xf4\x30"
- "\xcd\x15\x36\x38\x03\x48\xc7\x6d\x1f\x68\x1a\x0a\x98\xac\x10\xcd"
- "\xef\xa4\x4a\xbf\x59\xe4\x6b\x63\x91\xef\x34\xab\xf1\xa6\xf5\x14"
- "\x26\x37\xd3\x35\x7a\xe7\x6d\x71\x78\x3d\xaf\xe7\xeb\xd4\xcb\xaf"
- "\x74\xf6\x9d\x88\xf2\x87\xc6\x82\xde\xbe\x47\x8d\x05\xbd\xd3\x14"
- "\x92\xe1\x3b\x15\xac\xf7\xbc\x7e\x41\x5f\xbb\xc0\xf2\x54\xf7\x0e"
- "\xbc\xd3\xbf\xfe\x2b\x98\x52\xe0\xe1\xbe\xd2\x41\x35\x0f\x07\xb9"
- "\xd4\xdd\x15\x67\xf8\x48\xce\xc5\x4e\xf1\x53\x23\xc2\x86\x20\x6c"
- "\x04\xc3\x71\x9e\x72\xcc\x04\xbc\xe1\xb2\x04\xe1\x8f\xc7\x59\x86"
- "\x3c\xd1\xe3\xac\x4b\x87\xcf\xd7\x11\xd2\x8d\x77\xe4\x9c\xdc\x41"
- "\x8d\xd7\xc2\xf9\xf6\xf4\x50\xff\xad\x6e\x59\xff\x9c\x13\xf0\x84"
- "\xda\x8c\xba\xed\xcc\x63\xce\xb7\x6c\x07\x8f\x49\x1f\x3d\x21\xe9"
- "\x50\xf3\x3a\xbf\x81\xfc\x8e\x0a\xf8\x17\xdc\xd6\x72\x5f\x82\x65"
- "\xcf\xb0\xea\x2e\xa0\xa3\x3c\xc6\xce\x63\xa7\x47\xf0\xfb\xb9\xa0"
- "\x31\x96\xee\xd4\x9d\x0d\x5f\x67\xa8\xf8\x7f\x34\x35\xc8\x38\x51"
- "\x7e\xc6\x85\xf6\xc7\xa0\x8f\xaf\x68\x78\xe3\x81\xf3\xad\xcb\x1a"
- "\xaf\xe5\x9c\x42\xb5\xc6\x07\x96\xb1\xe4\xf9\xd1\x34\xd8\x5c\x39"
- "\xfe\x63\x6f\x14\x57\x37\x03\x87\xba\xa3\xf3\x68\x96\x60\xde\x6a"
- "\xf0\x5e\xee\x83\x81\x76\xb5\xb7\x0a\xba\x88\x7e\x0c\xd3\x19\xac"
- "\x2e\xe8\x64\xda\x79\x3e\x21\xd4\xaf\x3e\xba\x9d\xd3\x7a\x77\xaa"
- "\x34\x87\xd4\x7c\x07\xcb\xe6\x67\x62\x5b\x31\x69\xe3\xec\x68\xa7"
- "\xde\x71\xb0\xde\x33\x1e\x9f\xec\x5f\x1d\x75\x05\xc1\x17\xc8\x04"
- "\x7c\x3e\x7a\x4a\x97\x89\x87\xea\x6c\x83\xf9\xc3\xea\xfc\xfc\xa3"
- "\x9d\xfa\x19\x2d\xdc\x36\xa1\x0e\x3b\x94\x2f\x59\xff\x77\x49\xbb"
- "\xe7\x8a\xa4\xc0\xf4\xe9\xec\x1b\x35\x18\x85\x3f\x6c\x1d\xdd\xbd"
- "\xe0\xd3\x27\xfa\x9a\xe2\xe0\x9e\x95\xed\xbc\x06\xd1\xed\x57\x6b"
- "\x10\x39\x7c\xb1\x4f\x04\xdb\x7c\x7d\xbc\xa6\xbe\xbd\xc7\x59\x9f"
- "\xab\xf7\x83\xd8\xbe\xc5\xed\x36\x80\x77\xf5\xeb\x3c\xf4\x46\xa9"
- "\x66\xd7\x86\x5e\xa1\xfa\xd7\x35\xfc\xe1\x34\x98\x54\x3f\xb2\xfe"
- "\xb8\xea\x4f\xd5\xd7\xc0\xf6\x64\xa9\xfe\x54\x7d\xa3\x4e\x37\xe2"
- "\x4b\xa3\xcb\x98\x37\x6f\x61\x91\xb5\x94\x4d\x74\xc6\x34\x9b\x35"
- "\x7d\x42\xe1\x14\xb9\x68\xd5\x3a\x7f\xde\x2c\x6b\xde\x9c\x09\xb6"
- "\xe2\x89\x8b\xd5\x6b\x5e\x5e\x2e\xbf\xa3\xe6\x30\xad\x3d\xce\x06"
- "\x8a\xec\xaf\x1d\xd3\x68\x68\xb0\x78\x0c\x93\xd5\x5c\xaf\x79\x45"
- "\x27\xdf\x83\x8e\x36\xb5\x8b\xfd\xe4\x25\x7d\x7f\x11\xe2\xf0\xfc"
- "\x0c\x91\xbc\xa2\xd3\x9b\xfc\x8f\xfc\x34\x79\x93\x57\x5f\xe0\x7b"
- "\xd2\x93\x76\x0b\x7f\x52\x60\xa8\xb2\x95\xf8\x86\x4f\xd2\x09\xbf"
- "\x87\x65\x49\xd9\x0f\xda\xc5\x92\x3e\xe1\x86\xff\x03\xbe\x34\xd8"
- "\xf4\x76\x5c\x8e\x41\xb9\x56\x74\x2e\xb1\x89\x5e\xd6\x1d\xf8\x07"
- "\xe8\x6f\x21\xcf\x38\x1e\x33\x6b\x40\xf9\xdf\xf0\x28\x5e\x34\xa0"
- "\x8f\x74\xf4\xbc\xc6\xdf\x3c\x7c\x43\xfe\x33\x4d\xb2\x8e\x3b\x2d"
- "\xb2\xad\x08\xee\x79\xe8\x19\xf4\x05\x9a\x74\x9c\xc0\x95\xa8\xd6"
- "\x55\x28\x7c\xf4\x05\xf7\x3f\x07\xab\xf3\x03\x3c\x76\xc1\xfb\x0b"
- "\x93\x6c\x06\xbe\xc7\x27\xbf\x7f\xbc\x06\x71\x23\x77\x9b\x79\x0c"
- "\x27\x7f\xa4\xcf\xe0\x60\x98\xd0\xb8\x46\xd0\x73\xc8\x18\xf4\xc3"
- "\x9f\x30\xab\x3b\xcb\xbb\xb4\x79\xdd\xc6\xe2\xfe\x79\x82\x08\xd9"
- "\x37\x4a\x7d\xf8\xcc\x69\x82\x1c\xea\xbd\xf7\xa5\x2a\xdf\x29\xe8"
- "\x34\x90\xda\x73\xde\xb8\x5a\xd6\x4b\x4d\x1f\xc1\x5f\x2f\xcf\xe1"
- "\x25\x05\x84\x97\xd7\xbb\x07\xe3\xa0\x93\x74\x05\xb6\xb5\xc7\xc1"
- "\xfb\x5e\xfb\xf5\xb2\x0c\x7a\x59\x06\xbd\xe4\xf9\x56\xe4\xef\x8d"
- "\x7b\x68\x1d\xea\xac\xe1\x0a\x35\x4e\x64\xfa\x99\x37\xf0\xdf\x13"
- "\x83\xe0\x95\x5c\x57\xc7\xfc\x49\x79\xbe\x92\xf7\x2b\x71\x59\x93"
- "\x02\x28\x73\x78\xb9\x8c\x41\xcf\x41\x27\xca\x65\x44\xb9\x6c\x57"
- "\xe5\xb8\x01\xef\x23\x83\x2d\x19\x13\xba\x0b\xe2\xdd\xdc\xf0\x32"
- "\x06\xf9\xfe\x18\x59\x86\x77\x37\xc6\x2a\xa3\x30\x72\x19\x99\x07"
- "\xef\x3e\xa1\xcd\xb7\x48\x3a\xd9\x6e\x75\xd1\xbb\x34\x72\x37\xef"
- "\xdf\x5a\xd1\x09\xbf\x77\x1e\xcb\xb0\xde\x29\x5c\x4c\x67\x2c\x79"
- "\x31\x3e\x85\xeb\x47\x89\x49\xbb\x1d\xeb\x40\x4b\x7b\x6c\x7e\xbf"
- "\x7b\xf3\xf6\xfc\x7e\xf7\x1c\xa7\x67\x3a\x78\x2f\x5a\x12\x1f\x54"
- "\x04\xfd\x86\x5f\xb1\x2f\x56\xbe\x23\x77\x37\x32\x5d\x31\xe3\xa0"
- "\xfb\x5d\x87\xb6\x44\xd6\x89\x60\xbd\x9f\x98\x7f\x0d\x08\x57\x63"
- "\xb2\x3f\x72\xf4\x8f\x1d\xbb\xf2\xcd\x49\x06\x6b\x1c\xd7\x31\xe9"
- "\x13\xa3\xbc\xb1\xf0\x26\x19\x5c\x7c\xd6\xd9\x3c\xd8\xaa\x98\xf1"
- "\xa8\x07\x56\xb1\xe7\xe1\xfb\xc0\xbb\x0b\x23\x77\x1b\x84\x37\xee"
- "\xe1\xe1\x23\x7d\x81\x34\xe6\x2b\x68\xb5\xa1\x8e\xbf\x29\xdb\x6e"
- "\x39\x96\xf1\x1e\xf8\xf0\xbe\xbc\xbf\xd2\x9b\xbc\xe2\x82\x5a\x9f"
- "\xf0\x5e\xaa\x87\xfe\x53\x67\x68\xad\xd1\x7b\x69\x1e\xc3\x1d\xca"
- "\xbf\x8e\xfb\xc6\x0f\xd1\xa6\xed\x0f\x3a\x93\x84\x75\x47\x92\xb8"
- "\x4c\xef\xfd\x32\x28\xd2\x8d\x68\xb7\xf6\x87\x74\x47\xed\x77\xd3"
- "\x75\x07\xe9\x0b\x63\xeb\xc5\x7b\xaf\xde\x5e\x2f\xde\x7b\x4e\x1b"
- "\xeb\x5b\xa7\xd6\x00\xbe\x77\x42\xef\x73\x88\x3d\xdf\xf8\xa1\xb5"
- "\x4a\xe6\x9f\xa9\xf2\x06\x4f\x02\x99\x6c\x67\x72\xc1\x37\x07\x60"
- "\xdb\x75\xdb\xc0\x3a\x94\xd4\xc7\xfd\x21\x92\x7a\x8e\x38\x1f\x6c"
- "\x4f\xad\x6a\x9f\xd7\x54\xb2\xaf\x1a\x74\xd6\x9f\x44\xfb\xf5\x0e"
- "\xaf\x81\xf7\x25\xe7\x2f\xeb\x71\x1e\xb3\x78\xe8\x6f\xda\x7d\xd7"
- "\xf9\xb9\x90\x4d\x5e\x8d\xda\xcf\x9e\x20\xef\x1e\x43\x3d\xe7\xfb"
- "\xc6\xb8\xae\x23\x2c\x15\x74\xf3\xdd\x63\xe8\x23\x1c\xcb\xd3\xdb"
- "\xfe\xa0\x33\x93\xf9\x2d\xed\xa9\x91\xfd\x61\xf0\xee\x4d\x63\xf0"
- "\xf8\x8d\x29\x16\xe2\x32\xdf\xd8\x33\xf6\xf8\xf7\x26\x93\xe9\xbf"
- "\x5a\xd6\x53\xd9\x34\x4a\xdd\xfd\xa8\x89\xfe\x75\x26\x19\x99\x0f"
- "\x1e\x3a\xb6\x4e\xf1\xee\x58\xa3\x2e\x1f\x0f\xbd\x27\xef\xe9\xe2"
- "\x31\xf8\x25\x01\xd1\xad\xe6\x14\x8e\xb5\xa0\x0d\xd4\xe6\xce\x1a"
- "\x12\x63\xb4\x0f\xd9\xd6\x92\x72\x6b\xe1\xe6\x6d\x9b\xc6\x8f\x1f"
- "\x1e\xa3\x2f\x71\xec\x82\xea\x4b\xfc\x38\x21\xbc\x2f\x81\x6f\x94"
- "\xbf\xbe\x33\xba\xef\x90\xbb\x56\x3b\xa6\x60\x6d\x06\x85\x7e\x4f"
- "\xa5\xdc\xa9\x61\x9f\xd3\x29\x77\xda\xf4\xb5\xcf\x14\x15\xfc\x3f"
- "\xe4\xbd\x7f\x40\x54\x55\xfa\x3f\x7e\x66\x40\x1c\x15\x9d\x81\x90"
- "\x26\xb3\x1c\x8b\x8a\x76\xad\x68\xb3\x5d\x77\x3f\xb6\x51\x69\x6b"
- "\x1b\x29\xb5\x96\x53\xa9\xe0\xcf\xb0\x10\x27\x44\x44\x45\x06\xc9"
- "\xe5\xeb\xba\x8a\xa3\xa9\x1f\x52\x34\xf6\xfd\xb6\x96\x36\x2d\x76"
- "\xd7\xdd\x37\x99\x3f\xa6\xc4\x96\x12\x18\x72\x6d\x17\x5b\xaa\x91"
- "\xc8\x88\x45\x1b\x05\x65\x84\x99\x7b\x3e\xaf\xe7\x9c\x7b\x67\x06"
- "\x04\x8d\x7d\xf7\x79\xf7\xfe\x7e\xde\x7f\xc0\x9d\x7b\xee\xb9\xe7"
- "\x9e\xf3\x9c\x73\x5e\xe7\x79\x9e\xf3\x9c\xe7\x99\xbb\x2c\x24\xf5"
- "\xee\x50\x3d\xdf\x86\x6d\xf8\x76\xd8\x88\xfb\x81\x1f\xba\xc9\x2b"
- "\x68\xdd\x79\xc5\x9f\xe7\xe3\x5f\x62\xec\x8e\x23\xdf\x40\x35\x59"
- "\x3e\x56\x03\x7c\xe3\xd7\x12\xae\x0f\x94\xfe\x31\xfd\x8c\xf4\x68"
- "\x46\xb4\xdd\x03\x99\xee\xbc\xb4\x01\x7f\x75\x74\x6d\xb1\x17\x38"
- "\x31\xa3\x41\xf2\x3b\xaf\x34\x20\x3d\x0a\xe9\x03\xa4\x1d\xcb\xab"
- "\x83\x20\x2f\x27\x0a\x5f\x08\xd9\xe4\x0b\xe1\x95\xb3\x44\xa3\xdb"
- "\xdb\xf3\x99\xf4\xc9\xf5\xca\x66\xf2\x95\xed\x66\xaf\x4e\x20\xfe"
- "\x82\xf2\x22\xed\x13\xcb\xb3\x2c\x81\xae\xc4\x0f\xbb\x51\x26\xdf"
- "\x38\xa3\x81\x6f\xb7\xd2\xde\x7e\x1c\xca\xbc\x8f\xf8\xb6\x30\xf3"
- "\x40\x7f\x47\xc1\xab\x89\x1a\x0f\x42\xf6\xa6\x7d\xf1\x1f\xda\x3a"
- "\x38\x0c\xf8\x3d\xac\xdd\xc8\x53\xc8\xb7\x88\x8e\xc5\xd1\xfa\x60"
- "\xcc\x49\x16\x67\x94\x68\x5d\x24\x4c\xd8\x29\xb0\xf4\xd5\x62\x0d"
- "\x17\x8a\xa4\x3c\x3a\x98\xde\xc7\xfa\xf9\xb5\x5c\x3f\x5f\xad\xd0"
- "\xe6\x02\x7e\x57\x6a\x63\xb5\xdb\x39\x97\x8c\xac\x79\x99\xf3\xe6"
- "\x5a\x6e\x5a\x3c\x98\x85\x44\x72\x4c\x9b\x97\x61\xc9\x9c\xf7\xfc"
- "\x92\x79\x8b\x85\xa0\x47\x4f\xbb\xef\xb1\x00\x83\x82\x71\x75\xc5"
- "\x59\x9b\xdf\xde\x4a\xb2\xb0\x71\xd5\x68\xa1\x4f\x97\xfb\x20\xc7"
- "\xe2\x95\xa2\xa1\x89\x52\x1f\xd9\x02\xba\x96\xa9\x3e\x75\x67\x54"
- "\x13\x1f\x77\x8a\x95\xdd\x23\xf7\xec\x7f\xbb\x44\xd2\xca\xf0\xcb"
- "\x8e\x82\xdf\xa6\x07\xf9\xb5\x32\x61\xff\x2a\x6d\xe7\x7e\xbb\x1a"
- "\x34\x9e\x1b\xe4\x41\xca\x4e\x13\x0e\x0a\x3c\xbc\x02\x16\xaa\xbc"
- "\x33\xbe\x53\x76\x27\xcf\xe6\x4d\x1b\x3a\x99\xd0\x07\x92\x8f\x75"
- "\x89\xaf\xbf\x75\x6b\x74\x04\xff\xd2\x44\x7a\x07\x4d\x3e\x9a\xe2"
- "\xbb\xc8\xf3\x96\x31\x3d\xe9\x1e\x80\x21\xee\x37\x32\x3d\x7a\x5e"
- "\xf0\x6a\x1d\x78\x99\x6a\xca\xb3\x53\xb5\x21\xe3\x51\x33\xaa\x3a"
- "\x0a\xca\xe2\x83\x72\x47\x59\xab\xe0\xe3\x3b\x69\xdc\xfc\xb6\x3a"
- "\x85\xd6\x08\x89\xdd\x43\xae\x54\x5f\x3e\x58\xea\xdc\x25\xbe\x95"
- "\xa5\xa9\x6d\x68\x25\xcc\x52\x6d\x10\xf5\x72\x5c\x97\xb5\x62\xcc"
- "\x55\x53\x5f\x00\xe7\xd7\x68\xf4\xa2\xf6\x52\xdd\x49\xaf\x0c\x1c"
- "\x76\xbf\xb9\xdc\xab\x97\x31\x10\x5f\x6d\x90\xf2\x51\x59\x5d\xe8"
- "\xde\x91\x94\x85\xca\x9a\x82\xfe\x06\x7e\x7b\x49\x1c\xae\x45\x19"
- "\x74\xac\xe5\xb9\x94\xa5\xb3\x9e\x9b\x97\xb2\xc4\x36\xc6\xb2\x24"
- "\x43\x6c\xcd\x09\x35\x40\xd6\x92\x39\xcf\x59\x08\x45\x52\x26\x24"
- "\x25\xa5\xdc\xff\xf8\x2f\x9e\x1c\xcc\xee\x9f\x85\xb4\xac\x45\x96"
- "\xa4\x84\x31\xf2\xd1\x63\x13\x1f\x78\x22\xe5\x81\x29\x8f\x4f\x9e"
- "\xda\x8b\x6d\x6c\x24\xc6\x44\x15\xfa\x68\x40\x23\x7b\x7d\xbc\xb4"
- "\x85\x78\x2d\xa7\xbb\x2d\xc4\x6b\xa0\xd5\x6b\xbb\xf1\x57\xc5\xd8"
- "\xeb\x71\xf8\x1b\x8f\xbf\x04\x39\x6e\x06\x01\x03\x5f\xdb\x15\x1c"
- "\x37\xf4\x4c\xda\x0b\x4b\xdd\xeb\x6b\xc0\xbf\x57\x7d\xa1\xcf\x82"
- "\x58\xf0\xbb\x3d\x02\x2f\xd5\x71\x41\xe3\x21\xc5\x67\x10\x63\x43"
- "\xf2\x2b\xaf\xf9\xb4\xb1\x21\xce\xdb\x21\x9d\x74\x66\xf4\x1c\xe3"
- "\x3b\x86\xf4\xcb\x18\x0b\x55\xb4\x2f\x4a\xe9\x3c\xea\x58\x8c\x5a"
- "\xee\x58\xd2\x37\x13\x3f\xab\xee\x9f\x0c\x6b\x61\xbf\x7b\x9e\x17"
- "\x94\x79\xa5\x2c\xf8\xda\xad\x62\xdc\xbc\x30\xe2\x7e\xb1\x0f\x25"
- "\xce\x35\xfc\x2e\x2d\x38\x7e\x5e\xa7\x73\x0d\x02\x17\x24\xf6\xfe"
- "\x6e\x75\x0f\x3d\x4e\x18\xd2\x8a\x35\x7f\xd5\x59\xa3\x99\x3e\x7c"
- "\xb4\x83\x6d\xd6\x73\xf0\x0a\xbf\x9b\x24\xed\xe1\x7e\x57\xa1\xf1"
- "\xcf\xf8\x8d\xf9\xff\xb9\xad\xa7\xfe\xab\x28\x44\xff\x95\x67\xe3"
- "\x27\x6b\x6d\x1e\xe2\x91\x9d\x2e\x8f\xf0\x93\x78\x6f\xad\xad\x9d"
- "\x7c\xeb\x0d\x3e\xc5\x5e\x1f\x6a\xf7\xf3\x4e\xfc\x1e\x81\xb6\x89"
- "\x35\xe4\x0e\xa9\x53\x80\x3c\xf6\xfa\x3d\x52\x36\x91\xe9\x44\x77"
- "\x37\x7b\x8d\xec\x98\xc2\xa9\x7f\xf0\xbb\x18\x7d\x94\xd8\x1b\xee"
- "\x0d\x5b\xa5\x57\xfd\xd1\xbc\xbe\x91\x64\x54\xa2\xd5\x8b\x7a\x25"
- "\xed\xc5\x02\xfc\xe1\x4a\xd8\x17\xe4\x2f\xb9\x57\xd2\xf6\x75\x47"
- "\x65\x4e\x2b\xad\x9b\xde\x3e\xed\x14\xb3\x79\x83\xd6\x9f\x53\xfc"
- "\x9e\x7b\xa9\xbf\x3a\x0a\x5e\xaf\xd2\xfa\xb2\xed\xf6\x67\x6c\x61"
- "\xab\x98\xe5\x70\xc9\x0f\x28\x1d\xf3\xff\xf5\x49\xaa\x1d\x66\x7b"
- "\xcf\x77\x81\xc3\x89\xf2\xfd\xdd\x06\xed\xfd\x9e\x7e\x4e\xc5\x41"
- "\x41\x52\x72\xfd\x44\xa8\xc2\xe2\xd5\xb0\xb4\xdd\xce\xfc\xd0\x59"
- "\xce\x4a\x39\x26\x35\x1d\x9c\x49\xb6\x67\x0f\x64\x09\xc8\xdf\x9b"
- "\xa6\x7e\xa0\xea\x01\x30\xb7\x77\xbf\x72\x3b\x63\xe9\xed\x4b\xad"
- "\x01\x1d\x0a\xe9\x3e\xc8\x77\x19\xea\xe1\x08\xd1\x91\x05\x6c\xc5"
- "\xdc\x6c\x0f\xc9\xc4\x0e\x94\x53\x4d\xe5\xd0\xbc\x92\x7a\x9b\xdd"
- "\x4e\x57\x3b\x63\x28\x2f\x43\xec\x81\x16\xec\x36\x8b\xb1\x07\x59"
- "\x5b\xc8\xf9\xb9\xfc\x4b\xd5\x96\x42\xf0\x2e\xf2\x5c\xd0\xee\xf6"
- "\x80\x2e\x48\x9c\x91\xd9\x6d\x23\xfb\xd0\x8e\x82\x3d\x91\xbd\xe9"
- "\x0b\x81\x0f\x69\xb3\x32\xe6\x2e\x9a\x3f\xff\xca\xd0\x10\x6a\xb3"
- "\xe9\x28\x50\xd6\xa0\x4c\xc8\xbf\x9b\xcd\x72\x9c\xee\x01\xfe\xaf"
- "\x4d\x93\xfc\xdb\xd3\x5f\x61\xde\x5c\xd7\xc2\xf6\x54\x69\xfc\xbb"
- "\x9c\x47\x7b\x8e\xf3\x82\x3d\xe6\xe0\xdc\xd8\x53\x7a\xe9\xdc\xd8"
- "\xb3\xb7\xf7\xb9\xb1\xa7\x1e\xeb\x6c\x03\x9e\x1f\xc7\x37\xc5\xde"
- "\x0b\xdd\xab\x3c\xb8\xd3\xe8\xbb\x57\xf0\xe0\x29\xcb\x98\x8e\xf8"
- "\x6f\xd2\x4d\xd3\x7a\xe0\x87\x5c\xeb\x07\x46\xa4\xf8\x98\x89\xd6"
- "\x82\x0d\x19\xa4\x77\x1c\xc5\x7d\x17\xb8\x3b\x65\x19\xf0\x02\xf7"
- "\x45\x2d\x72\xbf\x76\xe6\x79\xc8\x21\xf8\xbd\xe1\x14\x61\x85\x42"
- "\x4e\xd5\x99\x5c\xaf\xdf\x98\xa4\xf1\xb8\xc6\x55\x16\xe1\x6b\x57"
- "\xac\xdb\x18\x67\xb4\x6e\xa7\xf8\x8d\x4e\xb9\x6e\xbf\x61\xbb\xac"
- "\x8e\x3b\x6a\x5f\x5d\x6f\xe9\xa8\x63\x25\xd5\x0b\xf5\x2c\x47\xbd"
- "\xf6\x52\x7d\x8a\xe6\x53\xbb\xc2\xee\x32\xfa\x12\xc4\x1e\x03\xd5"
- "\x73\x66\x3b\xbb\x8b\xea\x37\xf3\xf9\xbb\xd8\xce\xf9\xb4\x4f\x2c"
- "\xed\x83\xd4\xb1\x14\x8e\x31\x33\xf0\x14\x7b\x33\xae\x5d\xc4\x3e"
- "\x7c\x03\x58\x64\xa8\x94\x7c\xb0\xdc\x83\xa1\x3c\xf4\x4c\x8e\xd3"
- "\x37\xe3\x0e\xe7\x50\x9d\xdf\x8c\xd3\xf2\x85\xd6\xed\x81\x59\x36"
- "\x30\x96\x0b\xe6\xcf\x9f\x97\xb9\x58\x8b\xe3\x1c\xbf\x28\x7d\xee"
- "\x3d\xea\xb9\xd9\x8c\x79\x4b\x53\x16\xcc\x15\x76\xf9\x48\x95\x3f"
- "\x7b\xf0\x1a\x63\x48\x16\x10\xb6\xae\x82\xcf\xd8\x4b\x36\x5c\x82"
- "\xe7\x68\x64\xe5\x0e\xb9\x8f\x5d\xfe\x90\x5c\x07\x86\x2c\x45\x3d"
- "\x76\x6b\xeb\x00\xe9\x23\xda\xd8\xe8\x35\xb4\xbf\x44\x67\xa1\x69"
- "\x1f\x8b\x74\x12\xc8\x53\xe7\x66\x6f\xe4\x6a\x63\x7b\x3d\xd2\xe9"
- "\xfc\x85\x33\x83\x6c\xf6\xf6\x8e\x56\x36\x4e\xab\xe4\xd1\x13\x72"
- "\x80\x01\x91\xb4\x36\xd0\xbe\x8a\xf4\x9b\x5f\x3e\x92\xb0\x8d\xf4"
- "\x66\xce\x0c\xb2\x81\x7b\x93\x74\x1d\x26\x37\xdb\x1b\x07\xb9\xa8"
- "\x72\xf5\x72\x66\xa0\x6f\x60\xdd\x70\x4b\x1d\x6c\xf9\xb8\x77\x72"
- "\x19\x53\xd7\x0e\xf7\x7a\xa1\x13\x2c\x97\x31\x03\x1c\xd3\xea\x55"
- "\x9d\x43\x3d\xf2\x61\xfc\x0f\x65\xb2\xce\x13\x4a\xc5\xfe\x99\xc0"
- "\x85\xf2\xd5\x7c\xd3\xc4\x04\x61\xa7\xb8\x69\x42\xa9\xc2\xd3\xc2"
- "\xe8\x1e\xb8\x3c\x18\xfc\xfe\x6e\x6e\x8f\x67\xaa\x6d\x63\xd8\x29"
- "\xf6\xfb\xa1\xa4\x33\x45\x7f\x94\x10\x2d\x50\x7e\x93\x5a\x7e\x13"
- "\xca\xc7\xfa\x77\xad\x1a\xb3\xb2\xbc\x5a\xfb\x16\xc6\xb6\x07\x6b"
- "\x57\x25\xad\x5f\xa8\xff\x7e\xfc\x39\xa5\x7e\xc6\x0b\x39\x69\x54"
- "\x40\x3f\x23\x79\xa4\xdf\x87\x6b\x63\x92\xbe\xad\xb6\xc1\xad\x14"
- "\x08\x9f\x89\x3a\xf5\x5b\x6e\xd2\x15\x68\x65\x72\x94\xc9\x2f\xb4"
- "\x96\x62\xad\x31\x60\x8e\x79\x86\xad\xc2\x9a\x42\xdf\x20\x1e\xb7"
- "\x7d\x14\xc7\x9a\xe3\x4f\xf1\x87\xcb\x73\xeb\xcb\xd8\xd0\x50\xfe"
- "\x16\xdf\xcb\x0a\xf2\x64\x28\xe3\x02\xb0\x2c\x8f\x0e\x43\xfc\x5e"
- "\x9c\x25\x20\xbb\x10\xea\xd7\x4e\xf4\x13\xfa\x2a\x1f\xdf\x29\x07"
- "\x5f\x3e\x14\x74\xf8\x3d\xf5\x57\x91\x82\x39\xd7\x29\x78\x75\x23"
- "\xc5\x38\x6f\x64\xbf\xdf\x41\x7d\x45\x65\x71\xc7\xc4\x64\x5f\x87"
- "\xf5\x67\xe4\x37\x8a\x68\xbd\x32\x97\x37\xd3\x5e\xdf\x29\xf6\xc7"
- "\xd1\xc4\xc3\x82\xaf\x17\xbf\xed\x73\xb9\x22\xfa\x5a\xd8\x3b\xfe"
- "\x71\xf4\xca\x66\xae\x5c\x2c\x60\xbc\x0a\x58\x7a\x51\xcf\x7c\x5e"
- "\xc8\xa0\xa8\xb7\xde\x7e\x9a\x7c\x5b\x95\x62\x7e\xad\x61\xf8\xae"
- "\xa1\x68\x39\x33\x91\x5f\x30\xbb\x8d\x7b\x6b\xdb\x4b\x58\xad\xad"
- "\x84\x7d\xe0\xdb\xcc\x9c\xd9\xa4\xd3\xfc\x63\xd5\xd1\x9c\xcd\x64"
- "\x5f\x3e\x08\xbf\x7f\x65\x79\x82\xbe\xf5\x87\xd4\xa3\xc7\x8f\xb1"
- "\xa3\xce\x63\xcc\xf2\x94\xb8\xb7\x55\x5b\x3f\x60\xd5\x89\x1f\x30"
- "\x7b\x13\x57\x88\x1f\xca\x5b\x48\xdf\x58\x83\xb2\x4a\xc9\x87\x96"
- "\x49\x69\x33\x0f\x46\xfb\xc3\xa7\xe4\x30\xb1\x9f\xe8\xcc\xd8\x87"
- "\x3a\xfe\xe1\xec\xce\x73\xcc\xe0\xcc\x78\x57\xfc\x16\xfa\x05\xb4"
- "\xd7\x35\xb7\x5e\xd8\x9a\x91\xff\x30\x57\x4e\x33\x9d\xd3\x54\x36"
- "\x50\x1d\xfd\xb2\xde\xa0\x57\xb8\xf6\xfe\xcb\x79\x81\xf7\x85\x4d"
- "\xe3\x0e\xa2\x07\xea\x54\x33\x55\xd2\xa4\xba\x1e\x34\x7d\x42\xa5"
- "\x8f\x35\x94\x3e\x7f\x30\x11\x7d\xc8\x8e\x54\xc9\x6e\x2d\x45\xdd"
- "\x12\x41\x03\x45\xfb\x06\x8d\x01\xda\xf7\xa2\xf2\x8b\xce\xb1\x48"
- "\x67\x06\xd9\x99\xfe\x71\x89\x31\x39\xdc\xa0\x5c\x38\x5d\xbe\xe1"
- "\x3c\x0b\xa7\x7e\xa3\x75\x76\x83\x78\x2e\x68\x6e\xa5\x3e\xf3\x44"
- "\x4d\xad\xc0\x1f\xc6\xe7\x54\x27\x8d\x3d\x5c\x2b\xd1\x5f\x6b\x40"
- "\x27\x0f\xfa\xaa\x94\xae\x72\x3c\x4e\xf4\x90\x5f\x45\x5a\xcb\x30"
- "\x56\x82\xe9\x9b\x26\x7e\xed\xc3\xdc\x51\x84\x9c\xf6\x07\x8f\xb2"
- "\x71\x56\xbd\xb4\x39\x7c\x33\x61\x07\xf8\xe2\x92\x4d\xe2\x5c\x7b"
- "\x24\x78\x79\x92\xcf\xd9\x36\x71\xfe\xe5\x8f\x81\xf5\x6f\xad\x88"
- "\x39\xfe\x47\x8b\x5e\xd8\x96\x4d\x53\x7d\x74\x4d\xc3\x1a\xb2\x17"
- "\xf2\x6f\x6c\x9d\x9c\x13\xe5\x4e\xa1\x87\x00\x0e\xf4\xc5\x93\x00"
- "\x97\xab\xc9\x56\x8f\x5f\x6b\x65\x91\x3a\xee\x89\x4c\x35\x72\x97"
- "\xaf\x92\xc6\x50\xa4\x18\xfb\xf2\x19\xf8\x48\x8f\x11\x58\x5e\x87"
- "\xf4\x70\x2d\x9d\x70\x5d\x81\x6c\x49\x72\xed\x94\x65\x46\x9e\x77"
- "\x9e\x8d\x14\x3a\x22\x2d\x7d\x99\xc7\x58\x6b\x66\x64\xbb\xef\x23"
- "\x7f\x16\xf4\x0e\xd2\xc3\xb0\x0e\xec\xc7\x77\x9d\xc8\x1f\xa3\xe5"
- "\xe7\x6d\xd6\x70\x57\x4e\xa5\x98\x67\xe4\xf3\x48\x5b\x17\x90\x3e"
- "\x60\x4a\x8e\xc7\x28\xfa\x4c\x4b\x5b\x6c\x15\xeb\x18\x9d\x9d\x07"
- "\x9f\xca\x45\x7d\x4e\x89\x74\x1d\xe4\x4c\x11\xd3\x3c\x24\x4d\x4f"
- "\x7e\x0a\xc8\x87\x5d\x48\x5a\x18\xea\xcc\x02\xf7\xf8\xf6\x86\x67"
- "\xc5\x7e\xbf\x79\xca\x32\xda\x2f\xc3\x77\x9e\x55\xbf\xbd\x8c\x33"
- "\xe9\x17\x53\xa6\xc9\x35\xf3\x4f\xb9\xa1\x32\x2e\xed\x51\xd0\xb7"
- "\x95\x36\xab\xde\xdf\x66\x0d\xa3\xef\x53\x59\xa4\x9f\x14\xb1\xd5"
- "\x7d\xcd\x8c\x7c\x32\xf3\x8d\xc7\x12\x38\x9d\xd5\x40\xb9\xa2\x3e"
- "\x39\x90\xff\xa3\x8e\x95\xf7\x6e\x0b\x73\xa8\xd9\x99\xf7\x14\xc6"
- "\xf4\x9f\x57\x13\xa6\xf8\x4d\x56\x60\x00\xd9\x2f\xfc\xc9\x4f\x7d"
- "\xea\xc7\x3c\xf7\x47\x59\x5b\xef\x68\x66\xba\x3c\xcc\x1d\xb9\x8f"
- "\xf7\xe7\xeb\x88\xa7\xb2\x2b\x9c\xe3\xb7\x89\xc6\xae\xb1\x95\x6c"
- "\x58\xac\x1e\x61\x37\x12\xfd\xb6\xdb\xe5\x6d\x66\xd5\xf9\x1f\xb3"
- "\x6a\x9f\x2b\x7f\xff\x39\x4f\xb8\xb4\x1f\x09\x47\xb9\x7f\xbe\x93"
- "\x9e\xd9\x31\x5f\x52\xfc\xa5\x7d\xcb\x81\x90\x2d\x40\xbb\xcf\xe4"
- "\x5a\xf0\xe7\xd5\x9a\x3c\x71\x85\x36\x34\x90\x1f\x42\xb2\xaf\x53"
- "\x36\x6d\x23\x3f\xd5\x76\xde\x11\xcf\xee\x58\x4e\x7a\xdd\x3f\xef"
- "\x1d\xd6\xce\x12\xd5\x72\xbf\x56\xcb\x6d\xb8\x5c\xb9\x34\x6e\xab"
- "\x8b\xa5\xcd\x86\x12\xbd\x8d\xf9\x51\xb6\x3f\x7a\x5b\x22\xd6\x1a"
- "\xbb\xfd\x22\xe9\x4e\x2a\x46\xe3\x3b\xac\xd6\x57\xc7\xc8\x97\xe9"
- "\x4e\x05\xeb\xf5\xd7\x66\xa6\xda\xca\xd8\xcf\xb0\xff\x18\xaa\xf0"
- "\x78\x13\xe4\x1c\xd2\x95\xda\x09\x67\x49\xf7\x9c\xe7\x67\x11\x2e"
- "\x20\x3c\xf9\xe0\x43\x19\xc3\x8f\x90\x5e\x1a\x58\xe5\xe7\x66\xfd"
- "\x81\x0b\x6e\xb6\x01\xf8\x2d\x7c\xf2\xbd\x70\xed\xb6\x61\xab\xd8"
- "\xbd\x5c\x6f\x14\xb6\x50\x58\x5f\xcc\xe8\xdb\x71\xd2\x36\x67\x5a"
- "\x6b\x88\x5d\x4e\x18\xbe\xb5\x91\xec\x72\xb8\x69\x5a\x79\x09\xad"
- "\x99\xe8\xb3\x8e\x82\xff\xd8\xef\x66\x7f\x12\xbe\x4f\xd6\x91\x1e"
- "\x40\xe0\x7c\xc5\xad\x9e\xa8\x2d\x6e\x2a\x83\x7c\x03\x29\xd9\xbe"
- "\xf2\x0d\x67\xc1\xf7\x08\x7a\x54\x0c\xaa\x6d\xed\x70\x72\xc7\x16"
- "\x37\xcd\x23\xb5\x6c\x23\xca\x3e\xc1\x37\x6e\x81\x9c\x50\x11\x2f"
- "\xfb\x86\x7e\xff\x87\x38\xff\xed\xeb\xa2\xf3\x3c\xff\x61\x2b\xe9"
- "\x24\x9d\xdc\x7f\x8c\x04\x5f\xe8\x6c\x33\x6d\x71\xff\xc2\x9c\x0f"
- "\x1e\xa0\x62\xbc\x5b\xef\x69\x10\x6b\xbb\xea\x5f\xb0\xaf\x3d\x28"
- "\xbe\xdd\x3c\xd8\x85\x42\xc0\xe3\xc6\xb4\xb0\x7d\x7b\x3a\x21\xe7"
- "\x77\x61\x6d\xed\x84\x9c\xc0\xb7\x5b\x23\x8b\x46\xb0\x04\x3c\x1b"
- "\xd1\xc2\x2a\x36\xfa\xf4\x2c\x06\x7f\x26\xcf\xb5\x69\x83\x50\x6e"
- "\x22\xe9\x3f\x6b\xce\xd1\x9e\x6c\x85\xc0\xfd\x0d\xdb\x58\x9c\x82"
- "\xf2\x48\xef\xba\x61\x04\x8b\x23\x9d\x2b\xd2\xe2\x53\xfc\x72\x4f"
- "\x42\x93\xa9\x5e\x18\xc1\xc6\x74\xff\x6e\x85\x7a\xc6\x6f\x9f\x58"
- "\xe3\x97\x7a\xd8\xf5\xb6\x9f\xf2\xc6\x53\xec\xad\x74\x5e\x10\xc6"
- "\xf9\xb5\x66\xbd\x94\x29\xde\x7a\xdc\x58\x2c\xc7\x9d\xd0\xc1\x63"
- "\xbc\xd1\x1e\x87\xaa\xdb\xd5\x09\xbf\x8a\xd1\x33\x72\xe9\x3c\x85"
- "\x48\xd3\x99\x88\x96\x26\x51\x0f\xd5\x17\x9a\xff\x85\xef\xa5\x52"
- "\x19\x54\x9f\x94\x59\x52\x2f\x4c\x7e\xd2\x40\x63\x11\x67\x6a\xdd"
- "\x36\x16\xf9\xeb\x6d\xcc\x54\x33\x9f\xda\xf5\xd6\x6a\x39\x17\xc3"
- "\x19\xd5\x57\x71\xd0\x3c\xc3\x98\x40\xbd\xe9\x7b\x34\x36\x6a\x7d"
- "\x5f\x3b\xed\x59\x5c\x71\x3e\x4b\x3e\x05\xde\x3a\xe2\xcc\xdc\xcd"
- "\xa6\x34\xf9\xa4\x6f\x9f\xe9\xcc\xf3\x32\xca\x7b\x79\x04\x33\xa1"
- "\xac\x0f\x5d\xe9\x84\xb5\xe6\x1b\x9c\x99\x7b\xa9\xec\x2f\x68\x3d"
- "\x5a\x0f\xfa\xc8\x75\x69\x5f\xb1\xcb\x5b\xcf\xc8\xaf\xfc\x64\x1b"
- "\xf7\x53\x39\xa7\xd8\xbe\xeb\x44\x7b\xb7\x9b\x2d\x29\xd2\x97\x9d"
- "\x68\x6b\x40\xdf\xae\xb6\xc3\x75\x8e\xca\xdb\x97\xe0\x4a\x05\xcf"
- "\xa9\xb6\x49\xa3\xb5\x1c\x5f\xfb\x16\x3a\x33\x77\x31\xea\x1f\xca"
- "\x8f\xfb\xe9\xae\x56\xe4\x3d\xdd\xbd\x5f\x28\x0f\x9e\xad\x47\xb9"
- "\x3f\x0a\xee\x23\xd1\xfe\x46\x30\x4f\x09\xda\x03\x5a\xd5\x6d\x07"
- "\x8d\xa4\x7e\xed\xad\x8b\x54\x57\x37\x7b\xcb\xeb\xca\xfa\xb8\xf7"
- "\x73\x4c\x98\xfb\x18\xf7\xab\x6a\x85\x6e\x69\xdf\x57\x93\x7d\x0a"
- "\x97\x78\xf6\x76\x09\xe6\x16\xd6\xb9\xb7\x4b\x08\x0b\x04\x9e\xdc"
- "\x4e\x7b\xbf\x6f\xef\x30\xea\x64\xff\x52\x5b\x88\x67\xea\xad\x8f"
- "\x43\xf4\xfa\x64\x2f\x17\xe8\x63\x6e\x3a\xd4\xac\xd0\x7e\xcd\x08"
- "\xd0\xbb\xcb\xcc\xe4\xf8\xe3\x0e\x94\xbb\x5e\xce\x23\x6b\x82\xea"
- "\x1f\x2e\xa1\x2d\xca\xea\xe5\x2b\xcc\x4c\xb3\xd9\xc3\xfc\x15\x7b"
- "\xd1\xf8\xa6\x99\x30\xea\x65\xbd\x9c\x3b\x54\x47\xf5\xdd\x31\x72"
- "\x1f\xf9\xed\xe9\x78\x7f\x4c\xaf\xed\x0d\x1b\x41\x71\x84\xed\xe4"
- "\xb7\x4f\x9c\x2f\x00\x56\x61\x3d\x88\x70\xb5\x77\x32\xb9\xb7\xbd"
- "\xff\x1a\x8a\xf1\x4e\x67\xcb\xb4\xba\xf5\x4f\x07\xff\x76\x93\xd4"
- "\xc1\xef\x8f\xd3\xe4\x4d\x6e\x02\x8d\x0b\x8c\xc2\xc7\x38\xf8\x2e"
- "\xa5\x3d\xea\x10\xf8\xec\x63\x16\x39\x6f\xf6\x27\xf1\x28\x89\xb7"
- "\x29\x5e\x96\x4f\xed\x52\xe5\xae\x08\x6a\x33\xca\x49\xd7\xf6\x82"
- "\xb5\xb2\xfb\xf4\xdb\xaf\xb5\x0d\x6d\x92\x67\x92\x0f\x35\x8b\xb6"
- "\x91\x5f\x0d\xd9\x36\xb1\x97\xd9\xbf\xf6\xec\xdf\x2b\x69\x7b\xc8"
- "\xe3\x1c\x41\x65\x1c\x5c\x25\x6c\xfa\xd1\x27\xc0\x87\xab\x5b\xd8"
- "\x81\xf1\x7c\xf0\xaf\x07\xf7\xaf\xcc\x03\x32\x46\xa2\xe3\x98\x65"
- "\x0b\x30\x58\x9e\x33\x22\xfb\x96\x83\x0b\x80\xe5\x16\x92\x61\xda"
- "\xf0\x3d\x8c\x8f\x10\x1c\x3a\xd0\x4a\x7d\x75\xfb\x6e\x96\x28\xc7"
- "\xe1\x81\x93\xa4\x97\x90\x71\x55\x0e\x38\x30\xee\xa5\xed\x44\xc0"
- "\xbe\x53\x27\xec\x3b\x43\x31\xb6\x9f\x75\x94\x32\x4d\xf4\x5b\xe0"
- "\x31\x0f\xe4\x0b\x1b\x1e\xd4\x77\xa9\x4f\xc3\xbf\x03\x90\x31\x20"
- "\x27\xe6\xa9\x3a\x42\xc2\xb2\x3c\xe9\x97\xab\xa3\xe0\xa0\x25\xa0"
- "\x23\xa4\x73\x98\x05\xbc\x8a\xf2\xa1\xef\xbf\xa6\x3c\xd2\x6f\x50"
- "\x8b\x7a\x46\xf1\xe0\xdd\xea\xf9\xc3\x78\xb2\x6b\xc2\xbb\xd3\xdd"
- "\xac\x51\xc8\xab\x44\x03\xfa\xb6\xa8\xbb\x9e\xf4\x81\x07\x73\x82"
- "\x3a\xd9\x03\xf2\x4c\xa3\xb0\x7f\x39\xe8\xd0\xc6\x08\xda\x1b\x21"
- "\x7d\xe9\xef\xbf\x78\x78\x0c\x13\x63\xa0\x8d\x9b\x07\xdf\x58\x42"
- "\x63\xf2\x60\x45\x28\x9d\xa6\xf8\x14\xbb\xc4\xa0\x03\xa5\x5c\xcc"
- "\xf5\x03\xa5\x57\xe6\x27\x0e\x0d\xd5\x78\x11\x49\x67\x13\xf0\xe5"
- "\x9d\x7a\x41\x6b\xc7\x44\x07\xf9\xba\x5c\x91\x47\xbe\x7b\x0f\xd5"
- "\x90\x8f\x64\x9f\x63\x62\xb9\xdf\x6e\x26\x9f\x90\x4c\x71\x4c\x74"
- "\x9e\xb2\x31\x7d\x8a\x8d\xf4\xd0\x5b\xca\x49\xc6\x83\xcc\x6a\xe2"
- "\xd1\xe0\x4f\x30\xcf\x57\x2e\x60\xc6\x19\x69\x28\xdb\x1e\x1f\x43"
- "\x3e\x8c\xc9\x7f\x31\xf9\x1f\xf7\xdb\xe3\xa3\xf1\x3b\x16\xfc\x9c"
- "\x89\x9b\x26\x96\xd2\x5e\xb6\xbf\x80\x03\x8f\x1b\xc8\x8f\xb2\xde"
- "\xe5\xf1\xb2\x95\xa7\x99\x81\x7c\x24\xfb\x36\x6e\xa9\xaa\x6d\xff"
- "\x44\xc8\x37\xc3\x6c\x2c\x06\xfc\xc7\x48\xd0\xdc\xac\x44\x6d\x81"
- "\x1c\xba\x65\xaf\x6c\xf7\xd7\x5c\xb6\x5b\xd6\x9b\xea\x2f\x31\xee"
- "\x67\xce\x3c\x51\xf7\x77\x9e\xf7\xa1\x7c\xc5\x91\xb4\xdf\xef\x48"
- "\xaa\x90\xe7\x60\xab\x59\x5e\x16\x6f\x76\xb5\x57\x43\xe6\x3a\x2f"
- "\xe2\x45\xd1\x5e\x39\xb5\x91\xda\x47\xdf\x3e\x7a\xee\xb4\xf0\xf9"
- "\xec\xc3\xbd\x3d\x5d\x7d\xa7\x15\xef\xb4\x56\xb3\x4e\x47\x92\x68"
- "\x7b\x6d\xbb\x7c\x37\x45\xfc\xa6\xf7\x43\xe8\xa0\xb6\x39\x40\x07"
- "\xb4\x9d\xda\x47\xed\xf7\x11\x4d\x40\x03\xb5\xad\xe6\x2e\xb5\x9d"
- "\xd4\xc6\x0f\xb0\xea\x6c\x43\x3b\xd1\x56\xd1\xce\x2e\xb4\xb3\x2a"
- "\x8d\x31\xef\x26\x27\xbb\x18\x9d\x54\x41\x32\xaa\xfd\x43\xf0\xf0"
- "\xb9\x0e\x06\x59\x34\x7c\x4f\x9e\x43\xbf\x16\xbc\x49\x9e\x07\x32"
- "\xa9\x87\x37\x93\xbd\xab\xcb\x86\x3f\x5f\x09\x23\x1e\x47\xe3\xd7"
- "\xf1\x6d\xf3\x51\xe5\x0b\x96\xd7\xcc\x9b\xc1\x9b\x7a\x5d\x3e\xe4"
- "\x49\x43\xfb\x21\xc3\x9e\x52\xeb\x4f\x79\x57\x9e\x95\xed\x32\xa6"
- "\xb3\x98\x43\x4f\xad\xd1\xbb\xea\xd7\x30\xad\x2d\x33\x91\x0f\xed"
- "\x31\xa3\xac\xa1\xd4\x1e\x05\xed\xdc\x8e\x7a\x7a\x43\xda\x54\xd3"
- "\x4a\x36\xb7\x1f\xb1\xc1\xc9\x4c\xb7\xed\x0c\xda\x71\x86\x99\x1d"
- "\x79\xe0\xbf\x1e\x23\x7e\xd1\xf9\xda\x10\x2b\x03\x96\x1e\x92\xf1"
- "\x2a\xa5\xff\xd5\xe1\x2d\xec\x9d\x0f\x03\x3e\x56\xc9\x6f\x75\xd4"
- "\x96\x6a\x1a\x47\xc2\xd7\x2a\xad\x19\x1d\x18\x33\xb4\xa7\xbd\x14"
- "\xdf\xe8\x88\x8f\x15\xf5\x29\x18\x4b\x36\xb5\x91\xb8\x27\x3e\x98"
- "\xce\x98\xe9\xf0\x5e\x15\x07\xcd\xa8\x7c\xf0\x73\x7b\xe9\x4a\x34"
- "\xec\xd5\x3e\xf5\x0d\x36\x0e\xdf\x68\x25\xf9\xbb\x3c\xcf\xa3\xff"
- "\xe5\x1b\x6c\x4c\xff\x30\xe5\x5d\xd6\x17\x7e\x93\x2e\x93\xca\x43"
- "\xdb\xa2\x5b\xd8\xbb\x5f\x74\x9f\x63\x16\x81\x65\x12\x07\xdf\xdd"
- "\x4d\xba\xc2\x7e\x7e\x57\xf0\x70\x64\x8f\xd0\xcf\xf7\xca\xb5\x7a"
- "\xe0\xf7\x25\x76\x44\x5a\xdd\xfb\x4f\x87\xc3\x86\xbe\xca\x5a\xbf"
- "\x55\xd8\x13\xda\x8b\xb6\x02\x2f\xc0\x2b\x1c\x36\xd3\xbe\x03\xd6"
- "\xce\x5d\xed\x6c\xf1\x0e\x66\xb0\x9f\x26\xbd\xd0\x23\xec\x70\x49"
- "\x02\xdb\x79\x8e\xfc\x3c\xc5\x47\xbf\x78\x0e\x7d\xa9\x62\x08\xf1"
- "\xa4\xa4\x73\xe5\x8b\xe3\x4d\x1b\xb6\x6a\x3c\xfc\xe1\x0f\x73\xcf"
- "\x33\xbd\x8c\xd1\x7d\xb8\x6e\x82\x85\xfb\x36\xeb\x95\xb4\x12\xf2"
- "\x1d\x1c\xbd\x2f\x81\x7c\x07\x6b\xfe\x78\x05\xef\x93\x83\x39\xd7"
- "\x66\x1e\xbc\x3e\x93\x8d\x21\x1f\xe2\x46\x8f\xe4\xe5\xe4\x7a\x5d"
- "\x49\xfb\x21\x26\xd5\x47\xaf\x49\xfa\xe8\x7d\x77\x12\xd9\x67\xab"
- "\xcf\xef\xf4\x43\x86\x11\xe5\x66\xb2\xb8\x92\x73\x2c\x9e\xf8\xa0"
- "\x94\x2f\x24\xcf\x46\x72\xe1\x23\xad\x46\xee\xff\x67\x3c\xdb\xd1"
- "\x12\xf4\x31\xee\x59\x4c\x7e\xc9\xb9\xb9\x2f\x5b\xe3\x0d\xb1\x62"
- "\xef\x5d\xf8\xb7\x24\x9d\x3c\xee\xd9\xe6\x4d\x2c\xfc\x30\xd9\xf1"
- "\x95\xca\x73\x4b\x87\x7d\xd2\x36\xb6\xa3\xa0\xb2\x54\xf3\xbd\xdc"
- "\xe7\xde\xb2\x43\xca\x3b\x4a\x04\xe4\x2f\x4f\x87\x53\xfa\x0d\xac"
- "\x6c\x76\xad\x56\x42\x64\x9c\xca\xf7\xe9\x19\xa5\x91\x2f\xa6\x44"
- "\x41\xcb\x23\x26\x92\x7b\x54\x99\xf1\x90\x25\x90\x26\x79\x18\x61"
- "\x9f\x6c\x96\x7b\x65\x58\x9b\x86\x75\x14\x1c\x19\xa3\xad\x67\xb4"
- "\xae\x4b\xdd\xf0\x91\x44\xb7\xbe\x2d\xe6\x32\xf5\x33\xa9\xf6\xd4"
- "\xb4\xcf\x91\x88\xfc\x36\x6d\x7d\x13\xfb\x9d\x2f\x8c\xb8\x7f\xf1"
- "\x32\x36\xf2\x17\xd7\x18\x18\xed\x95\x21\x6f\xb3\x5c\x77\x8f\x14"
- "\x07\xf5\xe9\x89\x82\xde\x74\xae\x58\xc8\x18\xe4\xaf\x4f\xfa\x11"
- "\x6f\xd5\xfc\xf6\xc9\xf5\xf7\xc8\x9f\x42\xbe\x53\x1f\x58\x47\xf1"
- "\x0d\xb2\xd7\xa6\xf2\x25\x6f\x72\x64\x9d\x38\x7b\x86\x7c\x72\x7d"
- "\x3d\xb2\xee\x32\xbc\x58\x3c\xd1\x57\x51\xe5\x49\x57\xeb\x97\x92"
- "\xbe\x39\x2c\xec\x8e\xcd\xcc\x7c\x28\xcf\x1d\x3e\x4c\xfa\xc5\x35"
- "\x36\xb2\xf7\x6e\xa5\xe7\x34\xd6\x9d\xb7\x93\x3e\xf0\xbd\x5f\xba"
- "\x68\xdd\xee\xb2\x46\x4e\x26\x59\x5f\xf0\xe2\xef\x65\xdd\x86\xf7"
- "\x90\x16\x7d\xf0\x8c\x37\x7c\xc3\x72\x36\x46\xfa\x3f\x7c\x4f\xc8"
- "\x1b\x9e\xab\x9f\xeb\xb8\x31\x86\x99\x6f\xdc\xcc\xe2\x3b\x0a\xde"
- "\x2b\x71\xeb\xcf\x4a\x1b\x56\xfa\xfe\xa6\x63\xc9\xe4\x43\xfd\xcd"
- "\x4e\xf7\x00\xd9\x57\x7f\xf9\x31\xee\xe3\x83\xf7\xef\x7d\xa4\xee"
- "\xa5\xd4\xb9\xd9\x5f\xc6\xbd\x7c\x46\xda\x9d\x0b\xfd\x92\x63\x5f"
- "\x5d\x70\xaf\xfe\x2f\x3f\x96\x75\xf9\xcb\x8f\x0f\xdb\x18\xe9\xce"
- "\x8f\xef\x14\xfe\x90\xff\x02\x99\xe3\x48\x92\xaa\x8f\xa9\x13\xe3"
- "\x8a\xf8\xdd\x42\x92\xc1\xbe\x74\xae\x47\x3e\x5a\x27\xc0\x1f\x25"
- "\x4a\x1e\x7e\x5f\xb3\x82\xf1\x13\xd2\xfe\x57\x48\xdf\xd8\x2b\x26"
- "\x6e\x63\x4c\xbc\xb3\x71\x5f\xbc\xb0\xfd\xd8\x78\xac\x0c\x57\x03"
- "\xdf\xf8\x76\x1d\xae\x91\x48\x77\xe3\x4a\x63\xaf\x1e\xd7\x18\x3c"
- "\x77\xd0\xb8\x84\x0c\x6b\xa6\xb8\x70\x6d\x51\xfb\x2c\x7d\x9d\x21"
- "\x22\xda\xb8\x56\x3f\xc1\xa4\x7d\x5b\xd5\x48\x8a\x09\x36\x65\x07"
- "\x63\x8b\x7d\xbc\xd3\x72\x3d\xf9\xf5\xaf\x1a\x69\xdf\x41\xfb\xce"
- "\x7f\xf1\x74\xdf\x77\xae\x32\xe1\x2f\x19\x7f\xbb\xf0\x77\x1c\x7f"
- "\x23\x83\x7f\xef\x9b\x3a\x0a\xaa\x46\x82\x8e\x82\xc7\xea\x1f\x26"
- "\x56\x09\xdf\x5a\x1b\x48\x2e\x8a\x7a\xc9\xa3\xb6\x97\xe1\xde\xc0"
- "\xa3\x8e\x25\xaa\xed\xf5\xe0\xde\x64\xb1\x63\x5d\x8b\x02\x4d\x46"
- "\xa0\xcd\x51\xc7\xca\xa8\xbd\x54\xdf\xb6\xa8\xb7\xeb\x42\xcf\x4f"
- "\x51\x99\xd4\x7e\x4f\xd4\x3e\x2a\x8f\xf1\xdb\x9f\xb1\x69\xf4\x54"
- "\xe9\x44\x67\x4b\xf4\x6d\x28\x43\xf2\x41\xc8\x8f\x32\xb4\xfc\x01"
- "\xda\x8f\x20\x5f\x62\xe8\x53\xe4\x83\x4c\x6c\xd0\xce\x66\x75\x14"
- "\xbc\x6f\x78\x27\x5d\xee\x67\xd0\xbb\xed\x21\xef\x92\xbf\x90\xde"
- "\xde\xc7\x37\x0d\xf2\x9b\x6f\xd7\x9d\x62\x55\xd7\xa9\xdf\xbd\xc4"
- "\x77\x66\xe0\xfc\xe3\x68\xf0\x77\x25\x6e\x3a\x47\x44\xfc\xd0\x78"
- "\xd7\xc8\x76\xe6\x2a\x51\xb0\xe6\xbf\x0d\x3c\xe2\xce\x53\xec\xfd"
- "\x03\xb5\xde\xe6\x7e\xae\x87\xef\x0b\xdb\x3b\xde\x99\xcf\x5c\xb9"
- "\x3f\x10\xb6\xec\x67\xd8\x07\xa7\x5d\x1e\x71\x46\x97\x7e\x9f\xa0"
- "\xe7\xb4\xdf\x4c\x6b\x03\x64\xec\x80\x6f\x7a\x05\x79\x77\x52\x3a"
- "\xd2\xc8\x8f\xc0\xcb\x21\xcf\xf8\xa6\x7d\x06\x39\xa7\x3e\x78\x85"
- "\x78\x0b\x51\x5f\xdf\xcf\x9c\x54\x67\xcc\x25\x03\xb5\xc1\x0e\xf9"
- "\x8f\xe2\xf1\xd1\x9c\xb0\x64\x93\xae\xf0\x83\x55\x18\x77\x1c\xb2"
- "\xb6\xa1\x7f\x6d\xf8\x40\x9c\x3f\xb6\xfb\xf8\x19\xd0\xdc\x40\x3c"
- "\xc9\x86\xbc\x01\x86\x07\x4a\xb8\xb3\x2d\xfa\x6d\x60\xec\x07\xbb"
- "\xde\xc9\x91\x7d\xd3\xcf\x72\x77\x69\x6d\xdf\xa9\xb6\x1d\x69\x62"
- "\x8f\xea\x8e\x62\xe9\xb3\x1f\xf7\x0d\x7d\xea\xac\xd0\xcf\xc4\x0f"
- "\x60\x6d\xb8\x28\x69\x71\x74\x4c\x60\x6d\xe8\x57\x3d\x8e\x8e\xf9"
- "\x06\xdf\xe8\x52\xbf\xe1\xf8\x17\xbf\xe1\xb8\xdc\x37\xe4\x5e\x73"
- "\xf5\xc8\xfe\xcb\x8e\x47\x85\xbd\x29\xfa\x5c\x3d\xe3\x51\xb3\xde"
- "\x0f\xf9\xcd\x67\x3a\x46\xbc\x83\x9d\xec\x4a\x29\x7e\x81\xcf\xf1"
- "\x92\xa7\x26\xa7\x93\x39\xb3\x8f\xb1\x26\x56\x2d\x7c\xd8\xd4\x64"
- "\x91\xcc\x76\x2c\xb1\x6b\xd3\xdb\xc9\x5d\xfa\xa3\xe9\x44\xef\x1d"
- "\xe8\x87\xed\x21\xe3\xac\xb6\xfd\x18\x73\xa5\x92\x7e\xb5\x8e\xf4"
- "\xda\x89\x98\x57\xa4\x07\xf5\x80\x47\xf7\x0b\x7a\x80\x7f\x91\xf2"
- "\xd6\xa1\x66\x21\x6f\x79\x84\x9f\xd3\xa1\x22\x2e\x41\xc1\x8b\x71"
- "\xa4\xfb\xf6\x77\x59\x2d\x1d\x05\x2c\x99\xe2\x15\x90\xde\x99\x9b"
- "\xa6\x55\x4d\xf1\x85\x71\x21\x4f\x81\xf7\xa7\x78\x05\xae\x76\x37"
- "\xf3\x83\x8f\x2e\xb9\xc0\x62\x4a\xc0\x7b\x02\xb3\x4d\x84\xeb\x2f"
- "\xab\x31\x0b\xd6\x5f\x08\xc6\x2c\xd8\x49\xba\x9e\x7a\xfc\xbe\xc0"
- "\xc2\xfd\x1b\x0f\x35\x6f\xbf\xc0\xe2\x76\x64\xb3\xf8\xed\xa4\xcb"
- "\xfb\x4a\xf2\x3e\xc2\x0e\x9c\xe2\x17\x2c\x8a\xa7\xbd\x84\x20\xef"
- "\x43\x67\xca\x83\xb8\x15\x2e\x74\x20\xfd\xa2\x77\x8d\x58\x07\x7d"
- "\x8e\x7d\xf1\xa0\x71\x19\x68\x87\xb5\xac\x7a\x1d\xe8\x67\xe8\xad"
- "\x6f\x35\x7b\x92\xcd\x21\x31\x27\xde\x89\x93\xf8\x8e\xb2\xea\xfa"
- "\x1a\x13\xfe\xed\x56\x76\x47\x2b\x4b\x90\xe7\x19\x07\x61\x4d\xac"
- "\x1d\x4b\xf6\x7f\x79\x0b\x99\xd9\xbf\x7d\xba\xce\xfe\x1b\x16\xe6"
- "\xf2\x25\x32\xfa\xcb\x3b\xcb\x9b\xef\x48\x67\x09\xb4\xff\x40\x7b"
- "\x25\x96\x15\x22\xff\x80\xb8\x5c\x96\x10\x5a\xf6\xc2\x65\x99\x0b"
- "\xee\x4c\x78\x66\x9e\x65\xfe\x82\xcc\x85\x4b\x67\x65\xce\x63\x93"
- "\xa4\xd9\x84\x70\x21\xbd\x8c\x6c\x26\x96\x2e\xc8\x4a\xb3\xcc\x59"
- "\x92\x99\x39\x2f\x23\xcb\xf2\xc8\x03\xc9\x97\xfa\x11\xdc\x6e\xde"
- "\x25\xfc\xc6\x0a\x1b\x3a\xd7\x17\xfc\x7f\x7f\xff\x42\x51\x36\x0b"
- "\x37\xae\x9a\x38\xd5\xe8\x9b\x64\x91\xb1\x8c\xea\x0c\x64\xb7\xca"
- "\xed\xd6\x62\xc9\xa7\xd6\x0d\x92\xbc\xfd\xcc\x7c\x79\xb6\xa2\x4e"
- "\xea\x64\x3a\x26\x8d\x94\x73\xca\x75\x4d\x58\x16\xa3\xdf\x0b\xe9"
- "\xb7\x31\x8b\xad\x71\x8e\xa0\xfd\x70\xd7\x35\x22\xdf\xf6\x24\x9d"
- "\x96\x4f\xcb\x23\x9f\xd7\x8a\xb3\x10\x3b\x85\x4f\xcd\xda\x44\xd0"
- "\x27\xba\xa3\xc0\x95\xe0\x0e\x9f\x10\xaf\xee\xaf\x37\x4b\x7b\xbd"
- "\x3a\x03\xf9\xd5\xe3\xff\xfb\xda\x0b\x6a\x39\x69\xf8\xde\x10\xe4"
- "\x9d\x8e\x3e\x68\x52\xed\xfa\x46\x35\xaa\xf5\x92\x76\xa7\xb5\x8f"
- "\x49\xfb\x0e\x57\x7e\xc8\xb9\x6e\x71\x36\x9f\xd6\x46\x95\x27\xed"
- "\x50\xcb\xdb\xa5\x61\x02\xf2\x43\xbe\x7b\x71\x52\xff\xb1\xd0\x25"
- "\xe5\x9f\x6e\xfe\x52\x54\x3a\x6d\x37\xbf\x0a\x7c\x18\xd9\xc2\x6a"
- "\x8b\x7b\x8e\x97\x40\x0f\x3e\x94\x31\x67\xd1\x42\xdb\xac\xac\x05"
- "\xb3\x17\xa4\x2f\xc8\x5a\x26\x8e\x93\x8f\x11\xff\x1e\xbc\x69\xee"
- "\xd4\x9e\x3e\xa0\xc7\x90\x8e\x45\xf5\x1d\xdb\x4e\x36\x0d\x52\xcf"
- "\x55\xb7\xc3\x57\xc0\x46\xf5\xaf\xde\x75\xc2\x46\xb0\x44\xf8\x31"
- "\xa8\xdb\xed\xd6\x9f\x8b\x53\xf7\x3b\x5a\x55\xda\x8b\xe7\x6d\xa6"
- "\x63\x64\x2f\x31\xbe\x91\x1d\x4f\xa2\x7d\x2e\xd0\xcf\x4d\xeb\x61"
- "\xd1\x72\x5a\xb7\xd0\x0b\xbe\x1f\xa8\x71\x54\x3f\x7c\x8b\x68\x40"
- "\x3c\x21\x68\xb0\xab\x91\x7d\x38\x5a\xd0\xe0\x6b\xf3\x2e\xe1\xc3"
- "\xe0\x6b\xf3\xab\x34\xb6\xa8\xce\x0a\xb7\x6e\xe7\xdc\xba\x4d\xf9"
- "\x3a\x6d\x3b\xff\x3a\x6d\x5b\xd0\xff\xdc\x87\xeb\xf0\xee\x6e\xbc"
- "\xbb\x91\xe2\xc3\x14\x9d\x61\xbb\x69\xff\x9b\xee\x8d\x59\x26\xe6"
- "\x37\xed\xab\xa7\xfa\xb8\x9a\x13\x04\xbf\xdd\x84\xfc\xae\xf6\x1f"
- "\x30\xf0\x92\x6e\x71\x36\x52\xec\xd7\x81\xdf\xc3\x7b\x2e\xd4\xcb"
- "\xd5\xdc\x49\xbc\x45\xbd\x02\x9e\x0f\xed\xdd\x0f\xfc\xb3\x50\xb9"
- "\xd4\x66\x71\x3e\x39\x96\xbb\x3b\x0a\x3e\x2c\x73\xb3\xda\x1c\x95"
- "\x37\x15\xf6\x16\x44\x83\xee\xfd\xf9\xa1\xf0\x63\x0c\x1a\x5f\xcd"
- "\x1d\x13\xdd\xb2\x4f\x3f\x3c\x49\x69\x49\x4d\xfc\xeb\xe0\xb9\xf8"
- "\x0f\xcf\xe3\xbe\x0b\x7f\x0a\x77\xfc\x8c\x85\xec\x2b\xe3\xd9\x31"
- "\xe9\x5f\x3d\x96\x7b\x6c\xcb\x29\xbe\xf6\xb1\x5b\xe5\xb8\x79\x90"
- "\x7b\xec\x69\x61\x78\xc7\x4f\xe7\x38\x25\x2d\x8f\x3d\xe4\x5a\x7d"
- "\x46\xb3\xd3\xc0\xf7\x8f\x7d\xe5\x9c\xef\x63\x22\xde\x73\x93\x4f"
- "\xd8\xfd\xa9\xbe\x0a\x74\x4a\x41\x5d\x0c\xd9\x8b\x43\xb6\xa3\xbd"
- "\x68\xe1\x6b\xbd\xa3\xe0\x58\x6e\xe0\x9c\x98\x49\xf2\x7b\xc4\x73"
- "\x51\x0c\x2c\x1a\xfb\xc4\xbf\x51\x9d\x68\xec\xa3\xec\x32\xda\xa3"
- "\x96\x73\xe0\xd8\xde\x7f\x6d\x0e\x1c\x13\xfa\x5f\x94\x35\x89\xeb"
- "\xed\xfc\x8e\x75\x2c\x55\xd8\x10\xf8\xda\xe9\xfc\x6d\x38\xd6\x8d"
- "\xfd\x12\x4f\x8e\xdf\x24\xec\x4c\xb2\x5b\x4b\xe9\x8c\xeb\xcb\x9d"
- "\x2c\x52\x71\x4c\x73\x12\x9f\x5d\x93\x2b\x6c\x2f\x0c\x78\xaf\x9c"
- "\x6c\x33\xc8\x96\x6e\x98\x88\xb1\x76\x8c\xbd\x7c\x9e\x85\x37\xb1"
- "\xbf\x8e\xa5\xbd\xa0\x20\xad\xff\xfa\x2b\xda\xfb\xe3\x9b\x26\xe4"
- "\x18\x73\xf5\x6b\xa8\x0c\xe5\xc2\xe9\x71\xda\x7b\x14\xcb\x97\xde"
- "\x6b\x64\x7f\x5d\x28\xde\xa3\xbc\xe4\xab\x29\xcf\x34\x1d\x6b\x6e"
- "\x3c\xe5\xf7\xe1\x7e\xa7\x62\x4a\xe6\x58\x0f\xfc\xd9\xbe\x72\x3c"
- "\x9b\xaa\x38\xde\xae\x43\x9a\x55\xec\x41\x74\x99\x69\x6f\x12\xe3"
- "\x6b\x8b\xdb\xe5\xfe\xd2\x29\xea\x43\x67\x72\xb3\xb0\x76\x0a\xb9"
- "\xe4\xaf\xef\xec\xfc\x8a\x85\xdb\xe6\x53\x7f\x1e\x17\xba\x56\x8c"
- "\xbd\x32\x59\xbf\xe3\x8f\xb7\x6d\x4a\xaa\x68\xc3\xd8\x6c\xd7\x1b"
- "\xd8\x61\x33\xd9\x92\x1f\x73\x1c\x36\x77\xa2\x7f\x8e\x8f\x74\x87"
- "\x3f\xd0\x2c\x79\x62\xf9\x9e\x36\x26\xc3\xcc\xa6\xc9\x78\x3e\x5e"
- "\xb3\x47\xd2\xc6\xa3\x9b\xfd\x35\x86\xe8\x86\x71\xec\xae\x4d\x0f"
- "\xfa\x34\x6d\x93\xe7\xd7\x20\x53\x1c\xb7\x69\x36\x76\xfe\x0b\x4a"
- "\x35\xea\x41\xfe\x39\x72\xfc\xd9\x4a\x03\xed\x9d\x4f\x3e\xaf\x70"
- "\xb2\xed\xa7\x73\x1a\x24\xf7\x4c\xc9\xe1\x6d\x24\xc7\xd1\x99\x28"
- "\xda\x37\xa7\x33\xe3\x3b\x20\x07\x53\x1d\x50\xd6\x7e\xed\xec\xf8"
- "\x7a\xa4\x51\x1d\xe8\xdc\x53\xd1\xb3\x62\x4e\x12\x7f\x12\x29\xf6"
- "\x0e\xc2\x9e\xfb\x6a\x72\x3b\xca\x3c\x23\xf6\xbc\xda\x76\xaa\xe5"
- "\x90\x5f\x9f\x8e\x82\x8f\x98\x56\x86\x42\x76\xb2\x99\xc2\x1e\xce"
- "\x2d\xdf\x97\x76\x42\x93\xdb\x15\x71\x5e\x85\xde\x97\xf6\x3b\x1f"
- "\x8d\x0d\xd8\x5a\x8a\x33\x24\x1f\x4d\xd0\xfc\xfe\xe0\x77\x72\xe0"
- "\x0c\x1c\x68\xda\xe6\xd8\x57\xdf\x0e\x2c\x68\x77\xec\x03\x8f\xf2"
- "\x51\x3a\x90\x68\xf7\x65\x75\x19\xe4\x2f\x60\x09\xd3\x2b\xd1\xd3"
- "\x5a\xc9\x17\x04\x9d\xed\x94\xf6\xdd\x1f\xd5\xa8\x7e\x21\xc2\xce"
- "\xb0\x8f\x7e\x15\xdc\x43\xf7\xab\xfa\xdf\x8f\xda\xa5\xfc\xf1\x51"
- "\xbb\xd0\xff\x6e\xda\xe7\xfc\xf7\xe5\x5e\x7d\xf9\x72\xb7\x5e\xda"
- "\x3c\x7e\x84\x67\x9f\x8e\x0c\xda\x3c\x7e\x54\x46\x65\xf5\xce\x2f"
- "\xce\x50\xc7\xee\xdf\x3e\x11\xbc\x5f\x40\x9e\xff\xbb\x45\x7c\xf7"
- "\x85\x11\xa9\x0a\xf1\x7e\xd1\xdb\x84\x7d\x93\xcb\x76\x8e\x30\x24"
- "\x42\xea\x16\x64\x1e\xd5\x9e\xf1\xaa\x96\xee\xf7\xd1\x74\x2f\x69"
- "\xf6\xb7\x1c\x6d\x4f\xa9\x48\xaf\x50\xbc\x2e\x6e\x2f\x05\x36\xda"
- "\xda\x85\x3f\x02\x17\x78\x49\x8a\x75\x6d\xcb\xa4\x33\x83\x7f\xdb"
- "\x43\x7e\x0a\xe4\xdc\xfc\xbb\xc0\x6b\xa5\xe0\x5e\x6e\x27\x79\xca"
- "\x43\xb1\x41\xce\x31\xe4\x8b\x42\xbe\x13\x95\xb9\xad\x64\x1f\xb6"
- "\x97\xe2\x3e\x36\xa9\xdf\xf6\x44\xcd\xa8\xbf\x31\x92\xa5\xe2\x9b"
- "\x18\x9f\xaf\x25\xf5\x1f\x37\xfe\xd6\x7a\x39\xde\x5a\xf2\x7a\x89"
- "\xac\x2f\xf9\x9c\xf4\x2f\xb7\xe3\xfb\x8f\x70\x51\xff\x13\x3e\xbd"
- "\x97\x75\xe9\x07\xf2\xef\xe7\xe7\x30\x5f\xc1\x40\xee\x5f\x8e\xfe"
- "\x6a\x33\x43\x7e\xab\x66\xb5\xd2\x66\x86\xf6\xfd\x8d\x79\xed\xfc"
- "\x9c\xcb\xb7\x97\xf4\xff\xc4\x7b\x03\xb7\xfe\xfe\xa1\xcb\x77\x80"
- "\x91\x1d\x33\xe1\x4d\x23\xfb\xfb\x01\xaa\xd7\xed\xb6\x7c\x76\xdb"
- "\x19\xf1\x3c\x57\xf2\x7d\x7f\xaf\x57\xaf\x65\xe4\x8f\x33\xb4\x4e"
- "\x0f\x2e\xc9\x98\x43\x4e\x5d\x6f\x4b\x9a\x97\x3d\x2f\xdd\xf2\x18"
- "\xb9\x7c\xed\x61\x93\x68\x08\xc6\x05\xab\xdf\x45\x6b\x29\xf1\xde"
- "\x14\x1f\xec\x72\xb1\xc1\xb4\xb8\x60\x98\x73\x71\xa4\xaf\xfe\x36"
- "\x63\x83\x69\xbc\x35\xc5\x05\x0b\xee\xdd\x9c\x98\x1b\x98\x03\xca"
- "\xa1\x0e\xba\x17\xeb\x77\xc1\xdf\x9b\x68\x1e\xc9\xf5\xa5\xbe\x21"
- "\xd4\x67\x8e\xe4\xad\xb6\x60\x2d\xad\x6f\xd7\xce\x76\x62\x2c\x46"
- "\x76\x14\x9c\x08\x0f\x9e\x25\x39\x61\x02\xdd\xa4\xfd\xb1\x89\xf2"
- "\x9e\xb0\x68\x36\x0e\x6a\x0c\x68\x61\x93\xa1\x14\x5e\x13\x23\xf5"
- "\x8a\x27\x6e\xda\xa9\x0c\x34\xc8\x3d\xad\x13\x49\xda\x59\x25\x39"
- "\x37\x0f\xa9\x73\xf3\xc4\xdc\xcb\xd9\xa1\x04\xe7\xc6\x89\xd2\xe0"
- "\xbc\xfe\x4c\x7b\xb7\xf4\x4a\x36\x2c\xaa\x7c\x37\xbc\x85\xfd\xe3"
- "\x4f\xa4\x6b\x94\x67\x93\xff\xb1\x83\xca\x92\x7e\x27\xfe\xb1\x4c"
- "\xfd\x8d\x6f\xfc\x63\x96\xfa\xfb\x5a\xfc\x7e\x48\xfd\x3d\x02\xbf"
- "\xef\x54\x7f\x63\xce\xfe\xe3\x1a\xf5\x77\x0c\x7e\xeb\xd4\xdf\x58"
- "\x3b\x3e\xfe\x4a\xfd\x1d\x8b\xdf\x1f\xaa\xbf\xaf\xc1\xef\xb7\xd4"
- "\xdf\x98\x83\x1f\x0b\x7f\xcb\xa8\xbb\xe1\x14\xfb\x78\x7d\xff\xe5"
- "\xcd\x8f\xad\x72\xcf\xf9\xe3\x62\xac\x21\x89\x72\xed\x09\xa4\xed"
- "\x46\xdf\xf8\x34\xfa\x22\x3d\x99\xbe\x83\xf4\x4a\x37\xab\xdc\x1d"
- "\x92\x9e\xa8\xe6\x6f\x00\xce\xe5\x84\xa4\x8f\x55\xd3\x81\x7f\x47"
- "\xeb\x42\xd2\xe3\x65\xfa\x3f\x22\x31\xd7\x59\x48\xba\xea\x23\xfe"
- "\x1f\x71\x6e\x76\xd0\x1d\x92\x6e\x52\xd3\xc7\x6b\xf6\x37\x6a\x7a"
- "\xb8\x9a\x3e\xd5\xcd\xfe\xec\x08\xa6\x9f\xf0\xaa\xe9\xc0\xff\x13"
- "\xb6\x90\xf4\xc0\x99\x16\x11\x9f\x2d\x97\xe6\xd6\x3f\xc0\x03\xee"
- "\xcf\x0f\xc9\xe3\x56\xdf\x05\xff\xf7\x76\x59\x48\xfa\x71\x35\xdd"
- "\xe9\xd6\x0d\x09\x2d\xb3\xaa\x2f\xac\xd2\x15\xb3\xd4\xbe\x74\xf2"
- "\x24\xbf\x08\x3b\x64\xc1\x53\x37\xf8\xe9\xec\x93\x71\x07\x6f\xb4"
- "\xe4\x71\xde\xc8\x1a\x9a\x54\xbb\x5b\xf2\x2b\xda\x2a\xcf\x91\x35"
- "\x54\xab\x3e\x04\x3c\xe2\x6c\xd9\x72\x91\x26\x7c\x11\xdf\x91\x93"
- "\x2f\xfd\xf3\x6a\xb1\x1e\x48\x37\xa5\xee\xdb\x23\xcf\x32\xd2\xd5"
- "\x53\x39\xa4\xbf\x76\x65\x75\x4a\xdf\xcd\x90\x61\x29\x8d\x74\x34"
- "\x44\x8f\x50\x5d\x94\xc4\xfd\x06\xbf\xd2\x49\xe7\x37\xa5\x1e\x8b"
- "\xe6\x22\xe5\x27\x5b\xb3\xd0\xbc\x6e\xd6\x20\xf4\x6f\x61\xe6\xa8"
- "\x57\x3a\x0a\x1a\x1a\x82\xe7\x66\x1a\xc6\xaa\xe9\xbb\x90\xde\x1e"
- "\x92\x6e\xe9\x1b\xdb\x81\x77\xa6\x09\xce\xae\x0b\xbc\xdd\x77\x81"
- "\x7b\x8b\x3e\x95\x36\xe7\xc0\xba\xeb\xfd\x8e\x09\x75\x74\xae\x84"
- "\x62\x2a\xfa\xb2\xc1\x1a\x2f\x13\xb1\x27\x87\x4c\x6e\xf7\x80\xc7"
- "\xe8\xe0\xeb\x67\x93\xed\xea\x79\x46\xfb\xaa\xf6\x56\x8a\xcf\x65"
- "\xe4\x74\x5e\x79\xe5\x69\x16\x49\xe7\x4e\xc8\x36\x9d\xf6\x3c\x1f"
- "\x49\xf3\xb0\x9a\x34\x3f\xdb\x89\xb2\x77\xcc\xd6\xf8\x8b\x4f\x36"
- "\x07\xcf\xc4\x4e\xa0\x7d\xe8\xeb\xed\x22\x86\xec\x27\x47\xa8\xae"
- "\xc6\x55\x64\x0f\x70\xac\x82\xbf\x2b\x78\x63\x93\x71\x15\xb3\xb8"
- "\xd9\x27\x75\xf8\xcd\xe4\x1f\x9e\x21\xbd\xaf\x36\xc9\xb9\xfc\x69"
- "\xa4\xc4\x9a\x89\x89\x12\x2f\x3e\x8d\xe4\xff\x46\xe7\x2c\x3e\x25"
- "\x1d\x74\x05\xf8\xf0\x8a\xde\xde\x5f\xb9\x83\xe9\xbb\x36\x81\x37"
- "\x39\x53\xa1\x97\xf8\xf4\xa9\x4f\xd1\x1b\x56\x91\x9e\x5c\xc4\x8f"
- "\xdc\x34\xcd\xb7\x3b\xc3\xab\xaf\x59\xde\xc4\x56\x5c\xc3\xcc\xd3"
- "\xbd\x7a\xca\xb3\x72\x58\x16\xf9\x10\xde\x47\x3c\xb4\xfe\x8f\x78"
- "\x7e\x30\xa3\x42\xef\x13\xfc\xca\xa7\x3e\xa1\x5b\x75\x4c\xab\xa3"
- "\x35\xc4\x55\xef\x27\x5e\x3c\x12\xbc\xb8\x13\xf8\x6f\xf0\x2f\x4d"
- "\x8b\xf6\x2d\x4e\x1b\xb2\x23\x93\x45\xfa\x17\xc7\xc7\xbc\x78\x81"
- "\x8d\xd3\xd6\x9f\x1d\xd9\x58\x53\x3a\xcc\x83\x37\x60\x4d\x21\x9d"
- "\xcd\x30\x9d\x49\xec\x21\xd3\x6f\x45\xff\x4e\xeb\xce\xec\xcb\xc7"
- "\xc2\xf5\x2f\x8d\x17\x7e\x15\xa8\x2e\xbd\xb5\x75\xdd\x36\x16\xee"
- "\x57\xcf\x5f\xe6\x7d\xc1\x62\xc1\x3f\xeb\x87\x9d\xe7\xce\x96\x74"
- "\xa6\xa7\xf8\xa1\x79\xf3\x84\x5e\x74\x40\x4d\x9a\x8f\xb9\x72\x3e"
- "\x66\x79\x99\xd4\x47\x9f\x3d\x4a\x7c\x1a\xd9\x22\x23\xbf\xa9\x85"
- "\x7d\x36\xcb\xe8\xc5\x9a\xe1\x05\x4f\xfe\x2c\xc9\xc0\x9f\x2d\x91"
- "\x7e\x1c\x3e\xab\xa0\xf3\x92\xce\xcc\xfb\x29\x6d\xa3\xfd\x0b\x61"
- "\x73\xbe\x57\xce\xad\xcf\xd2\xe9\xde\x4e\xe7\x41\xa3\xa7\xfb\xde"
- "\xe8\xf4\x0e\x90\xba\xb7\xcf\x54\x9f\xd2\xfb\xca\xa5\x6c\xf7\x59"
- "\x9f\xfb\x98\x8a\x63\x12\xc5\x78\x1f\xe5\x2a\x21\xfe\x95\xbb\xc5"
- "\xfe\x3c\x9d\x8d\xcf\xb9\xd7\xc9\x2f\x38\x54\x9f\x3d\xee\x3b\x95"
- "\x8d\x93\xdc\xd2\xaf\x9e\x5b\xc8\x79\x52\x57\x3f\xc9\x23\xf7\x26"
- "\x1e\x62\x52\x57\xff\x90\xe9\x85\x11\x74\x16\xc0\x9d\xd0\x16\xf5"
- "\x10\xc6\x9a\x3b\xbc\x2d\x7a\x76\xaf\xfa\x28\xb9\x1e\x3d\x68\xb2"
- "\x5c\xcf\x62\x68\x8f\x28\xc5\x2f\xfd\x4a\xca\x39\x7c\x72\x2c\xdf"
- "\x28\x9e\x8d\x6a\xb4\xb1\x30\x29\x43\xba\x57\xdd\x51\xc2\x2c\xa8"
- "\xeb\x50\x6e\x9a\xe4\x14\x36\x8b\x8e\x49\x75\xae\x56\x8a\x0b\xe3"
- "\x67\x72\x2f\xef\x64\x22\x8f\x9a\xe4\x54\xf3\x7f\x58\xdb\x8a\x36"
- "\x98\x26\x39\x5c\xde\xd3\x2a\x4f\xe8\xc6\xd8\x9f\xe4\xe0\x8e\x49"
- "\xa5\xf2\x5c\xf5\xc9\xd1\x1a\xae\xca\x31\x7a\x72\xb8\xa4\xdb\x83"
- "\x26\x49\xb7\x93\x89\xea\x7a\x35\x8a\x7e\x63\xed\x4e\x90\xb6\x27"
- "\x27\x23\x35\x1e\xd9\xad\xe6\xa1\x77\xd0\x5e\x8f\xc4\xda\x93\x63"
- "\xd0\x6f\x95\xf2\xb9\x5b\xe8\xd6\xd0\x3e\xac\x59\xee\x34\x6a\x57"
- "\x5f\xd8\x2a\x68\x91\xcb\xc2\x50\xe7\x72\xb2\xd3\x26\x3e\xc5\xd5"
- "\x7e\xaf\xd3\x25\xfa\xa0\xf1\x7d\xb2\xcb\xa7\xef\x90\x5f\x1d\xc2"
- "\x4d\x94\x19\x4e\xe5\x85\xd4\x7f\x8f\x56\x17\xfa\x1e\x3d\x43\x5b"
- "\x1d\x42\xae\x46\x9b\x29\x0f\xf5\xeb\x29\x1b\xe9\xec\xce\x83\x66"
- "\x64\xff\xd6\x58\x4f\x34\x91\x34\x6b\xdc\xab\xca\xf4\x6a\x3f\x34"
- "\xbe\xd6\x9d\x1e\xf2\x5e\x31\x01\x1b\x32\xc9\x0e\xaa\xb1\x5e\xa5"
- "\x9f\x1a\xd3\xa0\x51\x9c\x53\x57\x9f\xdd\x13\xf2\xee\x75\x81\xbc"
- "\xa8\x37\xf1\x46\x64\x53\x40\x7b\x4c\x72\xbc\x36\xa6\x85\xbc\x97"
- "\x96\x72\x96\x78\xe4\x09\x8e\x17\xb6\x8a\x18\x71\x09\x1d\x05\x8d"
- "\xb9\x41\x7a\xcb\x72\x7a\xf9\xc6\xf5\xda\x37\x90\x67\xbc\x56\x4f"
- "\xfc\x56\xd7\xe0\x46\x67\xb0\x4f\x4e\xba\xb5\xf7\x48\x7f\x83\xfb"
- "\x75\x14\x6f\xb1\x0f\x3f\xf4\x3a\x17\x56\xf7\x5a\xdf\xbd\x4e\x31"
- "\x1e\xd9\xe7\xe3\xc8\xc6\x1c\x74\x2d\x97\x63\xe8\xf3\x91\x72\x2d"
- "\xfc\x5c\xf8\x05\xa3\x7d\x42\x19\x97\xe4\xf3\x04\x94\x9b\x24\xbf"
- "\xf7\xb9\xea\xff\xf1\x73\xc8\x7f\xee\xf1\x3d\xe5\xba\xfb\x67\xcd"
- "\xb5\x24\xdf\x29\xce\x96\xde\xb6\xc4\x46\xc7\x46\xe7\x06\x6f\xba"
- "\xf3\xdc\xa6\xa0\x2f\xaf\xcf\x1d\x01\x5f\x5e\x8e\x19\x3e\x49\xff"
- "\xcf\x1b\xf8\x05\xbe\x99\xce\x7d\xf0\x6c\x5e\x5c\x84\x3e\xb4\x9f"
- "\x67\x57\x53\x1c\xd9\x3c\x1b\xff\x92\xfc\xbc\x71\x93\x75\x24\x77"
- "\x58\x2d\x79\xe7\xd9\x40\xb2\x29\x22\xfc\x21\xbd\x17\x8f\x42\xfa"
- "\x46\xab\x25\x78\xde\xec\xcb\xe3\x74\x46\x92\xdb\xad\x14\x07\x7c"
- "\x2c\x8d\x07\xb2\x2f\x3f\xc5\xbe\xdc\x8b\x7c\x63\xf1\x2c\x6b\xbd"
- "\xd0\x25\x58\x73\xfc\xa6\x19\xc7\xed\xa7\x59\x84\x88\x29\x96\xe3"
- "\x65\x96\x67\xe9\x5c\x52\xd3\x3d\x28\x33\x07\xe9\xc3\x44\xba\x17"
- "\xdf\xde\x68\xcd\xc1\xb3\x61\x78\xb6\x0c\x57\x05\x65\xe4\x14\xa1"
- "\xde\x79\xa7\xd9\xf5\xa8\x4b\x33\xbe\x93\x83\x7a\x9e\xb2\x2f\x64"
- "\xb1\xb5\xb6\x66\x92\xef\x50\x9e\x5b\xc6\x4a\xc3\xbb\x78\xaf\x06"
- "\xed\xa2\x33\x49\xd4\xbe\xdc\xf5\xb8\xe6\xf9\xd9\xb0\xbc\x95\x58"
- "\xf7\x56\xe2\xfb\x74\x7e\x13\xe5\x90\xaf\x0d\x59\x17\xb4\x8d\x74"
- "\x68\x28\x77\x65\x2b\x3f\x85\xb2\x9b\x6b\x20\xd9\xb9\x72\xea\x03"
- "\x65\xaa\x3c\x35\xe6\xf7\x97\x7b\xf8\xa6\xd9\x16\xd4\xa9\x98\xec"
- "\xae\x91\x06\x4c\xfe\xb2\x2c\xc8\x0f\x7f\xf9\x9a\xfa\x7b\x50\x20"
- "\xaf\xdd\xca\xf2\x2e\x32\xb3\xb0\x1d\x58\x1a\x06\x3c\xfe\x72\x1c"
- "\xf9\x7b\x0a\x96\xf9\xc5\x9f\xa8\xbc\x75\x28\xcf\x3e\x8f\x0d\x02"
- "\x56\x1b\x50\x47\x8a\xa9\x7a\x52\xd0\x49\xcc\xb1\x2f\xf6\xa2\x2d"
- "\x0e\x6a\x93\x82\xbe\x5b\x8f\xf9\x80\xf6\xe8\xd0\x9e\x41\x2b\xfd"
- "\x81\x33\xa9\xd4\xa6\x28\x92\xe7\xa8\x5d\x6a\x3f\x6e\x46\xbb\x4a"
- "\x56\xa6\xf1\x93\x68\x5b\x73\x4d\x5a\x3d\xc3\xda\x63\xac\xb5\xd5"
- "\xd1\xf9\x87\x93\x92\x6e\xcd\xd4\xaf\x9b\xd1\xce\x92\xa0\xff\xd2"
- "\x2f\xef\x44\xdd\xe3\x51\xaf\x75\x6a\x3b\x29\x6d\x4c\x90\xa7\xff"
- "\xf2\x36\xf5\xf7\xe0\x40\xde\x4b\xda\x79\xaa\x34\xa4\x9d\xf4\xfe"
- "\x47\x54\x9e\xda\xce\xc1\x68\xe7\xa0\x4b\xdb\x89\xf1\x94\xcd\x57"
- "\xab\xed\x5c\xa3\xb6\x53\x8f\x76\x0e\x46\x3b\x47\x84\xb4\x33\xba"
- "\x47\x3b\x8b\xd1\xce\x52\xb4\xb3\x31\xa4\x9d\xa6\x5e\xda\x09\x39"
- "\x00\xdf\xd8\x68\x2d\x95\x7e\xb0\x3e\x4f\x96\xe7\xbc\x4f\x55\x04"
- "\xfc\x4c\x5c\xe0\xe5\x74\x8e\x51\xc9\xe6\x7b\x49\x7f\x43\x7a\x23"
- "\x92\xf5\xe8\x2c\x63\xca\xb2\x35\xf9\x42\x77\x13\x2b\xf5\xd0\x92"
- "\xbf\x3a\xd5\x1e\x38\x77\xb1\x55\xc4\x8a\x90\xe7\x14\xe9\xec\x63"
- "\x26\x13\xba\xc7\x29\xcb\x96\xda\xe9\x7d\x7a\xb7\xa3\xe0\xcb\xb8"
- "\xe0\xf9\xb0\x53\x52\x67\x0e\xfa\xd1\x6f\xf2\xf9\x24\xf5\xf9\x9f"
- "\xa7\x4a\x7d\xfe\x97\x01\xff\x17\xa0\x4b\x25\xd1\x45\x9c\xdb\x24"
- "\xbb\x4a\x3f\x5b\x93\xe2\x5b\xa3\x9d\xbf\x6e\x45\xde\xdc\x90\xf3"
- "\xd7\xad\xa2\x0e\x9d\xc2\xc7\xc1\xd2\x29\xbe\xa5\x5c\x9e\xcb\xfd"
- "\xb2\x34\xf8\xed\x2f\x2c\xea\xb7\x2d\xf4\xdb\x23\x7d\x90\x91\x8e"
- "\xcd\x22\x6d\x65\xbe\xac\xd6\xec\x53\xdc\xac\xc9\x40\x73\xb9\xf7"
- "\xb8\x0a\x5f\xb6\x77\xf7\x79\xd4\x5c\x49\x7e\xdd\x3b\x0a\x9a\x23"
- "\x83\x67\xaa\x9b\xcd\x57\x3a\x53\x6d\xf7\xa0\x9f\x30\xdf\x6c\x22"
- "\x46\x70\x33\x64\xdc\x19\xc7\x65\x6c\x82\xe6\x3f\x51\x3d\x1b\x59"
- "\xf3\x6a\xdc\x1b\xe5\x5e\x4e\xf3\x12\x15\x9b\x13\xa6\xf8\x7d\x46"
- "\x37\xbe\x29\x7c\x28\x05\xef\xd3\xc9\x27\x04\xf2\xbd\x22\x7d\x3a"
- "\x37\xcf\xed\x91\x9f\x9e\xe7\xf7\xb8\x4f\xec\x71\x6f\x69\x07\x66"
- "\xf5\x65\x87\xb3\x7e\x84\xd0\xf1\xd6\x0d\x5b\xc5\x6c\xf6\xaf\x58"
- "\x18\xc6\xe2\x17\x54\xb7\xda\x66\x71\x46\xcf\xc8\x0b\x12\x98\xab"
- "\xd9\x27\xf9\x76\xf0\x4b\x8d\x71\xc8\xf3\x15\x8b\xa5\x33\x22\x14"
- "\xbb\x01\xf9\x5b\x64\xbc\x86\x96\x47\xa6\x2f\x19\xcc\x94\x67\xac"
- "\x43\xb8\x7e\x8e\x99\xec\x00\xf6\x74\xba\x29\xe6\x81\x2e\xef\x25"
- "\x36\x92\x70\x0a\x63\xb8\x89\xeb\xe7\x92\x9f\xb1\xd6\x7f\xef\x6c"
- "\x1e\xe0\xf2\x7d\xcc\x6c\xc0\xcf\x16\xd6\x92\x18\x9e\xcb\xc2\x37"
- "\x9c\x62\x26\x8c\x33\xdf\x61\xdf\x38\xa6\xf9\x34\x28\x89\x96\x67"
- "\xe5\x4b\x30\x26\x17\x9b\xb9\xb7\xa3\xe0\xab\x12\xc8\xb5\xd3\x35"
- "\xfd\xc5\x3a\xe9\xd3\x2c\x1c\xdf\x1f\x24\xfc\x2f\x48\xfe\x00\xb4"
- "\xfd\xea\x84\x3c\x23\x1a\xf3\x43\xbc\x53\x17\x94\x6d\x5a\xa6\x4b"
- "\x1a\xce\x50\xcf\x96\xb7\x4c\x3f\x0c\xaa\xae\x96\xf6\x4c\x31\xc8"
- "\xeb\x0b\xd8\x33\x09\x9d\x60\xcb\x74\xf4\xa1\x57\xca\x3d\x33\xbc"
- "\x29\x7e\x83\x3a\xc7\x29\x7d\x82\x83\xde\xc5\x7b\x46\x19\x57\xae"
- "\x65\x5c\x70\xac\xb5\x90\xae\x55\x87\x36\x61\xfc\x7c\x95\x45\xed"
- "\x22\x9a\xb4\x0b\xff\x65\x5f\xe5\x1c\xde\xd5\x47\xdc\x11\xd3\xc4"
- "\x44\x9f\xd0\x2f\xed\xab\xc0\x78\x3a\x8d\x3e\xb8\x8a\x7c\x38\xb9"
- "\xf0\x9d\x9a\x9d\x9d\xac\xc6\xdc\xc6\x6a\xf1\x9b\xce\x2d\x38\x9f"
- "\xfd\x9c\x35\x59\x7a\x5f\xcb\xc1\x0f\x38\x51\xe7\x3a\x2a\x8b\xb0"
- "\x86\x6c\x3d\xc9\xd7\x5e\x2d\xb8\x36\x57\x13\x13\x65\xd4\x28\xcd"
- "\xac\x26\x87\x64\xd8\x63\x15\xb5\x3b\x3f\x66\xb5\xe6\xbf\x8a\xef"
- "\x10\xbf\xed\xcc\x6c\xbb\x5c\xd9\x6e\x94\xed\x51\xcb\x6e\x45\xd9"
- "\x31\x7d\x97\xbd\xcf\xd4\xcf\xb2\xfb\x51\xef\x7d\xac\x3f\x65\xdb"
- "\x8b\xb9\x1f\x38\x3c\x14\x32\x85\x93\xfc\x90\xd2\xf9\x54\xff\x05"
- "\xf2\xbd\x32\x8a\x4b\xfb\xf9\xd6\xbb\x09\x6f\x84\x6d\xc7\xc6\x69"
- "\xfb\xc5\xd9\x55\xd2\xb3\xab\x67\x56\x5d\xbe\x2f\x18\xe9\xdd\x3b"
- "\x0a\x5a\x2d\x41\x59\x34\xb0\xaf\x0d\x9e\xb8\x75\x82\xb4\x93\x9e"
- "\xb6\x5f\x8e\xad\x7f\x5e\xa4\xb2\x7a\x97\x39\xad\xad\xd2\xde\xbe"
- "\x75\xa5\xa6\xdf\x6a\x8b\xb2\xb6\xaa\x65\x5d\x62\xd7\xa4\x3a\xcc"
- "\xb1\xcc\xcb\xc9\xb2\x2c\xcd\x5c\x90\x35\x4f\x3b\x5c\x3d\x98\x3d"
- "\x36\x6f\xce\xbc\x05\xd9\xf3\xe6\x5a\xa6\x2e\xc9\xcc\xb8\x6d\xd1"
- "\xfc\xf9\x96\x47\xe6\x2d\x5e\x3c\xeb\x99\x79\x83\xd9\xd4\xcc\x59"
- "\x19\x8b\x17\x90\x6e\xd3\x62\x99\x70\x57\x4a\xda\xa2\xac\xdb\x7e"
- "\x3a\x21\xa1\x87\x6e\x93\xce\x5a\x37\x90\x8c\x83\xf5\x29\x16\x3c"
- "\x46\x14\xf9\xdf\x31\x2e\xe3\xce\x15\x90\xaf\x31\x06\x5b\x68\x2d"
- "\xa4\xf5\x87\x64\x2f\xf2\xe3\x4b\xbe\x81\xb7\x6f\xe5\x75\xa7\x18"
- "\xbf\x1b\x7c\x7b\x3d\xd2\xc8\x0f\x6f\x03\xef\xb4\x7b\xa8\x0f\x90"
- "\x1e\x85\x3c\x95\xbf\x46\x9a\x27\x6a\x86\x77\xc3\xa7\x2c\x5c\xf2"
- "\x18\xa7\xc1\x9f\x0f\xe4\xeb\xc8\xa7\xee\xe7\x66\xa6\xfa\xea\xd6"
- "\xbb\xdc\x5e\xb2\xff\x31\x4c\xf1\xd9\x39\x61\xaa\x9c\x5f\xa7\x37"
- "\x4a\xba\x4c\x72\xcb\x73\x08\xca\x59\x92\x11\x5f\x10\x71\xce\x4e"
- "\x03\xff\x3f\x33\x04\xb1\xfa\x82\xc6\x9b\x93\x8e\x7e\x69\x23\xee"
- "\xa5\x4f\x91\xd3\xd5\xdd\x6d\xbb\xbe\xde\xcd\x58\x57\x8c\xfc\xa3"
- "\x77\xba\x2c\xf2\x8f\x7e\x87\xfe\x29\xc7\xe5\x5f\xcf\xf4\xff\xec"
- "\x9f\xf6\xfd\x7f\xf5\xfd\x0e\xc7\xe5\xff\xbe\xc9\xf7\x45\xbb\xbf"
- "\xc3\xf6\xff\x67\xde\xef\x28\xbe\xdc\x1f\x8d\x37\x8c\xad\x86\x5f"
- "\x7f\xca\x0c\x18\x9f\x9b\xd7\xcf\xc6\x98\xfe\x84\x99\x73\x7d\xbc"
- "\xc9\x3e\x83\x8d\xcc\xfb\x0a\x3c\x18\x78\xad\xac\x1c\xde\x94\x77"
- "\x81\xf4\x12\x1d\x0b\x30\x7e\x2b\x8a\x1a\x59\xe4\xfa\x46\xf0\x59"
- "\x59\x32\x3e\x06\xed\x37\xd1\x19\x2d\x17\xee\xab\xb3\xbd\xec\xa8"
- "\xe7\x2c\xd9\x43\x3a\x6b\x53\x81\x3d\x0d\x8c\xd1\xf8\x8d\x4c\x65"
- "\x31\x25\xb1\x7c\x3f\x2f\x78\x31\x86\xeb\x5f\x0c\x47\xda\xf1\x37"
- "\x95\xc4\x01\x6f\x2e\xaf\x1a\x60\x99\x4d\xeb\xbc\xe7\x51\x75\x6c"
- "\x9e\x90\x67\x10\x2f\x08\x9b\x33\xd5\x97\x32\xd6\xa7\x8e\xc7\xe5"
- "\x9a\xde\x71\x93\xaa\xcf\xc3\xef\x0b\xef\xd3\x6f\xb4\xa3\x82\x17"
- "\xcc\x31\x53\x99\x6f\x28\x15\x03\x68\xcd\x7c\x73\x79\xe2\x80\xdc"
- "\x59\x4c\x5f\xeb\x6e\x61\x87\x81\x85\xb4\x17\x8e\x79\xb7\x1b\xf3"
- "\xac\x7c\x47\x2c\x77\xa0\x7e\xeb\xc0\xcf\xad\x41\x9d\xca\x3a\x0a"
- "\x3c\x90\xff\x5a\xca\x55\x5e\xce\x89\x79\xb1\x7b\x3d\xf2\x4c\x59"
- "\xc2\x46\xad\x47\x3e\xf0\x76\x6b\x48\x46\x91\xf5\x6b\x7f\x0b\x34"
- "\xd8\x8b\x6f\xd6\x59\x66\xd2\xfd\x39\xc1\x63\xd0\xb7\xd1\x0e\x4b"
- "\x23\x3b\x27\x64\x7e\xfa\x86\xf6\xdd\x8e\x82\xb3\xc0\xbf\x7f\xa6"
- "\xa9\x7b\x8c\x0e\x59\xce\xd9\x24\x39\x5f\xad\x13\x28\x66\x9f\x7a"
- "\xc6\x6b\xc2\xfa\xe5\x58\xd7\x3b\x99\x01\xdf\xd8\x8c\x6f\x38\x8d"
- "\xab\x18\x37\xd2\xf9\xe0\x06\x1f\xe4\x1a\x45\xb5\xbd\x3d\x77\xa7"
- "\x7c\x57\xf2\x21\x82\xf7\xf0\x83\xbf\x17\xfa\x19\xf0\x1f\x69\xc0"
- "\x09\xf0\x1c\xe2\x6c\x05\xf8\x0d\x4a\xc7\x37\x36\xa3\x5d\x75\x90"
- "\x9b\xf7\x62\xed\xa6\x18\x7f\x86\x99\xe7\x7f\xce\x44\xbc\x72\xf0"
- "\x0b\x8b\x73\xb8\x57\xc6\x2f\x3b\x5b\xad\xf1\x0b\x34\x3e\x88\x47"
- "\x58\x3f\x93\x85\x77\xa1\x8f\x31\x46\xaa\xc0\x7f\x80\xa7\x3f\x67"
- "\x50\xfb\xa6\x4a\xf0\x05\x6a\xdc\x56\x89\xe1\xe7\x86\x63\x7d\x8f"
- "\xc4\x37\xaa\x20\x39\x0a\x5a\x48\x0c\x3a\x17\xa7\xad\xf5\x32\xf6"
- "\xf8\x39\x03\x07\xd6\x81\x6e\x7b\xc7\xa4\xea\x98\x9b\x9d\x4d\x47"
- "\x5f\xec\xa5\xbc\xe4\x3f\x03\xf9\xa7\x82\x1f\x3b\xae\xf6\x49\x03"
- "\x64\x02\xf0\x01\x67\x1b\xa8\x1e\x78\xa7\x1a\xb4\xa6\xbe\x58\xa7"
- "\xe2\xd8\x71\xc9\xc3\xb4\x2f\xd1\x68\x8f\xbe\x5e\x1d\xa4\xff\xb9"
- "\xd2\x50\xfa\x83\x16\xab\xd5\xbe\x1c\x1d\xd2\x77\x90\x4b\xdb\xbc"
- "\xa4\x87\xc6\xf7\xf6\x4b\x1d\xda\xb9\x13\xe4\xe3\x0c\x63\x66\x3f"
- "\x68\xb1\x1f\xf9\x2a\x08\x9b\x5f\xf8\x14\x98\x3b\x9b\x78\xa8\xb6"
- "\x93\x92\x47\x6d\xcb\xa7\x31\x8c\x7b\x11\xbb\xaf\x89\x9d\x75\x53"
- "\x79\xb8\x7f\x14\x57\xf0\xb2\x6d\x0f\xd9\x4b\x28\x9e\xa8\x95\x62"
- "\x81\x0e\x56\xfb\xda\xd1\x51\xd0\x36\x4e\x3b\xbf\x44\x63\x80\xfa"
- "\x1e\x6d\x74\x4b\x3d\x45\xdb\x38\xd2\x35\x8a\xf7\xba\xd2\xa8\x8e"
- "\x0d\x34\x3f\xb5\xe7\x48\x6f\x26\xdf\xb0\x21\xb4\x71\xab\x7d\x52"
- "\x21\x63\xf3\xb5\x9d\x50\xeb\xb6\x17\xf7\x06\xdc\x4b\xbb\xbd\xae"
- "\xb4\xb0\x0d\xf4\x4e\x5e\xf0\x1d\x9a\x3f\x18\xcb\x46\xe4\xf9\x10"
- "\x57\xae\xe5\x25\xff\xf0\xa8\x87\xf5\x45\xe1\xa3\xab\xcd\xd6\xd6"
- "\x15\xaf\xc7\x77\xbd\xf8\xae\x9e\xc6\x06\x8d\x0b\xad\x8c\x0d\x92"
- "\x46\xbb\xd1\x7f\x62\x7c\x1d\xf6\x55\x80\xee\xed\xe0\xff\xff\xe1"
- "\x91\xfc\x5d\x9b\x55\xad\x9f\x53\xc6\x8c\x68\x5d\xb3\x53\xfa\xd3"
- "\xa1\x7c\x89\x01\x79\x27\xc0\x67\xb6\x59\x69\xec\xa1\xac\x6a\x75"
- "\x4c\x18\x91\x2f\x2d\x30\x86\x84\xaf\x82\xb6\x66\xe2\x35\xd5\xfa"
- "\xd3\x9c\x3a\x29\x69\x77\x6e\x0d\x8d\x01\xf0\xf1\x5e\x75\xae\xb9"
- "\x89\x57\x95\xe3\xb0\x7d\xb7\x56\x86\xf4\x77\xd0\x36\x4e\x41\x19"
- "\xda\x58\x09\xc5\x06\xe4\xad\x07\x2e\x04\xc6\x8d\x86\x05\x2a\x4e"
- "\x45\xa9\x7c\x48\x05\xfa\x86\xfc\x92\x3b\x85\xbf\x27\x31\x2e\xcf"
- "\x37\x1d\x6e\xf7\xb1\x5f\xd3\xb8\x9c\x49\x98\x70\xfe\xbe\xb6\xe8"
- "\xd9\x09\xc1\xb1\x7d\x3e\x41\x1b\xdb\x21\xfd\x2a\xc6\xf6\x6a\x81"
- "\x47\xe7\x93\xdd\x2c\x21\x49\x1b\xfb\x34\xcf\x15\xcc\xeb\x0d\xd9"
- "\x62\x7f\xc0\x48\xfa\x40\x31\xef\xbd\xad\x42\xc6\xa0\xfe\xac\xcd"
- "\x69\x12\xbe\xe0\x5f\x50\x98\xa1\xb6\xfd\x0b\xd2\x8f\xb4\xd0\xfc"
- "\xd7\xe6\x38\xf5\x0d\xbe\xe5\x24\x7f\xfd\xab\x81\x81\x34\x07\xdb"
- "\x51\x27\x8a\x51\x4f\xbe\xcf\x2a\xa7\x27\xb2\xc5\xe8\xdb\xc3\xa9"
- "\xd4\x6f\xe7\xeb\xb4\xf3\x12\x1b\x24\x06\x44\xaa\xe3\x45\xd4\xb1"
- "\x07\x5d\x8d\x92\xae\x17\xc2\xbb\xcf\xef\xb6\x5d\x34\xbf\x43\xe9"
- "\x4a\x34\x25\xda\x22\x2f\xda\xff\xcf\x48\x8d\xae\x21\x34\xfd\x8d"
- "\x3a\x1e\x55\x6c\xbd\xd0\x2b\xb6\x6e\x90\xb1\x11\x2a\x5e\xa0\xb6"
- "\x60\x4d\xa1\xef\x8b\xd8\x3f\xaa\xec\x53\xe9\xa1\x31\x75\x61\xb3"
- "\x9b\xcd\x2d\xd3\x70\x0c\xf5\x11\xfe\xe6\xa8\xaf\x34\xec\x20\x5d"
- "\x99\x5a\x77\xa7\xd6\x1f\x54\xef\x50\x4c\xc0\x7a\x23\xce\xf7\x05"
- "\xdb\x7c\xe1\x2c\xde\x8b\x26\x6c\x0b\xf2\x57\x1d\xac\x7b\xdb\x2f"
- "\x34\x53\xdb\x69\x4c\xd8\xb2\x49\x5f\x26\xd7\x32\x37\xf3\x64\x75"
- "\xc7\x2b\xcf\x02\x69\x97\x21\xf9\x31\xc2\x7b\xdb\x4c\x99\x9f\xd6"
- "\x37\xe4\x17\xba\x79\x75\x3d\x24\x5e\x8d\xd2\x52\x55\x1a\x34\x20"
- "\x7f\x25\x9d\xc1\x26\x3f\x3c\x43\x1a\xa4\x2c\x08\x8c\xde\x4f\x31"
- "\x22\x90\xcf\x52\x0b\x39\xc0\x17\xc1\x58\x89\xca\x6f\x12\x4e\xf0"
- "\xa5\xd6\x21\x4b\x9b\xd9\x20\xdb\x4f\xf9\xe7\xa7\x98\xf7\x3a\xcc"
- "\x23\x2f\xf9\x85\x44\xd9\x96\x53\xac\xd3\x8f\xef\xc6\xa8\x57\x33"
- "\xae\x5f\xe0\x7a\x0d\xae\x35\xb8\x5e\x8b\xeb\x9f\x90\x5f\x51\xf3"
- "\x27\xe0\x7e\x07\xd2\xef\x52\xaf\xa8\xa3\x97\xf6\xb3\x93\x7f\x4d"
- "\x7c\xe5\x4c\x91\xfe\x3c\xdd\xe3\x3a\x4b\x6d\x77\xb5\x9c\xdb\xde"
- "\xfb\x50\x4e\x0e\xe5\xa3\x75\x0d\x69\x36\xe4\xb9\x89\xca\x26\x9f"
- "\x08\xa7\xd8\xc5\x13\x21\xfc\x29\xca\xb9\x48\x67\x33\xc6\xe2\xbd"
- "\xf7\x71\xcd\xc2\x75\x3d\x95\x0b\x1a\xd4\x05\xf1\xe2\xac\x7b\x6e"
- "\x8e\xec\x4f\x37\x6b\x9f\x4e\xf3\x5d\xc3\x03\x1a\x4f\xdd\xf2\x4d"
- "\x97\xf9\xa4\xfc\xea\xdd\xaf\xf5\x9d\x4f\x8e\x5b\x9b\x0f\x7d\x87"
- "\xf2\xef\xa3\xf7\x71\x7d\x40\xbd\x26\xaa\xd7\x89\xea\xf5\x67\xea"
- "\x75\x82\x7a\x9d\xe4\x66\xde\x75\x2a\x6f\x02\x9a\x79\xc9\xbe\x8f"
- "\xf6\xa4\xd4\xef\x5e\x74\x92\x7c\x0d\xfc\xbf\xbb\x8d\xe2\xbd\x15"
- "\x5c\x1c\xab\xe9\xad\x49\xf7\xd3\x55\xd0\xfa\xef\xdb\x85\xee\xe7"
- "\x62\x52\x08\x16\x56\x45\xea\x12\x19\x78\xa7\x88\x12\x3d\x57\x63"
- "\x0d\x5e\xdc\xa5\x57\xf7\xeb\x29\xee\x09\xc5\xb1\x23\x7f\x7c\x42"
- "\x8e\x8a\x3a\x16\x4f\xf3\x55\xe8\xf4\x37\x92\x7f\xa1\x19\xd5\xf8"
- "\xab\x87\x4c\x11\xc0\x7b\x92\x97\x54\xbf\x9b\x95\xf8\x56\x45\x50"
- "\xce\xbf\x98\x26\xf7\x36\xaf\x4e\x44\x7a\x88\xfc\x7f\x31\x8e\xea"
- "\x0c\x5a\xd7\xa3\x3d\x63\x1b\xd9\x45\xa2\xcd\x0f\x9a\x64\x9b\x13"
- "\xb4\x36\xab\x7d\x65\xd3\x68\xde\xc4\xbc\x9b\x81\x87\x99\x34\xbe"
- "\x1b\x03\xb8\xec\xdd\x4c\x57\x75\xfc\xa0\x9f\xbd\x13\xa9\xbf\x43"
- "\xf0\xa4\x3e\x88\xd3\x9d\x53\xbb\xf7\xcb\xb9\xa9\x3e\xc9\x2f\xd4"
- "\x63\x5e\xd2\x18\x18\xd9\x63\x5e\x52\xcc\xfa\x68\xf5\x5d\x47\x77"
- "\x8c\xbf\xd0\x4c\x18\xaf\xd6\x11\xe3\xb6\xc3\x47\x7d\xe3\x66\x9d"
- "\x36\x75\x4d\xaa\xc7\x1a\x79\x37\xd2\x9b\x64\x3d\x65\xba\xfa\x2d"
- "\x8c\xbf\x0e\xf2\x87\x7a\xad\x96\xae\x8e\x6f\x2a\xe7\x38\xf5\xb5"
- "\x96\xae\x96\x8f\x71\xda\x51\x4d\xf3\x47\x4b\x97\x63\xf2\x7c\x1c"
- "\xe1\x0d\xbd\xeb\x13\xb6\x8c\x90\xbf\x67\x56\xa2\xde\x5d\xc9\xe0"
- "\x2f\x4a\x69\x3e\xbf\xb0\x9c\x45\x2e\x2d\x66\x43\xe5\xdc\xec\x7a"
- "\x5e\x7b\x57\xea\xf4\xbb\xe6\x6a\x18\xb5\x41\xe0\xd9\xf9\xfa\xee"
- "\x58\xa9\xe8\x78\x81\xd1\xe7\x33\xcd\xa8\xac\xf1\x8d\x15\x98\x8b"
- "\x79\x5f\x82\xf7\x4a\xdc\x6c\x93\x53\x5d\x4b\xaa\xe5\x9e\x4a\xd7"
- "\x87\x35\xa5\x12\xbb\xd4\xb2\x03\xf8\x17\xc2\x87\x08\xac\xa7\x6f"
- "\x51\x59\x58\x57\x4c\xed\x76\xeb\x10\x89\xdf\x5d\x1e\x37\x1b\x12"
- "\xa7\x61\x2b\xad\x4f\x46\x1d\xb3\x15\xcd\x94\xeb\x93\x42\x3a\x30"
- "\x5b\xbb\xf0\xa7\x56\x6b\x6b\x65\xb4\x6e\x92\x9f\xeb\x94\x65\x83"
- "\xc9\xdf\x94\xf5\x14\xf3\x7f\x01\xfe\x6c\x97\xba\x37\x03\x39\xd7"
- "\xbf\x85\x64\x59\x95\xae\x98\x4f\xfe\x65\x6a\xbf\x34\xa0\x3e\xbb"
- "\x08\xdb\x5f\xc8\x96\xb1\x83\x48\x1f\x24\x62\x4d\x11\xcf\x6a\xe6"
- "\x5e\xe9\xb3\xdf\x97\x1f\xa2\xe3\x2a\x95\xf3\xa4\x6b\x9e\x88\xc5"
- "\xe0\x98\x51\x29\xf5\x89\xfe\xa1\x32\xdd\xe7\x91\x76\x08\xc2\x9f"
- "\x26\xdd\x37\x84\x99\x63\x5f\x95\x7a\xe1\xd6\x83\x92\x1f\xf1\x85"
- "\xc6\x7f\x16\xb4\x96\xfe\x7c\x7d\xcd\xc1\x79\xe1\xdb\x4f\xef\xe0"
- "\xdd\xb7\x3a\x0a\xfc\x4c\x4b\x97\x6b\xcd\xd9\xe3\xaa\xce\xac\x6a"
- "\xc8\xaa\x44\x06\x6c\x8e\xd8\x5e\xa0\xcd\x5f\x7f\xaa\xfc\xbe\x9c"
- "\xbf\xd4\x46\x1a\x0f\x34\x87\x7d\xc2\x27\xd8\xb1\x78\x9a\xcb\xf8"
- "\x5d\xed\xd3\xe6\xae\xe4\xef\xea\xc5\xdc\x15\xf3\xd6\x6f\x0b\xd6"
- "\xc3\x1f\xaf\x8e\xd5\x86\xb6\x39\xe6\x48\x3c\x5b\x87\xb5\x55\xdd"
- "\xcb\xf2\x49\x19\x63\xe3\x83\x26\xe5\x02\xf7\x92\x6e\x9a\xf4\x09"
- "\xa4\xb3\x51\xed\x55\x69\xaf\xa4\x9d\xfc\x9c\x39\x30\x1f\x82\xbe"
- "\xcd\x4c\x4c\xf3\x6d\x86\xf2\x1a\x82\xba\x63\x9f\xe6\x1b\xb4\x12"
- "\xdf\x2b\x71\xe6\xbd\x4b\xf4\xbb\x4d\xce\x31\xdf\x18\x1a\xc7\x2e"
- "\x8c\x3d\xac\x3f\xc5\x14\x8b\xbe\xa3\x40\x31\x6b\x63\x0f\x73\x74"
- "\x2e\xc6\xe8\x6b\x9b\x63\x79\x31\xfa\x94\x6c\xee\xd3\x71\xbf\x05"
- "\xd7\xb9\xf2\xaa\x33\xd1\x55\x1d\xf3\xc5\x78\x17\xf3\x7f\x70\x95"
- "\xd6\x07\xed\x51\xfb\x12\xc4\x18\xcb\x23\xfb\xc6\x04\xb1\xd7\x4f"
- "\x63\x8c\xc6\x97\xd8\xf3\xc7\x58\x33\xae\xfa\x39\xa3\x71\x26\xfc"
- "\x9d\xe4\x50\x9f\xf8\xc6\xd3\x38\x43\x59\xa5\x9a\x6f\x5f\x37\x53"
- "\xd4\xfd\x36\x65\xaf\x66\x07\x4e\xe3\x30\x6b\x34\x1b\x8e\xf2\x2d"
- "\x95\x96\x76\xd2\x9d\x7f\xe6\xf2\x4d\x64\x94\x97\x68\x27\xf1\xf2"
- "\xea\x17\xf1\x4e\x48\xff\x9f\x13\xb6\xac\x87\xa7\x0b\x7d\xe6\x55"
- "\x1d\x05\x3c\xbc\x3b\xe6\x9c\x76\x08\xbe\x12\xeb\xf3\x8d\x31\xcc"
- "\x82\x71\x8b\xb5\x86\xc7\x6b\xfc\xf0\x1d\x31\x64\x6f\x71\x9a\xea"
- "\x47\x32\x38\xf0\xf6\x74\x3c\xad\xd3\x7d\xe8\x9d\xc7\x92\xae\x88"
- "\x30\x83\x74\x4f\xa4\x07\x03\xad\x8f\x9f\xd2\xe9\x5f\xab\x81\x24"
- "\xcf\x17\x5d\xea\xdf\x39\x2f\x87\x9f\x27\x5f\x58\x96\x4c\x76\x55"
- "\xa3\x4e\x4f\x67\x35\xeb\xed\x67\x49\xc7\xc3\xcb\xbb\xe9\x78\x82"
- "\x1e\x95\x62\xf0\x97\x13\xfc\xd3\x19\xd4\xdf\xab\x2f\xff\xa7\xb3"
- "\xc8\xbc\xba\x31\xf8\x1b\xa7\xd2\xea\xaf\x1d\x85\x2c\x46\xa3\x15"
- "\x61\x0a\x61\x2c\xd9\xd9\xd0\x3c\xd7\xf9\x18\xf9\x3a\x42\x3f\xa1"
- "\xde\x2f\x7c\xef\x31\xe7\x72\xc8\xb4\x3a\x36\x51\xc8\x1c\xfa\x7e"
- "\x9e\xc9\xd6\x31\xd1\x9f\xc2\x8f\xaa\x8e\x19\xf0\xed\xcf\x37\x9c"
- "\x61\xe1\xb6\x4c\x76\x1d\xe9\xd0\x8d\x7e\xee\x24\x19\x98\xc6\x04"
- "\x68\x50\xd7\xa2\xd3\x0d\xca\x5a\xc9\xf4\x78\x3e\xaa\x45\xc7\xbc"
- "\x1a\x2f\x85\x77\x4c\x61\x5e\x16\x43\x3c\xd4\x03\x2b\xd9\x28\xd4"
- "\xff\xb8\xd6\x57\xc4\x67\x90\x1e\x2f\x10\xd7\x49\xc7\x84\x2d\x00"
- "\xf9\xac\x77\x13\xdd\x34\xac\x3a\xc3\x22\x71\xef\x0c\x6b\x67\x26"
- "\xb1\x0e\x15\xea\x30\xfe\x5b\xeb\xc5\x78\xd1\xb1\x06\x8c\xfd\xe3"
- "\xc1\x7a\x9a\x87\x87\xfc\x7e\x9c\xde\x37\xb6\x13\x0f\xd7\x17\x7d"
- "\x74\xf3\x34\xfa\xd0\xb9\x03\x23\xf8\x7f\xd1\xdf\x3e\xde\x8a\xba"
- "\x55\xdb\x96\x33\x43\x8b\x4e\xff\x38\xda\x48\xe7\x7a\xab\x84\x8e"
- "\x5f\xa7\x7f\x48\x93\xd3\x65\xbd\xf5\xc3\x8d\xab\xc2\x18\xe9\xe6"
- "\xc9\xdf\xa3\xb0\xc5\xfc\xda\x2c\xf4\xf1\x2e\x4c\x6d\x67\xde\x4f"
- "\xe8\x3b\x27\xd5\xb5\xac\xa1\xcd\x6e\x66\x87\xcd\xe3\x19\xda\xe1"
- "\xc6\x5c\x59\xd7\x6f\x9b\x57\x9d\xce\xad\xd2\xb7\x5a\xd8\x8a\xe8"
- "\x74\xbf\xa7\xb5\x84\x74\x03\x58\x47\x2a\x69\xbd\xee\x28\xd4\x8f"
- "\xd7\xe6\x0d\xd6\x89\x4a\xbc\x13\xf0\x6b\x80\xdf\xbb\xc9\xe7\x8c"
- "\x90\x1f\x64\xfe\x48\xb1\x6f\x50\xa8\xb7\x05\xf8\x6d\xe4\xa3\xf7"
- "\x84\x0d\xa1\x4e\xb7\x3a\xc5\xaf\x03\x4d\x75\xab\xa9\x6d\x72\x2c"
- "\x9a\x9f\x46\xfe\xd2\xc0\xbc\x45\x3f\x88\x79\xdb\x1a\x32\x2f\x0b"
- "\xf5\xce\xa0\x9c\xca\xe9\x6c\xb1\xa5\xb7\x79\x68\x1b\x86\xb5\x4a"
- "\x17\x76\xe7\x86\x0d\xbc\xd4\xa1\x57\xee\x7f\xa1\x88\x45\xea\xd6"
- "\x81\x6c\x34\xcf\xb2\x53\x87\x9f\xd2\x85\xdd\x67\x8c\xbc\x3a\xf9"
- "\x81\xac\x81\x3c\xcf\xcc\xf4\xeb\xcf\x0d\x34\x8c\xf6\x5e\x5d\xca"
- "\xc3\xbe\xf7\xd8\x23\x59\xb4\xf7\xed\x60\x5f\xa6\xb3\xb0\x07\xfc"
- "\xf8\x76\x24\xb3\xb9\x75\x03\x92\xe8\x8c\xfa\xe1\x48\xf0\x22\xf8"
- "\x4d\x65\xe6\x96\x30\x43\x6e\x13\x6f\x5e\x37\x7f\x80\x01\xeb\xaf"
- "\x09\xeb\xc6\x9a\x21\x91\x57\x97\x76\xa1\x8c\x77\x52\xc5\x7b\xbd"
- "\xfa\x62\x50\xeb\x56\xd3\x7b\xdd\x6c\xb1\xa8\xdb\x27\xfd\xab\x5b"
- "\xc4\xba\x60\xdd\x22\xd6\xfd\xe7\xeb\x16\xbe\x20\xa4\x6e\xa6\x60"
- "\xdd\xd2\x50\xb7\xf0\x65\xfd\xab\xdb\xc0\xea\x60\xdd\x06\x56\x7f"
- "\xc3\xba\xed\xee\xbb\x6e\x03\x06\xf4\x5e\xb7\x9c\xab\x4f\xe9\x06"
- "\x0c\xef\x5f\xdd\x06\x45\x06\xeb\x36\x28\xf2\x3f\x53\xb7\xbc\x12"
- "\xfe\x45\x2d\xb8\x5c\xd2\xe7\x10\xce\x9f\xd2\x45\x5c\xb3\x72\xa4"
- "\xb0\xe3\x8e\x46\xbd\x6a\xec\x25\xfc\x73\xc1\xdb\xe8\x06\x08\xdd"
- "\x7f\x47\xe1\x80\x35\x18\xbf\xd2\xae\x44\x17\x91\x43\x69\x4a\xd8"
- "\x88\x32\x5e\xc0\x7d\xb7\xb7\x93\xcd\xa0\x8f\xfc\xb2\xe8\xf9\xa6"
- "\x99\xec\xcd\x0b\x5e\x3d\x8f\x9e\x69\x7a\xf9\x5c\x38\x7e\x7b\xf4"
- "\x78\xb7\x52\xf3\xc5\xaa\xbd\x6b\x2c\xbe\x1c\x1e\x0d\xb8\xf8\x40"
- "\x1a\x33\x12\x1e\xd1\x95\xe2\x46\x6e\xc8\x1b\x68\x78\xe0\x2c\xd6"
- "\xfd\xc2\x08\x93\x76\xd6\x56\x2b\x6b\x4a\xf3\x40\x6e\xcc\x65\x61"
- "\x74\xde\x57\xf8\x6d\x34\x7b\x58\x5c\x2e\x1b\x30\x25\x07\xe5\x7b"
- "\x59\xaa\x31\x07\x65\x83\x1e\x82\x97\xd7\x45\x3c\x1e\x96\xce\x22"
- "\x37\xa3\x6c\xba\x3e\x60\xb6\xf3\x17\x5e\x62\xe1\x74\x2e\x98\xce"
- "\xf7\xca\xb3\xbd\x11\x06\x7c\x27\x47\xfb\xce\x15\xe8\x37\x4c\xd2"
- "\x6f\xe0\x93\x41\xfa\x0d\x1c\x1a\xa4\x5f\xc4\x87\x92\x7e\x11\x55"
- "\x41\xfa\x0d\xac\xe8\x1f\xfd\x06\x86\x07\xe9\x27\xdf\xbd\x3c\xfd"
- "\x06\xfe\xb8\x6f\xfa\x0d\x4c\x0e\xd2\x4f\x96\xd5\x07\xfd\x22\x7a"
- "\xa7\xdf\xc0\x2d\xdf\x8c\x7e\x03\x2b\xbe\x21\xfd\x86\x4a\xfa\x19"
- "\x5e\x0a\xd2\xcf\xf0\x48\x90\x7e\x86\x28\x49\x3f\x83\x21\x48\x3f"
- "\x83\xb7\x7f\xf4\x33\x4c\x08\xd2\x4f\xbe\x7b\x79\xfa\x19\x96\xf5"
- "\x4d\x3f\x83\x23\x48\x3f\x59\x56\xff\xe8\x67\xf8\x08\x74\x33\xa9"
- "\xf4\x33\xf5\x4d\x3f\x83\xf7\x1b\xd2\xcf\x28\xe9\x37\xe8\x44\x90"
- "\x7e\x83\xd6\x07\xe9\x37\xe8\x51\x49\xbf\x41\x93\x82\xf4\x1b\x3c"
- "\xae\x7f\xf4\x1b\xb4\x3a\x48\x3f\xf9\xee\xe5\xe9\x37\xe8\xad\xbe"
- "\xe9\x37\xa8\x2e\x48\x3f\x59\x56\x1f\xf4\x1b\xd8\x3b\xfd\x06\x0f"
- "\xff\x66\xf4\x1b\x3c\xee\x72\xf4\xeb\x1f\xaf\x31\x58\xc8\x3a\xdf"
- "\x42\x39\x9b\xfb\x2a\x87\x68\x48\xf6\x89\x4a\xe1\xe0\xcd\x3b\x95"
- "\x08\x83\x3c\xc3\x31\x38\x09\x32\xcc\xbd\x8d\xba\xc1\x27\x77\x2a"
- "\x03\x0c\xbc\xe0\x2f\x15\x4a\xc1\xfb\xa9\x7c\x55\x44\xb8\xb2\x6a"
- "\x60\x38\xf9\x22\xe8\x33\x0e\xb5\x6e\xc8\x7d\x61\xd7\xb0\xeb\xe9"
- "\xbc\xde\x0b\xe0\xd7\xe8\x77\x47\xe1\x90\x24\xf0\x22\xf5\x3d\x69"
- "\x32\x77\xc1\x62\x11\xd4\x32\x73\xde\xdc\x25\x19\x73\x67\x65\x64"
- "\x59\x66\xcd\x79\x6e\x71\x77\x5f\xf1\x22\x1e\xe4\x6a\xea\xbf\x21"
- "\x01\xff\x67\x14\xd3\x91\xfc\xec\xd9\x6e\x60\x83\x5a\x74\x43\xea"
- "\x84\xff\xfe\xe8\x99\xb9\xbc\xcb\xba\x2d\xf1\x46\x7e\x48\xf8\x0f"
- "\xec\x4a\xdb\xc6\x1d\xd6\x38\xf2\x09\xa3\xee\x4d\xc4\x9d\xd2\x0d"
- "\xfd\x8a\x47\xcd\xae\x23\x9b\x0e\x71\xb6\x43\x17\x69\x11\xbc\x5c"
- "\x01\xaf\xe2\x26\x6b\xae\xe2\x98\x5d\xc7\x37\xce\xae\x22\x1a\xd4"
- "\x92\xef\xb6\xec\xb0\x51\x8d\x3a\xe3\x6e\x1e\x65\xcd\x45\x59\xf9"
- "\x6a\x39\x22\x1e\x47\xe2\x72\xfe\x19\x95\xa7\xf2\x82\x14\x9f\xc3"
- "\x29\xf9\xc1\xc8\x79\xc6\x55\x96\x30\xca\x4b\x3e\x14\xc9\xb7\xa0"
- "\x16\x93\x89\xea\x4d\x79\xc1\x8f\xdf\x8b\xf7\xef\xa5\x98\x94\x81"
- "\x32\x64\x9d\xae\x42\x9d\x4a\x44\x5b\x1c\xd6\xf8\xb6\x15\xd6\x6d"
- "\x22\x2e\xa2\xa0\xab\x71\x23\xbe\x1d\x2f\xe2\x59\xfa\xbe\x16\xf1"
- "\x2c\xd5\x77\xae\xc3\x3b\x02\x4f\xc9\x6f\xaa\x2c\xc3\xb8\x4c\xab"
- "\x17\x78\xe8\xc1\xb8\x9f\x15\xf2\x8d\x21\xb8\x7f\x28\xe4\x79\x24"
- "\xee\x6f\x03\x1f\x1a\xa5\x3e\x1f\x8a\xfb\x28\xe2\x4b\x45\xbb\x8a"
- "\xf2\xa5\x4d\xb4\x6e\x18\xd9\xc6\x98\xd4\x3c\x51\x2d\xba\x61\x27"
- "\x88\xd7\x55\xcb\x88\xc6\xfd\x01\x92\x19\xd5\xe7\x31\xb8\xff\x0d"
- "\xed\x0b\xa8\xcf\x87\xe3\xfe\x97\xb8\xbf\x45\x7d\x0e\xbe\x7e\xe8"
- "\x7e\x51\x67\x93\x35\x8b\xda\x04\xda\x97\x13\xdd\x41\xeb\x2c\xa4"
- "\xc5\x41\x5e\xb5\x53\x3f\x52\x3b\x9d\xcb\x5b\x58\xa3\x6e\xe8\xef"
- "\xe9\x5c\x9e\xec\xab\xd9\x75\xd2\xb7\x8f\xde\x8a\xf4\x72\x4a\x27"
- "\xdb\x72\x65\xe3\x6c\xf1\x1b\x75\x7d\x88\x68\xa8\x7e\x0b\x32\xd1"
- "\xd0\x7a\xb5\x9f\x41\x3b\xf2\xbf\xcb\xf2\x5f\x56\xfb\x02\x75\x1b"
- "\x88\xba\xdd\xad\xee\x7b\x34\x4f\xf1\x75\xc9\xf3\x45\xba\x61\xec"
- "\x5f\xf2\x37\x81\xf7\x24\xee\x0d\x4b\xd4\x62\xf5\xb9\x75\x43\x85"
- "\xaf\x08\x1a\x9f\xa4\x5f\xf1\x44\x59\x4d\xc2\xbf\x0a\xc6\xa8\x36"
- "\x56\x68\x9c\xf0\x88\x21\x56\xa1\xab\x29\x1c\x16\x38\xff\x8b\x77"
- "\x2b\xd4\xf8\x06\x4c\xca\x09\xc3\x8a\x03\xf6\x45\xba\xa1\x02\x1f"
- "\x42\x9e\xed\x0d\x79\x36\x5e\x7b\x26\x6c\xe0\x0a\x87\xd5\x85\x3c"
- "\x1b\xd3\xe3\x59\x6b\xc8\xb3\x91\xdd\xcb\x34\x1a\x42\x9e\x45\x76"
- "\x7f\xcf\x18\x17\x7c\x16\xe9\xed\xf1\x2c\x31\xe4\x59\xb3\xfa\x2c"
- "\x0c\xe9\xd6\x80\x7f\x43\x5d\x64\xbd\x9a\x0e\xac\x37\xda\x42\xd2"
- "\xab\xd4\x74\xfa\x3e\xf8\xbf\x7d\x15\x6a\xba\x18\xe7\x18\x47\x37"
- "\xab\xdf\xd8\x15\xf2\x8d\x62\xd9\x87\x56\x19\x5f\x43\x17\x49\x71"
- "\x77\x06\xd2\x98\x32\xae\xca\xa7\x58\x39\x0e\xe9\xcb\x4b\xce\x43"
- "\x11\x6f\x99\x62\xc2\x22\x5f\x5f\xd8\xd8\xab\x8d\x60\xa1\xc9\xac"
- "\x9d\x63\xf5\x3b\xac\x31\x8a\x63\x1f\xc5\x90\x1b\x45\x3e\xbf\xec"
- "\xad\xe4\xf7\x45\x8b\xbd\xd7\xc9\x5c\x59\x1d\xf9\xe4\x29\x41\xf5"
- "\x13\x33\x8c\x7c\x96\xd5\x0a\xfd\xce\x69\x19\x7f\x8f\xce\xf7\x6e"
- "\xb4\xc6\x2c\x6d\x65\x23\x6d\x3f\xe5\x4d\x24\xe7\x49\x4c\x30\xad"
- "\xc3\x3b\x46\xd5\x97\xc3\x4b\xe2\xbc\xb9\xce\x54\x45\x69\xae\x56"
- "\xa1\x67\x36\x9c\xd2\x45\x99\xc5\x73\x6e\x7d\x49\xb6\x37\xca\x2c"
- "\x64\x69\xf5\x5c\x21\xea\xe9\x0c\xc4\x87\xd4\x45\x8d\x3c\x1f\xb5"
- "\xa5\x1e\x69\xc7\xbb\xd9\x37\xea\x4c\xa7\xa9\x4c\x6a\x87\x5b\x67"
- "\x72\x50\xd9\xc8\xe3\x0d\xd8\x37\x22\x7d\xa9\x8f\x8d\x40\xdd\x4e"
- "\x69\xe5\x77\x14\x46\x99\xdd\x3a\xa3\x90\x2b\xa9\xcc\xf3\x1b\xdf"
- "\x46\xb9\x51\x63\xdc\xe1\xb7\xc8\x58\x8c\x85\x51\xe3\xdc\xec\xbd"
- "\xc8\xbe\xd6\x3f\xa1\x93\x34\xcd\xa6\xb8\xaf\x1e\xcc\x79\xb7\x3c"
- "\xf3\x3f\xbb\x59\xca\xf2\x51\xbf\x24\xfb\x0b\x8a\x55\x4d\xfb\x8e"
- "\x12\x77\xa2\x84\x3d\x04\xa5\x81\x36\x65\xc0\x67\x71\xe6\xa0\x7f"
- "\x73\x32\x4a\xac\x7f\x1b\xce\x31\x43\x91\x6a\xf3\x8a\x7a\xba\x43"
- "\xe2\x34\x48\xfb\x7f\x5d\xf4\xa0\xda\x1c\xb1\xf7\x24\xea\xd8\xb3"
- "\x0e\x54\x5f\x94\xb5\xba\xcf\xb5\xd4\x34\xdb\x2d\xf4\xa0\x9b\x66"
- "\x5a\x84\x2d\x99\x2e\xfa\xd1\x30\xf3\xb5\x15\x1d\x85\xd1\x49\x81"
- "\xf8\x14\xc8\x53\x44\x36\xc1\x28\x3f\xd0\xce\x4c\xfa\x46\xb4\xd8"
- "\x47\x73\xeb\xa2\xd7\x00\xc7\xdc\x54\x07\x35\x7d\x4d\xad\xcf\x4b"
- "\x67\xeb\x7b\xf5\x9f\x45\x6b\xa4\xf0\xbd\xb4\x69\xb6\x9b\xce\x4f"
- "\xdc\xe1\xd5\xea\x7c\xd5\x1a\xb2\xdb\xa7\x3a\x4b\xda\x5e\xb5\x52"
- "\xa3\xe3\xfa\x73\x28\x3b\xef\x63\xd6\xa4\xbb\x6a\x00\xd9\xb7\xd0"
- "\x39\x94\x0d\xcb\x55\x9b\x2b\xa4\x89\x7c\x9d\x5a\x9e\x68\xa1\xef"
- "\x20\x7b\x5f\xc2\xd3\x9d\xe4\x77\x00\x65\x16\xa1\x2f\x84\x4f\x11"
- "\xdd\x55\x8f\x08\xfd\x66\x26\x93\xed\x26\x7b\x36\xdd\x55\xbb\xe5"
- "\x58\xb9\x6a\x82\x5b\x77\x95\x3a\x77\x65\x1a\xc5\x3a\x27\x3b\x84"
- "\x33\xba\xab\x6e\xa2\x98\xa9\xa0\x87\x87\xfc\xce\xd5\xb6\x63\xbe"
- "\xe4\x74\xd2\x58\xf0\x50\x6c\x3c\xe4\x8f\x93\xeb\x03\xd1\xfc\x2a"
- "\x03\x7d\x9f\x68\x4b\xf1\x62\x41\xd3\xf7\x50\x76\x40\xff\x41\xb1"
- "\x69\x41\xb7\xfd\x7d\xf5\x0b\xd1\xc8\x8f\x3a\x93\x17\x0f\xe7\x88"
- "\x8f\x51\xbf\x98\x05\x4a\xf4\x6c\x37\xd9\x4f\xe2\xb7\xea\xeb\x54"
- "\xf6\x9d\x9c\x4b\x31\xf7\xe1\x1b\x67\x69\xaf\x91\x6c\xc6\x45\xbc"
- "\x6e\xdd\x55\xcd\x2a\xfd\x44\xbc\x0a\x47\xb6\xa4\x83\x9a\xbf\x44"
- "\xea\x65\xae\xed\xe8\x28\x8c\x19\x17\xd4\xcb\xc4\x08\x9f\xc5\x9a"
- "\x8d\x35\x9e\x4d\x0d\xa9\x73\xbb\x38\x07\x78\x8e\x64\xea\xab\x7c"
- "\xf4\xad\xf5\xe4\x17\x8c\xc6\x45\x4b\xe8\xf8\xbf\xea\x13\xaa\x27"
- "\xd9\xe6\xf9\xa3\x66\x5a\xf8\xc6\x99\x71\x44\x67\x94\x1d\x83\xb9"
- "\xe0\xee\x23\x1e\xba\x88\xc7\x84\xef\x55\x86\xc4\x98\xc5\x3a\x18"
- "\x73\x5e\x5b\xe7\x68\x8d\x26\x3f\x0f\x81\xb4\x8d\xc7\xc8\xee\xdc"
- "\xaa\xf2\x38\xd6\x3e\x7d\x14\xde\xce\x12\xe8\xac\x31\xd9\x69\xd3"
- "\x78\xe3\xa6\x63\xe3\xc8\xef\x31\xf9\x70\x74\x2e\xff\x01\xea\x3b"
- "\xfc\x95\x17\x63\xb9\x8c\x4f\x7c\xfb\x39\xb2\xd1\x69\x3d\x95\x2b"
- "\x7c\x13\x19\xa6\xe4\xf8\xf8\xcb\x32\xc6\xb4\x87\x47\x1d\x1b\x47"
- "\xcf\x84\xdf\x7f\x2a\xf3\x5f\xf5\xe1\xab\x1b\x6e\x53\x79\x99\x56"
- "\xe0\xe4\xd5\x2d\xba\xe1\xe2\x3c\x23\x7e\xc7\xb6\xe8\x62\x6b\x64"
- "\x5c\x44\xe9\x87\x5e\xb5\x35\x8c\x90\xe7\xf3\x3d\x4c\x9c\x97\xd6"
- "\xc5\xde\x67\xf9\x1e\x63\xad\xba\xd8\x89\xc2\x27\xb4\xc3\x9a\xa6"
- "\xd2\x20\x6d\x83\xac\x97\x31\x25\x47\x2f\xea\x48\xf5\xeb\x5f\xdd"
- "\x62\xb5\xf5\x32\xa2\xa3\x30\x36\x59\x3b\xd7\x2f\xda\xaf\xfa\x8a"
- "\x76\xde\x40\x72\x4b\xec\x01\x75\xed\x4a\x57\xbf\x9d\xfe\x2d\x7c"
- "\x7b\x8d\x5a\x66\xa2\xf0\x97\x0d\xba\xa0\xdc\x44\xd4\xa3\x5e\x5b"
- "\x4f\x55\x1b\xf9\x31\x72\x9d\x8f\xf5\x04\xd7\x52\x49\xc3\x6e\x67"
- "\x76\x16\x2d\xca\xb2\x80\x61\xb7\xcd\xca\x9a\x93\x66\x99\x97\x99"
- "\xb9\x28\xd3\x42\xce\x6d\x42\xe7\x98\xb0\x81\x29\xbc\x3a\x5c\x8d"
- "\x71\x56\x16\x88\x71\x56\x78\x75\x52\x68\xec\x39\xb7\xee\xea\xe4"
- "\x6f\x47\xae\xb9\xba\xcf\x73\x7e\x0e\xbd\x52\x8e\xbf\x0a\xfc\x39"
- "\xf1\x57\x45\x72\x4e\x8a\x97\x25\x62\x7d\x14\xe7\xd3\x82\xe7\xd5"
- "\xaf\x8e\xa3\x7d\xf0\x46\xdd\xd5\xef\xef\x54\xc2\x99\xf0\x6b\x52"
- "\xa0\x90\x2d\x09\xf9\x36\xaf\xc0\x9f\x13\x7f\x55\xf8\x13\xef\x29"
- "\xef\x8a\xb3\xb6\xe5\xa1\xcf\x68\x6f\x9a\x17\xec\x6a\xa5\x3c\x7c"
- "\x55\xb8\xe0\xff\x94\x4d\x32\x5f\x8f\x3a\xe8\x79\x61\x54\x92\x9a"
- "\x4f\x9c\x89\x1e\xb6\x8a\x59\x7a\xc9\x17\xc6\x0b\x87\xe4\xa8\xf9"
- "\x84\x5d\x9a\xd6\x1e\xf2\xbb\x8f\xfc\x5a\xbe\x70\x5e\x38\xdc\xa0"
- "\xe6\x13\x63\x4d\x29\xd0\xf7\xf6\xdd\x01\xbc\xe0\xc4\x5e\x35\x9f"
- "\x29\xb4\xbc\x90\x3c\x11\x4a\xa1\xbe\x81\xf2\x28\xab\xc2\x85\xfe"
- "\x1f\x7d\x99\x8e\xfc\xbd\xfa\x2b\xed\x5f\x3f\x5d\x13\xd3\xb3\x9f"
- "\x6c\x73\x16\xcc\xfb\xc9\x82\x8c\x6c\x8a\x02\x95\xb5\x68\x49\x16"
- "\x5d\x33\x66\x3d\x27\x2e\x8b\x52\xe6\xcf\x91\x3f\xb2\xd2\x13\xe8"
- "\x47\x3a\xc6\x1b\x5d\xe7\x2e\xb1\xd1\x65\xce\x22\xba\xcd\x49\x1b"
- "\xb3\x64\x8e\x16\xba\x3a\x74\x1c\xc6\x77\x14\x5e\xb3\x1f\x63\x63"
- "\xb7\xe4\x47\xae\xa9\x82\xfc\x2b\xf6\x81\x8d\xab\xdc\xec\x48\xbc"
- "\x88\x71\xc7\x2e\xf1\x57\xa0\xbb\xe6\x23\xf2\x57\x60\x5c\x65\x9b"
- "\x63\xf4\x2d\x98\x07\x9c\xcd\xef\x28\x1c\x11\xee\x66\xbf\x76\xaa"
- "\xbc\x50\x8e\xf0\xf9\x59\x78\xcd\x54\xcd\xbe\x50\x71\x58\xc7\x90"
- "\x2f\x7b\x61\x6f\xb4\x89\x7c\xe1\x58\xad\xb8\xcf\xda\xb9\x49\xc4"
- "\x94\x01\x6f\x68\x1d\x8b\xfb\x5c\xdc\x53\xec\xb5\x91\x8a\x63\x92"
- "\x93\xce\x27\xe2\xde\x82\xfb\x38\x94\x3f\x57\x9b\x17\xa1\xb4\x51"
- "\x83\xaa\xfd\xa4\x57\xf9\xb8\xbb\x3f\x29\xcc\xad\x11\x65\x5a\xcc"
- "\x5a\x11\x9f\xb6\x70\x44\x45\x20\x3e\xad\x88\xc3\x64\x9a\x2e\xd6"
- "\x35\xb1\xb6\x5f\x7b\x77\x98\xf9\xba\x07\x25\x1f\x3e\xc2\xad\xf9"
- "\x64\x90\x7c\xf6\x08\x4f\x48\x6c\x5f\xdc\x5f\xcb\x02\xb1\x7d\x25"
- "\x1f\xba\x4d\xf2\xa1\xd7\x4e\xe2\x85\x23\x6c\x81\x38\x6c\x85\xd7"
- "\xc6\x87\xc6\x61\x73\xe3\x39\xc9\x37\x48\x4f\x0c\xae\x83\x23\x28"
- "\x7e\x70\x58\x6f\x71\x8c\x21\x9f\xe7\xa4\x2c\x03\x2f\x8e\xab\xe0"
- "\xcb\x55\x1e\x98\xd2\x79\x41\x22\xf9\xb7\xb1\xd0\x33\xe2\xfd\x7a"
- "\xd5\x39\x5c\x2f\xda\x75\x82\x7c\xe6\x7a\xec\x73\x75\x37\xee\x64"
- "\x3a\x71\x2f\x7d\x3e\xf2\x33\xba\x6b\xc5\x39\x36\xcd\x1f\x5c\xe8"
- "\x99\xf8\x5e\xcf\x1e\x1c\xd3\xf6\x8c\xd3\x17\x19\x7d\xb3\xe6\x49"
- "\x3e\x6e\xe4\x8f\x25\x96\xce\x9c\x20\xd7\xfb\x91\x71\xfc\x31\x19"
- "\xab\xc4\xad\x1b\x59\x46\xe7\x91\x8c\xba\xf4\x45\x1c\xef\x1a\x73"
- "\x66\xcd\x13\x69\xc8\xf7\x02\x78\x2d\x59\xbf\x91\x83\x5c\x23\x9b"
- "\x19\xbf\xe0\x97\x67\xfd\x75\x23\x0d\x33\xaf\xcb\xa7\xef\x18\x04"
- "\x1f\x71\x8c\x45\x52\x4c\x3c\xaa\xdb\xce\x10\x7f\x75\x1b\x90\x26"
- "\xe2\xdd\x3f\xc6\x22\xc9\x3f\xaf\x5a\x17\x83\x88\x33\x56\x38\xb2"
- "\x54\xf3\x99\x83\xef\x5d\xe2\x6b\xf9\xb1\x5f\x88\x19\x72\xd3\x9c"
- "\x31\xc9\x13\xf1\x6b\x8c\x1a\xce\x35\x74\xec\x8c\x6c\x8b\x4e\x5d"
- "\xd3\xf6\xc6\x33\x4b\x45\x3c\xc4\xc2\x91\xe0\xa1\xae\x55\x63\x28"
- "\x3f\xfd\x15\x61\x8b\x88\x13\x48\xe7\x0a\x95\x76\x7c\x77\x54\x8d"
- "\xf0\x8d\xab\x97\xfc\xa2\xf0\x49\x57\x38\x72\x2f\x8f\xb6\xca\xb8"
- "\x82\x51\x29\x66\xf4\x9f\x58\xf7\x69\x6e\x88\xf3\x93\x26\x6a\xfb"
- "\x75\x93\x80\xa9\x0f\xe0\x6f\x9a\x8c\xed\xf2\xf4\x57\x5a\xb9\xe4"
- "\x3f\x0a\x63\x8b\xfc\x48\x61\xbc\x5c\x67\x0b\xd8\x08\x69\x67\x32"
- "\x75\xd7\x6d\x24\xdf\x56\x41\xfe\x7c\xd4\x5b\x92\xaf\xbc\xae\xc4"
- "\xcd\x8c\xc5\x72\x7e\x5f\x87\xf1\xbf\x67\x82\xfa\x1b\xf2\xef\x5d"
- "\x55\x3d\xca\xf0\x6b\xba\x0f\xd9\x77\xd7\xd5\x63\x2c\x3e\x80\xbf"
- "\x69\xc8\xdf\xa4\xc5\x82\x7e\x41\x2f\xce\x16\x9d\x0a\x33\xb3\x04"
- "\xa4\xfb\xb4\xf4\x01\xba\x44\xd0\xe6\xfa\x48\x0d\x4f\xda\xa2\x67"
- "\x8e\xc1\xfd\x48\xf0\x9b\x9b\xd5\xfb\x71\xb8\x1f\xa3\xdd\xe3\xf7"
- "\x38\x0d\x6f\x48\x07\xd1\xb6\xc2\xfa\x12\xc9\x7f\x73\xcc\xe0\xc9"
- "\xcc\x24\x5f\x5d\x0f\xf9\x77\x77\x82\x9a\x77\xae\x9b\xbd\xa1\xbd"
- "\x87\xf6\x7f\x6f\x7c\x90\xfe\x61\x46\x59\xff\x51\xbb\x78\xd4\x3e"
- "\x2f\xc5\xe0\x46\x9e\xcd\x98\x4b\xd2\x7f\x46\x76\x6b\xe9\xba\x4e"
- "\xd3\x54\x17\xa4\x11\xe7\x7c\x1a\x17\xa3\x84\x6d\xcd\xfa\xe5\xa6"
- "\x64\xe2\xef\xc8\xe7\x80\x88\x69\x46\xbe\x21\x7d\x2c\x42\xf8\xe3"
- "\xdf\xb8\xaf\x59\xf8\xa1\x5f\x1a\x1f\xa9\xf9\x85\xe4\x8e\x69\xc0"
- "\xfe\x17\xe3\xc8\x57\xa4\xd0\x9b\x75\xc4\x0f\x13\xfe\x21\x55\xbf"
- "\x90\x3b\xb2\x59\x4c\x89\x22\xfd\x42\x0a\x7f\x04\x97\xf1\x0d\xc9"
- "\x0b\x8e\x9a\x34\xdf\x90\x68\x33\x9d\x33\x8c\xe7\x17\x7c\x5e\x5c"
- "\xe3\x42\xfc\xda\x84\xf7\xea\x27\x52\x0f\x8c\xd4\x4b\x3f\x91\xfd"
- "\x5b\x5b\x46\xd9\xe4\x98\x18\x55\xae\xc5\xa5\x0e\x49\xab\xc4\x98"
- "\x56\x31\xe8\x3a\x87\x9a\x06\xfe\xe7\xf5\x92\x00\x1f\x06\x6c\x23"
- "\xfd\x21\x9e\xc7\x70\x7b\xda\x4b\xa1\x73\x88\x31\x5a\xa2\x07\x60"
- "\x6e\x45\xe0\x6f\x20\xfd\x4d\x0a\xe0\xc4\x05\x5e\x4f\xb2\x80\x51"
- "\x87\x75\x25\x27\x8c\x4f\xf1\xf9\xc2\x52\x7c\xba\xe3\xc4\x63\xd2"
- "\xd9\xea\x29\x7e\x1f\x9d\xf1\x0f\x9f\xe2\x6f\xa3\x78\x91\xc7\xe9"
- "\xcc\xd8\x86\xf9\x74\x86\x71\x14\xa7\x58\x32\x53\xfc\x5f\xf3\x97"
- "\xe5\xd9\xcc\x3a\x92\x01\xfc\x17\x78\xb5\x3f\x9b\x57\xa1\x0f\x22"
- "\x49\xbe\x20\x3f\x5b\xc3\x74\x5e\x36\xcc\x16\x76\x68\xf2\xf9\x43"
- "\x9c\x7c\x6c\x51\x1c\x31\xa5\xd0\x0b\x4c\xb4\xe8\x52\x7c\x61\xf9"
- "\x2e\x5f\x93\xf0\xe5\x3f\xc5\x3f\x90\x4f\xc9\xb9\x87\x8b\xf8\x5f"
- "\xd9\xbc\x12\x78\x1a\x26\x62\x42\x2f\xe3\x6d\xf8\x6d\x98\xb2\xac"
- "\x8d\x53\xbc\x4a\x94\x5d\x35\xc5\xa7\x74\x4e\xc9\x51\xec\x29\x39"
- "\x3a\xbc\xf7\x39\xde\xfb\x1c\xf5\x49\x40\x99\x26\xdc\xdf\xcb\x5f"
- "\x9e\x4f\x67\x9d\xf2\x85\x8c\x83\x36\x3a\xd5\xf3\xa3\x15\xa8\xdf"
- "\x5e\xf2\x05\x9e\xe2\x73\xe6\xbf\xac\x9e\x07\x15\xb1\x52\x73\xba"
- "\xb8\xfa\x9d\x71\x53\x96\xb1\x7b\x53\x96\x8d\x12\xe7\x4a\xe9\xcc"
- "\xd4\x14\x9f\x05\xdf\xcc\x27\x7a\x44\x8a\xf8\xd4\x74\x6e\xaa\x70"
- "\xb4\xf5\x72\x71\x2e\xc9\x1e\x64\xf1\x35\x4c\x4f\x7a\x00\xff\xab"
- "\x93\xeb\xc8\xe7\x97\xdd\xc3\xbd\xa4\xdf\x3b\xd4\x59\xaf\xb7\x64"
- "\x87\x03\x3f\x47\xaf\xac\xb5\x25\xf4\x7e\x76\xae\x68\xea\x71\xbe"
- "\x65\xfa\x58\x5e\x34\xad\x1c\xd7\xbd\xdc\x91\x32\x89\xec\x52\x79"
- "\xd1\x53\xeb\xf8\x96\x19\x48\x9f\x91\x86\xeb\x5e\x5e\x94\x3a\x81"
- "\x6f\x99\x89\xfb\x39\x16\x5c\x71\x7f\x77\x24\xf2\x27\xf0\xa2\x1f"
- "\xe6\xe2\x5a\xce\x8b\x7e\xd4\x8a\x7c\xb8\xff\xf1\x74\x5c\x71\xff"
- "\x93\x6a\xe4\xc3\xfd\xf8\xf1\xa7\x74\x37\x4c\xc2\x6f\xa4\xcd\xf3"
- "\xc9\x6f\x2d\x30\x88\x6f\x15\xa5\xc7\xc8\x6f\x2c\xb2\xc8\x6f\x64"
- "\x8e\x91\xdf\x58\x32\x4e\x7e\xe3\x9e\xdd\xc8\x37\x8e\x17\xdd\x5b"
- "\x8c\x6b\x05\x2f\xba\x6f\x35\xf2\xe1\xfe\x01\x1b\xae\xb8\x9f\x88"
- "\x6f\xcd\xc4\xfd\xcf\xa8\x7c\xdc\x3f\x34\x16\xf9\xc6\xf3\xa2\x87"
- "\xe3\x70\xdd\xcf\x8b\x1e\xa1\xf2\x71\x3f\x25\x1c\x57\xdc\x27\xb7"
- "\x23\x1f\xee\x1f\x6b\xc2\x15\xf7\x39\x68\xd3\xf4\x44\x5e\xb4\xcc"
- "\x8b\xab\x93\x17\xad\xc0\xf7\x66\xe0\x7e\x65\x2a\xae\xb8\xb7\xe3"
- "\xfd\x99\xb8\xcf\xaf\xc2\x15\xf7\x05\xd4\xd6\x09\xbc\x68\x35\x7d"
- "\xa7\x92\x17\xfd\x92\xda\x8c\xfb\xff\x6f\x17\xae\xb8\xff\x15\xd5"
- "\x07\xf7\xbf\xa6\xf7\x70\xbf\x0e\x34\x98\x3e\x89\x17\x6d\x28\xc1"
- "\xb5\x8a\x17\x6d\x4a\x47\x3e\xdc\x6f\x19\x8f\x2b\xee\x8b\x41\xc3"
- "\x99\xb8\xdf\xd6\x80\x2b\xee\x77\x50\x7b\x93\x78\x51\x69\x3e\xae"
- "\xd5\xbc\xe8\xdf\xa7\x22\x1f\xee\x5f\x8d\xc7\x15\xf7\x65\xa0\xdf"
- "\x4c\xdc\xbf\x5e\x87\x6b\x75\xef\xfd\xf9\xe6\x24\xbe\x2a\x82\xf1"
- "\xa2\xb7\x73\xf8\xaa\x81\xb8\x1e\x88\xe7\xab\x06\xc4\xf3\x22\x67"
- "\x3d\xd2\x71\x3d\x18\x83\xfb\x31\xea\x3d\xae\x87\x18\xee\x13\xd4"
- "\x7b\x5c\x0f\xb5\xe2\x7e\xac\x7a\x8f\x6b\x25\xdd\x83\xc6\x47\x70"
- "\x8d\xa0\x2b\x78\xdc\x01\xe3\xd5\x7b\x5c\xff\x52\x81\xab\x8f\x17"
- "\xbd\xbb\x0b\xe9\xa0\xd5\xe1\xb9\xb8\xc7\xb5\x32\x0e\xf7\xa0\x45"
- "\xe5\x1a\xdc\x4f\xf0\xdc\xf4\xb0\xb0\x5d\x52\x62\x6f\xf0\xf0\xd8"
- "\xd4\x72\xfb\x79\xa6\xa7\x31\x4a\x31\x23\x2c\xd9\x6c\x54\xa3\x2e"
- "\xee\xa6\xf2\x3c\xb7\x9e\xf2\xf8\xb7\x4e\x4f\x50\x62\xa7\x93\x6e"
- "\x3a\x02\xf9\x06\x9e\xd2\xdd\xf4\x28\xad\xa3\xae\x5c\xb7\x88\x5b"
- "\xa7\xfa\xaf\x8b\xc0\x3b\x8f\x80\x6f\x18\x47\xb1\xbe\x41\xaf\x74"
- "\x5e\x30\xe0\x1c\xae\xad\xbc\x60\x48\x23\xe8\x85\xfb\xa8\x63\xb8"
- "\xe2\xfe\x87\x6b\x41\x2f\xdc\x3f\x7d\x3f\xae\xad\x1d\x85\x71\xbb"
- "\xdd\xba\xd1\xbb\xc4\xba\xf0\xc6\x33\x36\xa3\x8f\x03\x8f\xb0\x26"
- "\xff\x66\xad\xc7\xe8\x73\x32\xbe\x25\xa3\xce\x48\x7e\xd8\x5e\x49"
- "\x42\x5d\xc7\x90\xff\x38\x92\x73\x22\x78\x57\x9c\x5e\x7e\x7b\x08"
- "\xc7\xb7\x4f\x90\x7e\x94\xc7\x4e\xe8\xeb\xf9\x45\xf1\xfc\x86\x5f"
- "\xdb\xe4\x73\x03\x0b\x3e\x7f\x1a\xcf\x6f\xba\xc6\x48\x3a\xed\x9b"
- "\x1f\x10\xcf\x5d\xed\xcd\x6a\xbb\xc2\xe8\xd9\xdd\x94\xd7\xad\xbb"
- "\xc9\x2a\x75\x5c\x71\xd3\x79\x41\x18\x6b\x33\xa5\x8c\xed\x28\xbc"
- "\x29\x0d\x75\x9f\xab\xf2\xd8\x63\xb8\xc9\x9a\x20\x7d\x15\xcc\xe9"
- "\xcb\x8f\x8a\x41\xd9\x9c\x65\x5d\x5f\xc0\xeb\x48\x6e\xc5\xfa\xa3"
- "\xb7\xe4\xc5\x55\x34\xea\x6e\x19\xbb\x83\xf4\x11\x31\x6b\x13\xe8"
- "\x3c\x11\xbe\x79\xb1\x6b\x53\x4a\xae\x65\xb9\x11\xdf\xbf\xe5\x6e"
- "\xbb\x97\x9f\x77\xe6\xdd\x8f\x75\x52\xa4\x57\x08\x1b\x75\xf9\x7b"
- "\x97\xb4\x2b\x12\xbf\x1d\x52\xb7\x7a\xcb\x58\x7a\x37\x54\x4e\xf0"
- "\x17\x7e\x39\x57\x89\x5d\x9b\x28\xf7\xc5\x6e\xf2\x1f\x50\xdc\x7a"
- "\x63\x16\x1b\x60\x59\x7e\x08\xe5\xdf\x3c\xa1\xbb\x4c\xa9\xe5\x15"
- "\xcf\x6e\x3d\x88\xbc\xdb\x85\xfe\xe7\xe6\xa9\x9a\xee\x98\xa3\x0d"
- "\xbf\x96\xfc\x14\xc9\xe7\xe1\x92\x2f\xbc\xf9\x38\xf9\xd1\xf4\xc5"
- "\x2c\x4c\xf4\x6d\xbe\xc1\xed\xdf\xbc\x36\x81\x6f\x5d\x9b\x38\xcc"
- "\xa7\x63\xc2\xbe\x5f\x77\xcb\xa0\x3b\xbc\xa4\x97\xfb\x80\xf2\xbe"
- "\xa3\x44\x9c\xdd\x7b\x7b\x0e\xd3\x3b\x33\x3f\xc6\xfd\x2d\x90\xd7"
- "\x7c\xcd\xae\xd6\x7a\x46\xbe\x80\x71\xcf\xf8\xda\x98\xf1\xca\x60"
- "\xc3\xd8\x9d\xc4\xcf\xe6\x90\x3e\xe9\x18\xbd\xf7\x4b\xf4\x0b\xe4"
- "\x86\x9b\xdd\x5a\x5d\x28\x16\xc0\x7a\xd0\x8e\x78\x4d\x3a\x8f\x9d"
- "\xe2\xf7\x93\xef\xa8\x35\x6e\xd0\x41\xf6\xd7\xcd\x95\x84\xf9\xf2"
- "\xbb\xb7\x5c\xa3\x44\xa7\xa4\xd5\x4e\xa7\xbd\x57\x03\xf9\xe2\x39"
- "\x2f\xce\x6f\xfa\x28\x7e\x1f\xad\xb3\x32\x6f\x68\xdf\x2d\x50\xcf"
- "\xad\x2e\xc8\xc8\xca\x7c\xde\xb2\x78\xc1\xf2\x79\xf7\xdc\xb4\x64"
- "\x8c\x25\x33\xc7\x92\x29\xe2\x45\x8b\x84\xb9\x63\x2c\x8b\xd3\x17"
- "\x65\x59\xb2\x96\xd9\xe6\x5d\x1a\x0f\xd8\xcc\x4d\x29\x13\x24\x0f"
- "\x78\x9b\xf4\x33\x50\xba\xb6\x39\x2b\x97\x2b\x96\x1b\x06\x82\xc7"
- "\xbf\xe5\xf8\xc5\x88\x5b\x12\xe9\x2c\xbb\x52\x60\x61\x6a\x4c\xeb"
- "\xc8\x97\xa2\x19\x9d\x13\x31\x74\x14\xde\x52\x1d\xdc\x4f\xb9\x2d"
- "\x46\xea\x3b\x6e\x71\x63\x3c\xae\xa6\xb4\xcd\x9a\x7f\x2f\xf5\x99"
- "\xdc\x8f\xa0\xf8\x7e\xeb\xa4\xbf\xb1\xd2\xb5\x93\x24\xef\x18\x9f"
- "\x20\xbe\x6d\x59\xdb\xcc\x77\x25\x91\x6f\x2b\x1d\x8d\x55\x11\x37"
- "\x97\x9d\x13\x67\x59\x31\xd7\x92\xe9\x1c\xb9\x7f\x6b\x4a\x9d\x12"
- "\x9b\x91\xac\xbc\xfa\x48\xb9\xfd\x37\x4c\xff\x26\xb0\x20\xdc\x82"
- "\xf9\x70\x03\x1b\x75\x28\xaf\x59\x7f\x46\x17\x7f\xdf\xa1\xbc\x7a"
- "\x3d\xdf\x9c\x5a\xd6\x16\x37\xb3\xde\x5b\x20\xfc\x80\xa2\x0c\x2f"
- "\xfb\x0b\x46\x13\xe4\x9d\x8a\xf6\xe1\xd9\xde\xf6\xe1\x29\x15\xde"
- "\x2d\xf6\x54\xe7\x0d\x3f\x60\x13\x6f\xe5\x5f\xbf\x57\x49\xba\xaa"
- "\x31\xbe\xf7\x26\x90\xae\x30\x65\xbc\xd7\x94\x92\xd8\xbe\x75\x21"
- "\xd9\xf2\x79\x2e\x6e\xb5\x97\x77\xc6\xce\x4e\x38\x8c\x3c\x1f\x40"
- "\x46\x38\x6a\xc1\xf8\x1d\xcd\xf4\x17\x6f\x4e\x4a\x7c\xb3\xd3\xa1"
- "\xaf\xaa\x1c\x2f\xf5\x9b\xa9\x98\x33\x62\x3c\xc5\x7f\xf1\xde\xde"
- "\x4a\x86\x6f\xb3\x37\x3b\x27\xe9\xff\x32\xae\xe7\xf3\x5b\x07\xbc"
- "\x97\x50\xc9\x3a\xc8\x37\x2b\x64\xb1\x83\x1f\x17\x33\xbe\x75\x89"
- "\x69\xcf\x72\xaf\x7e\xba\x9b\xe9\x6b\xea\x8b\x59\xee\x17\x6c\xa8"
- "\xef\xeb\xf8\xf0\xd7\xf1\xfe\x45\xf2\x79\x78\xd4\x2c\x7c\x9f\xe5"
- "\x39\x45\x1c\x58\x63\x2d\xf8\x13\xe5\xeb\xf8\x88\xda\xa9\x14\xa7"
- "\x68\xda\xbb\xbe\x87\xcd\xac\x26\xcd\xc3\x5c\xd6\x52\x76\x51\x9f"
- "\xc8\xde\x7a\xaa\x94\x6d\x87\x1c\xb0\xfd\x0c\x8b\x94\xfb\xb6\xf1"
- "\x11\xbe\xae\xf8\x70\xdf\x8a\x78\xf2\x45\xc3\xf9\xd7\xf1\x83\x89"
- "\x1f\xf5\x2d\x8a\x37\xd4\x7a\x4a\xd9\x1d\xcd\x2c\xfe\xa2\x9e\x19"
- "\x2f\xae\x88\x1f\x5c\x6b\x2b\x46\x59\x14\xbc\x9a\xe9\xc8\x0f\x16"
- "\xf9\xc7\x22\x3a\x0d\xb1\xb2\xa9\xad\xba\xf8\x03\x83\x8f\xb3\xe1"
- "\xe4\x87\x91\xfc\xa8\x91\x2f\x58\x25\x66\x89\xc9\x1f\xb3\xb0\x2e"
- "\xef\x3c\xf9\x0d\xf1\x32\x60\x65\x32\xf1\xc8\x33\x81\x53\xd4\x66"
- "\x85\xc7\x0f\x4e\xa1\xeb\xa6\x69\xef\x12\x9f\xac\x74\x98\x29\xbe"
- "\x91\x81\xea\x89\x79\x6a\x58\x79\x12\xb4\xb4\xc7\x87\x23\x5f\x24"
- "\xd2\x87\xb9\x5a\xbd\xcc\x7f\xdb\x33\xa9\xb7\xdb\x44\x1c\xdb\x98"
- "\x9d\x79\xcc\xe4\xc8\x63\x31\x96\x1f\x12\xed\xc6\x7c\xe2\xdf\xf3"
- "\x4c\x32\x2f\xfc\x09\xd6\x93\xf0\x91\x32\xed\xfb\x07\x2c\x0f\x32"
- "\x66\xf9\x81\xf8\x3d\xcf\xf2\x13\xf4\x61\x4c\x96\x4d\xf0\xf0\x42"
- "\xb6\xfb\xfe\x93\x72\x8c\x7f\xff\xd1\x8b\x11\xab\x7d\x4a\x61\x85"
- "\x59\x59\x15\x6e\xa1\x78\xd7\x67\x74\xdf\xbf\x9b\x17\x1d\x4b\xe5"
- "\x9b\xed\x62\x2c\xe2\xfe\xce\x8b\x11\x3f\x4c\x45\x5a\x25\xca\x4f"
- "\xbc\xa8\x0b\xaf\xc7\x5f\x83\xfa\x7e\x3c\xb5\xdb\xbf\x2b\xa9\x8a"
- "\xda\x2d\x62\xe2\xa0\x5d\x29\xe8\x33\x1e\x9b\x65\x11\x7e\xe2\xbb"
- "\x40\x5f\x35\x66\x28\xd1\x83\x68\xa0\x74\xc5\x0f\x16\x6d\xed\x8a"
- "\x8f\x04\x7d\xc9\xe7\xaa\x31\x6f\x16\xde\xd9\x9a\x35\x16\xcf\x86"
- "\x5d\x8c\xc9\x4a\xa3\xd8\x54\x2e\x9b\x87\xf9\xb7\x64\x25\x90\x4f"
- "\xb1\x97\x96\x63\xce\x0d\xcf\x02\xbf\x93\x35\x5e\x9d\x5b\x8c\xea"
- "\xa9\x14\xfd\xd5\x74\x91\xce\x04\xa0\x6e\xa8\x1f\xd6\xde\xf0\x06"
- "\xb7\xee\x7b\xbb\x2f\xde\x94\x54\x8f\x6b\x3e\xea\x6a\xe1\x85\x8f"
- "\x35\xd3\x6f\x3c\xb3\xa0\xce\x5b\x88\x0e\x44\x0f\x95\x16\xeb\x83"
- "\xb4\xb0\xc7\x21\x5f\xae\x52\xf8\x87\xfd\x6e\xdd\xf7\xa7\xf3\xc2"
- "\x47\xca\x42\xf2\xfd\x29\x98\x6f\x6d\x95\xcc\x77\x20\x5d\xe6\xb3"
- "\xa2\xdc\x31\x8f\xaa\xf4\xbe\xd8\x0b\xbd\xcf\x06\xdf\x5d\x6c\x93"
- "\xef\xfe\xd6\x27\xdf\x7d\x80\xde\xbd\xb5\x7b\x9d\xc6\x8c\x0e\xe6"
- "\x5f\xb8\x4b\xe6\xff\xb7\xdd\x32\xff\x3d\xad\x21\xf9\x1e\x0a\xe6"
- "\x5b\x96\x20\xf3\xed\x99\x20\xf3\x4d\x4a\xc2\xf3\x5f\x5e\x5a\x97"
- "\x31\x2b\x83\xef\x6c\xdd\x2b\xdf\xa9\x4a\x95\xef\xcc\x6e\xc0\xf3"
- "\x3f\xf5\xa8\xcb\x9e\x60\x7e\x87\xda\xee\x77\x3d\x32\xff\x8c\x35"
- "\x21\xf9\x3e\x92\xf9\xe8\x79\x0d\xf2\x7d\x3f\xf9\x62\x44\x49\xb1"
- "\xcc\x97\x16\x4f\xe3\x11\x79\xce\x2b\x85\xe3\x27\x5d\x8c\xf8\xf1"
- "\x58\x94\x33\x01\x7d\x33\x92\xae\xe8\xbb\x91\x8a\x23\x05\xfd\x7a"
- "\xeb\x7e\xda\xbf\x20\xcc\xc5\x9a\x50\x02\xdc\xf5\xf7\xbe\x37\x7a"
- "\xdb\xd8\x80\xbe\x4c\x01\xff\xb0\x65\x7a\xef\x3c\xfa\xa6\x69\x63"
- "\xc9\xa6\x81\x30\x05\x98\xfb\x0a\xf9\x9a\xe3\xf6\x49\xaa\x8e\xea"
- "\x36\x61\x5b\x47\xbe\x1e\x48\x8f\xa9\xa6\x89\xf3\x38\x0a\xc6\x26"
- "\xe4\x4c\xe1\xdf\x8f\xf4\x96\x58\xa3\xd0\x9e\xdb\x2a\x80\x13\x03"
- "\x5e\xd4\x2b\xe5\xf8\xab\xc0\x9f\xf3\x45\xd2\x67\x16\xb0\x89\x9a"
- "\xae\xb7\x8f\xba\x62\xfd\x5b\x5f\x1c\xd4\x77\xdd\x06\xda\xdd\xd6"
- "\x7f\xdf\xd9\xba\xdb\x3c\x97\xd9\x77\x0a\x17\x3e\xd7\xb7\x4e\x4f"
- "\x76\x28\x32\xa6\x3c\xe6\x22\xf8\xbc\xdb\x27\x62\xcd\xcf\x17\x3e"
- "\x64\x37\x67\xd4\x29\x71\x58\x4b\x4e\xb3\x30\x57\x6e\x33\x2b\x57"
- "\x9a\xf5\x8e\x4e\x16\x5e\x8b\xf5\x94\xf2\x97\x83\x77\xb0\x64\x10"
- "\x0f\x75\xfb\x0c\xc7\x05\xb5\xbc\xd2\xb5\x1e\xfb\x42\x19\x3b\x9b"
- "\xf8\x4d\x5a\x83\x80\x3b\x91\x22\x9e\x5a\xc6\x40\xca\xbb\x11\xbf"
- "\x0d\x94\xf7\xe2\xcd\x0f\xdb\x2e\xfe\xdb\x5a\x4f\xe7\xd6\x59\x09"
- "\x9d\x37\x4f\x4e\xee\x8a\xcd\xa8\xeb\xda\xba\x30\xd9\xf7\x6f\x6b"
- "\x53\x7d\x37\x27\x79\xfc\xb1\xb3\xca\xf1\x6d\xac\x4f\xc5\xfa\x37"
- "\x94\x72\xfd\x1b\x79\x4e\x3d\x95\x7b\x28\xaf\x4c\x7f\x30\xaf\x4e"
- "\x7f\x50\xa9\xd0\x1f\xca\x73\xe0\x5a\x4a\xb1\xb5\xc0\xd7\xde\x7e"
- "\xf2\x60\x5e\x15\xd6\xc7\x3b\x2c\x68\xbb\x45\xd3\xab\xf2\xfb\x7d"
- "\xac\xb6\xcc\xc7\x8e\x64\x9d\x67\x9e\xa8\x94\x09\xf8\x9b\xe4\x19"
- "\x9e\x65\xf5\x0c\xb7\xa7\x8a\x3a\xc7\x2e\x11\x6d\xa4\xb3\x5d\x07"
- "\x15\x59\x67\x95\x1e\x28\xf3\x8e\x87\x76\x2a\x74\xfe\x4b\xf5\xaf"
- "\xab\x4b\x08\xbf\xc4\xbf\xae\x5e\xc6\x75\x0b\xf8\xd8\xfd\xaf\xf0"
- "\xaf\xab\xea\x24\xc8\xbf\x2e\x64\xe1\x3a\x55\x16\x76\xaa\xbe\x94"
- "\x22\x49\xfe\x15\xbe\x94\x72\x9c\xc2\x1f\x92\xd8\xe7\xdf\x92\x5e"
- "\x4e\x7c\x68\x47\x61\x42\xa2\x26\xe7\x12\x6f\xe5\xdf\x98\x32\x15"
- "\x7f\xc9\x48\xb7\xba\x75\x7f\xad\xd4\xd2\xf9\xd6\x1b\x49\x8e\x08"
- "\xf3\xf3\xb4\x9f\x76\xd0\xb9\x25\x9e\x76\xaf\x7f\x4b\x8a\xd3\xbf"
- "\xc5\x9e\x88\xb4\xf1\xf8\xbb\xc7\xbf\xe5\xc6\x76\xfc\x79\xf1\xe7"
- "\xf3\x6f\x89\x03\xf6\xc6\x85\xe3\xcf\x80\x3f\x13\xfe\x62\xf0\x67"
- "\xc6\xdf\x48\xfc\x59\xf0\x17\xa7\x6c\x89\x8b\x24\x7f\x81\x7c\x6b"
- "\x5c\x02\xc6\x81\x59\x2b\x37\x48\xef\x84\x03\x68\x7f\x22\xf1\x7d"
- "\x7c\xd8\xb1\x5c\x8e\xf9\xce\x5f\x79\xd8\x2b\xea\x4f\xb8\xfc\xca"
- "\xcc\x7a\xcf\xe8\xb5\x6e\xcf\xf0\x25\x6e\x5c\x27\x79\xa2\x5e\x74"
- "\xe0\xaf\x18\x7f\xa5\x9e\x2d\x59\x36\xf4\x29\xfa\x76\x09\x64\xf9"
- "\x3b\x81\xcb\xe3\x4c\x52\x7f\x75\x27\x70\x6e\x9c\xaa\xd7\xba\x13"
- "\x98\x31\x56\xcc\x2d\xe4\x73\xe2\x3e\xc9\xad\xfb\xa1\xc8\xd7\x16"
- "\x9b\x95\xaf\x9e\x79\xca\x47\xfa\x5c\x77\xf8\x03\x36\x99\x6f\x21"
- "\xf9\x1b\xa4\x32\x73\xb4\x79\xd8\x2d\x86\xc6\x1c\x5b\xca\xc2\x59"
- "\x39\x29\x8b\xd3\x17\xcc\x99\xb7\xf8\x27\x96\x9b\xe6\x5a\xe2\x17"
- "\x64\x3e\x9f\xf2\xfc\x92\x79\x4b\xe6\x09\x16\x12\x49\xb7\x76\xdb"
- "\x8f\xa2\x58\xc9\xcc\x07\x79\x68\x58\x13\xe7\xb4\x76\x27\xb5\xa3"
- "\x8f\x6e\x58\xeb\xd9\x7f\xc6\xa3\xf7\x83\x87\x8b\x6c\xca\xc7\xdc"
- "\xcc\xa8\xdb\x7f\xc6\xab\x8f\x6c\xb2\x30\x8e\xf9\x40\xcf\x5c\x4d"
- "\x75\x2a\x4f\x77\x8c\x55\x13\x4f\x87\x3c\x6f\x64\x78\xf5\x93\xe9"
- "\xfd\x57\x93\x3c\x6f\xe2\x37\xd2\x92\xe9\x3d\x0e\x3e\x4f\x5c\xc1"
- "\xe7\xc9\xfb\x59\x09\x07\xc5\x75\x61\xf2\x41\x91\x6f\x56\xf9\x21"
- "\xba\x5e\xc8\xe5\xd5\x28\x97\x74\x75\xfc\xd5\x87\x6d\x22\xcf\xab"
- "\x93\x65\x1e\xcc\xc5\x46\xdd\x5d\x06\xca\x27\x64\x2b\xd4\xf1\x4d"
- "\xd4\xc3\xbe\x84\x85\x6b\xf3\x9b\x64\xa9\xc0\x1c\xcf\x26\x9e\xf7"
- "\x07\xcf\xd3\x1c\xa7\xfa\x70\xcc\xe9\x3d\x78\xf7\x8d\x0c\x8f\x78"
- "\x1f\x32\x66\x18\xc9\x96\x84\x23\x84\x1f\xae\xdc\x3a\xf1\x7e\xb9"
- "\x52\xa7\x27\x79\x0c\xef\xfe\x9e\x9e\x95\x80\x4f\x2d\x11\x72\xc9"
- "\x0f\x5a\x35\x59\x60\x5d\xac\xf4\xa7\x14\x99\xca\xe8\xdc\xf7\xa8"
- "\x33\xba\x3b\x8f\x10\xfd\x88\x5e\xb4\xff\xcb\x0b\xef\x5c\x5d\x12"
- "\xcd\xc2\x77\x44\x33\x83\x6f\xf8\xda\x71\x72\x0f\xe0\xae\x31\x1a"
- "\x7f\xdd\x1e\xb3\x76\x5c\x68\xbf\xc9\xfe\xb2\xcc\xcb\xa0\x9d\x8c"
- "\xb9\x62\xcb\x70\xd6\xe2\xc5\x4b\x16\xce\xb3\xcc\x9b\x35\x27\xcd"
- "\x22\x1e\x5b\x96\x2c\x46\x96\x05\x59\x8b\x2d\x8b\x96\x66\x58\x16"
- "\x2e\x5e\x40\x92\xc2\xbc\xcc\xcc\x25\xb6\xac\xc1\x4c\xbe\x69\x59"
- "\xb8\x24\x3d\x6b\x81\x0d\x3f\x16\xcf\xcb\x98\x6b\x11\xbd\xbe\x18"
- "\x45\xa5\xa7\x5b\xd4\x2f\x2c\x4e\x9b\x95\x49\x03\x21\xe3\x19\x64"
- "\x0a\x79\xbf\xbb\x1c\x11\x49\xfe\xaa\x68\xed\x39\xa3\x1b\xbb\xbe"
- "\x32\x1c\xb4\xde\xbc\x76\x1c\xd9\x2c\xe0\x7e\x9d\x90\x2d\x0b\xef"
- "\x1a\x4f\xfb\x3b\x2f\xa2\x8d\x6d\x37\xcd\xac\xef\x28\x1c\x6b\xd0"
- "\xda\x46\xfe\xe1\x85\x7f\x44\xf2\xbd\xa9\x1b\xbb\x4c\x9c\xc5\xc3"
- "\x7c\x10\x36\x2d\x85\x77\x4d\x91\xb4\x18\x3b\x2e\xd4\xb7\xb6\xf0"
- "\xd3\xa8\x1b\xfb\xa8\xdc\x1b\x19\xbb\x8e\xf8\x23\xd5\x9f\x3d\xe4"
- "\xb5\xbb\x56\xd2\x3b\xca\x16\xfb\x24\xbc\x67\x0b\xca\x28\x63\x27"
- "\x51\x7e\x91\xaf\xf0\xae\x6d\x7c\x78\x16\x78\x93\xb1\x63\xa8\x5e"
- "\x7d\xac\x33\x96\x0b\x28\xf7\x68\x39\x63\xdf\x8f\x61\xf1\x17\x36"
- "\xcd\x31\x75\x44\xa7\x58\x3b\x0b\xd8\xc0\x4e\xac\x6d\x5e\x3d\x1b"
- "\x75\x11\xe3\x62\xd9\x9d\x2c\x6c\xe5\x23\x4c\x5f\xfe\x6c\x39\xf9"
- "\x77\x65\xd5\x93\x8a\x99\x2b\xd5\xcd\x5c\xde\xdd\xac\xda\xd9\xc8"
- "\x6a\x7c\xbf\x93\xb1\x17\x96\x93\x8c\x71\xf7\x59\xf2\x39\x65\x5f"
- "\xc9\xfd\x6f\xee\xf3\x0c\x78\xa3\xa5\x9c\x62\x26\x8c\x72\xf9\x3e"
- "\x73\xba\x72\x77\x31\x57\x8e\xcb\x49\x67\xf1\x41\xb7\x4f\x0e\xe2"
- "\xd9\xa0\x6a\xbc\x37\x99\x0d\xc4\xfd\x87\xf4\x8d\x35\x5b\x79\xfd"
- "\xaf\x62\x79\xc3\xaf\xb6\x72\x37\xc6\x14\xc5\x40\x68\x5e\x1f\xcb"
- "\x5b\xd7\xab\x7e\xe5\x68\x9c\xda\xb2\x99\xb9\x45\x77\x77\x9a\xd0"
- "\x85\x4c\x10\xf7\xd7\xe0\x5e\xac\xff\xae\x9c\xad\x74\x3f\x02\xf7"
- "\x6b\xe4\xfd\x4e\xba\xbf\x16\xf7\xc5\xf2\xfe\x3d\xba\x1f\x89\xfb"
- "\x32\x79\x5f\xcb\xc4\xb9\x74\xdd\xdd\x15\xf2\xfe\x6f\x74\x0f\xda"
- "\xdf\x5d\xe5\xcc\xa6\xfa\x7e\x8a\x3e\xbb\xfb\x23\xfb\x27\x90\x55"
- "\x73\x4e\x89\xf9\x70\x28\x2f\x8d\x74\x35\x98\x0f\x77\x3f\x39\xa4"
- "\x81\xe4\xdc\xbb\xbd\x11\x09\x74\x1d\xeb\x33\x7a\xd9\x40\xf0\x8d"
- "\x43\xd0\x9e\xf7\x89\x76\xbd\xf2\x31\x6f\xa4\x8c\x9a\xe2\xe3\x4e"
- "\xfe\x4a\x52\x33\xdf\xb2\x28\x99\xbf\x32\x99\xf6\xec\xb1\xd6\x4d"
- "\x37\x95\x2f\xf7\x0a\x1f\xbb\xe0\xd5\x31\x87\x7e\x28\xec\x0b\x3d"
- "\xe0\x7d\xfb\xf0\xb9\x69\xe2\x5b\x52\x93\x21\x53\xd6\x3f\x12\xef"
- "\x23\xfb\x43\xf0\xfb\x3f\x7c\xff\x48\x1a\xf1\x0e\x4b\x0e\x2b\xbb"
- "\x26\x27\x28\x76\x2b\xe3\x71\x49\xcd\x8f\xa4\x71\x27\xd6\x31\x9d"
- "\xd4\x9f\xf3\xcf\xf0\xfd\xcf\xc4\x77\x6f\x4a\x6a\x56\x96\xa6\x51"
- "\xcc\x27\x81\x2f\x79\xb4\xa6\x67\x03\x4f\x56\x58\x8d\xfe\x2d\x4b"
- "\x9c\x47\xd2\xbe\xe8\x5f\xfc\x34\xdd\x0f\xfb\xf4\x97\x4d\x75\xf2"
- "\x73\x2b\xf3\xe1\x3b\x3e\xb4\x95\xf8\x87\x37\x94\x2a\x3d\xf8\x98"
- "\xe6\x3d\xb3\xeb\x07\xf0\xa5\x56\x23\xda\x74\xa7\x2b\xfe\x3c\xab"
- "\xed\xa4\xb9\xf2\xa3\x35\x47\xd0\xab\x13\x73\x7c\x4e\xa3\x47\xd8"
- "\xc2\x99\x6c\xcf\xb2\xeb\xf9\xf0\xd4\xe4\x16\xdd\x8f\xea\x27\xe7"
- "\xa2\x0d\x68\xfb\xc1\xc6\xfa\x70\x05\xed\xb8\x43\xd2\x8d\xde\xdb"
- "\x0f\xda\xd6\x6b\x32\x4e\xff\xea\xff\x23\x31\x6e\x94\xc5\x56\x46"
- "\x67\x04\xdf\x04\xcf\xa2\x74\x59\x8d\x0a\xd6\x23\x7a\x76\x24\xfe"
- "\x34\xa3\x6f\x4a\x5a\xff\x48\xc6\x8d\x88\x03\x9d\xf1\x7d\xf2\x49"
- "\xac\xd1\x15\x79\xf7\xfb\xbb\xd2\x7a\xef\xff\xad\x4b\x1c\xa8\x5f"
- "\x1d\xdf\x72\x63\xaf\x76\x38\x58\xdb\x0f\xa9\xe3\xc3\x80\x3f\x33"
- "\xff\xcd\xda\x64\x8c\x81\x78\x11\x93\x73\x6b\xba\x53\xd3\x17\x61"
- "\xbe\x61\x8c\x8c\x7b\xb2\x3c\xaf\xb9\x77\x9f\xac\x8e\x7d\x66\x11"
- "\x0b\x6d\xc0\x67\xdc\xe8\xa7\x18\xbf\xe7\xc9\x36\xd5\x7c\x24\xbe"
- "\xbd\x9f\x7d\x3a\xae\xa4\xaf\x3e\xa5\xf2\x27\xde\xca\xbb\xfa\x59"
- "\x5e\xdf\xf1\x1f\x76\x81\x2e\x31\x37\xba\x3b\xf9\x04\x9d\x94\x43"
- "\x7e\xb2\x91\x68\xe5\xc3\x3a\xb2\xfc\x23\xa6\xf7\x62\xbd\xfc\xdd"
- "\x13\x6b\xf4\x63\xb0\xce\xf8\xc1\x0b\xbc\x5f\x57\xc9\xa6\x24\x31"
- "\x7b\x4d\xda\x39\xa6\xc5\x38\xc3\xba\x96\xfc\xda\x13\x1e\x3d\xed"
- "\x61\x51\x4c\x33\x21\xb3\x6f\x5d\xec\x78\xfd\x6f\x5e\x92\x63\xf3"
- "\xf7\xfc\xcd\xa3\xf7\xb5\x59\x2d\xc2\xbf\x36\x64\x09\x7b\x1a\x57"
- "\x02\xfb\x5a\x14\x83\xc1\x31\xad\x8a\x62\x46\x1f\x4d\xae\x13\xe7"
- "\xb6\x8f\x5a\x2b\xd9\xd1\x86\x62\x56\xdd\xf4\x09\x9d\x35\xfc\xcd"
- "\x51\xab\x83\x78\xca\x61\x3e\xf0\x8d\xdb\xc1\x37\x62\xbe\x0e\x52"
- "\x4c\xfb\xcc\xda\xde\x16\xed\x73\x69\x3c\xa3\x0f\x73\xb4\x44\x8d"
- "\x73\xe6\x2b\x1c\x97\x5f\xa2\xee\x73\x51\xfc\xb3\x6d\xd9\x2c\x6e"
- "\x9b\x5e\xb1\xf6\xb6\xaf\x35\xec\x79\xe1\xd7\xc5\xac\x44\xed\x0b"
- "\xc4\x41\x9b\xfc\xbc\x85\xbd\x8d\xb6\x1f\x89\xef\xef\x9c\xfc\x89"
- "\xf0\x5b\xe8\xc3\xb8\xf3\x61\xcc\xf9\x40\x4f\xb7\xee\xc7\x49\xe8"
- "\xb7\x5e\xe5\x31\xad\x0f\xba\xec\x5a\x1f\x8c\x1f\x2d\xfa\x00\x72"
- "\xdc\x8a\x27\xd5\x3e\xf8\x18\x7d\xd0\x84\x3e\x28\x60\xf9\x1f\x4c"
- "\xad\x66\x53\x92\xd1\x07\xad\xe7\xc8\x37\xbb\x8c\x33\x97\x25\x69"
- "\x2f\xfa\xe2\x63\x8f\xbe\xb6\x5d\xf6\xc1\xee\xa7\x64\x1f\xbc\xf1"
- "\x94\x07\x7c\x4c\x52\xe2\x6b\xb8\xf7\x2f\xb5\x5a\x28\xee\x0e\x2f"
- "\x48\xa5\x98\xd8\xb2\x2f\xba\xd0\x17\x5d\xb2\x2f\xf2\x9e\x47\x5f"
- "\x1c\xaf\x17\xfe\x5d\x8e\x36\x54\xb3\xea\xd4\x52\x56\x03\x5c\x42"
- "\x5f\xcc\xa2\x7e\x21\x1d\x83\x7f\x45\x7c\xf4\x4b\xcb\x59\x4c\xc9"
- "\x72\x66\xd6\xfa\x43\xe9\x42\x7f\x2c\x47\x7f\x74\xa2\x3f\xbc\x81"
- "\xfe\x88\x11\xfd\x71\x5a\xed\x8f\x4e\xb2\x8f\x43\x7f\x74\xa2\x3f"
- "\x3a\xd1\x1f\x05\xb2\x3f\x08\xe7\x27\xb7\x1b\xb9\xf2\xcf\x78\xb6"
- "\xb3\xa5\x97\xfe\x58\xa1\xf6\xc7\xc7\xff\x4a\x7f\xfc\xaf\xd6\x4b"
- "\xfb\xe3\x27\x75\x57\xea\x8f\xe0\x9c\xb8\xe7\x08\xf5\x47\x57\xa9"
- "\x3a\x27\x6e\xa6\x39\x91\xaf\xff\x3e\xd6\x22\xa2\xe9\xfb\x75\xfb"
- "\xc5\x9c\x40\x5b\xf3\x5f\x7b\xc2\xab\xaf\x6e\x42\xbf\xcc\xe5\x7e"
- "\x21\x13\xab\xfd\x22\xfb\x23\x23\xb9\xec\x6f\x92\xfe\x96\x9f\xd3"
- "\x9a\x41\x73\x83\xfa\x07\xfd\x84\xf9\xd3\x5b\x8c\xc0\xd0\xfd\x5f"
- "\x94\xa9\xd0\x3c\xa1\x39\x42\xf3\xa1\x26\xed\x13\x11\x73\xfd\x68"
- "\x72\x15\xa3\x7d\xe0\xa3\xd6\xfd\xe8\xab\x62\xe6\x5f\x8a\xbe\xc9"
- "\xc6\x3c\xd1\xb1\xd1\x14\x2b\xf0\xa8\x75\x0d\xf1\x0b\x26\x8c\xf9"
- "\x41\x7e\xf4\x93\xbf\xc3\x3c\x78\x1d\xe4\xac\x97\xb3\x83\xf3\x66"
- "\xa7\x1a\x17\x99\x47\x8c\xcb\x47\x7a\xb8\x0f\x7d\x84\xb9\xd3\x6d"
- "\xce\x04\xe2\x25\x7f\x1e\xcf\x76\x34\x32\xc3\xd0\x05\xb2\x8f\xfc"
- "\x21\x73\xe6\x91\x05\x34\x67\xf2\xd1\x47\x1f\xf5\xb3\x8f\xee\x11"
- "\xfb\xbe\x90\x3f\x1d\x7c\xf8\x8d\x6e\xac\x93\xe8\xa3\xf1\xa9\x7d"
- "\xf5\x91\x7f\x57\x92\xc1\x6f\x4a\x49\x24\x1f\xf1\xca\xa2\xa9\x3a"
- "\x05\x32\x54\x27\x64\xd7\xa3\x1e\x1f\xcb\x9d\xc1\xf4\xcb\x3f\x61"
- "\x11\xae\xa9\xc7\x98\xcb\x5d\xc1\xc8\xdf\x32\xe9\xbe\x29\xee\x82"
- "\xcb\x57\x01\xbc\xb2\x3b\xe9\x7e\x87\xb8\xf7\xb0\x15\x33\x58\x98"
- "\x88\x21\x6a\x2d\x65\xeb\x30\x3e\xf7\x3c\x55\xaa\x57\x36\xa7\x96"
- "\x71\x13\xc5\x8b\x61\x4e\x3a\xfb\x64\x5f\xc6\x22\x6b\xd2\xaa\xc9"
- "\xe7\xdc\x67\xe4\x43\xb8\xb6\x1d\x65\x7a\x78\xa7\x1f\x6b\xc6\xce"
- "\x02\x5e\x41\x3e\xf4\xef\xa0\x35\x82\xfc\x61\xe8\x7e\xfa\x1b\xe2"
- "\x45\x48\x07\xe8\xcc\xdb\x06\xde\xeb\xa7\xaf\x50\xdb\x90\xa6\xab"
- "\x79\x96\x6c\x34\xee\x1f\x4e\xf5\x92\xfa\x78\x79\xbd\x83\x62\x2d"
- "\xc6\xe6\x87\x1d\xc8\xf3\x84\x3b\x20\x13\x83\x47\xa3\x72\xce\x72"
- "\x29\x1f\xc6\xbb\x8e\x7b\x85\x2e\xd6\x63\x4f\x8b\x70\x2c\x27\x7f"
- "\xbd\xe4\x8f\x9f\xd6\xec\xfb\x8e\x50\x1c\x64\x8c\xd9\x78\x1e\x9b"
- "\xee\x2c\x9f\xed\xd1\x07\xd7\xe5\x7b\x21\x2f\x26\xc5\x4f\x8c\xe7"
- "\x76\x8a\x5b\x70\x10\xed\x22\x39\xe8\x77\x8d\x5e\x81\x29\xaf\xcf"
- "\x5e\xa3\x27\x5d\x91\x17\xf8\x50\xfd\xb7\x3f\x88\xb8\xae\xa7\x74"
- "\x89\xb7\x7d\x60\xf5\x31\xfa\xfe\xe3\xb7\xd2\x7e\xcb\xbd\xa9\x17"
- "\xf5\xef\xfa\x2e\x46\x8c\x6b\xb0\x37\x05\x63\x5a\x86\xc6\xae\x24"
- "\x9c\xd9\x33\x1b\x65\x12\xce\x34\xe6\xeb\x25\xb6\x24\x92\xbe\xd2"
- "\xd0\x13\x5b\x6a\x5a\x4f\xb3\x3c\x8c\xe3\x9a\xb4\x52\x11\x5b\x62"
- "\x18\xf0\x5d\x59\x01\x3c\xe9\x8a\x8f\xde\x01\x3c\x21\x1c\xd8\x09"
- "\xfc\x50\x56\x98\x07\x17\x75\xb2\x31\x1a\x8e\x10\xef\x45\xd7\x19"
- "\x18\xa3\xc6\x2a\xa4\xa1\x9f\x14\xe0\x3a\xf0\x24\x7e\xfb\x72\x16"
- "\xb7\x1d\x63\x74\x07\xe1\x08\xf8\xe2\xc9\x36\xe0\xc8\x52\xe0\x48"
- "\xb6\x88\x2d\x6c\xde\xa9\x97\xf8\xb1\xaf\x71\x8d\xde\xa1\xc5\x16"
- "\x17\xf4\x4d\x7c\xa7\x96\xc6\x47\x6a\xbe\x38\xdb\xe6\xa7\xf5\x69"
- "\x85\x35\xac\xb6\x1d\x63\x64\xab\xbd\x9c\xd2\xc4\xbc\x5d\x9a\x36"
- "\x58\x91\x63\x2d\x91\x68\xf2\xf2\x19\x96\x20\xe2\x6f\x7e\x6d\x1e"
- "\xbc\x21\x83\x8d\xd9\x79\x86\xc5\xed\xcc\x60\xf1\x98\xaf\xfa\x9d"
- "\xa8\xc3\xcc\xe7\x4d\x4c\xc4\x70\x88\x18\xd7\x84\xf4\x5e\x63\x38"
- "\x80\xaf\x36\xef\xa4\x39\xb3\x28\x3e\x50\x27\x9f\x63\x4b\xb9\x1f"
- "\xb4\x13\x3e\x97\x74\xf7\xc9\xd8\x8e\xa6\x9f\x39\x25\x9f\x7f\x9f"
- "\xea\xb3\x2f\x89\xce\x9b\x0f\x6c\xd1\xdd\x47\xb1\x10\x2b\x6c\xcb"
- "\x99\xae\x45\x7b\x06\xde\x53\x41\x5f\xdd\x9e\xcf\xf2\x95\x28\x27"
- "\x70\x02\xbc\x13\xf9\x58\xee\xd7\x3c\xbc\x4f\x9c\x1f\xf0\x3b\xb6"
- "\xec\xa5\xf6\x2a\x9b\xb6\xec\x7f\xb9\x85\x25\xf0\xe7\xd0\x1f\xcf"
- "\xa2\xad\x2d\x2c\xae\xa4\x05\x6d\x5d\x2a\xdb\xaa\xc5\x52\x57\x0a"
- "\x0e\x87\xe3\xd9\x65\xe3\x1f\x79\x9e\xa3\xf8\x47\x13\x1c\xc0\xb0"
- "\xab\xf8\x0d\x8c\xd5\xb4\x0a\x7f\x17\x1d\x2e\xdf\x27\x8c\xbe\x4b"
- "\xfa\x23\xd7\x39\x31\xa6\xcf\xd3\x58\x56\x4a\xd7\x26\xa7\x34\x60"
- "\x6c\x77\xa4\x91\x2e\x2d\xf9\x60\xa3\x87\xfc\x4b\x08\x9e\xcf\xad"
- "\xbb\x37\x8e\xf8\xb4\x43\x48\xa3\xb1\x1f\x32\xe6\xe3\x68\xcc\xd3"
- "\x73\x31\xee\xf1\x9e\xab\xe1\x0b\x46\xe5\x85\x96\x43\xfd\xaf\x95"
- "\x85\xf9\x78\x82\xca\xa2\xb1\x40\x7a\x1e\x9a\x6b\xb2\xef\x2b\xc8"
- "\xae\xdc\xcc\x63\x67\x27\xc8\x7b\x0f\xf9\x2d\x31\xd1\x18\x10\x63"
- "\x05\xf8\x4d\xfe\x50\x39\xb7\x86\x61\x9c\x51\x3d\x07\xa3\xbf\x13"
- "\xb4\x71\x81\xb4\x98\x9e\x63\x63\xd8\x2a\x13\xc9\x34\x31\xf4\xfb"
- "\x9b\x8e\x8f\xfe\xf5\xdf\xfd\xf5\x7d\xda\xcc\xc5\x25\x51\x5f\x8c"
- "\x22\xdc\xf4\xb7\x85\x60\x66\xab\xc4\x4c\xc2\x24\x0d\x37\x05\x36"
- "\x09\x1f\xfc\x15\x64\x5f\x2b\x6d\xad\xfb\x89\x9b\x35\xad\x41\xdc"
- "\x9c\x6c\x0b\xc1\xcd\x56\xde\x09\xfe\xbd\x17\xdc\x7c\xe0\x44\x77"
- "\xdc\x7c\xe0\x93\xee\xb8\xf9\xb3\xfb\x7a\xe2\xe6\xa5\x98\x39\xe1"
- "\xba\xde\xf0\x12\x72\xcc\xa8\x16\xdd\x83\x9e\xbe\xb1\x72\xc2\xa4"
- "\xfe\x63\xe5\xc4\x27\xbb\x63\xe5\x84\x75\xff\xef\x62\xe5\xc4\xd3"
- "\xdd\xb0\xd2\xf4\x0d\xb1\xb2\x45\x60\x65\x0c\xff\x27\xe6\x84\x8a"
- "\x1f\x3b\x9f\xed\x03\x2b\x9f\xbd\xc2\x5c\x78\xae\x2f\xac\x7c\x70"
- "\x62\x77\xac\x7c\x30\xa7\x3b\x56\x3e\x78\x5b\x10\x2b\xd5\x67\xdf"
- "\x0a\x56\x3e\x38\xe1\xbb\xc1\xca\x07\x27\x08\xac\x3c\x43\x58\xf9"
- "\xb3\xd1\x57\xc6\xca\x09\xc9\xbd\x63\x25\xd2\x05\x56\x4e\x48\x0e"
- "\x62\xe5\x27\x57\xc0\xca\x49\x03\xfa\x81\x95\x31\x02\x2b\x4d\x7d"
- "\x60\xe5\xb3\xa0\x95\x3a\x2e\xc4\xd8\xeb\x31\x36\x54\xac\x34\x07"
- "\xb0\xf2\x1b\x8c\x8f\xfe\xf5\xdf\xa4\xf0\xcb\x61\xa5\xe2\x90\xfc"
- "\x25\x61\x25\x8f\x55\xb1\x32\xdd\xc7\x96\x9f\x00\x46\x1e\x6f\x11"
- "\x67\x53\x84\x2d\x30\xfe\x72\x9f\x24\x2c\x5a\x58\xf7\x06\xe8\xe5"
- "\x72\x97\x0b\x6c\x12\xe7\xb9\x92\x08\xab\xca\x91\xb7\x38\xc0\x77"
- "\x0a\xec\x3c\xa1\x62\xe7\x74\x15\x3b\x67\xfe\x27\xb0\xf3\x29\xea"
- "\xcb\x87\x86\x5f\xd4\x6b\xd8\xb9\x09\xd8\xf9\x90\xe0\x1f\x68\x6f"
- "\x57\x62\x67\xd2\x46\xad\x5e\xa4\xd3\x74\x65\xd1\xd9\x9a\x72\x11"
- "\x7b\xf2\x12\x1c\xfd\xb9\x28\x6f\x81\xf3\xd9\x56\x16\xc0\xd2\xe9"
- "\x41\x2c\x45\x59\xf7\xf5\x8d\xa3\x0f\x39\x02\x38\x5a\x00\x1c\xfd"
- "\x34\x04\x47\x21\x37\xbd\x4e\x98\x07\x1c\xed\x10\x38\xba\x4f\xc5"
- "\xd1\x9f\xff\xe6\x83\xe9\xc0\xd1\x9f\x6b\x38\xfa\xd0\x71\x6f\xc1"
- "\xbb\x3e\x6f\xe1\x95\x71\xb4\x43\xe0\xa8\xed\xff\x3e\x8e\x56\xf6"
- "\xc0\x51\xc8\xae\x14\x4f\xbd\x57\x1c\xd5\xc6\xa3\xc0\xd1\xfc\x20"
- "\x8e\x0a\xba\x3e\x7c\x4f\x6d\x2a\xe8\x9e\x6a\x13\xb2\x5b\x00\x47"
- "\x6d\xe5\x12\x47\x91\x26\xf4\x27\x8b\x81\xa3\x18\x7f\xf6\x1a\xf2"
- "\x9b\xc5\x12\x51\x47\x13\xe1\xeb\xcb\x98\x33\x44\xa3\x00\x9e\x3e"
- "\x8b\x39\x43\x18\xd3\x86\x39\x03\x1c\x9d\x79\xde\xc4\xc4\x7c\x29"
- "\xc4\x7c\x69\xe9\x23\x7e\x98\x66\xc3\xdb\x27\x9e\x3e\xbc\xa5\x3b"
- "\x9e\x3e\x5c\xd5\x1d\x4f\x1f\x5e\x19\xc4\x53\xf5\x19\xe1\x29\xfa"
- "\x4c\xd9\xe8\x34\x10\xa6\xfe\x6b\x78\xfa\xf0\xe6\x00\x9e\xea\x55"
- "\x3c\x7d\xf6\xca\x78\x2a\xf6\x06\xfb\xc0\xd3\x50\x6c\xe8\x1b\x4f"
- "\x1f\xde\x1c\xc4\xd3\xa4\xe7\x03\x78\x5a\xdf\x17\x9e\x3e\x54\xdc"
- "\x3b\x9e\x22\x5d\xe0\xe9\x43\xc5\x01\x3c\xad\xef\x05\x4f\x7f\x1e"
- "\x8a\xa7\x8f\xcc\x92\x78\x5a\x2e\xfd\x6b\x00\x53\x6b\xdb\x31\x3e"
- "\x68\xce\x65\x15\x0b\x4c\x55\x80\xa9\x14\x53\x95\x62\xca\x90\x0d"
- "\x7e\x6f\x98\x2a\x31\xd7\xcd\x08\x57\x69\x6e\xda\x1f\x81\xbc\x8b"
- "\xb5\x08\x34\x11\x6b\xaf\x46\xbf\x97\x43\xf0\x35\x65\x99\x89\x78"
- "\xbb\x6e\x63\x45\xd1\xc6\x4a\x5b\x3c\xd9\x16\x77\x1b\x2b\xfd\xeb"
- "\xcb\x47\x52\xfb\xc2\xd6\xbe\x64\xf7\x0f\x48\x76\x7f\x9c\xe9\x57"
- "\x3c\x0e\x7c\xb5\x92\xec\x5e\xd6\x43\x76\x2f\xbb\x54\x76\xff\xe8"
- "\xf2\x38\xda\x2f\xd9\xfd\x09\xea\xc3\xc9\x33\xba\xe3\xe8\xe4\x59"
- "\xdd\x71\xf4\xd1\x4f\xa8\x5e\x12\xc7\xcb\x7a\x97\xdd\xc5\x3c\x9f"
- "\xbc\x27\x20\xbb\xd7\x77\xc7\xcf\xa0\xec\xfe\xe8\xfa\xbe\x71\x74"
- "\x72\x7d\x37\x7e\x74\xa6\x8a\xa3\xb3\x55\x1c\x9d\x1d\xc4\xd1\xa3"
- "\xc7\x34\x7e\x74\xca\xf9\xf7\xeb\x43\x71\x74\xca\xc8\x00\x8e\x36"
- "\x5c\x8a\xa3\x1a\x86\x12\x9e\x52\x39\xa4\xcb\xda\x0d\x9c\x7e\x73"
- "\xb6\x4d\x2f\x75\xb5\xa9\x44\x3b\x43\x4f\x5d\x6d\x4d\xeb\x79\x96"
- "\x37\x9d\xf0\xb4\x58\xe0\xa9\x51\xc7\x66\x01\xfb\x86\xd1\x39\x84"
- "\x12\xda\xd7\xcf\x96\x31\x99\x48\xbf\xa4\x2c\x95\xf1\x0d\x35\x3d"
- "\x13\xda\x2b\xf6\xf3\x67\x7c\xa2\x62\x2a\xc5\x2d\xc7\x98\xdb\x7e"
- "\x01\x98\x9a\xdd\x0b\x6f\xba\x02\x98\xba\x3c\x84\x37\xc5\xdc\xdf"
- "\x37\xbb\x27\xa6\x26\xff\xaa\x96\xc6\x0a\x61\x6a\x37\x39\xbe\xec"
- "\xbf\x81\x1c\x9f\x7c\xb2\x3b\x96\x3e\x1a\xd3\x1d\x4b\x93\xdf\x0f"
- "\x62\xa9\xfa\xec\x5b\xe1\x4d\x93\xdd\xdf\x0d\x6f\x9a\xec\x0e\xca"
- "\xf1\x8f\x1e\x08\x60\xe9\xf1\xbe\xb0\x74\xb2\xbb\x77\x2c\x45\xba"
- "\xc0\xd2\xc9\xee\x00\x96\x1e\xef\x45\x8e\xef\x86\xa5\x8f\xfd\x46"
- "\x62\x69\x99\xe4\x4d\xeb\x35\xde\xb4\xec\xff\x87\x72\xfc\x63\xa5"
- "\xfd\x95\xe3\x3f\x68\x95\xf8\x49\xf8\xa4\x61\x68\x50\x8e\x2f\xeb"
- "\x5b\x8e\xbf\x02\x86\xf6\x8b\x17\x15\x18\xfa\x8b\xdf\x74\xc7\xd0"
- "\x5f\xbc\xd2\x1d\x43\xa7\x0d\xef\x89\xa1\x97\xe2\xe7\x2f\xbe\xe8"
- "\x0d\x3b\xa5\x1c\xff\x44\x65\xdf\xb8\x39\xd5\xd4\x7f\xdc\x7c\xfc"
- "\xb6\xee\xb8\x39\x75\xea\xff\x0c\xdc\x7c\xfc\x9d\x6e\xb8\x69\xfa"
- "\x86\xb8\xf9\x5f\x22\xd3\x3f\xd1\x43\xff\xf9\x44\x0f\xfd\xe7\x13"
- "\x21\xfa\xcf\x27\xbe\x45\xfd\xe7\x13\xdf\x91\xfe\xf3\x09\x73\x90"
- "\x07\x7d\xe2\xfc\x95\x71\x73\xaa\xb9\x77\xdc\x44\xba\xc0\xcd\xa9"
- "\xe6\x20\x6e\x5e\x89\x07\x9d\x76\xa2\x1f\xb8\xf9\xdf\x5c\xa6\x9f"
- "\x76\x59\xfd\x67\x6f\x32\x3d\xe1\xa6\xc0\xcb\xfa\x1e\x32\xfd\xe3"
- "\xa1\x32\x7d\x59\x50\xa6\x9f\x24\x71\xcb\xe5\x73\x74\x97\xe9\xbf"
- "\x75\x1c\xb5\x7e\xe5\x0d\xe8\x43\xd7\x02\x47\xad\xa7\xa9\x6d\xde"
- "\x80\x3e\x74\xfa\xf3\x5a\xbd\xa4\x4c\xbf\x89\xc9\x7a\xf5\x22\xd3"
- "\x0b\xfb\xe1\x27\xef\x09\xc8\xf4\xf5\x3d\x65\xfa\xe9\xa3\xfb\xc6"
- "\xd4\x27\xe7\xf6\x2a\xd3\x93\xfc\x2d\x30\xd5\x26\x30\xf5\xc2\xd6"
- "\x50\x4c\x7d\x6a\x95\xc0\xd4\x07\x35\x4c\x7d\xb2\xcc\x8b\xb9\xe9"
- "\x8d\xb8\x32\xa6\x52\x39\x41\x4c\x4d\xfb\xaf\xc1\x54\xe7\x37\xc7"
- "\xd4\xd0\x33\xb0\xfb\xd0\xf6\x00\xa6\x0a\x1a\x3f\x7d\x5d\x6d\x2a"
- "\x61\x6a\x5a\x0f\xf9\xbe\xac\x77\xf9\xfe\x7d\xa6\x27\xfa\x68\xf2"
- "\x3d\xf5\x81\xc0\x9b\xff\xab\xf2\xfd\xd3\x4b\xba\x63\xeb\xd3\x65"
- "\xdd\xb1\xf5\xe9\x19\x41\x6c\x55\x9f\x7d\x2b\xf2\xfd\xd3\x59\xdf"
- "\x8d\x7c\xff\x74\x56\x10\x5b\xa7\x3f\x7a\x65\x6c\x7d\x32\xbd\x77"
- "\x6c\x45\xba\xc0\xd6\x27\xd3\x2f\x8b\xad\x0f\x86\x62\xeb\x8c\xfb"
- "\x34\x6c\x0d\xca\xf7\x18\x1f\x34\xff\xb2\x1c\xff\xba\x7c\xff\xd0"
- "\x77\x2d\xdf\xcf\x48\xec\x97\x7c\xbf\x15\x38\x0b\x59\x7c\xc5\x87"
- "\x90\xef\x1f\x55\xe5\xfb\x86\xd2\x1e\xf2\x7d\xe9\x25\xf2\x7d\xee"
- "\xa3\x2a\xa6\x62\x4e\x09\x4c\x9d\x5d\xf6\xaf\xcb\xf7\x8f\x51\x1f"
- "\xce\xbc\xa7\x3b\xa6\xce\xbc\xaf\x3b\xa6\xce\xfa\x90\xea\x25\x31"
- "\xbd\xb4\x77\xf9\x5e\xcc\xf3\x99\xeb\xbb\xc9\xf7\xa8\xdf\xa5\xf2"
- "\xfd\xac\x55\xdd\x30\x75\x66\x28\xa6\xce\xac\xe8\xc6\xa7\xa2\x5d"
- "\x84\xa9\xaf\x7d\x2a\x31\xf5\x77\x9f\x86\x60\xea\xe4\xdf\xa9\x98"
- "\x9a\xf2\xd5\xfb\x53\x43\x31\x75\xa6\x4f\xc3\x54\x81\x97\x33\xbd"
- "\x7a\xbb\xf5\x52\xbb\x13\x61\xef\x43\xb6\x40\x28\x9b\xce\x8b\x51"
- "\x99\x7b\x3e\x4d\xbb\xb2\xbd\x89\xb5\x77\x7b\x13\x57\x96\x9b\x55"
- "\x37\x39\x84\x9d\x49\x09\xd9\x99\xac\x62\xa3\x4b\x3a\xa5\xef\x01"
- "\xe1\x23\xb1\x0f\xbf\x03\x33\x9e\x0c\xe2\x2c\xd9\x64\x6d\x27\x9b"
- "\xac\x0b\xd2\x06\x08\xfd\x7d\xa9\xaf\x01\x8d\x6f\x02\x1e\xbc\xf5"
- "\x69\x4f\x9c\x4d\x5d\x59\x4b\xe3\x67\x7a\x5a\x0f\x99\xbf\xf4\xbf"
- "\x81\xcc\x9f\xfa\x51\x77\x7c\x9d\x65\xe8\x8e\xaf\xa9\x07\x82\xf8"
- "\xaa\x3e\xfb\x56\x78\xd7\xd4\xe3\xdf\x0d\xef\x9a\x7a\x3c\x28\xf3"
- "\xcf\xfa\x7d\x00\x5f\xeb\x42\xf0\xf5\xd3\x50\x7c\x9d\xe9\x14\xf8"
- "\xfa\x69\x4f\x7c\x9d\xe9\x94\xf8\x3a\xd3\x19\xc0\xd7\xba\x1e\x32"
- "\xff\xa7\x3d\xf1\x75\xf6\x16\x81\xaf\x0d\xa5\x3d\x78\xd7\xd2\x2b"
- "\xcb\xfc\x0d\xff\xdd\x64\xfe\xd9\x7d\xfa\xff\xed\x55\xe6\x27\x4c"
- "\x4d\x97\x98\x4a\x98\xa5\xe1\x6a\x50\xe6\x2f\xed\x53\xe6\xbf\x12"
- "\xae\xf6\x8b\x57\x15\xb8\x3a\x67\x4b\x77\x5c\x9d\xf3\x52\x77\x5c"
- "\x7d\xe6\xba\x9e\xb8\x7a\x29\xa6\xce\x39\xd1\x1b\x9e\x4a\x99\x7f"
- "\x7e\x75\xdf\x58\x3a\x37\xbc\xff\x58\x3a\xef\xee\xee\x58\x3a\x77"
- "\xd2\xff\x5c\x2c\x9d\xf7\x7e\x37\x2c\x35\x7d\x43\x2c\xfd\x2f\xd1"
- "\x03\xcc\x1f\xdd\x1d\x4b\xe7\x4f\xed\x8e\xa5\xf3\x07\x05\xb1\x54"
- "\x7d\xf6\xad\x60\xe9\x7c\xcb\x77\x83\xa5\xf3\x2d\x41\x5e\x75\xbe"
- "\xff\xca\x58\x3a\x37\xb2\x77\x2c\x45\xba\xc0\xd2\xb9\x91\x41\x2c"
- "\xfd\xe4\x0a\x58\xfa\xcc\xc9\x7e\x60\x69\x77\x3d\x40\x4f\x2c\xfd"
- "\xce\xf5\x00\xcf\xb8\xfb\xa5\x07\xd0\xb0\xf4\xd1\x4b\xf5\x00\x84"
- "\xaf\x42\x0f\x00\x7a\x69\x18\x26\xf4\x00\x13\x24\x96\xb9\x7c\x6b"
- "\xba\xe9\x01\xbe\x7d\x6c\x4d\x3b\xeb\x0d\xe8\x53\x0b\x80\xad\x69"
- "\xc2\x17\xa8\x37\xa0\x4f\x4d\x5f\xaf\xd5\x4b\xea\x01\xd6\x32\x59"
- "\xaf\x5e\xf4\x00\xf7\x53\x79\x0b\x26\x76\xd3\x03\x84\x60\x2d\xca"
- "\xba\xa7\x6f\x9c\x5d\x90\xde\x4d\x0f\xd0\x18\xc4\xd9\x0b\x64\xa3"
- "\x0e\x1c\x14\x38\x1b\x1b\x8a\xb3\xcf\xee\x10\x38\x7b\xbf\x86\xb3"
- "\x0b\xca\x3b\x30\x37\x3b\xfa\x8b\xb3\x74\x8e\xe0\xd3\xd4\xef\x06"
- "\x67\x2b\xfa\x81\xb3\x21\xba\x81\xb7\x40\x8f\x00\xce\x0a\xba\x3f"
- "\xf7\xe3\xda\xe9\x84\xb3\xa9\x3d\x74\x03\xa5\xbd\xeb\x06\x8e\x7c"
- "\x17\xba\x81\xe7\x36\x76\xc7\xdb\xe7\x2a\xbb\xe3\xed\x73\xcb\x82"
- "\x78\xab\x3e\xfb\x56\x74\x03\xcf\x39\xbe\x1b\xdd\xc0\x73\x8e\x20"
- "\xde\xa6\x2f\xbc\x32\xde\x2e\xc8\xea\x1d\x6f\x91\x2e\xf0\x76\x41"
- "\xd6\x65\xf1\xf6\xfe\x50\xbc\x5d\x38\x43\xc3\xdb\xa0\x6e\xa0\x54"
- "\xd5\x0d\xac\xb9\xb2\x6e\xa0\xa1\x0f\xdd\xc0\xc4\xef\x5a\x37\xb0"
- "\x70\x7a\x7f\x74\x03\x17\xb7\x4a\xbb\xfd\x15\x64\xb7\x3f\x03\xf8"
- "\x9b\x7c\x0c\x34\xb8\xb2\xdd\x7e\xae\x66\x7f\x9a\x5a\xac\xe2\x6c"
- "\x71\xaf\xba\x81\x0f\x9a\xfb\xd6\x0d\x7c\x70\x3c\xd4\xfe\x34\xe3"
- "\xc9\xee\xfb\x56\x19\x33\xb4\x7d\xab\x0f\xfe\x46\x38\x9b\x29\xe2"
- "\xa0\x29\x9b\x97\x30\xe9\xab\x3b\x73\x2e\xd5\xb3\x37\x3b\xfe\x7d"
- "\x4a\xe8\x5e\x56\xc6\x5b\x01\x5d\x41\x1d\xe1\x6d\x31\x53\x78\x5a"
- "\x04\xf9\x0a\x17\xba\x82\x27\x68\xec\x65\x0e\x0f\xc5\xdd\x83\x1f"
- "\x87\xe2\x6e\x46\x93\x86\xbb\x7e\xe0\xee\x81\xc6\x62\xa9\x7f\x7d"
- "\x4a\xda\xa6\xee\x7e\x2a\xc4\x36\xf5\xd8\xbb\x2a\xee\x2e\x3a\xf9"
- "\xbe\x1b\xed\xbf\x9c\xfd\x14\xde\x7f\xe3\xe3\x6f\x6a\x83\x5a\xdc"
- "\xab\xed\x94\x8a\x4f\xbd\xda\x4f\xa1\xae\xa6\x1d\xea\x5c\xf5\x63"
- "\x9e\xee\x08\xb1\x9f\x2a\x59\x8e\xf9\xac\x9e\x2b\xb9\xac\x1d\xea"
- "\x53\x41\x3b\x54\xbe\x39\x6b\x3c\xad\x6f\xca\x96\x25\xac\x93\xa7"
- "\x85\xf1\x98\xac\xf1\xf4\xfd\xae\x2e\xac\x3b\x0f\x58\xc3\x54\xb9"
- "\xce\x02\xec\x19\x26\xe9\x6e\x1b\xe9\xc7\x5a\xe3\xc7\x5a\xa3\x6c"
- "\xce\xb2\xf8\x88\x37\xd9\x9a\x15\x57\x02\x39\xcf\x57\x20\x62\x17"
- "\x0e\x2e\x82\xac\xf7\x32\xc9\x79\x67\x30\x37\xec\xf1\x7a\xaa\x8f"
- "\x86\xa3\xc6\x66\xb4\xe3\xcc\xe5\x79\x39\xdf\xd7\x41\x1c\x75\xfe"
- "\xfc\x03\x7c\xf3\xf9\xa8\x5a\x1a\xbb\xd6\xe0\x99\x02\xc1\x33\xf7"
- "\x61\x2b\x4b\x75\x91\x3e\x1b\x31\x16\xbe\x05\x9d\x44\x68\x7d\xba"
- "\xe3\xfa\xf3\x0b\xba\xe3\xfa\xf3\x25\xdd\x71\xfd\xf9\x47\x83\xb8"
- "\xae\x3e\x03\xae\xfb\x0b\x24\x1f\xed\xdf\xf8\xaf\xf2\xd1\xcf\xa7"
- "\x69\xb8\xae\xa8\xb8\xbe\xf3\x1b\xe0\xfa\x65\xf9\xe8\x10\x5c\xea"
- "\x1b\xd7\x9f\x4f\x0b\xea\x24\x32\x27\xf6\x6a\x23\xfb\x71\x28\xae"
- "\x67\xb4\x0a\x5c\xff\xb8\x27\xae\x23\x5d\xe0\x7a\x46\x6b\x9f\xe7"
- "\x09\x3e\xee\xb9\x9f\xb6\xf8\x56\x81\xeb\xf5\xaa\x8d\x6c\x5d\x3f"
- "\xce\x13\xd4\x4b\x4c\xd7\xb0\x9c\xf4\x55\xdf\xad\x4e\x62\x71\x7c"
- "\x7f\x74\x12\x02\xcb\x5b\x25\x96\x13\x36\x6a\x78\xfe\x4d\xce\x13"
- "\x5c\x09\xcf\x35\xbe\x99\xf0\xbc\x2f\xbe\xb9\x3b\x9e\x67\xdd\xda"
- "\x1d\xcf\xb3\x6e\xeb\x8e\xe7\x39\xb7\x76\xc7\xf3\x9c\xf8\x9e\x78"
- "\x7e\x29\x96\x67\xad\xec\x0d\xc7\x6d\x4f\x90\x8e\x62\x69\x7d\xdf"
- "\x18\x9e\x55\xd6\x7f\x0c\x5f\xf2\xca\xff\x38\x0c\x37\xf5\xc4\xf0"
- "\x25\x6e\xc2\x20\x7f\x61\x0f\x0c\x7f\x56\xc5\x70\x15\x47\x5e\x6e"
- "\x51\x79\xe1\x9e\x18\xde\x8a\x76\x5c\x41\x1e\xf7\xfd\xb3\x27\x86"
- "\xff\x1f\xf6\xbe\x3f\x2e\x8a\x3a\xff\xff\xcd\x80\x85\x85\x8a\xb6"
- "\x78\x64\x56\x9b\xe1\xb5\x96\x96\xdd\x47\x2f\x2d\xbd\xc3\xc2\xc2"
- "\x0e\x95\x3c\xed\x50\x01\xd1\xa0\xd0\xf3\x07\x22\x22\x2a\x02\xfe"
- "\x3c\x21\x40\x48\x30\x34\x50\x2c\xe9\xb4\xc4\xa8\xf4\x4e\xaf\xb4"
- "\xb5\xf4\x0e\x8c\x5f\x76\x58\x58\x58\xab\x87\x86\x86\xb5\x22\xea"
- "\x02\xbb\x3b\xdf\xd7\x7b\xde\xb3\xcc\xcc\xee\xcc\xee\xce\x2c\x20"
- "\xf6\xf5\x0f\x1e\xc0\xec\xcc\x7b\xdf\xf3\x7e\x3d\xdf\xcf\xf7\xf3"
- "\xf9\x9a\xf7\xfb\x3d\xf1\xa7\x04\x1c\xee\xed\x80\xc3\xe7\x91\x3c"
- "\x88\x60\x5e\xae\x44\x2e\x04\xee\xa3\xbe\x40\x42\x9b\x5b\xda\x8c"
- "\x5f\x1f\x21\x87\x2f\x1b\x26\xe4\xf0\x65\x11\x42\x0e\x5f\xe6\xc3"
- "\x71\x38\xfb\x59\x87\x68\xf3\x65\x43\x3b\x5c\x9b\x5b\xf0\x61\x97"
- "\xc3\x97\x0d\xe5\xb4\x79\x42\x4f\xc7\x1c\x1e\x57\x22\xce\xe1\x70"
- "\x9c\xe1\xf0\xb8\x12\xc9\x75\x0e\x36\x1c\x9e\x70\x51\x06\x87\x0b"
- "\x73\x21\x16\x0e\x67\x73\x21\x3b\x78\xb9\x10\xd3\x1a\x92\x0b\x29"
- "\xb8\x44\xb0\xd1\xdb\x8d\xe0\x14\xf0\xe3\xbb\x9d\xb2\xef\xdd\x0a"
- "\x14\xe5\x41\x12\x1a\xe4\xe4\x41\x18\xfe\xc6\x6b\x1c\xa6\x03\x6f"
- "\x57\x3b\xb9\xc6\x21\xd0\xb2\xc6\x21\x4b\x62\x8d\x03\xcb\xe7\xe1"
- "\x2e\xf0\x39\xb3\xc6\x61\x79\x8b\x30\xc7\xbc\xdc\x64\xc9\x31\x13"
- "\x3e\x4f\xea\x25\xe4\xf3\x24\xaf\xf6\x35\x0f\xc0\xf9\x55\x31\x6f"
- "\xd8\xac\x79\x68\xe7\x76\x26\x0f\xba\x22\x4c\xfb\x72\x3d\x6a\xe7"
- "\xf7\x50\x8e\xdf\x2f\xb8\xad\x3a\x2c\xe0\xf6\x73\x7c\x6e\x5f\xb1"
- "\x4e\xc0\xed\xdf\xe7\x09\xe7\x47\x9c\x8b\xe1\x71\xbb\x65\xcd\xc3"
- "\xca\xd5\x65\x75\x0e\xb8\x1d\xae\x77\x7e\x8d\x58\xc7\x72\xbb\x65"
- "\x7d\x83\x28\xb7\xf3\xd7\x37\xf0\xe6\x3f\x60\x6e\x67\xde\xb1\xe1"
- "\x63\xc5\xed\x2b\xa3\x29\xd3\x17\xd0\x1f\x80\xd7\x71\x1f\x31\xd1"
- "\xc0\xed\x4c\x7b\xaf\xfc\x94\xcf\xed\x6d\x6b\x08\xb7\xbf\x75\xc9"
- "\x75\x6e\x6f\xd7\xc3\x7c\x6e\x7f\x1e\x73\x7b\xe2\x21\xb2\xfe\x22"
- "\xc5\xb9\xf5\x17\x56\xf3\x33\xde\x72\x22\xff\x62\x97\xe3\x45\xea"
- "\x25\xe4\xf8\x55\x7d\x85\x1c\xbf\x2a\x40\xc8\xf1\x89\x2d\x1c\xc7"
- "\xb3\x9f\x75\x88\x4e\x5f\xe5\x7d\x73\xf2\x2f\xab\xbc\x39\x8e\x5f"
- "\x75\xd9\xf1\xda\x8b\x15\xe9\xe2\x73\x33\xe0\x38\xc3\xf1\x2b\xd2"
- "\xed\xae\xbd\x10\xe4\xbb\x93\xce\x88\xae\xbd\xa8\xee\xba\xb9\x19"
- "\x7c\xac\x58\xe7\x5f\x94\xe7\xbe\x93\xea\xe4\xe6\x5f\xf0\xda\x8b"
- "\x95\xa7\x78\x6b\x2f\xea\x1c\xaf\xbd\x48\x9c\xe6\x64\xfe\xc5\xce"
- "\xdc\x8c\x13\xc1\xfc\xf9\x6e\xc9\xa7\x85\xfc\x9e\x7c\xa6\x9d\xdf"
- "\xa7\x60\x7e\x5f\x7b\x45\xc8\xef\x6b\xf5\xb8\x9e\x62\x6b\x31\xfe"
- "\x25\x78\xae\x98\x32\x5a\x38\x57\xc3\x2a\xff\x32\x05\x63\x6f\xed"
- "\x4e\x01\xbf\x7f\xcf\xe7\xf7\x94\x48\x31\xed\x8e\xf3\xde\xcc\x9c"
- "\xe2\x70\xde\x9a\xb6\x49\x96\xf9\x6f\xab\x17\x94\x85\xc0\xfd\xeb"
- "\x24\xe6\xba\x85\x93\xb9\x6e\xcc\xdc\x36\x9c\x07\x87\xb2\x3e\x08"
- "\x8f\xa1\x92\x22\x68\x33\x9e\xeb\x66\x3d\xcf\x0d\xcf\x7d\xc3\x73"
- "\xdd\x2a\xa2\xb3\x24\xe7\xb9\x61\x6c\x4a\xcd\x75\x83\x7a\xab\x18"
- "\xae\x3f\xcb\x72\x3d\x3b\xd7\x2d\x3f\x9e\x9b\xeb\x26\xe0\x7a\x91"
- "\xf9\xc3\x87\xbe\x4f\x11\xd7\xf1\xc9\x1c\xd7\xb7\x62\x1d\xff\x8c"
- "\x55\x2e\x86\x89\xc1\xea\xdd\x5d\x9a\x8b\x61\xb8\x7e\x4d\x41\x25"
- "\xc6\x71\x68\x8c\x48\x2e\xc6\x76\x8e\x73\xd7\xe5\x62\xd6\x5c\x13"
- "\x72\xfc\x5a\x8d\x90\xe3\xd7\x9c\xe1\x38\x9e\xfd\xac\x43\x38\x7e"
- "\x4d\xf3\xcd\xc9\xc5\xac\x69\xe6\x72\x31\x6b\x4f\x8a\xce\xbf\x13"
- "\xe4\xd8\x53\xe6\x8b\xe7\xd8\x53\xd8\xf9\x77\x29\xf3\x25\xd7\x84"
- "\xd8\x3c\xd3\x5c\x77\x80\xe4\xd8\x15\xac\x09\xa9\xeb\x6e\xb9\x98"
- "\x75\xfb\xe5\xe6\x62\x98\xb9\xcd\xa7\xf0\xfc\x10\x79\x6b\x42\x1c"
- "\x71\x7b\xbb\x76\xb7\xf3\x0c\x53\xc8\xed\xeb\x0f\x08\xb9\x7d\xfd"
- "\x21\x21\xb7\xa7\x1e\x15\x72\x7b\xaa\xd6\x9a\xdb\x6d\x79\x7d\x43"
- "\x4f\x31\x4e\x8f\x99\x82\x73\x31\xa9\x31\xd2\x7c\xbe\x61\x84\x7c"
- "\x3e\xff\xdb\xd8\xff\xaf\xf9\xdc\xdb\x9a\xcf\xff\x96\xd0\xa5\x79"
- "\x19\x86\xcf\x37\x2e\x10\xf0\xb9\xb7\x03\x3e\xef\xb2\xbc\xcc\xc6"
- "\xe3\x42\x3e\xdf\x68\x10\xf2\xf9\xc6\x62\x8e\xcf\xd9\xcf\x3a\x24"
- "\x2f\xb3\xf1\xd8\xcd\xc9\xcb\x6c\x3c\xc6\x69\xf6\xd4\x9d\x8e\xf9"
- "\x7c\xc3\x18\x71\x3e\x87\xe3\x0c\x9f\x6f\x18\x23\x39\x9f\xda\x86"
- "\xcf\xd3\x56\xcb\xe0\x73\xd1\x39\x2a\xdd\x23\x2f\x93\x96\x22\x37"
- "\x2f\x23\xb5\x4e\x05\xf3\x3b\x37\x3f\x85\xb7\x4e\xc5\xdf\xb2\x4e"
- "\x25\x45\x38\x3f\xa5\xc3\xb9\xfd\xf5\x6c\x21\xb7\xbf\x9e\x2b\xe4"
- "\xf6\x4d\x1f\x0a\xb9\x7d\x53\x89\xa5\x9e\x24\x2f\xb3\xc6\x66\xdd"
- "\x8a\x90\xe7\x5f\xbf\xa6\x9d\x52\x8f\xc4\xb8\x1e\xca\x9a\x2d\xcd"
- "\xf3\xe9\x03\xa5\x78\x1e\xcf\x57\x79\x3f\x3c\x5a\x84\xe7\x33\x06"
- "\xff\x1a\x78\x5e\x6a\x1e\x0a\xe3\x83\x80\xe3\x31\xdf\x33\xfc\xce"
- "\x72\x3d\xe6\x79\xd3\x27\x62\x39\x9a\x8c\x88\xce\xe2\x79\xe9\x1c"
- "\x4d\x66\x58\x65\x28\xcb\xf3\xce\xac\xa1\x39\x2a\xcc\xd1\xe4\xcf"
- "\xeb\xec\x1c\x4d\xe6\x01\x21\xdf\x67\x36\x08\xf9\x3e\xb3\x80\xe3"
- "\x7b\xf6\xb3\x0e\xd1\xef\x99\xfb\x6f\x4e\x8e\x26\x73\x3f\xc7\xf7"
- "\x9b\xb2\x1d\xf3\x7d\xba\x9f\x38\xdf\xa7\xb3\x7b\xb3\xa5\xfb\x39"
- "\xcf\xf7\x59\xed\x7c\x6f\xbb\x7e\x26\x45\xf9\x1c\x99\x71\x37\x3b"
- "\x47\x93\x25\xc9\xff\xf6\xf6\xc7\x50\x9e\xa3\x61\xd7\x24\xce\x11"
- "\xdf\x1f\xa3\xcc\xce\x1c\x99\xb2\x72\x3e\xd7\x67\xaf\x12\xce\x45"
- "\xcc\x5e\x6d\x99\x8b\x58\x56\x89\xb9\x3e\x77\x8f\x90\xeb\x73\x77"
- "\x4b\xe5\x68\x0e\x99\xf9\x73\x12\xb3\xcf\x08\x73\x34\x85\xc2\x1c"
- "\xcd\x24\x8c\xbd\xdc\xe9\xd2\x5c\xff\x86\xa7\x70\x0e\x38\x59\xa3"
- "\xb8\x27\x9c\x9d\x03\x1e\xce\x9b\x03\xfe\xe2\xdb\x2c\xd7\x6f\x1e"
- "\x5c\x5a\x6d\x44\x72\xe6\x21\xba\x3e\xd7\x7b\xa3\xe8\x1c\x44\x66"
- "\x0c\xb0\x33\x0f\x71\xd6\x69\x6f\x64\xa6\xc0\x87\xc7\xf3\xe6\x21"
- "\xda\xd9\xcf\x58\xc0\xff\xe1\x31\x92\xfc\xdf\x42\x73\xfc\x6f\x7e"
- "\x8a\xcb\xdb\x98\xb1\xce\x67\xe2\xb2\x39\xa2\xb3\xf2\x36\x62\x79"
- "\x12\xed\xb3\x98\xff\x73\xa6\x11\x9d\x1f\xdd\xcd\xf2\x36\x39\xc5"
- "\x42\xde\xcf\xd1\x09\x79\x3f\x27\x97\xe3\x7d\xf6\xb3\x0e\x99\x8b"
- "\x9e\xb3\xf7\xe6\xe8\xfc\x9c\xbd\x5c\xde\x26\x37\xd5\x31\xef\xbf"
- "\xe1\x2d\xce\xfb\x6f\x78\x13\xde\x7f\xc3\xdb\x6e\xde\x46\x30\x37"
- "\x72\xcb\x02\x97\xf3\x36\x16\x9d\x7f\xd3\xd7\xf5\x6c\x99\x2f\x27"
- "\x6f\xd3\xbe\x26\xdd\xa5\xbc\x8d\x38\xdf\x5b\xb4\x7d\x99\x9d\x67"
- "\xae\x42\xbe\x7f\x73\x81\x90\xef\xdf\x5c\x2c\xe4\xfb\xb7\x32\x84"
- "\x7c\xff\x56\xba\x58\xde\x46\xc8\xf5\x6f\x1e\x15\xe3\xf9\x98\x49"
- "\x38\x6f\xf3\xd6\x18\x69\x8e\x7f\xb3\x51\x3e\xc7\x6f\xed\x79\x9b"
- "\xe3\xad\x38\xde\xdb\x9a\xe3\xb7\x06\x74\xa9\xc6\x67\x38\x7e\xdb"
- "\x68\x01\xc7\x77\x60\x2e\xc7\x99\xf5\x24\xd2\xda\x7e\x9b\xd5\xfc"
- "\xf7\x6d\x56\xf3\xdf\xb7\xf1\xe6\xbf\x6f\x3b\xd6\x71\x1c\xbf\xad"
- "\xe3\xe7\xbf\x3b\xc5\xf1\xdb\x78\xf3\xdf\xdf\x5a\xe0\x98\xe3\xdf"
- "\x6c\x16\xe7\x78\x38\xce\x70\xfc\x9b\xcd\x76\xb5\xbd\x80\xe3\xf3"
- "\x5f\xea\x8c\x5c\xce\xcd\x59\x6f\x94\x1f\x2c\x27\x9f\x63\x6f\xdf"
- "\x11\xc9\x7c\xce\x28\x4b\x3e\x27\x46\x22\x9f\xd3\x51\x9c\x5f\x30"
- "\x5b\xc8\xf9\x05\x51\x42\xce\xdf\x99\x2b\xe4\xfc\x9d\x39\xc2\x7c"
- "\x4e\xac\x4d\x3e\x47\xc8\xff\x05\xc7\xb5\x93\xf8\xf9\x9c\x42\x5e"
- "\x3e\x67\xe7\x78\x69\xfe\x2f\x90\xe4\xff\xeb\x0c\xff\x47\x88\xf0"
- "\xff\x8e\xff\x4f\xf8\x3f\xc2\x05\xfe\xdf\x71\x13\xf8\xbf\x70\x1c"
- "\xc9\xf1\x38\xb9\x4f\xca\x21\xf9\x39\x1e\xd7\xc6\x81\xc2\xad\xc2"
- "\x71\xa0\xb0\x5c\x38\x0e\x14\xae\xe6\xc6\x01\xf6\xb3\x0e\x19\x07"
- "\x0a\xf3\x6e\xce\x38\x50\x98\xc7\x8d\x03\x3b\x97\x3a\x1e\x07\x0a"
- "\x24\xc6\x81\x02\x76\x1c\x28\x90\x31\x0e\xbc\x1d\x25\x9d\xe3\x89"
- "\x51\x9e\xe3\x19\x7d\xb3\xd7\x41\xbd\x1d\x29\x2b\xc7\xb3\x65\xa9"
- "\xbe\x1c\xef\x91\x72\x16\x51\x2b\x67\x5b\x72\x3c\x5a\xab\x1c\x8f"
- "\xd6\x26\xc7\xb3\xfc\x2c\xcb\xff\x41\xec\x7a\xd3\x49\x2e\xec\x91"
- "\xc2\xbc\x4f\xfa\x9d\xd9\xc2\x79\xf3\xef\x30\xfc\xcf\xed\xdf\xf7"
- "\xee\x15\x5c\x2f\x32\xfe\x68\xed\xec\x81\xfa\xce\x87\x82\x9c\x4e"
- "\x90\xd8\x1e\x29\xef\x0a\xe6\xdd\x08\xd7\x9b\xbe\x53\x27\xe0\xfb"
- "\x49\x64\xbd\xe9\x7b\x62\xcf\x69\xdb\xf7\xe4\xdf\x75\x99\xd9\x93"
- "\xbf\x7d\x2f\xbf\x5d\x6a\xa7\xf6\x92\x0e\x67\xf7\x92\xfe\xfe\x26"
- "\xec\x25\xed\xec\x9e\xfc\xdf\x5b\xef\xdf\x57\x94\x5a\x55\xae\x45"
- "\x95\x18\x23\xa1\xd6\x7b\x9f\x6a\xc5\xd7\xee\x53\xec\xda\xfd\x85"
- "\x9d\xb3\x0f\x0a\xae\x0f\x33\xe6\xf7\xd3\xa2\xe2\x24\x3d\x53\x1f"
- "\xfc\xee\x6e\x88\x73\xaf\x72\xc0\xaa\x19\xf3\x69\x2c\xe6\xd3\x77"
- "\xfd\x99\x73\xcf\x02\x16\xfa\x05\x1d\xc4\x38\xce\x34\x23\xaf\x98"
- "\x78\xcc\xad\x45\xcc\xbc\x2f\x90\x11\xc0\xad\xe4\xbc\x55\x67\x69"
- "\x93\xa9\xdf\xd4\x83\x50\xff\x3b\xf7\x2d\xac\xee\x51\xa9\x6b\x86"
- "\x7e\x71\x89\x79\x97\x6b\x95\xf1\x86\x16\xc7\xe2\xc8\xc2\x6a\x0f"
- "\x1a\xf8\x77\xc7\xab\xc8\x53\x5e\x3f\x7d\xd7\x8b\xd1\x33\x78\xdc"
- "\xeb\xa7\xf5\xc2\xfb\x80\x58\xb4\x95\xf9\x17\x2e\xbf\x55\x00\xed"
- "\x63\xa6\xc9\xd8\x37\x6b\x2e\xe1\x0d\x1a\xc6\x6b\x68\x4b\x66\x8e"
- "\x2d\xe6\x0d\xe6\x1d\x56\xc0\x1b\xdb\x9b\xb8\xe7\xd8\xb8\x7c\xdc"
- "\x46\x24\x8f\xf2\x2e\x37\xff\x45\x27\xc5\xad\xef\xd4\x8b\x73\xeb"
- "\x3b\xf5\x84\x5b\xdf\xa9\x6f\xe7\x56\x9d\x48\x1e\x45\x30\x8f\xfd"
- "\xef\xec\xfc\x17\xad\x95\xc6\xd6\xde\x82\xfb\xa3\xfc\x5d\xd6\xfc"
- "\x17\x86\x4f\xe7\x13\x3e\xc5\x7c\x65\xe1\x54\x2e\x8f\xa2\x95\xcc"
- "\xa3\x38\xe2\x54\x59\x6b\xf8\x19\x4e\xdd\x7d\x40\xc8\xa9\xbb\x0f"
- "\x09\x39\x75\xef\x68\x6b\x4e\xb5\xe5\xd3\xdd\x2d\x62\x5c\x4a\xf6"
- "\x47\x79\xbf\x41\x9a\x47\xf7\xf8\x49\xf1\x28\x33\x3f\x3d\x9c\x37"
- "\x3f\xbd\x9d\x47\xdf\x1b\x29\xe4\xd1\x3d\xd1\xce\xf2\x28\xf3\x6e"
- "\x93\xef\xbb\xe0\xdd\x26\x8a\x79\x34\xc6\x8a\x47\xdf\x3b\xc9\xf1"
- "\xa8\xf5\xfb\x4d\x1c\xf0\xe8\xbc\xce\xd9\x03\x45\xc0\xa3\x66\x3d"
- "\x53\x1f\xf5\x42\x5c\xd7\xf7\xa7\x09\x79\xf4\xfd\x8d\xd2\x3c\xfa"
- "\xfe\x60\x8e\x47\xc9\x79\x9d\xcb\xa3\xef\x4f\x15\xf0\xe8\x3c\x1e"
- "\x8f\xfe\xc4\x79\x08\x3c\xc7\xa2\x9d\x47\x17\xf0\x78\x74\x9e\x23"
- "\x1e\x7d\x7f\x2a\x6e\x23\xa2\x51\xf7\xde\xeb\x98\x47\xf7\x0c\x15"
- "\xe7\x51\x38\xce\xf0\xe8\x9e\xa1\x1c\x8f\x8a\x68\x54\x01\x8f\xee"
- "\x35\xc9\xe0\xd1\x6e\xbe\x37\xca\x5e\xa3\xac\x5c\x05\xb7\xa6\xd3"
- "\x76\x8f\xd4\x30\xfe\x9a\xa0\x83\x56\xef\x3d\x39\x68\xf3\xde\x93"
- "\xe5\x96\x35\x9e\x81\x2c\xaf\xbe\xe8\x02\xaf\x32\x6b\x3c\xf7\xf5"
- "\x12\xce\x3d\xd9\xd7\xd7\x32\xf7\x84\xf0\xea\x87\x45\x96\x7a\x71"
- "\xef\x3d\x39\x68\x67\x8f\xd4\x7d\xb3\x05\x7b\xa3\x04\xf2\xf7\x46"
- "\xf9\x70\x9a\xf4\x1e\xa9\xfb\x36\x0a\xf6\x46\x39\xb1\xbb\xfd\xbd"
- "\x27\xd6\x7b\xa4\x72\x1c\xfb\xc1\x56\x86\x63\xdb\xf7\xa0\xda\x57"
- "\xde\xbe\x47\xaa\x83\x75\x41\xb8\x9c\x7d\xe7\xa2\x3b\x9f\x63\xb5"
- "\x32\x38\x56\xf0\xde\x13\xeb\x3d\xa6\x4a\xc6\x56\x95\x1e\x44\x95"
- "\x11\x07\x45\xf6\x46\x3d\x78\x53\xdf\x7d\x82\xeb\x25\xce\xb5\x25"
- "\x47\x85\x5c\x5b\xd2\xcc\x9c\x7b\x46\x8c\x6b\x4b\xb2\x39\xae\x25"
- "\xe7\xad\x3a\x63\xc5\xb5\x75\x12\x5c\x0b\xe3\xea\x8e\x0b\x72\xb9"
- "\xb6\x44\xcb\x70\xed\x1a\x96\x6b\x2f\x75\x34\xd7\x96\x68\x39\xae"
- "\xfd\x70\xbd\xe3\x77\x4c\xed\xcb\x12\x5f\x97\xb3\x2f\x8b\x70\xed"
- "\xbe\x2c\xbb\xef\x98\x12\xcc\xf9\xf8\x68\xa9\xe5\x1d\x53\x5c\x3e"
- "\xe0\x20\x9b\x0f\xb8\x95\xdf\x89\xf2\x51\x9c\xdc\x7c\xc0\x97\xe0"
- "\xdd\xf1\xba\xcb\x95\xf8\x9d\x53\xa1\xf8\x9d\x28\x25\x56\xf9\x80"
- "\x12\xdb\x7c\xc0\x74\xfb\x1c\x2b\x2b\x1f\xc0\xac\xbb\xfc\x78\xb1"
- "\x90\x63\x3f\x5e\x2a\xe4\xd8\x7f\xf6\xb2\xac\xb3\xc4\xf5\x91\xde"
- "\x33\xf5\xe3\xa3\xed\xf9\x80\x3a\x21\xb7\x72\xf9\x80\x7f\x1c\x96"
- "\xe6\xd8\x8f\x85\xf9\xdf\x17\x77\x0b\xd6\x59\xbe\x77\x8e\xbf\x0f"
- "\xb5\x65\xff\xa9\x03\x3d\xcb\x6a\xf8\x1c\xbb\x7f\xf8\xad\xb4\x0f"
- "\x75\xfb\x5e\x53\x0e\xe6\x72\xdb\xee\x43\x7d\xa0\xa8\xaa\xb4\x04"
- "\xe1\xb5\x6d\x0c\xdf\x0a\x72\x03\x25\x37\x27\x37\x50\x5a\x22\x91"
- "\x1b\xf8\xc7\x10\x21\xcf\xfe\x23\x94\x39\xf7\xb4\x18\xcf\x1e\x68"
- "\xe1\x78\x96\x9c\xb7\xea\xb4\x15\xcf\xd6\x76\xa4\xa6\xfd\x87\xa6"
- "\x73\x73\x03\xff\xd0\x70\xb9\x81\x7f\x38\xb1\xfe\xf1\xe3\x66\x71"
- "\x9e\xfd\x98\xcd\xbb\x7e\xcc\xe5\x5d\x6b\x45\xde\x97\x22\xe0\xd9"
- "\x7f\x9e\xb4\xac\x7f\x64\x34\x6d\x9d\x45\xd3\x96\xdc\x82\xef\x4b"
- "\xf9\x67\xb5\xdc\xdc\x00\x5e\xe7\x8e\xb9\x15\x73\x97\x85\x5f\xb9"
- "\xdc\x40\x89\x74\x6e\xc0\x01\xbf\xca\x7f\x77\xdf\xc1\x93\x42\x7e"
- "\x3d\x78\x4a\xc8\xaf\x9f\xce\xb6\xe6\x57\x5b\x6e\x3d\xe4\x23\xc6"
- "\xab\x24\x37\xf0\xa9\xb7\x34\xa7\x1e\xf2\x97\xe2\x54\x66\x4f\xbf"
- "\x73\xdc\x1c\x69\x8e\x53\xff\x15\x26\xe4\xd4\x43\xeb\x9c\xe5\xd4"
- "\x9b\xf2\xbe\x14\xc5\x9c\x1a\x6d\xc5\xa9\xff\x6a\xe1\x38\xd5\xfa"
- "\x9d\x29\x0e\x38\xb5\xb3\xf2\x04\x7c\x4e\x15\x68\xd7\x4f\x56\x09"
- "\x39\xf5\x93\x12\x69\x4e\xfd\x64\x22\xc7\xa9\xe4\xbc\xce\xe5\xd4"
- "\x4f\x12\x3b\x37\x4f\xf0\x49\x22\xa7\x5d\x3f\x1d\xe7\x98\x53\x0f"
- "\x05\x8a\x73\xea\xa1\x40\xc2\xa9\x87\x02\x9d\x5f\x53\x7e\x78\xb0"
- "\x0c\x4e\xed\xe6\xef\x52\x39\xec\x27\x3b\x4f\x80\xf3\xad\x98\x4b"
- "\xeb\x5c\xdb\x3b\x24\xc1\xb2\x77\x48\x00\xcb\xb1\xcf\xbb\xca\xb1"
- "\x47\x46\x0a\xe7\x34\x1c\x19\x6d\x99\xd3\x40\x38\xf6\xe8\x69\xe1"
- "\xfb\x51\x6d\xf7\x0a\x11\xee\xa1\x7a\x24\xb5\x3d\x4f\x80\x39\x37"
- "\x80\x9f\x27\x38\x9a\x2a\xcd\xb7\x47\x4a\x04\x79\x82\x7f\x8b\xf3"
- "\xed\x75\x01\xdf\x7e\x56\xc1\xf0\x6d\xfb\x1e\xaa\x47\x9a\x2d\x7b"
- "\xa8\x3a\xd4\xb0\x02\xbe\x8d\xe8\x1a\xbe\x3d\xe8\x3c\xdf\x0a\xdf"
- "\xa5\x62\xbd\x5f\xaa\x76\x71\xd5\x31\xe0\x5b\x66\xbf\x0e\xeb\x3d"
- "\x53\x9d\xdb\xaf\xa3\xb3\xf6\x4c\xc5\xf5\x12\xe7\x5d\xed\x35\x21"
- "\xef\x1e\xd5\x30\xe7\x8a\xf2\xae\xf6\x38\xc7\xbb\xe4\x3c\xa7\x79"
- "\x57\x51\xce\x40\xdb\xdc\xb9\x39\x03\x6d\x33\xc7\xbb\x47\x0f\x39"
- "\xe6\xdd\x23\x07\xc5\x79\xf7\xc8\x41\xc2\xbb\x47\x0e\xda\xe5\x5d"
- "\xc1\x1c\x82\xcf\xf7\x88\xee\xe5\x51\x77\xab\xbf\x67\xe5\xf3\xdd"
- "\x4a\x72\x06\xc0\xc1\x54\x22\xde\xc3\x29\x02\xcf\x21\x70\x9c\x33"
- "\x70\xc4\xb7\xf2\x73\x06\x5f\x14\x09\xf9\xf6\x8b\x3d\x42\xbe\xfd"
- "\xcf\x34\x5c\x2f\xbb\x39\x03\x86\x03\xbe\xb8\xd6\x9e\x33\xd0\x09"
- "\x79\x96\xcb\x19\xfc\xa7\x87\xf4\xb3\xaf\x63\x6a\x81\xbe\x7d\xde"
- "\x6a\xcf\xea\x70\x8e\x6f\x4f\x54\x5a\xe6\x8c\x1d\x7f\xa9\x2c\x98"
- "\xcf\xb7\xc7\x22\x6d\xf6\xac\x9e\xda\x81\x7b\x56\x4f\xed\xe0\x3d"
- "\xab\xa7\x09\xf7\xac\xde\x76\x9d\x9b\x47\x26\x7f\xcf\xea\xe3\x97"
- "\x19\x0e\xc6\x18\xc2\xfb\x56\x3b\x93\x47\xe8\xe4\x77\xad\x08\xb8"
- "\x57\x90\x47\xf8\xf7\x62\x21\xf7\xfe\x7b\x97\x34\xf7\xfe\x7b\x1c"
- "\xc7\xbd\xe4\xbc\xce\xd5\xbc\xff\x8e\xe9\xdc\x3c\xc2\xbf\x63\xb8"
- "\x3c\xc2\x7f\x46\x8a\x72\xaf\xe0\xd9\xd8\x31\x8d\xf8\xb3\x31\x38"
- "\xce\x70\xef\x31\x8d\x64\x1e\xc1\x66\xfe\x56\xe9\xbd\xe4\xd9\x18"
- "\xab\x79\x75\x32\xf2\x08\xdd\x6e\x8e\x41\xa9\xaf\x92\x3c\x02\xe6"
- "\x5b\xcc\x67\x16\xce\x75\x26\x8f\xd0\xf1\x1a\xb7\xec\x5e\x21\xe7"
- "\x96\xdd\x2f\xe4\xdc\xf2\xc3\xd6\x9c\x6b\xcb\xb7\x65\x61\x62\x5c"
- "\x4b\xf2\x08\xe5\xf3\xa5\x79\xb6\x6c\xa3\x24\xcf\x5a\xcd\xcd\xe5"
- "\x78\xf6\xc4\x21\x21\xcf\x96\x95\x2b\xe2\x59\x67\xdf\xc1\xd2\xad"
- "\x78\x36\xc2\x8a\x67\xbf\x9c\xc6\xf1\xac\xf5\x7b\x58\x1c\xf0\x6c"
- "\x27\xbd\x87\x45\x5a\xe3\x7e\x79\x5a\xc8\xb3\xe5\x5e\xd2\x3c\xfb"
- "\xe5\x1e\x8e\x67\xc9\x79\x9d\xcb\xb3\x5f\xd6\x76\x6e\x6e\xe1\xcb"
- "\x5a\x4e\xe3\x96\x17\x38\xe6\xd9\xb2\x2c\x71\x9e\x2d\x63\x9f\x8b"
- "\x95\x65\x49\x6a\x5c\x1b\x9e\xad\x58\x2d\x83\x67\xbb\xf9\x1c\x84"
- "\x8a\x14\x25\xb9\x05\x86\x5f\x75\x56\xeb\x25\x4e\xf3\xd7\x4b\xf0"
- "\x72\x0b\x01\x96\xdc\x82\xf0\xfd\x2c\x09\x96\xfc\xad\x3f\xcb\xbb"
- "\xcf\xba\xca\xbb\x95\xd9\x37\xda\x79\x37\x16\x78\xb7\x92\x59\x1f"
- "\x71\xa3\x9d\x77\xbf\x9a\x60\xa9\x17\xf7\x7e\x16\x89\xdc\xc2\xd3"
- "\x4c\x79\xe7\xdb\x73\x0b\x98\x87\xfd\xf9\xb9\x85\x93\x2d\xd2\x1c"
- "\x5c\xe5\x25\xc8\x2d\x7c\x2e\xce\xc1\xcd\x02\x0e\xae\x1e\xcb\x70"
- "\xf0\xd3\x16\x0e\xae\x0a\xbe\x0e\xde\xf2\xfa\x06\x79\x1c\xdc\xcc"
- "\x70\x70\xe0\xcd\xe1\xe0\xfd\x1d\xc0\xc1\x4c\xbb\x57\x9f\xad\xd2"
- "\x02\x07\x87\x62\x0e\x0e\x74\x2e\xdf\xd0\x45\xef\x68\xc1\xf5\x12"
- "\xe7\xe2\x93\x51\x42\x2e\x3e\x99\xc7\x9c\x2b\xca\xc5\x27\x47\x72"
- "\x5c\x4c\xce\xeb\xdc\x7c\xc3\xc9\xc8\xce\xcd\x37\x9c\x8c\xe4\xb8"
- "\xf8\xab\x21\x8e\xb9\xb8\x4a\x25\xce\xc5\x70\x9c\xe1\xe2\x2a\x95"
- "\x5d\x2e\x7e\x9a\xcf\xc5\xff\x6d\xd7\xbc\x82\x7c\x83\xee\x56\x7f"
- "\x77\xcb\x7f\x25\xf5\xaf\xfa\x01\x94\x72\xce\xed\xbf\x8b\xab\xf2"
- "\x11\xba\xba\x06\xa5\x54\x19\x9f\x46\x70\x0c\xda\xef\xbf\x5b\xab"
- "\x7c\x47\x21\xf3\x1b\xb3\xaa\x31\x1f\x6f\xc6\x3f\xa0\x71\xb3\x28"
- "\xb6\x6f\x31\x6d\xfc\x5f\x66\xbe\x2b\x3e\x8e\xb9\x77\x07\xef\x73"
- "\xb1\xef\xa2\xb3\x66\x05\xb3\xd7\x35\x93\x75\x37\xb3\xa6\x5a\xfe"
- "\xc7\xd8\x84\x7a\x1a\xe8\xec\x59\x41\xfa\xbe\xb3\x82\xc4\xae\x1f"
- "\xe4\x8d\x3c\x7b\xaf\xa6\xe9\xed\x5b\xe8\xe6\xab\xbf\x0d\xd7\x5d"
- "\x4d\x43\x28\x6b\x0b\xad\xbf\xb1\xa1\x66\x38\x5c\x1b\xf2\x26\x9c"
- "\x77\xb5\xdf\x57\xd5\x57\xd7\x04\x23\x38\x16\x60\x39\x06\xed\x86"
- "\xcc\x6b\xdc\x69\x33\x7c\x46\x6f\x19\xf4\xe9\x8e\x24\xe0\xaa\x44"
- "\x84\x1e\xbf\x8e\xfb\x4c\xcd\x54\xc0\x8c\x2a\x13\xca\xdc\x04\x65"
- "\xd1\xbf\xb9\xaf\x19\xf0\xe8\x51\xb9\x0e\xe1\x3e\xbd\x11\xee\xab"
- "\x30\x13\xb7\xbd\xfb\xa3\x79\x34\xe5\x81\xcc\x45\x93\x46\xd1\x3e"
- "\xf1\x7a\x88\x07\xca\x8a\x45\xcc\x7b\x3e\x37\xc1\x79\x34\x95\x4c"
- "\xc3\x38\xa2\xad\x32\x36\x93\x3e\x0d\xf5\x3b\x02\x3e\x96\x86\xef"
- "\xdd\x1e\x8b\xbc\xe1\xc7\x8b\xce\x8d\xc7\x75\xad\x83\x7a\x1d\xc3"
- "\xf5\x92\xba\xc7\x4d\xdb\x60\xdc\xb9\xcf\x17\x8f\x1d\xcc\xf7\xe3"
- "\xef\x66\xbe\x87\x32\x6f\x34\xc1\x71\x7a\x4d\x32\x5d\x95\x60\x44"
- "\x7d\xa0\x2d\x76\x40\xbd\x31\x1e\xcd\xef\x86\xeb\xd6\x0e\x40\x68"
- "\xdf\x8a\x06\xaa\x0a\xea\x6e\x7a\xf3\xbe\x66\x6d\xd2\xef\x10\x7c"
- "\xae\xc7\x9e\xe5\x82\xdb\xa9\xd3\x93\x2f\x22\x84\xf9\x04\xfe\x3e"
- "\xdf\x0c\xe3\xd8\x44\xf8\x7f\x13\xdc\x87\xf9\xaa\xaf\x07\x3e\x17"
- "\x8e\x67\x6b\xe3\xbf\x45\x7d\x62\x90\x67\x26\xdc\x1b\x7b\x6e\x04"
- "\x3e\x57\xe7\x76\xaa\x1e\xd7\x01\xfe\x8f\x83\xff\xf1\x75\x78\x0e"
- "\x19\xa2\x77\x4d\x1a\xc5\x60\x33\x27\x5e\x6f\x1e\x3c\x69\x14\xc3"
- "\x7d\x70\x9f\x9b\xe0\x9e\xe1\x1c\x2f\x38\xc7\x8b\xf9\x9d\x84\xbc"
- "\x73\xe0\x18\x2e\x07\x7e\x7b\x69\x17\xb6\xe2\xb2\x83\x71\xd9\x12"
- "\xed\xe0\x41\xab\xe2\xf5\x34\x60\x1b\x8f\xa9\xea\x24\xb7\x93\xe7"
- "\xdc\xbe\x5e\xd7\xc7\x8d\xa6\xa1\x9f\x6b\xd7\x26\x21\xaf\x2c\x33"
- "\x42\xda\x01\xb8\x9c\xaf\xc3\xa0\x7c\x0f\xdc\x16\x37\x36\x7c\x3d"
- "\x46\xe7\x56\xd3\x80\xdb\x17\xe2\xd9\xac\x1e\x84\xef\xe1\xeb\x1c"
- "\xfc\x3d\xf8\x1a\xf6\x7c\x66\xef\x7b\x5c\x67\x75\x92\x3b\x0d\xff"
- "\xaf\x72\x77\x3b\x8b\xdc\x7d\xbd\x32\xe1\xfa\x44\x1d\xca\xae\xc7"
- "\xd7\xeb\xc8\x75\x80\xa5\xaf\xb3\xa0\x4c\x0f\x7c\x0c\xff\x2f\x51"
- "\x5f\x2f\x4b\xdc\x2a\xa0\xb7\xd9\xc4\xce\x82\x11\xc0\x85\x05\x23"
- "\xb8\xbe\x1f\x24\xe9\x28\x66\x1c\x76\xfb\x86\xf1\x75\x99\x10\x43"
- "\xd3\x5b\xbe\x1e\x9b\xa0\x6d\xcd\x6d\x38\x2e\xe7\xf0\x67\xa7\x70"
- "\x5c\x36\xad\x80\x98\x30\xe7\x7e\x6d\xe0\xea\xcf\x5c\xcb\xc4\xd3"
- "\x0c\xb1\x20\x6b\x37\xbf\xd9\x83\xef\x67\xd3\x75\x88\x63\x7f\xba"
- "\xf9\x58\x02\xd4\x0b\xe3\x16\x30\xb2\x2f\xd6\x40\xe1\x79\x7d\xf8"
- "\xf8\x91\x26\x03\xb5\xe9\x12\xc2\xba\x12\x65\x00\x2f\x17\xc4\x43"
- "\x9b\x43\x99\xb4\x5f\x90\xf6\x09\x4b\x1c\x57\x40\xec\xe2\x01\xbb"
- "\xd0\xe6\x9b\xa0\xfd\xb6\x03\xe7\xe1\xbf\xb7\xc3\xf8\x03\x9a\x4e"
- "\xab\x73\xfb\xa6\x1e\xca\xf3\x2e\xe8\x4f\xeb\x77\xf4\xa7\x1b\xa1"
- "\x0d\xdf\xbe\xb1\xe1\x1b\xad\xa5\x0d\x71\x9d\x36\xc1\xf1\x0c\xf8"
- "\x1c\xce\x1d\x43\x30\xf4\x8d\x97\xe5\x9e\xa5\xda\x33\x7d\x1f\x1a"
- "\x95\xb1\x0f\x0d\x4c\xdb\x87\xc6\xac\xac\x87\x7e\xb9\xe6\x8f\xf4"
- "\x97\xa1\x46\x18\x13\xff\xe5\xdb\xda\x7f\x56\x35\x7e\xf6\x64\x5e"
- "\x7b\x5f\xe1\xfa\x7d\x68\x28\x5e\x1b\x3b\xb9\x11\x21\x3c\x86\x4f"
- "\xee\xf1\x03\x5d\x15\x73\x0d\x99\xfb\xfe\xcb\xd7\xb4\xf6\xd1\x7e"
- "\x93\xae\x21\x74\x5c\xd3\x8c\x92\xe2\x60\x2c\x6f\x6a\x40\x49\xcd"
- "\xb4\xbe\x32\xe5\x22\x02\xee\x09\x20\x6d\x77\x3a\x65\x72\x14\x42"
- "\x78\xcd\xa0\xf9\x27\x0d\xea\x15\x8d\x3c\x12\x4f\x23\xdf\xe4\x7a"
- "\xba\xc1\xb4\x65\xbe\x36\x69\x15\xa2\xf6\x35\xd5\x12\xed\xe9\x76"
- "\xfa\xa5\xc3\x78\x7d\xea\x8d\x10\x34\xcb\xc8\x8e\x47\x39\xf1\x86"
- "\xe4\xb9\xe8\x5e\x7c\x3f\x7d\x18\xed\x55\x7b\x19\xda\xcd\x20\x8f"
- "\x9f\x6b\x0f\x32\xf1\xdc\xb2\x30\x78\xdf\x1c\x03\xe8\xd6\x87\x75"
- "\xc9\x51\x74\x03\xd6\x75\x30\xbe\x30\x5a\xb0\xaa\xc1\x08\xda\x2a"
- "\x12\xc6\x6f\x1d\xfa\xec\x5c\x21\x65\xce\x7d\x58\x27\xef\x3b\x4e"
- "\x0f\x64\xc6\x6d\x3c\x96\x42\xdd\xa7\x69\x50\x0a\x53\x7f\x18\x33"
- "\xfb\xc4\x61\x3d\x45\xff\x80\xeb\x7f\x04\xee\x95\x7e\x28\x2d\x18"
- "\xea\x54\x88\xc7\xcf\xc9\x75\x5a\x54\x6e\x30\xa1\x6d\x97\x98\x36"
- "\xba\x03\xda\xc8\x03\x3e\x8b\x83\x76\xf2\x14\x8b\x1b\x8e\x99\x39"
- "\xeb\x5f\xbe\x66\x77\x12\x1b\x26\x2e\xcd\x24\x2e\x93\x16\x23\x18"
- "\x47\x21\x36\xd9\x24\x36\x66\x9f\xa5\xd5\x38\x36\x32\xef\xa3\x5e"
- "\x6a\x7c\xc1\xdf\x4d\x03\x3e\x30\x2e\xcc\xaa\xa5\xd5\xf8\xbb\x71"
- "\x1d\xf0\xf3\x33\x8c\x83\xc9\xeb\x7f\xa0\x2b\x63\x1a\x50\x15\xdc"
- "\x0f\xdd\x97\x5f\x07\xa3\xcc\x3a\x7c\x1b\x2d\x55\x87\xf4\xc7\x01"
- "\xb7\x8f\x03\x6e\x1f\x07\xdc\xea\x08\x6e\x4f\xd4\x11\xdc\x9a\xa0"
- "\x5e\x2d\xa0\xdd\x57\x4e\x43\x14\xae\xd7\xde\x6f\xf1\x1e\x7d\x50"
- "\xcf\x06\x0e\xbb\x13\x2f\x43\x1b\x59\xf0\xeb\xfe\x68\x3f\xdc\x3e"
- "\x95\xcd\xb5\x28\x19\xe3\xb7\x55\x0c\xbf\x75\xfe\x93\x67\x43\x6c"
- "\x5e\x03\xfc\xfe\xa8\x41\x5e\xf5\xc8\x63\xd5\x34\xc0\x6f\x83\x18"
- "\x7e\xeb\xfa\x7e\x0a\xdf\x69\x83\xdf\x28\x3e\x7e\xbf\x2b\x96\x8f"
- "\xdf\xef\x12\xda\xf1\x3b\x83\xc5\xef\x5c\x2b\xfc\xd6\xf3\xf0\x8b"
- "\xef\x5b\x36\x7e\xbf\xab\x93\x87\xdf\xef\x22\xda\xf1\x0b\xbe\x64"
- "\xdb\xab\x4c\x1b\xdd\x01\x6d\x04\xf8\xfd\x6e\x04\xb4\x93\x28\x7e"
- "\xbb\x3e\x7e\xdf\x23\xe7\xe3\x77\xe6\xa4\xe3\xf8\x9d\x59\x20\x3f"
- "\x7e\x67\x46\x75\x7e\xfc\xce\xe4\xcb\x8b\xdf\x19\xb5\x74\xfc\xea"
- "\x9a\xbb\x4f\xfc\x7e\xd0\x3a\x1f\xbf\x1f\xb2\x1d\xc7\xef\x87\x61"
- "\xf2\xe3\xf7\xbd\xa1\xf3\xe3\xf7\x43\xa8\xbc\xf8\x7d\xaf\x93\x8e"
- "\xdf\xf7\xfb\xa5\xe2\xf7\xdc\xbd\x66\xda\x8c\xe7\xcd\xf5\x0f\x1d"
- "\x8e\x35\x10\xd1\x6b\xba\x0c\xec\x19\xe1\x7f\x0f\xcb\xff\x8c\xa6"
- "\x02\x5f\x6d\xf5\xbf\x97\xd5\xff\xde\x56\xff\xab\xac\xfe\xf7\xb5"
- "\xfa\x7f\xa0\xe5\x7f\x88\x57\x8f\x9f\xdd\x7e\x30\x81\x67\x4b\xd1"
- "\xb9\xe9\xf2\xd8\xcf\xfd\x66\x99\xd4\xd8\xf7\xf9\x89\xd5\x7d\xd3"
- "\x1a\xda\xd0\xcb\x0d\xd1\x6d\x14\x8d\x62\x92\xd0\x7d\x97\xdc\xce"
- "\x7a\xb5\xae\x01\x4b\xe8\x3e\x40\x43\xb7\xa6\x20\x73\x8e\x9f\x6a"
- "\xd2\x72\xc0\x97\x1e\x7c\x62\xb2\xef\x1d\x50\xf6\x6f\xa0\xdd\xf4"
- "\x95\x31\x7a\xd0\xe5\x9f\xd1\xe7\xdc\x74\x2d\xf8\x3e\x1f\x8f\xd1"
- "\x22\xb3\xfb\xa3\x1a\x9a\xd9\xbb\xd9\x4f\xa5\x77\x7f\x74\x00\xf8"
- "\x52\x5d\xc6\x1a\xb3\x67\x55\x63\x0d\xca\xa4\xcc\xea\xc4\x44\xd0"
- "\xf5\x8d\xfb\xd1\xca\x46\xba\x21\xd1\x48\x1b\xaa\x42\xb5\xf8\xb9"
- "\x6d\x43\x55\x42\x29\xaa\xd4\xd7\x20\x3c\xe6\x61\xac\x56\xe9\xf7"
- "\x93\xe7\xc4\xf8\x1c\x38\x56\xa9\xdf\x8b\x2a\xe0\x7f\xed\xc2\xf3"
- "\x70\x9f\x67\xf7\x54\x35\xee\x45\xa6\x1c\x3f\x6f\xb3\xea\xe1\x66"
- "\x5a\xf5\xb0\xa1\xa2\x11\xea\x96\xf3\xb0\x11\xd7\xb5\x12\xea\xc1"
- "\xbc\xa3\x33\xf7\x61\x23\x53\x6e\x73\x35\x93\x43\x30\xe5\xc2\xf9"
- "\x3e\x70\xbe\xcf\xc3\x06\x5c\x3f\x5c\x37\x51\xbf\x97\x13\x1a\x09"
- "\x75\x7f\x7a\x9a\xc6\x03\xd1\xab\x3d\x7c\xe5\xe1\xed\x6c\xb9\xa4"
- "\x8f\xcc\x09\xad\x27\xe5\x7a\x2a\x28\xf7\x9c\xe4\xfc\x27\x3a\x27"
- "\x8c\xad\xaf\xb7\x92\x72\x13\xed\x94\xcb\xd6\x57\xad\xa4\xdc\x1a"
- "\xe9\x72\xc3\xd9\xfa\xfa\x2b\x28\xf7\x7f\x43\xed\x94\xcb\xd6\x37"
- "\x45\x49\xb9\xeb\xec\xc4\x2d\x52\x19\x16\xfe\x57\x6b\x0f\x0b\xca"
- "\x70\x50\x6f\xe7\xfe\xc3\x22\x95\x61\xa0\x5e\x3a\xf7\x01\x18\x50"
- "\x16\xff\x7a\xbb\xf1\x57\x16\xfb\xf3\x92\xef\x7f\xc4\xb1\x57\x16"
- "\xf7\xf3\x92\xf8\xc7\xde\x18\xe2\x04\x9c\x9e\xe6\x6f\xde\x32\x14"
- "\x99\xfb\x87\x52\x6b\xcd\xfe\xe8\xb9\x55\x30\xe6\xe5\xa1\xbe\xcf"
- "\x15\xfc\x40\xfb\x33\x39\xa7\x0b\xaa\x55\xf9\x88\xca\xa2\xcc\x54"
- "\xf1\x8a\x5a\xaa\xca\x38\x0a\xf3\x96\x69\x57\xbc\xc1\xed\x61\x38"
- "\x7e\x14\x54\x77\xf3\x12\x0d\x22\x65\x0d\x45\x99\x49\xfe\x68\xb2"
- "\x09\xe1\x1c\x47\xf3\xa4\xc5\x3f\xd0\x5f\x40\x0d\x26\x5f\x01\x7e"
- "\xcd\x33\xe0\xb1\xb4\x2f\x5c\x6b\x04\x1c\x43\x39\x06\xf4\x81\x59"
- "\xef\x36\x49\xcf\x9c\xab\x07\x3f\xaa\xa7\xb7\x84\x32\x63\x32\x9d"
- "\xac\x41\xeb\xe0\x7f\xf8\xee\xf5\xee\x7a\x44\x6d\x07\xaf\x7a\x63"
- "\xc3\x05\xe0\xfc\x1f\x43\xb1\x7f\x05\x9f\xdc\x98\x7c\x05\xe7\xf3"
- "\xd3\xfc\xf7\x99\xf5\xd4\x5a\xf0\xcd\xf8\xfc\xc7\x63\x10\xf5\x85"
- "\x1e\xe7\x06\x2e\xec\x3d\x1a\x87\x90\x9d\x7c\x8e\x87\x59\x15\x17"
- "\x80\xaf\xc7\xe5\xe0\x3c\xe9\x26\x33\xb4\xb3\x2a\xde\x80\xeb\x4d"
- "\xe7\xcc\x3a\xa8\x5d\x81\xc7\x9c\x1f\x47\x8c\x1f\x42\xdf\xc0\x63"
- "\x08\x8c\x1d\x03\x2e\xc1\xff\x4c\x3e\x60\x0d\x5d\x4d\xab\x06\x35"
- "\xd0\x99\xbd\xfc\x2b\x9b\x9b\x90\x36\xbe\x15\x9d\x73\xfb\x71\x24"
- "\xfe\xee\xab\xaa\x38\xff\x66\x55\x5c\xe0\x8d\x0d\x3f\x0e\xb7\xd4"
- "\x17\x7f\x97\xe5\x38\xce\x7f\x90\x3a\xfe\x18\x7c\x34\x51\xba\x8e"
- "\xf4\xda\x01\xfd\x26\xfb\xd2\x7a\xdc\x96\xda\xa4\x26\xa8\x4b\xc3"
- "\x71\xdc\xde\x74\x4e\x9c\x77\x73\xb2\xe6\x01\x92\x0f\xfc\xb1\x11"
- "\xe7\x95\xe8\x1c\x3f\x92\xdf\xce\xf5\x63\xe6\xea\x60\xee\x07\x0d"
- "\x50\x8b\xb5\xd0\xcf\x6e\x3f\x32\xf9\xc0\x69\x1a\x4a\xa6\x9f\xfa"
- "\x91\xf1\xbf\xda\x07\x70\x3b\x34\x14\xc3\xf7\x3d\x73\xce\xad\xc1"
- "\x9b\xe4\x38\xfc\x7c\xf1\xf7\xc1\x39\xf9\xf0\x9d\xbe\x74\xce\x20"
- "\x1d\x3e\x0f\x3e\x1f\xce\x7e\xae\xe6\x7d\xae\x86\x3a\x87\xb0\x9f"
- "\x07\xb3\x9f\xfb\xf1\x3e\xf7\x8b\x79\x00\xe7\xfc\x1a\x12\xf0\x3d"
- "\xd1\x2a\x3f\x7c\x3f\x2a\xfc\x3c\x81\xb9\x27\x1f\x3f\xc4\x9e\xa7"
- "\x6a\x74\x6b\xc8\xbe\x0a\xf8\x82\xcf\x07\xf2\xae\x1f\xf8\x45\xc2"
- "\x70\xf4\x5c\x01\x6e\xd3\x86\x5d\x3a\x8f\x47\x73\x48\x9e\xe8\xc7"
- "\x42\xa6\x2d\x60\xfc\xe4\x97\xa7\x73\x6b\x88\xc1\x63\x64\x33\xe8"
- "\x48\x38\x67\x23\xfe\x4e\x7e\xfb\x47\xc5\xc6\x2e\x8a\x55\x0f\x8e"
- "\x54\x47\x2e\x98\xad\x7e\x65\xd1\xd2\x85\x71\x63\x07\x47\xde\x85"
- "\x10\x0f\x3b\xde\xf4\x9a\x3e\xb4\x39\x67\xd1\xc6\xaa\x3c\xd0\x6f"
- "\x94\x37\x8c\xe5\xad\x28\x07\xe2\x6a\xea\x9f\x1c\x63\xda\x92\x0c"
- "\x7d\x29\x22\x42\xbb\xe2\x59\x68\xfb\x8b\xcc\x73\x80\x2a\x35\x42"
- "\xe9\xf0\xb9\x76\xc5\x09\x7c\x6c\x02\x73\x2c\x12\x21\x26\x17\xb6"
- "\xc2\x13\x1d\x53\x37\x31\xf9\x34\xf8\x6c\x35\x93\x3b\xbc\x86\x28"
- "\xe3\x1a\x4f\xf4\x71\x52\x35\xf5\xa9\x59\x47\x7d\x6c\xae\xa5\xb0"
- "\x06\xf9\xc2\xb7\x14\x3d\x91\xe0\x89\xf0\xe7\x9f\x25\xc1\x71\xf8"
- "\x1c\x7f\xc6\x94\xc3\xc4\xfa\xe2\x49\x7c\x1e\xce\xaf\xe1\xbf\x93"
- "\xf3\xe8\xb3\x5f\xf8\x82\x8e\x61\x34\xf1\xc5\xc1\xb8\xae\xea\x01"
- "\xf8\xd9\xc5\xc5\x21\xb8\x7e\x3a\xb7\x8b\x1a\xf7\x7c\x38\x3f\x1e"
- "\x79\xfd\xec\x76\xc9\xc7\x9c\xbb\x68\x23\xe6\x05\xe3\x86\x86\x3a"
- "\x7a\x4d\xdf\x85\xdb\xdf\x40\x9e\xf9\x6f\x40\xff\x7c\x03\x79\xdc"
- "\xd8\x70\x09\xe9\x3c\xc6\x4d\xc5\x6d\x0b\xc5\x78\x5d\xa5\xd0\x1f"
- "\xe1\x98\x4a\x87\xb2\x13\xf1\x31\xe8\x7f\xcd\x52\x3c\x73\x1d\xb4"
- "\xa3\xc1\x2f\x08\x99\x55\x8b\x12\x68\x68\xb7\x1b\x7e\x41\xc3\xfb"
- "\xc4\x00\xb6\xa0\x8f\xd1\x3e\x8b\x12\x1a\xdd\x1a\x35\xff\x86\x9e"
- "\x95\x84\xfb\xf4\x96\x88\x88\xf7\xae\x1b\xa0\x6f\x27\xc7\xec\xbd"
- "\xae\x87\xff\x93\xd1\x6e\xf8\xbf\x4c\xbb\x1b\xa9\x27\x61\x3d\x76"
- "\x29\xf5\x4f\x91\xb4\x71\x48\x39\x68\xd8\xfa\x8f\xd0\x97\x35\xa5"
- "\xc8\x2b\x14\xb9\xb7\xef\x23\x1f\x87\xa8\xc9\x3a\xf8\x7f\x29\xa2"
- "\x2a\x0d\x26\xe6\x99\x41\xd2\x68\x9c\xfb\xaf\x40\xf8\x79\x00\x4d"
- "\x6d\xf6\x2b\x6e\x32\x00\x97\x35\xf4\xc0\xf3\xc9\xcd\xde\x9f\x35"
- "\xe0\x6b\x66\x35\xb3\xcf\xd1\xae\xb2\xcf\xd1\xae\x32\xcf\xd1\xca"
- "\x13\x23\xc8\x73\x34\xfc\xfc\x6c\x72\x84\x3b\x8d\xcb\xc3\xcf\xd4"
- "\x7a\x35\x03\x0e\x96\x68\x7a\x9b\x96\x68\xfa\xe5\x35\x21\x55\xa5"
- "\xbe\x01\x55\x35\x96\xa2\xb7\xe2\x91\x8a\xbe\x1a\xdd\xb3\x5c\x7b"
- "\x02\xd1\x6f\x7c\xa2\xfb\x20\x49\xdb\xc3\x84\xf3\x1f\x57\x7d\xef"
- "\xea\xb3\xda\x0d\xf7\xd3\xde\xe9\xb1\x68\xe8\x8e\x26\x34\x7c\xd6"
- "\xf9\x14\x66\x4f\x29\xfc\xfe\x3f\xe3\x55\x8d\xba\xed\xaa\x66\x50"
- "\xcb\x55\xcd\x03\x7d\xf4\xe4\xb9\x5b\xd8\x65\x6f\x84\xe7\xf2\xd2"
- "\x1b\xbe\xc5\xe7\x7b\xe0\xe7\xcd\xc6\xbe\x9f\x35\x60\x2c\xc3\x77"
- "\x0f\xc4\xcf\x6a\x92\x97\x23\x6f\xf3\xff\x34\xa8\x22\xba\x09\x3d"
- "\x01\xb1\xc7\xcf\x25\xb6\x9f\x23\xcf\x25\x4c\xe0\x97\xf0\xb3\x89"
- "\xeb\x57\x35\x14\xad\x5a\xaa\x9b\x38\x57\x8d\x5a\x8a\x82\x00\xaf"
- "\xef\xa1\xe4\x16\xfa\x6c\xd5\x3a\x33\xc2\x39\x6b\x7a\xc3\xa5\xa1"
- "\xb4\xcf\x52\xdd\x71\xcd\x29\x3c\xc6\x8c\xe0\xb8\xe3\xa7\x6b\xca"
- "\xb8\xe3\x27\xe6\x59\x02\x7e\x86\x07\xf1\x8b\xd9\xdb\x84\xe3\x09"
- "\x71\x6d\xd2\x53\x2f\x42\xec\x2a\xea\xdf\x86\xb8\xd5\x0a\xe2\xc6"
- "\xc4\x19\xce\xbb\x10\x09\xf1\x3a\x4f\x62\x58\xde\x0c\xf1\x3b\x84"
- "\xcb\x88\x4b\x29\x8e\x37\x50\xe0\xc9\xa8\x72\xc3\x19\x66\x3d\x0c"
- "\x8e\xe3\xde\xd6\xd2\x1e\x2d\x30\xee\xe0\x67\xa1\xd7\x77\x05\xa9"
- "\x5b\x54\x8b\x42\xda\x54\x8b\xa2\xed\x3c\x17\x25\xf1\x9c\x8b\x3c"
- "\xcb\xeb\x4f\x91\x78\x2e\x66\xe3\x89\xe7\xcf\x2d\xd3\xf4\x36\xde"
- "\x80\x78\x5e\x87\x78\xc6\xe9\xd0\xb6\x58\xa4\xaa\x6a\xa8\xc5\xcf"
- "\x8c\x7a\x4e\xa8\x40\xe8\xc5\x21\xb4\xb9\x42\xfb\x2d\x13\xd7\x7d"
- "\x10\x57\x63\xd6\xbf\x7c\xf1\xb3\xd2\xf6\xb8\xc6\x43\x5c\xaf\x43"
- "\x5c\x2f\x73\x71\x35\xdd\x80\xb8\xde\x80\xb8\xde\x80\xb8\xb2\xcf"
- "\x53\xc3\xe6\x42\x5c\x29\x26\xae\x25\xf8\x79\x2a\x7e\x6e\x85\xe3"
- "\x8a\xe7\x6c\x9b\x97\x69\x06\x32\xcf\x51\x5f\xd1\xa0\x1d\x73\x90"
- "\xe7\x30\x03\x72\x4b\x3e\x84\xbc\xa1\x9e\xde\xbf\xdd\x8f\x28\x28"
- "\x0f\x70\x7f\x0e\xe1\xf8\x56\xed\x37\xa1\x95\xd3\xd1\x03\xc6\x6c"
- "\x12\xe7\x2a\xe3\x01\x9c\x37\x1e\x75\x7d\x99\x86\xda\x1a\x8f\xc6"
- "\xe0\x98\x07\x9d\x57\xa3\xe3\xc1\x15\x36\x31\x37\xe7\xc6\x79\x43"
- "\x9c\x74\x38\xee\xca\xfb\xed\x2f\x3a\xe7\xfb\xed\xcf\xe3\x6e\xf7"
- "\xdb\x8e\xee\xb7\x97\xeb\xc5\xfb\xed\x2f\xc5\xca\xfa\xed\x2f\x7b"
- "\x6f\xf7\xdb\x5b\xa1\xdf\xfe\x92\x67\xdd\x6f\xdb\x75\x4b\x6c\xd4"
- "\x82\xd9\x73\x17\xce\x5d\xf8\x9a\x7a\xce\xf2\xb8\xa8\x25\x44\xbd"
- "\x08\xf4\x8b\xc6\x64\xf6\xa7\x36\xc3\x78\xfd\xa5\x6f\x2d\xfa\x60"
- "\x40\x2d\x65\x9e\xe9\xeb\x41\x67\x7d\x35\xdc\x9c\xf5\x55\xc9\x66"
- "\xd0\xe2\xb8\x7f\xe7\x80\xc6\xbe\xe0\x66\x54\xfd\x67\x20\xe8\xcf"
- "\xd8\x4b\x08\xff\x4d\x9e\x0f\x6f\xce\xc3\x6b\x28\xf3\xb6\xd0\x0d"
- "\x78\x0d\x65\xd9\x31\xac\x2d\x9a\xa6\xdd\x1d\x02\x7e\x62\xa6\x2f"
- "\x6a\x99\x19\x42\xa5\x7d\x8b\x3c\xfb\xd4\xa2\x20\xb3\x99\xa6\xb5"
- "\x49\x97\x40\xf7\xb5\x84\x6a\x67\x5c\x42\x58\xeb\x5c\x70\xbb\x71"
- "\x58\xbd\x62\x35\xfe\xbd\x53\xbd\x62\xc3\x0f\xf0\x7b\x36\x93\xc7"
- "\xe9\x4f\x37\xd0\x5b\x16\x56\x9b\xde\x9d\x14\x8c\x9f\x9d\xee\xe8"
- "\x4f\xd7\xef\x03\xbf\xb1\xaf\xd5\x40\xad\x6d\x02\xdc\xac\x79\x90"
- "\xc6\xcf\x40\x71\x1b\xac\x8d\x85\xb6\x07\xdd\x4b\xb4\xe9\xf5\xa3"
- "\xb8\x7f\x81\xbe\xaa\x3f\x72\xa1\x96\xc2\xcf\x80\x71\x9f\x6b\x56"
- "\x0d\xd2\xad\x83\x7b\x81\x7a\xea\xb6\x6e\xa1\xeb\xf4\x3e\x8b\x36"
- "\x7a\xa8\x11\x75\x63\x43\x53\x29\x68\xc0\x66\xac\x59\x36\xc2\x67"
- "\xa9\xf0\x19\x79\x1e\x79\x3d\x91\xbe\xe3\x4a\x0e\xe6\x39\xc0\xb5"
- "\xdb\xcf\x6e\x57\x7d\xf0\x3e\x52\xe9\xc4\x9b\x34\x18\x72\x17\x45"
- "\x1b\x8b\x82\xd4\x46\xac\x29\x07\x07\x0d\x6f\xc9\x5d\x14\x62\xcc"
- "\x5d\x94\x30\x6d\x08\xf3\xdc\x1d\xce\x6f\xbe\x88\xef\xa3\x25\x27"
- "\x22\x02\xce\x6f\xbe\xaa\x4a\x8e\xb9\x9a\x93\x8c\x4e\x24\xe4\x21"
- "\xf5\x14\xcc\x7f\x57\xc7\xbd\x98\x47\x1b\x1f\x0d\x06\xfe\xcb\x7b"
- "\x0f\x7d\x19\x04\xfc\x17\x62\xcb\x7f\x64\x9e\x82\x09\x11\x1e\xac"
- "\x40\x50\x56\x3d\xee\x47\x58\xa7\x16\x43\x5b\xe0\x3e\x82\xfb\x02"
- "\xc3\x87\xc0\x85\x96\xfe\x82\xfb\x12\xe6\x3b\xa6\xef\x5a\xf5\x1d"
- "\xdc\x5f\xee\xd6\x23\x6f\xdc\x5f\x30\x1f\xe2\xfe\x82\xe7\xff\x6c"
- "\x66\xfb\x4b\x9f\x3a\xe4\xbd\x0d\xb8\xb0\xca\x58\xca\xf4\x19\xac"
- "\x27\xcb\x8d\x3c\x1e\xc4\xcf\x8e\x78\xfd\x25\xc3\xd2\x5f\x2c\x3c"
- "\x08\x7d\xc2\x88\xfb\xcb\x32\xcd\xa0\xd6\x65\x5c\x7f\x99\x79\xc6"
- "\x1b\x31\x1c\xb9\xe1\x74\x49\x3e\xf4\x17\x9c\x53\x33\x59\x78\x10"
- "\xfa\x0b\x5e\x9f\xc4\xf0\xe0\x5f\x81\x07\x1b\x81\x07\xf5\x70\x1c"
- "\xfa\xc9\xf6\x79\x2c\x0f\xb2\xfd\xa3\x65\x19\xcb\x83\x97\xd5\xa8"
- "\x75\x30\xe6\xc1\x6d\x12\xfa\xe5\x8c\x15\x0f\x36\x1f\x50\xc6\x83"
- "\xcd\xcc\xfe\x67\x38\x86\xad\x10\x4f\x1c\xc7\x17\x7d\x69\x63\x79"
- "\x1e\xf0\xdf\xd4\x6e\x16\xb7\x58\xf1\xb8\xed\x63\xc7\x2f\x51\x9e"
- "\x13\x89\x1b\xe0\xbc\xd1\x78\xc3\x36\x76\xf4\x86\x6f\x0c\x7c\xae"
- "\xc3\x1c\x87\xf9\x0e\xf3\x1c\xe6\x3c\xdc\x3f\x30\xd7\x61\x9e\x7b"
- "\x04\xc6\x00\xf8\xbf\xa1\x22\xfa\x1c\xc3\x81\xc9\xe7\x91\x77\xf2"
- "\x78\xf4\x40\xd5\x41\x13\xf8\x9b\x6b\x08\x73\x20\x7f\x7c\xc3\x9c"
- "\x87\x63\xbb\xf5\x3a\xe1\x3c\x3c\xce\x61\x7e\xb3\x19\xe7\x20\xb6"
- "\x10\x93\x42\x3c\xce\x31\x79\x8b\x35\xf7\xbc\xb0\xa3\x1f\xf1\x25"
- "\x39\xfd\x90\xe7\x8d\x0d\xd7\xf3\x6d\xbd\xc9\xf5\x12\x8b\x37\xc1"
- "\x7d\x1c\xf7\x75\x9d\x5b\x13\xf3\xbc\x4a\x3b\xe0\x69\xcc\x59\x39"
- "\xc4\x8b\xce\x2f\x21\xfe\xc8\x48\xde\x2d\xa7\x8a\x37\x70\xfe\xff"
- "\xba\x89\xcc\x13\x00\xbf\xef\x33\xeb\x20\x9d\x3b\xa8\x01\xb7\x31"
- "\xbe\xe7\x59\x43\x00\xa3\xb9\x71\xfe\x9b\x70\xbb\xe5\xc6\x05\xc0"
- "\xdf\x81\x1c\xee\x6e\x0c\x3b\x9e\x80\xd0\xb4\x04\xb9\xb8\xbb\x41"
- "\xe6\x40\x7c\x17\x72\x0f\x3d\x33\xc4\xc3\xfc\x5d\x48\x0f\xc0\x88"
- "\xef\x22\x53\x0a\xba\x9e\xb5\x39\x2b\xd9\x48\x37\xa8\x57\xa0\x47"
- "\x81\x33\x33\xca\x8c\x08\x95\x81\xca\xae\x0a\x9a\x0f\xf1\xde\xec"
- "\xfd\x81\x59\xef\x01\xf7\x37\x15\xfc\x63\x03\x70\xb1\x07\x9f\x8b"
- "\x09\xef\x36\x31\x7b\x86\x19\xb2\x36\x17\xe2\xb2\x26\x97\xa2\x3e"
- "\x30\x1e\x7b\x5c\x70\x6b\x19\xb6\x7c\x15\xc2\x6b\x6b\x7b\x5c\x70"
- "\x33\xb4\xb4\xf6\x7b\xc5\x1b\xae\xef\x4d\x7f\x37\xd5\x2d\xe6\x79"
- "\xf4\x00\x3d\x73\xaa\x1b\x9e\x17\xb1\xc7\x5c\x48\x99\xe1\x18\x99"
- "\x67\x55\x88\xf0\xe7\xe9\xad\x1e\x8c\x4e\x33\xc3\x39\x95\xcd\x85"
- "\x28\x3d\xde\x13\xe1\xf3\xc9\xdc\xbd\x42\x84\xcf\xcf\x88\xf5\x66"
- "\xe6\x55\x30\xd7\x19\x0b\x11\xbe\xd6\x04\xc7\x5f\x37\x7b\xa1\xcc"
- "\x15\x2a\x54\x56\x5e\xc9\x94\x51\x56\xfe\x6f\x84\xcb\x80\xbe\x00"
- "\x7f\x1f\x41\x9b\xe2\x7d\x81\x13\x0a\xe1\xf3\xaf\xd1\xa6\x9f\x07"
- "\xc2\xef\x0b\xf0\x73\x1d\x5d\x72\x33\xe4\x97\x95\x9b\x51\x9f\xd5"
- "\x7f\xa4\x01\xd3\x74\x15\x5e\xaf\x99\x84\xee\x80\xba\x17\x55\xd5"
- "\x66\x81\xa7\xbd\x91\x8e\xd7\xf3\xd3\xc9\x33\x1b\xcd\xf4\xcc\xcb"
- "\xe6\xe4\x99\x3f\xe3\xef\x36\xd1\x33\x7f\xc1\xdf\x9d\xb1\x42\xcd"
- "\xce\xe5\x2d\x64\xe6\x1d\xa6\x5f\xf7\x43\xb8\xae\xf8\x7b\xf1\xf7"
- "\x6d\x8a\xd5\xb0\xdf\x39\x94\xa9\x1b\xfe\x4e\x5c\x26\xff\x3b\x4f"
- "\xe0\xef\x7c\x19\x7f\x67\xcb\xbd\xf0\xbb\x2f\xc4\x23\x0b\xc7\x01"
- "\x7f\xbf\x99\x0e\xe9\x41\x27\x87\xb8\x33\xd7\x18\x1a\xc4\xae\x99"
- "\xc8\x5e\x93\xce\xe4\x01\xe0\x9a\x16\x9a\x39\x9f\x29\x03\xc6\xca"
- "\xb9\xf8\xf8\x63\x21\x5a\x64\x1b\xc3\xd6\x1e\x64\xec\x6c\x39\x45"
- "\xc6\x4e\x12\x53\x06\x2b\x33\x43\x7a\x40\xdc\xbc\xf1\x38\x0b\x65"
- "\x14\xb7\x97\xf1\x5d\x88\x3b\x8e\x37\xc6\x8d\x05\x4b\x18\x47\x16"
- "\x0c\x31\xf5\xd4\x23\xc4\xc7\x0c\xfc\xed\xc9\x96\x73\xcd\x52\x0e"
- "\xd4\x01\x59\x70\xf4\x18\x7c\x6e\x8b\xa3\xb6\x0a\x0e\x47\x6d\x0b"
- "\x0c\x49\x34\x8d\x71\xa4\x9d\xb1\x06\xca\x69\x1d\xcb\xd5\x67\xaa"
- "\x1b\xc6\xd8\x2d\x86\xad\x7c\x1c\xa7\xc7\x12\x91\x8a\xdc\x4f\x5b"
- "\x2f\xe6\x7e\x12\xb5\x2a\x5c\x57\xcb\x7d\xe0\x3a\x64\x9a\xd5\xc8"
- "\x72\x1f\x9b\x5a\xfd\xa0\xdc\x9f\x11\x7b\xcd\x38\x5c\xb6\xa5\x0d"
- "\x20\x66\xc8\x72\x8d\xe5\xfc\x4c\xb3\x06\xea\x3d\x94\xb9\x86\x60"
- "\xee\x82\x08\x7e\xda\x32\xac\x31\x77\x77\x22\x02\x41\x0c\x5a\x6b"
- "\x46\x13\xfe\x9e\x3d\xa4\x6e\x9f\x99\x5a\xbe\x0b\xc1\x71\xa5\xd8"
- "\xe3\x47\x79\x98\x60\xcb\x37\x88\x95\x7f\x59\x50\x7e\x08\x94\x9f"
- "\x00\xe5\x63\x2d\x37\x03\xe7\xf0\x8c\x3d\x99\x72\x12\x48\xf9\x16"
- "\xdc\xd2\x59\xb3\x82\x62\x56\xe0\xb9\xaf\x46\x96\x4f\xaf\x30\xdc"
- "\xc9\xcc\xb9\xa2\xcc\x85\x66\xab\x39\x57\xfc\x39\x79\x1f\x24\xe9"
- "\xd9\xf9\x56\x46\x66\x6f\x2f\x9c\x2b\xc3\x9a\xb4\x18\xf4\x1c\x37"
- "\xe7\xea\x5b\xfc\xf9\x56\x6d\xfc\x39\xde\x9c\x2b\x23\xf3\xbe\x17"
- "\x9d\x9b\xf1\xd8\x0d\x0a\x51\xf0\x7f\x0a\x39\x7e\xc5\xc8\x3f\xce"
- "\xcd\x69\x24\xc7\xf1\x7c\x71\x36\x67\xdc\xf8\xc5\x41\x9c\x37\x34"
- "\xd6\x59\x72\xb5\x12\x5e\xd8\x79\xcd\x4c\xdd\x19\xd1\xae\x99\xe1"
- "\x6f\x69\xcd\x6c\x4a\xb5\xab\x99\x29\x8f\xdd\xed\x9a\x99\x72\xef"
- "\xc9\xf4\x7b\x8a\xba\xcc\xf4\x7b\x8a\x62\xfa\x77\x26\x94\x67\x7c"
- "\x3b\x2d\x82\x7e\x37\x48\x8f\x71\xbe\x1d\x34\xf0\x07\xf1\xa5\x54"
- "\x31\xf8\x6e\x13\xf5\x20\xbd\x16\xda\x0e\xef\x35\xb7\x76\x05\x8c"
- "\xdf\xc6\x1a\x54\xe9\x81\x35\xf3\x39\x5c\x4e\xaf\x4a\xe6\x99\xe2"
- "\x2c\x2d\x69\x17\xd3\x79\x88\x85\x7b\x95\xc1\x80\x98\xf3\xe0\x33"
- "\x18\xd7\xea\xb1\x66\x3e\x62\x2e\xa5\xb6\x43\x9b\xc2\x0f\x68\xea"
- "\xb4\xe1\x7c\x4d\x7d\x63\x83\x59\x25\xaa\xa5\x29\xb7\x52\xe3\x06"
- "\xbe\x96\x36\x33\xfb\x5c\xe3\x1c\x3f\xd6\x07\x66\xa2\xa1\xd5\xa0"
- "\xa7\x87\x63\x5d\x8d\xb5\xb4\x99\xaf\xa5\x29\x34\xd2\xbe\x96\x36"
- "\x67\xdc\xd6\xd2\x9d\xa5\xa5\x2d\x39\x05\x2b\x2d\x0d\x7d\x46\x91"
- "\x96\xa6\xb0\xfb\xbc\xad\xa5\xbb\x97\x96\xa6\x1b\x2d\x5a\xda\xbc"
- "\xe6\x9e\xdf\xe1\x1c\xff\x76\x8b\x96\x4e\x73\x6b\xb0\xd1\xd2\x69"
- "\x6e\x46\x5b\x2d\x6d\xd6\x70\x5a\xda\x54\x2a\xd0\xd2\x94\x67\x5f"
- "\x1b\x2d\x4d\x51\x13\xa4\xb4\x34\xf0\x58\x23\xd6\xd2\x18\x6b\x58"
- "\x57\x63\x3d\x0d\x75\x0f\x24\xb8\xa3\x96\x2b\xd2\xd2\x14\x95\xe0"
- "\x94\x96\xa6\xa8\xd3\xe2\x5a\xda\xb4\x51\x5a\x4b\x9b\x36\x8a\x6a"
- "\x69\xca\x63\x79\xbb\x06\xa2\x3c\xc6\x77\x7b\x2d\x4d\xb9\x37\x88"
- "\xea\x1d\xca\xfd\x0a\xa3\xa5\x29\xaa\xb6\xc3\xb5\x34\x94\x29\xaa"
- "\xa5\x29\x8f\x28\x46\x77\x50\x54\x9d\x8d\x96\xc6\xd7\x88\x69\x69"
- "\xca\x63\x2b\x7b\x4d\xad\x40\x4b\xb3\x65\xc0\x18\x7a\x40\x52\x4b"
- "\x53\x3d\x5e\x22\x63\x6a\x8f\x87\x88\x96\x26\x31\xb5\xd1\xd2\x94"
- "\x47\x8b\x43\x2d\xcd\x62\x88\xa9\xa7\x94\x96\xa6\x7a\x8c\xb3\xd5"
- "\xd2\xa6\x8d\xa2\x5a\x9a\xba\xf3\x5e\x0e\x47\x77\x1c\x12\x68\x69"
- "\xaa\x47\xea\x2d\xa1\xa5\xa5\xb1\xd5\x20\xd0\xd2\xd4\x1d\xd3\x65"
- "\x6b\x69\xea\x8e\x0c\x59\x5a\x9a\xc1\x9c\x88\x96\xa6\xee\x38\x6d"
- "\x8d\x39\x81\x96\xa6\xee\xb8\x26\xaa\xa5\xa9\x3b\x7b\x09\xb4\x34"
- "\x53\xbe\x88\x96\xa6\xee\x1c\x2d\x28\xdf\x5a\x4b\x53\x77\x4e\x13"
- "\x68\x69\xf6\xbc\x76\x2d\x4d\xdd\x69\x64\xf5\xd9\x93\xb2\xb5\x34"
- "\x75\xe7\x19\xbb\x5a\x9a\xba\xf3\xbc\x40\x4b\x53\x77\x32\xcf\xfb"
- "\x75\x94\xa7\x37\xa3\xa5\xa9\x3b\xcb\x89\x96\x36\x0d\xe7\x1f\xe7"
- "\xb4\x34\x39\x6e\xa3\xa5\xd3\x3c\x35\x0e\xb4\xb4\xbf\xf3\x5a\xfa"
- "\x9e\xe8\xd2\x76\x2d\x7d\x4f\xb4\x45\x4b\xe3\x77\x25\xe5\x83\x3e"
- "\xcd\x67\xf4\xf4\x09\x54\x56\xcf\x8c\x39\xa7\xed\xeb\x69\xef\x3c"
- "\x4e\x4f\xf7\xbe\x48\xfa\x7e\xef\x0a\xa2\xa7\x7b\x67\xb4\xe7\xa0"
- "\x41\x4b\x63\x4d\xcd\xe6\xa0\x6b\xd2\xe1\xe7\x83\x15\xa5\x8c\x9e"
- "\xc6\xeb\x00\xb0\xa6\xc6\x7a\x1a\xeb\x6a\xac\x95\x2b\xd6\x21\x54"
- "\xa9\x37\xe0\x39\x2c\xd5\xda\x07\x70\xbb\xf6\x5e\x0e\x3a\x5c\x07"
- "\x63\x5b\x35\x5c\xab\xfb\xa0\xc9\x80\xd7\x94\xd4\x65\x9e\x83\x6b"
- "\x74\xe4\x1a\xf8\xbc\x16\x5f\x03\xe7\xd4\x91\x58\xf4\x3a\x45\xc6"
- "\x4f\x56\x8f\x53\x3d\x97\x0a\xf4\x38\x39\xb7\xc6\xa2\xc7\x0b\xa0"
- "\x0e\xf0\xe3\x81\xb5\x38\xd6\xe4\xa0\xc5\xcb\x0b\xb6\xd0\xa5\xdb"
- "\xfb\xd3\xc7\x6e\xa4\xf5\xdc\x6d\xd1\xe4\x19\x70\x2c\x13\x8e\x41"
- "\x3d\xaa\x8f\x15\x22\x74\xb8\x49\x8b\x35\x85\xae\xe0\x02\xf2\x80"
- "\x98\xd5\xae\x85\xef\xc7\xd7\xc3\x35\x75\x96\x6b\x60\x7c\x2f\x27"
- "\x1a\xbe\x57\x8e\x99\x9f\x0f\xa7\xee\x1a\xd2\xae\xe1\xa1\x9d\x70"
- "\xbe\x1d\xbf\x83\x8c\xd1\xf1\x83\x83\x86\x1b\x2d\x3a\xde\x87\xaf"
- "\xe3\xef\x36\x59\x74\x3c\x5e\xcb\xd5\xae\xe3\xe3\x58\x1d\x4f\xdd"
- "\x35\x4d\xa1\x8e\xaf\xe9\x2e\x3a\xde\xcb\xcd\xcd\xc3\x2b\x82\xe8"
- "\xf8\xfc\xf8\x8e\xd1\xf1\x58\xc3\x63\xdd\x8e\x35\x3c\xd6\xf4\x58"
- "\xc7\x63\x4d\x6f\x66\x75\xfc\x76\x2b\x1d\x6f\x06\xcd\x6e\xad\xe3"
- "\xb1\xb6\xb7\xe8\x78\xb3\x40\xc7\xdf\x5d\xa6\x4c\xc7\xdf\x5d\xda"
- "\x01\x3a\xbe\x6b\xe2\xd6\x8d\x74\xbc\xc6\x4a\xc7\x63\xdd\x0e\x7d"
- "\xb2\x1e\xeb\xf9\x2a\x2d\xb4\xcd\x62\xd0\xf4\xa0\xe7\x15\x6b\x79"
- "\xea\xee\xfd\x7c\x2d\xbf\xbd\x1f\x5f\xcb\xf7\xda\x6f\xab\xe5\x7b"
- "\x95\xf2\xb4\x7c\xb9\x8e\xea\xd9\xc8\x8c\x13\xc0\x07\xda\x39\x58"
- "\xa7\xf7\x0c\x11\x6a\x79\xd5\xbd\xb6\x5a\xbe\xb7\x8f\xa8\x96\x27"
- "\xfe\x5e\xa8\xe5\x7d\xe2\x02\x8c\xed\x5a\xbe\xf7\x78\x65\x5a\xbe"
- "\x77\x40\xbb\xd7\xa0\x7a\xfa\x91\xf1\xa8\x57\xbd\x94\xbe\xbf\xe1"
- "\xcd\xd7\xf7\xbd\x0f\x71\xfa\x3e\x8e\xd3\xf7\x94\x67\xad\xa4\xbe"
- "\x87\xcf\x98\x79\xf5\xde\x9b\x0b\x71\x59\x58\x97\x01\xb7\xd6\xab"
- "\x63\xb1\x36\xf3\x9e\x8b\xb5\x19\xf0\x59\x3d\x9e\x8f\x0e\xff\x8f"
- "\xb4\xe8\x7c\xc6\xa7\x62\xad\xbf\xa2\x3b\xea\xb1\x3e\x35\xe2\x7a"
- "\xac\xcf\x59\xac\x7b\x98\xb5\xbe\x54\xef\x83\xd0\x26\xf5\x1d\xab"
- "\xf7\x7b\x1f\x14\xd7\xfb\xde\xd3\x88\x36\xea\xfd\x29\x8e\x8b\x50"
- "\xef\xc3\x35\xa2\x7a\xdf\x3b\x95\xbd\xe6\xa0\x50\xef\x93\x32\x60"
- "\x8c\x2f\x92\xd6\xfb\x7d\xc7\x91\x31\xbf\x6f\x5f\x32\xe6\x93\x18"
- "\xdb\xea\x7d\xef\x8b\x7c\xbd\x8f\xe3\x6f\xab\xf7\x09\xa6\x98\x7a"
- "\x4a\xea\xfd\xbe\x4f\xda\xe8\x7d\xf8\x4e\xac\xf7\x8d\x3c\x5c\xe5"
- "\x63\x5c\xcd\xc1\xb8\xba\xe7\x21\x8c\x2b\x3c\xae\xaa\x5f\xc5\xb8"
- "\xea\x77\xd4\x60\xb6\xe8\xfe\x34\x5c\xde\x6a\x6b\xdd\x8f\x79\xc4"
- "\x1e\xce\x62\x62\xd1\x03\x18\x6b\x18\x67\x96\xb8\xe1\xf3\x31\xde"
- "\x3a\x17\x6b\xfd\xfc\xc5\xb1\xd6\x6f\x22\x13\x67\x16\x6b\x38\x5f"
- "\x49\x7c\x00\xbe\xbf\x7e\xb3\xe5\xf9\x00\xe6\x9a\x5c\x79\x3e\x00"
- "\x63\x51\xcc\x07\xf4\x3b\x6b\x8d\x45\xa1\x0f\xe8\x67\x12\xf7\x01"
- "\xf7\xf8\x08\x7d\x00\x2e\x5f\xcc\x07\xdc\x33\x4e\x50\xbe\x8d\x0f"
- "\xb8\x27\x4c\xe8\x03\xc8\x79\x9c\x0f\x50\x79\xb0\x79\x95\x55\xf2"
- "\x7d\xc0\x3d\xe7\x59\x7e\x27\x3e\xe0\x9c\xb5\x0f\xb8\xe7\xb2\xd0"
- "\x07\xdc\xa3\x25\xfc\xaa\xf2\x35\x30\x3e\xe0\x9e\x1a\x72\xdc\x33"
- "\x91\x7f\xbc\xdd\x07\xb0\xc7\x0d\x7c\x1f\xa0\xc5\x3e\x40\x35\xdc"
- "\x81\x0f\x08\x76\xde\x07\x3c\xa8\xe3\x7c\xc0\x83\x3a\xfb\x3e\x40"
- "\x75\xd6\xbe\x0f\xb8\x7f\x20\xe7\x03\xee\x5b\x40\x38\xe1\xbe\x97"
- "\x08\x27\xdc\xc7\xe4\xad\xa0\x5f\x71\x79\xf5\xc5\xcc\xfc\xf3\xd2"
- "\x7d\x4d\xa5\xd4\x07\xb1\x6c\x5e\xfd\x3a\x78\x80\x78\xd0\xf3\xcd"
- "\x44\xcf\x03\x67\x1e\xc3\x3e\x00\xeb\x75\xe2\x01\x06\x98\xe0\x98"
- "\x0e\xda\xfc\x18\x94\xa5\xdb\xbb\x42\x4b\xe1\xb9\x61\xf8\x5c\xe8"
- "\xef\xb5\xe9\x30\x8e\xc0\x71\x3c\xfe\x68\xf1\x35\x70\xac\x46\x1b"
- "\xcb\x5c\x77\x11\x7b\x05\xb8\x4e\x0b\x9f\xd7\x59\x5d\x57\x8d\xaf"
- "\xab\x4c\x60\xbc\x40\x35\x89\xdd\x80\x09\x70\xbc\x9c\xf3\x0d\x3e"
- "\xc5\x8c\x6f\x68\x66\x7d\x03\x9c\x0b\x65\x95\x32\xbe\x61\x0e\xf8"
- "\x06\xa8\x37\xfc\xf0\x7d\xc3\xa7\xe0\x1b\x0e\x82\xcf\xd9\x7f\x23"
- "\xcd\x47\xc7\xf3\x0d\x07\xb1\x4f\xc0\x9e\x01\x7b\x05\x18\xd7\xf6"
- "\x63\x1f\x71\xb8\x55\x87\xe7\xda\xd7\x80\x6f\xa8\xc5\xd7\x73\xd7"
- "\xf6\x1f\xc8\xbf\x16\x9f\x0f\x75\xd4\x32\x9e\x03\x74\x1e\xd4\xa1"
- "\xae\xe0\x1c\xe3\x39\xca\xe1\xda\x6a\xe2\x39\xfa\x07\xf3\x3c\xc7"
- "\xa7\xc4\x73\x0c\xf0\x14\x3c\x37\xa0\xfa\x17\xc8\xf7\x1c\xbe\x8b"
- "\xed\x3e\x3b\xa0\xfa\x97\xc9\xf1\x1c\x70\xdf\xa5\x16\xfd\x6a\x33"
- "\x0f\x11\xcf\xc1\x07\x0d\x8b\xf5\xaa\xdd\x79\x6b\xac\x96\xc5\xda"
- "\x15\xeb\x56\xac\x5f\x9d\xf2\x1c\x50\xff\x72\x43\x07\x3e\x3b\xb8"
- "\x03\x3c\x47\xbc\xb4\xe7\xe0\xfb\x0d\xec\x3f\xb0\xe7\x80\x3e\xc6"
- "\x78\x8e\xfc\x35\x56\x9e\xe3\x0e\x07\x9e\xc3\x8d\xef\x39\x7c\xc7"
- "\x2a\xf3\x1c\xbe\x63\x3a\xc0\x73\x94\xde\xf6\x1c\x1d\xed\x39\x7c"
- "\x35\xed\x9e\x83\x62\x9f\x1f\xf4\xb3\x78\x8e\x01\x1a\x5b\xcf\x31"
- "\x60\x0c\xcf\x73\x7c\xaa\xa3\xfa\x33\xcf\x45\x89\xdf\xf0\xc9\x12"
- "\xfa\x0d\x75\xb6\xad\xdf\x18\xb0\x5e\x99\xdf\x18\x70\x40\x99\xdf"
- "\x18\xb0\x9f\xd4\x0f\x3f\x2b\xf5\x89\x20\xe3\xde\x80\xa9\x9c\x07"
- "\xf1\xd1\xf0\x8f\x39\xf6\x20\xf7\x8d\x15\xf7\x20\x2a\x9d\xb4\x07"
- "\x51\xe9\xa4\x3d\xc8\xc0\xcb\x58\x2b\x62\xbf\x01\xe5\x83\x56\x1c"
- "\x78\x88\xff\xac\x21\xdd\x81\x2e\xb4\xf6\x1f\x31\x73\x88\x5f\xe9"
- "\x7c\x5d\x38\x30\x44\x5c\x17\x0e\x8c\xc2\x9a\xcb\xc8\xe8\xc2\xfb"
- "\xc6\xe4\x77\xb8\x07\xb9\x6f\x8c\xb8\x07\x19\xc8\xe6\x7f\xef\xf3"
- "\xb7\xf5\x20\x70\x8d\xa8\x07\xb9\xbf\x17\x7b\xcd\x18\xa1\x07\x21"
- "\x65\x80\xbe\x18\x22\xed\x41\xee\x3f\x4e\xf4\xc6\xfd\xb9\x44\x6f"
- "\x90\x18\xdb\x7a\x90\xfb\x17\x38\xf6\x20\x04\x53\x4c\x3d\x25\x3d"
- "\xc8\xfd\xed\xcf\x3f\x38\x0f\xa2\xd2\x61\x0f\x22\x8e\xab\x07\xb7"
- "\x0a\x71\xf5\xe0\x68\xa1\x07\x79\xa0\x87\xb5\x07\xb9\x05\xb1\x16"
- "\xc2\x3d\x7f\x60\xee\xe9\xb4\x7c\xdf\xf1\x60\x2f\x79\xbe\x03\xe3"
- "\x4f\xcc\x77\x3c\x38\xdd\x1a\x7f\x42\xdf\xf1\xe0\x52\x71\xdf\xf1"
- "\x60\x86\xd0\x77\xe0\xf2\xc5\x7c\xc7\x83\x87\x04\xe5\xdb\xf8\x8e"
- "\x07\x4f\x09\x7d\x07\x39\x8f\xf3\x1d\xea\x44\x36\x07\xb4\x5e\xbe"
- "\xef\x50\x87\xd9\xf7\x1d\xea\x28\xa1\xef\x50\x8f\x22\x9c\xaa\xce"
- "\x22\xbe\x43\x1d\x44\x8e\xab\xd6\xf1\x8f\x73\xbe\x83\x1c\xb7\xf5"
- "\x1d\xea\xdd\x0e\x7c\x87\x97\x71\x57\x90\xba\xd5\x2f\x68\x78\x6b"
- "\x4e\x72\xf0\x63\xf5\x0f\x9a\xda\xdf\xed\x10\x01\x1a\xa2\x0e\x34"
- "\xc5\x6c\x44\xe1\xfd\x11\x92\x4e\x82\x56\x98\x4d\xd6\x31\x60\xbd"
- "\xb0\x2f\x1e\xeb\x3e\x6d\x0f\x68\x53\xd4\xa6\x0a\x45\xc6\xa1\xb3"
- "\xfc\xb1\x6e\x68\xd9\x15\x84\x0c\x39\x8b\x42\x5a\xf0\x1a\x86\xf9"
- "\x88\x9a\xd5\x28\xae\x05\x57\xd6\xd1\x66\xc0\xbc\xe7\xe4\x50\xa2"
- "\x03\x2b\xa2\xcf\x33\x38\xc6\x5a\x62\x1b\x68\x89\xaa\xe6\x5a\x46"
- "\x5b\x78\x45\xa8\x51\x7e\x12\x52\xf5\x6a\x44\xde\xbd\xdc\xdc\xee"
- "\xf8\xd3\x74\x84\x4c\xa0\x2b\xc6\x0f\xa1\xcd\x8f\xd6\xab\xf1\x7e"
- "\x48\xbd\x89\xb6\x38\xd8\xc3\xc8\x6a\x8b\xd7\xaf\xa3\xa1\x05\x38"
- "\xff\x5c\x41\x34\x05\x7e\x0f\x44\x0b\xd1\x14\x0f\xb4\xde\xd0\x0c"
- "\x6a\x5f\xc3\xc0\xad\x4d\x69\x5f\xc3\xd0\x96\xcd\xe9\x09\xac\x25"
- "\xe8\x59\xa0\x05\x0d\x64\xfe\xc8\x8a\x97\xc8\x1a\x86\xa1\xf5\x88"
- "\xda\x11\x8e\x3c\xcb\x23\xce\xe1\x5c\x91\x6f\x79\x7d\x11\x5a\x3e"
- "\x01\x3d\x60\xc4\xfa\x01\xb4\x61\x79\x7d\x2e\xc2\x7b\x3d\xe6\x83"
- "\x8e\xc8\x63\x35\x44\xd0\x6c\x09\x0d\x01\x63\x35\xd6\x11\x64\x8c"
- "\x1e\x34\xfd\xb8\xe6\x38\x92\xaf\x0d\x07\x31\x79\x4a\xc9\xb5\xcd"
- "\xbb\xc0\x1f\xf8\x05\x21\x93\x2a\x39\x98\xec\xfd\x19\x97\x62\x7e"
- "\xfb\xf5\x18\xbc\xa7\xe3\xfb\xe7\x1a\xdc\xf0\x3e\xe6\xf8\x9d\x9e"
- "\xe6\xbd\xb3\xfc\x05\xeb\x4e\xda\xd8\x98\xb5\x91\x98\x61\x4d\x18"
- "\xd6\x88\xe8\x59\x46\x0a\xc1\x67\xbd\x99\x75\x27\x06\x1d\xe2\xde"
- "\xed\xe9\x8b\xb6\x9b\xc9\xfe\x99\xe6\x95\xd1\x3d\xcd\x10\x17\x7a"
- "\x0d\x85\x8a\xaf\x1b\x18\xdd\x97\x8e\xdf\xf7\xb9\xda\xad\x17\xd6"
- "\x7d\x80\xfd\xbb\x76\xb4\x42\x8c\xce\x92\x18\xd1\x6b\x3c\x99\xdf"
- "\xc6\x95\x1a\x35\x94\x3d\xa8\xad\x0d\x74\x1f\xfb\x6e\x50\xcb\x5e"
- "\xc2\xcc\x1a\xa2\x56\xbc\x86\xa8\x16\x19\xb3\xc9\xfe\x8c\x80\x0b"
- "\x37\xbc\xaf\x09\xd4\x61\x20\xb3\x76\xa8\x4d\x83\x71\xe4\xbd\xfd"
- "\x02\x5e\xef\xf4\x2d\x13\x1f\x13\x1b\x17\xfc\x8e\x50\x8b\x9e\xab"
- "\xdc\x7d\x8a\xac\x1f\xb5\x8a\x45\x5b\x11\xd1\xed\xcc\x7a\x9e\x34"
- "\xf5\xa7\x78\xde\xcf\xcf\xd4\xc3\x57\x8e\xc7\x81\x76\x8a\x93\x1b"
- "\x97\x87\xf5\xdd\x23\x2e\xde\xbf\xb2\xb8\x0c\x2a\x24\x71\x19\x9c"
- "\xaa\x2c\x2e\x83\x37\x76\x8f\xb8\x78\xfe\xca\xe2\xe2\x37\x8a\xc4"
- "\xe5\x91\x87\x94\xc5\xe5\x11\xb5\xbd\xb8\xe0\x1c\x99\x25\x3f\x66"
- "\xc9\x8d\xe1\xf1\x94\xf8\xa2\xc7\x9b\xb9\xb9\xa6\x8f\x37\xf3\xe7"
- "\x9a\x7e\x79\x0c\xef\x1b\x90\x86\x4e\x04\xe0\xb1\xf2\x91\x6b\xf6"
- "\x73\x62\x43\xc7\x70\x39\xb1\x47\x0b\x88\x46\x7d\x74\x35\xd1\xa8"
- "\x8f\x32\xf3\x56\x56\x9d\x41\x94\xf1\xb7\x93\x82\xf7\x2d\xd4\x52"
- "\x78\x9d\xd6\xbe\x9f\x0d\x54\x7a\x13\x68\x4e\xea\x41\x1a\xe7\xa8"
- "\x32\x62\xc1\xdb\x80\x0e\x88\x79\x15\x3d\x78\x89\x1a\x72\x08\xef"
- "\x2f\x77\xe4\x67\x2d\x95\x85\xcf\x19\xf4\x7a\xcc\xde\x01\x7a\x37"
- "\x3c\x8e\xee\x5b\x68\xa0\x2c\x58\xb2\xac\xdf\x84\xf6\x1c\x7e\xb5"
- "\x28\x48\x8d\xe7\x82\xb6\xfa\x2c\x0a\x31\xf9\x24\x07\x1b\x8b\x67"
- "\xf9\x8b\xe1\x8b\x59\x17\x0a\x63\x28\x5e\xc7\x19\x1e\xc3\xe1\xcc"
- "\xbc\x92\xe0\xab\x12\x34\x3b\x7e\x87\x52\x1f\x18\x3b\xe9\xb6\xe8"
- "\x9e\x33\xf7\x40\xec\x59\x8c\xc1\xf8\x2d\x8d\xb1\xad\x42\x8c\x5d"
- "\x65\x31\x06\x58\x6b\xc7\x18\x37\x76\x9e\x2e\x21\x18\xd3\xb5\x63"
- "\x8c\x19\x3b\x57\x6a\x06\x62\x9c\x59\x30\x86\xc7\x4d\x82\xb1\x73"
- "\x92\x18\xfb\xb2\x4e\x1c\x63\xc6\xc1\x7c\x8c\x0d\xae\x26\x18\x1b"
- "\xb2\xfe\x78\x28\x60\x2c\x54\x2e\xc6\x86\xac\x13\x7a\xec\x27\x76"
- "\xda\x7a\xec\x21\x17\xad\x3d\xb6\xc5\x53\x5f\xf5\x89\xf3\xbf\x9a"
- "\x1b\x17\xd0\xec\x63\xf1\xd5\x8f\xf6\x52\xe6\xab\x1f\xf5\x72\x6e"
- "\x4e\xde\xa3\x0b\x4e\x24\x22\x74\x02\xfa\x53\x55\x30\x99\x93\xf7"
- "\x3e\xe3\x97\x1f\x31\x60\x1c\x8a\xfb\x65\xf2\x99\xed\x5c\xaa\xa1"
- "\xbd\xb8\xb9\x54\x8f\x9d\x6e\x79\x43\x7c\x4e\xde\x7b\x49\x79\x3c"
- "\xef\x92\x27\xe2\x5d\xf2\xac\x9e\xd3\xe5\x89\xf8\x96\x3c\x84\xaf"
- "\xe5\xfb\x96\x13\xc1\xc4\xb7\x9c\x08\xc6\xbe\x25\x8f\xd1\x7b\x27"
- "\x82\x2d\xbe\x25\x0f\x3e\x27\xbe\xe5\x44\xf0\x05\xf8\xc1\xbe\xe5"
- "\xb1\xc4\x13\xc1\x62\xbe\xe5\xb1\xf5\x64\x4e\xde\xa3\xf3\xa5\xe7"
- "\xe4\xe5\xf1\xfc\x71\x1e\xcf\x1f\xe7\xb1\xfe\x38\x8f\xf1\xc7\xe4"
- "\x3b\x87\x32\x75\xc3\xdf\x89\xcb\xe4\x7f\x27\xe7\x1f\x1e\x6b\x21"
- "\xfe\xe1\xd1\x18\x1c\x07\xa1\x3f\x86\x6b\x12\xc4\xfc\xf1\xd0\x61"
- "\xec\x35\xf3\x2d\xfe\xb8\x95\x9c\xcf\x94\x01\x5c\x33\x41\xda\x1f"
- "\x0f\x3d\x4f\xb8\x67\xe8\x01\xc2\x3d\x24\xa6\xb6\xfe\x78\x28\xdf"
- "\xff\x48\xcc\xc9\x23\x18\x62\xea\x19\x23\xe5\x8f\x87\x9e\xb2\xf5"
- "\xc7\x8f\x34\x8b\xcf\xc9\x7b\xbc\x98\xc3\xd1\xe3\x13\x85\x73\xf2"
- "\x86\xdd\xcf\xf7\xc5\x18\x63\xb7\x18\xb6\x12\x85\x73\xf2\x86\x5d"
- "\x16\xf7\xc4\x79\x3c\x4f\x9c\xc7\x78\xe2\x13\xc1\x96\x39\x79\x8f"
- "\x3f\x84\xcb\xb6\xf5\xc4\x79\xed\xe7\x5b\x3c\x31\xbe\x86\x60\x4e"
- "\xcc\x13\x3f\xbe\xc0\x1a\x73\x42\x4f\xfc\x78\xaa\xc5\x13\xb7\xce"
- "\xe4\x7b\xe2\xc7\x77\x0a\x3d\x31\x2e\x5f\xcc\x13\x3f\x5e\x21\x28"
- "\xdf\xc6\x13\x3f\x7e\xd1\xe2\x89\x71\xf9\x16\xdc\x72\x9e\xf8\x89"
- "\x74\xc2\xa1\x8f\x14\xc8\xf7\xc4\x4f\x30\x79\x9d\xe2\x6d\xe4\x59"
- "\x97\xd0\x0f\x3f\xb1\x54\xe8\x87\x9f\x08\x24\xbe\xf7\x89\x42\x32"
- "\x1f\xef\x89\x50\x72\xfc\x91\x7c\xfe\x71\xce\x0f\x93\xe3\x78\x3e"
- "\x1e\x99\x87\xf7\x44\x89\x3c\x1f\xfc\x9b\x6e\xe8\x83\x7d\xed\xf8"
- "\x60\xdf\x5f\x99\x0f\x7e\x72\xb6\x32\x1f\xfc\x64\x44\xf7\xd0\xf5"
- "\xbf\x36\xbf\xf5\xc4\x31\xa2\xb9\x7e\xd7\xa2\x4c\xd7\xff\xce\xd0"
- "\x3d\xe2\xf2\x6b\xf3\x5b\x4f\xee\x26\x71\x19\x91\xad\x2c\x2e\x23"
- "\xb2\x94\xfb\xad\x31\x91\x9c\xdf\x1a\x13\x29\xed\xb7\x46\x46\xd9"
- "\xf7\x5b\xa3\xf7\x72\x7e\x6b\x54\x2f\xa2\x79\x9e\xba\x42\x34\xcf"
- "\x53\x1f\xca\xf7\x5b\x4f\x0d\xb9\xed\xb7\x3a\xd2\x6f\xfd\x9f\x3f"
- "\xc1\xd8\xef\xaf\x29\xf3\x5b\xbf\x6f\x16\xfa\xad\xb1\x22\xeb\xa1"
- "\x9e\x9a\xee\xbc\xdf\x7a\x6a\x95\x32\xbf\xf5\x54\xa2\x73\x7e\xeb"
- "\xa9\x33\xe2\x7e\x6b\x64\xb4\xb4\xdf\x22\x9f\xd9\xea\xe4\xd1\xab"
- "\x38\x9d\x3c\x7a\x42\xf7\xf7\x5b\xa3\x1a\xc5\x35\xf1\xa8\x6b\xc4"
- "\x6f\x3d\x55\xd7\xf1\x7e\xeb\xa9\x3a\x71\xbf\x35\x7a\x2e\xd1\xa6"
- "\x4f\xe9\x6c\xfd\x16\x5c\x23\xea\xb7\x46\x17\xb0\xd7\xd4\x09\xfd"
- "\x16\x29\x03\xb8\xe6\x90\xb4\xdf\x7a\x7a\x1a\xe1\x9e\xa7\x07\x13"
- "\xee\x21\x31\xb5\xf5\x5b\xa3\x4d\x8e\xfd\x16\xc1\x10\x53\x4f\x49"
- "\xbf\xf5\xf4\x78\x5b\xbf\x35\x32\x52\xdc\x6f\x8d\xb9\x9f\xc3\xd1"
- "\x33\x87\x85\x7e\xeb\xe9\x8c\x5b\xc3\x6f\x49\x62\xab\x51\xe8\xb7"
- "\x9e\x09\x93\xef\xb7\x9e\xc9\x96\xe7\xb7\x30\xe6\xc4\xfc\xd6\x33"
- "\x67\xac\x31\x27\xf4\x5b\xcf\xb4\x88\xfb\xad\x31\x7d\x85\x7e\x0b"
- "\x97\x2f\xe6\xb7\xc6\x8c\x15\x94\x6f\xe3\xb7\xc6\x4c\x17\xfa\x2d"
- "\x72\x1e\xe7\xb7\xc6\x90\x35\x50\xd4\xc8\x5e\xf2\xfd\xd6\x98\x33"
- "\xd2\x7e\x6b\x8c\xd5\xfa\xa7\x31\xec\xfa\xa7\xb1\xec\xfa\xa7\x31"
- "\x64\xfd\x13\x35\xd2\x8b\x7f\x9c\xf3\x5b\xe4\x38\xe7\xb7\xc6\xaa"
- "\xe5\xf9\xad\x3e\xdd\xd0\x6f\x79\xdb\xf1\x5b\xde\xbf\x32\xbf\xf5"
- "\x87\x93\xca\xfc\xd6\x1f\xaa\x6f\xeb\xfa\xce\xd0\xf5\x63\x47\x10"
- "\xcd\xe5\x3f\x57\x99\xae\xf7\x97\x7c\xff\x8b\x63\x5d\x1f\x38\x86"
- "\xd3\xf5\x81\x63\xa4\x75\xfd\xb8\xb1\xf6\x75\xfd\xf8\x75\x9c\xae"
- "\x7f\x8e\xcd\x65\x3e\x57\x46\xc6\xd6\xe7\x52\xe5\xeb\xfa\xe7\xdc"
- "\x6e\xeb\xfa\x8e\xd4\xf5\x7f\xf4\x25\x18\x7b\xb6\x42\x99\xae\x7f"
- "\xb6\x5c\xa8\xeb\x03\x2f\xda\xea\xfa\xe7\x9e\x74\x5e\xd7\x3f\x37"
- "\x4d\x99\xae\x7f\x4e\x72\xde\xa1\x50\xd7\x3f\x77\x40\x5c\xd7\x8f"
- "\xf3\x97\xd6\xf5\xe4\x33\x5b\x3d\x36\x7e\x1a\xa7\xc7\xc6\x3f\xd4"
- "\xfd\x75\x7d\xc0\x31\x71\xed\x15\x50\x41\x74\xfd\x73\xfb\x3b\x5e"
- "\xd7\x3f\xb7\x5f\x5c\xd7\x8f\x67\xd7\x7f\x3c\x77\xd0\x56\xd7\xc3"
- "\x35\xa2\xba\x7e\xfc\x52\xf6\x9a\xfd\x42\x5d\x4f\xca\x00\xae\xc9"
- "\x96\xd6\xf5\xcf\x0f\x23\xdc\x33\xde\x44\xb8\x87\xc4\xd4\x56\xd7"
- "\x8f\x3f\xe5\x58\xd7\x13\x0c\x31\xf5\x94\xd4\xf5\xcf\xdf\x6f\xab"
- "\xeb\xc7\x8d\x11\xd7\xf5\x2f\x5c\xe3\x70\xf4\x42\xae\x50\xd7\x3f"
- "\x1f\x75\x6b\xe8\x7a\x49\x6c\x1d\x13\xea\xfa\x17\x46\xca\xd7\xf5"
- "\x2f\xcc\x95\xa7\xeb\x31\xe6\xc4\x74\xfd\x0b\x07\xac\x31\x27\xd4"
- "\xf5\x2f\x9c\x14\xd7\xf5\x2f\x5c\x14\xea\x7a\x5c\xbe\x98\xae\x0f"
- "\xf4\x11\x94\x6f\xa3\xeb\x03\x9f\x14\xea\x7a\x72\x1e\xa7\xeb\x03"
- "\x6b\x08\x87\xfa\x9f\x97\xaf\xeb\x03\x0f\x48\xeb\xfa\xc0\xc3\x42"
- "\x5d\x1f\x98\x45\xf4\x7b\x60\x03\xd1\xf5\x81\xbb\xc8\x71\xff\x7a"
- "\xfe\x71\x4e\xd7\x93\xe3\x9c\xae\x0f\x34\xc8\xd3\xf5\x77\x76\x43"
- "\x5d\xef\x69\x47\xd7\x7b\xfe\xca\x74\xfd\x8b\x7b\x94\xe9\xfa\x17"
- "\x77\x2b\xd7\x8f\x53\x12\x39\xfd\x38\x25\x51\x5a\x3f\xfe\x69\x95"
- "\x7d\xfd\x38\xf9\x18\xa7\x1f\x27\x0d\x26\x1c\x3e\xa9\x27\xe1\xf0"
- "\x89\x65\xf2\xf5\xe3\xc4\x71\xb7\xf5\x63\x47\xea\xc7\x09\x5e\x44"
- "\x3f\x4e\xec\xa5\x4c\x3f\x4e\xf4\x12\xea\xc7\x3f\x0f\xb1\xd5\x8f"
- "\x13\x17\x3b\xaf\x1f\x27\xe6\x2a\xd3\x8f\x13\x73\x9c\xd3\x8f\x13"
- "\xaf\x89\xeb\xc7\x3f\xa5\x48\xeb\x47\xf2\x99\xed\xb8\x3f\x39\x97"
- "\x1b\xf7\x27\xcf\xee\xfe\xfa\x71\xb2\x87\xf8\x18\x3f\xb9\x17\xd1"
- "\x8f\x13\x9b\x3b\x5e\x3f\x4e\x6c\x16\xd7\x8f\x93\x57\x93\xb1\x76"
- "\xa2\xc1\x56\x3f\xc2\x35\xa2\xfa\x71\x32\x3b\xfe\x4f\x6c\x16\xea"
- "\x47\x52\x06\x70\xcd\x49\x69\xfd\x18\xcc\xae\x8b\x0d\x1e\x4b\xb8"
- "\x87\xc4\xd4\x56\x3f\x06\xfb\x38\xd6\x8f\x04\x43\x4c\x3d\x25\xf5"
- "\x63\x70\x98\xad\x7e\xfc\x53\xa2\xb8\x7e\x9c\x32\x92\xc3\xd1\x4b"
- "\xa7\x84\xfa\x31\xb8\xe8\xd6\xd0\x8f\x92\xd8\xf2\x10\xea\xc7\x97"
- "\x96\xca\xd7\x8f\x2f\xed\x91\xa7\x1f\x31\xe6\xc4\xf4\xe3\x4b\xd7"
- "\xac\x31\x27\xd4\x8f\x53\xfa\x8a\xeb\xc7\x29\x43\x84\xfa\x11\x97"
- "\x2f\xa6\x1f\xa7\x4c\x13\x94\x6f\xa3\x1f\xa7\x2c\x16\xea\x47\x72"
- "\x1e\xa7\x1f\xff\xac\x22\x1c\xfa\xa7\xc1\xf2\xf5\xe3\x94\x6b\xd2"
- "\xfa\x71\x8a\x49\xa8\x1f\xa7\x54\x13\x9d\xf8\x67\x0d\xd1\x8f\x53"
- "\xea\xc9\xf1\x3f\xf9\xf1\x8f\x73\xfa\x91\x1c\xe7\xf4\xe3\x9f\x47"
- "\x39\xd2\x8f\xf6\xb5\xc5\x8c\x46\x4e\x5b\xcc\x68\xe4\x6b\x8b\x32"
- "\x81\xb6\xf8\xb3\x83\xfd\xaf\x42\x46\x70\xda\xe2\xe5\x5c\xd2\xbf"
- "\x5f\x5e\x4e\xfa\xf7\xcb\xa3\x19\x6d\x31\x11\x34\x00\x68\x8b\xe2"
- "\x4b\x25\x44\x5b\x5c\x32\x50\xaf\xff\xcc\x6a\x8b\x46\xe4\x99\xbe"
- "\x90\xd5\x16\xe1\x58\x5b\x4c\xfb\x10\x6b\x0b\xaf\x7c\xd0\xb7\xf5"
- "\xac\xde\x8d\x01\xbd\x5b\x0f\xff\x43\xdf\x39\x02\x65\x54\x82\x26"
- "\xcd\xc2\xd7\xe3\xf7\x80\x40\x59\xcc\xda\x5a\x66\xdd\xad\xae\x87"
- "\x7a\x0e\x59\xb3\x8b\xdf\xe3\x22\xf5\x0e\x17\xcb\xfb\x5b\x12\xeb"
- "\x69\x33\x7e\x5f\xcb\xe4\x48\xde\x7b\x5c\xf0\xbb\x5f\xf5\x0d\x08"
- "\xbf\xcb\x25\x3f\x16\xa9\xde\xc2\x5a\xa3\x01\x79\xf7\x5e\xed\xd6"
- "\x1b\xbf\xc7\xa5\x77\x33\xd1\xb4\xc5\xe6\x52\xa2\x69\x97\xf8\xde"
- "\x05\x3a\x69\xe8\xf6\x26\x4e\x63\x6c\xc6\xfa\x62\x89\x46\xdd\xbc"
- "\x44\xf3\xc0\xd5\xab\xa0\x69\xf5\xd6\xef\xf9\xf8\xc6\x80\xdf\x25"
- "\x51\x95\x40\x72\xa0\xcc\xfb\x3d\x5e\xd3\xa0\x1d\xaf\x82\xee\x69"
- "\x44\x6e\x8f\xe3\x77\x7c\x54\x20\xef\x47\x06\x02\xef\x5f\xd5\x0c"
- "\xe4\xef\xcf\x89\xf3\xa2\xe6\xab\x1a\x54\x1e\xf1\x2d\xb3\xce\xd6"
- "\x68\x59\x67\xdb\x84\x46\xe9\x97\x68\xa8\x6d\xb1\x3c\x4d\xeb\x83"
- "\x35\xed\xd3\x76\x34\xed\xb4\x55\xca\x34\xed\xb4\x44\xa1\xde\x98"
- "\xb9\xd5\x56\x6f\x4c\x3b\xeb\xbc\xde\x78\xb9\x87\x32\xbd\xf1\xb2"
- "\x87\x73\x7a\xe3\xe5\x28\x6b\xbd\xb1\x87\xd1\x1b\x7f\xae\xc3\xd8"
- "\x14\xd7\x1b\xe4\x33\xdb\x71\x22\xa4\x07\x37\x4e\xfc\xe5\x64\xf7"
- "\xd7\x1b\x7f\x89\x13\x1f\x13\xfe\xb2\x8a\xe8\x8d\x97\x23\x3b\x5e"
- "\x6f\xbc\x1c\x29\xae\x37\xfe\x72\x85\x70\xf3\xcb\xd1\xb6\x7a\x03"
- "\xae\x11\xd5\x1b\x21\x83\xd9\x6b\x22\x85\x7a\x83\x94\x01\xfc\x33"
- "\x4e\x5a\x6f\x84\x9c\x21\x7c\x14\x52\x4c\xf8\x88\xc4\xd4\x56\x6f"
- "\x84\xac\x77\xac\x37\x08\x86\x98\x7a\x4a\xea\x8d\x90\x0a\x5b\xbd"
- "\xf1\xe7\x5a\x71\xbd\x31\xa3\x88\xc3\xd1\x8c\xf1\x42\xbd\x31\xdd"
- "\xe7\xd6\xd0\x1b\x92\xd8\x8a\x13\xea\x8d\xe9\xe7\xe5\xeb\x8d\x19"
- "\xf7\xca\xd3\x1b\x18\x73\x62\x7a\x63\x46\x94\x35\xe6\x84\x7a\x63"
- "\xc6\x6a\x71\xbd\x31\x63\xab\x50\x6f\xe0\xf2\xc5\xf4\xc6\x8c\xe3"
- "\x82\xf2\x6d\xf4\xc6\x8c\xb3\x42\xbd\x41\xce\xe3\xf4\xc6\xcc\x75"
- "\xac\x67\x5b\x2d\x5f\x6f\xcc\x8c\x92\xd6\x1b\x33\x17\x08\xf5\xc6"
- "\x4c\x7f\xa2\x2b\x66\xe6\x11\xbd\x31\x73\x2a\x39\xfe\xe7\x14\xfe"
- "\x71\x4e\x6f\x90\xe3\x9c\xde\x98\x79\x7b\xfd\xeb\x2d\x95\xaf\x0a"
- "\x53\xb8\xfe\x35\xec\xf6\xfa\xd7\x4e\x79\x0e\x3d\x93\x5d\xff\x1a"
- "\xae\x70\xfd\x6b\xf8\xed\xf5\xaf\x9d\x12\x97\x30\x76\xfd\x6b\x84"
- "\xc2\xf5\xaf\x11\xb7\xd7\xbf\x76\x4a\x5c\x66\xb1\xeb\x5f\xe7\x28"
- "\x5c\xff\x3a\xc7\x85\xf5\xaf\xf3\xbc\x39\x6f\x3c\xcf\x5b\xda\x1b"
- "\xcf\x71\xb0\xfe\xf5\xb5\x10\xce\x1b\x47\x1d\x22\x5a\x34\xaa\x80"
- "\x68\xd1\x28\x26\x37\x95\x84\xbd\xf1\xdb\x69\x11\x1f\xc4\x1e\xa4"
- "\xf0\xbe\x70\xf8\xdd\x98\x19\x2b\x90\x87\x11\x7b\x63\x88\x41\x46"
- "\x2b\xf6\xc6\xc7\x50\xcc\x3c\xec\x8d\x23\x4f\x55\xd6\xf3\xde\xaf"
- "\x42\xbd\x32\x9e\xdb\xcf\xf9\x18\xc2\x9f\x1d\x69\x3a\x48\x65\xb5"
- "\x5a\xe5\xe4\x63\x0d\x94\x7a\xa1\x30\x27\x6f\xca\x4d\x0e\xc6\x39"
- "\xf9\x16\xf6\x5d\x29\x4c\x5e\x7e\x98\xfd\x9c\x7c\x41\x2b\x8c\x9d"
- "\x22\x79\x79\x9c\x93\x87\x31\xf2\x57\x96\x93\x8f\x60\xd7\xc6\x46"
- "\xee\x54\x96\x93\x8f\x2c\x14\x7a\xe4\x79\x87\x6d\x3d\x72\x54\x0f"
- "\xe7\x3d\x72\xd4\x10\x65\x1e\x39\x4a\xe3\x9c\x47\x8e\x4a\x15\xf7"
- "\xc8\x73\x0c\x49\x92\x1e\x99\x7c\x66\xeb\x6d\x5e\x1b\xc2\x79\x9b"
- "\x57\xaf\x75\x7f\x8f\xfc\x6a\x9e\xb8\x8f\x79\x75\x27\xf1\xc8\x51"
- "\x1b\x3b\xde\x23\x47\x6d\x14\xf7\xc8\xaf\xb1\xcf\xbf\xa3\xd2\x6d"
- "\x3d\x32\x5c\x23\xea\x91\x5f\x9b\xc0\x5e\xb3\x51\xe8\x91\x49\x19"
- "\xc0\x43\x51\xd2\x1e\x39\xda\x8d\xf0\xd2\x6b\x27\x09\x2f\x91\x98"
- "\xda\x7a\xe4\xd7\xf6\x38\xf6\xc8\x04\x43\x4c\x3d\x25\x3d\xf2\x6b"
- "\x57\x6c\x3d\xf2\x1c\x89\xb5\xb1\x73\xcb\x38\x1c\xcd\x9d\x2b\xf4"
- "\xc8\xd1\xa3\x6f\x0d\x8f\x2c\x89\xad\x3c\xa1\x47\x9e\xdb\x53\xbe"
- "\x47\x9e\x3b\x56\x9e\x47\xc6\x98\x13\xf3\xc8\x73\x53\xad\x31\x27"
- "\xf4\xc8\x73\x8b\xc4\x3d\xf2\xdc\xc3\x42\x8f\x8c\xcb\x17\xf3\xc8"
- "\x73\x2f\x0a\xca\xb7\xf1\xc8\xf3\x7a\x08\x3d\x32\x39\x8f\xf3\xc8"
- "\xf3\x76\x13\x0e\x9d\xa3\x60\x6d\xec\xbc\x54\x69\x8f\x3c\x2f\x5b"
- "\xe8\x91\xe7\x45\x12\x2f\x3c\xef\x53\xe2\x91\xe7\x25\x90\xe3\x73"
- "\xf2\xf9\xc7\x39\x8f\x3c\xc7\x6a\x6d\xec\xbc\xf2\xdb\x6b\x63\x6f"
- "\x25\x8f\x3c\x5f\x61\xfe\x7b\x7e\x62\xf7\xd0\xfc\xbf\x36\x2f\x36"
- "\x4f\x47\x34\xd7\x42\x1f\x65\x9a\x7f\xa1\xaa\x7b\xc4\xe5\xd7\xe6"
- "\xc5\xe6\xb3\x6b\x96\x17\x15\x2b\x8b\xcb\xa2\xbd\xca\xbd\xd8\xb2"
- "\x7c\xce\x8b\x2d\xcb\x97\xf6\x62\x31\xab\xed\x7b\xb1\xb8\x7a\xce"
- "\x8b\x2d\x19\x4f\x34\xcf\x92\x21\x44\xf3\xc4\x5e\x94\xef\xc5\x62"
- "\x67\x0b\xbd\x58\xcc\xc9\xdb\x5e\xac\xb3\xbc\xd8\xc2\x50\x82\xbf"
- "\xd8\x61\xca\xbc\x58\xec\x50\xa1\x17\x4b\x98\x60\xeb\xc5\x62\xb3"
- "\x9d\xf7\x62\xb1\x0a\xf7\xff\x8d\xdd\xef\x9c\x17\x5b\xe2\x23\xee"
- "\xc5\x62\xd6\x49\x7b\x31\xf2\x99\xad\x86\x8e\x3b\xc0\x69\xe8\xb8"
- "\xd5\xdd\xdf\x8b\xc5\xf9\x89\xeb\xe5\xb8\x61\xc4\x8b\x2d\x51\x75"
- "\xbc\x17\x5b\xa2\x12\xf7\x62\x71\x3b\x89\x6e\x5d\xe2\x6b\xeb\xc5"
- "\xe0\x1a\x51\x2f\x16\x77\x8a\xbd\x46\x25\xf4\x62\xa4\x0c\xe0\xa1"
- "\x2b\xd2\x5e\x6c\x69\x06\xe1\xa5\xa5\x61\x84\x97\x48\x4c\x6d\xbd"
- "\xd8\xd2\x91\x8e\xbd\x18\xc1\x10\x53\x4f\x49\x2f\xb6\x74\x95\xad"
- "\x17\x8b\x49\x11\xf7\x62\xcb\x78\xeb\x34\xe2\xaf\x09\xbd\xd8\xd2"
- "\xe3\xb7\x86\x17\x93\xc4\x96\x9f\xd0\x8b\xc5\xe7\xca\xf7\x62\xf1"
- "\x65\xf2\xbc\x18\xc6\x9c\x98\x17\x5b\xe6\x63\x8d\x39\xa1\x17\x5b"
- "\xf6\xa4\xb8\x17\x5b\x36\x41\xe8\xc5\x70\xf9\x62\x5e\x6c\xd9\x52"
- "\x41\xf9\x36\x5e\x6c\x59\xb6\xd0\x8b\x91\xf3\x38\x2f\x96\x30\x82"
- "\x1d\xef\x86\xc8\xf7\x62\x09\x3e\xd2\x5e\x2c\xe1\x7e\xa1\x17\x5b"
- "\xa6\x27\x9e\x2b\x21\x90\x78\xb1\x04\x0f\x72\x3c\x46\xc3\x3f\xce"
- "\x79\x31\x72\x9c\xf3\x62\x09\x21\xb7\xd7\xcd\xde\x4a\x5e\x6c\x45"
- "\x4f\x65\x5e\x0c\x48\xeb\xb6\xe6\xef\x04\xcd\x9f\x30\x9f\x68\xae"
- "\x95\x3b\x95\x69\xfe\x95\x85\xca\x35\xff\xda\x2c\x4e\xf3\xaf\xcd"
- "\x92\xd6\xfc\x89\x4b\xed\x6b\xfe\x94\x5a\x4e\xf3\x27\x8f\x26\x63"
- "\x6b\xf2\xfd\x64\x6c\x4d\x3a\x23\x5f\xf3\x27\x4d\x13\x6a\xfe\xc4"
- "\xe3\xb7\x35\x7f\x67\x69\xfe\x15\xc1\x04\x7f\x49\x0f\x29\xd3\xfc"
- "\x49\x6a\xa1\xe6\x5f\x37\xd6\x56\xf3\x27\xd9\xbc\xff\x43\x5a\xf3"
- "\x27\xed\x51\xa6\xf9\x93\x76\x3b\xa7\xf9\x93\x7b\x8a\x6b\xfe\xc4"
- "\x04\x69\xcd\x4f\x3e\xb3\xd5\x6a\x29\x7b\x38\xad\x96\xb2\xb4\xfb"
- "\x6b\xfe\x14\x5f\x71\x5d\x96\xf2\x10\xd1\xfc\xc9\x9e\x1d\xaf\xf9"
- "\x93\x3d\xc5\x35\x7f\x4a\x2e\xd1\x47\xc9\x5e\xb6\x9a\x1f\xae\x11"
- "\xd5\xfc\x29\x65\xec\x35\x9e\x42\xcd\x4f\xca\x00\x1e\x3a\x2f\xad"
- "\xf9\x57\xaf\x26\xbc\xb4\x9a\x7d\x57\x18\x89\xa9\xad\xe6\x5f\x3d"
- "\xc4\xb1\xe6\x27\x18\x62\xea\x29\xa9\xf9\x57\x2f\xb6\xd5\xfc\x89"
- "\x71\xe2\x9a\x7f\xed\x04\x0e\x47\x6b\x2e\x0a\x35\xff\xea\x43\xb7"
- "\x86\xe6\x97\xc4\x96\xaf\x50\xf3\xaf\x49\x95\xaf\xf9\xd7\x1c\x96"
- "\xa7\xf9\x31\xe6\xc4\x34\xff\xda\x9e\xd6\x98\x13\x6a\xfe\xb5\x83"
- "\xc5\x35\xff\xda\xb1\x42\xcd\x8f\xcb\x17\xd3\xfc\x6b\xe7\x0a\xca"
- "\xb7\xd1\xfc\x6b\xd7\x0b\x35\x3f\x39\x8f\xd3\xfc\xeb\x34\xec\x78"
- "\x77\xbf\x7c\xcd\xbf\xae\xa7\xb4\xe6\x5f\xd7\x57\xa8\xf9\xd7\xb2"
- "\x6b\x67\xd7\x8d\x21\x9a\x7f\xad\x81\x1c\x4f\x1c\xc8\x3f\xce\x69"
- "\x7e\x72\x9c\xd3\xfc\xeb\x82\x6e\xaf\xa9\xbd\x95\x34\xff\x7a\x93"
- "\x32\xcd\xbf\xde\xa8\x5c\x5b\x66\xf0\xd6\xbd\x64\xd8\x59\xf7\xb2"
- "\xe1\xa4\x7d\x6d\xf9\x3a\x6f\xdd\x4b\x2a\xbb\xee\x25\x95\x5d\xf7"
- "\x92\x3a\x5a\xbe\xb6\xdc\xf8\xa1\x50\x5b\xfe\xed\xa1\xdb\xda\xb2"
- "\xb3\xb4\xe5\xba\x08\xa2\x2d\x37\xae\x52\xa6\x2d\x37\x5a\xad\x7f"
- "\xc9\x14\x59\xff\xb2\x51\xc6\xfa\x97\x54\x85\xeb\x5f\x52\x9d\x5c"
- "\xff\x92\x2a\xb1\xfe\x65\x43\x8d\xb4\xb6\x24\x9f\xd9\x6a\x82\xd7"
- "\x79\xeb\x5f\xd2\x6e\x81\xf5\x2f\x69\x12\x6b\x14\xd2\xd8\xf5\x2f"
- "\xa9\x9d\xb0\xfe\x25\x55\x62\xfd\x4b\x1a\xbb\xfe\x25\x55\x64\xfd"
- "\x4b\xaa\xc4\xfa\x97\xd7\xd9\xf5\x2f\xa9\x56\xeb\x5f\x52\xd9\xf5"
- "\x2f\xaf\xdb\x59\xff\xf2\x3a\xbb\xfe\xe5\x75\x76\xfd\x0b\x89\xa9"
- "\xad\xb6\x7c\xdd\x89\xf5\x2f\xa9\xec\xfa\x97\x54\x3b\xeb\x5f\x5e"
- "\x17\x59\xff\xb2\xa1\x5a\x5c\x5b\x66\xf0\xd6\xbf\x64\x58\xad\x7f"
- "\x49\xbf\x45\xd6\xbf\x48\x62\xcb\x6a\xfd\x4b\xba\x82\xf5\x2f\x19"
- "\x32\xd7\xbf\xa4\x4a\xac\x7f\xc9\x88\xb2\xc6\x9c\x50\x5b\x66\x48"
- "\xac\x7f\xc9\xb0\x5a\xff\x92\x2a\xb1\xfe\x25\xe3\xb8\xa0\x7c\x1b"
- "\x6d\x99\x61\xb5\xfe\x25\xd5\x6a\xfd\x4b\x26\xbb\xfe\x65\xc3\x72"
- "\xf9\xda\x32\xd3\xce\xfa\x97\x4c\xab\xf5\x2f\x99\xec\xfa\x97\x4c"
- "\x76\xfd\x4b\x26\xbb\xfe\x65\x43\x02\xff\x38\xa7\x2d\xc9\x71\x4e"
- "\x5b\x66\x3a\x5c\xff\x62\x5f\x77\x6c\x49\xe0\x74\xc7\x96\x04\x69"
- "\xdd\xb1\x69\x82\x7d\xdd\xb1\x59\xcb\xe9\x8e\x37\x1e\x22\xfd\xfb"
- "\x8d\x1e\xa4\x7f\x67\x33\xcf\x61\x56\x55\x80\xee\x18\x94\x16\xb1"
- "\xef\xe7\x12\x46\x77\x7c\xb0\xd0\x40\x81\x46\xf4\x30\x63\xdd\x01"
- "\x5a\x30\x3d\x1e\xeb\x8e\x7a\x76\xbd\x6d\xf6\xd8\x8a\x04\xbe\xee"
- "\xd8\x54\xc0\xac\xbd\x6d\x7f\xdf\x73\x3d\xc2\x9f\x8b\xad\xc5\x3d"
- "\xbc\x90\x5d\x8b\x0b\x65\xf3\xd7\xe0\x32\xeb\x72\x7f\x06\x5d\x32"
- "\x07\xe2\xc1\xd3\x25\xb7\xd7\xe2\xda\x5b\x8b\x9b\xad\x30\xff\x9d"
- "\xed\x29\xd4\x22\x6f\x0e\xb6\xd5\x22\xd9\x0b\x9c\xd7\x22\xd9\xd9"
- "\xca\xb4\x48\x76\x96\x73\x5a\x24\xfb\x8a\xb8\x16\xd9\x14\x84\x71"
- "\x2b\xae\x45\xc8\x67\xb6\x63\xc8\xe6\x6c\x6e\x0c\xd9\x1c\xd6\xfd"
- "\xb5\xc8\x66\x24\x3e\x5e\x6c\xee\x49\xb4\x48\xb6\xbe\xe3\xb5\x48"
- "\xb6\x5e\x5c\x8b\x6c\x5e\x45\x78\x3b\xbb\xd9\x56\x8b\xc0\x35\xa2"
- "\x5a\x64\xf3\x87\xec\x35\x7a\xa1\x16\x21\x65\x00\x37\x55\x48\x6b"
- "\x91\x9c\xb9\x84\xab\x72\x46\x13\xae\x22\x31\xb5\xd5\x22\x39\x7d"
- "\x1d\x6b\x11\x82\x21\xa6\x9e\x92\x5a\x24\x67\xba\xad\x16\xd9\x14"
- "\x28\xae\x45\xb6\x3c\xc9\xe1\x28\xf7\xa4\x50\x8b\xe4\xec\xbc\x35"
- "\xb4\x88\x24\xb6\x90\x50\x8b\xe4\x2e\x96\xaf\x45\x72\x8b\xe4\x69"
- "\x11\x8c\x39\x31\x2d\x92\x7b\xc5\x1a\x73\x42\x2d\xb2\xa5\x97\xb8"
- "\x16\xd9\x32\x58\xa8\x45\x70\xf9\x62\x5a\x64\xcb\x4b\x82\xf2\x6d"
- "\xb4\xc8\x96\x05\x42\x2d\x42\xce\xe3\xb4\xc8\x9b\xde\xac\x9f\xbb"
- "\x22\x5f\x8b\x6c\xb9\x22\xad\x45\xb6\xb4\x08\xb5\xc8\x96\x72\xa2"
- "\x39\xde\xf4\x23\x5a\x64\x8b\x8e\xd5\x28\x7a\xfe\x71\x4e\x8b\x90"
- "\xe3\x9c\x16\x79\x73\x84\x8c\x3c\xd7\x54\x39\x6b\x71\x8b\xaf\x0b"
- "\xf3\x5c\x96\x1c\x97\x71\xe8\xac\x80\xf6\x3c\x17\xff\x39\xa9\x48"
- "\x9e\x0b\x8f\xe9\x5c\x9e\xeb\x0c\xc3\x55\x5c\x9e\x4b\xc7\xe4\xb9"
- "\x70\x8e\x0b\x3f\x2b\xb5\xe4\xb8\xcc\xcb\x6c\xd7\xe1\x16\x9b\xe5"
- "\xe7\xb8\xb8\xe7\xa5\x75\x31\x24\xc7\x55\xdb\x9e\xe3\xc2\xe3\xb9"
- "\xe9\x86\x6d\x8e\x0b\x8f\xe3\x5c\x8e\xeb\xdb\x0e\xce\x71\xe5\x9d"
- "\x55\x36\xae\xe7\xe9\xba\xc7\x73\xed\x5f\xdb\x3a\xdc\x37\x03\x49"
- "\xee\x67\xdb\x72\x65\xcf\xb5\xb7\x25\x74\x8f\xb8\xfc\xda\xe6\x7e"
- "\x6f\xd5\x90\xb8\xe4\xf7\x55\x16\x97\x7c\xef\xee\x11\x97\x5f\xdb"
- "\x3c\x90\x6d\x5a\x12\x97\x82\x3d\xca\xe2\x52\xe0\xc2\xfe\x97\x45"
- "\x9f\x72\x9e\xb9\xe8\x53\xbe\x67\x2e\x0d\xe0\x7b\xe6\xed\x0e\xf6"
- "\xbf\x7c\xc7\x83\xf3\xcc\x3b\xa3\x88\x0e\xdd\x39\x81\xe8\xd0\x9d"
- "\xcc\xf3\xa9\x55\xe3\x10\xe3\x95\x8d\xd8\x37\xcf\x33\x50\xfb\x2e"
- "\x69\x29\xe3\x1a\xe2\x97\xab\x8c\xe5\xa8\x42\x6f\x40\xaf\xc7\x23"
- "\x8f\xd4\x9f\x91\xc7\x7b\x4d\x06\xaa\xcf\x7c\xe4\x09\x63\x12\xb4"
- "\x59\x39\xe8\x98\x02\x14\x93\x84\xbd\x74\xe1\xea\xaa\x18\x3d\xcf"
- "\x4b\x6f\x3f\xcf\xf9\x68\x38\x2f\xc6\x80\x3e\x9b\xa7\xa5\xb0\x5f"
- "\x6e\xcb\x4d\x0e\x6e\x1b\x36\xcb\x9f\xd9\xc7\x8a\x9f\xcf\x87\xef"
- "\x56\x87\x0b\xf3\xf9\xad\xb9\xc9\x53\x5b\x8a\x67\x05\x30\x7b\x68"
- "\x0e\xe6\x72\xfa\x72\xf6\xcf\x7c\xab\x15\xa9\x2c\xf9\xfc\xb7\x7e"
- "\x75\xf9\xfc\xfc\x10\x82\xd1\xc2\x89\xca\xf2\xf9\x85\x41\x42\x0f"
- "\xfd\xee\x5c\x5b\x0f\x5d\xf8\xa1\xf3\x1e\xba\xf0\x94\x32\x0f\x5d"
- "\x58\xe3\x9c\x87\xde\x39\xd2\xda\x43\xef\x4e\xc2\x1e\x7a\x7b\x0a"
- "\xc6\xb1\xb8\x87\x26\x9f\xd9\x7a\x9f\xb7\x4f\x71\xde\xe7\xed\x9d"
- "\xdd\xdf\x43\xbf\x1d\x20\xee\x73\xde\x9e\x48\x3c\xf4\xce\x11\x1d"
- "\xef\xa1\x77\x8e\x10\xf7\xd0\x6f\x1f\x25\x7e\x63\xe7\x08\x8b\x1f"
- "\xe6\x3c\x34\x5c\x23\xea\xa1\xdf\xbe\x66\x7d\x0d\xf1\xd0\x3b\x47"
- "\x11\x0f\xfd\x4e\x5f\x69\x0f\xfd\x4e\x31\xe1\xae\x77\x56\x11\xee"
- "\x22\x31\xb5\xf5\xd0\xef\x4c\x73\xec\xa1\x09\x86\x98\x7a\x4a\x7a"
- "\xe8\x77\x0a\x6c\x3d\xf4\x76\x89\xfd\x33\x8b\x96\x72\x38\x2a\xf2"
- "\x11\x7a\xe8\x77\xce\xdf\x1a\x1e\x5a\x12\x5b\x01\x42\x0f\xbd\xeb"
- "\x80\x7c\x0f\xbd\xeb\xa2\x3c\x0f\x8d\x31\x27\xe6\xa1\x8b\x46\xb2"
- "\xf8\x19\x25\xee\xa1\x8b\x5e\x12\xf7\xd0\x45\x73\x85\x1e\x1a\x97"
- "\x2f\xe6\xa1\x8b\x72\x05\xe5\xdb\x78\xe8\xa2\x0f\x85\x1e\x9a\x9c"
- "\xc7\x79\xe8\x77\x59\xcf\xba\x5d\xc1\xfe\x99\xef\x8e\x94\xf6\xd0"
- "\xef\x8e\x15\x7a\xe8\x77\xbd\x89\x57\x7e\x37\x9a\x78\xe8\x77\xfd"
- "\xc8\xf1\xed\x7e\xfc\xe3\x9c\x87\xde\x6e\xb5\x7f\xe6\xbb\x09\x32"
- "\x3c\x74\x48\x07\x79\xe8\xc0\x5b\xcb\x43\x7f\x3f\xbc\x7b\x78\xe8"
- "\xdd\x83\x95\x79\xe8\xdd\x7e\x4e\x7a\x82\xa9\x0e\x3c\x41\xc0\x6d"
- "\x4f\xc0\xd7\x5b\xef\xa6\x13\xbd\xb5\xe7\xb0\x32\x4f\xb0\xe7\xd3"
- "\xee\x10\x97\x5f\x57\x4c\x76\xb3\xf3\xf5\xdf\x7f\x49\x59\x4c\xde"
- "\x0f\xbe\xed\x9f\x3b\x23\x2e\xef\x79\x90\xb8\xec\xbd\xa8\x2c\x2e"
- "\x7b\x1b\x94\xfb\xe7\x03\x6a\xce\x3f\x1f\x50\xf3\xfd\xf3\xbf\x05"
- "\xcf\x9c\x8b\x0f\xdb\xf7\xcf\x1f\x45\x73\xfe\xb9\xa4\x8c\x68\xd0"
- "\x12\x76\x4e\x49\x09\x93\x53\x4f\x3c\x40\xfc\xf3\x75\xec\x9f\x2f"
- "\x80\x7f\x7e\x35\x82\x32\xb2\xef\x8e\xc0\xf3\xd7\x2a\xc0\x03\x63"
- "\xcf\x5c\x95\x00\x7f\xc7\xe9\xd1\xeb\xb1\xc8\x23\x0d\xbc\xef\x1e"
- "\x18\x2b\xf7\xc4\xeb\xa9\x8d\xf3\x60\x9c\xa9\x2d\x46\x7d\xa2\xc1"
- "\x57\x37\x61\x5f\x7d\x0c\x3c\xf3\x7a\xd6\x57\x7f\x70\xbe\x2a\x8e"
- "\xef\xab\xf7\x8d\x65\x7c\xb5\x9e\xcc\x8d\xab\x8a\x03\x5f\x0d\xdf"
- "\x87\xdf\x45\xc1\xf7\xd5\x2d\xe0\x9b\x5b\xc1\x37\x67\x5d\xb2\xf2"
- "\xd8\xaf\xda\x7a\xec\x16\x9f\xe4\x10\xc3\xb0\x59\x81\xd8\x63\x5f"
- "\x2f\xba\xed\xb1\x6d\x3d\xf6\xfb\x79\x04\xc7\x1f\x7c\xa8\xcc\x63"
- "\x7f\x50\x22\xf4\xd8\x07\x2a\x6c\x3d\x76\x89\x8f\xf3\x1e\xbb\x64"
- "\xb4\x32\x8f\x5d\x32\xca\x39\x8f\x5d\xb2\xd5\xda\x63\xbf\xcb\x3c"
- "\xa7\x2e\xd6\x62\xac\x8b\x7b\x6c\xf2\x99\xad\x37\xfa\x68\x34\xe7"
- "\x8d\x3e\xea\xd1\xfd\x3d\xf6\x87\xbb\xc5\x7d\xd0\x87\x1f\x12\x8f"
- "\x5d\x92\xd7\xf1\x1e\xbb\x24\x4f\xdc\x63\x7f\xc4\xce\x7f\x2b\xc9"
- "\xb3\xf5\xd8\x70\x8d\xa8\xc7\xfe\x68\xba\xf5\x35\xc4\x63\x97\xe4"
- "\x13\x8f\xfd\xd1\x52\x69\x8f\xfd\x71\x5f\xc2\x6f\x1f\x9d\x25\xfc"
- "\x46\x62\x6a\xeb\xb1\x3f\x3a\xe4\xd8\x63\x13\x0c\x31\xf5\x94\xf4"
- "\xd8\x1f\xbb\xd9\x7a\xec\xe2\x4f\xc5\x3d\xf6\xfe\xd3\x1c\x8e\xf6"
- "\x2f\x17\x7a\xec\x8f\x27\xdc\x1a\x1e\x5b\x12\x5b\xbb\x85\x1e\x7b"
- "\xff\xbd\xf2\x3d\xf6\xfe\x89\xf2\x3c\x36\xc6\x9c\x98\xc7\xde\xbf"
- "\x95\xc5\x4f\xbe\xb8\xc7\xde\x7f\x40\xdc\x63\xef\xaf\x10\x7a\x6c"
- "\x5c\xbe\x98\xc7\xde\xdf\x22\x28\xdf\xc6\x63\x1f\xf0\x11\x7a\x6c"
- "\x72\x1e\xe7\xb1\x0f\x1c\x24\x1c\x5a\x1c\x25\xdf\x63\x1f\xd8\x2a"
- "\xed\xb1\x0f\xec\x14\x7a\xec\x03\x71\xc4\x4b\x1f\x28\x27\x1e\xfb"
- "\xc0\x46\x72\xbc\x38\x92\x7f\x9c\xf3\xd8\xe4\x38\xe7\xb1\x0f\xd4"
- "\xc9\x7b\x4e\xed\xd2\x7e\x58\x01\x5d\xbf\x1e\xa3\xa3\xf6\xc3\xb2"
- "\x3c\xab\xbe\xd9\xeb\x31\xfe\x99\xa1\xcc\x67\xff\x33\xfd\xb6\x9f"
- "\xeb\x68\xdf\x70\x40\x4f\xf4\xd6\x21\x85\xfb\xdf\x1e\x52\xdf\xf6"
- "\x73\x9d\x11\x97\x7f\xd6\x90\xb8\xfc\xeb\x90\xb2\xb8\xfc\xeb\xa0"
- "\x72\x3f\xf7\x79\x39\xe7\xe7\x3e\x2f\x97\x7e\x1e\xfa\x49\x86\x7d"
- "\x3f\xa7\x55\x71\x7e\xee\xc8\x52\xa2\x77\x8e\x4c\x27\x7a\xe7\xc8"
- "\xbd\x1d\xf7\x3c\xf4\x70\xb6\xf0\x79\xe8\x27\xd7\x6e\x3f\x0f\xed"
- "\x0a\xaf\x76\x28\x9a\x60\xf4\x70\x98\x32\xaf\x76\x38\x54\xe8\xd5"
- "\xbe\x58\x6e\xeb\xd5\x0e\x1f\x75\xde\xab\x1d\x3e\xaf\xcc\xab\x1d"
- "\xae\x77\xce\xab\x1d\x19\x2f\xfe\x3c\xf4\x93\x2c\xe9\xe7\xa1\xe4"
- "\x33\x5b\x8d\xfd\xd9\x79\x4e\x63\x7f\xf6\x61\xf7\xf7\x6a\x9f\x4d"
- "\x15\xd7\xd3\x9f\x85\x11\xaf\x76\x24\xa0\xe3\xbd\xda\x91\x00\x71"
- "\xaf\xf6\xd9\x49\xa2\x6b\x8f\x04\xd8\x7a\x35\xb8\x46\xd4\xab\x31"
- "\x1a\x4e\x70\x0d\xf1\x6a\x47\x02\x89\x57\xd3\x3e\x24\xed\xd5\xb4"
- "\x87\x09\x77\x69\x33\x08\x77\x91\x98\xda\x7a\x35\x6d\x94\x63\xaf"
- "\x46\x30\xc4\xd4\x53\xd2\xab\x69\x8b\x6d\xbd\xda\x27\xe9\xe2\x5e"
- "\xed\xf3\xf5\x1c\x8e\x3e\x1f\x2c\xf4\x6a\xda\x6b\xb7\x86\x57\x93"
- "\xc4\xd6\x54\xa1\x57\x3b\x7a\x5c\xbe\x57\x3b\xda\x22\xcf\xab\x61"
- "\xcc\x89\x79\xb5\xcf\xc7\xb3\xf8\x09\x14\xf7\x6a\x9f\xcf\x16\xf7"
- "\x6a\x9f\x2f\x17\x7a\x35\x5c\xbe\x98\x57\xfb\xbc\x48\x50\xbe\x8d"
- "\x57\xfb\xfc\xa8\xd0\xab\x91\xf3\x38\xaf\xf6\x45\x24\x3b\xf6\x8d"
- "\x94\xef\xd5\xbe\x18\x2f\xed\xd5\xbe\x98\x28\xf4\x6a\x5f\xa8\x89"
- "\x27\xfb\x22\x81\x78\xb5\x2f\x46\x90\xe3\x9f\x8c\xe0\x1f\xe7\xbc"
- "\x1a\x39\xce\x79\xb5\x2f\x36\xca\xf3\x6a\xce\xef\x97\x75\xf3\xe7"
- "\x14\x7b\xff\xca\xe6\x14\x1f\x1f\xa9\xcc\xa7\x1d\x1f\x71\xdb\x13"
- "\x74\x86\x27\xf8\x22\x9f\xe8\xad\x7f\x57\x28\xf3\x04\xff\x2e\x57"
- "\xee\x09\x2a\x75\x9c\x27\xa8\xd4\x49\x7b\x82\xff\xec\xb4\xef\x09"
- "\xca\x35\x9c\x27\x38\x91\x4a\xc6\xd5\x13\x0b\xc8\xb8\x7a\x62\x58"
- "\xc7\x79\x82\xb2\x22\xa1\x27\x28\xed\x79\xdb\x13\x74\x85\x27\x38"
- "\x9e\x48\x30\x5a\xb6\x58\x99\x27\x28\x8b\x11\x7a\x82\xaa\x0c\x5b"
- "\x4f\x50\x76\xca\x79\x4f\x50\xd6\xa2\xcc\x13\x94\x19\x9c\xf3\x04"
- "\x27\xa6\x8b\x7b\x82\xff\xec\x92\xf6\x04\xe4\x33\x5b\x2d\xf7\x65"
- "\x0b\xa7\xe5\xbe\x3c\xde\xfd\x3d\xc1\x97\xd1\xe2\xba\xed\xcb\xc5"
- "\xc4\x13\x9c\x08\xe9\x78\x4f\x70\x22\x44\xdc\x13\x7c\x79\x9e\xe8"
- "\xa7\x13\x21\xb6\x9e\x00\xae\x11\xf5\x04\xe5\xf7\x5a\x5f\x43\x3c"
- "\xc1\x89\x50\xe2\x09\xca\x47\x4a\x7b\x82\xf2\x93\x84\xbb\xca\x77"
- "\x12\xee\x22\x31\xb5\xf5\x04\xe5\xcb\x1d\x7b\x02\x82\x21\xa6\x9e"
- "\x92\x9e\xa0\xfc\xa8\xad\x27\xf8\x4f\xa1\xb8\x27\xa8\xdc\xca\xe1"
- "\xa8\x72\xb4\xd0\x13\x54\xf4\xbc\x35\x3c\x81\x24\xb6\xa2\x85\x9e"
- "\xa0\xe2\xb4\x7c\x4f\x50\xd9\x4b\x9e\x27\xc0\x98\x13\xf3\x04\x95"
- "\xec\xf3\x3f\x82\x17\x5b\x4f\x50\xb9\x54\xdc\x13\x54\x66\x08\x3d"
- "\x01\x2e\x5f\xcc\x13\x54\x1e\x12\x94\x6f\xe3\x09\x2a\x4f\x09\x3d"
- "\x01\x39\x8f\xf3\x04\x55\x09\x84\x43\xff\x33\x41\xbe\x27\xa8\x9a"
- "\x2e\xed\x09\xaa\x66\x0b\x3d\x41\x15\xab\xfd\xab\xd2\x89\x27\xa8"
- "\x0a\x24\xc7\xff\x13\xc8\x3f\xce\x79\x02\x72\x9c\xf3\x04\x55\xf9"
- "\xb7\xf7\xd3\xba\x95\xf6\xd3\x3a\x39\x51\x99\x2f\x38\x19\xa4\x5c"
- "\x7f\x9e\x1e\xc3\xe9\xcf\xd3\x63\xf8\xfa\x53\xb8\xaf\xc5\x57\x0f"
- "\xd9\xd7\x9f\x5f\xaf\xe3\xf4\x67\xcd\x79\xc2\xe1\x35\x65\x84\xc3"
- "\x6b\x98\xbd\xf9\xe4\xed\xa7\x55\xe3\x26\xdc\x4f\xeb\xab\xc5\xb7"
- "\xf7\xd3\xea\x2c\x6d\x59\x55\x42\xb4\xe5\x7f\x2b\x94\x69\xcb\xff"
- "\x96\x0b\xb5\xe5\xe9\x8b\xb6\xda\xb2\xe6\x49\xe7\xb5\x65\xcd\x34"
- "\x65\xda\xb2\x66\xaa\x73\xda\xb2\xe6\x80\xf8\x1e\x16\x5f\xf9\x49"
- "\xef\xa7\x45\x3e\xb3\xd5\x04\x5f\xf3\xf6\xd5\xff\xfa\xa1\xee\xaf"
- "\x2d\x4f\x1d\x13\x1f\xff\x4f\x55\x10\x6d\x59\xb3\xbf\xe3\xb5\x65"
- "\xcd\x7e\x71\x6d\xf9\xf5\x38\x32\x0e\xd7\x1c\xb4\xdd\xc3\x02\xae"
- "\x11\xd5\x96\x5f\xb3\xfb\xdf\xd7\xec\x17\x6a\x4b\x52\x06\xf0\x50"
- "\xb6\xb4\xb6\xfc\x66\x18\xe1\xa5\xaf\x4d\x84\x97\x48\x4c\x6d\xb5"
- "\xe5\xd7\xa7\x1c\x6b\x4b\x82\x21\xa6\x9e\x92\xda\xf2\x9b\xfb\x6d"
- "\xb5\xe5\x57\x6a\x71\x6d\x59\x7b\x8d\xc3\x51\x6d\xae\x50\x5b\x7e"
- "\x13\x75\x6b\x68\x4b\x49\x6c\x1d\x13\x6a\xcb\xda\x91\xf2\xb5\x65"
- "\xed\x5c\x79\xda\x12\x63\x4e\x4c\x5b\xd6\x1e\xb0\xc6\x9c\x50\x5b"
- "\xd6\x9e\x14\xd7\x96\xb5\x17\x85\xda\x12\x97\x2f\xa6\x2d\x4f\xfb"
- "\x08\xca\xb7\xd1\x96\xa7\x9f\x14\x6a\x4b\x72\x1e\xa7\x2d\x4f\xd7"
- "\x10\x0e\x3d\x59\x26\x5f\x5b\x9e\x3e\x20\xad\x2d\x4f\x1f\x16\x6a"
- "\xcb\xd3\x59\x44\x43\x9e\x6e\x20\xda\xf2\xf4\x2e\x72\xfc\x64\x29"
- "\xff\x38\xa7\x2d\xc9\x71\x4e\x5b\x9e\x36\xc8\x5b\x7f\xd3\x21\xf9"
- "\xe6\x2e\x5a\x7f\xd3\x51\xf9\xe6\xee\xb2\xfe\xe6\xbb\x22\x65\xba"
- "\xf2\xbb\x5d\xb7\xe7\x05\x75\x74\xae\xf9\x5b\x2f\xa2\xb5\xce\x8c"
- "\x56\x96\x6b\x3e\x33\x4a\xb9\xd6\x3f\x1f\xcd\x69\xfd\xf3\xd1\xd2"
- "\xeb\x09\xbe\xef\x65\x5f\xeb\x9f\x2b\xe1\xb4\xfe\x59\x76\xbe\xad"
- "\xee\x1a\x19\x53\x75\x07\x94\xac\x27\x48\x6b\x42\x1e\xaf\x5b\xaf"
- "\x27\xa8\x39\x4c\xd6\x13\xc4\x5a\xaf\x27\xd0\x0d\x13\xae\x27\xf8"
- "\x3e\x43\x6a\x3d\x01\xce\x3d\xb7\x15\xcf\x0a\xc0\x6b\x09\x44\xd7"
- "\x11\xcc\xe8\xf8\x75\x04\xd8\x27\xbc\x05\xb8\xc5\x5e\x01\xf3\xcd"
- "\xaf\xcb\x2b\x7c\xd7\x48\xf0\xfb\x43\x8b\x32\xaf\xf0\x83\x41\xe8"
- "\x15\x2e\xf8\xd8\x7a\x05\x5d\x98\xf3\x5e\x41\xb7\x5a\x99\x57\xd0"
- "\xa5\x38\xe7\x15\x74\x67\xc5\xd7\x11\x7c\xef\x2d\xbd\x8e\x80\x7c"
- "\x66\xab\xf1\xce\xad\xe6\x34\xde\xb9\x89\xdd\xdf\x2b\x9c\xd5\x8b"
- "\xeb\xb9\xb3\x2d\xc4\x2b\xe8\x74\x1d\xef\x15\x74\x3a\x71\xaf\x70"
- "\x6e\x01\xd1\x55\x3a\x9d\x6d\x1e\x1a\xae\x11\xf5\x0a\xe7\x76\x5a"
- "\x5f\x43\xbc\x82\xae\x9e\x78\x85\x73\x87\xa5\xbd\xc2\xff\xa6\x13"
- "\x5e\xfb\x1f\xfb\x8e\x49\x12\x53\x5b\xaf\xf0\x3f\x37\xc7\x5e\x81"
- "\x60\x88\xa9\xa7\xa4\x57\xf8\xdf\x04\x5b\xaf\xf0\xbd\x97\xb8\x57"
- "\x38\xff\x10\x87\xa3\xfa\xa3\x42\xaf\xf0\xbf\xec\x5b\xc3\x2b\x48"
- "\x62\x4b\x2f\xf4\x0a\xf5\xb3\xe5\x7b\x85\xfa\x5c\x79\x5e\x01\x63"
- "\x4e\xcc\x2b\xd4\x9f\x65\xf1\x53\x2f\xee\x15\xea\x4d\xe2\x5e\xe1"
- "\xbc\x8f\xd0\x2b\xe0\xf2\xc5\xbc\xc2\xf9\x71\x82\xf2\x6d\xbc\xc2"
- "\xf9\x30\xa1\x57\x20\xe7\x71\x5e\xe1\x02\x22\x1c\x7a\xe6\x80\x7c"
- "\xaf\x70\xfe\xac\xb4\x57\x38\x7f\x51\xe8\x15\xce\x7f\x4a\x3c\xc1"
- "\x05\x15\xf1\x0a\xe7\xab\xc9\xf1\x33\xfb\xf9\xc7\x39\xaf\x40\x8e"
- "\x73\x5e\xe1\x82\x9f\xbc\xb9\x29\xce\xe7\xa1\x6f\xfe\xdc\x14\xcf"
- "\x5f\xd9\xdc\x94\x1f\x4f\x2a\xf3\x0a\x3f\x56\x2b\xd7\xa5\xbf\xd4"
- "\x71\xba\xf4\x97\x3a\xe9\x39\x10\x0d\x45\xf6\x75\xe9\x65\x3f\x4e"
- "\x97\xfe\xb4\x9e\xf0\xf7\x4f\x73\x09\x7f\xff\x34\xc4\xd9\x39\x10"
- "\x69\xd7\x59\x2d\x6a\x99\x03\x11\xcf\xce\x81\x00\x3d\x4a\xf4\xe7"
- "\xa5\x9d\xc2\x39\x10\x17\x7b\x49\xcd\x81\x10\x9d\xfb\x60\xa5\x39"
- "\x2d\xfa\xd4\x95\xb9\x0f\xbf\x6e\xcd\x79\x61\x14\xd1\x9c\x97\x16"
- "\x28\xd3\x9c\x97\xe6\x0b\x35\xa7\x3e\xd5\x56\x73\x5e\x3a\xe9\xbc"
- "\xe6\xbc\x74\x4d\x99\xe6\xbc\xd4\xec\x9c\xe6\xfc\x69\x9a\xf8\xdc"
- "\x87\x86\xdd\xd2\x73\x1f\xc8\x67\xb6\x5a\xa1\x91\x97\x57\x6c\x3c"
- "\xda\xfd\x35\x67\x63\xa4\xb8\x2e\x68\x5c\x40\x34\xe7\x4f\x53\x3b"
- "\x5e\x73\xfe\x34\x55\x5c\x73\x36\xb2\xe3\xff\x4f\x53\x6d\x35\x27"
- "\x5c\x23\xaa\x39\x2f\xfb\x58\x5f\x43\x34\xe7\x4f\x21\x44\x73\x5e"
- "\x7e\x52\x5a\x73\x5e\xae\x20\x9c\x75\xb9\x80\x70\x16\x89\xa9\xad"
- "\xe6\xbc\xbc\xd4\xb1\xe6\x24\x18\x62\xea\x29\xa9\x39\x2f\x1f\xb6"
- "\xd5\x9c\x0d\xbb\xc4\x35\xe7\x2f\xb9\x1c\x8e\x7e\x19\x29\xd4\x9c"
- "\x3f\xf7\xb8\x35\x34\xa7\x24\xb6\x22\x85\x9a\xf3\xe7\x53\xf2\x35"
- "\xe7\x2f\x3d\xe5\x69\x4e\x8c\x39\x31\xcd\xf9\xcb\x34\x16\x3f\x21"
- "\xe2\x9a\xf3\x97\xc5\xe2\x9a\xf3\x97\x54\xa1\xe6\xc4\xe5\x8b\x69"
- "\xce\x5f\x0e\x08\xca\xb7\xd1\x9c\xbf\x9c\x14\x6a\x4e\x72\x1e\xa7"
- "\x39\xf5\x71\x84\x43\x1b\x26\xca\xd7\x9c\xfa\x69\xd2\x9a\x53\x1f"
- "\x26\xd4\x9c\xfa\xe1\x44\x5b\xea\x37\x12\xcd\xa9\x0f\x20\xc7\x1b"
- "\x82\xf8\xc7\x39\xcd\x49\x8e\x73\x9a\x53\x9f\x67\x4f\x73\xd2\x39"
- "\x7e\x9a\x2c\xca\x5c\x02\x3f\x07\xa1\x9e\xf7\xc2\xf8\xa6\x85\xbf"
- "\x4b\x61\x9c\xea\x0b\x7f\x4b\x6a\x19\xbd\x8f\x9f\xc6\x0c\xba\xc4"
- "\x0c\xdf\x53\xa5\xff\x45\xab\x1d\x60\x84\xef\xbe\xe2\x4b\xc6\x17"
- "\x3f\x4d\x1f\xe3\x9d\x81\x66\x3a\x1a\xd1\x2a\xf8\x3b\x01\x8e\xc1"
- "\xf9\xbd\x61\x3c\x54\xc7\xa3\xde\x3f\x53\x57\x46\x59\xce\x83\x3a"
- "\xf7\x3e\x47\xe9\xaf\xe1\x32\x6e\xa4\x5d\x09\x80\xfb\xd9\x25\x59"
- "\x57\x28\x6b\xf2\x9e\x07\xd0\x2a\x23\xfd\xa3\x76\x61\x13\xaa\xa7"
- "\xae\x64\xf4\x69\xbc\x33\x10\x78\x08\x61\x8d\x58\x32\x40\xef\x81"
- "\xcb\xd4\x2e\x6c\xc5\x9f\xc5\xe0\xcf\x4c\x50\xc7\xa4\x05\x88\xca"
- "\x6c\xba\xd3\x13\x34\x57\x8f\xe4\x66\xba\x61\x91\x11\xea\x0c\xe3"
- "\xeb\x67\x0f\xd4\x7a\x7c\xb0\xad\x96\x19\x7b\x2a\x9b\x4d\x4c\x19"
- "\xea\x85\xb8\x3e\x57\xb2\xb7\xc3\xf9\x62\x75\x58\xbf\x0f\x0d\xed"
- "\x31\x84\xd6\xc9\x1b\xef\xae\xd4\x4b\xb5\x63\x9f\xd5\x0f\x20\xed"
- "\xa3\xd0\x76\x6a\x44\x89\x7d\x2e\xef\x7b\x9a\xec\xcd\x7f\xf0\xdc"
- "\xdc\x9f\x6e\x4e\xde\x8a\xa8\x4d\xe6\x3b\x3d\xbf\x00\x4e\xdc\xb1"
- "\x85\xd6\xdf\x48\x6b\x3a\xa8\x73\xfb\xa1\x01\xb7\xf9\x5a\xf8\x7c"
- "\x53\x7f\x5a\x7f\x75\x0d\xc6\x4d\x53\xf5\x51\x18\xdb\xad\x63\x11"
- "\x1b\xb9\x60\xb6\x3a\x6e\xee\x82\xa8\x45\x4b\xe3\xd4\x83\x23\xef"
- "\x42\x53\x17\x2d\x52\x2f\x98\xbd\x70\xb9\x9a\xff\xc9\xd3\xea\xc8"
- "\xb9\x4b\x66\xcf\x99\x1f\x35\x6c\xc1\x2b\x31\x77\x41\x9d\x10\xaf"
- "\x1e\x2a\x5c\x17\x73\x5a\x53\xdd\xf6\x37\x10\xda\xdc\x0f\x79\xe0"
- "\x7a\xdd\x48\xbb\xea\xaf\xf3\x18\x37\x15\x7f\x5f\xe6\x16\xba\x99"
- "\x82\x73\x92\x81\xd3\x36\x25\xdd\x89\xcf\x0d\xda\x01\xf5\xda\x0e"
- "\xf5\x86\x3a\x42\x9d\xaf\xce\xb7\xd4\xd9\x82\x89\x64\x8c\x89\xa4"
- "\x26\xc0\xe0\xd5\x8c\x3e\x86\x3b\x5f\xa0\xe9\x10\x7c\x7f\xcd\xd0"
- "\x57\xdc\x2e\x50\xcd\x83\x19\xdf\x90\xeb\xa7\x81\x6b\x77\x5b\x30"
- "\x66\xce\x99\xaf\xa5\xb7\x3c\xac\x07\x5d\xe9\x76\x83\x8e\xfe\x03"
- "\x60\x13\x5f\x7f\xed\x09\x84\x52\xe8\x1b\x21\xcc\xbb\x31\xe8\x1b"
- "\x80\x61\x82\x53\xf8\xac\xb9\xf4\x2a\x85\xfe\x08\x65\x34\xea\x50"
- "\x76\x22\x2e\x43\x07\xc7\x70\x9b\x9b\x0b\xd3\x82\xa7\x69\x50\xca"
- "\x23\x29\x28\xe5\x06\xbe\x66\x57\x90\xa6\x4f\x1c\x72\x9b\x9c\x40"
- "\xff\x00\xbc\xe3\x46\x3f\x94\x16\x4c\x17\x05\x69\x74\xd4\xd5\x6a"
- "\x73\xee\x7c\x2d\xdc\x4f\xe3\x8d\xb4\xe6\x11\x3a\xb7\x7b\x99\xba"
- "\x6c\xda\xc2\xb4\x7d\x23\xbe\x77\x68\x1f\xf0\x3f\xb4\x96\x5e\xc3"
- "\xf6\xa1\xac\x80\x2c\x73\x56\xae\xae\xca\xe3\x3a\x9a\x6c\xa4\xdb"
- "\xe8\xec\x80\xac\xca\xe6\x66\xe0\xb4\x98\x57\xe8\xbb\x9a\x2e\xf7"
- "\x31\xce\x8d\xda\xd1\x0f\xfa\x62\x76\xae\x8e\xce\x0e\x4f\x99\x36"
- "\x04\x79\x43\xd9\x59\x96\xf6\x84\xb6\xf4\x90\x87\xa3\xe6\x1c\x7c"
- "\x4f\x18\x0f\x50\x1f\x16\x0f\xcd\xba\xa3\x71\xb6\x78\x68\xef\x9b"
- "\x5b\x42\x87\x1b\xe9\x90\x17\xda\x72\x42\xa3\x69\x55\xe8\xd4\xa4"
- "\xf3\xe8\x0e\xdc\xb6\x95\xe0\x05\x32\xe3\x91\x6f\x46\x38\x52\xcf"
- "\x5a\xee\x8d\xf4\xb9\xa1\xc1\x7d\x56\xa7\xb8\x41\x9b\x50\xc0\x2f"
- "\xc3\x81\x33\x87\xb7\xf5\x9f\xaf\x4d\x8c\x42\x54\xf1\xb9\x12\x0a"
- "\xeb\x67\x3c\x6f\xe5\x02\x75\x6d\xe7\x76\xb8\x8e\xfe\x25\x04\xe1"
- "\x78\x30\xb1\xf8\x25\x1a\x4d\x9c\x0b\xe3\xf3\x3c\xe6\xf3\x53\x05"
- "\x50\xa6\xbc\xfb\xba\xc6\xe8\x5f\x13\xc4\xea\x09\x88\x53\x55\xbd"
- "\x89\x29\x93\x89\xd5\x7c\x2e\x56\x87\xa1\x1e\x5c\xbc\xae\x85\xe2"
- "\xb8\x4a\xdc\x73\x09\x7b\xcf\x0d\x70\xcf\x35\x76\xee\xb9\x9a\xdc"
- "\x73\x8f\x26\xfb\xf7\x7c\x3d\xd7\xfe\x3d\x5f\x2f\x93\x7f\xcf\xd7"
- "\x23\xe4\xdf\xf3\xf5\x60\xe9\x7b\x0e\x63\xe3\x1c\x06\x71\x0e\xb3"
- "\x13\xe7\x30\x36\xce\x77\x9f\xb3\x7f\xcf\x37\x52\xed\xdf\xf3\x8d"
- "\xc3\xf2\xef\xf9\xc6\x54\xf9\xf7\x7c\x23\xc0\xce\x3d\xb3\x71\x0e"
- "\x83\x38\x87\xd9\x89\x73\x18\x1b\xe7\xbe\x5f\xd9\xbf\x67\xc3\x2a"
- "\xfb\xf7\x6c\xf8\x50\xfe\x3d\x1b\x02\xe5\xdf\xb3\x61\x94\xf4\x3d"
- "\x87\xb3\x71\x0e\x87\x38\x87\xdb\x89\x73\x38\x1b\xe7\xdf\xa7\xd9"
- "\xbf\xe7\x96\xc5\xf6\xef\xb9\xa5\x48\xfe\x3d\xb7\x8c\x91\x7f\xcf"
- "\x2d\x43\xed\xdc\x33\x1b\xe7\x70\x88\x73\xb8\x9d\x38\x87\xb3\x71"
- "\x9e\xf9\xac\xfd\x7b\x6e\x8d\xb2\x7f\xcf\xad\x5b\xe5\xdf\x73\xeb"
- "\x70\xf9\xf7\xdc\xaa\x96\xba\xe7\x56\xe0\x6d\x2f\xb8\x97\xb6\x6f"
- "\x42\x5e\x30\xa9\x42\x43\xbd\xea\x11\x95\xbf\xc6\x1c\xdd\xa7\x01"
- "\xf5\x84\x7b\x8b\xa6\xb7\x2c\xca\xc2\xbf\xcd\xaa\xd0\x90\x56\x55"
- "\x68\x74\x4b\xff\x87\xf5\x2b\xc3\xd0\x1d\x58\x8f\xa7\x9a\x91\xaf"
- "\x39\x27\x74\x6a\xfa\x14\xa4\x4e\xd6\x23\xef\xca\x24\x1d\x4a\x8a"
- "\xa1\xf5\x95\xe8\x2c\xea\xd5\x80\xbd\xe7\xb7\xa8\xbc\xb1\x14\x2d"
- "\x8c\xa5\xe9\x0b\x54\xdb\x79\x9c\x37\x01\x9d\x9c\x92\xf5\x35\x52"
- "\xc3\x77\x0c\xdf\x0e\x3f\xb8\x9c\x3e\x41\x30\x7e\x6e\x59\xf4\xc6"
- "\x8e\x24\xe4\x7b\x64\x5e\x03\xc2\xc7\x0b\xe0\xc7\xb4\x65\xbe\x36"
- "\x29\x0c\x51\xfb\x9a\x6a\x29\x32\x36\xb7\x7d\x68\x3d\x36\x07\xcd"
- "\x86\xb6\x9c\xc3\x7c\x66\xca\x9f\x22\xb7\x2d\xdb\x12\x2d\x63\x37"
- "\xd3\x96\x75\x26\x32\xde\x5b\x8d\xdd\x47\xe0\xfb\xb9\xb6\x6c\x9b"
- "\x8f\xdb\x92\xce\x09\x8d\xa9\x6a\x68\xc5\xbe\xc9\xfb\x42\x02\xa2"
- "\xe0\xf8\xc0\xca\x98\x26\x24\xd1\xc6\x25\xbc\x36\xae\xf3\xaa\xef"
- "\xd1\x24\xd1\xc6\xb5\xd0\xc6\x0d\x22\x6d\x5c\xe3\x5c\x1b\x9b\x26"
- "\xb8\xde\xc6\x26\x1f\xe9\x36\x36\xcd\x96\xdf\xc6\x46\x9d\xfc\x36"
- "\x36\x56\xb3\x6d\xac\x17\xb6\xb1\x31\x45\xba\x8d\xc3\x78\x38\x0e"
- "\x03\x1c\xdf\x7d\x4e\xbc\x8d\xc3\x00\xc7\x61\x22\x38\x0e\x73\x12"
- "\xc7\xe6\x62\xd7\xdb\xd8\xbc\x5c\xba\x8d\xcd\xc7\xe5\xb7\xb1\x39"
- "\x40\x7e\x1b\x9b\x47\x90\x36\x0e\xb3\xc2\xb1\xa9\xde\x4e\x1b\xf3"
- "\x70\x1c\x06\x38\xee\xfb\x95\x44\x1b\x03\x8e\xc3\x44\x70\x1c\xe6"
- "\x1c\x8e\xdd\x51\x5f\xd7\xdb\x98\x3e\x23\xd9\xc6\xee\x68\x88\xfc"
- "\x36\xa6\x77\xcb\x6f\x63\x3a\x8f\x6d\x63\x2b\x1c\xd3\x81\xd2\x6d"
- "\x1c\xce\xc3\x71\x38\xe0\xf8\xf7\x69\xe2\x6d\x1c\x0e\x38\x0e\x17"
- "\xc1\x71\xb8\x73\x38\x76\x77\x5b\xea\x72\x1b\xbb\xbb\x8d\x93\x6e"
- "\x63\xb7\x0c\xd9\x6d\xec\xee\xe6\x25\xbb\x8d\xdd\x91\x91\xb4\x71"
- "\xb8\x10\xc7\xee\x68\xaf\x9d\x36\xe6\xe1\x38\x1c\x70\x3c\xf3\x59"
- "\x89\x36\x06\x1c\x87\x8b\xe0\x38\xdc\x49\x1c\x53\xa7\x5d\x6f\x63"
- "\xaa\x48\xba\x8d\xa9\x2b\xf2\xdb\x98\x8a\x91\xdf\xc6\x54\x04\xdb"
- "\xc6\x42\x1c\xbb\x53\xde\x52\x6d\xdc\x06\x1e\xb0\x17\xb4\x71\xaf"
- "\x46\x44\x15\xe0\xb6\xad\x25\x6d\x6b\xea\xbf\x28\xab\x80\x32\x47"
- "\xe3\x36\x61\x72\x40\x3f\xf9\xf6\x36\xe5\x84\x86\xd2\x14\xdc\x53"
- "\x92\x27\xdc\x93\xfb\x74\xe3\x1a\xd4\x5b\x9d\xb4\x1a\xfe\xee\xc1"
- "\xcc\x8f\x55\x27\x6d\x38\x03\xdf\xe7\x8e\xf3\x5e\xc6\xdc\x41\xd5"
- "\x26\x9f\x88\xc2\x0b\xee\x1e\xd9\xf4\xe0\x49\xfe\xe0\xbd\x62\xe8"
- "\xbf\xfa\xaa\xaa\x1a\x4b\xa0\x7d\x4e\xa0\xca\xda\x7f\x21\x73\xff"
- "\x45\x6f\x3c\x61\x44\x1a\xfa\x27\x8d\xaa\x3c\x4e\x87\x4c\xaf\xf8"
- "\x7a\x55\x25\x94\xa2\xaa\x84\x8f\xd0\xe4\x06\xfa\x3a\xfd\x3f\x8d"
- "\x57\x9b\xcf\xd2\x5a\x93\xcf\xa2\x18\x53\x6e\x72\xb4\xd1\x67\x69"
- "\x69\x71\xbc\x8e\xf2\x32\x20\xcd\xfc\x7a\x9a\xce\x9c\x83\x3c\x32"
- "\xcf\x21\xcf\x4d\x73\x90\xd7\xa6\x73\xc8\xbb\xbc\xbe\x16\x55\x5c"
- "\x2a\x45\x15\x4d\xa7\x51\xc5\x75\xf8\x69\x85\x1f\x33\xfc\xa4\x9c"
- "\x86\x58\x23\x34\xf1\x32\xc2\xef\x15\xd5\x3f\x56\x87\x54\xe5\xc6"
- "\x5a\x84\xd7\xf4\xfe\xec\xee\x31\xcc\x2b\x02\xa9\xe8\xff\xf9\x22"
- "\xfa\x15\x5f\x0a\x3e\xf3\xc0\xc7\xab\x8c\x7a\x54\x5e\x6f\xc0\x9f"
- "\x7b\xc1\xe7\x1e\xc9\xf5\x50\xbe\xb9\x14\xbf\x37\x54\x5f\x9e\x52"
- "\x86\x8c\xd9\x5f\x69\x69\xec\xa1\xfb\x87\x0e\xcf\x82\xa6\x36\xd3"
- "\xbe\x83\x08\x0e\x7a\x8c\xdf\x6e\x96\x1b\x6b\x0f\xb2\xff\xcd\x5f"
- "\x7d\xfb\x41\x3b\x0f\x30\xff\x35\xc4\x7b\xd2\xe9\x1f\x68\x3c\xc7"
- "\x0f\xe7\x12\x2a\x9b\x4f\x20\xfc\xac\x69\xf2\x72\x84\x82\x4c\x08"
- "\xe1\xb6\xa8\x4a\x68\x40\x93\x62\x50\x1f\x9c\x7f\x36\xff\xa4\xe9"
- "\x57\x55\xaf\x47\xab\x8c\x50\xc7\x9f\x0d\xed\x75\xac\x5c\x57\x89"
- "\xe0\xb3\x01\x95\xd1\x3a\xe4\x15\x83\xbc\x71\xfb\x1a\x73\x42\x43"
- "\x26\x41\xff\x59\xd8\x4c\xd3\xb8\x6d\x71\x9b\xe2\xf6\xc5\xe5\x59"
- "\xda\xbc\x2a\x52\x8f\x92\x0d\xc8\xbb\x2a\x09\x7e\x27\xd0\xfa\x2a"
- "\x74\x05\x41\x1d\xfd\xe9\xbe\x5f\x69\x01\x17\x39\x18\x0b\x3a\x77"
- "\xf7\x60\x88\x7f\x3f\x09\x4c\xd5\x10\x4c\xf5\x68\x72\x02\x53\x75"
- "\x1c\xa6\x7a\x14\x73\x98\xba\x33\x55\x1a\x53\x77\x9c\x67\x31\xa5"
- "\xef\x9e\x98\xba\x63\xb5\x7d\x4c\xdd\x11\x61\x07\x53\x0d\x80\xa9"
- "\x12\x21\xa6\xee\xdc\x2a\x1f\x53\x77\x94\x74\x21\xa6\x6a\x95\x61"
- "\xea\x8e\x1c\x21\xa6\x7a\xec\x92\xc6\x54\x18\xcb\x53\x77\x9f\x73"
- "\x8c\xa9\x30\x1e\x4f\x79\xba\x71\x98\xea\x79\x46\x1a\x53\x3d\x47"
- "\x13\x4c\x85\x75\x53\x9e\xf2\x3c\x65\x1f\x53\x9e\xfb\xa5\x31\x15"
- "\x06\x3c\x15\x66\xc5\x53\x3d\x2f\xcb\xc7\x54\x4f\x8f\xae\xc3\x54"
- "\x98\x42\x9e\xf2\x6c\x10\x62\xea\x4e\x83\x1d\x4c\xb1\x3c\xd5\xf7"
- "\x2b\x27\x30\xc5\xe3\xa9\xbb\xa6\x71\x98\xf2\x7a\x52\x1a\x53\x77"
- "\x67\xb0\x98\xea\xa6\x3c\x75\xf7\x10\xfb\x98\xba\xdb\xd3\x0e\xa6"
- "\x80\xa7\xc2\xac\x78\xca\x6b\x9c\x7c\x4c\xdd\x1d\xd2\x85\x98\x52"
- "\xc8\x53\x77\x8f\x11\x62\xea\xae\x20\x69\x4c\x85\xb3\x3c\xf5\xfb"
- "\x34\xc7\x98\x0a\xe7\xf1\x94\xd7\x1e\x0e\x53\xbd\xd7\x4b\x63\xaa"
- "\xd7\x59\x82\xa9\xf0\x6e\xca\x53\xbd\x56\xd9\xc7\x54\xaf\x50\x69"
- "\x4c\x85\x03\x4f\x85\x5b\xf1\x54\xef\x5c\xf9\x98\xea\xb5\xb7\xeb"
- "\x30\x15\xae\x90\xa7\x7a\x65\x09\x31\xe5\x55\x68\x07\x53\x2c\x4f"
- "\xcd\x7c\xd6\x09\x4c\xf1\x78\xaa\xb7\x89\xc3\x94\xf7\x69\x69\x4c"
- "\x79\x8f\x64\x31\xd5\x4d\x79\xaa\xcf\x49\xfb\x98\xea\x53\x62\x07"
- "\x53\xc0\x53\xe1\x56\x3c\xe5\x7d\x51\x3e\xa6\xf0\xeb\x9f\xba\x0c"
- "\x53\x0a\x79\xaa\x4f\xbd\x10\x53\xbd\x9b\xa5\x30\xd5\x8a\x7d\x9f"
- "\x1b\x60\x2a\x1a\x7c\x1f\x60\xa8\x4f\x35\xc1\x54\x1b\x60\xea\x2d"
- "\x3e\xa6\xbe\xb3\xf6\x7d\x7d\x5f\x32\xb7\x63\xea\x9e\x30\x6b\x4c"
- "\x99\x01\x53\x6d\x0c\xa6\xfa\x2d\xb5\xf8\xbe\xaa\xc6\x42\x88\xd5"
- "\x25\x54\x15\x0c\x78\xda\xc2\xe2\xe9\x3b\xc0\x13\xdc\x8f\x19\xee"
- "\xb7\xbc\xae\x16\x4d\xd6\x93\xfb\x6a\x85\xfb\x35\xf3\xb1\xd4\xda"
- "\x40\x61\x0c\x61\xec\x58\x70\x54\xb1\x10\xf0\x13\x7b\x12\x55\xc4"
- "\xc3\xcf\x0a\xf8\x49\x82\x1f\x74\x12\x95\x37\x20\x26\x67\xcf\xe1"
- "\xa7\x9a\xc5\x4f\xbf\xbe\xf6\xf1\xd3\x57\x2f\xcf\xe3\xdd\xb3\x40"
- "\x3e\x7e\xfa\xf9\xb3\x73\xe9\xbc\x27\xbf\xf4\x03\x8d\xe7\xcd\x12"
- "\x8c\x5c\x42\x93\x8d\xa8\x0f\x3d\x53\xd3\xcf\x2b\x04\x79\xaf\x34"
- "\x21\x2a\x63\x0e\xf2\xce\xf8\x16\xee\xd7\xd2\x77\xce\x21\xaf\x13"
- "\x86\x7f\xa1\xf2\xa6\x5a\x54\x7e\xbd\x0c\x95\x9b\xe1\xe7\x12\xfc"
- "\x40\x1d\x27\x47\xf1\xef\x57\xcf\xde\xef\x3d\x6e\x50\x96\x9f\xf4"
- "\xfd\xf6\xd3\x31\xf7\x1b\x09\xf7\xdb\xca\xdd\x6f\x15\x60\x11\xe2"
- "\x32\xc0\xcc\xfa\xc4\xc9\x7a\xd4\x73\x91\x91\xa6\x5b\x59\x0c\xe2"
- "\xb8\x9c\xa8\x31\xa0\xc9\x31\x10\xab\x57\x00\x83\xf5\xbb\x51\x72"
- "\x22\x60\xb0\xd5\x80\x9f\xeb\xeb\xab\x52\x5a\x00\x83\xfd\xfc\x68"
- "\x68\xb7\x36\x8c\xc1\xef\x30\x06\xfb\x06\x9a\xa5\x31\x58\x43\x30"
- "\x08\x3e\xd1\x31\x06\x79\xbc\x76\xcf\x29\x0e\x83\x3e\x67\xa5\x31"
- "\xa8\x6a\xb1\xf8\xc4\x9b\x8f\x41\x55\xae\x7d\x0c\xaa\xe2\xe4\x79"
- "\x42\x9f\x2b\xf2\x31\xa8\x3a\xd6\x75\x18\xf4\x59\x6f\x1f\x83\x3e"
- "\x91\x4e\x60\xb0\x56\x19\x06\x55\xbb\x85\x18\xbc\xa7\x5c\x1a\x83"
- "\x61\x2c\x0f\x82\xaf\x74\x88\x41\xbe\xaf\xec\x3f\x9d\xc3\xa0\x6f"
- "\x94\x34\x06\x7f\xb3\xca\xe2\x2b\x6f\x3e\x06\x7f\x73\xaf\x7d\x0c"
- "\xf6\x37\xc8\xf3\x90\xbe\x4b\xe5\x63\xf0\x37\x81\x5d\x87\x41\xdf"
- "\x9e\xf6\x31\xf8\x9b\x06\xc7\x18\x0c\x53\xc8\x83\xbf\x19\x2a\xc4"
- "\x60\xff\x60\x3b\x18\x64\x79\x10\x7c\xa8\x63\x0c\xf2\x78\xd0\xf7"
- "\x0c\x87\xc1\x01\x17\xa5\x31\x38\xc0\xcd\xe2\x43\x6f\x3e\x06\xef"
- "\x2d\xb0\x8f\xc1\x7b\x13\xe5\x79\xce\x01\x2d\xf2\x31\x78\x6f\x79"
- "\xd7\x61\x70\x40\x86\x7d\x0c\x0e\x98\xef\x04\x06\x15\xf2\xe0\xbd"
- "\x25\x42\x0c\xfa\xd6\x48\x63\x30\x9c\xe5\x41\xf0\xad\x0e\x31\xc8"
- "\xf7\xad\xf7\xcd\xe6\x30\x78\xff\x02\x69\x0c\x0e\x5c\x6f\xf1\xad"
- "\x37\x1f\x83\x03\x1f\xb2\x8f\xc1\x81\x48\x9e\x47\xbd\x7f\x95\x7c"
- "\x0c\x0e\x0c\xee\x3a\x0c\xde\xdf\xd7\x3e\x06\x07\xea\x1d\x63\x30"
- "\x5c\x21\x0f\x0e\x1c\x21\xc4\xe0\x7d\x21\x76\x30\xc8\xf2\x20\xf8"
- "\x5c\xc7\x18\xe4\xf1\xe0\xfd\xe7\x39\x0c\x3e\x78\x45\x1a\x83\x0f"
- "\xf6\xb4\xf8\xdc\x9b\x8f\xc1\x07\x8a\xec\x63\xf0\x81\x75\xf2\x3c"
- "\xad\xda\x4d\x3e\x06\x1f\xa8\xe9\x3a\x0c\x3e\x98\x6b\x1f\x83\x0f"
- "\xc6\x39\x81\x41\x85\x3c\xf8\xc0\x41\x21\x06\xef\xaf\x93\xc2\xa0"
- "\x19\x7c\x71\xdb\xae\x49\xfe\xe6\x9c\xa5\xb5\x7d\xdc\xd4\xc8\xa8"
- "\x8a\x28\xac\x8a\x6b\x46\x93\xae\x41\xfb\xc4\x5c\x43\xe1\xd7\xbc"
- "\x91\x29\x67\x69\x29\x68\xf2\x10\x9e\x7f\x66\xe6\x96\x19\xb3\xbe"
- "\xd2\x6e\x5a\x88\x3c\xc0\x7f\xbf\x81\x8f\x55\x5d\x30\x20\xfc\xfd"
- "\xab\x70\x7d\x2e\x71\xf5\xc1\x79\x02\xfa\x17\x8d\x37\xf3\x8c\xb9"
- "\x55\x87\xea\xc7\x20\xf7\xf2\x7a\x1d\xb4\xc3\x0a\x26\xbe\xb8\x5d"
- "\x20\x9e\x35\x3b\x7e\x46\x1e\xc6\xff\xf9\x0e\x80\xf6\x56\xf5\x5a"
- "\x86\xdc\x06\xd6\xd3\x66\xdc\xae\xb8\xbd\x70\x1b\xab\x57\xe0\x67"
- "\xd7\x0f\x0d\xae\x04\x8c\x19\xff\xa7\x19\xb0\x1d\xce\x13\xf7\xab"
- "\x0f\x0d\x93\x8f\x0d\xb5\x9e\x59\xb7\xe0\xae\x2e\x2f\xaf\x43\xa2"
- "\xcf\x8e\xa1\xad\x6a\x9c\x6c\xab\x5a\x9e\xcf\xeb\x84\xb6\x1a\x84"
- "\x9c\x6b\xab\x41\x2f\x59\xb5\x95\x88\xaf\x1a\x34\x5d\x7e\x5b\x0d"
- "\x1a\x48\xda\xea\x21\x83\x74\x5b\x85\x39\x89\xab\xb0\x10\x9e\x1f"
- "\xe9\x84\xb6\x7a\x78\xa8\x73\x6d\xf5\xf0\x2a\x61\x5b\x89\xe9\xff"
- "\x87\xd7\xcb\x6f\xab\x87\xc9\x5e\xa0\xee\x0f\xfb\xd9\x69\x2b\x27"
- "\x71\x15\x56\xcb\xd3\xcd\x9d\xd0\x56\x7e\x21\xce\xb5\x95\xdf\x1e"
- "\xab\xb6\x12\xd1\xa9\x7e\x1f\xca\x6f\x2b\x3f\xf2\x3e\x3c\x77\xbf"
- "\x60\xe9\xb6\x0a\x77\x12\x57\xe1\x21\x3c\x7d\xd7\x09\x6d\x35\x78"
- "\x9d\x73\x6d\x35\xf8\x94\xb0\xad\xc4\xf4\xd4\xe0\x33\xf2\xdb\x6a"
- "\x70\x21\x69\xab\xc1\x89\x76\xda\xca\x49\x5c\x85\xd7\xf2\x74\x48"
- "\x27\xb4\xd5\x6f\x4b\x9c\x6b\xab\x47\xdc\xac\xda\x4a\x64\xdc\x7f"
- "\xa4\xa7\xfc\xb6\xfa\x6d\x39\x69\xab\xdf\xee\x96\x6a\x2b\x53\x4e"
- "\xe8\xd4\x3e\xd0\x06\x2d\x5b\x42\x87\xf7\x49\x40\x54\xab\x1f\xb4"
- "\x9b\x0a\xda\x6d\xb5\x1a\xb5\xe5\x40\xbb\xe9\x8d\x68\xd2\xe2\x1f"
- "\xe8\xca\x46\x13\x6a\x85\x36\x6b\x51\x85\x86\x54\xe9\x1b\xf0\x9c"
- "\xa3\x67\xce\xb9\x6b\x2e\xce\x5c\xec\x8d\x70\xbb\xe1\x76\xc0\x6d"
- "\x47\x43\xbb\x31\xed\xa8\x4a\x8e\x36\xa9\x16\xc5\x4c\xbc\xfc\x03"
- "\xbd\x48\x47\xd3\xf8\x7e\x69\xd5\xa0\x6a\xfc\x5c\x60\x72\x03\xea"
- "\xa9\x9e\x82\xef\x49\xb3\x15\x1f\xaf\xd2\xd7\x82\x3e\x68\x42\x8c"
- "\x36\xfb\x41\xa3\x32\xfd\x45\xe3\x65\xaa\x0a\x79\x81\xee\xff\xb0"
- "\xde\xd8\x7f\xbe\x36\xf9\x32\xba\x03\xeb\x87\x4c\x33\xf2\x5d\xb5"
- "\x00\x51\xfb\xe6\x69\x29\x66\xed\x5a\x2c\x53\x46\x14\xb4\x8b\x2f"
- "\x7d\x95\x37\xa7\xfb\x6a\x34\xaa\xba\x90\xc5\xc4\xcd\x5a\x23\x30"
- "\x71\xfb\x46\xe3\x0d\x3a\x73\x38\xad\x0a\x8d\xce\xaa\x44\x6a\xba"
- "\x0d\xda\x18\xaf\x27\x72\x1f\xf2\xd2\x8e\x56\xb9\x6d\xac\x61\xe6"
- "\x7f\x9b\xd5\xec\xfc\x2d\x68\x27\xfc\xfd\xcc\xfc\xad\x18\xde\xfc"
- "\x2d\xa8\x33\x37\x7f\xeb\x91\x66\x3c\x7f\xcb\xfc\x83\xef\x00\xcb"
- "\xbd\x2f\x9a\x4f\xd3\x70\xef\xfd\x2a\x9b\xf5\x08\xdf\x7f\x65\xb3"
- "\x16\x25\xc7\x21\xef\xca\xd6\x06\x94\xd4\x4c\xeb\x2b\x53\x2e\xa2"
- "\xc9\xd7\xb0\x0e\xc6\x78\xd1\x9c\x25\x71\x7d\x64\xbf\xf9\x07\xcd"
- "\x00\xa8\x43\x6d\x65\x35\x42\xbc\x75\x3c\xd1\xa0\x99\x3d\x21\x0e"
- "\xd1\x55\x29\xe7\x10\xc4\x44\x5f\x65\xfc\x16\xc7\x29\x1a\x3e\x1f"
- "\xd3\xae\xaf\xfb\x2f\x6a\xc2\xc7\x70\xcc\xf0\xf3\x26\xbc\x77\xc0"
- "\x0e\x9e\xfe\xc6\xb8\xe8\x93\x90\x82\xaa\x12\x5a\x51\xa5\x11\x81"
- "\xbe\x7a\x24\xe2\xcb\x90\x5a\x29\x1c\xd5\xb0\x38\x2a\xe9\x93\xd0"
- "\xa3\xc9\x09\x1c\xd5\x72\x38\x7a\xec\x49\xd7\x70\xf4\xe8\x59\xd7"
- "\x71\xf4\x68\xb1\x0b\x38\x6a\x10\xe2\xe8\xb1\xad\xf2\x71\xf4\x68"
- "\x82\x7c\x1c\x3d\x3a\xc6\x35\x1c\x3d\x36\x84\xe0\x68\x88\x91\xe0"
- "\xe8\x31\x35\x87\x23\x66\x6d\x54\x27\xe1\x68\xc8\x6e\x69\x1c\x85"
- "\xb1\x7c\x14\x06\x7c\x74\xf7\x39\xc7\x38\x0a\xe3\xf1\xd1\xb0\xe5"
- "\xae\xe1\x68\xd8\x10\xd7\x71\x34\xf4\x9a\x72\x1c\x85\x59\xf1\xd1"
- "\xb0\xb3\xf2\x71\x34\x54\x2b\x1f\x47\x43\xd7\xb9\x86\xa3\x61\x8b"
- "\x09\x8e\x86\x06\x10\x1c\x0d\x8b\xe6\x70\xc4\xac\x37\xeb\x24\x1c"
- "\x3d\xa6\xb7\x83\x23\x96\x8f\xc2\x80\x8f\xfa\x7e\xe5\x04\x8e\x78"
- "\x7c\xf4\xc4\x51\xd7\x70\xf4\xc4\x62\xd7\x71\xf4\xc4\x58\x17\x70"
- "\x64\xc5\x47\xc3\x87\xc8\xc7\xd1\x13\x9e\xf2\x71\xf4\x78\xb9\x6b"
- "\x38\x7a\xe2\x10\xc1\xd1\xe3\xe9\x04\x47\x4f\x94\x70\x38\x62\xd6"
- "\xf0\x75\x12\x8e\x1e\x1f\x25\x8d\xa3\x70\x96\x8f\xc2\x81\x8f\x7e"
- "\x9f\xe6\x18\x47\xe1\x3c\x3e\xfa\x5d\x4f\xd7\x70\xf4\xe4\x21\xd7"
- "\x71\xf4\xe4\x7a\xe5\x38\x0a\xb7\xe2\xa3\xdf\x2d\x96\x8f\xa3\x27"
- "\x83\xe5\xe3\xe8\x49\x95\x6b\x38\xfa\x9d\x1b\xc1\xd1\xf0\x1a\x82"
- "\xa3\x27\x0d\x1c\x8e\x98\x75\x91\x9d\x84\xa3\xe1\x29\x76\x70\xc4"
- "\xf2\x51\x38\xf0\xd1\xcc\x67\x9d\xc0\x11\x8f\x8f\x46\xbc\xe4\x1a"
- "\x8e\x46\xb8\xb9\x8e\xa3\xff\xab\x70\x01\x47\x56\x7c\x34\xe2\x90"
- "\x7c\x1c\xfd\x5f\x9e\x7c\x1c\xfd\x5f\xa8\x6b\x38\x1a\x31\x81\xe0"
- "\xe8\xff\x06\x12\x1c\x8d\xf0\xe7\x70\xc4\xac\x35\xed\x24\x1c\xfd"
- "\xae\x54\x0a\x47\x78\x2f\x82\xcd\x64\x5f\x88\xe6\x4d\x2b\xd0\xa8"
- "\x1d\xf8\x77\x2b\x1a\x7e\x23\x73\x84\xfe\x68\x22\xd9\x0f\x00\xea"
- "\xc9\xe4\x7b\xc5\xae\xbf\x7b\x0f\xc4\x45\x15\x1a\x3c\xf9\x0c\xd9"
- "\xa3\x01\xef\x0b\x72\x35\x39\x1a\x3d\x81\xf7\x65\x70\xff\xbd\x06"
- "\xef\x63\xd5\xbe\x77\x80\x4a\x62\xef\x80\x19\xd2\x7b\x07\xb4\x6e"
- "\xb1\xac\xbb\xdd\xcd\xad\xbb\x75\x1f\x79\xcd\xee\xba\x5b\xf7\x91"
- "\x67\x0a\x66\xc8\xc5\xc3\x48\x66\xfd\xd7\xd5\xfe\xa1\x70\xef\x23"
- "\x1b\xe1\x9e\x8f\x91\x7b\xff\x3d\xb3\x7f\xb0\xe3\xf5\xb8\xbb\x79"
- "\x38\x19\x99\x37\x2d\x14\xa5\xd0\x69\xcd\x8d\xb4\x4f\x68\x30\x9d"
- "\x1b\x1a\x21\xaf\x2e\xbf\x97\x7c\xff\x21\xdb\xde\xd5\xe2\xed\xfd"
- "\x54\x1e\xdb\xde\x25\x6c\x7b\x8b\xef\x5b\x30\x43\x7a\xdf\x02\xf1"
- "\xf6\x7e\xca\xfe\x3a\x67\xf7\xa7\x26\xca\x6f\xef\xa7\x7c\xd9\xf6"
- "\x2e\xb9\x91\xf9\x54\x28\xd7\xde\x4f\xd5\xca\x6f\xef\xa7\x3c\x49"
- "\x7b\x5f\xd3\x41\x7b\x57\x43\x7b\xcb\xdb\xbf\xc5\xfd\x29\xc9\xfd"
- "\xbf\x49\x7b\x87\x49\xe0\x7b\xb4\x27\x69\x6f\x76\xcf\x04\x95\xc4"
- "\x9e\x09\x33\xa4\xf7\x4c\x10\x6f\xef\x51\xa7\xec\xb7\xf7\xa8\xc3"
- "\xf2\xdb\x7b\xd4\x46\xd2\xde\x61\x80\xef\x51\xe5\x5c\x7b\x8f\x76"
- "\x72\x5f\x01\x7e\x7b\x8f\x4a\x20\xed\x7d\xbd\x86\xf6\x09\x03\x7c"
- "\x87\xc9\xc4\xf7\x68\x95\x83\xf6\x96\xc0\xf7\xd3\x09\x6c\x7b\xb3"
- "\xf8\x96\xd8\xaf\x61\x86\xf4\x7e\x0d\xe2\xed\xfd\xf4\x78\xfb\xed"
- "\xfd\xf4\x30\xf9\xed\x3d\xda\xc0\xb6\x37\xe0\xfb\xe9\x31\x5c\x7b"
- "\x3f\x7d\x50\x7e\x7b\x8f\x6e\x20\xed\x7d\xa3\x14\xda\x1b\xf0\x1d"
- "\x26\x13\xdf\x4f\xaf\xb3\xdf\xde\xe1\x12\xf8\x7e\xa6\x81\xb4\x37"
- "\xbb\x57\x84\x4a\x62\xaf\x88\x19\xd2\x7b\x45\x88\xb7\xf7\x33\x07"
- "\xec\xb7\xf7\x33\x05\xf2\xdb\xfb\x99\x68\xd2\xde\xe1\x80\xef\x67"
- "\xf6\x72\xed\x3d\x46\x23\xbf\xbd\x9f\x09\x21\xed\x6d\xf8\x94\xf6"
- "\x09\x07\x7c\x87\xcb\xc4\xf7\x33\xcd\x0e\xda\x5b\x02\xdf\x63\x43"
- "\xd8\xf6\x66\xf1\x2d\xb1\x4f\xc5\x0c\xe9\x7d\x2a\xc4\xdb\x7b\xec"
- "\x60\xfb\xed\x3d\xb6\x97\xfc\xf6\x1e\x53\xcb\xb6\x37\xe0\x7b\xec"
- "\x40\xae\xbd\xc7\xe6\xc9\x6f\xef\x31\xa5\xa4\xbd\x5b\x4a\xa0\xbd"
- "\x01\xdf\xe1\x32\xf1\x3d\x36\x52\xaa\xbd\xfb\x40\x7b\x1f\x07\x1d"
- "\x03\xe3\x60\x88\x39\x07\x74\x8a\x49\xd8\xee\x55\x09\xa3\xd0\xe3"
- "\xd7\x71\xdb\xff\x31\x00\xc6\x8e\x90\x2e\xdb\x2f\xc3\xfd\x8f\xc3"
- "\x5c\x5f\x3b\xfc\x87\x16\xe9\xb5\xc3\x7f\x38\x2b\x7f\xed\xf0\x1f"
- "\xf6\x72\x1a\xe8\x0f\x7a\x2e\xa6\x7f\x64\xf8\x43\xde\x9a\xe2\x3f"
- "\xe4\x8b\xee\xa3\xe1\xfe\x87\x20\xbc\xa6\x98\x4e\x6b\xdd\x65\xce"
- "\x55\xa2\x8d\xfe\x18\xec\x44\xac\x6b\x21\x0e\xd5\xd2\xb1\x1e\x37"
- "\x1c\x62\x5d\xdb\x65\xfb\x76\xb8\x8f\xbb\xd7\xf5\x58\xfb\x9f\x97"
- "\x8e\xb5\x7f\x85\xfc\x58\xfb\xe7\x71\xfa\xcb\xbf\x8e\x8b\xf5\x38"
- "\x05\xeb\xc7\xfd\x37\x8a\xee\xe7\xe1\xee\x3f\x8a\xc4\xda\xe8\x09"
- "\xb1\x56\xa0\xcb\xc6\x8d\x71\x1c\xeb\x30\xe8\xd7\x61\x76\xfa\xf5"
- "\x73\x03\x61\xcc\x0c\xe9\xb2\xfd\x43\xdc\x9f\xeb\xe1\x7a\xac\x9f"
- "\x3d\x29\x1d\xeb\x67\x0f\xc9\x8f\xf5\xb3\xeb\x38\xed\xf7\x6c\x29"
- "\x17\xeb\xe7\x42\xe5\xc7\xfa\xd9\x38\xd1\x7d\x45\xdc\x9f\xf5\x23"
- "\xb1\x36\xcd\x37\xe7\x2a\xd1\x84\xcf\x69\x9c\x88\x35\xf4\xeb\x30"
- "\x3b\xfd\x7a\xbc\x27\xc4\xba\xb6\xeb\xf6\x31\x09\xb8\xe2\x7a\xac"
- "\x03\x0e\x4b\xc7\x3a\xa0\x48\x7e\xac\x03\x62\x38\xdd\x19\xb0\x9f"
- "\x8b\xf5\xf8\x40\xf9\xb1\x0e\x88\x10\xdd\xdf\xc4\x3d\xc0\x9b\xc4"
- "\xda\x5c\x0d\xb1\x56\xa0\x47\xc7\x4b\xea\x7f\x2e\xd6\xe1\xd0\xaf"
- "\xc3\xed\xf4\xeb\xe7\x9b\x41\x2b\x84\x74\xdd\x7e\x2a\xcf\x9f\x71"
- "\x3d\xd6\xcf\xef\x91\x8e\xf5\xf3\xd9\xf2\x63\xfd\x7c\x28\xa7\x79"
- "\x9f\x2f\xe4\x62\xfd\xc2\x08\xf9\xb1\x7e\x3e\x48\x7c\x9f\x95\xf1"
- "\x46\x26\xd6\x99\x68\x84\x39\x57\x89\x16\x7e\x01\x39\x11\x6b\xe8"
- "\xd7\xe1\x76\xfa\x75\x20\xf8\xfa\xf0\xda\xae\xdb\xd7\x25\xb0\xcc"
- "\xf5\x58\x07\xe6\x4a\xc7\x3a\x70\x95\xfc\x58\x07\x06\x72\x7a\x3b"
- "\x30\x9d\x8b\xf5\x04\xb5\xfc\x58\x07\x8e\x12\xdf\xef\xe5\x85\x06"
- "\x12\x6b\xb7\x3c\x88\xb5\x02\x1d\x1e\xd8\xa8\x44\x87\x2f\x29\x40"
- "\x9e\xc2\x78\xbf\x58\xdd\xb5\x5a\xfc\xc5\x43\xae\xc7\xfb\xc5\xf5"
- "\xd2\xf1\x7e\x71\x81\xfc\x78\xbf\x38\x8a\xd3\xe2\x2f\x26\x72\xf1"
- "\xfe\x93\xb7\xfc\x78\xbf\xa8\x11\xd7\xe2\x13\x6a\x5d\xd3\xe2\x2f"
- "\xd6\x29\xd1\xe2\xb6\xf1\x0e\xd2\x76\xad\x1e\x0f\xda\xe3\x7a\xbc"
- "\x83\x96\x4a\xc7\x3b\x28\x4c\x7e\xbc\x83\x34\x9c\x1e\x0f\x9a\xcf"
- "\xc5\x7b\x22\x92\x1f\xef\x20\x5f\x71\x3d\xfe\xa7\x52\xd7\xf4\x78"
- "\x50\xb9\x12\x3d\x6e\x1b\xef\x49\x25\x5d\xab\xc9\x27\x6d\x75\x3d"
- "\xde\x93\xa2\xa4\xe3\x3d\x69\xa2\xfc\x78\x4f\xf2\xe5\x34\xf9\x24"
- "\x5e\xfe\x7b\x92\x5e\x7e\xbc\x27\x79\x8a\x6b\xf2\x89\x07\x5d\xd3"
- "\xe4\x93\x3e\x55\xa2\xc9\x6d\xe3\x1d\x5c\xd8\xb5\xba\x3c\x38\xd5"
- "\xf5\x78\x07\x4f\x93\x8e\x77\xf0\x58\xf9\xf1\x0e\xf6\xe4\x74\x79"
- "\x70\x10\x17\xef\x60\x9d\xfc\x78\x4f\x36\x88\xeb\xf2\xc9\xbb\x5d"
- "\xd3\xe5\xc1\x7b\x95\xe8\x72\xdb\x78\x4f\xc9\xea\x5a\x6d\x3e\x65"
- "\xb9\xeb\xf1\x9e\x32\x5e\x3a\xde\x53\x86\xc9\x8f\xf7\x4b\x06\x4e"
- "\x9b\x4f\xe1\xe5\xff\xa7\x54\xcb\x8f\xf7\x4b\x0d\xe2\xda\xfc\xa5"
- "\x3c\xd7\xb4\xf9\x94\x7c\x25\xda\xdc\x36\xde\x53\x53\xba\x56\x9f"
- "\x4f\x9d\xeb\x7a\xbc\xa7\x8e\x94\x8e\xf7\xd4\xfb\xe5\xc7\xfb\xcf"
- "\x0d\x9c\x3e\x9f\x3a\x94\x8b\xf7\x54\xad\xfc\x78\xff\xb9\x56\x5c"
- "\x9f\xff\x79\xa3\x6b\xfa\x7c\x6a\xba\xeb\x79\xf2\xbf\x84\x62\x6d"
- "\x2e\x77\xff\xc7\xaa\x38\xcb\x9a\xbb\x69\xbc\xfd\x1f\xff\xc2\xbc"
- "\x5b\x45\x7c\x6f\x99\x97\xf7\x74\xef\xfd\x1f\x5f\x76\xb0\xff\xe3"
- "\xcb\x32\xf7\x7f\x7c\x39\x5b\xfe\x7c\xfc\x97\x43\x39\x8f\xf0\x32"
- "\xcf\xff\xff\x85\xe9\xd7\xdd\x7b\x5f\xc8\x97\xad\xf6\x85\x9c\xc6"
- "\xec\x0b\x49\x67\x52\x46\x65\x5e\xe4\x2f\xd1\xae\x3f\x17\x98\x31"
- "\x0a\xfb\x10\xb9\xfb\x50\x72\xd8\x0e\x19\xc9\x61\x7b\xc6\x10\x69"
- "\x6c\x4f\x5f\xdf\xbd\xf7\xa1\x9c\xde\xd3\x3e\xb6\x43\x1a\xe4\xed"
- "\x39\x32\x5d\xc1\xbe\x37\xd3\x47\x71\x7e\x68\x3a\xcf\xff\xce\x48"
- "\xe8\x42\x6c\x2b\xdc\x4f\x69\xfa\x40\x21\xb6\x43\x86\x12\x6c\xf7"
- "\x08\x56\xe6\xbb\x66\x04\xb8\xfe\x1c\x24\x4c\x85\x3d\x97\xdc\xfd"
- "\x30\x39\x6c\xcf\xec\xcb\x61\x3b\xac\x87\x34\xb6\x43\x67\x77\xef"
- "\xfd\x30\x67\x9e\xb7\x8f\xed\x99\xc7\xe4\xed\x65\x12\x3a\x41\x3e"
- "\xb6\x43\x55\x9c\xf7\x0b\x0d\xe1\xb0\x1d\x36\xb5\xeb\xb0\xad\x74"
- "\x9f\xcc\x99\x06\x21\xb6\x67\x7a\x12\x6c\xdf\xb9\x4b\x99\xc7\x0c"
- "\x53\xbb\xfe\xdc\x67\x96\x1e\xfb\x4b\xb9\xfb\x72\x72\xd8\x0e\xbb"
- "\xcc\x61\x7b\x96\xcd\xbe\x50\x1c\xb6\x67\x8d\xed\xde\xfb\x72\x86"
- "\x1f\xb5\x8f\xed\xf0\x42\x79\x7b\xa4\xcc\x1a\x2c\x1f\xdb\xe1\x7a"
- "\xce\xe7\xce\x1a\xc1\x61\x3b\x62\x78\x17\x62\x5b\x21\x6f\x87\xd7"
- "\x08\xb1\x1d\x56\x4f\xb0\xdd\xd3\xa0\xcc\x4f\xcf\x32\xba\xfe\x9c"
- "\x6b\x4e\x39\xf6\xd2\x72\xf7\x07\xe5\xb0\x1d\x51\xc6\x61\x7b\xce"
- "\x61\x69\x6c\xcf\xb9\xb7\x7b\xef\x0f\x3a\xdb\xc1\xfe\x3f\xb3\xed"
- "\xec\xff\x23\xb6\x56\x78\x8e\x82\x7d\x2f\x66\x97\x73\x9e\x7e\x8e"
- "\x37\x87\xed\x57\xbc\xba\x0e\xdb\x4a\xf7\x0d\x9d\x5d\x22\xc4\x76"
- "\x84\x96\x60\xdb\x2b\x48\x59\xee\x60\x4e\xad\xeb\xcf\xf5\xa2\x76"
- "\xe3\xbc\x81\xdc\x7d\x4a\x39\x6c\xbf\x52\xc4\x61\x3b\x6a\xab\x34"
- "\xb6\x23\xaf\x75\xef\x7d\x4a\x23\x97\xdb\xc7\x76\x64\x88\xbc\x3d"
- "\x5d\x22\x15\xac\x83\x8f\xdc\xcd\xe5\x2f\x22\x79\xf3\xdf\xa3\x1a"
- "\xba\x10\xdb\x0a\x79\x3b\x32\x5d\x88\xed\x57\xf2\x09\xb6\x7b\x17"
- "\x2a\xcb\x93\x44\xed\x77\x3d\x4f\x12\xbd\x9f\x79\x86\x29\x73\xbf"
- "\x54\x0e\xdb\xaf\xae\xe6\xf6\x26\x8a\x2e\xb2\xc6\x36\xb7\x37\xd1"
- "\x6b\x87\xbb\xcf\x7e\xa9\xaf\x8d\xb3\x8f\xe3\xd7\xd4\xf2\x72\x22"
- "\xaf\x15\xc9\xc7\xf1\x6b\x31\x5c\x4e\xe4\x35\xde\xfc\x97\x68\xcb"
- "\x3b\xc9\xbb\x60\xcf\xa2\xe8\x09\xf6\xf7\x2c\x8a\xd6\x74\xde\x3e"
- "\xaa\xaf\x4d\x15\xee\x59\xf4\x6a\x82\x99\xe9\x0b\xde\xcd\xca\xf2"
- "\x2a\xd1\x5a\xd7\xf3\x2a\x7f\x25\xcf\x77\x65\xee\xdb\xca\xf5\x85"
- "\xb9\x19\x5c\x5f\xf8\xeb\x87\xd2\x7d\x61\x5e\x59\xf7\xd9\xb7\x75"
- "\xde\x44\xfb\x7d\x61\xde\x50\x79\x39\x94\x79\x0a\xf6\x81\x99\x97"
- "\xc8\xe5\x50\xe6\x69\xb9\xbe\x30\x1f\x75\x5d\x5f\xf8\xeb\x34\xfb"
- "\x7d\xe1\xaf\x23\x3a\x6f\x3f\xd7\x79\x11\xc2\xbe\x30\x77\x1d\xe9"
- "\x0b\xf7\x24\x28\xcb\xc3\xfc\x55\xd1\xf3\x6f\x61\x5f\x58\x58\xce"
- "\x3c\xfb\x96\xb9\x7f\x2c\xd7\x17\xe6\x6f\xe5\xfa\xc2\x42\x1b\x3d"
- "\xcf\xf5\x85\x05\xa7\xba\xcf\xfe\xb1\x0b\xa6\xdb\xef\x0b\x0b\x46"
- "\xc9\xcb\xb9\x2c\x38\x2c\xbf\x2f\x2c\xe0\xad\x7f\x5a\xc0\x5b\xff"
- "\xb4\xc8\xab\xeb\xfa\xc2\xc2\xd9\xf6\xfb\xc2\x42\xff\xce\xdb\x57"
- "\x76\xc1\x7c\x61\x5f\x98\x9f\x45\xfa\x82\x8f\x51\x59\xde\x66\xa1"
- "\x13\xfa\xdf\x51\xde\x66\x71\x2d\x33\x2f\x40\xe6\x3e\xb6\x5c\x5f"
- "\x58\x54\xc4\xf5\x85\xc5\x65\xd2\x7d\x21\xe6\x6c\xf7\xd9\xc7\x36"
- "\x26\xca\x7e\x5f\x88\x09\x90\x97\xa3\x89\x29\x93\xdf\x17\x62\x72"
- "\xb8\x1c\x4d\x4c\x2d\xd7\x17\x62\x7d\xbb\xae\x2f\x2c\x5e\x60\xbf"
- "\x2f\x2c\x0e\xea\xbc\xfd\x6d\x63\x12\x84\x7d\x61\x51\x3e\xe9\x0b"
- "\xbe\x29\xca\xf2\x3c\x8b\xeb\x5d\xcf\xf3\xc4\xd5\x33\x73\x26\x64"
- "\xee\xa7\xcb\xf5\x85\xd8\x0f\xb9\xbe\x10\x77\x4a\xba\x2f\x2c\xb9"
- "\xdc\x7d\xf6\xd3\x5d\xb2\xd8\x7e\x5f\x58\x12\x2c\x2f\xa7\xb3\xe4"
- "\x94\xfc\xbe\xb0\xa4\x90\xcb\xe9\x2c\xa9\xe7\xfa\xc2\x52\xbf\xae"
- "\xeb\x0b\x71\xcb\xed\xf7\x85\xb8\x90\xce\xdb\x67\x77\xc9\x3a\x61"
- "\x5f\x88\xdd\x4d\xfa\xc2\x7d\x1e\xca\xf2\x42\x71\x7a\xd7\xf3\x42"
- "\xcb\xf4\xcc\x7c\x12\x99\xfb\xfa\x72\x7d\x61\xe9\x61\xae\x2f\x2c"
- "\xb3\xf3\x9e\x87\xf8\x96\xee\xb3\xaf\x6f\xbc\x83\xf7\x1f\xc5\xdb"
- "\x7b\xff\x91\x48\x0e\x28\xfe\xac\xfc\xbe\x10\xbf\x97\xcb\x01\xc5"
- "\xf3\xd6\xff\x25\x0c\xef\xba\xbe\xb0\xcc\xc1\xfb\x1f\x96\x39\xf1"
- "\xfe\x07\xa5\xfb\xfd\xc6\x67\x09\xfb\xc2\xd2\xfd\xa4\x2f\xdc\xbf"
- "\x51\x59\x1e\x69\x99\xc3\xfc\x3f\xf6\xf9\x6d\x2a\xdb\x3c\x52\x79"
- "\xfd\x28\xf4\xd8\x0c\xdc\x17\x96\xef\x32\xe6\x86\x86\xe0\xfd\x85"
- "\x4d\x7e\xec\x1e\x94\xab\xd9\x3d\x5e\x9a\x8d\x64\x0f\x4a\xbd\xa9"
- "\x7d\x0f\x4a\xb2\xf7\x07\xa2\xf0\x5a\x60\xbc\x26\xd8\xe8\x4d\xf6"
- "\x9f\xa4\xf1\x9c\x28\x3c\x47\xea\x5c\x29\xb3\xbf\x4a\xa2\x11\xee"
- "\xfd\x82\x83\xfd\x27\x23\x74\xa8\x3c\x62\x05\x32\xf6\xfd\x4a\x4b"
- "\xd6\x09\x2f\x1f\xc1\xec\x3f\x39\xcb\x77\x40\xe6\xf7\x48\xd5\x07"
- "\xef\x3f\x19\x41\x9b\x93\x75\xb4\xbe\xd2\x80\xe0\x5c\x68\xdf\xd9"
- "\x96\x3d\x28\x97\x17\xe0\x7b\x37\xce\xd2\x0c\xd8\xfe\xbd\xd4\xfe"
- "\xc2\xcb\x15\xec\x03\xbb\x3c\x98\xcb\xef\x2c\xcf\xe1\x30\xba\x9c"
- "\x19\x83\xe1\xf7\xd0\xf2\x10\xe0\x98\x4c\xb5\x57\x9b\xa2\xbd\x37"
- "\x96\x97\x38\x11\x33\x3c\x47\xc4\x86\xbf\xb8\x98\xad\x0c\x81\x98"
- "\xd5\xe2\x7d\x8e\x9d\x8f\x59\x8f\xa6\xce\x89\xd9\x8a\x06\xe7\x63"
- "\xb6\xf2\x25\xab\x98\x89\xe4\x21\x56\x8e\x96\x1f\xb3\x95\x1e\x5c"
- "\x1e\x62\x65\x20\x17\xb3\x95\x79\x24\x66\x2b\x74\x24\x66\x0f\x8d"
- "\x6a\x53\xb4\x7f\xc7\x4a\x87\xeb\xbf\xb1\x6f\x6a\x53\xd9\xfa\x72"
- "\x2e\x66\xab\xbc\x8c\xb9\xe0\xdd\xc1\x97\x3b\x1f\xb3\xbb\xcf\x75"
- "\x4e\xcc\x12\xf3\x9d\x8f\xd9\xaa\x1e\xc2\x98\x89\xf9\xe5\x44\x05"
- "\xef\xec\x4c\x3c\xc8\xf9\xe5\x44\x23\x17\xb3\x55\x41\x24\x66\x89"
- "\x39\x24\x66\x83\x22\xdb\x14\xed\x01\xb2\xca\xd7\x89\x98\xe1\x67"
- "\xfa\x76\xfa\x59\x92\x16\x62\x56\x8b\xf7\x7d\x76\x3e\x66\x7d\xbf"
- "\xea\x9c\x98\x25\x05\x3b\x1f\xb3\xa4\x43\x56\x31\x13\xf1\x75\x49"
- "\x3b\xe5\xc7\x2c\x69\x3e\xe7\xeb\x92\x4a\xb8\x98\x25\x23\x12\xb3"
- "\xa4\x40\x12\xb3\x87\xb3\xda\x14\xed\x23\x92\xe4\x30\xff\x85\x75"
- "\x68\x9b\xca\xd6\xe7\x70\x31\x4b\x89\x33\xe6\x82\x17\x02\x9f\xe3"
- "\x7c\xcc\x7e\x9f\xd6\x39\x31\x4b\xf1\x70\x3e\x66\x29\x0b\x84\x31"
- "\x13\xf3\x1f\x29\xd3\xe4\xc7\x2c\x45\xcd\xf9\x8f\x94\x48\x2e\x66"
- "\x29\xfb\x49\xcc\x92\x8d\x24\x66\x7e\x9f\xb6\x29\xda\x8b\x24\x25"
- "\xc5\x89\x98\xe1\x67\xb0\x76\xfa\xd9\x1a\x0d\xc4\xac\x16\xef\x83"
- "\xed\x7c\xcc\x66\x3e\xdb\x39\x31\x5b\x7d\xd0\xf9\x98\xad\x79\xc8"
- "\x2a\x66\x22\x3a\x79\x8d\x82\x7d\xb0\x57\xd7\x70\x3a\x79\x8d\x2f"
- "\x17\xb3\x35\xd1\x24\x66\xab\x4b\x48\xcc\x06\x37\xb4\x29\xda\xcf"
- "\x64\x8d\xe4\xfe\x5f\xf6\x74\xa3\x65\x5e\x3e\x17\xb7\xb5\xba\xee"
- "\xa3\x1d\xd7\xc6\x38\x1f\xb7\xb5\xa7\x1d\x6b\xc7\xb5\x47\xe5\xc7"
- "\x6d\x6d\x3a\xa7\x1d\xd7\x56\x73\x71\x5b\xa7\x26\x71\x5b\x1b\xed"
- "\x9a\x76\x5c\xeb\x70\xfd\xab\x98\x76\xb4\x8d\xdb\xfa\xbc\xee\xa3"
- "\x1f\xd7\x6b\x9c\x8f\xdb\xfa\x6c\xc7\xfa\x71\xfd\x72\xf9\x71\x5b"
- "\x1f\xc0\xe9\xc7\xf5\x1b\xb9\xb8\xad\xaf\x25\x71\x5b\xaf\x76\x4d"
- "\x3f\xae\x97\xdc\xff\xcd\x9e\x7e\xb4\x8d\xdb\xdf\x82\xbb\x8f\x86"
- "\xdc\xa0\x73\x3e\x6e\x7f\x9b\xe0\x58\x43\xfe\xed\x49\xf9\x71\xdb"
- "\x60\xe4\x34\xe4\xdf\xfc\xb9\xb8\xfd\x2d\x8b\xc4\x6d\x43\xad\x6b"
- "\x1a\xf2\x6f\xa1\x4a\x34\xa4\x6d\xdc\x52\x3d\xbb\x8f\x8e\xdc\x98"
- "\xe7\x7c\xdc\x52\xdd\x1c\xeb\xc8\x8d\x0a\xde\x59\xbc\x71\x3f\xa7"
- "\x23\x37\x1a\xb8\xb8\xa5\xb2\xef\x60\xd9\x98\xe5\x9a\x8e\x4c\x75"
- "\xb8\xff\x87\x98\x8e\xb4\x8d\x5b\x9a\xb6\xfb\x68\xc9\x34\x19\xfa"
- "\x3f\xcd\x4a\xff\x8b\x69\xc9\x34\x05\xfa\x3f\x6d\x3e\xa7\x25\xd3"
- "\x78\xfa\xff\x75\x56\xff\xa7\x05\xba\xa6\x25\xd3\x9c\xd1\xff\x36"
- "\x5a\xd2\x36\x6e\xe9\x09\xdd\x47\x4f\xa6\x7b\x3a\x1f\xb7\xf4\xc5"
- "\x8e\xf5\x64\xba\x82\xf7\x40\xa5\xfb\x71\x7a\x32\x3d\x9a\x8b\x5b"
- "\xfa\x41\x12\xb7\x74\xe4\x9a\x9e\x4c\x97\xdc\xff\xd1\x12\x37\x93"
- "\x2a\x34\x84\x16\xc9\x43\x56\x44\x8f\x62\xf7\x26\xdc\x14\x68\xf2"
- "\x09\x0d\x91\xfb\x7e\x17\xcb\x9e\xd3\x65\xa0\x8c\xcf\xb9\x67\x9e"
- "\x75\x6d\xdf\xe9\xcc\x6c\xd7\xf7\x9d\xce\x0c\xeb\xb8\xf7\xbb\x64"
- "\x8e\x97\xbf\xef\x74\xa6\x37\xa7\x41\x33\xa7\x72\xb1\xde\xc4\xcc"
- "\x4f\x90\xb7\x1f\x75\x46\x8d\x6b\xfb\x51\x67\x9e\x26\xf8\xca\xc8"
- "\x21\xfb\x51\x67\x56\x77\xcd\x7b\x5f\x32\xfc\xf1\x7e\xd4\x74\xe6"
- "\x23\x2a\x65\xfb\x23\x6f\x9a\xea\x04\x9e\x6b\x69\x91\x1c\x2d\x87"
- "\xe7\x37\x7c\x01\xcf\xb5\x72\xdf\x33\x23\xc4\x73\xf6\x87\xae\xe1"
- "\x39\x7b\xb6\xeb\x78\xce\x1e\xd6\x71\xef\x99\xc9\xf6\x91\x8f\xe7"
- "\x2c\x1d\xa7\xcd\xb3\xfd\x38\x3c\xbf\x11\x22\x1f\xcf\x59\xbb\x5c"
- "\xc3\x73\xf6\x1e\x82\xe7\xac\x48\x82\xe7\xec\xc2\xae\x79\xff\x4c"
- "\x96\x37\xc1\xf3\x90\x50\x65\xfb\x4f\xbf\xe1\xe7\x18\xcf\x61\x21"
- "\xb4\x48\xfe\x9a\xc3\x73\x4e\x83\xc9\x27\x2c\x44\xee\xfb\x6e\x84"
- "\x78\xce\x59\xed\x1a\x9e\x73\x9e\x74\x1d\xcf\x9b\x4d\x1d\xf7\xbe"
- "\x9b\xcd\xe7\xe5\xe3\x79\x73\x09\xe7\x59\x36\x37\x73\x78\xce\xd5"
- "\xc8\xc7\xf3\xe6\x38\xd7\xf0\x9c\xb3\x9c\xe0\x79\xf3\x08\x82\xe7"
- "\x9c\x98\xae\x79\x0f\xce\x1b\x3a\x82\xe7\xc7\x76\x29\xdb\xdf\x3b"
- "\x47\x72\xff\x63\x1e\x9e\x6b\x69\x91\xdc\x3e\x87\xe7\x37\x0f\x02"
- "\x9e\x6b\xe5\xbe\x77\x47\x88\xe7\x37\x5d\x7c\xcf\xc5\x9b\x1d\xf0"
- "\x9e\x8b\x2d\x2e\xbc\xe7\xc2\xfa\xbd\x3b\x5b\x0e\xc8\xc7\xf3\x96"
- "\x14\xce\xcb\x6d\x39\xc6\xe1\xf9\x4d\x83\x7c\x3c\x6f\x09\x70\x0d"
- "\xcf\x6f\xb2\xef\xbf\xd8\xe2\x41\xf0\xfc\xa6\x7f\xd7\xbc\x8f\x27"
- "\xb7\x84\xe0\x79\x58\xa3\xb2\xfd\xd3\xdf\x3c\xe6\x18\xcf\xe1\x21"
- "\xb4\xc8\x73\x0f\x0e\xcf\xdb\x36\x9a\x7c\xc2\x43\xe4\xbe\xff\x47"
- "\x88\xe7\x6d\x0f\xb9\x86\xe7\xad\x27\x5d\xc7\xf3\xd6\x82\x8e\x7b"
- "\xff\xcf\xd6\xf5\xf2\xf1\xbc\x35\x98\xf3\xb8\x5b\x79\xcf\xff\xb7"
- "\x95\xca\xc7\xf3\x56\x17\xdf\x0b\xb4\xed\x5e\x82\xe7\x3c\xf6\xbd"
- "\x40\xdb\xbc\xbb\xe6\xbd\x40\x79\x29\x04\xcf\xc3\x47\x28\xdb\x9f"
- "\x7e\x5b\x8e\x13\x78\xae\xa5\x45\x9e\x09\x71\x78\x2e\x08\x01\x3c"
- "\xd7\xca\x7d\x0f\x91\x10\xcf\xf9\x57\x5c\xc3\x73\xfe\x4e\xd7\xf1"
- "\x9c\xbf\xa0\xe3\xde\x43\x94\x3f\x4d\x3e\x9e\xf3\x2d\xcf\xff\x80"
- "\x9f\xf3\x79\xcf\xff\x0a\x14\xbc\x9f\xe8\xad\x7a\xd7\xf0\x9c\x7f"
- "\x91\xe0\xf9\xad\x5d\x04\xcf\xf9\xba\xae\x79\x3f\xd1\x5b\xc1\x04"
- "\xcf\xbf\x4b\x54\xb6\xff\x7f\x81\xc3\xf9\x1f\x62\xf9\x0d\x4b\x5e"
- "\x8a\xc3\x74\xe1\x50\xd7\x73\x1c\x3b\x8e\xbb\x86\xe9\x1d\x4b\x5d"
- "\xc7\xf4\x8e\x71\x1d\x97\xe3\xd8\xa1\xe0\x5d\x7f\xdb\x9b\xb9\x1c"
- "\xc7\x8e\x51\x1c\xa6\x0b\xe7\xcb\xc7\xf4\xf6\x83\xae\x61\x7a\xc7"
- "\x61\x82\xe9\xed\x09\x04\xd3\x3b\xf6\x77\x4d\x8e\x63\xbb\x9f\x6b"
- "\x39\x8e\xc2\x51\x4a\x72\x1c\xb6\x98\x7e\x07\xb9\x9e\xe7\x78\x7b"
- "\xab\x6b\x98\x7e\x7b\x82\xeb\x98\x7e\xdb\xa7\xe3\xf2\x1c\x3b\x4d"
- "\xf2\x31\xbd\xb3\x94\xcb\x73\xbc\xed\xc5\x61\xfa\x1d\x7f\xf9\x98"
- "\xde\x99\xee\x1a\xa6\xdf\xce\x26\x98\xde\x19\x44\x30\xfd\xf6\xc6"
- "\xae\xc9\x73\x14\x1a\x5c\xcb\x73\xbc\xe3\xa5\x24\xcf\x61\x8b\xe9"
- "\xa2\x1a\xd7\x73\x1d\x45\x0b\x5c\xc3\x74\xd1\xfd\xae\x63\x7a\xd7"
- "\xc5\x8e\xcb\x75\xec\x3a\x29\x1f\xd3\xbb\xf2\xb9\x5c\xc7\x2e\x1d"
- "\x87\xe9\x77\x55\xf2\x31\xbd\x2b\xc2\x35\x4c\x17\x45\x11\x4c\xef"
- "\x52\x13\x4c\x17\x85\x76\x4d\xae\xe3\x9d\x72\xd7\x72\x1d\x45\x3a"
- "\x25\xb9\x0e\x5b\x4c\xef\xde\xed\x7a\xbe\x63\xf7\x38\xd7\x30\xfd"
- "\xf7\x2b\xae\x63\xfa\xef\x87\x3b\x2e\xdf\xf1\xf7\x22\xf9\x98\xfe"
- "\x3b\xef\xfd\x17\x7f\xe7\xad\xff\xdf\xdd\x20\x1f\xd3\x7f\x1f\xe1"
- "\x1a\xa6\x77\x8f\x26\x98\x7e\xb7\x99\x60\x7a\xf7\xf0\xae\xc9\x77"
- "\xbc\x5b\xe8\x5a\xbe\x63\xb7\xc3\xfd\x2f\xc4\xf2\x1d\xb6\x98\x7e"
- "\x3f\xd1\xf5\x9c\xc7\xfb\x3e\xae\x61\xfa\xbd\xe3\xae\x63\xfa\xbd"
- "\xec\x8e\xcb\x79\xbc\xb7\x5c\x3e\xa6\xdf\x0b\xe0\x72\x1e\xef\xf1"
- "\xe6\x3f\xbd\xff\xa9\x7c\x4c\xbf\xe7\xe9\x1a\xa6\xdf\xef\x45\x30"
- "\xbd\xa7\x94\x60\xfa\x7d\x8f\xae\xc9\x79\xec\x89\x73\x2d\xe7\xf1"
- "\xfe\x46\x25\x39\x0f\x5b\x4c\xef\x0b\x76\x3d\xef\x51\x7c\xd1\x35"
- "\x4c\x17\x6f\x75\x1d\xd3\xc5\x51\x1d\x97\xf7\x28\x9e\x28\x1f\xd3"
- "\xc5\xbe\x5c\xde\xa3\x98\xb7\xff\xfd\xbe\x2c\xf9\x98\xde\x5b\xe7"
- "\x1a\xa6\x8b\xcf\x12\x4c\xef\xcd\x27\x98\x2e\xae\xed\x9a\xbc\xc7"
- "\xde\x40\xd7\xf2\x1e\xfb\x6c\xe6\xbf\x2d\x89\x5a\x18\xa9\x5e\xf4"
- "\xea\xab\x4b\xa2\xe2\xd4\x4b\xe6\xcf\x7d\x25\x6a\xec\x60\xcb\xff"
- "\x63\x87\x27\x0c\x4e\xb8\x0b\x45\x2e\x98\x3d\x2b\xfe\x77\xdc\x87"
- "\xf3\xa3\x16\xc2\xaf\xbb\x50\xf4\xec\x25\xd1\xea\xb8\xe5\x31\x51"
- "\x6a\xfc\xdf\x82\x57\x62\xe0\x94\x45\x71\xdc\x91\x29\x51\xf3\x67"
- "\x27\xcc\x5d\xf8\x9a\x7a\xf6\xfc\xb9\xaf\x2d\x5c\x10\xb5\x30\x4e"
- "\x1d\x1b\xb5\x78\xe9\xdc\xd8\x28\xfc\xf7\x12\xf5\xab\x8b\x62\xe1"
- "\xc0\x2b\x51\x73\xe3\xa3\xd4\x73\x96\xbe\xfa\x6a\x54\xec\x92\xbb"
- "\xd0\xc4\xa5\xff\xaf\xbd\xaf\x01\x88\xaa\x4a\xfb\x3f\x73\xe7\xa2"
- "\x68\xc8\x8c\x04\x2e\xb5\x66\x93\x62\x8d\x8a\x8a\x8a\x8a\x86\x49"
- "\x45\x1b\x6d\x2a\xec\xbb\xd6\x4e\xad\x7c\x58\x6a\x58\x7e\xb0\x88"
- "\x4a\x7e\x00\x92\xf5\x57\x33\x40\x04\x5e\x5b\xf9\x70\x77\x6d\xff"
- "\xec\xfb\x5a\x62\x59\xa1\x69\x8d\x89\x1b\x19\x0a\xb9\xba\x4b\xbb"
- "\xb4\x4d\xa4\xc6\x1a\xea\x24\xa3\x0c\x30\x33\xe7\xff\x3c\xe7\xdc"
- "\x0b\x77\x86\x19\x05\x44\xb7\xbf\xdb\xd5\xc3\xbd\xf7\x9c\xe7\x3c"
- "\xe7\x39\xe7\xfc\xce\xef\x7c\xdc\x3b\xf7\x2c\x4a\x59\x98\xb4\x68"
- "\xbe\x2e\x72\xe6\x83\xa3\x67\x3f\xf2\xcb\xd9\xd3\xa7\xf7\x27\x8a"
- "\xbd\xa7\x75\x34\x2f\x3d\x01\x30\x24\x9e\x55\x7f\x30\xe2\x38\x20"
- "\xe2\x35\xc0\x66\x76\x32\xd1\x6e\x4c\x26\xe2\x86\x4b\xc4\xfb\xb5"
- "\x4b\xc4\x47\xf7\x3c\x89\xa0\x03\x5f\x37\x67\x5f\x22\xfe\x74\xd0"
- "\xd0\x5a\xba\xe5\x04\xa1\x03\x4f\x44\x98\x07\xee\x47\x3f\x2d\xdd"
- "\xb2\x5f\x8f\x61\x50\x17\x22\x84\x95\xd6\xab\xf7\x37\x98\x07\x7e"
- "\x50\x93\xfe\x2f\x22\x50\xdf\xdd\x07\xde\x72\x98\x85\x43\x29\x04"
- "\x0f\x15\x51\x97\x9d\x04\x67\x24\xea\x3d\x49\xe0\x32\xc0\x55\x82"
- "\x33\x83\xb3\x12\xf5\xdb\xf3\xc0\xed\x02\x57\x07\x0e\xfc\xde\x11"
- "\xc1\x69\xc1\x05\x82\x03\xff\x77\xaa\xc0\x41\xd8\x3b\x16\xae\xe7"
- "\x1d\x1b\x51\xef\x5d\x03\xae\x02\x1c\xc4\x7f\x17\xfc\xdf\xd3\x81"
- "\x03\xb9\xf7\x22\xc0\xcd\x01\x07\x3a\xdf\xdb\x00\x0e\xe2\x43\xb7"
- "\xca\xc2\xde\x4f\x05\xb7\x17\x1c\xe8\x78\x1f\xd2\x29\x0f\x02\x17"
- "\x06\x2e\x12\xdc\x0c\x70\x60\x5b\x39\xc8\x94\x6f\x26\xea\x7d\x60"
- "\xc3\x3e\x1f\x70\x21\xe0\x40\xcf\x3e\x48\x63\x7f\x14\xb8\x06\xc9"
- "\xe5\x80\xab\x50\xdc\x9b\x14\xd7\x6e\xdc\x07\x80\xeb\xbb\x4d\xc6"
- "\x91\x36\x68\xb7\x7b\xc6\xd9\x33\x89\xda\xbe\xe5\x83\x9a\xa4\x91"
- "\x44\x75\x4e\x5d\x66\xaf\x5e\x4f\x08\xd5\x9e\x20\xc6\x55\xad\x10"
- "\x5e\x66\xc7\x32\x6b\xce\x2a\xb3\x99\xc8\xd6\x28\x6c\x9f\xdd\xc3"
- "\x67\x99\x8d\xc7\xdf\x13\x6e\x52\x8d\x09\xc1\xf8\x34\x37\x6e\x0d"
- "\x4d\x37\x6c\xc7\xdf\xe1\x9e\xc5\x32\xc4\x76\x93\x13\x7b\x92\x6a"
- "\x0d\xb3\x91\x63\x8c\xab\xd0\xae\xb2\x53\xd0\xde\x7c\x21\xfe\x49"
- "\x0a\xf5\x68\x0e\x80\x3a\xcf\x24\x22\xbb\xdf\xb2\xdf\x4c\x77\x6c"
- "\x8a\xe2\xbc\xb3\x87\xcd\x5f\x5a\x02\x96\xe5\x60\x98\xf5\x8d\x19"
- "\x11\x74\x67\x5c\xad\x71\x49\x2b\x39\xad\xde\x73\x08\xf8\x4f\xa0"
- "\xf7\xce\x88\x70\x14\x2c\xcb\x29\x07\x0c\xa0\xcc\xbe\xb4\x06\x3c"
- "\xd7\x40\xbe\x05\x9a\x97\x62\xc0\x35\x20\x63\x5a\x2e\x70\x72\xd9"
- "\xa9\x96\x80\x4d\x21\xba\x9f\x6b\x68\x3d\xa6\x23\xe0\xf7\xd6\xf7"
- "\x48\xef\xf3\x97\x9d\x6c\x09\x18\x6a\x42\xdd\xf6\x1d\x9b\xcc\x10"
- "\x26\x52\xc0\x1e\xd8\xa0\xba\x00\xf1\xec\xf9\x43\x6b\x8d\x3f\xc7"
- "\x34\xdf\x8e\x05\x3b\x85\xf4\xc7\x40\xf7\xef\x37\x99\x77\xaf\xb2"
- "\x0a\x14\x6d\xf7\x1f\x5a\x0b\x58\xf7\xb1\x67\xbd\x55\xf8\xba\x1f"
- "\x11\x8b\x72\x09\x29\xf1\x23\xde\xcd\x59\x6f\xcf\x36\x89\x0f\xce"
- "\xe6\xbc\x57\x76\x52\x00\x19\x93\xfa\xed\x10\x0a\xf5\xc1\xd2\xca"
- "\x5b\x52\x73\x95\xb4\xde\x68\x4f\xab\x60\x49\x0d\xa6\xc5\xca\x87"
- "\x97\x15\xbf\x96\xf5\xec\x9c\x71\x35\x9b\x7f\x87\x3a\x20\xdd\x3c"
- "\xfa\xc7\x19\x66\x7b\xc1\x72\x33\x86\xa1\x3c\x2f\xff\xfd\x66\xcd"
- "\x3a\x62\xa1\xe0\x67\x97\xea\xc0\x8e\x75\x20\x64\x00\x7f\xed\x49"
- "\xc1\xf4\x20\xae\xc9\x9e\xa9\x23\xba\x9f\x13\xd2\xa8\x7e\x87\xad"
- "\x4d\x50\x6d\x7c\x24\xaf\xe3\x77\xa6\xa4\x56\x52\x07\x38\xfb\xd8"
- "\x4a\xa2\x32\xfe\x1c\xeb\xf7\x1d\x83\xee\x67\x7d\xa1\x9c\xdf\x79"
- "\xaa\xbd\x7c\xef\xd9\xd4\x00\x65\xa4\x85\x72\xf1\xb1\xbf\x72\x5f"
- "\x04\x15\x74\x04\xf3\xa1\x2c\x2f\xcc\x4f\x73\xd6\x3b\x1b\x5c\xca"
- "\x4c\xfb\xd8\x63\xe9\x54\xa1\xfb\x17\xca\xfc\x83\x7c\xb9\x49\x75"
- "\x5f\x2a\xca\xeb\x86\x32\xcc\x9d\xb2\x4b\xe1\x88\x7b\xac\x67\x1a"
- "\x90\x9e\x80\xf7\x4f\x8c\x20\x5a\x4d\x25\x11\x74\x69\x41\xe5\x1c"
- "\x0f\x29\x06\xc8\xdb\x4e\xae\x0f\xf2\x58\x90\x50\x0a\x71\xf5\x1d"
- "\xf8\xdb\x1b\x6a\xdf\x12\x1f\xde\x12\xb0\x5c\x6b\xcd\x5f\x5c\x43"
- "\x73\xe2\xc3\xf1\xf7\xe7\xf5\xea\xbd\xa3\x59\x19\x64\x7a\x13\x6e"
- "\x47\x7c\x44\xda\x22\x6a\x4e\xfb\x1e\xd2\x1a\xb4\x5c\xbb\x6f\x85"
- "\x19\xea\x6c\x71\x0d\x62\xa2\xfc\x8a\x55\xc0\x6f\x02\x52\xdf\xb7"
- "\x3e\x2c\xe6\x79\xf5\x86\xbc\x12\xd4\xdb\x9c\xb5\x37\xa5\x23\xaf"
- "\x7b\x03\x11\x1f\x90\xc6\x6c\x9e\x36\xe8\xcd\x84\x34\xb6\xc4\xcf"
- "\x06\xb9\x42\x93\xea\x2f\xac\xff\xa4\x2b\xe8\xc9\xec\x56\x42\x9a"
- "\x56\x50\x5b\xb4\xed\x2b\x07\xf4\xcb\x04\xc2\x0f\x98\x48\xa4\xb7"
- "\x5c\x66\xbc\xcd\xb5\xeb\x61\xdf\x8a\x30\x0f\x64\x7a\x4e\xbb\xd3"
- "\x03\x69\xef\x8a\xb7\xe9\x54\xad\x57\x68\x4d\xf6\x93\x60\x5b\x26"
- "\xa1\xad\x2b\x68\xd5\xda\x28\x6a\xcd\x3a\x41\x60\x6c\x54\x47\x80"
- "\x6b\x07\xfb\xaa\xa8\x39\xfa\x45\xa2\xf1\x4d\xd2\xd0\x4f\x2b\xeb"
- "\xc8\xea\x28\xda\x50\x9d\x6a\x27\xc7\x2d\xa7\xc9\x9a\x2f\x88\x4f"
- "\xfa\x31\xe2\xbf\x26\x8a\x9a\xab\x12\xea\x08\xf7\x3f\x46\xd2\xbf"
- "\x26\xe2\xea\x0a\x6a\x9d\x05\xfd\xf4\x67\x75\xe8\x7f\x1a\xfc\xed"
- "\x24\xbd\x81\xda\xd2\x62\x89\x0f\x5e\x1f\xab\x40\xff\x33\x04\xda"
- "\xb3\x18\x9d\x6a\xd6\x14\x43\x9a\x18\xbf\x04\x6c\x71\x5c\xa1\x07"
- "\xb2\xaf\x10\xb2\xfa\x29\x12\xb8\x66\x2e\xd1\x46\xc3\x70\xa1\xda"
- "\xf6\x2e\x89\xb6\x53\x18\x07\x1c\x21\x6b\x17\x12\xef\x68\x1b\xfe"
- "\x7e\xfc\x14\xb8\x22\x52\x02\xb2\x90\x37\x23\xe6\x6d\xf5\x97\x30"
- "\x2e\x3a\x2f\xc7\x39\x28\xc5\xf9\x92\x60\x99\xb5\x0c\x3c\x11\x62"
- "\xdd\x72\xa2\x0c\xf2\x5e\x86\x65\x00\xe9\xd4\x38\x30\xde\x15\xd6"
- "\x3f\x61\x19\xa8\xe2\x6d\x80\xd5\xfc\x45\x65\xf1\xa9\x46\xa6\xd7"
- "\xa4\x7e\xb7\xb1\x24\x99\xd9\xe4\x24\x1b\x6d\xa3\x4d\xe6\x80\x45"
- "\xa0\xeb\x3d\xff\xe8\xd4\xe9\x54\xaa\xb7\x98\xe6\xac\xf7\x66\xcb"
- "\xe5\x2d\xd7\x0b\xc8\x44\x41\x5d\xc4\xa8\x93\x88\x08\xe1\x29\x26"
- "\xd5\x5f\x77\x28\xb0\x8b\xbc\xd5\x47\x96\x95\x64\xb6\x99\x54\x27"
- "\x1b\x3a\x64\xf6\xe0\x58\xa5\x5d\x06\xc2\x01\xff\xa7\xcc\x1d\xe1"
- "\x0c\xcf\xed\xe1\x52\xff\x2b\xeb\x56\x03\x0f\xeb\xed\x01\x29\x09"
- "\x34\x60\x58\x12\x6d\x0a\xf4\xa1\x02\xd4\x8d\x8d\x5a\x1d\xf9\xf1"
- "\x65\xd0\xc7\xfa\x54\xdb\x2c\x84\xcb\xbf\x1f\x4b\xf3\x87\xa5\xf2"
- "\x77\x5e\xdf\x7f\x04\x75\xc2\x58\x4c\x0b\xfd\xb5\x36\xba\x92\x5a"
- "\x91\x3f\xec\xf9\xa3\xcc\x59\xc9\xd0\x67\xe7\xa7\xc4\x38\x02\x96"
- "\x26\x58\x7f\xb7\x29\x02\xfb\x04\x6c\x6f\x34\x0f\xe2\x4a\x7a\x20"
- "\x5d\x2f\x93\xfa\xfd\xc1\x76\x88\x4f\xf3\xe2\xcb\xb8\x3f\xe7\x37"
- "\xce\x43\xef\x0f\xa6\xc3\x21\x2c\xc7\x10\x0c\x61\x5e\xf5\xea\xf7"
- "\x4b\xc1\x9f\xc0\xfd\x3c\x63\xda\x25\xd4\xf1\x26\xc7\xb4\x41\xef"
- "\x74\x2f\x60\x79\xbe\x6d\x45\x8e\x42\x6e\x02\xff\x63\x1d\x3c\xc1"
- "\xfb\x00\xce\xed\xf1\xc6\xe6\xac\xf7\x4d\x26\xd5\xb8\x5d\x58\x4e"
- "\x58\xb7\x16\xce\x6b\xa7\xed\xbf\xdb\x14\x75\x38\x8a\x90\xc3\x15"
- "\xd8\x8e\xca\x45\x93\x6a\x82\xb1\xa3\x2c\xcb\xef\x42\x59\x66\x27"
- "\x70\x09\x5e\x33\x5e\x81\x38\xd0\xce\x91\xbf\x44\xce\x8f\xe5\x81"
- "\xd8\x6f\x01\x9f\x24\x4a\xfd\x54\xa5\x49\xfd\x8e\x37\xf5\xdb\xaa"
- "\x05\xbb\x32\xea\x25\x5b\x94\xb6\xc9\xbc\x48\xb7\x6c\xcd\xe1\xb2"
- "\xf1\x06\x48\x7f\xbd\x49\x15\xba\x4d\x89\x17\x9e\xaf\xf2\xf3\x80"
- "\xe9\xda\xb1\x15\x70\x0f\x63\x29\x59\x1f\xf0\x8b\x37\xf0\xca\x5f"
- "\x11\x6f\xc8\x29\xdb\x72\x71\x7c\xb4\x75\x9b\x75\xcb\xd6\x1d\xa0"
- "\xab\x46\xe6\x16\x8c\x8b\xed\x01\xf8\xc5\x9b\xf1\x86\xdd\xa6\x66"
- "\x6d\xde\x4e\x82\xdb\xb9\x04\xfc\x5a\x06\x6e\xdd\x26\xf9\x8b\xcc"
- "\x26\x41\xed\x80\xf4\x55\x72\x7a\x2d\x03\xe3\xa3\x9a\xb3\xf6\xe9"
- "\x4d\xaa\x7b\x76\x3a\x71\x4d\xee\xec\x4a\x4a\x0d\x88\x1b\xf5\x59"
- "\xf5\xbe\x99\x70\xee\x2b\xe1\xf4\xb6\xc3\x95\x84\x44\x3e\x02\x69"
- "\x40\x7d\xbe\x3e\x88\x9a\x21\x7e\xa2\x89\xfc\xc6\x07\xe3\x6f\x84"
- "\x7b\xf4\x47\x19\xf0\xcf\x00\x7f\x1b\xd7\xbb\x27\x05\xeb\xc7\x45"
- "\xef\x9b\x5c\xef\xbe\x3d\xa8\x4f\xea\xe3\x6f\xc3\x6b\x8c\x8f\xba"
- "\x8b\x0a\x68\x23\xea\x03\x5d\x55\x72\x1a\xaf\x81\x9f\x9c\x4e\xe4"
- "\xe2\xf6\xb4\x1a\x21\x7c\xbd\x32\x0f\xdb\x0a\xa8\x85\xdb\xb7\xdf"
- "\xdb\x44\x5e\x66\xed\x69\x03\xf8\x61\x5c\x8e\x85\xfd\xc3\x11\x27"
- "\x26\x9e\x2f\x35\xc7\xcb\xfe\x50\x13\x59\xef\xd4\xf7\x40\x5d\x0c"
- "\x90\xfb\x26\x49\x9f\x41\xd6\xd7\xa1\x8b\xeb\xa0\x39\x79\x39\x52"
- "\x5b\xc0\x36\xeb\x83\xfa\x41\x7e\x83\x89\x2c\xab\xe2\xb6\xbd\x6d"
- "\xb5\x70\x6c\x43\x1d\xb0\x38\xbc\xce\xb3\xde\x3a\x8d\xfd\x66\x49"
- "\x2e\xf2\x58\x7c\x24\xc4\x39\xe0\xd2\x67\x7a\x83\x7f\xa8\xa4\xaf"
- "\x16\xea\x6b\x9e\x33\x07\x61\x5f\x97\x92\x81\xb8\x91\xb8\xc1\x8e"
- "\xf6\xca\xe1\x90\x86\x08\x69\x5c\x41\xbc\x63\x1a\xf6\xfc\xc5\x11"
- "\xcd\x59\x1f\xe8\x5c\xd2\x10\x51\xce\x9e\xb5\x7b\x14\xf6\xdf\x5b"
- "\x07\xd1\x06\x90\x89\x94\x65\x30\x1c\xca\xfc\x01\xf0\x83\xfc\x6f"
- "\x59\x83\x7e\x59\x20\x63\x52\xef\xf6\xf8\x9b\x9e\xb4\x7b\x88\x50"
- "\x5d\x68\xc2\xf9\x2e\xb6\xed\xf0\xea\xc1\x16\x52\x5d\xe8\x20\x8e"
- "\x3f\xce\x4c\x8a\x48\xa3\x46\x98\x43\x9c\x3a\x6e\x6d\x20\xdd\x1b"
- "\xa3\x7e\xb0\x83\x61\xb4\x15\xe6\x65\x6b\xc6\x13\x1c\xb3\x5c\x50"
- "\x1f\xf4\xaa\x36\x5f\x62\x3c\x77\x41\x7d\xe0\x7b\x0c\xdf\x0a\xf3"
- "\x38\x9c\xcb\xc1\x7c\x3d\x31\x47\xe0\xf3\x39\x07\xc8\x16\xa3\x3f"
- "\xce\xf5\xa0\xff\x2a\x51\x84\xd1\x3f\x3e\x6e\xe6\x65\x77\xe0\x20"
- "\xe3\x7b\xb4\xd7\xf6\xa8\x11\x6d\x76\xec\x7c\xdc\x8c\x79\x48\x4f"
- "\xa5\x8e\x6a\x5b\xb3\x11\xfb\x38\xdd\x0a\x9c\x87\x1e\x78\x3d\xba"
- "\x88\x50\xc7\x1b\x8f\x9b\xbb\x97\x87\x03\xec\xf9\x37\xcc\xd5\x2f"
- "\x98\x87\x3f\x6e\x4e\xb7\x13\x21\x3b\xcd\xcb\xfb\xe1\x42\x6a\x6c"
- "\xba\x77\x66\x52\x73\xd6\x81\x03\x87\x52\x09\xe9\xfe\xf8\xfd\xc0"
- "\x01\x39\xef\xc5\x52\xde\xc1\x6f\x30\xfa\x8d\xdd\x96\xc1\xf2\x0b"
- "\xf7\x1e\xdf\xf5\xa3\x99\x1a\x7a\xb8\xd0\x46\x96\x15\xd2\xd6\x65"
- "\x45\x44\xb0\x17\xcc\x0d\xd9\x5d\x5c\x8b\x9c\x1e\x21\x97\x27\x2b"
- "\x3b\x9b\x99\x24\xa5\x11\xed\x39\xf5\xc1\xa2\xe8\x35\x19\x6c\x5f"
- "\xa7\x8f\x40\xae\x7b\xb6\x1e\x64\x63\xf5\xe3\x30\xf7\x8f\xb6\xa5"
- "\x53\xde\x2f\x1d\x3c\x32\x4b\xd2\x87\x61\x72\xfd\x15\x4b\x73\xf2"
- "\x1e\xa4\xe1\xf1\xf7\x2f\x57\xc9\xab\xd6\x7d\x5e\x3f\xdc\xd8\xf3"
- "\xbc\x7e\x38\xbb\x73\x5e\x3f\xdc\xd3\xbb\x79\xfd\xb0\xbc\x07\x79"
- "\xd5\xb9\xcf\xeb\x47\xcb\x7b\x9e\xd7\x8f\x22\x3a\xe7\xf5\xa3\xa2"
- "\xde\xcd\xeb\x47\x1e\x7f\xff\x79\x95\xbc\x86\xb8\xcf\xab\x71\x6e"
- "\xcf\xf3\x6a\x0c\xee\x9c\x57\xe3\xc6\xde\xcd\xab\x31\xc7\x63\x5e"
- "\x05\x0d\x45\x7e\x02\x5e\x6a\x4d\x6b\x81\xf1\x5c\xc1\x4a\xb2\xf6"
- "\x77\x44\xa8\xb2\x58\xc9\xf1\xc1\xb5\x24\xfd\x45\x22\x8c\x49\x02"
- "\xde\xcb\x24\xe1\xb4\x60\xa8\xf9\x78\x61\x23\xf8\x9f\x25\xc7\x52"
- "\xad\x24\x22\x19\xf9\xf7\xd0\x13\xd5\xf3\xba\xcb\xbf\x87\x74\xed"
- "\xfc\x6b\x1b\x2f\x71\xee\xc7\xeb\x8e\x37\xb6\x12\xcc\x3f\x5c\x2f"
- "\x6e\xe7\xdf\x4c\x5e\xde\xae\xfc\x8b\xe5\x51\x6d\xb5\x3a\xf1\x2f"
- "\xff\x6d\xd7\xc7\x53\x5c\xb9\x37\xeb\x1c\x21\xee\xb9\xf7\xe3\x00"
- "\xe4\xde\x62\x08\xef\xa6\xfd\x26\x99\x7b\x73\x20\x4d\x25\xf7\x1e"
- "\x9e\x87\xfd\xeb\xc7\x61\x3d\xe3\xde\x8f\xc3\xe4\x7c\x17\x49\xf9"
- "\x86\xb4\x0a\x9d\xb9\xf7\xe3\xa4\xae\xe0\x96\x16\xcc\xd1\xee\x1e"
- "\x62\xf5\x72\xec\x9c\x15\x82\xfd\x5b\x33\x94\xc9\xfb\xc5\x56\x11"
- "\xf2\xcc\xf7\xea\x68\x9e\xa7\xa2\x3b\x67\xd4\x46\xa7\xd0\xaf\xe8"
- "\xf0\x59\x21\xb8\xbe\x8a\xeb\x04\x67\xd5\x87\x87\xc3\x98\xbe\xb6"
- "\x9b\x76\x9b\xa5\xfe\x2f\x29\x0d\xda\xcb\xee\x15\x56\xc1\xb1\xda"
- "\xa0\x81\x7a\xd0\xd2\xfc\x84\x18\xfa\xca\x64\x6d\x53\xfe\x72\xe3"
- "\x11\xfd\x19\x82\xb2\x74\x9d\x18\xd1\x73\xfb\x0f\x97\x5d\xc3\xfe"
- "\x33\xdd\xb7\x9f\xeb\xec\x9a\xfd\x87\xcb\xba\x64\xff\x20\xb0\xbf"
- "\x35\xcc\x0b\xe6\x8b\xc2\x47\xad\x61\x62\xf7\xec\xa9\x88\xe8\x52"
- "\x1d\x5f\x5f\x1a\x5d\xe6\x3f\x3a\x68\x71\xcc\xee\x62\xb3\x00\x1c"
- "\xc0\xfa\x70\x6c\x7b\x9c\xff\x1a\x80\xb3\xbe\xa2\x9c\x93\xcc\xdd"
- "\xe4\xa4\x23\x1e\x7f\xff\xd2\x39\xfd\xb9\x65\x37\x20\x7d\xcf\xf9"
- "\x77\xe5\xc4\xb7\xe2\x63\x3c\x73\x62\x42\x59\x67\x4e\xfc\xf3\xc2"
- "\xee\x73\xe2\x9f\x43\x3b\x73\xe2\x27\xf9\x1d\x9c\xf8\xc9\xba\x9e"
- "\x73\xe2\x27\x33\xbb\xce\x89\x9f\x8c\xe8\x19\x27\xfe\xd9\x72\x75"
- "\x4e\xfc\x64\x46\xcf\x38\xf1\x93\x19\x9d\x39\xf1\xcf\x65\xce\x9c"
- "\xf8\x89\xc7\xdf\xba\xd2\x9c\xc8\x1c\xe8\xa3\x7d\xce\xa9\x2b\x67"
- "\xdb\x32\x09\x71\xe4\x7c\xd4\x10\x6d\xa7\xcd\x74\x4b\x64\x8e\x43"
- "\x08\x45\x5e\x89\x68\x6e\x4e\xf4\x76\xac\xd4\xfb\x50\xbf\x5f\x9d"
- "\xa0\x6d\x81\x04\xca\x29\x08\xec\xd7\xd0\x66\xbd\x2f\x5d\xa9\xf7"
- "\x2b\xbc\x42\xfc\xc1\x05\x16\x4a\xfd\x31\x5c\x87\xd0\x95\x81\xfd"
- "\xb3\x56\x90\x60\x8d\x85\x78\x83\x0d\x06\xcd\x3a\x2d\x01\x0e\xf2"
- "\xc7\x6b\x9a\x79\x58\x2c\xb9\x42\x44\x4d\x2a\xd4\xcd\x40\x48\x2f"
- "\x55\x43\xe9\x32\x3d\x29\x49\x26\xde\x0e\x81\x04\x16\x0b\xb4\xcc"
- "\xd6\xac\x17\xec\xfe\x29\x49\xbc\x7e\x3e\xf5\xa6\x83\x60\xee\x95"
- "\x97\x12\xee\x18\x94\x12\x64\x4f\x4f\x54\xd3\xd5\x06\x35\xda\x6a"
- "\xcf\x4b\xd1\xd1\x02\x70\xe9\x89\xbe\x38\x86\x2e\x59\x01\x69\x37"
- "\x07\xf6\xcf\x86\xb4\x8b\x57\x90\xa0\xa2\x2b\x44\x4f\x9b\xf4\x02"
- "\xd4\xbf\x01\xf7\x47\x85\x32\x32\x38\x84\xc3\x22\x84\x89\xc8\x89"
- "\x14\xd3\xb7\x41\xfa\x6d\x7a\x5c\xe3\x02\x6c\x93\xc0\x12\x48\xdf"
- "\xbe\x52\xdf\xcd\xf6\x52\xc9\xe7\xf5\x92\x5d\x8e\xe0\xe7\x62\xe8"
- "\x5b\xe0\xd0\x2e\x28\xc3\x12\x2c\x93\x31\xcf\xcd\x46\xdb\x5e\xbb"
- "\x42\x82\xc1\xce\x20\xb0\x41\x0f\xe9\xe2\xb7\x65\x0c\x71\xbf\xd1"
- "\x22\x46\x9d\x6c\xb3\x6f\x91\x6c\xbb\x08\xb6\x5d\xe8\xb0\x0d\xd3"
- "\xc2\xf2\xf1\xf4\xdc\x36\x7a\xed\x10\x6c\x9b\xdf\x6a\x52\xfb\x46"
- "\xe1\x33\xdc\xa6\xd5\x89\xdd\xc4\xea\xa7\x3b\x3c\xe1\x25\xfb\x2d"
- "\x32\x98\x6a\xf7\x07\xce\x7a\xf9\x2b\x8a\x6b\x88\x2f\xbf\x45\x82"
- "\xab\xa1\x5d\x1f\xb7\x9e\x27\x74\xe0\xfe\xc0\x23\xfa\xc6\x6e\xa6"
- "\x75\xd4\xe3\xfb\x6f\x9b\x32\x69\x4d\x5b\x10\xae\x7f\x2d\x2f\xcf"
- "\x16\x68\x6a\x6b\xd0\x0c\xd3\xd1\x93\xad\x24\x3e\x15\x9f\x13\xd3"
- "\x54\xdd\xd3\xc4\xbb\x5e\x5d\x63\x4c\xff\x02\x9f\x69\x1d\xcd\x71"
- "\x7e\xa6\x75\x74\x2f\x51\x57\x19\x88\xfa\xd8\x06\xa2\xae\xd6\x12"
- "\x90\x73\x71\x51\xd1\x7f\x1a\x42\xd2\x6c\xf4\x5b\x9a\x17\xa4\xcf"
- "\x12\xa8\x35\x7a\x84\xca\x64\x5c\x81\xcf\x78\xaa\x7e\x01\xe5\xf7"
- "\x1d\xf4\xab\x1a\xbc\x46\x7d\x49\xc9\xe4\xf6\x73\xea\xaa\x18\x8d"
- "\xa5\x6f\x94\xcd\x7f\xb9\xc9\x46\x0d\xa4\x4d\xb7\x29\xa2\x25\x2f"
- "\x25\xa6\x0d\xd7\xe7\x9e\x41\x0e\xfa\xec\x31\x8d\x2a\x83\x50\xa8"
- "\x7f\x4a\x03\xf1\x39\xa7\xa1\x10\x1c\xd6\x25\xab\x47\xbf\xd8\x35"
- "\x58\xdf\xd8\x16\x4a\xb8\xbf\x16\xdb\x43\xb6\xd4\x6e\xcc\xea\x91"
- "\x09\x76\x81\x10\x3b\xc4\x4f\x3f\x43\x06\xe3\xbe\xb8\x45\x20\x17"
- "\x6f\xf7\xc6\x76\x6c\x30\x3e\x7d\x82\x9c\x4d\x22\x42\xfa\xf7\x64"
- "\x00\x60\x82\xb5\x47\x07\xb4\xc7\xe8\x3a\x8d\x15\x78\xc5\x91\x76"
- "\x99\x68\x90\xa7\x70\x8f\x99\xea\x46\x13\x71\x5c\xd4\xfb\x6e\x5f"
- "\x42\xfc\x6d\x17\x13\xfd\xcc\x17\x13\x6f\x7f\xdd\x41\xfc\x7d\x93"
- "\x88\xb6\x68\x09\x60\x71\x29\xb4\xcf\x0b\xd0\x3e\x1b\x79\xfb\x94"
- "\xf1\x47\x37\x7d\x5f\x87\xbf\xfd\x67\x6d\x73\x8b\xd4\x36\x57\x02"
- "\xfe\x56\x74\xe0\xcf\xb6\x54\x2f\x14\x09\x94\x80\x8d\x50\xee\x9f"
- "\x66\x94\xa4\xf5\xf5\xc6\x35\x4a\x7a\xef\xac\x1a\xe0\x7c\xc8\x2b"
- "\xb5\xed\x86\xba\xf0\x1a\x21\xe8\x68\xfe\x72\xd3\xd1\x98\x06\xd2"
- "\xb1\x6e\x52\x73\xa8\x75\xf8\x0c\x93\xee\xbf\xe8\xc5\x7a\x75\x55"
- "\x14\xf8\x7b\xeb\x9e\xbc\x4f\x0b\xf5\x78\x88\xaf\xb3\xd4\x18\x71"
- "\xcd\xd4\xa4\xae\x1a\x0c\xba\x08\xbe\x3b\xf0\x19\x7b\x2e\x77\x0c"
- "\xd7\x5e\x88\x1d\xca\xdc\xe6\x3f\x2c\xd5\xe1\x9f\x92\x61\x7c\xbe"
- "\x95\xf1\x55\x1b\xd4\xc1\xd9\x45\x44\x88\x6f\x84\xb2\xb1\x43\xd9"
- "\x34\xeb\x7d\x80\xb7\x62\x90\xb7\x68\xce\xaf\xaa\xd6\x98\xa8\x23"
- "\x7a\x9e\x9a\x42\xb9\x78\xe3\x1a\x79\x5c\x12\xa1\x6b\xcf\x43\x19"
- "\x59\x6a\x09\xe4\xcd\x17\xb8\xcd\xaf\x68\x05\xf1\xdf\x0e\xe5\x33"
- "\xa0\x11\xc6\x34\xb9\x1f\x98\xde\x4a\xab\xf4\xb2\x03\xce\x91\xc7"
- "\x34\xeb\x54\xfd\xa0\xae\x7c\x37\x63\xbb\x85\x76\xac\x59\xc7\x78"
- "\x95\xd5\xad\x6d\xa5\x7e\x68\xdb\x4a\xbd\x0e\xdc\x10\x99\xeb\x64"
- "\x9e\xa1\x59\x9f\x36\x20\xcf\x55\xa7\x9a\x88\x0d\xca\xd2\x17\xfb"
- "\xc4\x95\xfa\xc1\xac\x4c\x9f\x83\x32\x5d\x40\xbc\xc7\x5a\x89\x0a"
- "\xec\xd2\x82\xcd\xe4\x58\x62\x3d\x72\x6b\xa0\x1d\xda\x11\x96\x33"
- "\xe8\x14\x28\x60\xcd\x91\x37\x2c\x75\xe6\x42\x1d\x39\xa2\x3f\x45"
- "\xf0\xfb\xb2\xe9\x2d\xf4\x6b\x7c\x2e\x58\x9d\x6a\x23\x34\x60\xb9"
- "\x89\xb2\x35\xd6\x2a\xdd\xd1\x18\x2b\xf1\x8c\xe9\xea\x7e\x1d\x98"
- "\xae\xee\xd7\x81\xe9\x6a\xb6\x07\xbb\x12\xd7\x2d\x3b\x00\xd7\xfe"
- "\x4a\x5c\x1f\xbf\xe7\x86\xe2\x7a\x56\xf7\x71\xfd\xfa\x05\x05\xae"
- "\xd3\xfe\x3d\xb8\xfe\xcc\xc0\x70\xad\x6e\x1b\xce\xf0\x1a\x54\x6d"
- "\x7b\x1b\xc6\xbf\xc7\x2d\x32\x6e\x3f\xfd\x1f\xc4\x6d\x4d\xd8\x0f"
- "\x15\xb7\x2d\xcd\x7a\x1d\xb8\x5e\xc7\x2d\xe8\xec\x32\x6e\x3f\x33"
- "\xb4\x12\xb9\xfc\x10\xbf\x34\x67\x7f\xa0\x2e\x9d\x4c\x87\x72\x33"
- "\x6a\xd6\x0d\x21\xc7\x78\x19\x1a\x75\x4f\x52\x07\x70\x04\xfb\xd6"
- "\x48\x6b\x26\xa5\x0e\xff\xa5\x09\xe9\x9f\x13\xad\x23\x6f\x94\xb9"
- "\xda\xf6\x26\xd1\x24\x11\x11\x9f\xc7\xd2\x81\x27\x4a\x61\x1e\xce"
- "\x9e\xd5\x3a\xb6\xec\xd7\xe3\xf3\x4c\x7c\x86\x62\xcf\x4f\x4f\x70"
- "\x6c\x79\xdd\xec\x18\x78\x82\xd0\x2d\x27\x22\xf0\x19\x6e\x73\x56"
- "\x8d\x51\x7e\x86\xef\x76\x6c\xe4\x9f\x9e\x00\xed\x05\xe6\x54\x27"
- "\xa6\xc0\x59\x38\xab\xfe\xfc\x29\x38\xab\xe1\xcc\xf6\x31\xee\x5e"
- "\x3f\x57\xc3\xf7\x5a\xca\x5b\x6e\x91\x78\xf0\x32\x6b\x83\x23\xc9"
- "\x80\x73\xd2\x75\x73\xd6\xe7\x31\xf2\x3b\x01\xed\xf2\x1d\xe5\xd1"
- "\x88\x69\x43\x99\x88\xfc\x3d\x05\x7e\x8f\xef\x00\x49\xfa\xd8\xbd"
- "\x23\x28\xae\xd6\x98\x56\x4f\x1a\xd5\x9f\x1f\xa8\x86\xbe\xdf\x51"
- "\xb0\xdc\x82\xcf\xdc\x10\xf7\x72\xba\xbe\x50\xdf\xc6\x55\x4c\x86"
- "\x7d\x8f\xd8\x91\xb7\xc8\x48\x0b\x86\x99\x71\x0e\xd9\x4c\x13\x1f"
- "\x90\xce\xd3\x10\xdb\x7c\xbd\xe5\x44\x3f\x0a\xe5\x87\xfb\xc2\xb7"
- "\xbf\x17\x85\xfb\xb5\x67\x88\xba\x43\x6b\x78\x7f\x2b\xdb\x8b\x7b"
- "\xba\xe3\x7b\x47\xf7\x65\x90\x8c\x66\x37\x7b\xba\x77\xbc\x9f\xf4"
- "\xb9\xc5\x91\xbf\xc8\xd8\x9c\x75\x22\x12\xc6\x00\x33\x94\x79\x76"
- "\x57\x17\x26\xf5\x89\x04\x4f\x61\xdd\xab\x87\x13\x6b\x3c\xe9\x79"
- "\x44\x6f\xa7\xdd\xd4\x55\xe9\x71\x5c\x1d\xf4\x78\x52\x74\xa9\xdd"
- "\xe8\x68\x33\x68\x8e\xac\x39\xdf\xcd\x31\xd1\x5f\x74\x9e\xf4\xda"
- "\xf3\x96\x66\xd8\xee\x05\xdd\x23\x86\x10\xfb\x52\xc3\xa3\xf8\x0c"
- "\x04\xc7\x7a\x6b\x17\xf2\x77\xd9\xaa\x4a\x6d\x04\xc7\x7d\x7f\x5a"
- "\x52\x29\xb4\xb6\x19\x88\xaf\x99\x68\x67\x59\xd2\x69\xf6\x05\x12"
- "\x44\x57\x1a\x34\x9b\x2f\x90\xf0\xb6\xa6\xc0\xfe\xaf\x26\x13\xb1"
- "\x15\x38\xb9\x75\x59\xa2\x06\xdf\x9b\xfb\xf0\x9c\x51\xa8\xb6\x95"
- "\xe3\x38\x33\x08\xfb\x01\xb4\xdd\xde\x64\xf0\xdd\x78\x09\x9f\x13"
- "\x5f\x26\xc6\x67\x7e\x0f\xfd\xc0\xc9\xd1\x5e\x6b\x81\xfb\x80\xbb"
- "\x58\x7f\xd0\x83\xbe\xa0\x15\xfa\x82\x99\x06\x6a\x3d\x5e\x7b\x02"
- "\x9f\x5d\x6b\xd3\x97\x93\x01\xa8\x1f\x9f\x35\xb3\xfe\xe1\x09\xe8"
- "\x1f\xe0\x1e\xe6\x12\xed\xfd\x83\x6e\x16\xe9\xd4\x3f\xe0\x3c\xe4"
- "\x78\x5d\x03\x01\x2c\xf7\x9d\x65\xd1\x58\xd3\x2c\xd4\x81\x73\x92"
- "\x6a\xdb\x79\xfc\xbe\x91\xaf\xdc\x57\x60\x3f\xd1\x2a\xf5\x13\x45"
- "\x52\x3f\xf1\xdb\x5e\xe8\x27\x7e\x8b\xfd\xc4\x29\x22\xbc\x8e\x7d"
- "\x04\xf4\x0f\xff\xfb\x4f\xb3\xd0\x06\x7d\x42\xf7\xea\xf9\x94\xb7"
- "\x47\xfc\x14\x2c\x3f\xec\x80\xbe\x18\xeb\x79\x35\xd4\x2f\xd6\x73"
- "\xb5\x1e\xea\xb6\xb6\x6f\x54\x0b\xf8\xdb\x0a\xe6\x84\x94\x9e\x35"
- "\x0b\x34\x2f\x21\xa6\x05\xf0\xb0\xea\x32\x11\x6c\xfe\x4b\x33\xde"
- "\x7c\x32\x47\xc0\x79\xab\x23\x7f\x4e\x0a\x9f\x23\xff\x6d\x2d\xae"
- "\xd1\x68\x1a\x88\x16\xd7\x4f\xed\xd4\xa0\x71\x7c\x67\x18\xe0\x78"
- "\x21\xd0\xbb\xed\xbb\xc0\xfe\x9b\x9e\x27\xa2\xf9\x85\x44\x4d\xfa"
- "\x53\x44\xfb\xd1\x5f\x73\x84\xe3\x16\x68\xdb\x7d\xbe\x3e\x40\x41"
- "\x7f\x49\x3d\x09\x2b\x79\x86\x84\x16\x9f\x25\xba\xe2\x05\x24\x78"
- "\xfb\x59\xc0\xd0\x0b\x06\xdf\x36\x86\x8f\x16\x23\x7b\x2f\x60\x01"
- "\x89\xa0\x83\xe2\x43\xe0\x1c\x96\xb3\x00\xe6\x33\x83\xe6\x84\xd0"
- "\x80\xa5\x19\x0e\x90\xdb\x0c\x73\x37\x18\xa3\x83\x0d\x7f\x9d\xef"
- "\x0e\x37\xdb\xbb\x39\x86\x98\x19\x03\xb8\xa9\x01\xdc\x7c\xef\x8c"
- "\x1b\x9c\xb7\x32\xec\xcc\xe4\xd8\xc1\x67\x7e\x25\xca\xf1\xc5\x33"
- "\x47\x7b\x8c\x9f\x42\x18\x3f\xb7\xb8\xe0\xa7\xf0\xc2\xf5\xe1\xa7"
- "\x0d\xf0\x53\x98\x09\xf8\x39\x46\x84\x6d\x8e\xeb\xc1\xcf\xdf\xd8"
- "\xb7\xe7\x70\x9d\x8f\xbf\xc3\x74\xea\x0d\xac\x67\xc0\xd5\xce\x27"
- "\xf4\x2a\xd2\x43\x5c\x95\x5d\x03\x57\x16\x8e\xab\x2f\x4e\x75\x1f"
- "\x57\xf5\xfe\x80\xab\xb2\xab\xe3\xea\xb2\x27\x5c\x95\x75\xc6\x55"
- "\xed\xc1\x9b\x8b\x2b\xf6\x3d\xd1\xff\x00\x5c\x7d\xb1\xc3\x19\x57"
- "\x7f\xb3\x73\x5c\xfd\xcd\xd6\x73\x5c\xc5\x5e\x83\xaf\x62\x25\xbe"
- "\xaa\x1b\xdd\x03\x5c\x2d\xa2\xa0\xff\xea\xb8\x3a\xef\x01\x57\xb1"
- "\x6e\xf8\xea\x1f\x01\x37\x17\x57\xec\x7b\xa7\xff\x01\xb8\xfa\x87"
- "\xd5\x19\x57\x7f\x7f\x82\xe3\xea\xef\xb3\xaf\x03\x57\xd7\xe0\xab"
- "\x58\x89\xaf\xfe\xf9\x72\x0f\x70\x55\x01\xb8\xba\x06\x5f\x7d\xe9"
- "\x09\x57\x6e\xf8\xea\xcb\xc5\x37\x17\x57\xec\x7b\xac\xff\x01\xb8"
- "\xfa\x67\x8c\x33\xae\xea\xde\xe4\xb8\xaa\xdb\xd5\x73\x5c\xc5\x5d"
- "\x83\xaf\xe2\x24\xbe\x32\x7d\xd9\x7d\x5c\x7d\x33\x98\x82\xfe\xab"
- "\xe3\xea\xa0\x07\x5c\xc5\xb9\xe1\xab\xaf\x8e\xdc\x5c\x5c\xb1\xef"
- "\xc5\xfe\x07\xe0\xca\x54\xea\x8c\xab\xaf\xbc\x38\xae\xbe\x12\xaf"
- "\x03\x57\xd7\xe0\xab\x38\x89\xaf\xbe\x99\xd8\x03\x5c\xa5\x00\xae"
- "\xae\xc1\x57\x6b\x3d\xe1\xca\x0d\x5f\xd5\xdf\x75\x73\x71\xc5\xbe"
- "\x67\xfb\x1f\x80\xab\x6f\x88\x33\xae\xbe\x8e\xe5\xb8\xfa\x7a\x4e"
- "\x97\x70\x65\x55\xe0\xaa\xae\x6f\x54\x6b\x3a\x9f\x0f\xfe\x69\x81"
- "\x84\xab\x3f\x3e\x9e\xb4\x7a\x39\x11\xde\x7c\x7a\x9b\xcb\x5c\xf0"
- "\xcc\x3a\x57\x4c\x01\x2e\x18\xa6\x6c\x2f\x00\xa6\xce\x71\x4c\xa5"
- "\x7d\x09\x98\xfa\xfb\x36\xa1\x3a\xf5\x3c\xe2\x84\x61\xa8\x70\x01"
- "\x60\x08\xe7\x85\x2a\x31\xb0\x3b\x73\xc0\x57\xcf\xc9\x58\x3a\xbd"
- "\xb0\x57\xb0\x34\x1b\xb0\x74\xd2\x15\x4b\x47\x3a\xb0\xf4\x0b\x0f"
- "\x73\xc0\x38\x0f\x58\x32\x5d\x1b\x4b\xdb\x71\x0d\x61\xe9\x0d\xc2"
- "\xd2\xe7\x1d\x6b\x08\xbb\x9e\x31\x0b\xb6\x80\xee\x62\xe9\xcc\x0c"
- "\x67\x2c\x7d\xb3\x87\x63\xe9\x9b\xb2\x9e\x63\x29\xb6\xcc\x33\x96"
- "\xe4\xf1\xd4\xb7\xc7\xae\x0f\x4b\x30\xb6\x72\xc2\xd2\xb5\xc7\x51"
- "\x1d\x58\x3a\xfb\xee\xcd\xc5\x92\xcb\x38\xea\x96\xc5\xd2\xb7\xdb"
- "\x9c\xb1\x74\x46\x9a\xf7\x9d\xf1\x38\xef\x73\x40\xdf\x85\xcf\x9c"
- "\xf0\xb7\xc1\xf6\x26\xc3\xa3\x76\xe8\xd3\xf0\x37\xc2\xf8\x9c\x62"
- "\xf7\x92\x1a\x01\xf1\x94\x75\x89\x04\x6d\x4e\x26\xe1\x1a\x2b\xc7"
- "\x8a\x0d\xb0\xb2\xe1\x12\x11\xdb\xda\x00\x27\xad\x44\x6c\x81\xf2"
- "\x6e\x69\x4b\xd4\x54\x25\x34\x90\x8f\x2e\xd4\x40\x5f\x56\x4e\x8a"
- "\x21\x4e\x9b\xb4\x0e\xe9\x58\x6d\xf0\xdd\xb8\x0a\xd7\x21\x8f\x11"
- "\xe3\xd3\xbf\x85\xfa\x6f\xb8\xee\xfa\x6f\x79\xc9\x53\xfd\x1f\x74"
- "\xaa\xfb\x42\x45\xbd\xb3\xdf\x15\xf4\xb0\x3f\x62\xcf\xa9\x96\xf0"
- "\xba\x97\xeb\xfd\xf5\x5e\xa8\xf7\xd7\xa5\x7a\xbf\xbe\xfe\xe8\x5f"
- "\x9e\xdf\x7f\x54\x70\x05\x7b\xa7\xc0\xca\x39\x42\xe6\x05\xe4\x08"
- "\x1c\xbf\xb4\xf8\xcf\x09\x75\xed\x6f\x90\x1f\x2e\xa8\xbf\xb3\x63"
- "\xdf\xe4\x71\x1c\x23\xf1\x44\xfa\x8b\x9c\x27\xa4\x71\x4c\x55\xef"
- "\xae\x3f\x9e\x3b\x73\xe3\xf8\xe2\xe0\xb5\xfb\x9e\xeb\x18\xc7\x20"
- "\x6e\x0a\x5d\x70\x73\x23\xf8\xa2\x67\xb8\xf9\xae\xd2\x99\x2f\xce"
- "\x0d\xe7\x7c\x71\x2e\xa8\x2b\x7d\xcf\x35\xf0\xb4\x57\x81\x27\x4b"
- "\x07\x9e\x2e\xcc\xc4\x35\xca\xee\xe1\xe9\xb4\xae\x77\xd7\x1d\xcf"
- "\x4f\xbc\xb9\x78\xea\xbd\x75\xc7\x1f\x36\x9e\x2e\x04\x3a\xe3\xa9"
- "\x71\x39\xc7\x53\x63\xca\xf5\xe3\x29\x56\xc1\x4f\xb1\x0a\x7e\x32"
- "\x17\xe1\xda\x64\x37\xf1\x94\xd2\xbb\xeb\x8d\x17\x5f\xbe\xb9\x78"
- "\xea\xbd\xf5\xc6\x1f\x36\x9e\xcc\x89\xce\x78\xba\x70\x84\xe3\xe9"
- "\x42\x45\x2f\xe0\x69\xaf\xeb\x98\x98\xe3\xe9\xd2\x79\x1c\x3f\x77"
- "\x13\x4f\x95\xbd\xbb\xce\xf8\xfd\xa9\x9b\x8b\xa7\xde\x5b\x67\xfc"
- "\x61\xe3\xe9\x52\xb9\x33\x9e\xbe\x0f\xe0\x78\xfa\xde\xff\xfa\xf1"
- "\x14\xa7\xe0\xa7\x38\x05\x3f\x5d\x9e\x86\x6b\x91\xdd\xc3\xd3\x99"
- "\x5e\x5e\x5f\xb4\x0c\xbf\xb9\x78\xea\xbd\xf5\xc5\x1f\x36\x9e\x2e"
- "\x7b\x3b\xe3\xa9\x69\x3e\xc7\x53\xd3\xbc\x5e\xc0\x93\x82\x9f\xe2"
- "\x14\xfc\xd4\xfc\x1a\xae\x41\x76\x13\x4f\x49\xbd\xbb\xae\x78\x65"
- "\xf9\xcd\xc5\x53\xef\xad\x2b\xfe\xb0\xf1\xd4\x6c\x70\xc6\xd3\xe5"
- "\x77\x39\x9e\x2e\xef\xed\xea\x5a\x90\xbc\x06\xa4\xc4\x93\xe7\xb9"
- "\x5d\xcb\xe7\xae\x73\xbb\xee\xad\x01\xc1\x3c\xaf\xc7\xeb\x89\xd6"
- "\x7d\xff\xbf\xae\x27\x22\x86\xe4\x75\xa0\x1f\xde\x1a\x50\x4b\xa1"
- "\x33\x86\xac\x2a\x8e\x21\x2b\xf1\x84\x21\x9b\xf2\x9d\xb4\x6f\x15"
- "\xef\xa4\x9d\x27\xc2\x9b\x4b\x8c\xc2\x71\xe9\x9d\x34\x7c\x1f\xed"
- "\xf8\xe9\x06\xb2\xf1\x0a\xd1\xfa\x26\x12\xed\xac\xa4\x74\x9a\x8d"
- "\x1c\xb2\xcc\xa0\x79\xf5\x2c\x09\x6f\x03\xcc\x64\x9d\x93\xde\x4b"
- "\x03\xdc\x7c\x56\x67\x25\x1f\x2e\xc1\xf7\xd2\xca\x48\x09\xc8\xd9"
- "\xf2\xf8\x7a\x10\xf2\x08\x7b\x27\x6d\x01\xbe\x93\xd6\x7a\xc8\xed"
- "\x3b\x69\x99\xdd\x7c\x27\x2d\x05\x70\x60\x01\x1c\x5c\x46\x0c\xbc"
- "\xeb\xf4\x2e\xda\xf6\x4c\xc5\x1a\xd0\x33\x1e\xd6\x80\x6a\xbb\xf6"
- "\x4c\xa2\xd7\xdf\x45\xbb\xa8\x78\x17\x4d\x5e\x03\x7a\x1a\xb8\xa3"
- "\xdb\xf5\xde\xe6\x71\xff\x03\xe4\x08\x3b\x70\xc2\x2c\x7c\xb7\xdc"
- "\xd2\xb1\x5e\xbc\x66\x21\xfe\xf6\x77\x4e\x88\x0d\xb8\x02\xdf\x1f"
- "\x7f\xeb\x99\x4a\xb6\xde\x57\x9d\x5a\x4b\x36\xb6\x12\xad\xc6\x2c"
- "\xf1\x42\xc0\x9c\x94\x36\xe0\x06\x3b\xf4\x4b\x50\xd7\x03\xda\x96"
- "\x01\x37\x5c\x02\x6e\x58\x06\xdc\x70\x19\xb8\xa1\xbe\x92\x71\x03"
- "\x7d\xe5\xeb\x03\xf8\x5d\xf0\x92\x73\x24\xb4\xe8\x1c\x09\x43\x0e"
- "\xb0\xe7\x2f\xcd\x68\x0b\x98\x33\xdb\x1c\x30\xc7\x00\x61\x89\x1c"
- "\x03\x2d\xc6\xcd\xc9\x84\x71\x3d\xd6\xbd\x6e\x01\xf2\x81\xed\xd3"
- "\xb6\x4c\x42\xae\x07\x07\x6d\xca\x35\x41\x25\x0e\x3c\x70\xc0\x75"
- "\x63\xc1\x65\x1d\x78\xfb\x75\x72\x00\x62\x61\xbb\xcc\x01\xd7\x85"
- "\x05\xbb\xc7\xdf\xff\x5c\x03\x0b\x65\x5d\xc0\x82\xa5\x6b\x58\xa8"
- "\xc7\x6f\xc4\xd7\xb8\xc1\xc2\x49\xc0\x42\x2d\x84\x35\x70\x2c\x5c"
- "\x76\x83\x05\xc7\xa9\x1b\x8f\x05\xe7\x35\x99\x5b\x17\x0b\x74\x57"
- "\xcf\xb0\x10\xdb\x05\x5e\x88\xed\x22\x2f\xd4\x2f\xc2\xef\x50\x77"
- "\xc6\x42\x2c\xf0\x42\x2c\xf0\x42\xac\xc4\x0b\xe7\x3b\x63\x41\x24"
- "\x5f\xdf\x78\x2c\x38\xaf\xa7\xdc\xb2\x58\x10\x55\x9e\xbf\x7f\x71"
- "\x75\x2c\x74\x81\x17\x62\xbb\xca\x0b\x15\xf8\xfd\x66\x37\x58\x00"
- "\x5e\x88\x05\x5e\x88\x95\x78\xe1\x4b\x37\x58\x10\xce\xdf\x78\x2c"
- "\x38\xaf\x85\xdc\xba\x58\x50\x7b\xdc\xff\xeb\xea\x58\x88\xeb\x02"
- "\x2f\xc4\x75\x91\x17\xbe\x19\x8c\xdf\x3d\xee\x8c\x85\x38\xe0\x85"
- "\x38\xe0\x85\x38\x89\x17\x0e\xba\xc1\x82\xd8\x72\xe3\xb1\xe0\xbc"
- "\x8e\x71\xeb\x62\xc1\xab\xa6\x87\x58\xe8\x02\x2f\xc4\x75\x91\x17"
- "\xbe\x49\xc1\xef\x05\xbb\xc1\x02\xf0\x42\x1c\xf0\x42\x9c\xc4\x0b"
- "\x6b\xdd\x60\xa1\xaf\xd7\x8d\xc7\x82\xf3\x1a\xc4\xad\x8b\x85\xbe"
- "\x75\x57\xc5\x02\xed\x8c\x05\x5c\x43\xc0\xf9\x23\x7e\x8f\x9b\x61"
- "\xe1\x79\xa3\xd0\x4a\x11\x0b\x95\x64\xd3\x2a\x05\x16\xf2\xf9\x3c"
- "\x42\xc6\xc1\x6b\x4a\x1c\xe0\xef\x97\x10\x07\x30\x7f\xb0\x41\xbd"
- "\xd3\x82\xf8\x10\xf6\xbe\x52\xfe\x9c\x44\x9c\x3f\xe0\x3a\x03\xce"
- "\x21\x3c\xce\x1f\xc4\x7e\xfd\x7a\x05\x03\x8b\x00\x03\x8d\xee\xe7"
- "\x91\xbd\x3e\x7f\xb8\x78\x83\x30\x00\x73\xc9\xdf\xa6\x5d\x0f\x06"
- "\xfa\x99\xba\x8f\x01\x18\x23\x74\x09\x03\x7c\x9c\x70\x75\x0c\xc4"
- "\xd6\x74\x60\x00\xc6\x0b\xf9\xb1\x0d\x38\x3e\xe0\x18\x88\xad\xf5"
- "\x3c\x3e\xb8\x6d\xc0\x8d\xc7\x40\x2f\x8f\x0f\x7e\xb0\x18\xb8\xed"
- "\xb4\xc7\xdf\x30\x22\x97\x03\xef\xcf\x1a\x31\x84\xd0\x17\x0c\x8f"
- "\x66\x9d\x23\x41\xaf\x3e\x4f\xc2\xf1\xbb\x31\x6f\xb6\x5a\x85\xb4"
- "\x24\xfa\x2d\xfe\xb6\xda\x06\xf9\xc0\xef\x85\x32\x7c\x5c\x0c\xf4"
- "\xae\x4e\x34\x93\x8d\x80\x85\x57\x21\x0f\xf8\xed\x7a\xdf\xa4\xbe"
- "\x51\xc7\x2d\x47\x49\x6b\x93\x81\x54\x25\x9c\x23\xd1\x7a\xda\x56"
- "\x5d\x67\xc4\xdf\x30\x8a\xc6\x15\x47\xf1\x77\xe2\xfd\xe3\x53\x89"
- "\x70\x41\xf4\x29\xc5\x35\xa5\xb1\xa9\x44\x5b\x78\x8e\xaf\x23\x6d"
- "\xbc\x40\xc8\x91\x54\x42\x78\xbd\x0f\xf0\xf2\x7a\xb1\x17\xd6\x90"
- "\xe6\x40\xbd\xd7\xc9\xf5\x7e\xc4\x79\x0d\x49\xe8\xc2\xef\x19\xbb"
- "\xb0\x76\x78\x43\x7e\xcf\x78\xb1\xf3\xef\x19\x7b\xb4\x76\x28\x0e"
- "\xa8\xbd\xea\x7b\x44\xd2\x38\x60\x75\x0a\x6b\xf7\xac\x5e\xdb\x80"
- "\xfb\xab\x53\xcb\xd9\xfb\xd1\xd8\xce\xb1\xcd\x23\x3e\xd2\x21\xbf"
- "\x88\x11\xc4\xc3\xac\xd2\xb6\xb6\x38\x0b\x11\x1c\x01\x73\x52\x10"
- "\x13\x8e\xa5\x81\xde\x9b\x21\x4f\xd5\x09\xf5\x50\xef\x97\x48\xf5"
- "\x69\xa9\xce\x57\xd5\x43\x5d\xfa\xe6\xd1\xa5\xfa\xfe\x63\x2c\x44"
- "\x9b\xfe\x05\xd1\xc6\xe3\x6f\x8e\xa1\x1f\xd8\x0e\x63\x82\x92\xe7"
- "\x49\x28\xf4\x07\x31\x6d\x12\x37\x38\xe4\x75\x25\xec\x23\x00\x13"
- "\xaf\x2e\x01\x4c\xa4\x00\x26\xe2\x10\x13\x9a\x3b\xbc\x96\xbb\x59"
- "\x5f\xee\x06\x26\xd8\xfa\xf2\x3c\xc0\xc4\xe9\x0e\x4c\xb4\xaf\x2b"
- "\x7b\xe8\x13\x8c\x4f\x5f\xc7\xbb\x85\x6e\xf8\xe0\xba\xd7\x95\x2f"
- "\x4a\xeb\xca\x0a\x3e\xe8\x19\x36\x34\x9e\xbf\x89\xe9\x19\x1b\x65"
- "\xd7\xc6\x46\xb3\x8c\x0d\xcb\xb5\xb1\xa1\x2d\xeb\x8c\x8d\x7a\x7f"
- "\x05\x36\x6a\x14\xd8\xe0\xeb\x4c\xf9\x73\x1a\x3a\x63\x63\xe0\xc4"
- "\x9b\x83\x0d\x97\xf7\x7e\x6e\x59\x6c\xf8\x69\xbb\x8f\x8d\xd8\x2e"
- "\xf0\xc6\x45\x09\x1b\xb1\x5d\xe0\x0d\xbf\x2a\x37\xd8\x58\xd4\x81"
- "\x8d\x58\x05\x6f\x48\xeb\x4e\xf9\xb1\x6e\x78\xe3\xf6\x5f\xdc\x1c"
- "\x6c\xb8\xbc\xc3\x73\xcb\x62\xc3\x3f\xb8\x07\xd8\xe8\x02\x6f\x7c"
- "\x25\x63\xa3\x0b\xbc\xe1\xdf\xe0\x06\x1b\x15\x0a\x6c\x28\x78\x43"
- "\x5a\x87\xc2\x31\x67\x27\x6c\x04\x2c\xbe\x39\xd8\x70\x79\x1f\xe7"
- "\x96\xc5\xc6\xa0\xa8\xee\x63\x23\xae\x0b\xbc\xf1\x91\x84\x8d\xb8"
- "\x2e\xf0\xc6\x4f\xc4\xce\xd8\xf8\x66\x70\x07\x36\xe2\x14\xbc\x21"
- "\xad\x4b\xe5\xc7\xb9\xe1\x8d\x9f\x6c\xbc\x39\xd8\x70\x79\xb7\xe6"
- "\x96\xc5\x46\xa0\xc7\xfd\xaf\xaf\x82\x8d\x2e\xf0\x46\xba\x8c\x8d"
- "\x2e\xf0\xc6\x1d\x3a\x37\xd8\x48\x51\x60\x43\xc1\x1b\xd2\x3a\x55"
- "\x7e\x9c\x1b\xde\xb8\xe3\x8d\x9b\x83\x0d\x97\xf7\x64\x6e\x59\x6c"
- "\xdc\x99\xd1\x15\x6c\xac\xb1\xb8\x99\xa7\x9c\xe6\xd8\x68\x03\x19"
- "\x25\x2e\x94\x73\x13\xc8\x9f\x18\x0d\x73\x16\xc4\x44\xec\x1a\x22"
- "\x30\x5c\x58\x94\xb8\xf8\x69\x18\xe2\x62\x74\x22\xe0\xe2\x8c\x84"
- "\x0b\x79\x5e\xc2\xbe\xbd\xc2\xe7\x26\xf2\x9a\x95\x3c\x3f\xd9\x84"
- "\x73\xd6\x44\x19\x13\x3f\xdd\xe7\xb5\xb0\x17\x30\xe1\xf4\xde\x83"
- "\x02\x13\x4f\x79\x98\x9f\x3c\xd9\x73\x4c\xfc\x16\xe6\xae\x6d\xbd"
- "\xfd\xdb\x27\x19\x13\x5f\x5c\x2f\x26\x06\x5f\xf5\xfd\x07\xf7\x98"
- "\x90\xc6\x19\x1e\x31\xd1\x31\xb6\xe0\x98\xf8\xea\x2a\x98\xb8\x6b"
- "\x46\x67\x4c\x48\xe3\x0a\xf6\x1d\x02\x3e\xb6\x90\xd7\xb0\xe4\xf1"
- "\x85\x33\x26\xee\x3a\x76\x73\x30\xe1\x32\xbe\xb8\x65\x31\x31\xa4"
- "\xd4\x13\x26\x72\x04\x47\x19\xb8\x72\x70\x46\x70\x95\x76\x81\x3c"
- "\x52\x24\x38\xd8\x73\x10\xa9\xcd\xb8\x86\xf7\xa1\xaf\x8c\x3e\x89"
- "\x32\x74\x9d\xc8\xf6\x92\x96\x75\xd8\xfb\x13\xfc\x1e\xa2\x51\xa3"
- "\x4a\xc0\x3a\x41\xd9\xbe\xb2\x2e\xcd\x3a\x12\x01\xf9\xe7\x72\x02"
- "\xc9\xe0\x72\x11\x7d\x50\x8e\x66\x9d\x58\x03\x7e\xde\x92\x4e\xb6"
- "\x07\x85\x5d\x10\x50\x97\x6b\xda\xfd\x24\x19\x9d\x3d\x93\xe8\x94"
- "\x69\x83\x2e\x4c\x53\x96\xeb\x8f\x72\xf6\x3e\x42\x9d\x5d\x25\x06"
- "\x29\xe5\xe8\x43\x44\x29\x77\x9b\xa4\x4f\xef\x94\x8f\xa1\x84\x68"
- "\x54\x3a\x9e\x97\x54\x41\xce\x8b\x0f\xd3\xe9\x5b\x73\x12\x74\x06"
- "\x3b\xe9\xec\x43\xc8\x00\x90\x47\xbd\x03\x12\x99\xdd\x28\x3f\x80"
- "\xf6\x39\x6b\x64\xfa\x55\x62\x88\x43\x20\x21\x3c\x5f\x44\x2c\x6a"
- "\xb7\x59\x47\x72\x9c\xd3\xf0\x95\xcb\x4b\x29\x87\x32\x54\x68\x97"
- "\xd1\xf0\xbc\x9d\xa9\x00\x3b\xc2\x94\x76\x70\x39\x32\x4e\x92\xd3"
- "\x42\xbe\xc2\xdb\xeb\x32\x2f\x48\x2f\xcb\x01\x7e\xef\x80\xba\x30"
- "\x56\x43\x7b\x93\xca\x61\x20\xcd\xfa\x8b\x56\x2a\x8b\x08\xa5\xce"
- "\x01\x2a\x95\xa9\x48\x2a\x2f\x47\xd6\x89\x0a\x90\xf5\x73\xac\x13"
- "\x23\xdb\xf5\x66\x6a\x89\x5c\xaf\x34\xd3\x76\x3b\xd3\xdb\x00\xed"
- "\x4c\x50\xe9\xa4\x72\xb8\x1d\x65\x21\x4e\x14\xcf\x97\xb6\xbd\x5e"
- "\xed\x82\x88\x61\x46\x85\xac\x3f\x2f\xe3\x6f\x12\x20\x6f\x33\x3a"
- "\xcb\x7b\xbb\xca\x07\x70\xf9\x53\x31\x20\x1f\xd3\x59\x5e\xeb\x2a"
- "\x3f\x88\xcb\xff\xad\x14\xe4\x67\x77\x96\xb7\xf9\xb9\xc8\xff\x84"
- "\xcb\xff\x9d\x80\xbc\xa1\xb3\xbc\xce\x55\x3e\x90\xcb\x9f\xd9\x05"
- "\xf2\x73\x3a\xcb\x47\xb8\xca\xdf\xc1\xe5\xeb\x0c\x20\x9f\xd0\x59"
- "\x3e\xc3\x55\xfe\x4e\x2e\xff\xcf\x32\x90\x9f\xe7\x2a\x5f\xc2\x64"
- "\xc9\x50\x49\xf6\xa7\x5c\xf6\x6b\x6f\x90\x4d\x74\x93\x57\xb5\xa4"
- "\x3b\x44\x92\x1f\xcc\xe5\xff\x92\x08\xf2\x8b\xdc\xd4\x95\xab\xfc"
- "\x5d\x5c\xbe\xb9\x1c\xe4\x93\xdc\xd4\x95\xab\xfc\x10\x2e\xff\xaf"
- "\x5a\x90\x4f\x71\x53\x57\xae\xf2\x77\x73\xf9\x46\x3d\xc8\xa7\xba"
- "\x29\x7b\x67\x79\xdf\x0b\xa9\x20\xb7\xa6\x28\x53\x6e\x3f\x4e\xe5"
- "\xee\xaa\xfb\x1e\xae\xdb\x5c\x09\x71\x32\xdc\x94\xbb\xab\xfc\x50"
- "\x2e\xdf\x14\x08\xf2\xeb\x3b\xcb\x13\x15\x97\x27\xe3\x25\xf9\x61"
- "\x5c\xfe\x32\x96\xe5\x06\x37\x65\x8f\xe1\x46\xa9\x9d\x06\x71\xd9"
- "\x6f\xad\x20\xbb\xd9\x4d\xb9\x2b\x65\x87\x33\x59\x3f\xef\x20\x90"
- "\xcd\x71\x53\xe6\x4a\xd9\x7b\xb9\xde\x36\xe4\xc0\x3c\x37\xe5\xad"
- "\x94\xbd\x8f\xcb\xda\x1b\x40\x76\x9b\x1b\x7b\x87\x2a\x64\xf5\x5c"
- "\x96\x5a\x40\xb6\xd0\x4d\xbd\x28\x65\x47\x70\x7b\xfb\x63\x1d\xee"
- "\x70\x53\x2f\x4a\xd9\x91\x5c\x56\xc0\xb6\xb6\xd3\x4d\x9d\x28\x65"
- "\x47\x51\x3f\xd1\x47\xe2\xd6\x52\x57\x59\xc0\x80\x11\x78\xa8\x12"
- "\xb8\x30\x98\xe6\xf6\x81\xbe\x94\xf1\x1a\x7b\xff\x4b\x96\xa1\x82"
- "\x6d\x82\xa2\x1f\x18\x4d\xb3\x5a\x6c\x12\xff\x95\xb9\xea\xa3\x82"
- "\xa8\x94\x1d\x43\x73\xef\xac\x94\x64\xf7\x76\x96\xf5\x56\xca\x8e"
- "\xa5\xb9\xbe\x3a\x49\xb6\xbc\xb3\xac\xb6\x5d\x96\xe6\x6a\xc3\x41"
- "\xe6\x40\xb1\xc4\xab\x0a\x3b\xc7\x2b\xf4\x8d\xa3\xb9\x7e\x06\x49"
- "\x9f\xb1\xb3\x3e\x9d\x52\x76\x3c\xcd\x1d\x5c\x27\xc9\x56\x74\x96"
- "\x8d\x50\xca\x4e\xa0\xb9\xfe\x29\x92\x6c\x65\x67\xd9\x0c\xa5\x6c"
- "\x28\xcd\x1d\x94\x23\xc9\x56\xb9\xca\x16\xf3\x3e\x48\x90\xea\x69"
- "\x22\xcd\x0d\xdc\x25\xc9\xd6\x38\xf5\xb1\x82\x8a\xb5\xb1\x62\x2e"
- "\x37\x89\xfa\xf9\x04\x4b\xf5\x79\xd2\xa9\x6f\xcd\x54\xf9\x61\x9f"
- "\x52\x84\xf5\xf9\xca\x24\xfc\xfe\xf2\x64\x49\x5f\xad\x6b\xdf\x27"
- "\xd9\x17\x06\x61\x75\x72\xff\x04\xfd\x8e\xc9\xdd\xb8\x27\x69\x24"
- "\xb9\xed\x9c\xa8\x0f\xe1\x7d\xa3\xb4\x4f\xb1\x38\x92\xdd\x3b\x76"
- "\xce\xd0\x46\x5b\xa8\x4d\xe9\x97\x2d\xd0\x9a\xb1\x16\x22\xe2\x37"
- "\xbd\x69\xc0\xf2\x72\x13\xf8\x9b\x87\xcf\x30\x35\xe7\xea\xc3\x4d"
- "\x2a\x13\xdb\x13\x0f\xae\xa3\x4c\xe4\x35\xb6\x87\x5f\x76\x26\xee"
- "\x93\x18\xa1\xb2\x17\x0c\x33\xe3\xbe\x8a\x25\x70\x9f\x05\x8e\xed"
- "\x61\x08\x63\x4c\xfa\x0a\x89\x30\xae\xb0\x91\xb3\xa9\x44\x60\x7b"
- "\x76\x8b\xfa\x7c\xba\x34\x31\x1c\x6c\x89\x80\x74\xe7\xd5\xc3\x3d"
- "\xb3\x05\xf7\x30\xcd\x0b\xf2\x31\x26\xb7\xa2\xcc\xbf\xcc\x01\xe9"
- "\x11\xf4\xa5\x5f\xff\x2b\x29\x8d\xdc\x0d\xf6\x37\x30\x99\xbc\x45"
- "\x46\x47\x40\x90\x0f\xfb\xde\xed\xc5\xc4\x07\xd8\xb7\x6e\xc5\x91"
- "\x2a\xfc\xc6\x2d\x7e\xeb\x56\xfe\xce\x2d\x4f\x67\x04\xee\x93\xa7"
- "\xa2\x3b\x36\x99\xd8\x77\x74\xc5\x11\xd3\x58\xfe\x32\x69\x0d\x0d"
- "\x7a\xdc\xea\x68\x5d\x9f\x81\x7b\x6c\x1b\xd3\xce\x91\x7a\x29\x0c"
- "\xf5\x73\x9d\x23\x0e\xba\xea\xc4\x78\xe6\x7b\x36\x99\xe8\x1b\x8f"
- "\x5b\xed\x39\x86\x10\x87\xd6\x10\x4c\x73\x9e\xf5\xae\x5e\x64\x22"
- "\x2c\xaf\xe2\xc8\x71\xd4\xf7\xa9\x6a\x47\x8e\xc1\x9f\xe6\x3c\x63"
- "\xad\xb6\xb4\x32\x7f\xd0\xbd\x01\xc7\xcd\x4d\xda\xf8\x50\x9a\x13"
- "\x1f\x66\xbc\xb3\x95\x9c\x16\x47\x30\x9e\x42\x7f\xba\xe5\x59\x6f"
- "\x2c\x63\xc7\x96\x67\xac\xea\x40\x22\x36\x0d\x8c\x0f\x6d\xce\x1d"
- "\x51\x6a\x92\xf6\xb3\x93\xd3\x42\xbd\x26\x49\x57\x97\xbf\xd9\x2b"
- "\x8e\x08\x61\xdf\xec\xcd\x1d\x61\x35\xa9\x46\xb3\xef\x26\x9b\xe4"
- "\xb2\xec\xb2\x0e\x7d\x1d\xea\x70\xbf\xaf\x09\xd1\xd0\xfc\x20\x7d"
- "\x73\xee\x48\x03\x8c\xbd\x1b\x38\x36\x46\xce\x33\xa9\x74\x3e\xd2"
- "\x75\x92\x49\x35\x2c\x45\xba\x5e\x63\x52\x9d\x14\xa5\xeb\x0d\xf2"
- "\x77\x93\xdd\x7f\xc7\x79\x98\x0d\xb0\xe0\xef\xd8\x6e\xf0\xc6\x79"
- "\x03\xb3\x27\x60\x98\x4d\x37\x84\xa8\xce\x8a\xa3\x7c\x20\x4d\x7f"
- "\xa9\xee\xcf\xc0\x59\x23\x9d\xcd\xd2\x99\xa2\x0c\xc3\xbb\xff\x0a"
- "\x2b\xd4\x91\x5c\x3f\x6c\x1f\x68\x86\x2b\xc0\x1e\x1d\xf8\x2c\x61"
- "\x7a\xf3\xd3\x9d\xf6\xbe\x09\x19\x37\x7e\x42\xe8\xc4\x49\x93\xc3"
- "\xa6\xcc\x7d\xe6\xd9\x79\xf3\x17\x3c\x97\xb8\xf0\xf9\x17\x16\x2d"
- "\x5e\xb2\x34\xe9\x37\xc9\xcb\x52\x96\xaf\x58\x99\xfa\xe2\x2a\xd0"
- "\xd3\xbe\xff\x37\xdd\x1e\xa9\xb2\x08\x04\xd2\x78\x08\xd2\x18\xc5"
- "\xf6\x79\x42\x3f\x8e\xb9\x51\x73\x44\x9d\xfb\xf9\x48\x75\x20\xcc"
- "\x01\x61\xfc\xdd\x28\x8e\xda\x87\xfb\x36\x02\xfe\x55\xd5\x85\x8f"
- "\x1a\x71\xcf\xea\xd3\xe2\xa8\x5d\xc7\xcd\x8f\x1a\x71\x8f\xf5\xc3"
- "\x81\x0d\x24\x68\x28\x51\x9d\x13\x47\x6d\xc3\xf0\x92\x7b\x09\xa9"
- "\x80\xb8\xee\x74\x0e\xd5\x92\xc0\xad\x83\xa8\x39\x6f\x10\x6d\x44"
- "\xfd\x79\x05\xb4\xc1\xbc\x3a\x91\x64\xc1\x3d\xb4\x09\xed\x59\x31"
- "\x78\xf1\x61\x98\x75\x38\x32\xc9\xe0\xe2\x02\x7a\x7a\xfd\x20\x7a"
- "\xfa\xa5\x02\xda\x58\x32\x88\x9a\x82\xf2\x88\x4f\x73\x6e\xb0\xce"
- "\x24\x8e\x62\x7b\x3d\x66\x43\xb8\xc3\x6f\x54\x60\x36\x84\x8d\xb5"
- "\x11\x75\x09\xdc\x83\x9f\xe5\xb0\x8e\xdb\xbd\xfb\x92\xd5\x0b\xf4"
- "\x89\xb4\x6d\x91\x2a\x0b\xd2\xe1\xf5\x11\xbc\xa5\x02\x46\x30\x90"
- "\x9e\xb9\xda\x5a\x4f\x4c\x62\x70\x0e\xee\x29\x0b\xe9\x69\xaa\xb7"
- "\x35\x12\xd4\xf7\x56\xb2\xd5\x6b\xd9\x9d\xd4\x06\xb2\x49\x8e\xd5"
- "\x8b\x54\x20\x33\x03\x74\x5b\x94\xf9\xd1\x2f\x58\x9c\xa2\x5b\xb2"
- "\x7c\xd1\xa2\x11\xfd\x89\x9e\x9d\x89\x72\xbf\xf5\x14\xfc\x5e\xfb"
- "\xd6\x02\x5a\x01\xf9\x34\x42\x7e\x2b\x8f\xc1\xcc\x07\xb0\x41\x20"
- "\x4f\x39\xa0\xf7\x0c\xf8\x1f\x80\xeb\x03\x60\x7b\x25\xdb\xbf\x59"
- "\x7c\x60\x20\xcd\x0d\x2e\x04\x3b\xb1\xaf\xd4\xe1\xf7\xdd\x9b\x56"
- "\xce\x56\x41\xbe\xf3\x40\xae\x52\x77\x27\x19\x7e\x56\x1c\xbd\x18"
- "\xec\xd8\x09\xd7\x28\x7f\x07\xd6\x23\xc8\x57\xf0\x7c\x3d\xa0\xc2"
- "\x7b\x28\x2b\x63\xd1\x20\xba\xb9\x39\x77\x74\x14\xee\x5b\xc1\xf6"
- "\xde\x84\x7b\x28\x97\x4a\x90\xcd\x69\x4a\x9f\xad\x82\xf9\xb3\xaa"
- "\xa4\x43\x67\x20\xda\x84\x76\xe0\x9c\xfc\x33\x18\xc9\x3a\xda\x0c"
- "\x64\xb4\x95\xa8\x3e\x3b\x4d\x48\x61\x01\xdd\x01\xae\x10\xdc\xb6"
- "\xa3\x10\xf6\x29\xb8\x4a\xf0\xaf\x82\xf3\x51\x38\x7f\x0a\x0e\xe6"
- "\xf4\x81\x68\xf7\xb2\x35\xb4\x61\xec\x36\x32\x0c\xf5\x03\xb6\x7e"
- "\x55\x2f\x4e\x4b\x44\xdb\x71\x5f\x1a\xea\x37\xba\xce\x69\x2f\x0d"
- "\x71\x6c\x0c\x81\x70\x38\xcf\xe3\x67\xa5\x1b\xbb\x0b\x5c\x15\xbf"
- "\x0e\xf1\x87\xeb\x70\xe9\x5a\x0f\x2e\xf4\xda\xce\x55\x9f\x27\x17"
- "\xb2\xa3\xeb\xb2\x5d\x72\x75\x5d\x93\x1b\x6f\x20\x62\x68\x19\xb8"
- "\x06\x67\xff\x50\x23\xf7\x9b\xb2\x99\xdf\x4f\xd9\x26\x9d\x2b\x88"
- "\x38\x15\xca\x69\x2a\xe8\xbf\x9f\x70\xbf\xfb\x7d\xe0\x3c\x1b\x5c"
- "\x82\x4b\xfa\xa8\xd3\x82\xf5\xd9\x06\x7d\x10\xd6\xa5\x49\x1c\xbd"
- "\x0b\xeb\x28\x9b\x63\x4b\x85\xbf\xcd\x03\xbf\x52\xc0\x56\x61\x07"
- "\x7e\xc6\x16\x39\xe3\x67\xec\x06\x17\xfc\xe4\x20\x17\x41\x5b\xb0"
- "\x94\x70\xbc\x1c\x68\x5a\x3d\x0f\xee\xc7\x6e\x06\x3d\x07\x70\xad"
- "\xe8\xac\x18\xc2\xea\x36\xfb\x1c\xcc\xc1\xc1\x1a\xe4\x97\x46\x71"
- "\xec\x97\x88\x59\x4c\x5b\x4a\x97\xdb\x02\xf6\x81\xdf\x0e\xb4\x6f"
- "\x29\xe8\x85\xfb\x9d\x20\xb7\xa3\x9a\x5c\x92\x6d\x63\x71\x36\x3d"
- "\x0f\x78\x94\xec\x45\x9d\x18\x8f\x76\xe4\xab\x14\xe3\x48\x69\x6f"
- "\x01\x7f\x9c\xdb\xe3\xef\xee\xd4\xd5\x36\x13\x41\x4c\xe2\xb9\xda"
- "\x16\x02\x6d\x29\x8a\x38\xf0\x5b\xf3\x81\x04\xf7\x36\xeb\x57\x2f"
- "\x86\xa4\x8c\x59\x43\x42\x50\x1f\xf2\xb7\x49\x0c\x09\x2b\xc1\xb6"
- "\xc8\x75\x6d\xc4\x7c\xa0\xfe\xa3\x30\x9b\xc2\x73\x31\xda\x03\xe1"
- "\x8a\x74\xf3\x70\xce\x9e\xbd\x8a\xe7\x15\xd2\xda\x09\xf1\xcb\x30"
- "\xef\x58\x9e\x10\x5e\x0e\x7a\x6a\x30\x0c\xf7\xa6\x94\xf2\xb3\x13"
- "\x7f\xef\x88\xe5\x81\xf2\xd5\x30\x7b\x61\xfb\x68\x88\xc1\xec\x5b"
- "\xfd\xa0\xbf\x0c\xeb\x83\x42\x1a\xa8\x23\xdd\x46\x6d\x14\xf8\xe8"
- "\x0f\xab\xac\x30\xf6\x19\xff\x98\x73\xfd\x8c\xd3\x2b\xeb\x07\xe2"
- "\x95\x41\xfc\x0a\x1c\x0f\x20\x9f\x40\x9a\x1a\x1c\xeb\x80\x5f\x8e"
- "\x23\x17\x74\xac\xb0\xb2\xf5\x2d\xd0\x33\x05\x6c\xc9\x41\x3d\x60"
- "\x4f\x85\xa4\x2b\x05\xbf\xb9\xaf\xac\x6b\x49\xdf\x4e\xac\x73\xd6"
- "\x9e\x57\xb1\x3c\x01\x77\x8d\xef\x57\xcc\xc3\xca\x41\xa6\x9c\xb6"
- "\x45\x11\xba\xda\xc0\xf7\xaa\xe6\x61\x7b\xd3\x5b\x58\xfd\x56\x70"
- "\x5e\x1b\x3f\x62\xd9\x5a\xda\xa0\xb0\xdb\x24\xef\x49\x25\xd9\xbd"
- "\x17\xd3\xa3\x2b\xe7\xb0\x3e\x14\xd3\xc0\xf8\x5c\xdf\x38\xe4\xc8"
- "\xbd\x72\x59\x8d\x01\x3b\x78\x79\x85\x98\xc1\x7f\x27\x62\x91\x95"
- "\x1b\xf0\x68\x53\x3a\x62\x71\xdc\x69\x88\x7f\x20\x0b\xef\x57\xb2"
- "\xfb\x54\xc6\xb1\x1d\xe1\xc1\x18\x8e\x6b\x22\xd9\x2f\x00\x96\x1c"
- "\x84\x0c\xf3\x27\x21\x96\x4c\x96\xb7\x5d\x96\xd5\x91\xaa\xc3\x36"
- "\x42\xd0\x4e\x28\xa3\xf2\xe6\xdc\xf1\x9b\xa1\xaf\x61\x7b\x00\x03"
- "\x5f\xef\xa5\x7f\x30\x10\xb4\x19\xf8\x4c\xb2\x6f\xbc\x5d\xaa\xfb"
- "\xbd\x98\x47\x2c\xcf\x31\x9c\xfb\x20\x2c\xf4\x77\x68\x7b\x47\xbe"
- "\xc7\xd7\x2a\xcb\x98\xe5\x1b\xea\x01\xeb\x0b\xeb\x45\xa1\x13\xb1"
- "\x9f\x03\xba\x76\xf1\x7b\x8e\x0d\x2c\xeb\x9c\x41\xb4\x0a\xe5\x3b"
- "\x64\x43\x07\x62\x58\x1a\xa4\x3d\x36\x89\xed\x8f\xad\xc2\x7d\xc5"
- "\x40\xef\x2e\xe3\x2a\x1b\x01\x1d\xe5\x58\xa6\x20\x37\x1f\xf1\x08"
- "\xf7\x55\x3c\xde\x84\x79\xd0\x9f\x07\x83\x0b\xef\x68\xff\xa1\x4f"
- "\x38\xe3\x6b\x82\x6b\xfb\xc7\xfa\xce\x71\xa4\x47\x11\x86\x87\x64"
- "\xa2\xbb\x20\x4e\xf8\x5e\xea\x3b\xa4\xba\x0e\x7d\xe4\x30\xb4\x17"
- "\x85\x8e\x2a\x97\xba\x2e\x67\x78\x5c\x39\x43\x85\x79\x86\xb8\xe5"
- "\x92\x1e\x96\x67\x86\xa7\x4c\x86\x81\x2a\xba\x12\xf2\xd9\x8e\x83"
- "\x09\x7a\xa9\x9e\xab\x5c\xca\x44\xe6\xae\x14\xdc\xe3\x18\x39\x09"
- "\xc6\xdd\x0f\x34\xb7\x75\xf0\x12\xd6\xbd\x83\xd5\xfd\x84\x9a\x12"
- "\xde\xdf\x4a\xbc\x35\x81\x87\x0f\x72\xc2\x30\xd8\x12\xea\xc5\xf0"
- "\x8b\xb6\xa4\xcf\x41\x5b\xca\x99\x1d\xe9\x3a\x02\x61\x6b\x30\x7d"
- "\x93\x18\xea\x2d\xb5\x57\x49\xd7\xf8\x3a\xd4\xf5\x12\x70\x15\xda"
- "\x04\x69\x27\x32\xfe\xfb\x19\x2b\x93\x2f\x25\xdb\x2b\xad\x99\x18"
- "\x77\x6c\x4d\x8b\xc0\xe2\x56\xc2\x75\xa4\x95\xef\x11\xd7\x1f\xe2"
- "\x97\xb2\xf7\x36\xc5\x29\xe1\xc8\xd1\xf8\x7b\x64\xb8\x1e\xae\x7b"
- "\x12\xb0\x7a\x8e\x88\xa0\xcf\x1b\x31\x2a\xe3\xa2\x51\x9c\x12\x80"
- "\xfb\xc7\x40\x59\xef\x82\x31\x52\x29\x96\x37\x62\x19\xc6\x48\x30"
- "\x36\x9f\x18\x29\xe3\x16\xd2\x29\xc4\xb2\xe7\xf5\x33\x71\x23\xe0"
- "\xb8\xbc\x03\x5b\x13\x37\x4a\xe5\x58\x0a\xe5\xe8\x0d\xe9\xf5\x93"
- "\xf2\x55\x0a\xf2\x30\x16\x0b\x6b\x91\x6c\xdf\x26\xc9\xbf\x21\xd7"
- "\x83\xd4\x56\xab\xb2\x90\x7f\x59\x1d\x4c\x0a\x97\xe2\xee\xe4\x69"
- "\x4d\x9a\x26\xcb\xe2\x18\x91\xed\xf7\x0c\x7e\xc8\x83\x63\xa1\xee"
- "\x19\xf7\xad\x6a\x65\x72\x12\x37\x56\xf0\x34\xc2\xce\x30\x1c\xc2"
- "\xb8\xa7\x03\x47\x93\xfc\x5d\xf8\x09\xb9\x38\xe7\xf8\x7a\xbe\x9f"
- "\x1e\x62\x09\x39\x15\xe7\x49\x60\x63\xa3\xd4\x7e\x24\x9b\x27\xad"
- "\x73\xc6\x4a\xd8\xe7\x80\x95\xd1\x0a\xdd\x49\xee\xfa\xb9\x12\xce"
- "\x81\x85\x52\xde\x0e\x49\x79\xdb\x25\xe5\xed\x90\x94\xb7\x52\x48"
- "\x03\xca\x2d\xec\x65\x45\x39\x42\xb9\x4d\xfe\x5e\x92\x2f\x47\x2e"
- "\xef\x68\xaf\x93\x47\xcb\x6d\xb9\x33\x5f\x4c\xfe\x1a\xdb\x43\x87"
- "\x5d\x93\xbd\x5d\xf8\xa2\xdc\x3d\x5f\x4c\xaa\x95\xf2\xbb\xc3\xa5"
- "\x6d\xec\x94\xc6\xbb\x97\xe5\x7a\x38\x6e\x91\xf6\x35\x04\x3f\xe4"
- "\x4f\x4c\x5b\xd9\x07\x15\xf3\x72\x95\xda\xf2\xe4\x63\x9d\xeb\x61"
- "\x72\xa1\xb2\x3d\x63\x5d\x23\x27\xa0\x0e\xac\x53\x36\xae\x04\x3f"
- "\x5e\xaf\x93\x53\x90\x1b\x94\x1c\x0d\xb2\x79\x0e\x8a\xed\x65\xf2"
- "\x0e\xe7\xb6\x38\xd9\x47\x6a\x8b\x52\xda\x61\xbf\x81\x3a\x0a\xe9"
- "\x48\x37\xcc\xdf\x25\x5d\xac\x9b\x0a\xb6\xff\x0c\xaf\xd3\x58\xb9"
- "\x4f\x43\x79\x88\x9b\x0a\x71\xa2\x5c\xfa\xc7\x1c\xb4\xcf\x24\x4e"
- "\x32\x32\xce\x2a\x60\x5c\x91\xda\xcc\xec\x09\x9b\x51\x22\xf5\x13"
- "\xe0\x17\x22\xf9\x05\x4a\x7d\x89\x8c\x9b\x83\x2e\x36\x95\xba\x1f"
- "\x1f\x4d\x32\xca\xe3\x23\xa6\x8b\x71\x51\xd8\x2e\x29\x7f\xe8\x37"
- "\x9a\xfb\x4d\x4a\x41\xbf\x2c\x5e\x0e\x79\x94\xf5\x57\x93\x02\xa5"
- "\xfe\x0a\xdb\x97\x60\x12\x27\x6e\xc0\x36\x86\xf7\x26\x71\x0a\x9b"
- "\x0b\x56\x67\xb4\xe2\x1c\x62\x1b\x84\x05\x21\x1f\x20\x5f\xe0\xfb"
- "\xc6\xec\x3c\x8b\x9d\x67\x22\xef\xe0\x38\x04\xc3\x41\xce\x1f\xb9"
- "\x08\xfc\xe7\xe2\xb7\x06\xe9\x77\xde\xa0\x77\x4a\xa4\x14\x77\x39"
- "\x1b\x2b\x7c\x17\xa5\x96\xfd\xe4\x78\xd0\x8e\x86\x63\x3c\x8c\x2f"
- "\xf3\x17\x72\x97\x0d\xb9\x89\xa7\xb7\x4f\xc2\x38\x9b\x37\xc8\xe3"
- "\xa2\x36\x41\x21\x8b\xfb\xb3\x31\x4e\x9b\x2a\x4a\x7c\x76\x19\xe3"
- "\xb2\xfa\x03\xae\x4c\x6b\xa1\x5f\x97\x24\x13\xb1\xf8\x12\xf2\x62"
- "\xb0\x85\xdb\x39\x35\x86\xe7\x63\xea\x1d\x2c\x1f\x9c\x53\x73\xb8"
- "\x2d\xc1\x96\xe2\x56\x16\x36\x11\xf3\x82\x61\xd9\x8a\x30\xdc\x6f"
- "\x11\xc2\xd8\xde\x7a\xae\xf1\x1c\x6d\x89\x9d\xe4\x4b\x5a\xd9\xbc"
- "\xcf\xbb\xb8\x40\xe6\xde\xa9\x35\xdc\xce\xa9\xaf\xc9\xbc\x0b\xe5"
- "\x32\x18\xb9\x97\x85\x2d\x90\x64\x66\x49\x67\xc6\xef\x53\x0f\xf2"
- "\x72\x0d\x14\xa4\xf2\x0e\x92\xf2\xf1\x39\x9b\x67\x7f\x67\x80\xb2"
- "\x9d\xba\x57\x2e\x5b\xe5\x35\xb6\x1f\x48\x5f\x8b\xf7\x0c\xf7\x6b"
- "\xd8\x1c\xb6\x10\x65\xd0\x26\xde\x47\x4c\xd9\xe5\x3a\xa6\x3e\x2b"
- "\x4e\x7b\x0c\xfb\x25\x3e\x56\x9d\x36\x42\x5a\x9b\x22\xc6\xe4\xdf"
- "\x43\xbf\x70\x7f\x8a\xcc\x31\xb4\x39\x8a\xe0\xbe\x4d\x67\xc5\xfb"
- "\x97\xa3\x1f\xee\xb9\xa5\x94\x41\x7e\xda\xdd\x6a\x92\x74\xde\x1f"
- "\x23\xf3\x06\x72\xc9\x71\x4b\xbd\x34\xa6\x0b\x47\xbc\xed\xe4\xbc"
- "\x11\xae\x72\x1e\x87\x85\xab\x9c\x39\x63\x5a\x80\x2b\x67\xc0\xb8"
- "\x79\x7d\x73\xee\xfd\x27\x9d\xc6\x01\xe0\x77\x75\xee\xb8\xbf\x14"
- "\xdb\x28\xee\xf7\xca\xf8\x89\xad\xb7\x85\x2f\x94\x6d\x46\xde\x6c"
- "\x5a\x2d\xaf\x5f\x4c\xf3\xc2\xb1\x9a\x73\x7a\xe1\x91\x4e\xdc\x89"
- "\xe9\xc9\xfa\x44\xc2\xda\x91\x31\x19\xd7\x5b\xc2\xfd\x25\x9e\xdf"
- "\xe1\xc4\x95\x52\x1f\x86\x3c\xe9\xdc\x57\x05\x5f\x76\xee\xab\xc2"
- "\xbf\xef\xcc\x91\xe1\xc6\xae\xf7\x55\xe1\xdb\x90\xb7\x64\x8e\x74"
- "\xe6\x82\xf0\x8a\x62\xa7\xb1\x6c\xf8\x0c\x79\x2c\xdb\xc1\xa3\xf7"
- "\xd7\x21\x47\x41\xfa\xe5\x3c\xed\x69\xe1\xd0\xef\x47\xc8\x69\x43"
- "\x78\xca\x71\x1d\x60\x33\x37\xb8\x14\xae\x75\xd2\x18\x90\xb5\xcd"
- "\x56\xdc\xdf\x4f\x9c\x9a\x08\xf8\xeb\x8f\x38\x33\x2e\xb9\x44\x4e"
- "\x77\xf4\x15\x15\x4d\x4b\xdb\xcb\xf7\x98\x72\x5c\x58\x54\x40\x37"
- "\x40\x3a\x3b\x95\x79\x7c\x0d\xfc\xb2\xa5\x35\x04\x56\xb6\x4c\xd7"
- "\xb4\xd4\x92\x02\xe7\xbc\xf1\x7c\x4c\xdb\x85\xf9\xc0\x39\x11\xa4"
- "\xbf\x08\xc7\x3d\xb8\xe7\x33\x8c\xa9\xcc\x25\xed\x98\x1f\x1b\xd9"
- "\x92\xa9\x1c\x5f\x8d\x9e\x81\x5c\x29\xcd\x3d\x2b\x61\xbc\x93\xa3"
- "\x5c\x8b\x99\xf9\x70\x8c\x2e\x29\x79\xe1\x92\x94\x05\xe3\x75\x0b"
- "\x97\x2c\x4c\x59\x38\x77\xd1\xc2\x55\x73\x53\x16\x2e\x5d\x12\xbc"
- "\x78\xee\x73\x0b\x9f\xd5\xad\x9c\xbb\x4c\x17\x92\x3a\x3c\xb5\x3f"
- "\xe9\x10\x9d\xaa\x9b\xbb\x6c\xd9\xf2\xc5\xf3\xe7\xe9\x96\x2c\x7c"
- "\x76\x74\xf2\xfc\x65\xf3\x53\x74\x73\x93\x97\x2e\x5f\x32\x4f\x37"
- "\x7c\xde\x98\xe1\x21\x93\xe6\xf5\x57\xae\xa1\x0d\xd5\x92\x46\xc7"
- "\x95\x86\x86\xec\x2b\xc4\x5b\xa3\x4a\x4a\xd6\xa4\x2e\x5c\xc2\xd7"
- "\xec\xa6\x07\x8c\xcd\x23\x49\x10\xee\x53\x92\x8b\x65\xfd\x80\x1e"
- "\xce\x22\xca\x41\x3e\x75\x70\xed\x0d\xb6\x0f\x6e\xce\x7d\xa0\xd6"
- "\x24\x3e\x64\xc4\x32\x83\xb2\xd0\x41\xde\x06\xd3\x2b\x95\x0d\x30"
- "\x66\x4b\xc2\xf7\x0c\x4a\xae\x10\xff\x9c\x15\x44\x04\xe7\x03\x4e"
- "\x2b\x68\x71\xad\x6b\xba\x8f\x49\x8c\xd0\xf3\x35\xd1\xe9\xbb\xcc"
- "\x03\x13\xd6\xd3\x9c\x84\xf5\xbc\x5e\xa6\xff\x49\x5e\x0b\x8f\x7e"
- "\x99\x44\x23\x3e\xeb\xc5\xe9\xec\xf9\xcb\x4b\x80\x65\x5c\x0b\x6e"
- "\xfa\xf0\xa1\x08\x18\x0f\xd6\xe1\x7a\x2e\x84\xfd\xc9\x22\x10\x1f"
- "\xb0\x4b\x3c\xbc\x26\x84\x6c\x85\xb4\x96\x05\x52\x0a\x69\x24\xc9"
- "\xeb\x69\x90\x07\x2d\xe4\xa5\x56\xca\xc7\x2f\x59\x3e\x0a\x68\x50"
- "\x9e\x1f\xd8\x97\xcb\xec\x29\x94\xf3\x00\x76\x43\x7e\xa6\x13\xb0"
- "\x53\x8b\x76\xb9\x5b\xeb\xc3\xf5\x2e\xb0\xf3\x8c\x63\x05\x94\xdb"
- "\x10\xbe\x67\x6c\x76\x31\x6f\x7f\x90\xaf\xc1\x25\x70\x9d\x75\x89"
- "\xf8\xbc\x96\x4c\xfc\x69\xe6\xdd\xf4\x98\xc5\x46\xaa\x13\x6b\x89"
- "\xe6\x45\x6a\xa6\xef\x35\x34\xf0\x3c\x45\x68\x91\x1b\xde\x79\xbe"
- "\x56\xc4\x3c\x41\x5f\xe1\x53\x72\xc9\xe3\xda\xa2\xb8\x75\x10\xb5"
- "\xd0\xed\xca\x31\x57\xc4\x8b\x58\x26\x38\xde\x6a\x82\x7e\xaa\x39"
- "\x37\x22\x01\xec\x2e\x97\xc6\xc6\xd0\x67\xcc\x51\x8c\xa5\x22\x10"
- "\x67\x16\x0f\xba\xbd\x65\xdd\x54\x60\x7b\x2d\x07\xf2\xfa\x8f\x38"
- "\x03\x71\xcc\x0a\xfd\x46\x57\xfd\xa8\x13\xae\xcd\x72\x3a\x7c\x1e"
- "\x1e\x81\x63\x02\x33\x60\xd9\xec\x21\xbd\xa0\xdc\x02\x7a\xb2\x1a"
- "\xfc\xb3\x5b\x88\x08\xb2\x27\x4b\x0a\x50\xff\x83\x3a\x93\xf8\xc0"
- "\x7a\xd4\xff\xd2\x20\x42\xd6\x83\x4c\x53\xee\xf4\x72\x5c\xdf\x85"
- "\x30\x68\xff\xc1\x65\xae\x6b\xd6\x12\x9e\xa7\xba\xe0\x39\x22\x17"
- "\xc7\x84\x79\xa0\x1f\x30\x94\x7d\x19\xfa\x61\xb8\x1f\x93\x47\xf4"
- "\x98\x0e\x5c\xd7\xe0\x7a\x08\xe8\xcc\x91\xd3\xa3\x80\xff\x2c\x07"
- "\x5f\x83\x91\xb0\x15\x5c\x9d\xda\x80\xdf\x0c\xa3\x87\x81\xdf\xd1"
- "\x46\xc4\x18\xc4\xa9\x90\x31\x05\x58\x3f\xc9\x70\xe5\x4f\xf4\x34"
- "\xf7\xc1\xa8\x12\x3f\x90\x03\x5c\x15\x03\x9e\x10\x57\x20\x6b\x96"
- "\x31\x05\x58\xab\x41\x39\xb0\xa1\x7f\xd9\xaa\x08\x11\x39\xf2\xb4"
- "\xf8\xd0\x7c\xc4\x18\xfd\xef\xc7\x6b\xe9\x4f\x7e\x5d\xcb\xeb\xe9"
- "\xa1\xf9\xd5\x56\x5e\x07\x1d\xe5\xfe\x50\x98\xa2\xdc\x6b\x00\xc7"
- "\xfd\xb1\x9c\xf9\x5a\xf5\x43\xf3\xc1\xb6\x1a\x36\x16\x5f\x0b\x75"
- "\xc0\xfa\xaa\x87\x70\xbf\xe9\x40\xa9\x0c\xab\x3a\xca\xf0\xa1\x0c"
- "\x77\x65\xe8\x52\x76\x22\x3a\x9a\xfb\xd0\x66\x6c\x2b\x10\x67\xaf"
- "\x49\x7c\x70\xb6\xa7\x67\x05\x90\x86\x28\xe6\x11\x6f\x4c\xa3\xc2"
- "\x9f\xc9\x9f\x96\xd3\xc8\x86\xb2\x36\xa7\x27\x5e\x15\xcf\x15\x3b"
- "\x08\xc1\x35\x71\x8c\x1f\xe4\x8f\xe5\xfb\x70\x50\x47\x7c\x6a\x71"
- "\x8d\x3f\xfc\x59\x27\x5b\x99\xa3\xb9\x0f\x87\x6d\xf5\x03\x1c\x31"
- "\x7b\x1f\x9e\x77\x35\x7b\x83\x74\xbc\x9f\x34\x0e\x45\x7c\x3f\x5c"
- "\x54\xbd\x8d\x10\xf4\x93\xee\x37\x37\x41\xdf\xe3\xba\xbe\xef\xf9"
- "\x79\xc3\xc3\x5f\x3a\x3f\x6f\x78\xb8\xca\xd3\xf3\x06\xe7\x74\x23"
- "\xef\xc0\x74\x1d\x25\xb3\x55\x1d\x69\x47\x8a\x0e\x37\x69\xcb\xf1"
- "\xc7\xec\x50\xce\x67\x22\x17\xa2\x0d\xc7\xa1\x9f\xa2\x3f\x9d\xad"
- "\xa2\xa0\xa7\x82\xf5\xe1\x91\x89\x7c\xfc\x82\xe3\xa2\xc8\x28\x94"
- "\x71\xcd\x47\xfb\xe1\xed\x8f\xf3\x3c\xd2\xc2\x6e\xbc\x7e\x46\xf0"
- "\x17\x25\xe4\x6e\x83\x1c\x2c\x38\x09\x13\xea\xe6\xc6\x87\x10\x1d"
- "\x93\xa7\x70\x70\x2f\xe9\xde\xcc\x6e\xc4\x76\xf9\xf6\xf0\xeb\x38"
- "\xfa\x71\x7b\x99\x3e\x2b\x51\x49\xe9\xa5\x2a\x24\x22\xaf\x12\x9b"
- "\x12\x39\x8a\xbb\x03\x77\x49\xcd\x98\xed\x05\xfa\xb6\x31\x61\x4a"
- "\x6d\x92\x7e\xf9\x9e\x2a\xef\xd1\xc7\xf9\x1e\x0e\xf5\x1c\x45\x02"
- "\x77\xab\xe7\xb1\xd7\xc6\x86\x55\xb5\x7b\x09\x3b\xb4\xca\x24\xb5"
- "\x24\xc3\x8b\x5d\x68\xf0\x8f\x15\xf4\xe9\x21\x5c\x57\xde\x2e\x70"
- "\xbb\x65\x9d\x42\xfc\x33\x6e\xfe\x50\xef\xab\xe4\xb1\xbb\xc7\x10"
- "\xc5\xf5\xdd\xfc\x74\x4f\x65\x2f\xea\xbf\xfa\xa1\xab\xe9\x27\x5f"
- "\x76\xc0\x63\xe8\x0c\x77\xa2\x1d\xe5\x3f\x74\x97\xec\xa5\x44\x68"
- "\x47\xf8\xbd\x7a\xe7\xfb\xfb\xac\xce\xf7\x23\xa3\x7a\xc3\x74\x23"
- "\xfe\x49\x37\x0d\x24\x64\x84\x7f\xbb\xa7\xc6\xa5\xc9\x68\x72\x5c"
- "\x9a\x50\xc7\x21\x59\xa3\x06\x7b\x0a\x15\xde\xa2\x7b\xe9\x1b\x73"
- "\xdc\xb9\x4e\x6a\x10\x77\x9b\xb5\x9d\x02\xa7\xbb\xf8\xe1\x7d\x1f"
- "\x9d\xe4\x37\xee\x50\x27\x79\xe6\xa7\x53\xdc\xab\x22\xe0\xcf\x0e"
- "\x60\x56\x43\x67\xd9\x1f\x8f\x1f\x8f\x2e\x1c\x2a\x6c\x1f\x3f\x1e"
- "\x37\xe8\xa0\xbc\x17\x07\x26\x62\x27\xfc\x47\xdb\x89\x92\x4a\x01"
- "\x54\xf2\xa0\xd2\x45\xaf\xf4\xe3\x3f\x1e\x3f\x1e\x3f\x1e\x3f\x1e"
- "\x3f\x1e\x3f\x1e\x3f\x1e\xb7\xc0\xa1\x52\x4e\xac\x71\x7e\xda\x57"
- "\x3a\x2b\xe7\x3f\x2a\xc9\x29\xfd\x84\xeb\x89\x47\xa5\x83\x64\x44"
- "\x18\x75\x3b\x12\x4c\xda\x9c\x98\x9a\x90\xb2\x24\xb3\xf7\x86\xa8"
- "\x4a\x7d\x69\x62\x43\xe0\x36\x43\x6d\x58\x79\xaa\x55\x5c\x1f\x59"
- "\x11\xb4\x73\xde\x69\xff\xbc\xd9\x27\x43\xf7\xa6\x58\x7c\x36\xcf"
- "\xa8\x0a\xde\xb5\xa8\x71\x70\xe1\x9c\xba\xf0\x03\x6b\x6c\x42\xe6"
- "\x43\x1f\x0f\xfd\xfd\x33\xf5\x7e\xb9\xff\x75\x62\xfc\xdb\xc9\x97"
- "\xfa\x6f\xfa\xf9\xd1\x91\xff\xf3\xfc\xb9\x3b\x7f\xfb\xf4\xdf\xa7"
- "\xee\x5f\xd5\xda\xe7\x95\x9f\xfd\xf9\xde\x3f\x2e\x38\x3b\xa8\xe0"
- "\xc9\xbf\x4e\x7a\x6f\xc5\x15\xdf\xac\x59\xc7\xc7\xbc\xb5\xe4\xc2"
- "\x90\xe2\xb8\x7f\x3e\xf0\x61\x9a\x43\xb5\xee\xc1\x43\xf7\xfc\x6e"
- "\xee\xd7\x03\xb7\xfc\xe2\xf3\x71\x7b\x7e\xf3\x7d\xbf\x8d\x8f\x7d"
- "\x3a\xe2\x4f\x0b\xff\x75\xc7\xeb\x4f\x7d\x31\x65\xdf\x8b\x2d\x5e"
- "\x2f\x3f\x72\x64\xf8\x1b\xf3\xcf\x04\xe4\x3f\x71\x6a\xe2\xbb\xcb"
- "\x2f\x0f\x78\x6d\xe6\xb1\xd1\x6f\x2e\x3e\x7f\x57\x51\xec\x97\xd3"
- "\x0e\xae\xb5\xab\x5f\x7a\xf8\xf0\xb0\x3f\x3c\xfb\xcd\xed\x5b\x7f"
- "\xf9\x97\x09\xef\x2c\x6b\xba\xed\xd5\xc7\x3f\x1b\xf5\xbf\x2f\x7c"
- "\xf7\xd3\xed\xbf\xfe\xc7\xfd\x1f\xac\x6e\xeb\xfb\x7f\x1e\xfd\xe4"
- "\xbe\xff\xfb\xdc\xb7\x3f\xf9\xef\x5f\xfd\x6d\xf2\xfb\x2b\x9b\x35"
- "\xd9\xd1\xd5\x63\x77\x2f\xbd\x78\x77\x49\xfc\x57\xd3\x3f\x4a\xa7"
- "\xd7\x53\x7e\x44\xcc\x7b\xe9\x66\xd7\x1b\x3f\xbd\xb2\xa1\x27\xf1"
- "\xa9\xa0\x92\xea\x9d\x7b\x64\x4c\x24\x2a\x6f\xd2\x47\xec\xc1\x4c"
- "\xa1\xa7\xf9\xf5\x70\xe8\x94\xf1\xbb\x72\xe0\xcb\x84\xe3\xc0\x4d"
- "\x00\xf7\x53\xe6\xd3\x31\xfb\x1f\xda\x45\x1d\x37\xfe\x50\x41\xde"
- "\xd5\x60\x99\x17\xe9\x03\xa5\xe5\x4d\xfa\x91\xfe\xe4\x36\xe2\x43"
- "\x06\x10\x5f\xa2\x21\x5a\x32\x90\xf8\x91\xdb\x89\x3f\x09\x20\x83"
- "\xc8\x4f\x48\x20\xb9\x83\xdc\x09\xb9\x19\x4c\xee\x22\x43\xc8\xdd"
- "\x50\x28\xf7\xb8\xcf\x4b\x06\x89\x08\x84\x3f\xf0\x3f\x86\x44\xb0"
- "\xfb\x84\x1f\xfd\x6f\xaa\xbf\x51\xf2\xaf\x91\xfc\x4d\x3f\xfa\xdf"
- "\x54\x7f\xdd\xbf\xf9\x7c\xcf\xbf\xf5\xac\x82\x21\x03\x1f\x35\x38"
- "\x8d\x1d\xda\x0f\x57\x5f\x95\x74\xb4\xdf\x93\x6b\xc4\xef\xa4\xcf"
- "\x39\xbe\xeb\x11\x01\x2e\x94\x5f\xa6\x13\xc2\x9f\x33\x50\xe5\x61"
- "\x2b\x50\x7d\x2c\x0e\xcc\xc0\x47\x26\xde\xc4\x9f\xfd\xbd\xf6\xf1"
- "\x46\x10\x38\xe0\xf9\x37\xc2\xc1\x4d\x07\xf7\x38\xb8\x27\x64\xdd"
- "\x44\x25\xd4\x11\x95\xe8\x4f\x54\xea\x54\x38\x97\x11\x95\x57\x24"
- "\x51\xf5\xad\x20\xaa\x3e\xeb\x89\xaa\x9f\xd8\x61\xbc\x9f\xae\xdd"
- "\x4a\x95\x56\xf2\x07\x2f\x95\x7f\xa9\x22\xb1\xee\xf6\x67\xe5\x8f"
- "\xcc\x8e\xd2\x8d\x1b\x13\x3a\x66\x62\x88\x6e\x74\xcc\x68\xdd\xf8"
- "\x90\x71\x21\x63\x43\x42\xc7\x8e\x9b\xa4\x1b\x37\x61\xea\x84\x90"
- "\xa9\x21\x93\x75\x8b\x5f\x4c\x5e\x38\x2e\xe4\xb9\xf9\xba\x25\xf3"
- "\x16\x2e\xd3\x2d\x58\x98\xbc\x78\xe5\xdc\xe4\xf9\x5d\xc8\x79\xb7"
- "\x0e\xcc\xdd\x5d\x76\x6e\xa6\xb2\x86\x54\xd0\x83\x88\x33\xca\x89"
- "\x98\xb0\x81\xb4\x87\xa8\x72\xa4\xac\xe8\x25\xd7\xe9\x58\xfc\xf4"
- "\x93\x7f\x1f\xfe\x6b\xdf\x8f\x1f\x7c\x6e\xf8\xb4\x87\xff\x90\x5d"
- "\x46\x84\x5f\xce\x20\xc2\xcf\xcd\x44\x88\x80\xeb\xd0\x5a\x22\xdc"
- "\x97\x48\x84\xac\x03\x44\x78\x25\x92\x08\xab\x1b\x88\xb0\xd4\x42"
- "\x84\x67\xdc\xf8\x15\x99\xb9\xdf\xe7\x79\x44\xf8\xc4\x9f\x08\x1f"
- "\x40\xd2\x6f\x86\x70\xbf\x86\x40\x22\x7c\x99\xd1\xdb\x45\xd1\x0b"
- "\x47\x77\x71\xa0\xfa\x7f\x04\x22\x5e\xcf"
+static unsigned int rss_ethp_z8e_uncompressed_length = 571764 ;
+static unsigned int rss_ethp_z8e_length = 158985 ;
+static unsigned char rss_ethp_z8e[158985 + 1] =
+ "\x78\x9c\xec\xbd\x71\x7c\x94\xc5\xb5\x37\x7e\xb2\x59\x20\x62\x60"
+ "\x37\x31\xe2\x96\x62\x5d\x34\x81\x68\x03\x44\x1b\x2c\x52\xc0\x20"
+ "\xa0\xc1\x06\x88\x82\x6d\x54\x34\x41\x81\x06\x8d\xb0\x40\x84\x00"
+ "\x21\xbb\x2c\x68\xb1\x02\xd9\x44\x84\x28\x21\x49\xaf\xd8\xd2\x96"
+ "\x6a\xac\x78\x8b\xb7\xa8\x6b\x89\xbf\x1f\xed\x4d\xb2\x69\x5f\x7a"
+ "\xdf\xdc\xfe\xf0\x76\xe5\x46\x9a\xf2\x06\xd8\x92\x85\xac\x64\x77"
+ "\xe7\xfd\x9e\x99\xe7\x49\x76\x97\x0d\xca\xbd\xf7\xf3\xf9\xfd\xd3"
+ "\x7c\x3e\x9b\xe7\x79\xe6\x99\x39\x73\xe6\xcc\x39\x67\xce\xcc\x9c"
+ "\x39\x0f\xd1\xb5\xff\x79\x29\x89\x2f\x09\x64\xfc\x4e\xe1\xc7\xff"
+ "\x85\xf2\xff\xf8\xfb\xc7\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc"
+ "\xfd\xe3\xef\xff\xdf\x3f\x5f\x02\xe5\x5c\x30\x18\xe9\xb7\x2e\xa2"
+ "\x5e\x67\xd2\x18\x2f\x85\x4b\xf7\xbe\x22\x82\x78\x95\x80\x71\x7e"
+ "\x0c\x5f\xf9\x57\x83\x34\x83\x8b\x92\x6e\x35\x93\x59\xec\xb5\x18"
+ "\x66\xed\x27\xda\x3d\x4a\x74\xbf\xb2\x47\xf8\x9a\x2b\x88\x8e\x1d"
+ "\xc0\xf3\x1e\xd1\xf5\xca\x28\xe1\x07\x9c\x62\x2f\x15\xed\x66\x38"
+ "\x5b\xf1\xbc\x15\xe9\x48\x2b\xf3\x52\xf1\x36\x4e\xab\x42\x39\x3d"
+ "\xdd\xb3\xed\x12\x35\x5b\x83\x54\xc5\x70\xac\x21\x9a\x3d\x56\xe2"
+ "\xd1\x88\xbc\xc9\x9c\x77\xcb\x28\xd4\x9b\x46\xe4\xdc\x23\x02\x11"
+ "\x38\x24\x71\x3d\x5c\xb7\x96\xbf\x3d\xa6\x3e\x1f\xd2\x3a\xf5\xfa"
+ "\x06\x81\x61\xe6\xf2\xdc\x06\xeb\x37\x28\xf1\x34\x5d\x7f\x23\xc3"
+ "\x64\xdc\x84\x93\x92\x3c\x97\x83\x74\x9a\xae\xcb\xec\x71\x52\xe2"
+ "\x31\x50\x63\xd7\x1e\x99\x9e\xe8\xf1\x07\xc9\x5a\x49\x09\x78\x37"
+ "\x0f\x57\x03\xca\x8d\x60\xfa\x2c\xac\xa3\x74\xae\x1b\x70\x8d\xc2"
+ "\xe0\x4e\x68\x48\x25\x62\x1a\xf9\x0d\x34\xde\xef\xa4\x84\x5e\xe7"
+ "\x75\x68\x7f\x52\xa6\x6c\x3f\xea\x45\x59\xe3\x69\x1a\xfe\x77\x03"
+ "\xf2\xa3\x4e\x9f\x75\x23\xe3\x30\xfc\x13\xe1\x74\x1b\x74\x38\x61"
+ "\xa7\xfb\xfa\xfa\x1a\xa2\x1e\xa7\x61\xae\xdf\x60\x12\x1a\x9c\xa3"
+ "\x3a\x1c\xce\x87\xba\x92\xb9\xae\x1e\xa7\xb1\x26\x22\x8f\x57\xcf"
+ "\x03\xbc\x7d\x93\xfc\x94\xc8\x38\x9f\xa2\xe1\x53\xb8\x3e\xad\x2d"
+ "\x46\xae\xc3\xb3\x2e\x48\x1e\xf4\x3d\xea\x4e\x43\x5b\xad\xc7\x02"
+ "\x44\x80\x99\xd2\x50\x49\xc4\xf0\x81\xbf\x55\xc1\x1c\x9e\xa3\xc3"
+ "\x64\x18\xfd\x6d\x75\xba\x53\x1b\x24\x8e\xdc\xd6\x24\xd2\xf2\x16"
+ "\x47\xe2\xc8\x70\xd1\x96\x9b\xb8\x2d\xcd\xe0\x28\x2d\xcf\xb6\x7e"
+ "\x7a\xf4\xb7\xff\xfa\xdc\x18\xd8\x16\x05\x3b\x01\xb0\x13\xdc\x5a"
+ "\xb9\xfe\xf6\x7b\x63\xf2\xab\xbc\xe6\xeb\xfc\x06\xa1\xd1\x61\x78"
+ "\xd7\x40\xde\xeb\x76\x47\xe6\x05\x3e\x06\x45\x5b\x32\x78\x69\x78"
+ "\x07\xda\x99\x88\x3c\xf9\xe8\x47\xab\xf6\xfe\x46\xed\xbd\x05\xef"
+ "\xee\x55\xf0\xae\x9f\x12\x01\xcf\xcc\xf0\x22\x79\x4b\x49\x94\x11"
+ "\xbf\x21\x30\x90\x87\xe2\x37\x2c\x49\xe7\xb7\xb5\x16\x11\xb6\x7f"
+ "\x0d\x6d\xaa\x49\x4f\x0a\x3b\x05\x79\xca\x03\x64\x1d\x4d\xf6\x53"
+ "\x74\x7d\x13\xe0\xd3\xae\x8d\x94\x64\xb7\x89\x80\xa7\xbc\x9b\xda"
+ "\x7c\xdd\x64\xf7\x41\x36\x82\x17\xa9\xf2\x22\x78\x31\x78\x96\x2a"
+ "\x57\x93\xa5\xb9\xe2\x73\x8a\xc7\xcb\x61\x83\x20\xfb\x18\x2e\xdb"
+ "\x49\x6d\x75\x9d\x64\xaf\x8b\x2e\x6b\xbf\x99\x2c\xad\x78\x46\x9f"
+ "\x9b\x18\x0f\x96\xb7\x60\x6a\x7a\x52\xc5\x6b\x64\xb4\x8f\x25\x43"
+ "\xeb\x52\xb7\x86\x4b\x72\x39\xe3\xb2\xed\x0c\x25\xbd\xb1\x1c\x7c"
+ "\x78\x86\xf1\xcd\x4a\x7a\x7b\x63\xc0\x70\xcc\x92\x4f\xc7\x2c\x27"
+ "\xa9\xd9\x32\x9d\x9a\xcb\x67\xd3\xae\x33\x94\x7c\x2c\x30\x8d\x9a"
+ "\x8d\xf7\x53\x73\xfa\x6c\xf2\x74\xe3\x1e\xf2\x7b\xcc\xe2\x27\xeb"
+ "\x3a\xe6\xa7\xe4\x92\xdd\xcf\x50\x92\x57\xc1\x04\xed\x92\xcb\x3e"
+ "\x2e\x23\x62\xda\xf1\x73\xbc\x76\xac\xfd\x1a\x59\x80\x5f\x17\x70"
+ "\xb9\x07\xb8\xfc\x32\xdd\x42\xd9\xc0\x79\x98\xa7\x36\x48\xc6\x0a"
+ "\xba\x6e\x10\x39\x4e\x0b\x83\xf7\x20\xbb\xdd\xf5\xd0\x27\x2c\xbf"
+ "\x3d\x9b\x0a\xa1\x13\x92\x21\xff\xc9\xdb\x34\x19\xe8\xb6\xff\x98"
+ "\x8c\x3d\xeb\x0b\x13\x1a\xf6\x88\xce\x5e\xe7\x08\xd2\xdf\x41\x16"
+ "\x3b\xf1\xbe\x6b\x52\x1a\x99\x3d\xc1\x5c\xfa\xe8\x72\x17\xcb\x63"
+ "\xf7\x48\x3f\x25\x30\x3c\x53\x39\x64\x67\x1d\x0d\x01\x3e\x7f\x68"
+ "\x40\xfa\x6d\xc8\x87\xf2\xb9\x5e\x7a\xb5\x9b\xcb\x8b\x9b\x1e\xf7"
+ "\x87\x6f\x7a\xfc\x62\x78\xef\xe3\x3d\x62\xef\xe3\x17\x42\x7b\x1f"
+ "\xff\xbb\x7d\x03\x25\x85\x6e\x7a\xdc\xd7\x66\x93\x7d\x60\x6e\xb3"
+ "\xa1\x0f\x42\x94\xb4\xf9\x2c\x99\x9f\x5c\x8d\xbe\x0f\x7e\x4a\x9b"
+ "\x57\x90\x25\x9c\x72\x87\xdb\x13\xfc\x13\x3d\x59\x41\x02\xf7\xed"
+ "\xf1\xda\xd7\x93\x9a\x95\xa7\xcb\x16\xea\x3d\xe2\x35\xde\x26\x69"
+ "\xe8\x4b\xc9\xc9\xc3\x2f\x1f\xbf\x02\xfc\x16\x89\xd4\xac\x45\xa0"
+ "\x95\x7d\xe4\x96\x04\xaa\xbf\x4c\x34\x29\x4c\x09\x67\x68\xc4\x09"
+ "\xe0\x6f\x1e\x84\x6e\x63\xc2\x35\xb6\xdc\xf1\x0e\xaa\xec\xed\x2d"
+ "\x21\xd6\x85\xac\xff\x58\x1f\xf6\x3a\x47\x5a\x51\x4f\xae\x94\xdf"
+ "\x3d\xd0\x31\xa9\xb6\x5c\xa4\x77\xf9\x37\x95\x24\xf8\x36\x95\x18"
+ "\x7a\x52\x6d\xb3\x90\x67\x36\xf2\x94\x6b\x34\xec\x62\x58\x90\x2d"
+ "\xdf\x88\x20\x25\x02\xa6\xed\xd7\x97\x3a\x8c\xfb\xf7\x88\x93\xc8"
+ "\x57\xda\x0f\x0b\xb0\x01\x07\xf4\x1f\xe9\xd0\xd3\x40\xeb\xce\x9d"
+ "\xc8\xc7\xe5\x3d\x81\x5c\x1e\x53\xbc\x9e\xd2\x2e\x32\x05\x69\xb8"
+ "\xe8\x53\xf5\x21\x4f\x17\xeb\xf4\x11\x01\x1a\xda\xeb\xa4\x02\x86"
+ "\xcd\xe5\x3c\xdd\x5d\x84\x72\xb3\x84\xbd\xc4\x80\xf4\xf9\xbd\xa2"
+ "\x24\x61\x1b\xd2\x8f\xa1\xbc\x56\x77\x97\x8e\x23\xd7\xc1\x7d\x2d"
+ "\xf1\x04\x3f\x1c\x2b\x0d\xd0\x88\x5a\x4a\x44\xb9\x85\x0c\x8f\x61"
+ "\x81\x0f\xbc\x68\xeb\xac\x63\xa5\x3e\x0a\x8b\x28\x98\x5e\x05\xcf"
+ "\x34\x25\x0a\x1e\xd2\x05\xe0\x31\xff\x35\xa3\xcc\x88\x46\x09\xef"
+ "\xe1\x5f\x87\x19\x5e\x80\x8c\x56\x89\xef\xf7\x18\x46\x2f\xeb\x0f"
+ "\xc0\x74\xaf\xbb\x8f\xba\xc9\xd4\xe8\xb3\x97\x24\xb6\x61\xdc\xe4"
+ "\xf2\x6f\x57\x76\x0d\x11\x3d\x85\x89\xcc\x73\xfc\xde\x13\xbc\xc0"
+ "\x79\xb6\x88\x9e\x92\xc4\x11\xdd\xd0\x45\xc8\x83\xf2\xe5\x8c\x67"
+ "\x64\x5f\x3e\x3c\xe7\x7b\xd3\xe9\x7b\xb3\xe7\xce\x9e\x4e\xf3\x66"
+ "\xce\x9a\x4e\xd9\xf7\x4c\xc8\xce\xf9\xd6\xb7\xbf\x25\x6f\xbe\xf5"
+ "\xed\x29\xdf\xa2\x82\xef\x3f\x3c\x9d\x0a\xe6\x4f\xa7\x85\xf8\x15"
+ "\x2c\x9c\xf3\xf0\xec\x39\x0b\xa7\x53\xe1\xfd\x73\xf1\x34\x6b\xfa"
+ "\x9d\xd9\x0f\x4c\x28\x98\x35\x77\x0e\x3d\xb4\xe8\xae\xec\xbb\xee"
+ "\xa2\x99\x73\xf2\xef\xcc\xce\xd6\xae\x77\x66\x73\x96\xc7\xa6\xcc"
+ "\x59\x38\xa1\x60\xcd\xaa\xb2\x55\x13\xe6\xcf\x9d\xc5\x29\xd0\x6e"
+ "\x11\x3c\x94\x19\xba\x14\x66\x5a\xfb\xc5\xf9\x3c\x0a\x43\x77\xd4"
+ "\x83\x07\xf0\xeb\x76\x57\x9e\x82\x0e\x48\x79\xbe\x9e\xfb\x4e\x8e"
+ "\x01\xa6\xa3\x90\x7b\x63\xaf\xd3\x5c\x01\x1a\x1e\x61\x1a\x5a\x6f"
+ "\x65\x3d\x71\xd3\xfb\x78\xf7\xb1\x36\xd6\x0c\xc1\xfb\xba\xe8\xf7"
+ "\x37\x40\x07\x9b\xfe\xdf\x36\x2b\x91\x07\x3f\xd0\xdd\x0f\x5d\x08"
+ "\xfa\xfa\xa8\xc7\x5e\x38\x04\xfc\x9d\x80\x3a\x3a\x21\x9b\xed\x28"
+ "\xdb\x11\x21\xf3\x9d\xe8\x9f\x76\x1e\x57\xce\x91\xf9\x9d\xb6\xb2"
+ "\x5c\xe2\x7e\xf2\x94\x69\x30\x2e\xf6\xc3\x18\x2e\x61\xa0\xef\x01"
+ "\xe7\x84\x82\x93\x62\x8d\xd0\x0f\x5e\x86\xb3\x0b\xef\x34\x58\x17"
+ "\xdb\xa0\x27\xa0\xc7\x53\xc3\xf6\x4c\x12\xa9\xe9\xe6\x70\x5f\xa6"
+ "\x1c\x2b\x51\xae\x30\x82\xaf\xfd\xcd\xe5\xc8\xf7\x46\x5e\x02\xf8"
+ "\x20\x01\xe3\x2f\xda\x62\x5e\x0a\xfe\xf6\x87\x6a\x72\x1e\x15\xe7"
+ "\x0b\xd9\x8e\x18\x7a\x9a\x52\xff\x80\xf6\xb5\x84\x6b\x72\x0a\x45"
+ "\xaf\x4c\x63\xba\x1d\x11\xfc\x9c\x8a\x7c\x7d\xfd\x69\xef\x73\x1a"
+ "\xf8\x20\x91\xe5\x55\x08\x99\x8e\x31\x33\x75\x03\x74\x5a\x07\xf2"
+ "\x16\x72\xde\x49\x41\x1a\x06\x5d\x63\xb1\xda\x13\xe8\x14\xa5\x52"
+ "\x38\x35\xe7\xb1\x88\xfa\x00\x27\x95\x07\x29\xe6\x47\x63\xef\x79"
+ "\xc0\xe9\x91\xe9\xb0\x63\x52\x9f\x00\xfc\xc7\x59\x57\x2a\xfd\x7d"
+ "\xd3\xbf\x73\x3e\x6d\x6c\x1e\x78\x86\xac\x2b\x38\x37\xfd\xfb\x31"
+ "\xd0\x92\xed\x05\xb6\xff\x7a\x9d\xa9\x8b\xbc\x34\xc2\xa7\xc6\xc6"
+ "\x9b\x3a\x38\x6f\x18\x38\x0a\xf3\x7b\x25\x80\xbb\xd8\xbd\xb1\x9b"
+ "\x4e\xdb\x78\xac\x4d\x35\x87\xed\x25\x14\x8d\x53\x4a\x0b\xe3\xcf"
+ "\xfa\x03\xb4\xf8\x13\xf8\xe0\x3a\xc0\x3b\x10\xcd\x07\xa9\x6e\xc0"
+ "\x79\x14\xf8\x75\xa0\x4d\x8f\x7a\x29\xe5\x78\xb8\xa7\x04\xf5\x92"
+ "\x01\x72\x05\x7d\x3e\x00\x43\x2b\xdf\x19\x5d\x3e\x65\x3b\x97\x43"
+ "\xfe\x21\xbd\x3d\x32\xff\x0e\xa6\xb9\xc6\x77\xe0\xcb\x1b\xd2\x62"
+ "\xf8\x72\x3f\x70\xf9\x8f\x88\xf7\x39\x31\xef\xb7\xe0\xfd\x7f\x6a"
+ "\xef\x21\xf7\x37\x2c\x8a\xe1\x5b\x1b\xde\xff\x15\xf8\xfa\x21\xd7"
+ "\xb0\x2d\x52\xf2\xc0\x63\xbe\x88\xfc\xdb\x62\xf2\x37\x22\xff\xff"
+ "\x61\xbe\xe1\x31\x87\xf3\x37\x68\xb2\x83\xfc\x49\xc8\x7f\x38\xa6"
+ "\xfe\x25\xc8\xef\x8f\xc0\xef\x44\xf4\xfb\xb4\x3a\xbc\xff\x82\x79"
+ "\x1d\x36\xd1\x10\xe4\x19\xc6\xba\x84\xf5\xd8\xb1\x52\xee\xaf\x34"
+ "\x63\x4c\xfe\x74\xe4\x4b\xd6\x68\x64\xd0\x68\x94\xc7\xfd\x88\x3a"
+ "\x4e\x2a\x1c\xd2\xa6\xc4\x94\x29\x44\x99\x34\xd0\xf1\x51\x9d\x2f"
+ "\xe3\x94\x29\x8d\x29\xb3\x83\xfb\x51\xa8\x7a\x8c\xbd\x7d\x03\x65"
+ "\x34\x1d\x19\x09\x83\xdb\x76\x3d\x60\x34\x45\xc3\x18\xd5\x85\x7a"
+ "\xc7\xec\x54\x7a\xe7\x7a\xf0\xd0\x5d\x48\xfb\x77\xc0\x7c\x82\x65"
+ "\x00\xb2\xea\xf7\xf8\x02\x24\xec\x79\xc9\x8a\x77\x6f\x4c\x19\x19"
+ "\x24\xbe\x9f\xc0\xf7\x0c\x5b\xf4\xe6\x6b\x32\x79\x63\x0a\xae\x48"
+ "\x4f\x63\xfb\x2d\x81\x75\xb0\xe8\xfd\x6e\x58\xc1\xbc\x71\xb2\x30"
+ "\x90\x01\xcf\x21\xad\x8e\x3f\xe0\x39\x01\xf8\x3f\x86\x31\x87\xc4"
+ "\x7a\xe4\xdb\x48\xb3\x90\xfe\xb1\x94\x55\x95\x4f\x3e\xab\x3a\xf2"
+ "\x98\xbf\x73\xf0\xfc\xbe\x56\xfe\x1d\x86\x87\xfb\x3b\xb5\xfb\x84"
+ "\x10\xc3\x3a\xaf\xcb\xe0\xa8\x9f\xc9\x72\x90\x43\x09\x1f\xe5\xc5"
+ "\x7a\xf9\x8e\x61\xbe\x8a\xeb\x5c\x5c\xb7\xe0\xfa\x10\xae\x4f\xd8"
+ "\xbf\x20\x8b\x3d\x24\xe5\x91\x9f\xe7\xe2\xfa\x30\xae\x93\x71\x5d"
+ "\x88\xeb\x58\x5c\xef\x43\x1b\x42\x2c\x17\x18\x47\x79\x8e\xe5\xc7"
+ "\xb8\xaa\x78\x8b\xe7\x00\xbd\x79\x4c\x83\x39\xc8\xd3\x25\xe5\x55"
+ "\xe9\x97\x24\xd5\x8f\x37\x76\xcb\xb4\x54\x99\x36\x4c\xf1\x83\x4a"
+ "\x0b\xe9\x7a\xe8\xfc\x40\x9a\xa6\x9b\x34\x59\xd4\xd2\x14\xfc\x02"
+ "\xc0\x77\x33\xae\x42\xc1\x1a\xa2\xfa\x5c\x83\xaf\xca\x19\xe3\xd4"
+ "\x99\x10\x59\x27\xae\xbb\xed\xe5\x42\xe0\xea\xe0\x3e\xf2\xd2\xa8"
+ "\x26\x21\xf9\x1e\x63\xac\x82\xb7\x58\xcb\x97\xc3\x34\x96\xe5\x65"
+ "\x7a\x5a\x7b\x04\x2f\xa5\xf6\x3a\x47\x05\x63\xe4\x28\x1b\xbc\x34"
+ "\x91\x79\x86\xe9\xce\x6d\x1b\x69\x93\xe3\xb8\x6c\x8b\x84\x7f\x5e"
+ "\xf1\x64\xbd\x36\x6f\x55\xf2\x7b\xd3\xec\x18\xfd\x22\x79\x36\x46"
+ "\xde\xbb\x99\xe6\x89\x15\x2c\x07\x37\x61\xfe\xf7\xf6\x18\x69\x33"
+ "\xd6\xe4\x3c\xc9\xef\xfd\xe8\x63\xae\x37\xd1\xc6\xed\xb8\x69\xb7"
+ "\xfe\x5e\xbe\x4b\xb1\xb9\x99\xbf\x13\x4b\xe5\xbb\x26\x8c\x47\x47"
+ "\xf4\x77\x7a\x3d\x89\x65\xf2\x5d\xcb\x00\xdc\xf4\x6c\x0d\x6e\x62"
+ "\x3c\x9b\x4f\xb8\xd2\xad\x13\x88\x0c\x77\x38\x68\x88\x27\x78\x82"
+ "\x16\x04\x45\x68\x82\x83\xae\xf3\x04\x0f\xd1\xed\x44\x29\x9e\xe0"
+ "\x49\xba\x83\x68\xac\x27\xb8\x1b\x36\xc8\x01\x7e\xff\xd1\x78\x4a"
+ "\x48\xc0\xd5\x3e\xce\x61\x48\xf0\x04\xcb\x28\xdd\x61\xc4\xb5\x94"
+ "\xee\x1f\x22\x7a\x3d\xc1\x7c\xe4\x5b\x4a\x0b\x42\xe2\xfc\xec\x21"
+ "\xe2\x2f\x45\x21\x32\xe7\xbf\x20\xec\x9e\x20\xe6\x03\xc1\x16\xa4"
+ "\x87\xc5\x82\xd0\x17\xf8\xf5\x8a\xb0\x2b\x3d\x7b\x41\xe8\xbc\x98"
+ "\xf5\xc2\x47\x78\xfe\x8b\x40\x1f\x09\x4f\x70\x1a\xb5\xf9\xfd\xc8"
+ "\x67\x17\xa2\x3a\xdd\xfa\xe4\x45\x03\xf5\xc1\x86\x08\x57\xa7\x67"
+ "\xa3\x2d\xb9\x7d\x68\x07\xc6\xd7\x7b\xfb\x36\xe1\x5a\x93\x3e\x43"
+ "\x3e\xbb\xd2\x0b\x84\x39\x3d\x77\x22\x26\x57\xdc\x06\x4f\xb0\x93"
+ "\x8a\x30\x3d\x58\xb0\xc1\x27\x18\xff\x91\x5b\x78\x6e\x35\x8d\xd0"
+ "\x07\xa6\x05\x1b\xec\x02\xef\x92\x44\x4a\x7a\xae\x27\xd8\x4d\xa8"
+ "\xa3\x00\xf0\xe6\x49\x78\xae\x74\x1b\xf2\xfa\x38\x5f\x24\x1c\x86"
+ "\xc1\x79\x17\x84\xc8\x84\xfc\xb6\xbe\x94\xf4\x62\xfc\x1c\xf8\x35"
+ "\xa1\xec\x6f\x85\x33\xed\x63\x81\xf1\x1e\xe5\xdb\xf1\xec\x0d\x40"
+ "\x86\x25\x2d\x43\x34\x0c\xf9\x61\x3b\xd0\x6c\xf0\x1d\xf0\xcd\x20"
+ "\x89\x6f\x4d\xba\x08\xa8\x76\x84\xb5\x76\x84\x38\xbd\x07\xb6\x0e"
+ "\xf2\x58\x7b\xe4\xbb\x8c\x5b\x50\x6e\x91\x2c\xe7\xca\xb0\x0a\x73"
+ "\x46\x76\x00\xf2\x05\xba\x3a\x98\x8e\xa0\xab\x83\x69\x29\xaa\x33"
+ "\xac\x9e\xf2\x1d\x24\x52\x32\xb2\xfb\x52\x32\x72\x51\xfe\xe1\x3e"
+ "\x69\x83\x64\x14\x07\x24\xec\x8c\x22\xc0\x59\x0c\xbe\x4d\x04\x8c"
+ "\x62\xc0\xb2\xf5\x39\xad\xb4\x60\x83\x08\x2c\x08\x6e\x09\x16\x6d"
+ "\xa0\xc4\x2c\x72\x00\xdf\x0f\x40\xa3\xa5\x68\x67\x33\xae\xb3\xf1"
+ "\x9e\x6e\x40\x5d\x1f\x01\x6e\x31\xd7\x87\x7a\x6c\x80\xf9\x1c\x60"
+ "\x2d\x65\x9c\xbe\x70\x92\x19\xcf\x8e\x2f\x14\x7e\x8d\x61\x57\x86"
+ "\x3b\x6c\xce\x68\xd2\x79\x88\xf9\x47\xd1\x6d\x37\xcd\xf7\x8b\xa0"
+ "\x27\xb8\x9f\xc0\x63\xe6\x36\xff\x49\x7e\x8f\xf9\xcf\x21\xf4\x33"
+ "\xf3\x54\x19\xae\x07\x88\xf9\xa7\xcd\xf6\x02\xe7\xfd\x88\x79\x68"
+ "\xbe\xcd\xbf\x65\x02\xd9\x12\xf0\x6c\x2f\x0a\x26\xd1\x93\x36\xa3"
+ "\x23\xe4\xca\x70\xb5\xd9\xb8\x5f\x4e\xa0\x0c\x97\x2b\x25\x53\x02"
+ "\xe6\x00\x09\x22\x68\x2a\xf7\x19\x47\x94\xd8\x45\x9b\x3f\x1f\x79"
+ "\x6d\xc4\xed\x61\x3e\xe2\xfc\xf3\xba\x85\x37\x64\x1e\x97\xcb\x6d"
+ "\x13\x23\x1d\xd4\xda\x3d\x99\x78\x1e\xd6\xda\x7d\x80\xf9\x34\x2c"
+ "\xcc\xe3\x98\x47\xfb\xe6\x75\x3b\x86\x3c\x79\x91\x12\x90\x16\x6a"
+ "\x2d\x39\x84\xf7\xcd\xc8\xd7\x22\xf9\x76\xfe\xc5\xa0\x29\x68\xce"
+ "\x70\x04\x5d\xe3\xac\xf3\x2f\xf6\x89\xd6\x92\xdd\xf4\x44\xb7\x03"
+ "\xb4\x3a\x44\xf3\xce\x06\x13\xdb\x6c\x4b\x91\xa7\x17\xe9\x07\x24"
+ "\xff\xcf\x3b\xdb\x23\xe6\xaf\x16\xe7\xe7\x5f\xfc\x8b\x98\x57\x22"
+ "\x3e\x2a\x2a\xa7\x91\xd7\x6f\x11\x61\x96\x8b\x96\xce\x43\x74\xfd"
+ "\x49\x2f\xb1\x4c\xe4\x2f\x09\x8b\x79\x67\xcf\x8b\x27\x57\x33\x6d"
+ "\xa6\x51\x6b\x09\xe4\xa7\x7c\x37\xd3\xbb\xb1\xb5\xe4\x28\xea\x9f"
+ "\x0d\xb8\x76\xe1\x29\xdf\x8f\xbc\x6e\xd3\x13\x67\xcd\xd4\xd2\xb9"
+ "\x9b\x82\x29\x19\x8e\x50\x75\x86\x2b\x9c\x92\xd1\x14\xae\xce\x70"
+ "\x8b\x94\x71\xe6\x60\xf5\x38\x6b\x28\x65\x1c\x78\x60\x9c\x0b\xfd"
+ "\x74\x1d\xf7\xf9\x65\x27\x59\xf1\xbc\xeb\x32\xf7\xbf\x6b\x5c\x23"
+ "\xda\xea\x86\xcd\x2b\x14\xef\x8f\x6b\xe4\xb5\x05\x94\x75\xf7\xa5"
+ "\x8c\x6b\x42\x3e\xb7\x92\xaf\x71\xed\xcc\x97\xc8\x67\x40\x9a\x07"
+ "\xf3\x9e\x44\xbc\xf7\xe2\xe7\xeb\x4b\x19\x0f\x3b\x77\x7c\x01\xe0"
+ "\xa7\x48\x9e\x72\x8d\x2f\x10\x33\x5c\xb0\xa1\x2f\x02\xce\x78\xdb"
+ "\x82\xd0\xbd\x02\x34\x84\x9c\x8c\x2f\x08\x57\x8f\x2f\x16\xa9\xe3"
+ "\x5d\x01\xc9\xfb\xe3\xab\x18\x76\xdf\xa6\x4c\x5e\x73\x30\xe2\x7d"
+ "\xa3\xa8\xc9\x4c\x0d\x30\xaf\x9a\x33\xcd\x61\x73\xa6\x4d\xb8\x32"
+ "\xad\xdf\x7d\x41\xf8\x42\xae\xcc\xdc\xb0\x2b\x33\x3b\x38\x14\xb6"
+ "\x79\xf9\x51\x62\xfd\x14\xfc\x50\x80\x06\x9f\x80\x1e\x07\x64\xff"
+ "\x7b\xca\x21\x03\x1b\x46\x3b\x5a\xbb\xc1\x0b\xb6\x5f\x4a\xdd\xd4"
+ "\xe6\x3f\x21\x69\x2a\x52\x32\xcd\xcc\x53\xdc\xbf\x4f\xda\xc8\x21"
+ "\xaa\x33\xad\xe1\xea\xcc\xec\x50\x35\xe0\xa6\xa0\x9e\xd4\x3b\x7e"
+ "\x15\x90\xf2\x7a\x07\xf8\xf5\x28\xca\x7c\x42\x8a\xc7\xef\x68\x1a"
+ "\x4c\x47\xb2\xae\x62\xfd\xb4\x20\x18\x60\x9e\xf9\x2b\xeb\x35\xa5"
+ "\xa7\xa8\x48\xd7\x53\xac\xa3\x78\xbe\xc3\x7a\x2a\xac\xe9\xa9\xb0"
+ "\xa6\xa7\xe4\xb3\x19\xba\xc6\x95\x9e\xcb\xfa\x68\x41\xb9\xd2\x33"
+ "\x0b\x42\xd9\x02\xbc\x91\x0c\x18\xb9\xaa\x2f\x90\xa7\x26\x7d\x9e"
+ "\xcc\x2f\xe9\x94\x6e\x0b\x43\xdf\xe0\xe7\x08\x2b\x7d\xe3\xd6\xf4"
+ "\x8d\x41\xd7\x37\x21\x8c\x6b\x90\xa9\x70\x3c\x7d\x13\xd6\xf4\x4d"
+ "\x48\x28\x7d\xa3\xe1\x13\xe2\xf4\x90\xa6\x6f\x42\x71\xf4\x0d\xe4"
+ "\x99\xdb\x9b\xa8\xe9\x19\x07\xeb\x19\x6e\x2f\x78\x2d\x3b\xac\xf4"
+ "\x4c\x01\xe6\x3a\x06\xd6\x33\x21\x94\x09\xeb\x7a\xa6\x57\x96\xb7"
+ "\xb1\xae\xe9\x7b\x91\xa0\x3f\xad\xc4\x3a\x46\xea\x93\xe0\xd8\x20"
+ "\xeb\x13\xd0\xef\xde\x58\x7d\x02\x78\x0e\xdc\x9b\x35\x3d\xd5\x84"
+ "\x99\x6e\x10\xfa\xc4\xb5\xa0\xdc\x8f\xbe\xfe\x14\x73\x7f\xe8\xed"
+ "\xf2\x32\x87\xa7\x3c\x48\xd0\x03\x6e\xd1\xe6\x20\xe0\x08\xfe\x0d"
+ "\x41\x57\x10\x41\x2e\xcd\x41\xc8\x38\x78\xdc\xda\x66\xfb\x13\x85"
+ "\x20\xab\xf3\xba\x7b\x3c\x4f\xfa\x33\xcd\xf3\xce\x0a\x1f\xe8\xe3"
+ "\x7d\xd2\xe6\x80\x7e\xc9\xf4\xb5\x76\x7f\x40\xf9\x9d\x22\x9c\x5f"
+ "\xec\xb5\x42\x06\xac\xf3\x56\xb8\x4d\x4f\xae\x36\x43\xce\x84\x1b"
+ "\x7a\xf1\x7f\xcd\x3b\x6b\x36\x2d\xee\xa4\x6f\xe4\x2f\x11\xe1\x10"
+ "\xe4\x0c\xed\x75\xa1\xdd\x8d\xc0\xbd\x09\x32\xe7\x86\x9c\x99\x83"
+ "\x31\x72\x06\x99\xd9\x85\x7b\xab\xa2\xdf\x38\x37\xe4\xac\x31\x2c"
+ "\xc7\xb3\x4e\x39\xc7\x44\x3d\x6e\x5e\x8b\x83\xac\x35\x86\xab\x95"
+ "\xac\x85\x55\xb9\xf6\x30\xd3\xcf\xa0\xc9\x1a\xfa\x02\xef\xbd\xf8"
+ "\xf9\x20\x3f\xf1\x65\xcd\x16\x21\x6b\xab\x35\x59\x4b\x51\xb2\x86"
+ "\x3e\x4d\x0c\x6d\x52\xf2\xc6\xf0\x79\x1e\xda\x2f\x6f\xa9\x99\x66"
+ "\xdc\x27\x28\xde\x91\x32\x87\x71\x25\x33\x17\xf2\x96\x0d\x79\x03"
+ "\x3c\xe1\x63\xbd\x09\xde\xfc\x0f\x1e\xeb\xe6\xdb\xc4\x7f\x14\x85"
+ "\x46\x3b\x20\x4f\xb9\xd0\x65\x7f\x81\x1e\xfd\x8f\x27\xfd\xd4\x08"
+ "\x79\x32\x43\x8e\xac\x90\xa7\x6c\xc8\x15\xcb\x53\x53\x68\x13\xc3"
+ "\xbc\xa3\xa9\x1f\x86\x1c\x2b\xa3\xe5\x69\xb0\x75\xd0\x5e\xa7\xb5"
+ "\xc2\x4b\xbf\xb1\xb1\xbd\x82\xfb\xed\x5e\x3a\x3a\x5b\xbb\x87\xfd"
+ "\xd3\x68\x91\x76\x0c\x64\xd0\x56\x49\x37\x9e\xa1\xb1\x79\xe0\x77"
+ "\xc2\x7d\x32\xee\xf3\x17\xdc\xfe\x11\xec\x88\xba\x5a\xd4\xdb\xcb"
+ "\x72\x28\x9c\x39\x6c\x9f\xe5\x82\x0f\x93\x44\x6f\x66\x32\xec\xcb"
+ "\xd3\xa2\xcf\xc2\x6b\x6d\x26\x3c\x8f\x44\xfb\xd3\x71\x4d\xdd\x7f"
+ "\x89\xd2\xf0\xb3\xec\x77\x86\x1d\x6c\x3b\xe1\x3e\x5b\xac\xb7\x0c"
+ "\xdf\xb5\x8e\xb2\x4c\x7e\x4a\x6a\x70\x86\x0b\x4d\x5b\xcc\xbc\xe6"
+ "\x94\xc6\xf7\xc2\x79\x60\x5a\xc3\x25\x32\xf2\xba\x40\x38\x05\xf5"
+ "\x95\x9b\x84\x58\x9b\x49\x0d\x6b\xa0\x1f\x9c\x64\x69\x70\x8a\xa6"
+ "\x50\xaf\x94\x49\xab\x8e\x0b\xe3\x06\x3c\x6f\x06\x9e\x8b\x1f\xd9"
+ "\x90\x4b\x9f\x94\x53\xdc\xb5\xda\x5e\xe7\xd8\xfe\xf6\x0f\xf2\xbe"
+ "\x4e\xa7\xc9\x20\xef\x8f\xea\x74\x1a\x64\x5d\xcf\xc8\x63\x74\x68"
+ "\x9d\xf0\x55\x3d\x43\x4c\x0b\x8b\x3d\x28\xfe\x13\x74\x74\x54\x86"
+ "\xe8\xe6\x05\x1b\x6e\x11\x9e\x6e\x01\xfe\x3c\x4b\x0d\x78\x5f\x59"
+ "\x21\xc2\xe1\x94\x9c\xe3\xa2\x3a\xa7\xb9\x67\x9d\x08\xf2\x5a\x4e"
+ "\xaf\xf3\x56\xab\x97\xbe\xe3\x56\x7d\x91\xd1\x28\xe7\x90\xe6\x9c"
+ "\x66\xc0\x4a\x61\x58\xad\x28\x1f\xaa\xce\x69\x41\xbe\x3c\x2f\xfd"
+ "\xae\x50\xe6\x33\x67\x34\xda\x36\xd2\xd7\xcf\xd0\xad\x92\xc6\xc2"
+ "\x95\x73\x92\xf5\x01\xd2\xcc\x48\xdb\x01\xf8\x5e\xe4\x2f\xf7\xd2"
+ "\x7b\xbb\x95\x1d\x7b\xeb\x0e\x3d\x1f\xee\x8b\xf9\x3e\x8a\x7f\x12"
+ "\xe4\x62\x3a\x60\x59\x07\x36\xab\x12\xb4\xe5\x75\xfd\xcf\x8c\x5f"
+ "\x6e\xfc\xd7\x03\xfa\x7c\x9c\x15\xb6\x16\xd9\x37\xd3\x18\xf4\x0f"
+ "\xf0\xbb\x2d\x01\xf3\x88\xd3\xc2\x79\x6b\xed\x1b\x1b\x03\x98\x27"
+ "\xdc\x96\xec\xa5\x97\x9b\x07\xa3\xa7\x60\x5b\xe7\x92\xe8\xaa\x5a"
+ "\xd7\x4f\xcb\xcf\x16\x6c\x08\x0b\xbe\x67\x7d\xd4\x80\x74\xa6\x1b"
+ "\xe0\x2c\xd2\x69\x36\x78\xbf\xe4\x74\xa8\x39\xe7\x6d\x87\x85\x53"
+ "\x90\xfb\x1b\xbc\xc7\x74\xdb\x7b\x8a\x0e\xe3\x9a\x7a\xa0\x47\x78"
+ "\x9d\x18\x73\x33\xff\x5a\x8b\x08\x00\xe6\x41\x2f\x65\x65\x6b\xeb"
+ "\x50\x7e\x4f\x70\x0e\xeb\x96\xb8\xe3\x16\xef\x89\x0d\xc0\x4f\x3f"
+ "\xd1\x36\x06\x7a\x48\xea\xa6\xd5\xc6\x4a\x85\x77\x80\xe1\xba\x2b"
+ "\x2f\x50\x27\xde\xaf\xf5\x8b\x2e\xe1\xb2\x05\x78\x1e\xe1\x5e\x77"
+ "\x99\xd3\xfe\x04\xde\x16\xee\x35\x8c\x53\xfa\x9f\xdc\xdf\xb8\x4c"
+ "\xa7\xcb\x29\xb1\xa1\x7f\xfd\x27\xdd\xcd\xeb\x3d\x6a\x9d\x2b\x3d"
+ "\xd7\x4b\x13\x02\x3a\x5e\x6c\x63\x80\xbe\x4c\xeb\x46\xb6\x35\x78"
+ "\xef\x61\x6d\x85\x08\xb0\xcd\x81\xbc\xa5\x7a\x1b\xb8\x7d\xaa\x5d"
+ "\xe9\x8e\xc8\x76\xf1\x1e\x95\xa9\x42\xd1\x60\xed\x06\x4a\xb2\x2a"
+ "\x5a\x27\x71\x7b\xb9\x2d\xdc\x66\xd9\x16\xa9\x63\x31\x46\x04\x27"
+ "\x63\x3e\x26\xd3\xdd\x80\x85\xf9\x4f\x96\xc6\x53\xe9\xb9\xb1\x7c"
+ "\xd4\xdf\x8f\xe6\x0c\x1b\xe6\xa0\xdf\xb0\x87\xc5\xa9\xd3\x94\xf1"
+ "\xa8\x5a\x3b\xcb\x78\x34\xcc\x76\x76\x80\xf9\x77\xaa\x9b\xc7\x64"
+ "\x4f\x05\xeb\x5b\x99\xf7\x06\xe4\xed\x44\x9e\xb9\x5a\xde\xb9\x6a"
+ "\xcf\x4e\x5e\x87\xf1\x15\xe3\xd8\x73\x5e\xca\x28\xf6\xc9\xf1\xde"
+ "\xe6\xd6\x9f\x31\x77\xc7\xfc\x2f\xc3\x22\xaa\xa7\xba\xe3\xe3\x92"
+ "\x69\xe3\xf1\x2c\x74\x49\x74\xa3\x9e\x9b\x98\xa7\xec\x1b\xe8\x6b"
+ "\xe0\xcb\xcf\x2a\x37\xd3\x0d\xcc\x4f\x22\x25\xa7\x53\xd1\x3d\xe3"
+ "\x90\x70\xc2\xf6\x84\x46\xb5\xad\xa3\xaf\x43\x8e\x4e\x9e\xa1\x8c"
+ "\x8f\x8b\x2a\xac\xc0\x95\xa8\xea\x1c\x91\xd4\x41\x29\x39\x5e\x4f"
+ "\xf0\x73\x6a\x38\xc7\x6b\x3b\x19\x5e\x9d\x17\x71\xdf\x7d\x35\x7d"
+ "\x01\xba\xfa\xd4\xda\xc3\xb8\x47\x79\x9f\xe1\x14\x8d\x9b\xcd\xed"
+ "\x55\x7b\x9c\xe3\x26\x8b\x4b\x62\xb1\x50\x63\x1a\x60\x8e\xb3\xe1"
+ "\xea\x93\x3f\x27\x15\x6b\xcf\x5e\xe4\x4b\x17\x97\xc2\x9c\xc7\x87"
+ "\xb4\x69\xc2\x99\xc0\x32\x71\xb4\xd7\x39\xae\xc4\x4b\x33\x3a\x54"
+ "\xdf\x8c\xcb\x61\x58\x83\xe0\xe0\x45\xdf\x12\xf3\x26\x60\xfd\xc1"
+ "\x5a\xc9\x6b\x97\xe3\xde\x94\x72\x01\x58\x0d\x06\xa5\xb7\xc3\xc0"
+ "\xb5\xde\x19\x2e\x81\x8e\x2e\x09\xd7\x4c\xcf\x93\xf7\xda\x3b\xa1"
+ "\x8d\xa3\xf1\xe1\xaf\x36\xba\x47\x33\x8f\x8f\xcf\x52\x70\x6c\x01"
+ "\xf7\xe8\x33\xfc\x3c\x81\x9f\xfd\xe6\x19\x79\x9e\xda\x5c\xd4\x7f"
+ "\x06\xf5\x8e\xcf\x52\xf3\xf9\xf1\x13\x7a\x50\x47\xaf\x73\x7c\x96"
+ "\x97\x26\x19\xd5\x9e\xcb\x8c\xbc\xc1\xf6\x92\x59\x76\x58\xe6\x94"
+ "\x4c\x67\x9e\x6d\x6d\x94\xf2\xd7\x0e\x9e\xf7\x69\x7a\x83\xd7\x69"
+ "\x92\x4f\x51\x66\x77\xab\x45\xf2\xb7\x41\x18\xc6\xef\x78\x2b\xec"
+ "\x33\xf0\xbe\x98\x52\x5f\x99\xdd\x57\xfe\xc6\xbb\xf1\x6b\xc7\xef"
+ "\xa4\xf6\xdc\x85\x5f\x10\xf7\xf9\xf8\x9d\x94\xb4\xdb\xb7\x34\xc1"
+ "\x8b\x77\x3d\xb0\xd9\xf9\xd9\x4b\xe3\x8f\x8b\x7d\xe9\x06\xd8\x25"
+ "\xf2\xbe\xe1\x6b\xbc\x4e\x30\xde\x8f\x3e\xa8\x50\x7d\x91\x29\xd7"
+ "\x54\x80\x1b\xd3\x5d\xd8\x6b\x45\xa0\xb9\xd2\xcf\x78\xa7\x37\xd7"
+ "\xfa\xc9\x3a\x8e\xdb\x9f\x99\xc9\x6d\xf2\x83\xfe\x7c\x5d\x5b\x2b"
+ "\x7c\xc7\xea\x82\xc4\xfb\x73\xbd\xce\x4c\xc8\xff\x8a\x7c\xb5\xe6"
+ "\xb0\xda\xca\xf0\x34\x9e\x10\x7a\xfb\x95\x4e\x9b\x91\xc7\x7d\x89"
+ "\xe7\xe7\xd1\x76\xd3\x39\xca\x7c\x4f\xa4\x4e\xcf\x3b\x56\x42\xb4"
+ "\x1f\x7a\x04\x63\x8d\xdc\x2b\x68\x90\xfe\x01\x99\x18\xff\xc7\x9d"
+ "\xd4\xf7\x93\x76\xe2\xfd\x2e\xbc\xc3\xd8\xe3\x6b\x2d\x09\x10\xc3"
+ "\x0a\x71\xfb\x50\xfe\x83\xb0\xcf\x88\xb1\x1a\x7d\x3e\x23\xaf\xd2"
+ "\x06\x3d\xd3\xaf\xb7\x32\x17\x6f\x3e\x2b\x02\x7a\xfb\x8e\x35\xb2"
+ "\x2c\x64\x82\xff\x9f\x2d\x19\x94\xff\xfb\x71\xbe\xe3\xba\x63\xe9"
+ "\xaa\xcf\xc2\xa0\x4b\x74\x9f\xdd\x91\xa4\xfa\xeb\xf6\x69\xd1\xfd"
+ "\x75\x07\x6c\x9b\xdb\xb7\xe1\x57\x87\xdf\x21\xf5\x1c\xf9\xbb\xdd"
+ "\x16\x71\x7f\x14\x3f\xe8\xce\xdb\x31\xfe\x67\x04\x54\x3f\x70\x3a"
+ "\xda\xc1\x3c\xf2\x77\x4a\x0a\xf7\x15\x12\xef\xd7\x72\x3a\xf3\x33"
+ "\xa7\x87\x61\xcf\x78\xe9\x76\x17\xde\x9b\x59\x56\xab\xc2\x14\xf5"
+ "\xde\x83\xda\xdd\x1b\xa1\xab\xe9\xf6\xcf\x18\x96\x69\xcb\xf6\xed"
+ "\xcc\xa7\x28\xb3\xdb\x14\xdc\xbe\x1d\xf5\x75\xeb\x74\x45\xda\x09"
+ "\x7e\xcf\x3c\xd9\xeb\xbc\xc3\x08\xba\x1c\x94\xfb\xb1\x98\xef\xc5"
+ "\xb7\x35\xee\xc8\xec\xb7\xc9\xcc\xe3\x0b\x58\x1f\x75\xd3\x37\x73"
+ "\xa0\xb3\xd0\xb7\xd3\x73\xd5\x58\xf3\xcd\xc9\xfc\x0c\x5d\xf9\x19"
+ "\xee\xb3\x5b\xa1\x93\x2e\xd7\xe4\xe4\xf5\x19\x68\xd8\x65\x03\xe5"
+ "\x06\x6b\xea\x8e\x06\x53\xb3\x16\x79\xba\x0e\x53\x5b\xf0\x57\x64"
+ "\x7d\x46\xc2\xb8\xdd\x03\x1e\xb0\x6f\x10\xa1\xb7\x2f\x1f\x34\x7a"
+ "\x82\xe7\xdd\x18\x9b\x6f\x39\x43\xdf\x94\xf4\x78\xf9\x14\x46\xfd"
+ "\x27\x25\x6c\x8d\x3e\x75\xb5\xbb\x96\x8b\xe0\xae\xd3\xc2\x0f\xfb"
+ "\x6e\xf8\xce\xcb\x94\xf5\xfa\x46\xca\xae\xbb\x4c\xe9\xf5\x97\x29"
+ "\x53\xfc\x35\xd3\x50\x07\xbb\xed\xc9\x8b\x66\x82\x4e\xe0\xf5\xbb"
+ "\xa4\xfa\x8d\x24\x79\x24\x54\x0d\xfb\x2d\x08\xfb\xed\x7c\x26\xeb"
+ "\xc6\x7e\xfb\xad\x4f\xda\xc5\x93\xf3\x15\x1f\x4d\xce\x1f\x51\x42"
+ "\x09\xc9\xc5\x64\x06\x7e\xf6\x73\x74\xc7\x8a\x64\x0c\x88\xdc\x66"
+ "\xaf\xd6\x5e\xd0\xbc\xc2\x54\x42\xc3\x64\x5b\xa1\xaf\x45\xf5\xf4"
+ "\xdc\x41\xc7\x61\x03\xf3\x94\x9f\xe5\x86\xdb\xb0\x85\xf7\x8c\x0f"
+ "\x8f\x0e\x18\xd7\xd6\x89\x00\xa7\x97\x8d\x15\x01\xa4\x97\x70\xdd"
+ "\x4d\x48\xef\x75\x7e\xd3\xe5\x35\x5a\xd3\x06\xe3\x51\xcc\x8f\x34"
+ "\xbd\x92\x95\x22\x0c\x0e\xf0\xe8\x78\xd7\xe6\x20\x6c\xef\x73\x2c"
+ "\xb3\x59\xe6\x05\xa5\x22\x68\x5d\xc9\xfb\xf7\x59\xc4\xbe\x05\xbc"
+ "\xa7\xf8\x16\x6c\x9b\x2f\xf3\x27\xe0\xf1\x82\xe7\x0a\xa6\x52\x07"
+ "\xcf\x3d\x5c\x02\xf3\xf3\xaf\xea\xcf\x80\x76\x26\xbf\x32\x8a\xfd"
+ "\x6c\xb2\xf2\xbd\x94\x7f\x80\x71\x97\xbe\x34\xd0\x9d\xb0\xb7\x6e"
+ "\x00\x5e\xdb\xfd\xa0\x03\xde\x63\xfc\x9f\x5b\xae\xed\xff\xfa\x78"
+ "\xef\x15\x69\x18\xff\x1f\x3c\xca\x69\x65\x63\xc9\x52\x66\x15\x5d"
+ "\x83\xd9\x4c\xbc\x27\x0d\x78\x37\xa1\xcc\x61\x1d\x0e\xc6\xa9\x9f"
+ "\xf7\x18\x1e\x79\x04\x69\xc7\x75\x38\xc8\x73\x23\x9e\x3b\xfa\xf3"
+ "\xa8\x32\x5d\x11\x65\x1e\xe9\x31\xdc\xf1\x73\xa4\x05\xa3\xcb\x4c"
+ "\x48\x8e\x2e\x33\x61\x4c\x44\x19\x87\xaa\x67\x42\x76\x4c\x99\xdc"
+ "\x98\x32\x05\x57\xe2\x36\x61\x69\x4c\x99\xb2\x98\x32\xdb\xae\xc4"
+ "\x6d\x42\x6d\x4c\x99\x83\x31\x65\x8e\x44\xd0\x92\xfd\x6a\xb2\x91"
+ "\xd6\x12\x53\xe6\x64\x4c\x99\x6e\xfd\x79\x10\x1a\x27\xaf\xdd\x4f"
+ "\x16\xf0\x26\xfb\x6e\xf9\x5e\x41\xff\xf4\xec\x7d\xb6\x57\x95\x9d"
+ "\x98\x79\x65\xbb\x26\x4e\x8b\xae\x6f\x62\x7e\x74\x7d\x13\x17\x5f"
+ "\xd9\xae\x89\xb6\x98\x32\x8e\x98\x32\xae\x88\x32\x8d\x5a\x3d\x07"
+ "\x62\xca\x1c\x8e\x29\xd3\x7c\x25\x5f\x4d\xec\x88\x29\xd3\x15\x53"
+ "\x26\xf0\x25\xb4\xe0\x71\x5c\xf9\xb5\x8d\x62\x5b\xf9\x3e\xd8\x08"
+ "\x93\x96\xb0\x6f\x04\xef\x83\xbe\x71\x39\x30\x84\xf7\xe7\x78\xbc"
+ "\x3a\x56\x1e\xc0\xd8\x32\x09\x7a\x36\xc7\xad\x8f\x59\xec\x37\xc2"
+ "\x32\xad\x6c\xec\x49\x99\x83\xd9\xa2\xd2\xf7\x4c\xf3\x5f\xe3\xba"
+ "\x8e\x8d\xe1\x71\x6a\xd2\xee\x7e\x9b\x58\xf9\xa0\x91\x06\xe7\x6f"
+ "\xfa\x3e\x6c\x83\xf2\x47\x49\x60\x9b\xfc\x58\xb9\x2c\x73\x3c\xc2"
+ "\x8e\xe6\xfa\xfd\x87\x37\x06\x8c\x31\x78\x1c\xbc\x0a\x1e\xc9\x98"
+ "\x03\x74\xb5\x61\xf4\xe2\xfd\xf5\xd6\x3a\xd8\x40\xb0\xfb\x19\xb7"
+ "\x53\x94\x9d\x2d\x6d\xb2\x95\x97\x89\xef\x3d\x15\x53\xe5\xfe\xbb"
+ "\xb2\x49\xb3\x4b\x9a\x51\x3f\xdb\xee\xcd\xb6\x0b\xec\x23\x85\xf1"
+ "\x97\x6d\xb7\xec\x57\x8f\x55\xf8\x80\x57\x76\xb1\xee\xa7\xe2\xa5"
+ "\xec\xdd\xd2\xd6\x70\xd9\x78\x7f\xdd\xc7\x3e\x34\xc7\xfc\x53\x38"
+ "\x0f\xf8\x7f\x52\xa9\xde\x5e\x8c\xf5\xb0\x1d\xb3\xa7\x5d\x8d\x66"
+ "\xaa\x0f\xb3\x8f\x46\xf3\xe4\x10\xf0\x4a\x76\x7b\x74\xbf\x67\x7b"
+ "\xa3\xfb\x3d\xdb\x17\xcd\x93\x06\xf0\xe4\x9d\xc6\xe8\x32\x77\xa6"
+ "\x45\x97\xb9\x33\x3d\xa2\x8c\x4b\xd5\x73\xe7\x94\x98\x32\x79\x31"
+ "\x65\x0a\x23\x9e\xd1\xc6\x3b\x4b\xfa\xe7\x3e\xd2\x07\xea\xce\xf2"
+ "\x88\x67\xc3\x6e\xa9\x3f\xef\xdc\xa1\xa7\xf1\xda\x51\xfd\x1e\xe5"
+ "\x83\xa3\xc1\x3b\x18\x23\xef\x9c\xff\x68\x0c\x0e\x2d\x31\x38\xf4"
+ "\xcb\xbf\xb6\x77\xff\xdb\xd3\x74\xd7\x61\x6d\xef\xbe\x1b\x63\xf6"
+ "\x02\x7e\x06\xac\x5a\xe4\x07\x1d\xee\x4a\x8e\x86\x77\xd7\x98\x68"
+ "\x78\x77\x65\x45\x3c\x9b\xf1\x3c\x2d\xa2\x0d\xe6\x44\x0b\x25\x80"
+ "\x5f\x60\xbf\xdd\xb5\x48\x4f\xe7\x39\x25\xf0\xed\xb2\xcb\xb1\x26"
+ "\x97\x7d\xcb\x52\x4f\xd1\x5d\x33\x79\xfe\xa9\xc1\x8c\x94\x7f\x52"
+ "\xed\xba\x6b\x77\x0c\x1e\x07\x62\xf0\x38\x1c\xd1\x2e\xbf\x69\x0b"
+ "\x3d\x64\x0a\x3e\xfc\x28\xdb\x3e\xec\x4f\x29\x7d\xbc\x36\xc3\x66"
+ "\xbb\x48\x66\xf6\xad\x3b\x5d\x46\x89\x9e\xf2\x2e\xcc\xe5\x26\x0f"
+ "\x6a\xb3\xf7\xa4\xda\x7c\xca\xb7\x8a\xac\xbd\xce\x6f\xa5\xe9\xfc"
+ "\x18\xae\xb1\xf9\xc2\xd5\xd3\x92\x91\x06\xfd\x97\xdd\xa8\xec\xdc"
+ "\xef\x14\x0a\x7b\x61\x2d\xe8\x89\x79\x51\xce\x8d\x6a\x1e\xb1\xda"
+ "\xc8\x3e\x62\xec\xc7\x8a\x31\x3e\x59\xed\xc3\x7f\x6b\x71\x04\x5f"
+ "\xfb\xad\x1b\xef\x15\xa7\x28\x67\x2c\xdb\x00\x2c\xa3\xec\x6b\x76"
+ "\x2c\xe8\x23\x9e\x7b\x7b\x82\x67\xa4\xed\x86\xf7\x56\xad\x6c\x6d"
+ "\x44\x59\x9f\x36\x37\xee\xe2\x77\x93\x82\x64\x3c\xe6\xf7\x11\xe0"
+ "\xa4\x29\x7b\x2f\x67\xec\x31\xc8\x2b\xca\xb4\xe8\x65\x78\x1e\x2d"
+ "\xf7\x78\xcb\xc8\x38\xb1\x82\x8c\xee\x8d\xa7\x24\x6c\xdd\x6f\x03"
+ "\xb6\x74\xb7\xa7\xa2\x8b\x3c\xfe\x0e\x5e\xeb\x32\x2a\x1f\x9d\x1c"
+ "\x6b\x62\x80\x92\x7a\xaa\x6d\x90\x99\x1c\x6b\xa8\xda\xd6\x85\xf9"
+ "\x12\x6c\xcc\x6f\xcd\x66\x7d\x13\x49\xbb\x39\x73\x0a\x1e\x5e\x30"
+ "\x6f\xc2\xf7\x1f\x9e\xbb\x68\xce\x54\xeb\xa2\x15\xcf\x2d\x5b\x3a"
+ "\x61\xd5\xf3\x65\xd6\xf5\x6b\x56\x94\xad\x58\xf9\x03\x6b\x76\x79"
+ "\x46\xb9\x75\x49\x99\xba\x66\x96\x2e\x59\x5b\x36\x9d\x6f\xb3\xac"
+ "\xb6\x35\xcb\xd6\xc9\xdb\xdb\x87\x53\x34\x90\x15\x65\xcb\xd6\x58"
+ "\x33\x96\x66\x59\xef\x5f\xb2\xa2\xf4\xf9\x35\xcb\xe2\xc2\x9a\x6a"
+ "\x5d\xb3\x6c\xcd\xb2\x25\x4b\xad\xd3\xad\xd9\x0c\x39\x12\x5c\x44"
+ "\x7f\x66\xeb\xe3\x18\x8f\x5f\x55\x4e\xd1\xae\x8d\x67\x5e\xc5\x3f"
+ "\x39\xfe\x2b\xc7\xb2\xc9\x49\xd1\x3c\x37\xd9\x12\xcd\x73\x93\x33"
+ "\xaf\x1c\xcb\x26\xc7\x8c\x7f\x93\x63\xc6\xbf\xc9\x8b\xaf\x1c\xcb"
+ "\x26\xc7\x8c\x7f\x93\x63\xc6\xbf\xc9\xfd\xe3\x1f\x78\xc9\xbb\x55"
+ "\xea\x85\xc9\x31\xe3\xdf\xe4\x98\xf1\x6f\x72\x73\xcc\xf3\x89\x88"
+ "\xe7\x1b\xf0\xdc\x19\x39\x3e\xe2\xd9\xaf\xcb\xe7\x80\x7e\xb9\x3b"
+ "\x49\xcf\xc3\xba\x1e\xba\xb9\x53\xe5\xbd\xdb\x1a\x91\xb7\x4b\xcb"
+ "\x9b\xd3\x2f\x7f\xbc\xaf\x8d\x74\x35\x5f\xbf\xfb\x35\xd6\xe9\xec"
+ "\x8f\xc7\x63\x13\xe4\xe3\x96\x73\x74\x77\x0a\xc3\x62\x1e\x66\xff"
+ "\x4c\xb1\xf7\xf1\xde\x86\x54\x4a\xe2\x32\x0d\x35\xec\xd7\x9b\x93"
+ "\xc5\xbe\xba\x48\x63\xdf\x65\xe8\x94\xbb\xd9\xfe\xed\x54\xe3\xc5"
+ "\xdd\x5e\x69\xf3\xa3\x8c\x06\x5f\xce\x6b\x00\x87\x7d\x81\x93\xaa"
+ "\xd4\x58\xdc\x89\xfb\x64\xe6\x69\x94\x37\x0a\x43\xce\x6a\xf6\x81"
+ "\x46\x9a\x19\xbf\x34\xc0\xf3\xea\xf0\xb6\x8d\x8a\x6f\x5b\xc6\xda"
+ "\xb9\xfd\xf3\x41\x03\x99\xaa\x9c\xe1\x0e\x4f\x98\x6d\xeb\x6f\xa7"
+ "\xa9\xb5\x85\x9c\x12\xe1\xfc\xa8\xb0\x01\xe9\xf1\xe7\x49\xdf\x86"
+ "\xfd\xf7\xed\x24\xb5\xde\xf2\x6d\xf4\xff\xbc\x1c\xb5\x76\x9a\x53"
+ "\x02\x7d\x7b\x19\x70\x2e\xe2\xda\x87\xeb\xbf\xeb\xf0\xdd\x72\xbe"
+ "\xfd\xed\x32\xe1\x4c\x58\xc8\x70\x63\xd2\x77\x40\xbf\x5d\x36\x05"
+ "\x1d\x85\x71\xde\x1d\x14\xce\xc4\x87\xe3\xa4\xbb\x61\x33\x5c\x06"
+ "\x1e\x7e\xc6\x37\x22\xbd\x43\x38\x47\x2e\xe2\xfc\x5e\xae\x0f\x65"
+ "\x06\xb3\xb5\x75\xff\x5b\xe5\xc3\x3f\x25\x3d\xa6\x1d\x5f\x9c\xa6"
+ "\x29\x3f\x56\xed\x98\x12\x8a\xae\x7b\xca\xb4\xf8\xed\x98\xb2\x08"
+ "\xed\xf8\x22\x7e\x3b\xa6\xd8\x24\x6d\x0d\x68\x8b\xe1\x8a\x77\x3b"
+ "\xd0\x96\x2f\x24\xdd\xa3\xd3\x0f\x68\xb6\x90\x1f\xf3\x30\x33\xde"
+ "\xc9\xb2\x0b\x2b\x06\xfa\x4d\xcb\xd7\x62\xaa\xa5\x82\x38\x75\x76"
+ "\x0a\xe7\xb0\x85\x5e\xba\x47\x9e\x6b\x88\x48\x0f\x2a\x5c\x40\x27"
+ "\x03\xd3\x09\xed\x41\xb9\xc1\xfa\x5b\x9f\x97\xa8\xb5\x90\x7b\x20"
+ "\xff\x53\x48\x5f\xcb\x5c\x5b\x21\x7c\x3a\x1d\xf1\xae\x24\xe6\x5d"
+ "\x20\xe2\xdd\xb6\xa8\x77\x9b\xfb\xd3\xeb\xf4\xf4\xaf\xd6\x4f\xf7"
+ "\xb4\xc4\xf4\x13\xfa\x67\xea\x13\xd1\xed\xbe\xe7\xa4\x6a\x1f\xfa"
+ "\xe8\x0a\x5a\xdf\x13\x40\x1f\xf5\xc5\xef\xa3\xa9\x69\xf1\x79\x6d"
+ "\xaa\x5c\x47\x13\xa9\x14\x07\xde\xd4\x3c\xf4\x5d\x9f\xe4\x41\xad"
+ "\x9f\xae\xec\x9f\xa9\xa5\x7a\xff\x7c\xb5\x36\x4e\x6d\x8a\x69\x63"
+ "\xe8\x34\x7d\x67\x82\x6a\xeb\x77\x36\xc7\xc0\x3e\x1e\x9f\x17\xa7"
+ "\x7a\xd1\xce\xd0\x20\xed\x0c\x0e\xce\x8b\xdf\xb1\xa0\x3d\xa1\x2b"
+ "\x79\xf1\x3b\xd9\xaa\x0c\xc5\x2b\x93\x2f\x9c\xf1\xea\xf9\xce\x52"
+ "\x7b\x90\xed\xdc\xef\xd4\xf1\xfa\x52\x44\x7a\x45\x34\xff\xa1\x0d"
+ "\x5c\x8e\xe9\x17\x54\x7a\x96\xfb\xe1\xb4\x95\x0c\x5f\xc6\x93\xbd"
+ "\xce\xef\x9c\x8c\xa1\xd5\xf9\xd3\x34\xed\x89\x1e\x43\xc2\x01\x45"
+ "\xaf\xe9\x63\x63\x70\x0a\xc4\xa7\xd7\x34\x33\xe8\x75\x3e\x3e\xbd"
+ "\xa6\x65\x0d\x4e\xaf\x69\xdc\xff\xe7\xaf\xa4\xd7\xb4\xe2\x48\x7a"
+ "\xc1\xd6\x95\xed\xbb\xcd\x02\xde\xe8\x2b\x12\x0d\xdc\xd6\x10\x99"
+ "\x4d\xe0\x15\x55\xa6\x9b\xcb\xec\x36\x05\x14\x9f\xc0\x86\x4c\x3a"
+ "\x47\xd3\x2a\x74\xf9\x1f\x59\x4b\xc3\x44\xdf\xe3\xec\x47\x94\xc0"
+ "\xe5\x3c\xe5\xe7\xdd\x9e\x60\x36\xf1\xfc\x23\xa6\xde\x8e\xf8\xba"
+ "\x60\x9a\x0f\x34\xad\xb9\x32\x7d\x7a\x92\xf2\x23\x9b\x9e\x1b\xad"
+ "\x23\xa6\x5b\xa3\xfb\x08\x74\x43\x39\x6d\xdb\xe9\x4b\x7f\x57\xef"
+ "\xb3\xe9\xae\x2b\xfb\x6c\xc6\x9d\xaa\xbf\x66\xa4\xc4\xe0\x77\x30"
+ "\x7e\x7f\x4d\x77\x0f\xde\x5f\xd3\x4f\x0e\xde\x5f\xd3\x79\xfd\xf4"
+ "\xbc\x97\x66\x64\x47\x8f\x1b\x33\xcc\xd1\xed\x45\xbd\x28\x27\x0c"
+ "\x43\x6f\xe0\xe7\xaf\xda\x6e\xfd\xc7\x3a\x8e\xfb\x8a\xcf\x15\x01"
+ "\xff\xb1\x8c\xe3\xb5\xc2\x18\x14\x36\x68\xe8\xda\x18\x7f\xbf\x95"
+ "\xe7\xb8\x6d\xb5\x44\xbc\x8f\x6c\xfd\x06\xdb\xee\xf7\x0e\x09\x1b"
+ "\xa8\x03\xf7\x86\xd3\x94\xfb\x87\xb0\xc1\x50\xc1\x7b\x9e\xd2\x6f"
+ "\x5d\xae\x21\xdc\x3b\x26\xb2\x2f\x78\xef\x93\xe7\xa6\xbb\xd4\xdc"
+ "\xe9\x2f\x28\xff\xa6\xea\x97\xdc\x77\xa2\xe9\x78\x6f\x6e\xfc\x7e"
+ "\xb9\xb7\x10\xfd\xf2\x97\xf8\xfd\x72\x6f\xd9\xe0\xfd\x72\xaf\x0b"
+ "\xfd\xf2\x97\x2b\xe5\xe8\xde\x83\x9a\x1c\x6d\xe5\x32\xd6\x95\x3c"
+ "\x1f\xcf\xfd\x1a\xe7\xc1\x3d\x64\x24\x57\xd2\x64\x42\xb7\x2e\x47"
+ "\xb2\xcc\x49\xc0\x92\xf5\xab\x3c\xf7\x76\x68\x30\x22\xe0\xe6\x92"
+ "\xa9\x3b\x9e\x9c\xe4\x5a\x38\xef\x44\x1b\x25\x81\x86\x85\xfb\x19"
+ "\xc6\x1a\x22\xd4\xf3\x1c\xe7\xe3\xf4\x89\xfe\x48\x39\xc9\xcd\xd3"
+ "\xf3\xb1\xae\xd3\xf2\xe6\x8a\xde\x12\xe2\x7c\x31\xb0\xb5\xf6\x0f"
+ "\x93\xe3\x08\xe7\xe7\x7c\x31\x79\x6a\x95\x3c\xe6\x9e\x8c\x96\xc7"
+ "\xdc\xa6\x68\xfe\x04\xfd\x51\x2e\x0c\x3d\x87\x7b\x23\x70\xf8\xca"
+ "\xfc\x75\x75\xd9\x9c\x99\x15\x23\x9b\xe0\x81\x99\xad\x8a\x07\x66"
+ "\xfe\x32\x1a\xd7\x99\xb3\xe3\xf3\xc0\xcc\xc5\x83\xf3\xc0\xcc\xf2"
+ "\xc1\x79\x60\xe6\x6e\xe6\x01\x2f\xcd\x6c\x89\x96\xcd\x99\x87\xa2"
+ "\xdb\x8e\x7a\xa5\x6c\x52\xca\xb5\xc8\x26\x6c\xa1\x1b\x06\x93\x43"
+ "\x96\x29\xf6\x1f\x69\xb8\xac\xef\x75\x7c\x25\x9a\x25\x41\xae\x80"
+ "\xdf\x7d\xc5\xbc\xa6\x04\x1d\x3f\x85\x69\x58\x2f\xcf\x63\xde\x57"
+ "\x16\x49\xc7\x5d\xea\x0c\xa4\x1d\x79\xbf\xe0\x7d\x65\x45\xcf\x59"
+ "\x1f\x47\xb7\xff\xbe\xdd\xf1\xe9\x79\xdf\x21\xd0\xd3\x1e\x9f\x9e"
+ "\xf7\x1d\x1f\x9c\x9e\xf7\x75\xf2\x19\xa9\x2b\x65\xea\xbe\xa0\x75"
+ "\x9d\xb4\x51\x64\x99\x73\x34\xeb\x91\xaf\x36\x3e\xcd\xca\x89\x1e"
+ "\x9f\x66\x8d\xb9\xf6\xf1\x69\x56\x79\xfc\xf1\x69\x96\x2b\xfe\xf8"
+ "\x34\xeb\xa0\x92\x87\x59\xde\x68\x79\x98\xe5\x8e\xe6\x09\xd0\xee"
+ "\x7f\x6c\x7c\x9a\x9d\x1d\x23\x03\x55\xa7\x69\xf6\x3b\xb0\x29\x1c"
+ "\xaa\xdf\xe6\x3c\x1f\x8d\xe3\xec\xfc\xf8\xfd\x36\x7b\x29\xfa\xad"
+ "\x2a\x7e\xbf\xcd\x76\x0c\xde\x6f\xb3\xeb\xd0\x6f\x55\x57\xf6\xdb"
+ "\xec\xc3\xd7\x6e\x53\xcc\xee\x8a\xee\xb3\xd9\xed\xd7\xde\x67\x73"
+ "\xb2\xe2\xf7\xd9\x9c\xd9\xf1\xfb\x6c\x8e\xe6\x9b\x3e\x67\x77\x74"
+ "\x9f\xcd\x29\x8b\xee\x33\xd0\xed\xbf\xd9\x67\xe8\x9f\x52\xe5\x9f"
+ "\x30\xe7\x22\xe6\xed\xc3\x7a\x9d\x73\xba\xbd\x74\xff\x61\x35\xb7"
+ "\xbe\x5f\x8d\x1d\xaa\x0f\xdf\x46\x1e\xef\x95\xe3\xc0\xfd\x49\x5a"
+ "\xda\xf7\xaf\xec\x87\xfb\xd3\xa1\xa3\xbb\x9b\x2b\xe4\xde\x96\xea"
+ "\x43\xa6\x39\xf2\xb9\x37\xf2\xfe\xd4\xfd\xb3\xb9\x2c\xfa\x58\x78"
+ "\x02\x41\x62\xbd\x8e\xfc\x7e\x86\xc3\x67\x43\x63\x60\xd9\xae\x65"
+ "\x8c\xbf\x8a\x4f\x4d\xa9\xbb\xf2\x2e\xc0\x7b\xe0\x05\xc5\xab\xf7"
+ "\xc7\xda\xbf\x0d\x78\xf7\xa8\xe2\xd3\xb9\x19\x31\x38\xf8\xe3\xf3"
+ "\xe9\x03\xc9\x68\x43\x43\x7c\x3e\x7d\x20\x73\x70\x3e\x7d\x00\xfd"
+ "\x4f\x0d\x11\x73\x9f\xd4\x27\x83\xde\x98\xb9\xcf\x03\x25\x26\xbf"
+ "\xe2\x1d\x69\x13\x55\xe7\x94\xf6\x3a\x1f\x88\xb5\xff\xd0\x37\x79"
+ "\x23\x34\x9c\x87\xc4\x94\x1f\xc4\xfe\x7b\x80\xed\xbf\xb7\x07\xc1"
+ "\xf9\x2a\xf6\xdf\x03\x6c\xff\xbd\x7d\xa5\x6c\xe5\x69\xf6\x5f\xbc"
+ "\x39\x5e\x5e\x56\xfc\xfe\xcf\x8b\xe9\x7f\x2a\x2c\xc3\x7c\x58\x96"
+ "\x8f\xce\x57\x1a\x99\x8f\x7d\x93\x38\x2f\xf3\x48\x9c\xbc\xb5\xb1"
+ "\x30\x07\xc9\xe7\xbe\x82\xf7\xd8\x97\x2a\x2e\xef\xe5\x69\x67\x4a"
+ "\xe6\xce\x8e\x96\xc7\xb9\xc6\x68\x79\x7c\xe0\x60\x74\xb9\xb9\xe9"
+ "\xd1\xef\xef\xf7\xff\xcf\xe9\xd8\xb9\xbb\x63\x78\xe0\xa3\xd3\xf4"
+ "\x60\x8a\xe2\x81\x07\x57\xc4\xe0\x71\x28\x3e\x0f\xcc\x6d\x46\xfb"
+ "\x3f\x8a\xcf\x03\x73\xbd\x83\xf3\xc0\xdc\x20\x68\xf9\x51\x24\xdf"
+ "\x2e\xac\xc8\x1d\x16\x9d\xe7\x41\x6b\x7c\x9d\xf7\xe0\x94\xf8\x6b"
+ "\x04\x0f\x16\x28\x1a\x3f\xb8\x3d\x9a\xc6\x0f\x96\x44\xd3\x10\x6d"
+ "\xf9\xef\xd3\xb0\x3f\x1e\x44\xaf\xf3\xc1\x58\xf9\xf7\x9c\xa6\xef"
+ "\x6a\xf2\x9f\xff\x50\x0c\x8e\x7e\x85\x4b\xbc\x75\x91\xef\xf2\xfc"
+ "\xd7\x13\x9f\x96\xdf\xcd\x8a\xdf\xe6\xef\xce\xc6\x18\xe4\x09\x5f"
+ "\x21\x4b\xdf\x5d\x8c\xf4\x85\xbc\x1e\xca\xeb\x21\xf5\x48\x5f\x18"
+ "\xa4\x24\x39\x5e\xf5\x8f\x4b\xdf\x75\xb0\x2f\x0a\xd3\x9f\xf9\xd7"
+ "\x34\x86\x0a\x78\x0c\x62\xbc\x8a\x2a\xa4\xdf\x82\x69\x1b\xf3\xfa"
+ "\xad\xcc\xeb\xdf\x95\xf6\x1f\xef\xb3\xb0\x1f\xa1\xa9\x9c\x0a\x38"
+ "\x2e\x85\xce\xef\x9c\x3f\x06\xf6\x49\x96\x0b\xce\xaf\xe7\x55\xeb"
+ "\x66\x8e\x18\xdd\x94\x6f\x8c\xdf\xc7\xf9\x63\x06\xe7\x9d\xfc\x29"
+ "\xaa\x9f\xf3\x4b\xa3\xfb\x39\xbf\x20\xec\x1c\xb9\x88\xdb\x0a\x1e"
+ "\xb8\x26\x39\x29\xb3\x8a\xb8\x7e\x5c\x52\xdf\x6f\x7d\xbc\xc3\x56"
+ "\x49\xdf\x38\x43\xf9\x27\x64\x7d\x06\x11\x30\x6d\x49\xa0\x66\xa9"
+ "\x03\xe6\xdd\x2e\xf1\x44\x9e\xa2\x20\x19\xc4\xd6\x67\x3b\xf8\x5d"
+ "\x83\x53\x04\x90\xaf\x9d\xf7\x04\xf8\x6c\x35\x78\xe1\x86\x53\x94"
+ "\x7f\x36\xaa\x3c\x24\xdf\xa3\x60\x64\x36\x48\x79\x9c\x97\xae\xaf"
+ "\xe9\x6e\xc3\x73\xfc\x75\xdf\x79\x79\xba\xef\x83\xf2\x19\x9b\x37"
+ "\xe8\xfe\x25\xe3\xc4\x67\x65\x18\xa7\xab\xeb\x81\x79\x75\x3a\xff"
+ "\x2a\x5f\xcb\x79\x87\x06\x7c\xf9\xe6\x1d\xc1\xbb\xe2\xab\xac\x0d"
+ "\x46\xc8\xc1\xbc\xce\x48\x38\x2a\x26\xca\xbc\x80\xee\x8f\xd7\xeb"
+ "\x9c\x6f\xfc\x12\x58\x1a\x3e\xf3\xb3\xa2\xf1\x99\x3f\x0d\x76\x4a"
+ "\x9a\x06\x23\xef\x6a\x30\xb8\xcf\x15\xcf\x32\x3f\xcc\x2f\xbe\xda"
+ "\x9a\x5f\xa2\x85\x0a\x5e\xb9\x82\xb7\xe6\x4b\x7b\x89\x61\x7c\x09"
+ "\x8e\xed\x51\x73\x0b\xb9\x77\xcf\x7b\x5b\x0b\xf6\x2b\xb9\x5f\x10"
+ "\xb3\x46\x38\xbf\x5b\xfa\x53\x69\x72\xff\x64\x30\x56\x0e\x16\x24"
+ "\xeb\x63\x74\x4c\x7a\xba\x2e\xf7\x98\xd7\x32\xdc\x98\x75\xd6\x05"
+ "\xb3\x95\x2c\x2c\xa8\x0b\xa7\x44\xce\xd7\x16\x48\xfb\x4f\x5f\x2f"
+ "\xc5\xfb\xd9\x31\xe5\x62\xd6\xff\xe6\x77\x8b\xc1\xd7\xe9\x93\xd1"
+ "\xbf\x7e\xde\xdb\x52\xb1\x1a\x16\xb4\xc4\xac\x57\xf8\x76\xc9\xf3"
+ "\xf7\x7f\x06\xdc\x02\x4d\xef\x3d\x34\x33\xa6\xbe\x6e\xfb\xd9\xab"
+ "\xb5\xbf\x60\x90\xf6\x17\x0c\xb4\x7f\xa5\x84\x1b\xb3\x96\x58\x20"
+ "\xdb\x1f\xba\x42\xff\x15\xb0\x0f\xa9\x4e\x37\xd8\xdc\x05\xef\xe9"
+ "\xb6\x3a\xaf\x1f\x0c\x6e\xab\x17\x0c\xac\xff\xa9\x72\x03\xeb\x7f"
+ "\xbe\x78\xb6\xba\x97\xe4\xde\x6a\x74\xdd\x1d\xa6\xba\xb8\x6d\x19"
+ "\x64\xfd\xef\x21\x6d\xfd\xef\xa1\xe2\x68\x7d\xf6\x90\x35\xba\x0f"
+ "\x0b\x62\xfa\xf0\xa1\xdc\xe8\x3e\x5c\xd0\xfd\x5f\x1d\xd7\xf0\x4c"
+ "\x89\x89\x89\x86\xc4\x04\x43\x42\x22\x5e\xa3\x89\x34\x2c\xd1\x98"
+ "\x38\x04\xbf\xa1\xda\x75\x98\x21\xd1\x60\xc4\x6f\x88\x76\x1d\x1a"
+ "\xf3\x3c\x8c\xcb\xe2\x67\xd4\xae\x43\x62\x9e\x87\x7e\xc9\xfb\x61"
+ "\x5a\xbd\x7a\xfd\xc6\x98\xe7\x21\x5f\xf2\x7e\xe8\x7f\xb3\x3c\x5d"
+ "\xf1\x1c\xed\x87\x36\x77\xe5\xba\x25\xa5\x2b\x96\xca\xfd\xe2\x65"
+ "\xd6\x25\x4f\x3f\xbd\x6c\xed\x5a\x6b\xd9\x2a\xeb\x7d\x33\x1f\xbe"
+ "\x6b\xaa\x55\x6d\x3b\x97\x4e\xcf\x58\x3a\x9c\xe6\xad\x5f\xc3\x2f"
+ "\xe6\x2d\x9c\x5b\x68\x2d\xb8\x6f\x66\xf4\x4b\x1d\x8c\xdc\x5e\xbe"
+ "\x1a\x94\x08\xf9\xcb\x7d\x69\x14\xd1\x8e\x3d\x52\xf7\x74\xb2\x9f"
+ "\xaf\x5a\xf3\xf8\xfe\xc7\x2d\xec\x3f\x7a\xd9\x2e\xdc\xb7\xf2\x9e"
+ "\xfe\xc2\x65\xdc\x88\x09\x8d\x0e\xb2\x3d\xc5\xe7\x57\x16\x6e\x11"
+ "\x1f\xfa\xc8\xfa\x20\x19\x4e\xd1\xe2\x3f\x34\xe7\x21\x2f\x9e\x3d"
+ "\xde\x20\x59\xed\x94\x84\xf2\xab\xf1\x2e\x41\xcc\x08\x23\xcd\xaf"
+ "\xf9\x42\x7f\x6f\x8b\x4c\xfb\xd0\xa1\xe7\x33\x9d\xa6\x45\x19\xe2"
+ "\x43\x21\x9f\xf9\x7c\x90\xca\xb7\xf0\x0b\x61\x78\xf8\x08\xeb\x86"
+ "\xba\x54\x32\xf2\x5e\xe8\x6b\xa9\x94\xf4\xda\x28\x8e\x59\xb2\xb0"
+ "\x5b\xdf\x0b\x7d\x09\xcf\x5e\x5a\xdc\xce\x75\x73\xde\xb0\xe1\xe1"
+ "\x53\x9c\xbf\x3e\x2a\xff\xa2\x31\x03\x7b\xb1\x0b\xbb\x0d\xc8\xb7"
+ "\xe0\x33\x32\x99\x42\xe2\xef\x81\xd4\xac\xbc\x89\x79\x94\xe0\x41"
+ "\x57\xb4\x04\x1d\xa4\x7c\x7e\x16\x2d\xdb\x10\x12\x41\xf6\x4f\x9f"
+ "\xd7\x6d\x17\x55\xcf\x91\x11\x32\x9d\xe0\x5e\xc3\x3e\x0a\x8b\xf2"
+ "\x1b\x96\x91\x11\xed\x1f\x73\x86\x1e\xa9\xb0\xce\x27\xb2\xcf\x23"
+ "\xe3\xef\xcb\xd9\xdf\x30\xe7\xf4\xae\x3f\x92\xf1\x17\x97\x1d\x86"
+ "\xcb\xc2\x42\x15\x65\xa2\x4b\x70\x1c\x23\xbf\x08\xb0\x8f\x7f\x4b"
+ "\x71\x88\xf3\xfc\x5b\xaf\xdd\x42\x6d\x65\x7e\xda\x7c\x52\x04\xb6"
+ "\xff\x51\x9d\x0d\x68\xed\xf6\xb3\xff\x62\xd2\xe6\x79\x94\x78\xba"
+ "\x90\x0c\xad\x25\xb5\xe4\x59\xec\xa7\x8a\x93\xa2\xab\xa5\xf8\x73"
+ "\x6a\x2b\x69\xa2\xa2\x0e\x32\xb4\x74\x7e\x4a\x32\x16\x4f\x4d\x5d"
+ "\x53\xe5\x45\xb2\x6c\x5e\xc1\x69\x17\x69\xe3\x66\x1a\xb1\xf1\x4f"
+ "\x64\xf2\x74\x75\xa0\x9e\xb3\xf4\xd8\x09\x4a\x00\x3c\xc3\xa6\x4f"
+ "\xc9\xb2\xe9\x51\xf6\xf3\xcd\xa5\xba\x4a\xb2\x08\x7b\x66\xf2\x65"
+ "\x7b\xa6\xf9\xb2\xc8\x4c\xed\xb5\x67\xa6\xb5\xd9\x90\xbf\xf3\x03"
+ "\x1a\xd9\x41\x69\x1f\x9e\xe9\x30\xd4\x5e\xa0\x31\xdc\xa6\xd3\x68"
+ "\x5b\xdd\x05\xe4\xaf\x59\x93\x1d\x46\xd9\xc8\x32\xc1\x94\x35\x79"
+ "\x9e\xc2\x00\x85\x01\xab\xf6\x32\x8d\xa9\xbb\x4c\x96\x70\xf5\x9a"
+ "\x6c\x2e\xd7\x4d\xdf\xdb\xe0\x69\x21\xaa\xd8\x2c\x42\x7d\x35\x39"
+ "\x79\xd0\x89\xc3\xde\x7e\xea\x88\xd1\xd3\xd2\x4d\xad\xfe\xcb\xd4"
+ "\x46\x7f\x26\x4f\xf9\x5f\xdd\xbf\x78\xea\x08\xaf\x59\x27\xb8\x37"
+ "\x76\xa2\x2e\xc5\x3b\xf6\x56\x3e\xab\xec\xa0\xaa\x4a\x4a\xb6\x6d"
+ "\xa4\x61\x67\x90\xae\xe6\xf6\xe3\x0b\x3c\xc1\xbf\xba\x37\x4a\x7f"
+ "\xdc\xc5\xed\x95\xad\x94\xd8\xe6\xaf\x65\xbf\x4f\x43\x28\xb5\xae"
+ "\xc9\xe3\x6f\x27\x8f\xed\x2f\xee\xb0\xb9\xae\x76\x47\x98\x92\x7e"
+ "\x79\xa9\xdd\xe0\x31\x5e\x22\x4f\xa1\x9f\x3e\x42\xdd\xa2\xa6\xee"
+ "\x28\xf4\x56\x6e\x9b\x3f\xc0\xe7\x9d\xb2\x45\x8f\x65\x78\xd5\x1a"
+ "\xca\xaa\xbf\x40\xe9\xfb\x2f\x50\xa6\xe8\xcd\x34\xb0\x8f\x2d\x9f"
+ "\x4d\xdd\x8f\x6b\x72\x27\x25\xa1\xed\xca\x1f\x3b\x45\xf3\xb5\xed"
+ "\xcb\xa4\x86\xcb\x03\xbe\xb6\x97\x7b\x06\x7c\x6d\xc1\x53\x3e\xf6"
+ "\xb7\xf5\xd2\x23\xdb\x4c\x2d\x34\x0c\x72\x72\x90\xf9\xbb\xea\x1c"
+ "\x19\xb7\x9e\x23\x9a\xe8\x30\x90\x75\x39\x9f\xb3\xf8\xfe\x32\x0f"
+ "\xfa\x86\xef\x4f\xd1\xf7\xc7\xe0\x9a\x8c\x5f\x02\xd2\x65\xfc\x86"
+ "\x4e\x8d\x8f\x91\x66\x40\xda\x10\x5c\x13\x21\x2f\x21\x7b\x9d\xf0"
+ "\xa1\xae\xc6\x1e\x03\x0d\x67\x7e\xd6\xfc\x7b\x1b\x7b\x9d\xdf\xf3"
+ "\x7b\xe9\xb9\x6e\x9d\xaf\x95\x8e\x5f\xe8\xfb\xe8\xd4\x59\x8e\x97"
+ "\xe5\x93\x78\xf5\x95\x24\x70\xec\x2c\x2d\x9d\x71\x78\x82\xeb\x45"
+ "\xfd\xb9\xb8\x9a\xf0\x83\x9c\x7e\xef\x84\x5e\xb6\xa7\xaf\x04\x75"
+ "\x7e\xff\x11\xa4\x0b\x3d\x1d\xed\x36\xf2\xbb\x77\x4f\x9d\x35\xa8"
+ "\x3c\x99\x06\xc0\x0c\x68\xf0\x21\xfb\x0b\x77\xb3\x8c\xf7\x18\x4c"
+ "\xe2\x58\x71\x0e\xd5\xed\x11\x2d\xfb\xf7\x88\x66\x25\x7b\xdf\xaf"
+ "\xf5\xd2\x2a\x17\xe3\x88\x71\xbc\x79\x07\xde\x1d\xc3\xa8\xc3\x74"
+ "\x69\x5e\xca\xfe\x64\xdf\x87\xfd\x77\xfd\xd1\xc8\x36\x08\xe7\x43"
+ "\xb5\x3c\x96\xbe\x55\x79\x7c\x08\x74\x40\x6d\x5b\x67\x37\xfd\xe2"
+ "\x72\xd7\x10\xfb\xef\xc8\xe0\x09\x9e\xa2\x49\x69\x64\x61\x7b\xb0"
+ "\x61\x8f\xf0\xbe\xc2\xf1\xf9\xf6\x88\x6e\xf0\xcb\xcd\x67\xa8\x70"
+ "\xc8\x37\xd3\x28\xed\x5f\xcb\x49\xd3\x4f\x85\x37\x47\xe8\xa7\x37"
+ "\x5b\xbd\x47\x22\x74\xd3\xe2\x47\xae\xd4\x4d\x8f\x3f\xa4\x74\x13"
+ "\x64\x5f\xea\xa2\x90\x57\x4b\x9f\x1e\x93\xae\xf9\x89\x3c\x3e\x36"
+ "\x26\x3d\xa0\xa5\x8f\x88\x49\xf7\xa9\xf4\xc7\xe6\xe9\xba\xaf\x8d"
+ "\xf1\x58\xcf\xba\xef\xb1\x3b\x59\xf7\xb5\x15\x6b\xba\x4f\xea\x9f"
+ "\xc7\x6e\x14\xff\x04\x5d\xb4\x8e\xf5\xcd\xa3\x67\x19\x7f\xf1\x21"
+ "\xe9\xb8\x5f\x87\xb4\x5f\x72\x9a\xeb\xcf\x64\xc4\x4f\xd7\x7b\x82"
+ "\xf5\x1e\xeb\x3c\xd6\x7d\xfb\x46\x89\x8e\x7d\x7b\xc4\x89\x3a\x19"
+ "\xfb\xe7\xd1\x7e\xfd\xf7\x32\xd2\x76\x20\xed\x65\xbc\x67\x3d\xc8"
+ "\x34\x69\x2d\x3c\x42\xec\x7f\x02\x5b\xab\x33\x6c\xc8\xa6\x5d\xe8"
+ "\x6f\x3e\x6f\xb8\x0d\xf4\x35\x25\x90\xcd\x53\xc6\x67\x58\x43\xec"
+ "\x93\xd6\xd9\x56\xd6\xc9\x72\x37\x6a\x2b\xe4\xcc\x53\xfe\x39\x55"
+ "\xfa\xc5\x19\x3e\x77\xc7\x38\x14\x6d\x78\x90\xe3\x25\x25\x34\x63"
+ "\x36\xcc\x7e\xe1\xac\xb3\x81\x8b\xd1\x05\x9c\x54\x7c\x96\x47\x0f"
+ "\x78\xe9\x80\x43\xf5\xf5\xe2\x76\x8e\xcb\x76\x8a\x0a\xbb\x30\xdf"
+ "\x0b\x70\xdb\x4c\x21\x07\xf1\x39\x18\x8e\x55\xc8\xd7\x7d\x86\x70"
+ "\x89\x4b\x3f\x0b\xe3\x84\x6e\x40\x1e\x4f\x47\x80\x18\x67\x2f\x3d"
+ "\x9a\xd3\x5a\x71\x84\xcb\x77\x30\x6d\x84\xd3\xae\xc3\x48\x90\x30"
+ "\x0c\x72\xde\x58\x82\x7c\x6a\xed\x3c\x35\x27\xaf\x75\xb1\x8f\x58"
+ "\xef\x7b\xba\x00\xa3\xe2\x94\x82\x01\x58\x02\x63\x40\xd4\x3b\x0d"
+ "\xfe\x88\xcd\xe2\xef\x80\x7f\x80\xfb\x8b\xcf\x45\xf2\x7e\x1b\xe8"
+ "\x92\xcc\xbe\xf2\xca\x16\x7d\x74\x42\xc3\x9f\x89\xb4\xb3\x9d\xe0"
+ "\xb7\x47\xb3\xf8\xdc\x12\x9f\xe7\xbc\xda\x59\x4e\xd0\x28\x5d\x3f"
+ "\xcf\x19\x5e\xff\x3f\x7b\x96\x13\xb0\x2d\xf5\x06\xd1\x04\xfc\xb3"
+ "\xf8\x3c\x27\xf0\xdf\xc1\x7c\xa8\xb5\x29\xfb\xd5\xc7\x24\xcd\xcb"
+ "\x38\x0d\x73\xc7\xe3\x7a\xff\x73\x7b\xb9\x2d\x78\x57\xa8\x6c\x44"
+ "\x81\xf9\xc7\xe3\xd9\xfc\x1e\x69\xb3\x39\xff\x24\xe8\x31\x0f\xc6"
+ "\xb0\xb7\x4f\x85\x0c\x55\x1b\xc9\xa8\x74\xda\xe2\xb9\x5c\x5e\xe9"
+ "\xb4\xc5\x34\xa0\xd3\x1e\xbf\xa8\x74\x9a\xa2\xb1\xd2\x69\x8f\xff"
+ "\x4d\xe9\xb4\xc7\x3f\x93\xfb\x62\xd0\x69\xfc\x8e\xf5\x9a\xae\xd3"
+ "\xf6\x8f\x12\xc7\x59\x77\xf4\x3a\x1f\x6f\xd7\x75\xdb\x4e\xa4\xb1"
+ "\xee\x60\x1c\x95\x9e\x7a\x2c\x53\xfc\x7f\x99\xa4\xfc\x0e\xf8\xbe"
+ "\x84\xcf\x2f\x74\x69\xf7\x3c\x9e\xcc\x54\x3a\x6e\x71\xfa\x80\x8e"
+ "\x7b\xfc\xe0\x40\x59\xd6\x71\x8b\xef\x51\x3a\x4e\xa5\x37\x3c\xc6"
+ "\x3a\xee\xb1\x4c\xa6\x81\x06\xdf\xc0\x6b\x78\x5a\x7e\xa6\x63\x76"
+ "\xa4\x8e\x8b\x96\xaf\xc5\x15\xba\x8e\x63\xdd\x86\xe7\x1d\xd0\x69"
+ "\x72\x0e\xc9\x72\xb6\x1b\x34\xd7\xe5\x8e\xfb\x80\xdb\xcc\xf1\xd7"
+ "\x98\x6e\xb3\xce\xd2\x30\xed\xec\x90\xd6\xee\xc5\xc7\x75\xdf\x47"
+ "\xd0\xbf\x3d\x9e\x1d\x3d\x10\x23\x91\x6e\xe1\xb3\xf3\x1e\xc7\x29"
+ "\xf2\xd4\x0a\x47\x5b\xf0\x24\x15\x95\x41\x57\x24\x3e\xfb\x19\xf7"
+ "\x2d\xe6\x1d\xdf\xe1\x2b\xeb\x9e\x33\xf4\xc4\x88\x22\x3f\x0d\xc5"
+ "\x5c\xfd\xb3\x2a\x03\xde\x95\x47\xbd\x93\x6b\x0c\x13\xd7\x70\x7c"
+ "\x3d\x08\xc2\x20\xf3\xfd\x6b\xac\x6f\xf3\x55\xea\x7b\x4d\xd6\x07"
+ "\x9b\x0a\x73\xa0\x94\x73\xf4\x84\x9c\x97\xc8\xf8\x36\x5b\xe3\xc2"
+ "\xfa\x9d\xf6\x7e\xc8\x20\xef\xff\x76\xf5\xf2\x4f\x5e\x77\xf5\xf2"
+ "\x4f\xde\xce\xba\x08\xed\x33\x85\x9c\xd1\x70\x46\x06\xf5\x7c\x67"
+ "\x38\xdf\x43\xda\x5a\xcc\x67\xf6\xb1\x72\x8e\x66\xd1\x61\x32\xff"
+ "\xed\x42\x3e\x19\x33\x04\xba\x72\xf6\x06\xe2\x78\x2d\x91\x65\x77"
+ "\x0e\xd0\xf8\xc9\xdc\xab\xac\xfb\x25\x7b\x6a\x49\xc6\x8c\x3d\x06"
+ "\x9b\x94\x63\x1a\xed\xee\x5f\xff\x78\xb2\x13\x7a\xd3\x1b\xe1\x17"
+ "\xcb\xf3\xb1\x5b\x38\xae\x01\xdb\x97\x55\x6a\xbe\x79\x13\xf4\x73"
+ "\x2a\x9f\x87\xe1\xb3\x31\x45\xa1\x02\xc3\x31\x19\xcb\xac\xc8\xaa"
+ "\x97\x1d\x6c\x9d\x85\xeb\xd5\xea\x64\x1f\x53\x3f\xca\x2c\xd2\xcb"
+ "\x30\x6c\xf6\x53\xc4\xb8\x7c\x8b\x3c\x53\x1a\xec\x66\x5d\x78\x13"
+ "\x6c\xd1\x54\x55\x4f\x31\x69\xf5\x6c\xf7\xd2\x13\x05\x57\x3b\x9b"
+ "\x31\x78\xfb\x8a\x9a\xaf\xbd\x7d\xa4\xb5\xaf\x98\xbe\xa4\x7d\x57"
+ "\xa9\xb7\x78\xda\xb5\xd7\x6b\xd6\xeb\x2d\xbf\x76\xba\x16\x1f\xfa"
+ "\xea\x74\xcd\xd6\xe8\x5a\xec\xfd\x12\xba\xc6\xa9\x67\x49\xda\x57"
+ "\xaf\xc7\xaa\xd5\xb3\x24\x2f\x5e\x3d\x24\xff\x06\x3d\x37\x95\xa4"
+ "\xc7\xda\xec\x81\xec\xa8\x58\x75\x4b\x5c\x91\xf1\x8b\x7b\xa4\x5c"
+ "\x2d\x39\xd0\x1f\x2f\x59\xed\x95\x43\x57\x2f\xf9\xb8\xa8\x91\xc7"
+ "\x77\x11\xf6\xd2\x92\x66\x8e\xe3\x3a\x7b\xb3\x3a\x93\xad\x95\xe9"
+ "\xb8\x5a\xdc\x64\x8e\xd1\xc5\x31\xf9\x3c\x16\xb4\xbd\x96\x63\x97"
+ "\xac\xe6\x33\x15\x1c\xaf\x15\x3a\xfe\xa9\x9b\x39\xe6\x18\xee\x87"
+ "\xe1\x3e\x53\xe9\x80\xa7\x32\x51\xcf\xe0\x67\x27\x6b\x56\x5b\x0f"
+ "\x54\x66\x0f\x19\xcc\xbf\x1e\xe5\x61\x53\xac\x96\x6b\x53\xe1\xd4"
+ "\x19\x85\x98\x4b\x68\xf1\xfe\x96\x7e\x2e\x63\xc0\xd9\x0b\xf9\x3c"
+ "\x09\xc6\xc5\xa5\x23\xb4\x73\x00\xa0\x87\x03\x74\x7d\xaa\x51\xa7"
+ "\x87\x9e\x8e\xb4\xc3\x3a\x3d\x60\xdf\x24\x7b\x1a\x83\x7c\x4e\xc7"
+ "\xaf\xce\x64\x3f\xf5\xef\xa2\x7a\xb5\x45\xc1\x7e\x5a\xed\xd1\x70"
+ "\x7d\x7d\x85\x46\x39\x6f\xaa\xe4\x79\xd3\xd3\x47\x7d\x29\xab\x2d"
+ "\x3a\x1e\x62\xad\xc5\xc0\x67\xbf\x27\x61\x2c\xdd\xa5\x62\xee\x25"
+ "\xf0\x39\x39\xf9\x7e\x6d\xa6\x41\xd1\xe4\xe9\xe9\xa2\x87\x63\xc7"
+ "\x48\xd8\xc9\xc0\xb3\x93\xe1\x7a\x71\xf5\x6d\xca\xe4\xb8\x17\x5a"
+ "\x7b\x9e\xce\x08\xd7\xcc\x28\x0c\xf7\x5a\x0c\x3a\xbe\xf5\xf2\x4c"
+ "\xeb\xd3\x68\x7f\xb1\x8a\x13\x2b\xf1\xb1\x18\xd8\x9f\x3f\x9c\xba"
+ "\xda\x2a\x36\x59\xe8\xf0\x9a\x2e\x39\x6f\xe2\x3a\x27\xa1\x7e\xc1"
+ "\xf3\x24\xd8\x26\x28\xd7\xd8\x4f\x37\xc0\x15\xbd\x3a\xdd\x9e\xce"
+ "\x57\xe3\xb2\x6a\xa3\x7f\x93\xc5\x70\xcc\x27\xcf\xdb\x51\xba\xd5"
+ "\xfe\x85\x8a\x85\xfd\xf4\x49\x9d\x76\xfd\x38\x01\x1f\xce\xa3\xfc"
+ "\x9b\x9e\x0e\xea\x38\x49\xd9\x4d\xe5\xf3\xbb\x4f\xf9\xf8\xdc\x90"
+ "\xa2\xff\xb1\xe4\x5e\xe7\x52\xeb\x95\xf4\x5f\x9a\x13\x41\xff\x44"
+ "\xe6\x3d\xa6\x3f\xaf\x75\x80\x2e\x4f\x80\x96\x49\xea\xbc\x03\xdb"
+ "\x33\x4b\x97\xe1\x39\x99\xf1\x0c\x57\xeb\x34\x2f\x34\xaa\x75\xb2"
+ "\xa5\xb5\x11\xfd\x80\xf6\x5a\xd8\x56\x4b\xd0\xdb\xcf\x65\x98\x06"
+ "\x1c\x57\x92\xeb\x06\x3e\xd7\xa3\xee\xa6\xd8\x36\x6d\x55\x67\x49"
+ "\x48\xf9\x96\x2c\x6d\x8f\x88\x2d\xee\x2b\xb3\x8a\x80\x3a\x97\xbc"
+ "\xb4\xfc\x70\xa5\xcf\x38\x98\x0e\x60\x1e\x94\x31\x2a\x0d\x72\x5d"
+ "\x01\x36\xd7\xf2\x4f\x04\x70\x53\x7d\xbf\x7c\xbf\x4a\x5b\xf6\x37"
+ "\x5c\xc1\x63\xcb\x66\x0a\xd4\xed\xb3\xcb\x18\x2b\x68\xdb\x72\x2f"
+ "\xf3\x9c\xce\x67\xbc\x0e\xa9\x7c\xc6\x97\xbd\xc9\x3a\x45\xa7\x39"
+ "\xf0\x1f\xde\xeb\x5c\x66\xd3\xf1\xd7\xf3\x73\xdf\x71\x1e\xde\xb3"
+ "\x69\xb6\x06\xa4\xae\x55\x67\x86\x96\xd5\xe9\x32\xcc\x75\x70\x3f"
+ "\xb3\xae\x61\x7a\x28\x5a\x2c\x3b\x1a\x0d\xcb\x62\x50\x71\x33\x99"
+ "\xe7\x21\x8f\x1b\x03\x43\x90\xc7\x3b\x00\x63\xd9\x62\xf5\xae\x1f"
+ "\x4f\xf6\xf3\x97\xbe\x78\xaa\x3f\x96\xcf\xe5\x76\x0d\xe0\xcb\xf2"
+ "\xb7\xbc\xbf\xff\xf9\x9d\xdf\x6e\xe1\x18\xbc\x52\xc7\x94\x8d\x65"
+ "\x7c\x7d\x1c\xdb\x56\xf2\x3a\xe0\xbb\x18\x77\xce\xa3\xf7\xd9\x00"
+ "\x2f\x2e\x2f\x89\x84\x23\xec\x12\x57\x09\x47\xe9\x0e\x1f\xef\x6d"
+ "\x5b\xd5\x7e\xcb\xf2\xdd\x11\xed\x4e\xd6\xf1\x19\xd0\x09\xcb\x0f"
+ "\xc7\xf2\x24\xd7\xcd\xb1\xf8\x34\xd8\xac\x4b\xcc\xa7\x68\x79\xa3"
+ "\x86\x97\xec\xc7\xc1\xc6\x37\x8e\x73\xc9\xb1\x4f\x5f\x51\x3a\x04"
+ "\xfd\x5c\x32\xf6\x15\x75\x8e\xc8\xaf\xe2\x9f\xfe\x20\x43\x18\x7e"
+ "\xcc\xb4\xe2\xf5\x74\x9f\x8c\xd7\x21\xcf\x98\xff\x80\xf7\xf8\xc5"
+ "\x48\xdb\x8f\x65\xac\x5b\xcd\x37\xd0\xd7\x6c\x0b\xca\x58\x7e\xf6"
+ "\x32\x3e\x73\x1b\xe4\xb9\x9e\xf4\x7d\x3b\x56\x16\xa4\x85\x01\x96"
+ "\x89\x1f\x94\xf1\x59\x7a\x15\x47\xfc\x07\x0e\xfd\xfc\x3c\xc7\xce"
+ "\xe4\xb8\xaf\xd0\x43\x89\x03\x71\x5b\x4b\x0a\xd9\xc6\xd2\xfa\x97"
+ "\x76\x19\x44\xbb\x92\xff\x1f\xfc\x8e\xcf\xcb\xab\x7d\xac\x53\xd0"
+ "\x09\x89\x7f\x3d\x45\x3f\xf8\x4c\xad\xfb\xe8\x3a\xaa\xe4\x51\xde"
+ "\xcb\xf2\x6a\x30\x50\x57\x37\xe4\xbb\xe0\x4a\x5d\xf2\x83\xdf\xe9"
+ "\x73\x17\x3e\x7f\xa7\xf6\xc5\x06\xe0\x79\xe9\x07\x72\x2e\x38\xd0"
+ "\x07\xbf\x05\xac\x92\x29\x57\xea\x85\x92\x7c\x5d\xf6\x6c\xb7\xf2"
+ "\x19\xee\x1f\x98\xb9\xfe\xc1\xc6\x0b\x61\x7f\x94\xfb\x29\xe9\xb4"
+ "\x35\x7e\xdf\xc4\xdf\x67\x2b\x69\xd2\xdb\xa0\xd3\x44\xb5\x61\xc5"
+ "\x75\x3d\xa9\x39\x65\x03\x6d\x5f\x21\x6d\xd7\x88\xf7\x33\x23\x68"
+ "\xc3\xcf\xb9\x6a\x5c\x5b\x01\xfa\x2c\xd5\x62\xd5\xaa\x34\xc8\xce"
+ "\xd7\xc5\xa6\x42\x52\x38\xae\x20\x5d\xd6\x91\x37\xcb\x4b\x17\x2d"
+ "\x6a\xbf\x6b\x05\xda\x5f\xb2\x5d\x95\x2b\x39\xc1\xb8\xc4\x6d\x67"
+ "\x34\x8e\x47\xd8\xd6\x50\x31\x15\x56\xbc\xcf\xf8\x5a\xc7\x71\x1f"
+ "\xaf\x78\x41\xea\x70\x8e\xaf\xd0\x57\x32\xc4\xdf\x97\x49\x3d\x7d"
+ "\x25\xd0\x0b\x99\x06\xd4\x03\xfd\xdf\xe3\xd7\xea\x3c\xa4\xe3\xca"
+ "\xb8\xc9\xf8\x9c\x62\x45\x7c\xfa\x72\xbd\x32\xe6\x53\xc9\x30\xfc"
+ "\x92\xf0\x1b\xfa\x55\xed\x12\xd8\xe9\x5d\xbe\xea\xa9\x81\xf0\x3a"
+ "\x71\x9c\xe3\x8b\x61\x2e\xd2\x55\x05\xfe\x1d\xb9\xc5\x0d\xdb\xfc"
+ "\x09\x43\xd1\x06\xca\xc5\x9c\x99\xc4\x25\x31\xa5\x3e\x8c\xeb\x3a"
+ "\x91\xc3\x71\xc6\xf1\x9c\xad\x3d\x67\xf1\x73\xcf\x3a\xb1\xb8\xd7"
+ "\xf9\x4c\xb1\xbe\x47\xa8\x62\xe3\x3c\x63\xeb\x8f\x27\x94\xf8\x38"
+ "\x9f\x27\xe2\xb8\x53\x61\xcc\x85\xba\xb8\xde\x22\x9e\xcf\xa2\x3e"
+ "\xe4\xab\x85\xbd\x21\xd7\x5e\x7c\x89\x77\xa4\xe2\x97\x39\xc8\x5e"
+ "\x6a\x17\xe3\xd5\x93\x32\x35\xa0\xe3\x3a\xd2\x9f\x6b\xf8\x8a\xb8"
+ "\x05\x75\xdc\x90\x7e\xbc\x4a\xa5\x07\x39\xfe\x21\xfb\x3a\xf6\x3a"
+ "\x9f\x1d\xa3\xe3\xaa\xe3\xc0\xf5\xf1\xf9\x4d\x91\x9a\xe3\xe0\xd8"
+ "\x33\x5c\x1f\xc7\x53\x45\xde\x3c\x1d\xdf\xaf\xca\xcb\x95\x75\x42"
+ "\xf0\xf8\xc9\xfa\xd7\x3a\x9a\xa8\xcd\xcf\x3a\xe5\xd9\xba\x63\x75"
+ "\x7e\x5e\xef\x76\xa2\x8e\x2d\x3d\xa2\x84\xc2\x7d\x25\x71\xfb\x98"
+ "\xcb\x20\x7f\x87\xd4\x0f\x35\x39\x5b\xc2\x22\x0f\x7a\x02\xe5\xfa"
+ "\xf2\x78\xad\x09\x72\x5b\x6a\x6c\xae\xe8\xe2\x33\x97\xd0\x39\xa5"
+ "\x46\xe4\x71\xb0\x9d\x85\xf9\x56\x40\x7e\xbf\x02\xba\xc9\xbd\x2e"
+ "\x07\x30\x4a\x87\x18\xcb\xc9\xd8\x1c\x13\xa7\x6a\x30\xfe\xe8\x31"
+ "\xcf\x70\xf5\xd4\xcc\x28\xe9\x75\x96\xc2\xfe\x7f\x6e\xd0\x3d\xdf"
+ "\xad\xa3\x40\x4f\xe4\x73\x8d\xe6\xf9\x5e\x69\xc9\xd5\xf2\xea\xfb"
+ "\xd5\xac\x83\x26\x59\x28\x59\xa4\xcc\x70\xb1\xbe\xed\x49\x9d\x51"
+ "\xc2\x63\x09\xca\x1f\xd4\xcb\xf3\xb8\xce\x63\x07\xfa\xcb\x52\xd5"
+ "\xaf\x0f\x4b\xdb\x95\x3c\x97\xb6\xeb\x32\x1a\xaf\x9e\xb2\x03\x22"
+ "\x6c\xcf\x20\x83\x07\xe3\xd6\xc4\x00\x25\xd7\xbf\x4e\xe4\xda\x28"
+ "\x02\xaf\x6c\xc4\x1c\x66\x34\x7f\xef\xa2\x34\x8f\x65\x94\xf9\x7b"
+ "\x17\xf8\x25\x11\xb8\xbc\x72\x09\x75\x56\xaa\x7c\x9a\xdf\xba\x05"
+ "\xf9\xca\x70\x4d\x13\x06\x03\xed\xae\xa4\xa4\xdd\x61\x32\xba\x2a"
+ "\x69\x0c\xd2\x60\xeb\x3e\xb7\x48\x97\xd9\x78\x38\x54\xd5\x13\xd5"
+ "\xa0\xde\x2d\x95\x22\xf8\x5b\x8c\xe7\xce\xb0\x08\x7c\x15\xba\xa3"
+ "\xfd\x87\x55\x1b\x9f\x3b\xac\xdb\x84\xb8\x77\x47\xfb\x1d\x3c\x77"
+ "\xc5\x19\xef\xa7\x56\xad\x2a\x2b\x5a\xb3\x8c\x2f\x99\x19\xcf\xdf"
+ "\x3e\x3c\x72\x2d\x84\xc7\x3f\x15\xa7\xe2\xb9\x0e\x5e\x77\x7c\x25"
+ "\x55\xdf\x47\x5f\x69\xd1\xd7\x3e\x35\x7f\xfd\x7b\x79\x4e\xc7\x73"
+ "\x1f\xbc\xcb\xf9\xb8\x62\x33\x83\x49\xf8\x2c\x89\x0c\xb1\xf5\x2d"
+ "\x5f\x52\xb6\xa4\x74\x2a\xef\x98\x0d\x8f\x53\xcf\xca\xbc\x98\x7a"
+ "\x1c\xfd\xf5\xa8\xf1\xc7\x6f\xe0\x7c\xd5\xef\x16\x88\x94\xbd\x3e"
+ "\x75\x56\x7a\xe5\x01\x7d\x4d\x6b\x10\x3f\x47\x77\xa8\x66\x8d\x8d"
+ "\xe5\xc1\xbe\x99\x0c\xef\x6e\xec\x30\xb0\x1d\x59\x89\x7b\x5e\x5b"
+ "\x90\x6b\x64\x5a\xbc\xa8\x0f\x2f\x74\x60\x7c\x5f\x19\x10\xd5\x39"
+ "\xa0\xdb\xca\x41\xd7\x6c\x22\x7d\x44\xd8\xa7\xb0\x93\x56\x99\xaf"
+ "\xe6\x73\xc4\xf9\xb9\x3d\xcc\xb3\x31\xe5\x5e\x50\x7d\xb6\x0a\xfc"
+ "\x5f\x6a\xed\x3f\xcf\xab\xe5\xa9\x1a\xa5\xc7\xe1\x5a\xb5\x78\x50"
+ "\x7f\x11\xd7\x8c\x5a\xc5\xe3\xab\x3e\x69\xc6\x7c\x0d\xed\xfc\xe1"
+ "\x29\x5a\xf5\xb1\xd1\x02\x1b\x61\x34\xfd\x14\xf7\x9f\x70\x59\x7e"
+ "\x17\xc5\x47\x37\x9f\x6d\x34\x42\xbb\x40\xcb\x24\x08\xf5\x47\x46"
+ "\xed\x26\x11\x3f\x83\x48\x90\xbb\xa9\x89\xe8\xc1\x61\x43\x8d\x64"
+ "\x1a\x99\x9c\x74\xcb\x37\xc6\x58\xee\x9d\x31\x6d\x8a\xbd\xb2\x02"
+ "\x5a\x39\x18\x30\x89\xc8\xf8\x69\x7b\x6b\x1f\xb9\xdd\x41\xd2\x9f"
+ "\xa6\x7a\x6f\x6d\x3c\x5c\x77\x3a\x85\x8d\xcf\xae\x87\x53\xdf\x72"
+ "\xdb\x9f\x27\xc3\xdb\x97\xbd\x06\x8e\xd1\xcc\xf6\x33\x7f\xeb\xe2"
+ "\x14\xd9\x1e\xfa\x08\x69\xa0\x57\xb9\x70\xbd\xe5\x56\x76\xa7\xad"
+ "\x3a\x5c\xf3\x96\x7b\x00\xbe\x91\x18\xbe\xfd\x35\x32\x1c\xa8\xec"
+ "\x32\x78\x8c\x33\xc8\x63\xf5\xd3\x47\xb8\x8f\xdb\x57\xa8\x93\x6d"
+ "\x59\x86\xd1\xe0\x0c\x6f\xb7\x7f\x41\x06\xed\xfc\xa9\xe1\x1c\xd9"
+ "\x7e\xd7\x34\x48\x39\x3e\xef\xdd\x93\x3a\xf5\xc3\x5e\xe7\x6a\xa3"
+ "\x97\xee\x9b\xad\xd9\x32\x18\x73\x57\x63\xfe\xbf\x4a\xc6\x79\xc2"
+ "\xfb\x0f\xf8\xbb\x30\x48\xcb\xd4\xf3\xc4\xed\xa3\x1f\xf1\x1a\xbc"
+ "\x70\x33\x1f\x88\x4b\x7f\xeb\xe2\xb3\x2d\x83\xf8\xc1\x0c\xf3\x94"
+ "\xdf\xc5\x7b\x91\x43\x46\x42\xff\xd8\x2f\x8a\xbe\x90\x93\xd2\x20"
+ "\x4e\x86\x90\x81\x6e\x09\x5e\x12\x85\xad\xdd\x17\x64\x4c\x53\xd6"
+ "\x35\x6f\x2d\xff\xad\xc1\x13\x38\xef\xf6\x6c\x0b\x53\x1b\xec\x4a"
+ "\x4f\xdd\x79\xb7\x8a\x7d\x1a\xa2\x56\xfa\x33\xb5\x96\xff\x6f\x87"
+ "\xc7\xf1\x67\xa4\x0b\x19\x0b\xbb\xef\x92\x58\xe4\x31\xfe\x1b\xf1"
+ "\x77\x8a\x78\x8c\x03\xdd\xad\xe7\x68\xf5\xdf\x3f\x04\x9c\xb7\xff"
+ "\x03\xb0\x64\xcc\xb4\xe9\xf4\x11\xee\xd1\xa6\xfe\xf1\x2f\x6e\xac"
+ "\x99\x04\xf7\x4e\x53\xf9\x13\x86\x30\xc6\x52\x8e\x6d\x87\x31\x34"
+ "\x87\xdb\x85\xe7\x6c\x7e\xc6\x35\x8b\xaf\xa6\x2d\xee\xfd\xa6\xe0"
+ "\x13\x3c\xb6\x16\xf2\xb8\x89\xf4\x45\x0d\x97\xe4\x58\x5b\xa0\x3d"
+ "\xe7\x6b\xcf\x79\xda\xf3\x6c\xed\x39\x57\x7b\xe6\x75\x79\x6d\x4c"
+ "\x5e\xe3\xea\xb7\x17\x0c\xc3\xda\xf1\xdc\xa8\xf7\x05\xf0\x19\x61"
+ "\x2a\xdf\x2c\xc7\x76\x0d\x8f\x1c\x0d\xaf\x6c\xed\x59\xc7\xe7\x66"
+ "\x53\x70\xf3\xff\x10\x3e\x6b\xad\xd1\xf8\xac\xcd\x8e\xc0\x87\x4c"
+ "\xe5\xb9\x5f\x05\x1f\xb3\x89\xbf\x13\xf1\xdf\xc0\x87\x71\xe1\x34"
+ "\xd4\xdf\x14\x83\x8f\x5b\xc7\x27\x2e\xbf\xad\x13\x5d\x6c\xd7\xac"
+ "\xfd\x9a\x8c\xeb\x3c\x8c\x6d\x96\x86\xcb\x7a\x9c\xc2\xb5\xc1\xab"
+ "\xc5\x29\x84\x2c\x60\xdc\x2e\x43\xfb\xd7\xb6\x68\xf6\xdb\x51\x65"
+ "\xe7\x97\xe5\xe8\xbe\x63\x68\xeb\xc1\x2a\xd5\xd6\x43\xdb\x38\x56"
+ "\xdf\x06\xfa\xba\xbd\x5c\x74\x61\xde\xfd\x9f\x3c\x37\x8c\x84\x5b"
+ "\x5a\xb6\x76\xed\x73\x53\xad\xa5\x4b\x56\x2e\xb3\x66\x2c\xb5\xae"
+ "\x2d\x59\xb1\xbc\x6c\x59\xb4\x3f\x85\x59\xfb\x7e\x8f\x3c\x27\xc2"
+ "\x73\x29\x39\x97\x06\xff\x4b\x3d\x29\x7d\xf2\xca\x2e\x0a\x67\x59"
+ "\x31\xeb\xdc\xfa\x1a\xf5\x9d\x27\xe0\xd3\xac\x8f\x21\xfa\xfc\x97"
+ "\xc7\x10\xa4\x9f\xc4\x38\xb9\x38\x22\x9d\xf3\xfa\xf4\x34\x86\xaf"
+ "\xe9\xa6\x61\xa7\xa8\xac\x9a\xeb\x8c\x4b\xc3\x4b\xa2\x11\x76\x13"
+ "\x7f\xc3\xc2\x00\x9d\x22\x38\xee\x16\x9f\xbf\x44\x39\x71\x9a\x9e"
+ "\x97\xf3\x8a\x45\x78\x56\x73\x36\x01\x1c\x9f\x7f\x04\x65\x0e\x20"
+ "\xcd\xc8\x36\x04\xe6\x81\x5d\x5c\x0e\xe9\xcf\x71\x1c\x0c\xa4\x27"
+ "\x69\xf1\xc4\x38\x6d\x0b\xc7\xa9\x40\x9a\x39\x22\xed\x55\xa4\x59"
+ "\x90\x66\xd5\xe0\xbd\xc9\x74\xc6\x73\xae\xb6\x4e\xc6\x79\xde\xd7"
+ "\xea\x75\x44\xe2\xcc\xdf\x70\xb9\x6b\x62\xb6\x75\xd1\xc2\xbb\xa7"
+ "\xcf\x78\x7a\xd5\xca\xe5\xc3\x49\x92\x3d\x13\xc3\x71\xf6\x5d\xe5"
+ "\xb7\x4f\xb5\xda\x96\x2d\x5b\x63\x5d\xbf\x6c\x65\x99\x75\xc9\xfa"
+ "\x25\x1b\x86\xd3\xf2\x55\x6b\x9e\xe6\x28\x0b\xdc\x2d\x6b\x8b\x9e"
+ "\x5e\xfe\x03\x76\x7a\x51\xb9\x87\x47\xd9\x09\x8b\x58\xb7\x69\x71"
+ "\x49\x8e\x57\xb1\x0d\x99\x72\x6f\x31\xee\x39\x5e\x97\x05\xd7\x66"
+ "\xfc\x8e\xe2\x77\x04\xbf\x13\xf8\xb5\x9f\xa1\x4d\xdb\x70\x3d\xdc"
+ "\xeb\x5c\xb7\x54\xb7\x57\x06\x78\x68\x5d\xb9\xce\x43\xb0\x2f\x0e"
+ "\xab\xf1\x6d\xdd\xc1\xb6\xa0\x94\x9f\x7e\x9e\xaa\xba\x34\xc0\x53"
+ "\x1c\x6f\xb4\x8d\x7d\xba\xd6\xe1\xfd\x65\xb9\x56\xc9\x6b\x26\xd7"
+ "\x31\xdd\x4e\xd3\x86\xfd\x0d\x7b\x44\x0b\xc7\xca\xc1\xb5\x19\xfc"
+ "\xd2\xa2\xe2\xd3\xac\x4f\x47\xbe\xb1\xa8\xe3\xa8\xaa\x43\x7b\x1e"
+ "\x25\x8e\xf3\x37\x5c\x4e\x69\xcf\x0c\x0b\x30\x26\xf3\x3d\x5f\xb5"
+ "\xbd\x53\x93\xf6\x8d\x37\xc3\xc0\xbb\xf5\xad\x5a\x1d\x1c\x4f\xdb"
+ "\x51\xef\x94\x73\x29\x39\x77\xe6\x35\x62\x53\xc2\xbd\x02\xf8\x9c"
+ "\x0f\x27\x3e\xde\x21\xe3\x5f\x3a\x2e\x43\x47\x7c\xeb\x5b\x9e\x72"
+ "\x99\x3f\x81\xd7\x90\xe7\xdb\x44\x98\xe3\x90\x87\x13\x9f\xed\xe0"
+ "\x72\xc2\x7c\x6f\x71\x78\xd7\x88\x5c\x65\x33\x70\xdc\xc1\xf5\x07"
+ "\x35\x98\x01\xa6\xed\x19\x5a\xf7\xa8\x9a\x87\x6f\xda\xa6\x6c\x89"
+ "\xf5\x87\x75\x5f\x4b\xc8\x68\x26\x9e\x9b\x75\x1d\xe0\xa5\xf5\x2e"
+ "\xcd\x2f\xce\xad\xb5\x3f\xa8\x3d\x1f\xd1\x70\x4c\xe0\x58\x28\xc0"
+ "\xbf\x9d\xfb\x0e\xf6\xca\x11\xdc\x9f\x00\x7d\x5a\x14\x7d\xca\x65"
+ "\x9c\x03\xd8\x4d\xfc\xfe\x04\x7f\xef\x06\xef\x4e\xa8\x38\x23\xeb"
+ "\x73\xb8\xcd\x03\xbe\xb3\x75\xb9\xc0\x75\x32\xef\x31\x43\x96\x8e"
+ "\x78\x2e\xb1\x7c\xae\xcf\x06\xbc\x26\x5d\xef\xb0\x9e\x29\x0a\x41"
+ "\x4e\xe5\x7c\xaa\xbc\x54\xd7\x37\x03\x7c\x50\xee\x88\xa7\x4b\xe2"
+ "\xf5\xbb\xa2\x7f\xf9\xdf\x84\xf3\xf9\x66\xe0\xd4\x24\xfb\x80\xe3"
+ "\xb1\x5e\xea\x9f\xb7\xf5\x29\x1d\x59\x7e\xa2\x7f\x8e\xa9\xe1\xc1"
+ "\xb1\xdd\xbd\x8c\xdb\x65\xb9\xef\xaf\xe9\x8d\xf2\xa0\xae\x37\x74"
+ "\x38\xa6\x04\x11\x36\x95\xe3\x9f\x6b\x72\x31\xef\x91\xf0\x78\x29"
+ "\xed\x11\xc0\x19\x79\x51\x9d\x81\x0b\x57\x4f\xc6\x9c\xb6\xfc\x30"
+ "\x7f\xf3\x4d\xda\xb4\xce\xe7\xff\xf7\x80\x2e\xda\x50\x10\x09\x53"
+ "\x98\x27\x17\x33\x5c\xd6\x47\x6c\x93\x14\x85\x8c\x1c\x87\xa6\x58"
+ "\x1b\x5f\xa0\x83\x37\x38\x74\x5c\x41\xc3\xe3\x3a\xbe\xda\x37\xc7"
+ "\x8e\xa3\x1e\xef\x82\x50\x1f\xfb\x82\x37\xab\xfe\xdc\x24\xf5\x0d"
+ "\xde\x1d\x42\xd9\xa3\x5e\x7a\xde\xac\xc9\x50\x0b\xca\x1f\x3a\x56"
+ "\x39\x1b\x79\x36\x74\x68\xfe\xcc\xed\xe8\xdf\x13\x03\xbc\xbf\xae"
+ "\x35\x62\x9d\xe7\x84\xea\xc3\x19\x8e\x53\xb4\xd1\x12\x91\xae\xf5"
+ "\xed\xb1\x02\xa4\xb7\xaa\x35\x93\xc9\x56\x55\x7e\xa3\xf2\x5d\xd5"
+ "\x70\x64\x5d\xc0\xe7\xf5\x58\xc6\x25\xed\x65\x1f\x6f\x2c\xd0\xc7"
+ "\x0b\xc0\x3a\x2c\x69\x3e\x4a\x1c\x65\x3a\xa9\x78\x1f\xcf\x5f\x52"
+ "\x74\xda\x58\x1e\x45\x7b\x1e\x37\x51\x0f\xd3\x69\xe4\x16\x11\x1e"
+ "\xe9\x4f\x10\x45\x1b\x8c\xc4\xf2\xc2\x32\xce\x7b\x83\xe0\x0f\x69"
+ "\x57\x29\xba\x6d\x3c\xa2\xd3\x4d\xef\x3b\xa6\x93\x97\x36\x66\x32"
+ "\x6d\xa3\xdb\x38\xac\xfd\x94\xde\x76\xd0\x94\x63\x9a\xe2\xb9\x45"
+ "\x93\x8b\x16\xf7\x68\xf6\x1d\x59\xf7\x87\x63\xc6\xbb\xe9\x58\x79"
+ "\x0e\x29\xda\x6e\xb2\x78\xa9\xac\x3c\x62\x5e\x72\x9c\xe9\xcb\xb2"
+ "\x02\x3c\x17\x6b\xb1\xb7\x8e\x2b\x3f\xa6\x75\x2d\xa2\x7a\xf2\x62"
+ "\x29\xcb\xeb\x64\x8c\x14\x8e\xdb\xdb\xce\x34\x62\xbd\xc8\xb2\xc4"
+ "\x32\xc0\xf2\xa4\x68\xb4\xa9\x2c\x82\x46\xcd\x4c\x1f\x8d\x4e\x87"
+ "\x63\x74\xf9\x32\x6b\xe9\x74\xa5\x8b\xad\x99\x19\x4b\x27\xc9\x40"
+ "\x37\xd6\xfb\x67\x4d\xb5\x16\x4c\xcf\x28\x2f\xc9\x9a\xaf\x2e\xb3"
+ "\x0a\xf2\xf9\x3a\x3c\x7a\x5e\x67\x45\x3d\x27\xa3\xe7\x86\x5b\x4a"
+ "\x94\xfe\xd8\xe4\xf7\x26\x98\x25\xdf\x70\xdc\xd9\xaa\x95\x44\x21"
+ "\xe0\xbd\xeb\x0c\xfa\xd4\x9c\xc3\x71\x9e\xdd\x0b\xca\x89\xe3\xa2"
+ "\x7f\xd1\x80\x77\xf5\x48\x1f\x69\xe3\xef\x23\xfc\x45\x84\x53\x72"
+ "\xe4\x7a\x9f\xa8\xce\x70\xfb\x52\xf6\xd6\xe2\x57\xec\x4b\x99\xda"
+ "\x3e\xe7\x76\xbb\xe8\x75\x56\xe4\xeb\xed\xe2\xb5\x1d\xcc\xcb\x82"
+ "\x0b\xca\x45\x88\x69\x54\x54\xce\xb1\xc8\x01\x3b\x91\xd7\x76\x2a"
+ "\xd0\x7e\x5b\x93\x9a\xbf\x56\x80\xff\xd7\x69\xf6\x0c\x15\xe0\x19"
+ "\xf6\xdf\xdd\x72\x8d\x2b\xec\xb4\xc8\x18\xe6\xe1\xad\x77\x3c\x8c"
+ "\xf9\x40\xb1\x0e\x13\xb0\x86\x2a\xbf\x07\x05\xef\xab\xfa\xd5\x86"
+ "\x6b\xee\x4e\x36\x25\xa8\xb8\x90\x90\x71\x47\x83\x21\x5c\xd8\xef"
+ "\x27\x83\x77\x23\xb7\x98\xd9\x8f\xa6\x10\xbc\xe7\xe0\x3c\xfa\xbb"
+ "\x2a\x67\xd8\x5b\x65\x08\x07\xd0\x8f\x66\x65\x3f\x77\xb3\xfe\xc4"
+ "\xdc\x75\xf3\x34\x7d\x5c\x93\xe3\xa1\x81\x1c\x6a\x3e\xb3\xf9\x09"
+ "\x2e\x77\xc1\x69\x24\xe8\xec\x96\x5b\xd3\xe4\x1c\x25\x10\x76\x26"
+ "\x90\xf2\x65\xde\x7c\xa7\xae\x63\x79\xbf\xd4\xb4\x45\xf8\x78\x8d"
+ "\xd8\x14\x14\x3e\x19\x6b\x9f\xc7\x0e\x3a\x43\x9e\x8a\x5e\x87\x47"
+ "\x7e\x83\x93\xbf\x2b\xe2\xd7\xc6\x8d\x90\x1a\x37\x50\xbf\x2f\xf1"
+ "\x8e\x62\x8c\x0f\x09\x67\x08\xb6\x2e\xf0\x67\xda\xf0\x5e\x4b\x18"
+ "\xb4\xf2\xf0\x38\xc9\xf4\x49\xe5\xf8\x31\x66\x3e\xe3\x51\x68\x0a"
+ "\xa2\xcd\x91\xed\x32\x84\xbd\xbb\x9c\x68\x97\x01\xed\x2a\x3f\xcb"
+ "\x32\x13\x60\xdf\x24\xc8\xdb\x28\x19\xcf\x5a\xce\xcf\x2b\xad\x91"
+ "\x6d\x64\xfd\xaf\xda\x50\x39\x33\x5e\x1b\x85\x81\xdb\xc8\x34\xa8"
+ "\xbc\x51\x93\x37\x89\x27\xeb\x8f\x6e\xda\x7c\x62\xe4\x16\xf6\x09"
+ "\xca\x09\x42\xbf\xcd\xe2\x3e\xc4\xf8\xe9\x62\x3c\xe3\xf5\x17\xc3"
+ "\xd3\x60\x79\x4d\x5b\x1c\xc5\xc0\xe5\x50\x7c\x7a\x57\xb6\x5e\x9d"
+ "\xde\x95\x3f\xe6\xf2\x8c\x07\xef\xef\x98\x82\x06\xe8\xe0\xbd\xc5"
+ "\x98\xaf\x6d\x8f\x57\xef\xc8\x2d\x8d\x8c\x57\xdc\x77\x82\xe5\x45"
+ "\xd3\x41\xe0\x43\x01\x39\x11\xac\x93\x7a\x9d\xf6\x3c\x5d\x1f\x99"
+ "\x12\xac\x89\x52\x3f\x18\x84\x2b\x1e\x0c\xd3\x16\x17\xef\x73\xcd"
+ "\x42\xfd\x71\xdf\x87\xf9\xdb\x1d\xae\x9c\xae\xf0\xd6\x6f\xde\x6a"
+ "\x4a\xa0\x7b\x7d\x89\xdf\x1c\x6e\x2a\x0f\xa6\x33\x0d\x01\xb3\x1c"
+ "\x72\xfc\x08\xcf\x53\xd5\xda\x88\x1d\xf6\x7f\xb5\x8c\xcf\xe4\x4b"
+ "\xc9\xe9\x52\xfb\x46\x76\x8c\x7f\xb5\x56\x7d\x6d\x1e\xcf\x9d\x5e"
+ "\xfa\x5b\x89\x92\xcb\xaf\xbf\x2e\x6a\xa6\xd6\x85\x9d\x26\x61\xdd"
+ "\x68\x82\x1d\xe9\xd8\x1c\x16\xfc\x3d\x87\xa9\x75\x03\x7c\xa2\xfc"
+ "\xa5\x74\x3e\xe9\x75\x3a\xd2\xe3\xf3\x80\x63\xce\xd5\x79\xc0\xf1"
+ "\x35\x7e\xcf\x74\x57\x73\x15\x47\xa9\x6e\xa7\x88\xad\x5f\x7f\xdd"
+ "\x5a\x29\xeb\x27\x55\x37\xd3\x24\x97\xf7\x8c\xf2\x41\x17\x07\xf2"
+ "\xd6\xea\x7a\x80\xf9\xc5\x14\xe2\x6f\x5d\x90\xe4\x69\xbc\xc3\xb8"
+ "\x52\x96\xa4\xd6\xc1\xbf\x53\x28\xbf\x5f\xe9\xdc\xe4\xf2\xd9\x4b"
+ "\xf6\xf1\x77\x5a\xfd\x29\x93\x97\x22\x4f\x87\x97\x9a\xd5\x7e\xab"
+ "\x79\xf2\x62\xe8\xec\xe2\xdd\xca\x1f\x3a\x49\xc6\x8b\x82\x4c\x73"
+ "\x8c\x28\x96\x6b\xa4\xa5\x01\x6f\x8e\x17\x85\xf9\xce\x16\x73\xff"
+ "\xb8\xe4\xcc\x85\xae\x10\xd2\x16\xc3\xb8\x34\xa6\x07\xb4\x7b\xd5"
+ "\x10\x3e\x78\x69\x92\x85\xb8\xcd\x97\xb6\x8e\x3e\xf8\xc3\x89\x64"
+ "\xfc\x7f\x2c\x4f\x91\xed\x2e\x4a\xdb\x72\xb7\x91\xfe\xcf\x14\x32"
+ "\x30\x1d\xbc\xb4\xc5\xaa\x68\xb7\xa5\x58\xef\x1f\x2f\xd9\x8f\x4b"
+ "\xdd\xb9\xf5\xf1\xae\x05\x41\xf1\x85\x5a\xe7\xde\x02\xfd\xf7\x5c"
+ "\xad\x7a\xbf\xa9\x2b\x76\x0d\x88\xed\x79\xeb\x8a\xb5\xd6\xa5\xab"
+ "\xd6\xaf\x1c\x3b\x36\x6a\xae\x64\x54\xdf\xc5\xdd\xb2\x5b\x8d\xa7"
+ "\x5b\x8e\xeb\x78\xb3\x5d\x82\x67\xb4\x7f\xd3\x15\xb1\xec\xf3\x8b"
+ "\x34\x37\xf7\xa2\x6c\x1a\xb8\xbf\x93\xf2\xef\x8c\x78\xfc\x16\xe5"
+ "\xdf\xf5\xad\xa2\x87\x97\x2d\x59\xba\x21\x22\x75\x72\xe4\xba\x61"
+ "\xd5\xeb\xa8\x3b\x71\xf4\x7d\xd0\x15\x09\xf3\x37\xf1\xd8\xe2\xfc"
+ "\xa0\x32\x28\xfe\x0a\x7d\x3d\x05\x32\x56\xd4\x5a\x16\xa4\x56\xe8"
+ "\x32\xf1\x75\xd6\xe1\xc3\xd4\xd9\x4e\xd8\x53\xe0\x2d\x13\xda\xee"
+ "\x83\x5d\x77\x91\xd7\x67\x50\xee\xb3\xb6\x5a\x8e\xe9\x3c\x55\x8b"
+ "\x57\xef\xac\x43\x7a\x0a\xae\x9f\xe0\x3a\x14\xd7\xdf\x59\x57\x62"
+ "\xde\xc3\xbe\xf4\xeb\xd8\x97\xde\xf9\x8e\xf4\x07\xf2\x3b\x88\x7d"
+ "\x82\xf0\x7e\x11\xdb\x20\x5e\xda\x6a\xe4\x75\x70\xce\x8b\xb4\xfd"
+ "\xd6\x67\x28\x9b\xaf\x42\xee\x0d\x3a\xeb\x44\xf5\xd4\x0e\xb1\xaf"
+ "\x90\xbf\xb7\x96\x7e\x9a\xb6\x26\x24\x26\x7c\x46\x89\x96\xa4\xe4"
+ "\x5e\xe7\x56\x94\x5d\xb9\x88\xe9\x34\xd8\xb7\x68\xe5\x37\x80\x63"
+ "\xec\xc3\x01\xdb\xf0\x47\x24\xed\x5b\xcd\x9e\xab\x97\xe3\xc2\xd6"
+ "\x45\x11\x36\x1d\xef\x4d\x0f\x57\xf6\x89\x08\x29\xfb\x74\x6b\x99"
+ "\x2e\x07\xb8\x77\xe8\x7c\x1a\x15\x5f\x6f\x65\xd9\xb2\x35\xcb\x96"
+ "\x5a\x33\xd6\x0e\xa7\x88\xe8\x7a\x25\xcb\x56\x5a\xd7\x2c\x5b\xfd"
+ "\xfc\xb2\xb5\x32\x32\x1e\xbf\x8d\x1a\xf3\xd3\x44\xea\x3d\xc9\xfa"
+ "\xb9\x2f\xeb\x68\xa6\xef\xd6\xcf\x39\x26\x9b\xa8\xb9\x67\x07\xfb"
+ "\xee\xa8\xf9\xc6\x5b\x1d\xd1\xf3\x8d\x17\x54\xdc\x09\xd7\xd4\xe3"
+ "\x6a\xae\xf3\x82\xfc\x8e\xf5\x29\xda\xe6\x1a\x88\xff\xbe\x6d\x26"
+ "\x68\x69\xd0\xe8\x76\xb1\xd7\xb9\x6d\x8a\x4e\x37\x2f\xbd\xe0\xd6"
+ "\x6c\xa9\x6e\xa9\x3f\x30\xc6\x42\xff\x45\x8d\xaf\xea\x1b\xb4\xdb"
+ "\x38\x2e\x47\xa2\x5c\x4f\x4e\x99\xca\xf3\x0d\x03\xc3\x44\x7d\x6e"
+ "\xf4\xcf\x71\xe8\x4d\xd6\x6f\xdb\x75\x78\xa8\x33\x93\xeb\xd3\xe6"
+ "\x41\x37\x9d\xa1\x17\xe4\x9a\x73\xd8\x35\xb5\x85\x75\x0a\xc7\x10"
+ "\x09\x57\x03\x8e\xdc\xa3\x7d\xc1\x2d\xd7\x61\xf9\x1b\x04\x80\xc5"
+ "\xeb\xc0\xd0\x73\x27\xf9\x7b\xc5\x9c\xa6\x62\xc3\x6d\xdd\xc1\x6b"
+ "\xcf\xa8\xab\x19\xf8\x07\x06\xce\x36\xbc\xe0\x66\xbb\x93\xe1\x7a"
+ "\x69\xdb\x51\x86\xa7\x62\xdf\xbd\x30\x06\xbc\x93\x3e\x60\x3f\xbd"
+ "\x50\x1c\x31\x2f\x63\x7c\x24\x9e\x7e\xe0\x22\xe3\xac\x2a\x5f\x53"
+ "\xd9\x6e\xd6\x9f\xbb\xb5\xb6\xeb\xed\x01\x3c\xe8\xbf\xad\x66\xdd"
+ "\x6f\xc2\xab\xb5\x9b\xf1\x63\xdc\x23\x71\xd6\xf0\xad\x65\x7c\x51"
+ "\xee\x40\x84\x6c\xf3\xba\xcc\x10\xa4\x1d\x19\xf0\x61\xdf\x46\xb1"
+ "\x7a\x63\xd5\x4a\x6b\xe9\x8a\x95\xcf\x16\xad\x5f\xf2\xec\xb2\xa2"
+ "\xe7\x6d\x59\xd6\xe7\x57\x3e\x55\xba\xea\xe9\x67\x99\x6b\xd6\x96"
+ "\x3d\xff\xf4\xb3\x56\xd6\x2c\x45\xb3\xf3\xf3\x8b\xee\x7b\x64\xe1"
+ "\xa3\xc3\xe9\xbe\x25\x48\xc3\xcc\x3f\x3f\x3b\x4b\xbd\x7a\x78\xce"
+ "\xac\xef\x15\xcd\x5a\xf0\xc8\xfc\x45\xf2\xd0\x4b\xff\xfb\xd9\x2b"
+ "\xe3\x67\x88\xe2\x43\x33\x78\xa9\x19\xfd\x3b\xe4\x14\xbd\x34\x4d"
+ "\xc5\x4b\x7f\xb1\x34\x3a\x5e\xfa\x8b\x40\xfa\xc5\x46\xfc\x8e\x12"
+ "\xfd\xd0\x87\x1f\xb4\xfb\x4b\xd9\x8a\xbf\xae\x7b\xb2\xd7\xf9\x62"
+ "\xed\x00\x7f\xbd\x24\xcf\x52\xb2\x9f\x92\x5a\x9f\x7d\x11\xfa\x7f"
+ "\xeb\x91\xc8\x77\x03\xf3\xc9\x17\xdb\xfb\xe7\x93\xfd\x3a\xe5\xc5"
+ "\xfe\xb9\x25\xd2\xda\x31\xaf\xbc\x8e\xe7\x95\x6a\x3d\xe9\xa5\xe9"
+ "\x92\xa7\x06\x95\xef\x24\xd2\xe7\x95\x2c\xdb\x72\x4f\x4a\xce\x3f"
+ "\x7e\x38\x25\x52\xc6\xe5\x9a\xbe\x26\xe3\x5c\x4e\xae\xdf\x99\xdf"
+ "\x6a\xe6\x35\x6d\xd8\xc7\xcd\xb0\x15\x30\x7e\xf5\x0a\x91\xf2\x56"
+ "\xb3\xc2\xe9\x87\xe5\xbc\xc6\xcd\x76\xb3\xc6\x4f\x23\xcf\xd0\x0f"
+ "\xdf\x13\xce\x17\x5a\xd4\x9c\xf2\x85\x10\xeb\x75\xb1\x75\xf4\x7d"
+ "\xec\x5b\xc4\x73\x27\xd4\x79\x68\x80\x67\x5f\x9a\xc6\xbc\x30\x30"
+ "\x97\xfd\x61\x94\xfe\xef\x91\xdf\x25\xfc\xe1\x49\x3d\xde\x43\xd9"
+ "\x58\x32\x18\xc7\xba\x68\xb7\x41\x40\xdf\xfc\x70\x07\xd7\xc1\xf4"
+ "\xf4\xd2\x8b\x07\x91\xd7\x38\x40\xbf\xed\xe6\x7e\xfa\x69\xeb\x2c"
+ "\xfa\x1a\x8b\xc2\xfb\xa5\xe9\x83\xd1\x2a\x3e\x9d\xb6\x17\x7f\x29"
+ "\x9d\x9c\x34\x84\x65\x52\xa7\xd7\x95\xb4\xda\x7e\xe0\x4a\x5a\x6d"
+ "\xbf\x38\x40\xab\x17\x6f\xbe\x92\x56\xdb\x3b\x22\xf6\x95\xb4\x75"
+ "\x94\x97\xa6\x33\xcd\x98\xc7\xd0\xee\x1d\xe0\xb3\xda\x01\xfa\xbd"
+ "\x94\x74\x25\xfd\x5e\x1a\x13\x9f\x7e\xdb\xf9\x7c\x55\x24\x9c\xfa"
+ "\x78\xe3\xc6\xc8\x2d\x06\xed\x3c\xd8\x4b\xd5\xfc\xad\x7b\xc6\xe3"
+ "\x15\x43\xb8\xe4\x15\x27\x7e\xb8\xf2\x3c\x62\xc0\x16\x17\x01\x8d"
+ "\xbe\xae\x66\xcc\x79\x79\x5d\xe9\x2a\x63\xd1\x49\x7d\xcd\x03\xf7"
+ "\x1d\x3c\x77\xe6\x6f\x42\x71\x3a\xd3\x93\xbf\x31\x06\x7e\xef\x50"
+ "\x76\xe9\x4b\xfd\xdf\xff\xe8\x99\xf8\x60\x76\xe2\x16\xb2\x1e\xab"
+ "\xbb\x8b\xd3\x03\xe0\xa1\x3c\x4e\x67\xdf\xad\xc1\x60\x16\x85\x72"
+ "\x29\x3e\xdc\x1f\xf5\xf3\xff\x60\x67\xa2\x63\xf4\x51\xc9\x92\x95"
+ "\x4b\x57\x2d\x5f\xfe\xe5\xaa\x28\x72\x5f\xcd\xe5\x0c\x6f\xef\xe5"
+ "\xef\x6e\x6e\x7d\x66\x23\xea\x84\xfd\x6f\xeb\x52\xe3\xe6\x8f\xa0"
+ "\xff\x56\x34\x2b\x5b\xf2\xf1\x2e\x75\x0e\xfc\xe5\xb4\x08\xfd\x0c"
+ "\x1e\x79\xd9\x2a\x9c\x3f\x5a\x3c\xd0\xc7\x3f\xea\xbe\xb2\x8f\x5f"
+ "\xa6\xf8\x7d\xfc\x72\x7a\x78\x1d\x9f\xc3\x79\x19\xf3\x9f\x35\xd2"
+ "\xd6\xe4\x67\xf6\x83\xc0\x9c\xb9\x0b\xf3\xe5\xee\x05\x1b\xdc\xf7"
+ "\x16\x6d\x48\x90\x7b\xc5\xfc\xed\x95\xe0\x25\xd1\xc9\xbe\x08\xbc"
+ "\x3f\xc6\xdf\x5e\xe1\x6f\x2e\xf1\xf7\x3f\x65\x1e\xdc\x57\x9d\x26"
+ "\x39\x77\xc4\x7b\x6b\xc3\x69\xf9\x7d\x6c\xd8\x0a\x2f\x3b\x74\xdb"
+ "\xda\x04\x93\x91\xcf\xa7\xef\x52\xfd\xd1\xc1\x7d\xc1\xf5\x15\x6d"
+ "\x70\xab\x3a\x2e\xf1\x77\xd5\xc8\xa4\x6c\x88\x97\x8f\x5c\x75\xed"
+ "\x3e\x65\xaf\x63\xb0\xbd\x4a\x61\x70\x0c\xeb\xdf\xab\xd4\xbe\x43"
+ "\xcc\xb2\xcf\xfe\xa3\xbd\xce\x1d\xe6\x58\xff\x53\xe5\x3b\xb4\x23"
+ "\x53\xf7\xc9\xaa\x92\x3e\x50\x64\x62\xfd\xc9\xf3\x9c\xd3\xb4\x23"
+ "\xbf\x41\x8e\x97\x3b\xf2\x23\xf7\x38\xad\x1b\xb7\x0c\x3d\x47\x2f"
+ "\x5f\xbc\xca\xbe\x69\xf2\x80\xef\xab\x63\x18\xca\xef\xe8\xf7\x11"
+ "\x73\x3a\x86\x35\x44\xe0\x86\x77\x07\x23\x7c\x15\x7d\x3c\x1e\xf3"
+ "\xfc\xb1\x41\x7d\x57\xd5\x07\x1c\x5a\x91\x86\xf9\xc4\x4e\x19\x8f"
+ "\x70\x7d\x90\xc6\xd8\x66\xf0\x37\x7b\x76\x5c\xd4\xe6\xa1\xdd\xd6"
+ "\x4a\xc6\x67\xc7\xab\x0c\xd7\x8b\x7c\x42\xee\x07\xec\xa4\x7e\x9c"
+ "\x23\xea\xd3\x61\x2b\x9a\xec\x4c\xd7\xf1\xf2\xd2\x0e\x19\x3f\x85"
+ "\xbf\x73\x1d\xd9\xa6\xf2\xe5\x2b\x8a\x6c\x25\x1b\x8a\x56\xac\x5c"
+ "\x51\x36\x9c\xca\x97\x3c\xbf\x62\x12\x92\xac\x4f\x97\xac\xb0\x15"
+ "\xad\x90\xd1\x8a\x65\x20\xe4\xb2\x0d\x36\xde\xfb\xb8\x62\x0f\xde"
+ "\x2c\x6d\x79\xc3\xce\x69\x6a\xbc\xdf\xb9\x5b\xe7\x53\xf9\xed\x6f"
+ "\x51\x48\x03\xbe\x57\xf2\x9b\xc1\x89\x68\xe7\xc7\xcc\xc3\x2a\xbe"
+ "\xcf\xae\x0e\x65\x5f\xec\x6c\xb9\xd2\x27\x6b\xa7\x57\xf7\xc9\x02"
+ "\x7f\x9b\x59\xd6\x23\x60\x81\xff\x77\xd1\x95\x65\x76\xa5\xf5\xfb"
+ "\x77\x6a\xdf\x1d\xe7\xbe\x92\xf1\xee\x6b\x58\xdf\xee\x7c\xd0\x53"
+ "\x3e\x87\x63\xf6\x6a\x72\xb5\x6b\x76\x04\xbe\xd2\x97\x97\x61\xf1"
+ "\x39\xa9\x49\x81\x48\x5f\xb6\x5d\x9f\x60\xec\xb5\xe8\xf5\x58\x37"
+ "\x19\xa0\xef\x76\xbd\xe6\x37\xb8\x13\xa5\xff\x31\xca\x01\x96\x4b"
+ "\xf7\xa3\xf1\xf6\xb7\x6b\xd7\x81\x58\x1c\x81\xfb\x58\xa4\x1f\x1d"
+ "\xf0\x13\xdc\xe5\x60\x18\x48\xc3\xf8\x5f\x95\x15\x99\x16\xd9\x4f"
+ "\x33\xe7\xe4\xc3\x80\x5e\xbb\x0c\x9d\x34\x6b\x49\x69\x29\xeb\xa0"
+ "\x25\xcb\x4a\x9f\x5f\xb3\x6a\xad\xd6\x75\x33\x97\x73\x18\x6a\x99"
+ "\x65\xaa\xf6\xc6\xba\x72\xd9\xb2\xa5\x2a\x49\xeb\xc8\xe8\x3d\x2b"
+ "\xe5\xc7\x50\x85\xf9\xff\x8e\x92\x01\x5b\xb1\xaa\x51\x18\x76\x75"
+ "\xe2\x77\x5e\xea\x1f\xd9\xaf\x55\xa5\xd1\x73\xb4\xaa\x0a\x5d\xf6"
+ "\x65\x3f\xdb\xd9\xe7\x2c\xe7\xd1\x1e\x21\xf7\x78\xd0\xaf\xae\x3f"
+ "\xa0\x9d\x43\xbc\xe4\xe2\x33\x5f\x09\x11\x70\x0e\xf7\xd3\x7b\xeb"
+ "\xe3\x1d\x5b\x95\xcf\x84\x91\xbf\x59\xcb\x31\x25\xf0\x1e\xf3\xff"
+ "\x97\x4f\x2a\x3d\x59\xe5\xed\xdf\x7b\x31\x24\x62\xbe\x59\x05\xde"
+ "\x5f\x95\x7d\xa5\x7c\xbb\x92\xae\x94\x7b\xf6\xb5\x74\x59\x75\x1a"
+ "\x47\x7c\x83\x1e\xfc\xe7\xfa\x40\x5f\x33\x6e\xd0\xbe\x89\xc0\xf7"
+ "\x5c\x96\xe7\x15\x62\xe4\x88\x7b\xd9\xaf\xe1\x14\xb9\x76\x28\x9e"
+ "\x72\x95\x44\xf8\x06\x9a\xcf\x90\x6b\xbb\xea\x5b\x97\x43\x97\x3f"
+ "\xb4\x53\xda\x72\x0c\x43\x8d\xeb\x55\x43\x14\x7f\xb9\x0e\xe8\xb4"
+ "\xe5\x39\x3c\x9e\x0f\x0f\xd8\x41\x55\x8b\xa4\xbf\x88\x8a\xa9\xd1"
+ "\xc7\xed\x07\x9c\x1c\x1d\x0e\xf2\xa2\xfd\x49\x3e\x9d\x56\x7a\x9e"
+ "\x48\x9e\x98\xb5\xc4\x86\x09\xf6\x8a\xe5\xcb\x97\xad\x59\xab\xc7"
+ "\x19\xcf\x5c\x55\xba\x54\xc5\x15\x9f\x8a\xee\x5f\x0f\x19\x9e\xce"
+ "\xa1\xc9\x91\xaa\x6e\x63\xec\xdd\x2c\x5e\x13\x91\xfe\xa3\x72\xce"
+ "\xf5\xea\x07\xf5\xda\xfc\xeb\x14\xd5\x14\x28\xff\xab\x9a\x14\x65"
+ "\xdb\x5e\xff\x46\xaf\xb3\xba\x4c\xb7\x6d\x79\xad\xb5\x87\x6e\xad"
+ "\xe5\x33\x72\x7c\x96\x60\xff\x1e\xd1\xc9\x6b\xab\xc8\x53\xab\x7f"
+ "\x8b\x8e\xed\xa6\x9d\x7b\x54\x0c\x6d\xf7\x4a\xf6\x15\x79\xf5\xd3"
+ "\x70\x75\x4e\x87\x48\x4d\x4f\x82\x7d\x96\xcc\x32\x31\xa2\x9b\x7d"
+ "\x78\x39\xf6\x55\x75\x27\xdb\x75\xac\xcb\xf8\x7b\x0d\x9d\x54\x7d"
+ "\x18\x3a\x1a\x3a\xfd\x55\xaf\x2f\x25\xa7\x63\xdb\x46\x4a\xe2\x3a"
+ "\xa0\xaf\xbd\xcd\x8d\x4c\xdb\x1a\xfa\x18\xba\x4c\xd3\xd9\x5e\xae"
+ "\xc7\x4b\xd5\x2d\x6a\x3e\x98\xd3\xad\xad\xb3\x76\x23\x1f\xf4\xff"
+ "\x88\x5a\xc5\xab\x19\xf6\xf1\x0e\x2a\xe7\x6f\x53\xaa\xb8\x55\x33"
+ "\x6a\xd1\x0e\x07\x7f\x03\x12\xb6\x20\xe6\x3b\xd5\x65\x68\x83\x43"
+ "\xf3\x01\x07\xaf\xd4\xb4\x2a\xdf\xfe\xea\xa5\x4c\x03\xc0\x0d\x68"
+ "\x70\x03\x80\x8b\xfe\xbf\x59\x8b\x97\x5d\xb3\x43\xaf\x03\xe3\x9f"
+ "\x0f\x76\xb3\x9b\x6d\x67\xe0\xdd\x8e\xdf\x89\x2a\xb9\x97\xee\x85"
+ "\xde\x37\x09\xf6\x5d\x1b\xf8\xde\x5e\x4d\xb3\x3e\x16\x72\xdd\x1a"
+ "\xee\xec\xb3\x94\xc4\xeb\x7c\x5a\x5d\x32\x86\xa1\x0e\x13\xcf\xed"
+ "\xe1\x4b\x67\x1b\x01\x33\x09\xe3\xba\x4f\xfb\xce\xda\x89\xaa\x0b"
+ "\xec\xe7\xe8\xc5\xb8\x7d\x8b\x28\x0a\x9a\x79\x0f\x6a\x84\xfe\x1d"
+ "\xbb\x86\x0b\x4c\xaf\x57\xb2\x07\xf6\x96\x50\x1e\xf4\x87\x3c\x38"
+ "\x3a\xe9\x95\xb9\x5c\x2f\xcb\x02\xf7\xe5\x65\xf4\x0d\xfa\xc7\x2c"
+ "\x2e\x9d\x6d\xb2\xae\xa4\x11\xa7\xe9\x95\xe7\xb8\x8f\x78\x3f\x98"
+ "\xfd\x0f\x91\x66\xe2\xb8\xfb\xa7\xe8\x95\x47\xb9\x7f\x18\x17\xe1"
+ "\x4a\xf7\x06\x7b\x0b\x1f\xe0\x33\xd7\xac\x33\x37\x57\xc0\xe6\x5e"
+ "\xce\xba\x64\xf7\xa7\x3c\x87\xe7\xef\x25\xf1\xbd\x7d\xa9\x08\xcb"
+ "\xfe\xdd\xc8\xfd\xbb\xfb\xd3\xcd\x5d\x22\xfc\x85\x93\xc4\x71\x3f"
+ "\xd1\x17\x06\x0a\x06\x0c\x09\x8c\xb7\xc1\x7e\x96\xcf\x85\x37\x92"
+ "\xa7\x7c\x3b\xfb\xb2\x25\xed\xda\x48\x66\x3e\x53\xcf\xdf\x02\x6a"
+ "\xf3\xd7\x51\x9b\xad\x8e\x7e\x1f\xdc\x4d\xee\x75\x1c\x1f\xe5\xd5"
+ "\x6d\xff\x5a\xbe\x9b\xf7\xd8\xae\xc3\xfd\x1c\xeb\xf7\x64\x5d\x63"
+ "\xfe\xf5\xc4\x1f\xe9\x5f\xdd\x7f\x24\xeb\x63\xf2\x39\xab\xa5\xf0"
+ "\xf7\xd4\x92\xfb\x7b\xb2\x77\x8a\x30\xcf\xeb\x2a\x9f\xe3\x3a\xb6"
+ "\x03\x56\x23\x9f\x3f\x37\x87\x7b\x2c\xc3\xd1\x7e\x23\xef\x1f\xb4"
+ "\xf9\x7d\xe4\x5e\xf9\x2f\x8c\xe3\x2f\xeb\x2f\x50\x92\x7b\xe5\x6f"
+ "\xe5\xbd\x9a\x6f\x9d\x6d\xf4\x2c\xed\x60\x9b\x32\xc8\x67\xef\x79"
+ "\x4f\x12\x73\x8c\x70\x15\xe3\x18\x52\x78\x83\x5e\x46\xbd\x3c\x6c"
+ "\x4e\xbd\xbc\x8c\x15\xb7\x9f\xe9\x01\x9c\x5a\x17\x29\x9a\xb4\x60"
+ "\xa4\xd0\x70\xfe\xd4\x5e\x18\x49\x9f\x57\x5a\x98\x3e\x1c\xb3\x35"
+ "\x8c\xfe\x02\x6e\xb9\xa0\x41\x58\xaf\x03\x38\x27\x69\x6b\xb8\x49"
+ "\xbb\x2e\x50\xb2\x7b\x25\x7f\x0b\xee\xd5\x3b\x4d\x05\xc6\xa4\xf0"
+ "\xa5\x73\x4d\x55\x17\xc9\xc8\xfd\xc6\xfb\x36\x55\xf2\x3d\xc3\x7c"
+ "\x35\x8d\xfb\x0c\x3c\x99\x87\x5f\x3e\x7e\x05\xcc\x77\xb8\x2e\x42"
+ "\x7f\x6d\x07\x0e\x87\xd0\x57\x8d\x7c\x55\xbc\x98\xe1\xe0\xb8\x24"
+ "\xda\x1c\x6a\x20\x1d\x72\x14\x14\xf2\x7b\xcb\x90\x99\xdd\x87\xc2"
+ "\x90\x23\x5e\xc3\xa9\xaf\xa1\xe4\xb0\xd3\x15\xd8\x0f\x5d\x57\x57"
+ "\x23\xcf\x25\x9b\x79\x5d\xf3\x75\xf9\x6d\x8d\x57\x9b\x74\xdd\xf7"
+ "\xa3\x51\x7c\x76\x73\xf7\x49\x03\xaf\xfb\xb8\x72\x7c\x1a\x9f\xc3"
+ "\x0e\x7b\x15\xfa\xff\x26\x4d\x3f\xd6\xc8\xf9\x05\xcb\xfe\x60\xf3"
+ "\x09\xd8\xb2\x2d\x62\x5f\x21\xf1\xfe\x4f\xf2\x16\xe1\x4b\xee\x34"
+ "\x89\x36\x7f\x8b\x3c\xb3\xdb\xe6\x0f\xc9\xfd\x1f\xbc\x4f\x98\xef"
+ "\xf7\x99\x60\xfb\xb6\x33\xed\xf4\x74\xde\x3b\xe2\x75\xb5\xf9\x7e"
+ "\xe1\x5b\xb0\xc1\xc4\xdf\xc2\x1c\x23\xf7\x0e\xb4\xf4\x36\x0b\xe6"
+ "\x0d\x1b\x7c\x26\x34\x34\xd8\x0f\xab\xa7\x30\x91\xe5\x0d\x79\xd3"
+ "\xfa\xf3\xf6\x14\x1a\xf9\xdb\xce\x5c\x67\x44\xda\x90\x05\xe5\x28"
+ "\xcb\x7d\xa5\xa5\x29\x9b\x79\xcf\xe1\xfe\x39\x25\x9f\x5f\xe8\xc1"
+ "\xb8\xb9\xb6\x30\x21\xdc\x53\x68\x08\x01\x36\x78\xdf\x2c\xbf\xc9"
+ "\x19\xf4\x69\xdf\xb8\xea\x82\xfc\x76\x90\xa8\xfe\x95\x17\xf9\x8c"
+ "\x0c\x97\x63\x41\xf0\xb7\x41\x44\xca\x7b\x25\xf1\x7d\xee\xea\x6a"
+ "\xdd\x95\x8f\x81\x9f\xf6\x1e\x65\x79\x0e\x99\x27\x07\xad\xcf\xb0"
+ "\x0d\xb3\x57\xfa\x06\x84\x20\x63\xa1\x94\xc9\xc1\x49\x5d\x94\x50"
+ "\x09\xbe\x55\x6b\x50\x7b\x1f\xf1\x40\x06\xed\x61\x01\x3b\x74\x6f"
+ "\x1e\xf3\x8d\xa9\x9b\x7d\xe5\xee\x26\xe9\x9f\x96\x5a\xeb\xf2\x04"
+ "\xba\xa8\xc5\xf1\x67\x6a\x09\x7a\x1c\x47\x2f\xf8\x8c\xca\x4f\xcd"
+ "\xc8\x70\x57\xf0\x3b\x3b\x78\xb5\x28\xd4\x48\x83\xed\x0d\xf0\xfc"
+ "\x18\x63\xd8\x5f\xd4\x5c\x71\xef\x51\x7d\x5e\x7c\xf5\x36\xd4\xa6"
+ "\x71\xfc\x0c\x21\x2c\x14\xae\x59\xe7\x02\x2e\x76\xd1\x9b\x49\x93"
+ "\x36\xf2\x9a\xdc\xde\x6e\xcc\x51\x72\x35\xb8\xe7\x15\x5c\xe4\xbf"
+ "\x0a\x5c\xe6\x99\x96\x5a\xd2\xda\xb4\xce\x11\x02\xec\x50\xea\x3a"
+ "\xf6\x37\xb0\xdb\xbf\xe0\x35\xdb\xd7\x1e\x45\x3d\x8e\xb6\x60\x3b"
+ "\x71\x1c\x9e\xfa\x30\xc6\xc7\xf3\x16\xd2\x7c\xf2\xec\xe7\xa8\x76"
+ "\x4e\x58\x64\x9a\x31\x5f\xe7\xfd\x18\x3b\xeb\x38\x5e\x0b\xa8\x0c"
+ "\xd1\x50\x0f\x46\x46\x8e\x1d\x01\x18\xf3\x3e\xe1\xbd\x2f\xe8\x89"
+ "\x90\xb0\x18\x3e\xb8\x84\x91\x1e\xba\x53\xc6\x92\xd8\xfa\xf5\xd7"
+ "\x47\x6e\xa1\x7b\x85\xc1\x24\x7d\x3a\xc3\xd5\x7b\x6a\xd1\xb7\x5d"
+ "\xca\x07\x70\x32\x45\xf8\xff\x25\xa2\x2e\xe9\xff\x27\xcc\x39\xcd"
+ "\x75\x72\xdd\x71\x32\xc6\x8b\x5a\xbf\x97\xf6\xca\xf5\xd7\x1d\x7c"
+ "\xc6\x43\xea\xd8\xd7\x96\xf8\x52\xd6\x30\x3e\x1c\x1f\x3a\x21\xbc"
+ "\x2e\xd4\x54\xf5\x77\x69\x5f\xf3\xbb\x99\x6d\xdd\xbd\x6e\xe1\x5a"
+ "\x53\xcc\xe7\x18\x35\xd8\xa6\x73\xf4\x5a\x8a\xa8\x5e\x53\xec\xa5"
+ "\xd7\x8a\x55\xdf\xc8\xfb\x2c\x7e\x1f\xec\xcb\x84\x5d\x5d\x7b\xb0"
+ "\xee\x32\xef\x05\xd4\x2e\x12\xce\x5b\xdc\x3d\xe6\x35\xc5\x0b\x2d"
+ "\x6c\x53\xbd\x56\xe6\x35\xfc\xa1\x50\x5b\x07\x94\x71\x31\x06\x9b"
+ "\x23\x89\x7d\x96\xe1\x1e\x00\xc1\x7c\x36\xed\x0c\xed\xfb\xfc\xb2"
+ "\x93\x0c\x7d\xb0\x05\x2f\x1b\xc8\x0c\xf9\x4a\xde\x35\x9a\xb2\xf1"
+ "\x6e\xf4\x19\x7a\xed\x77\x41\x03\xa5\xe1\x67\xf6\x7d\xbd\xe4\x3a"
+ "\xc0\xcd\xe5\x35\xd2\xd6\x0b\xbc\xc6\xf5\xba\x3c\xa7\x5c\xf5\x3a"
+ "\xa5\x87\x01\x8f\xf7\x7b\xaa\x46\x53\x3a\xaf\x53\x22\x2d\xb3\x28"
+ "\xa4\xf6\x3d\xf5\xb5\x88\xad\xa3\x29\x2b\xba\xde\xd7\x9a\xd4\x3a"
+ "\xe6\xbe\x4e\x39\xb7\xf2\xd1\x37\x30\xb7\x3a\x05\xb8\x07\x84\x33"
+ "\x51\x88\xaf\x5b\x0c\xca\x37\xe1\xf5\x9d\xa6\x5a\xc5\x77\x72\x9f"
+ "\x0f\xfc\xc6\xfb\xa8\xda\x9e\x52\x82\x8c\x07\x92\x3a\x75\x07\x7f"
+ "\x87\x3a\x62\x9d\xd8\x2c\xf1\xd0\xce\xf0\x87\xb6\xde\xc1\xb1\xc1"
+ "\xe4\xd9\xfd\xa2\x25\x6a\x3f\x8a\xcf\xf7\x7b\xe9\x75\x19\x8f\x71"
+ "\xc7\xeb\x94\xfc\xf2\xeb\x64\x6e\x5d\x2e\xdb\x75\x54\xc9\xa2\x91"
+ "\x18\xdf\xb0\x8b\xe5\x0c\x3c\x01\xbc\xb9\x3e\xe6\x8d\xb6\xe0\x79"
+ "\xb7\xbd\x4c\x84\xdd\xcf\xb0\x2d\xfa\x7a\xc8\xbd\xe6\x10\x2d\xe8"
+ "\x0c\xaa\xb3\xa8\x8b\xc9\xd7\x00\x78\x0d\xa3\xc9\x7c\x9a\xf6\x5d"
+ "\xe7\x29\x25\xde\xaf\xb8\xd5\xbd\xe6\x30\x60\xef\xbb\x99\xc7\x82"
+ "\x9d\xa0\x8f\x1a\x13\xf6\xb5\x7b\x02\x1d\xd4\x0a\xf9\x9e\x6f\x13"
+ "\x12\x0e\xf2\x3c\x22\xdb\xbb\xcf\x62\x2d\x52\x31\x18\x64\x5b\xfb"
+ "\xf7\xf9\xb4\x76\x78\x2e\x48\x78\x25\x1e\x70\x89\xde\x26\x9d\xd6"
+ "\x8a\xbf\xf6\xbd\xe9\x5e\x73\x80\xb8\x7f\x38\x3f\x9e\x77\x7b\xba"
+ "\x91\xf7\x6c\x74\xbf\x70\x1e\xbc\xfb\x04\x70\xbf\x3d\xb0\x57\xcd"
+ "\x7b\xa8\x03\x79\xea\x5e\xe7\xf3\x68\xaf\x27\xed\x03\x8d\xd4\xda"
+ "\xfe\xbe\x3b\x19\x57\xf4\x5d\xb6\xa7\xec\xcf\xf1\x7d\x52\x21\xfb"
+ "\xe0\xfb\x2d\x6d\x72\xcf\xae\x6e\xec\xfc\x60\x58\x28\x7d\x56\x77"
+ "\x22\x0c\x3d\xe0\xc5\x95\x75\x81\xd4\x27\x13\xd9\x0f\xa8\xee\x4f"
+ "\xa6\x04\xd5\xbf\xdc\x16\xb6\x57\xe2\xf5\x71\xc4\x7e\xa2\x99\x71"
+ "\xd5\xfb\x98\xbf\xe1\x18\xe6\x3d\x61\xf6\xb7\xef\xb3\x90\xe2\x3f"
+ "\xe1\x02\xdc\x4f\x94\x1c\x4d\xce\xd5\xe2\x1a\xe4\xf6\xa4\xdc\x9d"
+ "\xc4\xe7\x23\x75\xdf\x60\x91\x72\xb7\xb1\x48\xf9\x73\x5b\x58\x47"
+ "\x35\x18\x84\xc6\x9b\x75\x27\xb4\xb2\xd3\x94\x4f\x46\xdd\x6e\x94"
+ "\x9f\x16\xb7\xbd\x89\xd0\x3b\x4e\xa8\x69\xb4\x87\xed\x48\x01\x5d"
+ "\x85\xf1\x60\xa8\xc7\x7f\x59\xfb\x7e\xe6\xfe\x87\x60\x53\x0f\xe5"
+ "\xf3\x51\x3a\x6e\xd7\xb6\xf7\xb7\x7f\x8c\x9a\xdb\xec\x5f\xac\xaf"
+ "\x2d\x09\x33\x68\xec\x34\x09\x3e\x2b\xc9\xe7\x5d\xfc\x29\x75\x8d"
+ "\xbe\x94\xb7\xda\x95\xdc\xec\xdf\x06\x3b\x55\xea\xdb\xa2\x00\x39"
+ "\xb8\x5d\xbc\xb7\x8b\x79\xd3\x50\x6e\x33\xe0\x60\xfe\x63\x9b\xa6"
+ "\xc6\x73\x05\x7b\xd0\xb5\x1d\xbd\x6d\x68\x93\x6c\x1b\xda\x28\xdb"
+ "\xa6\x7d\x5f\xea\x34\xd5\x8f\x95\xeb\xe5\xd7\xd6\x1e\x15\x5f\xc6"
+ "\x55\xd7\xc8\xdf\xce\x3d\x4d\x0d\xef\xcb\x33\x30\xe8\x13\xb5\x0f"
+ "\x52\x5f\x26\x86\xbf\x3c\xfc\xda\x60\xd6\xe7\x2a\x98\x6f\xb5\xbf"
+ "\xca\xb1\x28\xb5\x6f\xd4\x01\xf6\x8f\x45\xf5\x5b\xf2\x1c\x40\x0f"
+ "\xea\xe3\x6f\x7c\x0e\xe8\xa1\x86\x74\xee\xab\x89\x87\x28\x57\xf1"
+ "\x61\xc3\xd7\x78\xad\x59\xcd\xf3\xea\x8f\x43\xf7\xee\x50\x73\x2a"
+ "\xdd\x8f\x3c\x41\xfa\x91\x47\xea\xd8\x6b\xc4\x51\xea\x3b\x91\xba"
+ "\x27\x17\xf7\x47\xe4\x59\x49\xe0\xbb\x3e\xa8\xeb\xbf\xfa\x23\xec"
+ "\x93\xd4\xef\x0f\xb0\x01\xbc\x52\xa9\xce\x91\xf7\x3a\x1b\x0a\x75"
+ "\x1b\x45\x7e\x93\xcc\x29\x8e\x73\xbe\x05\x1b\xce\x4b\x7f\x81\x2a"
+ "\x19\xf3\xe0\x8c\x76\xce\xae\xe1\x39\x6d\x5d\x23\x93\x7d\xf8\x51"
+ "\x76\xb7\x97\x3e\x96\x67\x02\x99\x06\x5c\xb7\xc4\x5d\x7e\x17\xac"
+ "\xa1\x69\x60\xdf\xa7\x5e\x7e\x37\x5d\xf9\xb5\x36\x1c\xd7\x79\x04"
+ "\xed\x1d\xaa\x62\x83\xd6\xdf\x79\x2c\x8b\x24\x0f\xf4\x08\xcb\xf0"
+ "\xdb\xea\x98\x27\x1b\x7c\x91\x74\x5a\x10\x0c\xdb\x95\x0e\xaa\xef"
+ "\x10\x52\xd6\xeb\x3b\xbe\xdc\x9e\x68\x9c\xa3\xdb\x22\x8a\xce\x66"
+ "\xe8\x97\x37\xcc\x92\xd6\xae\x0c\x2b\xc7\x68\xd9\x54\xc9\x31\xa7"
+ "\x7e\x3c\x84\x63\x7b\x05\x5d\x19\xb9\x21\x3e\x93\x89\x71\x36\xec"
+ "\xca\x28\x38\x6d\x23\x43\x91\x8d\xf7\xba\xd6\x64\xf3\xfc\x4a\xd8"
+ "\x61\x0b\xa4\xc2\x3e\x81\x9c\x6f\x5e\x41\xa6\x27\x4a\x00\xdb\x9e"
+ "\x99\xc6\xb1\xb7\x38\xee\x16\xc7\xce\x0b\xd9\x33\x53\x71\x3f\x0a"
+ "\xf6\x9c\x59\x98\x33\xb2\xd9\x5f\x26\xe4\x14\xd0\xc7\x27\x39\xfe"
+ "\x97\xc1\xe3\x0b\xd0\xe6\xb3\x94\xc4\xb1\xbd\x82\xd5\x6b\xf2\xda"
+ "\xfc\x9f\xca\xb9\xc5\x48\x1b\xec\xe9\xb0\x3c\x97\x63\x09\xa7\xac"
+ "\xc9\xc6\x18\x9f\xa3\xda\x7d\x5e\xa8\x76\x2b\xbc\x19\x7f\xa5\xe3"
+ "\xc6\x17\x54\x4a\xdc\xff\xe9\x67\x41\xc0\x0f\xbb\xb2\xf2\x43\xae"
+ "\xac\x3c\x75\x96\xb3\x85\x2a\xcb\x44\x97\x07\xb6\x31\xfb\x6f\xf2"
+ "\x79\x5d\xf6\xc7\xe1\x36\x72\xfb\xb8\xee\x7f\xbd\x70\x56\xc6\x2a"
+ "\x0b\xe2\xd9\x5e\xaa\x95\xe9\x46\x99\xee\x16\xba\xec\xca\x92\x6d"
+ "\x6f\xf3\xab\xb2\x45\xf2\x9e\xcb\x47\xd0\x41\x6b\x73\x3f\x1d\xd0"
+ "\x76\x6e\x1f\xb7\x3f\xc8\x34\x01\x0d\xb4\xb6\x5a\xfa\xb4\x76\x72"
+ "\x1b\x7f\x8f\x51\xe7\x75\xb4\x13\x6d\x95\xed\xec\x43\x3b\x8f\x97"
+ "\x10\x05\x6a\xea\x9a\xbe\x48\xcd\xca\xe3\xf9\xa1\xfd\x0f\xb0\xa3"
+ "\x2b\x5c\x84\x79\xa0\xf1\x97\x95\x2e\xc3\x8f\x60\x9b\x54\xfa\x30"
+ "\x1f\xf4\x89\x2e\xb6\xf7\x3d\x36\xfc\x82\x75\xf2\xbb\xc3\xd2\x3e"
+ "\xe6\x6f\xc4\xae\x46\x9b\xc2\x9f\x53\x65\x97\xe8\x82\x6d\x1a\xf0"
+ "\x04\x91\xa7\x04\xed\xc7\xfc\xf1\xb4\x86\x3f\xe7\xdd\xfc\x77\xd5"
+ "\x2e\x53\x29\xa5\x7d\xf4\xd8\x76\x83\xa7\x63\x3b\xe9\x6d\x79\x12"
+ "\xf9\xd0\x1e\x0b\x60\x8d\x90\xdf\x65\x40\x3b\xf7\x01\xcf\x40\x44"
+ "\x9b\x5a\xbb\x03\x80\xf9\x27\x1a\x5e\x40\x09\xaf\x9f\x43\x3b\xce"
+ "\x91\xc5\x55\x09\xfb\xeb\x61\xb6\x17\x7f\xfc\xd9\xf5\x85\x94\xee"
+ "\xa5\xc6\x2e\xc5\x77\x32\x6e\xd0\x8d\x67\xe8\x8d\xeb\xfa\x63\x03"
+ "\x71\xbc\xb5\x94\x35\xf9\xcc\x47\x32\x46\x10\x8f\x19\xbd\xe0\x19"
+ "\xf6\xa5\x59\x8f\x3a\x7a\x33\x47\x49\x7c\x9c\x39\x84\xe7\x64\x3c"
+ "\xf3\x37\xa3\xd2\x78\x4d\x00\xe5\xf2\x04\x68\xc6\xf0\x61\xcf\xe5"
+ "\xf0\x95\x69\x18\xf7\xac\xc9\x5b\x34\x45\xa4\x4e\x96\xbe\x0c\x4d"
+ "\x95\x3e\xc3\x0b\x6f\x51\xd6\xb5\xe9\x94\x37\xa6\x0c\xa6\xbf\x79"
+ "\xdf\x82\xe1\xa1\x6d\xa9\x67\xe8\xc0\xcd\xd1\x32\x66\x95\xba\x4c"
+ "\xe9\xc1\x37\x3a\x79\xaf\xe0\x1a\xeb\x95\xfa\x8f\x7d\x9e\xae\xb1"
+ "\x5c\x97\x8e\x07\xee\x0f\x0c\x86\xfb\xb5\xd3\xe1\x40\xee\x60\xb0"
+ "\x76\xee\x91\xf1\xe2\xec\xbb\xf6\xb0\x3f\x62\x5d\xed\x31\x4b\x50"
+ "\xda\x75\xcd\x07\xfc\xb4\x76\x3f\x25\xd9\xcf\xf2\x9a\xcc\x3c\x3a"
+ "\x56\x97\x4d\xf5\x98\x93\x8b\x9e\xcc\xd4\x57\x2e\xb0\xef\x83\xd2"
+ "\x21\x6c\x93\xf2\x59\x4a\xb1\x36\xd3\x5c\xb5\x47\xb7\xe1\xdf\xbc"
+ "\xae\xe2\x22\x19\xd4\x37\x52\xde\x4c\x9a\x6d\x15\xc1\xdd\x86\x70"
+ "\x49\x1d\xc7\xbc\x4a\xdd\xe3\xe5\x98\x57\x7a\x1c\x29\x69\xfb\x94"
+ "\x43\xe6\x7a\x2c\xc3\x77\xae\xa1\x2c\x8e\x7d\x67\xf2\x29\x5b\x4e"
+ "\x8d\xd7\x6f\x4e\x01\x7e\x66\x6d\xbf\xdf\xac\x62\x4b\xbd\xe1\x68"
+ "\xb8\x80\xba\xd4\xfb\x15\x21\xcc\x61\x24\xdc\x35\x94\x5e\x77\x81"
+ "\x32\xd9\x0e\x2a\xfa\x5c\xd9\x6c\x3c\x2f\x9c\xd7\x6d\x12\xa1\xff"
+ "\x93\x49\xfb\xcf\x0c\xc4\xc6\xf3\xad\xe5\x78\x7a\xc2\x32\xd8\x5e"
+ "\x49\xd5\x28\xe9\xf3\x23\xe3\xb1\xa8\x6f\xe8\x11\xed\xae\x21\x23"
+ "\x7f\x33\x96\xd7\xf2\x78\x6d\x98\xcf\xfd\xa8\x31\xe4\xcd\x0e\x3d"
+ "\x66\xd8\xa0\xfb\x88\x2e\x35\xdf\x09\x0f\xc5\xfc\xcb\xd7\xeb\x76"
+ "\xaf\xe3\x31\xe3\x27\x56\x3e\x6b\x34\x30\xc7\xf9\x49\x02\xbf\xe3"
+ "\x34\xf6\x85\xcf\x95\xb4\xfc\x49\x1e\xcf\x7b\xb4\x39\xe3\x47\xd6"
+ "\xfe\x34\x65\xc3\xf0\x58\xc6\x38\x34\xa8\x75\xe4\x91\xbd\xce\x9f"
+ "\x2c\xd5\xc7\x33\x1e\xd7\xd5\xf7\x6a\x7f\x52\xee\x35\xfc\x2f\xd7"
+ "\x55\xf0\x33\x6b\xdf\x7b\xe6\xd8\x08\xb9\xc8\x7f\x50\x1f\xdf\xe4"
+ "\xf7\x48\xb6\x8e\xbe\x6f\xed\x06\x1a\xb3\xf0\x6b\x49\x32\xf6\x06"
+ "\x7f\x77\x54\x8d\xbb\x3f\x69\x1f\xd8\x4f\xcb\x95\xf4\x96\xdf\x1a"
+ "\xe4\x39\x86\x41\xb0\xaf\x85\x4f\xf3\x83\x39\x3e\x70\xce\xfd\x27"
+ "\x67\x07\xea\xf9\xa9\xb9\x7f\x1c\x45\x1d\xec\xd7\xc1\xf0\x95\x6d"
+ "\xf2\x93\x66\xae\x83\xe7\x56\x6a\x7c\xfd\x49\xf3\x55\x6c\xb1\x4c"
+ "\xa6\x6f\x58\x9b\x4f\x7a\xba\xff\xaa\xe8\x5b\x4e\x89\x93\x76\x93"
+ "\xe5\xa3\x4a\xaf\x71\xa4\x8a\xe3\x64\x3a\x45\x3f\x5d\xc2\xef\x99"
+ "\xd7\xdd\x13\x79\x2d\xee\xa7\x1f\x78\x78\xdc\xee\x2b\x4c\x9e\xcf"
+ "\x73\x7d\x69\x8b\xff\xf4\xd0\x04\x94\x43\x5a\xea\x87\xe7\x02\xc6"
+ "\xaa\x8d\x94\xc5\xdf\xf4\x44\xba\x5c\x27\xf0\xdd\xf4\x6c\xef\x6d"
+ "\x69\x64\xb9\x6d\x37\x9f\x07\xf8\xe9\x09\xcc\x2f\xa5\x1f\xae\xac"
+ "\xbf\xe6\x5d\x19\xfb\xef\xed\xcb\xde\x21\xaa\xaf\x0e\xae\xc6\x73"
+ "\x66\xc4\xf3\x08\x7d\x2d\xdf\x4b\x07\x6d\x72\xef\x92\x7d\x9e\x57"
+ "\xf2\x78\xbd\xd7\x31\xe0\x27\x74\x70\xb5\xc2\xe5\xe0\xea\x63\x36"
+ "\xe2\xb5\xea\x13\xf5\x32\x8e\xd7\xc1\xd9\x5e\xfa\xc9\x36\x6d\x3d"
+ "\xa6\x5d\xf2\x15\xdb\xbb\x2f\xf2\x1c\xec\xaf\xee\x9d\xc8\xc7\xe3"
+ "\x44\x51\x39\xe5\x2a\x1b\x7e\x6f\x6d\x18\xfc\x13\xd1\xfe\x4f\x79"
+ "\xad\x2f\xae\x4e\x7c\x9d\x48\x96\xa9\xde\xd3\x2e\x7d\xce\xaa\xdf"
+ "\x2b\xc6\x35\x49\x54\xd7\x3a\x70\x4d\x06\xcf\xb9\x70\xe5\x31\x7c"
+ "\x3b\xae\x69\xa2\xfa\x5d\xb9\x96\x81\x39\xac\x05\xf3\x84\xa4\x9e"
+ "\x94\x3d\xc7\x07\x3b\xab\xc8\xb4\xf1\x6c\xfb\x1e\x29\x1f\xda\x9f"
+ "\x2d\x6a\xf5\xc1\x3e\xdb\x4f\xb4\x36\x28\x2e\x5b\xbf\xc1\x67\x82"
+ "\x7e\xb6\xc8\xbe\x9f\x7d\x57\x7e\x96\x19\xed\xbb\xf2\xb3\x3c\xfc"
+ "\xb6\xe3\x77\x92\xe8\xe7\xc9\xb8\x2e\x1a\xf8\xfd\x3c\xaf\xd7\xf9"
+ "\xb3\x45\xa0\xa3\xb4\xb1\xae\x4d\x27\x72\x79\xf4\x03\xcf\x8b\x52"
+ "\xd6\xd9\x54\x7b\xdf\x6a\xc2\x73\x92\x48\xf9\x95\x4f\x6b\x6f\x23"
+ "\x9e\xcd\x56\x3b\xc6\xb5\x14\xd0\x64\x34\xda\x9c\xf2\x5e\x31\xb7"
+ "\x97\xf1\xed\x49\xa9\x75\x44\x9e\xd3\x64\x98\xdc\x7e\x5f\x0a\xca"
+ "\x81\x96\x62\xe2\x83\xd9\x3a\x3d\x35\x3a\xf1\x7c\xca\xd0\x03\x18"
+ "\xca\x0e\x42\x7e\xc0\xd0\xf3\xf7\xd3\x7e\x34\x7f\x5f\x03\x7d\x8a"
+ "\x7c\x98\x13\x27\xe9\x67\x40\x7b\x9d\x3f\xcf\xfd\xb8\x94\xb4\xef"
+ "\x3b\xff\x6c\x91\x3f\xa2\x2c\xc7\xbc\x88\x57\x1e\x75\x26\xa9\x3a"
+ "\x6b\x1d\xa7\xe9\x67\x8f\xa8\x7a\x7f\x9e\x33\x98\x2c\x55\x8e\x85"
+ "\x7d\x57\xe7\xe5\xb8\x18\x6c\x0f\x4d\xf3\x8c\xf1\x93\xa7\x2e\x8c"
+ "\x31\x7f\x6f\x53\x6e\xa5\x70\x9f\xa6\x9f\x5f\x6c\x0b\x74\x5d\xe3"
+ "\x78\xf8\x73\xe9\x93\x25\x2e\x3b\xc8\x53\x71\x97\xfc\x96\xf5\x39"
+ "\x3a\x94\xe1\xf1\xc9\x98\xf0\x7c\x2f\x63\x8b\xb2\x9f\x06\x8f\x0d"
+ "\x98\x63\xf7\xc7\x54\x0c\x23\x6f\x3d\xa7\x23\xcd\xe3\xf7\xc9\xd8"
+ "\x8b\x03\x7e\xe4\x7b\xb6\x2b\x99\xfa\xc5\xa7\x32\xfe\x02\xe3\x1b"
+ "\x7c\xc0\xcd\x38\x87\x5d\x7b\xb6\x73\x1b\xec\x98\xff\x79\x82\xbd"
+ "\x6e\x96\x09\xeb\x3a\x5e\x2b\xfc\xc5\xfb\xe0\x3b\x11\xae\xde\x73"
+ "\x8d\x63\xf3\x2f\xe4\x79\x20\x7b\x50\x9c\xf3\xa5\xec\xd9\xce\x36"
+ "\x49\x55\xe5\x90\xa4\x59\x75\xc2\xdd\x93\xba\xb7\xa9\xd7\xf9\x8b"
+ "\x93\x1f\x97\xab\xbe\xb9\x46\xb8\x27\xf5\xb6\xd7\x6b\x6d\x47\x9a"
+ "\xdc\x9b\x9b\x54\xab\x62\x4d\x7a\xe9\x50\xda\xa0\x6b\x56\xe8\x67"
+ "\xb6\x07\xd8\xc7\x55\xd1\xe2\xd0\xd2\xfe\xb1\xe1\x9a\xf0\x38\xb4"
+ "\xf4\x2b\xd4\xd1\xa7\xd5\x71\xfc\xbf\x58\xc7\xf1\xab\xd5\x01\xdd"
+ "\x70\xf3\x19\xfa\xe5\xa2\x6b\x9f\x3b\xfe\xd2\x2a\x79\xc5\xb5\xb7"
+ "\x51\xe9\xcc\xb7\x3e\x09\x61\xfe\x16\x34\xbf\xd5\x24\xbf\x3b\x65"
+ "\x20\x07\xc7\xdd\x0c\xba\xd6\xd9\x5a\xcb\x2f\x93\x7b\xdd\x1f\xa9"
+ "\x93\x7e\x29\x63\xdd\xb5\x96\xf1\x9c\xed\x57\xbe\xbe\x9a\x5a\xea"
+ "\x33\x1c\x3a\xc0\xf4\xde\x8f\x7e\xd8\x17\xc1\x67\x6d\xfe\x3f\x92"
+ "\xa7\x98\xd7\x57\xdb\x79\x5d\xdb\x27\x52\xde\x6a\x0a\x43\x37\xc0"
+ "\x46\x0f\x49\x7a\xc0\x7e\x51\xf3\xad\xba\x5a\x39\xdf\xf2\xc9\xf3"
+ "\x89\x23\x64\x3c\x4d\xe7\x2a\x3f\xaf\x7d\x87\xfa\x0a\x39\x86\x48"
+ "\x01\xc7\xd9\xe4\x75\x67\x61\xce\x39\xb9\x20\x98\x28\xe4\x7c\x0a"
+ "\xb6\x3f\xc7\xd9\xf4\xf8\xbd\x14\x82\x1d\x5d\x77\x89\xd2\xea\x60"
+ "\x7b\x42\x67\x9b\x59\xaf\x37\x68\xb1\x36\x77\x5e\x1a\x88\xb5\x59"
+ "\xcf\x6b\x3d\x1d\xb8\xbf\x44\xc6\x50\x75\x5d\xed\xbe\x4b\x94\xbe"
+ "\x7f\x1d\x65\xee\xe3\xb5\xbc\xbf\x29\xdb\x87\xed\x0a\x19\x77\x73"
+ "\x55\x26\xaf\xe7\x0f\xd8\x3e\xeb\x39\x2e\x70\xbf\xde\x32\xca\x35"
+ "\x90\x6b\xa2\xf7\x5b\x72\x1c\x0c\xba\xf6\xb4\x07\xcd\xef\x15\x83"
+ "\x76\x0e\xf4\x41\x33\xe8\x97\x1b\xaf\x6f\x75\x3f\xac\xdd\x11\xb1"
+ "\x52\x3f\x4e\x57\xfa\xdd\x4b\x6f\x27\x0d\xc6\x13\xa1\x7d\x85\x34"
+ "\xa9\x9b\xb2\x95\x4f\xc3\x75\x18\x13\xdf\x2e\xe5\xfd\xf3\xca\xe7"
+ "\xc8\x12\xda\xb7\x38\xc1\xfe\x63\x4a\xe4\xef\x9c\xf3\xaf\xf2\xef"
+ "\xa2\x6b\x52\x29\x65\xf3\xfe\x03\xfb\x3d\x58\x37\xc9\xfc\xd3\xd3"
+ "\x2b\x28\x6a\x6e\x91\xa7\x1c\xa3\xa6\x5a\xe7\xae\x7c\x7a\xd5\x73"
+ "\xb6\x25\x65\x2b\x9e\x5a\x51\xba\xa2\x6c\x83\x0c\xa1\x90\x25\xff"
+ "\xdd\x9f\xb1\x74\x91\xdc\x74\x8e\xb0\x2f\xd2\x07\xd6\xe3\xde\xbe"
+ "\x18\xe4\xf5\x83\x6b\xa2\xd7\xdb\x52\xff\xd5\xc1\x96\xaa\x93\xbe"
+ "\x3b\x4d\x49\x5e\xc3\x1f\xe5\xf7\xcd\x77\x20\x6d\x87\xe6\x63\x73"
+ "\x5a\xcb\x17\x76\xbd\x9b\x0b\x3e\x9e\x76\x8a\x7e\x15\xe4\xfd\x10"
+ "\xf4\x95\xcb\x53\x71\x86\xe7\x92\xd3\x78\x8d\xbf\x95\xd7\x32\xd6"
+ "\x70\xfe\xa6\xcd\xec\xc3\xc0\xfe\x50\xe0\xc3\x03\xa7\xb4\x67\xed"
+ "\x9b\xe9\xfb\x82\xab\x2c\x07\x82\xe7\x2d\x3f\x11\xa2\xf0\x75\xb1"
+ "\xaa\x64\x9f\x38\x5f\xf2\x7a\x44\xfc\xb7\xa1\x28\x5f\x0d\x39\xf9"
+ "\x36\x7e\x37\x09\x57\x86\x0d\xf2\x37\xe6\x0c\x35\xbd\xc9\x38\xcc"
+ "\x2b\x11\xe7\x07\x62\x21\x34\xbd\x8f\xe7\x3e\xfc\xc2\xc2\x35\xce"
+ "\x15\xb1\xbf\xc6\xef\x3e\xe5\xfc\xb6\xe5\xec\x13\xd6\x74\x96\xf1"
+ "\x12\x35\xe3\xaa\x7c\xf6\x92\x44\xe4\x0f\x29\x3c\xdf\xb9\xce\xb3"
+ "\xad\x8d\xac\x4f\xc9\xfb\x24\xf7\x33\x6c\xcf\xbd\xf3\x63\x61\xb0"
+ "\x0b\xde\x83\xf3\x74\x05\x49\x9d\x57\x7b\xbb\x9c\x7d\x10\xea\x61"
+ "\x6f\xd7\xa5\x92\xd9\x95\x4a\xc9\xbd\xce\x77\x72\xfa\xfd\x2f\xcc"
+ "\x6a\xbc\xe5\x31\x8f\x63\x67\x43\x1f\xf5\xf2\xf8\xc9\x78\x30\x0f"
+ "\x03\x66\x31\xef\xcf\xa9\xf3\x51\xef\x94\xc2\xb6\xb4\x5c\xbb\x3e"
+ "\x7e\x47\x7e\x4f\x65\xd2\x0e\x2a\xe6\x35\x6d\xde\x77\xe6\xd8\xd2"
+ "\x90\x57\x6d\xfd\xf0\x57\x7f\x92\xfb\xea\xd0\x29\xbc\x5f\xd2\x50"
+ "\x09\x3b\xc1\x9c\x73\x82\xed\x9b\xa0\x93\x1c\xbc\xb7\x19\xbe\x74"
+ "\xb6\x89\xf7\xa3\xe5\xd9\x42\x19\x93\xfd\xf7\xd4\x70\x91\x8c\x9d"
+ "\xf4\x0e\x7f\xab\xdb\x3c\x40\xd7\x5f\xdd\xc3\x30\x44\x4d\x7a\x92"
+ "\xa9\xc2\xb0\x9d\x61\x84\x2f\x9d\x9b\xa2\x97\x03\xed\x86\x71\x39"
+ "\xf0\xc1\xcd\xb2\x1c\xe7\x95\x31\x51\xcc\x8b\x85\x79\x4f\xbb\xac"
+ "\x53\x3d\x17\x08\xc8\x61\xf0\x52\xa8\x09\xf7\x8b\x98\x4e\xb8\x16"
+ "\xca\xb5\x5f\xcc\xd7\x65\x2c\x1e\xf3\x9a\x62\x8f\xf7\xaf\x6e\x89"
+ "\x0f\xfb\xe2\x96\x41\x67\x49\x7b\xf0\x57\xab\xeb\x3f\x27\xa3\xed"
+ "\x19\xee\xbf\x77\xe5\xba\x3f\xf8\xe9\xa0\xc2\xef\xdd\x21\x3d\x35"
+ "\x59\x79\x3d\xe6\xbd\x2e\xbf\x21\x89\x8e\x59\xf8\xec\xc0\xbb\xb9"
+ "\xc7\x2c\x97\x31\xa7\xf8\x55\x8b\xd7\x78\x5b\xb9\xb2\x45\x54\x39"
+ "\xde\x27\x86\x9d\xda\x95\x68\x31\xdb\xf1\xbe\x5b\xf7\xbb\x80\x4d"
+ "\xda\xb5\x13\xef\x40\xdb\x66\xa6\x9b\x97\x9a\x72\xdb\x4a\xd5\xd9"
+ "\x0c\x3c\x0f\xe5\xf3\xf6\x92\xd6\x5b\x9f\xed\x32\x6d\x71\xf3\xf9"
+ "\xcf\x29\xa6\x60\xae\x81\xf7\x81\xf9\xdc\x3f\xc7\x42\xe0\xb3\xff"
+ "\xbc\x96\xa7\xbd\xcf\x8e\x79\x9f\xa5\xbf\xef\x75\xbe\xbb\x54\x3f"
+ "\xb3\xcf\x31\x95\xd8\xc7\x20\xa4\xf9\x0a\xca\x58\x43\x17\xd4\x3e"
+ "\x2a\xfb\x0a\xf2\x3a\x22\x9f\x79\xe4\xbd\x4e\x94\xab\xeb\xf7\xdd"
+ "\x94\x67\x7d\xde\x3d\xa4\xfb\x46\xe1\xfe\x48\xbf\x5f\x0f\x68\xd1"
+ "\xe3\xda\xbb\xdd\x6f\x7e\x37\xd7\xef\xda\x73\x1c\xef\x4e\x40\x1f"
+ "\x0e\x1a\x8b\x48\xce\xfd\x38\x26\xf3\xf3\x64\x08\xa7\x4e\x26\x8e"
+ "\xd1\x71\xcc\x4f\xda\x39\xe7\xc3\x93\xb5\x33\xf1\x89\xe7\xe8\xdd"
+ "\xbf\x0f\xec\x39\x86\xb4\xf5\xb2\xc3\x8b\x95\xbd\x76\x78\xb1\x5c"
+ "\x2f\xab\xd9\x6b\x7b\x63\x63\xc0\xd0\xb4\xd1\x6b\x50\x67\x1f\x0e"
+ "\x17\x78\xe9\xe8\x36\xdd\x6f\x05\xf9\xcc\x83\xc5\x5e\x13\xae\xa9"
+ "\x27\x14\xcc\xf7\xe4\x7a\xe2\xc0\xfc\xe7\x3d\xe9\x1b\xc4\xfb\x83"
+ "\x61\x1e\x2b\x53\xd7\x39\xa4\x0f\x86\xed\x02\xaf\xbb\x0c\x55\x73"
+ "\xb1\xf7\xb4\x6f\x49\x49\x5f\xcf\x1b\xce\x44\x3f\xa7\xf2\xb3\xa2"
+ "\xd9\x61\xaf\xbe\x06\xbf\xcb\x10\xe6\xb8\xdc\xc2\xde\x28\xfc\x1e"
+ "\x9b\x9f\x60\x87\xf9\x3c\x18\x7b\x51\x87\xb0\xad\xe1\xb8\xf9\xef"
+ "\xdd\xc8\xb4\x57\x32\xf5\xde\x4b\x12\x27\xe7\xbd\xc2\xce\xf6\xa7"
+ "\x8f\x7d\x40\x2e\x10\xf2\xa5\x20\xdf\xcc\xe6\x8a\x6e\xf6\x63\x39"
+ "\xce\x31\x0f\x3b\xb5\xba\x7d\x29\x53\x4f\xdc\x96\x4c\xc5\xbd\xce"
+ "\xf7\x60\xff\xbf\x98\x7b\xed\x72\xfe\xde\xa2\xab\xd9\x22\x6a\x6c"
+ "\xcc\xa5\xc1\xe6\x33\x3c\x5f\x9d\x88\xfa\xe7\x09\xc6\xff\x9f\x67"
+ "\x06\x0d\x01\xd8\x0f\xc3\xc4\x37\x1d\xe5\xd0\x03\xc3\x44\x68\x23"
+ "\xfa\xab\xc7\x02\x7b\xb7\x85\xda\x82\xcd\xd2\x47\x04\x32\x6c\xaa"
+ "\xf4\x8b\x0b\x9e\xe0\x61\xe9\xdf\xab\xce\xc1\xff\xf3\x3d\x9e\xe0"
+ "\x07\xd4\x66\xf3\x91\x7b\xcd\x1f\x31\x66\xfd\x73\x06\xe3\x35\xd1"
+ "\xe6\xa0\x09\xe7\xf8\xfd\x7b\x9d\x6a\x9c\xfc\xe7\x5c\xed\x6a\xe6"
+ "\xd8\x98\x91\x38\xdd\xff\xfc\xca\xa7\xcb\x56\xac\x5a\x39\x21\x7f"
+ "\xd9\xba\x65\xa5\xd6\x87\x95\xcb\x5d\xd4\xf8\x95\x34\x10\xff\xfb"
+ "\xd7\xc9\x3c\xa6\xb0\xad\xc2\x71\xc0\xaf\x16\x03\x5c\x8f\xff\x0d"
+ "\xbb\x21\x9d\xd7\xf7\xfe\x27\x63\x80\xeb\xb6\x08\xc7\xff\x1e\x58"
+ "\xeb\xfe\x75\x4b\xbf\x0c\x84\x3f\xea\xe5\x67\x3e\xfb\x19\x76\xfe"
+ "\x73\x3e\xcb\x51\xbd\xf4\x4f\xfb\xf5\xec\xc8\x58\x49\xec\x8b\xc7"
+ "\xeb\x23\x48\x5f\xac\x9f\xb3\x05\x2f\x62\xdc\xf8\x75\xe9\xc0\xb9"
+ "\x9f\x5f\x97\xa3\xbf\x8f\x28\xf9\x95\x79\xb7\xeb\x7b\xc2\xda\x77"
+ "\xd7\xe4\x1e\x76\xd8\xd9\x97\xab\xd6\x61\x7e\xbd\xb3\x3e\x3c\x2c"
+ "\x49\xed\x01\xfc\xfa\xb0\x7e\xa6\x4c\xc9\xe6\x47\x9a\x6c\xfe\xba"
+ "\xe5\x6a\xfb\xf6\x03\xb2\x71\x24\x69\x40\xae\xff\xa2\x95\x3d\x92"
+ "\xf4\x65\x7b\xfe\x9a\x3d\x7c\xe3\x19\xfa\x97\x9b\x79\x6d\x06\xf7"
+ "\xb7\xe0\x7e\x88\x1c\x6b\xa5\x7f\xfd\xfb\x9f\x69\xf7\xa8\xe3\xfd"
+ "\xdf\x69\xf7\x5f\xc7\xfd\x3b\xda\xfd\x68\xdc\xbf\xa6\xdd\x43\x66"
+ "\xdf\xdf\xa2\xdd\xa7\xe1\x7e\x85\x76\x0f\x9d\xff\xfe\x43\xda\xfd"
+ "\x28\xdc\xdf\xa3\xdd\x7f\x0d\xf7\x63\xb5\x7b\xc8\xe0\xfb\xd7\x69"
+ "\xfb\xa7\x49\xc0\xfd\xe2\xb5\xdb\xe7\x47\xdc\x6a\x8f\xee\x7d\x82"
+ "\x2d\x74\x40\x8d\x19\xfd\x69\x69\xe0\xe9\xa5\x3a\x7d\x91\x7e\x84"
+ "\xeb\x41\x7a\x96\x97\xde\xec\x8c\x48\x3f\xa8\xe5\x9f\x8d\xf1\xc6"
+ "\x1b\x91\x5e\xa7\xa5\x2f\x86\x0d\x9a\x14\x91\xee\xd2\xd2\xcb\xa0"
+ "\x17\x4b\x22\xd2\xb5\xb8\x0e\xef\xef\xf0\x52\xa3\x25\x22\xbd\x5c"
+ "\x4b\x3f\xa0\xfb\x2b\x68\xe9\xa5\x5a\xfa\x51\xa4\x1f\x8f\x48\x2f"
+ "\xd6\xd2\xa1\xff\x7f\xdd\x11\x91\xae\xd6\x15\xe4\x59\x34\x93\x38"
+ "\x56\xc1\xb2\xf5\x7e\xc0\x4b\xfb\x8f\x44\xe4\xc9\x53\x65\xff\xc5"
+ "\xec\xa5\xba\xc8\xb6\x4c\xd3\xd2\x33\xbd\xf4\xb7\xc6\x88\xf4\xec"
+ "\xc1\x74\x55\x42\x2d\x15\x0f\xb6\x86\xc9\xdf\xa9\x92\x7e\x92\xd2"
+ "\xb6\xfc\xcd\x32\x3e\xa7\x66\xda\x2f\x4e\x59\x2b\x85\x38\x45\xbf"
+ "\xc9\xd7\xfc\x03\x9b\xd9\x5f\x4b\x9d\xf7\xfb\x4d\x8e\x3c\x03\xc6"
+ "\x3e\xe7\x7c\x06\x70\x23\xa7\xfd\x8b\x8c\x7d\x32\xa9\xdc\xa1\x62"
+ "\x72\x2a\xff\xd3\x6e\x39\x97\xd7\xf6\x39\x91\xe7\x33\x5e\xdb\x64"
+ "\x38\xbc\xde\xe7\x29\xbb\x2c\x7d\x22\x79\x2e\xc5\x69\x3c\xa7\x95"
+ "\xe7\xc2\x22\xe6\x54\x4a\xef\xff\x66\x59\x98\xcf\xed\x3b\xd5\xbc"
+ "\x9f\x65\x91\xf3\xb3\x6f\x4e\x64\x5e\x2f\xfd\x46\xce\x4d\x13\x2d"
+ "\x29\xff\xd6\xeb\xfc\xcd\xec\x81\xb3\x4a\xff\x52\xa7\xa5\xff\x09"
+ "\xe9\x8b\x23\xd2\xb7\x0f\xae\xdb\xa1\xef\xcc\xe9\x05\x7d\x97\x84"
+ "\x3f\x78\x49\x04\x76\xfd\x07\xf0\x5e\x2e\xcf\xdd\x7c\x23\xe4\x4a"
+ "\x2f\xd6\x62\x60\x7c\x16\x5c\x27\x7c\xd0\xd9\xfc\x8d\x89\xeb\xe7"
+ "\xfb\x7d\x34\xdf\xd6\x2b\x76\x3e\xc5\x7e\x76\x17\x65\x3c\x28\x7b"
+ "\x37\xc7\xdf\x66\xdf\x2d\x3f\xef\x0f\x25\xb7\x61\x8c\xab\x5f\xce"
+ "\xef\x3f\xa5\x79\x25\x3e\x6a\x2d\x09\x51\x3d\x60\xef\x7f\x4a\xf7"
+ "\x9b\xfc\x4d\x7f\xfc\x1f\xc6\x81\xeb\xb3\xcb\x6f\xc5\x1c\x9d\xc0"
+ "\xb8\xf2\xb7\xf0\x44\xf5\x7b\x36\xf1\x5b\xb6\x65\xf7\xb8\x4c\x5b"
+ "\xc8\x8a\xb1\x7d\x0a\xee\x1d\xea\x87\x77\x48\x1f\xac\x4d\x4a\x96"
+ "\x8f\x6a\xfe\x98\xe9\xed\x4a\x5f\x1c\x2d\x13\xff\xc4\xe7\x8e\x8e"
+ "\xf2\xf9\xa7\x12\xd8\xcd\x71\xfd\xaf\x36\xef\x27\x43\x5f\x0d\x6c"
+ "\x93\x73\x47\x0c\x4a\x3f\x7d\xb0\x34\x6c\x48\xda\xc2\xeb\x8a\xf2"
+ "\x3b\x11\x35\x93\xcd\x87\x56\x06\x0c\xad\x1b\x3b\x69\xd3\xd7\xc8"
+ "\xb2\x38\xc0\xbe\xe4\x47\x3f\x1f\x59\xc6\xb1\x45\xf7\xda\x60\x87"
+ "\x1a\xde\xc5\xfb\x0f\x57\x1e\x31\x04\xa5\xbd\xf2\xc1\x52\xb9\x16"
+ "\xe5\xca\xe9\xe4\x31\xc4\xd3\x11\xe2\xb3\x47\xd2\x4e\x86\xfe\x4f"
+ "\x0a\xad\x2f\x49\x0d\xae\x2d\xb9\x7e\xff\x1a\x4a\x0e\xad\xcd\x4c"
+ "\x7b\xe5\x12\x4d\xd1\xc7\x1f\xcc\x61\xb3\x45\xaf\x65\x78\x15\xc6"
+ "\x14\x9e\xe3\x8e\x4c\x30\xcb\x3d\x37\xbe\x0f\x1b\xde\x48\xaf\x5f"
+ "\x77\xf5\x6f\xde\x84\x30\xb7\xe5\xd8\xd3\x8c\x4b\xbc\xb6\xee\x78"
+ "\x1d\xf3\x65\xed\x9c\x6c\xe5\xe7\x34\x0a\xf3\x16\xc3\xc8\x8b\xc2"
+ "\x7d\xa6\x94\x0c\xfc\x9d\x90\xca\x65\x72\x1d\x69\x48\x6b\x49\x90"
+ "\x3c\xe5\x7f\xa6\xca\x35\xdc\x47\x1f\xbc\xcf\x76\x1a\xfb\x4d\x22"
+ "\xbf\xf9\x0c\x7d\xf0\x3b\x53\x00\x63\x46\x00\xb6\xf4\x33\x3c\x27"
+ "\xfc\xe0\x53\xbf\x8c\x7d\xfb\xa1\x95\x7d\xc7\xdd\x6b\xee\xe3\xb4"
+ "\x2f\xec\x9f\x4b\xdf\xd8\xe3\x4a\xb6\x3e\x38\xc1\xcf\x76\x3e\xb7"
+ "\x9b\x3a\x35\xf9\xad\xcb\x81\xff\xcb\xde\xf7\xc0\x45\x55\xa5\xfd"
+ "\x9f\x19\x10\xc9\x48\x06\x17\x09\xcd\x6a\x6c\xb1\x9d\xca\x3f\xd4"
+ "\xea\xbb\xae\x61\xe2\xbf\xd6\x5c\x4d\x74\xfd\x83\xe5\x1f\x34\x29"
+ "\x74\x45\x47\x44\x44\x44\x40\x34\x5e\x6b\x15\xc7\x42\x16\x13\x75"
+ "\xea\xc5\x7d\xa9\xfc\xc3\xee\xda\xfb\x62\x6b\x3a\x26\x16\x28\x30"
+ "\x58\x58\x68\xa8\x23\xa1\x21\x8b\x36\xc9\x28\x83\xce\xdc\xfb\x7b"
+ "\x9e\x73\xee\x9d\x3b\x77\x98\x01\xc7\x34\xdb\xdf\xbe\x7c\x3e\x7c"
+ "\xee\x9c\x7b\xcf\x3d\xf7\xdc\xf3\x3c\xe7\x7b\x9e\xe7\xb9\xcf\x79"
+ "\x9e\x4e\xcc\x56\xf1\xc9\x49\x61\x7d\x88\x61\xfa\xd7\x27\xd5\x9e"
+ "\x78\x97\xd3\x69\xb4\x3c\xc6\x46\xcf\xb7\x91\x17\x2d\xbc\x89\x7e"
+ "\xcf\xc4\x78\x05\xc9\xc3\x0c\xfc\x75\x1d\x61\x7b\xec\x0e\x6e\xe1"
+ "\x36\x69\xb4\x2c\x5e\xe5\xc1\x4d\x84\xf9\x22\xc1\x1a\xa9\xc9\x60"
+ "\xb6\x5c\x8d\x8e\xd9\x36\x35\xfa\x35\x3d\xd1\x57\xf9\x60\x5e\x73"
+ "\x90\xa6\x08\x8e\x0b\x9b\xbb\x3d\xa7\xf7\xbc\x1e\xf5\xd1\xab\x1f"
+ "\x21\xc1\x68\x53\x47\xbf\xe3\x1d\xcc\xdf\x18\x9e\x71\x28\x9f\xdf"
+ "\x44\xaf\x3d\x5a\xa7\x25\x3e\x4c\xdf\x3b\x78\x69\x40\x3e\x01\xb9"
+ "\x82\x3c\xc0\xab\x34\x51\xd4\xc7\x4b\xa7\x89\x31\x36\xf1\x06\xf4"
+ "\x2d\x64\xdf\x3e\x0e\x15\xf2\x41\x9a\x28\x56\xff\xd0\x6f\x2b\x9b"
+ "\xe0\x1d\x54\x1a\xb5\xd1\x7a\x59\x90\x09\x0f\x01\xef\x6b\xd4\xbc"
+ "\x4e\x13\xce\xf6\xbf\x1f\x7a\x43\xc4\x55\xc6\xa3\x87\x56\xb1\x71"
+ "\xeb\xa3\x67\xe3\x76\xa8\x50\x58\xaf\x1e\xc5\xdf\xb0\x76\x87\xb3"
+ "\x6f\xf5\x87\x12\x45\x19\xd9\x24\xd4\xc1\x7b\xe0\x77\x34\xc3\xda"
+ "\x43\x39\xf0\xee\xc2\x1e\x86\x43\xf4\x7b\x21\xbc\x1f\xac\x59\x07"
+ "\xab\xf0\xbd\x3c\x61\x2b\x1d\x8b\x54\xe2\x03\x7d\x8e\x44\x9f\x52"
+ "\x94\x53\x8c\x96\x61\x06\x96\xcb\xf2\xf0\xd3\x74\x1f\x30\x3c\x07"
+ "\xe8\xa3\x44\xdc\xc4\x7d\xcb\xd8\x9e\xd4\x7f\x43\x77\xb1\x2f\xf8"
+ "\x3c\xbc\x06\xef\xaa\x46\x7a\xc2\x58\x85\x63\x1d\xa4\xeb\x45\x2d"
+ "\xda\x38\xae\xc1\x98\xa1\xbf\xd0\xe1\x48\x1c\x13\x36\x66\x87\x1d"
+ "\x39\xcf\xd9\x78\x1d\x0e\x92\x8f\x07\x2b\x73\x2a\xc0\x86\x04\xf4"
+ "\x1b\x39\x1c\x29\x8c\x5f\x93\xf0\x7c\x9a\x87\x93\x5d\x33\xec\x74"
+ "\xba\xf7\x61\x47\x5d\x96\x37\x55\x89\xdf\x60\xd1\x26\xcf\xf8\xd5"
+ "\x50\xe5\x74\x5f\xd5\xec\x1f\x50\x46\x0e\x53\x63\x9e\x4b\x1c\xf3"
+ "\x96\x4c\x43\xbd\x34\xde\xac\x1d\x37\xcf\x78\x44\x7c\x86\x89\x18"
+ "\x0a\xc4\x7e\xc2\x6f\x61\x0d\x3e\xac\x91\x68\x62\x18\x23\xde\xb7"
+ "\x9d\xee\x25\x3a\x64\xc1\x3d\x90\x6e\x71\x10\xbf\xfd\xc0\xa8\x54"
+ "\xda\x86\x19\x28\x3f\x92\xc3\x7a\xf4\x89\x85\x71\x8d\x64\x3c\x74"
+ "\x78\x2d\x5b\x0b\x0f\xeb\xb1\x4d\xfc\xae\xc2\xe2\x9d\x1e\x06\xcc"
+ "\x3a\x24\xe4\xea\x3e\xbc\x4b\xe8\x03\xe8\x7f\x07\x0b\x5c\xf5\xba"
+ "\x11\x73\xe6\xd1\xcd\xbe\xfd\x96\x69\x5d\xf7\x15\xf9\x4b\xfb\x3a"
+ "\x0f\x37\x38\xed\x8b\x15\xf6\x1a\x7e\x3a\x10\xf4\xd4\x7d\xd9\x2c"
+ "\x2e\x6e\x71\x36\xd0\x2c\xfd\x1a\xe9\x89\xf9\x61\xd2\xb4\x7c\x63"
+ "\xa5\x16\x74\x6b\xd5\xa0\xbe\xbc\x6e\x50\x78\xda\x35\xd2\x05\x7d"
+ "\x2e\x10\x6f\xd0\xde\xc3\x07\xc1\xf9\x4d\x83\xc2\xa5\xbd\x77\x25"
+ "\x26\xd0\x6d\x0b\x37\x80\x2e\x9b\x7e\x99\xf4\x64\x3e\x14\x9f\x2e"
+ "\x11\xec\x3e\xef\x70\xba\x41\x03\x71\x5f\x67\x25\x68\x84\x7c\x7a"
+ "\xdc\x3b\xdc\xa6\x41\x03\xa1\xdd\x51\xe9\xf1\xa4\x1b\xae\x6f\xe8"
+ "\xab\xcb\x78\xa6\xc4\x00\xed\x8e\xc2\x98\x6b\x1c\x1f\xad\x80\xe7"
+ "\xaf\xe3\x54\x43\xaa\x36\x70\x84\xfa\x88\x03\x9f\x29\xeb\xc8\xa7"
+ "\x87\xe1\xf9\xeb\x30\x6f\x25\xda\x7c\x8c\x56\xe8\xe7\xa6\x41\xeb"
+ "\xe0\x5a\x57\xb8\x86\xf6\x1e\x0e\xe3\xaf\x61\x3c\x77\x68\x3f\x14"
+ "\xdb\x87\x67\xad\x63\x7d\x37\xd3\xba\x75\xe4\x48\x6f\xac\x23\xc6"
+ "\x75\xe3\xd2\xa3\x7d\xf0\x3a\xee\x13\xb6\x63\x5e\x04\x90\xce\xd9"
+ "\x3d\x35\x8e\x7b\x04\xf9\x19\xe6\x72\xc9\x7e\xfe\xad\xe7\xd0\xf7"
+ "\xa7\x18\x7d\x52\x99\x2c\x5b\xb2\x4f\x98\xeb\x20\x1f\x97\x7c\x24"
+ "\xfc\x0e\x70\xd4\x4d\x8f\x26\x69\xad\x24\x94\x7e\x57\x5d\xee\x03"
+ "\xd8\x5b\x12\x80\x39\x16\x9c\xda\x3c\x8f\xed\xad\xc7\x78\x71\xb1"
+ "\x24\x00\x70\xf9\x7e\xe8\x37\xe6\x47\x39\x8f\xb6\x5a\x61\x6c\x4c"
+ "\x40\xa7\xa2\x8d\x2c\x26\xe0\xbe\x0d\xc0\xfb\x69\xab\x40\x1e\x58"
+ "\x45\x02\x56\xd9\x49\x2f\x7c\x4f\xa0\x5b\x03\xfa\x55\xa3\xee\x86"
+ "\x63\x23\xd0\xb0\x00\xde\x65\xd7\xaa\x38\xbe\x7e\x55\x13\xdf\x50"
+ "\x11\x57\x43\x60\x9d\xe9\x56\xa9\xad\xc2\xd8\xe4\xe7\xf1\x5d\xd1"
+ "\x46\x09\x63\x0a\x72\x26\x3c\x63\xd3\xa0\x5d\xb8\x57\x86\xda\x09"
+ "\x94\x87\x8b\xc5\x7d\x45\xdb\xe9\xde\xa3\x92\x70\x87\xed\x2b\x89"
+ "\x2f\x11\xfa\x52\xca\xe1\xef\x24\xba\x3f\xb1\x0b\xea\x3f\x68\xd3"
+ "\x98\xbd\x42\xef\xd8\xa3\xc1\x6c\x03\x25\x0b\x9d\xe2\x72\xd1\x7b"
+ "\xd1\x46\x80\xf7\x4e\xb0\xf1\xd7\x36\x0a\x75\xf1\xde\x09\x2b\x66"
+ "\xf3\x78\x2f\xdc\xa3\x77\xdc\x23\xdb\xe3\x73\x84\xc9\x15\x30\xb6"
+ "\xf8\xdb\x0c\x63\x29\xf8\x50\xa9\xd9\xf7\xef\x92\x1a\xf1\x9b\xb3"
+ "\x89\x7c\xaa\x43\x7e\x72\x1f\x4f\xfc\x28\x91\xc7\x48\x3a\x5a\x85"
+ "\xf1\x9b\xe0\x7c\xa8\x18\xcb\x08\x7e\x87\x41\x5b\x4c\xce\x76\x8a"
+ "\x51\x96\xed\x14\xef\x30\xdd\xcc\x7f\x8b\x7c\x02\xb8\xe2\xd3\x48"
+ "\x8e\x82\x5c\x34\xa4\x8a\xed\x93\x3a\x7a\x18\xfb\x59\x47\x8e\x62"
+ "\x2c\x85\x40\x16\x4b\xe1\xe8\x6a\x01\x3f\x0c\x13\xec\xb6\x40\x13"
+ "\x3c\x13\xf7\xfc\x38\x95\x93\x01\x4f\x54\x50\xef\xaf\x2c\x1e\xe0"
+ "\x51\xad\x4b\x7d\xbc\x9e\xe1\x52\x8e\x74\x29\xab\x2d\x30\x6f\x3c"
+ "\x7d\x5b\xdf\xd0\x93\xda\x0f\xeb\xbb\xae\x26\xda\xf4\x4b\xc4\x07"
+ "\x78\xe5\x02\xf6\xad\xb2\xa1\x09\xdf\x29\x90\xcf\x0c\x27\x68\x03"
+ "\xa5\xb2\x25\xac\xe9\x75\x61\x50\xe7\x12\x09\x41\xbf\x6f\xcc\x91"
+ "\x02\xf5\x1b\x59\x1c\xf3\xcf\xa7\xcf\x58\xd6\x85\x70\xaf\x45\xdf"
+ "\xcf\x2b\x27\xe2\xf7\x44\xff\xdd\x37\x4c\x9d\xf0\x3b\x57\xda\x16"
+ "\xe0\x49\x3b\x09\x01\x1e\xab\xc7\x7c\x74\x70\x4f\xd3\x7f\xdd\x68"
+ "\xe8\x64\xb4\x9d\x26\xda\x05\x44\xd9\x48\x3e\x1f\xe7\x9b\x4a\x7c"
+ "\x37\x5e\x24\x2a\xa0\xab\xed\x88\x6d\x30\x11\x63\x21\xe4\x77\x63"
+ "\xfb\xb8\xf3\x01\x5f\x97\x86\xf2\xd6\x96\xcc\xcf\x0a\x41\xf7\xca"
+ "\x11\x75\xec\xf5\x2c\x0f\x8a\x2f\x3c\xbf\xbb\x52\x88\xfb\xc0\xc6"
+ "\xf6\xb3\x0b\x6c\x9f\x55\xf0\x6b\x70\x4f\xad\x24\x7f\x7f\xce\x72"
+ "\x8d\xeb\x86\x08\x6b\xdd\xe7\x71\x47\x40\x82\x5f\xcb\x7c\x14\x82"
+ "\x5b\x32\x3f\xf7\x77\xf8\x28\x50\xbb\xd5\xe7\x71\x40\x43\x0b\x93"
+ "\xcd\x87\x00\xbe\xfb\x0b\x73\x10\xcf\x87\xa9\xf1\x5e\xb8\x2f\xd0"
+ "\x42\x6d\x4c\x9f\x8f\x92\x78\xed\xf3\x00\xc4\x7c\x78\xa7\x00\x13"
+ "\xf9\x2c\x03\xdf\x0b\xc7\x04\xea\xf9\x42\x79\xed\x91\x02\x0f\x71"
+ "\x61\x55\x61\x55\x36\x6a\x03\xf9\x73\x1c\xf0\xd3\x65\xa0\xc1\x2f"
+ "\x30\xf6\x93\x11\x9e\x53\xb1\xfd\x06\xa9\x08\x6d\x26\x95\xf0\x1b"
+ "\x7d\x91\x0d\x0b\xbe\x25\xf5\x6a\xf7\xeb\x0d\xac\x59\x51\xd0\xe7"
+ "\x18\x6c\x0b\xb1\x00\xfd\xb7\x8c\xa9\xb0\xfe\x98\xa1\xad\x7a\x42"
+ "\xdb\xa8\xe0\x1a\x48\x45\x32\xea\x59\x1f\x69\x2b\xb7\x9f\x26\x95"
+ "\xa1\x5f\xd2\xe7\xa0\x4c\x68\x48\x68\x6e\xaf\x6d\x2d\xb4\x9d\x21"
+ "\xb4\xdd\x04\x6d\x07\x7b\x6e\x3b\x57\xe7\x65\xdb\x5e\xf4\x3b\x37"
+ "\xc3\x9b\xb6\x41\xde\xad\xc6\x3c\x37\xb8\xaf\x2b\xad\x07\x79\xc0"
+ "\x7e\x1d\xe3\x7e\x3e\xca\x33\x7f\xd8\xb2\xa1\x74\xef\x57\x26\xdd"
+ "\x3b\x53\x45\xf7\x80\x5d\x21\xd4\xa7\x91\xed\xfb\xba\x40\xd0\x1f"
+ "\xa2\x25\xb3\x4c\x23\xe9\x4a\x8e\xef\x54\x20\xab\x96\x8d\x63\x7e"
+ "\x8f\x03\x85\x38\xe4\x65\x18\x37\xd2\x83\x9e\x37\xc8\xc6\xfc\x67"
+ "\xcb\x5e\x17\xed\x2f\xcd\x41\x83\x6c\x42\x5b\x6a\x57\xbb\x9e\x98"
+ "\x90\x36\x36\x39\x51\xcc\x6d\x9b\x28\x6c\x3f\x9d\x14\xfb\x4a\xec"
+ "\xfc\xa4\xd8\x79\xea\xc9\xcb\x12\x16\xf5\x5b\xfc\xea\xab\xea\xf1"
+ "\xb1\x4b\x97\xce\x79\x2d\xb6\x0b\x99\x9c\x30\x67\xd1\xd2\xf9\x68"
+ "\x7b\x53\xab\x47\xfd\x7a\x76\xdc\xe2\xc4\x7e\xcf\x8d\x0a\x77\xb1"
+ "\xbd\xe1\x5e\xc5\x5a\x94\xc1\x61\xed\x08\x49\xb3\x93\x20\x8c\xe3"
+ "\x13\xb8\x82\x37\xac\x04\xfd\x0f\xf8\xaf\x11\xd7\x29\x5c\x1b\x50"
+ "\x37\xc0\x18\x82\x80\xdf\xe5\x5b\x73\xf9\xaa\x8b\xe4\x1b\x3b\xc8"
+ "\x95\x35\x3b\x58\x3c\xbc\x5a\xd0\xc9\xcd\x2c\xdf\xe2\x37\xa7\x30"
+ "\xd6\xdd\x9f\xe0\x9c\x39\x68\x88\x65\xe3\x59\xe2\x0b\xeb\x1a\xe8"
+ "\x25\xc7\xf2\x78\x65\x67\x7e\x7d\x08\x5f\xc2\x7f\x1b\x4a\x84\x18"
+ "\xe2\x4a\xa3\xc9\x8a\xdf\xf3\xfd\x27\xd8\xd2\x79\xc4\x53\x36\xb7"
+ "\x8e\x6d\x61\xe3\xa2\xd1\x32\xbf\xe2\x6f\xf6\xa3\x0e\xb3\x86\xe6"
+ "\xc3\x3c\x06\xf3\xff\x13\xad\x84\xd3\x5f\x96\x08\xb2\x23\xc6\xf8"
+ "\x58\x5e\x07\x65\x16\x67\xe4\x58\xb5\xdc\x57\xa3\x1c\xd6\xe5\xaf"
+ "\x1b\xd8\x3f\xde\x53\xe3\xcf\xfe\xf1\xb7\xf3\xff\x37\xf9\xec\xdf"
+ "\xf5\xfc\x8f\xfd\x17\x9f\x7f\xbb\xf7\x57\xa7\xb6\xff\x7f\x2b\xcf"
+ "\xc7\xe3\xbd\x7c\xff\x1f\x73\x7f\xf5\xda\xf6\xfe\x91\xdf\x80\xb7"
+ "\x6a\xff\x74\x96\xf8\x03\x7f\xe6\x6c\x98\x0b\x3c\x7d\x86\x84\xa6"
+ "\xda\xf8\xfa\xf4\x99\xa4\x57\xda\x25\x82\xf9\x08\x1b\x12\x93\xf9"
+ "\xfa\xb4\xeb\x28\x93\x56\x4f\x01\xfe\x2d\xce\xae\x23\x01\x1b\xea"
+ "\x88\xaa\x32\x11\x73\x15\x63\xac\x2f\xc0\x99\x26\xf8\x87\x72\x79"
+ "\x92\x95\x1c\x37\xff\x80\xfe\x4d\x86\xca\x18\xc0\x9d\x5a\x42\x90"
+ "\x7f\x03\x62\x48\x70\x7e\x08\x7f\x80\xcf\x5c\x0c\xeb\xd9\x62\xcc"
+ "\x4b\x58\xbd\x97\x8b\xec\xb4\x37\xa5\xb4\x93\x7a\x2e\xae\xf1\x15"
+ "\xd3\x05\xde\x3c\xca\xf6\x14\x7d\x49\xf7\x33\xc0\x3c\xa9\x66\x76"
+ "\xf5\xea\xe1\x6c\x3d\xaf\x0e\x12\xec\x4d\xf0\xfb\x4b\x2a\x2b\xc2"
+ "\x7b\x14\x63\xfe\x56\x6c\x73\x0f\x57\x4c\xf3\xb7\xee\x4d\x89\xec"
+ "\x94\x3a\x87\x28\x2b\x4d\x8d\x04\x73\x3b\x61\x2e\x50\x98\x77\xbb"
+ "\x60\x9e\x15\x6d\x0b\xe1\x75\xd0\xbf\xf5\xdb\x43\xf8\x75\xd0\xa7"
+ "\xc2\x96\xcc\x8a\x52\x58\x7b\x0e\x08\xdf\x5d\x0c\x30\x2f\x76\x6d"
+ "\x80\x3a\x13\x96\x91\x47\x37\x40\xbd\x6c\xa8\x87\x72\x32\xeb\xdf"
+ "\x89\x0d\x30\x06\xfb\xe0\x99\x55\xea\x59\x58\x36\x52\xdf\x1b\x7c"
+ "\x36\xbc\x87\xba\x8e\x18\x43\x61\x6d\xf3\xc5\x67\x88\xcf\x6d\xc9"
+ "\xac\x04\xfc\x2b\x4d\xa4\xdf\xce\xe0\x3c\x6b\xa7\x72\x32\x9b\xaf"
+ "\x83\x26\x6f\x94\xf2\xeb\x4e\xde\x90\x02\x6b\xfa\x0d\x1a\x03\x33"
+ "\x07\xed\x2d\x28\x63\x50\xb9\xc2\x4e\x02\x99\x7d\x00\x64\x8b\x38"
+ "\xc0\x01\x90\x27\xa8\x2f\x34\xc8\x12\xd0\x97\x1c\xcc\xf3\x88\xd7"
+ "\x41\x6f\xdb\x07\xeb\x72\x11\xca\x01\xb3\xae\x8d\x25\x68\x63\xc7"
+ "\x1c\xad\x4b\x67\xf0\x56\x96\x33\xa7\x72\x9f\x28\x0b\x20\x06\xe1"
+ "\xfa\x0f\xb2\xb0\xef\x4d\xa0\x21\xf0\x40\x29\xc8\x16\x41\x8d\x74"
+ "\xe5\xa0\x63\x5f\x4a\xd7\xfc\x24\x1a\xb3\xd9\x87\x61\x74\xa5\x1d"
+ "\xde\x2f\x00\x9e\x01\x63\x56\x4b\x6d\xe1\x0c\x63\x8c\x01\xe2\x3a"
+ "\x8e\x3a\xaf\x09\xda\xe0\x01\xcb\x84\x6b\xf0\xfe\x47\xc5\x5c\x77"
+ "\x20\x57\x54\x1e\x10\xc6\xac\x9c\x7d\x43\x36\x52\xdd\x1f\x64\x2e"
+ "\xc1\xb6\x59\x59\x8a\x72\x85\x70\xaf\xc3\xff\x11\xf5\x72\x0e\xe4"
+ "\x0a\x1c\x2f\x1c\x27\x68\xa7\x54\xc0\xb1\x6a\x26\xbf\x9c\x58\x26"
+ "\x7c\xb7\xc4\xfc\x17\x6b\xa5\xf1\x37\x16\x3a\x8f\x3f\xdc\x2f\xe8"
+ "\x8d\x27\x7a\x3b\xd1\x0e\x74\xa3\x2a\x2b\xda\x49\xa1\x8f\x07\x98"
+ "\x8d\xc7\x78\x1e\x63\xa5\x61\x6c\x66\x18\xe3\x03\xeb\x31\x0e\x30"
+ "\x60\xf3\x9a\xb3\x04\xbf\x7d\x83\xfc\x54\x75\x9e\xc9\xa7\x55\x19"
+ "\xc8\xc3\x50\xa6\x76\xf8\x7a\xe8\x17\xb6\x07\xe5\x89\x70\x04\x39"
+ "\xb6\xea\x05\xe7\x7c\xca\x52\x2e\xe5\xaa\x48\x69\x3f\x82\x71\x21"
+ "\xd3\x9f\x8d\x0b\xd1\x06\x46\xeb\xdf\x8c\xc3\xbe\xd5\xe2\xbc\x14"
+ "\xdf\x15\xf3\x2a\xc3\x79\x94\xfd\x6b\x91\x6e\xe2\x79\x8c\x21\x0c"
+ "\x74\x0a\x80\x67\x9d\x12\xfa\xb4\x0f\xca\xfe\x50\x0e\xa3\xf6\xfd"
+ "\x9b\x74\xbf\x79\xed\x86\x34\xe9\x1e\x9c\x37\xc0\xc3\x81\x50\xe7"
+ "\x04\x1c\x79\xb1\x2e\xcb\xbd\x5c\x15\xfd\xf6\x0d\xb4\x81\x55\x69"
+ "\xc5\xdc\xcb\x98\x77\x19\x31\x63\xc3\x2c\xd9\xd8\xe3\xd8\xec\x02"
+ "\x5a\x51\xbe\x3b\x62\x2b\x86\xf1\x3e\x01\xf2\xff\xc7\xd1\xec\xbd"
+ "\xaa\xa2\x85\xfe\x19\x58\xfc\x94\x32\x1d\x8d\xf7\x4b\xf5\xa1\x13"
+ "\x91\x0e\x7d\xc8\x21\x5b\x56\x45\x23\x4f\x42\x5b\xe5\x48\x7f\x94"
+ "\x13\xa1\x5e\x9c\x83\xb7\xe8\x7e\xdf\xaa\x06\x94\x2f\x85\xfe\x23"
+ "\xbf\x94\x09\x63\xa7\x73\x9e\x77\xce\xf3\x1c\xda\x00\xfd\xff\x73"
+ "\x07\x0f\x88\xf3\x9a\xf1\xc1\x17\x42\xee\xa7\x3f\xa3\xcd\xba\x0a"
+ "\xda\x35\xa0\x0c\xce\xd6\xd5\x2f\xf6\x1d\xa9\xb5\xa1\x0d\xbd\x1a"
+ "\xca\x30\xbf\xbf\xd0\x35\x77\x7b\xce\xb0\x96\xe2\xc6\x17\x30\x3e"
+ "\x03\x68\xae\x12\x1c\x17\x71\xbe\x6e\x9c\x85\xba\x5f\x38\x9b\xb3"
+ "\xc9\xc0\x0d\xd6\x26\x22\xf8\xfa\xc3\x9c\xbd\x80\xdf\x4e\x1b\x81"
+ "\x87\xfc\x71\xfe\x02\x7d\x77\x61\xbc\x69\x18\xc7\xaa\xb5\xb9\x74"
+ "\xde\x06\xe0\xbc\xbd\x89\x31\x24\xe0\x39\x25\x31\x91\xe4\x48\xb2"
+ "\x81\xce\x63\x8c\x1f\xb2\x15\xc6\x0e\xf3\x1c\xc3\xb3\x53\x45\x1f"
+ "\x65\xe4\x11\x8c\x17\x22\xf0\x49\x09\xce\x65\x61\xec\x7c\xa1\x5e"
+ "\x81\x38\xf7\x9c\xe8\x4f\xeb\xb8\xcc\xb7\x40\x36\xdf\xbe\xa8\x16"
+ "\xc7\xda\x46\xe7\x71\x95\xd6\x06\xf3\xd8\x79\x4c\x71\x3c\x71\x5c"
+ "\x5b\x32\xbf\x84\xf7\x2f\x0d\x15\xc7\x54\x1a\xcf\x2f\x97\x08\x34"
+ "\xaf\x62\x36\xa6\x2f\x07\x0a\xf6\x27\xc7\x18\x0a\xfc\x87\xeb\x40"
+ "\xf1\x1a\x7c\x77\x58\x1b\xf0\xf9\xc8\x23\x5b\x05\xcc\x2a\x31\x23"
+ "\x8f\x7c\x09\xf3\xff\x0f\x1a\x09\x3b\xaa\x12\xa9\xce\x02\x74\x62"
+ "\xf4\xf9\x72\x1b\x8d\xb7\xe1\x06\x3b\x4c\xe4\xc4\x0c\x09\x9f\xbe"
+ "\xdc\x25\x8e\x83\xc8\x93\xe2\xbc\x87\x36\x5a\xe5\xf8\xf3\xe5\x19"
+ "\x68\xa3\x1b\xe2\x9b\x24\x43\x7d\xd9\x24\xc7\xb7\x2f\xab\x11\xdf"
+ "\x90\xaf\xb5\x49\x68\x63\x63\xeb\x95\x89\x54\xa4\xca\x31\xa9\x62"
+ "\x09\xf3\x0d\x60\x32\x17\xf2\x96\x76\x16\xab\x8f\x6b\x18\xd4\xa7"
+ "\xba\xb8\xb0\xe6\x61\xcc\x2e\x3c\x17\x27\x8c\x57\x2d\xd4\x2f\xc1"
+ "\x7d\x93\x18\x2b\xe1\xfe\x5a\xa6\xeb\x01\x4e\x1f\xc0\xf8\xdd\x50"
+ "\x4f\x53\x09\x4f\xbb\x99\xc5\xb0\x5b\xc4\x0a\xfe\x95\xe8\xfb\x97"
+ "\x37\x90\xfb\xb4\xcf\xf1\xdf\x5e\x24\x27\x71\x3f\xab\x15\x63\x48"
+ "\x42\xdb\xea\x8b\xe4\xeb\x13\xf0\xdc\x60\xe1\x18\x0a\xc7\xfd\x70"
+ "\xec\x01\xc7\x77\xe1\xf8\x10\x1c\xdf\x80\xfa\x9c\x50\x3f\x1c\xca"
+ "\x4b\xe0\xfc\xaf\x85\x23\xf4\xf1\x24\xca\x9b\x51\x82\xec\x88\xe7"
+ "\x47\x63\x19\x8e\x83\x04\x9a\x0b\x31\x05\x4f\xf6\x83\x76\x92\xa1"
+ "\xff\x35\xc6\x5a\xda\x96\xf6\x22\xf9\xea\x1a\xb6\x8d\xfb\x98\xe1"
+ "\xf7\xfb\x4e\x32\x28\xb4\x73\xf2\x24\x1c\x07\xc2\x71\x0b\x1c\x13"
+ "\xe1\x18\x2f\x8c\x41\x15\x62\xc3\xbc\x64\x3a\xe6\xd4\x3f\x94\x3d"
+ "\x8f\xcd\x79\x5c\x87\x25\xec\xa8\x2c\x9d\x37\x83\xd1\xdb\x44\xbe"
+ "\xa0\x7c\x00\x75\x87\x63\x5d\x38\x8e\x14\x8e\x91\xc2\x71\xb4\x70"
+ "\xfc\x9d\x70\x1c\x25\x1c\xc7\x98\xc8\x49\xad\x20\x63\xc0\xb8\x9c"
+ "\xd4\xe2\x7b\x03\x76\x07\xb0\x67\x7c\xa5\x43\x1d\x19\x70\x7c\x10"
+ "\xb4\xef\xd3\x92\xf9\x95\xaf\x68\x1f\x45\x9b\xcf\xcd\xcc\xb2\x0f"
+ "\xb7\xd2\xef\xda\x5f\xf5\x72\xc2\xb6\x92\x00\x45\x24\x01\x19\xa8"
+ "\x7b\xbe\x92\xd7\x09\xed\x24\x2a\x85\xef\xc2\x42\x6e\x00\x1f\x8c"
+ "\x97\x47\xf5\xa1\xa0\x3d\x18\xa3\xb8\x96\xda\x8e\x31\xb6\x5b\xd0"
+ "\x90\x52\xf8\xaf\x06\xdd\xa0\x46\xc4\x6f\xd4\x7b\x98\xae\xde\xf9"
+ "\x4b\x78\xd6\x3a\x49\x57\xff\x6a\x30\xfb\x86\xf6\xe0\x12\x38\xaf"
+ "\x97\xce\x9f\xc4\xfd\x00\x83\x60\x3c\x6b\xe0\x7d\x06\xd6\x91\xaf"
+ "\x30\x86\xff\x33\xf5\xec\x9d\xc3\xc5\x77\x16\xe8\xa1\x15\xc7\xb7"
+ "\x9e\x9c\x4c\x06\x2c\x4c\x40\x1e\xae\x73\xe0\xec\x49\x6a\xd7\x15"
+ "\x78\x04\x68\x79\xf2\x69\xa4\xa9\xd3\x1c\x74\xc6\xa0\xe0\x96\xcc"
+ "\xaf\x35\x72\x4c\x31\x6a\x10\x53\x90\x37\x00\xbf\x91\xd6\xfe\x2e"
+ "\xf3\xaf\x1a\xe7\x1f\x9b\x77\x5f\xcf\x93\xdf\xfb\x65\xb5\x8d\xcd"
+ "\xbb\x1a\xe0\x33\xe0\xcf\x6a\xcc\x0f\x01\x38\xf4\xf5\x28\x61\x4e"
+ "\xd7\xc0\x9c\x1e\x04\xe7\xab\x58\x5f\xd9\x79\xe1\x59\xc0\x67\xd5"
+ "\xf8\xde\x0f\x89\xe7\x85\xf7\xc5\x76\x70\x0f\x7e\x0f\xf1\xbc\xd0"
+ "\x3e\xf0\x63\x75\x31\xce\x13\xf1\xbc\xf0\x4e\x20\x47\x7d\x6d\x13"
+ "\xf1\x64\x3d\xe3\xb7\xb5\xe2\x7d\x48\x37\x8c\x8f\xc5\x6c\xfc\x5f"
+ "\xe3\xde\x0a\x3d\xae\x0f\x6b\x66\x91\x80\xe5\x79\xe4\x01\x36\x2f"
+ "\xbf\x6e\x90\x63\xe4\xe9\x32\x3e\x33\xd0\xc6\xab\x86\x18\x2a\x6c"
+ "\x03\x45\x79\x35\xbf\x25\xb3\x66\x9e\x98\xe7\x5b\xca\x33\x50\xb3"
+ "\xa5\x42\xef\x18\x5f\xe8\x4b\xcd\x3a\xb1\x2f\x4e\xeb\x33\xa5\x01"
+ "\xf6\x0d\xdb\x5a\x03\xf2\xba\x05\x70\x81\xe1\x76\x4d\xb1\x89\xdc"
+ "\x2f\xca\xbb\x74\xdd\x0a\x54\x10\x6d\x76\x12\xfd\x3e\x1a\x88\x6b"
+ "\x23\xfa\xf8\x70\x68\xc7\x4a\xb6\x93\x4a\x2d\xe8\xf2\xc9\x17\xc8"
+ "\xec\x15\x5d\x30\xf6\x4a\x34\xf4\x75\x37\xf4\xad\xc0\x8e\xb6\xff"
+ "\x45\xa8\xa7\x9e\x9e\x63\x4f\xe2\xad\xc2\x98\xc1\x3c\x3a\x3d\x5a"
+ "\x18\x5b\xc4\xaf\x02\xc4\xf4\x35\x69\x2c\x67\x10\xda\x72\x70\x7e"
+ "\xbc\x8d\xeb\x58\x28\x6f\x2d\xc9\xc7\xb9\x72\x6a\x8c\x28\x93\x42"
+ "\x7f\xf5\x4c\x26\xfc\x62\x27\x8d\x4d\xa4\x1b\x62\x60\xb6\xc0\x53"
+ "\x27\xd9\xbb\x9f\x3a\xc0\xbe\x73\x0f\x11\xe2\x1b\x9e\x2a\xf4\x09"
+ "\x0d\xf9\x9a\xf9\x65\x95\x7d\xc6\x7c\x4a\x4e\xe5\x39\x7c\x4a\x24"
+ "\x59\xd1\xc0\xe2\x46\x9d\xda\x27\xcd\x89\x53\x6b\xf1\x3e\xb8\xbf"
+ "\x11\xce\x97\x4b\xe7\xbf\x28\x10\xec\x5d\x25\x5d\x57\x47\xa2\x6f"
+ "\x59\x77\x8c\xb5\xcd\x9e\x77\xba\x2f\x7d\x3e\xb5\x79\x0c\x29\x11"
+ "\xe7\x2f\x8e\x33\xae\xd9\x74\x0e\xc3\xfc\xc5\x79\x7c\x73\xd3\x90"
+ "\x52\xf8\x67\xf3\x96\xad\xcd\x06\x3a\x6f\xe9\x9c\x3d\x1d\xe1\xd4"
+ "\x0f\x1a\x5f\x07\xfb\xda\xbc\x32\x34\x00\xae\x45\xc3\xba\x5a\x25"
+ "\x5c\x63\x39\x25\x1a\x69\x8c\x3c\x33\x7e\xdb\xc6\x6f\x9d\xb8\x47"
+ "\x2b\x10\xb8\x1b\x63\x82\x88\xdf\xaa\xc7\x37\xa5\xf3\x76\xfc\xee"
+ "\x74\x9d\xb7\xe8\x1c\xb1\xfe\x4f\x17\x48\xf1\x7d\x4e\xf9\x0a\xef"
+ "\x85\x39\x61\xf2\x99\x2f\x58\xcd\x35\x26\x53\xd5\x58\x90\x4f\x8d"
+ "\xc0\x7b\x70\xcc\x63\x79\x99\x4f\x9b\x44\xde\x83\x79\x39\xef\x22"
+ "\xf9\x66\x49\x4e\x08\x9f\x07\x34\xcd\x83\xb9\xb4\x10\xca\x33\xe1"
+ "\x38\x8f\x1d\x15\x2a\x3c\x0a\x73\x24\xaf\x25\xf3\x9b\x5e\x62\x3e"
+ "\x7a\x1c\x1b\x4b\x50\xae\x09\xf9\x2c\x1b\xc6\x01\x79\x8d\x7e\x47"
+ "\x86\x7e\x23\x7f\x21\x9f\x21\x8f\x05\xae\x1e\x4b\xf9\x8c\xc6\x1f"
+ "\x80\xf3\xd8\x5f\xe4\x33\x68\x2b\x4e\x8c\xf3\x6b\x22\xdf\x04\xb0"
+ "\xef\x39\xdf\xa4\x8a\x3e\xb7\xf8\x2d\x29\xb1\x37\xe9\x0e\xed\xaa"
+ "\x4b\xd4\x34\x96\xe6\x39\xa3\x6d\x34\xc1\xba\xf8\x1d\x8e\xe1\xe4"
+ "\x83\x25\x70\x4f\x91\x34\xe6\x46\x9a\x9b\xf9\xc8\x0c\x6a\x8b\xfc"
+ "\x05\x5c\x2b\x77\xd6\x33\x4c\xe4\x58\x1e\xea\x1a\xe8\xdb\xf7\xcb"
+ "\x60\x82\xdf\x81\x01\xc7\xbe\x31\x8b\x72\xed\x80\x60\xfc\x9e\x7f"
+ "\x6c\x14\xf4\x0f\x75\xe8\x2a\xf8\x1d\x0e\xba\x64\xa9\x07\x9b\xf1"
+ "\x40\xb4\xf5\x08\xf9\x79\x6a\xd1\x8e\x85\xf9\x0c\x2e\x92\x73\x4b"
+ "\x2a\x30\x16\xc8\xe2\xb6\x71\x9e\xd3\x92\xf9\x6b\x18\xeb\x59\x9d"
+ "\x40\x7e\x51\x47\xce\x4d\x46\xbb\x51\xfa\x0f\x68\xa3\xa9\x4d\x96"
+ "\xdb\x68\x6a\x4b\x85\x7f\xd0\xb4\xcf\x44\x3a\xfd\x57\x09\xc7\x71"
+ "\x1d\xfc\x37\x08\x75\xe1\x4d\xcf\x0a\x6b\x4a\x28\xcc\x93\x5a\x87"
+ "\xfd\x17\xf9\x12\xe7\x36\xfa\x71\xa0\xcd\x49\x61\x23\x74\xef\x5b"
+ "\xa0\x0d\xfa\xbd\xe6\xc9\x49\x86\x14\xe4\xa3\x33\x74\x1f\x14\xc6"
+ "\x20\xf6\xce\x97\xe8\x0c\xa5\x27\x8b\x07\x5a\x5b\x05\xcf\x0e\xde"
+ "\x78\x85\xf8\x6a\x13\xc8\xc3\x68\xff\x0e\xb4\xf3\x06\xd4\x71\x85"
+ "\x98\x82\x55\x8d\xe4\xcc\x89\xc4\x55\x44\x09\xd7\x1f\x85\xdf\x06"
+ "\x51\x4e\x82\x7b\x54\x3e\x56\x12\x8c\xf2\xd1\xc8\x55\xe4\xd1\x96"
+ "\xcc\x33\xf9\x22\xad\x50\x86\x40\x3b\x9c\x60\x4b\x80\xbe\xd6\x52"
+ "\x1f\x67\x8c\x53\x6f\xa2\xe3\x46\x71\x18\xdb\x00\x1d\xf6\xcc\x3a"
+ "\x1f\x0b\x51\xb1\xb5\xe7\x0c\xf0\x7f\x99\x20\x33\x9e\x29\x00\xde"
+ "\xaf\x76\xea\xe7\xf3\x4e\xbf\xb3\xf0\xfe\x40\x0b\xca\x67\x9e\xc6"
+ "\xe7\x6c\x3f\x71\x7c\xd0\x5f\x35\x10\xf4\x04\x4a\x6f\x1b\xdf\x04"
+ "\x7d\x2b\xd7\xa6\x10\xff\x46\x72\xee\xe1\x1d\xb9\x74\x9f\x5d\x29"
+ "\xb3\xcf\x9f\x0b\x12\xf5\x70\xd6\xef\xb3\x67\x02\x57\xfb\x10\xb4"
+ "\xab\x63\xbc\x33\xea\xeb\xf7\x7d\x28\xb5\xa5\x1b\x6d\x11\xc4\x90"
+ "\x36\x04\xeb\x88\x72\x55\x6d\x73\x7a\x28\x39\x12\x1a\x01\xf3\xf8"
+ "\x6c\xa1\x49\xf9\xa5\xbf\xf7\x3e\x95\x67\x0b\x85\xf1\x2d\x67\xbe"
+ "\x08\x67\x57\xe0\x5a\x82\xba\x3f\xac\x23\x25\xb8\x46\xb7\x64\x9e"
+ "\xf3\x15\xe7\x0d\xac\x1b\x25\x70\x8f\x10\x0f\x1b\xbf\xff\x9e\x4d"
+ "\xc4\x18\x10\x54\x6f\x60\xf5\x03\x98\xcd\xff\xdc\x60\x87\x2c\x0d"
+ "\xf5\xf0\x3e\xe6\xa3\x76\x76\xdc\x6c\xbb\x02\xc6\xf4\xec\x38\x7c"
+ "\x37\x81\x17\x61\xbd\x3a\x17\x27\xcd\xdb\x33\x14\x9b\x8f\x34\x39"
+ "\xcf\xcb\x73\xeb\x24\x7d\xb3\x36\xa2\x5f\x0e\x51\xbb\x9b\x87\xda"
+ "\xae\xb8\x56\x9d\x6b\xdd\xb8\x91\xd7\xeb\x94\xdc\x88\x35\xd9\x24"
+ "\x40\xb1\x1e\x86\x0d\xe7\x59\x52\x4c\xf7\x8b\xc4\x74\x5f\x60\xc0"
+ "\x83\x51\x23\x13\x3b\xf3\x69\xa1\x44\xb9\xe1\x6a\x67\xff\xde\xd6"
+ "\x07\xf5\xbc\xcf\x93\x93\xc6\x27\x5a\x89\x7a\x81\x8e\x7c\xb7\x90"
+ "\xf8\x8c\xb4\xc3\xb3\x03\x88\xd6\x44\xea\x82\x71\xcf\xe8\x91\x00"
+ "\x94\x3f\xea\x82\xb1\xcd\xd4\x7c\xe2\x9f\x5a\xcf\x37\xac\x7f\xb5"
+ "\x93\x3f\xac\x07\xaa\xad\xc0\x63\xf7\x07\x3c\xa8\xbf\x09\x6d\x1c"
+ "\x8e\xa1\xf7\x15\x79\xee\x9b\x69\xb3\xfb\xbe\x69\x43\xa0\x6f\x3b"
+ "\xbd\xeb\xdb\xb7\xfb\xa4\xbe\x7d\xbb\xef\xc7\xf7\xed\xfc\xd3\x4e"
+ "\x7d\x53\x49\x7d\x8b\x83\xbe\x9d\x1f\xee\x5d\xdf\x2e\x4c\x96\xfa"
+ "\x76\x61\xf2\x2d\xf6\x6d\x57\x3b\x7d\xab\x70\xdf\xb7\xe4\x07\xa1"
+ "\x6f\x67\xbc\xeb\xdb\x45\x8b\xd4\xb7\x8b\x96\x1f\xd3\x37\xd4\xe5"
+ "\xd3\x7a\xf1\x17\x68\x3c\xf9\x04\x16\xaf\xf5\x22\xf9\x76\x68\x5a"
+ "\x3e\x2d\x77\xbb\x48\xea\x5a\x85\xf9\x6d\x4e\xb7\xf0\xdf\x32\x39"
+ "\xa7\x2e\xb6\xbf\x16\xfd\x5d\xeb\x66\x00\x2f\x07\x33\x9e\xfe\x96"
+ "\xfa\x37\xa4\x9b\x79\xc1\xdf\xb4\xee\xf5\xed\xd4\x1f\x65\x58\x9c"
+ "\x50\x2e\x6d\xee\x36\x84\xe6\xa1\xe7\x60\x3e\xf3\xdd\x9e\xf5\xc7"
+ "\xfc\x9d\x7b\x13\xcc\x4a\x3e\x13\x63\x87\x61\xbc\x3f\x5f\xc2\xbf"
+ "\xf5\x6c\xe8\xde\x04\x2b\xcd\x1d\xbe\x86\xee\xf7\xad\x33\x88\x7b"
+ "\xdc\xc4\x67\x98\x83\x86\xc5\xc1\xf9\x1a\x31\x0f\x2c\xaf\x44\x79"
+ "\xe6\x59\xcc\xf5\x08\xb2\x44\x9d\x59\xcc\xcd\x0a\xfc\xbe\x56\xc0"
+ "\x06\x4b\xa0\xb5\x3d\xdc\xfb\xb6\x8f\x88\x7b\x23\x13\x49\x20\xe6"
+ "\xa5\xdc\x98\xd6\x19\xbf\x39\x42\x5b\x75\xfb\x70\xdc\x27\x58\x3a"
+ "\xf3\x81\xa9\xc4\x07\xf7\xf6\xa1\x8f\x9e\x31\xd4\x4c\xc2\x52\x49"
+ "\xa7\x09\xc9\xd0\xa6\x95\xc4\x04\x26\x43\x7b\x30\xd6\x4c\x37\xf8"
+ "\x96\xda\xf8\x72\xa0\x3d\xfc\xfe\xed\x93\x48\x02\x46\x86\xa6\xf3"
+ "\x6b\xb6\x10\x5f\xdc\x07\x88\xfb\xf9\xd8\x5e\x3e\x3f\xff\x96\xcc"
+ "\x6f\xf5\xe2\xfb\xdd\x02\x7d\xba\x32\xfa\xd4\x9f\x91\xe8\x53\xbf"
+ "\xa5\x2d\x7d\xea\x3b\x31\xfa\x7c\x6b\x93\xe8\x73\x21\x52\x4e\x9f"
+ "\xfa\x3e\x72\xfa\xd4\xc7\xdd\x1e\x7d\xea\x63\x24\xfa\xb0\x67\x30"
+ "\xfa\xd4\x27\xbb\xa7\x4f\xbd\x4e\xa2\x4f\x7d\xd8\xad\xd1\xa7\xfe"
+ "\xa8\x67\xfa\xd4\x4f\x6e\x87\x3e\x7e\xee\xe9\x73\xa1\xfb\xad\xd3"
+ "\xe7\x42\xa4\x17\xf4\x79\x80\xd1\xe7\xe2\x2a\x89\x3e\x17\x7f\xdb"
+ "\x96\x3e\x17\x76\x32\xfa\x5c\xc8\x97\xe8\x73\xd1\x24\xa7\xcf\x85"
+ "\xa3\x72\xfa\x5c\xf4\xbf\x3d\xfa\x5c\x24\x12\x7d\xd8\x33\x18\x7d"
+ "\x2e\x86\xba\xa7\xcf\xc5\x70\x89\x3e\x17\x4a\x6e\x8d\x3e\x17\x63"
+ "\x3d\xd3\xe7\x82\xc5\x7b\xfa\x5c\xfc\xc8\x85\x3e\x2a\xcf\xf4\xb9"
+ "\x68\xf2\x82\x3e\x81\x8c\x3e\x0d\x0f\x4b\xf4\xf9\xee\x54\x5b\xfa"
+ "\x7c\x37\x9a\xd1\xe7\xbb\x08\x89\x3e\x0d\x19\x72\xfa\x7c\x17\x2b"
+ "\xa7\xcf\x77\x85\xb7\x47\x9f\xef\xf4\x12\x7d\xd8\x33\x18\x7d\xbe"
+ "\x2b\x76\x4f\x9f\xef\xaa\x24\xfa\x7c\x37\xef\xd6\xe8\xd3\xd0\xc9"
+ "\x33\x7d\xbe\xcb\x69\x87\x3e\x9d\xdd\xd3\xa7\x61\xca\xad\xd3\xa7"
+ "\x21\xa3\x3d\xfa\x78\x27\xeb\x35\xe4\xe0\x73\xef\x40\x3b\xb5\x9e"
+ "\xda\xc1\xb1\x43\xff\x43\x2e\xb3\xa1\x76\x3b\xe7\xe7\xcf\xf6\x68"
+ "\x34\xe4\xa8\x53\xc8\xb0\x3a\x72\xe9\x89\xed\x5c\x27\x7f\x3e\xb3"
+ "\x10\xf4\xa4\x0f\xf2\xf8\xd5\x7e\xbe\xdc\xea\xce\xbe\xb8\x37\xdb"
+ "\x73\xfe\xf6\x4b\x6f\xf8\xf4\x20\x8f\xe0\x3e\xba\x35\x20\x2f\xe3"
+ "\xef\x96\xcc\x4b\x39\x20\x0b\x46\xb6\xb7\x7f\x0b\x7d\x9d\x8e\xac"
+ "\x45\xfd\xf6\x92\xc1\x11\x17\x23\x93\x4f\xc6\xf8\x62\xda\xc7\x70"
+ "\x9f\xc5\xa5\x86\x1c\x1a\xaf\x6a\xd0\xfa\xc8\xc7\xf8\x73\xa8\x7b"
+ "\x5c\x24\x8d\x17\xf8\x4d\x83\xd6\x23\x3f\x80\xac\xfe\x8b\x46\xd2"
+ "\x18\xee\xf0\xcf\xe3\xa3\xdf\x11\x6c\x84\x83\x59\xdd\xa6\x29\x50"
+ "\x77\x30\xe6\x21\x5d\x9a\x86\xf9\x35\x9b\x86\x82\xec\xfb\x38\x3e"
+ "\x03\x63\x27\xed\x80\x23\xfa\xc9\x30\xdf\xcc\xc6\x28\x2a\x2f\xaf"
+ "\x79\xe8\x1d\xe6\x0b\xd7\xd4\x47\xe4\x3b\x78\x4e\x17\x28\x3f\x20"
+ "\xc8\xf3\x58\xff\xfe\x46\xf2\xcf\x6b\x4e\xd7\x03\xa0\x7c\x0a\xda"
+ "\x0e\x12\xae\x3f\x00\x65\xcc\xb9\x4c\xe3\x8d\xf3\xd9\x19\x82\x0f"
+ "\xf1\x3f\xf5\x70\x4e\x25\xd4\x09\x82\x3a\xaf\xa3\xec\x2e\xb4\xd1"
+ "\x0d\xca\xf3\x51\x07\x16\xae\x07\x43\x79\x3c\x7e\x3b\x10\xae\x77"
+ "\x87\xf2\xd3\x50\xfe\x15\xdb\xf3\x72\x53\x98\xa3\x8d\xb6\xdb\xdb"
+ "\x33\xde\x48\xf3\x95\x21\x0d\x98\x2e\xf0\x4f\x27\xff\x9f\xc6\x7a"
+ "\x97\x6b\x31\x4e\xd7\xaa\xc5\x6b\xcc\x47\xed\x9f\xa9\x4e\xd7\x4a"
+ "\x5c\xae\xe5\x39\x5d\xdb\xe7\xd2\xe6\x3e\xa7\x6b\x05\x2e\xf7\x55"
+ "\x39\x5d\xd3\xb9\x5c\x6b\x72\xba\x96\x21\x5c\xf3\x69\xc9\x6c\xf2"
+ "\x95\xbe\xe1\x35\x6a\x85\xf3\x4a\x38\xdf\xcb\xe9\x7c\x8c\x70\x1e"
+ "\x9e\xdf\x34\xd0\x44\xb6\x9a\x85\xf3\x94\xf6\xac\xfd\xa6\x71\x4e"
+ "\xed\x87\x33\x1b\x47\x53\x8c\xc3\x77\xae\xdb\xb3\xd1\xdc\xcd\xe8"
+ "\x77\xe0\x5a\x28\xf2\x95\x33\x6f\x2f\x4a\x52\xcf\x5d\xf6\x9a\x3a"
+ "\x21\x36\x11\xdd\x57\xe2\xe7\x27\xaa\xe3\x17\xcf\x8b\x95\xc5\x59"
+ "\x0f\xc6\x98\x83\x98\x53\x0d\x63\xb7\xd0\xfc\x05\xb9\x7c\x83\x23"
+ "\xe7\x07\xe0\x2a\x3c\xab\xdc\x44\x46\xd3\x67\xe5\xb0\x78\xe4\xa5"
+ "\x18\xfb\x85\xc5\x79\x21\x63\xeb\x48\xd3\x09\x21\xce\x8b\x01\xea"
+ "\x5a\x3d\xc7\x79\xb9\x52\x4d\xe3\x1b\x42\x3d\x16\xe7\xe5\x4a\x0d"
+ "\xcc\xf3\x91\x7c\x17\x96\xc3\x83\xe5\x36\xbb\x2c\xca\x26\xe6\xd9"
+ "\xad\x34\x46\x60\x06\xb3\x65\xb8\xc6\x6b\x1d\xb4\x10\xef\x13\xbe"
+ "\x97\x2e\x74\xba\x7f\x1e\xbb\x2e\xae\x0f\xc2\x33\x75\x83\xb4\x50"
+ "\xee\x52\x07\x65\x6a\xbf\xa7\xd7\x2e\x33\x5b\xde\xa6\x41\x89\xf8"
+ "\x4e\xf8\xde\xf2\x77\x53\x4e\xab\x23\x97\x77\x4b\xef\x76\xb9\xda"
+ "\x29\x16\x9c\xf0\x0e\x97\x6d\x6c\x8e\xb6\x79\x57\xea\x9f\xc8\xab"
+ "\x06\x25\xe2\xb3\x11\xcf\xd8\x5e\x06\x28\x6f\x1a\xa4\x15\xfb\xe3"
+ "\xd4\xbf\x44\xd4\xeb\xa1\x7f\xa7\xe8\x98\x00\x4d\x79\xa0\xa9\xf0"
+ "\x0e\x5b\xf8\xcc\xa6\x54\x96\xcb\x00\xd6\x13\xcc\xc9\x42\xd7\xaa"
+ "\x2b\xf3\x44\x5b\x26\xae\x51\xcc\x86\x79\x45\x92\xff\x30\x46\xd7"
+ "\x26\x71\xfd\xba\xe2\x24\xff\xb1\x67\xc2\xb9\x02\x67\x1e\x72\x7a"
+ "\xde\x09\x7c\x1e\xd4\x1b\xc7\xf6\x03\x0c\xd2\xe2\x7c\x87\xb2\x0a"
+ "\x7d\x31\xf1\x5e\xec\xa3\xa7\x3c\x7c\x9e\x62\x28\x4a\xe3\xf8\x7d"
+ "\x2f\x71\x1c\x73\xe8\x1e\xf9\xef\xfb\x8a\xf6\x3a\x21\x07\x86\x21"
+ "\xc7\x91\x97\xfa\xfb\x68\x9a\xdb\x4d\xf7\xf7\x31\x03\x02\x48\x0c"
+ "\x1b\xdb\xef\xe7\x20\xc6\xe3\x9c\x61\x58\xff\xbd\x41\xa0\x79\x24"
+ "\xeb\xff\xf7\x6f\xe0\x79\xc9\xff\xfe\x7b\x93\x58\x4f\xc4\x65\xf6"
+ "\xbd\xea\xfb\xfd\xb4\x1e\xcb\x15\x3c\x86\xd1\xfc\x57\xaa\x3a\xf2"
+ "\x7d\xb9\x50\xff\x12\xe5\x45\x1a\xbf\xe7\xfb\x06\x7e\xd3\xb0\x31"
+ "\xd0\x57\xd0\x7f\x9a\x84\x9c\x15\xec\xb9\x70\x2c\xc7\xbe\xe0\x18"
+ "\xe1\x5e\x72\x7e\xd3\xdf\xc7\x00\x7d\xdc\xc6\x47\x10\xfc\xba\x1f"
+ "\x6d\x24\x3f\x30\x19\x42\xc9\x5b\xd1\xc6\xca\xde\xf5\x87\x58\x27"
+ "\xdf\xe7\x00\xb1\x0e\xc3\x6e\x7a\x8d\xfa\x94\x6b\x93\xd0\x1e\x24"
+ "\x5c\x4b\xc2\xfd\xb5\x8e\xdf\x7e\x4e\xbf\x3b\xe1\x6f\xea\xd7\x9c"
+ "\x42\xd7\x56\x5f\x69\x1f\xff\x0f\xf3\xa0\x1c\xe0\x52\x0e\x96\x95"
+ "\x57\x30\xbf\x67\x90\xcd\xea\xa9\x0f\xb9\x70\x5e\x68\xfb\x3e\xda"
+ "\x9f\x24\x7e\x30\xf0\x46\x06\xee\xe9\x16\xe6\x61\x06\xee\xd9\x0e"
+ "\xb4\xcd\xa4\xfb\xb5\xe1\xfa\x40\xe1\x18\x2e\x1c\xfb\xb2\x3c\xad"
+ "\x3f\xf4\x92\x72\xad\xa3\x8d\xe6\x87\xbe\x9e\x72\xbf\xe3\x7e\x70"
+ "\xe1\x18\x2e\x1c\xfb\x0a\xb9\x6a\x67\xc0\x7d\x8e\xfd\xdf\xee\x7d"
+ "\x90\x7f\x58\x2b\xee\xe5\xb6\xeb\x06\x85\x71\xba\x08\x8c\x4d\xf7"
+ "\x28\xc6\x09\x4b\x6f\xc2\x58\x31\x16\x62\x24\x37\x88\x31\xb1\x25"
+ "\x03\x73\x83\x56\xb2\x9c\xa0\xb8\x07\x56\x81\x76\x73\x94\x1d\x2b"
+ "\xb5\x97\x69\x5e\xd0\xe5\x4d\x62\xde\x93\x1f\x1a\xec\x9b\x06\x85"
+ "\x09\xf3\x65\x0b\xf3\xd1\xbf\x4a\xed\xc5\x34\xaf\x75\x13\xfd\xee"
+ "\xe5\x7f\x91\x5c\x4d\x16\xeb\xb0\xb1\xbb\x4a\x6d\x5f\x3b\x32\xc5"
+ "\xdc\x8f\x57\xd5\x62\xae\x69\x13\xb9\x9a\x7a\x2d\x28\x21\x1a\xce"
+ "\x0d\x94\xfb\x4c\x5f\x1d\x8f\x6d\x62\xdf\x4d\xe4\x07\x33\xb6\x0d"
+ "\x75\xa2\x1d\x73\x16\xce\x2f\xb7\x91\x9e\xd0\xaf\x8b\x62\xfb\x70"
+ "\x1d\xe6\xbf\x99\x8e\x25\xb6\x79\x6d\x53\xde\x3a\x38\xb7\xde\xe4"
+ "\xdb\x39\x8f\xf9\x5c\x5f\x85\xf5\xef\xbf\x47\xb5\x27\x03\xc1\x5c"
+ "\x48\x86\xb9\x94\xc1\xe9\x86\x69\x59\x2c\xef\x61\xc9\xcc\xc6\x78"
+ "\xf5\x02\x7a\x87\x6f\xbc\x4e\x7c\xd1\x07\x82\xf1\x6c\x33\x8b\x81"
+ "\x0c\xe7\x00\xab\x0b\x61\x8e\xb0\xf5\xcf\xab\x75\xff\xaa\x85\xb6"
+ "\xd1\x93\xc5\x36\xc3\xbd\x4b\x2d\x99\xcd\x91\x8e\xfc\x09\x8e\x79"
+ "\xdc\x3c\x1f\xbf\x3d\xc0\xfc\xa0\x7d\x74\xed\x03\xf6\x17\xda\xaa"
+ "\xf7\x28\x63\xaa\x86\x69\xe9\xf7\x99\xb7\x9e\xd5\x30\x1f\xd5\xe6"
+ "\xbf\xfa\x84\x3e\xd4\x00\xcf\xda\xe5\xc8\x1b\x01\x75\xb2\xd1\xf7"
+ "\x1e\xda\x77\xbc\x67\x02\x7d\x46\x35\x9b\xeb\xcd\x0d\xdc\xa6\x61"
+ "\xda\x8d\x37\x88\xaf\x70\xbe\xa1\xd2\x66\xc5\xdc\x03\x6e\xe3\x6c"
+ "\xd1\xdc\x79\xe8\x13\xfe\xd6\x30\x2d\xee\x1b\x1a\x60\x15\xfb\x6c"
+ "\x69\xc0\xfd\x2a\xd8\x67\x36\xb6\x96\x33\xe2\x38\x6e\xb8\x0a\x6d"
+ "\xa7\x9d\x26\xf5\xc4\x12\x8b\x7e\x73\x74\x4c\x52\x44\x5f\x4e\x0b"
+ "\xd5\xf9\xe8\xf3\x59\x1d\xaa\xfb\xd3\x3c\x46\xd0\xfe\x76\x9a\x8b"
+ "\x0d\xde\x01\x68\x61\x48\xc3\x3d\xff\x16\x9a\x17\x60\x0d\x8d\xd5"
+ "\x01\xef\x4d\xfd\x64\xaf\x09\xdf\x49\x2c\x05\xe2\x5a\x61\x12\xce"
+ "\x6d\xc4\x67\x27\xdd\x20\x57\x88\xe5\x75\xcc\xb1\x0e\xe3\x91\x81"
+ "\xf1\xe9\x2a\x2d\x30\x4f\x92\x6f\x20\x2f\x60\x6e\xf6\x42\x13\xb1"
+ "\xac\x65\xeb\x1b\x8e\xb9\x25\x0e\x9f\x8f\x63\x0b\xba\x99\x19\xc6"
+ "\xf4\x7a\x4b\xe6\x35\x47\xfe\xc7\xec\x10\xd4\x77\x2c\xed\xc6\xd7"
+ "\xb5\x43\x9f\x2b\xf3\x60\xed\xec\x79\x1a\xfb\x57\xc6\x75\x1b\xa6"
+ "\x45\x9f\x6c\xf8\x1d\x2f\x60\x3b\xa5\x1d\xe3\x83\x6b\xef\xfa\x84"
+ "\xf6\xea\x5d\xc9\x78\x81\xc6\x50\x83\x73\x63\x84\xf1\xa3\xf9\x24"
+ "\x74\x49\x6c\x1c\x84\xfa\x36\x66\x2f\xee\xf5\x2b\xe8\x97\x53\xfe"
+ "\xbb\x6b\x74\xed\xc6\xd8\xf7\xdb\xa9\x4e\x78\x6d\x9f\x53\x9f\x2d"
+ "\x74\xff\xeb\x55\xb4\xf5\x5d\x9b\x81\xcf\xda\x80\xf1\xc3\x90\x2f"
+ "\x1a\x9d\xf9\xff\xda\x50\xec\x27\xfa\xfc\xda\x83\x9e\xd5\xc0\x7a"
+ "\xdb\x17\xc7\x19\xee\x81\x75\x7e\x98\xb6\x9d\xb5\x90\xe6\xdd\x6b"
+ "\xc9\xbc\xae\x11\xd7\x42\xd0\x2f\x60\x5d\x68\xe9\x4d\xf5\x4e\x90"
+ "\xa7\x8d\x1c\xca\x33\x2d\x6a\xe4\x1b\x98\xeb\x71\x02\xc6\xc2\xba"
+ "\x7f\x7d\x86\xf8\xcd\xcb\x8e\xfb\x26\xae\xd0\xef\xbd\x16\x31\x9f"
+ "\x1c\x8b\xd7\x77\x3d\x43\xda\x67\x71\x7d\x7d\x9b\x7d\x16\xb8\xf7"
+ "\x27\x97\xe6\x1d\xdb\x85\x6b\x4a\x45\x53\x3d\xae\x11\xf4\x7e\xdc"
+ "\x7b\x91\x06\x3a\x39\xdb\x3f\x54\x8f\xf6\x79\x9a\xf3\x04\xfb\xc2"
+ "\x72\x4f\xd4\xd1\xdf\xc0\xb7\xbe\x78\x64\xbc\x74\xdd\xec\xc8\x99"
+ "\x0e\xf4\xc6\x6f\x6d\x47\x7c\x9f\x27\x86\xc7\x70\xbd\x6e\xe9\x8d"
+ "\xf9\xbf\x5b\x32\x5b\x82\xc5\xdc\xdf\x34\xd7\x37\x7b\x9f\x19\x1e"
+ "\xe3\x32\xf6\x27\xe1\x18\x2f\x00\xf7\xd7\xd1\x31\x50\xfd\xad\x01"
+ "\x63\x3d\x63\xdc\x4a\x43\x0a\xe6\x64\x69\x39\xf1\x76\x08\xdd\xa3"
+ "\x6c\x31\xf4\xbf\x8a\x7e\x58\x4d\x17\x53\x69\x3c\x26\xff\x09\xc9"
+ "\x36\x1e\xef\xa3\xf2\x44\xd0\xdf\x1a\xf0\x1a\xcd\x75\x80\x6d\xde"
+ "\x76\xdc\xe2\x96\x7c\x41\x36\x6d\x02\xdd\xe7\x41\xa0\x15\x95\xdd"
+ "\xe1\x77\x48\x23\xb1\xb6\xb2\x1c\xb4\x2c\xf6\xbe\xe0\x8f\xed\xc7"
+ "\x62\x6c\xc0\x98\xd1\x98\x07\xd6\x78\xf5\x93\x98\xaf\xd9\xba\x84"
+ "\xc6\xc1\xd6\x0d\x4a\x16\xc6\x20\x79\x23\xeb\x57\xe0\xec\x64\x25"
+ "\xed\x23\xf6\xcf\xbb\xbe\x59\x07\x0b\x7a\x84\x5f\x4b\xa6\x35\x55"
+ "\x8c\xcd\xc1\xe4\x29\x16\x1f\x9b\xd1\xc2\x7a\x49\x90\x9f\x53\x85"
+ "\x67\xa7\xde\x81\x67\xef\x13\xda\x8c\x62\x31\xc2\x5b\x40\x06\x1a"
+ "\x14\xd5\x92\xd9\xea\x2b\xea\x33\xc2\x1e\xa2\xbe\x4c\xcf\x6a\xed"
+ "\x25\xe9\x33\x6c\x0c\x65\xfb\xee\x16\x2f\x4e\x54\xcf\x9b\xbf\x54"
+ "\x3b\x27\xf1\x95\x38\x75\x6c\x42\xc2\xe2\x04\x35\x06\x69\x72\x9e"
+ "\x3f\x2c\x8f\x51\x6b\xb8\x90\x9f\xb0\x50\xca\x4f\xd8\x9a\xec\x9c"
+ "\xd3\xd3\x44\x5a\x53\xef\x8c\xed\xa2\x35\xcf\x53\x3b\x3a\x25\x57"
+ "\x04\xff\xc5\xf0\x6f\x80\xff\x52\xb4\x65\xcc\xb6\x92\x48\x58\xeb"
+ "\xa9\x9f\x89\x14\x73\xa2\x35\x0a\x7d\x8c\xea\x48\xeb\xb5\xed\x9c"
+ "\x2f\xea\x41\x98\x37\xbc\x08\xeb\xef\x80\xfb\xe1\xdf\x00\xff\xa5"
+ "\xf0\x4f\xef\xe3\x3e\xa5\xfb\xe5\x8b\x9c\xaf\x31\xff\x91\xd5\xbb"
+ "\xb0\x0e\xbf\x1a\x3f\xd9\x63\xfe\x75\x56\xcf\xa5\x0f\x4a\x3e\xf3"
+ "\xaa\x58\x8f\x7e\xdb\xef\xba\x9a\xa8\xdd\xd4\xf3\xe1\x33\x2f\x15"
+ "\x0a\xf5\xa8\xaf\x8d\xf8\x3e\x98\x6b\x00\xea\x8b\xf5\x7c\xf9\xcc"
+ "\x96\x81\x42\x3d\xba\x56\x70\x99\x4a\x77\xcf\xed\xc4\x67\x16\xf7"
+ "\x12\xea\xa9\x9c\xdb\x73\xaa\xe3\xc7\x65\x9e\x2b\xc0\x3a\xdc\x6a"
+ "\xdf\x60\x26\x3b\xb5\xe6\x41\x7d\xb7\x31\x5a\xbd\xa3\xd3\xcd\x48"
+ "\x57\x3a\x69\x5f\x99\x1f\x3b\x64\xfe\xa2\x24\xcc\x34\x95\xb8\x78"
+ "\x59\x22\x1e\x17\xcd\xf9\x23\x3d\x2c\x9e\xfd\xea\x2b\xec\x47\xe2"
+ "\xc2\x70\xfc\xb1\x10\xf8\x0d\x8f\xf3\x96\x69\xf1\xf0\xca\x62\x2c"
+ "\x26\xc7\xf5\x5d\xf6\x0a\x1e\x5c\xf7\x81\x6a\x5a\x32\x6f\x36\x00"
+ "\x6f\xd4\x30\x9c\xbd\x09\x3a\xd2\xa5\x5e\x54\x8e\x5d\x6d\x22\x47"
+ "\x35\x36\x22\xda\xb5\xe4\x31\x47\x6c\x0a\x8c\x39\x12\xb8\x5a\xfb"
+ "\x4a\xa0\x6d\x7e\x2c\xac\x19\x20\xcb\xda\xc2\x4d\x64\x01\x11\xb0"
+ "\x71\x1d\x8d\x73\x9a\x79\x33\x43\xf0\xed\xf4\xe5\x74\x83\x22\x30"
+ "\x7e\x3f\x94\x69\x9e\x6d\x28\xc7\x41\x79\x2d\x94\x31\xbf\x76\x30"
+ "\x94\x47\xa1\x4d\x0a\xca\xa1\x50\xee\xc5\xe9\x34\x51\xb8\xc7\x18"
+ "\xca\x6a\x28\x87\x41\xfb\x3a\x71\x5e\xb8\x97\x95\x6d\x45\x62\xee"
+ "\x6f\x96\xe7\xdb\x66\x70\xe4\xf9\xc6\x7c\x4e\x69\xaa\x19\x74\xfd"
+ "\xa5\x32\x88\xad\xde\x27\xf4\xe1\x24\xa8\x53\x2f\xae\x97\xcc\xde"
+ "\x61\xb3\x88\xf1\x53\x98\x3d\xc3\xee\xeb\x94\x2f\x1d\xcb\xc1\x62"
+ "\xbe\x74\xb4\x77\xd1\x7c\x8d\x70\xe4\x33\x31\x9e\x2c\x5f\xe8\xd6"
+ "\x96\x47\xf3\x7c\xda\x57\x60\x6c\x5e\x73\xfa\x3c\xc5\x2f\xb7\xa3"
+ "\x0d\x0d\xca\x2c\xb6\x24\x7f\x85\xd8\x69\x7e\x28\x31\xee\x9c\x73"
+ "\x2c\x09\xb7\xfb\xa1\xbe\x00\x99\x81\xe6\xbb\x5a\xb8\x38\xd0\x36"
+ "\x27\x96\xc9\x81\xf6\x53\x0c\xbf\x9e\x1d\xc7\xe4\x05\x7b\x09\x3f"
+ "\x89\xe5\x44\x31\x11\x6e\x0c\x8b\x3d\xb5\x70\x31\x0f\xf7\x06\x26"
+ "\xcf\x89\xa5\xe7\xa0\xde\x1a\x90\xd5\x84\xfe\xbd\x6f\xec\x85\x7b"
+ "\x5c\x39\x21\x46\x86\xbd\x70\xd6\xc3\x19\xf8\x1c\x7f\x2a\x87\x7c"
+ "\x41\x02\x30\xdf\x26\xf6\x6d\xbb\x53\x5c\xbc\x8d\x70\x0e\x7d\x48"
+ "\x9b\x27\x91\x00\x8c\x03\x2c\xf4\xa5\x90\xe5\x0f\xe3\x22\xc5\x58"
+ "\x53\x26\x38\xe7\xfa\x3e\x93\xfe\x40\xb9\xb2\xcf\x2b\x7d\xa3\x46"
+ "\xc3\xaf\xbe\x42\xca\x6a\x67\xde\xec\xd5\xdc\x6d\x68\x64\xf3\x9e"
+ "\xb1\xbf\x61\x79\x49\x39\xd0\xff\xed\x54\x17\xe2\x50\x07\x6e\x89"
+ "\xce\x63\x3e\xa8\x5c\x19\xc6\xdd\xe5\x32\x51\x9e\xc4\x7d\xd3\x5c"
+ "\x31\xf2\x2c\xaf\x7a\x36\x6a\xc7\x2a\x8c\xf1\xac\x80\x31\xe6\x76"
+ "\xe3\x35\x21\x86\x97\x92\xc6\xb8\xb2\x93\x50\xba\x47\x18\x64\x14"
+ "\xdc\x83\x7a\x51\xa1\xa8\x40\xb9\x03\xed\x49\x5c\x26\x37\x19\xf9"
+ "\x16\x68\x8c\x31\x44\x2c\x7c\xb7\x41\x1a\x3e\xe8\x59\xcc\x71\xe8"
+ "\x8b\xb2\xae\x51\x85\x63\xc6\x63\xcc\x80\x91\xf0\x3f\x8d\xe5\x9e"
+ "\x79\xb9\x41\x6c\x13\xca\x01\x20\x43\xcd\x80\xa3\xaa\x25\x93\x1f"
+ "\xe3\x94\x93\x4f\xd8\x13\xcd\xcf\xc7\xd8\x6f\xd8\x36\x95\x9d\x15"
+ "\x8a\xfd\x4c\x06\xe1\x13\x4d\x44\x35\x90\xcd\x45\xcc\x35\xfa\xe6"
+ "\x3a\xe1\x37\xc8\x3f\xcf\x98\x5d\xda\x38\x29\xda\x4a\x19\x4f\xc3"
+ "\x9a\xa7\x24\x23\xe1\x7f\x1a\xd4\x3f\x60\x22\xff\x41\xeb\xaf\x51"
+ "\xd2\x7d\x92\x17\x7d\x42\x71\xbf\x3b\x5f\x2d\x9e\xef\xa4\x88\x84"
+ "\x31\xc5\x9c\x6e\x6c\xee\x37\x77\x7b\x76\x20\x94\x2d\xa2\x8d\x85"
+ "\xda\x5c\xb2\xd0\xaf\x4b\x2c\x3f\x1b\x09\xe5\x60\xb1\x0c\xbf\xd5"
+ "\x22\x56\xa0\x4d\xa2\x39\x3d\x7a\x0b\xea\x9d\xaf\x84\x82\x5c\x08"
+ "\xf2\x0d\x5c\x07\xfa\xbf\x39\x86\xdd\x9b\xab\x6f\xce\xdc\xa0\xb5"
+ "\x74\xdb\x63\xb2\x00\xfe\xc1\x35\x90\xff\x16\xd6\x0a\xed\xc4\x99"
+ "\x7c\xef\x2b\x17\xdf\x8d\xcb\xf4\x09\xe4\x36\x45\xa8\xe8\x3b\x2a"
+ "\x14\x05\xf0\x3b\xd8\x1c\x34\xb0\x01\xea\x01\xfd\x6d\xf9\xb4\x5e"
+ "\xd2\x65\xfd\xfa\x1b\xaa\xc9\x46\x90\xe0\x0d\xaf\xde\xc0\xf1\xa3"
+ "\x3e\xd9\x1b\x52\x54\x51\x28\x77\x62\x1c\x10\x9a\x13\x0d\xe3\x5b"
+ "\xda\x88\x1f\xcd\x29\xb0\xe9\xcf\x79\x34\x96\xfe\x72\x4d\x80\x18"
+ "\xdb\x92\xd7\x0d\xac\xe5\x95\x8b\x2d\x18\xef\x92\xe6\x0e\x69\xd1"
+ "\x74\xa5\x31\x2e\x85\xd8\x96\xdb\x92\x48\x70\x3e\xc7\x62\x5b\xd2"
+ "\x18\x21\x7e\xa0\xa7\x24\xb9\x8f\x6f\xc9\x67\xee\x1a\x23\xc6\xb7"
+ "\xe4\xaf\xdb\xad\xf0\x3b\x0c\xc6\x03\xf3\xbf\x6b\x68\x59\x8a\x37"
+ "\xe5\xeb\x36\xde\xa5\x12\x70\x4f\xc9\xe2\x5d\x7a\xb5\x5e\x28\x14"
+ "\xd4\x2e\xdb\x92\xa5\x00\xfc\x5b\x49\xf3\x02\x3a\x9d\x2b\x81\x37"
+ "\x11\xe2\x1b\xf0\x71\xc2\xb9\x1a\x13\x79\x23\x5f\xd0\x4b\xcd\xa8"
+ "\xe3\xe7\x50\xdb\x18\xd7\xc4\xdf\x8c\xdb\xe2\x0e\x73\xae\x76\xfb"
+ "\x28\xe6\x2a\xc6\xa7\xc8\x52\x86\x9a\x14\xca\x54\xbc\x97\xea\x92"
+ "\x0a\x65\xa8\xeb\xbc\x9e\xfb\xca\xe2\x79\xb1\xb3\x17\xc4\x6b\xd5"
+ "\x93\x26\x8f\xa4\x89\x12\xfb\xaa\xe7\x27\xc6\xd2\x25\x49\x3d\x69"
+ "\xf4\x88\x09\x13\x26\xcf\xfe\xc3\xe4\xe1\x93\xa7\xfc\x61\x28\xdb"
+ "\xb1\x38\x39\x61\x05\x26\xdb\x4c\x5c\xac\xc6\x9b\xe6\x0a\xd9\xc4"
+ "\x53\x62\x13\x16\xbb\xe2\x41\x30\xb5\x73\x29\xa9\x4d\xd7\x82\xbf"
+ "\xa9\x2d\x4d\xa1\xdc\x27\xda\xb8\x28\xf6\x29\x94\x3b\x71\x6c\x69"
+ "\xae\xf1\x2c\x65\x5f\x94\xaf\x84\x3c\xef\xb8\xee\xf8\xe2\x9c\xc6"
+ "\xf5\x07\xde\xc5\xe4\x1c\x9b\x8b\xdd\xeb\xe3\xab\xc4\xfb\x84\xb9"
+ "\x2c\x9c\xeb\xc1\xf7\xec\x99\x4e\xe3\x6b\x65\xf9\x04\x8b\x76\x6f"
+ "\x3c\x27\xf6\xa1\x0e\xeb\x64\x29\x67\x3a\xf2\x09\x67\xf9\x44\x48"
+ "\x79\x28\xe9\x9f\x6c\x8c\x08\x41\x71\xa6\x13\xc8\x2a\x7e\xf0\xdf"
+ "\x19\xff\xc7\x38\xf0\x3d\x89\xaf\x41\x9d\x2d\x50\x01\x6b\x70\xb2"
+ "\x0f\xcb\x63\x95\x55\x4d\x73\x2f\x4c\xb0\xdb\x7c\x66\xdb\x95\x70"
+ "\xf4\xe1\x67\xdb\x7d\xa9\x9e\xc8\x27\xf1\xd5\x74\xaf\x7d\x12\x5f"
+ "\x85\xf9\xda\x80\x8f\xd7\x4d\xb0\xa5\xad\x9b\x60\xe7\x6d\xb3\x41"
+ "\x7e\x87\xe3\x77\xb8\x67\x7c\x82\xfd\x3b\x9e\xe6\xac\xc1\xbd\xf5"
+ "\x2c\xce\x60\x29\xfa\x50\xce\x02\x1e\xde\x7e\x95\xe5\x24\x9e\xb0"
+ "\xe2\xfb\x73\xb3\x57\x98\x58\x4e\xe2\x2b\x2c\x8f\x37\xcb\x75\x4e"
+ "\xd2\xa0\x9d\xb2\xd9\x76\x1f\xf5\x04\xfb\x4d\x9e\xee\x7b\xcd\xf2"
+ "\x55\xb7\x97\x67\x18\x31\x76\x69\x0f\xa2\xc4\x7d\x74\xf6\xbf\x3c"
+ "\xad\xc3\x98\x82\xe9\x66\xde\x8a\xb1\x69\x0e\xdd\xa8\x51\xaa\x93"
+ "\x7c\x61\xdc\x7c\x47\x57\x6a\xc3\xdd\xef\x7b\xce\x1e\x14\xc5\x6f"
+ "\x7e\xce\xc2\x67\x0f\xee\xcb\x6f\x1e\x96\xc8\xeb\x22\xfa\x22\xde"
+ "\xf3\xd9\xcf\xfa\x43\x19\xce\x0f\xad\xe7\x37\x47\x26\xf2\xd9\x91"
+ "\x06\x38\x42\x79\x64\x3e\xbf\x79\x38\x94\xbb\xaf\x83\xfb\xcc\x7c"
+ "\x76\x88\x15\xea\x69\xf9\xec\xd0\x38\x38\x42\xb9\x47\x0d\xd4\x83"
+ "\xf2\x43\x63\xe0\x08\xe5\x5e\xc5\x17\x15\x9d\x54\x70\x0f\x9c\x7b"
+ "\x3e\x99\x3d\xeb\x85\xb5\xf4\x59\xd9\xe3\x74\xec\x19\x13\xf2\xd9"
+ "\x33\x26\x15\xb2\x67\x4c\xd9\xc7\x9e\xf1\x88\x06\xea\x5b\xf9\x6c"
+ "\x75\x30\xd4\x4b\xe6\xb3\x1f\x23\x70\x84\xf2\x2f\x9b\xa0\x1e\x94"
+ "\xfb\xe0\xb3\xa0\xfc\xab\x12\xa8\x0f\xe5\x27\x8a\xa0\xbe\x8d\xcf"
+ "\x7e\x4a\x0f\xf5\x52\xf9\xec\x7e\xd8\x3e\x94\x07\x64\x40\x3d\x28"
+ "\x3f\xad\x85\x23\x94\x7f\x1d\x03\xf5\xa1\x1c\x0d\xef\x34\x8c\xf0"
+ "\xd9\x2f\x25\xc2\x31\x83\xcf\x9e\x01\xcf\x8b\x84\xf2\xcc\x5a\x38"
+ "\x42\x79\x36\xdc\x3f\x1c\xca\x73\x46\xc1\x11\xca\x73\xf1\x5d\x7d"
+ "\xf9\xec\x79\xf0\x9c\x61\x6b\xf9\xec\x57\xe1\x9d\x23\xa1\x1c\xa7"
+ "\x86\x23\x94\xe7\x43\x7f\x86\x43\xf9\x8f\x78\x1f\x94\xe3\x61\x0c"
+ "\x86\xc1\x18\x6b\x43\xe1\xb8\x8e\xcf\x4e\x68\x80\x7a\x50\x5e\x56"
+ "\x0c\x47\x28\x27\xc3\x18\x0e\x87\xf2\xca\x68\x38\x42\x39\x0d\x9e"
+ "\x3f\x2c\x80\xcf\xce\xb0\xc1\x71\x3d\x9f\xbd\xa6\x0a\xea\x41\x39"
+ "\xab\x00\x8e\x50\x7e\x03\xc6\x6f\x38\x94\xd7\x8f\x83\xe3\x7a\xf7"
+ "\xf4\xdc\x58\xc2\xaf\xf6\x83\x3e\x6f\x9d\xc1\xaf\xee\x0c\xc7\x6d"
+ "\x01\xfc\xea\x4e\x1a\x3e\x5b\x7f\x00\xce\xc3\x71\x9b\x15\xca\x7d"
+ "\x85\x32\x1c\xb7\xd7\x43\x39\x5c\x28\xc3\x71\x07\xc8\xe3\x9d\x06"
+ "\x0a\x65\x38\x16\x60\x79\x30\x9f\xbd\x13\x8e\x7e\x78\x8c\x82\x72"
+ "\x84\x50\x86\xe3\x7f\xe7\xc3\x11\xc6\xf4\xbd\x75\x70\x3e\x92\xcf"
+ "\xfe\xaf\x31\x50\x86\x63\x81\x3f\x94\x47\xc1\x71\x21\x94\x47\x99"
+ "\xfb\xf4\x2f\x42\x5e\xe5\x42\x3a\x15\xf1\x21\x23\xb5\xe9\xd7\x88"
+ "\x12\x79\x14\x73\x78\xc0\xda\xfc\x68\x9d\xc2\xef\x72\x51\x9a\x89"
+ "\xca\x0c\xf6\xdc\xe7\xcc\x5c\x08\xb5\x77\xf9\x41\xbd\xce\x17\x15"
+ "\xfe\x3d\x10\x8f\x8c\xa9\x26\x9a\x47\x50\x88\x8f\xe9\x57\xa7\xe8"
+ "\xdc\x1d\xe4\x2b\xcc\x05\xa1\x84\xf1\xea\xcb\x67\x76\xba\x0a\xc7"
+ "\x5d\x7c\xe6\xfd\x75\x30\x5e\x50\x0e\xfa\x02\x8e\x50\xfe\x8f\x37"
+ "\x61\xbc\xa0\xfc\xf2\x08\x38\xee\x6a\xc9\xea\x9c\x68\x52\xf8\x2e"
+ "\xa4\xf8\xb2\x67\x6c\x78\xa0\x8d\xe7\x27\x00\xd2\xf2\xef\xc6\x17"
+ "\x05\xda\x0c\xc0\x63\x13\x75\x81\x18\xe7\x71\xe7\x00\xe8\x6b\x57"
+ "\x03\xf6\x09\x73\xfa\xf0\x37\xc3\x94\xec\xd9\xf7\xf3\xf0\xec\x77"
+ "\x31\xf7\x04\x1f\xf2\xb8\xa7\xeb\x87\xe9\xf5\xc7\x16\x85\xb3\xeb"
+ "\xfe\x44\xba\xfe\x32\x5e\x3f\x1f\x88\x31\xdc\x1f\x7f\x9c\x5e\x37"
+ "\x5a\x1a\x84\xf7\xf2\xc1\x6b\x76\xac\x6b\x52\xf8\xab\x19\xfe\x77"
+ "\x86\x35\xce\x87\x34\xab\x22\x42\x5b\xb2\xfc\xc3\xa1\xef\x7d\x05"
+ "\xf9\x3f\x82\x57\x0d\x8a\x64\xf1\x51\x86\xb9\x8d\x49\x89\xfa\x2f"
+ "\x97\x33\x2d\x74\x03\x60\x28\xea\xd4\xb0\x96\x2a\xd5\x69\x61\xc5"
+ "\x75\x8a\xfb\x6c\xdb\x50\xe6\x0a\x5e\x68\x66\xd8\xea\x7f\xf8\xe6"
+ "\x5b\x11\xf3\xd4\x29\x81\xf0\xfc\xfb\xec\xe9\x56\xfe\x9a\x21\x6d"
+ "\x04\xe0\x32\x3d\xaf\xa7\xfb\x8f\xd8\xef\xf5\xd4\xaf\x94\xfd\x4e"
+ "\xa6\x36\x6c\x68\x0b\xef\x75\xd6\x61\xec\x59\xa5\xa5\x5c\x48\x3c"
+ "\xa1\xdf\xe5\x15\xfe\x47\x3f\xe1\x4c\xca\xc0\x44\xd2\x49\x9d\x72"
+ "\x08\xdb\x0f\x90\xe9\xbb\x8e\xba\x78\xcd\xff\x87\x83\x50\x77\x2b"
+ "\xda\xa6\xb2\xee\xeb\xe5\xc8\xcf\x0c\xef\xf0\x27\x5c\x47\x95\x04"
+ "\x73\x93\xf9\x52\xf9\x59\x71\x5f\x3e\xee\x94\xb2\x05\x47\x11\x5b"
+ "\x4e\x27\xbd\x3d\x67\xa1\x99\xcf\x8d\x27\x5d\x6d\x0a\x16\x57\x58"
+ "\x71\xdf\x89\x01\x56\x94\x57\x8f\x61\xdd\x37\x38\xbf\x2f\x43\xfb"
+ "\x27\x13\xa5\x21\xe1\x34\x96\xcb\xf8\xac\xb3\x11\xc6\xa6\x1a\x62"
+ "\x48\xa0\x6d\x95\xf2\x59\xd7\xc2\x39\xbf\x4b\xc9\xdb\x51\xee\x4f"
+ "\x46\xbb\xdd\x17\x78\x7e\x3c\xd0\x05\xd6\xa4\xfb\x0a\xc5\xbe\xe0"
+ "\x7a\xb4\x01\xc6\x0e\x65\x72\x8c\xa5\x31\xdb\x6e\xc7\xd8\x74\xeb"
+ "\x4c\x30\x0e\x8c\x5e\xf7\xad\xc7\x1c\xf1\xc2\x73\xcf\x73\xdd\x22"
+ "\xa2\x2a\x67\xe0\x37\x48\x7f\x8c\xf5\x75\x8d\xee\xbf\xc7\xcc\xc9"
+ "\x1c\xca\x10\xac\xae\x33\xed\xe6\x0b\x71\x07\xe6\x2f\x4a\x4c\x58"
+ "\xa2\x5e\x3a\x3f\x25\x76\x68\x9f\x65\x7d\xd5\x09\xc9\xea\x04\x5c"
+ "\xc2\xd9\x09\x58\xe6\x97\x2e\x5c\x9c\xa8\xc6\x8c\xe6\x6d\xf3\x21"
+ "\x87\xf2\xaa\x08\x0d\x95\x57\x15\x81\xd4\x46\xc0\xeb\xe3\x0b\x13"
+ "\x53\x79\x4e\xfd\x58\x67\xfe\x8a\xa2\x4b\x7e\xab\x5f\x17\x1a\x87"
+ "\x84\xcb\x54\x53\xbd\x11\xd6\xed\x80\x2d\xdd\x08\xee\x11\xf4\x6f"
+ "\xc9\xea\xe2\xc8\x7f\x6e\x52\x04\xd6\x52\x5b\x4c\x56\x97\x42\xe0"
+ "\xc7\x71\xc2\xb7\x38\xb6\xc7\x46\xb8\x46\xbf\x55\x67\x75\x29\x05"
+ "\xbd\x74\x17\xa5\x95\x3e\xde\x9f\xad\xe9\x5d\xac\xf4\xd9\xea\xf8"
+ "\x42\xbe\x60\x40\x11\xc8\x85\x0a\xfa\x5d\xd0\xf6\x28\x6f\x24\x57"
+ "\x69\x2c\x02\x98\x6b\x2a\x8c\x01\x62\xcf\x1d\xa1\xe3\x42\x26\xaa"
+ "\xb8\xbf\x84\x6b\xd3\xdf\x25\xca\xbd\x80\x05\xbe\x6a\x98\x0f\x8f"
+ "\x91\x47\x0f\xa5\x35\x28\xaf\x28\xee\xbf\xef\x50\x5a\x8d\x92\xcf"
+ "\x19\x19\xd7\x1c\x36\x3c\xcf\x2a\xe4\xcd\x36\xda\xac\xe4\xf3\x51"
+ "\x04\xf5\xc2\x62\x4b\xf7\xe9\xf0\x3f\x22\xd9\xba\x79\xae\xda\xf0"
+ "\xd8\x33\x64\xf4\x13\xfc\xf7\x9f\x95\x10\xd2\xa4\x08\x2c\xf9\x6c"
+ "\x14\xea\x2a\x11\x6a\xab\x2a\x22\xcc\x92\x1b\x85\x7b\x7b\xcd\xad"
+ "\xb9\x73\xb5\x37\x42\x46\x99\x8f\x40\x9d\x63\xa0\x4b\x1d\x87\xd9"
+ "\x86\xb1\x66\x5b\x1f\x1f\x40\xf6\xde\xd0\x29\x4b\x4b\x22\x98\x1d"
+ "\x39\x06\xe6\x0c\xe5\xa7\xfb\x77\x7f\xb6\xaf\x84\xc0\xb3\xe1\xfa"
+ "\x18\xe5\xe7\x83\xdb\x5c\xaf\xf8\x2c\xbc\x84\xb4\x60\xcc\x66\xd0"
+ "\x55\x0f\x9e\xce\x23\x7c\xee\xb4\xaa\xdd\x29\x56\x25\x08\xe2\xca"
+ "\x8a\x9a\x3c\x92\x7a\x81\x3c\x60\xfb\x5e\xe3\xfb\x21\xdc\xdf\x8a"
+ "\x31\x55\x8f\x87\xd2\xd8\x8a\x69\x06\x9a\x13\x37\xb0\x12\xe4\x0f"
+ "\xee\x7b\x8d\x5f\xe5\x64\x03\x81\xeb\x5f\xd9\x7e\x1f\x4a\x2a\xe2"
+ "\xcc\xc4\x18\xad\x27\xad\xca\x48\xb2\xff\x25\x3d\xd9\x0a\x7a\xcf"
+ "\xd6\x2b\x24\x80\xca\xd2\x37\x35\x7e\xb6\x9b\x1a\x5f\xdb\x4a\x0d"
+ "\xc6\xba\xe2\xf9\xef\x35\x5d\x50\xb6\xb6\x2d\xd6\xf8\x57\x9a\xf5"
+ "\x64\x40\x03\xd1\xb4\x2a\x49\x60\xeb\x4a\x4d\x97\x4a\x6d\x1e\xb4"
+ "\x05\xc2\x32\x8c\x2b\xc6\xd9\xc3\xf8\x7b\x38\x4e\xf7\x47\x93\xc9"
+ "\x4d\x8a\xfb\x5f\xef\x52\x4d\xba\x63\x9c\x57\x94\x57\x31\x46\x34"
+ "\x17\x3c\xad\xca\x1e\x1c\xa5\x4b\xbb\x06\xfd\xc2\x38\x46\x7b\xc6"
+ "\xaa\x50\xde\x07\x59\x46\x81\xef\xcc\xf1\x9a\x2e\xb3\xf1\xf8\xd6"
+ "\xc0\xaf\x50\xe6\xe7\x5a\x42\x31\xdf\x94\x3f\xf6\x13\x73\x3f\xaf"
+ "\x3a\x0f\x63\x99\xae\xf1\x85\x7a\x01\x70\xbe\xab\xb1\xc9\x4a\xec"
+ "\xfd\xc6\xaa\xfb\x6b\x69\x4e\xdf\xe0\xed\x69\x44\xa5\x4b\x23\xc1"
+ "\xea\xff\xa0\xbc\xb4\xd3\xbe\x7b\x2c\xc8\x92\xbd\x92\xd1\xbe\xc3"
+ "\xce\x75\x7d\x5d\xfd\x3c\x21\xea\x67\xe8\xef\x7e\xea\x21\x40\xc3"
+ "\xe0\x69\xe1\x54\x1f\x41\x1d\x58\xd1\xb5\x37\xe3\xf1\xae\x3d\x5a"
+ "\xfd\x5e\x3d\xc0\x65\x6d\xa9\xe1\x56\xfb\xf6\xc2\x7c\xdf\x57\x14"
+ "\x0f\xd8\xf9\xec\xbf\x8d\xe2\x73\xe6\x52\x5e\x84\x72\x6b\xab\x5f"
+ "\xa8\x1a\xce\x15\x42\xfb\x11\xad\x0a\xdf\x6a\xf8\xaf\x61\xf7\x3f"
+ "\x60\xc6\xf7\xb6\x17\x0c\x58\x87\xef\x4d\x73\x14\xc1\x7b\xcd\x06"
+ "\x9a\xf1\x21\x53\x4d\x34\x6e\xff\x4d\x18\x5f\x21\x87\x2b\x8e\x07"
+ "\x8e\x01\x77\x53\xd3\x85\xbe\xeb\x4d\x4d\x00\x8c\x2f\xc6\x74\x0e"
+ "\x4c\x9b\x03\xf7\xe4\x4e\xb5\xc0\xb5\xae\xad\xc1\xd3\x34\x98\x2b"
+ "\xcc\xa8\x35\x13\xfb\xe6\xa9\x66\x8c\x59\xb8\x25\x05\xe6\x5c\xf7"
+ "\xa9\x26\x7e\xf3\x54\x71\x6e\x11\xec\x27\x97\xfd\x37\x4b\x2b\xee"
+ "\xd5\x83\xbe\x41\xff\xaa\xe1\xbf\xc6\xa4\x78\x20\xb1\xb5\xcf\x80"
+ "\x3c\x38\x8e\x81\xbe\xf6\xe2\xb3\x06\x16\xe2\x6f\xb8\xd6\x0b\xde"
+ "\x79\x26\x8e\x03\x8e\x87\x30\x16\x53\xa4\xb1\x88\xa9\x87\x7a\xa3"
+ "\xb8\xac\x9c\x54\x93\xa2\x6b\x18\x9f\x35\x20\xce\xa9\xde\x2a\xa9"
+ "\xde\xc2\x75\xac\xde\x8e\xbe\xac\xde\x6f\x4d\x40\x87\x1e\xc2\x78"
+ "\x1f\x76\x33\xde\xfb\xa5\x7b\xa7\x84\xb3\x7b\xdf\x38\xc0\xee\x0d"
+ "\x83\x7b\xbb\xfe\xe0\xd2\xa7\x4b\x52\xfd\x09\xf3\x58\xfd\xb5\x0b"
+ "\x59\xfd\x47\x77\x49\xf5\x02\x83\xa4\x7a\x2f\x99\x59\xbd\x8d\xbe"
+ "\xac\xde\x93\x01\x70\x7d\x7c\xdb\xbe\x04\x8e\x96\xee\x49\x4e\x64"
+ "\xf7\x7c\xa0\x66\xf7\x8c\xca\x87\xeb\xab\xe4\x7d\x09\x5c\x26\xd5"
+ "\x4f\x10\xde\xbb\xa0\x88\xd5\x1f\x36\xc6\xa9\xde\x36\x81\x27\xe0"
+ "\xfa\x5e\xa8\xd7\x35\xb4\xd5\x2f\x2d\x9a\xd5\x7b\xa1\x01\xf9\x11"
+ "\xea\x7c\xc2\x65\x3d\xe2\xdf\xea\xd7\xd3\x02\xed\x04\x00\x6d\x42"
+ "\xf1\x08\xb4\x0b\xe5\x74\x11\xd0\x87\x80\xb5\xf8\x9d\x08\x31\xd7"
+ "\xa4\xe8\x32\x0f\x70\xd7\xee\xd6\x96\x96\x15\x68\x73\xd8\xf2\x38"
+ "\x90\x1f\x36\x3f\x67\xf0\x98\x23\x1a\x65\x88\xdc\x61\x2a\x1d\xc7"
+ "\x72\xcd\x03\x8f\x82\xfc\xa3\xea\x03\x6b\x61\x06\x8d\xdd\x9c\x33"
+ "\x51\xc7\x85\x01\xc6\x5e\x26\x3e\xc6\xd4\x06\x52\xc4\x35\x28\x75"
+ "\x37\x88\x6f\x25\x3c\x01\xeb\x17\xc1\x9a\xaa\x5e\x84\xb2\x85\x6a"
+ "\xa8\xee\xba\xd0\x9e\x3e\xbe\x28\x3d\x9e\xe5\xd7\x46\x39\x0c\xb1"
+ "\x19\xe6\x63\x00\xcd\xfb\xb6\xa8\x33\xd6\x5d\x02\xbf\xfd\xb1\x6e"
+ "\xeb\xe3\xfd\xc3\x5b\xdf\x8b\x2f\xba\x11\x32\xd2\x7c\xe3\x2f\x4f"
+ "\xab\x6e\x86\x4c\xd4\xdd\xcc\x8d\x52\xd9\xde\x8b\x57\xdb\x1e\x1f"
+ "\x50\x64\x0f\x19\xa5\x85\x67\x03\x6e\xe7\x29\xf7\x70\x45\xca\x3d"
+ "\x69\x06\x25\xb6\x7b\x28\x4d\xaf\x3c\x98\x56\xa5\x3c\xc8\x15\x2b"
+ "\x0f\xa5\xe9\xe0\x58\x88\x39\xc0\x40\xde\x53\x1d\x3e\x98\x56\x0a"
+ "\xeb\x46\x10\x81\x79\xd0\x20\xda\x42\xf9\x11\x36\x52\x59\x68\x23"
+ "\x47\x13\xaf\x11\x73\x50\x84\x06\xfe\xfb\x9a\xbb\x4f\x0b\x35\x77"
+ "\x9f\xab\xa6\x7d\x0e\x89\xa6\xef\x88\x7b\x5d\x0f\x72\xac\xcf\xc2"
+ "\x78\x40\x9b\x41\x4f\x6c\xc7\x6f\xbe\x62\x5c\x6b\x45\x50\x7d\x9b"
+ "\xb8\xd6\x4a\x96\x7f\xce\x11\xdb\xfa\xa7\x88\x6b\x2d\xd8\x1c\x68"
+ "\x5c\x6b\xd0\x1f\xa9\x1e\x09\xeb\x17\xcd\x59\x69\x03\xf9\x6c\xf3"
+ "\x04\x2d\xea\x8b\x28\x8f\xb5\x64\x75\x53\x89\xfa\x1e\xca\x18\xf6"
+ "\x4d\x11\x83\xe1\x7f\x20\x9c\xd7\x98\x14\x1f\xad\x15\xcf\xf3\xb9"
+ "\x7e\xf8\x3d\xc0\xc7\xce\xc7\x3d\xd7\x82\xfb\x37\xf9\xb8\x61\xf6"
+ "\xcd\x23\x32\xec\x9b\xe7\x12\x38\x17\x01\xff\x43\xed\x9b\xfd\xf6"
+ "\xc1\x7f\x31\xfc\x1f\x80\x7f\x03\xfc\x97\xc0\x7f\x29\xfc\x57\xc1"
+ "\x7f\x35\xfc\xd7\xc0\x7f\x2d\xfc\x9b\xe0\xbf\x9e\xef\xee\x57\x8e"
+ "\x71\x39\xa1\x6d\x33\xd0\x3d\x54\x6c\x57\x1a\xdf\x6e\x1b\xe0\x7d"
+ "\x23\x51\xfe\x01\xbc\x8a\xe1\x19\x5e\x85\xf2\x3b\xfb\x17\x23\xee"
+ "\xf2\x7d\x86\xe7\x99\x7b\xc7\xeb\xcd\xdd\xa3\xf5\x70\xf4\x37\x07"
+ "\x69\xd5\xf0\x0f\x34\xd4\x86\x9b\x37\x4f\x0b\x07\x1a\xfa\x03\x2d"
+ "\x0d\xf0\x2e\x30\x6f\x7a\x54\x31\xbb\xd4\x2f\x80\xfe\x3d\xcc\xc2"
+ "\xef\x00\x93\x22\x84\xee\xc1\x81\x36\x32\xa0\xdc\xcb\xa4\x78\x90"
+ "\xd6\x6b\x0e\x99\x16\x29\xec\xfd\xc4\xf3\x03\x4d\xbe\xbf\x24\xac"
+ "\x5e\x94\x4c\x76\x8a\x7f\x45\x3b\x3b\x7e\x4e\xf2\xec\xa5\x0b\xe7"
+ "\xbf\x12\xbb\x74\x88\xba\xcf\x3c\xb5\x66\x7e\xc2\x92\xd9\x4b\x96"
+ "\xc5\x2e\x8b\xa5\xa2\x13\x9c\x7a\x42\xee\xd7\x86\xb9\x3b\x6c\xa0"
+ "\x07\x74\xad\xe7\x79\x5c\xb3\xc6\x59\x80\xcf\x1e\x8b\x2f\x3a\x70"
+ "\xc5\xac\xb4\x83\xec\x12\x50\x9f\x01\x73\x6f\xa2\xee\xc0\x15\xab"
+ "\x32\xa0\x5e\x4d\x78\xe0\x77\xbc\x66\xac\xaf\x12\x64\x99\x2f\x48"
+ "\x39\xca\x32\x50\x67\xcf\x22\xab\xf2\x45\xbc\xff\x2f\x03\x8a\xf6"
+ "\xc2\x6f\x38\xa7\xc2\xfb\x78\x90\x6f\xe8\x11\xe4\x1b\x56\x1e\x69"
+ "\x3e\x48\x8f\x51\xaa\x83\xb4\xde\x28\xed\x21\x3c\x5e\x5f\xc5\x97"
+ "\x43\xbb\x68\x6f\xe3\xff\xd2\x3f\x9c\xd6\x81\xf9\x46\xeb\xc0\x5c"
+ "\xab\x53\x04\x97\x62\x3d\xaa\x53\x40\x1f\xf7\x42\x3f\x40\xe7\xf7"
+ "\x15\xe7\x2f\xea\x10\x8e\x39\x9c\x84\xb2\x5e\xf0\xd3\x38\x87\xb1"
+ "\x3f\x3c\xcc\xd9\xdd\x70\xef\x9e\x45\x66\x66\x9b\xbd\x86\x58\x61"
+ "\x22\x88\x13\x88\x0f\xc6\xd4\x2a\x7a\x7f\x11\x57\xa5\x44\x3d\x04"
+ "\xee\x5d\x82\xd7\x68\x8e\x12\x2a\x8f\x07\xef\x12\x65\x60\x31\x47"
+ "\x49\x40\x0c\xf0\xc6\x5c\xf2\xe8\x15\xc5\x2f\x5e\xc7\xf1\xc3\xf1"
+ "\xc2\x6f\xb2\x7c\xd6\x2f\x46\x61\xfc\x85\x6d\xdd\x88\xbf\xad\xfb"
+ "\x42\x2b\xb3\xd7\x04\x37\x89\x72\xa5\x25\x78\xa1\xd5\x99\x6e\x8c"
+ "\x5e\xea\xd8\x45\x73\xe6\x2e\x8c\x9d\x47\x3f\xe3\xcd\x59\xba\x74"
+ "\x59\x7c\xac\x3a\x76\xce\x2b\x71\x6a\x7a\x59\xbd\x6c\x29\x54\x99"
+ "\x9f\xb8\x54\xbd\x78\xf9\x22\x75\xfc\xd2\xf9\x28\x21\xc7\x26\x24"
+ "\x2c\xd3\x26\x76\x21\xec\x4e\x75\xfc\xb2\x85\x89\xf3\xb5\xf0\x63"
+ "\x69\xec\xa2\x79\x6a\x4a\xf5\xa5\xd0\xd4\xc2\x85\x6a\xe1\x09\x4b"
+ "\xe3\xe6\x24\x20\x23\x2c\x7a\x0d\x2a\x39\xdd\x2f\x97\x9f\x03\x30"
+ "\xc6\x1e\xfa\x76\x5d\x51\x84\x8c\x2f\xf1\x85\xb1\xce\x59\x68\x45"
+ "\x9f\x08\x28\x8f\xa3\x3a\x55\x56\xb0\x0d\x6d\xd7\x6f\xc3\x3b\x36"
+ "\x03\xdf\xb7\x64\x75\x2f\x15\xdf\x8d\xda\xb2\x31\xee\x28\xc6\xb4"
+ "\x55\x84\xfc\x96\xee\x41\x06\xfe\xa7\x3e\x33\x59\xdd\x03\xd9\x58"
+ "\x74\xb7\x3a\xdb\xc5\x98\x1d\x36\x24\x08\x7d\xf3\x60\x0e\x8c\x43"
+ "\xb9\x40\xc8\x13\xa1\x80\x7b\x86\xe2\x3d\xdc\xe6\xb9\xb0\x66\x84"
+ "\x84\x4b\xb2\x79\x88\x3f\xd6\xa7\xf5\xb2\xba\xbf\xc4\x77\x9f\x06"
+ "\x6b\x72\xf7\x26\xec\x97\x87\x75\x44\x7d\x1d\xda\x3d\x5e\x44\xc8"
+ "\x53\xc1\x44\x73\xfd\xad\x61\xfa\x96\x6e\x11\x91\x37\x32\x49\xe7"
+ "\x1b\x30\x97\xad\x4a\xf2\x68\x2b\xf0\xc5\x8a\xa7\x89\xcf\xaa\xf1"
+ "\x44\x59\xb4\xa0\x08\xe3\x26\x93\xf2\x31\x79\xc4\x18\x03\xba\xb7"
+ "\x75\x17\x29\x37\xd4\x91\x0a\xdb\x07\x2c\x17\x49\x0a\xca\xd6\x0f"
+ "\xfe\x15\xe3\xe4\xa5\xaf\xe2\xed\x7b\x3f\x36\x77\xda\xd3\x58\x84"
+ "\x39\x44\x1e\x35\xda\xce\x19\x8c\xa9\x05\xc4\x98\x6c\x34\x60\x8c"
+ "\x12\x18\xb7\x6d\x07\xe1\xda\x7d\xe5\x70\xdf\x8b\xa4\x33\x94\x37"
+ "\xe1\x33\xd6\xe5\xf2\x35\x6f\x84\xf0\xb5\x6f\xe4\xf2\x26\xe0\xa9"
+ "\xfa\xf5\x42\x5e\x10\xf4\x39\x40\xdf\x0a\xe4\x53\x6d\x12\x09\x6d"
+ "\x54\x3c\xa8\xa1\x36\x80\x51\xb4\xdc\x03\xca\xf4\x3b\xb6\x31\x39"
+ "\x17\xcb\x3d\xa1\x3c\x86\x95\xb7\x63\xf9\x21\x28\x47\xb3\xf2\x67"
+ "\x58\xee\x05\xe5\x38\x56\xae\x24\x34\xd6\x86\xe2\x41\x16\x7f\x20"
+ "\xf9\x2b\x2c\xc3\xd8\x3f\xb8\xce\x90\x84\xfd\x3d\x0b\x34\x7b\x70"
+ "\x73\xfa\x19\xd0\xd1\x92\x2f\xd2\xf9\x70\x28\x2d\x0e\x6d\x14\x30"
+ "\x1f\x1e\xec\x71\x7f\x2d\xea\x77\x0f\x16\xfb\x85\xe3\x31\xe4\x40"
+ "\xa0\x95\x74\x06\x79\xe9\x7e\x78\x9f\x37\x70\xec\xdc\xda\x64\xf6"
+ "\x0c\x3f\x37\xc1\xc6\x1b\xf8\x9d\x03\x0a\xf9\xcd\x93\x54\xfc\xce"
+ "\x70\xf4\x5d\x84\xb5\xec\xb9\xaa\xa2\x14\x2b\x8d\x5d\x0d\x32\x2a"
+ "\xcc\xa1\x07\xa9\x5f\xb6\x19\x64\x3e\x0f\xb1\x6c\x55\xfc\xe6\x91"
+ "\x2a\xd0\xa5\xf2\xc6\x6b\x6c\xe8\x43\x0d\x72\x6e\xe8\x1b\x47\xe3"
+ "\x50\x36\x88\x5e\xc3\x15\x84\x9b\xb9\xf4\x68\xc2\x87\x0d\x28\x1c"
+ "\x1f\xc7\x1b\x60\x9d\x52\x30\xfb\x37\x8f\xcf\x3f\x47\x9f\xdb\x67"
+ "\x40\x21\xb7\x3c\x0e\x73\x4f\x51\x7c\x49\xc3\x35\x3b\x09\xf0\x64"
+ "\x65\x74\xa0\x7d\x73\x74\xc6\xd1\xb8\x0b\xde\xe5\x31\x52\x84\x7a"
+ "\x8e\xab\x0e\x7d\xc2\x58\xae\x36\x78\x8e\x0d\xde\x15\xe5\x83\x3d"
+ "\x5c\xa9\x12\xe4\x94\xc2\xdd\x73\x6b\x3a\xf1\xcb\xa3\x03\xe1\x9d"
+ "\x9e\x36\x6a\xae\x91\xca\x1b\x38\x57\x7a\x8c\x39\x0a\x54\x19\x9d"
+ "\x6c\x33\x04\x9a\x69\xcc\x6d\x15\xe6\xa0\xe1\xbb\x8f\x54\x35\x2a"
+ "\x7a\xe4\xbd\x98\x0a\xef\x00\xef\x7e\xb0\xae\xc6\x97\x83\xf7\x18"
+ "\xc0\xc6\x0d\xef\x4b\x85\xb1\xcd\x13\x65\x7b\xef\xfa\xdf\x83\xf2"
+ "\x0d\xb7\x34\x9a\xe0\xde\xe8\xbd\x20\x93\x70\x37\xa3\x03\x39\x58"
+ "\x7f\xf0\xda\x51\xcd\x65\x82\xcf\x64\x63\xdd\x83\x7e\x43\xe4\xc3"
+ "\x60\x9c\xe1\xf9\x18\xeb\x5b\x1c\x57\xa8\x9b\x6a\xbf\x19\xe7\x9e"
+ "\xfe\xb9\xd1\x51\xd0\x3f\x1d\xbf\xd9\xcf\x6d\x0c\x54\x58\x6f\xd3"
+ "\x19\x7f\xf4\x2f\x85\xff\x1a\xfe\xdd\x78\x95\xb9\x4f\xff\x06\x9a"
+ "\x1b\x34\x77\x42\x86\x68\x27\x81\xf9\x06\x3c\xd2\xb3\x47\x11\xe8"
+ "\xc3\xee\xe3\x1b\xe6\xb2\x9c\x6c\x9d\xce\xf1\x81\x76\xcc\x35\x7c"
+ "\x0d\xe3\xc6\xe7\x1d\xd5\x58\xbc\xa4\x69\xcf\x19\x9e\x68\x8a\xed"
+ "\x83\x5e\x7d\xd3\xcb\xf6\x76\x79\xe4\x91\x02\x18\x97\x60\x3f\xfd"
+ "\x0d\x7e\x94\x82\xc9\xdf\xbd\x26\xe2\x58\xd9\x60\x1d\x49\x39\x49"
+ "\x94\x56\x58\x2f\x3f\x98\xba\x4e\xd9\x17\xd6\x19\x3b\xac\xfd\x65"
+ "\x55\x25\x64\xc2\x38\x92\x5e\x11\x77\x95\x88\xb9\xd6\x60\x5d\x53"
+ "\xbd\x3f\xd5\xac\xc4\xef\x50\x98\x5b\x8d\xea\xaa\xb9\x53\xa3\x3e"
+ "\xfc\x0a\xd6\x4c\x90\x1b\x76\x7f\x65\x56\xda\x9a\xa3\xd5\x34\x6e"
+ "\x3d\xe8\xe5\xe9\x71\x3c\xe7\xf8\x36\x85\xb9\x4d\x74\x03\x6b\x31"
+ "\x77\xf5\xf1\xa8\x2a\x1a\x4b\xe0\x78\x74\x09\x39\x5e\x9b\x47\xca"
+ "\xeb\xcf\xe0\x1e\xeb\x77\x8f\x47\xeb\x50\x66\xec\x6a\x03\xb9\x70"
+ "\x2b\xc8\x85\x30\x5f\xef\xe3\x54\xb9\x79\xe2\xf7\x29\xcc\xc5\x26"
+ "\xca\x84\x36\x98\xa3\xf9\x42\xbe\x35\x5b\x56\xcf\xc8\x7c\xe1\x5b"
+ "\x15\xe6\x61\x7b\x27\x89\x84\xbd\xa3\xe4\xa2\xdd\x7d\x97\xea\xba"
+ "\x84\xfa\x61\x87\x72\x41\xb9\x79\x62\x3e\xb6\x17\x97\xa8\xc9\x3f"
+ "\xe0\xdd\x8f\x6a\xbc\x9d\x93\xbd\xa8\x0f\x9d\x0d\xf8\xce\x06\x3c"
+ "\x67\x83\xf1\x34\x29\x1e\x0a\x00\xba\xb9\xd5\x43\x44\x1a\xdc\x4c"
+ "\x17\x69\xf0\xf0\x79\x4a\x03\xd0\x5f\x56\x4e\x17\x68\x70\x1a\x68"
+ "\x50\x0f\x34\xc8\x24\x19\xc7\x26\x97\x93\x09\x51\x40\x83\xa6\xab"
+ "\x98\xf3\x80\xe5\xbb\x4b\x64\x63\x4f\x69\x71\xda\xac\xac\xb4\x30"
+ "\x1a\xec\x7a\x89\xd1\x60\xcf\x4b\x66\x90\x63\x06\x90\xf7\xa1\x6c"
+ "\x5f\x1e\xad\xc6\x3c\x54\x7c\x66\x0c\xe6\xe6\x66\xb4\xb8\x09\xb4"
+ "\xb8\xc9\x68\x91\xb6\x04\x68\x51\x5d\x43\xe3\x5d\x1d\xaf\x2d\x27"
+ "\xe5\x31\x7a\x52\x01\xb8\x04\xb4\x98\x83\x74\x41\xdd\xda\xbe\x52"
+ "\xd3\x0d\x74\xe9\xe0\xfc\x14\x12\x2a\xd2\x03\x74\xf7\x2e\x1b\x52"
+ "\x08\xfa\x0e\x87\xc3\xdc\x14\xe9\x11\x4c\xe9\x71\x59\xa0\xc7\x0d"
+ "\xf4\xbf\x03\x7a\xdc\x00\x7a\xdc\x00\x7a\x64\x32\x7a\x20\xce\xbf"
+ "\x68\x09\xe4\xb9\x7f\x6a\x30\x1e\x46\x5b\x7a\xac\x14\xe8\x71\xfa"
+ "\x76\xe8\xf1\xf0\xae\xb6\xf4\xe8\xa5\xeb\x88\x1e\xd2\x9c\x78\xf4"
+ "\x75\xa4\xc7\x4d\xbd\x30\x27\x1e\xc7\x39\x91\xa1\x7c\x0a\xd6\x22"
+ "\x1c\xd3\xb2\xaa\x03\x74\x4e\x60\xae\xb1\xf7\xa7\x5a\x95\xe5\xf5"
+ "\x40\x97\x79\x40\x97\x14\x89\x2e\x8c\x1e\x13\x55\x85\x5f\xb1\xf1"
+ "\x57\x8f\xc5\x35\x03\xe7\x06\xd2\x07\xe8\x04\xf3\xc7\x5d\xae\x42"
+ "\xe7\x6f\xb8\xd0\x26\x87\xf3\x04\xe7\x08\xce\x87\x8a\xb8\x33\x34"
+ "\xf7\xfb\xf1\xa8\x52\x82\xdf\x72\x8f\x47\x1f\x00\x5a\xe5\x11\xfb"
+ "\x72\xa0\x4d\x12\xee\x17\x21\xbd\x31\x67\xe1\xf1\xe8\x75\x28\x2f"
+ "\xa8\x80\xe7\xef\xb3\x03\x9d\xec\x2d\xa1\x5d\xd6\x83\x1e\x85\xdf"
+ "\x78\x9d\xbf\xed\x62\x7e\x66\xde\xaf\x67\x24\x9c\xf7\xb5\x01\x8d"
+ "\x60\xee\xc8\xe6\x8c\x23\x6f\xf3\xb7\x1a\xb2\xad\x8e\xf8\x3f\x30"
+ "\x9f\xd1\xc8\xee\x34\x67\xc6\xcf\xc7\x39\x93\x01\x34\x3a\xe9\x25"
+ "\x8d\x1e\x65\x7b\xa8\x42\x00\xab\xbb\xfb\xe9\x61\x9d\x04\x1a\x3d"
+ "\xa2\xf6\x44\x23\x7b\x41\xff\x52\xbb\x2a\x02\xbf\x3d\x3f\xca\x2d"
+ "\x9e\xac\xe0\x40\x67\xba\x01\xba\xe9\x71\xb3\x8d\xa4\xce\x24\xca"
+ "\x94\x33\xc4\xcf\x38\xf9\x0b\x62\x34\x15\xd3\xb8\xe9\x68\xf3\xc5"
+ "\x7c\x26\x46\x5b\x31\xe0\xd5\xdc\x0c\x2c\x6f\xa3\x65\x33\x59\x39"
+ "\x93\xf8\xd0\x5c\xa6\xd1\x7a\xb2\x1e\xf8\x73\xf7\x4b\x7a\x25\x97"
+ "\x33\x32\x8e\x57\x61\x1e\x26\x62\xa8\xd4\xda\x30\xee\x5b\x40\x45"
+ "\x5c\x39\xc6\xca\x3c\x87\x71\xc9\x2b\x2d\xd0\xa6\x99\xbf\x61\x87"
+ "\x35\x63\x7b\x26\x5f\x8c\xb9\x29\x06\xe0\x1a\x81\xb1\xec\x14\xea"
+ "\x39\x28\x8b\xa0\xed\xcb\x90\xf6\x0e\xc8\x5e\x6a\xea\x0b\x0c\xe7"
+ "\x14\x15\x0b\x2c\x70\xfd\x97\x27\xb1\x5f\xcc\x0e\xcd\x8e\x03\x30"
+ "\xc6\x78\xc8\xdc\x23\x9f\xa4\x99\x7d\x75\xa0\xf3\x82\x8c\x86\xed"
+ "\xfc\x95\x67\xfa\x60\x83\xb1\xda\x4a\x6d\x90\xe6\xf4\x38\x3f\x5d"
+ "\x0a\xfa\x78\x61\x9e\x0b\x5c\xb3\x7f\xf9\x3a\xfa\x85\xf0\x05\xb0"
+ "\x5e\x85\x4c\xc8\x28\x9a\x6b\x56\x4a\xeb\xb2\xba\x16\xd6\xb3\x86"
+ "\xd1\x1a\x3e\x1d\xf3\x81\x1c\x84\xf7\x42\x3d\xe8\x83\x3a\x2b\xc5"
+ "\x94\x0f\xe7\xae\x53\xa2\x8d\xc4\x0a\xf8\x50\xfe\xd5\xdf\x68\x7e"
+ "\xd9\x8b\x8a\xde\x97\x8f\x45\xdb\x08\x3e\x7f\xca\x13\xf8\x9d\xa1"
+ "\xb7\xba\x55\x59\x30\xb0\xd5\xaf\x67\x7e\x7a\xbd\x94\x5b\xd3\x39"
+ "\x87\x26\xe2\xcc\xee\xb9\xd0\x26\xe2\x4c\x5d\x86\x92\x61\x4b\x24"
+ "\xda\xe9\xfc\x5d\xb1\xa5\xa2\xe9\x32\x49\x03\x3e\xae\x88\xd3\xd3"
+ "\x9c\x2d\x5d\x01\xdf\xb9\x95\x80\x27\x37\x41\xe7\x07\x3c\x41\x1c"
+ "\xd8\x0e\xf8\xc1\xad\x04\x5d\xff\x06\xe8\xfa\x02\x8e\xa0\xec\x85"
+ "\xc7\x99\xc0\xa3\x81\xa5\x70\x0e\xe8\xc4\x01\xae\x03\x9e\x68\xb6"
+ "\xa6\x90\xb0\xad\xc0\xa3\xdb\x10\x47\x40\x2e\x7e\x51\x0b\x38\xb2"
+ "\x1c\x70\x24\x89\xe6\x38\x0e\xdd\xae\x64\xf8\xf1\x71\xdd\x3a\xa5"
+ "\x4e\xcc\x71\x4e\xc7\xf7\xb1\xd5\x95\xc8\x1f\x31\x19\xd8\x57\xa5"
+ "\x1d\xd7\xa7\x95\xd1\x3e\x95\x16\xe0\x91\xdc\xb9\x5a\x3c\x47\xe7"
+ "\xed\xf2\xb8\x2e\x1c\xe3\xb5\x48\x1c\x93\x1d\x57\x48\x38\xcd\x03"
+ "\xfa\x7d\x68\x97\x8d\x8b\x48\xdf\xed\x57\x48\xd8\xf6\x45\x44\x03"
+ "\xf3\x55\xb9\x1d\xfa\x30\x6b\x89\x8a\xd0\xdc\x28\x7e\x3d\x0b\xe0"
+ "\xbc\xdb\xdc\x28\x20\x57\x87\x6e\xc7\x39\xb3\x58\xe3\xe8\x93\x4d"
+ "\x97\x10\x6e\x87\xb1\xa3\x71\xe4\x14\x8f\x31\x5f\x27\xd5\xaf\xa2"
+ "\x98\x9c\xff\xcb\x00\xe6\xfb\xd4\x77\x32\xe8\x2a\x9d\x1b\x15\x8f"
+ "\x1d\xe6\xdf\x1a\x38\x46\x9b\x42\x14\x8d\xe2\x35\x90\x3d\x39\xa0"
+ "\x55\xff\x0c\x92\xc1\x05\xe5\x17\x1b\x93\x2f\x63\xae\x01\x2f\xe7"
+ "\xe1\x63\x35\xd8\x96\x5d\x97\x30\x90\xfa\x1b\xbd\x95\x10\xb1\xa3"
+ "\x91\x84\xf3\x7f\x04\x7a\x2c\x80\x77\x6d\x24\x61\xf9\x8d\xf0\xae"
+ "\xcb\xd9\xbb\x8a\x39\xdd\xb9\xcc\x82\x08\xb8\xd6\x6e\x5e\x31\xf3"
+ "\x1f\x31\xaf\x58\x98\x1a\x30\xec\x17\xfc\x63\xe8\xcb\x4c\xe3\xfc"
+ "\xb4\x18\x6d\x67\x08\x3e\x17\xed\x43\xc6\xab\x94\xa7\x3f\x42\x5e"
+ "\xe6\xf4\xf1\xaa\xd9\xb5\xc0\xdb\x2d\x71\x68\x2b\x53\x1d\xac\x33"
+ "\x63\x5c\x1d\x2a\xf3\x99\x14\xea\x7a\x94\xd3\x0e\xc1\x39\xe4\x7d"
+ "\x27\x9e\xaf\x47\x9e\xc7\xeb\x94\xef\xe1\x3e\x63\xed\x05\x82\xed"
+ "\x39\xb7\x83\xf4\x17\xdb\xba\xa8\x08\xdb\x82\x6d\x21\x2f\xa0\x5d"
+ "\x07\xe7\x1a\xa3\x7d\x31\xfa\xad\x87\xf2\x21\xa3\xcc\xac\x6c\xc6"
+ "\x9c\x39\x2a\xe4\x01\xca\x2b\x80\xdf\x18\xc7\x99\xe7\xa3\x7d\x80"
+ "\xcf\xb0\x9f\x5d\x80\xde\xe1\x22\x5f\xc0\xb9\x60\x57\xde\xe8\xba"
+ "\x5a\x85\x3a\x4d\x30\xfe\xbe\x55\xfe\xf0\x8e\x7e\x61\x1e\xfd\x5f"
+ "\xb9\x30\x90\x6f\x01\x2f\x11\x37\xed\xcd\x4e\x98\xd9\xc4\x30\x13"
+ "\x31\x49\xc4\x4d\x8a\x4d\x34\x5f\x44\x31\xfa\xbc\x32\x9f\x76\x2f"
+ "\x71\xb3\xa2\x49\xc2\xcd\x17\xb5\x4e\xb8\xd9\xc4\xdf\xe0\xfa\xb8"
+ "\xc3\xcd\x3e\x5b\xe4\xb8\xd9\x67\x9b\x1c\x37\x9f\x50\xb8\xe2\x66"
+ "\x5b\xcc\xec\x73\xc6\x1d\x5e\x82\x1e\xf3\x68\xa3\x42\x53\xe4\x19"
+ "\x2b\x1f\xf7\xf7\x1e\x2b\x7f\xd5\x43\x8e\x95\x8f\x8f\xfb\xff\x17"
+ "\x2b\x7f\xb5\x5b\x86\x95\xaa\x5b\xc4\xca\x46\x8a\x95\xc1\xfc\x3f"
+ "\x61\x4e\x08\xf8\xb1\x7d\x81\x07\xac\x5c\xd0\xc1\x5c\xf8\xa3\x27"
+ "\xac\xd4\x74\x92\x63\xa5\x66\xb0\x1c\x2b\x7f\x75\x59\xc2\x4a\xe1"
+ "\xda\x1d\xc1\x4a\x8d\xef\xbd\xc1\x4a\x8d\x2f\xc5\xca\x2b\x88\x95"
+ "\x9a\xf3\x1d\x63\xe5\xe3\x2a\xf7\x58\x09\xe7\x29\x56\x3e\xae\x92"
+ "\xb0\xf2\x4c\x07\x58\xf9\xc4\x51\x2f\xb0\x32\x98\x62\xa5\xca\x03"
+ "\x56\x2e\x80\xb1\x12\xf8\x82\xf2\x9e\x0b\x6f\x08\x58\x19\xea\xc0"
+ "\xca\x5b\xe0\x0f\xef\xe8\xf7\x44\x49\x7b\x58\xc9\xe9\x98\x7c\x89"
+ "\x58\xc9\x87\x08\x58\xb9\xd0\x46\x52\x4e\x01\x46\x56\x37\xd2\xbc"
+ "\x38\xd4\x57\x18\xfe\x53\xa7\x23\x16\x45\xe9\xf6\xc0\x78\x19\x4d"
+ "\x45\x14\x9b\xa8\xcf\xeb\x38\xc4\xaa\x22\xa8\x9b\xe7\x90\x3b\x29"
+ "\x76\x9e\x12\xb0\x73\x86\x80\x9d\xb3\x7e\x04\x76\xbe\x84\xb4\x7c"
+ "\xf2\x64\xab\x52\xc4\xce\xb7\x00\x3b\x9f\xa4\xf2\x03\x7e\xd3\x64"
+ "\xd8\xd9\x7f\xa2\xd8\x2f\xb4\x69\x1a\x13\xdf\x21\xac\x5f\x57\xdb"
+ "\xe2\xe8\x58\x6c\xef\xa9\x27\x0c\x0b\x9a\x88\x03\x4b\x67\x48\x58"
+ "\x0a\x6d\x29\x3c\xe3\xe8\x53\x51\x0e\x1c\xcd\x04\x1c\x3d\xeb\x84"
+ "\xa3\xa0\x37\x7d\x88\x98\x07\x38\xda\x42\x71\xf4\x63\x01\x47\xfb"
+ "\xce\x39\x36\x03\x70\x74\xac\x88\xa3\x4f\xe5\x58\x33\x0b\x06\x5a"
+ "\xb3\x3a\xc6\xd1\x16\x8a\xa3\xda\xbb\x8f\xa3\x25\x2e\x38\x0a\xba"
+ "\x2b\xe6\x75\x77\x8b\xa3\x22\x3f\x52\x1c\xcd\x90\x70\x94\x8e\x6b"
+ "\x5f\x7b\x65\x0c\x8c\x7b\x8c\x96\xea\x6e\x0e\x1c\xd5\x16\x31\x1c"
+ "\x85\x73\xd4\x7e\xb2\x14\x70\x14\xf8\x2f\xbd\x02\xe3\x05\x92\x48"
+ "\xe8\xa3\x0a\xf1\x75\x07\xcc\x19\x1c\x23\x07\x9e\x2e\x80\x39\x83"
+ "\x18\xd3\x0c\x73\x06\x70\x74\xd6\x35\x15\xa1\xf3\x25\x0b\xe6\x4b"
+ "\xa3\x87\xbc\x7c\xa2\x0f\xae\x47\x3c\xed\x37\x45\x8e\xa7\xfd\xd6"
+ "\xc9\xf1\xb4\xdf\x50\x09\x4f\x85\x6b\x88\xa7\x40\x33\x18\x9f\x62"
+ "\xc4\xd4\xdb\xc3\xd3\x7e\x93\x1d\x78\xaa\x14\xf0\x74\x41\xc7\x78"
+ "\x4a\xbf\xfd\x79\xc0\x53\x67\x6c\xf0\x8c\xa7\xfd\x26\x4b\x78\xda"
+ "\xff\x69\x07\x9e\xd6\x78\xc2\xd3\xa7\xa2\xdd\xe3\x29\x9c\xa7\x78"
+ "\xfa\x54\xb4\x03\x4f\x6b\xdc\xe0\xe9\x58\x67\x3c\x1d\xd0\x9b\xe1"
+ "\x69\x11\xc5\x51\xc4\xd4\x4a\x0b\xf0\x07\xce\xb9\xc4\x3c\x8a\xa9"
+ "\x1c\x60\x2a\xe6\x2a\xc6\x3c\x55\xe8\x6b\xef\x0e\x53\x19\xe6\x9a"
+ "\x08\xe2\x2a\xce\xcd\xf4\xf1\xa0\xef\xc2\x5a\x04\x63\x42\xd7\x5e"
+ "\x71\xfc\x76\x38\xe1\xeb\xec\x15\x2a\x94\xed\x64\xbc\xc2\x89\xbc"
+ "\xd2\xac\x41\xbf\x5b\x19\xaf\x78\x47\xcb\x01\x6a\x4f\xd8\xea\x49"
+ "\x77\x3f\x86\xba\xfb\x14\xa2\x5c\x39\x05\xf0\x35\x1a\x75\xf7\x42"
+ "\x17\xdd\xbd\xb0\xad\xee\x7e\xb2\x7d\x1c\xf5\x4a\x77\x9f\x8a\x34"
+ "\x0c\x7f\x58\x8e\xa3\xe1\xbd\xe5\x38\xfa\xeb\x6d\xd8\x2f\x86\xe3"
+ "\x85\xee\x75\x77\x3a\xcf\xc3\xe3\x1d\xba\x7b\x8d\x1c\x3f\x25\xdd"
+ "\xfd\xd7\xe3\x3d\xe3\x68\x78\x9e\x4c\x1e\x9d\x25\xe0\xe8\x5c\x01"
+ "\x47\xe7\x4a\x38\x7a\xfc\x0b\x51\x1e\x7d\xfa\xa3\xb2\x1a\x67\x1c"
+ "\x0d\xaf\x75\xe0\x68\x6d\x5b\x1c\x15\x31\x14\xf1\x14\xdb\x41\x5b"
+ "\xd6\x2e\xc0\xe9\xbd\x73\xb5\x4a\x66\xab\x8d\xc1\xb1\xf3\x77\xb5"
+ "\xd5\x56\x34\x5d\x23\x69\x33\x10\x4f\xf3\x28\x9e\x06\x2a\xc8\x1c"
+ "\xc0\xbe\xae\xb8\x97\x20\x1f\xbf\xdb\x27\xb1\x3c\x6f\x68\x5f\xe2"
+ "\x96\xb3\xbc\xa1\xa2\x9d\x09\xde\x97\x7e\xaf\x9f\x79\x46\xc0\xd4"
+ "\xeb\x30\x1e\xc0\x73\x5b\xaf\x03\xa6\x26\xb9\x91\x4d\x57\x02\xa6"
+ "\xa6\x38\xc9\xa6\x30\xf7\x3f\x9e\xeb\x8a\xa9\xcf\xbc\x50\x89\xbc"
+ "\x82\x98\x2a\xd3\xe3\x0b\x7f\x06\x7a\xfc\x33\xef\xca\xb1\xf4\x99"
+ "\x6a\x39\x96\x3e\xf3\x86\x84\xa5\xc2\xb5\x3b\x22\x9b\x3e\xa3\xbf"
+ "\x37\xb2\xe9\x33\x7a\x49\x8f\xff\xf5\x2a\x07\x96\x56\x7b\xc2\xd2"
+ "\x70\xbd\x7b\x2c\x85\xf3\x14\x4b\xc3\xf5\x0e\x2c\xad\x76\xa3\xc7"
+ "\xcb\xb0\x74\xe0\x1c\x86\xa5\x85\x4c\x36\xad\x11\x65\xd3\xc2\x7f"
+ "\x41\x3d\x7e\x60\x8c\xb7\x7a\xfc\xb1\x26\x86\x9f\x88\x4f\x22\x86"
+ "\x4a\x7a\x7c\xa1\x67\x3d\xbe\x03\x0c\xf5\x4a\x16\xa5\x18\x3a\x68"
+ "\x8e\x1c\x43\x07\xc5\xca\x31\x74\xf0\x49\x57\x0c\x6d\x8b\x9f\x83"
+ "\x76\xba\xc3\x4e\xa6\xc7\x0f\x5e\xeb\x19\x37\x07\x55\x79\x8f\x9b"
+ "\xff\x71\x59\x8e\x9b\xff\x11\xfc\xef\x81\x9b\xbf\x59\x2d\xc3\x4d"
+ "\xd5\x2d\xe2\xe6\x4f\xa2\xd3\xff\xc6\xc5\xfe\x39\xd8\xc5\xfe\xf9"
+ "\x1b\x27\xfb\xe7\xe0\x3b\x68\xff\xfc\xcd\x3d\xb2\x7f\xfe\xa6\x46"
+ "\x92\x41\x07\x7f\xd4\x31\x6e\x0e\xaa\x71\x8f\x9b\x70\x9e\xe2\xe6"
+ "\xa0\x1a\x09\x37\x3b\x92\x41\x7f\xbb\xc5\x0b\xdc\xfc\x99\xeb\xf4"
+ "\xbf\x6d\xd7\xfe\xe9\x4e\xa7\x47\xdc\xa4\x78\x59\xe3\xa2\xd3\x4f"
+ "\x71\xd6\xe9\x0b\x25\x9d\x7e\x0c\xc3\x2d\xa3\x4d\x27\xd7\xe9\xef"
+ "\x38\x8e\x0e\x79\xdf\xea\xb0\x87\xbe\x09\x38\x3a\x84\xc6\x88\xb1"
+ "\x3a\xec\xa1\xcf\x3d\x2d\xf6\x8b\xe9\xf4\x6f\x11\xd6\x2f\x37\x3a"
+ "\x3d\xf5\x9b\x1d\x62\x77\xe8\xf4\x35\xae\x3a\xfd\xd0\xf3\x9e\x31"
+ "\xf5\xd9\x30\xb7\x3a\x3d\xea\xdf\x14\x53\xb5\x14\x53\xaf\xe7\x3a"
+ "\x63\x6a\xc4\x70\x8a\xa9\xcf\x8b\x98\xfa\x6c\x9c\x15\xe6\xa6\xd5"
+ "\xaf\x63\x4c\xc5\x76\x24\x4c\x8d\xfb\x69\x30\xd5\x70\xeb\x98\xea"
+ "\xbc\x87\xf5\x63\x78\x77\x07\xa6\xd2\x31\x8e\x38\x53\x19\x83\x98"
+ "\x1a\xe7\xa2\xdf\x17\xba\xd7\xef\xcb\x88\x12\xc7\x47\xd4\xef\x91"
+ "\x06\x14\x6f\xee\xaa\x7e\x3f\x74\x90\x1c\x5b\x87\xc6\xc9\xb1\x75"
+ "\xe8\xc3\x12\xb6\x0a\xd7\xee\x88\x7e\x3f\x74\xe0\xbd\xd1\xef\x87"
+ "\x0e\x94\xb0\xf5\xb9\xa0\x8e\xb1\xf5\xd9\xbe\xee\xb1\x15\xce\x53"
+ "\x6c\x7d\xb6\x6f\xbb\xd8\xfa\xbc\x33\xb6\x0e\x53\x88\xd8\x2a\xe9"
+ "\xf7\xc0\x1f\x38\xff\x12\x75\xb7\xaf\xdf\xbf\x70\xaf\xf5\xfb\x61"
+ "\xc4\x2b\xfd\x3e\x17\x70\x16\x74\xf1\x95\x27\x40\xbf\x9f\x28\xe8"
+ "\xf7\xb5\x7a\x17\xfd\x5e\xdf\x46\xbf\x4f\x9d\x28\x60\x2a\xcc\x29"
+ "\x8a\xa9\x73\x0b\x6f\x5f\xbf\x9f\x84\x34\x1c\x66\x97\x63\x6a\xa4"
+ "\x42\x8e\xa9\x23\x37\x61\xbf\x18\xa6\xeb\xdd\xeb\xf7\x74\x9e\x47"
+ "\x8e\x97\xe9\xf7\xd0\xbf\xb6\xfa\xfd\xc8\xe1\x32\x4c\x9d\xe5\x8c"
+ "\xa9\x91\xc9\x32\x39\x15\xde\x0b\x31\xf5\xfd\xb3\x0c\x53\x3f\x38"
+ "\xeb\x84\xa9\x2f\x7e\x20\x60\xea\xf0\xf7\xcb\x26\x3b\x63\x6a\xe4"
+ "\x01\x11\x53\x29\x5e\xce\xb2\x2a\xd3\xa3\xdb\xfa\x9d\x50\x7f\x1f"
+ "\xf4\x05\x82\xb6\x71\x9f\x14\xb6\xb9\xfb\x6c\x5c\xc7\xfe\x26\xd1"
+ "\xee\xfd\x4d\x8c\x89\x26\x52\x5e\xaf\xa3\x7e\x26\xf9\xe8\x67\xb2"
+ "\x9a\xf4\xce\xbf\xc1\xe2\x07\xd0\x1c\x1f\xd7\xdd\xc7\x0e\x98\x39"
+ "\x5d\xc2\x59\xf4\xc9\xda\x8a\x3e\x59\xd7\x99\x0f\x10\xd0\xbb\x6d"
+ "\xac\x00\x51\x6e\x02\x3c\xd8\x7f\xd6\x15\x67\x47\x0c\xad\x44\xfe"
+ "\x99\x11\xe7\xa2\xf3\xeb\x7f\x06\x3a\xff\x88\xcd\x72\x7c\x1d\x51"
+ "\x2a\xc7\xd7\x11\xab\x24\x7c\x15\xae\xdd\x11\xd9\x75\x44\xce\xbd"
+ "\x91\x5d\x47\xe4\x48\x3a\xff\xc8\x25\x0e\x7c\xad\x72\xc2\xd7\xb3"
+ "\xce\xf8\x1a\x99\x41\xf1\xf5\xac\x2b\xbe\xc2\x79\x8a\xaf\x91\x19"
+ "\x0e\x7c\xad\x72\xd1\xf9\xcf\xba\xe2\xeb\xa8\x29\x14\x5f\x6b\xf5"
+ "\x2e\xb2\xab\xbe\x63\x9d\xbf\xf6\xe7\xa6\xf3\x8f\x9a\xec\x95\xce"
+ "\x8f\x98\xba\x90\x61\x2a\x62\x96\x88\xab\x92\xce\xaf\xf7\xa8\xf3"
+ "\x77\x84\xab\x5e\xc9\xaa\x14\x57\x47\x4f\x91\xe3\xea\xe8\xe9\x72"
+ "\x5c\x1d\x73\xc6\x15\x57\xdb\x62\xea\xe8\x2d\xee\xf0\x94\xe9\xfc"
+ "\x63\xd6\x7b\xc6\xd2\xd1\x25\xde\x63\xe9\xf3\xd7\xe4\x58\xfa\xbc"
+ "\xff\xbf\x2f\x96\xfe\xee\x0d\x19\x96\xaa\x6e\x11\x4b\x7f\x12\x3b"
+ "\xc0\xef\xce\xcb\xb1\x74\x4c\xb0\x1c\x4b\x7f\x57\x26\x61\xa9\x70"
+ "\xed\x8e\x60\xe9\xef\x4c\xf7\x06\x4b\x7f\x67\x92\x64\xd5\x31\x9f"
+ "\x74\x8c\xa5\xa3\xcb\xdd\x63\x29\x9c\xa7\x58\x3a\xba\x5c\xc2\xd2"
+ "\x33\x1d\x60\xe9\x0b\xef\x7a\x81\xa5\x72\x3b\x80\x2b\x96\xde\x73"
+ "\x3b\xc0\x0b\x7a\xaf\xec\x00\x22\x96\x4e\x6c\x6b\x07\x40\x7c\xa5"
+ "\x76\x00\x18\x2f\x11\xc3\xa8\x1d\x60\x14\xc3\x32\xa3\x6d\x9d\xcc"
+ "\x0e\x70\xe7\xb1\x75\xec\x5f\xad\x0e\x7b\x6a\x26\x60\xeb\x58\x9a"
+ "\xff\xc3\xea\xb0\xa7\xbe\x38\x5e\xec\x17\xb3\x03\xbc\x49\x58\xbf"
+ "\xdc\xd8\x01\x46\x60\x7b\xbf\xef\x24\xb3\x03\x38\x61\xed\x45\xc5"
+ "\x78\xbb\x67\x9c\xfd\x7d\x5f\x99\x1d\xa0\x4e\xc2\xd9\xeb\xe8\xa3"
+ "\x0e\x38\x48\x71\x36\xc4\x19\x67\xc7\xcd\xa4\x38\x3b\x42\xc4\xd9"
+ "\xdf\x6b\x5b\x60\x6e\xb6\x78\x8b\xb3\xb8\x8f\xe0\x6c\xcc\xbd\xc1"
+ "\xd9\x62\x2f\x70\xd6\xc9\x36\xb0\x1f\xc6\xc3\x81\xb3\x74\xdc\xc7"
+ "\xb5\x56\xce\x40\x9c\x8d\x71\xb1\x0d\xe8\xdd\xdb\x06\x8e\xde\x0b"
+ "\xdb\xc0\xf8\x89\x72\xbc\x1d\xbf\x56\x8e\xb7\xe3\x7f\x2b\xe1\xad"
+ "\x70\xed\x8e\xd8\x06\xc6\x47\xdd\x1b\xdb\xc0\xf8\x28\x09\x6f\x5f"
+ "\xec\xd7\x31\xde\xfe\x7e\xa0\x7b\xbc\x85\xf3\x14\x6f\x7f\x3f\xb0"
+ "\x5d\xbc\x1d\xe1\x8c\xb7\x13\x1e\x16\xf1\x56\xb2\x0d\xe8\x05\xdb"
+ "\xc0\xba\x8e\x6d\x03\xb5\x1e\x6c\x03\xa3\xef\xb5\x6d\x60\x82\xc7"
+ "\x18\xd2\xee\x6c\x03\xad\xb9\xcc\x6f\x7f\x25\xfa\xed\xcf\x04\xfc"
+ "\x8d\xfa\x02\xc6\xa0\x63\xbf\xfd\x54\xd1\xff\x34\x26\x4f\xc0\xd9"
+ "\x3c\xb7\xb6\x81\x63\x0d\x9e\x6d\x03\xc7\xaa\x9d\xfd\x4f\xa3\x7a"
+ "\xc8\xbf\x5b\x45\x3d\x2c\x7e\xb7\x3a\xf6\x15\xe2\xec\x64\x9a\xd7"
+ "\x85\xcb\x99\x66\x60\xf1\x0c\x27\x87\x61\x3f\xdd\xf9\xf1\x7f\xcc"
+ "\x39\x7f\xcb\x8a\x5a\xe1\xb0\x15\x54\x21\xde\xe6\x11\x8e\x8f\xf3"
+ "\xc3\x58\xe4\xd4\x56\x30\x15\x79\xef\x0f\x27\x9d\x71\xf7\xe0\x69"
+ "\x67\xdc\x8d\x2a\x10\x71\xd7\x0e\xb8\xfb\x49\x5d\x1e\xb3\xbf\xbe"
+ "\xc4\x7c\x53\x77\xbd\xe4\xe4\x9b\xfa\xc5\xa7\x02\xee\x4e\x7c\xb7"
+ "\xcc\x04\xef\xdf\x9e\xff\x14\xdc\xbf\xe7\xf4\xad\xfa\xa0\xe6\xb9"
+ "\xf5\x9d\x12\xf0\xc9\xad\xff\x14\xf4\x55\xb5\x4d\x98\xab\x76\x98"
+ "\xa7\xdb\x9c\xfc\xa7\xf2\x53\x60\x3e\x0b\xfb\x4a\xda\xf5\x43\x7d"
+ "\x49\xf2\x43\xe5\x73\xa6\xd2\xbc\xae\xdc\xe6\x69\x86\x1b\x7c\x9c"
+ "\x0f\x1f\x3c\xd5\x86\xcf\xbf\x79\x13\xd6\x9d\x91\xd1\x3e\x4c\xaf"
+ "\x9b\x6a\x02\xec\xe9\xca\xc6\x7d\x62\xad\x1d\xd6\x1a\x3b\xac\x35"
+ "\x5c\xce\x54\x93\x0d\x65\x93\xdc\xa9\xf5\xf9\xa0\xe7\xd9\x32\x69"
+ "\xce\xd6\x2e\xd9\xa0\xeb\xed\x40\x3d\xef\x0a\xcc\x8d\x74\x8d\x12"
+ "\xfb\x23\xe2\x68\x60\x03\xbc\xc7\x95\xf6\x65\x39\xdb\xf7\x12\x8e"
+ "\x1a\xc6\x1e\x83\x67\x4e\x3a\x51\x89\xbc\x1b\x2d\xed\x29\xa0\x32"
+ "\xb3\x07\x5f\x59\xec\x0b\x8b\xbb\x08\xbc\x70\x07\x6c\x12\xce\xfd"
+ "\x91\xe3\xfa\x1f\x9e\x90\xe3\xfa\x1f\x66\xc8\x71\xfd\x0f\x41\x12"
+ "\xae\x0b\xd7\x00\xd7\x81\x6e\x54\x8e\x86\xb5\xef\x36\xe5\xe8\x3f"
+ "\x68\x44\x5c\xe7\x04\x5c\xdf\x7e\x0b\xb8\xde\xae\x1c\xed\x84\x4b"
+ "\x9e\x71\xfd\x0f\x1a\xc9\x26\x31\xb9\x93\x5b\x1f\xd9\xd3\xce\xb8"
+ "\x1e\xb5\x8b\xe2\xfa\x69\x57\x5c\x87\xf3\x14\xd7\xa3\x76\x79\xdc"
+ "\x4f\x70\xda\xf5\x7b\xda\xe4\x4b\x14\xd7\x6b\x04\x1f\xd9\x2a\x2f"
+ "\xf6\x13\xd4\x30\x4c\x17\xb1\x1c\xed\x55\xf7\xd6\x26\x31\xb9\xc1"
+ "\x1b\x9b\x04\xc5\xf2\x26\x86\xe5\x88\x8d\x22\x9e\xdf\xca\x7e\x82"
+ "\x8e\xf0\x5c\x94\x9b\x11\xcf\x3d\xc9\xcd\x72\x3c\x9f\x72\x49\x8e"
+ "\xe7\x53\x2e\xcb\xf1\x7c\xfa\x25\x39\x9e\x4f\x6f\x70\xc5\xf3\xb6"
+ "\x58\x3e\x75\xa8\x3b\x1c\xd7\x4e\x45\x1b\xc5\xf4\x3c\xcf\x18\x3e"
+ "\x35\xce\x7b\x0c\x9f\x16\xfb\x6f\x87\xe1\x2a\x57\x0c\x9f\xa6\x47"
+ "\x0c\xb2\x67\xb9\x60\xf8\x02\x01\xc3\x05\x1c\xd9\xd1\x28\xc8\xc2"
+ "\xae\x18\xde\x04\xef\xd1\x81\x3e\x6e\xfb\xa7\x2b\x86\x47\x6f\x96"
+ "\x61\xb8\xaa\x03\x0c\x5f\xc0\xec\x20\x32\xbf\x5c\x0f\xb6\x10\x78"
+ "\x8f\x82\x6d\x1e\x64\x73\x71\xcc\x9c\xfb\x23\xc7\xf0\xe8\xcb\x72"
+ "\x0c\x9f\xae\x96\x63\x78\xf4\x49\x09\xc3\x85\x6b\x77\x44\x36\x8f"
+ "\x6e\xba\xe3\xb2\xb9\xc8\x1f\xed\x62\x78\x74\x93\x24\x9b\x4f\x2f"
+ "\xeb\x18\xc3\xa7\x6a\xdd\x63\x38\x9c\xa7\x18\x3e\x55\xeb\x71\x9f"
+ "\x43\x1b\x0c\x7f\xe9\x7d\x2f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0\x85"
+ "\xec\x70\xb2\x85\xd8\x33\x99\x2d\x64\x5b\x23\xe3\x8d\xae\x0a\xc6"
+ "\xa7\xc0\x3f\xa1\xdb\x95\xed\xeb\x6e\xdb\x6e\xcb\x0e\xf2\x52\x9b"
+ "\x98\xe4\xed\xd9\x41\x28\x7e\xe3\x1e\x87\xe9\x80\xdb\x55\xb7\xb8"
+ "\xc7\x61\x8c\xb8\xc7\x41\xe7\x61\x8f\x83\x80\xe7\xb3\x7e\x04\x9e"
+ "\xd3\x3d\x0e\x2f\xef\x97\xdb\x98\x5f\xfe\x44\xb4\x31\x33\x3c\x9f"
+ "\x5d\x21\xc7\xf3\xd9\xe5\x8e\x3d\x0f\x80\xf9\x46\xed\x5b\x6d\xf6"
+ "\x3c\x38\xb0\x9d\xda\x41\x67\x3c\x6c\x98\x5a\x4f\x1c\xf8\x3e\x43"
+ "\xc2\x77\x68\x6b\x95\x0c\xdb\xeb\x9c\xb1\x7d\xc6\x28\x19\xb6\x9f"
+ "\xcd\x93\xfb\x47\xd4\x69\x9d\xb0\x5d\xdc\xf3\x30\x73\x78\x59\x6d"
+ "\x07\xd8\x0e\xf7\xdf\xfa\x1e\xb1\x3b\x8b\xed\xe2\xfe\x06\xb7\xd8"
+ "\xee\xbc\xbf\xc1\xc9\xff\x01\xb1\x9d\xe6\xbd\xe8\xee\x82\xed\x2b"
+ "\xe3\x94\xf6\x23\x30\x1f\x00\xd7\x71\x8e\xd8\x79\xc0\x76\x3a\xde"
+ "\x33\x53\x9d\xb1\xfd\x66\x26\xc3\xf6\xad\x8d\x3f\x1e\xdb\x1d\xf2"
+ "\xb0\x33\xb6\x3f\x8f\xd8\x3e\x6b\x05\xdb\x7f\x91\x71\x6b\xfb\x2f"
+ "\x5c\xfc\x33\xb6\xde\x82\xfd\xa5\x5d\x8c\x77\xd3\x2f\x39\xc6\xcf"
+ "\x3a\x21\xc7\xf8\xd9\xbe\x72\x8c\x9f\xb5\x5f\xc2\x78\xe1\xda\x1d"
+ "\x91\xd3\x67\x55\xdd\x1b\xfb\xcb\xac\x2a\x09\xe3\x67\xef\xee\x78"
+ "\xef\xc5\x8c\x71\xee\x7d\x33\xe0\x3c\xc5\xf8\x19\xe3\xda\xdd\x7b"
+ "\x21\xb3\x77\xc7\x6c\x73\xbb\xf7\xa2\xea\xa7\xf3\xcd\x70\xe6\x15"
+ "\x57\xfb\xcb\xed\xdb\xbe\x63\xf2\xbd\xb5\xbf\xe0\xde\x8b\x95\x27"
+ "\x9d\xf6\x5e\xd4\x76\xbc\xf7\x22\x75\xca\x2d\xda\x5f\xda\xf1\xcd"
+ "\x38\x16\xe5\xec\xef\x36\x67\x8b\x1c\xdf\xe7\x6c\x73\xe0\xfb\x24"
+ "\xc4\xf7\xd8\xbf\xca\xf1\x3d\xb6\x08\xfb\xe9\x6e\x2f\xc6\xc7\xb2"
+ "\xef\x8a\x73\x5a\xe5\xbe\x1a\x2e\xf6\x97\x49\xc8\x7b\xb1\x73\x64"
+ "\xf8\x7e\xd6\x19\xdf\xe7\x86\xb9\x93\xdd\xd1\xee\x4d\x7d\x8a\x67"
+ "\x39\xed\x69\x7b\x51\xf4\x7f\x7b\xa5\x5f\x59\x34\xbc\xbf\xc9\x83"
+ "\xaf\xdb\x2c\xe6\xeb\x46\x7d\xdb\xd0\x0e\x0e\x6d\xed\x9d\xa5\x55"
+ "\xa6\xc5\xf0\x1c\xfa\xba\xb9\xfa\xb9\xa1\xef\x1b\xfa\xba\x55\xc4"
+ "\xe9\x3c\xfa\xb9\x21\x6f\x7a\xf2\x75\x83\x7e\x07\x53\xac\x3f\x2f"
+ "\x60\xbd\xe0\xeb\x96\x9f\x24\xf9\xba\xc9\xb0\xde\x8d\xff\xf0\xfe"
+ "\xb3\x19\xee\xe5\xf8\x74\x09\xeb\x6f\xa0\x1c\xff\xac\x8b\x2d\x86"
+ "\xd2\xe0\x95\xb8\x9f\xd4\x16\x43\xb1\x7e\xde\xcc\x4a\xe4\xe3\x19"
+ "\x5a\x37\xb6\x98\xb6\x3e\xce\x3f\x9d\x2d\x66\xde\x47\x72\x8c\x9f"
+ "\xd7\x20\xc7\xf8\x79\xdb\x24\x8c\x17\xae\xdd\x11\x8c\x9f\xb7\xef"
+ "\xde\xd8\x62\xe6\xed\x93\x6c\x31\xb1\x9b\xdc\xfa\xdf\xc9\x6c\xec"
+ "\x73\xfb\xba\xb7\xb1\xcf\x15\xfc\xef\xe6\xf6\xf5\xb8\x27\xa4\xcd"
+ "\x37\xcd\x57\x97\x31\x1b\xfb\x6d\xec\x09\xa9\xfd\xb9\xd9\x62\x5e"
+ "\x4d\xf4\xd6\x16\x43\x7d\x9b\x4f\xa2\x7f\x88\x77\x7b\x42\x3a\xc2"
+ "\x76\x87\xec\xde\xce\x37\x4c\x39\xb6\xbf\xb6\x4c\x8e\xed\xaf\xad"
+ "\x90\x63\xfb\x1f\x57\xcb\xb1\xfd\x8f\x19\xae\xd8\xde\x16\xd7\x5f"
+ "\x2b\x73\x87\xe9\xda\x49\x68\x8b\xf9\x63\xb8\x67\x3c\x7f\xcd\xe2"
+ "\x3d\x9e\xc7\xd9\xff\xad\xf1\x5c\xe5\x8a\xe7\xf3\x07\xff\xa4\x76"
+ "\x19\x8a\xe7\x0b\xfa\xc9\xf0\x5c\xd5\x01\x9e\xff\x64\x76\x99\x05"
+ "\xaf\xcb\xf1\x7c\x41\xb1\x1c\xcf\x17\xc4\x4b\x78\x2e\x5c\xbb\x23"
+ "\x76\x99\x05\x6b\xef\x8d\x5d\x66\xc1\x5a\x49\x66\xff\xe3\x9c\x8e"
+ "\xf1\xfc\x35\x9b\x7b\x3c\x87\xf3\x14\xcf\x5f\xb3\x79\xf4\xa7\x6e"
+ "\x83\xe7\x0b\x87\x7b\x81\xe7\x6e\x7d\x54\x7e\x1e\x76\x99\x85\x91"
+ "\xde\xda\x65\x3c\xed\x53\x41\x7c\x97\xfc\x53\x9c\xf6\xa9\x44\x8a"
+ "\xfb\x54\x32\xe4\xfe\x29\x77\x1c\xdb\xe3\x27\xca\xb1\x3d\x7e\x8a"
+ "\x1c\xdb\x97\x2c\x91\x63\xfb\x12\xad\xd8\x4f\x66\x97\xc9\x6c\xb3"
+ "\x6f\x45\x8e\xf3\xf1\x1f\x19\x26\xd5\x13\x77\x58\x0f\x6d\xf5\xf6"
+ "\x8c\xf3\xf1\xb5\x9e\x70\x1e\xfd\x55\x3e\x9c\x15\xe7\x06\xe7\x17"
+ "\x5d\xf8\xff\x01\xe7\x3d\xf9\xa1\x50\x3d\x08\x30\x1e\xf1\x9e\xe2"
+ "\xbb\x80\xf5\x88\xf3\xf6\x7f\xb8\xb3\xd1\x2c\x56\xdf\x2d\x9c\xf7"
+ "\x6c\xa3\xd1\x3e\x5c\x39\x43\xc0\xf9\x5b\xd9\x43\x73\x58\x6e\xa3"
+ "\xc9\x5f\x70\xb7\x6d\x34\xda\x65\x72\xbc\xd7\x16\xca\xf1\x5e\x3b"
+ "\x53\xc2\x7b\xe1\xda\x1d\x91\xdf\xb5\x89\xf7\xc6\x46\xa3\x4d\x94"
+ "\xf0\x7e\xc9\xc4\x8e\xf1\x3e\xbe\xde\x3d\xde\xc7\x0b\xb1\xd9\xe2"
+ "\xeb\x6f\x1d\xef\x13\x1c\x78\xdf\x76\xff\x4c\xc6\xed\xfb\xc8\x0c"
+ "\xbf\xd7\x36\x9a\x04\x8f\xf8\xdf\x5e\x7c\x8c\xdb\xb7\xd1\x08\x7b"
+ "\x12\xe7\xba\x8f\x8f\x51\xd6\x8e\x8f\x4c\x59\xb9\x33\xd6\x2f\x1d"
+ "\x2a\xf7\x45\x5c\x3a\x5c\xf4\x45\x2c\xab\x44\xac\x5f\x3e\x5f\x8e"
+ "\xf5\xcb\xe3\x3c\xd9\x68\xf6\x73\xce\x3e\x89\x4b\xb7\xc9\x6d\x34"
+ "\x7a\xb9\x8d\xe6\x45\xe4\xbd\xe5\x3d\x3c\x63\xfd\xd2\x52\xb9\x0f"
+ "\x38\xdb\xa3\xf8\xfe\x2c\xc1\x07\x7c\x96\x93\x0f\xf8\xd8\xf7\x04"
+ "\xac\x4f\xbc\x50\x5a\x65\x23\xde\xf8\x21\xfe\x78\x5f\xef\x75\x6e"
+ "\x7d\x10\xe9\x1a\xd0\x8e\x1f\xe2\xec\x53\x2a\xf4\x69\x8e\xd8\x9e"
+ "\xe4\xe4\x87\xd8\x4e\x3c\x63\x19\xfe\xcf\xd2\x7a\xc4\xff\x56\x5e"
+ "\xc2\x7f\xee\x37\x92\xdd\x86\x43\x39\x9f\xd2\x65\x99\xfa\x6e\xd9"
+ "\x6d\xdc\xd9\x49\x0c\x23\x10\xff\x93\xba\x33\x39\x3f\xee\x67\x66"
+ "\xb7\x49\x8a\x97\xe3\x7e\x92\x5e\x8e\xfb\x49\x53\x24\xdc\x17\xae"
+ "\xdd\x11\x5f\xf4\xa4\x85\xf7\x46\xce\x4f\x5a\x28\xd9\x6d\x96\xbf"
+ "\xd0\x31\xee\x2f\xad\x72\x8f\xfb\x4b\xab\x18\xee\x2f\xad\x6a\xd7"
+ "\x6e\x23\xf3\x8d\x4c\xee\xf7\xa3\xed\x36\xa2\x9c\x7f\xcf\xf7\xf5"
+ "\x24\xf7\xf5\xc6\x6e\xe3\xd8\x93\xfe\xa3\xec\x36\xee\xf1\x5e\x94"
+ "\xed\xcb\xda\xf9\xe6\x2a\xc7\xfb\x15\xfd\xe4\x78\xbf\xe2\x69\x39"
+ "\xde\xaf\x1a\x2f\xc7\xfb\x55\xe3\xdc\xd9\x6d\xe4\x58\xbf\x62\xb5"
+ "\x3b\x9c\xd7\xbe\x88\x76\x9b\x54\x9b\x67\x8c\x5f\xb1\xcb\x7b\x8c"
+ "\x4f\x29\xfb\x3f\x8c\x77\xc1\x78\x95\x2b\xc6\xaf\xf4\xfd\x49\x65"
+ "\x7c\x8a\xf1\x2b\x5b\x65\x18\x7f\x07\x6d\x39\xb7\xb2\x9f\xc4\xb3"
+ "\x6c\x9f\xea\xe2\xff\x9e\xea\xe2\xff\x9e\xea\xe4\xff\x9e\xba\xf6"
+ "\xce\x61\x7c\xea\x9d\xf7\x7f\xbf\x25\x8c\x4f\x75\xf2\x7f\x5f\xd5"
+ "\xaf\x63\x8c\x5f\xb1\xcf\x3d\xc6\xc3\x79\x8a\xf1\x2b\xf6\xb5\x2b"
+ "\xdb\xcb\x30\x3e\x2d\xe8\x6e\xd8\x72\xee\xcd\x7e\xa3\x34\x95\x37"
+ "\xf6\x9c\xf6\xe2\x8e\x78\xb4\xe7\x0c\x16\xed\x39\x5a\x0f\xf6\x9c"
+ "\x3b\x85\xf9\xe9\xbd\xe5\x98\x9f\xde\x47\x8e\xf9\x6b\xa6\xc8\x31"
+ "\x7f\xcd\x64\xb9\x3d\x27\xa1\x8d\x3d\x47\x8e\xff\xe9\xaf\x1b\x5e"
+ "\x74\xb6\xe7\xe8\x9d\xec\x39\x6b\x3a\x79\xc6\xff\x74\x8f\xf8\x7f"
+ "\x9d\xe2\x7f\x8c\x1b\xfc\xcf\xf8\x37\xc1\xff\x98\x1f\x81\xff\xab"
+ "\xef\x01\xfe\x67\x2a\x98\x8d\xe7\x16\xe3\xa4\xec\xf7\xde\xc6\xf3"
+ "\xe3\xd6\x81\xcc\xe9\xf2\x75\x20\x73\xbd\x7c\x1d\xc8\x1c\x2e\xad"
+ "\x03\xc2\xb5\x3b\xb2\x0e\x64\x46\xdf\x9b\x75\x20\x33\x5a\x5a\x07"
+ "\xd6\x0c\xea\x78\x1d\x48\xf7\xb0\x0e\xa4\x0b\xeb\x40\xba\x17\xeb"
+ "\xc0\xda\x3e\x9e\x6d\x3c\xda\xdb\xb7\xf1\xfc\xf6\x5e\xef\x83\x5a"
+ "\x1b\xe6\x95\x8d\x27\x37\xba\xa8\x1c\x63\xa4\x9c\x27\xca\x95\x73"
+ "\x44\x1b\x8f\xc1\xc5\xc6\x63\x68\x63\xe3\x59\x71\x5e\xc0\xff\x71"
+ "\xc2\x7e\xd3\x17\x7f\x44\x8c\x14\x9a\x47\xf9\xf5\xde\x72\xbf\xf9"
+ "\xd7\x29\xfe\x4b\xf1\xfb\xd6\xfd\x15\xfb\xc5\xd6\x1f\x43\x3b\x31"
+ "\x50\x5f\x5f\x22\xb3\xe9\x8c\x73\x17\x23\x65\x9d\xcc\xef\x46\xbe"
+ "\xdf\xf4\xf5\x7c\x19\xde\xbf\xc8\xf6\x9b\x7e\xe0\xee\x3b\xad\x23"
+ "\x26\x7f\xd6\x6e\x1a\x93\xdf\x11\xcb\xef\x75\xd3\x2d\xc5\x92\x9e"
+ "\x25\xc4\x92\x3e\x7b\x0f\x62\x49\xdf\x6a\x4c\xfe\xb3\xae\xf1\xfb"
+ "\xfe\xf3\x05\x63\xb9\x81\x54\x22\x8f\xcc\x70\x8d\x7d\x6a\x70\xbf"
+ "\x77\x5f\x29\xec\xdd\x5f\x74\x77\xe2\xa0\x60\x7f\xe8\x9a\xdf\x2d"
+ "\xbf\x68\x77\x9a\x99\xf6\x07\x73\x56\x43\x5f\x2b\xca\x81\x57\x39"
+ "\xc4\xd3\x04\xc4\xd3\x75\x84\xd6\x3d\x0f\xbc\xd0\xad\xef\x18\xe4"
+ "\xe3\x6c\x8e\x04\x68\x93\x10\x5b\xff\x93\xfa\x7d\x81\x18\x01\xd8"
+ "\xca\xea\xad\x3a\xcf\xdb\xed\xdd\x06\x8e\x81\xfe\x77\xde\xb3\xa8"
+ "\xaa\x53\xa5\xc9\x02\xf3\xa2\x11\xf7\xc4\x2a\x8c\xb6\x16\x03\xd2"
+ "\xe2\xe0\xa2\x2a\x5f\x1e\xf0\x77\xc7\xab\xc4\xdf\xbb\x79\xfa\x9f"
+ "\xe5\x54\x9e\xc1\x75\xaf\x5b\xfe\x01\x8c\x03\x22\xca\x56\xdc\xf7"
+ "\x92\x7d\x6b\x1b\x8c\x0f\xc7\xb3\xb5\x6f\xf6\x7c\x86\x1b\xf0\xbc"
+ "\x08\x18\x4b\xea\x63\x8b\xb8\x41\x73\x58\x01\x6e\x6c\xbf\x2a\x7d"
+ "\xc7\xc6\xf6\x71\x8c\x98\x1d\x65\x9d\xe4\xff\x62\xf2\x84\xad\xaf"
+ "\x17\xb8\xc7\xd6\xd7\x0b\x18\xb6\xbe\x5e\xe0\xc0\x56\x93\x1b\x3b"
+ "\x8a\xcc\x8f\xfd\x0d\xc1\xff\xc5\xe0\x22\x63\x1b\xfe\x05\xe3\xa3"
+ "\xbc\xe1\x95\xff\x0b\xc5\xd3\x85\x0c\x4f\x11\xaf\x44\x4c\x95\xec"
+ "\x28\x06\x8f\x76\x94\x8e\x30\xd5\xab\x3d\xfc\x14\x53\xdf\x5c\x26"
+ "\xc7\xd4\x37\x57\xc8\x31\x75\x43\xab\x2b\xa6\xb6\xc5\xd3\x37\xf7"
+ "\xbb\xc3\x52\x16\x1f\x65\x43\xa1\x67\x1c\x7d\xb3\xde\x13\x8e\x52"
+ "\xff\xf4\x59\x4e\xfe\xe9\x0e\x1c\xfd\xd3\x35\x39\x8e\xfe\x49\x73"
+ "\xab\x38\x4a\x73\x9b\x9c\xfd\x09\x72\x9b\xdc\x36\x8e\x6a\x5d\x70"
+ "\x74\xfd\x26\x09\x47\x5d\xf3\x9b\x74\x80\xa3\x0b\xee\x4e\x0c\x14"
+ "\x19\x8e\x72\x66\xda\x1f\xf5\x22\xec\xeb\x86\xee\x72\x1c\xdd\x30"
+ "\xc6\x33\x8e\xae\xbf\x20\xe1\x28\xab\x77\x77\x71\x74\x43\xb0\x0c"
+ "\x47\x17\x38\xe1\xe8\x3f\x25\x1d\x02\x7d\x2c\x1c\x38\x1a\xef\x84"
+ "\xa3\x0b\x3a\xc2\xd1\x0d\xc1\x38\x46\x4c\x46\xdd\x70\xaa\x63\x1c"
+ "\x7d\xb3\xc9\x3d\x8e\xc2\x79\x8a\xa3\x6f\x36\x49\x38\xea\x46\x46"
+ "\x95\xe1\x68\xf6\x27\x5e\xe0\xe8\xcf\x3c\x36\x4a\xf6\x01\xaf\x6c"
+ "\x15\xd2\x9e\xce\xb6\x31\x52\x67\x3a\xef\x09\x2a\x76\xc9\x7b\x52"
+ "\xdc\x26\xef\xc9\x0a\x71\x8f\xe7\x18\x01\x57\xc7\xfe\x08\x5c\xa5"
+ "\x7b\x3c\x37\x56\xc8\x7d\x4f\x36\x9e\x10\x7d\x4f\x18\xae\xbe\x1d"
+ "\x2b\xf6\x4b\xca\x7b\x52\xdc\x4e\x8c\x54\x5d\x6f\x59\x6c\x94\x31"
+ "\xce\xb1\x51\xde\xee\xee\x39\x46\xaa\x6e\x8c\x2c\x36\xca\xb1\x42"
+ "\x47\xde\x13\xd7\x18\xa9\x12\xc6\x6e\x9a\x4e\x31\xd6\x11\x83\x4a"
+ "\xb7\xde\x11\x23\xb5\x83\x7d\x41\xd8\xce\x9e\xba\xb8\xbb\x8f\xb1"
+ "\x06\x2f\x30\x56\x96\xf7\xc4\x35\xc6\xd4\x26\xbb\xb1\xb4\x98\x54"
+ "\xc6\x14\xbb\x89\x8d\x5a\x7c\x4f\x73\x9f\x60\xbf\xdc\x63\xed\x5b"
+ "\xab\xe5\x58\xfb\xd6\x3e\x5a\xf7\x8c\x3b\xac\x7d\x6b\xa2\x84\xb5"
+ "\xac\xde\xaa\x33\x2e\x58\x5b\xeb\x01\x6b\x61\x5d\xdd\x71\xd1\x5b"
+ "\xac\x7d\x8b\xf6\x9d\xcb\x14\xb0\xb6\xf1\x4e\x63\xed\x5b\x19\x12"
+ "\xd6\xbe\x3d\xba\xe3\x1c\x53\xba\x28\xf7\xfb\x72\x74\x51\x0c\x6b"
+ "\x75\x51\xed\xe6\x98\x92\xf9\x7c\xe4\x0c\x12\x73\x4c\x49\xf6\x80"
+ "\x62\xc1\x1e\xf0\xaf\x9c\x13\x25\x67\xa0\xb7\xf6\x80\xe3\xa0\xbb"
+ "\xe3\xbe\xcb\x95\x98\x73\x6a\x06\xe6\x44\x29\x72\xb1\x07\x14\xb5"
+ "\xb5\x07\x4c\x6f\x1f\x63\xbd\xb2\x07\xd0\x7d\x97\x9b\x9f\x96\x63"
+ "\xec\xe6\x41\x72\x8c\xcd\xab\x10\xf7\x59\x62\x7f\x3c\xc7\x4c\xdd"
+ "\xbc\xda\x61\x0f\xa8\x95\x63\xab\x64\x0f\xc8\x5b\xe5\x19\x63\x37"
+ "\xcb\xed\xbf\x63\x0b\x65\xfb\x2c\x3f\xa8\x73\x8e\x43\x2d\xc6\x9f"
+ "\xca\x2d\x2b\xab\x76\xc6\xd8\xcd\xe6\x7f\xa5\x38\xd4\x8e\x58\x53"
+ "\x1d\xf8\x72\xb7\x8d\x43\xfd\xe7\x58\x63\x69\x11\xc1\xbd\x6d\x14"
+ "\x6f\x65\xb6\x81\xa2\x7b\x63\x1b\x28\x2d\xf2\x60\x1b\xf8\xf3\x25"
+ "\x39\xce\xe6\xf5\xa2\x75\x4f\xb9\xc3\xd9\x3f\xef\x97\x70\x96\xd5"
+ "\x5b\x75\xca\x05\x67\x6b\xee\xa4\x4c\xfb\xe7\x86\xbb\x6b\x1b\xf8"
+ "\x73\x83\x64\x1b\xc8\xbb\x85\xfd\x8f\x9b\xf7\xb9\xc7\xd9\xcd\x82"
+ "\xdd\x75\xb3\x64\x77\xad\x71\x93\x2f\x45\x86\xb3\x5b\x36\x89\xfb"
+ "\x1f\xa9\x4c\x5b\x2b\xca\xb4\x45\xff\x82\xf9\x52\xb6\xe8\xbc\xb5"
+ "\x0d\xe0\x3e\x77\xc4\x56\xc4\x2e\x11\x5f\x25\xdb\x40\x91\x67\xdb"
+ "\x40\x07\xf8\xea\x7d\xee\xbe\x77\x36\xc9\xf1\xf5\x9d\xcd\x72\x7c"
+ "\xdd\xde\xdb\x15\x5f\xdb\x62\xeb\x3b\x27\xdd\xe1\x2a\xb3\x0d\x6c"
+ "\xab\xf2\x8c\xa9\x5b\x89\x27\x4c\xa5\x31\xfd\xea\x24\x1f\x69\x09"
+ "\x53\xf3\x1f\x96\x63\xea\xd6\x51\xb7\x8a\xa9\xf7\x24\x5f\xca\x6d"
+ "\x63\x6a\x9c\x0b\xa6\xe6\xef\x97\x30\xd5\x35\x67\x4a\x07\x98\x7a"
+ "\xb7\xec\x04\xce\x98\x2a\x93\x5d\xb7\x0d\x95\x63\xea\x36\xad\x67"
+ "\x4c\xdd\xf6\x80\x84\xa9\xac\xde\xdd\xc5\xd4\x6d\x11\x77\xd7\x4e"
+ "\xb0\x2d\x42\x92\x5d\xb7\x2b\x3a\xc6\xd4\xad\xfe\xee\x31\x75\xab"
+ "\x3f\xc3\xd4\xad\xfe\xb7\xbe\xa7\x7c\xfb\x05\x2f\x30\xf5\x67\x9e"
+ "\x4b\x65\x7b\xbd\xd7\x76\x02\xb4\xb7\x22\x96\xd6\xfe\xb8\xd8\x21"
+ "\xc9\x62\xec\x90\x51\x02\xc6\x3e\xff\x63\x31\x76\xc7\x35\xb9\x4f"
+ "\xc3\x8e\x56\xd1\xa7\x81\x61\xec\x7f\x6d\x91\xe7\x47\x6d\x1b\x2b"
+ "\x44\x1e\x43\x55\xff\x82\xc3\x4e\x80\x98\x3b\xca\xd9\x4e\xf0\x5f"
+ "\x2f\x78\xc6\x5b\xbd\x56\x66\x27\xf8\xcc\x3d\xde\x5e\x97\xe1\xed"
+ "\xbb\x1b\x28\xde\x3a\x62\xa8\xea\xf7\x89\x31\x54\x3b\x94\x61\x65"
+ "\x78\x1b\xf3\xd3\xe0\x6d\xf1\xad\xe3\xad\x3c\x97\x8a\x6b\xbc\xd4"
+ "\xf7\x9e\x36\x96\x00\xde\xd2\x78\x1d\xae\x31\x53\x6f\x2d\x5e\xc7"
+ "\xdd\x8a\x99\x8a\xfd\x72\x8f\xbb\xef\x7d\x24\xc7\xdd\xf7\x1a\x68"
+ "\x5d\xb7\xb8\xfb\xde\xeb\x12\xee\xb2\x7a\xb7\x8c\xbb\xb7\x65\x33"
+ "\x78\x6f\xdf\xdd\xb5\x19\xbc\xb7\x4f\xc2\xdd\xff\x5a\xd1\x31\xee"
+ "\xea\x93\xdd\xe3\xae\x3e\x99\xe1\xae\x3e\xb9\x5d\xdc\x95\xf9\x10"
+ "\x14\xcc\x77\x1b\xcb\xa3\xf6\x5f\x3d\xcf\x4a\x41\xdc\xed\xd8\x0c"
+ "\x00\x83\x95\xa9\x18\xc3\x29\x06\x7d\x08\x3a\xb6\x19\x74\x84\xb7"
+ "\xde\xdb\x0c\x76\xc6\xca\xf1\x76\xe7\x7c\x39\xde\xbe\xdf\x1d\xfb"
+ "\xd5\xae\xcd\x80\x62\xc0\xce\x8f\x1c\x36\x03\x93\x1c\x67\x25\x9b"
+ "\x41\xe1\x51\xcf\xdf\xbe\x76\x9a\x64\xf2\xed\xf3\x2e\x31\xab\x67"
+ "\x49\x78\x7b\xac\x52\xf4\x19\xfb\xef\xa0\xb2\x28\x67\xbc\xfd\x4b"
+ "\x58\x9b\x98\xd5\x93\xef\x60\xcc\xea\xc9\x77\x38\x66\xf5\x14\x79"
+ "\xcc\xea\x77\xae\x4b\x7e\x64\xde\xc7\xac\xfe\xef\xdd\x14\x83\x91"
+ "\x87\x30\x6e\xf5\xad\xd8\x11\xee\x72\xae\x15\x19\xf6\xca\xec\x08"
+ "\x85\x4f\xcb\xb1\xb7\x70\x9e\x67\xec\x2d\x54\x48\xd8\xcb\xea\xdd"
+ "\x5d\x99\xb7\x30\xfc\xee\xda\x11\x0a\xc3\x25\x3b\x42\xe1\x35\xb7"
+ "\xd8\x2b\xfb\x36\xb6\xb3\xc1\xfd\xb7\x31\x38\x4f\xb1\x77\x67\x83"
+ "\x47\x3b\x42\x1b\xff\xad\xf7\x4f\xb1\x6f\x63\x82\xcc\x6b\xf2\xc2"
+ "\x8e\xf0\xb3\xf3\x31\x78\xbf\xe6\x76\xec\x08\x88\xb7\x88\x67\x22"
+ "\xe6\xde\x8a\x1d\xe1\xce\xcb\xb8\x1f\x9c\x92\x63\xee\x07\x67\xe4"
+ "\x98\xbb\x67\x95\x2b\xe6\xb6\xc5\xdb\x0f\x1f\x76\x87\xb5\xcc\x8e"
+ "\xb0\xa7\xaf\x67\x9c\xfd\x70\x8c\x47\x9c\x75\xf1\xcd\x95\x70\x76"
+ "\xd7\x0a\x39\xce\x7e\xb8\xfe\xb6\x70\xf6\x56\x73\xb0\xfc\xac\x70"
+ "\x36\xc6\x05\x67\x77\x77\x97\x70\xd6\x35\x0f\x4b\x07\x38\x7b\x97"
+ "\xf2\xb0\x78\x96\x71\x77\x6f\x91\xe3\xec\xee\x72\xcf\x38\xbb\x7b"
+ "\xbe\x84\xb3\xac\xde\xdd\xc5\xd9\xdd\x79\x77\xd7\xb6\xb0\x3b\x4f"
+ "\x92\x71\xf7\xcc\xec\x18\x67\x3f\x8c\x72\x8f\xb3\x1f\x0a\xdf\xc5"
+ "\x3e\x8c\xf2\x28\xe3\xb6\xc1\xd9\xbd\xc3\xbd\xc0\xd9\x9f\xb9\x0f"
+ "\xc2\xde\xc8\xdb\xb1\x2d\x50\x7c\x35\xb9\xec\x97\x38\xe5\xbc\x5f"
+ "\xc2\xc9\xb6\x30\x4a\xb4\x2d\xc8\xf3\xb3\x24\x8b\xf6\xdb\x48\x01"
+ "\x77\x47\xfc\x58\xdc\x2d\x9a\xd8\xe2\xc0\xdd\x04\xc0\xdd\x22\xba"
+ "\x3f\xa2\xc5\x81\xbb\xfb\xee\x13\xfb\x25\xe5\x67\xf1\x60\x5b\x18"
+ "\x42\xdb\xdb\xe9\xb0\x2d\x20\x0e\x47\x3a\xdb\x16\xfe\xbe\xdf\x33"
+ "\x06\x17\x95\xcb\x6c\x0b\x9f\xba\xc7\x60\x8b\x0c\x83\xff\x6a\xa7"
+ "\x18\x3c\x44\xc4\xe0\xbf\xaa\xae\x83\x6e\x79\x3d\xcb\x3b\x0c\xb6"
+ "\x50\x0c\x1e\x73\x6f\x30\x78\xdf\x1d\xc0\x60\x3a\xee\x7f\x7b\xd7"
+ "\x68\x00\x0c\x9e\x81\x18\x3c\xe6\xd6\xec\x0d\x3f\x51\x8e\x16\xec"
+ "\x97\x7b\x2c\xfe\x7b\x1f\x39\x16\xff\x3d\x9a\xd6\x75\x8b\xc5\x7f"
+ "\xbb\x26\x61\x31\xab\x77\x77\xed\x0d\x7f\x0f\xbb\xbb\xf6\x86\xbf"
+ "\x87\x49\x58\xfc\xf7\x4b\x1d\x63\x71\x51\xb5\x7b\x2c\x86\xf3\x14"
+ "\x8b\x8b\xaa\xdb\xc5\xe2\x21\xce\x58\xbc\xcf\x21\xf3\xca\xec\x0d"
+ "\xa6\x7f\xf5\xdc\x2d\xfb\x3c\xca\xbf\xea\x47\x48\x46\x9d\xe2\xa3"
+ "\xa7\x8d\xf9\x84\x34\x67\x92\x0c\xa3\x6d\x08\x81\x73\x30\x7e\x1f"
+ "\x4d\x37\x86\x0e\x26\xdc\x5b\x11\xc5\x88\xc7\x6f\xe3\x3f\xc8\xb8"
+ "\x3a\xa5\x30\xb7\xe8\x18\x7f\x44\xfd\x5d\xf1\x3c\x62\xef\x0e\xa7"
+ "\xeb\xee\x9e\xc5\xeb\x22\x06\x0a\xf7\xed\x63\xfb\x6e\x22\x06\x8b"
+ "\x65\xe4\x4d\x93\xe2\xa3\x62\x7e\x53\x44\xb8\x39\x28\x22\xdc\xdd"
+ "\xfd\x8f\xa9\x88\x7f\xd7\xd5\x3c\xbf\x3d\x97\xb7\x34\x3f\x3e\x5c"
+ "\xdf\xfc\x26\x21\xba\x5c\xde\xdc\x92\xf5\x91\x19\xee\x0d\xfd\x33"
+ "\xd4\x6b\xee\xf6\x91\xae\x39\x33\x8a\xb4\x64\xfd\x8f\xaf\x78\x0e"
+ "\xc6\x8d\x70\x99\x3e\x3c\x07\xd7\xf8\xdc\x4e\xa9\x3b\xd2\x00\xab"
+ "\x52\x09\xe9\x7f\x1d\xe7\xcc\xff\x04\x03\xcf\x04\x67\x43\x9b\x1b"
+ "\xa1\x2d\xfe\xc1\x87\x2c\xc0\x8f\xbe\x95\x6b\x09\xce\xe9\x75\xf0"
+ "\x5e\xfa\x6c\x1c\x7b\x9f\x27\xf3\x78\xa5\x2f\xe1\x76\x86\x5b\xf9"
+ "\xee\xd3\x8b\x80\x1e\x44\x97\x40\xfc\xf1\x3d\x36\x42\x3d\x5e\x99"
+ "\xce\x73\x7d\x06\xc0\xf8\x59\xd8\x9c\x86\xfe\x1d\x04\x3d\x96\x87"
+ "\xe7\x6e\x4f\x20\x2a\xf8\x0f\xe0\x37\x4f\x2f\x82\x7e\xe5\x43\xbf"
+ "\xd6\x62\xbf\x3c\xbd\xe3\xc6\x77\x60\xdd\x79\x28\x14\xd7\x0e\xfa"
+ "\x7c\x7c\x36\x7d\x8e\x92\x5b\x67\x87\xf3\x7c\x66\x3a\x6f\x4c\xb6"
+ "\x91\x40\x18\x8b\x1d\xd0\x6f\xe4\x47\xee\x2f\xc3\xf5\x6b\x7a\x12"
+ "\xb2\x27\xa5\x41\x69\x84\xbe\xdb\xff\xfc\x90\xc5\x90\xf6\x0c\x81"
+ "\xeb\x66\xd4\x59\x2e\x2a\xfe\x77\xcb\x84\x4b\x84\x20\x9e\xc0\xef"
+ "\x9d\x16\x58\xc7\xc6\x43\x79\x23\xbc\x07\xd7\x1c\xea\x8b\x75\xe1"
+ "\xfc\x44\x43\xd2\x69\x12\xa8\x25\xfe\xd9\xf0\x6e\x42\x5d\x35\xd6"
+ "\x35\x29\xfe\xb7\x00\xfb\x00\xe5\x81\x50\xc6\xfb\xd0\x87\x8c\xf0"
+ "\x05\xe1\x56\xca\x9b\x39\xd3\x8b\xb8\x3e\xe1\x56\x8a\x7d\xf0\x9e"
+ "\x1b\xe1\x9d\xa1\x4e\x00\xd4\x09\xa0\xc7\x34\xa2\xca\x81\x73\xd8"
+ "\x0e\x1c\x03\x0c\x8b\x6e\x60\xdb\x2a\x6c\xdb\xc3\x38\xf8\xf2\xc1"
+ "\xd3\x8b\x78\xe0\x6d\x5c\x53\xd5\x69\x8a\x13\x75\x8a\xe2\x51\x81"
+ "\x0a\x9e\xe7\x0b\x06\x64\xac\x49\x23\x01\x3a\x8e\x10\x43\x4f\x6c"
+ "\xa7\xf8\x61\x68\xdf\x17\xc7\xa2\x25\xeb\x7f\x6d\x26\xc5\xff\x14"
+ "\xe2\xf8\x02\x3d\x2d\xea\xc7\xf0\x1d\x8a\x27\xe3\x73\xf0\x1e\x56"
+ "\xff\x7f\x69\xec\x7b\xec\xb3\x3a\xcd\x87\x87\xeb\x43\x7d\x14\xe7"
+ "\x89\x4f\xe8\x03\x61\x2d\x59\xc5\x11\x26\xb2\x68\x32\xde\x6f\x62"
+ "\xf7\x01\x2f\x15\x47\x01\xcd\x4a\xf0\x1c\x96\x3d\xf4\x37\x40\xa4"
+ "\x5b\x45\x28\xf0\x86\x2b\xed\x44\x1e\x01\xbe\x10\x79\x04\xfb\xbb"
+ "\x37\xcd\xa4\xa4\xeb\xb0\xa2\x98\xea\x75\xd9\x40\x43\xfb\xd6\x50"
+ "\xdf\x8d\x30\xb6\xdc\x4d\xa4\x4b\x1d\x5c\xdb\xbf\x19\xe9\xb2\x31"
+ "\x05\x68\xc2\xea\x16\x4b\xfd\xc7\xf2\x7e\x4a\x4f\x0e\x68\xc1\xf6"
+ "\x6e\xee\x9f\x8f\xef\xb3\xf1\x3a\xd0\x31\x84\xb7\x94\x24\x43\xbf"
+ "\x90\x6f\x81\x47\xf6\x24\x58\x95\xe8\xd7\x87\xe7\x0f\x5e\xb5\x2a"
+ "\x37\x36\x12\x94\x2b\xc9\x06\xc0\xe5\x6d\x49\x30\xe6\xd0\x26\x1f"
+ "\x36\x20\x63\x80\x48\xc7\x14\xa0\x5d\x12\xf0\x2e\x8c\xf9\x46\x18"
+ "\xbf\xed\x80\x79\xf8\x7b\x3b\xac\x3f\x1c\xd4\x33\x29\xf6\x17\x40"
+ "\x7b\xaa\x6d\x21\xbc\x79\x47\x08\xdf\x04\x63\x38\xb8\x25\x6b\x7f"
+ "\x86\x38\x86\xd8\xa7\x8d\x70\x7e\x03\x5c\x87\xf1\xb4\x31\x1e\x2a"
+ "\x2e\x17\xdf\xd9\xd3\x78\xae\xdf\x43\x06\x6f\xd8\x43\x7a\xbd\xb9"
+ "\x87\x44\xac\xac\x87\x79\x99\x39\x8c\x3f\x3e\xc3\x06\x6b\x62\x6e"
+ "\xde\x8d\x90\x11\x3a\xfc\xf6\xc4\xad\x79\x48\xff\xfa\x1e\xd2\x17"
+ "\xf7\xc6\x4e\x00\x8a\xe2\x1a\x3e\xa1\xd3\x39\xde\xa8\xbd\x46\xb8"
+ "\xa0\xdc\x3c\xfb\x9a\x27\xbb\xbd\x08\xab\xe3\x51\x8d\x85\xa4\x25"
+ "\xc2\x5a\x7e\xb5\x81\xa4\x59\x78\x73\x65\xc6\x25\x02\xd8\xa3\x61"
+ "\x63\xf7\x8f\xc8\x09\xb1\x84\xe0\x9e\x41\xee\x9f\x1a\xf2\x40\x1c"
+ "\xf1\x4d\x3d\x45\x42\xd3\xeb\xf9\x06\x7b\xee\x84\x8c\xb4\x55\x44"
+ "\xb9\xe7\x6a\x0d\x93\x3d\x15\xff\x08\xfa\x04\xf7\xa7\xb6\x44\x93"
+ "\xd9\x36\x61\x3d\xca\x99\x5e\x9c\x3e\x9f\xf4\xc0\xf7\x09\xa4\xb2"
+ "\xd7\xc7\xbb\x61\xdc\x8a\xbd\xc3\xe7\x8f\x93\x29\x3d\x73\x27\xaa"
+ "\xf6\xcc\xb5\x82\xdc\xea\xa7\x4f\x8f\xe5\x1b\x50\xae\x83\xf5\x85"
+ "\xca\x82\xc6\x06\x1b\xc8\x56\xf3\x60\xfd\x36\x91\x43\x75\x7a\x25"
+ "\xb7\xd9\x4f\xef\xe5\x33\x6a\xe9\xba\x8d\x6b\x29\xf4\x7d\x8a\x86"
+ "\xb0\x75\x10\xd6\xcc\xc0\x44\x94\xa7\xf8\x73\xd8\xff\x83\xf0\xae"
+ "\x7c\xef\x78\x98\xa7\x1f\xc7\xe0\xfa\x39\xa1\xd6\x40\xca\xad\x76"
+ "\xf2\x4e\x23\x1d\x23\x3f\x18\x23\xc0\xd5\x8f\x07\xc2\x38\xf9\xbb"
+ "\xa3\x1b\xd2\x8c\xd3\xe5\xe6\x71\x3e\x8c\x36\x94\x2e\x16\x46\x97"
+ "\x17\x97\x10\x58\x47\x81\x36\x9b\x18\x6d\xb8\xee\xd1\x3a\xa4\x8d"
+ "\x77\xef\xf1\x8f\x02\x4f\xeb\x0b\x3e\x9b\x07\xfe\x40\xbe\xe0\x82"
+ "\xa3\x75\xf8\x6c\xec\x03\x7e\x3f\x43\x3e\x98\xf0\xfa\x39\xbe\x52"
+ "\xdb\x40\x8c\xf0\x3e\x7c\x90\x73\x1f\x6c\x5e\xf6\xe1\x80\xc6\x53"
+ "\x1f\xd6\xf7\x07\xbe\xed\x0f\x7c\xdb\x1f\xf8\xd6\xc4\xf8\xf6\x58"
+ "\x2d\xe3\x5b\x3b\xf4\xab\x15\x64\xf7\x95\x53\x88\x12\xfb\xb5\xeb"
+ "\x34\xc6\xe8\x83\x7e\x36\x48\xbc\x3b\xfe\x32\x8c\x91\xc8\xbf\x3e"
+ "\x4f\x76\xc3\xf1\xa9\xb4\xd4\x90\x74\xe4\xdf\x1b\xee\xf8\xf7\x20"
+ "\x99\x30\x07\x68\xf3\x1a\xf0\xef\x77\x1a\x12\x50\x4f\x7c\x57\x4d"
+ "\x01\xfe\x6d\x70\xc7\xbf\x9f\x9c\x38\x00\xcf\x6c\xc3\xbf\xb1\xce"
+ "\xfc\xfb\x49\xbc\xf7\xfc\xfb\xc9\x60\x07\xff\xbe\x24\xf0\xef\x7c"
+ "\x17\xfe\xad\x77\xe2\x5f\x7c\x6f\xaf\xf9\xf7\x93\x7c\xef\xf8\xf7"
+ "\x13\xb5\x83\x7f\x41\x2f\x79\xe7\x55\x3a\x46\x7e\x30\x46\xc0\xbf"
+ "\x07\x2c\x30\x4e\x6e\xf9\xf7\xa7\xa7\xdf\x21\xc3\xad\xd3\xef\xd0"
+ "\xa6\x8e\xe9\x77\xa8\x9f\xf7\xf4\x3b\x68\xbd\xfb\xf4\x3b\x34\xc3"
+ "\x3b\xfa\x1d\x34\x79\xa6\xdf\xc1\x7d\x3f\x1f\xfa\x1d\xce\xb8\x75"
+ "\xfa\x1d\x9e\xd8\x31\xfd\x0c\x97\xbd\xa7\x9f\xa1\xf8\xee\xd3\xef"
+ "\x70\x2f\xef\xe8\x67\xd0\x7b\xa6\x9f\x21\xd1\x13\xfd\x46\xf6\xe0"
+ "\x78\x0e\xfd\xe6\x42\x9e\x33\xa3\x0c\xc4\xe4\xb5\x4f\xc7\xa3\xce"
+ "\x08\x65\x5f\xb1\x4c\x65\x2a\xd0\xab\x5d\xca\x01\x2e\x65\x95\x4b"
+ "\x39\xd8\xa5\x1c\xea\x52\xee\x25\x96\x81\x5e\x9d\xae\x28\x0e\x7f"
+ "\x02\x3a\x1b\xc8\x38\x9f\x46\x0b\xd7\xc3\x66\xdb\xd5\xa8\xf7\x85"
+ "\xb9\xeb\xfb\xc6\x4c\xde\xaa\x4d\x23\x0f\x35\x2a\x3e\x2d\xa1\xf4"
+ "\x58\xd3\x53\xc3\xa7\x64\x10\xa0\x47\xf5\x8b\xab\x90\xaf\xcc\x84"
+ "\xbf\x19\xea\x07\xe3\xf4\x20\xe8\x9b\x66\xe4\x39\x75\xc2\x21\xbe"
+ "\x4e\xf1\xe9\x5f\xf1\xfd\xfa\x6b\x0d\x84\xf3\x79\x52\xc3\xd3\x98"
+ "\xcd\x7e\xd5\x66\x9f\x27\x7b\x82\x3e\xaa\xcf\x56\x72\xfe\xd9\x99"
+ "\x9c\x7a\x95\x99\x37\x8f\xfb\x01\xd6\x31\x58\xcb\x8c\x4d\x56\xe0"
+ "\x49\xde\x6c\x48\xb8\x0c\xfd\x3d\xd2\xa3\x22\x15\xda\x86\xe7\xc0"
+ "\xb3\xaa\xf8\x60\xbf\x7d\x46\x5b\x15\xe1\xa1\x8d\x4a\x4b\x29\xe8"
+ "\xfe\x35\x44\x68\xb3\x8a\xef\xee\x87\xbe\xa6\x7a\xb7\xfa\x59\xce"
+ "\xb0\x30\x78\xe6\x90\x29\x1a\x5f\xc2\xaf\xf6\x0d\xf6\x8e\x3f\x8e"
+ "\x44\x78\xd4\xfb\x72\x86\x15\xb0\x76\xfd\x6f\xa7\xdd\x1c\xcf\xed"
+ "\x46\x0a\xfd\x55\xdd\x4e\xbb\x4d\xed\xb4\x2b\xf4\x57\x7d\x1b\xed"
+ "\x96\x8c\xf2\xdc\xee\x70\xa1\xbf\x91\xb7\xd3\xae\xc7\xfc\x1f\xd0"
+ "\xae\xd0\xdf\x8c\xdb\x69\xd7\xd2\x0e\xdd\xc2\x6e\x8f\x17\x8e\x8e"
+ "\x69\x8f\x17\x6e\x8f\x0f\x8e\xb6\xf3\xfe\x91\x61\xb7\xc7\x03\x47"
+ "\xcd\xed\xf1\xc0\xed\xd1\xff\xb3\x76\xe9\x7f\x7b\xb4\xff\x2c\xaf"
+ "\x3d\xda\xdf\x1e\xdd\x3f\xf3\xc8\xff\xa8\xcb\xf2\x39\xcf\x19\xf8"
+ "\x90\x78\xc2\xe5\x76\x35\x70\x21\xcf\x7d\xba\x86\x8b\x24\x23\x01"
+ "\xc3\x02\xf3\x48\x50\x24\xb5\x0f\x7d\x9e\xb1\x2a\x9f\x28\x75\x4a"
+ "\x4e\xb9\x3b\xa5\x46\x69\xb4\x0d\x26\xe9\x36\xde\x5e\x90\x64\x55"
+ "\xfc\x12\xce\x1f\x8e\x23\xc4\xb2\x54\x43\x58\x3b\x5d\x0d\xd9\x69"
+ "\x91\x64\x82\x9d\xa0\x3d\xc2\x72\x24\x15\x30\x0c\x70\xcc\x98\x67"
+ "\xc5\x35\x2f\x08\xee\xb3\x01\xff\x42\x1b\x56\xb2\x97\x33\x2b\x22"
+ "\x13\x68\x3d\x33\xe8\x8d\x66\x3e\xf7\xb9\x4f\xf9\x74\x0d\x59\x0b"
+ "\xbf\xe1\x99\x97\x7c\xcc\x44\xb9\x1d\xf4\xc9\x96\xac\xcf\xeb\x4d"
+ "\x8a\x52\x03\xea\x98\xa0\xcb\x36\xa5\xff\x80\x36\xf7\x78\xb2\x06"
+ "\xf4\x5a\xac\xbb\x87\x33\x2b\xfb\x6b\x89\xf2\x88\x19\xf5\xf7\x52"
+ "\xd5\xe1\x44\x42\xda\xb1\xb9\xf8\x72\xc1\xd3\x7c\xf1\x7e\x6c\x07"
+ "\x6d\x99\x1b\x39\x18\xdb\xe0\xe9\xc5\xd8\x5f\x3e\x67\x44\xb2\x21"
+ "\x05\xd7\x85\xd2\xbc\xd1\x4f\xf0\x2d\x02\xce\xf7\x6c\x84\x32\xd5"
+ "\xd9\x33\x79\xc0\xdc\x4e\x85\x7c\xf6\x03\x91\x95\x96\xab\xc4\x90"
+ "\x74\x83\xd4\x29\x4a\xb7\xe0\xb3\x9b\x83\xa7\x11\x4b\xf0\x34\x7f"
+ "\xe8\x43\x8e\xd8\x5f\x7c\x96\x78\x1e\x6d\x14\x42\x1f\xf7\x1d\x4e"
+ "\xf5\xdc\x47\x58\x4b\xba\x4d\x08\xe5\xcd\x38\x86\x86\xb4\xab\xd0"
+ "\x97\x63\x4f\xe0\x38\xf3\x39\x53\xab\x2c\xe9\x9a\x47\x98\xcd\xae"
+ "\x2c\x0a\x6d\x3f\xb0\x0e\x94\x30\x3b\x8c\x5f\x09\xf5\xb3\x01\xbc"
+ "\x07\x9d\x3d\x0f\xe5\x95\x2b\x8a\x32\x9a\xff\x78\x8a\x46\xe9\xa5"
+ "\xce\x53\x46\xd7\x7f\xc3\x23\x38\x0e\xc7\x82\xe0\x79\xcf\xd6\x29"
+ "\xca\x12\x99\x1d\xc2\xaf\x06\x9f\x07\x75\x70\xcd\xa9\xe1\x73\x3a"
+ "\xe9\xb1\x1e\x5c\xcf\x11\xae\x9b\x9c\xae\x9b\xf8\x9c\x69\xa1\xc2"
+ "\xf5\x7d\xc2\xf5\x7a\xa7\xeb\xf5\xda\x47\xd0\x2e\x57\x56\x8b\xef"
+ "\x04\x6b\x99\x01\xd7\x35\xb4\xf9\xd3\x77\xea\xee\x67\x10\xea\x55"
+ "\x37\x29\xca\xae\x35\x03\x5f\xc1\xf5\x5a\xa7\xfb\x6b\x8f\x24\x87"
+ "\x93\x91\xdb\x70\x4c\x8f\xf9\x9b\x7c\xbb\x84\x31\x5b\x4e\x19\xf5"
+ "\x2d\x82\xf6\x8a\x9d\xdb\x83\xf3\xd5\xd0\x66\xb1\x05\x64\x3d\xa0"
+ "\x4f\x13\x3e\xd3\x79\xfc\x63\x13\x12\x16\x27\xa8\xfb\xcc\x53\xcf"
+ "\x8b\x9f\xa3\x7e\x65\xf1\xb2\x45\x89\x43\xfb\xcc\xeb\x42\x88\x13"
+ "\xef\xa8\xf8\xcc\x40\x9e\xcb\x99\x34\xc6\x98\x07\x32\x96\x52\x05"
+ "\xeb\xed\x0d\x92\x03\x74\xb5\x87\xcc\x0d\xb7\xe7\xce\x81\xf9\x33"
+ "\x52\x6d\x48\x19\x01\x63\x7f\x6c\x0b\xb5\xfb\xab\x09\x59\x0f\xd7"
+ "\x0d\x29\xc7\xf0\xdc\x6e\x7a\x6e\x1e\x21\xd4\x5e\x95\xe2\x4f\x4a"
+ "\xd4\x57\xa9\xcd\x0b\xae\x5d\xa0\xf6\xbd\x6b\x44\x69\xcb\xf4\x27"
+ "\x7f\x4f\xab\x52\x1e\xe0\x4c\xca\xbf\x73\x35\x4a\x94\x17\x8e\x84"
+ "\x96\x92\x01\xc9\xfe\x04\xaf\x1f\x4a\x83\xf3\x70\x1d\xaf\xd1\x76"
+ "\x28\xad\x8f\x0f\xc2\x7a\x68\x03\xc3\xdf\xe9\x79\xfc\xf9\x23\xa1"
+ "\x66\xc2\xe4\xd6\x63\x6f\x60\x5f\xd5\x3d\xf1\xfb\xc2\xb1\x0d\xd8"
+ "\x3f\x93\xe2\xd8\x7a\x9f\x7c\xa8\x9f\x44\x02\xa0\xfe\x0a\x6e\xf3"
+ "\xa4\x31\x88\x05\xb6\xac\x63\x91\x7c\x66\xb7\x7e\xdb\xdf\x22\xfe"
+ "\xf9\x6f\xc1\xdc\x7c\x8b\xf8\xb6\x64\x1d\x9f\x67\xf2\x55\xd7\xe3"
+ "\xd8\x42\x33\x01\xcd\x4a\x32\x0c\xce\x25\x9b\x48\x7c\x13\x9e\x83"
+ "\x39\x68\xf1\x84\x2d\xd7\x41\xbe\xb3\x86\xf5\x37\x70\xc1\x93\x06"
+ "\xf3\x30\x6e\x2d\x61\xfd\xcd\x81\x5a\xe0\x2d\x98\x63\x7c\xf7\x49"
+ "\x83\x9b\x14\x15\xeb\x3f\x1b\x48\x48\x1a\xce\xe9\xdc\x91\xea\x0f"
+ "\xae\x5b\xf1\x7b\x5a\xf8\xae\xeb\x66\x28\xcf\x31\x14\x42\xb9\xcc"
+ "\x50\x48\xd4\x2f\xa2\xec\x74\xfc\xf2\xef\xe7\xf1\xb6\x27\xca\x41"
+ "\xce\xac\xff\x1b\x39\x5e\x5d\x4a\x02\x66\x10\x1f\x47\xac\xf7\x44"
+ "\xa2\x9c\x60\x82\xf2\x32\xa2\xac\x04\xbd\x1f\x6d\xf3\x69\xbf\x45"
+ "\xfb\x7c\x05\x41\x9b\x3d\xaf\x5c\x6c\xd9\x7d\xd5\x0a\x18\xd6\xd0"
+ "\x09\x7d\xbe\x39\x55\x7e\x1e\xde\x33\xdb\x22\x7c\xeb\x6a\x16\xbe"
+ "\x75\x35\xd3\x6f\x5d\xa6\xd4\x18\xf6\xad\x0b\xbf\x71\x4d\x88\xf1"
+ "\xe1\xb1\x3d\xfc\xee\xf5\x80\x05\xf8\x60\xa9\xa6\xab\x7d\xa9\xa6"
+ "\x5b\xde\x55\x12\x5c\x69\x6e\x00\x19\xad\x94\x6c\x4d\x22\xc1\x7c"
+ "\x73\xdc\x7d\xe5\x86\x63\x84\x7f\x2b\x4f\xb7\x37\xcd\xd0\xc9\x8e"
+ "\x36\x8a\xe6\xd0\x2e\x81\xab\x15\x68\xe7\xef\xba\x3e\x81\xf4\xdd"
+ "\x71\x95\x84\xcf\xbe\x90\x41\xe3\x3e\x61\x8e\x3e\x5b\xb3\x46\x7d"
+ "\xb3\x59\xf3\x58\x6b\xb3\xe6\x91\x40\x33\xfb\x36\x36\xf3\xb2\x8a"
+ "\xa0\xbf\x2d\x9f\xf5\x8f\xa6\x1d\x68\xa3\xb6\x98\x89\x2d\x28\x3f"
+ "\x0f\x79\x19\x9e\xdd\x0b\xbf\xa7\xa4\xaf\x20\x2a\xee\x5b\x0d\xa9"
+ "\x88\xbb\x4a\x06\x00\xed\xf1\xdb\xc1\xf6\x3a\xf6\xed\xc0\x0e\x3a"
+ "\x0d\x7e\x3f\xb8\xde\xac\x51\xf2\xc1\xd1\xfa\xf1\xf3\xd5\xa4\x75"
+ "\x67\x7f\x83\x31\xf9\x03\x92\xde\xca\x9f\x37\xae\xe5\x08\xda\x95"
+ "\xf9\xac\xe3\x3a\xbe\x7b\xb4\xfe\xa8\xe6\x24\xae\x2b\xe1\x12\x76"
+ "\x54\x4c\xbf\x3d\xec\xa8\xa0\xf2\x33\x7e\x67\xe3\x73\x81\x8e\x57"
+ "\x91\x9e\x40\xd7\xab\x66\xe5\x58\xa0\x5d\x45\xfd\x7b\x40\xb7\x1a"
+ "\x19\xdd\x28\x9d\xa1\xde\xc5\x79\x40\xaf\x0b\x8c\x86\xe5\x16\xa0"
+ "\xdf\x7e\x6c\x63\x5a\xe4\xee\x24\xab\x12\xf4\x26\x65\xb9\xf5\x0c"
+ "\xdd\xb3\x82\x74\xdc\x75\xa3\xb4\x53\x2b\xac\x37\xf8\xbd\xf2\x7a"
+ "\x41\x7f\x53\x6b\xf0\xa4\xd0\x9b\xc1\x93\x34\xed\x7c\xbb\x64\xf4"
+ "\x9c\x4f\xfc\xcb\xeb\x4f\x32\x7a\x2e\x11\xe8\x89\x3e\x6e\xcb\x35"
+ "\x5d\x6d\x2d\x40\xcf\xeb\x40\xcf\x44\x13\x79\x27\x81\x04\x1b\x1b"
+ "\x6a\xf0\xbb\xce\x7d\x2f\x54\x10\x32\xf6\x09\x9e\xab\x30\x9c\xa6"
+ "\x74\xdd\x03\x74\xb5\xe9\x72\xf3\xf0\x7b\xa6\x83\xae\x49\x40\xd7"
+ "\xeb\x40\xd7\xcb\x12\x5d\xed\x2d\x40\xd7\x16\xa0\x6b\x0b\xd0\x55"
+ "\xf8\xe6\x39\x73\x3e\xd0\x15\xbf\x8f\x65\x1d\xd0\xe2\x37\x4f\xfc"
+ "\xb6\x84\x74\x45\xbf\x6a\x6e\xb9\xa6\x17\xfd\xd6\xf9\x8a\x86\xec"
+ "\x98\x4b\xfc\xfb\x59\x89\x22\x7d\x3f\x51\x41\x3f\x55\x8f\xef\x23"
+ "\x4a\x68\x0f\xf8\xbe\x8e\x20\x7d\x8d\xfb\xec\x64\xe5\x74\xf2\x88"
+ "\x6d\x13\xa3\xb3\xd1\xf6\x11\xda\x76\x07\x5f\x5f\xae\x51\x6e\x49"
+ "\x22\x11\x48\xf3\x71\x17\xd4\xe4\x68\x54\x05\x71\xa5\x39\xb7\x79"
+ "\x6a\x15\xd0\x69\x14\xd2\xfd\xf6\xe7\xed\x89\x51\xb7\x3e\x6f\x8d"
+ "\x3b\xff\x6f\xde\xde\xe9\x79\x6b\x1c\xe3\x7e\xde\x9e\x08\xba\xbd"
+ "\x79\x7b\x42\xf5\x7f\xf3\xf6\x5f\x61\xde\x56\xd9\x5c\xe7\xad\x43"
+ "\x6e\x49\x88\x8d\x9f\x33\x7f\xd1\xfc\x45\xaf\xa9\xe7\xae\x48\x8c"
+ "\x5d\xca\xa4\x17\x99\xfc\xa2\xb1\x73\x91\xca\xb7\x61\xbd\x3e\x1e"
+ "\x5a\x43\xf6\xf6\xac\x51\x72\x2f\x87\xfa\xf2\xba\xbf\x99\x38\xdd"
+ "\x47\x71\x6f\x83\x1c\x8e\xf3\x3b\x07\x64\xec\x8b\x8a\x33\x71\x9f"
+ "\x83\x14\x68\x48\x68\x24\xf8\x9b\x7d\xc3\xd5\x6a\x70\x9f\x63\x5e"
+ "\x2e\xdf\x80\xfb\x1c\xcb\x4a\x50\xb6\xf8\x72\xff\xfd\xd1\xa0\x43"
+ "\xbc\x1c\x4a\x5a\x5f\x8e\x56\xbe\x79\x9a\xf8\x07\xd6\x90\x71\x1c"
+ "\xc7\xf3\x86\xb4\x46\x90\xfb\x4e\x17\x19\x5e\x6a\x24\x28\xeb\x5c"
+ "\x54\x9c\x0a\x52\xa7\xac\x86\x63\xcd\x35\x75\x4a\xd6\x39\x38\xd2"
+ "\x3c\x7a\x20\xfb\x37\xf0\xb9\x13\x75\xf6\xbf\x3c\xad\xc2\xef\x9b"
+ "\x3b\x42\xf8\xfa\x3d\xa0\x67\xec\xb9\x61\x55\xae\x49\x40\x3f\xf1"
+ "\x47\x79\xfc\x4e\x89\x63\xb0\xe6\x2a\xe8\x12\x6b\x45\x5b\x51\x4d"
+ "\x6f\x9c\x5f\x20\x5f\xd5\x1f\xbc\x58\xa3\xc4\xf9\x66\x09\xee\xa4"
+ "\x5f\x0b\xef\x01\x7d\x34\x6d\xc9\xe5\x6b\xcd\xdd\x27\x8d\xf1\x55"
+ "\x13\x65\x4b\x56\xb5\x06\x64\x9e\x68\x94\x57\xd6\xc1\xb5\x37\xe0"
+ "\x1a\xfb\x5e\xf8\x75\x2d\xef\xf7\x85\x15\x31\x0e\x78\x5a\x71\x45"
+ "\x51\x4d\xe3\x3c\xad\x67\x3a\x49\x83\x75\xf3\x24\x8d\x6d\x67\x7f"
+ "\x93\x0d\xe5\xc9\x3e\xfd\xcd\xad\x9b\x27\x85\xda\x36\x4f\x1a\x3c"
+ "\xe5\x09\xfa\x5d\x1c\xea\x7f\xf5\x02\xbe\x43\x6b\xce\x48\x35\xd4"
+ "\xb7\x34\x07\xcf\x0d\x6f\xce\x99\x63\x38\x96\x9c\x47\xd4\x93\x10"
+ "\xfb\xaa\xdf\x1d\x9b\xc7\xdb\x9e\x8c\x02\xec\xcb\xfb\x80\x1c\x1f"
+ "\x07\xd8\x17\xdd\x16\xfb\x98\x1f\x81\x9d\x30\x0c\xac\x20\xd0\x56"
+ "\x3d\xce\x21\x94\x51\x77\xc3\x38\xe0\xfc\xc0\x79\x40\xb1\x10\x70"
+ "\x50\x9c\x2b\x38\x8f\x10\xeb\xe8\xbc\x75\x99\x37\x38\x57\xee\x37"
+ "\x13\x15\xce\x15\xc4\x42\x9c\x2b\xe8\x9f\xf3\xb6\x30\x57\x02\x6b"
+ "\x89\xea\x1d\xc0\x41\xa3\xad\x94\xce\x17\x94\x25\xcb\x6d\x4e\x18"
+ "\x88\xdf\x76\x9c\xe6\xca\x06\x71\xae\x88\x18\x08\xf3\xc1\x86\x73"
+ "\x65\xb9\xe6\xb1\x1b\xcb\xa5\xb9\xf2\xf2\x19\x15\xa1\xf8\x98\xf5"
+ "\x0f\x6d\x3e\xcc\x95\x4a\xad\x99\xd8\x45\x0c\x84\xb9\x82\xfb\x87"
+ "\x28\x06\xfe\x11\x30\xb0\x09\x30\xd0\x0c\xe7\x61\x8e\x6c\x5f\x20"
+ "\x60\xa0\x30\x37\x5a\x97\x0b\x18\x78\x59\x4d\x6e\xf4\x41\x0c\x7c"
+ "\xc7\x83\xec\x72\xc6\x05\x03\xbf\xea\x7e\x7b\x18\xf8\x15\x8d\x7f"
+ "\x84\x34\xbc\x01\xf4\x44\x3a\x8e\x0d\xe5\x6d\xe5\x79\x80\x7d\x93"
+ "\x7f\x66\x74\x4b\x70\x4f\xb7\x3d\xc2\xda\xe5\x16\xe3\xdc\xd0\x0d"
+ "\xf8\xbc\xc9\xd6\xd2\x96\x76\x7c\xd6\xfe\x62\x67\x9c\x43\x7c\x43"
+ "\xac\x43\x8c\x43\xbc\xc3\xf9\x81\x38\x87\x18\xf7\x2b\xc0\x7f\x28"
+ "\x37\x54\xc4\xd5\x51\xfc\x4b\xbf\x40\x54\xe9\xa3\xc9\x23\xc6\x62"
+ "\x3b\xe8\x36\xd7\x08\xe2\x9f\xf3\xda\x86\x78\x87\xb4\xdd\x72\x9d"
+ "\xe1\x1d\xae\x71\x88\x6d\x6d\xd6\x38\xa0\x2d\xd0\x84\xe0\x1a\x47"
+ "\xed\x14\x99\xc1\x3d\x76\x74\x63\x3a\x49\x4e\x37\x02\x7a\xf6\xd7"
+ "\xb6\xb6\x7a\x49\x8d\x4a\xd4\x4b\x70\x8e\xe3\x5c\x37\x29\xaa\x23"
+ "\x98\xee\x39\x41\xcb\xf4\xa1\xb3\x3d\x68\x19\x74\x7e\x49\xdf\xaf"
+ "\x99\xc8\xbe\xdd\x83\x7e\xdf\x7d\x44\x32\xbf\xb9\x53\x21\x8e\x2b"
+ "\xbe\xe7\xec\x27\x80\x2f\x37\x4f\x43\x9d\xad\xc9\xb6\x79\x9a\x2f"
+ "\xfc\xf6\x97\x78\xad\x66\xf5\xd1\x64\x42\xa6\x24\x7b\xcb\x6b\x35"
+ "\xd4\x77\x86\xff\x26\xfa\x17\xfc\xcb\xd1\xbe\xdc\x37\xd1\x9d\x80"
+ "\x2f\x42\x17\xdb\x33\xc8\x75\x9d\x56\x9d\x6e\xe3\x1b\xd4\x29\xe4"
+ "\x49\xe8\xd7\xf9\x32\x1b\x21\x65\x16\xc0\xbd\x71\x0b\x81\xc6\x8b"
+ "\xf5\x7b\x39\xb3\xaf\x49\xf1\x25\xda\x2b\x1a\x00\x7b\x7d\x9d\xb1"
+ "\x97\xe1\xec\x97\xf4\x1b\x81\x55\xa7\x0d\xc7\xb6\x26\x94\x92\x40"
+ "\x58\x7f\x7d\x2f\x2a\x4e\xaf\x5e\xb1\x8a\xe0\x7e\xd7\x4e\xf0\x7b"
+ "\xfc\x8d\x6e\xc3\xf4\x70\x7f\x57\xfe\x9b\xc9\x0a\xed\xf3\xe4\x11"
+ "\xfe\xe5\xc9\x0a\xf4\x55\x78\x9f\xd3\x2b\x39\x38\xc7\x7c\x9f\xf4"
+ "\x04\xaf\xaf\xbf\xe1\x4b\xe5\x32\x0e\xea\x54\x5a\xf4\x64\x7d\x92"
+ "\x3f\xc1\xfa\xcc\x9f\x4e\x4f\xb0\xfe\x86\x04\x15\xf5\x75\xa0\xf7"
+ "\xd9\xf4\x04\xef\xb5\xc3\xf9\x3f\x71\x01\x24\x3b\x25\x98\x94\x95"
+ "\x57\xd2\x36\xca\xca\x3f\x23\xd8\x06\xf0\x3f\xfc\x3e\x48\x36\x26"
+ "\x85\x02\x0e\xe8\xe1\xfa\x57\x64\xe3\x95\x5e\x70\xbc\x08\xff\xd7"
+ "\x49\xa3\xe2\x94\xb9\xac\x9c\x23\x81\xab\x87\xf1\xc0\xc7\xbc\x11"
+ "\xf7\x50\xa6\x11\x3f\x58\x47\x5a\x8d\x35\x3a\xd0\x61\x6b\x4c\xb8"
+ "\xc7\x9e\x4f\x7f\xb9\x89\xe3\x5f\xbe\xcc\xa5\xbf\x7c\x05\x9f\x6d"
+ "\xe7\x5f\xfe\x1e\x9f\xbd\x21\x45\x2d\xf8\xd7\xea\xa9\x2f\xe0\xfa"
+ "\xeb\x61\x04\xfb\x8a\xcf\xc5\xe7\x6d\x4c\xd0\x08\xcf\xec\x4b\xfb"
+ "\x86\xcf\xc4\x36\x9d\x9f\x89\xf9\xeb\xd5\x53\xf1\x99\xa7\xe3\xe1"
+ "\x18\x04\xf4\xa8\x47\x3a\xe0\xf3\x39\x3e\xba\x13\x9f\x1e\xed\x43"
+ "\xef\xb1\x36\xb8\xbb\xe7\x5d\xe1\x1e\x13\xd5\xfb\xe1\x9e\x56\x9e"
+ "\xd6\xa7\x6d\xc0\xda\xf8\x09\x9e\x7f\x2a\xda\x40\xda\xd2\xf0\x9b"
+ "\xe9\x6c\xad\xfc\xe6\x09\xb6\x56\x32\x9a\x52\x5e\x79\x39\xba\x13"
+ "\xd0\x4d\x85\xeb\x6a\x9d\xe2\x1b\x85\xa3\x8d\x6f\xa2\x7d\x90\xde"
+ "\xc8\x37\x22\x2f\x21\x1f\x89\x3c\x44\xfb\x69\x26\xc4\x99\x67\xe0"
+ "\xb7\xbf\xd0\xce\x0b\x62\x3b\xd0\x07\x22\xf2\xd1\x53\x70\xbd\x2d"
+ "\x1f\x9d\xe9\x2d\xf1\x51\xed\x61\x6b\x1a\xcf\x23\x1f\x19\x5e\xca"
+ "\xc4\x76\x36\x49\xfd\x99\xac\x40\x1e\xfb\x17\xe3\x2d\x33\xd2\xe9"
+ "\xa9\x54\x12\xcc\xde\xa7\x76\x0e\x7d\x9f\x54\x43\x30\xf6\x55\x7c"
+ "\x0f\xec\x43\x36\xa7\x26\xe2\x7b\x6c\xbc\x11\x06\xed\x5e\x21\xc2"
+ "\x3d\x9b\xb1\x6d\x71\x0c\x80\x66\x44\xbc\x47\xac\x9f\xcd\x69\xa0"
+ "\xdf\x7d\xe9\x3d\x8c\xe7\x2e\xba\xe1\x9f\xda\xf3\xae\x3c\x77\x7f"
+ "\x2a\x01\x01\x18\x64\xab\x97\xae\xe2\x73\xec\xac\x6f\x87\xec\xad"
+ "\xdf\x44\x23\x5d\x95\xec\xfc\x99\xee\x4e\x3c\x21\xb4\x6f\x75\xd3"
+ "\xfe\x99\xe1\xb2\xf6\xa3\xa1\xfd\x64\x68\x1f\x65\xb7\x97\xd0\x66"
+ "\x77\x66\x26\x6d\x27\x99\xb5\x2f\xf2\x2d\xaf\x8b\x08\xd7\xa6\xa0"
+ "\x3f\xea\x59\x5f\x86\xa7\x5f\xd2\x31\xa2\x7e\x50\x4a\x4e\xcf\xb9"
+ "\xf8\x41\x39\xfb\xc9\xed\x4d\x33\x0b\x3e\x50\x67\x68\x6c\x43\xb4"
+ "\x8d\xa1\x0c\xba\x1b\xe4\x37\xc9\x0f\xea\x34\x5e\xbf\x6c\x48\xaa"
+ "\x73\xf2\x83\x3a\x63\xc0\xfa\x26\xc5\xd9\xd0\x16\x25\x51\x42\xb9"
+ "\x9a\x9d\xff\x32\xc6\xf9\xbc\xe4\x67\xc8\xce\xa3\x0f\xb7\x60\x27"
+ "\x6e\x3a\x52\x8c\x76\xc2\xb3\xe1\xa2\x6d\xd6\x83\xee\xeb\x85\x8c"
+ "\xdc\x50\x20\xc9\xc8\x0d\x05\x9e\x65\xe4\xb3\x67\xda\x97\x91\x2f"
+ "\x34\x49\x32\x72\xfd\x78\x36\xef\xeb\x9f\x66\xf3\xfe\xdb\x1f\xa8"
+ "\xdd\x19\xda\xb3\xbd\x17\xaf\xe6\xff\x32\xa0\x08\xf9\x7c\x3b\xc8"
+ "\xbc\x7b\x93\x4a\x95\x7b\x40\xc7\xb2\x83\x7c\xbc\x26\x85\xf8\x62"
+ "\xfc\xb7\x35\x30\x86\x46\x5b\x2d\xa9\xf0\x45\x19\xf9\x0b\x68\xe7"
+ "\xdb\x99\x95\x66\x2b\x81\x75\x2e\x83\x8d\xcb\xb9\xdf\x02\x2d\x7c"
+ "\x8c\x56\x2b\xad\x87\xd7\x60\x5d\xab\x47\x39\xf9\x20\x57\xaa\xdc"
+ "\x96\x82\x32\xf4\x42\xb3\xb3\x0c\xdd\x92\x75\x6e\x9e\x7b\xd9\xf9"
+ "\xdb\x50\xdb\xff\x63\xef\xfd\xe3\xa2\xa8\xf6\xff\xf1\xc3\x2c\x28"
+ "\x1a\xc8\xea\x05\x5b\xbd\x58\x6b\x61\x61\xa1\xa2\x61\x17\x8b\x62"
+ "\x31\x2d\x2b\x15\x34\x4d\x32\x4d\x34\x34\x28\x40\x54\x54\x34\x05"
+ "\x34\xf5\xad\xa6\x08\x06\x5c\x2c\x44\x2c\xbd\x69\xd7\x1f\xd8\x47"
+ "\x6f\xda\xd7\xba\x78\x93\xde\x68\x08\xd8\xd5\x1b\x76\x35\x57\x43"
+ "\x43\x43\x5d\x15\xe5\xd7\xee\xce\xf7\x75\xe6\xcc\x3a\x33\xbb\x33"
+ "\xcb\xce\x2c\x10\xfa\xf6\x8f\x7d\x88\x33\x67\xce\xcc\x79\xbd\x9e"
+ "\xe7\x75\x9e\xcf\xd7\x9c\x73\x66\x05\x9f\x3b\x9f\xdd\x83\xb9\x33"
+ "\xce\xe5\x63\x3e\x60\x26\x9c\x59\x0f\xfc\xd9\x80\x79\x34\xe6\xce"
+ "\x66\x01\x77\x3e\xb7\xdc\x3e\x77\x3e\x7b\xe6\x3e\x77\x6e\x2d\xee"
+ "\x6c\xc9\x1f\x58\x73\xe7\x73\x63\x94\x71\xe7\x73\x11\xf7\xb9\x73"
+ "\x7b\xe3\xce\xe7\x42\x2c\xdc\xd9\xbc\xd4\xbb\x03\xce\xe7\xe7\xdf"
+ "\xe1\xce\xbf\x06\xdb\x72\xe7\x5f\x47\xda\x72\xe7\xb3\xc9\x42\xee"
+ "\x7c\x69\xbc\x2d\x77\xfe\x75\xad\x14\x77\x86\xb8\x55\x83\xb9\x33"
+ "\xc6\x17\xe6\xd1\x98\x3f\x9b\x81\x3f\x13\xac\xfd\xfa\x8d\x32\xee"
+ "\xfc\xeb\x41\xc7\xb8\x73\x55\x2f\x71\xee\xfc\xcb\x69\x69\xee\xfc"
+ "\xcb\x69\x71\xee\x7c\xe1\x1b\x8e\xf3\x5c\x58\xd5\xfe\xb9\xf3\x85"
+ "\x00\x71\x7e\x73\x61\x30\xe1\xce\x55\xbe\x2d\xcf\x9d\xab\x7c\xc5"
+ "\xb9\xf3\x85\xed\x84\x67\x54\x69\x6d\xb9\x33\x5c\x23\xca\x9d\x2f"
+ "\x9c\x61\xaf\xf1\x15\x72\x67\x52\x07\x8c\x99\x0d\xd2\xdc\xf9\x62"
+ "\x36\x19\x43\x2f\x4e\x27\x63\x28\xf1\xa9\x2d\x77\xbe\xf8\x5c\xf3"
+ "\xdc\x99\x60\x88\x79\x4e\x49\xee\x7c\x71\xb9\x2d\x77\xfe\xe5\xb4"
+ "\x38\x77\xae\x9e\xcc\xe1\xe8\x37\x93\x90\x3b\x5f\x3c\x76\x77\x70"
+ "\x67\x49\x6c\x05\x08\xb9\xf3\x6f\x1b\xe5\x73\xe7\xdf\x8e\xcb\xe3"
+ "\xce\x18\x73\x62\xdc\xb9\xba\x97\x35\xe6\x84\xdc\xb9\x7a\x88\x38"
+ "\x77\xae\x1e\x23\xe4\xce\xb8\x7e\x31\xee\x5c\xbd\x58\x50\xbf\x0d"
+ "\x77\xae\xde\x20\xe4\xce\xa4\x1c\xc7\x9d\x2f\xe9\xd8\x5c\xc4\x72"
+ "\xf9\xdc\xf9\x52\x6f\xfb\xdc\xf9\x52\x5f\x21\x77\xae\x36\x12\x8e"
+ "\x7c\x69\x1c\xe1\xce\x97\xd4\xe4\xf8\x2f\xcb\xf8\xc7\x39\xee\x4c"
+ "\x8e\xdb\x72\xe7\x4b\x71\xcd\x70\xe7\x60\xc7\xb9\x73\xed\xa4\x92"
+ "\x3b\xdc\xb9\x76\x92\x85\x3b\x9b\x81\x3f\xe6\x03\x0f\x80\x5f\x35"
+ "\x5e\x0f\x81\xfb\xdc\x45\x97\xcb\xbd\xec\xf3\xe7\xeb\xb9\x1c\x7f"
+ "\xbe\x76\x89\xf4\xfd\x6b\xc7\x48\xdf\xbf\xb6\xf6\x4e\x8e\x19\xb8"
+ "\x33\xe6\xd0\x6c\x8e\xf9\x44\x3a\xfc\x76\x2f\x2c\x61\xf8\xf3\xae"
+ "\x1b\xf5\x14\xe6\xd0\xab\xf0\xdc\x4c\xe0\xd1\xdf\xb1\x1c\xba\xbc"
+ "\x36\x98\xe5\xd1\x57\x1b\x60\xcc\xd0\xa7\xa7\x30\xeb\xb5\xdc\xe1"
+ "\xf9\x2a\x19\xfe\x9c\x54\x8f\x3e\xbb\x1d\x8c\xdf\xc3\x57\x16\xa5"
+ "\x90\x72\xd0\xce\xd3\x1c\xdf\xbe\xbc\x5d\xc0\xb7\x93\x18\xbe\x7d"
+ "\x02\xf3\xed\xef\x4a\x10\xfa\x36\x85\x70\x6e\xcc\xb7\x31\xef\x06"
+ "\xbe\x5d\xb1\xb1\x3b\x5d\x5a\xb7\xe2\x72\xa5\x85\x73\xaf\x85\xff"
+ "\x83\xaf\xf5\x87\x0b\x10\xda\x38\x03\xb9\x82\x4f\x2a\x3f\x80\x7b"
+ "\xe0\xf2\x75\x2b\x7e\x47\x96\x72\x30\x66\x57\x10\x5e\x7e\x75\xbf"
+ "\x59\x90\xd3\xfe\x7d\x14\xd6\x24\xcc\x78\x0c\x76\xc0\x3c\xcb\x92"
+ "\xd3\x36\xf7\xe9\x6f\xa0\x7d\x08\x37\x17\xe6\xb5\xaf\xf4\xb6\x70"
+ "\xf3\x74\x96\x9b\x37\x78\x03\x37\x4f\xb4\x70\xf3\xdf\x17\x28\xe4"
+ "\xe6\x27\x18\x8e\xf7\x4a\xcb\x73\xbc\x0d\xf3\xfe\x78\x6e\x8e\x79"
+ "\x39\xe6\xe2\x98\x97\x63\x9e\x8e\xb9\x39\xe6\xe9\x66\x96\x9b\xe3"
+ "\xbd\x09\xeb\xeb\x9a\xe1\xe6\xc0\xdd\xe8\x0e\xe5\x23\x18\x6e\xee"
+ "\xc2\xe7\xe6\x35\x57\x94\x71\xf3\x9a\x1a\x3e\x37\xc7\xb8\x97\xcb"
+ "\xcd\xb1\xef\x6d\xde\xc5\xe2\x6f\x2f\x80\xff\xb0\xaf\xec\xbe\xbb"
+ "\x63\xfd\x88\xfd\x86\x7d\x86\x7d\x27\xe9\x37\x3e\x37\x07\xdc\x95"
+ "\xd6\xff\x71\xdc\xdc\xdf\x8a\x9b\x63\x2e\x0e\xb6\xab\xc2\x1c\xbd"
+ "\xbc\x08\x6c\x33\x0b\x78\x3a\x70\x74\x6b\x7e\x8e\xfd\xeb\x18\x3f"
+ "\xaf\xa9\xbc\x93\xdb\xa6\xbc\x3b\xe4\xe3\xdc\x76\x37\x0b\x3f\xbf"
+ "\x5a\x69\xcb\xcf\xaf\xd6\xf0\xf8\x79\x85\xde\xe5\x77\xb5\x90\x9b"
+ "\xdf\xf2\xb4\xe5\xe6\xd7\xfa\x4a\x72\xf3\xee\x22\xdc\xdc\xc7\xc2"
+ "\xcd\xaf\xbd\xa1\x8c\x9b\x5f\x8b\x94\xe2\xe6\x75\x6a\x3e\x37\xbf"
+ "\x76\x80\xe3\xe6\x49\x3c\x6e\x7e\xd9\x57\x9a\x9b\x5f\x66\xb8\x20"
+ "\xad\x4e\x0c\xc4\x75\x61\x4e\x85\xdf\x15\x6a\x99\x75\xf5\xd7\x63"
+ "\x31\xaf\xc2\xb9\x0c\x78\x7e\xe0\x56\xd7\x07\xf3\x39\x3a\x7e\x47"
+ "\x68\x8f\x47\x25\xce\x40\x0f\x61\x2e\x85\x79\x94\x85\xf7\xe2\xf2"
+ "\x98\x4f\xb5\x2e\x97\x32\x9c\x10\xe7\x52\x86\x73\x0c\x4f\x66\xd6"
+ "\x63\x5e\xdb\x8f\xc7\xc4\x96\xe5\xea\xd7\xf6\x8b\x73\xf5\xeb\xe3"
+ "\x09\xaf\xb9\x76\x10\xfb\x45\xc8\xd5\xe1\x1a\x51\xae\x7e\x7d\x15"
+ "\x7b\xcd\x7e\x21\x57\x27\x75\xc0\xf8\xbc\x55\x9a\xab\xdf\x08\x23"
+ "\xe3\xf5\x8d\xae\x64\xbc\x66\x7d\x6c\xc3\xd5\xaf\x5f\xe2\x73\x75"
+ "\xec\x7f\x5b\xae\x4e\x30\xc5\x3c\xa7\x24\x57\xbf\x31\xd0\x96\xab"
+ "\x5f\xf6\xc5\x5c\x5d\x1c\x57\xb5\x3e\x42\x5c\xdd\xdc\x57\x6f\xb6"
+ "\x70\xf6\xd5\xb8\xbe\x25\xd6\x9c\xfd\x2e\xc4\xda\x09\x8e\xb7\xe3"
+ "\x36\xdd\x1c\x2f\x8f\xb7\x33\xd7\xac\x92\xc7\xdb\x31\xfe\xc4\x78"
+ "\xfb\xcd\x93\xd6\xf8\x13\xf2\xf6\x9b\xd7\xc5\x79\x7b\x6d\x27\x21"
+ "\x6f\xc7\xf5\x8b\xf1\xf6\xda\xc1\x82\xfa\x6d\x78\x7b\xed\x18\x21"
+ "\x6f\x27\xe5\x38\xde\x5e\x5b\xcf\xe6\x41\x0e\xc9\xe7\xed\xb5\xa7"
+ "\xec\xf3\xf6\xda\x73\x42\xde\x5e\xbb\x97\xf0\xf3\x5b\x1e\xf5\x0c"
+ "\x6f\xaf\x2d\x61\xf9\x7f\x11\xff\x38\xc7\xdb\xc9\xf1\x7a\x3e\x6f"
+ "\x2f\xc2\xbc\xfd\x96\x5f\x33\xbc\x5d\xe7\x30\x6f\xa7\x10\xc7\xdb"
+ "\xe1\x6f\xfb\xbc\xfd\xd6\x49\xfb\xbc\xdd\xc4\xe3\xed\x4d\x2c\x6f"
+ "\x6f\x62\x79\x7b\xd3\x5a\x4b\xde\x1b\xf3\x76\xd3\x23\xf1\x5a\x36"
+ "\xef\x5d\xb2\x6b\x5e\x05\xb5\xdb\x92\xf7\x9e\x0d\x7c\xdc\x80\xdc"
+ "\x57\xcd\x46\x08\x73\x76\x3c\x37\xa4\xb4\x3e\x98\x9d\x1f\xd2\xd8"
+ "\x90\x87\x39\xfb\x45\x28\x53\x05\x9c\x1d\x78\xf7\x67\x8d\xc1\x14"
+ "\xb4\xa7\x52\x50\x76\xde\x9d\xb2\xa7\x2d\x65\x31\x57\x87\xf2\xa5"
+ "\x65\xc0\xdb\xf1\x35\xd0\xff\x4b\x4b\xf1\xbc\x93\x94\xa3\x4c\x59"
+ "\xa8\xa3\x82\xe3\xf8\xb7\xd7\x32\x1c\xdf\xc0\x72\x7c\xb8\x06\xb8"
+ "\x4b\xc9\x1d\x8e\xdf\x58\x41\x65\xdc\x10\x70\xfc\xc3\x75\x2b\x6e"
+ "\xef\xb7\xf0\xf6\x75\x2c\xb7\xcf\x30\x33\xdc\xfe\x04\x70\xfb\x4a"
+ "\xc2\xed\x6f\x9f\xb6\x94\x01\xcc\x9c\x66\xca\x5c\x64\xca\x94\x42"
+ "\x99\x0a\x52\xa6\x8e\xcf\xff\x0f\x13\xfe\xdf\x68\xc5\xff\xeb\x18"
+ "\xfe\x6f\xc9\xcb\x63\x0e\xc3\xcf\xcd\x9b\x7d\xc4\x72\xf3\x0d\x77"
+ "\xf8\xff\x3a\x3e\xff\xbf\x93\x9b\xaf\x93\xc5\xff\xe1\x9e\x25\x16"
+ "\x2e\xd9\x26\x3c\xf2\x86\x38\x8f\x6c\x6f\xfc\xdf\xbc\xa2\x7c\x84"
+ "\x35\xff\xc7\x9a\xc0\x92\x9b\x37\x0b\x72\xf3\xf5\x0a\xf9\x7f\xbd"
+ "\x80\xff\x63\x3f\x2a\xc8\xcd\x97\xb4\x89\x6e\x6b\x47\xb9\xf9\xd6"
+ "\xe7\xff\xf5\x95\xfc\xfc\x3c\xe6\xff\x5c\x7e\xbe\x51\x84\xff\x37"
+ "\xf2\xf9\xff\x61\xbd\x4b\x9d\x90\xff\x53\x2e\x22\xfc\xbf\x49\x21"
+ "\xff\x6f\x52\xc8\xff\x9b\x1c\xe4\xff\x4d\x12\xfc\xff\xd6\x09\x69"
+ "\xfe\x7f\xeb\x04\xae\xdb\x9c\xc1\xf1\x34\xfc\x1e\x54\x3b\x0f\xf3"
+ "\x34\x13\xe1\xff\x84\xb7\x01\x4f\x33\xdd\x25\xfc\xdf\x28\xc1\xc9"
+ "\x8c\x3c\xfe\xdf\xd4\x0a\xfc\xbf\x49\x82\xff\x9b\x58\xfe\xdf\x24"
+ "\xc2\xff\x9b\x24\xf8\xbf\x89\xe5\xff\x4d\x56\xfc\xbf\x89\xe5\xff"
+ "\x26\x3b\xfc\xdf\xcc\xf2\x7f\x33\xcb\xff\x89\x8f\x6d\xf9\xbf\xc9"
+ "\x01\xfe\xdf\xc4\xf2\xff\x26\x3b\xfc\xdf\x2c\xc2\xff\x6f\x9d\xc0"
+ "\xfc\x5f\x14\x57\x14\xf2\x11\xe2\x8a\xb6\xe2\xff\xe6\xbb\x88\xff"
+ "\x4b\x62\xcd\x8a\xff\xd3\x0a\xf8\x3f\x2d\x93\xff\x37\x49\xf0\x7f"
+ "\xfa\xa4\x35\xfe\x84\xfc\x9f\x16\xe7\xff\x14\xb2\xe2\xff\x4d\xe2"
+ "\xfc\x9f\x42\x83\x05\xf5\x5b\xf3\x7f\x0a\x59\xf1\xff\x26\x21\xff"
+ "\xa7\x10\xcb\xff\x6f\x2d\x90\xcd\xff\x29\x64\x9f\xff\x53\x48\xc8"
+ "\xff\x29\x44\xf8\x3f\xe5\x42\xf8\x3f\x85\x58\xfe\x7f\x2b\x99\x7f"
+ "\x9c\xe3\xff\xe4\xb8\x0d\xff\x5f\xed\xd2\x1c\xff\xf7\x30\x6e\xe9"
+ "\xaf\x6f\xf4\xeb\x6f\x68\xcc\x9a\xa6\x7e\xb2\xea\x61\xd3\x9d\xef"
+ "\x12\x44\x01\x1f\x38\x0d\xfc\x60\x2a\xa2\xf0\xda\xfe\x94\xe3\x30"
+ "\xee\x4f\x25\xf3\xfb\xf1\xd8\x8f\xe7\x9f\xec\x5c\x58\xe4\x06\x36"
+ "\x45\x4d\xde\xcf\x17\x19\x03\x86\x22\xcc\x01\x1a\xb6\xf4\x2f\xaa"
+ "\xcf\x1a\xab\x69\xc0\x73\xfb\xe3\x10\x35\xa5\x46\x9c\xd7\xbd\x7f"
+ "\x9a\x36\x03\xe6\xdd\xc3\x27\x11\x4e\x77\x2c\xe6\x02\x83\x63\xcc"
+ "\x0b\x3e\xbe\x0d\x5c\xa0\xb6\x92\xe1\x09\x1e\x51\x5a\x94\x97\x82"
+ "\xbc\x3d\x6b\x90\xda\xd3\xc5\xa5\xc3\xab\x6f\x20\x64\x02\x8e\x30"
+ "\xbc\x2f\x6d\x7e\xa2\x4a\x8b\xf7\xf2\xe9\x42\x78\xc2\x7e\x37\x23"
+ "\xcb\x13\x3e\xbc\x8d\x02\x36\xce\x03\x7e\x70\x8c\xf0\x03\xfc\x0d"
+ "\x83\x06\xc2\x0f\x1e\x6a\xac\xf3\x7f\xe4\xce\xdc\xfe\x3b\x6b\x36"
+ "\xb8\xb9\xfd\x4d\x99\x1c\x37\xc0\xbc\x80\x9e\xe2\x8f\x06\xd4\x93"
+ "\xb9\x16\x0b\xc7\x90\xb9\xfd\x01\x55\x88\xda\xf4\x16\x72\x2f\x8d"
+ "\x3a\x8f\xd7\xdc\x6b\x4a\xab\xb6\xa2\x05\x2f\xa3\x87\x8c\x98\x0b"
+ "\x2c\xa5\x0b\x4b\xab\xb2\x11\xde\xa7\x10\xb8\x62\x70\x2e\xcb\x07"
+ "\x46\x4e\x95\xe0\x03\x30\x06\x63\x4e\xc0\x8c\xbd\x14\x75\xb2\xd8"
+ "\xbf\x18\xc9\xe6\x79\x14\xc5\xc4\x4e\xc9\x75\xbe\x5b\xfa\x1b\x8c"
+ "\x7e\xfd\x8b\x4c\xde\xd3\xd4\x64\xdf\xca\x09\x3a\xf3\xa7\x09\x81"
+ "\x78\x3f\xc2\xbf\x9f\xaf\x76\xc1\x7b\x70\xe3\xef\x51\x9a\x77\x0c"
+ "\x45\x82\xf5\x18\x4d\xac\xcf\x9a\x88\xcf\x30\xbf\x9b\x5c\x83\xe8"
+ "\x29\x46\x0a\xc1\xb9\x2e\xcc\x7a\x8c\x7a\x3d\xe2\xbe\x4b\xa9\x41"
+ "\xf9\x66\xb2\xf7\xa3\xf9\xfd\x98\x4e\x66\xf0\x0b\xbd\x94\x42\x3b"
+ "\x6f\xd7\x33\x1c\x6e\x0d\xfe\x56\xe5\x12\x17\x4f\xcc\xe1\x00\xfb"
+ "\x9d\x37\x35\x82\x8f\xce\x11\x1f\xd1\x4b\xdd\x99\x7f\x8d\xef\xfb"
+ "\x6b\xa1\xee\x47\x9a\x9a\x80\xc3\xb1\xdf\xb5\xb4\xec\x83\xcb\xac"
+ "\xad\x69\xc4\x6b\x6b\x2a\x91\x31\x93\xec\x2d\x08\xb8\x70\xc1\x7b"
+ "\x72\xc0\x33\xf8\x32\x6b\x6a\x9a\xfc\x31\x8e\xd4\xf9\x17\xf1\x3a"
+ "\xa0\x9f\x19\xff\x98\x58\xbf\xe0\xef\x5b\x5a\xb8\x59\xd9\xb6\x93"
+ "\x64\x5d\xa5\x95\x2f\x9a\xb6\x12\x0e\xce\xac\x73\x59\xed\x12\x8c"
+ "\xe7\xc8\x5c\xa5\x5c\xe3\x8b\x93\x80\x13\x25\xc9\xf5\x8b\x6b\x5c"
+ "\xfb\xf0\x8b\xfa\x1e\xf3\x8b\xca\x97\xf8\xa5\x83\x9b\x32\xbf\x74"
+ "\x70\x6d\x1f\x7e\x71\xbf\xc7\xfc\xe2\xba\x97\xf8\xa5\xe3\x46\x65"
+ "\x7e\xe9\x28\xb9\xff\x03\xf6\x0b\xce\x55\x59\xf2\x54\x96\x1c\x15"
+ "\x1e\x4f\x19\xbd\x43\x79\x25\xde\x99\x93\x09\x7f\xf3\xe7\x64\xfe"
+ "\x70\x18\xe7\x6f\x56\xa3\xa3\xc3\xf0\xd8\xea\x3e\xcb\x6e\x6e\x8a"
+ "\xf2\xd8\x7f\x27\x37\x45\x3d\xd0\x83\xe1\xa8\x54\x67\x13\xc3\x51"
+ "\xa9\xce\xcc\xbc\xed\xc5\x67\x10\x65\x7c\x6c\xa0\x7a\x57\x42\x11"
+ "\x85\xd7\x2f\xed\xba\x5a\x4f\xad\xb9\x01\x9c\x93\x7a\x98\xc6\x39"
+ "\xa9\xb5\xb3\xf1\x5c\xcc\x5a\x04\x7c\xef\xe1\xcb\x54\xe7\xc1\x78"
+ "\x6f\xb4\x6f\xaf\x16\x31\xb9\x20\xfa\x91\x84\xc0\x1d\x3d\x0d\x2e"
+ "\x78\x1c\xdd\x95\x50\x4f\x59\xb0\x64\x59\xd7\x08\xf6\x34\xdc\xdc"
+ "\xda\x5f\x8f\xe7\x4d\x36\xfa\x8c\xd5\x98\x7c\xa6\xa9\x8d\x3b\x87"
+ "\x22\x31\x7c\x31\xeb\x25\x61\x0c\xc5\xeb\x1b\xdf\x4a\xe4\x70\x66"
+ "\x7e\x9f\xe0\xab\x0c\x38\x3b\xfe\xfe\x8f\x17\x8c\x9d\x74\x53\x4c"
+ "\xa7\x37\xb7\x83\xef\x59\x8c\xc1\xf8\x2d\x8d\xb1\x0d\x42\x8c\xdd"
+ "\x64\x31\x06\x58\xbb\x83\x31\xde\x7a\xc7\x44\x82\x31\xfd\x1d\x8c"
+ "\x31\x63\xe7\xfb\xfe\xbe\x18\x67\x16\x8c\xe1\x71\x93\x60\xec\xbc"
+ "\x24\xc6\x7e\x38\x2d\x8e\x31\x63\x1f\x3e\xc6\x3a\x8c\x24\x18\xeb"
+ "\xec\x52\x3c\x09\x30\x36\x49\x2e\xc6\x98\xa5\x71\x3c\xed\xac\xee"
+ "\x65\xa3\x9d\xa9\xce\xd3\xad\xb5\xb3\x45\x2b\xdf\xf4\x99\x80\x6e"
+ "\x82\x5e\xae\xb5\xe8\x65\xaa\xf3\x2a\x45\x7a\x99\xea\xbc\xd2\xa1"
+ "\xb9\x6c\x54\xe7\x4b\x47\x17\x21\x74\x14\xfa\x53\x79\x04\x99\xcb"
+ "\xf6\x77\xac\x97\x29\xf7\x24\x8c\x43\x51\xbd\xcc\x9e\xb3\x99\x83"
+ "\x44\x79\xac\xba\x33\x07\x89\xf2\x18\xdf\xb0\x5e\x7c\x2e\xdb\x17"
+ "\x29\xb9\x3c\xed\x92\x2b\x32\xdf\x28\xd7\x6a\xbe\x51\xae\x88\x6e"
+ "\xc9\x45\xf8\x5a\xbe\x6e\x39\x1a\x41\x74\xcb\xd1\x08\xac\x5b\x72"
+ "\x19\xbe\x77\x34\xc2\xa2\x5b\x72\xe1\x3c\xd1\x2d\x47\x23\x2e\xc2"
+ "\x0f\x74\x0b\xf5\x40\xfd\xd1\x08\x11\xdd\x42\x79\x30\x5a\x13\x6c"
+ "\x58\x2d\x3d\x97\x2d\x97\xa7\x8f\x73\x79\xfa\x38\x97\xd5\xc7\xb9"
+ "\x8c\x3e\x26\xf7\x0c\x60\x9e\x0d\xdf\x13\xd7\xc9\xbf\x27\xa7\x1f"
+ "\x3c\xe6\x32\xfa\x81\xea\x5c\x83\xfd\x20\xd0\xc7\xf8\x9a\x64\x11"
+ "\x7d\x4c\x79\x6c\x67\xaf\xa9\xb6\xe8\xe3\x46\x52\x9e\xa9\x03\x62"
+ "\x4d\xb1\xa4\x3e\xa6\x3c\xa7\x92\xd8\xe3\x49\xe6\x83\xb3\x3e\xb5"
+ "\xd1\xc7\x94\x27\x5f\xff\x88\xcf\x65\x63\x31\xc4\x3c\x67\xa2\x84"
+ "\x3e\xa6\x3c\xc7\xd8\xe8\x63\xca\x3d\x51\x74\x2e\x1b\xe5\xd5\x97"
+ "\xc3\x51\x97\x23\x82\xb9\x6c\x94\xe7\x06\xbe\x2e\xc6\x18\xbb\xbb"
+ "\xb0\xf5\x40\xbd\x60\x2e\x1b\xd5\x25\x56\x5c\x13\xe7\xf2\x34\x71"
+ "\x2e\xa3\x89\x8f\x46\xb0\x73\xd9\xa8\x2e\x1b\x71\xdd\xb6\x9a\x38"
+ "\xf7\x4e\x79\x8b\x26\xc6\xd7\x10\xcc\x89\x68\x62\xaa\xcb\x25\x6b"
+ "\xcc\x09\x34\x31\xe5\xe5\x66\xd1\xc4\x8d\x6f\xf2\x35\xb1\x57\x2f"
+ "\x81\x26\x66\xea\x17\xd3\xc4\x5e\x2f\x0b\xea\xb7\xd1\xc4\x5e\xd3"
+ "\x2d\x9a\x18\xd7\x6f\xc1\x2d\xa7\x89\xd5\xee\x24\x86\xba\xf7\x90"
+ "\xaf\x89\xbd\x98\xbc\xce\xce\x8f\xc9\x3b\x27\xa1\x1e\xf6\xba\x2e"
+ "\xd4\xc3\x5e\x87\x89\xee\x55\xfb\x32\xf3\xd8\x28\xaf\x4a\x72\xdc"
+ "\x5d\xc3\x3f\x7e\x47\x0f\xb3\xc7\xf1\x3c\x36\x66\xfe\xda\x6a\x75"
+ "\x80\x3c\x1d\xfc\x60\x3b\xd4\xc1\x1a\x3b\x3a\x58\x73\x8f\xe9\xe0"
+ "\xae\x67\x94\xe9\xe0\xae\xa7\xdb\x07\xaf\xbf\xd7\xf4\x96\x5a\x47"
+ "\x38\xd7\x9f\xe6\x2a\xe3\xf5\x7f\x4a\x6a\x1f\x7e\xb9\xd7\xf4\x56"
+ "\x37\x3f\xe2\x17\x1f\x4f\x65\x7e\xf1\xf1\x50\xae\xb7\x7c\xf5\x9c"
+ "\xde\xf2\xd5\x4b\xeb\x2d\x9f\x73\xf6\xf5\x56\x4f\x7f\x4e\x6f\x69"
+ "\x56\x11\xce\xa3\x89\x27\x9c\x47\xd3\x4f\xbe\xde\x7a\x70\xeb\x7d"
+ "\xbd\xd5\x92\x7a\xeb\x4f\x07\x09\xc6\x1e\x9c\xa5\x4c\x6f\x3d\x98"
+ "\x28\xd4\x5b\xbd\xd6\xda\xea\xad\x07\x4f\x3a\xae\xb7\x1e\x6c\x50"
+ "\xa6\xb7\x1e\xac\x77\x4c\x6f\x69\xde\x10\xd7\x5b\x3e\x55\xd2\x7a"
+ "\x8b\x9c\xb3\xe5\xc9\x3d\x1a\x38\x9e\xdc\xa3\xb8\xfd\xeb\xad\x1e"
+ "\x31\xe2\x9c\xb8\xc7\x2c\xa2\xb7\x34\x91\x2d\xaf\xb7\x34\x91\xe2"
+ "\x7a\xab\xc7\x05\xc2\x4d\x35\x93\x6c\xf5\x16\x5c\x23\xaa\xb7\x7a"
+ "\xf6\x60\xaf\x89\x14\xea\x2d\x52\x07\xc4\x9a\xc1\xd2\x7a\xab\xe7"
+ "\x71\x12\x7b\x7a\x6e\x26\xb1\x87\xf8\xd4\x56\x6f\xf5\x5c\xd0\xbc"
+ "\xde\x22\x18\x62\x9e\x53\x52\x6f\xf5\x3c\x64\xab\xb7\x7c\xf4\xe2"
+ "\x7a\xcb\x77\x03\x87\x23\xdf\x21\x42\xbd\xf5\xe7\x4e\x77\x87\xde"
+ "\x92\xc4\x56\x8c\x50\x6f\xfd\xf9\x94\x7c\xbd\xe5\xeb\x29\x4f\x6f"
+ "\x61\xcc\x89\xe9\x2d\xdf\x37\xac\x31\x27\xd4\x5b\xbe\x73\xc5\xf5"
+ "\x96\xef\x5a\xa1\xde\xc2\xf5\x8b\xe9\x2d\xdf\x03\x82\xfa\x6d\xf4"
+ "\x96\xef\x49\xa1\xde\x22\xe5\x38\xbd\xd5\x2b\x99\xc4\x50\x9f\x55"
+ "\xf2\xf5\x56\xaf\x37\xa4\xf5\x56\xaf\xa9\x42\xbd\xd5\x2b\x88\xe8"
+ "\xaa\x5e\x6b\x88\xde\xea\x35\x82\x1c\xf7\x59\xc9\x3f\xce\xe9\x2d"
+ "\x72\x9c\xd3\x5b\xbd\xf2\xe4\xe9\x2d\xaf\x76\xa8\xb7\xd4\x76\xf4"
+ "\x96\xfa\x1e\xd3\x5b\x0f\x8f\x52\xa6\xb7\x1e\x1e\x79\x9f\xd7\xb7"
+ "\x06\xaf\xef\x55\x48\x38\x97\xf6\x82\x32\x5e\xaf\xad\x52\xce\xeb"
+ "\xfd\xf7\x73\xbc\xde\x7f\xbf\x34\xaf\xef\x6d\x7f\xff\x37\xea\x31"
+ "\xc4\xf1\x7a\x3f\x36\x97\xe9\x37\x9c\x8c\xad\x7e\x6e\xf2\x79\xfd"
+ "\xa3\x8b\xef\xf3\xfa\x96\xe4\xf5\x0f\x67\x11\x8c\x3d\xfa\xb2\x32"
+ "\x5e\xff\xe8\x08\x21\xaf\xef\x3b\xdd\x96\xd7\x3f\xba\xd3\x71\x5e"
+ "\xff\xe8\x71\x65\xbc\xfe\xd1\x0a\xc7\x78\xbd\xdf\x40\x71\x5e\xdf"
+ "\xfb\xa0\x34\xaf\x27\xe7\x6c\xf9\x58\x9f\xe3\x1c\x1f\xeb\xb3\xb1"
+ "\xfd\xf3\xfa\x3e\x3a\x71\xee\xd5\xe7\x65\xc2\xeb\xfd\x02\x5b\x9e"
+ "\xd7\xfb\x05\x8a\xf3\xfa\x3e\xdf\x10\x0e\xe4\x17\x64\xcb\xeb\xe1"
+ "\x1a\x51\x5e\xdf\xe7\x3a\x7b\x4d\xa0\x90\xd7\x93\x3a\x20\xd6\x78"
+ "\x4a\xf3\xfa\xc7\xb6\x93\xd8\xf3\xd8\x02\x12\x7b\x88\x4f\x6d\x79"
+ "\xfd\x63\x63\x9a\xe7\xf5\x04\x43\xcc\x73\x4a\xf2\xfa\xc7\x36\xd8"
+ "\xf2\xfa\xde\xe2\xfb\x69\x51\xfe\xb3\x38\x1c\xf9\x77\x15\xf2\xfa"
+ "\xc7\xce\xdd\x1d\xbc\x5e\x12\x5b\x3a\x21\xaf\x7f\x7c\x8f\x7c\x5e"
+ "\xff\xf8\x05\x79\xbc\x1e\x63\x4e\x8c\xd7\xfb\x0f\xb4\xc6\x9c\x90"
+ "\xd7\xfb\x8f\x12\xe7\xf5\xfe\xd3\x85\xbc\x1e\xd7\x2f\xc6\xeb\xfd"
+ "\x33\x05\xf5\xdb\xf0\x7a\xff\x9d\x42\x5e\x4f\xca\x71\xbc\xbe\x6f"
+ "\x04\x89\xa1\xbd\xe5\xef\xa7\x45\xf5\x1d\x28\xcd\xeb\xfb\x0e\x11"
+ "\xf2\xfa\xbe\x1e\x84\xbf\xf7\x8d\x26\xbc\xbe\xaf\x96\x1c\xef\x1d"
+ "\xc5\x3f\xce\xf1\x7a\x72\x9c\xe3\xf5\x7d\x93\xe4\xf1\xfa\x8e\xed"
+ "\x90\xd7\xbb\xdb\xe1\xf5\xee\xf7\x18\xaf\x7f\xb2\x8f\x32\x5e\xff"
+ "\xa4\x9f\x72\xfe\x38\xa8\x9e\xe3\x8f\x83\xea\xa5\xf9\xe3\x93\x0d"
+ "\xf6\xf9\x63\xa0\x8e\xe3\x8f\xfd\x37\x93\x18\xde\x7f\x39\x89\xe1"
+ "\xfd\x87\xcb\xe7\x8f\xfd\xbe\xb9\xcf\x1f\x5b\x92\x3f\xf6\x5d\x49"
+ "\xf8\x63\xbf\x55\xca\xf8\x63\xbf\x95\x42\xfe\xf8\xd4\x56\x5b\xfe"
+ "\xd8\xef\x8a\xe3\xfc\xb1\x7f\x57\x65\xfc\xb1\xbf\xda\x31\xfe\xd8"
+ "\x7f\x96\x38\x7f\x7c\xd2\x28\xcd\x1f\xc9\x39\xdb\x71\x3f\xb0\x2b"
+ "\x37\xee\x0f\x38\xd3\xfe\xf9\xe3\x80\x34\xf1\x31\x7e\xc0\x2a\xc2"
+ "\x1f\xfb\x27\xb6\x3c\x7f\xec\x9f\x28\xce\x1f\x07\x98\xc8\x58\xdb"
+ "\x3f\xc9\x96\x3f\xc2\x35\xa2\xfc\x31\x90\x1d\xff\xfb\x27\x0a\xf9"
+ "\x23\xa9\x03\x62\xcd\x28\x69\xfe\x18\x48\xd6\xa7\x52\x81\x07\x48"
+ "\xec\x21\x3e\xb5\xe5\x8f\x81\x99\xcd\xf3\x47\x82\x21\xe6\x39\x25"
+ "\xf9\x63\xe0\x29\x5b\xfe\xf8\x64\xbd\x38\x7f\x1c\xb4\x87\xc3\xd1"
+ "\xa0\x31\x42\xfe\x38\xb0\xf7\xdd\xc1\x1f\x25\xb1\x95\x26\xe4\x8f"
+ "\x03\xaf\xcb\xe7\x8f\x83\xfa\xc8\xe3\x8f\x18\x73\x62\xfc\x71\xd0"
+ "\x2c\x6b\xcc\x09\xf9\xe3\xa0\xb5\xe2\xfc\x71\xd0\x56\x21\x7f\xc4"
+ "\xf5\x8b\xf1\xc7\x41\xc7\x05\xf5\xdb\xf0\xc7\x41\x57\x84\xfc\x91"
+ "\x94\xe3\xf8\xe3\x53\x19\x24\x86\x3e\xb9\x59\x3e\x7f\x7c\x6a\x96"
+ "\x34\x7f\x7c\x6a\x81\x90\x3f\x3e\x35\x92\xf0\xc4\xa7\xb6\x10\xfe"
+ "\xf8\x54\x14\x39\xfe\x64\x01\xff\x38\xc7\x1f\xc9\x71\x8e\x3f\x3e"
+ "\xb5\xb7\x39\xfe\x68\x9f\x5b\x3c\xcb\x7d\x9b\x00\xfe\xe6\x73\x8b"
+ "\x23\x02\x6e\x11\x34\xde\x3e\xb7\x08\xe6\xbe\x4d\x40\xfd\x85\x7c"
+ "\x9b\x80\x7a\x9a\x7c\x9b\x80\x7a\x9a\xf9\x36\xc1\xe2\x51\xc0\x01"
+ "\x80\x5b\xec\xbc\x5c\x48\xb8\xc5\xe5\x7a\xea\xc3\xab\x2c\xb7\xa8"
+ "\x41\xee\x6b\x12\x58\x6e\xf1\x16\xe6\x16\x4f\xf7\xc3\xdc\xc2\x23"
+ "\x0f\xf8\x6d\x15\xcb\x77\x13\x81\xef\x56\xc1\xff\xa1\xef\x7c\x0b"
+ "\x75\x94\x01\x27\xcd\xc0\xd7\xe3\xef\x63\x40\x5d\xcc\x3a\x59\x66"
+ "\x0d\xad\xde\x4d\x3b\x8d\xac\xbf\xc5\xdf\x37\x91\xfa\xb6\x89\xe5"
+ "\xbb\x26\x8b\xaa\x68\x33\xfe\x8e\x49\x78\x34\xef\xfb\x26\xf8\xbb"
+ "\xa5\x86\x6a\x84\xbf\x71\x92\x37\x1b\x79\x7f\x82\xb9\x46\x35\x52"
+ "\x77\x59\xe2\xd2\x05\x7f\xdf\xa4\x4b\x2d\xe1\xb4\x3b\xcd\x25\x84"
+ "\xd3\xce\xd1\x74\x06\x9e\x14\x90\x7f\x83\xe3\x18\x1f\x61\x7e\x31"
+ "\xc7\x5f\x5b\x3b\xc7\xff\xa1\x9b\x37\x81\xd3\x1a\xac\xbf\x7f\x71"
+ "\x60\x3f\xfe\xce\x02\xfe\xce\xa4\x91\xe5\xb4\xf4\x3b\xfe\x68\xd3"
+ "\x0c\xe0\x3d\x35\xc8\xa5\x3f\xfe\xf6\xc5\x31\xa4\x7e\xdc\x17\xe2"
+ "\xfe\x4d\x7f\x5f\xfe\x5e\x96\x38\x2f\x6a\xbe\xe9\x8f\x4a\xa3\x7e"
+ "\x66\xd6\xcc\x1a\x2d\x6b\x66\x6f\xa0\x60\xc3\x1c\x7f\xea\xe3\xd9"
+ "\x3c\x4e\xeb\x83\x39\xed\x33\x76\x38\xed\xe0\x06\x65\x9c\x76\x70"
+ "\xbd\x90\x6f\x84\xf8\xd8\xf2\x8d\xa7\x27\x3b\xce\x37\x9e\x56\xb6"
+ "\xff\x3b\xf5\x74\x9a\x63\x7c\xe3\xe9\x73\xd6\x7c\x63\x3b\xc3\x37"
+ "\x82\x22\x31\x36\xc5\xf9\x06\x39\x67\x3b\x4e\x04\x73\xfb\xbf\x53"
+ "\xc1\xa3\xda\x3f\xdf\xf8\x8b\x41\x7c\x4c\xf8\x0b\xd9\xff\x9d\x7a"
+ "\xda\xce\xfe\xef\x4a\xf9\xc6\xd3\x7a\x71\xbe\x11\x4c\xf6\x7f\xa7"
+ "\x9e\xae\xb2\xe5\x1b\x70\x8d\x28\xdf\x08\xde\xcc\x5e\xa3\x17\xf2"
+ "\x0d\x52\x07\xc4\x1f\xe9\xfd\xdf\xa9\x21\x64\xff\x77\x6a\x08\xd9"
+ "\xff\x9d\xf5\xa9\x2d\xdf\x18\xd2\xfc\xfe\xef\x2c\x86\x98\xe7\x94"
+ "\xe4\x1b\x43\x6c\xf7\x7f\xa7\x82\xc6\x89\xf3\x8d\x67\xb9\xfd\xdf"
+ "\xa9\x67\x84\xfb\xbf\x53\x43\x32\xef\x0e\xbe\x21\x89\x2d\xe1\xfe"
+ "\xef\xd4\x33\x12\xfb\xbf\xdb\xe3\x1b\xcf\x64\xcb\xe3\x1b\x18\x73"
+ "\x62\x7c\xe3\x99\x73\xd6\x98\x13\xf2\x8d\x67\x4c\xe2\x7c\xe3\x59"
+ "\xe1\xfe\xef\x4c\xfd\x62\x7c\xe3\xd9\x30\x41\xfd\x36\x7c\xe3\xd9"
+ "\xc9\x42\xbe\x41\xca\x71\x7c\x23\x04\xb1\x9a\xcd\x24\x9f\x6f\x3c"
+ "\x7b\x4e\x9a\x6f\x3c\x7b\x49\xc8\x37\x9e\x3d\x48\x78\x45\x88\x37"
+ "\xe1\x1b\xcf\x56\xb0\x3c\xc4\xc8\x3f\xce\xf1\x0d\x72\x9c\xe3\x1b"
+ "\x21\xf7\xd7\xbf\xde\x55\xf9\xaa\xe7\x14\xae\x7f\x7d\xee\xfe\xfa"
+ "\xd7\x56\x79\x0f\x1d\xc2\xae\x7f\x0d\x55\xb8\xfe\x35\xf4\xfe\xfa"
+ "\xd7\x56\xf1\xcb\xf3\xec\xfa\xd7\x30\x85\xeb\x5f\xc3\xee\xaf\x7f"
+ "\x6d\x15\xbf\x84\xb2\xeb\x5f\x87\x2a\x5c\xff\x3a\xd4\x89\xf5\xaf"
+ "\xaf\xac\xe1\xb4\xf1\x2b\x6b\xa4\xb5\xf1\x0b\xcd\xac\x7f\x7d\xe9"
+ "\x04\xa7\x8d\x5f\x1c\x4c\xb8\xe8\x8b\x3d\x08\x17\x1d\xce\xe4\xa6"
+ "\x52\xb0\x36\xfe\x34\x5e\xbb\x7b\xf6\x7e\x0a\xef\xd1\x86\xbf\x19"
+ "\xb9\x76\x21\x72\x35\x62\x6d\x0c\x3e\x58\xcb\x7c\x8b\xe4\x30\x4a"
+ "\x7c\x17\x6b\xe3\xe1\x63\xca\xaa\x78\xdf\x21\xa1\x5e\x38\xc4\xed"
+ "\x8b\x7c\x18\xe1\x73\xdf\xde\xd8\x4f\x65\x34\x5a\xe5\xe4\x67\xd7"
+ "\x53\xda\x04\x61\x4e\xde\x94\x3d\x4d\x8d\x73\xf2\x0d\xec\x77\x45"
+ "\x98\xbc\x7c\x3f\xfb\x39\xf9\x8d\x8d\x30\x76\x8a\xe4\xe5\x71\x4e"
+ "\x1e\xc6\xc8\x7b\x2c\x27\x1f\xc6\xae\x8d\x1d\xde\x4b\x59\x4e\x7e"
+ "\xb8\xaf\x50\x23\xbf\x3a\xc4\x56\x23\x0f\x5f\xe2\xb8\x46\x1e\xbe"
+ "\x55\x99\x46\x1e\xbe\xc5\x31\x8d\xfc\xa2\x9b\xb8\x46\x7e\x21\x29"
+ "\x45\x52\x23\x93\x73\xb6\xda\xe6\xa5\xad\x9c\xb6\x79\x69\x56\xfb"
+ "\xd7\xc8\x2f\x79\x8b\xeb\x98\x97\x7a\x11\x8d\xfc\xa2\x6b\xcb\x6b"
+ "\xe4\x17\x5d\xc5\x35\xf2\x4b\xec\xfb\xef\x17\xdd\x6d\x35\x32\x5c"
+ "\x23\xaa\x91\x5f\x2a\x66\xaf\x71\x15\x6a\x64\x52\x07\xc4\xa1\x73"
+ "\xd2\x1a\x79\xc4\x62\x12\x97\x46\x8c\x22\x71\x89\xf8\xd4\x56\x23"
+ "\x8f\xe8\xd3\xbc\x46\x26\x18\x62\x9e\x53\x52\x23\x8f\x88\xb7\xd5"
+ "\xc8\x2f\x48\xac\x8d\x7d\x65\x38\x87\xa3\x97\x2f\x08\x35\xf2\x88"
+ "\x7d\x77\x87\x46\x96\xc4\x96\xb7\x50\x23\xbf\xbc\x5c\xbe\x46\x7e"
+ "\xf9\x80\x3c\x8d\x8c\x31\x27\xa6\x91\x5f\x71\xb3\xc6\x9c\x50\x23"
+ "\xbf\xd2\x5b\x5c\x23\xbf\x32\x44\xa8\x91\x71\xfd\x62\x1a\xf9\x95"
+ "\xe9\x82\xfa\x6d\x34\xf2\x2b\x4b\x84\x1a\x99\x94\xe3\x34\xf2\xab"
+ "\x7e\xec\x78\xa7\x60\x6d\xec\xab\x6e\xd2\x1a\xf9\x55\x4f\xa1\x46"
+ "\x7e\x45\x4f\xb4\xf0\xab\xc1\x44\x23\xbf\x52\x4b\x8e\xbf\xa0\xe1"
+ "\x1f\xe7\x34\xf2\x0b\x56\x6b\x63\x5f\x1d\x71\x7f\x6d\xec\xdd\xa4"
+ "\x91\x47\x2a\xcc\x7f\x8f\xac\x6f\x1f\x9c\xff\x5e\xd3\x62\xaf\x4e"
+ "\x22\x9c\x6b\x74\xa6\x32\xce\x3f\x3a\xa3\x7d\xf8\xe5\x5e\xd3\x62"
+ "\xa3\xd8\x35\xcb\x11\x7d\x95\xf9\x25\xc2\x5f\xb9\x16\x8b\xd4\x70"
+ "\x5a\x2c\x52\x23\xad\xc5\x22\x4c\xf6\xb5\xd8\xf8\x28\x4e\x8b\xbd"
+ "\x76\x88\x70\x9e\xd7\xb6\x12\xce\xf3\xda\x74\xf9\x5a\x6c\xec\x19"
+ "\xa1\x16\x1b\x33\xea\xbe\x16\x6b\x2d\x2d\x36\xba\x92\xe0\x6f\xec"
+ "\x76\x65\x5a\x6c\xec\x36\xa1\x16\x8b\x2c\xb6\xd5\x62\xaf\x79\x3a"
+ "\xae\xc5\x5e\x1b\xa8\x4c\x8b\xbd\x16\xe8\x98\x16\x7b\x2d\x53\x5c"
+ "\x8b\x8d\x41\xd2\x5a\x8c\x9c\xb3\xe5\xd0\xe3\x07\x72\x1c\x7a\x9c"
+ "\xa9\xfd\x6b\xb1\x71\x05\xe2\x7c\x79\xdc\x76\xa2\xc5\x5e\xcb\x68"
+ "\x79\x2d\xf6\x5a\x86\xb8\x16\x1b\x4f\xbe\x7f\x46\xbd\x96\x65\xab"
+ "\xc5\xe0\x1a\x51\x2d\x36\x7e\x0c\x7b\x4d\x86\x50\x8b\x91\x3a\x20"
+ "\x0e\xc5\x4b\x6b\xb1\xd7\x3b\x91\xb8\x34\xfe\x14\x89\x4b\xc4\xa7"
+ "\xb6\x5a\x6c\xfc\x9e\xe6\xb5\x18\xc1\x10\xf3\x9c\x92\x5a\x6c\x7c"
+ "\x83\xad\x16\x8b\x30\x8a\x6b\xb1\x09\xbc\x75\x1a\x13\x66\x09\xb5"
+ "\xd8\xeb\x61\x77\x87\x16\x93\xc4\x56\x81\x50\x8b\x4d\xe8\x2a\x5f"
+ "\x8b\x4d\x18\x2e\x4f\x8b\x61\xcc\x89\x69\xb1\x09\x99\xd6\x98\x13"
+ "\x6a\xb1\x09\x3b\xc5\xb5\xd8\x84\x62\xa1\x16\xc3\xf5\x8b\x69\xb1"
+ "\x09\xd7\x05\xf5\xdb\x68\xb1\x48\x4f\xa1\x16\x23\xe5\x38\x2d\x16"
+ "\x59\x48\x62\x68\xc4\x56\xf9\x5a\x2c\x32\x53\x5a\x8b\x45\x6e\x10"
+ "\x6a\xb1\xc8\x38\xa2\xb9\x22\x0f\x13\x2d\x16\x99\x46\x8e\x47\x6c"
+ "\xe1\x1f\xe7\xb4\x18\x39\xce\x69\xb1\xc8\x13\xf7\xd7\xcd\xde\x4d"
+ "\x5a\x6c\xe2\x72\x65\x5a\x6c\xe2\xb2\xfb\x9c\xbf\x35\x38\x7f\x64"
+ "\x35\xe1\x5c\x93\x7a\x29\xe3\xfc\x93\x7c\x95\x73\xfe\x68\x0f\x8e"
+ "\xf3\x47\x7b\x48\x73\xfe\x49\xd7\xed\x73\xfe\xa9\xe3\x38\xce\x3f"
+ "\x65\x1f\x19\x5b\xa7\x6c\x20\x63\xeb\x94\x37\xe4\x73\xfe\xb7\x8e"
+ "\x0b\x39\xff\xe4\xb0\xfb\x9c\xbf\xb5\x38\xff\xc4\x52\x82\xbf\xb7"
+ "\x36\x2a\xe3\xfc\x6f\xe5\x09\x39\x7f\xf4\x01\x5b\xce\x3f\xc5\xc5"
+ "\x71\xce\x3f\xa5\x8f\x32\xce\x3f\xc5\xcf\x31\xce\x3f\x65\xb9\x38"
+ "\xe7\x9f\x54\x2b\xcd\xf9\xc9\x39\x5b\xae\x36\xb5\x0f\xc7\xd5\xa2"
+ "\xae\xb7\x7f\xce\x1f\x95\x25\xce\xcb\xa2\x36\x12\xce\x3f\x65\x59"
+ "\xcb\x73\xfe\x29\xcb\xc4\x39\xff\xd4\xae\x84\x1f\x4d\x59\x69\xcb"
+ "\xf9\xe1\x1a\x51\xce\x3f\x75\x38\x7b\xcd\x32\x21\xe7\x27\x75\x40"
+ "\x1c\x9a\x2a\xcd\xf9\xa7\x9a\x48\x5c\x9a\x4a\xbe\xd9\xc5\xfa\xd4"
+ "\x96\xf3\x4f\xdd\xda\x3c\xe7\x27\x18\x62\x9e\x53\x92\xf3\x4f\xbd"
+ "\x62\xcb\xf9\x27\x19\xc4\x39\xff\xdb\xc5\x1c\x8e\xde\x9e\x2e\xe4"
+ "\xfc\xd3\x06\xdf\x1d\x9c\x5f\x12\x5b\x59\x42\xce\xff\xb6\x9b\x7c"
+ "\xce\xff\xf6\x10\x79\x9c\x1f\x63\x4e\x8c\xf3\xbf\xbd\xdc\x1a\x73"
+ "\x42\xce\xff\xf6\x66\x71\xce\xff\xf6\x01\x21\xe7\xc7\xf5\x8b\x71"
+ "\xfe\xb7\x2f\x08\xea\xb7\xe1\xfc\xd1\x2e\x42\xce\x4f\xca\x71\x9c"
+ "\x3f\x7a\x0b\x89\xa1\x93\x36\xc8\xe7\xfc\xd1\xcb\xa5\x39\x7f\xf4"
+ "\x5a\x21\xe7\x8f\x66\xd7\xce\x46\xef\x27\x9c\x3f\x3a\x89\x1c\x9f"
+ "\x94\xcb\x3f\xce\x71\x7e\x72\x9c\xe3\xfc\xd1\x25\xf7\xd7\xd4\xde"
+ "\x4d\x9c\x7f\xc6\x02\x65\x9c\x7f\x46\xb2\x72\x6e\x99\xc0\x5b\xf7"
+ "\x92\x60\x67\xdd\xcb\x3b\xa3\xec\x73\xcb\xf7\x78\xeb\x5e\xde\x65"
+ "\xd7\xbd\xc4\xb2\xeb\x5e\x62\xf7\xc9\xe7\x96\xb1\xfd\x84\xdc\xf2"
+ "\x9d\x8d\xf7\xb9\x65\x6b\x71\xcb\xe8\xd3\x84\x5b\xc6\x34\x28\xe3"
+ "\x96\x31\x56\xeb\x5f\x66\x8a\xac\x7f\x89\x95\xb1\xfe\x25\x56\xe1"
+ "\xfa\x97\x58\x07\xd7\xbf\xc4\x4a\xac\x7f\x79\x27\x42\x9a\x5b\x92"
+ "\x73\xb6\x9c\xe0\x3d\xde\xfa\x97\xf7\xee\x82\xf5\x2f\xef\x4a\xac"
+ "\x51\x78\x97\x5d\xff\x12\xdb\x0a\xeb\x5f\x62\x25\xd6\xbf\xbc\xc7"
+ "\xae\x7f\x89\x15\x59\xff\x12\x2b\xb1\xfe\xe5\x3d\x76\xfd\x4b\xac"
+ "\xd5\xfa\x97\x58\x76\xfd\xcb\x7b\x76\xd6\xbf\xc4\xb1\xeb\x5f\xe2"
+ "\xd8\xf5\x2f\xc4\xa7\xb6\xdc\x32\xce\x81\xf5\x2f\xb1\xec\xfa\x97"
+ "\x58\x3b\xeb\x5f\xe2\x44\xd6\xbf\xbc\x33\x52\x9c\x5b\x26\xf0\xd6"
+ "\xbf\xc4\x5b\xad\x7f\x89\xbb\x4b\xd6\xbf\x48\x62\xcb\x6a\xfd\x4b"
+ "\xbc\x82\xf5\x2f\xf1\x32\xd7\xbf\xc4\x4a\xac\x7f\x89\x3f\x67\x8d"
+ "\x39\x21\xb7\x8c\x97\x58\xff\x92\x60\xb5\xfe\x25\x56\x62\xfd\x4b"
+ "\x42\x98\xa0\x7e\x1b\x6e\x99\x60\xb5\xfe\x25\xd6\x6a\xfd\xcb\x4c"
+ "\x76\xfd\xcb\x8c\x5b\xf2\xb9\x65\x82\x9d\xf5\x2f\x09\x56\xeb\x5f"
+ "\x12\xd8\xf5\x2f\x33\xd9\xf5\x2f\x09\xec\xfa\x97\x19\xb5\xfc\xe3"
+ "\x1c\xb7\x24\xc7\x39\x6e\x39\xb3\xd9\xf5\x2f\xf6\x79\xc7\xbc\x5a"
+ "\x8e\x77\xcc\xab\x95\xe6\x1d\x33\x8b\xed\xf3\x8e\xa4\x10\x8e\x77"
+ "\xcc\xde\x48\xfa\xf7\xec\x25\xa4\x7f\xcf\x66\xde\xc3\x2c\x3e\x06"
+ "\xbc\xe3\x91\x78\xed\xae\xab\x85\x0c\xef\xd8\x9d\x50\x4f\x01\x47"
+ "\x74\x35\x63\xde\x01\x5c\x70\xcd\x3c\xcc\x3b\xaa\xd8\xf5\xb6\xb3"
+ "\x0e\x1c\x4b\xe6\xf3\x8e\xc4\x1e\xcc\xda\x5b\xcc\x3d\x6a\xeb\x99"
+ "\x72\xf8\xbc\xd8\x5a\xdc\x6f\x12\xd8\xb5\xb8\x50\x37\x7f\x0d\x2e"
+ "\xb3\x2e\xf7\x2a\xf0\x92\x69\xe0\x0f\x1e\x2f\xb9\xbf\x16\xd7\xde"
+ "\x5a\xdc\x59\x0a\xf3\xdf\xb3\x96\x09\xb9\xc8\xfc\xcd\xb6\x5c\x64"
+ "\xd6\x25\xc7\xb9\xc8\x6c\x4f\x65\x5c\x64\xb6\x87\x63\x5c\x64\x76"
+ "\xbc\x38\x17\x99\x59\x82\x71\x2b\xce\x45\xc8\x39\xdb\x31\x24\xc9"
+ "\x93\x1b\x43\xe6\x9c\x6a\xff\x5c\x64\xce\x22\xf1\xf1\x62\xce\x72"
+ "\xc2\x45\x66\xc7\xb5\x3c\x17\x99\x1d\x27\xce\x45\xe6\x34\x90\xb8"
+ "\x3d\x3b\xd1\x96\x8b\xc0\x35\xa2\x5c\x24\xa9\x1f\x7b\x4d\x9c\x90"
+ "\x8b\x90\x3a\x20\x36\xbd\x2c\xcd\x45\x92\x2e\x90\x58\x95\xb4\x8f"
+ "\xc4\x2a\xe2\x53\x5b\x2e\x92\xb4\xb6\x79\x2e\x42\x30\xc4\x3c\xa7"
+ "\x24\x17\x49\x3a\x69\xcb\x45\x66\x1e\x16\xe7\x22\xf3\x76\x72\x38"
+ "\x9a\x37\x4a\xc8\x45\xe6\xf6\xba\x3b\xb8\x88\x24\xb6\x16\x09\xb9"
+ "\xc8\xdc\x2b\xf2\xb9\xc8\xbc\xde\xf2\xb8\x08\xc6\x9c\x18\x17\x99"
+ "\x17\x6f\x8d\x39\x21\x17\x99\xb7\x4a\x9c\x8b\xcc\xdb\x2c\xe4\x22"
+ "\xb8\x7e\x31\x2e\x32\xef\x98\xa0\x7e\x1b\x2e\x32\xef\x92\x90\x8b"
+ "\x90\x72\x1c\x17\x99\xbf\x86\xd5\x73\xf1\xf2\xb9\xc8\xfc\x78\x69"
+ "\x2e\x32\x7f\xae\x90\x8b\xcc\x1f\x41\x38\xc7\xfc\x02\xc2\x45\xe6"
+ "\x4f\x22\xc7\x67\xc6\xf1\x8f\x73\x5c\x84\x1c\xe7\xb8\xc8\xfc\x42"
+ "\x19\x79\x2e\x6f\x39\x6b\x71\x77\xde\x16\xe6\xb9\x2c\x39\x2e\x63"
+ "\xc0\x50\xd7\x3b\x79\x2e\xfe\x7b\x52\x91\x3c\x17\x1e\xd3\xb9\x3c"
+ "\xd7\x19\x26\x56\x71\x79\x2e\x3d\x93\xe7\xc2\x39\x2e\xfc\xae\xd4"
+ "\x92\xe3\x32\xcf\xb7\x5d\x87\xbb\xd3\x2c\x3f\xc7\xc5\xbd\x2f\xfd"
+ "\x36\x90\xe4\xb8\x2a\xef\xe4\xb8\xf0\x78\x6e\xaa\xb3\xcd\x71\xe1"
+ "\x71\x9c\xcb\x71\xfd\xdc\xc2\x39\xae\x05\x93\x95\x8d\xeb\x0b\x26"
+ "\xb5\x8f\xf7\xda\xf7\xda\x3a\xdc\xf9\x87\x49\xee\x67\xe1\x2d\x65"
+ "\xef\xb5\x17\xd6\xb6\x0f\xbf\xdc\x6b\x73\xbf\x17\x6c\x21\x7e\x59"
+ "\xb4\x56\x99\x5f\x16\xad\x69\x1f\x7e\xb9\xd7\xe6\x81\xbc\x1f\x42"
+ "\xfc\x92\xd2\x47\x99\x5f\x52\x9c\xd8\xff\x72\x45\x30\xa7\x99\x57"
+ "\x04\xf3\x35\x73\xc9\x30\xbe\x66\x4e\x69\x66\xff\xcb\x0f\xd2\x38"
+ "\xcd\xbc\xe4\x1c\xe1\xa1\x4b\x8a\x09\x0f\x5d\xc2\xbc\x9f\x5a\x1c"
+ "\x86\x18\xad\x6c\xc4\xba\xf9\xdd\x7a\x6a\xd7\xe5\x22\xca\xb8\x94"
+ "\xe8\xe5\x72\x63\x29\x3a\x66\xa8\x47\x1f\xce\x43\xae\xab\xae\x22"
+ "\xd7\x2f\x6e\xd4\x53\x5e\x71\xc8\x1d\xc6\x24\xb0\x59\x29\xf0\x98"
+ "\x8d\x28\x31\x05\x6b\xe9\x34\x53\x79\xa2\x81\xa7\xa5\x53\xa7\x72"
+ "\x3a\x1a\xca\x25\xd6\xa3\x7f\xbe\x5b\x44\x61\xbd\xdc\x94\x3d\x4d"
+ "\xdd\xd4\x6f\x28\xd9\xc7\x8a\x9f\xcf\x87\x7b\x6b\xdf\x12\xe6\xf3"
+ "\x1b\xb3\xa7\x79\x37\xec\x1c\xea\xca\xec\xa1\xd9\x87\xcb\xe9\xcb"
+ "\xd9\x3f\xf3\x93\x46\xe4\x6d\xc9\xe7\x7f\x72\xcf\xe5\xf3\x17\x9d"
+ "\x20\x18\x4d\x3b\xa2\x2c\x9f\x9f\x56\x22\xd4\xd0\x2b\x2e\xd8\x6a"
+ "\xe8\x25\xfd\x1c\xd7\xd0\x4b\xc6\x28\xd3\xd0\x4b\x22\x1c\xd3\xd0"
+ "\x4b\xf6\x58\x6b\xe8\x6d\x29\x58\x43\xa7\x18\x31\x8e\xc5\x35\x34"
+ "\x39\x67\xab\x7d\x3e\x18\xc3\x69\x9f\x0f\x7a\xb5\x7f\x0d\xbd\xb4"
+ "\x48\x5c\xe7\x2c\x3d\x42\x34\xf4\x92\xc2\x96\xd7\xd0\x4b\x0a\xc5"
+ "\x35\xf4\x07\xcf\x11\xbd\xb1\xa4\xd0\xa2\x87\x39\x0d\x0d\xd7\x88"
+ "\x6a\xe8\x0f\x66\x59\x5f\x43\x34\xf4\x92\xbd\x44\x43\x7f\xb0\x56"
+ "\x5a\x43\x2f\xeb\x4b\x62\xd7\x07\x0d\x24\x76\x11\x9f\xda\x6a\xe8"
+ "\x0f\x8e\x37\xaf\xa1\x09\x86\x98\xe7\x94\xd4\xd0\xcb\x7a\xd8\x6a"
+ "\xe8\x14\x89\xfd\x33\x97\x5f\xe7\x70\xb4\x3c\x53\xa8\xa1\x97\x4d"
+ "\xbd\x3b\x34\xb4\x24\xb6\x8a\x84\x1a\x7a\xf9\x40\xf9\x1a\x7a\xf9"
+ "\x74\x79\x1a\x1a\x63\x4e\x4c\x43\x2f\xdf\xc3\xe2\x67\xaf\xb8\x86"
+ "\x5e\x7e\x4c\x5c\x43\x2f\xbf\x20\xd4\xd0\xb8\x7e\x31\x0d\xbd\xa2"
+ "\xab\xa0\x7e\x1b\x0d\xbd\xa2\x9f\x50\x43\x93\x72\x9c\x86\x5e\x51"
+ "\x41\x62\x68\x8a\x82\xfd\x33\x57\xec\x91\xd6\xd0\x2b\x0e\x08\x35"
+ "\xf4\x8a\x35\x44\x2b\xaf\xa8\x22\x1a\x7a\x45\x01\x39\x9e\x52\xc0"
+ "\x3f\xce\x69\x68\x72\x9c\xd3\xd0\x2b\x6a\x65\x68\x68\x4d\x0b\x69"
+ "\x68\xf7\xbb\x4b\x43\xff\xd3\xd0\x3e\x34\xf4\xca\xcd\xca\x34\xf4"
+ "\xca\x02\x07\x35\x81\x77\x33\x9a\xc0\xf5\xbe\x26\xe0\xf3\xad\xff"
+ "\x71\x27\x7c\x6b\xf5\x10\x65\x9a\x60\x75\x70\x7b\xf0\xcb\xbd\xe5"
+ "\x93\x95\xec\x7c\xfd\x0f\x8f\x29\xf3\xc9\x87\xa5\xf7\xf5\x73\x6b"
+ "\xf8\x65\x75\x1a\xf1\xcb\xda\xe9\xca\xfc\xb2\x36\x5a\xb9\x7e\xce"
+ "\xce\xe3\xf4\x73\x76\x1e\x5f\x3f\x7f\x2f\x78\xe7\x9c\x3e\xc4\xbe"
+ "\x7e\x5e\x5f\xc5\xe9\xe7\xcc\xe1\x84\x83\x66\xb2\x73\x4a\x32\x98"
+ "\x9c\xfa\xa2\x7d\x44\x3f\xdf\xc6\xfa\xf9\x22\xe8\xe7\x19\x51\x94"
+ "\x91\xfd\x76\x04\x9e\xbf\x76\x0c\x34\x30\xd6\xcc\xe5\xc9\xf0\x77"
+ "\x92\x01\x7d\x38\x1b\xb9\xae\x06\xed\xbb\x1d\xc6\xca\xed\xf3\x0c"
+ "\xd4\xca\x77\x61\x9c\xa9\xdc\x89\xbc\x62\x40\x57\xdf\xc0\xba\xfa"
+ "\x30\x68\xe6\xe5\xac\xae\xce\x98\x5a\x9e\xc4\xd7\xd5\xe9\x07\x18"
+ "\x5d\x6d\x20\x73\xe3\xca\x93\x40\x57\xc3\xfd\xf0\xb7\x28\xf8\xba"
+ "\xba\x01\x74\x73\x23\xe8\xe6\x8c\xcb\x56\x1a\x7b\x86\xad\xc6\x6e"
+ "\xf0\x99\xa6\xa9\xef\x37\xd4\x1d\x6b\xec\xdb\x5b\xef\x6b\x6c\x5b"
+ "\x8d\xbd\xc6\x9b\xe0\x38\xa3\x9f\x32\x8d\x9d\x11\x20\xd4\xd8\x39"
+ "\x2f\xdb\x6a\xec\x8c\x4c\xc7\x35\x76\xc6\x3e\x65\x1a\x3b\x63\xaf"
+ "\x63\x1a\x3b\xd3\xc7\x5a\x63\xff\x8d\x79\x4f\x9d\x1e\x82\xb1\x2e"
+ "\xae\xb1\xc9\x39\x5b\x6d\xb4\x7e\x1f\xa7\x8d\xd6\x2f\x69\xff\x1a"
+ "\x7b\xbd\x9f\xb8\x0e\x5a\xdf\x8f\x68\xec\x4c\xef\x96\xd7\xd8\x99"
+ "\xde\xe2\x1a\x7b\x3d\x3b\xff\x2d\xd3\xdb\x56\x63\xc3\x35\xa2\x1a"
+ "\x7b\xfd\x49\xeb\x6b\x88\xc6\xce\xd4\x10\x8d\xbd\xfe\xba\xb4\xc6"
+ "\xfe\x68\x2d\x89\x6f\x1f\x4d\x26\xf1\x8d\xf8\xd4\x56\x63\x7f\x34"
+ "\xb8\x79\x8d\x4d\x30\xc4\x3c\xa7\xa4\xc6\xfe\x68\xb1\xad\xc6\x4e"
+ "\x0f\x16\xd7\xd8\xd9\xe3\x39\x1c\x65\xdd\x12\x6a\xec\x8f\x8a\xef"
+ "\x0e\x8d\x2d\x89\x2d\x3f\xa1\xc6\xce\xca\x96\xaf\xb1\xb3\x8e\xc8"
+ "\xd3\xd8\x18\x73\x62\x1a\x3b\xdb\x87\xc5\x8f\x46\x5c\x63\x67\x0f"
+ "\x14\xd7\xd8\xd9\x2f\x0b\x35\x36\xae\x5f\x4c\x63\x67\xcf\x15\xd4"
+ "\x6f\xa3\xb1\xb3\x33\x85\x1a\x9b\x94\xe3\x34\x76\x4e\x10\x89\xa1"
+ "\x6b\xcf\xc9\xd7\xd8\x39\x3e\xd2\x1a\x3b\xa7\x97\x50\x63\x67\x1b"
+ "\x88\x96\xce\x19\x41\x34\x76\x8e\x2b\x39\xbe\x56\xcf\x3f\xce\x69"
+ "\x6c\x72\x9c\xd3\xd8\x39\x91\xf2\xde\x53\x3b\xb5\x1f\x96\x6b\xdb"
+ "\xaf\xc7\x68\xa9\xfd\xb0\x2c\xef\xaa\xff\xe8\xf5\x18\xb9\x9d\x94"
+ "\xe9\xec\x5c\xf7\xfb\x7a\xae\xa5\x75\x43\x4e\x1c\xe1\x5b\x1b\x14"
+ "\xee\x7f\xbb\xc1\xee\xfe\xb7\xf7\xf5\x9c\x52\xbf\xe4\x46\x10\xbf"
+ "\x7c\x32\x58\x99\x5f\x3e\x09\x52\xae\xe7\x3e\x1b\xc1\xe9\xb9\xcf"
+ "\x46\x48\xbf\x0f\xcd\xeb\x64\x5f\xcf\x15\x64\x70\x7a\x2e\xff\x3a"
+ "\xe1\x3b\xf9\x27\x09\xdf\xc9\xcf\x6e\xb9\xf7\xa1\xf9\x9e\xc2\xf7"
+ "\xa1\x79\xb3\xee\xbf\x0f\x6d\x0b\xad\xb6\xa1\x8a\x60\x74\xe3\x29"
+ "\x65\x5a\x6d\x63\xa5\x50\xab\x7d\x76\xcb\x56\xab\xe5\x3f\xe7\xb8"
+ "\x56\xcb\x9f\xaa\x4c\xab\xe5\x47\x39\xa6\xd5\xf2\x0f\x89\xbf\x0f"
+ "\xcd\xf3\x90\x7e\x1f\x4a\xce\xd9\x72\xec\x82\xa9\x1c\xc7\x2e\xe8"
+ "\xd7\xfe\xb5\xda\xa6\x0a\x71\x3e\xbd\xe9\x14\xd1\x6a\xf9\x45\x2d"
+ "\xaf\xd5\xf2\x8b\xc4\xb5\x5a\xc1\x28\xc2\x6b\xf3\x8b\x6c\xb5\x1a"
+ "\x5c\x23\xaa\xd5\x0a\x96\x58\x5f\x43\xb4\x5a\xfe\x61\xa2\xd5\x0a"
+ "\x36\x4a\x6b\xb5\xcd\x43\x48\xec\xda\xdc\x89\xc4\x2e\xe2\x53\x5b"
+ "\xad\x56\x70\xae\x79\xad\x46\x30\xc4\x3c\xa7\xa4\x56\xdb\xdc\xd7"
+ "\x56\xab\xe5\xb9\x8b\x6b\xb5\xcf\x5c\x38\x1c\x7d\xba\x59\xa8\xd5"
+ "\x36\xcf\xba\x3b\xb4\x9a\x24\xb6\x2a\x84\x5a\xed\xd3\x30\xf9\x5a"
+ "\xed\xd3\xb9\xf2\xb4\x1a\xc6\x9c\x98\x56\xfb\xf4\x10\x8b\x9f\xc3"
+ "\xe2\x5a\xed\xd3\x33\xe2\x5a\xed\xd3\x5b\x42\xad\x86\xeb\x17\xd3"
+ "\x6a\x9f\xf5\x16\xd4\x6f\xa3\xd5\x3e\x7b\x4e\xa8\xd5\x48\x39\x4e"
+ "\xab\x7d\xa6\x27\x31\xf4\x93\x3d\xf2\xb5\xda\x67\x87\xa4\xb5\xda"
+ "\x67\x47\x84\x5a\xed\xb3\x3c\xa2\xc9\x3e\xab\x25\x5a\xed\xb3\x42"
+ "\x72\xfc\x93\x42\xfe\x71\x4e\xab\x91\xe3\x9c\x56\xdb\xe2\x2a\x4f"
+ "\xab\x39\xbe\x5f\xd6\x1f\x3f\xa7\x58\x7d\x8f\xcd\x29\xde\xba\x47"
+ "\x99\x4e\xdb\x5a\x78\x5f\x13\xb4\x86\x26\xd8\xa2\x21\x7c\xeb\xf3"
+ "\x97\x95\x69\x82\xcf\x47\x28\xd7\x04\xbb\x27\x71\x9a\x60\xf7\x24"
+ "\x69\x4d\xb0\xad\x97\x7d\x4d\xb0\x63\x0b\xa7\x09\xfe\xee\x46\xc6"
+ "\xd5\x2f\x2e\x91\x71\xf5\x8b\xed\x2d\xa7\x09\xbe\xe8\x2d\xd4\x04"
+ "\xdb\x96\xdf\xd7\x04\x6d\xa1\x09\xb6\xd6\x13\x8c\x6e\xbf\xa2\x4c"
+ "\x13\x6c\xaf\x11\x6a\x82\xc2\x4e\xb6\x9a\xe0\x8b\x31\x8e\x6b\x82"
+ "\x2f\xe6\x2a\xd3\x04\x5f\x24\x39\xa6\x09\xbe\x38\x29\xae\x09\xb6"
+ "\x69\xa5\x35\x01\x39\x67\xcb\xe5\x76\xcc\xe5\xb8\xdc\x8e\xb0\xf6"
+ "\xaf\x09\xfe\x5e\x25\xce\xdb\xfe\x7e\x85\x68\x82\x2f\x4e\xb4\xbc"
+ "\x26\xf8\xe2\x84\xb8\x26\xd8\x31\x95\xf0\xa7\x2f\x4e\xd8\x6a\x02"
+ "\xb8\x46\x54\x13\xec\xc8\xb6\xbe\x86\x68\x82\x2f\x2a\x89\x26\xd8"
+ "\xb1\x47\x5a\x13\xec\x1c\x45\x62\xd7\xce\x5e\x24\x76\x11\x9f\xda"
+ "\x6a\x82\x1d\xb7\x9a\xd7\x04\x04\x43\xcc\x73\x4a\x6a\x82\x9d\xcf"
+ "\xd9\x6a\x82\x6d\xbe\xe2\x9a\x60\xb7\x0f\x87\xa3\x5d\xfb\x84\x9a"
+ "\x60\xe7\xf2\xbb\x43\x13\x48\x62\xab\x4a\xa8\x09\x76\x8d\x97\xaf"
+ "\x09\x76\xad\x92\xa7\x09\x30\xe6\xc4\x34\xc1\x2e\xf6\xfd\x1f\xc1"
+ "\x8b\xad\x26\xd8\x75\x5d\x5c\x13\xec\xee\x24\xd4\x04\xb8\x7e\x31"
+ "\x4d\xb0\x7b\xb0\xa0\x7e\x1b\x4d\xb0\x7b\x8c\x50\x13\x90\x72\x9c"
+ "\x26\xd8\x5d\x4b\x62\xe8\xe7\xc5\xf2\x35\xc1\xee\x93\xd2\x9a\x60"
+ "\xf7\x19\xa1\x26\xd8\xcd\x72\xff\x42\x77\xa2\x09\x76\x1f\x26\xc7"
+ "\x3f\x3f\xcc\x3f\xce\x69\x02\x72\x9c\xd3\x04\x85\x9a\xfb\xfb\x69"
+ "\xdd\x4d\xfb\x69\xed\x39\xa2\x4c\x17\xec\x29\x51\xce\x3f\x0f\xec"
+ "\xe7\xf8\xe7\x81\xfd\x7c\xfe\x29\xdc\xd7\xe2\xcb\x8d\xf6\xf9\xe7"
+ "\x57\x88\xe3\x9f\xfb\xa6\x92\x18\xbe\x6f\x38\x89\xe1\xfb\x98\xbd"
+ "\xf9\xe4\xed\xa7\xb5\x77\xb1\x70\x3f\xad\x2f\xaf\xdc\xdf\x4f\xab"
+ "\xb5\xb8\x65\x61\x00\xe1\x96\x7b\x5f\x56\xc6\x2d\xf7\x8e\x10\x72"
+ "\xcb\xaf\xa7\xdb\x72\xcb\xbd\x3b\x1d\xe7\x96\x7b\x8f\x2b\xe3\x96"
+ "\x7b\x2b\x1c\xe3\x96\xfb\x06\x8a\xef\x61\xf1\x65\x81\xf4\x7e\x5a"
+ "\xe4\x9c\x2d\x27\xf8\x07\x6f\x5f\xfd\x7f\x6c\x6c\xff\xdc\xf2\x1f"
+ "\x3a\xf1\xf1\xff\x1f\x2f\x13\x6e\xb9\x2f\xb0\xe5\xb9\xe5\xbe\x40"
+ "\x71\x6e\xf9\x8f\x6f\xc8\x38\xbc\x2f\xc8\x76\x0f\x0b\xb8\x46\x94"
+ "\x5b\xfe\x83\xdd\xff\x7e\x5f\xa0\x90\x5b\x92\x3a\x20\x0e\x79\x4a"
+ "\x73\xcb\xaf\xb6\x93\xb8\xf4\xd5\x02\x12\x97\x88\x4f\x6d\xb9\xe5"
+ "\x57\x63\x9a\xe7\x96\x04\x43\xcc\x73\x4a\x72\xcb\xaf\x36\xd8\x72"
+ "\xcb\x2f\xf3\xc4\xb9\xe5\x81\x59\x1c\x8e\x0e\x74\x15\x72\xcb\xaf"
+ "\xce\xdd\x1d\xdc\x52\x12\x5b\x3a\x21\xb7\xdc\xbf\x47\x3e\xb7\xdc"
+ "\x7f\x41\x1e\xb7\xc4\x98\x13\xe3\x96\x07\x06\x5a\x63\x4e\xc8\x2d"
+ "\x0f\x8c\x12\xe7\x96\x07\xa6\x0b\xb9\x25\xae\x5f\x8c\x5b\x1e\xc8"
+ "\x14\xd4\x6f\xc3\x2d\x0f\xec\x14\x72\x4b\x52\x8e\xe3\x96\x5f\x47"
+ "\xb0\xe3\xdd\x70\xf9\xdc\xf2\xeb\x81\xd2\xdc\xf2\xeb\x21\x42\x6e"
+ "\xf9\xb5\x07\xe1\x90\x5f\x47\x13\x6e\xf9\xb5\x96\x1c\xff\x72\x18"
+ "\xff\x38\xc7\x2d\xc9\x71\x8e\x5b\x7e\x9d\x24\x6f\xfd\x4d\x8b\xe4"
+ "\x9b\xdb\x68\xfd\x4d\x4b\xe5\x9b\xdb\xcb\xfa\x9b\x83\xbd\x95\xf1"
+ "\xca\x83\xda\xfb\xf3\x82\x5a\x3a\xd7\xfc\xf5\x4a\xc2\xb5\xbe\xd9"
+ "\xa7\x2c\xd7\xfc\xcd\x5e\xe5\x5c\xbf\xb8\x8a\xe3\xfa\xc5\x55\xd2"
+ "\xeb\x09\xbe\x5d\x65\x9f\xeb\x7f\x17\xc0\x71\xfd\x43\xec\x7c\xdb"
+ "\x43\xb3\xc8\x98\x7a\x68\xa0\x92\xf5\x04\xab\x6f\x20\xd7\x0f\xad"
+ "\xd7\x13\x9c\xf8\x86\xac\x27\x98\x6d\xbd\x9e\xa0\x68\xbb\x70\x3d"
+ "\xc1\x3f\x3b\x49\xad\x27\xc0\xb9\xe7\xa6\x9d\x43\x99\xb5\x04\xa2"
+ "\xeb\x08\x26\xb6\xfc\x3a\x02\xac\x13\x3e\x01\xdc\x62\xad\x80\xe3"
+ "\xcd\xbd\xa5\x15\x0e\xc6\x10\xfc\x16\xcd\x55\xa6\x15\x8a\x92\x84"
+ "\x5a\xe1\xfb\x4c\x5b\xad\x50\x74\xca\x71\xad\x50\x64\x52\xa6\x15"
+ "\x8a\x8c\x8e\x69\x85\x43\x93\xc5\xd7\x11\x7c\xbb\x46\x7a\x1d\x01"
+ "\x39\x67\xcb\xf1\xfe\x65\xe2\x38\xde\xbf\x8e\xb4\x7f\xad\xf0\xaf"
+ "\x38\x71\x3e\xf7\xaf\xb9\x44\x2b\x1c\x9a\xd4\xf2\x5a\xe1\xd0\x24"
+ "\x71\xad\xf0\xaf\x4b\x84\x57\x1d\x9a\x64\x9b\x87\x86\x6b\x44\xb5"
+ "\xc2\x77\xbd\xac\xaf\x21\x5a\xe1\x50\x14\xd1\x0a\xdf\x0d\x91\xd6"
+ "\x0a\xdf\x9d\x24\x71\xed\x3b\xf6\x1b\x93\xc4\xa7\xb6\x5a\xe1\xbb"
+ "\xc5\xcd\x6b\x05\x82\x21\xe6\x39\x25\xb5\xc2\x77\xc5\xb6\x5a\xe1"
+ "\xdb\x95\xe2\x5a\xa1\x78\x23\x87\xa3\xe2\xe7\x84\x5a\xe1\xb0\xe7"
+ "\xdd\xa1\x15\x24\xb1\x15\x27\xd4\x0a\x87\xcf\xc8\xd7\x0a\xc5\x5d"
+ "\xe5\x69\x05\x8c\x39\x31\xad\x50\x3c\x99\xc5\x4f\x94\xb8\x56\x28"
+ "\x5e\x20\xae\x15\x8a\x33\x85\x5a\x01\xd7\x2f\xa6\x15\x8a\xbf\x11"
+ "\xd4\x6f\xa3\x15\x8a\x4f\x09\xb5\x02\x29\xc7\x69\x85\xef\x17\x91"
+ "\x18\xfa\xed\x40\xf9\x5a\xe1\xfb\xc9\xd2\x5a\xe1\xfb\xe9\x42\xad"
+ "\xf0\x7d\x30\xd1\x04\xdf\x67\x10\xad\xf0\xfd\x48\x72\xfc\xdb\x40"
+ "\xfe\x71\x4e\x2b\x90\xe3\x9c\x56\xf8\xbe\x40\xde\xdc\x14\xc7\xf3"
+ "\xd0\x7f\xfc\xdc\x14\xf7\x7b\x6c\x6e\x4a\xc9\x28\x65\x5a\xa1\x64"
+ "\xa4\x72\x5e\x5a\x11\xc9\xf1\xd2\x8a\x48\xe9\x39\x10\x47\x7a\xdb"
+ "\xe7\xa5\xc7\x0a\x38\x5e\x5a\xea\x42\xe2\xf7\x0f\x17\x48\xfc\xfe"
+ "\x61\xab\xa3\x73\x20\x56\xdf\x66\xb9\xa8\x65\x0e\xc4\x3c\x76\x0e"
+ "\x04\xf0\x51\xc2\x3f\x7f\xe8\x25\x9c\x03\x71\x64\x95\xd4\x1c\x08"
+ "\xd1\xb9\x0f\x56\x9c\xd3\xc2\x4f\x9d\x99\xfb\x70\x6f\x73\xce\xef"
+ "\xf7\x12\xce\x79\xf4\x92\x32\xce\x79\xb4\x5a\xc8\x39\x8f\xbb\xd9"
+ "\x72\xce\x1f\x46\x39\xce\x39\x7f\x98\xa5\x8c\x73\xfe\x90\xe8\x18"
+ "\xe7\xfc\xe1\xb8\xf8\xdc\x87\x23\x7e\xd2\x73\x1f\xc8\x39\x5b\xae"
+ "\x70\x8c\x97\x57\x3c\xf6\x5c\xfb\xe7\x9c\xa5\x7a\x71\x5e\x50\x7a"
+ "\x89\x70\xce\x1f\x2a\x5a\x9e\x73\xfe\x50\x21\xce\x39\x8f\xb1\xe3"
+ "\xff\x0f\x15\xb6\x9c\x13\xae\x11\xe5\x9c\xc7\x32\xad\xaf\x21\x9c"
+ "\xf3\x87\x13\x84\x73\x1e\xdb\x29\xcd\x39\xcb\x5e\x26\x31\xab\xac"
+ "\x07\x89\x59\xc4\xa7\xb6\x9c\xf3\xd8\xf5\xe6\x39\x27\xc1\x10\xf3"
+ "\x9c\x92\x9c\xb3\x6c\x88\x2d\xe7\x3c\xa2\x15\xe7\x9c\x15\x5d\x39"
+ "\x1c\x95\xef\x11\x72\xce\xb2\x25\x77\x07\xe7\x94\xc4\x96\x5e\xc8"
+ "\x39\xcb\xc7\xc8\xe7\x9c\xe5\xcb\xe5\x71\x4e\x8c\x39\x31\xce\x59"
+ "\x7e\x9c\xc5\xcf\x09\x71\xce\x59\x7e\x45\x9c\x73\x56\xb8\x09\x39"
+ "\x27\xae\x5f\x8c\x73\x56\x0c\x14\xd4\x6f\xc3\x39\x2b\x46\x09\x39"
+ "\x27\x29\xc7\x71\xce\x0a\x03\x89\xa1\x25\x47\xe4\x73\xce\x8a\xe3"
+ "\xd2\x9c\xb3\xe2\x94\x90\x73\x56\xec\x20\xdc\xf2\xb8\x2b\xe1\x9c"
+ "\x15\x45\xe4\x78\x49\x09\xff\x38\xc7\x39\xc9\x71\x8e\x73\x1e\xf7"
+ "\xb6\xc7\x39\xe9\xac\x0e\xd5\x19\x94\xb9\x10\x7e\xfb\xe1\x39\x7b"
+ "\xc0\xf8\x56\x04\x7f\x97\xc0\x38\xa5\x86\xbf\x2b\xa4\xb8\x8c\xc1"
+ "\xa7\x43\xb5\x19\x78\x89\x19\xee\x53\x6e\xb8\x56\x54\xd4\xd3\x88"
+ "\xc7\x93\x2c\x32\xbe\x74\xa8\xf6\x32\x76\x1c\x61\xa6\x63\x10\xed"
+ "\x0d\x7f\x27\xc3\x31\x28\xdf\x05\xc6\x43\xed\x3c\xd4\xe5\x2a\x75"
+ "\x7c\xaf\xa5\x1c\x3c\x73\x97\xf3\xd4\xf1\x59\xb8\x0e\x78\xd6\x22"
+ "\x68\x8f\x56\xf2\x59\xa1\xae\xf0\xed\x0f\xa1\xc5\x46\xfa\xb7\xa2"
+ "\x84\x1b\xa8\x8a\xfa\xb1\x93\x57\x4d\xc7\x11\x10\x87\x10\xe6\x88"
+ "\x85\x3d\x0d\xae\xb8\xce\xa2\x84\x46\x38\x77\xbc\x06\x9f\x33\xc1"
+ "\x33\xa6\xc4\x23\x2a\xfd\x46\x47\x77\xe0\x5c\x6e\xa9\xb5\x74\xf5"
+ "\x4c\x23\x3c\x33\x8c\xaf\xff\x7c\xa8\xd2\x75\xf7\xc7\x95\xcc\xd8"
+ "\x53\x56\x6b\x62\xea\xd0\x26\xe0\xe7\xf9\xd1\x33\x1f\xca\x8b\x3d"
+ "\xc3\xf2\x5d\x28\xc0\xad\x2f\xad\x97\x37\xde\xfd\x18\x25\x65\x47"
+ "\xaf\x25\x0f\xa1\xa2\x27\xc0\x76\x5a\x44\x89\x9d\x97\x79\x1f\x7b"
+ "\xf3\x1f\xdc\x3f\xea\x4e\xd7\xa6\x6e\x40\xd4\x3a\x73\x47\xf7\xef"
+ "\x20\x26\x6e\xca\xa1\x0d\x75\xab\xff\x1d\xa4\x77\x39\xb4\x0d\xdb"
+ "\xfc\x03\x38\xbf\xae\x3b\x6d\xb8\xb9\x14\xe3\xe6\xdf\x23\x0f\xc1"
+ "\xd8\x6e\xed\x8b\xd9\xd1\xf1\x53\xb5\x49\xb1\xf1\xd3\x67\xce\x4d"
+ "\xd2\xf6\x89\xee\x8c\xc6\xcd\x9c\xa9\x8d\x9f\x9a\xb0\x40\xcb\x3f"
+ "\xf3\x8c\x36\x3a\x76\xce\xd4\x69\x71\xd3\xfb\xc5\xbf\x9d\xd8\x19"
+ "\x9e\x09\xf1\x9e\xc3\x1b\x3f\x8b\x79\xf5\xbf\x23\xf3\xd7\x23\xf4"
+ "\x51\x37\xe4\x8a\x9f\x0b\xee\x77\x50\xef\xaa\xad\xc2\xf7\x4b\xcf"
+ "\xa1\x6b\x29\x28\x93\x0a\x31\x6d\x5d\x4a\x47\x28\xfb\x63\xc9\x26"
+ "\x78\xae\x7c\x78\x6e\x78\x46\xfc\xcc\xd5\x96\x67\xb6\x60\x22\x15"
+ "\x63\x22\xe5\x06\x60\xf0\x44\x27\xaf\xfa\x8e\x2f\xd1\x74\x24\x6e"
+ "\x5f\x2d\xf4\x15\x17\x38\xb6\x99\xd1\x0d\xd9\x1d\xaa\xeb\x56\x9f"
+ "\xf0\xb3\x60\xcc\x9c\x15\x9e\x46\xe7\x74\x28\x04\x5e\xe9\x52\x47"
+ "\xc7\x3c\x0f\xd8\xc4\xd7\xcf\x1a\x80\x50\x1a\x5d\x17\xc9\x7c\x1b"
+ "\x83\xae\x03\x0c\x13\x9c\xc2\xb9\x93\xc3\x6e\x52\x28\x14\xea\x88"
+ "\xd1\xa3\xf8\x1a\x5c\x87\x1e\x8e\x61\x9b\x9b\x0b\xe2\xd5\xe3\xfd"
+ "\x51\xda\xe3\x69\x28\xad\x0e\x5f\xb3\xa5\x7f\xb5\x57\x12\x72\x09"
+ "\x4f\xa6\xcf\x42\xdc\x71\xa1\x7b\xc7\xab\xe9\xad\xfd\xab\xf5\xd4"
+ "\x89\x91\xe6\xec\xf0\x34\x68\x4f\x0d\xd4\x53\xa8\x47\x4d\x15\xb8"
+ "\x9e\x75\x39\x8c\xed\x6b\x70\xdb\xc1\x3e\xa0\x7f\xe8\x22\x7a\x29"
+ "\xdb\x87\x32\xfc\xb4\xe6\x8c\xd9\x51\xe5\xae\xb7\x51\xb8\x91\x6e"
+ "\xa2\x33\xfd\xb4\x65\xb5\xb5\x10\xd3\x12\xdf\xa6\x3b\xff\x3b\xd6"
+ "\xcb\x18\x3b\x7d\x53\x37\xe8\x8b\x99\xb3\xa3\xe8\xcc\x67\x27\x8d"
+ "\xef\x8b\xd4\x75\xab\x4f\x7a\x58\xec\x09\xb6\x74\x95\x87\xa3\x93"
+ "\x6a\xdc\x26\x8c\x07\x78\x1e\x16\x0f\x27\x27\x1d\x4a\xb2\xc5\xc3"
+ "\x9d\xbe\x99\xf3\xbc\xc1\x48\x47\xbe\xd4\x94\x15\xea\x4f\x7b\x87"
+ "\x7a\xa7\x5c\x40\x1d\xb0\x6d\xcb\x40\x0b\xa4\xcf\x43\x9a\xb5\x6f"
+ "\x21\xed\x94\x05\x6a\x64\xc8\x0e\x55\x7b\x2d\x49\x73\x01\x9b\x50"
+ "\x10\x5f\x02\x21\x66\x06\x36\x75\x0f\x4f\x5b\x34\x1d\x51\x3b\xcf"
+ "\x17\x52\x98\x3f\xe3\x79\x2b\x17\xa9\xff\xf4\xca\x87\xeb\xe8\x6b"
+ "\x91\x08\xfb\x83\xf1\xc5\xb5\x18\x34\x2a\x16\xc6\xe7\x77\x99\xf3"
+ "\x63\x36\x42\x9d\x32\xdb\xc5\xf0\x5f\x13\xf8\x6a\x00\xf8\xa9\xbc"
+ "\xca\xc4\xd4\xc9\xf8\x2a\x8e\xf3\xd5\x37\xf0\x1c\x9c\xbf\x4e\x56"
+ "\x62\xbf\x8a\xb7\x39\x34\x91\x6d\xf3\x36\x68\x73\x96\x9d\x36\x67"
+ "\x90\x36\xbb\xdd\xb0\xdf\xe6\x9f\xba\xda\x6f\xf3\x4f\xc3\xe5\xb7"
+ "\xf9\x3f\xa7\xe5\xb7\xf9\x3f\xa5\x76\xda\xcc\xfa\x59\x07\x7e\xd6"
+ "\xd9\xf1\xb3\x8e\xf5\xf3\x03\xe7\xed\xb7\xb9\xd2\xcd\x7e\x9b\x2b"
+ "\x87\xc8\x6f\xf3\x4f\x15\xf2\xdb\xfc\x53\x91\x74\x9b\x75\xac\x9f"
+ "\x75\xe0\x67\x9d\x1d\x3f\xeb\x58\x3f\x77\xfd\xb1\x99\x36\x37\xd8"
+ "\x6f\xf3\xa9\x7e\xf2\xdb\x5c\x79\x58\x7e\x9b\x2b\xf7\xda\x69\x33"
+ "\xeb\xe7\x30\xf0\x73\x98\x1d\x3f\x87\xb1\x7e\x7e\x7a\xb5\xfd\x36"
+ "\x9f\xba\x62\xbf\xcd\x3f\xf7\x96\xdf\xe6\x53\xfb\xe5\xb7\xf9\xd4"
+ "\x36\xe9\x36\x87\xb1\x7e\x0e\x03\x3f\x87\xd9\xf1\x73\x18\xeb\xe7"
+ "\x37\x87\xda\x6f\xf3\xcf\xe7\xec\xb7\xf9\xbf\x3e\xf2\xdb\xfc\xf3"
+ "\x0e\xf9\x6d\xfe\x39\x4f\xaa\xcd\x8d\x10\xb7\x3d\xa0\x2d\x4d\x3f"
+ "\x45\xbe\x64\xf2\x0e\xf5\xf5\xa8\x42\x54\xde\x52\x73\x8c\x57\x35"
+ "\xea\x04\x6d\x8b\xa1\x73\xc6\x46\xe0\x7f\xcd\xde\xa1\x9a\x46\xef"
+ "\x50\xff\x86\xee\x1d\x0a\xdf\x9f\x8c\x3a\x60\x3e\xbe\xca\x8c\x34"
+ "\xe6\xac\x50\xef\x35\x63\x91\x36\xd5\x80\xd4\x65\x29\x7a\x94\x92"
+ "\x48\x1b\xca\xd0\x39\xe4\x59\x8d\xb5\xe7\xcf\xa8\xb4\xa6\x04\x25"
+ "\xcc\xa6\xe9\x8b\xd4\xe9\xa9\x38\x6f\x02\x3c\x39\x2d\xe3\x3f\x48"
+ "\x0b\xf7\x08\xcc\x87\x1f\xae\xc7\x6b\x24\x8c\x9f\x39\x63\xc7\x6e"
+ "\x4a\x41\x9a\x6f\xdf\xad\x46\xf8\xf8\x46\xf8\x99\x72\xc2\xd3\x52"
+ "\x26\x23\x6a\xd7\x8d\x4a\x8a\x8c\xcd\xa7\xfb\x59\x8f\xcd\x23\xa7"
+ "\x82\x2d\xa7\x31\xe7\x16\xe4\x8d\x95\x6b\xcb\xff\xd6\x5b\xc6\x6e"
+ "\xc6\x96\xa7\x4d\x64\xbc\xb7\x1a\xbb\xbf\x85\xfb\x73\xb6\xfc\x6f"
+ "\x35\xb6\x25\x9d\x15\x1a\x58\x5e\xdd\x88\x75\x93\xfa\x62\x32\xa2"
+ "\xe0\x78\x6e\x59\xe2\x0d\x24\x6e\xe3\xd0\x44\x9e\x8d\xf3\x3c\xaa"
+ "\xdc\x6e\x48\xd8\x38\x17\x6c\xbc\x4d\xc4\xc6\x59\x8e\xd9\xf8\x4c"
+ "\xb1\xf3\x36\x3e\x93\x29\x6d\xe3\x33\x67\xe4\xdb\xf8\xcc\x24\xf9"
+ "\x36\x3e\x33\x92\xb5\x71\xa1\xd0\xc6\xa7\x8d\x76\x6c\xcc\xc3\xb1"
+ "\x0e\x70\xfc\xc0\x79\x71\x1b\xeb\x00\xc7\x3a\x11\x1c\xeb\x1c\xc4"
+ "\xf1\xd9\xbe\xce\xdb\xf8\x97\x5b\xd2\x36\x3e\x1b\x26\xdf\xc6\xbf"
+ "\x14\xc9\xb7\xf1\x2f\x85\xc4\xc6\x3a\x2b\x1c\xff\x12\x25\x6d\x63"
+ "\x1d\x0f\xc7\x3a\xc0\x71\xd7\x1f\x25\x6c\x0c\x38\xd6\x89\xe0\x58"
+ "\xe7\x20\x8e\xf5\x6b\x9d\xb7\xb1\xfe\x0d\x69\x1b\xeb\xb7\xca\xb7"
+ "\xb1\xde\x4f\xbe\x8d\xf5\xde\xac\x8d\xad\x70\x7c\xf6\xb0\x1d\x1b"
+ "\xf3\x70\x1c\x06\x38\x7e\x7a\xb5\xb8\x8d\xc3\x00\xc7\x61\x22\x38"
+ "\x0e\x73\x10\xc7\xe7\xae\x3b\x6f\xe3\x73\xdf\x48\xdb\xf8\x7c\x27"
+ "\xf9\x36\x3e\xb7\x52\xbe\x8d\xcf\x25\x13\x1b\x87\x59\xe1\xf8\x9c"
+ "\xbf\xb4\x8d\xc3\x78\x38\x0e\x03\x1c\xbf\x39\x54\xc2\xc6\x80\xe3"
+ "\x30\x11\x1c\x87\x39\x88\xe3\x5f\xc7\x3b\x6f\xe3\x5f\x7b\x4b\xdb"
+ "\xf8\xd7\x78\xf9\x36\x3e\x5f\x23\xdf\xc6\xe7\x4f\xb3\x36\xb6\xc2"
+ "\xf1\xf9\x35\x52\x36\x6e\x02\x0d\xe8\x09\x36\xf6\xac\x41\xd4\x46"
+ "\x6c\xdb\x4a\x62\x5b\x53\xf7\xb1\x11\x1b\x29\x73\x0c\xb6\x09\x93"
+ "\x03\xfa\x5d\xd3\xc5\x94\x15\xea\x4b\x53\xd0\xa6\x14\x9c\x77\xfd"
+ "\xf5\xa4\x71\x29\xea\xa2\x4d\xc1\xf9\xdf\x0b\xcc\xfc\x58\x6d\xca"
+ "\x8a\x33\x70\x3f\x15\xce\x7b\x19\xb3\xdd\x32\x4c\x3e\x2f\x44\xc1"
+ "\x39\x4f\xba\xcf\x40\x04\xda\x2b\x90\x7e\x4f\xe3\x5d\x5e\x53\x08"
+ "\xf6\x39\x8a\xca\x2a\xbf\x46\xe6\xee\x63\xc7\x0e\x30\x22\x7f\xfa"
+ "\x77\x7f\xef\xd2\x24\x3d\x32\xbd\xad\xf1\x28\x4f\x2e\x41\xe5\xc9"
+ "\x5f\xa2\xf0\x6a\xfa\x36\xfd\xab\xbf\x47\x93\x4f\x64\xae\xc9\x67"
+ "\x6c\xa0\x29\x7b\x9a\xbf\xd1\x27\x72\xe5\xce\x79\x7a\xca\xa3\x1e"
+ "\xf9\xc7\x55\xd1\x74\xfa\x34\xe4\x9a\x7e\x1e\xb9\xaf\x9b\x86\x3c"
+ "\xd6\x9d\x47\xea\xd2\xaa\x4a\x74\xec\x72\x09\x3a\x76\xe3\x14\x3a"
+ "\x76\x1b\x7e\x8d\xf0\x33\xc3\x2f\xed\x14\xf8\x1a\xa1\x51\x57\x10"
+ "\xfe\xae\xa8\xe1\xc9\xd3\xc8\xbb\xd4\x58\x89\xf0\x9a\xde\xab\x54"
+ "\xd5\x76\x8f\x28\xe4\x4d\xff\xaa\x41\xf4\xdb\x1a\x0a\xce\xb9\xe2"
+ "\xe3\xe5\x46\x03\x2a\xad\xaa\xc7\xe7\x57\xc2\x79\xd7\xd4\x2a\xa8"
+ "\xdf\x5c\x82\xbf\x1b\x6a\x28\x4d\x3b\x82\x8c\x99\xfb\xf0\xb8\xe7"
+ "\x4f\x77\x7f\xde\x90\x01\xa6\x36\xd3\x9a\x47\x08\x0e\x2e\x1c\xca"
+ "\x37\xcb\xf5\x75\x15\xd9\xff\xe6\x3d\x4d\x37\xb0\x73\x4f\xf3\x7b"
+ "\x91\xea\xd1\xa7\xce\xd2\x78\x8e\x1f\xce\x25\x94\xd5\x1e\x45\xf8"
+ "\x5d\x53\xf8\x02\x84\x46\x9a\x10\xc2\xb6\x28\x4f\xae\x46\xa3\x13"
+ "\x91\x17\xce\x3f\x9b\x7f\xf7\xef\x56\x5e\x65\x40\x8b\x8d\xf0\x8c"
+ "\x57\xeb\xef\x3c\x63\xd9\xb2\x32\x04\xe7\x7a\x96\xc5\xe8\x91\x47"
+ "\x22\x52\x63\xfb\x1a\xb3\x42\x35\xa3\xa1\xff\x24\xd4\xd2\x34\xb6"
+ "\x2d\xb6\x29\xb6\x2f\xae\xcf\x62\xf3\xf2\x68\x03\x4a\xad\x47\xea"
+ "\xf2\x14\xf8\x37\x99\x36\x94\xa3\xeb\x08\x9e\xf1\x20\xdd\x75\x5f"
+ "\x1a\xe0\x62\x1c\xc6\x82\x9e\xfa\xb5\x14\xfc\xdf\x4d\x02\x53\x59"
+ "\x04\x53\x6e\x37\x1c\xc0\x54\x1e\x87\xa9\x8b\x7d\x39\x4c\x55\xbb"
+ "\x49\x63\xea\xb7\xa9\x2c\xa6\x0a\xdb\x27\xa6\x2e\x9a\xec\x63\xea"
+ "\xe2\x69\x3b\x98\xda\x46\x77\x0f\x4d\x14\x62\xaa\xda\x47\x3e\xa6"
+ "\x7e\x0b\x68\x43\x4c\xe5\x2a\xc3\xd4\x6f\x6a\x21\xa6\x2e\x6a\xa5"
+ "\x31\xa5\x63\xe3\xd4\x03\xe7\x9b\xc7\x94\x8e\x17\xa7\xaa\x17\x73"
+ "\x98\xba\xfc\x86\x34\xa6\x2e\xed\x23\x98\xd2\xb5\xd3\x38\x75\x69"
+ "\x8c\x7d\x4c\x5d\x0a\x94\xc6\x94\x0e\xe2\x54\xa8\x55\x9c\xba\x1c"
+ "\x2b\x1f\x53\x97\xd2\xda\x0e\x53\x3a\x85\x71\xea\x52\xb4\x10\x53"
+ "\xd5\x49\x76\x30\xc5\xc6\xa9\xae\x3f\x3a\x80\x29\x5e\x9c\xba\x7c"
+ "\x9c\xc3\x54\xcd\x4e\x69\x4c\xd5\x74\x62\x31\xd5\x4e\xe3\xd4\xef"
+ "\x5b\xed\x63\xea\xf7\x65\x76\x30\x05\x71\x4a\x67\x15\xa7\x6a\xbe"
+ "\x91\x8f\xa9\xdf\x4f\xb4\x21\xa6\x14\xc6\xa9\xdf\xf7\x0b\x31\x75"
+ "\xb9\x44\x1a\x53\x61\x6c\x9c\x7a\x7a\x75\xf3\x98\x0a\xe3\xc5\xa9"
+ "\x2b\x7d\x38\x4c\x5d\x73\x91\xc6\xd4\xd5\xc9\x04\x53\x61\xed\x34"
+ "\x4e\x5d\x69\xb0\x8f\xa9\x2b\x95\xd2\x98\x0a\x83\x38\xa5\xb3\x8a"
+ "\x53\xd7\xba\xca\xc7\xd4\x55\xff\xb6\xc3\x54\x98\xc2\x38\x75\xd5"
+ "\x43\x88\xa9\x2b\xbe\x76\x30\xc5\xc6\xa9\x37\x87\x3a\x80\x29\x5e"
+ "\x9c\xba\xb6\x80\xc3\xd4\xf5\xf1\xd2\x98\x32\xec\x61\x31\xd5\x4e"
+ "\xe3\x94\x61\x94\x7d\x4c\x19\x02\xec\x60\x0a\xe2\x54\x98\x55\x9c"
+ "\xba\x3e\x5d\x3e\xa6\x0c\x8b\xda\x10\x53\x0a\xe3\x94\x21\x4a\x88"
+ "\xa9\x6b\x89\x52\x98\x6a\xc4\xba\xcf\x05\x30\x15\x03\xba\x0f\x30"
+ "\xe4\x55\x41\x30\xd5\x04\x98\xfa\x84\x8f\xa9\xff\x5a\xeb\xbe\xeb"
+ "\xc7\xcc\x77\x30\x75\xf3\x94\x35\xa6\xcc\x80\xa9\x26\x06\x53\x37"
+ "\xae\x5b\x74\x5f\x79\x4d\x01\xf8\xea\x32\x2a\x8f\x00\x3c\xe5\xb0"
+ "\x78\xfa\x2f\xe0\x09\xda\x63\x86\xf6\x96\x9e\xae\x44\xe1\x06\xd2"
+ "\xae\x46\x68\xaf\x99\x8f\xa5\xc6\x6a\x0a\x63\x08\x63\xc7\x82\xa3"
+ "\x63\x09\x80\x9f\xd9\xc7\xd1\xb1\x79\xf0\x5b\x08\xbf\x14\xf8\xa1"
+ "\xe3\xa8\xb4\x1a\x31\x39\x7b\x0e\x3f\x15\x2c\x7e\x6e\xac\xb5\x8f"
+ "\x9f\x1b\x71\xf2\x34\xde\xcd\x4b\xf2\xf1\x73\xe3\x20\x3b\x97\x4e"
+ "\x1d\x3e\xe6\x2c\x8d\xe7\xcd\x12\x8c\x5c\x46\xe1\x46\xe4\x45\xbf"
+ "\xe9\xdf\xcd\x23\x12\xa9\xdf\x37\x21\x6a\xed\x34\xa4\x5e\xfb\x33"
+ "\xb4\xd7\xd2\x77\xce\x23\x8f\xa3\xf5\x5f\xa3\xd2\x1b\x95\xa8\xf4"
+ "\xf6\x11\x54\x6a\x86\xdf\x65\xf8\xc1\x33\x86\x4f\xe7\xb7\xd7\xc0"
+ "\xb6\xf7\xe6\x62\xa8\xcb\x4f\xba\xbd\x37\x27\x31\xed\x8d\x86\xf6"
+ "\x36\x72\xed\x2d\x07\x2c\x82\x5f\x7a\x9a\x59\x9d\x18\x6e\x40\x9d"
+ "\x66\x1a\x69\xba\x91\xc5\x20\xf6\xcb\xd1\x13\xf5\x28\x3c\x11\x7c"
+ "\xf5\x36\x60\xb0\x6a\x1b\x4a\x5d\x04\x18\x6c\xac\xc7\xef\xf5\x0d"
+ "\xe5\x69\x0d\x80\xc1\x1b\x05\x34\xd8\xad\x09\x63\xf0\xbf\x18\x83"
+ "\xd7\x0f\x9b\xa5\x31\x98\x45\x30\x08\x3a\xb1\x79\x0c\xf2\xe2\x5a"
+ "\xed\x18\x0e\x83\xb7\x27\x4b\x63\xf0\xd6\x5c\x8b\x4e\xfc\xe3\x31"
+ "\x78\xab\xab\x7d\x0c\xd6\x1a\xe4\x69\xc2\xdb\xf1\xf2\x31\x78\x4b"
+ "\xd7\x76\x18\xbc\xed\x62\x1f\x83\xb7\xf4\x0e\x60\x30\x57\x19\x06"
+ "\x6f\xf9\x09\x31\x58\x3b\x42\x1a\x83\x3a\x36\x0e\x82\xae\x6c\x16"
+ "\x83\x7c\x5d\x79\xfb\x24\x87\xc1\xfa\x73\xd2\x18\xac\x6b\xb0\xe8"
+ "\xca\x3f\x1e\x83\x75\xd9\xf6\x31\x58\x97\x24\x4f\x43\xd6\x5f\x97"
+ "\x8f\xc1\xba\xc3\x6d\x87\xc1\xfa\xe5\xf6\x31\x58\x1f\xdd\x3c\x06"
+ "\x75\x0a\xe3\x60\xdd\x36\x21\x06\x6f\x97\xda\xc1\x20\x1b\x07\x41"
+ "\x87\x36\x8f\x41\x5e\x1c\x6c\x78\x83\xc3\x60\xd3\x74\x69\x0c\x36"
+ "\x2e\xb6\xe8\xd0\x3f\x1e\x83\x8d\x3d\xec\x63\xb0\xa1\x5e\x9e\xe6"
+ "\x6c\x9a\x2b\x1f\x83\x8d\x23\xda\x0e\x83\x4d\x9d\xec\x63\xb0\xb1"
+ "\xda\x01\x0c\x2a\x8c\x83\x8d\x01\x42\x0c\x36\x44\x48\x63\x30\x8c"
+ "\x8d\x83\xa0\x5b\x9b\xc5\x20\x5f\xb7\x36\x9d\xe1\x30\x68\xba\x24"
+ "\x8d\x41\x93\x8b\x45\xb7\xfe\xf1\x18\x34\x6e\xb4\x8f\x41\xe3\x22"
+ "\x79\x1a\xd5\xd4\x20\x1f\x83\xc6\xd2\xb6\xc3\xa0\x69\xad\x7d\x0c"
+ "\x9a\xe2\x9a\xc7\x60\x98\xc2\x38\x68\x2c\x14\x62\xb0\xe9\x84\x1d"
+ "\x0c\xb2\x71\x10\x74\x6e\xf3\x18\xe4\xc5\x41\xf3\xd4\x3b\x18\x54"
+ "\xa1\x78\x69\x0c\xd2\xcb\x2d\x3a\xf7\x8f\xc7\x20\xdd\xdb\x3e\x06"
+ "\x69\x24\x4b\xd3\xaa\xd0\x62\xf9\x18\xa4\x23\xda\x0c\x83\x2a\xd4"
+ "\xd5\x3e\x06\x69\x83\x03\x18\x54\x18\x07\xe9\x20\x21\x06\xcd\x91"
+ "\x52\x18\x34\x83\x2e\x6e\xda\x32\x10\x99\xb3\x22\x73\xbd\x5c\xb4"
+ "\xc8\xe8\xfd\x42\x54\x79\x52\x2d\x1a\x7d\x0b\xec\x93\x78\x0b\xbd"
+ "\x75\x4b\x8d\x4c\x59\x91\x2b\x81\x93\x6b\x78\xfa\x99\x99\x5b\x66"
+ "\xcc\xd8\x97\xb6\x2e\x01\xb9\x82\xfe\x1e\x8b\x8f\x95\x5f\xac\x47"
+ "\xf8\xfe\x8b\xf1\xf3\x5c\xe6\x9e\x07\xe7\x09\xe8\x6b\xfe\x6a\xe6"
+ "\x1d\x73\xa3\x1e\x55\x85\x20\x55\x69\x95\x1e\xec\xb0\x90\xf1\x2f"
+ "\xb6\xcb\x45\x95\x4b\xc4\xa6\xab\xc8\xd5\xf8\xab\xa6\x27\xd8\xdb"
+ "\xdb\x73\x3e\x72\xf1\xad\xa2\xcd\xd8\xae\xd8\x5e\xd8\xc6\xda\x85"
+ "\x34\x0d\xe5\x36\x97\x01\xc6\x8c\xbf\xfa\xf7\xcc\x87\x72\xa2\x7a"
+ "\x55\xe5\xb2\x5d\x36\x36\x54\x2e\x71\xcc\xba\x05\x95\xcb\x88\xd2"
+ "\xd3\x48\xf4\xdd\x31\xd8\x2a\xcb\x41\x5b\xe5\xf2\x74\x5e\x2b\xd8"
+ "\x8a\x5a\xe4\x98\xad\xa8\x63\x56\xb6\xb2\xd5\x55\x2a\xea\xa4\x7c"
+ "\x5b\x51\xb9\xc4\x56\x54\x92\xb4\xad\x74\x0e\xe2\x4a\xa7\xe1\xe9"
+ "\x91\x56\xb0\x95\x6a\x9b\x63\xb6\x52\x35\x08\x6d\x25\xc2\xff\x55"
+ "\xae\x2e\xf2\x6d\xa5\x22\x7b\x81\xaa\x54\x05\x76\x6c\xe5\x20\xae"
+ "\x74\xb9\x3c\xde\xdc\x0a\xb6\x72\x3d\xe1\x98\xad\xdc\xfa\x58\xd9"
+ "\xca\x96\xa7\xaa\xdc\xfa\xc9\xb7\x95\x2b\xf9\x1e\x9e\xca\xb5\x54"
+ "\xda\x56\x61\x0e\xe2\x2a\x4c\xc3\xe3\x77\xad\x60\xab\x0e\xc8\x31"
+ "\x5b\x75\x18\x23\xb4\x95\x08\x9f\x52\x75\x78\x43\xbe\xad\x3a\xf8"
+ "\x12\x5b\xb9\xd5\xdb\xb1\x95\x83\xb8\x0a\xcb\xe5\xf1\x90\x56\xb0"
+ "\x55\xc7\x00\xc7\x6c\xd5\x71\xb1\x95\xad\x44\xc6\xfd\x8e\xcb\xe5"
+ "\xdb\xaa\xe3\x08\x62\xab\x8e\x7e\x52\xb6\x32\x65\x85\x7a\x7b\x81"
+ "\x0d\x1a\x72\x9e\x37\x78\x25\x23\xaa\xd1\x0f\xec\xe6\x0d\x76\x5b"
+ "\xa2\x05\xfe\x04\x76\x33\x18\xd1\xe8\x59\x67\xe9\xb2\x1a\x13\x6a"
+ "\x04\x9b\x35\x78\x87\x6a\xca\x0d\xd5\x78\xce\xd1\xb3\xe7\x55\x9d"
+ "\xa6\xbf\x39\x4b\x8d\xb0\xdd\xb0\x1d\xb0\xed\x68\xb0\x1b\x63\x47"
+ "\xef\x69\xfe\x26\xef\xb1\x81\xa3\xae\x9c\xa5\x67\xea\x69\x1a\xb7"
+ "\x97\xf6\x76\xcb\xc0\xef\x05\xc2\xab\x51\x27\xed\x58\xdc\xa6\x4e"
+ "\x3e\xf8\x78\xb9\xa1\x12\xf8\xc1\x0d\xc4\x70\xb3\xb3\xfe\xde\xa6"
+ "\x09\xfe\x1e\xa6\xf2\xc8\x97\xe8\xee\x1d\x0a\x8d\xdd\xc3\xd3\x52"
+ "\xaf\xa0\x0e\x98\x3f\xa4\x9b\x91\x66\x71\x3c\xa2\x76\xbd\x5b\x44"
+ "\x31\x6b\xd7\x66\xe3\x3a\xdc\xcf\x81\x5d\x34\xf4\x4d\xde\x9c\xee"
+ "\x9b\x31\xa8\xfc\x62\x06\xe3\x37\x6b\x8e\xc0\xf8\xed\x27\x7f\x35"
+ "\xf0\xcc\x40\xda\x3b\xd4\x3f\xa3\x0c\x69\xe9\x26\xb0\x71\x0a\xf3"
+ "\x3c\xc7\x36\x35\xca\xb5\xb1\x3b\x33\xff\xdb\xac\x65\xe7\x6f\x81"
+ "\x9d\xf0\xfd\x99\xf9\x5b\x89\xbc\xf9\x5b\xf0\xcc\x77\xe6\x6f\xa9"
+ "\xdc\x13\xf1\xfc\x2d\xf3\x59\x4d\x4f\x4b\xdb\x67\xc6\xd1\x34\xb4"
+ "\xbd\x5b\x59\xad\x01\xe1\xf6\x97\xd5\x16\xa1\xd4\x24\xa4\x2e\x6b"
+ "\xac\x46\x29\xb5\xb4\xa1\x2c\xed\x12\x0a\xbf\x85\x79\x30\xc6\x4b"
+ "\xa7\xc9\xc4\xaf\xee\x81\xe6\xb3\xfe\x3d\xf5\xaa\x4e\xe3\xca\x2a"
+ "\x10\xe2\xad\xe3\x89\x01\xce\xec\x0e\x7e\x88\x29\x4f\x3b\x8f\xc0"
+ "\x27\x85\xe5\xc6\x9f\xb1\x9f\x62\xe0\x7c\xc8\x1d\x7e\xdd\x7d\xec"
+ "\x97\xf8\x18\xf6\x19\x7e\xdf\x84\xf7\x0e\xd8\xc4\xe3\xdf\x18\x17"
+ "\x5e\xc9\x69\xa8\x3c\xb9\x11\x95\x19\x11\x02\x1c\x9d\xfe\x21\xb2"
+ "\x52\x0a\x47\x59\x04\x47\xa1\x89\x5e\xc9\x6e\x37\x1c\xc0\x51\x2e"
+ "\x87\xa3\x07\x76\x3a\x87\xa3\x07\x26\x3b\x8f\xa3\x07\xfa\x3a\x81"
+ "\xa3\x6d\x42\x1c\x79\xf8\xc8\xc7\x51\xe7\x5a\xf9\x38\xea\xbc\xdf"
+ "\x39\x1c\x3d\xb0\x95\xe0\xa8\x73\x32\xc1\xd1\x03\x79\x1c\x8e\x98"
+ "\xb5\x51\xad\x84\xa3\xce\x7e\xd2\x38\xd2\xb1\xf1\x28\x14\xe2\xd1"
+ "\x03\xe7\x9b\xc7\x91\x8e\x17\x8f\x3c\x6f\x39\x87\x23\xcf\xad\xce"
+ "\xe3\xc8\x73\x96\x72\x1c\xe9\xac\xe2\x51\x97\xc9\xf2\x71\xe4\x19"
+ "\x22\x1f\x47\x9e\xc8\x39\x1c\x79\x5e\x21\x38\xf2\x28\x22\x38\xf2"
+ "\xac\xe2\x70\xc4\xac\x37\x6b\x25\x1c\x79\xc4\xd9\xc1\x11\x1b\x8f"
+ "\x74\x10\x8f\xba\xfe\xe8\x00\x8e\x78\xf1\x48\xfd\x9c\x73\x38\xf2"
+ "\xba\xe2\x3c\x8e\xbc\x0e\x38\x81\x23\xab\x78\xa4\xde\x2a\x1f\x47"
+ "\x5e\xcb\xe4\xe3\xc8\x6b\x84\x73\x38\x52\x0f\x26\x38\xf2\x72\x27"
+ "\x38\x52\x07\x70\x38\x62\xd6\xf0\xb5\x12\x8e\xba\xec\x95\xc6\x51"
+ "\x18\x1b\x8f\x74\x10\x8f\x9e\x5e\xdd\x3c\x8e\xc2\x78\xf1\xa8\xdb"
+ "\x72\xe7\x70\xd4\x6d\xb0\xf3\x38\xea\xe6\xa2\x1c\x47\x61\x56\xf1"
+ "\xa8\xdb\x15\xf9\x38\xea\x5a\x2a\x1f\x47\x5d\x33\x9c\xc3\x51\xb7"
+ "\xc5\x04\x47\x5d\x23\x08\x8e\xba\x25\x71\x38\x62\xd6\x45\xb6\x12"
+ "\x8e\xd4\x46\x3b\x38\x62\xe3\x51\x18\xc4\xa3\x37\x87\x3a\x80\x23"
+ "\x5e\x3c\xf2\x3e\xe6\x1c\x8e\xbc\x17\x3b\x8f\x23\xef\x97\x9d\xc0"
+ "\x91\x55\x3c\xf2\x19\x2c\x1f\x47\xde\xde\xf2\x71\xf4\xa7\x4a\xe7"
+ "\x70\xe4\x5d\x4c\x70\xf4\xa7\x5c\x82\x23\xef\x83\x1c\x8e\x98\xb5"
+ "\xa6\xad\x84\xa3\x3f\x0d\x93\xc2\x11\xde\x8b\xe0\x23\xb2\x2f\x44"
+ "\xed\xba\x85\x28\x78\x13\xfe\xb7\x11\x05\xd6\xa5\xfb\xc4\x1d\x5a"
+ "\x44\xf6\x03\xd0\xab\x7c\x98\x7c\xaf\xd8\xf5\x0f\x6c\x07\xbf\x78"
+ "\x87\xaa\xc3\xcf\x90\x3d\x1a\xf0\xbe\x20\x37\x53\x63\xd0\x00\xbc"
+ "\x2f\x83\xaa\xfb\x16\xbc\x8f\xd5\x9d\xbd\x03\xbc\x25\xf6\x0e\x98"
+ "\x28\xbd\x77\x40\x63\x8e\x65\xdd\xed\x36\x6e\xdd\xad\xaa\xfb\x2c"
+ "\xbb\xeb\x6e\x55\xdd\xdf\xd8\x38\x51\x2e\x1e\xba\x33\xeb\xbf\x6e"
+ "\x76\x7f\xde\x50\x97\xde\x3d\x06\xda\xac\x23\x6d\xef\xce\xec\x1f"
+ "\xdc\xfc\x7a\xdc\x6d\x3c\x9c\x74\xf7\x1e\x3f\x09\xa5\xd1\xab\x4f"
+ "\xc6\xd0\x3e\xa1\x6a\x3a\x3b\x54\xee\xb3\x48\x7e\xff\x90\xb5\x77"
+ "\x86\xb8\xbd\x35\xde\xc4\xde\xec\xbe\x05\xde\x12\xfb\x16\x4c\x94"
+ "\xde\xb7\x40\xdc\xde\x0f\xda\x5f\xe7\xac\x7a\xf0\x88\x7c\x7b\x3f"
+ "\x98\x45\xec\x1d\x9a\x58\x97\xfe\x60\x25\x67\x6f\xcd\x38\xf9\xf6"
+ "\x7e\x70\x19\xb1\xf7\x7f\x26\x81\xbd\x33\xc0\xde\x05\xf2\x9e\x45"
+ "\xa3\xb5\x6f\x6f\x9d\x04\xbe\x7b\x2c\x63\xed\xcd\xe2\x5b\x62\xcf"
+ "\x84\x89\xd2\x7b\x26\x88\xdb\xbb\xc7\x18\xfb\xf6\xee\x31\x44\xbe"
+ "\xbd\x7b\xb8\xb2\xf6\x06\x7c\xf7\x18\xc1\xd9\xbb\x87\x83\xfb\x0a"
+ "\xf0\xed\xad\xa9\x25\xf6\xfe\x29\x82\xf6\xd1\x01\xbe\x75\x72\x9f"
+ "\x25\xa3\x19\x7b\x4b\xe0\xbb\x67\x2d\xb1\x37\xbb\x5f\x83\xb7\xc4"
+ "\x7e\x0d\x13\xa5\xf7\x6b\x10\xb7\x77\xcf\x43\xf6\xed\xdd\x73\xbb"
+ "\x7c\x7b\xf7\x4c\x22\xf6\xd6\x01\xbe\x7b\xee\xe7\xec\xfd\xe7\x20"
+ "\xf9\xf6\xee\x19\x4d\xec\x5d\x39\x0c\xec\x0d\xf8\xd6\xc9\xc4\xf7"
+ "\x9f\x91\x7d\x7b\x87\x49\xe0\xdb\x37\x9a\xb5\x37\x8b\x6f\x89\xbd"
+ "\x22\x26\x4a\xef\x15\x21\x6e\x6f\xdf\x81\xf6\xed\xed\xdb\x43\xbe"
+ "\xbd\xff\x5c\xc5\xda\x1b\xf0\xed\xeb\xcf\xd9\xdb\x77\x8b\x7c\x7b"
+ "\xff\xf9\x04\xb1\xf7\xa9\x60\xda\x27\x0c\xf0\x1d\x26\xf3\x59\x7c"
+ "\x13\x9b\xb1\xb7\x04\xbe\x7b\x9d\x20\xf6\x66\xf7\xa9\xf0\x96\xd8"
+ "\xa7\x62\xa2\xf4\x3e\x15\xe2\xf6\xee\xb5\xd9\xbe\xbd\x7b\xad\x92"
+ "\x6f\xef\x5e\xe3\x88\xbd\xc3\x00\xdf\xbd\x72\x39\x7b\x3f\xe4\x2d"
+ "\xdf\xde\xbd\x86\x11\x7b\xff\x1c\x00\xf6\x06\x7c\x87\xc9\xc4\x77"
+ "\x2f\xbd\x94\xbd\xbd\xc0\xde\xc5\xc0\x63\x60\x1c\xc4\xfb\x2c\xa8"
+ "\xc3\x4d\x42\xbb\x97\x27\x07\xa3\xfe\xb7\xb1\xed\x1f\x2e\x82\xb1"
+ "\x43\xd3\x66\xfb\x65\xa8\x1e\xde\xee\xf4\xda\x61\xd5\xc3\x73\x25"
+ "\xd7\x0e\xab\x1e\x9e\x2c\x7b\xed\xb0\xea\x61\x7f\x8e\x03\x3d\x1c"
+ "\xc7\xf9\x54\xcb\xc4\x0f\x59\x6b\x8a\x55\x0f\x6b\x44\xf7\xd1\x50"
+ "\x3d\x54\x82\xd7\x14\xd3\xab\xff\xab\x35\x67\x2b\xe1\x46\x0f\x97"
+ "\x3a\xe0\xeb\x5c\xf0\x43\x86\xb4\xaf\x7b\xef\x00\x5f\xe7\xb6\xd9"
+ "\xbe\x1d\xaa\xde\xd9\xce\xfb\xba\xf7\x54\x69\x5f\xf7\x7e\x59\xbe"
+ "\xaf\x7b\x7b\x73\xfc\xab\x77\x24\xe7\xeb\xde\xf2\xd7\x8f\xab\x7a"
+ "\xbb\x8a\xee\xe7\xa1\xd2\xee\x25\xbe\x3e\xbd\x0c\x7c\xad\x80\x97"
+ "\xf5\xde\xdf\xbc\xaf\x75\x78\xdf\x09\x3b\xfd\xfa\xd1\x5c\x18\x33"
+ "\x35\x6d\xb6\x7f\x88\xea\xd1\x25\xce\xfb\xfa\xd1\x51\xd2\xbe\x7e"
+ "\x74\xb0\x7c\x5f\x3f\x8a\x38\xee\xf7\xe8\x30\xce\xd7\x8f\x56\xca"
+ "\xf7\xf5\x23\x06\xd1\x7d\x45\x54\x8f\x14\x10\x5f\x9f\xa9\x36\x67"
+ "\x2b\xe1\x84\x8f\x6e\x71\xc0\xd7\xd0\xaf\x75\x76\xfa\x75\x9f\x65"
+ "\xe0\xeb\xdc\x36\xdb\xc7\x44\xd5\x27\xde\x79\x5f\xf7\x19\x22\xed"
+ "\xeb\x3e\xbd\xe5\xfb\xda\xaf\x86\xe3\x9d\x7d\x02\x39\x5f\xf7\x39"
+ "\x2c\xdf\xd7\x7e\xa7\x45\xf7\x37\x51\xf9\xad\x21\xbe\x3e\x3b\x12"
+ "\x7c\xad\x80\x8f\xf6\x91\xe4\xff\x9c\xaf\xc3\xf0\x3e\x1c\x76\xfa"
+ "\xf5\xe3\x89\xc0\x15\x34\x6d\xb6\x9f\x8a\xea\xf1\x37\x9c\xf7\xf5"
+ "\xe3\x7d\xa4\x7d\xfd\xb8\xa7\x7c\x5f\x3f\x56\xc9\x71\xde\xc7\x7d"
+ "\x39\x5f\x3f\x5e\x28\xdf\xd7\x8f\x95\x88\xee\xb3\xa2\x7a\x2c\x99"
+ "\xf8\x5a\x5f\x68\xce\x56\xc2\x85\x1f\x5f\xe4\x80\xaf\xa1\x5f\x87"
+ "\xd9\xe9\xd7\x7d\x41\xd7\x87\xe5\xb6\xd9\xbe\x2e\xaa\xbe\xc3\x9d"
+ "\xf7\x75\xdf\xae\xd2\xbe\xf6\x6f\x90\xef\x6b\xff\xc3\x1c\xdf\xee"
+ "\xeb\xce\xf9\xba\x6f\x9e\x7c\x5f\xfb\xef\x15\xdd\xef\x45\xe5\x1f"
+ "\x4d\x7c\x7d\xde\x1b\x7c\xad\x80\x87\xf7\x8d\x51\xc2\xc3\xe7\x6c"
+ "\x44\xee\x42\x7f\x3f\x39\xb2\x6d\xb9\xf8\x93\x83\x9d\xf7\xf7\x93"
+ "\x2e\xd2\xfe\x7e\xe2\x92\x7c\x7f\x3f\xb1\x97\xe3\xe2\x4f\xd4\x73"
+ "\xfe\x7e\x72\x8d\x7c\x7f\x3f\xb1\x45\x9c\x8b\x3f\x31\xce\x39\x2e"
+ "\xfe\x64\xa4\x12\x2e\x6e\xeb\xef\x7e\x21\x6d\xcb\xc7\xfb\xf5\x71"
+ "\xde\xdf\x01\xd7\xa5\xfd\x1d\x70\x4a\xbe\xbf\x03\xb6\x70\x7c\x3c"
+ "\xa0\x9a\xf3\x77\xbf\x45\xf2\xfd\x1d\x90\x25\xce\xc7\x03\x86\x39"
+ "\xc7\xc7\xfb\x8d\x50\xc2\xc7\x6d\xfd\x3d\x20\xa0\x6d\x39\xf9\x00"
+ "\x1f\xe7\xfd\xdd\xff\x9c\xb4\xbf\xfb\x1f\x91\xef\xef\xfe\x59\x1c"
+ "\x27\xef\xcf\xcb\x7f\x0f\x88\x93\xef\xef\xfe\xcb\xc4\x39\x79\xff"
+ "\x20\xe7\x38\xf9\x80\x60\x25\x9c\xdc\xd6\xdf\x03\x7d\xdb\x96\x97"
+ "\x0f\x74\x73\xde\xdf\x81\xc7\xa5\xfd\x1d\x78\x40\xbe\xbf\x03\x97"
+ "\x71\xbc\x3c\xb0\x84\xf3\xf7\x40\xf9\xfb\x67\xaa\x02\x93\xc4\x79"
+ "\x79\xa0\x9f\x73\xbc\x7c\xa0\xbf\x12\x5e\x6e\xeb\xef\xa7\x3c\xda"
+ "\x96\x9b\x0f\xba\xe5\xbc\xbf\x07\x1d\x92\xf6\xf7\xa0\xed\xf2\xfd"
+ "\x3d\x28\x89\xe3\xe6\x83\x78\xf9\xff\xa7\x46\xca\xf7\xf7\xa0\x68"
+ "\x71\x6e\x3e\xc8\xdb\x39\x6e\xfe\x94\x46\x09\x37\xb7\xf5\x77\x90"
+ "\xb1\x6d\xf9\x79\xd0\x05\xe7\xfd\x1d\xb4\x47\xda\xdf\x41\x1b\xe4"
+ "\xfb\x3b\x28\x9a\xe3\xe7\x41\xdb\x38\x7f\x0f\x0e\x91\xef\xef\xa0"
+ "\x71\xe2\xfc\x3c\xc8\xd5\x39\x7e\x3e\xd8\xdd\xf9\x3c\xf9\x5f\x2a"
+ "\x31\x37\x97\xbb\xff\x63\x79\x12\xbb\xe6\x4e\x35\x98\xdb\xff\x51"
+ "\xf5\x17\xe6\xdb\x2a\xa2\x7b\xcb\xa8\xfe\xd2\xa7\x5d\xef\xff\xa8"
+ "\x7a\xda\xfe\xfe\x8f\xaa\xa7\xe5\xed\xff\xa8\xfa\x8b\xa7\xfc\xf9"
+ "\xf8\x4f\x57\x72\x1a\xe1\x2f\x3c\xfd\x1f\xcc\xf4\xeb\x76\xbd\x2f"
+ "\xa4\xea\x69\xe1\xbe\x90\xaa\xc1\xcc\xbe\x90\xf4\xea\x5f\x93\x95"
+ "\x69\x91\xbf\x54\x39\xff\x5e\xe0\x99\xbd\x58\x87\xc8\xdd\x87\x92"
+ "\xc3\x76\xf0\x1e\x0e\xdb\xcf\x6c\x95\xc6\xf6\x33\x2e\xed\x7a\x1f"
+ "\x4a\xd5\x90\xe5\xf6\xb1\x3d\x24\x5a\xd6\x9e\x23\xaa\x21\xf2\xf7"
+ "\xbd\x51\x0d\xd9\xcb\xe9\xa1\x21\x3c\xfd\xfb\x4c\x6d\x1b\x62\x5b"
+ "\xd9\x7e\x4a\xaa\x21\xb9\x42\x6c\x07\x6f\x23\xd8\xbe\x50\xaa\x4c"
+ "\x77\x3d\x53\xe4\xfc\x7b\x90\xe7\x32\xb0\xe6\x92\xbb\x1f\x26\x87"
+ "\xed\x67\xd7\x72\xd8\x7e\x6e\x89\x34\xb6\x43\xce\xb4\xeb\xfd\x30"
+ "\x55\x21\x53\xed\x63\x3b\x44\x27\x6b\x2f\x13\x55\x48\xb1\x7c\x6c"
+ "\x87\x64\x70\xda\x2f\xe4\x04\x87\xed\xe7\x2a\xda\x0e\xdb\x0a\xf7"
+ "\xc9\x54\x85\x24\x09\xb1\xfd\xec\x32\x82\xed\x6a\xad\x32\x8d\xf9"
+ "\x5c\x9e\xf3\xef\x7d\x74\x71\x58\x5f\xca\xdd\x97\x93\xc3\xf6\xf3"
+ "\xb1\x1c\xb6\x75\x36\xfb\x42\x71\xd8\x0e\x3d\xd0\xae\xf7\xe5\x54"
+ "\x85\x3e\x67\x1f\xdb\xa1\xbe\xb2\xf6\x48\x51\x85\x6e\x96\x8f\xed"
+ "\xd0\x38\x4e\xe7\x86\x16\x72\xd8\xd6\xed\x68\x43\x6c\x2b\x8c\xdb"
+ "\xa1\x11\x42\x6c\x3f\x1f\x45\xb0\x7d\x39\x49\x99\x9e\xd6\x25\x3b"
+ "\xff\x9e\xeb\x85\x11\x58\x4b\xcb\xdd\x1f\x94\xc3\x76\xd8\x70\x0e"
+ "\xdb\x2f\x0c\x91\xc6\xf6\xd0\xec\x76\xbd\x3f\xa8\x6a\xa8\xfd\xfd"
+ "\x7f\x54\x61\x76\xf6\xff\x11\x5b\x2b\x3c\x54\xfe\xbe\x17\xaa\xa1"
+ "\x23\x38\x4d\x3f\x74\x0d\x87\xed\x17\x56\xb6\x1d\xb6\x15\xee\x1b"
+ "\xaa\x1a\x1a\x20\xc4\x76\x58\x08\xc1\x76\x4d\x89\xb2\xdc\xc1\x0b"
+ "\xe3\x9c\x7f\xaf\xf7\xa2\x1f\xce\x1b\xc8\xdd\xa7\x94\xc3\xf6\xb0"
+ "\xde\x1c\xb6\x5f\xf4\x91\xc6\xf6\xf0\x59\xed\x7a\x9f\x52\xd5\xb0"
+ "\x5b\xf6\xb1\x3d\xec\x84\xbc\x3d\x5d\x86\x2b\x58\x07\x3f\xdc\x8f"
+ "\xcb\x5f\x0c\xe7\xcd\x7f\x7f\x31\xba\x0d\xb1\xad\x30\x6e\x0f\x77"
+ "\x17\x62\x7b\x98\x86\x60\xfb\x9a\xaf\xb2\x3c\xc9\x8b\x81\xce\xe7"
+ "\x49\x5e\x0e\x64\xde\x61\xca\xdc\x2f\x95\xc3\xf6\x8b\x26\x6e\x6f"
+ "\xa2\x97\x7b\x5b\x63\xfb\xce\xde\x44\xaa\x11\x43\xda\xcd\x7e\xa9"
+ "\xaa\x97\xbe\xb1\x8f\xe3\x97\xf2\xe4\xe5\x44\x46\xf4\x96\x8f\xe3"
+ "\x97\x6a\xb8\x9c\xc8\x08\xde\xfc\x97\x97\x2d\xdf\x24\x6f\x83\x3d"
+ "\x8b\x46\x14\xdb\xdd\xb3\x48\x35\x62\x4b\xab\xed\xa3\xaa\x7a\xa9"
+ "\x42\xb0\x67\x91\xea\xc5\x5a\x33\xd3\x17\xae\x27\x2a\xcb\xab\xbc"
+ "\x1c\xe2\x7c\x5e\x65\x24\x79\xbf\x2b\x73\xdf\x56\xae\x2f\xbc\xd2"
+ "\x89\xeb\x0b\x23\xfb\x49\xf7\x85\x57\x87\xb7\x9b\x7d\x5b\x55\xaf"
+ "\x1c\xb1\xdf\x17\x5e\xd9\x26\x2f\x87\xf2\xaa\x82\x7d\x60\x5e\xa9"
+ "\xe7\x72\x28\xaf\x86\x70\x7d\x61\xe4\xa2\xb6\xeb\x0b\xaf\x1e\xb7"
+ "\xdf\x17\x5e\x2d\x6c\xb5\xfd\x5c\x55\xaf\x9c\x16\xf6\x85\x57\x10"
+ "\xe9\x0b\x37\x6b\x95\xe5\x61\x46\x2a\x7a\xff\x2d\xec\x0b\xe1\x23"
+ "\x98\x77\xdf\x32\xf7\x8f\xe5\xfa\xc2\x28\x1f\xae\x2f\x84\xdb\xf0"
+ "\x79\xae\x2f\x8c\x1e\xd3\x6e\xf6\x8f\x55\x8d\x3a\x69\xbf\x2f\x8c"
+ "\xda\x2b\x2f\xe7\x32\x7a\x88\xfc\xbe\x30\x9a\xb7\xfe\x69\x34\x6f"
+ "\xfd\x53\xf8\xca\xb6\xeb\x0b\xa3\xcf\xd8\xef\x0b\xa3\x0f\xb6\xda"
+ "\xbe\xb2\xaa\x51\xd5\xc2\xbe\x30\xca\x83\xf4\x85\xdb\xc9\xca\xf2"
+ "\x36\xe1\x0e\xf0\xff\xe6\xf2\x36\xf0\x2c\x3e\xcc\xbb\x7e\x59\xfb"
+ "\xd8\x72\x7d\x21\xa2\x37\xd7\x17\xc6\x0e\x97\xee\x0b\x63\x26\xb7"
+ "\x9b\x7d\x6c\x55\x11\xe7\xec\xf7\x85\x88\x22\x79\x39\x9a\x31\xc3"
+ "\xe5\xf7\x85\x31\x6a\x2e\x47\x33\x66\x1c\xd7\x17\xc6\x66\xb5\x5d"
+ "\x5f\x18\x73\xc9\x7e\x5f\x18\x53\xd2\x6a\xfb\xdb\xaa\x22\x6a\x85"
+ "\x7d\x21\x42\x43\xfa\x42\xbd\x51\x59\x9e\x67\x6c\x94\xf3\x79\x9e"
+ "\xf1\x51\xcc\x9c\x09\x99\xfb\xe9\x72\x7d\xe1\xb5\x7e\x5c\x5f\x18"
+ "\x3f\x46\xba\x2f\x8c\x8b\x6d\x37\xfb\xe9\xaa\x5e\xbb\x62\xbf\x2f"
+ "\xbc\x56\x2a\x2f\xa7\x33\x6e\x8c\xfc\xbe\x30\xce\x97\xcb\xe9\x8c"
+ "\x8b\xe2\xfa\xc2\xf8\x82\xb6\xeb\x0b\xe3\x6e\xd9\xef\x0b\xe3\x4e"
+ "\xb4\xda\x3e\xbb\xaa\x71\x48\xd8\x17\x5e\xf3\x23\x7d\xa1\x29\x4d"
+ "\x59\x5e\x68\x7c\x9c\xf3\x79\xa1\xc8\x38\x66\x3e\x89\xcc\x7d\x7d"
+ "\xb9\xbe\xf0\xfa\x10\xae\x2f\x44\x4a\x7f\xe7\x41\x35\x61\x6e\xbb"
+ "\xd9\xd7\x57\xf5\xba\xfd\xef\x1f\xa9\x5e\xb7\xf7\xfd\x23\x91\x1c"
+ "\xd0\x84\xc9\xf2\xfb\xc2\x04\x7f\x2e\x07\x34\x81\xb7\xfe\x2f\x72"
+ "\x47\xdb\xf5\x85\x48\xfb\xdf\x7f\x50\x4d\x70\xe0\xfb\x0f\x0a\xf7"
+ "\xfb\x55\x4d\xf0\x10\xf6\x85\xd7\x03\x49\x5f\x30\xbb\x2a\xcb\x23"
+ "\x45\x36\x9b\xff\xc7\x3a\xbf\xc9\xdb\x36\x8f\x54\x5a\x15\x8c\x9e"
+ "\x9c\x88\xfb\xc2\x44\xad\x31\x3b\x54\x83\xf7\x17\x36\xf9\xb1\x7b"
+ "\x50\x2e\x61\xf7\x78\xa9\x35\x92\x3d\x28\x0d\xa6\x3b\x7b\x50\x92"
+ "\xbd\x3f\x10\x85\xd7\x02\xe3\x35\xc1\x46\x35\xd9\x7f\x92\xc6\x73"
+ "\xa2\xf0\x1c\xa9\xf3\x25\xcc\xfe\x2a\x8b\x8c\xd0\xf6\x8b\xcd\xec"
+ "\x3f\x19\xa5\x47\xa5\x51\x0b\x91\xb1\xeb\xbe\x34\xb2\x4e\xf8\x8d"
+ "\x42\x66\xff\xc9\x29\x9a\x9e\xe9\xbf\x20\x6f\x2f\xbc\xff\x64\x14"
+ "\x6d\x4e\xd5\xd3\x86\x32\x50\x9a\xa5\x51\x60\xdf\xa9\x96\x3d\x28"
+ "\x27\xf6\xc0\x6d\x37\x4e\xf1\xef\x99\xff\x8b\xd4\xfe\xc2\x13\x15"
+ "\xec\x03\xfb\x46\x29\x97\xdf\x99\xa8\xe6\x30\x3a\x91\x19\x83\xe1"
+ "\xfc\xb6\xd2\x48\x88\x31\xe9\x68\x65\x93\xa2\xbd\x37\x26\x06\x38"
+ "\xe0\x33\x3c\x47\xc4\x26\x7e\x71\x3e\x7b\xf3\x04\xf8\x2c\x17\xef"
+ "\x73\xec\xb8\xcf\xdc\x6e\xb4\x8e\xcf\xde\x8c\x76\xdc\x67\x6f\x1e"
+ "\xb3\xf2\x99\x48\x1e\xe2\xcd\x7d\xf2\x7d\xf6\x66\x1a\x97\x87\x78"
+ "\xf3\x30\xe7\xb3\x49\xde\xc4\x67\x6f\x4e\x22\x3e\x73\xd9\xdb\xa4"
+ "\x68\xff\x8e\x37\xf5\xcd\xfb\x8c\x99\xfb\x60\xa7\x9f\x4d\x5e\x69"
+ "\xcc\x06\xed\x0e\xba\xdc\x71\x9f\x3d\x70\xbe\x75\x7c\x36\x59\xe3"
+ "\xb8\xcf\x26\x2f\x11\xfa\x4c\x4c\x2f\x4f\x96\xff\xcd\x4e\xd5\xe4"
+ "\x20\x4e\x2f\x4f\x4e\xe6\x7c\x36\xb9\x84\xf8\x6c\xb2\x9a\xf8\x8c"
+ "\xd2\x37\x29\xda\x03\x64\x72\x96\x03\x3e\xc3\xef\xf4\xed\xf4\xb3"
+ "\x29\x21\xe0\xb3\x5c\xbc\xef\xb3\xe3\x3e\xeb\xfa\x63\xeb\xf8\xec"
+ "\xad\x52\xc7\x7d\x36\x65\xb0\x95\xcf\x44\x74\xdd\x94\x5e\xf2\x7d"
+ "\xf6\x56\x35\xa7\xeb\xa6\x04\x70\x3e\x9b\xb2\x88\xf8\xec\xad\xc3"
+ "\xc4\x67\xae\x1e\x4d\x8a\xf6\x11\x99\xd2\x6c\xfe\x0b\xf3\xd0\x26"
+ "\x6f\x5b\x9d\xc3\xf9\x2c\xca\x60\xcc\x06\x2d\x04\x3a\xc7\x71\x9f"
+ "\x3d\xbd\xba\x75\x7c\x16\x95\xe6\xb8\xcf\xa2\x2e\x09\x7d\x26\xa6"
+ "\x3f\xa2\x8e\xcb\xf7\x59\x54\x1e\xa7\x3f\xa2\xf4\x9c\xcf\xa6\x06"
+ "\x12\x9f\x45\x25\x13\x9f\xb9\x05\x37\x29\xda\x8b\x24\xca\xe8\x80"
+ "\xcf\xf0\x3b\x58\x3b\xfd\x6c\xda\x16\xf0\x59\x2e\xde\x07\xdb\x71"
+ "\x9f\xbd\x39\xb4\x75\x7c\x36\x2d\xc8\x71\x9f\x4d\xdb\x68\xe5\x33"
+ "\x11\x9e\x3c\x4d\xc1\x3e\xd8\xd3\x22\x38\x9e\x3c\x2d\x8b\xf3\xd9"
+ "\xb4\x2a\xe2\xb3\x69\x01\xc4\x67\x1d\xa2\x9b\x14\xed\x67\x32\x4d"
+ "\x72\xff\x2f\x7b\xbc\xd1\x32\x2f\x9f\xf3\x5b\xf4\xa4\xf6\xc3\x1d"
+ "\xdf\xae\x71\xdc\x6f\xd1\xe3\x9b\xe7\x8e\xd1\xcf\xc9\xf7\x5b\xb4"
+ "\x3b\xc7\x1d\xa3\x47\x72\x7e\x8b\xce\x23\x7e\x7b\xbb\xca\x39\xee"
+ "\x18\xdd\xec\xfa\x57\x31\xee\x68\xeb\xb7\x19\xde\xed\x87\x3f\x4e"
+ "\xdf\xe2\xb8\xdf\x66\x78\x36\xcf\x1f\xa7\xdf\x92\xef\xb7\xe9\x45"
+ "\x1c\x7f\x9c\xe1\xca\xf9\x6d\xc6\x38\xe2\xb7\xe9\x79\xce\xf1\xc7"
+ "\x19\x5a\x25\xfc\xd1\xd6\x6f\xef\x94\xb6\x1f\x0e\xf9\xce\x24\xc7"
+ "\xfd\xf6\x4e\x71\xf3\x1c\xf2\x9d\x9d\xf2\xfd\xf6\x4e\x32\xc7\x21"
+ "\xdf\x39\xc8\xf9\x2d\xc6\x83\xf8\xed\x9d\x71\xce\x71\xc8\x77\x2a"
+ "\x95\x70\x48\x5b\xbf\xc5\x2e\x6b\x3f\x3c\x32\xd6\xdb\x71\xbf\xc5"
+ "\x2e\x6e\x9e\x47\xc6\xca\xff\x66\xb1\x2a\x36\x90\xe3\x91\xb1\x49"
+ "\x9c\xdf\x62\xd9\x6f\xb0\xc4\x7a\x38\xc7\x23\x63\x9b\xdd\xff\x43"
+ "\x8c\x47\xda\xfa\xed\xbd\x90\xf6\xc3\x25\xdf\x95\xc1\xff\xdf\xb3"
+ "\xe2\xff\x62\x5c\xf2\x3d\x05\xfc\xff\x5d\x0b\xff\x87\xfe\xf6\x1e"
+ "\x8f\xff\xbf\xc7\xf2\xff\x77\x0f\x3b\xc7\x25\xdf\x73\x84\xff\xdb"
+ "\x70\x49\x5b\xbf\xc5\xd5\xb6\x1f\x3e\x19\xb7\xcc\x71\xbf\xc5\x5d"
+ "\x69\x9e\x4f\xc6\x29\xf8\x0e\x54\x5c\x01\xc7\x27\xe3\xaa\x38\xbf"
+ "\xc5\x07\x11\xbf\xc5\x2d\x72\x8e\x4f\xe2\x4f\xdb\xd9\xf7\x9b\xc9"
+ "\x3b\x54\x43\x8b\xe4\x21\x8f\xc5\x04\xb3\x7b\x13\xce\x3c\x6c\xf2"
+ "\x09\xd5\xc8\xfd\xbe\x8b\x65\xcf\xe9\x23\xc0\x8c\xce\xab\x66\x4e"
+ "\x76\x6e\xdf\xe9\x99\x9e\xce\xef\x3b\x9d\x70\xaa\xe5\xbe\xef\x92"
+ "\x70\x48\xfe\xbe\xd3\x09\x6b\x38\x0e\x9a\x50\xc1\xf9\x3a\x91\x99"
+ "\x9f\x20\x6f\x3f\xea\x84\x08\xe7\xf6\xa3\x9e\x39\x9e\xe0\x2b\x41"
+ "\x4d\xf6\xa3\x9e\x39\xb2\x6d\xbe\xfb\x12\x7f\x10\xef\x47\x4d\xa7"
+ "\x77\xcc\x50\xb6\x3f\xf2\xcc\x0a\x07\xf0\x9c\x4b\x8b\xe4\x68\x39"
+ "\x3c\xcf\xce\x02\x3c\xe7\xca\xfd\xce\x8c\x10\xcf\xb3\xfb\x39\x87"
+ "\xe7\x59\x67\x9c\xc7\xf3\xac\xed\x2d\xf7\x9d\x99\x59\x99\xf2\xf1"
+ "\x3c\x6b\x12\xc7\xcd\x67\x15\x70\x78\x9e\x7d\x42\x3e\x9e\x67\x69"
+ "\x9d\xc3\xf3\xec\x3e\x04\xcf\x89\x7a\x82\xe7\xd9\xbe\x6d\xf3\xfd"
+ "\x99\xc4\x35\x04\xcf\x9d\x2a\x95\xed\x3f\x3d\xbb\xa0\x79\x3c\xeb"
+ "\x34\xb4\x48\xfe\x9a\xc3\xf3\xdc\x68\x93\x8f\x4e\x23\xf7\x7b\x37"
+ "\x42\x3c\x27\x99\x9c\xc3\x73\xd2\x4e\xe7\xf1\x9c\xb4\xa0\xe5\xbe"
+ "\x77\x93\x34\x55\x3e\x9e\x93\x02\x38\xcd\x92\x94\xc8\xe1\x79\xee"
+ "\x16\xf9\x78\x9e\x63\x70\x0e\xcf\x49\xb7\x08\x9e\xe7\x14\x12\x3c"
+ "\x27\xd5\xb4\xcd\x77\x70\xe6\x4c\x22\x78\xf6\xd0\x2a\xdb\xdf\x7b"
+ "\xae\xe4\xfe\xc7\x3c\x3c\xe7\xd2\x22\xb9\x7d\x0e\xcf\xc9\x41\x80"
+ "\xe7\x5c\xb9\xdf\xdd\x11\xe2\x79\xbe\x93\xdf\xb9\x98\xdf\x02\xdf"
+ "\xb9\x98\xef\xc4\x77\x2e\xac\xbf\xbb\x33\x7f\xa0\x7c\x3c\xcf\x33"
+ "\x72\x5a\x6e\xbe\x8e\xc3\x73\x72\x92\x7c\x3c\xcf\x2b\x72\x0e\xcf"
+ "\xf3\xd9\xef\x5f\xcc\x4b\x23\x78\x9e\x7f\xb0\x6d\xbe\xc7\x33\x2f"
+ "\x80\xe0\xb9\x4b\x8c\xb2\xfd\xd3\x93\x75\xcd\xe3\x39\x4c\x43\x8b"
+ "\xbc\xf7\xe0\xf0\xfc\xbe\xab\xc9\x27\x4c\x23\xf7\xfb\x3f\x42\x3c"
+ "\x2f\xdc\xe8\x1c\x9e\x17\x8e\x72\x1e\xcf\x0b\x7b\xb4\xdc\xf7\x7f"
+ "\x16\xba\xc8\xc7\xf3\x82\x52\x4e\xe3\x2e\xe4\xbd\xff\x7f\x7f\x98"
+ "\x7c\x3c\x2f\x70\xf2\xbb\x40\x0b\xb3\x09\x9e\x17\xb0\xdf\x05\x5a"
+ "\xb8\xa6\x6d\xbe\x0b\x94\x6c\x24\x78\x56\x17\x2a\xdb\x9f\xfe\x7d"
+ "\xb5\x03\x78\xce\xa5\x45\xde\x09\x71\x78\x5e\x7c\x02\xf0\x9c\x2b"
+ "\xf7\x3b\x44\x42\x3c\x2f\x8e\x77\x0e\xcf\x8b\x7b\x39\x8f\xe7\x45"
+ "\x97\x5a\xee\x3b\x44\x8b\x8e\xcb\xc7\xf3\xa2\x3c\x4e\xfb\x2f\xe2"
+ "\xbd\xff\x4b\x51\xf0\x7d\xa2\x45\x51\xce\xe1\x79\xf1\x74\x82\xe7"
+ "\x45\x5a\x82\xe7\xc5\x93\xda\xe6\xfb\x44\xef\x97\x12\x3c\x77\xab"
+ "\x57\xb6\xff\xff\xe2\x66\xe7\x7f\x88\xe5\x37\x2c\x79\x29\x0e\xd3"
+ "\x69\xdb\x9c\xcf\x71\xa4\x85\x39\x87\xe9\xd4\xeb\xce\x63\x3a\xf5"
+ "\x9b\x96\xcb\x71\xa4\x2a\xf8\xd6\x5f\x6a\x22\x97\xe3\x48\xdd\xcb"
+ "\x61\x3a\xad\x5a\x3e\xa6\x53\x83\x9c\xc3\x74\xda\x10\x82\xe9\x94"
+ "\x5a\x82\xe9\xb4\xc0\xb6\xc9\x71\xa4\x14\x38\x97\xe3\x48\xdb\xab"
+ "\x24\xc7\x61\x8b\xe9\x0f\x16\x39\x9f\xe7\xf8\xc0\xc7\x39\x4c\x2f"
+ "\x2d\x76\x1e\xd3\x4b\x33\x5b\x2e\xcf\xb1\x74\x81\x7c\x4c\x2f\x1d"
+ "\xc6\xe5\x39\x96\xae\xe4\x30\xfd\xc1\x41\xf9\x98\x5e\xea\xee\x1c"
+ "\xa6\x3f\xf0\x24\x98\x5e\x52\x42\x30\xfd\x81\x6b\xdb\xe4\x39\x96"
+ "\x24\x39\x97\xe7\xf8\x60\xa5\x92\x3c\x87\x2d\xa6\x57\x44\x38\x9f"
+ "\xeb\x58\x7e\xc9\x39\x4c\x2f\xdf\xe0\x3c\xa6\x97\x4f\x6f\xb9\x5c"
+ "\xc7\xf2\x51\xf2\x31\xbd\x5c\xc3\xe5\x3a\x96\x4f\xe2\x30\xbd\x22"
+ "\x43\x3e\xa6\x97\x9d\x76\x0e\xd3\xcb\xcf\x11\x4c\x2f\xcb\x23\x98"
+ "\x5e\x5e\xd9\x36\xb9\x8e\x65\x23\x9c\xcb\x75\xac\x98\xa4\x24\xd7"
+ "\x61\x8b\xe9\x55\x7e\xce\xe7\x3b\x56\x7e\xe3\x1c\xa6\x57\xc6\x3b"
+ "\x8f\xe9\x95\x43\x5a\x2e\xdf\xb1\xb2\xb7\x7c\x4c\xff\x0f\xef\xfb"
+ "\x17\x2b\x79\xeb\xff\x57\x45\xcb\xc7\xf4\xff\x14\x3a\x87\xe9\x95"
+ "\xfb\x08\xa6\xff\x27\x91\x60\x7a\xe5\x8e\xb6\xc9\x77\xfc\x8f\xaf"
+ "\x73\xf9\x8e\x55\xcd\xee\x7f\x21\x96\xef\xb0\xc5\xf4\x87\xf5\xce"
+ "\xe7\x3c\x3e\xcc\x74\x0e\xd3\x1f\x86\x39\x8f\xe9\x0f\x3d\x5b\x2e"
+ "\xe7\xb1\xfa\x96\x7c\x4c\xaf\x2e\xe2\x72\x1e\x1f\xf2\xe6\x3f\xad"
+ "\x09\x96\x8f\xe9\xd5\xcb\x9c\xc3\xf4\x87\xab\x08\xa6\x57\x0f\x23"
+ "\x98\xfe\x30\xad\x6d\x72\x1e\xab\x0c\xce\xe5\x3c\xd6\xb8\x2a\xc9"
+ "\x79\xd8\x62\x3a\xbd\xd4\xf9\xbc\x47\xfa\x74\xe7\x30\x9d\xee\xe3"
+ "\x3c\xa6\xd7\x9e\x6b\xb9\xbc\xc7\xda\x23\xf2\x31\xbd\x36\x8b\xcb"
+ "\x7b\xac\xe5\xed\x7f\xbf\xce\x43\x3e\xa6\xd7\x46\x3a\x87\xe9\xf4"
+ "\xc9\x04\xd3\x6b\x35\x04\xd3\xe9\xe3\xda\x26\xef\xb1\xe6\xb0\x73"
+ "\x79\x8f\x74\x9b\xf9\x6f\x73\xa6\x27\x44\x6b\x67\xce\x98\x31\x67"
+ "\x7a\x92\x76\x4e\x5c\xec\xdb\xd3\x9f\xeb\x63\xf9\xff\x73\x81\xc9"
+ "\x7d\x92\x3b\xa3\xe8\xf8\xa9\x53\xe6\x0d\xe2\x4e\xc6\x4d\x4f\x80"
+ "\x7f\x3a\xa3\x98\xa9\x73\x62\xb4\x49\x0b\x12\xa7\x6b\xf1\xff\xe2"
+ "\xdf\x4e\x84\x22\x33\x93\xb8\x23\x63\xa7\xc7\x4d\x4d\x8e\x4d\x78"
+ "\x47\x3b\x35\x2e\xf6\x9d\x84\xf8\xe9\x09\x49\xda\xd9\xd3\x67\xcd"
+ "\x8d\x9d\x3d\x1d\xff\x3d\x47\x3b\x63\xe6\x6c\x38\xf0\xf6\xf4\xd8"
+ "\x79\xd3\xb5\xd3\xe6\xce\x98\x31\x7d\xf6\x9c\xce\x68\xd4\xdc\xb8"
+ "\xa4\xd8\xc4\xb8\xe9\xda\x61\xa3\xc2\xfa\x8d\x1b\xfe\xda\xb8\xd0"
+ "\xd0\xce\x88\xf7\xed\x69\x2d\x9d\x35\x4d\x0b\x18\x72\xbd\xa8\xfa"
+ "\xc4\xb3\x0c\xd8\xe8\x5a\xc0\xe6\xba\xd9\x48\xbd\x7a\x36\x72\x5d"
+ "\x75\x03\xb9\xaf\xbd\x81\x3c\xcc\x39\x6e\xb9\xda\x77\x91\x8e\xee"
+ "\x3a\x2f\x71\xdd\x0d\xe4\x6d\xce\xfc\xd2\x40\x67\xee\x2a\x34\x74"
+ "\xfd\x6b\x01\x2e\x4b\x77\xcd\xa9\xc0\xc7\xc1\x17\xae\x74\xe6\xbe"
+ "\xa8\xf3\xaa\x8f\x4b\x0d\x5d\x73\xd3\x52\x2f\x21\x8a\xee\x92\x11"
+ "\xbc\xcb\x6c\xa0\x0e\xe1\xb7\x1d\x60\x2b\xa4\xca\x8c\x80\x5f\x08"
+ "\xfc\x6a\xe0\x67\x44\xaa\xf5\x23\xe0\x97\x08\xbf\x64\xf8\x55\x21"
+ "\xd5\x47\xfe\xf0\x8b\x84\x5f\x34\xfc\xe0\xd8\x47\x6b\xe0\x97\x85"
+ "\x54\x59\x70\x3c\x0b\xca\x66\xc1\xb9\xac\x44\x52\x4f\x16\x9c\xcf"
+ "\xaa\x47\xaa\x6c\x2d\xfc\x82\xe1\x07\x75\xe6\x78\xc0\x2f\x17\x7e"
+ "\x7e\xf0\x0b\x84\x1f\x1c\xcf\x19\x07\x3f\x5c\x76\x11\x39\xf7\xd7"
+ "\x61\xf0\x4b\x83\x5f\x01\xfc\x0e\xc2\xcf\x80\x54\xb9\xae\xf0\x53"
+ "\xc3\x4f\x03\x3f\x78\xbe\x5c\x28\x93\x0b\xf7\xca\xc5\xe7\xe0\x1e"
+ "\x1b\x7c\xe1\x97\x04\xbf\x4a\xa4\xfa\x38\x00\x7e\xa5\xec\x0f\x8e"
+ "\x7d\xbc\x8d\xf7\xff\xc3\xbc\xbf\xc5\x7e\x55\x5e\x4b\x1e\xd6\x17"
+ "\x3d\x61\x84\x7e\x9b\xb9\x93\x5e\x8a\x54\x74\x66\x6e\x5a\xe2\x13"
+ "\xc8\xe5\xb2\x2a\x73\x41\xf9\x32\x84\x68\xf5\xae\xc2\xa2\x85\x8d"
+ "\xf8\xfc\x02\x6c\xb3\xba\xf4\xcc\x64\x3d\x4a\xd4\xe0\xfe\x29\x0f"
+ "\x9f\x99\xc9\xec\xf5\xfb\xf5\x2e\x6a\x35\xbe\x9e\x5e\xff\x6c\x24"
+ "\x9d\x1a\xf9\x09\x5e\x87\x0b\xf5\x47\xe0\x75\xba\x74\xc6\x33\x15"
+ "\xb4\x7a\x70\x34\x8e\x31\x45\x0b\x99\xe7\x1a\x43\xfa\x23\x9c\x87"
+ "\x67\x33\xf8\xb8\xe5\x42\xff\x73\xc5\xff\xa7\xc1\xe7\x74\x41\xbc"
+ "\x3b\x89\x3b\xeb\x19\xfd\xd2\xe8\xf3\x7a\x04\x3e\xd7\xb0\x75\x00"
+ "\xc4\x89\xb0\xdc\xa2\x84\x46\x54\xa5\xca\x1c\x05\x6d\xa3\x20\x06"
+ "\x52\xf4\x63\x03\x90\x39\xe7\xf5\x88\x03\x80\x03\x5c\xee\xeb\x94"
+ "\x6a\xfc\xef\x48\x7c\x9e\xce\x9a\xa0\xc1\x79\xa0\xa2\x94\x4f\x21"
+ "\x2e\x67\x8e\x69\xf4\x89\x33\x68\xc7\x7a\xd1\xe7\xc9\xb3\xe1\x72"
+ "\x55\x96\x67\x69\xf4\x71\x2b\xc0\xf5\xd3\xda\xf8\x42\x38\xe7\x6a"
+ "\xce\xfc\x6b\x01\x3c\x87\xcb\x55\xb8\x8e\x86\x67\x2c\x1a\x8b\xef"
+ "\xbb\xfe\x0c\x3c\x2b\x95\x3a\x06\xea\xfe\x34\xbe\x70\xf7\xc2\x7a"
+ "\x0a\x9f\x33\x67\xb9\xe5\x02\xde\x3d\xe8\xf4\x75\x9a\x8f\xbb\x21"
+ "\xd7\x4d\xeb\x11\xca\x5f\x8f\xdc\xeb\xd2\xd7\x9f\xd0\xbb\x6a\xab"
+ "\x48\xec\xcb\x8c\xa0\xa0\x8c\x5e\xb5\xbe\x90\x06\xfc\x32\xf7\xf2"
+ "\x1e\x93\x21\x7d\xaf\x8f\x7a\xdf\xb9\x57\xce\x98\x0c\x7c\x2f\xc6"
+ "\x46\x70\x9e\xd8\x8a\xd4\x61\xde\x32\xa0\x10\xdb\x0f\xdb\xce\x52"
+ "\x87\x39\xfb\xce\xf3\x86\xe1\xeb\xf5\xaa\x8f\xbc\xe9\xbf\x0d\x28"
+ "\x34\xe7\x44\x16\xc2\xb5\x06\x7c\xde\x6b\x09\xaa\xa5\xe1\x5f\x7c"
+ "\x7f\xe2\x0b\xb0\x3d\x95\x86\x70\xfd\x34\x7b\x8c\x86\x63\x70\xed"
+ "\x24\xf3\x52\x2d\xc2\x63\x53\x8d\x2a\x8b\xc9\x4d\xd0\xea\x10\x7f"
+ "\xe2\xe3\x8f\xf6\x2d\xa8\xa0\xcd\xf0\x33\x0d\xa8\x40\x2e\x45\x63"
+ "\xb1\x7f\x3f\x3a\xa1\x1d\xdd\x11\x6c\xfc\xd1\xc9\x3b\xb6\xed\x1d"
+ "\xbf\x0d\xec\xa3\xde\xd4\x0d\xfa\xfb\x8a\xce\xee\x34\xa5\x45\xd8"
+ "\x3f\xd8\x56\x60\x27\x04\xc7\xdd\x31\x4e\xeb\xd2\xb3\x5c\xad\xec"
+ "\xa5\x7e\x65\x4c\x2a\xcd\xab\xfb\x18\x4d\xfc\x16\xc1\x96\x0f\xd2"
+ "\xbb\x74\x66\xc6\x16\xed\x23\x0c\xe6\xc6\xb0\x7e\x65\xb0\x85\xed"
+ "\x47\xfb\x4c\xd3\xe2\xff\x8f\xef\x8b\xd4\x5e\x15\x88\xd2\xa6\xf8"
+ "\xed\x27\x58\x98\xa0\xb1\xe0\x84\x69\x63\xce\x0b\x31\xa6\xa5\x30"
+ "\xd6\xde\xc1\x5f\x56\xa1\x29\x33\x44\x0b\xe5\x2a\x1a\xb2\x23\x32"
+ "\xe8\x8c\x10\x2d\x5e\x7f\x7e\x5e\x95\xb5\x9d\xb1\xc1\x52\x77\x44"
+ "\x9e\x23\xc4\x2f\x25\x8e\x36\xa4\x5c\x87\x7b\x75\x9f\x50\xf1\xf5"
+ "\x3c\x03\xf8\x2b\x22\x03\xe3\xe1\xc0\xed\x7a\x0a\xef\x09\x48\x77"
+ "\x59\xf7\x4c\x3e\xb4\x75\x23\x60\x02\xda\x8a\x70\xbd\xf0\xec\x06"
+ "\xae\xad\x59\x59\x18\x1b\x70\x8f\x60\x72\x6f\xa8\x77\x29\xdc\x23"
+ "\x33\x24\xb8\x2e\x3d\x5b\xa3\x77\xd9\xb7\xcc\x62\x13\xe6\xde\x5c"
+ "\x39\xb6\x2f\x65\x7b\x18\xba\x86\x04\x37\xcd\xa3\x2b\xd6\xfd\x0c"
+ "\xf5\x2f\x45\x74\xe3\x6d\xba\x74\x51\x04\x5d\x9f\xfe\x3a\x9e\xe7"
+ "\x78\x1a\xa5\x4e\x45\xbe\x0f\x2c\xa1\x0d\xe1\x26\xe4\xf5\xc0\x69"
+ "\x2f\xfa\x58\xc4\x69\xe6\xdb\x08\x8b\x2a\xe8\xea\xb2\xc4\x83\x68"
+ "\xd1\x05\xe4\xb1\x38\x16\x79\xa7\x46\x40\x5b\x4a\xe9\xfa\xf2\xe4"
+ "\xd3\xa8\xac\x16\x7e\x89\xc7\xa0\xdc\x49\xf8\x1d\x44\xa9\x0b\x90"
+ "\xeb\x68\x18\xf7\x52\x6e\x21\x8f\xb2\xc4\x5b\x70\xec\x0a\x5a\x14"
+ "\x45\x1b\x8f\x95\xe2\x72\xc5\x28\xdc\x68\xf0\x5a\x7c\x05\x7c\xfa"
+ "\x3a\x5e\xd3\x7d\x06\x6d\x82\x67\x69\xec\xfa\xa5\xbe\x21\x73\x5f"
+ "\xcc\xcd\x79\xb4\x11\xda\x52\xa5\x47\xcf\x16\x09\xda\x82\x9f\xb9"
+ "\x11\xe1\xbd\x9b\x5c\x70\x19\x73\x76\x78\xe2\x14\x23\x8e\x2f\xd9"
+ "\x95\xc0\x3b\x90\xe5\x3c\x3e\x67\xf0\x09\x4f\xd4\xab\x72\x5c\xc3"
+ "\x8d\x74\x1d\xb6\x0f\x6e\x37\xd8\x28\x88\x6d\x7f\x90\x2a\x11\xb9"
+ "\xd6\xa5\xe7\x8c\xd0\xbb\xec\x8f\xc2\xf7\x80\x3a\x3b\xc0\x7d\x4e"
+ "\x63\x6c\xb0\xe7\xa2\xf5\x2e\xff\xd8\xc6\xe1\xe5\x23\x2d\x60\xa4"
+ "\x83\xe5\x59\xe0\xfc\x32\xbd\xcb\x57\x85\x3c\x3c\x61\x7c\xdc\x39"
+ "\xcf\x8e\x67\xf8\x78\x95\x19\xc7\x56\xf5\xe0\x60\x93\xcf\x04\x2d"
+ "\xed\xd3\x21\x90\xbe\xa9\xf1\xa0\x29\xba\x7e\xb4\x91\xae\x37\x67"
+ "\x0f\xc5\x63\x99\x47\xb9\xb1\x16\x91\xf2\x7f\xed\x4b\x67\x77\x08"
+ "\x26\x73\x48\xff\xda\x15\xd7\x09\xdc\xa6\x22\xfd\x06\x52\x87\x57"
+ "\xd0\xf5\xb8\xff\x9a\xb3\xbb\x14\xa6\xcf\x46\xde\x74\xf6\x04\xb5"
+ "\xd9\x67\xac\xb6\x61\x73\x3c\xc6\x57\x32\xc6\x2f\x9d\xd5\x21\xd8"
+ "\x52\x0f\xdc\xd7\x0d\x6c\x50\x6d\x86\xeb\xe9\xac\xa1\x89\xec\xf3"
+ "\x30\xf1\x90\xc4\xd1\x9c\x6a\xba\x0f\x9c\xcb\x18\x1c\x02\xe7\xdc"
+ "\xce\xab\xfe\x9a\x04\xc7\x11\xfc\x3f\xa9\x28\xe5\x06\xae\x63\x01"
+ "\xc1\xd0\xe0\x60\xc1\xff\x29\x6c\xcf\x8f\xe2\x70\xff\x27\x3c\xf4"
+ "\xaf\x1b\xb8\x7e\xc7\xb4\x97\x22\x71\x72\x28\xf4\xbb\xbf\xee\xd0"
+ "\xbb\xfc\x29\x8e\xb5\xb1\x4b\x2d\x89\x49\x06\xf3\xe6\x78\xf7\xef"
+ "\xc0\x52\xdf\x95\x22\x04\x65\x2a\xf4\x2e\x3e\x69\x9c\x2d\xff\x7a"
+ "\x09\x97\x65\x9e\x13\xfa\xa6\x79\x29\x3b\x06\xc0\x35\xd0\x6f\x8a"
+ "\x70\xcc\x21\xb1\xed\xaf\x55\x38\xee\x40\xbf\xf3\x67\xe3\xfe\x4a"
+ "\x78\xae\x45\x74\xb7\x99\x05\xf0\x5c\x69\xe7\xd9\x67\xe1\x3f\x9b"
+ "\x25\xce\xd0\x99\x89\x5a\x52\x36\x44\x57\x97\x9e\x1b\xa1\x77\xe9"
+ "\x1e\xc9\xc7\x1a\x69\x57\x6e\xf1\x80\x52\xf8\x1b\x78\x89\xa5\x2e"
+ "\xe8\xab\xee\xd0\x47\xc7\x62\x4c\xe1\xfe\xb9\x61\x3d\xe6\x1a\x89"
+ "\xfe\x0d\x99\x89\x81\x50\x4f\xae\xa5\x9f\x9a\xe7\xd1\x95\xe0\x57"
+ "\x64\xbe\x4d\x9f\x58\x07\xbe\x0c\x37\xa9\xe8\x29\xa6\x00\x04\xbc"
+ "\xd5\xb8\x09\x8e\x6f\x9a\x87\x79\x5f\xf6\x09\xe8\xcb\xee\xe2\x65"
+ "\x5d\x11\x2e\xc7\x94\x67\xcb\x36\x76\x4d\xf4\x67\x9e\x99\x52\x99"
+ "\xe1\xf9\x5c\x2c\xcf\xd4\xd8\x35\x24\xa0\x2e\x7d\x83\xb7\xde\xc5"
+ "\x35\x4e\xd0\x5f\xd6\x07\x45\xd2\x74\x24\xc6\x95\xea\xa2\x6a\xc3"
+ "\x10\xf8\xb7\x23\x8b\xe3\x07\xbe\x03\x5e\x3b\x6c\x14\xf4\x15\xf0"
+ "\xf7\xc7\xdd\x69\xd0\x93\x1b\xc6\xe9\xd1\x94\x2c\x7c\xfd\x6a\xf8"
+ "\x3f\x3e\x8e\xcb\xc0\xf1\x38\x3d\x8a\x62\x63\xca\x47\x69\xd8\x7f"
+ "\x56\xf5\x66\x92\x7a\x99\x67\x79\x00\xd7\x89\xaf\xc3\x75\x6e\xcc"
+ "\xa1\x6b\x70\x3d\x50\x47\xa1\xa5\xee\xb5\x70\xcc\x52\xff\xb0\xf8"
+ "\x3b\xf7\xa8\x80\x7b\x78\xf0\x9f\x7d\x43\x0e\x5d\xcb\x3e\x57\x8d"
+ "\x1e\xc5\x44\xe3\x73\xab\xe0\x18\xbe\x96\x60\xe4\xe3\x4e\x18\x3f"
+ "\x7a\xd2\x1e\x15\xc1\xd1\xc7\x1a\x3d\x9a\x51\xc3\x8f\xf1\xe0\x27"
+ "\x4f\xcb\x18\x40\xea\xfb\x38\xc4\x52\x1f\x57\x17\xa9\x83\xce\x98"
+ "\xa5\x61\xfb\x08\xee\xcb\x1e\xb8\x7e\x28\x0f\xed\x9f\x16\xc4\xb6"
+ "\x3f\xae\x96\x60\x1e\x6c\xcf\x5c\x43\xf0\x90\xbe\x2e\xca\x32\x96"
+ "\x83\x2f\xfc\xe1\x9a\x02\xab\xb1\xc9\x1d\x8e\x6b\xd8\xfa\x0e\x82"
+ "\x9f\x02\xf8\x6d\x25\x63\xca\x04\x1d\xc6\x14\x7b\xff\x05\xf8\x79"
+ "\x2d\xe7\xe1\x1e\xae\x70\x8f\xd9\xb8\x1f\xe0\x7b\x98\xb3\x23\xa0"
+ "\x9e\x4f\xac\xc7\x3f\x57\x5c\xce\x9c\xbe\xee\x73\x3c\x4e\x7e\xd4"
+ "\x9d\xae\x86\x32\xfe\x96\x32\xf8\x3c\xd8\xfc\x79\x38\x06\xed\x8f"
+ "\x67\x6c\x94\x0e\x65\x40\x67\x49\xae\x9d\x49\xe9\x8d\xa8\xf2\x3c"
+ "\x3d\xd6\x95\xb8\xcf\x87\x94\xfb\xd6\xa2\xf2\x3c\x33\x32\xff\x2d"
+ "\x30\x50\x97\x42\x17\x01\x57\x3f\x50\x56\x5f\x8d\xe4\x71\xc1\x4f"
+ "\x98\xef\x5f\xd1\x8d\xa0\x7f\x16\x0d\x42\x98\x1b\x5c\x55\xe5\x5d"
+ "\x2a\x37\xdc\x60\xe2\x1f\xfc\xcd\x70\x81\x8f\x40\x2f\x61\xcd\x04"
+ "\xba\x38\x26\x83\x22\xba\xc9\x0c\x65\xf3\xf1\x71\xac\xa9\x40\xcf"
+ "\x6d\xe2\x9d\xa3\xff\xd6\xbf\x90\xd8\x2e\x6f\x33\x33\x1e\xe2\xe7"
+ "\x35\xbe\x54\x84\x9f\xd9\xbc\xa5\x7f\x21\x6e\x43\x6a\x32\x6d\x2e"
+ "\x37\xd6\x15\x95\xd5\x9a\x90\x76\x1e\xd6\x7b\x79\x8b\xc3\x37\x22"
+ "\x1a\xe2\x63\xa1\xbc\x36\xe4\x31\xeb\x1f\x40\x13\x5f\x35\xf4\xe9"
+ "\x5f\x98\x6a\x42\xd4\xba\x14\x37\xf7\x17\xf2\xe8\xa2\x9b\x8f\x05"
+ "\x42\x1c\xc8\x2b\x38\x04\x8c\x57\x3e\x4f\xce\x2b\xb0\xb4\x3d\x9f"
+ "\x6d\x3b\x1c\x63\xf4\xca\x80\xdc\x34\xa6\xbd\xf0\x7f\x49\x7f\xd1"
+ "\x4b\xbd\xe8\xef\xf2\x8c\x68\x4e\x1e\xdd\x38\x67\x23\xa2\x4c\x39"
+ "\x2f\x18\x76\xe7\x57\xe2\x58\xaf\xb3\xd8\x93\xb1\x9d\xd1\x80\x12"
+ "\x53\x90\xfa\xb2\x6a\xe3\x92\xf0\x45\x69\xcc\xf7\x93\xfe\x09\xe5"
+ "\xe4\x3d\xeb\x46\xe6\xfb\x55\x65\xa0\xb1\xc3\x8d\xa9\x34\x19\xaf"
+ "\x36\x6e\x1f\xcd\xd6\x87\xcf\x59\xfc\x97\xcf\x6a\x5f\x05\xf7\x90"
+ "\x5c\xff\x6a\xa7\xad\x6a\xf1\xb6\xe6\xc7\x2b\x6f\x6b\x7e\xb0\x6d"
+ "\x5b\xf3\xb3\x5b\xb6\xad\xf9\x92\xdf\x3f\xb0\xd3\x56\xad\x78\x5b"
+ "\x37\xbd\xa1\xbc\xad\x9b\xfc\x6c\xdb\xba\x69\x49\xcb\xb6\x75\x93"
+ "\xe4\xfb\x3f\x3b\x6d\x0d\x14\x6f\x6b\xc1\x70\xe5\x6d\x2d\x50\xdb"
+ "\xb6\xb5\x20\xbe\x65\xdb\x5a\x90\x24\xd9\x56\xca\x8b\xc6\xf1\x09"
+ "\xe2\x52\x63\x4a\x03\xf0\xbc\x9c\x37\x8a\x16\x6f\x46\x54\x69\x6d"
+ "\x3d\x2a\xf3\xad\xc4\x1c\x9a\xea\x9f\x08\x71\x6f\x29\x0a\xa1\x73"
+ "\xdc\x0a\xcb\xf2\x6a\xe0\xf8\x45\x74\x2c\xb9\x1e\xe9\x66\xe3\xf8"
+ "\xbb\x79\x48\x79\xb4\xdc\xf8\xbb\xd9\xf5\x4e\xfc\x35\x0e\x62\x63"
+ "\xee\xa7\xd3\xcb\x6a\x1a\x11\x6e\x3f\xfc\x3d\xe6\x4e\xfc\x5d\x4a"
+ "\xec\x6d\x1d\x7f\xb1\x3d\xca\xeb\xeb\x05\xf1\x97\xac\xa1\xfa\xb4"
+ "\x97\x75\xec\x4d\xbf\x8c\x90\x78\xec\xdd\xdc\x80\x63\x6f\x3e\x9c"
+ "\x97\xf9\xfc\x87\x2d\xb1\x37\x03\xee\xc9\x8f\xbd\xdf\x45\xe3\xf1"
+ "\xf5\x53\x5f\x65\xb1\xf7\x53\x5f\x4b\xbb\x37\xb2\xed\x86\x7b\xa5"
+ "\x09\x63\xef\xa7\x92\x7b\x5d\xf2\x71\x4b\xe7\x3c\x5f\xb1\xfb\xa1"
+ "\x7a\x37\xf3\x96\x40\x03\x1e\xdf\xea\xc0\x26\x5f\xe5\xd7\xbb\x82"
+ "\x7d\x98\xb5\x10\x37\xeb\xa2\x5d\xe8\x2d\x03\x72\xc3\x93\xe8\xb3"
+ "\x74\x9f\x40\x03\xce\x63\x62\x3d\x7e\x51\xf5\x59\x27\x7a\xeb\x80"
+ "\x5c\x99\xcf\x7d\x82\x1d\xff\x02\x53\xa0\xbf\xec\x9e\x57\x4f\x99"
+ "\xdf\x8f\xf4\x02\x3f\xa8\xe9\xec\x17\xd4\xf4\x0a\x4d\xc5\xcd\xec"
+ "\xc8\xb4\x62\xff\x0b\x08\x97\xa5\x97\xb8\x86\x28\x7f\xfe\xcf\xb2"
+ "\x9a\x79\xfe\x23\xf2\x9f\x9f\xd4\xe9\xd8\xf3\x7f\x96\xe5\xd0\xf3"
+ "\x77\x87\xe7\x6f\x0c\x76\x03\x6d\x48\xfd\xb3\x31\xd8\x55\xde\xf3"
+ "\x6c\xf1\x73\xc8\xc7\xce\xdd\xc3\xe1\xf8\x47\x77\x8f\x50\xef\xce"
+ "\x37\x50\x10\x03\x98\x31\x1c\xf7\x3d\x12\xff\xaa\x21\x66\x9d\xa5"
+ "\x49\x4c\x32\xc8\x8c\x49\x5b\x25\xbf\xff\x67\x7b\xff\x61\x89\xad"
+ "\x70\x7f\xe9\xf6\x5b\xc7\xc4\x5d\x43\xd5\xd2\x31\xf1\x85\x44\xdb"
+ "\x98\xf8\xb7\x51\xf2\x63\xe2\xdf\x34\xb6\x31\xf1\xf3\x05\x5c\x4c"
+ "\xfc\x7c\xba\xf2\x98\xf8\xf9\x40\xc7\x63\xe2\xe7\x9e\xca\x62\xe2"
+ "\xdf\x2a\xed\xc7\xc4\xcf\x03\x95\xc5\xc4\xcf\x03\x6d\x63\xe2\xdf"
+ "\xb2\x84\x31\xf1\x73\xc9\xbd\x2e\xe8\x0c\x3f\x2d\x8c\xd1\x1e\x97"
+ "\x55\xdb\x82\x8d\x4b\x41\xb7\x64\xe4\xe5\x86\x9b\xe8\x3a\x3a\xd3"
+ "\x4f\x6b\xa6\x82\x70\x5c\xd1\xd5\xd5\xc5\xb8\x9b\xe7\xfb\x7b\xd0"
+ "\xdd\x82\x2e\xd2\x4d\x1a\x04\x76\xf2\x83\xe7\xf7\xa2\xeb\xfc\xbb"
+ "\xd0\xf3\xfd\xbb\xe5\xdd\x46\xde\xf0\xd3\xe4\xb1\xe3\x31\xfc\x1d"
+ "\x48\xcf\xd7\x74\x4e\x9f\x87\x02\xbc\x6a\x91\x3b\x3c\x43\xa4\xd7"
+ "\x12\x35\x82\x18\xe4\x8d\xff\xa6\x97\x6e\x09\xd9\x74\x1b\xb9\x7a"
+ "\x25\x83\x6f\xba\xc2\xfd\x92\xbd\x68\x7a\x8e\x3f\xda\x34\x1b\x74"
+ "\x36\x85\x34\xf9\x14\x5d\x68\xac\xf3\xa7\x4c\xde\x13\x02\x89\x7f"
+ "\xb6\xd5\xd0\xdd\x41\x7b\x65\xbd\x6e\x34\x77\x7f\xbd\xca\x94\x1a"
+ "\xa3\xa2\xdf\x8f\x54\xe1\x67\x35\x65\xbd\xae\xa7\x73\xe0\x97\x1a"
+ "\xd3\x05\x73\x68\xd0\xe1\x81\x74\x9d\xa6\x33\x68\xf4\x80\xfc\x79"
+ "\xc8\x6f\xe3\x6d\xe4\x4f\xdf\xf4\xa7\xc0\xff\x91\xf8\x3b\xa4\x60"
+ "\xa3\x48\x33\xb5\x25\x04\xce\xb9\xe2\x98\x48\xe3\xfb\x1b\xe1\xfe"
+ "\x4d\x70\xff\x46\x8c\x6d\xa4\xd9\x04\xf7\x37\xcd\xf7\x97\xd9\x5f"
+ "\xb6\xed\x67\xf0\xc9\x3e\x97\x39\xe0\x15\x35\xbd\x0b\x7e\xf8\xb9"
+ "\xc0\x86\x9b\xb0\x4d\xfa\xbf\xe2\x8d\x9f\x6d\xed\x6d\x14\x00\xcf"
+ "\xe9\x07\xcf\xe0\x0f\xf7\xc5\x7b\xb8\x44\xbe\x35\x4b\x8d\x31\x2a"
+ "\x78\x36\x53\x26\xfb\x6c\xd7\xe0\xd9\xae\x72\xcf\x86\xef\x85\xed"
+ "\x23\xf5\x7e\x34\x7c\xf1\x43\xb8\x6f\xfe\xe6\x95\xdc\x71\x04\x7e"
+ "\x57\x7a\xf3\xfd\x18\x99\x58\xdd\xbe\x4c\x0a\x2f\xeb\x76\x21\x5f"
+ "\x5a\x9d\x93\x3b\x7a\xf9\x59\x3a\xdc\x88\xd0\xf2\x5d\x28\xa0\x1c"
+ "\xfa\x75\x59\xfd\x15\x44\x77\xcd\xc9\x2d\xf6\xaf\x91\x7b\x2f\x83"
+ "\xd4\xbd\x56\x2f\xa5\x2b\x9a\xfc\x70\x5e\x2c\x32\x79\x1d\x45\x27"
+ "\x37\xfa\x0d\x28\x38\x7a\xa2\x11\x4d\x49\xc6\xef\x63\xe9\x64\xed"
+ "\x44\xe4\x7e\x5e\x55\xb8\x25\xf5\x14\x7e\x77\xf4\x45\x92\xf0\xdd"
+ "\xd1\x17\xb9\x48\xb5\x23\x04\xa9\x76\xc6\x21\xd5\xae\x5a\x04\xe5"
+ "\xac\x7e\x01\xe1\xdb\x1f\x42\x29\x46\xfa\x37\x3a\xab\x43\x75\x3a"
+ "\x45\xd7\x87\xf7\x75\xd1\x17\xcd\xc3\xef\x52\x76\x0c\x06\xfb\xfd"
+ "\x0e\xe3\xaa\x17\xfe\x1b\xd7\x97\x38\x1b\xfd\xe9\xb2\x6a\x47\x90"
+ "\x57\x6d\xc7\x11\x46\xef\xc8\x02\x23\x1d\x89\x9a\xb4\xf1\xa8\x21"
+ "\x6b\x82\xba\x09\xe7\xed\xa6\xe1\x18\xf4\xf7\x7e\x5e\x2e\x69\x88"
+ "\x06\xff\xd3\xb4\x06\xbf\x4f\x8c\xcc\x83\x1f\xf6\x25\xe3\xc7\x6e"
+ "\xcf\xac\xc1\xfe\xc6\x7d\x61\x13\x39\xae\xc6\xfd\x61\x1d\xdb\x6f"
+ "\x0c\xaa\x27\xa2\x4c\x14\x42\x26\xb8\x3e\xf5\x02\xf2\xc5\xdf\x9f"
+ "\xdd\x08\xe5\xa6\x98\xdc\x71\x3f\x8e\x2c\x9a\xf8\x23\xba\x98\x88"
+ "\xa8\xd4\xeb\xc8\x13\x30\xc1\xf4\x47\x33\xf4\xc7\xf0\xd3\x5e\xf5"
+ "\x10\x57\xcc\x29\xb7\x90\x17\x8e\x53\xf8\x5b\x2e\xe5\x35\x7a\x64"
+ "\xbe\xe6\xdf\xe5\x93\x04\xe4\x6d\xbc\x16\xd3\xcd\x70\x2d\xe6\x4f"
+ "\x1b\xcc\xc8\xbb\x4b\x22\x52\x6f\x4c\x00\x2c\xce\x84\xfe\x79\x15"
+ "\xfa\x67\x0d\xe9\x9f\x16\xfc\xd1\xab\x7f\x8c\xc4\x6b\xec\x99\xbe"
+ "\x99\xc9\xf6\xcd\xf9\xfe\x38\x17\x76\x07\x7f\xc6\x99\xfe\xd4\x46"
+ "\x8a\x46\xf0\x8c\x60\xf7\xed\xd1\x9b\x52\x3a\xba\xe3\xdc\x25\xfd"
+ "\xd8\x40\xfc\xfe\x03\xda\x4a\x1b\x77\x83\x2f\xdc\xfa\x52\x5a\x3a"
+ "\x3b\xb2\xe0\x68\x44\x35\xe2\xf2\x26\x85\x5b\x1b\xfb\x0c\x28\xd0"
+ "\x8e\xa5\xaf\x9d\x57\xed\x08\x80\xe3\xee\xda\xd7\x1f\x57\x83\x1f"
+ "\xb7\x92\x3c\x4b\xe1\x16\x9c\x4b\xd5\xab\x76\xe0\x1c\x32\xc2\xef"
+ "\xe8\x7f\x60\xde\x7f\xed\x8c\x86\xb2\xc8\x04\x36\x37\x7a\x77\x08"
+ "\x36\x7b\x4f\xd0\x15\xbd\xdb\xc8\xc4\xab\x26\xf0\xc1\xc5\x38\x44"
+ "\x4d\xa9\x01\xdb\x98\xc0\x36\x75\xfe\x1e\x10\xb7\x22\x70\xdc\xa2"
+ "\x33\x82\xf4\x8b\xf4\xb4\x39\x3c\x5a\x45\x83\x5d\xdc\xcb\x93\x4d"
+ "\xe8\xad\x44\x44\x2f\xbe\x02\x36\xaa\xad\x44\xd0\xb6\x2e\x10\xdb"
+ "\xba\x6d\x9c\x87\xbc\x3f\x01\xfb\x78\xd6\x00\xa7\x59\x9f\x9b\xb1"
+ "\x2b\xa5\xc4\xcd\x04\x38\xc7\x71\xcc\x6b\x89\x4b\x27\xf0\x55\x97"
+ "\x35\xb8\xdf\x42\x3f\xf6\x5a\xc2\xc4\x55\xc6\xb7\xc6\xf9\xfe\x8f"
+ "\x34\xcd\xf7\xd7\xc2\xef\x21\x4b\xac\xb3\xc4\x19\x3a\x7d\x7b\x29"
+ "\x8e\x73\xe5\xc9\x7a\x64\x04\x5b\x76\xc1\x63\xe2\x7c\x7f\x5f\xc6"
+ "\xa6\xef\x80\x4d\x67\x20\xf7\x01\xf5\xc8\x05\x9e\x4b\x0d\xcf\x8c"
+ "\x8e\xc5\x9c\xc7\xb1\x55\x63\x82\x7e\x84\xed\x0c\x75\x52\x34\x60"
+ "\xcd\x9c\xd5\x21\x78\x54\xac\x16\x15\xfb\x9f\x44\x78\x1f\xd7\xd4"
+ "\x06\xfa\x1c\x7e\xff\x56\x9e\x6c\x44\xb4\x4f\x64\x01\xc9\x9d\xef"
+ "\x70\x3d\x1a\x51\x8f\xa4\x31\xbd\xeb\x0a\x87\xe9\x5d\x57\x38\x4c"
+ "\xef\x62\xe6\x60\xf1\x71\xdd\x50\x00\xb8\xf6\xe6\xe3\x7a\x97\x5b"
+ "\xab\xe2\x7a\xb4\x7c\x5c\x6f\xb8\xca\xc3\x75\xca\x1f\x83\xeb\x1f"
+ "\x22\x19\x5c\xab\x9a\xfa\x30\x78\x75\x2f\x37\x7e\x09\xfc\x77\x57"
+ "\xa5\x05\xb7\x47\xbe\xc0\xb8\x2d\xf4\x6d\xaf\xb8\x6d\xa8\xf3\xd7"
+ "\xc2\xaf\xc5\x71\x0b\x75\x3a\x8c\xdb\x1f\x22\x1b\x91\xc5\x7e\x18"
+ "\xbf\x74\x46\x4e\xae\x36\x15\x85\x82\xdd\xb6\x78\x2d\x79\x08\x1d"
+ "\x23\x36\xdc\xa2\x7d\x9d\x36\x43\x8c\x60\xf6\x40\x68\x5c\x4a\xd3"
+ "\x66\xef\xb1\xda\xd4\xe3\x48\x6d\xce\xea\x52\x58\x6e\xdc\x89\xbc"
+ "\x12\x91\x2b\x7e\xff\x49\x77\xdd\x17\x05\x3a\x9c\x79\x07\x6d\xce"
+ "\xcc\xa9\x30\x65\xe6\xa6\x99\x20\x9e\x98\xb2\xa7\x69\xcd\x99\xf3"
+ "\x12\xcd\x5d\x77\x15\xd2\x78\x4e\x42\xd7\xbf\x16\xd4\xa5\x17\x6e"
+ "\xb1\xbc\x2b\x17\xe5\x46\xde\xd3\xb4\xd0\x5f\x40\x53\x7d\xd9\x0b"
+ "\xfe\xa5\x2e\xaa\xf6\x3c\x07\xff\xaa\xe0\x5f\xe6\xbd\xa9\xbc\x71"
+ "\xae\xb0\x92\xbc\x73\x8a\xdc\xcb\xc6\xc1\x53\x4c\x1f\x7c\x02\x79"
+ "\x5e\x66\xff\xae\x4b\xdf\x13\x64\x79\xf7\x7e\xa7\x3c\x67\x8f\x0a"
+ "\x7c\x6f\xb0\x89\x2b\x99\x0f\x40\xfe\x8f\xe7\xda\xb0\xf5\x31\xff"
+ "\x37\xfb\x85\xe5\x16\xa5\x9c\x47\x35\xaa\x3d\x05\xe5\x30\xf6\x9b"
+ "\x73\x22\xf7\xae\xbb\x0d\x78\x4c\xbe\x13\x7f\x4f\x75\x01\x7f\x17"
+ "\x2d\x64\xca\x30\xfb\x91\x9a\xb3\xc2\xd3\xe8\x9c\x0e\x85\x58\x43"
+ "\xd6\xd1\x31\xcf\xb3\xff\x3e\x87\xb1\x4d\xf2\x2d\x7b\xae\xd0\x60"
+ "\x3f\xfc\xfd\xf5\x3b\xf3\x8f\xf0\x77\xd1\xd3\x5c\x7d\x0f\x2d\x22"
+ "\xe3\xad\xe5\x79\xf1\xb7\xd3\xf1\xfc\x9e\xc7\xd3\x50\x5a\x9d\xc8"
+ "\xb7\xd3\xb9\x79\x40\x7b\x2a\xcd\xd9\xe1\x69\x75\xe9\x5f\xfa\xeb"
+ "\x55\x5f\x04\xf2\xdb\x2c\xe6\x0b\xbd\xea\xcb\x61\x52\xe7\xe4\xf9"
+ "\xe1\xcb\x28\xa9\x7a\x86\xfb\x9b\x68\x99\x75\xed\x90\xe4\xd5\x7e"
+ "\xfd\x03\xc3\xb7\x99\x8a\xcc\x4d\x91\x5e\xc5\x8b\xae\xc8\xe4\x44"
+ "\xff\x4f\x72\xfe\x9b\x29\x6b\xac\xce\xf8\x18\xd4\xdd\xf7\x21\x64"
+ "\x9a\x19\xf9\x12\x7e\x07\x82\xb9\xde\xe2\x58\x32\x67\xac\x74\x9b"
+ "\x11\x61\xde\xb7\x3d\xa1\x84\x6a\x6c\x8a\x44\x5d\x0c\x48\x3d\xba"
+ "\x36\x95\x5e\x77\x15\xf9\xd1\xf3\x23\xbd\xd6\x5c\x45\x21\x4d\x37"
+ "\x35\x9d\x3f\x9c\x8d\x5c\x1b\x21\x26\x37\xce\x89\xf1\xc2\xf3\xd3"
+ "\xbe\xbd\x5c\x44\x95\x1b\xf7\x63\x9e\xe9\x87\xc7\x01\xfc\xec\xa6"
+ "\x9b\x91\x5d\x56\xdd\x40\xcc\x7b\xe5\xa2\x69\x9f\xc2\x38\xb0\xb7"
+ "\xab\xdb\x62\x88\x7d\x10\xbb\x98\xf1\x40\xc1\x58\xd0\x08\x63\xc1"
+ "\xa8\x48\xba\xbe\xac\xf2\x47\x94\x7a\x05\xa9\x53\xe7\x22\x4f\x5c"
+ "\x7f\xb9\xf1\x1b\x32\x3e\x8c\x87\xf1\x01\xfe\x0f\x5a\xe2\xce\xf8"
+ "\xa0\x1d\x8d\x6c\xc6\x07\xac\x43\xca\x4e\x57\x23\xc0\x72\xc7\xd1"
+ "\xb5\x5e\xf5\x29\xb5\xb4\x19\x6b\x12\xfc\x0e\x1b\xca\x74\xb1\x8c"
+ "\x15\x78\x9c\x68\x64\xc7\x89\x8d\xec\x38\xf1\x71\x0b\x8c\x13\x1f"
+ "\xe3\x71\xe2\x24\xa2\x36\xe0\x31\x02\xc6\x87\xbf\xff\x62\xa0\x9a"
+ "\x60\x4c\x90\xe7\xe7\xbd\x35\x92\xf8\xc9\x89\xfc\xc0\x0c\x63\x31"
+ "\xf6\xf3\xfb\xe0\x5f\xec\xe7\x72\x7f\xf0\x6d\x65\xc7\x11\x0d\x70"
+ "\xdc\x98\xf3\xbc\x61\xdb\x45\x03\x45\x67\xbd\xa0\x6e\x00\x3c\x2c"
+ "\xbc\x85\x28\xa3\xf7\x58\xdd\xce\xd7\x33\x28\xac\x5b\xcd\xd9\xa1"
+ "\x41\x44\x23\x7f\x35\x15\xe7\x68\xbc\xaa\x91\x1a\xe7\x4f\x4d\x74"
+ "\xa4\x97\xf9\xf7\x48\x4f\xf3\x7b\x1a\xf7\xa6\xdf\x35\x9d\x57\xbf"
+ "\x8b\x5c\x0d\xef\xc5\x78\xa5\xbe\x81\xd4\xff\xfc\x4f\x06\x55\x56"
+ "\x0b\x7d\xbb\xc3\x77\x01\x34\xd4\xbf\xe9\x3c\x0a\xde\x34\x0d\x05"
+ "\xe5\x5f\x44\xda\xfc\x19\x28\xe0\x93\x8b\x80\xa1\xf7\x22\xbb\x34"
+ "\x31\xf8\x68\x28\x62\xe6\x04\xcc\x40\x3a\xba\x7b\x98\x01\xfe\x0d"
+ "\xce\x98\x81\x98\xbd\x1f\x69\x9f\xb1\x3a\x33\x94\x5b\x03\xda\x0d"
+ "\x38\x3a\x3c\xc3\x3f\x5e\x16\xc3\xcd\x27\x32\x39\xc4\xa8\x08\xc0"
+ "\x4d\x05\xe0\xe6\xba\x10\x37\x58\xb7\x32\xd8\x19\x45\xb0\x83\xdf"
+ "\xf9\x6d\xe2\xf3\x8b\x69\x47\x15\xe3\x27\x0f\xf8\x73\x83\x15\x7e"
+ "\xf2\xae\x3a\x87\x9f\x26\xc0\x4f\xde\x52\xc0\xcf\x31\x44\xe5\x9a"
+ "\x9d\xc1\xcf\x57\xcc\xfe\x17\x38\xcf\x47\xe6\x0a\xed\x5b\x85\xfd"
+ "\xac\x57\xed\x5b\x39\xde\xdf\x05\x29\xc3\x55\x68\x62\x33\xb8\xda"
+ "\x4b\x70\x75\xe0\x80\x02\x5c\x2d\xa3\xa1\x7e\xfb\xb8\xba\x25\x81"
+ "\xab\xd0\x44\x5b\x5c\xed\xdf\xdc\xb6\xb8\x62\xf6\xed\xfc\x3f\x80"
+ "\xab\x03\xcb\x84\xb8\xfa\xea\x1c\xc1\xd5\x57\x7a\x27\x70\xd5\x4c"
+ "\xbc\xd2\xb1\xf1\xea\x60\x57\x05\xb8\x3a\x0d\xb8\x6a\x26\x5e\x5d"
+ "\x91\xc2\x95\x48\xbc\xfa\xba\xa1\x6d\x71\xc5\xec\x2b\xfa\x7f\x00"
+ "\x57\xff\xdf\x69\x21\xae\xbe\x1e\x42\x70\xf5\x75\xb0\x72\x5c\xe9"
+ "\x9a\x89\x57\x3a\x36\x5e\x7d\x1b\x2b\x1f\x57\x87\x83\x68\xa8\xdf"
+ "\x3e\xae\xce\x48\xe0\x4a\x27\x12\xaf\xbe\x19\xd3\xb6\xb8\x62\xf6"
+ "\x3d\xfd\x3f\x80\xab\x6f\x83\x84\xb8\x3a\x98\x49\x70\x75\x30\xc3"
+ "\x09\x5c\x35\x13\xaf\xc2\xd8\x78\x55\x74\x48\x01\xae\xd6\x00\xae"
+ "\x9a\x89\x57\xdf\x48\xe1\x4a\x24\x5e\xfd\x73\x7b\xdb\xe2\x8a\xd9"
+ "\x97\xf5\xff\x00\xae\x8a\xd6\x08\x71\xf5\xed\x25\x82\xab\x6f\xab"
+ "\x95\xe3\x2a\xac\x99\x78\x15\xc6\xc6\xab\xef\x7a\x28\xc0\x55\x15"
+ "\x0d\xf5\xdb\xc7\xd5\x62\x09\x5c\x85\x89\xc4\xab\x7f\xb9\xb4\x2d"
+ "\xae\x98\x7d\x63\xff\x0f\xe0\xea\x5f\x55\x42\x5c\x1d\x0a\x23\xb8"
+ "\x3a\xa4\x73\x08\x57\xf5\x3c\x5c\x9d\xee\x38\xa2\x31\x95\xe8\xc1"
+ "\xed\x33\x58\x5c\xfd\xad\x7f\xe0\xfb\x73\x11\xb5\x73\x62\xae\x95"
+ "\x16\x2c\x9e\x6e\x8d\x29\xc0\x05\x83\x29\xe3\x7b\x80\xa9\xcb\x04"
+ "\x53\x29\x67\x00\x53\x3f\xe7\x52\xe5\xc9\x57\x30\x4e\x18\x0c\xe5"
+ "\xcd\x00\x0c\x61\x5d\xe8\xe2\xea\x2d\x47\x03\x7e\x78\xd9\x82\xa5"
+ "\xc3\xa3\x5a\x04\x4b\xe3\x00\x4b\x27\xac\xb1\x54\xcc\x61\x69\x8c"
+ "\x84\x06\x7c\x4b\x02\x4b\xfa\xe6\xb1\xf4\x09\xce\x21\xcc\x6c\x25"
+ "\x2c\x1d\xe7\x72\x08\x3b\xa6\x19\x28\xa3\x8f\x5c\x2c\x15\x07\x0a"
+ "\xb1\xf4\x5d\x36\xc1\xd2\x77\x59\xca\xb1\xa4\x4b\x94\xc6\x92\x85"
+ "\x4f\xfd\xef\x1e\xe7\xb0\x04\xdc\x4a\x80\xa5\xe6\x79\x14\x87\xa5"
+ "\xef\x37\xb4\x2d\x96\xac\x78\xd4\x3d\x8b\xa5\xff\x5d\x24\xc4\x52"
+ "\x31\xab\xfb\x8a\x25\x75\x9f\x19\xc6\x2e\xfc\xce\x09\xaf\xc1\x35"
+ "\xdd\x8c\x7c\xc9\x04\x63\x1a\x5e\x8b\x8b\xdf\x53\xec\x4e\xa8\xa0"
+ "\x30\x9e\xd2\x6f\x20\xbf\x35\xb3\x51\x88\x57\x3d\xc1\x8a\x11\xb0"
+ "\xb2\xf2\x06\x72\x6d\x6a\x02\x9c\x34\x22\xd7\x06\xb0\x77\x43\x53"
+ "\x8c\x57\x69\x54\x35\xfa\xe7\xd5\x0a\x18\xcb\xf6\xa3\x7c\xb8\xa6"
+ "\x89\xcd\x43\x9a\xdf\x8f\xec\xb2\x6a\x21\xce\x43\x1e\x43\x45\x13"
+ "\x3f\x06\xff\x97\x38\xed\xff\x86\x0f\xa4\xfc\xff\x8d\xc0\xf7\x79"
+ "\x3c\xbf\x6b\x5f\x51\x9e\x87\x64\xde\x53\x25\x10\xdf\x5b\xfc\xbe"
+ "\xa1\x05\xfc\xbe\x81\xf5\xbb\x73\xe3\xd1\x11\xe9\xf9\x8f\xbc\x58"
+ "\xc1\xcc\x29\xa8\x27\x31\xc2\x12\x17\x70\x8c\xc0\xfc\xa5\xc1\xfb"
+ "\xf9\x5a\xeb\xf1\x06\xc7\x87\xab\xaa\x1f\xce\xe1\xb1\x49\x92\xc7"
+ "\xb0\x71\x22\x75\x01\x89\x13\x84\xc7\x14\x87\xb4\x6c\xfe\xf1\xe8"
+ "\x91\xd6\x8b\x17\xdf\x34\x3f\xf6\x38\xc1\x63\x30\x6e\xf2\xac\x70"
+ "\xd3\x1a\xf1\x42\x19\x6e\x7e\xd8\x21\x8c\x17\x47\x3b\x91\x78\x71"
+ "\xd4\xdd\x91\xb1\xc7\x3e\x9e\x42\x93\x78\x78\xda\xcb\xe1\xa9\x6c"
+ "\x20\xce\x51\xca\xc4\x53\x46\xcb\xe6\x1d\x8f\xf5\x68\x5b\x3c\xb5"
+ "\x5c\xde\xb1\x7d\xe3\xe9\x98\x51\x88\xa7\xd2\x37\x08\x9e\x4a\x23"
+ "\x5b\x00\x4f\xbc\xf8\xa4\xe3\xc5\xa7\x8a\x25\x38\x37\x29\x13\x4f"
+ "\x55\x2d\x9b\x6f\x2c\x8f\x6d\x5b\x3c\xb5\x5c\xbe\xb1\x7d\xe3\xa9"
+ "\x62\xa4\x10\x4f\x65\xdb\x09\x9e\xca\xb6\x39\x8f\x27\x5d\x92\x35"
+ "\x27\x26\x78\xfa\xf1\x38\xe6\xcf\xf2\xf0\xf4\x7d\x70\xcb\xe6\x19"
+ "\x8f\x1f\x68\x5b\x3c\xb5\x5c\x9e\xb1\x7d\xe3\xe9\xc7\x3c\x21\x9e"
+ "\x2a\x1a\x08\x9e\x2a\xea\x5b\x00\x4f\xbc\xf8\x14\xc6\x8b\x4f\x27"
+ "\x7b\xe3\x5c\xa4\x4c\x3c\xb5\x70\x7e\xf1\x44\xa7\xb6\xc5\x53\xcb"
+ "\xe5\x17\xdb\x37\x9e\x4e\xd4\x08\xf1\xf4\xef\x97\x09\x9e\xfe\x3d"
+ "\xc2\x79\x3c\x85\xf1\xe2\x53\x18\x2f\x3e\xfd\x34\x0b\xe7\x20\x65"
+ "\xe2\x49\xdf\xb2\x79\xc5\xff\xbc\xd1\xb6\x78\x6a\xb9\xbc\x62\xfb"
+ "\xc6\xd3\x4f\x21\x42\x3c\x9d\xdc\x40\xf0\x74\x32\xd7\xd1\x5c\x90"
+ "\x25\x07\xc4\xc7\x93\xb4\xb6\x3b\xb5\xcf\x5a\xdb\xc9\xcb\x01\x81"
+ "\xce\x53\x9c\x4f\xac\xdc\x78\xb7\xe6\x13\x31\x86\x2c\x79\xa0\xf6"
+ "\x97\x03\x3a\x95\x26\xc4\xd0\x4f\x17\x08\x86\x7e\xaa\x92\xc2\x90"
+ "\x91\x3f\x27\xed\x37\xde\x9c\xb4\x2b\x88\xda\x99\x50\x44\x95\xb1"
+ "\x73\xd2\xf0\x7c\xb4\xb2\xaa\x6a\xb4\xea\x36\x52\x77\x89\x41\xea"
+ "\xd1\x89\xa9\xf4\x3a\x1c\x43\xe6\x44\x7a\x7d\x78\x11\x85\x34\x01"
+ "\x66\xd2\x2f\xb3\xf3\xd2\x00\x37\x3f\x9c\xae\x47\xdf\x26\xe0\x79"
+ "\x69\x85\x68\x13\x94\x33\x66\x91\x7c\x10\x8e\x23\xcc\x9c\xb4\x19"
+ "\x78\x4e\xda\xcf\x5b\x45\xe7\xa4\x2d\x95\x39\x27\x2d\x09\x70\x50"
+ "\x0b\x38\xb8\x85\x31\xb0\x4f\x30\x17\xed\x93\xa5\xbc\x1c\xd0\x34"
+ "\x89\x1c\x50\xa5\x63\xef\x24\x5a\x7c\x2e\xda\x35\xde\x5c\x34\x4b"
+ "\x0e\x68\x22\xc4\x0e\xd9\x7e\xff\x6f\xb2\xbd\x1c\x90\x09\x62\xc2"
+ "\x68\x3c\xb7\xbc\x96\xcb\x17\x2f\x8a\xc5\x6b\x7f\x9f\x37\x18\x21"
+ "\x56\xe0\xf9\xe3\xbb\xa6\x95\x30\xf9\xbe\xf2\xe4\x4a\xb4\xaa\x11"
+ "\xa9\xbd\x0c\x6c\x5c\xf0\x09\x0d\x6a\x82\xd8\x60\x82\x71\x09\x7c"
+ "\xed\xd9\x34\x07\x62\xc3\x0d\x88\x0d\x73\x20\x36\xdc\x82\xd8\x70"
+ "\xbe\x84\x89\x0d\xf4\x8a\xef\x02\xf0\xfe\xdb\x9b\x2e\xa3\xa0\x8d"
+ "\x97\x51\x30\x8e\x01\xa6\xec\xb1\xba\x26\x9f\x50\x6f\x83\x4f\xa8"
+ "\x06\xce\xf9\x13\x0c\x34\x14\xad\x99\x8d\x98\x58\x8f\x7d\xaf\x9d"
+ "\x81\xe3\xc1\xe9\x9d\x4d\x4b\x11\x72\x06\x07\x4d\xfc\x9c\x20\x1f"
+ "\x07\x12\x31\xc0\x69\x2c\x58\xe5\x81\x3f\x71\x32\x06\x60\x2c\x7c"
+ "\x62\x89\x01\x4e\x61\xe1\x8c\xe4\xfa\x1f\xfb\x58\x08\x4d\x74\x00"
+ "\x0b\x7b\x1d\xc4\xc2\x32\xbc\x6f\xb5\x08\x16\xb2\x00\x0b\xb9\x70"
+ "\x6e\x1b\xc1\xc2\x2d\x11\x2c\xfc\x72\xa0\xf5\xb1\x20\xcc\xc9\xdc"
+ "\xbb\x58\x38\x2b\xf9\xfd\xd7\x66\xb0\xe0\x40\x5c\xd0\x39\x1a\x17"
+ "\x4e\xe3\xfd\x9e\x6d\xb1\xa0\x83\xb8\xa0\x83\xb8\xa0\x63\xe3\xc2"
+ "\x15\x11\x2c\xe8\x8b\x5b\x1f\x0b\xc2\x7c\xca\xbd\x8b\x85\x73\xd2"
+ "\xfb\x5f\xd8\xc5\x82\xce\x81\xb8\xa0\x73\x30\x2e\x1c\x0e\xc2\xfb"
+ "\x24\x8b\x60\x01\xe2\x82\x0e\xe2\x82\x8e\x8d\x0b\x67\x44\xb0\x70"
+ "\xfe\x78\xeb\x63\x41\x98\x0b\xb9\x77\xb1\xf0\xeb\x36\x85\x58\x70"
+ "\x20\x2e\x84\x39\x18\x17\x0e\xaf\xc1\xfb\x0b\xdb\x62\x21\x0c\xe2"
+ "\x42\x18\xc4\x85\x30\x36\x2e\x7c\x23\x82\x85\xaa\x33\xad\x8f\x05"
+ "\x61\x1e\xe3\xde\xc5\xc2\x05\xc9\xef\x9f\xd8\xc7\x42\x98\x03\x71"
+ "\x21\xcc\xd1\xb8\x50\x85\xf7\xe5\x15\xc1\x02\xc4\x85\x30\x88\x0b"
+ "\x61\x6c\x5c\x58\x2c\x82\x85\x8b\x97\x5a\x1f\x0b\xc2\x1c\xc4\xbd"
+ "\x8b\x85\xdf\x8a\xec\x62\x81\xb6\xc5\x02\xce\x21\x60\xfd\x88\xf7"
+ "\xbd\x66\xb0\xf0\x6e\x11\xd5\x48\x63\x2c\x94\xa0\xd5\x0b\x79\x58"
+ "\xc8\x26\x3a\xc2\x82\x83\xb5\x7c\x1c\xe0\xf5\x4b\x18\x07\xa0\x1f"
+ "\x8c\xe0\x77\x3a\x27\xcc\xc0\xcc\x57\xca\x0e\xf5\xc7\xfa\x01\xe7"
+ "\x19\xb0\x86\x90\xd6\x0f\xd5\x57\x5a\x04\x03\x71\x80\x81\x1a\x71"
+ "\x1d\xd9\xe2\xfa\xe1\x5a\x2b\x61\x00\xb4\xe4\xc7\x29\xce\x60\xe0"
+ "\xd2\x61\xf9\x18\x00\x8e\xe0\x10\x06\x08\x4f\xb0\x8f\x01\x5d\x06"
+ "\x87\x01\xe0\x0b\xd9\xba\x6d\x98\x1f\x10\x0c\xe8\x72\xa5\xf9\xc1"
+ "\xe5\xeb\xad\x8f\x81\x16\xe6\x07\xed\x16\x03\xbf\x97\x48\xae\x61"
+ "\xc4\xb1\x1c\xe2\xfe\xe8\xbe\x0f\x21\xfa\xbd\xc8\x97\xd2\x2f\x23"
+ "\xbf\x0f\xdf\x45\x21\x78\xdf\x98\x9d\x8d\xf5\x54\x4a\x22\xfd\x1b"
+ "\x5e\x5b\x6d\x84\x76\xe0\x7d\x44\x19\x7c\x5c\xd3\xb8\x97\xc7\x18"
+ "\xd0\x2a\xc0\xc2\x87\xd0\x06\xbc\x47\x7c\x97\xc4\x8e\x23\xca\x6a"
+ "\x8f\xa2\xc6\x9b\x91\xa8\x34\xea\x32\x0a\xf7\xa7\x9b\xca\x4f\x17"
+ "\xe1\x35\x8c\xae\x45\xf3\x8e\xe2\x75\xe2\x9d\xa7\x24\x23\xea\xaa"
+ "\xaa\x66\x0d\xce\x29\x0d\x48\x46\xea\xbc\xcb\x24\x8f\xb4\xea\x2a"
+ "\x42\xc5\xc9\x08\x11\xbf\xd7\x5c\x72\x5b\xd0\x02\x39\xa4\x49\xe0"
+ "\xf7\xd3\x16\xbf\x17\x0b\x73\x48\x94\x03\xeb\x19\x1d\xc8\x1d\xb6"
+ "\xca\x7a\xc6\x6b\xb6\xeb\x19\x95\xe5\x0e\xaf\x1c\xb4\x3b\x8f\x88"
+ "\xe5\x01\xef\x27\x31\xfd\x9e\xf1\x6b\x13\xc4\xfe\xf2\xe4\xfd\xcc"
+ "\xfc\x68\xdc\xcf\x71\x9f\xc7\xf8\x48\x85\xf6\x62\x8c\x60\x3c\x8c"
+ "\xde\xd6\xd4\xf4\x56\x2d\xa2\xcc\x3e\xa1\x41\x18\x13\xe6\x99\x1a"
+ "\xf7\x35\xd0\xa6\xf2\xa8\xf3\xe0\xf7\x1b\xa8\xbc\x8a\xf5\xf9\xc2"
+ "\xf3\xe0\xcb\xab\xc9\xf4\x4c\xff\xce\xfd\x6b\x91\x3a\xf5\x14\x52"
+ "\x4f\xc1\x6b\x8e\x61\x1c\xf8\x04\x38\xc1\xa6\x77\x11\xc4\x82\x50"
+ "\x75\x13\x1b\x1b\xcc\x96\xbc\x12\x1e\x23\x00\x13\x1f\x26\x00\x26"
+ "\x92\x00\x13\x6f\x61\x4c\x5c\x35\xb9\xcd\x15\xc9\x2f\xcb\xc0\x04"
+ "\x93\x5f\x8e\x06\x4c\x54\x71\x98\xb8\x93\x57\x96\x18\x13\x8a\x26"
+ "\x3a\x31\xb7\x50\x24\x1e\x38\x9d\x57\xbe\xc6\xe6\x95\x79\xf1\x40"
+ "\x19\x36\xae\x49\xef\x89\x29\x89\x8d\xd0\xc4\xe6\xb1\x51\x67\xc1"
+ "\xc6\xde\xe6\xb1\x61\xc8\x12\xc1\xc6\x32\x1e\x36\x32\x78\xd8\x20"
+ "\x79\xa6\xec\xd0\x6d\xb6\xd8\xb8\xde\xa3\x6d\xb0\x61\x35\xef\xe7"
+ "\x9e\xc5\xc6\xf5\x5a\x05\xd8\x70\x20\x6e\x5c\x63\xb1\xa1\x73\x20"
+ "\x6e\xdc\x28\x14\xc1\xc6\x69\x0e\x1b\x3a\x5e\xdc\x60\xf3\x4e\xd9"
+ "\x3a\x91\xb8\x71\x73\x70\xdb\x60\xc3\x6a\x0e\xcf\x3d\x8b\x8d\x5a"
+ "\xc9\xef\x1f\x4b\x63\x43\xe7\x40\xdc\x38\x6b\xc1\x86\x03\x71\xa3"
+ "\xb6\xd4\x16\x1b\x87\x83\x78\xd8\xe0\xc5\x0d\x36\x0f\x85\x39\xa7"
+ "\x0d\x36\x6e\x8d\x69\x1b\x6c\x58\xcd\xc7\xb9\x67\xb1\x71\x3b\x40"
+ "\x01\x36\x1c\x88\x1b\xff\x64\xb1\x11\xe6\x40\xdc\xb8\x5d\x2d\x82"
+ "\x8d\x35\x1c\x36\xc2\x78\x71\x83\xcd\x4b\x65\x87\x89\xc4\x8d\xba"
+ "\xf8\xb6\xc1\x86\xd5\xdc\x9a\x7b\x16\x1b\xf5\x23\xe4\x63\x23\xcc"
+ "\x81\xb8\x91\x6a\xc1\x86\x03\x71\xa3\xc1\x55\x04\x1b\x55\x3c\x6c"
+ "\xf0\xe2\x06\x9b\xa7\xca\x0e\x13\x89\x1b\x0d\xab\xda\x06\x1b\x56"
+ "\xf3\x64\xee\x59\x6c\x34\x46\x3b\x82\x8d\x45\xb5\x22\x3a\xa5\x8a"
+ "\x60\xa3\x09\xca\xf0\x71\xc1\xd7\x26\xd0\x3e\xd7\x70\xd0\x2c\x18"
+ "\x13\x93\x17\x21\x8a\xc1\x45\x2d\x1f\x17\x4d\xbe\x18\x17\xfd\x62"
+ "\x00\x17\x17\x58\x5c\x58\x74\x09\xb3\xf7\x0a\xd1\x26\x96\x9c\x95"
+ "\x45\x9f\xac\xc6\x9a\x35\xc6\x82\x89\xa6\x8d\x6e\xb1\x2d\x80\x09"
+ "\xc1\xbc\x07\x1e\x26\xde\x90\xd0\x27\xaf\x2b\xc7\xc4\xc7\xa0\x5d"
+ "\x9b\x5a\x7a\xed\x93\x05\x13\xa7\x9c\xc5\x84\xd1\xee\xfc\x07\x71"
+ "\x4c\xb0\x3c\x43\x12\x13\x1c\xb7\x20\x98\x38\x6b\x07\x13\xa6\x40"
+ "\x5b\x4c\xb0\xbc\x82\xd9\x87\x80\x70\x0b\x4b\x0e\xcb\xc2\x2f\x84"
+ "\x98\x30\xed\x69\x1b\x4c\x58\xf1\x8b\x7b\x16\x13\xe6\x35\x92\x39"
+ "\xac\xa5\x88\xda\xb8\xd4\x5c\x98\x41\x99\xf7\xc3\xaf\x08\x7e\x25"
+ "\x70\xcc\x0d\x8e\x55\xe0\x6b\xe0\xff\xcc\x39\x73\x67\x66\xef\xe1"
+ "\x22\x2f\x97\x28\x6c\x6f\x5c\xa6\x83\xa5\x8c\xd7\x12\xa4\xdb\xc4"
+ "\xd6\x01\xc7\xd3\xe0\x78\x51\x17\x17\x5d\x07\x28\x5f\x42\xa7\x7f"
+ "\x19\x05\xc7\x3a\xe2\xb2\xf4\x12\x57\xb2\xf7\x31\x45\xe1\x3a\xac"
+ "\xef\xe9\xce\x96\xf1\xe5\xdf\xd7\x73\x89\x0e\xef\xe5\x67\x29\xd3"
+ "\xc9\x4c\x9d\xdd\x82\xcb\x99\x5d\x5c\xb5\xe6\xa5\x48\xcb\x2f\x4b"
+ "\x0f\x45\xb8\x5e\x4b\xd9\xce\x6c\x7d\x7e\xfc\x32\xa6\x4f\x11\xea"
+ "\xe2\xa2\x65\xea\xec\x92\x48\xe1\x36\xe1\xb2\x0f\xd0\x5d\x0a\xf7"
+ "\x33\xe5\x5d\x5c\xfd\x05\xe5\x57\x20\xa6\x2c\x5b\xce\x83\xee\x50"
+ "\xe2\xc7\x96\x63\x38\x1b\x1c\x73\xe5\xdb\x8f\x2d\xe7\x69\xb1\x0d"
+ "\xde\xbf\x8f\xdf\x56\xd3\x52\x0a\xd7\x87\xcb\x74\x31\x77\xf8\xdf"
+ "\x20\xb6\x2d\x41\xfc\x7b\xe2\x72\x70\xdd\x40\xd6\xce\x5e\xd0\x86"
+ "\xe0\x3b\xf5\x65\x75\xa8\xb6\x94\x03\x1c\xf6\xd8\xc4\xd9\x46\x0d"
+ "\xb6\xae\xc5\x7b\x96\x5b\xfb\xae\x8b\x8b\x8b\x1e\xfb\xae\xbc\x06"
+ "\x21\x5c\x96\xee\xf2\xe5\x36\x28\xdf\x95\x6d\x87\x8e\xb4\x83\xd9"
+ "\x33\x91\xf8\x9a\x32\xfe\x29\x9f\x79\x56\x17\x2d\xfb\xac\xdd\xa0"
+ "\xdc\x30\x4b\xbd\x66\x8a\xc1\x30\x5b\xd6\x95\x29\x5b\x16\x87\xbf"
+ "\xef\x75\xa7\xfc\x9f\x70\x59\x53\xfa\x77\xc3\x4c\x4b\x5c\x47\x58"
+ "\xd7\x6f\x5a\xea\x8e\xcf\xf3\xeb\xf7\x26\xe5\xf7\x05\x41\xf9\x91"
+ "\xb6\xe5\xd5\xd6\xe5\x7d\x48\xf9\xaf\xd6\x40\xf9\x08\xdb\xf2\xc6"
+ "\x6e\x56\xe5\xbb\x93\xf2\x07\xaa\xa0\xfc\x38\xdb\xf2\x5a\xeb\xf2"
+ "\x0f\x92\xf2\xc5\x19\x50\x3e\xd2\xb6\xbc\xce\xba\xbc\x86\x94\x3f"
+ "\x18\x02\xe5\x27\xd9\x96\x4f\xb3\x2e\xdf\x83\x94\xff\x36\x0b\xca"
+ "\x47\x59\x97\xdf\xc4\x94\x45\x8f\xb0\x65\x7b\x92\xb2\x45\x35\x50"
+ "\x36\x5a\xa4\xad\x2a\xb6\xee\x40\xb6\xfc\x9f\x49\xf9\xff\x37\x12"
+ "\xca\xc7\xd8\x96\x77\xb5\x2e\xef\x4b\xca\xff\x94\x07\xe5\xe3\x44"
+ "\x7c\x65\x5d\xbe\x17\x29\x7f\xe4\x20\x94\x4f\x14\xf1\x95\x75\xf9"
+ "\x87\x48\xf9\x52\x0f\x28\x9f\x24\x62\x7b\xeb\xf2\x0f\x93\xf2\x65"
+ "\x93\xa0\x7c\xb2\x88\xed\x85\xe5\xd3\x2b\x76\x40\xb9\x45\xf9\x2c"
+ "\x36\xad\xec\x6e\x5d\x77\x6f\x52\xf7\x8f\x46\xb8\x26\xcd\xb6\x3c"
+ "\x72\x21\xe5\xd1\x20\xb6\xfc\x23\xa4\xfc\x49\x6c\xcb\x65\x22\xb6"
+ "\x7f\x14\x97\xdf\x44\xca\x3e\x4a\xca\xfe\xef\x69\x28\xbb\x52\xc4"
+ "\xee\xfc\xb2\x7e\xa4\x6c\xb5\x3b\x94\x5d\x23\x62\x73\x7e\xd9\x3e"
+ "\xa4\xec\x7f\x8b\xa0\x6c\x86\x88\xbd\xf9\x65\x1f\x23\x65\xcf\x94"
+ "\x42\xd9\x2c\x91\xe7\x7d\x84\x57\xf6\x71\x52\xf6\x6c\x25\x94\xcd"
+ "\x15\xf1\x0b\xbf\xac\x3f\x29\x7b\x19\xfb\x30\x4f\xc4\x27\xfc\xb2"
+ "\x7d\x49\xd9\x73\xb8\xaf\x15\x88\xf8\x84\x5f\xf6\x09\x3a\xfd\x57"
+ "\x03\x1b\xa7\xb7\x58\x97\xcd\xe7\xe2\xee\x93\xe6\x2e\x17\x8c\x6c"
+ "\xac\x64\xe6\x6b\xd0\x50\x8e\x1b\x73\x8c\x4f\x59\xc6\x08\x33\x85"
+ "\x02\xe8\xf4\x53\x38\xde\xe1\x3a\x77\xd8\xc6\x36\xd7\xa7\xf2\xb9"
+ "\x31\xa2\x1f\x9d\xde\xb8\x83\xbd\x7f\xa1\x6d\x59\x77\x7e\xd9\xfe"
+ "\x74\xfa\x55\x57\xb6\xec\x5e\xdb\xb2\x6a\x7e\xd9\x01\x74\xba\x41"
+ "\xcb\x96\xdd\x2f\x12\x5f\x07\xf1\xca\x06\xd2\xe9\x37\x42\xa0\xdc"
+ "\x41\xb1\xf8\x4a\x2f\xd5\x0e\xc2\xf1\xc0\x12\xbb\xa1\xfc\x40\x62"
+ "\x5f\x23\xc6\x03\xf3\x8e\xda\x52\x16\xfc\x30\x88\x37\x56\x0e\x32"
+ "\x77\xa9\x8d\x64\x6d\x76\xd8\xf6\x19\xd2\xf8\xcf\xf0\x14\xa9\xf3"
+ "\x76\x12\xd4\x59\x62\xfd\x0c\x6c\x3c\xc2\x3c\x01\xdb\x37\xc8\x94"
+ "\x5e\x9f\x81\xed\x0b\x65\x4b\x05\x1c\x81\x72\x51\xe1\x3a\x59\xdf"
+ "\x0e\xa6\xd3\x6b\xd4\xac\x0d\x04\xe3\x11\xf4\x47\x26\x1e\x82\x7f"
+ "\x4b\xe8\x15\x1a\x2d\x94\x7d\x9a\x2d\x77\xc2\x7a\x1c\x64\x9f\xef"
+ "\x2f\x70\xae\xf2\xce\x18\xe8\xe2\x7a\x5a\x8c\xcb\x24\x3e\x81\x1e"
+ "\xb8\xec\xda\xb1\x9a\x8c\x93\xec\x37\x7e\x5d\x3b\x31\x36\x32\x6f"
+ "\xe9\x5f\x11\x5e\x4b\x1b\xf9\xc7\xd6\x51\x74\xc5\x80\x5a\xe4\x8a"
+ "\xf7\xe9\xa6\x7d\x22\x93\xf5\x70\xdc\xd0\x67\x40\x41\xdd\xfa\x8e"
+ "\xb5\x7a\x97\x7f\x31\xdf\x6d\xab\x5b\xef\x8e\xf4\xe8\xbd\x71\xf8"
+ "\xef\x75\x4b\xe9\x7a\xbc\x7f\xb2\x29\xe7\xff\x67\xef\x6d\xc0\xa2"
+ "\x3a\xb2\x84\xe1\xd3\x4d\xa3\xad\x41\x69\x08\x6a\xab\xa8\xad\x62"
+ "\xd2\x49\xfc\x21\x19\x33\x43\x1c\x8c\x24\xa2\xc1\x8c\x3f\x44\x31"
+ "\x21\x91\x44\x90\x46\x9b\x88\xda\x01\xd4\xd6\xa0\x60\xab\x89\x99"
+ "\xf8\x03\x84\x18\x4c\x10\x30\x21\x3b\x66\xd7\xdd\x30\xbb\xce\x3b"
+ "\xcc\x3e\x66\xd2\x13\x48\x86\x64\x84\x76\x67\xcd\xbb\xcc\x8c\x33"
+ "\xe9\xb0\x8c\x43\x5c\xd4\x9e\xd0\xda\x1d\x69\xba\xbe\x73\xaa\xee"
+ "\xa5\xbb\x2f\x8d\x26\xef\xe4\xdd\xfd\x9e\xef\x4b\xeb\xe5\xde\x5b"
+ "\x75\xea\xd4\xa9\x53\xe7\x9c\x3a\x55\xb7\x7e\x86\x35\x3a\xfc\x3d"
+ "\x28\x7f\xcc\x8b\x38\xbc\xe8\x33\x46\xd0\xf9\xd6\x74\x8e\x84\xc3"
+ "\xda\x03\x17\x35\xda\x45\x6c\x8b\x39\x19\x69\xa0\xf3\x1d\x4c\x9d"
+ "\xf8\x2e\x78\x4a\xeb\x10\x86\x9d\xb5\x17\xde\x20\x98\x43\xae\x31"
+ "\xeb\x80\xed\x5d\xd3\x6d\xd9\x0d\x53\x2e\x69\xb4\xdc\x0e\xd0\x1e"
+ "\xb6\xfe\x31\xc3\xce\xf2\xbd\x6b\xaf\x9a\x1f\xe4\xfb\xd6\x6a\x46"
+ "\x54\xd0\x7e\xb5\xb4\x6f\xed\xc0\x9e\xb5\xf5\x9b\xea\xf9\x3e\xb8"
+ "\x1a\xed\xe7\xbc\x2c\x36\x76\x8e\x25\xcc\x6e\xf2\xdf\xd8\x57\x46"
+ "\x67\x51\xdb\x77\x5f\x82\x4e\x29\x8e\x70\x4a\x78\x72\x94\x78\x28"
+ "\x9d\x6b\xea\xa6\x7a\xe4\x41\x53\x7f\xf9\xfd\x29\x7e\xdd\xfd\xc9"
+ "\xac\x7c\x41\xb5\xa3\xc0\x09\xfc\x1c\x46\xcd\x88\x5f\xb1\xd1\x4f"
+ "\x3a\xfc\xe5\xf7\x27\x60\xf8\x01\x87\xfb\x06\x0f\xef\xd4\x8c\x98"
+ "\x49\x7e\x6f\xaf\x2e\x59\xcf\xca\x93\xe3\xed\x13\x6e\x40\x97\x66"
+ "\x04\x3f\xbb\x8a\xc2\x59\xc5\x82\x6a\xe2\xa7\xbf\x62\xc1\x81\x08"
+ "\x3d\x68\x7a\x63\x92\xf5\x9e\xca\x11\x4b\xe5\xf3\xe8\xe4\xbc\x08"
+ "\xaf\x53\xc2\xf5\xb5\xf7\xdc\xd5\x68\xcf\xd3\x9e\xbb\xdf\x00\xfe"
+ "\x20\xc1\x87\x3f\x83\x04\xfd\xab\x57\x87\x75\x23\x6d\xdd\xe8\x27"
+ "\x9f\x15\x75\x3e\x02\xeb\x3f\x42\xaa\xff\x91\xe0\x54\x0d\x4b\x96"
+ "\x9e\xa3\x9c\xaa\x9f\xb5\x48\xcf\x7a\x79\x8f\xe3\xf0\x7b\x2e\x0f"
+ "\x3b\x83\x75\x7d\xde\xff\x46\xa6\x96\x7c\x7c\x4e\xcf\x98\x61\x67"
+ "\x0c\x93\x41\x75\x51\x33\xb2\x06\xf3\x3c\x2f\xea\x64\xe4\x56\xbc"
+ "\x47\x4b\x77\x97\x74\x67\x04\xc3\xe5\x38\xee\xc9\x26\xe4\x7b\xb9"
+ "\xa8\x8b\x91\x87\x78\xdf\x86\xe4\x06\x65\x8b\xc5\x2c\x28\xe7\x78"
+ "\x5f\x5d\x17\xb2\x9e\x21\xf1\xde\xfb\xbe\x37\xf7\xfe\xef\xff\x20"
+ "\xe9\x81\x9c\x75\xb9\xa6\xbc\xf5\x1b\xcc\xf9\xcf\x6e\x2c\xd8\xb4"
+ "\x79\x8b\xe5\xb9\xc2\xa2\xe2\xad\xdb\xb6\x5b\x77\xec\x44\x3c\x03"
+ "\x67\x62\xb3\x37\x52\x55\x6e\x35\x60\xbd\x3e\x4c\x79\xf4\xf3\x7c"
+ "\x31\x4c\xc8\xd7\xc8\x1e\x8d\x21\x7c\xdf\xc1\x81\xde\x3c\x9d\x69"
+ "\xd8\xa3\xb9\x6d\x09\x9d\xb1\x88\xf2\xad\x72\xd4\x3c\x62\xa7\x73"
+ "\x9c\xbb\x34\xb7\x25\xb7\xbb\x1e\xb1\xd3\xb9\xe3\xcd\xfa\x6e\x48"
+ "\x98\x06\xaa\x4b\x9a\xdb\x8c\x14\x5f\x77\x07\x40\x0b\xa6\x0d\x87"
+ "\x73\x9a\x0e\xf4\xaf\x8c\x65\xae\xaa\xb1\xac\x87\xf0\x57\x1d\x65"
+ "\xdd\xae\xe7\xcd\x70\x18\xdf\x51\xc7\x74\x17\x35\xb7\xf5\x37\xc7"
+ "\xf3\x73\x59\xe3\x6b\x8f\xb2\xae\x7d\x63\x59\xd7\xde\xa3\xac\xa7"
+ "\x6e\x2c\x73\x26\x54\x41\x94\xa7\xf2\xb6\x46\xa7\xe6\x36\x2d\xd7"
+ "\x57\x8c\xf7\xc7\x8e\x3c\x79\x04\xe3\xe6\xf8\x20\xa2\x0e\xdf\x31"
+ "\xcc\xdd\x6c\x10\x74\xbf\xfb\xa5\x37\x12\xf1\x55\xb1\xbe\x02\xd5"
+ "\x61\xcc\x47\xd4\x47\xd4\xd4\x16\xf4\x3a\x30\x3f\x97\xc3\xdb\x09"
+ "\x4e\x4d\x94\xa1\xee\x3a\xcf\x2f\xda\x51\xdd\x03\x84\xef\x9f\x0a"
+ "\xbd\x91\x45\x13\x98\x0f\x61\xc1\xff\x7c\x81\x0a\xf3\xbb\x80\xb8"
+ "\xdd\xc1\xe5\x31\xae\xdf\x54\x6c\xd8\xbc\xb5\xa0\xe0\xae\x91\x60"
+ "\xe4\x77\x08\x3e\x83\xbc\x98\xf6\x56\x7f\xe5\x28\x6b\xc1\x72\xda"
+ "\xb1\xbc\xad\x6d\xd8\x4b\x41\xd9\x00\x2c\x53\x39\xe2\xdd\x8a\xe1"
+ "\x67\xf0\xf9\x0c\xd2\xde\xca\xcf\x34\xd6\x4c\x3a\xc1\x2a\xa3\x66"
+ "\x22\x9d\xad\x74\x16\x1b\xed\xc5\xde\xbb\x3d\x43\x85\xe5\xae\x42"
+ "\xb8\x56\xc3\x04\x98\x81\xe9\xfa\x91\x8e\x06\x7c\x26\x78\x7e\x1e"
+ "\x30\xc2\xb7\x88\x72\x4d\xaa\xa0\x77\xe4\x95\xfd\xf8\x58\x76\xd0"
+ "\x53\x19\xd5\x41\x67\x4c\xf0\x73\x32\xf1\x1d\xf9\xd2\x8a\xb0\xe5"
+ "\xbd\xa5\x19\x2a\xec\xeb\xaa\xea\x02\x38\x4f\x12\x4d\x44\x07\xf5"
+ "\x9f\x7f\x83\x1e\xa8\xbf\x2f\x13\x66\x79\x41\xf5\x9b\x2e\x80\x9a"
+ "\xa3\xac\x1e\xaf\x1a\xbc\xaa\x3f\xc1\xb8\x8f\xf1\x6a\xc5\xf0\xb3"
+ "\x78\xff\x04\xef\x1f\xe3\x85\xfd\x6f\x3d\xd1\x5d\x54\xc2\xba\xe7"
+ "\x54\xc3\x74\xc2\x8f\xb2\xf5\x44\xa7\x26\xde\x4b\xb4\xd3\x19\x32"
+ "\x2c\x76\x54\x41\xc8\xb9\x17\x9a\xd1\x4e\xc0\x78\xbc\xbb\xc5\x3d"
+ "\xf8\x8a\x4e\xc6\x2b\x4b\x7a\x6e\x40\x98\xb3\xd2\x73\x13\x5e\x2d"
+ "\xb7\xbe\x94\xf8\x86\xba\x74\x89\x5f\x1f\xf6\xeb\x5c\x93\x0a\xbe"
+ "\x1e\x5c\x4c\x37\x68\xe2\x52\xf0\xb2\x86\x86\xc7\xa5\x8b\xb0\xf1"
+ "\xf1\xe2\x7d\xbc\x51\xba\x67\xe0\x85\x7c\x9a\x80\xf8\x27\x94\x8b"
+ "\xb0\x09\x35\x78\xef\xc2\xcb\x15\x9a\xff\x24\x4c\x3f\x69\x1f\xd5"
+ "\x67\x1f\xb6\x31\x54\x97\x4e\xcd\xa8\x64\xaa\xa3\x23\x42\xb6\x54"
+ "\xb4\x8e\x0e\xc3\x92\x50\xb6\x6a\x02\xf2\x13\x3d\x2b\x54\x7e\xa2"
+ "\xf5\x0a\xf9\xe1\xb6\x08\xf5\x65\x5f\x9d\x90\x97\x33\xbd\xcf\x9b"
+ "\xf0\x3d\x3a\x1e\xf1\x9c\xa1\x71\x1d\xc4\xc1\xfd\xd7\x23\x97\x00"
+ "\x46\x99\x41\x43\xf6\xa5\x47\x13\xbd\x89\x64\x96\xf2\x96\xf2\x15"
+ "\xb4\x20\x7d\x18\x56\x4f\xf4\x6d\x41\xbc\xf8\xde\x80\x70\xf5\x0e"
+ "\xf8\x52\xa6\x8d\xa7\xf9\xf1\xb3\x28\x8f\x12\xbd\x84\x93\xd2\xb1"
+ "\x40\xb9\x92\x28\x8d\xc8\x5b\x37\x15\xc3\x13\xd1\x46\xd1\x1a\xb9"
+ "\x08\x87\xcf\x09\x24\x93\x74\x77\xf8\x12\x51\x97\xd2\xc0\x4f\xfb"
+ "\xc2\xeb\x21\x11\xf5\x6d\x44\xa7\x46\xa7\x99\x5d\x02\x89\x84\x8f"
+ "\xec\x37\x96\xa3\xb5\x8e\x74\x51\xe0\x1a\x4f\xe5\x20\xfc\x9f\x60"
+ "\x0f\x88\xee\xb5\x44\x0f\xc6\x07\xe5\x5b\xe5\xc0\xde\xd7\x91\x9d"
+ "\xa2\xac\x98\x57\x03\xa6\x6f\xa4\xb2\x13\x3f\x31\xbe\x09\xf1\x64"
+ "\x53\x1c\x9d\x23\x29\x95\xa7\x81\xd6\x26\x12\x3f\x08\xde\x81\x3d"
+ "\x0e\x7e\xe6\x85\x26\x6a\x3f\xe7\x1b\xa6\xa7\xfa\x60\x98\x07\xe1"
+ "\x28\xf5\x31\x1f\x43\x7b\xf4\xd6\x4e\x2f\xfa\x34\x31\xbf\x0b\xad"
+ "\x1f\x5d\x53\x70\xfd\x60\xba\x46\x4c\xdf\x42\x6d\x3f\xd9\x13\xcc"
+ "\x33\x9a\xce\x81\xc6\xb0\x72\x7f\x25\xe2\xd8\xe6\xe5\x63\x51\x88"
+ "\xe7\x63\xa4\xa5\x9c\xf0\x20\x3d\x2d\x02\x57\x8c\x86\xf6\xc7\x0f"
+ "\xae\x6b\x09\x5f\x03\xd5\x39\xd7\xe7\x9d\xbc\x4c\x68\xbb\x62\x8e"
+ "\xd5\x8a\xb8\x26\x84\x69\x62\x7d\x69\xc0\x9e\xcf\x14\xe7\x4d\x8b"
+ "\xb8\xd3\xa5\x5f\xf1\xfa\x6d\x11\x76\x2d\xe6\x17\x45\xbb\x58\x77"
+ "\x80\xee\x18\x8b\x7c\x7e\x94\x44\xf7\x69\xca\x8f\x6d\xcf\xe2\x6d"
+ "\x28\xe5\x41\xe9\x25\x7c\x4b\x09\x9f\xcc\xab\xd9\x48\x87\xe0\x97"
+ "\xae\x0c\xc3\x1b\x48\x16\x39\xdf\xd0\x8e\xf6\x96\x92\x2c\xc6\x14"
+ "\x63\xfa\x33\x87\xe9\x7d\x3b\x7f\xd7\x72\x1b\x3b\x10\xaf\x3b\x43"
+ "\xf1\x0e\xf4\x20\x8f\x6c\x44\x59\xf2\x03\x4c\x8f\x83\x44\xb7\x8d"
+ "\x97\xed\x94\xfb\xf9\x54\x55\xb3\x0f\x80\xe8\x44\x1e\x35\x79\x2a"
+ "\x63\xe3\xd1\xf6\x67\x11\xad\x68\xaf\x4f\xb3\xb7\x32\x81\x68\x46"
+ "\x7b\x26\xd1\x17\x7b\x48\xaa\xfb\xd3\x54\x46\xe2\xe7\x6c\x61\xfb"
+ "\x30\x2e\xee\x5e\xa2\x3d\x50\xee\x58\x73\x30\x8f\x79\xb9\xb1\x1e"
+ "\xa8\xbe\xa8\x5e\x82\x70\x92\xec\x97\x23\xae\x53\xe2\x5d\xc8\x06"
+ "\xf1\xba\x7c\x2c\x3b\x4b\xf0\x01\xd8\xdb\x4f\x50\xdc\x6e\xcc\x7b"
+ "\x8e\x85\x9f\x71\xad\xa2\x33\xc0\x10\xef\x29\xfb\x4e\x1f\x20\x8e"
+ "\x26\xe2\x29\xc2\x5d\x23\x79\xc4\xf7\xb3\x52\x1e\x6e\x6c\xcf\x67"
+ "\xe2\x95\x1c\xd0\xff\xdb\xff\x1c\x2a\x5f\xb7\x2b\xf5\x9f\xea\xbb"
+ "\xdc\x5f\x9a\x06\x5c\x1e\x0a\xc1\x70\x45\x73\xfb\x1e\xa9\xed\x90"
+ "\xea\xfa\xf6\x4f\x9b\x51\x5f\x82\x70\x64\x29\xea\xba\x89\xcb\xe3"
+ "\xf6\xa5\x2a\x2a\x33\xa6\x6d\x92\xf0\xf0\x32\x73\x79\xb2\x71\x19"
+ "\x38\xcb\xb6\x63\x39\x07\xe4\x20\xb6\x49\xaa\xe7\xb3\x0a\x9e\xc8"
+ "\xb6\x8b\x9f\x47\x4c\x36\x09\xfd\xea\x07\x3d\x7d\x01\xbb\x44\x75"
+ "\xef\xe7\x75\x7f\x7b\x76\x9d\x68\x6f\x25\xbb\x75\xbb\x88\x1f\x1b"
+ "\x22\xc3\x44\xcb\xab\x5c\x7e\x89\x96\xd2\x2c\xa2\xa5\x89\xd3\x51"
+ "\x6a\x80\x2b\x9a\xb8\x28\xca\x1f\xd3\x56\x4b\xfa\x2a\xe1\x8a\x2d"
+ "\x20\x5c\x7b\xd1\x56\x11\x4d\x4e\xcd\x68\x2f\xb7\x7f\x8b\xb9\x1c"
+ "\x6c\x92\x68\x6f\xf5\xda\x28\x6d\x74\xf6\x57\x6a\x9e\xb6\x15\xe1"
+ "\xce\x7b\xc5\x79\x6e\x23\x31\xfd\x49\x3e\xc7\x52\xa3\x3f\x4b\x36"
+ "\x9a\xd6\x0e\xe3\xf3\xcf\x0c\x8f\xa3\xac\x5e\x02\x0d\xe2\xd3\x92"
+ "\x8c\xca\x72\xd1\xa3\xd1\xbf\x4d\x7d\x15\xe4\xf5\x29\xf4\x91\x4e"
+ "\x12\xbf\x49\x96\xd1\x47\x9a\xeb\xa9\x8c\x3b\x2f\xcb\x2d\xe6\x53"
+ "\x43\xbc\x17\xf5\x33\x66\x3c\xca\x71\x53\x40\xb6\xc6\x8c\x97\xf8"
+ "\x78\x12\xf9\xa8\xc5\xfc\x8e\x49\xe5\x3a\x89\xf0\xe8\x8b\xe9\x5f"
+ "\x92\x68\xaf\x96\xe0\xef\x97\xeb\x41\xd2\xd5\xb3\x87\xc9\xfe\xf2"
+ "\x3a\x18\x73\x56\x4a\xdb\x20\xe5\xd5\x26\xc3\x92\x8f\xc8\xcf\x66"
+ "\xc6\x30\xb2\x83\x73\xb0\xee\xb9\xed\xdb\x79\x83\xc3\x49\xb6\xb1"
+ "\x45\xe4\xa1\xdf\xca\xe5\x10\xfd\x9e\x80\x1c\x8d\x69\x50\xd8\x27"
+ "\xb2\xc5\xe5\xed\xfb\xc4\xd9\x77\x24\x4b\x64\x53\xa9\x4f\x84\xf8"
+ "\x4a\x24\xfd\x91\x68\x1e\x1b\x13\x2a\x2b\xfa\x1c\x94\x95\x59\x01"
+ "\xdc\x63\x21\x5c\x3b\x57\x27\x6c\x60\x8d\x48\x33\xf6\x31\xa9\x6c"
+ "\xa7\x44\xd9\xa4\x77\xe2\xdb\x6e\xce\xb7\x31\x41\x7c\x44\xbe\x8d"
+ "\xdb\x23\xc1\x37\x91\x2d\x0f\xe8\xeb\xd8\xf7\x64\x5d\x1e\x6c\x2f"
+ "\xc6\x3d\x47\xfa\x10\x44\x57\xb5\xc2\x5e\x34\x85\xb7\x17\x63\xcd"
+ "\x52\x79\xeb\x15\xba\xd1\x20\xf9\xbb\xfb\xe5\x7a\x68\x77\x4b\x67"
+ "\x10\x62\x18\xd9\x4f\xca\x3b\xb8\x0d\xaa\x15\x7c\x95\x74\x79\xdc"
+ "\xd3\x83\xeb\x61\xdc\xcc\x60\x7d\xa6\xba\x26\x9b\x40\x38\xa8\x4e"
+ "\xb9\x5f\x89\x61\xa2\x5e\xc7\x69\xc8\x36\x04\xdb\x68\x84\xad\xf2"
+ "\x33\xd2\x97\x71\x89\xa1\xba\x38\xb6\x46\xd2\x45\x29\x6f\xbd\x0a"
+ "\xeb\x28\x31\x28\xdf\x06\x45\xbe\x54\x37\x2d\xfc\xac\x18\x5e\xc6"
+ "\x71\x97\xe5\x36\x8d\xe0\x31\xad\x15\xd3\x74\x28\xda\xc7\x72\xa2"
+ "\x0f\xf3\x4a\xe7\x36\xeb\x28\xb7\x15\x56\x8f\xa0\xe7\x42\x9d\xd4"
+ "\x4e\x60\x58\xa2\x14\x76\x52\x6a\x4b\x64\xb9\x59\x16\x4a\x93\x3e"
+ "\x29\xbc\x7f\x34\x36\x5d\xf6\x8f\x38\x2e\x6e\x8b\xf4\xc9\x52\xf9"
+ "\x28\x6c\x96\x08\x1b\xab\xa1\xb0\xc3\x82\x0f\x55\x8c\xb7\x57\x63"
+ "\x4e\x4a\xed\x15\xe9\x97\x1a\xdf\xf5\xa4\x63\xf4\x8e\x38\x38\x7e"
+ "\x47\xd9\x0d\xea\x43\x60\xdf\x3b\xee\x34\xd9\x03\xb2\x17\x34\x37"
+ "\x98\xdf\x97\xf3\xfb\x1f\xc9\xee\x90\x1f\x42\xf1\x08\xd7\x40\xb6"
+ "\x08\xc3\xff\x4a\xfb\x02\xb2\xff\xd2\x22\x5e\xfd\x79\x91\x76\x7c"
+ "\x24\xf7\x15\xfe\x2b\x2d\x42\x0e\x93\xd3\xa1\xdd\xfa\x19\xa5\xa3"
+ "\xf4\xb2\xfd\x22\xdb\xe5\x23\xdb\xc4\xf3\x1b\xbf\x44\x92\x71\xde"
+ "\x6f\x90\xfd\xa2\x3e\x75\x10\x2c\x9d\xa5\xc6\x6d\xda\xf8\x2a\x61"
+ "\xcf\xc6\xef\xa7\xb4\xbc\xfe\xd0\x56\xee\xfe\x8a\x7d\x5e\x57\x08"
+ "\x9a\xda\x2f\xc9\x2e\x46\xed\x13\x74\x8e\x77\x8a\x72\x8c\x7f\x87"
+ "\x97\x43\xd8\xd4\x72\x41\x4b\xd4\xbe\xda\x1b\x3c\xee\x43\x2a\x0b"
+ "\xc5\x1d\x09\x8a\xa3\xb3\x11\x31\x4e\x8c\x97\x28\xd2\xf9\xfb\xcc"
+ "\x83\xe0\xeb\x6e\xf0\x7e\x1f\xf9\x08\x92\xed\x9d\x90\x2d\xe8\x9c"
+ "\x30\x49\xb6\xbb\xc8\x97\x53\x64\x7b\x79\xdc\x7a\x09\x66\xb9\x74"
+ "\xe7\xf6\x7d\xc2\x32\xc1\x57\xbd\x5a\xe2\xf7\x69\x51\x8e\x09\x39"
+ "\xbc\x9f\xfd\x5f\x99\xc8\xdb\x09\xa9\x32\x6f\x83\x9f\x49\x7f\x30"
+ "\x7f\x1d\xbd\x73\xb9\x2f\xe1\x7d\xd8\x1a\x82\x21\x9a\x44\x1b\x31"
+ "\x3e\x59\xe9\x53\x5f\xd4\xc4\xff\x8e\xda\x25\xe1\xab\xc6\xff\x42"
+ "\x1a\x7b\x02\x7b\xe1\x9b\xd8\x2e\x4c\xd4\xc8\x36\x86\x79\xd2\x80"
+ "\xce\x58\xba\xa8\x99\x18\x49\x61\x74\x3e\x56\x30\x0c\xd9\xa7\x77"
+ "\x6f\x38\x25\x9c\x13\x9c\xb2\xdd\x20\x5b\xd2\xee\xee\x94\x7c\xba"
+ "\x89\xe5\xb5\x92\x2d\xb9\xa2\x99\x58\x11\xea\x87\x4d\xac\x08\xb5"
+ "\x19\xf1\x6f\x2b\x6d\x06\xfa\xcd\xfb\x3c\x95\x13\x4d\x21\x7e\x00"
+ "\x86\xdd\xdc\x76\x4c\x4c\x22\x1d\xa5\xb3\x59\xb9\x7d\xe2\xe3\x69"
+ "\x13\xbf\x92\x69\x26\xbb\xd9\xfb\xbc\x3c\x7e\x11\xff\x2a\xf9\x6a"
+ "\x8a\xfc\xce\x87\xd8\x4e\xca\x4f\xc6\x87\x25\x27\x3d\xb2\x17\xd2"
+ "\x78\xcb\xc4\x06\xc9\xce\xd7\x87\xd8\x4a\xa9\x0d\x23\x3b\x19\xda"
+ "\x56\x45\xed\x0f\x6d\xab\xe2\xf7\x0c\xb6\x91\xf1\xe9\x5f\xbf\xad"
+ "\x8a\x37\x92\xdd\x92\x6d\x64\xa8\x2d\x88\xcf\xa8\x0d\xf1\x65\x27"
+ "\x5e\x90\x7d\xd9\x80\x1d\x9d\x58\x40\x36\x0a\xf3\x6f\x92\xf2\x46"
+ "\x3b\x31\xf2\x9c\x9c\x37\xc6\x6b\xda\x0d\x28\x9b\x95\x51\x49\x28"
+ "\x53\x8d\x92\x0f\xc8\x75\xf3\x06\x9d\xc5\xa7\x19\x4f\xe3\x9d\x23"
+ "\x49\xce\xec\x9b\xbf\x84\xae\x40\x5b\xd1\xd2\xbb\x45\xe6\xef\xa4"
+ "\xa7\x83\xfd\xc2\xe3\x47\xd9\x01\x4f\xe5\xa4\xb9\xc1\x65\x3c\x84"
+ "\x61\x47\xa4\x31\x04\xce\x5b\x8e\x6b\x12\xf9\x2b\x21\x65\x13\xe5"
+ "\x98\x94\x4c\xe5\xa0\x3e\x11\xe6\xef\x23\xbf\x87\xce\x67\x46\xbd"
+ "\x29\xab\x1b\x90\xf9\xd1\xe7\xbf\xb2\x05\xfb\x57\x51\x17\xc8\x56"
+ "\x4a\x7d\xcf\x56\xf4\x77\xca\x83\xc7\x62\x96\x2d\x4c\x37\x58\x0a"
+ "\xf3\x37\x17\xaf\xbf\xcf\x90\xbf\x39\xbf\x38\x3f\xa7\x20\x7f\x67"
+ "\x4e\x71\xfe\x96\xcd\x33\x37\xe5\x6c\xc8\xcf\x35\x6c\xcf\x29\x32"
+ "\x24\x5a\x67\x58\x47\x42\x00\x74\x9e\x21\xa7\xa8\x68\xeb\xa6\x3c"
+ "\x93\x61\x73\x7e\xee\xac\xc2\xbc\xa2\xbc\x62\x43\x4e\xe1\x96\xad"
+ "\x9b\x4d\x86\x19\xa6\xd9\x33\x12\xbf\x6f\x1a\x19\x3c\x86\x36\x4d"
+ "\x07\x3d\xfe\xeb\x5f\x74\x1f\xb9\x0e\xda\x68\x95\xa5\x30\xda\x9a"
+ "\xbf\x59\x8c\xd9\x4d\x7e\x7b\x4e\x15\x58\x30\x3e\xaa\xae\x92\x78"
+ "\x3d\xa9\x09\xef\x1a\x82\xc3\x72\x1a\xf0\x59\x8b\xb4\xc7\x7b\x2a"
+ "\x27\x9b\x9d\x9a\x69\xe9\xc4\x33\xe4\x85\x01\xcb\x16\xcf\xae\x7f"
+ "\xdc\x8d\x3e\x9b\x85\xe6\x04\xd4\x5d\x87\xb8\xf2\x6d\xa0\xc1\x2b"
+ "\x0a\x2f\x9d\x5a\x47\x63\x5d\x93\xd1\x16\x4c\x69\xe2\x67\x8e\x69"
+ "\xa6\x24\xbb\x62\xe6\x27\xb1\xf2\xf9\x49\xa2\x5e\xa6\x3c\x20\x8f"
+ "\x71\xaf\xd8\x0f\x2b\x48\x3e\x3b\x35\x53\xf8\xf8\xec\x5e\x94\x65"
+ "\x1a\xf7\xed\xfd\xe5\xc3\x29\xe8\x0f\x5e\xa0\xb1\x5b\x8c\x7b\xc0"
+ "\xad\x86\x28\xa4\x4b\xd3\x5c\x92\x08\xaf\x60\x5e\x45\x7a\xc6\x3c"
+ "\x95\x53\x40\x1e\x4f\xc3\x32\xe8\xb0\x2c\x1d\x52\x39\xfe\x93\x97"
+ "\xe3\x28\x4b\xa8\x8a\x45\xfa\x2a\x89\x9e\x29\x33\xe5\x32\x20\xdd"
+ "\x1d\x4e\xcd\xe4\x72\xa4\x53\x47\x74\x85\x1b\xeb\xa3\xf1\x2e\xa4"
+ "\x73\xab\x7f\x1b\xf2\x6d\xb2\x38\xdf\xf5\x48\xad\xd0\x3f\x2c\xcf"
+ "\xa9\x3a\x7c\x3e\xfc\x25\x44\x1d\x2a\x84\x38\x66\x9b\xc2\xda\xdc"
+ "\x3e\x70\x98\x3b\x20\x7a\x07\x73\xb1\xff\xf5\x45\xb7\x54\xa6\x7a"
+ "\xb2\x0d\xff\xf2\x6c\x87\x86\xca\x84\x6d\x45\x54\xdd\x97\x43\x8e"
+ "\x2d\x6a\x5e\x19\xcb\xdc\xec\x8d\x60\x9f\xcb\x30\x82\x78\x42\xfe"
+ "\x56\x2f\xb6\x53\x58\x06\x17\xe6\x9d\x26\xf9\xc6\x6e\xd6\x97\x15"
+ "\xe4\x4b\x4d\x21\x39\x73\x0f\x81\x5b\x2b\xe3\x66\x6a\x7e\x2e\xb2"
+ "\x5e\xd4\xbf\x61\x2b\xa6\x71\x05\xf0\x1b\xd2\x95\xf8\x09\x27\x3e"
+ "\xbb\xe4\x7c\x44\x3f\xdc\x40\x3e\x81\x0b\x65\xd9\x35\x44\x7e\x09"
+ "\x95\x47\xd9\x79\x07\x86\x1f\xf9\x0a\xc8\x57\xc0\xf6\x99\xe3\x6f"
+ "\x44\xbe\xc7\x11\xfe\xbd\x63\x01\xf6\x21\x4c\x6f\xe5\x94\x34\x1a"
+ "\xdf\xc5\x38\xd4\xff\xa8\x14\xe5\x98\xb5\x24\xcf\xf3\x14\xf2\x9c"
+ "\x52\x49\x3e\x61\x15\xe2\x47\x19\x3a\x72\x0d\xc8\x5f\x3b\x3b\xbb"
+ "\x0a\x8c\x94\x0f\x3e\x9f\xa3\xf1\x10\x4f\xe5\x54\x83\x9c\x1f\x43"
+ "\xf9\x3f\xec\x17\x63\x30\x92\x6c\xcd\x74\x58\xbb\xe9\xbb\x08\x6b"
+ "\x46\xfb\x4e\x34\x92\x8c\x61\x9a\x0c\x59\xa6\x50\xd6\xcf\x73\xb9"
+ "\x8a\x03\x23\xab\x34\x74\xd4\xc5\x22\x1c\xca\x55\x2d\xca\x13\xc9"
+ "\x15\xc2\x96\xc9\x32\x85\xb2\x76\x8e\xe0\x90\x86\x91\x8d\x3b\x53"
+ "\x34\x64\x23\xbb\x34\x53\xaf\x91\x8c\xb1\xd7\x7e\xd4\xc1\xc6\xad"
+ "\xe9\x10\xf5\x34\xf5\x9a\xc3\x2b\xea\x20\xc0\xf7\xa9\xad\x41\x7c"
+ "\x3f\x87\x72\x3c\x92\xf8\x2c\xc6\xaa\xa7\x5e\x43\xda\xce\x71\x5f"
+ "\x7c\x17\xd6\x01\x6f\xab\xa6\x9e\xa6\xf4\x12\x0f\xcf\x06\x78\x38"
+ "\x4d\x17\x8e\x87\x0a\xde\x69\xe8\x62\x95\xd3\xe2\x49\x57\x30\x4d"
+ "\x2a\xb6\xa2\x5d\x43\x7d\x2b\xc0\x3c\x34\x9a\x2a\xd0\x52\x1e\x2d"
+ "\x71\x1c\xbe\x58\xce\xe3\x08\xf2\xda\x55\x6a\xbe\xa9\x3c\xb7\xd4"
+ "\x03\xd0\x98\x38\xa5\x4f\x88\x23\xfe\x4e\x3b\x1d\x48\xcf\xdc\xca"
+ "\xf4\x33\x72\x43\x68\xe5\x17\xd2\xda\xfa\x4a\x2c\xca\x91\xa0\xd7"
+ "\x7d\x33\x7a\x13\x0c\xa2\x9d\xb4\x4f\x23\xf9\x9e\x3e\xcb\x81\xbd"
+ "\x5d\x0a\x93\xde\xe3\x7b\xb1\xed\x51\x8e\xef\x0f\xfd\xbd\x61\xfa"
+ "\xa6\xd0\xef\x0d\xd3\xb3\x86\xfa\xde\xa0\xc8\xf7\x1d\xca\xd7\x5f"
+ "\x97\xa1\x0a\xca\x9b\xb7\x7b\x43\x7d\x5b\x98\x5d\x1f\xdc\x9f\x99"
+ "\xfe\x15\xd1\xd0\x8e\xed\x14\x9b\x98\xa1\x62\x88\xa7\x85\xb7\xe1"
+ "\xd3\xbd\xc2\x7f\x21\xbf\x68\x7a\x07\xc1\x28\xcb\x31\xf0\xd3\xc6"
+ "\xfd\x8a\x6e\x5f\xf1\x97\xc8\xc5\x40\x33\xfc\xc1\x60\x96\xa3\xd5"
+ "\x21\xc0\xc0\xc2\xbc\x44\x01\x4c\xe5\xf0\x0c\x7f\x22\x48\x7a\x77"
+ "\xf1\x17\xcd\x00\xfc\x40\xfc\xdf\xf0\x1b\x21\xe8\xe5\xf8\xbc\xa0"
+ "\x92\xf2\x3b\x10\x04\x91\x7a\x93\xd4\x0c\xe4\x24\xe1\x7e\xcf\xe1"
+ "\x55\x96\x81\x7e\xe4\xd4\x93\x1c\x98\x31\x9f\x84\x5f\x7e\x67\xc1"
+ "\xef\x14\x12\xfa\x8e\xbf\x88\xac\xa0\x0c\xa6\x44\x98\xf8\xf4\xae"
+ "\x04\xe7\x40\x90\xba\x5e\x17\x9c\xa5\x0e\xca\x22\xf9\x43\x34\xfd"
+ "\xf1\x22\x3e\x23\xc6\x4f\x6d\x1d\x00\xb8\xdd\xbd\x27\x08\xfc\x37"
+ "\x82\xfc\xe9\xfa\x9b\x94\xf1\x9b\xfe\x26\x07\x3d\x4f\x11\xb7\x69"
+ "\x1d\xdf\x22\xfe\x9b\xff\x0c\xe7\x46\xc8\x8f\x01\xf1\x98\x9e\x1d"
+ "\x0e\x34\xc0\xff\xe9\x76\x39\x28\x58\x42\x03\xf1\x77\x26\x87\xbe"
+ "\x1b\xbd\xa1\xef\xf7\xa4\xfd\xed\x84\xa3\x0e\xd2\x9f\x52\x67\x0c"
+ "\xc0\xdd\x71\x03\x81\xd1\x0a\x95\x89\x2e\x57\xa8\x50\xe0\x27\x51"
+ "\x13\x81\xf4\xd4\x04\x05\x6b\xc2\x43\xff\xdf\xf9\x4d\xd8\x23\x29"
+ "\xc4\x14\x97\x6e\x50\xe4\x02\x45\x18\xbd\x0f\x33\x48\x61\xf7\xfe"
+ "\x6a\x10\x3c\x0f\x33\x04\xbd\xab\x52\xf0\x4f\x3d\xc0\x8c\x82\x6f"
+ "\x83\xd6\xef\x7e\xff\x3f\xfc\xa9\x48\x3f\xbe\xfb\xfd\x5f\xfa\x31"
+ "\xd1\x8a\xa3\x25\xe2\x37\xfa\xc7\x06\x0c\x25\x93\x22\x98\x14\xc0"
+ "\xa4\x87\x6f\xa5\x1d\xff\xee\xf7\xdd\xef\xbb\xdf\x77\xbf\xef\x7e"
+ "\xdf\xfd\xbe\xfb\xfd\x7f\xe0\xa7\xe2\xfd\x08\x26\xfd\x06\x9e\x07"
+ "\xe2\xa9\x1b\x64\xae\x61\x6a\x15\xb0\xa0\x88\xb2\xfb\x41\xa5\x85"
+ "\x61\x9a\x6f\xcf\xcb\x33\x0c\x10\xf4\x35\x13\xd0\x99\x7d\xf7\xe2"
+ "\xf5\x3d\xbc\x26\x06\x85\x4f\xfb\xb6\x28\xfa\x9b\x7f\x2a\x64\x5e"
+ "\x04\xf6\x0b\x23\x61\x18\x0c\x07\x2d\x8c\x80\x91\x70\x1b\x44\xc1"
+ "\x28\x18\x8d\xfd\x4d\x1d\xc4\x40\x2c\xdc\x0e\x71\x30\x06\xc6\xc2"
+ "\x38\xd0\xc3\x78\x98\x80\x25\x89\x87\x49\xd8\xb7\x9f\x82\x0c\x99"
+ "\x1a\xbe\x2c\x65\x90\xa2\xc7\x3f\xf8\x3f\x1d\x52\xf8\x7b\xf6\x77"
+ "\xe1\xff\xad\xe1\x76\x29\xfc\x9c\x14\xee\xfc\x2e\xfc\xbf\x35\xdc"
+ "\xf0\x3f\x7c\x9f\xfa\x3f\x7a\x57\xa1\xc9\x16\x56\x5b\x15\xd6\x56"
+ "\x2a\x43\x55\xd2\x6f\xe0\x1d\x6e\x91\x7e\x10\xbe\xd0\xf4\xca\x5f"
+ "\x0a\x5e\x73\xc5\x63\x29\x80\x18\xe7\x65\xc1\x3f\xdf\x50\x29\xe5"
+ "\xdf\x9e\x2e\xbc\x5c\x78\x21\xe4\x1e\x6c\x61\x6c\xb7\xe1\x35\x46"
+ "\xc6\x23\x60\xb4\x78\x5d\xc1\xf8\xcf\x1a\x00\x9c\x17\xf0\xc2\x6c"
+ "\x3f\xb7\x02\x74\x46\x01\xfc\x79\x29\xc0\x7f\x9e\x02\xb8\xd8\x13"
+ "\xc0\xd9\x5b\x16\xa0\xee\xaf\x16\xf1\x6c\xc0\xeb\x3a\x21\x02\xa7"
+ "\x6a\x60\x78\xcf\xbe\x28\x23\xcd\x70\xef\xec\xb9\xb3\xef\xff\x5e"
+ "\x8e\x61\x56\xfa\x2c\xc3\x7d\x89\xf7\xde\x3b\x27\xf1\xfb\x73\xee"
+ "\xfd\x81\xe1\xbe\xfb\xe6\xdd\x9b\x38\x2f\x31\xd1\xb0\x69\x47\x61"
+ "\xfe\xbd\x89\x1b\xf2\x0c\x9b\x4d\xf9\x45\x86\xf5\xf9\x85\x9b\xb6"
+ "\xe7\x14\xe6\xdd\xaa\x5c\xdf\xf0\x47\xe4\x4d\xf2\x03\xaf\x81\x50"
+ "\x6e\x2f\x00\xcd\xcc\x34\xd0\xcc\x4f\x81\x41\xd5\xa3\x2a\x97\xc6"
+ "\x52\x8d\xd2\x15\xf6\xb7\xe9\xa9\xc7\x7f\x3f\x63\xcd\xe8\x0f\x1e"
+ "\xda\x30\x63\xfe\xc2\xb7\x8e\x34\x82\xfa\x7b\xad\xa0\xbe\xa7\x00"
+ "\xd4\x53\x67\x82\x7a\x4c\x06\xa8\x87\x77\x81\x7a\x4b\x12\xa8\xd7"
+ "\xdb\x41\x9d\x65\x02\x75\xba\x05\xd4\x0f\x87\x09\xdb\x5d\x20\xc2"
+ "\xfe\x59\x07\xea\x9f\x94\x83\xfa\x8d\x12\x50\x1f\x3a\x25\xc2\x5a"
+ "\xab\x40\xfd\xde\x2d\x6b\xfb\xbf\xf9\xf7\x75\xfd\x89\x41\x3f\x27"
+ "\x97\x39\x5a\x0f\xb0\x33\x3e\xcc\xa0\xe9\x77\xbf\xef\x7e\xdf\xfd"
+ "\xbe\xfb\x7d\xf7\xfb\xee\xf7\xdd\xef\xff\xe5\x3f\x97\x0a\xe6\x7e"
+ "\xa9\xd6\xc0\x07\xe8\x2d\x79\x6c\xda\x78\xa7\xea\x81\xb9\x34\xc7"
+ "\x04\x68\x2d\x15\x68\xf9\xbe\x2f\xe2\xd2\xe0\x2d\x12\x1b\xfe\x61"
+ "\x78\x0d\xd7\x06\xcf\x55\xa1\xb9\x48\xcd\xfa\x44\x88\xd0\x83\x98"
+ "\x37\x65\x63\xe7\xc4\x7a\xe7\xfb\xa0\x07\xb4\x7c\xcf\x03\x5a\x3f"
+ "\x8a\xf8\xad\x4e\xf8\xfb\x7a\x79\x9e\x95\x0c\x47\xf3\xac\x68\x5e"
+ "\x16\xc2\xf2\x79\x27\x43\xcc\xab\xd1\xb1\xd7\xf4\xea\x85\xc7\x01"
+ "\x68\x1d\xea\x2b\x47\x99\xab\xa5\x04\xa0\xb9\x41\xac\x47\xa5\x39"
+ "\x37\x88\xbf\xc3\x09\x07\x1a\xc4\x3c\x2b\xe6\xde\x8b\xe1\x18\xd6"
+ "\xe3\x84\x97\xaa\xa4\x3c\x7b\xe4\x70\xc7\xbe\xeb\xd0\x62\xe0\xeb"
+ "\x6d\x5c\x2d\x86\x7e\x48\x9d\x4a\xe5\x1f\xa1\x47\xd8\xf8\xa1\xe6"
+ "\xd8\xc8\xf3\xc9\x28\x6f\x09\x3e\x4d\x91\x1f\x96\x71\x44\x96\x9c"
+ "\xdf\x10\x38\xa2\x28\xad\x8c\x07\x69\xef\xc1\x34\xe5\x32\x1e\xa4"
+ "\x47\xa6\xd1\x95\xba\x8b\xe7\x71\x2a\x1c\x4d\x86\x0f\x93\x23\xf3"
+ "\xbe\x3f\xa7\x2b\xf9\xfc\xfa\x04\xc3\x98\x7b\x17\xe5\x25\xdc\xc9"
+ "\x12\xa3\x67\xbe\x9c\x78\x5b\xca\x88\x94\xd1\x73\x56\x26\xaa\x75"
+ "\xea\x69\xea\xc4\x58\x9d\xfa\x8e\x75\xf4\xf7\xdc\x64\x23\xbf\x1b"
+ "\x34\xc9\xfb\x4c\xdf\x37\x0c\x5f\xf0\xe2\x0b\xdb\x52\x7e\xfe\x93"
+ "\xc5\x29\x8f\x3c\x5e\x74\xd7\x07\x89\xea\xdb\x7f\xfb\xf2\x7b\xc6"
+ "\x2f\x09\x62\xea\x34\xfa\x9b\xd5\x1c\x11\x77\x97\x8d\xb0\x9c\x1b"
+ "\x6f\xf8\x80\x42\xee\xd6\x24\x17\x9b\xee\x9f\xd3\x40\x39\xae\xce"
+ "\x9d\x65\xa3\x34\x8b\x97\x89\x34\x02\x62\xce\xe9\xe0\xb8\xd9\xff"
+ "\x4c\xa9\x0d\x9c\x06\xd0\x08\x5c\x03\xb8\xc7\x09\x0a\x45\xe8\xb4"
+ "\xb6\xc4\x49\x52\xde\x6f\xd2\xdf\xa7\xde\x9a\xad\x46\x0c\xb1\xb3"
+ "\x1e\xa6\xd8\x39\x9e\x44\x8f\xa1\x25\x59\xb3\x21\xc1\x38\xfc\xde"
+ "\x9f\xe0\x53\xc2\x86\x04\x9d\x1a\x9f\x5f\x14\xcf\xc4\x03\xd3\x0f"
+ "\x04\x84\x4e\x3d\x23\x2e\xd9\x64\xfa\xfe\x67\x6e\xd3\xf7\x75\xea"
+ "\x94\x06\x53\x72\xca\xd8\x83\x05\xf7\x24\x24\x27\x98\xee\xd7\xa9"
+ "\xf9\x7d\x5e\xca\x8c\x1f\x3f\xa5\x53\xdf\xf9\xab\xc4\x18\x9d\xea"
+ "\xd7\xf5\x2a\xf8\x50\xbd\xea\xd4\x87\x11\x9f\x7e\xfa\x11\xdc\xbd"
+ "\xe9\x23\xd5\xdd\x4b\x3f\x52\xab\x62\x3e\x8a\x7a\x12\x7e\xad\x1b"
+ "\x0e\xbf\xd6\xe3\x65\x78\x04\x5a\x55\xa5\xe9\xad\xea\xed\xd9\xad"
+ "\x11\xa5\xed\xad\x9a\x27\xa0\x35\x72\x6d\x4c\xeb\xb0\x47\x1e\x6b"
+ "\x1d\xfe\xc4\xe7\xad\xda\x3b\xa1\x75\x04\x40\xeb\x54\xf4\xf3\xa7"
+ "\x41\x5c\xeb\x7d\x31\x2f\xb4\x3e\x32\x59\x6d\xbf\xbd\xf7\x21\xfb"
+ "\x04\xcd\x62\x7b\x82\x0e\xec\x33\x46\x82\xfd\x8e\xa8\x28\xfb\x9d"
+ "\x78\xdd\x05\xf5\xf6\x44\x7c\x4f\x86\x78\x7b\xe4\xce\x61\x00\x82"
+ "\x96\x8f\x0c\x00\x1f\x4d\x85\x05\x1f\x4d\xc3\xfb\x74\xbc\x12\xf0"
+ "\x9a\x81\xd7\x9d\x78\x61\xff\xe5\x23\xda\xdb\x08\x8c\xc3\x92\xff"
+ "\xd7\xaf\x72\x72\xe6\xe6\xdc\x9f\xb1\x30\x22\x22\x2f\x01\x6e\x43"
+ "\xae\x69\x92\x13\xa6\x46\x26\x45\xe6\x25\x7c\xe6\x4e\xc1\xbf\x3a"
+ "\xf5\xd3\xff\x1e\x31\x6c\x8e\x27\xc9\x93\xfd\xf3\xcf\xfa\x61\x24"
+ "\xf2\x1f\x94\x32\xdc\x6b\x03\x95\x1b\x69\x74\xdb\x7a\x1f\xf2\xd8"
+ "\xa2\x74\x4e\x18\x61\x96\xe5\x58\xc4\x7d\xa0\x73\xdb\xca\x50\xfe"
+ "\xa2\x66\x86\x8f\xdb\x43\x71\x69\x37\x49\x67\x0a\x1f\x47\x32\x1d"
+ "\x55\x26\xc7\xf5\xaa\x9b\xd3\xf1\x1d\xe5\x5f\x9b\x14\x0a\x6b\x8f"
+ "\x70\xdb\x54\x7b\x30\xee\xd4\x60\x3c\x76\xc4\x93\xfa\x63\x8c\x6b"
+ "\x0d\x13\xf7\xa8\xdb\xb6\x92\xf2\xe8\x52\xe4\xe1\x96\xf3\xa0\x75"
+ "\xde\xb5\xa8\x5f\x64\x77\xfc\xb6\x11\x4d\x94\xd6\xe1\x75\x41\x83"
+ "\xbf\x5b\xa5\xb1\x9e\x05\xc2\xe3\xb1\x8d\x4a\x90\xd3\x13\x1c\xed"
+ "\x49\x40\xeb\xf3\xf8\x3c\x50\x18\xb5\x9a\xe6\x81\x1e\x46\x1c\x86"
+ "\x6d\xaa\x71\x9d\x10\xd5\x4f\x69\x9c\x30\xca\xec\x56\x7f\x82\x79"
+ "\x8f\xca\x96\xed\x1c\x86\xf1\xb5\x00\x94\x07\x96\xbd\x0c\xe3\x4a"
+ "\x06\xd3\xfc\x49\xac\xe0\xcb\xa8\x6a\x39\xee\x66\x73\x0b\x45\x1a"
+ "\xc6\xdc\xb6\x4f\xfc\x98\xe6\xec\x60\x7c\xac\xcc\x6d\x53\xbf\x80"
+ "\x71\xdd\x61\xe2\xf6\x88\xbc\x46\x6b\xc2\xc4\xd9\x30\x4e\x8d\x71"
+ "\x86\x21\xe2\x22\x30\x2e\x39\x5c\x5c\x4b\x0d\xc7\x99\x39\xc0\xf3"
+ "\xd1\xa3\x52\xf0\xdd\x2c\xf3\xfc\xd6\xe5\xa1\xfa\xbe\x17\xf9\x3e"
+ "\xba\x46\x89\x9f\x70\xbb\xd5\x6d\x84\xaf\x69\x70\xde\x67\x55\x6e"
+ "\x5b\x1a\xca\xc2\xe8\xf3\x83\xe3\x7e\x33\x11\xf9\x40\x74\xb9\xc2"
+ "\xc4\xc5\x63\x79\xd0\x5e\x47\x47\x85\xc1\x39\x0c\xe3\x9c\x18\x67"
+ "\xbc\x45\x7d\xe8\xb8\x0d\xa7\x7d\x10\x26\x43\xe4\x45\x88\x9d\x4f"
+ "\xe5\x11\x72\x01\xc3\x2e\x42\x4c\x5b\xaf\x98\x13\xef\x32\xec\x84"
+ "\x08\x7c\x3f\xc1\x6c\xf6\x31\x18\xdf\x83\xf2\xa4\x75\x5c\xf7\xc1"
+ "\x45\x88\x3e\x88\x30\x11\xb4\x86\x95\xda\x27\x0c\x8f\x70\x78\x7d"
+ "\xb4\x8e\x03\xe5\x2c\xfa\xa7\x78\x57\x63\x3a\xbe\xc6\x6f\x55\x0d"
+ "\x24\x10\x8d\x7c\x1e\xab\xcd\xae\xa2\x79\xa1\xd4\x1e\xba\xd5\x70"
+ "\xa7\x9b\xcb\x6c\x34\xb6\x7f\xda\x7a\x69\x0e\x2f\xd1\xa0\xc1\xb4"
+ "\xbb\xd4\x3a\x3e\x27\xdc\x85\xb8\x88\x86\xc7\xfc\x36\xbb\x7a\x00"
+ "\x8f\xda\x7e\x1b\xcd\xef\xed\xb5\xa9\x97\xb8\xd5\xd1\x4c\xe0\xd1"
+ "\x19\x64\x3c\x04\x87\x79\xf1\x79\xf2\xbd\x36\x4d\x65\x10\x4c\x6a"
+ "\x70\x5e\x73\xdc\x10\x41\x34\x77\x82\xae\x86\xf2\x93\xca\xc8\xe7"
+ "\xdc\x3a\xb6\xf9\xc0\x81\xfe\xc5\x45\xd0\x59\xb1\xac\x86\x66\x2f"
+ "\xad\x75\xb6\xc7\xd4\xed\x06\xe0\x7a\xa1\x06\x83\x84\xb3\x5a\xc6"
+ "\x49\x38\x82\xca\x1a\x2b\xf2\xa7\xb2\x6a\x41\x82\x6d\x09\xa6\x91"
+ "\xf0\x62\xb9\xc6\xd5\x22\x5c\x0b\x7a\x2d\x12\x4c\xb7\x0c\x13\x54"
+ "\x07\x53\x25\xfa\x88\x3f\x54\x67\x59\xb2\x7e\x7a\x6c\x31\xd8\xfe"
+ "\xdf\xd6\x2d\xf4\x36\x10\x2e\xd1\xa0\x17\x34\xa8\x90\x06\x95\x5d"
+ "\xe0\x8f\x49\x93\xf1\x3b\x41\xe7\x0d\xa6\xb9\x96\xc3\xea\x46\x08"
+ "\x3d\xe5\xb0\xc5\x01\xd8\xe8\x10\x58\xe4\x85\x5a\xd4\x01\xa8\x9d"
+ "\x10\x63\x42\x7e\x44\x20\x4c\x23\xd6\xb7\x41\x86\x91\xca\xaf\xc7"
+ "\xb8\x05\x12\xbe\x96\x20\x7c\xc5\x84\x8f\xe6\xc5\x0a\xdb\x1b\xe3"
+ "\x0c\xd8\x3e\x68\xc5\x77\xd7\x60\xfb\x4a\xfa\x1a\xab\x45\xb8\x04"
+ "\x0a\xb7\x4c\x03\xdd\x25\x88\xf9\x73\xaf\x3a\xa2\x5b\xf0\x22\x16"
+ "\xed\xdf\xa8\x01\xdf\x06\xdf\xe7\x3a\xc1\xe0\x95\xf2\x33\x11\x6f"
+ "\x02\xf6\x96\xf2\x8c\xcd\x90\xf3\x94\xe3\x83\x75\x26\x65\xc4\x1c"
+ "\xf4\x4f\x52\xfe\x3e\x25\x3e\x65\xb2\xec\xbb\xcc\x6f\x59\x9f\x30"
+ "\xc7\x3d\xbf\xc5\x70\x7f\xe2\xdb\x79\x09\x33\x79\xdb\x7f\x67\x67"
+ "\xe2\x34\x6c\xdd\x7f\xcb\xff\x56\x52\x48\x02\x0f\xc1\x70\x7a\x9e"
+ "\x46\xcf\x92\xbf\x80\x4f\xab\x57\x45\x0c\x9f\x51\x48\x4f\xc2\x73"
+ "\x48\x19\xfb\x4c\x6e\x44\xaa\xf4\x3c\x5a\xc4\xdc\xc3\x7d\x0e\xe3"
+ "\xc3\xf4\x7c\x07\xc7\x35\xa7\x81\x72\x9e\xfd\x72\xe2\x0f\x1f\xff"
+ "\x97\x88\x8f\x5e\xd8\x98\x12\x75\xa7\x8d\x60\x66\xfe\x28\xf1\x0d"
+ "\x0c\x69\xa6\x90\x69\x6f\x72\x0a\x82\x53\x9d\xa6\x54\x52\x7c\xfc"
+ "\xcc\x45\x89\xaf\xae\x59\x35\xfd\xb7\x89\xb1\xb7\x7f\x90\xd5\x4c"
+ "\xe9\x6f\x8f\x0d\xc9\x69\x5a\x80\xaa\x75\x47\xee\xda\xff\xbd\xb7"
+ "\x05\x96\xc7\x57\x45\xfc\x36\x65\xf2\x96\x42\x0a\x9d\xce\x7d\x31"
+ "\xf2\x55\xe6\x5c\x4b\x8c\x7c\xe1\xf1\xcf\xfe\xf5\xf1\xb7\xce\x3d"
+ "\x75\x17\x96\xf4\xf6\xca\x73\x4f\x3d\xfe\xd6\x67\xff\x1a\xb1\x97"
+ "\x20\xef\x36\x25\xc6\x19\x22\xe7\x6f\x6d\x79\xec\x2e\x4e\xd5\xb8"
+ "\x83\xfa\xea\xf1\x0d\x13\x1a\x27\x9e\x89\x6f\x9d\xf4\xef\x93\xff"
+ "\x34\xe5\x0b\x83\x7b\x2a\x43\x3f\xe2\xa1\xc4\xa9\x03\x7e\x04\xa0"
+ "\x1f\xd1\x89\x7e\x44\x29\xfa\x11\xed\xc1\x7e\xc4\xc7\x23\xe7\x95"
+ "\x08\x5f\x42\xc0\x0b\xff\x67\xe6\xbf\xa3\xff\xb3\x19\xfd\x9f\x99"
+ "\x1f\x45\xae\x7e\xe2\xa3\xa8\x0c\xe1\xff\xc4\x44\x0f\xe3\x3e\xd0"
+ "\x78\xbc\xa3\x1f\xf4\xeb\xa9\x78\x37\xe2\xfb\x5d\xb1\xc3\x43\x7d"
+ "\xa2\x95\xa3\x5b\x23\xb3\xd0\x27\x4a\x46\x9f\x28\x25\xa7\x55\xbb"
+ "\xe4\x57\xad\x23\x92\x52\x5a\x47\x0e\xf8\x45\x8b\x5b\x53\xf5\x73"
+ "\x5a\x97\x68\xa0\xf5\x51\x10\xbe\xd1\x3e\x48\xfc\x58\x13\xa7\xfa"
+ "\x4d\x14\x68\x7e\x33\xba\x7e\xe4\x6f\xa2\xed\xf6\xdf\xe8\xf0\x8a"
+ "\x81\xfa\xdf\xc4\xc2\xf0\x0f\x1e\xaa\x87\x0f\x16\x96\x3a\x3f\xd2"
+ "\xc0\xe8\x8f\x46\xc0\xb5\x8f\x62\xf0\x9e\x7d\x14\x3e\x7a\x11\x34"
+ "\x1f\x8d\xd4\x5c\x0b\x94\x37\xee\xcf\x1f\x4d\xfd\x70\xfe\x47\xd3"
+ "\x92\x7f\xf9\xd1\xf4\xd4\x95\x1f\x25\x7c\xf8\xe1\x47\x33\x9c\x93"
+ "\x83\xfd\x26\x2a\x33\xc0\x3d\xfb\xc8\x83\x45\x7e\xdf\x6f\x1c\x96"
+ "\x38\x6c\x7f\x1e\xf7\x07\xbf\x2f\xf9\x85\xdf\x4f\x59\xf4\xc2\xe3"
+ "\x8f\xe7\x46\xa8\x53\x26\x73\xef\x52\xf2\x34\x03\xde\x67\xa8\xcf"
+ "\x39\xbf\x25\xe0\x73\x26\xb8\x03\x3e\xa7\x61\xd8\xfc\x6d\x21\xfe"
+ "\x59\x1f\x86\x9d\x4f\x4e\x30\xcc\x48\xe4\x9e\xd9\xb9\xf1\x4a\x6f"
+ "\x6d\xf6\xa1\xc4\xf9\x09\xda\xfb\x3b\xd0\x67\x1b\x7e\xe0\xc5\xdc"
+ "\x9f\xd0\x85\x5e\xdb\x57\x3a\xf5\x0b\xcf\xe6\x24\x65\xee\xbd\x1b"
+ "\xeb\xfc\x76\xf2\x82\x87\xbf\xb8\xbf\xe9\xc5\x17\x5f\x68\xfa\xe8"
+ "\xa9\x55\x77\xfd\x33\x86\x7d\x90\x50\x8c\xf2\xf3\x1f\xa6\xff\x98"
+ "\x73\x2d\x39\xf2\xc5\x27\x9a\x5e\x78\x6d\xc3\x86\x16\x92\x17\xaa"
+ "\x5b\xb9\x8d\xea\xb5\xc5\xa2\x4f\xa2\xfa\xb9\xc7\x36\x06\xfd\x9f"
+ "\xf1\xad\xca\xb6\xec\x3b\xbd\xfc\x4e\x2f\xbf\xd3\xcb\xff\x09\xbd"
+ "\x1c\x0b\x42\x2f\xc7\x1f\x0c\xa7\x97\x4b\x96\x2f\x5e\x31\xcf\xb0"
+ "\x35\xd7\x60\x29\xdc\xb2\xa1\x30\x67\x93\xa1\x60\x4b\x8e\x29\xcf"
+ "\x34\x12\x06\x22\x72\x72\x8b\xf3\xb7\xe5\x14\xe7\x0d\x5a\xf3\xa8"
+ "\x97\x7d\xd2\xc1\xbe\xf5\x78\xef\xd0\xbe\xf5\x84\xb8\xf0\xfd\x12"
+ "\x15\xb6\xed\x13\x12\xc3\xc4\x4d\x93\xe2\x96\x86\x89\x7b\x58\x8a"
+ "\x33\x87\xe9\x03\x8e\x12\x7d\x8c\x09\xfb\xc2\xc5\x61\x78\x8d\xec"
+ "\x93\x60\x3f\x4d\xdd\x32\xad\x07\xc8\x27\xb9\x08\x13\x3e\xc4\x32"
+ "\x75\x63\xfc\x19\xd9\x97\x71\xc2\x84\x7d\xb2\x8f\x26\xf5\x43\x8c"
+ "\x6e\x5b\x0a\x96\x73\x82\x33\x4c\x1f\xe5\x6e\x29\x5f\x5f\xc0\x37"
+ "\x5a\x6e\xf0\xd8\x26\x46\x0d\xf6\x8d\xce\x81\xe8\x43\x4e\x34\x2a"
+ "\x60\x93\x64\x58\xf4\x27\x69\x2f\x88\x1e\x5a\xab\xd6\x03\x13\xcf"
+ "\x30\xdb\xf8\x6a\xf2\x29\xa9\x1f\x49\x78\x44\x5f\xb2\x83\xf7\x25"
+ "\xb1\xaf\xd8\x85\x69\x8b\x83\xfa\x93\x5d\xe8\x1b\x0f\xa7\xfe\xe4"
+ "\x45\x98\x78\x82\xfa\x94\x87\x39\xae\x4b\x84\x6b\x19\xe1\x72\xc2"
+ "\x44\x3b\xf7\xfb\x44\xda\xc6\xa0\x71\x33\xec\xd7\x4e\xe4\x7b\x99"
+ "\xca\x7e\x21\xc6\x9f\x73\x6a\xb2\x7a\xe4\x32\x90\x2f\x28\x95\xa3"
+ "\x4c\xd4\xc3\xc4\x30\xfd\x9f\x73\x95\xa2\x1f\x18\x3f\xd0\xff\x21"
+ "\x7c\x7e\xdb\xf8\x9f\xd6\x72\x9c\xf1\x09\x32\xce\x60\xb9\xcc\xdd"
+ "\xb2\x79\x7d\xfe\x86\xad\x85\x79\x86\xa2\xa5\x4b\x0d\x9b\xb6\x98"
+ "\xf2\x66\xcf\x9e\x3d\x32\x44\xfe\xa2\x84\x4f\xfb\x49\x0a\xc9\x21"
+ "\xf9\xb5\x92\x1c\xa6\xa0\xcf\x29\xf9\xcd\xf1\x65\xa1\xfd\x8b\x4f"
+ "\x52\x24\xff\x56\x87\x30\x89\x12\x4c\x43\x08\x0c\xe2\x93\x7c\x64"
+ "\xf2\x73\x47\x4b\x30\xad\x4a\x3c\x18\xc7\xfb\x45\xb4\xfe\xae\x57"
+ "\x94\xaf\x47\x81\xe7\x21\xa9\xbf\x83\x72\x3f\x4c\xea\x27\x4c\xd2"
+ "\x29\xf0\x3c\x14\xe8\x6f\xa8\x64\x98\xb9\xc1\x7d\x13\x7c\x4f\x95"
+ "\xeb\x24\xe0\xc7\x37\x77\x0b\xdc\x2a\x5d\xc0\xef\x9f\x54\xa0\xe8"
+ "\x4b\x8d\x0d\xe0\x06\x9d\x04\x53\x1e\x4a\x63\xf3\x25\xa9\xac\xda"
+ "\x20\x3c\xa7\x43\xf1\x34\xff\x97\x84\x27\x22\x08\xa6\x43\x41\x63"
+ "\xf7\x60\x1a\xed\xa3\x05\xee\x7a\xcc\xdf\x29\x95\x6d\xb2\xa2\xfc"
+ "\x08\xc3\x71\xc7\x21\x4c\xbc\x0c\x33\x37\xb8\x2f\x45\xfd\x39\xbe"
+ "\x26\x13\x26\x2f\x25\x79\xc2\x6b\x18\xd2\xfd\x97\xa0\x3e\xdd\x70"
+ "\x29\x9d\xb2\xfc\xa3\x7a\xb1\xbf\x50\x17\xd2\x4f\x9b\xac\x28\x3f"
+ "\xf6\x0d\x63\x65\x1e\x69\x64\x18\x65\xf9\x9d\x82\xc6\x98\x98\x40"
+ "\xf9\x27\x77\x28\xf0\x8c\x25\x99\x22\x5c\x41\x79\xf9\x14\x78\x3a"
+ "\x25\x3e\x06\xf1\x7a\x8a\x41\x51\x1f\xff\x29\xd1\x13\xc4\xeb\x29"
+ "\xa9\x0a\x3c\x57\x29\x3e\xb4\x5c\x53\xcc\x0a\x3c\x57\x03\xe5\x42"
+ "\x39\x16\x30\x07\x15\xfd\x58\x35\xb3\x7d\x30\x4a\x81\xa7\x51\x86"
+ "\xe9\x1d\xf6\x42\xbd\xa8\xdb\x29\x2d\xb2\x2d\x12\xf5\x1a\x9f\x48"
+ "\xb8\x31\xfc\x42\xb0\x2d\x40\xba\xba\x07\xf3\xc9\x00\x4a\x3e\x05"
+ "\xd1\x25\xf5\xc5\x0d\x09\x8a\xf2\x5d\x92\xf8\x34\x32\x08\x4f\x9a"
+ "\xa2\x7c\xff\x25\xe1\x89\x0c\x82\x51\xd4\x7f\x73\x8f\x84\x47\x13"
+ "\x04\xa3\x94\xff\xcb\x12\x9e\xe0\xbc\x4e\xdf\x9a\x4f\x86\x10\xf9"
+ "\x27\x5e\x61\x58\xcf\x2d\xc6\xa0\xb4\xe2\xdb\xc1\x54\x6c\xff\xde"
+ "\xaa\xe1\x6b\xa6\x63\x0b\x0f\xd2\xde\x52\x68\xa3\x53\xf8\xd8\xe0"
+ "\x0d\xb2\xd3\x53\xad\x75\x68\xcf\x44\x19\x20\x51\xd8\xee\xa9\x7c"
+ "\xbf\x10\x4c\x9b\xee\x84\xd1\xc5\xc1\xdf\x01\x9c\x30\xf5\xa0\x14"
+ "\x87\xe5\x1f\xd3\x21\xc7\x51\xb8\x18\x5f\x9c\x8a\xed\xdf\x78\x8b"
+ "\x68\xc7\xa6\x16\x48\xb0\x68\xf7\xe3\xd3\xc2\xad\x63\x1e\xea\xfb"
+ "\x4b\x91\x9e\xf9\x4b\xc7\xd3\xba\xe6\x6c\x9d\xdf\xc6\xc0\x61\xf5"
+ "\x82\x61\x02\x94\x76\xc2\x34\x2d\xf5\xf1\x0f\xef\x04\x6d\xa9\x85"
+ "\x79\x69\x0f\xdc\x76\x57\x0f\x94\xba\x58\x37\xed\x33\xbb\xfb\x1a"
+ "\x68\xe9\xbc\x84\xdd\xcf\x81\xbe\xa5\xe4\xcf\x61\xd7\xe6\xfa\xe9"
+ "\xdc\xc6\x78\x4a\xdb\x05\xed\x35\x5d\x50\x5a\x13\x9a\xb6\x74\x12"
+ "\xe8\xdb\x68\xcf\x5a\x1b\x44\x13\x1d\xf4\x3d\xc5\x17\x9b\xad\x2b"
+ "\x39\x06\x9a\x52\xf4\x2e\xdb\x4c\x76\x99\x96\x73\x44\xcb\xbe\x4b"
+ "\xa0\x7d\x6b\xbd\x5d\xbd\xf7\x12\xd1\x6b\xd6\xbd\xbb\xd3\xab\x6e"
+ "\xd6\x2f\x85\x66\xfd\x05\x68\xd1\xcf\x87\x16\x6b\x2a\x1c\xbe\x04"
+ "\x51\xcd\xde\x64\x68\xd1\x2c\x86\x96\x84\x54\x70\xf4\xe0\xb3\xa1"
+ "\x1f\x61\xdc\x7c\x1f\xa4\x8b\x30\xcd\x5e\xf5\x2c\x68\x9d\x02\x27"
+ "\xf2\x6c\xda\x59\x79\x4f\x1f\x7a\x0f\x57\x8e\xa2\xf1\xa0\x47\xfa"
+ "\xba\x91\x96\x07\x3a\x61\x7a\x64\x82\x1e\x12\xa9\xfd\x75\x54\xfb"
+ "\x40\x53\x02\x23\x86\x90\x8b\x38\xbe\x1f\x28\xfa\x51\xb5\x47\xb1"
+ "\xad\xc7\x7b\x2f\xca\x84\xc7\x36\x3d\x19\xf3\xbe\x20\x8d\x7b\xf5"
+ "\x94\x9e\x40\x39\xdb\x9e\x49\xfb\x83\x60\x3b\x3d\x3d\x53\x8e\xa3"
+ "\x7d\x4e\x69\xff\xd2\x39\x71\xa0\x73\xf8\x52\xe0\xfd\x1b\xdd\xb4"
+ "\x06\xbf\x87\xf6\x45\x20\x7c\xd8\xe6\x47\xd0\xf8\x13\xd2\x73\x17"
+ "\xb6\xf1\x3d\xd3\x11\x0e\xd3\x63\xfd\x9f\xe3\xfb\x1a\xb3\x71\x6b"
+ "\xdc\xfe\x71\x6b\xae\xf9\x5f\x5b\xd3\xcb\x5e\x5b\xf3\x65\xff\x6b"
+ "\x6b\xfe\x5a\xba\x03\xb4\xfd\xe3\xd6\xb8\xda\x2d\xbc\x0e\x74\xed"
+ "\x96\xcb\xb4\x9e\x5e\xbb\xeb\x32\xe8\x9e\x79\x0e\xeb\xde\xf7\x47"
+ "\xd8\x95\x0f\x7a\x7f\xcc\xfa\x56\x87\xef\x53\x78\xa6\x04\x18\x3e"
+ "\x77\x84\x2b\x5f\x6f\xac\x39\x5d\x1e\x4f\xf3\xd8\x12\x74\x4e\xcd"
+ "\x5a\xbe\xf6\xdf\x15\x63\x49\xc7\x2b\x03\xaf\x4c\xbc\xb2\x58\xac"
+ "\x39\x0b\x79\x55\x3a\x7a\x8f\x0a\x68\x1f\x9f\x39\x7e\x50\x5d\x82"
+ "\x84\x99\x48\xbf\x6e\x08\xbe\xc5\xfb\x2b\xdf\xa5\xfd\x7f\x77\xd3"
+ "\xfe\xbf\xe4\x03\x90\x7e\x91\x3f\x8a\xf9\x58\x31\x1f\x2e\xdf\xa8"
+ "\x23\x6e\x16\xfb\x6e\x19\xf9\x74\xee\xe7\xcd\x2a\xd7\xf3\x66\x75"
+ "\x6f\xec\xbb\x7b\x11\xa6\x06\x61\xca\x24\x1e\x76\x13\x2e\xd4\x1b"
+ "\xd7\x28\x1f\x44\x20\x4e\xcb\xcf\xaf\x77\x68\x8e\x1f\x65\x17\x10"
+ "\xae\x65\x00\x17\xe2\xae\xe2\x7e\x52\x42\x87\x1c\x46\x7e\xd2\x21"
+ "\x84\xa3\xf4\x0e\x6f\x0a\x7d\x33\x74\x3a\x0a\xba\x69\x1f\x8b\x91"
+ "\xac\x4f\xe4\x47\x3e\x1c\xe9\xea\x28\x2f\x0c\xf3\xd8\x20\x9d\x70"
+ "\x53\x3a\x47\x4f\x37\x60\xba\xbd\xac\xd4\x8c\xfe\x22\x2c\xf7\x30"
+ "\xb3\x8a\xf6\xb4\x6d\xc6\xf4\x22\xef\x19\x29\x32\x8d\x94\x07\xdf"
+ "\xd3\x96\xe8\x44\x79\x68\x2e\xf0\xc2\xa8\x6a\x1a\x27\x87\x55\x84"
+ "\x8f\x70\xa1\x1c\x38\xb1\xac\x7b\x9b\x0b\x5c\xe0\x67\x21\x38\x9d"
+ "\x12\xbe\xf2\x10\x7c\x18\xce\x10\x1f\xc9\x5f\x0b\xa6\x19\x55\xcf"
+ "\xf1\xad\xfc\xb9\x9f\xf0\x79\x41\x63\xe0\xf4\x3e\x4e\x38\xf8\x9e"
+ "\xd4\x88\xd3\xbe\xed\x61\xf4\x1d\x67\x78\x5d\xa5\xe6\x08\xbe\x7e"
+ "\x1e\xd3\xbf\xbb\xbb\x3b\x92\xf5\x66\x46\x8c\xe6\x6b\xe7\x1f\x06"
+ "\xfa\xd6\x8a\x30\xbf\x63\xbd\xe6\x88\x51\x3d\xe8\xeb\x21\x0c\xed"
+ "\xa7\x45\x74\x06\xd7\xe5\xca\x45\x8f\xcf\x87\xc7\x53\x97\xa4\xce"
+ "\x87\x65\x0f\x2d\x9c\x0f\x89\x0f\xcc\x4a\x9c\xfb\xbd\x1f\x7c\x8f"
+ "\x3f\x7c\xef\x07\x49\xdf\x83\xf4\x27\x56\xce\x87\xf4\xe5\xf3\x61"
+ "\x15\x5e\xe9\xab\x16\xad\x4c\x5d\xb4\x6a\x3e\x64\x2e\x5e\x82\x6f"
+ "\x0b\xe7\xdf\x9b\xf8\xc8\xac\xf4\x85\x4b\x16\xc1\x63\x19\xf7\x25"
+ "\xde\x77\x1f\x3c\xb4\x68\xe9\xbd\x89\x89\xd2\xfd\xde\x44\x02\x79"
+ "\x2a\x69\xd1\xaa\x59\xe9\x85\x5b\x8a\xb7\xcc\x5a\xbe\x64\x21\x85"
+ "\xc0\xa2\x45\xf3\xd3\x43\xfc\x48\x63\xff\xf5\x7e\xe2\xb7\x9b\x5d"
+ "\x4d\xa3\x7d\x8c\xa1\x16\xe5\x00\xaf\x1e\xbe\x3f\x12\xdc\xf9\x6f"
+ "\xb5\x54\x7f\xbc\x2d\xb8\x23\x8e\xda\x53\x8f\xed\x0e\xaa\x7f\x3b"
+ "\xf1\x91\xf6\x12\xbe\x08\xb3\xe7\x63\xdc\x78\xc9\x1f\x89\xc4\x78"
+ "\x6f\x68\xfc\x5d\x59\x18\x3f\x85\xf6\xdb\x71\xe0\x85\xbc\x77\xa3"
+ "\x3d\x44\x1e\xbb\xa0\xb7\x34\x33\x92\xef\x77\x88\xf5\x4e\xfb\x50"
+ "\x78\x6c\x77\xce\x0d\xd2\xfb\x2e\xda\xaf\x82\xc6\x93\xaf\xc0\x9d"
+ "\xa3\xda\x8b\x53\x68\x4f\x2a\x70\x14\x4b\x38\xae\x0d\xe0\x18\x29"
+ "\xed\x99\xe8\xac\xa5\xbd\x40\x04\x9e\x92\x20\x1b\xe1\x24\x3c\x87"
+ "\x31\x4e\xc2\xf5\x58\x3b\xda\x0a\xb4\xe5\x13\xfc\xa5\x46\x60\xb1"
+ "\xd9\x7a\x7f\x9f\x11\xc4\xf8\xeb\x9d\xa7\x83\x64\xdb\xdd\x62\x45"
+ "\xb8\xb7\xd2\x54\xb4\x2f\x03\xdf\xa3\x01\xee\xb0\xa3\x8c\xbb\xfb"
+ "\x2b\x2d\x39\xec\x2a\xdf\x17\x71\x18\x96\x6f\x16\x96\x2f\xc1\x5f"
+ "\x69\xc9\xe6\x7b\x8c\x72\x38\x63\x1c\xa3\xf7\x58\x84\xeb\x1b\x08"
+ "\x1b\x43\x61\x1e\xfa\xbe\x43\x7b\x76\x33\x1e\x1e\x81\xe1\x9f\xa2"
+ "\x5d\xeb\x40\xd8\x6c\x82\x9d\xe3\x83\xe1\x7c\x3f\x94\x52\x15\x74"
+ "\x82\x31\xcb\x1f\x6b\x59\x17\x94\x1f\xe1\xc9\x12\xed\x18\xd6\xc5"
+ "\x55\xc4\xd3\xcb\xc3\xd5\x18\xfe\x0b\xc4\x9f\x4b\xf6\x52\xd8\xf0"
+ "\xd9\x7c\x7f\x22\x69\x4c\x3e\xf0\x4e\xfb\x3d\xef\x16\xef\xcd\xc8"
+ "\x4b\xfa\x4e\x40\xdf\xf8\x3d\x36\x23\xfa\x3f\x09\x69\xa2\xad\x9c"
+ "\xcd\xf3\xa0\xfd\x65\x99\xee\xcb\x46\xc4\x6b\xb2\xef\xec\xe1\x67"
+ "\x04\x39\xc1\x58\xe0\x2f\x35\x83\x82\x26\x23\xd1\x4f\x36\x04\x79"
+ "\x31\x0b\xe5\x60\x84\xc7\x76\x17\x28\xe4\x20\x1e\xf1\xe4\x20\x7d"
+ "\x1d\x58\xa6\x1c\xc4\x93\xe0\xef\x35\x63\xbe\xd8\x5f\x64\x66\xf4"
+ "\x95\x02\x38\xa4\xf4\x29\xa1\xe9\xef\xec\xa2\x74\x08\x1f\xe9\xe9"
+ "\x25\xf8\x3b\xbb\x89\xe7\x92\xdc\xa1\x5c\xde\x65\x51\xc8\xe5\x54"
+ "\xa4\xe5\xfb\x41\xf1\xe5\x8a\xf8\x48\x8c\xff\xa1\x14\x8f\xba\x7f"
+ "\x57\xa3\x82\xde\xb3\x18\xbf\x00\xe9\x75\xa3\x6e\x47\x60\x7e\x0d"
+ "\xb5\x92\x6f\x22\xc1\x3b\x15\xf0\x3e\x84\x5f\x48\x72\x43\xed\x0e"
+ "\xc1\xd7\x49\xba\x83\xf0\x5a\x8f\xed\x6e\x5d\x28\xfc\xac\x3f\x23"
+ "\xfc\xd2\x00\x7d\x77\x27\x86\xc6\xdf\xed\xc5\xf8\xc7\x48\xd6\xf1"
+ "\xfe\x34\xf9\xfa\x64\x4f\xc8\x96\x35\x17\x50\x7d\xdd\x9d\xad\x80"
+ "\x2f\x43\x38\x93\xc4\x23\xb5\xc4\xa3\x06\xa9\xef\x7e\x41\xa2\xa1"
+ "\x4a\x91\xe6\x34\xa6\x29\x40\x3e\xe6\xc8\x72\x19\x26\x4d\xab\x22"
+ "\x4d\x37\xd5\x23\x13\xf9\x68\x3c\x7d\x81\x34\x92\x9d\x0c\xc6\x41"
+ "\x65\xbb\xcd\x63\xbb\x27\x4a\x51\xf6\x54\xcc\xb7\xf8\x90\xb0\x3b"
+ "\xb7\xa1\x0c\xdd\x87\x61\xf7\x23\xce\x3c\xd2\x81\xc3\xe4\x0f\xba"
+ "\xbc\xc0\x4a\xd3\xa2\x84\xec\xde\xb3\x69\xb4\x0f\xe8\x79\x16\x3d"
+ "\x13\x6e\xe6\x59\x2a\xe9\xe4\x3d\x9b\xf0\x4e\xe1\xfc\x7c\x1b\xb2"
+ "\xc3\xcc\xf3\x23\xbf\xc0\x79\x4f\x05\x9d\x7f\x86\xef\xfd\x52\x1e"
+ "\xb3\x68\x0f\x51\xa4\x7f\x1d\xb6\x3b\xc0\xb6\x23\xdc\x4e\x58\x88"
+ "\xe1\x93\xb8\xae\x0a\x38\xfe\x2e\xf2\x48\x23\xf9\x9e\x8b\xef\x63"
+ "\xa4\xf4\xa3\x08\x1f\x3e\xdf\x2b\x3d\xab\xfa\x09\xd7\x55\x59\x07"
+ "\x67\xf1\xfd\xe4\x48\x0f\x39\x7e\x4c\x4f\xfb\xb5\x0a\x9c\x33\xff"
+ "\x8a\xf7\x25\x78\xff\x23\xde\x1f\xc3\xfb\x2f\x68\xff\xd4\xd2\x7e"
+ "\xae\x8f\xf4\xfe\x36\xde\x57\xe2\xbd\x02\xef\xab\xf0\xbe\x0b\xef"
+ "\x0f\xe3\xfd\x49\xd2\x0b\xda\x0b\x9e\xf6\xb4\xc1\xb6\x55\xc8\x16"
+ "\x7d\xfb\xf3\xa4\x11\x0f\x16\x21\x4c\x2a\xd7\x57\x61\x5f\xb4\xa2"
+ "\x1e\x67\xf2\xf3\x87\x50\x1e\x28\x6c\xb8\x90\x07\x11\xd6\x2f\xdb"
+ "\xa1\xab\x81\x30\xc9\x36\x49\xba\x28\x85\x09\xfc\xe9\x88\x3f\x9e"
+ "\x68\x65\x02\x57\xa4\xa8\x73\x09\xbf\x48\xa7\x09\x93\xa7\x2a\x38"
+ "\x4f\x27\xdc\xe3\xa2\xfd\x90\xf0\x7e\x81\xef\x37\x09\xb3\xa2\x18"
+ "\x97\x7b\x6c\x67\x39\xbe\x7b\x9a\x24\xb8\x72\xe2\x31\x4f\x2f\xc2"
+ "\x67\x06\xc9\x52\xac\xc7\x36\x2b\x53\x21\x4b\xe8\xeb\xdf\xf1\x02"
+ "\xc9\x0c\xf1\x9d\xca\x36\xda\xc2\xdb\x72\x5e\x16\x8e\xff\xaa\x90"
+ "\xc9\x5a\x69\x6e\x92\xd0\xdf\x59\xf5\x0a\x3c\x67\x10\xcf\x8f\x15"
+ "\xfa\xde\x13\x68\xd7\x66\x9d\x53\xd8\xa3\x06\xcc\xef\xbc\x13\xf5"
+ "\x41\xb2\xab\xee\x88\x12\xd2\x97\x59\x5e\x27\x5c\xe2\x7e\x1e\xc6"
+ "\xaf\x27\x3c\xee\x52\xbe\x8f\xbf\x3b\xc2\x42\xe5\x9d\xad\x97\xe3"
+ "\x79\x5c\x4c\x23\x6f\xcf\x22\x0a\x78\x1c\xb6\x7f\xd3\x75\x72\x1c"
+ "\x88\xfd\xe1\xdc\x11\xc5\x3c\x2e\x3d\x80\x37\x3b\x49\xc2\x1b\x11"
+ "\xf6\x0c\x86\xf2\x6c\xe3\x2c\x00\xf5\xdd\x65\x10\xe9\xf0\x9d\x87"
+ "\x15\x3e\xd6\x3f\xab\x0c\x46\x38\x7c\xa7\xe0\x2e\x80\x18\x87\xef"
+ "\x02\xdc\x0d\x30\xd5\xe1\xab\x42\x7f\xa5\x81\xe2\xdf\xbf\x13\x54"
+ "\x2a\xbc\x97\xde\x51\xa6\x56\x39\x7c\xc5\x90\x50\xa6\xc1\x7b\x01"
+ "\x2c\x8e\x64\x1e\x87\x6f\x29\xc2\x99\x60\x45\x3f\xbb\x9a\x1a\xc9"
+ "\x3e\x5b\xdb\x0f\xba\xa5\xfb\x59\xa9\xc3\x87\x7d\x07\xdf\x59\x0c"
+ "\xf7\xb3\x15\xfd\x5f\xe1\xe5\x61\xfe\xf2\xec\xa4\x15\xfd\x57\xd9"
+ "\xc2\xfd\xef\xe3\xfb\x67\x0c\xeb\x92\x39\x7c\xc9\xd0\xee\x76\x23"
+ "\x5c\x29\x63\x15\xd9\xc6\x67\xae\xa9\xa1\x8f\xce\x4d\xa8\xc8\x4e"
+ "\xc2\xb2\xa4\xf5\x61\x39\xb0\x1d\x7e\xa4\xef\x79\xbc\x57\x66\x2f"
+ "\xe6\xef\xe5\xd9\x99\x4c\x97\x9d\x36\x1b\x3b\x62\x54\x06\x87\xaf"
+ "\x0b\xd6\x62\x57\x62\xc5\x0e\x17\x23\xfa\x47\xef\xa1\x7e\x58\x32"
+ "\xed\xb9\x1c\xbd\x62\x47\x29\xc3\x38\x2d\x8b\xc9\x4e\x73\xf8\x7a"
+ "\x00\xf3\xc8\x44\x7c\xab\x39\xbe\xf2\x6c\x2b\xc2\xba\x08\x2e\x18"
+ "\x0f\xe1\x20\xd8\x15\xfd\x10\x8d\xf0\xd6\xbe\x98\x6c\x33\x5e\x07"
+ "\xf0\x6a\xc2\xb4\x9f\x30\x5b\xdc\xaf\x68\xdf\x4c\x4c\x8f\x6d\x73"
+ "\x76\xb7\x97\xce\x78\x20\x5e\xf6\xc3\x70\x84\xef\x40\xb9\x4a\x45"
+ "\xf9\x44\x7a\x73\xb4\x9c\xde\xca\x9c\xe1\x5e\x5e\x8e\x9c\x61\xa2"
+ "\x1c\x39\x91\x14\xde\x8b\xb2\x83\xcf\xc6\x5e\x11\x77\x27\xa6\xcb"
+ "\xe0\xe9\xca\x73\x8c\x4c\x97\x93\xe4\x45\x3d\x44\xbe\x96\x11\x1f"
+ "\x91\xaf\x65\xc4\x4b\x56\x91\x63\x74\x58\x0f\x02\x8b\xc9\x49\xea"
+ "\x8b\xc9\x49\xc3\xf4\x4f\xf5\x71\x5f\x25\xc7\xec\x15\xb8\x37\x20"
+ "\x9e\x2c\x94\xef\x08\xc4\x61\x46\x5c\xd6\x3e\x9b\x01\x56\xec\x60"
+ "\xde\x15\xbe\x3d\xbe\xb5\x3b\x20\x62\x26\x94\x21\xbd\xef\x21\x8f"
+ "\x4c\x58\xce\x16\xbc\xa7\x62\x3c\xdc\x8e\x79\xbd\x8f\x78\xcd\x94"
+ "\x1f\xe6\x63\x45\x9c\x5b\x11\x97\x89\x68\xfa\x8a\xce\x52\x8b\xcd"
+ "\x39\xf0\x95\xa0\xef\xa4\xbf\x3c\xa7\xd5\xaf\xcb\x69\x92\x65\x88"
+ "\xe4\x47\xf0\xad\x0a\x96\xbb\x99\xcf\xe1\x3b\x8e\xad\x0e\xf6\x91"
+ "\xdc\x17\x28\x1e\xfb\x4a\xa7\xb0\x9e\x49\xa6\x8a\xf1\xde\x00\x24"
+ "\x3f\xed\x96\xfd\x04\xfb\x3e\xc9\xd0\x72\x8b\x7b\xcf\x2c\xb0\xa8"
+ "\xf0\xbd\x74\xad\x4f\x0b\xcf\x58\x34\x65\xfd\xe5\x39\xd5\xed\x16"
+ "\xaa\x97\xf3\x98\x86\xd2\x15\x40\xb4\x0a\xfb\x0b\x2a\xe6\x8b\xb6"
+ "\xba\x34\xa3\xcc\xa5\xac\xdd\xbd\x14\x61\x2d\x40\xe5\x21\x39\x22"
+ "\xf8\x65\x3d\xcc\xd9\xaf\x5b\x97\x46\x65\x63\xa3\xcb\xa0\xad\xe7"
+ "\x7e\xa0\x3e\x5b\x5b\x4f\x03\xc9\xa9\x9f\xe9\xd6\xe9\x51\x46\xfb"
+ "\x96\xf5\x94\x45\x3e\x73\x0d\x54\x18\xd6\xdf\x66\x3e\x85\xf1\x2d"
+ "\x08\x77\x96\xcb\xed\xf2\x6b\xbe\x68\x9f\x2e\xe7\x80\xaf\x7c\x9d"
+ "\x71\xf9\xb5\x3e\xd6\x66\xae\x82\xa7\x7b\xca\x90\x57\xa7\x60\xd9"
+ "\x65\x5f\x44\xbb\xc5\x84\x30\x1e\x0c\x6f\xe0\xf2\xbf\xec\x72\x2f"
+ "\x5b\xfe\x1c\xbb\xba\xfc\xda\x67\x6c\x99\x99\xbd\xbf\xd6\x0a\xa3"
+ "\x6f\xdb\xc3\xfc\xa4\x17\x67\xbb\x4e\xc1\x6d\x17\x68\x4f\xfd\x54"
+ "\x58\x9a\xe3\x67\xcb\x2e\x5f\x65\xcf\x3c\x47\xbc\x49\x86\x36\x33"
+ "\xea\x8f\xb5\x8a\xf8\x7d\xb2\xcd\x7c\x06\xf3\x4f\x45\xbc\xa5\xcc"
+ "\x61\x3d\x8e\xb0\xf6\xe8\xa7\x2f\xeb\xe0\x6c\x57\x15\xf8\x62\x72"
+ "\x0e\xf4\x57\xe4\x54\xfb\x63\x72\x9a\xfc\x15\x39\xad\x2c\x66\x9d"
+ "\xde\x57\xb1\xce\xd8\x1f\xb3\x0e\x65\x60\x5d\x35\xd6\xd3\x08\xaa"
+ "\xf3\x1b\x36\x30\xe0\xfb\xd1\x1b\x54\xff\xe5\xeb\x4e\x62\x59\x5b"
+ "\xd1\x37\x66\x42\xf6\xd7\x9d\xa4\x71\x08\x4c\xdb\xda\x17\xb3\xae"
+ "\x09\xe1\x5a\x85\x7e\xad\xeb\x20\xb9\xa4\xf1\x7e\x0c\xfb\x0f\xec"
+ "\x23\x45\x60\x7c\x37\x5e\xde\xbe\x98\x5c\x2d\xab\xcc\xcd\x44\xfc"
+ "\x31\x5c\xa6\xca\x73\x33\xd9\x83\xe5\xe8\x6b\x5f\x43\x3c\xb9\xd6"
+ "\x15\xfd\x0b\x18\xf2\x10\xf5\x24\x37\xd3\x5f\x91\x6b\x66\xb1\xb9"
+ "\xd5\x5e\x2e\xfb\xb9\xaf\x11\xee\xbe\xe7\x8d\x34\x3e\xa1\xc1\xf8"
+ "\x93\xac\xd2\x34\xc1\x4b\xb2\xaa\x33\xe9\xfd\x3a\x93\x95\x95\x9b"
+ "\x8c\x3f\xda\xcf\x5c\xfd\xe5\xa6\x34\x7f\xb9\x29\xc9\x37\x0c\x7d"
+ "\x78\xeb\x19\x20\xfb\xe4\xfb\x25\x43\x1e\x7c\x88\xfc\x68\xe0\xf5"
+ "\xef\xb0\xa2\x0e\xec\x98\x50\xd6\xd6\x83\xb2\x60\xf9\x47\x6e\x9b"
+ "\xda\xdd\xe7\x39\x4f\x59\x8c\x49\x4f\x32\x45\xf5\xfb\x8c\x05\xca"
+ "\x58\x85\xc9\xe8\xaf\x30\x25\xf5\x57\x20\xde\x18\xcc\x27\x76\xfd"
+ "\xbf\x7a\xb9\xbe\xae\x47\x79\x3d\x03\x74\xee\xa5\x90\xf1\xf5\x4d"
+ "\x43\xd9\x48\xb2\x55\x64\x9f\x56\xf8\xbc\x24\x33\x7f\x21\xbb\x26"
+ "\xec\x14\xac\x95\xed\x14\xd9\x28\xea\x17\x91\x9d\xf2\x4b\x76\xca"
+ "\x2f\xd9\x29\xfe\xae\x43\x5b\x53\x9e\x9d\x46\xf6\x68\x85\x55\xd8"
+ "\x99\x15\xfd\x89\x0c\x65\x23\x0a\x71\xa4\x89\xba\x40\x98\xca\xec"
+ "\xd5\x1c\x9e\xf3\x29\xdb\xea\x47\x7b\x83\xd7\x01\xbf\xb0\x37\xad"
+ "\x92\xbd\x51\xcb\xf6\x86\xce\x64\x43\x9d\xf2\x87\xb3\x37\x7e\xc9"
+ "\xde\xf4\x33\x61\x6f\xfc\x92\xbd\xa1\xf0\x7e\xc9\xde\xf4\x87\xb1"
+ "\x37\xa8\xcf\x54\xde\x08\xc9\xce\x94\x91\x9d\xa1\xf2\xa2\xac\x25"
+ "\xf9\x85\x9d\xc9\xc4\x3e\x91\x9a\xec\x4c\x3f\xa6\xf1\xcb\x76\xc6"
+ "\xc3\xd3\x5b\xc9\xd6\xf4\xbd\x00\x68\x3f\x0d\x40\x36\x86\xdb\x13"
+ "\xdf\x54\x1f\xd9\x13\xe4\xdf\x02\xa5\x3d\x41\x7c\x07\xf0\x59\x27"
+ "\xd9\xa9\xa6\xe8\x3d\xcc\x87\xf6\xa4\x7a\x85\xd5\x8d\x75\xfd\x47"
+ "\x88\xf6\xa1\xdd\xb6\x16\x97\x39\xac\x3e\x40\x3b\xd0\xca\xda\xcb"
+ "\x00\x69\x44\xf9\xed\x47\x5b\x01\x80\x7a\xa9\xf7\xa1\x8e\xa3\x8c"
+ "\x1b\xdb\x2d\x9f\x42\x3f\xea\xea\xb2\x9e\x5e\xc7\x33\x6e\xa3\x6e"
+ "\xd9\x65\xe6\x42\xfe\x38\x9f\xb1\x94\xa1\x7d\x31\xba\xda\x7a\xde"
+ "\x83\xa5\x5d\xcc\xbf\x34\xdb\x69\x40\x1d\x30\x2e\xcb\xb7\x47\xd3"
+ "\x99\xa3\xcb\xaf\x31\x3b\xda\xc5\x7f\x5f\x76\x59\x17\x9d\xd5\x05"
+ "\x93\x97\xe6\x30\x7f\x3f\xea\x19\x96\xb7\x1a\xcb\x7d\x12\x69\x6f"
+ "\x42\x9d\x6b\x45\x3d\xd3\xfb\x14\x7a\x86\x3a\x73\x14\x9f\x0d\x82"
+ "\x7f\xeb\x5a\x51\xcf\x4e\xfa\x79\x7b\xd6\xc5\xfb\xa2\x98\x4f\x2b"
+ "\x8d\xdb\xa1\xae\x9d\xf4\x57\x08\x5d\xf3\x8b\x74\x1d\x7e\xe2\x9f"
+ "\x5a\xd2\x35\xac\x0b\x8c\xef\xc6\xcb\x8b\xfa\x13\x5e\xd7\x2c\x41"
+ "\xba\xf6\x9c\xa4\x6b\x31\x42\xd7\xb0\x4e\x23\xfa\x9f\x17\xfa\x46"
+ "\xf8\xa9\xbf\x3a\xa0\x6f\xb1\x26\x3d\x9d\x0d\x20\x64\x87\xeb\x1c"
+ "\xb6\x2b\xa6\x34\xd4\xb7\x24\xd4\x37\xc4\xc7\x5c\x64\x37\x51\x36"
+ "\xff\x44\x6d\xdd\x72\x0b\xfb\xd3\xda\xfe\x09\x65\xa8\x4f\x69\x68"
+ "\xcb\x3e\x43\x3b\xfa\xa7\x67\xdc\x50\x8f\xfa\xa4\x47\x3d\x32\xa2"
+ "\x3e\x25\xa1\x5e\x91\x3e\x35\xf5\x3f\x4f\x38\xd7\x37\x0d\xe0\xe0"
+ "\x6d\x65\xa8\x3e\xdd\x6c\xdc\xd4\x63\xfb\x81\xc6\x09\x5f\xf1\xf1"
+ "\x57\x7c\xd6\x39\xe1\x46\xaa\xf4\x1c\xef\x84\x3f\x68\xb8\x2f\x83"
+ "\x7a\x68\xd9\x0d\x63\x2e\xc1\x0f\xce\xa1\xcc\x03\x3e\x47\xe1\xf3"
+ "\xf9\x15\x77\xbd\x8f\xbe\xc4\x1f\xba\x31\x6f\x0f\xe9\x22\xb3\xcd"
+ "\x25\x5f\x2e\x05\x65\x51\xcb\x3c\x74\x46\x6d\x51\x21\x9d\x51\x4b"
+ "\x67\xd2\xe2\xfb\x68\xe4\x41\x02\xde\x63\x8f\x5f\x87\x38\xbc\xe8"
+ "\x5c\xca\x32\xf2\x9f\xf0\x39\x91\x6d\xd7\x8f\x3c\xbc\x0d\x66\x46"
+ "\xbb\xc5\x59\xb4\x74\x76\x2e\xfa\xd1\x71\xf4\xcc\x6c\x9f\x19\xeb"
+ "\xae\x4b\xe7\xd1\xc6\x60\x7e\x74\x1e\x6d\x91\x11\xea\x0a\xf9\x19"
+ "\x59\xfa\x3a\x1b\x6b\xec\xf7\x70\xbd\x34\xca\xb4\x10\x6d\x48\xe7"
+ "\x24\xa4\xb3\x6b\xf5\x8e\x14\xf8\xd0\x1a\x7e\xdf\x45\x8f\x2d\x69"
+ "\xa0\xfc\x43\xc4\x27\xc8\x3c\x19\x22\x3e\x55\xe6\xd3\x50\x73\x3b"
+ "\xa9\x9d\xee\xdf\xc6\x7a\x68\x0f\x6f\x1a\x37\x28\xf5\xb1\xff\xa4"
+ "\xb3\x68\x77\xf7\x83\x76\x85\xd5\xcb\x1c\x3d\xcc\xee\xb0\x5e\x86"
+ "\x3a\xda\x57\xbc\x84\xf9\xfd\x31\x45\x19\xac\xa2\x28\xbd\x77\x1b"
+ "\xf3\xd1\xb8\x0f\xe6\x71\xd2\x09\x6b\xea\x45\x5d\xe4\x9c\xe4\xfd"
+ "\x4d\x5d\x51\x3a\xe2\x8a\x21\x5c\x6d\x98\xbe\xbf\xa2\x08\xe5\x35"
+ "\xe9\x9c\x53\xa5\xe5\x7b\xee\xa2\x2e\x9f\xb4\xec\x84\x89\x97\xe0"
+ "\x01\x2d\xef\x27\x94\x17\x99\xc9\x26\x60\x98\x0e\xc3\xe2\x10\x7f"
+ "\x81\xc7\xf6\x00\xfa\xdc\xbd\x55\xc2\x97\x7d\x20\x4e\x86\x73\x42"
+ "\x52\xb7\x72\xde\x9a\xb4\x4a\xb2\x2c\x64\x1f\x38\x15\x84\xee\x6a"
+ "\x47\x3b\xc8\xa5\x84\x8f\x0e\xd8\xf4\x75\x46\x3a\x8f\xab\x74\x17"
+ "\xc4\x63\xfd\x10\x7d\x2f\x61\x9f\xe3\x22\xb3\x3d\x60\x78\x6b\xa7"
+ "\x17\xfb\x14\x0f\x54\x39\xe1\x93\x21\xf9\xe9\xbf\xce\xba\x90\x07"
+ "\xad\x47\xb6\x01\x10\x7f\x88\x9f\xa8\x37\x7e\xe4\xc3\xe7\x64\x93"
+ "\xea\xb6\x51\xbf\xfb\x81\x0e\x99\x5f\x43\xd7\x49\x91\x49\xf4\x4d"
+ "\xe7\x25\x31\x1b\x03\xfb\x64\xfa\x8e\x31\xef\x01\xc1\x83\x75\x4d"
+ "\xbd\x68\x47\x68\x4c\x99\xce\xce\x2a\xd2\x33\xaf\xc7\x36\x6f\xa6"
+ "\x13\x1e\x6e\x95\xc6\xab\xdc\x0e\xdf\x22\xb2\x2d\x61\xdb\x2d\xbe"
+ "\x67\xe9\x00\xfe\x1f\x66\xb6\xc7\xa3\x1d\xe2\xb6\xa9\x31\x75\xb7"
+ "\xa8\x7f\x2f\xe1\xa5\xb5\x1e\x5d\x18\x5f\xe4\x66\xdd\xac\xbc\x31"
+ "\x89\xfa\x11\xb4\xff\x27\x86\x3d\x89\x72\xcd\xec\x85\x44\xd3\x0f"
+ "\x9f\xb4\x4f\xbe\x01\x17\xad\x10\x51\x37\x30\x4e\xf4\xc3\x54\x1a"
+ "\x17\x12\xe3\x61\xf3\x5a\x9c\xb0\xc8\x24\xd3\x45\x3e\x06\xf2\x96"
+ "\xf8\x7c\x92\x7c\x0d\xfa\x4e\x51\x54\xc2\xbc\xe4\x73\x20\xac\x4b"
+ "\x2e\x03\x95\x4f\x94\xeb\x87\x9a\xe0\x72\xd1\xb7\xfb\xe8\x12\xc1"
+ "\x83\xa2\x1d\xa0\xe5\x67\xf9\xf4\xd3\x77\x8e\x45\xbc\x2c\x54\x66"
+ "\x5e\x16\x6e\x63\xb1\x8d\xf0\xdd\x8f\x32\xc4\xc3\x5b\x11\x17\xf6"
+ "\x7f\x16\x9e\x13\xf2\x34\xaf\x65\xa8\x35\x2c\x28\x9b\x56\xec\xab"
+ "\x4e\x2e\xf5\xb3\x4e\xc4\xf9\x47\x31\xc6\xf6\xc3\x3f\xfa\xc9\xcf"
+ "\xf6\x92\xec\xee\x30\x51\x9b\xec\x28\x21\x7b\xcb\x61\x6f\x47\xd8"
+ "\x2e\x84\x69\x93\x60\xdb\xf8\x59\x89\xe2\x3e\x9c\xee\xd8\x8e\x6d"
+ "\x45\x3a\xba\x5c\xbc\xbd\x6f\x04\xf9\x1d\xfb\xf8\xd8\x4f\xfc\x61"
+ "\x0d\xab\xd8\x61\x0a\x4f\x8b\xc9\x4a\xed\x59\xff\x75\xd6\x83\xf9"
+ "\x8c\x23\x39\x2a\xdd\x01\xe3\x51\x26\x3f\xdf\xbd\x0b\xc6\x90\x8c"
+ "\xb1\x98\x22\x8b\xe0\x7b\x72\x22\xb3\xa1\xef\x89\x16\xd5\xb2\x0d"
+ "\x26\xa2\x0e\x99\x2f\x41\xf2\xa2\xb5\x25\x06\xa4\x15\xe0\xc8\x15"
+ "\x20\x1f\xe5\x33\x84\x2f\x70\xf8\xfe\x4c\xe7\x8e\xa3\x2c\x26\x9b"
+ "\x64\x59\xc4\x67\xcb\xcd\x6c\x05\xf2\xd5\x2b\xc6\x28\x92\xff\x48"
+ "\xdf\x24\x3a\x21\xb9\x95\xca\x2b\xe6\x40\x27\xff\x82\x5d\x67\xf1"
+ "\x4c\xb4\x69\xdd\x4e\x48\x76\xe3\xdd\xcb\x2f\xb4\x25\xd2\x7b\x37"
+ "\xc2\x9d\x64\xd7\xfb\x09\x06\xfb\xb8\xc9\x76\x66\x53\x91\x9e\xd4"
+ "\x60\xde\x3d\x4e\x78\x46\xec\xc7\x0d\xc9\x4d\x84\x6b\x08\x1a\xba"
+ "\x19\xdf\xff\xf6\x4b\x2c\xef\xfc\xd5\x86\xdd\x34\xc6\x39\xff\x2e"
+ "\xae\x17\x88\xab\x4e\x2d\x6c\xb6\x1f\x69\xad\xb5\xf9\xcd\x68\x9f"
+ "\xcd\xfe\xca\x92\x24\xfe\x2c\xc5\x31\xa9\x1d\x0d\x8f\xbf\x31\x95"
+ "\x9f\xc7\x08\xf3\x1b\x05\x9e\xc6\x24\xfb\x84\x4b\xf4\xfe\x53\x7a"
+ "\x77\xeb\x76\x25\x39\xaa\x53\xc4\x19\x91\x08\x23\xfa\xf1\xf3\x7f"
+ "\xda\x8b\x79\x78\x6c\xf3\x1b\x9d\xb0\xb8\x5e\x7c\x9f\xd9\x15\x76"
+ "\xdf\x6e\xbe\x3e\x0a\x75\x80\x74\x4e\xe8\xf4\x82\xfd\x6d\xf5\x5c"
+ "\xff\x3a\x50\xe6\xbd\x92\xfd\xa5\xf1\x9c\xa8\x4e\x58\xb0\xaf\x4d"
+ "\xcf\xe5\x5b\xcd\xd4\x0f\xea\x42\xce\x78\xc3\xb8\xc1\xd7\x83\xa9"
+ "\x78\x65\xe0\x95\x2d\xbd\x17\xe0\x85\x65\x7e\xf0\x1c\xbe\x17\x73"
+ "\xde\xbd\x61\x52\x39\x31\xae\x17\x7d\x76\x7a\x77\xc2\x83\x4b\xd9"
+ "\x1b\x09\x6a\xf9\xb9\xee\x18\x8d\x13\x3c\x68\x75\xc2\x7c\x10\x75"
+ "\xb1\x80\xcf\xdd\x41\xda\x88\xef\xac\xb4\x9a\x79\x5b\x76\xbb\x91"
+ "\xee\x07\x4f\xb6\x54\xbb\xc1\x70\x07\x95\xff\xc1\x53\x54\x26\x9a"
+ "\xc3\x42\xf7\xa2\x6a\xe6\x6a\xae\xf1\x01\x7d\xcb\x43\x5c\xa8\xff"
+ "\x75\x09\x62\xcc\xa1\xd1\x42\xf8\x24\x99\x60\x72\xf9\x05\x9f\x77"
+ "\x25\x19\xb6\xa9\xe8\x3d\xa6\xf6\x28\x1f\x87\x39\xcf\x4a\x33\xa5"
+ "\xb9\x0b\x0b\x46\xa0\x9e\x2f\xa0\xb3\x1e\xaf\xc0\x82\x65\x0c\x79"
+ "\xdd\x6c\xe6\x67\x49\xb9\xb0\xfd\xe9\xa9\xe5\xf3\x8d\x16\xa0\xfd"
+ "\x9b\x9f\xcd\xbf\xcd\x60\x38\xb7\x35\x88\xf3\x30\xc6\x61\x7b\xd4"
+ "\xd3\x66\xf6\x42\x3f\x95\x19\xd3\xbe\x77\xdd\xab\xa1\xb3\x2e\x77"
+ "\x5b\x18\xa7\x83\x61\x5d\x09\x5b\xf6\xa0\x73\xd7\x65\xe6\x95\xcb"
+ "\xdc\x5c\x4f\xfa\xb1\x60\x9f\x13\xde\x39\x3f\xa4\x4e\x0c\x94\x23"
+ "\xe5\x44\x73\x82\xa8\x47\x3f\xf2\x2a\xb4\x1e\x53\xea\x45\x1d\x2e"
+ "\x38\x1f\x5a\x87\x29\x98\x43\x0a\x4a\x42\xca\x5c\xbc\x52\xa5\xf7"
+ "\xe0\x4b\x1b\xf4\x8c\xf5\x9a\x72\xd0\x63\x4b\x89\x43\xfd\x28\x11"
+ "\x75\x43\xe1\x28\xcf\x24\x37\x7f\xc5\xb6\xa7\x8f\xce\x26\xbd\x0c"
+ "\x14\x4e\x32\x4e\xe1\x7e\xf4\x6f\xf0\xdd\x88\xf1\x3a\xd2\x5f\x3a"
+ "\x97\x2b\x38\x7e\xe0\xfc\x05\x48\xd9\x41\xb8\xa2\xf7\x1c\x38\x40"
+ "\xb2\x8b\x30\x33\xa3\x7d\x07\xd0\xf7\x4e\xd9\x27\xf3\x15\xc3\x0a"
+ "\x28\x9e\xe4\x14\xc3\x6b\x9c\xf0\xf7\x7c\xef\x72\x37\xf6\x01\xc3"
+ "\xfb\x1e\x29\xf6\x01\x1f\x4d\x97\x9b\x49\x75\xd9\x03\x0f\x9d\x45"
+ "\x3b\x86\xf6\xbb\x24\x51\xb4\x3f\x0f\xb5\xd1\x3b\xda\xcf\xcf\xf1"
+ "\xb9\xb5\x0d\xed\xd4\x8d\x4a\x4b\x7a\x9f\x1a\x86\xdf\x50\x43\x8a"
+ "\xaf\xf2\x42\x94\x2f\xd6\x9c\xe5\xe8\x3e\x0d\xed\xbe\x7f\x06\xc3"
+ "\xb3\x1c\xc7\xaf\xe8\x7c\xb8\xd2\x1d\xac\xff\xdd\x1b\x27\x35\x0e"
+ "\xdf\x55\x3b\x3f\x07\x16\x1e\xe2\xfc\x78\xb9\x13\xbd\x80\x67\x38"
+ "\x6e\x89\x3f\x7f\xe8\x3e\xbc\x9e\xf9\x0e\x5f\xa4\x3d\xe3\xf5\x23"
+ "\x0f\xdd\x80\x99\xaf\xef\x84\xc4\x9a\x1b\x90\x50\x7b\x03\x8c\xec"
+ "\x2f\x46\x75\x0d\xfa\x71\xcf\x5c\xd3\x01\xda\x89\xcc\xd1\x16\xd0"
+ "\xd6\xee\x44\x7f\xce\x07\xaa\xfe\x0a\xf4\xe7\x7c\xe8\xcf\x5d\x35"
+ "\x92\xbd\x1c\xf0\xe7\xfa\xb8\xaf\x5c\x74\x81\x9f\x21\x5a\x51\x74"
+ "\x61\x94\x19\x54\x51\xd9\xa0\x43\xfa\x4a\xaf\xc0\x43\xaa\xa8\x2e"
+ "\xf4\x25\xb1\xcc\x4e\xa9\xbc\x78\x8f\x8b\x36\xc3\x70\x5e\x56\xb4"
+ "\xe1\xac\xa2\x24\x71\xc8\xb6\x59\x4d\x32\xe5\x26\x5d\xc2\x32\x3c"
+ "\x3c\x9e\xbe\x39\x9f\x9e\xe0\xd5\x14\xd5\x30\x2f\x85\x17\x4f\x65"
+ "\x5e\x0c\xe7\x7b\xfd\x37\x62\xb8\xc7\xf6\xb0\xd1\xa9\xc9\x1a\x72"
+ "\x3d\x24\xf6\x99\x24\x5b\xf3\xf0\x3b\x4c\x5d\x86\x32\x9a\x5b\xbd"
+ "\xcb\x87\xfe\xf8\x15\xd2\xe3\x87\x4f\xae\x28\x60\x3e\xc3\x66\xfa"
+ "\xfe\xff\x70\x35\xcd\x4d\xa0\x6f\x92\xff\x84\xbe\xce\xad\xe6\x23"
+ "\x50\x1b\x42\xfd\x87\xe8\x02\xc4\x59\x99\x5b\xcd\xb0\xcf\xfe\x75"
+ "\xfd\x7a\x9a\x7f\x26\xd6\x9a\x3e\xdc\xe5\x84\xcd\x7c\xde\x07\x5f"
+ "\x9f\xc3\xed\xe9\xc2\x16\x37\xf2\x20\xd4\x06\x2c\xac\xa6\xfd\xcb"
+ "\x7b\xcb\x2d\x17\xec\x93\xc9\xf6\x2f\xac\x10\xbe\x90\xa5\x43\xb4"
+ "\x05\x0b\x9f\x13\xdf\x0f\x16\xce\x75\xc2\x4a\xde\xc6\x5b\xa6\x91"
+ "\x4c\x2c\x2c\x60\xb1\x96\x3f\x10\xdc\xec\x32\x28\xdb\xe2\x83\x6c"
+ "\x56\x61\xe9\x60\x5c\x57\xae\x00\x7b\x6d\xa3\x87\xd6\xdc\xb8\xc7"
+ "\xad\xf1\xa0\x6f\xd0\x82\x71\x17\x28\x0f\x17\xc2\x20\xdf\x47\x88"
+ "\xb9\x0b\x0b\x0f\x38\xe1\x31\xc9\x1e\x2e\xcc\x12\x63\xcc\x0b\xb3"
+ "\x7a\x31\x2d\xfa\x8a\xb7\x63\x3c\xfa\xbf\x1b\xa3\xa4\x6f\xdc\xae"
+ "\xbd\x7c\xad\xe8\xc2\x33\x4e\x28\xe0\x7b\xef\x17\x4f\x05\x7d\xb1"
+ "\x81\x85\xd5\x11\xb1\xd7\x7d\x70\x39\x17\x3d\xc4\xe7\xe1\xa9\x61"
+ "\x9c\xc7\x96\x0a\x32\x5e\x6c\x6f\xff\xbe\x57\xbd\x7a\x35\x86\xc5"
+ "\xc9\x78\x11\x66\x0c\xbe\x27\x0c\xc0\x88\x34\x73\x83\xd2\xac\xee"
+ "\x55\xdf\xfd\xf7\x18\x96\xa6\x48\x93\xa9\x48\x63\x0e\x4a\x53\x26"
+ "\xe5\x53\xa2\x48\x73\x50\x91\xa6\x26\x0c\x6d\x8d\x8a\x34\x76\x45"
+ "\x9a\x73\x61\x68\xeb\x52\xa4\x71\x87\xa6\x59\xa4\x09\xe2\x2d\xcd"
+ "\x27\x4a\xc4\x30\x7d\x68\x9a\x45\x46\x45\x9a\x24\xf9\x1d\x7d\xcf"
+ "\x4c\xe1\x1b\xa0\x3c\x61\x9d\x62\xbd\x5e\xc0\x78\x2c\xff\xea\x82"
+ "\x9b\xf8\xdf\xd8\x37\xb4\x9c\x2f\x3d\x2e\xce\xd3\x25\xbb\x4a\xf3"
+ "\x0f\xc8\x9e\xd3\x37\x13\x92\x09\xf2\x3b\x29\xaf\x8b\xb0\x78\x3f"
+ "\xc9\x10\xe2\x3c\x35\x98\x1f\x8b\xec\x0a\x3a\xcf\x29\xe8\x74\x0e"
+ "\xe6\xc7\x22\x77\x68\x9a\xc5\x9a\xd0\x34\x8b\xe3\x82\xd2\xd4\x8b"
+ "\x7c\x16\x1b\x15\x69\x92\x14\x69\xd2\x06\xcb\xe7\xe2\x2c\x45\x9a"
+ "\x02\x45\x9a\x92\x00\x0f\x17\xf3\xb5\xe1\xa4\x0f\x18\x8e\xfd\x9f"
+ "\x55\x67\x6e\xc2\x3b\x9d\x2c\xcf\xf2\xda\x69\x21\xd7\x8f\xd0\xf9"
+ "\x78\xb4\xd6\x8c\x9f\x5d\xd0\x05\x8f\xcc\x92\xbf\x2d\xbf\x75\xc3"
+ "\x1b\x49\xdf\x3c\x91\xb7\xdd\xcd\x56\x2f\xb6\xb9\x8b\xb1\x0d\x5e"
+ "\x96\x28\xcf\x2d\xa1\xf9\x38\xfc\xec\x1b\xde\x1f\x59\xdc\x21\xf4"
+ "\xef\x11\xf9\x9b\x0e\x95\x07\xfb\x19\x8f\xcc\xfc\x3f\xa4\xab\x8d"
+ "\xe8\xa2\x33\x20\x10\x87\x65\xa0\xaf\x31\x40\x2b\xe5\xf9\xc8\xef"
+ "\x64\x5a\xeb\xc4\x9c\x20\x9a\x2b\xec\xa2\x73\x39\x30\x4d\x43\x50"
+ "\xff\x84\x68\x75\x9f\xde\xe9\xd5\x84\xd2\xfc\xc8\x3e\x89\xe6\x0e"
+ "\x61\xa3\x1e\xe9\x90\xed\xc9\x90\xf2\x57\xde\x68\x6c\xaf\x01\xa0"
+ "\x39\x0f\x6d\x35\xe8\x6f\x62\x1f\x8b\xe8\xee\x84\x34\x03\xf7\x7f"
+ "\x37\xdf\x00\x7a\x76\x94\xcc\xe3\x73\x22\x44\x59\xd2\x32\xe9\xfc"
+ "\x65\xf2\x7d\x5a\x2c\x5f\xd2\xbc\x3c\xc6\xcf\x62\x82\xb4\xfd\xcd"
+ "\x25\x2e\xa4\x35\x2d\x5d\x9e\x3f\xe4\x84\x34\xe1\xd7\x95\x37\x1a"
+ "\x68\xbe\x06\xcd\x6d\x6a\x76\x27\x11\x4c\x31\xd2\x29\xcf\x9d\xee"
+ "\xa1\xb3\x9c\x11\x76\xe6\x50\x7d\xa5\x60\xbe\x0a\x1a\x1e\xfd\xab"
+ "\x90\x9f\xb4\x33\xa1\xfa\x10\x89\x72\x9a\x76\x2e\x54\xe6\xd2\x9c"
+ "\xa1\x32\x97\xe6\x0a\xd5\x07\x35\xea\xc3\x12\x4d\x68\x9a\x25\x71"
+ "\xa1\x69\x96\x24\x04\xa5\x29\x17\xf9\x2c\x49\x52\xa4\x49\x53\xa4"
+ "\x09\xb6\x7f\x58\xe6\x25\xe6\x81\x7e\x27\xb7\xf7\x4b\xac\x41\xef"
+ "\xea\x2a\xde\x4e\x2d\x39\x28\x87\x49\xeb\x92\xf9\x5c\x29\x09\xdf"
+ "\x49\x85\x8d\x22\xf8\x33\x0a\x1a\xce\x2a\x68\xb8\x20\xbf\x4b\xf3"
+ "\x2b\x3e\x40\xde\x4d\x95\xe4\xcc\x1d\xbd\x07\x1e\x8b\xf6\xad\x7c"
+ "\x92\x7c\x33\x6a\x9f\xf8\x1c\xb6\x5d\xe8\x53\x5e\x03\x1d\xcd\x1d"
+ "\xbc\x58\x0c\x11\x74\x3e\x8c\x13\x7e\x94\x81\xfd\xb9\x0e\x9a\xe3"
+ "\x8e\xfe\xd4\x8a\x8b\xb0\xa4\x07\xf3\xaf\xc6\x3c\x90\x77\x8f\xa6"
+ "\x84\xd2\xf0\x68\x7a\x28\x0d\x8f\x66\x07\xbd\xeb\xf0\xdd\x12\x54"
+ "\x6e\x1d\xed\x13\xf1\x0a\xf7\xad\x1f\x3d\x20\x87\xd3\x18\x00\x96"
+ "\xb1\xbb\x94\xfb\x01\x29\x34\x6f\x30\xb6\x13\x1e\xdd\x4a\xe3\x05"
+ "\x12\xce\xd3\xc1\xbc\x15\xbc\x78\xb4\x55\x41\x47\x87\x82\x8e\xee"
+ "\x80\xad\x59\xd2\x23\x74\xe4\x51\x7c\x7e\xdc\x48\x61\xc8\x0b\x43"
+ "\xb4\xcf\x70\xbb\x7d\x1a\xf9\xa9\x3f\x5a\xe2\xc6\xf2\xb2\x17\xd4"
+ "\xb1\xd2\xfb\x32\x36\x8d\xfc\xee\xa2\x0e\xb4\xcf\xb4\x76\x76\x0a"
+ "\x86\x65\x88\x7a\xfd\x11\x96\x7f\x55\x8a\xc0\xfb\x23\xfe\x6d\x9f"
+ "\x60\xf1\xd9\xc0\x62\x1a\x87\xec\x9f\xf5\xc6\x36\x26\xca\x73\x6c"
+ "\x11\xc7\x3e\x59\x1f\xfc\x95\x8d\x89\xfe\x8a\x9d\xe7\x30\xac\x1a"
+ "\x75\xa2\x5c\xf4\x69\x76\xc6\xa3\xec\x57\x63\xfd\x61\x1f\x78\xa9"
+ "\xd4\x97\x69\xa4\x33\xe6\x68\xce\x1a\x9d\x41\x15\x25\xe6\x66\xfc"
+ "\xe8\x6c\x90\x5e\xb9\x0d\x3b\x17\xb0\x4e\x58\x5a\x41\xbe\x1d\xd9"
+ "\x0d\x9a\x83\xd8\xec\x73\x01\x8d\xb3\x38\x7c\x97\xb8\x4f\x8e\xf1"
+ "\xe5\x22\xed\x52\x6d\x50\x5a\x97\x34\x0e\xd2\x4d\x71\x73\x7c\xa0"
+ "\x69\x76\xbb\xe8\xac\xdd\x38\xe1\xc7\x2f\xad\x68\x46\x7b\x81\x69"
+ "\x92\xe5\x34\x34\x66\xc2\xbf\xfb\x17\x03\x9d\xcb\xac\xb1\xef\xec"
+ "\xe4\xb8\xa5\x6f\xce\xbc\x7f\xe4\x28\xe9\x06\x87\xbb\x83\x7c\x4a"
+ "\x8d\x98\xb7\xb5\xb4\x3c\xc2\x0b\xda\xde\x8a\x46\x83\x13\x9f\xfb"
+ "\x2b\x1a\x8d\x48\x1b\xf2\xf3\x47\x74\x36\x62\x88\x2f\xb3\x68\x51"
+ "\xfa\xca\x15\xcb\x66\x3d\xb1\x72\x49\xc6\xa2\x79\x86\x8c\xfc\x4d"
+ "\x79\xa6\x59\x5b\xb6\x16\x1b\xb6\x17\xe6\x17\xe7\x6f\xde\xc0\x8f"
+ "\x07\x33\xe4\x14\x8b\xbb\xb1\x20\xa7\xa8\x78\x3e\x3d\xce\x34\x58"
+ "\x0a\xf3\xb6\xf1\xc7\xbb\x46\x42\x28\x92\xfc\xe2\xbc\x42\xc3\x0c"
+ "\xd3\x4c\xc3\xe2\x9c\xfc\x02\x5a\xc5\x10\x0e\xd7\x3c\x43\x61\x5e"
+ "\x61\x5e\x8e\xc9\x30\xdf\x90\x48\x98\x83\xd1\x05\xd5\x67\xa2\x6c"
+ "\x9f\x8a\xb0\x3d\x47\x1f\xba\x9b\xec\x14\xb5\xeb\x17\x61\xc5\x56"
+ "\xf2\xe1\xf8\x79\x5e\x28\x87\xd8\x26\x38\x3d\xb6\x65\xc5\x83\xdb"
+ "\xf1\x65\x07\x42\xe5\x77\x59\x75\xa8\xfc\x2e\x3b\x39\xb8\x1d\x5f"
+ "\xa6\xd0\xff\x65\x0a\xfd\x5f\x76\x61\x70\x3b\xbe\xcc\x15\x9a\x66"
+ "\x39\x84\xa6\x59\xae\x1b\xb0\x33\x48\xeb\x5e\x6e\x97\x96\x27\x28"
+ "\xd2\xcc\x55\xa4\x49\x55\xbc\x67\x04\xbd\xa3\xef\xba\xdc\x14\xec"
+ "\x1b\xe0\x7b\xb1\xac\xeb\x01\xfb\xb6\xfc\x80\x0c\x43\x6d\x0f\xad"
+ "\x75\x91\x60\xeb\x83\x60\xbb\x25\xd8\x01\xfd\x27\x9b\x44\x73\x37"
+ "\x85\x7f\xbe\x62\x86\x64\xdb\xba\x8e\x04\xda\xd0\x2e\xac\x8b\x29"
+ "\x57\x60\x79\x45\x9d\x80\x75\xd1\x7c\x5e\xf6\xda\x1a\x4f\x5d\x2c"
+ "\x68\x29\x2d\x9d\x67\xc5\x6c\x4b\x6b\x68\xfe\x38\x86\x45\xe1\x85"
+ "\x76\x6a\x85\x5e\x9e\x3b\xbf\x0f\x61\x9c\xb0\x82\xcb\x32\xa5\xdb"
+ "\xc7\xe7\x1d\xf2\xfc\x2a\x68\x8d\x15\x9d\x11\x77\x44\xec\x21\xd1"
+ "\x45\xe7\xac\x51\xde\x88\x43\xc3\xd4\x4b\x3f\x97\xce\xcb\xd2\xe1"
+ "\x15\x87\x38\x0b\x64\x9c\x88\x4f\x0f\xe2\x5c\x3e\x9a\x47\x26\xf9"
+ "\x3d\x2b\x0e\xca\xfe\x05\xf5\x15\xc2\xd9\x8e\xf0\x73\xb3\x21\xfa"
+ "\x88\xcd\x8f\x7d\x94\x2e\xa2\xe9\x0c\xf9\xa1\x0e\xbd\x0f\xda\x6b"
+ "\x7c\xd8\x7f\x05\x1d\xef\x4f\x59\x2f\x83\xa3\xde\x07\x34\x3e\xbc"
+ "\xd6\x0a\x65\x75\x6a\x7f\x07\x1b\x48\x47\x7d\xb4\x15\x6e\xa2\x67"
+ "\x1f\x85\x63\x7a\xec\x4b\xb8\x68\x0e\xf7\x10\xe3\x11\xd1\x04\x67"
+ "\x9f\x46\xfd\xbd\xf4\x99\x92\xef\x7b\xa0\x0e\x71\x85\x9d\x5f\xac"
+ "\x06\x87\xc7\x96\x8e\xed\xdf\xf6\x73\xb2\xcd\x6e\xae\xe6\xb6\x4f"
+ "\x8d\xe1\x65\xc8\x8b\xc6\xa1\xfc\x14\xc9\xbe\x5b\x68\x5e\x19\xc2"
+ "\x9e\xba\x19\x2c\xd1\xdd\x8c\xe5\x46\x5d\x74\xbe\xb5\x3b\x31\x52"
+ "\xb2\xaf\x5a\x4c\xd7\x25\xa7\xfb\x3a\xe5\x23\xdf\x88\xda\x63\xd4"
+ "\x55\xb7\xe8\x2b\xae\x7c\xf2\x15\x3e\x67\xf9\x31\xf4\xff\xd2\x65"
+ "\x3d\xb8\x0d\xdf\xd1\xfe\xa5\xf3\xf1\x44\x3e\xaf\x07\xfb\x93\x45"
+ "\x16\xf4\xd9\xf4\x6e\xb4\x8d\x8f\x65\xca\x71\x7c\x9c\x88\xe2\x4a"
+ "\x98\xb7\x59\xdf\x45\x71\xc5\x03\x71\x62\x0d\x01\x6b\xb6\xfa\x28"
+ "\xfc\xa0\x1c\x2e\xda\x96\xc7\x6a\x14\xef\xa7\xe4\x77\x7c\x6e\xc2"
+ "\x67\x83\x84\xdf\x85\x36\x57\x25\xf6\x5c\x58\x39\xbe\x96\xeb\xcd"
+ "\x63\x1d\x72\x3c\x1f\x53\x3b\x41\xdf\xc6\xdc\xe0\x8f\xb5\x38\xb9"
+ "\xcf\x85\x69\xde\xfd\xd2\x1b\x89\x7d\x0c\x15\xa3\xb3\x55\x31\x8c"
+ "\xf0\x90\xce\xf0\x33\xee\xf1\xbd\x13\x1e\x3b\x4b\xeb\x1c\x48\x46"
+ "\xb6\xfb\x20\xde\xf2\x20\x8d\x3f\xaf\xe4\x72\x4b\x61\x84\x97\xf0"
+ "\x51\x9b\x48\xb8\x09\xdf\x61\xf2\x69\xf9\x7c\xc9\x95\x54\xfe\x83"
+ "\x43\xd5\x15\xc6\x5b\x83\x78\x19\x89\xef\x07\x42\xcb\xba\xb2\x5a"
+ "\xf1\x7e\x52\x7e\xa7\xb1\x5e\x21\x7b\x2b\x6b\xa4\xb8\x96\x9b\xe5"
+ "\x35\x8d\xaf\x91\x59\xd9\xad\xc8\xcf\x1b\x8a\x7f\x95\x56\xf1\xae"
+ "\x97\xdf\xab\xf8\x37\x86\x55\x46\x39\x8f\x23\x62\x0e\x97\xb3\x61"
+ "\xb7\x2b\xf2\x66\x7b\x99\x60\x9a\xac\xa0\x3c\x87\xe1\x7b\x41\xa0"
+ "\xfe\x56\x59\x65\x7c\xf8\xbc\x2f\x08\x0e\xfd\x92\x55\x55\x32\x9c"
+ "\xf8\xbe\xb1\xaa\x21\x28\x5d\xe3\x2d\xca\xaa\x90\xdd\x8c\x7e\x21"
+ "\xbb\xab\xba\x15\xb4\x78\x03\x38\x33\x34\x01\x5a\x32\x74\x41\x70"
+ "\xa8\x9f\x19\x06\xa5\xac\x16\x59\x49\xc6\x49\x5e\x33\x92\xc3\xc4"
+ "\x79\xa5\xb8\xcc\xf0\x32\x9e\x61\x09\x0a\x97\xfa\x47\x19\x9f\x4a"
+ "\x7e\x02\xd9\x67\x77\x6f\x69\x86\x7c\xce\x2a\x97\x49\xda\x47\x6c"
+ "\x8e\x38\xd3\x1b\xe5\x3a\xa3\x51\x89\x57\xac\xbf\x91\x70\x04\x70"
+ "\x96\x09\x1f\x2f\xc3\x19\x54\xb6\x1e\x27\xac\x94\xbf\x13\xb9\xc4"
+ "\xd8\xe0\xaa\x0b\x43\xf5\x3b\x3c\xb6\xd5\xf1\xa1\x3c\x5b\x3d\x33"
+ "\xc0\xb3\xd5\x49\x01\xbc\xab\x53\x83\xe0\x7e\x8d\xef\x19\x41\x70"
+ "\xd9\xb7\x92\x4d\x21\x2b\xab\x0f\x28\xf2\xaa\x0e\xc2\xd1\x10\x94"
+ "\x57\x63\x10\x5c\x07\xbe\xdb\x87\xae\x9f\xd5\x17\x86\xae\x9f\xd5"
+ "\xde\xf0\xf5\xf3\xb8\x2e\x90\xef\xe3\xf1\xb7\xd6\xab\xc7\x53\x82"
+ "\xe8\xa9\xc3\xf7\xf4\x50\x3d\x7a\x3c\x5b\xf1\x3e\x50\xff\x0c\x6d"
+ "\x47\xc3\xce\x94\x48\x0a\x2f\x9e\x0a\x3a\xa1\x67\x8f\x97\x07\xc7"
+ "\xbf\x7b\x43\xc4\x13\x8d\xfc\x1b\x1c\x7d\xdf\x14\x70\x4d\x4a\x38"
+ "\x82\x09\x8a\xef\x90\x69\xc7\xf6\x3a\xec\x99\xa0\x72\xfb\xe7\xf0"
+ "\x53\xfb\xf7\xb8\x5b\x7c\xb7\x29\x8c\x63\xb6\xf7\x33\x87\x6a\xcb"
+ "\x3c\xb6\x27\x12\xb1\xcf\xd0\x2d\xf8\xf3\x04\xca\xff\x66\xee\x9b"
+ "\xb0\xf2\xc2\x38\x94\xa7\x1b\x17\xe1\x89\x4f\xf1\xde\x87\xf7\x5f"
+ "\x84\xb6\xaf\x4f\x64\x30\x9b\x6a\x55\x9d\x4d\xd9\xee\x3e\x51\x80"
+ "\x7d\x8f\x1b\xd1\xbe\xb2\xcc\x30\x71\x07\x98\x2d\x62\x65\x98\xf0"
+ "\x7a\xac\xaf\x1b\x4e\x78\xe2\x3c\xd1\x1b\x14\xde\xc4\x6c\xa3\x33"
+ "\x08\xde\x49\xf9\x61\x9a\xa1\xea\x4d\x5e\x07\x25\x64\x2f\x53\xa3"
+ "\x28\xc7\x57\x17\x21\x73\x8f\x28\x47\xe6\x1f\x43\xf3\xce\x8c\x0f"
+ "\x5f\x8e\xcc\xb9\x58\x8e\xaf\xc2\x97\x23\x33\x9d\xf3\x56\x8d\x65"
+ "\x19\xe4\x77\x64\x16\x60\x59\xbe\xe2\x7c\x0f\x0d\xdf\x27\xf7\x53"
+ "\x4b\xbf\xc2\xfe\xbf\x1a\x78\xda\x55\x25\x81\x7a\x93\xe0\x4e\x45"
+ "\x57\x43\x7a\x98\x3c\x5b\x98\x6d\xf8\x2a\x27\x64\xfa\xe4\xf6\x4a"
+ "\x0a\xbf\x20\x68\x41\x3e\xa9\x89\x4f\x58\x1e\x4c\x37\x54\x7d\xcb"
+ "\xfa\x29\xbe\x33\x3d\x89\xfa\xff\x84\x53\x6e\xd3\xb1\x3d\x77\xc9"
+ "\x7c\xc4\xb8\x34\x45\x9c\x37\x28\xce\x14\x12\xb7\x6b\x20\xbc\x44"
+ "\x0e\xff\x7a\xf5\xf4\xe4\x29\x45\x3d\x61\xfd\x3c\x35\x3f\xb4\xdc"
+ "\x4f\x9e\x11\xe5\xc3\x3a\x1a\xc4\xeb\x27\x3b\xb0\x8e\xfa\xc2\xd7"
+ "\xd1\x93\xee\xf0\xb2\xf6\x54\x14\xc7\x17\x0b\x61\xf0\x3d\x65\xc4"
+ "\xba\xeb\xe3\x32\x28\xd5\xd3\xe0\xfa\x79\x6a\xa9\x5c\x3f\x5f\xaf"
+ "\x8c\x4f\x95\x2b\xca\xd8\x7f\x11\xd6\x8c\x12\x65\x5d\xf3\xb4\x02"
+ "\xf7\xc9\xf0\xb2\xf8\x94\x1d\xcb\xd9\x1f\xbe\x9c\x4f\x5d\x18\x5a"
+ "\x16\x9f\xa2\x6f\x75\xfd\x83\x65\x71\x8d\x4e\xa4\x81\x30\x69\xd6"
+ "\xcc\x64\xb6\x70\xf9\xac\x49\x25\xbf\xc8\x09\x6b\x4a\xe8\x3b\x5d"
+ "\x50\x78\x56\xa8\xfc\x61\x19\x28\x1d\xf1\xcf\x27\xfa\x31\x54\x0f"
+ "\x17\x0d\xa0\xbe\x95\x4c\x7a\x6c\x6b\xce\x28\x78\x75\xf5\x22\x64"
+ "\xcd\xef\x55\xab\x17\x0b\x7e\x3d\xad\x52\xd0\xd4\x11\x9e\x5f\x6b"
+ "\x5c\xc8\xaf\xab\xe1\xf9\x95\x15\x35\x34\xbf\xb2\xa8\xfe\xaf\x0e"
+ "\xe6\x57\x56\x4a\x30\xbf\xfc\x36\x51\xbe\xe9\x7a\x94\x8d\xbe\xb5"
+ "\xac\x4e\xd8\x72\x5d\x34\xca\x8a\x48\xd3\x43\x69\x8a\xa3\xbd\x42"
+ "\x4e\x0c\x13\x40\x7b\x05\xb2\xb2\x64\xfd\x1f\x5d\x0d\xc3\x59\xdf"
+ "\x1a\x9a\xa3\x4d\x67\x3d\xeb\x1c\xd6\xab\x76\x87\x2f\x11\x68\xbc"
+ "\x51\x91\x6f\x53\x78\x5b\x90\x75\x0e\x79\x5a\x19\x26\xbc\x5b\x8c"
+ "\x99\x3e\x6d\x08\xb5\x11\x4f\x43\x68\x1d\xad\xe1\xe9\x60\x60\xff"
+ "\xd3\x9b\x5f\x37\xaf\xb3\xa7\x2d\x83\xeb\xec\x99\x18\xa9\xbe\xfe"
+ "\x1a\x4a\xdf\xd3\x07\xc2\xd7\xd7\xd3\xf5\x43\xd7\xd7\xd3\x67\x86"
+ "\xae\xaf\xa7\xa9\xef\x73\xd5\x09\xcf\xe8\x42\xdb\x8d\xa7\x5d\xa1"
+ "\xe5\xc5\x7c\x31\x1d\x53\x0f\xbb\x9d\xde\xbf\x6e\xb9\xe5\x8b\x6c"
+ "\x1c\xd5\x15\xad\xff\x47\xfa\xa7\x12\x8d\xdf\x14\xc7\x90\xb8\x91"
+ "\x87\xe5\x3b\x87\x3c\x3f\x3c\xaa\x1d\xfb\x95\x34\x3f\xcf\x30\x99"
+ "\xc6\xca\x9e\xf9\xb3\x5f\xad\x9a\x87\xcf\xea\x8b\x90\xfd\x53\xbf"
+ "\x3a\xa2\x8c\xe6\x92\xf1\xb5\x83\xfc\xfb\xc4\x33\xbe\xe0\xba\xa0"
+ "\x39\x65\x87\xc5\x5e\x8e\x34\xce\xf9\xd9\x45\x58\xbb\x5f\xd4\x4b"
+ "\x76\x45\x28\x1f\xd7\x1a\xc2\xd7\xcb\xda\x24\xac\x97\xcf\xc2\xd7"
+ "\xcb\xda\x8c\xa1\xeb\x65\xad\x05\xeb\xe5\xb3\xc1\x7a\xb4\xf6\x80"
+ "\xa4\x47\x7b\x29\x8d\x61\x33\xf9\xab\x6b\xbf\x22\x18\x7c\x46\x1d"
+ "\x59\xfb\x39\xc5\xcf\xea\x91\xf5\x88\xa7\xa1\xfe\x3f\xcf\x5f\x82"
+ "\x69\x92\x70\x04\xe3\x75\x46\xf7\x84\xd3\x93\xb5\xf4\x3d\x55\x35"
+ "\xdb\x02\x5a\xe4\x61\xe6\x71\xc2\x51\x08\x70\x05\xb2\x97\x11\x1c"
+ "\x85\xd3\xd9\xcb\x01\xf8\x6c\xa3\x0c\xc7\xc7\x45\x05\xac\x81\x79"
+ "\xcc\x40\x70\xa1\xb8\xb3\xa5\xf2\x0f\xe7\xed\x08\xc1\x13\x9c\x02"
+ "\xc6\x2a\xf4\x31\xfb\x4c\xa8\x3e\x66\x97\x87\xca\xe7\x5a\xfa\x3e"
+ "\x11\xed\x47\x3b\x87\xb2\xdc\xd5\x6f\x53\xcd\xfb\x76\x74\x33\x27"
+ "\x4a\xa1\x9b\x28\x03\x39\xff\x28\x64\x20\xe7\x50\x28\xad\x39\x09"
+ "\xe1\x65\x20\x27\x79\x68\x19\xc8\xc9\x1c\x5a\x06\x72\x8a\x49\x06"
+ "\x9c\x90\x73\x2a\x54\x37\x73\x0e\x86\x96\x1d\xf3\xe5\xba\x09\x31"
+ "\xdf\x44\x37\xd1\x17\xba\x7d\x28\x3d\x94\xfc\x7f\x55\xdd\x0d\x80"
+ "\x6f\xc0\x33\x2d\xea\x15\xd2\xb7\x2e\x85\xbe\x21\xa1\x8d\x37\x13"
+ "\x0f\x6b\x79\x1f\x6d\x5d\x46\x30\x1f\x0f\x8b\xbe\x56\x29\xc2\xfe"
+ "\x8e\xe6\xec\x09\x7e\xe6\x9e\x08\x2d\xff\xba\xe2\xf0\xfc\x5c\x77"
+ "\x10\xf9\x59\x1a\x9e\x9f\xeb\x4e\x0e\xcd\xcf\x75\x2d\xb4\x56\x7d"
+ "\xb0\x4e\xad\xbb\x60\xd8\xc6\x7d\x14\x9e\xe6\x0a\xe4\xde\xff\xf5"
+ "\xda\xa7\xdc\xb8\xd0\xf6\x69\x9d\xef\x9b\xb7\x4f\xb9\x99\xe1\xdb"
+ "\xa7\x5c\x4b\xf8\xf6\x29\xf7\x80\xd0\x87\x5c\x7b\xa8\x3e\xe4\xd6"
+ "\x87\xca\x04\xf2\xee\x5b\x6b\x9f\x4c\x3a\x85\x0e\x1c\xb9\x08\xa6"
+ "\x0a\xf4\x29\x24\x5b\x98\xb7\x3a\x94\x46\xd3\xcc\xf0\xf5\x66\x4a"
+ "\xc5\x7a\x3b\x12\xbe\xde\x4c\xd9\x43\xd7\x9b\xa9\x04\xeb\xed\xc8"
+ "\xe0\x7a\x33\x55\x7d\x73\x9f\xc2\xd4\x1a\x5a\x67\xa6\xc6\x6f\x5e"
+ "\x67\x79\x51\xe1\xeb\x2c\x2f\x21\x7c\x9d\xe5\x25\x8b\x3a\xcb\x2b"
+ "\x0e\xad\xb3\xbc\x8c\xd0\x3a\x43\xbe\x7d\x6b\x75\x96\xd7\xa2\xa8"
+ "\xb3\x2d\x17\x61\xfd\x22\xac\xb3\x73\xa2\xce\x36\x8c\x50\xd0\xe8"
+ "\x0c\x5f\x67\x79\x5e\xac\xb3\x2d\xe1\xeb\x6c\x7d\xdc\xd0\x75\xb6"
+ "\x9e\xf6\xd0\xd8\x32\xb8\xce\xd6\xa7\x7d\xf3\x3a\x5b\x5f\x12\x5a"
+ "\x67\xeb\x4d\xdf\xbc\xce\xd6\xdb\xc3\xd7\xd9\xfa\x8e\xf0\x75\xb6"
+ "\xde\x25\xea\x6c\x83\x31\xb4\xce\x36\x68\x43\xeb\x0c\xf9\xf6\x37"
+ "\xd6\x19\xd6\x8f\x5e\xcc\xd7\xdd\xf0\x52\x2f\x1f\xd3\xde\x50\xe6"
+ "\x04\xb3\xb4\x9e\xdd\xcc\x65\x47\xaa\xc3\x77\x11\xa6\x78\x70\xdb"
+ "\xbd\xa1\x46\x0a\x7b\x62\x70\x3d\x6c\x68\xc2\x76\xb5\xa7\xa5\x84"
+ "\xcf\xeb\x12\x75\x48\x3c\x47\x38\x31\x46\xb6\x81\xdb\x7f\xac\x63"
+ "\x46\xfb\x0a\x53\x5b\x8c\xf0\x6e\xc2\x43\xfb\xaa\x84\xe2\x32\x6b"
+ "\xbe\x89\x5f\x36\xf4\x1c\xf3\x42\x3d\xed\xfd\x7f\x11\xf2\xc7\x0b"
+ "\x59\x35\x2b\xfd\xdf\x3a\xcc\xeb\xb2\x90\xd3\x67\x15\x63\x26\xe6"
+ "\x21\xfc\x5f\x33\xf9\xbf\x75\xe1\xe5\xd4\x7c\x13\xff\xd7\x4c\xfc"
+ "\xa8\x0b\xea\xaf\xc6\xa2\x07\xa8\xe8\xaf\x9a\x7d\xd1\x6e\x21\x3b"
+ "\xdc\x8f\xad\x28\xd4\x7b\x6c\xf9\x09\x0a\x9a\xb1\x6e\xf2\x4f\x48"
+ "\x34\x1f\x0b\x4d\x9f\x9f\x1c\x9e\xe6\xfc\x0c\xa4\xf9\xdd\xf0\x34"
+ "\xe7\x5b\x86\xa6\x39\xff\x20\xd2\xfc\xee\x60\xdd\xca\x6f\x90\xe4"
+ "\x20\x4c\xbf\x3c\xdf\x1e\xbe\xfe\xf3\x15\xf5\x0f\x99\xc5\x25\xcc"
+ "\xc5\xd3\x87\xc0\x3d\x0b\xc1\x70\x34\x57\x9f\x60\x49\x46\xc2\xc0"
+ "\xce\x54\xe2\x1c\x02\x2e\x63\x90\xec\xd1\xda\x82\xb0\xb2\xf7\x6c"
+ "\x99\xd0\xc7\x67\x3b\x42\xf5\xf1\xd9\xea\x50\x7d\x44\x5e\x87\xa6"
+ "\x6b\x0a\x8d\x37\x1f\xf8\xf6\x6c\xec\x46\xa3\x42\x06\xde\xbf\x08"
+ "\x1b\xdf\x16\x32\xb0\xb1\x3f\x94\x8e\x8d\x29\xe1\x65\x60\x63\x26"
+ "\x96\xff\xfd\xf0\x32\xb0\xb1\x78\x68\x19\xd8\x58\x8e\xbc\x7c\x3f"
+ "\x58\x6e\x57\x95\xa4\x0c\x57\xc0\x9c\x0e\x6f\xf3\x36\x9e\x0d\x3f"
+ "\xae\xb3\xb1\x4b\xf0\xb8\x20\x3e\x94\xc7\x1b\x7d\xa1\x3c\xc4\xb2"
+ "\xfc\xed\x3c\x1c\x38\x2b\xc3\x63\x2b\x50\xea\xbf\xe3\x22\x14\x48"
+ "\xfa\xbf\xe9\xcf\xa1\x34\x16\x48\xfd\x9f\x70\x63\x59\x05\x0d\xc8"
+ "\x4b\x47\x78\x5e\x16\xd8\xc3\x97\xb9\x80\xda\x20\x87\x7f\x90\x2e"
+ "\x15\xb8\x30\x7c\x15\x7d\x3b\xa0\x31\xac\x5a\x0c\x5f\xe5\x03\x2d"
+ "\x6f\xaf\x06\xda\xa5\x4d\x71\x34\x46\xce\xc7\x98\x51\x7e\xa3\xe3"
+ "\x81\xd6\x1e\xe9\x88\xae\xb5\x25\xca\x6f\xa2\x9b\x52\x88\x6e\x9a"
+ "\xc7\x42\xeb\x6a\xa2\xad\x90\xee\x70\xfb\x40\x96\x77\x82\x57\xe0"
+ "\xb6\x90\x5e\x10\xbc\x0c\x2b\xc6\x3a\xcb\x14\xb6\x69\x53\x75\xf8"
+ "\x3a\xde\xd4\x38\xb4\xec\x6c\x3a\x2b\xea\x79\x33\x84\xd6\xf3\xa6"
+ "\x2e\xbf\x6d\x74\x06\x95\x15\x65\xe0\x1b\xe9\x09\x7d\x3b\x1d\xd2"
+ "\xde\xef\x5d\xd3\x61\xd9\x0d\x93\x2f\xc1\x66\x33\xcf\x4f\xcd\xd0"
+ "\xa7\x50\x41\x0b\xb7\x01\x9b\xdf\xe3\x74\x22\xcc\x5a\x1f\xa8\xd9"
+ "\xde\x8d\x1d\x14\x57\x67\x63\x5e\x3a\x37\x46\x3e\x03\x06\x65\xe1"
+ "\xf6\x4e\xd8\xbc\x27\x24\x3d\xb6\x46\x0e\x81\xe3\x8c\x18\xdf\xdf"
+ "\xdc\x24\x8f\xc3\x0f\x35\xbe\x8f\x30\x17\xe4\x79\xbf\xe2\x5b\xd8"
+ "\xe6\x73\x43\xb6\xcb\x48\x13\xad\x1d\x27\x9a\x6e\x6e\x07\xb6\x24"
+ "\xca\xf2\x2b\xbe\xcd\x6d\x49\x09\xac\x6d\xd9\xb2\x14\xe3\xdc\x37"
+ "\x19\xcf\x0d\xd2\x83\x2d\xd6\x60\x3c\xe2\xbc\x98\x2d\x07\xe5\xf5"
+ "\x29\xf8\x5c\x7d\x0b\x5c\x32\x3d\x76\x05\x3d\xe7\xb0\xbf\xe0\x96"
+ "\x70\x5c\xb8\x05\x8e\x38\x47\xc3\x3c\x98\xed\x87\x88\x4b\x50\x78"
+ "\x17\x9d\x3f\xe3\xa8\xe9\x86\x28\x1f\x68\x44\xdf\xce\x72\x2f\xad"
+ "\x0d\xa1\xbe\xa1\xc3\xb7\xc0\x4e\xdf\xe0\xf8\x1c\x02\xfd\x02\x7b"
+ "\x9b\xb5\x5f\xda\x83\xcd\xf2\x10\xf1\xb4\xcd\x7c\xd5\x5e\x73\x94"
+ "\x75\x1f\xe7\x7b\x6f\x59\x42\xfa\x7f\x07\x69\xfe\x0f\xcd\xc3\xd8"
+ "\x0d\x0b\x10\xfe\x77\x42\xd7\x0b\x15\x3e\xa9\x65\x88\xfe\x9f\x85"
+ "\xfa\x7f\x0b\xc2\xeb\xb9\xe5\x26\xfd\x3f\x0b\xf5\xff\x16\x04\xb7"
+ "\x9b\xe2\x3b\x8f\xe5\x42\xb0\x4f\x4a\xfb\x63\x19\xd6\x93\x9f\xf9"
+ "\xdc\x63\xf7\x54\x81\xce\x47\xdf\xb4\x51\x37\x1d\xdd\x2d\xa4\xaf"
+ "\xba\x36\x57\x13\xed\xc3\xa0\x1d\x6d\x21\x59\xa4\xb6\x8c\xf4\xf5"
+ "\x39\x03\x6f\xcb\x7c\x42\x17\x4b\xad\xcc\x35\xb3\x0b\x65\x68\x8b"
+ "\x59\xc6\x15\xb5\xcb\x2c\xd6\x7d\x8c\xee\x82\xe1\x8e\x6e\xde\x2e"
+ "\xaa\xc8\x5f\xe5\x7e\xab\xef\x1a\x10\xde\xe6\x92\x36\x20\xbc\xfe"
+ "\x81\x76\x92\xe3\x2e\x21\x1d\x27\x9c\x84\xbb\x1d\xe1\x08\x2f\xc1"
+ "\xc9\xe5\x10\x6b\x63\x9e\x6b\x08\x2e\x3b\x1f\x7f\xc1\xbc\x31\xfc"
+ "\x73\x1a\x57\x71\x50\xba\xd2\x35\x6c\x76\x17\x7d\x33\xbb\x6a\x67"
+ "\xa5\x1b\xd9\xec\x42\x1a\x13\x2b\xa4\xf3\xa0\x55\xef\xfe\xc9\x19"
+ "\x59\x3c\x15\xb4\x22\xec\xb9\x9e\x16\x83\x17\x9c\x50\x98\x18\x6a"
+ "\x23\x0a\x15\xfe\xaf\x85\xf7\x33\xf1\xae\xa1\xf9\x89\xd2\xfc\x55"
+ "\xb2\x07\xcc\xe1\xf3\x70\xf9\xb8\xd9\x9c\x0a\xfa\x26\x4d\x73\xa2"
+ "\xc4\xfe\x6f\x85\x56\xc5\xd8\x9b\xeb\x30\x9f\x57\xf3\x7b\xcc\xb7"
+ "\x28\x52\xc8\x48\x71\x64\x68\x9d\x16\x56\x97\x5e\xa6\x6f\x41\xa2"
+ "\x3d\x78\xc6\xa7\xb4\x8f\x85\x4d\xb2\xef\xa6\x08\x3f\x27\xb7\x07"
+ "\x86\xcd\x84\xb7\x48\xd1\xce\x14\x72\xff\xbf\x7f\x50\xbb\x50\x44"
+ "\x76\x3d\x44\x26\xdb\xb9\x0c\x15\x19\xda\xdc\x28\x37\x85\x24\xff"
+ "\x45\xc7\x10\x66\x0f\xad\x39\xc4\xf7\xe1\x57\xa0\x28\xbd\xdf\x06"
+ "\xda\x36\x17\x5f\x53\xa5\x43\x19\xe1\x72\x4b\xed\xc6\x1c\x31\x1f"
+ "\xc9\xad\xc8\xa3\x40\xe6\x39\xc1\xb4\x17\xfe\x1e\xc4\x7c\x0a\x92"
+ "\x85\xa2\x14\x9a\x9b\x31\xba\x87\xef\xb5\xa5\x93\x65\xc8\xe1\xeb"
+ "\x80\x76\x9f\xb2\xcf\x53\x74\x3a\x7c\xd9\x8b\xa8\xfd\xaf\x74\x42"
+ "\x71\x42\x68\xdd\x16\xf1\xf6\x5f\xfe\xae\x83\x75\xef\x0a\x4d\x57"
+ "\xac\x09\xad\xfb\xc2\x6a\x8a\x1f\x72\x8e\x4f\x79\x61\x3c\xf6\x67"
+ "\xd6\xba\xf9\x7c\xaf\x62\xd4\xff\xc2\x8c\x9b\xd9\x41\xa6\x2b\x8c"
+ "\xf7\x23\xac\x34\x2f\x18\xed\x56\xf1\x81\x90\x31\xa3\xb1\x7c\xcc"
+ "\x68\xed\x45\xd8\x2a\x7d\xfb\xd9\xda\xa6\xa0\xaf\x61\x68\xdf\xa0"
+ "\x98\xbe\xff\xac\x0d\x6f\x33\x8a\x2f\x84\xf7\x0d\x8a\xdd\x92\x5d"
+ "\x58\xcb\x62\x94\x72\xb0\x95\xd6\xd3\xf1\x34\x72\x1f\x96\xc6\x42"
+ "\x87\xee\xc3\x6e\x4d\x19\xe8\xc3\x16\x92\x3d\xd8\x6a\x1c\xe8\xc3"
+ "\xba\xc2\xf5\x61\x9d\x61\xea\x73\xeb\xbe\xf0\xf5\xb9\xb5\x26\x7c"
+ "\x1f\x76\xeb\x69\xd1\xce\x6f\xed\x0e\xad\xe7\xad\x67\x03\xdf\x84"
+ "\x8b\x1b\xbe\x3d\x7f\x78\x5b\xd2\x60\x7f\x78\xdb\xcf\x44\x5d\x6d"
+ "\xbb\x16\x4a\xdb\xb6\xf4\xf0\xb6\x7d\x9b\x79\x68\x7f\x78\xdb\xbe"
+ "\xa1\x6d\xfb\xb6\xfa\xc1\xfe\xb0\x61\x98\x02\xa6\x65\xc0\x57\x0a"
+ "\xf1\xcd\xb6\x5d\x10\x7c\xda\x4e\xfe\x5c\x44\x10\xbc\x3b\x54\xde"
+ "\x91\x66\xc4\x87\xb6\xed\x12\xd9\x34\x59\x66\x86\xe2\x09\xed\xbd"
+ "\x34\xbd\x0a\x46\xa0\x0e\xbc\xef\xb1\x6d\x1f\x90\x7f\x9a\xc7\x47"
+ "\xf9\x90\x8d\x1c\x72\x3e\x9d\x5a\xa6\x8f\xe8\xd8\x5e\x72\xb3\xef"
+ "\xa5\x11\x7a\x48\x7f\x65\x10\x3f\xb6\x73\xff\x8f\x70\xdc\xbc\xce"
+ "\xb6\xf7\x28\x74\xcc\x2d\xe6\xe1\x5a\x7f\x21\xea\xcd\xaa\xe8\xcb"
+ "\x5a\xb5\x7c\x4d\xdf\x90\xf6\xd6\x6a\x0c\x2f\xa3\xd6\x94\x01\x7b"
+ "\x5b\xc8\xf1\xee\x50\xc4\x67\x8b\x3a\xb0\x36\xf9\x63\x82\xc7\xba"
+ "\xad\xd6\x50\x9b\x64\xcd\x56\xa4\x53\xf4\xff\xac\x9c\x9e\xaf\xd7"
+ "\xde\x58\xbb\x87\x6e\x6f\x76\x6c\x15\xe5\xdf\xa9\xf8\xbe\xbc\x43"
+ "\x7b\xf3\xf6\x66\xc7\x10\xe5\xdf\x91\x12\xda\xde\xec\x54\x7c\xa3"
+ "\xdf\x91\x1d\xbe\xbd\xd9\x61\x95\xed\x8c\xb0\x1b\x3b\xfe\xed\xeb"
+ "\xd9\x9b\x1d\x8d\xa1\xf6\x66\x47\xf5\xad\xec\x4d\xf3\x20\x7b\xb3"
+ "\xc3\x1d\x5d\x13\xae\x2c\x3b\xa3\xc2\xdb\x9b\x9d\x09\xa2\x0e\x77"
+ "\x96\x84\xda\x9b\x9d\xc9\xa1\x75\xb8\x43\x51\x87\x3b\x15\xdf\xbf"
+ "\x77\x68\xff\x4f\x6d\x52\x44\x44\x84\x3a\x42\xa5\x56\x45\x60\x14"
+ "\x16\x0f\x86\x47\x68\x22\x22\xf1\x1a\x26\xdd\x87\xab\x23\xd4\x1a"
+ "\xbc\x22\xa5\xfb\x30\xc5\xfb\x70\x4a\x8b\x97\x46\xba\x47\x2a\xde"
+ "\x87\xdd\x22\x7e\xb8\x94\xaf\x9c\xbf\x46\xf1\x1e\x79\x8b\xf8\x61"
+ "\x7f\x63\x7a\x18\xf4\x1e\xba\x0e\x72\xc9\xe6\x6d\x39\x05\xf9\x26"
+ "\x3e\xaf\x3d\xcf\x90\x93\x9b\x9b\x57\x54\x64\x28\xde\x62\x78\xf8"
+ "\xa1\x95\xf7\xcd\x33\x88\xe9\xf1\x05\xf3\x67\x98\x46\xc2\xb2\xed"
+ "\x85\x14\xb1\x6c\xd5\x92\x4c\x43\xfa\xc3\x0f\x85\x46\xca\x68\xf8"
+ "\x34\xf8\x9b\x61\x09\xd2\xbd\x94\x97\xc6\x02\x1c\x3c\xca\xed\x4e"
+ "\x17\xad\x3d\x17\xfd\x89\xb2\xdf\x9d\xa5\xf5\xcb\x37\x4a\x19\xad"
+ "\xab\xe8\x84\x92\x5d\x54\x88\x59\xf5\x65\x60\x59\x47\xfb\xa9\x94"
+ "\x1c\x63\xbf\x74\x81\xe1\x51\x50\x77\xc2\xfe\x2f\x5a\xd2\x10\x16"
+ "\xdf\x1d\x4e\x1f\x18\x4a\xc9\xb7\x2d\x7b\x09\xe3\x54\xec\x41\x3f"
+ "\x86\xb9\xa5\xf5\xf9\xa5\xc7\x78\xd8\x2f\xcb\x64\xb8\xe8\x8b\xb0"
+ "\x6b\x3e\xfb\x25\xe3\xef\xb4\x67\x8d\x80\xdb\x15\xc3\xd4\xcf\x9f"
+ "\x23\xbb\x50\x13\x0b\x1a\x9a\x97\x7d\x2c\x16\xb4\xc7\xc6\xd2\x9e"
+ "\xbb\xbb\x34\xf2\xbc\xec\x97\xf0\xdd\x09\xfb\xbb\x29\x6f\x82\xf5"
+ "\xab\x9f\xbf\x41\xf0\xb5\xa1\xf0\x73\x03\xf3\xb8\x77\x69\xd4\x08"
+ "\xb7\xe2\x73\x88\x8e\xee\x67\x7f\xf5\xc6\x9a\xd3\x67\xa7\xa1\x9f"
+ "\x86\x55\x71\xd6\x57\x06\x62\x6d\xd4\xae\x5d\x3b\xfa\x99\x8f\xf6"
+ "\x4c\x58\xd6\x53\xca\x8e\x6c\x02\x0d\xea\xb3\xca\x5e\x48\x6b\x29"
+ "\x76\x99\xea\xf2\x40\x83\xe5\x8f\xbf\x04\xbb\xab\x0c\xcb\xd1\x6f"
+ "\x5c\x06\x9a\x4f\xac\xb4\xde\xb5\xa8\xf0\xf0\x6f\x41\xf3\x0f\x37"
+ "\xca\xd4\x37\x98\x1e\x4a\x8a\x59\x37\xa3\x7d\xb8\xdd\xcc\x4b\xf3"
+ "\x6d\xcf\x66\xf7\x13\xcc\x3a\x4f\xa9\x1e\xda\xd1\x7d\xd9\x75\x81"
+ "\x79\x0f\xfc\x56\xec\x57\xd1\xd6\xe3\xa6\xf5\xb3\xda\x5d\xcb\x20"
+ "\xe2\x62\x26\xa8\xdb\xcc\xd5\xe0\xc8\x72\x43\xc9\x05\xd6\x7d\x36"
+ "\xfb\xcf\xd0\x6e\x6e\x84\xb5\x1d\xa0\x3e\xdb\xf5\x47\xe0\x7b\x49"
+ "\x57\x5e\xa0\x75\xb7\xfa\x5d\xf9\x14\x76\x0d\x76\xee\x82\x51\x3b"
+ "\x3f\xa5\x7e\x50\x07\xe6\x73\x19\x9e\x3a\x0f\x2a\xc4\xa7\x7e\xfe"
+ "\x8f\xa0\x7f\xfe\x49\x5a\x67\x9e\x02\x35\xbb\x41\xcf\x4a\x8d\x51"
+ "\x37\x4a\x8d\xba\x1b\xcc\x18\xeb\x29\x35\xc6\xb5\x5b\x10\xbe\xeb"
+ "\x3d\x18\xdd\x01\x71\xbf\xbc\xd4\xa1\xae\xfe\x12\xe2\xa9\x4c\x17"
+ "\xb1\x6c\x35\x5f\x22\x7c\xe5\x4f\xcb\xfc\x98\x36\x38\x8d\x2f\xe6"
+ "\xa7\xd5\x8e\x4c\x2f\xf8\x11\x57\xf5\x0d\x88\xaf\xb9\x01\x7a\x7f"
+ "\xc5\x4f\xcb\x28\x5d\x0f\x94\x56\x38\xce\x02\x4a\x0a\xeb\xef\xab"
+ "\xb4\xa4\xa3\x3d\x1c\xfe\xee\xba\x26\x8d\xe3\x6c\x0f\xb4\xb9\x6f"
+ "\x40\x3b\xfc\x1e\x1c\xd6\xbf\xd8\xff\x61\x5d\x53\x24\xfa\x93\x2a"
+ "\xfb\x4e\x9a\x03\x2f\x64\xa7\xb4\x8d\xf6\xcf\x2b\x83\x23\xbb\x21"
+ "\xca\xb2\x13\x86\x5f\xc2\x70\x6e\x7b\xca\x73\x33\x1d\xbe\xbf\xd8"
+ "\x77\xf2\xf5\xe0\xfb\xbb\x77\xb7\x41\x44\xbb\xbb\x9a\xca\xaf\xee"
+ "\x8f\xbd\x00\x0e\xf7\x39\x70\x58\x3e\xb3\xfb\x75\x7f\xe8\x3e\xe8"
+ "\x07\xed\x3f\x5e\x3f\xa7\x76\x68\xae\x83\x23\xd3\x0d\xef\x63\xde"
+ "\xac\xf2\x02\xed\x09\x99\xd2\xee\xf6\xd2\xfe\x3b\x89\xac\x57\x3f"
+ "\xf2\x48\x21\xcc\xac\xfd\x12\x12\x8e\x7f\x09\x46\xe6\x31\xaa\x69"
+ "\x8d\x37\xed\x97\x76\x1c\xef\x51\xd8\x07\xc3\xb2\xf3\xb5\xde\x2c"
+ "\x46\x5a\xeb\xdd\x67\x84\xba\x1b\x81\xb5\xde\x37\x7a\x03\x6b\xbd"
+ "\x51\xa6\xb4\xb4\xde\xdb\x09\xbb\x6b\xa2\xcf\xc2\x70\xd4\x13\x3b"
+ "\xc9\xf7\x91\x2b\xa0\xd9\x7b\x05\x60\x76\x99\x9a\xfa\x99\x1a\xd4"
+ "\x87\x5d\x0e\xac\x1b\x7a\xee\x84\xb2\xb9\x78\x8f\xc2\x0b\xfb\x73"
+ "\x65\x7c\xaf\x8a\x2e\x49\x8e\x31\x4c\x8d\x61\x93\xf0\x1e\x81\xf7"
+ "\x31\xa5\x35\xcc\xc5\xca\x8b\x13\xd1\x57\x19\x49\xf2\x2c\xd6\x97"
+ "\x17\x27\x7a\x6c\x65\x51\x4e\x38\x55\x20\xcb\xb5\xb0\xef\xbb\xb4"
+ "\xef\x77\x5e\xa6\xfd\xde\x5d\x9c\xae\x3e\xb3\x8a\xf6\x7e\x97\xc2"
+ "\x89\x86\xad\x94\x2f\xe6\x9f\x89\xf7\x68\xd1\x07\x2d\xed\x91\xd3"
+ "\xf6\xf6\x99\x29\xcf\x4d\x18\xce\xe4\x70\x2c\xb7\x86\xe2\xfe\xa5"
+ "\xf3\xb2\x5a\xc0\x18\xd5\x88\xd3\x2b\xe1\x47\xdd\x2f\x39\x45\x3a"
+ "\xde\xab\x8e\x66\xcd\xd9\x73\xa1\xe6\x28\x3b\x7b\xfc\x28\x6b\x11"
+ "\xba\x57\xd6\xe8\x84\x7f\xe2\x7b\x4f\x62\x1b\xde\x72\x10\xe3\x9a"
+ "\xb1\x37\x4e\x7c\x69\x31\xd1\xfc\xd2\xb2\x73\x4e\x98\x16\x17\x5c"
+ "\x06\x66\xdb\xd9\x48\xed\xe8\x3f\xed\x6e\xc5\xfe\xe4\xf3\x8d\xed"
+ "\x5d\x3d\xf0\x0f\x37\xba\x23\x4b\x3f\x06\xb5\xc3\xd7\x09\x73\xe2"
+ "\xc4\x39\x39\x75\x47\x99\xf3\x15\x3a\x3f\xf8\x28\xeb\x41\x79\x99"
+ "\x74\x09\xf6\x4c\xba\x27\x0e\xe2\x7e\x83\x5e\x89\xb0\x4f\x7b\xee"
+ "\x0f\xb2\x4f\xef\xb5\x39\x9b\x82\x6c\xd3\xfe\x4d\x83\x6d\xd3\xbe"
+ "\x7c\x61\x9b\x50\xf7\xb9\x2d\xea\x77\x4a\xe1\xab\x15\xe1\xd2\xfa"
+ "\x95\x7d\x0f\x28\xc2\xbd\x52\xf8\x0c\x45\xb8\x4b\x84\xef\xcd\x93"
+ "\x6d\x5f\x3b\xd1\xb1\x9d\x6c\xdf\xde\x25\x64\xfb\xda\xb3\x25\xdb"
+ "\xc7\xed\xcf\xde\x59\xec\x4d\xb4\x45\xdb\xc8\xde\xec\x8d\x24\xfa"
+ "\xd9\x2f\x41\xa6\x7d\xc4\x45\xb0\x7d\x48\x61\xe5\xbf\x07\x0d\x5e"
+ "\x92\xdd\x2b\x19\x47\x76\x8f\x6c\x1e\xd9\xbe\x37\xc6\xb2\x8e\x37"
+ "\x8e\xb2\xf3\x35\x7c\xdf\x6a\xdb\x80\xfd\x7b\x19\xc3\x0e\x62\xd8"
+ "\xcb\x18\x4f\x76\x90\x78\xd2\x96\xd9\x04\xfc\x5c\x9b\xf2\x22\x8b"
+ "\x5f\x9d\x08\x87\xb1\xbe\x69\xff\xab\x7d\xc8\xdf\x68\x15\x58\x1c"
+ "\xc5\x6e\xbe\x0e\x85\xf6\x4a\x6f\x2f\xee\x22\xbd\x1b\xbb\xd7\x4f"
+ "\xe3\x14\x7f\x86\xdd\x6e\x76\x89\xd6\xaa\x10\x0d\x6b\x77\x3c\x4a"
+ "\x7b\x7d\xab\x5a\xcc\x00\xb4\x2f\x01\xd9\x6c\xa4\x45\x53\x8e\x34"
+ "\x89\xbd\x85\x6d\x67\x9c\xf0\x99\x24\xaf\xfb\x69\xad\x1a\xb6\x29"
+ "\xd8\x11\xb7\xa1\x7d\xc4\xb2\x45\xf7\x97\x01\xed\xcd\x42\xe7\x6b"
+ "\xd2\xfd\x0d\xb5\xdf\x5c\x2e\xef\xcf\x62\x43\xdb\x80\x30\x8e\x0e"
+ "\x2f\x10\xcd\x4e\xb0\x2d\x6d\x2b\x69\xc2\xf4\x7b\x5c\xc4\x1b\x66"
+ "\x2b\x95\x71\xa8\x38\x0e\x35\x1f\xbb\x35\x23\x9c\x53\xf8\x37\x96"
+ "\xf4\xb6\x2c\x17\x90\xdd\x77\x74\x23\x8e\x92\x4e\x81\x03\x71\x31"
+ "\x6c\x03\x42\xe2\x24\xfc\xa3\x76\xb1\xbf\x22\xfe\x33\x54\x5f\xb4"
+ "\x4f\x17\xcd\x53\x42\xbe\x44\xd1\x5e\x0d\xc2\x0f\xb5\x2d\xaa\xfb"
+ "\x3d\x80\xb4\xd7\x18\xca\x9b\x2d\x95\xf6\xf2\xa2\xfd\xc5\x6e\xb6"
+ "\xb7\x18\xf2\x28\x41\xde\x5f\xcc\xbf\xfd\xdb\xdd\x5b\x0c\x71\xeb"
+ "\x6b\xd5\x0c\x75\xce\x96\x4a\xfb\x8b\x21\xfd\x0d\x24\x87\x52\x99"
+ "\xd2\x5e\x7d\x8a\x78\xbe\xe7\x20\x85\x1d\xb1\xb1\x56\xb9\xfe\xa9"
+ "\xbc\x54\x16\x8c\xb3\x08\xff\x90\xa1\x5e\xee\x4b\xa3\x78\x0c\xcb"
+ "\x22\xf8\x39\x68\xc7\x1c\xd8\x86\xbd\xdb\xd9\xaf\x3e\xb2\x13\x34"
+ "\xc2\xa6\xed\xcf\xa1\xf4\xc2\xa6\xed\xd7\x07\x6c\xda\xfe\x51\xc2"
+ "\xa6\x09\x1e\x0b\x9b\xb6\x5f\x25\x6c\xda\xbe\xaf\xf8\x7c\x22\xb4"
+ "\x69\x14\x47\x76\x4d\xb6\x69\xc7\xc7\xb2\x56\xb2\x1d\x1e\xdb\xbe"
+ "\x6e\xd9\xb6\x1d\xc2\x30\xb2\x1d\x44\xa3\xb0\x53\x7b\x53\xd8\x1f"
+ "\x8c\x20\xe6\x6b\xd2\xb3\x99\xf6\xcf\xe8\x96\x9e\xa9\x3d\x79\x52"
+ "\xd8\xb8\xfd\xc9\x01\x1b\xb7\xcf\x1e\x48\x4b\x36\x6e\xff\x63\xc2"
+ "\xc6\x89\xf0\xba\xa7\xc8\xc6\xed\x4d\x21\x1e\x48\xf8\xd5\xf4\x1d"
+ "\x4d\x82\x27\x3e\xa6\x05\xdb\xb8\x50\xfd\xda\x5f\x25\xdb\x38\xb2"
+ "\x6d\xf8\xde\xe0\x84\xa9\x7c\x5c\x98\xf4\xac\x0a\x79\x2e\xeb\x1d"
+ "\xd5\x01\x95\x99\xce\x0f\x20\xbe\x2d\xbc\x0c\xc3\xa5\x7d\x6b\xa4"
+ "\x72\xef\x77\xca\x6b\x34\x91\xff\x83\xf7\x34\x83\xc0\xbe\x64\x58"
+ "\xd7\x53\x68\x3f\x47\x47\x59\x27\x38\xaa\x59\x59\xbb\xef\x02\xf8"
+ "\xf7\x6e\xfc\x9c\xea\x15\xfb\x1b\x3f\xa4\x3b\xd9\x9d\x4b\xf0\xc2"
+ "\xd4\xb5\x6e\x3e\x7e\xff\xf9\x11\x35\xc6\x59\x43\xe2\xe6\x53\x1e"
+ "\x34\xae\x88\xcf\xda\xa1\xc6\x11\xbe\x41\x5e\x87\x6e\x92\xd7\x3b"
+ "\x3c\x2f\xf4\xa5\xb0\xdf\x13\x73\x05\x5e\xe0\xdf\xd0\xf8\x9e\xcc"
+ "\xe1\x71\xfd\x4e\x8a\x8f\x18\x22\xfe\xab\x9b\xa7\x7f\x71\xfc\xcd"
+ "\xd3\xbf\xf8\x00\xd9\x20\x5a\x8f\xd7\x6f\x0b\xc5\x33\xda\x27\xc3"
+ "\x5d\x22\xb8\x1c\xe9\x3b\xc8\xe7\xa5\x53\x79\xbf\x4c\x2f\xe3\x24"
+ "\xb9\x3b\x8c\x70\x7c\xff\x5a\xb4\x91\xa9\x3b\x80\xf6\x0e\x0e\x4e"
+ "\x7b\x3c\xc0\xdf\x17\xd3\x6f\x32\x4e\x13\xe5\xc0\x5e\x20\x9d\x2f"
+ "\xdf\x8c\xad\x20\xad\xa5\xa9\x1a\xf8\xf6\xf0\xa2\x1b\xed\x25\x3f"
+ "\xbf\x55\x5a\xb7\xdb\x83\xf6\x6d\x0a\xed\xb1\x49\x7e\xa5\xb4\xd6"
+ "\x62\x1c\xda\xe5\x58\xda\x87\x85\xc6\xab\xd7\xf6\xa7\xab\x9b\xf9"
+ "\xfe\xfb\x07\x12\xe5\xb4\x43\x8d\xed\x51\xbe\x52\x9e\x7c\x1d\x12"
+ "\xa6\x31\xc9\x69\x08\x37\xad\xbd\xc1\xf6\x78\x0a\xdf\xdf\xcc\xd7"
+ "\x43\x36\x70\x1c\xfa\xa0\xb1\x22\x9f\x6c\x90\xf2\xa9\x76\xc2\x0b"
+ "\xa6\x9b\xad\x73\x1a\xba\x7c\x07\xce\x7f\xf3\xf2\x81\x54\xbe\x97"
+ "\x74\xb7\x28\xdf\x4d\xf2\x7d\x69\xe9\x37\xcf\x57\x27\xe7\x7b\xe0"
+ "\x9b\xf3\xf5\xa5\x33\x5f\x9f\xaf\x89\x12\x5f\x5f\x72\xdd\x82\xaf"
+ "\x61\xf2\xf9\x71\xc2\xd7\xcf\xc7\x20\xe5\xf3\xe3\xcc\x70\xf9\x00"
+ "\xff\x0d\xb9\x5f\x8f\x56\x3e\x23\x46\x3a\x97\x78\x04\xe2\xa9\x77"
+ "\xc2\x81\x81\xb3\x87\xc5\x79\x49\x3f\x3e\xed\x84\x97\xaa\x42\xd7"
+ "\x71\xfd\xf8\xdf\xd6\xd6\x53\xbb\xce\xfc\x4e\xf8\xf1\x79\x1a\x6b"
+ "\x4b\xdd\x25\xf6\x07\x94\xd2\xa0\x3d\x7f\x69\xc8\xfd\x8b\xa4\x3d"
+ "\x72\xb2\xe5\xbd\x3b\x68\x7d\x2a\xab\x6c\xcc\xee\x2d\x35\x83\x38"
+ "\x2b\xfa\xe5\x7b\x69\x1d\x12\x3e\x0f\xc7\x67\x31\x0e\x45\xe7\x0b"
+ "\x88\x3d\x29\x86\x61\xd8\x1e\x3a\x7f\x42\xac\xdf\x7b\x39\x03\x69"
+ "\xb0\xf2\xb1\x26\xbe\xc7\x3e\xdf\xdb\xc5\x8d\x70\x6a\x4a\x2b\xf6"
+ "\xf4\x78\xd9\x2a\xc3\x38\x65\x7c\x03\xfb\x5b\xbc\xbc\x44\xb4\x2d"
+ "\x2f\xa7\xf5\x0e\x71\x8e\x11\xed\x73\xd6\xb0\x3b\x31\x64\xfd\xe1"
+ "\xa2\xc2\xc2\x2d\x85\xf3\x0c\x45\x9b\xd6\xcd\x2a\x2a\xce\x29\xde"
+ "\x5a\xc4\x17\xaa\x8f\x04\x0c\x30\x14\xe7\x6f\xca\xdb\xb2\xb5\xd8"
+ "\xb8\x3d\x27\x5f\x2c\x6c\xbf\x0b\x01\x83\x81\x20\xf4\xdc\x48\xb4"
+ "\x41\xe7\x98\x9a\xef\x41\xc1\xcf\x8e\xa4\xbd\x48\xe4\x75\xbb\x2d"
+ "\x7a\x7e\xc6\x16\xda\xac\x83\xc9\x4e\xd8\xd2\x2d\xd7\x03\xed\x8f"
+ "\x88\x7e\x8b\xfe\x12\x1c\x7c\x92\x64\x67\x05\xba\xa0\x75\x62\x5f"
+ "\x09\xbe\x37\x80\xa3\x18\x03\xda\x41\x6b\xdf\x46\xe3\xb0\x07\xcf"
+ "\xf9\x6d\x2f\xdb\xf9\x7e\x8f\x3b\x2f\xd1\xfb\x35\xd9\x4f\xa0\xef"
+ "\x4a\xe2\x3b\xf0\x94\x05\x9d\x70\x70\x06\xe5\x4b\x7a\x57\x5b\x29"
+ "\xce\xea\x66\xb6\x97\x3b\x68\xad\x36\xbe\x6b\x91\x06\xbb\xec\x8b"
+ "\x22\xbd\x51\x2c\xa6\x11\x7d\xb4\x83\xee\x0f\x74\x2e\x90\xd6\x7a"
+ "\x6b\x6b\xc5\xba\x6e\x0d\xc2\xf6\x0c\xc0\xda\x68\xdf\xe3\x46\x33"
+ "\xb6\x9b\x61\xbf\x65\xb3\xd8\x5d\x99\xfe\xbe\xcc\xc8\xe0\x32\x63"
+ "\xbf\x1a\xeb\xef\xd0\xdb\x58\xf6\x38\x59\x56\x44\xdd\x1f\x3a\x24"
+ "\xf6\x5e\xde\x95\x89\x61\xc3\xf0\x6e\xe9\xc5\x38\xda\x03\x01\xe3"
+ "\xb2\xe9\x1b\x59\x7b\xc9\x55\x7b\xb3\xbe\x13\xeb\xfd\x90\xc5\x09"
+ "\xdb\xe2\xc5\xba\x35\x84\xc7\x3c\x1c\x65\x37\xa0\xc5\xc0\xec\x34"
+ "\x46\xe7\x84\x43\x67\x5a\x0c\x6e\x60\x11\x6b\x3e\xa7\x74\xa8\x57"
+ "\xfa\x52\x2b\xf9\x22\x18\xce\xd7\xe7\x1d\x6a\x94\x79\x5e\x6c\x60"
+ "\x97\x09\x66\xa8\x71\x65\x6a\x2f\x8f\xf0\xb6\xe4\x4b\xa0\x39\x58"
+ "\x5d\x70\xe8\xbc\xb2\xbd\x98\x61\x9a\x67\x30\xe5\x14\x1b\x0a\xf2"
+ "\x37\xe7\x19\x4c\xf9\x26\xc3\xe6\x2d\xc5\x86\x0d\x5b\x68\x80\x87"
+ "\x86\x74\x42\x64\xc2\x4f\xe5\xdb\x9e\x19\x29\x7f\xc3\xee\xdd\x6e"
+ "\x1e\x26\x64\xfa\xc8\xac\x5e\x8f\x79\x78\x28\x4f\x8e\xc4\x88\xb6"
+ "\xf2\x70\x36\xd2\xae\x11\xeb\xff\x22\xba\xf1\x1d\xcb\x7f\xa8\x35"
+ "\x54\x77\x8f\x3c\x2d\xc1\x1e\x94\x61\xb9\x5c\x4c\xbb\x34\x10\x77"
+ "\x44\x92\xc7\x3a\xb1\x4e\x99\xef\x7b\x53\xc7\xe7\xf0\x1f\xb6\x0f"
+ "\x99\x86\xf6\xfa\xda\x09\xb9\x57\xe0\xf0\x3b\xcc\x76\xc8\x2d\xc9"
+ "\x90\xd6\x5f\xbe\xcb\x2c\xc9\x0f\xca\xc4\x11\x18\x2c\x3f\x47\xb2"
+ "\x48\x7e\x98\x27\x53\xcb\xe7\x7b\xf8\xbc\x68\xe7\xf0\x1d\xdb\x67"
+ "\x27\x1c\x36\x51\x39\xdc\xdb\x33\xb5\xa5\xc7\xf8\xfe\x7b\x5f\xd0"
+ "\xb7\x53\x3a\x9f\x06\x65\x65\x84\x38\x47\xf3\x48\x86\x5c\x47\x32"
+ "\x7c\x78\x1d\xe6\xf2\x12\x2a\x63\x82\x9f\xff\xc8\x65\x0c\xfd\x03"
+ "\xa4\x49\x2d\xef\xf3\x47\x6d\x08\xd2\xd6\x52\xbc\x8b\x31\xcc\xa3"
+ "\x29\x48\x0e\xae\x84\x93\x03\xac\xdb\xdc\x82\x2d\xb9\x1b\x51\xd1"
+ "\x0b\xf3\x8a\x73\xcd\xb4\xb7\x05\xd9\x01\xbe\x71\xc6\x0c\x93\x61"
+ "\x6b\x51\x5e\xee\x48\x08\x07\x35\x10\x19\x5c\xff\x3a\x3f\xca\x6b"
+ "\x6f\x6f\x66\x24\xad\xb1\x10\x6b\x2a\x2a\x76\xf5\x16\x61\x5f\x24"
+ "\xa4\xde\x2b\x9e\x73\xe8\x13\xd1\xa7\x4b\xe4\x7b\xc7\x11\xcf\xc4"
+ "\x3c\x81\x8a\x9f\x11\x1f\x7a\xd5\x2a\x6c\x4f\xca\x8b\x65\x19\xc0"
+ "\xe7\x32\x2c\x93\x39\x30\x47\xa3\xe2\x74\xaf\x3a\xf2\x02\xd9\x1f"
+ "\x31\x1f\xe4\x12\xda\x81\xe8\xba\x4e\x28\xe7\x73\xc1\x6a\x79\x7b"
+ "\x54\x7e\x5a\x4e\x73\x78\x60\x9d\x73\x45\xbc\x2c\x27\x41\x69\xde"
+ "\xa6\x30\xbe\xd7\x91\xed\xc8\x39\xaa\x73\x26\xea\x5e\x23\xc3\x21"
+ "\x5f\x59\x1d\xb7\x23\x15\x5a\xa5\x6d\xf8\x40\x47\xdf\xc4\x05\x3d"
+ "\x5c\xfe\x74\xbb\x52\xf8\xbe\x29\xe8\xeb\x75\x42\xc5\x18\x69\x7e"
+ "\x0a\x1f\x53\x74\x58\x11\x97\x57\xe0\xc2\xbc\xae\xcb\x79\xb1\x98"
+ "\x5d\x74\x9e\x29\xca\x59\x85\x39\x30\x66\x58\x11\x47\x7d\x65\xd6"
+ "\x9b\x39\xcc\x09\xe5\x19\x5c\xb6\xf0\xb9\x78\xbc\xd8\xc3\x8d\xe4"
+ "\x8d\xca\x49\x72\x15\x90\xa9\x8a\x93\x72\x7d\x53\x99\x31\x5d\x96"
+ "\x81\xef\xf3\x5b\x61\x97\x79\x39\xd4\x5e\x33\x5c\x6f\x75\x48\x8b"
+ "\x47\xe8\x2e\xef\xe7\x89\xfd\x85\x68\x9d\x4b\x04\xd2\x68\xbe\x08"
+ "\x95\xff\x46\x73\xf7\xa3\xbd\xd4\x6f\xda\x65\xa6\xbd\x13\x44\x5b"
+ "\x56\x69\x40\x19\x8e\x0b\xac\x4d\xaf\x44\xff\xaf\x3c\x4e\xd4\x5d"
+ "\x65\x72\x90\xee\xb9\xa4\xf9\x00\xc3\x89\x47\x64\xcf\x1c\xd6\x45"
+ "\x5c\x5f\xc5\xba\xdf\x4a\xb3\x9c\x8e\xef\x33\x80\xb2\x41\xf3\x60"
+ "\xaf\x40\xe5\x01\x6a\x23\x88\x3e\x27\x54\x6a\x29\x7f\x2a\x1f\xb5"
+ "\xd9\x5c\x6e\xf4\x74\x06\x4a\x65\x83\x82\x86\xd3\x32\x2e\x09\x77"
+ "\x8b\xfc\x4e\xfb\x8e\x39\xa1\x2a\x9d\xce\x81\x6c\x76\xf3\x32\xdc"
+ "\xd6\x82\xbd\x82\x16\x37\x87\xeb\x91\x79\x88\xe1\x65\xf8\x8e\x75"
+ "\x71\x10\xc4\x37\xa1\x46\xb3\xb0\x45\x55\x74\x86\x29\x2b\x35\xd0"
+ "\xbe\x84\xc9\xc2\xde\xf0\xbd\x74\x78\xdc\x08\x49\x67\x47\xd0\x1a"
+ "\x21\x3e\x2f\xc6\xed\xe3\xb6\x41\xec\xbd\x80\xf1\xa8\x23\x1e\x3a"
+ "\xd3\xa5\xcf\x3c\x42\xd0\xf6\x4a\xf6\x40\x1e\x74\x3e\x25\xff\x06"
+ "\xf9\x4a\xba\xd8\xcb\x64\x38\xf6\xf5\x5e\x29\x93\xeb\x6f\xdf\x51"
+ "\x0c\xa3\xf3\x53\xd5\xa0\x6d\xe1\x7b\x85\xbd\x52\x23\xd3\x2b\xc5"
+ "\xa9\xb9\x3c\x70\x1e\xbc\x32\xa0\xff\xbd\xfc\xac\xcf\x57\x5a\xe5"
+ "\x7c\x38\x2c\xc2\x11\x7c\x4b\x02\x8f\xeb\x1a\xc0\x23\xf6\x50\xd1"
+ "\xf2\xf3\x9e\xeb\x29\xae\x0a\x02\xb6\xaa\x92\xef\x57\xcc\xe7\xad"
+ "\x61\x39\x5c\xcf\x9b\x47\xf0\x3a\x30\x00\x9d\x0f\x42\xe7\x08\xab"
+ "\x85\x2c\x56\xcd\x95\xd3\x44\xa8\x88\x8f\x55\xa9\x72\xde\x32\x0e"
+ "\xa2\xff\xa6\x36\x4f\x94\x45\x43\x3a\x22\x9d\xd9\xc9\xed\x85\xf0"
+ "\xb5\xaa\xda\xb8\x0c\xf2\x72\x56\xd5\x07\xd7\xb5\xf0\xe5\xaa\x4e"
+ "\x07\xc9\x03\xd1\x33\x50\xff\x58\xf7\x6e\xd1\x96\x54\x75\x04\xd1"
+ "\x98\x82\xef\xdd\x81\x7a\xe0\x75\x44\x67\x40\x85\x3d\xef\x91\xeb"
+ "\x0a\xc2\xf8\x19\xa7\x93\xea\x03\xfb\x62\x49\xd0\x42\x3e\x21\xea"
+ "\x0a\xf2\x04\x69\x7c\x75\x13\xc9\x95\xc7\xf6\x6a\x4a\xa8\x6c\xbe"
+ "\x9a\x1e\x44\xaf\x8a\xec\x3a\x86\x99\x64\x18\x27\xbc\xca\xd7\x32"
+ "\xc9\xfc\xc4\xb8\xb2\x81\x7a\xbc\x8f\xc3\x96\xcb\x74\xde\xa2\xcd"
+ "\x90\x78\xf5\xea\xc7\x52\x1e\xad\x72\x1e\xf8\x8c\xfd\x9f\xaa\x2c"
+ "\x25\x8e\x75\x3b\x8a\xf3\xc4\xe6\x46\xd4\xc8\xe7\xe4\x6e\xcc\x33"
+ "\xcd\x34\xe4\xac\xa7\x6d\x90\x8a\x0a\xf2\xf2\x2c\xfc\x23\x4e\xa8"
+ "\x1f\x18\xc7\xf3\x43\x3e\x88\x3d\xa7\x5f\x7b\xec\x15\x31\x7f\x85"
+ "\xf4\x82\xf4\xdd\x45\xfa\xde\x5c\xf2\x25\xef\xdb\x38\xca\xee\x03"
+ "\x87\x97\x95\x91\xff\xcf\x6d\x1f\x95\x5f\xef\x16\xed\x00\xd6\x27"
+ "\xb5\x91\x1e\xdb\x51\x4b\x28\xbf\x8e\x96\x85\xea\xf2\xd1\xf2\xf0"
+ "\x76\xe2\xe8\xbd\xdc\x4e\x94\x0b\xb9\x20\xfb\x44\x73\xff\x09\x2f"
+ "\xa6\x69\x51\xe0\x3c\x1f\xb0\x51\x47\x9d\xb2\x8d\x12\xed\xc4\x6b"
+ "\x1a\x6c\x83\xca\xa5\xbc\x7c\x01\xb9\x79\xad\x44\xc8\xcd\x6b\xd8"
+ "\xff\xfb\xc7\x7d\x72\x5f\x47\xb4\x1d\xaf\x3a\xc9\x7f\x14\xe7\x6b"
+ "\xbf\x96\x28\xe3\xab\x8a\xa5\x76\xe3\xb5\x94\xc1\xfe\xc3\xd1\x1e"
+ "\xf2\x1f\x68\x5e\x22\xf1\x82\x9f\x27\xcc\xf5\xe6\xb5\x82\x20\xfb"
+ "\xa3\xc3\xf7\x92\x70\x75\xbd\x8e\x9a\xe3\x59\xf4\xb9\x6d\x56\xee"
+ "\xe6\xe2\xf9\xb4\x45\x55\x9e\xd5\x92\x97\x5b\x9c\x67\x52\x7e\x67"
+ "\x33\xca\xbe\x18\x7d\xe3\xae\x42\xbd\x77\xc5\x10\x3f\x5e\xc3\xf2"
+ "\x1f\xf3\xc9\x65\xe0\x76\x0a\x7d\x47\xc9\xc6\x45\x5d\x84\x63\x1f"
+ "\x8b\xb3\xc4\x5f\xf3\xc9\x72\x42\x70\x0b\xad\xcc\xef\xb1\x55\x63"
+ "\xf9\x8f\x6a\xa5\xfe\x16\xf6\x69\xab\x0d\xf2\x7b\x20\x7d\x75\x1e"
+ "\x6f\xfb\x8e\xf2\x39\x7d\xc8\xd3\xea\xae\x20\x7f\x8b\xde\xcf\x48"
+ "\xef\x7c\x1f\x26\x71\x2e\x7a\xf5\x0e\xc1\xdf\x6a\xac\xff\x57\x25"
+ "\x5b\x71\xac\x55\xe0\x01\x78\x6b\xb7\x2b\xb2\x8e\x8f\xef\x57\x97"
+ "\xcb\xf9\x61\xfa\x0b\xc1\x79\x52\xbb\xa5\xc4\xe7\x84\x6a\xbe\x3e"
+ "\x64\x2f\xdf\x43\xae\xfa\x6c\x18\x5a\xd3\x83\xe1\x10\x06\xfb\xbf"
+ "\xaf\xd6\xc8\x65\x5e\x65\xa5\xb0\x63\x9a\x9b\x94\xb1\x47\x94\xf1"
+ "\x58\x19\xc9\x16\xe5\x4f\xf2\x2f\xd1\x60\x92\xf6\x25\x71\xd2\xf9"
+ "\x8d\x44\x3f\xdf\x1f\x4d\x4f\x7a\x7d\x0c\xfb\xbf\x15\x67\xe5\x72"
+ "\x50\x19\x4f\xef\x76\x69\xe4\x7d\xa9\x44\xfa\x63\xf3\x43\x69\x3b"
+ "\x76\x30\x28\x4d\xb7\x7d\x1a\x8d\xdd\x1f\x9b\xc1\x6c\xaf\x1d\x20"
+ "\x39\xa4\xfd\xaa\xaa\x06\xe4\xf0\x58\xd3\x60\xb9\x3b\x96\x40\x72"
+ "\x17\x2c\x4b\xf9\xf7\xe5\xa2\x24\x15\xe5\x15\xcf\xe3\xde\x3d\x3a"
+ "\x76\xb4\xed\x59\x4e\x71\xfe\x96\xcd\x45\x33\x0d\x45\xa6\x1c\x49"
+ "\xe9\x43\x74\xde\xc6\xfb\xfe\x6e\x59\xcf\x3c\xb6\xd7\x13\x02\xb6"
+ "\xe5\xf5\x80\xfc\xd3\x1c\xad\x69\x34\x36\xfb\xfa\x0e\xa1\x4f\xaf"
+ "\x2f\x0d\xd2\x5d\x9e\x9e\x74\xb4\x8e\xfb\x6c\xaf\x07\xb7\xff\x6e"
+ "\xe4\xe9\x88\x2b\xf0\xfa\x18\x89\xa7\x6e\xc1\xe3\xd7\x7f\xc5\xcb"
+ "\xc9\xf7\xe3\x3a\x76\x9e\xca\xc9\xf7\x7f\xe1\xfe\xd9\xeb\x27\xe5"
+ "\xf2\x06\xfa\x0d\xaf\xdb\xb9\x1f\x25\xf9\x6b\xb7\xea\xd7\x0b\xff"
+ "\xf4\x8d\x2c\x69\xec\xad\x43\xee\xe3\xc9\xfe\x35\xd2\x62\x12\xbe"
+ "\xea\x1b\x63\x56\x94\xb0\xbe\xb5\x56\xda\xa7\x8e\xea\xe0\x8d\x87"
+ "\x64\xdf\x92\xcf\xdf\xab\xd8\x95\xe6\xb1\xbd\x91\x14\x6c\x27\x58"
+ "\xc4\xc6\x0e\xc9\x47\x4c\x13\x7d\xd7\xdb\x7e\xde\x89\x79\xd1\xb7"
+ "\x87\x9b\xd0\x86\xe5\x7a\x03\xed\xdf\xbb\xa7\x09\x0f\xf9\xd7\xac"
+ "\x57\x2f\x9d\x55\x59\xc3\xbf\xe1\xd5\x22\x6e\x17\xd6\x2d\xc2\xa1"
+ "\xff\xf7\x3a\x97\x0d\x3f\xca\x28\xcd\xdd\x71\xcb\x3e\x12\xbc\xf1"
+ "\x29\xb5\x45\xf8\x8c\x72\x5b\x63\x14\x32\x55\x63\x74\x15\x19\xa1"
+ "\xb7\x57\xaf\xee\x2d\xca\xd4\xd0\x78\x01\xf1\xc2\x51\xe3\x05\x21"
+ "\x3f\x6f\x78\xd1\xe6\x9d\x0c\xc6\x27\xe1\x22\x9e\x6a\x88\x0e\x56"
+ "\xa4\x57\x93\x7c\x93\xbc\xb2\x5e\x23\xfa\x09\x6f\xd8\x59\x91\x51"
+ "\x3d\xc4\xde\x5b\x37\x2b\x67\x14\x9d\xf7\x48\x67\x80\x92\xbd\x12"
+ "\xfb\xfb\x1f\xdf\xff\x8a\x18\x1b\x90\xf2\xad\x79\x89\xa9\x4f\xf0"
+ "\x76\xe5\x30\x6f\x57\x18\x88\xfd\xd2\x6b\x4e\xf2\x79\xb4\x96\x13"
+ "\xfc\xcc\x57\x69\x7d\xb6\xab\xc5\xe2\xe3\x67\xd5\x95\x16\x93\x9f"
+ "\xe6\xa3\xef\x46\x7c\xfd\x71\x73\xb1\x0f\x56\x79\x49\x26\x6b\x3a"
+ "\x68\xaf\x78\x71\x16\x78\x4d\x97\xbc\x3f\x3c\x9d\x21\x49\xe7\x9f"
+ "\x62\xb9\x22\x02\xe7\x97\x1e\x3f\x43\xe3\xb6\xa2\x3f\xae\x87\xc3"
+ "\xe8\xd3\x8b\x3a\x38\x3e\x8b\xce\xe2\x13\x7d\x85\x4e\xac\x97\x88"
+ "\xbf\x20\xec\x22\xf1\x0d\x59\xb6\x13\xc7\xdf\xa3\xb9\xe9\x4e\x09"
+ "\x87\xc7\x76\x1c\xdb\xff\x37\xcc\x22\x2f\xc4\xe7\x91\xeb\xf3\xf8"
+ "\xac\xc1\xe3\x1b\x01\x7c\x98\x7e\xa6\xe4\x17\x80\x18\xfb\xfa\x80"
+ "\x70\xd5\xc8\x63\x5f\x01\xdf\xe7\x78\xa3\x3c\xf6\x25\xf6\x9e\xae"
+ "\x29\xa6\xfc\x87\x1a\x23\x62\xa5\x4f\x92\xdc\x6b\xc9\x87\x1b\xd2"
+ "\x9f\xc0\xf6\x9d\x68\x97\xfd\x42\x51\x3f\xb5\x4b\xc8\x3f\xa4\x33"
+ "\x57\x65\x5f\x52\xf8\x00\xb5\x19\xa2\x2d\xab\x4d\x92\xdb\x32\x4c"
+ "\x7b\x5a\xb2\x15\x52\x3b\x57\x3b\xd0\xff\x0d\x3f\x2f\xbf\xb6\x58"
+ "\xe6\x91\xcc\x73\xc1\xa3\xda\xb6\xde\xd8\xc2\xf2\x00\x6f\x6b\xdb"
+ "\x38\xaf\x07\xe2\xeb\x22\x83\x78\x4f\xef\x1a\x61\x37\x6b\xb1\xfd"
+ "\xaf\x99\x2b\xda\x14\x11\xc6\x62\x1b\x37\xf2\x73\xdb\x39\x0f\xf2"
+ "\xf9\xd8\x8c\xab\xd4\x48\xb4\xb9\x9c\xaa\x44\x83\xb0\x65\xb5\x08"
+ "\x7f\x5c\xea\x93\xd5\x56\x13\x2d\xc1\xf4\xae\xde\xbc\x71\xf3\x96"
+ "\xed\x9b\x69\x40\x6d\x6b\x91\x21\x77\x8b\x29\x6f\x64\x98\xf1\x10"
+ "\x3d\x9d\x6b\xed\xae\x1a\xd8\x77\xea\x4d\x2d\xcd\xa3\x17\x67\x16"
+ "\xbc\x39\xc2\x70\x07\xc9\x57\xdd\x26\x1a\x2b\xe0\x67\x47\xd0\x1e"
+ "\xab\x62\xdc\xa0\x9b\xd2\x0b\x5e\x9f\xb8\xd6\xbb\xdd\x2c\xf9\x58"
+ "\x27\x7e\x4a\x7c\x94\xfa\x1c\x0c\xcb\xf8\x85\xdc\x0e\x11\x7d\xdc"
+ "\x37\xef\x33\x72\xbb\xe8\xef\x33\x6b\x38\xbf\xfa\x8c\xd8\xde\xd4"
+ "\xb5\x3a\x55\xb3\x7d\xa2\x5c\x75\xe7\x65\x7e\x50\xf9\x3d\x74\xd6"
+ "\x26\xcb\x47\x19\x7d\x53\x2b\xe1\x22\xfb\x49\xb8\x6b\xe4\x79\xdc"
+ "\xb4\x97\xa8\x7d\x1b\xed\x23\x5c\xff\xa9\xbf\x82\xec\x4d\xbd\x5e"
+ "\xb6\x4b\xd4\x16\xf9\x11\xcf\xbb\xd7\x5d\x91\xa8\x37\x0f\x61\xda"
+ "\xb1\x9d\x70\xc2\x24\xce\x1b\xa8\x4f\x0d\x3d\x6f\xe0\x84\x01\x2f"
+ "\x93\x74\xed\x0b\x7a\xbe\xd9\x25\xa7\x49\x0f\x84\xd5\xd7\x2b\x60"
+ "\xf6\x21\x4d\xa7\x06\xfc\x15\xb1\x9f\xa9\xb4\xff\x31\x9d\x9d\x51"
+ "\xff\x05\xed\x19\x1a\x90\x8d\xfa\x51\x92\x0f\xd2\x4d\xbc\xa3\xf6"
+ "\xb6\x0b\x4e\x88\xbd\x4c\x2a\x51\x36\x58\x26\x50\x99\x98\x27\x1f"
+ "\x65\xe2\x84\x26\x20\x07\x82\x47\x18\xa6\x0f\xf8\x29\xf5\x3d\x94"
+ "\x26\x98\x0f\x98\xc7\x43\xa2\x6f\x7a\x22\x45\x6e\xb3\x69\xbf\x54"
+ "\x71\xfe\x44\xfd\xa9\xd3\xbb\xbb\xb1\xcf\x7f\x22\x2b\x08\xc7\x29"
+ "\x69\x2c\x42\xc3\xd4\x75\xba\x3a\xde\x67\x3b\x51\x12\x18\x13\xa8"
+ "\x3f\x45\x76\x97\xe3\x88\x6d\xb4\x38\xdc\xfc\xcc\x68\x95\x7c\x46"
+ "\x3c\xc2\x9e\x94\x7d\x14\x19\x57\x8b\x18\x73\xe2\x7b\x5c\xa2\x0e"
+ "\x96\x23\xcc\xd9\x81\xf1\x58\x0c\x1b\xe8\x03\x5a\x51\x8f\xb9\xef"
+ "\x7d\xa2\x27\xd0\xd7\xab\xe3\xfb\x0a\xf0\x7e\xa0\xc0\xa3\x75\xc2"
+ "\x09\xa7\xb2\xdf\x86\xfe\x83\x21\x7f\x73\x3e\xba\x0f\x1b\x2c\x5b"
+ "\xe6\x63\xd7\x61\x83\x25\x7f\x3e\x4d\xf9\x5a\x96\xba\x84\xdf\x51"
+ "\x39\xe6\x87\x19\x3f\xa6\x71\x6f\x7e\x2e\x33\x8d\x19\x61\x3f\x97"
+ "\xc6\x4e\x3d\xe2\xac\xd4\xe1\xd2\x5d\x2b\xdd\x87\x61\xbb\x67\x41"
+ "\x5d\x39\x44\x67\xdf\x20\xff\xeb\xfd\x36\x71\xce\xab\xd4\x66\xa3"
+ "\x2d\x7f\x73\xbf\xfc\xbd\x8c\xcf\x81\xa7\x7d\x0c\x7b\xcd\x7c\x3c"
+ "\xce\x63\x7b\x73\x60\xfc\x43\x8c\x2f\x8a\x6f\x6e\x18\xde\x21\x87"
+ "\xcb\xe3\xb1\x18\xd6\x23\x8f\xbd\x0a\xd8\x37\x7d\x81\xb4\x21\x63"
+ "\xdb\x71\xf2\xf7\x38\x8f\xed\x2d\x83\xcc\x33\x19\x4f\xa9\x81\x5d"
+ "\x91\xfc\xa4\x08\xee\x57\xdb\xde\x8c\xe3\x7b\x87\x92\x2f\xce\xc7"
+ "\x99\xdf\xca\x90\xf3\xa1\x3e\x02\xd1\x2d\x7d\xfb\xe1\x7a\x4f\x7b"
+ "\x84\x8a\x3d\x46\xdf\x1a\xa8\x7f\x05\xcf\x8d\xdf\xbb\x8b\x8f\xcb"
+ "\x1b\x8b\xd0\x3f\xbb\x4b\x31\x0e\x47\x32\x34\xa7\x0a\x46\xf0\x31"
+ "\x26\xd1\x4f\x8f\x24\x1f\x01\xcb\x70\x02\xeb\x33\x82\x6c\xb9\x68"
+ "\xf7\xde\xba\x30\xd0\xc6\xeb\x1a\xcd\x2c\xb6\xf0\x20\xed\x33\x2f"
+ "\xd6\x2d\xbc\xf5\x15\xc9\x9b\x6b\xdc\x46\x0f\xa3\x39\xca\xaf\xad"
+ "\xf1\x88\x71\xf8\x86\xfb\x03\x63\x66\x6f\x1d\x90\xf6\x44\xa5\xf9"
+ "\x6f\x58\x5f\x0d\x33\x07\x7c\x4e\x84\xe7\xbe\x17\xe2\xa4\x35\x0a"
+ "\x94\xff\x37\xf8\xce\x83\xfd\xfe\xff\xad\x15\x7a\xda\x60\xe7\x38"
+ "\xd0\x56\x8b\x75\x00\x0d\xe8\xff\xbf\x55\x23\xda\x06\xc2\x9d\x09"
+ "\xbd\xb1\x9f\xba\x7a\x6d\x9f\xcc\x24\x1e\xba\x63\xaf\x24\x8a\x3d"
+ "\x88\x1b\x7e\xe5\xb6\x69\xb0\x4e\x1b\xb0\xfe\xff\x61\x50\x5f\x57"
+ "\xce\xab\x6f\x1b\x6b\xf1\x5d\x67\x4d\x87\x7f\x8f\x76\x6e\x3d\x80"
+ "\x6f\x1b\x6b\xec\xbb\xce\x4e\xf3\x33\xc8\xd7\x01\x1c\xfa\x13\x40"
+ "\x7f\xc4\x9a\x2f\x6e\xa0\xac\x2e\xbf\xe6\xbf\x42\xe7\x05\xd6\x21"
+ "\xdc\x72\xf7\x55\x56\x8b\x69\x96\x5b\xd8\x95\x5a\x84\x5b\x76\xf9"
+ "\x0a\x3b\x8e\xb0\xcb\xcc\x28\x2b\xdb\x98\xaf\x3f\x62\xe3\x17\x86"
+ "\xc7\xc9\x76\xbf\x9d\xea\xaa\xd8\x51\xc3\x6c\xea\x23\x6c\xef\x3d"
+ "\x77\x7b\x6c\x6f\xa7\x0f\x9c\x53\x86\x78\x49\xae\x56\x58\xe9\x79"
+ "\xe3\x17\x28\x07\x5f\xac\x45\xbf\x03\xe5\xf6\x0b\x84\xa3\xef\x3f"
+ "\x7c\x6d\x96\x2b\xe2\xee\x58\xbc\x8c\x61\xe9\xbf\xce\x5a\xfa\xb7"
+ "\xb1\xa6\x23\xcf\x20\xfd\x97\x90\xfe\xeb\xac\x11\xcb\x70\xfa\xf0"
+ "\x45\x00\xa2\xbf\x9f\x70\xf6\x43\xc4\xda\x1d\xaa\x98\x3a\x8c\x5f"
+ "\x6b\xd5\x41\x1d\xc2\x3e\xe3\x86\x98\x5a\x84\x79\xe6\xb9\x18\xe0"
+ "\xf4\xf7\x20\xdd\x31\x3b\x6a\xfa\x31\x6f\xa2\x1f\xf3\xf7\xca\x74"
+ "\xca\xf9\x13\xbd\xb2\xde\xae\xa5\x31\xc2\xd8\xc2\xf3\x44\xb7\xf8"
+ "\xee\xf1\x77\x39\xae\x22\xac\xe7\x88\x7b\xee\x16\x7d\xec\xbf\x4b"
+ "\x92\xe9\x0f\xfd\x0e\xf6\x77\x65\xc2\x7e\xfe\x1d\xf6\x7f\x1a\xa4"
+ "\x33\x5d\x44\x18\x95\xdf\x85\x7a\x2b\xad\xfd\xfb\x42\xe6\x19\xc6"
+ "\xcf\x54\x7e\xe7\x4a\xdf\x52\xc8\xc7\xa8\x73\x72\x8b\xf3\xb7\xe5"
+ "\x60\xcf\x77\x24\x58\x28\x88\xf7\x8d\xf3\x4c\x86\x2d\x9b\x0d\xeb"
+ "\x73\xf2\x0b\xb6\x6c\xcb\x2b\x9c\xc9\x87\x33\x8a\xf2\x36\x9b\x68"
+ "\xe8\xba\x30\xa7\xd0\x32\x52\xd1\x9f\x29\xdf\x51\xd3\x4e\x67\xd0"
+ "\xec\x26\xf9\x7e\xe7\x63\x69\xdc\xd6\xcb\x6c\x29\xbc\x5f\x2c\x6c"
+ "\xcc\x4f\xee\x37\xec\x4c\xa1\xf8\xf7\x44\x3b\xfe\x4e\x2b\xab\x2c"
+ "\xfc\x94\x31\x7e\xb6\xb6\xea\x0a\xbc\xf3\x33\xce\x8f\xde\x34\x19"
+ "\x0f\xef\xbb\x92\xcc\x5a\x76\x92\x1f\xf6\x93\x2c\x46\xf1\x21\xbc"
+ "\x78\xe7\x90\xf0\x45\x30\xbc\x2f\x0d\x02\xf3\xed\xdf\xf9\x98\xa9"
+ "\xb1\xec\xc8\x4b\xa9\xcf\x60\x95\xd6\x3d\xfe\xba\x13\xde\xa1\xbe"
+ "\x14\x7d\xb7\x39\xc7\x7d\x72\xbe\x3e\xeb\x9d\x7c\xec\x73\x58\x99"
+ "\x6d\x58\x14\xf1\xeb\xb0\xe8\xd3\xab\xa3\x55\x74\x76\x6e\x27\xad"
+ "\x15\x4d\xa4\xef\xbb\x75\x36\x7f\x62\x60\x7e\xd3\xdf\x1d\xa4\xfe"
+ "\x05\xff\xce\xc1\x6d\xd2\x4f\xba\x65\xdd\x55\xd3\xfa\x9b\xbd\x13"
+ "\xe6\x09\xfd\xfb\xc9\x65\x82\xc7\xfa\x9f\x27\xca\xc7\xcf\x01\x47"
+ "\xdf\xe0\x9d\x48\x2c\xff\xff\x66\xa5\x69\xd2\x37\xc9\x77\x22\xfd"
+ "\xb1\x5f\x26\xf6\x17\x61\xbf\x40\xf7\x65\x23\xc6\x5d\xf1\x57\x16"
+ "\xfe\xa9\x1f\x7d\x2a\x3f\xf6\x13\x58\xe5\x97\xff\xd2\x5f\x59\xd8"
+ "\xe1\xdf\x6e\x54\x53\xdb\x5a\x6a\x45\xfe\x6e\x31\x8f\x64\x57\xcd"
+ "\xb7\xf5\x6f\x37\xa2\xff\x55\xe8\x64\x0c\xd3\xc6\x16\xba\xf8\x79"
+ "\xc5\x95\x85\x9d\xd2\xfb\xff\x43\xdc\xfb\x80\x47\x59\x5c\xfb\xe3"
+ "\xf3\x6e\x96\x10\x31\x64\x37\x31\xe0\x0a\x41\x16\x0d\x36\xb5\xfc"
+ "\x89\x8a\x2d\x7a\xb1\x46\x81\x8a\xbd\x68\x52\x8b\xf7\xa6\xb7\xd8"
+ "\x04\x4d\x6c\xb0\x31\xac\xc9\x02\x9b\x18\x36\x7f\xe0\xa6\xb4\x85"
+ "\x64\xc1\xc0\x45\x09\x90\xf6\x62\x2f\x52\x84\x50\xb1\x8d\xbd\x28"
+ "\xab\x44\x1b\x35\x64\xa3\x45\x8c\x8a\x75\x89\x01\x23\x0d\x61\x25"
+ "\x0b\x59\x92\xdd\x77\xbe\x9f\x33\xf3\xbe\xd9\x0d\x26\xb4\xdc\x7b"
+ "\x9f\xdf\x2f\xcf\xb3\x79\xdf\x99\x77\xfe\x9e\x99\x39\x73\xce\x99"
+ "\x33\xe7\x9c\xa3\xb0\x0a\x3a\x19\x71\x01\x84\xfb\x55\x1e\x91\x7e"
+ "\x68\xda\x20\x85\x4d\x8a\xd0\xab\x4c\x05\x5f\x32\x87\xfa\xae\xf7"
+ "\x59\xf0\x67\x24\x23\x1a\xec\xdb\x0b\x4c\x8f\x27\xbe\x41\xd2\xf0"
+ "\xec\x31\xc0\x58\xda\xb2\x18\x4c\xb7\xeb\x23\x1d\x06\xd2\x3f\x77"
+ "\x21\xe8\xa7\x17\x9a\x55\xf2\x8d\xbe\x7a\xe2\xcd\xdc\xf0\xdb\x1d"
+ "\x84\xb3\xd2\x43\x02\x17\x32\x79\xee\xf4\xc2\x6c\x1d\x9e\x74\x8f"
+ "\x80\x70\x29\xc6\x2d\x25\xcb\xc7\xc6\x48\x3c\xf0\x42\x66\x04\x7f"
+ "\xd8\x4d\x63\xed\x65\xbb\x34\x3b\x5b\x31\xab\x65\xf8\xbf\x76\xc9"
+ "\xb5\xf2\xc2\x1a\x3d\x2d\xe2\xa4\xbd\x1f\x57\xd1\x81\x95\x41\x36"
+ "\xc1\xf6\x5d\x7e\x0a\x63\x94\xa9\xa5\xdb\x13\x5e\x53\x72\xbe\xe1"
+ "\x39\x9b\xf8\x6b\x3a\x7f\xa4\xf7\xed\x23\xdc\x85\x75\xd6\x71\x4e"
+ "\xfb\x15\xed\x9f\xd6\x09\x8c\xb5\xfa\x89\xb7\xda\x1d\x73\xb8\xce"
+ "\xcf\xc4\x38\x27\x14\x7e\xd0\xcb\xf3\x18\x68\xca\x61\x79\x09\xca"
+ "\x83\xf4\xf3\x04\x9f\x84\x75\xa1\x62\x5d\x20\xcf\x31\x9a\xd7\xce"
+ "\xf3\xc4\xbf\xec\x5e\xd3\x54\xda\x45\xb6\xfa\x31\x5f\x77\xaf\x21"
+ "\x18\xd2\x3a\xa8\xae\x14\xf7\x20\xc5\x3e\xe9\x5e\x31\x8b\xca\x78"
+ "\x2a\x2e\xc0\x8c\xad\xd8\x21\x30\x2e\x01\x9b\x93\xc5\x9f\x46\x7a"
+ "\xa3\x9d\xc5\x10\x0f\x3b\x74\x0f\x19\x7e\xff\xe8\x35\xaf\xda\xd5"
+ "\xbb\x71\x55\x79\x5f\xe5\xee\x83\xc0\xfd\x23\xda\x4f\x5c\x3d\x1e"
+ "\x74\x0d\xd2\xb9\x26\xd0\x59\xf5\xee\xae\xcb\xa5\xd5\xef\xe6\xd2"
+ "\x5c\x99\x69\x21\x79\xca\xaa\x5d\xe2\xcc\x3b\x61\x55\xb9\x94\x5b"
+ "\xfe\x2e\x45\xcf\x4f\x72\x4f\xd2\x2b\xa8\xe9\x67\x96\x9a\x41\x5e"
+ "\xf1\x77\x19\x72\x8c\x7e\x97\xa1\xf3\x17\xc3\xd5\x63\xdf\xc9\xd5"
+ "\xb2\xa9\xcc\xe0\xb1\xfa\xd8\x8c\x00\x8b\xdd\xfe\x1c\x63\xae\x12"
+ "\x1e\x78\xa6\x04\xf3\x08\x30\xe6\x86\xdd\xcd\xa4\x7f\xb1\x03\x7b"
+ "\x74\xb5\xca\x58\x14\xda\xf2\xcc\x05\xd4\xe9\x94\xe9\xb8\xb4\xab"
+ "\x66\x41\x3a\x3f\x9e\x89\xc0\x23\xac\xd6\xc9\x62\x6a\x55\x66\x74"
+ "\x39\x59\x12\xe2\x40\x57\xfc\xee\xa8\xce\x0b\x0c\x7b\x2e\xbc\x1d"
+ "\xf8\x11\xf5\x56\x38\x79\xf0\x0d\xf0\x77\x95\x2a\x0f\xfc\x23\x70"
+ "\xf7\xb2\x3d\xb3\x64\x1f\xf7\xcc\xd2\x79\x03\xbc\xa7\x0d\xbd\x63"
+ "\xbd\x27\xe5\xd2\x33\xe6\x47\x97\x2d\xb3\x67\x15\xe6\xd2\x23\x65"
+ "\xea\xf2\x6f\x5e\x4a\x2b\xc6\x4a\x7f\x54\x7b\x32\x69\x6d\x11\xfd"
+ "\x24\xef\x2a\xed\xd9\x12\x21\xef\x21\x99\xf3\xdd\x44\xf7\x91\xae"
+ "\x09\xbe\x1d\x78\x5d\x5c\x1d\x60\xca\x89\x18\x66\xb8\xb4\xbe\xc7"
+ "\x97\xd8\x97\xe4\xdf\x29\xd5\x1a\x86\xa9\xa7\x79\x68\x3d\x2f\x0e"
+ "\x9e\xff\x6a\xbc\xb9\x5f\xe0\xc7\x0d\xe7\xea\x79\xfc\x87\x69\x72"
+ "\xaf\x7b\x31\x59\xd7\x1d\x1c\xde\xa6\x4b\xd1\xc2\xd0\xc6\xfd\x6e"
+ "\x5a\x23\x65\xab\x98\xe1\xa5\x92\x76\x03\xf1\x25\x4e\xbc\x93\x2e"
+ "\x97\x90\x7f\x6b\xbe\x22\x5f\x3b\xd7\x8e\xbd\xf4\x45\x07\xdf\x50"
+ "\xb4\x10\x6b\xde\x36\x92\xfe\x56\xe4\x7d\x78\x79\x76\xff\xa2\xeb"
+ "\x32\xba\x5e\x22\xbd\xae\xa7\x31\x34\xdf\xde\x51\x72\xcc\x5e\xc4"
+ "\xfc\xdf\x5d\xaf\xcf\x5f\x3d\x4d\xcd\x78\xdd\x07\xe7\x8b\x23\xda"
+ "\x41\xe6\xae\x55\x0d\x72\x8e\xef\x9d\x2f\xce\xa8\x27\xb0\x9f\x77"
+ "\xb0\xbd\xf7\x18\x2d\xcc\x82\xf7\xff\xc2\xbb\x90\x61\xd0\xb7\x21"
+ "\xf3\x68\x52\x77\xbd\x11\x18\x07\x98\x47\xe1\xf2\x0f\x84\x9f\xfc"
+ "\x8b\xc2\xcf\xc0\x15\x71\x6b\x25\x0a\x23\x38\x3a\xda\xc8\x4c\x71"
+ "\xb1\x31\x93\xaf\x4f\xb2\xdc\xfd\xdd\x39\xb3\xcb\x9c\xa5\x0e\xae"
+ "\x06\x03\x26\x1e\xe9\x37\xf5\x58\xd7\xc3\xdf\x2c\x97\xf4\xc3\x86"
+ "\x63\xc3\x9e\xa9\xaf\xaf\xe4\x36\xe2\x69\xd5\x84\x1e\x73\xd9\x72"
+ "\x66\xd8\xd7\xef\x35\x10\x0f\x45\x34\x8c\x27\xf8\x29\x78\xf1\xbd"
+ "\xef\x1d\x42\x1c\xe0\xe5\xe0\xae\x1e\xb3\xbc\x93\xb4\x2f\x5e\xdd"
+ "\xd8\x63\x0e\x97\x6f\x64\x54\x3e\xf8\x74\xc3\x4e\x67\x97\xc1\x63"
+ "\xfc\x2e\xf3\x58\xfd\xec\x10\xde\x87\x1d\x2b\xd4\x49\x32\x61\x2a"
+ "\x03\x7b\xf0\xda\xb2\x8b\xd8\x9b\x1d\xe2\x7c\xc6\xd0\xc3\xf6\xdd"
+ "\xdf\x30\x42\x3e\x71\xc6\x9a\x50\xfc\x60\x5f\xe5\x3e\xe0\xff\x47"
+ "\x93\x35\x3e\x04\x7c\xd2\xbe\x5a\x7d\x3f\xc0\xf7\x07\xe4\x39\xd1"
+ "\xbe\x5d\x7a\x9a\x61\xc7\xe8\x97\xa4\xeb\xcc\xdd\x34\x0f\xf8\x85"
+ "\xae\x2e\xb2\xbd\x38\xc2\x5c\x99\x07\x1a\x25\x97\x70\xf3\xd8\x0a"
+ "\x73\x74\x5c\x45\xea\x93\x2d\xa0\x8d\xc6\x76\x8f\x63\x71\xfe\x47"
+ "\xa8\xcd\xa4\x6f\xdf\xb6\x0d\x3c\x27\x9d\x0f\x9b\x94\xd4\xa5\xa6"
+ "\x8a\xd4\x25\xa1\xca\x39\xb7\x11\x0d\x65\x72\xdc\xaf\x98\x82\xf7"
+ "\x28\xc1\xca\x59\xb7\xed\x90\xbe\x8a\xfc\xae\xf1\xbc\x1d\x79\x8e"
+ "\x23\x8f\x17\xbf\x4e\xe4\x6b\x39\xc5\x1a\x96\xe2\xd9\x6c\x52\xf8"
+ "\x0e\x13\x46\x72\x66\xb9\xf0\xdd\x4a\xfb\x73\x0b\x4f\x00\x6f\x37"
+ "\x20\x64\x70\xa3\xc2\x32\xb8\x86\x75\x18\xb7\xe8\x85\xff\xce\x0f"
+ "\xa1\xac\xe6\xd0\x05\xb5\x79\x7b\x0f\xe1\x43\xc1\x57\x1d\x05\x0e"
+ "\x38\x3a\xad\x96\x59\x34\x9d\x69\x43\x4b\xb0\x99\xf6\x61\xb2\x39"
+ "\xd0\x84\x3a\x0f\xe2\xd7\x68\x2d\x60\x51\x3d\xac\xe1\x53\x5d\xe7"
+ "\x4a\xd2\x75\xbf\x7f\x58\x93\x03\xb8\x67\x20\xff\xaa\x27\x69\x4e"
+ "\x74\x19\x82\x28\x1f\xbc\x76\xb3\x27\xaf\x59\xe8\xb0\xd1\x9d\x04"
+ "\x4a\x83\x3a\x52\x3c\x81\x66\xa6\x72\x8b\x01\xe1\x46\xba\x5f\xc0"
+ "\x91\xb6\xd5\xd1\xce\x5a\x6d\x01\xec\x9b\x2d\xe0\x3d\x53\x92\xd1"
+ "\x1e\x51\x1e\xbe\x1f\xdd\x87\xf1\xb5\x82\x67\x40\x79\x6d\xa4\x13"
+ "\x47\x77\xf7\x79\x51\xca\x4d\xc8\xdf\xc4\x07\x2c\x06\x2a\xbf\x87"
+ "\xed\x3f\xc9\x7b\x53\x52\x66\x76\x4b\x5f\xa6\x1d\x6c\xff\x41\xb4"
+ "\xf3\xf1\x88\x76\xce\x47\xfb\x8d\xd8\x2b\xdd\x28\xf3\x20\x5f\x81"
+ "\x3a\x3b\x51\xa7\xdf\x47\xfa\x9f\xc9\x7c\xa5\xc5\x48\x6d\x6e\xa5"
+ "\xf6\x3a\x42\x8c\xaf\x4c\x31\xd6\x9c\x63\x46\xac\x05\xf7\x0e\x3c"
+ "\xd1\xff\x03\xa0\xeb\x93\xfa\x2a\xf7\x0f\xda\x7f\x20\x3a\x12\x61"
+ "\xaf\x3e\x97\xd6\x23\x0d\xda\xd8\x88\x76\x1d\x1c\xdb\xcd\x48\xb6"
+ "\x30\x0a\xf3\x74\x14\xea\x1d\x8d\xb1\x6a\x04\xec\x5e\x07\xac\x0f"
+ "\x52\x9f\xd4\x0b\x6a\x97\x8a\xf2\x6a\x2e\xa0\x4d\x45\x16\x63\x6c"
+ "\x27\xf9\x79\xef\xe3\x80\xf7\xd1\x74\x47\x1f\x27\x7d\x71\xd2\xbd"
+ "\x46\x9e\x6d\xe8\xab\xd1\xcb\x7e\x5f\x4a\x7c\xfe\x29\xb6\x7f\x8d"
+ "\xf4\xc5\xba\x7f\xad\x76\x96\x7c\x54\xca\x77\x1b\x3e\x25\xd8\x53"
+ "\xbf\x62\x2b\xcc\x55\x9e\x2e\x1f\x8b\xed\x1c\x07\x9a\x65\x3f\xab"
+ "\x53\x89\x3e\xfd\xfd\x5a\xbd\x9d\x23\xac\xb1\x80\x07\xf8\x45\xbd"
+ "\xc0\xbb\x88\x7f\x91\x7a\x66\xbf\x3f\x98\xe5\x88\x4a\x03\xaf\x62"
+ "\x40\x3b\xe9\x1e\xd3\x78\xd0\x68\x77\x93\x1e\x22\xda\x87\x3d\xfb"
+ "\xf7\xc7\x2f\xe7\x03\x19\xf0\x01\x5d\xf0\x12\xda\xf0\x7b\x21\x4f"
+ "\x25\x1f\xb1\x52\xc6\xfa\x52\xa2\x6e\x87\x83\x5f\xe0\xa5\xb4\xf7"
+ "\xa2\xde\xf2\x35\x2b\x44\x1d\xe4\x17\xb7\xcb\x6e\xe5\x27\x9a\xac"
+ "\xbe\x11\x6d\x1d\x44\xe8\xcf\xf9\x34\x5f\x7b\x42\x97\x60\xa8\xfe"
+ "\xdc\x4b\xa5\x11\xf2\x1a\xd2\x27\x28\x27\x9d\x09\x69\x2f\xe9\x25"
+ "\xa1\x13\x98\xee\x90\x76\x61\x3c\x81\x6e\x8d\xef\x78\xe9\x6d\xe1"
+ "\x7f\x8b\x68\x5a\xa1\x73\x77\x5a\xd3\x93\x7b\x69\x09\xd5\xd1\x74"
+ "\x89\x8f\xef\xdc\x82\x25\x8f\xe6\xe7\x4a\x11\xe6\xf4\x27\xec\x4b"
+ "\x7e\x3a\x94\x37\x32\x0a\x5e\xbc\xf2\xa5\xa3\xf2\x4c\xe0\x40\x6c"
+ "\x04\x8f\x60\x1c\x94\xe9\x1a\xd8\x01\x29\xd7\x3d\x30\x6d\x38\xb9"
+ "\xee\xfd\x3f\x2d\x58\x56\x28\xea\x10\x2a\x85\xb9\xf2\x56\xe0\x18"
+ "\xf6\xf0\xbc\xfb\xe7\x4d\x2f\xca\xb5\x0b\xa7\x3a\x52\x88\xba\x24"
+ "\x27\xa7\x50\x53\x38\x5c\x4a\xb9\xe8\xcb\xe3\x2b\x45\x56\xdb\xcf"
+ "\xec\x52\x55\xb1\x28\x7f\xc9\x8a\x5c\xad\x88\xc8\xb6\x26\x11\xbe"
+ "\x6c\xaa\x13\xb2\xaa\x31\x52\x3f\xe2\xc0\xc1\x88\xf3\xd4\x48\xf9"
+ "\xcd\x75\xf8\x36\x78\xfe\x6f\xbb\x81\xe6\xca\xcb\x4b\x5b\xeb\x85"
+ "\x2d\x13\xe3\xe1\xdf\x10\x7c\x5f\x9e\x4f\x7e\x20\xb0\xb7\xb5\x91"
+ "\xdf\x62\x4d\xf7\x00\xf8\xfa\xe5\x29\xe0\xb5\x68\xef\x75\xa4\x87"
+ "\x54\x0e\x9c\x0a\x3e\xfd\x95\x44\x4d\x26\x12\xa3\x1a\x0e\xcc\x26"
+ "\xbd\xb1\xed\x42\x7e\xf7\xf2\x9c\xb0\xfc\xee\x15\xd2\xe9\x89\xc1"
+ "\x78\x77\x52\xdb\xa8\x9d\xf8\xbe\x38\x42\x67\xa7\xd3\x0b\x30\x52"
+ "\x39\xa4\x5b\x22\x7c\xb4\x80\x26\xd6\xec\x41\x18\x5a\x7f\x43\xfb"
+ "\xd0\x1f\xd7\x10\xce\x55\x5d\xab\x9a\xe5\x9a\xf9\xc3\x36\xbe\xb1"
+ "\x38\x7d\xa6\x9f\x25\x4a\x9c\xf1\x32\xf1\xe2\xd7\xa0\x8d\x4d\x88"
+ "\xcf\x00\xde\x19\x45\xb4\x91\x3c\xa3\x7a\xf9\x4b\x4d\x9e\x47\xf0"
+ "\x19\x15\xd1\x06\x6f\x58\xe6\xf7\x4a\xa2\x2f\x7e\x55\xf3\x1a\xa9"
+ "\x93\x23\xf4\x0f\xa4\x0e\xc8\x1f\x8c\x83\x32\x2e\xd4\xad\x9d\xb9"
+ "\x27\x9e\x42\x7a\xc0\xa2\x59\x3b\x07\xa7\xbe\x67\x50\xbf\xa5\x2e"
+ "\xe5\x1f\x86\xf0\x3f\xd2\x27\x46\x71\xba\x2a\xf5\x65\xa9\xed\xb9"
+ "\x82\x8e\x22\xf9\x62\x3f\xc1\xfb\x0f\xc5\xf8\x8e\xbd\xee\x0f\x36"
+ "\x2f\x7b\x69\xb0\x3d\xd4\x66\xbb\x03\xc4\x00\xf2\xd1\xde\x87\x36"
+ "\x8d\x46\x9a\xda\x70\x9b\xff\x20\xce\x46\x89\xa7\x94\x34\xc8\x1f"
+ "\x63\xa4\x9c\x77\x55\x7b\xc4\xb8\x19\x7b\xd8\x1f\xbe\x44\x5b\xdb"
+ "\x57\x4b\xdd\x97\x51\xba\x4e\x09\xca\x1a\xd2\xff\xb0\x0c\xf6\x40"
+ "\x81\x94\xc1\xfe\x91\x85\xc7\xf0\x0f\x4d\x34\xef\x49\x6f\x48\xd7"
+ "\x19\xa2\xf1\x94\xfe\x42\xfe\x98\xa2\x97\xa3\x26\xac\x6a\x24\x3e"
+ "\xb9\x5a\x9e\x7f\x63\x5c\xfe\xb8\x34\x4a\x39\x21\x68\xa9\x99\x01"
+ "\x56\x8f\xb8\x68\xc4\x3d\x42\xe9\xa8\x4e\x21\xab\x04\x6c\xa8\x2f"
+ "\x2a\x78\xac\x28\x4b\x74\x3a\xca\xc3\xbc\xda\x73\x34\x3c\x37\xfe"
+ "\x98\x26\xf0\xa5\x06\x6b\x5e\x79\x60\x75\x98\x77\xff\xe3\xce\x41"
+ "\xb9\x1b\xca\x09\xef\x19\x7f\x7c\x9b\x60\x5c\x33\x28\x83\x68\x0c"
+ "\x8a\x76\xc8\xf3\xd4\x37\x4e\xb1\xc6\x33\x1c\xf4\x05\xed\xb5\xc4"
+ "\x1f\xd2\xd8\x0b\x7a\x4f\xc8\xcf\x1a\x9f\xdf\x2e\xcf\x2c\x36\xe3"
+ "\xfd\x05\xd5\x30\xdc\xdc\x69\x4c\x8a\xd4\xef\x95\xf0\x6f\xcc\x51"
+ "\xa9\x4c\xf4\x9f\xca\xc2\xfe\xa3\xe8\x72\x4d\xad\xdc\x87\x51\xe6"
+ "\x7f\x9c\xd2\x60\x2d\xce\xf2\x36\x6a\x70\xa0\x31\x16\x30\x6f\xb4"
+ "\x63\x0e\x08\x9f\x69\x65\xf5\xfc\xcc\x32\x94\x21\x7d\xeb\x36\xd6"
+ "\x72\x82\xad\x96\xde\x47\xfc\x37\xda\x2e\xef\x44\x62\x2e\x82\x37"
+ "\xa5\x76\xaa\x1b\x57\xb9\xa9\xed\x74\x8e\x17\x96\xa9\x34\xbe\x4d"
+ "\x79\x7d\x4f\xcb\x3c\x35\xf2\x9c\x11\x63\xd3\xa8\xf0\x95\x79\x4c"
+ "\x3b\xdf\xc2\x3c\xff\x43\x1b\xcd\x7b\x2a\xc7\x2f\x78\xe6\x46\xaf"
+ "\x0a\xb8\x60\x4c\x12\xfa\x2a\x5f\x89\xd5\xc7\x04\xe3\xd1\x7c\x19"
+ "\x7a\x1b\x63\xf2\xca\x6c\xdd\xb6\x12\xed\x4d\x58\xc3\xe5\x92\x96"
+ "\x7c\xe5\xa2\xa9\xe2\x6e\x6e\x0a\xde\x76\x1b\xd1\x46\x3b\x0c\x42"
+ "\x16\xaa\xeb\xaf\x4e\x06\x9c\xce\xea\x77\x01\xd4\xd5\x3f\x6e\x27"
+ "\xdd\x5f\x4f\x40\xea\xfe\x52\xfc\x83\x7e\xae\xb6\xfa\x43\x74\x17"
+ "\xa6\x1d\x75\xd4\xe9\x7c\x16\xe1\xb7\xa8\x0a\x05\xb0\x7b\x85\xee"
+ "\x3f\x1e\xd4\xf0\xda\xe8\xd3\xec\x95\x8f\xb4\xf2\x23\xdb\xb0\x48"
+ "\x9e\x29\xbe\x12\x90\xb4\xff\x2b\x84\x7b\x6a\x25\xbf\xf6\x8a\x4f"
+ "\x6f\x37\xbe\x1f\xbc\xb4\x8f\x19\x73\xef\xcf\xb5\xe6\x13\x8a\x4e"
+ "\xbd\xd5\x61\x4d\x99\x9a\x33\x53\x28\x8b\x5b\xbf\x37\xf7\x4e\x6b"
+ "\xc6\x5d\x53\x1d\x79\xd3\x1e\x94\x8f\xb9\x19\x0b\xe9\x79\x89\xee"
+ "\x80\xb5\xaf\xf2\x4f\x19\x43\xf9\xc1\x43\x5a\x1b\xfe\x94\xe7\x55"
+ "\xbe\x2f\x7c\x30\x71\x73\xd1\x5a\xee\x5a\xd2\x8c\x3d\xb5\x9b\xe8"
+ "\xe4\xf4\xd0\x67\x9c\x6f\x58\xd2\xcc\xe3\x8b\xd6\xfa\xe2\x8f\x75"
+ "\xe1\xd7\xe0\x8b\x2f\xb6\xd7\x00\x07\x9a\x2a\x78\xc0\x14\x1c\x2d"
+ "\x71\x25\xc2\xa0\x49\xba\x40\xf7\xd0\x58\xb2\xf9\xdf\x2c\xe3\xe9"
+ "\x21\xee\x01\xfd\x03\xb8\xfc\xa9\x59\xdf\xc7\x85\x1c\xd3\x55\xb4"
+ "\x36\xdd\xc1\x07\x68\xee\x80\x3e\xa0\xfb\xb4\x6b\x49\x96\x89\x74"
+ "\xe8\xff\xbe\x54\x09\x8b\x3f\x11\x0c\xac\x1a\x7c\x33\xfa\x2a\xff"
+ "\x1b\xe3\x9f\x2e\x64\xcf\x6a\xa5\x45\xec\x15\xea\xea\x9b\x1f\x02"
+ "\x2f\xd0\xa0\x97\x89\xb2\x62\x35\x7f\xcc\xa2\x3c\x16\x61\x9b\xe0"
+ "\x72\x3f\x75\xa3\xbd\x8e\xe4\x56\x74\x2f\xd8\xe4\x50\xc8\xff\x56"
+ "\xe6\xa0\xac\x0e\xdf\xe2\x2a\xcc\x24\xbf\xcb\x8c\xf3\x2b\xe5\x94"
+ "\x26\x2c\xd3\x52\xbd\x35\x06\x35\x00\x7a\xc2\x4c\xf3\x43\xd0\xaa"
+ "\x42\x9f\xe2\xbf\x1b\x07\xcf\xe7\x86\x8c\xfd\x7f\x8b\xf9\x70\xae"
+ "\xd2\x88\xb9\xfd\xa7\xb4\x1b\x12\x25\xed\xa4\x56\x2a\x4c\xda\x8a"
+ "\xf8\xef\x17\xc5\xba\xd4\xe6\x23\xe0\xeb\xa3\xb3\x73\x53\x90\xfb"
+ "\xe8\x9e\x8a\x1a\x85\x39\xc9\x4e\x33\x4f\x69\x5f\x39\xdd\x57\x1f"
+ "\x9c\x97\x36\xcc\x4b\x1b\xe6\x25\xe9\x39\xa0\x7e\x5f\xd4\xcd\xd9"
+ "\x58\xb3\xca\x69\xf6\xdf\xa5\xd4\x7e\x82\x0d\xe8\xf7\x58\x15\xb0"
+ "\x12\xfa\xac\x04\x9f\x84\x15\x49\x74\xcf\x90\xfa\x6a\x0a\xa2\xcf"
+ "\x91\xfd\x32\xa8\xde\xea\x4a\xf4\xcb\x80\x7e\x39\xce\x08\x59\x10"
+ "\xdd\xff\x04\x2e\x19\x1f\xf6\xe1\x72\xb0\x2e\xb2\x8f\x2a\xf9\x7d"
+ "\x12\x7d\x38\xf8\xea\x70\x7d\xe4\x06\xea\x23\xc1\xe0\xe0\x06\xed"
+ "\x9c\x53\xb4\x93\xf0\x56\x37\x3b\x98\x11\x57\x41\xf7\x2e\x8b\xd6"
+ "\x82\xee\x9d\x4b\x63\xb8\xbd\x92\xbb\xa8\x9d\xc3\x8d\x17\x95\x27"
+ "\xcb\x7a\x75\xb1\xa9\xa2\x3c\xbb\xaf\xf2\xd5\x94\xe1\xe1\xfd\xea"
+ "\xfd\x97\x87\xf7\xab\x93\x28\x3f\xb5\x83\xee\x90\x9a\xc8\xc0\x18"
+ "\xe6\x37\xe8\x8a\x61\xeb\x8d\xab\xa8\xa7\x76\x0d\xfb\x0d\x73\xbf"
+ "\xbb\xa6\x70\xe8\x9a\x50\xb7\x07\x18\xc1\x8f\xe4\x45\x52\xae\xff"
+ "\x6a\xdb\xe0\xf9\x83\xab\xa8\xc1\xa4\x58\xa3\x68\x8d\x09\x9a\x18"
+ "\xfd\x1d\xae\x5c\x93\xe2\x22\x1b\x85\x73\x81\xab\x86\xfd\x8e\x75"
+ "\x60\xe5\xab\xbf\x75\x03\xca\xb3\xc7\x55\x28\xdc\x17\xf5\xad\x31"
+ "\x71\xfe\x60\x32\xc1\x15\x6d\x75\x60\x8d\x9f\x14\x7b\xb7\x90\x95"
+ "\xbc\x86\xf5\xff\xae\xf0\xbb\xe3\x8b\x2f\xb2\x4b\xbd\xa0\xd7\x72"
+ "\xbc\xec\x2f\x11\xbe\x50\x5f\xb3\x7b\x95\x6f\xac\x95\x6b\x75\xe2"
+ "\x73\xd8\xd3\xa6\xa9\x95\x26\x6e\x2d\x31\x71\x94\x35\x56\xe5\x29"
+ "\x06\xec\x5b\xd3\xc2\x73\x47\xde\x53\xd5\xe7\x0e\xf2\x1f\x18\x7e"
+ "\x5e\xbc\xf6\xc1\xe5\xe7\xc5\x6b\x2f\x68\x72\xde\x6c\xa9\x7b\xfb"
+ "\x5a\x50\xe7\x39\xf8\xea\x89\xcf\x59\x9d\x54\xff\x6b\x2e\x59\x37"
+ "\x60\x12\x4c\x23\x3c\xb3\x10\x70\x2b\xef\xab\x3c\x94\xa2\xe3\x06"
+ "\x9a\x43\xa6\x10\xf1\x43\x4c\xcc\x73\x7c\x9b\x07\xdc\xa3\x9d\x11"
+ "\x96\x24\x11\xad\xaa\x56\xfe\xc9\x88\xfd\x6b\x2b\xdd\x3d\xf1\xc7"
+ "\x17\x61\x2e\x1f\x02\xfe\x33\x2e\xd0\xf0\x5f\x37\xca\xf0\xd5\x4a"
+ "\x3b\x14\x31\xc2\x67\x20\xd6\x39\xf9\x09\xa4\xb5\x8e\xb8\x44\xb4"
+ "\x9b\x7c\x06\x82\x47\x38\x54\xaf\xef\xfd\x6a\x65\x1a\xc1\x5b\xc8"
+ "\x8c\x0d\x44\x0f\x03\x76\x9b\x0c\xea\xae\x0b\x33\x2d\x8c\xfa\x7c"
+ "\x61\xf5\x84\x5d\x3f\x9f\xc1\x8c\x6f\x59\x1e\x65\xb6\x5b\x59\x62"
+ "\xc5\xb7\x8d\xec\x6f\xb3\x99\x81\xe0\xe0\x65\x87\x1a\x24\xec\x0e"
+ "\xf9\xf4\xf1\xf1\xb2\xd7\x32\x69\x3c\xe8\x5c\x26\x3d\xc8\x7b\xe5"
+ "\xb9\x94\xdb\x8c\x3d\xd0\x22\xbf\xff\x69\xf1\x30\xfb\xc3\x7c\xeb"
+ "\xd2\x22\x6b\xce\xb2\x95\x05\x53\xa6\x8c\x19\x86\x97\x70\x27\x4b"
+ "\x5e\xc2\x9d\x19\xc9\x4b\x20\x9c\x87\xf2\x66\x5f\xca\x3b\x2c\xcc"
+ "\xd2\xcc\x8b\x64\xa5\xb2\xf0\xfb\x2d\x6c\xe1\x2d\x11\xc1\xdb\xd8"
+ "\xc2\x5b\x6f\xcb\x7a\x28\x77\x49\x4e\x71\x44\xec\xed\x91\x72\xc4"
+ "\x9a\xe7\x50\x77\xd4\x84\x7b\x81\x3f\x94\x07\x9f\xa6\x7d\xe7\xf5"
+ "\x07\x9c\x41\xfe\x05\xe6\xee\x6c\xb2\xe9\x75\xc4\x1e\x64\x47\x80"
+ "\xdf\xf8\x44\xc2\xeb\xa3\xa5\x5d\xdb\x10\x23\x39\x9d\x09\x7d\xf7"
+ "\x81\xa7\x3b\x2f\xef\x5e\xbc\xfe\x54\xeb\x96\x00\xf0\x44\x71\xa9"
+ "\xa4\x77\x5e\x9f\x86\xf8\x78\x3c\x1f\x96\x67\x3a\xaf\xff\x08\xfc"
+ "\x72\x9a\xb0\x61\xb2\x82\x6c\x98\xbc\x2e\x74\xc3\x66\xf8\xcb\x99"
+ "\xb4\xa5\xe7\xee\x24\x1b\xf7\x5e\xf6\x7a\x2d\xd1\x17\x94\x16\x79"
+ "\xa6\x5b\x9f\x60\xa9\xf4\x24\x7a\x18\xdf\xa6\xf1\x0d\xc5\xa5\x7c"
+ "\x6b\x26\xe9\xd4\x24\x23\x7e\x03\xd1\x6d\x51\x96\x98\xd8\xbe\xca"
+ "\xd7\x5d\x3a\x0d\xe2\x1f\xe1\xee\x17\xc1\x59\xdf\x07\xe3\x80\xbf"
+ "\xe3\xfc\x26\x9e\x45\x36\x81\x14\x96\x4c\xfb\x83\xc9\x91\x21\xee"
+ "\x16\xd2\xbe\x48\x38\x61\xbb\xc0\xa5\xaf\x77\xe9\x78\xa1\x5a\xf2"
+ "\xa3\x63\x28\x3f\xf6\xcf\xb3\x72\xff\x7c\x23\x46\x5f\x0b\x78\x4f"
+ "\xd4\xe7\xea\x90\xfb\x65\x05\xf6\xdc\xc2\xdc\x1c\xeb\xd4\xa2\x31"
+ "\x2c\xc2\x03\x6b\x5e\x6e\x81\xb5\x30\xf7\xa9\xe5\xb9\x45\x82\xd1"
+ "\xa3\xaf\x43\xcf\xdf\x80\x83\xc2\xfe\xb0\x27\x10\x8c\xdf\x28\x26"
+ "\x5e\xd8\x54\x31\x45\x9c\xa5\xc8\x33\xb0\x9e\x14\xb5\x7a\x6c\x9a"
+ "\x94\x5b\x9e\x06\x5c\x0f\x4b\x7b\x5c\xae\xe2\x7c\xa2\xe3\x4e\xb1"
+ "\xc3\xeb\xa5\xae\xcc\x1b\x6f\x6a\xb0\xaa\x45\x3b\x0f\x86\xe9\xb5"
+ "\x26\x61\x77\x48\xea\xac\xbe\x71\xd4\xcb\xdc\x07\xc2\x34\x48\xd3"
+ "\x5d\x84\x07\x05\x3e\xfc\x3b\xb8\x50\xa3\x9d\x51\xcf\xe1\x0a\xbe"
+ "\x82\x77\xd6\xf4\x33\x21\x0f\x24\xdf\x08\x12\xbf\x1e\x4e\xd5\xe1"
+ "\x08\xfa\xa5\x93\xe4\x0e\x3a\x7f\x94\x1e\xbc\xc8\x9d\xc5\xcc\x40"
+ "\xb2\x07\xe0\x90\xf2\xbd\x85\x3e\x03\xaf\x7c\xc3\x0a\x5a\x26\x9f"
+ "\xd2\x6c\xd7\x74\x37\x79\x7c\x71\x1e\xca\x71\x84\xf9\x8e\xa6\x39"
+ "\x82\x8e\xef\xa7\x79\x73\x38\x29\x8b\xf6\x08\x89\xbb\xaf\xfe\x7b"
+ "\xed\xe5\x63\xe4\x39\x8a\xc4\x6f\x87\x1b\xb5\x3e\x74\x13\xce\xd2"
+ "\x74\x7f\x0d\x72\x5e\x37\xcd\xc1\x9c\xcb\xa7\xb1\x00\x9e\x5f\xab"
+ "\xc3\x8b\xfa\x4b\x6d\x27\xb9\x35\xf0\x70\xf9\xbe\x92\x80\x41\xfa"
+ "\x2e\x7d\x63\x9a\xe4\x8f\x9a\xac\x91\xe7\x86\x92\x17\x6a\x9a\x15"
+ "\xb6\x13\xf2\x46\xed\xa5\x38\x62\x59\x01\x5d\x27\xfb\x59\xd6\xca"
+ "\x25\x3f\xcb\xcd\x5a\x6e\x9b\x66\x5d\x5e\x20\x8e\x6d\x85\x18\xc0"
+ "\xbe\xfc\xb1\x9f\x59\x09\x8b\x64\xcd\x5b\xb8\x30\xeb\xde\x87\x7f"
+ "\xf8\xa3\x31\xec\xde\x25\x88\xb3\x2f\xb3\x2e\x4c\x9d\x26\x3f\x3d"
+ "\x34\x7f\xee\xbf\x64\xcd\x4d\x7f\xf8\xc1\x45\xc3\xe8\xa4\xc7\x62"
+ "\x4e\x90\x8e\xcf\xa8\x0e\xf6\xd6\x3a\xa9\x83\xd4\xd4\x3c\x54\x07"
+ "\xa9\xc9\x8b\x1f\xb0\xf3\x9b\x16\xc6\xde\x42\xec\x5b\xeb\xf0\x2b"
+ "\x97\xf3\xe6\x2a\x33\xda\xef\x0f\xcf\x9b\xb7\xc4\x79\x1b\xc9\x0e"
+ "\xa4\xec\xf5\x4d\xe0\xbf\x37\x16\x46\x7e\x0b\xe3\x82\x37\x43\x02"
+ "\x5f\x6a\xf3\x82\xe6\x43\x56\x30\x46\xcc\x0d\x49\xaf\xbc\xb9\x50"
+ "\x9f\x1b\x35\xf2\x7c\x88\x91\xcc\x8c\xbe\x63\x7e\x27\x92\x7c\x19"
+ "\x73\x21\x8f\xce\xd6\x29\x9e\xc7\xf7\x24\x6a\xe5\xae\x21\x79\x33"
+ "\xd1\xb3\xda\x99\x58\xdc\x69\xf6\xe6\xeb\xbc\xb2\x69\x81\xe4\x05"
+ "\x9b\x8a\xc5\xbc\x59\x3d\xe1\x5e\x71\x06\x29\xee\x13\xbd\xd9\x18"
+ "\x9e\x3f\x6f\xad\xa3\xb1\x21\xbc\x20\x71\xef\x9b\x47\x2f\x91\xe3"
+ "\x44\x21\xae\x4b\xb7\x33\x6f\x9f\xc2\x0c\xc6\x29\x2e\x56\x6b\xe0"
+ "\xe5\x5e\xf6\xe6\x16\xa9\x87\xfa\x56\x8c\x4e\x3f\xe3\x3d\xd1\xcb"
+ "\x78\xfb\xa5\xf2\xaf\xea\x08\xf9\x97\xd3\xc6\x4f\xb4\xda\x7c\x44"
+ "\x23\xbb\x3d\x3e\x61\xdf\xf4\xee\x56\x9b\x9f\x74\x4b\xc6\x9c\x62"
+ "\x6f\x3d\x52\x16\xe2\xfd\x78\x9f\x80\xbe\x89\x3d\x64\xa6\x94\x29"
+ "\x80\x1f\x7b\x6b\xbd\xe4\x4d\x64\x3c\xc1\x1d\xef\xd4\x46\x23\x8d"
+ "\x0f\xe6\x65\x17\xc6\x28\x7d\x38\xbc\x17\x57\x61\xd0\xec\x48\xbd"
+ "\x75\x82\x78\x54\x82\xd5\x33\x06\x35\xef\x99\x4a\xfc\xf0\x24\xdc"
+ "\x17\xa6\x2f\x79\x40\xc2\xf6\x2d\x6f\x93\xa3\x9b\xf6\xcd\xc0\x48"
+ "\xb8\x14\xe3\x79\x5c\x1f\xcf\xf4\x90\xef\x6e\x1a\xaf\xbe\xca\x3f"
+ "\x5b\xf4\xb1\xec\x9d\xf1\x73\x5b\x54\x05\xb3\x1e\xae\xbb\x95\xe2"
+ "\xb1\xfe\xdf\xda\x22\x74\x7b\x68\x7d\x5d\x92\x17\x78\x38\x4d\xcb"
+ "\x9f\xa9\xe7\xbf\xd4\x3e\xb1\xb8\xa0\x4b\x42\xae\x3b\xa5\x8e\x8f"
+ "\xe6\x4e\x7a\x88\x8e\x0f\x9d\x01\x36\xc9\x39\xa9\xcb\xe0\xcc\xb2"
+ "\x3f\xcd\x3f\x50\x37\x82\xff\xde\x68\x7b\x54\x93\x03\x60\x6d\xff"
+ "\xf9\xfc\x0c\xc6\xf2\xfd\x2b\x33\x07\x65\x28\x24\xfb\x20\x9b\x83"
+ "\x68\x87\x37\x42\x46\x36\xa8\xa3\xe9\x65\xcd\x19\xa4\x33\x46\x77"
+ "\x96\xa9\x1c\x5a\x57\x52\x6e\xd3\x6c\xf6\x00\xf3\xa2\xbc\x02\x71"
+ "\xfe\x5d\xf9\x67\x71\x57\x92\x78\x6d\xc1\xe7\x97\xf2\x2f\x34\x1d"
+ "\x26\x41\xbb\xc8\xfb\x78\xcd\xf3\x06\x65\x41\xe2\x6e\xda\x9f\x85"
+ "\x5e\x36\xe2\x17\x0f\x27\x2f\x04\x7e\xc8\x5b\x52\x90\xb3\xec\xf1"
+ "\xc7\xff\x3e\x6a\x88\x3c\xe3\x72\x55\xaa\xa0\xb5\x9a\xc1\xff\xee"
+ "\xcb\x93\xf3\xb4\x19\xf8\xff\x37\x69\x92\x7e\xfb\xf1\x97\x58\x37"
+ "\x93\x4e\xb3\xb7\x2d\x3a\xfd\x2e\xd7\xd1\xdb\xc9\xbc\xb2\x39\x2f"
+ "\xbc\x36\x9a\x7d\x5f\x5f\x1b\x6f\x1b\x87\x5f\x1b\x6f\xa7\x60\x9f"
+ "\x3d\x8e\xef\xc9\xa8\xf3\xb8\xc0\xf9\x34\xde\x92\x06\x77\x9b\x82"
+ "\x77\x0b\x1a\x3c\xab\x98\x29\x44\x7f\x93\x6c\x9a\xf6\x83\x10\xf8"
+ "\xda\x10\x70\x44\x56\x90\x99\x69\x2f\xa8\x29\x20\xb9\xe3\x64\x1e"
+ "\xbc\xc0\xbd\x59\xc5\xc0\x17\x08\x57\x9f\x96\x67\xf0\x3f\x39\x0f"
+ "\x3e\x04\xef\x35\xa7\x08\x57\xa8\xe4\x0c\x81\xc9\xfd\xfa\xed\x2d"
+ "\x3a\x8d\x6b\xaa\xb0\x0a\x1b\xd9\xb4\x6f\x87\xa4\x3e\x53\x03\xed"
+ "\xdd\xa8\xe7\x80\xc0\x41\x21\x13\x9d\x01\xb0\x9a\x27\x50\x2e\xe9"
+ "\x05\x15\x50\xfb\xa2\x6e\x33\x05\x53\xc5\x59\xc1\x8e\x27\x84\x3e"
+ "\xd0\x6d\x52\x1f\xe8\x36\xb6\xbd\x80\xe0\xf0\x76\xe0\xb2\xb2\xf1"
+ "\xf8\x63\x6d\x91\xf1\x8e\xc7\x97\x66\xd9\xf2\x8a\xb3\x48\x17\xf0"
+ "\x92\xfd\x5d\xae\xa1\xca\x77\x92\x24\x7c\xdf\xc9\x08\xcb\xaa\xa4"
+ "\x0e\x1f\xe1\xcc\x99\x01\x61\xc3\x56\x3b\xeb\x79\x77\x16\xc1\xbe"
+ "\xec\x22\x85\x63\x30\xe7\xde\x9d\x4e\x67\x3f\xbd\xa4\x3b\xb3\x23"
+ "\x93\xb9\x2a\xb9\x9b\x64\x68\x88\x1f\xa7\xdf\xa9\xef\x45\x3c\xd6"
+ "\x3e\xc5\x5d\x25\xce\x1a\xed\x42\x36\x07\x38\xbd\xe3\xf6\x32\x93"
+ "\xa6\xeb\x6a\x7b\x8c\xf4\xf3\x84\x4e\xb9\xa0\x33\xde\x39\x23\xef"
+ "\x68\xbd\xd3\xa9\xc3\x12\xb4\xef\x6c\xba\xd7\x4f\x7a\x3a\xbd\x9c"
+ "\x74\x02\xdf\x65\x7a\x7e\x2f\x7b\x47\xdc\x31\x7d\xd0\x2f\xde\xf7"
+ "\xfc\xc4\x1f\x79\x27\xff\x9d\x2d\x12\x6f\xbd\x53\x87\x78\xe0\xca"
+ "\x77\xca\xd1\xe6\x38\x69\x23\x40\x94\xb3\x40\xd7\x87\x8a\x84\xdb"
+ "\xdc\x25\x36\x10\xcb\x4b\x1f\x7f\x3c\xb7\xb0\x48\xf7\x29\x9f\xb2"
+ "\x2c\x3f\xe7\x2e\xed\x0e\x7e\x41\xee\xca\xac\xa5\x39\xe2\x8e\x0f"
+ "\x62\xe5\xeb\x25\xf0\x9d\x46\xfc\x8d\xd0\x9b\x17\x7d\x6a\x9b\xba"
+ "\x5d\xa3\xa3\x3a\x58\xcb\x01\xa9\x6f\xd1\xf2\xa4\xdc\xdb\xae\xfe"
+ "\x4f\xb4\xa3\x4d\xdf\xdb\x48\xc6\xd2\xcb\xee\xb0\xd2\x99\x19\xd9"
+ "\x65\xa0\xb3\x39\x92\xb3\x20\x0d\xd6\xe8\x3b\x83\x77\xa6\xd7\x23"
+ "\x9e\xce\x84\xdd\x05\x74\x0e\xdc\x36\x5f\xdd\x50\x94\xc3\x13\xb2"
+ "\xcd\xc0\x6b\xb1\x34\x76\x74\x56\x24\x7d\x78\xb4\xa4\x11\xbe\x26"
+ "\x59\xa0\xbb\x80\xf4\x69\x5b\xcc\xa0\x4f\xb0\x5f\xb6\x2d\x00\xaf"
+ "\x97\xb3\xa6\x84\xc5\x50\x1d\xd8\x0b\xbd\x52\xae\xdc\xb2\xf8\xf5"
+ "\x52\xc6\xb4\xfd\xd0\xbb\x5e\xc8\x39\x5b\x52\xe4\x9e\x5a\xe4\xd0"
+ "\xe4\x28\x0e\xa4\x5b\xe3\x65\x37\xfa\x64\x9b\xb3\x67\x8b\x79\x22"
+ "\x70\x5d\xcb\x2e\xbe\x31\xbb\x59\xe8\x3c\x6f\xcc\x9e\xad\xf2\xbc"
+ "\x28\x0a\x63\xaf\x19\x83\x71\x6c\xe3\x65\x29\x4c\xd3\x93\x8e\x3a"
+ "\xc5\x8e\xdc\x42\x72\x60\xcc\x0f\x37\xc1\x02\xe5\xaf\xd1\xca\x5f"
+ "\x83\xf2\x51\xef\x6d\x9a\xff\xdc\x16\x9f\x5e\x17\xd6\xab\x0f\xfb"
+ "\x71\x0e\xed\xc9\x68\xff\x62\xfc\xb2\xa5\xcc\x29\x00\xde\x6f\xf2"
+ "\xa0\xcc\x49\xd2\x7d\x47\x52\xf4\xf5\x42\x75\x6b\x7d\xa0\x39\x40"
+ "\xf6\x2b\x15\xad\xae\x72\x92\x7f\xe8\x65\x72\x94\xc9\x2f\x74\xd7"
+ "\x63\xff\x8c\x01\xde\xf0\xc5\x55\x60\x9f\xa4\x3a\x88\x6e\xf7\x4f"
+ "\xe6\xd8\x47\x43\x59\x21\xa3\xb4\xa1\x51\xcc\xc6\x46\xd2\xec\xa8"
+ "\x6f\x4b\x98\xce\x44\x19\x17\x80\x9f\x9d\xac\xbc\x93\x1d\xd9\x4f"
+ "\x75\x93\x9e\x13\x8d\x6b\x3f\xc6\x09\x63\x65\x41\x3d\x0d\xe0\x35"
+ "\xc6\x02\x0e\x1f\xd0\x78\x91\xee\xc8\xf6\x7e\xc1\x7f\x98\xd0\x36"
+ "\x63\x07\x3b\xf2\x3a\x8d\x15\x95\x05\x18\x77\x05\xfb\x32\xef\x23"
+ "\x1b\x76\x04\xeb\x55\xa5\xbc\x8b\xce\x2f\x4f\x31\xcf\x7c\xa2\xcb"
+ "\xc1\xab\x88\xf7\xb2\x1c\xae\x8a\xb1\x16\xba\xd3\x9e\xf9\xab\xba"
+ "\xb8\x7a\xb1\x92\xf1\x66\xec\x0f\x17\x0d\x2c\x18\x00\x5f\x8d\x76"
+ "\x1b\xca\xce\x90\x9d\xbd\x7a\xe0\x9a\xb5\xa4\xb3\x12\x53\x5d\xc2"
+ "\xcc\x64\xa3\xb0\xcc\xc6\x03\xad\xfe\x3a\xd6\x6a\xab\x63\xef\x04"
+ "\x6b\x99\x7b\x05\xc9\x69\x3d\xdd\xef\x3a\x6a\xe9\xae\xca\x55\x78"
+ "\x7f\xd1\xfa\x2f\x54\x57\xeb\x9a\x77\x8f\xbe\x8f\x91\x7b\x9f\x59"
+ "\xff\x4d\x84\x6b\x5b\x32\xdf\xc1\x6c\x7b\x87\x95\x75\x72\x95\x68"
+ "\x3c\xe7\x93\x54\xc7\x5a\x94\x55\x4f\xf6\xfc\xcc\x6a\xaf\x65\x0c"
+ "\xfa\x6f\x4c\x77\x30\x71\x46\xea\x2e\xf8\x13\xb5\x71\xdc\xf6\x73"
+ "\x2c\xc6\x5d\xf0\x86\x78\x17\x32\x13\xf4\xd7\x93\xd3\x2e\x74\x30"
+ "\xc9\x96\xa1\xc7\xd1\x45\x77\xbe\xd5\x1a\x6a\x63\x48\xb6\x1b\xf0"
+ "\x32\xea\xf9\x77\x38\xf5\xfc\xad\x02\x17\x6c\x23\x78\xa0\x4d\x47"
+ "\x16\x49\x98\xb4\x20\x56\xb6\x19\xf0\xc9\x8c\x84\x4f\xeb\x2c\x82"
+ "\x0f\xe9\xa4\xab\x2b\xba\xeb\xd1\xb6\x34\xc0\x40\xd5\xeb\xa0\x39"
+ "\x40\x67\x79\x54\x7e\xf5\x39\x16\xeb\x2e\x20\x9d\x75\xcf\xb3\xa6"
+ "\x0c\x63\x8c\x7a\xe1\x4c\x43\xcd\x79\x66\xa4\x71\x23\xda\xa1\x46"
+ "\x7c\x17\x30\x2f\xa5\x31\xf3\xc5\xdb\x32\xf0\x5b\x84\x5f\x26\xcd"
+ "\x3d\x3c\x17\x63\xbc\xd6\xa2\x0d\x89\x18\xab\x7a\x7a\xca\xf9\xb8"
+ "\x64\x2d\xd9\x78\xa5\xfd\x19\x73\x25\x1c\xbf\x71\xc9\xcf\x83\x58"
+ "\x3b\xaa\xe0\x3d\x3d\x89\xea\x86\x55\x0d\x52\x7f\xf9\xdd\x45\xdb"
+ "\x40\xeb\xd7\x6d\x14\x36\x32\x62\xc1\x9f\x90\xcc\x81\x3d\x27\xee"
+ "\xd2\xb5\x59\x74\x3c\xfe\xcb\xf1\x64\x7f\xc2\x33\xcf\x20\x74\x29"
+ "\x8b\x4a\xb5\xb9\x5e\x8a\x34\x73\xbc\x6c\x46\x9e\x5c\x13\x2d\xe2"
+ "\x0e\x20\xe1\x81\x91\xe8\x2c\xec\x5d\x2d\xa4\xc3\xca\x27\x66\xb2"
+ "\x58\x85\xfb\x62\xb3\x4d\xdc\x13\x6c\xa2\x39\x14\x2b\xe6\xbe\xfc"
+ "\x06\xda\xd8\x67\xc2\xde\xd6\x86\x78\xa3\x1e\x4f\x7b\xa8\x0a\x7e"
+ "\x99\x78\xf5\xf4\x62\x13\x77\x9e\x67\x49\x42\xee\xa5\xc7\x17\xfb"
+ "\x4c\xad\xd8\xf9\x9d\xc0\xdd\x64\x5b\x87\xf2\x20\x3e\x0a\x7b\xe5"
+ "\x41\xd4\xeb\x46\xfa\x44\x3d\x3d\xef\xcd\x34\x7a\x1c\x4d\x62\x9d"
+ "\x91\xfd\x35\xb1\x47\xca\xf8\x51\xe9\x0e\x9f\x49\x8c\x99\x1e\x57"
+ "\x94\x29\xf6\x66\xb2\xc3\x01\xda\x9b\x8b\xf6\x9c\x12\xf1\x0a\x78"
+ "\x67\x8a\x37\x47\xc4\x19\xc8\xe6\x09\xd9\xd3\x8c\x88\x8b\x42\x9b"
+ "\xd9\x60\x18\x75\xd3\x3e\x4d\xeb\x2e\xbd\x98\xce\x00\xe5\xfe\x2c"
+ "\xea\x2e\xe6\x4c\xda\xe8\x95\x71\x92\x0e\x78\xaf\x3e\x92\x6f\xa7"
+ "\x73\x17\xaa\x5b\xed\xcd\x34\x84\x7a\x33\xa3\xa8\x7e\x2a\x8b\x64"
+ "\xae\xe8\x23\xea\xed\x62\x64\x1f\x9e\x6f\x38\x97\xca\xe9\xde\x17"
+ "\xca\x15\xed\x71\x04\x80\x7b\xce\x35\x0c\xaf\xdf\xf3\x49\x97\xdb"
+ "\xf9\x6f\x98\xd3\xef\xef\x22\x9c\x12\x32\xdb\xd7\x59\x9f\xa0\x7d"
+ "\xfa\xfd\x29\x34\xa6\x21\xac\xf3\x50\xbc\x7d\xdd\xcc\x2e\xa6\x38"
+ "\xb1\x76\xe4\xd9\xe4\xfb\xf7\x10\x9d\x58\xa6\x72\x8e\xf7\x59\x34"
+ "\x77\x4d\xdd\xa4\x97\x63\x77\x09\x5d\x98\x84\x0f\xbd\x9e\x40\x17"
+ "\x6b\x29\xff\x98\xb5\x04\x3d\xe5\x07\xcf\xf9\x8c\x52\x27\xc6\x48"
+ "\xe5\x3e\x4c\xdf\xca\xb0\x5e\xb2\x42\xf5\x23\xf3\xb6\xe0\x97\x00"
+ "\xbb\xcf\xe4\x5e\xf0\xfe\x2e\x9d\x47\xba\x7c\x1f\xfe\x22\x6c\xa2"
+ "\x92\xbe\xa8\xba\xf1\x65\xf2\xd7\x55\xc6\xfb\x52\xd8\xcc\x12\x92"
+ "\x55\xbf\xdf\x1e\xe7\x67\x69\x5a\xb9\x67\x65\xb9\x7f\x61\x97\x2b"
+ "\x97\xe6\x6d\xcb\x16\xa9\x87\xa2\x26\xbc\xdc\x16\x42\xd9\xa1\x84"
+ "\x3f\x98\xb1\xd7\x94\x81\x7e\x01\x3d\x72\x74\x3e\xea\x69\x6b\x0d"
+ "\xb6\x31\xb2\xab\xbc\x5d\xc5\x7e\x7d\xd6\xc2\x34\xfd\x9f\xb2\x1e"
+ "\xf6\x97\x5b\x54\x9e\x62\x06\xef\x46\xf2\xdf\x32\xc2\xb3\x24\x4f"
+ "\x77\x86\x58\xb4\xc7\x0e\x2e\x2b\xfe\x93\x2e\x94\x71\xc7\x9b\x24"
+ "\x6b\x07\xae\x0a\x71\x8b\xe1\xd5\x0b\x5e\x56\x03\xfc\x2d\xec\x83"
+ "\xae\x9e\xf8\x5c\x5c\x05\xbb\x9b\x1b\x4c\x42\x7f\x4c\xdd\xf0\x41"
+ "\x17\xc6\x76\xb6\xd4\x37\x2a\x5a\x17\xa1\x6b\x14\x85\xba\x5e\x26"
+ "\x5d\x23\x6e\x2e\xca\xa8\xa3\x3d\x13\x63\xd6\x57\xf9\x17\xd0\xff"
+ "\xef\x89\xfd\x6e\x1d\xd1\x45\x02\xcf\x1f\x7d\xc0\x17\xbf\xbf\x81"
+ "\xca\x20\x3b\x65\xea\x8a\x60\x43\xcd\x57\xcc\x28\xe1\x71\x74\x7a"
+ "\x6b\x77\x9f\x9b\xbb\xf6\x37\xd0\x3a\xd2\xca\x36\xa1\xec\x10\xdf"
+ "\xb0\x1f\xb4\xf7\xd1\x85\x72\x6c\xc4\xbb\x85\xbe\x07\x07\xe8\x6e"
+ "\xe0\x5f\x6a\xeb\xfa\x89\x2e\xfa\x4b\x1a\x68\x5d\x77\xaf\x79\x7f"
+ "\xc3\x0f\x2d\xe5\xa0\x01\x8e\x66\x7b\xa3\x62\xed\x62\x6f\xd7\x6c"
+ "\x9d\x8e\x74\xae\xc6\xb7\x5a\xc6\x78\x50\x08\xe8\xf6\xc4\xd3\xec"
+ "\xd8\x7b\xfd\x95\xcc\x30\x80\xbd\xb5\x1f\xbc\x0f\xdf\x9a\x19\x5b"
+ "\x3d\x81\xa5\xe2\xdb\x84\xd3\xec\xe8\xcb\x41\x03\x4b\xc4\xcf\xec"
+ "\x9b\x98\x77\x15\xca\x4d\x23\x99\xee\x91\x73\x74\xce\xfc\x81\xb4"
+ "\xcb\xf1\x1c\x4b\x56\x51\x1e\xc9\x92\x6b\x26\xb0\x64\x92\x23\x23"
+ "\x2e\x25\x2b\x24\xcf\x59\x74\x3e\x71\xf5\x04\x36\x6d\x68\xbd\x47"
+ "\xeb\x24\x9d\x77\x4c\xec\xf1\x2b\x7d\xec\x7a\xdb\x77\x79\x07\xca"
+ "\x75\xf1\xca\x28\xce\x27\x5a\x0c\x92\x1e\xfc\xa0\xd8\xb4\x45\xce"
+ "\x3b\x71\xae\x80\xf9\x46\xe7\x36\x9a\xbc\x5a\x11\x36\x5e\x13\x8a"
+ "\x93\xe8\x6e\x96\x88\x53\xcc\x04\x4b\xb3\x68\x87\x66\x97\x31\xb4"
+ "\xfa\xe6\x6c\x2a\x83\xda\x93\xb5\x44\xca\xba\xc9\x66\x23\xe0\x2a"
+ "\xf4\x84\xd7\x3d\xc7\x62\x7f\xf5\x1c\x33\x1f\x79\x5c\xf4\x6b\x97"
+ "\x5c\x8b\x46\x46\xed\x55\x5d\xb4\xce\x30\x27\xd0\x6e\xaa\x8f\xe6"
+ "\x46\x6b\xf0\xac\xbb\xcc\xce\x55\xf7\x13\x64\x9f\xe4\x83\x2f\xdd"
+ "\x85\x7b\x58\x7a\x67\x50\xda\x19\x5b\xcc\x7c\x3b\x50\xde\x8e\x09"
+ "\xcc\x8c\xb2\xce\x7b\xf2\x09\xd7\x5a\x6e\x70\x17\x1e\x40\xd9\xc7"
+ "\xae\xa2\xfd\x68\x3d\xe0\x23\xf7\xa5\x63\x07\x3d\x81\x76\x46\x3e"
+ "\x2e\x1e\xb4\xf1\x10\x95\x83\x34\xf7\x88\xfe\x6e\xb5\x58\xb3\xa4"
+ "\x5d\x4d\xd1\xd7\xc1\x33\x04\xad\x1f\x9e\x73\xa2\xbc\x45\x9e\x6c"
+ "\xd0\x9c\x5a\x9f\x74\x58\xcb\xf9\x75\x6c\x83\xbb\x70\x27\xa3\xf1"
+ "\xa1\xf4\x08\x97\x7b\xba\x91\xf6\xcc\xd0\x71\xa1\x34\xf8\xb6\x1f"
+ "\xe5\x7e\x27\x7c\x36\x46\x67\x36\xe1\x34\x75\xe8\x0f\x60\xe5\xdf"
+ "\x0a\x18\x49\x99\xe1\xb1\x49\xd4\x56\x8c\x5d\x92\xc7\xfe\xf1\xf0"
+ "\x77\x22\xb1\xf6\x31\xef\x2b\x5a\x85\xbc\xec\xc3\xb1\x0f\x06\x55"
+ "\x2e\xf1\xd9\x87\x6e\xd0\x6e\xd8\xe7\x3e\x74\x13\x2e\x10\xf8\x64"
+ "\x06\x9d\x67\x7f\xf8\xba\x49\x91\xe3\x4b\x7d\x21\x9a\x69\xb8\x31"
+ "\x8e\x38\xab\x20\x1d\xc0\xc1\x31\xe6\xe6\x4f\xba\x54\x3a\x83\x22"
+ "\xdd\xde\x01\x0b\x93\xf3\x8f\xbb\x50\xee\x7e\x8d\x86\x6c\xd3\xf6"
+ "\xd3\xb6\xde\x78\xfb\x16\xfe\xb4\x85\xe9\x7a\x88\x58\xbf\xb5\x59"
+ "\x52\x77\xd4\x42\x38\x6a\x87\x41\xae\x1d\x6a\xa3\x96\xb7\x45\x9e"
+ "\x8d\x7f\x58\x8e\xfc\x2d\xc3\xf6\x37\x6a\x02\xd9\x9f\x2a\x23\x1b"
+ "\xa2\xe2\xae\x12\x70\x15\xf6\x83\x68\x8f\xbf\x9f\xc9\xf3\xfa\xf6"
+ "\xbb\x40\xe3\x47\xd3\x3d\x55\xbd\x6d\x57\x76\xae\xd0\xae\xdd\x97"
+ "\x6b\x5f\xa0\xf3\xd0\xdc\x0c\x18\x57\x9a\x84\xbf\x03\xd0\x5d\xaa"
+ "\x3f\xfe\x13\xd0\xd9\x3d\x56\xb9\x6e\xda\x6d\x3c\x5e\xe2\xdb\xac"
+ "\x00\x2b\xa7\x7e\x69\x72\x89\x68\xea\x33\xca\x71\xe9\xe7\xdb\x7a"
+ "\xd9\x23\xfa\x10\xd1\xfb\x86\x3e\x49\xfb\x06\x9f\x74\x89\xbe\x91"
+ "\x8d\x1e\xd1\xb7\x8f\xc4\x1d\xc0\x2b\xec\x4f\xbb\x84\xed\x27\x3e"
+ "\xf7\x04\x2a\xe3\xe3\xe7\xa9\x7d\x34\x26\xc0\x0f\xd7\x9e\x66\x1f"
+ "\x65\xf3\x31\xbf\x1a\x73\x65\x65\x7e\x34\x4d\x96\xd9\x63\xdd\x04"
+ "\x1c\x2c\xef\x2c\x92\xce\xce\xc7\xeb\xf9\x86\x1e\x2b\xf1\x30\xbd"
+ "\xa8\x0f\xf3\x23\x02\x0f\x7d\x6c\xa6\xb1\x9a\xb1\x87\xa5\xc9\x79"
+ "\xf8\xf1\x28\xe2\x77\xa5\x8f\xa7\x8f\x0e\x60\xde\x4b\xfb\x72\x83"
+ "\x3a\xab\x8a\xd8\xc7\x22\x71\xec\x15\xb6\x51\xf2\x34\x09\x1f\x00"
+ "\xfe\x1f\xed\x14\x7a\x49\x68\xef\xca\xa0\x8e\xff\x3e\xda\xc9\x49"
+ "\xde\xed\xd4\xe4\x9e\x84\xcb\x9c\xd2\x46\x60\x5f\xe5\xc7\xf3\x06"
+ "\xe5\x9e\x74\xa7\xbb\x92\x37\x53\x3a\x8c\xfd\x59\x4a\x23\x6d\x90"
+ "\x9d\xd6\xee\x3b\x7f\xfc\x23\xed\x2e\x73\x0a\xe9\x6a\x21\x2f\xf0"
+ "\x1d\x17\xf2\x56\x82\x01\xd5\x2d\xda\x6e\x20\x19\xe7\xc7\x75\x61"
+ "\x39\xf3\x47\xc2\x37\x84\xb4\x47\xf0\xf1\x01\x7d\x8e\xa0\xbf\xd1"
+ "\xd2\xaf\xc7\x47\x93\x0e\x4f\x63\x62\x0e\xf4\x72\xcb\x98\x1b\xeb"
+ "\x68\x4e\x7e\x7c\x3c\x12\x4e\xe9\x41\xb5\x4c\xe2\xa0\x8f\x9a\xb8"
+ "\x58\xeb\x1f\x35\xfd\x7d\x7a\xe2\x93\x5b\x74\x5a\x44\xc2\xd9\x0c"
+ "\xfc\xf2\x69\x50\xc0\xda\xb5\x24\x85\xec\xee\x3e\xed\x24\x3b\xe2"
+ "\x9f\x7c\x45\xf6\xda\x83\xae\x25\x0b\x42\x65\x16\xb2\x4f\xcb\x54"
+ "\xd7\x92\xcc\x53\x36\x66\xc8\xb2\x91\x6c\x7d\x7f\x39\xf1\x78\xe0"
+ "\x59\xc1\xaf\x81\x3e\xc1\x3a\x5f\xb5\x94\x99\x1e\xc9\x23\x19\x43"
+ "\x4a\x22\xd9\x53\x27\x5b\xea\xe4\x0b\x21\x54\x96\x92\x80\xf7\xf1"
+ "\xa0\xe7\xcc\xdc\xbc\x64\x36\x9d\xcf\x87\x2a\x39\xf0\xf1\x71\xb2"
+ "\xe9\x6e\xf0\xf8\x02\x6c\xd5\x19\x16\x43\xf6\xda\x83\x1b\xf6\x6f"
+ "\x69\xf5\x7f\x2a\xf8\x9b\x38\x1b\x4b\x04\xfd\x41\x77\x00\x2c\x6a"
+ "\xfc\xfe\x72\xec\xf1\x6b\x64\xbf\xcf\x72\xd9\x6f\xd9\x6e\x6a\xbf"
+ "\xc4\x71\x8f\x65\x3a\x45\xdb\x3f\xdd\x14\x44\xf9\xaa\x2b\x6f\x51"
+ "\xc8\x95\x97\x21\xef\xd4\xb7\x30\xa7\x9d\x77\x79\xfc\x2d\xe0\xb9"
+ "\xce\x0b\xdf\x75\x74\xfe\x4f\x7d\xa4\xfe\x51\xdd\xef\x9e\x3b\x23"
+ "\x68\xad\x20\xc2\x65\xf9\x5a\x9e\x6e\xe4\xe9\x6e\x61\xfd\xae\x3c"
+ "\xd1\xf7\x56\xbf\xcc\x9b\x25\xde\x29\x7f\x04\x1c\xb4\x3e\x0f\xc2"
+ "\x01\x7d\xa7\xfe\x51\xff\x83\x04\x13\xc0\x40\xeb\xab\x65\x40\xeb"
+ "\x27\xf5\xf1\x1d\xec\x3a\xcf\xa1\x9f\xe8\xab\xe8\xe7\x00\xfa\xd9"
+ "\x9c\xc7\x58\x60\xe3\x71\x76\x31\x21\x2f\x83\x78\xd4\xb2\xf7\x40"
+ "\xc3\x97\xba\x18\x78\x51\xe3\x8b\x4e\x97\xe1\x97\xa0\x4d\x9c\x3e"
+ "\xf0\xa4\x3e\xde\x45\x3a\xbc\x1e\x1b\x7e\xc1\x3a\x46\x34\x8e\x4e"
+ "\xaf\xa3\x6e\xcb\xbb\xea\x49\xe6\xec\xe2\x5d\xa0\x4d\x03\x9e\x20"
+ "\xd2\xe4\xa1\xff\xe0\x61\x4f\x69\xed\xa7\xb4\xab\xbe\x92\xfd\x32"
+ "\xe5\xb3\xc4\x43\xff\xb6\xd6\xe0\x69\x5f\xcb\xf4\xbe\xfc\x04\xe9"
+ "\xd0\x1f\x0b\xca\x1a\x4b\xfd\x51\xd1\xcf\xad\x68\x67\x20\xa2\x4f"
+ "\x47\xba\x49\x8f\xf8\x03\x36\x26\x83\x29\xcf\xf5\xa0\x1f\x3d\xcc"
+ "\xe2\x72\x82\xfe\x7a\x88\xe8\xc5\xe3\x47\xae\xce\x64\xc9\x5e\xf6"
+ "\xc9\x51\x39\xef\x84\x2d\xe8\x71\xa7\xd9\xa7\xe7\x07\xed\x3d\x93"
+ "\x0d\xfd\xf8\xfd\x75\x34\x8f\x84\xdd\x67\xda\x33\xfa\x30\x67\xe8"
+ "\x9c\x7e\x25\xea\xe8\x4b\x19\x2f\xda\x53\x39\x8b\xf4\x84\x63\x11"
+ "\x26\xdf\x51\x74\x5f\x55\x41\xbe\x2d\x1c\x30\xa3\xf2\x41\xcf\xad"
+ "\xa1\x27\xc1\x70\x58\x9d\xdb\xbd\x6c\x36\xea\x10\x67\x2c\x0d\x4e"
+ "\x9f\xe1\xdf\xf7\xb2\x69\x57\x86\x53\xfe\x9a\x3c\x12\xfe\x26\xf9"
+ "\x2c\x95\x87\xbe\x25\x9c\x66\x9f\x5d\x35\x74\x8d\x59\x05\x2e\x93"
+ "\x78\xf0\xaf\x6d\x24\xff\xbc\xc2\x7a\x05\x0d\x47\x3a\x16\x57\x98"
+ "\xef\xa8\xde\x0e\xbc\x8f\x78\xdf\xe2\xca\xe1\xf0\xd9\xb4\x91\xca"
+ "\x5a\xbf\x59\xe8\x48\x96\x55\x6f\x06\xbe\x00\xad\x70\xd8\x42\x67"
+ "\x29\xd8\x3b\x77\xfa\x59\xd1\x36\x46\xfe\x67\xc6\x7a\x82\x0f\xb0"
+ "\xc3\x75\xa9\x6c\xfb\x39\xb2\x19\x97\x92\xf0\xcc\x39\x8c\xa5\x86"
+ "\x43\x88\x26\x25\x39\x32\x2f\x4a\x31\xd7\x6c\xd6\x69\xf8\xcf\xce"
+ "\x97\x9e\x67\x06\x6b\x81\x78\xf7\xcf\xb3\xf2\x60\xad\x41\xcd\xab"
+ "\x23\x3b\xe6\x09\xc7\x52\xc9\x8e\xb9\x6e\x1b\x5c\xd0\x3e\x0e\xac"
+ "\xb9\x5e\xcb\x98\xf5\x85\x6c\x1a\xf9\x33\x30\xf9\x24\x2d\x27\xf7"
+ "\x6b\x6f\x32\xda\x67\xd6\xec\x85\x9b\xa5\xbd\xf0\xbf\xe6\x93\xce"
+ "\xb9\xf6\xfd\xe1\x10\x78\x18\x51\x6e\x21\x4b\xae\x3b\xc7\x52\x88"
+ "\x0e\xca\x3a\x29\x69\x36\xe2\x0b\x1f\xe8\x36\xf1\xd0\xdf\x52\xd8"
+ "\xb6\xd3\x61\x7f\x07\xbe\x22\xf2\x91\xc0\x2d\x23\xe9\x4f\xd7\x8c"
+ "\x17\xfa\x04\xc2\xd6\x2e\x9d\x33\x20\xcc\x6a\x37\x32\xe3\x61\xd2"
+ "\x4d\xac\x97\xf7\xf0\x0e\x07\xa5\xbe\x6f\x5f\xa5\xb7\x49\xb7\x03"
+ "\x3f\xe2\x79\xb9\x4b\xf2\x3b\x6a\x34\xf8\x2f\x5f\x9f\x5b\xda\x20"
+ "\x3d\x11\xeb\x59\xa3\x46\xf0\x38\xde\x33\xf4\x8d\xe2\xc8\xae\x5b"
+ "\x9a\x80\xe5\x89\x59\xc4\xf7\x68\x3c\xe3\x21\xeb\x60\x9c\xa4\x61"
+ "\x84\xce\xb5\x45\x9e\xff\x61\x6f\x8a\xeb\xab\x3c\x91\xa1\xef\x67"
+ "\xb4\xaf\x4b\x5b\xaf\x27\x72\xbc\x51\x71\x7b\x2e\xd3\x3e\xb3\xa6"
+ "\x23\x4e\x67\x37\x69\x48\x5f\xab\xef\x6f\xe2\x0c\x77\xf5\x84\x7b"
+ "\x8b\x8a\x59\xd2\x0f\xaf\x8b\x61\x74\xfe\x87\xb4\x5d\x72\xdf\x3d"
+ "\x71\x30\x7c\x46\x90\x26\xe0\x4d\x36\x0a\x04\x8f\x41\xb6\x3f\xa5"
+ "\x4f\x83\x6e\xdd\x06\xa8\xdc\x7f\x4f\x7c\x14\x51\x4f\x70\x70\x1f"
+ "\x45\x1d\xa4\x83\x4e\xe5\x4b\xda\xe4\x44\x83\xb8\x4b\x89\x74\x72"
+ "\x7f\x3d\x31\x22\xdf\x46\x76\xa8\x08\xbe\xaa\xc6\x4f\x7a\xba\xbf"
+ "\x90\xf0\x75\xb0\xa8\x99\xb5\xcc\x72\xc8\xe9\x35\xc6\x49\x1b\xdd"
+ "\xa6\x0e\xd6\xf1\x00\x7d\xa7\xb9\xee\x9e\x41\xf2\xc0\x8e\x17\x3c"
+ "\xb4\x6f\x0f\x64\xc6\x3e\x48\xbc\xbe\xa0\xc5\x3b\xb6\x4c\x47\x3e"
+ "\xc4\x25\xbc\xd6\x13\x30\xd6\x94\xb0\x69\xd2\x96\x6a\x87\xb0\xd1"
+ "\x45\x77\xd6\x6f\x4c\x64\x96\x1b\x6b\x59\x4a\x5f\x65\x87\x1b\xfc"
+ "\xa5\xd4\xcb\xa5\xfa\x37\x9e\xcb\x20\x7f\x0e\xfb\xfa\xbd\xa3\xe4"
+ "\x58\x7d\xfe\x08\xc2\x29\xe1\x70\xc7\x45\xed\x7c\xa8\xcd\xcb\x3e"
+ "\x5f\xbc\xa3\x47\xea\xd2\x0b\xf9\x92\xeb\x58\x5b\x58\xff\xe0\xf3"
+ "\x47\x64\x5b\x3e\x7f\xe4\xb0\x8d\x91\xec\xfc\xe8\x76\x61\x9b\xfd"
+ "\xf3\x54\x2f\x3b\x61\xd3\xe4\x31\x6d\x62\x5e\x11\xbd\x5b\x45\x3c"
+ "\xd8\x17\xee\xf5\x48\x47\xfb\x04\xe8\xa3\x34\x49\xc3\x1f\xeb\x52"
+ "\x31\x7f\x22\xfa\xff\x36\xc9\x1b\x87\xc5\x89\xcf\x31\x26\xf2\x6c"
+ "\x38\x66\x15\xfa\x2c\x1b\xce\xed\xc2\x33\x86\x6f\xf8\xb0\x0d\xcf"
+ "\x58\xc4\x7b\xf1\x34\xe3\xd9\x8e\x67\x22\xbe\xbb\x68\x5e\x82\x87"
+ "\xb5\x90\x8f\xca\xde\xf8\x63\x96\x91\xee\x45\x11\x6c\x3c\x6b\xfe"
+ "\x85\x49\x9d\xbd\xce\x34\xf2\x4f\x98\xbe\x8d\xb1\xa2\x20\xef\xb7"
+ "\x5e\x4f\x3e\x46\x3a\xd3\xca\xb6\xd1\x59\x7a\x67\xe2\xd0\xb3\xf4"
+ "\xce\x59\xf8\x21\xd4\xd9\x8c\x5f\x00\xbf\xb4\xf0\xef\xe4\xac\xbe"
+ "\xca\xce\x34\xc0\x51\xd0\x58\x57\x86\x13\x29\x3f\xc6\x81\xf8\xa2"
+ "\xf8\x97\xdd\xb2\xbf\x3d\x0c\xe1\x18\x1e\x7f\x2e\x4d\xeb\xaf\x0f"
+ "\x61\xb3\xb5\x0c\xfb\x5a\x3c\x60\x32\x01\x7d\x8e\x3f\xb7\x8b\xfa"
+ "\x4b\xed\xed\x8d\xff\xb0\x2d\xf2\x4e\x18\x95\x49\xfd\xf7\xc5\x23"
+ "\x1f\x60\xc9\x67\xfc\xdc\xa6\xc3\x53\x83\x13\xdd\x97\x31\xf4\xa2"
+ "\x0c\x49\x07\x21\x3d\xca\xd0\xd3\x0f\xc2\x7e\x82\xb0\x4f\xd0\x45"
+ "\x75\x81\x27\x8e\xd1\xef\x9b\xf5\x55\x9e\x9c\xf6\x7a\x3e\xd3\xec"
+ "\x79\x74\xa6\xf9\x23\xf2\x92\x4d\x85\xe1\xf2\xa3\xce\x18\x59\xe7"
+ "\x87\x6d\xa7\x58\xe7\x3d\xb2\xde\x93\xd6\x91\xd6\x92\x73\x0a\xe8"
+ "\x3b\x50\xbd\x33\x25\xdf\x37\xc7\x93\xe4\x67\x9e\x3a\x15\x7b\xfe"
+ "\x87\xc0\x47\xdc\x7d\x8a\x9d\x3c\xd1\x1a\xe8\xba\xc2\xfd\xf0\xa4"
+ "\xb0\x17\xc2\xfb\xcb\x99\xa7\xf4\x56\x71\x9e\xd5\xc3\xbe\x88\xf7"
+ "\xf8\xc4\x9d\x73\xbc\x9f\x0a\xd1\x77\x3a\x43\xa7\xbd\x01\x3c\xf6"
+ "\xa0\x9f\x0c\x15\x69\xb7\x53\x3c\xe2\xc8\x26\xc9\x8e\x88\x6f\x7c"
+ "\xe3\x07\xed\x72\x4d\x9d\x7a\x9b\x68\x0b\xd1\xde\xe0\x7d\x6e\x6a"
+ "\xb3\xea\xfa\xa0\x9d\xfa\x50\x06\xfe\x8f\x7c\x83\xd2\x9a\xb0\xae"
+ "\x20\x59\xe1\xa9\xe7\x31\xef\xb8\xba\xe1\x83\xf6\x2b\xeb\xc3\x29"
+ "\x71\x57\xb2\x2c\xc8\x7b\x7c\xf1\x1f\xb4\x13\x4d\x52\xe3\x1c\x15"
+ "\x33\xb7\x8e\xbb\x7b\x13\x3e\x04\x8e\x3d\xd5\xfc\xba\x43\x8e\xcd"
+ "\x15\x96\xdb\xac\xf7\x7d\xbb\xd6\x77\xc4\x89\x33\xaa\x99\x5b\xa4"
+ "\xff\x10\x2f\xfb\x82\x8d\x28\xb3\xc2\x38\x13\x3d\x80\xbd\xe1\xa2"
+ "\x84\xc5\x17\x19\x83\x7b\xc3\x15\xb5\xe3\x8b\x11\x6d\xf9\x47\xd4"
+ "\x31\xa0\xd5\x71\xe0\x7f\x58\xc7\x81\xcb\xd5\x21\xcf\xcf\xbb\xd2"
+ "\xae\x9c\x77\xec\x12\x76\x75\x80\x3f\x7d\x12\x67\x7e\xb9\x3f\x04"
+ "\xfe\x2d\x68\xee\x21\xfd\x90\x32\xd2\x95\x25\x5f\x2a\x41\xd7\xcb"
+ "\xee\x23\x8e\x7e\xe6\x5e\xf1\x3e\xeb\x64\x5d\xc2\x7e\xdf\x11\x3b"
+ "\xf1\x6c\xe7\xd2\x06\x36\x7e\x98\x31\x60\xf8\xc2\x45\xf0\xde\x86"
+ "\x71\xd8\x1a\x31\xcf\x5a\xfd\xef\x33\x4f\x36\xc9\x57\xdb\x48\xae"
+ "\x8d\x35\xdb\xc3\x54\xe0\x06\xd0\xe8\x21\x01\x0f\xd0\x2f\x92\xdf"
+ "\xfa\xa4\x4b\xf0\x5b\x3e\x61\x33\x79\xac\xf0\x91\x52\xb9\xd7\x4e"
+ "\xb2\xef\xd0\x40\xa6\xb5\xaf\x92\x65\x90\xef\x14\x92\x3b\x73\x73"
+ "\x51\x5e\x7a\x30\x8a\x0b\x7e\x0a\xb4\x3f\xf9\x4e\xf1\xf8\xbd\x2c"
+ "\x04\x3a\xba\xee\x02\x4b\xac\x03\xed\x09\x9c\x6d\x26\xbc\xbe\x43"
+ "\xf3\x9f\xb2\xfe\x42\xd8\x7f\xca\x76\x92\xf5\xb4\xe3\xfd\x02\x33"
+ "\x86\x36\x7c\xd2\xb5\xf5\x02\x4b\xde\xb6\x82\xa5\x6c\x25\x59\xde"
+ "\x97\x92\xf6\x11\xba\xed\xe4\x4b\x65\x59\x0a\x9d\x25\x84\x69\x1f"
+ "\xb2\x91\x10\xc6\x5b\x46\x21\x03\xb9\x22\x78\x7f\x29\xf6\xc1\xa0"
+ "\xeb\x98\x35\x68\x3e\xb7\x0b\xb0\xc3\x5e\xd6\xd5\x00\xf8\x4d\x1b"
+ "\x6e\x6c\x75\x1d\x99\xda\x08\xff\x37\xaf\x27\x4b\xfc\x8e\xb2\xfc"
+ "\x23\xcd\x89\xd0\xd6\x4c\x36\xb3\x9b\xa5\xca\x73\xfb\xab\xb0\x27"
+ "\x9e\xce\x24\x9d\x46\xe7\x93\xcc\x12\xda\xba\x58\x29\xfb\x35\x8b"
+ "\xf2\x04\xd3\x18\xfd\x9c\x5f\xf1\xae\x99\xf9\x2c\x95\xce\x1f\xe8"
+ "\xac\xc4\xfa\xb4\x48\xff\xcd\xe4\x52\x96\x1a\x59\xf6\x93\xc5\x85"
+ "\x4b\x6f\x49\xfd\x69\xae\xf5\xf1\xa5\x85\x4f\xae\x5c\x52\x98\xcb"
+ "\x16\x48\x55\x10\x61\x8e\xbe\x98\xf4\x40\x56\x2e\xb5\xe7\x59\x1f"
+ "\x5b\x5e\x58\x98\x5b\x60\xb7\x3e\x30\x37\xe3\xeb\x36\x49\xb7\x5a"
+ "\x76\xd2\x59\x8f\xd4\x0b\xec\xbe\x8a\xff\xc7\xb7\x2e\x54\x93\x7f"
+ "\xad\x8a\xf9\x8b\x4c\xc1\x05\x56\xe9\xe7\xa8\x7b\x31\xe9\xe2\xf2"
+ "\xb2\xcc\x2d\x92\x4e\xed\x7e\x44\xd2\xf6\x25\x56\x79\x8f\xae\x5b"
+ "\xda\x01\xec\x5d\x90\x24\xd7\xd4\xdf\xee\x8a\xb2\x31\x7a\x7f\x92"
+ "\xde\x4d\x36\xb6\xd6\x3d\x81\xce\xc3\xff\x26\x6c\x34\xf2\xad\x0b"
+ "\x15\x3d\x9d\x9e\x46\xfb\x2e\xec\x4e\x6f\x27\xbb\xba\x95\xa7\x73"
+ "\x00\x9f\x84\xbe\xca\xbf\x2d\xf2\x1a\xb3\xdc\x1a\x8d\xd0\x25\x75"
+ "\x10\xbb\x17\x93\x8d\x4e\xfe\x1f\x13\x2f\x68\xe5\xac\x43\x7d\x57"
+ "\x23\x2d\x78\xb1\xd3\x31\x9a\xae\xe2\xe4\x0e\xad\x5d\x52\xa7\xe2"
+ "\xf4\x0a\xa9\x53\xf1\xb7\x9d\x11\x77\xe1\x85\xad\x09\xda\x1b\x35"
+ "\x9a\xb4\x4f\x2b\xaf\x59\xc7\x09\x48\x7f\x14\x74\xdd\x96\x2b\xc7"
+ "\x85\x7f\x93\xfc\xcf\x10\xdb\x4b\xdd\xf3\x87\xda\x34\xd1\xe1\x66"
+ "\xf9\xad\x94\xc5\x4b\xb8\xa2\x0f\x07\x25\x9c\x44\x7c\xd2\x69\x84"
+ "\x29\x9f\x97\x75\x27\x5d\x3a\xbf\x06\x47\xfc\xfe\x82\xc7\x96\x3d"
+ "\x69\x5b\x62\x5f\xfa\xe8\xd2\xfc\xa5\xf6\x62\x71\x65\x7f\x9a\xf8"
+ "\xf7\xbd\xa9\x39\x8b\x2e\xb5\x3f\x9f\x42\x32\x19\xcd\x6e\xb5\x9f"
+ "\x74\x20\xa4\x5c\xac\xfb\xab\x60\x25\xbb\xfb\xca\xfa\xd9\x2d\xda"
+ "\x5a\x27\xec\x78\x9c\x61\xde\xa8\xb1\x07\xb5\xf3\x91\x6e\x6d\xac"
+ "\xc4\xf7\x5e\xf3\x39\x97\x75\x02\x9b\xd3\xc1\x7c\x07\xe8\x5c\x0c"
+ "\xf0\xf6\xd2\xfe\xb9\xbe\x84\xf6\xb9\x36\x76\x24\x88\xbd\x54\x9c"
+ "\x95\xf7\x8c\x25\x98\x11\x0d\x09\x18\xed\xec\x60\x67\x96\x0b\x58"
+ "\x9c\xb5\xec\x14\xb6\x39\xce\x5a\x7e\x4b\x73\x91\xda\xac\xf2\xcc"
+ "\xad\x9c\x67\x3e\xa7\x9e\xcd\xdb\xca\xcf\xe6\x3d\x17\xb6\x7d\x79"
+ "\xc6\x8b\xbc\x7b\x90\xf7\x24\xf9\xb6\xaa\xee\x61\x7b\x08\x4f\x52"
+ "\xd8\x64\x37\x83\x37\x3c\xd6\x4e\xed\xf1\xf8\x52\x99\xbc\xaf\x7f"
+ "\xc6\xeb\xf1\xdf\xca\x40\x7b\x7a\xc5\xfd\x50\x71\xbe\x07\xfa\x10"
+ "\xf9\x3c\x68\x97\xc7\xd7\x4f\xb4\x48\xbb\x0a\x1a\xd1\xcb\xce\x98"
+ "\x81\x2f\x2d\x54\x2e\xf5\x79\x1b\xe6\x24\xe9\x69\xa0\xef\xa0\x63"
+ "\x4e\xd7\x69\x77\x83\x3b\xd7\x23\x9e\x60\x30\x74\xfc\x7b\xa6\xd0"
+ "\x38\x02\xc6\xdf\x09\xcf\x81\x1e\x61\x23\x6a\x61\x27\xff\x8c\xbb"
+ "\x96\x38\xe4\x78\xf7\xdc\xaf\xc5\x9d\x0d\xdb\x0b\xe8\x79\x04\xe1"
+ "\x01\xfc\x54\xee\x7a\x74\x4b\xc4\xd9\x34\x7d\x13\x36\xbd\x48\xef"
+ "\xc4\x56\xc2\xae\x47\xfe\x0d\x72\xee\x3d\xfa\x1f\xbe\xb2\xbc\x28"
+ "\xe4\x09\xd1\xfd\x56\x0d\xbe\xfb\x3d\x6b\x7a\x74\x5d\x0f\xb4\xe9"
+ "\xec\x0f\xdc\x8f\x07\x99\xf0\x5f\xdf\x19\x14\xfa\x90\x9a\x8d\x08"
+ "\x45\xad\xec\x26\x7d\x35\xb2\xaf\x16\xbb\x2d\x41\xfa\x7e\xe8\xab"
+ "\xec\xe9\x1c\xd4\x49\x32\x4b\x9a\x91\xe8\x36\xf2\xe9\x47\xeb\x87"
+ "\x68\x40\x6a\x13\xad\x1f\x94\x6d\xa6\x73\x6e\xb9\x8e\xce\x26\xfd"
+ "\xcf\xd6\xd1\x59\x31\xe7\xd1\x6e\xf0\x9c\x65\x7c\xe6\x3a\x96\x2d"
+ "\xf4\x10\x82\x7e\xba\x97\x6c\xc4\xde\xb3\x58\xe2\x24\xdf\x7a\xa1"
+ "\xab\xb2\xa2\x9b\xfc\x19\x97\xef\xe8\x67\xb1\xaa\xab\x28\x9b\x68"
+ "\xf5\x23\xa5\x42\x7f\x23\x06\xf9\x1a\x48\xbf\x83\x74\x0c\xe3\x84"
+ "\xcf\xc8\xf7\xd9\x8e\xf3\xcc\xd8\xc9\xce\xd6\xd1\x79\x52\x18\xd6"
+ "\x67\xbf\xa2\xf3\x43\xbe\x31\xdb\x6c\x2a\x35\xac\xa5\x32\xd4\x0b"
+ "\x67\x66\xeb\xf9\xc8\x37\x39\xe5\xeb\x60\x67\x3f\x10\xf9\x28\xad"
+ "\xb0\x25\x62\x5e\x8c\x7d\xdb\x4a\xe9\x83\x08\x6f\x57\xcd\x19\x1c"
+ "\x7b\x4a\x68\x45\xb0\x01\xdf\x16\xa9\xae\x0f\xdb\x10\x97\x29\xce"
+ "\x31\x06\x2c\x74\xbe\x89\x39\xb7\xbf\xc1\xe3\xfd\xc2\x2d\xda\x43"
+ "\x77\x95\xed\xd8\x7f\x05\x6f\xe3\xfb\xe6\xf6\x2f\x99\xd1\xf6\x38"
+ "\x8d\xa7\x4f\xda\x00\xee\x61\xbb\x64\xfb\x7c\xaf\xf6\x6e\xcc\xcb"
+ "\xe8\xc5\x7c\xf5\x1b\x62\xd8\x61\x0b\xe9\xd8\x9f\x73\x1d\xb6\xf4"
+ "\x63\x7c\x7c\x6b\x80\x2f\xcb\x25\x5d\xed\x1b\x5c\x9b\x34\x47\xa3"
+ "\x2c\xe6\x32\x7c\xdf\xa9\xeb\x34\xd1\x3c\x5d\x27\x6c\xbc\x9f\x2d"
+ "\x25\xb8\x61\x6e\xcf\x3a\x92\x1f\xb6\xb1\xdc\x2b\xef\xf5\x99\x91"
+ "\x67\xf0\xfe\x6f\xe8\x82\xda\x82\x76\x90\x2d\x1a\x47\x68\x85\x7a"
+ "\x9c\xce\xdf\x1f\x3c\xaf\x72\xba\xf3\x40\xf7\x57\x88\x77\x4a\x77"
+ "\xf0\x5e\xe2\x05\xe9\xae\x18\x9d\xbd\xd3\x5d\xfa\xf0\x3a\xf9\x2a"
+ "\x59\xbf\x53\x4f\x6b\x84\xda\x40\xf7\xc1\xaa\x9f\x10\xeb\x94\x68"
+ "\x9c\x58\x71\xfe\x10\xf5\xb3\x2f\x1f\xf4\xa3\xcc\x1e\x71\x6e\xd6"
+ "\xbb\x5d\x2b\x87\x6c\x66\xa1\x8c\x3c\xbd\x0c\x95\xf4\x87\x0b\x85"
+ "\xfe\x9e\x57\xe6\x97\xba\x46\x0f\xfa\x55\x71\x8f\x87\xf2\x4b\x1d"
+ "\xa0\xaf\xea\x06\x75\x50\xc5\xdd\x9a\xaf\xf6\xe8\x3a\x66\x78\x1f"
+ "\xbc\xff\x45\x30\xed\x75\x1d\x6b\xf7\x03\x3f\xf8\x5d\xc7\x2c\xf8"
+ "\x06\xfc\xff\x65\xdb\x65\xe5\x21\x64\x47\x61\x39\x33\xa8\x09\x45"
+ "\xeb\xc8\x46\x06\x69\xdb\x4b\xbd\xf7\x73\xb7\x6b\xf6\x32\xa2\x7a"
+ "\xd8\x57\x5f\x85\xcf\xe1\x43\x9a\x0c\xf9\xdc\x62\xc9\xc3\x9c\x5b"
+ "\x2c\x64\xc8\x1b\x8f\xb9\xff\xb3\x24\x60\x68\x28\xf1\x1a\xa4\x3e"
+ "\xde\xb9\x0c\x2f\xeb\x5f\x13\xd6\x05\x3d\x67\xa6\xb2\x86\xa7\x39"
+ "\x8b\x1d\xb2\xcc\x5e\x61\x3f\x24\x2c\x13\xe8\x15\xf7\x9f\xe8\xcc"
+ "\x5c\x25\xfa\x31\xe1\xe5\x36\xd2\x91\xf2\xd8\xce\x91\x2c\x39\x5a"
+ "\xca\x27\x64\x1a\x4d\xcf\xf3\x9a\xd3\x43\xc3\x09\x14\x96\x30\x3b"
+ "\xe7\xd5\xcf\xa5\xaa\x0d\x2a\xf9\x1f\xe4\x65\xf5\xc0\x97\x36\xbf"
+ "\xb0\xd3\xe0\x01\x3d\x8a\x3a\xb8\xad\x90\xee\x52\xf6\x8e\x23\xfb"
+ "\x0d\x72\x6d\xf6\xfe\x42\xb4\xa9\xf2\x6e\x5e\x46\x3c\x99\x8f\x7c"
+ "\x1d\x9d\x63\x48\x17\x8f\x74\xf7\x34\x95\x76\x93\x8e\xd9\x22\xf2"
+ "\x63\xdb\xa9\xd5\xed\x8b\x2f\x76\xdc\x18\xcb\xb2\xfb\x2a\x7b\x17"
+ "\x79\x59\x53\xdd\x95\xe3\x8d\xde\x45\x97\xa3\xcf\x25\xbd\x98\xc6"
+ "\x46\xe2\xf1\x49\x86\x33\x03\xf5\x3f\xc0\xa9\xfd\xfe\x7b\x82\x86"
+ "\x00\x1b\x30\x8c\xe6\xdf\x2a\x77\xb0\x60\xe5\x68\x1e\x2a\xc1\x78"
+ "\xf5\x5a\xc0\x03\xb6\xb0\x56\xa9\x77\x43\xba\x03\x26\xa7\x9f\x9f"
+ "\xf3\x04\x0f\xd0\x19\x02\xd1\xef\xc0\x5b\xfe\x3b\x3c\xc1\x57\x19"
+ "\xe9\x77\x13\xbe\xe9\x60\xfe\xa9\xd4\xae\x19\xb6\x72\x36\xbd\x87"
+ "\xbe\xf7\x76\xca\x3d\xdf\x9f\xa6\x3d\xcd\x64\x1f\x38\xb2\x4d\xdf"
+ "\x5b\x5e\xf0\x18\x19\x99\x9e\xbe\x30\x77\x45\x6e\xbe\xf5\x21\x32"
+ "\x41\x7d\xa9\xde\x68\xd8\xcf\xe1\xf9\x58\xda\x5f\x89\x7e\x27\x7f"
+ "\x87\x97\xf3\x75\xa8\xfb\x39\xc4\x9a\x4b\x26\x99\xf7\xff\xa5\xaf"
+ "\x43\x9d\x3e\x27\x3f\x87\xe1\xf3\x9f\xf3\x2d\x83\x6b\x40\x3d\xd4"
+ "\x47\x61\xb1\xa7\x57\xfa\x17\xd2\x3a\x92\xfb\xcb\xf9\x79\x91\xb6"
+ "\x8a\x24\x7d\xb6\xbf\x01\xf1\x8b\xf5\x3b\xaf\x98\x8b\xb1\x08\xe7"
+ "\x87\xef\xd8\x9c\x77\x60\xbc\x1b\xe5\xfa\x15\x69\xd7\xea\x7a\x12"
+ "\x9a\x4f\x7b\xa1\xd7\xa1\x56\xdd\x5e\x2a\x65\x93\xe7\xd7\x6f\x57"
+ "\x47\xc7\xc8\x73\xb1\xf3\x07\xf4\x3b\x5c\x72\x6d\x1e\xd2\xd6\xe6"
+ "\xf9\x96\xcb\xe9\xb2\x84\xd7\xc6\x85\x98\xf0\xba\xfe\x4c\xcb\x7b"
+ "\x21\xe6\xef\xe9\xc1\x68\x3c\xe2\xb8\xd3\x2c\x30\x89\xe4\x95\xf2"
+ "\xce\x76\x40\xd8\x17\x92\xf6\x38\xfa\x4e\x68\xef\xa8\xa3\xef\x6d"
+ "\xed\x7d\x22\xde\xf7\x6b\xef\xa0\x17\xfb\x9e\xd5\xde\xb1\x66\xfb"
+ "\x2a\xb4\xf7\x44\xbc\x2f\xd5\xde\xb1\x77\xf4\xfd\x40\x7b\x1f\x8f"
+ "\xf7\x3b\xb4\xf7\xeb\xf0\x3e\x45\x7b\xc7\x1a\xec\x13\x67\x06\x68"
+ "\x7b\x0c\xda\x7e\xfe\xca\x79\xd6\x0b\x6e\x79\x6e\xdd\xc7\x40\x0f"
+ "\xd6\xca\xbd\x67\x30\x2e\x11\x73\x3a\x47\x87\x2f\xe2\x1b\xa9\x1e"
+ "\xc4\x4f\xf3\x32\x6f\x5b\x44\xbc\x66\xbf\xad\x6f\x9e\x97\x7d\xe5"
+ "\x8d\x88\xaf\xd3\xe2\x17\x83\xe7\xf6\x47\xc4\xbb\xb4\x78\x3b\xf0"
+ "\x62\x5e\x44\xfc\x1a\x2d\x7e\x9d\x97\x7d\x62\x8c\x88\x77\x68\xf1"
+ "\x3b\x75\x1d\x1e\x2d\x3e\x5f\x8b\x3f\xe8\x65\xef\x1f\x88\x88\xcf"
+ "\xd6\xe2\x81\xff\xcf\xb7\x47\xc4\x0b\xbc\x22\x6d\xb2\x9b\xf8\xe1"
+ "\x52\x5a\x5b\x7d\x01\x2f\x6b\xdf\x19\x91\x66\x81\xcc\x1b\x30\x7b"
+ "\xd9\x87\x2d\x11\xf1\x73\xb4\xf8\x14\xaf\xf2\x8d\xc8\x32\x53\x47"
+ "\xc2\x55\xca\x16\x96\x3d\x92\x5c\x9f\x78\x20\xa1\xcb\x2c\xe8\xec"
+ "\x8b\xb9\x74\x27\xcc\xb4\x8d\x77\x58\x9d\x9c\x77\xb0\x8b\x0b\x35"
+ "\xdd\xdd\x0c\xd2\xa3\x94\xf7\xeb\x2e\xce\xd2\x6c\x2b\xf8\xc4\x9d"
+ "\xbb\x12\x8a\x0b\xbc\x22\xe4\x33\x8e\x72\x69\x2f\x5c\xf7\x3d\x43"
+ "\xf2\x2d\xed\xec\x1f\x69\xc8\x56\x2c\xe9\x82\x77\x93\x0c\xdc\x63"
+ "\xef\x97\xb6\xe4\xc1\x07\x53\x1c\xc9\x79\x08\x1e\x91\xf2\x2c\x89"
+ "\xf7\x2f\xe6\xaa\xfd\x74\xaf\x55\xca\xc2\x68\x2d\x52\x7a\xd2\x57"
+ "\x8b\x4c\xeb\x65\x17\x85\x5d\x8a\x28\x4b\xfc\xb1\xbe\xca\x8b\xf3"
+ "\xc2\xf7\x89\x02\x75\x5a\xfc\x07\x88\x5f\x1c\x11\xbf\x76\x64\xdc"
+ "\x0e\x7c\x67\xce\xce\x1c\xb8\xc0\xfd\xc1\x0b\x3c\x50\xfd\x57\xb4"
+ "\xfb\x71\xa1\x23\x78\x7d\xc8\x95\x9d\x47\xf7\x6d\xc8\x47\x6c\x70"
+ "\x05\xf7\x91\x4e\x24\xe2\xaf\x7e\xd0\xef\x03\x8d\xd1\xc7\xd7\x3f"
+ "\x4a\xfa\xaf\xe7\x19\x9d\xcd\x96\x75\x93\xbf\x41\x13\xa7\x7b\xdc"
+ "\xab\xce\xb0\x58\xba\x8f\xb3\xfd\x71\xfa\xfe\x29\x7b\x20\xcf\xc7"
+ "\x8e\xe4\x85\xd8\x76\x94\xbd\xed\x51\x9d\xbe\xb8\x18\x0c\xdf\x15"
+ "\xce\xa6\xb3\xec\xeb\xcb\x84\x4f\xec\x7e\x61\xab\xdc\x54\x41\x3a"
+ "\x05\xe7\x1a\xf9\x1b\x44\x1b\x7f\xe0\x35\x55\x30\x2b\xf6\xf6\xd9"
+ "\x78\x6f\x93\x3f\x7c\x43\xfc\x48\x7d\x92\x6b\xb9\xdf\x2e\x71\x4d"
+ "\x76\xbb\xc4\x17\xfd\x76\xfe\x1b\xba\x7f\xd2\xef\x00\xbe\x69\x04"
+ "\x1d\xde\x38\x5c\xfe\x55\xdb\x98\x61\x60\x23\x68\x93\x9e\x46\x83"
+ "\xc4\x4f\x03\x39\xaa\x21\xa6\x82\x64\xed\xc2\x1f\xee\xc6\xa2\xba"
+ "\x3d\x05\x01\xc3\x91\x92\x4e\xf6\xf4\x75\xcc\xb2\x38\x60\x40\x9a"
+ "\xfe\x93\x71\x76\xb2\x69\x7e\xcc\x0d\x7a\xd6\xf0\x12\xbe\xbf\x56"
+ "\xd0\x68\x08\x0a\x7a\x65\x20\x47\xc8\x67\x5d\x45\x36\xda\x43\x3c"
+ "\xed\x21\xa2\xc5\x63\x41\x8b\x67\x03\xff\xc7\x84\x56\xe6\x25\x04"
+ "\x8b\xf2\xae\xde\x56\xc8\x62\x43\x45\x29\x89\xcf\x5c\x60\xb3\xf5"
+ "\xfd\x67\xdb\x0a\xec\x29\x7d\x96\x31\x35\xd8\x53\x48\xee\x13\xa7"
+ "\x98\xc5\x39\x34\xbd\xab\x86\xbf\x9a\xb7\xaf\xb8\xbc\x6f\xef\xd0"
+ "\xca\x14\x61\x6f\x82\xda\x32\x5c\x5f\xd7\x3d\xc7\x8c\x21\xed\x5e"
+ "\xaa\xf3\x24\x1b\x0f\xfa\xd9\x10\x77\x9e\xbb\x4f\xe7\x33\x03\xf9"
+ "\x43\x76\xe6\x0a\xd9\xea\xa8\x23\x79\x41\xe6\x71\x7c\xcc\x9c\x85"
+ "\x34\x46\x03\xaf\x10\x9d\x46\xfa\xcc\x48\x6f\x3e\xcd\x06\xde\x36"
+ "\x05\xb0\x67\x04\x40\x93\x3f\x41\x7c\xf1\xc0\xa7\xd2\xbe\x45\xd0"
+ "\x4a\xf7\x48\xdd\x85\xf7\x52\xdc\xc5\xb2\x93\x42\x6f\x68\x91\x5c"
+ "\x5b\x03\x47\x29\x5c\x46\xf7\x64\x13\x1c\x75\x7b\xfb\x03\xa3\xa4"
+ "\xfc\x6e\xe0\x03\x6d\x7f\x68\x90\xbc\xdd\xc0\xd1\x91\xe6\xae\xea"
+ "\xca\x71\x70\xf2\x05\x59\x47\xf4\x2b\xf7\x8a\x33\x7e\xb2\x19\xe0"
+ "\xb8\xdb\xcd\x81\xee\xa4\x2d\xa3\xe0\xb3\xea\x86\x1c\x87\xb4\x21"
+ "\x19\x94\x77\xf3\x85\xbc\x3f\x67\xad\x3c\xdf\xc8\xd9\x22\xe5\xfd"
+ "\x39\x24\x2f\x07\xfe\x09\x6e\xe9\x8d\xcf\x01\x7d\x1b\xcc\xef\x4d"
+ "\x58\x35\xec\xfc\x92\xfb\xd1\x92\x5d\xd6\xeb\x59\x22\x9d\x33\x65"
+ "\x85\xa4\x2d\x56\xb9\x86\x43\x75\x7c\x83\xf8\x36\xb9\xc3\xc6\xa2"
+ "\xa4\xbd\xe3\xe0\x97\x33\xeb\x98\x15\x6d\x1d\xcb\xcd\x39\x99\x42"
+ "\xef\xd1\x95\x93\xe7\xe9\x26\x3f\x55\x21\x26\xcf\x03\x43\xbb\x78"
+ "\x7c\x4e\xa6\x4c\x1f\xba\xa3\xb5\x1b\x7d\x30\xe7\xa4\x78\x02\x67"
+ "\x34\x9a\x30\x84\xb9\x9f\x93\xc2\x5d\x39\xb3\xe5\x7d\xf3\xd0\x2f"
+ "\x74\xbc\x2a\xe7\x68\x68\x95\x84\xdb\x92\x5d\x12\x6e\xa1\x5d\xda"
+ "\x7e\x35\x99\xde\xb1\x77\xa7\x4a\xfd\x95\x90\x5d\xa7\x91\xbd\x5a"
+ "\x1a\xca\x83\x77\xcd\xce\x67\xa8\x16\x7d\x9f\xa6\x7d\x9f\x4d\x71"
+ "\xe8\x1f\xf6\xac\x60\x1b\xf5\x6b\x24\xdc\x2a\x60\x51\xca\xa2\xd0"
+ "\xe6\x05\xa4\xeb\x4d\x74\x8a\xc7\x7f\xb7\xdb\x23\xc6\x80\xdf\x42"
+ "\xba\xfd\x54\x0f\xd9\x1b\x22\xbc\x89\x32\x8d\x54\x5e\xb8\xfd\xea"
+ "\x38\xbd\x2d\x54\x1f\x7d\x43\x5f\x53\x04\x5f\x8d\x3e\x53\x1a\x1a"
+ "\xd7\x53\x36\x92\xfb\x9d\x07\xcc\x48\x87\x8e\xa7\x11\x4c\x24\xcc"
+ "\x78\x92\xc6\xd3\x6b\xe3\xc0\xe3\x87\xc2\x43\x86\x55\x33\x70\x43"
+ "\x21\xe9\x52\xf1\x34\x0d\x7e\x9a\x8f\x15\x55\xd8\xa2\x95\xdf\xd4"
+ "\xe7\x23\xf2\x4e\x1a\x4c\x8b\x76\x13\x6d\x44\x7a\x09\x74\x4e\x25"
+ "\xe7\xab\xda\x16\x91\xaf\x2d\xeb\x2b\xa2\x91\xb3\x53\x56\x6f\x16"
+ "\x3e\x2b\x53\xfb\x2a\xd5\xce\x30\xbc\x65\x39\xc3\xd4\x71\xbd\x5e"
+ "\x87\x97\xa9\x3b\xf5\x76\xe2\x5d\xdb\x83\x79\x4a\x78\x4c\xd4\x05"
+ "\x7a\x3e\x92\xe9\x60\x8c\xfc\xe4\x3f\x76\x04\xbf\x18\x8a\x07\x50"
+ "\x69\x0d\xde\xed\x16\xf3\x91\xf1\x7a\x92\x5d\x02\xae\x0b\xe4\x1c"
+ "\xe2\x6b\xe4\x5e\xc8\xeb\xa9\x4c\x3a\x6b\x94\xf6\x46\xf9\x16\x94"
+ "\xab\xdd\x59\xe2\x7b\xb4\x36\x80\xff\x0b\xee\xbc\x94\xaf\xbb\x77"
+ "\x49\x8e\x35\xe3\x16\x71\xe7\x76\xfa\x72\x1b\x5d\xa7\xcd\x09\x07"
+ "\x86\xd2\xdc\xe6\xb0\x8d\x33\xf2\x45\xad\xd9\x38\x73\x15\xd7\x09"
+ "\xf8\x2b\x6c\x1e\xbf\xc0\x6b\xe9\xee\x08\x5f\xc1\xb7\x54\x63\x0c"
+ "\xcb\xce\xb3\x6b\xc9\x2f\xb6\xd3\xc6\xbf\x20\xfb\x77\xc0\x97\x07"
+ "\x81\x3f\x48\x9f\x7e\x34\xe9\x25\x11\xfe\x21\xbd\x67\x1e\x8f\xf8"
+ "\x0d\x45\xee\xc1\x7b\x78\x8a\x71\x0e\xdd\x1d\xe5\x65\x99\xa0\xa5"
+ "\x8b\x8e\xd2\x7c\x20\x1d\xf5\x53\x8a\x31\x09\xe9\x8e\xe2\x9b\x7d"
+ "\xbd\x90\x25\xd8\x2d\x21\x73\xb1\xbd\xec\x0c\x8b\x16\x3e\x0e\x1d"
+ "\x01\x92\xa9\x19\x3a\x14\xf6\x3c\x8f\xb7\x5b\x10\x1f\x27\xe2\x03"
+ "\xa8\x7b\x83\xdd\x82\x6f\x71\xf8\x76\x02\x4f\x15\x65\x38\xaa\xd1"
+ "\x6e\xe7\x19\x76\x3d\xda\xd2\xc5\x5d\x76\x0b\xda\x79\xaa\xec\x49"
+ "\x36\xbe\xd5\xd6\x45\xfc\x1d\xca\xf3\x4a\xdf\x8d\xc8\xdb\xa1\x28"
+ "\xb7\xa3\x5f\x0e\x92\x89\xe0\x59\xba\x1e\x4f\x67\x88\xc5\x39\x57"
+ "\x61\xdf\x5b\x85\xfa\xe9\x5e\x2b\xca\x21\x1b\x24\xb2\x2d\xe8\x1b"
+ "\xc9\xd5\x50\xee\xaa\x6e\x7e\x0a\x65\x77\x1d\xe9\x46\x79\x8e\xf6"
+ "\xc1\x32\x35\x9a\x7a\x32\xfa\x3b\x8e\x6f\x5c\x15\x40\x9b\xb6\x90"
+ "\xee\x36\xe2\xcc\x88\x33\x0f\xd2\xc3\x8a\x31\x5e\x7b\xbf\x6a\x30"
+ "\x6d\x59\x26\x73\x5e\x64\x42\x87\xda\xba\x32\x8a\x75\x28\x51\xf5"
+ "\x64\x07\x2b\x5c\xa6\x61\x12\x95\xb7\x0e\xe5\x95\xe5\xb2\xab\x80"
+ "\xab\x63\xd0\x46\xf2\x11\x7d\x42\xc0\x89\xd6\x98\x62\x48\x42\x5f"
+ "\x5c\xd4\x27\x15\x63\xb7\x1e\xeb\x01\xfd\x51\xd0\x9f\xab\x56\x85"
+ "\x06\xef\xea\x52\x9f\xe2\x89\x9f\xa3\x7e\xc9\x71\xb4\xcf\x42\xbf"
+ "\xe6\xac\xca\xe3\x27\xd0\xb7\xae\x23\x79\xed\x0c\x7b\x8f\xa9\xd5"
+ "\xd6\x46\x77\x28\x4e\x48\xb8\x75\x91\x0e\xea\x2c\xf4\x73\xce\xa0"
+ "\xad\x5e\x25\xea\x59\xbe\xd1\xc9\xd0\xae\x75\x5a\x3f\x29\xae\x76"
+ "\x90\xa6\x57\xa2\x36\x69\xef\x63\x06\xd3\x7e\xbd\x9f\x31\x11\xfd"
+ "\x44\x7e\xe3\x5d\x54\x9e\xd6\xcf\x31\xe8\xe7\x55\x5f\xef\x27\xe6"
+ "\xd3\x0a\xbe\x46\xeb\xe7\x5a\xad\x9f\x06\xf4\x73\x0c\xfa\x39\x21"
+ "\xa2\x9f\x09\x97\xf4\x73\x36\xfa\x99\x86\x7e\x76\x44\xf4\xd3\x3c"
+ "\x4c\x3f\x67\x7b\xa9\x8e\x0d\xf6\x34\x69\x1f\x8c\x37\x8a\xfb\xef"
+ "\x55\x51\x83\xf7\xdf\x55\xba\x77\x79\x41\xd8\x20\x3a\x40\xf2\x1b"
+ "\x92\x1b\x11\xaf\x47\x77\x3c\xb3\x8a\xd7\x96\x0b\xd9\xcd\x78\x29"
+ "\x9b\x16\xf4\x55\x55\xd4\xe2\xc1\xbb\x1b\x9b\x85\xef\x1a\x3f\xc5"
+ "\x0b\x9b\x01\x85\x4c\xc8\x1e\xd3\x8b\x57\x96\x51\x7e\xca\x8b\xf4"
+ "\xeb\x06\xef\x98\x29\x06\x9b\x94\x87\x3a\x19\xbd\x93\x2d\x2c\x79"
+ "\x26\xc0\x9b\xc5\x99\x40\x55\x54\xd8\xff\xd3\x0a\xde\x44\x70\x11"
+ "\xf7\x59\xc5\x7d\x50\xb6\x36\x2b\xb8\x56\xbf\x97\xde\x8d\xb4\x9d"
+ "\x11\xf7\xd2\xbb\x45\x1b\xfa\x85\xed\x87\x95\xe9\xc1\x95\xe2\x7e"
+ "\x7a\x5f\x95\x31\x26\x5c\xb7\x22\xe5\x2f\x98\xa3\xf4\xee\x93\xb6"
+ "\xd9\x48\xc6\x66\x15\xfa\x36\x55\xc6\x59\xba\x8e\x8b\x57\x61\x36"
+ "\x5a\xcb\xc3\xfa\x79\xa9\x32\x2e\x1e\x62\x0b\x4a\x19\x45\x76\xde"
+ "\x29\xde\x3e\x78\xd7\xbc\xca\x58\xfe\xf7\xee\x9a\x97\xf9\x30\x4e"
+ "\x58\x6f\x36\xf2\x79\xae\x18\xc1\xe3\x16\xdb\x85\xaf\x14\x65\xd4"
+ "\x24\x6a\x67\x87\x62\xa4\xfd\xc3\x24\xce\x83\x14\xe3\xa7\x1a\x6e"
+ "\x6e\x4e\x0f\x05\x4d\x5e\xd4\x29\x6c\x4b\x0d\x86\x8d\x47\xc9\x56"
+ "\x06\xf2\x8e\x15\x76\xce\x51\xde\xd0\xf4\xe2\x7b\xf9\x25\xe1\xb4"
+ "\x4b\xc2\x56\x3f\x70\xd6\x48\xba\x3c\xeb\x27\x08\x19\xaf\x2d\xae"
+ "\x82\xd9\xca\xbe\x64\x51\x98\x8b\x27\xa9\x6d\xad\x5d\xe2\x9e\x9f"
+ "\x89\x57\xa6\x32\x4f\x57\x50\xd2\xed\xa0\x97\x3a\x92\x91\xe6\x4b"
+ "\x36\x9e\xee\x99\x90\x2f\x19\xa4\x3f\x2d\xfc\xc7\x28\xd1\x2f\x2f"
+ "\x5e\x3e\x86\xa9\x3f\xcd\xbc\x9a\x1b\x4a\x1a\x48\x97\xe0\xc5\x7e"
+ "\x2f\xf9\x60\x51\x9c\xcf\xb2\x24\xc2\x53\x98\xc3\x9d\xdc\xf0\x74"
+ "\x03\xf2\x74\xff\x67\x7f\xd7\x28\x4f\xf0\x63\x66\x03\xfe\x3c\xad"
+ "\x44\xef\x32\x96\x32\x63\xcd\x29\x66\xc6\x3c\x0b\x1e\x0e\xce\x66"
+ "\xba\xad\x87\xba\x04\x69\x43\xa0\x0e\x73\xb2\xc8\xc2\x03\x7d\x55"
+ "\xd1\x46\xf0\xb5\xe5\xba\xfc\x62\x9d\xb4\xf5\x66\x44\xfd\x4f\x09"
+ "\xbb\x14\x92\x3e\x00\x6c\xa3\xef\x91\xf7\x4c\x13\x7f\x8a\x3c\xb3"
+ "\x07\x79\x1b\x25\xba\x49\xc2\xb0\x78\x8b\xdc\x47\xa2\x9b\x0e\x83"
+ "\x3b\x5a\x23\x75\xa2\x12\x91\x36\x67\x50\x27\x8a\x64\x82\xf8\x8e"
+ "\x31\xdc\x22\xf9\x9e\xe2\x2d\x59\xa1\x18\x6d\x8d\x53\x7c\x76\x0a"
+ "\xe5\x45\x3e\x93\xf0\x73\x59\x15\x5d\x1f\x9e\x6b\xd1\x79\xb4\x9f"
+ "\xa2\x4f\xb1\x18\xd7\xe3\xd4\x2f\x82\x89\x9f\xec\xba\x29\xa3\xbc"
+ "\x87\x77\x8e\xe0\x07\xc9\x9c\xdd\x1e\x14\xf2\xa5\x63\x8d\x98\x4f"
+ "\x67\x30\x06\xd7\x90\x6d\x2b\x0f\xea\x39\xb2\xbd\x9f\x1d\xb1\xf4"
+ "\xb2\x56\xbc\xd3\xdd\x07\xf7\x13\x9f\xb3\x4e\xeb\xf0\x7b\x39\xe8"
+ "\x81\x4c\xb4\x39\x8f\xca\x22\x5c\x43\xfa\xa2\x64\x83\xb0\xd5\x87"
+ "\xb2\x3a\x99\x28\xe3\x88\xda\xc5\x8e\x38\x88\x87\x3d\xd7\xd8\xba"
+ "\xfd\x63\xd6\x6a\xf9\x8b\xa8\x87\xe8\x6d\x77\x61\xef\xe5\xca\x76"
+ "\xa0\xec\xb5\x5a\xd9\xdd\x28\x3b\x71\xe4\xb2\x3f\xf0\x5e\x61\xd9"
+ "\x57\xd0\xee\x0f\xda\xae\xa4\xec\xb2\x2d\x3c\x04\x3c\x3c\x16\x7b"
+ "\x7c\x36\xd9\x67\xa5\x3b\xae\xa1\x0b\x64\x93\x66\xb2\xe0\xd5\x4f"
+ "\x29\x31\xdb\x08\xdf\x08\xfd\x90\x0d\x45\x8b\xc5\xfd\x57\x92\xb3"
+ "\x6b\xf7\x5e\x3d\xc1\x93\x8c\xe4\xee\x7d\x55\x31\x6b\xc3\xbc\xe8"
+ "\xe0\xd9\xb8\xd9\xab\xc4\xec\x91\xba\xd6\x45\x8b\xe5\xdc\x8a\x59"
+ "\x42\x65\x0d\xcf\x73\xda\xd7\x09\x9d\x7d\x25\xe6\xa4\x2e\xdf\xea"
+ "\x8d\xb7\xaf\xd3\xca\xb2\x5e\x2a\x37\xd5\x0c\x09\x59\x73\x1d\x76"
+ "\xeb\xca\xc2\xa5\xf6\x5c\xfd\x82\xf6\x18\xf6\x50\xee\x63\xb9\x4b"
+ "\x57\xe4\xe6\x58\x17\x2d\x2f\x2c\x98\xbe\xec\xf1\xc7\xad\x0f\xe4"
+ "\x16\x15\x2d\xf9\x69\xee\x18\xb6\xa8\x70\x49\x41\xd1\x52\x92\x6d"
+ "\x5a\xad\xf3\x6e\xcb\xca\x5b\x66\x9f\xfe\xdd\x79\xa9\x97\xc8\x36"
+ "\xe9\xbe\xf6\x71\xe2\x71\xb0\x3f\x8d\x07\x8d\x11\x4f\x76\x89\x4c"
+ "\xc5\xdc\xfd\x34\xf8\x6b\xcc\xc1\xd3\xb4\x17\xd2\xfe\x43\xbc\x17"
+ "\xd9\x37\x26\x9b\xc9\x5b\x37\xf3\xb6\x53\xca\xc4\x6d\xa0\xdb\xdb"
+ "\x11\x47\xf7\x9e\x8f\xf3\xfe\x32\x9f\x38\xcf\x56\x26\x16\x23\x4d"
+ "\xd3\xaf\x10\xe7\x8b\x2f\xde\x52\xf3\x57\x66\x94\x34\xc6\x55\x01"
+ "\x6e\x18\xcd\xd7\x91\xad\xe1\xcf\x2d\x4c\xb3\x91\x6e\xf0\x78\x03"
+ "\xa4\x43\x14\x93\x1e\x2c\xe3\x84\x53\xe5\xfa\xba\xea\xa2\x84\x4b"
+ "\x8e\x43\xdc\x65\x50\x26\xfe\x88\x78\xc4\xd5\xe4\x77\xb1\x6a\x0c"
+ "\xf0\xff\x80\x2d\x8c\xab\xaf\xd1\x69\x73\xd2\xf1\x59\xd9\x81\xb0"
+ "\xb0\xb5\x12\x3d\x66\xd6\x10\xfd\x30\x25\x36\x91\x29\xd7\x96\xca"
+ "\x1f\xf2\x28\xd7\xae\x95\x3f\x7a\x8f\xfc\x4d\x9c\x23\x7f\x97\xc6"
+ "\xff\x6f\x7f\x7a\xfd\xff\xe3\x32\x02\x7f\xe7\xf7\x0f\xd4\x2f\xfa"
+ "\xfd\xff\x63\xff\xff\x37\xf9\xb1\x18\x2e\xf3\xa3\xf9\x86\xb9\x75"
+ "\xfc\x57\x7f\x65\x31\x98\x9f\xb5\xeb\x1f\xc5\x9c\xfe\x94\x59\x4a"
+ "\x83\xbc\xb3\xec\x11\x96\xe4\xfc\x12\x34\x18\x68\x2d\xbb\x83\x77"
+ "\x3a\x2f\xf0\x13\x98\x37\xef\x61\xfe\x36\x56\x77\xb0\xd8\xf5\x1d"
+ "\xa0\xb3\xec\xd2\xf7\x0c\x9d\x37\xd1\x3d\x2f\x0f\xc2\x2d\x2b\x02"
+ "\xec\x5d\xdf\x57\xa4\x53\xe9\x6e\xcd\x06\xee\x39\xce\x18\xcd\xdf"
+ "\xd8\x6c\x96\x58\x37\x9e\x1f\xe4\x95\x7b\x73\xb8\x61\xef\x22\xc4"
+ "\x1d\xdd\xa7\xa6\x8d\xda\x57\xd2\x3c\xca\xfa\x28\xed\xf3\xb1\xaf"
+ "\x68\x73\xf3\x1e\x71\x8f\x11\x4f\x9a\x83\x9a\x8d\x69\xec\x4f\xd7"
+ "\xbc\x2a\xf7\xf4\x6b\xd6\x6b\xf2\x3c\x7a\x17\xf7\x37\xd0\x8f\x46"
+ "\x5e\x59\xd2\x40\x65\xee\x55\x1b\x47\xd1\x9e\xb9\xaf\x24\x6d\x54"
+ "\xe9\x12\x66\x68\xf5\x9e\x66\x87\x81\x0b\xe9\x7c\x1c\xeb\x6e\x0f"
+ "\xd6\x59\xc3\xb6\xf1\xdc\x85\xf6\xad\x03\x3d\xb7\x16\x6d\xda\xd5"
+ "\x57\x35\x36\xc5\xab\x8c\xb6\x68\xb4\x9c\x1b\xeb\x62\xcf\x7a\xa4"
+ "\x49\x5f\xce\x26\xaf\x47\x3a\xd0\x76\x6b\x89\x47\x91\xed\x8b\x9f"
+ "\x02\x18\x1c\x40\x9d\x6d\xd6\x9f\x50\x38\x4e\xd0\x18\x54\x37\xfa"
+ "\x61\xed\x50\xe2\x04\xcf\x4f\x75\xe8\xf5\xa2\xfc\xb5\x28\xbf\x4d"
+ "\x3b\x63\x74\xc9\x72\xc6\x1e\x90\xeb\xb5\x88\xec\x33\x1c\xd7\xee"
+ "\x89\x75\xae\x2f\xc1\xbe\xde\xcf\xc8\x0e\x6e\x2d\xea\x70\x9b\x2a"
+ "\x18\x37\xd1\x1d\xe3\xe3\x41\xf0\x35\xaa\xd4\xdf\x55\xe2\x9e\xd5"
+ "\xf2\x0a\x3a\x44\xd0\x1e\x21\xd0\xf7\x42\x3e\x03\xfa\x23\x0f\x78"
+ "\x02\x34\x87\xb8\x9f\x01\x7a\x83\xe2\x51\x47\x2d\xfa\xd5\x06\xbe"
+ "\xf9\x00\xf6\x6e\xba\x23\x1e\xf3\x93\xf3\xdf\x67\x74\xc6\x41\xf4"
+ "\x42\x91\x83\x07\x84\x5f\xa9\xaa\xb8\x59\x3a\xbd\x40\xf3\x83\x68"
+ "\x84\xf5\x3f\x61\xc6\x01\x8c\x31\xe6\x48\x33\xe8\x0f\xd0\xf4\x71"
+ "\x36\x6d\x6c\x9a\x05\x5d\xa0\xf9\x91\x96\x38\x3c\x6e\x15\xf6\xf7"
+ "\x58\xd4\xd1\xec\x55\x26\x0a\x58\x48\x1c\x14\xb7\x4e\xdf\xeb\x49"
+ "\xe6\xe0\x45\x19\x1c\xb8\x0e\x70\x3b\x30\x2d\x5b\x01\x1d\x3c\xf6"
+ "\x28\xc6\xe2\x00\xa5\x45\x7e\x23\xd2\x1f\xc4\xbe\x3f\x47\x1b\x93"
+ "\xe3\xe0\x09\x40\x07\xc4\xcd\xa3\x76\x20\x4f\x0b\x60\x8d\xba\xcc"
+ "\x7e\x0d\x8f\x1d\x95\x34\x8c\xf9\x53\x1d\xf6\x18\xeb\x35\x61\xf8"
+ "\x9b\x62\x22\xe1\x0f\x58\x48\xbe\x5c\x31\xff\x22\x62\xec\xc0\x97"
+ "\x9a\xb3\x49\x0e\x8d\xfa\x0e\x0a\x19\x9a\x62\xba\x87\x6c\xbf\x61"
+ "\xce\x1c\x04\x2c\x0e\x22\x5d\x23\xe1\xe6\xd5\x7f\x05\xce\x7d\x94"
+ "\x68\x28\xf3\xfd\x92\x46\x35\x75\xd1\x1c\x3e\xa5\x98\xde\xa3\x70"
+ "\xa7\x12\xb7\x80\xca\x43\xf8\x15\x3c\x41\xcb\x9a\xf6\x97\xd5\x91"
+ "\x7f\x63\x7b\x2a\xd9\x66\x93\x63\x6d\x4f\x45\xbb\xea\xf5\x3b\x50"
+ "\x34\x07\x68\xec\xd1\x47\x21\x7f\xf0\x2a\xa6\x7a\x92\x35\x8a\x7c"
+ "\x03\x79\xd4\xc6\xe3\xb4\x3e\xf5\xef\x88\xef\x22\x9b\xb9\x11\xb0"
+ "\x59\xa0\x8d\x49\xa3\xf0\x15\xaa\x98\xef\x91\x6d\x33\x27\x21\x1c"
+ "\x83\x36\x88\x73\x88\xde\x81\xbc\xa8\x1a\xca\xe3\x0c\xe7\xa1\xf5"
+ "\x83\xb9\x6c\x42\x9e\x3b\xf0\xe4\x7a\x5a\xb2\x9b\x8f\x76\xb8\x9f"
+ "\x21\xdb\x65\x8a\xa9\xbd\x77\x20\xc5\x80\x7a\x03\xa8\xd7\x40\x73"
+ "\x83\xe6\x85\x5e\x46\x8d\x84\xd1\x1e\x8c\x9f\x98\x5f\x87\x83\x8d"
+ "\x80\xbb\x19\xf4\x7f\x20\x53\xd2\x77\x26\xb7\xd6\x3e\xb7\x38\x1f"
+ "\x8c\x8e\xf1\x6d\x97\x76\x86\x28\xdd\xa0\xff\xd7\x30\x9d\x69\x22"
+ "\x3b\x43\x31\x28\xab\x45\x9b\x13\x26\xa4\x6b\x1b\x9c\x43\x64\xef"
+ "\x40\x31\x67\x10\xad\xa9\xb5\x9f\xe6\xde\xfd\x12\x76\x71\x3e\x9a"
+ "\x03\xa0\xe3\xb7\xc8\x71\x8e\x5b\x40\xb4\xaa\x9c\x87\xf1\x89\x7a"
+ "\x19\xc2\x66\x02\xe0\xac\xa2\x0c\x7d\xae\x44\xe2\x06\xa4\x4d\x03"
+ "\x5d\x3a\x38\x6f\x74\x5c\x20\xcb\x4c\x28\xd6\xe8\x90\x46\x8c\x0d"
+ "\xd9\x6b\x77\x0b\x3b\x58\x62\x5e\x26\x2c\x3c\xec\x0f\x12\x7e\x3d"
+ "\x8a\x76\x01\x27\xc4\xbf\xd0\x9b\xe0\x8c\x09\xcf\xed\xf8\x2d\xfa"
+ "\xdc\x8e\x18\x57\x31\xb7\xd7\x08\x7c\x14\xdf\xe8\x65\xf7\x75\xea"
+ "\x73\x9f\xd6\xb9\x8a\x75\x5d\xb3\x42\x9c\x0f\x98\x48\x1e\x28\xd6"
+ "\x7d\xa0\x5b\xf0\x18\x34\x9e\xad\x8e\x4e\x61\x23\x7f\xb5\xca\x62"
+ "\x5a\xfd\x27\x49\x3e\x72\x9a\xd6\xbf\xbe\xc6\x69\x6c\x50\x97\x9b"
+ "\xfc\x18\xac\x01\x0e\xa4\x35\xe8\x47\x9b\xf0\x2d\x86\x6c\xc2\x35"
+ "\x2d\x4e\x63\x45\x18\xdb\xc3\xd9\x34\x6e\x09\xb3\xf5\x3b\x17\x35"
+ "\x12\x07\xc4\x6a\xf3\x45\xb4\xf1\x12\xb8\x9a\x24\x5c\x13\xf2\x87"
+ "\xae\x6f\x73\x2c\xad\xef\x48\xb8\x12\x4c\x09\xb6\x48\x8b\xfe\x8f"
+ "\xb6\xeb\x70\x0d\xc3\xf4\x9a\xab\xb4\xf9\xa8\xe1\xd6\x84\x61\x71"
+ "\x6b\x8d\xf4\x19\xd1\xb8\x9a\xfa\x82\x3d\x85\xea\x17\xfe\xb0\x34"
+ "\xde\xa7\xc9\x47\x73\x2a\x21\xe8\x65\xa5\x69\x3a\x1e\x43\x7b\x16"
+ "\xd1\x7c\xa2\xb1\xd2\x71\x07\xc9\xca\x64\xdb\xaf\x49\xd1\xc7\x83"
+ "\xda\x1d\x89\x13\xd0\x26\xa1\xef\x15\xee\xf3\x35\x3f\x42\xbe\x04"
+ "\xc2\x6d\x61\xfa\xea\x9a\xbc\xa1\x7d\xbf\x26\x83\xfa\x4e\x73\xc2"
+ "\xb6\x82\xe4\x65\x72\x2f\xf3\x2a\xb1\xc7\x87\xe2\xab\xd8\xf7\x84"
+ "\x5e\x86\x46\x8f\x11\xbe\xb7\xfd\x44\xa6\xa7\xfd\x0d\xe9\x85\x6c"
+ "\x5e\xdb\x0f\xd3\x68\xff\x43\x5c\xb3\x06\x83\xe3\x48\xdf\x44\xf7"
+ "\xb8\xc9\x96\xcf\xd5\xc7\x25\x2f\x08\x1c\x7d\x90\x7c\x67\x20\xdd"
+ "\xda\x56\xf0\x01\xc1\x68\xc6\xea\x34\x7a\x93\xf0\x04\x5f\x99\x79"
+ "\xf5\xca\x2e\x76\x95\xed\xbb\xfc\xf3\x53\x4a\xe2\xbf\x63\x1d\x05"
+ "\xc8\x5e\x26\xca\xb6\x9e\x52\xae\xcd\x45\xbd\x89\xda\xd3\x82\xe7"
+ "\x03\x78\x5e\x87\xe7\xed\x78\x4e\xc4\x73\x12\xd2\xab\x5a\xfa\x54"
+ "\x84\x47\x21\xfe\x36\xed\x89\x36\x26\xd2\x79\x76\xc6\xaf\x88\xae"
+ "\xfc\x09\xc5\x8f\xff\x88\xc2\x78\xbe\xad\xf5\xbb\x45\xae\xed\xc4"
+ "\x17\x50\x8e\x83\xd2\xd1\xbe\x86\x38\x1b\xd2\xac\xa7\xb2\xc9\xae"
+ "\x02\xde\xef\x89\xa0\x4f\x51\xce\xb8\x27\xf1\x9c\x85\xe7\x2d\x78"
+ "\xda\x91\x9f\xec\x79\x66\x00\x06\x6d\x61\x7c\x11\xb7\x20\xc7\x21"
+ "\xc7\x13\x63\xd8\x44\xeb\x5d\xc7\x07\x34\x9f\x86\xa4\x5b\x2c\xd3"
+ "\x49\xfe\x75\x5c\xb2\x3e\x76\x41\x31\x76\xa6\xf6\x20\xc6\x0e\xe5"
+ "\xdf\x43\xf9\xf1\x9c\xab\x3d\xd3\xb4\xe7\x7c\xed\x79\x9f\xf6\x9c"
+ "\xa7\x3d\x17\x78\x95\x44\xbf\x46\x9b\x00\x66\x89\x42\x4e\x8e\xb5"
+ "\xab\xd5\x3b\x3e\x85\xf8\x6b\xe0\xff\xdb\xc9\x8f\x23\xea\xad\xd3"
+ "\xe5\xd6\x24\xfb\x19\xa8\xba\xea\xea\xad\x42\xf6\x33\xee\x40\x04"
+ "\x2e\xcc\x8b\x55\xd2\x18\x68\xa7\xe8\x3a\x03\xe8\x06\x59\x4e\xac"
+ "\x41\x3b\xaf\x27\x7f\x30\xe4\x57\x93\xec\x14\x0a\x3e\x2a\xbe\x27"
+ "\x85\xd6\xab\x90\xe9\x6f\x20\x1b\x45\xc5\xf9\xf8\x39\xc0\x53\x94"
+ "\xea\xf8\x9e\xf8\x25\xc9\xe7\x8f\xfe\x4b\x5f\xd5\x78\x6b\x98\xcf"
+ "\x1f\xd7\x26\xcf\x36\xaf\x7d\x0a\xf1\x11\xfc\xff\xb8\x75\xd4\x66"
+ "\xc0\xba\x1d\xfd\x99\xd5\xa1\x8c\xcf\xc6\xf3\xd6\x4e\xd9\xe7\x54"
+ "\xbd\xcf\xda\x58\xd9\x74\x98\x77\x2a\x89\x41\xe0\xc3\x42\x9a\xdf"
+ "\x1d\x83\x78\x39\x31\x48\x4f\x6d\xfe\x60\x9c\x13\x5f\xa4\xf1\x8e"
+ "\xc0\x27\x69\x61\x3c\x3d\xfe\xe0\xd0\x71\x89\x3b\x18\x94\xf4\x42"
+ "\x3b\xd6\x25\xcd\x81\x35\x97\xac\xcb\x0c\x5a\x97\x5a\xde\xc0\x50"
+ "\x1c\x7f\x4d\x06\xe1\x78\xad\x8d\x98\xb7\x89\x39\x34\x36\x5e\x65"
+ "\x7c\xbb\xb6\x27\xb5\x63\x8f\xbc\x1d\xf1\x0b\x65\x3b\x65\xbc\x56"
+ "\x17\xe6\x5f\xe2\x3c\x9a\xff\x7a\xbc\x36\xbf\xa9\x9c\x39\x34\xd6"
+ "\x7a\xbc\x56\x3e\xe6\x69\xe2\x2c\x5a\x3f\x7a\xbc\x9c\x93\xf1\xeb"
+ "\x08\xdf\x50\xde\xa0\xd0\x65\x04\xff\xfd\x93\x26\xb4\xfb\xda\x46"
+ "\xd0\x17\xf5\xb4\x9e\x57\x97\xb0\xd8\x95\x5b\xd8\x58\xb9\x36\xaf"
+ "\xfd\x48\xcf\x2b\x64\xfa\x55\xd7\xb6\xe8\x38\xaa\x46\xe0\xb3\x84"
+ "\xb4\xa1\xb8\x72\xc2\x52\x5e\x69\x0a\x06\xcd\xc5\x39\x47\x82\xb3"
+ "\x04\xce\xc5\xba\xaf\xeb\xab\xb2\x18\xbd\x6c\xaf\x59\xdb\x4b\x5a"
+ "\x04\xad\xa6\x58\xee\x38\x52\x2f\x71\x97\x2c\xdb\x32\x88\xff\x22"
+ "\xe8\x10\x81\xeb\xa9\x2e\x2a\x0b\xfb\x8a\xd9\x5f\x96\x79\xb5\xc4"
+ "\xdf\x96\x4c\x2f\xbb\x21\x51\xc7\xad\xb4\x3f\x99\x14\x66\xab\xfe"
+ "\x89\xdc\x9f\x54\x92\x81\xd9\xfc\xc2\x3e\x5d\xab\xad\x9b\xd1\xbe"
+ "\x49\xf6\xbf\xb3\x8a\xc7\x90\xcd\xaa\x4c\xb4\xf5\x01\xd0\x67\x3b"
+ "\xb5\xb3\x19\xf0\xb9\xd7\x85\x88\x97\xd5\xe0\x8a\xf5\x74\xdd\x09"
+ "\x6d\x5c\x8e\xa3\x3d\x3b\x09\xb7\xaf\x5e\x21\x7d\x2a\x91\x3c\x48"
+ "\xf8\xf8\x22\x9a\xd5\xc2\x03\xc2\x97\x41\x95\xa5\x2b\x42\xc6\x55"
+ "\x2f\xd7\xc9\xb5\x47\x84\x8f\x0a\x57\x71\x8e\x94\x27\x5e\xb7\x5c"
+ "\xc6\x5f\x97\x29\xf5\x10\x8a\xf3\xb4\xf0\xbc\x28\xcb\xf8\x0f\x85"
+ "\xfc\x35\xfa\xaa\x9b\x24\x3d\x72\xdd\xec\x08\x9d\x1f\x01\x6b\x61"
+ "\xe7\xb8\xea\xba\x8c\xf0\xba\xb8\x2e\x99\xf2\x20\xef\x69\xc4\xe7"
+ "\xe9\xf1\x72\xaf\x89\x9b\xa3\xc9\xcc\xf2\xae\xae\x48\x63\xc0\xcd"
+ "\xd1\x5b\x2b\xf5\xf5\x7b\x5d\xb3\xac\x5f\xae\x5f\xea\x23\xcd\x07"
+ "\x5a\xc3\x41\x61\x57\xac\x27\x85\xd6\x32\xde\xf3\x83\xfa\xda\x95"
+ "\xf4\x9d\xb8\x73\x26\xd7\xed\x75\xed\x11\xed\x70\x69\x73\xf5\x78"
+ "\xef\x63\x96\x58\x7c\xf3\x7b\x95\x18\x79\x96\xa5\x58\x24\x8f\xb1"
+ "\x61\xc9\x2e\xf5\x02\x0f\x90\x6c\x9a\xe4\x09\x24\xb3\xd1\xf4\x55"
+ "\xe9\xac\xc4\x4f\xb6\xd2\x5c\x58\x0f\x61\xfb\x68\x66\xa6\xdb\x47"
+ "\xeb\xab\x9a\x30\x2f\x2c\x3b\xb6\xec\xd4\xfa\x95\x83\xfa\xea\xdc"
+ "\xce\x37\x68\x2e\x6d\x92\x6b\xcc\x52\x4b\xf3\xd8\x83\xb9\x87\xfd"
+ "\x67\xcb\xe1\x52\x91\xb7\x5c\x9f\x7b\x58\xa3\x39\xa7\x94\x89\xf1"
+ "\xb5\xe3\xf9\x16\x8c\x29\xe1\xd7\x7c\xcc\x83\x10\x9e\x39\xf2\xa9"
+ "\x98\xe9\xa9\xcd\xf9\x2d\xc8\x8b\xf5\x3f\xa5\x51\x1f\x03\x7f\xfc"
+ "\xb1\x54\x31\xc7\x9c\xa4\xdf\x98\x2a\xce\xfa\x69\x8e\xd1\xfc\x12"
+ "\x67\xfe\x98\x6b\xa6\x8a\xef\x33\x9a\x67\xc2\x66\x0a\xc2\xd4\x5e"
+ "\x9a\x67\x7d\x55\x13\x63\x74\x9b\xc7\x5e\x65\x82\x3c\x6f\xab\x9a"
+ "\x98\xa4\xeb\x86\xd3\x3c\xb4\x4f\x61\xe3\x50\xbe\xb5\xc9\xea\x27"
+ "\xd9\xf9\x67\x9e\xe0\x7c\x46\x69\x09\x76\x12\x5f\x5e\xdb\x84\x3c"
+ "\x11\xe3\x1f\x27\x74\x59\x0f\x2f\x16\xf2\xcc\x6b\xf0\x2d\x7f\x28"
+ "\xce\xb9\x2a\x20\xe8\x4a\x60\xc7\x1b\x13\x19\x9d\xd3\x63\xaf\x99"
+ "\xe8\xd2\xe9\xe1\x99\x88\x43\x1a\x6a\x1f\xf1\xe0\x6d\x78\x77\xd1"
+ "\x3e\x3d\x82\xdc\x79\x16\xc9\x8a\x08\x67\x90\xec\x89\xe4\x60\x80"
+ "\xf5\xd1\x53\xca\xe4\xf8\x23\x64\xbf\x68\xd9\xd7\xed\x5e\x3b\x1d"
+ "\xfc\x3c\xd9\xd3\xb2\x16\xb2\x6b\x3a\x94\xeb\xfd\x24\x77\x2a\xfb"
+ "\x8a\x64\x3c\x49\x96\xa1\x32\x9e\xa4\x3c\xed\x57\x8a\x9f\x37\xfc"
+ "\x9b\x64\xd3\xde\xbb\x2f\xff\x9b\xb4\x56\xa6\x9d\x54\x8b\x5f\xbd"
+ "\x84\x95\x05\x6b\x25\xa9\x54\x87\x15\xe1\x14\xc2\xb1\xa4\x67\x43"
+ "\xeb\x5c\x09\x32\xb2\x97\x84\x71\x42\xbb\x57\xdf\xfc\x90\xbb\x84"
+ "\x78\xda\x24\xe1\xbb\x80\xec\x17\x5f\x91\xae\x97\x92\x24\xc6\x53"
+ "\xd8\x97\x55\x92\x6c\xa8\x3b\xb1\xa6\x87\x19\x6d\x85\x6c\x12\xc9"
+ "\xd0\x4d\x21\xee\x26\x1e\x98\xe6\x04\x60\xd0\x76\x5a\x99\xf4\x94"
+ "\x7d\x15\x33\xe0\xfb\x64\xbc\x67\xeb\xb4\x14\xf2\x98\xa3\x02\x2c"
+ "\x91\x68\xa8\xb9\xab\xd8\xe4\xbe\xaa\x49\x73\xf4\xb1\x22\x3a\x83"
+ "\xe4\x78\x83\xfe\xae\x94\x24\xa1\x0b\x40\xb6\xfc\xbd\x04\x37\x1d"
+ "\x57\xf5\x90\xec\x7a\x52\x4a\x94\x9f\x99\xe5\x3e\x34\xa9\x1c\xe3"
+ "\x9a\x26\xe7\xcb\xa4\x79\x98\xfb\x47\x23\xda\xf9\xbd\x88\xf7\x2a"
+ "\xca\x6f\xf2\x13\x0d\x37\x12\x7c\x26\x1d\xd1\xe1\x53\x23\x6c\x80"
+ "\x32\x9b\x18\xef\x20\xef\x46\xdb\x5a\x6c\x25\x2c\xe6\xb4\x72\xfd"
+ "\xab\xe8\x23\xdd\x0d\x6e\x96\x32\xfe\xeb\xf7\xeb\x7c\xba\x6c\xf7"
+ "\xf5\xab\x4c\x15\x51\x8c\x64\xf3\x64\x33\x52\xe8\x62\x9e\xb5\x08"
+ "\x79\xbc\x27\x38\x87\xb9\x9d\x77\x52\x9a\xfb\xb5\xbd\xec\x78\x6f"
+ "\x99\x85\x1d\xb6\xcc\xc1\x3a\xbe\x7e\x81\x37\x2a\x2e\xf9\x8a\x75"
+ "\x5e\x95\xeb\x17\x68\xf0\x6d\x11\xba\x22\xca\xf5\xd7\xd1\x5e\x42"
+ "\xb2\x01\xec\x23\x44\xa3\x25\xa0\xec\x9d\xfa\xba\xc1\x3e\xd1\x84"
+ "\x3c\x16\x89\x63\xb2\xb1\x27\x5d\x9f\x48\x76\x6b\x04\xff\x20\xd3"
+ "\xc7\xca\x73\x83\xeb\xdb\x07\xe9\x6d\xa4\xa3\x7c\x42\x87\x50\x99"
+ "\xd4\x9d\x15\x22\x59\xc2\xa4\x6e\xea\x9b\x36\x17\xb1\x5f\x4d\x8e"
+ "\x09\xaf\xdb\x49\xf3\xc4\xba\xed\x8e\x5c\x97\x93\x53\xc2\x7c\xea"
+ "\xc4\xe3\xd3\x6b\x99\x75\xb8\x75\x68\x8b\xa3\xbd\x6a\xf2\xb3\x35"
+ "\x35\xbc\xde\x65\x50\xef\x5d\x5d\xcd\x62\x95\x75\x00\x1b\xad\xb3"
+ "\x15\xd9\xe3\xb0\x1e\x5f\x30\xc5\x5e\x9b\x31\xd7\x3e\x9a\x3b\x2d"
+ "\xcc\xb0\xfe\xdc\xe8\x98\x29\x81\x6b\xeb\x79\xd4\xcd\x0f\x3d\x60"
+ "\xa7\xb3\x6f\x17\xfb\x22\x9f\x45\xcd\x05\x96\xbb\x31\x96\xd9\xbc"
+ "\xca\x94\x03\x74\xcf\xfd\x70\x2c\xd1\x22\x53\x0e\x50\x99\xa5\x75"
+ "\x2c\xa6\xb4\x93\x77\xad\x7b\x7c\x54\x0c\xf6\x5f\x33\xf6\x8d\xb5"
+ "\x57\xc7\x5e\x5b\x3f\x80\x32\x5e\xcf\x16\xf9\x86\xb5\xf3\x26\xdb"
+ "\x66\xbd\x7d\xf8\xb6\xd9\xc6\x9f\x52\xac\xf3\xaf\xac\x6d\x37\xf8"
+ "\xc3\x6d\xbb\xc1\xff\x7f\xd0\xb6\xf7\x22\xda\x66\x0e\xb7\x2d\x8f"
+ "\xda\x76\xe2\xca\xda\x96\x3c\x2b\xdc\xb6\xe4\x59\xff\x60\xdb\xf6"
+ "\x8c\xdc\xb6\x29\x4f\x0e\xdf\x36\xc7\xb5\xa7\x94\x29\xab\xae\xac"
+ "\x6d\x53\xed\xe1\xb6\x4d\xb5\xff\x6f\xda\xe6\xac\xe3\x27\x5b\x93"
+ "\x18\xd9\xd3\x8c\x25\x3c\x7f\x4a\xb9\xa1\x62\x55\x92\xd0\xe3\x4e"
+ "\xc0\xfb\xed\x65\x75\xfc\x73\x49\xdb\x4c\xb9\x28\xf7\xb4\x29\x3e"
+ "\xcc\x5f\xa9\x57\xa2\xdc\xe0\x15\x7a\x2e\x51\x13\x76\xf1\x4a\x1e"
+ "\x9c\xe1\x27\x9d\xc1\x20\xd9\x76\x21\x5b\xf0\xf5\xfb\x2e\x04\xc8"
+ "\x0f\x47\xc3\x8e\x73\x46\xb6\xef\x82\xcf\xd0\x57\x75\xc3\x34\xdd"
+ "\x9e\xab\x9e\xd7\xb4\xe5\x72\xf8\xe8\x86\x25\x73\xf3\x98\x89\xf0"
+ "\x11\x3d\xc9\x9f\x66\x8d\x73\x74\xcc\xdc\xaf\x68\xdf\xbf\xc1\xa1"
+ "\xdf\xd7\xd5\xcb\x4a\xef\x1a\xcd\x4d\xa5\x2c\x8a\xee\x0c\x0b\xdb"
+ "\x8f\x16\x1f\x4b\x2e\x65\xa3\xd2\x1d\x28\x3f\xc0\xb2\x4d\x0e\x94"
+ "\x0d\x78\x48\x5a\xfe\x86\x57\xa3\xf2\x59\x6c\x2d\xca\xa6\xe7\x5c"
+ "\x4b\x19\x5f\xfd\x2c\x33\xd2\xdd\x62\xba\x23\x2c\xef\x07\x47\xc7"
+ "\xa0\x1e\xaf\x5e\xcf\xdf\x81\x5f\x9c\x84\xdf\x8d\xaf\x87\xe1\x77"
+ "\xe3\xf2\x30\xfc\x6e\xbc\x43\xc2\xef\xc6\xd4\x30\xfc\x92\xad\x57"
+ "\x06\xbf\x1b\xf3\xc3\xf0\x93\x79\x2f\x0f\xbf\x1b\x7f\x3d\x32\xfc"
+ "\x6e\x6c\x0c\xc3\x4f\x96\x35\x02\xfc\xa2\x87\x87\xdf\x8d\xa1\x7f"
+ "\x0c\x7e\xc9\xd6\x7f\x10\x7e\x63\x25\xfc\xa6\x2a\x61\xf8\x25\xbf"
+ "\x1c\x86\x5f\x72\xb1\x84\x5f\xb2\x2d\x0c\xbf\xa9\xd9\x57\x06\xbf"
+ "\xe4\x3d\x61\xf8\xc9\xbc\x97\x87\x5f\xf2\x89\x91\xe1\x97\x1c\x08"
+ "\xc3\x4f\x96\x75\x65\xf0\x9b\x7a\x17\xe0\x66\xd6\xe0\x67\x1e\x19"
+ "\x7e\x53\xb3\xff\x41\xf8\x99\x24\xfc\x6e\xba\x27\x0c\xbf\xa9\xe7"
+ "\xc3\xf0\x9b\xfa\x8a\x84\xdf\xd4\x86\x30\xfc\x6e\xaa\xbf\x32\xf8"
+ "\x4d\xed\x0e\xc3\x4f\xe6\xbd\x3c\xfc\x6e\x9a\x32\x32\xfc\x6e\x9a"
+ "\x1d\x86\x9f\x2c\x6b\x04\xf8\x8d\x1e\x1e\x7e\x37\xad\xfa\xc7\xe0"
+ "\x77\x53\xfd\xe5\xe0\x77\x65\xb4\xc6\x4d\x23\xde\x7f\xbf\xc2\x72"
+ "\x82\x23\x95\x43\x30\x24\xfd\x44\xb5\xea\xa6\xe0\x76\x35\x3a\x46"
+ "\xde\xe1\xb8\xe9\x00\x78\x98\xbb\x3b\x94\x6f\xdc\xbf\x5d\x1d\x15"
+ "\xc3\x2b\x3f\x3f\xae\x56\x9e\x5c\xc3\x2b\xa2\x8d\x6a\xc5\x68\x23"
+ "\xd9\x33\x18\xd1\xe7\xba\xf2\x8d\x17\xa2\xae\x63\xd7\xd3\x7d\xbd"
+ "\xd5\xa0\xd7\xe8\xbd\xaf\xea\x1b\x07\x40\x8b\xa4\x5d\x0a\x93\x9c"
+ "\xa5\x45\xc2\xd9\x67\x61\x6e\xce\xf2\x82\x9c\x25\x05\x76\xeb\x92"
+ "\xc7\x7e\x56\x34\xd4\x86\xbe\xf0\x93\xb9\x86\xc6\xef\x1b\x81\x41"
+ "\x1b\x33\x95\xdc\x41\xb6\xfa\x6c\x37\x90\x6e\x5a\xca\x6c\xe1\xd7"
+ "\x20\xa1\x24\x89\x0f\x64\x3e\x97\x76\x23\x3f\x24\x6c\x10\x0e\xe4"
+ "\x3d\x07\x7e\xaa\x89\xec\xca\x68\xe7\x50\x4d\xa7\x94\x9b\x7f\xc0"
+ "\xe3\x9d\x42\x7f\x54\xdc\xed\x50\x52\xf4\x3b\x58\xcd\xdc\x6c\x4f"
+ "\x52\x5d\xce\x5d\x7c\x83\xb3\x9e\x60\xd0\x4a\xf6\xdf\x56\x44\x4d"
+ "\xee\x50\xa6\x25\xf2\x78\x7b\x12\x77\xd9\xad\xda\x19\x87\xb0\x7f"
+ "\x97\x56\xc2\x3f\xa3\xf2\x34\x5a\x90\xfc\x96\xb8\x25\x3d\x98\x72"
+ "\xc4\x54\x61\x8d\xa2\xb4\x64\x87\x91\xec\x13\xea\xbe\xaa\xa8\xdd"
+ "\x94\x16\xf4\xf8\xdd\xc8\x7f\x37\xf9\xea\x1c\x2c\x43\xb6\xe9\x9a"
+ "\xd3\xca\x37\x8d\xa2\x2f\xae\xa2\xe6\xde\xa7\x33\x9f\x13\xfe\x22"
+ "\x05\x5c\xbf\x75\x11\x7d\x68\x16\x7e\x3e\x83\x67\x85\x9f\x4f\x2d"
+ "\xcf\x24\xe4\x11\xf8\x94\x6c\xaf\xca\x32\xbe\x75\x42\x6f\x17\x68"
+ "\xe8\x31\x08\xbf\x1d\x51\xc7\xd5\x08\xef\x8f\xf8\x1e\x8b\xf0\x26"
+ "\xd0\xa1\xf1\xda\xf7\xb1\x08\x17\x13\x5d\x2a\xfa\x55\x5d\x2e\x75"
+ "\xa2\x95\x6f\x2d\x46\x9c\x59\x4b\x13\x8f\x34\xf7\x10\xad\xab\x95"
+ "\x91\x80\xf0\x54\xe2\x19\xb5\xef\x89\x08\x5f\x45\xe7\x02\xda\xf7"
+ "\x71\xa7\x95\x9b\xcf\x20\xfc\x0d\xed\x3b\xe8\xfa\x9b\x85\xad\x2d"
+ "\xc0\x9d\x7c\x47\x39\x00\xfb\xb5\x04\x77\xc0\x3a\x91\x9b\x8b\x9a"
+ "\xc0\xaf\x96\xd1\x38\x52\x3f\xdd\x25\xa7\x59\x87\x72\xf3\x75\x74"
+ "\x2f\x4f\x8e\x95\x73\x97\xb4\x0f\x64\xc8\x44\xbc\x85\xe2\x49\xb7"
+ "\x5c\xdd\xe0\x5c\x4b\xef\x80\xe9\x7e\x82\xa1\x56\x17\x78\xa2\x9b"
+ "\xd3\xb4\x71\x06\xec\xc8\x86\x2f\x2b\xdf\xa1\x8d\x05\xda\x36\x1a"
+ "\xdf\xb7\x69\xe7\x1e\x5d\xe9\xc1\x01\x79\xbf\x48\xb9\x39\xef\x7f"
+ "\x64\xb3\x02\xf9\x24\xde\xbb\x79\x97\xee\xc3\x10\x71\xc2\x56\x06"
+ "\xcd\x4f\x92\xaf\xf8\xe2\x8b\x1a\x84\x8d\x16\xcc\x51\x7d\xae\xd0"
+ "\x3c\xe1\xd1\xdf\x70\x4b\x59\xcd\xcd\x83\xf7\x7f\x91\xd7\xaa\xf9"
+ "\x7d\x60\x92\x4f\xf8\x16\x0b\xeb\x17\x7d\x53\xe0\x87\x88\x6f\x49"
+ "\x11\xdf\x74\xbb\x84\xd2\xe6\x54\xd5\xb7\x66\x47\x7c\xab\xbd\xe4"
+ "\xdb\xa2\x88\x6f\x6b\x2e\x29\xd3\x16\xf1\xcd\x7e\x49\xbe\x75\x11"
+ "\xdf\xb2\x2f\xf9\xb6\x2b\xe2\x5b\x86\xf6\x2d\x0a\xf1\xee\x41\x1b"
+ "\x89\xca\x37\xd3\xb4\x78\xe0\xfa\x6f\xb5\x47\xc4\xa7\x6a\xf1\x54"
+ "\xbf\xcf\xcb\x8e\x1d\xd7\xe2\xc5\x3c\xc7\x3c\xba\x49\xd6\x31\x2d"
+ "\x36\xa2\x0e\x26\xc7\xb0\x48\xde\x2f\x56\x52\x1c\x26\xc5\x3a\x9a"
+ "\xe6\x94\xa9\xa2\x9c\x7c\x08\xb9\xa4\x3d\x30\xb9\x0e\x85\x1f\x6a"
+ "\xf2\x95\x8b\x74\x23\xe1\xc6\xe1\x75\x04\xa7\x95\xeb\xf7\x58\x43"
+ "\xae\xa2\x03\xaa\xab\xe4\x28\xf9\x25\x24\xbb\x61\x65\xdd\x64\x3b"
+ "\x46\xf7\x49\xd8\xcf\x3c\xf6\xbe\xf2\xd6\x80\xb8\x6f\x4b\xf7\x21"
+ "\xe2\xc8\xee\x59\xab\x90\xef\x9c\x91\x7e\x09\xe9\x7e\xef\x86\xa2"
+ "\x03\x2b\xbb\x59\x92\xed\xbb\xbc\x93\xf8\x3c\x89\x13\xa6\x11\x3e"
+ "\x31\x69\x38\xed\x59\xa1\xeb\xad\x4c\x4f\xa5\x38\x4f\xb7\x90\x33"
+ "\xc7\x9c\x52\xa6\x97\xeb\xdf\x65\x7f\xa7\x97\x0b\x5e\x5a\xbb\x57"
+ "\xd8\x57\x35\x3d\x65\xd0\x6f\xa6\x32\x7d\xcd\xf9\xf8\xfd\xbb\x10"
+ "\x37\x67\xa8\x7e\xe3\xf4\x87\xa9\x4c\xea\x87\x57\x99\x16\xa0\xb2"
+ "\x91\x26\x7b\x50\xbf\x11\xf1\x2b\x83\x6c\x02\xda\x76\x4a\x2f\x1f"
+ "\xdf\xc1\xff\x4f\x13\x7c\x25\x95\x79\x7e\xc3\x87\xed\x88\xab\xf5"
+ "\x1a\xe7\x3a\xa4\x7e\xe4\xf4\x7a\x2f\xeb\x48\x1d\x69\xff\x13\x32"
+ "\x49\xb3\xd3\xcd\x5d\xce\x66\xac\xf9\x46\x69\x07\xc0\xe9\x96\xbc"
+ "\xfc\xf4\x33\xe4\x8b\x8c\x7c\x78\xd3\xb9\xa3\xc4\x3b\x33\x84\x3e"
+ "\x04\xc5\x01\x36\x84\x9f\xc5\x59\xd1\x95\xad\xc9\xe9\x62\xff\x23"
+ "\xdb\x4d\x74\xe7\x82\xee\x70\xf4\x55\xcd\x58\x30\xe8\xeb\x41\xbf"
+ "\x4f\xa0\xcc\x78\x8a\x64\x7c\x35\xaa\x6c\xe3\xa5\x6d\xa0\xf6\xa2"
+ "\xac\xee\x11\xf7\x52\xb3\xb3\x51\xc8\x41\x37\x16\xbb\xa5\x2e\xd9"
+ "\x8c\x57\xa2\x2c\x13\xbb\x50\xd7\x81\x41\x1f\x17\x48\x53\x4d\x3a"
+ "\xc1\x28\x7f\xb0\x9f\x85\xa2\x8e\xe3\x52\x4e\x3f\xc3\x07\x3c\xd6"
+ "\x58\xd3\xcf\x8c\x5a\xbc\xaf\x35\x18\xa0\xbb\xf5\xc3\xda\xe0\xa2"
+ "\x3d\x52\xd8\x6f\xda\xe8\x6c\xa4\xfb\x13\x33\x03\x7a\x9b\x67\xfa"
+ "\x48\x6f\x9f\xda\x2c\x61\x3b\xf3\xa4\x0e\xc7\xf5\xe7\x50\xb6\xf3"
+ "\x63\xd6\xa9\xcc\x7c\x92\xf4\x5b\x04\x4c\x4a\x74\x9d\xab\x99\x4f"
+ "\x8a\x74\xfd\x83\x69\x84\xbc\x83\xf4\x7d\x09\x4e\xdb\xc9\xee\x00"
+ "\xca\xac\xc6\x58\x08\x3f\xb6\xca\xcc\x97\x85\x7c\x13\xdf\x45\xbf"
+ "\x85\x3e\x5b\x6a\xa2\x9c\x2b\x33\xf7\x78\x95\x54\xab\x9c\x83\x32"
+ "\x8e\x7c\xc0\x93\x1e\x42\x8f\x32\x73\x3d\xf9\x92\x05\x3c\x9a\xc9"
+ "\x76\x5d\xab\x1f\xeb\xc5\xd1\x4f\x73\xa1\x99\x7c\x06\x7a\x95\x99"
+ "\xd2\x97\x95\x99\x60\x3e\xd3\x46\xf5\x13\x6c\xc9\x8f\x2e\x60\x7a"
+ "\xa1\xaf\x2a\x75\x50\xfe\x41\x3e\x7b\x91\x66\x44\xdb\x8d\x04\xa3"
+ "\x10\xda\xdc\x0a\x7a\xd5\x3d\xe1\x63\x6a\xdf\x7b\x6a\x82\xb3\x91"
+ "\xf4\x27\xf1\x2e\x6d\x5f\xb8\xe4\xd8\xc9\x79\x90\xfa\x42\x94\x25"
+ "\x69\x4a\xab\x9c\x0b\xd2\x8f\xb9\x92\x9a\xa1\xc1\x4f\xf8\xbc\x70"
+ "\xad\x90\x70\x90\xe9\x6f\x31\x4a\xb9\x4c\xd2\x37\xd0\xae\xfa\xb0"
+ "\x5c\xe6\x16\xa3\x90\xa9\x69\x3a\xd6\xf8\x76\x30\xa2\xcd\x7e\x71"
+ "\x0f\xf0\x1c\xf1\xd4\xa9\x39\x54\xd7\x7a\xb2\x2d\x46\xf3\xe2\x74"
+ "\xe4\xfc\x4f\x9d\x4f\xed\x24\xdd\xbc\x50\x7c\xb1\x9b\x6f\x28\x26"
+ "\x5f\xda\x6e\xe4\x29\xc5\x5a\x18\xf6\x2e\x1a\xe1\x4d\xf2\x7b\xd2"
+ "\x57\x75\xcb\xb4\x08\xdf\xbb\xd8\x07\x6f\x79\x44\xdf\xe7\x68\x8f"
+ "\x26\x3b\x0f\x83\x71\x1b\xce\x6d\xc1\x7a\x0f\x68\xb4\xd2\x48\xbe"
+ "\xa7\x62\x6b\x66\xb0\x54\xba\x6b\x4c\x7a\xda\x34\xdf\xb8\xf9\xdc"
+ "\x6c\xb2\x9d\x4c\x76\x20\xdd\x25\xb7\xa2\xbd\xb7\x8e\x7d\x66\xbc"
+ "\xb8\xdf\xe8\x77\xcf\x38\x47\x3a\x3a\xdd\xa7\x4a\x85\x7d\xa3\x98"
+ "\x74\x47\x90\xef\x90\xbe\xb7\x7d\x3c\xfe\xdc\x6c\xfa\x26\x7c\x07"
+ "\x50\x99\xff\x53\x3b\xc0\xca\x2d\xed\x1a\x2d\xd3\x8d\xbd\xfc\x5a"
+ "\xf4\x47\xdc\x67\xc4\xfb\xf8\xd3\xca\x6d\xb7\x4b\x7f\x91\xd2\x96"
+ "\xbd\xa6\x6b\x18\x2d\xef\xe7\xfb\x98\xb8\x2f\xad\xdc\xfa\x82\xf5"
+ "\x66\xc6\xba\x95\x5b\x5f\x14\x76\xa5\x5d\xf6\x18\x8d\xce\x8b\xa9"
+ "\x91\xed\x32\x65\x39\x0c\xa2\x8d\xd4\xbe\x2b\x6b\xdb\xad\xfa\x7e"
+ "\x19\xdd\x57\x75\x6b\xa3\x7e\xaf\x5f\xf4\x5f\xb3\x37\xed\xbe\x81"
+ "\xf8\x96\xdb\xa6\xca\x71\xb1\x6b\xbe\x7a\xed\xb1\xff\x07\x75\xfb"
+ "\xb4\xfd\xd0\x2b\x6c\x6e\x03\x2e\x18\x57\x6f\x5f\xd5\x6d\x69\xfa"
+ "\x7e\xaa\xe9\xc8\x4f\x93\xfb\xfc\x6d\x99\xe1\xbd\x54\xc2\x70\xc8"
+ "\x9d\x9d\x65\xcb\xec\x56\x10\xec\xb6\x25\xf6\xc7\xf2\xac\xb9\x85"
+ "\x85\xcb\x0a\xad\x64\xf0\xe6\x12\xbf\x4a\x31\xbc\xea\xb6\x7c\xcd"
+ "\xf7\xdb\xae\x41\xdf\x6f\x55\xb7\x1d\x88\xf4\xc9\xe7\x55\x6e\x6b"
+ "\xfc\xbf\xe1\x6b\x6e\x1b\xf1\x9e\x9f\xcb\xa0\x36\xe0\xd7\x88\x9f"
+ "\x1b\x3f\xf2\xc1\xc3\xb2\x02\x2c\x0d\xfb\xa3\x38\x13\x0e\xdf\x57"
+ "\xbf\x6d\x1d\x9d\x83\x77\x28\xb3\x6e\xd9\xae\x1a\x99\xb0\x6b\x52"
+ "\xa9\x0a\xdb\x9b\x3b\x90\x1f\x3f\x37\x7e\xcd\xf8\x89\x7c\xea\x1b"
+ "\xe2\xae\x6d\x43\xe4\x37\x3a\x9b\xe6\x95\xee\x39\x94\x86\x57\x18"
+ "\x05\x1d\xa2\x6e\x94\xe9\x2e\x69\x83\x81\x57\x4d\x3f\xa0\xa5\x13"
+ "\xb8\x21\xae\x82\x59\x87\x49\x17\xc5\xab\xbe\xe1\xd5\xd2\x89\xbb"
+ "\xef\x7a\x7f\xc8\x76\x3f\xd2\xeb\xe9\x8c\xbc\xea\x16\x9b\x96\x4e"
+ "\xda\x34\xab\x34\x0c\x57\xef\x28\x5e\x79\x21\x49\x4b\x67\x8e\x2c"
+ "\x2f\x22\x4d\xb4\x5a\x35\x79\x1e\xa5\x51\x2b\x8c\xd2\x0f\x4b\xd5"
+ "\x6d\x47\x91\x7e\x58\x9b\xa7\x57\x36\x4e\xb7\x97\x5e\x3a\x4e\xb6"
+ "\xc7\x96\xe6\xde\xb9\xb4\x60\x05\x79\x92\xb2\x2f\x5b\x6e\xa7\x67"
+ "\xc1\x92\x9f\x89\xc7\xb2\xac\xc7\x1f\x93\x2f\xf6\xfc\x54\x7a\xc9"
+ "\xc7\x7c\xa3\x67\xce\x72\x1b\x3d\x1e\x5b\x46\x41\x47\xde\xb4\xe5"
+ "\x8f\xe9\x2e\xbd\x87\xd8\x5d\xea\xab\xfa\x76\xb2\x57\x99\x95\x28"
+ "\xe9\x91\x6f\xa7\x7a\x95\x6f\x88\x73\x60\x53\x85\x97\xbd\x99\x22"
+ "\x7c\xff\xb1\xaf\xd9\x2b\x50\xbe\x7d\x17\xd9\x2b\x30\x55\xd8\x1e"
+ "\x33\x05\x97\xe6\xf2\x0d\x25\x56\xe4\xcd\xf7\xb2\x9d\xda\xdd\x72"
+ "\xbb\x45\xd8\x0d\xad\xba\xfd\xa0\xae\x5f\xa8\xba\x8a\x5a\xc8\x1e"
+ "\xbe\xd0\x37\xda\x28\x6c\xe1\x04\x90\x2e\x71\xfb\x46\xe1\x97\x26"
+ "\x11\xe1\xa3\x08\x27\x21\x6c\x41\x18\xfc\x65\x4e\x26\xdd\x4f\x44"
+ "\xd8\x8a\x70\x32\xca\x6f\xd1\xd7\x45\x24\x6c\x34\x67\x73\x77\x0e"
+ "\xcb\x1f\x0f\xb5\x31\x85\xb5\xf5\x1d\xb3\xee\xcb\x57\xf8\xed\xad"
+ "\xfa\x8e\x75\xd0\x6f\xaf\xf0\xe5\x64\x5e\x2c\xf6\x35\xb1\xb7\x7f"
+ "\x67\x5b\x94\x65\xd2\x0a\x49\x87\x7f\x67\x81\x6e\x93\x41\xd2\xd9"
+ "\xdf\xc9\x8c\xf0\x79\x4c\xe1\xbc\x41\x9f\xc7\xd2\x2e\xd9\x73\xc2"
+ "\xee\x91\xf2\x9d\x06\x5e\xf5\xed\xf6\x41\xff\x74\x55\xdf\x71\x45"
+ "\xfa\xa7\xf3\xe2\x3b\xf1\x37\x88\xdf\x15\xde\x07\xbf\x33\x87\xea"
+ "\x1c\xce\xbf\x33\xf8\x73\x47\x56\x31\x68\x71\x3c\x05\x5d\xae\xd1"
+ "\xc0\x14\xcf\x2b\xd3\xc8\xbe\x8d\x95\xbe\x11\xed\x37\xac\xcc\x81"
+ "\xfc\x2b\x2a\xb3\xef\x21\xbb\xbb\xbe\xb2\x1c\xe5\xc6\xed\xa4\x83"
+ "\x84\xb0\xb4\x1b\xc9\x7b\x94\xd9\xe2\x1e\x9b\x6e\x53\x2e\xf2\x4e"
+ "\xfc\xb0\x77\x0f\xde\xd7\xcf\x8c\xf3\x97\x99\x82\x4b\x72\x25\x1d"
+ "\x37\xfb\xd7\x12\x97\x16\x77\xca\xfd\x7e\xf6\x3a\xfe\x90\xf4\x77"
+ "\xe2\x55\xee\x30\xd3\x7d\x24\x93\x92\xbf\x8c\x23\xaf\xc9\xb1\x24"
+ "\x57\xc4\x21\xdd\x6a\xd0\x5a\x5a\xfb\x9e\xf2\x24\x75\x31\x7e\x21"
+ "\x24\xef\xfa\x2b\xb3\x6d\x3f\x99\x54\x4e\xf5\xc4\x08\x3a\xe2\x7d"
+ "\x16\x4b\xbe\x02\xa9\x6d\xdb\x23\x6c\xde\xd5\x20\x8e\xf4\xb1\x7a"
+ "\x1f\x62\xc2\xee\xaf\xd6\x16\x9b\xf0\x55\x56\x75\x47\x8c\x6e\x33"
+ "\xc7\x8b\xb8\x4b\xfb\xf3\xd0\x0f\xc5\x0a\x99\xfa\xd8\xb4\x8c\xf9"
+ "\x78\x9b\xa6\xb9\xb9\x8d\x9c\x3b\x49\xbd\x09\xa5\xa9\xbd\x7b\x7f"
+ "\xbe\x52\xf8\x89\xac\xba\x23\x13\xe3\x14\x14\xe3\xbd\xfa\xc7\x5f"
+ "\x12\x6e\x11\xfe\x13\xe9\x5e\xa1\xea\x47\xbd\x73\xee\x17\xf6\x75"
+ "\x0d\x92\x5e\x14\x76\xed\xaa\xee\x48\xe2\x09\x45\x8d\xd2\x47\x6c"
+ "\x49\x23\xc6\x4f\xec\xfb\xb4\x36\xc4\xfd\x49\x33\xf5\xfd\x8e\x06"
+ "\xe0\xd4\xb9\xf8\xfd\xab\xf4\x0f\xf3\xe3\x2f\xf5\x72\xc9\x7e\x14"
+ "\xe6\x96\x15\x4f\x33\xea\x6f\x1f\xd4\x11\x1a\xbc\x93\x79\xc7\x45"
+ "\xb2\x6d\x35\x78\x3f\x57\x99\x73\xbb\xa4\x2b\xef\x34\x7a\xd9\x4d"
+ "\x2e\xb9\xbe\xef\xc4\xfc\x6f\xd6\xee\x66\xdd\x09\xfe\xf7\x9f\xb3"
+ "\x87\x96\x71\x67\xae\x2e\xfb\x90\x63\x77\x67\x1a\xe6\xe2\x5c\xfc"
+ "\xfe\x15\xe9\x17\xea\x3e\xb2\x57\x1b\xc4\xdd\xa2\x53\x51\x16\x96"
+ "\x8a\xf8\x1c\x3d\x7e\x94\x92\x06\xd8\xdc\x69\xd7\xf1\x49\x6f\x42"
+ "\x71\x0b\xc2\x6b\x40\xa7\x07\xb5\x30\xf8\x9f\x3b\x6b\xf5\x30\xde"
+ "\xeb\x75\x7c\x43\xfc\x59\xef\xd3\x99\xcf\x12\xff\xf7\x98\x05\x34"
+ "\x99\x85\xf8\xab\x3b\xc1\xff\xfe\xb9\x5c\xe6\xfd\xc0\xd7\x5b\xf9"
+ "\xce\x34\x7f\x42\x4f\xaa\x1f\x38\x14\xdf\x8e\x7b\xd9\xef\x16\x6b"
+ "\xe5\x74\x79\x8d\xf3\x8f\x86\xc7\x23\xca\x04\x18\x1f\x95\x7d\x9a"
+ "\x63\xc5\x7b\x3b\xf9\x2b\xef\xab\xfa\x27\xb3\x57\xf9\x76\x40\xa4"
+ "\x5b\xd1\x5d\xbf\xae\xdf\xbc\xc8\x03\x0e\xde\xfd\x38\xcd\x95\x7f"
+ "\x12\xf7\x93\xd7\x97\x98\x33\x88\xe6\x23\x3b\x04\xc2\x3e\x19\xd9"
+ "\x9c\x0c\xb2\x68\x61\xe7\x7f\xc3\xb1\x2e\x61\xdf\x7e\x65\x4a\xac"
+ "\x6e\x6f\x12\xeb\x34\x8f\x1b\xf6\xda\xc9\x06\xa5\x90\xa5\xf5\xa5"
+ "\xc4\x09\xbb\x93\x9a\xbd\xc9\x6d\x2b\x58\x62\x9d\x2a\xed\x4d\x0a"
+ "\x1b\x05\x97\xb1\x39\xc9\x2b\xbf\x98\xa5\xdb\x9c\x04\x1c\xe8\xee"
+ "\x61\x0a\xbf\x10\x0c\xe0\x99\x1c\x61\xeb\xc6\x38\xac\xfd\x49\x03"
+ "\xf0\xa6\x41\xda\x9f\xbc\xb2\xfd\xe6\x9f\xba\xe5\x3c\x99\x33\x4d"
+ "\xf7\xe1\x1d\x11\x97\x86\xf5\xa2\xd1\x39\x77\x04\xb4\xb8\x45\x5e"
+ "\xf6\x56\xf7\x20\x6d\x06\x7c\x47\x32\x45\x7c\x2f\xe5\x65\x79\xcf"
+ "\x46\xae\x2b\x26\xfe\x68\xeb\x1e\x85\x7d\x39\x1a\xbf\xd1\xf4\x5b"
+ "\x30\x88\x3f\x2e\xf0\x76\xe2\x11\x4c\x0a\xf6\x1b\x47\x14\x4f\x0f"
+ "\x06\xa3\xb2\x82\xca\x51\xa2\x3d\xe9\xce\x75\x7a\x28\x48\x77\xff"
+ "\x8d\xe9\xa1\x5e\xf2\xaf\x79\x94\xee\x92\xd5\x3c\x4e\x77\x1b\x27"
+ "\x73\xf2\x53\x93\x1e\x3a\xcb\x77\xc8\x3b\x9b\x6d\x9a\xcf\xcc\x96"
+ "\xd0\x0a\xde\x8c\x71\x88\x25\xbe\x83\xec\x6f\xc5\x29\x01\x16\x67"
+ "\x8b\x3a\xf4\xe0\xf9\x43\x9c\x6c\x6f\x91\x8f\x32\xb5\x2a\x00\x5c"
+ "\x69\x55\xb2\x82\x51\xe5\x9e\x60\xa7\xf0\x13\x90\x1e\x1a\xcd\xd3"
+ "\x1d\x77\x71\xe1\x5b\x6c\x05\x6f\x02\x9e\x8d\x12\x3e\xb4\x8b\x79"
+ "\x2f\xde\x63\xd2\x8b\x7b\x39\xf9\xf7\x44\xd9\xcd\xe9\x41\xb5\x3f"
+ "\xdd\xa1\x96\x65\x39\x14\xe4\xfb\x1c\xf9\x3e\x47\x7b\x52\x51\xa6"
+ "\x19\xe1\xbb\xf9\x8e\xc7\xe9\x0e\x54\xb9\xe0\x7d\xd0\x47\xb7\x76"
+ "\xaf\xb4\x91\x7c\x7a\x92\x9d\xf1\xac\xa0\xbb\x7c\x87\x76\x4f\x54"
+ "\xf8\x96\x75\x0c\x70\xad\x9e\xd9\xe9\xc5\xec\xee\xac\xe2\xc9\xe2"
+ "\xbe\x29\xdd\xa5\x4a\x0f\x5a\x51\x67\x39\xc1\x23\x56\xf8\xf3\x16"
+ "\xf7\xa9\xee\x6a\xbf\x9c\x7f\x4f\xd2\x13\x29\xba\x8e\x19\xe8\x7e"
+ "\x46\xe8\xb7\x05\x6d\x64\x0b\xac\xcc\xc7\x03\x24\xf7\x3b\xd4\xdf"
+ "\x6e\xb0\xae\x30\x02\xaf\xde\x15\x6a\xb5\xa5\x0e\x7f\xa7\xae\xda"
+ "\x96\xcf\x37\x95\xce\xe2\xd5\x45\x0b\xf0\x3c\xc0\x5d\x25\x74\x67"
+ "\x50\xe1\xd5\x2b\x92\xf9\xa6\x55\x88\x2f\x66\x78\x1e\xe0\xd5\x4f"
+ "\x1f\xe7\x9b\x9c\x08\x3b\x1b\xf1\x44\x38\x63\x27\xd2\xa7\xf2\xea"
+ "\x87\x12\xf1\x6c\xe0\xd5\x3f\x5c\x83\x74\x08\x2f\xf2\xe3\x89\xf0"
+ "\xbf\xe4\x20\x1d\xc2\xff\x7a\xf4\x94\xf2\xdd\x66\xbc\x23\xae\xa2"
+ "\x56\xd6\xb5\xa6\x5e\xd4\x55\xfd\xf3\x3d\xb2\x8e\x5f\x36\xca\x3a"
+ "\xd6\x37\xc9\x3a\x5c\x6d\xb2\x8e\x1f\xcd\x43\xba\xd9\xbc\xfa\xc7"
+ "\xa9\x78\x36\xf2\xea\x47\x92\x90\x0e\xe1\xac\x18\x3c\x11\xce\x46"
+ "\x5d\x4e\x84\x1f\xf5\xe2\x89\x70\x4e\x0b\xd2\xcd\xe1\xd5\x8f\x1f"
+ "\xc4\xf3\x20\xaf\xce\xa3\xf2\x11\x7e\xa2\x0e\x4f\x84\xf3\xd7\x21"
+ "\x1d\xc2\x05\xa5\x78\x22\xfc\x0c\xfa\x54\x9a\xc6\xab\x37\xb9\xf0"
+ "\x74\xf3\xea\xff\x40\x7d\xab\x10\xde\x12\xc0\x13\xe1\xe7\x90\xdf"
+ "\x89\x70\x5d\x36\x9e\x08\x6f\xa7\xbe\xce\xe3\xd5\x3b\xa8\x9e\x26"
+ "\x5e\xfd\x6b\xea\x33\xc2\xff\x39\x07\x4f\x84\x77\x52\x7b\x10\xfe"
+ "\x2d\xe5\x43\x78\x17\x60\x50\xba\x80\x57\xff\x6e\x16\x9e\xcd\xbc"
+ "\x7a\xaf\x11\xe9\x10\x6e\x38\x8a\x27\xc2\x2f\x01\x86\x4e\x84\xff"
+ "\x60\xc7\x13\xe1\x57\xa8\xbf\x0b\x79\xf5\x41\x0b\x9e\x2d\xbc\xfa"
+ "\xb5\x6e\xa4\x43\xf8\x75\x37\x9e\x08\x37\x01\x7e\x4e\x84\xff\x9c"
+ "\x87\xe7\xf0\x7e\x82\xaa\xdf\xf1\xf2\x8a\x68\xc6\xab\x3f\x34\xf3"
+ "\x8a\xd1\x78\xb6\xbb\x79\xc5\xa8\x14\x5e\x7d\xdc\x86\x78\x3c\x3f"
+ "\xda\x83\xf0\x34\x2d\x8c\xe7\xc7\x5b\x10\x4e\xd5\xc2\x78\x7e\xb2"
+ "\x06\xe1\x59\x5a\x18\x4f\x2f\x85\x01\xe3\x13\x74\xce\x41\x4f\x23"
+ "\xc2\x73\xb4\x30\x9e\x9f\x67\xe0\x19\xe4\xd5\x7f\x9d\x83\x78\xc0"
+ "\xea\xaf\x41\x84\xf1\xfc\xec\x20\xc2\x80\x85\xd7\x8a\xf0\x3c\xdf"
+ "\xd4\x9f\x09\x9d\x26\x75\xfc\xbd\x3e\x3e\xbe\xbc\xa1\xec\x3c\x33"
+ "\xd0\x1c\x25\x7f\x14\xd6\x15\x6c\x72\x87\x92\xf6\x7c\x83\xd3\x6b"
+ "\xa0\x34\xa1\xcd\xa5\xa9\xea\xf8\xd2\x06\xc4\x47\x23\xdd\xe8\x53"
+ "\xca\x3d\xef\xd1\xfe\xea\x29\xf5\x0a\x9f\x78\x9a\x5d\xbb\x68\xe4"
+ "\x39\x02\x7a\x62\x36\xf9\x46\x07\xbc\xf2\x79\xe5\xa8\x73\x78\x76"
+ "\xf3\xca\xab\x3b\x00\x2f\x84\xe3\xdf\xc7\x13\xe1\x6f\xff\x12\xf0"
+ "\x42\xf8\xc7\xf7\xe2\xd9\xdd\x57\x75\xcf\x34\xaf\xf2\x5d\xa1\xe3"
+ "\xc2\xf7\xfe\xdc\x66\x0a\x72\xe0\x23\xec\xd5\xbf\xde\xed\x33\x05"
+ "\xdd\x98\xef\xd5\x6d\x26\xb2\xcf\xf6\x7c\x3e\xda\xba\x90\xec\xca"
+ "\x11\xff\x13\xcd\x07\x92\x0d\xb2\xee\xab\x79\x87\x72\xcf\x8f\x48"
+ "\x6e\xca\xc7\xe7\x8c\xf4\xbd\x58\x7c\xbf\xe1\x77\x36\xf9\x3d\x86"
+ "\x85\xbf\xff\x98\xbe\x3f\x6b\x22\x59\xf7\x4d\x8f\x89\xef\x1e\x7f"
+ "\x97\xd6\xaf\x28\xfa\xf6\x32\xa5\xf5\x2a\xf7\xb4\x4b\xd9\x57\xda"
+ "\x71\x5e\x19\xc5\x7a\xcd\x25\xc7\xd1\xf6\x2e\xaf\x72\x57\xa7\x26"
+ "\x87\x6c\xe1\xe6\xa2\x36\x69\xc3\xc0\x39\x92\x7d\x95\x18\xb5\xb6"
+ "\x36\x73\x7d\x25\x6f\x23\x7e\x16\x7b\x90\xc1\xea\x4c\x6e\xec\x50"
+ "\xe6\x1e\xd8\x46\x72\x8a\xc4\xdd\xa9\x74\xcf\xa8\x43\xb9\xb7\x78"
+ "\x60\xe3\xd3\xc9\xd6\x12\x13\xea\x9f\xfb\x72\x59\x80\x9f\x77\x3b"
+ "\xef\xc5\x5e\x29\xe2\xb3\xa5\xee\xba\x78\x5f\x28\xf5\x8d\xc4\xfb"
+ "\x6c\x29\x73\x9d\x7b\x80\xf2\x46\xf2\x0f\xa1\x5f\x46\x75\xaa\xe3"
+ "\x77\xa7\xc9\xf3\xb2\x7b\x57\xbd\xaa\x7a\x0d\x26\x3b\x1b\x65\x2d"
+ "\x39\x84\xf2\xef\x6d\x1a\xc2\x6b\x0e\xa6\x15\xdf\x5e\x78\x0d\x69"
+ "\xb7\x0a\xb9\xd0\xbd\x47\x75\x99\x32\x47\x1f\x7e\x25\xe9\xac\x34"
+ "\xda\x17\x25\xbd\x38\x77\x11\xd9\xd7\x0c\x26\xae\x4f\x0b\xd6\xde"
+ "\xeb\x0d\xd5\xee\x4e\xe5\x9b\x77\xa7\xc5\x05\x15\x26\xf5\xfe\xe7"
+ "\xfe\x62\x66\x80\xe4\x75\xef\x50\xda\x7b\xd4\x31\x71\xb3\x66\x38"
+ "\x98\xc1\x5d\xf8\x31\x85\x2b\xf8\x2f\xaf\xcb\xf4\x74\xb7\x33\x77"
+ "\xa1\x28\xab\x9c\xff\x32\x75\xa1\x3a\x26\xb9\x76\x3b\xd1\xb9\x0e"
+ "\x92\x33\xbd\x4f\xf1\xa3\x30\x2e\xe0\x27\xe6\x66\xeb\x6d\x21\x3f"
+ "\x03\xeb\x01\x3b\xa2\x41\xe9\x9e\x76\x56\x28\x44\x36\xa5\xd6\x7a"
+ "\x01\x07\x39\x5e\x73\xe7\x11\xce\xd7\xea\x7d\x56\x4d\x78\xda\xdc"
+ "\xba\x98\xce\x64\x63\xc8\x46\xcf\x79\x71\xaf\x33\x48\xbe\x01\x69"
+ "\xaf\x95\x69\x23\xc7\x6e\xa9\x76\x9f\x75\x69\x81\xbd\xf0\x29\x6b"
+ "\xd1\xd2\x92\xdc\xbb\xa6\x2e\x9f\x66\x2d\x74\x58\x0b\x85\x7f\x6d"
+ "\x11\x91\x33\xcd\x5a\x94\xbf\xcc\x6e\xb5\x17\xdb\x72\xbf\xee\x6b"
+ "\xd8\xc2\xcd\x25\xdd\x92\x36\xbc\x5f\xda\x00\xa8\xdf\xdd\x65\x2f"
+ "\xe5\xaa\xf5\x86\xd1\xa0\xfd\xe7\x2d\xba\x18\x3d\x97\xee\xe6\x98"
+ "\xd5\x4a\x2b\xd3\x7c\x80\xc7\x3e\x9b\xc0\xe8\xfe\x48\x4c\x5f\xd5"
+ "\xbc\x85\xe1\x73\x96\xfb\x6b\xa5\x1c\x64\x5e\xb6\x57\xb9\x57\xd8"
+ "\x34\xab\xd5\xed\x7e\x69\xdf\xe4\x39\xc5\xbc\x72\x2f\x7b\x5e\xda"
+ "\xb2\xab\xdf\xbd\x40\xd2\x94\xf3\x84\xdc\x8a\x5b\x77\x77\xf1\x9d"
+ "\xf9\x64\xf3\x4a\xa1\xb9\x2a\x7c\xf2\xb2\x73\xe2\x8e\x2b\xd6\x5a"
+ "\x06\xdd\x2f\x0f\x6d\x2e\x6b\x53\xc7\x57\x67\xa8\xbf\x7d\xb2\xa1"
+ "\xec\xd7\xcc\xb0\x0f\xb8\xc0\x68\xc5\x7a\xb8\x81\x4d\x3e\xe4\xec"
+ "\x32\xa0\xcd\xaf\x1f\x72\xb6\x1b\x78\x6d\xf9\xae\xde\x64\x67\x7b"
+ "\xa0\x52\xd8\x07\x45\x19\x01\xf6\xe7\x79\x8c\x78\xa3\x46\xff\xb8"
+ "\xcd\x01\xff\xb8\xb2\xc6\xc0\xa6\x1d\xd9\xee\x1b\x6e\x65\xf3\xbf"
+ "\xc9\xcf\xbe\xd5\x44\x32\xac\xfb\x4b\xdf\x9a\x47\x32\xc4\x92\xce"
+ "\x80\xb9\xa4\xcb\xbf\x79\x3d\xe9\xf8\xf9\x2e\x6e\xde\xd1\xd0\x3f"
+ "\xbe\x32\xf5\x30\xd2\xbc\x03\xde\xe1\x5d\x2b\xe6\xef\x14\x66\xb8"
+ "\x78\x53\x7e\xda\xbe\x7e\x97\xa1\xb9\x69\x8e\x94\x7b\x66\x63\xcd"
+ "\x88\xf9\x34\x3f\xf7\xad\x03\x4d\x0c\x75\xb3\x7d\xfd\x0b\x0c\x7f"
+ "\x9e\xfd\xb5\xef\xff\xfe\x56\x6a\x13\xeb\x23\x9b\xad\xe0\xd1\x5e"
+ "\xfb\x78\x0b\xe3\x9b\x37\x99\x5f\x2c\x09\x18\x16\x7b\x99\xe1\x48"
+ "\xfb\x16\x56\x7a\x92\x8d\x0d\x9e\x4d\x31\xfe\x0e\xf9\x2f\x92\x2d"
+ "\xc4\x77\x2d\xc2\x26\x1a\x76\x17\x55\xdc\xeb\x03\x7d\xa2\x9e\x4d"
+ "\x89\x6e\x5d\xe4\x66\xf8\xfe\x68\xf0\x9f\x2d\xec\x48\x9e\x8f\x79"
+ "\x32\xeb\xd9\x45\x43\x1a\x7b\xe5\xdf\xea\xd9\x56\xf0\x07\x5b\x7b"
+ "\x58\xac\x3c\xcf\x4d\x89\x0e\x0e\xa4\x18\x83\x4f\xa7\x90\x8d\x1a"
+ "\xce\xcf\xa6\x8c\x21\x9a\x34\xb8\x2c\x25\xa6\xd5\x57\xcf\x66\x76"
+ "\xb1\x94\x8b\x06\x66\xba\xf8\x74\xca\x98\x56\xdb\x16\x94\x05\x62"
+ "\x13\x70\x25\xfb\x58\x64\x37\x8b\xe0\x74\x75\x26\x5b\xd4\xad\xcc"
+ "\xbf\x6b\xcc\x51\x36\x8e\xec\x33\x92\x7d\x35\xb2\x11\xab\x26\x6e"
+ "\x32\x87\x12\xd7\xb7\x39\xcf\x93\x3d\x91\x00\x03\xae\xcc\xb0\x4a"
+ "\x1f\xe4\x0a\xf5\x59\xe5\x29\x63\xb2\xe8\xb9\xb1\xe8\x51\xa2\x95"
+ "\xd5\x3e\x0b\xf9\x4e\x8a\xa1\x76\x62\x9d\xc6\xac\x3a\x01\x58\x96"
+ "\xa5\x18\x91\x2e\x16\xf1\x71\x9e\xee\x00\x0b\x4d\xff\x79\xf6\x0c"
+ "\x9b\xf0\x91\x9b\xb8\xdd\xc9\xcc\x2e\x27\x4b\xb4\x7e\x5b\xcc\xa5"
+ "\x47\x42\x2f\xfe\x3c\x83\x57\xfd\xeb\x6c\x5e\x61\x4c\x92\x71\x0b"
+ "\xee\xb2\x7e\x8f\x31\xeb\xad\xf4\x7e\xdf\x49\xeb\x9d\x18\xc3\xc4"
+ "\x5a\x9b\xa0\xe3\x05\xcf\x77\xdf\x47\x72\x8e\xdf\xf7\xde\xc5\xe8"
+ "\x5f\x97\xaa\x55\x47\xb7\xa8\x15\x46\x2b\xf9\xd2\xee\x51\xee\x7b"
+ "\x99\x57\x9f\x09\xf0\xda\x1d\x62\x2e\x22\xbc\xff\x62\xf4\x43\x5e"
+ "\x5e\xdd\xb3\x18\xe5\xa7\x5d\x54\x8c\xed\xf8\x1d\xd7\xf2\xef\xa2"
+ "\x7e\x87\x76\xe6\x37\x53\xbf\x85\xbf\x1d\xf4\x2b\x0b\x63\xc6\xc7"
+ "\xd7\x5a\x85\x0d\xfa\x01\xc0\x57\xf3\x47\x4a\xf0\x20\x18\xa8\x03"
+ "\x29\x63\x44\x5f\x07\x52\x62\x01\x5f\xb2\xc5\x6a\x72\x2e\x41\x9e"
+ "\xcd\xb5\xb3\xf0\x2d\xee\x62\x62\x6d\x1e\xf9\xbd\xf2\xd8\x7c\x2c"
+ "\xb4\xa9\x36\x95\x6c\x8d\x3d\x5b\x82\x35\x37\xae\xd6\xca\x37\xd5"
+ "\xce\xd1\xd6\x16\xa3\x76\xaa\xd5\x3d\xbb\x2e\xd2\x5d\x01\xb4\x0d"
+ "\xed\x6b\xc7\xef\xb8\x57\xb9\x6f\xda\xc5\xa9\xf9\xed\x78\x32\xb4"
+ "\xd5\xca\xab\x96\xe5\xd1\x3b\xbe\x59\x01\x9b\x71\x04\x07\x82\x87"
+ "\x84\xc5\x82\xb1\x61\x58\x6c\xdd\xe9\x55\xbe\x17\x54\xab\x3c\xa8"
+ "\xe3\xbe\xe3\xbc\xea\x89\x94\x88\x74\xb7\x87\xd3\xfd\xd7\x02\x99"
+ "\xee\xa3\x6e\x99\xce\x5e\x8f\xef\xef\x49\x78\x2f\x28\xfe\x3a\xbc"
+ "\x17\x3c\x15\xce\x5b\xe3\x93\x79\x9b\x4a\x65\xde\x2c\xca\xfb\xc2"
+ "\x25\x6d\xfa\x75\x38\xfd\x2f\x93\x65\xfa\x43\xd3\x64\xfa\x7f\xcb"
+ "\x8f\x48\xf7\x76\x38\xdd\xa6\x06\x99\xee\xed\x26\x99\x2e\xa7\x05"
+ "\x73\x63\xd4\x30\x6d\x09\x85\xf3\xbc\x34\x4b\xe6\xe9\xf4\xca\x3c"
+ "\x65\x8b\x91\xe7\xf6\xa1\x6d\xb9\x7f\x7a\x38\xfd\x8b\x5a\xbf\x3f"
+ "\xb3\xc9\xf4\x25\x31\x11\xe9\x1e\x96\xe9\xe8\xfb\x69\xa4\xbb\xaf"
+ "\xed\x62\xf4\x2b\x16\x99\x6e\xcd\x2e\x9a\x8f\x48\xb3\x5c\xad\xca"
+ "\x6c\xbe\x18\xfd\xf0\x01\x94\xd3\x84\xb1\x49\xa2\x27\xc6\x2e\x49"
+ "\x75\x95\x74\xe2\x7d\x0e\x9d\x6b\x10\xce\xf5\x2a\xf3\x92\x80\x77"
+ "\x43\xc3\x9f\x99\xde\x7f\x60\x50\x8e\xa6\x82\x7e\xd8\x54\x3a\x3c"
+ "\x8d\xbe\xb1\xf0\x28\xe9\x3a\x10\x4e\x39\xa5\x7c\x7f\x2a\xd9\xa0"
+ "\xe3\x65\x0b\x34\xd9\xd5\xfd\x82\x57\x23\x1b\x10\x24\xdf\x94\x71"
+ "\xdf\x97\x32\x4f\xcc\x4d\xf0\x9a\xc2\xee\x1f\xc9\x33\xb1\x47\x35"
+ "\x7b\x95\xef\x13\xbd\x34\xea\x19\x83\xda\x80\x5f\x23\x7e\xee\x67"
+ "\x48\xce\x59\xc9\xe6\xeb\x32\xe0\xe1\xdb\xfa\x7d\xec\x7f\xbf\x6d"
+ "\x09\xcb\xc1\xbe\x0f\xd8\xdd\xdf\x7c\xe5\x7a\xc2\xdf\xff\x9a\x4c"
+ "\x66\x88\x6f\x69\xa2\x95\x36\x97\x66\xb8\x54\xe9\xaf\x1e\x6b\x11"
+ "\x74\xde\xf7\xdf\xc4\x9e\x5f\x2e\x6c\xcb\xd6\x56\xb7\xa9\xc9\xd8"
+ "\x4b\xce\xb0\x28\x4f\x69\x17\x6b\x50\xbb\x0c\xae\x7e\x66\x6c\xc5"
+ "\x7e\x4a\xe9\x1b\x40\x3b\x58\x0b\x88\x86\xfa\xfe\xa7\xae\x0b\x5a"
+ "\x79\xf5\xbb\x7d\x65\x4f\x4a\xbf\xdc\x44\x6f\xd2\x1e\x04\xbc\x13"
+ "\x2b\x7c\xb5\x15\x8c\x46\xda\x7f\x8e\xc7\x7b\x0c\xa5\xbd\x78\xd3"
+ "\xcf\x6c\x17\x7f\xb3\xdb\xd7\xbf\xb9\x22\xb5\xff\xa6\x82\x8c\x81"
+ "\xf1\xd5\x6d\x03\x9b\xd7\x67\x04\x7f\xb3\x3b\x3b\x78\x53\xbe\x2f"
+ "\x34\xbe\xa2\x01\x75\x63\x7f\xda\x62\xd8\xab\x36\x18\xf6\x3a\xdd"
+ "\x06\x2a\xf7\x90\x73\x97\xe1\x35\x67\x9b\xe1\x35\xb5\xd1\x70\xc8"
+ "\xe9\xc2\xb3\x9e\xfc\x76\x81\xae\xfd\xe7\x25\xaf\x39\x9b\xb1\x3f"
+ "\xfe\x73\x3d\xe0\x55\xaf\xcb\x5b\xf9\xbd\x41\xd6\xba\x2b\xc8\xde"
+ "\xb4\x9f\x67\xbe\xf8\x92\x6e\xfc\x7c\xbe\x71\xb5\x99\xbe\x71\x3b"
+ "\xb2\x45\x9b\xc7\x6f\x12\x7d\xa4\x3b\x5f\xaf\xa9\xb2\xcd\x1a\x3c"
+ "\xa8\xcc\xb7\xb7\xd3\x59\xac\x6e\x77\x57\x59\xb8\xe6\x6b\x76\x77"
+ "\x0d\xd2\x67\xdc\xa0\xed\xdd\xff\x2f\xec\xee\x6a\x72\x09\xb2\xbb"
+ "\x0b\x5e\xb8\x4d\xe3\x85\xdd\x9a\x8d\xa5\x58\xe2\x7f\x85\x8d\x25"
+ "\x87\x5b\xd8\x49\x12\xe7\xff\x9b\xd6\x35\x10\x1d\xda\x57\xb5\xd0"
+ "\xad\xf3\xb9\x44\x5b\x85\x36\x94\x04\xf1\x0b\x20\x1e\xf8\xcf\x37"
+ "\x4f\x8f\xe7\x9b\xe7\x12\x1f\x11\x15\xe2\x79\xdf\xed\xa3\xfb\x4c"
+ "\x3c\xef\xee\xd0\xa6\x32\x77\x68\xd3\x8e\x34\xc4\xcd\xc1\xef\xae"
+ "\xd0\xa6\xb9\x7e\xfc\x02\xf8\x05\x43\x9b\xe6\x01\xf7\xce\x33\xe2"
+ "\x17\x83\x9f\x19\xbf\x44\xfc\x2c\xf8\x25\xe1\x67\xc5\x2f\x59\xdd"
+ "\x34\x8f\xec\x16\x2b\x7c\xf3\xbc\x54\xcc\x03\x8b\x5e\x6e\x18\xde"
+ "\x0f\xdc\x85\xfe\xa7\x11\xdd\xc7\xe3\x7a\x12\x39\xd9\x3e\x7b\xfe"
+ "\x67\x01\xd1\x7e\xc2\xcb\xcf\x3b\xdb\x7d\x53\x76\x7b\x7d\xe3\x36"
+ "\x79\xf1\x5c\xe0\x8b\xdf\x97\x87\x9f\x0d\x3f\x87\x6f\x53\xad\x0d"
+ "\x63\xba\x00\xdf\xc0\xcb\x3f\x00\xbc\xbc\x48\x93\xcf\x3d\x00\x3c"
+ "\xb7\xa8\x41\x7b\x3f\xe8\x55\x7e\x20\x6c\x12\x20\x9d\x1b\xe1\x16"
+ "\xaf\xf2\x90\x48\xd7\x3b\xbe\xb6\x5c\xbb\x0b\x55\x8e\xf8\x4e\xaf"
+ "\x31\x2b\x46\xa6\x5b\x4f\xf2\x3a\x2a\x33\xa0\xaf\xc3\x21\xfe\x39"
+ "\x1e\xb3\x65\x3d\xb9\xc4\x91\x55\x94\xbf\xf4\xb1\xdc\xa2\x3b\xad"
+ "\x53\x73\xac\x29\x4b\x0b\x9f\xca\x7a\x6a\x79\xee\xf2\x5c\x41\x42"
+ "\x22\xea\x9b\x43\xce\xa9\xc8\x0f\x33\x0b\x82\x1f\x8a\xeb\xe4\x9c"
+ "\xf6\xee\x85\x7e\x8c\xd1\x0d\xbb\x7d\x07\x7b\x7c\x86\x10\x68\xb8"
+ "\xd8\xce\x72\xac\xcd\xea\xb6\x83\x3d\x01\x43\x6c\xa7\x95\x71\xac"
+ "\x07\xfa\xe6\xe9\x6c\xd3\x68\xba\xf7\x59\x0b\xd1\x74\x48\xb3\xb7"
+ "\x20\x60\x78\x90\xf2\xff\x36\xdf\xb7\x0f\xef\x88\xcb\xa0\x7c\x1c"
+ "\x74\x9e\x78\x82\xce\x93\xe1\x8a\xd4\xd7\xc4\x73\x7d\xc6\x6b\x22"
+ "\x5d\x45\xc3\x21\x7a\x5e\x28\xe5\x2d\x28\x97\xe4\x75\xfc\xb7\x3f"
+ "\xb3\x89\x34\xbf\x2d\x90\x69\xb0\x16\x3b\x94\xf4\xb5\x94\x4e\xf0"
+ "\x56\x68\xe3\x3e\xb4\xa3\x6c\x39\x33\xea\xeb\x9b\x78\xa9\xc1\x35"
+ "\xbe\x82\x68\xde\x07\xbf\xa2\x35\x4e\xed\xe1\x58\xd3\x2f\x22\xef"
+ "\xde\x02\x9f\xc8\x0f\x1e\x33\x8a\x78\x4b\xc2\x23\x84\x3f\x3c\xa5"
+ "\x6d\x22\x7f\x83\xda\x66\x20\x7e\xac\x47\x49\xbf\x85\xbe\xd5\x81"
+ "\x4e\xad\x13\x7c\x49\x7a\xbe\xce\x0b\xac\x1b\x2f\xed\x2c\xc5\x66"
+ "\x33\xba\x0f\x3e\x19\xf5\xcc\x27\xf8\x11\xbc\xe8\x5c\x98\x57\x3d"
+ "\x68\xac\x4b\x60\x46\xf2\x61\x10\x1c\xb7\x7b\xb6\x3c\x1b\x48\xdf"
+ "\xa3\xd3\xd7\xfe\xc4\xdd\xb3\x23\xc7\x4d\x8e\x97\x35\xb7\x80\x4e"
+ "\x38\x72\xc4\x51\xe2\x92\xa2\xa2\xe5\x4f\xe6\x5a\x73\x97\x3c\x96"
+ "\x67\x15\x9f\xad\xcb\x8b\x90\x64\xa9\xbd\xc8\xba\x6c\x65\x81\xf5"
+ "\xc9\xa2\xa5\xc4\x29\xe4\x16\x16\x2e\xb7\xd9\xc7\x30\x99\xd3\xfa"
+ "\xe4\xf2\x7c\xfb\x52\x1b\x5e\x8a\x72\x0b\x72\xac\x62\xd4\x8b\x50"
+ "\x54\x7e\xbe\x55\xab\xa1\x28\x6f\x49\x21\x4d\x84\x82\x9f\x22\x51"
+ "\x44\xfe\xa1\x7c\x44\x2c\xd9\xb1\xa2\xbd\xa7\x47\xf9\xc1\xd8\x26"
+ "\x23\x60\x5d\xbb\x7b\x36\xe9\x32\x20\x1c\x2b\x78\xcb\xaa\x74\x71"
+ "\xee\xf3\x0c\xfa\xd8\x3b\xd5\xd9\xde\x57\x95\xb1\x56\xef\x1b\xd9"
+ "\x8d\x17\x76\x13\xc9\x26\xa7\x92\x71\x51\xdc\xd1\xc3\x7a\x10\xba"
+ "\x2e\x55\xe9\x1e\x09\x8b\x8c\xc6\x48\x9b\xdb\x52\xa7\x27\xe3\x3d"
+ "\x79\x66\xf2\x03\xba\x03\xc2\x34\x3b\xf7\x0a\xf2\x84\x28\x8f\xba"
+ "\x69\xc7\x02\xe4\xf3\x85\x79\x94\x8c\x66\x4a\x2f\xd2\x55\x65\x4c"
+ "\xe0\xe3\x6a\xb1\x37\x65\xec\xa1\x76\x8d\xb0\xcf\x58\x2f\xa0\xdc"
+ "\x77\xc1\x9d\x7c\x2b\x91\xa5\x5c\xd8\xe8\xec\xea\x4b\x78\x9a\xf5"
+ "\x57\xb2\xd1\xfd\xd8\xdb\x02\x06\x36\xf9\x22\xe6\x45\xf1\x2d\x2c"
+ "\x6a\xd5\x03\xcc\xd0\xf0\x44\x03\xd9\x7d\x65\x2d\x0b\xb6\x30\x0f"
+ "\x76\x41\x4f\x60\x0f\x6b\x71\x77\xb0\x23\xc1\xdd\xd2\x27\x43\x09"
+ "\xf1\x18\x0f\x3d\x45\xb6\xa8\xca\x56\xf1\xd0\xbe\x3f\xf9\x46\xed"
+ "\x3d\xdd\x40\xbe\x14\x26\x7b\x82\x9f\xb9\x3d\xa5\x3b\x99\xc7\xe1"
+ "\x71\xd3\x1d\x7d\xc0\xed\x91\xd7\xf0\xed\xaa\x16\xe4\x7b\x90\x8d"
+ "\x46\xf8\x07\x54\xc7\xda\xcd\xbc\xfd\x17\xe3\xf9\xf1\x5f\x6c\xe6"
+ "\x5e\xcc\x29\xf2\x8d\xd0\xb5\x7e\x3c\xef\x5e\xaf\xd9\x9b\xa3\x79"
+ "\x6a\x5b\xc1\x2c\xa7\x95\x1f\x74\x09\x59\xc8\x3c\x11\xbe\x0e\x61"
+ "\xb1\xff\x7b\x1c\x9b\x29\x3c\xe1\xb4\xf2\x50\x8c\x0c\x6f\xa7\xf0"
+ "\x44\x84\x2d\x32\xfc\x16\x85\x93\x10\x4e\x91\xe1\x56\x26\xef\xab"
+ "\x3f\x34\x5b\x86\x8f\x51\x18\xb0\x7f\x68\x81\x7b\x05\xb5\xf7\xaf"
+ "\x18\xb3\x87\x1e\x2e\xfb\x14\xbc\xaa\xe3\x94\x58\x0f\x87\x9c\x79"
+ "\x24\xab\xc1\x7a\xf8\xc1\x47\x57\x1f\x27\x3e\xf7\x21\x47\x74\x2a"
+ "\x3d\x7f\x50\x6a\x0a\xb0\xd1\xa0\x1b\xaf\xc6\xb7\xfb\x09\x76\xc3"
+ "\xd2\x31\x7b\xcb\x26\xa7\x07\xb9\x9b\x3f\x9f\xdf\xc5\x37\xd5\x64"
+ "\xf0\xe7\x0b\xe8\x2c\x1f\x7b\x5d\xa9\xb9\xa1\x24\x20\x6c\xef\x82"
+ "\x56\xc7\x1a\x7a\x48\xe8\xce\xf8\x40\xfb\x8e\x60\x8b\xd3\xcc\x37"
+ "\x95\x67\x80\xa7\x6c\x7f\x20\x25\x48\x7a\x89\xa0\xf7\x7f\x78\xff"
+ "\x9b\x79\x44\x3b\x6c\x3a\xac\xee\x2c\x48\x55\xcb\x32\x19\x4f\xce"
+ "\xef\x7a\x20\x8f\xbb\xb1\x8f\x29\x52\x86\xce\x3f\x43\xfd\x9f\x89"
+ "\x7a\xa7\xe6\x77\xa9\x2b\xf3\xc8\x9f\x94\xc0\x2f\x4e\xda\xd3\x57"
+ "\x00\x9f\x3c\x9d\x69\x0a\x6d\xda\xe4\x7e\x33\xef\xe4\x95\xf9\x66"
+ "\x53\x7e\xb8\x60\x44\xfd\x27\xb4\x29\xc4\x33\x59\x10\xf5\x04\xd1"
+ "\x57\xa2\x1f\xf6\xaa\xcd\x06\xd0\x31\x5d\x2f\x3e\xda\x3e\x8a\xaf"
+ "\xcc\x34\xa1\x4f\xb7\x78\x52\xce\xb3\xd6\x7e\x5a\x2b\x8b\x62\xde"
+ "\x74\x30\x36\xdf\x11\x74\x9b\x7c\x42\x47\xce\x6c\x7b\x82\x5d\xcf"
+ "\xc7\x95\x67\x9c\x56\x16\x65\x3e\x58\x8a\x3e\xa0\xef\xaf\x75\xb4"
+ "\x1b\x55\xf4\x63\xa6\x84\x1b\xe5\x9b\x03\xd8\xb6\xeb\x3c\xce\x95"
+ "\xb5\x7f\x91\x98\x37\x6a\x51\x26\xa3\xbb\x83\xfb\x40\xb3\xa8\x03"
+ "\x99\x26\x15\xfb\x11\x7d\x7b\x33\xe5\x0c\xa3\x3a\x25\xac\x17\x49"
+ "\x3f\xaf\xc9\x80\x33\xea\x27\x5b\xc5\x3a\x5c\x91\x76\x4e\x68\x20"
+ "\x6f\xf8\xf1\xdf\xbc\xc9\x85\xf6\xb5\xf1\x4d\x73\x87\xb7\x35\xbd"
+ "\x79\xee\x21\x6d\x7e\xc4\xe0\x67\xe1\xbf\xde\x9d\x81\x39\x90\x22"
+ "\xfc\x7d\x6e\x5e\xe7\xd6\xe5\x45\x58\x6f\x98\x23\x8b\x3e\x6a\x70"
+ "\x76\x0d\x6f\xab\xd5\xf5\x81\xf4\xb3\x36\xea\x33\x6e\x0a\x91\xff"
+ "\xe0\xf3\x64\xf7\xba\xeb\xcd\x14\xff\x15\x8e\xe9\xc3\x5f\xf3\x79"
+ "\x14\xe9\x3b\x76\xfe\x37\xf9\xc0\x15\x96\x97\x3f\xe2\x1c\xd9\xf9"
+ "\xff\xd8\xfb\xfa\xb8\xa8\xca\xbc\xfd\x9b\x01\x0d\x0b\x75\x34\x70"
+ "\xd1\x35\xc3\xd2\x76\x34\x4d\xdc\xa7\x5c\x2d\x7d\x16\xdf\x4a\xcd"
+ "\x17\x6c\x65\xa3\x44\x43\xc3\x16\x0c\x0c\x0d\x15\x11\x06\xa4\xec"
+ "\xa7\x86\x80\x0a\x2e\x1a\x0a\xf6\x68\x8b\x26\xbe\xf4\xd4\xb3\xda"
+ "\xaa\x8d\x9b\xee\xfa\xc2\x9b\x3d\x58\x68\xa8\x23\xa1\x91\xa1\x8d"
+ "\x38\xca\x80\x33\x73\x7e\xdf\xef\xb9\xcf\x70\xce\x99\x39\x67\x98"
+ "\x33\x82\x62\x8f\x7f\xf0\xd1\x39\xe7\xcc\x3d\xf7\xb9\xbf\xd7\xb9"
+ "\xee\xeb\xfa\x9e\xfb\x05\xda\xc5\x77\xb4\xbe\x91\x19\xe3\x41\x7d"
+ "\xc8\xab\x5d\xb0\xad\xcc\xd0\x8f\x24\x9c\x26\x2a\x13\xf4\x97\x3b"
+ "\xfe\xbc\x42\x35\x00\xfa\x19\x0b\x68\x81\xe3\x65\x47\xc8\x94\x89"
+ "\x24\xb9\x38\xb2\x8e\xd8\xf6\x4f\x83\x7e\x2d\x78\xfb\x9f\x0d\x2a"
+ "\x7c\x8f\x85\xfb\xa5\xb1\x9e\x7d\xfd\xba\xcc\x4f\xbf\x35\xa1\x8f"
+ "\x4d\x29\xfc\xd6\xa0\x32\xdf\x08\x0d\x60\xd7\xdd\x06\x2f\x91\x1c"
+ "\xc9\x58\x9b\xde\x6d\xe1\xde\x0c\x99\xef\x46\xe2\x7e\xd4\x27\x83"
+ "\xcb\xd8\xf9\xdc\x27\x43\x8f\x90\x93\x95\x39\xa4\xa8\xfa\x1c\xce"
+ "\x41\xdc\x72\x32\x34\x13\x35\x65\x27\x33\xe8\xc6\x8f\x40\x37\xc2"
+ "\xf3\xda\xc1\xaa\x3e\x5d\x63\x7b\xbf\x85\xef\xba\x6c\x9a\xd1\x0c"
+ "\xcf\x68\x2e\xb7\x87\x9a\xf9\x83\x10\x92\xcb\xbd\xeb\xc2\xbd\xd5"
+ "\x36\x2e\x22\x7d\x36\xaa\xac\xa1\x52\xef\xb6\x3a\xcd\x67\xd7\x7b"
+ "\xf1\xb7\x76\x39\x5d\x63\xdb\x63\x6d\xf2\xfc\x00\xf2\x0f\xb8\xf7"
+ "\xa3\x1a\xa5\xcf\xe4\x9f\xd9\xb1\x83\x66\xc0\x9d\x19\x30\x67\x86"
+ "\xf6\x84\x18\x14\x41\xdc\x24\xfd\x98\x2d\x06\xb7\x93\x6d\x31\x08"
+ "\xdd\xc2\xc6\x00\x7c\xdc\xd2\xd7\xb8\x18\x9c\x85\x18\x54\x43\x0c"
+ "\x52\x49\xca\x89\x69\x45\x64\x4a\x30\xc4\xa0\xb6\x0e\xd7\x6c\xa7"
+ "\x7b\xd8\xc5\xd1\xb6\x67\x63\x71\xd6\xa0\x2a\x31\xd2\x18\xec\x7c"
+ "\x9d\xc6\x60\xd7\xeb\x06\xd0\x31\xd1\x41\xdb\xe1\xb3\x65\x71\x68"
+ "\x00\xee\xc7\xc3\xa4\x86\xe3\x7e\xdb\x34\x16\xb7\x21\x16\xb7\x69"
+ "\x2c\xb4\xf3\x21\x16\xe5\x15\xec\xba\x2f\x27\x2b\x8b\x48\x51\x78"
+ "\x3e\x29\x06\x5e\x82\x58\xcc\xc2\xb8\x60\x8e\xc1\xb2\x54\xd3\x75"
+ "\x43\x02\xf1\xcd\x4d\x20\xfe\xb6\x78\x58\x6f\x43\x3c\x12\x20\x1e"
+ "\x8d\x10\x0f\x53\x53\x3c\x7c\xd9\x78\x5c\xe5\xe2\xd1\x88\xe3\xe6"
+ "\x20\x1e\x8d\x10\x8f\x46\x88\x47\x2a\x8d\x07\xf2\xfc\x64\x63\x67"
+ "\xc6\xfa\xb3\x86\x6c\xbe\x22\x11\x8f\xa5\x5c\x3c\xce\xba\x13\x8f"
+ "\xd0\x68\xc7\x78\xbc\x1a\xdc\x5c\x3c\xf8\x67\xe2\xf5\xb1\x18\x8f"
+ "\xdb\xf9\xdc\x33\xf1\x14\x3e\x13\x29\xaa\xa7\xa1\x2f\xc2\x36\x3d"
+ "\x5e\x76\x80\x7d\x26\xe0\x5e\x53\xb6\xff\xd9\xa4\x2a\xaa\x86\xb8"
+ "\x44\x30\x34\x4f\xc0\xc5\x85\xc6\x23\x3d\xb8\xe0\x5b\xda\xfe\x01"
+ "\x13\xb0\xcf\xc0\x67\x03\xe3\x03\x71\x82\xe7\x47\x6a\xff\x41\xe1"
+ "\x3b\x60\x28\xd3\x8a\xcf\x09\x3e\x23\xf8\x3c\x14\x47\x9e\x63\xf7"
+ "\x73\x3f\x19\x7c\x8c\xe0\xbb\xe0\x93\xa1\x07\x20\x56\x39\xc4\xb2"
+ "\x18\x62\xb3\x08\x9e\x13\x0f\xd2\x1b\xf7\x21\x3c\x19\xba\x02\xf5"
+ "\x82\x1a\x30\xdf\xc1\x02\x71\xb2\xd4\xfb\x3f\x9c\x06\x3e\x2b\x6f"
+ "\x11\xff\xdc\x6c\xe6\xf6\x5c\x66\xda\x87\xe0\x9c\x7c\x2f\x33\xc4"
+ "\x08\x9e\x1d\xd1\x33\xd3\xb4\x17\xf3\x0f\x1a\xb2\xa9\x8a\x78\x77"
+ "\x8c\xa2\x31\xb2\x08\x9e\x99\x49\x51\xf8\xcc\xa4\x40\x8c\x4e\x2b"
+ "\x8c\xd1\xeb\xec\x38\x28\xf0\x9f\x99\x8c\xdf\x68\x3d\xf4\x93\x10"
+ "\xa3\x50\xbd\x5c\x8c\x2c\x5b\xa3\xbd\x2d\xea\x04\x7c\x87\xfd\xb8"
+ "\xf5\x9d\x69\x1e\x56\xf0\x50\x8d\xe0\x5d\x4f\x1a\xcc\x24\x71\x06"
+ "\x51\x25\x9c\x23\xed\x4b\xa7\x7d\x43\x4a\xf5\xfb\x08\xae\xc3\x8c"
+ "\xb9\x6f\xdc\x8f\xa1\xd4\xbc\x0f\xf8\x2a\x4f\x87\x9f\x37\xb1\x9f"
+ "\x0d\x64\xe9\x0c\xe2\xc9\xee\x4f\x1a\x9a\x4f\xd2\x00\x9f\x85\xaf"
+ "\xe7\xab\xac\x59\x29\x05\x8c\x1a\xf7\x91\x21\x3a\x9c\x13\x95\xbc"
+ "\x84\xf8\x14\x47\x16\xe1\x5a\x74\x17\x70\x6d\xe1\x12\x23\x94\x69"
+ "\x60\x1a\x2d\xd0\x67\x6c\x4e\x65\xf6\xe1\xda\xfa\x83\xb0\x8f\x60"
+ "\xd7\xc9\x98\xde\x1b\xb5\x08\xe6\x00\x75\xda\x8d\xa0\xbd\xa6\xb3"
+ "\xe3\x09\xe1\x98\x47\xf1\x5c\x1c\xbb\x31\x33\x1b\xeb\x45\xf3\xf1"
+ "\xf4\xdf\x41\xb8\x8f\x63\xb7\x7c\xcf\x83\x5a\x83\x57\x26\x78\x62"
+ "\xd0\x68\x58\xce\x7c\x86\xfa\x43\x4d\x69\xb9\x89\xcd\xc5\x1a\x92"
+ "\x23\xdb\x67\x26\xe0\x3a\xbe\xb8\x4e\x3f\xf6\xd9\x33\xc7\xe2\x1e"
+ "\xcb\x80\x59\x0d\xd3\x2d\x4d\xb7\x67\xb6\x41\xc5\xf7\xcb\xd3\x73"
+ "\x01\xb7\x9a\xb1\x1a\x26\x19\xf7\x33\x38\x04\xf7\x85\x3e\x68\x47"
+ "\x95\x89\xe5\x94\x4f\x67\xaf\x50\x61\xae\xc8\x04\xfc\x50\xf4\xed"
+ "\x67\xec\x9e\xb1\x97\x3d\xc2\x0a\x4f\x84\x9a\x09\xfe\x7e\x48\x3f"
+ "\x7c\xdf\x32\x5d\xdf\xa0\xba\x10\xd0\xd0\x3e\x24\x2c\xb9\x9a\xdf"
+ "\x2f\x53\xb8\x2f\x26\xf2\x4c\xe1\x6c\x28\x13\x79\xa6\x2a\x45\x45"
+ "\xb9\x25\x08\xf3\x95\xde\xf6\xdc\x52\x5c\x7b\x95\x68\x01\xc7\xc5"
+ "\x91\xf9\xec\x9e\x13\x9d\x80\xdf\xad\x4b\x81\x4f\x6e\x6b\xba\x6e"
+ "\x02\x3e\x41\x1e\xd8\x0c\xfc\x61\x5d\xea\xff\x70\x7a\x23\x19\x60"
+ "\xe3\x11\xd4\x5e\xf8\xef\x0c\xc0\x68\xe7\x63\x70\x0c\xe2\x64\x05"
+ "\x5e\x07\x3e\xd1\x7c\x94\x40\xfa\x7c\x04\x18\xdd\x84\x3c\x02\xba"
+ "\x78\x72\x2c\xf0\xc8\x62\xe0\x91\x45\xec\xbe\xc5\xfe\x9b\x55\x94"
+ "\x3f\xbe\xac\x5a\xa1\xca\xb4\xed\x5b\xce\xb6\xef\x8c\x91\x25\x88"
+ "\x8f\xf0\x14\x76\xce\x9b\x05\xfb\xa7\xa5\xa1\x9e\x25\x46\xc0\xc8"
+ "\xfa\xbc\x3d\x78\x8c\x7d\x6e\x17\x47\x3e\x6c\xa5\x58\x0b\xc2\x36"
+ "\xc9\xbb\x46\x02\xd9\xbd\x3d\x7f\xf1\x7f\x38\x63\x1e\x19\xb0\xf9"
+ "\x1a\xe9\xb3\x79\x1e\xd1\xc0\xf3\xaa\xda\x0c\x75\x98\x39\x5f\x4d"
+ "\xd8\xbd\x1d\xda\x87\x44\xc0\x71\xc9\xbd\x1d\x40\x57\xfb\x6f\xc6"
+ "\x67\xe6\x1d\x4d\x53\x9d\xcc\x99\x7b\x53\x2c\xd0\x76\x74\x2d\xa6"
+ "\x19\x74\xfd\x3d\xf5\x9b\xa1\x54\xe7\xcf\xe0\xd6\x19\x8e\x0c\x03"
+ "\xaf\xf2\xd0\x15\x8f\x19\xcb\x98\xb5\xb1\xc1\xb1\x09\xb8\xa6\x31"
+ "\x77\x0e\xb4\xa7\x15\x62\xf5\x4c\x0a\x49\xb1\x76\xa9\x04\x9e\x00"
+ "\xed\x84\x6b\x2f\x2b\x7a\x0e\x67\xe4\x60\x59\x96\xcc\xbd\xef\xe3"
+ "\xfd\x5a\xd7\xee\x4d\xcb\xbb\x42\x02\x99\xb7\x21\x1e\x73\xe1\x5e"
+ "\xaf\x90\x3e\xb9\x57\xe0\x5e\x17\xd3\x7b\xb5\xed\xd3\x6e\x4d\xbd"
+ "\xa0\x81\x73\x4e\xf7\x45\x32\xbc\x8d\xfb\x22\x85\x6b\x80\xc3\x1e"
+ "\x65\x9e\x20\xa4\xb8\x96\x5d\x07\xa3\xbe\xd4\x7c\x8e\xe0\xef\x62"
+ "\xfe\xa8\xb4\x8e\xc5\xf4\x42\xc4\xb2\x35\x7f\x47\xf0\x1b\x95\x80"
+ "\xed\xfa\x48\xcc\xa5\x05\x1f\xaa\x32\xe0\xba\x13\xac\xe6\xd3\x7b"
+ "\x4c\xdf\x8a\x3a\xed\x2b\x38\x86\xd8\x17\x60\x7e\x2b\x62\x1e\xcf"
+ "\xb3\xb8\x87\xef\x95\x56\x5e\x22\x58\x9e\xb0\x1c\x8c\xbf\xad\xac"
+ "\xcb\x1e\x6f\xbc\x86\x65\x21\x16\x30\xcf\x83\xcf\x1a\x8d\xfd\x3e"
+ "\x1c\x6f\xee\xcf\x74\x4b\x0d\xa4\x9f\x0d\xb8\x9e\x89\x1a\x31\xc0"
+ "\x62\x05\xf8\x1b\xd7\x49\x65\x98\x50\x4f\xc0\x19\xd6\xf3\x61\x88"
+ "\x77\xa0\x0d\x17\x70\xcc\xd7\x1e\x1b\x9d\x96\xa9\xd1\xd3\xf8\xe2"
+ "\xff\x5d\xc5\x87\xb2\xf8\xbd\x11\x2a\x3b\x96\xae\x4f\x34\xc6\xe2"
+ "\x71\xe4\x4d\xcb\x0d\x01\x67\xd6\x52\xce\x44\x4e\xb2\xf1\x26\xcb"
+ "\x4d\xec\xda\xfc\xfb\x70\xdc\x6d\x24\x5b\x47\x85\xbc\x59\x5c\xcb"
+ "\xf3\xe6\xe4\x58\x01\x6f\xd6\x32\x8d\xa0\xdf\x25\x78\x33\xfc\x35"
+ "\x31\x6f\x86\xcf\x10\xf3\xe6\x9b\x87\xed\x79\xd3\x91\x33\xc3\x37"
+ "\x49\xf1\x25\xf8\x98\xc7\xaf\x78\xbc\x19\x2b\xcf\x95\xe1\xc7\x94"
+ "\x73\xe5\xac\x33\x62\xae\x9c\xe5\xf3\xeb\xe5\xca\xd9\x31\x22\xae"
+ "\x54\xbb\xc8\x95\x57\x58\xae\xf4\x65\x7e\x86\x67\x82\xe3\x8f\xcd"
+ "\x73\x65\xb8\x72\x6e\x33\xcf\xc2\xdb\x72\x5c\x39\xfb\xa8\x98\x2b"
+ "\x67\x9b\xc4\x5c\x39\xbb\x90\xe7\x4a\xee\x5c\x8b\x70\xe5\xec\x23"
+ "\xf7\x86\x2b\x67\xb3\xeb\x9c\x97\x5e\x43\xae\x7c\x73\x4b\xf3\x5c"
+ "\x19\x5e\x26\xcd\x95\x70\x9c\xe5\xca\xf0\x32\x9e\x2b\xcf\x35\xc3"
+ "\x95\x11\xcb\x15\x70\xa5\x2f\xcb\x95\x6a\x19\xae\x9c\x0b\x6d\xc5"
+ "\xe1\x82\xc5\x9e\x1d\x36\x38\xae\xf4\x6f\xe2\x4a\x17\xf0\xa1\x2c"
+ "\x7e\x11\xef\x3b\xe3\x4a\x6b\x26\xd5\x97\xc8\x95\x4c\x37\x8e\x2b"
+ "\xa3\xcd\x24\xe1\x0c\x70\x64\xf9\x15\x76\x0f\x0f\x76\x8c\x30\xfc"
+ "\x25\xbe\x86\x5c\xb4\xba\x6c\x17\xb4\x57\xa9\x7e\x0f\xcb\x4d\xec"
+ "\x3c\xaf\x89\xc8\x55\x7b\xe0\xda\x9c\x26\xdd\xc9\x72\xe7\x19\x8e"
+ "\x3b\xc3\x38\xee\x9c\x79\x07\xdc\xf9\x3a\xc6\x72\x4e\x76\x83\xca"
+ "\xc6\x9d\x6b\x81\x3b\xe7\xb0\xfa\x01\xdf\xed\x52\xee\x8c\xea\x62"
+ "\xab\x17\xe6\x34\x4b\xe3\x36\x12\x5a\xaf\x3a\x47\x1e\x9d\xc0\x96"
+ "\xf7\x93\x6e\x6e\x2d\x69\xe2\xd2\x30\x9e\x4b\x2f\x7b\x44\x1e\x96"
+ "\xe7\xd1\xb7\xd4\x4d\x3c\x9a\x0a\x3c\x7a\x5e\xc0\xa3\xe0\x9b\x3e"
+ "\x45\xce\x03\x1e\xad\x67\x79\xf4\x4b\x8e\x47\xff\xd2\xfb\x44\x18"
+ "\xf0\xe8\x04\x1b\x8f\xbe\x35\xcd\x94\x7a\x21\xc0\xf4\x41\xf3\x3c"
+ "\x5a\xcf\xf2\x68\x6c\xeb\xf3\xe8\x11\x3b\x1e\x05\xef\x8a\x7b\xb5"
+ "\x4b\xf2\xa8\x0d\x8f\x2c\x8f\xa6\xf0\x3c\xca\xb6\xeb\x5f\x0e\x96"
+ "\x84\x43\xbb\x87\xc7\xb2\xde\xad\x89\x47\x63\xf7\x50\x1e\x85\x63"
+ "\x6c\xfe\xe4\x5d\xe0\x51\xc0\x5f\x72\x31\xdc\x37\x3c\x2f\x50\x47"
+ "\x35\xf2\x6b\x1e\x3c\x33\xd8\x46\x4d\x7c\x3a\x17\x9e\x19\xe4\x98"
+ "\x1b\xf0\xcc\x00\x8f\xce\xbc\xa9\x26\xec\xf3\xf2\x01\x3c\x2f\x57"
+ "\x64\xf6\x15\xb3\x8d\xe3\x95\xe5\xd3\x48\x3f\x31\x9f\x46\x8e\x13"
+ "\xf3\xe9\x5f\x2c\x3c\x9f\x72\xe7\x90\x4f\x21\x66\xd6\x35\x95\xde"
+ "\xc8\xa9\xee\xf1\x69\xa4\x6f\x13\x9f\xaa\x38\x3e\x9d\xdb\x3c\x9f"
+ "\xb2\xef\x06\x65\xf8\x54\xc8\x0d\xf2\x7c\x1a\xe9\xcb\xf3\x69\xe4"
+ "\xf5\x26\x3e\xad\x90\xe3\xd3\xb7\xfc\xa5\xf9\x14\x8e\xb3\x7c\xfa"
+ "\x96\x7f\x13\x9f\x56\x48\xf0\xe9\x04\x21\x9f\x46\x5d\xa4\x7c\xba"
+ "\x87\xae\xbb\x01\x9c\x5a\x62\x04\x7c\xe0\x33\x17\x97\xc3\x72\xaa"
+ "\x15\x38\x15\xf7\x5a\xc5\xbd\x66\x70\x6c\xbe\x14\xa7\x52\xce\xd5"
+ "\x13\xe4\x55\x7c\x36\x93\x27\x81\xdf\x85\xbe\x08\xda\x84\xed\x7b"
+ "\x6d\xed\x97\x27\xe0\xd7\x37\x96\xa8\x51\xdb\x89\xb0\x62\xb5\x61"
+ "\xe5\x86\x06\xc7\x16\x8b\xb0\xa2\x2c\x96\x51\x7a\x39\x6e\x95\xf3"
+ "\xee\x27\xd0\xbb\x87\x10\xd5\xd2\x10\xe0\xd7\x50\xf4\xee\x05\x76"
+ "\xde\xbd\xc0\xd1\xbb\x9f\x76\xce\xa3\x8a\xbc\xfb\x9f\x31\x86\x73"
+ "\xcf\x89\x79\x74\xee\x45\x31\x8f\xce\x9b\x81\xf5\xa2\x3c\x5e\x20"
+ "\xed\xdd\xd9\xe7\xfc\xed\x81\x4d\xde\xbd\x42\xcc\x9f\xbc\x77\x9f"
+ "\xd7\x51\x9e\x47\xdf\x0e\x15\xe9\xd1\x99\x1c\x8f\xce\xe6\x78\x74"
+ "\x36\xcf\xa3\x27\xbf\xb1\xe9\xd1\xe8\x85\xc7\x2b\x84\x3c\xfa\x76"
+ "\x6e\x13\x8f\x56\x3a\xf2\xa8\x8d\x43\x91\x4f\xb1\x1c\xcc\x65\xed"
+ "\x04\x9e\xde\x3d\x3b\x56\x45\x73\xb5\xe1\xd8\x76\xde\xf6\xb9\xda"
+ "\xe2\xda\x9b\x44\x1b\x86\x7c\x9a\xc3\xf2\x69\x67\x0f\x32\x0b\xb8"
+ "\xaf\x13\xce\x45\xc8\xc5\xf7\xfa\x8b\xe8\x5e\x4d\x98\x5f\xb2\x2e"
+ "\xa6\xfb\x1e\xda\xf2\x4c\x70\xbf\xec\xfb\xfc\x19\xe7\x38\x4e\xc5"
+ "\xfd\xcc\x01\x73\x1f\xdd\x02\x4e\x5d\x24\xa1\x4d\x97\x02\xa7\x26"
+ "\x08\xb4\x29\x3c\xfb\x5f\xce\xb6\xe7\xd4\x98\x0e\x25\x88\x15\xe4"
+ "\x54\x91\x8f\x2f\x68\x03\x3e\x3e\x66\x96\x98\x4b\x63\xb2\xc4\x5c"
+ "\x1a\x33\x9e\xe7\x52\xee\x5c\x8b\x68\xd3\x98\xf0\x7b\xa3\x4d\x63"
+ "\xc2\x79\x1f\x3f\x6f\x44\x13\x97\x96\xcb\x71\xe9\xdb\xe1\xd2\x5c"
+ "\x0a\xc7\x59\x2e\x7d\x3b\xbc\x89\x4b\xcb\x25\x7c\xbc\x88\x4b\xdf"
+ "\xe9\x4d\xb9\xb4\x80\x6a\xd3\x0a\x9b\x36\x2d\xb8\x0f\x7d\xfc\x3b"
+ "\x01\x4a\x7d\xfc\x89\x5a\xca\x9f\xc8\x4f\x36\x0e\xe5\x7d\x7c\x81"
+ "\xbc\x8f\x6f\x86\x43\x15\x69\x51\x96\x43\x63\x7b\x8b\x39\x34\xb6"
+ "\xaf\x98\x43\xdf\xcd\xb6\xe7\x50\x47\xfe\x8c\x9d\x23\xc5\x9d\xd4"
+ "\xc7\xbf\x3b\x46\x9e\x37\x63\x33\x95\xf3\xe6\xfc\x42\x31\x6f\xc6"
+ "\x96\xff\xdf\xe0\xcd\x05\x23\x45\xbc\xa9\x76\x91\x37\xef\x8a\xa7"
+ "\x5f\x60\x97\xff\x5c\x60\x97\xff\x5c\x20\xc8\x7f\x2e\x68\xc1\xfc"
+ "\xe7\x82\x7b\x94\xff\x5c\x90\xc3\x6b\xd0\x77\x17\x36\xcf\x9b\xb1"
+ "\x39\xd2\xbc\x09\xc7\x59\xde\x8c\xcd\xe1\x79\xb3\x39\x0d\x1a\xf7"
+ "\x9a\x02\xde\x6c\xe3\x9e\x3e\xce\x69\xfe\x53\xca\xd3\x23\x6f\xb2"
+ "\x7c\x59\x61\xe7\xe9\x43\x84\x9e\xbe\x80\xf7\xf4\xe3\x28\x6f\x95"
+ "\x9a\x33\xc5\x9e\xbe\xc5\x79\x74\x61\x94\xa9\x29\x1f\xba\x0a\x78"
+ "\x74\x21\xbb\x16\x8c\xa9\x29\x1f\x1a\x7f\xdd\x56\x2f\xea\xe9\xd7"
+ "\x12\x5a\x2f\x09\x4f\xcf\x8e\x1f\x5e\x78\xb0\xc9\xd3\x57\xd8\x7b"
+ "\xfa\xf8\x2d\xf2\x9c\xba\xb0\x5a\xd2\xd3\xa3\xff\x66\x39\x35\x96"
+ "\xe5\xd4\x5b\xeb\x85\x9c\xba\xd8\x83\xe5\xd4\x17\x6d\x9c\xba\x48"
+ "\x63\x82\x67\xd3\xd4\xbe\x79\x4e\xc5\x72\x78\x4e\x8d\xbc\x3b\x9c"
+ "\xaa\x73\x9d\x53\x85\xf3\x60\xbf\x84\x7b\x6f\xe2\x54\xb6\x8d\x17"
+ "\x6f\x2a\x09\x47\x4e\x8d\xb4\xf3\xf7\x05\xd2\xfe\xfe\x38\x51\x61"
+ "\xfb\xd8\xfc\x3d\xc6\x80\xe5\x9b\x56\xf5\xf7\x8b\x6f\x8a\xb9\x35"
+ "\x5e\x23\xe6\xd6\xc5\xe7\x78\x6e\xe5\xce\xb5\x88\xbf\x5f\x6c\xbc"
+ "\x37\xfe\x7e\xb1\x91\xe7\xd6\xf8\x53\xcd\x73\xeb\xc2\x5a\x69\x6e"
+ "\x85\xe3\x2c\xb7\x2e\xac\x75\xca\xad\x2f\x0a\xb9\x75\xc9\x61\x1b"
+ "\xb7\xf2\xfe\x1e\xf0\x81\xcf\x5f\x5c\xa6\xfb\xfe\x7e\xfc\xbd\xf6"
+ "\xf7\x4b\x74\x8a\xfc\xfd\x7a\xe0\x59\xf0\xe2\x4b\x4f\x81\xbf\x9f"
+ "\xca\xf9\xfb\xca\x7c\x3b\x7f\x9f\xef\xe0\xef\x13\xa7\x72\x9c\x0a"
+ "\xcf\x14\xcb\xa9\xb3\x0b\xdc\xf7\xf7\xaf\x60\x0c\x13\x0e\x8a\x39"
+ "\x35\xe1\xb0\x98\x53\xb5\x53\xb1\x5e\x94\xd3\xf3\xa5\xfd\x3d\xfb"
+ "\x9c\x2f\xed\x28\xf2\xf7\x50\x3f\x47\x7f\xaf\xf5\x10\x71\xea\x4c"
+ "\x21\xa7\x2e\x1d\x2a\xd2\xa9\x70\x5f\xc8\xa9\xdb\xcf\x53\x4e\xdd"
+ "\x71\x5e\xc0\xa9\x93\x77\x70\x9c\x9a\x18\x75\x7c\x9a\x90\x53\x97"
+ "\x26\xda\x38\x95\xe5\xcb\x99\x26\x55\x72\xa8\xe3\xb8\x13\x76\xbc"
+ "\x0f\x8e\x05\x82\xb2\x71\xbe\x18\x96\x59\x78\x3e\xb2\xf9\xf1\x26"
+ "\xa1\xd2\xe3\x4d\x4a\xe3\xf4\xa4\xa8\x3a\x93\x1d\x67\x92\x8b\xe3"
+ "\x4c\x96\x91\xde\xb9\x8d\x74\xfd\x01\x76\xed\x44\x99\xb5\x07\x66"
+ "\xbc\xc6\xf3\x2c\x8e\xc9\xfa\x08\xc7\x64\xdd\xa2\x63\x80\x20\xde"
+ "\x8e\xeb\x0d\xd8\x74\x13\xf0\xc1\xfe\xf3\xf6\x3c\x9b\x68\x29\x41"
+ "\xfc\x84\x45\xda\x79\xfe\xfc\x36\xe0\xf9\x93\x42\xc4\xfc\x9a\xb4"
+ "\x42\xcc\xaf\x49\x23\x78\x7e\xe5\xce\xb5\x88\x76\x4d\x9a\x76\x6f"
+ "\xb4\x6b\xd2\x34\xde\xf3\x6b\x07\x37\xf1\x6b\x99\x80\x5f\xcf\x0b"
+ "\xf9\x75\x69\x10\xcb\xaf\xe7\xed\xf9\x15\x8e\xb3\xfc\xba\x34\xa8"
+ "\x89\x5f\xcb\xec\x3c\xff\x79\x7b\x7e\x4d\xf6\x63\xf9\xb5\x32\xdf"
+ "\x4e\xbb\xe6\x37\xef\xf9\x2b\xdb\x9a\xe7\x4f\xf6\x55\xe4\xf9\x91"
+ "\x53\xa3\x29\xa7\x22\x67\xd9\x78\x95\xf7\xfc\xf9\xb2\x9e\xbf\x39"
+ "\x5e\x55\xa4\x55\x59\x5e\x4d\xf1\x13\xf3\x6a\x4a\x77\x31\xaf\xbe"
+ "\xb7\xc9\x9e\x57\x1d\x39\x35\xe5\x35\x29\x3e\xa5\x9e\xff\xbd\x89"
+ "\xf2\x5c\x9a\xf2\xbe\x72\x2e\x5d\xf6\x85\x98\x4b\x53\x8e\xfd\xdf"
+ "\xe5\xd2\xd4\xf1\x22\x2e\x55\xbb\xc8\xa5\x77\x25\x0f\x90\xba\x45"
+ "\xcc\xa5\xa9\xe5\x62\x2e\x4d\x5d\xc9\x73\x29\x77\xae\x45\xb8\x34"
+ "\x35\xff\xde\x70\x69\x6a\x3e\xaf\x55\xdf\x4b\x6a\x9e\x4b\x53\xd2"
+ "\xa4\xb9\x14\x8e\xb3\x5c\x9a\x92\xc6\x73\xe9\xb9\x66\xb8\xf4\xfd"
+ "\x59\x0a\xb8\x54\x9c\x07\xb0\xe7\xd2\x7b\x9e\x07\x78\x3f\x5c\x51"
+ "\x1e\xc0\xc6\xa5\x53\x1d\xf3\x00\xc8\xaf\x6c\x1e\x00\xda\xcb\xc6"
+ "\x61\x6c\x1e\x60\x0c\xe5\xb2\x52\xf3\x0a\x51\x1e\xa0\xe5\xb9\x75"
+ "\xf9\x7c\x53\x53\x3e\x35\x15\xb8\x75\x39\xbb\x46\xaa\xa9\x29\x9f"
+ "\xba\xb2\xa3\xad\x5e\x34\x0f\xb0\x8a\xd0\x7a\x49\xe4\x01\x46\xb1"
+ "\xe5\x1d\x15\xe5\x01\x04\x5c\x7b\xd9\x63\xc5\x41\x79\x9e\x5d\x5e"
+ "\x2b\xca\x03\x54\xf1\x3c\x7b\x0b\xc7\xa8\x03\x0f\xb2\x3c\xdb\x4d"
+ "\xc8\xb3\xff\xef\x31\x96\x67\x47\xd9\x78\xf6\x83\xc0\x7a\x78\x36"
+ "\xeb\x95\xf2\x2c\xce\x23\x38\x1f\x7e\x6f\x78\x76\x9f\x02\x9e\x15"
+ "\xe4\x06\xf6\x43\x7b\x34\xf1\x2c\xdb\xee\xff\x6f\x7f\x49\x18\xf2"
+ "\x6c\xb8\x5d\x6e\x20\x5f\x3a\x37\x70\xf4\x5e\xe4\x06\x56\x74\x11"
+ "\xf3\xed\x8a\x31\x62\xbe\xfd\x7f\x0d\x3c\xdf\x72\xe7\x5a\x24\x37"
+ "\xb0\x42\x7d\x6f\x72\x03\x2b\xd4\x3c\xdf\xae\xb8\xda\x3c\xdf\x2e"
+ "\x37\x4a\xf3\x2d\x1c\x67\xf9\x76\xb9\xd1\x29\xdf\x8e\x12\xf2\xed"
+ "\xca\x73\x36\xbe\xe5\x73\x03\xf9\x5c\x6e\x60\x45\xf3\xb9\x81\x4a"
+ "\x99\xdc\xc0\xd8\x7b\x9d\x1b\x58\x59\xa9\x24\x37\xd0\xb0\x9e\x8e"
+ "\xdb\x5f\x8a\xe3\xf6\x67\x00\xff\x06\x7f\x03\x6d\xd0\xfc\xb8\xfd"
+ "\x44\xdb\xf8\xd3\xf0\x1c\x8e\x67\x73\x24\x73\x03\x27\x6a\xe4\x73"
+ "\x03\x27\xca\x85\xe3\x4f\x57\x9d\x11\xbf\xb7\x5a\x75\xce\xf6\xde"
+ "\xea\xc4\xb7\xc8\xb3\xe9\xec\x9a\xdd\xd6\xac\x6c\x42\xd7\xf0\x4e"
+ "\xaf\xc6\x7a\x4a\x8d\xe3\xff\xd2\x2a\x7c\x97\xf5\xe1\xb0\xa6\x5c"
+ "\x41\x19\xf2\x6d\x0e\xb1\x32\x91\xed\x71\x0d\x71\x36\x57\xf0\x67"
+ "\xc4\x5e\x7a\xb6\x90\x77\x0f\x9d\x15\xf2\xee\x87\x11\x36\xde\xb5"
+ "\x00\xef\x1e\xac\xca\xa1\xf9\xd7\xd7\xe9\xd8\xd4\x9d\xaf\x0b\xc6"
+ "\xa6\x7e\xf3\x4f\x8e\x77\xd3\x66\x1d\xd7\xc3\xfd\x3b\x1b\x3f\x05"
+ "\xdf\xdf\x75\xd6\xd5\x31\xa8\x39\x92\x63\xa7\x38\x7e\x92\x1c\x3f"
+ "\x05\x75\x55\x6f\xe2\x9e\x55\x0b\x3c\xa7\x9b\x04\xe3\xa7\x72\x13"
+ "\xe0\x79\xe6\xe6\x95\x38\x1d\x87\xfa\x3a\x3f\x0e\x95\xc9\xca\x1a"
+ "\x8e\xfd\x9b\x35\x3b\x9b\x34\x32\x91\x9e\x8c\x6f\xd6\x70\xfc\xfd"
+ "\xdb\xb7\xa1\xdf\x19\x1d\xea\xc9\xf9\xba\x00\xe0\x9e\x4e\xb4\xdd"
+ "\xd3\x72\x2d\xd0\xd7\x58\xa0\xaf\xb1\x66\x65\x05\x98\x51\x9b\xac"
+ "\xcf\xea\x93\x0b\x3e\xcf\x9c\xca\xee\x69\xf8\x70\x3a\x78\xbd\x3c"
+ "\xf4\x79\xd7\xe0\xd9\x48\xd6\xa8\xb0\x3e\x36\x1e\xed\x5c\x03\xf7"
+ "\x71\xcd\xb9\x96\x33\xff\xc2\xf3\xa8\x6e\xc2\x09\xf8\xcd\xd5\x6b"
+ "\x4a\x10\xbb\xa1\xfc\x9c\x02\x56\x33\xcb\x8c\x95\xc5\xba\xd0\x75"
+ "\x1b\x01\x0b\x2d\x90\x93\x10\xd6\x47\xcc\xeb\xab\x7f\x12\xf3\x7a"
+ "\x7a\x4f\x31\xaf\xaf\x3e\xc5\xf3\x3a\x77\x0e\x78\x1d\xe2\xc6\xea"
+ "\x68\xcb\x1a\x77\x75\xf4\xea\x1a\x1b\xaf\x5b\x39\x5e\xdf\xec\x02"
+ "\xaf\x3b\xd5\xd1\x02\x5e\x92\xe7\xf5\xd5\x35\x7c\x4e\x22\xfd\xa8"
+ "\xe4\x18\xd9\xb3\x42\x5e\xff\x30\x9a\xe5\xf5\xb3\xf6\xbc\x0e\xc7"
+ "\x59\x5e\xff\x30\x5a\x76\x3e\xc1\x59\xfb\xf7\x69\x19\xdb\x59\x5e"
+ "\xaf\xe0\xc6\xc8\x96\x29\x98\x4f\x50\x41\x39\xdd\xc6\xe5\x98\xaf"
+ "\xba\xb7\x39\x89\x8c\x02\x25\x39\x09\x96\xcb\x6b\x29\x97\x23\x37"
+ "\xda\xf8\xdc\x95\xf9\x04\xcd\xf1\xb9\x4d\x37\x23\x9f\xcb\xe9\x66"
+ "\x31\x9f\x67\x6e\x17\xf3\x79\x66\xa1\x98\xcf\xb3\xb6\x8b\xf9\x3c"
+ "\xab\xc0\x9e\xcf\x1d\xb9\x3c\xd3\x22\xc5\xe3\xb1\x7f\xc6\x1c\x45"
+ "\x56\xa8\x3c\x87\xaf\xd1\x28\xe7\xf0\xb5\x7d\xff\xcf\x71\xb8\xda"
+ "\x9e\xc3\xd7\x86\x23\x07\x59\x3e\xb0\xe3\xf0\xb9\x1c\x87\x73\x3c"
+ "\x92\x77\x85\xd3\xc2\xf6\x1c\x5e\x0b\xf7\xd1\x8c\x1f\x37\xff\x6c"
+ "\xcf\xe1\xeb\x42\x44\x1c\xae\x6e\x86\xc3\xe7\xd2\x3c\x88\x68\x5c"
+ "\xae\x4c\x2e\x04\xee\x23\x62\x93\x8c\x36\xb7\xb5\x99\xb0\x3e\x62"
+ "\x0e\x5f\x57\x28\xe6\xf0\x75\x7a\x31\x87\xaf\xcb\xe6\x39\x9c\x3b"
+ "\xd7\x22\xda\x7c\xdd\xce\x16\xd7\xe6\x36\x7c\x38\xe5\xf0\x75\x3b"
+ "\x79\x6d\x9e\xb5\xb2\x79\x0e\x5f\x13\x28\xcd\xe1\x70\x9c\xe5\xf0"
+ "\x35\x81\xb2\xf3\x1c\x1c\x38\x3c\x3b\x4a\x01\x87\x8b\x73\x21\x36"
+ "\x0e\xe7\x72\x21\x79\x82\x5c\x88\x25\x95\xe6\x42\x36\x5d\xa1\xd8"
+ "\xe8\xe4\x41\x71\x0a\xf8\xf1\xdf\xac\x72\xee\xdd\x36\xb9\x95\x07"
+ "\xc9\x8e\x54\x92\x07\x61\xf9\x1b\xe7\x38\xbc\x06\xbc\x5d\xe6\xe2"
+ "\x1c\x87\x71\xb6\x39\x0e\x99\x32\x73\x1c\x38\x3e\x9f\x79\x07\x7c"
+ "\xce\xce\x71\x58\xbf\x44\x9c\x63\x5e\x9f\x64\xcb\x31\x53\x3e\xdf"
+ "\xb8\x5a\xcc\xe7\x1b\xd3\x9a\xe6\x3c\x00\xe7\x97\xc6\xae\x75\x98"
+ "\xf3\xd0\xc4\xed\x6c\x1e\x74\xfd\x39\xdd\x9f\xab\x49\x13\xbf\x87"
+ "\xf1\xfc\x0e\x65\x8d\x10\x71\x7b\x95\x90\xdb\xff\xea\x25\xe2\xf6"
+ "\xf3\x39\xe2\xf1\x11\x55\xb1\x02\x6e\xb7\xcd\x79\xc8\xf1\x38\x5e"
+ "\xd9\x0c\xb7\xc3\xf7\x5d\x9f\x23\xd6\xb2\xdc\x6e\x9b\xdf\x20\xc9"
+ "\xed\xc2\xf9\x0d\x82\xf1\x0f\xc8\xed\xec\xde\x1b\x7e\x76\xdc\xbe"
+ "\x34\x52\x65\xf9\x1a\x9e\x07\xe0\x75\x7c\x46\x2c\x0c\x70\x3b\xdb"
+ "\xde\x39\xc3\x85\xdc\x7e\x3b\x95\x72\xfb\x47\x57\xee\x9c\xdb\x9b"
+ "\xf4\xb0\x90\xdb\x5f\x44\x6e\xdf\x30\x8c\xce\xbf\x48\x71\x6d\xfe"
+ "\x85\xdd\xf8\x8c\x8f\x5c\xc8\xbf\x38\xe5\x78\x89\x7a\x89\x39\x7e"
+ "\xc3\x1a\x31\xc7\x6f\x38\x22\xe6\xf8\x0d\x4b\x78\x8e\xe7\xce\xb5"
+ "\x88\x4e\xdf\x90\x79\x6f\xf2\x2f\x1b\x32\x79\x8e\xdf\x18\xd3\xfc"
+ "\xdc\x8b\xbf\xfa\x48\x8f\xcd\x80\xe3\x2c\xc7\xff\xd5\xc7\xe9\xdc"
+ "\x0b\x51\xbe\xfb\xa3\x19\x92\x73\x2f\xca\xee\xde\xd8\x0c\x21\x56"
+ "\xec\xf3\x2f\xee\xe7\xbe\x3f\x0a\x53\x9a\x7f\xc1\xb9\x17\x4b\x4f"
+ "\x0b\xe6\x5e\x54\x36\x3f\xf7\x22\x31\xc4\xc5\xfc\x8b\x93\xb1\x19"
+ "\x27\x82\x85\xe3\xdd\x72\x5f\x13\xf3\x7b\xee\x8c\x26\x7e\x7f\x05"
+ "\xf9\x3d\x7f\xbe\x98\xdf\xf3\x63\xb1\x9e\x52\x73\x31\xbe\x14\xbd"
+ "\x57\xcc\xdd\x2f\x1e\xab\x61\x97\x7f\x79\x05\xb1\x97\xdf\x5b\xc4"
+ "\xef\xe7\x85\xfc\x9e\x5b\x2d\xa5\xdd\x31\xef\xcd\x8e\x29\x9e\x29"
+ "\x98\xd3\x36\xd9\x36\xfe\x6d\xd3\xd5\xe3\xa1\x70\xff\x7a\x99\xb1"
+ "\x6e\x33\xe9\x58\x37\x76\x6c\x1b\xe6\xc1\xa1\xac\xdd\x33\x63\x55"
+ "\xda\x70\xc6\x8a\x63\xdd\xec\xc7\xb9\xe1\xd8\x37\x1c\xeb\x56\x1c"
+ "\x99\x29\x3b\xce\x0d\xb1\x29\x37\xd6\x0d\xea\xed\xcb\x72\xfd\x45"
+ "\x8e\xeb\xb9\xb1\x6e\xb9\x8b\xf8\xb1\x6e\x22\xae\x97\x18\x3f\xbc"
+ "\xff\x7c\x8a\xb4\x8e\x4f\xe6\xb9\xbe\x11\x75\xfc\x0b\x76\xb9\x18"
+ "\x36\x06\x9b\x35\x77\x35\x17\xc3\x72\x7d\xde\x63\x25\x88\xe3\xb0"
+ "\x58\x89\x5c\x8c\xe3\x18\xe7\xbb\x97\x8b\xc9\x5b\x28\xe6\xf8\xbc"
+ "\x02\x31\xc7\xe7\xcd\xe0\x39\x9e\x3b\xd7\x22\x1c\x9f\x17\x77\x6f"
+ "\x72\x31\x79\x71\x7c\x2e\x26\x7f\xaa\xe4\xf8\x3b\x51\x8e\x3d\xb7"
+ "\x56\x3a\xc7\x9e\xcb\x8d\xbf\xcb\xad\x95\x9d\x13\xe2\xf0\x4e\x73"
+ "\xcb\x73\x34\xc7\xee\xc6\x9c\x90\xca\xb6\x96\x8b\xd9\xf2\xac\xd2"
+ "\x5c\x0c\x3b\xb6\xf9\x34\x8e\x0f\x51\x36\x27\xa4\x39\x6e\x6f\xd2"
+ "\xee\x4e\xde\x61\x8a\xb9\xfd\xe3\xe7\xc4\xdc\xfe\xf1\x30\x31\xb7"
+ "\x7f\x32\x52\xcc\xed\x9f\x04\xd9\x73\xbb\x23\xaf\x7f\xbc\x52\x8a"
+ "\xd3\x63\x5f\xc1\x5c\xcc\x36\x83\x3c\x9f\x7f\xfc\xb9\x72\x3e\xff"
+ "\xaf\x83\xff\xa7\xf9\x5c\x6d\xcf\xe7\xff\x65\xba\xab\x79\x19\x96"
+ "\xcf\xb7\x5e\x15\xf1\xb9\xba\x19\x3e\xbf\x6b\x79\x99\x6d\x63\xc5"
+ "\x7c\xbe\x2d\x5e\xcc\xe7\xdb\x06\xf2\x7c\xce\x9d\x6b\x91\xbc\xcc"
+ "\xb6\x31\xf7\x26\x2f\xb3\x6d\x0c\xaf\xd9\x3f\xe9\xdd\x3c\x9f\x7f"
+ "\x7c\x40\x9a\xcf\xe1\x38\xcb\xe7\x1f\x1f\x90\x1d\x4f\xed\xc0\xe7"
+ "\x7f\xf3\x50\xc0\xe7\x92\x63\x54\xda\x46\x5e\xe6\x6f\x44\x69\x5e"
+ "\x46\x6e\x9e\x0a\xf2\x3b\x3f\x3e\x45\x30\x4f\x25\xc8\x36\x4f\x25"
+ "\x45\x3c\x3e\xa5\xc5\xb9\xbd\xa0\x8b\x98\xdb\x0b\xfc\xc4\xdc\xbe"
+ "\x73\xb0\x98\xdb\x77\x06\xda\xea\x49\xf3\x32\xa9\x0e\xf3\x56\xc4"
+ "\x3c\x5f\xb0\x50\xf7\x4a\x35\x91\xe2\xfa\xcb\x1e\x9f\x5e\x94\xe7"
+ "\xf9\x82\x5c\x39\x9e\xc7\xf1\x2a\x9f\xce\x8c\x94\xe0\xf9\xed\xdb"
+ "\x7e\x0d\x3c\x2f\x37\x0e\x85\xf5\x41\xc0\xf1\xc8\xf7\x2c\xbf\x73"
+ "\x5c\x8f\x3c\x6f\xf9\x87\x54\x8e\x66\xbb\xbe\xb5\x78\x5e\x3e\x47"
+ "\xb3\xe3\x5c\x49\x18\xc7\xf3\xae\xcc\xa1\x39\x2c\xce\xd1\xe4\xce"
+ "\x6d\xed\x1c\xcd\xa7\xcf\x89\xf9\xfe\xd3\x48\x31\xdf\x7f\xfa\x18"
+ "\xcf\xf7\xdc\xb9\x16\xd1\xef\x9f\x3e\x7b\x6f\x72\x34\x9f\x3e\xcb"
+ "\xf3\xfd\xce\x2e\xcd\xf3\x7d\xc1\x56\x69\xbe\x2f\xe0\xd6\x66\x2b"
+ "\xd8\xea\x3a\xdf\x17\x36\xf1\xbd\xe3\xfc\x99\x14\xf7\xc7\xc8\x8c"
+ "\xbc\xd7\x39\x9a\x42\x59\xfe\x77\xb6\x3e\x86\xfb\x39\x1a\x6e\x4e"
+ "\xe2\x6c\xe9\xf5\x31\x8e\x3b\x19\x23\x73\xbc\x48\xc8\xf5\x85\x16"
+ "\xf1\x58\xc4\x5d\x1e\xb6\xb1\x88\xc7\x4b\x90\xeb\x3f\xeb\x27\xe6"
+ "\xfa\xcf\x34\x72\x39\x9a\xfd\x56\xe1\x98\xc4\x5d\x33\xc4\x39\x9a"
+ "\x7c\x71\x8e\x66\x32\x62\x6f\xef\x19\x79\xae\xdf\xb5\x42\x3c\x06"
+ "\x9c\xce\x51\xdc\x3e\x93\x1b\x03\x3e\x53\x30\x06\x7c\xc2\xc7\x1c"
+ "\xd7\xef\xde\x76\xac\xcc\x4c\x94\x8c\x43\xbc\xf3\xb1\xde\x2b\x24"
+ "\xc7\x20\xb2\x7d\x80\x93\x71\x88\x6f\x9c\x51\xe3\x98\x66\xcd\xe6"
+ "\x45\x82\x71\x88\x4e\xd6\x33\x16\xf1\xff\xcc\x58\x59\xfe\x6f\x60"
+ "\x78\xfe\xb7\xfe\x81\xcf\xdb\x58\x51\xe7\xb3\x71\xd9\xad\x6f\xad"
+ "\xbc\x8d\x54\x9e\x44\x37\x0a\xf9\x7f\xcf\x69\xaa\xf3\x23\xdb\x58"
+ "\xde\x66\xef\x40\x31\xef\xef\x0d\x17\xf3\xfe\x5e\x3f\x9e\xf7\xb9"
+ "\x73\x2d\x32\x16\x7d\xef\x80\x7b\xa3\xf3\xf7\x0e\xe0\xf3\x36\x9f"
+ "\x75\x68\x9e\xf7\x77\x65\x4a\xf3\xfe\xae\x4c\xca\xfb\xbb\x32\x9d"
+ "\xe6\x6d\x44\x63\x23\x3f\xbb\x7a\xc7\x79\x1b\x9b\xce\xbf\xe7\xf3"
+ "\x7a\x3e\xab\x55\x92\xb7\x69\x9a\x93\x7e\x47\x79\x1b\x69\xbe\xb7"
+ "\x69\xfb\xe3\x4e\xde\xb9\x8a\xf9\xfe\xbf\xaf\x8a\xf9\xfe\xbf\xaf"
+ "\x8b\xf9\x7e\x5f\x47\x31\xdf\xef\xf3\x91\xca\xdb\x88\xb9\xfe\xf3"
+ "\x91\x52\x3c\x1f\x3b\x19\xf3\x36\x7f\x3f\x20\xcf\xf1\x9f\x47\x2b"
+ "\xe7\xf8\x2f\x56\x3e\xe0\x78\x3b\x8e\x57\xdb\x73\xfc\x17\x47\xee"
+ "\xaa\xc6\x67\x39\xfe\x7f\xf6\x8b\x38\xbe\x05\x73\x39\xae\xcc\x27"
+ "\x91\xd7\xf6\x7f\xb7\x1b\xff\xfe\x77\xbb\xf1\xef\xff\x23\x18\xff"
+ "\xfe\xf7\x31\x2d\xc7\xf1\x7f\x6f\xf9\xf1\xef\x2e\x71\xfc\xdf\x05"
+ "\xe3\xdf\xff\x7e\xb5\x79\x8e\xff\x3c\x4e\x9a\xe3\xe1\x38\xcb\xf1"
+ "\x9f\xc7\x39\xd5\xf6\x22\x8e\xdf\x77\xaa\x35\x72\x39\xf7\x66\xbe"
+ "\xd1\x3e\xd9\x3d\xec\x94\xae\x3b\x22\x9b\xcf\x19\x6a\xcb\xe7\xc4"
+ "\xca\xe4\x73\x5a\x8a\xf3\xf7\x5f\x14\x73\xfe\xfe\x4b\x62\xce\x3f"
+ "\xe4\x27\xe6\xfc\x43\xbe\xe2\x7c\xce\x02\x87\x7c\x8e\x98\xff\xbf"
+ "\x1c\xab\x9b\x2c\xcc\xe7\xe4\x0b\xf2\x39\x07\x8f\xca\xf3\xff\x97"
+ "\xb2\xfc\x7f\x8b\xe5\xff\x70\x09\xfe\xff\xc7\xff\x11\xfe\x0f\xbf"
+ "\x03\xfe\xff\xc7\x3d\xe0\xff\x03\x87\x69\x8e\xc7\xc5\x75\x52\xf6"
+ "\x2b\xcf\xf1\xdc\x59\x3f\x70\xb0\xbb\xb8\x1f\x38\x38\x51\xdc\x0f"
+ "\x1c\xf4\xe0\xfb\x01\xee\x5c\x8b\xf4\x03\x07\xfd\xef\x4d\x3f\x70"
+ "\xd0\x9f\xef\x07\x0e\xde\x6c\xbe\x1f\xf8\x52\xa6\x1f\xf8\x92\xeb"
+ "\x07\xbe\x54\xd0\x0f\x1c\xba\x24\x9f\xe3\x89\x75\x3f\xc7\x33\xec"
+ "\x5e\xcf\x83\x3a\x54\xad\x28\xc7\xb3\x3e\xdb\x50\x84\x6b\xa4\x5c"
+ "\x24\xaa\xa5\xb3\x6c\x39\x1e\x9d\x5d\x8e\x47\xe7\x90\xe3\x59\x72"
+ "\x91\xe3\xff\x89\xdc\x7c\xd3\xc9\x77\xb0\x46\x0a\xbb\x9f\xf4\x57"
+ "\x17\xc5\xe3\xe6\xbf\x62\xf9\x9f\x5f\xbf\xef\xeb\xf9\x58\x2f\xda"
+ "\xff\xe8\x9c\xac\x81\xaa\x1b\x2c\xca\xe9\x4c\x94\x5a\x23\xe5\x6b"
+ "\xd1\xb8\x1b\xf1\x7c\x53\x5d\x98\x88\xef\x27\xd3\xf9\xa6\x3b\xa4"
+ "\xde\xd3\x36\xad\xc9\x7f\x38\x86\x5d\x93\xbf\x69\x2d\x3f\x5d\xbe"
+ "\x4b\x6b\x49\xcf\xe4\xd6\x92\x3e\x7f\x0f\xd6\x92\x76\x75\x4d\xfe"
+ "\xf3\xf6\xeb\xf7\xfd\xb3\x43\x69\x91\x8e\x94\x20\x46\xc2\xec\xd7"
+ "\x3e\xd5\x49\xcf\xdd\x57\x71\x73\xf7\xe7\xb5\xce\x3a\x28\x58\x1f"
+ "\xb6\xcf\xef\x5a\x49\x0a\xb5\x06\xb6\x3e\xb8\x77\x37\xd4\x75\x75"
+ "\x11\x60\xd5\x8a\x7c\xba\x00\xf9\xf4\x9f\x3a\xf6\xda\x8b\x80\x85"
+ "\xae\x91\xc1\x88\xe3\x74\x2b\xf1\x89\x5d\x84\xdc\xfa\x4f\x76\xdc"
+ "\x17\xc8\x08\xe0\x56\x7a\x5d\xd2\x45\xc6\x62\xe9\x1a\x1b\x0c\xf5"
+ "\x7f\x68\xd7\xbc\xb2\x76\x25\x7a\x23\x3c\x17\x57\xd8\xbd\x5c\x4b"
+ "\xcd\xf5\x3a\x8c\xc5\xa1\x79\x65\x5e\x0c\xf0\x6f\xde\x5b\xc4\x5b"
+ "\xd9\x73\xfa\xcf\x34\x56\xcf\x60\xbf\xd7\xb5\xd2\x07\xd7\x01\xb1"
+ "\x69\x2b\xeb\x2f\x7c\x7e\x6b\x13\xb4\x8f\x95\xa1\x7d\xdf\x1b\x51"
+ "\x94\x37\xe0\xf7\x34\xd0\x96\xec\x18\x5b\xe4\x0d\x76\x0f\x2b\xe0"
+ "\x8d\xcd\x75\xfc\x7b\x6c\x2c\x1f\xdb\x88\xe6\x51\xbe\xe6\xc7\xbf"
+ "\xe8\xe5\xb8\x55\x17\x21\xcd\xad\xba\x08\xca\xad\xba\x88\x26\x6e"
+ "\xd5\x4b\xe4\x51\x44\xe3\xd8\x8f\x70\xe3\x5f\x74\x76\x1a\x5b\x77"
+ "\x1f\xae\x8f\x72\x44\xd1\xf8\x17\x96\x4f\xa3\x29\x9f\x22\x5f\xd9"
+ "\x38\x95\xcf\xa3\xe8\x64\xf3\x28\xcd\x71\xaa\xa2\x39\xfc\x2c\xa7"
+ "\x1e\x7d\x4e\xcc\xa9\x47\x87\x89\x39\xf5\xd8\x7e\x7b\x4e\x75\xe4"
+ "\xd3\xa3\x4b\xa4\xb8\x94\xae\x8f\x72\x2c\x52\x9e\x47\x8f\x6e\x95"
+ "\xe3\x51\x76\x7c\xfa\x4c\xc1\xf8\xf4\x26\x1e\xfd\xd7\x17\x62\x1e"
+ "\x3d\x5a\xe3\x2a\x8f\xb2\x7b\x9b\x9c\xbf\x0b\x7b\x9b\xb8\xcd\xa3"
+ "\xb1\x76\x3c\xfa\xef\xa9\x3c\x8f\xda\xef\x6f\xd2\x0c\x8f\xce\x6d"
+ "\x9d\x35\x50\x44\x3c\x6a\x35\xb0\xf5\x09\x98\xc7\xd6\xf5\xb4\x98"
+ "\x47\x8f\x79\xcb\xf3\xe8\xbf\xb7\xf1\x3c\x4a\xaf\x6b\x5d\x1e\xfd"
+ "\x77\xb9\x88\x47\xe7\x0a\x78\xf4\x67\xde\x43\xe0\x18\x8b\x26\x1e"
+ "\x8d\x11\xf0\xe8\xdc\xe6\x78\xf4\xdf\xe5\xd8\x46\x54\xa3\x1e\xdb"
+ "\xd0\x3c\x8f\x1e\xdd\x29\xcd\xa3\x70\x9c\xe5\xd1\xa3\x3b\x79\x1e"
+ "\x95\xd0\xa8\x22\x1e\x3d\x9e\xa4\x80\x47\xdb\xf8\xda\x28\xc7\x13"
+ "\x15\xe5\x2a\xf8\x39\x9d\x8e\x6b\xa4\xce\x10\xce\x09\xda\x67\xb7"
+ "\xef\xc9\x3e\x87\x7d\x4f\x96\xd8\xe6\x78\x8e\xe3\x78\x75\xc2\x1d"
+ "\xf0\x2a\x3b\xc7\xf3\xc4\x6a\xf1\xd8\x93\x13\x6b\x6c\x63\x4f\x28"
+ "\xaf\x96\xf4\xb5\xd5\x8b\xdf\xf7\x64\x9f\x93\x35\x52\x4f\x5c\x14"
+ "\xad\x8d\x32\x4e\xb8\x36\x4a\xf1\x69\xf9\x35\x52\x4f\x7a\x8b\xd6"
+ "\x46\x39\x51\xd0\xb4\xef\x89\xfd\x1a\xa9\x3c\xc7\x16\x75\x67\x39"
+ "\xb6\x69\x0d\xaa\x93\x13\x9b\xd6\x48\x6d\x66\x5e\x10\x96\xb3\xab"
+ "\x2a\xb2\xf5\x39\x56\xa7\x80\x63\x45\xfb\x9e\xd8\xaf\x31\x55\x74"
+ "\xb0\xf4\xd8\x3e\x52\x12\xbe\x4f\x62\x6d\xd4\x7d\xf7\x74\xef\x13"
+ "\xac\x97\x34\xd7\x16\x8f\x14\x73\x6d\x71\x1c\x7b\xed\x39\x29\xae"
+ "\x2d\xee\xc2\x73\x2d\xbd\x2e\xe9\x9c\x1d\xd7\x56\xca\x70\x2d\xf4"
+ "\xab\x79\x97\x95\x72\x6d\x71\x10\xcb\xb5\xa9\x1c\xd7\x5e\x69\x69"
+ "\xae\x2d\x0e\xe2\xb9\xb6\xa4\x5d\xf3\x7b\x4c\x9d\x54\x4b\xcf\xcb"
+ "\x39\xa9\xa6\x5c\x7b\x52\xed\x74\x8f\x29\xd1\x98\x8f\x92\x9b\xb6"
+ "\x3d\xa6\xf8\x7c\xc0\x3e\x2e\x1f\x70\x3f\xef\x89\x52\x62\x54\x9a"
+ "\x0f\x38\x09\xde\x1d\xe7\x5d\x2e\xc5\x3d\xa7\xc2\x70\x4f\x94\x3d"
+ "\x76\xf9\x80\x3d\x8e\xf9\x80\xd7\x9c\x73\xac\xa2\x7c\x00\x3b\xef"
+ "\xb2\xf4\xba\x98\x63\x4b\x6f\x8a\x39\xf6\x7f\x57\xdb\xe6\x59\x62"
+ "\x7d\xe4\xd7\x4c\x2d\x1b\xd9\x94\x0f\xa8\x14\x73\x2b\x9f\x0f\xf8"
+ "\xdf\x11\xf2\x1c\x5b\x26\xce\xff\x4e\x28\x10\xcd\xb3\xdc\x51\x25"
+ "\x5c\x87\xda\xb6\xfe\xd4\xa9\x95\xc7\xcb\x85\x1c\x5b\xb6\xe7\x7e"
+ "\x5a\x87\xba\x69\xad\xa9\x66\xc6\x72\x3b\xae\x43\xfd\x4d\xdf\xd2"
+ "\x63\x7b\x08\xce\x6d\x63\xf9\x56\x94\x1b\xd8\x73\x6f\x72\x03\xc7"
+ "\xf6\xc8\xe4\x06\xbe\xd9\x2e\xe6\xd9\x6f\x2a\xd9\x6b\xcf\x48\xf1"
+ "\xec\x37\x4b\x78\x9e\xa5\xd7\x25\x9d\xb1\xe3\xd9\x8a\x96\xd4\xb4"
+ "\xdf\x14\xb4\x6e\x6e\xe0\x9b\x02\x3e\x37\xf0\xbf\x2e\xcc\x7f\x2c"
+ "\x8b\x93\xe6\xd9\x32\x2e\xef\x5a\xc6\xe7\x5d\x2b\x24\xf6\x4b\x11"
+ "\xf1\x6c\xf9\x54\xdb\xfc\x47\x56\xd3\x56\xda\x34\xed\x9e\xfb\x70"
+ "\xbf\x94\xf2\x60\xa5\xb9\x01\x9c\xe7\x8e\xdc\x8a\xdc\x65\xe3\x57"
+ "\x3e\x37\xb0\x47\x3e\x37\xd0\x0c\xbf\x2a\xdf\xbb\xef\xf4\x54\x31"
+ "\xbf\x9e\x0e\x11\xf3\x6b\xc5\x45\x7b\x7e\x75\xe4\xd6\xd3\xd9\x52"
+ "\xbc\x4a\x73\x03\x15\x99\xf2\x9c\x7a\x5a\x27\xc7\xa9\xec\x9a\x7e"
+ "\x55\xfc\x18\x69\x9e\x53\xbf\x3d\x27\xe6\xd4\x6f\xbd\x5c\xe5\xd4"
+ "\x7b\xb2\x5f\x8a\xdb\x9c\x1a\x69\xc7\xa9\xdf\x2d\xe1\x39\xd5\x7e"
+ "\xcf\x94\x66\x38\xb5\xb5\xf2\x04\x42\x4e\x15\x69\xd7\xef\x2c\x62"
+ "\x4e\xad\x08\x94\xe7\xd4\xef\x8a\x79\x4e\xa5\xd7\xb5\x2e\xa7\x7e"
+ "\x67\x6e\xdd\x3c\xc1\x77\x66\x5e\xbb\x56\x1c\x6e\x9e\x53\x4f\x1f"
+ "\x93\xe6\xd4\xd3\xc7\x28\xa7\x9e\x3e\xe6\xfa\x9c\xf2\x33\xdb\x14"
+ "\x70\x6a\x1b\xdf\x4b\xe5\xcc\x56\xc5\x79\x02\xcc\xb7\x22\x97\x56"
+ "\xde\xd9\xda\x21\xf1\xb6\xb5\x43\xc6\x70\x1c\xfb\xe2\x9d\x72\xec"
+ "\xd9\x2f\xc4\x63\x1a\xce\xee\xb7\x8d\x69\xa0\x1c\x7b\xfe\x35\xf1"
+ "\xfe\xa8\x8e\x6b\x85\x88\xd7\x50\xfd\xbe\x43\x53\x9e\x00\x39\x77"
+ "\x8c\x30\x4f\x70\xbe\x83\x3c\xdf\x7e\x1f\x28\xca\x13\xfc\x4b\x9a"
+ "\x6f\x6f\x89\xf8\xb6\x72\x12\xcb\xb7\x4d\x6b\xa8\x7e\x1f\x67\x5b"
+ "\x43\xb5\x59\x0d\x2b\xe2\xdb\xf0\xbb\xc3\xb7\xfb\x5c\xe7\x5b\xf1"
+ "\x5e\x2a\xf6\xeb\xa5\x56\x5e\x2f\x3d\x02\x7c\xcb\xae\xd7\x61\xbf"
+ "\x66\xaa\x6b\xeb\x75\xb4\xd6\x9a\xa9\x58\x2f\x69\xde\x3d\xb7\x50"
+ "\xcc\xbb\xe7\x0a\xd8\x6b\x25\x79\xf7\xdc\x58\x9e\x77\xe9\x75\x2e"
+ "\xf3\xae\x5b\x39\x83\x73\x71\xad\x9b\x33\x38\x17\xc7\xf3\xee\xf9"
+ "\x61\xcd\xf3\xee\xf7\x43\xa5\x79\xf7\xfb\xa1\x94\x77\xbf\x1f\xea"
+ "\x94\x77\x45\x63\x08\x2e\xf4\x93\x5c\xcb\xa3\xf2\x7e\xdf\x67\xe5"
+ "\x82\xc6\x9d\x9c\x01\x70\xb0\x2a\x11\xd7\x70\x0a\xc7\x31\x04\xcd"
+ "\xe7\x0c\x9a\xe3\x5b\xe5\x39\x03\x7d\x5f\x31\xdf\xea\xfb\x89\xf9"
+ "\xf6\x87\xd3\x58\x2f\xa7\x39\x03\x96\x03\xf4\x0b\x9b\x72\x06\x7a"
+ "\x31\xcf\xf2\x39\x83\x1f\x96\xcb\xbf\xfb\xd2\xe7\x8b\xf4\xed\x8b"
+ "\x76\x6b\x56\xcf\xe4\xf9\xf6\x44\x89\x6d\xcc\xd8\xc5\x53\xc7\x83"
+ "\x85\x7c\xab\xaf\x76\x58\xb3\x7a\x5a\x0b\xae\x59\x3d\xad\x85\xd7"
+ "\xac\x0e\x11\xaf\x59\xbd\xf1\x16\x3f\x8e\x4c\xf9\x9a\xd5\x55\x31"
+ "\x2c\x07\x23\x86\x70\xdd\x6a\x57\xf2\x08\xad\xbc\xd7\x8a\x88\x7b"
+ "\x45\x79\x84\xaa\xeb\x62\xee\xfd\xa1\x8f\x3c\xf7\x56\x1d\xe6\xb9"
+ "\x97\x5e\xd7\xba\x9a\xb7\xca\xd0\xba\x79\x84\x2a\x03\x9f\x47\xf8"
+ "\xe1\x0b\x49\xee\x15\xbd\x1b\xd3\x17\x48\xbf\x1b\x83\xe3\x2c\xf7"
+ "\xea\x0b\x64\xf3\x08\x0e\xe3\xb7\xaa\x37\xd0\x77\x63\x9c\xe6\xd5"
+ "\x2b\xc8\x23\xb4\xb9\x31\x06\xd5\x39\xee\xe4\x11\x90\x6f\x91\xcf"
+ "\x6c\x9c\xeb\x4a\x1e\xa1\xe5\x35\xee\xa5\x0d\x62\xce\xbd\xb4\x49"
+ "\xcc\xb9\x3f\x8d\xb0\xe7\x5c\x47\xbe\xbd\x74\x4e\x8a\x6b\x69\x1e"
+ "\xa1\xa6\x56\x9e\x67\x2f\x7b\xcb\xf2\xac\xdd\xd8\x5c\x9e\x67\x7f"
+ "\x1c\x26\xe6\xd9\xcb\x13\xdd\xe2\x59\x57\xf7\x60\x69\x53\x3c\x1b"
+ "\x6e\xc7\xb3\x3f\x9e\xe6\x79\xd6\x7e\x1f\x96\x66\x78\xb6\x95\xf6"
+ "\x61\x91\xd7\xb8\x35\xaf\x89\x79\xb6\x26\x4d\x9e\x67\x6b\xfa\xf1"
+ "\x3c\x4b\xaf\x6b\x5d\x9e\xad\x09\x6d\xdd\xdc\x42\x4d\x28\xaf\x71"
+ "\x7f\x7a\xac\x79\x9e\xbd\xac\x96\xe6\xd9\xcb\xdc\x7b\xb1\xcb\x6a"
+ "\x59\x8d\xeb\xc0\xb3\x57\x3c\x14\xf0\x6c\x1b\x1f\x83\x70\x85\xb8"
+ "\x93\x5b\x60\xf9\x55\x6f\x37\x5f\xe2\x8c\x70\xbe\x84\x20\xb7\x30"
+ "\xc6\x96\x5b\x10\xef\xcf\x12\x6f\xcb\xdf\x06\x71\xbc\x3b\xea\x4e"
+ "\x79\xf7\xe7\x2e\xf5\x4d\xbc\xbb\x00\x78\xf7\x67\x76\x7e\x44\x7d"
+ "\x13\xef\x5e\x3b\x6e\xab\x17\xbf\x3f\x8b\x4c\x6e\xe1\x79\xb6\xbc"
+ "\x39\x4d\xb9\x05\xe4\xe1\x20\x61\x6e\xe1\xda\x12\x79\x0e\xfe\x39"
+ "\x4d\x94\x5b\xf8\xa7\x34\x07\x1b\x45\x1c\x5c\x7b\x90\xe5\xe0\xe7"
+ "\x6d\x1c\xfc\x73\xd9\x2d\xf0\x96\xb7\x3e\x50\xc6\xc1\x46\x96\x83"
+ "\xc7\xdd\x1b\x0e\xfe\xbc\x05\x38\x98\x6d\xf7\xab\xb3\x4a\x75\xc0"
+ "\xc1\x61\xc8\xc1\xe3\x5c\xcb\x37\xdc\xa5\x3d\x5a\xb0\x5e\xd2\x5c"
+ "\x7c\xf5\x92\x98\x8b\xaf\xf9\xb3\xd7\x4a\x72\xf1\xd5\x2f\x78\x2e"
+ "\xa6\xd7\xb5\x6e\xbe\xe1\x6a\x75\xeb\xe6\x1b\xae\x56\xf3\x5c\x7c"
+ "\x6d\x7b\xf3\x5c\xfc\x73\x96\x34\x17\xc3\x71\x96\x8b\x7f\xce\x72"
+ "\xca\xc5\xcf\x0b\xb9\xf8\x97\x26\xcd\x2b\xca\x37\xe8\xef\xf7\xbd"
+ "\x5b\x7e\x91\xd5\xbf\x01\xbd\x48\x4a\x95\xc7\x2f\xd7\x4b\x73\x09"
+ "\xb9\x91\x4a\x52\x4a\xcd\xcf\x13\x38\x06\xed\x67\xe8\x5e\xea\x3f"
+ "\x94\x58\xd7\x2e\x8d\x47\x3e\x5e\x87\x7f\xa0\x71\x33\x55\xdc\xb3"
+ "\xc5\xb6\xb1\x81\x1d\xef\x8a\xc7\x91\x7b\xf3\x04\xe7\xa5\x7e\x8b"
+ "\xc9\x4c\x30\x71\xdf\x8b\xa3\xf3\x6e\x12\xcc\xb6\xcf\x88\x4d\xbd"
+ "\x87\x21\x9e\x59\x93\x60\x34\x74\x49\x30\x4a\x7d\xff\x09\x35\xf1"
+ "\xee\xb4\x8c\x61\x36\xaf\x67\x8c\x37\x9e\xd2\xea\x6f\xac\x22\x24"
+ "\x73\x3d\x63\xa8\xff\xc0\x00\xb8\xf9\xa5\xe2\xaf\x70\xdd\x8d\xae"
+ "\x75\x65\x37\x52\x83\x09\x1c\x3b\x62\x3b\x06\xed\x46\xac\xa9\x9e"
+ "\x8c\x15\xce\x31\xeb\x47\x1d\xc8\xd3\x02\x57\x25\x12\xf2\xcc\x2d"
+ "\x7c\x66\x0c\xe5\x80\x19\xdf\x74\x28\x33\x03\xca\x62\x7e\xf3\x5b"
+ "\x23\xe0\xd1\xab\xe4\x7d\x82\xcf\xf4\x0a\xb8\xaf\xfc\x74\x6c\x7b"
+ "\xcf\xfe\x39\x8c\xca\x8b\x58\xb7\xcd\x1b\xca\xf8\xad\x37\x40\x3c"
+ "\x48\xe6\x02\xe2\x8d\xf7\x91\x01\xd7\x31\xaa\x64\x06\xfa\x11\x5d"
+ "\xa9\xd9\x48\x9f\x69\xa8\xdf\x21\xf0\xb1\x0c\xfc\xee\xe6\x05\x44"
+ "\x0d\x7f\x3e\x4c\xf6\x7a\xa8\xeb\xf5\x30\xb8\xcf\x31\x58\x2f\xb9"
+ "\x7b\xcc\xd8\x08\xfd\xce\x6f\xfd\xb1\xef\x60\x7f\x1f\x7f\x9b\xfd"
+ "\x1d\x95\x75\x85\x05\x8e\x33\xa9\xc9\x4c\x69\xbc\x99\x74\x86\xb6"
+ "\xc8\x83\x7a\x23\x1e\xad\x9f\x68\xf5\xef\xf5\x20\x64\x57\x42\x8d"
+ "\xaa\x14\xea\x6e\xf9\xeb\x6f\x8d\x3a\xed\xef\x09\x9c\x37\xa0\x67"
+ "\xb9\xec\x51\xf7\xda\x94\x9f\x08\x41\x3e\x81\xff\xcf\x31\x42\x3f"
+ "\x36\x09\x3e\x67\xc0\x7d\x58\x6f\xf8\x7b\xe1\xb5\x70\xbc\x8b\x6e"
+ "\xd1\x59\xd2\x39\x96\x78\xa7\xc3\xbd\xd1\x6b\xaf\xeb\xf1\x5a\xbd"
+ "\x47\x5d\x04\xd6\x01\x3e\x1b\xe1\x33\x7e\x0f\xc7\x90\x11\x66\xeb"
+ "\xbc\xa1\x2c\x36\xb3\xd6\x1b\xac\x7d\xe7\x0d\x65\xb9\x0f\xee\x33"
+ "\x03\xee\x19\xae\xf1\x81\x6b\x7c\xd8\x7f\xb5\x44\x9d\x05\xc7\xb0"
+ "\x1c\xf8\xd7\x47\x37\xaf\x11\xcb\x2e\xc3\xb2\x65\xda\xc1\x8b\xf1"
+ "\x5d\x6f\x60\x00\xdb\xd8\xa7\x06\x68\x3d\x4e\x55\x79\xdc\xf0\xea"
+ "\xec\xc1\x30\xf0\x9c\xeb\xde\xd3\x12\x9f\x4c\x2b\x21\xba\x1e\x58"
+ "\x4e\xdd\x39\x28\xdf\x0b\xdb\xa2\xfe\x83\xba\x03\x7a\x8f\xeb\x91"
+ "\xd8\xbe\x10\x4f\x63\xc0\x13\x78\x0f\x37\x7c\xf1\x77\xf0\x3b\xdc"
+ "\xf5\xec\xda\xf7\x58\xe7\x00\xad\x27\x03\x9f\x2d\x9e\x1e\x17\x89"
+ "\xa7\x7f\xc7\x3e\xf0\x7d\xb3\x9e\xec\x2c\xc7\xef\xeb\xe9\xf7\x00"
+ "\x4b\x37\xa0\xde\x86\xf7\xf1\x18\x7e\x96\xa9\xaf\x8f\x2d\x6e\xc5"
+ "\xfe\x80\x0d\xfb\xd8\xd9\x30\x02\xb8\xb0\x61\x04\xeb\xbb\x5b\xab"
+ "\x57\xb1\xfd\xb0\xc7\x0d\xd6\xd7\xa5\x43\x0c\x2d\x1f\xf9\x7b\x65"
+ "\x40\xdb\x5a\x6f\x63\x5c\xaa\xe0\x9c\x31\x04\xe3\x92\x91\x00\x31"
+ "\xa1\xd7\xc6\xf3\xf5\xc7\xcf\x46\x36\x9e\x56\x88\x05\x9d\xbb\x69"
+ "\xec\x87\xf7\x93\x71\x0b\xe2\xd8\x8d\x31\x1e\x81\xab\x19\xc4\x2d"
+ "\x60\x64\xd7\x02\x93\x0a\xc7\xf5\xe1\xf1\x43\x75\x26\x55\x06\x48"
+ "\x36\xe8\x67\xc9\x6a\xe0\xe5\x4d\x8b\xa0\xcd\xa1\x4c\xa6\x4f\xb4"
+ "\x6e\x90\x2d\x8e\x09\x10\xbb\x45\x80\x5d\x68\xf3\x0c\x68\xbf\xcd"
+ "\xc0\x79\xf8\xff\xcd\xd0\xff\x80\xa6\xd3\xe9\x3d\x8c\x11\x50\x9e"
+ "\x7a\x53\x37\xc6\x90\xd7\x8d\xa9\x85\x36\x1c\x5a\xff\x81\x31\xc8"
+ "\xd6\x86\x58\xa7\x0c\x38\xbe\x1a\xce\x43\x7b\x1e\xa0\x18\xba\x91"
+ "\x66\xbb\x67\xb9\xf6\x4c\xdb\x45\x86\xae\xde\x45\x7a\xae\xda\x45"
+ "\x86\x2f\xad\x86\xe7\x32\xf5\x8f\xcc\xc9\x30\x33\xf4\x89\xa7\x6b"
+ "\x1a\xbb\x25\x97\xe1\xbb\x27\xeb\x7b\xbf\xcd\x5f\xbe\x8b\x0c\xc0"
+ "\xb9\xb1\x53\x6a\x09\xc1\x3e\x7c\x4a\xbb\x0b\x4c\x69\xec\x4d\x62"
+ "\xed\x72\xba\xc6\xf2\x5e\xff\xae\x93\x6f\x12\x72\x54\x63\x24\xda"
+ "\x38\xe8\xcb\xeb\x6a\x88\xd6\xc8\x18\x4a\x52\x7e\x22\xc0\x3d\xb5"
+ "\xb4\xed\x6e\x91\x29\x73\x08\xc1\x39\x83\xd6\x9f\x35\xa4\x63\x24"
+ "\xf1\x4a\x3c\x43\xfc\x93\xab\x99\x1a\xcb\xfa\x34\x9d\x36\x89\xa8"
+ "\x76\xd5\x55\x50\xed\xe9\x71\xf3\xd4\x41\x9c\x9f\x5a\x1f\x4a\xde"
+ "\x30\x73\xfd\x51\xd6\x7a\x53\x72\x14\xe9\x8e\xf7\xd3\x99\xd5\x5e"
+ "\x37\x63\xa0\xdd\x4c\xca\xf8\xf9\xe6\x50\x36\x9e\xeb\xd3\x83\x77"
+ "\xcd\x36\x81\x6e\x1d\xad\x4f\x9e\xc3\xd4\xa0\xae\x83\xfe\x85\xd5"
+ "\x82\xa5\x35\x66\xd0\x56\x11\xd0\x7f\xeb\xc9\x57\x55\xf9\x2a\x6b"
+ "\xf6\x68\xbd\xc2\xdf\xc8\x65\xfb\x6d\xec\x4b\xa1\xee\x21\x1a\x92"
+ "\xc2\xd6\x1f\xfa\xcc\xce\x71\xa8\xa7\x98\x0b\x58\xff\x43\x70\xaf"
+ "\x4c\xef\x1d\xc1\x70\x7d\x00\xf6\x9f\x53\x2a\x75\xa4\xc8\x64\x21"
+ "\x1b\xaf\xb0\x6d\xd4\x1e\xda\xc8\x0b\x62\x6e\x84\x76\xf2\x96\x8a"
+ "\x1b\xc6\xcc\x9a\x79\xba\xc6\xea\x49\x63\xc3\xc6\xc5\x48\xe3\x32"
+ "\x79\x3e\x81\x7e\x14\x62\xb3\x86\xc6\xc6\xea\x97\x5d\x86\xb1\x51"
+ "\x76\x1f\xb7\x22\xe4\xfa\x17\xfc\x6d\x06\xf0\x81\xb8\xb0\xfa\x66"
+ "\x97\xe1\x6f\x63\x1d\xf0\xfd\x19\xe2\x60\xca\xf2\x0b\x4c\x49\x6c"
+ "\x0d\x29\x85\xfb\x61\xba\x08\xeb\x60\x56\x5a\x87\x1a\xb9\x3a\xa4"
+ "\x3d\x03\xb8\x7d\x06\x70\xfb\x0c\xe0\x56\x4f\x71\x7b\xa2\x92\xe2"
+ "\xd6\x02\xf5\x6a\x00\xed\xbe\x34\x84\xa8\xb0\x5e\x3b\xcf\xe2\x1a"
+ "\x7d\x50\xcf\x1a\x1e\xbb\x93\xae\x42\x1b\xd9\xf0\xeb\xd9\xbf\x2b"
+ "\xb6\x4f\x89\xb1\x82\x24\x23\x7e\x1b\xa5\xf0\x6b\xd2\x4d\x99\x05"
+ "\xb1\xf9\x0b\xe0\xf7\x47\x0d\xf1\xa9\x26\x5e\x49\x21\x80\xdf\x1a"
+ "\x29\xfc\x9a\xd6\x1c\x80\xdf\x74\xc0\xef\x1c\x21\x7e\x4d\x03\x95"
+ "\xe3\xb7\xde\xd4\x84\xdf\xd7\x39\xfc\x46\xd9\xe1\xb7\x5a\x80\x5f"
+ "\xbc\x6f\xc5\xf8\x35\x85\x29\xc3\x6f\xbd\xbe\x09\xbf\xe0\x4b\x36"
+ "\xbe\xc5\xb6\x51\x7b\x68\x23\xc0\x6f\xfd\xe7\xd0\x4e\x92\xf8\xbd"
+ "\xfb\xf1\x6b\x4c\x71\x3d\x7e\x8d\x53\x9b\x8f\x5f\xc3\x55\xe5\xf1"
+ "\x6b\xd8\xd7\xfa\xf1\x6b\xec\xa9\x2c\x7e\x0d\xf9\xf2\xf1\x6b\x88"
+ "\x6b\x3b\xf1\x33\x07\xb9\x1e\x3f\x73\x97\xe6\xe3\x77\xbb\x50\x79"
+ "\xfc\x6e\xc7\xb7\x7e\xfc\x6e\x57\x2a\x8b\xdf\xed\x70\xf9\xf8\xdd"
+ "\x7e\x56\x2e\x7e\xa3\xbb\x5b\x19\x2b\x8e\x9b\xeb\x96\x18\x88\x1a"
+ "\x88\xea\x35\x4b\x47\xf4\x8c\xf0\xd9\xcb\xf6\x99\xd5\x54\xe0\xab"
+ "\xed\x3e\xfb\xd8\x7d\x56\xdb\x7d\xf6\xb5\xfb\xec\x6f\xf7\xb9\xa7"
+ "\xed\x33\xc4\xab\xdd\x35\x0f\x73\x12\x78\xb6\x14\xbd\x87\xc5\x9f"
+ "\x3b\xdf\xe7\x0d\x4b\x00\xfa\xbe\x3e\x52\x75\xcf\x48\x65\x4c\x1d"
+ "\x3d\x08\x73\x5b\xc5\x90\x58\x2d\xf9\xed\x15\x0f\x4b\x5a\x63\x2a"
+ "\x58\x42\xcf\x1e\x1a\xa6\x31\x85\x58\xb3\xc6\xf8\x4e\x5e\x02\xf8"
+ "\x32\x80\x4f\x4c\xf6\x6f\x0f\x65\xff\x06\xda\xcd\x50\x12\x6b\x00"
+ "\x5d\xfe\x15\x53\xe5\x61\x59\x82\xf7\xf9\x4c\xac\x8e\x58\x3d\xfb"
+ "\x63\xde\xca\xc3\x9a\x3d\xc6\xd7\xe0\xd9\xbf\x07\xf8\x52\xfd\xea"
+ "\x54\xab\x77\x69\x6d\x39\x49\x57\x59\x03\x12\x13\x41\xd7\xd7\x7e"
+ "\x4e\x96\xd6\x32\x35\x89\x66\xc6\x54\x1a\xa6\xc3\xf7\xb6\x35\xa5"
+ "\xf1\xc7\x48\x89\xa1\x9c\x60\x9f\x87\x58\x2d\x35\x7c\x4e\xdf\x13"
+ "\xe3\x35\x70\xac\xc4\xb0\x93\x14\xc3\x67\xdd\xbc\x4b\x70\x9f\xd6"
+ "\x7e\xa5\xb5\x3b\x89\x25\x6b\x8c\xda\xea\x3b\xda\xc8\xf8\x8e\x36"
+ "\x15\xd7\x42\xdd\xb2\x46\x9b\xb1\xae\x25\x50\x0f\x76\x8f\xce\xec"
+ "\xd1\x66\xb6\x5c\x63\x19\x9b\x43\xb0\x64\xc3\xf5\x7e\x70\xbd\xdf"
+ "\x68\x13\xd6\x0f\xeb\x26\xe9\xf7\xb2\x12\x23\xa0\xee\xcf\x87\x68"
+ "\xbc\x08\xb3\xcc\xcb\x5f\x19\xde\xac\x13\x65\x7d\x64\x56\x62\x35"
+ "\x2d\xd7\xdb\x9d\x72\x65\xc7\x3f\x31\x59\x49\x5c\x7d\xd5\xee\x94"
+ "\x6b\x76\x52\x2e\x57\xdf\x00\x37\xca\x65\xa6\xc9\x97\xab\xe5\xea"
+ "\x1b\xe4\x4e\xb9\x3b\x9d\x94\xcb\xd5\x37\x45\x79\xb9\x2a\xe2\xe5"
+ "\x24\x6e\x11\x6e\x61\x41\x45\x42\x9d\x61\xc1\x2d\x1c\xa8\x88\x93"
+ "\xfb\x4f\x8a\x70\x0b\x03\x2a\x0f\xd9\xfc\x37\x62\xc0\xad\xf8\xab"
+ "\x3c\x9c\xc6\xdf\xad\xd8\xab\x3c\x64\xf7\x7f\xc4\xd8\xbb\x17\x77"
+ "\x0f\x59\xfc\xa3\x37\x86\x38\x01\xa7\xef\x08\xb2\xae\x9f\x48\xac"
+ "\xdd\x12\x55\xef\x59\x83\xc8\xe8\x24\xe8\xf3\x72\x48\x97\xd1\x9b"
+ "\x2e\x30\x41\x98\x73\x52\xa9\xb2\x92\x72\x89\x2a\x53\x65\x55\x15"
+ "\x26\x54\xa8\x4a\xcd\x43\x91\xb7\x2c\x5b\x17\x99\x3c\x9e\x84\xe3"
+ "\x87\x23\x09\x31\xbe\xab\x21\xb4\xac\x89\x24\x5d\x1b\x44\xa6\x58"
+ "\x08\xe6\x38\x8c\x93\xe7\x5f\x60\xbe\x4e\x04\x8d\x7f\x1d\xf8\x35"
+ "\xc7\x84\x7d\x69\x17\xf8\xae\x19\x70\x0c\xe5\x98\xc8\x6e\xab\xc1"
+ "\x63\xb2\x81\xbd\xd6\x00\x7e\xd4\xc0\xac\x4f\x64\xfb\x64\x26\x59"
+ "\x43\xde\x87\xcf\x97\x55\x9e\xed\x3c\x0d\x44\xb5\x19\xbc\x6a\xfd"
+ "\x2a\x4f\xa2\x57\x79\x56\xa2\x7f\x05\x9f\x5c\x9b\x7c\x1d\xf3\xf9"
+ "\x3b\x82\x76\x59\x0d\xaa\xf7\xc0\x37\xe3\xf5\xcf\xc4\x12\xd5\xd7"
+ "\x50\x1e\x5c\x3b\xe0\x70\x1c\x21\x4e\xf2\x39\x5e\x56\xdf\xac\x31"
+ "\xf8\x7d\x2c\x07\xf3\xa4\x19\x56\x68\x67\xdf\xf5\x26\xac\x37\x93"
+ "\x95\xbc\x4f\x97\x00\x7d\x8e\xca\xf3\xf3\xb1\xfd\x98\x7a\xec\x43"
+ "\xa0\xef\xe8\x71\x05\x3e\xb3\xf9\x80\x54\xa6\x8c\xf1\x1d\x55\xc3"
+ "\xa4\x77\x0c\x2a\x31\xd6\x11\xdd\xa2\x46\x52\xa5\xf2\xfc\x02\x7f"
+ "\xfb\x86\x6f\x56\x90\xd1\x37\x6b\x1c\xd4\x61\x8f\xad\xbe\xf8\x5b"
+ "\xb6\xe3\x98\xff\xe0\xea\x58\x76\x38\x51\xbe\x8e\xcc\x7b\x3d\xba"
+ "\x4e\xf1\x67\x0c\xd8\x96\x3a\x6d\x1d\xd4\xa5\xdd\x58\x6c\x6f\x26"
+ "\x2b\x4b\x6d\x4c\xd6\xf4\x62\xf3\x81\x2a\xaf\x68\xcc\x2b\x31\x59"
+ "\x63\x68\x7e\x3b\x7b\x0c\x3b\x56\x07\xb9\x1f\x34\x40\x05\x6a\xa1"
+ "\x6b\x2a\x2f\x36\x1f\x18\xa2\x51\x29\xf3\x53\x2a\x2f\xd6\xff\xea"
+ "\x7a\x61\x3b\xb4\x1b\x08\xbf\xf7\x42\x95\xca\x2b\x93\xe6\x38\xc6"
+ "\xf8\xe3\xef\xc1\x35\x3d\xe1\x37\xfd\x99\xac\x51\x7a\xbc\x0e\xce"
+ "\xef\xe1\xce\x07\x08\xce\x07\x40\x9d\x43\xb9\xf3\x65\xdc\xf9\x3e"
+ "\x82\xf3\x7d\x62\x7b\x11\x8f\x2b\x2a\x2f\x13\xde\x13\xe3\x3b\x06"
+ "\xef\xc7\x17\xdf\x27\xb0\xf7\xe4\x37\x86\x70\xd7\xf9\xd6\xaa\xda"
+ "\x75\xb9\x01\xf8\x82\xf3\x3d\x05\xdf\xef\xf9\x75\x7c\x20\x19\xbd"
+ "\x09\xdb\xb4\x5d\x1f\xbd\xd7\x8b\x03\xd8\x3c\x91\xca\x2b\x80\x6d"
+ "\x0b\xe8\x3f\x85\xe5\xc1\x71\x03\xf6\x91\x46\xd0\x91\xf0\x7f\xcc"
+ "\xb5\x8a\x72\x1d\x73\x16\x2c\x78\x67\x41\x40\xdf\x88\x80\x88\x98"
+ "\x59\x01\x6f\xbe\xb3\x70\x5e\xdc\x88\xbe\x11\x0f\x13\x22\xc0\x8e"
+ "\x9a\x49\xed\xcc\x58\xb3\x32\x56\x94\xe6\x80\x7e\x53\xa9\xa1\x2f"
+ "\x6f\x24\x59\x10\x57\x4b\xb7\xbc\x58\xcb\xfa\x3c\x78\x96\x52\xc2"
+ "\x75\x09\xa3\xa0\xed\xdb\xb1\xef\x01\x4a\x03\x08\x49\x83\xf3\xba"
+ "\x84\x13\x78\xec\x38\x7b\x0c\x1c\x33\x9b\x0b\x4b\xf0\x26\x47\x02"
+ "\xea\xd8\x7c\xda\x35\x55\x7b\x0f\x36\x77\x78\x93\xa8\xcc\xa9\xde"
+ "\xe4\xbf\xb5\x65\xaa\x03\x56\xbd\xea\xbf\xad\x15\x2a\xd4\x20\x5f"
+ "\xfb\x1f\x23\x83\xe2\xbd\x09\x9e\xff\x4a\x0b\xc7\xe1\x3c\x9e\x63"
+ "\xcb\x61\x63\xdd\x7e\x2a\x5e\x87\xf9\x35\xfc\x7f\x72\x0e\x73\xf1"
+ "\x6b\x7f\xd0\x31\xa8\x89\x55\xed\xb6\x61\x5d\x03\x7a\x10\x02\xed"
+ "\xb8\x1d\xeb\xa7\x57\xb5\x2b\xf0\xcc\x85\xeb\x17\x11\x1f\xb8\x3e"
+ "\xdb\x9a\x9d\xb1\x02\x79\xc1\xbc\xaa\x5d\x18\x93\xda\x75\xe0\xe6"
+ "\xb5\xc4\x3b\x77\x2d\x3c\x9f\x6b\x89\x57\xfd\xaa\xf6\x29\x7a\xaf"
+ "\xb0\x5a\x6c\x5b\x28\xc6\xe7\x86\x8a\xfc\x11\x8e\x65\xe9\xc9\xce"
+ "\x68\x3c\x06\xcf\x9f\x5c\x7e\xd8\xe7\x16\x68\x47\x53\x9f\x68\x62"
+ "\xf5\xcd\x88\x67\xa0\xdd\xea\xfb\x44\x07\x76\x8e\x05\x6c\xc1\x33"
+ "\xc6\xf8\x65\xc4\xd7\xaa\xbc\x0b\xfe\xf5\x2c\x21\x5a\x7c\xa6\xd7"
+ "\xa7\x84\xef\xb8\x65\x82\x67\x3b\x2f\x76\xe7\x2d\x03\x7c\xce\x23"
+ "\x05\xf0\xf9\xb8\xae\x80\x04\x4c\x06\x3d\xa6\x7a\xa8\xc3\xcb\x11"
+ "\x8c\xb9\x5f\x11\x68\xd8\xea\xcf\xc8\xc9\xf2\x63\xc4\x27\x8c\x78"
+ "\x36\xad\x23\x1f\x47\x54\x53\xf4\xf0\x79\x21\x51\x95\x98\x2c\xec"
+ "\x3b\x03\xed\x30\xcc\xfd\x17\x13\x7c\x1f\xc0\xa8\x76\xc5\x15\xd6"
+ "\x99\x80\xcb\x6a\xda\xe1\x78\x72\xab\xfa\xfb\x1a\xfc\xce\x1b\x46"
+ "\xee\x3d\xda\x0d\xee\x3d\xda\x0d\xf6\x3d\x5a\x74\x62\x38\x7d\x8f"
+ "\x86\xef\xcf\xa6\x84\x7b\x32\x58\x1e\xbe\x53\xeb\x68\x04\x1c\xbc"
+ "\xab\xe9\x64\x79\x57\xd3\x35\xa7\x8e\xf8\x96\x18\x6a\x48\x69\xed"
+ "\x31\xf2\xd1\x22\xe2\xcb\xdc\x88\xec\x50\xa4\x3b\x41\x98\xb5\xdf"
+ "\xe9\x77\x6b\x75\xed\x2c\x98\xff\xb8\xe1\xff\x70\xe7\x65\x1e\xf8"
+ "\x9c\x76\x4a\x5b\x40\x06\xe4\xd5\x91\xc0\x37\x2e\xa5\xb0\x6b\x4a"
+ "\xe1\xfe\x7f\xe6\x1b\x9a\x80\xdb\x37\x34\x4f\x34\xdc\xd0\xf4\xea"
+ "\x6c\xa0\xef\xdd\x66\x5c\x55\x13\x1c\xcb\xcb\x7c\x70\x6b\x67\x1e"
+ "\xe6\xbf\x8d\x06\x62\xee\xf2\x7d\x0d\x62\x19\x7e\xbb\x27\xbe\xab"
+ "\x49\x5e\x42\xd4\xd6\x1f\x34\xa4\x38\xb2\x8e\x0c\x82\xd8\xe3\x7b"
+ "\x89\xcd\x55\xf4\xbd\x84\x05\xfc\x12\xbe\x9b\xb8\x75\x43\xa3\x62"
+ "\x7c\xb3\xf5\x93\xa2\x02\x48\xc3\xb6\x68\xc0\xeb\x0e\x92\xdc\xc0"
+ "\x5c\x2c\x7d\xdf\x4a\x30\x67\xcd\xac\x6a\xbf\x93\xf1\xcb\xd6\x1f"
+ "\xd5\x9c\xc6\x3e\xe6\x59\x9e\x3b\xbc\x17\xba\xc7\x1d\xde\xec\xbb"
+ "\x04\x7c\x87\x07\xf1\x8b\xdd\x59\x87\xf1\x84\xb8\xd6\x19\x54\x13"
+ "\x20\x76\xc5\xd5\x1f\x43\xdc\x2a\x44\x71\x63\xe3\x0c\xd7\x5d\x8e"
+ "\x80\x78\x5d\xa2\x31\x2c\x32\x42\xfc\xf6\x63\x19\x59\x29\x85\x8b"
+ "\x4c\x2a\xf0\x64\xaa\x22\xd3\x39\x76\x3e\x0c\xc6\x71\x67\xe3\xb1"
+ "\x76\x0d\xd0\xef\xe0\xbb\xd0\x5b\x5b\xa3\x03\x1a\x7c\x33\x42\x6f"
+ "\xfb\x66\x44\x3a\x79\x2f\x4a\xe3\x19\x45\xbc\x8b\xaa\x4f\xd3\x78"
+ "\xce\xe7\xe2\x89\xe3\xe7\x16\x6b\x3a\x99\xeb\x21\x9e\xb7\x20\x9e"
+ "\x71\x7a\xb2\x71\x01\xf1\x2d\xad\xa9\xc0\x77\x46\x1d\xc6\x17\x13"
+ "\x32\xa1\x1f\x63\x2d\xd6\x9d\x65\xe3\xba\x0b\xe2\x6a\xce\x3c\x5d"
+ "\x83\xef\x4a\x9b\xe2\xba\x08\xe2\x7a\x0b\xe2\x7a\x95\x8f\xab\xa5"
+ "\x1e\xe2\x5a\x0f\x71\xad\x87\xb8\x72\xef\x53\x67\x44\x41\x5c\xf1"
+ "\xdd\xdb\x07\xf5\x81\xf8\x3e\x15\xdf\x5b\x61\x5c\x71\xcc\xb6\x75"
+ "\xb1\xa6\x27\xfb\x1e\xf5\x4d\x0d\xc9\x9b\x4d\xbc\x07\x9a\x88\x47"
+ "\xf2\x7e\xa2\x86\x7a\xaa\x9f\xfa\x9c\xa8\xa0\x3c\xc0\x7d\x15\xc1"
+ "\xf8\x96\x7e\x6e\x21\x4b\x5f\x23\xbd\xcc\x6b\x68\x9c\x4b\xcd\x5f"
+ "\x60\xde\x78\xe8\xad\xc5\x1a\xd5\x86\x45\x64\x38\xc6\x7c\xe2\xa5"
+ "\x00\x72\x34\xb8\xd8\x21\xe6\xd6\xec\x2c\x35\xc4\x29\x1c\xe3\xee"
+ "\xfe\x73\xeb\x13\xee\xfa\x73\xfb\xf0\xe1\x07\xcf\x6d\x4b\x3f\xb7"
+ "\x0f\x47\x48\x3f\xb7\x3e\x03\xdd\x7b\x6e\x7d\x06\x3c\x78\x6e\xef"
+ "\x87\xe7\xd6\xc7\xdf\xfe\xb9\x6d\xd2\x2d\x0b\xe6\xc4\xcc\x8a\x9a"
+ "\x17\x35\xef\x2f\x01\xb3\x97\xc4\xcd\x79\x97\xaa\x17\x91\x7e\xd1"
+ "\x58\xac\x41\xaa\x75\xd0\x5f\x9f\xf4\xaf\x20\xbb\x7b\x54\xa8\xac"
+ "\xd3\xfd\xbd\x98\xcc\xba\x40\x6b\x66\xdd\x9e\x75\xa0\xc5\xf1\xf9"
+ "\xce\x02\x8d\x7d\x59\xe5\xff\xfe\xbf\x7b\x82\xfe\x5c\x70\x85\xe0"
+ "\xff\xe9\xfb\xe1\xdd\xb1\x38\x87\x32\x67\x3d\x53\x83\x73\x28\x8f"
+ "\x1f\x41\x6d\xd1\xe9\xf4\x23\xa1\xe0\x27\xa6\xfb\x93\x86\xe9\xa1"
+ "\xaa\x55\x67\x89\x77\xe7\x0a\x32\xd1\x6a\x65\x18\x9d\xf6\x0a\xe8"
+ "\x3e\xbf\x22\xdd\xeb\x57\x08\x6a\x9d\xcb\x2a\xdf\x81\x01\x09\xcb"
+ "\xf0\xdf\x2e\x01\x09\x1f\x5c\xb8\xac\x7a\xf4\x14\x9b\xc7\xe9\xc6"
+ "\xd4\x30\xeb\xd3\xcb\x2c\x9f\xcc\x0b\xc6\x77\xa7\x79\xdd\x98\xea"
+ "\x5d\xe0\x37\x76\x35\x9a\x54\xef\x2d\xc0\x31\xe8\x8f\x33\xf8\x0e"
+ "\x14\xdb\xe0\xbd\x3a\xf0\x13\xef\x73\x79\x28\xd5\xa3\x23\xf0\xf9"
+ "\x02\x7d\x55\x7d\xe8\x72\x85\x0a\x9f\x37\xa3\xef\x28\xfd\xfb\x70"
+ "\x1f\x50\x47\xfd\x86\xf5\x4c\xa5\xc1\x2f\x63\x85\x57\x00\x51\xd5"
+ "\xaf\xea\x3c\x06\x34\x4f\x1c\xea\x95\x15\x70\x6e\x25\x9c\x63\xdf"
+ "\x45\xaa\xba\x9a\x98\x87\x3b\xf9\x22\xc7\x01\xa6\x3d\xae\xa9\x3a"
+ "\xaf\xc1\x35\xa4\xd2\xa8\x2f\xa9\x31\x65\x67\x44\x9a\xb7\x45\x07"
+ "\x98\x51\x4f\xf6\x8d\x0e\x6c\xc8\xce\x08\x35\x67\x67\xc4\x87\xf4"
+ "\x63\xdf\xb9\xc3\xf5\x5d\xe6\xe0\x3d\x34\x64\xa5\x84\xc3\xf5\xc6"
+ "\x1b\xbe\x79\xb1\x37\xb2\xf2\xc8\x89\xf8\x1c\x12\xf0\x0a\x72\x5f"
+ "\xe7\x83\x13\x72\x18\x73\xff\x60\xe0\xbe\x9c\x1d\xe4\xe4\x44\xe0"
+ "\xbe\x50\x47\xee\xa3\x63\x14\x2c\x84\x72\x60\x31\x81\xb2\xaa\xf1"
+ "\x19\x42\x8d\x5a\x08\xed\x80\xcf\x07\x3e\x07\x2c\x17\x02\x0f\xda"
+ "\x9e\x15\x7c\x8e\x90\xeb\xd8\xe7\xd6\xee\xb9\xc1\x67\xe5\x11\x03"
+ "\x51\xe3\xb3\x82\x5c\x88\xcf\x0a\x8e\xfd\x59\xc7\x3d\x2b\x9d\x2b"
+ "\x89\x7a\x23\xf0\x60\xa9\xf9\x18\xfb\xbc\xa0\x96\x2c\x32\x0b\x38"
+ "\x10\xdf\x1b\x09\x9e\x95\xd5\xb6\x67\xc5\xc6\x81\xf0\x3c\x98\xf1"
+ "\x59\x59\xac\x79\xa2\x71\x31\xff\xac\x4c\x3f\xa7\x26\x2c\x3f\x7e"
+ "\x70\x2b\x30\x17\x9e\x15\xcc\xa7\x59\x6c\x1c\x08\xcf\x0a\xce\x4d"
+ "\x62\x39\xf0\x6d\xe0\xc0\x5a\xe0\x40\x03\x1c\x87\x67\x64\xf3\x5c"
+ "\x8e\x03\xb9\x67\xa3\x61\x31\xc7\x81\x57\x03\x48\x63\x5f\xe4\xc0"
+ "\x8d\x32\xda\xe5\x9c\x1d\x07\x76\x19\xec\x1e\x07\x76\x09\xc4\xef"
+ "\x61\x0c\x1b\x21\x9e\x18\xc7\x09\xfe\x8c\xb9\x28\x07\xb8\x6f\x5a"
+ "\x1b\x8b\xdb\x02\xe9\xb8\xed\xe2\xfa\x2e\x49\x8e\x93\x88\x1b\xe0"
+ "\xbc\xd6\x5c\xef\x18\x3b\xe6\x03\x63\xbc\x90\xe7\x90\xdf\x90\xeb"
+ "\x90\xe3\x90\xef\xf0\xf9\x40\x9e\x43\x8e\xfb\x1d\xf0\x3f\x7c\xae"
+ "\x29\x8e\xac\x62\xf9\x2f\xf9\x12\x51\x27\x8f\x25\xbd\x4a\xf7\x59"
+ "\xc0\xdb\xdc\x24\xc8\x7f\xc2\xbe\x0d\xf9\x0e\x63\xbb\xe1\x16\xe5"
+ "\x3b\xec\xe3\x90\xdb\x1c\xfa\x38\x88\x2d\xc4\xa4\x27\xf6\x71\x6c"
+ "\xce\x22\xd5\xb7\x7b\x5e\x57\xea\x49\xb2\xba\x12\xef\xfa\x55\x8f"
+ "\xfa\x3b\xfa\x92\x47\x07\xd8\x7c\x09\x3e\xe3\xf8\xac\xeb\x55\x9d"
+ "\x43\xa9\xf7\x4c\xdb\x43\xfd\x50\x77\xba\xb7\x10\x78\x7e\xde\xef"
+ "\x3f\x1a\x43\xc7\x05\x80\xbf\xf7\x4b\xde\xc7\x64\x8f\xaa\xc1\x76"
+ "\xc5\xfb\x7c\xa3\x1f\xe0\x32\x3b\x2b\x28\x03\xdb\x2a\x3b\x6b\x0c"
+ "\xfc\x7f\x1c\x8f\xb5\x47\x37\x1d\x8d\x27\x24\x24\x5e\x29\xd6\x1e"
+ "\x65\xdf\xff\x32\xdf\x87\x3e\xca\x4c\x0f\xf5\xb2\x7e\x1f\xda\x0e"
+ "\x70\xe1\xff\x8e\x25\x85\xdc\xca\xdc\x1d\x99\x6c\x66\x6a\x02\x12"
+ "\x48\x7f\xa8\x97\xe5\xb8\x99\x90\xe3\x46\xe0\xbd\x89\xd1\x10\xe3"
+ "\x5d\x35\xbb\xad\x06\x2f\xbd\xaa\x53\x39\xf8\xc5\x1a\xe0\x5e\x2f"
+ "\x21\xf7\x52\x9e\xed\xc4\xae\x11\x66\xca\xdc\x1d\x8f\x65\x4d\x39"
+ "\x46\x3a\x43\xff\xeb\x75\x59\xe5\xb7\x69\x49\x12\xc1\xb9\xb4\xed"
+ "\xe0\xff\x51\x8d\x5d\xb5\xf8\xfd\x4e\xcc\xf7\xd3\x3c\x62\x5f\x24"
+ "\xbd\x98\xe9\xd3\x3c\x70\x1c\xc4\x76\x6b\xbe\xca\x0a\xc7\xe8\xb8"
+ "\xaa\x7c\x82\xe7\xd3\x1a\xbd\x58\x5d\x66\x85\x6b\x4a\x8c\xf9\x24"
+ "\x6d\x91\x37\xc1\xeb\xe9\x58\xbd\x7c\x82\xd7\xaf\x5e\xa0\x66\xc7"
+ "\x51\xb0\xdf\x33\xe7\x13\xfc\xae\x05\x8e\x7f\x68\xf5\x21\xe9\x09"
+ "\xbe\xe4\x78\x51\x09\x5b\xc6\xf1\xa2\x7f\x11\x2c\x03\xf0\x0f\xff"
+ "\x3f\x44\x32\x16\xf9\x03\x0f\xe4\xc3\xf9\x6f\x49\xc6\xb5\x9e\xf0"
+ "\xef\x65\xf8\xbb\x45\xae\xa8\xfc\x7c\x8e\x17\x59\x49\xe7\x65\x7f"
+ "\x64\x00\xc7\x4c\x29\xce\xcf\xd4\x92\xf6\x50\x77\xbf\xd2\x8a\x4c"
+ "\xf0\xb0\x8f\x9a\x71\xfe\x3e\x93\x3c\xbd\xd6\xca\x4c\xbf\x6a\x4d"
+ "\x9e\x7e\x0d\x7f\xdb\xc2\x4c\xff\x05\x7f\x7b\x75\x42\x00\x37\x76"
+ "\x37\x9f\x1d\x67\x98\x76\xab\x0f\xc1\xba\xe2\xef\xe2\xef\x65\x2c"
+ "\xd0\x70\xbf\x39\x80\xad\x1b\xfe\x26\x96\x29\xfc\xcd\x13\xf8\x9b"
+ "\x7f\x66\x7f\x73\x25\xfc\xdb\x05\xfa\x2e\x36\x0e\xf8\xfb\x56\x26"
+ "\xb4\x1d\x93\x1c\xea\xc9\x7e\xc7\x54\x23\xf5\x9d\x83\xf4\x3b\x8f"
+ "\xb2\xb9\x38\xfc\x4e\x03\x83\xd7\xd3\x32\xa0\x6f\x3c\x83\xc7\x9f"
+ "\x0e\xd5\x11\xc7\x18\x76\x5b\x48\xfb\xca\x6e\x63\x69\x5f\x49\x63"
+ "\xca\x62\x65\x7a\x68\x3b\x88\x9b\x1a\xfb\xd5\x2a\x55\xb7\xc7\x9a"
+ "\xca\xf8\x3e\xd4\x13\xe3\x8d\xb8\xb1\x61\x09\x71\x64\xc3\x10\x5b"
+ "\x4f\x03\x21\x42\xcc\xc0\xff\xbd\xb9\x72\xe6\xd8\xca\x81\x3a\x10"
+ "\x1b\x8e\x9e\x86\xf3\x8e\x38\xf2\x1f\xc1\xe3\xe8\x37\xe7\x4c\x5a"
+ "\x86\x41\x1c\xe9\x5e\x4f\xc5\x72\x0a\xf9\xfa\x4c\xf3\x40\x8c\xdd"
+ "\x67\xd8\xf2\xc1\x38\x3d\x9d\x48\x7c\xe9\xfd\xfc\x26\x89\xbd\x9f"
+ "\x44\x9d\x2f\xd6\xd5\x76\x1f\x58\x87\x74\x6b\x00\xb1\xdd\x47\x46"
+ "\x63\x1f\x28\xf7\x1a\xe1\xbe\xb3\x17\xcb\xb6\xb5\x01\xc4\x8c\xd8"
+ "\xbe\x63\xbb\x3e\xdd\xaa\x81\x7a\x0f\x60\xbf\x43\x31\x77\x59\x02"
+ "\x3f\xbf\xb1\xd8\x63\xee\x91\x44\x02\x02\x18\xb4\xd5\xeb\x75\xf0"
+ "\x3b\xfe\xdd\x69\xdd\xbe\xb2\x34\x7c\x1f\x8a\x71\x55\x71\xc7\x07"
+ "\x0b\x30\xc1\x95\x6f\x92\x28\xdf\x7f\x86\xa8\xfc\x50\x28\x3f\x1e"
+ "\xca\x47\xed\xf6\x3a\xe6\xec\xfc\xd9\x75\x60\x9e\x8e\xa7\xe5\xdb"
+ "\x70\xcb\x64\x26\x18\x63\x13\xc8\x43\x57\x54\xdd\x03\x28\x9f\x76"
+ "\x62\xdb\x88\x1d\x63\xa5\xb2\xe6\x5b\xed\xc6\x58\x09\xc7\xe0\xed"
+ "\xd6\x1a\xe8\xf8\x2a\x55\x77\x76\x4f\x2b\xcc\x8d\xa1\x06\x2d\x04"
+ "\xfd\xc6\x8f\xb1\x3a\x8b\xe7\x3b\xe8\x16\x55\xf1\x63\xac\x54\xfe"
+ "\xec\xfb\x4e\xbd\xaa\xfb\xb3\xf5\x2a\xa2\x82\xcf\x06\x7a\xbc\x53"
+ "\xa2\xf0\x78\xd3\x18\x46\xee\x38\x8e\x0f\xe7\x72\xc4\xb5\x5f\xef"
+ "\xc3\x3c\x61\xf7\x89\xb6\xdc\xac\x8c\xf7\x55\xa0\x91\x9f\xd4\xf1"
+ "\x1a\xf9\x49\x9d\xbc\x46\xee\xde\xe0\x5c\x23\xf7\xf6\xe6\x35\xf2"
+ "\xe3\x51\xf4\xb9\x7f\x7c\x12\x7d\xee\x1f\x67\xdf\x85\xa6\x43\x79"
+ "\xe6\x8f\x77\x84\x33\x9f\x44\x1b\x10\xe7\x9b\x41\xf3\xee\x5e\x74"
+ "\x4c\xb5\x0b\x3c\x96\x05\xf4\xf1\x7b\x09\xc4\x0b\xd7\x96\x7b\x0f"
+ "\xda\xb0\xd4\x5c\x49\x8a\xbd\x50\x23\x7f\x03\xe5\xf4\x5a\x52\x82"
+ "\xef\x37\xb3\x92\x75\xb4\x5d\x7a\x84\x40\x2c\x3c\x4b\x4d\x26\xf6"
+ "\x3a\x3c\x07\xfd\x5a\x35\xea\xe4\x43\xd6\x63\xaa\x4d\x09\xa8\xa1"
+ "\x77\x04\x0a\x35\x74\xfd\xaa\x1e\x29\xd2\xda\xb9\xd7\xb3\xe6\x55"
+ "\x42\xed\xdc\xa3\x18\xb5\x33\xe6\xf3\x51\x0f\x58\xa9\x66\x0e\x00"
+ "\xfd\x1c\x88\x3a\x1a\xb5\xb3\x55\xa4\x9d\x7b\x6e\x71\xae\x9d\x7b"
+ "\x34\x3c\xd0\xce\xad\xa5\x9d\x6d\xf9\x03\x7b\xed\xdc\x33\xc6\x3d"
+ "\xed\xdc\x33\xfa\x81\x76\x6e\x6b\xda\xb9\x67\xa8\x4d\x3b\x5b\x53"
+ "\x7d\xdb\x63\x3e\x7f\x73\x93\x76\xee\x35\xcd\x51\x3b\xf7\x8a\x74"
+ "\xd4\xce\x3d\xb2\xc4\xda\xb9\xcf\x7c\x47\xed\xdc\x6b\xbb\x9c\x76"
+ "\x06\xde\xaa\x45\xed\x8c\xf8\x42\x1d\x8d\xfa\x19\xea\x3b\x8e\x62"
+ "\xad\xd7\x19\xf7\xb4\x73\xaf\x0a\xd7\xb4\xf3\xe3\xc3\xa4\xb5\x73"
+ "\x77\x93\xbc\x76\xee\x6e\x92\xd6\xce\x01\x67\x78\xcd\x13\xb0\xad"
+ "\xed\x6b\xe7\x80\x71\xd2\xfa\x26\x60\x2a\xd5\xce\x8f\x0f\x6d\x79"
+ "\xed\xfc\xf8\x50\x69\xed\x1c\x70\x94\xea\x8c\xc7\x87\x3b\x6a\x67"
+ "\xf8\x8e\xa4\x76\x0e\x68\xe0\xbe\x33\x54\xac\x9d\x69\x19\xd0\x67"
+ "\xfa\xc9\x6b\xe7\xde\x7b\x69\x1f\xda\x7b\x19\xed\x43\x69\x4c\x1d"
+ "\xb5\x73\xef\xd7\x9a\xd7\xce\x14\x43\x6c\x3d\x65\xb5\x73\xef\x2d"
+ "\x8e\xda\xb9\xbb\x49\x5a\x3b\x3f\xb9\x84\xc7\xd1\x93\xdd\xc5\xda"
+ "\xb9\xf7\x4f\xf7\x87\x76\x96\xc5\xd6\x38\xb1\x76\x7e\x62\xbf\x72"
+ "\xed\xfc\xc4\x55\x65\xda\x19\x31\x27\xa5\x9d\x9f\x1c\x66\x8f\x39"
+ "\xb1\x76\x7e\x32\x44\x5a\x3b\x3f\x19\x23\xd6\xce\x58\xbe\x94\x76"
+ "\x7e\x72\x83\xa8\x7c\x07\xed\xfc\xe4\x17\x62\xed\x4c\xaf\xe3\xb5"
+ "\x73\x9f\x30\x2e\x17\xb1\x45\xb9\x76\xee\x33\xc2\xb9\x76\xee\x33"
+ "\x56\xac\x9d\xfb\xf8\x53\x8d\xdc\x27\x96\x6a\xe7\x3e\x03\x38\x0d"
+ "\x9e\x2f\x3c\xce\x6b\x67\x7a\xdc\x51\x3b\xf7\x59\xd1\x8c\x76\x1e"
+ "\xea\xba\x76\x1e\x14\x7f\xac\x49\x3b\x0f\x8a\xb7\x69\x67\x2b\xe8"
+ "\xc7\xcd\xa0\x03\xe0\xaf\x06\xe7\x5a\xe0\x33\x77\x59\xd5\x77\x98"
+ "\x73\xfd\x3c\xe0\x73\x5e\x3f\x3f\xdd\x8e\x3e\xfb\xfd\x7f\xa2\xcf"
+ "\x7e\xff\xed\x4d\x39\x66\xd0\xce\xa8\xa1\xb9\x1c\x73\x79\x3a\xfc"
+ "\xed\x4e\x38\xc6\xea\xe7\x5d\x75\x26\x15\x6a\xe8\x95\x38\xee\x13"
+ "\x74\xf4\xd7\x9c\x86\x2e\x35\x0e\xe5\x74\x74\x7f\x3f\xe8\x33\xf4"
+ "\xe9\x5a\x76\x2e\x98\x37\xd4\xaf\x82\xd5\xcf\x71\x26\xf2\x5f\xb7"
+ "\x86\xe2\x7b\xf8\x0a\x9d\x96\x5e\x07\xf7\x59\xc9\xeb\xed\xbe\x47"
+ "\x45\x7a\x3b\x8e\xd5\xdb\xe5\xa8\xb7\xbf\x3e\x46\xc8\x21\x2d\xd5"
+ "\xdc\xa8\xb7\x51\x77\x83\xde\x2e\xdb\xd4\x8d\x29\xaa\x5f\xd5\xd7"
+ "\x68\xd3\xdc\xab\xe1\x33\xc4\x5a\x7f\x04\xa2\xb2\xe9\x2d\xe2\x05"
+ "\x31\xa9\x78\x0f\x7e\x03\xaf\xaf\x5f\xf5\x54\x4f\xdb\x75\xd0\x67"
+ "\x97\x51\x5d\xde\xaf\xdc\x2a\xca\x69\x3f\x15\x85\x9e\x84\xed\x8f"
+ "\xa1\x1d\x50\x67\xd9\x72\xda\xd6\xbe\xd1\x81\x8c\x1f\xd5\xe6\xe2"
+ "\xbc\xb6\x66\x84\x4d\x9b\xa7\x73\xda\xbc\xc1\x17\xb4\x79\xac\x4d"
+ "\x9b\x3f\x95\xed\xa6\x36\x2f\x67\x35\xde\x84\x96\xd7\x78\x1b\x16"
+ "\xdd\x7b\x6d\x8e\xba\x1c\xb5\x38\xea\x72\xd4\xe9\xa8\xcd\x51\xa7"
+ "\x5b\x39\x6d\x8e\xeb\x1e\x9a\xea\x9b\xd1\xe6\xa0\xdd\x98\x87\x1f"
+ "\x8e\x60\xb5\xb9\x87\x50\x9b\x6b\x3a\xb8\xa7\xcd\x35\xde\x42\x6d"
+ "\x8e\xb8\x57\xaa\xcd\x31\xf6\x0e\xef\x62\x71\x5f\x07\x88\x1f\xc6"
+ "\xca\xe9\xbb\x3b\x2e\x8e\x18\x37\x8c\x19\xc6\x4e\x36\x6e\x42\x6d"
+ "\x0e\xb8\x2b\x32\xdd\x3b\x6d\xae\xb1\xd3\xe6\xa8\xc5\xa1\xed\xaa"
+ "\x51\xa3\x97\xea\xa0\x6d\xe6\x83\x4e\x07\x8d\x6e\xaf\xcf\x31\xbe"
+ "\xae\xe9\xf3\xdf\x19\x9b\x72\xdb\x2a\xdf\xf6\x9b\x31\xb7\xdd\xd5"
+ "\xa6\xcf\xfb\x19\x1d\xf5\x79\x7f\x6f\x81\x3e\x2f\xd3\xab\x9e\x1a"
+ "\x20\xd6\xe6\x81\xfd\x1c\xb5\x79\xff\xb1\xb2\xda\xbc\x9b\x84\x36"
+ "\xf7\xb3\x69\xf3\xfe\x0b\xdd\xd3\xe6\xfd\xe3\xe4\xb4\x79\xbd\x5a"
+ "\xa8\xcd\xfb\x9f\xe6\xb5\x79\x9c\x40\x9b\xf7\x1d\x2a\xaf\xcd\xfb"
+ "\xd2\x79\x59\xea\xdd\xf1\x58\x16\x6a\x2a\x7c\x57\x18\x80\x73\xf6"
+ "\x55\x03\x96\xa3\xae\xc2\x5c\x06\xd4\x1f\xb4\xd5\x80\xa9\x42\x8d"
+ "\x8e\xef\x08\x9d\xe9\xa8\xd8\xb7\x48\x2f\xd4\x52\xa8\xa3\x6c\xba"
+ "\x17\xaf\x47\x3d\xd5\xba\x5a\xea\x69\x83\xb4\x96\x7a\xda\xc2\xea"
+ "\x64\x9c\xeb\xa9\xea\x5f\x8e\x7d\x62\xcb\x6a\xf5\xfe\xe5\xd2\x5a"
+ "\x7d\xc0\x7c\xaa\x6b\xfa\x57\x60\x5c\xc4\x5a\x1d\xbe\x23\xa9\xd5"
+ "\x07\x6c\xe3\xbe\x53\x2e\xd6\xea\xb4\x0c\xe8\x9f\x0f\xcb\x6b\xf5"
+ "\x81\x33\x68\x7f\x3d\x70\x20\xed\xaf\xb9\x18\x3b\x68\xf5\x81\xed"
+ "\x84\x5a\x1d\xe3\xef\xa8\xd5\x29\xa6\xd8\x7a\xca\x6a\xf5\x81\x93"
+ "\x1c\xb5\x7a\xdf\xa1\xa8\xd5\xa5\x71\x35\x68\xb0\x18\x57\xcf\x9c"
+ "\x32\x59\x6d\x9a\x7d\x15\x96\xb7\xc9\x5e\xb3\xdf\x87\x58\x33\xf0"
+ "\xba\x1d\xef\xe9\x99\xf9\xca\x74\x3b\xfb\x9d\x6d\xca\x74\x3b\xe2"
+ "\x4f\x4a\xb7\x3f\x73\xdd\x1e\x7f\x62\xdd\x3e\xa8\xa3\xb4\x6e\x1f"
+ "\xd4\x57\xac\xdb\xb1\x7c\x29\xdd\x3e\x68\xaa\xa8\x7c\x07\xdd\x3e"
+ "\x28\x46\xac\xdb\xe9\x75\xbc\x6e\x0f\xf4\xe5\xf2\x20\xe7\x94\xeb"
+ "\xf6\x41\x37\x9d\xeb\xf6\x41\x16\xb1\x6e\x1f\x54\x46\xf5\x79\xa0"
+ "\xc6\xc4\xea\xf6\x41\xd5\x9c\x9e\xaf\x14\x1e\xe7\x75\x3b\x3d\x6e"
+ "\x12\xea\x76\x1d\xea\xf6\xc0\xa0\x66\x74\x7b\x90\xeb\xba\xfd\x05"
+ "\x81\x6e\x7f\xa1\x19\xdd\x1e\x78\xdd\xb9\x6e\x1f\x2a\xd0\xed\x7f"
+ "\xe0\x74\xfb\x10\x4e\xb7\x0f\xd9\x6e\xcb\x7b\xa3\x6e\xb7\x3c\xb1"
+ "\x23\x9c\xcb\x7b\x1f\xdb\xb5\xa8\x4c\xb5\xdb\x96\xf7\x5e\x00\x7a"
+ "\xdc\x40\xbc\x57\x2e\x20\x04\x35\x3b\x8e\x0d\x29\x32\x0d\xe5\xc6"
+ "\x87\x0c\xf1\xcb\x45\xcd\x7e\x19\xae\xa9\x06\xcd\x0e\xba\xfb\xbf"
+ "\x1a\x87\xaa\xe0\x7e\x2a\x44\xd7\x2e\x6a\xba\xb6\xd2\x76\x2d\x6a"
+ "\x75\xb8\xbe\xa8\x04\x74\x3b\x7e\x07\x9e\xff\xa2\x22\x1c\x77\xa2"
+ "\x3d\xc1\x5e\x0b\x65\x94\xf1\x1a\x7f\xf0\x76\x56\xe3\x1b\x38\x8d"
+ "\x0f\xdf\x01\xed\x72\xac\x49\xe3\x37\x96\xa9\x32\xeb\x44\x1a\xff"
+ "\x48\xfd\xaa\xc1\xe5\x36\xdd\x9e\xc1\x69\xfb\x4c\x2b\xab\xed\xcb"
+ "\x41\xdb\x57\x50\x6d\x3f\xd8\x64\xbb\x06\x30\x53\xc9\x5e\x73\x99"
+ "\xbd\xa6\x08\xae\x29\xa3\xd7\xfc\x5e\xa8\xff\x8f\x50\xfd\xff\x9c"
+ "\x9d\xfe\xff\x3d\xab\xff\x6d\x79\x79\xd4\x30\xc2\xdc\xbc\xd5\x4f"
+ "\x2a\x37\xff\x6c\x93\xfe\xcf\x10\xea\xff\xa6\xdc\xfc\xef\x15\xe9"
+ "\x7f\xf8\xcd\x63\x36\x2d\x79\x57\x74\x64\x9d\xb4\x8e\x6c\x6b\xfa"
+ "\xdf\xba\xea\xe1\x08\x7b\xfd\x8f\x9e\xc0\x96\x9b\xb7\x8a\x72\xf3"
+ "\xcf\xba\xa9\xff\x9f\x15\xe9\x7f\x8c\xa3\x1b\xb9\xf9\x63\x77\xc5"
+ "\xb7\xb5\xa1\xdc\x7c\xeb\xeb\xff\xff\x30\x0a\xf3\xf3\xa8\xff\xf9"
+ "\xfc\xfc\x73\x12\xfa\x7f\x88\x50\xff\x1f\xd1\xab\x7e\x6f\xa7\xff"
+ "\x87\x4b\xe8\xff\x21\x6e\xea\xff\x21\x6e\xea\xff\x21\x2e\xea\xff"
+ "\x21\x32\xfa\x3f\xd0\x20\xaf\xff\x03\xe9\xfa\x9e\x99\xbc\x4e\xc3"
+ "\xf7\xa0\x01\x8b\x50\xa7\x0d\xa5\xfa\x9f\xea\x36\xd0\x69\x43\xef"
+ "\x13\xfd\xff\x07\x19\x4d\xf6\x07\x81\xfe\x1f\xd2\x0a\xfa\x7f\x88"
+ "\x8c\xfe\x1f\xca\xe9\xff\x21\x12\xfa\x7f\x88\x8c\xfe\x1f\xca\xe9"
+ "\xff\x21\x76\xfa\x7f\x08\xa7\xff\x87\x3a\xd1\xff\xc3\x38\xfd\x3f"
+ "\x8c\xd3\xff\x34\xc6\x8e\xfa\x7f\x98\x0b\xfa\x7f\x08\xa7\xff\x87"
+ "\x38\xd1\xff\xc3\x24\xf4\x7f\xa0\x01\xf5\xbf\x34\xae\x5e\x18\x2c"
+ "\xc6\xd5\xf3\x76\xfa\x7f\xd8\x7d\xa4\xff\x65\xb1\x66\xa7\xff\x9f"
+ "\x77\x43\xff\x3f\xaf\x50\xff\x0f\x91\xd1\xff\xcf\x5f\xb7\xc7\x9f"
+ "\x58\xff\xbf\x20\xa3\xff\x5f\xb0\xd3\xff\x43\x64\xf4\xff\x0b\x53"
+ "\x45\xe5\x3b\xe8\xff\x17\xec\xf4\xff\x10\x3b\xfd\x3f\x9c\xd3\xff"
+ "\x81\xd9\xca\xf5\xff\x0b\xcd\xe8\xff\x17\xec\xf4\xff\x0b\x9c\xfe"
+ "\x1f\xce\xe9\xff\x17\x38\xfd\x1f\x98\x25\x3c\xce\xeb\x7f\x7a\xdc"
+ "\x51\xff\x0f\x6f\x4e\xff\xfb\x98\xb7\x46\x07\x34\xf6\x89\x0e\x6c"
+ "\xcc\xca\x0b\x7e\xba\xfa\x71\x4b\xd3\x9e\x07\xe1\xa0\x07\x2a\x41"
+ "\x1f\xcc\x22\x2a\x5c\x37\x40\x7b\x0a\xfa\xfd\x59\x74\x7c\x3f\xf6"
+ "\xfd\x38\xfe\xa4\x30\x41\xd7\x0e\xda\x94\xdc\xf6\x4d\x24\xe6\x01"
+ "\xc9\x41\xa8\x01\x1a\xb6\x46\x13\x53\x56\x46\x68\x03\x8e\xed\x8f"
+ "\x26\xaa\x37\x6a\xa5\x75\xdd\xd2\x4a\xc6\x0a\x98\xf7\x9e\x12\x46"
+ "\x35\x5d\x71\xe4\x25\x16\xc7\xa8\x0b\x36\xde\x02\x2d\x60\xac\x60"
+ "\x75\x82\x4f\x78\x00\xc9\xd5\x12\xdf\x8e\xb5\x44\xdd\xd1\xc3\xa3"
+ "\xfd\xcb\xaf\x11\x62\x01\x8d\x30\xb6\x1f\x63\xed\x5f\x1d\x80\xeb"
+ "\x04\x75\xa2\x3a\x61\x5f\x3b\x33\xa7\x13\x3e\xbc\x45\x06\x6c\x5a"
+ "\x04\xfa\xa0\x98\xea\x03\xdc\x1f\xa1\x81\xea\x83\x5e\x8d\xf5\x9a"
+ "\x27\x9a\xc6\xf6\x37\xcd\xd9\xe0\xc7\xf6\xdf\x5e\xc3\x6b\x03\xd4"
+ "\x05\xcc\x1b\x1a\x32\xc8\x44\xc7\x5a\x24\x4c\xa5\x63\xfb\x07\x54"
+ "\x13\x55\xde\x4c\xe2\x5d\x14\x5e\x85\xf3\xf0\xfd\x8b\xaa\xb7\x91"
+ "\x25\xe3\x49\x2f\x33\x6a\x81\x54\x66\x4f\x51\x75\x36\xc1\x35\x10"
+ "\x41\x2b\x0e\xcd\xe1\xf4\xc0\xc4\x59\x32\x7a\x00\xfa\x60\xd4\x04"
+ "\xb4\xef\x1d\x71\xfd\xa8\xe6\x28\x51\xae\xf3\x46\xb0\xdc\x29\x3b"
+ "\xe7\x77\x6b\x74\xa0\xb9\x4f\x34\xb1\xf8\xe6\x05\xd3\x35\x31\xb3"
+ "\x52\xac\x1f\x7f\x1a\x8b\x6b\x1d\x7e\x5a\x55\xe3\x81\xeb\x7b\xe3"
+ "\x5e\x97\xd6\x9d\xc9\x41\xa2\xf9\x18\xb7\xb9\x98\xdd\xa6\x31\x43"
+ "\x7d\x37\xa3\x96\x30\x6f\x98\x55\x04\xce\x75\x62\xe7\x63\x98\xf4"
+ "\x84\xdf\xf3\xd2\x9f\x6c\xb6\xd2\x75\x25\xad\x4b\x23\x3b\x58\x21"
+ "\x2e\x4c\xaa\x8a\x14\xde\x32\xb1\x1a\x2e\x0d\xf7\xc1\x5c\xe6\xd1"
+ "\x11\x35\x1c\x60\xff\xe1\xbc\x46\x88\xd1\x45\x1a\x23\x26\xd5\x9b"
+ "\xfd\xd7\xbc\x54\x13\x00\x65\x3f\x71\xfb\x36\x68\x38\x6e\xcf\x4c"
+ "\xdb\x1a\xbb\xec\xdc\x9a\x46\x9c\x5b\x53\x41\xcc\x6b\xe8\xba\x85"
+ "\x80\x0b\x0f\x5c\xef\x03\xea\xd0\x93\x9d\x53\x73\x5b\x83\x38\x52"
+ "\x6f\xbe\x8c\xf3\x80\xce\xb2\xf1\xb1\x70\x71\xc1\xbd\x33\x6d\xda"
+ "\xac\xa4\xe0\x34\x9d\x57\x69\x17\x8b\xdb\xdb\xa8\x06\x67\xe7\xb9"
+ "\xac\x1a\x3e\x0d\xc7\xc8\x5c\x53\xfd\x71\xe5\x51\x50\x37\x21\x71"
+ "\x4a\xe3\xf2\xc7\x15\x6d\x23\x2e\xea\x5f\x59\x5c\xfe\x73\x28\x8d"
+ "\xcb\xc8\xde\xee\xc5\x65\x64\x40\xdb\x88\x8b\xf7\xaf\x2c\x2e\x7f"
+ "\x2c\xa3\x71\x19\xb5\xdf\xbd\xb8\x8c\xda\xe7\x2c\x2e\x98\xab\xb2"
+ "\xe5\xa9\x6c\x39\x2a\xec\x4f\xa9\xdf\x99\x90\xc6\x8f\xc9\x9c\x90"
+ "\x26\x1c\x93\x79\xf2\x08\xe6\x6f\x56\x91\x13\x63\xb0\xaf\x1c\xbd"
+ "\xda\x79\x6e\xea\xa5\x72\x3e\x37\xf5\xe2\x73\x54\xa3\xbe\xd8\x9d"
+ "\x6a\xd4\xb1\xec\xb8\xed\xa4\x73\x44\x65\x7e\x6a\x5e\xf0\xae\x79"
+ "\x3a\x15\xce\x5f\xda\x75\xcd\xa4\x4a\xab\x03\xcd\xa9\x7a\x9c\xc1"
+ "\x9c\xd4\xea\x05\x38\x16\xd3\x48\x40\xef\x3d\x7e\x45\x35\x76\x2a"
+ "\xae\xbb\x76\xe8\x9a\x8e\xcd\x05\x31\x4f\x7c\x1a\xbb\xb3\x87\xc1"
+ "\x03\xfb\xd1\x5d\xf3\x4c\x2a\x1b\x96\x6c\xf3\x1a\xa1\x3d\x03\x6f"
+ "\x6c\x8b\x0e\xc0\x71\x93\x8d\x7e\x19\xa1\x16\xbf\xbc\x60\x73\x61"
+ "\x72\x90\x14\xbe\xd8\xf9\x92\xd0\x87\xe2\xfc\xc6\x99\xb1\x3c\xce"
+ "\xac\x4b\x29\xbe\x4a\x40\xb3\xe3\xde\x42\x9d\xa1\xef\x64\x6e\x47"
+ "\x76\x98\xbe\x1d\x62\xcf\x61\x0c\xfa\x6f\x79\x8c\x6d\x10\x63\xec"
+ "\x06\x87\x31\xc0\x5a\x13\xc6\x04\xf3\x1d\x03\x29\xc6\xf4\x4d\x18"
+ "\x63\xfb\xce\xa5\x9a\x9e\x88\x33\x1b\xc6\xb0\xdf\xa4\x18\xab\x92"
+ "\xc5\xd8\xc9\x4a\x69\x8c\x99\xfb\x0a\x31\x36\x32\x92\x62\x6c\xec"
+ "\x63\x47\xc3\x00\x63\x61\x4a\x31\x36\xb6\xa7\xd8\x3b\xbf\x3c\xcc"
+ "\xd1\x3b\x8f\x5d\x66\xef\x9d\x6d\x5e\xf9\x86\x5f\x56\xd0\x0d\xf0"
+ "\xcb\xc6\x26\xbf\x3c\x76\x9b\x7b\x7e\x79\xec\x56\xd7\xc6\xb2\xbd"
+ "\xd8\xee\x44\x22\x21\x27\xe0\x79\x2a\x0d\xa6\x63\xd9\x3e\x65\xfd"
+ "\xf2\xe8\x4c\xc4\xa1\xb4\x5f\xa6\xe7\x1c\xc7\x20\xbd\xb4\x8d\x1f"
+ "\x83\xf4\xd2\xfc\x86\xb5\xd2\x63\xd9\x76\x68\x73\x04\xde\x25\x47"
+ "\x62\xbc\x51\x8e\xdd\x78\xa3\x1c\x09\xdf\x92\x43\xf0\xbb\x42\xdf"
+ "\x72\x22\x98\xfa\x96\x13\xc1\xe8\x5b\x72\x58\xbd\x77\x22\xd8\xe6"
+ "\x5b\x72\xe0\x3c\xf5\x2d\x27\x82\x2f\xc3\x1f\xfa\x96\x97\x7c\x4f"
+ "\x04\x4b\xf9\x96\x97\x1e\xa3\x63\xd9\x5e\xf4\x92\x1f\xcb\x96\x23"
+ "\xf0\xc7\x39\x02\x7f\x9c\xc3\xf9\xe3\x1c\xd6\x1f\xd3\xdf\x1c\xc0"
+ "\xd6\x0d\x7f\x13\xcb\x14\xfe\x26\xef\x1f\x5e\x5a\x43\xfd\xc3\x8b"
+ "\xde\x18\x07\xb1\x3f\x86\xef\xc4\x4b\xf9\xe3\x97\xb8\xf1\x6f\x2f"
+ "\x7a\xd9\xfc\x71\x23\xbd\x9e\x2d\x03\xb8\xe6\xa2\xbc\x3f\x1e\x97"
+ "\x44\xb9\x67\x1c\x37\x1e\x9c\xc6\xd4\xd1\x1f\x8f\x13\xfa\x1f\x99"
+ "\xb1\x6c\x14\x43\x6c\x3d\x63\xe5\xfc\xf1\xb8\x18\x47\x7f\x3c\x3a"
+ "\x4d\x7a\x2c\xdb\x84\xb1\x3c\x8e\xc6\x5f\x12\x8f\x65\x1b\xf7\x85"
+ "\xd0\x17\x23\xc6\xee\x33\x6c\xf9\x8a\xc7\xb2\x8d\x5f\x2e\xed\x89"
+ "\x73\x04\x9e\x38\x87\xf5\xc4\x27\x82\x6d\x63\xd9\xc6\xef\xc7\xb2"
+ "\x1d\x3d\x71\x4e\xd3\xf5\x36\x4f\x8c\xdf\xa1\x98\x93\xf2\xc4\x13"
+ "\xda\xd9\x63\x4e\xec\x89\x27\xf4\xb6\x79\xe2\xc6\xe9\x42\x4f\x3c"
+ "\x61\x98\xd8\x13\x63\xf9\x52\x9e\x78\xc2\x1c\x51\xf9\x0e\x9e\x78"
+ "\xc2\x32\x9b\x27\xc6\xf2\x6d\xb8\xe5\x3d\xf1\xcb\x7d\x28\x87\x8e"
+ "\x7e\x4e\xb9\x27\x7e\x99\xcd\xeb\x14\x6e\xa4\xef\x9c\xc4\x7e\xf8"
+ "\xe5\x8e\x62\x3f\x3c\x41\x4f\x7d\xef\xcb\x43\xe9\x38\xb6\x09\x46"
+ "\x7a\x7c\xf4\xb3\xc2\xe3\xbc\x1f\xa6\xc7\x71\x1c\x1b\x1d\xbf\xf6"
+ "\xf2\x38\x65\x3e\xf8\x37\x6d\xd0\x07\xfb\x3b\xf1\xc1\xfe\xbf\x32"
+ "\x1f\x3c\xb1\xc1\x3d\x1f\x3c\xd1\xd4\x36\x74\xfd\xaf\xcd\x6f\xbd"
+ "\x1c\x46\x35\xd7\xe4\x35\xee\xe9\xfa\xc9\x99\x6d\x23\x2e\xbf\x36"
+ "\xbf\x35\x29\x88\xc6\x25\xb8\x9f\x7b\x71\x09\x96\xdd\xff\xb0\x79"
+ "\xbf\xf5\xaa\x99\xf7\x5b\xaf\x9a\xe5\xfd\x56\xb0\xc5\xb9\xdf\x0a"
+ "\x19\xc3\xfb\xad\x3f\x6d\xa3\x9a\xe7\x4f\x2b\xa9\xe6\xf9\xd3\x78"
+ "\xe5\x7e\xeb\x95\xc3\x0f\xfc\x56\x4b\xfa\xad\xc9\x15\x14\x63\xaf"
+ "\xac\x76\xcf\x6f\xbd\x92\x26\xf6\x5b\xa1\xdb\x1d\xfd\xd6\x2b\xd7"
+ "\x5d\xf7\x5b\x7f\xf2\x73\xcf\x6f\xfd\xc9\xd7\x35\xbf\xf5\xa7\x85"
+ "\xd2\x7e\x6b\x2a\x91\xf7\x5b\xf4\x9c\xa3\x4e\x0e\xf1\xe3\x75\xf2"
+ "\xb4\x8b\x6d\xdf\x6f\x4d\x7b\x5f\x5a\x13\x4f\x5b\x4d\xfd\xd6\x9f"
+ "\xe2\x5a\xde\x6f\xfd\x29\x4e\xda\x6f\x85\x78\x50\x6d\xfa\xa7\x78"
+ "\x47\xbf\x05\xdf\x91\xf4\x5b\x21\xcf\x71\xdf\x89\x13\xfb\x2d\x5a"
+ "\x06\x70\xcd\x54\x79\xbf\x15\x72\x95\x72\x4f\xc8\x41\xca\x3d\x34"
+ "\xa6\x8e\x7e\x2b\x24\xbb\x79\xbf\x45\x31\xc4\xd6\x53\xd6\x6f\x85"
+ "\x9c\x73\xf4\x5b\xc1\x66\x69\xbf\xf5\xea\x17\x3c\x8e\x5e\x0d\x11"
+ "\xfb\xad\x3f\xf7\xbd\x3f\xfc\x96\x2c\xb6\xde\x17\xfb\xad\x3f\xdf"
+ "\x54\xee\xb7\x5e\xed\xa7\xcc\x6f\x21\xe6\xa4\xfc\xd6\xab\x0b\xed"
+ "\x31\x27\xf6\x5b\xaf\xae\x91\xf6\x5b\xaf\x6e\x17\xfb\x2d\x2c\x5f"
+ "\xca\x6f\xbd\x7a\x5a\x54\xbe\x83\xdf\x7a\xf5\xba\xd8\x6f\xd1\xeb"
+ "\x78\xbf\x15\x9a\x45\x39\x34\x78\x9b\x72\xbf\x15\xba\x50\xde\x6f"
+ "\x85\x26\x89\xfd\x56\x68\x30\xf5\x55\xa1\x05\xd4\x6f\x85\x46\xd0"
+ "\xe3\xc1\x5b\x85\xc7\x79\xbf\x45\x8f\xf3\x7e\x2b\x74\x9f\x32\xbf"
+ "\xd5\xb9\x0d\xfa\x2d\xb5\x13\xbf\xa5\xfe\x95\xf9\xad\xd7\xa3\xdc"
+ "\xf3\x5b\xaf\x47\x3e\xd0\xf5\xad\xa1\xeb\x43\x8b\xa8\xe6\x0a\xf3"
+ "\x70\x4f\xd7\xe3\x16\x1d\xee\xea\xfa\x37\xcb\x79\x5d\xff\x66\xb9"
+ "\xbc\xae\x0f\x6b\x66\xfd\xb7\x59\x3d\x79\x5d\xff\x06\x97\xcb\x7c"
+ "\x63\x16\xed\x5b\xdf\xe8\xad\x5c\xd7\xcf\xdc\xf0\x40\xd7\xb7\xa4"
+ "\xae\x7f\x7d\x0f\xc5\xd8\xcc\x39\xee\xe9\xfa\x99\x11\x62\x5d\x1f"
+ "\xb1\xcc\x51\xd7\xcf\x3c\xee\xba\xae\x9f\x79\xd5\x3d\x5d\x3f\xb3"
+ "\xd6\x35\x5d\xff\xc6\x24\x69\x5d\x1f\x56\x21\xaf\xeb\xe9\x39\x47"
+ "\x3d\x16\x7e\x95\xd7\x63\xe1\xfb\xdb\xbe\xae\x0f\x0f\x93\xd6\x5e"
+ "\xe1\x73\xa8\xae\x7f\x63\x62\xcb\xeb\xfa\x37\x26\x4a\xeb\xfa\xf0"
+ "\x33\x54\x03\xbd\x11\xec\xa8\xeb\xe1\x3b\x92\xba\x7e\x56\x47\xee"
+ "\x3b\x13\xc5\xba\x9e\x96\x01\x5c\xd3\x4f\x5e\xd7\xcf\x3a\x4a\xb9"
+ "\x67\x56\x36\xe5\x1e\x1a\x53\x47\x5d\x3f\x2b\xa6\x79\x5d\x4f\x31"
+ "\xc4\xd6\x53\x56\xd7\xcf\xfa\xc2\x51\xd7\x87\xc9\xac\xa7\xf5\xe6"
+ "\x6a\x1e\x47\x6f\x0e\x14\xeb\xfa\x59\x96\xfb\x43\xd7\xcb\x62\x2b"
+ "\x4c\xac\xeb\x67\x17\x2b\xd7\xf5\x6f\x7a\x28\xd3\xf5\x88\x39\x29"
+ "\x5d\xff\xe6\x24\x7b\xcc\x89\x75\xfd\x9b\x51\xd2\xba\xfe\xcd\x65"
+ "\x62\x5d\x8f\xe5\x4b\xe9\xfa\x37\x0b\x45\xe5\x3b\xe8\xfa\x37\x8f"
+ "\x8b\x75\x3d\xbd\x8e\xd7\xf5\x11\xd1\x94\x43\xc3\xdc\x58\x4f\x2b"
+ "\x62\x92\xbc\xae\x8f\x08\x11\xeb\xfa\x08\x0d\xd5\xef\x11\x29\x54"
+ "\xd7\x47\x0c\xa7\xc7\xc3\x12\x85\xc7\x79\x5d\x1f\x96\x28\xd6\xf5"
+ "\x11\x99\xca\x74\xfd\x43\x6d\x50\xd7\x7b\x3b\xd1\xf5\xde\xbf\x32"
+ "\x5d\xff\xd6\x48\xf7\x74\xfd\x5b\x41\xee\xeb\xc7\x79\xbe\xbc\x7e"
+ "\x9c\xe7\x2b\xaf\x1f\xff\xe2\xe7\x5c\x3f\xbe\x1d\xc6\xeb\xc7\xa8"
+ "\x83\x94\xc3\xa3\xb6\x50\x0e\x8f\x9a\xa5\x5c\x3f\x46\x9e\x79\xa0"
+ "\x1f\x5b\x52\x3f\x46\x6c\xa5\xfa\x31\x72\x9b\x7b\xfa\x31\x72\xab"
+ "\x58\x3f\xce\x3b\xec\xa8\x1f\xa3\x3a\xb8\xae\x1f\xa3\x06\xba\xa7"
+ "\x1f\xa3\x06\xb8\xa6\x1f\xa3\x56\x4b\xeb\xc7\xbf\xf8\xcb\xeb\x47"
+ "\x7a\xce\xb1\xdf\x7f\x7b\x20\xdf\xef\xcf\x6d\x68\xfb\xfa\x71\x6e"
+ "\xae\x74\x1f\x3f\x77\x1b\xd5\x8f\x51\x69\x2d\xaf\x1f\xa3\xd2\xa4"
+ "\xf5\xe3\xdb\xdd\x69\x5f\x1b\x95\xe9\xa8\x1f\xe1\x3b\x92\xfa\xf1"
+ "\x6d\xae\xff\x8f\x4a\x13\xeb\x47\x5a\x06\x70\x4d\x94\xbc\x7e\x8c"
+ "\xe6\xe6\xa7\xbe\x7d\x9a\x72\x0f\x8d\xa9\xa3\x7e\x7c\xbb\xb0\x79"
+ "\xfd\x48\x31\xc4\xd6\x53\x56\x3f\xbe\x7d\xd3\x51\x3f\xfe\xc5\x57"
+ "\x5a\x3f\xc6\x14\xf3\x38\x8a\x89\x11\xeb\xc7\xe8\x11\xf7\x87\x7e"
+ "\x94\xc5\x56\xae\x58\x3f\xc6\x74\x54\xae\x1f\x63\x46\x2a\xd3\x8f"
+ "\x88\x39\x29\xfd\x18\xb3\xda\x1e\x73\x62\xfd\x18\xb3\x5d\x5a\x3f"
+ "\xc6\x1c\x16\xeb\x47\x2c\x5f\x4a\x3f\xc6\x5c\x15\x95\xef\xa0\x1f"
+ "\xe7\x75\x10\xeb\x47\x7a\x1d\xaf\x1f\xe7\xed\xa4\x1c\xfa\xd6\x41"
+ "\xe5\xfa\x71\xde\x6a\x79\xfd\x38\x2f\x5b\xac\x1f\xe7\x45\x52\x9d"
+ "\x38\x4f\x47\xf5\xe3\xbc\x44\x7a\xfc\xad\x03\xc2\xe3\xbc\x7e\xa4"
+ "\xc7\x79\xfd\x38\xaf\xac\x39\xfd\xe8\x5c\x5b\x2c\x12\xec\x4d\xb0"
+ "\x48\xb4\x37\xc1\x71\x91\xb6\x78\x67\xbe\x73\x6d\xf1\xae\x60\x6f"
+ "\x82\x05\xdc\xde\x04\x0b\xb8\xbd\x09\xe6\xb3\x7b\x13\x24\x4d\x02"
+ "\x0d\x00\xda\xa2\xf0\xca\x1e\xaa\x2d\xae\x98\x54\x1f\x5e\xe3\xb4"
+ "\x45\x2d\xf1\x4e\x9b\xc7\x69\x8b\x99\xa8\x2d\xe6\x8f\x47\x6d\xe1"
+ "\x93\x0b\xfa\xb6\x9a\xd3\xbb\xb1\xa0\x77\xab\xe1\x33\x3c\x3b\x87"
+ "\xa0\x8c\x12\xd0\xa4\x99\xf8\x7d\xdc\x1f\x03\xca\x62\xe7\xc9\xb2"
+ "\x73\x68\xf5\xed\x02\x66\xd3\xf9\xb7\xb8\xbf\x89\xdc\xde\x26\xb6"
+ "\x7d\x4d\x12\xab\x19\x2b\xee\x63\x32\x25\x42\xb0\xbf\x09\xee\x89"
+ "\x6a\xa8\x21\xb8\xc7\x49\xee\x02\xe2\xfb\x11\x6a\x8d\x1a\xa2\xee"
+ "\xb4\xcc\xa3\x13\xee\x6f\xd2\xc9\x48\x35\x6d\xa1\xf5\x18\xd5\xb4"
+ "\xef\xfa\x3f\x0c\x3a\x69\xc0\xe6\x3a\x5e\x63\xac\x43\x7d\xf1\xae"
+ "\x26\xc0\xf8\xae\xa6\xd7\x8d\x1b\xa0\x69\x0d\xf6\xfb\x5f\x18\xe3"
+ "\x71\x9f\x85\xd2\x78\x9a\x03\x65\xf7\xbd\xf8\x8b\x86\xe4\xbd\x05"
+ "\xba\xa7\x96\x78\x3c\x83\x7b\x5f\x14\x13\xf5\xef\x7a\x02\xef\xdf"
+ "\xd0\xf4\x14\xae\x65\x89\x79\x51\xeb\x0d\x0d\x29\x0a\x3f\xcb\xce"
+ "\x99\x35\xdb\xe6\xcc\xd6\x91\xa1\x86\x77\x35\xaa\x8d\x0b\x04\x9a"
+ "\xd6\x0f\x35\xed\xf3\x4e\x34\xed\x7c\x3f\xf7\x34\xed\x7c\x5f\xb1"
+ "\xde\x58\x3c\xd8\x51\x6f\xcc\x5f\xe2\xba\xde\x98\xef\xe6\xfa\xef"
+ "\xf3\x5d\x5c\xff\x7d\xbe\xc5\x5e\x6f\x6c\x67\xf5\xc6\x3b\x71\x88"
+ "\x4d\x69\xbd\x41\xcf\x39\xf6\x13\xef\x0a\xd6\x7f\x7f\x37\xaa\xed"
+ "\xeb\x8d\x77\x7d\xa4\xfb\x84\x77\xb9\xf5\xdf\xe7\x3b\x59\xff\xdd"
+ "\x5d\xbd\x31\xdf\x2c\xad\x37\xde\xe5\xd6\x7f\x5f\x40\x1c\xf5\x06"
+ "\x7c\x47\x52\x6f\xbc\xcb\xad\xff\x3e\xdf\x2c\xd6\x1b\xb4\x0c\xe0"
+ "\x1f\x27\xeb\xbf\xc7\x71\xeb\xbf\xc7\x71\xeb\xbf\xd3\x98\x3a\xea"
+ "\x8d\x38\x17\xd6\x7f\xa7\x18\x62\xeb\x29\xab\x37\xe2\x24\xd6\x7f"
+ "\x7f\x27\x56\x5a\x6f\x2c\x12\xac\xff\xbe\xd0\x6e\xfd\xf7\xb8\xc2"
+ "\xfb\x43\x6f\xc8\x62\xcb\x6e\xfd\xf7\x85\x32\xeb\xbf\x3b\xd3\x1b"
+ "\x0b\xf7\x2a\xd3\x1b\x88\x39\x29\xbd\xb1\xd0\x62\x8f\x39\xb1\xde"
+ "\x58\xd4\x5d\x5a\x6f\x2c\xb2\x5b\xff\x1d\xcb\x97\xd2\x1b\x8b\x66"
+ "\x88\xca\x77\xd0\x1b\x8b\x96\x88\xf5\x06\xbd\x8e\xd7\x1b\x8b\x7b"
+ "\x52\x0e\x7d\xa7\xbb\x72\xbd\xb1\xc8\x22\xaf\x37\x16\xb7\x13\xeb"
+ "\x8d\x45\x15\x54\x57\x2c\x0e\xa4\x7a\x63\x51\x2d\x3d\xfe\x8e\xbf"
+ "\xf0\x38\xaf\x37\xe8\x71\x5e\x6f\x2c\x7e\x30\xff\xf5\xbe\xca\x57"
+ "\xc5\xbb\x39\xff\x35\xfe\xc1\xfc\xd7\x56\x79\x0f\xbd\x98\x9b\xff"
+ "\x9a\xe0\xe6\xfc\xd7\x84\x07\xf3\x5f\x5b\x25\x2e\x4b\xb8\xf9\xaf"
+ "\x89\x6e\xce\x7f\x4d\x7c\x30\xff\xb5\x55\xe2\x92\xc0\xcd\x7f\x4d"
+ "\x72\x73\xfe\x6b\xd2\x1d\xcc\x7f\x5d\x5e\xc0\x7b\xe3\xe5\x05\xf2"
+ "\xde\x58\xdb\xcc\xfc\xd7\x54\x03\xef\x8d\x97\x4d\xa5\x5a\x74\xd9"
+ "\x73\x54\x8b\xa6\xb0\xb9\x29\x2d\x7a\xe3\x8f\x77\x84\xef\x5e\xb0"
+ "\x4f\x85\x6b\xb4\xe1\x9e\x91\xab\x13\x88\x97\x19\xbd\x31\xc4\x60"
+ "\x35\xbb\x17\xc9\x11\x12\x3b\x17\xbd\x71\x4a\x4c\x49\xb5\x70\x1f"
+ "\x12\xed\x39\x7e\x5d\xe4\x23\x04\xcf\x1d\xaa\xdb\xa7\xca\x6c\xb4"
+ "\xcb\xc9\x2f\x30\xa9\x02\xe6\x89\x73\xf2\x96\xec\xbc\x60\xcc\xc9"
+ "\x37\x70\xfb\x8a\xb0\x79\xf9\x81\xce\x73\xf2\x9b\x1a\xa1\xef\x94"
+ "\xc8\xcb\x63\x4e\x1e\xfa\xc8\x5f\x59\x4e\x3e\x91\x9b\x1b\x9b\x32"
+ "\xcc\xbd\x9c\x7c\xca\x50\xb1\x47\xfe\x20\xc4\xd1\x23\xa7\x6c\x72"
+ "\xdd\x23\xa7\x1c\x76\xcf\x23\xa7\xe8\x5c\xf3\xc8\xcb\x7a\x4b\x7b"
+ "\x64\x6d\xa6\x56\xd6\x23\xd3\x73\x8e\xde\x26\xf5\x30\xef\x6d\x52"
+ "\x57\xb7\x7d\x8f\x9c\x1a\x28\xed\x63\x52\x87\x51\x8f\xbc\x2c\xa0"
+ "\xe5\x3d\xf2\xb2\x00\x69\x8f\x9c\xca\xbd\xff\x5e\xd6\xc7\xd1\x23"
+ "\xc3\x77\x24\x3d\x72\xea\x45\xee\x3b\x01\x62\x8f\x4c\xcb\x00\x1e"
+ "\xb2\xc8\x7b\xe4\xf7\x36\x50\x5e\x7a\x2f\x8a\xf2\x12\x8d\xa9\xa3"
+ "\x47\x7e\x6f\x64\xf3\x1e\x99\x62\x88\xad\xa7\xac\x47\x7e\x6f\xa5"
+ "\xa3\x47\xd6\xca\xcc\x8d\x5d\x3e\x8b\xc7\xd1\x72\x0f\xb1\x47\x7e"
+ "\xef\xd4\xfd\xe1\x91\x65\xb1\x15\x28\xf6\xc8\xef\x6f\x51\xee\x91"
+ "\xdf\x3f\xad\xcc\x23\x23\xe6\xa4\x3c\xf2\xf2\xde\xf6\x98\x13\x7b"
+ "\xe4\xe5\x23\xa4\x3d\xf2\xf2\x10\xb1\x47\xc6\xf2\xa5\x3c\xf2\xf2"
+ "\x65\xa2\xf2\x1d\x3c\xf2\xf2\x4d\x62\x8f\x4c\xaf\xe3\x3d\xf2\x07"
+ "\x41\x5c\x7f\xe7\xc6\xdc\xd8\x0f\x7a\xcb\x7b\xe4\x0f\xfa\x89\x3d"
+ "\xf2\x72\x33\xf5\xc2\x1f\x4c\xa3\x1e\xf9\x03\x35\x3d\xae\x7d\x56"
+ "\x78\x9c\xf7\xc8\x5a\xbb\xb9\xb1\x1f\x44\x3c\x98\x1b\x7b\x3f\x79"
+ "\xe4\x15\x6e\xe6\xbf\x57\xf8\xb6\x0d\xcd\xff\x6b\xf3\x62\x1f\xc4"
+ "\x53\xcd\xb5\xb2\xd0\x3d\xcd\xbf\x72\x67\xdb\x88\xcb\xaf\xcd\x8b"
+ "\xad\xe0\xe6\x2c\x7f\x38\xd6\xbd\xb8\x7c\x38\xc6\x7d\x2f\xb6\xee"
+ "\x59\xde\x8b\xad\x7b\x56\xde\x8b\xa5\x75\x77\xee\xc5\x32\x13\x79"
+ "\x2f\x96\x7e\x8e\x6a\x9e\xf4\xc3\x54\xf3\xa4\x2f\x53\xee\xc5\x56"
+ "\x37\x88\xbd\x58\x5a\xd4\x03\x2f\xd6\x5a\x5e\x6c\xa5\x91\xe2\x6f"
+ "\xf5\x51\xf7\xbc\xd8\xea\x23\x62\x2f\xb6\xee\xa2\xa3\x17\x4b\xef"
+ "\xe7\xba\x17\x4b\x9f\xe4\x9e\x17\x4b\x9f\xe8\x9a\x17\x4b\x2f\x94"
+ "\xf6\x62\x69\x3d\xe5\xbd\x18\x3d\xe7\xa8\xa1\x33\x27\xf1\x1a\x3a"
+ "\xb3\x7b\xdb\xf7\x62\x19\x07\xa4\xf5\x72\xc6\x51\xea\xc5\xd2\x77"
+ "\xb6\xbc\x17\x4b\xdf\x29\xed\xc5\x32\xb9\xfd\xcf\xd2\xf7\x38\x7a"
+ "\x31\xf8\x8e\xa4\x17\xcb\x8c\xe1\xbe\xb3\x53\xec\xc5\x68\x19\xc0"
+ "\x43\x2b\xe5\xbd\xd8\x9a\xbe\x94\x97\x32\x6f\x52\x5e\xa2\x31\x75"
+ "\xf4\x62\x99\xc5\xcd\x7b\x31\x8a\x21\xb6\x9e\xb2\x5e\x6c\x8d\x9f"
+ "\xa3\x17\x4b\xf3\x97\xf6\x62\x6b\x05\xf3\x34\xd6\xae\x16\x7b\xb1"
+ "\x35\x33\xee\x0f\x2f\x26\x8b\xad\x03\x62\x2f\xb6\x76\xa0\x72\x2f"
+ "\xb6\x76\x96\x32\x2f\x86\x98\x93\xf2\x62\x6b\x0b\xed\x31\x27\xf6"
+ "\x62\x6b\x8f\x4b\x7b\xb1\xb5\x17\xc5\x5e\x0c\xcb\x97\xf2\x62\xeb"
+ "\x3a\x8a\xca\x77\xf0\x62\xeb\xfa\x89\xbd\x18\xbd\x8e\xf7\x62\xeb"
+ "\x8a\x28\x87\x7e\x78\x58\xb9\x17\x5b\x57\x28\xef\xc5\xd6\x7d\x21"
+ "\xf6\x62\xeb\x56\x50\xcf\xb5\x4e\x4f\xbd\xd8\xba\x5c\x7a\xfc\x43"
+ "\x9d\xf0\x38\xef\xc5\xe8\x71\xde\x8b\xad\x33\x3c\x98\x37\x7b\x3f"
+ "\x79\xb1\xec\x2d\xee\x79\xb1\xec\xfc\x07\x9a\xbf\x35\x34\x7f\x96"
+ "\x17\xd5\x5c\x7f\x1d\xe6\x9e\xe6\xff\xeb\x50\xf7\x35\x7f\x9e\x86"
+ "\xd7\xfc\x79\x1a\x79\xcd\x9f\xd3\xd1\xb9\xe6\xcf\x8d\xe5\x35\xff"
+ "\xc6\x53\xb4\x6f\xdd\xf8\x05\xed\x5b\x37\x2e\x54\xae\xf9\x37\x5c"
+ "\x15\x6b\xfe\x9c\x19\x0f\x34\x7f\x6b\x69\xfe\xec\x1a\x8a\xbf\x0d"
+ "\xfb\xdd\xd3\xfc\x1b\xf6\x89\x35\x7f\xde\x69\x47\xcd\xbf\xf1\x31"
+ "\xd7\x35\xff\xc6\x91\xee\x69\xfe\x8d\x41\xae\x69\xfe\x8d\x5b\xa4"
+ "\x35\x7f\x8e\x5a\x5e\xf3\xd3\x73\x8e\x5a\x2d\x77\x24\xaf\xd5\x72"
+ "\x3b\xb6\x7d\xcd\xff\xd1\x1e\x69\x5d\xf6\xd1\x7e\xaa\xf9\x37\xe6"
+ "\xb7\xbc\xe6\xdf\x98\x2f\xad\xf9\x73\x07\x52\x7d\xb4\x71\xab\xa3"
+ "\xe6\x87\xef\x48\x6a\xfe\xdc\x59\xdc\x77\xf2\xc5\x9a\x9f\x96\x01"
+ "\x3c\x94\x24\xaf\xf9\x37\x75\xa7\xbc\x94\xcb\xed\xd9\x45\x63\xea"
+ "\xa8\xf9\x73\x0f\x37\xaf\xf9\x29\x86\xd8\x7a\xca\x6a\xfe\x4d\x1d"
+ "\x1c\x35\x7f\x8e\x8f\xb4\xe6\xdf\x7c\x91\xc7\xd1\xe6\x65\x62\xcd"
+ "\xbf\x69\xea\xfd\xa1\xf9\x65\xb1\xb5\x47\xac\xf9\x37\xf7\x56\xae"
+ "\xf9\x37\x87\x28\xd3\xfc\x88\x39\x29\xcd\xbf\x79\x8b\x3d\xe6\xc4"
+ "\x9a\x7f\xf3\x41\x69\xcd\xbf\xf9\xb4\x58\xf3\x63\xf9\x52\x9a\x3f"
+ "\xcf\x43\x54\xbe\x83\xe6\xcf\x7b\x4c\xac\xf9\xe9\x75\xbc\xe6\xcf"
+ "\xe3\xfa\xbb\xbf\x7e\xa1\x5c\xf3\xe7\x6d\x91\xd7\xfc\x79\xdb\xc5"
+ "\x9a\x3f\x8f\x9b\x3b\x9b\x57\x4e\x35\x7f\x5e\x26\x3d\xfe\xd7\xcf"
+ "\x85\xc7\x79\xcd\x4f\x8f\xf3\x9a\x3f\xaf\xfa\xc1\x9c\xda\xfb\x49"
+ "\xf3\x6f\xc9\x76\x4f\xf3\x6f\xc9\x72\x5f\x5b\x6e\x17\xcc\x7b\xd9"
+ "\xee\x64\xde\xcb\xc7\x51\xce\xb5\xe5\x27\x82\x79\x2f\xdb\xb8\x79"
+ "\x2f\xdb\xb8\x79\x2f\x5b\x4f\x29\xd7\x96\x5b\xc7\x8b\xb5\xe5\xc7"
+ "\xfb\x1f\x68\xcb\xd6\xd2\x96\x79\x26\xaa\x2d\xb7\xfa\xb9\xa7\x2d"
+ "\xb7\xda\xcd\x7f\xd9\x21\x31\xff\x65\xab\x82\xf9\x2f\x5b\xdd\x9c"
+ "\xff\xb2\xd5\xc5\xf9\x2f\x5b\x65\xe6\xbf\x7c\x1c\x2d\xaf\x2d\xe9"
+ "\x39\x47\x4d\xf0\x89\x60\xfe\xcb\x27\xf7\xc1\xfc\x97\x4f\x64\xe6"
+ "\x28\x7c\xc2\xcd\x7f\xd9\xda\x0a\xf3\x5f\xb6\xca\xcc\x7f\xf9\x84"
+ "\x9b\xff\xb2\x4d\x62\xfe\xcb\x56\x99\xf9\x2f\x9f\x70\xf3\x5f\xb6"
+ "\xda\xcd\x7f\xd9\xc6\xcd\x7f\xf9\xc4\xc9\xfc\x97\xbf\x71\xf3\x5f"
+ "\xfe\xc6\xcd\x7f\xa1\x31\x75\xd4\x96\x7f\x73\x61\xfe\xcb\x56\x6e"
+ "\xfe\xcb\x56\x27\xf3\x5f\xfe\x26\x31\xff\xe5\xe3\x48\x69\x6d\xb9"
+ "\x5d\x30\xff\xa5\xc0\x6e\xfe\xcb\xdf\xee\x93\xf9\x2f\xb2\xd8\xb2"
+ "\x9b\xff\x52\xe0\xc6\xfc\x97\x02\x85\xf3\x5f\xb6\xca\xcc\x7f\x29"
+ "\xb0\xd8\x63\x4e\xac\x2d\xb7\xcb\xcc\x7f\xd9\x6e\x37\xff\x65\xab"
+ "\xcc\xfc\x97\xed\x33\x44\xe5\x3b\x68\xcb\xed\x76\xf3\x5f\xb6\xd9"
+ "\xcd\x7f\xd9\xc1\xcd\x7f\xf9\xb8\x8b\x72\x6d\xb9\xdd\xc9\xfc\x97"
+ "\x1d\x76\xf3\x5f\xb6\x73\xf3\x5f\x76\x70\xf3\x5f\xb6\x73\xf3\x5f"
+ "\x3e\x56\x0b\x8f\xf3\xda\x92\x1e\xe7\xb5\xe5\x8e\x66\xe7\xbf\x38"
+ "\xd7\x1d\x9f\xa9\x79\xdd\xf1\x99\x5a\x5e\x77\xec\xb8\xe8\x5c\x77"
+ "\xec\x0e\xe5\x75\x47\xe1\x7e\xfa\x7c\x17\x6e\xa2\xcf\x77\x21\xfb"
+ "\x1e\x26\xa9\x18\x74\xc7\x13\x3b\xc2\x77\x5d\xdb\xc3\xea\x8e\xdd"
+ "\xf3\x4c\x2a\xd0\x88\x5e\x56\xd4\x1d\xa0\x05\xd3\x16\xa1\xee\xa8"
+ "\xe6\xe6\xdb\xee\x3c\x5d\x1c\x2f\xd4\x1d\x9f\x3e\xc7\xce\xbd\x45"
+ "\xed\x61\x34\xb1\xd7\xe1\x79\xa9\xb9\xb8\x07\xe7\x71\x73\x71\xa1"
+ "\x6c\xe1\x1c\x5c\x76\x5e\xee\x35\xd0\x25\xb3\x21\x1e\x02\x5d\xf2"
+ "\x60\x2e\xae\xb3\xb9\xb8\x3b\xdd\xcc\x7f\xef\xcc\x17\x6b\x91\xcf"
+ "\x0e\x3a\x6a\x91\xc2\x76\xae\x6b\x91\xc2\x7e\xee\x69\x91\x42\x8d"
+ "\x6b\x5a\xa4\x70\xa5\xb4\x16\xd9\x51\x8d\xb8\x95\xd6\x22\xf4\x9c"
+ "\x63\x1f\xb2\xbb\x1f\xdf\x87\xec\xba\xd9\xf6\xb5\xc8\xae\x1c\xe9"
+ "\xfe\x62\xd7\x16\xaa\x45\x0a\x57\xb4\xbc\x16\x29\x5c\x21\xad\x45"
+ "\x76\xfb\x51\xde\x2e\x4c\x73\xd4\x22\xf0\x1d\x49\x2d\xb2\x7b\x3c"
+ "\xf7\x9d\x15\x62\x2d\x42\xcb\x00\x6e\x9a\x23\xaf\x45\xf6\x78\x50"
+ "\xae\xda\x7d\x8a\x72\x15\x8d\xa9\xa3\x16\xd9\xbd\xbd\x79\x2d\x42"
+ "\x31\xc4\xd6\x53\x56\x8b\xec\xbe\xee\xa8\x45\x76\xe8\xa5\xb5\xc8"
+ "\xde\xe3\x3c\x8e\xf6\x46\x89\xb5\xc8\x9e\x61\xf7\x87\x16\x91\xc5"
+ "\x56\x8e\x58\x8b\xec\xed\xa0\x5c\x8b\xec\x1d\xa1\x4c\x8b\x20\xe6"
+ "\xa4\xb4\xc8\xde\x95\xf6\x98\x13\x6b\x91\xbd\xdb\xa4\xb5\xc8\xde"
+ "\x83\x62\x2d\x82\xe5\x4b\x69\x91\xbd\x3f\x89\xca\x77\xd0\x22\x9f"
+ "\xb5\x13\x6b\x11\x7a\x1d\xaf\x45\x3e\x2b\xe0\xfc\xdc\x4a\xe5\x5a"
+ "\xe4\xb3\x95\xf2\x5a\xe4\xb3\x35\x62\x2d\xf2\x59\x04\xd5\x1c\x9f"
+ "\x1d\xa0\x5a\xe4\xb3\x78\x7a\x7c\xc7\x0a\xe1\x71\x5e\x8b\xd0\xe3"
+ "\xbc\x16\xf9\xac\x48\x41\x9e\x6b\x9a\x92\xb9\xb8\x85\xb7\xc4\x79"
+ "\x2e\x5b\x8e\xcb\x3c\x20\x79\x4c\x53\x9e\x4b\xf8\x9e\x54\x22\xcf"
+ "\x85\x7d\x3a\x9f\xe7\x3a\xc7\x72\x15\x9f\xe7\xd2\xb3\x79\x2e\xcc"
+ "\x71\xe1\xbb\x52\x5b\x8e\xcb\xba\xd8\x71\x1e\x6e\xa1\x55\x79\x8e"
+ "\x8b\x7f\x5f\x6a\x32\xd0\x1c\x57\x45\x53\x8e\x0b\xfb\x73\x4b\xbd"
+ "\x63\x8e\x0b\xfb\x71\x3e\xc7\x75\xb6\x85\x73\x5c\x9f\x2f\x71\xaf"
+ "\x5f\xff\x3c\xbe\x6d\xbc\xd7\xfe\xb5\xcd\xc3\xfd\x4c\x4f\x73\x3f"
+ "\xff\xd3\xc5\xbd\xf7\xda\xff\xa3\x6e\x1b\x71\xf9\xb5\x8d\xfd\xfe"
+ "\x5c\x47\xe3\xf2\xf7\xed\xee\xc5\xe5\xef\x05\x6d\x23\x2e\xbf\xb6"
+ "\x71\x20\xff\x13\x4a\xe3\xb2\x7f\xa4\x7b\x71\xd9\x1f\xe4\x7e\xae"
+ "\xfe\xf0\x34\xde\x33\x1f\x9e\x26\xf4\xcc\xc7\xc6\x08\x3d\xf3\x97"
+ "\xcd\xac\x7f\x79\x28\x97\xf7\xcc\x07\x2c\x54\x87\x1e\xb8\x48\x75"
+ "\xe8\x01\xf6\xfd\x54\xd2\x48\xc2\x7a\x65\x33\xfa\xe6\xb9\x26\xd5"
+ "\xae\x2b\x3a\x95\x39\x95\xfa\xe5\x52\x73\x11\x29\x36\x98\xc8\x87"
+ "\x8b\x88\xd7\xca\x6b\xc4\x6b\x47\x9d\x49\xd5\x39\x9a\x78\x43\x9f"
+ "\x04\x6d\x56\x04\x3a\x66\x13\x89\xd5\xa2\x97\x3e\xd0\xbd\x34\xd6"
+ "\x20\xf0\xd2\x5f\x26\xf1\x3e\x1a\xae\x8b\x35\x91\xaf\xe6\xea\x54"
+ "\xe8\x97\x6f\x67\xe7\x05\xdf\x1e\x98\x1c\xc4\xae\x63\x25\xcc\xe7"
+ "\xc3\x6f\x07\xcc\x14\xe7\xf3\x1b\xb3\xf3\xa6\x35\x14\x26\x8f\x61"
+ "\xd7\xd0\xec\xcb\xe7\xf4\x95\xac\x9f\xf9\x51\x23\xf1\xb5\xe5\xf3"
+ "\x3f\xfa\xd5\xe5\xf3\xff\x6e\xa0\x18\xfd\xc7\x25\xf7\xf2\xf9\xff"
+ "\xa8\x16\x7b\xe8\x7f\x7a\x38\x7a\xe8\x03\xe3\x5d\xf7\xd0\x07\x62"
+ "\xdc\xf3\xd0\x07\xa2\x5d\xf3\xd0\x07\x8a\xed\x3d\x74\x81\x16\x3d"
+ "\xf4\x97\xfe\x88\x63\x69\x0f\x4d\xcf\x39\x7a\x9f\x43\x31\xbc\xf7"
+ "\x39\x34\xac\xed\x7b\xe8\x83\x95\xd2\x3e\xe7\xe0\x25\xea\xa1\x0f"
+ "\x14\xb5\xbc\x87\x3e\x50\x24\xed\xa1\x0f\xbd\x46\xfd\xc6\x81\x22"
+ "\x9b\x1f\xe6\x3d\x34\x7c\x47\xd2\x43\x1f\x5a\x6d\xff\x1d\xea\xa1"
+ "\x0f\x94\x51\x0f\x7d\x68\xbb\xbc\x87\xfe\x6a\x2c\xe5\xae\xaf\xfc"
+ "\x28\x77\xd1\x98\x3a\x7a\xe8\x43\x57\x9b\xf7\xd0\x14\x43\x6c\x3d"
+ "\x65\x3d\xf4\x57\xcf\x39\x7a\xe8\x2f\x65\xd6\xcf\x3c\xdc\x91\xc7"
+ "\x91\xae\x50\xec\xa1\xbf\x4a\xba\x3f\x3c\xb4\x2c\xb6\x2a\xc5\x1e"
+ "\x5a\x37\x49\xb9\x87\xd6\x2d\x53\xe6\xa1\x11\x73\x52\x1e\x5a\x57"
+ "\xcc\xe1\xa7\x4c\xda\x43\xeb\x7e\x92\xf6\xd0\x87\x3d\xc4\x1e\x1a"
+ "\xcb\x97\xf2\xd0\x87\x07\x8a\xca\x77\xf0\xd0\x87\xc7\x8b\x3d\x34"
+ "\xbd\x8e\xf7\xd0\x87\x6b\x29\x87\xee\x77\x63\xfd\xcc\xc3\xc5\xf2"
+ "\x1e\xfa\xf0\x69\xb1\x87\x3e\x5c\x40\xbd\xf2\x3f\x09\xf5\xd0\x87"
+ "\x0f\xd0\xe3\xfb\x0f\x08\x8f\xf3\x1e\x7a\xbf\xdd\xfa\x99\xff\x54"
+ "\x2b\xf0\xd0\xa1\x2d\xe4\xa1\xc7\xdd\x5f\x1e\xba\x71\x4f\xdb\xf0"
+ "\xd0\x5f\x1f\x74\xcf\x43\x7f\x7d\xc0\x45\x4f\x30\xad\x19\x4f\x30"
+ "\xe6\x81\x27\x10\xea\xad\x7f\xf6\xa1\x7a\xeb\x68\x88\x7b\x9e\xe0"
+ "\xe8\xb4\xb6\x10\x97\x5f\x57\x4c\x8e\x70\xe3\xf5\xff\xf5\x93\x7b"
+ "\x31\xf9\x57\xcd\x03\xff\xdc\x1a\x71\x39\x9a\x4b\xe3\x72\x6c\x99"
+ "\x7b\x71\x39\x96\xe2\xbe\x7f\x2e\xdb\xc7\xfb\xe7\xb2\x7d\x42\xff"
+ "\xfc\x2f\xd1\x3b\xe7\xe3\x21\xce\xfd\x73\x09\xe1\xfd\x73\xd1\x2c"
+ "\xaa\x41\x8b\xb8\x31\x25\x45\x6c\x4e\x3d\xf1\x0b\xea\x9f\x6f\xa1"
+ "\x7f\xbe\x0c\xfe\xf9\xad\x70\x95\x99\xdb\x3b\x02\xc7\xaf\x15\x83"
+ "\x07\x46\xcf\x5c\x1a\x0f\xff\x8f\x33\x90\x0f\x17\x10\xaf\x55\xe0"
+ "\x7d\xb7\x43\x5f\xb9\x7d\x91\x41\xb5\x62\x2e\xf4\x33\x15\x85\xa4"
+ "\x73\x24\xf8\xea\x3a\xf4\xd5\x47\xc0\x33\x2f\xe7\x7c\xf5\xc9\xa4"
+ "\xd2\x38\xa1\xaf\x3e\x7e\x9a\xf5\xd5\x06\x3a\x36\xae\x34\x0e\x7c"
+ "\x35\xfc\x1e\xee\x45\x21\xf4\xd5\x0d\xe0\x9b\x1b\xc1\x37\x67\x5e"
+ "\xb1\xf3\xd8\x6f\x39\x7a\xec\x06\xbf\xbc\x50\xd3\xc0\xe4\x71\xe8"
+ "\xb1\x6f\x6d\x7b\xe0\xb1\x1d\x3d\xf6\xbf\x03\x29\x8e\x4f\x8e\x77"
+ "\xcf\x63\x9f\x1c\x27\xf6\xd8\xa7\xe6\x38\x7a\xec\x93\x85\xae\x7b"
+ "\xec\x93\xa7\xdc\xf3\xd8\x27\xcb\x5c\xf3\xd8\x45\x83\xed\x3d\xf6"
+ "\x27\xec\x7b\xea\xe3\xa1\x88\x75\x69\x8f\x4d\xcf\x39\x7a\xa3\xe2"
+ "\x53\xbc\x37\x2a\xde\xd4\xf6\x3d\x76\x71\x90\xb4\x0f\x2a\x1e\x4f"
+ "\x3d\x76\x51\x60\xcb\x7b\xec\xa2\x40\x69\x8f\x5d\xcc\x8d\x7f\x2b"
+ "\x0a\x74\xf4\xd8\xf0\x1d\x49\x8f\x5d\x7c\xdd\xfe\x3b\xd4\x63\x17"
+ "\x3d\x4b\x3d\x76\x49\x47\x79\x8f\x5d\xb2\x9d\xf2\x5b\xc9\x12\xca"
+ "\x6f\x34\xa6\x8e\x1e\xbb\x64\x6a\xf3\x1e\x9b\x62\x88\xad\xa7\xac"
+ "\xc7\x2e\xd9\xe0\xe8\xb1\x8f\x4f\x93\xf6\xd8\x65\xf3\x79\x1c\x95"
+ "\x75\x11\x7b\xec\x92\x8b\xf7\x87\xc7\x96\xc5\x56\x90\xd8\x63\x97"
+ "\xee\x55\xee\xb1\x4b\x2f\x29\xf3\xd8\x88\x39\x29\x8f\x5d\x36\x98"
+ "\xc3\xcf\xb3\xd2\x1e\xbb\x6c\x92\xb4\xc7\x2e\x9b\x23\xf6\xd8\x58"
+ "\xbe\x94\xc7\x2e\x5b\x23\x2a\xdf\xc1\x63\x97\x15\x8a\x3d\x36\xbd"
+ "\x8e\xf7\xd8\xa7\x82\x29\x87\x1e\xb3\x28\xf7\xd8\xa7\x06\xcb\x7b"
+ "\xec\x53\xc3\xc4\x1e\xfb\x94\x0f\xf5\xd2\xa7\x22\xa8\xc7\x3e\x15"
+ "\x40\x8f\x1f\x33\x0b\x8f\xf3\x1e\x9b\x1e\xe7\x3d\xf6\xa9\x38\x65"
+ "\xef\xa9\xef\x68\x3d\xac\x31\x77\x7f\x3e\x46\x4b\xad\x87\x65\x7b"
+ "\x57\x7d\xaf\xe7\x63\xfc\x6f\x5f\xf7\x7c\xf6\xff\xf6\x79\xe0\xe7"
+ "\x5a\xda\x37\x9c\x5a\x41\xf5\x56\xb9\x9b\xeb\xdf\x96\x3b\x5d\xff"
+ "\xf6\x81\x9f\x73\x37\x2e\xff\x1b\x4d\xe3\xf2\xed\x54\xf7\xe2\xf2"
+ "\x6d\xb0\xfb\x7e\xee\x7c\x04\xef\xe7\xce\x47\xc8\xbf\x0f\xfd\xae"
+ "\xaf\x73\x3f\xf7\xfd\x4e\xde\xcf\x9d\xed\x48\xf5\xce\x99\xeb\x54"
+ "\xef\x9c\xd9\xdb\x72\xef\x43\xcf\xf4\x13\xbf\x0f\xfd\x6e\xf5\x83"
+ "\xf7\xa1\x77\xc3\xab\x9d\x26\x14\xa3\x15\x37\xdd\xf3\x6a\x15\x46"
+ "\xb1\x57\xbb\xd0\xc5\xd1\xab\x9d\x79\xcd\x75\xaf\x76\x26\xc9\x3d"
+ "\xaf\x76\x26\xd1\x35\xaf\x76\xe6\x9c\xf4\xfb\xd0\xef\x34\xf2\xef"
+ "\x43\xe9\x39\x47\x8d\xfd\x7d\x12\xaf\xb1\xbf\x1f\xdf\xf6\xbd\xda"
+ "\xd9\x5a\x69\x3d\x7d\xf6\x26\xf5\x6a\x67\x2a\x5b\xde\xab\x9d\xa9"
+ "\x94\xf6\x6a\xdf\x47\x51\x5d\x7b\xa6\xd2\xd1\xab\xc1\x77\x24\xbd"
+ "\xda\xf7\x9b\xec\xbf\x43\xbd\xda\x19\x3d\xf5\x6a\xdf\xef\x97\xf7"
+ "\x6a\x95\x21\x94\xbb\x2a\xfb\x52\xee\xa2\x31\x75\xf4\x6a\xdf\x5b"
+ "\x9a\xf7\x6a\x14\x43\x6c\x3d\x65\xbd\x5a\xe5\x58\x47\xaf\xf6\x5d"
+ "\x1f\x69\xaf\x76\xfe\x31\x1e\x47\xe7\x0e\x8a\xbd\x5a\xe5\xea\xfb"
+ "\xc3\xab\xc9\x62\xab\x56\xec\xd5\xce\xcd\x50\xee\xd5\xce\xad\x51"
+ "\xe6\xd5\x10\x73\x52\x5e\xed\xdc\x39\x0e\x3f\x7a\x69\xaf\x76\xae"
+ "\x41\xda\xab\x9d\xef\x22\xf6\x6a\x58\xbe\x94\x57\x3b\x3f\x42\x54"
+ "\xbe\x83\x57\x3b\xff\x9a\xd8\xab\xd1\xeb\x78\xaf\x76\x9e\xf3\x46"
+ "\xdf\x16\x2b\xf7\x6a\xe7\xcf\xc9\x7b\xb5\xf3\x97\xc4\x5e\xed\xfc"
+ "\x3e\xea\xc9\x2e\xa8\xa9\x57\x3b\x5f\x44\x8f\x7f\x5b\x24\x3c\xce"
+ "\x7b\x35\x7a\x9c\xf7\x6a\x17\x02\x94\x79\x35\xd7\xd7\xcb\xba\xf7"
+ "\x63\x8a\xd5\xbf\xb2\x31\xc5\xfa\x62\xf7\x7c\x9a\xbe\xe8\x81\x27"
+ "\x68\x0d\x4f\x70\xe1\x59\xaa\xb7\xaa\xe6\xb8\xe7\x09\xaa\x22\xdc"
+ "\xf7\x04\x57\xe2\x79\x4f\x70\x25\x5e\xde\x13\xfc\x30\xcc\xb9\x27"
+ "\xf8\x51\xc7\x7b\x82\xcb\xbd\x69\xbf\x7a\xb9\x1d\xed\x57\x2f\x1d"
+ "\x6d\x39\x4f\x70\x69\x84\xd8\x13\xfc\xb0\xe5\x81\x27\xb8\x1b\x9e"
+ "\xe0\xa2\x2f\xc5\xe8\xa5\x0e\xee\x79\x82\x4b\xde\x62\x4f\xf0\x73"
+ "\x5f\x47\x4f\x70\x29\xc6\x75\x4f\x70\x69\x8d\x7b\x9e\xe0\x52\xa6"
+ "\x6b\x9e\xe0\xd2\x75\x69\x4f\xf0\xc3\x70\x79\x4f\x40\xcf\x39\x6a"
+ "\xb9\x1f\xd7\xf0\x5a\xee\xc7\x19\x6d\xdf\x13\xfc\x48\xa4\x75\xdb"
+ "\x8f\x1d\xa8\x27\xb8\x64\x68\x79\x4f\x70\xc9\x20\xed\x09\x7e\x4c"
+ "\xa2\xfa\xe9\x92\xc1\xd1\x13\xc0\x77\x24\x3d\xc1\x8f\x7b\xed\xbf"
+ "\x43\x3d\xc1\x25\x23\xf5\x04\x3f\x16\xcb\x7b\x82\x9a\x28\xca\x5d"
+ "\x35\xc3\x28\x77\xd1\x98\x3a\x7a\x82\x9a\x2e\xcd\x7b\x02\x8a\x21"
+ "\xb6\x9e\xb2\x9e\xa0\xe6\x35\x47\x4f\xf0\xc3\x50\x69\x4f\x70\x65"
+ "\x30\x8f\xa3\x9f\x4e\x89\x3d\x41\xcd\x96\xfb\xc3\x13\xc8\x62\x8b"
+ "\x88\x3d\xc1\x4f\xf3\x95\x7b\x82\x9f\xb6\x29\xf3\x04\x88\x39\x29"
+ "\x4f\xf0\x13\xf7\xfe\x8f\xe2\xc5\xd1\x13\x5c\xe9\x28\xed\x09\xae"
+ "\xf4\x15\x7b\x02\x2c\x5f\xca\x13\x5c\x99\x2a\x2a\xdf\xc1\x13\x5c"
+ "\x89\x11\x7b\x02\x7a\x1d\xef\x09\x7e\x56\x53\x0e\xad\xba\xa8\xdc"
+ "\x13\x5c\xb9\x2e\xef\x09\xae\x34\x88\x3d\xc1\x15\x4e\xfb\xff\xdc"
+ "\x87\x7a\x82\x2b\x7a\x7a\xbc\x4a\x2f\x3c\xce\x7b\x02\x7a\x9c\xf7"
+ "\x04\x3f\x3f\xfb\x60\x3d\xad\xfb\x69\x3d\xad\xda\x4b\xee\xf9\x82"
+ "\xda\x6a\xf7\xf5\xa7\xb1\x9c\xd7\x9f\xc6\x72\xa1\xfe\x14\xaf\x6b"
+ "\x71\x75\xbf\x73\xfd\x59\xd7\x93\xd7\x9f\x86\x24\xca\xe1\x86\x59"
+ "\x94\xc3\x0d\xec\xda\x7c\xca\xd6\xd3\xfa\x65\x83\x78\x3d\xad\x6b"
+ "\x1d\x1e\xac\xa7\xd5\x5a\xda\xf2\xe7\x71\x54\x5b\xfe\x32\xc7\x3d"
+ "\x6d\xf9\x4b\x84\x58\x5b\xde\x5c\xe6\xa8\x2d\x7f\x39\xee\xba\xb6"
+ "\xfc\xe5\xaa\x7b\xda\xf2\x97\x5a\xd7\xb4\xa5\x61\x92\xf4\x1a\x16"
+ "\x57\x0f\xc8\xaf\xa7\x45\xcf\x39\x6a\x82\xeb\x82\x75\xf5\xaf\xef"
+ "\x6f\xfb\xda\xf2\x7a\x98\x74\xff\x7f\x7d\x0e\xd5\x96\x86\x89\x2d"
+ "\xaf\x2d\x0d\x13\xa5\xb5\xe5\xf5\x33\xb4\x1f\x36\x04\x3b\xae\x61"
+ "\x01\xdf\x91\xd4\x96\x75\xdc\xfa\xf7\x86\x89\x62\x6d\x49\xcb\x00"
+ "\x1e\xea\x27\xaf\x2d\xeb\x8e\x52\x5e\xaa\xcb\xa6\xbc\x44\x63\xea"
+ "\xa8\x2d\xeb\x62\x9a\xd7\x96\x14\x43\x6c\x3d\x65\xb5\x65\xdd\x17"
+ "\x8e\xda\xf2\xea\x3e\x69\x6d\x69\x5c\xcd\xe3\xc8\x38\x50\xac\x2d"
+ "\xeb\x2c\xf7\x87\xb6\x94\xc5\x56\x98\x58\x5b\xde\x28\x56\xae\x2d"
+ "\x8d\x1e\xca\xb4\x25\x62\x4e\x4a\x5b\x1a\x27\xd9\x63\x4e\xac\x2d"
+ "\x8d\x51\xd2\xda\xd2\xb8\x4c\xac\x2d\xb1\x7c\x29\x6d\x69\x2c\x14"
+ "\x95\xef\xa0\x2d\x8d\xc7\xc5\xda\x92\x5e\xc7\x6b\xcb\x9b\xd1\x94"
+ "\x43\xaf\xce\x52\xae\x2d\x6f\x4e\x92\xd7\x96\x37\x43\xc4\xda\xf2"
+ "\xa6\x86\x6a\xc8\x9b\x29\x54\x5b\xde\x1c\x4e\x8f\x5f\x0d\x17\x1e"
+ "\xe7\xb5\x25\x3d\xce\x6b\xcb\x9b\x99\xca\xe6\xdf\xb4\x48\xbe\xf9"
+ "\x2e\xcd\xbf\x69\xa9\x7c\x73\x5b\x99\x7f\x53\x3f\xc2\x3d\x5d\x59"
+ "\x3f\xfc\xc1\xb8\xa0\x96\xce\x35\xdf\xdc\x4a\xb5\x96\xe9\x94\x7b"
+ "\xb9\x66\x53\x99\xdb\x5a\xdf\xd3\x83\x34\x69\x7d\x4f\x9c\x4e\x28"
+ "\x37\x9f\xa0\x61\x9b\x73\xad\x6f\x1d\xc7\x6b\x7d\x33\x37\xde\xd6"
+ "\xbc\x9a\xf6\xa9\xe6\x49\xee\xcc\x27\x58\x55\x47\xbc\x3e\xb4\x9f"
+ "\x4f\x50\x7e\x90\xce\x27\x58\x60\x3f\x9f\xe0\xf6\x51\xf1\x7c\x82"
+ "\xc6\xbe\x72\xf3\x09\x30\xf7\x7c\xbb\x30\x79\x0c\xce\x25\x90\x9c"
+ "\x47\xf0\x7a\xcb\xcf\x23\x40\x9f\xf0\x11\xe0\x16\xbd\x02\xf2\xcd"
+ "\xaf\xcb\x2b\xd4\xbf\x4f\xf1\x7b\x7b\x8d\x7b\x5e\xe1\x76\xa6\xc8"
+ "\x2b\x78\x7a\x14\x3a\x7a\x85\xdb\x37\x5d\xf7\x0a\xe6\xee\xee\x79"
+ "\x05\xb3\xbf\x6b\x5e\xc1\xbc\x44\x7a\x1e\x41\x43\x81\xfc\x3c\x02"
+ "\x7a\xce\x51\xe3\x59\xbb\xf3\x1a\xcf\x72\xa9\xed\x7b\x05\xcb\x0a"
+ "\x69\x3d\x67\x59\x43\xbd\x82\x39\xbe\xe5\xbd\x82\x39\x5e\xda\x2b"
+ "\x58\xdb\x51\x5d\x65\x8e\x77\xcc\x43\xc3\x77\x24\xbd\x82\x75\x98"
+ "\xfd\x77\xa8\x57\x30\x27\x52\xaf\x60\x0d\x91\xf7\x0a\xd6\xeb\x94"
+ "\xd7\xac\xdc\x1e\x93\x34\xa6\x8e\x5e\xc1\xba\xa1\x79\xaf\x40\x31"
+ "\xc4\xd6\x53\xd6\x2b\x58\x2f\x3a\x7a\x85\x86\xad\x92\x5e\xc1\x93"
+ "\xec\x6f\xc2\x91\x27\x79\x4d\xec\x15\x98\x7e\xf7\x87\x57\x90\xc5"
+ "\xd6\x0a\xb1\x57\x60\x1a\x14\x7b\x05\x4f\x32\x50\x99\x57\x40\xcc"
+ "\x49\x78\x05\x4f\xb2\x84\xc3\x4f\xa2\xa4\x57\xf0\x24\xd9\x92\x5e"
+ "\xc1\x93\x14\x8a\xbd\x02\x96\x2f\xe1\x15\x3c\xc9\x19\x51\xf9\xf6"
+ "\x5e\xc1\x93\xdc\x14\x7b\x05\x7a\x5d\x93\x57\xf0\xf4\xc8\xa1\xfd"
+ "\x5f\xc3\x24\xc5\x5e\xc1\xd3\x63\x89\xac\x57\xf0\xf4\x58\x26\xf2"
+ "\x0a\x9e\x1e\xec\x7c\x5f\xbd\xa7\xc7\x4e\xd6\x2b\x78\x7a\x44\x52"
+ "\xaf\xd0\x30\x51\x78\x9c\xf7\x0a\xf4\x78\x93\x57\x48\xf7\x38\xa0"
+ "\x6c\x6c\x8a\xeb\x79\xe8\x7b\x3f\x36\xc5\xfb\xd7\x35\x36\xc5\xd3"
+ "\x33\xca\x2d\xaf\xe0\xe9\x19\xe9\xbe\x2e\x7d\x24\x8e\xd7\xa5\x8f"
+ "\xc4\xc9\x8e\x81\xf0\xf4\x1a\xe1\x54\x97\x7a\x7a\x1f\x68\xd2\xa5"
+ "\x9e\x0f\x3d\xc6\xf2\xb7\xe7\x43\x1e\x2c\x7f\x7b\xb6\x3f\xec\xea"
+ "\x18\x88\x55\xb7\x38\x2d\x6a\x1b\x03\xb1\x88\x1b\x03\x01\x7a\x94"
+ "\xd5\x9f\x9e\xed\x87\x89\xc6\x40\x78\x7a\x6d\x93\x1b\x03\x21\x39"
+ "\xf6\xc1\x4e\x73\xda\xf4\xe9\x9d\x8c\x7d\xf8\x55\x6b\xce\x74\x8f"
+ "\x32\x56\x73\x7a\xb6\x6f\xe7\x96\xe6\xf4\x6c\xef\x25\xd6\x9c\x3e"
+ "\xbd\x1d\x34\xa7\x67\xfb\x28\x97\x35\xa7\x67\xfb\xd5\x6e\x69\x4e"
+ "\xcf\xf6\x69\x2e\x69\x4e\xcf\xf6\x57\x25\xc7\x3e\x78\x7a\x05\xc9"
+ "\x8e\x7d\xe0\xce\x39\x6a\x05\x6f\x3e\xaf\xe8\xe9\xfd\x5a\x9b\xd7"
+ "\x9c\x9e\x0f\x99\x25\x75\x81\xa7\x77\x3b\x56\x73\x7a\xb6\xaf\x6d"
+ "\x71\xcd\x09\x65\x4a\x6a\x4e\x4f\x6f\xda\xff\xc3\x79\x07\xcd\x89"
+ "\xdf\x91\xd2\x9c\x9e\xde\x85\xf6\xdf\x69\xa4\xd7\x1b\x58\xcd\xe9"
+ "\xe9\x7d\x5c\x56\x73\x7a\x76\x98\x43\x39\xab\xc3\x73\x94\xb3\x68"
+ "\x4c\x1d\x34\xa7\x67\x87\x8e\xcd\x6a\x4e\x0e\x43\x6c\x3d\xe5\x34"
+ "\xa7\x67\x87\x10\x07\xcd\xe9\xe9\x35\x5c\x5a\x73\x3e\x32\x90\xc7"
+ "\xd1\xc3\xc5\x22\xcd\xe9\xd9\x61\xd3\x7d\xa1\x39\x65\xb1\xf5\x90"
+ "\x59\xa4\x39\x3d\x1f\x8e\x51\xae\x39\x1f\xde\xa2\x48\x73\xb2\x98"
+ "\x93\xd2\x9c\x0f\x5f\xe5\xf0\x63\x90\xd6\x9c\x8f\x74\x90\xd6\x9c"
+ "\x8f\xf4\x16\x69\x4e\xb6\x7c\x29\xcd\xf9\xc8\x24\x51\xf9\x0e\x9a"
+ "\xf3\x91\x28\x91\xe6\xe4\xae\xe3\x35\xa7\x8f\x0f\xe5\x50\xcf\x4b"
+ "\xca\x35\xe7\x23\x57\xe5\x35\xe7\x23\x37\xc5\x9a\xf3\x91\x63\x54"
+ "\x5b\xfa\x04\x50\xcd\xf9\x48\x25\x3d\xee\x59\x2d\x3c\xde\xa4\x39"
+ "\xb9\xe3\xbc\xe6\xf4\x09\x74\xa6\x39\x99\xac\x31\x9a\x4c\x95\x75"
+ "\x0f\xfc\xed\x83\x7a\x76\x87\xfe\x4d\x07\xff\x3f\x06\xfd\x54\x17"
+ "\xf8\xbf\x6c\x8e\xcd\xe0\x37\x46\x63\x05\x5d\x62\x85\xdf\x29\x35"
+ "\xfc\xa2\xd3\xf5\x30\x63\x7f\xb2\x87\xf6\x2f\x63\x34\x9d\xcd\x0f"
+ "\x8d\xb3\x32\x91\x84\xf1\x85\xff\xc7\xc3\x31\xb8\xbe\x13\xf4\x87"
+ "\x01\x8b\x48\xa7\x6b\x9e\x3e\x65\xb6\xeb\xa0\xce\x9d\xaa\x3c\x7d"
+ "\x56\x63\x19\x50\xd7\x4a\xb8\x9f\xe1\xb2\x75\x85\xb2\xa6\x6c\xef"
+ "\x45\x92\xcc\xcc\x8f\xba\x79\x75\xa4\xda\xb3\x63\xdf\xce\xb5\x0f"
+ "\x8d\x03\x1e\x22\xa8\x11\xf7\xf4\x30\x78\x61\x99\xba\x79\x8d\x78"
+ "\xce\x1b\xcf\x59\xa0\x8e\xda\x18\xa2\x4a\xaf\x7b\xc8\x1b\x34\x57"
+ "\xbb\x64\x23\x53\xf3\x8e\x19\xea\x0c\xfd\xeb\x57\xbd\x2a\xbc\x76"
+ "\x6f\xac\x60\xfb\x9e\x12\xa3\x85\x2d\x23\x60\x1e\xd6\xa7\x63\xbf"
+ "\xcd\x70\xbd\x54\x1d\x96\xef\x22\x03\xda\xf5\x63\xf4\xca\xfa\xbb"
+ "\x8e\x89\x72\xed\xd8\x79\x59\x2f\xa2\xeb\x0f\x6d\x17\x40\x54\x52"
+ "\xe7\x15\xfe\x8e\xb3\xf1\x0f\xde\xeb\xba\x31\xc6\xe4\x0d\x44\x95"
+ "\x61\x7d\xc8\xfb\x6b\xa8\x51\xde\x7a\xc6\x50\x9f\xde\x29\x58\xef"
+ "\x61\x8e\xc4\x36\x7f\x0f\xce\x67\x74\x63\x0c\x37\x52\x11\x37\x9d"
+ "\x22\x0f\x43\xdf\x6e\x1f\x8b\x05\x11\x31\xb3\x02\xe2\xa2\x62\xe6"
+ "\xbc\xb3\x30\x2e\xa0\x6f\xc4\xc3\x64\xda\x3b\xef\x04\xc4\xcc\x9a"
+ "\xb7\x24\x40\x78\xe6\xf9\x80\x88\xa8\x77\x67\xcd\x8e\x9e\x33\x30"
+ "\xe6\xcd\xd8\x87\x31\xc1\x2a\xa8\x87\x2f\xd6\xc5\x9a\xde\x29\x6e"
+ "\xf3\x5a\x42\xd6\x75\x25\x5e\x58\x2f\xf8\xbd\x0a\xbd\x57\x58\x2d"
+ "\xfe\x5e\xfa\x7a\xc6\xa8\x82\x6b\x92\x81\xd3\x32\xb4\x0f\xc1\xb5"
+ "\x1d\xab\xf3\xa0\x5e\x9b\xa1\xde\x50\x47\xa8\x73\x67\x2f\x5b\x9d"
+ "\x6d\x98\x48\x46\x4c\x68\xeb\x00\x83\x9d\xfb\x76\x36\x3d\xf4\x12"
+ "\xc3\x84\xe2\xfd\x19\xe1\x59\xf1\x80\x63\x07\x59\xdf\x90\x3d\x46"
+ "\x03\xdf\x0d\xb2\x61\xcc\x9a\x95\xa6\x63\xd6\x8f\x36\x80\xae\xf4"
+ "\xa8\x67\x22\xff\x13\xb0\x89\xdf\x5f\x3d\x88\x90\x14\xa6\x3e\x94"
+ "\xdd\x1b\x83\xa9\x07\x0c\x53\x9c\xc2\x39\x75\xf8\x0d\x15\xf9\x23"
+ "\x94\xf1\xbe\x9e\xec\x8c\xc6\x32\xf4\x70\x0c\xdb\xdc\x9a\xbf\x23"
+ "\x38\x44\x43\x52\x7e\x97\x42\x52\xea\xf1\x3b\x5b\xa3\x35\x9d\xe3"
+ "\x88\xc7\x94\x78\xe6\x02\xf0\x8e\x07\xd3\x7b\x47\x30\xb3\x2d\x5a"
+ "\xa3\xf7\xec\x1c\x69\xcd\x4e\xd3\xc1\xfd\xd4\x42\x39\x45\x7a\x8f"
+ "\x21\x3e\x58\x4e\xc6\x7a\xb6\xed\x6b\xf1\xde\xa1\x7d\xc0\xff\x30"
+ "\x3a\x26\x95\x7b\x86\x32\xc3\x35\xd6\xcc\xbd\x7b\x4a\xbd\x6e\x91"
+ "\x29\x66\xe6\x36\xb3\x26\x5c\x53\x62\x34\x02\xa7\xc5\xbe\xc9\x74"
+ "\xea\xb4\xbc\xb3\x39\x6a\x4e\x5e\x57\x78\x16\xd7\xec\xdd\xc3\xac"
+ "\x49\x08\x08\xe9\x47\xd4\xf5\xe9\x6a\x8d\xad\x3d\xa1\x2d\xbd\x94"
+ "\xe1\x48\x3d\x00\xef\x09\xf1\x00\xf5\xe1\xf0\xa0\x8e\x3f\x1c\xe7"
+ "\x88\x87\xa6\x67\x73\x7d\x62\xa0\x99\x09\x7d\xe9\x76\x56\x62\x24"
+ "\xe3\x9b\x38\x4d\x7b\x89\xb4\xc7\xb6\x2d\x01\x2f\x90\xbe\x88\xf8"
+ "\xaf\x9e\x49\x02\xde\x58\xa2\x26\x86\xec\xc4\xe0\xce\xcb\x52\x3c"
+ "\xa0\x4d\x54\xc0\x2f\x81\xc0\x99\x81\xb7\xbb\xa5\xe9\x12\xe7\x10"
+ "\x55\x61\xd5\x1e\x15\xea\x67\x1c\xb7\x72\xd9\xb3\xcb\xb0\xcd\xf0"
+ "\x3d\xe6\x97\x50\x82\xf1\x60\x63\xf1\x4b\x24\x99\x04\xac\x8c\xef"
+ "\x53\xe0\x7c\xcc\x26\x28\x53\xd9\x7d\x75\x61\xf5\xaf\x05\x62\x35"
+ "\x08\xe2\x54\x5a\x6d\x61\xcb\x64\x63\x15\xcd\xc7\xea\x20\xd4\x83"
+ "\x8f\x97\xda\x88\x71\x95\xb9\xe7\x3d\xdc\x3d\xd7\xc0\x3d\x97\x3b"
+ "\xb9\xe7\x32\x7a\xcf\xed\xea\x9c\xdf\x73\xd7\x81\xce\xef\xb9\xeb"
+ "\x2c\x37\xee\xd9\xa4\xfc\x9e\xbb\xd4\xc8\xdf\x73\x12\x17\xe7\x24"
+ "\x88\x73\x92\x93\x38\x27\x71\x71\x7e\xa4\xca\xf9\x3d\x3f\xda\xdb"
+ "\xf9\x3d\x3f\x1a\xa2\xfc\x9e\xbb\xd6\x2a\xbf\xe7\xae\x95\x4e\xee"
+ "\x99\x8b\x73\x12\xc4\x39\xc9\x49\x9c\x93\xb8\x38\x77\xf9\xc6\xf9"
+ "\x3d\xfb\xfa\x39\xbf\x67\xdf\xf1\xca\xef\xf9\x51\xbd\xf2\x7b\x7e"
+ "\xb4\x4c\xfe\x9e\xb5\x5c\x9c\xb5\x10\x67\xad\x93\x38\x6b\xb9\x38"
+ "\x0f\x59\xe5\xfc\x9e\xfd\x3a\x38\xbf\x67\xbf\x11\xca\xef\xd9\xb7"
+ "\x5c\xf9\x3d\xfb\x1e\x71\x72\xcf\x5c\x9c\xb5\x10\x67\xad\x93\x38"
+ "\x6b\xb9\x38\x4f\x1f\xd5\xcc\x3d\x5b\x9c\xdf\x73\xb7\xc1\xca\xef"
+ "\xd9\xef\x98\xf2\x7b\xf6\xdb\x27\x77\xcf\x8d\xc0\xdb\x3e\x70\x2f"
+ "\xb7\xbf\x0b\x7d\xc9\xe2\x9b\x18\xe6\x53\x4d\x54\xb9\xa9\xd6\xc8"
+ "\xce\x35\xa4\x03\xdc\x5b\x24\xb3\x3e\x23\x13\xff\xb5\xfa\x26\x86"
+ "\x36\xfa\x26\x46\x36\x74\x1b\x6d\x58\x3a\x83\xb4\x47\x3d\xbe\xd2"
+ "\x4a\xfc\xad\x59\x89\xd3\xd2\x5e\x21\x01\xc9\x06\xa2\x2e\xd1\xea"
+ "\x89\x36\x96\x31\x94\x90\x8b\xa4\x63\x0d\x7a\xcf\xb3\xa4\xa8\xf6"
+ "\x18\x99\xb7\x80\x61\x2e\x7b\xfe\x26\x09\xf3\x26\xa0\x93\x53\x32"
+ "\xbf\x25\x01\xf0\x1b\x81\x9b\xe1\x0f\xcb\xe9\x3c\x11\xfa\xcf\xf5"
+ "\x19\x6b\xf3\xb4\xc4\xff\xd0\xdc\x1a\x82\xc7\x37\xc1\x9f\x65\x7d"
+ "\x9a\x4e\x3b\x83\xa8\x76\xd5\x55\xa8\x68\xdf\xfc\x9b\xf1\xf6\x7d"
+ "\xf3\xc4\x59\xd0\x96\xb3\xd9\x73\xd9\xb9\xaf\x28\x6d\xcb\xdf\xf8"
+ "\xda\xfa\x6e\xb6\x2d\x2b\x2d\xb4\xbf\xb7\xeb\xbb\x0f\xc1\xef\xf3"
+ "\x6d\xf9\x1b\x2f\x6c\x4b\x26\x2b\x31\xb6\xb4\xa6\x11\x7d\x93\xfa"
+ "\x72\x3c\x51\xe9\x3d\xbb\x7d\x5e\x12\x5b\x47\x64\xda\x78\x8f\xa0"
+ "\x8d\x2b\x7d\xaa\xdb\xd5\xc9\xb4\x71\x05\xb4\x71\x8d\x44\x1b\x97"
+ "\xbb\xd6\xc6\xfe\x17\xef\xbc\x8d\xfd\x0b\xe5\xdb\xd8\xbf\x41\x79"
+ "\x1b\xfb\xc7\x2b\x6f\x63\xff\x48\xae\x8d\x0d\xe2\x36\xf6\xf7\x97"
+ "\x6f\xe3\x24\x01\x8e\x93\x00\xc7\x8f\x54\x49\xb7\x71\x12\xe0\x38"
+ "\x49\x02\xc7\x49\x2e\xe2\xb8\xc7\xd8\x3b\x6f\xe3\x1e\x5d\xe4\xdb"
+ "\xb8\xc7\x0c\xe5\x6d\xdc\xbd\x52\x79\x1b\x77\x2f\xa2\x6d\x9c\x64"
+ "\x87\xe3\xee\x89\x4e\xda\x58\x80\xe3\x24\xc0\x71\x97\x6f\x64\xda"
+ "\x18\x70\x9c\x24\x81\xe3\x24\x17\x71\xfc\xdb\xed\x77\xde\xc6\xbf"
+ "\x5d\x28\xdf\xc6\xbf\x3d\xac\xbc\x8d\x7f\x1b\xa4\xbc\x8d\x7f\x1b"
+ "\xc8\xb5\xb1\x1d\x8e\x7b\xe8\xe5\xdb\x58\x2b\xc0\xb1\x16\x70\x3c"
+ "\x64\x95\x74\x1b\x6b\x01\xc7\x5a\x09\x1c\x6b\x5d\xc4\xf1\x63\x1d"
+ "\xef\xbc\x8d\x7b\x9e\x91\x6f\xe3\xc7\xfa\x2a\x6f\xe3\x9e\x5b\x95"
+ "\xb7\x71\xcf\x2c\xda\xc6\x5a\x3b\x1c\xf7\x1c\xe3\xa4\x8d\x05\x38"
+ "\xd6\x02\x8e\xa7\x8f\x92\x69\x63\xc0\xb1\x56\x02\xc7\x5a\x17\x71"
+ "\xdc\x6b\xfe\x9d\xb7\x71\xaf\x11\xf2\x6d\xdc\x6b\xa5\xf2\x36\xee"
+ "\xe5\xad\xbc\x8d\x1f\x33\x71\x6d\x6c\x87\xe3\xc7\x0a\xe4\xda\xf8"
+ "\x36\x78\xc0\x8e\xd0\xc6\x1d\x6b\x89\x6a\x13\xb6\x6d\x05\x6d\x5b"
+ "\x4b\xb7\x8c\xcc\x4d\x2a\x6b\x24\xb6\x09\x9b\x03\xfa\xd9\xbf\x93"
+ "\x25\x2b\x31\x8c\x51\xc1\x3d\x69\x31\xef\xda\xeb\xba\x39\x95\x74"
+ "\x0a\xd0\x62\xfe\x37\x80\x1d\x1f\x1b\xa0\xfd\xe0\x1c\xfc\x9e\x27"
+ "\xe6\xbd\xcc\xd9\xa3\xca\x2c\x7e\x29\xf9\x70\xae\x1f\xd3\x77\x5e"
+ "\x10\x78\xaf\x58\xe6\x6d\x7f\xdf\xd2\xda\x3d\xd0\x3e\x27\x48\x49"
+ "\xc5\x97\xc4\xda\x2d\x63\xed\x20\x33\xd1\x30\x3f\x6b\x7c\x8b\xe2"
+ "\xf4\xc4\xf2\xa6\xbf\x4f\x69\xfc\x31\x52\x1a\xff\x19\x99\x52\xc3"
+ "\xdc\x62\x7e\xd0\xf8\xdc\xf6\xcb\xae\xb0\xf8\x65\xc4\x5a\xb2\xf3"
+ "\x22\xcd\x7e\xd9\xc7\x0a\x17\xe9\x55\x3e\x26\xa2\x89\xae\x66\x98"
+ "\xf4\xd9\xc4\x2b\xbd\x8a\x78\x67\xcc\x26\x3e\x19\x55\x44\x5d\x54"
+ "\x5d\x41\x8a\xaf\x1c\x23\xc5\x75\x67\x48\xf1\x2d\xf8\x6b\x84\x3f"
+ "\x2b\xfc\xa5\x9c\x81\x58\x13\x32\xe9\x2a\xc1\x7d\x45\x0d\x4f\x57"
+ "\x12\xdf\x22\x73\x05\xc1\x39\xbd\xd7\x3c\x1f\x3f\xea\x13\x4e\x7c"
+ "\x99\x1f\xfc\x09\xf3\xa6\xbf\x0a\xce\x79\xe1\xf1\x52\xb3\x81\x14"
+ "\x55\x9b\xf0\xfc\x56\x38\xef\x95\x5c\x0d\xe5\x5b\x8f\xe1\xbe\xa1"
+ "\x86\xa2\x94\xe3\xc4\xbc\xa6\x4e\xc7\xa0\x87\xee\x96\x18\x98\x09"
+ "\x4d\x6d\x65\xfc\x9f\xa0\x38\x08\x38\xb7\xd9\xaa\x34\xd6\x8f\xd3"
+ "\xf5\x6f\xde\xf6\xef\x0a\xed\xdc\xc3\xfa\x76\xa8\x7a\xf2\x99\x0b"
+ "\x0c\x8e\xf1\xc3\x5c\x42\x89\xf1\x04\xc1\x77\x4d\x53\x96\x10\x32"
+ "\xd1\x42\x08\xb6\x45\x69\x7c\x0d\x99\x1c\x4b\x3a\x63\xfe\xd9\xfa"
+ "\xb3\xa6\x6b\x69\xb5\x81\x24\x99\xa1\x8e\xd7\x4c\x4d\x75\x2c\x79"
+ "\xbf\x84\xc0\xb9\x1e\x25\x91\x7a\xe2\x13\x4b\xd4\xd8\xbe\xe6\xac"
+ "\xc4\xd0\xc9\xf0\xfc\xcc\x33\x32\x0c\xb6\x2d\xb6\x29\xb6\x2f\x96"
+ "\x67\x6b\xf3\xd2\x08\x03\x49\x36\x11\x75\xa9\x16\xfe\x8d\x67\x0c"
+ "\xa5\xe4\x3a\x81\x3a\x56\x30\x5d\xea\x74\x80\x8b\x2c\xc4\x02\xe0"
+ "\xb3\x06\xe2\xdf\x55\x06\x53\xe5\x14\x53\xed\xea\x5c\xc0\x54\x25"
+ "\x8f\xa9\xde\x63\x79\x4c\x3d\xd9\x5b\x1e\x53\x4f\x24\x71\x98\x32"
+ "\xb4\x4d\x4c\x3d\xd1\xdd\x39\xa6\x7a\x9b\x9c\x60\xaa\x06\x30\xb5"
+ "\x47\x8c\xa9\x27\x07\x2b\xc7\xd4\x13\xe3\xee\x22\xa6\x2a\xdc\xc3"
+ "\xd4\x13\x03\xc4\x98\xea\x3d\x5c\x1e\x53\x49\x1c\x4f\x3d\x52\xd5"
+ "\x3c\xa6\x92\x04\x3c\xf5\xe4\x06\x1e\x53\x7d\x17\xca\x63\xaa\xcf"
+ "\x29\x8a\xa9\xa4\x36\xca\x53\x7d\x62\x9c\x63\xaa\xcf\x44\x79\x4c"
+ "\x25\x01\x4f\x25\xd9\xf1\x54\xdf\xe5\xca\x31\xd5\x27\xf7\xee\x61"
+ "\x2a\xc9\x4d\x9e\xea\x93\x22\xc6\xd4\x93\x99\x4e\x30\xc5\xf1\x54"
+ "\x97\x6f\x5c\xc0\x94\x80\xa7\xfa\x5e\xe5\x31\xf5\xbb\xe3\xf2\x98"
+ "\xfa\x5d\x5f\x0e\x53\x6d\x94\xa7\x9e\x3a\xec\x1c\x53\x4f\xe5\x3b"
+ "\xc1\x14\xf0\x54\x92\x1d\x4f\xfd\xee\x8c\x72\x4c\x3d\x65\xb8\x8b"
+ "\x98\x72\x93\xa7\x9e\x2a\x17\x63\xaa\x6f\xb5\x3c\xa6\xb4\x1c\x4f"
+ "\x0d\x59\xd5\x3c\xa6\xb4\x02\x9e\xd2\x8c\xe4\x31\xd5\xff\x31\x79"
+ "\x4c\xf5\x5b\x42\x31\xa5\x6d\xa3\x3c\xd5\xcf\xcf\x39\xa6\x34\x46"
+ "\x79\x4c\x69\x81\xa7\xb4\x76\x3c\xd5\x7f\xa0\x72\x4c\xf5\x1b\x73"
+ "\xf7\x30\xa5\x75\x93\xa7\xfa\x69\xc4\x98\xd2\x0c\x75\x82\x29\x8e"
+ "\xa7\xa6\x8f\x72\x01\x53\x02\x9e\xea\x9f\xcd\x63\x6a\xc0\x7c\x79"
+ "\x4c\x3d\x5d\xcc\x61\xaa\x8d\xf2\xd4\xd3\x51\xce\x31\xf5\xf4\x38"
+ "\x27\x98\x02\x9e\xd2\xda\xf1\xd4\x80\x65\xca\x31\xf5\x74\xce\x5d"
+ "\xc4\x94\x9b\x3c\xf5\x74\xa2\x18\x53\xfd\xd3\xe4\x30\xd5\x88\xbe"
+ "\xcf\x03\x30\x15\x09\xbe\x0f\x30\xd4\xb9\x8c\x62\xea\x36\x60\xea"
+ "\x23\x21\xa6\xbe\xb7\xf7\x7d\x03\x7e\xb2\x36\x61\xea\x99\x9b\xf6"
+ "\x98\xb2\x02\xa6\x6e\xb3\x98\x7a\xa6\xa3\xcd\xf7\x95\xd6\xe6\x43"
+ "\xac\xae\x90\xd2\x60\xc0\xd3\x7a\x0e\x4f\xdf\x03\x9e\xe0\x7e\xac"
+ "\x70\xbf\x45\x95\x15\x64\x8a\x81\xde\x57\x23\xdc\xaf\x55\x88\xa5"
+ "\xc6\x1a\x15\x62\x08\xb1\x63\xc3\x51\xf1\x3c\xc0\xcf\x82\x53\xa4"
+ "\x78\x11\xfc\x25\xc0\x9f\x16\xfe\xc8\x29\x52\x54\x43\xd8\x9c\x3d"
+ "\x8f\x9f\x32\x0e\x3f\x03\xb7\x3b\xc7\xcf\xc0\x15\xca\x3c\xde\xa0"
+ "\x76\xca\xf1\x33\xb0\x82\x1b\x4b\xa7\x9e\x32\xf5\x02\x83\xe3\x66"
+ "\x29\x46\xae\x90\x29\x66\xd2\x99\x99\xae\xe9\xea\x13\x4a\xd4\x4b"
+ "\x2d\x44\xb5\x7a\x36\x51\xaf\x3e\x0b\xf7\x6b\x7b\x76\xaa\x88\xcf"
+ "\x09\xd3\x97\xa4\xa8\xae\x82\x14\xdd\x3a\x4e\x8a\xac\xf0\x77\x05"
+ "\xfe\xa0\x8e\x53\xe6\x08\xef\xd7\xc0\xdd\xef\x33\x1b\xa0\xac\x3e"
+ "\xf2\xf7\xfb\x4c\x3c\x7b\xbf\x11\x70\xbf\x8d\xfc\xfd\x96\x02\x16"
+ "\x21\x2e\x3d\xac\x9c\x4f\x9c\x62\x20\x1d\xde\x31\x33\x4c\x23\x87"
+ "\x41\x8c\xcb\x89\x72\x13\x99\x12\x0b\xb1\x7a\x13\x30\x58\x5d\x40"
+ "\x92\x13\x01\x83\x8d\x26\x7c\xaf\x6f\x28\x4d\x69\x00\x0c\x0e\x3c"
+ "\xc0\x40\xbb\xdd\x46\x0c\x7e\x8f\x18\x1c\xa0\xb7\xca\x63\xb0\x9c"
+ "\x62\x10\x7c\x62\xf3\x18\x14\xf0\xda\xa0\x18\x1e\x83\x83\x97\xc8"
+ "\x63\x30\x70\x8d\xcd\x27\xde\x7b\x0c\x06\x0e\x74\x8e\xc1\x40\x1f"
+ "\x65\x9e\x70\xf0\x4a\xe5\x18\x0c\x0c\xbb\x7b\x18\x1c\xfc\x98\x73"
+ "\x0c\x06\x9a\x5d\xc0\x60\x85\x7b\x18\x0c\x0c\x12\x63\x70\x50\x84"
+ "\x3c\x06\x93\x38\x1e\x04\x5f\xd9\x2c\x06\x85\xbe\x72\xf0\x75\x1e"
+ "\x83\xff\x61\x91\xc7\xe0\x7f\xf8\xd9\x7c\xe5\xbd\xc7\xe0\xef\xf7"
+ "\x3a\xc7\xe0\xef\x33\x95\x79\xc8\x67\x3b\x2a\xc7\xe0\xef\xf5\x77"
+ "\x0f\x83\xff\xb1\xc5\x39\x06\xff\x23\xa5\x79\x0c\x26\xb9\xc9\x83"
+ "\xbf\x3f\x22\xc6\xe0\xe0\x1a\x27\x18\xe4\x78\x10\x7c\x68\xf3\x18"
+ "\x14\xf0\xe0\xb3\x0b\x79\x0c\x0e\x59\x26\x8f\xc1\xe7\x36\xd8\x7c"
+ "\xe8\xbd\xc7\xe0\x73\xcf\x39\xc7\xe0\x73\xbe\xca\x3c\xe7\x90\x35"
+ "\xca\x31\xf8\x5c\xc4\xdd\xc3\xe0\x90\xbe\xce\x31\x38\xc4\xcb\x05"
+ "\x0c\xba\xc9\x83\xcf\x8d\x13\x63\xf0\xd9\x68\x79\x0c\x6a\x39\x1e"
+ "\x04\xdf\xda\x2c\x06\x85\xbe\x75\x48\x03\x8f\xc1\x61\xed\xe4\x31"
+ "\x38\xf4\x31\x9b\x6f\xbd\xf7\x18\xfc\xc3\x7e\xe7\x18\xfc\x43\x8e"
+ "\x32\x8f\x3a\xcc\x4f\x39\x06\xff\x50\x73\xf7\x30\x38\x74\xbb\x73"
+ "\x0c\x0e\x5d\xd1\x3c\x06\xb5\x6e\xf2\xe0\x1f\x8a\xc4\x18\x1c\x62"
+ "\x70\x82\x41\x8e\x07\xc1\xe7\x36\x8f\x41\x01\x0f\x0e\x4b\xe2\x31"
+ "\xf8\xc2\x4a\x79\x0c\x3e\xbf\xc5\xe6\x73\xef\x3d\x06\x9f\x1f\xe1"
+ "\x1c\x83\xcf\xf7\x54\xe6\x69\x5f\xd8\xa0\x1c\x83\xcf\x47\xdf\x3d"
+ "\x0c\xbe\x30\xd0\x39\x06\x5f\xf0\x71\x01\x83\x6e\xf2\xe0\xf3\xc1"
+ "\x62\x0c\x0e\x8b\x93\xc3\xa0\x15\x7c\xf1\xed\xad\xf3\x82\xac\x59"
+ "\xd9\x15\x9d\x3d\x02\x88\xd9\x37\x25\xbf\x34\xce\x48\x26\xdf\x84"
+ "\xf6\x89\xbd\x49\x66\xde\x54\x13\x4b\x56\xf6\x31\xd0\xe4\xa1\x02"
+ "\xff\xcc\x8e\x2d\x33\x67\xd6\xe9\x32\xe6\x11\x2f\xf0\xdf\x6b\xf1"
+ "\x58\xe9\x65\x13\xc1\xdf\x4f\xc2\xfa\x5c\xe1\xeb\x83\x79\x02\xe6"
+ "\x17\x8d\x9a\x7d\xc7\xdc\xa8\x27\xd5\xc3\x89\x67\x51\xb5\x1e\xda"
+ "\x21\x81\x8d\x2f\xb6\xcb\x65\xcf\xe1\xd1\x79\xd7\x88\x97\xf9\x07"
+ "\xff\x1e\xd0\xde\xbe\x1d\x17\x13\x8f\x9e\xd5\x8c\x15\xdb\x15\xdb"
+ "\x0b\xdb\x38\x20\x01\xdf\x5d\x0f\x3f\x58\x02\x18\x33\xff\xa0\xe9"
+ "\xb1\x19\xae\x93\xf6\xab\xc3\x8f\x2a\xc7\xc6\xf0\x15\x74\xde\xc2"
+ "\xf0\x88\xa2\x4a\x22\xf9\xee\x18\xda\xaa\xdc\xc5\xb6\xaa\x10\xf8"
+ "\xbc\x56\x68\xab\x11\x39\xae\xb5\xd5\x88\x9f\xec\xda\x4a\xc2\x57"
+ "\x8d\xb8\xae\xbc\xad\x46\x7c\x4e\xdb\x6a\x44\xa6\x7c\x5b\x25\xb9"
+ "\x88\xab\xa4\x50\x81\x1f\x69\x85\xb6\xfa\xcf\x23\xae\xb5\xd5\x1f"
+ "\xfd\xc4\x6d\x25\xa5\xff\xff\xf8\x98\xf2\xb6\xfa\x4f\x3d\x6d\xab"
+ "\xff\x3c\xe0\xa4\xad\x5c\xc4\x55\x52\x85\x40\x37\xb7\x42\x5b\xfd"
+ "\xd1\xe0\x5a\x5b\x05\x8d\xb4\x6b\x2b\x09\x9d\x1a\x34\x5e\x79\x5b"
+ "\x05\xd1\xfd\xf0\x3c\xff\x58\x23\xdf\x56\x5a\x17\x71\xa5\x0d\x15"
+ "\xe8\xbb\x56\x68\xab\x91\x3d\x5d\x6b\xab\x91\x31\xe2\xb6\x92\xd2"
+ "\x53\x23\x17\x2a\x6f\xab\x91\x43\x69\x5b\x8d\xf4\x75\xd2\x56\x2e"
+ "\xe2\x4a\x5b\x21\xd0\x21\xad\xd0\x56\xa3\xc6\xb9\xd6\x56\xa3\x36"
+ "\xd8\xb5\x95\x44\xbf\x3f\x6a\x8b\xf2\xb6\x1a\x15\x41\xdb\x6a\x54"
+ "\x90\x5c\x5b\x59\xb2\x12\xa7\x75\x86\x36\x68\x58\x9f\x18\xd8\x39"
+ "\x9e\xa8\x1a\xfb\x40\xbb\xf9\x42\xbb\x2d\x0b\x20\xb7\xb3\xa0\xdd"
+ "\x0c\x66\x32\x79\xfe\x05\xa6\xa4\xd6\x42\x1a\xa1\xcd\x1a\x7c\x13"
+ "\x43\x4b\x0d\x35\x38\xe6\xe8\x85\x2a\xcf\x31\xcb\xa6\xcf\x57\x13"
+ "\x6c\x37\x6c\x07\x6c\x3b\x06\xda\x8d\x6d\x47\xdf\xbc\x48\x8b\x6f"
+ "\x46\xec\xa4\xab\x17\x98\x77\xf4\x0c\x83\xf7\xcb\xf8\x8e\x2a\xc3"
+ "\xf7\x02\x53\x6a\x48\x87\x80\x57\xf0\x9e\xc6\x0c\xc6\xe3\xa5\x86"
+ "\x0a\xd0\x07\x75\x84\xd5\x66\x17\x34\xbe\x96\x57\x35\x3e\x96\xd2"
+ "\xd0\x97\x98\x6e\xa3\x0d\xe6\x6e\x69\xba\xe4\xab\xa4\x3d\xea\x87"
+ "\x74\x2b\xf1\x4f\x8a\x21\xaa\x5d\x73\x75\x2a\x76\xee\xda\x02\x2c"
+ "\x63\xb4\x05\xda\xc5\x9f\xb9\x21\x18\xd3\x7d\x23\x92\x94\x5e\xce"
+ "\x64\xe3\x66\xaf\x11\xd8\xb8\x7d\xa7\x51\x83\xce\x0c\x64\x7c\x13"
+ "\x23\x33\x4b\x48\x00\x73\x1b\xda\x98\x9d\x4f\x34\xe6\xa7\xbc\x46"
+ "\xa5\x6d\x3c\x9a\x1d\xff\x6d\x0d\xe0\xc6\x6f\x41\x3b\xe1\xef\xb3"
+ "\xe3\xb7\x62\x05\xe3\xb7\xa0\xce\xfc\xf8\xad\xd1\x69\x38\x7e\xcb"
+ "\x7a\xc1\xbf\x87\xed\xde\xdf\x89\x66\x18\xb8\xf7\xae\x25\x46\x03"
+ "\xc1\xfb\x2f\x31\xea\x48\x72\x1c\x51\x97\x34\xd6\x10\xad\x91\x31"
+ "\x94\xa4\xfc\x44\xa6\xdc\x44\x1d\x8c\x78\x19\xb3\x84\xc6\x75\xf4"
+ "\x44\xeb\x05\x4d\x0f\xbd\xe7\x98\xd8\x92\x32\x42\x04\xf3\x78\x22"
+ "\x41\x33\x7b\x43\x1c\x22\x4b\x53\xaa\x08\xc4\xc4\x50\x6a\x3e\x8b"
+ "\x71\x8a\x84\xf3\xc3\x9b\xf4\x75\xb7\x8c\x3a\x3c\x86\x31\xc3\xf7"
+ "\x4d\xb8\x76\x40\x9e\x40\x7f\x23\x2e\x3a\xc7\xa7\x90\xd2\xf8\x46"
+ "\x52\x62\xc6\x39\xbb\xa3\x4c\x27\x43\x2b\xe4\x70\x54\xce\xe1\x68"
+ "\x4f\xe7\xf8\x76\x75\x2e\xe0\xa8\x82\xc7\xd1\x8b\xc7\xef\x0c\x47"
+ "\x2f\x2e\xb9\x73\x1c\xbd\x38\xf6\x0e\x70\x54\x23\xc6\xd1\x4b\x83"
+ "\x95\xe3\xe8\x45\xb5\x72\x1c\x8d\x2d\xbf\x33\x1c\xbd\x78\x98\xe2"
+ "\x68\x6c\x16\xc5\xd1\x8b\xfb\x78\x1c\xb1\x73\xa3\x5a\x09\x47\x63"
+ "\x83\xe4\x71\x94\xc4\xf1\x51\x12\xf0\xd1\x23\x55\xcd\xe3\x28\x49"
+ "\xc0\x47\xe3\xbb\xdc\x19\x8e\xc6\x1d\xbe\x73\x1c\x8d\x5b\xed\x3e"
+ "\x8e\x92\xec\xf8\x68\xfc\x12\xe5\x38\x1a\x17\xaa\x1c\x47\xe3\x7a"
+ "\xde\x19\x8e\xc6\x77\xa0\x38\x7a\xa9\x92\xe2\x68\x3c\xe1\x71\xc4"
+ "\xce\x37\x6b\x25\x1c\xbd\xb4\xc2\x09\x8e\x38\x3e\x4a\x02\x3e\xea"
+ "\xf2\x8d\x0b\x38\x12\xf0\xd1\xcb\xaf\xdd\x19\x8e\x5e\xee\x70\xe7"
+ "\x38\x9a\x70\xfa\x0e\x70\x64\xc7\x47\x2f\x1f\x56\x8e\xa3\x09\xf9"
+ "\xca\x71\x34\x21\xe2\xce\x70\xf4\xf2\x54\x8a\xa3\x09\x7d\x28\x8e"
+ "\x5e\x1e\xc7\xe3\x88\x9d\xc3\xd7\x4a\x38\x1a\x5f\x26\x8f\x23\x2d"
+ "\xc7\x47\x5a\xe0\xa3\x21\xab\x9a\xc7\x91\x56\xc0\x47\x93\xb6\xdc"
+ "\x19\x8e\x26\x4d\xbd\x73\x1c\x4d\x7a\xcc\x7d\x1c\x69\xed\xf8\x68"
+ "\x72\x07\xe5\x38\x9a\x58\xa3\x1c\x47\x13\x77\xde\x19\x8e\x26\x6d"
+ "\xa0\x38\x9a\x18\x4d\x71\x34\x29\x93\xc7\x11\x3b\x2f\xb2\x95\x70"
+ "\x34\xd1\xdf\x09\x8e\x38\x3e\xd2\x02\x1f\x4d\x1f\xe5\x02\x8e\x04"
+ "\x7c\x34\xe5\xa7\x3b\xc3\xd1\x94\x0d\x77\x8e\xa3\x29\x73\xee\x00"
+ "\x47\x76\x7c\x14\x3c\x55\x39\x8e\xa6\x04\x2a\xc7\xd1\x64\xe3\x9d"
+ "\xe1\x68\xca\x45\x8a\xa3\xc9\x9f\x53\x1c\x4d\xa9\xe0\x71\xc4\xce"
+ "\x35\x6d\x25\x1c\x4d\x0e\x97\xc3\x11\xae\x45\xb0\x8e\xae\x0b\x61"
+ "\xcc\x48\x20\x43\xf3\xf0\xdf\x46\x12\x58\x9f\x1e\xbc\xe2\x70\x22"
+ "\x5d\x0f\x40\xef\x19\xcc\xe6\x7b\xa5\xbe\xff\xc8\x76\x88\x8b\x6f"
+ "\x62\xf0\x94\x73\x74\x8d\x06\x5c\x17\xe4\x46\x72\x24\x19\xc4\xae"
+ "\xcb\x30\x55\x87\xeb\x58\x35\xad\x1d\xe0\x2b\xb3\x76\xc0\xeb\xf2"
+ "\x6b\x07\x34\xae\xb7\xcd\xbb\x2d\x10\xcc\xbb\x9d\xba\xda\xf9\xbc"
+ "\xdb\xa9\x0b\x37\xbd\xae\x14\x0f\x53\x83\xf0\x1e\x6f\x74\x4b\x84"
+ "\x7b\x9f\xfa\x3e\xdc\x73\x18\xbd\x77\x00\xbc\x4b\xf3\x71\x0b\x04"
+ "\x38\x99\x1a\x18\x12\x46\x52\x98\x74\xf5\xfb\x8c\x5f\x62\x30\x93"
+ "\x9d\x18\xae\xb0\x2e\xff\xbf\xbd\xef\x01\x88\xaa\xca\xfe\xbf\x33"
+ "\x0c\x45\x86\x32\x18\xb8\xd4\x5a\x8d\x2d\xb6\xd8\x9a\x62\x59\x6b"
+ "\xfb\xd5\x8d\x12\x8b\x4a\x05\x0d\x75\x54\x54\x34\x34\x48\x44\x02"
+ "\x54\x44\x18\x90\xac\xd5\x42\x40\x02\x16\x93\x7f\xb6\xd4\x9a\xab"
+ "\x49\xad\xee\xd2\xae\xd6\xb4\x6a\x8b\x85\x40\xa5\x2d\xed\xe2\x36"
+ "\xb1\x64\x64\x68\x93\x8e\xf2\x6f\x66\xee\xef\x9c\x77\xdf\xf0\xde"
+ "\x0c\x33\x30\x6f\x06\x59\x7f\x6d\x53\x4f\x66\xee\x3b\xef\xdc\x7b"
+ "\xcf\xf9\xdc\x73\xcf\x3d\xef\xbd\x73\x1d\xee\x7f\xc8\xcb\xbb\xd1"
+ "\xbe\xbc\x9f\x0c\xe6\xe5\x5d\xcd\xcb\xdb\x7e\xde\x82\x45\x8e\xf3"
+ "\x16\xd8\x97\xf7\xdc\x01\xde\x73\x9e\xfb\x95\x74\x79\xcf\xad\xe6"
+ "\xe5\x5d\xdd\x91\x3b\xd7\x20\xc8\xfb\xc9\x44\xe9\xf2\x9e\x5b\xc9"
+ "\xe4\xed\x9b\x0a\xf2\x6e\x04\x79\x4b\xcc\xdf\xf2\xa4\xc3\xfc\xdf"
+ "\x4c\xde\x19\x0e\xf0\x1d\x59\xc9\xe4\xcd\xe7\x4c\xf0\x73\x90\x33"
+ "\x61\x91\xe3\x9c\x09\xf6\xe5\x1d\xb9\xa6\x7f\x79\x47\xce\x93\x2e"
+ "\xef\x48\x15\x93\x77\x06\xe0\x3b\x32\x46\x90\x77\xa4\x4e\xba\xbc"
+ "\x23\x95\x4c\xde\x23\xe3\xa9\x7f\x06\xe0\x3b\x43\x22\xbe\x23\xf7"
+ "\x0d\x20\x6f\x07\xf8\x9e\xaf\xe4\xe5\xcd\xe3\xdb\x41\xbe\x86\x45"
+ "\x8e\xf3\x35\xd8\x97\xf7\xbc\x33\xfd\xcb\x7b\xde\x71\xe9\xf2\x9e"
+ "\x97\xcf\xcb\x1b\xf0\x3d\xef\x94\x20\xef\xf9\x11\xd2\xe5\x3d\x2f"
+ "\x8b\xc9\xfb\xa6\x68\x90\x37\xe0\x3b\x43\x22\xbe\xe7\x8f\xee\x5f"
+ "\xde\x1a\x07\xf8\x5e\x90\xc5\xe4\xcd\xe7\x8a\xf0\x73\x90\x2b\x62"
+ "\x91\xe3\x5c\x11\xf6\xe5\xbd\x60\x56\xff\xf2\x5e\x70\x9f\x74\x79"
+ "\x2f\x20\x4c\xde\x1a\xc0\xf7\x82\x50\x41\xde\x0b\xb4\xd2\xe5\x3d"
+ "\x5f\xcf\xe4\xed\x17\x49\xfd\x35\x80\x6f\x8d\x44\x7c\x2f\xc8\x19"
+ "\x40\xde\x0e\xf0\xad\xd6\xf3\xf2\xe6\xf1\xed\x20\x4f\xc5\x22\xc7"
+ "\x79\x2a\xec\xcb\x5b\x7d\xa4\x7f\x79\xab\x5f\x93\x2e\x6f\x75\x22"
+ "\x2f\x6f\xc0\xb7\xfa\xa0\x20\xef\x85\xc1\xd2\xe5\xad\x8e\x66\xf2"
+ "\xf6\x0f\x03\x79\x03\xbe\x35\x12\xf1\xad\x36\x3a\x92\xb7\x0f\xc8"
+ "\xfb\x38\xf8\x31\x30\x0f\xaa\xcd\x85\xe0\xa7\x98\xac\xe5\xde\x90"
+ "\x3a\x85\x4c\xb8\x82\xb2\x5f\xd4\x0c\x73\x87\x7a\xe8\xf2\x65\x2c"
+ "\x3a\xee\xfe\xbb\xc3\x8b\x76\x38\x7e\x77\x78\xd1\x46\xe9\xef\x0e"
+ "\x2f\x0a\x15\x7c\xa0\x45\x5b\x05\x9d\x2e\xe6\xec\x87\xb4\x77\x8a"
+ "\x17\x4d\xb6\x9f\x47\x63\x61\x2b\xbe\x53\x4c\x73\x47\x4d\x35\x17"
+ "\xb9\xe2\x1b\x2d\x6a\x73\x42\xd7\x4d\xa0\x87\x46\xc7\xba\x8e\xaa"
+ "\x05\x5d\x37\x0d\x5d\xde\x8e\xa8\xb7\xdc\xd7\x75\x54\x86\x63\x5d"
+ "\x47\xad\x94\xae\xeb\xa8\x60\xc1\xff\x8a\x4a\x11\x74\xbd\xc4\x85"
+ "\xf7\xc7\xa3\x54\xf6\xf3\x79\x2c\x6e\x64\xba\xfe\x49\x25\xe8\xda"
+ "\x05\xbf\x2c\xea\xd4\xc0\xba\xce\x80\x71\x9d\xd1\xcf\xb8\x5e\x7a"
+ "\x10\xe6\x4c\xf5\xd0\xe5\x0f\x59\x5a\xe6\xbe\xae\x97\xc6\x39\xd6"
+ "\xf5\xd2\x39\xd2\x75\xbd\x74\xb4\xe0\xfb\x2d\x8d\x16\x74\xbd\xd4"
+ "\x20\x5d\xd7\x4b\xbd\xed\xe7\x15\x59\x72\x98\xe9\xfa\x66\x85\xb9"
+ "\xc8\x15\x9f\x70\xa9\xd6\x09\x5d\xc3\xb8\xce\xe8\x67\x5c\x47\x57"
+ "\x82\xae\x9b\x86\x2e\x8f\x49\xf4\x36\xf7\x75\x1d\x3d\xcf\xb1\xae"
+ "\xa3\xa7\x49\xd7\x75\xb4\x97\xe0\x77\x46\xcf\x14\x74\x1d\xad\x93"
+ "\xae\xeb\x65\x9d\xf6\xf3\x9b\x2c\xdb\xc3\x74\x7d\x4b\x2c\xe8\xda"
+ "\x05\x7f\x34\xda\xa1\xff\x2f\xe8\x5a\x03\xe3\x5a\xd3\xcf\xb8\x5e"
+ "\x91\x03\xbe\x82\x7a\xe8\xf2\xa9\xac\x58\xe7\xbe\xae\x57\x3c\xe4"
+ "\x58\xd7\x2b\xc6\x49\xd7\xf5\x72\x83\xe0\xf3\xae\x98\x22\xe8\x7a"
+ "\x45\x9d\x74\x5d\x2f\x6f\xb5\x9f\x67\x65\x79\x21\xd3\xf5\x4f\xeb"
+ "\xcc\x45\xae\xf8\xc2\x2b\x4a\x9c\xd0\x35\x8c\x6b\x4d\x3f\xe3\x3a"
+ "\x06\xd6\xf5\x9a\xa6\xa1\xcb\xeb\x12\xb3\xdc\x7d\x5d\xc7\xdc\xed"
+ "\x58\xd7\x31\xfe\xd2\x75\xfd\x94\x4e\xf0\xb7\x63\x02\x05\x5d\xc7"
+ "\xd4\x48\xd7\xf5\x53\x8d\xf6\xf3\xbd\x3c\x95\xc5\x74\x7d\x6b\x30"
+ "\xe8\xda\x05\x3f\x3c\x66\x8b\x2b\x7e\x78\x72\x19\xf1\xb2\xd6\xf7"
+ "\xaa\xd8\xa1\xf5\xc5\x57\xcd\x71\x5f\xdf\xab\x6e\x75\xac\xef\x55"
+ "\x9e\xd2\xf5\xbd\xb2\x51\xf0\xc5\x57\xf9\x09\xfa\x5e\xb5\x47\xba"
+ "\xbe\x57\x6a\xed\xfb\xe2\x2b\x13\xdd\xf3\xc5\x57\xa5\xb8\xe2\x8b"
+ "\xf7\xd5\x77\xac\x7a\x68\xfd\xf1\xd8\x87\xdc\xd7\x77\xec\x70\xc7"
+ "\xfa\x7e\xfa\xb2\x74\x7d\x3f\xad\x15\xfc\xf1\x58\x85\xa0\xef\xd8"
+ "\x12\xe9\xfa\x7e\xba\xda\xbe\x3f\xfe\x74\xb4\x7b\xfe\x78\x6c\x8c"
+ "\x2b\xfe\x78\x5f\x7d\x3f\x13\x36\xb4\x3e\xf9\x33\x93\xdc\xd7\x77"
+ "\x9c\xc9\xb1\xbe\xe3\xbe\x92\xae\xef\xb8\x6a\xc1\x27\x8f\x13\xc5"
+ "\xbf\x9f\xd9\x2a\x5d\xdf\x71\x95\xf6\x7d\xf2\xb8\x08\xf7\x7c\xf2"
+ "\x67\x22\x5d\xf1\xc9\xfb\xea\x3b\x7e\xca\xd0\xfa\xe5\xf1\x63\xdc"
+ "\xd7\xf7\xea\xf3\x8e\xf5\xbd\xfa\xb4\x74\x7d\xaf\xae\x14\xfc\xf2"
+ "\xd5\xad\x82\xbe\xe3\x5d\xc8\x9f\xb9\x3a\xdf\xbe\x5f\xbe\x3a\xc4"
+ "\x3d\xbf\x3c\x3e\xd4\x15\xbf\xbc\xaf\xbe\x13\x82\x86\xd6\x37\x4f"
+ "\xf0\x75\x5f\xdf\x6b\xce\x38\xd6\xf7\x9a\xe3\xd2\xf5\xbd\x26\x5f"
+ "\xf0\xcd\xd7\x88\xe2\xff\x09\xb1\xd2\xf5\xbd\x26\xcb\xbe\x6f\xbe"
+ "\x26\xd8\x3d\xdf\x3c\x61\xb2\x2b\xbe\x79\x5f\x7d\x27\x06\x0c\xad"
+ "\x7f\x9e\x28\x73\x5f\xdf\x6b\x4f\x3a\xd6\xf7\xda\x43\xd2\xf5\xbd"
+ "\x36\x4b\xf0\xcf\xd7\x1e\x13\xf4\x9d\xa8\x96\xae\xef\xb5\x89\xf6"
+ "\xfd\xf3\xb5\x2a\xf7\xfc\xf3\xc4\x40\xf7\xe3\xe4\x49\x06\xf4\xcd"
+ "\xa5\xe6\x7f\x6c\x48\xb1\xbc\x73\x97\x28\xca\xff\x98\xc4\xed\xad"
+ "\x62\x3f\xb7\x4c\xd2\x43\xd7\x76\xfe\xc7\x67\x07\xc8\xff\xf8\xac"
+ "\xc4\xfc\x8f\x49\xe3\xa4\x3f\x8f\xff\xac\x41\x58\x23\x24\x89\xd6"
+ "\xff\xc9\xdc\xb8\xbe\xb6\xf3\x42\x3e\x6b\x93\x17\x32\x91\xcb\x0b"
+ "\x49\x73\x6f\x2b\x74\x6d\x2d\x92\x4c\xdc\xbf\x2f\xb0\xae\x11\xd7"
+ "\x21\x52\xf3\x50\x0a\xd8\x4e\x3e\x29\x60\x7b\xdd\xfb\x8e\xb1\xbd"
+ "\xee\xd6\x6b\x3b\x0f\x65\xca\xee\xfe\xb1\x9d\x92\x25\x2d\xe7\xc8"
+ "\x3a\x17\xf2\xde\xa4\x34\x0a\xeb\xa1\x75\xa2\xf5\xef\x7a\xe5\x10"
+ "\x62\xdb\xc5\x7c\x4a\x29\x07\xad\xb1\x9d\x7c\x8c\x61\x5b\xd5\xe6"
+ "\xda\xba\x6b\x5d\xb3\xfb\xf7\x41\x52\xf7\xe1\x9a\x4b\x6a\x3e\x4c"
+ "\x01\xdb\xeb\xdf\x10\xb0\x9d\x5a\xe6\x18\xdb\x1b\xba\xae\xed\x7c"
+ "\x98\x1b\x32\xfa\xc7\xf6\x86\x28\x69\xb9\x4c\x36\x7c\x29\x1d\xdb"
+ "\x1b\xf6\x09\x6b\xbf\x0d\x7a\x01\xdb\xa9\xed\x43\x87\x6d\x57\xf3"
+ "\x64\x6e\xc8\xb7\xc6\xf6\xfa\x4a\x86\xed\x9f\x4d\x75\x6d\x8d\x99"
+ "\x5a\xe3\xfe\x7d\x9f\x4d\x5b\x71\x7d\x29\x35\x2f\xa7\x80\xed\x8d"
+ "\xcf\x0b\xd8\xde\xd4\x27\x2f\x94\x80\xed\xb4\xd3\xd7\x76\x5e\xce"
+ "\xb4\x85\xfd\x63\x3b\x6d\x8a\xb4\x1c\x29\x69\x47\xa4\x63\x3b\x6d"
+ "\xab\xb0\xce\x4d\xab\x13\xb0\xbd\xa9\x76\x08\xb1\xed\xa2\xdd\x4e"
+ "\x8b\xb7\xc6\xf6\xc6\x74\x86\xed\xb1\xf9\xae\xad\xa7\x37\x15\xba"
+ "\x7f\x9f\x4b\x13\x83\x6b\x69\xa9\xf9\x41\x05\x6c\xa7\x2f\x17\xb0"
+ "\xad\x99\xe7\x18\xdb\x19\x6f\x5d\xdb\xf9\x41\x33\x06\xc8\xff\x93"
+ "\xd1\x4f\xfe\x1f\x7b\xef\x0a\x67\xb8\x90\xf7\x22\x23\x46\x58\xd3"
+ "\x67\xec\x11\xb0\xad\xa9\x1a\x3a\x6c\xbb\x9a\x37\x34\x23\xcc\x1a"
+ "\xdb\xe9\x6a\x86\xed\x9f\xb7\xba\x16\x3b\xd0\x24\xba\x7f\x5f\x6f"
+ "\x73\x08\xc6\x0d\xa4\xe6\x29\x15\xb0\x9d\x39\x4d\xc0\xf6\xe6\x49"
+ "\x8e\xb1\x9d\xb5\xfd\xda\xce\x53\x9a\xe5\xdb\x3f\xb6\x33\xf5\xd2"
+ "\x72\xba\x64\xb9\xf0\x1e\x7c\x56\x88\x10\xbf\xc8\x12\x3d\xff\xbe"
+ "\x39\x6b\x08\xb1\xed\xa2\xdd\xce\x0a\xb4\xc6\x76\xe6\x64\x86\xed"
+ "\xbb\xa6\xb8\x16\x27\xd9\x3c\xd3\xfd\x38\xc9\x96\x99\xdc\x3d\x4c"
+ "\x89\xf9\x52\x05\x6c\x67\xdf\x2c\xe4\x26\xda\x32\xcd\x16\xdb\x42"
+ "\x6e\xa2\xe7\xe6\x5d\x3b\xf9\x52\xb3\x3f\xef\x1f\xc7\xd9\x35\xd2"
+ "\x62\x22\xcf\x4d\x93\x8e\xe3\xe7\xbc\x84\x98\xc8\x73\xa2\xe7\x5f"
+ "\xb6\x58\xf6\x24\x1f\x82\x9c\x45\xcf\x7d\xd9\x7f\xce\xa2\xe7\xb4"
+ "\x57\x2f\x8f\x6a\x76\xbb\x75\xce\xa2\x6c\xa5\x99\x1b\x0b\xe3\x73"
+ "\x5c\x8b\xab\x6c\x51\xbb\x1f\x57\xf9\x0d\xbb\xbf\x2b\x31\x6f\xab"
+ "\x30\x16\x9e\x1f\x2b\x8c\x85\xdf\x3c\xe6\x78\x2c\xbc\xb0\xfc\xda"
+ "\xc9\xdb\xfa\xfc\x57\xfd\x8f\x85\xe7\x8f\x49\x8b\xa1\xbc\xe0\x42"
+ "\x1e\x98\x17\xfc\x84\x18\xca\x0b\x6a\x61\x2c\xfc\xa6\x64\xe8\xc6"
+ "\xc2\x0b\xe7\xfb\x1f\x0b\x2f\xd4\x5d\xbd\x7c\xae\xcf\x77\x5a\x8f"
+ "\x85\xe7\x47\xb3\xb1\x30\x51\xe9\x5a\x1c\xe6\x37\x2e\xdd\xff\xb6"
+ "\x1e\x0b\x2f\xc6\x70\xf7\xbe\x25\xe6\x8f\x15\xc6\xc2\xd6\x49\xc2"
+ "\x58\x78\xb1\x8f\x3f\x2f\x8c\x85\x6d\x6b\xae\x9d\xfc\xb1\x5b\xbf"
+ "\xef\x7f\x2c\x6c\x6d\x94\x16\x73\xd9\x36\x4f\xfa\x58\xd8\x26\x7a"
+ "\xff\x69\x9b\xe8\xfd\xa7\x17\xab\x86\x6e\x2c\x6c\xeb\xea\x7f\x2c"
+ "\x6c\x6b\xba\x7a\x79\x65\xb7\x29\xac\xc7\xc2\xd6\x20\x36\x16\x26"
+ "\x15\xba\x16\xb7\x79\xd1\x09\xff\x7f\xa0\xb8\xcd\xf6\x44\xee\xb9"
+ "\x00\x89\x79\x6c\x85\xb1\xf0\xd2\x34\x61\x2c\x6c\x5f\xee\x78\x2c"
+ "\xe4\x6c\xbc\x76\xf2\xd8\xbe\x64\xea\x7f\x2c\xbc\xd4\x2c\x2d\x46"
+ "\x93\xb3\x5c\xfa\x58\xc8\x19\x2f\xc4\x68\x72\x12\x85\xb1\xb0\xbd"
+ "\x7a\xe8\xc6\xc2\x76\xcf\xfe\xc7\x42\x4e\xeb\xd5\xcb\x6f\x9b\xa3"
+ "\xb4\x1e\x0b\x2f\x4d\x66\x63\x61\x72\x80\x6b\x71\x9e\xed\xe9\xee"
+ "\xc7\x79\xf2\xd3\xb9\x67\x26\x24\xe6\xd3\x15\xc6\x42\xee\x63\xc2"
+ "\x58\xc8\x5f\xe3\x78\x2c\xe4\x3d\x7f\xed\xe4\xd3\xcd\xbb\xa1\xff"
+ "\xb1\x90\xdb\x26\x2d\xa6\x93\xb7\x46\xfa\x58\xc8\x9b\x22\xc4\x74"
+ "\xf2\xd2\x85\xb1\x90\x7f\x78\xe8\xc6\x42\xbe\x6f\xff\x63\x21\x4f"
+ "\x7f\xf5\xf2\xec\xe6\x8d\xb6\x1e\x0b\xb9\x21\x6c\x2c\xdc\x5f\xea"
+ "\x5a\x5c\x28\x7f\xab\xfb\x71\xa1\x97\xb7\x72\xcf\x93\x48\xcc\xeb"
+ "\x2b\x8c\x85\x1d\xf3\x84\xb1\xf0\x72\x3f\xfb\x3c\x14\xec\xb8\x76"
+ "\xf2\xfa\x16\x0c\xb0\xff\xd1\x8e\xfe\xf6\x3f\xb2\x13\x03\x2a\xd8"
+ "\x28\x7d\x2c\x14\x84\x0a\x31\xa0\x02\xd1\xfb\x7f\x2f\xd7\x0e\xdd"
+ "\x58\x78\x79\x80\xfd\x1f\x0a\x9c\xd8\xff\xc1\xd5\x7c\xbf\x05\x41"
+ "\xd6\x63\x61\xc7\x4c\x36\x16\x1e\x50\xb9\x16\x47\x7a\x79\xc0\xf8"
+ "\x3f\xae\xf3\x7b\xfc\xfa\xc6\x91\xea\x5a\xa7\x90\x5f\x2c\xc2\xb1"
+ "\x50\x34\xd5\x58\x94\xae\xc6\xfc\xc2\xa6\x40\x3e\x07\xe5\x66\x3e"
+ "\xc7\x8b\xc1\xc8\x72\x50\xea\x4d\xbd\x39\x28\x59\xee\x0f\x22\xc7"
+ "\x77\x81\xf1\x9d\x60\xa3\x92\xe5\x9f\xa4\xf8\x4c\x14\x3e\x23\xd5"
+ "\x52\xcb\xe5\x57\x49\x37\x42\xdf\xcf\x0e\x90\x7f\x32\x5a\x47\xea"
+ "\xa2\xd3\x88\xd1\xf7\xa2\x96\xbd\x27\x5c\x58\xc7\xe5\x9f\x5c\x16"
+ "\x70\x4b\xee\xbf\x89\x9f\x0f\xe6\x9f\x8c\xa6\xe6\x4c\x1d\xd5\xd7"
+ "\x77\x12\xa0\x05\xf9\x2e\xb7\xe4\xa0\x2c\xba\x0f\xfb\x6e\x5c\x16"
+ "\x74\x4b\xf9\xbf\x1d\xe5\x17\x2e\x72\x21\x0f\x6c\x61\x9b\x10\xdf"
+ "\x29\x1a\x2f\x60\xb4\x88\x9b\x83\xe1\xfc\xb1\x3a\x35\xd8\x98\xdc"
+ "\xff\xab\xea\x71\x29\xf7\x46\x51\x98\x13\x3a\xc3\x67\x44\xfa\xd8"
+ "\x2f\x41\x67\xc5\x7a\xd0\x59\x13\xe6\x39\x76\x5e\x67\x9e\x17\xaf"
+ "\x8e\xce\x8a\xb3\x9c\xd7\x59\xf1\x37\x36\x3a\xb3\x13\x87\x28\xfe"
+ "\x58\xba\xce\x8a\x4b\x85\x38\x44\xb1\x4e\xd0\xd9\x6f\x83\x99\xce"
+ "\x8a\x53\x99\xce\xa6\x82\x5d\x76\x65\x5d\x5e\x3c\xe0\xfb\xdf\xb8"
+ "\x6e\xea\xf1\xeb\xbb\x2e\x17\x74\x56\x52\x65\x2c\x82\xb5\x3b\xac"
+ "\xcb\x9d\xd7\xd9\x8d\x2d\x57\x47\x67\x25\x93\x9d\xd7\x59\x49\x99"
+ "\xb5\xce\xec\xad\x97\x4b\x5c\xd8\xb3\xb3\x24\x42\x58\x2f\x97\x14"
+ "\x0a\x3a\x2b\x69\x65\x3a\x2b\x19\xcf\x74\x36\xcd\xd8\xe3\x52\x0e"
+ "\x90\x92\x6a\x27\x74\x86\xf7\xf4\xfb\x19\x67\xaf\xa8\x41\x67\x4d"
+ "\x98\xf7\xd9\x79\x9d\xf9\x7e\x72\x75\x74\xb6\xb3\xcd\x79\x9d\xbd"
+ "\x32\xc7\x46\x67\x76\xd6\x75\xaf\x3c\x20\x5d\x67\xaf\x28\x84\x75"
+ "\xdd\x2b\x61\x82\xce\x5e\x29\x61\x3a\xdb\xa9\x63\x3a\x7b\x30\xa8"
+ "\xc7\xa5\x3c\x22\xaf\x0c\x18\xff\x42\x3f\xb4\xc7\xaf\xef\x3a\x47"
+ "\xd0\x59\xa9\xb7\xb1\x08\xd6\x42\xb0\xce\x71\x5e\x67\xf7\xbf\x78"
+ "\x75\x74\xb6\xab\xd4\x79\x9d\x95\x7a\x5a\xeb\xcc\xde\xfa\x63\xd7"
+ "\x79\xe9\x3a\xdb\x55\x23\xac\x3f\x76\x19\x05\x9d\x95\xce\x64\x3a"
+ "\xdb\x55\xc8\x74\x16\x12\xd9\xe3\x52\x2e\x92\xd2\x00\x27\x74\x86"
+ "\xf7\x60\xfb\x19\x67\x65\x5a\xd0\x59\x13\xe6\xc1\x76\x5e\x67\x8b"
+ "\x1f\xbe\x3a\x3a\x2b\x8b\x70\x5e\x67\x65\xef\xd8\xe8\xcc\x8e\x9f"
+ "\x5c\xe6\x42\x1e\xec\xb2\x78\xc1\x4f\x2e\xab\x16\x74\x56\x4e\x98"
+ "\xce\xca\xc2\x98\xce\x1e\xca\xea\x71\x29\x9f\x49\x99\xc3\xfc\x5f"
+ "\xfd\xf9\x8d\x96\xe7\xf2\x05\xbd\x55\xa4\x5e\x3b\xbe\x63\x85\x97"
+ "\xf3\x7a\xab\x78\x76\x60\xdf\xb1\x62\xa1\x74\xbd\x55\x04\x0a\xbe"
+ "\x63\x45\xac\xa0\xb7\x8a\x1a\xa6\xb7\x0a\xe2\x9e\xef\x58\x31\xe0"
+ "\xfb\xaf\xf6\x7c\xc7\xbe\x7a\xdb\x1d\x7c\xed\xf8\x8f\x95\x5a\xe7"
+ "\xf5\xb6\x7b\xdc\xc0\xfe\xe3\x6e\x5f\xe9\x7a\xab\x6c\x16\xfc\xc7"
+ "\xdd\x2a\x41\x6f\xbb\x13\x99\xde\x2a\x6b\xdc\xf3\x1f\x77\x3b\xcc"
+ "\xff\xd6\x9f\xff\xd8\x57\x6f\xaf\xb6\x5d\x3b\x3e\xe4\xab\xa9\xce"
+ "\xeb\xed\xd5\x2f\x07\xf6\x21\x5f\x3d\x21\x5d\x6f\xaf\x16\x0a\x3e"
+ "\xe4\xab\x4d\x82\xde\x7e\x17\xc4\xf4\xf6\x6a\xa2\x7b\x3e\xe4\xab"
+ "\x06\x57\x7c\xc8\xbe\x7a\xab\xaa\xbc\x76\xfc\xc8\xaa\x60\xe7\xf5"
+ "\x56\xb5\x73\x60\x3f\xb2\xca\x85\x3d\x8b\xab\x66\x0a\x7e\x64\x55"
+ "\xbe\xa0\xb7\x2a\x1d\xd3\x5b\x55\x90\x7b\x7e\x64\xd5\x80\xf9\x3f"
+ "\xec\xf9\x91\x7d\xf5\xf6\xba\xfa\xda\xf1\x25\x5f\x93\xe0\xff\xbf"
+ "\x3e\x67\x60\x5f\xf2\x75\x17\xfc\xff\xd7\x15\x82\x2f\xf9\xba\xc8"
+ "\xff\x7f\x9d\xf7\xff\x5f\xd3\xb9\xe7\x4b\xbe\xee\x8c\xff\xdf\xc7"
+ "\x97\xec\xab\xb7\x3d\xca\x6b\xc7\x9f\xfc\x7d\xa5\xf3\x7a\xdb\x73"
+ "\xc3\xc0\xfe\xe4\xef\x5d\xd8\x07\xea\xf7\x87\x05\x7f\x72\x0f\x11"
+ "\xf4\xb6\x27\x82\xe9\xed\xf7\x25\xee\xf9\x93\x7b\x1c\xe6\x7f\xb4"
+ "\xe8\xcd\xe4\x97\xae\xa6\x76\xe2\x90\x27\x63\xa7\xf0\xb9\x09\xf7"
+ "\xea\x4c\xfe\xe9\x6a\xa9\xfb\xbb\x58\x72\x4e\x9f\x88\x25\xa4\xc5"
+ "\x63\xef\x46\xf7\xf2\x4e\xef\x1d\xe7\x7e\xde\xe9\x37\x2e\x0f\xde"
+ "\xfe\x2e\x6f\x9c\x91\x9e\x77\xfa\x8d\x3d\x82\x0f\xfa\x46\xbb\xa0"
+ "\xeb\x3f\x70\xcf\x27\x48\xcb\x47\xfd\x46\xbc\x7b\xf9\xa8\xf7\x3e"
+ "\xcb\xf0\xf5\xc6\x78\x96\x8f\x7a\x6f\xec\xd0\xec\xfb\xb2\xa7\x09"
+ "\xf3\x51\xd3\xdc\x87\xf7\xb9\x96\x1f\x79\x6f\xbb\x13\x78\x6e\xa2"
+ "\x76\x62\xb4\x02\x9e\xf7\x57\x03\x9e\x9b\xa4\xee\x33\x63\x8d\xe7"
+ "\xfd\x8f\xb9\x87\xe7\x7d\x5d\xee\xe3\x79\xdf\xf1\xc1\xdb\x67\x66"
+ "\xdf\x7e\xe9\x78\xde\x97\x2a\xf8\xe6\xfb\x0e\x0b\x78\xde\xaf\x97"
+ "\x8e\xe7\x7d\x53\xdd\xc3\xf3\xfe\x87\x18\x9e\xff\x60\x64\x78\xde"
+ "\x3f\x65\x68\xf6\x9f\xf9\xc3\x1e\x86\xe7\x50\x83\x6b\xf9\xa7\xf7"
+ "\x1f\x1e\x18\xcf\x19\x6a\x6a\x27\x7e\x2d\xe0\xb9\x3a\xcb\xe4\x9f"
+ "\xa1\x96\xba\xdf\x8d\x35\x9e\xab\x6f\x76\x0f\xcf\x07\x4e\xb8\x8f"
+ "\xe7\x03\x45\x83\xb7\xdf\xcd\x81\x0c\xe9\x78\x3e\x10\x26\xac\x59"
+ "\x0e\xe4\x08\x78\xae\xd6\x4a\xc7\xf3\x01\x6f\xf7\xf0\x5c\xed\xcb"
+ "\xf0\xfc\x66\x1d\xc3\x73\xb5\xd7\xd0\xec\x83\xf3\x66\x2a\xc3\xf3"
+ "\xa3\x53\x5d\xcb\xef\x5d\xed\x30\xff\xb1\x08\xcf\x4d\xd4\x4e\x6c"
+ "\x5f\xc0\xf3\x1f\x23\x00\xcf\x4d\x52\xf7\xdd\xb1\xc6\xf3\xdb\x6e"
+ "\xee\x73\xf1\xf6\x20\xec\x73\xf1\xb6\x1b\xfb\x5c\xd8\xee\xbb\xf3"
+ "\xf6\x2c\xe9\x78\x7e\x3b\x40\x58\xcb\xbd\x1d\x25\xe0\xf9\x8f\xf9"
+ "\xd2\xf1\xfc\x56\xb3\x7b\x78\x7e\x9b\xdf\xff\xe2\xad\x52\x86\xe7"
+ "\xb7\x9b\x86\x66\x3f\x9e\xb7\xc2\x18\x9e\x1f\xdb\xe2\x5a\xfe\xf4"
+ "\x3f\x46\x0d\x8c\x67\x8d\x9a\xda\xb9\xef\x21\xe0\xf9\x4f\x2a\x93"
+ "\xbf\x46\x2d\x75\xff\x1f\x6b\x3c\x1f\x7a\xc7\x3d\x3c\x1f\x8a\x73"
+ "\x1f\xcf\x87\xee\x1b\xbc\xfd\x7f\x0e\xdd\x2a\x1d\xcf\x07\xdb\x84"
+ "\x35\xee\x21\xd1\xfd\xff\x3f\x45\x4b\xc7\xf3\x41\x37\xf7\x05\x3a"
+ "\xf4\x16\xc3\xf3\x41\x7e\x5f\xa0\x43\x7b\x86\x66\x5f\xa0\x83\x01"
+ "\x0c\xcf\x4f\xd4\xb9\x96\x9f\xfe\x4f\xe3\x9d\xc0\x73\x13\xb5\x73"
+ "\x4f\x48\xc0\x73\x8d\x1e\xf0\xdc\x24\x75\x1f\x22\x6b\x3c\xd7\x6c"
+ "\x73\x0f\xcf\x35\x0f\xb8\x8f\xe7\x1a\xcf\xc1\xdb\x87\xe8\xcf\xe7"
+ "\xa5\xe3\xf9\xcf\x96\xfb\x7f\x60\x9f\xff\x2c\xba\xff\xf7\x8e\x0b"
+ "\xfb\x13\xfd\x39\xdd\x3d\x3c\xd7\x6c\x66\x78\xfe\xf3\x54\x86\xe7"
+ "\x9a\xd4\xa1\xd9\x9f\xe8\x4f\x6d\x0c\xcf\xb3\xfd\x5c\xcb\xff\x5f"
+ "\x33\xe0\xf3\x1f\xf6\xe2\x1b\x96\xb8\x94\x80\xe9\xbf\x1e\x73\x3f"
+ "\xc6\xf1\xd7\x25\xee\x61\xfa\xaf\xc3\xdd\xc7\xf4\x5f\x3e\x1f\xbc"
+ "\x18\xc7\x5f\x5c\xd8\xeb\xef\x2f\x39\x42\x8c\xe3\x2f\x8d\x02\xa6"
+ "\x0f\x2b\xa4\x63\xfa\x2f\x11\xee\x61\xfa\xaf\xf3\x18\xa6\xff\xa2"
+ "\x64\x98\xfe\xeb\xcc\xa1\x89\x71\xbc\x73\xd8\xbd\x18\xc7\x5f\x1b"
+ "\x5d\x89\x71\xf4\xc5\xf4\xbb\x25\xee\xc7\x39\xde\x9d\xe4\x1e\xa6"
+ "\x8f\x7c\xe9\x3e\xa6\x8f\xec\x1f\xbc\x38\xc7\x91\x22\xe9\x98\x3e"
+ "\x12\x2d\xc4\x39\x8e\x54\x09\x98\x7e\xb7\x49\x3a\xa6\x8f\x04\xba"
+ "\x87\xe9\x77\xc7\x31\x4c\x1f\x6e\x65\x98\x7e\x57\x35\x34\x71\x8e"
+ "\xc3\xf9\xee\xc5\x39\xde\xad\x72\x25\xce\xd1\x17\xd3\xef\xc7\xbb"
+ "\x1f\xeb\x78\xdf\xd3\x3d\x4c\x6b\x0f\xb9\x8f\x69\xed\xe6\xc1\x8b"
+ "\x75\x68\xe3\xa4\x63\x5a\x3b\x59\x88\x75\x68\x53\x05\x4c\xbf\xbf"
+ "\x4f\x3a\xa6\xdf\xeb\x74\x0f\xd3\x5a\x13\xc3\xf4\x7b\x35\x0c\xd3"
+ "\x5a\xc3\xd0\xc4\x3a\xde\x8b\x71\x2f\xd6\xf1\x7e\xaa\x2b\xb1\x8e"
+ "\xbe\x98\x3e\x16\xe2\x7e\xbc\xe3\xe8\xe7\xee\x61\xfa\xe8\x36\xf7"
+ "\x31\x7d\x74\xde\xe0\xc5\x3b\x8e\x4e\x93\x8e\xe9\xa3\xa2\xfd\x2f"
+ "\x8e\x8a\xde\xff\x3f\x96\x25\x1d\xd3\x7f\xab\x73\x0f\xd3\x47\x3f"
+ "\x66\x98\xfe\x5b\x0e\xc3\xf4\xd1\xda\xa1\x89\x77\xfc\x6d\x8a\x7b"
+ "\xf1\x8e\x63\x03\xe6\xbf\xb0\x17\xef\xe8\x8b\xe9\xbf\xfb\xb9\x1f"
+ "\xf3\xf8\x60\xbf\x7b\x98\xfe\x60\x89\xfb\x98\xfe\x60\xdc\xe0\xc5"
+ "\x3c\x3e\xf0\x95\x8e\xe9\xe3\xcd\x42\xcc\xe3\x03\xd1\xf3\x4f\x7f"
+ "\x8f\x94\x8e\xe9\xe3\x95\xee\x61\xfa\x83\xd7\x18\xa6\x8f\x47\x33"
+ "\x4c\x7f\x50\x3a\x34\x31\x8f\xe3\xde\xee\xc5\x3c\xfe\xae\x72\x25"
+ "\xe6\xd1\x17\xd3\x27\xda\xdc\x8f\x7b\x9c\xd8\xec\x1e\xa6\x4f\x4c"
+ "\x72\x1f\xd3\xb5\xa6\xc1\x8b\x7b\xd4\x7e\x25\x1d\xd3\xb5\xd5\x42"
+ "\xdc\xa3\x56\x94\xff\xfe\xc3\x20\xe9\x98\xae\x4d\x71\x0f\xd3\x27"
+ "\x36\x32\x4c\xd7\x4e\x66\x98\x3e\x91\x38\x34\x71\x8f\xbf\xeb\xdc"
+ "\x8b\x7b\x9c\xe8\xf3\xfc\x5b\xf2\xca\x84\x18\xd5\xda\x55\xab\x92"
+ "\x57\xa6\xa8\x92\xe3\xe3\x9e\x5a\x39\x6d\xac\xe5\xf7\xb4\xe0\xd4"
+ "\xb1\xa9\xc3\x48\xcc\x9a\xe5\xcb\xd6\xdf\x23\x9c\x8c\x5f\x99\x00"
+ "\x7f\x86\x91\xd8\xe5\xc9\xb1\xaa\x94\x8d\x89\x2b\x55\xf8\x6b\xcd"
+ "\x53\x89\x40\xb2\x36\x45\x28\x99\xbb\x32\x7e\x79\x6a\x5c\xc2\xd3"
+ "\xaa\xe5\xf1\x71\x4f\x27\xac\x59\x99\x90\xa2\x4a\x5a\xf9\xec\xba"
+ "\xb8\xa4\x95\xf8\x3d\x59\xb5\x6a\x6d\x12\x14\x3c\xb5\x32\x6e\xfd"
+ "\x4a\xd5\x8a\x75\xab\x56\xad\x4c\x4a\x1e\x46\x66\xad\x8b\x4f\x89"
+ "\x4b\x8c\x5f\xa9\x0a\x9d\xf5\xd0\xdd\x91\x33\x9e\x8c\x7c\xf0\xc1"
+ "\x61\x44\xb4\xf7\xb4\x8a\x16\x56\x44\x03\x86\x14\x67\x3d\x3e\x7b"
+ "\xbf\x3e\x80\x90\xed\x80\xcd\xbc\x24\xa2\xdc\x96\x44\x14\x5b\x2f"
+ "\x12\xaf\xed\x17\x89\xb7\xea\x19\x12\x42\x7d\x0f\x69\xf3\x2e\x12"
+ "\x3f\x3a\xea\xe1\x26\xba\xe3\x02\xa1\xbe\x17\x43\xf4\xbe\x9f\xe9"
+ "\xa1\x4c\x49\x77\x7c\xa6\xc2\x73\xa0\x0b\xcc\x71\xb0\xa7\xc5\xe3"
+ "\xb3\x2c\xbd\xef\x3f\x1a\x33\xbf\x21\x72\x3a\xe2\xa3\xc8\x37\xcd"
+ "\x7a\xf9\xfb\xb8\x53\x09\xc8\x8a\x78\xd4\xc5\xc3\xa1\x26\x1e\x27"
+ "\xbd\xe0\x08\x80\x23\x1a\x8e\xad\x70\xe4\xc3\x61\x24\x1e\xf5\xa1"
+ "\x70\xa4\xc0\x01\x65\xf5\xa5\x70\xec\x81\xa3\x9a\x78\x34\x40\x79"
+ "\x43\x0c\x1c\x70\xae\x21\x87\xf1\x69\x28\x24\x1e\x8d\x7e\x70\x44"
+ "\xc1\x01\xd7\x7f\x0c\xe5\x1f\xd7\x10\x8f\x4f\x80\xee\xe3\x26\x38"
+ "\x0c\x70\x00\xcf\x4f\x54\x70\xe0\xf5\x25\xec\xdc\xa7\x4a\x38\x66"
+ "\xc2\x01\x3c\x3e\x85\x7a\x3e\x3d\x0c\x47\x23\x1c\xcd\x70\xb4\x12"
+ "\x8f\x53\xd0\xb6\x53\x40\x73\x2a\x10\x0e\x68\xc3\xa9\x2a\x38\x6a"
+ "\x89\xc7\x69\xe0\x73\x1a\xea\x38\xad\x23\xd0\x47\xfe\x08\x82\x23"
+ "\x4a\xf4\x3b\x55\xf4\xdd\xde\x51\xe2\xb3\xf9\x76\x9d\xf6\x2e\x23"
+ "\x8c\xdb\xba\x13\xa6\x6c\xe2\x61\xda\xf1\x8f\xc6\xc4\xbb\x88\xec"
+ "\x9c\x47\x5d\x51\xc3\x16\x42\xa8\xf2\x02\xd1\xa6\x75\xe3\xf9\x22"
+ "\x94\x59\x47\x6e\x5d\xa1\x8e\xbc\x59\x82\xe3\x53\x1a\x3e\xeb\x0a"
+ "\xf9\xeb\x4f\xe9\x64\x8f\x57\xe3\xf5\xb4\x20\x6d\x34\xcd\x54\xef"
+ "\xc2\xf7\x70\xcf\xa2\x0c\x71\xdc\xe4\x6f\x4c\xa1\xca\x64\x03\xda"
+ "\x18\x6d\x1a\xd7\xae\x35\x30\xde\x46\xc0\xf5\xf1\x14\xf4\xa8\xf7"
+ "\x07\x9d\x67\x13\x05\xf7\x7b\xc7\x67\x7a\x5a\xb9\x37\x8c\xd9\x9d"
+ "\x93\xdc\xfa\xa5\xcb\xff\xe5\x7c\x3c\xd7\xf9\x5a\x7c\x08\xad\xd2"
+ "\x34\x69\x13\xba\x49\xab\xc7\xc9\x85\x60\xff\xe4\xf4\xce\xf8\x10"
+ "\x73\xf1\xcb\xf9\x35\x80\x01\xa4\x79\x47\xd3\x86\x7f\x63\xa1\xdf"
+ "\x72\x5a\x58\xa8\xc6\x18\x90\x56\x53\x00\x36\xb9\x6e\x4d\x97\xff"
+ "\xde\x60\xd5\xe3\x3e\xb4\x05\xeb\x91\x63\xbe\xf5\x93\x84\xd9\x85"
+ "\xba\xf8\x2e\xff\x87\x75\xc8\xdb\x54\xb9\x57\x0f\xe7\x14\x14\xb0"
+ "\x07\x6d\x90\x5d\x80\xeb\x4c\x45\x0f\x37\x69\x1f\xe7\xea\xbc\x0c"
+ "\xed\x94\x67\x3e\x06\xbc\x5f\xdd\xab\x3f\x90\xd6\x29\xa7\xd8\x76"
+ "\xbf\x87\x9b\x00\xeb\xde\xa6\xdc\x0f\x27\xef\x1c\x49\x14\x65\x05"
+ "\x84\x54\x8c\x24\x5e\x1d\xb9\x27\xdb\x75\x8a\xa8\x76\x66\xf7\xea"
+ "\xe2\xe5\x40\x03\x75\xd6\x52\xd0\x07\x57\x57\x61\x6e\xa3\xe3\xba"
+ "\xea\xa7\xf5\xd6\x55\x9c\xdb\x88\x75\x71\xf2\x61\xb2\x62\xdf\x2d"
+ "\x7c\xaa\xe2\xfb\x69\x73\xfd\x03\xc8\x43\xe7\x51\x3f\x9e\xbe\x1e"
+ "\xaf\x37\x15\x17\xe9\xf1\x1c\xd2\x33\xf9\x7f\xa6\xf7\xd9\x4c\x0c"
+ "\x14\xca\x4c\xbc\x0e\x4c\xa8\x03\x79\x16\xd8\xaf\x93\xde\x58\x1f"
+ "\x5c\x9b\x6a\xca\x56\x11\xd5\xe3\x84\xb4\x7b\x34\x70\xb1\x09\xaa"
+ "\x4c\x6b\x67\x3a\xae\xff\x38\xb5\x96\x9a\xe1\x30\x4d\xac\x25\x32"
+ "\xed\xe3\xa8\xdf\x7a\xbd\xea\x91\xeb\x41\xce\xf5\xdf\xf7\xca\x77"
+ "\xcc\xde\x36\x90\x91\x12\xe4\xe2\x6d\x7a\x61\xba\x96\xca\x55\x04"
+ "\xfb\x21\x96\x17\xf6\xa7\x23\xb7\x41\x65\x23\x33\xe5\x63\x8f\x65"
+ "\x52\x11\xef\x6f\xc4\xfd\x07\xfa\x08\x9d\x6c\x7a\x27\xd2\xab\xee"
+ "\xe0\x30\xb7\xc6\xc4\x9f\x47\xdc\xa3\x9e\xa9\x7f\x45\x34\xfe\x9e"
+ "\x37\x8e\x28\x7d\x6a\x89\x5c\xa5\x09\xac\x61\x78\x28\x54\x43\xdf"
+ "\xa6\x32\x7e\xd0\xc7\xe2\xac\x3d\x70\x6d\x90\x80\xbf\x86\x3a\xd3"
+ "\x8e\xb4\xd6\x2e\xff\x22\x65\x67\xd1\xf6\x46\x9a\x9f\xd6\x8a\xef"
+ "\x9f\xb7\x78\x34\x1c\xe7\x64\x90\xed\x45\x58\x3b\xd2\xda\x34\xf1"
+ "\x54\xaf\xf9\x1e\xea\x1a\x55\xa4\x7c\x67\xbd\x1e\x74\xb6\xbd\x11"
+ "\x31\x51\x73\xa5\x53\x8e\x39\x01\xe9\x88\x0f\xe7\x97\xb3\xbe\x7a"
+ "\x41\x5f\x09\xf2\xed\xc8\x6d\xf4\x16\xfa\xda\x50\x8d\xf8\x80\x3a"
+ "\x8c\xac\x6e\xe0\x9b\x0d\x75\xec\x48\x33\x02\xdd\x64\x9d\x4c\x1f"
+ "\xca\x8d\xaf\xf5\xf4\x54\x5e\x37\x21\x97\xd6\x53\x63\xb8\xf1\x0b"
+ "\x33\xcc\xcb\x04\xce\x47\xea\xc8\xe2\x4a\x8b\xcc\xd8\x98\xeb\xe5"
+ "\xc3\xe5\x8a\xd0\xfb\x72\x7c\xd2\xed\xf1\xd1\x79\x34\x86\x2e\x33"
+ "\xaa\x64\xdd\x57\x68\x63\xde\x7c\x68\x5b\x36\xa1\xdd\xeb\x69\x5d"
+ "\x46\x18\xed\xcc\xfd\x84\x80\x6f\xd4\x4c\xc0\xd6\x8e\x1e\x21\xa3"
+ "\xfa\xf0\x8d\xc4\x67\x44\xa2\x0f\x3d\x51\xdb\x4c\x36\x85\xd1\xb6"
+ "\x86\x54\x13\xa9\x37\xb4\x92\xf4\xcf\x89\x77\xe6\x49\xe2\x97\x1e"
+ "\x46\xf5\x75\xd1\xcd\x84\x95\x9f\x24\x99\x5f\x12\xc5\xa6\x63\xb4"
+ "\x73\x36\xcc\xd3\x1f\x35\x63\x79\x2b\x94\x9b\x48\x66\x1b\x35\x6a"
+ "\x96\x10\x6f\xfc\x7e\xf2\x18\x96\x7f\x45\x60\x3c\x2b\xc2\x53\xf5"
+ "\x3e\xe5\x50\x27\x5e\x5f\x01\x6d\x31\x5f\xa1\x87\xf3\xae\x10\xb2"
+ "\x69\x21\x09\x48\x5f\x4e\x94\xe1\xe0\x2e\x34\x18\x0f\x91\x70\x13"
+ "\x05\x3f\xe0\x38\xc9\x88\x23\x5e\xe1\x46\x7c\x7f\xfc\x34\x1c\x65"
+ "\xa4\x02\x68\xa1\x6f\x5a\xec\xdb\xa6\x33\xe0\x17\x9d\xb7\x5c\x73"
+ "\x84\xbf\xe6\x0c\x41\x99\x75\xf9\x5e\x0c\xee\xdc\x71\xb1\x1a\xfa"
+ "\x1e\x86\x32\x80\x7a\x1a\xcd\x78\xdd\x15\x6e\x7e\x42\x19\xc8\x96"
+ "\x19\x01\xab\x45\x39\xd5\xcb\x52\xb5\x1c\x5f\x9d\xc7\xc7\x5b\x2a"
+ "\x92\xb8\x36\x59\xd1\x86\x1b\xe9\x25\xbd\x7f\x0e\xf0\xfa\x78\x5f"
+ "\x78\xea\x83\x94\xd7\x5b\x67\x47\xee\xc7\xed\x16\x79\x5b\xf4\x02"
+ "\x34\x3a\xd0\x45\xa7\x47\x22\x51\x74\xe4\x7e\xe2\xad\x93\x5d\x52"
+ "\x89\xb0\x8b\x76\xeb\x3a\x0b\x2d\x4f\x13\xac\x93\x7d\x1f\x2b\xd0"
+ "\x9c\x24\x80\xe9\x5e\x1a\x38\x0f\xf8\xbf\x98\x28\x9c\xe7\xf0\xdc"
+ "\x7b\x9e\x9f\x7f\x2d\xbc\x3d\xc0\x0e\xd7\x9a\xfc\x0b\xa3\xa9\xff"
+ "\xf4\x44\x7a\x29\xc0\x9b\xca\x41\x37\x46\xda\x69\x2e\xca\xac\x86"
+ "\x39\xd6\xbb\xc1\x68\x20\x8c\xfe\x93\xcb\xb4\x68\x7a\x2a\x7b\xe6"
+ "\xf5\x93\x33\xc8\x13\x7c\x31\x25\xcc\xd7\xca\xf0\x5a\xda\x89\xf6"
+ "\xc3\x54\xf4\x84\x3e\x37\x09\xe6\xec\xa2\xc2\x08\xb3\x7f\x5e\x74"
+ "\xe7\xee\xbd\x21\x38\x27\xe0\x78\xa3\x85\x70\x2d\xcf\x07\xea\xf5"
+ "\xd4\x79\x7c\x72\xd0\x04\xd7\xd3\xc2\xcc\x6a\x56\xce\xec\x1b\xb3"
+ "\x43\x9f\x1c\xa4\x63\xe1\x5c\x7e\x72\x1d\x9c\xf3\x6c\xf1\xf8\x34"
+ "\x04\xca\x09\xcd\x4f\x51\x68\x35\x17\x81\xf6\xd3\x19\x0c\xd3\xc9"
+ "\xb5\x56\xbf\xe5\x28\xcf\xfa\x7c\xb4\x51\x68\x9b\xa0\x7c\xa5\x60"
+ "\x27\xd8\x1c\xc0\x6c\x7b\xa6\xb6\x23\xf7\xd3\x54\x9d\x6c\xf6\x78"
+ "\x94\x13\xea\xd6\xc0\xec\x5a\xba\x69\xf7\xde\xb0\xa3\x61\x84\x1c"
+ "\x3d\x86\xe3\xe8\xd3\x52\x9d\x2c\x22\x44\x90\xe5\xa7\x87\x90\x96"
+ "\x6b\x27\xd8\x12\xfc\xce\xd9\x15\xb8\x06\xc6\x39\xda\x2f\x05\xb3"
+ "\x8f\x9f\x56\xe3\xbc\x05\xf6\x24\x96\x9f\xa7\x6a\x81\x77\x25\x1d"
+ "\xf9\x66\x1b\xb4\x2b\xab\x85\x6f\x8b\xb8\x6d\x16\xbb\x48\x77\x1c"
+ "\x88\x65\xb4\x9b\xa0\xfe\x53\xa3\x75\xb2\x39\x01\x62\xbc\xb0\x7e"
+ "\x9d\x7a\x1e\x30\xdd\x34\xf1\x18\xfc\x06\x5f\xca\xc2\x0f\xec\x8b"
+ "\x17\xd8\x95\x04\xc4\x1b\xda\x94\x92\x02\xf4\x8f\x0e\x24\x76\xee"
+ "\x38\x90\x0a\xbc\x62\x2d\xb6\x05\xaf\xc5\xf1\x00\xf6\xc5\x8b\xb3"
+ "\x1b\x26\xa3\x07\x37\xe6\x4d\x64\x7c\xaf\x2d\x81\xb2\x2e\xdf\x03"
+ "\x89\x7c\xb9\x82\x6b\x93\xdc\xc3\x0c\xf5\xcb\x2c\xf5\x75\xf9\xa6"
+ "\xe9\x81\xaf\x56\x27\xfb\x75\xa0\x95\xad\x29\x48\x8c\xa6\x54\x8d"
+ "\xb8\xf1\x80\xb6\x7e\x05\x7f\xaf\xe7\x71\x7a\xe3\xd1\x5a\x42\x42"
+ "\x41\x5b\x97\x40\x9f\x3b\x47\x51\xb8\xfe\x34\xd1\x91\xad\x55\x78"
+ "\xfd\x36\xf8\x8d\xe5\x48\x03\xe5\x01\x3a\xb2\xad\x90\xf1\x3d\xe9"
+ "\x8d\xfa\xb1\xe6\x7b\x7a\x06\xe3\x7b\xfa\x31\xe4\xc7\xcf\xf1\x37"
+ "\xe2\x77\xbc\x1e\x79\x97\x15\xd3\x76\xe4\x07\xbc\x62\x2c\x75\x6c"
+ "\x87\x32\x4b\x3d\xa1\x6b\x7a\xeb\xda\x02\x75\x8d\x16\xf7\xa1\xa4"
+ "\x98\x1a\xf8\xf6\x55\xea\x48\x59\x2d\x9e\xdb\x0a\x65\x78\x2d\xc3"
+ "\xc2\xe9\x23\x88\x13\x1d\xeb\x97\x07\xc3\xcb\xe9\x3a\x1d\x29\x8d"
+ "\x10\xcf\x3d\xa0\x8b\xe1\x96\xb9\x89\xe7\xa7\xb7\xf0\x13\x78\x31"
+ "\x1e\x34\xbf\x3a\x96\x1f\x0b\x38\x66\xbd\x91\x7f\x47\xee\x67\x2a"
+ "\x1d\x79\xa9\x8a\xb5\xad\x3e\xdf\xc0\xb0\x0d\x3a\xe0\xae\x61\x3a"
+ "\xcf\xfd\x30\x1d\xe7\xcd\x8a\x02\xb4\x63\x69\xed\x70\x4d\xa4\xcd"
+ "\x9c\xe9\x05\xe5\xcd\x3c\xbf\x44\x9d\x6c\x5a\xab\xb5\x0d\xc2\xb9"
+ "\xae\x30\x0b\x71\xc3\xdb\x86\x22\x6c\xaf\xe5\x3c\xd4\xa1\x80\x3a"
+ "\x72\x11\xef\x58\x87\xa9\x68\x7b\x08\xf0\xa9\xb1\xa9\x43\x81\x74"
+ "\xe0\xf3\x1c\xc5\xf9\xfb\xe5\x51\xb4\x0d\x68\x9a\x2d\x34\x78\x1e"
+ "\x64\xfe\x6b\x28\x83\xfe\xef\x8b\xc7\xb2\x5c\xa0\x81\xf5\x9f\xc3"
+ "\x77\x7a\x34\x63\x88\xbc\xa1\x54\x87\xeb\x5d\x1c\xdb\x53\x1b\x46"
+ "\x1b\x48\x43\xa9\x99\x98\x5f\x5f\x93\x18\xa2\xa1\xda\xb3\x1e\xff"
+ "\x58\x53\xdf\xd9\x46\xa4\xf9\xa8\xff\xe0\xf2\xff\xd0\x6e\x58\x97"
+ "\xa5\xdf\x43\xd0\x67\xb9\xe0\xd1\x54\xd6\xa0\xbf\xc8\xd9\x39\xf8"
+ "\xbe\x0d\xcf\xbf\x0c\xeb\x38\x5c\xcb\xc1\x7a\x3d\x36\x5f\xce\xd6"
+ "\x73\x66\xa0\x2d\xc7\x72\x5c\xeb\xc1\xfc\x55\x21\x3a\x47\x5f\x5f"
+ "\xad\x67\xb2\x6b\x9a\xc7\xd9\x7b\x6c\xaf\xf1\x51\x2d\xb6\xd9\x5c"
+ "\xb5\x5a\x8f\x7d\xc8\x4c\xa5\xe6\x06\x63\x87\x16\xe7\x38\xd5\x7a"
+ "\x5c\x87\x36\x4d\x0a\x2f\x23\xd4\xfc\xda\x6a\xbd\xc4\x3e\x70\xf7"
+ "\xbf\x61\xad\x7e\x41\x3f\x76\xb5\x3e\xd3\x44\xe4\x79\x1a\x4f\xaf"
+ "\xe9\xa5\x54\x7b\xe9\xce\x35\x89\x1d\xb9\x4d\x91\x18\xa5\x96\xee"
+ "\xbf\x37\x45\x5a\xfa\x5e\xce\xf7\x1d\xea\x3a\x88\x65\x13\x4b\xb2"
+ "\xb8\xfe\x02\x8d\xc3\x67\xfd\x68\xb6\x0f\x3d\x5a\x6a\x24\xc9\xa5"
+ "\xb4\x3b\xb9\x8c\xc8\x4d\xc5\x9b\x83\x0f\x94\x37\xa1\x4d\x0f\xb1"
+ "\xc8\x93\x93\x9d\x51\x4f\x12\x35\x44\x79\xce\xe3\xf3\xfb\xc2\xd3"
+ "\xb3\xb8\x7d\x9d\xde\x03\x3a\x69\x6d\xfd\x9c\xf3\xd5\xeb\x61\xed"
+ "\x1f\x6e\xcc\xa4\x6c\x5e\xfa\x7c\xc9\x6c\x9e\x1f\x9e\xb3\xe8\xaf"
+ "\x9c\x5f\x93\xbb\x50\x87\xc3\xf7\x5f\xfa\xe9\xab\xd2\x7e\x5f\xff"
+ "\x39\xc6\x8d\xbe\xb6\xf7\xed\xeb\x3f\x1f\x1b\xdc\xbe\xfe\x33\xc2"
+ "\x85\xbe\xaa\xec\xf7\xf5\x5f\xc3\x5d\xef\xeb\x3f\x9b\xfa\xf6\xf5"
+ "\x5f\xf7\x0d\x6e\x5f\xff\xe5\xf0\xfd\xcf\x7e\xfa\x1a\xec\xa0\xaf"
+ "\x5d\xae\xf7\xf5\x5f\xc7\xfa\xf6\xb5\x79\xcc\xe0\xf6\xb5\x39\xc8"
+ "\x61\x5f\xe5\x3e\x14\xed\x13\xd8\xa5\x6e\x4d\x17\xf8\x73\xc5\xbf"
+ "\x25\x19\xbb\x89\xbc\xce\xd0\x49\xea\x47\x37\x91\xcc\x8d\x44\x3e"
+ "\x21\x11\xec\x5e\x36\x99\x4a\x8b\x1f\xd6\xd7\x97\xb6\x43\xf9\x59"
+ "\x72\x32\xb5\x93\x84\x24\xa1\xfd\x6d\x3e\xdf\x10\x23\xd5\xfe\x36"
+ "\xd7\xf4\xda\x5f\xe3\x3d\xbc\xcd\xfd\xf7\xcd\xf5\xed\xdd\x04\xfb"
+ "\x0f\xdf\x3d\x7b\xed\x6f\x36\x93\xb7\xad\xfd\x45\x79\x34\x74\x76"
+ "\x5a\xd9\x5f\xf6\x6e\xd7\x99\x8f\x6d\x6d\x6f\xee\x39\x42\xec\xdb"
+ "\xde\x33\xfb\xd1\xf6\x96\xc3\x79\x69\xed\x3f\x93\x6a\xb1\xbd\xf9"
+ "\x50\xa7\xd8\xf6\x1e\x8d\xc1\xf9\xf5\x4c\xa3\x6b\xb6\xf7\x4c\xa3"
+ "\xa5\xdf\x65\x7c\xbf\xa1\x6c\xb2\xb5\xed\xfd\xb7\x97\x33\xb8\xa5"
+ "\xc5\xe9\xca\x03\xb7\x75\x7a\x9a\xab\x12\x82\x71\x7e\xeb\x00\x99"
+ "\xfc\xb9\xbc\x53\x71\xd6\xe3\xdf\x6c\xaf\x8e\x8e\x18\x19\xad\x8a"
+ "\x6f\x0a\x4f\xa1\x5f\xd0\xb1\x09\xc1\x18\x5f\xc5\x38\x01\x9c\x3f"
+ "\x02\x3e\x7d\x93\xb4\x76\x33\x9e\x30\xff\x25\x6a\x60\xbc\x1c\x58"
+ "\xdf\x29\x37\x6f\x52\xfb\x80\x1e\x94\xb4\x28\x2b\x82\xbe\xf0\x64"
+ "\xfe\xa5\xa2\x22\xed\xf1\xa0\xaf\x08\xd2\xd2\xcd\x8a\x10\xd7\xdb"
+ "\xff\x45\x58\xff\xed\xff\x22\x43\x7a\xfb\x19\x4f\xe7\xda\xff\x45"
+ "\x98\x53\xed\x1f\x05\xed\xef\x9e\xe2\x09\xeb\x45\xf9\x7b\xdd\x53"
+ "\x14\x12\xdb\xd3\xe4\x94\x8e\xdd\xaa\x43\xe7\xb4\xfd\xa3\xa3\xb6"
+ "\x47\x1c\x28\xd7\xcb\xc1\x06\x70\x73\x38\x8e\x3d\x66\xff\xda\xc0"
+ "\x66\x7d\x41\x99\x4d\xd2\x4b\xb4\x49\x3a\x87\xef\xbf\xf4\xad\x7f"
+ "\x73\xf5\xe0\xd7\xff\xa5\xe3\xfe\xdb\xda\xc4\x37\x33\x23\x1c\xdb"
+ "\xc4\xac\xea\xbe\x36\xb1\x45\x26\xdd\x26\x7e\x59\xd7\xd7\x26\xfe"
+ "\xe7\x6e\xc1\x26\xfe\xe7\x66\xd7\x6d\x62\xcb\x57\xce\xdb\xc4\x96"
+ "\xf7\x5d\xb3\x89\x2d\x39\xfd\xdb\xc4\x96\x56\xd7\x6c\x62\x4b\x6b"
+ "\x5f\x9b\xd8\x12\x66\x6d\x13\xff\xe3\xf0\x5d\x57\x9a\x1f\x1d\x04"
+ "\x73\xb4\xf7\x39\x8f\xff\xb4\x1b\xb3\x09\x31\xe7\xff\xab\x2d\xdc"
+ "\x44\x3b\xe8\x8e\xe8\x20\xb3\x7c\x32\xda\x95\x90\x8e\x8e\x58\x2f"
+ "\xf3\x86\x20\x6f\x3a\x32\x39\x89\xf6\x04\xe0\x9a\x2a\x10\xda\xef"
+ "\x43\x3b\x82\x46\xd0\x0d\x41\x23\x4b\xaf\x10\x3f\x38\x02\x4a\xf9"
+ "\xf9\x18\xbe\x07\xd3\x0d\x01\xc3\x72\xd7\x93\xf1\x3e\x06\xe2\x05"
+ "\x6d\x50\xfb\x6c\x56\x12\xb0\x41\x7e\xf8\x9d\x66\x7f\x11\x54\x71"
+ "\x85\x28\x7c\x52\x41\x37\xbe\x50\x5f\xaa\x0f\xa5\xc9\x41\xa4\x22"
+ "\x89\x78\x99\xe5\x24\xa0\x5c\x4e\xab\x8d\x1d\x41\x72\x93\x5f\x61"
+ "\x22\xd3\x4f\x6b\x25\x1d\x05\x6b\xaf\xc2\xc2\xa9\xe6\x51\x85\x81"
+ "\xa6\xcc\x58\x0f\xba\x49\xed\x81\x6d\x35\x15\x16\xaa\x68\x31\x1c"
+ "\x99\xb1\x23\xd0\x87\xae\x58\x0f\x75\x77\x04\x0c\xcb\x83\xba\xcb"
+ "\xd7\x93\xc0\xb2\x2b\x24\x88\x5e\x0a\x92\x83\xfe\xd5\xb8\x3f\x2a"
+ "\xc8\x48\x6d\x96\x7f\x11\x04\xe7\x14\x68\x13\x29\xd6\x6f\x84\xfa"
+ "\x7b\x82\x30\xc6\x05\xd8\x26\x01\x15\x50\xbf\x69\x43\x90\xc4\xf1"
+ "\xd2\xca\xd6\xf5\x7c\xbb\xcc\xe3\x7f\x13\x41\xdf\x84\x03\xdb\x05"
+ "\x32\xac\x40\x99\x4c\xf8\x4d\x24\xb6\x6d\xfb\x15\x32\x1e\xda\x19"
+ "\x08\x6d\x08\x82\x7a\x31\xb7\x8c\x7a\xe9\xb3\x4a\xc4\xa8\x55\xdb"
+ "\x4c\x3b\xf8\xb6\x7d\x07\x6d\xbb\x20\xb4\x0d\xeb\x42\xf9\x38\xba"
+ "\x6f\x1b\x9e\x71\x1b\x8e\xcd\xaf\x7d\x52\xaf\x0f\xc3\x7b\xb8\x97"
+ "\x36\xc5\x4a\xc4\xea\x57\x53\x1c\xe1\x25\xef\x4d\x32\x9a\x2a\x4f"
+ "\xb7\xcd\x7e\xfe\x0b\x8a\x31\xc4\xe7\xdf\x24\xe3\x1b\x60\x5c\xd7"
+ "\x77\x9e\x27\xd4\xf7\x74\xdb\xf1\xa0\x76\xa9\x75\x39\x7c\xfe\xed"
+ "\xc5\x6c\xda\xd8\x13\x88\xf1\xaf\xa2\x9a\x3c\x39\x4d\xed\x0e\x8c"
+ "\xd7\x7d\x78\xaa\x9b\x2c\x4b\xc5\xfb\xc4\x34\x55\xb5\x88\x78\xb5"
+ "\x78\xb4\xab\x33\x3f\xc7\x7b\x5a\x67\x83\xac\xef\x69\x9d\x9d\x49"
+ "\x3c\xbe\xd6\x13\x8f\x6f\x54\xc4\xe3\xdc\x1e\x02\x74\xd6\xc7\xb7"
+ "\xba\xf0\x37\x6e\x23\x1a\x23\xfd\x9a\x16\x86\x06\xe5\xca\x69\x67"
+ "\xf8\x38\x99\x4e\xbb\x1e\xef\xf1\x7c\xfd\x0d\xc8\xef\x5b\x98\x57"
+ "\x7d\xf0\x3b\xf2\x4b\x4c\x22\x37\x9d\xf3\xf8\xba\xcd\xc7\x70\x7d"
+ "\x98\xd1\xaf\x48\x67\xa4\x6a\xd2\xa3\xda\x1b\xd2\x55\x58\x18\xd1"
+ "\x83\xf1\xb9\x15\x68\x83\xce\x7e\xe9\x23\xcb\x22\x14\xf4\x4f\x69"
+ "\x00\xde\xe7\x54\x97\xc2\x81\xba\xe4\xf4\x38\x72\xe3\x68\xd4\x37"
+ "\x8e\x85\x0a\x56\xae\xc4\xf1\x90\xc7\x8f\x1b\xbd\xc7\x5d\xd1\x26"
+ "\x39\x21\x26\xb8\x3e\xf3\x2b\x32\x1a\xf7\xc5\x2d\x03\xba\x65\x26"
+ "\x2f\x1c\xc7\x6a\xed\xa2\x4f\xc8\xd9\x44\x22\xcf\xfc\x9e\x0c\x07"
+ "\x4c\x70\xe3\xd1\x0c\xe3\x31\xbc\xd9\xa7\x13\xec\x8a\x59\x73\x99"
+ "\xf8\xa0\x9d\xc2\x3d\x66\x1a\xda\x75\xc4\xfc\x5d\xd0\x88\x5d\x09"
+ "\xc4\xcf\xf8\x5d\xec\x48\xfd\x77\xb1\x37\xed\x34\x13\xbf\x11\x89"
+ "\x44\x59\x96\x00\x58\x5c\x0b\xe3\xf3\x02\x8c\xcf\x76\x36\x3e\x2d"
+ "\xf8\xa3\xb9\xc3\x53\xf0\xdd\x7f\x6e\x6c\xee\xe0\xc7\xe6\x06\xc0"
+ "\xdf\x7a\x01\x7f\xc6\xb5\x41\xf2\x32\x39\x25\xd0\x46\x90\xfb\x57"
+ "\x01\x15\x9a\xeb\xbd\x30\x46\x49\xef\x4c\x68\x04\x9b\x0f\x7d\xa5"
+ "\xc6\x03\xa0\x0b\xcf\x71\x72\x15\x2d\x2a\xd2\x7d\x18\xd1\x46\x84"
+ "\xb8\x49\xfb\xc2\xee\xb1\xf1\x3a\xd5\x5c\xfa\x5d\x8b\xc7\xd7\x3a"
+ "\x28\xf7\x52\xcd\xff\xb9\x12\xf4\xb8\x90\xc5\x59\xda\xd5\x18\x33"
+ "\xd5\x79\x7c\x7d\x10\x78\x11\x7c\x76\xe0\x23\xee\xbe\xdc\x37\x01"
+ "\x40\x4b\x4c\x20\x73\xa3\xdf\xf4\x54\xb3\x5f\x61\x96\xf6\x99\x6e"
+ "\xce\x5e\xf5\x80\x0e\xce\xc6\x13\xf9\xb2\x76\x90\x8d\x09\x64\xd3"
+ "\x11\xe4\x0d\x76\x2b\x02\xed\x16\xcd\x4f\x8e\x4f\xd7\x51\x73\x78"
+ "\x8c\x07\x05\xb9\x78\x61\x8c\x7c\x69\x22\xa1\x19\xe7\x41\x46\x86"
+ "\x26\x02\x7d\x1b\x01\xb6\x6d\x64\xd9\x7a\xe2\xb7\x0b\xe4\x33\xbc"
+ "\x1d\x7c\x9a\x82\x7f\xe8\xde\xd4\xd4\x7a\x9a\x00\xe7\x68\xc7\x7c"
+ "\x36\xcb\x6e\x00\x5d\x8d\xc8\xc1\x71\x0b\xe3\xd8\x67\x33\x67\x57"
+ "\x39\xdd\x1a\x37\x04\xdd\xd1\xb3\x21\x48\x05\xc7\x6d\x16\x5b\x67"
+ "\xb1\x33\x34\xf7\xab\x2c\xb4\x73\x0d\xa9\x3a\x62\x04\x59\x8e\xc0"
+ "\x39\x71\x43\xd0\x68\x4e\xa6\x4f\x83\x4c\x57\x11\xaf\x89\x9d\x44"
+ "\x06\xed\x52\x42\x9b\xc9\xc9\xd8\x16\xb4\xad\x01\x26\x18\x47\x28"
+ "\x67\xe0\x29\xa7\x80\x35\x73\xe1\xf4\xd4\x59\x71\x2a\x72\x3c\xe8"
+ "\x34\xc1\xfc\xb2\x99\x5d\xf4\x4b\xbc\x2f\xd8\x90\x6a\x24\xd4\xbf"
+ "\x08\x65\x08\x72\xfb\xba\xe6\xc3\x88\x4e\xe2\x18\xd3\xe7\x76\x0b"
+ "\x98\x3e\xb7\x5b\xc0\xf4\xb9\x4a\xee\x3e\xbc\x08\xd7\x5d\x95\x80"
+ "\x6b\x3f\x31\xae\xbf\x79\xe7\xaa\xe2\x7a\xb6\x74\x5c\xef\xbc\x20"
+ "\xc2\xb5\xe6\xbf\x83\xeb\x8f\xd4\x1c\xae\x3d\x7a\xc6\x72\x78\x3d"
+ "\xdc\x60\x7c\x1b\xfc\xdf\x73\x39\x16\xdc\x9e\xd8\x8b\xb8\xfd\xb6"
+ "\xf1\x5a\xc5\x6d\x57\x47\x90\x0a\x8e\x41\xc7\x2d\xf0\x74\x1a\xb7"
+ "\x1f\xa9\xbb\x89\x45\x7e\x88\x5f\x9a\x7f\xba\x4d\x95\x49\x1e\x04"
+ "\x3b\x01\x3e\xc3\x6d\xe4\x24\x27\xc3\x76\xb5\x6a\x3e\x35\x83\x8d"
+ "\xe0\x72\x8d\x74\x67\x53\x6a\xf6\xcb\x8b\xce\xfc\x98\x28\xcd\x85"
+ "\x4f\xe8\x1b\x8c\xfb\x89\x4f\x22\x51\xe0\xfd\x58\xea\x7b\x71\x0f"
+ "\xac\xc3\xb9\x7b\xb5\xe6\x1d\x9f\xa9\xf0\x7e\x26\xde\x43\x31\x15"
+ "\x55\x44\x9b\x77\x1c\xd2\x9a\x7d\x2f\x10\xba\xe3\x62\x08\xde\xc3"
+ "\xed\xc8\x6d\x57\x5b\xee\xe1\xdb\xf5\x8d\xfc\x2a\xa2\x61\xbc\xc0"
+ "\x9a\xea\xfc\xc7\xf0\x57\x0e\xed\xf8\x1e\xfe\x7a\xc0\x5f\x6e\x1f"
+ "\x63\x69\xf3\x5c\x3b\xdb\x6b\xa9\xb0\xc8\xc0\xdb\xc1\xed\xdc\x18"
+ "\xbc\x8b\x0c\x3f\xc7\x7f\x87\xf6\xb4\x59\x9e\x09\xe8\xa5\x17\xe4"
+ "\xb1\x05\xeb\x06\x99\x28\xd8\x73\x0a\xec\x37\x3e\x03\xc4\xf3\xe3"
+ "\x7e\x9b\x03\x35\x4d\x5a\x4d\x0b\x69\xf7\x38\x1f\xd9\x00\x73\xbf"
+ "\xb9\xb8\xc8\x80\xf7\xdc\x10\xf7\x96\x7a\x47\x80\xbe\xb5\x69\x1c"
+ "\x0d\x97\x8f\xd8\x5c\x98\xa3\xa5\xc5\xd3\xf5\xb8\x86\xec\xa0\xb1"
+ "\xbf\xe6\xff\xe2\xbd\x26\x0f\x16\x6f\x39\xbf\x9b\x82\xfc\x70\x5f"
+ "\xf8\xde\xe7\xa2\x70\xbf\xf6\x2c\x85\xea\xfd\x74\xc2\x3f\x0f\xc0"
+ "\xda\x8b\x7b\xba\xe3\x73\x47\x3f\xcf\x22\x59\x1d\x76\xf6\x74\x17"
+ "\x9e\x4f\x3a\x9f\x63\x2e\xca\xd1\x76\xe4\x9e\x6f\x06\x1f\xa0\x55"
+ "\xdc\x67\x7b\xba\x00\xfa\x4e\x47\xe7\xa4\xe9\xe1\x82\x9f\x23\x3e"
+ "\x33\x82\x4c\x54\x22\xaf\x68\x87\x7e\x75\xe0\xea\xc4\xf0\x3d\x26"
+ "\xad\xb9\x47\xed\x73\x3c\xfd\xbc\x44\x9f\xe8\x82\xc3\xfd\x5f\x4d"
+ "\x85\x79\x59\xc6\x3b\x81\xf7\xb8\xdb\x88\x69\xad\xfa\x51\xbc\x07"
+ "\x82\xbe\x5e\x46\x1c\x7b\x96\xad\x6e\x8f\x91\xa0\xdf\xf7\x46\x42"
+ "\xad\xbc\xbb\x47\x4d\x46\xe8\x89\x72\xb6\x21\x93\xe6\x5d\x20\x81"
+ "\x74\x83\xda\x27\xe7\x02\x99\xda\x73\x29\x60\xd8\x4b\x49\x44\xd1"
+ "\x0d\x36\xb9\x3b\x39\xd6\x07\x9f\x9b\x7b\xf7\x9c\x56\xde\x60\xac"
+ "\x41\x3f\x33\x10\xe7\x01\x6c\xbb\xe9\x92\x7a\xc4\xb6\x8b\x78\x9f"
+ "\xf8\x32\xd1\xae\x78\x15\xe6\x81\xef\x8e\x7b\x66\x80\xed\x03\xdb"
+ "\xc5\xcd\x07\x2e\xcc\x05\xdd\x30\x17\xcc\x52\xd3\xce\xfa\xa6\x4f"
+ "\xf0\xde\xb5\x32\x73\x1d\x19\x8e\xfc\xf1\x5e\x33\x37\x3f\xcc\x83"
+ "\xf9\x01\x7e\xc3\x5a\xa2\x77\x7e\x50\xcd\x26\x7d\xe6\x07\x5c\x87"
+ "\xd4\x37\xb7\x11\xc0\xf2\xf5\xb3\x0d\x3e\x9d\x1a\x03\x35\xe3\x9a"
+ "\xa4\xc1\x78\x1e\xf3\x1b\x8d\xb0\xcc\x15\x38\x4f\x74\xf3\xf3\x44"
+ "\x19\x3f\x4f\xbc\x32\x08\xf3\xc4\x2b\x38\x4f\x9c\x26\xf2\x9d\x38"
+ "\x47\xc0\xfc\xf0\x87\x7f\xeb\xe5\x3d\x30\x27\x48\xd3\xb3\xbe\xd2"
+ "\x21\x7e\x8a\x8b\x8e\x9a\x61\x2e\x46\x3d\x6f\x02\xfd\xa2\x9e\x1b"
+ "\x82\x40\xb7\x4d\xd7\x87\x75\x41\xb9\xb1\x38\x3d\x78\xcf\x59\xbd"
+ "\x9c\x16\x66\x45\x74\x01\x1e\xd2\x2e\x13\xb9\xd1\x2f\x2f\x6b\xff"
+ "\xfc\x7c\x39\xae\x5b\xcd\x45\xe9\x29\x6c\x8d\x7c\xc9\x1f\x63\x34"
+ "\x3e\x6d\x44\x89\xf1\x53\x13\x55\xfb\x98\xbf\x55\x0f\x37\xaf\x0e"
+ "\xf0\xea\xf9\x36\x60\xd8\x8b\xcf\x10\x85\x7e\x75\xac\x4f\xe6\x42"
+ "\xa2\x7c\xef\xb3\x7c\x79\xbd\x01\xc6\xf6\x75\x66\x58\xb7\xa7\x07"
+ "\x57\xb4\x90\x29\x15\x2b\xc8\xe4\xf2\xb3\x44\x55\xbe\x8a\x8c\xdf"
+ "\x75\x16\x30\xb4\x5a\x3d\xa2\x87\xc3\x47\x97\x96\x7b\x2e\x60\x15"
+ "\x09\xa1\xa3\x32\x83\xe1\xef\x94\xfc\x55\xb0\x9e\x19\x95\x1e\x4c"
+ "\xfd\xf3\xb2\xcc\x40\x97\x03\x6b\x37\xf0\xd1\xa1\x0d\xdf\x9b\xec"
+ "\xe1\x66\x97\x44\x1f\x62\x56\x04\xe0\xa6\x11\x70\xf3\xbd\x35\x6e"
+ "\x70\xdd\xca\x61\x67\x16\xc3\x0e\xde\xf3\xab\x10\xfb\x17\x2b\x3e"
+ "\x74\x19\x3f\xa5\xe0\x3f\x77\xd9\xe0\xa7\xf4\x82\x7b\xf8\xe9\x01"
+ "\xfc\x94\x66\x03\x7e\x4e\x12\x79\x89\xd9\x1d\xfc\x5c\xd4\x71\x73"
+ "\x44\x55\x7c\x13\x7b\x86\xe9\xfb\x69\xa8\x67\x9d\xc7\xf7\x53\xe7"
+ "\x05\xc9\x88\x8b\xb8\xaa\x1e\x00\x57\x06\x86\xab\xcb\x6b\x5c\xc0"
+ "\x55\x21\xe0\xaa\xba\x7f\x5c\x5d\x76\x84\xab\xea\xbe\xb8\x32\xcc"
+ "\x1b\x5a\x5c\x71\xf9\x44\xff\x07\x70\x75\x79\x8a\x35\xae\x2e\x15"
+ "\x31\x5c\x5d\x2a\x74\x1d\x57\x19\x03\xd8\xab\x0c\xde\x5e\x75\x1c"
+ "\x77\x01\x57\xed\x14\xf8\xf7\x8f\xab\xf3\x0e\x70\x95\x61\xc7\x5e"
+ "\x5d\xd9\x3f\xb4\xb8\xe2\xf2\x9d\xfe\x0f\xe0\xaa\x23\xdf\x1a\x57"
+ "\x97\xcf\x33\x5c\x5d\x6e\x77\x03\x57\x03\xd8\xab\x0c\xde\x5e\x75"
+ "\xdf\x2a\x1d\x57\x34\x14\x70\x35\x80\xbd\x3a\xe3\x08\x57\x76\xec"
+ "\x55\x97\xe7\xd0\xe2\x8a\xcb\xc7\xfa\x3f\x80\xab\xae\x36\x6b\x5c"
+ "\x75\xce\x60\xb8\xea\x0c\x75\x1d\x57\x9a\x01\xec\x95\x86\xb7\x57"
+ "\xc6\x75\x2e\xe0\xaa\x94\x02\xff\xfe\x71\x75\xc4\x01\xae\x34\x76"
+ "\xec\x55\xcf\x92\xa1\xc5\x15\x97\x2f\xf6\x7f\x00\x57\xc6\x10\x6b"
+ "\x5c\x75\x97\x31\x5c\x75\x97\xba\x81\xab\x01\xec\x95\x86\xb7\x57"
+ "\xe6\x93\x2e\xe0\xca\x00\xb8\x1a\xc0\x5e\x65\x38\xc2\x95\x1d\x7b"
+ "\x65\x3a\x34\xb4\xb8\xe2\xf2\xd9\xfe\x0f\xe0\xca\x5c\x62\x8d\x2b"
+ "\xe3\x65\x86\x2b\xa3\xc1\x29\x5c\x75\x8a\x70\xd5\x7c\x7d\x58\x77"
+ "\x26\x5b\x0f\xbe\xb1\x8a\xc7\xd5\xeb\xab\x13\x37\xad\x23\xf2\xfd"
+ "\x8b\x4a\xac\xd7\x82\x0a\xd9\xcd\xb6\x98\x02\x5c\x70\x98\x32\xae"
+ "\x06\x4c\x9d\x63\x98\xd2\x9c\x01\x4c\xfd\xb3\x44\xde\x90\x7a\x1e"
+ "\x71\xc2\x61\xa8\x74\x15\x60\x08\xd7\x85\x32\x45\x80\x94\x35\xe0"
+ "\x4b\xe7\x78\x2c\x29\x88\x6c\x50\xb0\x14\x09\x58\x3a\x65\x8b\xa5"
+ "\xe3\x02\x96\xe6\x38\x58\x03\x2e\x75\x80\x25\xdd\xc0\x58\xda\x85"
+ "\x31\x84\xb5\x57\x09\x4b\x1f\x0b\x31\x84\x7d\x2b\xf4\x72\xa3\xbf"
+ "\x44\x2c\x29\x48\xab\x35\x96\xe8\x63\x0c\x4b\x34\xcc\x75\x2c\x65"
+ "\x54\x3b\xc6\x12\xef\x4f\x29\x3c\x56\xba\x87\x25\xf0\xad\xac\xb0"
+ "\x34\xb0\x1f\x25\x60\x49\x3e\x6b\x68\xb1\x64\xe3\x47\xfd\x60\xb1"
+ "\xe4\x11\x6c\x85\x25\x85\x8c\xad\xfb\x14\x32\x87\xeb\x3e\x33\xcc"
+ "\x5d\x78\xcf\x09\xdf\x0d\x36\x5d\x52\x3f\x6a\x82\x39\x0d\xdf\x11"
+ "\xc6\xfb\x14\x07\x12\x1a\xe5\x88\xa7\xdc\x8b\x24\x30\x27\x89\x4c"
+ "\xf5\xe9\x64\x58\x31\x02\x56\xb6\x5e\x24\x8a\x9e\x1e\xc0\x49\x37"
+ "\x51\x74\x81\xbc\xbb\x7a\x62\x7d\xea\xa2\xdb\xc8\x7b\x17\x1a\x61"
+ "\x2e\xab\x21\xe5\x70\x4d\x0f\x1f\x87\x34\x6f\x52\x8f\xd8\x96\x86"
+ "\x71\xc8\x93\x44\xbb\xe8\x15\xd0\xbf\xc2\x6d\xfd\x77\x3d\xe7\x48"
+ "\xff\x47\xac\x74\x5f\x2a\xd2\x3b\xf7\x5e\x81\x8b\xf3\x11\x77\x9f"
+ "\x2a\x81\xe9\xde\xa2\xf7\x9d\x83\xa0\xf7\x9d\xbc\xde\xdd\x9a\x8f"
+ "\x14\x9e\x8e\x9f\x7f\x14\xd9\x0a\xee\x99\x82\x4e\x66\x23\x2c\x76"
+ "\x01\x6d\x04\xfa\x2f\x5d\x7e\xe9\x93\x6d\xe7\x1b\xb4\x0f\x17\x14"
+ "\xd7\x17\xe1\xdc\xe4\xd0\x8f\xe1\xed\x44\xe6\x46\x66\x27\x38\x3f"
+ "\x66\x18\x99\x39\xa8\xf1\x47\xc5\x75\x19\x57\xcf\x5e\x1c\x19\x78"
+ "\xee\x71\xc3\x8f\x41\xdc\x94\xda\xe0\xe6\x6a\xd8\x0b\xd7\x70\x73"
+ "\x7d\xb4\xb5\xbd\xf0\x3c\xc2\xec\x85\xe7\x61\x67\xe6\x9e\x01\xf0"
+ "\x74\x50\x84\x27\x83\x80\xa7\x1b\xbe\xc2\x18\xa5\x44\x3c\x55\x0e"
+ "\x6a\xdc\x51\xe1\x75\x72\x68\xf1\x34\x78\x71\xc7\x6b\x1b\x4f\x37"
+ "\x54\x5b\xe3\xc9\x6b\x38\xc3\x93\x97\xb7\xfb\x78\xca\x10\xd9\xa7"
+ "\x0c\x91\x7d\xf2\xbe\x0f\x63\x93\x12\xf1\x64\x18\xd4\x78\xa3\xe2"
+ "\xc6\x5b\x87\x16\x4f\x83\x17\x6f\xbc\xb6\xf1\xe4\x4d\xac\xf1\x34"
+ "\x6c\x09\xc3\xd3\xb0\xa8\x41\xc0\xd3\x41\x5b\x9f\x98\xe1\x69\xc4"
+ "\xf3\xe8\x3f\x4b\xc3\x93\x2c\x6c\x50\xe3\x8c\x8a\xe1\x6b\x86\x16"
+ "\x4f\x83\x17\x67\xbc\xb6\xf1\x34\x22\xc2\x1a\x4f\xde\xfb\x19\x9e"
+ "\xbc\xf7\xb9\x8f\x27\x8d\xc8\x3e\x69\x44\xf6\x49\x79\x1a\x63\x91"
+ "\x12\xf1\x34\xb8\xf1\x45\x85\xcf\x91\xa1\xc5\xd3\xe0\xc5\x17\xaf"
+ "\x6d\x3c\x29\x2b\xad\xf1\x34\xc2\xc4\xf0\x34\xc2\x38\x08\x78\x12"
+ "\xd9\x27\x8d\xc8\x3e\xdd\x34\x16\x63\x90\x12\xf1\xa4\x1f\xd4\xb8"
+ "\xa2\x62\xe4\xf0\xa1\xc5\xd3\xe0\xc5\x15\xaf\x6d\x3c\x8d\xd4\x5b"
+ "\xe3\xc9\x77\x16\xc3\x93\xef\x4c\x67\x63\x41\x96\x18\x90\x18\x4f"
+ "\x8e\xd7\x76\xfe\x71\xb6\x6b\x3b\x49\x31\x20\x5c\xe7\xb9\x1c\x4f"
+ "\xf4\x9b\xf3\xff\x6b\x3c\x11\x31\x64\x89\x03\x5d\x7b\x31\x20\xff"
+ "\xc9\xd6\x18\xba\x69\x27\xc3\xd0\x4d\x25\x8e\x30\x64\x14\x3f\x93"
+ "\xf6\xb5\xe8\x99\xb4\xf3\x44\xbe\x3f\x41\x2b\xaf\xe7\x9f\x49\xc3"
+ "\xe7\xd1\xea\x5b\xdb\xc8\xb6\x2b\x44\x39\x22\x96\x28\x67\x27\x66"
+ "\xd2\x3c\xb4\x21\xc9\x6a\x9f\x97\xce\x92\xa9\x3d\x80\x99\xdc\x73"
+ "\xfc\x73\x69\x80\x9b\x8f\x9a\x3b\xc9\xbb\x09\xf8\x5c\x5a\x35\xa9"
+ "\x00\x3a\x63\x21\x8b\x07\xa1\x1d\xe1\x9e\x49\x5b\xf5\x2a\xe0\x60"
+ "\xd4\x42\xbb\xcf\xa4\x65\x4b\x7c\x26\x2d\x05\x70\x60\x00\x1c\x5c"
+ "\x46\x0c\x1c\xb2\x7a\x16\x6d\x57\xb6\x28\x06\xb4\xc2\x41\x0c\xa8"
+ "\xc9\xb9\x7b\x12\x83\xfe\x2c\xda\x77\xa2\x67\xd1\x2c\x31\xa0\x45"
+ "\x60\x3b\x24\xeb\xfd\x27\x0e\xf7\x3f\x40\x1b\x61\x02\x9b\x30\x1b"
+ "\x9f\x2d\x37\x08\xf1\xe2\xf4\x38\x7c\xf7\x37\x3d\xd8\x08\xb6\x02"
+ "\x9f\x1f\x7f\x73\x45\x2d\x17\xef\x6b\x48\x6d\x22\xdb\xba\x89\xd2"
+ "\x47\xcf\xdb\x05\xff\xf4\x94\x1e\xb0\x0d\x26\x98\x97\x40\xd7\xc3"
+ "\x7b\x92\xc1\x36\x5c\x04\xdb\x90\x0c\xb6\xe1\x32\xd8\x86\x96\x5a"
+ "\xce\x36\xd0\x17\xcc\x53\x31\x2f\x78\xc5\x39\x32\xb9\xec\x1c\x99"
+ "\x82\x36\xc0\x54\x94\x97\xd5\xe3\x9f\x1e\xa9\xf7\x4f\x57\xc3\xb9"
+ "\x58\x86\x81\x2e\x6d\x4e\x12\xe1\x6c\x3d\xea\x5e\xb5\x0a\xed\x41"
+ "\xc0\xf2\x9e\x6c\x42\xdc\xc1\x41\x8f\x38\x26\x28\xc6\x81\x03\x1b"
+ "\xe0\x36\x16\x6c\xe2\xc0\xbb\xdc\xb4\x01\x88\x85\x5d\x16\x1b\xe0"
+ "\x16\x16\x6e\x76\xf8\xfe\xcf\x00\x58\xa8\x76\x02\x0b\x06\x27\xb1"
+ "\x50\x88\xf9\xb4\xed\x60\xe1\x14\x60\xa1\x09\xce\xb5\x31\x2c\x5c"
+ "\xb6\x83\x85\x5b\xd6\x5c\x7d\x2c\x58\xc7\x64\x7e\xb8\x58\xf8\x69"
+ "\xa8\x6b\x58\xc8\x70\xc2\x2e\x64\x38\x6b\x17\xda\x31\x0f\x75\x5f"
+ "\x2c\x64\x80\x5d\xc8\x00\xbb\x90\xc1\xdb\x85\xf3\x76\xb0\x30\x7a"
+ "\xe3\xd5\xc7\x82\x75\x3c\xe5\x87\x8b\x85\x5b\x1d\xe7\xbf\xe8\x1f"
+ "\x0b\x4e\xd8\x85\x0c\x27\xed\x02\x0d\xc5\xfc\xcd\x76\xb0\x00\x76"
+ "\x21\x03\xec\x42\x06\x6f\x17\xce\xd8\xc1\xc2\x6d\xcf\x5f\x7d\x2c"
+ "\x58\xc7\x42\x7e\xb8\x58\xb8\xdd\xe1\xfe\x5f\xfd\x63\x41\xe3\x84"
+ "\x5d\xd0\x38\x69\x17\x68\x29\xe6\x3d\xee\x8b\x05\x0d\xd8\x05\x0d"
+ "\xd8\x05\x0d\x6f\x17\x8e\xd8\xc1\x82\x6a\xc7\xd5\xc7\x82\x75\x1c"
+ "\xe3\x87\x8b\x85\x31\xb1\x2e\x62\xc1\x09\xbb\xa0\x71\xd6\x2e\x18"
+ "\x30\x5f\xb0\x1d\x2c\x80\x5d\xd0\x80\x5d\xd0\xf0\x76\x21\xc3\x0e"
+ "\x16\xee\x28\xbb\xfa\x58\xb0\x8e\x41\xfc\x70\xb1\xf0\xb3\x94\x7e"
+ "\xb1\x40\xfb\x62\x01\x63\x08\xb8\x7e\xc4\x7c\xdc\x1c\x16\x9e\xd1"
+ "\xca\xbb\x29\x62\xa1\x96\xbc\x98\x26\xc2\x42\x11\x5b\x47\x58\x70"
+ "\xb0\x5d\x8c\x03\x7c\x7f\x09\x71\x00\xeb\x07\x23\xe8\x9d\x16\x67"
+ "\x06\x73\xcf\x2b\x15\xa5\xc7\xe2\xfa\x01\xe3\x0c\xb8\x86\x70\xbc"
+ "\x7e\x08\xdc\x3d\x28\x18\x88\x07\x0c\xb4\xdb\x5f\x47\x0e\xfa\xfa"
+ "\xe1\xbb\xab\x84\x01\x58\x4b\xbe\xa2\x71\x07\x03\x63\x1d\xee\xff"
+ "\xe1\x18\x03\xe0\x23\x38\x85\x01\xe6\x27\xf4\x8f\x81\x8c\x46\x01"
+ "\x03\xe0\x2f\x14\x65\xb4\xa1\x7f\xc0\x30\x90\xd1\xe4\xd8\x3f\xb8"
+ "\xf3\xb5\xab\x8f\x81\x41\xf6\x0f\xae\x59\x0c\xfc\x3c\xdd\xe1\x3b"
+ "\x8c\x68\xcb\xc1\xee\xcf\x1e\x77\x1b\xa1\xab\xd5\x8f\xe6\x9e\x23"
+ "\x81\x2f\x3d\x43\xa6\x62\xde\x98\xfd\xdd\x9d\x72\x4d\x22\xfd\x1a"
+ "\xdf\xad\x36\x42\x3f\x30\x5f\x28\x87\x8f\xef\x02\xbc\x1a\x62\xf5"
+ "\x64\x1b\x60\xe1\x25\xe8\x03\xe6\xae\x1f\x91\x78\x7d\x58\xbd\xe1"
+ "\x43\xd2\x7d\x49\x4d\xea\xa2\xcf\x91\xf0\x20\xda\xd3\xd0\xac\xc5"
+ "\x77\x18\x15\xda\xf5\x1f\xe2\x7b\xe2\xc3\x96\xa5\x12\xf9\x05\x45"
+ "\x50\x08\xc6\x94\x26\xa6\x12\x65\xe9\x39\x16\x47\xda\x76\x81\x90"
+ "\xe3\x80\x52\xa6\xf7\xa0\x32\xcf\x8d\x83\x10\x43\x8a\x02\xbd\x37"
+ "\x5b\xf4\x7e\xdc\x3a\x86\x24\x77\xe2\x7d\x46\x27\x62\x87\x57\xe5"
+ "\x7d\xc6\xef\xfa\xbe\xcf\xe8\x5a\xec\x70\x5c\x62\xbf\xcf\x11\xf1"
+ "\x7e\xc0\xa6\x14\x6e\xdc\x73\x7a\xed\x01\xdb\xdf\x90\x5a\xc3\x3d"
+ "\x1f\x8d\xe3\x1c\xc7\x3c\xe2\x23\x13\xfa\x8b\x18\x41\x3c\xcc\xde"
+ "\xd3\xd3\xb3\xd4\x40\xe4\x66\xff\xf4\x14\xc4\x84\x79\x6d\x80\x57"
+ "\x0e\xf4\xa9\x21\xba\x05\xf4\x7e\x91\x34\xb4\xf2\x3a\x4f\x6b\x01"
+ "\x5d\xde\x35\x9e\xae\x0d\x1a\x36\xc1\x40\x94\x99\x9f\x13\xe5\x32"
+ "\x7c\xe7\x18\xe6\x81\x5d\xe0\x13\x54\x3c\x43\x26\xc3\x7c\x10\xd1"
+ "\xc3\xdb\x06\xb3\x25\xae\x84\x73\x04\x60\xe2\xa5\x04\xc0\x04\xcc"
+ "\x5e\xaa\xa5\x88\x89\xbb\xde\xf2\x5c\x67\x27\xbe\x2c\x01\x13\x5c"
+ "\x7c\x39\x06\x30\xd1\x2a\x60\xa2\x37\xae\xec\x60\x4e\xd0\x2e\x72"
+ "\xe3\xd9\x42\x3b\xf6\xc0\xed\xb8\xf2\x77\x7c\x5c\x59\x64\x0f\x5c"
+ "\xc3\xc6\x2f\x1c\xe7\xc4\x74\x8c\x8d\xea\x81\xb1\xd1\x61\xc1\x86"
+ "\x61\x60\x6c\x8c\x0f\xb3\x83\x8d\x42\x11\x36\x1a\x45\xd8\x60\x71"
+ "\xa6\xa2\xf4\xb6\xbe\xd8\x18\x7f\x72\x68\xb0\x61\xf3\xdc\xcf\x0f"
+ "\x16\x1b\x77\xef\x91\x8e\x8d\x0c\x27\xec\xc6\x77\x3c\x36\x32\x9c"
+ "\xb0\x1b\x13\x62\xec\x60\xa3\x5d\xc0\x46\x86\xc8\x6e\xf0\x71\xa7"
+ "\xa2\x0c\x3b\x76\x63\xc2\x37\x43\x83\x0d\x9b\x67\x78\x7e\xb0\xd8"
+ "\x98\x78\xcc\x05\x6c\x38\x61\x37\xbe\xb0\x60\xc3\x09\xbb\x11\x9c"
+ "\xd5\x17\x1b\x34\x54\x84\x0d\x91\xdd\xe0\xe3\x50\xe8\x73\xf6\xc1"
+ "\xc6\x24\xcf\xa1\xc1\x86\xcd\xf3\x38\x3f\x58\x6c\x4c\xd2\x49\xc7"
+ "\x86\xc6\x09\xbb\xf1\x1e\x8f\x0d\x8d\x13\x76\xe3\x9e\x52\x3b\xd8"
+ "\x28\x15\xb0\xa1\x11\xd9\x0d\x3e\x2e\x55\xa4\xb1\x63\x37\xee\x1d"
+ "\x33\x34\xd8\xb0\x79\xb6\xe6\x07\x8b\x8d\x7b\x1d\xee\x7f\xdd\x0f"
+ "\x36\x9c\xb0\x1b\x99\x16\x6c\x38\x61\x37\x26\xd7\xd8\xc1\x86\x41"
+ "\x84\x0d\x91\xdd\xe0\xe3\x54\x45\x1a\x3b\x76\xe3\xbe\x69\x43\x83"
+ "\x0d\x9b\xe7\x64\x7e\xb0\xd8\xb8\x3f\xc0\x19\x6c\xa4\x1b\xec\xac"
+ "\x53\x5a\x19\x36\x7a\x80\x46\x8c\x0b\xf1\xda\x04\xfa\xa7\x08\x87"
+ "\x35\x0b\x62\x62\x49\x3a\x91\x73\xb8\x30\x88\x71\x71\x7f\x23\xe2"
+ "\xe2\xee\x58\xc0\xc5\x57\x3c\x2e\x2c\xeb\x12\x2e\xf7\x0a\x5b\x9b"
+ "\x58\x62\x56\x96\xf5\xc9\x8b\xb8\x66\x8d\xb5\x60\xe2\x97\x73\x3c"
+ "\xe3\x06\x01\x13\x56\xcf\x3d\x88\x30\xb1\xd0\xc1\xfa\x64\xbe\xeb"
+ "\x98\x78\x05\xd6\xae\x3d\x83\xfd\xee\x93\x05\x13\x9f\xbb\x8b\x89"
+ "\x29\xfd\x3e\xff\x60\x1f\x13\xbc\x9f\xe1\x10\x13\x82\x6f\xc1\x30"
+ "\xf1\x45\x3f\x98\x98\xd2\xda\x17\x13\xbc\x5f\xc1\xe5\x21\x60\xbe"
+ "\x85\x25\x86\x65\xf1\x2f\xac\x31\xf1\xc0\xca\xa1\xc1\x84\x8d\x7f"
+ "\xf1\x83\xc5\xc4\xaf\x42\x1c\x61\x22\x5f\x6e\xae\x86\xa3\x06\x0e"
+ "\x2d\x1c\xb5\x26\x39\x99\x51\x26\x37\x73\xf9\xc9\xf9\x31\x63\x7b"
+ "\xfe\x3a\xfa\xc2\xe3\x91\x48\x43\x37\x2b\xb8\x1c\x64\x16\x1e\xa6"
+ "\x61\x04\xf3\x21\x6a\x7d\x64\xd1\xa8\x13\xa4\xbd\xde\xc2\xcb\x67"
+ "\x33\x09\x81\xfe\x33\x3a\x39\xc9\x62\x74\x21\xd7\x21\x1d\xcd\xbd"
+ "\xe0\x07\x65\x5e\x3c\x4f\x2e\xc7\xaf\x49\x2e\x47\x5e\xb6\x75\xdf"
+ "\xc0\xd3\xa8\x4c\xd9\x44\x25\xae\x1b\x78\x61\x9d\x16\xba\x61\x48"
+ "\x67\xba\xee\xf6\x50\x93\x4c\x11\x28\xa6\xa3\x0f\x13\x31\xdd\x8d"
+ "\x3c\xbf\x20\xab\x7e\xdc\x41\x88\x8f\x4c\xc5\xfa\x92\x2a\xb7\xf4"
+ "\xc5\x9b\xe3\x39\xa2\x3d\x1e\x78\x8e\xb7\xe2\x79\x1d\x21\xc3\x81"
+ "\x1e\xf9\x0e\x8f\xe5\xda\x8d\xf4\xc3\xe9\x30\x8f\x10\x8e\xbf\x4c"
+ "\x11\x6c\x96\x93\x60\xd6\x2f\xa2\x28\xeb\x6d\xb3\x8a\xe4\x5b\xd7"
+ "\x31\xc2\x22\x2f\x31\x1d\xd2\x50\x79\x2f\x8d\x0f\xd7\x8e\x61\x72"
+ "\xec\xdb\x14\x71\x3b\x18\x1d\x99\xc4\xd3\x29\xa1\x5f\x53\x7b\x75"
+ "\x59\x18\x1a\x64\xa1\x03\xfc\xde\x0c\xba\xd0\x36\xc0\x78\xe3\xe5"
+ "\xe0\x0b\x3a\xd8\xc3\xcb\x22\x44\xcc\x73\xb8\x4c\xa6\x2b\xe3\xe5"
+ "\x65\xce\xbd\x10\x05\xb4\x23\xcd\x9b\x15\xa1\xbd\x7c\xb3\x95\xc4"
+ "\xa2\x57\x9a\x6d\xbc\x89\xe3\xdb\x06\xe3\x4c\x2e\x53\xf1\x72\xb8"
+ "\x09\x69\xe1\x9a\x30\xd6\x2f\x65\xaf\x5e\x4d\x72\x05\x9e\xd3\x8a"
+ "\x68\xfd\x98\x8c\xcd\x9d\xd0\xb7\x99\x7d\xe9\xbd\x6c\xe9\xfd\x19"
+ "\xbd\xbe\x0d\xe8\x23\xfa\xd2\x2b\x6d\xe9\x47\x31\xfa\x4b\x21\x40"
+ "\x1f\xd9\x97\xde\x38\xd2\x86\xfe\x27\x8c\xfe\x72\x09\xd0\xab\xfb"
+ "\xd2\xab\x6c\xe9\x03\x38\xfa\x91\x32\xd4\x4d\x54\x5f\xfa\x10\x5b"
+ "\xfa\x9b\x19\xff\x0e\x3d\xd0\x47\xf7\xa5\xcf\xb2\xa5\xbf\x85\xd1"
+ "\x77\x87\x01\x7d\x8c\x2d\x7d\x05\x47\x4b\xee\xe0\x69\x7f\xca\x68"
+ "\x8d\x95\x40\x1b\x6b\xa7\xaf\x1e\x3c\xef\x60\x9e\x7e\x34\xa3\xff"
+ "\x8e\x00\x7d\xbc\x1d\x5d\xd9\xd2\xdf\xca\xfa\x7a\x53\x04\xd0\x27"
+ "\xda\xd1\x95\x2d\xfd\x6d\x8c\xde\x33\x11\xe8\x53\xec\xe8\xca\x96"
+ "\xfe\x76\x46\x7f\xbd\x16\xe8\x53\xed\xc8\xde\x9a\x7e\xe4\x30\x25"
+ "\xd0\xa5\x97\x65\x5b\xc6\x8f\x95\xdc\x6d\x79\x8f\x61\xbc\xbd\xa3"
+ "\xe1\x9a\x2c\x3b\x72\xb7\xa5\xbf\x83\xd1\x8f\xa8\x06\xfa\x2d\x7d"
+ "\xe9\x89\x8c\xd1\x93\x7b\x78\xfa\x9f\x31\x7a\x5f\x94\xe5\x56\x3b"
+ "\xb2\xc7\xf3\x5a\x7e\x9c\x06\x32\x5a\x8f\x7c\xa0\xcd\xb1\x23\x77"
+ "\x31\xed\x58\x46\xfb\xb3\xc3\x40\x9b\x6f\x47\xe6\x62\xda\x3b\x19"
+ "\xed\x4f\x52\x80\xb6\xd0\x8e\xbc\xc5\xb4\x3f\x67\xb4\x37\x67\x01"
+ "\x6d\x89\x9d\xf6\xde\x21\xa2\x0d\x62\xb4\x3f\xcd\x01\xda\x52\x3b"
+ "\x7a\x11\xd3\x8e\x63\xb4\x63\x51\x87\x95\x76\xf4\x22\xa6\xbd\x8b"
+ "\xd1\xde\x8a\x63\xad\xca\x8e\x4e\xc4\xb4\xbf\xa0\x23\x6f\xaf\xe2"
+ "\x6d\xeb\x1e\x5b\x5a\xc0\x80\x16\xec\x50\x2d\xd8\xc2\xf1\xb4\x60"
+ "\x4c\x75\x05\xb3\x6b\xfb\x90\xce\x42\x43\xe5\xc6\x7b\x45\xf3\xc0"
+ "\xdd\xb4\xc0\xbf\x90\xb7\x7f\xd5\xb6\xfc\xa8\x5c\x21\xa6\x9d\x40"
+ "\x0b\xee\x8f\xe6\x69\x0f\xf6\xa5\xf5\x12\xd3\x4e\xa4\x05\xe3\x6a"
+ "\x78\xda\x9a\xbe\xb4\xca\x5e\x5a\x5a\xf0\x8b\x53\x40\x73\xb8\x9c"
+ "\xb7\xab\xa2\x76\xde\x23\xe2\x37\x89\x16\xdc\xad\xe7\xf9\x69\xfb"
+ "\xf2\x53\x89\x69\xef\xa1\x05\x53\x52\x78\xda\x63\x7d\x69\x43\xc4"
+ "\xb4\xf7\xd2\x82\x60\x6f\x9e\xb6\xb6\x2f\x6d\x96\x98\x76\x32\x2d"
+ "\xb8\x27\x88\xa7\xad\xb3\xa5\x2d\x67\x73\x90\x9c\xd7\xd3\x7d\xb4"
+ "\x60\x72\x28\x4f\xdb\x68\x35\xc7\xca\x65\xdc\x18\x2b\x67\x74\xf7"
+ "\xd3\x91\x3f\x3f\xc6\xeb\xf3\x94\xd5\xdc\x9a\x2d\x1b\x89\x73\x4a"
+ "\x19\xea\xf3\x85\xb9\x3a\xa0\xfd\x25\xcf\xaf\xc9\x76\xee\xe3\xdb"
+ "\x37\x05\xce\x35\x5b\xe6\x27\x98\x77\x74\xf6\xfc\x9e\xc4\xbb\xc8"
+ "\x8d\xe7\x14\xd3\x6b\xd9\xdc\xc8\xef\x53\xac\x98\xc1\xfd\x36\x57"
+ "\xc5\x2b\xc3\x0d\xd4\x28\x2e\xcb\x93\xd3\xc6\x89\x06\xa2\xc0\x9c"
+ "\xde\xd4\xbf\xa8\x46\x07\xe5\xfa\xb1\xf1\xba\x8e\x82\xe9\xa7\x74"
+ "\x32\x13\xb7\x27\x1e\x7c\xd7\xe9\xc8\xeb\x75\xf8\x3d\x2f\x1b\xf7"
+ "\x49\x0c\x91\x99\x8a\xa7\xeb\x71\x5f\xc5\x0a\xf8\x9d\x0b\x07\xb7"
+ "\x87\x21\xf8\x98\xf4\x05\x12\xa2\x5d\x6f\x24\x67\x53\x89\x9c\xdb"
+ "\xb3\x5b\x11\x7a\x37\x5d\x1b\x3b\x15\xda\x12\x02\xf5\xc6\xb4\xc0"
+ "\x6f\xae\x2d\xb8\x87\x69\x61\xa8\xb7\x36\xa9\x1b\x69\x36\xeb\xfd"
+ "\x2b\x42\xe8\x73\x8b\xbf\x49\xd4\x90\xdb\xcf\x29\x42\x39\xdb\x85"
+ "\x79\x6f\xcd\xfe\xa1\xde\x5c\xbe\xdb\xef\x62\x7f\xcd\xe5\xba\x55"
+ "\xcc\xd8\x89\x39\x6e\x31\xd7\xad\x25\xcf\x2d\xab\x67\xc6\x96\x4b"
+ "\x60\xaf\x68\xe5\x5e\x1d\x97\x47\x57\x11\x7a\x9a\xeb\x5f\x36\x6d"
+ "\xa4\x81\xab\x3b\xcd\xdd\x5b\xb2\x70\x8f\x6d\xad\xe6\x1c\x69\xe1"
+ "\xcf\x21\x7f\x9e\xe7\x3c\x5b\x9e\x78\x9d\x7e\xcc\x5e\x1d\x7d\x6d"
+ "\x75\xa7\x29\x3f\xb9\xd1\xac\x4c\xae\xa3\xf9\x1a\x5d\x43\xbc\x8e"
+ "\x70\x7d\x55\xcc\x38\x41\x47\x2c\x6c\x30\xe7\x27\x1f\x84\xf2\xc6"
+ "\x06\x43\x37\x57\xde\xa2\x98\xa1\x42\xbf\xf9\x92\x32\xad\x99\xe6"
+ "\xa7\xe9\xb4\xb7\x74\x93\x56\xc5\x0c\xce\xaf\xc2\x72\xba\x43\xa3"
+ "\x43\x19\x9b\x77\x68\x1a\x3d\x02\x88\xe2\x92\x6f\x5a\x73\x47\xc1"
+ "\x8c\x10\xcb\x7e\x76\x96\xba\x90\xaf\x8e\xe7\xe5\x74\xce\x5e\x45"
+ "\x68\x2d\x97\xb3\xb7\x60\x46\xbe\x4e\xf6\x18\xb7\x3f\x9f\xce\x22"
+ "\x4b\xe7\x79\xa4\x20\x0f\xfb\xfb\x9a\x10\x1f\x5a\x14\x1a\x04\xfc"
+ "\xf5\xe0\x7b\x67\x31\x6c\xcc\x30\xea\x64\x53\x73\xd8\xf7\x47\xbc"
+ "\x74\xb2\x07\x0d\xfc\x77\x3f\x9d\x4c\xbf\x85\xff\xae\xb2\xe4\x4d"
+ "\xb6\x9f\xc7\x79\xba\x11\xb0\xe0\x67\xde\xa5\xf6\xc2\x75\x03\xd7"
+ "\x1e\xff\xe9\x46\xd5\x6d\x44\x76\x56\xf1\x48\x15\xd4\xe9\xc7\xf4"
+ "\xf4\x48\x06\xfc\xf5\xe1\xff\xea\xf9\xbf\x14\x69\x38\xbc\xfb\x15"
+ "\x77\x82\x2e\x9a\x98\x7e\x1e\xe1\xf6\x81\xe6\x70\x05\xd8\xa3\xbe"
+ "\x9a\x26\x8e\x6f\x51\x85\xd5\xde\x37\xc1\x93\xee\xb9\x77\xf2\x7d"
+ "\xf7\xff\x72\xca\x03\xcb\x57\x3c\x15\xb3\x72\xd5\xd3\xb1\x71\xcf"
+ "\xac\x8e\x5f\x93\xb0\x36\xf1\xd9\xa4\xe4\x94\x75\xeb\x37\xa4\x6e"
+ "\x4c\x03\x3e\xbd\xfb\x7f\xd3\x5d\xa1\x32\x83\x9c\x80\xae\x1f\x86"
+ "\x3a\x1e\xe5\xf6\x79\xc2\x32\x86\xb9\x47\x0c\x0a\x95\xfd\xf5\x48"
+ "\x43\x00\xac\x01\xc1\xff\x6e\x57\x3c\x3a\x07\xf7\x6d\x04\xfc\xcb"
+ "\x1a\x4a\x1f\xd5\xe2\x9e\xd5\xad\x8a\x47\x43\xeb\xf5\x8f\x6a\x71"
+ "\x8f\xf5\xa3\x01\x6d\x24\xf0\x0e\x22\x3b\xa7\x78\x34\x18\xcf\x57"
+ "\xdc\x49\xc8\x31\xb8\xd6\x1e\xcf\x3b\x94\x24\xe0\xe5\x51\x54\x5f"
+ "\x38\x8a\xb6\x23\xff\xc2\x62\xda\xa6\xdf\x14\x4b\x72\xe1\x37\x8c"
+ "\x09\xe5\x59\x45\x98\xe7\x51\x58\x75\x98\xb3\xc9\xe8\xf2\x62\xda"
+ "\xba\x65\x14\x6d\x7d\xae\x98\xb6\x57\x8c\xa2\xba\xc0\x42\xe2\xdd"
+ "\x51\xf0\x28\x8c\xf7\x47\x95\xdc\xb8\x86\xf3\xe6\x91\x8f\x54\xe7"
+ "\xc1\xb9\x89\x46\xe2\x51\x01\xbf\xa1\xcc\x70\x54\xc5\xda\x7d\xe0"
+ "\x62\xa7\x27\xf4\xb7\x94\xf6\xc4\xcb\x72\xa1\x1e\xa6\x8f\xb0\x71"
+ "\xc7\xc0\x83\x81\xfa\xf4\x0d\x9d\x2d\x44\xa7\x08\xc3\x7d\x43\xb0"
+ "\x3e\x9f\x86\x92\x76\x82\xfc\xde\x4c\xea\xf4\x4c\xbe\x85\x1a\x81"
+ "\xd6\xcb\xbc\x29\x5e\x06\xf5\xb5\x02\x6f\x83\xb8\x3f\x41\xab\xd6"
+ "\xa4\xa8\x12\xd6\xc5\xc7\x8f\x1b\x46\x82\xb8\xbf\x44\xbc\xdf\x7a"
+ "\x0a\xe6\x6b\x7f\xb9\x98\x1e\x83\x7e\x6a\xa1\xbf\xb5\x27\x61\xe5"
+ "\x03\xd8\x20\xd0\xa7\x7c\xe0\x9b\x01\xe5\x87\xe1\xfb\x61\x68\x7b"
+ "\x2d\xb7\x7f\xb3\x62\xe1\x1b\xb4\x20\x6c\x32\xb4\x13\xe7\x4a\x15"
+ "\xe6\x77\xbf\xb4\x21\x52\x06\xfd\x2e\x04\xba\x5a\xd5\x2d\x64\xec"
+ "\x59\xc5\x63\x9e\xd0\x8e\x2a\xf8\x8e\xf4\x6f\xa1\x1e\x81\xfe\x18"
+ "\xeb\xd7\xc2\x9d\xf8\x1b\x64\xa5\x2d\x1b\x45\x73\x3a\x0a\xc2\x74"
+ "\xb8\x6f\x05\xb7\xf7\x26\xfc\x06\xb9\xd4\x02\x6d\xfe\xa5\xcc\x48"
+ "\x19\xac\x9f\x65\x15\xbd\x3c\xc3\xaa\xb1\x4d\xd8\x0e\x5c\x93\x7f"
+ "\x04\x9e\xac\xb9\x47\x4d\xee\xee\x24\xb2\x8f\x5a\x09\x29\x2d\xa6"
+ "\x95\x70\x94\xc2\x51\xf2\x21\x9c\x3b\x01\x47\x2d\x94\xd7\xc1\xdf"
+ "\x0f\xe1\xef\x09\x38\x60\x4d\x1f\x80\xed\x4e\x4e\xa7\x6d\x13\x4b"
+ "\xc8\xcf\x90\x3f\x60\x6b\x41\x8b\x62\x21\xf6\xb7\x16\xf7\xa5\xa1"
+ "\x23\x1f\x4b\xb1\xda\x4b\x43\xf1\x78\x1b\x81\xf3\xf0\xd7\xc8\xfe"
+ "\x8a\x8f\x27\x42\xe1\x88\xe1\xbf\xef\x03\x9a\x53\xfc\x77\x2d\x1c"
+ "\x75\x03\x1f\xb6\xfc\x1c\x1d\x33\xa7\x38\x4f\xeb\xd4\x91\xe2\x1c"
+ "\xdd\x2c\x3d\x51\x44\x84\xc1\x91\x65\x5d\x1e\xa1\x66\x65\xf3\x02"
+ "\xd9\xef\x79\xc1\xfc\xdf\x28\x38\x40\x4e\xf3\x81\xff\xfc\x12\x56"
+ "\x36\xbf\x8a\x28\xd4\xed\x70\x74\xda\xd4\x8f\x3c\x73\x50\x9f\x3d"
+ "\x30\x07\xa1\x2e\x75\x8a\xc7\x42\x51\x47\x79\x0c\x5b\x32\x7c\x37"
+ "\x0f\xca\x42\x00\x5b\xa5\x02\x7e\x9e\xb8\xcf\x1a\x3f\x4f\xa8\x6c"
+ "\xf0\x93\x8f\xb6\x08\xc6\x4b\x4e\x05\xc3\xcb\xe1\x4b\x9b\x62\xe0"
+ "\xf7\x13\x81\xc0\xe7\x30\xc6\x8a\x80\x07\xe7\xaf\xe6\x9d\x83\x35"
+ "\x78\x2c\x51\xa0\x7d\x69\x57\x3c\xb1\x0e\x31\x8b\x75\xf3\xf5\xb2"
+ "\xb6\x40\xfb\xa0\xac\x12\xdb\xb7\x16\xf8\xc2\xef\x2a\xa0\xab\x6c"
+ "\x20\x17\x2d\x6d\xe3\xae\x79\xf1\x19\xc0\x23\xdf\x5e\xe4\x89\xd7"
+ "\x51\xa1\x5f\x21\x78\x0d\xab\x7b\xe6\x38\x28\xc7\xb5\x3d\xbe\x77"
+ "\xe7\xd1\x60\xd4\x11\xc4\x24\xfe\x6d\x30\x06\xc3\x58\x0a\x23\x66"
+ "\xcc\x35\x1f\x40\x70\x6f\xb3\x1b\x5a\x14\x33\xbd\x27\xa4\x93\x60"
+ "\xe4\x87\xf6\x1b\xfa\xd1\x58\x81\x63\x91\xf1\x1a\x83\xfd\x40\xfe"
+ "\x1f\xc2\x6a\x0a\xff\x96\x63\x7b\xe0\xbc\xa8\xde\x42\x5c\xb3\xe7"
+ "\xa5\xb1\xbe\x42\x5d\x55\x70\x7d\x35\xf6\x1d\xe5\x09\xe7\x6b\x80"
+ "\x4f\x2c\x9e\xc3\xbd\x29\xf9\xfe\x54\xe1\xfb\x8e\x28\x0f\xa4\x6f"
+ "\x80\xd5\x0b\xb7\x8f\x86\x22\x8c\xcb\xd5\x0f\xfc\xab\x51\x1f\x14"
+ "\xea\x40\x1e\x99\x46\x6a\xa4\x60\x8f\x7e\x97\xd6\x09\xbe\xcf\xac"
+ "\x2f\xad\xf5\x33\x53\x2b\xd6\x0f\x5c\x87\x76\xf0\x18\xfa\x03\x68"
+ "\x4f\xa0\x4e\x1f\xf4\x75\xa0\x2c\xdf\x5c\x00\x3c\xd6\x77\x72\xf1"
+ "\x2d\xe0\xf3\x31\xb4\x25\x1f\xf9\x40\x7b\x8e\x31\x5e\xb3\xbc\x31"
+ "\xe7\xbe\x58\xd7\x3c\xbf\x2a\xd4\x39\x37\x9e\xd3\xb8\x3e\x81\xed"
+ "\x9a\xb5\xbb\x9c\x9d\xab\x01\x9a\x1a\xda\x13\x46\xe8\x26\x35\xdb"
+ "\xab\x9a\x9d\x3b\x98\xd9\xc5\xe9\xf7\x18\xb3\x6b\xb3\xde\x4f\xce"
+ "\xa0\x6d\x42\xbb\x67\xa5\x5a\xf6\xa4\xe2\xdb\x7d\x10\xeb\xa3\x1b"
+ "\xa2\xb8\x39\x14\xeb\xc0\xeb\x79\x7e\x91\xc8\xcf\x22\xab\x09\xd0"
+ "\x0e\x26\xaf\x99\x5b\xa1\xbc\x0a\xb1\xc8\xc9\x0d\xec\xe8\xa5\x4c"
+ "\xc4\xe2\xac\x74\xb8\xfe\x70\x2e\xfe\xde\xc0\xfd\x56\x72\x36\xb6"
+ "\xf7\xfc\xcc\x63\x78\x1e\x63\x22\x79\xab\x01\x4b\x66\x42\x7e\xe6"
+ "\x47\x82\x0d\xd9\x5c\xdf\xf6\x19\x36\x85\xca\x8e\x1a\x09\xc1\x76"
+ "\x82\x8c\x6a\x3a\x0a\x66\x07\x82\xed\x8f\xc1\xb6\x82\xbd\x3e\x48"
+ "\x7f\xa7\x26\xd8\x66\xb0\x67\x7c\xfb\x66\x17\xf1\xba\x3f\x88\x7d"
+ "\x44\x79\x4e\x60\xb6\x0f\xce\x45\x3c\x80\x6d\x17\xfa\x3d\x3b\x51"
+ "\x2c\x63\xae\xdf\xa0\x07\xd4\x17\xea\x45\xc4\x13\xb1\x9f\x0f\xbc"
+ "\xf6\xb1\xdf\x0c\x1b\x28\xeb\xfc\x51\xb4\x0e\xe9\x05\xda\xf0\x37"
+ "\xf0\x9c\x06\xea\x9e\x98\xc8\xed\x8f\x2d\xc3\x7d\xc5\x80\xef\x3e"
+ "\x6d\x9a\x91\x00\x8f\x1a\x94\x29\xd0\x99\x10\x8f\xf0\xbb\x8e\xaf"
+ "\xc3\x08\xf3\xf9\x78\x38\xa6\x0a\xe3\x3f\xfc\xbc\x35\xbe\xc2\x6d"
+ "\xc7\x3f\xea\x3b\xdf\x9c\x19\x46\x38\x3c\x24\x11\xd5\x05\x45\xf8"
+ "\x36\x7e\xee\xe0\x75\x1d\x7e\xe6\x28\x8c\x17\x11\x8f\x18\x1b\x5d"
+ "\xd7\x70\x78\xdc\x30\x53\x86\x7d\x86\x6b\x6b\x78\x3e\x5c\x9f\x39"
+ "\x3c\x65\x73\x18\xa8\xa3\x1b\xa0\x9f\xbd\x38\x98\xad\xe5\xf5\x5c"
+ "\x67\x23\x13\x8b\xed\xf2\xc6\x3d\x8e\xd1\x26\x81\xdf\xfd\xeb\x8e"
+ "\x1e\xc1\x2e\xa1\xee\xcd\x9c\xee\xc3\x63\x2b\xd8\x7c\xcb\xdb\xad"
+ "\x70\x76\x7e\x94\x15\x86\xb1\x2d\x65\x1c\x7e\xb1\x2d\x99\x51\xd8"
+ "\x96\x1a\xae\x1d\x99\x2a\x72\x41\x11\xe1\x87\xf5\xc3\xb5\x95\xfc"
+ "\x78\xe5\x79\xcd\x4e\x41\x5e\xcf\x81\xad\xc2\x36\x41\xdd\xcc\xfe"
+ "\x3d\xc2\xe1\x60\x1d\xdf\xf6\xda\xce\x6c\xbc\xf6\x89\xd8\x2e\x39"
+ "\x77\x6d\xad\x4e\xf1\x78\x73\x27\xdb\x23\x6e\x18\x5c\xbf\x87\x7b"
+ "\x6e\x53\x11\x79\x0a\x6d\x34\xbe\x8f\x0c\xdf\x8f\xa8\xe6\x03\x56"
+ "\xcf\x11\x05\xf0\xf3\x42\x8c\x5a\x70\xd1\xae\x88\xdc\x8f\xfb\xc7"
+ "\x80\xac\xf7\x81\x8f\xb4\x07\xe5\x8d\x58\x06\x1f\x69\x72\x47\x41"
+ "\x44\xb3\x05\xb7\x50\x4f\x29\xca\x9e\xe9\x67\xce\x18\xc0\x71\x8d"
+ "\x80\xad\x39\x63\x78\x39\xee\x01\x39\x7a\x41\x7d\xbb\xf9\x7e\xed"
+ "\x01\x7a\xf0\xc5\x22\x77\xf0\x6d\x2f\xe1\xe9\xa7\x59\xf4\xc0\x8f"
+ "\xd5\xba\x5c\xb4\xbf\x9c\x0e\xe6\x9c\xe2\xaf\xad\xe2\xeb\x3a\x6d"
+ "\xa1\x45\x1f\x91\xdb\xef\x19\xca\xd0\x0e\x4e\x04\xdd\x73\xb6\x2f"
+ "\xad\x9b\xa3\xe3\x6d\xe3\x31\x56\x47\x64\x06\x87\x43\xf0\x7b\x04"
+ "\x1c\xcd\xd9\x67\x63\x9f\xd0\x16\xe7\xd7\x6f\x61\xfb\xe9\x21\x96"
+ "\xd0\xa6\xe2\x3a\x09\xf8\x6d\xe1\xc7\x0f\xdf\xe6\xb9\x37\x5b\x63"
+ "\x25\x32\x0e\xb0\x72\xb7\xc0\x7b\xae\x97\xbd\x79\xae\x82\xd9\xc0"
+ "\x52\x76\xcd\xdc\x85\x7c\xdf\xf6\xb1\xbe\xf1\xbf\x51\x6e\x1a\x4e"
+ "\x6e\xb7\x8a\xe4\x08\x72\x7b\x72\x1b\x4f\x5f\x83\xb6\x5c\x18\xaf"
+ "\x73\x8f\x5b\xc6\x72\x5f\x7b\xf1\xe4\x46\x1c\x0f\xa2\x76\x55\xda"
+ "\xd8\x8b\x1a\xfb\xf6\x62\x6e\x22\xdf\xdf\x4a\x9b\xb1\x51\xc5\xfb"
+ "\xbb\xdb\x2d\x7a\xa8\x37\xf0\xfb\x1a\x42\x19\xda\x4f\xac\x5b\x3c"
+ "\x07\x95\x33\xb9\xf2\x63\xf9\xc9\x95\x7d\xf5\xf0\xe4\x64\xf1\x78"
+ "\x46\x5d\xa3\x4d\x40\x1e\xa8\x53\xce\xaf\x84\x32\xa6\xd7\x27\xbd"
+ "\xd1\x36\x88\x6d\x34\xd0\x16\x9a\x29\x8e\x97\x27\xa7\x58\x8f\xc5"
+ "\xb9\x55\xfc\x58\xe4\xeb\x8e\xbc\x01\x74\x14\x2c\xaa\x77\x9f\x4d"
+ "\xbd\xa8\x9b\x63\xdc\xfe\x33\x5c\x1f\x9f\xbc\x6c\x99\xd3\x90\x1e"
+ "\xae\x4d\x85\x6b\x74\x36\xf3\x63\x3e\xb6\x0f\xea\x52\x73\x36\xab"
+ "\x98\xb3\x15\xa9\x1d\xac\x3d\xad\x15\xfc\x3c\x01\x65\xc1\x7c\x59"
+ "\x35\x3f\x97\x58\x70\x33\xcf\xba\x4d\x91\x21\xf6\xfd\xa3\xb9\x6a"
+ "\x8b\x7f\xc4\xf1\xe2\x6c\x51\x64\x28\xdf\x3f\x2c\xbb\x9b\x95\xcd"
+ "\xf5\xc6\xb2\x5c\x26\x87\x42\xca\xcd\x57\x73\xaa\xf9\xf9\x0a\xc7"
+ "\x97\x1c\x7e\xab\x70\x8c\xe1\x6f\xe0\x51\x82\xfc\x1b\xb2\xba\xd1"
+ "\xa7\x2e\xd1\x29\x22\x0e\xa3\x3d\x40\x7b\x81\xcf\x1b\x73\x7f\x67"
+ "\x73\x7f\xbf\x42\xbb\x83\x7e\x08\x9e\x07\xba\x7d\x68\x8b\xa0\xbc"
+ "\x0b\x73\x0d\xd2\x6f\xbd\x80\x6f\x64\x33\xbb\x76\xde\x70\xce\x57"
+ "\xf8\x36\xcc\xc3\x52\x66\xb9\x0e\xec\xd6\x11\xbc\x0e\xaf\xb7\xd8"
+ "\x2f\xb4\x5d\x46\xb4\x4d\x5c\x7d\xf3\xe6\xf0\x18\xe7\xd6\x0d\x16"
+ "\xbf\xa8\x47\x2e\xa2\xc5\xfd\xd9\x38\x9b\x36\xaf\x94\xd9\xb3\x79"
+ "\xdb\xf1\x5a\x4e\x7f\x60\x2b\x35\x5d\xf4\xcb\x8a\x24\xa2\x28\xbf"
+ "\x88\x76\x31\x2c\x87\xb5\x73\x5e\x1b\xeb\xc7\xbc\xb7\xb8\x7e\x30"
+ "\x9b\x9a\xcf\xda\x12\x96\x53\xde\xcd\x9d\x3b\x89\x7d\xc1\x73\x79"
+ "\xa2\x73\xb8\xdf\x22\x9c\xe3\xf6\xd6\xb3\xbd\xce\xdc\x13\xdb\x87"
+ "\xbe\xa2\x9b\x5b\xf7\x79\x95\x17\x5b\x6c\xef\xfc\x58\xd6\xce\xf9"
+ "\x63\x2d\x76\x17\xe4\x72\x10\x6d\x2f\x77\x6e\x15\x4f\x33\x9b\xff"
+ "\xcb\xd9\xf7\xf9\xf3\x98\x5c\x03\xe4\xbc\xbc\x0f\xb3\x7e\xcc\x8f"
+ "\xe3\xd6\xd9\xdf\xaa\x41\xb6\xf3\x67\x5a\x64\x2b\xfe\x8e\xe3\x07"
+ "\xea\x57\xe2\x6f\x0e\xf7\xe9\xdc\x1a\xb6\x14\x69\xb0\x4d\x6c\x8e"
+ "\x98\x17\x6a\xeb\x53\x9f\x55\xa8\xbf\xc4\x79\x89\xf9\xaa\xea\xf7"
+ "\xf9\xd8\x14\xd1\x26\xbd\x0a\xf3\xc2\x02\x6f\x8b\x8d\xa1\x1d\x61"
+ "\x04\xf7\x6d\x3a\xab\x58\x30\x1c\xcb\x70\xcf\x2d\x31\x0d\xda\xa7"
+ "\x03\xdd\x3a\x9e\xe7\xfc\x36\x8b\xdd\x40\x5b\x52\x6f\x68\xe1\x7d"
+ "\xba\x05\x25\xe5\xbc\x2d\xb9\xa0\x58\xb0\xd3\xda\x0f\x5b\xb0\xd3"
+ "\xda\x66\xa8\xf7\xdb\xda\x0c\xf0\x9b\xb7\x74\x14\x2c\x88\xb7\xf2"
+ "\x03\xa0\xac\x7f\xdb\xb1\x20\x04\xc7\x28\xee\xf7\xca\xd9\x27\x2e"
+ "\xde\xa6\x96\x59\xda\x8c\x76\xf3\xd2\x26\x4b\xfc\x42\x5d\x86\xbe"
+ "\x9a\x4d\x7d\xcd\x56\xb6\x13\xeb\xb3\xf0\x53\x10\xdc\x33\x14\xe4"
+ "\x80\xf1\x96\x05\xfb\x78\x3b\x5f\x69\x65\x2b\xf9\x39\x0c\xed\xa4"
+ "\xf5\x5c\x15\xb6\xdd\x7a\xae\x52\x6f\xeb\x6b\x23\xd5\x6a\xe7\xe7"
+ "\x2a\x75\x30\xda\x2d\x8b\x8d\xb4\xb6\x05\xea\xa8\x72\x2b\x5f\x76"
+ "\x41\xab\xc5\x97\x15\xec\xe8\x82\x14\xb4\x51\x50\x7f\x0d\x5f\xf7"
+ "\x29\x9d\xe2\x91\x26\x4b\xdd\x70\xde\xbb\x5e\x05\xd8\x2c\x08\x0b"
+ "\x01\x4c\xd5\xf0\x3e\x20\x37\x36\xbb\x71\x7f\x3f\xc5\x7c\xc4\xff"
+ "\x30\xc4\x99\x36\xe1\x22\x69\x15\xe6\x8a\x63\x97\xd6\x5a\xe4\xbb"
+ "\x70\xa5\xd8\x2f\x2c\x2b\xa6\x5b\x3b\x0a\x16\x4e\x15\xf7\x71\x3b"
+ "\x94\xe5\xf1\x31\x04\x4e\xb6\x1c\xaf\x85\x88\x6b\xab\xbe\xb1\x7e"
+ "\x2c\x0c\xc5\x7e\xe0\x9a\x08\xea\x57\xa0\xdf\x83\x7b\x3e\xc3\xb8"
+ "\xd9\x5a\xd1\x8b\xf9\xc7\x9b\xbb\xb2\xc5\xfe\x55\x58\x2b\xda\x4a"
+ "\x7e\xed\x59\x0b\xfe\x4e\xbe\x38\x16\x33\x6b\x7a\x84\x2a\x31\x29"
+ "\x2e\x21\x65\xd5\x3d\xaa\xb8\x84\xb8\x94\xb8\xe5\xf1\x71\x69\xcb"
+ "\x53\xe2\xd6\x26\x8c\x5f\xb3\xfc\xe9\xb8\xa7\x54\x1b\x96\x27\xab"
+ "\x82\x53\xc7\xa6\x0e\x23\x02\xe9\xaf\x54\xcb\x93\x93\xd7\xad\x59"
+ "\x19\xa3\x4a\x88\x7b\xea\xee\xa4\x95\xc9\x2b\x53\x54\xcb\x93\xd6"
+ "\xae\x4b\x88\x51\x8d\x8d\x99\x30\x36\xf8\xfe\x98\x61\xe2\x18\xda"
+ "\x1d\x4a\xd2\x6e\xbe\xd2\xd6\x96\x77\x85\x78\xf9\xc8\x12\x93\x7c"
+ "\x52\xe3\x12\x58\xcc\x6e\xd1\xfe\x89\x85\x24\x11\xce\x7b\x57\x14"
+ "\xa0\xac\x17\x6a\xe1\xaf\x02\xe9\xa0\x9f\x2a\xf8\xee\x05\x6d\x1f"
+ "\xdd\x51\xb0\x28\x51\xa7\x58\xaa\x46\x99\x81\x2c\x54\xd0\xb7\xd1"
+ "\xf4\x4a\x6d\x1b\xf8\x6c\x89\xf8\x9c\x41\xc5\x15\xe2\x97\xbf\x9e"
+ "\x28\xe0\xf0\x86\x43\x29\x57\x62\xac\x6b\x11\xac\x71\x16\x6b\x59"
+ "\x4c\x74\x71\xa8\xde\x37\x7d\x3c\xcd\x4f\x1f\xcf\xf4\xb2\xf8\x21"
+ "\x4b\x2c\x3c\xfc\x79\x12\x8e\xf8\x6c\x51\x2c\x0e\xe1\x74\x05\x58"
+ "\xc6\x58\xf0\xa5\x77\x1f\x0e\x01\x7f\xb0\x19\xe3\xb9\x70\xee\x21"
+ "\x83\x9c\x78\x43\xbb\x14\x47\xd3\x83\xc9\xcb\x50\x57\x72\x00\xa5"
+ "\x1d\x05\x8b\xbd\x2c\xf1\x34\xe8\x83\x12\xfa\xd2\xc4\xf7\xe3\x5b"
+ "\xae\x1f\xc5\x34\xb0\x70\x24\xb4\xaf\x00\xdb\xb3\x78\xb2\xa5\x0f"
+ "\xd0\xee\x26\x9d\x62\x51\x09\xb4\x53\x89\xed\xb2\x17\xeb\xc3\x78"
+ "\x17\xb4\x33\xc3\xbc\x1e\xe4\x76\x1b\xdb\x33\x36\xaf\x9c\x8d\x3f"
+ "\xe8\xcf\xc1\x0a\xf8\x9e\x7b\x91\x78\x6f\x4f\x22\x7e\x34\xfb\x76"
+ "\x7a\xd2\x60\x24\x0d\xb1\x4d\xc4\x67\x23\xd5\xd3\x3f\xb5\xb5\xf1"
+ "\x7d\xda\x83\xb6\xe1\x8f\xcf\x34\x29\xb0\x4f\x30\x57\x78\x57\x5c"
+ "\x74\x18\x5b\x54\xbc\x3c\x8a\x1a\xe8\x2e\xb1\xcf\x15\xe5\x8b\x32"
+ "\x41\x7f\xeb\x12\xcc\x53\xd0\x87\x4e\xa8\x3b\x82\xf7\x8d\x0d\xb4"
+ "\x27\x4a\xe4\x4b\x2d\x46\x9c\x19\x1c\xf0\xf6\xb2\xf0\xa6\x72\x6e"
+ "\xaf\xe5\x00\xa6\xff\xa8\x0c\xb8\x46\x2f\xf0\x8f\x52\xdb\xf2\x47"
+ "\x9e\xf0\x5d\x6f\xa9\x87\xad\xc3\xa3\xd0\x27\xd0\x03\x96\xf5\x0e"
+ "\xea\x0b\x2c\x28\xa6\xa7\x1a\xa0\x3c\xaf\x8b\xe0\x38\x39\x55\x51"
+ "\xcc\xf1\xaf\x01\xb9\x8f\x46\xfe\xcf\x8d\x22\x64\x0b\xd0\x5c\x2a"
+ "\x58\x1c\x81\xf1\x5d\x38\x07\xe3\x3f\x2c\xcc\x36\x66\xcd\xe3\xf9"
+ "\x57\x36\x78\x0e\x29\x40\x9f\xb0\x10\xf8\x03\x86\xf2\x2e\xc3\x3c"
+ "\x0c\xbf\x27\x14\x92\x20\xac\x07\xbe\x73\xf1\x90\x8e\x82\x25\x41"
+ "\x96\xfa\x28\xe0\x3f\xd7\xcc\x62\x30\x3c\xb6\xc6\x37\xa4\xb6\x61"
+ "\xce\x30\x7a\x14\xec\x3b\xb6\x11\x31\x06\xd7\x44\x59\x30\x05\x58"
+ "\x3f\xc5\xe1\xca\x8f\x04\xd1\x82\x28\x5d\xc5\x48\xa0\x03\x5c\x95"
+ "\x03\x9e\x10\x57\x40\xbb\xd5\x82\x29\xc0\x5a\x23\xd2\x41\x1b\x86"
+ "\x55\xa7\x85\x28\xd0\x46\xb6\x2a\x96\xe0\x2d\x2d\x25\xfd\xed\x13"
+ "\x4d\xf4\x27\x8b\x9b\x98\x9e\x96\x98\x1a\x3a\x99\x0e\x04\xb9\x2f"
+ "\x69\x14\xc9\xbd\x11\x70\x3c\x0c\xe5\xcc\x62\xd5\x4b\x4c\xd0\xb6"
+ "\x46\xce\x17\xcf\x00\x1d\x70\x73\xd5\x92\xc3\x78\x3d\x2f\xc3\x3a"
+ "\x41\x86\x4b\x03\xec\xc9\xd0\x46\x76\x0a\x3c\x68\xc1\xd2\x40\x1c"
+ "\x2b\x70\xcd\x4c\x9d\x22\xaa\xdd\xd1\xbd\x02\xa8\x43\xa1\x28\x24"
+ "\x5e\x58\xc7\x31\x3f\x8e\x3e\xdd\x52\x47\x1e\xc8\x5a\x9f\x19\xdb"
+ "\x2f\x9e\x8f\xc1\x6a\x13\x63\xe2\x78\x7d\xa0\x1f\xca\x77\xe9\x61"
+ "\xe1\x7a\x6a\xb0\xbd\x7e\xec\x53\x56\x6d\xe5\x0e\x68\x6b\xe3\xcb"
+ "\x23\x01\x47\xac\xbd\xc6\xfe\xda\x1b\xa8\x62\xf3\xa4\xf6\x0e\xc4"
+ "\xf7\xb2\xfb\x1a\x4a\x08\xc1\x32\xfe\x77\xe0\x25\x98\x7b\x6c\xe3"
+ "\xfb\x8e\xef\x37\x2c\x5b\x67\x7d\xbf\x61\x59\x8c\xa3\xfb\x0d\x36"
+ "\xf5\xbe\x85\xf5\x9a\x2b\x22\x65\xa2\xba\x4b\xcd\x76\xea\xb6\x5c"
+ "\x3f\xa1\x52\xbc\x9e\x89\xe6\xda\x50\x0f\xf3\x14\xfd\x69\xa4\x8c"
+ "\x02\x9f\x63\xdc\x1c\x1e\xcd\xfb\x2f\xe8\x17\x2d\xd3\x21\x8d\x6d"
+ "\x3f\x7a\x3f\x5e\x7e\xe8\x5b\x91\x2e\xee\x87\xe7\x23\x44\x89\x7f"
+ "\xef\xd7\x5b\x4e\xcb\xad\x88\x09\xb5\xf3\x03\xfc\xac\x5f\x72\xf4"
+ "\x14\x3e\xac\x88\xff\xcd\xb8\x28\x7a\xe9\x7b\xcf\xbb\xf1\xb9\x81"
+ "\xb5\x97\xe3\xd7\x49\x64\xec\xdb\x14\xa5\x88\x22\xb4\x9f\xab\x29"
+ "\xb1\x5c\x62\xef\xf3\x2c\x1c\x59\x91\x9e\xc0\x2f\x98\x23\xa6\xd4"
+ "\xc8\xf3\xb7\xfc\xa6\xe2\xdf\x58\x62\xfd\x1b\x3e\x1e\x51\xa2\x0a"
+ "\x6e\xf7\x88\xe1\x1e\x1b\xfb\xbf\x98\xde\x22\x79\xa5\xb8\xad\x20"
+ "\xee\x2c\x4f\xee\x8b\x0f\xfe\xd3\x09\xfc\x82\xe0\xfc\x94\x88\x5e"
+ "\x82\x9b\x0c\x9b\x45\xe4\x1f\xb1\xe6\x3f\x50\xd9\x4f\x1f\xa5\x7e"
+ "\x6e\x13\x7d\xbf\x9d\xfd\x79\x20\x7a\x10\xf9\xf7\xff\x51\x35\xde"
+ "\x60\xf9\x2a\xc0\xe3\x81\x56\x7b\xa4\x82\xfc\x7f\x65\xd1\x31\x15"
+ "\x23\x54\x38\x3f\x4d\x6b\xfd\xfb\xc1\x7c\xeb\xdf\x0f\xe9\x06\xa1"
+ "\xe5\x84\xab\x24\x53\x07\x73\x6f\xc8\xbe\xde\x42\x1f\x9b\x21\xe3"
+ "\x93\x6f\x33\x84\x84\x0f\xdf\x1a\x0f\x42\x1e\x9e\x2c\x2a\x56\xd8"
+ "\xa7\xbe\x3a\x9f\x5b\x36\xf3\x03\xe2\x76\xbd\xb2\xcf\xc9\x07\x6d"
+ "\xca\xf0\xf7\x75\x2a\xbe\x6c\xd2\xfb\x7d\xe8\xb9\x32\x95\xe8\xb7"
+ "\x2c\x04\xfe\xa9\x04\xfc\xeb\xfb\xd2\xfe\xf8\xf9\xf1\xe3\xc4\x47"
+ "\x86\xe3\xe3\xc7\xcf\x55\xfa\x50\x36\x8b\x83\x25\xe2\xfe\xe0\x7f"
+ "\xb4\xd7\x50\x52\xfe\x04\xe5\x0b\x28\xff\x65\x50\xe6\xf1\x1f\x3f"
+ "\x3f\x7e\x7e\xfc\xfc\xf8\xf9\xf1\xf3\xe3\xe7\xc7\xcf\x0f\xe0\x23"
+ "\x13\x2f\xac\xbd\xe0\xb8\x9e\xff\x2b\x5e\xff\xc8\xf8\x43\x5c\x26"
+ "\x77\xe7\x3a\xca\x7f\x48\x56\x88\x56\x55\x19\xad\x53\xe6\x47\x34"
+ "\x06\x57\x27\xea\xbd\xb6\x86\xd5\x06\xed\x89\x6d\x0b\x28\x51\x37"
+ "\x4d\xa9\x49\xed\x54\x6c\x09\x3d\x16\x58\x15\xd3\xea\x57\x18\x79"
+ "\x6a\xf2\xc1\x14\x83\x77\xce\xcc\xba\xf1\xfb\xe2\xdb\x47\x97\x46"
+ "\x35\x4f\x3d\x9c\x6e\x94\x67\x3f\xfc\xb7\x3b\x5e\x5d\xd1\x32\xb2"
+ "\x60\xee\x27\xf7\xbc\x9d\x74\x71\xd8\x8b\x8f\x7f\x78\xd7\xde\x67"
+ "\xce\xdd\xf2\xca\xa2\x7f\xfe\xea\x2f\x69\xdd\xd7\xbd\xf0\xc8\x07"
+ "\x77\xbe\xbe\xea\xec\xa8\xe2\xf9\x9f\xdd\xff\xa7\xf5\x57\x46\xe4"
+ "\xce\xae\x9f\xf0\x66\xc2\x85\xdb\xca\x97\xfe\xfb\xd7\xef\x6a\xcc"
+ "\xb2\xcd\x0f\xbd\x3f\x66\xf7\xf2\x2f\x7d\x77\xcc\xf9\x78\xd2\x5b"
+ "\xcf\x7e\x7f\xc3\xb6\xc7\x4e\x8c\x7b\x23\xee\x9b\x9b\x77\x2e\xfc"
+ "\xfc\x81\x77\x36\x76\x79\x3e\x3f\xe3\xf8\xd8\xd7\x56\x7e\xe5\x5f"
+ "\x34\xef\xf4\x7d\x87\xd6\x5d\x1e\xbe\x7d\xd6\xc9\xbb\xf7\xaf\x39"
+ "\x7f\x6b\xd9\x92\x33\xd3\x8e\x64\x98\x3c\x9e\x9b\x7e\xf4\x67\xbf"
+ "\x7b\xea\x3f\x37\xbd\xfc\xe4\xa7\xf7\xfe\x31\xf9\xd2\x8d\x2f\x3d"
+ "\xf1\xd1\x2f\xfe\xb0\xfa\xdb\x9f\xee\x5a\xfc\xaf\xff\xfb\xeb\xa6"
+ "\x9e\xeb\x7f\xf3\xe8\xdf\x7f\xfe\xfb\xa7\xbf\xfe\xc9\x6f\x17\xfc"
+ "\xe3\x97\x7f\xde\xd0\xe1\x93\x17\xde\x30\xf1\xc0\xda\xef\x6e\xaf"
+ "\x58\xf6\xc5\x83\xef\x65\x52\x77\xe4\x47\x14\xd5\x4f\x0e\xa5\xde"
+ "\x04\xe7\x11\x8b\xcb\xa3\x5d\xe6\x23\x97\xf1\xfa\x67\x05\x59\xf7"
+ "\x11\x99\x17\xb9\x4e\xe1\xc2\x8a\xc1\xd5\x7e\x3b\xf8\xa8\xc4\xd7"
+ "\x3b\xf3\xc1\xf8\xd1\x24\x38\xee\x85\xe3\xa7\x5c\x89\x10\x05\xb8"
+ "\xc3\x49\x1e\x57\xff\x23\x83\xbe\x7b\x40\xcb\x3c\xc9\x75\x20\x2d"
+ "\x2f\x72\x03\x19\x46\x6e\x24\xde\x64\x38\x19\x41\x7c\x88\x92\xf8"
+ "\x92\x91\xe4\x26\xe2\x47\xfc\xc9\x28\xf2\x13\x12\x40\x6e\x26\xb7"
+ "\x40\x6f\x46\x93\x5b\xc9\x6d\xe4\x76\x10\xca\x18\xfb\x7d\xc9\x22"
+ "\x21\x01\xf0\x0f\xfc\x1f\x41\x42\xb8\xdf\xd1\x3f\x96\x0f\x69\xb9"
+ "\x96\x2f\x6f\xe4\xcb\x75\x3f\x96\x0f\x69\xb9\xea\xbf\xfc\x77\xcc"
+ "\x7f\xf5\xaf\x0c\x5c\x07\xe6\x3d\x58\xf9\x10\xbd\x1f\xdb\x52\x19"
+ "\xff\xe9\xfd\x4d\x06\xb8\xbe\x0f\x3f\xeb\xeb\x6d\x3f\x21\x70\xf0"
+ "\x01\xd9\x4c\x42\xd8\xfd\x06\x2a\xfe\x18\x8b\x65\x7f\x53\xf8\x66"
+ "\xe1\xad\x13\x2f\xe2\xc7\xfd\x3b\xf0\x47\x9b\x02\x47\x16\x1c\x39"
+ "\x70\xe4\xc1\xb1\x0b\x8e\xd7\x2c\xbc\x89\xec\xf6\x50\x22\x53\xa5"
+ "\xc3\x5f\x1d\x91\x8d\x09\x80\x63\x1f\x91\x05\x8e\x27\xb2\x3b\xda"
+ "\x89\x6c\x6c\xbc\xd0\xf8\x09\x5b\x7b\x5b\x29\x1b\xcf\x97\xab\xe0"
+ "\xfb\x24\x71\xac\x56\xea\x7c\xa6\x9d\x11\x19\xa6\x9a\x34\x61\xf2"
+ "\x84\xfb\xee\x5d\xae\xba\x3b\xe2\x6e\xd5\x3d\xc1\x93\x26\x4d\x0c"
+ "\xbe\x7f\xe2\xa4\x5f\xaa\xee\xb9\xe7\x57\x93\x82\x7f\x15\x1c\xac"
+ "\x5a\xb3\x31\x29\x6e\x52\xf0\xd3\x2b\x55\x09\x31\x71\xc9\xaa\x55"
+ "\x71\x49\x6b\x36\x2c\x4f\x5a\xe9\x44\xd7\xa5\x7c\xa0\x2b\xe4\x56"
+ "\x13\x6b\xa6\x58\x43\x32\xf2\x20\x51\xc4\x46\x10\x45\x7a\x30\xe9"
+ "\xa3\x52\x59\x3e\xdf\xa5\x20\xfe\xe8\xf3\x59\xb3\x68\xfe\x3f\xc7"
+ "\x2e\x1e\xf1\xb7\x87\x9e\x1e\x3b\x6d\xfa\xef\xf2\xaa\x89\x3c\xa1"
+ "\x95\xc8\x57\x6d\x25\xf2\xa8\x30\x22\x8f\x48\x24\xf2\xe9\xc0\x62"
+ "\x6f\x24\x91\xef\x6e\x26\xf2\xdf\x66\x11\xf9\x4b\x39\x44\xae\xb1"
+ "\x53\xf6\xce\x56\x56\x76\x7e\x3c\x91\xb7\xec\x23\xf2\xcf\x4a\x88"
+ "\xbc\xb6\x96\x2b\xf3\xf0\x00\xbe\x5d\x01\x83\x2c\x91\xc1\xf8\x48"
+ "\xc5\x83\xec\xff\x01\x9e\x94\x72\x6b"
;
diff --git a/sys/dev/my/if_my.c b/sys/dev/my/if_my.c
index 951473a..4b59c48 100644
--- a/sys/dev/my/if_my.c
+++ b/sys/dev/my/if_my.c
@@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <sys/queue.h>
#include <sys/types.h>
-#include <sys/bus.h>
#include <sys/module.h>
#include <sys/lock.h>
#include <sys/mutex.h>
diff --git a/sys/dev/pccbb/pccbb.c b/sys/dev/pccbb/pccbb.c
index bbb9eae..3c60f37 100644
--- a/sys/dev/pccbb/pccbb.c
+++ b/sys/dev/pccbb/pccbb.c
@@ -800,24 +800,36 @@ cbb_power(device_t brdev, int volts)
* We have a shortish timeout of 500ms here. Some bridges do
* not generate a POWER_CYCLE event for 16-bit cards. In
* those cases, we have to cope the best we can, and having
- * only a short delay is better than the alternatives.
+ * only a short delay is better than the alternatives. Others
+ * raise the power cycle a smidge before it is really ready.
+ * We deal with those below.
*/
sane = 10;
while (!(cbb_get(sc, CBB_SOCKET_STATE) & CBB_STATE_POWER_CYCLE) &&
cnt == sc->powerintr && sane-- > 0)
msleep(&sc->powerintr, &sc->mtx, 0, "-", hz / 20);
mtx_unlock(&sc->mtx);
+
+ /*
+ * Relax for 100ms. Some bridges appear to assert this signal
+ * right away, but before the card has stabilized. Other
+ * cards need need more time to cope up reliabily.
+ * Experiments with troublesome setups show this to be a
+ * "cheap" way to enhance reliabilty. We need not do this for
+ * "off" since we don't touch the card after we turn it off.
+ */
+ pause("cbbPwr", min(hz / 10, 1));
+
/*
* The TOPIC95B requires a little bit extra time to get its
* act together, so delay for an additional 100ms. Also as
* documented below, it doesn't seem to set the POWER_CYCLE
* bit, so don't whine if it never came on.
*/
- if (sc->chipset == CB_TOPIC95) {
+ if (sc->chipset == CB_TOPIC95)
pause("cbb95B", hz / 10);
- } else if (sane <= 0) {
+ else if (sane <= 0)
device_printf(sc->dev, "power timeout, doom?\n");
- }
}
/*
diff --git a/sys/dev/pccbb/pccbb_pci.c b/sys/dev/pccbb/pccbb_pci.c
index c89e5ad..6cdc4e4 100644
--- a/sys/dev/pccbb/pccbb_pci.c
+++ b/sys/dev/pccbb/pccbb_pci.c
@@ -658,6 +658,12 @@ cbb_pci_shutdown(device_t brdev)
struct cbb_softc *sc = (struct cbb_softc *)device_get_softc(brdev);
/*
+ * We're about to pull the rug out from the card, so mark it as
+ * gone to prevent harm.
+ */
+ sc->cardok = 0;
+
+ /*
* Place the cards in reset, turn off the interrupts and power
* down the socket.
*/
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 9cd5a1c..7eb84e6 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -297,7 +297,7 @@ static int pci_usb_takeover = 1;
static int pci_usb_takeover = 0;
#endif
TUNABLE_INT("hw.pci.usb_early_takeover", &pci_usb_takeover);
-SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RD | CTLFLAG_TUN,
+SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RDTUN,
&pci_usb_takeover, 1, "Enable early takeover of USB controllers.\n\
Disable this if you depend on BIOS emulation of USB devices, that is\n\
you use USB devices (like keyboard or mouse) but do not load USB drivers");
@@ -347,6 +347,21 @@ pci_find_device(uint16_t vendor, uint16_t device)
return (NULL);
}
+device_t
+pci_find_class(uint8_t class, uint8_t subclass)
+{
+ struct pci_devinfo *dinfo;
+
+ STAILQ_FOREACH(dinfo, &pci_devq, pci_links) {
+ if (dinfo->cfg.baseclass == class &&
+ dinfo->cfg.subclass == subclass) {
+ return (dinfo->cfg.dev);
+ }
+ }
+
+ return (NULL);
+}
+
static int
pci_printf(pcicfgregs *cfg, const char *fmt, ...)
{
@@ -1338,8 +1353,11 @@ pci_alloc_msix_method(device_t dev, device_t child, int *count)
for (i = 0; i < max; i++) {
/* Allocate a message. */
error = PCIB_ALLOC_MSIX(device_get_parent(dev), child, &irq);
- if (error)
+ if (error) {
+ if (i == 0)
+ return (error);
break;
+ }
resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, irq,
irq, 1);
}
@@ -2482,7 +2500,8 @@ pci_write_bar(device_t dev, struct pci_map *pm, pci_addr_t base)
pci_write_config(dev, pm->pm_reg + 4, base >> 32, 4);
pm->pm_value = pci_read_config(dev, pm->pm_reg, 4);
if (ln2range == 64)
- pm->pm_value |= (pci_addr_t)pci_read_config(dev, pm->pm_reg + 4, 4) << 32;
+ pm->pm_value |= (pci_addr_t)pci_read_config(dev,
+ pm->pm_reg + 4, 4) << 32;
}
struct pci_map *
@@ -2680,7 +2699,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl,
count = (pci_addr_t)1 << mapsize;
if (basezero || base == pci_mapbase(testval)) {
start = 0; /* Let the parent decide. */
- end = ~0ULL;
+ end = ~0ul;
} else {
start = base;
end = base + count - 1;
diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c
index da8465c..fa14816 100644
--- a/sys/dev/pci/pci_pci.c
+++ b/sys/dev/pci/pci_pci.c
@@ -38,16 +38,12 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/kernel.h>
-#include <sys/libkern.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/rman.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
-#include <machine/bus.h>
-#include <machine/resource.h>
-
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pci_private.h>
@@ -771,18 +767,6 @@ pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
}
#ifdef NEW_PCIB
-static const char *
-pcib_child_name(device_t child)
-{
- static char buf[64];
-
- if (device_get_nameunit(child) != NULL)
- return (device_get_nameunit(child));
- snprintf(buf, sizeof(buf), "pci%d:%d:%d:%d", pci_get_domain(child),
- pci_get_bus(child), pci_get_slot(child), pci_get_function(child));
- return (buf);
-}
-
/*
* Attempt to allocate a resource from the existing resources assigned
* to a window.
@@ -958,7 +942,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pcib_window *w, int type,
if (bootverbose)
printf("\tback candidate range: %#lx-%#lx\n",
start_free, back);
- back = roundup2(back + 1, w->step) - 1;
+ back = roundup2(back + 1, 1ul << w->step) - 1;
back -= rman_get_end(w->res);
} else
back = 0;
@@ -1432,91 +1416,3 @@ pcib_power_for_sleep(device_t pcib, device_t dev, int *pstate)
bus = device_get_parent(pcib);
return (PCIB_POWER_FOR_SLEEP(bus, dev, pstate));
}
-
-/*
- * Try to read the bus number of a host-PCI bridge using appropriate config
- * registers.
- */
-int
-host_pcib_get_busno(pci_read_config_fn read_config, int bus, int slot, int func,
- uint8_t *busnum)
-{
- uint32_t id;
-
- id = read_config(bus, slot, func, PCIR_DEVVENDOR, 4);
- if (id == 0xffffffff)
- return (0);
-
- switch (id) {
- case 0x12258086:
- /* Intel 824?? */
- /* XXX This is a guess */
- /* *busnum = read_config(bus, slot, func, 0x41, 1); */
- *busnum = bus;
- break;
- case 0x84c48086:
- /* Intel 82454KX/GX (Orion) */
- *busnum = read_config(bus, slot, func, 0x4a, 1);
- break;
- case 0x84ca8086:
- /*
- * For the 450nx chipset, there is a whole bundle of
- * things pretending to be host bridges. The MIOC will
- * be seen first and isn't really a pci bridge (the
- * actual busses are attached to the PXB's). We need to
- * read the registers of the MIOC to figure out the
- * bus numbers for the PXB channels.
- *
- * Since the MIOC doesn't have a pci bus attached, we
- * pretend it wasn't there.
- */
- return (0);
- case 0x84cb8086:
- switch (slot) {
- case 0x12:
- /* Intel 82454NX PXB#0, Bus#A */
- *busnum = read_config(bus, 0x10, func, 0xd0, 1);
- break;
- case 0x13:
- /* Intel 82454NX PXB#0, Bus#B */
- *busnum = read_config(bus, 0x10, func, 0xd1, 1) + 1;
- break;
- case 0x14:
- /* Intel 82454NX PXB#1, Bus#A */
- *busnum = read_config(bus, 0x10, func, 0xd3, 1);
- break;
- case 0x15:
- /* Intel 82454NX PXB#1, Bus#B */
- *busnum = read_config(bus, 0x10, func, 0xd4, 1) + 1;
- break;
- }
- break;
-
- /* ServerWorks -- vendor 0x1166 */
- case 0x00051166:
- case 0x00061166:
- case 0x00081166:
- case 0x00091166:
- case 0x00101166:
- case 0x00111166:
- case 0x00171166:
- case 0x01011166:
- case 0x010f1014:
- case 0x01101166:
- case 0x02011166:
- case 0x02251166:
- case 0x03021014:
- *busnum = read_config(bus, slot, func, 0x44, 1);
- break;
-
- /* Compaq/HP -- vendor 0x0e11 */
- case 0x60100e11:
- *busnum = read_config(bus, slot, func, 0xc8, 1);
- break;
- default:
- /* Don't know how to read bus number. */
- return 0;
- }
-
- return 1;
-}
diff --git a/sys/dev/pci/pci_subr.c b/sys/dev/pci/pci_subr.c
new file mode 100644
index 0000000..2d16896
--- /dev/null
+++ b/sys/dev/pci/pci_subr.c
@@ -0,0 +1,285 @@
+/*-
+ * Copyright (c) 2011 Advanced Computing Technologies LLC
+ * Written by: John H. Baldwin <jhb@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Support APIs for Host to PCI bridge drivers and drivers that
+ * provide PCI domains.
+ */
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+#include <sys/systm.h>
+
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcib_private.h>
+
+/*
+ * Try to read the bus number of a host-PCI bridge using appropriate config
+ * registers.
+ */
+int
+host_pcib_get_busno(pci_read_config_fn read_config, int bus, int slot, int func,
+ uint8_t *busnum)
+{
+ uint32_t id;
+
+ id = read_config(bus, slot, func, PCIR_DEVVENDOR, 4);
+ if (id == 0xffffffff)
+ return (0);
+
+ switch (id) {
+ case 0x12258086:
+ /* Intel 824?? */
+ /* XXX This is a guess */
+ /* *busnum = read_config(bus, slot, func, 0x41, 1); */
+ *busnum = bus;
+ break;
+ case 0x84c48086:
+ /* Intel 82454KX/GX (Orion) */
+ *busnum = read_config(bus, slot, func, 0x4a, 1);
+ break;
+ case 0x84ca8086:
+ /*
+ * For the 450nx chipset, there is a whole bundle of
+ * things pretending to be host bridges. The MIOC will
+ * be seen first and isn't really a pci bridge (the
+ * actual busses are attached to the PXB's). We need to
+ * read the registers of the MIOC to figure out the
+ * bus numbers for the PXB channels.
+ *
+ * Since the MIOC doesn't have a pci bus attached, we
+ * pretend it wasn't there.
+ */
+ return (0);
+ case 0x84cb8086:
+ switch (slot) {
+ case 0x12:
+ /* Intel 82454NX PXB#0, Bus#A */
+ *busnum = read_config(bus, 0x10, func, 0xd0, 1);
+ break;
+ case 0x13:
+ /* Intel 82454NX PXB#0, Bus#B */
+ *busnum = read_config(bus, 0x10, func, 0xd1, 1) + 1;
+ break;
+ case 0x14:
+ /* Intel 82454NX PXB#1, Bus#A */
+ *busnum = read_config(bus, 0x10, func, 0xd3, 1);
+ break;
+ case 0x15:
+ /* Intel 82454NX PXB#1, Bus#B */
+ *busnum = read_config(bus, 0x10, func, 0xd4, 1) + 1;
+ break;
+ }
+ break;
+
+ /* ServerWorks -- vendor 0x1166 */
+ case 0x00051166:
+ case 0x00061166:
+ case 0x00081166:
+ case 0x00091166:
+ case 0x00101166:
+ case 0x00111166:
+ case 0x00171166:
+ case 0x01011166:
+ case 0x010f1014:
+ case 0x01101166:
+ case 0x02011166:
+ case 0x02251166:
+ case 0x03021014:
+ *busnum = read_config(bus, slot, func, 0x44, 1);
+ break;
+
+ /* Compaq/HP -- vendor 0x0e11 */
+ case 0x60100e11:
+ *busnum = read_config(bus, slot, func, 0xc8, 1);
+ break;
+ default:
+ /* Don't know how to read bus number. */
+ return 0;
+ }
+
+ return 1;
+}
+
+#ifdef NEW_PCIB
+/*
+ * Return a pointer to a pretty name for a PCI device. If the device
+ * has a driver attached, the device's name is used, otherwise a name
+ * is generated from the device's PCI address.
+ */
+const char *
+pcib_child_name(device_t child)
+{
+ static char buf[64];
+
+ if (device_get_nameunit(child) != NULL)
+ return (device_get_nameunit(child));
+ snprintf(buf, sizeof(buf), "pci%d:%d:%d:%d", pci_get_domain(child),
+ pci_get_bus(child), pci_get_slot(child), pci_get_function(child));
+ return (buf);
+}
+
+/*
+ * Some Host-PCI bridge drivers know which resource ranges they can
+ * decode and should only allocate subranges to child PCI devices.
+ * This API provides a way to manage this. The bridge drive should
+ * initialize this structure during attach and call
+ * pcib_host_res_decodes() on each resource range it decodes. It can
+ * then use pcib_host_res_alloc() and pcib_host_res_adjust() as helper
+ * routines for BUS_ALLOC_RESOURCE() and BUS_ADJUST_RESOURCE(). This
+ * API assumes that resources for any decoded ranges can be safely
+ * allocated from the parent via bus_generic_alloc_resource().
+ */
+int
+pcib_host_res_init(device_t pcib, struct pcib_host_resources *hr)
+{
+
+ hr->hr_pcib = pcib;
+ resource_list_init(&hr->hr_rl);
+ return (0);
+}
+
+int
+pcib_host_res_free(device_t pcib, struct pcib_host_resources *hr)
+{
+
+ resource_list_free(&hr->hr_rl);
+ return (0);
+}
+
+int
+pcib_host_res_decodes(struct pcib_host_resources *hr, int type, u_long start,
+ u_long end, u_int flags)
+{
+ struct resource_list_entry *rle;
+ int rid;
+
+ if (bootverbose)
+ device_printf(hr->hr_pcib, "decoding %d %srange %#lx-%#lx\n",
+ type, flags & RF_PREFETCHABLE ? "prefetchable ": "", start,
+ end);
+ rid = resource_list_add_next(&hr->hr_rl, type, start, end,
+ end - start + 1);
+ if (flags & RF_PREFETCHABLE) {
+ KASSERT(type == SYS_RES_MEMORY,
+ ("only memory is prefetchable"));
+ rle = resource_list_find(&hr->hr_rl, type, rid);
+ rle->flags = RLE_PREFETCH;
+ }
+ return (0);
+}
+
+struct resource *
+pcib_host_res_alloc(struct pcib_host_resources *hr, device_t dev, int type,
+ int *rid, u_long start, u_long end, u_long count, u_int flags)
+{
+ struct resource_list_entry *rle;
+ struct resource *r;
+ u_long new_start, new_end;
+
+ if (flags & RF_PREFETCHABLE)
+ KASSERT(type == SYS_RES_MEMORY,
+ ("only memory is prefetchable"));
+
+ rle = resource_list_find(&hr->hr_rl, type, 0);
+ if (rle == NULL) {
+ /*
+ * No decoding ranges for this resource type, just pass
+ * the request up to the parent.
+ */
+ return (bus_generic_alloc_resource(hr->hr_pcib, dev, type, rid,
+ start, end, count, flags));
+ }
+
+restart:
+ /* Try to allocate from each decoded range. */
+ for (; rle != NULL; rle = STAILQ_NEXT(rle, link)) {
+ if (rle->type != type)
+ continue;
+ if (((flags & RF_PREFETCHABLE) != 0) !=
+ ((rle->flags & RLE_PREFETCH) != 0))
+ continue;
+ new_start = ulmax(start, rle->start);
+ new_end = ulmin(end, rle->end);
+ if (new_start > new_end ||
+ new_start + count - 1 > new_end ||
+ new_start + count < new_start)
+ continue;
+ r = bus_generic_alloc_resource(hr->hr_pcib, dev, type, rid,
+ new_start, new_end, count, flags);
+ if (r != NULL) {
+ if (bootverbose)
+ device_printf(hr->hr_pcib,
+ "allocated type %d (%#lx-%#lx) for rid %x of %s\n",
+ type, rman_get_start(r), rman_get_end(r),
+ *rid, pcib_child_name(dev));
+ return (r);
+ }
+ }
+
+ /*
+ * If we failed to find a prefetch range for a memory
+ * resource, try again without prefetch.
+ */
+ if (flags & RF_PREFETCHABLE) {
+ flags &= ~RF_PREFETCHABLE;
+ rle = resource_list_find(&hr->hr_rl, type, 0);
+ goto restart;
+ }
+ return (NULL);
+}
+
+int
+pcib_host_res_adjust(struct pcib_host_resources *hr, device_t dev, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct resource_list_entry *rle;
+
+ rle = resource_list_find(&hr->hr_rl, type, 0);
+ if (rle == NULL) {
+ /*
+ * No decoding ranges for this resource type, just pass
+ * the request up to the parent.
+ */
+ return (bus_generic_adjust_resource(hr->hr_pcib, dev, type, r,
+ start, end));
+ }
+
+ /* Only allow adjustments that stay within a decoded range. */
+ for (; rle != NULL; rle = STAILQ_NEXT(rle, link)) {
+ if (rle->start <= start && rle->end >= end)
+ return (bus_generic_adjust_resource(hr->hr_pcib, dev,
+ type, r, start, end));
+ }
+ return (ERANGE);
+}
+#endif /* NEW_PCIB */
diff --git a/sys/dev/pci/pcib_private.h b/sys/dev/pci/pcib_private.h
index 1574deb..0561581 100644
--- a/sys/dev/pci/pcib_private.h
+++ b/sys/dev/pci/pcib_private.h
@@ -33,6 +33,31 @@
#ifndef __PCIB_PRIVATE_H__
#define __PCIB_PRIVATE_H__
+#ifdef NEW_PCIB
+/*
+ * Data structure and routines that Host to PCI bridge drivers can use
+ * to restrict allocations for child devices to ranges decoded by the
+ * bridge.
+ */
+struct pcib_host_resources {
+ device_t hr_pcib;
+ struct resource_list hr_rl;
+};
+
+int pcib_host_res_init(device_t pcib,
+ struct pcib_host_resources *hr);
+int pcib_host_res_free(device_t pcib,
+ struct pcib_host_resources *hr);
+int pcib_host_res_decodes(struct pcib_host_resources *hr, int type,
+ u_long start, u_long end, u_int flags);
+struct resource *pcib_host_res_alloc(struct pcib_host_resources *hr,
+ device_t dev, int type, int *rid, u_long start, u_long end,
+ u_long count, u_int flags);
+int pcib_host_res_adjust(struct pcib_host_resources *hr,
+ device_t dev, int type, struct resource *r, u_long start,
+ u_long end);
+#endif
+
/*
* Export portions of generic PCI:PCI bridge support so that it can be
* used by subclasses.
@@ -90,6 +115,9 @@ struct pcib_softc
typedef uint32_t pci_read_config_fn(int b, int s, int f, int reg, int width);
+#ifdef NEW_PCIB
+const char *pcib_child_name(device_t child);
+#endif
int host_pcib_get_busno(pci_read_config_fn read_config, int bus,
int slot, int func, uint8_t *busnum);
int pcib_attach(device_t dev);
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index ae3fe79..8fd84a7 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -457,6 +457,7 @@ pci_msix_count(device_t dev)
device_t pci_find_bsf(uint8_t, uint8_t, uint8_t);
device_t pci_find_dbsf(uint32_t, uint8_t, uint8_t, uint8_t);
device_t pci_find_device(uint16_t, uint16_t);
+device_t pci_find_class(uint8_t class, uint8_t subclass);
/* Can be used by drivers to manage the MSI-X table. */
int pci_pending_msix(device_t dev, u_int index);
diff --git a/sys/dev/ppbus/if_plip.c b/sys/dev/ppbus/if_plip.c
index fc81aec..281baf2 100644
--- a/sys/dev/ppbus/if_plip.c
+++ b/sys/dev/ppbus/if_plip.c
@@ -585,6 +585,8 @@ lp_intr(void *arg)
if (bpf_peers_present(sc->sc_ifp->if_bpf))
lptap(sc->sc_ifp, top);
+ M_SETFIB(top, sc->sc_ifp->if_fib);
+
/* mbuf is free'd on failure. */
netisr_queue(NETISR_IP, top);
ppb_lock(ppbus);
@@ -637,6 +639,8 @@ lp_intr(void *arg)
if (bpf_peers_present(sc->sc_ifp->if_bpf))
lptap(sc->sc_ifp, top);
+ M_SETFIB(top, sc->sc_ifp->if_fib);
+
/* mbuf is free'd on failure. */
netisr_queue(NETISR_IP, top);
ppb_lock(ppbus);
diff --git a/sys/dev/pty/pty.c b/sys/dev/pty/pty.c
index 5a542cb..5e2d822 100644
--- a/sys/dev/pty/pty.c
+++ b/sys/dev/pty/pty.c
@@ -79,7 +79,7 @@ ptydev_fdopen(struct cdev *dev, int fflags, struct thread *td, struct file *fp)
/* Raise a warning when a legacy PTY has been allocated. */
if (pty_warningcnt > 0) {
pty_warningcnt--;
- log(LOG_INFO, "pid %d (%s) is using legacy pty devices%s\n",
+ log(LOG_INFO, "pid %d (%s) is using legacy pty devices%s\n",
td->td_proc->p_pid, td->td_name,
pty_warningcnt ? "" : " - not logging anymore");
}
@@ -139,8 +139,8 @@ static int
pty_modevent(module_t mod, int type, void *data)
{
- switch(type) {
- case MOD_LOAD:
+ switch(type) {
+ case MOD_LOAD:
EVENTHANDLER_REGISTER(dev_clone, pty_clone, 0, 1000);
make_dev_credf(MAKEDEV_ETERNAL_KLD, &ptmx_cdevsw, 0, NULL,
UID_ROOT, GID_WHEEL, 0666, "ptmx");
diff --git a/sys/dev/rt/if_rt.c b/sys/dev/rt/if_rt.c
new file mode 100644
index 0000000..22105dc
--- /dev/null
+++ b/sys/dev/rt/if_rt.c
@@ -0,0 +1,2616 @@
+/*-
+ * Copyright (c) 2011, Aleksandr Rybalko
+ * based on hard work
+ * by Alexander Egorenkov <egorenar@gmail.com>
+ * and by Damien Bergamini <damien.bergamini@free.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "if_rtvar.h"
+#include "if_rtreg.h"
+
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/ethernet.h>
+#include <net/if_dl.h>
+#include <net/if_media.h>
+#include <net/if_types.h>
+#include <net/if_vlan_var.h>
+
+#include <net/bpf.h>
+
+#include <machine/bus.h>
+#include <machine/cache.h>
+#include <machine/cpufunc.h>
+#include <machine/resource.h>
+#include <vm/vm_param.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <machine/pmap.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <dev/mii/mii.h>
+#include <dev/mii/miivar.h>
+
+#include <mips/rt305x/rt305x_sysctlvar.h>
+#include <mips/rt305x/rt305xreg.h>
+
+#ifdef IF_RT_PHY_SUPPORT
+#include "miibus_if.h"
+#endif
+
+/*
+ * Defines and macros
+ */
+#define RT_MAX_AGG_SIZE 3840
+
+#define RT_TX_DATA_SEG0_SIZE MJUMPAGESIZE
+
+#define RT_MS(_v, _f) (((_v) & _f) >> _f##_S)
+#define RT_SM(_v, _f) (((_v) << _f##_S) & _f)
+
+#define RT_TX_WATCHDOG_TIMEOUT 5
+
+/*
+ * Static function prototypes
+ */
+static int rt_probe(device_t dev);
+static int rt_attach(device_t dev);
+static int rt_detach(device_t dev);
+static int rt_shutdown(device_t dev);
+static int rt_suspend(device_t dev);
+static int rt_resume(device_t dev);
+static void rt_init_locked(void *priv);
+static void rt_init(void *priv);
+static void rt_stop_locked(void *priv);
+static void rt_stop(void *priv);
+static void rt_start(struct ifnet *ifp);
+static int rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
+static void rt_periodic(void *arg);
+static void rt_tx_watchdog(void *arg);
+static void rt_intr(void *arg);
+static void rt_tx_coherent_intr(struct rt_softc *sc);
+static void rt_rx_coherent_intr(struct rt_softc *sc);
+static void rt_rx_delay_intr(struct rt_softc *sc);
+static void rt_tx_delay_intr(struct rt_softc *sc);
+static void rt_rx_intr(struct rt_softc *sc);
+static void rt_tx_intr(struct rt_softc *sc, int qid);
+static void rt_rx_done_task(void *context, int pending);
+static void rt_tx_done_task(void *context, int pending);
+static void rt_periodic_task(void *context, int pending);
+static int rt_rx_eof(struct rt_softc *sc, int limit);
+static void rt_tx_eof(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring);
+static void rt_update_stats(struct rt_softc *sc);
+static void rt_watchdog(struct rt_softc *sc);
+static void rt_update_raw_counters(struct rt_softc *sc);
+static void rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask);
+static void rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask);
+static int rt_txrx_enable(struct rt_softc *sc);
+static int rt_alloc_rx_ring(struct rt_softc *sc,
+ struct rt_softc_rx_ring *ring);
+static void rt_reset_rx_ring(struct rt_softc *sc,
+ struct rt_softc_rx_ring *ring);
+static void rt_free_rx_ring(struct rt_softc *sc,
+ struct rt_softc_rx_ring *ring);
+static int rt_alloc_tx_ring(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring, int qid);
+static void rt_reset_tx_ring(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring);
+static void rt_free_tx_ring(struct rt_softc *sc,
+ struct rt_softc_tx_ring *ring);
+static void rt_dma_map_addr(void *arg, bus_dma_segment_t *segs,
+ int nseg, int error);
+static void rt_sysctl_attach(struct rt_softc *sc);
+#ifdef IF_RT_PHY_SUPPORT
+void rt_miibus_statchg(device_t);
+static int rt_miibus_readreg(device_t, int, int);
+static int rt_miibus_writereg(device_t, int, int, int);
+#endif
+static int rt_ifmedia_upd(struct ifnet *);
+static void rt_ifmedia_sts(struct ifnet *, struct ifmediareq *);
+
+SYSCTL_NODE(_hw, OID_AUTO, rt, CTLFLAG_RD, 0, "RT driver parameters");
+#ifdef IF_RT_DEBUG
+static int rt_debug = 0;
+SYSCTL_INT(_hw_rt, OID_AUTO, debug, CTLFLAG_RW, &rt_debug, 0,
+ "RT debug level");
+TUNABLE_INT("hw.rt.debug", &rt_debug);
+#endif
+
+static int
+rt_probe(device_t dev)
+{
+ device_set_desc(dev, "Ralink RT305XF onChip Ethernet MAC");
+ return (0);
+}
+
+/*
+ * macaddr_atoi - translate string MAC address to uint8_t array
+ */
+static int
+macaddr_atoi(const char *str, uint8_t *mac)
+{
+ int count, i;
+ unsigned int amac[ETHER_ADDR_LEN]; /* Aligned version */
+
+ count = sscanf(str, "%x%*c%x%*c%x%*c%x%*c%x%*c%x",
+ &amac[0], &amac[1], &amac[2],
+ &amac[3], &amac[4], &amac[5]);
+ if (count < ETHER_ADDR_LEN) {
+ memset(mac, 0, ETHER_ADDR_LEN);
+ return (1);
+ }
+
+ /* Copy aligned to result */
+ for (i = 0; i < ETHER_ADDR_LEN; i ++)
+ mac[i] = (amac[i] & 0xff);
+
+ return (0);
+}
+
+#ifdef USE_GENERATED_MAC_ADDRESS
+static char *
+kernenv_next(char *cp)
+{
+
+ if (cp != NULL) {
+ while (*cp != 0)
+ cp++;
+ cp++;
+ if (*cp == 0)
+ cp = NULL;
+ }
+ return (cp);
+}
+
+/*
+ * generate_mac(uin8_t *mac)
+ * This is MAC address generator for cases when real device MAC address
+ * unknown or not yet accessible.
+ * Use 'b','s','d' signature and 3 octets from CRC32 on kenv.
+ * MAC = 'b', 's', 'd', CRC[3]^CRC[2], CRC[1], CRC[0]
+ *
+ * Output - MAC address, that do not change between reboots, if hints or
+ * bootloader info unchange.
+ */
+static void
+generate_mac(uint8_t *mac)
+{
+ unsigned char *cp;
+ int i = 0;
+ uint32_t crc = 0xffffffff;
+
+ /* Generate CRC32 on kenv */
+ if (dynamic_kenv) {
+ for (cp = kenvp[0]; cp != NULL; cp = kenvp[++i]) {
+ crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
+ }
+ } else {
+ for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
+ crc = calculate_crc32c(crc, cp, strlen(cp) + 1);
+ }
+ }
+ crc = ~crc;
+
+ mac[0] = 'b';
+ mac[1] = 's';
+ mac[2] = 'd';
+ mac[3] = (crc >> 24) ^ ((crc >> 16) & 0xff);
+ mac[4] = (crc >> 8) & 0xff;
+ mac[5] = crc & 0xff;
+}
+#endif
+
+/*
+ * ether_request_mac - try to find usable MAC address.
+ */
+static int
+ether_request_mac(device_t dev, uint8_t *mac)
+{
+ char *var;
+
+ /*
+ * "ethaddr" is passed via envp on RedBoot platforms
+ * "kmac" is passed via argv on RouterBOOT platforms
+ */
+#if defined(__U_BOOT__) || defined(__REDBOOT__) || defined(__ROUTERBOOT__)
+ if ((var = getenv("ethaddr")) != NULL ||
+ (var = getenv("kmac")) != NULL ) {
+
+ if(!macaddr_atoi(var, mac)) {
+ printf("%s: use %s macaddr from KENV\n",
+ device_get_nameunit(dev), var);
+ freeenv(var);
+ return (0);
+ }
+ freeenv(var);
+ }
+#endif
+
+ /*
+ * Try from hints
+ * hint.[dev].[unit].macaddr
+ */
+ if (!resource_string_value(device_get_name(dev),
+ device_get_unit(dev), "macaddr", (const char **)&var)) {
+
+ if(!macaddr_atoi(var, mac)) {
+ printf("%s: use %s macaddr from hints\n",
+ device_get_nameunit(dev), var);
+ return (0);
+ }
+ }
+
+#ifdef USE_GENERATED_MAC_ADDRESS
+ generate_mac(mac);
+
+ device_printf(dev, "use generated %02x:%02x:%02x:%02x:%02x:%02x "
+ "macaddr\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+#else
+ /* Hardcoded */
+ mac[0] = 0x00;
+ mac[1] = 0x18;
+ mac[2] = 0xe7;
+ mac[3] = 0xd5;
+ mac[4] = 0x83;
+ mac[5] = 0x90;
+
+ device_printf(dev, "use hardcoded 00:18:e7:d5:83:90 macaddr\n");
+#endif
+
+ return (0);
+}
+
+static int
+rt_attach(device_t dev)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ int error, i;
+
+ sc = device_get_softc(dev);
+ sc->dev = dev;
+
+ mtx_init(&sc->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK,
+ MTX_DEF | MTX_RECURSE);
+
+ sc->mem_rid = 0;
+ sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid,
+ RF_ACTIVE);
+ if (sc->mem == NULL) {
+ device_printf(dev, "could not allocate memory resource\n");
+ error = ENXIO;
+ goto fail;
+ }
+
+ sc->bst = rman_get_bustag(sc->mem);
+ sc->bsh = rman_get_bushandle(sc->mem);
+
+ sc->irq_rid = 0;
+ sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid,
+ RF_ACTIVE);
+ if (sc->irq == NULL) {
+ device_printf(dev,
+ "could not allocate interrupt resource\n");
+ error = ENXIO;
+ goto fail;
+ }
+
+#ifdef IF_RT_DEBUG
+ sc->debug = rt_debug;
+
+ SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
+ "debug", CTLFLAG_RW, &sc->debug, 0, "rt debug level");
+#endif
+
+ device_printf(dev, "RT305XF Ethernet MAC (rev 0x%08x)\n",
+ sc->mac_rev);
+
+ /* Reset hardware */
+ RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET);
+
+ RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG,
+ (
+ GDM_ICS_EN | /* Enable IP Csum */
+ GDM_TCS_EN | /* Enable TCP Csum */
+ GDM_UCS_EN | /* Enable UDP Csum */
+ GDM_STRPCRC | /* Strip CRC from packet */
+ GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */
+ GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */
+ GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */
+ GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */
+ ));
+
+ /* allocate Tx and Rx rings */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) {
+ error = rt_alloc_tx_ring(sc, &sc->tx_ring[i], i);
+ if (error != 0) {
+ device_printf(dev, "could not allocate Tx ring #%d\n",
+ i);
+ goto fail;
+ }
+ }
+
+ sc->tx_ring_mgtqid = 5;
+
+ error = rt_alloc_rx_ring(sc, &sc->rx_ring);
+ if (error != 0) {
+ device_printf(dev, "could not allocate Rx ring\n");
+ goto fail;
+ }
+
+ callout_init(&sc->periodic_ch, 0);
+ callout_init_mtx(&sc->tx_watchdog_ch, &sc->lock, 0);
+
+ ifp = sc->ifp = if_alloc(IFT_ETHER);
+ if (ifp == NULL) {
+ device_printf(dev, "could not if_alloc()\n");
+ error = ENOMEM;
+ goto fail;
+ }
+
+ ifp->if_softc = sc;
+ if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev));
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ ifp->if_init = rt_init;
+ ifp->if_ioctl = rt_ioctl;
+ ifp->if_start = rt_start;
+ ifp->if_mtu = ETHERMTU;
+#define RT_TX_QLEN 256
+
+ IFQ_SET_MAXLEN(&ifp->if_snd, RT_TX_QLEN);
+ ifp->if_snd.ifq_drv_maxlen = RT_TX_QLEN;
+ IFQ_SET_READY(&ifp->if_snd);
+
+#ifdef IF_RT_PHY_SUPPORT
+ error = mii_attach(dev, &sc->rt_miibus, ifp, rt_ifmedia_upd,
+ rt_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, MII_OFFSET_ANY, 0);
+ if (error != 0) {
+ device_printf(dev, "attaching PHYs failed\n");
+ error = ENXIO;
+ goto fail;
+ }
+#else
+ ifmedia_init(&sc->rt_ifmedia, 0, rt_ifmedia_upd, rt_ifmedia_sts);
+ ifmedia_add(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX, 0,
+ NULL);
+ ifmedia_set(&sc->rt_ifmedia, IFM_ETHER | IFM_100_TX | IFM_FDX);
+
+#endif /* IF_RT_PHY_SUPPORT */
+
+ ether_request_mac(dev, sc->mac_addr);
+ ether_ifattach(ifp, sc->mac_addr);
+
+ /*
+ * Tell the upper layer(s) we support long frames.
+ */
+ ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
+ ifp->if_capabilities |= IFCAP_VLAN_MTU;
+ ifp->if_capenable |= IFCAP_VLAN_MTU;
+ ifp->if_capabilities |= IFCAP_RXCSUM|IFCAP_TXCSUM;
+ ifp->if_capenable |= IFCAP_RXCSUM|IFCAP_TXCSUM;
+
+ /* init task queue */
+ TASK_INIT(&sc->rx_done_task, 0, rt_rx_done_task, sc);
+ TASK_INIT(&sc->tx_done_task, 0, rt_tx_done_task, sc);
+ TASK_INIT(&sc->periodic_task, 0, rt_periodic_task, sc);
+
+ sc->rx_process_limit = 100;
+
+ sc->taskqueue = taskqueue_create("rt_taskq", M_NOWAIT,
+ taskqueue_thread_enqueue, &sc->taskqueue);
+
+ taskqueue_start_threads(&sc->taskqueue, 1, PI_NET, "%s taskq",
+ device_get_nameunit(sc->dev));
+
+ rt_sysctl_attach(sc);
+
+ /* set up interrupt */
+ error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE,
+ NULL, rt_intr, sc, &sc->irqh);
+ if (error != 0) {
+ printf("%s: could not set up interrupt\n",
+ device_get_nameunit(dev));
+ goto fail;
+ }
+#ifdef IF_RT_DEBUG
+ device_printf(dev, "debug var at %#08x\n", (u_int)&(sc->debug));
+#endif
+
+ return (0);
+
+fail:
+ /* free Tx and Rx rings */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_free_tx_ring(sc, &sc->tx_ring[i]);
+
+ rt_free_rx_ring(sc, &sc->rx_ring);
+
+ mtx_destroy(&sc->lock);
+
+ if (sc->mem != NULL)
+ bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid,
+ sc->mem);
+
+ if (sc->irq != NULL)
+ bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid,
+ sc->irq);
+
+ return (error);
+}
+
+/*
+ * Set media options.
+ */
+static int
+rt_ifmedia_upd(struct ifnet *ifp)
+{
+ struct rt_softc *sc;
+#ifdef IF_RT_PHY_SUPPORT
+ struct mii_data *mii;
+ int error = 0;
+
+ sc = ifp->if_softc;
+ RT_SOFTC_LOCK(sc);
+
+ mii = device_get_softc(sc->rt_miibus);
+ if (mii->mii_instance) {
+ struct mii_softc *miisc;
+ for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
+ miisc = LIST_NEXT(miisc, mii_list))
+ mii_phy_reset(miisc);
+ }
+ if (mii)
+ error = mii_mediachg(mii);
+ RT_SOFTC_UNLOCK(sc);
+
+ return (error);
+
+#else /* !IF_RT_PHY_SUPPORT */
+
+ struct ifmedia *ifm;
+ struct ifmedia_entry *ife;
+
+ sc = ifp->if_softc;
+ ifm = &sc->rt_ifmedia;
+ ife = ifm->ifm_cur;
+
+ if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
+ return (EINVAL);
+
+ if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+ device_printf(sc->dev,
+ "AUTO is not supported for multiphy MAC");
+ return (EINVAL);
+ }
+
+ /*
+ * Ignore everything
+ */
+ return (0);
+#endif /* IF_RT_PHY_SUPPORT */
+}
+
+/*
+ * Report current media status.
+ */
+static void
+rt_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+{
+#ifdef IF_RT_PHY_SUPPORT
+ struct rt_softc *sc;
+ struct mii_data *mii;
+
+ sc = ifp->if_softc;
+
+ RT_SOFTC_LOCK(sc);
+ mii = device_get_softc(sc->rt_miibus);
+ mii_pollstat(mii);
+ ifmr->ifm_active = mii->mii_media_active;
+ ifmr->ifm_status = mii->mii_media_status;
+ ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX;
+ ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE;
+ RT_SOFTC_UNLOCK(sc);
+#else /* !IF_RT_PHY_SUPPORT */
+
+ ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE;
+ ifmr->ifm_active = IFM_ETHER | IFM_100_TX | IFM_FDX;
+#endif /* IF_RT_PHY_SUPPORT */
+}
+
+static int
+rt_detach(device_t dev)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ int i;
+
+ sc = device_get_softc(dev);
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "detaching\n");
+
+ RT_SOFTC_LOCK(sc);
+
+ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+
+ callout_stop(&sc->periodic_ch);
+ callout_stop(&sc->tx_watchdog_ch);
+
+ taskqueue_drain(sc->taskqueue, &sc->rx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->tx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->periodic_task);
+
+ /* free Tx and Rx rings */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_free_tx_ring(sc, &sc->tx_ring[i]);
+
+ rt_free_rx_ring(sc, &sc->rx_ring);
+
+ RT_SOFTC_UNLOCK(sc);
+
+#ifdef IF_RT_PHY_SUPPORT
+ if (sc->rt_miibus != NULL)
+ device_delete_child(dev, sc->rt_miibus);
+#endif
+
+ ether_ifdetach(ifp);
+ if_free(ifp);
+
+ taskqueue_free(sc->taskqueue);
+
+ mtx_destroy(&sc->lock);
+
+ bus_generic_detach(dev);
+ bus_teardown_intr(dev, sc->irq, sc->irqh);
+ bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq);
+ bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem);
+
+ return (0);
+}
+
+static int
+rt_shutdown(device_t dev)
+{
+ struct rt_softc *sc;
+
+ sc = device_get_softc(dev);
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "shutting down\n");
+ rt_stop(sc);
+
+ return (0);
+}
+
+static int
+rt_suspend(device_t dev)
+{
+ struct rt_softc *sc;
+
+ sc = device_get_softc(dev);
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "suspending\n");
+ rt_stop(sc);
+
+ return (0);
+}
+
+static int
+rt_resume(device_t dev)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = device_get_softc(dev);
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "resuming\n");
+
+ if (ifp->if_flags & IFF_UP)
+ rt_init(sc);
+
+ return (0);
+}
+
+/*
+ * rt_init_locked - Run initialization process having locked mtx.
+ */
+static void
+rt_init_locked(void *priv)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+#ifdef IF_RT_PHY_SUPPORT
+ struct mii_data *mii;
+#endif
+ int i, ntries;
+ uint32_t tmp;
+
+ sc = priv;
+ ifp = sc->ifp;
+#ifdef IF_RT_PHY_SUPPORT
+ mii = device_get_softc(sc->rt_miibus);
+#endif
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "initializing\n");
+
+ RT_SOFTC_ASSERT_LOCKED(sc);
+
+ /* hardware reset */
+ RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET);
+ rt305x_sysctl_set(SYSCTL_RSTCTRL, SYSCTL_RSTCTRL_FRENG);
+
+ /* Fwd to CPU (uni|broad|multi)cast and Unknown */
+ RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG,
+ (
+ GDM_ICS_EN | /* Enable IP Csum */
+ GDM_TCS_EN | /* Enable TCP Csum */
+ GDM_UCS_EN | /* Enable UDP Csum */
+ GDM_STRPCRC | /* Strip CRC from packet */
+ GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */
+ GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */
+ GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */
+ GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */
+ ));
+
+ /* disable DMA engine */
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, 0);
+ RT_WRITE(sc, PDMA_BASE + PDMA_RST_IDX, 0xffffffff);
+
+ /* wait while DMA engine is busy */
+ for (ntries = 0; ntries < 100; ntries++) {
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY)))
+ break;
+ DELAY(1000);
+ }
+
+ if (ntries == 100) {
+ device_printf(sc->dev, "timeout waiting for DMA engine\n");
+ goto fail;
+ }
+
+ /* reset Rx and Tx rings */
+ tmp = FE_RST_DRX_IDX0 |
+ FE_RST_DTX_IDX3 |
+ FE_RST_DTX_IDX2 |
+ FE_RST_DTX_IDX1 |
+ FE_RST_DTX_IDX0;
+
+ RT_WRITE(sc, PDMA_BASE + PDMA_RST_IDX, tmp);
+
+ /* XXX switch set mac address */
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_reset_tx_ring(sc, &sc->tx_ring[i]);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) {
+ /* update TX_BASE_PTRx */
+ RT_WRITE(sc, PDMA_BASE + TX_BASE_PTR(i),
+ sc->tx_ring[i].desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + TX_MAX_CNT(i),
+ RT_SOFTC_TX_RING_DESC_COUNT);
+ RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(i), 0);
+ }
+
+ /* init Rx ring */
+ rt_reset_rx_ring(sc, &sc->rx_ring);
+
+ /* update RX_BASE_PTR0 */
+ RT_WRITE(sc, PDMA_BASE + RX_BASE_PTR0,
+ sc->rx_ring.desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + RX_MAX_CNT0,
+ RT_SOFTC_RX_RING_DATA_COUNT);
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ RT_SOFTC_RX_RING_DATA_COUNT - 1);
+
+ /* write back DDONE, 16byte burst enable RX/TX DMA */
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG,
+ FE_TX_WB_DDONE | FE_DMA_BT_SIZE16 | FE_RX_DMA_EN | FE_TX_DMA_EN);
+
+ /* disable interrupts mitigation */
+ RT_WRITE(sc, PDMA_BASE + DELAY_INT_CFG, 0);
+
+ /* clear pending interrupts */
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_STATUS, 0xffffffff);
+
+ /* enable interrupts */
+ tmp = CNT_PPE_AF |
+ CNT_GDM_AF |
+ PSE_P2_FC |
+ GDM_CRC_DROP |
+ PSE_BUF_DROP |
+ GDM_OTHER_DROP |
+ PSE_P1_FC |
+ PSE_P0_FC |
+ PSE_FQ_EMPTY |
+ INT_TX_COHERENT |
+ INT_RX_COHERENT |
+ INT_TXQ3_DONE |
+ INT_TXQ2_DONE |
+ INT_TXQ1_DONE |
+ INT_TXQ0_DONE |
+ INT_RX_DONE;
+
+ sc->intr_enable_mask = tmp;
+
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp);
+
+ if (rt_txrx_enable(sc) != 0)
+ goto fail;
+
+#ifdef IF_RT_PHY_SUPPORT
+ if (mii) mii_mediachg(mii);
+#endif /* IF_RT_PHY_SUPPORT */
+
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+
+ sc->periodic_round = 0;
+
+ callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc);
+
+ return;
+
+fail:
+ rt_stop_locked(sc);
+}
+
+/*
+ * rt_init - lock and initialize device.
+ */
+static void
+rt_init(void *priv)
+{
+ struct rt_softc *sc;
+
+ sc = priv;
+ RT_SOFTC_LOCK(sc);
+ rt_init_locked(sc);
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_stop_locked - stop TX/RX w/ lock
+ */
+static void
+rt_stop_locked(void *priv)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = priv;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_ANY, "stopping\n");
+
+ RT_SOFTC_ASSERT_LOCKED(sc);
+ sc->tx_timer = 0;
+ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+ callout_stop(&sc->periodic_ch);
+ callout_stop(&sc->tx_watchdog_ch);
+ RT_SOFTC_UNLOCK(sc);
+ taskqueue_block(sc->taskqueue);
+
+ /*
+ * Sometime rt_stop_locked called from isr and we get panic
+ * When found, I fix it
+ */
+#ifdef notyet
+ taskqueue_drain(sc->taskqueue, &sc->rx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->tx_done_task);
+ taskqueue_drain(sc->taskqueue, &sc->periodic_task);
+#endif
+ RT_SOFTC_LOCK(sc);
+
+ /* disable interrupts */
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, 0);
+
+ /* reset adapter */
+ RT_WRITE(sc, GE_PORT_BASE + FE_RST_GLO, PSE_RESET);
+
+ RT_WRITE(sc, GDMA1_BASE + GDMA_FWD_CFG,
+ (
+ GDM_ICS_EN | /* Enable IP Csum */
+ GDM_TCS_EN | /* Enable TCP Csum */
+ GDM_UCS_EN | /* Enable UDP Csum */
+ GDM_STRPCRC | /* Strip CRC from packet */
+ GDM_DST_PORT_CPU << GDM_UFRC_P_SHIFT | /* Forward UCast to CPU */
+ GDM_DST_PORT_CPU << GDM_BFRC_P_SHIFT | /* Forward BCast to CPU */
+ GDM_DST_PORT_CPU << GDM_MFRC_P_SHIFT | /* Forward MCast to CPU */
+ GDM_DST_PORT_CPU << GDM_OFRC_P_SHIFT /* Forward Other to CPU */
+ ));
+}
+
+static void
+rt_stop(void *priv)
+{
+ struct rt_softc *sc;
+
+ sc = priv;
+ RT_SOFTC_LOCK(sc);
+ rt_stop_locked(sc);
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_tx_data - transmit packet.
+ */
+static int
+rt_tx_data(struct rt_softc *sc, struct mbuf *m, int qid)
+{
+ struct ifnet *ifp;
+ struct rt_softc_tx_ring *ring;
+ struct rt_softc_tx_data *data;
+ struct rt_txdesc *desc;
+ struct mbuf *m_d;
+ bus_dma_segment_t dma_seg[RT_SOFTC_MAX_SCATTER];
+ int error, ndmasegs, ndescs, i;
+
+ KASSERT(qid >= 0 && qid < RT_SOFTC_TX_RING_COUNT,
+ ("%s: Tx data: invalid qid=%d\n",
+ device_get_nameunit(sc->dev), qid));
+
+ RT_SOFTC_TX_RING_ASSERT_LOCKED(&sc->tx_ring[qid]);
+
+ ifp = sc->ifp;
+ ring = &sc->tx_ring[qid];
+ desc = &ring->desc[ring->desc_cur];
+ data = &ring->data[ring->data_cur];
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m,
+ dma_seg, &ndmasegs, 0);
+ if (error != 0) {
+ /* too many fragments, linearize */
+
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "could not load mbuf DMA map, trying to linearize "
+ "mbuf: ndmasegs=%d, len=%d, error=%d\n",
+ ndmasegs, m->m_pkthdr.len, error);
+
+ m_d = m_collapse(m, M_DONTWAIT, 16);
+ if (m_d == NULL) {
+ m_freem(m);
+ m = NULL;
+ return (ENOMEM);
+ }
+ m = m_d;
+
+ sc->tx_defrag_packets++;
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag,
+ data->dma_map, m, dma_seg, &ndmasegs, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load mbuf DMA map: "
+ "ndmasegs=%d, len=%d, error=%d\n",
+ ndmasegs, m->m_pkthdr.len, error);
+ m_freem(m);
+ return (error);
+ }
+ }
+
+ if (m->m_pkthdr.len == 0)
+ ndmasegs = 0;
+
+ /* determine how many Tx descs are required */
+ ndescs = 1 + ndmasegs / 2;
+ if ((ring->desc_queued + ndescs) >
+ (RT_SOFTC_TX_RING_DESC_COUNT - 2)) {
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "there are not enough Tx descs\n");
+
+ sc->no_tx_desc_avail++;
+
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(m);
+ return (EFBIG);
+ }
+
+ data->m = m;
+
+ /* set up Tx descs */
+ for (i = 0; i < ndmasegs; i += 2) {
+ /* Set destenation */
+ desc->dst = (TXDSCR_DST_PORT_GDMA1);
+ if ((ifp->if_capenable & IFCAP_TXCSUM) != 0)
+ desc->dst |= (TXDSCR_IP_CSUM_GEN|TXDSCR_UDP_CSUM_GEN|
+ TXDSCR_TCP_CSUM_GEN);
+ /* Set queue id */
+ desc->qn = qid;
+ /* No PPPoE */
+ desc->pppoe = 0;
+ /* No VLAN */
+ desc->vid = 0;
+
+ desc->sdp0 = htole32(dma_seg[i].ds_addr);
+ desc->sdl0 = htole16(dma_seg[i].ds_len |
+ ( ((i+1) == ndmasegs )?RT_TXDESC_SDL0_LASTSEG:0 ));
+
+ if ((i+1) < ndmasegs) {
+ desc->sdp1 = htole32(dma_seg[i+1].ds_addr);
+ desc->sdl1 = htole16(dma_seg[i+1].ds_len |
+ ( ((i+2) == ndmasegs )?RT_TXDESC_SDL1_LASTSEG:0 ));
+ } else {
+ desc->sdp1 = 0;
+ desc->sdl1 = 0;
+ }
+
+ if ((i+2) < ndmasegs) {
+ ring->desc_queued++;
+ ring->desc_cur = (ring->desc_cur + 1) %
+ RT_SOFTC_TX_RING_DESC_COUNT;
+ }
+ desc = &ring->desc[ring->desc_cur];
+ }
+
+ RT_DPRINTF(sc, RT_DEBUG_TX, "sending data: len=%d, ndmasegs=%d, "
+ "DMA ds_len=%d/%d/%d/%d/%d\n",
+ m->m_pkthdr.len, ndmasegs,
+ (int) dma_seg[0].ds_len,
+ (int) dma_seg[1].ds_len,
+ (int) dma_seg[2].ds_len,
+ (int) dma_seg[3].ds_len,
+ (int) dma_seg[4].ds_len);
+
+ bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map,
+ BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREWRITE);
+
+ ring->desc_queued++;
+ ring->desc_cur = (ring->desc_cur + 1) % RT_SOFTC_TX_RING_DESC_COUNT;
+
+ ring->data_queued++;
+ ring->data_cur = (ring->data_cur + 1) % RT_SOFTC_TX_RING_DATA_COUNT;
+
+ /* kick Tx */
+ RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(qid), ring->desc_cur);
+
+ return (0);
+}
+
+/*
+ * rt_start - start Transmit/Receive
+ */
+static void
+rt_start(struct ifnet *ifp)
+{
+ struct rt_softc *sc;
+ struct mbuf *m;
+ int qid = 0 /* XXX must check QoS priority */;
+
+ sc = ifp->if_softc;
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ for (;;) {
+ IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL)
+ break;
+
+ m->m_pkthdr.rcvif = NULL;
+
+ RT_SOFTC_TX_RING_LOCK(&sc->tx_ring[qid]);
+
+ if (sc->tx_ring[qid].data_queued >=
+ RT_SOFTC_TX_RING_DATA_COUNT) {
+ RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]);
+
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "if_start: Tx ring with qid=%d is full\n", qid);
+
+ m_freem(m);
+
+ ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ ifp->if_oerrors++;
+
+ sc->tx_data_queue_full[qid]++;
+
+ break;
+ }
+
+ if (rt_tx_data(sc, m, qid) != 0) {
+ RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]);
+
+ ifp->if_oerrors++;
+
+ break;
+ }
+
+ RT_SOFTC_TX_RING_UNLOCK(&sc->tx_ring[qid]);
+ sc->tx_timer = RT_TX_WATCHDOG_TIMEOUT;
+ callout_reset(&sc->tx_watchdog_ch, hz, rt_tx_watchdog, sc);
+ }
+}
+
+/*
+ * rt_update_promisc - set/clear promiscuous mode. Unused yet, because
+ * filtering done by attached Ethernet switch.
+ */
+static void
+rt_update_promisc(struct ifnet *ifp)
+{
+ struct rt_softc *sc;
+
+ sc = ifp->if_softc;
+ printf("%s: %s promiscuous mode\n",
+ device_get_nameunit(sc->dev),
+ (ifp->if_flags & IFF_PROMISC) ? "entering" : "leaving");
+}
+
+/*
+ * rt_ioctl - ioctl handler.
+ */
+static int
+rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+{
+ struct rt_softc *sc;
+ struct ifreq *ifr;
+#ifdef IF_RT_PHY_SUPPORT
+ struct mii_data *mii;
+#endif /* IF_RT_PHY_SUPPORT */
+ int error, startall;
+
+ sc = ifp->if_softc;
+ ifr = (struct ifreq *) data;
+
+ error = 0;
+
+ switch (cmd) {
+ case SIOCSIFFLAGS:
+ startall = 0;
+ RT_SOFTC_LOCK(sc);
+ if (ifp->if_flags & IFF_UP) {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ if ((ifp->if_flags ^ sc->if_flags) &
+ IFF_PROMISC)
+ rt_update_promisc(ifp);
+ } else {
+ rt_init_locked(sc);
+ startall = 1;
+ }
+ } else {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ rt_stop_locked(sc);
+ }
+ sc->if_flags = ifp->if_flags;
+ RT_SOFTC_UNLOCK(sc);
+ break;
+ case SIOCGIFMEDIA:
+ case SIOCSIFMEDIA:
+#ifdef IF_RT_PHY_SUPPORT
+ mii = device_get_softc(sc->rt_miibus);
+ error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
+#else
+ error = ifmedia_ioctl(ifp, ifr, &sc->rt_ifmedia, cmd);
+#endif /* IF_RT_PHY_SUPPORT */
+ break;
+ default:
+ error = ether_ioctl(ifp, cmd, data);
+ break;
+ }
+ return (error);
+}
+
+/*
+ * rt_periodic - Handler of PERIODIC interrupt
+ */
+static void
+rt_periodic(void *arg)
+{
+ struct rt_softc *sc;
+
+ sc = arg;
+ RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic\n");
+ taskqueue_enqueue(sc->taskqueue, &sc->periodic_task);
+}
+
+/*
+ * rt_tx_watchdog - Handler of TX Watchdog
+ */
+static void
+rt_tx_watchdog(void *arg)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = arg;
+ ifp = sc->ifp;
+
+ if (sc->tx_timer == 0)
+ return;
+
+ if (--sc->tx_timer == 0) {
+ device_printf(sc->dev, "Tx watchdog timeout: resetting\n");
+#ifdef notyet
+ /*
+ * XXX: Commented out, because reset break input.
+ */
+ rt_stop_locked(sc);
+ rt_init_locked(sc);
+#endif
+ ifp->if_oerrors++;
+ sc->tx_watchdog_timeouts++;
+ }
+ callout_reset(&sc->tx_watchdog_ch, hz, rt_tx_watchdog, sc);
+}
+
+/*
+ * rt_cnt_ppe_af - Handler of PPE Counter Table Almost Full interrupt
+ */
+static void
+rt_cnt_ppe_af(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "PPE Counter Table Almost Full\n");
+}
+
+/*
+ * rt_cnt_gdm_af - Handler of GDMA 1 & 2 Counter Table Almost Full interrupt
+ */
+static void
+rt_cnt_gdm_af(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "GDMA 1 & 2 Counter Table Almost Full\n");
+}
+
+/*
+ * rt_pse_p2_fc - Handler of PSE port2 (GDMA 2) flow control interrupt
+ */
+static void
+rt_pse_p2_fc(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE port2 (GDMA 2) flow control asserted.\n");
+}
+
+/*
+ * rt_gdm_crc_drop - Handler of GDMA 1/2 discard a packet due to CRC error
+ * interrupt
+ */
+static void
+rt_gdm_crc_drop(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "GDMA 1 & 2 discard a packet due to CRC error\n");
+}
+
+/*
+ * rt_pse_buf_drop - Handler of buffer sharing limitation interrupt
+ */
+static void
+rt_pse_buf_drop(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE discards a packet due to buffer sharing limitation\n");
+}
+
+/*
+ * rt_gdm_other_drop - Handler of discard on other reason interrupt
+ */
+static void
+rt_gdm_other_drop(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "GDMA 1 & 2 discard a packet due to other reason\n");
+}
+
+/*
+ * rt_pse_p1_fc - Handler of PSE port1 (GDMA 1) flow control interrupt
+ */
+static void
+rt_pse_p1_fc(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE port1 (GDMA 1) flow control asserted.\n");
+}
+
+/*
+ * rt_pse_p0_fc - Handler of PSE port0 (CDMA) flow control interrupt
+ */
+static void
+rt_pse_p0_fc(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE port0 (CDMA) flow control asserted.\n");
+}
+
+/*
+ * rt_pse_fq_empty - Handler of PSE free Q empty threshold reached interrupt
+ */
+static void
+rt_pse_fq_empty(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR,
+ "PSE free Q empty threshold reached & forced drop "
+ "condition occurred.\n");
+}
+
+/*
+ * rt_intr - main ISR
+ */
+static void
+rt_intr(void *arg)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ uint32_t status;
+
+ sc = arg;
+ ifp = sc->ifp;
+
+ /* acknowledge interrupts */
+ status = RT_READ(sc, GE_PORT_BASE + FE_INT_STATUS);
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_STATUS, status);
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "interrupt: status=0x%08x\n", status);
+
+ if (status == 0xffffffff || /* device likely went away */
+ status == 0) /* not for us */
+ return;
+
+ sc->interrupts++;
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ if (status & CNT_PPE_AF)
+ rt_cnt_ppe_af(sc);
+
+ if (status & CNT_GDM_AF)
+ rt_cnt_gdm_af(sc);
+
+ if (status & PSE_P2_FC)
+ rt_pse_p2_fc(sc);
+
+ if (status & GDM_CRC_DROP)
+ rt_gdm_crc_drop(sc);
+
+ if (status & PSE_BUF_DROP)
+ rt_pse_buf_drop(sc);
+
+ if (status & GDM_OTHER_DROP)
+ rt_gdm_other_drop(sc);
+
+ if (status & PSE_P1_FC)
+ rt_pse_p1_fc(sc);
+
+ if (status & PSE_P0_FC)
+ rt_pse_p0_fc(sc);
+
+ if (status & PSE_FQ_EMPTY)
+ rt_pse_fq_empty(sc);
+
+ if (status & INT_TX_COHERENT)
+ rt_tx_coherent_intr(sc);
+
+ if (status & INT_RX_COHERENT)
+ rt_rx_coherent_intr(sc);
+
+ if (status & RX_DLY_INT)
+ rt_rx_delay_intr(sc);
+
+ if (status & TX_DLY_INT)
+ rt_tx_delay_intr(sc);
+
+ if (status & INT_RX_DONE)
+ rt_rx_intr(sc);
+
+ if (status & INT_TXQ3_DONE)
+ rt_tx_intr(sc, 3);
+
+ if (status & INT_TXQ2_DONE)
+ rt_tx_intr(sc, 2);
+
+ if (status & INT_TXQ1_DONE)
+ rt_tx_intr(sc, 1);
+
+ if (status & INT_TXQ0_DONE)
+ rt_tx_intr(sc, 0);
+}
+
+static void
+rt_tx_coherent_intr(struct rt_softc *sc)
+{
+ uint32_t tmp;
+ int i;
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx coherent interrupt\n");
+
+ sc->tx_coherent_interrupts++;
+
+ /* restart DMA engine */
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ tmp &= ~(FE_TX_WB_DDONE | FE_TX_DMA_EN);
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++)
+ rt_reset_tx_ring(sc, &sc->tx_ring[i]);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) {
+ RT_WRITE(sc, PDMA_BASE + TX_BASE_PTR(i),
+ sc->tx_ring[i].desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + TX_MAX_CNT(i),
+ RT_SOFTC_TX_RING_DESC_COUNT);
+ RT_WRITE(sc, PDMA_BASE + TX_CTX_IDX(i), 0);
+ }
+
+ rt_txrx_enable(sc);
+}
+
+/*
+ * rt_rx_coherent_intr
+ */
+static void
+rt_rx_coherent_intr(struct rt_softc *sc)
+{
+ uint32_t tmp;
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx coherent interrupt\n");
+
+ sc->rx_coherent_interrupts++;
+
+ /* restart DMA engine */
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ tmp &= ~(FE_RX_DMA_EN);
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp);
+
+ /* init Rx ring */
+ rt_reset_rx_ring(sc, &sc->rx_ring);
+ RT_WRITE(sc, PDMA_BASE + RX_BASE_PTR0,
+ sc->rx_ring.desc_phys_addr);
+ RT_WRITE(sc, PDMA_BASE + RX_MAX_CNT0,
+ RT_SOFTC_RX_RING_DATA_COUNT);
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ RT_SOFTC_RX_RING_DATA_COUNT - 1);
+
+ rt_txrx_enable(sc);
+}
+
+/*
+ * rt_rx_intr - a packet received
+ */
+static void
+rt_rx_intr(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx interrupt\n");
+ sc->rx_interrupts++;
+ RT_SOFTC_LOCK(sc);
+
+ if (!(sc->intr_disable_mask & INT_RX_DONE)) {
+ rt_intr_disable(sc, INT_RX_DONE);
+ taskqueue_enqueue(sc->taskqueue, &sc->rx_done_task);
+ }
+
+ sc->intr_pending_mask |= INT_RX_DONE;
+ RT_SOFTC_UNLOCK(sc);
+}
+
+static void
+rt_rx_delay_intr(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Rx delay interrupt\n");
+ sc->rx_delay_interrupts++;
+}
+
+static void
+rt_tx_delay_intr(struct rt_softc *sc)
+{
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx delay interrupt\n");
+ sc->tx_delay_interrupts++;
+}
+
+/*
+ * rt_tx_intr - Transsmition of packet done
+ */
+static void
+rt_tx_intr(struct rt_softc *sc, int qid)
+{
+
+ KASSERT(qid >= 0 && qid < RT_SOFTC_TX_RING_COUNT,
+ ("%s: Tx interrupt: invalid qid=%d\n",
+ device_get_nameunit(sc->dev), qid));
+
+ RT_DPRINTF(sc, RT_DEBUG_INTR, "Tx interrupt: qid=%d\n", qid);
+
+ sc->tx_interrupts[qid]++;
+ RT_SOFTC_LOCK(sc);
+
+ if (!(sc->intr_disable_mask & (INT_TXQ0_DONE << qid))) {
+ rt_intr_disable(sc, (INT_TXQ0_DONE << qid));
+ taskqueue_enqueue(sc->taskqueue, &sc->tx_done_task);
+ }
+
+ sc->intr_pending_mask |= (INT_TXQ0_DONE << qid);
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_rx_done_task - run RX task
+ */
+static void
+rt_rx_done_task(void *context, int pending)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ int again;
+
+ sc = context;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_RX, "Rx done task\n");
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ sc->intr_pending_mask &= ~INT_RX_DONE;
+
+ again = rt_rx_eof(sc, sc->rx_process_limit);
+
+ RT_SOFTC_LOCK(sc);
+
+ if ((sc->intr_pending_mask & INT_RX_DONE) || again) {
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "Rx done task: scheduling again\n");
+ taskqueue_enqueue(sc->taskqueue, &sc->rx_done_task);
+ } else {
+ rt_intr_enable(sc, INT_RX_DONE);
+ }
+
+ RT_SOFTC_UNLOCK(sc);
+}
+
+/*
+ * rt_tx_done_task - check for pending TX task in all queues
+ */
+static void
+rt_tx_done_task(void *context, int pending)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+ uint32_t intr_mask;
+ int i;
+
+ sc = context;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_TX, "Tx done task\n");
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ for (i = RT_SOFTC_TX_RING_COUNT - 1; i >= 0; i--) {
+ if (sc->intr_pending_mask & (INT_TXQ0_DONE << i)) {
+ sc->intr_pending_mask &= ~(INT_TXQ0_DONE << i);
+ rt_tx_eof(sc, &sc->tx_ring[i]);
+ }
+ }
+
+ sc->tx_timer = 0;
+
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+
+ intr_mask = (
+ INT_TXQ3_DONE |
+ INT_TXQ2_DONE |
+ INT_TXQ1_DONE |
+ INT_TXQ0_DONE);
+
+ RT_SOFTC_LOCK(sc);
+
+ rt_intr_enable(sc, ~sc->intr_pending_mask &
+ (sc->intr_disable_mask & intr_mask));
+
+ if (sc->intr_pending_mask & intr_mask) {
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "Tx done task: scheduling again\n");
+ taskqueue_enqueue(sc->taskqueue, &sc->tx_done_task);
+ }
+
+ RT_SOFTC_UNLOCK(sc);
+
+ if (!IFQ_IS_EMPTY(&ifp->if_snd))
+ rt_start(ifp);
+}
+
+/*
+ * rt_periodic_task - run periodic task
+ */
+static void
+rt_periodic_task(void *context, int pending)
+{
+ struct rt_softc *sc;
+ struct ifnet *ifp;
+
+ sc = context;
+ ifp = sc->ifp;
+
+ RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic task: round=%lu\n",
+ sc->periodic_round);
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ return;
+
+ RT_SOFTC_LOCK(sc);
+ sc->periodic_round++;
+ rt_update_stats(sc);
+
+ if ((sc->periodic_round % 10) == 0) {
+ rt_update_raw_counters(sc);
+ rt_watchdog(sc);
+ }
+
+ RT_SOFTC_UNLOCK(sc);
+ callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc);
+}
+
+/*
+ * rt_rx_eof - check for frames that done by DMA engine and pass it into
+ * network subsystem.
+ */
+static int
+rt_rx_eof(struct rt_softc *sc, int limit)
+{
+ struct ifnet *ifp;
+ struct rt_softc_rx_ring *ring;
+ struct rt_rxdesc *desc;
+ struct rt_softc_rx_data *data;
+ struct mbuf *m, *mnew;
+ bus_dma_segment_t segs[1];
+ bus_dmamap_t dma_map;
+ uint32_t index, desc_flags;
+ int error, nsegs, len, nframes;
+
+ ifp = sc->ifp;
+ ring = &sc->rx_ring;
+
+ nframes = 0;
+
+ while (limit != 0) {
+ index = RT_READ(sc, PDMA_BASE + RX_DRX_IDX0);
+ if (ring->cur == index)
+ break;
+
+ desc = &ring->desc[ring->cur];
+ data = &ring->data[ring->cur];
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
+#ifdef IF_RT_DEBUG
+ if ( sc->debug & RT_DEBUG_RX ) {
+ printf("\nRX Descriptor[%#08x] dump:\n", (u_int)desc);
+ hexdump(desc, 16, 0, 0);
+ printf("-----------------------------------\n");
+ }
+#endif
+
+ /* XXX Sometime device don`t set DDONE bit */
+#ifdef DDONE_FIXED
+ if (!(desc->sdl0 & htole16(RT_RXDESC_SDL0_DDONE))) {
+ RT_DPRINTF(sc, RT_DEBUG_RX, "DDONE=0, try next\n");
+ break;
+ }
+#endif
+
+ len = le16toh(desc->sdl0) & 0x3fff;
+ RT_DPRINTF(sc, RT_DEBUG_RX, "new frame len=%d\n", len);
+
+ nframes++;
+
+ mnew = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
+ MJUMPAGESIZE);
+ if (mnew == NULL) {
+ sc->rx_mbuf_alloc_errors++;
+ ifp->if_ierrors++;
+ goto skip;
+ }
+
+ mnew->m_len = mnew->m_pkthdr.len = MJUMPAGESIZE;
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag,
+ ring->spare_dma_map, mnew, segs, &nsegs, BUS_DMA_NOWAIT);
+ if (error != 0) {
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "could not load Rx mbuf DMA map: "
+ "error=%d, nsegs=%d\n",
+ error, nsegs);
+
+ m_freem(mnew);
+
+ sc->rx_mbuf_dmamap_errors++;
+ ifp->if_ierrors++;
+
+ goto skip;
+ }
+
+ KASSERT(nsegs == 1, ("%s: too many DMA segments",
+ device_get_nameunit(sc->dev)));
+
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+
+ dma_map = data->dma_map;
+ data->dma_map = ring->spare_dma_map;
+ ring->spare_dma_map = dma_map;
+
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_PREREAD);
+
+ m = data->m;
+ desc_flags = desc->src;
+
+ data->m = mnew;
+ /* Add 2 for proper align of RX IP header */
+ desc->sdp0 = htole32(segs[0].ds_addr+2);
+ desc->sdl0 = htole32(segs[0].ds_len-2);
+ desc->src = 0;
+ desc->ai = 0;
+ desc->foe = 0;
+
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "Rx frame: rxdesc flags=0x%08x\n", desc_flags);
+
+ m->m_pkthdr.rcvif = ifp;
+ /* Add 2 to fix data align, after sdp0 = addr + 2 */
+ m->m_data += 2;
+ m->m_pkthdr.len = m->m_len = len;
+
+ /* check for crc errors */
+ if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
+ /*check for valid checksum*/
+ if (desc_flags & (RXDSXR_SRC_IP_CSUM_FAIL|
+ RXDSXR_SRC_L4_CSUM_FAIL)) {
+ RT_DPRINTF(sc, RT_DEBUG_RX,
+ "rxdesc: crc error\n");
+
+ ifp->if_ierrors++;
+
+ if (!(ifp->if_flags & IFF_PROMISC)) {
+ m_freem(m);
+ goto skip;
+ }
+ }
+ if ((desc_flags & RXDSXR_SRC_IP_CSUM_FAIL) != 0) {
+ m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
+ m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
+ m->m_pkthdr.csum_data = 0xffff;
+ }
+ m->m_flags &= ~M_HASFCS;
+ }
+
+ (*ifp->if_input)(ifp, m);
+skip:
+ desc->sdl0 &= ~htole16(RT_RXDESC_SDL0_DDONE);
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+
+ ring->cur = (ring->cur + 1) % RT_SOFTC_RX_RING_DATA_COUNT;
+
+ limit--;
+ }
+
+ if (ring->cur == 0)
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ RT_SOFTC_RX_RING_DATA_COUNT - 1);
+ else
+ RT_WRITE(sc, PDMA_BASE + RX_CALC_IDX0,
+ ring->cur - 1);
+
+ RT_DPRINTF(sc, RT_DEBUG_RX, "Rx eof: nframes=%d\n", nframes);
+
+ sc->rx_packets += nframes;
+
+ return (limit == 0);
+}
+
+/*
+ * rt_tx_eof - check for successful transmitted frames and mark their
+ * descriptor as free.
+ */
+static void
+rt_tx_eof(struct rt_softc *sc, struct rt_softc_tx_ring *ring)
+{
+ struct ifnet *ifp;
+ struct rt_txdesc *desc;
+ struct rt_softc_tx_data *data;
+ uint32_t index;
+ int ndescs, nframes;
+
+ ifp = sc->ifp;
+
+ ndescs = 0;
+ nframes = 0;
+
+ for (;;) {
+ index = RT_READ(sc, PDMA_BASE + TX_DTX_IDX(ring->qid));
+ if (ring->desc_next == index)
+ break;
+
+ ndescs++;
+
+ desc = &ring->desc[ring->desc_next];
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
+ if (desc->sdl0 & htole16(RT_TXDESC_SDL0_LASTSEG) ||
+ desc->sdl1 & htole16(RT_TXDESC_SDL1_LASTSEG)) {
+ nframes++;
+
+ data = &ring->data[ring->data_next];
+
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+
+ m_freem(data->m);
+
+ data->m = NULL;
+
+ ifp->if_opackets++;
+
+ RT_SOFTC_TX_RING_LOCK(ring);
+ ring->data_queued--;
+ ring->data_next = (ring->data_next + 1) %
+ RT_SOFTC_TX_RING_DATA_COUNT;
+ RT_SOFTC_TX_RING_UNLOCK(ring);
+ }
+
+ desc->sdl0 &= ~htole16(RT_TXDESC_SDL0_DDONE);
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+
+ RT_SOFTC_TX_RING_LOCK(ring);
+ ring->desc_queued--;
+ ring->desc_next = (ring->desc_next + 1) %
+ RT_SOFTC_TX_RING_DESC_COUNT;
+ RT_SOFTC_TX_RING_UNLOCK(ring);
+ }
+
+ RT_DPRINTF(sc, RT_DEBUG_TX,
+ "Tx eof: qid=%d, ndescs=%d, nframes=%d\n", ring->qid, ndescs,
+ nframes);
+}
+
+/*
+ * rt_update_stats - query statistics counters and update related variables.
+ */
+static void
+rt_update_stats(struct rt_softc *sc)
+{
+ struct ifnet *ifp;
+
+ ifp = sc->ifp;
+ RT_DPRINTF(sc, RT_DEBUG_STATS, "update statistic: \n");
+ /* XXX do update stats here */
+}
+
+/*
+ * rt_watchdog - reinit device on watchdog event.
+ */
+static void
+rt_watchdog(struct rt_softc *sc)
+{
+ uint32_t tmp;
+#ifdef notyet
+ int ntries;
+#endif
+
+ tmp = RT_READ(sc, PSE_BASE + CDMA_OQ_STA);
+
+ RT_DPRINTF(sc, RT_DEBUG_WATCHDOG, "watchdog: PSE_IQ_STA=0x%08x\n",
+ tmp);
+
+ /* XXX: do not reset */
+#ifdef notyet
+ if (((tmp >> P0_IQ_PCNT_SHIFT) & 0xff) != 0) {
+ sc->tx_queue_not_empty[0]++;
+
+ for (ntries = 0; ntries < 10; ntries++) {
+ tmp = RT_READ(sc, PSE_BASE + PSE_IQ_STA);
+ if (((tmp >> P0_IQ_PCNT_SHIFT) & 0xff) == 0)
+ break;
+
+ DELAY(1);
+ }
+ }
+
+ if (((tmp >> P1_IQ_PCNT_SHIFT) & 0xff) != 0) {
+ sc->tx_queue_not_empty[1]++;
+
+ for (ntries = 0; ntries < 10; ntries++) {
+ tmp = RT_READ(sc, PSE_BASE + PSE_IQ_STA);
+ if (((tmp >> P1_IQ_PCNT_SHIFT) & 0xff) == 0)
+ break;
+
+ DELAY(1);
+ }
+ }
+#endif
+}
+
+/*
+ * rt_update_raw_counters - update counters.
+ */
+static void
+rt_update_raw_counters(struct rt_softc *sc)
+{
+
+ sc->tx_bytes += RT_READ(sc, CNTR_BASE + GDMA_TX_GBCNT0);
+ sc->tx_packets += RT_READ(sc, CNTR_BASE + GDMA_TX_GPCNT0);
+ sc->tx_skip += RT_READ(sc, CNTR_BASE + GDMA_TX_SKIPCNT0);
+ sc->tx_collision+= RT_READ(sc, CNTR_BASE + GDMA_TX_COLCNT0);
+
+ sc->rx_bytes += RT_READ(sc, CNTR_BASE + GDMA_RX_GBCNT0);
+ sc->rx_packets += RT_READ(sc, CNTR_BASE + GDMA_RX_GPCNT0);
+ sc->rx_crc_err += RT_READ(sc, CNTR_BASE + GDMA_RX_CSUM_ERCNT0);
+ sc->rx_short_err+= RT_READ(sc, CNTR_BASE + GDMA_RX_SHORT_ERCNT0);
+ sc->rx_long_err += RT_READ(sc, CNTR_BASE + GDMA_RX_LONG_ERCNT0);
+ sc->rx_phy_err += RT_READ(sc, CNTR_BASE + GDMA_RX_FERCNT0);
+ sc->rx_fifo_overflows+= RT_READ(sc, CNTR_BASE + GDMA_RX_OERCNT0);
+}
+
+static void
+rt_intr_enable(struct rt_softc *sc, uint32_t intr_mask)
+{
+ uint32_t tmp;
+
+ sc->intr_disable_mask &= ~intr_mask;
+ tmp = sc->intr_enable_mask & ~sc->intr_disable_mask;
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp);
+}
+
+static void
+rt_intr_disable(struct rt_softc *sc, uint32_t intr_mask)
+{
+ uint32_t tmp;
+
+ sc->intr_disable_mask |= intr_mask;
+ tmp = sc->intr_enable_mask & ~sc->intr_disable_mask;
+ RT_WRITE(sc, GE_PORT_BASE + FE_INT_ENABLE, tmp);
+}
+
+/*
+ * rt_txrx_enable - enable TX/RX DMA
+ */
+static int
+rt_txrx_enable(struct rt_softc *sc)
+{
+ struct ifnet *ifp;
+ uint32_t tmp;
+ int ntries;
+
+ ifp = sc->ifp;
+
+ /* enable Tx/Rx DMA engine */
+ for (ntries = 0; ntries < 200; ntries++) {
+ tmp = RT_READ(sc, PDMA_BASE + PDMA_GLO_CFG);
+ if (!(tmp & (FE_TX_DMA_BUSY | FE_RX_DMA_BUSY)))
+ break;
+
+ DELAY(1000);
+ }
+
+ if (ntries == 200) {
+ device_printf(sc->dev, "timeout waiting for DMA engine\n");
+ return (-1);
+ }
+
+ DELAY(50);
+
+ tmp |= FE_TX_WB_DDONE | FE_RX_DMA_EN | FE_TX_DMA_EN;
+ RT_WRITE(sc, PDMA_BASE + PDMA_GLO_CFG, tmp);
+
+ /* XXX set Rx filter */
+ return (0);
+}
+
+/*
+ * rt_alloc_rx_ring - allocate RX DMA ring buffer
+ */
+static int
+rt_alloc_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring)
+{
+ struct rt_rxdesc *desc;
+ struct rt_softc_rx_data *data;
+ bus_dma_segment_t segs[1];
+ int i, nsegs, error;
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc), 1,
+ RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc),
+ 0, NULL, NULL, &ring->desc_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Rx desc DMA tag\n");
+ goto fail;
+ }
+
+ error = bus_dmamem_alloc(ring->desc_dma_tag, (void **) &ring->desc,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not allocate Rx desc DMA memory\n");
+ goto fail;
+ }
+
+ error = bus_dmamap_load(ring->desc_dma_tag, ring->desc_dma_map,
+ ring->desc,
+ RT_SOFTC_RX_RING_DATA_COUNT * sizeof(struct rt_rxdesc),
+ rt_dma_map_addr, &ring->desc_phys_addr, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load Rx desc DMA map\n");
+ goto fail;
+ }
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL,
+ &ring->data_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Rx data DMA tag\n");
+ goto fail;
+ }
+
+ for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) {
+ desc = &ring->desc[i];
+ data = &ring->data[i];
+
+ error = bus_dmamap_create(ring->data_dma_tag, 0,
+ &data->dma_map);
+ if (error != 0) {
+ device_printf(sc->dev, "could not create Rx data DMA "
+ "map\n");
+ goto fail;
+ }
+
+ data->m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
+ MJUMPAGESIZE);
+ if (data->m == NULL) {
+ device_printf(sc->dev, "could not allocate Rx mbuf\n");
+ error = ENOMEM;
+ goto fail;
+ }
+
+ data->m->m_len = data->m->m_pkthdr.len = MJUMPAGESIZE;
+
+ error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag,
+ data->dma_map, data->m, segs, &nsegs, BUS_DMA_NOWAIT);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not load Rx mbuf DMA map\n");
+ goto fail;
+ }
+
+ KASSERT(nsegs == 1, ("%s: too many DMA segments",
+ device_get_nameunit(sc->dev)));
+
+ /* Add 2 for proper align of RX IP header */
+ desc->sdp0 = htole32(segs[0].ds_addr+2);
+ desc->sdl0 = htole32(segs[0].ds_len-2);
+ }
+
+ error = bus_dmamap_create(ring->data_dma_tag, 0,
+ &ring->spare_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Rx spare DMA map\n");
+ goto fail;
+ }
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ return (0);
+
+fail:
+ rt_free_rx_ring(sc, ring);
+ return (error);
+}
+
+/*
+ * rt_reset_rx_ring - reset RX ring buffer
+ */
+static void
+rt_reset_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring)
+{
+ struct rt_rxdesc *desc;
+ int i;
+
+ for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) {
+ desc = &ring->desc[i];
+ desc->sdl0 &= ~htole16(RT_RXDESC_SDL0_DDONE);
+ }
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ ring->cur = 0;
+}
+
+/*
+ * rt_free_rx_ring - free memory used by RX ring buffer
+ */
+static void
+rt_free_rx_ring(struct rt_softc *sc, struct rt_softc_rx_ring *ring)
+{
+ struct rt_softc_rx_data *data;
+ int i;
+
+ if (ring->desc != NULL) {
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->desc_dma_tag, ring->desc_dma_map);
+ bus_dmamem_free(ring->desc_dma_tag, ring->desc,
+ ring->desc_dma_map);
+ }
+
+ if (ring->desc_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->desc_dma_tag);
+
+ for (i = 0; i < RT_SOFTC_RX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(data->m);
+ }
+
+ if (data->dma_map != NULL)
+ bus_dmamap_destroy(ring->data_dma_tag, data->dma_map);
+ }
+
+ if (ring->spare_dma_map != NULL)
+ bus_dmamap_destroy(ring->data_dma_tag, ring->spare_dma_map);
+
+ if (ring->data_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->data_dma_tag);
+}
+
+/*
+ * rt_alloc_tx_ring - allocate TX ring buffer
+ */
+static int
+rt_alloc_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring, int qid)
+{
+ struct rt_softc_tx_data *data;
+ int error, i;
+
+ mtx_init(&ring->lock, device_get_nameunit(sc->dev), NULL, MTX_DEF);
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ RT_SOFTC_TX_RING_DESC_COUNT * sizeof(struct rt_txdesc), 1,
+ RT_SOFTC_TX_RING_DESC_COUNT * sizeof(struct rt_txdesc),
+ 0, NULL, NULL, &ring->desc_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Tx desc DMA tag\n");
+ goto fail;
+ }
+
+ error = bus_dmamem_alloc(ring->desc_dma_tag, (void **) &ring->desc,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not allocate Tx desc DMA memory\n");
+ goto fail;
+ }
+
+ error = bus_dmamap_load(ring->desc_dma_tag, ring->desc_dma_map,
+ ring->desc, (RT_SOFTC_TX_RING_DESC_COUNT *
+ sizeof(struct rt_txdesc)), rt_dma_map_addr,
+ &ring->desc_phys_addr, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load Tx desc DMA map\n");
+ goto fail;
+ }
+
+ ring->desc_queued = 0;
+ ring->desc_cur = 0;
+ ring->desc_next = 0;
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE, 1,
+ RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE,
+ 0, NULL, NULL, &ring->seg0_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Tx seg0 DMA tag\n");
+ goto fail;
+ }
+
+ error = bus_dmamem_alloc(ring->seg0_dma_tag, (void **) &ring->seg0,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->seg0_dma_map);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not allocate Tx seg0 DMA memory\n");
+ goto fail;
+ }
+
+ error = bus_dmamap_load(ring->seg0_dma_tag, ring->seg0_dma_map,
+ ring->seg0,
+ RT_SOFTC_TX_RING_DATA_COUNT * RT_TX_DATA_SEG0_SIZE,
+ rt_dma_map_addr, &ring->seg0_phys_addr, 0);
+ if (error != 0) {
+ device_printf(sc->dev, "could not load Tx seg0 DMA map\n");
+ goto fail;
+ }
+
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), PAGE_SIZE, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ MJUMPAGESIZE, RT_SOFTC_MAX_SCATTER, MJUMPAGESIZE, 0, NULL, NULL,
+ &ring->data_dma_tag);
+ if (error != 0) {
+ device_printf(sc->dev,
+ "could not create Tx data DMA tag\n");
+ goto fail;
+ }
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ error = bus_dmamap_create(ring->data_dma_tag, 0,
+ &data->dma_map);
+ if (error != 0) {
+ device_printf(sc->dev, "could not create Tx data DMA "
+ "map\n");
+ goto fail;
+ }
+ }
+
+ ring->data_queued = 0;
+ ring->data_cur = 0;
+ ring->data_next = 0;
+
+ ring->qid = qid;
+ return (0);
+
+fail:
+ rt_free_tx_ring(sc, ring);
+ return (error);
+}
+
+/*
+ * rt_reset_tx_ring - reset TX ring buffer to empty state
+ */
+static void
+rt_reset_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring)
+{
+ struct rt_softc_tx_data *data;
+ struct rt_txdesc *desc;
+ int i;
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DESC_COUNT; i++) {
+ desc = &ring->desc[i];
+
+ desc->sdl0 = 0;
+ desc->sdl1 = 0;
+ }
+
+ ring->desc_queued = 0;
+ ring->desc_cur = 0;
+ ring->desc_next = 0;
+
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_PREWRITE);
+
+ bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map,
+ BUS_DMASYNC_PREWRITE);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(data->m);
+ data->m = NULL;
+ }
+ }
+
+ ring->data_queued = 0;
+ ring->data_cur = 0;
+ ring->data_next = 0;
+}
+
+/*
+ * rt_free_tx_ring - free RX ring buffer
+ */
+static void
+rt_free_tx_ring(struct rt_softc *sc, struct rt_softc_tx_ring *ring)
+{
+ struct rt_softc_tx_data *data;
+ int i;
+
+ if (ring->desc != NULL) {
+ bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->desc_dma_tag, ring->desc_dma_map);
+ bus_dmamem_free(ring->desc_dma_tag, ring->desc,
+ ring->desc_dma_map);
+ }
+
+ if (ring->desc_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->desc_dma_tag);
+
+ if (ring->seg0 != NULL) {
+ bus_dmamap_sync(ring->seg0_dma_tag, ring->seg0_dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->seg0_dma_tag, ring->seg0_dma_map);
+ bus_dmamem_free(ring->seg0_dma_tag, ring->seg0,
+ ring->seg0_dma_map);
+ }
+
+ if (ring->seg0_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->seg0_dma_tag);
+
+ for (i = 0; i < RT_SOFTC_TX_RING_DATA_COUNT; i++) {
+ data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dma_tag, data->dma_map,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(ring->data_dma_tag, data->dma_map);
+ m_freem(data->m);
+ }
+
+ if (data->dma_map != NULL)
+ bus_dmamap_destroy(ring->data_dma_tag, data->dma_map);
+ }
+
+ if (ring->data_dma_tag != NULL)
+ bus_dma_tag_destroy(ring->data_dma_tag);
+
+ mtx_destroy(&ring->lock);
+}
+
+/*
+ * rt_dma_map_addr - get address of busdma segment
+ */
+static void
+rt_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
+{
+ if (error != 0)
+ return;
+
+ KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg));
+
+ *(bus_addr_t *) arg = segs[0].ds_addr;
+}
+
+/*
+ * rt_sysctl_attach - attach sysctl nodes for NIC counters.
+ */
+static void
+rt_sysctl_attach(struct rt_softc *sc)
+{
+ struct sysctl_ctx_list *ctx;
+ struct sysctl_oid *tree;
+ struct sysctl_oid *stats;
+
+ ctx = device_get_sysctl_ctx(sc->dev);
+ tree = device_get_sysctl_tree(sc->dev);
+
+ /* statistic counters */
+ stats = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+ "stats", CTLFLAG_RD, 0, "statistic");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "interrupts", CTLFLAG_RD, &sc->interrupts, 0,
+ "all interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_coherent_interrupts", CTLFLAG_RD, &sc->tx_coherent_interrupts,
+ 0, "Tx coherent interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_coherent_interrupts", CTLFLAG_RD, &sc->rx_coherent_interrupts,
+ 0, "Rx coherent interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_interrupts", CTLFLAG_RD, &sc->rx_interrupts, 0,
+ "Rx interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_delay_interrupts", CTLFLAG_RD, &sc->rx_delay_interrupts, 0,
+ "Rx delay interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_interrupts", CTLFLAG_RD, &sc->tx_interrupts[3], 0,
+ "Tx AC3 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_interrupts", CTLFLAG_RD, &sc->tx_interrupts[2], 0,
+ "Tx AC2 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_interrupts", CTLFLAG_RD, &sc->tx_interrupts[1], 0,
+ "Tx AC1 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_interrupts", CTLFLAG_RD, &sc->tx_interrupts[0], 0,
+ "Tx AC0 interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_delay_interrupts", CTLFLAG_RD, &sc->tx_delay_interrupts,
+ 0, "Tx delay interrupts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_desc_queued", CTLFLAG_RD, &sc->tx_ring[3].desc_queued,
+ 0, "Tx AC3 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_data_queued", CTLFLAG_RD, &sc->tx_ring[3].data_queued,
+ 0, "Tx AC3 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_desc_queued", CTLFLAG_RD, &sc->tx_ring[2].desc_queued,
+ 0, "Tx AC2 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_data_queued", CTLFLAG_RD, &sc->tx_ring[2].data_queued,
+ 0, "Tx AC2 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_desc_queued", CTLFLAG_RD, &sc->tx_ring[1].desc_queued,
+ 0, "Tx AC1 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_data_queued", CTLFLAG_RD, &sc->tx_ring[1].data_queued,
+ 0, "Tx AC1 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_desc_queued", CTLFLAG_RD, &sc->tx_ring[0].desc_queued,
+ 0, "Tx AC0 descriptors queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_data_queued", CTLFLAG_RD, &sc->tx_ring[0].data_queued,
+ 0, "Tx AC0 data queued");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ3_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[3],
+ 0, "Tx AC3 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ2_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[2],
+ 0, "Tx AC2 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ1_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[1],
+ 0, "Tx AC1 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "TXQ0_data_queue_full", CTLFLAG_RD, &sc->tx_data_queue_full[0],
+ 0, "Tx AC0 data queue full");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_watchdog_timeouts", CTLFLAG_RD, &sc->tx_watchdog_timeouts,
+ 0, "Tx watchdog timeouts");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_defrag_packets", CTLFLAG_RD, &sc->tx_defrag_packets, 0,
+ "Tx defragmented packets");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "no_tx_desc_avail", CTLFLAG_RD, &sc->no_tx_desc_avail, 0,
+ "no Tx descriptors available");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_mbuf_alloc_errors", CTLFLAG_RD, &sc->rx_mbuf_alloc_errors,
+ 0, "Rx mbuf allocation errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_mbuf_dmamap_errors", CTLFLAG_RD, &sc->rx_mbuf_dmamap_errors,
+ 0, "Rx mbuf DMA mapping errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_queue_0_not_empty", CTLFLAG_RD, &sc->tx_queue_not_empty[0],
+ 0, "Tx queue 0 not empty");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_queue_1_not_empty", CTLFLAG_RD, &sc->tx_queue_not_empty[1],
+ 0, "Tx queue 1 not empty");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_packets", CTLFLAG_RD, &sc->rx_packets, 0,
+ "Rx packets");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_crc_errors", CTLFLAG_RD, &sc->rx_crc_err, 0,
+ "Rx CRC errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_phy_errors", CTLFLAG_RD, &sc->rx_phy_err, 0,
+ "Rx PHY errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_dup_packets", CTLFLAG_RD, &sc->rx_dup_packets, 0,
+ "Rx duplicate packets");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_fifo_overflows", CTLFLAG_RD, &sc->rx_fifo_overflows, 0,
+ "Rx FIFO overflows");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_bytes", CTLFLAG_RD, &sc->rx_bytes, 0,
+ "Rx bytes");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_long_err", CTLFLAG_RD, &sc->rx_long_err, 0,
+ "Rx too long frame errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "rx_short_err", CTLFLAG_RD, &sc->rx_short_err, 0,
+ "Rx too short frame errors");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_bytes", CTLFLAG_RD, &sc->tx_bytes, 0,
+ "Tx bytes");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_packets", CTLFLAG_RD, &sc->tx_packets, 0,
+ "Tx packets");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_skip", CTLFLAG_RD, &sc->tx_skip, 0,
+ "Tx skip count for GDMA ports");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO,
+ "tx_collision", CTLFLAG_RD, &sc->tx_collision, 0,
+ "Tx collision count for GDMA ports");
+}
+
+#ifdef IF_RT_PHY_SUPPORT
+static int
+rt_miibus_readreg(device_t dev, int phy, int reg)
+{
+ struct rt_softc *sc = device_get_softc(dev);
+
+ /*
+ * PSEUDO_PHYAD is a special value for indicate switch attached.
+ * No one PHY use PSEUDO_PHYAD (0x1e) address.
+ */
+ if (phy == 31) {
+ /* Fake PHY ID for bfeswitch attach */
+ switch (reg) {
+ case MII_BMSR:
+ return (BMSR_EXTSTAT|BMSR_MEDIAMASK);
+ case MII_PHYIDR1:
+ return (0x40); /* As result of faking */
+ case MII_PHYIDR2: /* PHY will detect as */
+ return (0x6250); /* bfeswitch */
+ }
+ }
+
+ /* Wait prev command done if any */
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+ RT_WRITE(sc, MDIO_ACCESS,
+ MDIO_CMD_ONGO ||
+ ((phy << MDIO_PHY_ADDR_SHIFT) & MDIO_PHY_ADDR_MASK) ||
+ ((reg << MDIO_PHYREG_ADDR_SHIFT) & MDIO_PHYREG_ADDR_MASK));
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+
+ return (RT_READ(sc, MDIO_ACCESS) & MDIO_PHY_DATA_MASK);
+}
+
+static int
+rt_miibus_writereg(device_t dev, int phy, int reg, int val)
+{
+ struct rt_softc *sc = device_get_softc(dev);
+
+ /* Wait prev command done if any */
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+ RT_WRITE(sc, MDIO_ACCESS,
+ MDIO_CMD_ONGO || MDIO_CMD_WR ||
+ ((phy << MDIO_PHY_ADDR_SHIFT) & MDIO_PHY_ADDR_MASK) ||
+ ((reg << MDIO_PHYREG_ADDR_SHIFT) & MDIO_PHYREG_ADDR_MASK) ||
+ (val & MDIO_PHY_DATA_MASK));
+ while (RT_READ(sc, MDIO_ACCESS) & MDIO_CMD_ONGO);
+
+ return (0);
+}
+
+void
+rt_miibus_statchg(device_t dev)
+{
+ struct rt_softc *sc = device_get_softc(dev);
+ struct mii_data *mii;
+
+ mii = device_get_softc(sc->rt_miibus);
+
+ if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
+ (IFM_ACTIVE | IFM_AVALID)) {
+ switch (IFM_SUBTYPE(mii->mii_media_active)) {
+ case IFM_10_T:
+ case IFM_100_TX:
+ /* XXX check link here */
+ sc->flags |= 1;
+ break;
+ default:
+ break;
+ }
+ }
+}
+#endif /* IF_RT_PHY_SUPPORT */
+
+static device_method_t rt_dev_methods[] =
+{
+ DEVMETHOD(device_probe, rt_probe),
+ DEVMETHOD(device_attach, rt_attach),
+ DEVMETHOD(device_detach, rt_detach),
+ DEVMETHOD(device_shutdown, rt_shutdown),
+ DEVMETHOD(device_suspend, rt_suspend),
+ DEVMETHOD(device_resume, rt_resume),
+
+ /* bus interface */
+ DEVMETHOD(bus_print_child, bus_generic_print_child),
+ DEVMETHOD(bus_driver_added, bus_generic_driver_added),
+
+#ifdef IF_RT_PHY_SUPPORT
+ /* MII interface */
+ DEVMETHOD(miibus_readreg, rt_miibus_readreg),
+ DEVMETHOD(miibus_writereg, rt_miibus_writereg),
+ DEVMETHOD(miibus_statchg, rt_miibus_statchg),
+#endif
+ { 0, 0 }
+};
+
+static driver_t rt_driver =
+{
+ "rt",
+ rt_dev_methods,
+ sizeof(struct rt_softc)
+};
+
+static devclass_t rt_dev_class;
+
+DRIVER_MODULE(rt, nexus, rt_driver, rt_dev_class, 0, 0);
+MODULE_DEPEND(rt, ether, 1, 1, 1);
+MODULE_DEPEND(rt, miibus, 1, 1, 1);
+
diff --git a/sys/dev/rt/if_rtreg.h b/sys/dev/rt/if_rtreg.h
new file mode 100644
index 0000000..65b4a8c
--- /dev/null
+++ b/sys/dev/rt/if_rtreg.h
@@ -0,0 +1,289 @@
+/*-
+ * Copyright (c) 2009, Aleksandr Rybalko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _IF_RTREG_H_
+#define _IF_RTREG_H_
+
+#define RT_READ(sc, reg) \
+ bus_space_read_4((sc)->bst, (sc)->bsh, reg)
+
+#define RT_WRITE(sc, reg, val) \
+ bus_space_write_4((sc)->bst, (sc)->bsh, reg, val)
+
+#define GE_PORT_BASE 0x0000
+
+#define MDIO_ACCESS 0x00
+#define MDIO_CMD_ONGO (1<<31)
+#define MDIO_CMD_WR (1<<30)
+#define MDIO_PHY_ADDR_MASK 0x1f000000
+#define MDIO_PHY_ADDR_SHIFT 24
+#define MDIO_PHYREG_ADDR_MASK 0x001f0000
+#define MDIO_PHYREG_ADDR_SHIFT 16
+#define MDIO_PHY_DATA_MASK 0x0000ffff
+#define MDIO_PHY_DATA_SHIFT 0
+
+#define FE_GLO_CFG 0x08 /*Frame Engine Global Configuration */
+#define EXT_VLAN_TYPE_MASK 0xffff0000
+#define EXT_VLAN_TYPE_SHIFT 16
+#define EXT_VLAN_TYPE_DFLT 0x81000000
+#define US_CYC_CNT_MASK 0x0000ff00
+#define US_CYC_CNT_SHIFT 8
+#define US_CYC_CNT_DFLT (132<<8) /* sys clocks per 1uS */
+#define L2_SPACE (8<<4) /* L2 space. Unit is 8 bytes */
+
+#define FE_RST_GLO 0x0C /*Frame Engine Global Reset*/
+#define FC_DROP_CNT_MASK 0xffff0000 /*Flow cntrl drop count */
+#define FC_DROP_CNT_SHIFT 16
+#define PSE_RESET (1<<0)
+
+#define FE_INT_STATUS 0x10
+#define CNT_PPE_AF (1<<31)
+#define CNT_GDM_AF (1<<29)
+#define PSE_P2_FC (1<<26)
+#define GDM_CRC_DROP (1<<25)
+#define PSE_BUF_DROP (1<<24)
+#define GDM_OTHER_DROP (1<<23)
+#define PSE_P1_FC (1<<22)
+#define PSE_P0_FC (1<<21)
+#define PSE_FQ_EMPTY (1<<20)
+#define INT_TX_COHERENT (1<<17)
+#define INT_RX_COHERENT (1<<16)
+#define INT_TXQ3_DONE (1<<11)
+#define INT_TXQ2_DONE (1<<10)
+#define INT_TXQ1_DONE (1<<9)
+#define INT_TXQ0_DONE (1<<8)
+#define INT_RX_DONE (1<<2)
+#define TX_DLY_INT (1<<1) /* TXQ[0|1]_DONE with delay */
+#define RX_DLY_INT (1<<0) /* RX_DONE with delay */
+#define FE_INT_ENABLE 0x14
+#define MDIO_CFG2 0x18
+#define FOE_TS_T 0x1c
+#define PSE_FQ_PCNT_MASK 0xff000000
+#define PSE_FQ_PCNT_SHIFT 24
+#define FOE_TS_TIMESTAMP_MASK 0x0000ffff
+#define FOE_TS_TIMESTAMP_SHIFT 0
+
+#define GDMA1_BASE 0x0020
+#define GDMA2_BASE 0x0060
+#define CDMA_BASE 0x0080
+
+#define GDMA_FWD_CFG 0x00 /* Only GDMA */
+#define GDM_DROP_256B (1<<23)
+#define GDM_ICS_EN (1<<22)
+#define GDM_TCS_EN (1<<21)
+#define GDM_UCS_EN (1<<20)
+#define GDM_DISPAD (1<<18)
+#define GDM_DISCRC (1<<17)
+#define GDM_STRPCRC (1<<16)
+#define GDM_UFRC_P_SHIFT 12
+#define GDM_BFRC_P_SHIFT 8
+#define GDM_MFRC_P_SHIFT 4
+#define GDM_OFRC_P_SHIFT 0
+#define GDM_XFRC_P_MASK 0x07
+#define GDM_DST_PORT_CPU 0
+#define GDM_DST_PORT_GDMA1 1
+#define GDM_DST_PORT_GDMA2 2
+#define GDM_DST_PORT_PPE 6
+#define GDM_DST_PORT_DISCARD 7
+
+#define CDMA_CSG_CFG 0x00 /* Only CDMA */
+#define INS_VLAN_TAG (0x8100<<16)
+#define ICS_GEN_EN (1<<2)
+#define TCS_GEN_EN (1<<1)
+#define UCS_GEN_EN (1<<0)
+
+#define GDMA_SCH_CFG 0x04
+#define GDM1_SCH_MOD_MASK 0x03000000
+#define GDM1_SCH_MOD_SHIFT 24
+#define GDM1_SCH_MOD_WRR 0
+#define GDM1_SCH_MOD_STRICT 1
+#define GDM1_SCH_MOD_MIXED 2
+#define GDM1_WT_1 0
+#define GDM1_WT_2 1
+#define GDM1_WT_4 2
+#define GDM1_WT_8 3
+#define GDM1_WT_16 4
+#define GDM1_WT_Q3_SHIFT 12
+#define GDM1_WT_Q2_SHIFT 8
+#define GDM1_WT_Q1_SHIFT 4
+#define GDM1_WT_Q0_SHIFT 0
+
+#define GDMA_SHPR_CFG 0x08
+#define GDM1_SHPR_EN (1<<24)
+#define GDM1_BK_SIZE_MASK 0x00ff0000 /* Bucket size 1kB units */
+#define GDM1_BK_SIZE_SHIFT 16
+#define GDM1_TK_RATE_MASK 0x00003fff /* Shaper token rate 8B/ms units */
+#define GDM1_TK_RATE_SHIFT 0
+
+#define GDMA_MAC_ADRL 0x0C
+#define GDMA_MAC_ADRH 0x10
+
+#define PPPOE_SID_0001 0x08 /* 0..15 SID0, 15..31 SID1 */
+#define PPPOE_SID_0203 0x0c
+#define PPPOE_SID_0405 0x10
+#define PPPOE_SID_0607 0x14
+#define PPPOE_SID_0809 0x18
+#define PPPOE_SID_1011 0x1c
+#define PPPOE_SID_1213 0x20
+#define PPPOE_SID_1415 0x24
+#define VLAN_ID_0001 0x28 /* 0..11 VID0, 15..26 VID1 */
+#define VLAN_ID_0203 0x2c
+#define VLAN_ID_0405 0x30
+#define VLAN_ID_0607 0x34
+#define VLAN_ID_0809 0x38
+#define VLAN_ID_1011 0x3c
+#define VLAN_ID_1213 0x40
+#define VLAN_ID_1415 0x44
+
+#define PSE_BASE 0x0040
+#define PSE_FQFC_CFG 0x00
+#define FQ_MAX_PCNT_MASK 0xff000000
+#define FQ_MAX_PCNT_SHIFT 24
+#define FQ_FC_RLS_MASK 0x00ff0000
+#define FQ_FC_RLS_SHIFT 16
+#define FQ_FC_ASRT_MASK 0x0000ff00
+#define FQ_FC_ASRT_SHIFT 8
+#define FQ_FC_DROP_MASK 0x000000ff
+#define FQ_FC_DROP_SHIFT 0
+
+#define CDMA_FC_CFG 0x04
+#define GDMA1_FC_CFG 0x08
+#define GDMA2_FC_CFG 0x0C
+#define P_SHARING (1<<28)
+#define P_HQ_DEF_MASK 0x0f000000
+#define P_HQ_DEF_SHIFT 24
+#define P_HQ_RESV_MASK 0x00ff0000
+#define P_HQ_RESV_SHIFT 16
+#define P_LQ_RESV_MASK 0x0000ff00
+#define P_LQ_RESV_SHIFT 8
+#define P_IQ_ASRT_MASK 0x000000ff
+#define P_IQ_ASRT_SHIFT 0
+
+#define CDMA_OQ_STA 0x10
+#define GDMA1_OQ_STA 0x14
+#define GDMA2_OQ_STA 0x18
+#define P_OQ3_PCNT_MASK 0xff000000
+#define P_OQ3_PCNT_SHIFT 24
+#define P_OQ2_PCNT_MASK 0x00ff0000
+#define P_OQ2_PCNT_SHIFT 16
+#define P_OQ1_PCNT_MASK 0x0000ff00
+#define P_OQ1_PCNT_SHIFT 8
+#define P_OQ0_PCNT_MASK 0x000000ff
+#define P_OQ0_PCNT_SHIFT 0
+
+#define PSE_IQ_STA 0x1C
+#define P6_OQ0_PCNT_MASK 0xff000000
+#define P6_OQ0_PCNT_SHIFT 24
+#define P2_IQ_PCNT_MASK 0x00ff0000
+#define P2_IQ_PCNT_SHIFT 16
+#define P1_IQ_PCNT_MASK 0x0000ff00
+#define P1_IQ_PCNT_SHIFT 8
+#define P0_IQ_PCNT_MASK 0x000000ff
+#define P0_IQ_PCNT_SHIFT 0
+
+#define PDMA_BASE 0x0100
+#define PDMA_GLO_CFG 0x00
+#define FE_TX_WB_DDONE (1<<6)
+#define FE_DMA_BT_SIZE4 (0<<4)
+#define FE_DMA_BT_SIZE8 (1<<4)
+#define FE_DMA_BT_SIZE16 (2<<4)
+#define FE_RX_DMA_BUSY (1<<3)
+#define FE_RX_DMA_EN (1<<2)
+#define FE_TX_DMA_BUSY (1<<1)
+#define FE_TX_DMA_EN (1<<0)
+#define PDMA_RST_IDX 0x04
+#define FE_RST_DRX_IDX0 (1<<16)
+#define FE_RST_DTX_IDX3 (1<<3)
+#define FE_RST_DTX_IDX2 (1<<2)
+#define FE_RST_DTX_IDX1 (1<<1)
+#define FE_RST_DTX_IDX0 (1<<0)
+
+#define PDMA_SCH_CFG 0x08
+#define DELAY_INT_CFG 0x0C
+#define TXDLY_INT_EN (1<<31)
+#define TXMAX_PINT_SHIFT 24
+#define TXMAX_PTIME_SHIFT 16
+#define RXDLY_INT_EN (1<<15)
+#define RXMAX_PINT_SHIFT 8
+#define RXMAX_PTIME_SHIFT 0
+
+#define TX_BASE_PTR0 0x10
+#define TX_MAX_CNT0 0x14
+#define TX_CTX_IDX0 0x18
+#define TX_DTX_IDX0 0x1C
+
+#define TX_BASE_PTR1 0x20
+#define TX_MAX_CNT1 0x24
+#define TX_CTX_IDX1 0x28
+#define TX_DTX_IDX1 0x2C
+
+#define RX_BASE_PTR0 0x30
+#define RX_MAX_CNT0 0x34
+#define RX_CALC_IDX0 0x38
+#define RX_DRX_IDX0 0x3C
+
+#define TX_BASE_PTR2 0x40
+#define TX_MAX_CNT2 0x44
+#define TX_CTX_IDX2 0x48
+#define TX_DTX_IDX2 0x4C
+
+#define TX_BASE_PTR3 0x50
+#define TX_MAX_CNT3 0x54
+#define TX_CTX_IDX3 0x58
+#define TX_DTX_IDX3 0x5C
+
+#define TX_BASE_PTR(qid) (((qid>1)?(0x20):(0x10)) + (qid) * 16)
+#define TX_MAX_CNT(qid) (((qid>1)?(0x24):(0x14)) + (qid) * 16)
+#define TX_CTX_IDX(qid) (((qid>1)?(0x28):(0x18)) + (qid) * 16)
+#define TX_DTX_IDX(qid) (((qid>1)?(0x2c):(0x1c)) + (qid) * 16)
+
+#define PPE_BASE 0x0200
+
+#define CNTR_BASE 0x0400
+#define PPE_AC_BCNT0 0x000
+#define PPE_AC_PCNT0 0x004
+#define PPE_AC_BCNT63 0x1F8
+#define PPE_AC_PCNT63 0x1FC
+#define PPE_MTR_CNT0 0x200
+#define PPE_MTR_CNT63 0x2FC
+#define GDMA_TX_GBCNT0 0x300
+#define GDMA_TX_GPCNT0 0x304
+#define GDMA_TX_SKIPCNT0 0x308
+#define GDMA_TX_COLCNT0 0x30C
+#define GDMA_RX_GBCNT0 0x320
+#define GDMA_RX_GPCNT0 0x324
+#define GDMA_RX_OERCNT0 0x328
+#define GDMA_RX_FERCNT0 0x32C
+#define GDMA_RX_SHORT_ERCNT0 0x330
+#define GDMA_RX_LONG_ERCNT0 0x334
+#define GDMA_RX_CSUM_ERCNT0 0x338
+
+#define POLICYTABLE_BASE 0x1000
+
+#endif /* _IF_RTREG_H_ */
diff --git a/sys/dev/rt/if_rtvar.h b/sys/dev/rt/if_rtvar.h
new file mode 100644
index 0000000..bd21158
--- /dev/null
+++ b/sys/dev/rt/if_rtvar.h
@@ -0,0 +1,282 @@
+/*-
+ * Copyright (c) 2010-2011 Aleksandr Rybalko <ray@ddteam.net>
+ * Copyright (c) 2009-2010 Alexander Egorenkov <egorenar@gmail.com>
+ * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _IF_RTVAR_H_
+#define _IF_RTVAR_H_
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/sockio.h>
+#include <sys/mbuf.h>
+#include <sys/kernel.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/taskqueue.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/endian.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <net/bpf.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/ethernet.h>
+#include <net/if_dl.h>
+#include <net/if_media.h>
+#include <net/if_types.h>
+
+#include "opt_if_rt.h"
+
+#define RT_SOFTC_LOCK(sc) mtx_lock(&(sc)->lock)
+#define RT_SOFTC_UNLOCK(sc) mtx_unlock(&(sc)->lock)
+#define RT_SOFTC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->lock, MA_OWNED)
+
+#define RT_SOFTC_TX_RING_LOCK(ring) mtx_lock(&(ring)->lock)
+#define RT_SOFTC_TX_RING_UNLOCK(ring) mtx_unlock(&(ring)->lock)
+#define RT_SOFTC_TX_RING_ASSERT_LOCKED(ring) \
+ mtx_assert(&(ring)->lock, MA_OWNED)
+
+#define RT_SOFTC_TX_RING_COUNT 4
+
+#ifndef IF_RT_RING_DATA_COUNT
+#define IF_RT_RING_DATA_COUNT 128
+#endif
+
+#define RT_SOFTC_RX_RING_DATA_COUNT IF_RT_RING_DATA_COUNT
+
+#define RT_SOFTC_MAX_SCATTER 10
+
+#define RT_SOFTC_TX_RING_DATA_COUNT (IF_RT_RING_DATA_COUNT/4)
+#define RT_SOFTC_TX_RING_DESC_COUNT \
+ (RT_SOFTC_TX_RING_DATA_COUNT * RT_SOFTC_MAX_SCATTER)
+
+#define RT_TXDESC_SDL1_BURST (1 << 15)
+#define RT_TXDESC_SDL1_LASTSEG (1 << 14)
+#define RT_TXDESC_SDL0_DDONE (1 << 15)
+#define RT_TXDESC_SDL0_LASTSEG (1 << 14)
+struct rt_txdesc
+{
+ uint32_t sdp0;
+ uint16_t sdl1;
+ uint16_t sdl0;
+ uint32_t sdp1;
+ uint8_t vid;
+#define TXDSCR_INS_VLAN_TAG 0x80
+#define TXDSCR_VLAN_PRIO_MASK 0x70
+#define TXDSCR_VLAN_IDX_MASK 0x0f
+ uint8_t pppoe;
+#define TXDSCR_USR_DEF_FLD 0x80
+#define TXDSCR_INS_PPPOE_HDR 0x10
+#define TXDSCR_PPPOE_SID_MASK 0x0f
+ uint8_t qn;
+#define TXDSCR_QUEUE_MASK 0x07
+ uint8_t dst;
+#define TXDSCR_IP_CSUM_GEN 0x80
+#define TXDSCR_UDP_CSUM_GEN 0x40
+#define TXDSCR_TCP_CSUM_GEN 0x20
+#define TXDSCR_DST_PORT_MASK 0x07
+#define TXDSCR_DST_PORT_CPU 0x00
+#define TXDSCR_DST_PORT_GDMA1 0x01
+#define TXDSCR_DST_PORT_GDMA2 0x02
+#define TXDSCR_DST_PORT_PPE 0x06
+#define TXDSCR_DST_PORT_DISC 0x07
+} __packed;
+
+#define RT_RXDESC_SDL0_DDONE (1 << 15)
+struct rt_rxdesc
+{
+ uint32_t sdp0;
+ uint16_t sdl1;
+ uint16_t sdl0;
+ uint32_t sdp1;
+ uint16_t foe;
+#define RXDSXR_FOE_ENTRY_VALID 0x40
+#define RXDSXR_FOE_ENTRY_MASK 0x3f
+ uint8_t ai;
+#define RXDSXR_AI_COU_REASON 0xff
+#define RXDSXR_AI_PARSER_RSLT_MASK 0xff
+ uint8_t src;
+#define RXDSXR_SRC_IPFVLD 0x80
+#define RXDSXR_SRC_L4FVLD 0x40
+#define RXDSXR_SRC_IP_CSUM_FAIL 0x20
+#define RXDSXR_SRC_L4_CSUM_FAIL 0x10
+#define RXDSXR_SRC_AIS 0x08
+#define RXDSXR_SRC_PORT_MASK 0x07
+} __packed;
+
+struct rt_softc_rx_data
+{
+ bus_dmamap_t dma_map;
+ struct mbuf *m;
+};
+
+struct rt_softc_rx_ring
+{
+ bus_dma_tag_t desc_dma_tag;
+ bus_dmamap_t desc_dma_map;
+ bus_addr_t desc_phys_addr;
+ struct rt_rxdesc *desc;
+ bus_dma_tag_t data_dma_tag;
+ bus_dmamap_t spare_dma_map;
+ struct rt_softc_rx_data data[RT_SOFTC_RX_RING_DATA_COUNT];
+ int cur;
+};
+
+struct rt_softc_tx_data
+{
+ bus_dmamap_t dma_map;
+ struct mbuf *m;
+};
+
+struct rt_softc_tx_ring
+{
+ struct mtx lock;
+ bus_dma_tag_t desc_dma_tag;
+ bus_dmamap_t desc_dma_map;
+ bus_addr_t desc_phys_addr;
+ struct rt_txdesc *desc;
+ int desc_queued;
+ int desc_cur;
+ int desc_next;
+ bus_dma_tag_t seg0_dma_tag;
+ bus_dmamap_t seg0_dma_map;
+ bus_addr_t seg0_phys_addr;
+ uint8_t *seg0;
+ bus_dma_tag_t data_dma_tag;
+ struct rt_softc_tx_data data[RT_SOFTC_TX_RING_DATA_COUNT];
+ int data_queued;
+ int data_cur;
+ int data_next;
+ int qid;
+};
+
+struct rt_softc
+{
+ device_t dev;
+ struct mtx lock;
+ uint32_t flags;
+
+ int mem_rid;
+ struct resource *mem;
+ int irq_rid;
+ struct resource *irq;
+ void *irqh;
+
+ bus_space_tag_t bst;
+ bus_space_handle_t bsh;
+
+ struct ifnet *ifp;
+ int if_flags;
+ struct ifmedia rt_ifmedia;
+
+ uint32_t mac_rev;
+ uint8_t mac_addr[ETHER_ADDR_LEN];
+ device_t rt_miibus;
+
+ uint32_t intr_enable_mask;
+ uint32_t intr_disable_mask;
+ uint32_t intr_pending_mask;
+
+ struct task rx_done_task;
+ int rx_process_limit;
+ struct task tx_done_task;
+ struct task periodic_task;
+ struct callout periodic_ch;
+ unsigned long periodic_round;
+ struct taskqueue *taskqueue;
+
+ struct rt_softc_rx_ring rx_ring;
+ struct rt_softc_tx_ring tx_ring[RT_SOFTC_TX_RING_COUNT];
+ int tx_ring_mgtqid;
+
+ struct callout tx_watchdog_ch;
+ int tx_timer;
+
+ /* statistic counters */
+ unsigned long interrupts;
+ unsigned long tx_coherent_interrupts;
+ unsigned long rx_coherent_interrupts;
+ unsigned long rx_interrupts;
+ unsigned long rx_delay_interrupts;
+ unsigned long tx_interrupts[RT_SOFTC_TX_RING_COUNT];
+ unsigned long tx_delay_interrupts;
+ unsigned long tx_data_queue_full[RT_SOFTC_TX_RING_COUNT];
+ unsigned long tx_watchdog_timeouts;
+ unsigned long tx_defrag_packets;
+ unsigned long no_tx_desc_avail;
+ unsigned long rx_mbuf_alloc_errors;
+ unsigned long rx_mbuf_dmamap_errors;
+ unsigned long tx_queue_not_empty[2];
+
+ unsigned long rx_bytes;
+ unsigned long rx_packets;
+ unsigned long rx_crc_err;
+ unsigned long rx_phy_err;
+ unsigned long rx_dup_packets;
+ unsigned long rx_fifo_overflows;
+ unsigned long rx_short_err;
+ unsigned long rx_long_err;
+ unsigned long tx_bytes;
+ unsigned long tx_packets;
+ unsigned long tx_skip;
+ unsigned long tx_collision;
+
+ int phy_addr;
+
+#ifdef IF_RT_DEBUG
+ int debug;
+#endif
+};
+
+#ifdef IF_RT_DEBUG
+enum
+{
+ RT_DEBUG_RX = 0x00000001,
+ RT_DEBUG_TX = 0x00000002,
+ RT_DEBUG_INTR = 0x00000004,
+ RT_DEBUG_STATE = 0x00000008,
+ RT_DEBUG_STATS = 0x00000010,
+ RT_DEBUG_PERIODIC = 0x00000020,
+ RT_DEBUG_WATCHDOG = 0x00000040,
+ RT_DEBUG_ANY = 0xffffffff
+};
+
+#define RT_DPRINTF(sc, m, fmt, ...) \
+ do { if ((sc)->debug & (m)) \
+ device_printf(sc->dev, fmt, __VA_ARGS__); } while (0)
+#else
+#define RT_DPRINTF(sc, m, fmt, ...)
+#endif /* #ifdef IF_RT_DEBUG */
+
+#endif /* #ifndef _IF_RTVAR_H_ */
diff --git a/sys/dev/sis/if_sis.c b/sys/dev/sis/if_sis.c
index 63417a0..9290ff7 100644
--- a/sys/dev/sis/if_sis.c
+++ b/sys/dev/sis/if_sis.c
@@ -87,7 +87,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/resource.h>
-#include <sys/bus.h>
#include <sys/rman.h>
#include <dev/mii/mii.h>
diff --git a/sys/dev/snp/snp.c b/sys/dev/snp/snp.c
index 37d9965..b05ad2a 100644
--- a/sys/dev/snp/snp.c
+++ b/sys/dev/snp/snp.c
@@ -158,7 +158,7 @@ snp_read(struct cdev *dev, struct uio *uio, int flag)
error = devfs_get_cdevpriv((void **)&ss);
if (error != 0)
return (error);
-
+
tp = ss->snp_tty;
if (tp == NULL || tty_gone(tp))
return (EIO);
@@ -198,7 +198,7 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
error = devfs_get_cdevpriv((void **)&ss);
if (error != 0)
return (error);
-
+
tp = ss->snp_tty;
if (tp == NULL || tty_gone(tp))
return (EIO);
diff --git a/sys/dev/sound/macio/i2s.c b/sys/dev/sound/macio/i2s.c
index d1a5463..e35a262 100644
--- a/sys/dev/sound/macio/i2s.c
+++ b/sys/dev/sound/macio/i2s.c
@@ -158,6 +158,8 @@ static int
i2s_probe(device_t self)
{
const char *name;
+ phandle_t subchild;
+ char subchildname[255];
name = ofw_bus_get_name(self);
if (!name)
@@ -165,6 +167,16 @@ i2s_probe(device_t self)
if (strcmp(name, "i2s") != 0)
return (ENXIO);
+
+ /*
+ * Do not attach to "lightshow" I2S devices on Xserves. This controller
+ * is used there to control the LEDs on the front panel, and this
+ * driver can't handle it.
+ */
+ subchild = OF_child(OF_child(ofw_bus_get_node(self)));
+ if (subchild != 0 && OF_getprop(subchild, "name", subchildname,
+ sizeof(subchildname)) > 0 && strcmp(subchildname, "lightshow") == 0)
+ return (ENXIO);
device_set_desc(self, "Apple I2S Audio Controller");
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 4f8670a..565022c 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -192,7 +192,8 @@ struct uaudio_chan {
};
#define UMIDI_CABLES_MAX 16 /* units */
-#define UMIDI_BULK_SIZE 1024 /* bytes */
+#define UMIDI_TX_FRAMES 256 /* units */
+#define UMIDI_TX_BUFFER (UMIDI_TX_FRAMES * 4) /* bytes */
enum {
UMIDI_TX_TRANSFER,
@@ -235,6 +236,7 @@ struct umidi_chan {
uint8_t curr_cable;
uint8_t max_cable;
uint8_t valid;
+ uint8_t single_command;
};
struct uaudio_softc {
@@ -497,8 +499,7 @@ static const struct usb_config
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
- .bufsize = UMIDI_BULK_SIZE,
- .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .bufsize = UMIDI_TX_BUFFER,
.callback = &umidi_bulk_write_callback,
},
@@ -507,7 +508,7 @@ static const struct usb_config
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = 4, /* bytes */
- .flags = {.pipe_bof = 1,.short_xfer_ok = 1,.proxy_buffer = 1,},
+ .flags = {.short_xfer_ok = 1,.proxy_buffer = 1,},
.callback = &umidi_bulk_read_callback,
},
};
@@ -531,6 +532,15 @@ static driver_t uaudio_driver = {
.size = sizeof(struct uaudio_softc),
};
+static const STRUCT_USB_HOST_ID __used uaudio_devs[] = {
+ /* Generic USB audio class match */
+ {USB_IFACE_CLASS(UICLASS_AUDIO),
+ USB_IFACE_SUBCLASS(UISUBCLASS_AUDIOCONTROL),},
+ /* Generic USB MIDI class match */
+ {USB_IFACE_CLASS(UICLASS_AUDIO),
+ USB_IFACE_SUBCLASS(UISUBCLASS_MIDISTREAM),},
+};
+
static int
uaudio_probe(device_t dev)
{
@@ -3532,7 +3542,7 @@ umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
struct umidi_sub_chan *sub;
struct usb_page_cache *pc;
uint32_t actlen;
- uint16_t total_length;
+ uint16_t nframes;
uint8_t buf;
uint8_t start_cable;
uint8_t tr_any;
@@ -3540,6 +3550,10 @@ umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
+ /*
+ * NOTE: Some MIDI devices only accept 4 bytes of data per
+ * short terminated USB transfer.
+ */
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
DPRINTF("actlen=%d bytes\n", len);
@@ -3548,7 +3562,7 @@ umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
tr_setup:
DPRINTF("start\n");
- total_length = 0; /* reset */
+ nframes = 0; /* reset */
start_cable = chan->curr_cable;
tr_any = 0;
pc = usbd_xfer_get_frame(xfer, 0);
@@ -3560,51 +3574,50 @@ tr_setup:
sub = &chan->sub[chan->curr_cable];
if (sub->write_open) {
- usb_fifo_get_data(sub->fifo.fp[USB_FIFO_TX],
- pc, total_length, 1, &actlen, 0);
+ usb_fifo_get_data_linear(sub->fifo.fp[USB_FIFO_TX],
+ &buf, 1, &actlen, 0);
} else {
actlen = 0;
}
if (actlen) {
- usbd_copy_out(pc, total_length, &buf, 1);
tr_any = 1;
- DPRINTF("byte=0x%02x\n", buf);
+ DPRINTF("byte=0x%02x from FIFO %u\n", buf,
+ (unsigned int)chan->curr_cable);
if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) {
- DPRINTF("sub= %02x %02x %02x %02x\n",
+ DPRINTF("sub=0x%02x 0x%02x 0x%02x 0x%02x\n",
sub->temp_cmd[0], sub->temp_cmd[1],
sub->temp_cmd[2], sub->temp_cmd[3]);
- usbd_copy_in(pc, total_length,
- sub->temp_cmd, 4);
+ usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4);
- total_length += 4;
+ nframes++;
- if (total_length >= UMIDI_BULK_SIZE) {
+ if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0))
break;
- }
} else {
continue;
}
}
+
chan->curr_cable++;
- if (chan->curr_cable >= chan->max_cable) {
+ if (chan->curr_cable >= chan->max_cable)
chan->curr_cable = 0;
- }
+
if (chan->curr_cable == start_cable) {
- if (tr_any == 0) {
+ if (tr_any == 0)
break;
- }
tr_any = 0;
}
}
- if (total_length) {
- usbd_xfer_set_frame_len(xfer, 0, total_length);
+ if (nframes != 0) {
+ DPRINTF("Transferring %d frames\n", (int)nframes);
+ usbd_xfer_set_frame_len(xfer, 0, 4 * nframes);
usbd_transfer_submit(xfer);
}
break;
@@ -3776,6 +3789,9 @@ umidi_probe(device_t dev)
int error;
uint32_t n;
+ if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI))
+ chan->single_command = 1;
+
if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index,
chan->iface_alt_index)) {
DPRINTF("setting of alternate index failed!\n");
diff --git a/sys/dev/syscons/scterm-teken.c b/sys/dev/syscons/scterm-teken.c
index 1d110ab9..725f9f5 100644
--- a/sys/dev/syscons/scterm-teken.c
+++ b/sys/dev/syscons/scterm-teken.c
@@ -643,7 +643,7 @@ scteken_copy(void *arg, const teken_rect_t *r, const teken_pos_t *p)
while (src < end) {
sc_vtb_move(&scp->vtb, src, dst, width);
-
+
src += scp->xsize;
dst += scp->xsize;
}
@@ -658,7 +658,7 @@ scteken_copy(void *arg, const teken_rect_t *r, const teken_pos_t *p)
while (src >= end) {
sc_vtb_move(&scp->vtb, src, dst, width);
-
+
src -= scp->xsize;
dst -= scp->xsize;
}
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index b12b654..69d628e 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -1450,6 +1450,8 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
case GIO_KEYMAP: /* get keyboard translation table */
case PIO_KEYMAP: /* set keyboard translation table */
+ case OGIO_KEYMAP: /* get keyboard translation table (compat) */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case GIO_DEADKEYMAP: /* get accent key translation table */
case PIO_DEADKEYMAP: /* set accent key translation table */
case GETFKEY: /* get function key string */
diff --git a/sys/dev/tdfx/tdfx_pci.c b/sys/dev/tdfx/tdfx_pci.c
index 770c672..27308a9 100644
--- a/sys/dev/tdfx/tdfx_pci.c
+++ b/sys/dev/tdfx/tdfx_pci.c
@@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
-#include <sys/cdefs.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/file.h>
diff --git a/sys/dev/uart/uart_bus_pci.c b/sys/dev/uart/uart_bus_pci.c
index 48a134b..7c5b8b3 100644
--- a/sys/dev/uart/uart_bus_pci.c
+++ b/sys/dev/uart/uart_bus_pci.c
@@ -83,6 +83,7 @@ static struct pci_id pci_ns8250_ids[] = {
{ 0x103c, 0x1290, 0xffff, 0, "HP Auxiliary Diva Serial Port", 0x18 },
{ 0x11c1, 0x0480, 0xffff, 0, "Agere Systems Venus Modem (V90, 56KFlex)", 0x14 },
{ 0x115d, 0x0103, 0xffff, 0, "Xircom Cardbus Ethernet + 56k Modem", 0x10 },
+{ 0x1282, 0x6585, 0xffff, 0, "Davicom 56PDV PCI Modem", 0x10 },
{ 0x12b9, 0x1008, 0xffff, 0, "3Com 56K FaxModem Model 5610", 0x10 },
{ 0x131f, 0x1000, 0xffff, 0, "Siig CyberSerial (1-port) 16550", 0x18 },
{ 0x131f, 0x1001, 0xffff, 0, "Siig CyberSerial (1-port) 16650", 0x18 },
@@ -113,6 +114,8 @@ static struct pci_id pci_ns8250_ids[] = {
{ 0x9710, 0x9820, 0x1000, 1, "NetMos NM9820 Serial Port", 0x10 },
{ 0x9710, 0x9835, 0x1000, 1, "NetMos NM9835 Serial Port", 0x10 },
{ 0x9710, 0x9865, 0xa000, 0x1000, "NetMos NM9865 Serial Port", 0x10 },
+{ 0x9710, 0x9900, 0xa000, 0x1000,
+ "MosChip MCS9900 PCIe to Peripheral Controller", 0x10 },
{ 0x9710, 0x9901, 0xa000, 0x1000,
"MosChip MCS9901 PCIe to Peripheral Controller", 0x10 },
{ 0xdeaf, 0x9051, 0xffff, 0, "Middle Digital PC Weasel Serial Port", 0x10 },
diff --git a/sys/dev/uart/uart_kbd_sun.c b/sys/dev/uart/uart_kbd_sun.c
index 1564d3f..43c0096 100644
--- a/sys/dev/uart/uart_kbd_sun.c
+++ b/sys/dev/uart/uart_kbd_sun.c
@@ -739,6 +739,7 @@ sunkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data)
case KDSETRAD:
break;
case PIO_KEYMAP:
+ case OPIO_KEYMAP:
case PIO_KEYMAPENT:
case PIO_DEADKEYMAP:
default:
diff --git a/sys/dev/usb/input/atp.c b/sys/dev/usb/input/atp.c
index fab60a2..9a17950 100644
--- a/sys/dev/usb/input/atp.c
+++ b/sys/dev/usb/input/atp.c
@@ -240,7 +240,7 @@ struct atp_dev_params {
},
};
-static const struct usb_device_id atp_devs[] = {
+static const STRUCT_USB_HOST_ID atp_devs[] = {
/* Core Duo MacBook & MacBook Pro */
{ USB_VPI(USB_VENDOR_APPLE, 0x0217, ATP_DEV_PARAMS_0) },
{ USB_VPI(USB_VENDOR_APPLE, 0x0218, ATP_DEV_PARAMS_0) },
diff --git a/sys/dev/usb/input/uep.c b/sys/dev/usb/input/uep.c
index 048452d..e90298b 100644
--- a/sys/dev/usb/input/uep.c
+++ b/sys/dev/usb/input/uep.c
@@ -288,6 +288,12 @@ static const struct usb_config uep_config[UEP_N_TRANSFER] = {
},
};
+static const STRUCT_USB_HOST_ID uep_devs[] = {
+ {USB_VPI(USB_VENDOR_EGALAX, USB_PRODUCT_EGALAX_TPANEL, 0)},
+ {USB_VPI(USB_VENDOR_EGALAX, USB_PRODUCT_EGALAX_TPANEL2, 0)},
+ {USB_VPI(USB_VENDOR_EGALAX2, USB_PRODUCT_EGALAX2_TPANEL, 0)},
+};
+
static int
uep_probe(device_t dev)
{
@@ -295,17 +301,12 @@ uep_probe(device_t dev)
if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
+ if (uaa->info.bConfigIndex != 0)
+ return (ENXIO);
+ if (uaa->info.bIfaceIndex != 0)
+ return (ENXIO);
- if ((uaa->info.idVendor == USB_VENDOR_EGALAX) &&
- ((uaa->info.idProduct == USB_PRODUCT_EGALAX_TPANEL) ||
- (uaa->info.idProduct == USB_PRODUCT_EGALAX_TPANEL2)))
- return (BUS_PROBE_SPECIFIC);
-
- if ((uaa->info.idVendor == USB_VENDOR_EGALAX2) &&
- (uaa->info.idProduct == USB_PRODUCT_EGALAX2_TPANEL))
- return (BUS_PROBE_SPECIFIC);
-
- return (ENXIO);
+ return (usbd_lookup_id_by_uaa(uep_devs, sizeof(uep_devs), uaa));
}
static int
diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c
index a7fd899..1b810e3 100644
--- a/sys/dev/usb/input/uhid.c
+++ b/sys/dev/usb/input/uhid.c
@@ -607,29 +607,45 @@ uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
return (error);
}
+static const STRUCT_USB_HOST_ID uhid_devs[] = {
+ /* generic HID class */
+ {USB_IFACE_CLASS(UICLASS_HID),},
+ /* the Xbox 360 gamepad doesn't use the HID class */
+ {USB_IFACE_CLASS(UICLASS_VENDOR),
+ USB_IFACE_SUBCLASS(UISUBCLASS_XBOX360_CONTROLLER),
+ USB_IFACE_PROTOCOL(UIPROTO_XBOX360_GAMEPAD),},
+};
+
static int
uhid_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
+ int error;
DPRINTFN(11, "\n");
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
- if (uaa->info.bInterfaceClass != UICLASS_HID) {
- /* the Xbox 360 gamepad doesn't use the HID class */
+ error = usbd_lookup_id_by_uaa(uhid_devs, sizeof(uhid_devs), uaa);
+ if (error)
+ return (error);
- if ((uaa->info.bInterfaceClass != UICLASS_VENDOR) ||
- (uaa->info.bInterfaceSubClass != UISUBCLASS_XBOX360_CONTROLLER) ||
- (uaa->info.bInterfaceProtocol != UIPROTO_XBOX360_GAMEPAD)) {
- return (ENXIO);
- }
- }
- if (usb_test_quirk(uaa, UQ_HID_IGNORE)) {
+ if (usb_test_quirk(uaa, UQ_HID_IGNORE))
+ return (ENXIO);
+
+ /*
+ * Don't attach to mouse and keyboard devices, hence then no
+ * "nomatch" event is generated and then ums and ukbd won't
+ * attach properly when loaded.
+ */
+ if ((uaa->info.bInterfaceClass == UICLASS_HID) &&
+ (uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
+ ((uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD) ||
+ (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE))) {
return (ENXIO);
}
+
return (BUS_PROBE_GENERIC);
}
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 9182663..bf3ecd7 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -59,6 +59,8 @@ __FBSDID("$FreeBSD$");
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
+#include <sys/proc.h>
+#include <sys/sched.h>
#include <sys/kdb.h>
#include <dev/usb/usb.h>
@@ -108,9 +110,10 @@ TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
#define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
#define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
#define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
+#define UKBD_BUFFER_SIZE 64 /* bytes */
struct ukbd_data {
- uint8_t modifiers;
+ uint16_t modifiers;
#define MOD_CONTROL_L 0x01
#define MOD_CONTROL_R 0x10
#define MOD_SHIFT_L 0x02
@@ -119,9 +122,10 @@ struct ukbd_data {
#define MOD_ALT_R 0x40
#define MOD_WIN_L 0x08
#define MOD_WIN_R 0x80
- uint8_t reserved;
+/* internal */
+#define MOD_EJECT 0x0100
+#define MOD_FN 0x0200
uint8_t keycode[UKBD_NKEYCODE];
- uint8_t exten[8];
};
enum {
@@ -137,6 +141,18 @@ struct ukbd_softc {
fkeytab_t sc_fkeymap[UKBD_NFKEY];
struct hid_location sc_loc_apple_eject;
struct hid_location sc_loc_apple_fn;
+ struct hid_location sc_loc_ctrl_l;
+ struct hid_location sc_loc_ctrl_r;
+ struct hid_location sc_loc_shift_l;
+ struct hid_location sc_loc_shift_r;
+ struct hid_location sc_loc_alt_l;
+ struct hid_location sc_loc_alt_r;
+ struct hid_location sc_loc_win_l;
+ struct hid_location sc_loc_win_r;
+ struct hid_location sc_loc_events;
+ struct hid_location sc_loc_numlock;
+ struct hid_location sc_loc_capslock;
+ struct hid_location sc_loc_scrolllock;
struct usb_callout sc_callout;
struct ukbd_data sc_ndata;
struct ukbd_data sc_odata;
@@ -155,31 +171,64 @@ struct ukbd_softc {
uint32_t sc_buffered_char[2];
#endif
uint32_t sc_flags; /* flags */
-#define UKBD_FLAG_COMPOSE 0x0001
-#define UKBD_FLAG_POLLING 0x0002
-#define UKBD_FLAG_SET_LEDS 0x0004
-#define UKBD_FLAG_ATTACHED 0x0010
-#define UKBD_FLAG_GONE 0x0020
-#define UKBD_FLAG_APPLE_EJECT 0x0040
-#define UKBD_FLAG_APPLE_FN 0x0080
-#define UKBD_FLAG_APPLE_SWAP 0x0100
-#define UKBD_FLAG_TIMER_RUNNING 0x0200
+#define UKBD_FLAG_COMPOSE 0x00000001
+#define UKBD_FLAG_POLLING 0x00000002
+#define UKBD_FLAG_SET_LEDS 0x00000004
+#define UKBD_FLAG_ATTACHED 0x00000010
+#define UKBD_FLAG_GONE 0x00000020
+
+#define UKBD_FLAG_HID_MASK 0x003fffc0
+#define UKBD_FLAG_APPLE_EJECT 0x00000040
+#define UKBD_FLAG_APPLE_FN 0x00000080
+#define UKBD_FLAG_APPLE_SWAP 0x00000100
+#define UKBD_FLAG_TIMER_RUNNING 0x00000200
+#define UKBD_FLAG_CTRL_L 0x00000400
+#define UKBD_FLAG_CTRL_R 0x00000800
+#define UKBD_FLAG_SHIFT_L 0x00001000
+#define UKBD_FLAG_SHIFT_R 0x00002000
+#define UKBD_FLAG_ALT_L 0x00004000
+#define UKBD_FLAG_ALT_R 0x00008000
+#define UKBD_FLAG_WIN_L 0x00010000
+#define UKBD_FLAG_WIN_R 0x00020000
+#define UKBD_FLAG_EVENTS 0x00040000
+#define UKBD_FLAG_NUMLOCK 0x00080000
+#define UKBD_FLAG_CAPSLOCK 0x00100000
+#define UKBD_FLAG_SCROLLLOCK 0x00200000
int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
int sc_state; /* shift/lock key state */
int sc_accents; /* accent key index (> 0) */
int sc_poll_tick_last;
+ int sc_led_size;
+ int sc_kbd_size;
uint16_t sc_inputs;
uint16_t sc_inputhead;
uint16_t sc_inputtail;
+ uint16_t sc_modifiers;
uint8_t sc_leds; /* store for async led requests */
uint8_t sc_iface_index;
uint8_t sc_iface_no;
+ uint8_t sc_id_apple_eject;
+ uint8_t sc_id_apple_fn;
+ uint8_t sc_id_ctrl_l;
+ uint8_t sc_id_ctrl_r;
+ uint8_t sc_id_shift_l;
+ uint8_t sc_id_shift_r;
+ uint8_t sc_id_alt_l;
+ uint8_t sc_id_alt_r;
+ uint8_t sc_id_win_l;
+ uint8_t sc_id_win_r;
+ uint8_t sc_id_event;
+ uint8_t sc_id_numlock;
+ uint8_t sc_id_capslock;
+ uint8_t sc_id_scrolllock;
+ uint8_t sc_id_events;
uint8_t sc_kbd_id;
- uint8_t sc_led_id;
+
uint8_t sc_poll_detected;
+ uint8_t sc_buffer[UKBD_BUFFER_SIZE];
};
#define KEY_ERROR 0x01
@@ -261,6 +310,22 @@ static const uint8_t ukbd_trtab[256] = {
NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
};
+static const uint8_t ukbd_boot_desc[] = {
+ 0x05, 0x01, 0x09, 0x06, 0xa1,
+ 0x01, 0x05, 0x07, 0x19, 0xe0,
+ 0x29, 0xe7, 0x15, 0x00, 0x25,
+ 0x01, 0x75, 0x01, 0x95, 0x08,
+ 0x81, 0x02, 0x95, 0x01, 0x75,
+ 0x08, 0x81, 0x01, 0x95, 0x03,
+ 0x75, 0x01, 0x05, 0x08, 0x19,
+ 0x01, 0x29, 0x03, 0x91, 0x02,
+ 0x95, 0x05, 0x75, 0x01, 0x91,
+ 0x01, 0x95, 0x06, 0x75, 0x08,
+ 0x15, 0x00, 0x26, 0xff, 0x00,
+ 0x05, 0x07, 0x19, 0x00, 0x2a,
+ 0xff, 0x00, 0x81, 0x00, 0xc0
+};
+
/* prototypes */
static void ukbd_timeout(void *);
static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
@@ -323,6 +388,33 @@ ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
}
static void
+ukbd_yield(void)
+{
+ struct thread *td = curthread;
+ uint32_t old_prio;
+
+ DROP_GIANT();
+
+ thread_lock(td);
+
+ /* get current priority */
+ old_prio = td->td_base_pri;
+
+ /* set new priority */
+ sched_prio(td, td->td_user_pri);
+
+ /* cause a task switch */
+ mi_switch(SW_INVOL | SWT_RELINQUISH, NULL);
+
+ /* restore priority */
+ sched_prio(td, old_prio);
+
+ thread_unlock(td);
+
+ PICKUP_GIANT();
+}
+
+static void
ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
{
DPRINTFN(2, "polling\n");
@@ -333,8 +425,9 @@ ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
if (kdb_active == 0) {
while (sc->sc_inputs == 0) {
- /* make sure the USB code gets a chance to run */
- pause("UKBD", 1);
+
+ /* give USB threads a chance to run */
+ ukbd_yield();
/* check if we should wait */
if (!wait)
@@ -561,8 +654,6 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
uint8_t i;
uint8_t offset;
uint8_t id;
- uint8_t apple_fn;
- uint8_t apple_eject;
int len;
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
@@ -580,73 +671,145 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
if (sc->sc_kbd_id != 0) {
/* check and remove HID ID byte */
usbd_copy_out(pc, 0, &id, 1);
- if (id != sc->sc_kbd_id) {
- DPRINTF("wrong HID ID\n");
- goto tr_setup;
- }
offset = 1;
len--;
+ if (len == 0) {
+ DPRINTF("zero length data\n");
+ goto tr_setup;
+ }
} else {
offset = 0;
+ id = 0;
}
- if (len > sizeof(sc->sc_ndata)) {
- len = sizeof(sc->sc_ndata);
- }
+ if (len > UKBD_BUFFER_SIZE)
+ len = UKBD_BUFFER_SIZE;
- if (len) {
- memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
- usbd_copy_out(pc, offset, &sc->sc_ndata, len);
+ /* get data */
+ usbd_copy_out(pc, offset, sc->sc_buffer, len);
- if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
- hid_get_data((uint8_t *)&sc->sc_ndata,
- len, &sc->sc_loc_apple_eject))
- apple_eject = 1;
- else
- apple_eject = 0;
+ /* clear temporary storage */
+ memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
- if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
- hid_get_data((uint8_t *)&sc->sc_ndata,
- len, &sc->sc_loc_apple_fn))
- apple_fn = 1;
+ /* scan through HID data */
+ if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
+ (id == sc->sc_id_apple_eject)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
+ sc->sc_modifiers |= MOD_EJECT;
else
- apple_fn = 0;
-#ifdef USB_DEBUG
- DPRINTF("apple_eject=%u apple_fn=%u\n",
- apple_eject, apple_fn);
+ sc->sc_modifiers &= ~MOD_EJECT;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
+ (id == sc->sc_id_apple_fn)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
+ sc->sc_modifiers |= MOD_FN;
+ else
+ sc->sc_modifiers &= ~MOD_FN;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
+ (id == sc->sc_id_ctrl_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
+ sc-> sc_modifiers |= MOD_CONTROL_L;
+ else
+ sc-> sc_modifiers &= ~MOD_CONTROL_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
+ (id == sc->sc_id_ctrl_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
+ sc->sc_modifiers |= MOD_CONTROL_R;
+ else
+ sc->sc_modifiers &= ~MOD_CONTROL_R;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
+ (id == sc->sc_id_shift_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
+ sc->sc_modifiers |= MOD_SHIFT_L;
+ else
+ sc->sc_modifiers &= ~MOD_SHIFT_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
+ (id == sc->sc_id_shift_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
+ sc->sc_modifiers |= MOD_SHIFT_R;
+ else
+ sc->sc_modifiers &= ~MOD_SHIFT_R;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
+ (id == sc->sc_id_alt_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
+ sc->sc_modifiers |= MOD_ALT_L;
+ else
+ sc->sc_modifiers &= ~MOD_ALT_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
+ (id == sc->sc_id_alt_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
+ sc->sc_modifiers |= MOD_ALT_R;
+ else
+ sc->sc_modifiers &= ~MOD_ALT_R;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
+ (id == sc->sc_id_win_l)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
+ sc->sc_modifiers |= MOD_WIN_L;
+ else
+ sc->sc_modifiers &= ~MOD_WIN_L;
+ }
+ if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
+ (id == sc->sc_id_win_r)) {
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
+ sc->sc_modifiers |= MOD_WIN_R;
+ else
+ sc->sc_modifiers &= ~MOD_WIN_R;
+ }
- if (sc->sc_ndata.modifiers) {
- DPRINTF("mod: 0x%04x\n", sc->sc_ndata.modifiers);
+ sc->sc_ndata.modifiers = sc->sc_modifiers;
+
+ if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
+ (id == sc->sc_id_events)) {
+ i = sc->sc_loc_events.count;
+ if (i > UKBD_NKEYCODE)
+ i = UKBD_NKEYCODE;
+ if (i > len)
+ i = len;
+ while (i--) {
+ sc->sc_ndata.keycode[i] =
+ hid_get_data(sc->sc_buffer + i, len - i,
+ &sc->sc_loc_events);
}
- for (i = 0; i < UKBD_NKEYCODE; i++) {
- if (sc->sc_ndata.keycode[i]) {
- DPRINTF("[%d] = %d\n", i, sc->sc_ndata.keycode[i]);
- }
- }
-#endif /* USB_DEBUG */
+ }
- if (apple_fn) {
- for (i = 0; i < UKBD_NKEYCODE; i++) {
- sc->sc_ndata.keycode[i] =
- ukbd_apple_fn(sc->sc_ndata.keycode[i]);
- }
+#ifdef USB_DEBUG
+ DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
+ for (i = 0; i < UKBD_NKEYCODE; i++) {
+ if (sc->sc_ndata.keycode[i]) {
+ DPRINTF("[%d] = 0x%02x\n",
+ (int)i, (int)sc->sc_ndata.keycode[i]);
+ }
+ }
+#endif
+ if (sc->sc_modifiers & MOD_FN) {
+ for (i = 0; i < UKBD_NKEYCODE; i++) {
+ sc->sc_ndata.keycode[i] =
+ ukbd_apple_fn(sc->sc_ndata.keycode[i]);
}
+ }
- if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
- for (i = 0; i < UKBD_NKEYCODE; i++) {
- sc->sc_ndata.keycode[i] =
- ukbd_apple_swap(sc->sc_ndata.keycode[i]);
- }
+ if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
+ for (i = 0; i < UKBD_NKEYCODE; i++) {
+ sc->sc_ndata.keycode[i] =
+ ukbd_apple_swap(sc->sc_ndata.keycode[i]);
}
+ }
- ukbd_interrupt(sc);
+ ukbd_interrupt(sc);
- if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
- if (ukbd_any_key_pressed(sc)) {
- ukbd_start_timer(sc);
- }
+ if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
+ if (ukbd_any_key_pressed(sc)) {
+ ukbd_start_timer(sc);
}
}
+
case USB_ST_SETUP:
tr_setup:
if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
@@ -672,10 +835,12 @@ tr_setup:
static void
ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
{
+ struct ukbd_softc *sc = usbd_xfer_softc(xfer);
struct usb_device_request req;
struct usb_page_cache *pc;
- uint8_t buf[2];
- struct ukbd_softc *sc = usbd_xfer_softc(xfer);
+ uint8_t id;
+ uint8_t any;
+ int len;
#ifdef USB_DEBUG
if (ukbd_no_leds)
@@ -685,37 +850,83 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
case USB_ST_SETUP:
- if (sc->sc_flags & UKBD_FLAG_SET_LEDS) {
- sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
-
- req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
- req.bRequest = UR_SET_REPORT;
- USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
- req.wIndex[0] = sc->sc_iface_no;
- req.wIndex[1] = 0;
- req.wLength[1] = 0;
-
- /* check if we need to prefix an ID byte */
- if (sc->sc_led_id != 0) {
- req.wLength[0] = 2;
- buf[0] = sc->sc_led_id;
- buf[1] = sc->sc_leds;
- } else {
- req.wLength[0] = 1;
- buf[0] = sc->sc_leds;
- buf[1] = 0;
+ if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
+ break;
+ sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
+
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = UR_SET_REPORT;
+ USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
+ req.wIndex[0] = sc->sc_iface_no;
+ req.wIndex[1] = 0;
+ req.wLength[1] = 0;
+
+ memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
+
+ id = 0;
+ any = 0;
+
+ /* Assumption: All led bits must be in the same ID. */
+
+ if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
+ if (sc->sc_leds & NLKED) {
+ hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
+ &sc->sc_loc_numlock, 1);
}
+ id = sc->sc_id_numlock;
+ any = 1;
+ }
- pc = usbd_xfer_get_frame(xfer, 0);
- usbd_copy_in(pc, 0, &req, sizeof(req));
- pc = usbd_xfer_get_frame(xfer, 1);
- usbd_copy_in(pc, 0, buf, sizeof(buf));
+ if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
+ if (sc->sc_leds & SLKED) {
+ hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
+ &sc->sc_loc_scrolllock, 1);
+ }
+ id = sc->sc_id_scrolllock;
+ any = 1;
+ }
- usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
- usbd_xfer_set_frame_len(xfer, 1, req.wLength[0]);
- usbd_xfer_set_frames(xfer, 2);
- usbd_transfer_submit(xfer);
+ if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
+ if (sc->sc_leds & CLKED) {
+ hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
+ &sc->sc_loc_capslock, 1);
+ }
+ id = sc->sc_id_capslock;
+ any = 1;
}
+
+ /* if no leds, nothing to do */
+ if (!any)
+ break;
+
+ /* range check output report length */
+ len = sc->sc_led_size;
+ if (len > (UKBD_BUFFER_SIZE - 1))
+ len = (UKBD_BUFFER_SIZE - 1);
+
+ /* check if we need to prefix an ID byte */
+ sc->sc_buffer[0] = id;
+
+ pc = usbd_xfer_get_frame(xfer, 1);
+ if (id != 0) {
+ len++;
+ usbd_copy_in(pc, 0, sc->sc_buffer, len);
+ } else {
+ usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
+ }
+ req.wLength[0] = len;
+ usbd_xfer_set_frame_len(xfer, 1, len);
+
+ DPRINTF("len=%d, id=%d\n", len, id);
+
+ /* setup control request last */
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_in(pc, 0, &req, sizeof(req));
+ usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
+
+ /* start data transfer */
+ usbd_xfer_set_frames(xfer, 2);
+ usbd_transfer_submit(xfer);
break;
default: /* Error */
@@ -739,12 +950,19 @@ static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
.type = UE_CONTROL,
.endpoint = 0x00, /* Control pipe */
.direction = UE_DIR_ANY,
- .bufsize = sizeof(struct usb_device_request) + 8,
+ .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
.callback = &ukbd_set_leds_callback,
.timeout = 1000, /* 1 second */
},
};
+/* A match on these entries will load ukbd */
+static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
+ {USB_IFACE_CLASS(UICLASS_HID),
+ USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
+ USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
+};
+
static int
ukbd_probe(device_t dev)
{
@@ -801,6 +1019,140 @@ ukbd_probe(device_t dev)
return (error);
}
+static void
+ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
+{
+ uint32_t flags;
+
+ /* reset detected bits */
+ sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
+
+ /* check if there is an ID byte */
+ sc->sc_kbd_size = hid_report_size(ptr, len,
+ hid_input, &sc->sc_kbd_id);
+
+ /* investigate if this is an Apple Keyboard */
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
+ hid_input, 0, &sc->sc_loc_apple_eject, &flags,
+ &sc->sc_id_apple_eject)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
+ UKBD_FLAG_APPLE_SWAP;
+ DPRINTFN(1, "Found Apple eject-key\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(0xFFFF, 0x0003),
+ hid_input, 0, &sc->sc_loc_apple_fn, &flags,
+ &sc->sc_id_apple_fn)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_APPLE_FN;
+ DPRINTFN(1, "Found Apple FN-key\n");
+ }
+ /* figure out some keys */
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE0),
+ hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
+ &sc->sc_id_ctrl_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_CTRL_L;
+ DPRINTFN(1, "Found left control\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE4),
+ hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
+ &sc->sc_id_ctrl_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_CTRL_R;
+ DPRINTFN(1, "Found right control\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE1),
+ hid_input, 0, &sc->sc_loc_shift_l, &flags,
+ &sc->sc_id_shift_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_SHIFT_L;
+ DPRINTFN(1, "Found left shift\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE5),
+ hid_input, 0, &sc->sc_loc_shift_r, &flags,
+ &sc->sc_id_shift_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_SHIFT_R;
+ DPRINTFN(1, "Found right shift\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE2),
+ hid_input, 0, &sc->sc_loc_alt_l, &flags,
+ &sc->sc_id_alt_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_ALT_L;
+ DPRINTFN(1, "Found left alt\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE6),
+ hid_input, 0, &sc->sc_loc_alt_r, &flags,
+ &sc->sc_id_alt_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_ALT_R;
+ DPRINTFN(1, "Found right alt\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE3),
+ hid_input, 0, &sc->sc_loc_win_l, &flags,
+ &sc->sc_id_win_l)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_WIN_L;
+ DPRINTFN(1, "Found left GUI\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0xE7),
+ hid_input, 0, &sc->sc_loc_win_r, &flags,
+ &sc->sc_id_win_r)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_WIN_R;
+ DPRINTFN(1, "Found right GUI\n");
+ }
+ /* figure out event buffer */
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_KEYBOARD, 0x00),
+ hid_input, 0, &sc->sc_loc_events, &flags,
+ &sc->sc_id_events)) {
+ sc->sc_flags |= UKBD_FLAG_EVENTS;
+ DPRINTFN(1, "Found keyboard events\n");
+ }
+
+ /* figure out leds on keyboard */
+ sc->sc_led_size = hid_report_size(ptr, len,
+ hid_output, NULL);
+
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_LEDS, 0x01),
+ hid_output, 0, &sc->sc_loc_numlock, &flags,
+ &sc->sc_id_numlock)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_NUMLOCK;
+ DPRINTFN(1, "Found keyboard numlock\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_LEDS, 0x02),
+ hid_output, 0, &sc->sc_loc_capslock, &flags,
+ &sc->sc_id_capslock)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
+ DPRINTFN(1, "Found keyboard capslock\n");
+ }
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_LEDS, 0x03),
+ hid_output, 0, &sc->sc_loc_scrolllock, &flags,
+ &sc->sc_id_scrolllock)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
+ DPRINTFN(1, "Found keyboard scrolllock\n");
+ }
+}
+
static int
ukbd_attach(device_t dev)
{
@@ -810,7 +1162,6 @@ ukbd_attach(device_t dev)
keyboard_t *kbd = &sc->sc_kbd;
void *hid_ptr = NULL;
usb_error_t err;
- uint32_t flags;
uint16_t n;
uint16_t hid_len;
@@ -857,64 +1208,38 @@ ukbd_attach(device_t dev)
*/
KBD_PROBE_DONE(kbd);
- /*
- * Set boot protocol if we need the quirk.
- */
- if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO)) {
- err = usbd_req_set_protocol(sc->sc_udev, NULL,
- sc->sc_iface_index, 0);
- if (err != USB_ERR_NORMAL_COMPLETION) {
- DPRINTF("set protocol error=%s\n", usbd_errstr(err));
- goto detach;
- }
- }
-
- /* figure out if there is an ID byte in the data */
+ /* get HID descriptor */
err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
&hid_len, M_TEMP, uaa->info.bIfaceIndex);
+
if (err == 0) {
- uint8_t apple_keys = 0;
- uint8_t temp_id;
-
- /* investigate if this is an Apple Keyboard */
- if (hid_locate(hid_ptr, hid_len,
- HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
- hid_input, 0, &sc->sc_loc_apple_eject, &flags,
- &temp_id)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
- UKBD_FLAG_APPLE_SWAP;
- DPRINTFN(1, "Found Apple eject-key\n");
- apple_keys = 1;
- sc->sc_kbd_id = temp_id;
- }
- if (hid_locate(hid_ptr, hid_len,
- HID_USAGE2(0xFFFF, 0x0003),
- hid_input, 0, &sc->sc_loc_apple_fn, &flags,
- &temp_id)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= UKBD_FLAG_APPLE_FN;
- DPRINTFN(1, "Found Apple FN-key\n");
- apple_keys = 1;
- sc->sc_kbd_id = temp_id;
- }
- if (apple_keys == 0) {
- /*
- * Assume the first HID ID contains the
- * keyboard data
- */
- hid_report_size(hid_ptr, hid_len,
- hid_input, &sc->sc_kbd_id);
- }
+ DPRINTF("Parsing HID descriptor of %d bytes\n",
+ (int)hid_len);
- /* investigate if we need an ID-byte for the leds */
- hid_report_size(hid_ptr, hid_len, hid_output, &sc->sc_led_id);
+ ukbd_parse_hid(sc, hid_ptr, hid_len);
free(hid_ptr, M_TEMP);
}
+ /* check if we should use the boot protocol */
+ if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
+ (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
+
+ DPRINTF("Forcing boot protocol\n");
+
+ err = usbd_req_set_protocol(sc->sc_udev, NULL,
+ sc->sc_iface_index, 0);
+
+ if (err != 0) {
+ DPRINTF("Set protocol error=%s (ignored)\n",
+ usbd_errstr(err));
+ }
+
+ ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
+ }
+
/* ignore if SETIDLE fails, hence it is not crucial */
- err = usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
+ usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
mtx_lock(&Giant);
@@ -1461,10 +1786,6 @@ errkey:
static int
ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
{
- /* translate LED_XXX bits into the device specific bits */
- static const uint8_t ledmap[8] = {
- 0, 2, 1, 3, 4, 6, 5, 7,
- };
struct ukbd_softc *sc = kbd->kb_data;
int i;
@@ -1540,10 +1861,11 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
#endif
case KDSETLED: /* set keyboard LED */
/* NOTE: lock key state in "sc_state" won't be changed */
- if (*(int *)arg & ~LOCK_MASK) {
+ if (*(int *)arg & ~LOCK_MASK)
return (EINVAL);
- }
+
i = *(int *)arg;
+
/* replace CAPS LED with ALTGR LED for ALTGR keyboards */
if (sc->sc_mode == K_XLATE &&
kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
@@ -1552,9 +1874,9 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
else
i &= ~CLKED;
}
- if (KBD_HAS_DEVICE(kbd)) {
- ukbd_set_leds(sc, ledmap[i & LED_MASK]);
- }
+ if (KBD_HAS_DEVICE(kbd))
+ ukbd_set_leds(sc, i);
+
KBD_LED_VAL(kbd) = *(int *)arg;
break;
case KDGKBSTATE: /* get lock key state */
@@ -1607,6 +1929,8 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
return (ukbd_set_typematic(kbd, *(int *)arg));
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table
+ * (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table
* entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c
index af9aa1f..3c4f36e 100644
--- a/sys/dev/usb/input/ums.c
+++ b/sys/dev/usb/input/ums.c
@@ -355,6 +355,13 @@ static const struct usb_config ums_config[UMS_N_TRANSFER] = {
},
};
+/* A match on these entries will load ums */
+static const STRUCT_USB_HOST_ID __used ums_devs[] = {
+ {USB_IFACE_CLASS(UICLASS_HID),
+ USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
+ USB_IFACE_PROTOCOL(UIPROTO_MOUSE),},
+};
+
static int
ums_probe(device_t dev)
{
diff --git a/sys/dev/usb/misc/udbp.c b/sys/dev/usb/misc/udbp.c
index 38a4fee..1a72cae 100644
--- a/sys/dev/usb/misc/udbp.c
+++ b/sys/dev/usb/misc/udbp.c
@@ -288,40 +288,27 @@ udbp_modload(module_t mod, int event, void *data)
return (error);
}
+static const STRUCT_USB_HOST_ID udbp_devs[] = {
+ {USB_VPI(USB_VENDOR_NETCHIP, USB_PRODUCT_NETCHIP_TURBOCONNECT, 0)},
+ {USB_VPI(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2301, 0)},
+ {USB_VPI(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2302, 0)},
+ {USB_VPI(USB_VENDOR_ANCHOR, USB_PRODUCT_ANCHOR_EZLINK, 0)},
+ {USB_VPI(USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL620USB, 0)},
+};
+
static int
udbp_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
+ return (ENXIO);
+ if (uaa->info.bConfigIndex != 0)
+ return (ENXIO);
+ if (uaa->info.bIfaceIndex != 0)
return (ENXIO);
- }
- /*
- * XXX Julian, add the id of the device if you have one to test
- * things with. run 'usbdevs -v' and note the 3 ID's that appear.
- * The Vendor Id and Product Id are in hex and the Revision Id is in
- * bcd. But as usual if the revision is 0x101 then you should
- * compare the revision id in the device descriptor with 0x101 Or go
- * search the file usbdevs.h. Maybe the device is already in there.
- */
- if (((uaa->info.idVendor == USB_VENDOR_NETCHIP) &&
- (uaa->info.idProduct == USB_PRODUCT_NETCHIP_TURBOCONNECT)))
- return (0);
-
- if (((uaa->info.idVendor == USB_VENDOR_PROLIFIC) &&
- ((uaa->info.idProduct == USB_PRODUCT_PROLIFIC_PL2301) ||
- (uaa->info.idProduct == USB_PRODUCT_PROLIFIC_PL2302))))
- return (0);
-
- if ((uaa->info.idVendor == USB_VENDOR_ANCHOR) &&
- (uaa->info.idProduct == USB_PRODUCT_ANCHOR_EZLINK))
- return (0);
-
- if ((uaa->info.idVendor == USB_VENDOR_GENESYS) &&
- (uaa->info.idProduct == USB_PRODUCT_GENESYS_GL620USB))
- return (0);
- return (ENXIO);
+ return (usbd_lookup_id_by_uaa(udbp_devs, sizeof(udbp_devs), uaa));
}
static int
diff --git a/sys/dev/usb/misc/ufm.c b/sys/dev/usb/misc/ufm.c
index 75e2b7f..11bea65 100644
--- a/sys/dev/usb/misc/ufm.c
+++ b/sys/dev/usb/misc/ufm.c
@@ -118,19 +118,23 @@ DRIVER_MODULE(ufm, uhub, ufm_driver, ufm_devclass, NULL, 0);
MODULE_DEPEND(ufm, usb, 1, 1, 1);
MODULE_VERSION(ufm, 1);
+static const STRUCT_USB_HOST_ID ufm_devs[] = {
+ {USB_VPI(USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_FMRADIO, 0)},
+};
+
static int
ufm_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
- if ((uaa->info.idVendor == USB_VENDOR_CYPRESS) &&
- (uaa->info.idProduct == USB_PRODUCT_CYPRESS_FMRADIO)) {
- return (0);
- }
- return (ENXIO);
+ if (uaa->info.bConfigIndex != 0)
+ return (ENXIO);
+ if (uaa->info.bIfaceIndex != 0)
+ return (ENXIO);
+
+ return (usbd_lookup_id_by_uaa(ufm_devs, sizeof(ufm_devs), uaa));
}
static int
diff --git a/sys/dev/usb/net/if_aue.c b/sys/dev/usb/net/if_aue.c
index 3716844..71871de 100644
--- a/sys/dev/usb/net/if_aue.c
+++ b/sys/dev/usb/net/if_aue.c
@@ -110,7 +110,7 @@ SYSCTL_INT(_hw_usb_aue, OID_AUTO, debug, CTLFLAG_RW, &aue_debug, 0,
/*
* Various supported device vendors/products.
*/
-static const struct usb_device_id aue_devs[] = {
+static const STRUCT_USB_HOST_ID aue_devs[] = {
#define AUE_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
AUE_DEV(3COM, 3C460B, AUE_FLAG_PII),
AUE_DEV(ABOCOM, DSB650TX_PNA, 0),
diff --git a/sys/dev/usb/net/if_axe.c b/sys/dev/usb/net/if_axe.c
index 00d1c0b..b4e27f8 100644
--- a/sys/dev/usb/net/if_axe.c
+++ b/sys/dev/usb/net/if_axe.c
@@ -133,7 +133,7 @@ SYSCTL_INT(_hw_usb_axe, OID_AUTO, debug, CTLFLAG_RW, &axe_debug, 0,
/*
* Various supported device vendors/products.
*/
-static const struct usb_device_id axe_devs[] = {
+static const STRUCT_USB_HOST_ID axe_devs[] = {
#define AXE_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
AXE_DEV(ABOCOM, UF200, 0),
AXE_DEV(ACERCM, EP1427X2, 0),
@@ -142,6 +142,7 @@ static const struct usb_device_id axe_devs[] = {
AXE_DEV(ASIX, AX88178, AXE_FLAG_178),
AXE_DEV(ASIX, AX88772, AXE_FLAG_772),
AXE_DEV(ASIX, AX88772A, AXE_FLAG_772A),
+ AXE_DEV(ASIX, AX88772B, AXE_FLAG_772B),
AXE_DEV(ATEN, UC210T, 0),
AXE_DEV(BELKIN, F5D5055, AXE_FLAG_178),
AXE_DEV(BILLIONTON, USB2AR, 0),
@@ -190,7 +191,9 @@ static void axe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
static int axe_cmd(struct axe_softc *, int, int, int, void *);
static void axe_ax88178_init(struct axe_softc *);
static void axe_ax88772_init(struct axe_softc *);
+static void axe_ax88772_phywake(struct axe_softc *);
static void axe_ax88772a_init(struct axe_softc *);
+static void axe_ax88772b_init(struct axe_softc *);
static int axe_get_phyno(struct axe_softc *, int);
static const struct usb_config axe_config[AXE_N_TRANSFER] = {
@@ -217,6 +220,17 @@ static const struct usb_config axe_config[AXE_N_TRANSFER] = {
},
};
+static const struct ax88772b_mfb ax88772b_mfb_table[] = {
+ { 0x8000, 0x8001, 2048 },
+ { 0x8100, 0x8147, 4096},
+ { 0x8200, 0x81EB, 6144},
+ { 0x8300, 0x83D7, 8192},
+ { 0x8400, 0x851E, 16384},
+ { 0x8500, 0x8666, 20480},
+ { 0x8600, 0x87AE, 24576},
+ { 0x8700, 0x8A3D, 32768}
+};
+
static device_method_t axe_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, axe_probe),
@@ -669,16 +683,11 @@ axe_ax88772_init(struct axe_softc *sc)
}
static void
-axe_ax88772a_init(struct axe_softc *sc)
+axe_ax88772_phywake(struct axe_softc *sc)
{
struct usb_ether *ue;
- uint16_t eeprom;
ue = &sc->sc_ue;
- axe_cmd(sc, AXE_CMD_SROM_READ, 0, 0x0017, &eeprom);
- eeprom = le16toh(eeprom);
- /* Reload EEPROM. */
- AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
if (sc->sc_phyno == AXE_772_PHY_NO_EPHY) {
/* Manually select internal(embedded) PHY - MAC mode. */
axe_cmd(sc, AXE_CMD_SW_PHY_SELECT, 0, AXE_SW_PHY_SELECT_SS_ENB |
@@ -704,6 +713,55 @@ axe_ax88772a_init(struct axe_softc *sc)
uether_pause(&sc->sc_ue, hz / 32);
axe_cmd(sc, AXE_CMD_SW_RESET_REG, 0, AXE_SW_RESET_IPRL, NULL);
uether_pause(&sc->sc_ue, hz / 32);
+}
+
+static void
+axe_ax88772a_init(struct axe_softc *sc)
+{
+ struct usb_ether *ue;
+
+ ue = &sc->sc_ue;
+ /* Reload EEPROM. */
+ AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
+ axe_ax88772_phywake(sc);
+ /* Stop MAC. */
+ axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL);
+}
+
+static void
+axe_ax88772b_init(struct axe_softc *sc)
+{
+ struct usb_ether *ue;
+ uint16_t eeprom;
+ uint8_t *eaddr;
+ int i;
+
+ ue = &sc->sc_ue;
+ /* Reload EEPROM. */
+ AXE_GPIO_WRITE(AXE_GPIO_RELOAD_EEPROM, hz / 32);
+ /*
+ * Save PHY power saving configuration(high byte) and
+ * clear EEPROM checksum value(low byte).
+ */
+ axe_cmd(sc, AXE_CMD_SROM_READ, 0, AXE_EEPROM_772B_PHY_PWRCFG, &eeprom);
+ sc->sc_pwrcfg = le16toh(eeprom) & 0xFF00;
+
+ /*
+ * Auto-loaded default station address from internal ROM is
+ * 00:00:00:00:00:00 such that an explicit access to EEPROM
+ * is required to get real station address.
+ */
+ eaddr = ue->ue_eaddr;
+ for (i = 0; i < ETHER_ADDR_LEN / 2; i++) {
+ axe_cmd(sc, AXE_CMD_SROM_READ, 0, AXE_EEPROM_772B_NODE_ID + i,
+ &eeprom);
+ eeprom = le16toh(eeprom);
+ *eaddr++ = (uint8_t)(eeprom & 0xFF);
+ *eaddr++ = (uint8_t)((eeprom >> 8) & 0xFF);
+ }
+ /* Wakeup PHY. */
+ axe_ax88772_phywake(sc);
+ /* Stop MAC. */
axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, 0, NULL);
}
@@ -732,6 +790,8 @@ axe_reset(struct axe_softc *sc)
axe_ax88772_init(sc);
else if (sc->sc_flags & AXE_FLAG_772A)
axe_ax88772a_init(sc);
+ else if (sc->sc_flags & AXE_FLAG_772B)
+ axe_ax88772b_init(sc);
}
static void
@@ -755,29 +815,29 @@ axe_attach_post(struct usb_ether *ue)
sc->sc_phyno = 0;
}
+ /* Initialize controller and get station address. */
if (sc->sc_flags & AXE_FLAG_178) {
axe_ax88178_init(sc);
sc->sc_tx_bufsz = 16 * 1024;
+ axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
} else if (sc->sc_flags & AXE_FLAG_772) {
axe_ax88772_init(sc);
sc->sc_tx_bufsz = 8 * 1024;
+ axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
} else if (sc->sc_flags & AXE_FLAG_772A) {
axe_ax88772a_init(sc);
sc->sc_tx_bufsz = 8 * 1024;
- }
-
- /*
- * Get station address.
- */
- if (AXE_IS_178_FAMILY(sc))
axe_cmd(sc, AXE_178_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
- else
+ } else if (sc->sc_flags & AXE_FLAG_772B) {
+ axe_ax88772b_init(sc);
+ sc->sc_tx_bufsz = 8 * 1024;
+ } else
axe_cmd(sc, AXE_172_CMD_READ_NODEID, 0, 0, ue->ue_eaddr);
/*
* Fetch IPG values.
*/
- if (sc->sc_flags & AXE_FLAG_772A) {
+ if (sc->sc_flags & (AXE_FLAG_772A | AXE_FLAG_772B)) {
/* Set IPG values. */
sc->sc_ipgs[0] = 0x15;
sc->sc_ipgs[1] = 0x16;
@@ -1104,18 +1164,30 @@ axe_init(struct usb_ether *ue)
axe_cmd(sc, AXE_172_CMD_WRITE_IPG2, 0, sc->sc_ipgs[2], NULL);
}
- /* Enable receiver, set RX mode */
+ /* AX88772B uses different maximum frame burst configuration. */
+ if (sc->sc_flags & AXE_FLAG_772B)
+ axe_cmd(sc, AXE_772B_CMD_RXCTL_WRITE_CFG,
+ ax88772b_mfb_table[AX88772B_MFB_16K].threshold,
+ ax88772b_mfb_table[AX88772B_MFB_16K].byte_cnt, NULL);
+
+ /* Enable receiver, set RX mode. */
rxmode = (AXE_RXCMD_MULTICAST | AXE_RXCMD_ENABLE);
if (AXE_IS_178_FAMILY(sc)) {
-#if 0
- rxmode |= AXE_178_RXCMD_MFB_2048; /* chip default */
-#else
- /*
- * Default Rx buffer size is too small to get
- * maximum performance.
- */
- rxmode |= AXE_178_RXCMD_MFB_16384;
-#endif
+ if (sc->sc_flags & AXE_FLAG_772B) {
+ /*
+ * Select RX header format type 1. Aligning IP
+ * header on 4 byte boundary is not needed
+ * because we always copy the received frame in
+ * RX handler.
+ */
+ rxmode |= AXE_772B_RXCMD_HDR_TYPE_1;
+ } else {
+ /*
+ * Default Rx buffer size is too small to get
+ * maximum performance.
+ */
+ rxmode |= AXE_178_RXCMD_MFB_16384;
+ }
} else {
rxmode |= AXE_172_RXCMD_UNICAST;
}
diff --git a/sys/dev/usb/net/if_axereg.h b/sys/dev/usb/net/if_axereg.h
index 6772911..6e08997 100644
--- a/sys/dev/usb/net/if_axereg.h
+++ b/sys/dev/usb/net/if_axereg.h
@@ -96,6 +96,8 @@
#define AXE_CMD_READ_VLAN_CTRL 0x4027
#define AXE_CMD_WRITE_VLAN_CTRL 0x4028
+#define AXE_772B_CMD_RXCTL_WRITE_CFG 0x012A
+
#define AXE_SW_RESET_CLEAR 0x00
#define AXE_SW_RESET_RR 0x01
#define AXE_SW_RESET_RT 0x02
@@ -132,12 +134,18 @@
#define AXE_178_RXCMD_KEEP_INVALID_CRC 0x0004
#define AXE_RXCMD_BROADCAST 0x0008
#define AXE_RXCMD_MULTICAST 0x0010
+#define AXE_RXCMD_ACCEPT_RUNT 0x0040 /* AX88772B */
#define AXE_RXCMD_ENABLE 0x0080
#define AXE_178_RXCMD_MFB_MASK 0x0300
#define AXE_178_RXCMD_MFB_2048 0x0000
#define AXE_178_RXCMD_MFB_4096 0x0100
#define AXE_178_RXCMD_MFB_8192 0x0200
#define AXE_178_RXCMD_MFB_16384 0x0300
+#define AXE_772B_RXCMD_HDR_TYPE_0 0x0000
+#define AXE_772B_RXCMD_HDR_TYPE_1 0x0100
+#define AXE_772B_RXCMD_IPHDR_ALIGN 0x0200
+#define AXE_772B_RXCMD_ADD_CHKSUM 0x0400
+#define AXE_RXCMD_LOOPBACK 0x1000 /* AX88772A/AX88772B */
#define AXE_PHY_SEL_PRI 1
#define AXE_PHY_SEL_SEC 0
@@ -176,7 +184,7 @@
#define AXE_PHY_MODE_REALTEK_8251CL 0x0E
#define AXE_PHY_MODE_ATTANSIC 0x40
-/* AX88772A only. */
+/* AX88772A/AX88772B only. */
#define AXE_SW_PHY_SELECT_EXT 0x0000
#define AXE_SW_PHY_SELECT_EMBEDDED 0x0001
#define AXE_SW_PHY_SELECT_AUTO 0x0002
@@ -199,6 +207,24 @@
#define AXE_CONFIG_IDX 0 /* config number 1 */
#define AXE_IFACE_IDX 0
+/* EEPROM Map. */
+#define AXE_EEPROM_772B_NODE_ID 0x04
+#define AXE_EEPROM_772B_PHY_PWRCFG 0x18
+
+struct ax88772b_mfb {
+ int byte_cnt;
+ int threshold;
+ int size;
+};
+#define AX88772B_MFB_2K 0
+#define AX88772B_MFB_4K 1
+#define AX88772B_MFB_6K 2
+#define AX88772B_MFB_8K 3
+#define AX88772B_MFB_16K 4
+#define AX88772B_MFB_20K 5
+#define AX88772B_MFB_24K 6
+#define AX88772B_MFB_32K 7
+
struct axe_sframe_hdr {
uint16_t len;
uint16_t ilen;
@@ -228,6 +254,7 @@ struct axe_softc {
uint8_t sc_ipgs[3];
uint8_t sc_phyaddrs[2];
+ uint16_t sc_pwrcfg;
int sc_tx_bufsz;
};
diff --git a/sys/dev/usb/net/if_cdce.c b/sys/dev/usb/net/if_cdce.c
index b48e79d..12e6f67 100644
--- a/sys/dev/usb/net/if_cdce.c
+++ b/sys/dev/usb/net/if_cdce.c
@@ -263,7 +263,7 @@ static const struct usb_ether_methods cdce_ue_methods = {
.ue_setpromisc = cdce_setpromisc,
};
-static const struct usb_device_id cdce_devs[] = {
+static const STRUCT_USB_HOST_ID cdce_host_devs[] = {
{USB_VPI(USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632, CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250, CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX, CDCE_FLAG_NO_UNION)},
@@ -277,7 +277,9 @@ static const struct usb_device_id cdce_devs[] = {
{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLA300, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC700, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC750, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
+};
+static const STRUCT_USB_DUAL_ID cdce_dual_devs[] = {
{USB_IF_CSI(UICLASS_CDC, UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, 0)},
{USB_IF_CSI(UICLASS_CDC, UISUBCLASS_MOBILE_DIRECT_LINE_MODEL, 0)},
{USB_IF_CSI(UICLASS_CDC, UISUBCLASS_NETWORK_CONTROL_MODEL, 0)},
@@ -472,8 +474,12 @@ static int
cdce_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
+ int error;
- return (usbd_lookup_id_by_uaa(cdce_devs, sizeof(cdce_devs), uaa));
+ error = usbd_lookup_id_by_uaa(cdce_host_devs, sizeof(cdce_host_devs), uaa);
+ if (error)
+ error = usbd_lookup_id_by_uaa(cdce_dual_devs, sizeof(cdce_dual_devs), uaa);
+ return (error);
}
static void
diff --git a/sys/dev/usb/net/if_cue.c b/sys/dev/usb/net/if_cue.c
index fae8f70..90a18f3 100644
--- a/sys/dev/usb/net/if_cue.c
+++ b/sys/dev/usb/net/if_cue.c
@@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$");
/* Belkin F5U111 adapter covered by NETMATE entry */
-static const struct usb_device_id cue_devs[] = {
+static const STRUCT_USB_HOST_ID cue_devs[] = {
#define CUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
CUE_DEV(CATC, NETMATE),
CUE_DEV(CATC, NETMATE2),
diff --git a/sys/dev/usb/net/if_ipheth.c b/sys/dev/usb/net/if_ipheth.c
index c8a348a..d666835 100644
--- a/sys/dev/usb/net/if_ipheth.c
+++ b/sys/dev/usb/net/if_ipheth.c
@@ -148,7 +148,7 @@ static const struct usb_ether_methods ipheth_ue_methods = {
USB_IFACE_CLASS(c), USB_IFACE_SUBCLASS(sc), \
USB_IFACE_PROTOCOL(pt)
-static const struct usb_device_id ipheth_devs[] = {
+static const STRUCT_USB_HOST_ID ipheth_devs[] = {
{IPHETH_ID(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_IPHONE,
IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
IPHETH_USBINTF_PROTO)},
diff --git a/sys/dev/usb/net/if_kue.c b/sys/dev/usb/net/if_kue.c
index 6c97d28..5480a5d 100644
--- a/sys/dev/usb/net/if_kue.c
+++ b/sys/dev/usb/net/if_kue.c
@@ -100,7 +100,7 @@ __FBSDID("$FreeBSD$");
/*
* Various supported device vendors/products.
*/
-static const struct usb_device_id kue_devs[] = {
+static const STRUCT_USB_HOST_ID kue_devs[] = {
#define KUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
KUE_DEV(3COM, 3C19250),
KUE_DEV(3COM, 3C460),
diff --git a/sys/dev/usb/net/if_mos.c b/sys/dev/usb/net/if_mos.c
index a0e453c..1e884f9 100644
--- a/sys/dev/usb/net/if_mos.c
+++ b/sys/dev/usb/net/if_mos.c
@@ -146,7 +146,7 @@ SYSCTL_INT(_hw_usb_mos, OID_AUTO, debug, CTLFLAG_RW, &mos_debug, 0,
/* Various supported device vendors/products. */
-static const struct usb_device_id mos_devs[] = {
+static const STRUCT_USB_HOST_ID mos_devs[] = {
{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7730, MCS7730)},
{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7830, MCS7830)},
{USB_VPI(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_LN030, MCS7830)},
diff --git a/sys/dev/usb/net/if_rue.c b/sys/dev/usb/net/if_rue.c
index 1dadd57..afd2f4d 100644
--- a/sys/dev/usb/net/if_rue.c
+++ b/sys/dev/usb/net/if_rue.c
@@ -108,7 +108,7 @@ SYSCTL_INT(_hw_usb_rue, OID_AUTO, debug, CTLFLAG_RW,
* Various supported device vendors/products.
*/
-static const struct usb_device_id rue_devs[] = {
+static const STRUCT_USB_HOST_ID rue_devs[] = {
{USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUAKTX, 0)},
{USB_VPI(USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_USBKR100, 0)},
{USB_VPI(USB_VENDOR_OQO, USB_PRODUCT_OQO_ETHER01, 0)},
diff --git a/sys/dev/usb/net/if_udav.c b/sys/dev/usb/net/if_udav.c
index a1a0a8d..d2cceaa 100644
--- a/sys/dev/usb/net/if_udav.c
+++ b/sys/dev/usb/net/if_udav.c
@@ -199,7 +199,7 @@ SYSCTL_INT(_hw_usb_udav, OID_AUTO, debug, CTLFLAG_RW, &udav_debug, 0,
#define UDAV_CLRBIT(sc, reg, x) \
udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) & ~(x))
-static const struct usb_device_id udav_devs[] = {
+static const STRUCT_USB_HOST_ID udav_devs[] = {
/* ShanTou DM9601 USB NIC */
{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_DM9601, 0)},
/* ShanTou ST268 USB NIC */
@@ -210,6 +210,7 @@ static const struct usb_device_id udav_devs[] = {
{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_ADM8515, 0)},
/* Kontron AG USB Ethernet */
{USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_DM9601, 0)},
+ {USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_JP1082, 0)},
};
static void
diff --git a/sys/dev/usb/net/if_usie.c b/sys/dev/usb/net/if_usie.c
new file mode 100644
index 0000000..cda1d3d
--- /dev/null
+++ b/sys/dev/usb/net/if_usie.c
@@ -0,0 +1,1586 @@
+/*-
+ * Copyright (c) 2011 Anybots Inc
+ * written by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
+ * - ucom part is based on u3g.c
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/queue.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/sockio.h>
+#include <sys/socket.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/malloc.h>
+#include <sys/taskqueue.h>
+
+#include <machine/bus.h>
+
+#include <net/if.h>
+#include <net/if_types.h>
+#include <net/netisr.h>
+#include <net/bpf.h>
+#include <net/ethernet.h>
+
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
+#include <netinet/udp.h>
+
+#include <net80211/ieee80211_ioctl.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
+#include <dev/usb/usb_cdc.h>
+#include "usbdevs.h"
+
+#define USB_DEBUG_VAR usie_debug
+#include <dev/usb/usb_debug.h>
+#include <dev/usb/usb_process.h>
+#include <dev/usb/usb_msctest.h>
+
+#include <dev/usb/serial/usb_serial.h>
+
+#include <dev/usb/net/if_usievar.h>
+
+#ifdef USB_DEBUG
+static int usie_debug = 0;
+
+SYSCTL_NODE(_hw_usb, OID_AUTO, usie, CTLFLAG_RW, 0, "sierra USB modem");
+SYSCTL_INT(_hw_usb_usie, OID_AUTO, debug, CTLFLAG_RW, &usie_debug, 0,
+ "usie debug level");
+#endif
+
+/* Sierra Wireless Direct IP modems */
+static const STRUCT_USB_HOST_ID usie_devs[] = {
+#define USIE_DEV(v, d) { \
+ USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##d) }
+ USIE_DEV(SIERRA, MC8700),
+ USIE_DEV(SIERRA, TRUINSTALL),
+ USIE_DEV(AIRPRIME, USB308),
+#undef USIE_DEV
+};
+
+static device_probe_t usie_probe;
+static device_attach_t usie_attach;
+static device_detach_t usie_detach;
+
+static void usie_uc_update_line_state(struct ucom_softc *, uint8_t);
+static void usie_uc_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *);
+static void usie_uc_cfg_set_dtr(struct ucom_softc *, uint8_t);
+static void usie_uc_cfg_set_rts(struct ucom_softc *, uint8_t);
+static void usie_uc_cfg_open(struct ucom_softc *);
+static void usie_uc_cfg_close(struct ucom_softc *);
+static void usie_uc_start_read(struct ucom_softc *);
+static void usie_uc_stop_read(struct ucom_softc *);
+static void usie_uc_start_write(struct ucom_softc *);
+static void usie_uc_stop_write(struct ucom_softc *);
+
+static usb_callback_t usie_uc_tx_callback;
+static usb_callback_t usie_uc_rx_callback;
+static usb_callback_t usie_uc_status_callback;
+static usb_callback_t usie_if_tx_callback;
+static usb_callback_t usie_if_rx_callback;
+static usb_callback_t usie_if_status_callback;
+
+static void usie_if_sync_to(void *);
+static void usie_if_sync_cb(void *, int);
+static void usie_if_status_cb(void *, int);
+
+static void usie_if_start(struct ifnet *);
+static int usie_if_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct route *);
+static void usie_if_init(void *);
+static void usie_if_stop(struct usie_softc *);
+static int usie_if_ioctl(struct ifnet *, u_long, caddr_t);
+
+static int usie_do_request(struct usie_softc *, struct usb_device_request *, void *);
+static int usie_if_cmd(struct usie_softc *, uint8_t);
+static void usie_cns_req(struct usie_softc *, uint32_t, uint16_t);
+static void usie_cns_rsp(struct usie_softc *, struct usie_cns *);
+static void usie_hip_rsp(struct usie_softc *, uint8_t *, uint32_t);
+static int usie_driver_loaded(struct module *, int, void *);
+
+static const struct usb_config usie_uc_config[USIE_UC_N_XFER] = {
+ [USIE_UC_STATUS] = {
+ .type = UE_INTERRUPT,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = 0, /* use wMaxPacketSize */
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .callback = &usie_uc_status_callback,
+ },
+ [USIE_UC_RX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = USIE_BUFSIZE,
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,.proxy_buffer = 1,},
+ .callback = &usie_uc_rx_callback,
+ },
+ [USIE_UC_TX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_OUT,
+ .bufsize = USIE_BUFSIZE,
+ .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
+ .callback = &usie_uc_tx_callback,
+ }
+};
+
+static const struct usb_config usie_if_config[USIE_IF_N_XFER] = {
+ [USIE_IF_STATUS] = {
+ .type = UE_INTERRUPT,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = 0, /* use wMaxPacketSize */
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .callback = &usie_if_status_callback,
+ },
+ [USIE_IF_RX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_IN,
+ .bufsize = USIE_BUFSIZE,
+ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
+ .callback = &usie_if_rx_callback,
+ },
+ [USIE_IF_TX] = {
+ .type = UE_BULK,
+ .endpoint = UE_ADDR_ANY,
+ .direction = UE_DIR_OUT,
+ .bufsize = MAX(USIE_BUFSIZE, MCLBYTES),
+ .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
+ .callback = &usie_if_tx_callback,
+ }
+};
+
+static device_method_t usie_methods[] = {
+ DEVMETHOD(device_probe, usie_probe),
+ DEVMETHOD(device_attach, usie_attach),
+ DEVMETHOD(device_detach, usie_detach),
+ {0, 0}
+};
+
+static driver_t usie_driver = {
+ .name = "usie",
+ .methods = usie_methods,
+ .size = sizeof(struct usie_softc),
+};
+
+static devclass_t usie_devclass;
+static eventhandler_tag usie_etag;
+
+DRIVER_MODULE(usie, uhub, usie_driver, usie_devclass, usie_driver_loaded, 0);
+MODULE_DEPEND(usie, ucom, 1, 1, 1);
+MODULE_DEPEND(usie, usb, 1, 1, 1);
+MODULE_VERSION(usie, 1);
+
+static const struct ucom_callback usie_uc_callback = {
+ .ucom_cfg_get_status = &usie_uc_cfg_get_status,
+ .ucom_cfg_set_dtr = &usie_uc_cfg_set_dtr,
+ .ucom_cfg_set_rts = &usie_uc_cfg_set_rts,
+ .ucom_cfg_open = &usie_uc_cfg_open,
+ .ucom_cfg_close = &usie_uc_cfg_close,
+ .ucom_start_read = &usie_uc_start_read,
+ .ucom_stop_read = &usie_uc_stop_read,
+ .ucom_start_write = &usie_uc_start_write,
+ .ucom_stop_write = &usie_uc_stop_write,
+};
+
+static void
+usie_autoinst(void *arg, struct usb_device *udev,
+ struct usb_attach_arg *uaa)
+{
+ struct usb_interface *iface;
+ struct usb_interface_descriptor *id;
+ struct usb_device_request req;
+ int err;
+
+ if (uaa->dev_state != UAA_DEV_READY)
+ return;
+
+ iface = usbd_get_iface(udev, 0);
+ if (iface == NULL)
+ return;
+
+ id = iface->idesc;
+ if (id == NULL || id->bInterfaceClass != UICLASS_MASS)
+ return;
+
+ if (usbd_lookup_id_by_uaa(usie_devs, sizeof(usie_devs), uaa) != 0)
+ return; /* no device match */
+
+ if (bootverbose) {
+ DPRINTF("Ejecting %s %s\n",
+ usb_get_manufacturer(udev),
+ usb_get_product(udev));
+ }
+ req.bmRequestType = UT_VENDOR;
+ req.bRequest = UR_SET_INTERFACE;
+ USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP);
+ USETW(req.wIndex, UHF_PORT_CONNECTION);
+ USETW(req.wLength, 0);
+
+ /* at this moment there is no mutex */
+ err = usbd_do_request_flags(udev, NULL, &req,
+ NULL, 0, NULL, 250 /* ms */ );
+
+ /* success, mark the udev as disappearing */
+ if (err == 0)
+ uaa->dev_state = UAA_DEV_EJECTING;
+}
+
+static int
+usie_probe(device_t self)
+{
+ struct usb_attach_arg *uaa = device_get_ivars(self);
+
+ if (uaa->usb_mode != USB_MODE_HOST)
+ return (ENXIO);
+ if (uaa->info.bConfigIndex != USIE_CNFG_INDEX)
+ return (ENXIO);
+ if (uaa->info.bIfaceIndex != USIE_IFACE_INDEX)
+ return (ENXIO);
+ if (uaa->info.bInterfaceClass != UICLASS_VENDOR)
+ return (ENXIO);
+
+ return (usbd_lookup_id_by_uaa(usie_devs, sizeof(usie_devs), uaa));
+}
+
+static int
+usie_attach(device_t self)
+{
+ struct usie_softc *sc = device_get_softc(self);
+ struct usb_attach_arg *uaa = device_get_ivars(self);
+ struct ifnet *ifp;
+ struct usb_interface *iface;
+ struct usb_interface_descriptor *id;
+ struct usb_device_request req;
+ int err;
+ uint16_t fwattr;
+ uint8_t iface_index;
+ uint8_t ifidx;
+ uint8_t start;
+
+ device_set_usb_desc(self);
+ sc->sc_udev = uaa->device;
+ sc->sc_dev = self;
+
+ mtx_init(&sc->sc_mtx, "usie", MTX_NETWORK_LOCK, MTX_DEF);
+
+ TASK_INIT(&sc->sc_if_status_task, 0, usie_if_status_cb, sc);
+ TASK_INIT(&sc->sc_if_sync_task, 0, usie_if_sync_cb, sc);
+
+ usb_callout_init_mtx(&sc->sc_if_sync_ch, &sc->sc_mtx, 0);
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* set power mode to D0 */
+ req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
+ req.bRequest = USIE_POWER;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, 0);
+ USETW(req.wLength, 0);
+ if (usie_do_request(sc, &req, NULL)) {
+ mtx_unlock(&sc->sc_mtx);
+ goto detach;
+ }
+ /* read fw attr */
+ fwattr = 0;
+ req.bmRequestType = UT_READ_VENDOR_DEVICE;
+ req.bRequest = USIE_FW_ATTR;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, 0);
+ USETW(req.wLength, sizeof(fwattr));
+ if (usie_do_request(sc, &req, &fwattr)) {
+ mtx_unlock(&sc->sc_mtx);
+ goto detach;
+ }
+ mtx_unlock(&sc->sc_mtx);
+
+ /* check DHCP supports */
+ DPRINTF("fwattr=%x\n", fwattr);
+ if (!(fwattr & USIE_FW_DHCP)) {
+ device_printf(self, "DHCP is not supported. A firmware upgrade might be needed.\n");
+ }
+
+ /* find available interfaces */
+ sc->sc_nucom = 0;
+ for (ifidx = 0; ifidx < USIE_IFACE_MAX; ifidx++) {
+ iface = usbd_get_iface(uaa->device, ifidx);
+ if (iface == NULL)
+ break;
+
+ id = usbd_get_interface_descriptor(iface);
+ if ((id == NULL) || (id->bInterfaceClass != UICLASS_VENDOR))
+ continue;
+
+ /* setup Direct IP transfer */
+ if (id->bInterfaceNumber >= 7 && id->bNumEndpoints == 3) {
+ sc->sc_if_ifnum = id->bInterfaceNumber;
+ iface_index = ifidx;
+
+ DPRINTF("ifnum=%d, ifidx=%d\n",
+ sc->sc_if_ifnum, ifidx);
+
+ err = usbd_transfer_setup(uaa->device,
+ &iface_index, sc->sc_if_xfer, usie_if_config,
+ USIE_IF_N_XFER, sc, &sc->sc_mtx);
+
+ if (err == 0)
+ continue;
+
+ device_printf(self,
+ "could not allocate USB transfers on "
+ "iface_index=%d, err=%s\n",
+ iface_index, usbd_errstr(err));
+ goto detach;
+ }
+
+ /* setup ucom */
+ if (sc->sc_nucom >= USIE_UCOM_MAX)
+ continue;
+
+ usbd_set_parent_iface(uaa->device, ifidx,
+ uaa->info.bIfaceIndex);
+
+ DPRINTF("NumEndpoints=%d bInterfaceNumber=%d\n",
+ id->bNumEndpoints, id->bInterfaceNumber);
+
+ if (id->bNumEndpoints == 2) {
+ sc->sc_uc_xfer[sc->sc_nucom][0] = NULL;
+ start = 1;
+ } else
+ start = 0;
+
+ err = usbd_transfer_setup(uaa->device, &ifidx,
+ sc->sc_uc_xfer[sc->sc_nucom] + start,
+ usie_uc_config + start, USIE_UC_N_XFER - start,
+ &sc->sc_ucom[sc->sc_nucom], &sc->sc_mtx);
+
+ if (err != 0) {
+ DPRINTF("usbd_transfer_setup error=%s\n", usbd_errstr(err));
+ continue;
+ }
+
+ mtx_lock(&sc->sc_mtx);
+ for (; start < USIE_UC_N_XFER; start++)
+ usbd_xfer_set_stall(sc->sc_uc_xfer[sc->sc_nucom][start]);
+ mtx_unlock(&sc->sc_mtx);
+
+ sc->sc_uc_ifnum[sc->sc_nucom] = id->bInterfaceNumber;
+
+ sc->sc_nucom++; /* found a port */
+ }
+
+ if (sc->sc_nucom == 0) {
+ device_printf(self, "no comports found\n");
+ goto detach;
+ }
+
+ err = ucom_attach(&sc->sc_super_ucom, sc->sc_ucom,
+ sc->sc_nucom, sc, &usie_uc_callback, &sc->sc_mtx);
+
+ if (err != 0) {
+ DPRINTF("ucom_attach failed\n");
+ goto detach;
+ }
+ DPRINTF("Found %d interfaces.\n", sc->sc_nucom);
+
+ /* setup ifnet (Direct IP) */
+ sc->sc_ifp = ifp = if_alloc(IFT_OTHER);
+
+ if (ifp == NULL) {
+ device_printf(self, "Could not allocate a network interface\n");
+ goto detach;
+ }
+ if_initname(ifp, "usie", device_get_unit(self));
+
+ ifp->if_softc = sc;
+ ifp->if_mtu = USIE_MTU_MAX;
+ ifp->if_flags |= IFF_NOARP;
+ ifp->if_init = usie_if_init;
+ ifp->if_ioctl = usie_if_ioctl;
+ ifp->if_start = usie_if_start;
+ ifp->if_output = usie_if_output;
+ IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
+ ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
+ IFQ_SET_READY(&ifp->if_snd);
+
+ if_attach(ifp);
+ bpfattach(ifp, DLT_RAW, 0);
+
+ if (fwattr & USIE_PM_AUTO) {
+ usbd_set_power_mode(uaa->device, USB_POWER_MODE_SAVE);
+ DPRINTF("enabling automatic suspend and resume\n");
+ } else {
+ usbd_set_power_mode(uaa->device, USB_POWER_MODE_ON);
+ DPRINTF("USB power is always ON\n");
+ }
+
+ DPRINTF("device attached\n");
+ return (0);
+
+detach:
+ usie_detach(self);
+ return (ENOMEM);
+}
+
+static int
+usie_detach(device_t self)
+{
+ struct usie_softc *sc = device_get_softc(self);
+ uint8_t x;
+
+ /* detach ifnet */
+ if (sc->sc_ifp != NULL) {
+ usie_if_stop(sc);
+ usbd_transfer_unsetup(sc->sc_if_xfer, USIE_IF_N_XFER);
+ bpfdetach(sc->sc_ifp);
+ if_detach(sc->sc_ifp);
+ if_free(sc->sc_ifp);
+ sc->sc_ifp = NULL;
+ }
+ /* detach ucom */
+ if (sc->sc_nucom > 0)
+ ucom_detach(&sc->sc_super_ucom, sc->sc_ucom);
+
+ /* stop all USB transfers */
+ usbd_transfer_unsetup(sc->sc_if_xfer, USIE_IF_N_XFER);
+
+ for (x = 0; x != USIE_UCOM_MAX; x++)
+ usbd_transfer_unsetup(sc->sc_uc_xfer[x], USIE_UC_N_XFER);
+
+ mtx_destroy(&sc->sc_mtx);
+
+ return (0);
+}
+
+static void
+usie_uc_update_line_state(struct ucom_softc *ucom, uint8_t ls)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+ struct usb_device_request req;
+
+ if (sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_STATUS] == NULL)
+ return;
+
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = USIE_LINK_STATE;
+ USETW(req.wValue, ls);
+ USETW(req.wIndex, sc->sc_uc_ifnum[ucom->sc_subunit]);
+ USETW(req.wLength, 0);
+
+ DPRINTF("sc_uc_ifnum=%d\n", sc->sc_uc_ifnum[ucom->sc_subunit]);
+
+ usie_do_request(sc, &req, NULL);
+}
+
+static void
+usie_uc_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ *msr = sc->sc_msr;
+ *lsr = sc->sc_lsr;
+}
+
+static void
+usie_uc_cfg_set_dtr(struct ucom_softc *ucom, uint8_t flag)
+{
+ uint8_t dtr;
+
+ dtr = flag ? USIE_LS_DTR : 0;
+ usie_uc_update_line_state(ucom, dtr);
+}
+
+static void
+usie_uc_cfg_set_rts(struct ucom_softc *ucom, uint8_t flag)
+{
+ uint8_t rts;
+
+ rts = flag ? USIE_LS_RTS : 0;
+ usie_uc_update_line_state(ucom, rts);
+}
+
+static void
+usie_uc_cfg_open(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ /* usbd_transfer_start() is NULL safe */
+
+ usbd_transfer_start(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_STATUS]);
+}
+
+static void
+usie_uc_cfg_close(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_stop(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_STATUS]);
+}
+
+static void
+usie_uc_start_read(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_start(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_RX]);
+}
+
+static void
+usie_uc_stop_read(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_stop(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_RX]);
+}
+
+static void
+usie_uc_start_write(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_start(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_TX]);
+}
+
+static void
+usie_uc_stop_write(struct ucom_softc *ucom)
+{
+ struct usie_softc *sc = ucom->sc_parent;
+
+ usbd_transfer_stop(sc->sc_uc_xfer[ucom->sc_subunit][USIE_UC_TX]);
+}
+
+static void
+usie_uc_rx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct ucom_softc *ucom = usbd_xfer_softc(xfer);
+ struct usie_softc *sc = ucom->sc_parent;
+ struct usb_page_cache *pc;
+ uint32_t actlen;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ pc = usbd_xfer_get_frame(xfer, 0);
+
+ /* handle CnS response */
+ if (ucom == sc->sc_ucom && actlen >= USIE_HIPCNS_MIN) {
+
+ DPRINTF("transferred=%u\n", actlen);
+
+ /* check if it is really CnS reply */
+ usbd_copy_out(pc, 0, sc->sc_resp_temp, 1);
+
+ if (sc->sc_resp_temp[0] == USIE_HIP_FRM_CHR) {
+
+ /* verify actlen */
+ if (actlen > USIE_BUFSIZE)
+ actlen = USIE_BUFSIZE;
+
+ /* get complete message */
+ usbd_copy_out(pc, 0, sc->sc_resp_temp, actlen);
+ usie_hip_rsp(sc, sc->sc_resp_temp, actlen);
+
+ /* need to fall though */
+ goto tr_setup;
+ }
+ /* else call ucom_put_data() */
+ }
+ /* standard ucom transfer */
+ ucom_put_data(ucom, pc, 0, actlen);
+
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+ usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_uc_tx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct ucom_softc *ucom = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ uint32_t actlen;
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ case USB_ST_SETUP:
+tr_setup:
+ pc = usbd_xfer_get_frame(xfer, 0);
+
+ /* handle CnS request */
+ struct mbuf *m = usbd_xfer_get_priv(xfer);
+
+ if (m != NULL) {
+ usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len);
+ usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len);
+ usbd_xfer_set_priv(xfer, NULL);
+ usbd_transfer_submit(xfer);
+ m_freem(m);
+ break;
+ }
+ /* standard ucom transfer */
+ if (ucom_get_data(ucom, pc, 0, USIE_BUFSIZE, &actlen)) {
+ usbd_xfer_set_frame_len(xfer, 0, actlen);
+ usbd_transfer_submit(xfer);
+ }
+ break;
+
+ default: /* Error */
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_uc_status_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usb_page_cache *pc;
+ struct {
+ struct usb_device_request req;
+ uint16_t param;
+ } st;
+ uint32_t actlen;
+ uint16_t param;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(4, "info received, actlen=%u\n", actlen);
+
+ if (actlen < sizeof(st)) {
+ DPRINTF("data too short actlen=%u\n", actlen);
+ goto tr_setup;
+ }
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_out(pc, 0, &st, sizeof(st));
+
+ if (st.req.bmRequestType == 0xa1 && st.req.bRequest == 0x20) {
+ struct ucom_softc *ucom = usbd_xfer_softc(xfer);
+ struct usie_softc *sc = ucom->sc_parent;
+
+ param = le16toh(st.param);
+ DPRINTF("param=%x\n", param);
+ sc->sc_msr = sc->sc_lsr = 0;
+ sc->sc_msr |= (param & USIE_DCD) ? SER_DCD : 0;
+ sc->sc_msr |= (param & USIE_DSR) ? SER_DSR : 0;
+ sc->sc_msr |= (param & USIE_RI) ? SER_RI : 0;
+ sc->sc_msr |= (param & USIE_CTS) ? 0 : SER_CTS;
+ sc->sc_msr |= (param & USIE_RTS) ? SER_RTS : 0;
+ sc->sc_msr |= (param & USIE_DTR) ? SER_DTR : 0;
+ }
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+ usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n",
+ usbd_errstr(error));
+
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_if_rx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usie_softc *sc = usbd_xfer_softc(xfer);
+ struct ifnet *ifp = sc->sc_ifp;
+ struct mbuf *m0;
+ struct mbuf *m = NULL;
+ struct usie_desc *rxd;
+ uint32_t actlen;
+ uint16_t err;
+ uint16_t pkt;
+ uint16_t ipl;
+ uint16_t len;
+ uint16_t diff;
+ uint8_t pad;
+ uint8_t ipv;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(15, "rx done, actlen=%u\n", actlen);
+
+ if (actlen < sizeof(struct usie_hip)) {
+ DPRINTF("data too short %u\n", actlen);
+ goto tr_setup;
+ }
+ m = sc->sc_rxm;
+ sc->sc_rxm = NULL;
+
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+
+ if (sc->sc_rxm == NULL) {
+ sc->sc_rxm = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
+ MJUMPAGESIZE /* could be bigger than MCLBYTES */ );
+ }
+ if (sc->sc_rxm == NULL) {
+ DPRINTF("could not allocate Rx mbuf\n");
+ ifp->if_ierrors++;
+ usbd_xfer_set_stall(xfer);
+ usbd_xfer_set_frames(xfer, 0);
+ } else {
+ /*
+ * Directly loading a mbuf cluster into DMA to
+ * save some data copying. This works because
+ * there is only one cluster.
+ */
+ usbd_xfer_set_frame_data(xfer, 0,
+ mtod(sc->sc_rxm, caddr_t), MIN(MJUMPAGESIZE, USIE_RXSZ_MAX));
+ usbd_xfer_set_frames(xfer, 1);
+ }
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n", usbd_errstr(error));
+
+ if (error != USB_ERR_CANCELLED) {
+ /* try to clear stall first */
+ usbd_xfer_set_stall(xfer);
+ ifp->if_ierrors++;
+ goto tr_setup;
+ }
+ if (sc->sc_rxm != NULL) {
+ m_freem(sc->sc_rxm);
+ sc->sc_rxm = NULL;
+ }
+ break;
+ }
+
+ if (m == NULL)
+ return;
+
+ mtx_unlock(&sc->sc_mtx);
+
+ m->m_pkthdr.len = m->m_len = actlen;
+
+ err = pkt = 0;
+
+ /* HW can aggregate multiple frames in a single USB xfer */
+ for (;;) {
+ rxd = mtod(m, struct usie_desc *);
+
+ len = be16toh(rxd->hip.len) & USIE_HIP_IP_LEN_MASK;
+ pad = (rxd->hip.id & USIE_HIP_PAD) ? 1 : 0;
+ ipl = (len - pad - ETHER_HDR_LEN);
+ if (ipl >= len) {
+ DPRINTF("Corrupt frame\n");
+ m_freem(m);
+ break;
+ }
+ diff = sizeof(struct usie_desc) + ipl + pad;
+
+ if (((rxd->hip.id & USIE_HIP_MASK) != USIE_HIP_IP) ||
+ (be16toh(rxd->desc_type) & USIE_TYPE_MASK) != USIE_IP_RX) {
+ DPRINTF("received wrong type of packet\n");
+ m->m_data += diff;
+ m->m_pkthdr.len = (m->m_len -= diff);
+ err++;
+ if (m->m_pkthdr.len > 0)
+ continue;
+ m_freem(m);
+ break;
+ }
+ switch (be16toh(rxd->ethhdr.ether_type)) {
+ case ETHERTYPE_IP:
+ ipv = NETISR_IP;
+ break;
+#ifdef INET6
+ case ETHERTYPE_IPV6:
+ ipv = NETISR_IPV6;
+ break;
+#endif
+ default:
+ DPRINTF("unsupported ether type\n");
+ err++;
+ break;
+ }
+
+ /* the last packet */
+ if (m->m_pkthdr.len <= diff) {
+ m->m_data += (sizeof(struct usie_desc) + pad);
+ m->m_pkthdr.len = m->m_len = ipl;
+ m->m_pkthdr.rcvif = ifp;
+ BPF_MTAP(sc->sc_ifp, m);
+ netisr_dispatch(ipv, m);
+ break;
+ }
+ /* copy aggregated frames to another mbuf */
+ m0 = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ if (__predict_false(m0 == NULL)) {
+ DPRINTF("could not allocate mbuf\n");
+ err++;
+ m_freem(m);
+ break;
+ }
+ m_copydata(m, sizeof(struct usie_desc) + pad, ipl, mtod(m0, caddr_t));
+ m0->m_pkthdr.rcvif = ifp;
+ m0->m_pkthdr.len = m0->m_len = ipl;
+
+ BPF_MTAP(sc->sc_ifp, m0);
+ netisr_dispatch(ipv, m0);
+
+ m->m_data += diff;
+ m->m_pkthdr.len = (m->m_len -= diff);
+ }
+
+ mtx_lock(&sc->sc_mtx);
+
+ ifp->if_ierrors += err;
+ ifp->if_ipackets += pkt;
+}
+
+static void
+usie_if_tx_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usie_softc *sc = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ struct ifnet *ifp = sc->sc_ifp;
+ struct mbuf *m;
+ uint16_t size;
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(11, "transfer complete\n");
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ ifp->if_opackets++;
+
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+ break;
+
+ IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL)
+ break;
+
+ if (m->m_pkthdr.len > (MCLBYTES - ETHER_HDR_LEN +
+ ETHER_CRC_LEN - sizeof(sc->sc_txd))) {
+ DPRINTF("packet len is too big: %d\n",
+ m->m_pkthdr.len);
+ break;
+ }
+ pc = usbd_xfer_get_frame(xfer, 0);
+
+ sc->sc_txd.hip.len = htobe16(m->m_pkthdr.len +
+ ETHER_HDR_LEN + ETHER_CRC_LEN);
+ size = sizeof(sc->sc_txd);
+
+ usbd_copy_in(pc, 0, &sc->sc_txd, size);
+ usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len);
+ usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len +
+ size + ETHER_CRC_LEN);
+
+ BPF_MTAP(ifp, m);
+
+ m_freem(m);
+
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n",
+ usbd_errstr(error));
+ ifp->if_oerrors++;
+
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ ifp->if_ierrors++;
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_if_status_callback(struct usb_xfer *xfer, usb_error_t error)
+{
+ struct usie_softc *sc = usbd_xfer_softc(xfer);
+ struct usb_page_cache *pc;
+ struct usb_cdc_notification cdc;
+ uint32_t actlen;
+
+ usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
+
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
+ DPRINTFN(4, "info received, actlen=%d\n", actlen);
+
+ /* usb_cdc_notification - .data[16] */
+ if (actlen < (sizeof(cdc) - 16)) {
+ DPRINTF("data too short %d\n", actlen);
+ goto tr_setup;
+ }
+ pc = usbd_xfer_get_frame(xfer, 0);
+ usbd_copy_out(pc, 0, &cdc, (sizeof(cdc) - 16));
+
+ DPRINTFN(4, "bNotification=%x\n", cdc.bNotification);
+
+ if (cdc.bNotification & UCDC_N_RESPONSE_AVAILABLE) {
+ taskqueue_enqueue(taskqueue_thread,
+ &sc->sc_if_status_task);
+ }
+ /* fall though */
+ case USB_ST_SETUP:
+tr_setup:
+ usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+ usbd_transfer_submit(xfer);
+ break;
+
+ default: /* Error */
+ DPRINTF("USB transfer error, %s\n",
+ usbd_errstr(error));
+
+ if (error != USB_ERR_CANCELLED) {
+ usbd_xfer_set_stall(xfer);
+ goto tr_setup;
+ }
+ break;
+ }
+}
+
+static void
+usie_if_sync_to(void *arg)
+{
+ struct usie_softc *sc = arg;
+
+ taskqueue_enqueue(taskqueue_thread, &sc->sc_if_sync_task);
+}
+
+static void
+usie_if_sync_cb(void *arg, int pending)
+{
+ struct usie_softc *sc = arg;
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* call twice */
+ usie_if_cmd(sc, USIE_HIP_SYNC2M);
+ usie_if_cmd(sc, USIE_HIP_SYNC2M);
+
+ usb_callout_reset(&sc->sc_if_sync_ch, 2 * hz, usie_if_sync_to, sc);
+
+ mtx_unlock(&sc->sc_mtx);
+}
+
+static void
+usie_if_status_cb(void *arg, int pending)
+{
+ struct usie_softc *sc = arg;
+ struct ifnet *ifp = sc->sc_ifp;
+ struct usb_device_request req;
+ struct usie_hip *hip;
+ struct usie_lsi *lsi;
+ uint16_t actlen;
+ uint8_t ntries;
+ uint8_t pad;
+
+ mtx_lock(&sc->sc_mtx);
+
+ req.bmRequestType = UT_READ_CLASS_INTERFACE;
+ req.bRequest = UCDC_GET_ENCAPSULATED_RESPONSE;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, sc->sc_if_ifnum);
+ USETW(req.wLength, sizeof(sc->sc_status_temp));
+
+ for (ntries = 0; ntries != 10; ntries++) {
+ int err;
+
+ err = usbd_do_request_flags(sc->sc_udev,
+ &sc->sc_mtx, &req, sc->sc_status_temp, USB_SHORT_XFER_OK,
+ &actlen, USB_DEFAULT_TIMEOUT);
+
+ if (err == 0)
+ break;
+
+ DPRINTF("Control request failed: %s %d/10\n",
+ usbd_errstr(err), ntries);
+
+ usb_pause_mtx(&sc->sc_mtx, USB_MS_TO_TICKS(10));
+ }
+
+ if (ntries == 10) {
+ mtx_unlock(&sc->sc_mtx);
+ DPRINTF("Timeout\n");
+ return;
+ }
+
+ hip = (struct usie_hip *)sc->sc_status_temp;
+
+ pad = (hip->id & USIE_HIP_PAD) ? 1 : 0;
+
+ DPRINTF("hip.id=%x hip.len=%d actlen=%u pad=%d\n",
+ hip->id, be16toh(hip->len), actlen, pad);
+
+ switch (hip->id & USIE_HIP_MASK) {
+ case USIE_HIP_SYNC2H:
+ usie_if_cmd(sc, USIE_HIP_SYNC2M);
+ break;
+ case USIE_HIP_RESTR:
+ usb_callout_stop(&sc->sc_if_sync_ch);
+ break;
+ case USIE_HIP_UMTS:
+ lsi = (struct usie_lsi *)(
+ sc->sc_status_temp + sizeof(struct usie_hip) + pad);
+
+ DPRINTF("lsi.proto=%x lsi.len=%d\n", lsi->proto,
+ be16toh(lsi->len));
+
+ if (lsi->proto != USIE_LSI_UMTS)
+ break;
+
+ if (lsi->area == USIE_LSI_AREA_NO ||
+ lsi->area == USIE_LSI_AREA_NODATA) {
+ device_printf(sc->sc_dev, "no service available\n");
+ break;
+ }
+ if (lsi->state == USIE_LSI_STATE_IDLE) {
+ DPRINTF("lsi.state=%x\n", lsi->state);
+ break;
+ }
+ DPRINTF("ctx=%x\n", hip->param);
+ sc->sc_txd.hip.param = hip->param;
+
+ sc->sc_net.addr_len = lsi->pdp_addr_len;
+ memcpy(&sc->sc_net.dns1_addr, &lsi->dns1_addr, 16);
+ memcpy(&sc->sc_net.dns2_addr, &lsi->dns2_addr, 16);
+ memcpy(sc->sc_net.pdp_addr, lsi->pdp_addr, 16);
+ memcpy(sc->sc_net.gw_addr, lsi->gw_addr, 16);
+ ifp->if_flags |= IFF_UP;
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+
+ device_printf(sc->sc_dev, "IP Addr=%d.%d.%d.%d\n",
+ *lsi->pdp_addr, *(lsi->pdp_addr + 1),
+ *(lsi->pdp_addr + 2), *(lsi->pdp_addr + 3));
+ device_printf(sc->sc_dev, "Gateway Addr=%d.%d.%d.%d\n",
+ *lsi->gw_addr, *(lsi->gw_addr + 1),
+ *(lsi->gw_addr + 2), *(lsi->gw_addr + 3));
+ device_printf(sc->sc_dev, "Prim NS Addr=%d.%d.%d.%d\n",
+ *lsi->dns1_addr, *(lsi->dns1_addr + 1),
+ *(lsi->dns1_addr + 2), *(lsi->dns1_addr + 3));
+ device_printf(sc->sc_dev, "Scnd NS Addr=%d.%d.%d.%d\n",
+ *lsi->dns2_addr, *(lsi->dns2_addr + 1),
+ *(lsi->dns2_addr + 2), *(lsi->dns2_addr + 3));
+
+ usie_cns_req(sc, USIE_CNS_ID_RSSI, USIE_CNS_OB_RSSI);
+ break;
+
+ case USIE_HIP_RCGI:
+ /* ignore, workaround for sloppy windows */
+ break;
+ default:
+ DPRINTF("undefined msgid: %x\n", hip->id);
+ break;
+ }
+
+ mtx_unlock(&sc->sc_mtx);
+}
+
+static void
+usie_if_start(struct ifnet *ifp)
+{
+ struct usie_softc *sc = ifp->if_softc;
+
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+ DPRINTF("Not running\n");
+ return;
+ }
+ mtx_lock(&sc->sc_mtx);
+ usbd_transfer_start(sc->sc_if_xfer[USIE_IF_TX]);
+ mtx_unlock(&sc->sc_mtx);
+
+ DPRINTFN(3, "interface started\n");
+}
+
+static int
+usie_if_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
+ struct route *ro)
+{
+ int err;
+
+ DPRINTF("proto=%x\n", dst->sa_family);
+
+ switch (dst->sa_family) {
+#ifdef INET6
+ case AF_INET6;
+ /* fall though */
+#endif
+ case AF_INET:
+ break;
+
+ /* silently drop dhclient packets */
+ case AF_UNSPEC:
+ m_freem(m);
+ return (0);
+
+ /* drop other packet types */
+ default:
+ m_freem(m);
+ return (EAFNOSUPPORT);
+ }
+
+ err = (ifp->if_transmit)(ifp, m);
+ if (err) {
+ ifp->if_oerrors++;
+ return (ENOBUFS);
+ }
+ ifp->if_opackets++;
+
+ return (0);
+}
+
+static void
+usie_if_init(void *arg)
+{
+ struct usie_softc *sc = arg;
+ struct ifnet *ifp = sc->sc_ifp;
+ uint8_t i;
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* write tx descriptor */
+ sc->sc_txd.hip.id = USIE_HIP_CTX;
+ sc->sc_txd.hip.param = 0; /* init value */
+ sc->sc_txd.desc_type = htobe16(USIE_IP_TX);
+
+ for (i = 0; i != USIE_IF_N_XFER; i++)
+ usbd_xfer_set_stall(sc->sc_if_xfer[i]);
+
+ usbd_transfer_start(sc->sc_uc_xfer[USIE_HIP_IF][USIE_UC_RX]);
+ usbd_transfer_start(sc->sc_if_xfer[USIE_IF_STATUS]);
+ usbd_transfer_start(sc->sc_if_xfer[USIE_IF_RX]);
+
+ /* if not running, initiate the modem */
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ usie_cns_req(sc, USIE_CNS_ID_INIT, USIE_CNS_OB_LINK_UPDATE);
+
+ mtx_unlock(&sc->sc_mtx);
+
+ DPRINTF("ifnet initialized\n");
+}
+
+static void
+usie_if_stop(struct usie_softc *sc)
+{
+ usb_callout_drain(&sc->sc_if_sync_ch);
+
+ mtx_lock(&sc->sc_mtx);
+
+ /* usie_cns_req() clears IFF_* flags */
+ usie_cns_req(sc, USIE_CNS_ID_STOP, USIE_CNS_OB_LINK_UPDATE);
+
+ usbd_transfer_stop(sc->sc_if_xfer[USIE_IF_TX]);
+ usbd_transfer_stop(sc->sc_if_xfer[USIE_IF_RX]);
+ usbd_transfer_stop(sc->sc_if_xfer[USIE_IF_STATUS]);
+
+ /* shutdown device */
+ usie_if_cmd(sc, USIE_HIP_DOWN);
+
+ mtx_unlock(&sc->sc_mtx);
+}
+
+static int
+usie_if_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+{
+ struct usie_softc *sc = ifp->if_softc;
+ struct ieee80211req *ireq;
+ struct ieee80211req_sta_info si;
+ struct ifmediareq *ifmr;
+
+ switch (cmd) {
+ case SIOCSIFFLAGS:
+ if (ifp->if_flags & IFF_UP) {
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+ usie_if_init(sc);
+ } else {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ usie_if_stop(sc);
+ }
+ break;
+
+ case SIOCSIFCAP:
+ if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+ device_printf(sc->sc_dev,
+ "Connect to the network first.\n");
+ break;
+ }
+ mtx_lock(&sc->sc_mtx);
+ usie_cns_req(sc, USIE_CNS_ID_RSSI, USIE_CNS_OB_RSSI);
+ mtx_unlock(&sc->sc_mtx);
+ break;
+
+ case SIOCG80211:
+ ireq = (struct ieee80211req *)data;
+
+ if (ireq->i_type != IEEE80211_IOC_STA_INFO)
+ break;
+
+ memset(&si, 0, sizeof(si));
+ si.isi_len = sizeof(si);
+ /*
+ * ifconfig expects RSSI in 0.5dBm units
+ * relative to the noise floor.
+ */
+ si.isi_rssi = 2 * sc->sc_rssi;
+ if (copyout(&si, (uint8_t *)ireq->i_data + 8,
+ sizeof(struct ieee80211req_sta_info)))
+ DPRINTF("copyout failed\n");
+ DPRINTF("80211\n");
+ break;
+
+ case SIOCGIFMEDIA: /* to fool ifconfig */
+ ifmr = (struct ifmediareq *)data;
+ ifmr->ifm_count = 1;
+ DPRINTF("media\n");
+ break;
+
+ case SIOCSIFADDR:
+ case SIOCSIFDSTADDR:
+ break;
+
+ default:
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static int
+usie_do_request(struct usie_softc *sc, struct usb_device_request *req,
+ void *data)
+{
+ int err = 0;
+ int ntries;
+
+ mtx_assert(&sc->sc_mtx, MA_OWNED);
+
+ for (ntries = 0; ntries != 10; ntries++) {
+ err = usbd_do_request(sc->sc_udev,
+ &sc->sc_mtx, req, data);
+ if (err == 0)
+ break;
+
+ DPRINTF("Control request failed: %s %d/10\n",
+ usbd_errstr(err), ntries);
+
+ usb_pause_mtx(&sc->sc_mtx, USB_MS_TO_TICKS(10));
+ }
+ return (err);
+}
+
+static int
+usie_if_cmd(struct usie_softc *sc, uint8_t cmd)
+{
+ struct usb_device_request req;
+ struct usie_hip msg;
+
+ msg.len = 0;
+ msg.id = cmd;
+ msg.param = 0;
+
+ req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+ req.bRequest = UCDC_SEND_ENCAPSULATED_COMMAND;
+ USETW(req.wValue, 0);
+ USETW(req.wIndex, sc->sc_if_ifnum);
+ USETW(req.wLength, sizeof(msg));
+
+ DPRINTF("cmd=%x\n", cmd);
+
+ return (usie_do_request(sc, &req, &msg));
+}
+
+static void
+usie_cns_req(struct usie_softc *sc, uint32_t id, uint16_t obj)
+{
+ struct ifnet *ifp = sc->sc_ifp;
+ struct mbuf *m;
+ struct usb_xfer *xfer;
+ struct usie_hip *hip;
+ struct usie_cns *cns;
+ uint8_t *param;
+ uint8_t *tmp;
+ uint8_t cns_len;
+
+ m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ if (__predict_false(m == NULL)) {
+ DPRINTF("could not allocate mbuf\n");
+ ifp->if_ierrors++;
+ return;
+ }
+ /* to align usie_hip{} on 32 bit */
+ m->m_data += 3;
+ param = mtod(m, uint8_t *);
+ *param++ = USIE_HIP_FRM_CHR;
+ hip = (struct usie_hip *)param;
+ cns = (struct usie_cns *)(hip + 1);
+
+ tmp = param + USIE_HIPCNS_MIN - 2;
+
+ switch (obj) {
+ case USIE_CNS_OB_LINK_UPDATE:
+ cns_len = 2;
+ cns->op = USIE_CNS_OP_SET;
+ *tmp++ = 1; /* profile ID, always use 1 for now */
+ *tmp++ = id == USIE_CNS_ID_INIT ? 1 : 0;
+ break;
+
+ case USIE_CNS_OB_PROF_WRITE:
+ cns_len = 245;
+ cns->op = USIE_CNS_OP_SET;
+ *tmp++ = 1; /* profile ID, always use 1 for now */
+ *tmp++ = 2;
+ memcpy(tmp, &sc->sc_net, 34);
+ memset(tmp + 35, 0, 245 - 36);
+ tmp += 243;
+ break;
+
+ case USIE_CNS_OB_RSSI:
+ cns_len = 0;
+ cns->op = USIE_CNS_OP_REQ;
+ break;
+
+ default:
+ DPRINTF("unsupported CnS object type\n");
+ return;
+ }
+ *tmp = USIE_HIP_FRM_CHR;
+
+ hip->len = htobe16(sizeof(struct usie_cns) + cns_len);
+ hip->id = USIE_HIP_CNS2M;
+ hip->param = 0; /* none for CnS */
+
+ cns->obj = htobe16(obj);
+ cns->id = htobe32(id);
+ cns->len = cns_len;
+ cns->rsv0 = cns->rsv1 = 0; /* always '0' */
+
+ param = (uint8_t *)(cns + 1);
+
+ DPRINTF("param: %16D\n", param, ":");
+
+ m->m_pkthdr.len = m->m_len = USIE_HIPCNS_MIN + cns_len + 2;
+
+ xfer = sc->sc_uc_xfer[USIE_HIP_IF][USIE_UC_TX];
+
+ if (usbd_xfer_get_priv(xfer) == NULL) {
+ usbd_xfer_set_priv(xfer, m);
+ usbd_transfer_start(xfer);
+ } else {
+ DPRINTF("Dropped CNS event\n");
+ m_freem(m);
+ }
+}
+
+static void
+usie_cns_rsp(struct usie_softc *sc, struct usie_cns *cns)
+{
+ struct ifnet *ifp = sc->sc_ifp;
+
+ DPRINTF("received CnS\n");
+
+ switch (be16toh(cns->obj)) {
+ case USIE_CNS_OB_LINK_UPDATE:
+ if (be32toh(cns->id) & USIE_CNS_ID_INIT)
+ usie_if_sync_to(sc);
+ else if (be32toh(cns->id) & USIE_CNS_ID_STOP) {
+ ifp->if_flags &= ~IFF_UP;
+ ifp->if_drv_flags &=
+ ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+ } else
+ DPRINTF("undefined link update\n");
+ break;
+
+ case USIE_CNS_OB_RSSI:
+ sc->sc_rssi = be16toh(*(int16_t *)(cns + 1));
+ if (sc->sc_rssi <= 0)
+ device_printf(sc->sc_dev, "No signal\n");
+ else {
+ device_printf(sc->sc_dev, "RSSI=%ddBm\n",
+ sc->sc_rssi - 110);
+ }
+ break;
+
+ case USIE_CNS_OB_PROF_WRITE:
+ break;
+
+ case USIE_CNS_OB_PDP_READ:
+ break;
+
+ default:
+ DPRINTF("undefined CnS\n");
+ break;
+ }
+}
+
+static void
+usie_hip_rsp(struct usie_softc *sc, uint8_t *rsp, uint32_t len)
+{
+ struct usie_hip *hip;
+ struct usie_cns *cns;
+ uint32_t i;
+ uint32_t j;
+ uint32_t off;
+ uint8_t tmp[USIE_HIPCNS_MAX] __aligned(4);
+
+ for (off = 0; (off + USIE_HIPCNS_MIN) <= len; off++) {
+
+ uint8_t pad;
+
+ while ((off < len) && (rsp[off] == USIE_HIP_FRM_CHR))
+ off++;
+
+ /* Unstuff the bytes */
+ for (i = j = 0; ((i + off) < len) &&
+ (j < USIE_HIPCNS_MAX); i++) {
+
+ if (rsp[i + off] == USIE_HIP_FRM_CHR)
+ break;
+
+ if (rsp[i + off] == USIE_HIP_ESC_CHR) {
+ if ((i + off + 1) >= len)
+ break;
+ tmp[j++] = rsp[i++ + off + 1] ^ 0x20;
+ } else {
+ tmp[j++] = rsp[i + off];
+ }
+ }
+
+ off += i;
+
+ DPRINTF("frame len=%d\n", j);
+
+ if (j < sizeof(struct usie_hip)) {
+ DPRINTF("too little data\n");
+ break;
+ }
+ /*
+ * Make sure we are not reading the stack if something
+ * is wrong.
+ */
+ memset(tmp + j, 0, sizeof(tmp) - j);
+
+ hip = (struct usie_hip *)tmp;
+
+ DPRINTF("hip: len=%d msgID=%02x, param=%02x\n",
+ be16toh(hip->len), hip->id, hip->param);
+
+ pad = (hip->id & USIE_HIP_PAD) ? 1 : 0;
+
+ if ((hip->id & USIE_HIP_MASK) == USIE_HIP_CNS2H) {
+ cns = (struct usie_cns *)(((uint8_t *)(hip + 1)) + pad);
+
+ if (j < (sizeof(struct usie_cns) +
+ sizeof(struct usie_hip) + pad)) {
+ DPRINTF("too little data\n");
+ break;
+ }
+ DPRINTF("cns: obj=%04x, op=%02x, rsv0=%02x, "
+ "app=%08x, rsv1=%02x, len=%d\n",
+ be16toh(cns->obj), cns->op, cns->rsv0,
+ be32toh(cns->id), cns->rsv1, cns->len);
+
+ if (cns->op & USIE_CNS_OP_ERR)
+ DPRINTF("CnS error response\n");
+ else
+ usie_cns_rsp(sc, cns);
+
+ i = sizeof(struct usie_hip) + pad + sizeof(struct usie_cns);
+ j = cns->len;
+ } else {
+ i = sizeof(struct usie_hip) + pad;
+ j = be16toh(hip->len);
+ }
+#ifdef USB_DEBUG
+ if (usie_debug == 0)
+ continue;
+
+ while (i < USIE_HIPCNS_MAX && j > 0) {
+ DPRINTF("param[0x%02x] = 0x%02x\n", i, tmp[i]);
+ i++;
+ j--;
+ }
+#endif
+ }
+}
+
+static int
+usie_driver_loaded(struct module *mod, int what, void *arg)
+{
+ switch (what) {
+ case MOD_LOAD:
+ /* register autoinstall handler */
+ usie_etag = EVENTHANDLER_REGISTER(usb_dev_configured,
+ usie_autoinst, NULL, EVENTHANDLER_PRI_ANY);
+ break;
+ case MOD_UNLOAD:
+ EVENTHANDLER_DEREGISTER(usb_dev_configured, usie_etag);
+ break;
+ default:
+ return (EOPNOTSUPP);
+ }
+ return (0);
+}
+
diff --git a/sys/dev/usb/net/if_usievar.h b/sys/dev/usb/net/if_usievar.h
new file mode 100644
index 0000000..9ba0dc8
--- /dev/null
+++ b/sys/dev/usb/net/if_usievar.h
@@ -0,0 +1,256 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Anybots Inc
+ * written by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
+ * - ucom part is based on u3g.c
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _IF_USEVAR_H_
+#define _IF_USEVAR_H_
+
+#define USIE_DCD 0x0001
+#define USIE_DSR 0x0002
+#define USIE_DTR 0x0004
+#define USIE_RI 0x0008
+#define USIE_CTS 0x0100
+#define USIE_RTS 0x0200
+
+#define USIE_HIP_FRM_CHR 0x7e
+#define USIE_HIP_ESC_CHR 0x7d
+#define USIE_HIP_IF 0
+
+#define USIE_HIPCNS_MIN 16 /* HIP + CnS + 2 framing char */
+#define USIE_HIPCNS_MAX 261 /* HIP + max CnS 255 + 2 framing char */
+
+#define USIE_CNFG_INDEX 0
+#define USIE_IFACE_INDEX 0
+#define USIE_IFACE_MAX 12
+#define USIE_BUFSIZE 2048
+#define USIE_MTU_MAX 1500
+#define USIE_RXSZ_MAX 4096
+
+/* USB control pipe request */
+#define USIE_POWER 0x00
+#define USIE_FW_ATTR 0x06
+#define USIE_NMEA 0x07
+#define USIE_LINK_STATE 0x22
+
+/* firmware attr flags */
+#define USIE_PM_AUTO (1 << 1)
+#define USIE_FW_DHCP (1 << 3) /* DHCP capable */
+
+/* line state flags */
+#define USIE_LS_DTR (1 << 0)
+#define USIE_LS_RTS (1 << 1)
+
+/* Host Interface Porotocol Header */
+struct usie_hip {
+ uint16_t len;
+#define USIE_HIP_LEN_MASK 0x3fff
+#define USIE_HIP_IP_LEN_MASK 0x07ff
+
+ uint8_t id;
+#define USIE_HIP_PAD (1 << 7)
+#define USIE_HIP_MASK 0x7f
+#define USIE_HIP_SYNC2M 0x20 /* host -> modem */
+#define USIE_HIP_DOWN 0x26
+#define USIE_HIP_CNS2M 0x2b /* h -> m */
+#define USIE_HIP_CTX 0x3f
+#define USIE_HIP_SYNC2H 0x60 /* h <- m */
+#define USIE_HIP_RESTR 0x62
+#define USIE_HIP_RCGI 0x64
+#define USIE_HIP_CNS2H 0x6b /* h <- m */
+#define USIE_HIP_UMTS 0x78
+#define USIE_HIP_IP 0x7f
+
+ uint8_t param;
+} __packed __aligned(4);
+
+/* Control and Status Header */
+struct usie_cns {
+ uint16_t obj; /* object type */
+#define USIE_CNS_OB_RSSI 0x1001 /* read RSSI */
+#define USIE_CNS_OB_HW_DISABLE 0x1011 /* disable h/w */
+#define USIE_CNS_OB_PW_SW 0x1071 /* power on/off */
+#define USIE_CNS_OB_PROF_WRITE 0x7003 /* write profile */
+#define USIE_CNS_OB_LINK_UPDATE 0x7004 /* dis/connect */
+#define USIE_CNS_OB_PDP_READ 0x7006 /* read out IP addr */
+
+ uint8_t op; /* operation type */
+#define USIE_CNS_OP_ERR (1 << 7)/* | == error */
+#define USIE_CNS_OP_REQ 0x01 /* host -> modem */
+#define USIE_CNS_OP_RSP 0x02 /* h <- m */
+#define USIE_CNS_OP_SET 0x03 /* h -> m */
+#define USIE_CNS_OP_ACK 0x04 /* h <- m */
+#define USIE_CNS_OP_NOTIF_ON 0x05 /* h -> m */
+#define USIE_CNS_OP_RSP_ON 0x06 /* h <- m */
+#define USIE_CNS_OP_NOTIF 0x07 /* h <- m */
+#define USIE_CNS_OP_NOTIF_OFF 0x08 /* h -> m */
+#define USIE_CNS_OP_RSP_OFF 0x09 /* h <- m */
+#define USIE_CNS_OP_REQ_CHG 0x0a /* h -> m */
+#define USIE_CNS_OP_RSP_CHG 0x0b /* h <- m */
+
+ uint8_t rsv0; /* reserved, always '0' */
+ uint32_t id; /* caller ID */
+/*
+ * .id is to identify calling functions
+ * h/w responses with the same .id used in request. Only '0' is reserved
+ * for notification (asynchronous message generated by h/w without any
+ * request). All other values are user defineable.
+ */
+#define USIE_CNS_ID_NOTIF 0x00000000 /* reserved */
+#define USIE_CNS_ID_INIT 0x00000001
+#define USIE_CNS_ID_STOP 0x00000002
+#define USIE_CNS_ID_DNS 0x00000003
+#define USIE_CNS_ID_RSSI 0x00000004
+
+ uint8_t rsv1; /* reserved, always '0' */
+ uint8_t len; /* length of param */
+} __packed;
+
+/*
+ * CnS param attached to struct usie_cns
+ * usie_cns.len is total size of this param
+ * max 255
+ */
+#define USIE_CNS_PM_UP 0x01
+#define USIE_CNS_PM_DOWN 0x00
+
+/* Link Sense Indication data structure */
+struct usie_lsi {
+ uint8_t proto;
+#define USIE_LSI_UMTS 0x01
+
+ uint8_t pad0;
+ uint16_t len;
+ uint8_t area;
+#define USIE_LSI_AREA_NO 0x00
+#define USIE_LSI_AREA_NODATA 0x01
+
+ uint8_t pad1[41];
+ uint8_t state;
+#define USIE_LSI_STATE_IDLE 0x00
+
+ uint8_t pad2[33];
+ uint8_t type;
+#define USIE_LSI_IP4 0x00
+
+ uint8_t pdp_addr_len; /* PDP addr */
+ uint8_t pdp_addr[16];
+ uint8_t pad3[23];
+ uint8_t dns1_addr_len; /* DNS addr */
+ uint8_t dns1_addr[16];
+ uint8_t dns2_addr_len;
+ uint8_t dns2_addr[16];
+ uint8_t wins1_addr_len; /* Wins addr */
+ uint8_t wins1_addr[16];
+ uint8_t wins2_addr_len;
+ uint8_t wins2_addr[16];
+ uint8_t pad4[4];
+ uint8_t gw_addr_len; /* GW addr */
+ uint8_t gw_addr[16];
+ uint8_t rsv[8];
+} __packed;
+
+struct usie_net_info {
+ uint8_t addr_len;
+ uint8_t pdp_addr[16];
+ uint8_t dns1_addr[16];
+ uint8_t dns2_addr[16];
+ uint8_t gw_addr[16];
+} __packed;
+
+/* Tx/Rx IP packet descriptor */
+struct usie_desc {
+ struct usie_hip hip;
+ uint16_t desc_type;
+#define USIE_TYPE_MASK 0x03ff
+#define USIE_IP_TX 0x0002
+#define USIE_IP_RX 0x0202
+
+ struct ether_header ethhdr;
+} __packed;
+
+enum {
+ USIE_UC_STATUS,
+ USIE_UC_RX,
+ USIE_UC_TX,
+ USIE_UC_N_XFER
+};
+
+enum {
+ USIE_IF_STATUS,
+ USIE_IF_RX,
+ USIE_IF_TX,
+ USIE_IF_N_XFER
+};
+
+struct usie_softc {
+ struct ucom_super_softc sc_super_ucom;
+
+#define USIE_UCOM_MAX 6
+ struct ucom_softc sc_ucom[USIE_UCOM_MAX];
+ uint8_t sc_uc_ifnum[USIE_UCOM_MAX];
+
+ struct mtx sc_mtx;
+
+ struct task sc_if_status_task;
+ struct task sc_if_sync_task;
+ struct usb_callout sc_if_sync_ch;
+
+ struct usie_net_info sc_net;
+
+ struct usie_desc sc_txd;
+
+ struct usb_xfer *sc_uc_xfer[USIE_UCOM_MAX][USIE_UC_N_XFER];
+ struct usb_xfer *sc_if_xfer[USIE_IF_N_XFER];
+
+ struct ifnet *sc_ifp;
+ struct usb_device *sc_udev;
+ device_t sc_dev;
+
+ struct mbuf *sc_rxm;
+
+ uint16_t sc_if_ifnum;
+
+ int16_t sc_rssi;
+
+ uint8_t sc_msr;
+ uint8_t sc_lsr;
+ uint8_t sc_nucom;
+
+ uint8_t sc_resp_temp[USIE_BUFSIZE] __aligned(4);
+ uint8_t sc_status_temp[USIE_BUFSIZE] __aligned(4);
+};
+
+/* Some code assumptions */
+
+extern uint8_t usie_assert[((sizeof(struct usie_hip) +
+ sizeof(struct usie_lsi) + 1) <= USIE_BUFSIZE) ? 1 : -1];
+
+extern uint8_t ucdc_assert[(sizeof(struct usb_cdc_notification)
+ >= 16) ? 1 : -1];
+
+#endif /* _IF_USEVAR_H_ */
diff --git a/sys/dev/usb/net/uhso.c b/sys/dev/usb/net/uhso.c
index 06ac416..cbb0b08 100644
--- a/sys/dev/usb/net/uhso.c
+++ b/sys/dev/usb/net/uhso.c
@@ -247,7 +247,7 @@ static char *uhso_port_type_sysctl[] = {
/* ifnet device unit allocations */
static struct unrhdr *uhso_ifnet_unit = NULL;
-static const struct usb_device_id uhso_devs[] = {
+static const STRUCT_USB_HOST_ID uhso_devs[] = {
#define UHSO_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
/* Option GlobeSurfer iCON 7.2 */
UHSO_DEV(OPTION, GSICON72, UHSO_STATIC_IFACE),
@@ -1754,6 +1754,7 @@ uhso_if_rxflush(void *arg)
/* Dispatch to IP layer */
BPF_MTAP(sc->sc_ifp, m);
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
m = m0 != NULL ? m0 : NULL;
mtx_lock(&sc->sc_mtx);
diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c
index 0c3d673..e54b908 100644
--- a/sys/dev/usb/quirk/usb_quirk.c
+++ b/sys/dev/usb/quirk/usb_quirk.c
@@ -472,6 +472,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = {
USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+ USB_QUIRK(MEDELI, DD305, 0x0000, 0xffff, UQ_SINGLE_CMD_MIDI, UQ_MATCH_VENDOR_ONLY),
};
#undef USB_QUIRK_VP
#undef USB_QUIRK
@@ -538,6 +539,7 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = {
[UQ_MSC_EJECT_TCT] = "UQ_MSC_EJECT_TCT",
[UQ_BAD_MIDI] = "UQ_BAD_MIDI",
[UQ_AU_VENDOR_CLASS] = "UQ_AU_VENDOR_CLASS",
+ [UQ_SINGLE_CMD_MIDI] = "UQ_SINGLE_CMD_MIDI",
};
/*------------------------------------------------------------------------*
diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h
index e86794e..e012842 100644
--- a/sys/dev/usb/quirk/usb_quirk.h
+++ b/sys/dev/usb/quirk/usb_quirk.h
@@ -102,6 +102,7 @@ enum {
UQ_BAD_MIDI, /* device claims MIDI class, but isn't */
UQ_AU_VENDOR_CLASS, /* audio device uses vendor and not audio class */
+ UQ_SINGLE_CMD_MIDI, /* at most one command per USB packet */
USB_QUIRK_MAX
};
diff --git a/sys/dev/usb/serial/u3g.c b/sys/dev/usb/serial/u3g.c
index c332bfb..31e8e11 100644
--- a/sys/dev/usb/serial/u3g.c
+++ b/sys/dev/usb/serial/u3g.c
@@ -182,7 +182,7 @@ MODULE_DEPEND(u3g, ucom, 1, 1, 1);
MODULE_DEPEND(u3g, usb, 1, 1, 1);
MODULE_VERSION(u3g, 1);
-static const struct usb_device_id u3g_devs[] = {
+static const STRUCT_USB_HOST_ID u3g_devs[] = {
#define U3G_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
U3G_DEV(ACERP, H10, 0),
U3G_DEV(AIRPLUS, MCD650, 0),
diff --git a/sys/dev/usb/serial/uark.c b/sys/dev/usb/serial/uark.c
index 75100f2..2c3943d 100644
--- a/sys/dev/usb/serial/uark.c
+++ b/sys/dev/usb/serial/uark.c
@@ -170,7 +170,7 @@ MODULE_DEPEND(uark, ucom, 1, 1, 1);
MODULE_DEPEND(uark, usb, 1, 1, 1);
MODULE_VERSION(uark, 1);
-static const struct usb_device_id uark_devs[] = {
+static const STRUCT_USB_HOST_ID uark_devs[] = {
{USB_VPI(USB_VENDOR_ARKMICRO, USB_PRODUCT_ARKMICRO_ARK3116, 0)},
};
diff --git a/sys/dev/usb/serial/ubsa.c b/sys/dev/usb/serial/ubsa.c
index 1a5a75a..6afe05b 100644
--- a/sys/dev/usb/serial/ubsa.c
+++ b/sys/dev/usb/serial/ubsa.c
@@ -239,7 +239,7 @@ static const struct ucom_callback ubsa_callback = {
.ucom_poll = &ubsa_poll,
};
-static const struct usb_device_id ubsa_devs[] = {
+static const STRUCT_USB_HOST_ID ubsa_devs[] = {
/* AnyData ADU-500A */
{USB_VPI(USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_500A, 0)},
/* AnyData ADU-E100A/H */
diff --git a/sys/dev/usb/serial/uchcom.c b/sys/dev/usb/serial/uchcom.c
index 60fa9e0..3f69c4d 100644
--- a/sys/dev/usb/serial/uchcom.c
+++ b/sys/dev/usb/serial/uchcom.c
@@ -204,7 +204,7 @@ static const struct uchcom_divider_record dividers[] =
#define NUM_DIVIDERS (sizeof (dividers) / sizeof (dividers[0]))
-static const struct usb_device_id uchcom_devs[] = {
+static const STRUCT_USB_HOST_ID uchcom_devs[] = {
{USB_VPI(USB_VENDOR_WCH, USB_PRODUCT_WCH_CH341SER, 0)},
{USB_VPI(USB_VENDOR_WCH2, USB_PRODUCT_WCH2_CH341SER, 0)},
};
diff --git a/sys/dev/usb/serial/ucycom.c b/sys/dev/usb/serial/ucycom.c
index a58398a..8fef219 100644
--- a/sys/dev/usb/serial/ucycom.c
+++ b/sys/dev/usb/serial/ucycom.c
@@ -180,7 +180,7 @@ MODULE_VERSION(ucycom, 1);
/*
* Supported devices
*/
-static const struct usb_device_id ucycom_devs[] = {
+static const STRUCT_USB_HOST_ID ucycom_devs[] = {
{USB_VPI(USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE, MODEL_CY7C64013)},
};
diff --git a/sys/dev/usb/serial/ufoma.c b/sys/dev/usb/serial/ufoma.c
index a32fd47..31be85c 100644
--- a/sys/dev/usb/serial/ufoma.c
+++ b/sys/dev/usb/serial/ufoma.c
@@ -327,6 +327,11 @@ MODULE_DEPEND(ufoma, ucom, 1, 1, 1);
MODULE_DEPEND(ufoma, usb, 1, 1, 1);
MODULE_VERSION(ufoma, 1);
+static const STRUCT_USB_HOST_ID ufoma_devs[] = {
+ {USB_IFACE_CLASS(UICLASS_CDC),
+ USB_IFACE_SUBCLASS(UISUBCLASS_MCPC),},
+};
+
static int
ufoma_probe(device_t dev)
{
@@ -334,30 +339,31 @@ ufoma_probe(device_t dev)
struct usb_interface_descriptor *id;
struct usb_config_descriptor *cd;
usb_mcpc_acm_descriptor *mad;
+ int error;
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
+
+ error = usbd_lookup_id_by_uaa(ufoma_devs, sizeof(ufoma_devs), uaa);
+ if (error)
+ return (error);
+
id = usbd_get_interface_descriptor(uaa->iface);
cd = usbd_get_config_descriptor(uaa->device);
- if ((id == NULL) ||
- (cd == NULL) ||
- (id->bInterfaceClass != UICLASS_CDC) ||
- (id->bInterfaceSubClass != UISUBCLASS_MCPC)) {
+ if (id == NULL || cd == NULL)
return (ENXIO);
- }
+
mad = ufoma_get_intconf(cd, id, UDESC_VS_INTERFACE, UDESCSUB_MCPC_ACM);
- if (mad == NULL) {
+ if (mad == NULL)
return (ENXIO);
- }
+
#ifndef UFOMA_HANDSFREE
if ((mad->bType == UMCPC_ACM_TYPE_AB5) ||
- (mad->bType == UMCPC_ACM_TYPE_AB6)) {
+ (mad->bType == UMCPC_ACM_TYPE_AB6))
return (ENXIO);
- }
#endif
- return (0);
+ return (BUS_PROBE_GENERIC);
}
static int
diff --git a/sys/dev/usb/serial/uftdi.c b/sys/dev/usb/serial/uftdi.c
index b196862..1c88063 100644
--- a/sys/dev/usb/serial/uftdi.c
+++ b/sys/dev/usb/serial/uftdi.c
@@ -206,7 +206,7 @@ MODULE_DEPEND(uftdi, ucom, 1, 1, 1);
MODULE_DEPEND(uftdi, usb, 1, 1, 1);
MODULE_VERSION(uftdi, 1);
-static struct usb_device_id uftdi_devs[] = {
+static STRUCT_USB_HOST_ID uftdi_devs[] = {
#define UFTDI_DEV(v,p,t) \
{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, UFTDI_TYPE_##t) }
UFTDI_DEV(ATMEL, STK541, 8U232AM),
diff --git a/sys/dev/usb/serial/ugensa.c b/sys/dev/usb/serial/ugensa.c
index 0c2f2c4..6b0955e 100644
--- a/sys/dev/usb/serial/ugensa.c
+++ b/sys/dev/usb/serial/ugensa.c
@@ -154,7 +154,7 @@ MODULE_DEPEND(ugensa, ucom, 1, 1, 1);
MODULE_DEPEND(ugensa, usb, 1, 1, 1);
MODULE_VERSION(ugensa, 1);
-static const struct usb_device_id ugensa_devs[] = {
+static const STRUCT_USB_HOST_ID ugensa_devs[] = {
{USB_VPI(USB_VENDOR_AIRPRIME, USB_PRODUCT_AIRPRIME_PC5220, 0)},
{USB_VPI(USB_VENDOR_CMOTECH, USB_PRODUCT_CMOTECH_CDMA_MODEM1, 0)},
{USB_VPI(USB_VENDOR_KYOCERA2, USB_PRODUCT_KYOCERA2_CDMA_MSM_K, 0)},
diff --git a/sys/dev/usb/serial/uipaq.c b/sys/dev/usb/serial/uipaq.c
index 6f96164..d038e17 100644
--- a/sys/dev/usb/serial/uipaq.c
+++ b/sys/dev/usb/serial/uipaq.c
@@ -153,7 +153,7 @@ static const struct ucom_callback uipaq_callback = {
* support the same hardware. Numeric values are used where no usbdevs
* entries exist.
*/
-static const struct usb_device_id uipaq_devs[] = {
+static const STRUCT_USB_HOST_ID uipaq_devs[] = {
/* Socket USB Sync */
{USB_VPI(0x0104, 0x00be, 0)},
/* USB Sync 0301 */
diff --git a/sys/dev/usb/serial/ulpt.c b/sys/dev/usb/serial/ulpt.c
index ec1aa24..def2ae5 100644
--- a/sys/dev/usb/serial/ulpt.c
+++ b/sys/dev/usb/serial/ulpt.c
@@ -483,24 +483,39 @@ ulpt_ioctl(struct usb_fifo *fifo, u_long cmd, void *data,
return (ENODEV);
}
+static const STRUCT_USB_HOST_ID ulpt_devs[] = {
+ /* Uni-directional USB printer */
+ {USB_IFACE_CLASS(UICLASS_PRINTER),
+ USB_IFACE_SUBCLASS(UISUBCLASS_PRINTER),
+ USB_IFACE_PROTOCOL(UIPROTO_PRINTER_UNI)},
+
+ /* Bi-directional USB printer */
+ {USB_IFACE_CLASS(UICLASS_PRINTER),
+ USB_IFACE_SUBCLASS(UISUBCLASS_PRINTER),
+ USB_IFACE_PROTOCOL(UIPROTO_PRINTER_BI)},
+
+ /* 1284 USB printer */
+ {USB_IFACE_CLASS(UICLASS_PRINTER),
+ USB_IFACE_SUBCLASS(UISUBCLASS_PRINTER),
+ USB_IFACE_PROTOCOL(UIPROTO_PRINTER_1284)},
+};
+
static int
ulpt_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
+ int error;
DPRINTFN(11, "\n");
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
- if ((uaa->info.bInterfaceClass == UICLASS_PRINTER) &&
- (uaa->info.bInterfaceSubClass == UISUBCLASS_PRINTER) &&
- ((uaa->info.bInterfaceProtocol == UIPROTO_PRINTER_UNI) ||
- (uaa->info.bInterfaceProtocol == UIPROTO_PRINTER_BI) ||
- (uaa->info.bInterfaceProtocol == UIPROTO_PRINTER_1284))) {
- return (0);
- }
- return (ENXIO);
+
+ error = usbd_lookup_id_by_uaa(ulpt_devs, sizeof(ulpt_devs), uaa);
+ if (error)
+ return (error);
+
+ return (BUS_PROBE_GENERIC);
}
static int
diff --git a/sys/dev/usb/serial/umcs.c b/sys/dev/usb/serial/umcs.c
index c74044e..94ed4d9 100644
--- a/sys/dev/usb/serial/umcs.c
+++ b/sys/dev/usb/serial/umcs.c
@@ -253,7 +253,7 @@ static struct ucom_callback umcs7840_callback = {
.ucom_poll = &umcs7840_poll,
};
-static const struct usb_device_id umcs7840_devs[] = {
+static const STRUCT_USB_HOST_ID umcs7840_devs[] = {
{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7820, 0)},
{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7840, 0)},
};
diff --git a/sys/dev/usb/serial/umct.c b/sys/dev/usb/serial/umct.c
index 39dc9d7..16dd4a1 100644
--- a/sys/dev/usb/serial/umct.c
+++ b/sys/dev/usb/serial/umct.c
@@ -192,7 +192,7 @@ static const struct ucom_callback umct_callback = {
.ucom_poll = &umct_poll,
};
-static const struct usb_device_id umct_devs[] = {
+static const STRUCT_USB_HOST_ID umct_devs[] = {
{USB_VPI(USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0)},
{USB_VPI(USB_VENDOR_MCT, USB_PRODUCT_MCT_SITECOM_USB232, 0)},
{USB_VPI(USB_VENDOR_MCT, USB_PRODUCT_MCT_DU_H3SP_USB232, 0)},
diff --git a/sys/dev/usb/serial/umodem.c b/sys/dev/usb/serial/umodem.c
index c6d517b..ed5162f 100644
--- a/sys/dev/usb/serial/umodem.c
+++ b/sys/dev/usb/serial/umodem.c
@@ -123,7 +123,7 @@ SYSCTL_INT(_hw_usb_umodem, OID_AUTO, debug, CTLFLAG_RW,
&umodem_debug, 0, "Debug level");
#endif
-static const struct usb_device_id umodem_devs[] = {
+static const STRUCT_USB_HOST_ID umodem_devs[] = {
/* Generic Modem class match */
{USB_IFACE_CLASS(UICLASS_CDC),
USB_IFACE_SUBCLASS(UISUBCLASS_ABSTRACT_CONTROL_MODEL),
@@ -276,11 +276,14 @@ umodem_probe(device_t dev)
DPRINTFN(11, "\n");
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
+
error = usbd_lookup_id_by_uaa(umodem_devs, sizeof(umodem_devs), uaa);
- return (error);
+ if (error)
+ return (error);
+
+ return (BUS_PROBE_GENERIC);
}
static int
diff --git a/sys/dev/usb/serial/umoscom.c b/sys/dev/usb/serial/umoscom.c
index 4ab6cc0..c346ae6 100644
--- a/sys/dev/usb/serial/umoscom.c
+++ b/sys/dev/usb/serial/umoscom.c
@@ -280,7 +280,7 @@ MODULE_DEPEND(umoscom, ucom, 1, 1, 1);
MODULE_DEPEND(umoscom, usb, 1, 1, 1);
MODULE_VERSION(umoscom, 1);
-static const struct usb_device_id umoscom_devs[] = {
+static const STRUCT_USB_HOST_ID umoscom_devs[] = {
{USB_VPI(USB_VENDOR_MOSCHIP, USB_PRODUCT_MOSCHIP_MCS7703, 0)}
};
diff --git a/sys/dev/usb/serial/uplcom.c b/sys/dev/usb/serial/uplcom.c
index 108ee7b..4af0537 100644
--- a/sys/dev/usb/serial/uplcom.c
+++ b/sys/dev/usb/serial/uplcom.c
@@ -247,7 +247,7 @@ static struct ucom_callback uplcom_callback = {
#define UPLCOM_DEV(v,p) \
{ USB_VENDOR(USB_VENDOR_##v), USB_PRODUCT(USB_PRODUCT_##v##_##p) }
-static const struct usb_device_id uplcom_devs[] = {
+static const STRUCT_USB_HOST_ID uplcom_devs[] = {
UPLCOM_DEV(ACERP, S81), /* BenQ S81 phone */
UPLCOM_DEV(ADLINK, ND6530), /* ADLINK ND-6530 USB-Serial */
UPLCOM_DEV(ALCATEL, OT535), /* Alcatel One Touch 535/735 */
diff --git a/sys/dev/usb/serial/uslcom.c b/sys/dev/usb/serial/uslcom.c
index 1357c8d..6eaec83 100644
--- a/sys/dev/usb/serial/uslcom.c
+++ b/sys/dev/usb/serial/uslcom.c
@@ -173,7 +173,7 @@ static struct ucom_callback uslcom_callback = {
.ucom_poll = &uslcom_poll,
};
-static const struct usb_device_id uslcom_devs[] = {
+static const STRUCT_USB_HOST_ID uslcom_devs[] = {
#define USLCOM_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
USLCOM_DEV(BALTECH, CARDREADER),
USLCOM_DEV(CLIPSAL, 5500PCU),
diff --git a/sys/dev/usb/serial/uvisor.c b/sys/dev/usb/serial/uvisor.c
index 3efef5d..976ea19 100644
--- a/sys/dev/usb/serial/uvisor.c
+++ b/sys/dev/usb/serial/uvisor.c
@@ -253,7 +253,7 @@ MODULE_DEPEND(uvisor, ucom, 1, 1, 1);
MODULE_DEPEND(uvisor, usb, 1, 1, 1);
MODULE_VERSION(uvisor, 1);
-static const struct usb_device_id uvisor_devs[] = {
+static const STRUCT_USB_HOST_ID uvisor_devs[] = {
#define UVISOR_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
UVISOR_DEV(ACEECA, MEZ1000, UVISOR_FLAG_PALM4),
UVISOR_DEV(ALPHASMART, DANA_SYNC, UVISOR_FLAG_PALM4),
diff --git a/sys/dev/usb/serial/uvscom.c b/sys/dev/usb/serial/uvscom.c
index d883190..52e02ad 100644
--- a/sys/dev/usb/serial/uvscom.c
+++ b/sys/dev/usb/serial/uvscom.c
@@ -233,7 +233,7 @@ static const struct ucom_callback uvscom_callback = {
.ucom_poll = &uvscom_poll,
};
-static const struct usb_device_id uvscom_devs[] = {
+static const STRUCT_USB_HOST_ID uvscom_devs[] = {
/* SUNTAC U-Cable type A4 */
{USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)},
/* SUNTAC U-Cable type D2 */
diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c
index 158d843..9292c84 100644
--- a/sys/dev/usb/storage/umass.c
+++ b/sys/dev/usb/storage/umass.c
@@ -721,6 +721,11 @@ MODULE_VERSION(umass, 1);
* USB device probe/attach/detach
*/
+static const STRUCT_USB_HOST_ID __used umass_devs[] = {
+ /* generic mass storage class */
+ {USB_IFACE_CLASS(UICLASS_MASS),},
+};
+
static uint16_t
umass_get_proto(struct usb_interface *iface)
{
diff --git a/sys/dev/usb/storage/urio.c b/sys/dev/usb/storage/urio.c
index ee93439..6687173 100644
--- a/sys/dev/usb/storage/urio.c
+++ b/sys/dev/usb/storage/urio.c
@@ -198,22 +198,25 @@ DRIVER_MODULE(urio, uhub, urio_driver, urio_devclass, NULL, 0);
MODULE_DEPEND(urio, usb, 1, 1, 1);
MODULE_VERSION(urio, 1);
+static const STRUCT_USB_HOST_ID urio_devs[] = {
+ {USB_VPI(USB_VENDOR_DIAMOND, USB_PRODUCT_DIAMOND_RIO500USB, 0)},
+ {USB_VPI(USB_VENDOR_DIAMOND2, USB_PRODUCT_DIAMOND2_RIO600USB, 0)},
+ {USB_VPI(USB_VENDOR_DIAMOND2, USB_PRODUCT_DIAMOND2_RIO800USB, 0)},
+};
+
static int
urio_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
- if (uaa->usb_mode != USB_MODE_HOST) {
+ if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
- }
- if ((((uaa->info.idVendor == USB_VENDOR_DIAMOND) &&
- (uaa->info.idProduct == USB_PRODUCT_DIAMOND_RIO500USB)) ||
- ((uaa->info.idVendor == USB_VENDOR_DIAMOND2) &&
- ((uaa->info.idProduct == USB_PRODUCT_DIAMOND2_RIO600USB) ||
- (uaa->info.idProduct == USB_PRODUCT_DIAMOND2_RIO800USB)))))
- return (0);
- else
+ if (uaa->info.bConfigIndex != 0)
return (ENXIO);
+ if (uaa->info.bIfaceIndex != 0)
+ return (ENXIO);
+
+ return (usbd_lookup_id_by_uaa(urio_devs, sizeof(urio_devs), uaa));
}
static int
diff --git a/sys/dev/usb/template/usb_template.c b/sys/dev/usb/template/usb_template.c
index 7bf17fe..cf97482 100644
--- a/sys/dev/usb/template/usb_template.c
+++ b/sys/dev/usb/template/usb_template.c
@@ -49,6 +49,7 @@
#include <sys/priv.h>
#include <dev/usb/usb.h>
+#include <dev/usb/usb_ioctl.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include "usbdevs.h"
@@ -141,6 +142,31 @@ usb_make_raw_desc(struct usb_temp_setup *temp,
ud->bSlaveInterface[0] +=
temp->bInterfaceNumber;
}
+
+ /* check if we have got an interface association descriptor */
+
+ if ((raw[0] >= sizeof(struct usb_interface_assoc_descriptor)) &&
+ (raw[1] == UDESC_IFACE_ASSOC)) {
+ struct usb_interface_assoc_descriptor *iad = (void *)dst;
+
+ /* update the interface number */
+
+ iad->bFirstInterface +=
+ temp->bInterfaceNumber;
+ }
+
+ /* check if we have got a call management descriptor */
+
+ if ((raw[0] >= sizeof(struct usb_cdc_cm_descriptor)) &&
+ (raw[1] == UDESC_CS_INTERFACE) &&
+ (raw[2] == UDESCSUB_CDC_CM)) {
+ struct usb_cdc_cm_descriptor *ccd = (void *)dst;
+
+ /* update the interface number */
+
+ ccd->bDataInterface +=
+ temp->bInterfaceNumber;
+ }
}
temp->size += len;
}
@@ -476,6 +502,10 @@ usb_make_device_desc(struct usb_temp_setup *temp,
USETW(utd->udd.bcdUSB, 0x0250);
utd->udd.bMaxPacketSize = 255; /* 512 bytes */
break;
+ case USB_SPEED_SUPER:
+ USETW(utd->udd.bcdUSB, 0x0300);
+ utd->udd.bMaxPacketSize = 9; /* 2**9 = 512 bytes */
+ break;
default:
temp->err = USB_ERR_INVAL;
break;
@@ -1303,15 +1333,27 @@ usb_temp_setup_by_index(struct usb_device *udev, uint16_t index)
usb_error_t err;
switch (index) {
- case 0:
+ case USB_TEMP_MSC:
err = usb_temp_setup(udev, &usb_template_msc);
break;
- case 1:
+ case USB_TEMP_CDCE:
err = usb_temp_setup(udev, &usb_template_cdce);
break;
- case 2:
+ case USB_TEMP_MTP:
err = usb_temp_setup(udev, &usb_template_mtp);
break;
+ case USB_TEMP_MODEM:
+ err = usb_temp_setup(udev, &usb_template_modem);
+ break;
+ case USB_TEMP_AUDIO:
+ err = usb_temp_setup(udev, &usb_template_audio);
+ break;
+ case USB_TEMP_KBD:
+ err = usb_temp_setup(udev, &usb_template_kbd);
+ break;
+ case USB_TEMP_MOUSE:
+ err = usb_temp_setup(udev, &usb_template_mouse);
+ break;
default:
return (USB_ERR_INVAL);
}
diff --git a/sys/dev/usb/template/usb_template.h b/sys/dev/usb/template/usb_template.h
index 2473af3..b05272f 100644
--- a/sys/dev/usb/template/usb_template.h
+++ b/sys/dev/usb/template/usb_template.h
@@ -30,6 +30,10 @@
#ifndef _USB_TEMPLATE_H_
#define _USB_TEMPLATE_H_
+#ifndef USB_TEMPLATE_VENDOR
+#define USB_TEMPLATE_VENDOR 0x0001
+#endif
+
typedef const void *(usb_temp_get_string_desc_t)(uint16_t lang_id, uint8_t string_index);
typedef const void *(usb_temp_get_vendor_desc_t)(const struct usb_device_request *req, uint16_t *plen);
@@ -94,10 +98,14 @@ struct usb_temp_data {
/* prototypes */
+extern const struct usb_temp_device_desc usb_template_audio;
extern const struct usb_temp_device_desc usb_template_cdce;
-extern const struct usb_temp_device_desc usb_template_msc; /* Mass Storage Class */
-extern const struct usb_temp_device_desc usb_template_mtp; /* Message Transfer
- * Protocol */
+extern const struct usb_temp_device_desc usb_template_kbd;
+extern const struct usb_temp_device_desc usb_template_modem;
+extern const struct usb_temp_device_desc usb_template_mouse;
+extern const struct usb_temp_device_desc usb_template_msc;
+extern const struct usb_temp_device_desc usb_template_mtp;
+
usb_error_t usb_temp_setup(struct usb_device *,
const struct usb_temp_device_desc *);
void usb_temp_unsetup(struct usb_device *);
diff --git a/sys/dev/usb/template/usb_template_audio.c b/sys/dev/usb/template/usb_template_audio.c
new file mode 100644
index 0000000..8e9e7f0
--- /dev/null
+++ b/sys/dev/usb/template/usb_template_audio.c
@@ -0,0 +1,405 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*-
+ * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * This file contains the USB template for an USB Audio Device.
+ */
+
+#include <sys/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usb_cdc.h>
+
+#include <dev/usb/template/usb_template.h>
+
+enum {
+ INDEX_AUDIO_LANG,
+ INDEX_AUDIO_MIXER,
+ INDEX_AUDIO_RECORD,
+ INDEX_AUDIO_PLAYBACK,
+ INDEX_AUDIO_PRODUCT,
+ INDEX_AUDIO_MAX,
+};
+
+#define STRING_LANG \
+ 0x09, 0x04, /* American English */
+
+#define STRING_AUDIO_PRODUCT \
+ 'A', 0, 'u', 0, 'd', 0, 'i', 0, 'o', 0, ' ', 0, \
+ 'T', 0, 'e', 0, 's', 0, 't', 0, ' ', 0, \
+ 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, ' ', 0,
+
+#define STRING_AUDIO_MIXER \
+ 'M', 0, 'i', 0, 'x', 0, 'e', 0, 'r', 0, ' ', 0, \
+ 'i', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
+
+#define STRING_AUDIO_RECORD \
+ 'R', 0, 'e', 0, 'c', 0, 'o', 0, 'r', 0, 'd', 0, ' ', 0, \
+ 'i', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
+
+#define STRING_AUDIO_PLAYBACK \
+ 'P', 0, 'l', 0, 'a', 0, 'y', 0, 'b', 0, 'a', 0, 'c', 0, 'k', 0, ' ', 0, \
+ 'i', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
+
+
+/* make the real string descriptors */
+
+USB_MAKE_STRING_DESC(STRING_LANG, string_lang);
+USB_MAKE_STRING_DESC(STRING_AUDIO_MIXER, string_audio_mixer);
+USB_MAKE_STRING_DESC(STRING_AUDIO_RECORD, string_audio_record);
+USB_MAKE_STRING_DESC(STRING_AUDIO_PLAYBACK, string_audio_playback);
+USB_MAKE_STRING_DESC(STRING_AUDIO_PRODUCT, string_audio_product);
+
+/* prototypes */
+
+/*
+ * Audio Mixer description structures
+ *
+ * Some of the audio descriptors were dumped
+ * from a Creative Labs USB audio device.
+ */
+
+static const uint8_t audio_raw_desc_0[] = {
+ 0x0a, 0x24, 0x01, 0x00, 0x01, 0xa9, 0x00, 0x02,
+ 0x01, 0x02
+};
+
+static const uint8_t audio_raw_desc_1[] = {
+ 0x0c, 0x24, 0x02, 0x01, 0x01, 0x01, 0x00, 0x02,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_2[] = {
+ 0x0c, 0x24, 0x02, 0x02, 0x01, 0x02, 0x00, 0x02,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_3[] = {
+ 0x0c, 0x24, 0x02, 0x03, 0x03, 0x06, 0x00, 0x02,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_4[] = {
+ 0x0c, 0x24, 0x02, 0x04, 0x05, 0x06, 0x00, 0x02,
+ 0x03, 0x00, 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_5[] = {
+ 0x09, 0x24, 0x03, 0x05, 0x05, 0x06, 0x00, 0x01,
+ 0x00
+};
+
+static const uint8_t audio_raw_desc_6[] = {
+ 0x09, 0x24, 0x03, 0x06, 0x01, 0x03, 0x00, 0x09,
+ 0x00
+};
+
+static const uint8_t audio_raw_desc_7[] = {
+ 0x09, 0x24, 0x03, 0x07, 0x01, 0x01, 0x00, 0x08,
+ 0x00
+};
+
+static const uint8_t audio_raw_desc_8[] = {
+ 0x09, 0x24, 0x05, 0x08, 0x03, 0x0a, 0x0b, 0x0c,
+ 0x00
+};
+
+static const uint8_t audio_raw_desc_9[] = {
+ 0x0a, 0x24, 0x06, 0x09, 0x0f, 0x01, 0x01, 0x02,
+ 0x02, 0x00
+};
+
+static const uint8_t audio_raw_desc_10[] = {
+ 0x0a, 0x24, 0x06, 0x0a, 0x02, 0x01, 0x43, 0x00,
+ 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_11[] = {
+ 0x0a, 0x24, 0x06, 0x0b, 0x03, 0x01, 0x01, 0x02,
+ 0x02, 0x00
+};
+
+static const uint8_t audio_raw_desc_12[] = {
+ 0x0a, 0x24, 0x06, 0x0c, 0x04, 0x01, 0x01, 0x00,
+ 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_13[] = {
+ 0x0a, 0x24, 0x06, 0x0d, 0x02, 0x01, 0x03, 0x00,
+ 0x00, 0x00
+};
+
+static const uint8_t audio_raw_desc_14[] = {
+ 0x0a, 0x24, 0x06, 0x0e, 0x03, 0x01, 0x01, 0x02,
+ 0x02, 0x00
+};
+
+static const uint8_t audio_raw_desc_15[] = {
+ 0x0f, 0x24, 0x04, 0x0f, 0x03, 0x01, 0x0d, 0x0e,
+ 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const void *audio_raw_iface_0_desc[] = {
+ audio_raw_desc_0,
+ audio_raw_desc_1,
+ audio_raw_desc_2,
+ audio_raw_desc_3,
+ audio_raw_desc_4,
+ audio_raw_desc_5,
+ audio_raw_desc_6,
+ audio_raw_desc_7,
+ audio_raw_desc_8,
+ audio_raw_desc_9,
+ audio_raw_desc_10,
+ audio_raw_desc_11,
+ audio_raw_desc_12,
+ audio_raw_desc_13,
+ audio_raw_desc_14,
+ audio_raw_desc_15,
+ NULL,
+};
+
+static const struct usb_temp_interface_desc audio_iface_0 = {
+ .ppEndpoints = NULL, /* no endpoints */
+ .ppRawDesc = audio_raw_iface_0_desc,
+ .bInterfaceClass = 1,
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 0,
+ .iInterface = INDEX_AUDIO_MIXER,
+};
+
+static const uint8_t audio_raw_desc_20[] = {
+ 0x07, 0x24, 0x01, 0x01, 0x03, 0x01, 0x00
+
+};
+
+static const uint8_t audio_raw_desc_21[] = {
+ 0x0b, 0x24, 0x02, 0x01, 0x02, 0x02, 0x10, 0x01,
+ /* 48kHz */
+ 0x80, 0xbb, 0x00
+};
+
+static const uint8_t audio_raw_desc_22[] = {
+ 0x07, 0x25, 0x01, 0x00, 0x01, 0x04, 0x00
+};
+
+static const void *audio_raw_iface_1_desc[] = {
+ audio_raw_desc_20,
+ audio_raw_desc_21,
+ NULL,
+};
+
+static const void *audio_raw_ep_1_desc[] = {
+ audio_raw_desc_22,
+ NULL,
+};
+
+static const struct usb_temp_packet_size audio_isoc_mps = {
+ .mps[USB_SPEED_FULL] = 0xC8,
+ .mps[USB_SPEED_HIGH] = 0xC8,
+};
+
+static const struct usb_temp_interval audio_isoc_interval = {
+ .bInterval[USB_SPEED_FULL] = 1, /* 1:1 */
+ .bInterval[USB_SPEED_HIGH] = 4, /* 1:8 */
+};
+
+static const struct usb_temp_endpoint_desc audio_isoc_out_ep = {
+ .ppRawDesc = audio_raw_ep_1_desc,
+ .pPacketSize = &audio_isoc_mps,
+ .pIntervals = &audio_isoc_interval,
+ .bEndpointAddress = UE_DIR_OUT,
+ .bmAttributes = UE_ISOCHRONOUS | UE_ISO_ADAPT,
+};
+
+static const struct usb_temp_endpoint_desc *audio_iface_1_ep[] = {
+ &audio_isoc_out_ep,
+ NULL,
+};
+
+static const struct usb_temp_interface_desc audio_iface_1_alt_0 = {
+ .ppEndpoints = NULL, /* no endpoints */
+ .ppRawDesc = NULL, /* no raw descriptors */
+ .bInterfaceClass = 1,
+ .bInterfaceSubClass = 2,
+ .bInterfaceProtocol = 0,
+ .iInterface = INDEX_AUDIO_PLAYBACK,
+};
+
+static const struct usb_temp_interface_desc audio_iface_1_alt_1 = {
+ .ppEndpoints = audio_iface_1_ep,
+ .ppRawDesc = audio_raw_iface_1_desc,
+ .bInterfaceClass = 1,
+ .bInterfaceSubClass = 2,
+ .bInterfaceProtocol = 0,
+ .iInterface = INDEX_AUDIO_PLAYBACK,
+ .isAltInterface = 1, /* this is an alternate setting */
+};
+
+static const uint8_t audio_raw_desc_30[] = {
+ 0x07, 0x24, 0x01, 0x07, 0x01, 0x01, 0x00
+
+};
+
+static const uint8_t audio_raw_desc_31[] = {
+ 0x0b, 0x24, 0x02, 0x01, 0x02, 0x02, 0x10, 0x01,
+ /* 48kHz */
+ 0x80, 0xbb, 0x00
+};
+
+static const uint8_t audio_raw_desc_32[] = {
+ 0x07, 0x25, 0x01, 0x01, 0x00, 0x00, 0x00
+};
+
+static const void *audio_raw_iface_2_desc[] = {
+ audio_raw_desc_30,
+ audio_raw_desc_31,
+ NULL,
+};
+
+static const void *audio_raw_ep_2_desc[] = {
+ audio_raw_desc_32,
+ NULL,
+};
+
+static const struct usb_temp_endpoint_desc audio_isoc_in_ep = {
+ .ppRawDesc = audio_raw_ep_2_desc,
+ .pPacketSize = &audio_isoc_mps,
+ .pIntervals = &audio_isoc_interval,
+ .bEndpointAddress = UE_DIR_IN,
+ .bmAttributes = UE_ISOCHRONOUS | UE_ISO_ADAPT,
+};
+
+static const struct usb_temp_endpoint_desc *audio_iface_2_ep[] = {
+ &audio_isoc_in_ep,
+ NULL,
+};
+
+static const struct usb_temp_interface_desc audio_iface_2_alt_0 = {
+ .ppEndpoints = NULL, /* no endpoints */
+ .ppRawDesc = NULL, /* no raw descriptors */
+ .bInterfaceClass = 1,
+ .bInterfaceSubClass = 2,
+ .bInterfaceProtocol = 0,
+ .iInterface = INDEX_AUDIO_RECORD,
+};
+
+static const struct usb_temp_interface_desc audio_iface_2_alt_1 = {
+ .ppEndpoints = audio_iface_2_ep,
+ .ppRawDesc = audio_raw_iface_2_desc,
+ .bInterfaceClass = 1,
+ .bInterfaceSubClass = 2,
+ .bInterfaceProtocol = 0,
+ .iInterface = INDEX_AUDIO_RECORD,
+ .isAltInterface = 1, /* this is an alternate setting */
+};
+
+static const struct usb_temp_interface_desc *audio_interfaces[] = {
+ &audio_iface_0,
+ &audio_iface_1_alt_0,
+ &audio_iface_1_alt_1,
+ &audio_iface_2_alt_0,
+ &audio_iface_2_alt_1,
+ NULL,
+};
+
+static const struct usb_temp_config_desc audio_config_desc = {
+ .ppIfaceDesc = audio_interfaces,
+ .bmAttributes = UC_BUS_POWERED,
+ .bMaxPower = 25, /* 50 mA */
+ .iConfiguration = INDEX_AUDIO_PRODUCT,
+};
+
+static const struct usb_temp_config_desc *audio_configs[] = {
+ &audio_config_desc,
+ NULL,
+};
+
+static usb_temp_get_string_desc_t audio_get_string_desc;
+
+const struct usb_temp_device_desc usb_template_audio = {
+ .getStringDesc = &audio_get_string_desc,
+ .ppConfigDesc = audio_configs,
+ .idVendor = USB_TEMPLATE_VENDOR,
+ .idProduct = 0x000A,
+ .bcdDevice = 0x0100,
+ .bDeviceClass = UDCLASS_COMM,
+ .bDeviceSubClass = 0,
+ .bDeviceProtocol = 0,
+ .iManufacturer = 0,
+ .iProduct = INDEX_AUDIO_PRODUCT,
+ .iSerialNumber = 0,
+};
+
+/*------------------------------------------------------------------------*
+ * audio_get_string_desc
+ *
+ * Return values:
+ * NULL: Failure. No such string.
+ * Else: Success. Pointer to string descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+audio_get_string_desc(uint16_t lang_id, uint8_t string_index)
+{
+ static const void *ptr[INDEX_AUDIO_MAX] = {
+ [INDEX_AUDIO_LANG] = &string_lang,
+ [INDEX_AUDIO_MIXER] = &string_audio_mixer,
+ [INDEX_AUDIO_RECORD] = &string_audio_record,
+ [INDEX_AUDIO_PLAYBACK] = &string_audio_playback,
+ [INDEX_AUDIO_PRODUCT] = &string_audio_product,
+ };
+
+ if (string_index == 0) {
+ return (&string_lang);
+ }
+ if (lang_id != 0x0409) {
+ return (NULL);
+ }
+ if (string_index < INDEX_AUDIO_MAX) {
+ return (ptr[string_index]);
+ }
+ return (NULL);
+}
diff --git a/sys/dev/usb/template/usb_template_cdce.c b/sys/dev/usb/template/usb_template_cdce.c
index c8b2c6c..481a69c 100644
--- a/sys/dev/usb/template/usb_template_cdce.c
+++ b/sys/dev/usb/template/usb_template_cdce.c
@@ -264,7 +264,7 @@ static const struct usb_temp_config_desc *eth_configs[] = {
const struct usb_temp_device_desc usb_template_cdce = {
.getStringDesc = &eth_get_string_desc,
.ppConfigDesc = eth_configs,
- .idVendor = 0x0001,
+ .idVendor = USB_TEMPLATE_VENDOR,
.idProduct = 0x0001,
.bcdDevice = 0x0100,
.bDeviceClass = UDCLASS_COMM,
diff --git a/sys/dev/usb/template/usb_template_kbd.c b/sys/dev/usb/template/usb_template_kbd.c
new file mode 100644
index 0000000..8928c06
--- /dev/null
+++ b/sys/dev/usb/template/usb_template_kbd.c
@@ -0,0 +1,224 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*-
+ * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * This file contains the USB template for an USB Keyboard Device.
+ */
+
+#include <sys/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usb_cdc.h>
+
+#include <dev/usb/template/usb_template.h>
+
+enum {
+ INDEX_LANG,
+ INDEX_KEYBOARD,
+ INDEX_PRODUCT,
+ INDEX_MAX,
+};
+
+#define STRING_LANG \
+ 0x09, 0x04, /* American English */
+
+#define STRING_PRODUCT \
+ 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, \
+ 'T', 0, 'e', 0, 's', 0, 't', 0, ' ', 0, \
+ 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, ' ', 0,
+
+#define STRING_KEYBOARD \
+ 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0, ' ', 0, \
+ 'i', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
+
+/* make the real string descriptors */
+
+USB_MAKE_STRING_DESC(STRING_LANG, string_lang);
+USB_MAKE_STRING_DESC(STRING_KEYBOARD, string_keyboard);
+USB_MAKE_STRING_DESC(STRING_PRODUCT, string_product);
+
+/* prototypes */
+
+static const struct usb_temp_packet_size keyboard_intr_mps = {
+ .mps[USB_SPEED_LOW] = 16,
+ .mps[USB_SPEED_FULL] = 16,
+ .mps[USB_SPEED_HIGH] = 16,
+};
+
+static const struct usb_temp_interval keyboard_intr_interval = {
+ .bInterval[USB_SPEED_LOW] = 2, /* ms */
+ .bInterval[USB_SPEED_FULL] = 2,
+ .bInterval[USB_SPEED_HIGH] = 2 * 8,
+};
+
+/* The following HID descriptor was dumped from a HP keyboard. */
+
+static uint8_t keyboard_hid_descriptor[] = {
+ 0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07,
+ 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, 0x01,
+ 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01,
+ 0x75, 0x08, 0x81, 0x01, 0x95, 0x03, 0x75, 0x01,
+ 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x91, 0x02,
+ 0x95, 0x05, 0x75, 0x01, 0x91, 0x01, 0x95, 0x06,
+ 0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05,
+ 0x07, 0x19, 0x00, 0x2a, 0xff, 0x00, 0x81, 0x00,
+ 0xc0
+};
+
+static const struct usb_temp_endpoint_desc keyboard_ep_0 = {
+ .ppRawDesc = NULL, /* no raw descriptors */
+ .pPacketSize = &keyboard_intr_mps,
+ .pIntervals = &keyboard_intr_interval,
+ .bEndpointAddress = UE_DIR_IN,
+ .bmAttributes = UE_INTERRUPT,
+};
+
+static const struct usb_temp_endpoint_desc *keyboard_endpoints[] = {
+ &keyboard_ep_0,
+ NULL,
+};
+
+static const uint8_t keyboard_raw_desc[] = {
+ 0x09, 0x21, 0x10, 0x01, 0x00, 0x01, 0x22, sizeof(keyboard_hid_descriptor),
+ 0x00
+};
+
+static const void *keyboard_iface_0_desc[] = {
+ keyboard_raw_desc,
+ NULL,
+};
+
+static const struct usb_temp_interface_desc keyboard_iface_0 = {
+ .ppRawDesc = keyboard_iface_0_desc,
+ .ppEndpoints = keyboard_endpoints,
+ .bInterfaceClass = 3,
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 1,
+ .iInterface = INDEX_KEYBOARD,
+};
+
+static const struct usb_temp_interface_desc *keyboard_interfaces[] = {
+ &keyboard_iface_0,
+ NULL,
+};
+
+static const struct usb_temp_config_desc keyboard_config_desc = {
+ .ppIfaceDesc = keyboard_interfaces,
+ .bmAttributes = UC_BUS_POWERED,
+ .bMaxPower = 25, /* 50 mA */
+ .iConfiguration = INDEX_PRODUCT,
+};
+
+static const struct usb_temp_config_desc *keyboard_configs[] = {
+ &keyboard_config_desc,
+ NULL,
+};
+
+static usb_temp_get_string_desc_t keyboard_get_string_desc;
+static usb_temp_get_vendor_desc_t keyboard_get_vendor_desc;
+
+const struct usb_temp_device_desc usb_template_kbd = {
+ .getStringDesc = &keyboard_get_string_desc,
+ .getVendorDesc = &keyboard_get_vendor_desc,
+ .ppConfigDesc = keyboard_configs,
+ .idVendor = USB_TEMPLATE_VENDOR,
+ .idProduct = 0x00CB,
+ .bcdDevice = 0x0100,
+ .bDeviceClass = UDCLASS_COMM,
+ .bDeviceSubClass = 0,
+ .bDeviceProtocol = 0,
+ .iManufacturer = 0,
+ .iProduct = INDEX_PRODUCT,
+ .iSerialNumber = 0,
+};
+
+/*------------------------------------------------------------------------*
+ * keyboard_get_vendor_desc
+ *
+ * Return values:
+ * NULL: Failure. No such vendor descriptor.
+ * Else: Success. Pointer to vendor descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+keyboard_get_vendor_desc(const struct usb_device_request *req, uint16_t *plen)
+{
+ if ((req->bmRequestType == 0x81) && (req->bRequest == 0x06) &&
+ (req->wValue[0] == 0x00) && (req->wValue[1] == 0x22) &&
+ (req->wIndex[1] == 0) && (req->wIndex[0] == 0)) {
+
+ *plen = sizeof(keyboard_hid_descriptor);
+ return (keyboard_hid_descriptor);
+ }
+ return (NULL);
+}
+
+/*------------------------------------------------------------------------*
+ * keyboard_get_string_desc
+ *
+ * Return values:
+ * NULL: Failure. No such string.
+ * Else: Success. Pointer to string descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+keyboard_get_string_desc(uint16_t lang_id, uint8_t string_index)
+{
+ static const void *ptr[INDEX_MAX] = {
+ [INDEX_LANG] = &string_lang,
+ [INDEX_KEYBOARD] = &string_keyboard,
+ [INDEX_PRODUCT] = &string_product,
+ };
+
+ if (string_index == 0) {
+ return (&string_lang);
+ }
+ if (lang_id != 0x0409) {
+ return (NULL);
+ }
+ if (string_index < INDEX_MAX) {
+ return (ptr[string_index]);
+ }
+ return (NULL);
+}
diff --git a/sys/dev/usb/template/usb_template_modem.c b/sys/dev/usb/template/usb_template_modem.c
new file mode 100644
index 0000000..6e0f940
--- /dev/null
+++ b/sys/dev/usb/template/usb_template_modem.c
@@ -0,0 +1,252 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*-
+ * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * This file contains the USB template for an USB Modem Device.
+ */
+
+#include <sys/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usb_cdc.h>
+
+#include <dev/usb/template/usb_template.h>
+
+enum {
+ INDEX_LANG,
+ INDEX_MODEM,
+ INDEX_PRODUCT,
+ INDEX_MAX,
+};
+
+#define STRING_LANG \
+ 0x09, 0x04, /* American English */
+
+#define STRING_PRODUCT \
+ 'M', 0, 'o', 0, 'd', 0, 'e', 0, 'm', 0, ' ', 0, \
+ 'T', 0, 'e', 0, 's', 0, 't', 0, ' ', 0, \
+ 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, ' ', 0,
+
+#define STRING_MODEM \
+ 'M', 0, 'o', 0, 'd', 0, 'e', 0, 'm', 0, ' ', 0, \
+ 'i', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
+
+/* make the real string descriptors */
+
+USB_MAKE_STRING_DESC(STRING_LANG, string_lang);
+USB_MAKE_STRING_DESC(STRING_MODEM, string_modem);
+USB_MAKE_STRING_DESC(STRING_PRODUCT, string_product);
+
+#define MODEM_IFACE_0 0
+#define MODEM_IFACE_1 1
+
+/* prototypes */
+
+static const struct usb_temp_packet_size modem_bulk_mps = {
+ .mps[USB_SPEED_LOW] = 8,
+ .mps[USB_SPEED_FULL] = 64,
+ .mps[USB_SPEED_HIGH] = 512,
+};
+
+static const struct usb_temp_packet_size modem_intr_mps = {
+ .mps[USB_SPEED_LOW] = 8,
+ .mps[USB_SPEED_FULL] = 8,
+ .mps[USB_SPEED_HIGH] = 8,
+};
+
+static const struct usb_temp_interval modem_intr_interval = {
+ .bInterval[USB_SPEED_LOW] = 10,
+ .bInterval[USB_SPEED_FULL] = 10,
+ .bInterval[USB_SPEED_HIGH] = 10 * 8,
+};
+
+static const struct usb_temp_endpoint_desc modem_ep_0 = {
+ .pPacketSize = &modem_intr_mps,
+ .pIntervals = &modem_intr_interval,
+ .bEndpointAddress = UE_DIR_IN,
+ .bmAttributes = UE_INTERRUPT,
+};
+
+static const struct usb_temp_endpoint_desc modem_ep_1 = {
+ .pPacketSize = &modem_bulk_mps,
+ .bEndpointAddress = UE_DIR_OUT,
+ .bmAttributes = UE_BULK,
+};
+
+static const struct usb_temp_endpoint_desc modem_ep_2 = {
+ .pPacketSize = &modem_bulk_mps,
+ .bEndpointAddress = UE_DIR_IN,
+ .bmAttributes = UE_BULK,
+};
+
+static const struct usb_temp_endpoint_desc *modem_iface_0_ep[] = {
+ &modem_ep_0,
+ NULL,
+};
+
+static const struct usb_temp_endpoint_desc *modem_iface_1_ep[] = {
+ &modem_ep_1,
+ &modem_ep_2,
+ NULL,
+};
+
+static const uint8_t modem_raw_desc_0[] = {
+ 0x05, 0x24, 0x00, 0x10, 0x01
+};
+
+static const uint8_t modem_raw_desc_1[] = {
+ 0x05, 0x24, 0x06, MODEM_IFACE_0, MODEM_IFACE_1
+};
+
+static const uint8_t modem_raw_desc_2[] = {
+ 0x05, 0x24, 0x01, 0x03, MODEM_IFACE_1
+};
+
+static const uint8_t modem_raw_desc_3[] = {
+ 0x04, 0x24, 0x02, 0x07
+};
+
+static const void *modem_iface_0_desc[] = {
+ &modem_raw_desc_0,
+ &modem_raw_desc_1,
+ &modem_raw_desc_2,
+ &modem_raw_desc_3,
+ NULL,
+};
+
+static const struct usb_temp_interface_desc modem_iface_0 = {
+ .ppRawDesc = modem_iface_0_desc,
+ .ppEndpoints = modem_iface_0_ep,
+ .bInterfaceClass = 2,
+ .bInterfaceSubClass = 2,
+ .bInterfaceProtocol = 1,
+ .iInterface = INDEX_MODEM,
+};
+
+static const struct usb_temp_interface_desc modem_iface_1 = {
+ .ppEndpoints = modem_iface_1_ep,
+ .bInterfaceClass = 10,
+ .bInterfaceSubClass = 0,
+ .bInterfaceProtocol = 0,
+ .iInterface = INDEX_MODEM,
+};
+
+static const struct usb_temp_interface_desc *modem_interfaces[] = {
+ &modem_iface_0,
+ &modem_iface_1,
+ NULL,
+};
+
+static const struct usb_temp_config_desc modem_config_desc = {
+ .ppIfaceDesc = modem_interfaces,
+ .bmAttributes = UC_BUS_POWERED,
+ .bMaxPower = 25, /* 50 mA */
+ .iConfiguration = INDEX_PRODUCT,
+};
+
+static const struct usb_temp_config_desc *modem_configs[] = {
+ &modem_config_desc,
+ NULL,
+};
+
+static usb_temp_get_string_desc_t modem_get_string_desc;
+static usb_temp_get_vendor_desc_t modem_get_vendor_desc;
+
+const struct usb_temp_device_desc usb_template_modem = {
+ .getStringDesc = &modem_get_string_desc,
+ .getVendorDesc = &modem_get_vendor_desc,
+ .ppConfigDesc = modem_configs,
+ .idVendor = USB_TEMPLATE_VENDOR,
+ .idProduct = 0x000E,
+ .bcdDevice = 0x0100,
+ .bDeviceClass = UDCLASS_COMM,
+ .bDeviceSubClass = 0,
+ .bDeviceProtocol = 0,
+ .iManufacturer = 0,
+ .iProduct = INDEX_PRODUCT,
+ .iSerialNumber = 0,
+};
+
+/*------------------------------------------------------------------------*
+ * modem_get_vendor_desc
+ *
+ * Return values:
+ * NULL: Failure. No such vendor descriptor.
+ * Else: Success. Pointer to vendor descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+modem_get_vendor_desc(const struct usb_device_request *req, uint16_t *plen)
+{
+ return (NULL);
+}
+
+/*------------------------------------------------------------------------*
+ * modem_get_string_desc
+ *
+ * Return values:
+ * NULL: Failure. No such string.
+ * Else: Success. Pointer to string descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+modem_get_string_desc(uint16_t lang_id, uint8_t string_index)
+{
+ static const void *ptr[INDEX_MAX] = {
+ [INDEX_LANG] = &string_lang,
+ [INDEX_MODEM] = &string_modem,
+ [INDEX_PRODUCT] = &string_product,
+ };
+
+ if (string_index == 0) {
+ return (&string_lang);
+ }
+ if (lang_id != 0x0409) {
+ return (NULL);
+ }
+ if (string_index < INDEX_MAX) {
+ return (ptr[string_index]);
+ }
+ return (NULL);
+}
diff --git a/sys/dev/usb/template/usb_template_mouse.c b/sys/dev/usb/template/usb_template_mouse.c
new file mode 100644
index 0000000..3ff0fb0
--- /dev/null
+++ b/sys/dev/usb/template/usb_template_mouse.c
@@ -0,0 +1,222 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*-
+ * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * This file contains the USB template for an USB Mouse Device.
+ */
+
+#include <sys/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usb_cdc.h>
+
+#include <dev/usb/template/usb_template.h>
+
+enum {
+ INDEX_LANG,
+ INDEX_MOUSE,
+ INDEX_PRODUCT,
+ INDEX_MAX,
+};
+
+#define STRING_LANG \
+ 0x09, 0x04, /* American English */
+
+#define STRING_PRODUCT \
+ 'M', 0, 'o', 0, 'u', 0, 's', 0, 'e', 0, ' ', 0, \
+ 'T', 0, 'e', 0, 's', 0, 't', 0, ' ', 0, \
+ 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0,
+
+#define STRING_MOUSE \
+ 'M', 0, 'o', 0, 'u', 0, 's', 0, 'e', 0, ' ', 0, \
+ 'i', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
+
+/* make the real string descriptors */
+
+USB_MAKE_STRING_DESC(STRING_LANG, string_lang);
+USB_MAKE_STRING_DESC(STRING_MOUSE, string_mouse);
+USB_MAKE_STRING_DESC(STRING_PRODUCT, string_product);
+
+/* prototypes */
+
+/* The following HID descriptor was dumped from a HP mouse. */
+
+static uint8_t mouse_hid_descriptor[] = {
+ 0x05, 0x01, 0x09, 0x02, 0xa1, 0x01, 0x09, 0x01,
+ 0xa1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03,
+ 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01,
+ 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x05, 0x01,
+ 0x09, 0x30, 0x09, 0x31, 0x09, 0x38, 0x15, 0x81,
+ 0x25, 0x7f, 0x75, 0x08, 0x95, 0x03, 0x81, 0x06,
+ 0xc0, 0xc0
+};
+
+static const struct usb_temp_packet_size mouse_intr_mps = {
+ .mps[USB_SPEED_LOW] = 8,
+ .mps[USB_SPEED_FULL] = 8,
+ .mps[USB_SPEED_HIGH] = 8,
+};
+
+static const struct usb_temp_interval mouse_intr_interval = {
+ .bInterval[USB_SPEED_LOW] = 2,
+ .bInterval[USB_SPEED_FULL] = 2,
+ .bInterval[USB_SPEED_HIGH] = 2 * 8,
+};
+
+static const struct usb_temp_endpoint_desc mouse_ep_0 = {
+ .ppRawDesc = NULL, /* no raw descriptors */
+ .pPacketSize = &mouse_intr_mps,
+ .pIntervals = &mouse_intr_interval,
+ .bEndpointAddress = UE_DIR_IN,
+ .bmAttributes = UE_INTERRUPT,
+};
+
+static const struct usb_temp_endpoint_desc *mouse_endpoints[] = {
+ &mouse_ep_0,
+ NULL,
+};
+
+static const uint8_t mouse_raw_desc[] = {
+ 0x09, 0x21, 0x10, 0x01, 0x00, 0x01, 0x22, sizeof(mouse_hid_descriptor),
+ 0x00
+};
+
+static const void *mouse_iface_0_desc[] = {
+ mouse_raw_desc,
+ NULL,
+};
+
+static const struct usb_temp_interface_desc mouse_iface_0 = {
+ .ppRawDesc = mouse_iface_0_desc,
+ .ppEndpoints = mouse_endpoints,
+ .bInterfaceClass = 3,
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 2,
+ .iInterface = INDEX_MOUSE,
+};
+
+static const struct usb_temp_interface_desc *mouse_interfaces[] = {
+ &mouse_iface_0,
+ NULL,
+};
+
+static const struct usb_temp_config_desc mouse_config_desc = {
+ .ppIfaceDesc = mouse_interfaces,
+ .bmAttributes = UC_BUS_POWERED,
+ .bMaxPower = 25, /* 50 mA */
+ .iConfiguration = INDEX_PRODUCT,
+};
+
+static const struct usb_temp_config_desc *mouse_configs[] = {
+ &mouse_config_desc,
+ NULL,
+};
+
+static usb_temp_get_string_desc_t mouse_get_string_desc;
+static usb_temp_get_vendor_desc_t mouse_get_vendor_desc;
+
+const struct usb_temp_device_desc usb_template_mouse = {
+ .getStringDesc = &mouse_get_string_desc,
+ .getVendorDesc = &mouse_get_vendor_desc,
+ .ppConfigDesc = mouse_configs,
+ .idVendor = USB_TEMPLATE_VENDOR,
+ .idProduct = 0x00AE,
+ .bcdDevice = 0x0100,
+ .bDeviceClass = UDCLASS_COMM,
+ .bDeviceSubClass = 0,
+ .bDeviceProtocol = 0,
+ .iManufacturer = 0,
+ .iProduct = INDEX_PRODUCT,
+ .iSerialNumber = 0,
+};
+
+/*------------------------------------------------------------------------*
+ * mouse_get_vendor_desc
+ *
+ * Return values:
+ * NULL: Failure. No such vendor descriptor.
+ * Else: Success. Pointer to vendor descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+mouse_get_vendor_desc(const struct usb_device_request *req, uint16_t *plen)
+{
+ if ((req->bmRequestType == 0x81) && (req->bRequest == 0x06) &&
+ (req->wValue[0] == 0x00) && (req->wValue[1] == 0x22) &&
+ (req->wIndex[1] == 0) && (req->wIndex[0] == 0)) {
+
+ *plen = sizeof(mouse_hid_descriptor);
+ return (mouse_hid_descriptor);
+ }
+ return (NULL);
+}
+
+/*------------------------------------------------------------------------*
+ * mouse_get_string_desc
+ *
+ * Return values:
+ * NULL: Failure. No such string.
+ * Else: Success. Pointer to string descriptor is returned.
+ *------------------------------------------------------------------------*/
+static const void *
+mouse_get_string_desc(uint16_t lang_id, uint8_t string_index)
+{
+ static const void *ptr[INDEX_MAX] = {
+ [INDEX_LANG] = &string_lang,
+ [INDEX_MOUSE] = &string_mouse,
+ [INDEX_PRODUCT] = &string_product,
+ };
+
+ if (string_index == 0) {
+ return (&string_lang);
+ }
+ if (lang_id != 0x0409) {
+ return (NULL);
+ }
+ if (string_index < INDEX_MAX) {
+ return (ptr[string_index]);
+ }
+ return (NULL);
+}
diff --git a/sys/dev/usb/template/usb_template_msc.c b/sys/dev/usb/template/usb_template_msc.c
index 598c9fd..5c05ffe 100644
--- a/sys/dev/usb/template/usb_template_msc.c
+++ b/sys/dev/usb/template/usb_template_msc.c
@@ -173,8 +173,8 @@ static const struct usb_temp_config_desc *msc_configs[] = {
const struct usb_temp_device_desc usb_template_msc = {
.getStringDesc = &msc_get_string_desc,
.ppConfigDesc = msc_configs,
- .idVendor = 0x0001,
- .idProduct = 0x0001,
+ .idVendor = USB_TEMPLATE_VENDOR,
+ .idProduct = 0x0012,
.bcdDevice = 0x0100,
.bDeviceClass = UDCLASS_COMM,
.bDeviceSubClass = 0,
diff --git a/sys/dev/usb/template/usb_template_mtp.c b/sys/dev/usb/template/usb_template_mtp.c
index ad09b58..f48fbf4 100644
--- a/sys/dev/usb/template/usb_template_mtp.c
+++ b/sys/dev/usb/template/usb_template_mtp.c
@@ -191,8 +191,8 @@ const struct usb_temp_device_desc usb_template_mtp = {
.getStringDesc = &mtp_get_string_desc,
.getVendorDesc = &mtp_get_vendor_desc,
.ppConfigDesc = mtp_configs,
- .idVendor = 0x0001,
- .idProduct = 0x0001,
+ .idVendor = USB_TEMPLATE_VENDOR,
+ .idProduct = 0x0011,
.bcdDevice = 0x0100,
.bDeviceClass = 0,
.bDeviceSubClass = 0,
diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c
index 893e79d..932c022 100644
--- a/sys/dev/usb/usb_device.c
+++ b/sys/dev/usb/usb_device.c
@@ -1297,6 +1297,21 @@ usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index)
usb_init_attach_arg(udev, &uaa);
+ /*
+ * If the whole USB device is targeted, invoke the USB event
+ * handler(s):
+ */
+ if (iface_index == USB_IFACE_INDEX_ANY) {
+
+ EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa);
+
+ if (uaa.dev_state != UAA_DEV_READY) {
+ /* leave device unconfigured */
+ usb_unconfigure(udev, 0);
+ goto done;
+ }
+ }
+
/* Check if only one interface should be probed: */
if (iface_index != USB_IFACE_INDEX_ANY) {
i = iface_index;
@@ -1343,17 +1358,18 @@ usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index)
uaa.info.bIfaceIndex,
uaa.info.bIfaceNum);
- if (usb_probe_and_attach_sub(udev, &uaa)) {
- /* ignore */
- }
- }
-
- if (uaa.temp_dev) {
- /* remove the last created child; it is unused */
+ usb_probe_and_attach_sub(udev, &uaa);
- if (device_delete_child(udev->parent_dev, uaa.temp_dev)) {
+ /*
+ * Remove the leftover child, if any, to enforce that
+ * a new nomatch devd event is generated for the next
+ * interface if no driver is found:
+ */
+ if (uaa.temp_dev == NULL)
+ continue;
+ if (device_delete_child(udev->parent_dev, uaa.temp_dev))
DPRINTFN(0, "device delete child failed\n");
- }
+ uaa.temp_dev = NULL;
}
done:
if (do_unlock)
@@ -1526,7 +1542,7 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus,
/* initialise our SX-lock */
sx_init_flags(&udev->enum_sx, "USB config SX lock", SX_DUPOK);
- sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_DUPOK);
+ sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_NOWITNESS);
cv_init(&udev->ctrlreq_cv, "WCTRL");
cv_init(&udev->ref_cv, "UGONE");
@@ -1834,11 +1850,6 @@ repeat_set_config:
}
}
}
- EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa);
- if (uaa.dev_state != UAA_DEV_READY) {
- /* leave device unconfigured */
- usb_unconfigure(udev, 0);
- }
config_done:
DPRINTF("new dev (addr %d), udev=%p, parent_hub=%p\n",
diff --git a/sys/dev/usb/usb_hid.c b/sys/dev/usb/usb_hid.c
index 21c4c50c..6bd51cd 100644
--- a/sys/dev/usb/usb_hid.c
+++ b/sys/dev/usb/usb_hid.c
@@ -702,6 +702,43 @@ hid_get_data_unsigned(const uint8_t *buf, usb_size_t len, struct hid_location *l
}
/*------------------------------------------------------------------------*
+ * hid_put_data
+ *------------------------------------------------------------------------*/
+void
+hid_put_data_unsigned(uint8_t *buf, usb_size_t len,
+ struct hid_location *loc, unsigned int value)
+{
+ uint32_t hpos = loc->pos;
+ uint32_t hsize = loc->size;
+ uint64_t data;
+ uint64_t mask;
+ uint32_t rpos;
+ uint8_t n;
+
+ DPRINTFN(11, "hid_put_data: loc %d/%d = %u\n", hpos, hsize, value);
+
+ /* Range check and limit */
+ if (hsize == 0)
+ return;
+ if (hsize > 32)
+ hsize = 32;
+
+ /* Put data in a safe way */
+ rpos = (hpos / 8);
+ n = (hsize + 7) / 8;
+ data = ((uint64_t)value) << (hpos % 8);
+ mask = ((1ULL << hsize) - 1ULL) << (hpos % 8);
+ rpos += n;
+ while (n--) {
+ rpos--;
+ if (rpos < len) {
+ buf[rpos] &= ~(mask >> (8 * n));
+ buf[rpos] |= (data >> (8 * n));
+ }
+ }
+}
+
+/*------------------------------------------------------------------------*
* hid_is_collection
*------------------------------------------------------------------------*/
int
diff --git a/sys/dev/usb/usb_hub.c b/sys/dev/usb/usb_hub.c
index 351b134..12898ec 100644
--- a/sys/dev/usb/usb_hub.c
+++ b/sys/dev/usb/usb_hub.c
@@ -1334,15 +1334,19 @@ uhub_child_pnpinfo_string(device_t parent, device_t child,
"devclass=0x%02x devsubclass=0x%02x "
"sernum=\"%s\" "
"release=0x%04x "
- "intclass=0x%02x intsubclass=0x%02x" "%s%s",
+ "mode=%s "
+ "intclass=0x%02x intsubclass=0x%02x "
+ "intprotocol=0x%02x " "%s%s",
UGETW(res.udev->ddesc.idVendor),
UGETW(res.udev->ddesc.idProduct),
res.udev->ddesc.bDeviceClass,
res.udev->ddesc.bDeviceSubClass,
usb_get_serial(res.udev),
UGETW(res.udev->ddesc.bcdDevice),
+ (res.udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
iface->idesc->bInterfaceClass,
iface->idesc->bInterfaceSubClass,
+ iface->idesc->bInterfaceProtocol,
iface->pnpinfo ? " " : "",
iface->pnpinfo ? iface->pnpinfo : "");
} else {
diff --git a/sys/dev/usb/usb_ioctl.h b/sys/dev/usb/usb_ioctl.h
index 452de94..d35fa10 100644
--- a/sys/dev/usb/usb_ioctl.h
+++ b/sys/dev/usb/usb_ioctl.h
@@ -39,6 +39,20 @@
#define USB_DEVICE_NAME "usbctl"
#define USB_DEVICE_DIR "usb"
#define USB_GENERIC_NAME "ugen"
+#define USB_TEMPLATE_SYSCTL "hw.usb.template" /* integer type */
+
+/* Definition of valid template sysctl values */
+
+enum {
+ USB_TEMP_MSC, /* USB Mass Storage */
+ USB_TEMP_CDCE, /* USB CDC Ethernet */
+ USB_TEMP_MTP, /* Message Transfer Protocol */
+ USB_TEMP_MODEM, /* USB CDC Modem */
+ USB_TEMP_AUDIO, /* USB Audio */
+ USB_TEMP_KBD, /* USB Keyboard */
+ USB_TEMP_MOUSE, /* USB Mouse */
+ USB_TEMP_MAX,
+};
struct usb_read_dir {
#ifdef COMPAT_32BIT
diff --git a/sys/dev/usb/usb_lookup.c b/sys/dev/usb/usb_lookup.c
index ced925e..e03f9b6 100644
--- a/sys/dev/usb/usb_lookup.c
+++ b/sys/dev/usb/usb_lookup.c
@@ -42,6 +42,8 @@
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
+#include <sys/limits.h>
+#include <sys/endian.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
@@ -105,13 +107,6 @@ usbd_lookup_id_by_info(const struct usb_device_id *id, usb_size_t sizeof_id,
(id->bDeviceProtocol != info->bDeviceProtocol)) {
continue;
}
- if ((info->bDeviceClass == 0xFF) &&
- (!(id->match_flag_vendor)) &&
- ((id->match_flag_int_class) ||
- (id->match_flag_int_subclass) ||
- (id->match_flag_int_protocol))) {
- continue;
- }
if ((id->match_flag_int_class) &&
(id->bInterfaceClass != info->bInterfaceClass)) {
continue;
@@ -151,3 +146,108 @@ usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id,
}
return (ENXIO);
}
+
+/*------------------------------------------------------------------------*
+ * Export the USB device ID format we use to userspace tools.
+ *------------------------------------------------------------------------*/
+#if BYTE_ORDER == BIG_ENDIAN
+#define U16_XOR "8"
+#define U32_XOR "12"
+#define U64_XOR "56"
+#define U8_BITFIELD_XOR "7"
+#define U16_BITFIELD_XOR "15"
+#define U32_BITFIELD_XOR "31"
+#define U64_BITFIELD_XOR "63"
+#else
+#define U16_XOR "0"
+#define U32_XOR "0"
+#define U64_XOR "0"
+#define U8_BITFIELD_XOR "0"
+#define U16_BITFIELD_XOR "0"
+#define U32_BITFIELD_XOR "0"
+#define U64_BITFIELD_XOR "0"
+#endif
+
+#if USB_HAVE_COMPAT_LINUX
+#define MFL_SIZE "1"
+#else
+#define MFL_SIZE "0"
+#endif
+
+#ifdef KLD_MODULE
+static const char __section("bus_autoconf_format") __used usb_id_format[] = {
+
+ /* Declare that three different sections use the same format */
+
+ "usb_host_id{256,:}"
+ "usb_device_id{256,:}"
+ "usb_dual_id{256,:}"
+
+ /* List size of fields in the usb_device_id structure */
+
+#if ULONG_MAX >= 0xFFFFFFFFUL
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+#if ULONG_MAX >= 0xFFFFFFFFFFFFFFFFULL
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+#endif
+#else
+#error "Please update code."
+#endif
+
+ "idVendor[0]{" U16_XOR ",8}"
+ "idVendor[1]{" U16_XOR ",8}"
+ "idProduct[0]{" U16_XOR ",8}"
+ "idProduct[1]{" U16_XOR ",8}"
+ "bcdDevice_lo[0]{" U16_XOR ",8}"
+ "bcdDevice_lo[1]{" U16_XOR ",8}"
+ "bcdDevice_hi[0]{" U16_XOR ",8}"
+ "bcdDevice_hi[1]{" U16_XOR ",8}"
+
+ "bDeviceClass{0,8}"
+ "bDeviceSubClass{0,8}"
+ "bDeviceProtocol{0,8}"
+ "bInterfaceClass{0,8}"
+ "bInterfaceSubClass{0,8}"
+ "bInterfaceProtocol{0,8}"
+
+ "mf_vendor{" U8_BITFIELD_XOR ",1}"
+ "mf_product{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_lo{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_hi{" U8_BITFIELD_XOR ",1}"
+
+ "mf_dev_class{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_subclass{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_protocol{" U8_BITFIELD_XOR ",1}"
+ "mf_int_class{" U8_BITFIELD_XOR ",1}"
+
+ "mf_int_subclass{" U8_BITFIELD_XOR ",1}"
+ "mf_int_protocol{" U8_BITFIELD_XOR ",1}"
+ "unused{" U8_BITFIELD_XOR ",6}"
+
+ "mfl_vendor{" U16_XOR "," MFL_SIZE "}"
+ "mfl_product{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_lo{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_hi{" U16_XOR "," MFL_SIZE "}"
+
+ "mfl_dev_class{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_subclass{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_protocol{" U16_XOR "," MFL_SIZE "}"
+ "mfl_int_class{" U16_XOR "," MFL_SIZE "}"
+
+ "mfl_int_subclass{" U16_XOR "," MFL_SIZE "}"
+ "mfl_int_protocol{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+};
+#endif
diff --git a/sys/dev/usb/usb_msctest.c b/sys/dev/usb/usb_msctest.c
index 909615e..0b6024b 100644
--- a/sys/dev/usb/usb_msctest.c
+++ b/sys/dev/usb/usb_msctest.c
@@ -62,7 +62,6 @@
#include <dev/usb/usb_transfer.h>
#include <dev/usb/usb_msctest.h>
#include <dev/usb/usb_debug.h>
-#include <dev/usb/usb_busdma.h>
#include <dev/usb/usb_device.h>
#include <dev/usb/usb_request.h>
#include <dev/usb/usb_util.h>
@@ -489,6 +488,24 @@ bbb_attach(struct usb_device *udev, uint8_t iface_index)
struct usb_interface_descriptor *id;
struct bbb_transfer *sc;
usb_error_t err;
+ uint8_t do_unlock;
+
+ /* automatic locking */
+ if (usbd_enum_is_locked(udev)) {
+ do_unlock = 0;
+ } else {
+ do_unlock = 1;
+ usbd_enum_lock(udev);
+ }
+
+ /*
+ * Make sure any driver which is hooked up to this interface,
+ * like umass is gone:
+ */
+ usb_detach_device(udev, iface_index, 0);
+
+ if (do_unlock)
+ usbd_enum_unlock(udev);
iface = usbd_get_iface(udev, iface_index);
if (iface == NULL)
diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c
index 4358ef4..bb5e0da 100644
--- a/sys/dev/usb/usb_request.c
+++ b/sys/dev/usb/usb_request.c
@@ -779,10 +779,17 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port)
uint16_t pr_recovery_delay;
#endif
- err = usbd_req_set_port_feature(udev, mtx, port, UHF_PORT_RESET);
- if (err) {
+ /* clear any leftover port reset changes first */
+ usbd_req_clear_port_feature(
+ udev, mtx, port, UHF_C_PORT_RESET);
+
+ /* assert port reset on the given port */
+ err = usbd_req_set_port_feature(
+ udev, mtx, port, UHF_PORT_RESET);
+
+ /* check for errors */
+ if (err)
goto done;
- }
#ifdef USB_DEBUG
/* range check input parameters */
pr_poll_delay = usb_pr_poll_delay;
@@ -798,6 +805,9 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port)
#endif
n = 0;
while (1) {
+ uint16_t status;
+ uint16_t change;
+
#ifdef USB_DEBUG
/* wait for the device to recover from reset */
usb_pause_mtx(mtx, USB_MS_TO_TICKS(pr_poll_delay));
@@ -811,14 +821,25 @@ usbd_req_reset_port(struct usb_device *udev, struct mtx *mtx, uint8_t port)
if (err) {
goto done;
}
+ status = UGETW(ps.wPortStatus);
+ change = UGETW(ps.wPortChange);
+
/* if the device disappeared, just give up */
- if (!(UGETW(ps.wPortStatus) & UPS_CURRENT_CONNECT_STATUS)) {
+ if (!(status & UPS_CURRENT_CONNECT_STATUS))
goto done;
- }
+
/* check if reset is complete */
- if (UGETW(ps.wPortChange) & UPS_C_PORT_RESET) {
+ if (change & UPS_C_PORT_RESET)
break;
- }
+
+ /*
+ * Some Virtual Machines like VirtualBox 4.x fail to
+ * generate a port reset change event. Check if reset
+ * is no longer asserted.
+ */
+ if (!(status & UPS_RESET))
+ break;
+
/* check for timeout */
if (n > 1000) {
n = 0;
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index a970206..386e546 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -484,6 +484,7 @@ vendor SHANTOU 0x0a46 ShanTou
vendor MEDIAGEAR 0x0a48 MediaGear
vendor BROADCOM 0x0a5c Broadcom
vendor GREENHOUSE 0x0a6b GREENHOUSE
+vendor MEDELI 0x0a67 Medeli
vendor GEOCAST 0x0a79 Geocast Network Systems
vendor IDQUANTIQUE 0x0aba id Quantique
vendor ZYDAS 0x0ace Zydas Technology Corporation
@@ -899,6 +900,7 @@ product AIRPLUS MCD650 0x3198 MCD650 modem
/* AirPrime products */
product AIRPRIME PC5220 0x0112 CDMA Wireless PC Card
+product AIRPRIME USB308 0x68A3 USB308 HSPA+ USB Modem
/* AirTies products */
product AIRTIES RT3070 0x2310 RT3070
@@ -1043,6 +1045,7 @@ product ASIX AX88172 0x1720 10/100 Ethernet
product ASIX AX88178 0x1780 AX88178
product ASIX AX88772 0x7720 AX88772
product ASIX AX88772A 0x772a AX88772A USB 2.0 10/100 Ethernet
+product ASIX AX88772B 0x772b AX88772B USB 2.0 10/100 Ethernet
/* ASUS products */
product ASUS2 USBN11 0x0b05 USB-N11
@@ -2014,6 +2017,7 @@ product KODAK DC280 0x0130 Digital Science DC280
/* Kontron AG products */
product KONTRON DM9601 0x8101 USB Ethernet
+product KONTRON JP1082 0x9700 USB Ethernet
/* Konica Corp. Products */
product KONICA CAMERA 0x0720 Digital Color Camera
@@ -2129,6 +2133,9 @@ product MCT DU_H3SP_USB232 0x0200 D-Link DU-H3SP USB BAY Hub
product MCT USB232 0x0210 USB-232 Interface
product MCT SITECOM_USB232 0x0230 Sitecom USB-232 Products
+/* Medeli */
+product MEDELI DD305 0x5011 DD305 Digital Drum Set
+
/* MediaTek, Inc. */
product MEDIATEK MTK3329 0x3329 MTK II GPS Receiver
diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h
index 91cd3fa..d832c32 100644
--- a/sys/dev/usb/usbdi.h
+++ b/sys/dev/usb/usbdi.h
@@ -228,6 +228,18 @@ struct usb_config {
};
/*
+ * Use these macro when defining USB device ID arrays if you want to
+ * have your driver module automatically loaded in host, device or
+ * both modes respectivly:
+ */
+#define STRUCT_USB_HOST_ID \
+ struct usb_device_id __section("usb_host_id")
+#define STRUCT_USB_DEVICE_ID \
+ struct usb_device_id __section("usb_device_id")
+#define STRUCT_USB_DUAL_ID \
+ struct usb_device_id __section("usb_dual_id")
+
+/*
* The following structure is used when looking up an USB driver for
* an USB device. It is inspired by the Linux structure called
* "usb_device_id".
@@ -258,12 +270,15 @@ struct usb_device_id {
uint8_t match_flag_product:1;
uint8_t match_flag_dev_lo:1;
uint8_t match_flag_dev_hi:1;
+
uint8_t match_flag_dev_class:1;
uint8_t match_flag_dev_subclass:1;
uint8_t match_flag_dev_protocol:1;
uint8_t match_flag_int_class:1;
+
uint8_t match_flag_int_subclass:1;
uint8_t match_flag_int_protocol:1;
+ uint8_t match_flag_unused:6;
#if USB_HAVE_COMPAT_LINUX
/* which fields to match against */
@@ -279,7 +294,10 @@ struct usb_device_id {
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
#endif
-};
+} __aligned(32);
+
+/* check that the size of the structure above is correct */
+extern char usb_device_id_assert[(sizeof(struct usb_device_id) == 32) ? 1 : -1];
#define USB_VENDOR(vend) \
.match_flag_vendor = 1, .idVendor = (vend)
diff --git a/sys/dev/usb/usbhid.h b/sys/dev/usb/usbhid.h
index c07454f..4816e87 100644
--- a/sys/dev/usb/usbhid.h
+++ b/sys/dev/usb/usbhid.h
@@ -233,6 +233,8 @@ int32_t hid_get_data(const uint8_t *buf, usb_size_t len,
struct hid_location *loc);
uint32_t hid_get_data_unsigned(const uint8_t *buf, usb_size_t len,
struct hid_location *loc);
+void hid_put_data_unsigned(uint8_t *buf, usb_size_t len,
+ struct hid_location *loc, unsigned int value);
int hid_is_collection(const void *desc, usb_size_t size, uint32_t usage);
struct usb_hid_descriptor *hid_get_descriptor_from_usb(
struct usb_config_descriptor *cd,
diff --git a/sys/dev/usb/wlan/if_rum.c b/sys/dev/usb/wlan/if_rum.c
index 63b314d..5a69792 100644
--- a/sys/dev/usb/wlan/if_rum.c
+++ b/sys/dev/usb/wlan/if_rum.c
@@ -85,7 +85,7 @@ SYSCTL_INT(_hw_usb_rum, OID_AUTO, debug, CTLFLAG_RW, &rum_debug, 0,
"Debug level");
#endif
-static const struct usb_device_id rum_devs[] = {
+static const STRUCT_USB_HOST_ID rum_devs[] = {
#define RUM_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
RUM_DEV(ABOCOM, HWU54DM),
RUM_DEV(ABOCOM, RT2573_2),
diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c
index 2cd147c..47823b9 100644
--- a/sys/dev/usb/wlan/if_run.c
+++ b/sys/dev/usb/wlan/if_run.c
@@ -96,7 +96,7 @@ SYSCTL_INT(_hw_usb_run, OID_AUTO, debug, CTLFLAG_RW, &run_debug, 0,
*/
#define RUN_CMDQ_GET(c) (atomic_fetchadd_32((c), 1) & RUN_CMDQ_MASQ)
-static const struct usb_device_id run_devs[] = {
+static const STRUCT_USB_HOST_ID run_devs[] = {
#define RUN_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
RUN_DEV(ABOCOM, RT2770),
RUN_DEV(ABOCOM, RT2870),
diff --git a/sys/dev/usb/wlan/if_uath.c b/sys/dev/usb/wlan/if_uath.c
index 35202a9..328dc4f 100644
--- a/sys/dev/usb/wlan/if_uath.c
+++ b/sys/dev/usb/wlan/if_uath.c
@@ -167,9 +167,8 @@ enum {
(((u_int8_t *)(p))[2] << 16) | (((u_int8_t *)(p))[3] << 24)))
/* recognized device vendors/products */
-static const struct usb_device_id uath_devs[] = {
+static const STRUCT_USB_HOST_ID uath_devs[] = {
#define UATH_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
- UATH_DEV(ACCTON, SMCWUSBG),
UATH_DEV(ACCTON, SMCWUSBTG2),
UATH_DEV(ATHEROS, AR5523),
UATH_DEV(ATHEROS2, AR5523_1),
diff --git a/sys/dev/usb/wlan/if_upgt.c b/sys/dev/usb/wlan/if_upgt.c
index d704cec..b9381a2 100644
--- a/sys/dev/usb/wlan/if_upgt.c
+++ b/sys/dev/usb/wlan/if_upgt.c
@@ -170,7 +170,7 @@ static int upgt_tx_start(struct upgt_softc *, struct mbuf *,
static const char *upgt_fwname = "upgt-gw3887";
-static const struct usb_device_id upgt_devs_2[] = {
+static const STRUCT_USB_HOST_ID upgt_devs[] = {
#define UPGT_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
/* version 2 devices */
UPGT_DEV(ACCTON, PRISM_GT),
@@ -236,7 +236,7 @@ upgt_match(device_t dev)
if (uaa->info.bIfaceIndex != UPGT_IFACE_INDEX)
return (ENXIO);
- return (usbd_lookup_id_by_uaa(upgt_devs_2, sizeof(upgt_devs_2), uaa));
+ return (usbd_lookup_id_by_uaa(upgt_devs, sizeof(upgt_devs), uaa));
}
static int
diff --git a/sys/dev/usb/wlan/if_ural.c b/sys/dev/usb/wlan/if_ural.c
index 65d974a..048392d 100644
--- a/sys/dev/usb/wlan/if_ural.c
+++ b/sys/dev/usb/wlan/if_ural.c
@@ -91,7 +91,7 @@ SYSCTL_INT(_hw_usb_ural, OID_AUTO, debug, CTLFLAG_RW, &ural_debug, 0,
((rssi) - (RAL_NOISE_FLOOR + RAL_RSSI_CORR)) : 0)
/* various supported device vendors/products */
-static const struct usb_device_id ural_devs[] = {
+static const STRUCT_USB_HOST_ID ural_devs[] = {
#define URAL_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
URAL_DEV(ASUS, WL167G),
URAL_DEV(ASUS, RT2570),
diff --git a/sys/dev/usb/wlan/if_urtw.c b/sys/dev/usb/wlan/if_urtw.c
index 3de2273..6ae7e16 100644
--- a/sys/dev/usb/wlan/if_urtw.c
+++ b/sys/dev/usb/wlan/if_urtw.c
@@ -102,7 +102,7 @@ TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode);
{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187L) }
#define URTW_REV_RTL8187B 0
#define URTW_REV_RTL8187L 1
-static const struct usb_device_id urtw_devs[] = {
+static const STRUCT_USB_HOST_ID urtw_devs[] = {
URTW_DEV_B(NETGEAR, WG111V3),
URTW_DEV_B(REALTEK, RTL8187B_0),
URTW_DEV_B(REALTEK, RTL8187B_1),
@@ -115,7 +115,7 @@ static const struct usb_device_id urtw_devs[] = {
URTW_DEV_L(REALTEK, RTL8187),
URTW_DEV_L(SITECOMEU, WL168V1),
URTW_DEV_L(SURECOM, EP9001G2A),
- { USB_VPI(0x1b75, 0x8187, URTW_REV_RTL8187L) },
+ { USB_VPI(USB_VENDOR_OVISLINK, 0x8187, URTW_REV_RTL8187L) },
{ USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) },
{ USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) },
{ USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) },
diff --git a/sys/dev/usb/wlan/if_zyd.c b/sys/dev/usb/wlan/if_zyd.c
index 43ec6ca..f8d905e 100644
--- a/sys/dev/usb/wlan/if_zyd.c
+++ b/sys/dev/usb/wlan/if_zyd.c
@@ -200,7 +200,7 @@ static const struct zyd_phy_pair zyd_def_phyB[] = ZYD_DEF_PHYB;
{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, ZYD_ZD1211) }
#define ZYD_ZD1211B_DEV(v,p) \
{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, ZYD_ZD1211B) }
-static const struct usb_device_id zyd_devs[] = {
+static const STRUCT_USB_HOST_ID zyd_devs[] = {
/* ZYD_ZD1211 */
ZYD_ZD1211_DEV(3COM2, 3CRUSB10075),
ZYD_ZD1211_DEV(ABOCOM, WL54),
diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c
index 15cf059..42fca40 100644
--- a/sys/dev/vkbd/vkbd.c
+++ b/sys/dev/vkbd/vkbd.c
@@ -1208,6 +1208,7 @@ vkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
state->ks_accents = 0;
diff --git a/sys/dev/vr/if_vr.c b/sys/dev/vr/if_vr.c
index 906ee1c..1c2aac2 100644
--- a/sys/dev/vr/if_vr.c
+++ b/sys/dev/vr/if_vr.c
@@ -185,7 +185,6 @@ static int vr_miibus_readreg(device_t, int, int);
static int vr_miibus_writereg(device_t, int, int, int);
static void vr_miibus_statchg(device_t);
-static void vr_link_task(void *, int);
static void vr_cam_mask(struct vr_softc *, uint32_t, int);
static int vr_cam_data(struct vr_softc *, int, int, uint8_t *);
static void vr_set_filter(struct vr_softc *);
@@ -226,7 +225,6 @@ static device_method_t vr_methods[] = {
DEVMETHOD(miibus_readreg, vr_miibus_readreg),
DEVMETHOD(miibus_writereg, vr_miibus_writereg),
DEVMETHOD(miibus_statchg, vr_miibus_statchg),
- DEVMETHOD(miibus_linkchg, vr_miibus_statchg),
{ NULL, NULL }
};
@@ -290,22 +288,13 @@ vr_miibus_writereg(device_t dev, int phy, int reg, int data)
return (0);
}
-static void
-vr_miibus_statchg(device_t dev)
-{
- struct vr_softc *sc;
-
- sc = device_get_softc(dev);
- taskqueue_enqueue(taskqueue_swi, &sc->vr_link_task);
-}
-
/*
* In order to fiddle with the
* 'full-duplex' and '100Mbps' bits in the netconfig register, we
* first have to put the transmit and/or receive logic in the idle state.
*/
static void
-vr_link_task(void *arg, int pending)
+vr_miibus_statchg(device_t dev)
{
struct vr_softc *sc;
struct mii_data *mii;
@@ -313,22 +302,25 @@ vr_link_task(void *arg, int pending)
int lfdx, mfdx;
uint8_t cr0, cr1, fc;
- sc = (struct vr_softc *)arg;
-
- VR_LOCK(sc);
+ sc = device_get_softc(dev);
mii = device_get_softc(sc->vr_miibus);
ifp = sc->vr_ifp;
if (mii == NULL || ifp == NULL ||
- (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
- VR_UNLOCK(sc);
+ (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
return;
- }
- if (mii->mii_media_status & IFM_ACTIVE) {
- if (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
+ sc->vr_link = 0;
+ if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
+ (IFM_ACTIVE | IFM_AVALID)) {
+ switch (IFM_SUBTYPE(mii->mii_media_active)) {
+ case IFM_10_T:
+ case IFM_100_TX:
sc->vr_link = 1;
- } else
- sc->vr_link = 0;
+ break;
+ default:
+ break;
+ }
+ }
if (sc->vr_link != 0) {
cr0 = CSR_READ_1(sc, VR_CR0);
@@ -384,11 +376,8 @@ vr_link_task(void *arg, int pending)
"%s: Tx/Rx shutdown error -- resetting\n",
__func__);
sc->vr_flags |= VR_F_RESTART;
- VR_UNLOCK(sc);
- return;
}
}
- VR_UNLOCK(sc);
}
@@ -621,7 +610,6 @@ vr_attach(device_t dev)
mtx_init(&sc->vr_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
MTX_DEF);
callout_init_mtx(&sc->vr_stat_callout, &sc->vr_mtx, 0);
- TASK_INIT(&sc->vr_link_task, 0, vr_link_task, sc);
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
OID_AUTO, "stats", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
@@ -841,7 +829,6 @@ vr_detach(device_t dev)
vr_stop(sc);
VR_UNLOCK(sc);
callout_drain(&sc->vr_stat_callout);
- taskqueue_drain(taskqueue_swi, &sc->vr_link_task);
ether_ifdetach(ifp);
}
if (sc->vr_miibus)
@@ -1559,6 +1546,8 @@ vr_tick(void *xsc)
mii = device_get_softc(sc->vr_miibus);
mii_tick(mii);
+ if (sc->vr_link == 0)
+ vr_miibus_statchg(sc->vr_dev);
vr_watchdog(sc);
callout_reset(&sc->vr_stat_callout, hz, vr_tick, sc);
}
@@ -2161,6 +2150,10 @@ vr_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
sc = ifp->if_softc;
mii = device_get_softc(sc->vr_miibus);
VR_LOCK(sc);
+ if ((ifp->if_flags & IFF_UP) == 0) {
+ VR_UNLOCK(sc);
+ return;
+ }
mii_pollstat(mii);
VR_UNLOCK(sc);
ifmr->ifm_active = mii->mii_media_active;
diff --git a/sys/dev/vr/if_vrreg.h b/sys/dev/vr/if_vrreg.h
index d686bdd..5e2b6b8 100644
--- a/sys/dev/vr/if_vrreg.h
+++ b/sys/dev/vr/if_vrreg.h
@@ -723,7 +723,6 @@ struct vr_softc {
uint8_t vr_flags; /* See VR_F_* below */
#define VR_F_RESTART 0x01 /* Restart unit on next tick */
int vr_if_flags;
- struct task vr_link_task;
struct vr_chain_data vr_cdata;
struct vr_ring_data vr_rdata;
struct vr_statistics vr_stat;
diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index bc59fa0..301d4e8 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -197,6 +197,7 @@ extern void xencons_resume(void);
static void
xctrl_suspend()
{
+ u_int cpuid;
int i, j, k, fpp;
unsigned long max_pfn, start_info_mfn;
@@ -210,11 +211,11 @@ xctrl_suspend()
thread_lock(td);
sched_bind(td, 0);
thread_unlock(td);
- KASSERT(PCPU_GET(cpuid) == 0, ("xen_suspend: not running on cpu 0"));
+ cpuid = PCPU_GET(cpuid);
+ KASSERT(cpuid == 0, ("xen_suspend: not running on cpu 0"));
- sched_pin();
- map = PCPU_GET(other_cpus);
- sched_unpin();
+ map = all_cpus;
+ CPU_CLR(cpuid, &map);
CPU_NAND(&map, &stopped_cpus);
if (!CPU_EMPTY(&map))
stop_cpus(map);
diff --git a/sys/dev/xl/if_xl.c b/sys/dev/xl/if_xl.c
index f1c1d02..e09e434 100644
--- a/sys/dev/xl/if_xl.c
+++ b/sys/dev/xl/if_xl.c
@@ -334,7 +334,7 @@ xl_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
* only a finite amount of time to avoid getting caught in an
* infinite loop. Normally this delay routine would be a macro,
* but it isn't called during normal operation so we can afford
- * to make it a function.
+ * to make it a function. Suppress warning when card gone.
*/
static void
xl_wait(struct xl_softc *sc)
@@ -346,7 +346,7 @@ xl_wait(struct xl_softc *sc)
break;
}
- if (i == XL_TIMEOUT)
+ if (i == XL_TIMEOUT && bus_child_present(sc->xl_dev))
device_printf(sc->xl_dev, "command never completed!\n");
}
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index bf6dab8..955bd8b 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -397,6 +397,7 @@ devfs_allocv(struct devfs_dirent *de, struct mount *mp, int lockmode,
sx_xunlock(&dmp->dm_lock);
return (ENOENT);
}
+loop:
DEVFS_DE_HOLD(de);
DEVFS_DMP_HOLD(dmp);
mtx_lock(&devfs_de_interlock);
@@ -405,16 +406,21 @@ devfs_allocv(struct devfs_dirent *de, struct mount *mp, int lockmode,
VI_LOCK(vp);
mtx_unlock(&devfs_de_interlock);
sx_xunlock(&dmp->dm_lock);
- error = vget(vp, lockmode | LK_INTERLOCK, curthread);
+ vget(vp, lockmode | LK_INTERLOCK | LK_RETRY, curthread);
sx_xlock(&dmp->dm_lock);
if (devfs_allocv_drop_refs(0, dmp, de)) {
- if (error == 0)
- vput(vp);
+ vput(vp);
return (ENOENT);
}
- else if (error) {
- sx_xunlock(&dmp->dm_lock);
- return (error);
+ else if ((vp->v_iflag & VI_DOOMED) != 0) {
+ mtx_lock(&devfs_de_interlock);
+ if (de->de_vnode == vp) {
+ de->de_vnode = NULL;
+ vp->v_data = NULL;
+ }
+ mtx_unlock(&devfs_de_interlock);
+ vput(vp);
+ goto loop;
}
sx_xunlock(&dmp->dm_lock);
*vpp = vp;
diff --git a/sys/fs/nfs/nfs_commonacl.c b/sys/fs/nfs/nfs_commonacl.c
index c4875d8..1d731c5 100644
--- a/sys/fs/nfs/nfs_commonacl.c
+++ b/sys/fs/nfs/nfs_commonacl.c
@@ -59,7 +59,8 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
mask = fxdr_unsigned(u_int32_t, *tl++);
len = fxdr_unsigned(int, *tl);
if (len < 0) {
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
} else if (len == 0) {
/* Netapp filers return a 0 length who for nil users */
acep->ae_tag = ACL_UNDEFINED_TAG;
@@ -68,7 +69,8 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
acep->ae_entry_type = ACL_ENTRY_TYPE_DENY;
if (acesizep)
*acesizep = 4 * NFSX_UNSIGNED;
- return (0);
+ error = 0;
+ goto nfsmout;
}
if (len > NFSV4_SMALLSTR)
name = malloc(len + 1, M_NFSSTRING, M_WAITOK);
@@ -78,7 +80,7 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
if (error) {
if (len > NFSV4_SMALLSTR)
free(name, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (len == 6) {
if (!NFSBCMP(name, "OWNER@", 6)) {
@@ -171,8 +173,9 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
*aceerrp = aceerr;
if (acesizep)
*acesizep = NFSM_RNDUP(len) + (4 * NFSX_UNSIGNED);
- return (0);
+ error = 0;
nfsmout:
+ NFSEXITCODE(error);
return (error);
}
@@ -184,6 +187,7 @@ nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner,
enum vtype type, acl_perm_t *permp)
{
acl_perm_t perm = 0x0;
+ int error = 0;
if (mask & NFSV4ACE_READDATA) {
mask &= ~NFSV4ACE_READDATA;
@@ -257,10 +261,15 @@ nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner,
mask &= ~NFSV4ACE_SYNCHRONIZE;
perm |= ACL_SYNCHRONIZE;
}
- if (mask != 0)
- return (NFSERR_ATTRNOTSUPP);
+ if (mask != 0) {
+ error = NFSERR_ATTRNOTSUPP;
+ goto out;
+ }
*permp = perm;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/* local functions */
@@ -445,19 +454,26 @@ nfsrv_setacl(vnode_t vp, NFSACL_T *aclp, struct ucred *cred,
{
int error;
- if (nfsrv_useacl == 0 || nfs_supportsnfsv4acls(vp) == 0)
- return (NFSERR_ATTRNOTSUPP);
+ if (nfsrv_useacl == 0 || nfs_supportsnfsv4acls(vp) == 0) {
+ error = NFSERR_ATTRNOTSUPP;
+ goto out;
+ }
/*
* With NFSv4 ACLs, chmod(2) may need to add additional entries.
* Make sure it has enough room for that - splitting every entry
* into two and appending "canonical six" entries at the end.
* Cribbed out of kern/vfs_acl.c - Rick M.
*/
- if (aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2)
- return (NFSERR_ATTRNOTSUPP);
+ if (aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2) {
+ error = NFSERR_ATTRNOTSUPP;
+ goto out;
+ }
error = VOP_ACLCHECK(vp, ACL_TYPE_NFS4, aclp, cred, p);
if (!error)
error = VOP_SETACL(vp, ACL_TYPE_NFS4, aclp, cred, p);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c
index ba1ac4e..1f65380 100644
--- a/sys/fs/nfs/nfs_commonkrpc.c
+++ b/sys/fs/nfs/nfs_commonkrpc.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
*/
#include "opt_inet6.h"
+#include "opt_kdtrace.h"
#include "opt_kgssapi.h"
#include "opt_nfs.h"
@@ -64,6 +65,28 @@ __FBSDID("$FreeBSD$");
#include <fs/nfs/nfsport.h>
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+
+dtrace_nfsclient_nfs23_start_probe_func_t
+ dtrace_nfscl_nfs234_start_probe;
+
+dtrace_nfsclient_nfs23_done_probe_func_t
+ dtrace_nfscl_nfs234_done_probe;
+
+/*
+ * Registered probes by RPC type.
+ */
+uint32_t nfscl_nfs2_start_probes[NFS_NPROCS + 1];
+uint32_t nfscl_nfs2_done_probes[NFS_NPROCS + 1];
+
+uint32_t nfscl_nfs3_start_probes[NFS_NPROCS + 1];
+uint32_t nfscl_nfs3_done_probes[NFS_NPROCS + 1];
+
+uint32_t nfscl_nfs4_start_probes[NFS_NPROCS + 1];
+uint32_t nfscl_nfs4_done_probes[NFS_NPROCS + 1];
+#endif
+
NFSSTATESPINLOCK;
NFSREQSPINLOCK;
extern struct nfsstats newnfsstats;
@@ -143,7 +166,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
CLIENT *client;
struct netconfig *nconf;
struct socket *so;
- int one = 1, retries, error;
+ int one = 1, retries, error = 0;
struct thread *td = curthread;
/*
@@ -199,7 +222,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
nrp->nr_soproto, td->td_ucred, td);
if (error) {
td->td_ucred = origcred;
- return (error);
+ goto out;
}
do {
if (error != 0 && pktscale > 2)
@@ -230,7 +253,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
soclose(so);
if (error) {
td->td_ucred = origcred;
- return (error);
+ goto out;
}
client = clnt_reconnect_create(nconf, saddr, nrp->nr_prog,
@@ -284,7 +307,10 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
/* Restore current thread's credentials. */
td->td_ucred = origcred;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -300,9 +326,7 @@ newnfs_disconnect(struct nfssockreq *nrp)
client = nrp->nr_client;
nrp->nr_client = NULL;
mtx_unlock(&nrp->nr_mtx);
-#ifdef KGSSAPI
- rpc_gss_secpurge(client);
-#endif
+ rpc_gss_secpurge_call(client);
CLNT_CLOSE(client);
CLNT_RELEASE(client);
} else {
@@ -314,21 +338,18 @@ static AUTH *
nfs_getauth(struct nfssockreq *nrp, int secflavour, char *clnt_principal,
char *srv_principal, gss_OID mech_oid, struct ucred *cred)
{
-#ifdef KGSSAPI
rpc_gss_service_t svc;
AUTH *auth;
#ifdef notyet
rpc_gss_options_req_t req_options;
#endif
-#endif
switch (secflavour) {
-#ifdef KGSSAPI
case RPCSEC_GSS_KRB5:
case RPCSEC_GSS_KRB5I:
case RPCSEC_GSS_KRB5P:
if (!mech_oid) {
- if (!rpc_gss_mech_to_oid("kerberosv5", &mech_oid))
+ if (!rpc_gss_mech_to_oid_call("kerberosv5", &mech_oid))
return (NULL);
}
if (secflavour == RPCSEC_GSS_KRB5)
@@ -344,7 +365,7 @@ nfs_getauth(struct nfssockreq *nrp, int secflavour, char *clnt_principal,
req_options.input_channel_bindings = NULL;
req_options.enc_type = nfs_keytab_enctype;
- auth = rpc_gss_secfind(nrp->nr_client, cred,
+ auth = rpc_gss_secfind_call(nrp->nr_client, cred,
clnt_principal, srv_principal, mech_oid, svc,
&req_options);
#else
@@ -354,7 +375,7 @@ nfs_getauth(struct nfssockreq *nrp, int secflavour, char *clnt_principal,
* principals. As such, that case cannot yet be handled.
*/
if (clnt_principal == NULL)
- auth = rpc_gss_secfind(nrp->nr_client, cred,
+ auth = rpc_gss_secfind_call(nrp->nr_client, cred,
srv_principal, mech_oid, svc);
else
auth = NULL;
@@ -362,7 +383,6 @@ nfs_getauth(struct nfssockreq *nrp, int secflavour, char *clnt_principal,
if (auth != NULL)
return (auth);
/* fallthrough */
-#endif /* KGSSAPI */
case AUTH_SYS:
default:
return (authunix_create(cred));
@@ -509,6 +529,20 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
else
secflavour = RPCSEC_GSS_KRB5;
srv_principal = NFSMNT_SRVKRBNAME(nmp);
+ } else if (nmp != NULL && !NFSHASKERB(nmp) &&
+ nd->nd_procnum != NFSPROC_NULL &&
+ (nd->nd_flag & ND_USEGSSNAME) != 0) {
+ /*
+ * Use the uid that did the mount when the RPC is doing
+ * NFSv4 system operations, as indicated by the
+ * ND_USEGSSNAME flag, for the AUTH_SYS case.
+ */
+ saved_uid = cred->cr_uid;
+ if (nmp->nm_uid != (uid_t)-1)
+ cred->cr_uid = nmp->nm_uid;
+ else
+ cred->cr_uid = 0;
+ set_uid = 1;
}
if (nmp != NULL) {
@@ -568,6 +602,29 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
if ((nd->nd_flag & ND_NFSV4) && procnum == NFSV4PROC_COMPOUND)
MALLOC(rep, struct nfsreq *, sizeof(struct nfsreq),
M_NFSDREQ, M_WAITOK);
+#ifdef KDTRACE_HOOKS
+ if (dtrace_nfscl_nfs234_start_probe != NULL) {
+ uint32_t probe_id;
+ int probe_procnum;
+
+ if (nd->nd_flag & ND_NFSV4) {
+ probe_id =
+ nfscl_nfs4_start_probes[nd->nd_procnum];
+ probe_procnum = nd->nd_procnum;
+ } else if (nd->nd_flag & ND_NFSV3) {
+ probe_id = nfscl_nfs3_start_probes[procnum];
+ probe_procnum = procnum;
+ } else {
+ probe_id =
+ nfscl_nfs2_start_probes[nd->nd_procnum];
+ probe_procnum = procnum;
+ }
+ if (probe_id != 0)
+ (dtrace_nfscl_nfs234_start_probe)
+ (probe_id, vp, nd->nd_mreq, cred,
+ probe_procnum);
+ }
+#endif
}
trycnt = 0;
tryagain:
@@ -658,8 +715,10 @@ tryagain:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nd->nd_repstat = fxdr_unsigned(u_int32_t, *tl);
if (nd->nd_repstat != 0) {
- if ((nd->nd_repstat == NFSERR_DELAY &&
+ if (((nd->nd_repstat == NFSERR_DELAY ||
+ nd->nd_repstat == NFSERR_GRACE) &&
(nd->nd_flag & ND_NFSV4) &&
+ nd->nd_procnum != NFSPROC_DELEGRETURN &&
nd->nd_procnum != NFSPROC_SETATTR &&
nd->nd_procnum != NFSPROC_READ &&
nd->nd_procnum != NFSPROC_WRITE &&
@@ -679,6 +738,8 @@ tryagain:
while (NFSD_MONOSEC < waituntil)
(void) nfs_catnap(PZERO, 0, "nfstry");
trylater_delay *= 2;
+ m_freem(nd->nd_mrep);
+ nd->nd_mrep = NULL;
goto tryagain;
}
@@ -762,6 +823,27 @@ tryagain:
}
}
+#ifdef KDTRACE_HOOKS
+ if (nmp != NULL && dtrace_nfscl_nfs234_done_probe != NULL) {
+ uint32_t probe_id;
+ int probe_procnum;
+
+ if (nd->nd_flag & ND_NFSV4) {
+ probe_id = nfscl_nfs4_done_probes[nd->nd_procnum];
+ probe_procnum = nd->nd_procnum;
+ } else if (nd->nd_flag & ND_NFSV3) {
+ probe_id = nfscl_nfs3_done_probes[procnum];
+ probe_procnum = procnum;
+ } else {
+ probe_id = nfscl_nfs2_done_probes[nd->nd_procnum];
+ probe_procnum = procnum;
+ }
+ if (probe_id != 0)
+ (dtrace_nfscl_nfs234_done_probe)(probe_id, vp,
+ nd->nd_mreq, cred, probe_procnum, 0);
+ }
+#endif
+
m_freem(nd->nd_mreq);
AUTH_DESTROY(auth);
if (rep != NULL)
diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c
index 6254915..0320f47 100644
--- a/sys/fs/nfs/nfs_commonport.c
+++ b/sys/fs/nfs/nfs_commonport.c
@@ -289,6 +289,50 @@ nfsvno_getfs(struct nfsfsinfo *sip, int isdgram)
NFSV3FSINFO_CANSETTIME);
}
+/*
+ * Do the pathconf vnode op.
+ */
+int
+nfsvno_pathconf(struct vnode *vp, int flag, register_t *retf,
+ struct ucred *cred, struct thread *p)
+{
+ int error;
+
+ error = VOP_PATHCONF(vp, flag, retf);
+ if (error == EOPNOTSUPP || error == EINVAL) {
+ /*
+ * Some file systems return EINVAL for name arguments not
+ * supported and some return EOPNOTSUPP for this case.
+ * So the NFSv3 Pathconf RPC doesn't fail for these cases,
+ * just fake them.
+ */
+ switch (flag) {
+ case _PC_LINK_MAX:
+ *retf = LINK_MAX;
+ break;
+ case _PC_NAME_MAX:
+ *retf = NAME_MAX;
+ break;
+ case _PC_CHOWN_RESTRICTED:
+ *retf = 1;
+ break;
+ case _PC_NO_TRUNC:
+ *retf = 1;
+ break;
+ default:
+ /*
+ * Only happens if a _PC_xxx is added to the server,
+ * but this isn't updated.
+ */
+ *retf = 0;
+ printf("nfsrvd pathconf flag=%d not supp\n", flag);
+ };
+ error = 0;
+ }
+ NFSEXITCODE(error);
+ return (error);
+}
+
/* Fake nfsrv_atroot. Just return 0 */
int
nfsrv_atroot(struct vnode *vp, long *retp)
@@ -384,6 +428,7 @@ nfssvc_nfscommon(struct thread *td, struct nfssvc_args *uap)
int error;
error = nfssvc_call(td, uap, td->td_ucred);
+ NFSEXITCODE(error);
return (error);
}
@@ -396,9 +441,9 @@ nfssvc_call(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
if (uap->flag & NFSSVC_IDNAME) {
error = copyin(uap->argp, (caddr_t)&nid, sizeof (nid));
if (error)
- return (error);
+ goto out;
error = nfssvc_idname(&nid);
- return (error);
+ goto out;
} else if (uap->flag & NFSSVC_GETSTATS) {
error = copyout(&newnfsstats,
CAST_USER_ADDR_T(uap->argp), sizeof (newnfsstats));
@@ -460,7 +505,7 @@ nfssvc_call(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
sizeof(newnfsstats.cbrpccnt));
}
}
- return (error);
+ goto out;
} else if (uap->flag & NFSSVC_NFSUSERDPORT) {
u_short sockport;
@@ -472,6 +517,9 @@ nfssvc_call(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
nfsrv_nfsuserddelport();
error = 0;
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -526,7 +574,7 @@ nfscommon_modevent(module_t mod, int type, void *data)
switch (type) {
case MOD_LOAD:
if (loaded)
- return (0);
+ goto out;
newnfs_portinit();
mtx_init(&nfs_nameid_mutex, "nfs_nameid_mutex", NULL, MTX_DEF);
mtx_init(&nfs_sockl_mutex, "nfs_sockl_mutex", NULL, MTX_DEF);
@@ -563,6 +611,9 @@ nfscommon_modevent(module_t mod, int type, void *data)
error = EOPNOTSUPP;
break;
}
+
+out:
+ NFSEXITCODE(error);
return error;
}
static moduledata_t nfscommon_mod = {
diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c
index 03b5786..168018c 100644
--- a/sys/fs/nfs/nfs_commonsubs.c
+++ b/sys/fs/nfs/nfs_commonsubs.c
@@ -179,8 +179,10 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
len = NFSMTOD(mp, caddr_t) + mbuf_len(mp) - mbufcp;
rem = NFSM_RNDUP(siz) - siz;
while (siz > 0) {
- if (uiop->uio_iovcnt <= 0 || uiop->uio_iov == NULL)
- return (EBADRPC);
+ if (uiop->uio_iovcnt <= 0 || uiop->uio_iov == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
left = uiop->uio_iov->iov_len;
uiocp = uiop->uio_iov->iov_base;
if (left > siz)
@@ -189,8 +191,10 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
while (left > 0) {
while (len == 0) {
mp = mbuf_next(mp);
- if (mp == NULL)
- return (EBADRPC);
+ if (mp == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
mbufcp = NFSMTOD(mp, caddr_t);
len = mbuf_len(mp);
}
@@ -231,6 +235,9 @@ nfsm_mbufuio(struct nfsrv_descript *nd, struct uio *uiop, int siz)
else
nd->nd_dpos += rem;
}
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
#endif /* !APPLE */
@@ -308,9 +315,10 @@ nfsm_dissct(struct nfsrv_descript *nd, int siz)
APPLESTATIC int
nfsm_advance(struct nfsrv_descript *nd, int offs, int left)
{
+ int error = 0;
if (offs == 0)
- return (0);
+ goto out;
/*
* A negative offs should be considered a serious problem.
*/
@@ -330,13 +338,18 @@ nfsm_advance(struct nfsrv_descript *nd, int offs, int left)
while (offs > left) {
offs -= left;
nd->nd_md = mbuf_next(nd->nd_md);
- if (nd->nd_md == NULL)
- return (EBADRPC);
+ if (nd->nd_md == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
left = mbuf_len(nd->nd_md);
nd->nd_dpos = NFSMTOD(nd->nd_md, caddr_t);
}
nd->nd_dpos += offs;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -620,8 +633,10 @@ nfsm_getfh(struct nfsrv_descript *nd, struct nfsfh **nfhpp)
if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
if ((len = fxdr_unsigned(int, *tl)) <= 0 ||
- len > NFSX_FHMAX)
- return (EBADRPC);
+ len > NFSX_FHMAX) {
+ error = EBADRPC;
+ goto nfsmout;
+ }
} else
len = NFSX_V2FH;
MALLOC(nfhp, struct nfsfh *, sizeof (struct nfsfh) + len,
@@ -629,11 +644,12 @@ nfsm_getfh(struct nfsrv_descript *nd, struct nfsfh **nfhpp)
error = nfsrv_mtostr(nd, nfhp->nfh_fh, len);
if (error) {
FREE((caddr_t)nfhp, M_NFSFH);
- return (error);
+ goto nfsmout;
}
nfhp->nfh_len = len;
*nfhpp = nfhp;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -660,9 +676,9 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp,
aclsize = NFSX_UNSIGNED;
acecnt = fxdr_unsigned(int, *tl);
if (acecnt > ACL_MAX_ENTRIES)
- aceerr = 1;
+ aceerr = NFSERR_ATTRNOTSUPP;
if (nfsrv_useacl == 0)
- aceerr = 1;
+ aceerr = NFSERR_ATTRNOTSUPP;
for (i = 0; i < acecnt; i++) {
if (aclp && !aceerr)
error = nfsrv_dissectace(nd, &aclp->acl_entry[i],
@@ -670,7 +686,7 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp,
else
error = nfsrv_skipace(nd, &acesize);
if (error)
- return (error);
+ goto nfsmout;
aclsize += acesize;
}
if (aclp && !aceerr)
@@ -680,6 +696,7 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp,
if (aclsizep)
*aclsizep = aclsize;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -697,6 +714,7 @@ nfsrv_skipace(struct nfsrv_descript *nd, int *acesizep)
error = nfsm_advance(nd, NFSM_RNDUP(len), -1);
nfsmout:
*acesizep = NFSM_RNDUP(len) + (4 * NFSX_UNSIGNED);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -715,8 +733,10 @@ nfsrv_getattrbits(struct nfsrv_descript *nd, nfsattrbit_t *attrbitp, int *cntp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
cnt = fxdr_unsigned(int, *tl);
- if (cnt < 0)
- return (NFSERR_BADXDR);
+ if (cnt < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (cnt > NFSATTRBIT_MAXWORDS) {
outcnt = NFSATTRBIT_MAXWORDS;
if (retnotsupp)
@@ -735,6 +755,7 @@ nfsrv_getattrbits(struct nfsrv_descript *nd, nfsattrbit_t *attrbitp, int *cntp,
if (cntp)
*cntp = NFSX_UNSIGNED + (cnt * NFSX_UNSIGNED);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -756,7 +777,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
u_int32_t *leasep, u_int32_t *rderrp, NFSPROC_T *p, struct ucred *cred)
{
u_int32_t *tl;
- int i = 0, j, k, l, m, bitpos, attrsum = 0;
+ int i = 0, j, k, l = 0, m, bitpos, attrsum = 0;
int error, tfhsize, aceerr, attrsize, cnt, retnotsup;
u_char *cp, *cp2, namestr[NFSV4_SMALLSTR + 1];
nfsattrbit_t attrbits, retattrbits, checkattrbits;
@@ -782,7 +803,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsrv_getattrbits(nd, &attrbits, NULL, NULL);
}
if (error)
- return (error);
+ goto nfsmout;
if (compare) {
*retcmpp = retnotsup;
@@ -853,7 +874,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsrv_getattrbits(nd, &nap->na_suppattr,
&cnt, &retnotsup);
if (error)
- return (error);
+ goto nfsmout;
if (compare && !(*retcmpp)) {
NFSSETSUPP_ATTRBIT(&checkattrbits);
if (!NFSEQUAL_ATTRBIT(&retattrbits, &checkattrbits)
@@ -1014,9 +1035,10 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
&cnt, p);
if (error) {
acl_free(naclp);
- return (error);
+ goto nfsmout;
}
- if (aceerr || nfsrv_compareacl(aclp, naclp))
+ if (aceerr || aclp == NULL ||
+ nfsrv_compareacl(aclp, naclp))
*retcmpp = NFSERR_NOTSAME;
acl_free(naclp);
} else {
@@ -1033,7 +1055,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsrv_dissectacl(nd, NULL, &aceerr,
&cnt, p);
if (error)
- return (error);
+ goto nfsmout;
}
attrsum += cnt;
break;
@@ -1118,7 +1140,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_FILEHANDLE:
error = nfsm_getfh(nd, &tnfhp);
if (error)
- return (error);
+ goto nfsmout;
tfhsize = tnfhp->nfh_len;
if (compare) {
if (!(*retcmpp) &&
@@ -1184,7 +1206,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_FSLOCATIONS:
error = nfsrv_getrefstr(nd, &cp, &cp2, &l, &m);
if (error)
- return (error);
+ goto nfsmout;
attrsum += l;
if (compare && !(*retcmpp)) {
refp = nfsv4root_getreferral(vp, NULL, 0);
@@ -1360,8 +1382,10 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_OWNER:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
attrsum += (NFSX_UNSIGNED + NFSM_RNDUP(j));
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
@@ -1371,7 +1395,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (compare) {
if (!(*retcmpp)) {
@@ -1391,8 +1415,10 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
case NFSATTRBIT_OWNERGROUP:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
attrsum += (NFSX_UNSIGNED + NFSM_RNDUP(j));
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
@@ -1402,7 +1428,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (compare) {
if (!(*retcmpp)) {
@@ -1708,6 +1734,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
error = nfsm_advance(nd, attrsize - attrsum, -1);
}
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1904,8 +1931,10 @@ nfsrv_mtostr(struct nfsrv_descript *nd, char *str, int siz)
siz -= xfer;
if (siz > 0) {
mp = mbuf_next(mp);
- if (mp == NULL)
- return (EBADRPC);
+ if (mp == NULL) {
+ error = EBADRPC;
+ goto out;
+ }
cp = NFSMTOD(mp, caddr_t);
len = mbuf_len(mp);
} else {
@@ -1922,6 +1951,9 @@ nfsrv_mtostr(struct nfsrv_descript *nd, char *str, int siz)
else
nd->nd_dpos += rem;
}
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1995,12 +2027,12 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,
supports_nfsv4acls == 0)) {
NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACL);
} else if (naclp != NULL) {
- if (vn_lock(vp, LK_SHARED) == 0) {
+ if (NFSVOPLOCK(vp, LK_SHARED) == 0) {
error = VOP_ACCESSX(vp, VREAD_ACL, cred, p);
if (error == 0)
error = VOP_GETACL(vp, ACL_TYPE_NFS4,
naclp, cred, p);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else
error = NFSERR_PERM;
if (error != 0) {
@@ -2568,9 +2600,12 @@ nfsv4_strtouid(u_char *str, int len, uid_t *uidp, NFSPROC_T *p)
u_char *cp;
struct nfsusrgrp *usrp;
int cnt, ret;
+ int error = 0;
- if (len == 0)
- return (NFSERR_BADOWNER);
+ if (len == 0) {
+ error = NFSERR_BADOWNER;
+ goto out;
+ }
/*
* Look for an '@'.
*/
@@ -2601,7 +2636,8 @@ tryagain:
if (len == 6 && !NFSBCMP(str, "nobody", 6)) {
*uidp = nfsrv_defaultuid;
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
LIST_FOREACH(usrp, NFSUSERNAMEHASH(str, len), lug_namehash) {
@@ -2613,7 +2649,8 @@ tryagain:
TAILQ_REMOVE(&nfsuserlruhead, usrp, lug_lru);
TAILQ_INSERT_TAIL(&nfsuserlruhead, usrp, lug_lru);
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
}
NFSUNLOCKNAMEID();
@@ -2622,7 +2659,11 @@ tryagain:
str, p);
if (ret == 0 && cnt < 2)
goto tryagain;
- return (NFSERR_BADOWNER);
+ error = NFSERR_BADOWNER;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2748,9 +2789,12 @@ nfsv4_strtogid(u_char *str, int len, gid_t *gidp, NFSPROC_T *p)
u_char *cp;
struct nfsusrgrp *usrp;
int cnt, ret;
+ int error = 0;
- if (len == 0)
- return (NFSERR_BADOWNER);
+ if (len == 0) {
+ error = NFSERR_BADOWNER;
+ goto out;
+ }
/*
* Look for an '@'.
*/
@@ -2779,7 +2823,8 @@ tryagain:
if (len == 7 && !NFSBCMP(str, "nogroup", 7)) {
*gidp = nfsrv_defaultgid;
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
LIST_FOREACH(usrp, NFSGROUPNAMEHASH(str, len), lug_namehash) {
@@ -2791,7 +2836,8 @@ tryagain:
TAILQ_REMOVE(&nfsuserlruhead, usrp, lug_lru);
TAILQ_INSERT_TAIL(&nfsuserlruhead, usrp, lug_lru);
NFSUNLOCKNAMEID();
- return (0);
+ error = 0;
+ goto out;
}
}
NFSUNLOCKNAMEID();
@@ -2800,7 +2846,11 @@ tryagain:
str, p);
if (ret == 0 && cnt < 2)
goto tryagain;
- return (NFSERR_BADOWNER);
+ error = NFSERR_BADOWNER;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2845,7 +2895,8 @@ nfsrv_nfsuserdport(u_short port, NFSPROC_T *p)
NFSLOCKNAMEID();
if (nfsrv_nfsuserd) {
NFSUNLOCKNAMEID();
- return (EPERM);
+ error = EPERM;
+ goto out;
}
nfsrv_nfsuserd = 1;
NFSUNLOCKNAMEID();
@@ -2871,6 +2922,8 @@ nfsrv_nfsuserdport(u_short port, NFSPROC_T *p)
NFSSOCKADDRFREE(rp->nr_nam);
nfsrv_nfsuserd = 0;
}
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2910,7 +2963,8 @@ nfsrv_getuser(int procnum, uid_t uid, gid_t gid, char *name, NFSPROC_T *p)
NFSLOCKNAMEID();
if (nfsrv_nfsuserd == 0) {
NFSUNLOCKNAMEID();
- return (EPERM);
+ error = EPERM;
+ goto out;
}
NFSUNLOCKNAMEID();
nd = &nfsd;
@@ -2936,6 +2990,8 @@ nfsrv_getuser(int procnum, uid_t uid, gid_t gid, char *name, NFSPROC_T *p)
mbuf_freem(nd->nd_mrep);
error = nd->nd_repstat;
}
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2992,7 +3048,7 @@ nfssvc_idname(struct nfsd_idargs *nidp)
NFSUNLOCKNAMEID();
if (error)
free(cp, M_NFSSTRING);
- return (error);
+ goto out;
}
/*
@@ -3005,7 +3061,7 @@ nfssvc_idname(struct nfsd_idargs *nidp)
nidp->nid_namelen);
if (error) {
free((caddr_t)newusrp, M_NFSUSERGROUP);
- return (error);
+ goto out;
}
newusrp->lug_namelen = nidp->nid_namelen;
@@ -3080,6 +3136,8 @@ nfssvc_idname(struct nfsd_idargs *nidp)
} else
FREE((caddr_t)newusrp, M_NFSUSERGROUP);
NFSUNLOCKNAMEID();
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -3109,6 +3167,7 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
int cnt = 0, gotd = 0, shift = 0;
u_int8_t byte;
static int utf8_shift[5] = { 7, 11, 16, 21, 26 };
+ int error = 0;
/*
* Here are what the variables are used for:
@@ -3125,14 +3184,18 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
if (cnt > 0) {
/* This handles the 10xxxxxx bytes */
if ((*cp & 0xc0) != 0x80 ||
- (gotd && (*cp & 0x20)))
- return (NFSERR_INVAL);
+ (gotd && (*cp & 0x20))) {
+ error = NFSERR_INVAL;
+ goto out;
+ }
gotd = 0;
val <<= 6;
val |= (*cp & 0x3f);
cnt--;
- if (cnt == 0 && (val >> shift) == 0x0)
- return (NFSERR_INVAL);
+ if (cnt == 0 && (val >> shift) == 0x0) {
+ error = NFSERR_INVAL;
+ goto out;
+ }
} else if (*cp & 0x80) {
/* first byte of multi byte char */
byte = *cp;
@@ -3140,8 +3203,10 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
cnt++;
byte <<= 1;
}
- if (cnt == 0 || cnt == 6)
- return (NFSERR_INVAL);
+ if (cnt == 0 || cnt == 6) {
+ error = NFSERR_INVAL;
+ goto out;
+ }
val = (*cp & (0x3f >> cnt));
shift = utf8_shift[cnt - 1];
if (cnt == 2 && val == 0xd)
@@ -3152,8 +3217,11 @@ nfsrv_checkutf8(u_int8_t *cp, int len)
len--;
}
if (cnt > 0)
- return (NFSERR_INVAL);
- return (0);
+ error = NFSERR_INVAL;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3174,7 +3242,7 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
{
u_int32_t *tl;
u_char *cp = NULL, *cp2 = NULL, *cp3, *str;
- int i, j, len, stringlen, cnt, slen, siz, xdrsum, error, nsrv;
+ int i, j, len, stringlen, cnt, slen, siz, xdrsum, error = 0, nsrv;
struct list {
SLIST_ENTRY(list) next;
int len;
@@ -3192,15 +3260,20 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
*/
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
- if (len < 0 || len > 10240)
- return (NFSERR_BADXDR);
+ if (len < 0 || len > 10240) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (len == 0) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
- if (*tl != 0)
- return (NFSERR_BADXDR);
+ if (*tl != 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
*nilp = 1;
*sump = 2 * NFSX_UNSIGNED;
- return (0);
+ error = 0;
+ goto nfsmout;
}
cp = malloc(len + 1, M_NFSSTRING, M_WAITOK);
error = nfsrv_mtostr(nd, cp, len);
@@ -3210,10 +3283,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
if (cnt <= 0)
error = NFSERR_BADXDR;
}
- if (error) {
- free(cp, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
/*
* Now, loop through the location list and make up the srvlist.
@@ -3227,9 +3298,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nsrv = fxdr_unsigned(int, *tl);
if (nsrv <= 0) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
/*
@@ -3238,9 +3308,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
if (len <= 0 || len > 1024) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
nfsrv_refstrbigenough(siz + len + 3, &cp2, &cp3, &slen);
if (cp3 != cp2) {
@@ -3248,11 +3317,8 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
siz++;
}
error = nfsrv_mtostr(nd, cp3, len);
- if (error) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
cp3 += len;
*cp3++ = ':';
siz += (len + 1);
@@ -3264,18 +3330,14 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
if (len <= 0 || len > 1024) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
lsp = (struct list *)malloc(sizeof (struct list)
+ len, M_TEMP, M_WAITOK);
error = nfsrv_mtostr(nd, lsp->host, len);
- if (error) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
xdrsum += NFSX_UNSIGNED + NFSM_RNDUP(len);
lsp->len = len;
SLIST_INSERT_HEAD(&head, lsp, next);
@@ -3287,17 +3349,13 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
len = fxdr_unsigned(int, *tl);
if (len <= 0 || len > 1024) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (NFSERR_BADXDR);
+ error = NFSERR_BADXDR;
+ goto nfsmout;
}
nfsrv_refstrbigenough(siz + len + 1, &cp2, &cp3, &slen);
error = nfsrv_mtostr(nd, cp3, len);
- if (error) {
- free(cp, M_NFSSTRING);
- free(cp2, M_NFSSTRING);
- return (error);
- }
+ if (error)
+ goto nfsmout;
xdrsum += NFSX_UNSIGNED + NFSM_RNDUP(len);
str = cp3;
stringlen = len;
@@ -3320,12 +3378,14 @@ nfsrv_getrefstr(struct nfsrv_descript *nd, u_char **fsrootp, u_char **srvp,
*fsrootp = cp;
*srvp = cp2;
*sump = xdrsum;
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (cp != NULL)
free(cp, M_NFSSTRING);
if (cp2 != NULL)
free(cp2, M_NFSSTRING);
+ NFSEXITCODE2(error, nd);
return (error);
}
diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h
index 5f944b5..f095641 100644
--- a/sys/fs/nfs/nfs_var.h
+++ b/sys/fs/nfs/nfs_var.h
@@ -325,6 +325,8 @@ struct ucred *newnfs_getcred(void);
void newnfs_setroot(struct ucred *);
int nfs_catnap(int, int, const char *);
struct nfsreferral *nfsv4root_getreferral(vnode_t, vnode_t, u_int32_t);
+int nfsvno_pathconf(vnode_t, int, register_t *, struct ucred *,
+ NFSPROC_T *);
int nfsrv_atroot(vnode_t, long *);
void newnfs_timer(void *);
int nfs_supportsnfsv4acls(vnode_t);
@@ -438,6 +440,7 @@ int nfscl_getcl(vnode_t, struct ucred *, NFSPROC_T *,
struct nfsclclient *nfscl_findcl(struct nfsmount *);
void nfscl_clientrelease(struct nfsclclient *);
void nfscl_freelock(struct nfscllock *, int);
+void nfscl_freelockowner(struct nfscllockowner *, int);
int nfscl_getbytelock(vnode_t, u_int64_t, u_int64_t, short,
struct ucred *, NFSPROC_T *, struct nfsclclient *, int, void *, int,
u_int8_t *, u_int8_t *, struct nfscllockowner **, int *, int *);
@@ -568,8 +571,6 @@ int nfsvno_checkexp(mount_t, NFSSOCKADDR_T, struct nfsexstuff *,
struct ucred **);
int nfsvno_fhtovp(mount_t, fhandle_t *, NFSSOCKADDR_T, int,
vnode_t *, struct nfsexstuff *, struct ucred **);
-int nfsvno_pathconf(vnode_t, int, register_t *, struct ucred *,
- NFSPROC_T *);
vnode_t nfsvno_getvp(fhandle_t *);
int nfsvno_advlock(vnode_t, int, u_int64_t, u_int64_t, NFSPROC_T *);
int nfsrv_v4rootexport(void *, struct ucred *, NFSPROC_T *);
diff --git a/sys/fs/nfs/nfsdport.h b/sys/fs/nfs/nfsdport.h
index a3f05db..529ada2 100644
--- a/sys/fs/nfs/nfsdport.h
+++ b/sys/fs/nfs/nfsdport.h
@@ -57,6 +57,22 @@ struct nfsexstuff {
int nes_secflavors[MAXSECFLAVORS]; /* and the flavors */
};
+/*
+ * These are NO-OPS for BSD until Isilon upstreams EXITCODE support.
+ * EXITCODE is an in-memory ring buffer that holds the routines failing status.
+ * This is a valuable tool to use when debugging and analyzing issues.
+ * In addition to recording a routine's failing status, it offers
+ * logging of routines for call stack tracing.
+ * EXITCODE should be used only in routines that return a true errno value, as
+ * that value will be formatted to a displayable errno string. Routines that
+ * return regular int status that are not true errno should not set EXITCODE.
+ * If you want to log routine tracing, you can add EXITCODE(0) to any routine.
+ * NFS extended the EXITCODE with EXITCODE2 to record either the routine's
+ * exit errno status or the nd_repstat.
+ */
+#define NFSEXITCODE(error)
+#define NFSEXITCODE2(error, nd)
+
#define NFSVNO_EXINIT(e) ((e)->nes_exflag = 0)
#define NFSVNO_EXPORTED(e) ((e)->nes_exflag & MNT_EXPORTED)
#define NFSVNO_EXRDONLY(e) ((e)->nes_exflag & MNT_EXRDONLY)
diff --git a/sys/fs/nfs/nfsport.h b/sys/fs/nfs/nfsport.h
index c21482d..726d3b5 100644
--- a/sys/fs/nfs/nfsport.h
+++ b/sys/fs/nfs/nfsport.h
@@ -267,6 +267,7 @@
* NFS_V3NPROCS is one greater than the last V3 op and NFS_NPROCS is
* one greater than the last number.
*/
+#ifndef NFS_V3NPROCS
#define NFS_V3NPROCS 22
#define NFSPROC_LOOKUPP 22
@@ -293,6 +294,7 @@
* Must be defined as one higher than the last Proc# above.
*/
#define NFSV4_NPROCS 41
+#endif /* NFS_V3NPROCS */
/*
* Stats structure
@@ -358,7 +360,9 @@ struct ext_nfsstats {
/*
* Define NFS_NPROCS as NFSV4_NPROCS for the experimental kernel code.
*/
+#ifndef NFS_NPROCS
#define NFS_NPROCS NFSV4_NPROCS
+#endif
#include <fs/nfs/nfskpiport.h>
#include <fs/nfs/nfsdport.h>
@@ -832,10 +836,13 @@ void nfsd_mntinit(void);
/*
* Define these for vnode lock/unlock ops.
+ *
+ * These are good abstractions to macro out, so that they can be added to
+ * later, for debugging or stats, etc.
*/
-#define NFSVOPLOCK(v, f, p) vn_lock((v), (f))
-#define NFSVOPUNLOCK(v, f, p) VOP_UNLOCK((v), (f))
-#define NFSVOPISLOCKED(v, p) VOP_ISLOCKED((v))
+#define NFSVOPLOCK(v, f) vn_lock((v), (f))
+#define NFSVOPUNLOCK(v, f) VOP_UNLOCK((v), (f))
+#define NFSVOPISLOCKED(v) VOP_ISLOCKED((v))
/*
* Define ncl_hash().
diff --git a/sys/fs/nfs/nfsproto.h b/sys/fs/nfs/nfsproto.h
index 6b66c1f..5ae2e3d 100644
--- a/sys/fs/nfs/nfsproto.h
+++ b/sys/fs/nfs/nfsproto.h
@@ -226,6 +226,48 @@
#define NFSPROC_COMMIT 21
/*
+ * The lower numbers -> 21 are used by NFSv2 and v3. These define higher
+ * numbers used by NFSv4.
+ * NFS_V3NPROCS is one greater than the last V3 op and NFS_NPROCS is
+ * one greater than the last number.
+ */
+#ifndef NFS_V3NPROCS
+#define NFS_V3NPROCS 22
+
+#define NFSPROC_LOOKUPP 22
+#define NFSPROC_SETCLIENTID 23
+#define NFSPROC_SETCLIENTIDCFRM 24
+#define NFSPROC_LOCK 25
+#define NFSPROC_LOCKU 26
+#define NFSPROC_OPEN 27
+#define NFSPROC_CLOSE 28
+#define NFSPROC_OPENCONFIRM 29
+#define NFSPROC_LOCKT 30
+#define NFSPROC_OPENDOWNGRADE 31
+#define NFSPROC_RENEW 32
+#define NFSPROC_PUTROOTFH 33
+#define NFSPROC_RELEASELCKOWN 34
+#define NFSPROC_DELEGRETURN 35
+#define NFSPROC_RETDELEGREMOVE 36
+#define NFSPROC_RETDELEGRENAME1 37
+#define NFSPROC_RETDELEGRENAME2 38
+#define NFSPROC_GETACL 39
+#define NFSPROC_SETACL 40
+
+/*
+ * Must be defined as one higher than the last Proc# above.
+ */
+#define NFSV4_NPROCS 41
+#endif /* NFS_V3NPROCS */
+
+/*
+ * Define NFS_NPROCS as NFSV4_NPROCS for the experimental kernel code.
+ */
+#ifndef NFS_NPROCS
+#define NFS_NPROCS NFSV4_NPROCS
+#endif
+
+/*
* NFSPROC_NOOP is a fake op# that can't be the same as any V2/3/4 Procedure
* or Operation#. Since the NFS V4 Op #s go higher, use NFSV4OP_NOPS, which
* is one greater than the highest Op#.
@@ -826,15 +868,24 @@ struct nfsv3_sattr {
* NFSATTRBIT_WRITEGETATTR0 - bits 0<->31
*/
#define NFSATTRBIT_WRITEGETATTR0 \
- (NFSATTRBM_CHANGE | \
+ (NFSATTRBM_SUPPORTEDATTRS | \
+ NFSATTRBM_TYPE | \
+ NFSATTRBM_CHANGE | \
NFSATTRBM_SIZE | \
- NFSATTRBM_FSID)
+ NFSATTRBM_FSID | \
+ NFSATTRBM_FILEID | \
+ NFSATTRBM_MAXREAD)
/*
* NFSATTRBIT_WRITEGETATTR1 - bits 32<->63
*/
#define NFSATTRBIT_WRITEGETATTR1 \
- (NFSATTRBM_TIMEMETADATA | \
+ (NFSATTRBM_MODE | \
+ NFSATTRBM_NUMLINKS | \
+ NFSATTRBM_RAWDEV | \
+ NFSATTRBM_SPACEUSED | \
+ NFSATTRBM_TIMEACCESS | \
+ NFSATTRBM_TIMEMETADATA | \
NFSATTRBM_TIMEMODIFY)
/*
diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c
index 95138ec..b33c8a5 100644
--- a/sys/fs/nfsclient/nfs_clbio.c
+++ b/sys/fs/nfsclient/nfs_clbio.c
@@ -35,6 +35,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_kdtrace.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bio.h>
@@ -55,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <fs/nfsclient/nfsmount.h>
#include <fs/nfsclient/nfs.h>
#include <fs/nfsclient/nfsnode.h>
+#include <fs/nfsclient/nfs_kdtrace.h>
extern int newnfs_directio_allow_mmap;
extern struct nfsstats newnfsstats;
@@ -399,6 +402,7 @@ nfs_bioread_check_cons(struct vnode *vp, struct thread *td, struct ucred *cred)
goto out;
}
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
error = VOP_GETATTR(vp, &vattr, cred);
if (error)
goto out;
@@ -915,6 +919,7 @@ ncl_write(struct vop_write_args *ap)
#endif
flush_and_restart:
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
error = ncl_vinvalbuf(vp, V_SAVE, td, 1);
if (error)
return (error);
@@ -928,6 +933,7 @@ flush_and_restart:
*/
if (ioflag & IO_APPEND) {
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
error = VOP_GETATTR(vp, &vattr, cred);
if (error)
return (error);
@@ -1748,6 +1754,7 @@ ncl_doio(struct vnode *vp, struct buf *bp, struct ucred *cr, struct thread *td,
mtx_lock(&np->n_mtx);
np->n_flag |= NWRITEERR;
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
mtx_unlock(&np->n_mtx);
}
bp->b_dirtyoff = bp->b_dirtyend = 0;
diff --git a/sys/fs/nfsclient/nfs_clkdtrace.c b/sys/fs/nfsclient/nfs_clkdtrace.c
new file mode 100644
index 0000000..c7db3a4
--- /dev/null
+++ b/sys/fs/nfsclient/nfs_clkdtrace.c
@@ -0,0 +1,600 @@
+/*-
+ * Copyright (c) 2009 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * This software was developed at the University of Cambridge Computer
+ * Laboratory with support from a grant from Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+
+#include <sys/dtrace.h>
+#include <sys/dtrace_bsd.h>
+
+#include <fs/nfs/nfsproto.h>
+
+#include <fs/nfsclient/nfs_kdtrace.h>
+
+/*
+ * dtnfscl is a DTrace provider that tracks the intent to perform RPCs
+ * in the NFS client, as well as acess to and maintenance of the access and
+ * attribute caches. This is not quite the same as RPCs, because NFS may
+ * issue multiple RPC transactions in the event that authentication fails,
+ * there's a jukebox error, or none at all if the access or attribute cache
+ * hits. However, it cleanly represents the logical layer between RPC
+ * transmission and vnode/vfs operations, providing access to state linking
+ * the two.
+ */
+
+static int dtnfsclient_unload(void);
+static void dtnfsclient_getargdesc(void *, dtrace_id_t, void *,
+ dtrace_argdesc_t *);
+static void dtnfsclient_provide(void *, dtrace_probedesc_t *);
+static void dtnfsclient_destroy(void *, dtrace_id_t, void *);
+static void dtnfsclient_enable(void *, dtrace_id_t, void *);
+static void dtnfsclient_disable(void *, dtrace_id_t, void *);
+static void dtnfsclient_load(void *);
+
+static dtrace_pattr_t dtnfsclient_attr = {
+{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON },
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
+{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
+{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON },
+{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON },
+};
+
+/*
+ * Description of NFSv4, NFSv3 and (optional) NFSv2 probes for a procedure.
+ */
+struct dtnfsclient_rpc {
+ char *nr_v4_name;
+ char *nr_v3_name; /* Or NULL if none. */
+ char *nr_v2_name; /* Or NULL if none. */
+
+ /*
+ * IDs for the start and done cases, for NFSv2, NFSv3 and NFSv4.
+ */
+ uint32_t nr_v2_id_start, nr_v2_id_done;
+ uint32_t nr_v3_id_start, nr_v3_id_done;
+ uint32_t nr_v4_id_start, nr_v4_id_done;
+};
+
+/*
+ * This table is indexed by NFSv3 procedure number, but also used for NFSv2
+ * procedure names and NFSv4 operations.
+ */
+static struct dtnfsclient_rpc dtnfsclient_rpcs[NFS_NPROCS + 1] = {
+ { "null", "null", "null" },
+ { "getattr", "getattr", "getattr" },
+ { "setattr", "setattr", "setattr" },
+ { "lookup", "lookup", "lookup" },
+ { "access", "access", "noop" },
+ { "readlink", "readlink", "readlink" },
+ { "read", "read", "read" },
+ { "write", "write", "write" },
+ { "create", "create", "create" },
+ { "mkdir", "mkdir", "mkdir" },
+ { "symlink", "symlink", "symlink" },
+ { "mknod", "mknod" },
+ { "remove", "remove", "remove" },
+ { "rmdir", "rmdir", "rmdir" },
+ { "rename", "rename", "rename" },
+ { "link", "link", "link" },
+ { "readdir", "readdir", "readdir" },
+ { "readdirplus", "readdirplus" },
+ { "fsstat", "fsstat", "statfs" },
+ { "fsinfo", "fsinfo" },
+ { "pathconf", "pathconf" },
+ { "commit", "commit" },
+ { "lookupp" },
+ { "setclientid" },
+ { "setclientidcfrm" },
+ { "lock" },
+ { "locku" },
+ { "open" },
+ { "close" },
+ { "openconfirm" },
+ { "lockt" },
+ { "opendowngrade" },
+ { "renew" },
+ { "putrootfh" },
+ { "releaselckown" },
+ { "delegreturn" },
+ { "retdelegremove" },
+ { "retdelegrename1" },
+ { "retdelegrename2" },
+ { "getacl" },
+ { "setacl" },
+ { "noop", "noop", "noop" }
+};
+
+/*
+ * Module name strings.
+ */
+static char *dtnfsclient_accesscache_str = "accesscache";
+static char *dtnfsclient_attrcache_str = "attrcache";
+static char *dtnfsclient_nfs2_str = "nfs2";
+static char *dtnfsclient_nfs3_str = "nfs3";
+static char *dtnfsclient_nfs4_str = "nfs4";
+
+/*
+ * Function name strings.
+ */
+static char *dtnfsclient_flush_str = "flush";
+static char *dtnfsclient_load_str = "load";
+static char *dtnfsclient_get_str = "get";
+
+/*
+ * Name strings.
+ */
+static char *dtnfsclient_done_str = "done";
+static char *dtnfsclient_hit_str = "hit";
+static char *dtnfsclient_miss_str = "miss";
+static char *dtnfsclient_start_str = "start";
+
+static dtrace_pops_t dtnfsclient_pops = {
+ dtnfsclient_provide,
+ NULL,
+ dtnfsclient_enable,
+ dtnfsclient_disable,
+ NULL,
+ NULL,
+ dtnfsclient_getargdesc,
+ NULL,
+ NULL,
+ dtnfsclient_destroy
+};
+
+static dtrace_provider_id_t dtnfsclient_id;
+
+/*
+ * Most probes are generated from the above RPC table, but for access and
+ * attribute caches, we have specific IDs we recognize and handle specially
+ * in various spots.
+ */
+extern uint32_t nfscl_accesscache_flush_done_id;
+extern uint32_t nfscl_accesscache_get_hit_id;
+extern uint32_t nfscl_accesscache_get_miss_id;
+extern uint32_t nfscl_accesscache_load_done_id;
+
+extern uint32_t nfscl_attrcache_flush_done_id;
+extern uint32_t nfscl_attrcache_get_hit_id;
+extern uint32_t nfscl_attrcache_get_miss_id;
+extern uint32_t nfscl_attrcache_load_done_id;
+
+/*
+ * When tracing on a procedure is enabled, the DTrace ID for an RPC event is
+ * stored in one of these two NFS client-allocated arrays; 0 indicates that
+ * the event is not being traced so probes should not be called.
+ *
+ * For simplicity, we allocate both v2, v3 and v4 arrays as NFS_NPROCS + 1, and
+ * the v2, v3 arrays are simply sparse.
+ */
+extern uint32_t nfscl_nfs2_start_probes[NFS_NPROCS + 1];
+extern uint32_t nfscl_nfs2_done_probes[NFS_NPROCS + 1];
+
+extern uint32_t nfscl_nfs3_start_probes[NFS_NPROCS + 1];
+extern uint32_t nfscl_nfs3_done_probes[NFS_NPROCS + 1];
+
+extern uint32_t nfscl_nfs4_start_probes[NFS_NPROCS + 1];
+extern uint32_t nfscl_nfs4_done_probes[NFS_NPROCS + 1];
+
+/*
+ * Look up a DTrace probe ID to see if it's associated with a "done" event --
+ * if so, we will return a fourth argument type of "int".
+ */
+static int
+dtnfs234_isdoneprobe(dtrace_id_t id)
+{
+ int i;
+
+ for (i = 0; i < NFS_NPROCS + 1; i++) {
+ if (dtnfsclient_rpcs[i].nr_v4_id_done == id ||
+ dtnfsclient_rpcs[i].nr_v3_id_done == id ||
+ dtnfsclient_rpcs[i].nr_v2_id_done == id)
+ return (1);
+ }
+ return (0);
+}
+
+static void
+dtnfsclient_getargdesc(void *arg, dtrace_id_t id, void *parg,
+ dtrace_argdesc_t *desc)
+{
+ const char *p = NULL;
+
+ if (id == nfscl_accesscache_flush_done_id ||
+ id == nfscl_attrcache_flush_done_id ||
+ id == nfscl_attrcache_get_miss_id) {
+ switch (desc->dtargd_ndx) {
+ case 0:
+ p = "struct vnode *";
+ break;
+ default:
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ break;
+ }
+ } else if (id == nfscl_accesscache_get_hit_id ||
+ id == nfscl_accesscache_get_miss_id) {
+ switch (desc->dtargd_ndx) {
+ case 0:
+ p = "struct vnode *";
+ break;
+ case 1:
+ p = "uid_t";
+ break;
+ case 2:
+ p = "uint32_t";
+ break;
+ default:
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ break;
+ }
+ } else if (id == nfscl_accesscache_load_done_id) {
+ switch (desc->dtargd_ndx) {
+ case 0:
+ p = "struct vnode *";
+ break;
+ case 1:
+ p = "uid_t";
+ break;
+ case 2:
+ p = "uint32_t";
+ break;
+ case 3:
+ p = "int";
+ break;
+ default:
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ break;
+ }
+ } else if (id == nfscl_attrcache_get_hit_id) {
+ switch (desc->dtargd_ndx) {
+ case 0:
+ p = "struct vnode *";
+ break;
+ case 1:
+ p = "struct vattr *";
+ break;
+ default:
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ break;
+ }
+ } else if (id == nfscl_attrcache_load_done_id) {
+ switch (desc->dtargd_ndx) {
+ case 0:
+ p = "struct vnode *";
+ break;
+ case 1:
+ p = "struct vattr *";
+ break;
+ case 2:
+ p = "int";
+ break;
+ default:
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ break;
+ }
+ } else {
+ switch (desc->dtargd_ndx) {
+ case 0:
+ p = "struct vnode *";
+ break;
+ case 1:
+ p = "struct mbuf *";
+ break;
+ case 2:
+ p = "struct ucred *";
+ break;
+ case 3:
+ p = "int";
+ break;
+ case 4:
+ if (dtnfs234_isdoneprobe(id)) {
+ p = "int";
+ break;
+ }
+ /* FALLSTHROUGH */
+ default:
+ desc->dtargd_ndx = DTRACE_ARGNONE;
+ break;
+ }
+ }
+ if (p != NULL)
+ strlcpy(desc->dtargd_native, p, sizeof(desc->dtargd_native));
+}
+
+static void
+dtnfsclient_provide(void *arg, dtrace_probedesc_t *desc)
+{
+ int i;
+
+ if (desc != NULL)
+ return;
+
+ /*
+ * Register access cache probes.
+ */
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_flush_str, dtnfsclient_done_str) == 0) {
+ nfscl_accesscache_flush_done_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_flush_str, dtnfsclient_done_str, 0, NULL);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_get_str, dtnfsclient_hit_str) == 0) {
+ nfscl_accesscache_get_hit_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_get_str, dtnfsclient_hit_str, 0, NULL);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_get_str, dtnfsclient_miss_str) == 0) {
+ nfscl_accesscache_get_miss_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_get_str, dtnfsclient_miss_str, 0, NULL);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_load_str, dtnfsclient_done_str) == 0) {
+ nfscl_accesscache_load_done_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_accesscache_str,
+ dtnfsclient_load_str, dtnfsclient_done_str, 0, NULL);
+ }
+
+ /*
+ * Register attribute cache probes.
+ */
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_flush_str, dtnfsclient_done_str) == 0) {
+ nfscl_attrcache_flush_done_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_flush_str, dtnfsclient_done_str, 0, NULL);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_get_str, dtnfsclient_hit_str) == 0) {
+ nfscl_attrcache_get_hit_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_get_str, dtnfsclient_hit_str, 0, NULL);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_get_str, dtnfsclient_miss_str) == 0) {
+ nfscl_attrcache_get_miss_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_get_str, dtnfsclient_miss_str, 0, NULL);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_load_str, dtnfsclient_done_str) == 0) {
+ nfscl_attrcache_load_done_id = dtrace_probe_create(
+ dtnfsclient_id, dtnfsclient_attrcache_str,
+ dtnfsclient_load_str, dtnfsclient_done_str, 0, NULL);
+ }
+
+ /*
+ * Register NFSv2 RPC procedures; note sparseness check for each slot
+ * in the NFSv3, NFSv4 procnum-indexed array.
+ */
+ for (i = 0; i < NFS_NPROCS + 1; i++) {
+ if (dtnfsclient_rpcs[i].nr_v2_name != NULL &&
+ dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_nfs2_str,
+ dtnfsclient_rpcs[i].nr_v2_name, dtnfsclient_start_str) ==
+ 0) {
+ dtnfsclient_rpcs[i].nr_v2_id_start =
+ dtrace_probe_create(dtnfsclient_id,
+ dtnfsclient_nfs2_str,
+ dtnfsclient_rpcs[i].nr_v2_name,
+ dtnfsclient_start_str, 0,
+ &nfscl_nfs2_start_probes[i]);
+ }
+ if (dtnfsclient_rpcs[i].nr_v2_name != NULL &&
+ dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_nfs2_str,
+ dtnfsclient_rpcs[i].nr_v2_name, dtnfsclient_done_str) ==
+ 0) {
+ dtnfsclient_rpcs[i].nr_v2_id_done =
+ dtrace_probe_create(dtnfsclient_id,
+ dtnfsclient_nfs2_str,
+ dtnfsclient_rpcs[i].nr_v2_name,
+ dtnfsclient_done_str, 0,
+ &nfscl_nfs2_done_probes[i]);
+ }
+ }
+
+ /*
+ * Register NFSv3 RPC procedures; note sparseness check for each slot
+ * in the NFSv4 procnum-indexed array.
+ */
+ for (i = 0; i < NFS_NPROCS + 1; i++) {
+ if (dtnfsclient_rpcs[i].nr_v3_name != NULL &&
+ dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_nfs3_str,
+ dtnfsclient_rpcs[i].nr_v3_name, dtnfsclient_start_str) ==
+ 0) {
+ dtnfsclient_rpcs[i].nr_v3_id_start =
+ dtrace_probe_create(dtnfsclient_id,
+ dtnfsclient_nfs3_str,
+ dtnfsclient_rpcs[i].nr_v3_name,
+ dtnfsclient_start_str, 0,
+ &nfscl_nfs3_start_probes[i]);
+ }
+ if (dtnfsclient_rpcs[i].nr_v3_name != NULL &&
+ dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_nfs3_str,
+ dtnfsclient_rpcs[i].nr_v3_name, dtnfsclient_done_str) ==
+ 0) {
+ dtnfsclient_rpcs[i].nr_v3_id_done =
+ dtrace_probe_create(dtnfsclient_id,
+ dtnfsclient_nfs3_str,
+ dtnfsclient_rpcs[i].nr_v3_name,
+ dtnfsclient_done_str, 0,
+ &nfscl_nfs3_done_probes[i]);
+ }
+ }
+
+ /*
+ * Register NFSv4 RPC procedures.
+ */
+ for (i = 0; i < NFS_NPROCS + 1; i++) {
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_nfs4_str,
+ dtnfsclient_rpcs[i].nr_v4_name, dtnfsclient_start_str) ==
+ 0) {
+ dtnfsclient_rpcs[i].nr_v4_id_start =
+ dtrace_probe_create(dtnfsclient_id,
+ dtnfsclient_nfs4_str,
+ dtnfsclient_rpcs[i].nr_v4_name,
+ dtnfsclient_start_str, 0,
+ &nfscl_nfs4_start_probes[i]);
+ }
+ if (dtrace_probe_lookup(dtnfsclient_id, dtnfsclient_nfs4_str,
+ dtnfsclient_rpcs[i].nr_v4_name, dtnfsclient_done_str) ==
+ 0) {
+ dtnfsclient_rpcs[i].nr_v4_id_done =
+ dtrace_probe_create(dtnfsclient_id,
+ dtnfsclient_nfs4_str,
+ dtnfsclient_rpcs[i].nr_v4_name,
+ dtnfsclient_done_str, 0,
+ &nfscl_nfs4_done_probes[i]);
+ }
+ }
+}
+
+static void
+dtnfsclient_destroy(void *arg, dtrace_id_t id, void *parg)
+{
+}
+
+static void
+dtnfsclient_enable(void *arg, dtrace_id_t id, void *parg)
+{
+ uint32_t *p = parg;
+ void *f = dtrace_probe;
+
+ if (id == nfscl_accesscache_flush_done_id)
+ dtrace_nfscl_accesscache_flush_done_probe = f;
+ else if (id == nfscl_accesscache_get_hit_id)
+ dtrace_nfscl_accesscache_get_hit_probe = f;
+ else if (id == nfscl_accesscache_get_miss_id)
+ dtrace_nfscl_accesscache_get_miss_probe = f;
+ else if (id == nfscl_accesscache_load_done_id)
+ dtrace_nfscl_accesscache_load_done_probe = f;
+ else if (id == nfscl_attrcache_flush_done_id)
+ dtrace_nfscl_attrcache_flush_done_probe = f;
+ else if (id == nfscl_attrcache_get_hit_id)
+ dtrace_nfscl_attrcache_get_hit_probe = f;
+ else if (id == nfscl_attrcache_get_miss_id)
+ dtrace_nfscl_attrcache_get_miss_probe = f;
+ else if (id == nfscl_attrcache_load_done_id)
+ dtrace_nfscl_attrcache_load_done_probe = f;
+ else
+ *p = id;
+}
+
+static void
+dtnfsclient_disable(void *arg, dtrace_id_t id, void *parg)
+{
+ uint32_t *p = parg;
+
+ if (id == nfscl_accesscache_flush_done_id)
+ dtrace_nfscl_accesscache_flush_done_probe = NULL;
+ else if (id == nfscl_accesscache_get_hit_id)
+ dtrace_nfscl_accesscache_get_hit_probe = NULL;
+ else if (id == nfscl_accesscache_get_miss_id)
+ dtrace_nfscl_accesscache_get_miss_probe = NULL;
+ else if (id == nfscl_accesscache_load_done_id)
+ dtrace_nfscl_accesscache_load_done_probe = NULL;
+ else if (id == nfscl_attrcache_flush_done_id)
+ dtrace_nfscl_attrcache_flush_done_probe = NULL;
+ else if (id == nfscl_attrcache_get_hit_id)
+ dtrace_nfscl_attrcache_get_hit_probe = NULL;
+ else if (id == nfscl_attrcache_get_miss_id)
+ dtrace_nfscl_attrcache_get_miss_probe = NULL;
+ else if (id == nfscl_attrcache_load_done_id)
+ dtrace_nfscl_attrcache_load_done_probe = NULL;
+ else
+ *p = 0;
+}
+
+static void
+dtnfsclient_load(void *dummy)
+{
+
+ if (dtrace_register("nfscl", &dtnfsclient_attr,
+ DTRACE_PRIV_USER, NULL, &dtnfsclient_pops, NULL,
+ &dtnfsclient_id) != 0)
+ return;
+
+ dtrace_nfscl_nfs234_start_probe =
+ (dtrace_nfsclient_nfs23_start_probe_func_t)dtrace_probe;
+ dtrace_nfscl_nfs234_done_probe =
+ (dtrace_nfsclient_nfs23_done_probe_func_t)dtrace_probe;
+}
+
+
+static int
+dtnfsclient_unload()
+{
+
+ dtrace_nfscl_nfs234_start_probe = NULL;
+ dtrace_nfscl_nfs234_done_probe = NULL;
+
+ return (dtrace_unregister(dtnfsclient_id));
+}
+
+static int
+dtnfsclient_modevent(module_t mod __unused, int type, void *data __unused)
+{
+ int error = 0;
+
+ switch (type) {
+ case MOD_LOAD:
+ break;
+
+ case MOD_UNLOAD:
+ break;
+
+ case MOD_SHUTDOWN:
+ break;
+
+ default:
+ error = EOPNOTSUPP;
+ break;
+ }
+
+ return (error);
+}
+
+SYSINIT(dtnfsclient_load, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY,
+ dtnfsclient_load, NULL);
+SYSUNINIT(dtnfsclient_unload, SI_SUB_DTRACE_PROVIDER, SI_ORDER_ANY,
+ dtnfsclient_unload, NULL);
+
+DEV_MODULE(dtnfscl, dtnfsclient_modevent, NULL);
+MODULE_VERSION(dtnfscl, 1);
+MODULE_DEPEND(dtnfscl, dtrace, 1, 1, 1);
+MODULE_DEPEND(dtnfscl, opensolaris, 1, 1, 1);
+MODULE_DEPEND(dtnfscl, nfscl, 1, 1, 1);
+MODULE_DEPEND(dtnfscl, nfscommon, 1, 1, 1);
diff --git a/sys/fs/nfsclient/nfs_clkrpc.c b/sys/fs/nfsclient/nfs_clkrpc.c
index c4f7e94..0cd41b3 100644
--- a/sys/fs/nfsclient/nfs_clkrpc.c
+++ b/sys/fs/nfsclient/nfs_clkrpc.c
@@ -215,12 +215,9 @@ nfscbd_addsock(struct file *fp)
int
nfscbd_nfsd(struct thread *td, struct nfsd_nfscbd_args *args)
{
-#ifdef KGSSAPI
char principal[128];
int error;
-#endif
-#ifdef KGSSAPI
if (args != NULL) {
error = copyinstr(args->principal, principal,
sizeof(principal), NULL);
@@ -229,7 +226,6 @@ nfscbd_nfsd(struct thread *td, struct nfsd_nfscbd_args *args)
} else {
principal[0] = '\0';
}
-#endif
/*
* Only the first nfsd actually does any work. The RPC code
@@ -244,20 +240,16 @@ nfscbd_nfsd(struct thread *td, struct nfsd_nfscbd_args *args)
NFSD_UNLOCK();
-#ifdef KGSSAPI
if (principal[0] != '\0')
- rpc_gss_set_svc_name(principal, "kerberosv5",
+ rpc_gss_set_svc_name_call(principal, "kerberosv5",
GSS_C_INDEFINITE, NFS_CALLBCKPROG, NFSV4_CBVERS);
-#endif
nfscbd_pool->sp_minthreads = 4;
nfscbd_pool->sp_maxthreads = 4;
svc_run(nfscbd_pool);
-#ifdef KGSSAPI
- rpc_gss_clear_svc_name(NFS_CALLBCKPROG, NFSV4_CBVERS);
-#endif
+ rpc_gss_clear_svc_name_call(NFS_CALLBCKPROG, NFSV4_CBVERS);
NFSD_LOCK();
nfs_numnfscbd--;
diff --git a/sys/fs/nfsclient/nfs_clnode.c b/sys/fs/nfsclient/nfs_clnode.c
index d4d652e..d15de6e 100644
--- a/sys/fs/nfsclient/nfs_clnode.c
+++ b/sys/fs/nfsclient/nfs_clnode.c
@@ -35,6 +35,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_kdtrace.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/fcntl.h>
@@ -53,6 +55,7 @@ __FBSDID("$FreeBSD$");
#include <fs/nfsclient/nfsnode.h>
#include <fs/nfsclient/nfsmount.h>
#include <fs/nfsclient/nfs.h>
+#include <fs/nfsclient/nfs_kdtrace.h>
#include <nfs/nfs_lock.h>
@@ -300,7 +303,9 @@ ncl_invalcaches(struct vnode *vp)
mtx_lock(&np->n_mtx);
for (i = 0; i < NFS_ACCESSCACHESIZE; i++)
np->n_accesscache[i].stamp = 0;
+ KDTRACE_NFS_ACCESSCACHE_FLUSH_DONE(vp);
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
mtx_unlock(&np->n_mtx);
}
diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c
index 4d88bd2..44d3c74 100644
--- a/sys/fs/nfsclient/nfs_clport.c
+++ b/sys/fs/nfsclient/nfs_clport.c
@@ -34,6 +34,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_kdtrace.h"
+
/*
* generally, I don't like #includes inside .h files, but it seems to
* be the easiest way to handle the port.
@@ -43,6 +45,26 @@ __FBSDID("$FreeBSD$");
#include <netinet/if_ether.h>
#include <net/if_types.h>
+#include <fs/nfsclient/nfs_kdtrace.h>
+
+#ifdef KDTRACE_HOOKS
+dtrace_nfsclient_attrcache_flush_probe_func_t
+ dtrace_nfscl_attrcache_flush_done_probe;
+uint32_t nfscl_attrcache_flush_done_id;
+
+dtrace_nfsclient_attrcache_get_hit_probe_func_t
+ dtrace_nfscl_attrcache_get_hit_probe;
+uint32_t nfscl_attrcache_get_hit_id;
+
+dtrace_nfsclient_attrcache_get_miss_probe_func_t
+ dtrace_nfscl_attrcache_get_miss_probe;
+uint32_t nfscl_attrcache_get_miss_id;
+
+dtrace_nfsclient_attrcache_load_probe_func_t
+ dtrace_nfscl_attrcache_load_done_probe;
+uint32_t nfscl_attrcache_load_done_id;
+#endif /* !KDTRACE_HOOKS */
+
extern u_int32_t newnfs_true, newnfs_false, newnfs_xdrneg1;
extern struct vop_vector newnfs_vnodeops;
extern struct vop_vector newnfs_fifoops;
@@ -105,7 +127,7 @@ nfscl_nget(struct mount *mntp, struct vnode *dvp, struct nfsfh *nfhp,
if (error == 0 && nvp != NULL) {
/*
* I believe there is a slight chance that vgonel() could
- * get called on this vnode between when vn_lock() drops
+ * get called on this vnode between when NFSVOPLOCK() drops
* the VI_LOCK() and vget() acquires it again, so that it
* hasn't yet had v_usecount incremented. If this were to
* happen, the VI_DOOMED flag would be set, so check for
@@ -295,7 +317,7 @@ nfscl_ngetreopen(struct mount *mntp, u_int8_t *fhp, int fhsize,
error = vfs_hash_get(mntp, hash, (LK_EXCLUSIVE | LK_NOWAIT), td, &nvp,
newnfs_vncmpf, nfhp);
if (error == 0 && nvp != NULL) {
- VOP_UNLOCK(nvp, 0);
+ NFSVOPUNLOCK(nvp, 0);
} else if (error == EBUSY) {
/*
* The LK_EXCLOTHER lock type tells nfs_lock1() to not try
@@ -366,6 +388,7 @@ nfscl_loadattrcache(struct vnode **vpp, struct nfsvattr *nap, void *nvaper,
np->n_vattr.na_mtime = nap->na_mtime;
np->n_vattr.na_ctime = nap->na_ctime;
np->n_vattr.na_fsid = nap->na_fsid;
+ np->n_vattr.na_mode = nap->na_mode;
} else {
NFSBCOPY((caddr_t)nap, (caddr_t)&np->n_vattr,
sizeof (struct nfsvattr));
@@ -407,6 +430,7 @@ nfscl_loadattrcache(struct vnode **vpp, struct nfsvattr *nap, void *nvaper,
*/
vap->va_size = np->n_size;
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
} else if (np->n_flag & NMODIFIED) {
/*
* We've modified the file: Use the larger
@@ -439,9 +463,11 @@ nfscl_loadattrcache(struct vnode **vpp, struct nfsvattr *nap, void *nvaper,
* We detect this by for the mtime moving back. We invalidate the
* attrcache when this happens.
*/
- if (timespeccmp(&mtime_save, &vap->va_mtime, >))
+ if (timespeccmp(&mtime_save, &vap->va_mtime, >)) {
/* Size changed or mtime went backwards */
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
+ }
if (vaper != NULL) {
NFSBCOPY((caddr_t)vap, (caddr_t)vaper, sizeof(*vap));
if (np->n_flag & NCHG) {
@@ -451,6 +477,10 @@ nfscl_loadattrcache(struct vnode **vpp, struct nfsvattr *nap, void *nvaper,
vaper->va_mtime = np->n_mtim;
}
}
+#ifdef KDTRACE_HOOKS
+ if (np->n_attrstamp != 0)
+ KDTRACE_NFS_ATTRCACHE_LOAD_DONE(vp, vap, 0);
+#endif
NFSUNLOCKNODE(np);
return (0);
}
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index 5d83d0b..b88f7b8 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -585,7 +585,7 @@ APPLESTATIC void
nfsrpc_doclose(struct nfsmount *nmp, struct nfsclopen *op, NFSPROC_T *p)
{
struct nfsrv_descript nfsd, *nd = &nfsd;
- struct nfscllockowner *lp;
+ struct nfscllockowner *lp, *nlp;
struct nfscllock *lop, *nlop;
struct ucred *tcred;
u_int64_t off = 0, len = 0;
@@ -642,6 +642,14 @@ nfsrpc_doclose(struct nfsmount *nmp, struct nfsclopen *op, NFSPROC_T *p)
}
nfscl_freelock(lop, 0);
}
+ /*
+ * Do a ReleaseLockOwner.
+ * The lock owner name nfsl_owner may be used by other opens for
+ * other files but the lock_owner4 name that nfsrpc_rellockown()
+ * puts on the wire has the file handle for this file appended
+ * to it, so it can be done now.
+ */
+ (void)nfsrpc_rellockown(nmp, lp, tcred, p);
}
/*
@@ -659,20 +667,8 @@ nfsrpc_doclose(struct nfsmount *nmp, struct nfsclopen *op, NFSPROC_T *p)
NFSLOCKCLSTATE();
nfscl_lockunlock(&op->nfso_own->nfsow_rwlock);
- /*
- * Move the lockowner to nfsc_defunctlockowner,
- * so the Renew thread will do the ReleaseLockOwner
- * Op on it later. There might still be other
- * opens using the same lockowner name.
- */
- lp = LIST_FIRST(&op->nfso_lock);
- if (lp != NULL) {
- while (LIST_NEXT(lp, nfsl_list) != NULL)
- lp = LIST_NEXT(lp, nfsl_list);
- LIST_PREPEND(&nmp->nm_clp->nfsc_defunctlockowner,
- &op->nfso_lock, lp, nfsl_list);
- LIST_INIT(&op->nfso_lock);
- }
+ LIST_FOREACH_SAFE(lp, &op->nfso_lock, nfsl_list, nlp)
+ nfscl_freelockowner(lp, 0);
nfscl_freeopen(op, 0);
NFSUNLOCKCLSTATE();
NFSFREECRED(tcred);
@@ -1527,8 +1523,8 @@ nfsrpc_writerpc(vnode_t vp, struct uio *uiop, int *iomode,
* deadlock, is that the upcall times out and allows
* the write to complete. However, progress is so slow
* that it might just as well be deadlocked.
- * So, we just get the attributes that change with each
- * write Op.
+ * As such, we get the rest of the attributes, but not
+ * Owner or Owner_group.
* nb: nfscl_loadattrcache() needs to be told that these
* partial attributes from a write rpc are being
* passed in, via a argument flag.
@@ -3629,7 +3625,8 @@ nfsrpc_lockt(struct nfsrv_descript *nd, vnode_t vp,
{
u_int32_t *tl;
int error, type, size;
- u_int8_t own[NFSV4CL_LOCKNAMELEN];
+ uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
+ struct nfsnode *np;
NFSCL_REQSTART(nd, NFSPROC_LOCKT, vp);
NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
@@ -3644,7 +3641,10 @@ nfsrpc_lockt(struct nfsrv_descript *nd, vnode_t vp,
*tl++ = clp->nfsc_clientid.lval[0];
*tl = clp->nfsc_clientid.lval[1];
nfscl_filllockowner(id, own, flags);
- (void) nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN);
+ np = VTONFS(vp);
+ NFSBCOPY(np->n_fhp->nfh_fh, &own[NFSV4CL_LOCKNAMELEN],
+ np->n_fhp->nfh_len);
+ (void)nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN + np->n_fhp->nfh_len);
error = nfscl_request(nd, vp, p, cred, NULL);
if (error)
return (error);
@@ -3744,6 +3744,7 @@ nfsrpc_lock(struct nfsrv_descript *nd, struct nfsmount *nmp, vnode_t vp,
{
u_int32_t *tl;
int error, size;
+ uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
nfscl_reqstart(nd, NFSPROC_LOCK, nmp, nfhp, fhlen, NULL);
NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
@@ -3768,7 +3769,9 @@ nfsrpc_lock(struct nfsrv_descript *nd, struct nfsmount *nmp, vnode_t vp,
*tl++ = txdr_unsigned(lp->nfsl_seqid);
*tl++ = lp->nfsl_open->nfso_own->nfsow_clp->nfsc_clientid.lval[0];
*tl = lp->nfsl_open->nfso_own->nfsow_clp->nfsc_clientid.lval[1];
- (void) nfsm_strtom(nd, lp->nfsl_owner, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(lp->nfsl_owner, own, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(nfhp, &own[NFSV4CL_LOCKNAMELEN], fhlen);
+ (void)nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN + fhlen);
} else {
*tl = newnfs_false;
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + NFSX_UNSIGNED);
@@ -4029,12 +4032,17 @@ nfsrpc_rellockown(struct nfsmount *nmp, struct nfscllockowner *lp,
struct nfsrv_descript nfsd, *nd = &nfsd;
u_int32_t *tl;
int error;
+ uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
nfscl_reqstart(nd, NFSPROC_RELEASELCKOWN, nmp, NULL, 0, NULL);
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
*tl++ = nmp->nm_clp->nfsc_clientid.lval[0];
*tl = nmp->nm_clp->nfsc_clientid.lval[1];
- (void) nfsm_strtom(nd, lp->nfsl_owner, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(lp->nfsl_owner, own, NFSV4CL_LOCKNAMELEN);
+ NFSBCOPY(lp->nfsl_open->nfso_fh, &own[NFSV4CL_LOCKNAMELEN],
+ lp->nfsl_open->nfso_fhlen);
+ (void)nfsm_strtom(nd, own, NFSV4CL_LOCKNAMELEN +
+ lp->nfsl_open->nfso_fhlen);
nd->nd_flag |= ND_USEGSSNAME;
error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred,
NFS_PROG, NFS_VER4, NULL, 1, NULL);
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index aa81437..7ce2b8e 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -95,7 +95,7 @@ int nfscl_deleghighwater = NFSCLDELEGHIGHWATER;
static int nfscl_delegcnt = 0;
static int nfscl_getopen(struct nfsclownerhead *, u_int8_t *, int, u_int8_t *,
- NFSPROC_T *, u_int32_t, struct nfsclowner **, struct nfsclopen **);
+ u_int8_t *, u_int32_t, struct nfscllockowner **, struct nfsclopen **);
static void nfscl_clrelease(struct nfsclclient *);
static void nfscl_cleanclient(struct nfsclclient *);
static void nfscl_expireclient(struct nfsclclient *, struct nfsmount *,
@@ -114,7 +114,6 @@ static struct nfscldeleg *nfscl_finddeleg(struct nfsclclient *, u_int8_t *,
int);
static int nfscl_checkconflict(struct nfscllockownerhead *, struct nfscllock *,
u_int8_t *, struct nfscllock **);
-static void nfscl_freelockowner(struct nfscllockowner *, int);
static void nfscl_freealllocks(struct nfscllockownerhead *, int);
static int nfscl_localconflict(struct nfsclclient *, u_int8_t *, int,
struct nfscllock *, u_int8_t *, struct nfscldeleg *, struct nfscllock **);
@@ -522,25 +521,20 @@ nfscl_getstateid(vnode_t vp, u_int8_t *nfhp, int fhlen, u_int32_t mode,
* for a matching OpenOwner and use that.
*/
nfscl_filllockowner(p->td_proc, own, F_POSIX);
- error = nfscl_getopen(&clp->nfsc_owner, nfhp, fhlen, NULL, p,
- mode, NULL, &op);
- if (error == 0) {
- /* now look for a lockowner */
- LIST_FOREACH(lp, &op->nfso_lock, nfsl_list) {
- if (!NFSBCMP(lp->nfsl_owner, own,
- NFSV4CL_LOCKNAMELEN)) {
- stateidp->seqid =
- lp->nfsl_stateid.seqid;
- stateidp->other[0] =
- lp->nfsl_stateid.other[0];
- stateidp->other[1] =
- lp->nfsl_stateid.other[1];
- stateidp->other[2] =
- lp->nfsl_stateid.other[2];
- NFSUNLOCKCLSTATE();
- return (0);
- }
- }
+ lp = NULL;
+ error = nfscl_getopen(&clp->nfsc_owner, nfhp, fhlen, own, own,
+ mode, &lp, &op);
+ if (error == 0 && lp != NULL) {
+ stateidp->seqid =
+ lp->nfsl_stateid.seqid;
+ stateidp->other[0] =
+ lp->nfsl_stateid.other[0];
+ stateidp->other[1] =
+ lp->nfsl_stateid.other[1];
+ stateidp->other[2] =
+ lp->nfsl_stateid.other[2];
+ NFSUNLOCKCLSTATE();
+ return (0);
}
}
if (op == NULL) {
@@ -579,55 +573,74 @@ nfscl_getstateid(vnode_t vp, u_int8_t *nfhp, int fhlen, u_int32_t mode,
}
/*
- * Get an existing open. Search up the parentage tree for a match and
- * return with the first one found.
+ * Search for a matching file, mode and, optionally, lockowner.
*/
static int
nfscl_getopen(struct nfsclownerhead *ohp, u_int8_t *nfhp, int fhlen,
- u_int8_t *rown, NFSPROC_T *p, u_int32_t mode, struct nfsclowner **owpp,
- struct nfsclopen **opp)
+ u_int8_t *openown, u_int8_t *lockown, u_int32_t mode,
+ struct nfscllockowner **lpp, struct nfsclopen **opp)
{
- struct nfsclowner *owp = NULL;
- struct nfsclopen *op;
- NFSPROC_T *nproc;
- u_int8_t own[NFSV4CL_LOCKNAMELEN], *ownp;
+ struct nfsclowner *owp;
+ struct nfsclopen *op, *rop, *rop2;
+ struct nfscllockowner *lp;
+ int keep_looping;
- nproc = p;
- op = NULL;
- while (op == NULL && (nproc != NULL || rown != NULL)) {
- if (nproc != NULL) {
- nfscl_filllockowner(nproc->td_proc, own, F_POSIX);
- ownp = own;
- } else {
- ownp = rown;
- }
- /* Search the client list */
- LIST_FOREACH(owp, ohp, nfsow_list) {
- if (!NFSBCMP(owp->nfsow_owner, ownp,
- NFSV4CL_LOCKNAMELEN))
- break;
- }
- if (owp != NULL) {
- /* and look for the correct open */
- LIST_FOREACH(op, &owp->nfsow_open, nfso_list) {
- if (op->nfso_fhlen == fhlen &&
- !NFSBCMP(op->nfso_fh, nfhp, fhlen)
- && (op->nfso_mode & mode) == mode) {
- break;
+ if (lpp != NULL)
+ *lpp = NULL;
+ /*
+ * rop will be set to the open to be returned. There are three
+ * variants of this, all for an open of the correct file:
+ * 1 - A match of lockown.
+ * 2 - A match of the openown, when no lockown match exists.
+ * 3 - A match for any open, if no openown or lockown match exists.
+ * Looking for #2 over #3 probably isn't necessary, but since
+ * RFC3530 is vague w.r.t. the relationship between openowners and
+ * lockowners, I think this is the safer way to go.
+ */
+ rop = NULL;
+ rop2 = NULL;
+ keep_looping = 1;
+ /* Search the client list */
+ owp = LIST_FIRST(ohp);
+ while (owp != NULL && keep_looping != 0) {
+ /* and look for the correct open */
+ op = LIST_FIRST(&owp->nfsow_open);
+ while (op != NULL && keep_looping != 0) {
+ if (op->nfso_fhlen == fhlen &&
+ !NFSBCMP(op->nfso_fh, nfhp, fhlen)
+ && (op->nfso_mode & mode) == mode) {
+ if (lpp != NULL) {
+ /* Now look for a matching lockowner. */
+ LIST_FOREACH(lp, &op->nfso_lock,
+ nfsl_list) {
+ if (!NFSBCMP(lp->nfsl_owner,
+ lockown,
+ NFSV4CL_LOCKNAMELEN)) {
+ *lpp = lp;
+ rop = op;
+ keep_looping = 0;
+ break;
+ }
+ }
+ }
+ if (rop == NULL && !NFSBCMP(owp->nfsow_owner,
+ openown, NFSV4CL_LOCKNAMELEN)) {
+ rop = op;
+ if (lpp == NULL)
+ keep_looping = 0;
}
+ if (rop2 == NULL)
+ rop2 = op;
}
+ op = LIST_NEXT(op, nfso_list);
}
- if (rown != NULL)
- break;
- if (op == NULL)
- nproc = nfscl_getparent(nproc);
+ owp = LIST_NEXT(owp, nfsow_list);
}
- if (op == NULL) {
+ if (rop == NULL)
+ rop = rop2;
+ if (rop == NULL)
return (EBADF);
- }
- if (owpp)
- *owpp = owp;
- *opp = op;
+ *opp = rop;
return (0);
}
@@ -748,7 +761,8 @@ nfscl_getcl(vnode_t vp, struct ucred *cred, NFSPROC_T *p,
FREE((caddr_t)newclp, M_NFSCLCLIENT);
}
NFSLOCKCLSTATE();
- while ((clp->nfsc_flags & NFSCLFLAGS_HASCLIENTID) == 0 && !igotlock)
+ while ((clp->nfsc_flags & NFSCLFLAGS_HASCLIENTID) == 0 && !igotlock &&
+ (mp->mnt_kern_flag & MNTK_UNMOUNTF) == 0)
igotlock = nfsv4_lock(&clp->nfsc_lock, 1, NULL,
NFSCLSTATEMUTEXPTR, mp);
if (!igotlock)
@@ -892,16 +906,16 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
struct nfscldeleg *dp = NULL, *ldp = NULL;
struct nfscllockownerhead *lhp = NULL;
struct nfsnode *np;
- u_int8_t own[NFSV4CL_LOCKNAMELEN], *ownp;
+ u_int8_t own[NFSV4CL_LOCKNAMELEN], *ownp, openown[NFSV4CL_LOCKNAMELEN];
+ u_int8_t *openownp;
int error = 0, ret, donelocally = 0;
u_int32_t mode;
- if (type == F_WRLCK)
- mode = NFSV4OPEN_ACCESSWRITE;
- else
- mode = NFSV4OPEN_ACCESSREAD;
+ /* For Lock Ops, the open mode doesn't matter, so use 0 to match any. */
+ mode = 0;
np = VTONFS(vp);
*lpp = NULL;
+ lp = NULL;
*newonep = 0;
*donelocallyp = 0;
@@ -941,9 +955,12 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
op = NULL;
if (recovery) {
ownp = rownp;
+ openownp = ropenownp;
} else {
nfscl_filllockowner(id, own, flags);
ownp = own;
+ nfscl_filllockowner(p->td_proc, openown, F_POSIX);
+ openownp = openown;
}
if (!recovery) {
NFSLOCKCLSTATE();
@@ -962,13 +979,13 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
dp = NULL;
}
if (dp != NULL) {
- /* Now, find the associated open to get the correct openowner */
+ /* Now, find an open and maybe a lockowner. */
ret = nfscl_getopen(&dp->nfsdl_owner, np->n_fhp->nfh_fh,
- np->n_fhp->nfh_len, NULL, p, mode, NULL, &op);
+ np->n_fhp->nfh_len, openownp, ownp, mode, NULL, &op);
if (ret)
ret = nfscl_getopen(&clp->nfsc_owner,
- np->n_fhp->nfh_fh, np->n_fhp->nfh_len, NULL, p,
- mode, NULL, &op);
+ np->n_fhp->nfh_fh, np->n_fhp->nfh_len, openownp,
+ ownp, mode, NULL, &op);
if (!ret) {
lhp = &dp->nfsdl_lock;
TAILQ_REMOVE(&clp->nfsc_deleg, dp, nfsdl_list);
@@ -981,16 +998,11 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
}
if (!donelocally) {
/*
- * Get the related Open.
+ * Get the related Open and maybe lockowner.
*/
- if (recovery)
- error = nfscl_getopen(&clp->nfsc_owner,
- np->n_fhp->nfh_fh, np->n_fhp->nfh_len, ropenownp,
- NULL, mode, NULL, &op);
- else
- error = nfscl_getopen(&clp->nfsc_owner,
- np->n_fhp->nfh_fh, np->n_fhp->nfh_len, NULL, p,
- mode, NULL, &op);
+ error = nfscl_getopen(&clp->nfsc_owner,
+ np->n_fhp->nfh_fh, np->n_fhp->nfh_len, openownp,
+ ownp, mode, &lp, &op);
if (!error)
lhp = &op->nfso_lock;
}
@@ -1011,10 +1023,11 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len,
/*
* Ok, see if a lockowner exists and create one, as required.
*/
- LIST_FOREACH(lp, lhp, nfsl_list) {
- if (!NFSBCMP(lp->nfsl_owner, ownp, NFSV4CL_LOCKNAMELEN))
- break;
- }
+ if (lp == NULL)
+ LIST_FOREACH(lp, lhp, nfsl_list) {
+ if (!NFSBCMP(lp->nfsl_owner, ownp, NFSV4CL_LOCKNAMELEN))
+ break;
+ }
if (lp == NULL) {
NFSBCOPY(ownp, nlp->nfsl_owner, NFSV4CL_LOCKNAMELEN);
if (recovery)
@@ -1450,7 +1463,7 @@ nfscl_freeopenowner(struct nfsclowner *owp, int local)
/*
* Free up a byte range lock owner structure.
*/
-static void
+APPLESTATIC void
nfscl_freelockowner(struct nfscllockowner *lp, int local)
{
struct nfscllock *lop, *nlop;
diff --git a/sys/fs/nfsclient/nfs_clsubs.c b/sys/fs/nfsclient/nfs_clsubs.c
index 0c05631..f64cf2d 100644
--- a/sys/fs/nfsclient/nfs_clsubs.c
+++ b/sys/fs/nfsclient/nfs_clsubs.c
@@ -35,6 +35,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_kdtrace.h"
+
/*
* These functions support the macros and help fiddle mbuf chains for
* the nfs op functions. They do things like create the rpc header and
@@ -68,6 +70,7 @@ __FBSDID("$FreeBSD$");
#include <fs/nfsclient/nfsnode.h>
#include <fs/nfsclient/nfsmount.h>
#include <fs/nfsclient/nfs.h>
+#include <fs/nfsclient/nfs_kdtrace.h>
#include <netinet/in.h>
@@ -140,12 +143,12 @@ ncl_upgrade_vnlock(struct vnode *vp)
int old_lock;
ASSERT_VOP_LOCKED(vp, "ncl_upgrade_vnlock");
- old_lock = VOP_ISLOCKED(vp);
+ old_lock = NFSVOPISLOCKED(vp);
if (old_lock != LK_EXCLUSIVE) {
KASSERT(old_lock == LK_SHARED,
("ncl_upgrade_vnlock: wrong old_lock %d", old_lock));
/* Upgrade to exclusive lock, this might block */
- vn_lock(vp, LK_UPGRADE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_UPGRADE | LK_RETRY);
}
return (old_lock);
}
@@ -156,7 +159,7 @@ ncl_downgrade_vnlock(struct vnode *vp, int old_lock)
if (old_lock != LK_EXCLUSIVE) {
KASSERT(old_lock == LK_SHARED, ("wrong old_lock %d", old_lock));
/* Downgrade from exclusive lock. */
- vn_lock(vp, LK_DOWNGRADE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_DOWNGRADE | LK_RETRY);
}
}
@@ -238,6 +241,7 @@ ncl_getattrcache(struct vnode *vp, struct vattr *vaper)
#ifdef NFS_ACDEBUG
mtx_unlock(&Giant); /* ncl_printf() */
#endif
+ KDTRACE_NFS_ATTRCACHE_GET_MISS(vp);
return( ENOENT);
}
newnfsstats.attrcache_hits++;
@@ -267,6 +271,7 @@ ncl_getattrcache(struct vnode *vp, struct vattr *vaper)
#ifdef NFS_ACDEBUG
mtx_unlock(&Giant); /* ncl_printf() */
#endif
+ KDTRACE_NFS_ATTRCACHE_GET_HIT(vp, vap);
return (0);
}
diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c
index d962a54..3339428 100644
--- a/sys/fs/nfsclient/nfs_clvfsops.c
+++ b/sys/fs/nfsclient/nfs_clvfsops.c
@@ -1344,7 +1344,7 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
/*
* Lose the lock but keep the ref.
*/
- VOP_UNLOCK(*vpp, 0);
+ NFSVOPUNLOCK(*vpp, 0);
return (0);
}
error = EIO;
@@ -1477,7 +1477,7 @@ loop:
VI_LOCK(vp);
MNT_IUNLOCK(mp);
/* XXX Racy bv_cnt check. */
- if (VOP_ISLOCKED(vp) || vp->v_bufobj.bo_dirty.bv_cnt == 0 ||
+ if (NFSVOPISLOCKED(vp) || vp->v_bufobj.bo_dirty.bv_cnt == 0 ||
waitfor == MNT_LAZY) {
VI_UNLOCK(vp);
MNT_ILOCK(mp);
@@ -1491,7 +1491,7 @@ loop:
error = VOP_FSYNC(vp, waitfor, td);
if (error)
allerror = error;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vrele(vp);
MNT_ILOCK(mp);
diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c
index 3e1c66d..a69c76e 100644
--- a/sys/fs/nfsclient/nfs_clvnops.c
+++ b/sys/fs/nfsclient/nfs_clvnops.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
* vnode op calls for Sun NFS version 2, 3 and 4
*/
+#include "opt_kdtrace.h"
#include "opt_inet.h"
#include <sys/param.h>
@@ -70,6 +71,7 @@ __FBSDID("$FreeBSD$");
#include <fs/nfsclient/nfsnode.h>
#include <fs/nfsclient/nfsmount.h>
#include <fs/nfsclient/nfs.h>
+#include <fs/nfsclient/nfs_kdtrace.h>
#include <net/if.h>
#include <netinet/in.h>
@@ -77,6 +79,24 @@ __FBSDID("$FreeBSD$");
#include <nfs/nfs_lock.h>
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+
+dtrace_nfsclient_accesscache_flush_probe_func_t
+ dtrace_nfscl_accesscache_flush_done_probe;
+uint32_t nfscl_accesscache_flush_done_id;
+
+dtrace_nfsclient_accesscache_get_probe_func_t
+ dtrace_nfscl_accesscache_get_hit_probe,
+ dtrace_nfscl_accesscache_get_miss_probe;
+uint32_t nfscl_accesscache_get_hit_id;
+uint32_t nfscl_accesscache_get_miss_id;
+
+dtrace_nfsclient_accesscache_load_probe_func_t
+ dtrace_nfscl_accesscache_load_done_probe;
+uint32_t nfscl_accesscache_load_done_id;
+#endif /* !KDTRACE_HOOKS */
+
/* Defs */
#define TRUE 1
#define FALSE 0
@@ -298,9 +318,15 @@ nfs34_access_otw(struct vnode *vp, int wmode, struct thread *td,
mtx_unlock(&np->n_mtx);
if (retmode != NULL)
*retmode = rmode;
+ KDTRACE_NFS_ACCESSCACHE_LOAD_DONE(vp, cred->cr_uid, rmode, 0);
} else if (NFS_ISV4(vp)) {
error = nfscl_maperr(td, error, (uid_t)0, (gid_t)0);
}
+#ifdef KDTRACE_HOOKS
+ if (error != 0)
+ KDTRACE_NFS_ACCESSCACHE_LOAD_DONE(vp, cred->cr_uid, 0,
+ error);
+#endif
return (error);
}
@@ -397,6 +423,14 @@ nfs_access(struct vop_access_args *ap)
}
}
mtx_unlock(&np->n_mtx);
+#ifdef KDTRACE_HOOKS
+ if (gotahit != 0)
+ KDTRACE_NFS_ACCESSCACHE_GET_HIT(vp,
+ ap->a_cred->cr_uid, mode);
+ else
+ KDTRACE_NFS_ACCESSCACHE_GET_MISS(vp,
+ ap->a_cred->cr_uid, mode);
+#endif
if (gotahit == 0) {
/*
* Either a no, or a don't know. Go to the wire.
@@ -507,6 +541,7 @@ nfs_open(struct vop_open_args *ap)
}
mtx_lock(&np->n_mtx);
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
if (vp->v_type == VDIR)
np->n_direofoffset = 0;
mtx_unlock(&np->n_mtx);
@@ -692,8 +727,10 @@ nfs_close(struct vop_close_args *ap)
* is the cause of some caching/coherency issue that might
* crop up.)
*/
- if (VFSTONFS(vp->v_mount)->nm_negnametimeo == 0)
+ if (VFSTONFS(vp->v_mount)->nm_negnametimeo == 0) {
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
+ }
if (np->n_flag & NWRITEERR) {
np->n_flag &= ~NWRITEERR;
error = np->n_error;
@@ -949,6 +986,7 @@ nfs_setattrrpc(struct vnode *vp, struct vattr *vap, struct ucred *cred,
np->n_accesscache[i].stamp = 0;
np->n_flag |= NDELEGMOD;
mtx_unlock(&np->n_mtx);
+ KDTRACE_NFS_ACCESSCACHE_FLUSH_DONE(vp);
}
error = nfsrpc_setattr(vp, vap, NULL, cred, td, &nfsva, &attrflag,
NULL);
@@ -1030,6 +1068,7 @@ nfs_lookup(struct vop_lookup_args *ap)
!(newnp->n_flag & NMODIFIED)) {
mtx_lock(&newnp->n_mtx);
newnp->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(newvp);
mtx_unlock(&newnp->n_mtx);
}
if (nfscl_nodeleg(newvp, 0) == 0 ||
@@ -1170,13 +1209,13 @@ nfs_lookup(struct vop_lookup_args *ap)
}
if (flags & ISDOTDOT) {
- ltype = VOP_ISLOCKED(dvp);
+ ltype = NFSVOPISLOCKED(dvp);
error = vfs_busy(mp, MBF_NOWAIT);
if (error != 0) {
vfs_ref(mp);
- VOP_UNLOCK(dvp, 0);
+ NFSVOPUNLOCK(dvp, 0);
error = vfs_busy(mp, 0);
- vn_lock(dvp, ltype | LK_RETRY);
+ NFSVOPLOCK(dvp, ltype | LK_RETRY);
vfs_rel(mp);
if (error == 0 && (dvp->v_iflag & VI_DOOMED)) {
vfs_unbusy(mp);
@@ -1185,14 +1224,14 @@ nfs_lookup(struct vop_lookup_args *ap)
if (error != 0)
return (error);
}
- VOP_UNLOCK(dvp, 0);
+ NFSVOPUNLOCK(dvp, 0);
error = nfscl_nget(mp, dvp, nfhp, cnp, td, &np, NULL,
cnp->cn_lkflags);
if (error == 0)
newvp = NFSTOV(np);
vfs_unbusy(mp);
if (newvp != dvp)
- vn_lock(dvp, ltype | LK_RETRY);
+ NFSVOPLOCK(dvp, ltype | LK_RETRY);
if (dvp->v_iflag & VI_DOOMED) {
if (error == 0) {
if (newvp == dvp)
@@ -1233,6 +1272,7 @@ nfs_lookup(struct vop_lookup_args *ap)
*/
mtx_lock(&np->n_mtx);
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(newvp);
mtx_unlock(&np->n_mtx);
}
}
@@ -1412,8 +1452,10 @@ nfs_mknodrpc(struct vnode *dvp, struct vnode **vpp, struct componentname *cnp,
dnp = VTONFS(dvp);
mtx_lock(&dnp->n_mtx);
dnp->n_flag |= NMODIFIED;
- if (!dattrflag)
+ if (!dattrflag) {
dnp->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
+ }
mtx_unlock(&dnp->n_mtx);
return (error);
}
@@ -1566,8 +1608,10 @@ again:
}
mtx_lock(&dnp->n_mtx);
dnp->n_flag |= NMODIFIED;
- if (!dattrflag)
+ if (!dattrflag) {
dnp->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
+ }
mtx_unlock(&dnp->n_mtx);
return (error);
}
@@ -1630,6 +1674,7 @@ nfs_remove(struct vop_remove_args *ap)
mtx_lock(&np->n_mtx);
np->n_attrstamp = 0;
mtx_unlock(&np->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
return (error);
}
@@ -1678,8 +1723,10 @@ nfs_removerpc(struct vnode *dvp, struct vnode *vp, char *name,
(void) nfscl_loadattrcache(&dvp, &dnfsva, NULL, NULL, 0, 1);
mtx_lock(&dnp->n_mtx);
dnp->n_flag |= NMODIFIED;
- if (!dattrflag)
+ if (!dattrflag) {
dnp->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
+ }
mtx_unlock(&dnp->n_mtx);
if (error && NFS_ISV4(dvp))
error = nfscl_maperr(td, error, (uid_t)0, (gid_t)0);
@@ -1717,7 +1764,7 @@ nfs_rename(struct vop_rename_args *ap)
error = 0;
goto out;
}
- if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0)
+ if ((error = NFSVOPLOCK(fvp, LK_EXCLUSIVE)) != 0)
goto out;
/*
@@ -1734,7 +1781,7 @@ nfs_rename(struct vop_rename_args *ap)
* this condition can result in potential (silent) data loss.
*/
error = VOP_FSYNC(fvp, MNT_WAIT, fcnp->cn_thread);
- VOP_UNLOCK(fvp, 0);
+ NFSVOPUNLOCK(fvp, 0);
if (!error && tvp)
error = VOP_FSYNC(tvp, MNT_WAIT, tcnp->cn_thread);
if (error)
@@ -1857,6 +1904,7 @@ nfs_renamerpc(struct vnode *fdvp, struct vnode *fvp, char *fnameptr,
} else {
fdnp->n_attrstamp = 0;
mtx_unlock(&fdnp->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(fdvp);
}
mtx_lock(&tdnp->n_mtx);
tdnp->n_flag |= NMODIFIED;
@@ -1866,6 +1914,7 @@ nfs_renamerpc(struct vnode *fdvp, struct vnode *fvp, char *fnameptr,
} else {
tdnp->n_attrstamp = 0;
mtx_unlock(&tdnp->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(tdvp);
}
if (error && NFS_ISV4(fdvp))
error = nfscl_maperr(td, error, (uid_t)0, (gid_t)0);
@@ -1908,6 +1957,7 @@ nfs_link(struct vop_link_args *ap)
} else {
tdnp->n_attrstamp = 0;
mtx_unlock(&tdnp->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(tdvp);
}
if (attrflag)
(void) nfscl_loadattrcache(&vp, &nfsva, NULL, NULL, 0, 1);
@@ -1916,6 +1966,7 @@ nfs_link(struct vop_link_args *ap)
mtx_lock(&np->n_mtx);
np->n_attrstamp = 0;
mtx_unlock(&np->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
}
/*
* If negative lookup caching is enabled, I might as well
@@ -2002,6 +2053,7 @@ nfs_symlink(struct vop_symlink_args *ap)
} else {
dnp->n_attrstamp = 0;
mtx_unlock(&dnp->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
}
return (error);
}
@@ -2037,6 +2089,7 @@ nfs_mkdir(struct vop_mkdir_args *ap)
} else {
dnp->n_attrstamp = 0;
mtx_unlock(&dnp->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
}
if (nfhp) {
ret = nfscl_nget(dvp->v_mount, dvp, nfhp, cnp, cnp->cn_thread,
@@ -2105,6 +2158,7 @@ nfs_rmdir(struct vop_rmdir_args *ap)
} else {
dnp->n_attrstamp = 0;
mtx_unlock(&dnp->n_mtx);
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
}
cache_purge(dvp);
@@ -2889,9 +2943,9 @@ nfs_advlock(struct vop_advlock_args *ap)
cred = p->p_ucred;
else
cred = td->td_ucred;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if (vp->v_iflag & VI_DOOMED) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EBADF);
}
@@ -2914,27 +2968,27 @@ nfs_advlock(struct vop_advlock_args *ap)
ap->a_fl, 0, cred, td, ap->a_id, ap->a_flags);
if (ret == NFSERR_DENIED && (ap->a_flags & F_WAIT) &&
ap->a_op == F_SETLK) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = nfs_catnap(PZERO | PCATCH, ret,
"ncladvl");
if (error)
return (EINTR);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if (vp->v_iflag & VI_DOOMED) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EBADF);
}
}
} while (ret == NFSERR_DENIED && (ap->a_flags & F_WAIT) &&
ap->a_op == F_SETLK);
if (ret == NFSERR_DENIED) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EAGAIN);
} else if (ret == EINVAL || ret == EBADF || ret == EINTR) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (ret);
} else if (ret != 0) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (EACCES);
}
@@ -2946,12 +3000,14 @@ nfs_advlock(struct vop_advlock_args *ap)
if (ap->a_op == F_SETLK) {
if ((np->n_flag & NMODIFIED) == 0) {
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
ret = VOP_GETATTR(vp, &va, cred);
}
if ((np->n_flag & NMODIFIED) || ret ||
np->n_change != va.va_filerev) {
(void) ncl_vinvalbuf(vp, V_SAVE, td, 1);
np->n_attrstamp = 0;
+ KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
ret = VOP_GETATTR(vp, &va, cred);
if (!ret) {
np->n_mtime = va.va_mtime;
@@ -2959,21 +3015,21 @@ nfs_advlock(struct vop_advlock_args *ap)
}
}
}
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
return (0);
} else if (!NFS_ISV4(vp)) {
- error = vn_lock(vp, LK_SHARED);
+ error = NFSVOPLOCK(vp, LK_SHARED);
if (error)
return (error);
if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) {
size = VTONFS(vp)->n_size;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = lf_advlock(ap, &(vp->v_lockf), size);
} else {
if (nfs_advlock_p != NULL)
error = nfs_advlock_p(ap);
else {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = ENOLCK;
}
}
@@ -2993,15 +3049,15 @@ nfs_advlockasync(struct vop_advlockasync_args *ap)
if (NFS_ISV4(vp))
return (EOPNOTSUPP);
- error = vn_lock(vp, LK_SHARED);
+ error = NFSVOPLOCK(vp, LK_SHARED);
if (error)
return (error);
if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NOLOCKD) != 0) {
size = VTONFS(vp)->n_size;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = lf_advlockasync(ap, &(vp->v_lockf), size);
} else {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
error = EOPNOTSUPP;
}
return (error);
diff --git a/sys/fs/nfsclient/nfs_kdtrace.h b/sys/fs/nfsclient/nfs_kdtrace.h
new file mode 100644
index 0000000..f8f143f
--- /dev/null
+++ b/sys/fs/nfsclient/nfs_kdtrace.h
@@ -0,0 +1,120 @@
+/*-
+ * Copyright (c) 2009 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * This software was developed at the University of Cambridge Computer
+ * Laboratory with support from a grant from Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _NFSCL_NFS_KDTRACE_H_
+#define _NFSCL_NFS_KDTRACE_H_
+
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+
+/*
+ * Definitions for NFS access cache probes.
+ */
+extern uint32_t nfscl_accesscache_flush_done_id;
+extern uint32_t nfscl_accesscache_get_hit_id;
+extern uint32_t nfscl_accesscache_get_miss_id;
+extern uint32_t nfscl_accesscache_load_done_id;
+
+#define KDTRACE_NFS_ACCESSCACHE_FLUSH_DONE(vp) do { \
+ if (dtrace_nfscl_accesscache_flush_done_probe != NULL) \
+ (dtrace_nfscl_accesscache_flush_done_probe)( \
+ nfscl_accesscache_flush_done_id, (vp)); \
+} while (0)
+
+#define KDTRACE_NFS_ACCESSCACHE_GET_HIT(vp, uid, mode) do { \
+ if (dtrace_nfscl_accesscache_get_hit_probe != NULL) \
+ (dtrace_nfscl_accesscache_get_hit_probe)( \
+ nfscl_accesscache_get_hit_id, (vp), (uid), \
+ (mode)); \
+} while (0)
+
+#define KDTRACE_NFS_ACCESSCACHE_GET_MISS(vp, uid, mode) do { \
+ if (dtrace_nfscl_accesscache_get_miss_probe != NULL) \
+ (dtrace_nfscl_accesscache_get_miss_probe)( \
+ nfscl_accesscache_get_miss_id, (vp), (uid), \
+ (mode)); \
+} while (0)
+
+#define KDTRACE_NFS_ACCESSCACHE_LOAD_DONE(vp, uid, rmode, error) do { \
+ if (dtrace_nfscl_accesscache_load_done_probe != NULL) \
+ (dtrace_nfscl_accesscache_load_done_probe)( \
+ nfscl_accesscache_load_done_id, (vp), (uid), \
+ (rmode), (error)); \
+} while (0)
+
+/*
+ * Definitions for NFS attribute cache probes.
+ */
+extern uint32_t nfscl_attrcache_flush_done_id;
+extern uint32_t nfscl_attrcache_get_hit_id;
+extern uint32_t nfscl_attrcache_get_miss_id;
+extern uint32_t nfscl_attrcache_load_done_id;
+
+#define KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp) do { \
+ if (dtrace_nfscl_attrcache_flush_done_probe != NULL) \
+ (dtrace_nfscl_attrcache_flush_done_probe)( \
+ nfscl_attrcache_flush_done_id, (vp)); \
+} while (0)
+
+#define KDTRACE_NFS_ATTRCACHE_GET_HIT(vp, vap) do { \
+ if (dtrace_nfscl_attrcache_get_hit_probe != NULL) \
+ (dtrace_nfscl_attrcache_get_hit_probe)( \
+ nfscl_attrcache_get_hit_id, (vp), (vap)); \
+} while (0)
+
+#define KDTRACE_NFS_ATTRCACHE_GET_MISS(vp) do { \
+ if (dtrace_nfscl_attrcache_get_miss_probe != NULL) \
+ (dtrace_nfscl_attrcache_get_miss_probe)( \
+ nfscl_attrcache_get_miss_id, (vp)); \
+} while (0)
+
+#define KDTRACE_NFS_ATTRCACHE_LOAD_DONE(vp, vap, error) do { \
+ if (dtrace_nfscl_attrcache_load_done_probe != NULL) \
+ (dtrace_nfscl_attrcache_load_done_probe)( \
+ nfscl_attrcache_load_done_id, (vp), (vap), \
+ (error)); \
+} while (0)
+
+#else /* !KDTRACE_HOOKS */
+
+#define KDTRACE_NFS_ACCESSCACHE_FLUSH_DONE(vp)
+#define KDTRACE_NFS_ACCESSCACHE_GET_HIT(vp, uid, mode)
+#define KDTRACE_NFS_ACCESSCACHE_GET_MISS(vp, uid, mode)
+#define KDTRACE_NFS_ACCESSCACHE_LOAD_DONE(vp, uid, rmode, error)
+
+#define KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp)
+#define KDTRACE_NFS_ATTRCACHE_GET_HIT(vp, vap)
+#define KDTRACE_NFS_ATTRCACHE_GET_MISS(vp)
+#define KDTRACE_NFS_ATTRCACHE_LOAD_DONE(vp, vap, error)
+
+#endif /* KDTRACE_HOOKS */
+
+#endif /* !_NFSCL_NFS_KDTRACE_H_ */
diff --git a/sys/fs/nfsserver/nfs_nfsdcache.c b/sys/fs/nfsserver/nfs_nfsdcache.c
index bcffd6c..50f92ad 100644
--- a/sys/fs/nfsserver/nfs_nfsdcache.c
+++ b/sys/fs/nfsserver/nfs_nfsdcache.c
@@ -308,6 +308,7 @@ nfsrvd_getcache(struct nfsrv_descript *nd, struct socket *so)
ret = nfsrc_gettcp(nd, newrp);
}
nfsrc_trimcache(nd->nd_sockref, so);
+ NFSEXITCODE2(0, nd);
return (ret);
}
@@ -373,7 +374,7 @@ loop:
}
nfsrc_unlock(rp);
free((caddr_t)newrp, M_NFSRVCACHE);
- return (ret);
+ goto out;
}
}
newnfsstats.srvcache_misses++;
@@ -394,7 +395,11 @@ loop:
TAILQ_INSERT_TAIL(&nfsrvudplru, newrp, rc_lru);
NFSUNLOCKCACHE();
nd->nd_rp = newrp;
- return (RC_DOIT);
+ ret = RC_DOIT;
+
+out:
+ NFSEXITCODE2(0, nd);
+ return (ret);
}
/*
@@ -405,6 +410,7 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
{
struct nfsrvcache *rp;
struct nfsrvcache *retrp = NULL;
+ mbuf_t m;
rp = nd->nd_rp;
if (!rp)
@@ -435,8 +441,7 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
M_COPYALL, M_WAIT);
rp->rc_timestamp = NFSD_MONOSEC + NFSRVCACHE_TCPTIMEOUT;
nfsrc_unlock(rp);
- nfsrc_trimcache(nd->nd_sockref, so);
- return (retrp);
+ goto out;
}
/*
@@ -457,9 +462,9 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
}
if ((nd->nd_flag & ND_NFSV2) &&
nfsv2_repstat[newnfsv2_procid[nd->nd_procnum]]) {
- NFSUNLOCKCACHE();
rp->rc_status = nd->nd_repstat;
rp->rc_flag |= RC_REPSTATUS;
+ NFSUNLOCKCACHE();
} else {
if (!(rp->rc_flag & RC_UDP)) {
nfsrc_tcpsavedreplies++;
@@ -469,9 +474,11 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
nfsrc_tcpsavedreplies;
}
NFSUNLOCKCACHE();
- rp->rc_reply = m_copym(nd->nd_mreq, 0, M_COPYALL,
- M_WAIT);
+ m = m_copym(nd->nd_mreq, 0, M_COPYALL, M_WAIT);
+ NFSLOCKCACHE();
+ rp->rc_reply = m;
rp->rc_flag |= RC_REPMBUF;
+ NFSUNLOCKCACHE();
}
if (rp->rc_flag & RC_UDP) {
rp->rc_timestamp = NFSD_MONOSEC +
@@ -489,7 +496,10 @@ nfsrvd_updatecache(struct nfsrv_descript *nd, struct socket *so)
nfsrc_freecache(rp);
NFSUNLOCKCACHE();
}
+
+out:
nfsrc_trimcache(nd->nd_sockref, so);
+ NFSEXITCODE2(0, nd);
return (retrp);
}
@@ -518,6 +528,7 @@ nfsrvd_delcache(struct nfsrvcache *rp)
APPLESTATIC void
nfsrvd_sentcache(struct nfsrvcache *rp, struct socket *so, int err)
{
+ tcp_seq tmp_seq;
if (!(rp->rc_flag & RC_LOCKED))
panic("nfsrvd_sentcache not locked");
@@ -526,8 +537,12 @@ nfsrvd_sentcache(struct nfsrvcache *rp, struct socket *so, int err)
so->so_proto->pr_domain->dom_family != AF_INET6) ||
so->so_proto->pr_protocol != IPPROTO_TCP)
panic("nfs sent cache");
- if (nfsrv_getsockseqnum(so, &rp->rc_tcpseq))
+ if (nfsrv_getsockseqnum(so, &tmp_seq)) {
+ NFSLOCKCACHE();
+ rp->rc_tcpseq = tmp_seq;
rp->rc_flag |= RC_TCPSEQ;
+ NFSUNLOCKCACHE();
+ }
}
nfsrc_unlock(rp);
}
@@ -648,7 +663,7 @@ tryagain:
}
nfsrc_unlock(rp);
free((caddr_t)newrp, M_NFSRVCACHE);
- return (ret);
+ goto out;
}
newnfsstats.srvcache_misses++;
newnfsstats.srvcache_size++;
@@ -662,7 +677,11 @@ tryagain:
LIST_INSERT_HEAD(hp, newrp, rc_hash);
NFSUNLOCKCACHE();
nd->nd_rp = newrp;
- return (RC_DOIT);
+ ret = RC_DOIT;
+
+out:
+ NFSEXITCODE2(0, nd);
+ return (ret);
}
/*
@@ -687,8 +706,11 @@ nfsrc_lock(struct nfsrvcache *rp)
static void
nfsrc_unlock(struct nfsrvcache *rp)
{
+
+ NFSLOCKCACHE();
rp->rc_flag &= ~RC_LOCKED;
nfsrc_wanted(rp);
+ NFSUNLOCKCACHE();
}
/*
diff --git a/sys/fs/nfsserver/nfs_nfsdkrpc.c b/sys/fs/nfsserver/nfs_nfsdkrpc.c
index 8ce70fa..ae676f3 100644
--- a/sys/fs/nfsserver/nfs_nfsdkrpc.c
+++ b/sys/fs/nfsserver/nfs_nfsdkrpc.c
@@ -115,7 +115,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (rqst->rq_proc > NFSV2PROC_STATFS) {
svcerr_noproc(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
nd.nd_procnum = newnfs_nfsv3_procid[rqst->rq_proc];
nd.nd_flag = ND_NFSV2;
@@ -123,7 +123,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (rqst->rq_proc >= NFS_V3NPROCS) {
svcerr_noproc(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
nd.nd_procnum = rqst->rq_proc;
nd.nd_flag = ND_NFSV3;
@@ -132,7 +132,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
rqst->rq_proc != NFSV4PROC_COMPOUND) {
svcerr_noproc(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
nd.nd_procnum = rqst->rq_proc;
nd.nd_flag = ND_NFSV4;
@@ -192,7 +192,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
}
@@ -201,7 +201,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
/* Set the flag based on credflavor */
@@ -215,7 +215,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
#ifdef MAC
@@ -227,7 +227,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
svcerr_weakauth(rqst);
svc_freereq(rqst);
m_freem(nd.nd_mrep);
- return;
+ goto out;
}
}
@@ -248,13 +248,13 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (nd.nd_mreq != NULL)
m_freem(nd.nd_mreq);
svc_freereq(rqst);
- return;
+ goto out;
}
if (nd.nd_mreq == NULL) {
svcerr_decode(rqst);
svc_freereq(rqst);
- return;
+ goto out;
}
if (nd.nd_repstat & NFSERR_AUTHERR) {
@@ -267,6 +267,9 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
if (rp != NULL)
nfsrvd_sentcache(rp, xprt->xp_socket, 0);
svc_freereq(rqst);
+
+out:
+ NFSEXITCODE(0);
}
/*
@@ -329,6 +332,8 @@ nfs_proc(struct nfsrv_descript *nd, u_int32_t xid, struct socket *so,
cacherep = RC_REPLY;
*rpp = nfsrvd_updatecache(nd, so);
}
+
+ NFSEXITCODE2(0, nd);
return (cacherep);
}
@@ -340,7 +345,7 @@ nfsrvd_addsock(struct file *fp)
{
int siz;
struct socket *so;
- int error;
+ int error = 0;
SVCXPRT *xprt;
static u_int64_t sockref = 0;
@@ -348,9 +353,8 @@ nfsrvd_addsock(struct file *fp)
siz = sb_max_adj;
error = soreserve(so, siz, siz);
- if (error) {
- return (error);
- }
+ if (error)
+ goto out;
/*
* Steal the socket from userland so that it doesn't close
@@ -376,7 +380,9 @@ nfsrvd_addsock(struct file *fp)
SVC_RELEASE(xprt);
}
- return (0);
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -386,18 +392,14 @@ nfsrvd_addsock(struct file *fp)
int
nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
{
-#ifdef KGSSAPI
char principal[MAXHOSTNAMELEN + 5];
- int error;
+ int error = 0;
bool_t ret2, ret3, ret4;
-#endif
-#ifdef KGSSAPI
error = copyinstr(args->principal, principal, sizeof (principal),
NULL);
if (error)
- return (error);
-#endif
+ goto out;
/*
* Only the first nfsd actually does any work. The RPC code
@@ -412,38 +414,29 @@ nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
NFSD_UNLOCK();
-#ifdef KGSSAPI
/* An empty string implies AUTH_SYS only. */
if (principal[0] != '\0') {
- ret2 = rpc_gss_set_svc_name(principal, "kerberosv5",
- GSS_C_INDEFINITE, NFS_PROG, NFS_VER2);
- ret3 = rpc_gss_set_svc_name(principal, "kerberosv5",
- GSS_C_INDEFINITE, NFS_PROG, NFS_VER3);
- ret4 = rpc_gss_set_svc_name(principal, "kerberosv5",
- GSS_C_INDEFINITE, NFS_PROG, NFS_VER4);
-
- if (!ret2 || !ret3 || !ret4) {
- NFSD_LOCK();
- newnfs_numnfsd--;
- nfsrvd_init(1);
- NFSD_UNLOCK();
- return (EAUTH);
- }
+ ret2 = rpc_gss_set_svc_name_call(principal,
+ "kerberosv5", GSS_C_INDEFINITE, NFS_PROG, NFS_VER2);
+ ret3 = rpc_gss_set_svc_name_call(principal,
+ "kerberosv5", GSS_C_INDEFINITE, NFS_PROG, NFS_VER3);
+ ret4 = rpc_gss_set_svc_name_call(principal,
+ "kerberosv5", GSS_C_INDEFINITE, NFS_PROG, NFS_VER4);
+
+ if (!ret2 || !ret3 || !ret4)
+ printf("nfsd: can't register svc name\n");
}
-#endif
nfsrvd_pool->sp_minthreads = args->minthreads;
nfsrvd_pool->sp_maxthreads = args->maxthreads;
svc_run(nfsrvd_pool);
-#ifdef KGSSAPI
if (principal[0] != '\0') {
- rpc_gss_clear_svc_name(NFS_PROG, NFS_VER2);
- rpc_gss_clear_svc_name(NFS_PROG, NFS_VER3);
- rpc_gss_clear_svc_name(NFS_PROG, NFS_VER4);
+ rpc_gss_clear_svc_name_call(NFS_PROG, NFS_VER2);
+ rpc_gss_clear_svc_name_call(NFS_PROG, NFS_VER3);
+ rpc_gss_clear_svc_name_call(NFS_PROG, NFS_VER4);
}
-#endif
NFSD_LOCK();
newnfs_numnfsd--;
@@ -451,7 +444,9 @@ nfsrvd_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
}
NFSD_UNLOCK();
- return (0);
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index 5b96729..56c563a 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -116,14 +116,16 @@ nfsvno_getattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
* locked by this thread or not locked by this thread.
* As such, shared lock it, if not exclusively locked.
*/
- if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) {
+ if (NFSVOPISLOCKED(vp) != LK_EXCLUSIVE) {
lockedit = 1;
- vn_lock(vp, LK_SHARED | LK_RETRY);
+ NFSVOPLOCK(vp, LK_SHARED | LK_RETRY);
}
}
error = VOP_GETATTR(vp, &nvap->na_vattr, cred);
if (lockedit != 0)
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -138,6 +140,8 @@ nfsvno_getfh(struct vnode *vp, fhandle_t *fhp, struct thread *p)
NFSBZERO((caddr_t)fhp, sizeof(fhandle_t));
fhp->fh_fsid = vp->v_mount->mnt_stat.f_fsid;
error = VOP_VPTOFH(vp, &fhp->fh_fid);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -160,8 +164,10 @@ nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred,
int error = 0, getret = 0;
if (vpislocked == 0) {
- if (vn_lock(vp, LK_SHARED) != 0)
- return (EPERM);
+ if (NFSVOPLOCK(vp, LK_SHARED) != 0) {
+ error = EPERM;
+ goto out;
+ }
}
if (accmode & VWRITE) {
/* Just vn_writechk() changed to check rdonly */
@@ -191,8 +197,8 @@ nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred,
}
if (error != 0) {
if (vpislocked == 0)
- VOP_UNLOCK(vp, 0);
- return (error);
+ NFSVOPUNLOCK(vp, 0);
+ goto out;
}
/*
@@ -231,7 +237,10 @@ nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred,
}
}
if (vpislocked == 0)
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -245,6 +254,7 @@ nfsvno_setattr(struct vnode *vp, struct nfsvattr *nvap, struct ucred *cred,
int error;
error = VOP_SETATTR(vp, &nvap->na_vattr, cred);
+ NFSEXITCODE(error);
return (error);
}
@@ -279,10 +289,11 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp,
else
vrele(dp);
nfsvno_relpathbuf(ndp);
- return (ENOTDIR);
+ error = ENOTDIR;
+ goto out1;
}
if (islocked)
- NFSVOPUNLOCK(dp, 0, p);
+ NFSVOPUNLOCK(dp, 0);
VREF(dp);
*retdirp = dp;
if (NFSVNO_EXRDONLY(exp))
@@ -351,7 +362,7 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp,
if ((cnp->cn_flags & (SAVENAME | SAVESTART)) == 0)
nfsvno_relpathbuf(ndp);
if (ndp->ni_vp && !lockleaf)
- NFSVOPUNLOCK(ndp->ni_vp, 0, p);
+ NFSVOPUNLOCK(ndp->ni_vp, 0);
break;
}
@@ -359,7 +370,7 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp,
* Validate symlink
*/
if ((cnp->cn_flags & LOCKPARENT) && ndp->ni_pathlen == 1)
- NFSVOPUNLOCK(ndp->ni_dvp, 0, p);
+ NFSVOPUNLOCK(ndp->ni_dvp, 0);
if (!(nd->nd_flag & ND_PUBLOOKUP)) {
error = EINVAL;
goto badlink2;
@@ -444,6 +455,9 @@ out:
} else if ((ndp->ni_cnd.cn_flags & (WANTPARENT|LOCKPARENT)) == 0) {
ndp->ni_dvp = NULL;
}
+
+out1:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -487,7 +501,7 @@ nfsvno_readlink(struct vnode *vp, struct ucred *cred, struct thread *p,
struct iovec *ivp = iv;
struct uio io, *uiop = &io;
struct mbuf *mp, *mp2 = NULL, *mp3 = NULL;
- int i, len, tlen, error;
+ int i, len, tlen, error = 0;
len = 0;
i = 0;
@@ -523,7 +537,7 @@ nfsvno_readlink(struct vnode *vp, struct ucred *cred, struct thread *p,
if (error) {
m_freem(mp3);
*lenp = 0;
- return (error);
+ goto out;
}
if (uiop->uio_resid > 0) {
len -= uiop->uio_resid;
@@ -533,7 +547,10 @@ nfsvno_readlink(struct vnode *vp, struct ucred *cred, struct thread *p,
*lenp = len;
*mpp = mp3;
*mpendp = mp;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -650,7 +667,7 @@ nfsvno_read(struct vnode *vp, off_t off, int cnt, struct ucred *cred,
if (error) {
m_freem(m3);
*mpp = NULL;
- return (error);
+ goto out;
}
tlen = len - uiop->uio_resid;
cnt = cnt < tlen ? cnt : tlen;
@@ -662,7 +679,10 @@ nfsvno_read(struct vnode *vp, off_t off, int cnt, struct ucred *cred,
nfsrv_adj(m3, len - tlen, tlen - cnt);
*mpp = m3;
*mpendp = m2;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -712,6 +732,8 @@ nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int stable,
uiop->uio_offset = off;
error = VOP_WRITE(vp, uiop, ioflags, cred);
FREE((caddr_t)iv, M_TEMP);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -758,7 +780,7 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (error);
+ goto out;
}
nvap->na_rdev = rdev;
error = VOP_MKNOD(ndp->ni_dvp, &ndp->ni_vp,
@@ -767,12 +789,13 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
nfsvno_relpathbuf(ndp);
vrele(ndp->ni_startdir);
if (error)
- return (error);
+ goto out;
} else {
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (ENXIO);
+ error = ENXIO;
+ goto out;
}
*vpp = ndp->ni_vp;
} else {
@@ -804,6 +827,9 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp,
if (error)
vput(*vpp);
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -826,13 +852,15 @@ nfsvno_mknod(struct nameidata *ndp, struct nfsvattr *nvap, struct ucred *cred,
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
vrele(ndp->ni_vp);
- return (EEXIST);
+ error = EEXIST;
+ goto out;
}
if (vtyp != VCHR && vtyp != VBLK && vtyp != VSOCK && vtyp != VFIFO) {
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (NFSERR_BADTYPE);
+ error = NFSERR_BADTYPE;
+ goto out;
}
if (vtyp == VSOCK) {
vrele(ndp->ni_startdir);
@@ -846,7 +874,7 @@ nfsvno_mknod(struct nameidata *ndp, struct nfsvattr *nvap, struct ucred *cred,
vrele(ndp->ni_startdir);
nfsvno_relpathbuf(ndp);
vput(ndp->ni_dvp);
- return (error);
+ goto out;
}
error = VOP_MKNOD(ndp->ni_dvp, &ndp->ni_vp,
&ndp->ni_cnd, &nvap->na_vattr);
@@ -858,6 +886,9 @@ nfsvno_mknod(struct nameidata *ndp, struct nfsvattr *nvap, struct ucred *cred,
* see any reason to do the lookup.
*/
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -877,12 +908,16 @@ nfsvno_mkdir(struct nameidata *ndp, struct nfsvattr *nvap, uid_t saved_uid,
vput(ndp->ni_dvp);
vrele(ndp->ni_vp);
nfsvno_relpathbuf(ndp);
- return (EEXIST);
+ error = EEXIST;
+ goto out;
}
error = VOP_MKDIR(ndp->ni_dvp, &ndp->ni_vp, &ndp->ni_cnd,
&nvap->na_vattr);
vput(ndp->ni_dvp);
nfsvno_relpathbuf(ndp);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -904,7 +939,8 @@ nfsvno_symlink(struct nameidata *ndp, struct nfsvattr *nvap, char *pathcp,
else
vput(ndp->ni_dvp);
vrele(ndp->ni_vp);
- return (EEXIST);
+ error = EEXIST;
+ goto out;
}
error = VOP_SYMLINK(ndp->ni_dvp, &ndp->ni_vp, &ndp->ni_cnd,
@@ -920,6 +956,9 @@ nfsvno_symlink(struct nameidata *ndp, struct nfsvattr *nvap, char *pathcp,
*/
if (!not_v2 && !error)
vput(ndp->ni_vp);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -960,10 +999,12 @@ nfsvno_getsymlink(struct nfsrv_descript *nd, struct nfsvattr *nvap,
}
*pathcpp = pathcp;
*lenp = len;
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (pathcp)
free(pathcp, M_TEMP);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -989,6 +1030,7 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, struct ucred *cred,
else
vput(ndp->ni_dvp);
vput(vp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1027,6 +1069,7 @@ out:
else
vput(ndp->ni_dvp);
vput(vp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1097,9 +1140,9 @@ nfsvno_rename(struct nameidata *fromndp, struct nameidata *tondp,
goto out;
}
if (ndflag & ND_NFSV4) {
- if (vn_lock(fvp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(fvp, LK_EXCLUSIVE) == 0) {
error = nfsrv_checkremove(fvp, 0, p);
- VOP_UNLOCK(fvp, 0);
+ NFSVOPUNLOCK(fvp, 0);
} else
error = EPERM;
if (tvp && !error)
@@ -1136,6 +1179,7 @@ out:
out1:
vrele(fromndp->ni_startdir);
nfsvno_relpathbuf(fromndp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1158,7 +1202,7 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
error = EXDEV;
}
if (!error) {
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) == 0)
error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd);
else
@@ -1167,7 +1211,7 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
vrele(ndp->ni_dvp);
else
vput(ndp->ni_dvp);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else {
if (ndp->ni_dvp == ndp->ni_vp)
vrele(ndp->ni_dvp);
@@ -1177,6 +1221,7 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
vrele(ndp->ni_vp);
}
nfsvno_relpathbuf(ndp);
+ NFSEXITCODE(error);
return (error);
}
@@ -1271,6 +1316,7 @@ nfsvno_fsync(struct vnode *vp, u_int64_t off, int cnt, struct ucred *cred,
}
BO_UNLOCK(bo);
}
+ NFSEXITCODE(error);
return (error);
}
@@ -1296,6 +1342,7 @@ nfsvno_statfs(struct vnode *vp, struct statfs *sf)
if (sf->f_ffree < 0)
sf->f_ffree = 0;
}
+ NFSEXITCODE(error);
return (error);
}
@@ -1386,6 +1433,8 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp,
}
}
*vpp = vp;
+
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1419,6 +1468,7 @@ nfsvno_fillattr(struct nfsrv_descript *nd, struct mount *mp, struct vnode *vp,
error = nfsv4_fillattr(nd, mp, vp, NULL, &nvap->na_vattr, fhp, rderror,
attrbitp, cred, p, isdgram, reterr, supports_nfsv4acls, at_root,
mounted_on_fileno);
+ NFSEXITCODE2(0, nd);
return (error);
}
@@ -1465,7 +1515,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
@@ -1512,7 +1562,7 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs");
MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
@@ -1556,7 +1606,7 @@ again:
free((caddr_t)cookies, M_TEMP);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
/*
* If nothing read, return eof
@@ -1576,7 +1626,7 @@ again:
*tl = newnfs_true;
FREE((caddr_t)rbuf, M_TEMP);
FREE((caddr_t)cookies, M_TEMP);
- return (0);
+ goto out;
}
/*
@@ -1677,9 +1727,13 @@ again:
*tl = newnfs_false;
FREE((caddr_t)rbuf, M_TEMP);
FREE((caddr_t)cookies, M_TEMP);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1714,7 +1768,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, 6 * NFSX_UNSIGNED);
off = fxdr_hyper(tl);
@@ -1786,7 +1840,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs");
@@ -1826,7 +1880,7 @@ again:
free((caddr_t)rbuf, M_TEMP);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
/*
* If nothing read, return eof
@@ -1843,7 +1897,7 @@ again:
*tl = newnfs_true;
free((caddr_t)cookies, M_TEMP);
free((caddr_t)rbuf, M_TEMP);
- return (0);
+ goto out;
}
/*
@@ -1887,7 +1941,7 @@ again:
*/
mp = vp->v_mount;
vfs_ref(mp);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
nd->nd_repstat = vfs_busy(mp, 0);
vfs_rel(mp);
if (nd->nd_repstat != 0) {
@@ -1896,7 +1950,7 @@ again:
free(rbuf, M_TEMP);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
/*
@@ -1986,7 +2040,7 @@ again:
dp->d_name[1] == '.')
cn.cn_flags |=
ISDOTDOT;
- if (vn_lock(vp, LK_SHARED)
+ if (NFSVOPLOCK(vp, LK_SHARED)
!= 0) {
nd->nd_repstat = EPERM;
break;
@@ -2001,7 +2055,7 @@ again:
r = VOP_LOOKUP(vp, &nvp,
&cn);
if (vp != nvp)
- VOP_UNLOCK(vp,
+ NFSVOPUNLOCK(vp,
0);
}
}
@@ -2080,7 +2134,7 @@ again:
if (nvp != NULL) {
supports_nfsv4acls =
nfs_supportsnfsv4acls(nvp);
- VOP_UNLOCK(nvp, 0);
+ NFSVOPUNLOCK(nvp, 0);
} else
supports_nfsv4acls = 0;
if (refp != NULL) {
@@ -2148,9 +2202,13 @@ again:
}
FREE((caddr_t)cookies, M_TEMP);
FREE((caddr_t)rbuf, M_TEMP);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2249,6 +2307,7 @@ nfsrv_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
error = nfsv4_sattr(nd, nvap, attrbitp, aclp, p);
};
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2272,7 +2331,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
error = nfsrv_getattrbits(nd, attrbitp, NULL, &retnotsup);
if (error)
- return (error);
+ goto nfsmout;
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
attrsize = fxdr_unsigned(int, *tl);
@@ -2304,7 +2363,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
if (error)
goto nfsmout;
if (aceerr && !nd->nd_repstat)
- nd->nd_repstat = NFSERR_ATTRNOTSUPP;
+ nd->nd_repstat = aceerr;
attrsum += aclsize;
break;
case NFSATTRBIT_ARCHIVE:
@@ -2337,8 +2396,10 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
case NFSATTRBIT_OWNER:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
else
@@ -2347,7 +2408,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsv4_strtouid(cp,j,&uid,p);
@@ -2361,8 +2422,10 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
case NFSATTRBIT_OWNERGROUP:
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
j = fxdr_unsigned(int, *tl);
- if (j < 0)
- return (NFSERR_BADXDR);
+ if (j < 0) {
+ error = NFSERR_BADXDR;
+ goto nfsmout;
+ }
if (j > NFSV4_SMALLSTR)
cp = malloc(j + 1, M_NFSSTRING, M_WAITOK);
else
@@ -2371,7 +2434,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
if (error) {
if (j > NFSV4_SMALLSTR)
free(cp, M_NFSSTRING);
- return (error);
+ goto nfsmout;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsv4_strtogid(cp,j,&gid,p);
@@ -2453,6 +2516,7 @@ nfsv4_sattr(struct nfsrv_descript *nd, struct nfsvattr *nvap,
error = nfsm_advance(nd, attrsize - attrsum, -1);
}
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2484,14 +2548,16 @@ nfsd_excred(struct nfsrv_descript *nd, struct nfsexstuff *exp,
error = NFSERR_WRONGSEC;
else
error = (NFSERR_AUTHERR | AUTH_TOOWEAK);
- return (error);
+ goto out;
}
/*
* Check to see if the file system is exported V4 only.
*/
- if (NFSVNO_EXV4ONLY(exp) && !(nd->nd_flag & ND_NFSV4))
- return (NFSERR_PROGNOTV4);
+ if (NFSVNO_EXV4ONLY(exp) && !(nd->nd_flag & ND_NFSV4)) {
+ error = NFSERR_PROGNOTV4;
+ goto out;
+ }
/*
* Now, map the user credentials.
@@ -2508,7 +2574,10 @@ nfsd_excred(struct nfsrv_descript *nd, struct nfsexstuff *exp,
crsetgroups(nd->nd_cred, credanon->cr_ngroups,
credanon->cr_groups);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -2533,6 +2602,7 @@ nfsvno_checkexp(struct mount *mp, struct sockaddr *nam, struct nfsexstuff *exp,
for (i = 0; i < exp->nes_numsecflavor; i++)
exp->nes_secflavors[i] = secflavors[i];
}
+ NFSEXITCODE(error);
return (error);
}
@@ -2578,50 +2648,9 @@ nfsvno_fhtovp(struct mount *mp, fhandle_t *fhp, struct sockaddr *nam,
* but this will have to do until VFS_FHTOVP() has a lock
* type argument like VFS_VGET().
*/
- vn_lock(*vpp, LK_DOWNGRADE | LK_RETRY);
- return (error);
-}
-
-/*
- * Do the pathconf vnode op.
- */
-int
-nfsvno_pathconf(struct vnode *vp, int flag, register_t *retf,
- struct ucred *cred, struct thread *p)
-{
- int error;
+ NFSVOPLOCK(*vpp, LK_DOWNGRADE | LK_RETRY);
- error = VOP_PATHCONF(vp, flag, retf);
- if (error == EOPNOTSUPP || error == EINVAL) {
- /*
- * Some file systems return EINVAL for name arguments not
- * supported and some return EOPNOTSUPP for this case.
- * So the NFSv3 Pathconf RPC doesn't fail for these cases,
- * just fake them.
- */
- switch (flag) {
- case _PC_LINK_MAX:
- *retf = LINK_MAX;
- break;
- case _PC_NAME_MAX:
- *retf = NAME_MAX;
- break;
- case _PC_CHOWN_RESTRICTED:
- *retf = 1;
- break;
- case _PC_NO_TRUNC:
- *retf = 1;
- break;
- default:
- /*
- * Only happens if a _PC_xxx is added to the server,
- * but this isn't updated.
- */
- *retf = 0;
- printf("nfsrvd pathconf flag=%d not supp\n", flag);
- };
- error = 0;
- }
+ NFSEXITCODE(error);
return (error);
}
@@ -2653,7 +2682,7 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
if (mp == NULL) {
*vpp = NULL;
nd->nd_repstat = ESTALE;
- return;
+ goto out;
}
if (startwrite)
@@ -2723,6 +2752,9 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh *nfp, int lktype,
if (mpp != NULL)
*mpp = NULL;
}
+
+out:
+ NFSEXITCODE2(0, nd);
}
/*
@@ -2733,13 +2765,19 @@ fp_getfvp(struct thread *p, int fd, struct file **fpp, struct vnode **vpp)
{
struct filedesc *fdp;
struct file *fp;
+ int error = 0;
fdp = p->td_proc->p_fd;
if (fd >= fdp->fd_nfiles ||
- (fp = fdp->fd_ofiles[fd]) == NULL)
- return (EBADF);
+ (fp = fdp->fd_ofiles[fd]) == NULL) {
+ error = EBADF;
+ goto out;
+ }
*fpp = fp;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2751,7 +2789,7 @@ int
nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p)
{
struct nfsex_args *nfsexargp = (struct nfsex_args *)argp;
- int error;
+ int error = 0;
struct nameidata nd;
fhandle_t fh;
@@ -2759,15 +2797,17 @@ nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p)
if ((nfsexargp->export.ex_flags & MNT_DELEXPORT) != 0)
nfs_rootfhset = 0;
else if (error == 0) {
- if (nfsexargp->fspec == NULL)
- return (EPERM);
+ if (nfsexargp->fspec == NULL) {
+ error = EPERM;
+ goto out;
+ }
/*
* If fspec != NULL, this is the v4root path.
*/
NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_USERSPACE,
nfsexargp->fspec, p);
if ((error = namei(&nd)) != 0)
- return (error);
+ goto out;
error = nfsvno_getfh(nd.ni_vp, &fh, p);
vrele(nd.ni_vp);
if (!error) {
@@ -2778,6 +2818,9 @@ nfsrv_v4rootexport(void *argp, struct ucred *cred, struct thread *p)
nfs_rootfhset = 1;
}
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2790,23 +2833,29 @@ nfsrv_getsocksndseq(struct socket *so, tcp_seq *maxp, tcp_seq *unap)
{
struct inpcb *inp;
struct tcpcb *tp;
+ int error = 0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("nfsrv_getsocksndseq: inp == NULL"));
INP_RLOCK(inp);
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
INP_RUNLOCK(inp);
- return (EPIPE);
+ error = EPIPE;
+ goto out;
}
tp = intotcpcb(inp);
if (tp->t_state != TCPS_ESTABLISHED) {
INP_RUNLOCK(inp);
- return (EPIPE);
+ error = EPIPE;
+ goto out;
}
*maxp = tp->snd_max;
*unap = tp->snd_una;
INP_RUNLOCK(inp);
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2878,16 +2927,18 @@ int
nfsvno_advlock(struct vnode *vp, int ftype, u_int64_t first,
u_int64_t end, struct thread *td)
{
- int error;
+ int error = 0;
struct flock fl;
u_int64_t tlen;
if (nfsrv_dolocallocks == 0)
- return (0);
+ goto out;
/* Check for VI_DOOMED here, so that VOP_ADVLOCK() isn't performed. */
- if ((vp->v_iflag & VI_DOOMED) != 0)
- return (EPERM);
+ if ((vp->v_iflag & VI_DOOMED) != 0) {
+ error = EPERM;
+ goto out;
+ }
fl.l_whence = SEEK_SET;
fl.l_type = ftype;
@@ -2911,14 +2962,17 @@ nfsvno_advlock(struct vnode *vp, int ftype, u_int64_t first,
fl.l_pid = (pid_t)0;
fl.l_sysid = (int)nfsv4_sysid;
- NFSVOPUNLOCK(vp, 0, td);
+ NFSVOPUNLOCK(vp, 0);
if (ftype == F_UNLCK)
error = VOP_ADVLOCK(vp, (caddr_t)td->td_proc, F_UNLCK, &fl,
(F_POSIX | F_REMOTE));
else
error = VOP_ADVLOCK(vp, (caddr_t)td->td_proc, F_SETLK, &fl,
(F_POSIX | F_REMOTE));
- NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, td);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -2929,12 +2983,14 @@ int
nfsvno_v4rootexport(struct nfsrv_descript *nd)
{
struct ucred *credanon;
- int exflags, error, numsecflavor, *secflavors, i;
+ int exflags, error = 0, numsecflavor, *secflavors, i;
error = vfs_stdcheckexp(&nfsv4root_mnt, nd->nd_nam, &exflags,
&credanon, &numsecflavor, &secflavors);
- if (error)
- return (NFSERR_PROGUNAVAIL);
+ if (error) {
+ error = NFSERR_PROGUNAVAIL;
+ goto out;
+ }
if (credanon != NULL)
crfree(credanon);
for (i = 0; i < numsecflavor; i++) {
@@ -2947,7 +3003,10 @@ nfsvno_v4rootexport(struct nfsrv_descript *nd)
else if (secflavors[i] == RPCSEC_GSS_KRB5P)
nd->nd_flag |= ND_EXGSSPRIVACY;
}
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -2967,27 +3026,32 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap)
if (uap->flag & NFSSVC_NFSDADDSOCK) {
error = copyin(uap->argp, (caddr_t)&sockarg, sizeof (sockarg));
if (error)
- return (error);
- if ((error = fget(td, sockarg.sock, &fp)) != 0) {
- return (error);
- }
+ goto out;
+ if ((error = fget(td, sockarg.sock, &fp)) != 0)
+ goto out;
if (fp->f_type != DTYPE_SOCKET) {
fdrop(fp, td);
- return (EPERM);
+ error = EPERM;
+ goto out;
}
error = nfsrvd_addsock(fp);
fdrop(fp, td);
} else if (uap->flag & NFSSVC_NFSDNFSD) {
- if (uap->argp == NULL)
- return (EINVAL);
+ if (uap->argp == NULL) {
+ error = EINVAL;
+ goto out;
+ }
error = copyin(uap->argp, (caddr_t)&nfsdarg,
sizeof (nfsdarg));
if (error)
- return (error);
+ goto out;
error = nfsrvd_nfsd(td, &nfsdarg);
} else {
error = nfssvc_srvcall(td, uap, td->td_ucred);
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -3085,6 +3149,8 @@ nfssvc_srvcall(struct thread *p, struct nfssvc_args *uap, struct ucred *cred)
nfsd_master_proc = procp;
PROC_UNLOCK(procp);
}
+
+ NFSEXITCODE(error);
return (error);
}
@@ -3179,7 +3245,7 @@ nfsd_modevent(module_t mod, int type, void *data)
switch (type) {
case MOD_LOAD:
if (loaded)
- return (0);
+ goto out;
newnfs_portinit();
mtx_init(&nfs_cache_mutex, "nfs_cache_mutex", NULL, MTX_DEF);
mtx_init(&nfs_v4root_mutex, "nfs_v4root_mutex", NULL, MTX_DEF);
@@ -3235,7 +3301,10 @@ nfsd_modevent(module_t mod, int type, void *data)
error = EOPNOTSUPP;
break;
}
- return error;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
static moduledata_t nfsd_mod = {
"nfsd",
diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index ee55031..b6a365d 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -93,7 +93,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, 1, &nva);
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nfsmode = fxdr_unsigned(u_int32_t, *tl);
@@ -103,7 +103,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
NFSACCESS_EXECUTE))) {
nd->nd_repstat = NFSERR_INVAL;
vput(vp);
- return (0);
+ goto out;
}
if (nfsmode & NFSACCESS_READ) {
supported |= NFSACCESS_READ;
@@ -155,9 +155,13 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram,
} else
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
*tl = txdr_unsigned(nfsmode);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -172,19 +176,20 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
fhandle_t fh;
int at_root = 0, error = 0, supports_nfsv4acls;
struct nfsreferral *refp;
- nfsattrbit_t attrbits;
+ nfsattrbit_t attrbits, tmpbits;
struct mount *mp;
struct vnode *tvp = NULL;
struct vattr va;
uint64_t mounted_on_fileno = 0;
+ accmode_t accmode;
if (nd->nd_repstat)
- return (0);
+ goto out;
if (nd->nd_flag & ND_NFSV4) {
error = nfsrv_getattrbits(nd, &attrbits, NULL, NULL);
if (error) {
vput(vp);
- return (error);
+ goto out;
}
/*
@@ -195,13 +200,22 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
(void) nfsrv_putreferralattr(nd, &attrbits, refp, 1,
&nd->nd_repstat);
vput(vp);
- return (0);
+ goto out;
+ }
+ if (nd->nd_repstat == 0) {
+ accmode = 0;
+ NFSSET_ATTRBIT(&tmpbits, &attrbits);
+ if (NFSISSET_ATTRBIT(&tmpbits, NFSATTRBIT_ACL)) {
+ NFSCLRBIT_ATTRBIT(&tmpbits, NFSATTRBIT_ACL);
+ accmode |= VREAD_ACL;
+ }
+ if (NFSNONZERO_ATTRBIT(&tmpbits))
+ accmode |= VREAD_ATTRIBUTES;
+ if (accmode != 0)
+ nd->nd_repstat = nfsvno_accchk(vp, accmode,
+ nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
+ NFSACCCHK_VPISLOCKED, NULL);
}
- if (!nd->nd_repstat)
- nd->nd_repstat = nfsvno_accchk(vp,
- VREAD_ATTRIBUTES,
- nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE,
- NFSACCCHK_VPISLOCKED, NULL);
}
if (!nd->nd_repstat)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
@@ -225,10 +239,10 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
} else
at_root = 0;
vfs_ref(mp);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
if (at_root != 0) {
if ((nd->nd_repstat =
- vn_lock(tvp, LK_SHARED)) == 0) {
+ NFSVOPLOCK(tvp, LK_SHARED)) == 0) {
nd->nd_repstat = VOP_GETATTR(
tvp, &va, nd->nd_cred);
vput(tvp);
@@ -260,7 +274,10 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram,
} else {
vput(vp);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -280,7 +297,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
- return (0);
+ goto out;
}
#ifdef NFS4_ACL_EXTATTR_NAME
aclp = acl_alloc(M_WAITOK);
@@ -316,7 +333,7 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
acl_free(aclp);
#endif
nfsrv_wcc(nd, preat_ret, &nva2, postat_ret, &nva);
- return (0);
+ goto out;
}
} else if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4))
nd->nd_repstat = nfsrv_checkuidgid(nd, &nva);
@@ -430,6 +447,9 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
(void) nfsrv_putattrbit(nd, &retbits);
else if (!nd->nd_repstat)
nfsrv_fillattr(nd, &nva);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
@@ -444,6 +464,7 @@ nfsmout:
*/
(void) nfsrv_putattrbit(nd, &retbits);
}
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -454,18 +475,18 @@ nfsmout:
APPLESTATIC int
nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
vnode_t dp, vnode_t *vpp, fhandle_t *fhp, NFSPROC_T *p,
- __unused struct nfsexstuff *exp)
+ struct nfsexstuff *exp)
{
struct nameidata named;
vnode_t vp, dirp = NULL;
- int error, dattr_ret = 1;
+ int error = 0, dattr_ret = 1;
struct nfsvattr nva, dattr;
char *bufp;
u_long *hashp;
if (nd->nd_repstat) {
nfsrv_postopattr(nd, dattr_ret, &dattr);
- return (0);
+ goto out;
}
/*
@@ -475,7 +496,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
if (dp->v_type == VLNK && (nd->nd_flag & ND_NFSV4)) {
nd->nd_repstat = NFSERR_SYMLINK;
vrele(dp);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, LOOKUP,
@@ -485,7 +506,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
if (error) {
vrele(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
@@ -502,13 +523,21 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
}
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, dattr_ret, &dattr);
- return (0);
+ goto out;
}
if (named.ni_startdir)
vrele(named.ni_startdir);
nfsvno_relpathbuf(&named);
vp = named.ni_vp;
- nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
+ if ((nd->nd_flag & ND_NFSV4) != 0 && !NFSVNO_EXPORTED(exp) &&
+ vp->v_type != VDIR && vp->v_type != VLNK)
+ /*
+ * Only allow lookup of VDIR and VLNK for traversal of
+ * non-exported volumes during NFSv4 mounting.
+ */
+ nd->nd_repstat = ENOENT;
+ if (nd->nd_repstat == 0)
+ nd->nd_repstat = nfsvno_getfh(vp, fhp, p);
if (!(nd->nd_flag & ND_NFSV4) && !nd->nd_repstat)
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p, 1);
if (vpp != NULL && nd->nd_repstat == 0)
@@ -524,7 +553,7 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, dattr_ret, &dattr);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
(void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
@@ -534,7 +563,10 @@ nfsrvd_lookup(struct nfsrv_descript *nd, __unused int isdgram,
nfsrv_postopattr(nd, 0, &nva);
nfsrv_postopattr(nd, dattr_ret, &dattr);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -551,7 +583,7 @@ nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
if (vnode_vtype(vp) != VLNK) {
if (nd->nd_flag & ND_NFSV2)
@@ -568,12 +600,15 @@ nfsrvd_readlink(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &nva);
if (nd->nd_repstat)
- return (0);
+ goto out;
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
*tl = txdr_unsigned(len);
mbuf_setnext(nd->nd_mb, mp);
nd->nd_mb = mpend;
nd->nd_bpos = NFSMTOD(mpend, caddr_t) + mbuf_len(mpend);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -596,7 +631,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
@@ -672,7 +707,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
if (off >= nva.na_size) {
cnt = 0;
@@ -699,7 +734,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
mbuf_freem(m3);
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &nva);
- return (0);
+ goto out;
}
}
vput(vp);
@@ -724,9 +759,13 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_mb = m2;
nd->nd_bpos = NFSMTOD(m2, caddr_t) + mbuf_len(m2);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -751,7 +790,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
- return (0);
+ goto out;
}
if (nd->nd_flag & ND_NFSV2) {
NFSM_DISSECT(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
@@ -844,7 +883,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
vput(vp);
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
- return (0);
+ goto out;
}
/*
@@ -870,7 +909,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, forat_ret, &forat, aftat_ret, &nva);
if (nd->nd_repstat)
- return (0);
+ goto out;
NFSM_BUILD(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(retlen);
if (stable == NFSWRITE_UNSTABLE)
@@ -886,9 +925,13 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
*tl = txdr_unsigned(nfsboottime.tv_usec);
} else if (!nd->nd_repstat)
nfsrv_fillattr(nd, &nva);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -918,17 +961,14 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
LOCKPARENT | LOCKLEAF | SAVESTART);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
- if (error) {
- vput(dp);
- nfsvno_relpathbuf(&named);
- return (error);
- }
+ if (error)
+ goto nfsmout;
if (!nd->nd_repstat) {
NFSVNO_ATTRINIT(&nva);
if (nd->nd_flag & ND_NFSV2) {
@@ -983,7 +1023,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
&diraft);
}
vput(dp);
- return (0);
+ goto out;
}
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
@@ -1002,7 +1042,7 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
&diraft);
if (dirp)
vrele(dirp);
- return (0);
+ goto out;
}
if (!(nd->nd_flag & ND_NFSV2)) {
@@ -1056,10 +1096,14 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(dp);
nfsvno_relpathbuf(&named);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1088,7 +1132,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
cnflags = (LOCKPARENT | SAVESTART);
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
#ifdef NFS4_ACL_EXTATTR_NAME
aclp = acl_alloc(M_WAITOK);
@@ -1106,13 +1150,8 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
case NFLNK:
error = nfsvno_getsymlink(nd, &nva, p, &pathcp,
&pathlen);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- return (error);
- }
+ if (error)
+ goto nfsmout;
break;
case NFCHR:
case NFBLK:
@@ -1133,38 +1172,22 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
- return (0);
- };
+ goto out;
+ }
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, cnflags);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- nfsvno_relpathbuf(&named);
- if (pathcp)
- FREE(pathcp, M_TEMP);
- return (error);
- }
+ if (error)
+ goto nfsmout;
if (!nd->nd_repstat) {
if (nd->nd_flag & ND_NFSV3) {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
vtyp = nfsv34tov_type(*tl);
}
error = nfsrv_sattr(nd, &nva, &attrbits, aclp, p);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- nfsvno_relpathbuf(&named);
- if (pathcp)
- FREE(pathcp, M_TEMP);
- return (error);
- }
+ if (error)
+ goto nfsmout;
nva.na_type = vtyp;
if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV3) &&
(vtyp == VCHR || vtyp == VBLK)) {
@@ -1193,7 +1216,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
&diraft);
- return (0);
+ goto out;
}
/*
@@ -1223,7 +1246,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
&diraft);
- return (0);
+ goto out;
}
if (dirp)
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
@@ -1236,7 +1259,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
- return (0);
+ goto out;
} else if (vtyp == VLNK) {
nfsrvd_symlinksub(nd, &named, &nva, fhp, vpp, dirp,
&dirfor, &diraft, &diraft_ret, &attrbits,
@@ -1245,7 +1268,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
acl_free(aclp);
#endif
FREE(pathcp, M_TEMP);
- return (0);
+ goto out;
}
}
@@ -1258,7 +1281,7 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred,
p, 1);
if (vpp != NULL && nd->nd_repstat == 0) {
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
*vpp = vp;
} else
vput(vp);
@@ -1284,6 +1307,9 @@ nfsrvd_mknod(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vrele(dp);
@@ -1294,6 +1320,8 @@ nfsmout:
nfsvno_relpathbuf(&named);
if (pathcp)
FREE(pathcp, M_TEMP);
+
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1306,7 +1334,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
{
struct nameidata named;
u_int32_t *tl;
- int error, dirfor_ret = 1, diraft_ret = 1;
+ int error = 0, dirfor_ret = 1, diraft_ret = 1;
vnode_t dirp = NULL;
struct nfsvattr dirfor, diraft;
char *bufp;
@@ -1314,7 +1342,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, DELETE,
LOCKPARENT | LOCKLEAF);
@@ -1323,7 +1351,7 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
if (error) {
vput(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
@@ -1373,7 +1401,10 @@ nfsrvd_remove(struct nfsrv_descript *nd, __unused int isdgram,
txdr_hyper(diraft.na_filerev, tl);
}
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1385,7 +1416,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
struct nfsexstuff *toexp)
{
u_int32_t *tl;
- int error, fdirfor_ret = 1, fdiraft_ret = 1;
+ int error = 0, fdirfor_ret = 1, fdiraft_ret = 1;
int tdirfor_ret = 1, tdiraft_ret = 1;
struct nameidata fromnd, tond;
vnode_t fdirp = NULL, tdirp = NULL, tdp = NULL;
@@ -1398,7 +1429,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
nfsrv_wcc(nd, tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
- return (0);
+ goto out;
}
if (!(nd->nd_flag & ND_NFSV2))
fdirfor_ret = nfsvno_getattr(dp, &fdirfor, nd->nd_cred, p, 1);
@@ -1412,7 +1443,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
if (todp)
vrele(todp);
nfsvno_relpathbuf(&fromnd);
- return (error);
+ goto out;
}
if (nd->nd_flag & ND_NFSV4) {
tdp = todp;
@@ -1424,14 +1455,14 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
vput(dp);
/* todp is always NULL except NFSv4 */
nfsvno_relpathbuf(&fromnd);
- return (error);
+ goto out;
}
nd->nd_cred->cr_uid = nd->nd_saveduid;
nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL, 0, p);
if (tdp) {
tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred,
p, 1);
- NFSVOPUNLOCK(tdp, 0, p);
+ NFSVOPUNLOCK(tdp, 0);
}
}
NFSNAMEICNDSET(&tond.ni_cnd, nd->nd_cred, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART);
@@ -1444,7 +1475,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
vput(dp);
nfsvno_relpathbuf(&fromnd);
nfsvno_relpathbuf(&tond);
- return (error);
+ goto out;
}
}
if (nd->nd_repstat) {
@@ -1459,7 +1490,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
vput(dp);
nfsvno_relpathbuf(&fromnd);
nfsvno_relpathbuf(&tond);
- return (0);
+ goto out;
}
/*
@@ -1478,7 +1509,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
if (tdp)
vrele(tdp);
nfsvno_relpathbuf(&tond);
- return (0);
+ goto out;
}
if (vnode_vtype(fromnd.ni_vp) == VDIR)
tond.ni_cnd.cn_flags |= WILLBEDIR;
@@ -1510,7 +1541,10 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram,
tl += 2;
txdr_hyper(tdiraft.na_filerev, tl);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1534,9 +1568,9 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
if (vnode_vtype(vp) == VDIR) {
if (nd->nd_flag & ND_NFSV4)
nd->nd_repstat = NFSERR_ISDIR;
@@ -1561,12 +1595,12 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
if (error) {
vrele(vp);
/* tovp is always NULL unless NFSv4 */
- return (error);
+ goto out;
}
nfsd_fhtovp(nd, &dfh, LK_EXCLUSIVE, &dp, &tnes, NULL, 0,
p);
if (dp)
- NFSVOPUNLOCK(dp, 0, p);
+ NFSVOPUNLOCK(dp, 0);
}
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
@@ -1579,7 +1613,7 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
if (dp)
vrele(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, &tnes,
@@ -1618,7 +1652,10 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram,
tl += 2;
txdr_hyper(diraft.na_filerev, tl);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1631,14 +1668,14 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
{
struct nfsvattr nva, dirfor, diraft;
struct nameidata named;
- int error, dirfor_ret = 1, diraft_ret = 1, pathlen;
+ int error = 0, dirfor_ret = 1, diraft_ret = 1, pathlen;
vnode_t dirp = NULL;
char *bufp, *pathcp = NULL;
u_long *hashp;
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
if (vpp)
*vpp = NULL;
@@ -1652,7 +1689,7 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
if (error) {
vrele(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, p, &dirp);
@@ -1690,7 +1727,10 @@ nfsrvd_symlink(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1717,7 +1757,7 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
nvap, nd->nd_cred, p, 1);
}
if (vpp != NULL && nd->nd_repstat == 0) {
- VOP_UNLOCK(ndp->ni_vp, 0);
+ NFSVOPUNLOCK(ndp->ni_vp, 0);
*vpp = ndp->ni_vp;
} else
vput(ndp->ni_vp);
@@ -1734,6 +1774,8 @@ nfsrvd_symlinksub(struct nfsrv_descript *nd, struct nameidata *ndp,
txdr_hyper(diraftp->na_filerev, tl);
(void) nfsrv_putattrbit(nd, attrbitp);
}
+
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1747,33 +1789,27 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
struct nfsvattr nva, dirfor, diraft;
struct nameidata named;
u_int32_t *tl;
- int error, dirfor_ret = 1, diraft_ret = 1;
+ int error = 0, dirfor_ret = 1, diraft_ret = 1;
vnode_t dirp = NULL;
char *bufp;
u_long *hashp;
if (nd->nd_repstat) {
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
- return (0);
+ goto out;
}
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
LOCKPARENT | SAVENAME);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
- if (error) {
- vrele(dp);
- nfsvno_relpathbuf(&named);
- return (error);
- }
+ if (error)
+ goto nfsmout;
if (!nd->nd_repstat) {
NFSVNO_ATTRINIT(&nva);
if (nd->nd_flag & ND_NFSV3) {
error = nfsrv_sattr(nd, &nva, NULL, NULL, p);
- if (error) {
- vrele(dp);
- nfsvno_relpathbuf(&named);
- return (error);
- }
+ if (error)
+ goto nfsmout;
} else {
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
nva.na_mode = nfstov_mode(*tl++);
@@ -1798,7 +1834,7 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret,
&diraft);
- return (0);
+ goto out;
}
if (dirp != NULL)
dirfor_ret = nfsvno_getattr(dirp, &dirfor, nd->nd_cred, p, 0);
@@ -1819,10 +1855,14 @@ nfsrvd_mkdir(struct nfsrv_descript *nd, __unused int isdgram,
(void) nfsm_fhtom(nd, (u_int8_t *)fhp, 0, 0);
nfsrv_fillattr(nd, &nva);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vrele(dp);
nfsvno_relpathbuf(&named);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1850,7 +1890,7 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
nd->nd_repstat = nfsvno_getattr(vp, nvap, nd->nd_cred,
p, 1);
if (vpp && !nd->nd_repstat) {
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
*vpp = vp;
} else {
vput(vp);
@@ -1868,6 +1908,8 @@ nfsrvd_mkdirsub(struct nfsrv_descript *nd, struct nameidata *ndp,
txdr_hyper(diraftp->na_filerev, tl);
(void) nfsrv_putattrbit(nd, attrbitp);
}
+
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1884,7 +1926,7 @@ nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_wcc(nd, for_ret, &bfor, aft_ret, &aft);
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
/*
@@ -1907,9 +1949,13 @@ nfsrvd_commit(struct nfsrv_descript *nd, __unused int isdgram,
*tl++ = txdr_unsigned(nfsboottime.tv_sec);
*tl = txdr_unsigned(nfsboottime.tv_usec);
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1929,7 +1975,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
sf = &sfs;
nd->nd_repstat = nfsvno_statfs(vp, sf);
@@ -1938,7 +1984,7 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_flag & ND_NFSV3)
nfsrv_postopattr(nd, getret, &at);
if (nd->nd_repstat)
- return (0);
+ goto out;
if (nd->nd_flag & ND_NFSV2) {
NFSM_BUILD(tl, u_int32_t *, NFSX_V2STATFS);
*tl++ = txdr_unsigned(NFS_V2MAXDATA);
@@ -1965,6 +2011,9 @@ nfsrvd_statfs(struct nfsrv_descript *nd, __unused int isdgram,
txdr_hyper(tval, tl); tl += 2;
*tl = 0;
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -1982,7 +2031,7 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
getret = nfsvno_getattr(vp, &at, nd->nd_cred, p, 1);
nfsvno_getfs(&fs, isdgram);
@@ -2001,6 +2050,9 @@ nfsrvd_fsinfo(struct nfsrv_descript *nd, int isdgram,
txdr_nfsv3time(&fs.fs_timedelta, tl);
tl += 2;
*tl = txdr_unsigned(fs.fs_properties);
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -2018,7 +2070,7 @@ nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nfsrv_postopattr(nd, getret, &at);
- return (0);
+ goto out;
}
nd->nd_repstat = nfsvno_pathconf(vp, _PC_LINK_MAX, &linkmax,
nd->nd_cred, p);
@@ -2049,6 +2101,9 @@ nfsrvd_pathconf(struct nfsrv_descript *nd, __unused int isdgram,
pc->pc_caseinsensitive = newnfs_false;
pc->pc_casepreserving = newnfs_true;
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -2218,11 +2273,13 @@ nfsrvd_lock(struct nfsrv_descript *nd, __unused int isdgram,
(void) nfsm_strtom(nd, cf.cl_owner, cf.cl_ownerlen);
}
vput(vp);
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
if (stp)
free((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2326,11 +2383,13 @@ nfsrvd_lockt(struct nfsrv_descript *nd, __unused int isdgram,
}
}
vput(vp);
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
if (stp)
free((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2424,6 +2483,7 @@ nfsrvd_locku(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2463,11 +2523,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
i = fxdr_unsigned(int, *(tl + 5));
if (i <= 0 || i > NFSV4_OPAQUELIMIT) {
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- return (0);
+ goto nfsmout;
}
MALLOC(stp, struct nfsstate *, sizeof (struct nfsstate) + i,
M_NFSDSTATE, M_WAITOK);
@@ -2516,14 +2572,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_clientid.qval = clientid.qval;
}
error = nfsrv_mtostr(nd, stp->ls_owner, stp->ls_ownerlen);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (error);
- }
+ if (error)
+ goto nfsmout;
NFSVNO_ATTRINIT(&nva);
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
create = fxdr_unsigned(int, *tl);
@@ -2538,14 +2588,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
case NFSCREATE_UNCHECKED:
case NFSCREATE_GUARDED:
error = nfsv4_sattr(nd, &nva, &attrbits, aclp, p);
- if (error) {
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (error);
- }
+ if (error)
+ goto nfsmout;
/*
* If the na_gid being set is the same as that of
* the directory it is going in, clear it, since
@@ -2565,21 +2609,11 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
break;
default:
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
};
} else if (create != NFSV4OPEN_NOCREATE) {
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
}
/*
@@ -2605,12 +2639,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
if (nd->nd_repstat) {
nd->nd_repstat = nfsrv_opencheck(clientid,
&stateid, stp, NULL, nd, p, nd->nd_repstat);
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
}
if (create == NFSV4OPEN_CREATE)
NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
@@ -2627,6 +2656,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
#endif
FREE((caddr_t)stp, M_NFSDSTATE);
nfsvno_relpathbuf(&named);
+ NFSEXITCODE2(error, nd);
return (error);
}
if (!nd->nd_repstat) {
@@ -2676,16 +2706,11 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
break;
default:
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
};
stp->ls_flags |= NFSLCK_RECLAIM;
vp = dp;
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) == 0)
nd->nd_repstat = nfsrv_opencheck(clientid, &stateid,
stp, vp, nd, p, nd->nd_repstat);
@@ -2693,12 +2718,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = NFSERR_PERM;
} else {
nd->nd_repstat = NFSERR_BADXDR;
- vrele(dp);
-#ifdef NFS4_ACL_EXTATTR_NAME
- acl_free(aclp);
-#endif
- FREE((caddr_t)stp, M_NFSDSTATE);
- return (0);
+ goto nfsmout;
}
/*
@@ -2747,7 +2767,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
* (ie: Leave the NFSVOPUNLOCK() about here.)
*/
if (vp)
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
if (stp)
FREE((caddr_t)stp, M_NFSDSTATE);
if (!nd->nd_repstat && dirp)
@@ -2817,6 +2837,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
#ifdef NFS4_ACL_EXTATTR_NAME
acl_free(aclp);
#endif
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vrele(dp);
@@ -2825,6 +2846,7 @@ nfsmout:
#endif
if (stp)
FREE((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2866,9 +2888,11 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int isdgram,
*tl++ = txdr_unsigned(stateid.seqid);
NFSBCOPY((caddr_t)stateid.other,(caddr_t)tl,NFSX_STATEIDOTHER);
}
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2885,7 +2909,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
clientid.lval[0] = *tl++;
@@ -2900,6 +2924,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsrv_delegupdate(clientid, NULL, NULL,
NFSV4OP_DELEGPURGE, nd->nd_cred, p);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2931,6 +2956,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused int isdgram,
NFSV4OP_DELEGRETURN, nd->nd_cred, p);
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2947,6 +2973,7 @@ nfsrvd_getfh(struct nfsrv_descript *nd, __unused int isdgram,
vput(vp);
if (!nd->nd_repstat)
(void) nfsm_fhtom(nd, (u_int8_t *)&fh, 0, 0);
+ NFSEXITCODE2(0, nd);
return (0);
}
@@ -2990,6 +3017,7 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3067,6 +3095,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unused int isdgram,
}
nfsmout:
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3083,7 +3112,7 @@ nfsrvd_renew(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, NFSX_HYPER);
clientid.lval[0] = *tl++;
@@ -3098,6 +3127,7 @@ nfsrvd_renew(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_RENEWOP|CLOPS_RENEW),
NULL, (nfsquad_t)((u_quad_t)0), nd, p);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3115,7 +3145,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
struct nfsrvfh fh;
struct nfsexstuff retnes;
u_int32_t *sizp;
- int error, savflag, i;
+ int error = 0, savflag, i;
char *bufp;
u_long *hashp;
@@ -3129,7 +3159,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
if (error) {
vput(dp);
nfsvno_relpathbuf(&named);
- return (error);
+ goto out;
}
if (!nd->nd_repstat) {
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 1, exp, p, &dirp);
@@ -3140,7 +3170,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
if (dirp)
vrele(dirp);
if (nd->nd_repstat)
- return (0);
+ goto out;
vrele(named.ni_startdir);
nfsvno_relpathbuf(&named);
fh.nfsrvfh_len = NFSX_MYFH;
@@ -3155,7 +3185,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
}
nd->nd_flag = savflag;
if (nd->nd_repstat)
- return (0);
+ goto out;
/*
* Finally have the export flags for name, so we can create
@@ -3198,7 +3228,10 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram,
}
}
*sizp = txdr_unsigned(len);
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -3218,7 +3251,7 @@ nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto out;
}
NFSM_DISSECT(tl, u_int32_t *, NFSX_VERF + NFSX_UNSIGNED);
verf = (u_char *)tl;
@@ -3226,7 +3259,7 @@ nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
i = fxdr_unsigned(int, *tl);
if (i > NFSV4_OPAQUELIMIT || i <= 0) {
nd->nd_repstat = NFSERR_BADXDR;
- return (error);
+ goto nfsmout;
}
idlen = i;
if (nd->nd_flag & ND_GSS)
@@ -3302,6 +3335,9 @@ nfsrvd_setclientid(struct nfsrv_descript *nd, __unused int isdgram,
*tl++ = confirm.lval[0];
*tl = confirm.lval[1];
}
+
+out:
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (clp) {
@@ -3309,6 +3345,7 @@ nfsmout:
NFSFREEMUTEX(&clp->lc_req.nr_mtx);
free((caddr_t)clp, M_NFSDCLIENT);
}
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3326,7 +3363,7 @@ nfsrvd_setclientidcfrm(struct nfsrv_descript *nd,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_HYPER);
clientid.lval[0] = *tl++;
@@ -3341,6 +3378,7 @@ nfsrvd_setclientidcfrm(struct nfsrv_descript *nd,
nd->nd_repstat = nfsrv_getclient(clientid, (CLOPS_CONFIRM|CLOPS_RENEW),
NULL, confirm, nd, p);
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3377,6 +3415,7 @@ nfsrvd_verify(struct nfsrv_descript *nd, int isdgram,
}
}
vput(vp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3396,6 +3435,7 @@ nfsrvd_openattr(struct nfsrv_descript *nd, __unused int isdgram,
nd->nd_repstat = NFSERR_NOTSUPP;
nfsmout:
vrele(dp);
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3413,13 +3453,13 @@ nfsrvd_releaselckown(struct nfsrv_descript *nd, __unused int isdgram,
if (nfs_rootfhset == 0 || nfsd_checkrootexp(nd) != 0) {
nd->nd_repstat = NFSERR_WRONGSEC;
- return (0);
+ goto nfsmout;
}
NFSM_DISSECT(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
len = fxdr_unsigned(int, *(tl + 2));
if (len <= 0 || len > NFSV4_OPAQUELIMIT) {
nd->nd_repstat = NFSERR_BADXDR;
- return (0);
+ goto nfsmout;
}
MALLOC(stp, struct nfsstate *, sizeof (struct nfsstate) + len,
M_NFSDSTATE, M_WAITOK);
@@ -3441,9 +3481,12 @@ nfsrvd_releaselckown(struct nfsrv_descript *nd, __unused int isdgram,
goto nfsmout;
nd->nd_repstat = nfsrv_releaselckown(stp, clientid, p);
FREE((caddr_t)stp, M_NFSDSTATE);
+
+ NFSEXITCODE2(0, nd);
return (0);
nfsmout:
if (stp)
free((caddr_t)stp, M_NFSDSTATE);
+ NFSEXITCODE2(error, nd);
return (error);
}
diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsdsocket.c
index 7007275..eaeb1dc 100644
--- a/sys/fs/nfsserver/nfs_nfsdsocket.c
+++ b/sys/fs/nfsserver/nfs_nfsdsocket.c
@@ -376,7 +376,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
if (error != EBADRPC)
printf("nfs dorpc err1=%d\n", error);
nd->nd_repstat = NFSERR_GARBAGE;
- return;
+ goto out;
}
if (nd->nd_procnum == NFSPROC_READ ||
nd->nd_procnum == NFSPROC_READDIR ||
@@ -393,7 +393,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
nfsd_fhtovp(nd, &fh, lktype, &vp, &nes,
&mp, nfs_writerpc[nd->nd_procnum], p);
if (nd->nd_repstat == NFSERR_PROGNOTV4)
- return;
+ goto out;
}
}
@@ -416,7 +416,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
NFSINCRGLOBAL(newnfsstats.srvrpccnt[nfsv3to4op[nd->nd_procnum]]);
if (mp != NULL && nfs_writerpc[nd->nd_procnum] != 0)
vn_finished_write(mp);
- return;
+ goto out;
}
/*
@@ -430,7 +430,7 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
} else {
if (nfs_retfh[nd->nd_procnum] == 1) {
if (vp)
- NFSVOPUNLOCK(vp, 0, p);
+ NFSVOPUNLOCK(vp, 0);
error = (*(nfsrv3_procs1[nd->nd_procnum]))(nd, isdgram,
vp, NULL, (fhandle_t *)fh.nfsrvfh_data, p, &nes);
} else if (nfs_retfh[nd->nd_procnum] == 2) {
@@ -469,6 +469,9 @@ nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram,
nd->nd_repstat == NFSERR_GRACE ||
nd->nd_repstat == NFSERR_NOGRACE))
nd->nd_flag &= ~ND_SAVEREPLY;
+
+out:
+ NFSEXITCODE2(0, nd);
}
/*
@@ -705,7 +708,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(vp);
vp = nvp;
cur_fsid = vp->v_mount->mnt_stat.f_fsid;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vpnes = nes;
}
break;
@@ -720,7 +723,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(vp);
vp = nvp;
cur_fsid = vp->v_mount->mnt_stat.f_fsid;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vpnes = nes;
}
break;
@@ -733,7 +736,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(vp);
vp = nvp;
cur_fsid = vp->v_mount->mnt_stat.f_fsid;
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
vpnes = nes;
}
} else
@@ -786,6 +789,8 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
op != NFSV4OP_LOOKUP &&
op != NFSV4OP_GETATTR &&
op != NFSV4OP_GETFH &&
+ op != NFSV4OP_ACCESS &&
+ op != NFSV4OP_READLINK &&
op != NFSV4OP_SECINFO)
nd->nd_repstat = NFSERR_NOFILEHANDLE;
else if (nfsvno_testexp(nd, &vpnes) &&
@@ -838,7 +843,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
}
}
/* Lookup ops return a locked vnode */
- VOP_UNLOCK(nvp, 0);
+ NFSVOPUNLOCK(nvp, 0);
}
if (!nd->nd_repstat) {
vrele(vp);
@@ -859,7 +864,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
}
if (nfsv4_opflag[op].modifyfs)
vn_start_write(savevp, &temp_mp, V_WAIT);
- if (vn_lock(savevp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(savevp, LK_EXCLUSIVE) == 0) {
VREF(vp);
VREF(savevp);
error = (*(nfsrv4_ops2[op]))(nd, isdgram,
@@ -876,7 +881,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
if (nfsv4_opflag[op].modifyfs)
vn_start_write(vp, &temp_mp,
V_WAIT);
- if (vn_lock(vp, nfsv4_opflag[op].lktype)
+ if (NFSVOPLOCK(vp, nfsv4_opflag[op].lktype)
== 0)
VREF(vp);
else
@@ -944,4 +949,6 @@ nfsmout:
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
NFSUNLOCKV4ROOTMUTEX();
+
+ NFSEXITCODE2(0, nd);
}
diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c
index fc84d72..bd246d5 100644
--- a/sys/fs/nfsserver/nfs_nfsdstate.c
+++ b/sys/fs/nfsserver/nfs_nfsdstate.c
@@ -135,7 +135,7 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
nfsquad_t *clientidp, nfsquad_t *confirmp, NFSPROC_T *p)
{
struct nfsclient *clp = NULL, *new_clp = *new_clpp;
- int i;
+ int i, error = 0;
struct nfsstate *stp, *tstp;
struct sockaddr_in *sad, *rad;
int zapit = 0, gotit, hasstate = 0, igotlock;
@@ -144,8 +144,10 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
/*
* Check for state resource limit exceeded.
*/
- if (nfsrv_openpluslock > NFSRV_V4STATELIMIT)
- return (NFSERR_RESOURCE);
+ if (nfsrv_openpluslock > NFSRV_V4STATELIMIT) {
+ error = NFSERR_RESOURCE;
+ goto out;
+ }
if (nfsrv_issuedelegs == 0 ||
((nd->nd_flag & ND_GSS) != 0 && nfsrv_nogsscallback != 0))
@@ -228,7 +230,7 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
if (zapit)
nfsrv_zapclient(clp, p);
*new_clpp = NULL;
- return (0);
+ goto out;
}
/*
@@ -274,7 +276,8 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
- return (NFSERR_CLIDINUSE);
+ error = NFSERR_CLIDINUSE;
+ goto out;
}
}
@@ -335,7 +338,7 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
}
nfsrv_zapclient(clp, p);
*new_clpp = NULL;
- return (0);
+ goto out;
}
/*
* id and verifier match, so update the net address info
@@ -388,7 +391,10 @@ nfsrv_setclient(struct nfsrv_descript *nd, struct nfsclient **new_clpp,
}
nfsrv_zapclient(clp, p);
*new_clpp = NULL;
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -406,8 +412,10 @@ nfsrv_getclient(nfsquad_t clientid, int opflags, struct nfsclient **clpp,
if (clpp)
*clpp = NULL;
- if (nfsrvboottime != clientid.lval[0])
- return (NFSERR_STALECLIENTID);
+ if (nfsrvboottime != clientid.lval[0]) {
+ error = NFSERR_STALECLIENTID;
+ goto out;
+ }
/*
* If called with opflags == CLOPS_RENEW, the State Lock is
@@ -450,7 +458,7 @@ nfsrv_getclient(nfsquad_t clientid, int opflags, struct nfsclient **clpp,
} else if (opflags != CLOPS_RENEW) {
NFSUNLOCKSTATE();
}
- return (error);
+ goto out;
}
/*
@@ -526,6 +534,9 @@ nfsrv_getclient(nfsquad_t clientid, int opflags, struct nfsclient **clpp,
}
if (clpp)
*clpp = clp;
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -537,7 +548,7 @@ APPLESTATIC int
nfsrv_adminrevoke(struct nfsd_clid *revokep, NFSPROC_T *p)
{
struct nfsclient *clp = NULL;
- int i;
+ int i, error = 0;
int gotit, igotlock;
/*
@@ -570,7 +581,8 @@ nfsrv_adminrevoke(struct nfsd_clid *revokep, NFSPROC_T *p)
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 0);
NFSUNLOCKV4ROOTMUTEX();
- return (EPERM);
+ error = EPERM;
+ goto out;
}
/*
@@ -590,7 +602,10 @@ nfsrv_adminrevoke(struct nfsd_clid *revokep, NFSPROC_T *p)
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 0);
NFSUNLOCKV4ROOTMUTEX();
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -1229,6 +1244,7 @@ nfsrv_getstate(struct nfsclient *clp, nfsv4stateid_t *stateidp, __unused u_int32
{
struct nfsstate *stp;
struct nfsstatehead *hp;
+ int error = 0;
*stpp = NULL;
hp = NFSSTATEHASH(clp, *stateidp);
@@ -1241,10 +1257,15 @@ nfsrv_getstate(struct nfsclient *clp, nfsv4stateid_t *stateidp, __unused u_int32
/*
* If no state id in list, return NFSERR_BADSTATEID.
*/
- if (stp == LIST_END(hp))
- return (NFSERR_BADSTATEID);
+ if (stp == LIST_END(hp)) {
+ error = NFSERR_BADSTATEID;
+ goto out;
+ }
*stpp = stp;
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -1323,14 +1344,16 @@ nfsrv_lockctrl(vnode_t vp, struct nfsstate **new_stpp,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, specialid);
if (error)
- return (error);
+ goto out;
/*
* Check for state resource limit exceeded.
*/
if ((new_stp->ls_flags & NFSLCK_LOCK) &&
- nfsrv_openpluslock > NFSRV_V4STATELIMIT)
- return (NFSERR_RESOURCE);
+ nfsrv_openpluslock > NFSRV_V4STATELIMIT) {
+ error = NFSERR_RESOURCE;
+ goto out;
+ }
/*
* For the lock case, get another nfslock structure,
@@ -1546,14 +1569,7 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
- if (other_lop)
- FREE((caddr_t)other_lop, M_NFSDLOCK);
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (error);
+ goto out;
}
/*
@@ -1582,15 +1598,7 @@ tryagain:
error = NFSERR_BADSTATEID;
}
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- /*
- * Called to lock or unlock, so the lock has gone away.
- */
- return (error);
+ goto out;
}
/*
@@ -1638,14 +1646,8 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
- if (other_lop)
- FREE((caddr_t)other_lop, M_NFSDLOCK);
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (NFSERR_OPENMODE);
+ error = NFSERR_OPENMODE;
+ goto out;
}
} else
mystp = NULL;
@@ -1670,27 +1672,18 @@ tryagain:
}
if (ret == 0)
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
if (ret == 2)
- return (NFSERR_PERM);
+ error = NFSERR_PERM;
else
- return (NFSERR_OPENMODE);
+ error = NFSERR_OPENMODE;
+ goto out;
}
}
}
/* We're outta here */
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
}
@@ -1708,18 +1701,14 @@ tryagain:
lckstp = NULL;
goto tryagain;
}
- return (ret);
+ error = ret;
+ goto out;
}
if (!(new_stp->ls_flags & NFSLCK_CHECK) ||
(LIST_EMPTY(&lfp->lf_open) && LIST_EMPTY(&lfp->lf_lock) &&
LIST_EMPTY(&lfp->lf_deleg))) {
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
}
@@ -1773,7 +1762,8 @@ tryagain:
lckstp = NULL;
goto tryagain;
}
- return (ret);
+ error = ret;
+ goto out;
}
/* Never gets here. */
}
@@ -1801,12 +1791,7 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
/*
@@ -1877,12 +1862,7 @@ tryagain:
}
if (ret == 0)
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (error);
+ goto out;
}
}
}
@@ -1892,12 +1872,7 @@ tryagain:
*/
if (new_stp->ls_flags & (NFSLCK_TEST | NFSLCK_CHECK)) {
NFSUNLOCKSTATE();
- if (haslock) {
- NFSLOCKV4ROOTMUTEX();
- nfsv4_unlock(&nfsv4rootfs_lock, 1);
- NFSUNLOCKV4ROOTMUTEX();
- }
- return (0);
+ goto out;
}
/*
@@ -1950,6 +1925,8 @@ tryagain:
nfsrv_unlocklf(lfp);
}
NFSUNLOCKSTATE();
+
+out:
if (haslock) {
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 1);
@@ -1957,7 +1934,8 @@ tryagain:
}
if (other_lop)
FREE((caddr_t)other_lop, M_NFSDLOCK);
- return (0);
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1974,7 +1952,7 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
struct nfsclient *clp;
struct nfsstate *ownerstp;
struct nfslockfile *lfp, *new_lfp;
- int error, haslock = 0, ret, readonly = 0, getfhret = 0;
+ int error = 0, haslock = 0, ret, readonly = 0, getfhret = 0;
if ((new_stp->ls_flags & NFSLCK_SHAREBITS) == NFSLCK_READACCESS)
readonly = 1;
@@ -1984,7 +1962,7 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, 0);
if (error)
- return (error);
+ goto out;
/*
* Check for state resource limit exceeded.
@@ -1993,8 +1971,10 @@ nfsrv_opencheck(nfsquad_t clientid, nfsv4stateid_t *stateidp,
* returns NFSERR_RESOURCE and the limit is just a rather
* arbitrary high water mark, so no harm is done.
*/
- if (nfsrv_openpluslock > NFSRV_V4STATELIMIT)
- return (NFSERR_RESOURCE);
+ if (nfsrv_openpluslock > NFSRV_V4STATELIMIT) {
+ error = NFSERR_RESOURCE;
+ goto out;
+ }
tryagain:
MALLOC(new_lfp, struct nfslockfile *, sizeof (struct nfslockfile),
@@ -2052,7 +2032,7 @@ tryagain:
NFSUNLOCKV4ROOTMUTEX();
}
free((caddr_t)new_lfp, M_NFSDLOCKFILE);
- return (error);
+ goto out;
}
/*
@@ -2062,7 +2042,7 @@ tryagain:
if (vp == NULL) {
NFSUNLOCKSTATE();
FREE((caddr_t)new_lfp, M_NFSDLOCKFILE);
- return (0);
+ goto out;
}
/*
@@ -2082,7 +2062,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
/*
@@ -2113,7 +2093,8 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
}
@@ -2148,7 +2129,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
}
@@ -2189,7 +2170,8 @@ tryagain:
*/
if (ret == -1)
goto tryagain;
- return (ret);
+ error = ret;
+ goto out;
}
}
stp = nstp;
@@ -2201,7 +2183,10 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (0);
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -2218,7 +2203,7 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
struct nfsstate *openstp = NULL, *new_open, *ownerstp, *new_deleg;
struct nfslockfile *lfp, *new_lfp;
struct nfsclient *clp;
- int error, haslock = 0, ret, delegate = 1, writedeleg = 1;
+ int error = 0, haslock = 0, ret, delegate = 1, writedeleg = 1;
int readonly = 0, cbret = 1, getfhret = 0;
if ((new_stp->ls_flags & NFSLCK_SHAREBITS) == NFSLCK_READACCESS)
@@ -2234,7 +2219,8 @@ nfsrv_openctrl(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
printf("Nfsd: openctrl unexpected restart err=%d\n",
error);
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
tryagain:
@@ -2305,7 +2291,8 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
if (new_stp->ls_flags & NFSLCK_RECLAIM)
@@ -2332,7 +2319,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
/*
@@ -2366,7 +2353,8 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_EXPIRED);
+ error = NFSERR_EXPIRED;
+ goto out;
}
/*
@@ -2431,7 +2419,7 @@ tryagain:
free((caddr_t)new_open, M_NFSDSTATE);
free((caddr_t)new_deleg, M_NFSDSTATE);
printf("nfsd openctrl unexpected client cnfl\n");
- return (error);
+ goto out;
}
}
}
@@ -2482,7 +2470,8 @@ tryagain:
openstp = NULL;
goto tryagain;
}
- return (ret);
+ error = ret;
+ goto out;
}
}
}
@@ -2855,6 +2844,9 @@ tryagain:
FREE((caddr_t)new_open, M_NFSDSTATE);
if (new_deleg)
FREE((caddr_t)new_deleg, M_NFSDSTATE);
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -2869,7 +2861,7 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
struct nfsclient *clp;
struct nfslockfile *lfp;
u_int32_t bits;
- int error, gotstate = 0, len = 0;
+ int error = 0, gotstate = 0, len = 0;
u_char client[NFSV4_OPAQUELIMIT];
/*
@@ -2878,7 +2870,7 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, 0);
if (error)
- return (error);
+ goto out;
NFSLOCKSTATE();
/*
@@ -2925,7 +2917,7 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
nfsrv_nootherstate(stp))
nfsrv_freeopenowner(stp->ls_openowner, 0, p);
NFSUNLOCKSTATE();
- return (error);
+ goto out;
}
/*
@@ -2978,7 +2970,8 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
bits = (new_stp->ls_flags & NFSLCK_SHAREBITS);
if (~(stp->ls_flags) & bits) {
NFSUNLOCKSTATE();
- return (NFSERR_INVAL);
+ error = NFSERR_INVAL;
+ goto out;
}
stp->ls_flags = (bits | NFSLCK_OPEN);
stp->ls_stateid.seqid++;
@@ -2993,6 +2986,9 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
nfsrv_writestable(client, len, NFSNST_NEWSTATE, p);
nfsrv_backupstable();
}
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3005,7 +3001,7 @@ nfsrv_delegupdate(nfsquad_t clientid, nfsv4stateid_t *stateidp,
{
struct nfsstate *stp;
struct nfsclient *clp;
- int error;
+ int error = 0;
fhandle_t fh;
/*
@@ -3014,7 +3010,7 @@ nfsrv_delegupdate(nfsquad_t clientid, nfsv4stateid_t *stateidp,
if (vp) {
error = nfsvno_getfh(vp, &fh, p);
if (error)
- return (error);
+ goto out;
}
/*
* Check for restart conditions (client and server).
@@ -3050,25 +3046,31 @@ nfsrv_delegupdate(nfsquad_t clientid, nfsv4stateid_t *stateidp,
*/
if (error == NFSERR_EXPIRED && op == NFSV4OP_DELEGPURGE) {
NFSUNLOCKSTATE();
- return (0);
+ error = 0;
+ goto out;
}
if (error) {
NFSUNLOCKSTATE();
- return (error);
+ goto out;
}
if (op == NFSV4OP_DELEGRETURN) {
if (NFSBCMP((caddr_t)&fh, (caddr_t)&stp->ls_lfp->lf_fh,
sizeof (fhandle_t))) {
NFSUNLOCKSTATE();
- return (NFSERR_BADSTATEID);
+ error = NFSERR_BADSTATEID;
+ goto out;
}
nfsrv_freedeleg(stp);
} else {
nfsrv_freedeleglist(&clp->lc_olddeleg);
}
NFSUNLOCKSTATE();
- return (0);
+ error = 0;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3080,7 +3082,7 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
{
struct nfsstate *stp, *nstp, *openstp, *ownstp;
struct nfsclient *clp;
- int error;
+ int error = 0;
/*
* Check for restart conditions (client and server).
@@ -3088,7 +3090,7 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
error = nfsrv_checkrestart(clientid, new_stp->ls_flags,
&new_stp->ls_stateid, 0);
if (error)
- return (error);
+ goto out;
NFSLOCKSTATE();
/*
@@ -3098,7 +3100,7 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
(nfsquad_t)((u_quad_t)0), NULL, p);
if (error) {
NFSUNLOCKSTATE();
- return (error);
+ goto out;
}
LIST_FOREACH(ownstp, &clp->lc_open, ls_list) {
LIST_FOREACH(openstp, &ownstp->ls_open, ls_list) {
@@ -3116,7 +3118,8 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
nfsrv_freelockowner(stp, NULL, 0, p);
} else {
NFSUNLOCKSTATE();
- return (NFSERR_LOCKSHELD);
+ error = NFSERR_LOCKSHELD;
+ goto out;
}
}
stp = nstp;
@@ -3124,7 +3127,10 @@ nfsrv_releaselckown(struct nfsstate *new_stp, nfsquad_t clientid,
}
}
NFSUNLOCKSTATE();
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3151,6 +3157,7 @@ nfsrv_getlockfh(vnode_t vp, u_short flags,
panic("nfsrv_getlockfh");
}
error = nfsvno_getfh(vp, fhp, p);
+ NFSEXITCODE(error);
return (error);
}
@@ -3406,6 +3413,7 @@ static int
nfsrv_checkseqid(struct nfsrv_descript *nd, u_int32_t seqid,
struct nfsstate *stp, struct nfsrvcache *op)
{
+ int error = 0;
if (op != nd->nd_rp)
panic("nfsrvstate checkseqid");
@@ -3421,20 +3429,27 @@ nfsrv_checkseqid(struct nfsrv_descript *nd, u_int32_t seqid,
stp->ls_op = op;
nfsrvd_refcache(op);
stp->ls_seq = seqid;
- return (0);
+ goto out;
} else if (stp->ls_seq == seqid && stp->ls_op &&
op->rc_xid == stp->ls_op->rc_xid &&
op->rc_refcnt == 0 &&
op->rc_reqlen == stp->ls_op->rc_reqlen &&
op->rc_cksum == stp->ls_op->rc_cksum) {
- if (stp->ls_op->rc_flag & RC_INPROG)
- return (NFSERR_DONTREPLY);
+ if (stp->ls_op->rc_flag & RC_INPROG) {
+ error = NFSERR_DONTREPLY;
+ goto out;
+ }
nd->nd_rp = stp->ls_op;
nd->nd_rp->rc_flag |= RC_INPROG;
nfsrvd_delcache(op);
- return (NFSERR_REPLYFROMCACHE);
+ error = NFSERR_REPLYFROMCACHE;
+ goto out;
}
- return (NFSERR_BADSEQID);
+ error = NFSERR_BADSEQID;
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -3558,6 +3573,7 @@ nfsrv_getclientipaddr(struct nfsrv_descript *nd, struct nfsclient *clp)
clp->lc_program = 0;
}
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -3590,7 +3606,7 @@ static int
nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
nfsv4stateid_t *stateidp, int specialid)
{
- int ret;
+ int ret = 0;
/*
* First check for a server restart. Open, LockT, ReleaseLockOwner
@@ -3598,11 +3614,15 @@ nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
*/
if (flags &
(NFSLCK_OPEN | NFSLCK_TEST | NFSLCK_RELEASE | NFSLCK_DELEGPURGE)) {
- if (clientid.lval[0] != nfsrvboottime)
- return (NFSERR_STALECLIENTID);
+ if (clientid.lval[0] != nfsrvboottime) {
+ ret = NFSERR_STALECLIENTID;
+ goto out;
+ }
} else if (stateidp->other[0] != nfsrvboottime &&
- specialid == 0)
- return (NFSERR_STALESTATEID);
+ specialid == 0) {
+ ret = NFSERR_STALESTATEID;
+ goto out;
+ }
/*
* Read, Write, Setattr and LockT can return NFSERR_GRACE and do
@@ -3610,11 +3630,14 @@ nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
* (The others will be checked, as required, later.)
*/
if (!(flags & (NFSLCK_CHECK | NFSLCK_TEST)))
- return (0);
+ goto out;
NFSLOCKSTATE();
ret = nfsrv_checkgrace(flags);
NFSUNLOCKSTATE();
+
+out:
+ NFSEXITCODE(ret);
return (ret);
}
@@ -3624,13 +3647,18 @@ nfsrv_checkrestart(nfsquad_t clientid, u_int32_t flags,
static int
nfsrv_checkgrace(u_int32_t flags)
{
+ int error = 0;
if (nfsrv_stablefirst.nsf_flags & NFSNSF_GRACEOVER) {
- if (flags & NFSLCK_RECLAIM)
- return (NFSERR_NOGRACE);
+ if (flags & NFSLCK_RECLAIM) {
+ error = NFSERR_NOGRACE;
+ goto out;
+ }
} else {
- if (!(flags & NFSLCK_RECLAIM))
- return (NFSERR_GRACE);
+ if (!(flags & NFSLCK_RECLAIM)) {
+ error = NFSERR_GRACE;
+ goto out;
+ }
/*
* If grace is almost over and we are still getting Reclaims,
@@ -3641,7 +3669,10 @@ nfsrv_checkgrace(u_int32_t flags)
nfsrv_stablefirst.nsf_eograce = NFSD_MONOSEC +
NFSRV_LEASEDELTA;
}
- return (0);
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -3790,6 +3821,8 @@ nfsrv_docallback(struct nfsclient *clp, int procnum,
} else {
NFSUNLOCKSTATE();
}
+
+ NFSEXITCODE(error);
return (error);
}
@@ -4096,10 +4129,10 @@ nfsrv_updatestable(NFSPROC_T *p)
NFSVNO_SETATTRVAL(&nva, size, 0);
vp = NFSFPVNODE(sf->nsf_fp);
vn_start_write(vp, &mp, V_WAIT);
- if (vn_lock(vp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(vp, LK_EXCLUSIVE) == 0) {
error = nfsvno_setattr(vp, &nva, NFSFPCRED(sf->nsf_fp), p,
NULL);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else
error = EPERM;
vn_finished_write(mp);
@@ -4231,7 +4264,7 @@ nfsrv_checkstable(struct nfsclient *clp)
* Return 0 to indicate the conflict can't be revoked and 1 to indicate
* the revocation worked and the conflicting client is "bye, bye", so it
* can be tried again.
- * Return 2 to indicate that the vnode is VI_DOOMED after vn_lock().
+ * Return 2 to indicate that the vnode is VI_DOOMED after NFSVOPLOCK().
* Unlocks State before a non-zero value is returned.
*/
static int
@@ -4248,8 +4281,8 @@ nfsrv_clientconflict(struct nfsclient *clp, int *haslockp, vnode_t vp,
return (0);
if (*haslockp == 0) {
NFSUNLOCKSTATE();
- lktype = VOP_ISLOCKED(vp);
- VOP_UNLOCK(vp, 0);
+ lktype = NFSVOPISLOCKED(vp);
+ NFSVOPUNLOCK(vp, 0);
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
do {
@@ -4258,7 +4291,7 @@ nfsrv_clientconflict(struct nfsclient *clp, int *haslockp, vnode_t vp,
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
- vn_lock(vp, lktype | LK_RETRY);
+ NFSVOPLOCK(vp, lktype | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) != 0)
return (2);
else
@@ -4317,7 +4350,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
if (clp->lc_delegtime < NFSD_MONOSEC) {
nfsrv_freedeleg(stp);
NFSUNLOCKSTATE();
- return (-1);
+ error = -1;
+ goto out;
}
NFSUNLOCKSTATE();
/*
@@ -4332,7 +4366,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_DELAY);
+ error = NFSERR_DELAY;
+ goto out;
}
/*
@@ -4388,7 +4423,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
retrycnt++;
} while ((error == NFSERR_BADSTATEID ||
error == NFSERR_BADHANDLE) && retrycnt < NFSV4_CBRETRYCNT);
- return (NFSERR_DELAY);
+ error = NFSERR_DELAY;
+ goto out;
}
if (clp->lc_expiry >= NFSD_MONOSEC &&
@@ -4404,7 +4440,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (NFSERR_DELAY);
+ error = NFSERR_DELAY;
+ goto out;
}
/*
@@ -4416,8 +4453,8 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
*/
if (*haslockp == 0) {
NFSUNLOCKSTATE();
- lktype = VOP_ISLOCKED(vp);
- VOP_UNLOCK(vp, 0);
+ lktype = NFSVOPISLOCKED(vp);
+ NFSVOPUNLOCK(vp, 0);
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
do {
@@ -4426,15 +4463,17 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
- vn_lock(vp, lktype | LK_RETRY);
+ NFSVOPLOCK(vp, lktype | LK_RETRY);
if ((vp->v_iflag & VI_DOOMED) != 0) {
*haslockp = 0;
NFSLOCKV4ROOTMUTEX();
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
- return (NFSERR_PERM);
+ error = NFSERR_PERM;
+ goto out;
}
- return (-1);
+ error = -1;
+ goto out;
}
NFSUNLOCKSTATE();
@@ -4459,7 +4498,11 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
}
if (zapped_clp)
nfsrv_zapclient(clp, p);
- return (-1);
+ error = -1;
+
+out:
+ NFSEXITCODE(error);
+ return (error);
}
/*
@@ -4491,8 +4534,8 @@ tryagain:
NFSUNLOCKV4ROOTMUTEX();
}
if (error == -1)
- return (0);
- return (error);
+ error = 0;
+ goto out;
}
/*
@@ -4511,7 +4554,7 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
- return (error);
+ goto out;
}
/*
@@ -4532,6 +4575,9 @@ tryagain:
nfsv4_unlock(&nfsv4rootfs_lock, 1);
NFSUNLOCKV4ROOTMUTEX();
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
@@ -4549,7 +4595,7 @@ nfsrv_cleandeleg(vnode_t vp, struct nfslockfile *lfp,
struct nfsclient *clp, int *haslockp, NFSPROC_T *p)
{
struct nfsstate *stp, *nstp;
- int ret;
+ int ret = 0;
stp = LIST_FIRST(&lfp->lf_deleg);
while (stp != LIST_END(&lfp->lf_deleg)) {
@@ -4561,12 +4607,14 @@ nfsrv_cleandeleg(vnode_t vp, struct nfslockfile *lfp,
* nfsrv_delegconflict() unlocks state
* when it returns non-zero.
*/
- return (ret);
+ goto out;
}
}
stp = nstp;
}
- return (0);
+out:
+ NFSEXITCODE(ret);
+ return (ret);
}
/*
@@ -4610,7 +4658,7 @@ nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
nfsrv_issuedelegs == 0)
return;
- KASSERT((VOP_ISLOCKED(vp) != LK_EXCLUSIVE), ("vp %p is locked", vp));
+ KASSERT((NFSVOPISLOCKED(vp) != LK_EXCLUSIVE), ("vp %p is locked", vp));
/*
* First, get a reference on the nfsv4rootfs_lock so that an
* exclusive lock cannot be acquired by another thread.
@@ -4626,9 +4674,9 @@ nfsd_recalldelegation(vnode_t vp, NFSPROC_T *p)
NFSGETNANOTIME(&mytime);
starttime = (u_int32_t)mytime.tv_sec;
do {
- if (vn_lock(vp, LK_EXCLUSIVE) == 0) {
+ if (NFSVOPLOCK(vp, LK_EXCLUSIVE) == 0) {
error = nfsrv_checkremove(vp, 0, p);
- VOP_UNLOCK(vp, 0);
+ NFSVOPUNLOCK(vp, 0);
} else
error = EPERM;
if (error == NFSERR_DELAY) {
@@ -4700,7 +4748,7 @@ nfsrv_checksetattr(vnode_t vp, struct nfsrv_descript *nd,
NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_ACL))
stp->ls_flags |= NFSLCK_SETATTR;
if (stp->ls_flags == 0)
- return (0);
+ goto out;
lop->lo_end = NFS64BITSSET;
lop->lo_flags = NFSLCK_WRITE;
stp->ls_ownerlen = 0;
@@ -4712,6 +4760,9 @@ nfsrv_checksetattr(vnode_t vp, struct nfsrv_descript *nd,
stp->ls_stateid.other[2] = stateidp->other[2];
error = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid,
stateidp, exp, nd, p);
+
+out:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -4731,13 +4782,13 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
struct nfsclient *clp;
struct nfsvattr nva;
fhandle_t nfh;
- int error;
+ int error = 0;
nfsattrbit_t cbbits;
u_quad_t delegfilerev;
NFSCBGETATTR_ATTRBIT(attrbitp, &cbbits);
if (!NFSNONZERO_ATTRBIT(&cbbits))
- return (0);
+ goto out;
/*
* Get the lock file structure.
@@ -4750,8 +4801,8 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
if (error) {
NFSUNLOCKSTATE();
if (error == -1)
- return (0);
- return (error);
+ error = 0;
+ goto out;
}
/*
@@ -4763,7 +4814,7 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
}
if (stp == LIST_END(&lfp->lf_deleg)) {
NFSUNLOCKSTATE();
- return (0);
+ goto out;
}
clp = stp->ls_clp;
delegfilerev = stp->ls_filerev;
@@ -4783,7 +4834,7 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
clp->lc_clientid.qval == nd->nd_clientid.qval) ||
nfsaddr2_match(clp->lc_req.nr_nam, nd->nd_nam)) {
NFSUNLOCKSTATE();
- return (0);
+ goto out;
}
/*
@@ -4814,7 +4865,11 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t vp,
} else {
NFSUNLOCKSTATE();
}
- return (0);
+ error = 0;
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -4997,6 +5052,8 @@ nfsrv_locallock(vnode_t vp, struct nfslockfile *lfp, int flags,
/* handle fragment past end of list */
error = nfsrv_dolocal(vp, lfp, flags, NFSLCK_UNLOCK, first,
end, cfp, p);
+
+ NFSEXITCODE(error);
return (error);
}
@@ -5079,7 +5136,7 @@ nfsrv_dolocal(vnode_t vp, struct nfslockfile *lfp, int flags, int oldflags,
uint64_t first, uint64_t end, struct nfslockconflict *cfp, NFSPROC_T *p)
{
struct nfsrollback *rlp;
- int error, ltype, oldltype;
+ int error = 0, ltype, oldltype;
if (flags & NFSLCK_WRITE)
ltype = F_WRLCK;
@@ -5095,7 +5152,7 @@ nfsrv_dolocal(vnode_t vp, struct nfslockfile *lfp, int flags, int oldflags,
oldltype = F_UNLCK;
if (ltype == oldltype || (oldltype == F_WRLCK && ltype == F_RDLCK))
/* nothing to do */
- return (0);
+ goto out;
error = nfsvno_advlock(vp, ltype, first, end, p);
if (error != 0) {
if (cfp != NULL) {
@@ -5116,6 +5173,9 @@ nfsrv_dolocal(vnode_t vp, struct nfslockfile *lfp, int flags, int oldflags,
rlp->rlck_type = oldltype;
LIST_INSERT_HEAD(&lfp->lf_rollback, rlp, rlck_list);
}
+
+out:
+ NFSEXITCODE(error);
return (error);
}
diff --git a/sys/fs/nfsserver/nfs_nfsdsubs.c b/sys/fs/nfsserver/nfs_nfsdsubs.c
index 252eb0d..bd92c3f 100644
--- a/sys/fs/nfsserver/nfs_nfsdsubs.c
+++ b/sys/fs/nfsserver/nfs_nfsdsubs.c
@@ -1418,21 +1418,23 @@ nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp)
if (len == 0 && nfs_pubfhset && (nd->nd_flag & ND_NFSV3) &&
nd->nd_procnum == NFSPROC_LOOKUP) {
nd->nd_flag |= ND_PUBLOOKUP;
- return (0);
+ goto nfsmout;
}
if (len < NFSRV_MINFH || len > NFSRV_MAXFH) {
if (nd->nd_flag & ND_NFSV4) {
if (len > 0 && len <= NFSX_V4FHMAX) {
error = nfsm_advance(nd, NFSM_RNDUP(len), -1);
if (error)
- return (error);
+ goto nfsmout;
nd->nd_repstat = NFSERR_BADHANDLE;
- return (0);
+ goto nfsmout;
} else {
- return (EBADRPC);
+ error = EBADRPC;
+ goto nfsmout;
}
} else {
- return (EBADRPC);
+ error = EBADRPC;
+ goto nfsmout;
}
}
copylen = len;
@@ -1450,11 +1452,12 @@ nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp)
nd->nd_procnum == NFSPROC_LOOKUP &&
!NFSBCMP((caddr_t)tl, nfs_v2pubfh, NFSX_V2FH)) {
nd->nd_flag |= ND_PUBLOOKUP;
- return (0);
+ goto nfsmout;
}
NFSBCOPY(tl, (caddr_t)fhp->nfsrvfh_data, copylen);
fhp->nfsrvfh_len = copylen;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
@@ -1503,22 +1506,28 @@ nfsd_errmap(struct nfsrv_descript *nd)
APPLESTATIC int
nfsrv_checkuidgid(struct nfsrv_descript *nd, struct nfsvattr *nvap)
{
+ int error = 0;
/*
* If not setting either uid nor gid, it's OK.
*/
if (NFSVNO_NOTSETUID(nvap) && NFSVNO_NOTSETGID(nvap))
- return (0);
+ goto out;
if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid == nfsrv_defaultuid)
- || (NFSVNO_ISSETGID(nvap) && nvap->na_gid == nfsrv_defaultgid))
- return (NFSERR_BADOWNER);
+ || (NFSVNO_ISSETGID(nvap) && nvap->na_gid == nfsrv_defaultgid)) {
+ error = NFSERR_BADOWNER;
+ goto out;
+ }
if (nd->nd_cred->cr_uid == 0)
- return (0);
+ goto out;
if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid != nd->nd_cred->cr_uid) ||
(NFSVNO_ISSETGID(nvap) && nvap->na_gid != nd->nd_cred->cr_gid &&
!groupmember(nvap->na_gid, nd->nd_cred)))
- return (NFSERR_PERM);
- return (0);
+ error = NFSERR_PERM;
+
+out:
+ NFSEXITCODE2(error, nd);
+ return (error);
}
/*
@@ -1542,7 +1551,7 @@ nfsrv_fixattr(struct nfsrv_descript *nd, vnode_t vp,
* the V2 and 3 semantics.
*/
if ((nd->nd_flag & ND_NFSV4) == 0)
- return;
+ goto out;
NFSVNO_ATTRINIT(&nva);
NFSZERO_ATTRBIT(&nattrbits);
tuid = nd->nd_cred->cr_uid;
@@ -1604,6 +1613,9 @@ nfsrv_fixattr(struct nfsrv_descript *nd, vnode_t vp,
#endif
NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_ACL);
nd->nd_cred->cr_uid = tuid;
+
+out:
+ NFSEXITCODE2(0, nd);
}
/*
@@ -1800,10 +1812,12 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
len = fxdr_unsigned(int, *tl);
if (len > NFS_MAXNAMLEN) {
nd->nd_repstat = NFSERR_NAMETOL;
- return (0);
+ error = 0;
+ goto nfsmout;
} else if (len <= 0) {
nd->nd_repstat = NFSERR_INVAL;
- return (0);
+ error = 0;
+ goto nfsmout;
}
/*
@@ -1815,14 +1829,17 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
for (i = 0; i < len; i++) {
while (rem == 0) {
md = mbuf_next(md);
- if (md == NULL)
- return (EBADRPC);
+ if (md == NULL) {
+ error = EBADRPC;
+ goto nfsmout;
+ }
fromcp = NFSMTOD(md, caddr_t);
rem = mbuf_len(md);
}
if (*fromcp == '\0') {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
/*
* For lookups on the public filehandle, do some special
@@ -1858,7 +1875,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
*/
if (*fromcp == '/' && pubtype != 1) {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
/*
@@ -1871,7 +1889,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
digit = nfsrv_hexdigit(*fromcp, &error);
if (error) {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
if (percent == 1) {
val = (digit << 4);
@@ -1890,7 +1909,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
*/
if ((len - i) < 3) {
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
percent = 1;
} else {
@@ -1908,7 +1928,8 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
nd->nd_repstat = NFSERR_BADNAME;
else
nd->nd_repstat = EACCES;
- return (0);
+ error = 0;
+ goto nfsmout;
}
hash += ((u_char)*fromcp);
*tocp++ = *fromcp;
@@ -1926,7 +1947,7 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
} else {
error = nfsm_advance(nd, i, rem);
if (error)
- return (error);
+ goto nfsmout;
}
}
@@ -1939,11 +1960,13 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
(outlen == 2 && bufp[0] == '.' &&
bufp[1] == '.')) {
nd->nd_repstat = NFSERR_BADNAME;
- return (0);
+ error = 0;
+ goto nfsmout;
}
if (nfsrv_checkutf8((u_int8_t *)bufp, outlen)) {
nd->nd_repstat = NFSERR_INVAL;
- return (0);
+ error = 0;
+ goto nfsmout;
}
}
}
@@ -1952,6 +1975,7 @@ nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
if (hashp != NULL)
*hashp = hash;
nfsmout:
+ NFSEXITCODE2(error, nd);
return (error);
}
diff --git a/sys/fs/smbfs/smbfs_smb.c b/sys/fs/smbfs/smbfs_smb.c
index f58f7de..bebc8ee 100644
--- a/sys/fs/smbfs/smbfs_smb.c
+++ b/sys/fs/smbfs/smbfs_smb.c
@@ -556,7 +556,7 @@ smbfs_smb_setftime(struct smbnode *np, struct timespec *mtime,
/*
* Set DOS file attributes.
- * Looks like this call can be used only if CAP_NT_SMBS bit is on.
+ * Looks like this call can be used only if SMB_CAP_NT_SMBS bit is on.
*/
int
smbfs_smb_setfattrNT(struct smbnode *np, u_int16_t attr, struct timespec *mtime,
diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c
index 5a07a45..e9324cf 100644
--- a/sys/fs/tmpfs/tmpfs_subr.c
+++ b/sys/fs/tmpfs/tmpfs_subr.c
@@ -926,7 +926,7 @@ tmpfs_reg_resize(struct vnode *vp, off_t newsize)
if (newpages < oldpages) {
swap_pager_freespace(uobj, newpages, oldpages -
newpages);
- vm_object_page_remove(uobj, newpages, 0, FALSE);
+ vm_object_page_remove(uobj, newpages, 0, 0);
}
/*
diff --git a/sys/geom/cache/g_cache.c b/sys/geom/cache/g_cache.c
index ca05f14..fc3490f 100644
--- a/sys/geom/cache/g_cache.c
+++ b/sys/geom/cache/g_cache.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/time.h>
#include <vm/uma.h>
#include <geom/geom.h>
diff --git a/sys/geom/concat/g_concat.c b/sys/geom/concat/g_concat.c
index 54e0fe0..b2196b7 100644
--- a/sys/geom/concat/g_concat.c
+++ b/sys/geom/concat/g_concat.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <geom/geom.h>
diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c
index 30497a4..6941470 100644
--- a/sys/geom/eli/g_eli.c
+++ b/sys/geom/eli/g_eli.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/gate/g_gate.c b/sys/geom/gate/g_gate.c
index 22338a5..886b993 100644
--- a/sys/geom/gate/g_gate.c
+++ b/sys/geom/gate/g_gate.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/limits.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/signalvar.h>
#include <sys/time.h>
diff --git a/sys/geom/geom.h b/sys/geom/geom.h
index 6256572..b90e6bc 100644
--- a/sys/geom/geom.h
+++ b/sys/geom/geom.h
@@ -44,7 +44,6 @@
#include <sys/queue.h>
#include <sys/ioccom.h>
#include <sys/conf.h>
-#include <sys/sbuf.h>
#include <sys/module.h>
struct g_class;
diff --git a/sys/geom/geom_bsd.c b/sys/geom/geom_bsd.c
index c5b9252..60fc50c 100644
--- a/sys/geom/geom_bsd.c
+++ b/sys/geom/geom_bsd.c
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <sys/errno.h>
#include <sys/disklabel.h>
#include <sys/gpt.h>
+#include <sys/sbuf.h>
#include <sys/uuid.h>
#include <geom/geom.h>
#include <geom/geom_slice.h>
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index 1659321..b2ccaba 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$");
#include <sys/module.h>
#include <sys/bio.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <geom/geom.h>
/*
diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c
index 17cae68..3072895 100644
--- a/sys/geom/geom_disk.c
+++ b/sys/geom/geom_disk.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ctype.h>
#include <sys/fcntl.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/devicestat.h>
#include <machine/md_var.h>
diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c
index ffc48bd..71c194d 100644
--- a/sys/geom/geom_pc98.c
+++ b/sys/geom/geom_pc98.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <sys/bio.h>
#include <sys/lock.h>
#include <sys/mutex.h>
+#include <sys/sbuf.h>
#include <sys/diskpc98.h>
#include <geom/geom.h>
diff --git a/sys/geom/geom_sunlabel.c b/sys/geom/geom_sunlabel.c
index f05b7e6..5ac35ad 100644
--- a/sys/geom/geom_sunlabel.c
+++ b/sys/geom/geom_sunlabel.c
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/md5.h>
+#include <sys/sbuf.h>
#include <sys/sun_disklabel.h>
#include <geom/geom.h>
#include <geom/geom_slice.h>
diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c
index 9eaf6b1..f90321d 100644
--- a/sys/geom/geom_vfs.c
+++ b/sys/geom/geom_vfs.c
@@ -171,7 +171,7 @@ g_vfs_open(struct vnode *vp, struct g_consumer **cpp, const char *fsname, int wr
gp = g_new_geomf(&g_vfs_class, "%s.%s", fsname, pp->name);
cp = g_new_consumer(gp);
g_attach(cp, pp);
- error = g_access(cp, 1, wr, 1);
+ error = g_access(cp, 1, wr, wr);
if (error) {
g_wither_geom(gp, ENXIO);
return (error);
diff --git a/sys/geom/label/g_label_gpt.c b/sys/geom/label/g_label_gpt.c
index 3701495..ecab01b 100644
--- a/sys/geom/label/g_label_gpt.c
+++ b/sys/geom/label/g_label_gpt.c
@@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/kobj.h>
#include <sys/gpt.h>
+#include <sys/sbuf.h>
#include <geom/geom.h>
#include <geom/label/g_label.h>
diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c
index a2780d7..6688864 100644
--- a/sys/geom/mirror/g_mirror.c
+++ b/sys/geom/mirror/g_mirror.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c
index c653090..b2e1a63 100644
--- a/sys/geom/mountver/g_mountver.c
+++ b/sys/geom/mountver/g_mountver.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/bio.h>
#include <sys/disk.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c
index 6720a87..947cce0 100644
--- a/sys/geom/multipath/g_multipath.c
+++ b/sys/geom/multipath/g_multipath.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/kthread.h>
#include <sys/malloc.h>
diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c
index c1a2333..675f06e 100644
--- a/sys/geom/nop/g_nop.c
+++ b/sys/geom/nop/g_nop.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <geom/geom.h>
diff --git a/sys/geom/part/g_part_bsd.c b/sys/geom/part/g_part_bsd.c
index 269b943..be46775 100644
--- a/sys/geom/part/g_part_bsd.c
+++ b/sys/geom/part/g_part_bsd.c
@@ -46,6 +46,11 @@ __FBSDID("$FreeBSD$");
#include "g_part_if.h"
+#define BOOT1_SIZE 512
+#define LABEL_SIZE 512
+#define BOOT2_OFF (BOOT1_SIZE + LABEL_SIZE)
+#define BOOT2_SIZE (BBSIZE - BOOT2_OFF)
+
FEATURE(geom_part_bsd, "GEOM partitioning class for BSD disklabels");
struct g_part_bsd_table {
@@ -170,22 +175,16 @@ g_part_bsd_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_bsd_table *table;
const u_char *codeptr;
- size_t hdsz, tlsz;
- size_t codesz, tlofs;
- hdsz = 512;
- tlofs = hdsz + 148 + basetable->gpt_entries * 16;
- tlsz = BBSIZE - tlofs;
+ if (gpp->gpp_codesize != BOOT1_SIZE && gpp->gpp_codesize != BBSIZE)
+ return (ENODEV);
+
table = (struct g_part_bsd_table *)basetable;
- bzero(table->bbarea, hdsz);
- bzero(table->bbarea + tlofs, tlsz);
codeptr = gpp->gpp_codeptr;
- codesz = MIN(hdsz, gpp->gpp_codesize);
- if (codesz > 0)
- bcopy(codeptr, table->bbarea, codesz);
- codesz = MIN(tlsz, gpp->gpp_codesize - tlofs);
- if (codesz > 0)
- bcopy(codeptr + tlofs, table->bbarea + tlofs, codesz);
+ bcopy(codeptr, table->bbarea, BOOT1_SIZE);
+ if (gpp->gpp_codesize == BBSIZE)
+ bcopy(codeptr + BOOT2_OFF, table->bbarea + BOOT2_OFF,
+ BOOT2_SIZE);
return (0);
}
diff --git a/sys/geom/part/g_part_ebr.c b/sys/geom/part/g_part_ebr.c
index 8ea9b47..85b8a8a 100644
--- a/sys/geom/part/g_part_ebr.c
+++ b/sys/geom/part/g_part_ebr.c
@@ -59,6 +59,9 @@ FEATURE(geom_part_ebr_compat,
struct g_part_ebr_table {
struct g_part_table base;
+#ifndef GEOM_PART_EBR_COMPAT
+ u_char ebr[EBRSIZE];
+#endif
};
struct g_part_ebr_entry {
@@ -459,7 +462,7 @@ g_part_ebr_read(struct g_part_table *basetable, struct g_consumer *cp)
u_char *buf;
off_t ofs, msize;
u_int lba;
- int error, index, sum;
+ int error, index;
pp = cp->provider;
table = (struct g_part_ebr_table *)basetable;
@@ -482,20 +485,11 @@ g_part_ebr_read(struct g_part_table *basetable, struct g_consumer *cp)
printf("GEOM: %s: invalid entries in the EBR ignored.\n",
pp->name);
}
- /* We do not support bootcode for EBR. If bootcode area is
- * not zeroes, then mark this EBR as corrupt to do not break
- * anything for another OS'es.
- */
- if (lba == 0) {
- sum = 0;
- for (index = 0; index < DOSPARTOFF; index++)
- sum += buf[index];
- if (sum != 0) {
- basetable->gpt_corrupt = 1;
- printf("GEOM: %s: EBR has non empty bootcode.\n",
- pp->name);
- }
- }
+#ifndef GEOM_PART_EBR_COMPAT
+ /* Save the first EBR, it can contain a boot code */
+ if (lba == 0)
+ bcopy(buf, table->ebr, sizeof(table->ebr));
+#endif
g_free(buf);
if (ent[0].dp_typ == 0)
@@ -583,6 +577,9 @@ g_part_ebr_type(struct g_part_table *basetable, struct g_part_entry *baseentry,
static int
g_part_ebr_write(struct g_part_table *basetable, struct g_consumer *cp)
{
+#ifndef GEOM_PART_EBR_COMPAT
+ struct g_part_ebr_table *table;
+#endif
struct g_provider *pp;
struct g_part_entry *baseentry, *next;
struct g_part_ebr_entry *entry;
@@ -592,6 +589,10 @@ g_part_ebr_write(struct g_part_table *basetable, struct g_consumer *cp)
pp = cp->provider;
buf = g_malloc(pp->sectorsize, M_WAITOK | M_ZERO);
+#ifndef GEOM_PART_EBR_COMPAT
+ table = (struct g_part_ebr_table *)basetable;
+ bcopy(table->ebr, buf, DOSPARTOFF);
+#endif
le16enc(buf + DOSMAGICOFFSET, DOSMAGIC);
baseentry = LIST_FIRST(&basetable->gpt_entry);
@@ -644,7 +645,10 @@ g_part_ebr_write(struct g_part_table *basetable, struct g_consumer *cp)
error = g_write_data(cp, baseentry->gpe_start * pp->sectorsize,
buf, pp->sectorsize);
-
+#ifndef GEOM_PART_EBR_COMPAT
+ if (baseentry->gpe_start == 0)
+ bzero(buf, DOSPARTOFF);
+#endif
baseentry = next;
} while (!error && baseentry != NULL);
diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c
index 9e897a4..667a8d6 100644
--- a/sys/geom/part/g_part_gpt.c
+++ b/sys/geom/part/g_part_gpt.c
@@ -88,6 +88,7 @@ struct g_part_gpt_entry {
static void g_gpt_printf_utf16(struct sbuf *, uint16_t *, size_t);
static void g_gpt_utf8_to_utf16(const uint8_t *, uint16_t *, size_t);
+static void g_gpt_set_defaults(struct g_part_table *, struct g_provider *);
static int g_part_gpt_add(struct g_part_table *, struct g_part_entry *,
struct g_part_parms *);
@@ -493,12 +494,7 @@ g_part_gpt_create(struct g_part_table *basetable, struct g_part_parms *gpp)
table->mbr[DOSPARTOFF + 6] = 0xff; /* esect */
table->mbr[DOSPARTOFF + 7] = 0xff; /* ecyl */
le32enc(table->mbr + DOSPARTOFF + 8, 1); /* start */
- le32enc(table->mbr + DOSPARTOFF + 12, MIN(last, 0xffffffffLL));
-
- table->lba[GPT_ELT_PRIHDR] = 1;
- table->lba[GPT_ELT_PRITBL] = 2;
- table->lba[GPT_ELT_SECHDR] = last;
- table->lba[GPT_ELT_SECTBL] = last - tblsz;
+ le32enc(table->mbr + DOSPARTOFF + 12, MIN(last, UINT32_MAX));
/* Allocate space for the header */
table->hdr = g_malloc(sizeof(struct gpt_hdr), M_WAITOK | M_ZERO);
@@ -506,14 +502,11 @@ g_part_gpt_create(struct g_part_table *basetable, struct g_part_parms *gpp)
bcopy(GPT_HDR_SIG, table->hdr->hdr_sig, sizeof(table->hdr->hdr_sig));
table->hdr->hdr_revision = GPT_HDR_REVISION;
table->hdr->hdr_size = offsetof(struct gpt_hdr, padding);
- table->hdr->hdr_lba_start = 2 + tblsz;
- table->hdr->hdr_lba_end = last - tblsz - 1;
kern_uuidgen(&table->hdr->hdr_uuid, 1);
table->hdr->hdr_entries = basetable->gpt_entries;
table->hdr->hdr_entsz = sizeof(struct gpt_ent);
- basetable->gpt_first = table->hdr->hdr_lba_start;
- basetable->gpt_last = table->hdr->hdr_lba_end;
+ g_gpt_set_defaults(basetable, pp);
return (0);
}
@@ -815,32 +808,10 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp)
static int
g_part_gpt_recover(struct g_part_table *basetable)
{
- struct g_part_gpt_table *table;
- struct g_provider *pp;
- uint64_t last;
- size_t tblsz;
-
- table = (struct g_part_gpt_table *)basetable;
- pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider;
- last = pp->mediasize / pp->sectorsize - 1;
- tblsz = (table->hdr->hdr_entries * table->hdr->hdr_entsz +
- pp->sectorsize - 1) / pp->sectorsize;
-
- table->lba[GPT_ELT_PRIHDR] = 1;
- table->lba[GPT_ELT_PRITBL] = 2;
- table->lba[GPT_ELT_SECHDR] = last;
- table->lba[GPT_ELT_SECTBL] = last - tblsz;
- table->state[GPT_ELT_PRIHDR] = GPT_STATE_OK;
- table->state[GPT_ELT_PRITBL] = GPT_STATE_OK;
- table->state[GPT_ELT_SECHDR] = GPT_STATE_OK;
- table->state[GPT_ELT_SECTBL] = GPT_STATE_OK;
- table->hdr->hdr_lba_start = 2 + tblsz;
- table->hdr->hdr_lba_end = last - tblsz - 1;
- basetable->gpt_first = table->hdr->hdr_lba_start;
- basetable->gpt_last = table->hdr->hdr_lba_end;
+ g_gpt_set_defaults(basetable,
+ LIST_FIRST(&basetable->gpt_gp->consumer)->provider);
basetable->gpt_corrupt = 0;
-
return (0);
}
@@ -1039,6 +1010,34 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp)
}
static void
+g_gpt_set_defaults(struct g_part_table *basetable, struct g_provider *pp)
+{
+ struct g_part_gpt_table *table;
+ quad_t last;
+ size_t tblsz;
+
+ table = (struct g_part_gpt_table *)basetable;
+ last = pp->mediasize / pp->sectorsize - 1;
+ tblsz = (basetable->gpt_entries * sizeof(struct gpt_ent) +
+ pp->sectorsize - 1) / pp->sectorsize;
+
+ table->lba[GPT_ELT_PRIHDR] = 1;
+ table->lba[GPT_ELT_PRITBL] = 2;
+ table->lba[GPT_ELT_SECHDR] = last;
+ table->lba[GPT_ELT_SECTBL] = last - tblsz;
+ table->state[GPT_ELT_PRIHDR] = GPT_STATE_OK;
+ table->state[GPT_ELT_PRITBL] = GPT_STATE_OK;
+ table->state[GPT_ELT_SECHDR] = GPT_STATE_OK;
+ table->state[GPT_ELT_SECTBL] = GPT_STATE_OK;
+
+ table->hdr->hdr_lba_start = 2 + tblsz;
+ table->hdr->hdr_lba_end = last - tblsz - 1;
+
+ basetable->gpt_first = table->hdr->hdr_lba_start;
+ basetable->gpt_last = table->hdr->hdr_lba_end;
+}
+
+static void
g_gpt_printf_utf16(struct sbuf *sb, uint16_t *str, size_t len)
{
u_int bo;
diff --git a/sys/geom/part/g_part_mbr.c b/sys/geom/part/g_part_mbr.c
index 825a109..bebdfee 100644
--- a/sys/geom/part/g_part_mbr.c
+++ b/sys/geom/part/g_part_mbr.c
@@ -237,14 +237,16 @@ static int
g_part_mbr_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_mbr_table *table;
- size_t codesz;
+ uint32_t dsn;
+
+ if (gpp->gpp_codesize != MBRSIZE)
+ return (ENODEV);
- codesz = DOSPARTOFF;
table = (struct g_part_mbr_table *)basetable;
- bzero(table->mbr, codesz);
- codesz = MIN(codesz, gpp->gpp_codesize);
- if (codesz > 0)
- bcopy(gpp->gpp_codeptr, table->mbr, codesz);
+ dsn = *(uint32_t *)(table->mbr + DOSDSNOFF);
+ bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
+ if (dsn != 0)
+ *(uint32_t *)(table->mbr + DOSDSNOFF) = dsn;
return (0);
}
diff --git a/sys/geom/raid/g_raid.c b/sys/geom/raid/g_raid.c
index 1fdd421..3c4a3f8 100644
--- a/sys/geom/raid/g_raid.c
+++ b/sys/geom/raid/g_raid.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c
index 67e4419..eef7c10 100644
--- a/sys/geom/raid3/g_raid3.c
+++ b/sys/geom/raid3/g_raid3.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/eventhandler.h>
diff --git a/sys/geom/sched/g_sched.c b/sys/geom/sched/g_sched.c
index dd5120f..1010229 100644
--- a/sys/geom/sched/g_sched.c
+++ b/sys/geom/sched/g_sched.c
@@ -111,6 +111,7 @@
#include <sys/bio.h>
#include <sys/limits.h>
#include <sys/hash.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/proc.h> /* we access curthread */
diff --git a/sys/geom/sched/gs_rr.c b/sys/geom/sched/gs_rr.c
index 39b976a..1fc8cda 100644
--- a/sys/geom/sched/gs_rr.c
+++ b/sys/geom/sched/gs_rr.c
@@ -59,6 +59,7 @@
#include <sys/module.h>
#include <sys/proc.h>
#include <sys/queue.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include "gs_scheduler.h"
diff --git a/sys/geom/shsec/g_shsec.c b/sys/geom/shsec/g_shsec.c
index 4bf918f..abf0317 100644
--- a/sys/geom/shsec/g_shsec.c
+++ b/sys/geom/shsec/g_shsec.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <vm/uma.h>
diff --git a/sys/geom/stripe/g_stripe.c b/sys/geom/stripe/g_stripe.c
index 08841b5..bb94631 100644
--- a/sys/geom/stripe/g_stripe.c
+++ b/sys/geom/stripe/g_stripe.c
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <vm/uma.h>
diff --git a/sys/geom/vinum/geom_vinum.c b/sys/geom/vinum/geom_vinum.c
index 107b80d..ab4d1a4 100644
--- a/sys/geom/vinum/geom_vinum.c
+++ b/sys/geom/vinum/geom_vinum.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
diff --git a/sys/geom/vinum/geom_vinum_drive.c b/sys/geom/vinum/geom_vinum_drive.c
index f782fd0..877eed4 100644
--- a/sys/geom/vinum/geom_vinum_drive.c
+++ b/sys/geom/vinum/geom_vinum_drive.c
@@ -27,8 +27,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
#include <sys/endian.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <geom/geom.h>
diff --git a/sys/geom/vinum/geom_vinum_list.c b/sys/geom/vinum/geom_vinum_list.c
index 00b89495..3d44cd4 100644
--- a/sys/geom/vinum/geom_vinum_list.c
+++ b/sys/geom/vinum/geom_vinum_list.c
@@ -28,8 +28,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
#include <sys/libkern.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <geom/geom.h>
#include <geom/vinum/geom_vinum_var.h>
diff --git a/sys/geom/vinum/geom_vinum_subr.c b/sys/geom/vinum/geom_vinum_subr.c
index e381ff2..ea7c7e7 100644
--- a/sys/geom/vinum/geom_vinum_subr.c
+++ b/sys/geom/vinum/geom_vinum_subr.c
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/malloc.h>
+#include <sys/sbuf.h>
#include <sys/systm.h>
#include <geom/geom.h>
diff --git a/sys/geom/virstor/g_virstor.c b/sys/geom/virstor/g_virstor.c
index 509aca1..e9bee5c 100644
--- a/sys/geom/virstor/g_virstor.c
+++ b/sys/geom/virstor/g_virstor.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/sx.h>
#include <sys/bio.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/time.h>
diff --git a/sys/i386/Makefile b/sys/i386/Makefile
index baff9d6..f6ecf7f 100644
--- a/sys/i386/Makefile
+++ b/sys/i386/Makefile
@@ -25,10 +25,9 @@ links::
(cd $$i && { rm -f tags; ln -s ../tags tags; }) done
SI386= ${SYS}/i386/acpica/*.[ch] ${SYS}/i386/bios/*.[ch] \
- ${SYS}/i386/cpufreq/*.[ch] ${SYS}/i386/pci/*.[ch] \
${SYS}/i386/i386/*.[ch] ${SYS}/i386/ibcs2/*.[ch] \
${SYS}/i386/include/*.[ch] ${SYS}/i386/isa/*.[ch] \
- ${SYS}/i386/linux/*.[ch]
+ ${SYS}/i386/linux/*.[ch] ${SYS}/i386/pci/*.[ch]
AI386= ${SYS}/i386/i386/*.s
tags::
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c
index 78c90c0..0900901 100644
--- a/sys/i386/i386/mp_machdep.c
+++ b/sys/i386/i386/mp_machdep.c
@@ -658,12 +658,11 @@ cpu_mp_announce(void)
void
init_secondary(void)
{
- cpuset_t tcpuset, tallcpus;
struct pcpu *pc;
vm_offset_t addr;
int gsel_tss;
int x, myid;
- u_int cr0;
+ u_int cpuid, cr0;
/* bootAP is set in start_ap() to our ID. */
myid = bootAP;
@@ -758,8 +757,9 @@ init_secondary(void)
#endif
/* A quick check from sanity claus */
+ cpuid = PCPU_GET(cpuid);
if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", PCPU_GET(cpuid));
+ printf("SMP: cpuid = %d\n", cpuid);
printf("SMP: actual apic_id = %d\n", lapic_id());
printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
panic("cpuid mismatch! boom!!");
@@ -781,19 +781,13 @@ init_secondary(void)
smp_cpus++;
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid));
- printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid));
- tcpuset = PCPU_GET(cpumask);
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
/* Determine if we are a logical CPU. */
/* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
- CPU_OR(&logical_cpus_mask, &tcpuset);
-
- /* Build our map of 'other' CPUs. */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
+ CPU_SET(cpuid, &logical_cpus_mask);
if (bootverbose)
lapic_dump("AP");
@@ -934,7 +928,6 @@ assign_cpu_ids(void)
static int
start_all_aps(void)
{
- cpuset_t tallcpus;
#ifndef PC98
u_char mpbiosreason;
#endif
@@ -997,11 +990,6 @@ start_all_aps(void)
CPU_SET(cpu, &all_cpus); /* record AP in CPU map */
}
- /* build our map of 'other' CPUs */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, PCPU_PTR(cpumask));
- PCPU_SET(other_cpus, tallcpus);
-
/* restore the warmstart vector */
*(u_int32_t *) WARMBOOT_OFF = mpbioswarmvec;
@@ -1253,9 +1241,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
if (othercpus < 1)
return;
} else {
- sched_pin();
- CPU_NAND(&mask, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &mask);
if (CPU_EMPTY(&mask))
return;
}
@@ -1452,11 +1438,12 @@ ipi_cpu(int cpu, u_int ipi)
void
ipi_all_but_self(u_int ipi)
{
+ cpuset_t other_cpus;
- sched_pin();
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
if (IPI_IS_BITMAPED(ipi)) {
- ipi_selected(PCPU_GET(other_cpus), ipi);
- sched_unpin();
+ ipi_selected(other_cpus, ipi);
return;
}
@@ -1466,8 +1453,7 @@ ipi_all_but_self(u_int ipi)
* Set the mask of receiving CPUs for this purpose.
*/
if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, PCPU_PTR(other_cpus));
- sched_unpin();
+ CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
@@ -1476,7 +1462,7 @@ ipi_all_but_self(u_int ipi)
int
ipi_nmi_handler()
{
- cpuset_t cpumask;
+ u_int cpuid;
/*
* As long as there is not a simple way to know about a NMI's
@@ -1484,13 +1470,11 @@ ipi_nmi_handler()
* the global pending bitword an IPI_STOP_HARD has been issued
* and should be handled.
*/
- sched_pin();
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
- if (!CPU_OVERLAP(&ipi_nmi_pending, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
return (1);
- CPU_NAND_ATOMIC(&ipi_nmi_pending, &cpumask);
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
cpustop_handler();
return (0);
}
@@ -1502,25 +1486,21 @@ ipi_nmi_handler()
void
cpustop_handler(void)
{
- cpuset_t cpumask;
u_int cpu;
- sched_pin();
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
savectx(&stoppcbs[cpu]);
/* Indicate that we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
if (cpu == 0 && cpustop_restartfunc != NULL) {
cpustop_restartfunc();
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 3f9248d..002e529 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -932,16 +932,18 @@ pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde)
void
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invlpg(va);
smp_invlpg(va);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invlpg(va);
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -953,8 +955,9 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
void
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
vm_offset_t addr;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
@@ -962,9 +965,10 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
invlpg(addr);
smp_invlpg_range(sva, eva);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
for (addr = sva; addr < eva; addr += PAGE_SIZE)
invlpg(addr);
CPU_AND(&other_cpus, &pmap->pm_active);
@@ -977,16 +981,18 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
void
pmap_invalidate_all(pmap_t pmap)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
sched_pin();
if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
invltlb();
smp_invltlb();
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invltlb();
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -1006,11 +1012,11 @@ pmap_invalidate_cache(void)
}
struct pde_action {
- cpuset_t store; /* processor that updates the PDE */
cpuset_t invalidate; /* processors that invalidate their TLB */
vm_offset_t va;
pd_entry_t *pde;
pd_entry_t newpde;
+ u_int store; /* processor that updates the PDE */
};
static void
@@ -1020,9 +1026,7 @@ pmap_update_pde_kernel(void *arg)
pd_entry_t *pde;
pmap_t pmap;
- sched_pin();
- if (!CPU_CMP(&act->store, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (act->store == PCPU_GET(cpuid)) {
/*
* Elsewhere, this operation requires allpmaps_lock for
@@ -1033,8 +1037,7 @@ pmap_update_pde_kernel(void *arg)
pde = pmap_pde(pmap, act->va);
pde_store(pde, act->newpde);
}
- } else
- sched_unpin();
+ }
}
static void
@@ -1042,12 +1045,8 @@ pmap_update_pde_user(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (!CPU_CMP(&act->store, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (act->store == PCPU_GET(cpuid))
pde_store(act->pde, act->newpde);
- } else
- sched_unpin();
}
static void
@@ -1055,12 +1054,8 @@ pmap_update_pde_teardown(void *arg)
{
struct pde_action *act = arg;
- sched_pin();
- if (CPU_OVERLAP(&act->invalidate, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
pmap_update_pde_invalidate(act->va, act->newpde);
- } else
- sched_unpin();
}
/*
@@ -1075,23 +1070,25 @@ static void
pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
{
struct pde_action act;
- cpuset_t active, cpumask, other_cpus;
+ cpuset_t active, other_cpus;
+ u_int cpuid;
sched_pin();
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
if (pmap == kernel_pmap)
active = all_cpus;
else
active = pmap->pm_active;
if (CPU_OVERLAP(&active, &other_cpus)) {
- act.store = cpumask;
+ act.store = cpuid;
act.invalidate = active;
act.va = va;
act.pde = pde;
act.newpde = newpde;
- CPU_OR(&cpumask, &active);
- smp_rendezvous_cpus(cpumask,
+ CPU_SET(cpuid, &active);
+ smp_rendezvous_cpus(active,
smp_no_rendevous_barrier, pmap == kernel_pmap ?
pmap_update_pde_kernel : pmap_update_pde_user,
pmap_update_pde_teardown, &act);
@@ -1100,7 +1097,7 @@ pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
pmap_kenter_pde(va, newpde);
else
pde_store(pde, newpde);
- if (CPU_OVERLAP(&active, &cpumask))
+ if (CPU_ISSET(cpuid, &active))
pmap_update_pde_invalidate(va, newpde);
}
sched_unpin();
@@ -1925,12 +1922,12 @@ pmap_lazyfix_action(void)
}
static void
-pmap_lazyfix_self(cpuset_t mymask)
+pmap_lazyfix_self(u_int cpuid)
{
if (rcr3() == lazyptd)
load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_NAND_ATOMIC(lazymask, &mymask);
+ CPU_CLR_ATOMIC(cpuid, lazymask);
}
@@ -1938,7 +1935,7 @@ static void
pmap_lazyfix(pmap_t pmap)
{
cpuset_t mymask, mask;
- u_int spins;
+ u_int cpuid, spins;
int lsb;
mask = pmap->pm_active;
@@ -1956,10 +1953,13 @@ pmap_lazyfix(pmap_t pmap)
#else
lazyptd = vtophys(pmap->pm_pdir);
#endif
- mymask = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+
+ /* Use a cpuset just for having an easy check. */
+ CPU_SETOF(cpuid, &mymask);
if (!CPU_CMP(&mask, &mymask)) {
lazymask = &pmap->pm_active;
- pmap_lazyfix_self(mymask);
+ pmap_lazyfix_self(cpuid);
} else {
atomic_store_rel_int((u_int *)&lazymask,
(u_int)&pmap->pm_active);
@@ -2188,7 +2188,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
sched_pin();
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -2927,8 +2927,8 @@ pmap_remove_all(vm_page_t m)
vm_offset_t va;
vm_page_t free;
- KASSERT((m->flags & PG_FICTITIOUS) == 0,
- ("pmap_remove_all: page %p is fictitious", m));
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
free = NULL;
vm_page_lock_queues();
sched_pin();
@@ -5098,17 +5098,19 @@ void
pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
+ u_int cpuid;
u_int32_t cr3;
critical_enter();
pmap = vmspace_pmap(td->td_proc->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
#if defined(SMP)
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
#else
- CPU_NAND(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR(cpuid, &oldpmap->pm_active);
+ CPU_SET(cpuid, &pmap->pm_active);
#endif
#ifdef PAE
cr3 = vtophys(pmap->pm_pdpt);
diff --git a/sys/i386/i386/sys_machdep.c b/sys/i386/i386/sys_machdep.c
index 6a761bf..8370516 100644
--- a/sys/i386/i386/sys_machdep.c
+++ b/sys/i386/i386/sys_machdep.c
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_capabilities.h"
+#include "opt_capsicum.h"
#include "opt_kstack_pages.h"
#include <sys/param.h>
@@ -111,24 +111,26 @@ sysarch(td, uap)
AUDIT_ARG_CMD(uap->op);
-#ifdef CAPABILITIES
+#ifdef CAPABILITY_MODE
/*
- * Whitelist of operations which are safe enough for capability mode.
+ * When adding new operations, add a new case statement here to
+ * explicitly indicate whether or not the operation is safe to
+ * perform in capability mode.
*/
if (IN_CAPABILITY_MODE(td)) {
switch (uap->op) {
- case I386_GET_LDT:
- case I386_SET_LDT:
- case I386_GET_IOPERM:
- case I386_GET_FSBASE:
- case I386_SET_FSBASE:
- case I386_GET_GSBASE:
- case I386_SET_GSBASE:
- break;
+ case I386_GET_LDT:
+ case I386_SET_LDT:
+ case I386_GET_IOPERM:
+ case I386_GET_FSBASE:
+ case I386_SET_FSBASE:
+ case I386_GET_GSBASE:
+ case I386_SET_GSBASE:
+ break;
- case I386_SET_IOPERM:
- default:
- return (ECAPMODE);
+ case I386_SET_IOPERM:
+ default:
+ return (ECAPMODE);
}
}
#endif
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index a084e09..0a7bc21 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -602,8 +602,8 @@ cpu_reset()
u_int cnt;
if (smp_active) {
- sched_pin();
- map = PCPU_GET(other_cpus);
+ map = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &map);
CPU_NAND(&map, &stopped_cpus);
if (!CPU_EMPTY(&map)) {
printf("cpu_reset: Stopping other CPUs\n");
@@ -612,7 +612,6 @@ cpu_reset()
if (PCPU_GET(cpuid) != 0) {
cpu_reset_proxyid = PCPU_GET(cpuid);
- sched_unpin();
cpustop_restartfunc = cpu_reset_proxy;
cpu_reset_proxy_active = 0;
printf("cpu_reset: Restarting BSP\n");
@@ -632,8 +631,7 @@ cpu_reset()
while (1);
/* NOTREACHED */
- } else
- sched_unpin();
+ }
DELAY(1000000);
}
@@ -802,7 +800,8 @@ sf_buf_alloc(struct vm_page *m, int flags)
struct sf_head *hash_list;
struct sf_buf *sf;
#ifdef SMP
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
#endif
int error;
@@ -877,13 +876,14 @@ sf_buf_alloc(struct vm_page *m, int flags)
CPU_ZERO(&sf->cpumask);
shootdown:
sched_pin();
- cpumask = PCPU_GET(cpumask);
- if (!CPU_OVERLAP(&cpumask, &sf->cpumask)) {
- CPU_OR(&sf->cpumask, &cpumask);
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &sf->cpumask)) {
+ CPU_SET(cpuid, &sf->cpumask);
invlpg(sf->kva);
}
if ((flags & SFB_CPUPRIVATE) == 0) {
- other_cpus = PCPU_GET(other_cpus);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
CPU_NAND(&other_cpus, &sf->cpumask);
if (!CPU_EMPTY(&other_cpus)) {
CPU_OR(&sf->cpumask, &other_cpus);
diff --git a/sys/i386/ibcs2/ibcs2_ioctl.c b/sys/i386/ibcs2/ibcs2_ioctl.c
index 17749db..90184e3 100644
--- a/sys/i386/ibcs2/ibcs2_ioctl.c
+++ b/sys/i386/ibcs2/ibcs2_ioctl.c
@@ -654,12 +654,12 @@ ibcs2_ioctl(td, uap)
break;
case IBCS2_GIO_KEYMAP: /* Get keyboard map table */
- uap->cmd = GIO_KEYMAP;
+ uap->cmd = OGIO_KEYMAP;
error = ioctl(td, (struct ioctl_args *)uap);
break;
case IBCS2_PIO_KEYMAP: /* Set keyboard map table */
- uap->cmd = PIO_KEYMAP;
+ uap->cmd = OPIO_KEYMAP;
error = ioctl(td, (struct ioctl_args *)uap);
break;
diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h
index d6ec534..7116f76 100644
--- a/sys/i386/include/cpufunc.h
+++ b/sys/i386/include/cpufunc.h
@@ -133,16 +133,18 @@ enable_intr(void)
}
static __inline void
-cpu_monitor(const void *addr, int extensions, int hints)
+cpu_monitor(const void *addr, u_long extensions, u_int hints)
{
- __asm __volatile("monitor;"
- : :"a" (addr), "c" (extensions), "d"(hints));
+
+ __asm __volatile("monitor"
+ : : "a" (addr), "c" (extensions), "d" (hints));
}
static __inline void
-cpu_mwait(int extensions, int hints)
+cpu_mwait(u_long extensions, u_int hints)
{
- __asm __volatile("mwait;" : :"a" (hints), "c" (extensions));
+
+ __asm __volatile("mwait" : : "a" (hints), "c" (extensions));
}
static __inline void
diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h
index 11ac12e..d95fcf3 100644
--- a/sys/i386/include/param.h
+++ b/sys/i386/include/param.h
@@ -56,6 +56,7 @@
#define __HAVE_ACPI
+#define __HAVE_PIR
#define __PCI_REROUTE_INTERRUPT
#ifndef MACHINE
diff --git a/sys/i386/include/pci_cfgreg.h b/sys/i386/include/pci_cfgreg.h
index bc72418..717d5cc 100644
--- a/sys/i386/include/pci_cfgreg.h
+++ b/sys/i386/include/pci_cfgreg.h
@@ -1,52 +1,6 @@
/*-
- * Copyright (c) 1997, Stefan Esser <se@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice unmodified, this list of conditions, and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- *
+ * This file is in the public domain.
*/
+/* $FreeBSD$ */
-#define CONF1_ADDR_PORT 0x0cf8
-#define CONF1_DATA_PORT 0x0cfc
-
-#define CONF1_ENABLE 0x80000000ul
-#define CONF1_ENABLE_CHK 0x80000000ul
-#define CONF1_ENABLE_MSK 0x7f000000ul
-#define CONF1_ENABLE_CHK1 0xff000001ul
-#define CONF1_ENABLE_MSK1 0x80000001ul
-#define CONF1_ENABLE_RES1 0x80000000ul
-
-#define CONF2_ENABLE_PORT 0x0cf8
-#define CONF2_FORWARD_PORT 0x0cfa
-
-#define CONF2_ENABLE_CHK 0x0e
-#define CONF2_ENABLE_RES 0x0e
-
-int pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus);
-int pci_cfgregopen(void);
-u_int32_t pci_cfgregread(int bus, int slot, int func, int reg, int bytes);
-void pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes);
-void pci_pir_open(void);
-int pci_pir_probe(int bus, int require_parse);
-int pci_pir_route_interrupt(int bus, int device, int func, int pin);
+#include <x86/pci_cfgreg.h>
diff --git a/sys/i386/xen/mp_machdep.c b/sys/i386/xen/mp_machdep.c
index 2d05596..a0ef1e8 100644
--- a/sys/i386/xen/mp_machdep.c
+++ b/sys/i386/xen/mp_machdep.c
@@ -523,8 +523,8 @@ xen_smp_intr_init_cpus(void *unused)
void
init_secondary(void)
{
- cpuset_t tcpuset, tallcpus;
vm_offset_t addr;
+ u_int cpuid;
int gsel_tss;
@@ -601,23 +601,18 @@ init_secondary(void)
#endif
smp_cpus++;
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid));
- printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid));
- tcpuset = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
/* Determine if we are a logical CPU. */
if (logical_cpus > 1 && PCPU_GET(apic_id) % logical_cpus != 0)
- CPU_OR(&logical_cpus_mask, &tcpuset);
+ CPU_SET(cpuid, &logical_cpus_mask);
/* Determine if we are a hyperthread. */
if (hyperthreading_cpus > 1 &&
PCPU_GET(apic_id) % hyperthreading_cpus != 0)
- CPU_OR(&hyperthreading_cpus_mask, &tcpuset);
-
- /* Build our map of 'other' CPUs. */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, &tcpuset);
- PCPU_SET(other_cpus, tallcpus);
+ CPU_SET(cpuid, &hyperthreading_cpus_mask);
#if 0
if (bootverbose)
lapic_dump("AP");
@@ -731,7 +726,6 @@ assign_cpu_ids(void)
int
start_all_aps(void)
{
- cpuset_t tallcpus;
int x,apic_id, cpu;
struct pcpu *pc;
@@ -789,11 +783,6 @@ start_all_aps(void)
}
- /* build our map of 'other' CPUs */
- tallcpus = all_cpus;
- CPU_NAND(&tallcpus, PCPU_PTR(cpumask));
- PCPU_SET(other_cpus, tallcpus);
-
pmap_invalidate_range(kernel_pmap, 0, NKPT * NBPDR - 1);
/* number of APs actually started */
@@ -1031,9 +1020,7 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
if (othercpus < 1)
return;
} else {
- critical_enter();
- CPU_NAND(&mask, PCPU_PTR(cpumask));
- critical_exit();
+ CPU_CLR(PCPU_GET(cpuid), &mask);
if (CPU_EMPTY(&mask))
return;
}
@@ -1184,9 +1171,8 @@ ipi_all_but_self(u_int ipi)
* of help in order to understand what is the source.
* Set the mask of receiving CPUs for this purpose.
*/
- sched_pin();
- other_cpus = PCPU_GET(other_cpus);
- sched_unpin();
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
if (ipi == IPI_STOP_HARD)
CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
@@ -1197,7 +1183,7 @@ ipi_all_but_self(u_int ipi)
int
ipi_nmi_handler()
{
- cpuset_t cpumask;
+ u_int cpuid;
/*
* As long as there is not a simple way to know about a NMI's
@@ -1205,13 +1191,11 @@ ipi_nmi_handler()
* the global pending bitword an IPI_STOP_HARD has been issued
* and should be handled.
*/
- sched_pin();
- cpumask = PCPU_GET(cpumask);
- sched_unpin();
- if (!CPU_OVERLAP(&ipi_nmi_pending, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
return (1);
- CPU_NAND_ATOMIC(&ipi_nmi_pending, &cpumask);
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
cpustop_handler();
return (0);
}
@@ -1223,25 +1207,21 @@ ipi_nmi_handler()
void
cpustop_handler(void)
{
- cpuset_t cpumask;
int cpu;
- sched_pin();
- cpumask = PCPU_GET(cpumask);
cpu = PCPU_GET(cpuid);
- sched_unpin();
savectx(&stoppcbs[cpu]);
/* Indicate that we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
ia32_pause();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
if (cpu == 0 && cpustop_restartfunc != NULL) {
cpustop_restartfunc();
diff --git a/sys/i386/xen/mptable.c b/sys/i386/xen/mptable.c
index 22019ea..0c1efe8 100644
--- a/sys/i386/xen/mptable.c
+++ b/sys/i386/xen/mptable.c
@@ -28,22 +28,16 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
-#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
-#include <sys/malloc.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
-#include <x86/apicreg.h>
-#include <x86/mptable.h>
#include <machine/frame.h>
#include <machine/intr_machdep.h>
#include <machine/apicvar.h>
-#include <machine/md_var.h>
-#include <machine/specialreg.h>
#include <xen/hypervisor.h>
#include <machine/xen/xen-os.h>
@@ -111,20 +105,3 @@ mptable_register(void *dummy __unused)
}
SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, mptable_register,
NULL);
-
-
-
-int
-mptable_pci_probe_table(int bus)
-{
-
- return (0);
-}
-
-int
-mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin)
-{
-
- return (0);
-}
-
diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c
index 3efa4f1..b5e71da 100644
--- a/sys/i386/xen/pmap.c
+++ b/sys/i386/xen/pmap.c
@@ -802,7 +802,8 @@ pmap_cache_bits(int mode, boolean_t is_pde)
void
pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
CTR2(KTR_PMAP, "pmap_invalidate_page: pmap=%p va=0x%x",
pmap, va);
@@ -812,9 +813,10 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
invlpg(va);
smp_invlpg(va);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invlpg(va);
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -827,8 +829,9 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
void
pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
vm_offset_t addr;
+ u_int cpuid;
CTR3(KTR_PMAP, "pmap_invalidate_page: pmap=%p eva=0x%x sva=0x%x",
pmap, sva, eva);
@@ -839,9 +842,10 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
invlpg(addr);
smp_invlpg_range(sva, eva);
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
for (addr = sva; addr < eva; addr += PAGE_SIZE)
invlpg(addr);
CPU_AND(&other_cpus, &pmap->pm_active);
@@ -855,7 +859,8 @@ pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
void
pmap_invalidate_all(pmap_t pmap)
{
- cpuset_t cpumask, other_cpus;
+ cpuset_t other_cpus;
+ u_int cpuid;
CTR1(KTR_PMAP, "pmap_invalidate_page: pmap=%p", pmap);
@@ -864,9 +869,10 @@ pmap_invalidate_all(pmap_t pmap)
invltlb();
smp_invltlb();
} else {
- cpumask = PCPU_GET(cpumask);
- other_cpus = PCPU_GET(other_cpus);
- if (CPU_OVERLAP(&pmap->pm_active, &cpumask))
+ cpuid = PCPU_GET(cpuid);
+ other_cpus = all_cpus;
+ CPU_CLR(cpuid, &other_cpus);
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
invltlb();
CPU_AND(&other_cpus, &pmap->pm_active);
if (!CPU_EMPTY(&other_cpus))
@@ -1708,12 +1714,12 @@ pmap_lazyfix_action(void)
}
static void
-pmap_lazyfix_self(cpuset_t mymask)
+pmap_lazyfix_self(u_int cpuid)
{
if (rcr3() == lazyptd)
load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_NAND_ATOMIC(lazymask, &mymask);
+ CPU_CLR_ATOMIC(cpuid, lazymask);
}
@@ -1721,7 +1727,7 @@ static void
pmap_lazyfix(pmap_t pmap)
{
cpuset_t mymask, mask;
- u_int spins;
+ u_int cpuid, spins;
int lsb;
mask = pmap->pm_active;
@@ -1739,10 +1745,13 @@ pmap_lazyfix(pmap_t pmap)
#else
lazyptd = vtophys(pmap->pm_pdir);
#endif
- mymask = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+
+ /* Use a cpuset just for having an easy check. */
+ CPU_SETOF(cpuid, &mymask);
if (!CPU_CMP(&mask, &mymask)) {
lazymask = &pmap->pm_active;
- pmap_lazyfix_self(mymask);
+ pmap_lazyfix_self(cpuid);
} else {
atomic_store_rel_int((u_int *)&lazymask,
(u_int)&pmap->pm_active);
@@ -2012,7 +2021,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
sched_pin();
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -2421,8 +2430,8 @@ pmap_remove_all(vm_page_t m)
pt_entry_t *pte, tpte;
vm_page_t free;
- KASSERT((m->flags & PG_FICTITIOUS) == 0,
- ("pmap_remove_all: page %p is fictitious", m));
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
free = NULL;
vm_page_lock_queues();
sched_pin();
@@ -4126,17 +4135,19 @@ void
pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
+ u_int cpuid;
u_int32_t cr3;
critical_enter();
pmap = vmspace_pmap(td->td_proc->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
#if defined(SMP)
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
#else
- CPU_NAND(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR(cpuid, &oldpmap->pm_active);
+ CPU_SET(cpuid, &pmap->pm_active);
#endif
#ifdef PAE
cr3 = vtophys(pmap->pm_pdpt);
diff --git a/sys/ia64/conf/GENERIC b/sys/ia64/conf/GENERIC
index 2d8d316..eaf3ffd 100644
--- a/sys/ia64/conf/GENERIC
+++ b/sys/ia64/conf/GENERIC
@@ -48,7 +48,7 @@ options NFSLOCKD # Network Lock Manager
options NFSD # New Network Filesystem Server
options NFS_ROOT # NFS usable as root device
options P1003_1B_SEMAPHORES # POSIX-style semaphores
-options PREEMPTION # Enable kernel thread preemption
+#options PREEMPTION # Enable kernel thread preemption
options PRINTF_BUFR_SIZE=128 # Printf buffering to limit interspersion
options PROCFS # Process filesystem (/proc)
options PSEUDOFS # Pseudo-filesystem framework
diff --git a/sys/ia64/conf/NOTES b/sys/ia64/conf/NOTES
index 3f38218..0f8a4e7 100644
--- a/sys/ia64/conf/NOTES
+++ b/sys/ia64/conf/NOTES
@@ -25,7 +25,7 @@ options LOG2_ID_PAGE_SIZE=27 # 128M
# option: LOG2_PAGE_SIZE
# Specify the log2 size of the page to be used for virtual memory management.
# The page size being equal to 1<<LOG2_PAGE_SIZE.
-options LOG2_PAGE_SIZE=15 # 32K
+options LOG2_PAGE_SIZE=14 # 16K
# option: SKI
# Build support for running under the ski simulator.
diff --git a/sys/ia64/ia64/busdma_machdep.c b/sys/ia64/ia64/busdma_machdep.c
index 7554d31..d7152df 100644
--- a/sys/ia64/ia64/busdma_machdep.c
+++ b/sys/ia64/ia64/busdma_machdep.c
@@ -51,21 +51,21 @@ __FBSDID("$FreeBSD$");
#define MAX_BPAGES 1024
struct bus_dma_tag {
- bus_dma_tag_t parent;
- bus_size_t alignment;
- bus_size_t boundary;
- bus_addr_t lowaddr;
- bus_addr_t highaddr;
+ bus_dma_tag_t parent;
+ bus_size_t alignment;
+ bus_size_t boundary;
+ bus_addr_t lowaddr;
+ bus_addr_t highaddr;
bus_dma_filter_t *filter;
- void *filterarg;
- bus_size_t maxsize;
- u_int nsegments;
- bus_size_t maxsegsz;
- int flags;
- int ref_count;
- int map_count;
- bus_dma_lock_t *lockfunc;
- void *lockfuncarg;
+ void *filterarg;
+ bus_size_t maxsize;
+ u_int nsegments;
+ bus_size_t maxsegsz;
+ int flags;
+ int ref_count;
+ int map_count;
+ bus_dma_lock_t *lockfunc;
+ void *lockfuncarg;
bus_dma_segment_t *segments;
};
@@ -90,27 +90,27 @@ static int total_deferred;
SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters");
SYSCTL_INT(_hw_busdma, OID_AUTO, free_bpages, CTLFLAG_RD, &free_bpages, 0,
- "Free bounce pages");
+ "Free bounce pages");
SYSCTL_INT(_hw_busdma, OID_AUTO, reserved_bpages, CTLFLAG_RD, &reserved_bpages,
- 0, "Reserved bounce pages");
+ 0, "Reserved bounce pages");
SYSCTL_INT(_hw_busdma, OID_AUTO, active_bpages, CTLFLAG_RD, &active_bpages, 0,
- "Active bounce pages");
+ "Active bounce pages");
SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0,
- "Total bounce pages");
+ "Total bounce pages");
SYSCTL_INT(_hw_busdma, OID_AUTO, total_bounced, CTLFLAG_RD, &total_bounced, 0,
- "Total bounce requests");
-SYSCTL_INT(_hw_busdma, OID_AUTO, total_deferred, CTLFLAG_RD, &total_deferred, 0,
- "Total bounce requests that were deferred");
+ "Total bounce requests");
+SYSCTL_INT(_hw_busdma, OID_AUTO, total_deferred, CTLFLAG_RD, &total_deferred,
+ 0, "Total bounce requests that were deferred");
struct bus_dmamap {
- struct bp_list bpages;
- int pagesneeded;
- int pagesreserved;
- bus_dma_tag_t dmat;
- void *buf; /* unmapped buffer pointer */
- bus_size_t buflen; /* unmapped buffer length */
+ struct bp_list bpages;
+ int pagesneeded;
+ int pagesreserved;
+ bus_dma_tag_t dmat;
+ void *buf; /* unmapped buffer pointer */
+ bus_size_t buflen; /* unmapped buffer length */
bus_dmamap_callback_t *callback;
- void *callback_arg;
+ void *callback_arg;
STAILQ_ENTRY(bus_dmamap) links;
};
@@ -121,12 +121,12 @@ static struct bus_dmamap nobounce_dmamap;
static void init_bounce_pages(void *dummy);
static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages);
static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map,
- int commit);
+ int commit);
static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map,
- vm_offset_t vaddr, bus_size_t size);
+ vm_offset_t vaddr, bus_size_t size);
static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage);
static __inline int run_filter(bus_dma_tag_t dmat, bus_addr_t paddr,
- bus_size_t len);
+ bus_size_t len);
/*
* Return true if a match is made.
@@ -144,16 +144,14 @@ run_filter(bus_dma_tag_t dmat, bus_addr_t paddr, bus_size_t len)
retval = 0;
bndy = dmat->boundary;
-
do {
- if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr)
- || ((paddr & (dmat->alignment - 1)) != 0)
- || ((paddr & bndy) != ((paddr + len) & bndy)))
- && (dmat->filter == NULL
- || (*dmat->filter)(dmat->filterarg, paddr) != 0))
+ if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) ||
+ (paddr & (dmat->alignment - 1)) != 0 ||
+ (paddr & bndy) != ((paddr + len) & bndy)) &&
+ (dmat->filter == NULL ||
+ (*dmat->filter)(dmat->filterarg, paddr) != 0))
retval = 1;
-
- dmat = dmat->parent;
+ dmat = dmat->parent;
} while (retval == 0 && dmat != NULL);
return (retval);
}
@@ -195,16 +193,16 @@ dflt_lock(void *arg, bus_dma_lock_op_t op)
}
#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4
+
/*
* Allocate a device specific dma_tag.
*/
int
bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment,
- bus_size_t boundary, bus_addr_t lowaddr,
- bus_addr_t highaddr, bus_dma_filter_t *filter,
- void *filterarg, bus_size_t maxsize, int nsegments,
- bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
- void *lockfuncarg, bus_dma_tag_t *dmat)
+ bus_size_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr,
+ bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize,
+ int nsegments, bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
+ void *lockfuncarg, bus_dma_tag_t *dmat)
{
bus_dma_tag_t newtag;
int error = 0;
@@ -250,7 +248,7 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment,
newtag->boundary = parent->boundary;
else if (parent->boundary != 0)
newtag->boundary = MIN(parent->boundary,
- newtag->boundary);
+ newtag->boundary);
if (newtag->filter == NULL) {
/*
* Short circuit looking at our parent directly
@@ -279,7 +277,7 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment,
/* Performed initial allocation */
newtag->flags |= BUS_DMA_MIN_ALLOC_COMP;
}
-
+
if (error != 0) {
free(newtag, M_DEVBUF);
} else {
@@ -347,7 +345,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)
int maxpages;
*mapp = (bus_dmamap_t)malloc(sizeof(**mapp), M_DEVBUF,
- M_NOWAIT | M_ZERO);
+ M_NOWAIT | M_ZERO);
if (*mapp == NULL)
return (ENOMEM);
@@ -408,7 +406,7 @@ bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)
*/
int
bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
- bus_dmamap_t *mapp)
+ bus_dmamap_t *mapp)
{
int mflags;
@@ -430,7 +428,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
if (flags & BUS_DMA_ZERO)
mflags |= M_ZERO;
- /*
+ /*
* XXX:
* (dmat->alignment < dmat->maxsize) is just a quick hack; the exact
* alignment guarantees of malloc need to be nailed down, and the
@@ -489,15 +487,9 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
* first indicates if this is the first invocation of this function.
*/
static int
-_bus_dmamap_load_buffer(bus_dma_tag_t dmat,
- bus_dmamap_t map,
- void *buf, bus_size_t buflen,
- struct thread *td,
- int flags,
- bus_addr_t *lastaddrp,
- bus_dma_segment_t *segs,
- int *segp,
- int first)
+_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
+ bus_size_t buflen, struct thread *td, int flags, bus_addr_t *lastaddrp,
+ bus_dma_segment_t *segs, int *segp, int first)
{
bus_size_t sgsize;
bus_addr_t curaddr, lastaddr, baddr, bmask;
@@ -607,7 +599,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
if (curaddr == lastaddr &&
(segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
(dmat->boundary == 0 ||
- (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
+ (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
segs[seg].ds_len += sgsize;
else {
if (++seg >= dmat->nsegments)
@@ -636,11 +628,11 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
*/
int
bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
- bus_size_t buflen, bus_dmamap_callback_t *callback,
- void *callback_arg, int flags)
+ bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg,
+ int flags)
{
- bus_addr_t lastaddr = 0;
- int error, nsegs = 0;
+ bus_addr_t lastaddr = 0;
+ int error, nsegs = 0;
if (map != NULL) {
flags |= BUS_DMA_WAITOK;
@@ -666,10 +658,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
* Like _bus_dmamap_load(), but for mbufs.
*/
int
-bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map,
- struct mbuf *m0,
- bus_dmamap_callback2_t *callback, void *callback_arg,
- int flags)
+bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0,
+ bus_dmamap_callback2_t *callback, void *callback_arg, int flags)
{
int nsegs, error;
@@ -686,9 +676,8 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map,
for (m = m0; m != NULL && error == 0; m = m->m_next) {
if (m->m_len > 0) {
error = _bus_dmamap_load_buffer(dmat, map,
- m->m_data, m->m_len,
- NULL, flags, &lastaddr,
- dmat->segments, &nsegs, first);
+ m->m_data, m->m_len, NULL, flags,
+ &lastaddr, dmat->segments, &nsegs, first);
first = 0;
}
}
@@ -707,9 +696,8 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map,
}
int
-bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map,
- struct mbuf *m0, bus_dma_segment_t *segs,
- int *nsegs, int flags)
+bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0,
+ bus_dma_segment_t *segs, int *nsegs, int flags)
{
int error;
@@ -726,9 +714,8 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map,
for (m = m0; m != NULL && error == 0; m = m->m_next) {
if (m->m_len > 0) {
error = _bus_dmamap_load_buffer(dmat, map,
- m->m_data, m->m_len,
- NULL, flags, &lastaddr,
- segs, nsegs, first);
+ m->m_data, m->m_len, NULL, flags,
+ &lastaddr, segs, nsegs, first);
first = 0;
}
}
@@ -744,10 +731,8 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map,
* Like _bus_dmamap_load(), but for uios.
*/
int
-bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map,
- struct uio *uio,
- bus_dmamap_callback2_t *callback, void *callback_arg,
- int flags)
+bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio,
+ bus_dmamap_callback2_t *callback, void *callback_arg, int flags)
{
bus_addr_t lastaddr;
int nsegs, error, first, i;
@@ -826,8 +811,7 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
if (op & BUS_DMASYNC_PREWRITE) {
while (bpage != NULL) {
bcopy((void *)bpage->datavaddr,
- (void *)bpage->vaddr,
- bpage->datacount);
+ (void *)bpage->vaddr, bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
total_bounced++;
@@ -836,8 +820,7 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
if (op & BUS_DMASYNC_POSTREAD) {
while (bpage != NULL) {
bcopy((void *)bpage->vaddr,
- (void *)bpage->datavaddr,
- bpage->datacount);
+ (void *)bpage->datavaddr, bpage->datacount);
bpage = STAILQ_NEXT(bpage, links);
}
total_bounced++;
@@ -870,15 +853,11 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages)
struct bounce_page *bpage;
bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF,
- M_NOWAIT | M_ZERO);
-
+ M_NOWAIT | M_ZERO);
if (bpage == NULL)
break;
bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF,
- M_NOWAIT, 0ul,
- dmat->lowaddr,
- PAGE_SIZE,
- dmat->boundary);
+ M_NOWAIT, 0ul, dmat->lowaddr, PAGE_SIZE, dmat->boundary);
if (bpage->vaddr == 0) {
free(bpage, M_DEVBUF);
break;
@@ -914,7 +893,7 @@ reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit)
static bus_addr_t
add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
- bus_size_t size)
+ bus_size_t size)
{
struct bounce_page *bpage;
@@ -974,8 +953,8 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) {
if (reserve_bounce_pages(map->dmat, map, 1) == 0) {
STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links);
- STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
- map, links);
+ STAILQ_INSERT_TAIL(&bounce_map_callbacklist, map,
+ links);
busdma_swi_pending = 1;
total_deferred++;
swi_sched(vm_ih, 0);
@@ -997,7 +976,7 @@ busdma_swi(void)
dmat = map->dmat;
(dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK);
bus_dmamap_load(map->dmat, map, map->buf, map->buflen,
- map->callback, map->callback_arg, /*flags*/0);
+ map->callback, map->callback_arg, /*flags*/0);
(dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK);
mtx_lock(&bounce_lock);
}
diff --git a/sys/ia64/ia64/clock.c b/sys/ia64/ia64/clock.c
index 33dbb2e..24623c5 100644
--- a/sys/ia64/ia64/clock.c
+++ b/sys/ia64/ia64/clock.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2005 Marcel Moolenaar
+ * Copyright (c) 2005, 2009-2011 Marcel Moolenaar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,9 +32,11 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/interrupt.h>
#include <sys/priority.h>
+#include <sys/proc.h>
#include <sys/queue.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
+#include <sys/timeet.h>
#include <sys/timetc.h>
#include <sys/pcpu.h>
@@ -45,26 +47,12 @@ __FBSDID("$FreeBSD$");
#include <machine/md_var.h>
#include <machine/smp.h>
-SYSCTL_NODE(_debug, OID_AUTO, clock, CTLFLAG_RW, 0, "clock statistics");
-
-static int adjust_edges = 0;
-SYSCTL_INT(_debug_clock, OID_AUTO, adjust_edges, CTLFLAG_RD,
- &adjust_edges, 0, "Number of times ITC got more than 12.5% behind");
-
-static int adjust_excess = 0;
-SYSCTL_INT(_debug_clock, OID_AUTO, adjust_excess, CTLFLAG_RD,
- &adjust_excess, 0, "Total number of ignored ITC interrupts");
-
-static int adjust_lost = 0;
-SYSCTL_INT(_debug_clock, OID_AUTO, adjust_lost, CTLFLAG_RD,
- &adjust_lost, 0, "Total number of lost ITC interrupts");
-
-static int adjust_ticks = 0;
-SYSCTL_INT(_debug_clock, OID_AUTO, adjust_ticks, CTLFLAG_RD,
- &adjust_ticks, 0, "Total number of ITC interrupts with adjustment");
+#define CLOCK_ET_OFF 0
+#define CLOCK_ET_PERIODIC 1
+#define CLOCK_ET_ONESHOT 2
+static struct eventtimer ia64_clock_et;
static u_int ia64_clock_xiv;
-static uint64_t ia64_clock_reload;
#ifndef SMP
static timecounter_get_t ia64_get_timecount;
@@ -87,75 +75,102 @@ ia64_get_timecount(struct timecounter* tc)
static u_int
ia64_ih_clock(struct thread *td, u_int xiv, struct trapframe *tf)
{
- uint64_t adj, clk, itc;
- int64_t delta;
- int count;
+ struct eventtimer *et;
+ uint64_t itc, load;
+ uint32_t mode;
PCPU_INC(md.stats.pcs_nclks);
+ intrcnt[INTRCNT_CLOCK]++;
- if (PCPU_GET(cpuid) == 0) {
- /*
- * Clock processing on the BSP.
- */
- intrcnt[INTRCNT_CLOCK]++;
+ itc = ia64_get_itc();
+ PCPU_SET(md.clock, itc);
- itc = ia64_get_itc();
+ mode = PCPU_GET(md.clock_mode);
+ if (mode == CLOCK_ET_PERIODIC) {
+ load = PCPU_GET(md.clock_load);
+ ia64_set_itm(itc + load);
+ } else
+ ia64_set_itv((1 << 16) | xiv);
- adj = PCPU_GET(md.clockadj);
- clk = PCPU_GET(md.clock);
+ ia64_set_eoi(0);
+ ia64_srlz_d();
- delta = itc - clk;
- count = 0;
- while (delta >= ia64_clock_reload) {
-#ifdef SMP
- ipi_all_but_self(ia64_clock_xiv);
-#endif
- hardclock(TRAPF_USERMODE(tf), TRAPF_PC(tf));
- if (profprocs != 0)
- profclock(TRAPF_USERMODE(tf), TRAPF_PC(tf));
- statclock(TRAPF_USERMODE(tf));
- delta -= ia64_clock_reload;
- clk += ia64_clock_reload;
- if (adj != 0)
- adjust_ticks++;
- count++;
- }
- ia64_set_itm(ia64_get_itc() + ia64_clock_reload - adj);
- ia64_srlz_d();
- if (count > 0) {
- adjust_lost += count - 1;
- if (delta > (ia64_clock_reload >> 3)) {
- if (adj == 0)
- adjust_edges++;
- adj = ia64_clock_reload >> 4;
- } else
- adj = 0;
- } else {
- adj = 0;
- adjust_excess++;
- }
- PCPU_SET(md.clock, clk);
- PCPU_SET(md.clockadj, adj);
+ et = &ia64_clock_et;
+ if (et->et_active)
+ et->et_event_cb(et, et->et_arg);
+ return (1);
+}
+
+/*
+ * Event timer start method.
+ */
+static int
+ia64_clock_start(struct eventtimer *et, struct bintime *first,
+ struct bintime *period)
+{
+ u_long itc, load;
+ register_t is;
+
+ if (period != NULL) {
+ PCPU_SET(md.clock_mode, CLOCK_ET_PERIODIC);
+ load = (et->et_frequency * (period->frac >> 32)) >> 32;
+ if (period->sec > 0)
+ load += et->et_frequency * period->sec;
} else {
- /*
- * Clock processing on the BSP.
- */
- hardclock_cpu(TRAPF_USERMODE(tf));
- if (profprocs != 0)
- profclock(TRAPF_USERMODE(tf), TRAPF_PC(tf));
- statclock(TRAPF_USERMODE(tf));
+ PCPU_SET(md.clock_mode, CLOCK_ET_ONESHOT);
+ load = 0;
}
+ PCPU_SET(md.clock_load, load);
+
+ if (first != NULL) {
+ load = (et->et_frequency * (first->frac >> 32)) >> 32;
+ if (first->sec > 0)
+ load += et->et_frequency * first->sec;
+ }
+
+ is = intr_disable();
+ itc = ia64_get_itc();
+ ia64_set_itm(itc + load);
+ ia64_set_itv(ia64_clock_xiv);
+ ia64_srlz_d();
+ intr_restore(is);
return (0);
}
/*
- * Start the real-time and statistics clocks. We use ar.itc and cr.itm
- * to implement a 1000hz clock.
+ * Event timer stop method.
+ */
+static int
+ia64_clock_stop(struct eventtimer *et)
+{
+
+ ia64_set_itv((1 << 16) | ia64_clock_xiv);
+ ia64_srlz_d();
+ PCPU_SET(md.clock_mode, CLOCK_ET_OFF);
+ PCPU_SET(md.clock_load, 0);
+ return (0);
+}
+
+/*
+ * We call cpu_initclocks() on the APs as well. It allows us to
+ * group common initialization in the same function.
*/
void
cpu_initclocks()
{
+
+ ia64_clock_stop(NULL);
+ if (PCPU_GET(cpuid) == 0)
+ cpu_initclocks_bsp();
+ else
+ cpu_initclocks_ap();
+}
+
+static void
+clock_configure(void *dummy)
+{
+ struct eventtimer *et;
u_long itc_freq;
ia64_clock_xiv = ia64_xiv_alloc(PI_REALTIME, IA64_XIV_IPI,
@@ -165,31 +180,23 @@ cpu_initclocks()
itc_freq = (u_long)ia64_itc_freq() * 1000000ul;
- stathz = hz;
- ia64_clock_reload = (itc_freq + hz/2) / hz;
+ et = &ia64_clock_et;
+ et->et_name = "ITC";
+ et->et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_ONESHOT | ET_FLAGS_PERCPU;
+ et->et_quality = 1000;
+ et->et_frequency = itc_freq;
+ et->et_min_period.sec = 0;
+ et->et_min_period.frac = (0x8000000000000000ul / (u_long)(10*hz)) << 1;
+ et->et_max_period.sec = 0xffffffff;
+ et->et_max_period.frac = ((0xfffffffeul << 32) / itc_freq) << 32;
+ et->et_start = ia64_clock_start;
+ et->et_stop = ia64_clock_stop;
+ et->et_priv = NULL;
+ et_register(et);
#ifndef SMP
ia64_timecounter.tc_frequency = itc_freq;
tc_init(&ia64_timecounter);
#endif
-
- PCPU_SET(md.clockadj, 0);
- PCPU_SET(md.clock, ia64_get_itc());
- ia64_set_itm(PCPU_GET(md.clock) + ia64_clock_reload);
- ia64_set_itv(ia64_clock_xiv);
- ia64_srlz_d();
-}
-
-void
-cpu_startprofclock(void)
-{
-
- /* nothing to do */
-}
-
-void
-cpu_stopprofclock(void)
-{
-
- /* nothing to do */
}
+SYSINIT(clkcfg, SI_SUB_CONFIGURE, SI_ORDER_SECOND, clock_configure, NULL);
diff --git a/sys/ia64/ia64/db_machdep.c b/sys/ia64/ia64/db_machdep.c
index 9d583a1..b689a3c 100644
--- a/sys/ia64/ia64/db_machdep.c
+++ b/sys/ia64/ia64/db_machdep.c
@@ -578,11 +578,13 @@ db_show_mdpcpu(struct pcpu *pc)
{
struct pcpu_md *md = &pc->pc_md;
- db_printf("MD: vhpt = %#lx\n", md->vhpt);
- db_printf("MD: lid = %#lx\n", md->lid);
- db_printf("MD: clock = %#lx/%#lx\n", md->clock, md->clockadj);
- db_printf("MD: stats = %p\n", &md->stats);
- db_printf("MD: pmap = %p\n", md->current_pmap);
+ db_printf("MD: vhpt = %#lx\n", md->vhpt);
+ db_printf("MD: lid = %#lx\n", md->lid);
+ db_printf("MD: clock = %#lx\n", md->clock);
+ db_printf("MD: clock_mode = %u\n", md->clock_mode);
+ db_printf("MD: clock_load = %#lx\n", md->clock_load);
+ db_printf("MD: stats = %p\n", &md->stats);
+ db_printf("MD: pmap = %p\n", md->current_pmap);
}
void
diff --git a/sys/ia64/ia64/efi.c b/sys/ia64/ia64/efi.c
index 5cd4518..32868a0 100644
--- a/sys/ia64/ia64/efi.c
+++ b/sys/ia64/ia64/efi.c
@@ -161,20 +161,67 @@ efi_get_time(struct efi_tm *tm)
struct efi_md *
efi_md_first(void)
{
+ struct efi_md *md;
+
+ if (bootinfo->bi_memmap == 0)
+ return (NULL);
+ md = (struct efi_md *)bootinfo->bi_memmap;
+ return (md);
+}
+
+struct efi_md *
+efi_md_last(void)
+{
+ struct efi_md *md;
if (bootinfo->bi_memmap == 0)
return (NULL);
- return ((struct efi_md *)bootinfo->bi_memmap);
+ md = (struct efi_md *)(bootinfo->bi_memmap + bootinfo->bi_memmap_size -
+ bootinfo->bi_memdesc_size);
+ return (md);
}
struct efi_md *
efi_md_next(struct efi_md *md)
{
- uint64_t plim;
+ struct efi_md *lim;
- plim = bootinfo->bi_memmap + bootinfo->bi_memmap_size;
+ lim = efi_md_last();
md = (struct efi_md *)((uintptr_t)md + bootinfo->bi_memdesc_size);
- return ((md >= (struct efi_md *)plim) ? NULL : md);
+ return ((md > lim) ? NULL : md);
+}
+
+struct efi_md *
+efi_md_prev(struct efi_md *md)
+{
+ struct efi_md *lim;
+
+ lim = efi_md_first();
+ md = (struct efi_md *)((uintptr_t)md - bootinfo->bi_memdesc_size);
+ return ((md < lim) ? NULL : md);
+}
+
+struct efi_md *
+efi_md_find(vm_paddr_t pa)
+{
+ static struct efi_md *last = NULL;
+ struct efi_md *md, *p0, *p1;
+
+ md = (last != NULL) ? last : efi_md_first();
+ p1 = p0 = NULL;
+ while (md != NULL && md != p1) {
+ if (pa >= md->md_phys &&
+ pa < md->md_phys + md->md_pages * EFI_PAGE_SIZE) {
+ last = md;
+ return (md);
+ }
+
+ p1 = p0;
+ p0 = md;
+ md = (pa < md->md_phys) ? efi_md_prev(md) : efi_md_next(md);
+ }
+
+ return (NULL);
}
void
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S
index 729a96c..a38df1a 100644
--- a/sys/ia64/ia64/exception.S
+++ b/sys/ia64/ia64/exception.S
@@ -50,9 +50,6 @@ __FBSDID("$FreeBSD$");
.section .ivt.data, "aw"
- .global pmap_ptc_g_sem
-pmap_ptc_g_sem: data8 0
-
.global ia64_kptdir
ia64_kptdir: data8 0
@@ -151,58 +148,51 @@ ENTRY_NOPROFILE(exception_save, 0)
}
{ .mmi
mov ar.rsc=0
- sub r19=r23,r30
- add r31=8,r30
- ;;
-}
-{ .mmi
mov r22=cr.iip
- nop 0
addl r29=NTLBRT_SAVE,r0 // 22-bit restart token.
;;
}
/*
- * We have a 1KB aligned trapframe, pointed to by sp. If we write
- * to the trapframe, we may trigger a data nested TLB fault. By
- * aligning the trapframe on a 1KB boundary, we guarantee that if
- * we get a data nested TLB fault, it will be on the very first
- * write. Since the data nested TLB fault does not preserve any
- * state, we have to be careful what we clobber. Consequently, we
- * have to be careful what we use here. Below a list of registers
- * that are currently alive:
+ * We have a 1KB aligned trapframe, pointed to by r30. We can't
+ * reliably write to the trapframe using virtual addressing, due
+ * to the fact that TC entries we depend on can be removed by:
+ * 1. ptc.g instructions issued by other threads/cores/CPUs, or
+ * 2. TC modifications in another thread on the same core.
+ * When our TC entry gets removed, we get nested TLB faults and
+ * since no state is saved, we can only deal with those when
+ * explicitly coded and expected.
+ * As such, we switch to physical addressing and account for the
+ * fact that the tpa instruction can cause a nested TLB fault.
+ * Since the data nested TLB fault does not preserve any state,
+ * we have to be careful what we clobber. Consequently, we have
+ * to be careful what we use here. Below a list of registers that
+ * are considered alive:
* r16,r17=arguments
* r18=pr, r19=length, r20=unat, r21=rsc, r22=iip, r23=TOS
- * r29=restart point
- * r30,r31=trapframe pointers
+ * r29=restart token
+ * r30=trapframe pointers
* p14,p15=memory stack switch
*/
-
- /* PTC.G enter non-exclusive */
- mov r24 = ar.ccv
- movl r25 = pmap_ptc_g_sem
- ;;
-.ptc_g_0:
- ld8.acq r26 = [r25]
- ;;
- tbit.nz p12, p0 = r26, 63
-(p12) br.cond.spnt.few .ptc_g_0
- ;;
- mov ar.ccv = r26
- adds r27 = 1, r26
+exception_save_restart:
+ tpa r24=r30 // Nested TLB fault possible
+ sub r19=r23,r30
+ nop 0
;;
- cmpxchg8.rel r27 = [r25], r27, ar.ccv
+
+ rsm psr.dt
+ add r29=16,r19 // Clobber restart token
+ mov r30=r24
;;
- cmp.ne p12, p0 = r26, r27
-(p12) br.cond.spnt.few .ptc_g_0
+ srlz.d
+ add r31=8,r24
;;
- mov ar.ccv = r24
-exception_save_restart:
+ // r18=pr, r19=length, r20=unat, r21=rsc, r22=iip, r23=TOS
+ // r29=delta
{ .mmi
st8 [r30]=r19,16 // length
st8 [r31]=r0,16 // flags
- add r29=16,r19 // Clobber restart token
;;
}
{ .mmi
@@ -218,6 +208,7 @@ exception_save_restart:
;;
}
// r18=pr, r19=rnat, r20=bspstore, r21=rsc, r22=iip, r23=rp
+ // r24=pfs
{ .mmi
st8 [r30]=r23,16 // rp
st8 [r31]=r18,16 // pr
@@ -275,7 +266,7 @@ exception_save_restart:
sub r18=r18,r20
;;
}
- // r19=ifs, r22=iip
+ // r18=ndirty, r19=ifs, r22=iip
{ .mmi
st8 [r31]=r18,16 // ndirty
st8 [r30]=r19,16 // cfm
@@ -431,27 +422,10 @@ exception_save_restart:
;;
}
{ .mlx
- ssm psr.ic|psr.dfh
+ ssm psr.dt|psr.ic|psr.dfh
movl gp=__gp
;;
}
-
- /* PTC.G leave non-exclusive */
- srlz.d
- movl r25 = pmap_ptc_g_sem
- ;;
-.ptc_g_1:
- ld8.acq r26 = [r25]
- ;;
- mov ar.ccv = r26
- adds r27 = -1, r26
- ;;
- cmpxchg8.rel r27 = [r25], r27, ar.ccv
- ;;
- cmp.ne p12, p0 = r26, r27
-(p12) br.cond.spnt.few .ptc_g_1
- ;;
-
{ .mib
srlz.d
nop 0
@@ -469,34 +443,52 @@ END(exception_save)
ENTRY_NOPROFILE(exception_restore, 0)
{ .mmi
rsm psr.i
- add r3=SIZEOF_TRAPFRAME-16,sp
- add r2=SIZEOF_TRAPFRAME,sp
+ add sp=16,sp
+ nop 0
;;
}
-{ .mmi
+
+ // The next instruction can fault. Let it be...
+ tpa r9=sp
+ ;;
+ rsm psr.dt|psr.ic
+ add r8=SIZEOF_SPECIAL+16,r9
+ ;;
srlz.d
- add r8=SIZEOF_SPECIAL+32,sp
- nop 0
+ add r2=SIZEOF_TRAPFRAME-16,r9
+ add r3=SIZEOF_TRAPFRAME-32,r9
;;
-}
- // The next load can trap. Let it be...
+
+{ .mmi
ldf.fill f15=[r2],-32 // f15
ldf.fill f14=[r3],-32 // f14
- add sp=16,sp
+ nop 0
;;
+}
+{ .mmi
ldf.fill f13=[r2],-32 // f13
ldf.fill f12=[r3],-32 // f12
+ nop 0
;;
+}
+{ .mmi
ldf.fill f11=[r2],-32 // f11
ldf.fill f10=[r3],-32 // f10
+ nop 0
;;
+}
+{ .mmi
ldf.fill f9=[r2],-32 // f9
ldf.fill f8=[r3],-32 // f8
+ nop 0
;;
+}
+{ .mmi
ldf.fill f7=[r2],-24 // f7
ldf.fill f6=[r3],-16 // f6
+ nop 0
;;
-
+}
{ .mmi
ld8 r8=[r8] // unat (after)
;;
@@ -553,53 +545,53 @@ ENTRY_NOPROFILE(exception_restore, 0)
bsw.0
;;
}
+{ .mii
+ ld8 r16=[r9] // tf_length
+ add r31=16,r9
+ add r30=24,r9
+}
{ .mmi
ld8.fill r15=[r3],-16 // r15
ld8.fill r14=[r2],-16 // r14
- add r31=16,sp
+ nop 0
;;
}
{ .mmi
- ld8 r16=[sp] // tf_length
ld8.fill r11=[r3],-16 // r11
- add r30=24,sp
- ;;
-}
-{ .mmi
ld8.fill r10=[r2],-16 // r10
- ld8.fill r9=[r3],-16 // r9
add r16=r16,sp // ar.k7
;;
}
{ .mmi
+ ld8.fill r9=[r3],-16 // r9
ld8.fill r8=[r2],-16 // r8
- ld8.fill r3=[r3] // r3
+ nop 0
;;
}
- // We want nested TLB faults from here on...
- rsm psr.ic|psr.i
+{ .mmi
+ ld8.fill r3=[r3] // r3
ld8.fill r2=[r2] // r2
nop 0
;;
- srlz.d
- ld8.fill sp=[r31],16 // sp
- nop 0
- ;;
+}
+ ld8.fill sp=[r31],16 // sp
ld8 r17=[r30],16 // unat
- ld8 r29=[r31],16 // rp
;;
+ ld8 r29=[r31],16 // rp
ld8 r18=[r30],16 // pr
+ ;;
ld8 r28=[r31],16 // pfs
+ ld8 r20=[r30],24 // bspstore
mov rp=r29
;;
- ld8 r20=[r30],24 // bspstore
ld8 r21=[r31],24 // rnat
mov ar.pfs=r28
;;
ld8.fill r26=[r30],16 // tp
ld8 r22=[r31],16 // rsc
;;
+
{ .mmi
ld8 r23=[r30],16 // fpsr
ld8 r24=[r31],16 // psr
@@ -636,6 +628,11 @@ ENTRY_NOPROFILE(exception_restore, 0)
addl r29=NTLBRT_RESTORE,r0 // 22-bit restart token
;;
}
+
+ ssm psr.dt
+ ;;
+ srlz.d
+
exception_restore_restart:
{ .mmi
mov r30=ar.bspstore
@@ -1015,15 +1012,33 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400)
// here are direct mapped region 7 addresses, we have no problem
// constructing physical addresses.
-{ .mlx
+{ .mmi
+ mov cr.ifa=r30
+ mov r26=rr[r30]
+ extr.u r27=r30,61,3
+ ;;
+}
+{ .mii
nop 0
- movl r27=ia64_kptdir
+ dep r26=0,r26,0,2
+ cmp.eq p12,p13=7,r27
;;
}
{ .mii
- ld8 r27=[r27]
- extr.u r28=r30,3*PAGE_SHIFT-8, PAGE_SHIFT-3 // dir L0 index
- extr.u r26=r30,2*PAGE_SHIFT-5, PAGE_SHIFT-3 // dir L1 index
+ mov cr.itir=r26
+(p12) dep r28=0,r30,61,3
+(p13) extr.u r28=r30,3*PAGE_SHIFT-8, PAGE_SHIFT-3 // dir L0 index
+ ;;
+}
+{ .mlx
+(p12) add r28=PTE_PRESENT+PTE_ACCESSED+PTE_DIRTY+PTE_PL_KERN+PTE_AR_RWX+PTE_MA_WB,r28
+(p13) movl r27=ia64_kptdir
+ ;;
+}
+{ .mib
+(p13) ld8 r27=[r27]
+(p13) extr.u r26=r30,2*PAGE_SHIFT-5, PAGE_SHIFT-3 // dir L1 index
+(p12) br.cond.spnt.few 1f
;;
}
{ .mmi
@@ -1040,58 +1055,48 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400)
extr.u r28=r30,PAGE_SHIFT,PAGE_SHIFT-5 // pte index
;;
}
-{ .mmi
+{ .mii
shladd r27=r26,3,r27
+ shl r28=r28,5
;;
- mov r26=rr[r30]
dep r27=0,r27,61,3
;;
}
-{ .mii
ld8 r27=[r27] // pte page
- shl r28=r28,5
- dep r26=0,r26,0,2
;;
-}
-{ .mmi
add r27=r28,r27
;;
- mov cr.ifa=r30
dep r27=0,r27,61,3
;;
-}
-{ .mmi
- ld8 r28=[r27] // pte
+ ld8 r28=[r27] // pte
;;
- mov cr.itir=r26
or r28=PTE_DIRTY+PTE_ACCESSED,r28
;;
-}
-{ .mmi
st8 [r27]=r28
;;
- addl r26=NTLBRT_SAVE,r0
- addl r27=NTLBRT_RESTORE,r0
-}
+ ssm psr.dt
+ ;;
+1:
{ .mmi
itc.d r28
;;
- ssm psr.dt
- cmp.eq p12,p0=r29,r26
+ addl r26=NTLBRT_SAVE,r0
+ addl r27=NTLBRT_RESTORE,r0
;;
}
-{ .mib
+{ .mmi
srlz.d
+ cmp.eq p12,p0=r29,r26
cmp.eq p13,p0=r29,r27
-(p12) br.cond.sptk.few exception_save_restart
;;
}
-{ .mib
- nop 0
+{ .mbb
nop 0
+(p12) br.cond.sptk.few exception_save_restart
(p13) br.cond.sptk.few exception_restore_restart
;;
}
+
{ .mlx
mov r26=ar.bsp
movl r29=kstack
diff --git a/sys/ia64/ia64/interrupt.c b/sys/ia64/ia64/interrupt.c
index adb16ec..c2372b2 100644
--- a/sys/ia64/ia64/interrupt.c
+++ b/sys/ia64/ia64/interrupt.c
@@ -1,41 +1,33 @@
-/* $FreeBSD$ */
-/* $NetBSD: interrupt.c,v 1.23 1998/02/24 07:38:01 thorpej Exp $ */
-
/*-
- * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
+ * Copyright (c) 2010-2011 Marcel Moolenaar
* All rights reserved.
*
- * Authors: Keith Bostic, Chris G. Demetriou
- *
- * Permission to use, copy, modify and distribute this software and
- * its documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
- * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
*
- * any improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- */
-/*-
- * Additional Copyright (c) 1997 by Matthew Jacob for NASA/Ames Research Center.
- * Redistribute and modify at will, leaving only this additional copyright
- * notice.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
*/
#include "opt_ddb.h"
-#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
@@ -309,6 +301,7 @@ void
ia64_handle_intr(struct trapframe *tf)
{
struct thread *td;
+ struct trapframe *stf;
u_int xiv;
td = curthread;
@@ -323,17 +316,21 @@ ia64_handle_intr(struct trapframe *tf)
}
critical_enter();
+ stf = td->td_intr_frame;
+ td->td_intr_frame = tf;
do {
CTR2(KTR_INTR, "INTR: ITC=%u, XIV=%u",
(u_int)tf->tf_special.ifa, xiv);
- (ia64_handler[xiv])(td, xiv, tf);
- ia64_set_eoi(0);
- ia64_srlz_d();
+ if (!(ia64_handler[xiv])(td, xiv, tf)) {
+ ia64_set_eoi(0);
+ ia64_srlz_d();
+ }
xiv = ia64_get_ivr();
ia64_srlz_d();
} while (xiv != 15);
+ td->td_intr_frame = stf;
critical_exit();
out:
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index f3105fc..2bfd62e 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -347,6 +347,11 @@ cpu_startup(void *dummy)
SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx,
SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO,
+ "nhardclocks", CTLFLAG_RD, &pcs->pcs_nhardclocks,
+ "Number of IPI_HARDCLOCK interrupts");
+
+ SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx,
+ SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO,
"nhighfps", CTLFLAG_RD, &pcs->pcs_nhighfps,
"Number of IPI_HIGH_FP interrupts");
@@ -416,12 +421,10 @@ cpu_idle(int busy)
{
register_t ie;
-#if 0
if (!busy) {
critical_enter();
cpu_idleclock();
}
-#endif
ie = intr_disable();
KASSERT(ie != 0, ("%s called with interrupts disabled\n", __func__));
@@ -436,12 +439,10 @@ cpu_idle(int busy)
ia64_enable_intr();
}
-#if 0
if (!busy) {
cpu_activeclock();
critical_exit();
}
-#endif
}
int
@@ -470,12 +471,12 @@ cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx)
if (PCPU_GET(fpcurthread) == old)
old->td_frame->tf_special.psr |= IA64_PSR_DFH;
if (!savectx(oldpcb)) {
- atomic_store_rel_ptr(&old->td_lock, mtx);
-
newpcb = new->td_pcb;
oldpcb->pcb_current_pmap =
pmap_switch(newpcb->pcb_current_pmap);
+ atomic_store_rel_ptr(&old->td_lock, mtx);
+
#if defined(SCHED_ULE) && defined(SMP)
while (atomic_load_acq_ptr(&new->td_lock) == &blocked_lock)
cpu_spinwait();
diff --git a/sys/ia64/ia64/mp_machdep.c b/sys/ia64/ia64/mp_machdep.c
index 15afea0..0d8f241 100644
--- a/sys/ia64/ia64/mp_machdep.c
+++ b/sys/ia64/ia64/mp_machdep.c
@@ -77,6 +77,7 @@ void ia64_ap_startup(void);
struct ia64_ap_state ia64_ap_state;
int ia64_ipi_ast;
+int ia64_ipi_hardclock;
int ia64_ipi_highfp;
int ia64_ipi_nmi;
int ia64_ipi_preempt;
@@ -108,6 +109,16 @@ ia64_ih_ast(struct thread *td, u_int xiv, struct trapframe *tf)
}
static u_int
+ia64_ih_hardclock(struct thread *td, u_int xiv, struct trapframe *tf)
+{
+
+ PCPU_INC(md.stats.pcs_nhardclocks);
+ CTR1(KTR_SMP, "IPI_HARDCLOCK, cpuid=%d", PCPU_GET(cpuid));
+ hardclockintr();
+ return (0);
+}
+
+static u_int
ia64_ih_highfp(struct thread *td, u_int xiv, struct trapframe *tf)
{
@@ -139,18 +150,18 @@ ia64_ih_rndzvs(struct thread *td, u_int xiv, struct trapframe *tf)
static u_int
ia64_ih_stop(struct thread *td, u_int xiv, struct trapframe *tf)
{
- cpuset_t mybit;
+ u_int cpuid;
PCPU_INC(md.stats.pcs_nstops);
- mybit = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
savectx(PCPU_PTR(md.pcb));
- CPU_OR_ATOMIC(&stopped_cpus, &mybit);
- while (!CPU_OVERLAP(&started_cpus, &mybit))
+ CPU_SET_ATOMIC(cpuid, &stopped_cpus);
+ while (!CPU_ISSET(cpuid, &started_cpus))
cpu_spinwait();
- CPU_NAND_ATOMIC(&started_cpus, &mybit);
- CPU_NAND_ATOMIC(&stopped_cpus, &mybit);
+ CPU_CLR_ATOMIC(cpuid, &started_cpus);
+ CPU_CLR_ATOMIC(cpuid, &stopped_cpus);
return (0);
}
@@ -233,10 +244,11 @@ ia64_ap_startup(void)
CTR1(KTR_SMP, "SMP: cpu%d launched", PCPU_GET(cpuid));
- /* Mask interval timer interrupts on APs. */
- ia64_set_itv(0x10000);
+ cpu_initclocks();
+
ia64_set_tpr(0);
ia64_srlz_d();
+
ia64_enable_intr();
sched_throw(NULL);
@@ -359,8 +371,6 @@ cpu_mp_start()
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
pc->pc_md.current_pmap = kernel_pmap;
- pc->pc_other_cpus = all_cpus;
- CPU_NAND(&pc->pc_other_cpus, &pc->pc_cpumask);
/* The BSP is obviously running already. */
if (pc->pc_cpuid == 0) {
pc->pc_md.awake = 1;
@@ -413,6 +423,8 @@ cpu_mp_unleash(void *dummy)
/* Allocate XIVs for IPIs */
ia64_ipi_ast = ia64_xiv_alloc(PI_DULL, IA64_XIV_IPI, ia64_ih_ast);
+ ia64_ipi_hardclock = ia64_xiv_alloc(PI_REALTIME, IA64_XIV_IPI,
+ ia64_ih_hardclock);
ia64_ipi_highfp = ia64_xiv_alloc(PI_AV, IA64_XIV_IPI, ia64_ih_highfp);
ia64_ipi_preempt = ia64_xiv_alloc(PI_SOFT, IA64_XIV_IPI,
ia64_ih_preempt);
@@ -464,7 +476,7 @@ ipi_selected(cpuset_t cpus, int ipi)
struct pcpu *pc;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- if (CPU_OVERLAP(&cpus, &pc->pc_cpumask))
+ if (CPU_ISSET(pc->pc_cpuid, &cpus))
ipi_send(pc, ipi);
}
}
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index 411d53a..0e34f36 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
#include <vm/uma.h>
#include <machine/bootinfo.h>
+#include <machine/efi.h>
#include <machine/md_var.h>
#include <machine/pal.h>
@@ -179,7 +180,7 @@ static uint64_t pmap_ptc_e_count2 = 2;
static uint64_t pmap_ptc_e_stride1 = 0x2000;
static uint64_t pmap_ptc_e_stride2 = 0x100000000;
-extern volatile u_long pmap_ptc_g_sem;
+struct mtx pmap_ptc_mutex;
/*
* Data for the RID allocator
@@ -338,6 +339,8 @@ pmap_bootstrap()
pmap_ptc_e_stride1,
pmap_ptc_e_stride2);
+ mtx_init(&pmap_ptc_mutex, "PTC.G mutex", NULL, MTX_SPIN);
+
/*
* Setup RIDs. RIDs 0..7 are reserved for the kernel.
*
@@ -481,6 +484,18 @@ pmap_vhpt_population(SYSCTL_HANDLER_ARGS)
return (error);
}
+vm_offset_t
+pmap_page_to_va(vm_page_t m)
+{
+ vm_paddr_t pa;
+ vm_offset_t va;
+
+ pa = VM_PAGE_TO_PHYS(m);
+ va = (m->md.memattr == VM_MEMATTR_UNCACHEABLE) ? IA64_PHYS_TO_RR6(pa) :
+ IA64_PHYS_TO_RR7(pa);
+ return (va);
+}
+
/*
* Initialize a vm_page's machine-dependent fields.
*/
@@ -490,6 +505,7 @@ pmap_page_init(vm_page_t m)
TAILQ_INIT(&m->md.pv_list);
m->md.pv_list_count = 0;
+ m->md.memattr = VM_MEMATTR_DEFAULT;
}
/*
@@ -528,11 +544,11 @@ pmap_invalidate_page(vm_offset_t va)
{
struct ia64_lpte *pte;
struct pcpu *pc;
- uint64_t tag, sem;
- register_t is;
+ uint64_t tag;
u_int vhpt_ofs;
critical_enter();
+
vhpt_ofs = ia64_thash(va) - PCPU_GET(md.vhpt);
tag = ia64_ttag(va);
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
@@ -540,30 +556,16 @@ pmap_invalidate_page(vm_offset_t va)
atomic_cmpset_64(&pte->tag, tag, 1UL << 63);
}
- /* PTC.G enter exclusive */
- is = intr_disable();
-
- /* Atomically assert writer after all writers have gone. */
- do {
- /* Wait until there's no more writer. */
- do {
- sem = atomic_load_acq_long(&pmap_ptc_g_sem);
- tag = sem | (1ul << 63);
- } while (sem == tag);
- } while (!atomic_cmpset_rel_long(&pmap_ptc_g_sem, sem, tag));
-
- /* Wait until all readers are gone. */
- tag = (1ul << 63);
- do {
- sem = atomic_load_acq_long(&pmap_ptc_g_sem);
- } while (sem != tag);
+ mtx_lock_spin(&pmap_ptc_mutex);
ia64_ptc_ga(va, PAGE_SHIFT << 2);
+ ia64_mf();
+ ia64_srlz_i();
- /* PTC.G leave exclusive */
- atomic_store_rel_long(&pmap_ptc_g_sem, 0);
+ mtx_unlock_spin(&pmap_ptc_mutex);
+
+ ia64_invala();
- intr_restore(is);
critical_exit();
}
@@ -714,8 +716,7 @@ pmap_growkernel(vm_offset_t addr)
if (!nkpg)
panic("%s: cannot add dir. page", __func__);
- dir1 = (struct ia64_lpte **)
- IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(nkpg));
+ dir1 = (struct ia64_lpte **)pmap_page_to_va(nkpg);
bzero(dir1, PAGE_SIZE);
ia64_kptdir[KPTE_DIR0_INDEX(kernel_vm_end)] = dir1;
}
@@ -725,8 +726,7 @@ pmap_growkernel(vm_offset_t addr)
if (!nkpg)
panic("%s: cannot add PTE page", __func__);
- leaf = (struct ia64_lpte *)
- IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(nkpg));
+ leaf = (struct ia64_lpte *)pmap_page_to_va(nkpg);
bzero(leaf, PAGE_SIZE);
dir1[KPTE_DIR1_INDEX(kernel_vm_end)] = leaf;
@@ -786,7 +786,7 @@ get_pv_entry(pmap_t locked_pmap)
vpq = &vm_page_queues[PQ_INACTIVE];
retry:
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -1137,6 +1137,14 @@ pmap_pte_prot(pmap_t pm, struct ia64_lpte *pte, vm_prot_t prot)
pte->pte |= prot2ar[(prot & VM_PROT_ALL) >> 1];
}
+static PMAP_INLINE void
+pmap_pte_attr(struct ia64_lpte *pte, vm_memattr_t ma)
+{
+
+ pte->pte &= ~PTE_MA_MASK;
+ pte->pte |= (ma & PTE_MA_MASK);
+}
+
/*
* Set a pte to contain a valid mapping and enter it in the VHPT. If
* the pte was orginally valid, then its assumed to already be in the
@@ -1149,8 +1157,9 @@ pmap_set_pte(struct ia64_lpte *pte, vm_offset_t va, vm_offset_t pa,
boolean_t wired, boolean_t managed)
{
- pte->pte &= PTE_PROT_MASK | PTE_PL_MASK | PTE_AR_MASK | PTE_ED;
- pte->pte |= PTE_PRESENT | PTE_MA_WB;
+ pte->pte &= PTE_PROT_MASK | PTE_MA_MASK | PTE_PL_MASK |
+ PTE_AR_MASK | PTE_ED;
+ pte->pte |= PTE_PRESENT;
pte->pte |= (managed) ? PTE_MANAGED : (PTE_DIRTY | PTE_ACCESSED);
pte->pte |= (wired) ? PTE_WIRED : 0;
pte->pte |= pa & PTE_PPN_MASK;
@@ -1267,6 +1276,7 @@ pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
else
pmap_enter_vhpt(pte, va);
pmap_pte_prot(kernel_pmap, pte, VM_PROT_ALL);
+ pmap_pte_attr(pte, m[i]->md.memattr);
pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m[i]), FALSE, FALSE);
va += PAGE_SIZE;
}
@@ -1308,6 +1318,7 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa)
else
pmap_enter_vhpt(pte, va);
pmap_pte_prot(kernel_pmap, pte, VM_PROT_ALL);
+ pmap_pte_attr(pte, VM_MEMATTR_DEFAULT);
pmap_set_pte(pte, va, pa, FALSE, FALSE);
}
@@ -1420,8 +1431,8 @@ pmap_remove_all(vm_page_t m)
pmap_t oldpmap;
pv_entry_t pv;
- KASSERT((m->flags & PG_FICTITIOUS) == 0,
- ("pmap_remove_all: page %p is fictitious", m));
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
vm_page_lock_queues();
while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
struct ia64_lpte *pte;
@@ -1618,6 +1629,7 @@ validate:
* adds the pte to the VHPT if necessary.
*/
pmap_pte_prot(pmap, pte, prot);
+ pmap_pte_attr(pte, m->md.memattr);
pmap_set_pte(pte, va, pa, wired, managed);
/* Invalidate the I-cache when needed. */
@@ -1723,6 +1735,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
pmap_enter_vhpt(pte, va);
pmap_pte_prot(pmap, pte,
prot & (VM_PROT_READ | VM_PROT_EXECUTE));
+ pmap_pte_attr(pte, m->md.memattr);
pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), FALSE, managed);
if (prot & VM_PROT_EXECUTE)
@@ -1805,8 +1818,10 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
void
pmap_zero_page(vm_page_t m)
{
- vm_offset_t va = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
- bzero((caddr_t) va, PAGE_SIZE);
+ void *p;
+
+ p = (void *)pmap_page_to_va(m);
+ bzero(p, PAGE_SIZE);
}
@@ -1821,8 +1836,10 @@ pmap_zero_page(vm_page_t m)
void
pmap_zero_page_area(vm_page_t m, int off, int size)
{
- vm_offset_t va = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
- bzero((char *)(caddr_t)va + off, size);
+ char *p;
+
+ p = (void *)pmap_page_to_va(m);
+ bzero(p + off, size);
}
@@ -1835,8 +1852,10 @@ pmap_zero_page_area(vm_page_t m, int off, int size)
void
pmap_zero_page_idle(vm_page_t m)
{
- vm_offset_t va = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(m));
- bzero((caddr_t) va, PAGE_SIZE);
+ void *p;
+
+ p = (void *)pmap_page_to_va(m);
+ bzero(p, PAGE_SIZE);
}
@@ -1849,9 +1868,11 @@ pmap_zero_page_idle(vm_page_t m)
void
pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
{
- vm_offset_t src = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(msrc));
- vm_offset_t dst = IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS(mdst));
- bcopy((caddr_t) src, (caddr_t) dst, PAGE_SIZE);
+ void *dst, *src;
+
+ src = (void *)pmap_page_to_va(msrc);
+ dst = (void *)pmap_page_to_va(mdst);
+ bcopy(src, dst, PAGE_SIZE);
}
/*
@@ -2198,6 +2219,7 @@ pmap_remove_write(vm_page_t m)
}
prot &= ~VM_PROT_WRITE;
pmap_pte_prot(pmap, pte, prot);
+ pmap_pte_attr(pte, m->md.memattr);
pmap_invalidate_page(pv->pv_va);
}
pmap_switch(oldpmap);
@@ -2214,12 +2236,37 @@ pmap_remove_write(vm_page_t m)
* NOT real memory.
*/
void *
-pmap_mapdev(vm_paddr_t pa, vm_size_t size)
+pmap_mapdev(vm_paddr_t pa, vm_size_t sz)
{
+ static void *last_va = NULL;
+ static vm_paddr_t last_pa = 0;
+ static vm_size_t last_sz = 0;
+ struct efi_md *md;
vm_offset_t va;
- va = pa | IA64_RR_BASE(6);
- return ((void *)va);
+ if (pa == last_pa && sz == last_sz)
+ return (last_va);
+
+ md = efi_md_find(pa);
+ if (md == NULL) {
+ printf("%s: [%#lx..%#lx] not covered by memory descriptor\n",
+ __func__, pa, pa + sz - 1);
+ return (NULL);
+ }
+
+ if (md->md_type == EFI_MD_TYPE_FREE) {
+ printf("%s: [%#lx..%#lx] is in DRAM\n", __func__, pa,
+ pa + sz - 1);
+ return (NULL);
+ }
+
+ va = (md->md_attr & EFI_MD_ATTR_WB) ? IA64_PHYS_TO_RR7(pa) :
+ IA64_PHYS_TO_RR6(pa);
+
+ last_va = (void *)va;
+ last_pa = pa;
+ last_sz = sz;
+ return (last_va);
}
/*
@@ -2231,6 +2278,63 @@ pmap_unmapdev(vm_offset_t va, vm_size_t size)
}
/*
+ * Sets the memory attribute for the specified page.
+ */
+static void
+pmap_page_set_memattr_1(void *arg)
+{
+ struct ia64_pal_result res;
+ register_t is;
+ uintptr_t pp = (uintptr_t)arg;
+
+ is = intr_disable();
+ res = ia64_call_pal_static(pp, 0, 0, 0);
+ intr_restore(is);
+}
+
+void
+pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
+{
+ struct ia64_lpte *pte;
+ pmap_t oldpmap;
+ pv_entry_t pv;
+ void *va;
+
+ vm_page_lock_queues();
+ m->md.memattr = ma;
+ TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
+ PMAP_LOCK(pv->pv_pmap);
+ oldpmap = pmap_switch(pv->pv_pmap);
+ pte = pmap_find_vhpt(pv->pv_va);
+ KASSERT(pte != NULL, ("pte"));
+ pmap_pte_attr(pte, ma);
+ pmap_invalidate_page(pv->pv_va);
+ pmap_switch(oldpmap);
+ PMAP_UNLOCK(pv->pv_pmap);
+ }
+ vm_page_unlock_queues();
+
+ if (ma == VM_MEMATTR_UNCACHEABLE) {
+#ifdef SMP
+ smp_rendezvous(NULL, pmap_page_set_memattr_1, NULL,
+ (void *)PAL_PREFETCH_VISIBILITY);
+#else
+ pmap_page_set_memattr_1((void *)PAL_PREFETCH_VISIBILITY);
+#endif
+ va = (void *)pmap_page_to_va(m);
+ critical_enter();
+ cpu_flush_dcache(va, PAGE_SIZE);
+ critical_exit();
+#ifdef SMP
+ smp_rendezvous(NULL, pmap_page_set_memattr_1, NULL,
+ (void *)PAL_MC_DRAIN);
+#else
+ pmap_page_set_memattr_1((void *)PAL_MC_DRAIN);
+#endif
+ }
+}
+
+/*
* perform the pmap work for mincore
*/
int
@@ -2240,7 +2344,7 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
struct ia64_lpte *pte, tpte;
vm_paddr_t pa;
int val;
-
+
PMAP_LOCK(pmap);
retry:
oldpmap = pmap_switch(pmap);
diff --git a/sys/ia64/include/efi.h b/sys/ia64/include/efi.h
index f32f3fa..02bef10 100644
--- a/sys/ia64/include/efi.h
+++ b/sys/ia64/include/efi.h
@@ -161,8 +161,11 @@ void efi_boot_finish(void);
int efi_boot_minimal(uint64_t);
void *efi_get_table(struct uuid *);
void efi_get_time(struct efi_tm *);
+struct efi_md *efi_md_find(vm_paddr_t);
struct efi_md *efi_md_first(void);
+struct efi_md *efi_md_last(void);
struct efi_md *efi_md_next(struct efi_md *);
+struct efi_md *efi_md_prev(struct efi_md *);
void efi_reset_system(void);
int efi_set_time(struct efi_tm *);
int efi_var_get(efi_char *, struct uuid *, uint32_t *, size_t *, void *);
diff --git a/sys/ia64/include/ia64_cpu.h b/sys/ia64/include/ia64_cpu.h
index bb8284d..74e649b 100644
--- a/sys/ia64/include/ia64_cpu.h
+++ b/sys/ia64/include/ia64_cpu.h
@@ -266,7 +266,7 @@ ia64_ptc_e(uint64_t v)
static __inline void
ia64_ptc_g(uint64_t va, uint64_t log2size)
{
- __asm __volatile("ptc.g %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size));
+ __asm __volatile("ptc.g %0,%1;;" :: "r"(va), "r"(log2size));
}
/*
@@ -275,7 +275,7 @@ ia64_ptc_g(uint64_t va, uint64_t log2size)
static __inline void
ia64_ptc_ga(uint64_t va, uint64_t log2size)
{
- __asm __volatile("ptc.ga %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size));
+ __asm __volatile("ptc.ga %0,%1;;" :: "r"(va), "r"(log2size));
}
/*
@@ -288,6 +288,15 @@ ia64_ptc_l(uint64_t va, uint64_t log2size)
}
/*
+ * Invalidate the ALAT on the local processor.
+ */
+static __inline void
+ia64_invala(void)
+{
+ __asm __volatile("invala;;");
+}
+
+/*
* Unordered memory load.
*/
diff --git a/sys/ia64/include/pcpu.h b/sys/ia64/include/pcpu.h
index 05e2cc1..5ad61ba 100644
--- a/sys/ia64/include/pcpu.h
+++ b/sys/ia64/include/pcpu.h
@@ -37,6 +37,7 @@ struct pcpu_stats {
u_long pcs_nasts; /* IPI_AST counter. */
u_long pcs_nclks; /* Clock interrupt counter. */
u_long pcs_nextints; /* ExtINT counter. */
+ u_long pcs_nhardclocks; /* IPI_HARDCLOCK counter. */
u_long pcs_nhighfps; /* IPI_HIGH_FP counter. */
u_long pcs_nhwints; /* Hardware int. counter. */
u_long pcs_npreempts; /* IPI_PREEMPT counter. */
@@ -51,7 +52,8 @@ struct pcpu_md {
vm_offset_t vhpt; /* Address of VHPT */
uint64_t lid; /* local CPU ID */
uint64_t clock; /* Clock counter. */
- uint64_t clockadj; /* Clock adjust. */
+ uint64_t clock_load; /* Clock reload value. */
+ uint32_t clock_mode; /* Clock ET mode */
uint32_t awake:1; /* CPU is awake? */
struct pcpu_stats stats; /* Interrupt stats. */
#ifdef _KERNEL
diff --git a/sys/ia64/include/pmap.h b/sys/ia64/include/pmap.h
index 6f3b320..2b89df0 100644
--- a/sys/ia64/include/pmap.h
+++ b/sys/ia64/include/pmap.h
@@ -68,6 +68,7 @@ struct pv_entry;
struct md_page {
int pv_list_count;
TAILQ_HEAD(,pv_entry) pv_list;
+ vm_memattr_t memattr;
};
struct pmap {
@@ -115,21 +116,22 @@ extern vm_offset_t virtual_end;
extern uint64_t pmap_vhpt_base[];
extern int pmap_vhpt_log2size;
-#define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT
+#define pmap_page_get_memattr(m) ((m)->md.memattr)
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
-#define pmap_page_set_memattr(m, ma) (void)0
#define pmap_mapbios(pa, sz) pmap_mapdev(pa, sz)
#define pmap_unmapbios(va, sz) pmap_unmapdev(va, sz)
-vm_offset_t pmap_steal_memory(vm_size_t);
vm_offset_t pmap_alloc_vhpt(void);
void pmap_bootstrap(void);
void pmap_kenter(vm_offset_t va, vm_offset_t pa);
vm_paddr_t pmap_kextract(vm_offset_t va);
void pmap_kremove(vm_offset_t);
void *pmap_mapdev(vm_paddr_t, vm_size_t);
-void pmap_unmapdev(vm_offset_t, vm_size_t);
+void pmap_page_set_memattr(vm_page_t, vm_memattr_t);
+vm_offset_t pmap_page_to_va(vm_page_t);
+vm_offset_t pmap_steal_memory(vm_size_t);
struct pmap *pmap_switch(struct pmap *pmap);
+void pmap_unmapdev(vm_offset_t, vm_size_t);
#endif /* _KERNEL */
diff --git a/sys/ia64/include/sf_buf.h b/sys/ia64/include/sf_buf.h
index 8d67542..75bcdfa 100644
--- a/sys/ia64/include/sf_buf.h
+++ b/sys/ia64/include/sf_buf.h
@@ -41,18 +41,20 @@
*/
struct sf_buf;
-static __inline vm_offset_t
-sf_buf_kva(struct sf_buf *sf)
+static __inline vm_page_t
+sf_buf_page(struct sf_buf *sf)
{
-
- return (IA64_PHYS_TO_RR7(VM_PAGE_TO_PHYS((vm_page_t)sf)));
+
+ return ((vm_page_t)sf);
}
-static __inline vm_page_t
-sf_buf_page(struct sf_buf *sf)
+static __inline vm_offset_t
+sf_buf_kva(struct sf_buf *sf)
{
+ vm_page_t m;
- return ((vm_page_t)sf);
+ m = sf_buf_page(sf);
+ return (pmap_page_to_va(m));
}
#endif /* !_MACHINE_SF_BUF_H_ */
diff --git a/sys/ia64/include/smp.h b/sys/ia64/include/smp.h
index d2aff76..b80d6a0 100644
--- a/sys/ia64/include/smp.h
+++ b/sys/ia64/include/smp.h
@@ -7,6 +7,7 @@
#ifdef _KERNEL
#define IPI_AST ia64_ipi_ast
+#define IPI_HARDCLOCK ia64_ipi_hardclock
#define IPI_PREEMPT ia64_ipi_preempt
#define IPI_RENDEZVOUS ia64_ipi_rndzvs
#define IPI_STOP ia64_ipi_stop
@@ -37,6 +38,7 @@ struct ia64_ap_state {
};
extern int ia64_ipi_ast;
+extern int ia64_ipi_hardclock;
extern int ia64_ipi_highfp;
extern int ia64_ipi_nmi;
extern int ia64_ipi_preempt;
diff --git a/sys/kern/Make.tags.inc b/sys/kern/Make.tags.inc
index ad7ea11..6f5a13a 100644
--- a/sys/kern/Make.tags.inc
+++ b/sys/kern/Make.tags.inc
@@ -37,6 +37,7 @@ COMM= ${SYS}/dev/advansys/*.[ch] \
${SYS}/fs/smbfs/*.[ch] \
${SYS}/fs/udf/*.[ch] \
${SYS}/fs/unionfs/*.[ch] \
+ ${SYS}/geom/*.[ch] \
${SYS}/kern/*.[ch] \
${SYS}/net/*.[ch] \
${SYS}/netatalk/*.[ch] \
@@ -55,6 +56,7 @@ COMM= ${SYS}/dev/advansys/*.[ch] \
${SYS}/sys/*.[ch]
COMMDIR1= ${SYS}/conf \
+ ${SYS}/geom \
${SYS}/kern \
${SYS}/net \
${SYS}/netatalk \
diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c
index 2f889ca..3908da7 100644
--- a/sys/kern/imgact_aout.c
+++ b/sys/kern/imgact_aout.c
@@ -103,7 +103,7 @@ struct sysentvec aout_sysvec = {
#elif defined(__amd64__)
-#define AOUT32_USRSTACK 0xbfc0000
+#define AOUT32_USRSTACK 0xbfc00000
#define AOUT32_PS_STRINGS \
(AOUT32_USRSTACK - sizeof(struct freebsd32_ps_strings))
@@ -152,7 +152,7 @@ aout_fixup(register_t **stack_base, struct image_params *imgp)
{
*(char **)stack_base -= sizeof(uint32_t);
- return (suword(*stack_base, imgp->args->argc));
+ return (suword32(*stack_base, imgp->args->argc));
}
static int
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index b41741a..45f6d64 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -31,10 +31,12 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
#include "opt_compat.h"
#include "opt_core.h"
#include <sys/param.h>
+#include <sys/capability.h>
#include <sys/exec.h>
#include <sys/fcntl.h>
#include <sys/imgact.h>
@@ -578,6 +580,15 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr,
u_long base_addr = 0;
int vfslocked, error, i, numsegs;
+#ifdef CAPABILITY_MODE
+ /*
+ * XXXJA: This check can go away once we are sufficiently confident
+ * that the checks in namei() are correct.
+ */
+ if (IN_CAPABILITY_MODE(curthread))
+ return (ECAPMODE);
+#endif
+
tempdata = malloc(sizeof(*tempdata), M_TEMP, M_WAITOK);
nd = &tempdata->nd;
attr = &tempdata->attr;
@@ -1104,6 +1115,7 @@ __elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
hdrsize = 0;
__elfN(puthdr)(td, (void *)NULL, &hdrsize, seginfo.count);
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(td->td_proc, RACCT_CORE, hdrsize + seginfo.size);
PROC_UNLOCK(td->td_proc);
@@ -1111,6 +1123,7 @@ __elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
error = EFAULT;
goto done;
}
+#endif
if (hdrsize + seginfo.size >= limit) {
error = EFAULT;
goto done;
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index e45ffc5..004516b 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -548,8 +548,8 @@ struct sysent sysent[] = {
{ AS(msgctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 511 = msgctl */
{ AS(shmctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 512 = shmctl */
{ AS(lpathconf_args), (sy_call_t *)lpathconf, AUE_LPATHCONF, NULL, 0, 0, 0, SY_THR_STATIC }, /* 513 = lpathconf */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 514 = cap_new */
- { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 515 = cap_getrights */
+ { AS(cap_new_args), (sy_call_t *)cap_new, AUE_CAP_NEW, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 514 = cap_new */
+ { AS(cap_getrights_args), (sy_call_t *)cap_getrights, AUE_CAP_GETRIGHTS, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 515 = cap_getrights */
{ 0, (sy_call_t *)cap_enter, AUE_CAP_ENTER, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 516 = cap_enter */
{ AS(cap_getmode_args), (sy_call_t *)cap_getmode, AUE_CAP_GETMODE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 517 = cap_getmode */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 518 = pdfork */
diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c
index dd8bab5..ecfd408 100644
--- a/sys/kern/kern_clocksource.c
+++ b/sys/kern/kern_clocksource.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
cyclic_clock_func_t cyclic_clock_func = NULL;
#endif
+int cpu_can_deep_sleep = 0; /* C3 state is available. */
int cpu_disable_deep_sleep = 0; /* Timer dies in C3. */
static void setuptimer(void);
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 180d598..829ece2 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -37,6 +37,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
#include "opt_compat.h"
#include "opt_ddb.h"
#include "opt_ktrace.h"
@@ -44,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/capability.h>
#include <sys/conf.h>
#include <sys/domain.h>
#include <sys/fcntl.h>
@@ -91,6 +93,7 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
#include <vm/uma.h>
+#include <vm/vm.h>
#include <ddb/ddb.h>
@@ -818,6 +821,7 @@ do_dup(struct thread *td, int flags, int old, int new,
* descriptors, just put the limit on the size of the file
* descriptor table.
*/
+#ifdef RACCT
PROC_LOCK(p);
error = racct_set(p, RACCT_NOFILE, new + 1);
PROC_UNLOCK(p);
@@ -826,6 +830,7 @@ do_dup(struct thread *td, int flags, int old, int new,
fdrop(fp, td);
return (EMFILE);
}
+#endif
fdgrowtable(fdp, new + 1);
}
if (fdp->fd_ofiles[new] == NULL)
@@ -1155,7 +1160,7 @@ kern_close(td, fd)
int fd;
{
struct filedesc *fdp;
- struct file *fp;
+ struct file *fp, *fp_object;
int error;
int holdleaders;
@@ -1190,8 +1195,14 @@ kern_close(td, fd)
* added, and deleteing a knote for the new fd.
*/
knote_fdclose(td, fd);
- if (fp->f_type == DTYPE_MQUEUE)
- mq_fdclose(td, fd, fp);
+
+ /*
+ * When we're closing an fd with a capability, we need to notify
+ * mqueue if the underlying object is of type mqueue.
+ */
+ (void)cap_funwrap(fp, 0, &fp_object);
+ if (fp_object->f_type == DTYPE_MQUEUE)
+ mq_fdclose(td, fd, fp_object);
FILEDESC_XUNLOCK(fdp);
error = closef(fp, td);
@@ -1473,7 +1484,10 @@ fdalloc(struct thread *td, int minfd, int *result)
{
struct proc *p = td->td_proc;
struct filedesc *fdp = p->p_fd;
- int fd = -1, maxfd, error;
+ int fd = -1, maxfd;
+#ifdef RACCT
+ int error;
+#endif
FILEDESC_XLOCK_ASSERT(fdp);
@@ -1496,11 +1510,13 @@ fdalloc(struct thread *td, int minfd, int *result)
return (EMFILE);
if (fd < fdp->fd_nfiles)
break;
+#ifdef RACCT
PROC_LOCK(p);
error = racct_set(p, RACCT_NOFILE, min(fdp->fd_nfiles * 2, maxfd));
PROC_UNLOCK(p);
if (error != 0)
return (EMFILE);
+#endif
fdgrowtable(fdp, min(fdp->fd_nfiles * 2, maxfd));
}
@@ -1561,54 +1577,85 @@ fdavail(struct thread *td, int n)
int
falloc(struct thread *td, struct file **resultfp, int *resultfd, int flags)
{
- struct proc *p = td->td_proc;
struct file *fp;
- int error, i;
+ int error, fd;
+
+ error = falloc_noinstall(td, &fp);
+ if (error)
+ return (error); /* no reference held on error */
+
+ error = finstall(td, fp, &fd, flags);
+ if (error) {
+ fdrop(fp, td); /* one reference (fp only) */
+ return (error);
+ }
+
+ if (resultfp != NULL)
+ *resultfp = fp; /* copy out result */
+ else
+ fdrop(fp, td); /* release local reference */
+
+ if (resultfd != NULL)
+ *resultfd = fd;
+
+ return (0);
+}
+
+/*
+ * Create a new open file structure without allocating a file descriptor.
+ */
+int
+falloc_noinstall(struct thread *td, struct file **resultfp)
+{
+ struct file *fp;
int maxuserfiles = maxfiles - (maxfiles / 20);
static struct timeval lastfail;
static int curfail;
- fp = uma_zalloc(file_zone, M_WAITOK | M_ZERO);
+ KASSERT(resultfp != NULL, ("%s: resultfp == NULL", __func__));
+
if ((openfiles >= maxuserfiles &&
priv_check(td, PRIV_MAXFILES) != 0) ||
openfiles >= maxfiles) {
if (ppsratecheck(&lastfail, &curfail, 1)) {
- printf("kern.maxfiles limit exceeded by uid %i, please see tuning(7).\n",
- td->td_ucred->cr_ruid);
+ printf("kern.maxfiles limit exceeded by uid %i, "
+ "please see tuning(7).\n", td->td_ucred->cr_ruid);
}
- uma_zfree(file_zone, fp);
return (ENFILE);
}
atomic_add_int(&openfiles, 1);
-
- /*
- * If the process has file descriptor zero open, add the new file
- * descriptor to the list of open files at that point, otherwise
- * put it at the front of the list of open files.
- */
+ fp = uma_zalloc(file_zone, M_WAITOK | M_ZERO);
refcount_init(&fp->f_count, 1);
- if (resultfp)
- fhold(fp);
fp->f_cred = crhold(td->td_ucred);
fp->f_ops = &badfileops;
fp->f_data = NULL;
fp->f_vnode = NULL;
- FILEDESC_XLOCK(p->p_fd);
- if ((error = fdalloc(td, 0, &i))) {
- FILEDESC_XUNLOCK(p->p_fd);
- fdrop(fp, td);
- if (resultfp)
- fdrop(fp, td);
+ *resultfp = fp;
+ return (0);
+}
+
+/*
+ * Install a file in a file descriptor table.
+ */
+int
+finstall(struct thread *td, struct file *fp, int *fd, int flags)
+{
+ struct filedesc *fdp = td->td_proc->p_fd;
+ int error;
+
+ KASSERT(fd != NULL, ("%s: fd == NULL", __func__));
+ KASSERT(fp != NULL, ("%s: fp == NULL", __func__));
+
+ FILEDESC_XLOCK(fdp);
+ if ((error = fdalloc(td, 0, fd))) {
+ FILEDESC_XUNLOCK(fdp);
return (error);
}
- p->p_fd->fd_ofiles[i] = fp;
+ fhold(fp);
+ fdp->fd_ofiles[*fd] = fp;
if ((flags & O_CLOEXEC) != 0)
- p->p_fd->fd_ofileflags[i] |= UF_EXCLOSE;
- FILEDESC_XUNLOCK(p->p_fd);
- if (resultfp)
- *resultfp = fp;
- if (resultfd)
- *resultfd = i;
+ fdp->fd_ofileflags[*fd] |= UF_EXCLOSE;
+ FILEDESC_XUNLOCK(fdp);
return (0);
}
@@ -1739,11 +1786,11 @@ fdcopy(struct filedesc *fdp)
FILEDESC_XUNLOCK(newfdp);
FILEDESC_SLOCK(fdp);
}
- /* copy everything except kqueue descriptors */
+ /* copy all passable descriptors (i.e. not kqueue) */
newfdp->fd_freefile = -1;
for (i = 0; i <= fdp->fd_lastfile; ++i) {
if (fdisused(fdp, i) &&
- fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE &&
+ (fdp->fd_ofiles[i]->f_ops->fo_flags & DFLAG_PASSABLE) &&
fdp->fd_ofiles[i]->f_ops != &badfileops) {
newfdp->fd_ofiles[i] = fdp->fd_ofiles[i];
newfdp->fd_ofileflags[i] = fdp->fd_ofileflags[i];
@@ -1785,9 +1832,11 @@ fdfree(struct thread *td)
if (fdp == NULL)
return;
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_NOFILE, 0);
PROC_UNLOCK(td->td_proc);
+#endif
/* Check for special need to clear POSIX style locks */
fdtol = td->td_proc->p_fdtol;
@@ -2103,6 +2152,7 @@ closef(struct file *fp, struct thread *td)
struct flock lf;
struct filedesc_to_leader *fdtol;
struct filedesc *fdp;
+ struct file *fp_object;
/*
* POSIX record locking dictates that any close releases ALL
@@ -2115,11 +2165,15 @@ closef(struct file *fp, struct thread *td)
* NULL thread pointer when there really is no owning
* context that might have locks, or the locks will be
* leaked.
+ *
+ * If this is a capability, we do lock processing under the underlying
+ * node, not the capability itself.
*/
- if (fp->f_type == DTYPE_VNODE && td != NULL) {
+ (void)cap_funwrap(fp, 0, &fp_object);
+ if ((fp_object->f_type == DTYPE_VNODE) && (td != NULL)) {
int vfslocked;
- vp = fp->f_vnode;
+ vp = fp_object->f_vnode;
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
if ((td->td_proc->p_leader->p_flag & P_ADVLOCK) != 0) {
lf.l_whence = SEEK_SET;
@@ -2149,7 +2203,7 @@ closef(struct file *fp, struct thread *td)
lf.l_start = 0;
lf.l_len = 0;
lf.l_type = F_UNLCK;
- vp = fp->f_vnode;
+ vp = fp_object->f_vnode;
(void) VOP_ADVLOCK(vp,
(caddr_t)fdtol->fdl_leader,
F_UNLCK, &lf, F_POSIX);
@@ -2228,15 +2282,27 @@ fget_unlocked(struct filedesc *fdp, int fd)
* If the descriptor doesn't exist or doesn't match 'flags', EBADF is
* returned.
*
+ * If the FGET_GETCAP flag is set, the capability itself will be returned.
+ * Calling _fget() with FGET_GETCAP on a non-capability will return EINVAL.
+ * Otherwise, if the file is a capability, its rights will be checked against
+ * the capability rights mask, and if successful, the object will be unwrapped.
+ *
* If an error occured the non-zero error is returned and *fpp is set to
* NULL. Otherwise *fpp is held and set and zero is returned. Caller is
* responsible for fdrop().
*/
+#define FGET_GETCAP 0x00000001
static __inline int
-_fget(struct thread *td, int fd, struct file **fpp, int flags)
+_fget(struct thread *td, int fd, struct file **fpp, int flags,
+ cap_rights_t needrights, cap_rights_t *haverights, u_char *maxprotp,
+ int fget_flags)
{
struct filedesc *fdp;
struct file *fp;
+#ifdef CAPABILITIES
+ struct file *fp_fromcap;
+ int error;
+#endif
*fpp = NULL;
if (td == NULL || (fdp = td->td_proc->p_fd) == NULL)
@@ -2247,6 +2313,47 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags)
fdrop(fp, td);
return (EBADF);
}
+
+#ifdef CAPABILITIES
+ /*
+ * If a capability has been requested, return the capability directly.
+ * Otherwise, check capability rights, extract the underlying object,
+ * and check its access flags.
+ */
+ if (fget_flags & FGET_GETCAP) {
+ if (fp->f_type != DTYPE_CAPABILITY) {
+ fdrop(fp, td);
+ return (EINVAL);
+ }
+ } else {
+ if (maxprotp == NULL)
+ error = cap_funwrap(fp, needrights, &fp_fromcap);
+ else
+ error = cap_funwrap_mmap(fp, needrights, maxprotp,
+ &fp_fromcap);
+ if (error) {
+ fdrop(fp, td);
+ return (error);
+ }
+
+ /*
+ * If we've unwrapped a file, drop the original capability
+ * and hold the new descriptor. fp after this point refers to
+ * the actual (unwrapped) object, not the capability.
+ */
+ if (fp != fp_fromcap) {
+ fhold(fp_fromcap);
+ fdrop(fp, td);
+ fp = fp_fromcap;
+ }
+ }
+#else /* !CAPABILITIES */
+ KASSERT(fp->f_type != DTYPE_CAPABILITY,
+ ("%s: saw capability", __func__));
+ if (maxprotp != NULL)
+ *maxprotp = VM_PROT_ALL;
+#endif /* CAPABILITIES */
+
/*
* FREAD and FWRITE failure return EBADF as per POSIX.
*
@@ -2265,23 +2372,36 @@ int
fget(struct thread *td, int fd, struct file **fpp)
{
- return(_fget(td, fd, fpp, 0));
+ return(_fget(td, fd, fpp, 0, 0, NULL, NULL, 0));
}
int
fget_read(struct thread *td, int fd, struct file **fpp)
{
- return(_fget(td, fd, fpp, FREAD));
+ return(_fget(td, fd, fpp, FREAD, 0, NULL, NULL, 0));
}
int
fget_write(struct thread *td, int fd, struct file **fpp)
{
- return(_fget(td, fd, fpp, FWRITE));
+ return(_fget(td, fd, fpp, FWRITE, 0, NULL, NULL, 0));
+}
+
+/*
+ * Unlike the other fget() calls, which will accept and check capability rights
+ * but never return capabilities, fgetcap() returns the capability but doesn't
+ * check capability rights.
+ */
+int
+fgetcap(struct thread *td, int fd, struct file **fpp)
+{
+
+ return (_fget(td, fd, fpp, 0, 0, NULL, NULL, FGET_GETCAP));
}
+
/*
* Like fget() but loads the underlying vnode, or returns an error if the
* descriptor does not represent a vnode. Note that pipes use vnodes but
@@ -2296,7 +2416,7 @@ _fgetvp(struct thread *td, int fd, struct vnode **vpp, int flags)
int error;
*vpp = NULL;
- if ((error = _fget(td, fd, &fp, flags)) != 0)
+ if ((error = _fget(td, fd, &fp, flags, 0, NULL, NULL, 0)) != 0)
return (error);
if (fp->f_vnode == NULL) {
error = EINVAL;
@@ -2352,7 +2472,7 @@ fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp)
*spp = NULL;
if (fflagp != NULL)
*fflagp = 0;
- if ((error = _fget(td, fd, &fp, 0)) != 0)
+ if ((error = _fget(td, fd, &fp, 0, 0, NULL, NULL, 0)) != 0)
return (error);
if (fp->f_type != DTYPE_SOCKET) {
error = ENOTSOCK;
@@ -2388,6 +2508,9 @@ fputsock(struct socket *so)
/*
* Handle the last reference to a file being closed.
+ *
+ * No special capability handling here, as the capability's fo_close will run
+ * instead of the object here, and perform any necessary drop on the object.
*/
int
_fdrop(struct file *fp, struct thread *td)
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index c51cc39..f30f89a 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -27,12 +27,14 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
#include "opt_hwpmc_hooks.h"
#include "opt_kdtrace.h"
#include "opt_ktrace.h"
#include "opt_vm.h"
#include <sys/param.h>
+#include <sys/capability.h>
#include <sys/systm.h>
#include <sys/eventhandler.h>
#include <sys/lock.h>
@@ -415,6 +417,18 @@ do_execve(td, args, mac_p)
interpret:
if (args->fname != NULL) {
+#ifdef CAPABILITY_MODE
+ /*
+ * While capability mode can't reach this point via direct
+ * path arguments to execve(), we also don't allow
+ * interpreters to be used in capability mode (for now).
+ * Catch indirect lookups and return a permissions error.
+ */
+ if (IN_CAPABILITY_MODE(td)) {
+ error = ECAPMODE;
+ goto exec_fail;
+ }
+#endif
error = namei(&nd);
if (error)
goto exec_fail;
@@ -631,6 +645,13 @@ interpret:
* Don't honor setuid/setgid if the filesystem prohibits it or if
* the process is being traced.
*
+ * We disable setuid/setgid/etc in compatibility mode on the basis
+ * that most setugid applications are not written with that
+ * environment in mind, and will therefore almost certainly operate
+ * incorrectly. In principle there's no reason that setugid
+ * applications might not be useful in capability mode, so we may want
+ * to reconsider this conservative design choice in the future.
+ *
* XXXMAC: For the time being, use NOSUID to also prohibit
* transitions on the file system.
*/
@@ -646,6 +667,9 @@ interpret:
#endif
if (credential_changing &&
+#ifdef CAPABILITY_MODE
+ ((oldcred->cr_flags & CRED_FLAG_CAPMODE) == 0) &&
+#endif
(imgp->vp->v_mount->mnt_flag & MNT_NOSUID) == 0 &&
(p->p_flag & P_TRACED) == 0) {
/*
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index bb25d17..30b94b6 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -744,9 +744,11 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options,
* Destroy resource accounting information associated with the process.
*/
racct_proc_exit(p);
+#ifdef RACCT
PROC_LOCK(p->p_pptr);
racct_sub(p->p_pptr, RACCT_NPROC, 1);
PROC_UNLOCK(p->p_pptr);
+#endif
/*
* Free credentials, arguments, and sigacts.
@@ -905,19 +907,23 @@ loop:
void
proc_reparent(struct proc *child, struct proc *parent)
{
+#ifdef RACCT
int locked;
+#endif
sx_assert(&proctree_lock, SX_XLOCKED);
PROC_LOCK_ASSERT(child, MA_OWNED);
if (child->p_pptr == parent)
return;
+#ifdef RACCT
locked = PROC_LOCKED(parent);
if (!locked)
PROC_LOCK(parent);
racct_add_force(parent, RACCT_NPROC, 1);
if (!locked)
PROC_UNLOCK(parent);
+#endif
PROC_LOCK(child->p_pptr);
racct_sub(child->p_pptr, RACCT_NPROC, 1);
sigqueue_take(child->p_ksi);
diff --git a/sys/kern/kern_fail.c b/sys/kern/kern_fail.c
index e0fb32b..f192471 100644
--- a/sys/kern/kern_fail.c
+++ b/sys/kern/kern_fail.c
@@ -52,6 +52,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/ctype.h>
#include <sys/errno.h>
#include <sys/fail.h>
#include <sys/kernel.h>
@@ -59,6 +60,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
+#include <sys/proc.h>
#include <sys/sbuf.h>
#include <machine/stdarg.h>
@@ -88,16 +90,20 @@ enum fail_point_t {
FAIL_POINT_BREAK, /**< break into the debugger */
FAIL_POINT_PRINT, /**< print a message */
FAIL_POINT_SLEEP, /**< sleep for some msecs */
- FAIL_POINT_INVALID, /**< placeholder */
+ FAIL_POINT_NUMTYPES
};
-static const char *fail_type_strings[] = {
- "off",
- "panic",
- "return",
- "break",
- "print",
- "sleep",
+static struct {
+ const char *name;
+ int nmlen;
+} fail_type_strings[] = {
+#define FP_TYPE_NM_LEN(s) { s, sizeof(s) - 1 }
+ [FAIL_POINT_OFF] = FP_TYPE_NM_LEN("off"),
+ [FAIL_POINT_PANIC] = FP_TYPE_NM_LEN("panic"),
+ [FAIL_POINT_RETURN] = FP_TYPE_NM_LEN("return"),
+ [FAIL_POINT_BREAK] = FP_TYPE_NM_LEN("break"),
+ [FAIL_POINT_PRINT] = FP_TYPE_NM_LEN("print"),
+ [FAIL_POINT_SLEEP] = FP_TYPE_NM_LEN("sleep"),
};
/**
@@ -109,7 +115,7 @@ struct fail_point_entry {
int fe_arg; /**< argument to type (e.g. return value) */
int fe_prob; /**< likelihood of firing in millionths */
int fe_count; /**< number of times to fire, 0 means always */
-
+ pid_t fe_pid; /**< only fail for this process */
TAILQ_ENTRY(fail_point_entry) fe_entries; /**< next entry in fail point */
};
@@ -120,7 +126,7 @@ fail_point_sleep(struct fail_point *fp, struct fail_point_entry *ent,
/* convert from millisecs to ticks, rounding up */
int timo = ((msecs * hz) + 999) / 1000;
- if (timo) {
+ if (timo > 0) {
if (fp->fp_sleep_fn == NULL) {
msleep(fp, &g_fp_mtx, PWAIT, "failpt", timo);
} else {
@@ -191,19 +197,13 @@ fail_point_init(struct fail_point *fp, const char *fmt, ...)
void
fail_point_destroy(struct fail_point *fp)
{
- struct fail_point_entry *ent;
- if (fp->fp_flags & FAIL_POINT_DYNAMIC_NAME && fp->fp_name != NULL) {
- fp_free((void *)(intptr_t)fp->fp_name);
+ if ((fp->fp_flags & FAIL_POINT_DYNAMIC_NAME) != 0) {
+ fp_free(__DECONST(void *, fp->fp_name));
fp->fp_name = NULL;
}
fp->fp_flags = 0;
-
- while (!TAILQ_EMPTY(&fp->fp_entries)) {
- ent = TAILQ_FIRST(&fp->fp_entries);
- TAILQ_REMOVE(&fp->fp_entries, ent, fe_entries);
- fp_free(ent);
- }
+ clear_entries(&fp->fp_entries);
}
/**
@@ -222,16 +222,14 @@ fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
FP_LOCK();
- ent = TAILQ_FIRST(&fp->fp_entries);
- while (ent) {
+ TAILQ_FOREACH_SAFE(ent, &fp->fp_entries, fe_entries, next) {
int cont = 0; /* don't continue by default */
- next = TAILQ_NEXT(ent, fe_entries);
if (ent->fe_prob < PROB_MAX &&
- ent->fe_prob < random() % PROB_MAX) {
- cont = 1;
- goto loop_end;
- }
+ ent->fe_prob < random() % PROB_MAX)
+ continue;
+ if (ent->fe_pid != NO_PID && ent->fe_pid != curproc->p_pid)
+ continue;
switch (ent->fe_type) {
case FAIL_POINT_PANIC:
@@ -239,13 +237,14 @@ fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
/* NOTREACHED */
case FAIL_POINT_RETURN:
- if (return_value)
+ if (return_value != NULL)
*return_value = ent->fe_arg;
ret = FAIL_POINT_RC_RETURN;
break;
case FAIL_POINT_BREAK:
- printf("fail point %s breaking to debugger\n", fp->fp_name);
+ printf("fail point %s breaking to debugger\n",
+ fp->fp_name);
breakpoint();
break;
@@ -273,13 +272,9 @@ fail_point_eval_nontrivial(struct fail_point *fp, int *return_value)
break;
}
- if (ent && ent->fe_count > 0 && --ent->fe_count == 0)
+ if (ent != NULL && ent->fe_count > 0 && --ent->fe_count == 0)
free_entry(&fp->fp_entries, ent);
-
-loop_end:
- if (cont)
- ent = next;
- else
+ if (cont == 0)
break;
}
@@ -290,7 +285,7 @@ loop_end:
FP_UNLOCK();
- return ret;
+ return (ret);
}
/**
@@ -320,9 +315,11 @@ fail_point_get(struct fail_point *fp, struct sbuf *sb)
}
if (ent->fe_count > 0)
sbuf_printf(sb, "%d*", ent->fe_count);
- sbuf_printf(sb, "%s", fail_type_strings[ent->fe_type]);
+ sbuf_printf(sb, "%s", fail_type_strings[ent->fe_type].name);
if (ent->fe_arg)
sbuf_printf(sb, "(%d)", ent->fe_arg);
+ if (ent->fe_pid != NO_PID)
+ sbuf_printf(sb, "[pid %d]", ent->fe_pid);
if (TAILQ_NEXT(ent, fe_entries))
sbuf_printf(sb, "->");
}
@@ -380,7 +377,7 @@ fail_point_set(struct fail_point *fp, char *buf)
fp->fp_name, fp->fp_location, buf);
#endif /* IWARNING */
- return error;
+ return (error);
}
#define MAX_FAIL_POINT_BUF 1023
@@ -422,9 +419,8 @@ fail_point_sysctl(SYSCTL_HANDLER_ARGS)
}
out:
- if (buf)
- fp_free(buf);
- return error;
+ fp_free(buf);
+ return (error);
}
/**
@@ -437,12 +433,17 @@ parse_fail_point(struct fail_point_entries *ents, char *p)
/* <fail_point> ::
* <term> ( "->" <term> )*
*/
- if (!(p = parse_term(ents, p)))
- return 0;
- while (*p)
- if (p[0] != '-' || p[1] != '>' || !(p = parse_term(ents, p+2)))
- return 0;
- return p;
+ p = parse_term(ents, p);
+ if (p == NULL)
+ return (NULL);
+ while (*p != '\0') {
+ if (p[0] != '-' || p[1] != '>')
+ return (NULL);
+ p = parse_term(ents, p + 2);
+ if (p == NULL)
+ return (NULL);
+ }
+ return (p);
}
/**
@@ -455,6 +456,7 @@ parse_term(struct fail_point_entries *ents, char *p)
ent = fp_malloc(sizeof *ent, M_WAITOK | M_ZERO);
ent->fe_prob = PROB_MAX;
+ ent->fe_pid = NO_PID;
TAILQ_INSERT_TAIL(ents, ent, fe_entries);
/*
@@ -462,14 +464,16 @@ parse_term(struct fail_point_entries *ents, char *p)
* ( (<float> "%") | (<integer> "*" ) )*
* <type>
* [ "(" <integer> ")" ]
+ * [ "[pid " <integer> "]" ]
*/
/* ( (<float> "%") | (<integer> "*" ) )* */
- while (('0' <= *p && *p <= '9') || *p == '.') {
+ while (isdigit(*p) || *p == '.') {
int units, decimal;
- if (!(p = parse_number(&units, &decimal, p)))
- return 0;
+ p = parse_number(&units, &decimal, p);
+ if (p == NULL)
+ return (NULL);
if (*p == '%') {
if (units > 100) /* prevent overflow early */
@@ -477,37 +481,44 @@ parse_term(struct fail_point_entries *ents, char *p)
ent->fe_prob = units * (PROB_MAX / 100) + decimal;
if (ent->fe_prob > PROB_MAX)
ent->fe_prob = PROB_MAX;
-
} else if (*p == '*') {
if (!units || decimal)
- return 0;
+ return (NULL);
ent->fe_count = units;
-
- } else {
- return 0;
- }
-
+ } else
+ return (NULL);
p++;
}
/* <type> */
- if (!(p = parse_type(ent, p)))
- return 0;
+ p = parse_type(ent, p);
+ if (p == NULL)
+ return (NULL);
if (*p == '\0')
- return p;
+ return (p);
/* [ "(" <integer> ")" ] */
if (*p != '(')
return p;
p++;
- if (('0' <= *p && *p <= '9') || *p == '-')
- ent->fe_arg = strtol(p, &p, 0);
- else
- return 0;
+ if (!isdigit(*p) && *p != '-')
+ return (NULL);
+ ent->fe_arg = strtol(p, &p, 0);
if (*p++ != ')')
- return 0;
-
- return p;
+ return (NULL);
+
+ /* [ "[pid " <integer> "]" ] */
+#define PID_STRING "[pid "
+ if (strncmp(p, PID_STRING, sizeof(PID_STRING) - 1) != 0)
+ return (p);
+ p += sizeof(PID_STRING) - 1;
+ if (!isdigit(*p))
+ return (NULL);
+ ent->fe_pid = strtol(p, &p, 0);
+ if (*p++ != ']')
+ return (NULL);
+
+ return (p);
}
/**
@@ -528,14 +539,14 @@ parse_number(int *out_units, int *out_decimal, char *p)
old_p = p;
*out_units = strtol(p, &p, 10);
if (p == old_p && *p != '.')
- return 0;
+ return (NULL);
/* fractional part */
*out_decimal = 0;
if (*p == '.') {
int digits = 0;
p++;
- while ('0' <= *p && *p <= '9') {
+ while (isdigit(*p)) {
int digit = *p - '0';
if (digits < PROB_DIGITS - 2)
*out_decimal = *out_decimal * 10 + digit;
@@ -545,12 +556,12 @@ parse_number(int *out_units, int *out_decimal, char *p)
p++;
}
if (!digits) /* need at least one digit after '.' */
- return 0;
+ return (NULL);
while (digits++ < PROB_DIGITS - 2) /* add implicit zeros */
*out_decimal *= 10;
}
- return p; /* success */
+ return (p); /* success */
}
/**
@@ -560,21 +571,16 @@ static char *
parse_type(struct fail_point_entry *ent, char *beg)
{
enum fail_point_t type;
- char *end = beg;
- while ('a' <= *end && *end <= 'z')
- end++;
- if (beg == end)
- return 0;
- for (type = FAIL_POINT_OFF; type != FAIL_POINT_INVALID; type++) {
- const char *p = fail_type_strings[type];
- const char *q = beg;
- while (q < end && *p++ == *q++);
- if (q == end && *p == '\0') {
+ int len;
+
+ for (type = FAIL_POINT_OFF; type < FAIL_POINT_NUMTYPES; type++) {
+ len = fail_type_strings[type].nmlen;
+ if (strncmp(fail_type_strings[type].name, beg, len) == 0) {
ent->fe_type = type;
- return end;
+ return (beg + len);
}
}
- return 0;
+ return (NULL);
}
/**
@@ -595,6 +601,7 @@ static void
clear_entries(struct fail_point_entries *ents)
{
struct fail_point_entry *ent, *ent_next;
+
TAILQ_FOREACH_SAFE(ent, ents, fe_entries, ent_next)
fp_free(ent);
TAILQ_INIT(ents);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 04e635a..9d3e22d 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -476,7 +476,10 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
sigacts_copy(newsigacts, p1->p_sigacts);
p2->p_sigacts = newsigacts;
}
- if (flags & RFLINUXTHPN)
+
+ if (flags & RFTSIGZMB)
+ p2->p_sigparent = RFTSIGNUM(flags);
+ else if (flags & RFLINUXTHPN)
p2->p_sigparent = SIGUSR1;
else
p2->p_sigparent = SIGCHLD;
@@ -719,10 +722,22 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
static int curfail;
static struct timeval lastfail;
+ /* Check for the undefined or unimplemented flags. */
+ if ((flags & ~(RFFLAGS | RFTSIGFLAGS(RFTSIGMASK))) != 0)
+ return (EINVAL);
+
+ /* Signal value requires RFTSIGZMB. */
+ if ((flags & RFTSIGFLAGS(RFTSIGMASK)) != 0 && (flags & RFTSIGZMB) == 0)
+ return (EINVAL);
+
/* Can't copy and clear. */
if ((flags & (RFFDG|RFCFDG)) == (RFFDG|RFCFDG))
return (EINVAL);
+ /* Check the validity of the signal number. */
+ if ((flags & RFTSIGZMB) != 0 && (u_int)RFTSIGNUM(flags) > _SIG_MAXSIG)
+ return (EINVAL);
+
p1 = td->td_proc;
/*
@@ -734,11 +749,13 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
return (fork_norfproc(td, flags));
}
+#ifdef RACCT
PROC_LOCK(p1);
error = racct_add(p1, RACCT_NPROC, 1);
PROC_UNLOCK(p1);
if (error != 0)
return (EAGAIN);
+#endif
mem_charged = 0;
vm2 = NULL;
@@ -822,6 +839,7 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
goto fail;
}
+#ifdef RACCT
/*
* After fork, there is exactly one thread running.
*/
@@ -832,6 +850,7 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
error = EAGAIN;
goto fail;
}
+#endif
/*
* Increment the count of procs running with this uid. Don't allow
@@ -874,9 +893,11 @@ fail1:
vmspace_free(vm2);
uma_zfree(proc_zone, newproc);
pause("fork", hz / 2);
+#ifdef RACCT
PROC_LOCK(p1);
racct_sub(p1, RACCT_NPROC, 1);
PROC_UNLOCK(p1);
+#endif
return (error);
}
diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c
index 5850ad1..358d673 100644
--- a/sys/kern/kern_jail.c
+++ b/sys/kern/kern_jail.c
@@ -3639,6 +3639,7 @@ prison_priv_check(struct ucred *cred, int priv)
case PRIV_NET_LAGG:
case PRIV_NET_GIF:
case PRIV_NET_SETIFVNET:
+ case PRIV_NET_SETIFFIB:
/*
* 802.11-related privileges.
diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c
index 01f7777..401ce1d 100644
--- a/sys/kern/kern_racct.c
+++ b/sys/kern/kern_racct.c
@@ -103,7 +103,7 @@ SDT_PROBE_DEFINE2(racct, kernel, racct, leave, leave, "struct racct *",
int racct_types[] = {
[RACCT_CPU] =
- RACCT_IN_THOUSANDS,
+ RACCT_IN_MILLIONS,
[RACCT_DATA] =
RACCT_RECLAIMABLE | RACCT_INHERITABLE | RACCT_DENIABLE,
[RACCT_STACK] =
@@ -141,7 +141,7 @@ int racct_types[] = {
[RACCT_SHMSIZE] =
RACCT_RECLAIMABLE | RACCT_DENIABLE | RACCT_SLOPPY,
[RACCT_WALLCLOCK] =
- RACCT_IN_THOUSANDS };
+ RACCT_IN_MILLIONS };
static void
racct_add_racct(struct racct *dest, const struct racct *src)
@@ -173,7 +173,7 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
* Update resource usage in dest.
*/
for (i = 0; i <= RACCT_MAX; i++) {
- if (!racct_is_sloppy(i)) {
+ if (!RACCT_IS_SLOPPY(i)) {
KASSERT(dest->r_resources[i] >= 0,
("racct propagation meltdown: dest < 0"));
KASSERT(src->r_resources[i] >= 0,
@@ -181,10 +181,10 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
KASSERT(src->r_resources[i] <= dest->r_resources[i],
("racct propagation meltdown: src > dest"));
}
- if (racct_is_reclaimable(i)) {
+ if (RACCT_IS_RECLAIMABLE(i)) {
dest->r_resources[i] -= src->r_resources[i];
if (dest->r_resources[i] < 0) {
- KASSERT(racct_is_sloppy(i),
+ KASSERT(RACCT_IS_SLOPPY(i),
("racct_sub_racct: usage < 0"));
dest->r_resources[i] = 0;
}
@@ -218,9 +218,9 @@ racct_destroy_locked(struct racct **racctp)
racct = *racctp;
for (i = 0; i <= RACCT_MAX; i++) {
- if (racct_is_sloppy(i))
+ if (RACCT_IS_SLOPPY(i))
continue;
- if (!racct_is_reclaimable(i))
+ if (!RACCT_IS_RECLAIMABLE(i))
continue;
KASSERT(racct->r_resources[i] == 0,
("destroying non-empty racct: "
@@ -255,7 +255,7 @@ racct_alloc_resource(struct racct *racct, int resource,
racct->r_resources[resource] += amount;
if (racct->r_resources[resource] < 0) {
- KASSERT(racct_is_sloppy(resource),
+ KASSERT(RACCT_IS_SLOPPY(resource),
("racct_alloc_resource: usage < 0"));
racct->r_resources[resource] = 0;
}
@@ -285,7 +285,7 @@ racct_add(struct proc *p, int resource, uint64_t amount)
mtx_lock(&racct_lock);
#ifdef RCTL
error = rctl_enforce(p, resource, amount);
- if (error && racct_is_deniable(resource)) {
+ if (error && RACCT_IS_DENIABLE(resource)) {
SDT_PROBE(racct, kernel, rusage, add_failure, p, resource,
amount, 0, 0);
mtx_unlock(&racct_lock);
@@ -373,14 +373,14 @@ racct_set_locked(struct proc *p, int resource, uint64_t amount)
diff = amount - p->p_racct->r_resources[resource];
#ifdef notyet
- KASSERT(diff >= 0 || racct_is_reclaimable(resource),
+ KASSERT(diff >= 0 || RACCT_IS_RECLAIMABLE(resource),
("racct_set: usage of non-reclaimable resource %d dropping",
resource));
#endif
#ifdef RCTL
if (diff > 0) {
error = rctl_enforce(p, resource, diff);
- if (error && racct_is_deniable(resource)) {
+ if (error && RACCT_IS_DENIABLE(resource)) {
SDT_PROBE(racct, kernel, rusage, set_failure, p,
resource, amount, 0, 0);
return (error);
@@ -489,7 +489,7 @@ racct_sub(struct proc *p, int resource, uint64_t amount)
* We need proc lock to dereference p->p_ucred.
*/
PROC_LOCK_ASSERT(p, MA_OWNED);
- KASSERT(racct_is_reclaimable(resource),
+ KASSERT(RACCT_IS_RECLAIMABLE(resource),
("racct_sub: called for non-reclaimable resource %d", resource));
mtx_lock(&racct_lock);
@@ -512,7 +512,7 @@ racct_sub_cred_locked(struct ucred *cred, int resource, uint64_t amount)
0, 0);
#ifdef notyet
- KASSERT(racct_is_reclaimable(resource),
+ KASSERT(RACCT_IS_RECLAIMABLE(resource),
("racct_sub_cred: called for non-reclaimable resource %d",
resource));
#endif
@@ -564,7 +564,7 @@ racct_proc_fork(struct proc *parent, struct proc *child)
*/
for (i = 0; i <= RACCT_MAX; i++) {
if (parent->p_racct->r_resources[i] == 0 ||
- !racct_is_inheritable(i))
+ !RACCT_IS_INHERITABLE(i))
continue;
error = racct_set_locked(child, i,
diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c
index 3d0a478..a939758 100644
--- a/sys/kern/kern_rctl.c
+++ b/sys/kern/kern_rctl.c
@@ -99,17 +99,17 @@ static struct dict subjectnames[] = {
{ NULL, -1 }};
static struct dict resourcenames[] = {
- { "cpu", RACCT_CPU },
- { "data", RACCT_DATA },
- { "stack", RACCT_STACK },
- { "core", RACCT_CORE },
- { "rss", RACCT_RSS },
- { "memlock", RACCT_MEMLOCK },
- { "nproc", RACCT_NPROC },
- { "nofile", RACCT_NOFILE },
- { "vmem", RACCT_VMEM },
- { "npts", RACCT_NPTS },
- { "swap", RACCT_SWAP },
+ { "cputime", RACCT_CPU },
+ { "datasize", RACCT_DATA },
+ { "stacksize", RACCT_STACK },
+ { "coredumpsize", RACCT_CORE },
+ { "memoryuse", RACCT_RSS },
+ { "memorylocked", RACCT_MEMLOCK },
+ { "maxproc", RACCT_NPROC },
+ { "openfiles", RACCT_NOFILE },
+ { "vmemoryuse", RACCT_VMEM },
+ { "pseudoterminals", RACCT_NPTS },
+ { "swapuse", RACCT_SWAP },
{ "nthr", RACCT_NTHR },
{ "msgqqueued", RACCT_MSGQQUEUED },
{ "msgqsize", RACCT_MSGQSIZE },
@@ -907,7 +907,7 @@ rctl_string_to_rule(char *rulestr, struct rctl_rule **rulep)
error = str2int64(amountstr, &rule->rr_amount);
if (error != 0)
goto out;
- if (racct_is_in_thousands(rule->rr_resource))
+ if (RACCT_IS_IN_MILLIONS(rule->rr_resource))
rule->rr_amount *= 1000;
}
@@ -947,7 +947,7 @@ rctl_rule_add(struct rctl_rule *rule)
/*
* Some rules just don't make sense. Note that the one below
- * cannot be rewritten using racct_is_deniable(); the RACCT_PCTCPU,
+ * cannot be rewritten using RACCT_IS_DENIABLE(); the RACCT_PCTCPU,
* for example, is not deniable in the racct sense, but the
* limit is enforced in a different way, so "deny" rules for %CPU
* do make sense.
@@ -958,7 +958,7 @@ rctl_rule_add(struct rctl_rule *rule)
return (EOPNOTSUPP);
if (rule->rr_per == RCTL_SUBJECT_TYPE_PROCESS &&
- racct_is_sloppy(rule->rr_resource))
+ RACCT_IS_SLOPPY(rule->rr_resource))
return (EOPNOTSUPP);
/*
@@ -1152,8 +1152,8 @@ rctl_rule_to_sbuf(struct sbuf *sb, const struct rctl_rule *rule)
amount = rule->rr_amount;
if (amount != RCTL_AMOUNT_UNDEFINED &&
- racct_is_in_thousands(rule->rr_resource))
- amount /= 1000;
+ RACCT_IS_IN_MILLIONS(rule->rr_resource))
+ amount /= 1000000;
sbuf_printf(sb, "%s:%s=%jd",
rctl_resource_name(rule->rr_resource),
@@ -1219,10 +1219,10 @@ rctl_racct_to_sbuf(struct racct *racct, int sloppy)
sb = sbuf_new_auto();
for (i = 0; i <= RACCT_MAX; i++) {
- if (sloppy == 0 && racct_is_sloppy(i))
+ if (sloppy == 0 && RACCT_IS_SLOPPY(i))
continue;
amount = racct->r_resources[i];
- if (racct_is_in_thousands(i))
+ if (RACCT_IS_IN_MILLIONS(i))
amount /= 1000;
sbuf_printf(sb, "%s=%jd,", rctl_resource_name(i), amount);
}
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index 3214e1b..1c7337d 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -263,7 +263,7 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
pc = pcpu_find(curcpu);
/* Check if we just need to do a proper critical_exit. */
- if (!CPU_OVERLAP(&pc->pc_cpumask, &rm->rm_writecpus)) {
+ if (!CPU_ISSET(pc->pc_cpuid, &rm->rm_writecpus)) {
critical_exit();
return (1);
}
@@ -325,7 +325,7 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
critical_enter();
pc = pcpu_find(curcpu);
- CPU_NAND(&rm->rm_writecpus, &pc->pc_cpumask);
+ CPU_CLR(pc->pc_cpuid, &rm->rm_writecpus);
rm_tracker_add(pc, tracker);
sched_pin();
critical_exit();
@@ -367,7 +367,7 @@ _rm_rlock(struct rmlock *rm, struct rm_priotracker *tracker, int trylock)
* conditional jump.
*/
if (0 == (td->td_owepreempt |
- CPU_OVERLAP(&rm->rm_writecpus, &pc->pc_cpumask)))
+ CPU_ISSET(pc->pc_cpuid, &rm->rm_writecpus)))
return (1);
/* We do not have a read token and need to acquire one. */
diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c
index 39d6f23..0c52071 100644
--- a/sys/kern/kern_tc.c
+++ b/sys/kern/kern_tc.c
@@ -492,6 +492,12 @@ tc_windup(void)
/* Now is a good time to change timecounters. */
if (th->th_counter != timecounter) {
+#ifndef __arm__
+ if ((timecounter->tc_flags & TC_FLAGS_C3STOP) != 0)
+ cpu_disable_deep_sleep++;
+ if ((th->th_counter->tc_flags & TC_FLAGS_C3STOP) != 0)
+ cpu_disable_deep_sleep--;
+#endif
th->th_counter = timecounter;
th->th_offset_count = ncount;
tc_min_ticktock_freq = max(1, timecounter->tc_frequency /
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 7011a53..94e41e2 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -185,11 +185,13 @@ create_thread(struct thread *td, mcontext_t *ctx,
}
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(p, RACCT_NTHR, 1);
PROC_UNLOCK(td->td_proc);
if (error != 0)
return (EPROCLIM);
+#endif
/* Initialize our td */
newtd = thread_alloc(0);
@@ -277,9 +279,11 @@ create_thread(struct thread *td, mcontext_t *ctx,
return (0);
fail:
+#ifdef RACCT
PROC_LOCK(p);
racct_sub(p, RACCT_NTHR, 1);
PROC_UNLOCK(p);
+#endif
return (error);
}
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 38bf37f..2f9a1f6 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -950,11 +950,11 @@ link_elf_load_file(linker_class_t cls, const char* filename,
ef->ddbstrcnt = strcnt;
ef->ddbstrtab = ef->strbase;
+nosyms:
error = link_elf_link_common_finish(lf);
if (error != 0)
goto out;
-nosyms:
*result = lf;
out:
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 592bb80..574755f0 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -951,8 +951,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags)
if (td->td_flags & TDF_IDLETD) {
TD_SET_CAN_RUN(td);
#ifdef SMP
- /* Spinlock held here, assume no migration. */
- CPU_NAND(&idle_cpus_mask, PCPU_PTR(cpumask));
+ CPU_CLR(PCPU_GET(cpuid), &idle_cpus_mask);
#endif
} else {
if (TD_IS_RUNNING(td)) {
@@ -1026,7 +1025,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags)
#ifdef SMP
if (td->td_flags & TDF_IDLETD)
- CPU_OR(&idle_cpus_mask, PCPU_PTR(cpumask));
+ CPU_SET(PCPU_GET(cpuid), &idle_cpus_mask);
#endif
sched_lock.mtx_lock = (uintptr_t)td;
td->td_oncpu = PCPU_GET(cpuid);
@@ -1055,7 +1054,8 @@ static int
forward_wakeup(int cpunum)
{
struct pcpu *pc;
- cpuset_t dontuse, id, map, map2, me;
+ cpuset_t dontuse, map, map2;
+ u_int id, me;
int iscpuset;
mtx_assert(&sched_lock, MA_OWNED);
@@ -1073,27 +1073,24 @@ forward_wakeup(int cpunum)
/*
* Check the idle mask we received against what we calculated
* before in the old version.
- *
- * Also note that sched_lock is held now, thus no migration is
- * expected.
*/
- me = PCPU_GET(cpumask);
+ me = PCPU_GET(cpuid);
/* Don't bother if we should be doing it ourself. */
- if (CPU_OVERLAP(&me, &idle_cpus_mask) &&
- (cpunum == NOCPU || CPU_ISSET(cpunum, &me)))
+ if (CPU_ISSET(me, &idle_cpus_mask) &&
+ (cpunum == NOCPU || me == cpunum))
return (0);
- dontuse = me;
+ CPU_SETOF(me, &dontuse);
CPU_OR(&dontuse, &stopped_cpus);
CPU_OR(&dontuse, &hlt_cpus_mask);
CPU_ZERO(&map2);
if (forward_wakeup_use_loop) {
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- id = pc->pc_cpumask;
- if (!CPU_OVERLAP(&id, &dontuse) &&
+ id = pc->pc_cpuid;
+ if (!CPU_ISSET(id, &dontuse) &&
pc->pc_curthread == pc->pc_idlethread) {
- CPU_OR(&map2, &id);
+ CPU_SET(id, &map2);
}
}
}
@@ -1125,11 +1122,11 @@ forward_wakeup(int cpunum)
if (!CPU_EMPTY(&map)) {
forward_wakeups_delivered++;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- id = pc->pc_cpumask;
- if (!CPU_OVERLAP(&map, &id))
+ id = pc->pc_cpuid;
+ if (!CPU_ISSET(id, &map))
continue;
if (cpu_idle_wakeup(pc->pc_cpuid))
- CPU_NAND(&map, &id);
+ CPU_CLR(id, &map);
}
if (!CPU_EMPTY(&map))
ipi_selected(map, IPI_AST);
@@ -1147,7 +1144,7 @@ kick_other_cpu(int pri, int cpuid)
int cpri;
pcpu = pcpu_find(cpuid);
- if (CPU_OVERLAP(&idle_cpus_mask, &pcpu->pc_cpumask)) {
+ if (CPU_ISSET(cpuid, &idle_cpus_mask)) {
forward_wakeups_delivered++;
if (!cpu_idle_wakeup(cpuid))
ipi_cpu(cpuid, IPI_AST);
@@ -1205,10 +1202,10 @@ void
sched_add(struct thread *td, int flags)
#ifdef SMP
{
- cpuset_t idle, me, tidlemsk;
+ cpuset_t tidlemsk;
struct td_sched *ts;
+ u_int cpu, cpuid;
int forwarded = 0;
- int cpu;
int single_cpu = 0;
ts = td->td_sched;
@@ -1271,23 +1268,17 @@ sched_add(struct thread *td, int flags)
ts->ts_runq = &runq;
}
- if (single_cpu && (cpu != PCPU_GET(cpuid))) {
+ cpuid = PCPU_GET(cpuid);
+ if (single_cpu && cpu != cpuid) {
kick_other_cpu(td->td_priority, cpu);
} else {
if (!single_cpu) {
+ tidlemsk = idle_cpus_mask;
+ CPU_NAND(&tidlemsk, &hlt_cpus_mask);
+ CPU_CLR(cpuid, &tidlemsk);
- /*
- * Thread spinlock is held here, assume no
- * migration is possible.
- */
- me = PCPU_GET(cpumask);
- idle = idle_cpus_mask;
- tidlemsk = idle;
- CPU_AND(&idle, &me);
- CPU_OR(&me, &hlt_cpus_mask);
- CPU_NAND(&tidlemsk, &me);
-
- if (CPU_EMPTY(&idle) && ((flags & SRQ_INTR) == 0) &&
+ if (!CPU_ISSET(cpuid, &idle_cpus_mask) &&
+ ((flags & SRQ_INTR) == 0) &&
!CPU_EMPTY(&tidlemsk))
forwarded = forward_wakeup(cpu);
}
diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c
index c2f6e99..f5cb31e 100644
--- a/sys/kern/subr_kdb.c
+++ b/sys/kern/subr_kdb.c
@@ -88,20 +88,6 @@ SYSCTL_PROC(_debug_kdb, OID_AUTO, trap_code, CTLTYPE_INT | CTLFLAG_RW, NULL, 0,
kdb_sysctl_trap_code, "I", "set to cause a page fault via code access");
/*
- * Flag indicating whether or not to IPI the other CPUs to stop them on
- * entering the debugger. Sometimes, this will result in a deadlock as
- * stop_cpus() waits for the other cpus to stop, so we allow it to be
- * disabled. In order to maximize the chances of success, use a hard
- * stop for that.
- */
-#ifdef SMP
-static int kdb_stop_cpus = 1;
-SYSCTL_INT(_debug_kdb, OID_AUTO, stop_cpus, CTLFLAG_RW | CTLFLAG_TUN,
- &kdb_stop_cpus, 0, "stop other CPUs when entering the debugger");
-TUNABLE_INT("debug.kdb.stop_cpus", &kdb_stop_cpus);
-#endif
-
-/*
* Flag to indicate to debuggers why the debugger was entered.
*/
const char * volatile kdb_why = KDB_WHY_UNSET;
@@ -211,9 +197,12 @@ kdb_sysctl_trap_code(SYSCTL_HANDLER_ARGS)
void
kdb_panic(const char *msg)
{
-
#ifdef SMP
- stop_cpus_hard(PCPU_GET(other_cpus));
+ cpuset_t other_cpus;
+
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ stop_cpus_hard(other_cpus);
#endif
printf("KDB: panic\n");
panic("%s", msg);
@@ -429,7 +418,7 @@ kdb_thr_ctx(struct thread *thr)
#if defined(SMP) && defined(KDB_STOPPEDPCB)
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
if (pc->pc_curthread == thr &&
- CPU_OVERLAP(&stopped_cpus, &pc->pc_cpumask))
+ CPU_ISSET(pc->pc_cpuid, &stopped_cpus))
return (KDB_STOPPEDPCB(pc));
}
#endif
@@ -513,11 +502,11 @@ kdb_thr_select(struct thread *thr)
int
kdb_trap(int type, int code, struct trapframe *tf)
{
- struct kdb_dbbe *be;
- register_t intr;
#ifdef SMP
- int did_stop_cpus;
+ cpuset_t other_cpus;
#endif
+ struct kdb_dbbe *be;
+ register_t intr;
int handled;
be = kdb_dbbe;
@@ -531,8 +520,9 @@ kdb_trap(int type, int code, struct trapframe *tf)
intr = intr_disable();
#ifdef SMP
- if ((did_stop_cpus = kdb_stop_cpus) != 0)
- stop_cpus_hard(PCPU_GET(other_cpus));
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ stop_cpus_hard(other_cpus);
#endif
kdb_active++;
@@ -558,8 +548,7 @@ kdb_trap(int type, int code, struct trapframe *tf)
kdb_active--;
#ifdef SMP
- if (did_stop_cpus)
- restart_cpus(stopped_cpus);
+ restart_cpus(stopped_cpus);
#endif
intr_restore(intr);
diff --git a/sys/kern/subr_pcpu.c b/sys/kern/subr_pcpu.c
index a6b3ae0..ec6b590 100644
--- a/sys/kern/subr_pcpu.c
+++ b/sys/kern/subr_pcpu.c
@@ -87,7 +87,6 @@ pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
KASSERT(cpuid >= 0 && cpuid < MAXCPU,
("pcpu_init: invalid cpuid %d", cpuid));
pcpu->pc_cpuid = cpuid;
- CPU_SETOF(cpuid, &pcpu->pc_cpumask);
cpuid_to_pcpu[cpuid] = pcpu;
STAILQ_INSERT_TAIL(&cpuhead, pcpu, pc_allcpu);
cpu_pcpu_init(pcpu, cpuid, size);
diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c
index c38177b..caec965 100644
--- a/sys/kern/subr_smp.c
+++ b/sys/kern/subr_smp.c
@@ -142,7 +142,7 @@ mp_start(void *dummy)
/* Probe for MP hardware. */
if (smp_disabled != 0 || cpu_mp_probe() == 0) {
mp_ncpus = 1;
- all_cpus = PCPU_GET(cpumask);
+ CPU_SETOF(PCPU_GET(cpuid), &all_cpus);
return;
}
@@ -236,12 +236,10 @@ generic_stop_cpus(cpuset_t map, u_int type)
/* spin */
cpu_spinwait();
i++;
-#ifdef DIAGNOSTIC
- if (i == 100000) {
+ if (i == 100000000) {
printf("timeout stopping cpus\n");
break;
}
-#endif
}
stopping_cpu = NOCPU;
@@ -708,7 +706,7 @@ mp_setvariables_for_up(void *dummy)
{
mp_ncpus = 1;
mp_maxid = PCPU_GET(cpuid);
- all_cpus = PCPU_GET(cpumask);
+ CPU_SETOF(mp_maxid, &all_cpus);
KASSERT(PCPU_GET(cpuid) == 0, ("UP must have a CPU ID of zero"));
}
SYSINIT(cpu_mp_setvariables, SI_SUB_TUNABLES, SI_ORDER_FIRST,
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index 0113d7b..3527ed1 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -44,7 +44,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_capabilities.h"
+#include "opt_capsicum.h"
#include "opt_ktrace.h"
#include "opt_kdtrace.h"
#include "opt_sched.h"
@@ -313,7 +313,7 @@ syscallenter(struct thread *td, struct syscall_args *sa)
goto retval;
}
-#ifdef CAPABILITIES
+#ifdef CAPABILITY_MODE
/*
* In capability mode, we only allow access to system calls
* flagged with SYF_CAPENABLED.
diff --git a/sys/kern/subr_uio.c b/sys/kern/subr_uio.c
index 9385dc4..6e81328 100644
--- a/sys/kern/subr_uio.c
+++ b/sys/kern/subr_uio.c
@@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$");
SYSCTL_INT(_kern, KERN_IOV_MAX, iov_max, CTLFLAG_RD, NULL, UIO_MAXIOV,
"Maximum number of elements in an I/O vector; sysconf(_SC_IOV_MAX)");
+static int uiomove_faultflag(void *cp, int n, struct uio *uio, int nofault);
+
#ifdef ZERO_COPY_SOCKETS
/* Declared in uipc_socket.c */
extern int so_zero_copy_receive;
@@ -129,23 +131,65 @@ retry:
#endif /* ZERO_COPY_SOCKETS */
int
+copyin_nofault(const void *udaddr, void *kaddr, size_t len)
+{
+ int error, save;
+
+ save = vm_fault_disable_pagefaults();
+ error = copyin(udaddr, kaddr, len);
+ vm_fault_enable_pagefaults(save);
+ return (error);
+}
+
+int
+copyout_nofault(const void *kaddr, void *udaddr, size_t len)
+{
+ int error, save;
+
+ save = vm_fault_disable_pagefaults();
+ error = copyout(kaddr, udaddr, len);
+ vm_fault_enable_pagefaults(save);
+ return (error);
+}
+
+int
uiomove(void *cp, int n, struct uio *uio)
{
- struct thread *td = curthread;
+
+ return (uiomove_faultflag(cp, n, uio, 0));
+}
+
+int
+uiomove_nofault(void *cp, int n, struct uio *uio)
+{
+
+ return (uiomove_faultflag(cp, n, uio, 1));
+}
+
+static int
+uiomove_faultflag(void *cp, int n, struct uio *uio, int nofault)
+{
+ struct thread *td;
struct iovec *iov;
u_int cnt;
- int error = 0;
- int save = 0;
+ int error, newflags, save;
+
+ td = curthread;
+ error = 0;
KASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE,
("uiomove: mode"));
- KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
+ KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == td,
("uiomove proc"));
- WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
- "Calling uiomove()");
+ if (!nofault)
+ WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
+ "Calling uiomove()");
- save = td->td_pflags & TDP_DEADLKTREAT;
- td->td_pflags |= TDP_DEADLKTREAT;
+ /* XXX does it make a sense to set TDP_DEADLKTREAT for UIO_SYSSPACE ? */
+ newflags = TDP_DEADLKTREAT;
+ if (uio->uio_segflg == UIO_USERSPACE && nofault)
+ newflags |= TDP_NOFAULTING;
+ save = curthread_pflags_set(newflags);
while (n > 0 && uio->uio_resid) {
iov = uio->uio_iov;
@@ -187,8 +231,7 @@ uiomove(void *cp, int n, struct uio *uio)
n -= cnt;
}
out:
- if (save == 0)
- td->td_pflags &= ~TDP_DEADLKTREAT;
+ curthread_pflags_restore(save);
return (error);
}
diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c
index 89dc923..04f98d8 100644
--- a/sys/kern/sys_capability.c
+++ b/sys/kern/sys_capability.c
@@ -36,7 +36,7 @@
*
*/
-#include "opt_capabilities.h"
+#include "opt_capsicum.h"
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
@@ -59,18 +59,11 @@ __FBSDID("$FreeBSD$");
#include <vm/uma.h>
#include <vm/vm.h>
-#ifdef CAPABILITIES
+#ifdef CAPABILITY_MODE
FEATURE(security_capabilities, "Capsicum Capability Mode");
/*
- * We don't currently have any MIB entries for sysctls, but we do expose
- * security.capabilities so that it's easy to tell if options CAPABILITIES is
- * compiled into the kernel.
- */
-SYSCTL_NODE(_security, OID_AUTO, capabilities, CTLFLAG_RW, 0, "Capsicum");
-
-/*
* System call to enter capability mode for the process.
*/
int
@@ -106,7 +99,7 @@ cap_getmode(struct thread *td, struct cap_getmode_args *uap)
return (copyout(&i, uap->modep, sizeof(i)));
}
-#else /* !CAPABILITIES */
+#else /* !CAPABILITY_MODE */
int
cap_enter(struct thread *td, struct cap_enter_args *uap)
@@ -122,4 +115,403 @@ cap_getmode(struct thread *td, struct cap_getmode_args *uap)
return (ENOSYS);
}
+#endif /* CAPABILITY_MODE */
+
+#ifdef CAPABILITIES
+
+/*
+ * struct capability describes a capability, and is hung off of its struct
+ * file f_data field. cap_file and cap_rightss are static once hooked up, as
+ * neither the object it references nor the rights it encapsulates are
+ * permitted to change.
+ */
+struct capability {
+ struct file *cap_object; /* Underlying object's file. */
+ struct file *cap_file; /* Back-pointer to cap's file. */
+ cap_rights_t cap_rights; /* Mask of rights on object. */
+};
+
+/*
+ * Capabilities have a fileops vector, but in practice none should ever be
+ * called except for fo_close, as the capability will normally not be
+ * returned during a file descriptor lookup in the system call code.
+ */
+static fo_rdwr_t capability_read;
+static fo_rdwr_t capability_write;
+static fo_truncate_t capability_truncate;
+static fo_ioctl_t capability_ioctl;
+static fo_poll_t capability_poll;
+static fo_kqfilter_t capability_kqfilter;
+static fo_stat_t capability_stat;
+static fo_close_t capability_close;
+
+static struct fileops capability_ops = {
+ .fo_read = capability_read,
+ .fo_write = capability_write,
+ .fo_truncate = capability_truncate,
+ .fo_ioctl = capability_ioctl,
+ .fo_poll = capability_poll,
+ .fo_kqfilter = capability_kqfilter,
+ .fo_stat = capability_stat,
+ .fo_close = capability_close,
+ .fo_flags = DFLAG_PASSABLE,
+};
+
+static struct fileops capability_ops_unpassable = {
+ .fo_read = capability_read,
+ .fo_write = capability_write,
+ .fo_truncate = capability_truncate,
+ .fo_ioctl = capability_ioctl,
+ .fo_poll = capability_poll,
+ .fo_kqfilter = capability_kqfilter,
+ .fo_stat = capability_stat,
+ .fo_close = capability_close,
+ .fo_flags = 0,
+};
+
+static uma_zone_t capability_zone;
+
+static void
+capability_init(void *dummy __unused)
+{
+
+ capability_zone = uma_zcreate("capability", sizeof(struct capability),
+ NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
+ if (capability_zone == NULL)
+ panic("capability_init: capability_zone not initialized");
+}
+SYSINIT(vfs, SI_SUB_VFS, SI_ORDER_ANY, capability_init, NULL);
+
+/*
+ * Test whether a capability grants the requested rights.
+ */
+static int
+cap_check(struct capability *c, cap_rights_t rights)
+{
+
+ if ((c->cap_rights | rights) != c->cap_rights)
+ return (ENOTCAPABLE);
+ return (0);
+}
+
+/*
+ * Extract rights from a capability for monitoring purposes -- not for use in
+ * any other way, as we want to keep all capability permission evaluation in
+ * this one file.
+ */
+cap_rights_t
+cap_rights(struct file *fp_cap)
+{
+ struct capability *c;
+
+ KASSERT(fp_cap->f_type == DTYPE_CAPABILITY,
+ ("cap_rights: !capability"));
+
+ c = fp_cap->f_data;
+ return (c->cap_rights);
+}
+
+/*
+ * System call to create a new capability reference to either an existing
+ * file object or an an existing capability.
+ */
+int
+cap_new(struct thread *td, struct cap_new_args *uap)
+{
+ int error, capfd;
+ int fd = uap->fd;
+ struct file *fp, *fcapp;
+ cap_rights_t rights = uap->rights;
+
+ AUDIT_ARG_FD(fd);
+#ifdef notyet /* capability auditing will follow in a few commits */
+ AUDIT_ARG_RIGHTS(rights);
+#endif
+ error = fget(td, fd, &fp);
+ if (error)
+ return (error);
+ AUDIT_ARG_FILE(td->td_proc, fp);
+ error = kern_capwrap(td, fp, rights, &fcapp, &capfd);
+ if (error)
+ return (error);
+
+ /*
+ * Release our reference to the file (kern_capwrap has held a reference
+ * for the filedesc array).
+ */
+ fdrop(fp, td);
+ td->td_retval[0] = capfd;
+ return (0);
+}
+
+/*
+ * System call to query the rights mask associated with a capability.
+ */
+int
+cap_getrights(struct thread *td, struct cap_getrights_args *uap)
+{
+ struct capability *cp;
+ struct file *fp;
+ int error;
+
+ AUDIT_ARG_FD(uap->fd);
+ error = fgetcap(td, uap->fd, &fp);
+ if (error)
+ return (error);
+ cp = fp->f_data;
+ error = copyout(&cp->cap_rights, uap->rightsp, sizeof(*uap->rightsp));
+ fdrop(fp, td);
+ return (error);
+}
+
+/*
+ * Create a capability to wrap around an existing file.
+ */
+int
+kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights,
+ struct file **fcappp, int *capfdp)
+{
+ struct capability *cp, *cp_old;
+ struct file *fp_object;
+ int error;
+
+ if ((rights | CAP_MASK_VALID) != CAP_MASK_VALID)
+ return (EINVAL);
+
+ /*
+ * If a new capability is being derived from an existing capability,
+ * then the new capability rights must be a subset of the existing
+ * rights.
+ */
+ if (fp->f_type == DTYPE_CAPABILITY) {
+ cp_old = fp->f_data;
+ if ((cp_old->cap_rights | rights) != cp_old->cap_rights)
+ return (ENOTCAPABLE);
+ }
+
+ /*
+ * Allocate a new file descriptor to hang the capability off of.
+ */
+ error = falloc(td, fcappp, capfdp, fp->f_flag);
+ if (error)
+ return (error);
+
+ /*
+ * Rather than nesting capabilities, directly reference the object an
+ * existing capability references. There's nothing else interesting
+ * to preserve for future use, as we've incorporated the previous
+ * rights mask into the new one. This prevents us from having to
+ * deal with capability chains.
+ */
+ if (fp->f_type == DTYPE_CAPABILITY)
+ fp_object = ((struct capability *)fp->f_data)->cap_object;
+ else
+ fp_object = fp;
+ fhold(fp_object);
+ cp = uma_zalloc(capability_zone, M_WAITOK | M_ZERO);
+ cp->cap_rights = rights;
+ cp->cap_object = fp_object;
+ cp->cap_file = *fcappp;
+ if (fp->f_flag & DFLAG_PASSABLE)
+ finit(*fcappp, fp->f_flag, DTYPE_CAPABILITY, cp,
+ &capability_ops);
+ else
+ finit(*fcappp, fp->f_flag, DTYPE_CAPABILITY, cp,
+ &capability_ops_unpassable);
+
+ /*
+ * Release our private reference (the proc filedesc still has one).
+ */
+ fdrop(*fcappp, td);
+ return (0);
+}
+
+/*
+ * Given a file descriptor, test it against a capability rights mask and then
+ * return the file descriptor on which to actually perform the requested
+ * operation. As long as the reference to fp_cap remains valid, the returned
+ * pointer in *fp will remain valid, so no extra reference management is
+ * required, and the caller should fdrop() fp_cap as normal when done with
+ * both.
+ */
+int
+cap_funwrap(struct file *fp_cap, cap_rights_t rights, struct file **fpp)
+{
+ struct capability *c;
+ int error;
+
+ if (fp_cap->f_type != DTYPE_CAPABILITY) {
+ *fpp = fp_cap;
+ return (0);
+ }
+ c = fp_cap->f_data;
+ error = cap_check(c, rights);
+ if (error)
+ return (error);
+ *fpp = c->cap_object;
+ return (0);
+}
+
+/*
+ * Slightly different routine for memory mapping file descriptors: unwrap the
+ * capability and check CAP_MMAP, but also return a bitmask representing the
+ * maximum mapping rights the capability allows on the object.
+ */
+int
+cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights, u_char *maxprotp,
+ struct file **fpp)
+{
+ struct capability *c;
+ u_char maxprot;
+ int error;
+
+ if (fp_cap->f_type != DTYPE_CAPABILITY) {
+ *fpp = fp_cap;
+ *maxprotp = VM_PROT_ALL;
+ return (0);
+ }
+ c = fp_cap->f_data;
+ error = cap_check(c, rights | CAP_MMAP);
+ if (error)
+ return (error);
+ *fpp = c->cap_object;
+ maxprot = 0;
+ if (c->cap_rights & CAP_READ)
+ maxprot |= VM_PROT_READ;
+ if (c->cap_rights & CAP_WRITE)
+ maxprot |= VM_PROT_WRITE;
+ if (c->cap_rights & CAP_MAPEXEC)
+ maxprot |= VM_PROT_EXECUTE;
+ *maxprotp = maxprot;
+ return (0);
+}
+
+/*
+ * When a capability is closed, simply drop the reference on the underlying
+ * object and free the capability. fdrop() will handle the case where the
+ * underlying object also needs to close, and the caller will have already
+ * performed any object-specific lock or mqueue handling.
+ */
+static int
+capability_close(struct file *fp, struct thread *td)
+{
+ struct capability *c;
+ struct file *fp_object;
+
+ KASSERT(fp->f_type == DTYPE_CAPABILITY,
+ ("capability_close: !capability"));
+
+ c = fp->f_data;
+ fp->f_ops = &badfileops;
+ fp->f_data = NULL;
+ fp_object = c->cap_object;
+ uma_zfree(capability_zone, c);
+ return (fdrop(fp_object, td));
+}
+
+/*
+ * In general, file descriptor operations should never make it to the
+ * capability, only the underlying file descriptor operation vector, so panic
+ * if we do turn up here.
+ */
+static int
+capability_read(struct file *fp, struct uio *uio, struct ucred *active_cred,
+ int flags, struct thread *td)
+{
+
+ panic("capability_read");
+}
+
+static int
+capability_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
+ int flags, struct thread *td)
+{
+
+ panic("capability_write");
+}
+
+static int
+capability_truncate(struct file *fp, off_t length, struct ucred *active_cred,
+ struct thread *td)
+{
+
+ panic("capability_truncate");
+}
+
+static int
+capability_ioctl(struct file *fp, u_long com, void *data,
+ struct ucred *active_cred, struct thread *td)
+{
+
+ panic("capability_ioctl");
+}
+
+static int
+capability_poll(struct file *fp, int events, struct ucred *active_cred,
+ struct thread *td)
+{
+
+ panic("capability_poll");
+}
+
+static int
+capability_kqfilter(struct file *fp, struct knote *kn)
+{
+
+ panic("capability_kqfilter");
+}
+
+static int
+capability_stat(struct file *fp, struct stat *sb, struct ucred *active_cred,
+ struct thread *td)
+{
+
+ panic("capability_stat");
+}
+
+#else /* !CAPABILITIES */
+
+/*
+ * Stub Capability functions for when options CAPABILITIES isn't compiled
+ * into the kernel.
+ */
+int
+cap_new(struct thread *td, struct cap_new_args *uap)
+{
+
+ return (ENOSYS);
+}
+
+int
+cap_getrights(struct thread *td, struct cap_getrights_args *uap)
+{
+
+ return (ENOSYS);
+}
+
+int
+cap_funwrap(struct file *fp_cap, cap_rights_t rights, struct file **fpp)
+{
+
+ KASSERT(fp_cap->f_type != DTYPE_CAPABILITY,
+ ("cap_funwrap: saw capability"));
+
+ *fpp = fp_cap;
+ return (0);
+}
+
+int
+cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights, u_char *maxprotp,
+ struct file **fpp)
+{
+
+ KASSERT(fp_cap->f_type != DTYPE_CAPABILITY,
+ ("cap_funwrap_mmap: saw capability"));
+
+ *fpp = fp_cap;
+ *maxprotp = VM_PROT_ALL;
+ return (0);
+}
+
#endif /* CAPABILITIES */
+
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index a4c0069..ee36b35 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -829,6 +829,15 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
case PT_ATTACH:
/* security check done above */
+ /*
+ * It would be nice if the tracing relationship was separate
+ * from the parent relationship but that would require
+ * another set of links in the proc struct or for "wait"
+ * to scan the entire proc table. To make life easier,
+ * we just re-parent the process we're trying to trace.
+ * The old parent is remembered so we can put things back
+ * on a "detach".
+ */
p->p_flag |= P_TRACED;
p->p_oppid = p->p_pptr->p_pid;
if (p->p_pptr != td->td_proc) {
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 29a6485..abd9484 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -521,8 +521,8 @@ const char *syscallnames[] = {
"msgctl", /* 511 = msgctl */
"shmctl", /* 512 = shmctl */
"lpathconf", /* 513 = lpathconf */
- "#514", /* 514 = cap_new */
- "#515", /* 515 = cap_getrights */
+ "cap_new", /* 514 = cap_new */
+ "cap_getrights", /* 515 = cap_getrights */
"cap_enter", /* 516 = cap_enter */
"cap_getmode", /* 517 = cap_getmode */
"#518", /* 518 = pdfork */
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index af958c9..0b249a5 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -914,8 +914,9 @@
512 AUE_SHMCTL NOSTD { int shmctl(int shmid, int cmd, \
struct shmid_ds *buf); }
513 AUE_LPATHCONF STD { int lpathconf(char *path, int name); }
-514 AUE_CAP_NEW UNIMPL cap_new
-515 AUE_CAP_GETRIGHTS UNIMPL cap_getrights
+514 AUE_CAP_NEW STD { int cap_new(int fd, u_int64_t rights); }
+515 AUE_CAP_GETRIGHTS STD { int cap_getrights(int fd, \
+ u_int64_t *rightsp); }
516 AUE_CAP_ENTER STD { int cap_enter(void); }
517 AUE_CAP_GETMODE STD { int cap_getmode(u_int *modep); }
518 AUE_PDFORK UNIMPL pdfork
diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c
index 880b46b..f57777f 100644
--- a/sys/kern/systrace_args.c
+++ b/sys/kern/systrace_args.c
@@ -3096,6 +3096,22 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 2;
break;
}
+ /* cap_new */
+ case 514: {
+ struct cap_new_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = p->rights; /* u_int64_t */
+ *n_args = 2;
+ break;
+ }
+ /* cap_getrights */
+ case 515: {
+ struct cap_getrights_args *p = params;
+ iarg[0] = p->fd; /* int */
+ uarg[1] = (intptr_t) p->rightsp; /* u_int64_t * */
+ *n_args = 2;
+ break;
+ }
/* cap_enter */
case 516: {
*n_args = 0;
@@ -8326,6 +8342,32 @@ systrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
+ /* cap_new */
+ case 514:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t";
+ break;
+ default:
+ break;
+ };
+ break;
+ /* cap_getrights */
+ case 515:
+ switch(ndx) {
+ case 0:
+ p = "int";
+ break;
+ case 1:
+ p = "u_int64_t *";
+ break;
+ default:
+ break;
+ };
+ break;
/* cap_enter */
case 516:
break;
diff --git a/sys/kern/sysv_msg.c b/sys/kern/sysv_msg.c
index 87d479e..ffd8580 100644
--- a/sys/kern/sysv_msg.c
+++ b/sys/kern/sysv_msg.c
@@ -620,6 +620,7 @@ msgget(td, uap)
error = ENOSPC;
goto done2;
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(td->td_proc, RACCT_NMSGQ, 1);
PROC_UNLOCK(td->td_proc);
@@ -627,6 +628,7 @@ msgget(td, uap)
error = ENOSPC;
goto done2;
}
+#endif
DPRINTF(("msqid %d is available\n", msqid));
msqkptr->u.msg_perm.key = key;
msqkptr->u.msg_perm.cuid = cred->cr_uid;
@@ -685,7 +687,9 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
register struct msqid_kernel *msqkptr;
register struct msg *msghdr;
short next;
+#ifdef RACCT
size_t saved_msgsz;
+#endif
if (!prison_allow(td->td_ucred, PR_ALLOW_SYSVIPC))
return (ENOSYS);
@@ -723,6 +727,7 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
goto done2;
#endif
+#ifdef RACCT
PROC_LOCK(td->td_proc);
if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) {
PROC_UNLOCK(td->td_proc);
@@ -737,6 +742,7 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
goto done2;
}
PROC_UNLOCK(td->td_proc);
+#endif
segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz;
DPRINTF(("msgsz=%zu, msgssz=%d, segs_needed=%d\n", msgsz,
@@ -991,12 +997,14 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
wakeup(msqkptr);
td->td_retval[0] = 0;
done3:
+#ifdef RACCT
if (error != 0) {
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1);
racct_sub(td->td_proc, RACCT_MSGQSIZE, saved_msgsz);
PROC_UNLOCK(td->td_proc);
}
+#endif
done2:
mtx_unlock(&msq_mtx);
return (error);
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index ac53a8d..4a4c479 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -149,9 +149,6 @@ struct sem_undo {
#endif
/* shouldn't need tuning */
-#ifndef SEMMAP
-#define SEMMAP 30 /* # of entries in semaphore map */
-#endif
#ifndef SEMMSL
#define SEMMSL SEMMNS /* max # of semaphores per id */
#endif
@@ -182,7 +179,6 @@ struct sem_undo {
* semaphore info struct
*/
struct seminfo seminfo = {
- SEMMAP, /* # of entries in semaphore map */
SEMMNI, /* # of semaphore identifiers */
SEMMNS, /* # of semaphores in system */
SEMMNU, /* # of undo structures in system */
@@ -194,8 +190,6 @@ struct seminfo seminfo = {
SEMAEM /* adjust on exit max value */
};
-SYSCTL_INT(_kern_ipc, OID_AUTO, semmap, CTLFLAG_RW, &seminfo.semmap, 0,
- "Number of entries in the semaphore map");
SYSCTL_INT(_kern_ipc, OID_AUTO, semmni, CTLFLAG_RDTUN, &seminfo.semmni, 0,
"Number of semaphore identifiers");
SYSCTL_INT(_kern_ipc, OID_AUTO, semmns, CTLFLAG_RDTUN, &seminfo.semmns, 0,
@@ -255,7 +249,6 @@ seminit(void)
{
int i, error;
- TUNABLE_INT_FETCH("kern.ipc.semmap", &seminfo.semmap);
TUNABLE_INT_FETCH("kern.ipc.semmni", &seminfo.semmni);
TUNABLE_INT_FETCH("kern.ipc.semmns", &seminfo.semmns);
TUNABLE_INT_FETCH("kern.ipc.semmnu", &seminfo.semmnu);
@@ -931,6 +924,7 @@ semget(struct thread *td, struct semget_args *uap)
error = ENOSPC;
goto done2;
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_add(td->td_proc, RACCT_NSEM, nsems);
PROC_UNLOCK(td->td_proc);
@@ -938,6 +932,7 @@ semget(struct thread *td, struct semget_args *uap)
error = ENOSPC;
goto done2;
}
+#endif
DPRINTF(("semid %d is available\n", semid));
mtx_lock(&sema_mtx[semid]);
KASSERT((sema[semid].u.sem_perm.mode & SEM_ALLOC) == 0,
@@ -1023,12 +1018,14 @@ semop(struct thread *td, struct semop_args *uap)
nsops));
return (E2BIG);
} else {
+#ifdef RACCT
PROC_LOCK(td->td_proc);
if (nsops > racct_get_available(td->td_proc, RACCT_NSEMOP)) {
PROC_UNLOCK(td->td_proc);
return (E2BIG);
}
PROC_UNLOCK(td->td_proc);
+#endif
sops = malloc(nsops * sizeof(*sops), M_TEMP, M_WAITOK);
}
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index f5a84ae..1741a21 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -672,6 +672,7 @@ shmget_allocate_segment(td, uap, mode)
shm_last_free = -1;
}
shmseg = &shmsegs[segnum];
+#ifdef RACCT
PROC_LOCK(td->td_proc);
if (racct_add(td->td_proc, RACCT_NSHM, 1)) {
PROC_UNLOCK(td->td_proc);
@@ -683,6 +684,7 @@ shmget_allocate_segment(td, uap, mode)
return (ENOMEM);
}
PROC_UNLOCK(td->td_proc);
+#endif
/*
* In case we sleep in malloc(), mark the segment present but deleted
* so that noone else tries to create the same key.
@@ -699,10 +701,12 @@ shmget_allocate_segment(td, uap, mode)
shm_object = vm_pager_allocate(shm_use_phys ? OBJT_PHYS : OBJT_SWAP,
0, size, VM_PROT_DEFAULT, 0, cred);
if (shm_object == NULL) {
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_NSHM, 1);
racct_sub(td->td_proc, RACCT_SHMSIZE, size);
PROC_UNLOCK(td->td_proc);
+#endif
return (ENOMEM);
}
VM_OBJECT_LOCK(shm_object);
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 8aa3af2..187e635 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -91,7 +91,7 @@ static const char *dev_console_filename;
HUPCL|CLOCAL|CCTS_OFLOW|CRTS_IFLOW|CDTR_IFLOW|\
CDSR_OFLOW|CCAR_OFLOW)
-#define TTY_CALLOUT(tp,d) ((d) != (tp)->t_dev && (d) != dev_console)
+#define TTY_CALLOUT(tp,d) (dev2unit(d) & TTYUNIT_CALLOUT)
/*
* Set TTY buffer sizes.
@@ -470,10 +470,10 @@ ttydev_write(struct cdev *dev, struct uio *uio, int ioflag)
if (error)
goto done;
}
-
- tp->t_flags |= TF_BUSY_OUT;
+
+ tp->t_flags |= TF_BUSY_OUT;
error = ttydisc_write(tp, uio, ioflag);
- tp->t_flags &= ~TF_BUSY_OUT;
+ tp->t_flags &= ~TF_BUSY_OUT;
cv_signal(&tp->t_outserwait);
}
@@ -772,6 +772,10 @@ ttyil_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
goto done;
}
+ error = ttydevsw_cioctl(tp, dev2unit(dev), cmd, data, td);
+ if (error != ENOIOCTL)
+ goto done;
+
switch (cmd) {
case TIOCGETA:
/* Obtain terminal flags through tcgetattr(). */
@@ -878,6 +882,13 @@ ttydevsw_defioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
}
static int
+ttydevsw_defcioctl(struct tty *tp, int unit, u_long cmd, caddr_t data, struct thread *td)
+{
+
+ return (ENOIOCTL);
+}
+
+static int
ttydevsw_defparam(struct tty *tp, struct termios *t)
{
@@ -955,6 +966,7 @@ tty_alloc_mutex(struct ttydevsw *tsw, void *sc, struct mtx *mutex)
PATCH_FUNC(outwakeup);
PATCH_FUNC(inwakeup);
PATCH_FUNC(ioctl);
+ PATCH_FUNC(cioctl);
PATCH_FUNC(param);
PATCH_FUNC(modem);
PATCH_FUNC(mmap);
@@ -1054,7 +1066,7 @@ tty_rel_pgrp(struct tty *tp, struct pgrp *pg)
if (tp->t_pgrp == pg)
tp->t_pgrp = NULL;
-
+
tty_unlock(tp);
}
@@ -1190,13 +1202,13 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...)
/* Slave call-in devices. */
if (tp->t_flags & TF_INITLOCK) {
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw, TTYUNIT_INIT, cred,
uid, gid, mode, "%s%s.init", prefix, name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
dev->si_drv2 = &tp->t_termios_init_in;
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw, TTYUNIT_LOCK, cred,
uid, gid, mode, "%s%s.lock", prefix, name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
@@ -1205,20 +1217,22 @@ tty_makedev(struct tty *tp, struct ucred *cred, const char *fmt, ...)
/* Call-out devices. */
if (tp->t_flags & TF_CALLOUT) {
- dev = make_dev_cred(&ttydev_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttydev_cdevsw, TTYUNIT_CALLOUT, cred,
UID_UUCP, GID_DIALER, 0660, "cua%s", name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
/* Slave call-out devices. */
if (tp->t_flags & TF_INITLOCK) {
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw,
+ TTYUNIT_CALLOUT | TTYUNIT_INIT, cred,
UID_UUCP, GID_DIALER, 0660, "cua%s.init", name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
dev->si_drv2 = &tp->t_termios_init_out;
- dev = make_dev_cred(&ttyil_cdevsw, 0, cred,
+ dev = make_dev_cred(&ttyil_cdevsw,
+ TTYUNIT_CALLOUT | TTYUNIT_LOCK, cred,
UID_UUCP, GID_DIALER, 0660, "cua%s.lock", name);
dev_depends(tp->t_dev, dev);
dev->si_drv1 = tp;
@@ -1241,7 +1255,7 @@ tty_signal_sessleader(struct tty *tp, int sig)
/* Make signals start output again. */
tp->t_flags &= ~TF_STOPPED;
-
+
if (tp->t_session != NULL && tp->t_session->s_leader != NULL) {
p = tp->t_session->s_leader;
PROC_LOCK(p);
@@ -1305,7 +1319,7 @@ tty_wait(struct tty *tp, struct cv *cv)
/* Restart the system call when we may have been revoked. */
if (tp->t_revokecnt != revokecnt)
return (ERESTART);
-
+
/* Bail out when the device slipped away. */
if (tty_gone(tp))
return (ENXIO);
@@ -1327,7 +1341,7 @@ tty_timedwait(struct tty *tp, struct cv *cv, int hz)
/* Restart the system call when we may have been revoked. */
if (tp->t_revokecnt != revokecnt)
return (ERESTART);
-
+
/* Bail out when the device slipped away. */
if (tty_gone(tp))
return (ENXIO);
@@ -1469,7 +1483,7 @@ tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, int fflag,
return (error);
/* XXX: CLOCAL? */
-
+
tp->t_termios.c_cflag = t->c_cflag & ~CIGNORE;
tp->t_termios.c_ispeed = t->c_ispeed;
tp->t_termios.c_ospeed = t->c_ospeed;
@@ -1708,7 +1722,7 @@ tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, struct thread *td)
if (tty_gone(tp))
return (ENXIO);
-
+
error = ttydevsw_ioctl(tp, cmd, data, td);
if (error == ENOIOCTL)
error = tty_generic_ioctl(tp, cmd, data, fflag, td);
@@ -1786,7 +1800,7 @@ ttyhook_defrint(struct tty *tp, char c, int flags)
if (ttyhook_rint_bypass(tp, &c, 1) != 1)
return (-1);
-
+
return (0);
}
@@ -1812,7 +1826,7 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd,
error = EBADF;
goto done1;
}
-
+
/*
* Make sure the vnode is bound to a character device.
* Unlocked check for the vnode type is ok there, because we
@@ -1910,7 +1924,7 @@ ttyconsdev_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
/* System console has no TTY associated. */
if (dev_console->si_drv1 == NULL)
return (ENXIO);
-
+
return (ttydev_open(dev, oflags, devtype, td));
}
diff --git a/sys/kern/tty_inq.c b/sys/kern/tty_inq.c
index b0e9b18..0c39a29 100644
--- a/sys/kern/tty_inq.c
+++ b/sys/kern/tty_inq.c
@@ -142,7 +142,7 @@ void
ttyinq_free(struct ttyinq *ti)
{
struct ttyinq_block *tib;
-
+
ttyinq_flush(ti);
ti->ti_quota = 0;
@@ -276,7 +276,7 @@ ttyinq_write(struct ttyinq *ti, const void *buf, size_t nbytes, int quote)
struct ttyinq_block *tib;
unsigned int boff;
size_t l;
-
+
while (nbytes > 0) {
boff = ti->ti_end % TTYINQ_DATASIZE;
@@ -313,7 +313,7 @@ ttyinq_write(struct ttyinq *ti, const void *buf, size_t nbytes, int quote)
nbytes -= l;
ti->ti_end += l;
}
-
+
return (cbuf - (const char *)buf);
}
@@ -397,7 +397,7 @@ ttyinq_peekchar(struct ttyinq *ti, char *c, int *quote)
*c = tib->tib_data[boff];
*quote = GETBIT(tib, boff);
-
+
return (0);
}
diff --git a/sys/kern/tty_outq.c b/sys/kern/tty_outq.c
index d5ed221..5d40abe 100644
--- a/sys/kern/tty_outq.c
+++ b/sys/kern/tty_outq.c
@@ -119,7 +119,7 @@ void
ttyoutq_free(struct ttyoutq *to)
{
struct ttyoutq_block *tob;
-
+
ttyoutq_flush(to);
to->to_quota = 0;
diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c
index d89c183..a3db59b 100644
--- a/sys/kern/tty_pts.c
+++ b/sys/kern/tty_pts.c
@@ -295,7 +295,7 @@ ptsdev_ioctl(struct file *fp, u_long cmd, void *data,
return (EINVAL);
return copyout(p, fgn->buf, i);
}
-
+
/*
* We need to implement TIOCGPGRP and TIOCGSID here again. When
* called on the pseudo-terminal master, it should not check if
@@ -563,7 +563,7 @@ ptsdev_stat(struct file *fp, struct stat *sb, struct ucred *active_cred,
sb->st_uid = dev->si_uid;
sb->st_gid = dev->si_gid;
sb->st_mode = dev->si_mode | S_IFCHR;
-
+
return (0);
}
@@ -823,7 +823,7 @@ posix_openpt(struct thread *td, struct posix_openpt_args *uap)
*/
if (uap->flags & ~(O_RDWR|O_NOCTTY))
return (EINVAL);
-
+
error = falloc(td, &fp, &fd, 0);
if (error)
return (error);
diff --git a/sys/kern/tty_ttydisc.c b/sys/kern/tty_ttydisc.c
index 6afac8d..2a0bb4b 100644
--- a/sys/kern/tty_ttydisc.c
+++ b/sys/kern/tty_ttydisc.c
@@ -270,13 +270,13 @@ ttydisc_read_raw_interbyte_timer(struct tty *tp, struct uio *uio, int ioflag)
MPASS(tp->t_termios.c_cc[VMIN] != 0);
MPASS(tp->t_termios.c_cc[VTIME] != 0);
-
+
/*
* When using the interbyte timer, the timer should be started
* after the first byte has been received. We just call into the
* generic read timer code after we've received the first byte.
*/
-
+
for (;;) {
error = ttyinq_read_uio(&tp->t_inq, tp, uio,
uio->uio_resid, 0);
@@ -331,7 +331,7 @@ ttydisc_read(struct tty *tp, struct uio *uio, int ioflag)
/* Unset the input watermark when we've got enough space. */
tty_hiwat_in_unblock(tp);
}
-
+
return (error);
}
@@ -521,7 +521,7 @@ ttydisc_write(struct tty *tp, struct uio *uio, int ioflag)
error = EWOULDBLOCK;
goto done;
}
-
+
/*
* The driver may write back the data
* synchronously. Be sure to check the high
@@ -567,7 +567,7 @@ ttydisc_optimize(struct tty *tp)
} else if (!CMP_FLAG(i, ICRNL|IGNCR|IMAXBEL|INLCR|ISTRIP|IXON) &&
(!CMP_FLAG(i, BRKINT) || CMP_FLAG(i, IGNBRK)) &&
(!CMP_FLAG(i, PARMRK) ||
- CMP_FLAG(i, IGNPAR|IGNBRK) == (IGNPAR|IGNBRK)) &&
+ CMP_FLAG(i, IGNPAR|IGNBRK) == (IGNPAR|IGNBRK)) &&
!CMP_FLAG(l, ECHO|ICANON|IEXTEN|ISIG|PENDIN)) {
tp->t_flags |= TF_BYPASS;
} else {
@@ -583,7 +583,7 @@ ttydisc_modem(struct tty *tp, int open)
if (open)
cv_broadcast(&tp->t_dcdwait);
-
+
/*
* Ignore modem status lines when CLOCAL is turned on, but don't
* enter the zombie state when the TTY isn't opened, because
@@ -834,7 +834,7 @@ ttydisc_rint(struct tty *tp, char c, int flags)
if (ttyhook_hashook(tp, rint))
return ttyhook_rint(tp, c, flags);
-
+
if (tp->t_flags & TF_BYPASS)
goto processed;
@@ -1072,7 +1072,7 @@ ttydisc_rint_bypass(struct tty *tp, const void *buf, size_t len)
size_t ret;
tty_lock_assert(tp, MA_OWNED);
-
+
MPASS(tp->t_flags & TF_BYPASS);
atomic_add_long(&tty_nin, len);
@@ -1122,7 +1122,7 @@ ttydisc_rint_poll(struct tty *tp)
l = ttyinq_bytesleft(&tp->t_inq);
if (l == 0 && (tp->t_flags & TF_HIWAT_IN) == 0)
return (1);
-
+
return (l);
}
@@ -1201,7 +1201,7 @@ ttydisc_getc_uio(struct tty *tp, struct uio *uio)
tty_unlock(tp);
error = uiomove(buf, len, uio);
tty_lock(tp);
-
+
if (error != 0)
break;
}
diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index 00496af..0414f12 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -55,7 +55,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
+
#include <sys/param.h>
+#include <sys/capability.h>
#include <sys/fcntl.h>
#include <sys/file.h>
#include <sys/filedesc.h>
@@ -264,7 +267,7 @@ shm_dotruncate(struct shmfd *shmfd, off_t length)
/* Toss in memory pages. */
if (nobjsize < object->size)
vm_object_page_remove(object, nobjsize, object->size,
- FALSE);
+ 0);
/* Toss pages from swap. */
if (object->type == OBJT_SWAP)
@@ -486,6 +489,14 @@ shm_open(struct thread *td, struct shm_open_args *uap)
mode_t cmode;
int fd, error;
+#ifdef CAPABILITY_MODE
+ /*
+ * shm_open(2) is only allowed for anonymous objects.
+ */
+ if (IN_CAPABILITY_MODE(td) && (uap->path != SHM_ANON))
+ return (ECAPMODE);
+#endif
+
if ((uap->flags & O_ACCMODE) != O_RDONLY &&
(uap->flags & O_ACCMODE) != O_RDWR)
return (EINVAL);
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 3334fc2..990c6ba 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1915,7 +1915,6 @@ release:
/*
* Optimized version of soreceive() for stream (TCP) sockets.
*/
-#ifdef TCP_SORECEIVE_STREAM
int
soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
@@ -1955,20 +1954,9 @@ soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio,
}
oresid = uio->uio_resid;
- /* We will never ever get anything unless we are connected. */
+ /* We will never ever get anything unless we are or were connected. */
if (!(so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED))) {
- /* When disconnecting there may be still some data left. */
- if (sb->sb_cc > 0)
- goto deliver;
- if (!(so->so_state & SS_ISDISCONNECTED))
- error = ENOTCONN;
- goto out;
- }
-
- /* Socket buffer is empty and we shall not block. */
- if (sb->sb_cc == 0 &&
- ((sb->sb_flags & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
- error = EAGAIN;
+ error = ENOTCONN;
goto out;
}
@@ -1995,6 +1983,13 @@ restart:
goto out;
}
+ /* Socket buffer is empty and we shall not block. */
+ if (sb->sb_cc == 0 &&
+ ((so->so_state & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
+ error = EAGAIN;
+ goto out;
+ }
+
/* Socket buffer got some data that we shall deliver now. */
if (sb->sb_cc > 0 && !(flags & MSG_WAITALL) &&
((sb->sb_flags & SS_NBIO) ||
@@ -2109,7 +2104,6 @@ out:
sbunlock(sb);
return (error);
}
-#endif /* TCP_SORECEIVE_STREAM */
/*
* Optimized version of soreceive() for simple datagram cases from userspace.
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 19aaee0..c434973 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -35,6 +35,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_capsicum.h"
#include "opt_inet.h"
#include "opt_inet6.h"
#include "opt_sctp.h"
@@ -43,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/capability.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
@@ -675,6 +677,11 @@ sendit(td, s, mp, flags)
struct sockaddr *to;
int error;
+#ifdef CAPABILITY_MODE
+ if (IN_CAPABILITY_MODE(td) && (mp->msg_name != NULL))
+ return (ECAPMODE);
+#endif
+
if (mp->msg_name != NULL) {
error = getsockaddr(&to, mp->msg_name, mp->msg_namelen);
if (error) {
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 2743089..a6ad81e 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -1625,6 +1625,7 @@ vfs_vmio_release(struct buf *bp)
int i;
vm_page_t m;
+ pmap_qremove(trunc_page((vm_offset_t)bp->b_data), bp->b_npages);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
for (i = 0; i < bp->b_npages; i++) {
m = bp->b_pages[i];
@@ -1658,7 +1659,6 @@ vfs_vmio_release(struct buf *bp)
vm_page_unlock(m);
}
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
- pmap_qremove(trunc_page((vm_offset_t) bp->b_data), bp->b_npages);
if (bp->b_bufsize) {
bufspacewakeup();
@@ -3012,6 +3012,10 @@ allocbuf(struct buf *bp, int size)
if (desiredpages < bp->b_npages) {
vm_page_t m;
+ pmap_qremove((vm_offset_t)trunc_page(
+ (vm_offset_t)bp->b_data) +
+ (desiredpages << PAGE_SHIFT),
+ (bp->b_npages - desiredpages));
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
for (i = desiredpages; i < bp->b_npages; i++) {
/*
@@ -3032,8 +3036,6 @@ allocbuf(struct buf *bp, int size)
vm_page_unlock(m);
}
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
- pmap_qremove((vm_offset_t) trunc_page((vm_offset_t)bp->b_data) +
- (desiredpages << PAGE_SHIFT), (bp->b_npages - desiredpages));
bp->b_npages = desiredpages;
}
} else if (size > bp->b_bcount) {
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 2e07cf1..5edf0f5 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/reboot.h>
+#include <sys/sbuf.h>
#include <sys/syscallsubr.h>
#include <sys/sysproto.h>
#include <sys/sx.h>
diff --git a/sys/kern/vfs_mountroot.c b/sys/kern/vfs_mountroot.c
index 496ea70..ccbcb33 100644
--- a/sys/kern/vfs_mountroot.c
+++ b/sys/kern/vfs_mountroot.c
@@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/reboot.h>
+#include <sys/sbuf.h>
#include <sys/stat.h>
#include <sys/syscallsubr.h>
#include <sys/sysproto.h>
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 741061d..934745b 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1190,8 +1190,8 @@ bufobj_invalbuf(struct bufobj *bo, int flags, int slpflag, int slptimeo)
*/
if (bo->bo_object != NULL && (flags & (V_ALT | V_NORMAL)) == 0) {
VM_OBJECT_LOCK(bo->bo_object);
- vm_object_page_remove(bo->bo_object, 0, 0,
- (flags & V_SAVE) ? TRUE : FALSE);
+ vm_object_page_remove(bo->bo_object, 0, 0, (flags & V_SAVE) ?
+ OBJPR_CLEANONLY : 0);
VM_OBJECT_UNLOCK(bo->bo_object);
}
@@ -3590,9 +3590,6 @@ vn_isdisk(struct vnode *vp, int *errp)
* and optional call-by-reference privused argument allowing vaccess()
* to indicate to the caller whether privilege was used to satisfy the
* request (obsoleted). Returns 0 on success, or an errno on failure.
- *
- * The ifdef'd CAPABILITIES version is here for reference, but is not
- * actually used.
*/
int
vaccess(enum vtype type, mode_t file_mode, uid_t file_uid, gid_t file_gid,
diff --git a/sys/kgssapi/gss_impl.c b/sys/kgssapi/gss_impl.c
index 01d940a..ef6c041 100644
--- a/sys/kgssapi/gss_impl.c
+++ b/sys/kgssapi/gss_impl.c
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
#include <kgssapi/gssapi_impl.h>
#include <rpc/rpc.h>
#include <rpc/rpc_com.h>
+#include <rpc/rpcsec_gss.h>
#include "gssd.h"
#include "kgss_if.h"
@@ -253,8 +254,44 @@ kgss_copy_buffer(const gss_buffer_t from, gss_buffer_t to)
static int
kgssapi_modevent(module_t mod, int type, void *data)
{
-
- return (0);
+ int error = 0;
+
+ switch (type) {
+ case MOD_LOAD:
+ rpc_gss_entries.rpc_gss_secfind = rpc_gss_secfind;
+ rpc_gss_entries.rpc_gss_secpurge = rpc_gss_secpurge;
+ rpc_gss_entries.rpc_gss_seccreate = rpc_gss_seccreate;
+ rpc_gss_entries.rpc_gss_set_defaults = rpc_gss_set_defaults;
+ rpc_gss_entries.rpc_gss_max_data_length =
+ rpc_gss_max_data_length;
+ rpc_gss_entries.rpc_gss_get_error = rpc_gss_get_error;
+ rpc_gss_entries.rpc_gss_mech_to_oid = rpc_gss_mech_to_oid;
+ rpc_gss_entries.rpc_gss_oid_to_mech = rpc_gss_oid_to_mech;
+ rpc_gss_entries.rpc_gss_qop_to_num = rpc_gss_qop_to_num;
+ rpc_gss_entries.rpc_gss_get_mechanisms = rpc_gss_get_mechanisms;
+ rpc_gss_entries.rpc_gss_get_versions = rpc_gss_get_versions;
+ rpc_gss_entries.rpc_gss_is_installed = rpc_gss_is_installed;
+ rpc_gss_entries.rpc_gss_set_svc_name = rpc_gss_set_svc_name;
+ rpc_gss_entries.rpc_gss_clear_svc_name = rpc_gss_clear_svc_name;
+ rpc_gss_entries.rpc_gss_getcred = rpc_gss_getcred;
+ rpc_gss_entries.rpc_gss_set_callback = rpc_gss_set_callback;
+ rpc_gss_entries.rpc_gss_clear_callback = rpc_gss_clear_callback;
+ rpc_gss_entries.rpc_gss_get_principal_name =
+ rpc_gss_get_principal_name;
+ rpc_gss_entries.rpc_gss_svc_max_data_length =
+ rpc_gss_svc_max_data_length;
+ break;
+ case MOD_UNLOAD:
+ /*
+ * Unloading of the kgssapi module is not currently supported.
+ * If somebody wants this, we would need to keep track of
+ * currently executing threads and make sure the count is 0.
+ */
+ /* FALLTHROUGH */
+ default:
+ error = EOPNOTSUPP;
+ };
+ return (error);
}
static moduledata_t kgssapi_mod = {
"kgssapi",
diff --git a/sys/mips/atheros/ar71xx_chip.c b/sys/mips/atheros/ar71xx_chip.c
index 4a489a1..7f9792f 100644
--- a/sys/mips/atheros/ar71xx_chip.c
+++ b/sys/mips/atheros/ar71xx_chip.c
@@ -27,11 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <machine/cpuregs.h>
-
-#include <mips/sentry5/s5reg.h>
-
#include "opt_ddb.h"
#include <sys/param.h>
@@ -50,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <machine/clock.h>
#include <machine/cpu.h>
+#include <machine/cpuregs.h>
#include <machine/hwfunc.h>
#include <machine/md_var.h>
#include <machine/trap.h>
@@ -61,6 +57,8 @@ __FBSDID("$FreeBSD$");
#include <mips/atheros/ar71xx_cpudef.h>
+#include <mips/sentry5/s5reg.h>
+
/* XXX these should replace the current definitions in ar71xxreg.h */
/* XXX perhaps an ar71xx_chip.h header file? */
#define AR71XX_PLL_REG_CPU_CONFIG AR71XX_PLL_CPU_BASE + 0x00
diff --git a/sys/mips/atheros/ar71xx_machdep.c b/sys/mips/atheros/ar71xx_machdep.c
index 60e28a4..1789994 100644
--- a/sys/mips/atheros/ar71xx_machdep.c
+++ b/sys/mips/atheros/ar71xx_machdep.c
@@ -27,11 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <machine/cpuregs.h>
-
-#include <mips/sentry5/s5reg.h>
-
#include "opt_ddb.h"
#include <sys/param.h>
@@ -50,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <machine/clock.h>
#include <machine/cpu.h>
+#include <machine/cpuregs.h>
#include <machine/hwfunc.h>
#include <machine/md_var.h>
#include <machine/trap.h>
@@ -60,6 +56,8 @@ __FBSDID("$FreeBSD$");
#include <mips/atheros/ar71xx_setup.h>
#include <mips/atheros/ar71xx_cpudef.h>
+#include <mips/sentry5/s5reg.h>
+
extern char edata[], end[];
uint32_t ar711_base_mac[ETHER_ADDR_LEN];
diff --git a/sys/mips/atheros/ar71xx_ohci.c b/sys/mips/atheros/ar71xx_ohci.c
index acccd85..bee353e 100644
--- a/sys/mips/atheros/ar71xx_ohci.c
+++ b/sys/mips/atheros/ar71xx_ohci.c
@@ -49,8 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/usb/controller/ohci.h>
#include <dev/usb/controller/ohcireg.h>
-#include <sys/rman.h>
-
static int ar71xx_ohci_attach(device_t dev);
static int ar71xx_ohci_detach(device_t dev);
static int ar71xx_ohci_probe(device_t dev);
diff --git a/sys/mips/atheros/ar71xx_setup.c b/sys/mips/atheros/ar71xx_setup.c
index 0720d52..ce600e4 100644
--- a/sys/mips/atheros/ar71xx_setup.c
+++ b/sys/mips/atheros/ar71xx_setup.c
@@ -27,11 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <machine/cpuregs.h>
-
-#include <mips/sentry5/s5reg.h>
-
#include "opt_ddb.h"
#include <sys/param.h>
@@ -50,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <machine/clock.h>
#include <machine/cpu.h>
+#include <machine/cpuregs.h>
#include <machine/hwfunc.h>
#include <machine/md_var.h>
#include <machine/trap.h>
@@ -64,6 +60,8 @@ __FBSDID("$FreeBSD$");
#include <mips/atheros/ar724x_chip.h>
#include <mips/atheros/ar91xx_chip.h>
+#include <mips/sentry5/s5reg.h>
+
#define AR71XX_SYS_TYPE_LEN 128
static char ar71xx_sys_type[AR71XX_SYS_TYPE_LEN];
diff --git a/sys/mips/atheros/ar724x_chip.c b/sys/mips/atheros/ar724x_chip.c
index 75c5b38..edd1a9ad 100644
--- a/sys/mips/atheros/ar724x_chip.c
+++ b/sys/mips/atheros/ar724x_chip.c
@@ -27,11 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <machine/cpuregs.h>
-
-#include <mips/sentry5/s5reg.h>
-
#include "opt_ddb.h"
#include <sys/param.h>
@@ -50,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <machine/clock.h>
#include <machine/cpu.h>
+#include <machine/cpuregs.h>
#include <machine/hwfunc.h>
#include <machine/md_var.h>
#include <machine/trap.h>
@@ -62,6 +58,8 @@ __FBSDID("$FreeBSD$");
#include <mips/atheros/ar71xx_setup.h>
#include <mips/atheros/ar724x_chip.h>
+#include <mips/sentry5/s5reg.h>
+
static void
ar724x_chip_detect_mem_size(void)
{
diff --git a/sys/mips/atheros/ar91xx_chip.c b/sys/mips/atheros/ar91xx_chip.c
index 9cf60bc..6761e89 100644
--- a/sys/mips/atheros/ar91xx_chip.c
+++ b/sys/mips/atheros/ar91xx_chip.c
@@ -27,11 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <machine/cpuregs.h>
-
-#include <mips/sentry5/s5reg.h>
-
#include "opt_ddb.h"
#include <sys/param.h>
@@ -50,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <machine/clock.h>
#include <machine/cpu.h>
+#include <machine/cpuregs.h>
#include <machine/hwfunc.h>
#include <machine/md_var.h>
#include <machine/trap.h>
@@ -61,6 +57,8 @@ __FBSDID("$FreeBSD$");
#include <mips/atheros/ar71xx_cpudef.h>
#include <mips/atheros/ar91xx_chip.h>
+#include <mips/sentry5/s5reg.h>
+
static void
ar91xx_chip_detect_mem_size(void)
{
diff --git a/sys/mips/conf/RT305X b/sys/mips/conf/RT305X
index 00506e3..1e1ed38 100644
--- a/sys/mips/conf/RT305X
+++ b/sys/mips/conf/RT305X
@@ -92,9 +92,9 @@ options IPFIREWALL_DEFAULT_TO_ACCEPT
device random
device loop
-# RT3050F, RT3052F have only pseudo PHYs
-#device mii
-#device miibus
+# RT3050F, RT3052F have only pseudo PHYs, so mii not required
+device rt
+
device pty # Pseudo-ttys (telnet etc)
device ether
device bpf # Berkeley packet filter
diff --git a/sys/mips/conf/RT305X.hints b/sys/mips/conf/RT305X.hints
index 3c8b6cb..b405202 100644
--- a/sys/mips/conf/RT305X.hints
+++ b/sys/mips/conf/RT305X.hints
@@ -14,11 +14,12 @@ hint.nvram.1.maxsize=0x4000
hint.nvram.1.flags=3 # 1 = No check, 2 = Format Generic
# on-board Ralink Frame Engine
-#hint.rt.0.at="nexus0"
-#hint.rt.0.maddr=0x12000000
-#hint.rt.0.msize=0x200000
-#hint.rt.0.irq=9
-hint.rt.0.macaddr="00:18:e7:d5:83:90"
+hint.rt.0.at="nexus0"
+hint.rt.0.maddr=0x10100000
+hint.rt.0.msize=0x10000
+hint.rt.0.irq=3
+# macaddr can be statically set
+#hint.rt.0.macaddr="xx:xx:xx:xx:xx:xx"
# on-board Ralink 2872 802.11n core
hint.rt2860.0.at="nexus0"
diff --git a/sys/mips/conf/XLP b/sys/mips/conf/XLP
new file mode 100644
index 0000000..6843534
--- /dev/null
+++ b/sys/mips/conf/XLP
@@ -0,0 +1,93 @@
+# XLP -- Generic kernel configuration file for FreeBSD/mips
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+machine mips mipseb
+ident XLP
+
+options ISA_MIPS32
+makeoptions KERNLOADADDR=0x80100000
+
+include "../nlm/std.xlp"
+makeoptions MODULES_OVERRIDE=""
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+#profile 2
+makeoptions TRAMPLOADADDR=0xffffffff85000000
+makeoptions TRAMP_ARCH_FLAGS="-mabi=64 -march=mips64"
+
+options SCHED_ULE # ULE scheduler
+#options VERBOSE_SYSINIT
+#options SCHED_4BSD # 4BSD scheduler
+options SMP
+options PREEMPTION # Enable kernel thread preemption
+#options FULL_PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options FFS # Berkeley Fast Filesystem
+#options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options NFSCL
+options NFS_ROOT
+options MSDOSFS #MSDOS Filesystem
+#
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=nlge0
+#options BOOTP_COMPAT
+#options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\"
+#
+options MD_ROOT # MD is a potential root device
+options MD_ROOT_SIZE=27000
+options ROOTDEVNAME=\"ufs:md0\"
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options HZ=1000
+options NO_SWAPPING
+
+#Debugging options
+options KTRACE # ktrace(1) support
+options DDB
+options KDB
+options GDB
+options BREAK_TO_DEBUGGER
+options ALT_BREAK_TO_DEBUGGER
+#options DEADLKRES #Enable the deadlock resolver
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS #Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed
+#options KTR # ktr(4) and ktrdump(8) support
+#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC)
+#options KTR_ENTRIES=131072
+#options LOCK_DEBUG
+#options LOCK_PROFILING
+
+
+# Pseudo
+device loop
+device random
+device md
+device pty
+device bpf
+
+# UART
+device uart
+
+# Network
+device ether
diff --git a/sys/mips/conf/XLP64 b/sys/mips/conf/XLP64
new file mode 100644
index 0000000..997a1f6
--- /dev/null
+++ b/sys/mips/conf/XLP64
@@ -0,0 +1,95 @@
+# XLP64 -- Generic kernel configuration file for FreeBSD/mips
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+machine mips mips64eb
+ident XLP64
+
+options ISA_MIPS64
+makeoptions ARCH_FLAGS="-march=mips64 -mabi=64"
+makeoptions KERNLOADADDR=0xffffffff80100000
+
+include "../nlm/std.xlp"
+
+makeoptions MODULES_OVERRIDE=""
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+#profile 2
+makeoptions TRAMPLOADADDR=0xffffffff85000000
+makeoptions TRAMP_ARCH_FLAGS="-mabi=64 -march=mips64"
+
+options SCHED_ULE # ULE scheduler
+#options VERBOSE_SYSINIT
+#options SCHED_4BSD # 4BSD scheduler
+options SMP
+options PREEMPTION # Enable kernel thread preemption
+#options FULL_PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options FFS # Berkeley Fast Filesystem
+#options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options NFSCL
+options NFS_ROOT
+options MSDOSFS #MSDOS Filesystem
+#
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=nlge0
+#options BOOTP_COMPAT
+#options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\"
+#
+options MD_ROOT # MD is a potential root device
+options MD_ROOT_SIZE=27000
+options ROOTDEVNAME=\"ufs:md0\"
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options HZ=1000
+options NO_SWAPPING
+
+#Debugging options
+options KTRACE # ktrace(1) support
+options DDB
+options KDB
+options GDB
+options BREAK_TO_DEBUGGER
+options ALT_BREAK_TO_DEBUGGER
+#options DEADLKRES #Enable the deadlock resolver
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS #Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed
+#options KTR # ktr(4) and ktrdump(8) support
+#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC)
+#options KTR_ENTRIES=131072
+#options LOCK_DEBUG
+#options LOCK_PROFILING
+
+
+# Pseudo
+device loop
+device random
+device md
+device pty
+device bpf
+
+# UART
+device uart
+
+# Network
+device ether
diff --git a/sys/mips/conf/XLPN32 b/sys/mips/conf/XLPN32
new file mode 100644
index 0000000..97c73a8
--- /dev/null
+++ b/sys/mips/conf/XLPN32
@@ -0,0 +1,94 @@
+# XLPN32 -- Generic kernel configuration file for FreeBSD/mips
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+machine mips mipsn32eb
+ident XLPN32
+
+options ISA_MIPS64
+makeoptions ARCH_FLAGS="-march=mips64 -mabi=n32"
+makeoptions KERNLOADADDR=0x80100000
+
+include "../nlm/std.xlp"
+makeoptions MODULES_OVERRIDE=""
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+#profile 2
+makeoptions TRAMPLOADADDR=0xffffffff85000000
+makeoptions TRAMP_ARCH_FLAGS="-mabi=64 -march=mips64"
+
+options SCHED_ULE # ULE scheduler
+#options VERBOSE_SYSINIT
+#options SCHED_4BSD # 4BSD scheduler
+options SMP
+options PREEMPTION # Enable kernel thread preemption
+#options FULL_PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options FFS # Berkeley Fast Filesystem
+#options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options NFSCL
+options NFS_ROOT
+options MSDOSFS #MSDOS Filesystem
+#
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=nlge0
+#options BOOTP_COMPAT
+#options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\"
+#
+options MD_ROOT # MD is a potential root device
+options MD_ROOT_SIZE=27000
+options ROOTDEVNAME=\"ufs:md0\"
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options HZ=1000
+options NO_SWAPPING
+
+#Debugging options
+options KTRACE # ktrace(1) support
+#options DDB
+#options KDB
+#options GDB
+#options BREAK_TO_DEBUGGER
+#options ALT_BREAK_TO_DEBUGGER
+#options DEADLKRES #Enable the deadlock resolver
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS #Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed
+#options KTR # ktr(4) and ktrdump(8) support
+#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC)
+#options KTR_ENTRIES=131072
+#options LOCK_DEBUG
+#options LOCK_PROFILING
+
+
+# Pseudo
+device loop
+device random
+device md
+device pty
+device bpf
+
+# UART
+device uart
+
+# Network
+device ether
diff --git a/sys/mips/include/bus.h b/sys/mips/include/bus.h
index af83d36..1745b0f 100644
--- a/sys/mips/include/bus.h
+++ b/sys/mips/include/bus.h
@@ -721,7 +721,7 @@ void __bs_c(f,_bs_c_8) (void *t, bus_space_handle_t bsh1, \
DECLARE_BUS_SPACE_PROTOTYPES(generic);
extern bus_space_tag_t mips_bus_space_generic;
/* Special bus space for RMI processors */
-#ifdef CPU_RMI
+#if defined(CPU_RMI) || defined (CPU_NLM)
extern bus_space_tag_t rmi_bus_space;
extern bus_space_tag_t rmi_pci_bus_space;
#endif
diff --git a/sys/mips/include/cpufunc.h b/sys/mips/include/cpufunc.h
index f680970..f5c24b4 100644
--- a/sys/mips/include/cpufunc.h
+++ b/sys/mips/include/cpufunc.h
@@ -254,6 +254,10 @@ MIPS_RW32_COP0_SEL(config3, MIPS_COP_0_CONFIG, 3);
#ifdef CPU_CNMIPS
MIPS_RW32_COP0_SEL(config4, MIPS_COP_0_CONFIG, 4);
#endif
+#ifdef CPU_NLM
+MIPS_RW32_COP0_SEL(config6, MIPS_COP_0_CONFIG, 6);
+MIPS_RW32_COP0_SEL(config7, MIPS_COP_0_CONFIG, 7);
+#endif
MIPS_RW32_COP0(count, MIPS_COP_0_COUNT);
MIPS_RW32_COP0(index, MIPS_COP_0_TLB_INDEX);
MIPS_RW32_COP0(wired, MIPS_COP_0_TLB_WIRED);
diff --git a/sys/mips/include/intr_machdep.h b/sys/mips/include/intr_machdep.h
index 3d66e63..f224517 100644
--- a/sys/mips/include/intr_machdep.h
+++ b/sys/mips/include/intr_machdep.h
@@ -29,7 +29,7 @@
#ifndef _MACHINE_INTR_MACHDEP_H_
#define _MACHINE_INTR_MACHDEP_H_
-#ifdef CPU_RMI
+#if defined(CPU_RMI) || defined(CPU_NLM)
#define XLR_MAX_INTR 64
#else
#define NHARD_IRQS 6
diff --git a/sys/mips/malta/gt_pci.c b/sys/mips/malta/gt_pci.c
index 237e742..aa28639 100644
--- a/sys/mips/malta/gt_pci.c
+++ b/sys/mips/malta/gt_pci.c
@@ -326,15 +326,15 @@ gt_pci_attach(device_t dev)
ICW4_8086);
/* mask all interrupts */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
sc->sc_imask & 0xff);
/* enable special mask mode */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
OCW3_SEL | OCW3_ESMM | OCW3_SMM);
/* read IRR by default */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
OCW3_SEL | OCW3_RR);
/* reset, program device, 4 bytes */
@@ -348,15 +348,15 @@ gt_pci_attach(device_t dev)
ICW4_8086);
/* mask all interrupts */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
sc->sc_imask & 0xff);
/* enable special mask mode */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
OCW3_SEL | OCW3_ESMM | OCW3_SMM);
/* read IRR by default */
- bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
+ bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
OCW3_SEL | OCW3_RR);
/*
diff --git a/sys/mips/mips/cache.c b/sys/mips/mips/cache.c
index e54a3e1..4e7f35f 100644
--- a/sys/mips/mips/cache.c
+++ b/sys/mips/mips/cache.c
@@ -80,6 +80,13 @@ __FBSDID("$FreeBSD$");
struct mips_cache_ops mips_cache_ops;
+#if defined(MIPS_DISABLE_L1_CACHE) || defined(CPU_RMI) || defined(CPU_NLM)
+static void
+cache_noop(vm_offset_t va, vm_size_t size)
+{
+}
+#endif
+
void
mips_config_cache(struct mips_cpuinfo * cpuinfo)
{
@@ -94,8 +101,13 @@ mips_config_cache(struct mips_cpuinfo * cpuinfo)
break;
case 32:
mips_cache_ops.mco_icache_sync_all = mipsNN_icache_sync_all_32;
+#ifdef CPU_NLM
+ mips_cache_ops.mco_icache_sync_range =
+ mipsNN_icache_sync_range_index_32;
+#else
mips_cache_ops.mco_icache_sync_range =
mipsNN_icache_sync_range_32;
+#endif
mips_cache_ops.mco_icache_sync_range_index =
mipsNN_icache_sync_range_index_32;
break;
@@ -143,16 +155,26 @@ mips_config_cache(struct mips_cpuinfo * cpuinfo)
mips_cache_ops.mco_pdcache_wbinv_all =
mips_cache_ops.mco_intern_pdcache_wbinv_all =
mipsNN_pdcache_wbinv_all_32;
+#ifdef CPU_NLM
+ mips_cache_ops.mco_pdcache_wbinv_range =
+ mipsNN_pdcache_wbinv_range_index_32;
+#else
mips_cache_ops.mco_pdcache_wbinv_range =
mipsNN_pdcache_wbinv_range_32;
+#endif
mips_cache_ops.mco_pdcache_wbinv_range_index =
mips_cache_ops.mco_intern_pdcache_wbinv_range_index =
mipsNN_pdcache_wbinv_range_index_32;
mips_cache_ops.mco_pdcache_inv_range =
mipsNN_pdcache_inv_range_32;
+#if defined(CPU_RMI) || defined(CPU_NLM)
+ mips_cache_ops.mco_pdcache_wb_range =
+ mips_cache_ops.mco_intern_pdcache_wb_range = cache_noop;
+#else
mips_cache_ops.mco_pdcache_wb_range =
mips_cache_ops.mco_intern_pdcache_wb_range =
mipsNN_pdcache_wb_range_32;
+#endif
break;
#ifdef CPU_CNMIPS
case 128:
diff --git a/sys/mips/mips/cache_mipsNN.c b/sys/mips/mips/cache_mipsNN.c
index 57ea719..98014b1 100644
--- a/sys/mips/mips/cache_mipsNN.c
+++ b/sys/mips/mips/cache_mipsNN.c
@@ -54,15 +54,36 @@ __FBSDID("$FreeBSD$");
#define round_line32(x) (((x) + 31) & ~31)
#define trunc_line32(x) ((x) & ~31)
+#if defined(CPU_NLM)
+static __inline void
+xlp_sync(void)
+{
+ __asm __volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "dla $8, 1f \n"
+ "/* jr.hb $8 */ \n"
+ ".word 0x1000408 \n"
+ "nop \n"
+ "1: nop \n"
+ ".set pop \n"
+ : : : "$8");
+}
+#endif
-#ifdef SB1250_PASS1
+#if defined(SB1250_PASS1)
#define SYNC __asm volatile("sync; sync")
+#elif defined(CPU_NLM)
+#define SYNC xlp_sync()
#else
#define SYNC __asm volatile("sync")
#endif
-#ifdef CPU_CNMIPS
+#if defined(CPU_CNMIPS)
#define SYNCI mips_sync_icache();
+#elif defined(CPU_NLM)
+#define SYNCI xlp_sync()
#else
#define SYNCI
#endif
diff --git a/sys/mips/mips/cpu.c b/sys/mips/mips/cpu.c
index cfb5ddb..e87b7a0 100644
--- a/sys/mips/mips/cpu.c
+++ b/sys/mips/mips/cpu.c
@@ -101,8 +101,14 @@ mips_get_identity(struct mips_cpuinfo *cpuinfo)
/* Learn TLB size and L1 cache geometry. */
cfg1 = mips_rd_config1();
+#ifndef CPU_NLM
cpuinfo->tlb_nentries =
((cfg1 & MIPS_CONFIG1_TLBSZ_MASK) >> MIPS_CONFIG1_TLBSZ_SHIFT) + 1;
+#else
+ /* Account for Extended TLB entries in XLP */
+ tmp = mips_rd_config6();
+ cpuinfo->tlb_nentries = ((tmp >> 16) & 0xffff) + 1;
+#endif
/* Add extended TLB size information from config4. */
#if defined(CPU_CNMIPS)
diff --git a/sys/mips/mips/elf_trampoline.c b/sys/mips/mips/elf_trampoline.c
index 70aedeb..7d8324a 100644
--- a/sys/mips/mips/elf_trampoline.c
+++ b/sys/mips/mips/elf_trampoline.c
@@ -27,7 +27,7 @@ __FBSDID("$FreeBSD$");
#include <machine/asm.h>
#include <sys/param.h>
-#ifdef __mips_n64
+#if ELFSIZE == 64
#include <sys/elf64.h>
#else
#include <sys/elf32.h>
@@ -90,13 +90,19 @@ bzero(void *addr, size_t count)
}
/*
+ * Convert number to pointer, truncate on 64->32 case, sign extend
+ * in 32->64 case
+ */
+#define mkptr(x) ((void *)(intptr_t)(int)(x))
+
+/*
* Relocate PT_LOAD segements of kernel ELF image to their respective
* virtual addresses and return entry point
*/
void *
load_kernel(void * kstart)
{
-#ifdef __mips_n64
+#if ELFSIZE == 64
Elf64_Ehdr *eh;
Elf64_Phdr phdr[64] /* XXX */;
Elf64_Shdr shdr[64] /* XXX */;
@@ -107,17 +113,19 @@ load_kernel(void * kstart)
#endif
int i, j;
void *entry_point;
- vm_offset_t lastaddr = 0;
+ vm_offset_t loadend = 0;
+ intptr_t lastaddr;
int symtabindex = -1;
int symstrindex = -1;
+ Elf_Size tmp;
-#ifdef __mips_n64
+#if ELFSIZE == 64
eh = (Elf64_Ehdr *)kstart;
#else
eh = (Elf32_Ehdr *)kstart;
#endif
- entry_point = (void*)eh->e_entry;
- memcpy(phdr, (void *)(kstart + eh->e_phoff ),
+ entry_point = mkptr(eh->e_entry);
+ memcpy(phdr, (void *)(kstart + eh->e_phoff),
eh->e_phnum * sizeof(phdr[0]));
memcpy(shdr, (void *)(kstart + eh->e_shoff),
@@ -147,27 +155,31 @@ load_kernel(void * kstart)
if (phdr[i].p_type != PT_LOAD)
continue;
- memcpy((void *)(phdr[i].p_vaddr),
+ memcpy(mkptr(phdr[i].p_vaddr),
(void*)(kstart + phdr[i].p_offset), phdr[i].p_filesz);
/* Clean space from oversized segments, eg: bss. */
if (phdr[i].p_filesz < phdr[i].p_memsz)
- bzero((void *)(phdr[i].p_vaddr + phdr[i].p_filesz),
+ bzero(mkptr(phdr[i].p_vaddr + phdr[i].p_filesz),
phdr[i].p_memsz - phdr[i].p_filesz);
- if (lastaddr < phdr[i].p_vaddr + phdr[i].p_memsz)
- lastaddr = phdr[i].p_vaddr + phdr[i].p_memsz;
+ if (loadend < phdr[i].p_vaddr + phdr[i].p_memsz)
+ loadend = phdr[i].p_vaddr + phdr[i].p_memsz;
}
/* Now grab the symbol tables. */
+ lastaddr = (intptr_t)(int)loadend;
if (symtabindex >= 0 && symstrindex >= 0) {
- *(Elf_Size *)lastaddr = SYMTAB_MAGIC;
+ tmp = SYMTAB_MAGIC;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(Elf_Size);
- *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size +
+ tmp = shdr[symtabindex].sh_size +
shdr[symstrindex].sh_size + 2*sizeof(Elf_Size);
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(Elf_Size);
/* .symtab size */
- *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size;
+ tmp = shdr[symtabindex].sh_size;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(shdr[symtabindex].sh_size);
/* .symtab data */
memcpy((void*)lastaddr,
@@ -176,16 +188,19 @@ load_kernel(void * kstart)
lastaddr += shdr[symtabindex].sh_size;
/* .strtab size */
- *(Elf_Size *)lastaddr = shdr[symstrindex].sh_size;
+ tmp = shdr[symstrindex].sh_size;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
lastaddr += sizeof(shdr[symstrindex].sh_size);
/* .strtab data */
memcpy((void*)lastaddr,
shdr[symstrindex].sh_offset + kstart,
shdr[symstrindex].sh_size);
- } else
+ } else {
/* Do not take any chances */
- *(Elf_Size *)lastaddr = 0;
+ tmp = 0;
+ memcpy((void *)lastaddr, &tmp, sizeof(tmp));
+ }
return entry_point;
}
diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S
index da32a77..7b64462 100644
--- a/sys/mips/mips/exception.S
+++ b/sys/mips/mips/exception.S
@@ -228,7 +228,7 @@ SlowFault:
and a0, a0, a2 ; \
mtc0 a0, MIPS_COP_0_STATUS ; \
ITLBNOPFIX
-#elif defined(CPU_RMI)
+#elif defined(CPU_RMI) || defined(CPU_NLM)
#define CLEAR_STATUS \
mfc0 a0, MIPS_COP_0_STATUS ;\
li a2, (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_COP_2_BIT) ; \
@@ -470,7 +470,7 @@ NNON_LEAF(MipsUserGenException, CALLFRAME_SIZ, ra)
and t0, a0, ~(MIPS_SR_COP_1_BIT | MIPS_SR_EXL | MIPS3_SR_KSU_MASK | MIPS_SR_INT_IE)
#if defined(CPU_CNMIPS)
or t0, t0, (MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX | MIPS_SR_PX)
-#elif defined(CPU_RMI)
+#elif defined(CPU_RMI) || defined(CPU_NLM)
or t0, t0, (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_COP_2_BIT)
#endif
mtc0 t0, MIPS_COP_0_STATUS
@@ -688,7 +688,7 @@ NNON_LEAF(MipsUserIntr, CALLFRAME_SIZ, ra)
and t0, a0, ~(MIPS_SR_COP_1_BIT | MIPS_SR_EXL | MIPS_SR_INT_IE | MIPS3_SR_KSU_MASK)
#ifdef CPU_CNMIPS
or t0, t0, (MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX | MIPS_SR_PX)
-#elif defined(CPU_RMI)
+#elif defined(CPU_RMI) || defined(CPU_NLM)
or t0, t0, (MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_COP_2_BIT)
#endif
mtc0 t0, MIPS_COP_0_STATUS
diff --git a/sys/mips/mips/genassym.c b/sys/mips/mips/genassym.c
index fd168bc..2cb046d 100644
--- a/sys/mips/mips/genassym.c
+++ b/sys/mips/mips/genassym.c
@@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
-#include <sys/proc.h>
#include <machine/cpuregs.h>
#include <machine/pcb.h>
#include <machine/sigframe.h>
diff --git a/sys/mips/mips/locore.S b/sys/mips/mips/locore.S
index 9f685eb..4b28f19 100644
--- a/sys/mips/mips/locore.S
+++ b/sys/mips/mips/locore.S
@@ -99,7 +99,7 @@ VECTOR(_locore, unknown)
/* Reset these bits */
li t0, ~(MIPS_SR_DE | MIPS_SR_SOFT_RESET | MIPS_SR_ERL | MIPS_SR_EXL | MIPS_SR_INT_IE)
-#elif defined (CPU_RMI)
+#elif defined (CPU_RMI) || defined (CPU_NLM)
/* Set these bits */
li t1, (MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT | MIPS_SR_KX | MIPS_SR_UX)
diff --git a/sys/mips/mips/machdep.c b/sys/mips/mips/machdep.c
index 4c80ea0..f7e5248 100644
--- a/sys/mips/mips/machdep.c
+++ b/sys/mips/mips/machdep.c
@@ -338,7 +338,7 @@ mips_vector_init(void)
bcopy(MipsTLBMiss, (void *)MIPS_UTLB_MISS_EXC_VEC,
MipsTLBMissEnd - MipsTLBMiss);
-#if defined(CPU_CNMIPS) || defined(CPU_RMI)
+#if defined(CPU_CNMIPS) || defined(CPU_RMI) || defined(CPU_NLM)
/* Fake, but sufficient, for the 32-bit with 64-bit hardware addresses */
bcopy(MipsTLBMiss, (void *)MIPS3_XTLB_MISS_EXC_VEC,
MipsTLBMissEnd - MipsTLBMiss);
diff --git a/sys/mips/mips/mp_machdep.c b/sys/mips/mips/mp_machdep.c
index 79a3476..2298124 100644
--- a/sys/mips/mips/mp_machdep.c
+++ b/sys/mips/mips/mp_machdep.c
@@ -75,8 +75,11 @@ ipi_send(struct pcpu *pc, int ipi)
void
ipi_all_but_self(int ipi)
{
+ cpuset_t other_cpus;
- ipi_selected(PCPU_GET(other_cpus), ipi);
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ ipi_selected(other_cpus, ipi);
}
/* Send an IPI to a set of cpus. */
@@ -86,7 +89,7 @@ ipi_selected(cpuset_t cpus, int ipi)
struct pcpu *pc;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- if (CPU_OVERLAP(&cpus, &pc->pc_cpumask)) {
+ if (CPU_ISSET(pc->pc_cpuid, &cpus)) {
CTR3(KTR_SMP, "%s: pc: %p, ipi: %x\n", __func__, pc,
ipi);
ipi_send(pc, ipi);
@@ -109,13 +112,10 @@ ipi_cpu(int cpu, u_int ipi)
static int
mips_ipi_handler(void *arg)
{
- int cpu;
- cpuset_t cpumask;
- u_int ipi, ipi_bitmap;
+ u_int cpu, ipi, ipi_bitmap;
int bit;
cpu = PCPU_GET(cpuid);
- cpumask = PCPU_GET(cpumask);
platform_ipi_clear(); /* quiesce the pending ipi interrupt */
@@ -150,14 +150,14 @@ mips_ipi_handler(void *arg)
tlb_save();
/* Indicate we are stopped */
- CPU_OR_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
/* Wait for restart */
- while (!CPU_OVERLAP(&started_cpus, &cpumask))
+ while (!CPU_ISSET(cpu, &started_cpus))
cpu_spinwait();
- CPU_NAND_ATOMIC(&started_cpus, &cpumask);
- CPU_NAND_ATOMIC(&stopped_cpus, &cpumask);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
CTR0(KTR_SMP, "IPI_STOP (restart)");
break;
case IPI_PREEMPT:
@@ -243,7 +243,7 @@ void
cpu_mp_start(void)
{
int error, cpuid;
- cpuset_t cpumask, ocpus;
+ cpuset_t cpumask;
mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN);
@@ -269,16 +269,11 @@ cpu_mp_start(void)
}
CPU_SET(cpuid, &all_cpus);
}
-
- ocpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &ocpus);
- PCPU_SET(other_cpus, ocpus);
}
void
smp_init_secondary(u_int32_t cpuid)
{
- cpuset_t ocpus;
/* TLB */
mips_wr_wired(0);
@@ -316,11 +311,6 @@ smp_init_secondary(u_int32_t cpuid)
CTR1(KTR_SMP, "SMP: AP CPU #%d launched", PCPU_GET(cpuid));
- /* Build our map of 'other' CPUs. */
- ocpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &ocpus);
- PCPU_SET(other_cpus, ocpus);
-
if (bootverbose)
printf("SMP: AP CPU #%d launched.\n", PCPU_GET(cpuid));
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c
index f7ea660..4d46099 100644
--- a/sys/mips/mips/pmap.c
+++ b/sys/mips/mips/pmap.c
@@ -625,19 +625,18 @@ pmap_init(void)
static __inline void
pmap_invalidate_all_local(pmap_t pmap)
{
+ u_int cpuid;
+
+ cpuid = PCPU_GET(cpuid);
if (pmap == kernel_pmap) {
tlb_invalidate_all();
return;
}
- sched_pin();
- if (CPU_OVERLAP(&pmap->pm_active, PCPU_PTR(cpumask))) {
- sched_unpin();
+ if (CPU_ISSET(cpuid, &pmap->pm_active))
tlb_invalidate_all_user(pmap);
- } else {
- sched_unpin();
- pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
- }
+ else
+ pmap->pm_asid[cpuid].gen = 0;
}
#ifdef SMP
@@ -666,21 +665,20 @@ pmap_invalidate_all(pmap_t pmap)
static __inline void
pmap_invalidate_page_local(pmap_t pmap, vm_offset_t va)
{
+ u_int cpuid;
+
+ cpuid = PCPU_GET(cpuid);
if (is_kernel_pmap(pmap)) {
tlb_invalidate_address(pmap, va);
return;
}
- sched_pin();
- if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) {
- sched_unpin();
+ if (pmap->pm_asid[cpuid].gen != PCPU_GET(asid_generation))
return;
- } else if (!CPU_OVERLAP(&pmap->pm_active, PCPU_PTR(cpumask))) {
- pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
- sched_unpin();
+ else if (!CPU_ISSET(cpuid, &pmap->pm_active)) {
+ pmap->pm_asid[cpuid].gen = 0;
return;
}
- sched_unpin();
tlb_invalidate_address(pmap, va);
}
@@ -719,21 +717,20 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
static __inline void
pmap_update_page_local(pmap_t pmap, vm_offset_t va, pt_entry_t pte)
{
+ u_int cpuid;
+
+ cpuid = PCPU_GET(cpuid);
if (is_kernel_pmap(pmap)) {
tlb_update(pmap, va, pte);
return;
}
- sched_pin();
- if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) {
- sched_unpin();
+ if (pmap->pm_asid[cpuid].gen != PCPU_GET(asid_generation))
return;
- } else if (!CPU_OVERLAP(&pmap->pm_active, PCPU_PTR(cpumask))) {
- pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
- sched_unpin();
+ else if (!CPU_ISSET(cpuid, &pmap->pm_active)) {
+ pmap->pm_asid[cpuid].gen = 0;
return;
}
- sched_unpin();
tlb_update(pmap, va, pte);
}
@@ -1414,7 +1411,7 @@ get_pv_entry(pmap_t locked_pmap)
vpq = &vm_page_queues[PQ_INACTIVE];
retry:
TAILQ_FOREACH(m, &vpq->pl, pageq) {
- if (m->hold_count || m->busy)
+ if ((m->flags & PG_MARKER) != 0 || m->hold_count || m->busy)
continue;
TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
va = pv->pv_va;
@@ -1711,8 +1708,8 @@ pmap_remove_all(vm_page_t m)
pv_entry_t pv;
pt_entry_t *pte, tpte;
- KASSERT((m->flags & PG_FICTITIOUS) == 0,
- ("pmap_remove_all: page %p is fictitious", m));
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
vm_page_lock_queues();
if (m->md.pv_flags & PV_TABLE_REF)
@@ -2953,19 +2950,21 @@ pmap_activate(struct thread *td)
{
pmap_t pmap, oldpmap;
struct proc *p = td->td_proc;
+ u_int cpuid;
critical_enter();
pmap = vmspace_pmap(p->p_vmspace);
oldpmap = PCPU_GET(curpmap);
+ cpuid = PCPU_GET(cpuid);
if (oldpmap)
- CPU_NAND_ATOMIC(&oldpmap->pm_active, PCPU_PTR(cpumask));
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
pmap_asid_alloc(pmap);
if (td == curthread) {
PCPU_SET(segbase, pmap->pm_segtab);
- mips_wr_entryhi(pmap->pm_asid[PCPU_GET(cpuid)].asid);
+ mips_wr_entryhi(pmap->pm_asid[cpuid].asid);
}
PCPU_SET(curpmap, pmap);
diff --git a/sys/mips/mips/trap.c b/sys/mips/mips/trap.c
index 35b8030..c800e71 100644
--- a/sys/mips/mips/trap.c
+++ b/sys/mips/mips/trap.c
@@ -91,10 +91,6 @@ __FBSDID("$FreeBSD$");
#include <sys/kdb.h>
#endif
-#include <sys/cdefs.h>
-#include <sys/syslog.h>
-
-
#ifdef TRAP_DEBUG
int trap_debug = 0;
SYSCTL_INT(_machdep, OID_AUTO, trap_debug, CTLFLAG_RW,
diff --git a/sys/mips/nlm/board.c b/sys/mips/nlm/board.c
new file mode 100644
index 0000000..d75059e
--- /dev/null
+++ b/sys/mips/nlm/board.c
@@ -0,0 +1,80 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/fmn.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/hal/uart.h>
+
+#include <mips/nlm/board.h>
+
+struct xlp_board_info xlp_board_info;
+
+int nlm_setup_xlp_board(void);
+
+/*
+ * All our knowledge of chip and board that cannot be detected by probing
+ * at run-time goes here
+ */
+
+int
+nlm_setup_xlp_board(void)
+{
+ struct xlp_board_info *boardp;
+ int node;
+
+ /* start with a clean slate */
+ boardp = &xlp_board_info;
+ memset(boardp, 0, sizeof(xlp_board_info));
+ boardp->nodemask = 0x1; /* only node 0 */
+
+ for (node = 0; node < XLP_MAX_NODES; node++) {
+ if ((boardp->nodemask & (1 << node)) == 0)
+ continue;
+ }
+ return 0;
+}
+
+int nlm_board_info_setup()
+{
+ nlm_setup_xlp_board();
+ return 0;
+}
diff --git a/sys/mips/nlm/board.h b/sys/mips/nlm/board.h
new file mode 100644
index 0000000..742ebba
--- /dev/null
+++ b/sys/mips/nlm/board.h
@@ -0,0 +1,75 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_BOARD_H__
+#define __NLM_BOARD_H__
+
+#define XLP_NAE_NBLOCKS 5
+#define XLP_NAE_NPORTS 4
+#define XLP_I2C_MAXDEVICES 8
+
+struct xlp_i2c_devinfo {
+ u_int addr; /* keep first, for i2c ivars to work */
+ int bus;
+ char *device;
+};
+
+struct xlp_port_ivars {
+ int port;
+ int block;
+ int type;
+ int phy_addr;
+};
+
+struct xlp_block_ivars {
+ int block;
+ int type;
+ u_int portmask;
+ struct xlp_port_ivars port_ivars[XLP_NAE_NPORTS];
+};
+
+struct xlp_nae_ivars {
+ int node;
+ u_int blockmask;
+ struct xlp_block_ivars block_ivars[XLP_NAE_NBLOCKS];
+};
+
+struct xlp_board_info {
+ u_int nodemask;
+ struct xlp_node_info {
+ struct xlp_i2c_devinfo i2c_devs[XLP_I2C_MAXDEVICES];
+ struct xlp_nae_ivars nae_ivars;
+ } nodes[XLP_MAX_NODES];
+};
+
+extern struct xlp_board_info xlp_board_info;
+int nlm_board_info_setup(void);
+
+#endif
diff --git a/sys/mips/nlm/bus_space_rmi.c b/sys/mips/nlm/bus_space_rmi.c
new file mode 100644
index 0000000..8653cdf
--- /dev/null
+++ b/sys/mips/nlm/bus_space_rmi.c
@@ -0,0 +1,688 @@
+/*
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/endian.h>
+#include <sys/malloc.h>
+#include <sys/ktr.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_extern.h>
+
+#include <machine/bus.h>
+#include <machine/cache.h>
+
+static int
+rmi_bus_space_map(void *t, bus_addr_t addr,
+ bus_size_t size, int flags,
+ bus_space_handle_t *bshp);
+
+static void
+rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
+ bus_size_t size);
+
+static int
+rmi_bus_space_subregion(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, bus_size_t size,
+ bus_space_handle_t *nbshp);
+
+static u_int8_t
+rmi_bus_space_read_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int16_t
+rmi_bus_space_read_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int32_t
+rmi_bus_space_read_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset);
+
+static void
+rmi_bus_space_read_multi_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_region_1(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_region_4(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t value);
+
+static void
+rmi_bus_space_write_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value);
+
+static void
+rmi_bus_space_write_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value);
+
+static void
+rmi_bus_space_write_multi_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_multi_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_multi_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int32_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_region_4(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset,
+ const u_int32_t *addr,
+ size_t count);
+
+
+static void
+rmi_bus_space_set_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t value,
+ size_t count);
+static void
+rmi_bus_space_set_region_4(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t value,
+ size_t count);
+
+static void
+rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
+ bus_size_t offset __unused, bus_size_t len __unused, int flags);
+
+static void
+rmi_bus_space_copy_region_2(void *t,
+ bus_space_handle_t bsh1,
+ bus_size_t off1,
+ bus_space_handle_t bsh2,
+ bus_size_t off2, size_t count);
+
+u_int8_t
+rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int16_t
+rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset);
+
+static u_int32_t
+rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset);
+static void
+rmi_bus_space_read_multi_stream_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_stream_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_read_multi_stream_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr,
+ size_t count);
+
+void
+rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int8_t value);
+static void
+rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value);
+
+static void
+rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value);
+
+static void
+rmi_bus_space_write_multi_stream_1(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int8_t *addr,
+ size_t count);
+static void
+rmi_bus_space_write_multi_stream_2(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count);
+
+static void
+rmi_bus_space_write_multi_stream_4(void *t,
+ bus_space_handle_t handle,
+ bus_size_t offset,
+ const u_int32_t *addr,
+ size_t count);
+
+#define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__)
+
+static struct bus_space local_rmi_bus_space = {
+ /* cookie */
+ (void *)0,
+
+ /* mapping/unmapping */
+ rmi_bus_space_map,
+ rmi_bus_space_unmap,
+ rmi_bus_space_subregion,
+
+ /* allocation/deallocation */
+ NULL,
+ NULL,
+
+ /* barrier */
+ rmi_bus_space_barrier,
+
+ /* read (single) */
+ rmi_bus_space_read_1,
+ rmi_bus_space_read_2,
+ rmi_bus_space_read_4,
+ NULL,
+
+ /* read multiple */
+ rmi_bus_space_read_multi_1,
+ rmi_bus_space_read_multi_2,
+ rmi_bus_space_read_multi_4,
+ NULL,
+
+ /* read region */
+ rmi_bus_space_read_region_1,
+ rmi_bus_space_read_region_2,
+ rmi_bus_space_read_region_4,
+ NULL,
+
+ /* write (single) */
+ rmi_bus_space_write_1,
+ rmi_bus_space_write_2,
+ rmi_bus_space_write_4,
+ NULL,
+
+ /* write multiple */
+ rmi_bus_space_write_multi_1,
+ rmi_bus_space_write_multi_2,
+ rmi_bus_space_write_multi_4,
+ NULL,
+
+ /* write region */
+ NULL,
+ rmi_bus_space_write_region_2,
+ rmi_bus_space_write_region_4,
+ NULL,
+
+ /* set multiple */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ /* set region */
+ NULL,
+ rmi_bus_space_set_region_2,
+ rmi_bus_space_set_region_4,
+ NULL,
+
+ /* copy */
+ NULL,
+ rmi_bus_space_copy_region_2,
+ NULL,
+ NULL,
+
+ /* read (single) stream */
+ rmi_bus_space_read_stream_1,
+ rmi_bus_space_read_stream_2,
+ rmi_bus_space_read_stream_4,
+ NULL,
+
+ /* read multiple stream */
+ rmi_bus_space_read_multi_stream_1,
+ rmi_bus_space_read_multi_stream_2,
+ rmi_bus_space_read_multi_stream_4,
+ NULL,
+
+ /* read region stream */
+ rmi_bus_space_read_region_1,
+ rmi_bus_space_read_region_2,
+ rmi_bus_space_read_region_4,
+ NULL,
+
+ /* write (single) stream */
+ rmi_bus_space_write_stream_1,
+ rmi_bus_space_write_stream_2,
+ rmi_bus_space_write_stream_4,
+ NULL,
+
+ /* write multiple stream */
+ rmi_bus_space_write_multi_stream_1,
+ rmi_bus_space_write_multi_stream_2,
+ rmi_bus_space_write_multi_stream_4,
+ NULL,
+
+ /* write region stream */
+ NULL,
+ rmi_bus_space_write_region_2,
+ rmi_bus_space_write_region_4,
+ NULL,
+};
+
+/* generic bus_space tag */
+bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
+
+/*
+ * Map a region of device bus space into CPU virtual address space.
+ */
+static int
+rmi_bus_space_map(void *t __unused, bus_addr_t addr,
+ bus_size_t size __unused, int flags __unused,
+ bus_space_handle_t *bshp)
+{
+
+ *bshp = addr;
+ return (0);
+}
+
+/*
+ * Unmap a region of device bus space.
+ */
+static void
+rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
+ bus_size_t size __unused)
+{
+}
+
+/*
+ * Get a new handle for a subregion of an already-mapped area of bus space.
+ */
+
+static int
+rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
+ bus_size_t offset, bus_size_t size __unused,
+ bus_space_handle_t *nbshp)
+{
+ *nbshp = bsh + offset;
+ return (0);
+}
+
+/*
+ * Read a 1, 2, 4, or 8 byte quantity from bus space
+ * described by tag/handle/offset.
+ */
+
+static u_int8_t
+rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (u_int8_t) (*(volatile u_int32_t *)(handle + offset));
+}
+
+static u_int16_t
+rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (u_int16_t)(*(volatile u_int32_t *)(handle + offset));
+}
+
+static u_int32_t
+rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (*(volatile u_int32_t *)(handle + offset));
+}
+
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle/offset and copy into buffer provided.
+ */
+static void
+rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+/*
+ * Write the 1, 2, 4, or 8 byte value `value' to bus space
+ * described by tag/handle/offset.
+ */
+
+static void
+rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t value)
+{
+ *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value;
+}
+
+static void
+rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value)
+{
+ *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value;
+}
+
+static void
+rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value)
+{
+ *(volatile u_int32_t *)(handle + offset) = value;
+}
+
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
+ * provided to bus space described by tag/handle/offset.
+ */
+
+
+static void
+rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
+ * by tag/handle starting at `offset'.
+ */
+
+static void
+rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t value, size_t count)
+{
+ bus_addr_t addr = bsh + offset;
+
+ for (; count != 0; count--, addr += 2)
+ (*(volatile u_int32_t *)(addr)) = value;
+}
+
+static void
+rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t value, size_t count)
+{
+ bus_addr_t addr = bsh + offset;
+
+ for (; count != 0; count--, addr += 4)
+ (*(volatile u_int32_t *)(addr)) = value;
+}
+
+
+/*
+ * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
+ * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
+ */
+static void
+rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
+ bus_size_t off1, bus_space_handle_t bsh2,
+ bus_size_t off2, size_t count)
+{
+ printf("bus_space_copy_region_2 - unimplemented\n");
+}
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle/offset and copy into buffer provided.
+ */
+
+u_int8_t
+rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+
+ return *((volatile u_int8_t *)(handle + offset));
+}
+
+
+static u_int16_t
+rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return *(volatile u_int16_t *)(handle + offset);
+}
+
+
+static u_int32_t
+rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset)
+{
+ return (*(volatile u_int32_t *)(handle + offset));
+}
+
+
+static void
+rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle and starting at `offset' and copy into
+ * buffer provided.
+ */
+void
+rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, u_int32_t *addr, size_t count)
+{
+ bus_addr_t baddr = bsh + offset;
+
+ while (count--) {
+ *addr++ = (*(volatile u_int32_t *)(baddr));
+ baddr += 4;
+ }
+}
+
+void
+rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int8_t value)
+{
+ TODO();
+}
+
+
+static void
+rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int16_t value)
+{
+ TODO();
+}
+
+
+static void
+rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
+ bus_size_t offset, u_int32_t value)
+{
+ TODO();
+}
+
+
+static void
+rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int8_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int16_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
+ bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_write_region_2(void *t,
+ bus_space_handle_t bsh,
+ bus_size_t offset,
+ const u_int16_t *addr,
+ size_t count)
+{
+ TODO();
+}
+
+void
+rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
+ bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+ TODO();
+}
+
+static void
+rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
+ bus_size_t offset __unused, bus_size_t len __unused, int flags)
+{
+}
diff --git a/sys/mips/nlm/clock.h b/sys/mips/nlm/clock.h
new file mode 100644
index 0000000..2135dbf
--- /dev/null
+++ b/sys/mips/nlm/clock.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef _RMI_CLOCK_H_
+#define _RMI_CLOCK_H_
+
+#define XLP_PIC_HZ 133000000U
+#define XLP_CPU_HZ (nlm_cpu_frequency)
+
+void count_compare_clockhandler(struct trapframe *);
+void pic_hardclockhandler(struct trapframe *);
+void pic_timecounthandler(struct trapframe *);
+
+#endif /* _RMI_CLOCK_H_ */
diff --git a/sys/mips/nlm/cms.c b/sys/mips/nlm/cms.c
new file mode 100644
index 0000000..fb03d80
--- /dev/null
+++ b/sys/mips/nlm/cms.c
@@ -0,0 +1,452 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/param.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/proc.h>
+#include <sys/limits.h>
+#include <sys/bus.h>
+
+#include <sys/ktr.h>
+#include <sys/kernel.h>
+#include <sys/kthread.h>
+#include <sys/proc.h>
+#include <sys/resourcevar.h>
+#include <sys/sched.h>
+#include <sys/unistd.h>
+#include <sys/sysctl.h>
+#include <sys/malloc.h>
+
+#include <machine/reg.h>
+#include <machine/cpu.h>
+#include <machine/hwfunc.h>
+#include <machine/mips_opcode.h>
+#include <machine/param.h>
+#include <machine/intr_machdep.h>
+
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/hal/cop2.h>
+#include <mips/nlm/hal/fmn.h>
+#include <mips/nlm/hal/pic.h>
+
+#include <mips/nlm/msgring.h>
+#include <mips/nlm/interrupt.h>
+#include <mips/nlm/xlp.h>
+#include <mips/nlm/board.h>
+
+#define MSGRNG_NSTATIONS 1024
+/*
+ * Keep track of our message ring handler threads, each core has a
+ * different message station. Ideally we will need to start a few
+ * message handling threads every core, and wake them up depending on
+ * load
+ */
+struct msgring_thread {
+ struct thread *thread; /* msgring handler threads */
+ int needed; /* thread needs to wake up */
+};
+static struct msgring_thread msgring_threads[XLP_MAX_CORES * XLP_MAX_THREADS];
+static struct proc *msgring_proc; /* all threads are under a proc */
+
+/*
+ * The device drivers can register a handler for the the messages sent
+ * from a station (corresponding to the device).
+ */
+struct tx_stn_handler {
+ msgring_handler action;
+ void *arg;
+};
+static struct tx_stn_handler msgmap[MSGRNG_NSTATIONS];
+static struct mtx msgmap_lock;
+uint64_t xlp_cms_base;
+uint32_t xlp_msg_thread_mask;
+static int xlp_msg_threads_per_core = 3; /* Make tunable */
+
+static void create_msgring_thread(int hwtid);
+static int msgring_process_fast_intr(void *arg);
+/*
+ * Boot time init, called only once
+ */
+void
+xlp_msgring_config(void)
+{
+ unsigned int thrmask, mask;
+ int i;
+
+ /* TODO: Add other nodes */
+ xlp_cms_base = nlm_regbase_cms(0);
+
+ mtx_init(&msgmap_lock, "msgring", NULL, MTX_SPIN);
+ if (xlp_threads_per_core < xlp_msg_threads_per_core)
+ xlp_msg_threads_per_core = xlp_threads_per_core;
+ thrmask = ((1 << xlp_msg_threads_per_core) - 1);
+ /*thrmask <<= xlp_threads_per_core - xlp_msg_threads_per_core;*/
+ mask = 0;
+ for (i = 0; i < XLP_MAX_CORES; i++) {
+ mask <<= XLP_MAX_THREADS;
+ mask |= thrmask;
+ }
+ xlp_msg_thread_mask = xlp_hw_thread_mask & mask;
+ printf("Initializing CMS...@%jx, Message handler thread mask %#jx\n",
+ (uintmax_t)xlp_cms_base, (uintmax_t)xlp_msg_thread_mask);
+}
+
+/*
+ * Initialize the messaging subsystem.
+ *
+ * Message Stations are shared among all threads in a cpu core, this
+ * has to be called once from every core which is online.
+ */
+void
+xlp_msgring_iodi_config(void)
+{
+ void *cookie;
+
+ xlp_msgring_config();
+/* nlm_cms_default_setup(0,0,0,0); */
+ nlm_cms_credit_setup(50);
+ create_msgring_thread(0);
+ cpu_establish_hardintr("msgring", msgring_process_fast_intr, NULL,
+ NULL, IRQ_MSGRING, INTR_TYPE_NET, &cookie);
+}
+
+void
+nlm_cms_credit_setup(int credit)
+{
+ int src, qid, i;
+
+#if 0
+ /* there are a total of 18 src stations on XLP. */
+ printf("Setting up CMS credits!\n");
+ for(src=0; src<18; src++) {
+ for(qid=0; qid<1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ }
+#endif
+ printf("Setting up CMS credits!\n");
+ /* CPU Credits */
+ for(i = 1; i < 8; i++) {
+ src = (i << 4);
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ }
+ /* PCIE Credits */
+ for(i = 0; i < 4; i++) {
+ src = (256 + (i * 2));
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ }
+ /* DTE Credits */
+ src = 264;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* RSA Credits */
+ src = 272;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* Crypto Credits */
+ src = 281;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* CMP Credits */
+ src = 298;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* POE Credits */
+ src = 384;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+ /* NAE Credits */
+ src = 476;
+ for(qid = 0; qid < 1024; qid++) {
+ nlm_cms_setup_credits(xlp_cms_base, qid, src, credit);
+ }
+}
+
+void
+xlp_msgring_cpu_init(uint32_t cpuid)
+{
+ int queue,i;
+
+ queue = XLP_CMS_CPU_PUSHQ(0, ((cpuid >> 2) & 0x7), (cpuid & 0x3), 0);
+ /* temp allocate 4 segments to each output queue */
+ nlm_cms_alloc_onchip_q(xlp_cms_base, queue, 4);
+ /* Enable high watermark and non empty interrupt */
+ nlm_cms_per_queue_level_intr(xlp_cms_base, queue,2,0);
+ for(i=0;i<8;i++) {
+ /* temp distribute the credits to all CPU stations */
+ nlm_cms_setup_credits(xlp_cms_base, queue, i * 16, 8);
+ }
+}
+
+void
+xlp_cpu_msgring_handler(int bucket, int size, int code, int stid,
+ struct nlm_fmn_msg *msg, void *data)
+{
+ int i;
+
+ printf("vc:%d srcid:%d size:%d\n",bucket,stid,size);
+ for(i=0;i<size;i++) {
+ printf("msg->msg[%d]:0x%jx ", i, (uintmax_t)msg->msg[i]);
+ }
+ printf("\n");
+}
+
+/*
+ * Drain out max_messages for the buckets set in the bucket mask.
+ * Use max_msgs = 0 to drain out all messages.
+ */
+int
+xlp_handle_msg_vc(int vc, int max_msgs)
+{
+ struct nlm_fmn_msg msg;
+ int i, srcid = 0, size = 0, code = 0;
+ struct tx_stn_handler *he;
+ uint32_t mflags, status;
+
+ for (i = 0; i < max_msgs; i++) {
+ mflags = nlm_fmn_saveflags();
+ status = nlm_fmn_msgrcv(vc, &srcid, &size, &code, &msg);
+ nlm_fmn_restoreflags(mflags);
+ if (status != 0) /* If there is no msg or error */
+ break;
+ if (srcid < 0 && srcid >= 1024) {
+ printf("[%s]: bad src id %d\n", __func__, srcid);
+ continue;
+ }
+ he = &msgmap[srcid];
+ if(he->action != NULL)
+ (he->action)(vc, size, code, srcid, &msg, he->arg);
+#if 0 /* debug */
+ else
+ printf("[%s]: No Handler for message from stn_id=%d,"
+ " vc=%d, size=%d, msg0=%jx, dropping message\n",
+ __func__, srcid, vc, size, (uintmax_t)msg.msg[0]);
+#endif
+ }
+
+ return (i);
+}
+
+static int
+msgring_process_fast_intr(void *arg)
+{
+ struct msgring_thread *mthd;
+ struct thread *td;
+ int cpu;
+
+ cpu = nlm_cpuid();
+ mthd = &msgring_threads[cpu];
+ td = mthd->thread;
+
+ /* clear pending interrupts */
+ nlm_write_c0_eirr(1ULL << IRQ_MSGRING);
+
+ /* wake up the target thread */
+ mthd->needed = 1;
+ thread_lock(td);
+ if (TD_AWAITING_INTR(td)) {
+ TD_CLR_IWAIT(td);
+ sched_add(td, SRQ_INTR);
+ }
+
+ thread_unlock(td);
+ return (FILTER_HANDLED);
+}
+
+u_int fmn_msgcount[32][4];
+u_int fmn_loops[32];
+
+static void
+msgring_process(void * arg)
+{
+ volatile struct msgring_thread *mthd;
+ struct thread *td;
+ uint32_t mflags;
+ int hwtid, vc, handled, nmsgs;
+
+ hwtid = (intptr_t)arg;
+ mthd = &msgring_threads[hwtid];
+ td = mthd->thread;
+ KASSERT(curthread == td,
+ ("%s:msg_ithread and proc linkage out of sync", __func__));
+
+ /* First bind this thread to the right CPU */
+ thread_lock(td);
+ sched_bind(td, xlp_hwtid_to_cpuid[hwtid]);
+ thread_unlock(td);
+
+ if (hwtid != nlm_cpuid())
+ printf("Misscheduled hwtid %d != cpuid %d\n", hwtid, nlm_cpuid());
+ mflags = nlm_fmn_saveflags();
+ nlm_fmn_cpu_init(IRQ_MSGRING, 0, 0, 0, 0, 0);
+ nlm_fmn_restoreflags(mflags);
+
+ /* start processing messages */
+ for( ; ; ) {
+ /*atomic_store_rel_int(&mthd->needed, 0);*/
+
+ /* enable cop2 access */
+ do {
+ handled = 0;
+ for (vc = 0; vc < 4; vc++) {
+ nmsgs = xlp_handle_msg_vc(vc, 1);
+ fmn_msgcount[hwtid][vc] += nmsgs;
+ handled += nmsgs;
+ }
+ } while (handled);
+
+ /* sleep */
+#if 0
+ thread_lock(td);
+ if (mthd->needed) {
+ thread_unlock(td);
+ continue;
+ }
+ sched_class(td, PRI_ITHD);
+ TD_SET_IWAIT(td);
+ mi_switch(SW_VOL, NULL);
+ thread_unlock(td);
+#else
+ pause("wmsg", 1);
+#endif
+ fmn_loops[hwtid]++;
+ }
+}
+
+static void
+create_msgring_thread(int hwtid)
+{
+ struct msgring_thread *mthd;
+ struct thread *td;
+ int error;
+
+ mthd = &msgring_threads[hwtid];
+ error = kproc_kthread_add(msgring_process, (void *)(uintptr_t)hwtid,
+ &msgring_proc, &td, RFSTOPPED, 2, "msgrngproc",
+ "msgthr%d", hwtid);
+ if (error)
+ panic("kproc_kthread_add() failed with %d", error);
+ mthd->thread = td;
+
+ thread_lock(td);
+ sched_class(td, PRI_ITHD);
+ sched_add(td, SRQ_INTR);
+ thread_unlock(td);
+ CTR2(KTR_INTR, "%s: created %s", __func__, td->td_name);
+}
+
+int
+register_msgring_handler(int startb, int endb, msgring_handler action,
+ void *arg)
+{
+ int i;
+
+ printf("Register handler %d-%d %p(%p)\n", startb, endb, action, arg);
+ KASSERT(startb >= 0 && startb <= endb && endb < MSGRNG_NSTATIONS,
+ ("Invalid value for for bucket range %d,%d", startb, endb));
+
+ mtx_lock_spin(&msgmap_lock);
+ for (i = startb; i <= endb; i++) {
+ KASSERT(msgmap[i].action == NULL,
+ ("Bucket %d already used [action %p]", i, msgmap[i].action));
+ msgmap[i].action = action;
+ msgmap[i].arg = arg;
+ }
+ mtx_unlock_spin(&msgmap_lock);
+
+ return (0);
+}
+
+/*
+ * Start message ring processing threads on other CPUs, after SMP start
+ */
+static void
+start_msgring_threads(void *arg)
+{
+ int hwt;
+
+ for (hwt = 1; hwt < XLP_MAX_CORES * XLP_MAX_THREADS; hwt++) {
+ if ((xlp_msg_thread_mask & (1 << hwt)) == 0)
+ continue;
+ create_msgring_thread(hwt);
+ }
+}
+
+SYSINIT(start_msgring_threads, SI_SUB_SMP, SI_ORDER_MIDDLE,
+ start_msgring_threads, NULL);
+
+/*
+ * DEBUG support, XXX: static buffer, not locked
+ */
+static int
+sys_print_debug(SYSCTL_HANDLER_ARGS)
+{
+ int error, nb, i, fs;
+ static char xprintb[4096], *buf;
+
+ buf = xprintb;
+ fs = sizeof(xprintb);
+ nb = snprintf(buf, fs,
+ "\nID vc0 vc1 vc2 vc3 loops\n");
+ buf += nb;
+ fs -= nb;
+ for (i = 0; i < 32; i++) {
+ if ((xlp_hw_thread_mask & (1 << i)) == 0)
+ continue;
+ nb = snprintf(buf, fs,
+ "%2d: %8d %8d %8d %8d %8d\n", i,
+ fmn_msgcount[i][0], fmn_msgcount[i][1],
+ fmn_msgcount[i][2], fmn_msgcount[i][3],
+ fmn_loops[i]);
+ buf += nb;
+ fs -= nb;
+ }
+ error = SYSCTL_OUT(req, xprintb, buf - xprintb);
+ return (error);
+}
+
+SYSCTL_PROC(_debug, OID_AUTO, msgring, CTLTYPE_STRING | CTLFLAG_RD, 0, 0,
+ sys_print_debug, "A", "msgring debug info");
diff --git a/sys/mips/nlm/files.xlp b/sys/mips/nlm/files.xlp
new file mode 100644
index 0000000..ac13845
--- /dev/null
+++ b/sys/mips/nlm/files.xlp
@@ -0,0 +1,12 @@
+# $FreeBSD$
+mips/nlm/hal/fmn.c standard
+mips/nlm/xlp_machdep.c standard
+mips/nlm/intr_machdep.c standard
+mips/nlm/tick.c standard
+mips/nlm/iodi.c standard
+mips/nlm/board.c standard
+mips/nlm/cms.c standard
+mips/nlm/bus_space_rmi.c standard
+mips/nlm/mpreset.S standard
+mips/nlm/uart_bus_xlp_iodi.c optional uart
+mips/nlm/uart_cpu_mips_xlp.c optional uart
diff --git a/sys/mips/nlm/hal/bridge.h b/sys/mips/nlm/hal/bridge.h
new file mode 100644
index 0000000..d91ccd6
--- /dev/null
+++ b/sys/mips/nlm/hal/bridge.h
@@ -0,0 +1,177 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_BRIDGE_H__
+#define __NLM_BRIDGE_H__
+
+/**
+* @file_name mio.h
+* @author Netlogic Microsystems
+* @brief Basic definitions of XLP memory and io subsystem
+*/
+
+/* BRIDGE specific registers */
+#define XLP_BRIDGE_MODE_REG 0x40
+#define XLP_BRIDGE_PCI_CFG_BASE_REG 0x41
+#define XLP_BRIDGE_PCI_CFG_LIMIT_REG 0x42
+#define XLP_BRIDGE_PCIE_CFG_BASE_REG 0x43
+#define XLP_BRIDGE_PCIE_CFG_LIMIT_REG 0x44
+#define XLP_BRIDGE_BUSNUM_BAR0_REG 0x45
+#define XLP_BRIDGE_BUSNUM_BAR1_REG 0x46
+#define XLP_BRIDGE_BUSNUM_BAR2_REG 0x47
+#define XLP_BRIDGE_BUSNUM_BAR3_REG 0x48
+#define XLP_BRIDGE_BUSNUM_BAR4_REG 0x49
+#define XLP_BRIDGE_BUSNUM_BAR5_REG 0x4a
+#define XLP_BRIDGE_BUSNUM_BAR6_REG 0x4b
+#define XLP_BRIDGE_FLASH_BAR0_REG 0x4c
+#define XLP_BRIDGE_FLASH_BAR1_REG 0x4d
+#define XLP_BRIDGE_FLASH_BAR2_REG 0x4e
+#define XLP_BRIDGE_FLASH_BAR3_REG 0x4f
+#define XLP_BRIDGE_FLASH_LIMIT0_REG 0x50
+#define XLP_BRIDGE_FLASH_LIMIT1_REG 0x51
+#define XLP_BRIDGE_FLASH_LIMIT2_REG 0x52
+#define XLP_BRIDGE_FLASH_LIMIT3_REG 0x53
+
+#define XLP_BRIDGE_DRAM_BAR_REG(i) (0x54 + (i))
+#define XLP_BRIDGE_DRAM_BAR0_REG 0x54
+#define XLP_BRIDGE_DRAM_BAR1_REG 0x55
+#define XLP_BRIDGE_DRAM_BAR2_REG 0x56
+#define XLP_BRIDGE_DRAM_BAR3_REG 0x57
+#define XLP_BRIDGE_DRAM_BAR4_REG 0x58
+#define XLP_BRIDGE_DRAM_BAR5_REG 0x59
+#define XLP_BRIDGE_DRAM_BAR6_REG 0x5a
+#define XLP_BRIDGE_DRAM_BAR7_REG 0x5b
+
+#define XLP_BRIDGE_DRAM_LIMIT_REG(i) (0x5c + (i))
+#define XLP_BRIDGE_DRAM_LIMIT0_REG 0x5c
+#define XLP_BRIDGE_DRAM_LIMIT1_REG 0x5d
+#define XLP_BRIDGE_DRAM_LIMIT2_REG 0x5e
+#define XLP_BRIDGE_DRAM_LIMIT3_REG 0x5f
+#define XLP_BRIDGE_DRAM_LIMIT4_REG 0x60
+#define XLP_BRIDGE_DRAM_LIMIT5_REG 0x61
+#define XLP_BRIDGE_DRAM_LIMIT6_REG 0x62
+#define XLP_BRIDGE_DRAM_LIMIT7_REG 0x63
+
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN0_REG 0x64
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN1_REG 0x65
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN2_REG 0x66
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN3_REG 0x67
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN4_REG 0x68
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN5_REG 0x69
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN6_REG 0x6a
+#define XLP_BRIDGE_DRAM_NODE_TRANSLN7_REG 0x6b
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN0_REG 0x6c
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN1_REG 0x6d
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN2_REG 0x6e
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN3_REG 0x6f
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN4_REG 0x70
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN5_REG 0x71
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN6_REG 0x72
+#define XLP_BRIDGE_DRAM_CHNL_TRANSLN7_REG 0x73
+#define XLP_BRIDGE_PCIEMEM_BASE0_REG 0x74
+#define XLP_BRIDGE_PCIEMEM_BASE1_REG 0x75
+#define XLP_BRIDGE_PCIEMEM_BASE2_REG 0x76
+#define XLP_BRIDGE_PCIEMEM_BASE3_REG 0x77
+#define XLP_BRIDGE_PCIEMEM_LIMIT0_REG 0x78
+#define XLP_BRIDGE_PCIEMEM_LIMIT1_REG 0x79
+#define XLP_BRIDGE_PCIEMEM_LIMIT2_REG 0x7a
+#define XLP_BRIDGE_PCIEMEM_LIMIT3_REG 0x7b
+#define XLP_BRIDGE_PCIEIO_BASE0_REG 0x7c
+#define XLP_BRIDGE_PCIEIO_BASE1_REG 0x7d
+#define XLP_BRIDGE_PCIEIO_BASE2_REG 0x7e
+#define XLP_BRIDGE_PCIEIO_BASE3_REG 0x7f
+#define XLP_BRIDGE_PCIEIO_LIMIT0_REG 0x80
+#define XLP_BRIDGE_PCIEIO_LIMIT1_REG 0x81
+#define XLP_BRIDGE_PCIEIO_LIMIT2_REG 0x82
+#define XLP_BRIDGE_PCIEIO_LIMIT3_REG 0x83
+#define XLP_BRIDGE_PCIEMEM_BASE4_REG 0x84
+#define XLP_BRIDGE_PCIEMEM_BASE5_REG 0x85
+#define XLP_BRIDGE_PCIEMEM_BASE6_REG 0x86
+#define XLP_BRIDGE_PCIEMEM_LIMIT4_REG 0x87
+#define XLP_BRIDGE_PCIEMEM_LIMIT5_REG 0x88
+#define XLP_BRIDGE_PCIEMEM_LIMIT6_REG 0x89
+#define XLP_BRIDGE_PCIEIO_BASE4_REG 0x8a
+#define XLP_BRIDGE_PCIEIO_BASE5_REG 0x8b
+#define XLP_BRIDGE_PCIEIO_BASE6_REG 0x8c
+#define XLP_BRIDGE_PCIEIO_LIMIT4_REG 0x8d
+#define XLP_BRIDGE_PCIEIO_LIMIT5_REG 0x8e
+#define XLP_BRIDGE_PCIEIO_LIMIT6_REG 0x8f
+#define XLP_BRIDGE_NBU_EVENT_CNT_CTL_REG 0x90
+#define XLP_BRIDGE_EVNTCTR1_LOW_REG 0x91
+#define XLP_BRIDGE_EVNTCTR1_HI_REG 0x92
+#define XLP_BRIDGE_EVNT_CNT_CTL2_REG 0x93
+#define XLP_BRIDGE_EVNTCTR2_LOW_REG 0x94
+#define XLP_BRIDGE_EVNTCTR2_HI_REG 0x95
+#define XLP_BRIDGE_TRACEBUF_MATCH_REG0 0x96
+#define XLP_BRIDGE_TRACEBUF_MATCH_REG1 0x97
+#define XLP_BRIDGE_TRACEBUF_MATCH_LOW_REG 0x98
+#define XLP_BRIDGE_TRACEBUF_MATCH_HI_REG 0x99
+#define XLP_BRIDGE_TRACEBUF_CTRL_REG 0x9a
+#define XLP_BRIDGE_TRACEBUF_INIT_REG 0x9b
+#define XLP_BRIDGE_TRACEBUF_ACCESS_REG 0x9c
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG0 0x9d
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG1 0x9d
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG2 0x9f
+#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG3 0xa0
+#define XLP_BRIDGE_TRACEBUF_STATUS_REG 0xa1
+#define XLP_BRIDGE_ADDRESS_ERROR0_REG 0xa2
+#define XLP_BRIDGE_ADDRESS_ERROR1_REG 0xa3
+#define XLP_BRIDGE_ADDRESS_ERROR2_REG 0xa4
+#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR0_REG 0xa5
+#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR1_REG 0xa6
+#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR2_REG 0xa7
+#define XLP_BRIDGE_LINE_FLUSH_REG0 0xa8
+#define XLP_BRIDGE_LINE_FLUSH_REG1 0xa9
+#define XLP_BRIDGE_NODE_ID_REG 0xaa
+#define XLP_BRIDGE_ERROR_INTERRUPT_EN_REG 0xab
+#define XLP_BRIDGE_PCIE0_WEIGHT_REG 0x300
+#define XLP_BRIDGE_PCIE1_WEIGHT_REG 0x301
+#define XLP_BRIDGE_PCIE2_WEIGHT_REG 0x302
+#define XLP_BRIDGE_PCIE3_WEIGHT_REG 0x303
+#define XLP_BRIDGE_USB_WEIGHT_REG 0x304
+#define XLP_BRIDGE_NET_WEIGHT_REG 0x305
+#define XLP_BRIDGE_POE_WEIGHT_REG 0x306
+#define XLP_BRIDGE_CMS_WEIGHT_REG 0x307
+#define XLP_BRIDGE_DMAENG_WEIGHT_REG 0x308
+#define XLP_BRIDGE_SEC_WEIGHT_REG 0x309
+#define XLP_BRIDGE_COMP_WEIGHT_REG 0x30a
+#define XLP_BRIDGE_GIO_WEIGHT_REG 0x30b
+#define XLP_BRIDGE_FLASH_WEIGHT_REG 0x30c
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_bridge(b, r) nlm_read_reg_kseg(b, r)
+#define nlm_wreg_bridge(b, r, v) nlm_write_reg_kseg(b, r, v)
+#define nlm_pcibase_bridge(node) nlm_pcicfg_base(XLP_IO_BRIDGE_OFFSET(node))
+#define nlm_regbase_bridge(node) nlm_pcibase_bridge(node)
+
+#endif
+
+#endif
diff --git a/sys/mips/nlm/hal/cop0.h b/sys/mips/nlm/hal/cop0.h
new file mode 100644
index 0000000..18ecc97
--- /dev/null
+++ b/sys/mips/nlm/hal/cop0.h
@@ -0,0 +1,280 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_COP0_H__
+#define __NLM_COP0_H__
+
+#define NLM_C0_INDEX 0
+#define NLM_C0_RANDOM 1
+#define NLM_C0_ENTRYLO0 2
+#define NLM_C0_ENTRYLO1 3
+#define NLM_C0_CONTEXT 4
+#define NLM_C0_USERLOCAL 4
+#define NLM_C0_PAGEMASK 5
+#define NLM_C0_WIRED 6
+#define NLM_C0_BADVADDR 8
+#define NLM_C0_COUNT 9
+#define NLM_C0_EIRR 9
+#define NLM_C0_EIMR 9
+#define NLM_C0_ENTRYHI 10
+#define NLM_C0_COMPARE 11
+#define NLM_C0_STATUS 12
+#define NLM_C0_INTCTL 12
+#define NLM_C0_SRSCTL 12
+#define NLM_C0_CAUSE 13
+#define NLM_C0_EPC 14
+#define NLM_C0_PRID 15
+#define NLM_C0_EBASE 15
+#define NLM_C0_CONFIG 16
+#define NLM_C0_CONFIG0 16
+#define NLM_C0_CONFIG1 16
+#define NLM_C0_CONFIG2 16
+#define NLM_C0_CONFIG3 16
+#define NLM_C0_CONFIG4 16
+#define NLM_C0_CONFIG5 16
+#define NLM_C0_CONFIG6 16
+#define NLM_C0_CONFIG7 16
+#define NLM_C0_WATCHLO 18
+#define NLM_C0_WATCHHI 19
+#define NLM_C0_XCONTEXT 20
+#define NLM_C0_SCRATCH 22
+#define NLM_C0_SCRATCH0 22
+#define NLM_C0_SCRATCH1 22
+#define NLM_C0_SCRATCH2 22
+#define NLM_C0_SCRATCH3 22
+#define NLM_C0_SCRATCH4 22
+#define NLM_C0_SCRATCH5 22
+#define NLM_C0_SCRATCH6 22
+#define NLM_C0_SCRATCH7 22
+#define NLM_C0_DEBUG 23
+#define NLM_C0_DEPC 24
+#define NLM_C0_PERFCNT 25
+#define NLM_C0_PERFCNT0 25
+#define NLM_C0_PERFCNT1 25
+#define NLM_C0_TAGLO 28
+#define NLM_C0_DATALO 28
+#define NLM_C0_TAGHI 29
+#define NLM_C0_DATAHI 29
+#define NLM_C0_ERROREPC 30
+#define NLM_C0_DESAVE 31
+
+/* cop0 status bits */
+#define NLM_STATUS_CP0_EN (1<<28)
+#define NLM_STATUS_CP1_EN (1<<29)
+#define NLM_STATUS_CP2_EN (1<<30)
+#define NLM_STATUS_KX_EN (1<<7)
+#define NLM_STATUS_UX_EN (1<<5)
+
+#ifndef LOCORE
+
+#define nlm_memory_barrier() \
+ __asm__ __volatile__( \
+ ".set push\n\t" \
+ ".set noreorder\n\t" \
+ " sync\n\t" \
+ ".set pop" \
+ ::: "memory")
+
+#define NLM_DEFINE_ACCESSORS32(name, reg, sel) \
+static __inline__ uint32_t nlm_read_c0_##name(void) \
+{ \
+ uint32_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mfc0 %0, $%1, %2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) \
+ ); \
+ return __rv; \
+} \
+ \
+static __inline__ void nlm_write_c0_##name(uint32_t val) \
+{ \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mtc0 %0, $%1, %2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) \
+ ); \
+} struct __hack
+
+/* struct __hack above swallows a semicolon - otherwise the macro
+ * usage below cannot have the terminating semicolon */
+#if (__mips == 64)
+#define NLM_DEFINE_ACCESSORS64(name, reg, sel) \
+static __inline__ uint64_t nlm_read_c0_##name(void) \
+{ \
+ uint64_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc0 %0,$%1,%2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) ); \
+ return __rv; \
+} \
+ \
+static __inline__ void nlm_write_c0_##name(uint64_t val) \
+{ \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmtc0 %0,$%1,%2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) ); \
+} struct __hack
+
+#else
+
+#define NLM_DEFINE_ACCESSORS64(name, reg, sel) \
+static __inline__ uint64_t nlm_read_c0_##name(void) \
+{ \
+ uint32_t __high, __low; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc0 $8, $%2, %3\n" \
+ "dsra32 %0, $8, 0\n" \
+ "sll %1, $8, 0\n" \
+ ".set pop\n" \
+ : "=r"(__high), "=r"(__low) \
+ : "i"(reg), "i"(sel) \
+ : "$8" ); \
+ \
+ return (((uint64_t)__high << 32) | __low); \
+} \
+ \
+static __inline__ void nlm_write_c0_##name(uint64_t val) \
+{ \
+ uint32_t __high = val >> 32; \
+ uint32_t __low = val & 0xffffffff; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dsll32 $8, %1, 0\n" \
+ "dsll32 $9, %0, 0\n" \
+ "dsrl32 $8, $8, 0\n" \
+ "or $8, $8, $9\n" \
+ "dmtc0 $8, $%2, %3\n" \
+ ".set pop\n" \
+ :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \
+ : "$8", "$9"); \
+} struct __hack
+
+#endif
+
+NLM_DEFINE_ACCESSORS32(index, 0, 0);
+NLM_DEFINE_ACCESSORS32(random, 1, 0);
+NLM_DEFINE_ACCESSORS64(entrylo0, 2, 0);
+NLM_DEFINE_ACCESSORS64(entrylo1, 3, 0);
+NLM_DEFINE_ACCESSORS64(context, 4, 0);
+NLM_DEFINE_ACCESSORS64(userlocal, 4, 0);
+NLM_DEFINE_ACCESSORS32(pagemask, 5, 0);
+NLM_DEFINE_ACCESSORS32(wired, 6, 0);
+NLM_DEFINE_ACCESSORS64(badvaddr, 8, 0);
+NLM_DEFINE_ACCESSORS32(count, 9, 0);
+NLM_DEFINE_ACCESSORS64(eirr, 9, 6);
+NLM_DEFINE_ACCESSORS64(eimr, 9, 7);
+NLM_DEFINE_ACCESSORS64(entryhi, 10, 0);
+NLM_DEFINE_ACCESSORS32(compare, 11, 0);
+NLM_DEFINE_ACCESSORS32(status, 12, 0);
+NLM_DEFINE_ACCESSORS32(intctl, 12, 1);
+NLM_DEFINE_ACCESSORS32(srsctl, 12, 2);
+NLM_DEFINE_ACCESSORS32(cause, 13, 0);
+NLM_DEFINE_ACCESSORS64(epc, 14, 0);
+NLM_DEFINE_ACCESSORS32(prid, 15, 0);
+NLM_DEFINE_ACCESSORS32(ebase, 15, 1);
+NLM_DEFINE_ACCESSORS32(config0, 16, 0);
+NLM_DEFINE_ACCESSORS32(config1, 16, 1);
+NLM_DEFINE_ACCESSORS32(config2, 16, 2);
+NLM_DEFINE_ACCESSORS32(config3, 16, 3);
+NLM_DEFINE_ACCESSORS32(config6, 16, 6);
+NLM_DEFINE_ACCESSORS32(config7, 16, 7);
+NLM_DEFINE_ACCESSORS64(watchlo0, 18, 0);
+NLM_DEFINE_ACCESSORS32(watchhi0, 19, 0);
+NLM_DEFINE_ACCESSORS64(xcontext, 20, 0);
+NLM_DEFINE_ACCESSORS64(scratch0, 22, 0);
+NLM_DEFINE_ACCESSORS64(scratch1, 22, 1);
+NLM_DEFINE_ACCESSORS64(scratch2, 22, 2);
+NLM_DEFINE_ACCESSORS64(scratch3, 22, 3);
+NLM_DEFINE_ACCESSORS64(scratch4, 22, 4);
+NLM_DEFINE_ACCESSORS64(scratch5, 22, 5);
+NLM_DEFINE_ACCESSORS64(scratch6, 22, 6);
+NLM_DEFINE_ACCESSORS64(scratch7, 22, 7);
+NLM_DEFINE_ACCESSORS32(debug, 23, 0);
+NLM_DEFINE_ACCESSORS32(depc, 24, 0);
+NLM_DEFINE_ACCESSORS32(perfctrl0, 25, 0);
+NLM_DEFINE_ACCESSORS64(perfcntr0, 25, 1);
+NLM_DEFINE_ACCESSORS32(perfctrl1, 25, 2);
+NLM_DEFINE_ACCESSORS64(perfcntr1, 25, 3);
+NLM_DEFINE_ACCESSORS32(perfctrl2, 25, 4);
+NLM_DEFINE_ACCESSORS64(perfcntr2, 25, 5);
+NLM_DEFINE_ACCESSORS32(perfctrl3, 25, 6);
+NLM_DEFINE_ACCESSORS64(perfcntr3, 25, 7);
+NLM_DEFINE_ACCESSORS64(taglo0, 28, 0);
+NLM_DEFINE_ACCESSORS64(taglo2, 28, 2);
+NLM_DEFINE_ACCESSORS64(taghi0, 29, 0);
+NLM_DEFINE_ACCESSORS64(taghi2, 29, 2);
+NLM_DEFINE_ACCESSORS64(errorepc, 30, 0);
+NLM_DEFINE_ACCESSORS64(desave, 31, 0);
+
+static __inline__ int nlm_nodeid(void)
+{
+ return (nlm_read_c0_ebase() >> 5) & 0x3;
+}
+
+static __inline__ int nlm_cpuid(void)
+{
+ return nlm_read_c0_ebase() & 0x1f;
+}
+
+static __inline__ int nlm_threadid(void)
+{
+ return nlm_read_c0_ebase() & 0x3;
+}
+
+static __inline__ int nlm_coreid(void)
+{
+ return (nlm_read_c0_ebase() >> 2) & 0x7;
+}
+
+#endif
+
+#endif
diff --git a/sys/mips/nlm/hal/cop2.h b/sys/mips/nlm/hal/cop2.h
new file mode 100644
index 0000000..062cd9d
--- /dev/null
+++ b/sys/mips/nlm/hal/cop2.h
@@ -0,0 +1,327 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_COP2_H__
+#define __NLM_COP2_H__
+
+#define XLP_COP2_TX_BUF_REG 0
+#define XLP_COP2_RX_BUF_REG 1
+#define XLP_COP2_TXMSGSTATUS_REG 2
+#define XLP_COP2_RXMSGSTATUS_REG 3
+#define XLP_COP2_MSGSTATUS1_REG 4
+#define XLP_COP2_MSGCONFIG_REG 5
+#define XLP_COP2_MSGCONFIG1_REG 6
+
+#define CROSSTHR_POPQ_EN 0x01
+#define VC0_POPQ_EN 0x02
+#define VC1_POPQ_EN 0x04
+#define VC2_POPQ_EN 0x08
+#define VC3_POPQ_EN 0x10
+#define ALL_VC_POPQ_EN 0x1E
+#define ALL_VC_CT_POPQ_EN 0x1F
+
+struct nlm_fmn_msg {
+ uint64_t msg[4];
+};
+
+#define NLM_DEFINE_COP2_ACCESSORS32(name, reg, sel) \
+static inline uint32_t nlm_read_c2_##name(void) \
+{ \
+ uint32_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mfc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) \
+ ); \
+ return __rv; \
+} \
+ \
+static inline void nlm_write_c2_##name(uint32_t val) \
+{ \
+ __asm__ __volatile__( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "mtc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) \
+ ); \
+} struct __hack
+
+#if (__mips == 64)
+#define NLM_DEFINE_COP2_ACCESSORS64(name, reg, sel) \
+static inline uint64_t nlm_read_c2_##name(void) \
+{ \
+ uint64_t __rv; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ : "=r" (__rv) \
+ : "i" (reg), "i" (sel) ); \
+ return __rv; \
+} \
+ \
+static inline void nlm_write_c2_##name(uint64_t val) \
+{ \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmtc2 %0, $%1, %2\n" \
+ ".set pop\n" \
+ :: "r" (val), "i" (reg), "i" (sel) ); \
+} struct __hack
+
+#else
+
+#define NLM_DEFINE_COP2_ACCESSORS64(name, reg, sel) \
+static inline uint64_t nlm_read_c2_##name(void) \
+{ \
+ uint32_t __high, __low; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dmfc2 $8, $%2, %3\n" \
+ "dsra32 %0, $8, 0\n" \
+ "sll %1, $8, 0\n" \
+ ".set pop\n" \
+ : "=r"(__high), "=r"(__low) \
+ : "i"(reg), "i"(sel) \
+ : "$8" ); \
+ \
+ return (((uint64_t)__high << 32) | __low); \
+} \
+ \
+static inline void nlm_write_c2_##name(uint64_t val) \
+{ \
+ uint32_t __high = val >> 32; \
+ uint32_t __low = val & 0xffffffff; \
+ __asm__ __volatile__ ( \
+ ".set push\n" \
+ ".set noreorder\n" \
+ ".set mips64\n" \
+ "dsll32 $8, %1, 0\n" \
+ "dsll32 $9, %0, 0\n" \
+ "dsrl32 $8, $8, 0\n" \
+ "or $8, $8, $9\n" \
+ "dmtc2 $8, $%2, %3\n" \
+ ".set pop\n" \
+ :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \
+ :"$8", "$9"); \
+} struct __hack
+
+#endif
+
+NLM_DEFINE_COP2_ACCESSORS64(txbuf0, XLP_COP2_TX_BUF_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS64(txbuf1, XLP_COP2_TX_BUF_REG, 1);
+NLM_DEFINE_COP2_ACCESSORS64(txbuf2, XLP_COP2_TX_BUF_REG, 2);
+NLM_DEFINE_COP2_ACCESSORS64(txbuf3, XLP_COP2_TX_BUF_REG, 3);
+
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf0, XLP_COP2_RX_BUF_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf1, XLP_COP2_RX_BUF_REG, 1);
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf2, XLP_COP2_RX_BUF_REG, 2);
+NLM_DEFINE_COP2_ACCESSORS64(rxbuf3, XLP_COP2_RX_BUF_REG, 3);
+
+NLM_DEFINE_COP2_ACCESSORS32(txmsgstatus, XLP_COP2_TXMSGSTATUS_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(rxmsgstatus, XLP_COP2_RXMSGSTATUS_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(msgstatus1, XLP_COP2_MSGSTATUS1_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(msgconfig, XLP_COP2_MSGCONFIG_REG, 0);
+NLM_DEFINE_COP2_ACCESSORS32(msgconfig1, XLP_COP2_MSGCONFIG1_REG, 0);
+
+/* successful completion returns 1, else 0 */
+static __inline__ int nlm_msgsend(int val)
+{
+ int result;
+ __asm__ volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "move $8, %1 \n"
+ "sync \n"
+ "/* msgsnds $9, $8 */ \n"
+ ".word 0x4a084801 \n"
+ "move %0, $9 \n"
+ ".set pop \n"
+ : "=r" (result)
+ : "r" (val)
+ : "$8", "$9"
+ );
+ return result;
+}
+
+static __inline__ int nlm_msgld(int vc)
+{
+ int val;
+ __asm__ volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "move $8, %1 \n"
+ "/* msgld $9, $8 */ \n"
+ ".word 0x4a084802 \n"
+ "move %0, $9 \n"
+ ".set pop \n"
+ : "=r" (val)
+ : "r" (vc)
+ : "$8", "$9"
+ );
+ return val;
+}
+
+static __inline__ void nlm_msgwait(int vc)
+{
+ __asm__ volatile (
+ ".set push \n"
+ ".set noreorder \n"
+ ".set mips64 \n"
+ "move $8, %0 \n"
+ "/* msgwait $8 */ \n"
+ ".word 0x4a080003 \n"
+ ".set pop \n"
+ :: "r" (vc)
+ : "$8"
+ );
+}
+
+/* TODO this is not needed in n32 and n64 */
+static __inline uint32_t
+nlm_fmn_saveflags(void)
+{
+ uint32_t sr = mips_rd_status();
+
+ mips_wr_status((sr & ~MIPS_SR_INT_IE) | MIPS_SR_COP_2_BIT);
+ return (sr);
+}
+
+static __inline void
+nlm_fmn_restoreflags(uint32_t sr)
+{
+
+ mips_wr_status(sr);
+}
+
+static __inline__ int nlm_fmn_msgsend(int dstid, int size, int swcode,
+ struct nlm_fmn_msg *m)
+{
+ uint32_t flags, status;
+ int rv;
+
+ size -= 1;
+ flags = nlm_fmn_saveflags();
+ switch(size) {
+ case 3: nlm_write_c2_txbuf3(m->msg[3]);
+ case 2: nlm_write_c2_txbuf2(m->msg[2]);
+ case 1: nlm_write_c2_txbuf1(m->msg[1]);
+ case 0: nlm_write_c2_txbuf0(m->msg[0]);
+ }
+
+ dstid |= ((swcode << 24) | (size << 16));
+ status = nlm_msgsend(dstid);
+ rv = !status;
+ if (rv != 0)
+ rv = nlm_read_c2_txmsgstatus();
+ nlm_fmn_restoreflags(flags);
+
+ return (rv);
+}
+
+static __inline__ int nlm_fmn_msgrcv(int vc, int *srcid, int *size, int *code,
+ struct nlm_fmn_msg *m)
+{
+ uint32_t status;
+ uint32_t msg_status, flags;
+ int tmp_sz, rv;
+
+ flags = nlm_fmn_saveflags();
+ status = nlm_msgld(vc); /* will return 0, if error */
+ rv = !status;
+ if (rv == 0) {
+ msg_status = nlm_read_c2_rxmsgstatus();
+ *size = ((msg_status >> 26) & 0x3) + 1;
+ *code = (msg_status >> 18) & 0xff;
+ *srcid = (msg_status >> 4) & 0xfff;
+ tmp_sz = *size - 1;
+ switch(tmp_sz) {
+ case 3: m->msg[3] = nlm_read_c2_rxbuf3();
+ case 2: m->msg[2] = nlm_read_c2_rxbuf2();
+ case 1: m->msg[1] = nlm_read_c2_rxbuf1();
+ case 0: m->msg[0] = nlm_read_c2_rxbuf0();
+ }
+ }
+ nlm_fmn_restoreflags(flags);
+
+ return rv;
+}
+
+/**
+ * nlm_fmn_cpu_init() initializes the per-h/w thread cop2 w.r.t the following
+ * configuration parameters. It needs to be individually setup on each
+ * hardware thread.
+ *
+ * int_vec - interrupt vector getting placed into msgconfig reg
+ * ctpe - cross thread message pop enable. When set to 1, the thread (h/w cpu)
+ * associated where this cop2 register is setup, can pop messages
+ * intended for any other thread in the same core.
+ * v0pe - VC0 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc0.
+ * v1pe - VC1 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc1.
+ * v2pe - VC2 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc2.
+ * v3pe - VC3 pop message request mode enable. When set to 1, the thread
+ * can send pop requests to vc3.
+ */
+static __inline__ void nlm_fmn_cpu_init(int int_vec, int ctpe, int v0pe,
+ int v1pe, int v2pe, int v3pe)
+{
+ uint32_t val = nlm_read_c2_msgconfig();
+
+ /* Note: in XLP PRM 0.8.1, the int_vec bits are un-documented
+ * in msgconfig register of cop2.
+ * As per chip/cpu RTL, [16:20] bits consist of int_vec.
+ */
+ val |= ((int_vec & 0x1f) << 16) |
+ ((v3pe & 0x1) << 4) |
+ ((v2pe & 0x1) << 3) |
+ ((v1pe & 0x1) << 2) |
+ ((v0pe & 0x1) << 1) |
+ (ctpe & 0x1);
+
+ nlm_write_c2_msgconfig(val);
+}
+#endif
diff --git a/sys/mips/nlm/hal/cpucontrol.h b/sys/mips/nlm/hal/cpucontrol.h
new file mode 100644
index 0000000..0bc0f5b
--- /dev/null
+++ b/sys/mips/nlm/hal/cpucontrol.h
@@ -0,0 +1,70 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_CPUCONTROL_H__
+#define __NLM_CPUCONTROL_H__
+
+#define XLP_CPU_BLOCKID_IFU 0
+#define XLP_CPU_BLOCKID_ICU 1
+
+#define XLP_CPU_BLOCKID_IEU 2
+#define XLP_CPU_BLOCKID_LSU 3
+#define XLP_LSU_DEFEATURE 0x304
+#define XLP_LSU_CERRLOG_REGID 0x09
+
+#define XLP_CPU_BLOCKID_MMU 4
+#define XLP_CPU_BLOCKID_PRF 5
+
+#define XLP_CPU_BLOCKID_SCH 7
+#define XLP_SCHED_DEFEATURE 0x700
+
+#define XLP_CPU_BLOCKID_SCU 8
+#define XLP_CPU_BLOCKID_FPU 9
+
+#define XLP_CPU_BLOCKID_MAP 10
+
+/* Offsets of interest from the 'MAP' Block */
+#define XLP_BLKID_MAP_THREADMODE 0x00
+#define XLP_BLKID_MAP_EXT_EBASE_ENABLE 0x04
+#define XLP_BLKID_MAP_CCDI_CONFIG 0x08
+#define XLP_BLKID_MAP_THRD0_CCDI_STATUS 0x0c
+#define XLP_BLKID_MAP_THRD1_CCDI_STATUS 0x10
+#define XLP_BLKID_MAP_THRD2_CCDI_STATUS 0x14
+#define XLP_BLKID_MAP_THRD3_CCDI_STATUS 0x18
+#define XLP_BLKID_MAP_THRD0_DEBUG_MODE 0x1c
+#define XLP_BLKID_MAP_THRD1_DEBUG_MODE 0x20
+#define XLP_BLKID_MAP_THRD2_DEBUG_MODE 0x24
+#define XLP_BLKID_MAP_THRD3_DEBUG_MODE 0x28
+#define XLP_BLKID_MAP_MISC_STATE 0x60
+#define XLP_BLKID_MAP_DEBUG_READ_CTL 0x64
+#define XLP_BLKID_MAP_DEBUG_READ_REG0 0x68
+#define XLP_BLKID_MAP_DEBUG_READ_REG1 0x6c
+
+#endif /* __NLM_CPUCONTROL_H__ */
diff --git a/sys/mips/nlm/hal/fmn.c b/sys/mips/nlm/hal/fmn.c
new file mode 100644
index 0000000..fd4f7c8
--- /dev/null
+++ b/sys/mips/nlm/hal/fmn.c
@@ -0,0 +1,789 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/fmn.h>
+#include <sys/systm.h>
+
+uint32_t bad_xlp_num_nodes = 4;
+/* XLP can take upto 16K of FMN messages per hardware queue, as spill.
+* But, configuring all 16K causes the total spill memory to required
+* to blow upto 192MB for single chip configuration, and 768MB in four
+* chip configuration. Hence for now, we will setup the per queue spill
+* as 1K FMN messages. With this, the total spill memory needed for 1024
+* hardware queues (with 12bytes per single entry FMN message) becomes
+* (1*1024)*12*1024queues = 12MB. For the four chip config, the memory
+* needed = 12 * 4 = 48MB.
+*/
+uint64_t nlm_cms_spill_total_messages = 1 * 1024;
+
+/* On a XLP832, we have the following FMN stations:
+* CPU stations: 8
+* PCIE0 stations: 1
+* PCIE1 stations: 1
+* PCIE2 stations: 1
+* PCIE3 stations: 1
+* GDX stations: 1
+* CRYPTO stations: 1
+* RSA stations: 1
+* CMP stations: 1
+* POE stations: 1
+* NAE stations: 1
+* ==================
+* Total : 18 stations per chip
+*
+* For all 4 nodes, there are 18*4 = 72 FMN stations
+*/
+uint32_t nlm_cms_total_stations = 18 * 4 /*xlp_num_nodes*/;
+uint32_t cms_onchip_seg_availability[XLP_CMS_ON_CHIP_PER_QUEUE_SPACE];
+
+int nlm_cms_verify_credit_config (int spill_en, int tot_credit)
+{
+ /* Note: In XLP there seem to be no mechanism to read back
+ * the credit count that has been programmed into a sid / did pair;
+ * since we have only one register 0x2000 to read.
+ * Hence it looks like all credit mgmt/verification needs to
+ * be done by software. Software could keep track of total credits
+ * getting programmed and verify it from this function.
+ */
+
+ if (spill_en) {
+ /* TODO */
+ }
+
+ if (tot_credit > (XLP_CMS_ON_CHIP_MESG_SPACE*bad_xlp_num_nodes))
+ return 1; /* credits overflowed - should not happen */
+
+ return 0;
+}
+
+/**
+ * Takes inputs as node, queue_size and maximum number of queues.
+ * Calculates the base, start & end and returns the same for a
+ * defined qid.
+ *
+ * The output queues are maintained in the internal output buffer
+ * which is a on-chip SRAM structure. For the actial hardware
+ * internal implementation, It is a structure which consists
+ * of eight banks of 4096-entry x message-width SRAMs. The SRAM
+ * implementation is designed to run at 1GHz with a 1-cycle read/write
+ * access. A read/write transaction can be initiated for each bank
+ * every cycle for a total of eight accesses per cycle. Successive
+ * entries of the same output queue are placed in successive banks.
+ * This is done to spread different read & write accesses to same/different
+ * output queue over as many different banks as possible so that they
+ * can be scheduled concurrently. Spreading the accesses to as many banks
+ * as possible to maximize the concurrency internally is important for
+ * achieving the desired peak throughput. This is done by h/w implementation
+ * itself.
+ *
+ * Output queues are allocated from this internal output buffer by
+ * software. The total capacity of the output buffer is 32K-entry.
+ * Each output queue can be sized from 32-entry to 1024-entry in
+ * increments of 32-entry. This is done by specifying a Start & a
+ * End pointer: pointers to the first & last 32-entry chunks allocated
+ * to the output queue.
+ *
+ * To optimize the storage required for 1024 OQ pointers, the upper 5-bits
+ * are shared by the Start & the End pointer. The side-effect of this
+ * optimization is that an OQ can't cross a 1024-entry boundary. Also, the
+ * lower 5-bits don't need to be specified in the Start & the End pointer
+ * as the allocation is in increments of 32-entries.
+ *
+ * Queue occupancy is tracked by a Head & a Tail pointer. Tail pointer
+ * indicates the location to which next entry will be written & Head
+ * pointer indicates the location from which next entry will be read. When
+ * these pointers reach the top of the allocated space (indicated by the
+ * End pointer), they are reset to the bottom of the allocated space
+ * (indicated by the Start pointer).
+ *
+ * Output queue pointer information:
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * 14 10 9 5 4 0
+ * ------------------
+ * | base ptr |
+ * ------------------
+ * ----------------
+ * | start ptr |
+ * ----------------
+ * ----------------
+ * | end ptr |
+ * ----------------
+ * ------------------------------------
+ * | head ptr |
+ * ------------------------------------
+ * ------------------------------------
+ * | tail ptr |
+ * ------------------------------------
+ * Note:
+ * A total of 1024 segments can sit on one software-visible "bank"
+ * of internal SRAM. Each segment contains 32 entries. Also note
+ * that sw-visible "banks" are not the same as the actual internal
+ * 8-bank implementation of hardware. It is an optimization of
+ * internal access.
+ *
+ */
+
+void nlm_cms_setup_credits(uint64_t base, int destid, int srcid, int credit)
+{
+ uint32_t val;
+
+ val = ((credit << 24) | (destid << 12) | (srcid << 0));
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CREDIT_CFG_REG, val);
+
+}
+
+int nlm_cms_config_onchip_queue (uint64_t base, uint64_t spill_base,
+ int qid, int spill_en)
+{
+
+ /* Configure 32 as onchip queue depth */
+ nlm_cms_alloc_onchip_q(base, qid, 1);
+
+ /* Spill configuration */
+ if (spill_en) {
+ /* Configure 4*4KB = 16K as spill size */
+ nlm_cms_alloc_spill_q(base, qid, spill_base, 4);
+ }
+
+#if 0
+ /* configure credits for src cpu0, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU0_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu1, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU1_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu2, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU2_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu3, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU3_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu4, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU4_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu5, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU5_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu6, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU6_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cpu7, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CPU7_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie0, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE0_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie1, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE1_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie2, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE2_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src pcie3, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE3_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src dte, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_DTE_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src rsa_ecc, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_RSA_ECC_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src crypto, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CRYPTO_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src cmp, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_CMP_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src poe, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_POE_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+
+ /* configure credits for src nae, on this queue */
+ nlm_cms_setup_credits(base, qid, XLP_CMS_NAE_SRC_STID,
+ XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations,
+ nlm_cms_spill_total_messages));
+#endif
+
+ return 0;
+}
+
+/*
+ * base - CMS module base address for this node.
+ * qid - is the output queue id otherwise called as vc id
+ * spill_base - is the 40-bit physical address of spill memory. Must be
+ 4KB aligned.
+ * nsegs - No of segments where a "1" indicates 4KB. Spill size must be
+ * a multiple of 4KB.
+ */
+int nlm_cms_alloc_spill_q(uint64_t base, int qid, uint64_t spill_base,
+ int nsegs)
+{
+ uint64_t queue_config;
+ uint32_t spill_start;
+
+ if(nsegs > XLP_CMS_MAX_SPILL_SEGMENTS_PER_QUEUE) {
+ return 1;
+ }
+
+ queue_config = nlm_rdreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)));
+
+ spill_start = ((spill_base >> 12) & 0x3F);
+ /* Spill configuration */
+ queue_config = (((uint64_t)XLP_CMS_SPILL_ENA << 62) |
+ (((spill_base >> 18) & 0x3FFFFF) << 27) |
+ (spill_start + nsegs - 1) << 21 |
+ (spill_start << 15));
+
+ nlm_wreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)),queue_config);
+
+ return 0;
+}
+
+/*
+ * base - CMS module base address for this node.
+ * qid - is the output queue id otherwise called as vc id
+ * nsegs - No of segments where a "1" indicates 32 credits. On chip
+ * credits must be a multiple of 32.
+ */
+int nlm_cms_alloc_onchip_q(uint64_t base, int qid, int nsegs)
+{
+ static uint32_t curr_end = 0;
+ uint64_t queue_config;
+ int onchipbase, start, last;
+ uint8_t i;
+
+ if( ((curr_end + nsegs) > XLP_CMS_MAX_ONCHIP_SEGMENTS) ||
+ (nsegs > XLP_CMS_ON_CHIP_PER_QUEUE_SPACE) ) {
+ /* Invalid configuration */
+ return 1;
+ }
+ if(((curr_end % 32) + nsegs - 1) <= 31) {
+ onchipbase = (curr_end / 32);
+ start = (curr_end % 32);
+ curr_end += nsegs;
+ } else {
+ onchipbase = (curr_end / 32) + 1;
+ start = 0;
+ curr_end = ((onchipbase * 32) + nsegs);
+ }
+ last = start + nsegs - 1;
+
+ for(i = start;i <= last;i++) {
+ if(cms_onchip_seg_availability[onchipbase] & (1 << i)) {
+ /* Conflict!!! segment is already allocated */
+ return 1;
+ }
+ }
+ /* Update the availability bitmap as consumed */
+ for(i = start; i <= last; i++) {
+ cms_onchip_seg_availability[onchipbase] |= (1 << i);
+ }
+
+ queue_config = nlm_rdreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)));
+
+ /* On chip configuration */
+ queue_config = (((uint64_t)XLP_CMS_QUEUE_ENA << 63) |
+ ((onchipbase & 0x1f) << 10) |
+ ((last & 0x1f) << 5) |
+ (start & 0x1f));
+
+ nlm_wreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)),queue_config);
+
+ return 0;
+}
+
+void nlm_cms_default_setup(int node, uint64_t spill_base, int spill_en,
+ int popq_en)
+{
+ int j, k, vc;
+ int queue;
+ uint64_t base;
+
+ base = nlm_regbase_cms(node);
+ for(j=0; j<1024; j++) {
+ printf("Qid:0x%04d Val:0x%016jx\n",j, (uintmax_t)nlm_cms_get_onchip_queue (base, j));
+ }
+ /* Enable all cpu push queues */
+ for (j=0; j<XLP_MAX_CORES; j++)
+ for (k=0; k<XLP_MAX_THREADS; k++)
+ for (vc=0; vc<XLP_CMS_MAX_VCPU_VC; vc++) {
+ /* TODO : remove this once SMP works */
+ if( (j == 0) && (k == 0) )
+ continue;
+ queue = XLP_CMS_CPU_PUSHQ(node, j, k, vc);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 0 push queue */
+ for (j=XLP_CMS_PCIE0_QID(0); j<XLP_CMS_PCIE0_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 1 push queue */
+ for (j=XLP_CMS_PCIE1_QID(0); j<XLP_CMS_PCIE1_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 2 push queue */
+ for (j=XLP_CMS_PCIE2_QID(0); j<XLP_CMS_PCIE2_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable pcie 3 push queue */
+ for (j=XLP_CMS_PCIE3_QID(0); j<XLP_CMS_PCIE3_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable DTE push queue */
+ for (j=XLP_CMS_DTE_QID(0); j<XLP_CMS_DTE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable RSA/ECC push queue */
+ for (j=XLP_CMS_RSA_ECC_QID(0); j<XLP_CMS_RSA_ECC_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable crypto push queue */
+ for (j=XLP_CMS_CRYPTO_QID(0); j<XLP_CMS_CRYPTO_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable CMP push queue */
+ for (j=XLP_CMS_CMP_QID(0); j<XLP_CMS_CMP_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable POE push queue */
+ for (j=XLP_CMS_POE_QID(0); j<XLP_CMS_POE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable NAE push queue */
+ for (j=XLP_CMS_NAE_QID(0); j<XLP_CMS_NAE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue, spill_en);
+ }
+
+ /* Enable all pop queues */
+ if (popq_en) {
+ for (j=XLP_CMS_POPQ_QID(0); j<XLP_CMS_POPQ_MAXQID; j++) {
+ queue = XLP_CMS_POPQ(node, j);
+ nlm_cms_config_onchip_queue(base, spill_base, queue,
+ spill_en);
+ }
+ }
+}
+
+uint64_t nlm_cms_get_onchip_queue (uint64_t base, int qid)
+{
+ return nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+}
+
+void nlm_cms_set_onchip_queue (uint64_t base, int qid, uint64_t val)
+{
+ uint64_t rdval;
+
+ rdval = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+ rdval |= val;
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), rdval);
+}
+
+void nlm_cms_per_queue_level_intr(uint64_t base, int qid, int sub_type,
+ int intr_val)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+
+ val |= (((uint64_t)sub_type<<54) |
+ ((uint64_t)intr_val<<56));
+
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val);
+}
+
+void nlm_cms_level_intr(int node, int sub_type, int intr_val)
+{
+ int j, k, vc;
+ int queue;
+ uint64_t base;
+
+ base = nlm_regbase_cms(node);
+ /* setup level intr config on all cpu push queues */
+ for (j=0; j<XLP_MAX_CORES; j++)
+ for (k=0; k<XLP_MAX_THREADS; k++)
+ for (vc=0; vc<XLP_CMS_MAX_VCPU_VC; vc++) {
+ queue = XLP_CMS_CPU_PUSHQ(node, j, k, vc);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 0 push queue */
+ for (j=XLP_CMS_PCIE0_QID(0); j<XLP_CMS_PCIE0_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 1 push queue */
+ for (j=XLP_CMS_PCIE1_QID(0); j<XLP_CMS_PCIE1_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 2 push queue */
+ for (j=XLP_CMS_PCIE2_QID(0); j<XLP_CMS_PCIE2_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pcie 3 push queue */
+ for (j=XLP_CMS_PCIE3_QID(0); j<XLP_CMS_PCIE3_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all DTE push queue */
+ for (j=XLP_CMS_DTE_QID(0); j<XLP_CMS_DTE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all RSA/ECC push queue */
+ for (j=XLP_CMS_RSA_ECC_QID(0); j<XLP_CMS_RSA_ECC_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all crypto push queue */
+ for (j=XLP_CMS_CRYPTO_QID(0); j<XLP_CMS_CRYPTO_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all CMP push queue */
+ for (j=XLP_CMS_CMP_QID(0); j<XLP_CMS_CMP_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all POE push queue */
+ for (j=XLP_CMS_POE_QID(0); j<XLP_CMS_POE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all NAE push queue */
+ for (j=XLP_CMS_NAE_QID(0); j<XLP_CMS_NAE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup level intr config on all pop queues */
+ for (j=XLP_CMS_POPQ_QID(0); j<XLP_CMS_POPQ_MAXQID; j++) {
+ queue = XLP_CMS_POPQ(node, j);
+ nlm_cms_per_queue_level_intr(base, queue, sub_type, intr_val);
+ }
+}
+
+void nlm_cms_per_queue_timer_intr(uint64_t base, int qid, int sub_type,
+ int intr_val)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+
+ val |= (((uint64_t)sub_type<<49) |
+ ((uint64_t)intr_val<<51));
+
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val);
+}
+
+void nlm_cms_timer_intr(int node, int en, int sub_type, int intr_val)
+{
+ int j, k, vc;
+ int queue;
+ uint64_t base;
+
+ base = nlm_regbase_cms(node);
+ /* setup timer intr config on all cpu push queues */
+ for (j=0; j<XLP_MAX_CORES; j++)
+ for (k=0; k<XLP_MAX_THREADS; k++)
+ for (vc=0; vc<XLP_CMS_MAX_VCPU_VC; vc++) {
+ queue = XLP_CMS_CPU_PUSHQ(node, j, k, vc);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 0 push queue */
+ for (j=XLP_CMS_PCIE0_QID(0); j<XLP_CMS_PCIE0_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 1 push queue */
+ for (j=XLP_CMS_PCIE1_QID(0); j<XLP_CMS_PCIE1_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 2 push queue */
+ for (j=XLP_CMS_PCIE2_QID(0); j<XLP_CMS_PCIE2_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pcie 3 push queue */
+ for (j=XLP_CMS_PCIE3_QID(0); j<XLP_CMS_PCIE3_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all DTE push queue */
+ for (j=XLP_CMS_DTE_QID(0); j<XLP_CMS_DTE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all RSA/ECC push queue */
+ for (j=XLP_CMS_RSA_ECC_QID(0); j<XLP_CMS_RSA_ECC_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all crypto push queue */
+ for (j=XLP_CMS_CRYPTO_QID(0); j<XLP_CMS_CRYPTO_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all CMP push queue */
+ for (j=XLP_CMS_CMP_QID(0); j<XLP_CMS_CMP_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all POE push queue */
+ for (j=XLP_CMS_POE_QID(0); j<XLP_CMS_POE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all NAE push queue */
+ for (j=XLP_CMS_NAE_QID(0); j<XLP_CMS_NAE_MAXQID; j++) {
+ queue = XLP_CMS_IO_PUSHQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+
+ /* setup timer intr config on all pop queues */
+ for (j=XLP_CMS_POPQ_QID(0); j<XLP_CMS_POPQ_MAXQID; j++) {
+ queue = XLP_CMS_POPQ(node, j);
+ nlm_cms_per_queue_timer_intr(base, queue, sub_type, intr_val);
+ }
+}
+
+/* returns 1 if interrupt has been generated for this output queue */
+int nlm_cms_outputq_intr_check(uint64_t base, int qid)
+{
+ uint64_t val;
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+
+ return ((val >> 59) & 0x1);
+}
+
+void nlm_cms_outputq_clr_intr(uint64_t base, int qid)
+{
+ uint64_t val;
+ val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid));
+ val |= (1ULL<<59);
+ nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val);
+}
+
+void nlm_cms_illegal_dst_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<8);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_timeout_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<7);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_biu_error_resp_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<6);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_spill_uncorrectable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<5) | (en<<3);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_spill_correctable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<4) | (en<<2);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_outputq_uncorrectable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<1);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_outputq_correctable_ecc_error_intr(uint64_t base, int en)
+{
+ uint64_t val;
+
+ val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG);
+ val |= (en<<0);
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+uint64_t nlm_cms_network_error_status(uint64_t base)
+{
+ return nlm_rdreg_cms(base, XLP_CMS_MSG_ERR_REG);
+}
+
+int nlm_cms_get_net_error_code(uint64_t err)
+{
+ return ((err >> 12) & 0xf);
+}
+
+int nlm_cms_get_net_error_syndrome(uint64_t err)
+{
+ return ((err >> 32) & 0x1ff);
+}
+
+int nlm_cms_get_net_error_ramindex(uint64_t err)
+{
+ return ((err >> 44) & 0x7fff);
+}
+
+int nlm_cms_get_net_error_outputq(uint64_t err)
+{
+ return ((err >> 16) & 0xfff);
+}
+
+/*========================= FMN Tracing related APIs ================*/
+
+void nlm_cms_trace_setup(uint64_t base, int en, uint64_t trace_base,
+ uint64_t trace_limit, int match_dstid_en,
+ int dst_id, int match_srcid_en, int src_id,
+ int wrap)
+{
+ uint64_t val;
+
+ nlm_wreg_cms(base, XLP_CMS_TRACE_BASE_ADDR_REG, trace_base);
+ nlm_wreg_cms(base, XLP_CMS_TRACE_LIMIT_ADDR_REG, trace_limit);
+
+ val = nlm_rdreg_cms(base, XLP_CMS_TRACE_CONFIG_REG);
+ val |= (((uint64_t)match_dstid_en << 39) |
+ ((dst_id & 0xfff) << 24) |
+ (match_srcid_en << 23) |
+ ((src_id & 0xfff) << 8) |
+ (wrap << 1) |
+ (en << 0));
+ nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val);
+}
+
+void nlm_cms_endian_byte_swap (uint64_t base, int en)
+{
+ nlm_wreg_cms(base, XLP_CMS_MSG_ENDIAN_SWAP_REG, en);
+}
diff --git a/sys/mips/nlm/hal/fmn.h b/sys/mips/nlm/hal/fmn.h
new file mode 100644
index 0000000..75fc774
--- /dev/null
+++ b/sys/mips/nlm/hal/fmn.h
@@ -0,0 +1,275 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_FMNV2_H__
+#define __NLM_FMNV2_H__
+
+/**
+* @file_name fmn.h
+* @author Netlogic Microsystems
+* @brief HAL for Fast message network V2
+*/
+
+/* FMN configuration registers */
+#define XLP_CMS_OUTPUTQ_CONFIG_REG(i) ((i)*2)
+#define XLP_CMS_MAX_OUTPUTQ 1024
+#define XLP_CMS_OUTPUTQ_CREDIT_CFG_REG (0x2000/4)
+#define XLP_CMS_MSG_CONFIG_REG (0x2008/4)
+#define XLP_CMS_MSG_ERR_REG (0x2010/4)
+#define XLP_CMS_TRACE_CONFIG_REG (0x2018/4)
+#define XLP_CMS_TRACE_BASE_ADDR_REG (0x2020/4)
+#define XLP_CMS_TRACE_LIMIT_ADDR_REG (0x2028/4)
+#define XLP_CMS_TRACE_CURRENT_ADDR_REG (0x2030/4)
+#define XLP_CMS_MSG_ENDIAN_SWAP_REG (0x2038/4)
+
+#define XLP_CMS_CPU_PUSHQ(node, core, thread, vc) \
+ (((node)<<10) | ((core)<<4) | ((thread)<<2) | ((vc)<<0))
+#define XLP_CMS_POPQ(node, queue) (((node)<<10) | (queue))
+#define XLP_CMS_IO_PUSHQ(node, queue) (((node)<<10) | (queue))
+
+#define XLP_CMS_POPQ_QID(i) (128+(i))
+#define XLP_CMS_POPQ_MAXQID 255
+#define XLP_CMS_PCIE0_QID(i) (256+(i))
+#define XLP_CMS_PCIE0_MAXQID 257
+#define XLP_CMS_PCIE1_QID(i) (258+(i))
+#define XLP_CMS_PCIE1_MAXQID 259
+#define XLP_CMS_PCIE2_QID(i) (260+(i))
+#define XLP_CMS_PCIE2_MAXQID 261
+#define XLP_CMS_PCIE3_QID(i) (262+(i))
+#define XLP_CMS_PCIE3_MAXQID 263
+#define XLP_CMS_DTE_QID(i) (264+(i))
+#define XLP_CMS_DTE_MAXQID 267
+#define XLP_CMS_RSA_ECC_QID(i) (272+(i))
+#define XLP_CMS_RSA_ECC_MAXQID 280
+#define XLP_CMS_CRYPTO_QID(i) (281+(i))
+#define XLP_CMS_CRYPTO_MAXQID 296
+/* TODO PCI header register 0x3C says CMP starts at 297(0x129) VERIFY */
+#define XLP_CMS_CMP_QID(i) (298+(i))
+#define XLP_CMS_CMP_MAXQID 305
+#define XLP_CMS_POE_QID(i) (384+(i))
+#define XLP_CMS_POE_MAXQID 391
+#define XLP_CMS_NAE_QID(i) (476+(i))
+#define XLP_CMS_NAE_MAXQID 1023
+
+#define XLP_CMS_NAE_TX_VC_BASE 476
+#define XLP_CMS_NAE_TX_VC_LIMIT 999
+#define XLP_CMS_NAE_RX_VC_BASE 1000
+#define XLP_CMS_NAE_RX_VC_LIMIT 1019
+
+#define XLP_MAX_CMS_QUEUES 1024
+
+/* FMN Level Interrupt Type */
+#define XLP_CMS_LVL_INTR_DISABLE 0
+#define XLP_CMS_LVL_LOW_WATERMARK 1
+#define XLP_CMS_LVL_HI_WATERMARK 2
+
+/* FMN Level interrupt trigger values */
+#define XLP_CMS_QUEUE_NON_EMPTY 0
+#define XLP_CMS_QUEUE_QUARTER_FULL 1
+#define XLP_CMS_QUEUE_HALF_FULL 2
+#define XLP_CMS_QUEUE_THREE_QUARTER_FULL 3
+#define XLP_CMS_QUEUE_FULL 4
+
+/* FMN Timer Interrupt Type */
+#define XLP_CMS_TIMER_INTR_DISABLE 0
+#define XLP_CMS_TIMER_CONSUMER 1
+#define XLP_CMS_TIMER_PRODUCER 1
+
+/* FMN timer interrupt trigger values */
+#define XLP_CMS_TWO_POW_EIGHT_CYCLES 0
+#define XLP_CMS_TWO_POW_TEN_CYCLES 1
+#define XLP_CMS_TWO_POW_TWELVE_CYCLES 2
+#define XLP_CMS_TWO_POW_FOURTEEN_CYCLES 3
+#define XLP_CMS_TWO_POW_SIXTEEN_CYCLES 4
+#define XLP_CMS_TWO_POW_EIGHTTEEN_CYCLES 5
+#define XLP_CMS_TWO_POW_TWENTY_CYCLES 6
+#define XLP_CMS_TWO_POW_TWENTYTWO_CYCLES 7
+
+#define XLP_CMS_QUEUE_ENA 1ULL
+#define XLP_CMS_QUEUE_DIS 0
+#define XLP_CMS_SPILL_ENA 1ULL
+#define XLP_CMS_SPILL_DIS 0
+
+#define XLP_CMS_MAX_VCPU_VC 4
+
+/* Each XLP chip can hold upto 32K messages on the chip itself */
+#define XLP_CMS_ON_CHIP_MESG_SPACE (32*1024)
+#define XLP_CMS_ON_CHIP_PER_QUEUE_SPACE \
+ ((XLP_CMS_ON_CHIP_MESG_SPACE)/(XLP_MAX_CMS_QUEUES))
+#define XLP_CMS_MAX_ONCHIP_SEGMENTS 1024
+#define XLP_CMS_MAX_SPILL_SEGMENTS_PER_QUEUE 64
+
+/* FMN Network error */
+#define XLP_CMS_ILLEGAL_DST_ERROR 0x100
+#define XLP_CMS_BIU_TIMEOUT_ERROR 0x080
+#define XLP_CMS_BIU_ERROR 0x040
+#define XLP_CMS_SPILL_FILL_UNCORRECT_ECC_ERROR 0x020
+#define XLP_CMS_SPILL_FILL_CORRECT_ECC_ERROR 0x010
+#define XLP_CMS_SPILL_UNCORRECT_ECC_ERROR 0x008
+#define XLP_CMS_SPILL_CORRECT_ECC_ERROR 0x004
+#define XLP_CMS_OUTPUTQ_UNCORRECT_ECC_ERROR 0x002
+#define XLP_CMS_OUTPUTQ_CORRECT_ECC_ERROR 0x001
+
+/* worst case, a single entry message consists of a 4 byte header
+ * and an 8-byte entry = 12 bytes in total
+ */
+#define XLP_CMS_SINGLE_ENTRY_MSG_SIZE 12
+/* total spill memory needed for one FMN queue */
+#define XLP_CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs) \
+ ((spilltotmsgs) * (XLP_CMS_SINGLE_ENTRY_MSG_SIZE))
+/* total spill memory needed */
+#define XLP_CMS_TOTAL_SPILL_MEM(spilltotmsgs) \
+ ((XLP_CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs)) * \
+ (XLP_MAX_CMS_QUEUES))
+/* total number of FMN messages possible in a queue */
+#define XLP_CMS_TOTAL_QUEUE_SIZE(spilltotmsgs) \
+ ((spilltotmsgs) + (XLP_CMS_ON_CHIP_PER_QUEUE_SPACE))
+
+/* FMN Src station id's */
+#define XLP_CMS_CPU0_SRC_STID (0 << 4)
+#define XLP_CMS_CPU1_SRC_STID (1 << 4)
+#define XLP_CMS_CPU2_SRC_STID (2 << 4)
+#define XLP_CMS_CPU3_SRC_STID (3 << 4)
+#define XLP_CMS_CPU4_SRC_STID (4 << 4)
+#define XLP_CMS_CPU5_SRC_STID (5 << 4)
+#define XLP_CMS_CPU6_SRC_STID (6 << 4)
+#define XLP_CMS_CPU7_SRC_STID (7 << 4)
+#define XLP_CMS_PCIE0_SRC_STID 256
+#define XLP_CMS_PCIE1_SRC_STID 258
+#define XLP_CMS_PCIE2_SRC_STID 260
+#define XLP_CMS_PCIE3_SRC_STID 262
+#define XLP_CMS_DTE_SRC_STID 264
+#define XLP_CMS_RSA_ECC_SRC_STID 272
+#define XLP_CMS_CRYPTO_SRC_STID 281
+#define XLP_CMS_CMP_SRC_STID 298
+#define XLP_CMS_POE_SRC_STID 384
+#define XLP_CMS_NAE_SRC_STID 476
+#if 0
+#define XLP_CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) \
+ ((XLP_CMS_TOTAL_QUEUE_SIZE(spilltotmsgs)) / \
+ (cmstotstns))
+#endif
+#define XLP_CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) 8
+
+/* POPQ related defines */
+#define XLP_CMS_POPQID_START 128
+#define XLP_CMS_POPQID_END 255
+
+#define XLP_CMS_INT_RCVD 0x800000000000000ULL
+
+#define nlm_rdreg_cms(b, r) nlm_read_reg64_xkseg(b,r)
+#define nlm_wreg_cms(b, r, v) nlm_write_reg64_xkseg(b,r,v)
+#define nlm_pcibase_cms(node) nlm_pcicfg_base(XLP_IO_CMS_OFFSET(node))
+#define nlm_regbase_cms(node) nlm_pcibar0_base_xkphys(nlm_pcibase_cms(node))
+
+enum fmn_swcode {
+ FMN_SWCODE_CPU0=1,
+ FMN_SWCODE_CPU1,
+ FMN_SWCODE_CPU2,
+ FMN_SWCODE_CPU3,
+ FMN_SWCODE_CPU4,
+ FMN_SWCODE_CPU5,
+ FMN_SWCODE_CPU6,
+ FMN_SWCODE_CPU7,
+ FMN_SWCODE_CPU8,
+ FMN_SWCODE_CPU9,
+ FMN_SWCODE_CPU10,
+ FMN_SWCODE_CPU11,
+ FMN_SWCODE_CPU12,
+ FMN_SWCODE_CPU13,
+ FMN_SWCODE_CPU14,
+ FMN_SWCODE_CPU15,
+ FMN_SWCODE_CPU16,
+ FMN_SWCODE_CPU17,
+ FMN_SWCODE_CPU18,
+ FMN_SWCODE_CPU19,
+ FMN_SWCODE_CPU20,
+ FMN_SWCODE_CPU21,
+ FMN_SWCODE_CPU22,
+ FMN_SWCODE_CPU23,
+ FMN_SWCODE_CPU24,
+ FMN_SWCODE_CPU25,
+ FMN_SWCODE_CPU26,
+ FMN_SWCODE_CPU27,
+ FMN_SWCODE_CPU28,
+ FMN_SWCODE_CPU29,
+ FMN_SWCODE_CPU30,
+ FMN_SWCODE_CPU31,
+ FMN_SWCODE_CPU32,
+ FMN_SWCODE_PCIE0,
+ FMN_SWCODE_PCIE1,
+ FMN_SWCODE_PCIE2,
+ FMN_SWCODE_PCIE3,
+ FMN_SWCODE_DTE,
+ FMN_SWCODE_CRYPTO,
+ FMN_SWCODE_RSA,
+ FMN_SWCODE_CMP,
+ FMN_SWCODE_POE,
+ FMN_SWCODE_NAE,
+};
+
+extern uint64_t nlm_cms_spill_total_messages;
+extern uint32_t nlm_cms_total_stations;
+extern uint32_t cms_onchip_seg_availability[XLP_CMS_ON_CHIP_PER_QUEUE_SPACE];
+
+extern uint64_t cms_base_addr(int node);
+extern int nlm_cms_verify_credit_config (int spill_en, int tot_credit);
+extern int nlm_cms_get_oc_space(int qsize, int max_queues, int qid, int *ocbase, int *ocstart, int *ocend);
+extern void nlm_cms_setup_credits (uint64_t base, int destid, int srcid, int credit);
+extern int nlm_cms_config_onchip_queue (uint64_t base, uint64_t cms_spill_base, int qid, int spill_en);
+extern void nlm_cms_default_setup(int node, uint64_t spill_base, int spill_en, int popq_en);
+extern uint64_t nlm_cms_get_onchip_queue (uint64_t base, int qid);
+extern void nlm_cms_set_onchip_queue (uint64_t base, int qid, uint64_t val);
+extern void nlm_cms_per_queue_level_intr(uint64_t base, int qid, int sub_type, int intr_val);
+extern void nlm_cms_level_intr(int node, int sub_type, int intr_val);
+extern void nlm_cms_per_queue_timer_intr(uint64_t base, int qid, int sub_type, int intr_val);
+extern void nlm_cms_timer_intr(int node, int en, int sub_type, int intr_val);
+extern int nlm_cms_outputq_intr_check(uint64_t base, int qid);
+extern void nlm_cms_outputq_clr_intr(uint64_t base, int qid);
+extern void nlm_cms_illegal_dst_error_intr(uint64_t base, int en);
+extern void nlm_cms_timeout_error_intr(uint64_t base, int en);
+extern void nlm_cms_biu_error_resp_intr(uint64_t base, int en);
+extern void nlm_cms_spill_uncorrectable_ecc_error_intr(uint64_t base, int en);
+extern void nlm_cms_spill_correctable_ecc_error_intr(uint64_t base, int en);
+extern void nlm_cms_outputq_uncorrectable_ecc_error_intr(uint64_t base, int en);
+extern void nlm_cms_outputq_correctable_ecc_error_intr(uint64_t base, int en);
+extern uint64_t nlm_cms_network_error_status(uint64_t base);
+extern int nlm_cms_get_net_error_code(uint64_t err);
+extern int nlm_cms_get_net_error_syndrome(uint64_t err);
+extern int nlm_cms_get_net_error_ramindex(uint64_t err);
+extern int nlm_cms_get_net_error_outputq(uint64_t err);
+extern void nlm_cms_trace_setup(uint64_t base, int en, uint64_t trace_base, uint64_t trace_limit, int match_dstid_en, int dst_id, int match_srcid_en, int src_id, int wrap);
+extern void nlm_cms_endian_byte_swap (uint64_t base, int en);
+extern uint8_t xlp_msg_send(uint8_t vc, uint8_t size);
+extern int nlm_cms_alloc_spill_q(uint64_t base, int qid, uint64_t spill_base,
+ int nsegs);
+extern int nlm_cms_alloc_onchip_q(uint64_t base, int qid, int nsegs);
+
+#endif
diff --git a/sys/mips/nlm/hal/iomap.h b/sys/mips/nlm/hal/iomap.h
new file mode 100644
index 0000000..e11dcdd
--- /dev/null
+++ b/sys/mips/nlm/hal/iomap.h
@@ -0,0 +1,237 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_IOMAP_H__
+#define __NLM_IOMAP_H__
+
+/**
+* @file_name xlpiomap.h
+* @author Netlogic Microsystems
+* @brief Basic definitions Netlogic XLP IO BASEs
+*/
+
+/* ----------------------------------
+ * XLP RESET Physical Address Map
+ * ----------------------------------
+ * PCI ECFG : 0x18000000 - 0x1bffffff
+ * PCI CFG : 0x1c000000 - 0x1cffffff
+ * FLASH : 0x1fc00000 - 0x1fffffff
+ * ----------------------------------
+ */
+
+#define XLP_DEFAULT_IO_BASE 0x18000000
+#define XLP_DEFAULT_IO_BASE_KSEG1 0xb8000000
+#define XLP_IO_SIZE (64 << 20) /* Size of the ECFG Space */
+#define XLP_IO_PCI_HDRSZ 0x100
+#define XLP_IO_DEV(node, dev) ((dev) + (node) * 8)
+#define XLP_HDR_OFFSET(node, bus, dev, fn) (((bus) << 20) | \
+ ((XLP_IO_DEV(node, dev)) << 15) | ((fn) << 12))
+
+#define XLP_IO_BRIDGE_OFFSET(node) XLP_HDR_OFFSET(node,0,0,0)
+/* coherent inter chip */
+#define XLP_IO_CIC0_OFFSET(node) XLP_HDR_OFFSET(node,0,0,1)
+#define XLP_IO_CIC1_OFFSET(node) XLP_HDR_OFFSET(node,0,0,2)
+#define XLP_IO_CIC2_OFFSET(node) XLP_HDR_OFFSET(node,0,0,3)
+#define XLP_IO_PIC_OFFSET(node) XLP_HDR_OFFSET(node,0,0,4)
+
+#define XLP_IO_PCIE_OFFSET(node,i) XLP_HDR_OFFSET(node,0,1,i)
+#define XLP_IO_PCIE0_OFFSET(node) XLP_HDR_OFFSET(node,0,1,0)
+#define XLP_IO_PCIE1_OFFSET(node) XLP_HDR_OFFSET(node,0,1,1)
+#define XLP_IO_PCIE2_OFFSET(node) XLP_HDR_OFFSET(node,0,1,2)
+#define XLP_IO_PCIE3_OFFSET(node) XLP_HDR_OFFSET(node,0,1,3)
+
+#define XLP_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node,0,2,i)
+#define XLP_IO_USB_EHCI0_OFFSET(node) XLP_HDR_OFFSET(node,0,2,0)
+#define XLP_IO_USB_OHCI0_OFFSET(node) XLP_HDR_OFFSET(node,0,2,1)
+#define XLP_IO_USB_OHCI1_OFFSET(node) XLP_HDR_OFFSET(node,0,2,2)
+#define XLP_IO_USB_EHCI1_OFFSET(node) XLP_HDR_OFFSET(node,0,2,3)
+#define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node,0,2,4)
+#define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node,0,2,5)
+
+#define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node,0,3,0)
+#define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node,0,3,1)
+
+#define XLP_IO_CMS_OFFSET(node) XLP_HDR_OFFSET(node,0,4,0)
+
+#define XLP_IO_DMA_OFFSET(node) XLP_HDR_OFFSET(node,0,5,1)
+#define XLP_IO_SEC_OFFSET(node) XLP_HDR_OFFSET(node,0,5,2)
+#define XLP_IO_CMP_OFFSET(node) XLP_HDR_OFFSET(node,0,5,3)
+
+#define XLP_IO_UART_OFFSET(node, i) XLP_HDR_OFFSET(node,0,6,i)
+#define XLP_IO_UART0_OFFSET(node) XLP_HDR_OFFSET(node,0,6,0)
+#define XLP_IO_UART1_OFFSET(node) XLP_HDR_OFFSET(node,0,6,1)
+#define XLP_IO_I2C_OFFSET(node, i) XLP_HDR_OFFSET(node,0,6,2+i)
+#define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node,0,6,2)
+#define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node,0,6,3)
+#define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node,0,6,4)
+/* system management */
+#define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node,0,6,5)
+#define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node,0,6,6)
+
+#define XLP_IO_NOR_OFFSET(node) XLP_HDR_OFFSET(node,0,7,0)
+#define XLP_IO_NAND_OFFSET(node) XLP_HDR_OFFSET(node,0,7,1)
+#define XLP_IO_SPI_OFFSET(node) XLP_HDR_OFFSET(node,0,7,2)
+/* SD flash */
+#define XLP_IO_SD_OFFSET(node) XLP_HDR_OFFSET(node,0,7,3)
+#define XLP_IO_MMC_OFFSET(node, slot) ((XLP_IO_SD_OFFSET(node))+(slot*0x100)+XLP_IO_PCI_HDRSZ)
+/* PCI config header register id's */
+#define XLP_PCI_CFGREG0 0x00
+#define XLP_PCI_CFGREG1 0x01
+#define XLP_PCI_CFGREG2 0x02
+#define XLP_PCI_CFGREG3 0x03
+#define XLP_PCI_CFGREG4 0x04
+#define XLP_PCI_CFGREG5 0x05
+#define XLP_PCI_DEVINFO_REG0 0x30
+#define XLP_PCI_DEVINFO_REG1 0x31
+#define XLP_PCI_DEVINFO_REG2 0x32
+#define XLP_PCI_DEVINFO_REG3 0x33
+#define XLP_PCI_DEVINFO_REG4 0x34
+#define XLP_PCI_DEVINFO_REG5 0x35
+#define XLP_PCI_DEVINFO_REG6 0x36
+#define XLP_PCI_DEVINFO_REG7 0x37
+#define XLP_PCI_DEVSCRATCH_REG0 0x38
+#define XLP_PCI_DEVSCRATCH_REG1 0x39
+#define XLP_PCI_DEVSCRATCH_REG2 0x3a
+#define XLP_PCI_DEVSCRATCH_REG3 0x3b
+#define XLP_PCI_MSGSTN_REG 0x3c
+#define XLP_PCI_IRTINFO_REG 0x3d
+#define XLP_PCI_UCODEINFO_REG 0x3e
+#define XLP_PCI_SBB_WT_REG 0x3f
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#ifndef __NLM_NLMIO_H__
+#error iomap.h needs mmio.h to be included
+#endif
+
+static __inline__ uint32_t
+nlm_read_reg_kseg(uint64_t base, uint32_t reg)
+{
+ volatile uint32_t *addr = (volatile uint32_t *)(intptr_t)base + reg;
+
+ return (*addr);
+}
+
+static __inline__ void
+nlm_write_reg_kseg(uint64_t base, uint32_t reg, uint32_t val)
+{
+ volatile uint32_t *addr = (volatile uint32_t *)(intptr_t)base + reg;
+
+ *addr = val;
+}
+
+static __inline__ uint64_t
+nlm_read_reg64_kseg(uint64_t base, uint32_t reg)
+{
+ volatile uint64_t *addr = (volatile uint64_t *)(intptr_t)base + (reg >> 1);
+
+ return (nlm_load_dword(addr));
+}
+
+static __inline__ void
+nlm_write_reg64_kseg(uint64_t base, uint32_t reg, uint64_t val)
+{
+ volatile uint64_t *addr = (volatile uint64_t *)(intptr_t)base + (reg >> 1);
+
+ return (nlm_store_dword(addr, val));
+}
+
+/*
+ * Routines to store 32/64 bit values to 64 bit addresses,
+ * used when going thru XKPHYS to access registers
+ */
+static __inline__ uint32_t
+nlm_read_reg_xkseg(uint64_t base, uint32_t reg)
+{
+ uint64_t addr = base + reg * sizeof(uint32_t);
+
+ return (nlm_load_word_daddr(addr));
+}
+
+static __inline__ void
+nlm_write_reg_xkseg(uint64_t base, uint32_t reg, uint32_t val)
+{
+ uint64_t addr = base + reg * sizeof(uint32_t);
+
+ return (nlm_store_word_daddr(addr, val));
+}
+
+static __inline__ uint64_t
+nlm_read_reg64_xkseg(uint64_t base, uint32_t reg)
+{
+ uint64_t addr = base + (reg >> 1) * sizeof(uint64_t);
+
+ return (nlm_load_dword_daddr(addr));
+}
+
+static __inline__ void
+nlm_write_reg64_xkseg(uint64_t base, uint32_t reg, uint64_t val)
+{
+ uint64_t addr = base + (reg >> 1) * sizeof(uint64_t);
+
+ return (nlm_store_dword_daddr(addr, val));
+}
+
+/* Location where IO base is mapped */
+extern uint64_t nlm_pcicfg_baseaddr;
+
+static __inline__ uint64_t
+nlm_pcicfg_base(uint32_t devoffset)
+{
+ return (nlm_pcicfg_baseaddr + devoffset);
+}
+
+static __inline__ uint64_t
+nlm_pcibar0_base_xkphys(uint64_t pcibase)
+{
+ uint64_t paddr;
+
+ paddr = nlm_read_reg_kseg(pcibase, XLP_PCI_CFGREG4) & ~0xfu;
+ return (0x9000000000000000 | paddr);
+}
+#define nlm_pci_rdreg(b, r) nlm_read_reg_kseg(b, r)
+#define nlm_pci_wreg(b, r, v) nlm_write_reg_kseg(b, r, v)
+
+#endif /* !LOCORE && !__ASSEMBLY__*/
+
+
+/* COMPAT stuff - TODO remove */
+#define bit_set(p, m) ((p) |= (m))
+#define bit_clear(p, m) ((p) &= ~(m))
+#define bit_get(p,m) ((p) & (m))
+#define BIT(x) (0x01 << (x))
+
+#define XLP_MAX_NODES 4
+#define XLP_MAX_CORES 8
+#define XLP_MAX_THREADS 4
+#define XLP_CACHELINE_SIZE 64
+#define XLP_NUM_NODES 1 /* we support only one now */
+
+#endif
diff --git a/sys/mips/nlm/hal/mips-extns.h b/sys/mips/nlm/hal/mips-extns.h
new file mode 100644
index 0000000..7851b1b
--- /dev/null
+++ b/sys/mips/nlm/hal/mips-extns.h
@@ -0,0 +1,200 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_MIPS_EXTNS_H__
+#define __NLM_MIPS_EXTNS_H__
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+static __inline__ int32_t nlm_swapw(int32_t *loc, int32_t val)
+{
+ int32_t oldval = 0;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set noreorder\n"
+ "move $9, %2\n"
+ "move $8, %3\n"
+ ".word 0x71280014\n" /* "swapw $8, $9\n" */
+ "move %1, $8\n"
+ ".set pop\n"
+ : "+m" (*loc), "=r" (oldval)
+ : "r" (loc), "r" (val)
+ : "$8", "$9" );
+
+ return oldval;
+}
+
+static __inline__ uint32_t nlm_swapwu(int32_t *loc, uint32_t val)
+{
+ uint32_t oldval;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set noreorder\n"
+ "move $9, %2\n"
+ "move $8, %3\n"
+ ".word 0x71280015\n" /* "swapwu $8, $9\n" */
+ "move %1, $8\n"
+ ".set pop\n"
+ : "+m" (*loc), "=r" (oldval)
+ : "r" (loc), "r" (val)
+ : "$8", "$9" );
+
+ return oldval;
+}
+
+#if (__mips == 64)
+static __inline__ uint64_t nlm_swapd(int32_t *loc, uint64_t val)
+{
+ uint64_t oldval;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set noreorder\n"
+ "move $9, %2\n"
+ "move $8, %3\n"
+ ".word 0x71280014\n" /* "swapw $8, $9\n" */
+ "move %1, $8\n"
+ ".set pop\n"
+ : "+m" (*loc), "=r" (oldval)
+ : "r" (loc), "r" (val)
+ : "$8", "$9" );
+
+ return oldval;
+}
+#endif
+
+#if defined(__mips_n64) || defined(__mips_n32)
+static __inline uint64_t
+nlm_mfcr(uint32_t reg)
+{
+ uint64_t res;
+
+ __asm__ __volatile__(
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ "move $9, %1\n\t"
+ ".word 0x71280018\n\t" /* mfcr $8, $9 */
+ "move %0, $8\n\t"
+ ".set pop\n"
+ : "=r" (res) : "r"(reg)
+ : "$8", "$9"
+ );
+ return (res);
+}
+
+static __inline void
+nlm_mtcr(uint32_t reg, uint64_t value)
+{
+ __asm__ __volatile__(
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ "move $8, %0\n"
+ "move $9, %1\n"
+ ".word 0x71280019\n" /* mtcr $8, $9 */
+ ".set pop\n"
+ :
+ : "r" (value), "r" (reg)
+ : "$8", "$9"
+ );
+}
+
+#else /* !(defined(__mips_n64) || defined(__mips_n32)) */
+
+static __inline__ uint64_t
+nlm_mfcr(uint32_t reg)
+{
+ uint64_t hi;
+ uint64_t lo;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set mips64\n"
+ "move $8, %2\n"
+ ".word 0x71090018\n"
+ "nop \n"
+ "dsra32 %0, $9, 0\n"
+ "sll %1, $9, 0\n"
+ ".set pop\n"
+ : "=r"(hi), "=r"(lo)
+ : "r"(reg) : "$8", "$9");
+
+ return (((uint64_t)hi) << 32) | lo;
+}
+
+static __inline__ void
+nlm_mtcr(uint32_t reg, uint64_t val)
+{
+ uint32_t hi, lo;
+ hi = val >> 32;
+ lo = val & 0xffffffff;
+
+ __asm__ __volatile__ (
+ ".set push\n"
+ ".set mips64\n"
+ "move $9, %0\n"
+ "dsll32 $9, %1, 0\n"
+ "dsll32 $8, %0, 0\n"
+ "dsrl32 $9, $9, 0\n"
+ "or $9, $9, $8\n"
+ "move $8, %2\n"
+ ".word 0x71090019\n"
+ "nop \n"
+ ".set pop\n"
+ ::"r"(hi), "r"(lo), "r"(reg)
+ : "$8", "$9");
+}
+#endif /* (defined(__mips_n64) || defined(__mips_n32)) */
+
+/* dcrc2 */
+/* XLP additional instructions */
+
+/*
+ * Atomic increment a unsigned int
+ */
+static __inline unsigned int
+nlm_ldaddwu(unsigned int value, unsigned int *addr)
+{
+ __asm__ __volatile__(
+ ".set push\n"
+ ".set noreorder\n"
+ "move $8, %2\n"
+ "move $9, %3\n"
+ ".word 0x71280011\n" /* ldaddwu $8, $9 */
+ "move %0, $8\n"
+ ".set pop\n"
+ : "=&r"(value), "+m"(*addr)
+ : "0"(value), "r" ((unsigned long)addr)
+ : "$8", "$9");
+
+ return (value);
+}
+#endif
+#endif
diff --git a/sys/mips/nlm/hal/mmio.h b/sys/mips/nlm/hal/mmio.h
new file mode 100644
index 0000000..a19a867
--- /dev/null
+++ b/sys/mips/nlm/hal/mmio.h
@@ -0,0 +1,338 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_NLMIO_H__
+#define __NLM_NLMIO_H__
+
+#if !defined(__mips_n32) && !defined(__mips_n64)
+/*
+ * For o32 compilation, we have to disable interrupts and enable KX bit to
+ * access 64 bit addresses or data.
+ *
+ * We need to disable interrupts because we save just the lower 32 bits of
+ * registers in interrupt handling. So if we get hit by an interrupt while
+ * using the upper 32 bits of a register, we lose.
+ */
+static __inline__ uint32_t nlm_enable_kx(void)
+{
+ uint32_t sr;
+
+ __asm__ __volatile__(
+ "mfc0 %0, $12 \n\t" /* read status reg */
+ "move $8, %0 \n\t"
+ "ori $8, $8, 0x81 \n\t" /* set KX, and IE */
+ "xori $8, $8, 0x1 \n\t" /* flip IE */
+ "mtc0 $8, $12 \n\t" /* update status reg */
+ : "=r"(sr)
+ : : "$8");
+
+ return (sr);
+}
+
+static __inline__ void nlm_restore_kx(uint32_t sr)
+{
+ __asm__ __volatile__("mtc0 %0, $12" : : "r"(sr));
+}
+#endif
+
+static __inline__ uint32_t
+nlm_load_word(volatile uint32_t *addr)
+{
+ return (*addr);
+}
+
+static __inline__ void
+nlm_store_word(volatile uint32_t *addr, uint32_t val)
+{
+ *addr = val;
+}
+
+#if defined(__mips_n64) || defined(__mips_n32)
+static __inline__ uint64_t
+nlm_load_dword(volatile uint64_t *addr)
+{
+ return (*addr);
+}
+
+static __inline__ void
+nlm_store_dword(volatile uint64_t *addr, uint64_t val)
+{
+ *addr = val;
+}
+
+#else /* o32 */
+static __inline__ uint64_t
+nlm_load_dword(volatile uint64_t *addr)
+{
+ uint32_t valhi, vallo, sr;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "ld $8, 0(%2) \n\t"
+ "dsra32 %0, $8, 0 \n\t"
+ "sll %1, $8, 0 \n\t"
+ ".set pop \n"
+ : "=r"(valhi), "=r"(vallo)
+ : "r"(addr)
+ : "$8" );
+ nlm_restore_kx(sr);
+
+ return (((uint64_t)valhi << 32) | vallo);
+}
+
+static __inline__ void
+nlm_store_dword(volatile uint64_t *addr, uint64_t val)
+{
+ uint32_t valhi, vallo, sr;
+
+ valhi = val >> 32;
+ vallo = val & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %1, 0 \n\t"
+ "dsll32 $9, %2, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "sd $9, 0(%0) \n\t"
+ ".set pop \n"
+ : : "r"(addr), "r"(valhi), "r"(vallo)
+ : "$8", "$9", "memory");
+ nlm_restore_kx(sr);
+}
+#endif
+
+#if defined(__mips_n64)
+static __inline__ uint64_t
+nlm_load_word_daddr(uint64_t addr)
+{
+ volatile uint32_t *p = (volatile uint32_t *)(intptr_t)addr;
+
+ return (*p);
+}
+
+static __inline__ void
+nlm_store_word_daddr(uint64_t addr, uint32_t val)
+{
+ volatile uint32_t *p = (volatile uint32_t *)(intptr_t)addr;
+
+ *p = val;
+}
+
+static __inline__ uint64_t
+nlm_load_dword_daddr(uint64_t addr)
+{
+ volatile uint64_t *p = (volatile uint64_t *)(intptr_t)addr;
+
+ return (*p);
+}
+
+static __inline__ void
+nlm_store_dword_daddr(uint64_t addr, uint64_t val)
+{
+ volatile uint64_t *p = (volatile uint64_t *)(intptr_t)addr;
+
+ *p = val;
+}
+
+#elif defined(__mips_n32)
+
+static __inline__ uint64_t
+nlm_load_word_daddr(uint64_t addr)
+{
+ uint32_t val;
+
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "lw %0, 0(%1) \n\t"
+ ".set pop \n"
+ : "=r"(val)
+ : "r"(addr));
+
+ return (val);
+}
+
+static __inline__ void
+nlm_store_word_daddr(uint64_t addr, uint32_t val)
+{
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "sw %0, 0(%1) \n\t"
+ ".set pop \n"
+ : : "r"(val), "r"(addr)
+ : "memory");
+}
+
+static __inline__ uint64_t
+nlm_load_dword_daddr(uint64_t addr)
+{
+ uint64_t val;
+
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "ld %0, 0(%1) \n\t"
+ ".set pop \n"
+ : "=r"(val)
+ : "r"(addr));
+ return (val);
+}
+
+static __inline__ void
+nlm_store_dword_daddr(uint64_t addr, uint64_t val)
+{
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "sd %0, 0(%1) \n\t"
+ ".set pop \n"
+ : : "r"(val), "r"(addr)
+ : "memory");
+}
+
+#else /* o32 */
+static __inline__ uint64_t
+nlm_load_word_daddr(uint64_t addr)
+{
+ uint32_t val, addrhi, addrlo, sr;
+
+ addrhi = addr >> 32;
+ addrlo = addr & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %1, 0 \n\t"
+ "dsll32 $9, %2, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "lw %0, 0($9) \n\t"
+ ".set pop \n"
+ : "=r"(val)
+ : "r"(addrhi), "r"(addrlo)
+ : "$8", "$9");
+ nlm_restore_kx(sr);
+
+ return (val);
+
+}
+
+static __inline__ void
+nlm_store_word_daddr(uint64_t addr, uint32_t val)
+{
+ uint32_t addrhi, addrlo, sr;
+
+ addrhi = addr >> 32;
+ addrlo = addr & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %1, 0 \n\t"
+ "dsll32 $9, %2, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "sw %0, 0($9) \n\t"
+ ".set pop \n"
+ :: "r"(val), "r"(addrhi), "r"(addrlo)
+ : "$8", "$9", "memory");
+ nlm_restore_kx(sr);
+}
+
+static __inline__ uint64_t
+nlm_load_dword_daddr(uint64_t addr)
+{
+ uint32_t addrh, addrl, sr;
+ uint32_t valh, vall;
+
+ addrh = addr >> 32;
+ addrl = addr & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %2, 0 \n\t"
+ "dsll32 $9, %3, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "ld $8, 0($9) \n\t"
+ "dsra32 %0, $8, 0 \n\t"
+ "sll %1, $8, 0 \n\t"
+ ".set pop \n"
+ : "=r"(valh), "=r"(vall)
+ : "r"(addrh), "r"(addrl)
+ : "$8", "$9");
+ nlm_restore_kx(sr);
+
+ return (((uint64_t)valh << 32) | vall);
+}
+
+static __inline__ void
+nlm_store_dword_daddr(uint64_t addr, uint64_t val)
+{
+ uint32_t addrh, addrl, sr;
+ uint32_t valh, vall;
+
+ addrh = addr >> 32;
+ addrl = addr & 0xffffffff;
+ valh = val >> 32;
+ vall = val & 0xffffffff;
+
+ sr = nlm_enable_kx();
+ __asm__ __volatile__(
+ ".set push \n\t"
+ ".set mips64 \n\t"
+ "dsll32 $8, %2, 0 \n\t"
+ "dsll32 $9, %3, 0 \n\t" /* get rid of the */
+ "dsrl32 $9, $9, 0 \n\t" /* sign extend */
+ "or $9, $9, $8 \n\t"
+ "dsll32 $8, %0, 0 \n\t"
+ "dsll32 $10, %1, 0 \n\t" /* get rid of the */
+ "dsrl32 $10, $10, 0 \n\t" /* sign extend */
+ "or $8, $8, $10 \n\t"
+ "sd $8, 0($9) \n\t"
+ ".set pop \n"
+ : : "r"(valh), "r"(vall), "r"(addrh), "r"(addrl)
+ : "$8", "$9", "memory");
+ nlm_restore_kx(sr);
+}
+
+#endif /* __mips_n64 */
+
+#endif
diff --git a/sys/mips/nlm/hal/mmu.h b/sys/mips/nlm/hal/mmu.h
new file mode 100644
index 0000000..a620727
--- /dev/null
+++ b/sys/mips/nlm/hal/mmu.h
@@ -0,0 +1,204 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __XLP_MMU_H__
+#define __XLP_MMU_H__
+
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/hal/mips-extns.h>
+
+#define XLP_MMU_SETUP_REG 0x400
+#define XLP_MMU_LFSRSEED_REG 0x401
+#define XLP_MMU_HPW_NUM_PAGE_LVL_REG 0x410
+#define XLP_MMU_PGWKR_PGDBASE_REG 0x411
+#define XLP_MMU_PGWKR_PGDSHFT_REG 0x412
+#define XLP_MMU_PGWKR_PGDMASK_REG 0x413
+#define XLP_MMU_PGWKR_PUDSHFT_REG 0x414
+#define XLP_MMU_PGWKR_PUDMASK_REG 0x415
+#define XLP_MMU_PGWKR_PMDSHFT_REG 0x416
+#define XLP_MMU_PGWKR_PMDMASK_REG 0x417
+#define XLP_MMU_PGWKR_PTESHFT_REG 0x418
+#define XLP_MMU_PGWKR_PTEMASK_REG 0x419
+
+typedef struct hw_pagewalker {
+ int pgd_present;
+ int pud_present;
+ int pmd_present;
+ int pte_present;
+ uint64_t pgd_baseaddr;
+ uint32_t pgd_shift;
+ uint32_t pgd_mask;
+ uint32_t pud_shift;
+ uint32_t pud_mask;
+ uint32_t pmd_shift;
+ uint32_t pmd_mask;
+ uint32_t pte_shift;
+ uint32_t pte_mask;
+} nlm_pagewalker;
+
+/**
+ * On power on reset, XLP comes up with 64 TLBs.
+ * Large-variable-tlb's (ELVT) and extended TLB is disabled.
+ * Enabling large-variable-tlb's sets up the standard
+ * TLB size from 64 to 128 TLBs.
+ * Enabling fixed TLB (EFT) sets up an additional 2048 tlbs.
+ * ELVT + EFT = 128 + 2048 = 2176 TLB entries.
+ * threads 64-entry-standard-tlb 128-entry-standard-tlb
+ * per std-tlb-only| std+EFT | std-tlb-only| std+EFT
+ * core | | |
+ * --------------------------------------------------------
+ * 1 64 64+2048 128 128+2048
+ * 2 64 64+1024 64 64+1024
+ * 4 32 32+512 32 32+512
+ *
+ * 1(G) 64 64+2048 128 128+2048
+ * 2(G) 128 128+2048 128 128+2048
+ * 4(G) 128 128+2048 128 128+2048
+ * (G) = Global mode
+ */
+
+
+/* en = 1 to enable
+ * en = 0 to disable
+ */
+static __inline__ void nlm_large_variable_tlb_en (int en)
+{
+ unsigned int val;
+
+ val = nlm_read_c0_config6();
+ val |= (en << 5);
+ nlm_write_c0_config6(val);
+ return;
+}
+
+/* en = 1 to enable
+ * en = 0 to disable
+ */
+static __inline__ void nlm_pagewalker_en (int en)
+{
+ unsigned int val;
+
+ val = nlm_read_c0_config6();
+ val |= (en << 3);
+ nlm_write_c0_config6(val);
+ return;
+}
+
+/* en = 1 to enable
+ * en = 0 to disable
+ */
+static __inline__ void nlm_extended_tlb_en (int en)
+{
+ unsigned int val;
+
+ val = nlm_read_c0_config6();
+ val |= (en << 2);
+ nlm_write_c0_config6(val);
+ return;
+}
+
+static __inline__ int nlm_get_num_combined_tlbs(void)
+{
+ return (((nlm_read_c0_config6() >> 16) & 0xffff) + 1);
+}
+
+/* get number of variable TLB entries */
+static __inline__ int nlm_get_num_vtlbs(void)
+{
+ return (((nlm_read_c0_config6() >> 6) & 0x3ff) + 1);
+}
+
+static __inline__ void nlm_setup_extended_pagemask (int mask)
+{
+ nlm_write_c0_config7(mask);
+}
+
+/* hashindex_en = 1 to enable hash mode, hashindex_en=0 to disable
+ * global_mode = 1 to enable global mode, global_mode=0 to disable
+ * clk_gating = 0 to enable clock gating, clk_gating=1 to disable
+ */
+static __inline__ void nlm_mmu_setup(int hashindex_en, int global_mode,
+ int clk_gating)
+{
+ /*uint32_t mmusetup = nlm_mfcr(XLP_MMU_SETUP_REG);*/
+
+ uint32_t mmusetup = 0;
+ mmusetup |= (hashindex_en << 13);
+ mmusetup |= (clk_gating << 3);
+ mmusetup |= (global_mode << 0);
+ nlm_mtcr(XLP_MMU_SETUP_REG, mmusetup);
+}
+
+static __inline__ void nlm_mmu_lfsr_seed (int thr0_seed, int thr1_seed,
+ int thr2_seed, int thr3_seed)
+{
+ uint32_t seed = nlm_mfcr(XLP_MMU_LFSRSEED_REG);
+ seed |= ((thr3_seed & 0x7f) << 23);
+ seed |= ((thr2_seed & 0x7f) << 16);
+ seed |= ((thr1_seed & 0x7f) << 7);
+ seed |= ((thr0_seed & 0x7f) << 0);
+ nlm_mtcr(XLP_MMU_LFSRSEED_REG, seed);
+}
+
+static __inline__ void nlm_pagewalker_setup (nlm_pagewalker *walker)
+{
+ uint64_t val;
+
+ if (!walker->pgd_present)
+ return;
+
+ val = nlm_mfcr(XLP_MMU_HPW_NUM_PAGE_LVL_REG);
+
+ if (walker->pgd_present)
+ val |= (1 << 3);
+
+ if (walker->pud_present)
+ val |= (1 << 2);
+
+ if (walker->pmd_present)
+ val |= (1 << 1);
+
+ if (walker->pte_present)
+ val |= (1 << 0);
+
+ nlm_mtcr(XLP_MMU_HPW_NUM_PAGE_LVL_REG, val);
+
+ nlm_mtcr(XLP_MMU_PGWKR_PGDBASE_REG, walker->pgd_baseaddr);
+ nlm_mtcr(XLP_MMU_PGWKR_PGDSHFT_REG, walker->pgd_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PGDMASK_REG, walker->pgd_mask);
+ nlm_mtcr(XLP_MMU_PGWKR_PUDSHFT_REG, walker->pud_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PUDMASK_REG, walker->pud_mask);
+ nlm_mtcr(XLP_MMU_PGWKR_PMDSHFT_REG, walker->pmd_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PMDMASK_REG, walker->pmd_mask);
+ nlm_mtcr(XLP_MMU_PGWKR_PTESHFT_REG, walker->pte_shift);
+ nlm_mtcr(XLP_MMU_PGWKR_PTEMASK_REG, walker->pte_mask);
+}
+
+#endif
diff --git a/sys/mips/nlm/hal/pic.h b/sys/mips/nlm/hal/pic.h
new file mode 100644
index 0000000..842a367
--- /dev/null
+++ b/sys/mips/nlm/hal/pic.h
@@ -0,0 +1,427 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __XLP_PIC_H__
+#define __XLP_PIC_H__
+
+/* PIC Specific registers */
+#define XLP_PIC_CTRL_REG 0x40
+#define XLP_PIC_BYTESWAP_REG 0x42
+#define XLP_PIC_STATUS_REG 0x44
+#define XLP_PIC_INTR_TIMEOUT 0x46
+#define XLP_PIC_ICI0_INTR_TIMEOUT 0x48
+#define XLP_PIC_ICI1_INTR_TIMEOUT 0x4a
+#define XLP_PIC_ICI2_INTR_TIMEOUT 0x4c
+#define XLP_PIC_IPI_CTRL_REG 0x4e
+#define XLP_PIC_INT_ACK_REG 0x50
+#define XLP_PIC_INT_PENDING0_REG 0x52
+#define XLP_PIC_INT_PENDING1_REG 0x54
+#define XLP_PIC_INT_PENDING2_REG 0x56
+
+#define XLP_PIC_WDOG0_MAXVAL_REG 0x58
+#define XLP_PIC_WDOG0_COUNT_REG 0x5a
+#define XLP_PIC_WDOG0_ENABLE0_REG 0x5c
+#define XLP_PIC_WDOG0_ENABLE1_REG 0x5e
+#define XLP_PIC_WDOG0_BEATCMD_REG 0x60
+#define XLP_PIC_WDOG0_BEAT0_REG 0x62
+#define XLP_PIC_WDOG0_BEAT1_REG 0x64
+
+#define XLP_PIC_WDOG1_MAXVAL_REG 0x66
+#define XLP_PIC_WDOG1_COUNT_REG 0x68
+#define XLP_PIC_WDOG1_ENABLE0_REG 0x6a
+#define XLP_PIC_WDOG1_ENABLE1_REG 0x6c
+#define XLP_PIC_WDOG1_BEATCMD_REG 0x6e
+#define XLP_PIC_WDOG1_BEAT0_REG 0x70
+#define XLP_PIC_WDOG1_BEAT1_REG 0x72
+
+#define XLP_PIC_WDOG_MAXVAL_REG(i) (XLP_PIC_WDOG0_MAXVAL_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_COUNT_REG(i) (XLP_PIC_WDOG0_COUNT_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_ENABLE0_REG(i) (XLP_PIC_WDOG0_ENABLE0_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_ENABLE1_REG(i) (XLP_PIC_WDOG0_ENABLE1_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_BEATCMD_REG(i) (XLP_PIC_WDOG0_BEATCMD_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_BEAT0_REG(i) (XLP_PIC_WDOG0_BEAT0_REG + ((i) ? 7 : 0))
+#define XLP_PIC_WDOG_BEAT1_REG(i) (XLP_PIC_WDOG0_BEAT1_REG + ((i) ? 7 : 0))
+
+#define XLP_PIC_SYSTIMER0_MAXVAL_REG 0x74
+#define XLP_PIC_SYSTIMER1_MAXVAL_REG 0x76
+#define XLP_PIC_SYSTIMER2_MAXVAL_REG 0x78
+#define XLP_PIC_SYSTIMER3_MAXVAL_REG 0x7a
+#define XLP_PIC_SYSTIMER4_MAXVAL_REG 0x7c
+#define XLP_PIC_SYSTIMER5_MAXVAL_REG 0x7e
+#define XLP_PIC_SYSTIMER6_MAXVAL_REG 0x80
+#define XLP_PIC_SYSTIMER7_MAXVAL_REG 0x82
+#define XLP_PIC_SYSTIMER_MAXVAL_REG(i) (XLP_PIC_SYSTIMER0_MAXVAL_REG + ((i)*2))
+
+#define XLP_PIC_SYSTIMER0_COUNT_REG 0x84
+#define XLP_PIC_SYSTIMER1_COUNT_REG 0x86
+#define XLP_PIC_SYSTIMER2_COUNT_REG 0x88
+#define XLP_PIC_SYSTIMER3_COUNT_REG 0x8a
+#define XLP_PIC_SYSTIMER4_COUNT_REG 0x8c
+#define XLP_PIC_SYSTIMER5_COUNT_REG 0x8e
+#define XLP_PIC_SYSTIMER6_COUNT_REG 0x90
+#define XLP_PIC_SYSTIMER7_COUNT_REG 0x92
+#define XLP_PIC_SYSTIMER_COUNT_REG(i) (XLP_PIC_SYSTIMER0_COUNT_REG + ((i)*2))
+
+#define XLP_PIC_ITE0_N0_N1_REG 0x94
+#define XLP_PIC_ITE1_N0_N1_REG 0x98
+#define XLP_PIC_ITE2_N0_N1_REG 0x9c
+#define XLP_PIC_ITE3_N0_N1_REG 0xa0
+#define XLP_PIC_ITE4_N0_N1_REG 0xa4
+#define XLP_PIC_ITE5_N0_N1_REG 0xa8
+#define XLP_PIC_ITE6_N0_N1_REG 0xac
+#define XLP_PIC_ITE7_N0_N1_REG 0xb0
+#define XLP_PIC_ITE_N0_N1_REG(i) (XLP_PIC_ITE0_N0_N1_REG + ((i)*4))
+
+#define XLP_PIC_ITE0_N2_N3_REG 0x96
+#define XLP_PIC_ITE1_N2_N3_REG 0x9a
+#define XLP_PIC_ITE2_N2_N3_REG 0x9e
+#define XLP_PIC_ITE3_N2_N3_REG 0xa2
+#define XLP_PIC_ITE4_N2_N3_REG 0xa6
+#define XLP_PIC_ITE5_N2_N3_REG 0xaa
+#define XLP_PIC_ITE6_N2_N3_REG 0xae
+#define XLP_PIC_ITE7_N2_N3_REG 0xb2
+#define XLP_PIC_ITE_N2_N3_REG(i) (XLP_PIC_ITE0_N2_N3_REG + ((i)*4))
+
+#define XLP_PIC_IRT0_REG 0xb4
+#define XLP_PIC_IRT_REG(i) (XLP_PIC_IRT0_REG + ((i)*2))
+
+/* PIC IRT indices */
+
+#define XLP_PIC_IRT_WD0_INDEX 0
+#define XLP_PIC_IRT_WD1_INDEX 1
+#define XLP_PIC_IRT_WD_NMI0_INDEX 2
+#define XLP_PIC_IRT_WD_NMI1_INDEX 3
+#define XLP_PIC_IRT_TIMER0_INDEX 4
+#define XLP_PIC_IRT_TIMER1_INDEX 5
+#define XLP_PIC_IRT_TIMER2_INDEX 6
+#define XLP_PIC_IRT_TIMER3_INDEX 7
+#define XLP_PIC_IRT_TIMER4_INDEX 8
+#define XLP_PIC_IRT_TIMER5_INDEX 9
+#define XLP_PIC_IRT_TIMER6_INDEX 10
+#define XLP_PIC_IRT_TIMER7_INDEX 11
+#define XLP_PIC_IRT_TIMER_INDEX(i) (XLP_PIC_IRT_TIMER0_INDEX + (i))
+
+#define XLP_PIC_IRT_MSGQ0_INDEX 12
+#define XLP_PIC_IRT_MSGQ_INDEX(i) (XLP_PIC_IRT_MSGQ0_INDEX + (i))
+/* 12 to 43 */
+#define XLP_PIC_IRT_MSG0_INDEX 44
+#define XLP_PIC_IRT_MSG1_INDEX 45
+
+#define XLP_PIC_IRT_PCIE_MSIX0_INDEX 46
+#define XLP_PIC_IRT_PCIE_MSIX_INDEX(i) (XLP_PIC_IRT_PCIE_MSIX0_INDEX + (i))
+/* 46 to 77 */
+#define XLP_PIC_IRT_PCIE_LINK0_INDEX 78
+#define XLP_PIC_IRT_PCIE_LINK1_INDEX 79
+#define XLP_PIC_IRT_PCIE_LINK2_INDEX 80
+#define XLP_PIC_IRT_PCIE_LINK3_INDEX 81
+#define XLP_PIC_IRT_PCIE_LINK_INDEX(i) (XLP_PIC_IRT_PCIE_LINK0_INDEX + (i))
+/* 78 to 81 */
+#define XLP_PIC_IRT_NA0_INDEX 82
+#define XLP_PIC_IRT_NA_INDEX(i) (XLP_PIC_IRT_NA0_INDEX + (i))
+/* 82 to 113 */
+#define XLP_PIC_IRT_POE_INDEX 114
+#define XLP_PIC_IRT_USB0_INDEX 115
+#define XLP_PIC_IRT_EHCI0_INDEX 115
+#define XLP_PIC_IRT_EHCI1_INDEX 118
+#define XLP_PIC_IRT_USB_INDEX(i) (XLP_PIC_IRT_USB0_INDEX + (i))
+/* 115 to 120 */
+#define XLP_PIC_IRT_GDX_INDEX 121
+#define XLP_PIC_IRT_SEC_INDEX 122
+#define XLP_PIC_IRT_RSA_INDEX 123
+#define XLP_PIC_IRT_COMP0_INDEX 124
+#define XLP_PIC_IRT_COMP_INDEX(i) (XLP_PIC_IRT_COMP0_INDEX + (i))
+/* 124 to 127 */
+#define XLP_PIC_IRT_GBU_INDEX 128
+/* coherent inter chip */
+#define XLP_PIC_IRT_CIC0_INDEX 129
+#define XLP_PIC_IRT_CIC1_INDEX 130
+#define XLP_PIC_IRT_CIC2_INDEX 131
+#define XLP_PIC_IRT_CAM_INDEX 132
+#define XLP_PIC_IRT_UART0_INDEX 133
+#define XLP_PIC_IRT_UART1_INDEX 134
+#define XLP_PIC_IRT_I2C0_INDEX 135
+#define XLP_PIC_IRT_I2C1_INDEX 136
+#define XLP_PIC_IRT_SYS0_INDEX 137
+#define XLP_PIC_IRT_SYS1_INDEX 138
+#define XLP_PIC_IRT_JTAG_INDEX 139
+#define XLP_PIC_IRT_PIC_INDEX 140
+#define XLP_PIC_IRT_NBU_INDEX 141
+#define XLP_PIC_IRT_TCU_INDEX 142
+/* global coherency */
+#define XLP_PIC_IRT_GCU_INDEX 143
+#define XLP_PIC_IRT_DMC0_INDEX 144
+#define XLP_PIC_IRT_DMC1_INDEX 145
+#define XLP_PIC_IRT_GPIO0_INDEX 146
+#define XLP_PIC_IRT_GPIO_INDEX(i) (XLP_PIC_IRT_GPIO0_INDEX + (i))
+/* 146 to 149 */
+#define XLP_PIC_IRT_NOR_INDEX 150
+#define XLP_PIC_IRT_NAND_INDEX 151
+#define XLP_PIC_IRT_SPI_INDEX 152
+#define XLP_PIC_IRT_MMC_INDEX 153
+
+/* PIC control register defines */
+#define XLP_PIC_ITV_OFFSET 32 /* interrupt timeout value */
+#define XLP_PIC_ICI_OFFSET 19 /* ICI interrupt timeout enable */
+#define XLP_PIC_ITE_OFFSET 18 /* interrupt timeout enable */
+#define XLP_PIC_STE_OFFSET 10 /* system timer interrupt enable */
+#define XLP_PIC_WWR1_OFFSET 8 /* watchdog timer 1 wraparound count for reset */
+#define XLP_PIC_WWR0_OFFSET 6 /* watchdog timer 0 wraparound count for reset */
+#define XLP_PIC_WWN1_OFFSET 4 /* watchdog timer 1 wraparound count for NMI */
+#define XLP_PIC_WWN0_OFFSET 2 /* watchdog timer 0 wraparound count for NMI */
+#define XLP_PIC_WTE_OFFSET 0 /* watchdog timer enable */
+
+/* PIC Status register defines */
+#define XLP_PIC_ICI_STATUS_OFFSET 33 /* ICI interrupt timeout interrupt status */
+#define XLP_PIC_ITE_STATUS_OFFSET 32 /* interrupt timeout interrupt status */
+#define XLP_PIC_STS_STATUS_OFFSET 4 /* System timer interrupt status */
+#define XLP_PIC_WNS_STATUS_OFFSET 2 /* NMI interrupt status for watchdog timers */
+#define XLP_PIC_WIS_STATUS_OFFSET 0 /* Interrupt status for watchdog timers */
+
+/* PIC IPI control register offsets */
+#define XLP_PIC_IPICTRL_NMI_OFFSET 32
+#define XLP_PIC_IPICTRL_RIV_OFFSET 20 /* received interrupt vector */
+#define XLP_PIC_IPICTRL_IDB_OFFSET 16 /* interrupt destination base */
+#define XLP_PIC_IPICTRL_DTE_OFFSET 16 /* interrupt destination thread enables */
+
+/* PIC IRT register offsets */
+#define XLP_PIC_IRT_ENABLE_OFFSET 31
+#define XLP_PIC_IRT_NMI_OFFSET 29
+#define XLP_PIC_IRT_SCH_OFFSET 28 /* Scheduling scheme */
+#define XLP_PIC_IRT_RVEC_OFFSET 20 /* Interrupt receive vectors */
+#define XLP_PIC_IRT_DT_OFFSET 19 /* Destination type */
+#define XLP_PIC_IRT_DB_OFFSET 16 /* Destination base */
+#define XLP_PIC_IRT_DTE_OFFSET 0 /* Destination thread enables */
+
+#define XLP_PIC_MAX_IRQ 64
+#define XLP_PIC_MAX_IRT 160
+#define XLP_PIC_TIMER_FREQ 133000000
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_pic(b, r) nlm_read_reg64_kseg(b,r)
+#define nlm_wreg_pic(b, r, v) nlm_write_reg64_kseg(b,r,v)
+#define nlm_pcibase_pic(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node))
+#define nlm_regbase_pic(node) nlm_pcibase_pic(node)
+
+/* IRT and h/w interrupt routines */
+static __inline__ int
+nlm_pic_get_numirts(uint64_t pcibase)
+{
+ return (nlm_pci_rdreg(pcibase, XLP_PCI_IRTINFO_REG) >> 16);
+}
+
+static __inline__ int
+nlm_pic_get_startirt(uint64_t base)
+{
+ return (nlm_pci_rdreg(base, XLP_PCI_IRTINFO_REG) & 0xff);
+}
+
+
+static __inline__ int
+nlm_pic_read_irt(uint64_t base, int irt_index)
+{
+ return nlm_rdreg_pic(base, XLP_PIC_IRT_REG(irt_index));
+}
+
+/* IRT's can be written into in two modes
+ * ITE mode - Here the destination of the interrupt is one of the
+ * eight interrupt-thread-enable groups, allowing the interrupt
+ * to be distributed to any thread on any node
+ * ID mode - In ID mode, the IRT has the DB and DTE fields.
+ * DB[18:17] hold the node select and DB[16], if set to 0 selects
+ * cpu-cores 0-3, and if set to 1 selects cpu-cores 4-7.
+ * The DTE[15:0] field is a thread mask, allowing the PIC to broadcast
+ * the interrupt to 1-16 threads selectable from that mask
+ */
+
+static __inline__ void
+nlm_pic_write_irt_raw(uint64_t base, int irt_index, int en, int nmi, int sch,
+ int vec, int dt, int db, int dte)
+{
+ uint64_t val =
+ (((en & 0x1) << XLP_PIC_IRT_ENABLE_OFFSET) |
+ ((nmi & 0x1) << XLP_PIC_IRT_NMI_OFFSET) |
+ ((sch & 0x1) << XLP_PIC_IRT_SCH_OFFSET) |
+ ((vec & 0x3f) << XLP_PIC_IRT_RVEC_OFFSET) |
+ ((dt & 0x1 ) << XLP_PIC_IRT_DT_OFFSET) |
+ ((db & 0x7) << XLP_PIC_IRT_DB_OFFSET) |
+ (dte & 0xffff));
+ nlm_wreg_pic(base, XLP_PIC_IRT_REG(irt_index), val);
+}
+
+/* write IRT in ID mode */
+static __inline__ void
+nlm_pic_write_irt_id(uint64_t base, int irt_index, int en, int nmi, int vec,
+ int node, int cpugroup, uint32_t cpu_mask)
+{
+ nlm_pic_write_irt_raw(base, irt_index, en, nmi, 1, vec, 1,
+ (node << 1) | cpugroup , cpu_mask);
+}
+
+/* write IRT in ITE mode */
+static __inline__ void
+nlm_pic_write_ite(uint64_t base, int ite, uint32_t node0_thrmask,
+ uint32_t node1_thrmask, uint32_t node2_thrmask, uint32_t node3_thrmask)
+{
+ uint64_t tm10 = ((uint64_t)node1_thrmask << 32) | node0_thrmask;
+ uint64_t tm32 = ((uint64_t)node1_thrmask << 32) | node0_thrmask;
+
+ /* Enable the ITE register for all nodes */
+ nlm_wreg_pic(base, XLP_PIC_ITE_N0_N1_REG(ite), tm10);
+ nlm_wreg_pic(base, XLP_PIC_ITE_N2_N3_REG(ite), tm32);
+}
+
+static __inline__ void
+nlm_pic_write_irt_ite(uint64_t base, int irt_index, int ite, int en, int nmi,
+ int sch, int vec)
+{
+ nlm_pic_write_irt_raw(base, irt_index, en, nmi, sch, vec, 0, ite, 0);
+}
+
+/* Goto PIC on that node, and ack the interrupt */
+static __inline__ void nlm_pic_ack(uint64_t src_base, int irt)
+{
+ nlm_wreg_pic(src_base, XLP_PIC_INT_ACK_REG, irt);
+ /* ack in the status registers for watchdog and system timers */
+ if (irt < 12)
+ nlm_wreg_pic(src_base, XLP_PIC_STATUS_REG, (1 << irt));
+}
+
+/* IPI routines */
+
+static __inline__ void
+nlm_pic_send_ipi(uint64_t local_base, int target_node, int vcpu, int vec, int nmi)
+{
+ uint64_t ipi =
+ (((uint64_t)nmi << XLP_PIC_IPICTRL_NMI_OFFSET) |
+ (vec << XLP_PIC_IPICTRL_RIV_OFFSET) |
+ (target_node << 17) |
+ (1 << (vcpu & 0xf)));
+ if (vcpu > 15)
+ ipi |= 0x10000; /* set bit 16 to select cpus 16-31 */
+
+ nlm_wreg_pic(local_base, XLP_PIC_IPI_CTRL_REG, ipi);
+}
+
+/* System Timer routines -- broadcasts systemtimer to 16 vcpus defined in cpu_mask */
+
+static __inline__ void
+nlm_pic_set_systimer(uint64_t base, int timer, uint64_t value, int irq, int node,
+ int cpugroup, uint32_t cpumask)
+{
+ uint64_t pic_ctrl = nlm_rdreg_pic(base, XLP_PIC_CTRL_REG);
+ int en;
+
+ en = (cpumask != 0);
+ nlm_wreg_pic(base, XLP_PIC_SYSTIMER_MAXVAL_REG(timer), value);
+ nlm_pic_write_irt_id(base, XLP_PIC_IRT_TIMER_INDEX(timer),
+ en, 0, irq, node, cpugroup, cpumask);
+
+ /* enable the timer */
+ pic_ctrl |= (1 << (XLP_PIC_STE_OFFSET+timer));
+ nlm_wreg_pic(base, XLP_PIC_CTRL_REG, pic_ctrl);
+}
+
+static __inline__ uint64_t
+nlm_pic_read_systimer(uint64_t base, int timer)
+{
+ return nlm_rdreg_pic(base, XLP_PIC_SYSTIMER_COUNT_REG(timer));
+}
+
+/* Watchdog timer routines */
+
+/* node - XLP node
+ * timer - watchdog timer. valid values are 0 and 1
+ * wrap_around_count - defines the number of times the watchdog timer can wrap-around
+ * after which the reset / NMI gets generated to the threads defined in thread-enable-masks.
+ * value - the vatchdog timer max value, upto which the timer will count down
+ */
+
+static __inline__ void
+nlm_pic_set_wdogtimer(uint64_t base, int timer, int wrap_around_count, int nmi,
+ uint32_t node0_thrmask, uint32_t node1_thrmask,
+ uint32_t node2_thrmask, uint32_t node3_thrmask, uint64_t value)
+{
+ uint64_t pic_ctrl = nlm_rdreg_pic(base, XLP_PIC_CTRL_REG);
+ uint64_t mask0, mask1;
+
+ if (timer > 1 || wrap_around_count > 3)
+ return;
+
+ /* enable watchdog timer interrupt */
+ pic_ctrl |= (((1 << timer) & 0xf));
+
+ if (timer) {
+ if (nmi)
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWN1_OFFSET);
+ else
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWN0_OFFSET);
+ } else {
+ if (nmi)
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWR1_OFFSET);
+ else
+ pic_ctrl |= (wrap_around_count << XLP_PIC_WWR0_OFFSET);
+ }
+
+ mask0 = ((unsigned long long)node1_thrmask << 32) | node0_thrmask;
+ mask1 = ((unsigned long long)node3_thrmask << 32) | node2_thrmask;
+
+ nlm_wreg_pic(base, XLP_PIC_WDOG_MAXVAL_REG(timer), value);
+
+ nlm_wreg_pic(base, XLP_PIC_WDOG_ENABLE0_REG(timer), mask0);
+ nlm_wreg_pic(base, XLP_PIC_WDOG_ENABLE1_REG(timer), mask1);
+
+ nlm_wreg_pic(base, XLP_PIC_CTRL_REG, pic_ctrl);
+}
+
+/* watchdog's need to be "stroked" by heartbeats from vcpus.
+ * On XLP, the heartbeat bit for a specific cpu thread on a specific
+ * node is set according to the following formula:
+ * 32N + 4C + T
+ * where N = node, C=cpu-core number, T=thread number
+ *
+ * src_node = source node of watchdog timer interrupts. These interrupts
+ * get generated from the PIC on src_node.
+ * timer = watchdog timer 0 or 1
+ * node = node for which the hearbeat is being done
+ * cpu = cpu-core for which the hearbeat is being done
+ * thread = h/w thread for which the hearbeat is being done
+ */
+static __inline__ void
+nlm_pic_set_wdog_heartbeat(uint64_t base, int timer, int node, int cpu,
+ int thread)
+{
+ int val = 32 * node + 4 * cpu + thread;
+
+ nlm_wreg_pic(base, XLP_PIC_WDOG_BEATCMD_REG(timer), val);
+}
+
+#endif /* !LOCORE && !__ASSEMBLY__ */
+#endif
diff --git a/sys/mips/nlm/hal/sys.h b/sys/mips/nlm/hal/sys.h
new file mode 100644
index 0000000..89e4c52
--- /dev/null
+++ b/sys/mips/nlm/hal/sys.h
@@ -0,0 +1,125 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_SYS_H__
+#define __NLM_SYS_H__
+
+/**
+* @file_name sys.h
+* @author Netlogic Microsystems
+* @brief HAL for System configuration registers
+*/
+#define XLP_SYS_CHIP_RESET_REG 0x40
+#define XLP_SYS_POWER_ON_RESET_REG 0x41
+#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS0_REG 0x42
+#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS1_REG 0x43
+#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS2_REG 0x44
+#define XLP_SYS_EFUSE_DEVICE_CFG3_REG 0x45
+#define XLP_SYS_EFUSE_DEVICE_CFG4_REG 0x46
+#define XLP_SYS_EFUSE_DEVICE_CFG5_REG 0x47
+#define XLP_SYS_EFUSE_DEVICE_CFG6_REG 0x48
+#define XLP_SYS_EFUSE_DEVICE_CFG7_REG 0x49
+#define XLP_SYS_PLL_CTRL_REG 0x4a
+#define XLP_SYS_CPU_RESET_REG 0x4b
+#define XLP_SYS_CPU_NONCOHERENT_MODE_REG 0x4d
+#define XLP_SYS_CORE_DFS_DIS_CTRL_REG 0x4e
+#define XLP_SYS_CORE_DFS_RST_CTRL_REG 0x4f
+#define XLP_SYS_CORE_DFS_BYP_CTRL_REG 0x50
+#define XLP_SYS_CORE_DFS_PHA_CTRL_REG 0x51
+#define XLP_SYS_CORE_DFS_DIV_INC_CTRL_REG 0x52
+#define XLP_SYS_CORE_DFS_DIV_DEC_CTRL_REG 0x53
+#define XLP_SYS_CORE_DFS_DIV_VALUE_REG 0x54
+#define XLP_SYS_RESET_REG 0x55
+#define XLP_SYS_DFS_DIS_CTRL_REG 0x56
+#define XLP_SYS_DFS_RST_CTRL_REG 0x57
+#define XLP_SYS_DFS_BYP_CTRL_REG 0x58
+#define XLP_SYS_DFS_DIV_INC_CTRL_REG 0x59
+#define XLP_SYS_DFS_DIV_DEC_CTRL_REG 0x5a
+#define XLP_SYS_DFS_DIV_VALUE0_REG 0x5b
+#define XLP_SYS_DFS_DIV_VALUE1_REG 0x5c
+#define XLP_SYS_SENSE_AMP_DLY_REG 0x5d
+#define XLP_SYS_SOC_SENSE_AMP_DLY_REG 0x5e
+#define XLP_SYS_CTRL0_REG 0x5f
+#define XLP_SYS_CTRL1_REG 0x60
+#define XLP_SYS_TIMEOUT_BS1_REG 0x61
+#define XLP_SYS_BYTE_SWAP_REG 0x62
+#define XLP_SYS_VRM_VID_REG 0x63
+#define XLP_SYS_PWR_RAM_CMD_REG 0x64
+#define XLP_SYS_PWR_RAM_ADDR_REG 0x65
+#define XLP_SYS_PWR_RAM_DATA0_REG 0x66
+#define XLP_SYS_PWR_RAM_DATA1_REG 0x67
+#define XLP_SYS_PWR_RAM_DATA2_REG 0x68
+#define XLP_SYS_PWR_UCODE_REG 0x69
+#define XLP_SYS_CPU0_PWR_STATUS_REG 0x6a
+#define XLP_SYS_CPU1_PWR_STATUS_REG 0x6b
+#define XLP_SYS_CPU2_PWR_STATUS_REG 0x6c
+#define XLP_SYS_CPU3_PWR_STATUS_REG 0x6d
+#define XLP_SYS_CPU4_PWR_STATUS_REG 0x6e
+#define XLP_SYS_CPU5_PWR_STATUS_REG 0x6f
+#define XLP_SYS_CPU6_PWR_STATUS_REG 0x70
+#define XLP_SYS_CPU7_PWR_STATUS_REG 0x71
+#define XLP_SYS_STATUS_REG 0x72
+#define XLP_SYS_INT_POL_REG 0x73
+#define XLP_SYS_INT_TYPE_REG 0x74
+#define XLP_SYS_INT_STATUS_REG 0x75
+#define XLP_SYS_INT_MASK0_REG 0x76
+#define XLP_SYS_INT_MASK1_REG 0x77
+#define XLP_SYS_UCO_S_ECC_REG 0x78
+#define XLP_SYS_UCO_M_ECC_REG 0x79
+#define XLP_SYS_UCO_ADDR_REG 0x7a
+#define XLP_SYS_UCO_INSTR_REG 0x7b
+#define XLP_SYS_MEM_BIST0_REG 0x7c
+#define XLP_SYS_MEM_BIST1_REG 0x7d
+#define XLP_SYS_MEM_BIST2_REG 0x7e
+#define XLP_SYS_MEM_BIST3_REG 0x7f
+#define XLP_SYS_MEM_BIST4_REG 0x80
+#define XLP_SYS_MEM_BIST5_REG 0x81
+#define XLP_SYS_MEM_BIST6_REG 0x82
+#define XLP_SYS_MEM_BIST7_REG 0x83
+#define XLP_SYS_MEM_BIST8_REG 0x84
+#define XLP_SYS_MEM_BIST9_REG 0x85
+#define XLP_SYS_MEM_BIST10_REG 0x86
+#define XLP_SYS_MEM_BIST11_REG 0x87
+#define XLP_SYS_MEM_BIST12_REG 0x88
+#define XLP_SYS_SCRTCH0_REG 0x89
+#define XLP_SYS_SCRTCH1_REG 0x8a
+#define XLP_SYS_SCRTCH2_REG 0x8b
+#define XLP_SYS_SCRTCH3_REG 0x8c
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_sys(b, r) nlm_read_reg_kseg(b,r)
+#define nlm_wreg_sys(b, r, v) nlm_write_reg_kseg(b,r,v)
+#define nlm_pcibase_sys(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node))
+#define nlm_regbase_sys(node) nlm_pcibase_sys(node)
+
+#endif
+
+#endif
diff --git a/sys/mips/nlm/hal/uart.h b/sys/mips/nlm/hal/uart.h
new file mode 100644
index 0000000..9eebb49
--- /dev/null
+++ b/sys/mips/nlm/hal/uart.h
@@ -0,0 +1,196 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __XLP_UART_H__
+#define __XLP_UART_H__
+
+/* UART Specific registers */
+#define XLP_UART_RX_DATA_REG 0x40
+#define XLP_UART_TX_DATA_REG 0x40
+
+#define XLP_UART_INT_EN_REG 0x41
+#define XLP_UART_INT_ID_REG 0x42
+#define XLP_UART_FIFO_CTL_REG 0x42
+#define XLP_UART_LINE_CTL_REG 0x43
+#define XLP_UART_MODEM_CTL_REG 0x44
+#define XLP_UART_LINE_STS_REG 0x45
+#define XLP_UART_MODEM_STS_REG 0x46
+
+#define XLP_UART_DIVISOR0_REG 0x40
+#define XLP_UART_DIVISOR1_REG 0x41
+
+#define XLP_UART_BASE_BAUD (133000000/16)
+#define XLP_UART_BAUD_DIVISOR(baud) (XLP_UART_BASE_BAUD / baud)
+
+/* LCR mask values */
+#define LCR_5BITS 0x00
+#define LCR_6BITS 0x01
+#define LCR_7BITS 0x02
+#define LCR_8BITS 0x03
+#define LCR_STOPB 0x04
+#define LCR_PENAB 0x08
+#define LCR_PODD 0x00
+#define LCR_PEVEN 0x10
+#define LCR_PONE 0x20
+#define LCR_PZERO 0x30
+#define LCR_SBREAK 0x40
+#define LCR_EFR_ENABLE 0xbf
+#define LCR_DLAB 0x80
+
+/* MCR mask values */
+#define MCR_DTR 0x01
+#define MCR_RTS 0x02
+#define MCR_DRS 0x04
+#define MCR_IE 0x08
+#define MCR_LOOPBACK 0x10
+
+/* FCR mask values */
+#define FCR_RCV_RST 0x02
+#define FCR_XMT_RST 0x04
+#define FCR_RX_LOW 0x00
+#define FCR_RX_MEDL 0x40
+#define FCR_RX_MEDH 0x80
+#define FCR_RX_HIGH 0xc0
+
+/* IER mask values */
+#define IER_ERXRDY 0x1
+#define IER_ETXRDY 0x2
+#define IER_ERLS 0x4
+#define IER_EMSC 0x8
+
+/* uart IRQ info */
+#define XLP_NODE0_UART0_IRQ 17
+#define XLP_NODE1_UART0_IRQ 18
+#define XLP_NODE2_UART0_IRQ 19
+#define XLP_NODE3_UART0_IRQ 20
+#define XLP_NODE0_UART1_IRQ 21
+#define XLP_NODE1_UART1_IRQ 22
+#define XLP_NODE2_UART1_IRQ 23
+#define XLP_NODE3_UART1_IRQ 24
+
+#if !defined(LOCORE) && !defined(__ASSEMBLY__)
+
+#define nlm_rdreg_uart(b, r) nlm_read_reg_kseg(b,r)
+#define nlm_wreg_uart(b, r, v) nlm_write_reg_kseg(b,r,v)
+#define nlm_pcibase_uart(node, inst) nlm_pcicfg_base(XLP_IO_UART_OFFSET(node, inst))
+#define nlm_regbase_uart(node, inst) nlm_pcibase_uart(node, inst)
+
+static __inline__ void
+nlm_uart_set_baudrate(uint64_t base, int baud)
+{
+ uint32_t lcr;
+
+ lcr = nlm_rdreg_uart(base, XLP_UART_LINE_CTL_REG);
+
+ /* enable divisor register, and write baud values */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr | (1 << 7));
+ nlm_wreg_uart(base, XLP_UART_DIVISOR0_REG,
+ (XLP_UART_BAUD_DIVISOR(baud) & 0xff));
+ nlm_wreg_uart(base, XLP_UART_DIVISOR1_REG,
+ ((XLP_UART_BAUD_DIVISOR(baud) >> 8) & 0xff));
+
+ /* restore default lcr */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr);
+}
+
+static __inline__ void
+nlm_outbyte (uint64_t base, char c)
+{
+ uint32_t lsr;
+
+ for (;;) {
+ lsr = nlm_rdreg_uart(base, XLP_UART_LINE_STS_REG);
+ if (lsr & 0x20) break;
+ }
+
+ nlm_wreg_uart(base, XLP_UART_TX_DATA_REG, (int)c);
+}
+
+static __inline__ char
+nlm_inbyte (uint64_t base)
+{
+ int data, lsr;
+
+ for(;;) {
+ lsr = nlm_rdreg_uart(base, XLP_UART_LINE_STS_REG);
+ if (lsr & 0x80) { /* parity/frame/break-error - push a zero */
+ data = 0;
+ break;
+ }
+ if (lsr & 0x01) { /* Rx data */
+ data = nlm_rdreg_uart(base, XLP_UART_RX_DATA_REG);
+ break;
+ }
+ }
+
+ return (char)data;
+}
+
+static __inline__ int
+nlm_uart_init(uint64_t base, int baud, int databits, int stopbits,
+ int parity, int int_en, int loopback)
+{
+ uint32_t lcr;
+
+ lcr = 0;
+ if (databits >= 8)
+ lcr |= LCR_8BITS;
+ else if (databits == 7)
+ lcr |= LCR_7BITS;
+ else if (databits == 6)
+ lcr |= LCR_6BITS;
+ else
+ lcr |= LCR_5BITS;
+
+ if (stopbits > 1)
+ lcr |= LCR_STOPB;
+
+ lcr |= parity << 3;
+
+ /* setup default lcr */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr);
+
+ /* Reset the FIFOs */
+ nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, FCR_RCV_RST | FCR_XMT_RST);
+
+ nlm_uart_set_baudrate(base, baud);
+
+ if (loopback)
+ nlm_wreg_uart(base, XLP_UART_MODEM_CTL_REG, 0x1f);
+
+ if (int_en)
+ nlm_wreg_uart(base, XLP_UART_INT_EN_REG, IER_ERXRDY | IER_ETXRDY);
+
+ return 0;
+}
+
+#endif /* !LOCORE && !__ASSEMBLY__ */
+#endif /* __XLP_UART_H__ */
+
diff --git a/sys/mips/nlm/interrupt.h b/sys/mips/nlm/interrupt.h
new file mode 100644
index 0000000..41904eb
--- /dev/null
+++ b/sys/mips/nlm/interrupt.h
@@ -0,0 +1,49 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef _RMI_INTERRUPT_H_
+#define _RMI_INTERRUPT_H_
+
+/* Defines for the IRQ numbers */
+
+#define IRQ_IPI 41 /* 8-39 are mapped by PIC intr 0-31 */
+#define IRQ_MSGRING 6
+#define IRQ_TIMER 7
+
+/*
+ * XLR needs custom pre and post handlers for PCI/PCI-e interrupts
+ * XXX: maybe follow i386 intsrc model
+ */
+void xlp_establish_intr(const char *name, driver_filter_t filt,
+ driver_intr_t handler, void *arg, int irq, int flags,
+ void **cookiep, void (*busack)(int));
+void xlp_enable_irq(int irq);
+
+#endif /* _RMI_INTERRUPT_H_ */
diff --git a/sys/mips/nlm/intr_machdep.c b/sys/mips/nlm/intr_machdep.c
new file mode 100644
index 0000000..4862356
--- /dev/null
+++ b/sys/mips/nlm/intr_machdep.c
@@ -0,0 +1,253 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
+#include <sys/kernel.h>
+
+#include <machine/cpu.h>
+#include <machine/cpufunc.h>
+#include <machine/cpuinfo.h>
+#include <machine/cpuregs.h>
+#include <machine/frame.h>
+#include <machine/intr_machdep.h>
+#include <machine/md_var.h>
+#include <machine/trap.h>
+#include <machine/hwfunc.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/interrupt.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/xlp.h>
+
+struct xlp_intrsrc {
+ void (*busack)(int); /* Additional ack */
+ struct intr_event *ie; /* event corresponding to intr */
+ int irq;
+};
+
+static struct xlp_intrsrc xlp_interrupts[XLR_MAX_INTR];
+static mips_intrcnt_t mips_intr_counters[XLR_MAX_INTR];
+static int intrcnt_index;
+
+void
+xlp_enable_irq(int irq)
+{
+ uint64_t eimr;
+
+ eimr = nlm_read_c0_eimr();
+ nlm_write_c0_eimr(eimr | (1ULL << irq));
+}
+
+void
+cpu_establish_softintr(const char *name, driver_filter_t * filt,
+ void (*handler) (void *), void *arg, int irq, int flags,
+ void **cookiep)
+{
+
+ panic("Soft interrupts unsupported!\n");
+}
+
+void
+cpu_establish_hardintr(const char *name, driver_filter_t * filt,
+ void (*handler) (void *), void *arg, int irq, int flags,
+ void **cookiep)
+{
+
+ xlp_establish_intr(name, filt, handler, arg, irq, flags,
+ cookiep, NULL);
+}
+
+static void
+xlp_post_filter(void *source)
+{
+ struct xlp_intrsrc *src = source;
+
+ if (src->busack)
+ src->busack(src->irq);
+ nlm_pic_ack(xlp_pic_base, xlp_irq_to_irt(src->irq));
+}
+
+static void
+xlp_pre_ithread(void *source)
+{
+ struct xlp_intrsrc *src = source;
+
+ if (src->busack)
+ src->busack(src->irq);
+}
+
+static void
+xlp_post_ithread(void *source)
+{
+ struct xlp_intrsrc *src = source;
+
+ nlm_pic_ack(xlp_pic_base, xlp_irq_to_irt(src->irq));
+}
+
+void
+xlp_establish_intr(const char *name, driver_filter_t filt,
+ driver_intr_t handler, void *arg, int irq, int flags,
+ void **cookiep, void (*busack)(int))
+{
+ struct intr_event *ie; /* descriptor for the IRQ */
+ struct xlp_intrsrc *src = NULL;
+ int errcode;
+
+ if (irq < 0 || irq > XLR_MAX_INTR)
+ panic("%s called for unknown hard intr %d", __func__, irq);
+
+ /*
+ * FIXME locking - not needed now, because we do this only on
+ * startup from CPU0
+ */
+ src = &xlp_interrupts[irq];
+ ie = src->ie;
+ if (ie == NULL) {
+ /*
+ * PIC based interrupts need ack in PIC, and some SoC
+ * components need additional acks (e.g. PCI)
+ */
+ if (xlp_irq_is_picintr(irq))
+ errcode = intr_event_create(&ie, src, 0, irq,
+ xlp_pre_ithread, xlp_post_ithread, xlp_post_filter,
+ NULL, "hard intr%d:", irq);
+ else {
+ if (filt == NULL)
+ panic("Not supported - non filter percpu intr");
+ errcode = intr_event_create(&ie, src, 0, irq,
+ NULL, NULL, NULL, NULL, "hard intr%d:", irq);
+ }
+ if (errcode) {
+ printf("Could not create event for intr %d\n", irq);
+ return;
+ }
+ src->irq = irq;
+ src->busack = busack;
+ src->ie = ie;
+ }
+ intr_event_add_handler(ie, name, filt, handler, arg,
+ intr_priority(flags), flags, cookiep);
+ xlp_enable_irq(irq);
+}
+
+void
+cpu_intr(struct trapframe *tf)
+{
+ struct intr_event *ie;
+ uint64_t eirr, eimr;
+ int i;
+
+ critical_enter();
+
+ /* find a list of enabled interrupts */
+ eirr = nlm_read_c0_eirr();
+ eimr = nlm_read_c0_eimr();
+ eirr &= eimr;
+
+ if (eirr == 0) {
+ critical_exit();
+ return;
+ }
+ /*
+ * No need to clear the EIRR here as the handler writes to
+ * compare which ACKs the interrupt.
+ */
+ if (eirr & (1 << IRQ_TIMER)) {
+ intr_event_handle(xlp_interrupts[IRQ_TIMER].ie, tf);
+ critical_exit();
+ return;
+ }
+
+ /* FIXME sched pin >? LOCK>? */
+ for (i = sizeof(eirr) * 8 - 1; i >= 0; i--) {
+ if ((eirr & (1ULL << i)) == 0)
+ continue;
+
+ ie = xlp_interrupts[i].ie;
+ /* Don't account special IRQs */
+ switch (i) {
+ case IRQ_IPI:
+ case IRQ_MSGRING:
+ break;
+ default:
+ mips_intrcnt_inc(mips_intr_counters[i]);
+ }
+
+ /* Ack the IRQ on the CPU */
+ nlm_write_c0_eirr(1ULL << i);
+ if (intr_event_handle(ie, tf) != 0) {
+ printf("stray interrupt %d\n", i);
+ }
+ }
+ critical_exit();
+}
+
+void
+mips_intrcnt_setname(mips_intrcnt_t counter, const char *name)
+{
+ int idx = counter - intrcnt;
+
+ KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter"));
+
+ snprintf(intrnames + (MAXCOMLEN + 1) * idx,
+ MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name);
+}
+
+mips_intrcnt_t
+mips_intrcnt_create(const char* name)
+{
+ mips_intrcnt_t counter = &intrcnt[intrcnt_index++];
+
+ mips_intrcnt_setname(counter, name);
+ return counter;
+}
+
+void
+cpu_init_interrupts()
+{
+ int i;
+ char name[MAXCOMLEN + 1];
+
+ /*
+ * Initialize all available vectors so spare IRQ
+ * would show up in systat output
+ */
+ for (i = 0; i < XLR_MAX_INTR; i++) {
+ snprintf(name, MAXCOMLEN + 1, "int%d:", i);
+ mips_intr_counters[i] = mips_intrcnt_create(name);
+ }
+}
diff --git a/sys/mips/nlm/iodi.c b/sys/mips/nlm/iodi.c
new file mode 100644
index 0000000..3b372bb
--- /dev/null
+++ b/sys/mips/nlm/iodi.c
@@ -0,0 +1,233 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define __RMAN_RESOURCE_VISIBLE
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+#include <sys/reboot.h>
+#include <sys/rman.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/pmap.h>
+
+#include <machine/cpu.h>
+#include <machine/bus.h>
+#include <machine/intr_machdep.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/hal/uart.h>
+#include <mips/nlm/hal/cop2.h>
+#include <mips/nlm/hal/fmn.h>
+
+#include <mips/nlm/msgring.h>
+#include <mips/nlm/xlp.h>
+#include <mips/nlm/board.h>
+
+extern void iodi_activateirqs(void);
+
+extern bus_space_tag_t uart_bus_space_mem;
+
+static struct resource *iodi_alloc_resource(device_t, device_t, int, int *,
+ u_long, u_long, u_long, u_int);
+
+static int iodi_activate_resource(device_t, device_t, int, int,
+ struct resource *);
+struct iodi_softc *iodi_softc; /* There can be only one. */
+
+static int
+iodi_setup_intr(device_t dev, device_t child,
+ struct resource *ires, int flags, driver_filter_t *filt,
+ driver_intr_t *intr, void *arg, void **cookiep)
+{
+ const char *name = device_get_name(child);
+ int unit = device_get_unit(child);
+
+ if (strcmp(name, "uart") == 0) {
+ /* Note: in xlp, all pic interrupts are level triggered */
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_UART0_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_UART0_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("uart", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_UART0_INDEX), flags, cookiep);
+ } else if (strcmp(name, "ehci") == 0) {
+ if (unit == 0) {
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_EHCI0_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI0_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("ehci0", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI0_INDEX), flags, cookiep);
+ } else if (unit == 1) {
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_EHCI1_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI1_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("ehci1", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_EHCI1_INDEX), flags, cookiep);
+
+ }
+ } else if (strcmp(name, "xlp_sdhci") == 0) {
+ nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_MMC_INDEX, 1, 0,
+ xlp_irt_to_irq(XLP_PIC_IRT_MMC_INDEX), 0, 0, 0x1);
+
+ cpu_establish_hardintr("xlp_sdhci", filt, intr, arg,
+ xlp_irt_to_irq(XLP_PIC_IRT_MMC_INDEX), flags, cookiep);
+
+ }
+
+ return (0);
+}
+
+static struct resource *
+iodi_alloc_resource(device_t bus, device_t child, int type, int *rid,
+ u_long start, u_long end, u_long count, u_int flags)
+{
+ struct resource *res = malloc(sizeof(*res), M_DEVBUF, M_WAITOK);
+ const char *name = device_get_name(child);
+ int unit;
+
+ switch (type) {
+ case SYS_RES_IRQ:
+ device_printf(bus, "IRQ resource - for %s %lx-%lx\n",
+ device_get_nameunit(child), start, end);
+ break;
+
+ case SYS_RES_IOPORT:
+ device_printf(bus, "IOPORT resource - for %s %lx-%lx\n",
+ device_get_nameunit(child), start, end);
+ break;
+
+ case SYS_RES_MEMORY:
+ device_printf(bus, "MEMORY resource - for %s %lx-%lx\n",
+ device_get_nameunit(child), start, end);
+ break;
+ }
+
+ unit = device_get_unit(child);
+ if (strcmp(name, "uart") == 0) {
+ if (unit == 0) {
+ res->r_bushandle = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+ } else if ( unit == 1) {
+ res->r_bushandle = nlm_regbase_uart(0, 1) + XLP_IO_PCI_HDRSZ;
+ } else
+ printf("%s: Unknown uart unit\n", __FUNCTION__);
+
+ res->r_bustag = uart_bus_space_mem;
+ }
+
+ return (res);
+}
+
+static int
+iodi_activate_resource(device_t bus, device_t child, int type, int rid,
+ struct resource *r)
+{
+ return (0);
+}
+/* prototypes */
+static int iodi_probe(device_t);
+static int iodi_attach(device_t);
+static void iodi_identify(driver_t *, device_t);
+
+int
+iodi_probe(device_t dev)
+{
+ return 0;
+}
+
+void
+iodi_identify(driver_t *driver, device_t parent)
+{
+
+ BUS_ADD_CHILD(parent, 0, "iodi", 0);
+}
+
+
+int
+iodi_attach(device_t dev)
+{
+ device_t tmpd;
+ char desc[32];
+ int i;
+
+ device_printf(dev, "IODI - Initialize message ring.\n");
+ xlp_msgring_iodi_config();
+
+ /*
+ * Attach each devices
+ */
+ device_add_child(dev, "uart", 0);
+ device_add_child(dev, "xlp_i2c", 0);
+ device_add_child(dev, "xlp_i2c", 1);
+ device_add_child(dev, "ehci", 0);
+ device_add_child(dev, "ehci", 1);
+ device_add_child(dev, "xlp_sdhci", 0);
+
+ for (i=0; i < XLP_NUM_NODES; i++) {
+ tmpd = device_add_child(dev, "xlpnae", i);
+ device_set_ivars(tmpd, &xlp_board_info.nodes[i].nae_ivars);
+ snprintf(desc, sizeof(desc), "XLP NAE %d", i);
+ device_set_desc_copy(tmpd, desc);
+ }
+
+ bus_generic_probe(dev);
+ bus_generic_attach(dev);
+ return 0;
+}
+
+static device_method_t iodi_methods[] = {
+ DEVMETHOD(device_probe, iodi_probe),
+ DEVMETHOD(device_attach, iodi_attach),
+ DEVMETHOD(device_identify, iodi_identify),
+ DEVMETHOD(bus_alloc_resource, iodi_alloc_resource),
+ DEVMETHOD(bus_activate_resource, iodi_activate_resource),
+ DEVMETHOD(bus_add_child, bus_generic_add_child),
+ DEVMETHOD(bus_setup_intr, iodi_setup_intr),
+ {0, 0},
+};
+
+static driver_t iodi_driver = {
+ "iodi",
+ iodi_methods,
+ 1 /* no softc */
+};
+static devclass_t iodi_devclass;
+
+DRIVER_MODULE(iodi, nexus, iodi_driver, iodi_devclass, 0, 0);
diff --git a/sys/mips/nlm/mpreset.S b/sys/mips/nlm/mpreset.S
new file mode 100644
index 0000000..c56bd9f
--- /dev/null
+++ b/sys/mips/nlm/mpreset.S
@@ -0,0 +1,159 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#include <machine/asm.h>
+#include <machine/cpu.h>
+#include <machine/cpuregs.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/sys.h>
+#include <mips/nlm/hal/cpucontrol.h>
+
+#include "assym.s"
+
+ .text
+ .set noat
+ .set noreorder
+ .set mips64
+
+VECTOR(XLPResetEntry, unknown)
+ mfc0 t0, MIPS_COP_0_STATUS
+ li t1, 0x80000
+ and t1, t0, t1
+ bnez t1, nmi_handler
+ nop
+
+#ifdef SMP
+ /* Reset entry for secordary cores */
+ mfc0 t0, MIPS_COP_0_PRID, 1
+ srl t0, t0, 2 /* discard thread id */
+ andi t0, t0, 0x7 /* core id */
+ li t1, 1
+ sll t0, t1, t0
+ nor t0, t0, zero /* mask with core id bit clear */
+
+ /* clear CPU non-coherent bit */
+ li t2, XLP_DEFAULT_IO_BASE_KSEG1 + XLP_IO_SYS_OFFSET(0) + XLP_SYS_CPU_NONCOHERENT_MODE_REG * 4
+ lw t1, 0(t2)
+ and t1, t1, t0
+ sw t1, 0(t2)
+ lw t1, 0(t2) /* read-back ensures operation complete */
+ sync
+
+ dla t2, mpentry
+ jr t2
+ nop
+#endif
+ nop
+ /* NOT REACHED */
+VECTOR_END(XLPResetEntry)
+
+
+ /* Not yet */
+nmi_handler:
+ nop
+ nop
+ j nmi_handler
+
+#ifdef SMP
+ /*
+ * Enable other threads in the core, called from thread 0
+ * of the core
+ */
+LEAF(xlp_enable_threads)
+ /*
+ * Save and restore callee saved registers of all ABIs
+ * Enabling threads trashes the registers
+ */
+ dmtc0 sp, $4, 2 /* SP saved in UserLocal */
+ ori sp, sp, 0x7
+ xori sp, sp, 0x7 /* align 64 bit */
+ addiu sp, sp, -128
+ mfc0 t1, MIPS_COP_0_STATUS
+ sd s0, 0(sp)
+ sd s1, 8(sp)
+ sd s2, 16(sp)
+ sd s3, 24(sp)
+ sd s4, 32(sp)
+ sd s5, 40(sp)
+ sd s6, 48(sp)
+ sd s7, 56(sp)
+ sd s8, 64(sp)
+ sd t1, 72(sp)
+ sd gp, 80(sp)
+ sd ra, 88(sp)
+ /* Use register number to work in o32 and n32 */
+ li $9, ((XLP_CPU_BLOCKID_MAP << 8) | XLP_BLKID_MAP_THREADMODE)
+ move $8, a0
+ sync
+ .word 0x71280019 /* mtcr t0, t1*/
+ mfc0 t0, MIPS_COP_0_PRID, 1
+ andi t0, 0x3
+ beqz t0, 2f
+ nop
+ dla t1, mpentry /* child thread, go to hardware init */
+ jr t1
+ nop
+
+
+2: /*
+ * Parent hardware thread, restore registers, return
+ */
+#if 1
+ /*
+ * A0 Errata - Write MMU_SETUP after changing thread mode register.
+ */
+ li $9, 0x400
+ li $8, 0
+ .word 0x71280019 /* mtcr $8, $9*/
+ .word 0x000000c0 /* ehb */
+#endif
+ dmfc0 t0, $4, 2 /* SP saved in UserLocal */
+ ori sp, t0, 0x7
+ xori sp, sp, 0x7 /* align 64 bit */
+ addiu sp, sp, -128
+ ld s0, 0(sp)
+ ld s1, 8(sp)
+ ld s2, 16(sp)
+ ld s3, 24(sp)
+ ld s4, 32(sp)
+ ld s5, 40(sp)
+ ld s6, 48(sp)
+ ld s7, 56(sp)
+ ld s8, 64(sp)
+ ld t1, 72(sp)
+ ld gp, 80(sp)
+ ld ra, 88(sp)
+ mfc0 t1, MIPS_COP_0_STATUS
+
+ move sp, t0 /* Restore the real SP */
+ jr ra
+ nop
+END(xlp_enable_threads)
+#endif
diff --git a/sys/mips/nlm/msgring.h b/sys/mips/nlm/msgring.h
new file mode 100644
index 0000000..b951569
--- /dev/null
+++ b/sys/mips/nlm/msgring.h
@@ -0,0 +1,44 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+/** FIXME **/
+extern uint32_t xlp_msg_thread_mask;
+typedef void (*msgring_handler)(int, int, int, int, struct nlm_fmn_msg *, void *);
+int register_msgring_handler(int startb, int endb, msgring_handler action,
+ void *arg);
+int xlp_handle_msg_vc(int vc, int max_msgs);
+void xlp_msgring_cpu_init(uint32_t);
+void xlp_msgring_config(void);
+void xlp_cpu_msgring_handler(int bucket, int size, int code, int stid,
+ struct nlm_fmn_msg *msg, void *data);
+
+void nlm_cms_credit_setup(int credit);
+void xlp_msgring_iodi_config(void);
+
diff --git a/sys/mips/nlm/std.xlp b/sys/mips/nlm/std.xlp
new file mode 100644
index 0000000..01c9245
--- /dev/null
+++ b/sys/mips/nlm/std.xlp
@@ -0,0 +1,4 @@
+# $FreeBSD$
+files "../nlm/files.xlp"
+cpu CPU_NLM
+
diff --git a/sys/mips/nlm/tick.c b/sys/mips/nlm/tick.c
new file mode 100644
index 0000000..874a252
--- /dev/null
+++ b/sys/mips/nlm/tick.c
@@ -0,0 +1,393 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+/*
+ * Simple driver for the 32-bit interval counter built in to all
+ * MIPS32 CPUs.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_cputype.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysctl.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/rman.h>
+#include <sys/power.h>
+#include <sys/smp.h>
+#include <sys/time.h>
+#include <sys/timeet.h>
+#include <sys/timetc.h>
+
+#include <machine/hwfunc.h>
+#include <machine/clock.h>
+#include <machine/locore.h>
+#include <machine/md_var.h>
+#include <machine/intr_machdep.h>
+
+#include <mips/nlm/interrupt.h>
+
+uint64_t counter_freq;
+
+struct timecounter *platform_timecounter;
+
+static DPCPU_DEFINE(uint32_t, cycles_per_tick);
+static uint32_t cycles_per_usec;
+
+static DPCPU_DEFINE(volatile uint32_t, counter_upper);
+static DPCPU_DEFINE(volatile uint32_t, counter_lower_last);
+static DPCPU_DEFINE(uint32_t, compare_ticks);
+static DPCPU_DEFINE(uint32_t, lost_ticks);
+
+struct clock_softc {
+ int intr_rid;
+ struct resource *intr_res;
+ void *intr_handler;
+ struct timecounter tc;
+ struct eventtimer et;
+};
+static struct clock_softc *softc;
+
+/*
+ * Device methods
+ */
+static int clock_probe(device_t);
+static void clock_identify(driver_t *, device_t);
+static int clock_attach(device_t);
+static unsigned counter_get_timecount(struct timecounter *tc);
+
+void
+mips_timer_early_init(uint64_t clock_hz)
+{
+ /* Initialize clock early so that we can use DELAY sooner */
+ counter_freq = clock_hz;
+ cycles_per_usec = (clock_hz / (1000 * 1000));
+}
+
+void
+platform_initclocks(void)
+{
+
+ if (platform_timecounter != NULL)
+ tc_init(platform_timecounter);
+}
+
+static uint64_t
+tick_ticker(void)
+{
+ uint64_t ret;
+ uint32_t ticktock;
+ uint32_t t_lower_last, t_upper;
+
+ /*
+ * Disable preemption because we are working with cpu specific data.
+ */
+ critical_enter();
+
+ /*
+ * Note that even though preemption is disabled, interrupts are
+ * still enabled. In particular there is a race with clock_intr()
+ * reading the values of 'counter_upper' and 'counter_lower_last'.
+ *
+ * XXX this depends on clock_intr() being executed periodically
+ * so that 'counter_upper' and 'counter_lower_last' are not stale.
+ */
+ do {
+ t_upper = DPCPU_GET(counter_upper);
+ t_lower_last = DPCPU_GET(counter_lower_last);
+ } while (t_upper != DPCPU_GET(counter_upper));
+
+ ticktock = mips_rd_count();
+
+ critical_exit();
+
+ /* COUNT register wrapped around */
+ if (ticktock < t_lower_last)
+ t_upper++;
+
+ ret = ((uint64_t)t_upper << 32) | ticktock;
+ return (ret);
+}
+
+void
+mips_timer_init_params(uint64_t platform_counter_freq, int double_count)
+{
+
+ /*
+ * XXX: Do not use printf here: uart code 8250 may use DELAY so this
+ * function should be called before cninit.
+ */
+ counter_freq = platform_counter_freq;
+ /*
+ * XXX: Some MIPS32 cores update the Count register only every two
+ * pipeline cycles.
+ * We know this because of status registers in CP0, make it automatic.
+ */
+ if (double_count != 0)
+ counter_freq /= 2;
+
+ cycles_per_usec = counter_freq / (1 * 1000 * 1000);
+ set_cputicker(tick_ticker, counter_freq, 1);
+}
+
+static int
+sysctl_machdep_counter_freq(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+ uint64_t freq;
+
+ if (softc == NULL)
+ return (EOPNOTSUPP);
+ freq = counter_freq;
+ error = sysctl_handle_64(oidp, &freq, sizeof(freq), req);
+ if (error == 0 && req->newptr != NULL) {
+ counter_freq = freq;
+ softc->et.et_frequency = counter_freq;
+ softc->tc.tc_frequency = counter_freq;
+ }
+ return (error);
+}
+
+SYSCTL_PROC(_machdep, OID_AUTO, counter_freq, CTLTYPE_U64 | CTLFLAG_RW,
+ NULL, 0, sysctl_machdep_counter_freq, "QU",
+ "Timecounter frequency in Hz");
+
+static unsigned
+counter_get_timecount(struct timecounter *tc)
+{
+
+ return (mips_rd_count());
+}
+
+/*
+ * Wait for about n microseconds (at least!).
+ */
+void
+DELAY(int n)
+{
+ uint32_t cur, last, delta, usecs;
+
+ /*
+ * This works by polling the timer and counting the number of
+ * microseconds that go by.
+ */
+ last = mips_rd_count();
+ delta = usecs = 0;
+
+ while (n > usecs) {
+ cur = mips_rd_count();
+
+ /* Check to see if the timer has wrapped around. */
+ if (cur < last)
+ delta += cur + (0xffffffff - last) + 1;
+ else
+ delta += cur - last;
+
+ last = cur;
+
+ if (delta >= cycles_per_usec) {
+ usecs += delta / cycles_per_usec;
+ delta %= cycles_per_usec;
+ }
+ }
+}
+
+static int
+clock_start(struct eventtimer *et,
+ struct bintime *first, struct bintime *period)
+{
+ uint32_t fdiv, div, next;
+
+ if (period != NULL) {
+ div = (et->et_frequency * (period->frac >> 32)) >> 32;
+ if (period->sec != 0)
+ div += et->et_frequency * period->sec;
+ } else
+ div = 0;
+ if (first != NULL) {
+ fdiv = (et->et_frequency * (first->frac >> 32)) >> 32;
+ if (first->sec != 0)
+ fdiv += et->et_frequency * first->sec;
+ } else
+ fdiv = div;
+ DPCPU_SET(cycles_per_tick, div);
+ next = mips_rd_count() + fdiv;
+ DPCPU_SET(compare_ticks, next);
+ mips_wr_compare(next);
+ return (0);
+}
+
+static int
+clock_stop(struct eventtimer *et)
+{
+
+ DPCPU_SET(cycles_per_tick, 0);
+ mips_wr_compare(0xffffffff);
+ return (0);
+}
+
+/*
+ * Device section of file below
+ */
+static int
+clock_intr(void *arg)
+{
+ struct clock_softc *sc = (struct clock_softc *)arg;
+ uint32_t cycles_per_tick;
+ uint32_t count, compare_last, compare_next, lost_ticks;
+
+ cycles_per_tick = DPCPU_GET(cycles_per_tick);
+ /*
+ * Set next clock edge.
+ */
+ count = mips_rd_count();
+ compare_last = DPCPU_GET(compare_ticks);
+ if (cycles_per_tick > 0) {
+ compare_next = count + cycles_per_tick;
+ DPCPU_SET(compare_ticks, compare_next);
+ mips_wr_compare(compare_next);
+ } else /* In one-shot mode timer should be stopped after the event. */
+ mips_wr_compare(0xffffffff);
+
+ /* COUNT register wrapped around */
+ if (count < DPCPU_GET(counter_lower_last)) {
+ DPCPU_SET(counter_upper, DPCPU_GET(counter_upper) + 1);
+ }
+ DPCPU_SET(counter_lower_last, count);
+
+ if (cycles_per_tick > 0) {
+
+ /*
+ * Account for the "lost time" between when the timer interrupt
+ * fired and when 'clock_intr' actually started executing.
+ */
+ lost_ticks = DPCPU_GET(lost_ticks);
+ lost_ticks += count - compare_last;
+
+ /*
+ * If the COUNT and COMPARE registers are no longer in sync
+ * then make up some reasonable value for the 'lost_ticks'.
+ *
+ * This could happen, for e.g., after we resume normal
+ * operations after exiting the debugger.
+ */
+ if (lost_ticks > 2 * cycles_per_tick)
+ lost_ticks = cycles_per_tick;
+
+ while (lost_ticks >= cycles_per_tick) {
+ if (sc->et.et_active)
+ sc->et.et_event_cb(&sc->et, sc->et.et_arg);
+ lost_ticks -= cycles_per_tick;
+ }
+ DPCPU_SET(lost_ticks, lost_ticks);
+ }
+ if (sc->et.et_active)
+ sc->et.et_event_cb(&sc->et, sc->et.et_arg);
+ return (FILTER_HANDLED);
+}
+
+static int
+clock_probe(device_t dev)
+{
+
+ if (device_get_unit(dev) != 0)
+ panic("can't attach more clocks");
+
+ device_set_desc(dev, "Generic MIPS32 ticker");
+ return (0);
+}
+
+static void
+clock_identify(driver_t * drv, device_t parent)
+{
+
+ BUS_ADD_CHILD(parent, 0, "clock", 0);
+}
+
+static int
+clock_attach(device_t dev)
+{
+ struct clock_softc *sc;
+
+ softc = sc = device_get_softc(dev);
+ cpu_establish_hardintr("compare", clock_intr, NULL,
+ sc, IRQ_TIMER, INTR_TYPE_CLK, &sc->intr_handler);
+
+ sc->tc.tc_get_timecount = counter_get_timecount;
+ sc->tc.tc_counter_mask = 0xffffffff;
+ sc->tc.tc_frequency = counter_freq;
+ sc->tc.tc_name = "MIPS32";
+ sc->tc.tc_quality = 800;
+ sc->tc.tc_priv = sc;
+ tc_init(&sc->tc);
+ sc->et.et_name = "MIPS32";
+#if 0
+ sc->et.et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_ONESHOT |
+ ET_FLAGS_PERCPU;
+#endif
+ sc->et.et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_PERCPU;
+ sc->et.et_quality = 800;
+ sc->et.et_frequency = counter_freq;
+ sc->et.et_min_period.sec = 0;
+ sc->et.et_min_period.frac = 0x00004000LLU << 32; /* To be safe. */
+ sc->et.et_max_period.sec = 0xfffffffeU / sc->et.et_frequency;
+ sc->et.et_max_period.frac =
+ ((0xfffffffeLLU << 32) / sc->et.et_frequency) << 32;
+ sc->et.et_start = clock_start;
+ sc->et.et_stop = clock_stop;
+ sc->et.et_priv = sc;
+ et_register(&sc->et);
+ return (0);
+}
+
+static device_method_t clock_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, clock_probe),
+ DEVMETHOD(device_identify, clock_identify),
+ DEVMETHOD(device_attach, clock_attach),
+ DEVMETHOD(device_detach, bus_generic_detach),
+ DEVMETHOD(device_shutdown, bus_generic_shutdown),
+
+ {0, 0}
+};
+
+static driver_t clock_driver = {
+ "clock",
+ clock_methods,
+ sizeof(struct clock_softc),
+};
+
+static devclass_t clock_devclass;
+
+DRIVER_MODULE(clock, nexus, clock_driver, clock_devclass, 0, 0);
diff --git a/sys/mips/nlm/uart_bus_xlp_iodi.c b/sys/mips/nlm/uart_bus_xlp_iodi.c
new file mode 100644
index 0000000..236900a
--- /dev/null
+++ b/sys/mips/nlm/uart_bus_xlp_iodi.c
@@ -0,0 +1,88 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/rman.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/uart.h>
+
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_bus.h>
+#include <dev/uart/uart_cpu.h>
+
+static int uart_iodi_probe(device_t dev);
+
+static device_method_t uart_iodi_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, uart_iodi_probe),
+ DEVMETHOD(device_attach, uart_bus_attach),
+ DEVMETHOD(device_detach, uart_bus_detach),
+ {0, 0}
+};
+
+static driver_t uart_iodi_driver = {
+ uart_driver_name,
+ uart_iodi_methods,
+ sizeof(struct uart_softc),
+};
+
+extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
+
+static int
+uart_iodi_probe(device_t dev)
+{
+ struct uart_softc *sc;
+
+ sc = device_get_softc(dev);
+ sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs);
+ sc->sc_class = &uart_ns8250_class;
+ bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas));
+ sc->sc_sysdev->bas.bst = rmi_bus_space;
+ sc->sc_sysdev->bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+ sc->sc_bas.bst = rmi_bus_space;
+ sc->sc_bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+ /* regshft = 2, rclk = 66000000, rid = 0, chan = 0 */
+ return (uart_bus_probe(dev, 2, 133000000, 0, 0));
+}
+
+DRIVER_MODULE(uart, iodi, uart_iodi_driver, uart_devclass, 0, 0);
diff --git a/sys/mips/nlm/uart_cpu_mips_xlp.c b/sys/mips/nlm/uart_cpu_mips_xlp.c
new file mode 100644
index 0000000..07bdd6a
--- /dev/null
+++ b/sys/mips/nlm/uart_cpu_mips_xlp.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+/*
+ * Skeleton of this file was based on respective code for ARM
+ * code written by Olivier Houchard.
+ */
+/*
+ * XLRMIPS: This file is hacked from arm/...
+ */
+#include "opt_uart.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/kdb.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#include <machine/bus.h>
+
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_cpu.h>
+
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/uart.h>
+
+bus_space_tag_t uart_bus_space_io;
+bus_space_tag_t uart_bus_space_mem;
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
+
+int
+uart_cpu_getdev(int devtype, struct uart_devinfo *di)
+{
+ di->ops = uart_getops(&uart_ns8250_class);
+ di->bas.chan = 0;
+ di->bas.bst = rmi_bus_space;
+ di->bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ;
+
+ di->bas.regshft = 2;
+ /* divisor = rclk / (baudrate * 16); */
+ di->bas.rclk = 133000000;
+ di->baudrate = 115200;
+ di->databits = 8;
+ di->stopbits = 1;
+ di->parity = UART_PARITY_NONE;
+
+ uart_bus_space_io = NULL;
+ uart_bus_space_mem = rmi_bus_space;
+ return (0);
+}
diff --git a/sys/mips/nlm/xlp.h b/sys/mips/nlm/xlp.h
new file mode 100644
index 0000000..5c79aaf
--- /dev/null
+++ b/sys/mips/nlm/xlp.h
@@ -0,0 +1,133 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ * NETLOGIC_BSD */
+
+#ifndef __NLM_XLP_H__
+#define __NLM_XLP_H__
+#include <mips/nlm/hal/pic.h>
+
+#define XLP_PIC_IRT_UART0_IRQ 9
+#define XLP_PIC_IRT_UART1_IRQ 10
+
+#define XLP_PIC_IRT_PCIE0_IRQ 11
+#define XLP_PIC_IRT_PCIE1_IRQ 12
+#define XLP_PIC_IRT_PCIE2_IRQ 13
+#define XLP_PIC_IRT_PCIE3_IRQ 14
+
+#define XLP_PIC_IRT_EHCI0_IRQ 39
+#define XLP_PIC_IRT_EHCI1_IRQ 42
+#define XLP_PIC_IRT_MMC_IRQ 43
+
+
+#ifndef LOCORE
+/*
+ * FreeBSD can be started with few threads and cores turned off,
+ * so have a hardware thread id to FreeBSD cpuid mapping.
+ */
+extern int xlp_ncores;
+extern int xlp_threads_per_core;
+extern uint32_t xlp_hw_thread_mask;
+extern int xlp_cpuid_to_hwtid[];
+extern int xlp_hwtid_to_cpuid[];
+#ifdef SMP
+extern void xlp_enable_threads(int code);
+#endif
+
+extern uint64_t xlp_pic_base; /* TODO just for node 0 now */
+
+static __inline__ int
+xlp_irt_to_irq(int irt)
+{
+ switch (irt) {
+ case XLP_PIC_IRT_MMC_INDEX :
+ return XLP_PIC_IRT_MMC_IRQ;
+ case XLP_PIC_IRT_EHCI0_INDEX :
+ return XLP_PIC_IRT_EHCI0_IRQ;
+ case XLP_PIC_IRT_EHCI1_INDEX :
+ return XLP_PIC_IRT_EHCI1_IRQ;
+ case XLP_PIC_IRT_UART0_INDEX :
+ return XLP_PIC_IRT_UART0_IRQ;
+ case XLP_PIC_IRT_UART1_INDEX :
+ return XLP_PIC_IRT_UART1_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK0_INDEX :
+ return XLP_PIC_IRT_PCIE0_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK1_INDEX :
+ return XLP_PIC_IRT_PCIE1_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK2_INDEX :
+ return XLP_PIC_IRT_PCIE2_IRQ;
+ case XLP_PIC_IRT_PCIE_LINK3_INDEX :
+ return XLP_PIC_IRT_PCIE3_IRQ;
+ default: panic("Bad IRT %d\n", irt);
+ }
+}
+
+static __inline__ int
+xlp_irq_to_irt(int irq)
+{
+ switch (irq) {
+ case XLP_PIC_IRT_MMC_IRQ :
+ return XLP_PIC_IRT_MMC_INDEX;
+ case XLP_PIC_IRT_EHCI0_IRQ :
+ return XLP_PIC_IRT_EHCI0_INDEX;
+ case XLP_PIC_IRT_EHCI1_IRQ :
+ return XLP_PIC_IRT_EHCI1_INDEX;
+ case XLP_PIC_IRT_UART0_IRQ :
+ return XLP_PIC_IRT_UART0_INDEX;
+ case XLP_PIC_IRT_UART1_IRQ :
+ return XLP_PIC_IRT_UART1_INDEX;
+ case XLP_PIC_IRT_PCIE0_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK0_INDEX;
+ case XLP_PIC_IRT_PCIE1_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK1_INDEX;
+ case XLP_PIC_IRT_PCIE2_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK2_INDEX;
+ case XLP_PIC_IRT_PCIE3_IRQ :
+ return XLP_PIC_IRT_PCIE_LINK3_INDEX;
+ default: panic("Bad IRQ %d\n", irq);
+ }
+}
+
+static __inline__ int
+xlp_irq_is_picintr(int irq)
+{
+ switch (irq) {
+ case XLP_PIC_IRT_MMC_IRQ : return 1;
+ case XLP_PIC_IRT_EHCI0_IRQ : return 1;
+ case XLP_PIC_IRT_EHCI1_IRQ : return 1;
+ case XLP_PIC_IRT_UART0_IRQ : return 1;
+ case XLP_PIC_IRT_UART1_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE0_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE1_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE2_IRQ : return 1;
+ case XLP_PIC_IRT_PCIE3_IRQ : return 1;
+ default: return 0;
+ }
+}
+#endif /* LOCORE */
+#endif /* __NLM_XLP_H__ */
diff --git a/sys/mips/nlm/xlp_machdep.c b/sys/mips/nlm/xlp_machdep.c
new file mode 100644
index 0000000..6b4bde4
--- /dev/null
+++ b/sys/mips/nlm/xlp_machdep.c
@@ -0,0 +1,665 @@
+/*-
+ * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * NETLOGIC_BSD */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_ddb.h"
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/rtprio.h>
+#include <sys/systm.h>
+#include <sys/interrupt.h>
+#include <sys/limits.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/random.h>
+
+#include <sys/cons.h> /* cinit() */
+#include <sys/kdb.h>
+#include <sys/reboot.h>
+#include <sys/queue.h>
+#include <sys/smp.h>
+#include <sys/timetc.h>
+
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+
+#include <machine/cpu.h>
+#include <machine/cpufunc.h>
+#include <machine/cpuinfo.h>
+#include <machine/tlb.h>
+#include <machine/cpuregs.h>
+#include <machine/frame.h>
+#include <machine/hwfunc.h>
+#include <machine/md_var.h>
+#include <machine/asm.h>
+#include <machine/pmap.h>
+#include <machine/trap.h>
+#include <machine/clock.h>
+#include <machine/fls64.h>
+#include <machine/intr_machdep.h>
+#include <machine/smp.h>
+
+#include <mips/nlm/hal/mips-extns.h>
+#include <mips/nlm/hal/mmio.h>
+#include <mips/nlm/hal/iomap.h>
+#include <mips/nlm/hal/cop0.h>
+#include <mips/nlm/hal/sys.h>
+#include <mips/nlm/hal/pic.h>
+#include <mips/nlm/hal/uart.h>
+#include <mips/nlm/hal/mmu.h>
+#include <mips/nlm/hal/bridge.h>
+#include <mips/nlm/hal/cpucontrol.h>
+
+#include <mips/nlm/clock.h>
+#include <mips/nlm/interrupt.h>
+#include <mips/nlm/board.h>
+#include <mips/nlm/xlp.h>
+
+/* 4KB static data aread to keep a copy of the bootload env until
+ the dynamic kenv is setup */
+char boot1_env[4096];
+int xlp_argc;
+char **xlp_argv, **xlp_envp;
+
+uint64_t xlp_cpu_frequency;
+uint64_t nlm_pcicfg_baseaddr = MIPS_PHYS_TO_KSEG1(XLP_DEFAULT_IO_BASE);
+
+int xlp_ncores;
+int xlp_threads_per_core;
+uint32_t xlp_hw_thread_mask;
+int xlp_cpuid_to_hwtid[MAXCPU];
+int xlp_hwtid_to_cpuid[MAXCPU];
+uint64_t xlp_pic_base;
+
+static int xlp_mmuval;
+
+extern uint32_t _end;
+extern char XLPResetEntry[], XLPResetEntryEnd[];
+
+static void
+xlp_setup_core(void)
+{
+ uint64_t reg;
+
+ reg = nlm_mfcr(XLP_LSU_DEFEATURE);
+ /* Enable Unaligned and L2HPE */
+ reg |= (1 << 30) | (1 << 23);
+ /*
+ * Experimental : Enable SUE
+ * Speculative Unmap Enable. Enable speculative L2 cache request for
+ * unmapped access.
+ */
+ reg |= (1ull << 31);
+ /* Clear S1RCM - A0 errata */
+ reg &= ~0xeull;
+ nlm_mtcr(XLP_LSU_DEFEATURE, reg);
+
+ reg = nlm_mfcr(XLP_SCHED_DEFEATURE);
+ /* Experimental: Disable BRU accepting ALU ops - A0 errata */
+ reg |= (1 << 24);
+ nlm_mtcr(XLP_SCHED_DEFEATURE, reg);
+}
+
+static void
+xlp_setup_mmu(void)
+{
+
+ nlm_setup_extended_pagemask(0); /* pagemask = 0 for 4K pages */
+ nlm_large_variable_tlb_en(0);
+ nlm_extended_tlb_en(1);
+ nlm_mmu_setup(0, 0, 0);
+}
+
+static void
+xlp_parse_mmu_options(void)
+{
+ int i, j, k;
+ uint32_t cpu_map = xlp_hw_thread_mask;
+ uint32_t core0_thr_mask, core_thr_mask;
+
+#ifndef SMP /* Uniprocessor! */
+ if (cpu_map != 0x1) {
+ printf("WARNING: Starting uniprocessor kernel on cpumask [0x%lx]!\n"
+ "WARNING: Other CPUs will be unused.\n", (u_long)cpu_map);
+ cpu_map = 0x1;
+ }
+#endif
+
+ xlp_ncores = 1;
+ core0_thr_mask = cpu_map & 0xf;
+ switch (core0_thr_mask) {
+ case 1:
+ xlp_threads_per_core = 1;
+ xlp_mmuval = 0;
+ break;
+ case 3:
+ xlp_threads_per_core = 2;
+ xlp_mmuval = 2;
+ break;
+ case 0xf:
+ xlp_threads_per_core = 4;
+ xlp_mmuval = 3;
+ break;
+ default:
+ goto unsupp;
+ }
+
+ /* Verify other cores CPU masks */
+ for (i = 1; i < XLP_MAX_CORES; i++) {
+ core_thr_mask = (cpu_map >> (i*4)) & 0xf;
+ if (core_thr_mask) {
+ if (core_thr_mask != core0_thr_mask)
+ goto unsupp;
+ xlp_ncores++;
+ }
+ }
+
+ xlp_hw_thread_mask = cpu_map;
+ /* setup hardware processor id to cpu id mapping */
+ for (i = 0; i< MAXCPU; i++)
+ xlp_cpuid_to_hwtid[i] =
+ xlp_hwtid_to_cpuid [i] = -1;
+ for (i = 0, k = 0; i < XLP_MAX_CORES; i++) {
+ if (((cpu_map >> (i*4)) & 0xf) == 0)
+ continue;
+ for (j = 0; j < xlp_threads_per_core; j++) {
+ xlp_cpuid_to_hwtid[k] = i*4 + j;
+ xlp_hwtid_to_cpuid[i*4 + j] = k;
+ k++;
+ }
+ }
+
+#ifdef SMP
+ /*
+ * We will enable the other threads in core 0 here
+ * so that the TLB and cache info is correct when
+ * mips_init runs
+ */
+ xlp_enable_threads(xlp_mmuval);
+#endif
+ /* setup for the startup core */
+ xlp_setup_mmu();
+ return;
+
+unsupp:
+ printf("ERROR : Unsupported CPU mask [use 1,2 or 4 threads per core].\n"
+ "\tcore0 thread mask [%lx], boot cpu mask [%lx].\n",
+ (u_long)core0_thr_mask, (u_long)cpu_map);
+ panic("Invalid CPU mask - halting.\n");
+ return;
+}
+
+static void
+xlp_set_boot_flags(void)
+{
+ char *p;
+
+ p = getenv("bootflags");
+ if (p == NULL)
+ return;
+
+ for (; p && *p != '\0'; p++) {
+ switch (*p) {
+ case 'd':
+ case 'D':
+ boothowto |= RB_KDB;
+ break;
+ case 'g':
+ case 'G':
+ boothowto |= RB_GDB;
+ break;
+ case 'v':
+ case 'V':
+ boothowto |= RB_VERBOSE;
+ break;
+
+ case 's': /* single-user (default, supported for sanity) */
+ case 'S':
+ boothowto |= RB_SINGLE;
+ break;
+
+ default:
+ printf("Unrecognized boot flag '%c'.\n", *p);
+ break;
+ }
+ }
+
+ freeenv(p);
+ return;
+}
+
+static void
+mips_init(void)
+{
+ init_param1();
+ init_param2(physmem);
+
+ mips_cpu_init();
+ cpuinfo.cache_coherent_dma = TRUE;
+ pmap_bootstrap();
+#ifdef DDB
+ kdb_init();
+ if (boothowto & RB_KDB) {
+ kdb_enter("Boot flags requested debugger", NULL);
+ }
+#endif
+ mips_proc0_init();
+ mutex_init();
+}
+
+unsigned int
+platform_get_timecount(struct timecounter *tc __unused)
+{
+
+ return ((unsigned int)~nlm_pic_read_systimer(xlp_pic_base, 7));
+}
+
+static void
+xlp_pic_init(void)
+{
+ struct timecounter pic_timecounter = {
+ platform_get_timecount, /* get_timecount */
+ 0, /* no poll_pps */
+ ~0U, /* counter_mask */
+ XLP_PIC_TIMER_FREQ, /* frequency */
+ "XLRPIC", /* name */
+ 2000, /* quality (adjusted in code) */
+ };
+ int i;
+
+ xlp_pic_base = nlm_regbase_pic(0); /* TOOD: Add other nodes */
+ printf("Initializing PIC...@%jx\n", (uintmax_t)xlp_pic_base);
+ /* Bind all PIC irqs to cpu 0 */
+ for(i = 0; i < XLP_PIC_MAX_IRT; i++) {
+ nlm_pic_write_irt_raw(xlp_pic_base, i, 0, 0, 1, 0,
+ 1, 0, 0x1);
+ }
+
+ nlm_pic_set_systimer(xlp_pic_base, 7, ~0ULL, 0, 0, 0, 0);
+ platform_timecounter = &pic_timecounter;
+}
+
+#if defined(__mips_n32) || defined(__mips_n64) /* PHYSADDR_64_BIT */
+#ifdef XLP_SIM
+#define XLP_MEM_LIM 0x200000000ULL
+#else
+#define XLP_MEM_LIM 0x10000000000ULL
+#endif
+#else
+#define XLP_MEM_LIM 0xfffff000UL
+#endif
+static void
+xlp_mem_init(void)
+{
+ uint64_t bridgebase = nlm_regbase_bridge(0); /* TOOD: Add other nodes */
+ vm_size_t physsz = 0;
+ uint64_t base, lim, val;
+ int i, j;
+
+ for (i = 0, j = 0; i < 8; i++) {
+ val = nlm_rdreg_bridge(bridgebase, XLP_BRIDGE_DRAM_BAR_REG(i));
+ base = ((val >> 12) & 0xfffff) << 20;
+ val = nlm_rdreg_bridge(bridgebase, XLP_BRIDGE_DRAM_LIMIT_REG(i));
+ lim = ((val >> 12) & 0xfffff) << 20;
+
+ /* BAR not enabled */
+ if (lim == 0)
+ continue;
+
+ /* first bar, start a bit after end */
+ if (base == 0) {
+ base = (vm_paddr_t)MIPS_KSEG0_TO_PHYS(&_end) + 0x20000;
+ lim = 0x0c000000; /* TODO : hack to avoid uboot packet mem */
+ }
+ if (base >= XLP_MEM_LIM) {
+ printf("Mem [%d]: Ignore %#jx - %#jx\n", i,
+ (intmax_t)base, (intmax_t)lim);
+ continue;
+ }
+ if (lim > XLP_MEM_LIM) {
+ printf("Mem [%d]: Restrict %#jx -> %#jx\n", i,
+ (intmax_t)lim, (intmax_t)XLP_MEM_LIM);
+ lim = XLP_MEM_LIM;
+ }
+ if (lim <= base) {
+ printf("Mem[%d]: Malformed %#jx -> %#jx\n", i,
+ (intmax_t)base, (intmax_t)lim);
+ continue;
+ }
+
+ /*
+ * Exclude reset entry memory range 0x1fc00000 - 0x20000000
+ * from free memory
+ */
+ if (base <= 0x1fc00000 && (base + lim) > 0x1fc00000) {
+ uint64_t base0, lim0, base1, lim1;
+
+ base0 = base;
+ lim0 = 0x1fc00000;
+ base1 = 0x20000000;
+ lim1 = lim;
+
+ if (lim0 > base0) {
+ phys_avail[j++] = (vm_paddr_t)base0;
+ phys_avail[j++] = (vm_paddr_t)lim0;
+ physsz += lim0 - base0;
+ printf("Mem[%d]: %#jx - %#jx (excl reset)\n", i,
+ (intmax_t)base0, (intmax_t)lim0);
+ }
+ if (lim1 > base1) {
+ phys_avail[j++] = (vm_paddr_t)base1;
+ phys_avail[j++] = (vm_paddr_t)lim1;
+ physsz += lim1 - base1;
+ printf("Mem[%d]: %#jx - %#jx (excl reset)\n", i,
+ (intmax_t)base1, (intmax_t)lim1);
+ }
+ } else {
+ phys_avail[j++] = (vm_paddr_t)base;
+ phys_avail[j++] = (vm_paddr_t)lim;
+ physsz += lim - base;
+ printf("Mem[%d]: %#jx - %#jx\n", i,
+ (intmax_t)base, (intmax_t)lim);
+ }
+
+ }
+
+ /* setup final entry with 0 */
+ phys_avail[j] = phys_avail[j + 1] = 0;
+ realmem = physmem = btoc(physsz);
+}
+
+static uint32_t
+xlp_get_cpu_frequency(void)
+{
+ uint64_t sysbase = nlm_regbase_sys(0);
+ unsigned int pll_divf, pll_divr, dfs_div, num, denom;
+ uint32_t val;
+
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_POWER_ON_RESET_REG);
+ pll_divf = (val >> 10) & 0x7f;
+ pll_divr = (val >> 8) & 0x3;
+ dfs_div = (val >> 17) & 0x3;
+
+ num = pll_divf + 1;
+ denom = 3 * (pll_divr + 1) * (1<< (dfs_div + 1));
+ val = 800000000ULL * num / denom;
+ return (val);
+}
+
+void
+platform_start(__register_t a0 __unused,
+ __register_t a1 __unused,
+ __register_t a2 __unused,
+ __register_t a3 __unused)
+{
+ int i;
+
+ xlp_argc = 1;
+ /*
+ * argv and envp are passed in array of 32bit pointers
+ */
+ xlp_argv = NULL;
+ xlp_envp = NULL;
+
+ /* Initialize pcpu stuff */
+ mips_pcpu0_init();
+
+ /* initialize console so that we have printf */
+ boothowto |= (RB_SERIAL | RB_MULTIPLE); /* Use multiple consoles */
+
+ /* For now */
+ boothowto |= RB_VERBOSE;
+ boothowto |= RB_SINGLE;
+ bootverbose++;
+
+ /* clockrate used by delay, so initialize it here */
+ xlp_cpu_frequency = xlp_get_cpu_frequency();
+ cpu_clock = xlp_cpu_frequency / 1000000;
+ mips_timer_early_init(xlp_cpu_frequency);
+
+ /* Init console please */
+ cninit();
+
+ /* Environment */
+ printf("Args %#jx %#jx %#jx %#jx:\n", (intmax_t)a0,
+ (intmax_t)a1, (intmax_t)a2, (intmax_t)a3);
+ xlp_hw_thread_mask = a0;
+ init_static_kenv(boot1_env, sizeof(boot1_env));
+ printf("Environment (from %d args):\n", xlp_argc - 1);
+ if (xlp_argc == 1)
+ printf("\tNone\n");
+ for (i = 1; i < xlp_argc; i++) {
+ char *n, *arg;
+
+ arg = (char *)(intptr_t)xlp_argv[i];
+ printf("\t%s\n", arg);
+ n = strsep(&arg, "=");
+ if (arg == NULL)
+ setenv(n, "1");
+ else
+ setenv(n, arg);
+ }
+
+ /* Early core init and fixes for errata */
+ xlp_setup_core();
+
+ xlp_set_boot_flags();
+ xlp_parse_mmu_options();
+
+ xlp_mem_init();
+
+ bcopy(XLPResetEntry, (void *)MIPS_RESET_EXC_VEC,
+ XLPResetEntryEnd - XLPResetEntry);
+
+ /*
+ * MIPS generic init
+ */
+ mips_init();
+ /*
+ * XLP specific post initialization
+ * initialize other on chip stuff
+ */
+ nlm_board_info_setup();
+ xlp_pic_init();
+
+ mips_timer_init_params(xlp_cpu_frequency, 0);
+}
+
+void
+platform_cpu_init()
+{
+}
+
+void
+platform_identify(void)
+{
+
+ printf("XLP Eval Board\n");
+}
+
+/*
+ * XXX Maybe return the state of the watchdog in enter, and pass it to
+ * exit? Like spl().
+ */
+void
+platform_trap_enter(void)
+{
+}
+
+void
+platform_reset(void)
+{
+ uint64_t sysbase = nlm_regbase_sys(0);
+
+ nlm_wreg_sys(sysbase, XLP_SYS_CHIP_RESET_REG, 1);
+ for(;;)
+ __asm __volatile("wait");
+}
+
+void
+platform_trap_exit(void)
+{
+}
+
+#ifdef SMP
+/*
+ * XLP threads are started simultaneously when we enable threads, this will
+ * ensure that the threads are blocked in platform_init_ap, until they are
+ * ready to proceed to smp_init_secondary()
+ */
+static volatile int thr_unblock[4];
+
+int
+platform_start_ap(int cpuid)
+{
+ uint32_t coremask, val;
+ uint64_t sysbase = nlm_regbase_sys(0);
+ int hwtid = xlp_cpuid_to_hwtid[cpuid];
+ int core, thr;
+
+ core = hwtid / 4;
+ thr = hwtid % 4;
+ if (thr == 0) {
+ /* First thread in core, do core wake up */
+ coremask = 1u << core;
+
+ /* Enable core clock */
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_CORE_DFS_DIS_CTRL_REG);
+ val &= ~coremask;
+ nlm_wreg_sys(sysbase, XLP_SYS_CORE_DFS_DIS_CTRL_REG, val);
+
+ /* Remove CPU Reset */
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_CPU_RESET_REG);
+ val &= ~coremask & 0xff;
+ nlm_wreg_sys(sysbase, XLP_SYS_CPU_RESET_REG, val);
+
+ if (bootverbose)
+ printf("Waking up core %d ...", core);
+
+ /* Poll for CPU to mark itself coherent */
+ do {
+ val = nlm_rdreg_sys(sysbase, XLP_SYS_CPU_NONCOHERENT_MODE_REG);
+ } while ((val & coremask) != 0);
+ if (bootverbose)
+ printf("Done\n");
+ } else {
+ /* otherwise release the threads stuck in platform_init_ap */
+ thr_unblock[thr] = 1;
+ }
+
+ return (0);
+}
+
+void
+platform_init_ap(int cpuid)
+{
+ uint32_t stat;
+ int thr;
+
+ /* The first thread has to setup the MMU and enable other threads */
+ thr = nlm_threadid();
+ if (thr == 0) {
+ xlp_setup_core();
+ xlp_enable_threads(xlp_mmuval);
+ xlp_setup_mmu();
+ } else {
+ /*
+ * FIXME busy wait here eats too many cycles, especially
+ * in the core 0 while bootup
+ */
+ while (thr_unblock[thr] == 0)
+ __asm__ __volatile__ ("nop;nop;nop;nop");
+ thr_unblock[thr] = 0;
+ }
+
+ stat = mips_rd_status();
+ KASSERT((stat & MIPS_SR_INT_IE) == 0,
+ ("Interrupts enabled in %s!", __func__));
+ stat |= MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT;
+ mips_wr_status(stat);
+
+ nlm_write_c0_eimr(0ull);
+ xlp_enable_irq(IRQ_IPI);
+ xlp_enable_irq(IRQ_TIMER);
+ xlp_enable_irq(IRQ_MSGRING);
+
+ return;
+}
+
+int
+platform_ipi_intrnum(void)
+{
+
+ return (IRQ_IPI);
+}
+
+void
+platform_ipi_send(int cpuid)
+{
+
+ nlm_pic_send_ipi(xlp_pic_base, 0, xlp_cpuid_to_hwtid[cpuid],
+ platform_ipi_intrnum(), 0);
+}
+
+void
+platform_ipi_clear(void)
+{
+}
+
+int
+platform_processor_id(void)
+{
+
+ return (xlp_hwtid_to_cpuid[nlm_cpuid()]);
+}
+
+void
+platform_cpu_mask(cpuset_t *mask)
+{
+ int i, s;
+
+ CPU_ZERO(mask);
+ s = xlp_ncores * xlp_threads_per_core;
+ for (i = 0; i < s; i++)
+ CPU_SET(i, mask);
+}
+
+struct cpu_group *
+platform_smp_topo()
+{
+
+ return (smp_topo_2level(CG_SHARE_L2, xlp_ncores, CG_SHARE_L1,
+ xlp_threads_per_core, CG_FLAG_THREAD));
+}
+#endif
diff --git a/sys/mips/rmi/dev/xlr/rge.c b/sys/mips/rmi/dev/xlr/rge.c
index 274a934..1af97c2 100644
--- a/sys/mips/rmi/dev/xlr/rge.c
+++ b/sys/mips/rmi/dev/xlr/rge.c
@@ -78,8 +78,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/mips_opcode.h>
#include <machine/asm.h>
-#include <mips/rmi/rmi_mips_exts.h>
-#include <machine/cpuregs.h>
#include <machine/param.h>
#include <machine/intr_machdep.h>
diff --git a/sys/mips/rmi/fmn.c b/sys/mips/rmi/fmn.c
index f7686cb..9a6c486 100644
--- a/sys/mips/rmi/fmn.c
+++ b/sys/mips/rmi/fmn.c
@@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$");
#include <sys/ktr.h>
#include <sys/kernel.h>
#include <sys/kthread.h>
-#include <sys/proc.h>
#include <sys/resourcevar.h>
#include <sys/sched.h>
#include <sys/unistd.h>
diff --git a/sys/mips/rmi/iodi.c b/sys/mips/rmi/iodi.c
index 3c09984..8952fcd 100644
--- a/sys/mips/rmi/iodi.c
+++ b/sys/mips/rmi/iodi.c
@@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$");
#include <sys/rman.h>
#include <sys/types.h>
#include <sys/malloc.h>
-#include <sys/bus.h>
#include <sys/interrupt.h>
#include <sys/module.h>
diff --git a/sys/mips/sentry5/s5_machdep.c b/sys/mips/sentry5/s5_machdep.c
index 4491b93..134f05b 100644
--- a/sys/mips/sentry5/s5_machdep.c
+++ b/sys/mips/sentry5/s5_machdep.c
@@ -27,11 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <machine/cpuregs.h>
-
-#include <mips/sentry5/s5reg.h>
-
#include "opt_ddb.h"
#include <sys/param.h>
@@ -75,6 +70,8 @@ __FBSDID("$FreeBSD$");
#include <machine/trap.h>
#include <machine/vmparam.h>
+#include <mips/sentry5/s5reg.h>
+
#ifdef CFE
#include <dev/cfe/cfe_api.h>
#endif
diff --git a/sys/mips/sibyte/sb_machdep.c b/sys/mips/sibyte/sb_machdep.c
index ac30451..b6d395f 100644
--- a/sys/mips/sibyte/sb_machdep.c
+++ b/sys/mips/sibyte/sb_machdep.c
@@ -27,8 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-
#include "opt_ddb.h"
#include "opt_kdb.h"
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index a83d56f..ab27a31 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -155,6 +155,8 @@ SUBDIR= ${_3dfx} \
jme \
joy \
kbdmux \
+ kgssapi \
+ kgssapi_krb5 \
khelp \
krpc \
ksyms \
@@ -239,6 +241,7 @@ SUBDIR= ${_3dfx} \
pcn \
${_pf} \
${_pflog} \
+ ${_pfsync} \
plip \
${_pmc} \
portalfs \
@@ -380,6 +383,9 @@ _netgraph= netgraph
${MK_INET6_SUPPORT} != "no")) || defined(ALL_MODULES)
_pf= pf
_pflog= pflog
+.if ${MK_INET_SUPPORT} != "no"
+_pfsync= pfsync
+.endif
.endif
.if ${MACHINE_CPUARCH} == "i386"
diff --git a/sys/modules/cxgbe/if_cxgbe/Makefile b/sys/modules/cxgbe/if_cxgbe/Makefile
index ac1d22c..e4e69e6 100644
--- a/sys/modules/cxgbe/if_cxgbe/Makefile
+++ b/sys/modules/cxgbe/if_cxgbe/Makefile
@@ -10,6 +10,7 @@ SRCS = t4_main.c t4_sge.c t4_l2t.c
SRCS+= t4_hw.c
SRCS+= device_if.h bus_if.h pci_if.h
SRCS+= opt_inet.h
+SRCS+= opt_ofed.h
CFLAGS+= -I${CXGBE}
diff --git a/sys/modules/dtrace/Makefile b/sys/modules/dtrace/Makefile
index 09fe55e..316b859 100644
--- a/sys/modules/dtrace/Makefile
+++ b/sys/modules/dtrace/Makefile
@@ -4,6 +4,7 @@
.include "Makefile.inc"
SUBDIR= dtmalloc \
+ dtnfscl \
dtnfsclient \
dtrace \
dtraceall \
diff --git a/sys/modules/dtrace/dtnfscl/Makefile b/sys/modules/dtrace/dtnfscl/Makefile
new file mode 100644
index 0000000..0296232
--- /dev/null
+++ b/sys/modules/dtrace/dtnfscl/Makefile
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+.PATH: ${.CURDIR}/../../../fs/nfsclient
+
+KMOD= dtnfscl
+SRCS= nfs_clkdtrace.c \
+ vnode_if.h
+
+CFLAGS+= -I${.CURDIR}/../../../cddl/compat/opensolaris \
+ -I${.CURDIR}/../../../cddl/contrib/opensolaris/uts/common \
+ -I${.CURDIR}/../../..
+
+.include <bsd.kmod.mk>
diff --git a/sys/modules/dtrace/dtraceall/dtraceall.c b/sys/modules/dtrace/dtraceall/dtraceall.c
index 76172b7..61896bf 100644
--- a/sys/modules/dtrace/dtraceall/dtraceall.c
+++ b/sys/modules/dtrace/dtraceall/dtraceall.c
@@ -66,6 +66,7 @@ MODULE_DEPEND(dtraceall, cyclic, 1, 1, 1);
MODULE_DEPEND(dtraceall, opensolaris, 1, 1, 1);
MODULE_DEPEND(dtraceall, dtrace, 1, 1, 1);
MODULE_DEPEND(dtraceall, dtmalloc, 1, 1, 1);
+MODULE_DEPEND(dtraceall, dtnfscl, 1, 1, 1);
MODULE_DEPEND(dtraceall, dtnfsclient, 1, 1, 1);
#if defined(__amd64__) || defined(__i386__)
MODULE_DEPEND(dtraceall, fbt, 1, 1, 1);
diff --git a/sys/modules/ipdivert/Makefile b/sys/modules/ipdivert/Makefile
index 203b4bf..886802a 100644
--- a/sys/modules/ipdivert/Makefile
+++ b/sys/modules/ipdivert/Makefile
@@ -3,6 +3,11 @@
.PATH: ${.CURDIR}/../../netinet
KMOD= ipdivert
-SRCS= ip_divert.c
+SRCS= ip_divert.c opt_inet6.h
+
+.if !defined(KERNBUILDDIR)
+opt_inet6.h:
+ echo "#define INET6 1" > ${.TARGET}
+.endif
.include <bsd.kmod.mk>
diff --git a/sys/modules/kgssapi_krb5/Makefile b/sys/modules/kgssapi_krb5/Makefile
index c2ee417..e5c3e30 100644
--- a/sys/modules/kgssapi_krb5/Makefile
+++ b/sys/modules/kgssapi_krb5/Makefile
@@ -8,7 +8,8 @@ SRCS= krb5_mech.c \
kcrypto_des.c \
kcrypto_des3.c \
kcrypto_aes.c \
- kcrypto_arcfour.c
+ kcrypto_arcfour.c \
+ opt_inet6.h
SRCS+= kgss_if.h gssd.h
MFILES= kgssapi/kgss_if.m
diff --git a/sys/modules/nfscl/Makefile b/sys/modules/nfscl/Makefile
index 46fa327..a9b2003 100644
--- a/sys/modules/nfscl/Makefile
+++ b/sys/modules/nfscl/Makefile
@@ -14,13 +14,14 @@ SRCS= vnode_if.h \
nfs_clsubs.c \
nfs_clvfsops.c \
nfs_clvnops.c \
+ opt_bootp.h \
opt_inet.h \
opt_inet6.h \
- opt_bootp.h \
- opt_nfsroot.h \
+ opt_kdtrace.h \
+ opt_kgssapi.h \
opt_nfs.h \
- opt_ufs.h \
- opt_kgssapi.h
+ opt_nfsroot.h \
+ opt_ufs.h
.if !defined(KERNBUILDDIR)
NFS_INET?= 1 # 0/1 - requires INET to be configured in kernel
diff --git a/sys/modules/nfscommon/Makefile b/sys/modules/nfscommon/Makefile
index a3d75a7..2a6b8f7 100644
--- a/sys/modules/nfscommon/Makefile
+++ b/sys/modules/nfscommon/Makefile
@@ -7,9 +7,10 @@ SRCS= vnode_if.h \
nfs_commonkrpc.c \
nfs_commonport.c \
nfs_commonsubs.c \
- opt_kgssapi.h \
- opt_ufs.h \
opt_inet6.h \
- opt_nfs.h
+ opt_kdtrace.h \
+ opt_kgssapi.h \
+ opt_nfs.h \
+ opt_ufs.h
.include <bsd.kmod.mk>
diff --git a/sys/modules/pf/Makefile b/sys/modules/pf/Makefile
index 78aa564..d4b01da 100644
--- a/sys/modules/pf/Makefile
+++ b/sys/modules/pf/Makefile
@@ -6,16 +6,18 @@
.PATH: ${.CURDIR}/../../contrib/pf/netinet
KMOD= pf
-SRCS = pf.c pf_if.c pf_subr.c pf_osfp.c pf_ioctl.c pf_norm.c pf_table.c \
+SRCS= pf.c pf_if.c pf_lb.c pf_osfp.c pf_ioctl.c pf_norm.c pf_table.c \
pf_ruleset.c \
in4_cksum.c \
- opt_pf.h opt_inet.h opt_inet6.h opt_bpf.h
+ opt_pf.h opt_inet.h opt_inet6.h opt_bpf.h opt_global.h
-CFLAGS+= -I${.CURDIR}/../../contrib/pf
+CFLAGS+= -I${.CURDIR}/../../contrib/pf
.if !defined(KERNBUILDDIR)
+.if ${MK_INET_SUPPORT} != "no"
opt_inet.h:
echo "#define INET 1" > ${.TARGET}
+.endif
.if ${MK_INET6_SUPPORT} != "no"
opt_inet6.h:
@@ -26,9 +28,17 @@ opt_bpf.h:
echo "#define DEV_BPF 1" > ${.TARGET}
# pflog can be loaded as a module, have the additional checks turned on
+# pfsync can be loaded as a module, have the additional checks turned on
opt_pf.h:
echo "#define DEV_PF 1" > ${.TARGET}
echo "#define DEV_PFLOG 1" >> ${.TARGET}
+ echo "#define DEV_PFSYNC 1" >> ${.TARGET}
+ echo "#define DEV_PFLOW 1" >> ${.TARGET}
+
+.if defined(VIMAGE)
+opt_global.h:
+ echo "#define VIMAGE 1" >> ${.TARGET}
+.endif
.endif
.include <bsd.kmod.mk>
diff --git a/sys/modules/pflog/Makefile b/sys/modules/pflog/Makefile
index 2dbbd6c..0e8339e 100644
--- a/sys/modules/pflog/Makefile
+++ b/sys/modules/pflog/Makefile
@@ -5,14 +5,19 @@
.PATH: ${.CURDIR}/../../contrib/pf/net
KMOD= pflog
-SRCS = if_pflog.c \
+SRCS= if_pflog.c \
opt_pf.h opt_inet.h opt_inet6.h opt_bpf.h
-CFLAGS+= -I${.CURDIR}/../../contrib/pf
+CFLAGS+= -I${.CURDIR}/../../contrib/pf
+SRCS+= bus_if.h device_if.h
-.if !defined(KERNBUILDDIR)
+.if defined(KERNBUILDDIR)
+MKDEP+= -include ${KERNBUILDDIR}/opt_global.h
+.else
+.if ${MK_INET_SUPPORT} != "no"
opt_inet.h:
echo "#define INET 1" > ${.TARGET}
+.endif
.if ${MK_INET6_SUPPORT} != "no"
opt_inet6.h:
@@ -21,6 +26,13 @@ opt_inet6.h:
opt_bpf.h:
echo "#define DEV_BPF 1" > ${.TARGET}
+
+.if defined(VIMAGE)
+opt_global.h:
+ echo "#define VIMAGE 1" >> ${.TARGET}
+CFLAGS+= -include opt_global.h
+MKDEP+= -include opt_global.h
+.endif
.endif
.include <bsd.kmod.mk>
diff --git a/sys/modules/pfsync/Makefile b/sys/modules/pfsync/Makefile
new file mode 100644
index 0000000..ad08b45
--- /dev/null
+++ b/sys/modules/pfsync/Makefile
@@ -0,0 +1,38 @@
+# $FreeBSD$
+
+.include <bsd.own.mk>
+
+.PATH: ${.CURDIR}/../../contrib/pf/net
+
+KMOD= pfsync
+SRCS= if_pfsync.c \
+ opt_pf.h opt_inet.h opt_inet6.h opt_bpf.h
+
+CFLAGS+= -I${.CURDIR}/../../contrib/pf
+SRCS+= bus_if.h device_if.h
+
+.if defined(KERNBUILDDIR)
+MKDEP+= -include ${KERNBUILDDIR}/opt_global.h
+.else
+.if ${MK_INET_SUPPORT} != "no"
+opt_inet.h:
+ echo "#define INET 1" > ${.TARGET}
+.endif
+
+.if ${MK_INET6_SUPPORT} != "no"
+opt_inet6.h:
+ echo "#define INET6 1" > ${.TARGET}
+.endif
+
+opt_bpf.h:
+ echo "#define DEV_BPF 1" > ${.TARGET}
+
+.if defined(VIMAGE)
+opt_global.h:
+ echo "#define VIMAGE 1" >> ${.TARGET}
+CFLAGS+= -include opt_global.h
+MKDEP+= -include opt_global.h
+.endif
+.endif
+
+.include <bsd.kmod.mk>
diff --git a/sys/modules/usb/Makefile b/sys/modules/usb/Makefile
index 6288d66..abcfcbe 100644
--- a/sys/modules/usb/Makefile
+++ b/sys/modules/usb/Makefile
@@ -27,7 +27,7 @@
SUBDIR = usb
SUBDIR += ehci musb ohci uhci xhci uss820dci ${_at91dci} ${_atmegadci}
-SUBDIR += rum run uath upgt ural zyd ${_urtw}
+SUBDIR += rum run uath upgt usie ural zyd ${_urtw}
SUBDIR += atp uhid ukbd ums udbp ufm uep
SUBDIR += ucom u3g uark ubsa ubser uchcom ucycom ufoma uftdi ugensa uipaq ulpt \
umct umcs umodem umoscom uplcom uslcom uvisor uvscom
diff --git a/sys/modules/usb/template/Makefile b/sys/modules/usb/template/Makefile
index 362da9d..e67303e 100644
--- a/sys/modules/usb/template/Makefile
+++ b/sys/modules/usb/template/Makefile
@@ -31,6 +31,13 @@ S= ${.CURDIR}/../../..
KMOD= usb_template
SRCS= opt_bus.h opt_usb.h device_if.h bus_if.h usb_if.h vnode_if.h usbdevs.h \
- usb_template.c usb_template_cdce.c usb_template_msc.c usb_template_mtp.c
+ usb_template.c \
+ usb_template_audio.c \
+ usb_template_cdce.c \
+ usb_template_kbd.c \
+ usb_template_modem.c \
+ usb_template_mouse.c \
+ usb_template_msc.c \
+ usb_template_mtp.c
.include <bsd.kmod.mk>
diff --git a/sys/modules/usb/usie/Makefile b/sys/modules/usb/usie/Makefile
new file mode 100644
index 0000000..f7d7c07
--- /dev/null
+++ b/sys/modules/usb/usie/Makefile
@@ -0,0 +1,35 @@
+#
+# $FreeBSD$
+#
+# Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+.PATH: ${.CURDIR}/../../../dev/usb/net
+
+KMOD = usie
+SRCS = if_usie.c
+SRCS += opt_bus.h opt_usb.h device_if.h bus_if.h \
+ usb_if.h usbdevs.h opt_inet.h
+
+.include <bsd.kmod.mk>
diff --git a/sys/net/bpf_filter.c b/sys/net/bpf_filter.c
index 1bd1609..672dfaa 100644
--- a/sys/net/bpf_filter.c
+++ b/sys/net/bpf_filter.c
@@ -177,6 +177,8 @@ bpf_filter(const struct bpf_insn *pc, u_char *p, u_int wirelen, u_int buflen)
bpf_u_int32 k;
u_int32_t mem[BPF_MEMWORDS];
+ bzero(mem, sizeof(mem));
+
if (pc == NULL)
/*
* No filter means accept all.
diff --git a/sys/net/if.c b/sys/net/if.c
index b7c2ad1..2b7a24a 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -58,6 +58,8 @@
#include <sys/taskqueue.h>
#include <sys/domain.h>
#include <sys/jail.h>
+#include <sys/priv.h>
+
#include <machine/stdarg.h>
#include <vm/uma.h>
@@ -2135,6 +2137,20 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
free(odescrbuf, M_IFDESCR);
break;
+ case SIOCGIFFIB:
+ ifr->ifr_fib = ifp->if_fib;
+ break;
+
+ case SIOCSIFFIB:
+ error = priv_check(td, PRIV_NET_SETIFFIB);
+ if (error)
+ return (error);
+ if (ifr->ifr_fib >= rt_numfibs)
+ return (EINVAL);
+
+ ifp->if_fib = ifr->ifr_fib;
+ break;
+
case SIOCSIFFLAGS:
error = priv_check(td, PRIV_NET_SETIFFLAGS);
if (error)
@@ -2467,6 +2483,8 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)
error = ifconf(SIOCGIFCONF, (void *)&ifc);
CURVNET_RESTORE();
+ if (error == 0)
+ ifc32->ifc_len = ifc.ifc_len;
return (error);
}
#endif
diff --git a/sys/net/if.h b/sys/net/if.h
index 06521cb..d1f3883 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -325,6 +325,7 @@ struct ifreq {
int ifru_media;
caddr_t ifru_data;
int ifru_cap[2];
+ u_int ifru_fib;
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -341,6 +342,7 @@ struct ifreq {
#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */
#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */
#define ifr_index ifr_ifru.ifru_index /* interface index */
+#define ifr_fib ifr_ifru.ifru_fib /* interface fib */
};
#define _SIZEOF_ADDR_IFREQ(ifr) \
diff --git a/sys/net/if_arcsubr.c b/sys/net/if_arcsubr.c
index 0e23b24..2a58d5a 100644
--- a/sys/net/if_arcsubr.c
+++ b/sys/net/if_arcsubr.c
@@ -608,6 +608,7 @@ arc_input(struct ifnet *ifp, struct mbuf *m)
m_freem(m);
return;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_atmsubr.c b/sys/net/if_atmsubr.c
index d8a3313..fb63fd5 100644
--- a/sys/net/if_atmsubr.c
+++ b/sys/net/if_atmsubr.c
@@ -332,6 +332,7 @@ atm_input(struct ifnet *ifp, struct atm_pseudohdr *ah, struct mbuf *m,
return;
}
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_debug.c b/sys/net/if_debug.c
index dcf504e..e7319374 100644
--- a/sys/net/if_debug.c
+++ b/sys/net/if_debug.c
@@ -86,6 +86,7 @@ if_show_ifnet(struct ifnet *ifp)
IF_DB_PRINTF("%d", if_snd.ifq_drv_maxlen);
IF_DB_PRINTF("%d", if_snd.altq_type);
IF_DB_PRINTF("%x", if_snd.altq_flags);
+ IF_DB_PRINTF("%u", if_fib);
#undef IF_DB_PRINTF
}
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index be90f5a..aa8113b 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -692,6 +692,8 @@ ether_input_internal(struct ifnet *ifp, struct mbuf *m)
m_adj(m, ETHER_VLAN_ENCAP_LEN);
}
+ M_SETFIB(m, ifp->if_fib);
+
/* Allow ng_ether(4) to claim this frame. */
if (IFP2AC(ifp)->ac_netgraph != NULL) {
KASSERT(ng_ether_input_p != NULL,
diff --git a/sys/net/if_fddisubr.c b/sys/net/if_fddisubr.c
index 13fdd72..d98029c 100644
--- a/sys/net/if_fddisubr.c
+++ b/sys/net/if_fddisubr.c
@@ -550,6 +550,7 @@ fddi_input(ifp, m)
ifp->if_noproto++;
goto dropanyway;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
return;
diff --git a/sys/net/if_fwsubr.c b/sys/net/if_fwsubr.c
index eac049a..7c57feb 100644
--- a/sys/net/if_fwsubr.c
+++ b/sys/net/if_fwsubr.c
@@ -627,6 +627,7 @@ firewire_input(struct ifnet *ifp, struct mbuf *m, uint16_t src)
return;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c
index 4a8df34..2b6b2b4 100644
--- a/sys/net/if_gif.c
+++ b/sys/net/if_gif.c
@@ -609,6 +609,7 @@ gif_input(m, af, ifp)
ifp->if_ipackets++;
ifp->if_ibytes += m->m_pkthdr.len;
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
}
diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c
index de968af..5f8156b 100644
--- a/sys/net/if_gre.c
+++ b/sys/net/if_gre.c
@@ -48,6 +48,7 @@
#include <sys/param.h>
#include <sys/jail.h>
#include <sys/kernel.h>
+#include <sys/libkern.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mbuf.h>
@@ -91,6 +92,14 @@
#define GRENAME "gre"
+#define MTAG_COOKIE_GRE 1307983903
+#define MTAG_GRE_NESTING 1
+struct mtag_gre_nesting {
+ uint16_t count;
+ uint16_t max;
+ struct ifnet *ifp[];
+};
+
/*
* gre_mtx protects all global variables in if_gre.c.
* XXX: gre_softc data not protected yet.
@@ -196,7 +205,6 @@ gre_clone_create(ifc, unit, params)
sc->g_proto = IPPROTO_GRE;
GRE2IFP(sc)->if_flags |= IFF_LINK0;
sc->encap = NULL;
- sc->called = 0;
sc->gre_fibnum = curthread->td_proc->p_fibnum;
sc->wccp_ver = WCCP_V1;
sc->key = 0;
@@ -240,23 +248,77 @@ gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
struct gre_softc *sc = ifp->if_softc;
struct greip *gh;
struct ip *ip;
+ struct m_tag *mtag;
+ struct mtag_gre_nesting *gt;
+ size_t len;
u_short gre_ip_id = 0;
uint8_t gre_ip_tos = 0;
u_int16_t etype = 0;
struct mobile_h mob_h;
u_int32_t af;
- int extra = 0;
+ int extra = 0, max;
/*
- * gre may cause infinite recursion calls when misconfigured.
- * We'll prevent this by introducing upper limit.
+ * gre may cause infinite recursion calls when misconfigured. High
+ * nesting level may cause stack exhaustion. We'll prevent this by
+ * detecting loops and by introducing upper limit.
*/
- if (++(sc->called) > max_gre_nesting) {
- printf("%s: gre_output: recursively called too many "
- "times(%d)\n", if_name(GRE2IFP(sc)), sc->called);
- m_freem(m);
- error = EIO; /* is there better errno? */
- goto end;
+ mtag = m_tag_locate(m, MTAG_COOKIE_GRE, MTAG_GRE_NESTING, NULL);
+ if (mtag != NULL) {
+ struct ifnet **ifp2;
+
+ gt = (struct mtag_gre_nesting *)(mtag + 1);
+ gt->count++;
+ if (gt->count > min(gt->max,max_gre_nesting)) {
+ printf("%s: hit maximum recursion limit %u on %s\n",
+ __func__, gt->count - 1, ifp->if_xname);
+ m_freem(m);
+ error = EIO; /* is there better errno? */
+ goto end;
+ }
+
+ ifp2 = gt->ifp;
+ for (max = gt->count - 1; max > 0; max--) {
+ if (*ifp2 == ifp)
+ break;
+ ifp2++;
+ }
+ if (*ifp2 == ifp) {
+ printf("%s: detected loop with nexting %u on %s\n",
+ __func__, gt->count-1, ifp->if_xname);
+ m_freem(m);
+ error = EIO; /* is there better errno? */
+ goto end;
+ }
+ *ifp2 = ifp;
+
+ } else {
+ /*
+ * Given that people should NOT increase max_gre_nesting beyond
+ * their real needs, we allocate once per packet rather than
+ * allocating an mtag once per passing through gre.
+ *
+ * Note: the sysctl does not actually check for saneness, so we
+ * limit the maximum numbers of possible recursions here.
+ */
+ max = imin(max_gre_nesting, 256);
+ /* If someone sets the sysctl <= 0, we want at least 1. */
+ max = imax(max, 1);
+ len = sizeof(struct mtag_gre_nesting) +
+ max * sizeof(struct ifnet *);
+ mtag = m_tag_alloc(MTAG_COOKIE_GRE, MTAG_GRE_NESTING, len,
+ M_NOWAIT);
+ if (mtag == NULL) {
+ m_freem(m);
+ error = ENOMEM;
+ goto end;
+ }
+ gt = (struct mtag_gre_nesting *)(mtag + 1);
+ bzero(gt, len);
+ gt->count = 1;
+ gt->max = max;
+ *gt->ifp = ifp;
+ m_tag_prepend(m, mtag);
}
if (!((ifp->if_flags & IFF_UP) &&
@@ -444,7 +506,6 @@ gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
error = ip_output(m, NULL, &sc->route, IP_FORWARDING,
(struct ip_moptions *)NULL, (struct inpcb *)NULL);
end:
- sc->called = 0;
if (error)
ifp->if_oerrors++;
return (error);
diff --git a/sys/net/if_gre.h b/sys/net/if_gre.h
index e23daef..74d16b1 100644
--- a/sys/net/if_gre.h
+++ b/sys/net/if_gre.h
@@ -61,8 +61,6 @@ struct gre_softc {
const struct encaptab *encap; /* encapsulation cookie */
- int called; /* infinite recursion preventer */
-
uint32_t key; /* key included in outgoing GRE packets */
/* zero means none */
diff --git a/sys/net/if_iso88025subr.c b/sys/net/if_iso88025subr.c
index 933065e..7961df0 100644
--- a/sys/net/if_iso88025subr.c
+++ b/sys/net/if_iso88025subr.c
@@ -680,6 +680,7 @@ iso88025_input(ifp, m)
break;
}
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
return;
diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c
index 2548c65..d540966 100644
--- a/sys/net/if_lagg.c
+++ b/sys/net/if_lagg.c
@@ -1221,14 +1221,15 @@ lagg_input(struct ifnet *ifp, struct mbuf *m)
struct lagg_softc *sc = lp->lp_softc;
struct ifnet *scifp = sc->sc_ifp;
+ LAGG_RLOCK(sc);
if ((scifp->if_drv_flags & IFF_DRV_RUNNING) == 0 ||
(lp->lp_flags & LAGG_PORT_DISABLED) ||
sc->sc_proto == LAGG_PROTO_NONE) {
+ LAGG_RUNLOCK(sc);
m_freem(m);
return (NULL);
}
- LAGG_RLOCK(sc);
ETHER_BPF_MTAP(scifp, m);
m = (*sc->sc_input)(sc, lp, m);
diff --git a/sys/net/if_llatbl.h b/sys/net/if_llatbl.h
index 1f30f37..4b18353 100644
--- a/sys/net/if_llatbl.h
+++ b/sys/net/if_llatbl.h
@@ -151,7 +151,6 @@ struct lltable {
int llt_af;
struct ifnet *llt_ifp;
- struct llentry * (*llt_new)(const struct sockaddr *, u_int);
void (*llt_free)(struct lltable *, struct llentry *);
void (*llt_prefix_free)(struct lltable *,
const struct sockaddr *prefix,
@@ -159,8 +158,6 @@ struct lltable {
u_int flags);
struct llentry * (*llt_lookup)(struct lltable *, u_int flags,
const struct sockaddr *l3addr);
- int (*llt_rtcheck)(struct ifnet *, u_int flags,
- const struct sockaddr *);
int (*llt_dump)(struct lltable *,
struct sysctl_req *);
};
diff --git a/sys/net/if_spppfr.c b/sys/net/if_spppfr.c
index ae4f959..ca84656 100644
--- a/sys/net/if_spppfr.c
+++ b/sys/net/if_spppfr.c
@@ -280,6 +280,8 @@ drop: ++ifp->if_ierrors;
if (! (ifp->if_flags & IFF_UP))
goto drop;
+ M_SETFIB(m, ifp->if_fib);
+
/* Check queue. */
if (netisr_queue(isr, m)) { /* (0) on success. */
if (debug)
diff --git a/sys/net/if_spppsubr.c b/sys/net/if_spppsubr.c
index 3f0faaf..363d9aa 100644
--- a/sys/net/if_spppsubr.c
+++ b/sys/net/if_spppsubr.c
@@ -737,6 +737,7 @@ sppp_input(struct ifnet *ifp, struct mbuf *m)
goto drop;
SPPP_UNLOCK(sp);
+ M_SETFIB(m, ifp->if_fib);
/* Check queue. */
if (netisr_queue(isr, m)) { /* (0) on success. */
if (debug)
diff --git a/sys/net/if_stf.c b/sys/net/if_stf.c
index 7d136fd..e32956e 100644
--- a/sys/net/if_stf.c
+++ b/sys/net/if_stf.c
@@ -3,7 +3,6 @@
/*-
* Copyright (C) 2000 WIDE Project.
- * Copyright (c) 2010-2011 Hiroki Sato <hrs@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,7 +31,7 @@
*/
/*
- * 6to4 interface, based on RFC 3056 + 6rd (RFC 5969) support.
+ * 6to4 interface, based on RFC3056.
*
* 6to4 interface is NOT capable of link-layer (I mean, IPv4) multicasting.
* There is no address mapping defined from IPv6 multicast address to IPv4
@@ -61,7 +60,7 @@
* ICMPv6:
* - Redirects cannot be used due to the lack of link-local address.
*
- * stf interface does not have, and will not need, a link-local address.
+ * stf interface does not have, and will not need, a link-local address.
* It seems to have no real benefit and does not help the above symptoms much.
* Even if we assign link-locals to interface, we cannot really
* use link-local unicast/multicast on top of 6to4 cloud (since there's no
@@ -73,11 +72,6 @@
* http://playground.iijlab.net/i-d/draft-itojun-ipv6-transition-abuse-00.txt
* for details. The code tries to filter out some of malicious packets.
* Note that there is no way to be 100% secure.
- *
- * 6rd (RFC 5969) extension is enabled when an IPv6 GUA other than
- * 2002::/16 is assigned. The stf(4) calculates a 6rd delegated
- * prefix from a 6rd prefix and an IPv4 address.
- *
*/
#include "opt_inet.h"
@@ -126,41 +120,15 @@
#include <security/mac/mac_framework.h>
-#define STF_DEBUG 1
-#define ip_sprintf(buf, a) \
- sprintf(buf, "%d.%d.%d.%d", \
- (ntohl((a)->s_addr)>>24)&0xFF, \
- (ntohl((a)->s_addr)>>16)&0xFF, \
- (ntohl((a)->s_addr)>>8)&0xFF, \
- (ntohl((a)->s_addr))&0xFF);
-#if STF_DEBUG
-#define DEBUG_PRINTF(a, ...) \
- do { \
- if (V_stf_debug >= a) \
- printf(__VA_ARGS__); \
- } while (0)
-#else
-#define DEBUG_PRINTF(a, ...)
-#endif
-
SYSCTL_DECL(_net_link);
SYSCTL_NODE(_net_link, IFT_STF, stf, CTLFLAG_RW, 0, "6to4 Interface");
-static VNET_DEFINE(int, stf_route_cache) = 1;
-#define V_stf_route_cache VNET(stf_route_cache)
-SYSCTL_VNET_INT(_net_link_stf, OID_AUTO, route_cache, CTLFLAG_RW,
- &VNET_NAME(stf_route_cache), 0,
- "Enable caching of IPv4 routes for 6to4 output.");
-
-#if STF_DEBUG
-static VNET_DEFINE(int, stf_debug) = 0;
-#define V_stf_debug VNET(stf_debug)
-SYSCTL_VNET_INT(_net_link_stf, OID_AUTO, stf_debug, CTLFLAG_RW,
- &VNET_NAME(stf_debug), 0,
- "Enable displaying verbose debug message of stf interfaces");
-#endif
+static int stf_route_cache = 1;
+SYSCTL_INT(_net_link_stf, OID_AUTO, route_cache, CTLFLAG_RW,
+ &stf_route_cache, 0, "Caching of IPv4 routes for 6to4 Output");
#define STFNAME "stf"
+#define STFUNIT 0
#define IN6_IS_ADDR_6TO4(x) (ntohs((x)->s6_addr16[0]) == 0x2002)
@@ -177,27 +145,17 @@ struct stf_softc {
struct route_in6 __sc_ro6; /* just for safety */
} __sc_ro46;
#define sc_ro __sc_ro46.__sc_ro4
- struct mtx sc_mtx;
+ struct mtx sc_ro_mtx;
u_int sc_fibnum;
const struct encaptab *encap_cookie;
- u_int sc_flags;
- eventhandler_tag sc_ifaddr_event_tag;
- LIST_ENTRY(stf_softc) stf_list;
};
#define STF2IFP(sc) ((sc)->sc_ifp)
-static struct mtx stf_mtx;
+/*
+ * Note that mutable fields in the softc are not currently locked.
+ * We do lock sc_ro in stf_output though.
+ */
static MALLOC_DEFINE(M_STF, STFNAME, "6to4 Tunnel Interface");
-static VNET_DEFINE(LIST_HEAD(, stf_softc), stf_softc_list);
-#define V_stf_softc_list VNET(stf_softc_list)
-
-#define STF_LOCK_INIT(sc) mtx_init(&(sc)->sc_mtx, "stf softc", \
- NULL, MTX_DEF);
-#define STF_LOCK_DESTROY(sc) mtx_destroy(&(sc)->sc_mtx)
-#define STF_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
-#define STF_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
-#define STF_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
-
static const int ip_stf_ttl = 40;
extern struct domain inetdomain;
@@ -212,6 +170,8 @@ struct protosw in_stf_protosw = {
.pr_usrreqs = &rip_usrreqs
};
+static char *stfnames[] = {"stf0", "stf", "6to4", NULL};
+
static int stfmodevent(module_t, int, void *);
static int stf_encapcheck(const struct mbuf *, int, int, void *);
static struct in6_ifaddr *stf_getsrcifa6(struct ifnet *);
@@ -224,47 +184,68 @@ static int stf_checkaddr6(struct stf_softc *, struct in6_addr *,
struct ifnet *);
static void stf_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
static int stf_ioctl(struct ifnet *, u_long, caddr_t);
-static int stf_is_up(struct ifnet *);
-#define STF_GETIN4_USE_CACHE 1
-static struct sockaddr_in *stf_getin4addr(struct sockaddr_in *,
- struct ifaddr *,
- int);
-static struct sockaddr_in *stf_getin4addr_in6(struct sockaddr_in *,
- struct ifaddr *,
- struct in6_addr *);
-static struct sockaddr_in *stf_getin4addr_sin6(struct sockaddr_in *,
- struct ifaddr *,
- struct sockaddr_in6 *);
-static void stf_ifaddr_change(void *, struct ifnet *);
+static int stf_clone_match(struct if_clone *, const char *);
+static int stf_clone_create(struct if_clone *, char *, size_t, caddr_t);
+static int stf_clone_destroy(struct if_clone *, struct ifnet *);
+struct if_clone stf_cloner = IFC_CLONE_INITIALIZER(STFNAME, NULL, 0,
+ NULL, stf_clone_match, stf_clone_create, stf_clone_destroy);
-static int stf_clone_create(struct if_clone *, int, caddr_t);
-static void stf_clone_destroy(struct ifnet *);
+static int
+stf_clone_match(struct if_clone *ifc, const char *name)
+{
+ int i;
-IFC_SIMPLE_DECLARE(stf, 0);
+ for(i = 0; stfnames[i] != NULL; i++) {
+ if (strcmp(stfnames[i], name) == 0)
+ return (1);
+ }
+
+ return (0);
+}
static int
-stf_clone_create(struct if_clone *ifc, int unit, caddr_t params)
+stf_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params)
{
+ int err, unit;
struct stf_softc *sc;
struct ifnet *ifp;
+ /*
+ * We can only have one unit, but since unit allocation is
+ * already locked, we use it to keep from allocating extra
+ * interfaces.
+ */
+ unit = STFUNIT;
+ err = ifc_alloc_unit(ifc, &unit);
+ if (err != 0)
+ return (err);
+
sc = malloc(sizeof(struct stf_softc), M_STF, M_WAITOK | M_ZERO);
- sc->sc_fibnum = curthread->td_proc->p_fibnum;
ifp = STF2IFP(sc) = if_alloc(IFT_STF);
- if (sc->sc_ifp == NULL) {
+ if (ifp == NULL) {
free(sc, M_STF);
- return (ENOMEM);
+ ifc_free_unit(ifc, unit);
+ return (ENOSPC);
}
- STF_LOCK_INIT(sc);
ifp->if_softc = sc;
- if_initname(ifp, ifc->ifc_name, unit);
+ sc->sc_fibnum = curthread->td_proc->p_fibnum;
+ /*
+ * Set the name manually rather then using if_initname because
+ * we don't conform to the default naming convention for interfaces.
+ */
+ strlcpy(ifp->if_xname, name, IFNAMSIZ);
+ ifp->if_dname = ifc->ifc_name;
+ ifp->if_dunit = IF_DUNIT_NONE;
+
+ mtx_init(&(sc)->sc_ro_mtx, "stf ro", NULL, MTX_DEF);
sc->encap_cookie = encap_attach_func(AF_INET, IPPROTO_IPV6,
stf_encapcheck, &in_stf_protosw, sc);
if (sc->encap_cookie == NULL) {
if_printf(ifp, "attach failed\n");
free(sc, M_STF);
+ ifc_free_unit(ifc, unit);
return (ENOMEM);
}
@@ -274,63 +255,41 @@ stf_clone_create(struct if_clone *ifc, int unit, caddr_t params)
ifp->if_snd.ifq_maxlen = ifqmaxlen;
if_attach(ifp);
bpfattach(ifp, DLT_NULL, sizeof(u_int32_t));
-
- mtx_lock(&stf_mtx);
- LIST_INSERT_HEAD(&V_stf_softc_list, sc, stf_list);
- mtx_unlock(&stf_mtx);
-
- sc->sc_ifaddr_event_tag =
- EVENTHANDLER_REGISTER(ifaddr_event, stf_ifaddr_change, NULL,
- EVENTHANDLER_PRI_ANY);
-
return (0);
}
-static void
-stf_clone_destroy(struct ifnet *ifp)
+static int
+stf_clone_destroy(struct if_clone *ifc, struct ifnet *ifp)
{
struct stf_softc *sc = ifp->if_softc;
int err;
- mtx_lock(&stf_mtx);
- LIST_REMOVE(sc, stf_list);
- mtx_unlock(&stf_mtx);
-
- EVENTHANDLER_DEREGISTER(ifaddr_event, sc->sc_ifaddr_event_tag);
-
err = encap_detach(sc->encap_cookie);
KASSERT(err == 0, ("Unexpected error detaching encap_cookie"));
+ mtx_destroy(&(sc)->sc_ro_mtx);
bpfdetach(ifp);
if_detach(ifp);
if_free(ifp);
- STF_LOCK_DESTROY(sc);
free(sc, M_STF);
+ ifc_free_unit(ifc, STFUNIT);
- return;
-}
-
-static void
-vnet_stf_init(const void *unused __unused)
-{
-
- LIST_INIT(&V_stf_softc_list);
+ return (0);
}
-VNET_SYSINIT(vnet_stf_init, SI_SUB_PSEUDO, SI_ORDER_MIDDLE, vnet_stf_init,
- NULL);
static int
-stfmodevent(module_t mod, int type, void *data)
+stfmodevent(mod, type, data)
+ module_t mod;
+ int type;
+ void *data;
{
switch (type) {
case MOD_LOAD:
- mtx_init(&stf_mtx, "stf_mtx", NULL, MTX_DEF);
if_clone_attach(&stf_cloner);
break;
case MOD_UNLOAD:
if_clone_detach(&stf_cloner);
- mtx_destroy(&stf_mtx);
break;
default:
return (EOPNOTSUPP);
@@ -346,31 +305,28 @@ static moduledata_t stf_mod = {
};
DECLARE_MODULE(if_stf, stf_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
-MODULE_VERSION(if_stf, 1);
static int
-stf_encapcheck(const struct mbuf *m, int off, int proto, void *arg)
+stf_encapcheck(m, off, proto, arg)
+ const struct mbuf *m;
+ int off;
+ int proto;
+ void *arg;
{
struct ip ip;
struct in6_ifaddr *ia6;
- struct sockaddr_in ia6_in4addr;
- struct sockaddr_in ia6_in4mask;
- struct sockaddr_in *sin;
struct stf_softc *sc;
- struct ifnet *ifp;
- int ret = 0;
+ struct in_addr a, b, mask;
- DEBUG_PRINTF(1, "%s: enter\n", __func__);
sc = (struct stf_softc *)arg;
if (sc == NULL)
return 0;
- ifp = STF2IFP(sc);
- if ((ifp->if_flags & IFF_UP) == 0)
+ if ((STF2IFP(sc)->if_flags & IFF_UP) == 0)
return 0;
/* IFF_LINK0 means "no decapsulation" */
- if ((ifp->if_flags & IFF_LINK0) != 0)
+ if ((STF2IFP(sc)->if_flags & IFF_LINK0) != 0)
return 0;
if (proto != IPPROTO_IPV6)
@@ -382,162 +338,86 @@ stf_encapcheck(const struct mbuf *m, int off, int proto, void *arg)
if (ip.ip_v != 4)
return 0;
- /* Lookup an ia6 whose IPv4 addr encoded in the IPv6 addr is valid. */
- ia6 = stf_getsrcifa6(ifp);
+ ia6 = stf_getsrcifa6(STF2IFP(sc));
if (ia6 == NULL)
return 0;
- sin = stf_getin4addr(&ia6_in4addr, &ia6->ia_ifa, STF_GETIN4_USE_CACHE);
- if (sin == NULL)
- return 0;
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &satosin6(ia6->ia_ifa.ifa_addr)->sin6_addr);
- DEBUG_PRINTF(1, "%s: ia6->ia_ifa.ifa_addr = %s\n", __func__, buf);
- ip6_sprintf(buf, &ia6->ia_addr.sin6_addr);
- DEBUG_PRINTF(1, "%s: ia6->ia_addr = %s\n", __func__, buf);
- ip6_sprintf(buf, &satosin6(ia6->ia_ifa.ifa_netmask)->sin6_addr);
- DEBUG_PRINTF(1, "%s: ia6->ia_ifa.ifa_netmask = %s\n", __func__, buf);
- ip6_sprintf(buf, &ia6->ia_prefixmask.sin6_addr);
- DEBUG_PRINTF(1, "%s: ia6->ia_prefixmask = %s\n", __func__, buf);
-
- ip_sprintf(buf, &ia6_in4addr.sin_addr);
- DEBUG_PRINTF(1, "%s: ia6_in4addr.sin_addr = %s\n", __func__, buf);
- ip_sprintf(buf, &ip.ip_src);
- DEBUG_PRINTF(1, "%s: ip.ip_src = %s\n", __func__, buf);
- ip_sprintf(buf, &ip.ip_dst);
- DEBUG_PRINTF(1, "%s: ip.ip_dst = %s\n", __func__, buf);
- }
-#endif
/*
* check if IPv4 dst matches the IPv4 address derived from the
* local 6to4 address.
* success on: dst = 10.1.1.1, ia6->ia_addr = 2002:0a01:0101:...
*/
- DEBUG_PRINTF(1, "%s: check1: ia6_in4addr.sin_addr == ip.ip_dst?\n", __func__);
- if (ia6_in4addr.sin_addr.s_addr != ip.ip_dst.s_addr) {
- DEBUG_PRINTF(1, "%s: check1: false. Ignore this packet.\n", __func__);
- goto freeit;
+ if (bcmp(GET_V4(&ia6->ia_addr.sin6_addr), &ip.ip_dst,
+ sizeof(ip.ip_dst)) != 0) {
+ ifa_free(&ia6->ia_ifa);
+ return 0;
}
- DEBUG_PRINTF(1, "%s: check2: ia6->ia_addr is 2002::/16?\n", __func__);
- if (IN6_IS_ADDR_6TO4(&ia6->ia_addr.sin6_addr)) {
- /* 6to4 (RFC 3056) */
- /*
- * check if IPv4 src matches the IPv4 address derived
- * from the local 6to4 address masked by prefixmask.
- * success on: src = 10.1.1.1, ia6->ia_addr = 2002:0a00:.../24
- * fail on: src = 10.1.1.1, ia6->ia_addr = 2002:0b00:.../24
- */
- DEBUG_PRINTF(1, "%s: check2: true.\n", __func__);
-
- memcpy(&ia6_in4mask.sin_addr,
- GET_V4(&ia6->ia_prefixmask.sin6_addr),
- sizeof(ia6_in4mask));
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip_sprintf(buf, &ia6_in4addr.sin_addr);
- DEBUG_PRINTF(1, "%s: ia6->ia_addr = %s\n",
- __func__, buf);
- ip_sprintf(buf, &ip.ip_src);
- DEBUG_PRINTF(1, "%s: ip.ip_src = %s\n",
- __func__, buf);
- ip_sprintf(buf, &ia6_in4mask.sin_addr);
- DEBUG_PRINTF(1, "%s: ia6->ia_prefixmask = %s\n",
- __func__, buf);
-
- DEBUG_PRINTF(1, "%s: check3: ia6_in4addr.sin_addr & mask == ip.ip_src & mask\n",
- __func__);
- }
-#endif
-
- if ((ia6_in4addr.sin_addr.s_addr & ia6_in4mask.sin_addr.s_addr) !=
- (ip.ip_src.s_addr & ia6_in4mask.sin_addr.s_addr)) {
- DEBUG_PRINTF(1, "%s: check3: false. Ignore this packet.\n",
- __func__);
- goto freeit;
- }
- } else {
- /* 6rd (RFC 5569) */
- DEBUG_PRINTF(1, "%s: check2: false. 6rd.\n", __func__);
- /*
- * No restriction on the src address in the case of
- * 6rd because the stf(4) interface always has a
- * prefix which covers whole of IPv4 src address
- * range. So, stf_output() will catch all of
- * 6rd-capsuled IPv4 traffic with suspicious inner dst
- * IPv4 address (i.e. the IPv6 destination address is
- * one the admin does not like to route to outside),
- * and then it discard them silently.
- */
- }
- DEBUG_PRINTF(1, "%s: all clear!\n", __func__);
- /* stf interface makes single side match only */
- ret = 32;
-freeit:
+ /*
+ * check if IPv4 src matches the IPv4 address derived from the
+ * local 6to4 address masked by prefixmask.
+ * success on: src = 10.1.1.1, ia6->ia_addr = 2002:0a00:.../24
+ * fail on: src = 10.1.1.1, ia6->ia_addr = 2002:0b00:.../24
+ */
+ bzero(&a, sizeof(a));
+ bcopy(GET_V4(&ia6->ia_addr.sin6_addr), &a, sizeof(a));
+ bcopy(GET_V4(&ia6->ia_prefixmask.sin6_addr), &mask, sizeof(mask));
ifa_free(&ia6->ia_ifa);
+ a.s_addr &= mask.s_addr;
+ b = ip.ip_src;
+ b.s_addr &= mask.s_addr;
+ if (a.s_addr != b.s_addr)
+ return 0;
- return (ret);
+ /* stf interface makes single side match only */
+ return 32;
}
static struct in6_ifaddr *
-stf_getsrcifa6(struct ifnet *ifp)
+stf_getsrcifa6(ifp)
+ struct ifnet *ifp;
{
- struct ifaddr *ifa;
+ struct ifaddr *ia;
struct in_ifaddr *ia4;
- struct sockaddr_in *sin;
- struct sockaddr_in in4;
+ struct sockaddr_in6 *sin6;
+ struct in_addr in;
if_addr_rlock(ifp);
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
- if (ifa->ifa_addr->sa_family != AF_INET6)
+ TAILQ_FOREACH(ia, &ifp->if_addrhead, ifa_link) {
+ if (ia->ifa_addr->sa_family != AF_INET6)
continue;
- if ((sin = stf_getin4addr(&in4, ifa,
- STF_GETIN4_USE_CACHE)) == NULL)
+ sin6 = (struct sockaddr_in6 *)ia->ifa_addr;
+ if (!IN6_IS_ADDR_6TO4(&sin6->sin6_addr))
continue;
- LIST_FOREACH(ia4, INADDR_HASH(sin->sin_addr.s_addr), ia_hash)
- if (ia4->ia_addr.sin_addr.s_addr == sin->sin_addr.s_addr)
+
+ bcopy(GET_V4(&sin6->sin6_addr), &in, sizeof(in));
+ LIST_FOREACH(ia4, INADDR_HASH(in.s_addr), ia_hash)
+ if (ia4->ia_addr.sin_addr.s_addr == in.s_addr)
break;
if (ia4 == NULL)
continue;
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr);
- DEBUG_PRINTF(1, "%s: ifa->ifa_addr->sin6_addr = %s\n",
- __func__, buf);
- ip_sprintf(buf, &ia4->ia_addr.sin_addr);
- DEBUG_PRINTF(1, "%s: ia4->ia_addr.sin_addr = %s\n",
- __func__, buf);
- }
-#endif
- ifa_ref(ifa);
+ ifa_ref(ia);
if_addr_runlock(ifp);
- return (ifatoia6(ifa));
+ return (struct in6_ifaddr *)ia;
}
if_addr_runlock(ifp);
-
return NULL;
}
static int
-stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route *ro)
+stf_output(ifp, m, dst, ro)
+ struct ifnet *ifp;
+ struct mbuf *m;
+ struct sockaddr *dst;
+ struct route *ro;
{
struct stf_softc *sc;
struct sockaddr_in6 *dst6;
struct route *cached_route;
- struct sockaddr_in *sin;
- struct sockaddr_in in4;
+ struct in_addr in4;
+ caddr_t ptr;
struct sockaddr_in *dst4;
u_int8_t tos;
struct ip *ip;
@@ -599,28 +479,20 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route
/*
* Pickup the right outer dst addr from the list of candidates.
* ip6_dst has priority as it may be able to give us shorter IPv4 hops.
- * ip6_dst: destination addr in the packet header.
- * dst6: destination addr specified in function argument.
*/
- DEBUG_PRINTF(1, "%s: dst addr selection\n", __func__);
- sin = stf_getin4addr_in6(&in4, &ia6->ia_ifa, &ip6->ip6_dst);
- if (sin == NULL)
- sin = stf_getin4addr_in6(&in4, &ia6->ia_ifa, &dst6->sin6_addr);
- if (sin == NULL) {
+ ptr = NULL;
+ if (IN6_IS_ADDR_6TO4(&ip6->ip6_dst))
+ ptr = GET_V4(&ip6->ip6_dst);
+ else if (IN6_IS_ADDR_6TO4(&dst6->sin6_addr))
+ ptr = GET_V4(&dst6->sin6_addr);
+ else {
ifa_free(&ia6->ia_ifa);
m_freem(m);
ifp->if_oerrors++;
return ENETUNREACH;
}
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
+ bcopy(ptr, &in4, sizeof(in4));
- ip_sprintf(buf, &sin->sin_addr);
- DEBUG_PRINTF(1, "%s: ip_dst = %s\n", __func__, buf);
- }
-#endif
if (bpf_peers_present(ifp->if_bpf)) {
/*
* We need to prepend the address family as
@@ -644,26 +516,11 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route
ip = mtod(m, struct ip *);
bzero(ip, sizeof(*ip));
- bcopy(&in4.sin_addr, &ip->ip_dst, sizeof(ip->ip_dst));
-
- sin = stf_getin4addr_sin6(&in4, &ia6->ia_ifa, &ia6->ia_addr);
- if (sin == NULL) {
- ifa_free(&ia6->ia_ifa);
- m_freem(m);
- ifp->if_oerrors++;
- return ENETUNREACH;
- }
- bcopy(&in4.sin_addr, &ip->ip_src, sizeof(ip->ip_src));
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
- ip_sprintf(buf, &ip->ip_src);
- DEBUG_PRINTF(1, "%s: ip_src = %s\n", __func__, buf);
- }
-#endif
+ bcopy(GET_V4(&((struct sockaddr_in6 *)&ia6->ia_addr)->sin6_addr),
+ &ip->ip_src, sizeof(ip->ip_src));
ifa_free(&ia6->ia_ifa);
+ bcopy(&in4, &ip->ip_dst, sizeof(ip->ip_dst));
ip->ip_p = IPPROTO_IPV6;
ip->ip_ttl = ip_stf_ttl;
ip->ip_len = m->m_pkthdr.len; /*host order*/
@@ -672,7 +529,7 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route
else
ip_ecn_ingress(ECN_NOCARE, &ip->ip_tos, &tos);
- if (!V_stf_route_cache) {
+ if (!stf_route_cache) {
cached_route = NULL;
goto sendit;
}
@@ -680,7 +537,7 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route
/*
* Do we have a cached route?
*/
- STF_LOCK(sc);
+ mtx_lock(&(sc)->sc_ro_mtx);
dst4 = (struct sockaddr_in *)&sc->sc_ro.ro_dst;
if (dst4->sin_family != AF_INET ||
bcmp(&dst4->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst)) != 0) {
@@ -698,15 +555,8 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route
rtalloc_fib(&sc->sc_ro, sc->sc_fibnum);
if (sc->sc_ro.ro_rt == NULL) {
m_freem(m);
+ mtx_unlock(&(sc)->sc_ro_mtx);
ifp->if_oerrors++;
- STF_UNLOCK(sc);
- return ENETUNREACH;
- }
- if (sc->sc_ro.ro_rt->rt_ifp == ifp) {
- /* infinite loop detection */
- m_free(m);
- ifp->if_oerrors++;
- STF_UNLOCK(sc);
return ENETUNREACH;
}
}
@@ -715,31 +565,34 @@ stf_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct route
sendit:
M_SETFIB(m, sc->sc_fibnum);
ifp->if_opackets++;
- DEBUG_PRINTF(1, "%s: ip_output dispatch.\n", __func__);
error = ip_output(m, NULL, cached_route, 0, NULL, NULL);
if (cached_route != NULL)
- STF_UNLOCK(sc);
+ mtx_unlock(&(sc)->sc_ro_mtx);
return error;
}
static int
-isrfc1918addr(struct in_addr *in)
+isrfc1918addr(in)
+ struct in_addr *in;
{
/*
* returns 1 if private address range:
* 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
*/
- if ((ntohl(in->s_addr) & 0xff000000) == 10 << 24 ||
- (ntohl(in->s_addr) & 0xfff00000) == (172 * 256 + 16) << 16 ||
- (ntohl(in->s_addr) & 0xffff0000) == (192 * 256 + 168) << 16 )
+ if ((ntohl(in->s_addr) & 0xff000000) >> 24 == 10 ||
+ (ntohl(in->s_addr) & 0xfff00000) >> 16 == 172 * 256 + 16 ||
+ (ntohl(in->s_addr) & 0xffff0000) >> 16 == 192 * 256 + 168)
return 1;
return 0;
}
static int
-stf_checkaddr4(struct stf_softc *sc, struct in_addr *in, struct ifnet *inifp)
+stf_checkaddr4(sc, in, inifp)
+ struct stf_softc *sc;
+ struct in_addr *in;
+ struct ifnet *inifp; /* incoming interface */
{
struct in_ifaddr *ia4;
@@ -755,10 +608,20 @@ stf_checkaddr4(struct stf_softc *sc, struct in_addr *in, struct ifnet *inifp)
}
/*
+ * reject packets with private address range.
+ * (requirement from RFC3056 section 2 1st paragraph)
+ */
+ if (isrfc1918addr(in))
+ return -1;
+
+ /*
* reject packets with broadcast
*/
IN_IFADDR_RLOCK();
- TAILQ_FOREACH(ia4, &V_in_ifaddrhead, ia_link) {
+ for (ia4 = TAILQ_FIRST(&V_in_ifaddrhead);
+ ia4;
+ ia4 = TAILQ_NEXT(ia4, ia_link))
+ {
if ((ia4->ia_ifa.ifa_ifp->if_flags & IFF_BROADCAST) == 0)
continue;
if (in->s_addr == ia4->ia_broadaddr.sin_addr.s_addr) {
@@ -777,7 +640,7 @@ stf_checkaddr4(struct stf_softc *sc, struct in_addr *in, struct ifnet *inifp)
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
- sin.sin_len = sizeof(sin);
+ sin.sin_len = sizeof(struct sockaddr_in);
sin.sin_addr = *in;
rt = rtalloc1_fib((struct sockaddr *)&sin, 0,
0UL, sc->sc_fibnum);
@@ -798,7 +661,10 @@ stf_checkaddr4(struct stf_softc *sc, struct in_addr *in, struct ifnet *inifp)
}
static int
-stf_checkaddr6(struct stf_softc *sc, struct in6_addr *in6, struct ifnet *inifp)
+stf_checkaddr6(sc, in6, inifp)
+ struct stf_softc *sc;
+ struct in6_addr *in6;
+ struct ifnet *inifp; /* incoming interface */
{
/*
* check 6to4 addresses
@@ -822,7 +688,9 @@ stf_checkaddr6(struct stf_softc *sc, struct in6_addr *in6, struct ifnet *inifp)
}
void
-in_stf_input(struct mbuf *m, int off)
+in_stf_input(m, off)
+ struct mbuf *m;
+ int off;
{
int proto;
struct stf_softc *sc;
@@ -830,7 +698,6 @@ in_stf_input(struct mbuf *m, int off)
struct ip6_hdr *ip6;
u_int8_t otos, itos;
struct ifnet *ifp;
- struct route_in6 rin6;
proto = mtod(m, struct ip *)->ip_p;
@@ -854,17 +721,6 @@ in_stf_input(struct mbuf *m, int off)
mac_ifnet_create_mbuf(ifp, m);
#endif
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip_sprintf(buf, &ip->ip_dst);
- DEBUG_PRINTF(1, "%s: ip->ip_dst = %s\n", __func__, buf);
- ip_sprintf(buf, &ip->ip_src);
- DEBUG_PRINTF(1, "%s: ip->ip_src = %s\n", __func__, buf);
- }
-#endif
/*
* perform sanity check against outer src/dst.
* for source, perform ingress filter as well.
@@ -885,17 +741,6 @@ in_stf_input(struct mbuf *m, int off)
}
ip6 = mtod(m, struct ip6_hdr *);
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &ip6->ip6_dst);
- DEBUG_PRINTF(1, "%s: ip6->ip6_dst = %s\n", __func__, buf);
- ip6_sprintf(buf, &ip6->ip6_src);
- DEBUG_PRINTF(1, "%s: ip6->ip6_src = %s\n", __func__, buf);
- }
-#endif
/*
* perform sanity check against inner src/dst.
* for source, perform ingress filter as well.
@@ -906,41 +751,6 @@ in_stf_input(struct mbuf *m, int off)
return;
}
- /*
- * reject packets with private address range.
- * (requirement from RFC3056 section 2 1st paragraph)
- */
- if ((IN6_IS_ADDR_6TO4(&ip6->ip6_src) && isrfc1918addr(&ip->ip_src)) ||
- (IN6_IS_ADDR_6TO4(&ip6->ip6_dst) && isrfc1918addr(&ip->ip_dst))) {
- m_freem(m);
- return;
- }
-
- /*
- * Ignore if the destination is the same stf interface because
- * all of valid IPv6 outgoing traffic should go interfaces
- * except for it.
- */
- memset(&rin6, 0, sizeof(rin6));
- rin6.ro_dst.sin6_len = sizeof(rin6.ro_dst);
- rin6.ro_dst.sin6_family = AF_INET6;
- memcpy(&rin6.ro_dst.sin6_addr, &ip6->ip6_dst,
- sizeof(rin6.ro_dst.sin6_addr));
- rtalloc((struct route *)&rin6);
- if (rin6.ro_rt == NULL) {
- DEBUG_PRINTF(1, "%s: no IPv6 dst. Ignored.\n", __func__);
- m_free(m);
- return;
- }
- if ((rin6.ro_rt->rt_ifp == ifp) &&
- (!IN6_ARE_ADDR_EQUAL(&ip6->ip6_src, &rin6.ro_dst.sin6_addr))) {
- DEBUG_PRINTF(1, "%s: IPv6 dst is the same stf. Ignored.\n", __func__);
- RTFREE(rin6.ro_rt);
- m_free(m);
- return;
- }
- RTFREE(rin6.ro_rt);
-
itos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
if ((ifp->if_flags & IFF_LINK1) != 0)
ip_ecn_egress(ECN_ALLOWED, &otos, &itos);
@@ -950,7 +760,7 @@ in_stf_input(struct mbuf *m, int off)
ip6->ip6_flow |= htonl((u_int32_t)itos << 20);
m->m_pkthdr.rcvif = ifp;
-
+
if (bpf_peers_present(ifp->if_bpf)) {
/*
* We need to prepend the address family as
@@ -963,7 +773,6 @@ in_stf_input(struct mbuf *m, int off)
bpf_mtap2(ifp->if_bpf, &af, sizeof(af), m);
}
- DEBUG_PRINTF(1, "%s: netisr_dispatch(NETISR_IPV6)\n", __func__);
/*
* Put the packet to the network layer input queue according to the
* specified address family.
@@ -972,414 +781,56 @@ in_stf_input(struct mbuf *m, int off)
*/
ifp->if_ipackets++;
ifp->if_ibytes += m->m_pkthdr.len;
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(NETISR_IPV6, m);
}
/* ARGSUSED */
static void
-stf_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
+stf_rtrequest(cmd, rt, info)
+ int cmd;
+ struct rtentry *rt;
+ struct rt_addrinfo *info;
{
-
RT_LOCK_ASSERT(rt);
rt->rt_rmx.rmx_mtu = IPV6_MMTU;
}
-/* Check whether we have at least one instance with IFF_UP. */
static int
-stf_is_up(struct ifnet *ifp)
-{
- struct stf_softc *scp;
- struct stf_softc *sc_cur;
- struct stf_softc *sc_is_up;
-
- sc_is_up = NULL;
- if ((sc_cur = ifp->if_softc) == NULL)
- return (EINVAL);
-
- mtx_lock(&stf_mtx);
- LIST_FOREACH(scp, &V_stf_softc_list, stf_list) {
- if (scp == sc_cur)
- continue;
- if ((STF2IFP(scp)->if_flags & IFF_UP) != 0) {
- sc_is_up = scp;
- break;
- }
- }
- mtx_unlock(&stf_mtx);
-
- /* We already has at least one instance with IFF_UP. */
- if (stf_is_up != NULL)
- return (ENOSPC);
-
- return (0);
-}
-
-static struct sockaddr_in *
-stf_getin4addr_in6(struct sockaddr_in *sin,
- struct ifaddr *ifa,
- struct in6_addr *in6)
-{
- struct sockaddr_in6 sin6;
-
- DEBUG_PRINTF(1, "%s: enter.\n", __func__);
- if (ifa == NULL || in6 == NULL)
- return NULL;
-
- memset(&sin6, 0, sizeof(sin6));
- memcpy(&sin6.sin6_addr, in6, sizeof(sin6.sin6_addr));
- sin6.sin6_len = sizeof(sin6);
- sin6.sin6_family = AF_INET6;
-
- return(stf_getin4addr_sin6(sin, ifa, &sin6));
-}
-
-static struct sockaddr_in *
-stf_getin4addr_sin6(struct sockaddr_in *sin,
- struct ifaddr *ifa,
- struct sockaddr_in6 *sin6)
-{
- struct in6_ifaddr ia6;
- int i;
-
- DEBUG_PRINTF(1, "%s: enter.\n", __func__);
- if (ifa == NULL || sin6 == NULL)
- return NULL;
-
- memset(&ia6, 0, sizeof(ia6));
- memcpy(&ia6, ifatoia6(ifa), sizeof(ia6));
-
- /*
- * Use prefixmask information from ifa, and
- * address information from sin6.
- */
- ia6.ia_addr.sin6_family = AF_INET6;
- ia6.ia_ifa.ifa_addr = (struct sockaddr *)&ia6.ia_addr;
- ia6.ia_ifa.ifa_dstaddr = NULL;
- ia6.ia_ifa.ifa_netmask = (struct sockaddr *)&ia6.ia_prefixmask;
-
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &sin6->sin6_addr);
- DEBUG_PRINTF(1, "%s: sin6->sin6_addr = %s\n", __func__, buf);
- ip6_sprintf(buf, &ia6.ia_addr.sin6_addr);
- DEBUG_PRINTF(1, "%s: ia6.ia_addr.sin6_addr = %s\n", __func__, buf);
- ip6_sprintf(buf, &ia6.ia_prefixmask.sin6_addr);
- DEBUG_PRINTF(1, "%s: ia6.ia_prefixmask.sin6_addr = %s\n", __func__, buf);
- }
-#endif
-
- /*
- * When (src addr & src mask) != (dst (sin6) addr & src mask),
- * the dst is not in the 6rd domain. The IPv4 address must
- * not be used.
- */
- for (i = 0; i < sizeof(ia6.ia_addr.sin6_addr); i++) {
- if ((((u_char *)&ia6.ia_addr.sin6_addr)[i] &
- ((u_char *)&ia6.ia_prefixmask.sin6_addr)[i])
- !=
- (((u_char *)&sin6->sin6_addr)[i] &
- ((u_char *)&ia6.ia_prefixmask.sin6_addr)[i]))
- return NULL;
- }
-
- /* After the mask check, overwrite ia6.ia_addr with sin6. */
- memcpy(&ia6.ia_addr, sin6, sizeof(ia6.ia_addr));
- return(stf_getin4addr(sin, (struct ifaddr *)&ia6, 0));
-}
-
-static struct sockaddr_in *
-stf_getin4addr(struct sockaddr_in *sin,
- struct ifaddr *ifa,
- int flags)
-{
- struct in_addr *in;
- struct sockaddr_in6 *sin6;
- struct sockaddr_in6 *sin6d;
- struct in6_ifaddr *ia6;
-
- DEBUG_PRINTF(1, "%s: enter.\n", __func__);
- if (ifa == NULL ||
- ifa->ifa_addr == NULL ||
- ifa->ifa_addr->sa_family != AF_INET6)
- return NULL;
-
- sin6 = satosin6(ifa->ifa_addr);
- ia6 = ifatoia6(ifa);
-
- if (ifa->ifa_dstaddr != NULL) {
- switch (ifa->ifa_dstaddr->sa_family) {
- case AF_INET6:
- sin6d = satosin6(ifa->ifa_dstaddr);
- if (IN6_IS_ADDR_UNSPECIFIED(&sin6d->sin6_addr))
- break;
- if (IN6_IS_ADDR_V4COMPAT(&sin6d->sin6_addr)) {
- memset(sin, 0, sizeof(*sin));
- sin->sin_family = AF_INET;
- sin->sin_addr.s_addr =
- *(const u_int32_t *)(const void *)(&sin6d->sin6_addr.s6_addr[12]);
- if (flags & STF_GETIN4_USE_CACHE) {
- /*
- * XXX: ifa_dstaddr is used as a cache of the
- * extracted IPv4 address.
- */
- memcpy(sin, satosin(ifa->ifa_dstaddr), sizeof(*sin));
- ifa->ifa_dstaddr->sa_family = AF_INET;
- }
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip_sprintf(buf, &sin->sin_addr);
- DEBUG_PRINTF(1, "%s: specified dst address was used = %s\n", __func__, buf);
- }
-#endif
- return (sin);
- } else {
- DEBUG_PRINTF(1, "Not a V4COMPAT address!\n");
- return (NULL);
- }
- /* NOT REACHED */
- break;
- case AF_INET:
- if (flags & STF_GETIN4_USE_CACHE) {
- /*
- * XXX: ifa_dstaddr is used as a cache of the
- * extracted IPv4 address.
- */
- memcpy(sin, satosin(ifa->ifa_dstaddr), sizeof(*sin));
- ifa->ifa_dstaddr->sa_family = AF_INET;
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip_sprintf(buf, &sin->sin_addr);
- DEBUG_PRINTF(1, "%s: cached address was used = %s\n", __func__, buf);
- }
-#endif
- return (sin);
- }
- }
- }
- memset(sin, 0, sizeof(*sin));
- in = &sin->sin_addr;
-
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &sin6->sin6_addr);
- DEBUG_PRINTF(1, "%s: sin6->sin6_addr = %s\n", __func__, buf);
- }
-#endif
-
- if (IN6_IS_ADDR_6TO4(&sin6->sin6_addr)) {
- /* 6to4 (RFC 3056) */
- bcopy(GET_V4(&sin6->sin6_addr), in, sizeof(*in));
- if (isrfc1918addr(in))
- return NULL;
- } else {
- /* 6rd (RFC 5569) */
- struct in6_addr buf;
- u_char *p = (u_char *)&buf;
- u_char *q = (u_char *)in;
- u_int residue = 0;
- u_char mask;
- int i;
- u_int plen;
-
- /*
- * 6rd-relays IPv6 prefix is located at a 32-bit just
- * after the prefix edge.
- */
- plen = in6_mask2len(&satosin6(ifa->ifa_netmask)->sin6_addr, NULL);
- if (32 < plen)
- return NULL;
-
- memcpy(&buf, &sin6->sin6_addr, sizeof(buf));
- p += plen / 8;
- residue = plen % 8;
- mask = ~((u_char)(-1) >> residue);
-
- /*
- * The p points head of the IPv4 address part in
- * bytes. The residue is a bit-shift factor when
- * prefixlen is not a multiple of 8.
- */
- for (i = 0; i < 4; i++) {
- DEBUG_PRINTF(2, "p[%d] = %d\n", i, p[i]);
- DEBUG_PRINTF(2, "residue = %d\n", residue);
- if (residue) {
- p[i] <<= residue;
- DEBUG_PRINTF(2, "p[%d] << residue = %d\n",
- i, p[i]);
- DEBUG_PRINTF(2, "mask = %x\n",
- mask);
- DEBUG_PRINTF(2, "p[%d + 1] & mask = %d\n",
- i, p[i + 1] & mask);
- DEBUG_PRINTF(2, "p[%d + 1] & mask >> (8 - residue) = %d\n",
- i, (p[i + 1] & mask) >> (8-residue));
- p[i] |= ((p[i+1] & mask) >> (8 - residue));
- }
- q[i] = p[i];
- }
- }
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip_sprintf(buf, in);
- DEBUG_PRINTF(1, "%s: in->in_addr = %s\n", __func__, buf);
- DEBUG_PRINTF(1, "%s: leave\n", __func__);
- }
-#endif
- if (flags & STF_GETIN4_USE_CACHE) {
- DEBUG_PRINTF(1, "%s: try to memset 0 to ia_dstaddr.\n", __func__);
- memset(&ia6->ia_dstaddr, 0, sizeof(ia6->ia_dstaddr));
- DEBUG_PRINTF(1, "%s: try to access ifa->ifa_dstaddr.\n", __func__);
- ifa->ifa_dstaddr = (struct sockaddr *)&ia6->ia_dstaddr;
- DEBUG_PRINTF(1, "%s: try to memcpy ifa->ifa_dstaddr.\n", __func__);
- memcpy((struct sockaddr_in *)ifa->ifa_dstaddr,
- sin, sizeof(struct sockaddr_in));
- DEBUG_PRINTF(1, "%s: try to set sa_family.\n", __func__);
- ifa->ifa_dstaddr->sa_family = AF_INET;
- DEBUG_PRINTF(1, "%s: in->in_addr is stored in ifa_dstaddr.\n",
- __func__);
- }
- return (sin);
-}
-
-static void
-stf_ifaddr_change(void *arg __unused, struct ifnet *ifp)
-{
- struct sockaddr_in in4;
- struct ifaddr *ifa;
-
- DEBUG_PRINTF(1, "%s: enter.\n", __func__);
-
- if_addr_rlock(ifp);
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
- if (ifa->ifa_addr == NULL)
- continue;
- if (ifa->ifa_addr->sa_family != AF_INET6)
- continue;
- if (ifa->ifa_dstaddr != NULL) {
- DEBUG_PRINTF(1, "%s: ifa->ifa_dstaddr != NULL!.\n", __func__);
-
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &satosin6(ifa->ifa_addr)->sin6_addr);
- DEBUG_PRINTF(1, "%s: ifa_addr = %s\n", __func__, buf);
- }
-#endif
- switch (ifa->ifa_dstaddr->sa_family) {
- case AF_INET:
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip_sprintf(buf, &satosin(ifa->ifa_dstaddr)->sin_addr);
- DEBUG_PRINTF(1, "%s: ifa_dstaddr = %s\n", __func__, buf);
- }
-#endif
- continue;
- case AF_INET6:
-#if STF_DEBUG
- {
- char buf[INET6_ADDRSTRLEN + 1];
- memset(&buf, 0, sizeof(buf));
-
- ip6_sprintf(buf, &satosin6(ifa->ifa_dstaddr)->sin6_addr);
- DEBUG_PRINTF(1, "%s: ifa_dstaddr = %s\n", __func__, buf);
- }
-#endif
- if (IN6_IS_ADDR_V4COMPAT(&satosin6(ifa->ifa_dstaddr)->sin6_addr)) {
- }
- if (!IN6_IS_ADDR_UNSPECIFIED(&satosin6(ifa->ifa_dstaddr)->sin6_addr))
- continue;
- }
- }
- DEBUG_PRINTF(1, "%s: ifa->ifa_dstaddr == NULL or ::!.\n", __func__);
- /*
- * Extract IPv4 address from IPv6 address,
- * then store it into ifa_dstaddr as the
- * destination.
- */
- if (stf_getin4addr(&in4, ifa, STF_GETIN4_USE_CACHE) == NULL) {
- ifatoia6(ifa)->ia_flags |= IN6_IFF_DETACHED;
- continue;
- }
- }
- if_addr_runlock(ifp);
-}
-
-static int
-stf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
+stf_ioctl(ifp, cmd, data)
+ struct ifnet *ifp;
+ u_long cmd;
+ caddr_t data;
{
struct ifaddr *ifa;
struct ifreq *ifr;
-/*
- struct in6_aliasreq *ifra6;
-*/
- struct in6_aliasreq ifra;
-/*
- struct sockaddr_in6 *sa6;
-*/
+ struct sockaddr_in6 *sin6;
+ struct in_addr addr;
int error;
- memset(&ifra, 0, sizeof(ifra));
- /*
- * Sanity check: if more than two interfaces have IFF_UP, do
- * if_down() for all of them except for the specified one.
- */
- if (ifp->if_flags & IFF_UP) {
- struct stf_softc *sc_cur = ifp->if_softc;
- struct stf_softc *sc;
-
- mtx_lock(&stf_mtx);
- LIST_FOREACH(sc, &V_stf_softc_list, stf_list) {
- if (sc == sc_cur)
- continue;
- if ((STF2IFP(sc)->if_flags & IFF_UP) != 0) {
- if_printf(STF2IFP(sc),
- "marked as DOWN because at least "
- "one instance of stf(4) is already "
- "working.\n");
- if_down(STF2IFP(sc));
- }
- }
- mtx_unlock(&stf_mtx);
- }
-
error = 0;
switch (cmd) {
case SIOCSIFADDR:
- DEBUG_PRINTF(1, "enter SIOCSIFADDR.\n");
ifa = (struct ifaddr *)data;
- if (ifa == NULL) {
+ if (ifa == NULL || ifa->ifa_addr->sa_family != AF_INET6) {
error = EAFNOSUPPORT;
break;
}
- if (ifa->ifa_addr->sa_family == AF_INET6 &&
- ifa->ifa_dstaddr->sa_family == AF_INET &&
- ifa->ifa_netmask->sa_family == AF_INET6) {
- ifa->ifa_rtrequest = stf_rtrequest;
- ifp->if_flags |= IFF_UP;
- } else {
+ sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
+ if (!IN6_IS_ADDR_6TO4(&sin6->sin6_addr)) {
error = EINVAL;
break;
}
+ bcopy(GET_V4(&sin6->sin6_addr), &addr, sizeof(addr));
+ if (isrfc1918addr(&addr)) {
+ error = EINVAL;
+ break;
+ }
+
+ ifa->ifa_rtrequest = stf_rtrequest;
+ ifp->if_flags |= IFF_UP;
break;
+
case SIOCADDMULTI:
case SIOCDELMULTI:
ifr = (struct ifreq *)data;
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index 49a5249..d74c9fe 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -929,6 +929,7 @@ tunwrite(struct cdev *dev, struct uio *uio, int flag)
ifp->if_ibytes += m->m_pkthdr.len;
ifp->if_ipackets++;
CURVNET_SET(ifp->if_vnet);
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
CURVNET_RESTORE();
return (0);
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index b3ecb7d..d6eb7f1 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -195,14 +195,15 @@ struct ifnet {
/* protected by if_addr_mtx */
void *if_pf_kif;
void *if_lagg; /* lagg glue */
- u_char if_alloctype; /* if_type at time of allocation */
+ u_char if_alloctype; /* if_type at time of allocation */
+ u_int if_fib; /* interface FIB */
/*
* Spare fields are added so that we can modify sensitive data
* structures without changing the kernel binary interface, and must
* be used with care where binary compatibility is required.
*/
- char if_cspare[3];
+ char if_cspare[3];
char *if_description; /* interface description */
void *if_pspare[7];
int if_ispare[4];
diff --git a/sys/net/route.c b/sys/net/route.c
index a41efa9..9c7dfac 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -116,12 +116,6 @@ VNET_DEFINE(int, rttrash); /* routes not in table but not freed */
static VNET_DEFINE(uma_zone_t, rtzone); /* Routing table UMA zone. */
#define V_rtzone VNET(rtzone)
-#if 0
-/* default fib for tunnels to use */
-u_int tunnel_fib = 0;
-SYSCTL_INT(_net, OID_AUTO, tunnelfib, CTLFLAG_RD, &tunnel_fib, 0, "");
-#endif
-
/*
* handler for net.my_fibnum
*/
@@ -1189,6 +1183,7 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt,
rt0 = NULL;
/* XXX
* "flow-table" only support IPv4 at the moment.
+ * XXX-BZ as of r205066 it would support IPv6.
*/
#ifdef INET
if (dst->sa_family == AF_INET) {
diff --git a/sys/net/route.h b/sys/net/route.h
index 5031533..0bc72d7 100644
--- a/sys/net/route.h
+++ b/sys/net/route.h
@@ -108,8 +108,6 @@ struct rt_metrics {
#endif
extern u_int rt_numfibs; /* number fo usable routing tables */
-extern u_int tunnel_fib; /* tunnels use these */
-extern u_int fwd_fib; /* packets being forwarded use these routes */
/*
* XXX kernel function pointer `rt_output' is visible to applications.
*/
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 72d36b1..999557a 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -373,14 +373,14 @@ rts_sockaddr(struct socket *so, struct sockaddr **nam)
static struct pr_usrreqs route_usrreqs = {
.pru_abort = rts_abort,
.pru_attach = rts_attach,
- .pru_bind = raw_bind,
- .pru_connect = raw_connect,
+ .pru_bind = rts_bind,
+ .pru_connect = rts_connect,
.pru_detach = rts_detach,
- .pru_disconnect = raw_disconnect,
- .pru_peeraddr = raw_peeraddr,
- .pru_send = raw_send,
- .pru_shutdown = raw_shutdown,
- .pru_sockaddr = raw_sockaddr,
+ .pru_disconnect = rts_disconnect,
+ .pru_peeraddr = rts_peeraddr,
+ .pru_send = rts_send,
+ .pru_shutdown = rts_shutdown,
+ .pru_sockaddr = rts_sockaddr,
.pru_close = rts_close,
};
diff --git a/sys/net80211/ieee80211_ageq.c b/sys/net80211/ieee80211_ageq.c
index ea223f7..018ddc2 100644
--- a/sys/net80211/ieee80211_ageq.c
+++ b/sys/net80211/ieee80211_ageq.c
@@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$");
void
ieee80211_ageq_init(struct ieee80211_ageq *aq, int maxlen, const char *name)
{
- memset(aq, 0, sizeof(aq));
+ memset(aq, 0, sizeof(*aq));
aq->aq_maxlen = maxlen;
IEEE80211_AGEQ_INIT(aq, name); /* OS-dependent setup */
}
diff --git a/sys/net80211/ieee80211_dfs.c b/sys/net80211/ieee80211_dfs.c
index e15445d..19e552d 100644
--- a/sys/net80211/ieee80211_dfs.c
+++ b/sys/net80211/ieee80211_dfs.c
@@ -320,6 +320,8 @@ ieee80211_dfs_notify_radar(struct ieee80211com *ic, struct ieee80211_channel *ch
* on the NOL to expire.
*/
/*XXX*/
+ if_printf(ic->ic_ifp, "%s: No free channels; waiting for entry "
+ "on NOL to expire\n", __func__);
}
} else {
/*
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
index c9d8448..61c84e9 100644
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -217,6 +217,9 @@ static int ieee80211_addba_response(struct ieee80211_node *ni,
int code, int baparamset, int batimeout);
static void ieee80211_addba_stop(struct ieee80211_node *ni,
struct ieee80211_tx_ampdu *tap);
+static void null_addba_response_timeout(struct ieee80211_node *ni,
+ struct ieee80211_tx_ampdu *tap);
+
static void ieee80211_bar_response(struct ieee80211_node *ni,
struct ieee80211_tx_ampdu *tap, int status);
static void ampdu_tx_stop(struct ieee80211_tx_ampdu *tap);
@@ -234,6 +237,7 @@ ieee80211_ht_attach(struct ieee80211com *ic)
ic->ic_ampdu_enable = ieee80211_ampdu_enable;
ic->ic_addba_request = ieee80211_addba_request;
ic->ic_addba_response = ieee80211_addba_response;
+ ic->ic_addba_response_timeout = null_addba_response_timeout;
ic->ic_addba_stop = ieee80211_addba_stop;
ic->ic_bar_response = ieee80211_bar_response;
ic->ic_ampdu_rx_start = ampdu_rx_start;
@@ -1691,14 +1695,23 @@ ampdu_tx_stop(struct ieee80211_tx_ampdu *tap)
tap->txa_flags &= ~(IEEE80211_AGGR_SETUP | IEEE80211_AGGR_NAK);
}
+/*
+ * ADDBA response timeout.
+ *
+ * If software aggregation and per-TID queue management was done here,
+ * that queue would be unpaused after the ADDBA timeout occurs.
+ */
static void
addba_timeout(void *arg)
{
struct ieee80211_tx_ampdu *tap = arg;
+ struct ieee80211_node *ni = tap->txa_ni;
+ struct ieee80211com *ic = ni->ni_ic;
/* XXX ? */
tap->txa_flags &= ~IEEE80211_AGGR_XCHGPEND;
tap->txa_attempts++;
+ ic->ic_addba_response_timeout(ni, tap);
}
static void
@@ -1721,6 +1734,12 @@ addba_stop_timeout(struct ieee80211_tx_ampdu *tap)
}
}
+static void
+null_addba_response_timeout(struct ieee80211_node *ni,
+ struct ieee80211_tx_ampdu *tap)
+{
+}
+
/*
* Default method for requesting A-MPDU tx aggregation.
* We setup the specified state block and start a timer
diff --git a/sys/net80211/ieee80211_power.c b/sys/net80211/ieee80211_power.c
index aad82ba..201eea0 100644
--- a/sys/net80211/ieee80211_power.c
+++ b/sys/net80211/ieee80211_power.c
@@ -102,7 +102,7 @@ ieee80211_power_vdetach(struct ieee80211vap *vap)
void
ieee80211_psq_init(struct ieee80211_psq *psq, const char *name)
{
- memset(psq, 0, sizeof(psq));
+ memset(psq, 0, sizeof(*psq));
psq->psq_maxlen = IEEE80211_PS_MAX_QUEUE;
IEEE80211_PSQ_INIT(psq, name); /* OS-dependent setup */
}
diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h
index 39cf347..a3dcd9f 100644
--- a/sys/net80211/ieee80211_var.h
+++ b/sys/net80211/ieee80211_var.h
@@ -307,6 +307,8 @@ struct ieee80211com {
int status, int baparamset, int batimeout);
void (*ic_addba_stop)(struct ieee80211_node *,
struct ieee80211_tx_ampdu *);
+ void (*ic_addba_response_timeout)(struct ieee80211_node *,
+ struct ieee80211_tx_ampdu *);
/* BAR response received */
void (*ic_bar_response)(struct ieee80211_node *,
struct ieee80211_tx_ampdu *, int status);
diff --git a/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c b/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
index a13ef4d..d3f8fd3 100644
--- a/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
+++ b/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c
@@ -382,14 +382,14 @@ static const struct usb_config ubt_config[UBT_N_TRANSFER] =
* where VENDOR_ID and PRODUCT_ID are hex numbers.
*/
-static const struct usb_device_id ubt_ignore_devs[] =
+static const STRUCT_USB_HOST_ID ubt_ignore_devs[] =
{
/* AVM USB Bluetooth-Adapter BlueFritz! v1.0 */
{ USB_VPI(USB_VENDOR_AVM, 0x2200, 0) },
};
/* List of supported bluetooth devices */
-static const struct usb_device_id ubt_devs[] =
+static const STRUCT_USB_HOST_ID ubt_devs[] =
{
/* Generic Bluetooth class devices */
{ USB_IFACE_CLASS(UDCLASS_WIRELESS),
diff --git a/sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c b/sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c
index 3d8a05e..da00e05 100644
--- a/sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c
+++ b/sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c
@@ -180,7 +180,7 @@ MODULE_DEPEND(ubtbcmfw, usb, 1, 1, 1);
static int
ubtbcmfw_probe(device_t dev)
{
- const struct usb_device_id devs[] = {
+ static const STRUCT_USB_HOST_ID devs[] = {
/* Broadcom BCM2033 devices only */
{ USB_VPI(USB_VENDOR_BROADCOM, USB_PRODUCT_BROADCOM_BCM2033, 0) },
};
diff --git a/sys/netgraph/netflow/netflow.c b/sys/netgraph/netflow/netflow.c
index dfbb507..8ec5629 100644
--- a/sys/netgraph/netflow/netflow.c
+++ b/sys/netgraph/netflow/netflow.c
@@ -100,7 +100,7 @@ static int export_send(priv_p, fib_export_p, item_p, int);
static int hash_insert(priv_p, struct flow_hash_entry *, struct flow_rec *, int, uint8_t);
#ifdef INET6
-static int hash6_insert(priv_p, struct flow6_hash_entry *, struct flow6_rec *, int, uint8_t);
+static int hash6_insert(priv_p, struct flow_hash_entry *, struct flow6_rec *, int, uint8_t);
#endif
static __inline void expire_flow(priv_p, fib_export_p, struct flow_entry *, int);
@@ -412,7 +412,7 @@ hash_insert(priv_p priv, struct flow_hash_entry *hsh, struct flow_rec *r,
bitcount32((x).__u6_addr.__u6_addr32[3])
/* XXX: Do we need inline here ? */
static __inline int
-hash6_insert(priv_p priv, struct flow6_hash_entry *hsh6, struct flow6_rec *r,
+hash6_insert(priv_p priv, struct flow_hash_entry *hsh6, struct flow6_rec *r,
int plen, uint8_t tcp_flags)
{
struct flow6_entry *fle6;
@@ -491,7 +491,7 @@ hash6_insert(priv_p priv, struct flow6_hash_entry *hsh6, struct flow6_rec *r,
}
/* Push new flow at the and of hash. */
- TAILQ_INSERT_TAIL(&hsh6->head, fle6, fle6_hash);
+ TAILQ_INSERT_TAIL(&hsh6->head, (struct flow_entry *)fle6, fle_hash);
return (0);
}
@@ -507,9 +507,6 @@ void
ng_netflow_cache_init(priv_p priv)
{
struct flow_hash_entry *hsh;
-#ifdef INET6
- struct flow6_hash_entry *hsh6;
-#endif
int i;
/* Initialize cache UMA zone. */
@@ -534,13 +531,13 @@ ng_netflow_cache_init(priv_p priv)
#ifdef INET6
/* Allocate hash. */
- priv->hash6 = malloc(NBUCKETS * sizeof(struct flow6_hash_entry),
+ priv->hash6 = malloc(NBUCKETS * sizeof(struct flow_hash_entry),
M_NETFLOW_HASH, M_WAITOK | M_ZERO);
/* Initialize hash. */
- for (i = 0, hsh6 = priv->hash6; i < NBUCKETS; i++, hsh6++) {
- mtx_init(&hsh6->mtx, "hash mutex", NULL, MTX_DEF);
- TAILQ_INIT(&hsh6->head);
+ for (i = 0, hsh = priv->hash6; i < NBUCKETS; i++, hsh++) {
+ mtx_init(&hsh->mtx, "hash mutex", NULL, MTX_DEF);
+ TAILQ_INIT(&hsh->head);
}
#endif
@@ -588,10 +585,6 @@ ng_netflow_cache_flush(priv_p priv)
{
struct flow_entry *fle, *fle1;
struct flow_hash_entry *hsh;
-#ifdef INET6
- struct flow6_entry *fle6, *fle61;
- struct flow6_hash_entry *hsh6;
-#endif
struct netflow_export_item exp;
fib_export_p fe;
int i;
@@ -610,11 +603,11 @@ ng_netflow_cache_flush(priv_p priv)
expire_flow(priv, fe, fle, NG_QUEUE);
}
#ifdef INET6
- for (hsh6 = priv->hash6, i = 0; i < NBUCKETS; hsh6++, i++)
- TAILQ_FOREACH_SAFE(fle6, &hsh6->head, fle6_hash, fle61) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- fe = priv_to_fib(priv, fle6->f.r.fib);
- expire_flow(priv, fe, (struct flow_entry *)fle6, NG_QUEUE);
+ for (hsh = priv->hash6, i = 0; i < NBUCKETS; hsh++, i++)
+ TAILQ_FOREACH_SAFE(fle, &hsh->head, fle_hash, fle1) {
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ fe = priv_to_fib(priv, fle->f.r.fib);
+ expire_flow(priv, fe, fle, NG_QUEUE);
}
#endif
@@ -629,8 +622,8 @@ ng_netflow_cache_flush(priv_p priv)
#ifdef INET6
uma_zdestroy(priv->zone6);
/* Destroy hash mutexes. */
- for (i = 0, hsh6 = priv->hash6; i < NBUCKETS; i++, hsh6++)
- mtx_destroy(&hsh6->mtx);
+ for (i = 0, hsh = priv->hash6; i < NBUCKETS; i++, hsh++)
+ mtx_destroy(&hsh->mtx);
/* Free hash memory. */
if (priv->hash6 != NULL)
@@ -790,8 +783,9 @@ int
ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t upper_ptr, uint8_t upper_proto,
uint8_t is_frag, unsigned int src_if_index)
{
- register struct flow6_entry *fle6 = NULL, *fle61;
- struct flow6_hash_entry *hsh6;
+ register struct flow_entry *fle = NULL, *fle1;
+ register struct flow6_entry *fle6;
+ struct flow_hash_entry *hsh;
struct flow6_rec r;
int plen;
int error = 0;
@@ -846,9 +840,9 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
priv->info.nfinfo_bytes6 += plen;
/* Find hash slot. */
- hsh6 = &priv->hash6[ip6_hash(&r)];
+ hsh = &priv->hash6[ip6_hash(&r)];
- mtx_lock(&hsh6->mtx);
+ mtx_lock(&hsh->mtx);
/*
* Go through hash and find our entry. If we encounter an
@@ -856,19 +850,22 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
* search since most active entries are first, and most
* searches are done on most active entries.
*/
- TAILQ_FOREACH_REVERSE_SAFE(fle6, &hsh6->head, f6head, fle6_hash, fle61) {
- if (fle6->f.version != IP6VERSION)
+ TAILQ_FOREACH_REVERSE_SAFE(fle, &hsh->head, fhead, fle_hash, fle1) {
+ if (fle->f.version != IP6VERSION)
continue;
+ fle6 = (struct flow6_entry *)fle;
if (bcmp(&r, &fle6->f.r, sizeof(struct flow6_rec)) == 0)
break;
if ((INACTIVE(fle6) && SMALL(fle6)) || AGED(fle6)) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- expire_flow(priv, priv_to_fib(priv, fle6->f.r.fib), (struct flow_entry *)fle6, NG_QUEUE);
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ expire_flow(priv, priv_to_fib(priv, fle->f.r.fib), fle,
+ NG_QUEUE);
atomic_add_32(&priv->info.nfinfo_act_exp, 1);
}
}
- if (fle6 != NULL) { /* An existent entry. */
+ if (fle != NULL) { /* An existent entry. */
+ fle6 = (struct flow6_entry *)fle;
fle6->f.bytes += plen;
fle6->f.packets ++;
@@ -883,8 +880,9 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
*/
if (tcp_flags & TH_FIN || tcp_flags & TH_RST || AGED(fle6) ||
(fle6->f.bytes >= (CNTR_MAX - IF_MAXMTU)) ) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- expire_flow(priv, priv_to_fib(priv, fle6->f.r.fib), (struct flow_entry *)fle6, NG_QUEUE);
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ expire_flow(priv, priv_to_fib(priv, fle->f.r.fib), fle,
+ NG_QUEUE);
atomic_add_32(&priv->info.nfinfo_act_exp, 1);
} else {
/*
@@ -892,15 +890,15 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
* if it isn't there already. Next search will
* locate it quicker.
*/
- if (fle6 != TAILQ_LAST(&hsh6->head, f6head)) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- TAILQ_INSERT_TAIL(&hsh6->head, fle6, fle6_hash);
+ if (fle != TAILQ_LAST(&hsh->head, fhead)) {
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ TAILQ_INSERT_TAIL(&hsh->head, fle, fle_hash);
}
}
} else /* A new flow entry. */
- error = hash6_insert(priv, hsh6, &r, plen, tcp_flags);
+ error = hash6_insert(priv, hsh, &r, plen, tcp_flags);
- mtx_unlock(&hsh6->mtx);
+ mtx_unlock(&hsh->mtx);
return (error);
}
@@ -910,64 +908,109 @@ ng_netflow_flow6_add(priv_p priv, fib_export_p fe, struct ip6_hdr *ip6, caddr_t
* Return records from cache to userland.
*
* TODO: matching particular IP should be done in kernel, here.
- * XXX: IPv6 flows will return random data
*/
int
-ng_netflow_flow_show(priv_p priv, uint32_t last, struct ng_mesg *resp)
+ng_netflow_flow_show(priv_p priv, struct ngnf_show_header *req,
+struct ngnf_show_header *resp)
{
struct flow_hash_entry *hsh;
struct flow_entry *fle;
- struct ngnf_flows *data;
- int i;
+ struct flow_entry_data *data = (struct flow_entry_data *)(resp + 1);
+#ifdef INET6
+ struct flow6_entry_data *data6 = (struct flow6_entry_data *)(resp + 1);
+#endif
+ int i, max;
- data = (struct ngnf_flows *)resp->data;
- data->last = 0;
- data->nentries = 0;
+ i = req->hash_id;
+ if (i > NBUCKETS-1)
+ return (EINVAL);
- /* Check if this is a first run */
- if (last == 0) {
- hsh = priv->hash;
- i = 0;
- } else {
- if (last > NBUCKETS-1)
- return (EINVAL);
- hsh = priv->hash + last;
- i = last;
- }
+#ifdef INET6
+ if (req->version == 6) {
+ resp->version = 6;
+ hsh = priv->hash6 + i;
+ max = NREC6_AT_ONCE;
+ } else
+#endif
+ if (req->version == 4) {
+ resp->version = 4;
+ hsh = priv->hash + i;
+ max = NREC_AT_ONCE;
+ } else
+ return (EINVAL);
/*
* We will transfer not more than NREC_AT_ONCE. More data
* will come in next message.
- * We send current hash index to userland, and userland should
- * return it back to us. Then, we will restart with new entry.
+ * We send current hash index and current record number in list
+ * to userland, and userland should return it back to us.
+ * Then, we will restart with new entry.
*
- * The resulting cache snapshot is inaccurate for the
- * following reasons:
- * - we skip locked hash entries
- * - we bail out, if someone wants our entry
- * - we skip rest of entry, when hit NREC_AT_ONCE
+ * The resulting cache snapshot can be inaccurate if flow expiration
+ * is taking place on hash item between userland data requests for
+ * this hash item id.
*/
+ resp->nentries = 0;
for (; i < NBUCKETS; hsh++, i++) {
- if (mtx_trylock(&hsh->mtx) == 0)
- continue;
+ int list_id;
+ if (mtx_trylock(&hsh->mtx) == 0) {
+ /*
+ * Requested hash index is not available,
+ * relay decision to skip or re-request data
+ * to userland.
+ */
+ resp->hash_id = i;
+ resp->list_id = 0;
+ return (0);
+ }
+
+ list_id = 0;
TAILQ_FOREACH(fle, &hsh->head, fle_hash) {
- if (hsh->mtx.mtx_lock & MTX_CONTESTED)
- break;
+ if (hsh->mtx.mtx_lock & MTX_CONTESTED) {
+ resp->hash_id = i;
+ resp->list_id = list_id;
+ mtx_unlock(&hsh->mtx);
+ return (0);
+ }
+
+ list_id++;
+ /* Search for particular record in list. */
+ if (req->list_id > 0) {
+ if (list_id < req->list_id)
+ continue;
- bcopy(&fle->f, &(data->entries[data->nentries]),
- sizeof(fle->f));
- data->nentries++;
- if (data->nentries == NREC_AT_ONCE) {
+ /* Requested list position found. */
+ req->list_id = 0;
+ }
+#ifdef INET6
+ if (req->version == 6) {
+ struct flow6_entry *fle6;
+
+ fle6 = (struct flow6_entry *)fle;
+ bcopy(&fle6->f, data6 + resp->nentries,
+ sizeof(fle6->f));
+ } else
+#endif
+ bcopy(&fle->f, data + resp->nentries,
+ sizeof(fle->f));
+ resp->nentries++;
+ if (resp->nentries == max) {
+ resp->hash_id = i;
+ /*
+ * If it was the last item in list
+ * we simply skip to next hash_id.
+ */
+ resp->list_id = list_id + 1;
mtx_unlock(&hsh->mtx);
- if (++i < NBUCKETS)
- data->last = i;
return (0);
}
}
mtx_unlock(&hsh->mtx);
}
+ resp->hash_id = resp->list_id = 0;
+
return (0);
}
@@ -1057,10 +1100,6 @@ ng_netflow_expire(void *arg)
{
struct flow_entry *fle, *fle1;
struct flow_hash_entry *hsh;
-#ifdef INET6
- struct flow6_entry *fle6, *fle61;
- struct flow6_hash_entry *hsh6;
-#endif
priv_p priv = (priv_p )arg;
uint32_t used;
int i;
@@ -1103,20 +1142,23 @@ ng_netflow_expire(void *arg)
}
#ifdef INET6
- for (hsh6 = priv->hash6, i = 0; i < NBUCKETS; hsh6++, i++) {
+ for (hsh = priv->hash6, i = 0; i < NBUCKETS; hsh++, i++) {
+ struct flow6_entry *fle6;
+
/*
* Skip entries, that are already being worked on.
*/
- if (mtx_trylock(&hsh6->mtx) == 0)
+ if (mtx_trylock(&hsh->mtx) == 0)
continue;
used = atomic_load_acq_32(&priv->info.nfinfo_used6);
- TAILQ_FOREACH_SAFE(fle6, &hsh6->head, fle6_hash, fle61) {
+ TAILQ_FOREACH_SAFE(fle, &hsh->head, fle_hash, fle1) {
+ fle6 = (struct flow6_entry *)fle;
/*
* Interrupt thread wants this entry!
* Quick! Quick! Bail out!
*/
- if (hsh6->mtx.mtx_lock & MTX_CONTESTED)
+ if (hsh->mtx.mtx_lock & MTX_CONTESTED)
break;
/*
@@ -1128,13 +1170,14 @@ ng_netflow_expire(void *arg)
if ((INACTIVE(fle6) && (SMALL(fle6) ||
(used > (NBUCKETS*2)))) || AGED(fle6)) {
- TAILQ_REMOVE(&hsh6->head, fle6, fle6_hash);
- expire_flow(priv, priv_to_fib(priv, fle6->f.r.fib), (struct flow_entry *)fle6, NG_NOFLAGS);
+ TAILQ_REMOVE(&hsh->head, fle, fle_hash);
+ expire_flow(priv, priv_to_fib(priv,
+ fle->f.r.fib), fle, NG_NOFLAGS);
used--;
atomic_add_32(&priv->info.nfinfo_inact_exp, 1);
}
}
- mtx_unlock(&hsh6->mtx);
+ mtx_unlock(&hsh->mtx);
}
#endif
diff --git a/sys/netgraph/netflow/netflow_v9.c b/sys/netgraph/netflow/netflow_v9.c
index bd8deaa..31304d7 100644
--- a/sys/netgraph/netflow/netflow_v9.c
+++ b/sys/netgraph/netflow/netflow_v9.c
@@ -398,7 +398,6 @@ get_export9_dgram(priv_p priv, fib_export_p fe, struct netflow_v9_packet_opt **t
item = ng_package_data(m, NG_NOFLAGS);
if (item == NULL) {
- m_free(m);
free(t, M_NETFLOW_GENERAL);
return (NULL);
}
diff --git a/sys/netgraph/netflow/ng_netflow.c b/sys/netgraph/netflow/ng_netflow.c
index 780a127..64adc28 100644
--- a/sys/netgraph/netflow/ng_netflow.c
+++ b/sys/netgraph/netflow/ng_netflow.c
@@ -504,19 +504,20 @@ ng_netflow_rcvmsg (node_p node, item_p item, hook_p lasthook)
}
case NGM_NETFLOW_SHOW:
{
- uint32_t *last;
-
- if (msg->header.arglen != sizeof(uint32_t))
+ if (msg->header.arglen != sizeof(struct ngnf_show_header))
ERROUT(EINVAL);
- last = (uint32_t *)msg->data;
-
NG_MKRESPONSE(resp, msg, NGRESP_SIZE, M_NOWAIT);
if (!resp)
ERROUT(ENOMEM);
- error = ng_netflow_flow_show(priv, *last, resp);
+ error = ng_netflow_flow_show(priv,
+ (struct ngnf_show_header *)msg->data,
+ (struct ngnf_show_header *)resp->data);
+
+ if (error)
+ NG_FREE_MSG(resp);
break;
}
diff --git a/sys/netgraph/netflow/ng_netflow.h b/sys/netgraph/netflow/ng_netflow.h
index 6685000..ed11f35 100644
--- a/sys/netgraph/netflow/ng_netflow.h
+++ b/sys/netgraph/netflow/ng_netflow.h
@@ -33,7 +33,7 @@
#define _NG_NETFLOW_H_
#define NG_NETFLOW_NODE_TYPE "netflow"
-#define NGM_NETFLOW_COOKIE 1299079728
+#define NGM_NETFLOW_COOKIE 1309868867
#define NG_NETFLOW_MAXIFACES USHRT_MAX
@@ -133,6 +133,19 @@ struct ng_netflow_setmtu {
uint16_t mtu; /* MTU for packet */
};
+/* This structure is used in NGM_NETFLOW_SHOW request/responce */
+struct ngnf_show_header {
+ u_char version; /* IPv4 or IPv6 */
+ uint32_t hash_id; /* current hash index */
+ uint32_t list_id; /* current record number in given hash */
+ uint32_t nentries; /* number of records in response */
+};
+
+/* XXXGL
+ * Somewhere flow_rec6 is casted to flow_rec, and flow6_entry_data is
+ * casted to flow_entry_data. After casting, fle->r.fib is accessed.
+ * So beginning of these structs up to fib should be kept common.
+ */
/* This is unique data, which identifies flow */
struct flow_rec {
@@ -233,29 +246,24 @@ struct flow6_entry_data {
* without overflowing socket receive buffer
*/
#define NREC_AT_ONCE 1000
-#define NGRESP_SIZE (sizeof(struct ngnf_flows) + (NREC_AT_ONCE * \
+#define NREC6_AT_ONCE (NREC_AT_ONCE * sizeof(struct flow_entry_data) / \
+ sizeof(struct flow6_entry_data))
+#define NGRESP_SIZE (sizeof(struct ngnf_show_header) + (NREC_AT_ONCE * \
sizeof(struct flow_entry_data)))
#define SORCVBUF_SIZE (NGRESP_SIZE + 2 * sizeof(struct ng_mesg))
-/* This struct is returned to userland, when "show cache ip flow" */
-struct ngnf_flows {
- uint32_t nentries;
- uint32_t last;
- struct flow_entry_data entries[0];
-};
-
/* Everything below is for kernel */
#ifdef _KERNEL
struct flow_entry {
- struct flow_entry_data f;
TAILQ_ENTRY(flow_entry) fle_hash; /* entries in hash slot */
+ struct flow_entry_data f;
};
struct flow6_entry {
+ TAILQ_ENTRY(flow_entry) fle_hash; /* entries in hash slot */
struct flow6_entry_data f;
- TAILQ_ENTRY(flow6_entry) fle6_hash; /* entries in hash slot */
};
/* Parsing declarations */
@@ -402,7 +410,7 @@ struct netflow {
/* IPv6 support */
#ifdef INET6
uma_zone_t zone6;
- struct flow6_hash_entry *hash6;
+ struct flow_hash_entry *hash6;
#endif
/* Multiple FIB support */
fib_export_p fib_data[RT_NUMFIBS]; /* array of pointers to fib-specific data */
@@ -430,11 +438,6 @@ struct flow_hash_entry {
TAILQ_HEAD(fhead, flow_entry) head;
};
-struct flow6_hash_entry {
- struct mtx mtx;
- TAILQ_HEAD(f6head, flow6_entry) head;
-};
-
#define ERROUT(x) { error = (x); goto done; }
#define MTAG_NETFLOW 1221656444
@@ -465,7 +468,7 @@ void ng_netflow_copyinfo(priv_p, struct ng_netflow_info *);
timeout_t ng_netflow_expire;
int ng_netflow_flow_add(priv_p, fib_export_p, struct ip *, caddr_t, uint8_t, uint8_t, unsigned int);
int ng_netflow_flow6_add(priv_p, fib_export_p, struct ip6_hdr *, caddr_t , uint8_t, uint8_t, unsigned int);
-int ng_netflow_flow_show(priv_p, uint32_t last, struct ng_mesg *);
+int ng_netflow_flow_show(priv_p, struct ngnf_show_header *req, struct ngnf_show_header *resp);
void ng_netflow_v9_cache_init(priv_p);
void ng_netflow_v9_cache_flush(priv_p);
diff --git a/sys/netgraph/netgraph.h b/sys/netgraph/netgraph.h
index 8dbf0b5..7b67c94e 100644
--- a/sys/netgraph/netgraph.h
+++ b/sys/netgraph/netgraph.h
@@ -53,6 +53,7 @@
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/refcount.h>
#ifdef HAVE_KERNEL_OPTION_HEADERS
#include "opt_netgraph.h"
@@ -137,7 +138,7 @@ struct ng_hook {
* If you can't do it with these you probably shouldn;t be doing it.
*/
void ng_unref_hook(hook_p hook); /* don't move this */
-#define _NG_HOOK_REF(hook) atomic_add_int(&(hook)->hk_refs, 1)
+#define _NG_HOOK_REF(hook) refcount_acquire(&(hook)->hk_refs)
#define _NG_HOOK_NAME(hook) ((hook)->hk_name)
#define _NG_HOOK_UNREF(hook) ng_unref_hook(hook)
#define _NG_HOOK_SET_PRIVATE(hook, val) do {(hook)->hk_private = val;} while (0)
@@ -396,11 +397,11 @@ struct ng_node {
* Public methods for nodes.
* If you can't do it with these you probably shouldn't be doing it.
*/
-int ng_unref_node(node_p node); /* don't move this */
+void ng_unref_node(node_p node); /* don't move this */
#define _NG_NODE_NAME(node) ((node)->nd_name + 0)
#define _NG_NODE_HAS_NAME(node) ((node)->nd_name[0] + 0)
#define _NG_NODE_ID(node) ((node)->nd_ID + 0)
-#define _NG_NODE_REF(node) atomic_add_int(&(node)->nd_refs, 1)
+#define _NG_NODE_REF(node) refcount_acquire(&(node)->nd_refs)
#define _NG_NODE_UNREF(node) ng_unref_node(node)
#define _NG_NODE_SET_PRIVATE(node, val) do {(node)->nd_private = val;} while (0)
#define _NG_NODE_PRIVATE(node) ((node)->nd_private)
@@ -441,7 +442,7 @@ static __inline char * _ng_node_name(node_p node, char *file, int line);
static __inline int _ng_node_has_name(node_p node, char *file, int line);
static __inline ng_ID_t _ng_node_id(node_p node, char *file, int line);
static __inline void _ng_node_ref(node_p node, char *file, int line);
-static __inline int _ng_node_unref(node_p node, char *file, int line);
+static __inline void _ng_node_unref(node_p node, char *file, int line);
static __inline void _ng_node_set_private(node_p node, void * val,
char *file, int line);
static __inline void * _ng_node_private(node_p node, char *file, int line);
@@ -492,11 +493,11 @@ _ng_node_ref(node_p node, char *file, int line)
_NG_NODE_REF(node);
}
-static __inline int
+static __inline void
_ng_node_unref(node_p node, char *file, int line)
{
_chknode(node, file, line);
- return (_NG_NODE_UNREF(node));
+ _NG_NODE_UNREF(node);
}
static __inline void
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index f67f247f..0918193 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -772,18 +772,14 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3)
* Remove a reference to the node, possibly the last.
* deadnode always acts as it it were the last.
*/
-int
+void
ng_unref_node(node_p node)
{
- int v;
-
- if (node == &ng_deadnode) {
- return (0);
- }
- v = atomic_fetchadd_int(&node->nd_refs, -1);
+ if (node == &ng_deadnode)
+ return;
- if (v == 1) { /* we were the last */
+ if (refcount_release(&node->nd_refs)) { /* we were the last */
mtx_lock(&ng_namehash_mtx);
node->nd_type->refs--; /* XXX maybe should get types lock? */
@@ -797,7 +793,6 @@ ng_unref_node(node_p node)
mtx_destroy(&node->nd_input_queue.q_mtx);
NG_FREE_NODE(node);
}
- return (v - 1);
}
/************************************************************************
@@ -963,15 +958,11 @@ ng_unname(node_p node)
void
ng_unref_hook(hook_p hook)
{
- int v;
- if (hook == &ng_deadhook) {
+ if (hook == &ng_deadhook)
return;
- }
-
- v = atomic_fetchadd_int(&hook->hk_refs, -1);
- if (v == 1) { /* we were the last */
+ if (refcount_release(&hook->hk_refs)) { /* we were the last */
if (_NG_HOOK_NODE(hook)) /* it'll probably be ng_deadnode */
_NG_NODE_UNREF((_NG_HOOK_NODE(hook)));
NG_FREE_HOOK(hook);
diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c
index 5abc5aa..afedaa3 100644
--- a/sys/netgraph/ng_ether.c
+++ b/sys/netgraph/ng_ether.c
@@ -55,6 +55,7 @@
#include <sys/proc.h>
#include <sys/syslog.h>
#include <sys/socket.h>
+#include <sys/taskqueue.h>
#include <net/if.h>
#include <net/if_dl.h>
@@ -336,6 +337,7 @@ ng_ether_detach(struct ifnet *ifp)
const node_p node = IFP2NG(ifp);
const priv_p priv = NG_NODE_PRIVATE(node);
+ taskqueue_drain(taskqueue_swi, &ifp->if_linktask);
NG_NODE_REALLY_DIE(node); /* Force real removal of node */
/*
* We can't assume the ifnet is still around when we run shutdown
@@ -718,7 +720,6 @@ ng_ether_shutdown(node_p node)
(void)ifpromisc(priv->ifp, 0);
priv->promisc = 0;
}
- priv->autoSrcAddr = 1; /* reset auto-src-addr flag */
NG_NODE_REVIVE(node); /* Signal ng_rmnode we are persisant */
return (0);
diff --git a/sys/netgraph/ng_iface.c b/sys/netgraph/ng_iface.c
index a08595f..e774098 100644
--- a/sys/netgraph/ng_iface.c
+++ b/sys/netgraph/ng_iface.c
@@ -777,6 +777,7 @@ ng_iface_rcvdata(hook_p hook, item_p item)
/* First chunk of an mbuf contains good junk */
if (harvest.point_to_point)
random_harvest(m, 16, 3, 0, RANDOM_NET);
+ M_SETFIB(m, ifp->if_fib);
netisr_dispatch(isr, m);
return (0);
}
diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
index c5d887b..f72f822 100644
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -525,33 +525,32 @@ ng_attach_cntl(struct socket *so)
{
struct ngsock *priv;
struct ngpcb *pcbp;
+ node_p node;
int error;
- /* Allocate node private info */
- priv = malloc(sizeof(*priv), M_NETGRAPH_SOCK, M_WAITOK | M_ZERO);
-
/* Setup protocol control block */
- if ((error = ng_attach_common(so, NG_CONTROL)) != 0) {
- free(priv, M_NETGRAPH_SOCK);
+ if ((error = ng_attach_common(so, NG_CONTROL)) != 0)
return (error);
- }
pcbp = sotongpcb(so);
- /* Link the pcb the private data. */
- priv->ctlsock = pcbp;
- pcbp->sockdata = priv;
- priv->refs++;
-
- /* Initialize mutex. */
- mtx_init(&priv->mtx, "ng_socket", NULL, MTX_DEF);
-
/* Make the generic node components */
- if ((error = ng_make_node_common(&typestruct, &priv->node)) != 0) {
- free(priv, M_NETGRAPH_SOCK);
+ if ((error = ng_make_node_common(&typestruct, &node)) != 0) {
ng_detach_common(pcbp, NG_CONTROL);
return (error);
}
+ /* Allocate node private info */
+ priv = malloc(sizeof(*priv), M_NETGRAPH_SOCK, M_WAITOK | M_ZERO);
+
+ /* Initialize mutex. */
+ mtx_init(&priv->mtx, "ng_socket", NULL, MTX_DEF);
+
+ /* Link the pcb the private data. */
+ priv->ctlsock = pcbp;
+ pcbp->sockdata = priv;
+ priv->refs++;
+ priv->node = node;
+
/* Store a hint for netstat(1). */
priv->node_id = priv->node->nd_ID;
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c
index 3afdc7d..f766fc4 100644
--- a/sys/netinet/if_ether.c
+++ b/sys/netinet/if_ether.c
@@ -694,11 +694,13 @@ match:
bcmp(ar_sha(ah), &la->ll_addr, ifp->if_addrlen)) {
if (la->la_flags & LLE_STATIC) {
LLE_WUNLOCK(la);
- log(LOG_ERR,
- "arp: %*D attempts to modify permanent "
- "entry for %s on %s\n",
- ifp->if_addrlen, (u_char *)ar_sha(ah), ":",
- inet_ntoa(isaddr), ifp->if_xname);
+ if (log_arp_permanent_modify)
+ log(LOG_ERR,
+ "arp: %*D attempts to modify "
+ "permanent entry for %s on %s\n",
+ ifp->if_addrlen,
+ (u_char *)ar_sha(ah), ":",
+ inet_ntoa(isaddr), ifp->if_xname);
goto reply;
}
if (log_arp_movements) {
@@ -759,7 +761,7 @@ match:
}
} else
LLE_WUNLOCK(la);
- } /* end of FIB loop */
+ }
reply:
if (op != ARPOP_REQUEST)
goto drop;
@@ -857,6 +859,7 @@ reply:
ah->ar_pro = htons(ETHERTYPE_IP); /* let's be sure! */
m->m_len = sizeof(*ah) + (2 * ah->ar_pln) + (2 * ah->ar_hln);
m->m_pkthdr.len = m->m_len;
+ m->m_pkthdr.rcvif = NULL;
sa.sa_family = AF_ARP;
sa.sa_len = 2;
(*ifp->if_output)(ifp, m, &sa, NULL);
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 684d808..c090117 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -548,7 +548,7 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
* is the same as before, then the call is
* un-necessarily executed here.
*/
- in_ifscrub(ifp, ia, 0);
+ in_ifscrub(ifp, ia, LLE_STATIC);
ia->ia_sockmask = ifra->ifra_mask;
ia->ia_sockmask.sin_family = AF_INET;
ia->ia_subnetmask =
@@ -557,7 +557,7 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
}
if ((ifp->if_flags & IFF_POINTOPOINT) &&
(ifra->ifra_dstaddr.sin_family == AF_INET)) {
- in_ifscrub(ifp, ia, 0);
+ in_ifscrub(ifp, ia, LLE_STATIC);
ia->ia_dstaddr = ifra->ifra_dstaddr;
maskIsNew = 1; /* We lie; but the effect's the same */
}
@@ -1179,14 +1179,20 @@ in_scrubprefix(struct in_ifaddr *target, u_int flags)
&& (ia->ia_ifp->if_type != IFT_CARP)) {
ifa_ref(&ia->ia_ifa);
IN_IFADDR_RUNLOCK();
- rtinit(&(target->ia_ifa), (int)RTM_DELETE,
+ error = rtinit(&(target->ia_ifa), (int)RTM_DELETE,
rtinitflags(target));
- target->ia_flags &= ~IFA_ROUTE;
-
+ if (error == 0)
+ target->ia_flags &= ~IFA_ROUTE;
+ else
+ log(LOG_INFO, "in_scrubprefix: err=%d, old prefix delete failed\n",
+ error);
error = rtinit(&ia->ia_ifa, (int)RTM_ADD,
rtinitflags(ia) | RTF_UP);
if (error == 0)
ia->ia_flags |= IFA_ROUTE;
+ else
+ log(LOG_INFO, "in_scrubprefix: err=%d, new prefix add failed\n",
+ error);
ifa_free(&ia->ia_ifa);
return (error);
}
@@ -1210,9 +1216,12 @@ in_scrubprefix(struct in_ifaddr *target, u_int flags)
/*
* As no-one seem to have this prefix, we can remove the route.
*/
- rtinit(&(target->ia_ifa), (int)RTM_DELETE, rtinitflags(target));
- target->ia_flags &= ~IFA_ROUTE;
- return (0);
+ error = rtinit(&(target->ia_ifa), (int)RTM_DELETE, rtinitflags(target));
+ if (error == 0)
+ target->ia_flags &= ~IFA_ROUTE;
+ else
+ log(LOG_INFO, "in_scrubprefix: err=%d, prefix delete failed\n", error);
+ return (error);
}
#undef rtinitflags
@@ -1407,6 +1416,18 @@ in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr
/* XXX rtalloc1 should take a const param */
rt = rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0);
+
+ /*
+ * If the gateway for an existing host route matches the target L3
+ * address, allow for ARP to proceed.
+ */
+ if (rt != NULL && (rt->rt_flags & (RTF_HOST|RTF_GATEWAY)) &&
+ rt->rt_gateway->sa_family == AF_INET &&
+ memcmp(rt->rt_gateway->sa_data, l3addr->sa_data, 4) == 0) {
+ RTFREE_LOCKED(rt);
+ return (0);
+ }
+
if (rt == NULL || (!(flags & LLE_PUB) &&
((rt->rt_flags & RTF_GATEWAY) ||
(rt->rt_ifp != ifp)))) {
@@ -1590,10 +1611,8 @@ in_domifattach(struct ifnet *ifp)
llt = lltable_init(ifp, AF_INET);
if (llt != NULL) {
- llt->llt_new = in_lltable_new;
llt->llt_free = in_lltable_free;
llt->llt_prefix_free = in_lltable_prefix_free;
- llt->llt_rtcheck = in_lltable_rtcheck;
llt->llt_lookup = in_lltable_lookup;
llt->llt_dump = in_lltable_dump;
}
diff --git a/sys/netinet/in.h b/sys/netinet/in.h
index 12473ff..d5e4290 100644
--- a/sys/netinet/in.h
+++ b/sys/netinet/in.h
@@ -253,7 +253,6 @@ __END_DECLS
/* Only used internally, so can be outside the range of valid IP protocols. */
#define IPPROTO_DIVERT 258 /* divert pseudo-protocol */
#define IPPROTO_SEND 259 /* SeND pseudo-protocol */
-#define IPPROTO_ND6 260 /* IPv6 NDP */
/*
* Defined to avoid confusion. The master value is defined by
diff --git a/sys/netinet/in_gif.c b/sys/netinet/in_gif.c
index 6c60390..22f35df 100644
--- a/sys/netinet/in_gif.c
+++ b/sys/netinet/in_gif.c
@@ -256,6 +256,8 @@ in_gif_output(struct ifnet *ifp, int family, struct mbuf *m)
#endif
}
+ m_addr_changed(m);
+
error = ip_output(m, NULL, &sc->gif_ro, 0, NULL, NULL);
if (!(GIF2IFP(sc)->if_flags & IFF_LINK0) &&
diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c
index d2a772f..a9a3890 100644
--- a/sys/netinet/in_proto.c
+++ b/sys/netinet/in_proto.c
@@ -163,7 +163,7 @@ struct protosw inetsw[] = {
},
#ifdef SCTP
{
- .pr_type = SOCK_DGRAM,
+ .pr_type = SOCK_SEQPACKET,
.pr_domain = &inetdomain,
.pr_protocol = IPPROTO_SCTP,
.pr_flags = PR_WANTRCVD,
@@ -177,18 +177,6 @@ struct protosw inetsw[] = {
.pr_drain = sctp_drain,
.pr_usrreqs = &sctp_usrreqs
},
-{
- .pr_type = SOCK_SEQPACKET,
- .pr_domain = &inetdomain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp_input,
- .pr_ctlinput = sctp_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp_usrreqs
-},
-
{
.pr_type = SOCK_STREAM,
.pr_domain = &inetdomain,
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index 527ce56..29a5d42 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#error "IPDIVERT requires INET."
#endif
#endif
+#include "opt_inet6.h"
#include <sys/param.h>
#include <sys/kernel.h>
@@ -62,6 +63,10 @@ __FBSDID("$FreeBSD$");
#include <netinet/in_var.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#include <netinet6/ip6_var.h>
+#endif
#ifdef SCTP
#include <netinet/sctp_crc32.h>
#endif
@@ -312,10 +317,10 @@ static int
div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
struct mbuf *control)
{
+ struct ip *const ip = mtod(m, struct ip *);
struct m_tag *mtag;
struct ipfw_rule_ref *dt;
int error = 0;
- struct mbuf *options;
/*
* An mbuf may hasn't come from userland, but we pretend
@@ -367,71 +372,103 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
/* Reinject packet into the system as incoming or outgoing */
if (!sin || sin->sin_addr.s_addr == 0) {
- struct ip *const ip = mtod(m, struct ip *);
+ struct mbuf *options = NULL;
struct inpcb *inp;
dt->info |= IPFW_IS_DIVERT | IPFW_INFO_OUT;
inp = sotoinpcb(so);
INP_RLOCK(inp);
- /*
- * Don't allow both user specified and setsockopt options,
- * and don't allow packet length sizes that will crash
- */
- if (((ip->ip_hl != (sizeof (*ip) >> 2)) && inp->inp_options) ||
- ((u_short)ntohs(ip->ip_len) > m->m_pkthdr.len)) {
- error = EINVAL;
- INP_RUNLOCK(inp);
- m_freem(m);
- } else {
+ switch (ip->ip_v) {
+ case IPVERSION:
+ /*
+ * Don't allow both user specified and setsockopt
+ * options, and don't allow packet length sizes that
+ * will crash.
+ */
+ if ((((ip->ip_hl << 2) != sizeof(struct ip)) &&
+ inp->inp_options != NULL) ||
+ ((u_short)ntohs(ip->ip_len) > m->m_pkthdr.len)) {
+ error = EINVAL;
+ INP_RUNLOCK(inp);
+ goto cantsend;
+ }
+
/* Convert fields to host order for ip_output() */
ip->ip_len = ntohs(ip->ip_len);
ip->ip_off = ntohs(ip->ip_off);
+ break;
+#ifdef INET6
+ case IPV6_VERSION >> 4:
+ {
+ struct ip6_hdr *const ip6 = mtod(m, struct ip6_hdr *);
+
+ /* Don't allow packet length sizes that will crash */
+ if (((u_short)ntohs(ip6->ip6_plen) > m->m_pkthdr.len)) {
+ error = EINVAL;
+ INP_RUNLOCK(inp);
+ goto cantsend;
+ }
- /* Send packet to output processing */
- KMOD_IPSTAT_INC(ips_rawout); /* XXX */
+ ip6->ip6_plen = ntohs(ip6->ip6_plen);
+ }
+#endif
+ default:
+ error = EINVAL;
+ INP_RUNLOCK(inp);
+ goto cantsend;
+ }
+
+ /* Send packet to output processing */
+ KMOD_IPSTAT_INC(ips_rawout); /* XXX */
#ifdef MAC
- mac_inpcb_create_mbuf(inp, m);
+ mac_inpcb_create_mbuf(inp, m);
#endif
- /*
- * Get ready to inject the packet into ip_output().
- * Just in case socket options were specified on the
- * divert socket, we duplicate them. This is done
- * to avoid having to hold the PCB locks over the call
- * to ip_output(), as doing this results in a number of
- * lock ordering complexities.
- *
- * Note that we set the multicast options argument for
- * ip_output() to NULL since it should be invariant that
- * they are not present.
- */
- KASSERT(inp->inp_moptions == NULL,
- ("multicast options set on a divert socket"));
- options = NULL;
- /*
- * XXXCSJP: It is unclear to me whether or not it makes
- * sense for divert sockets to have options. However,
- * for now we will duplicate them with the INP locks
- * held so we can use them in ip_output() without
- * requring a reference to the pcb.
- */
- if (inp->inp_options != NULL) {
- options = m_dup(inp->inp_options, M_DONTWAIT);
- if (options == NULL)
- error = ENOBUFS;
- }
- INP_RUNLOCK(inp);
- if (error == ENOBUFS) {
- m_freem(m);
- return (error);
+ /*
+ * Get ready to inject the packet into ip_output().
+ * Just in case socket options were specified on the
+ * divert socket, we duplicate them. This is done
+ * to avoid having to hold the PCB locks over the call
+ * to ip_output(), as doing this results in a number of
+ * lock ordering complexities.
+ *
+ * Note that we set the multicast options argument for
+ * ip_output() to NULL since it should be invariant that
+ * they are not present.
+ */
+ KASSERT(inp->inp_moptions == NULL,
+ ("multicast options set on a divert socket"));
+ /*
+ * XXXCSJP: It is unclear to me whether or not it makes
+ * sense for divert sockets to have options. However,
+ * for now we will duplicate them with the INP locks
+ * held so we can use them in ip_output() without
+ * requring a reference to the pcb.
+ */
+ if (inp->inp_options != NULL) {
+ options = m_dup(inp->inp_options, M_NOWAIT);
+ if (options == NULL) {
+ INP_RUNLOCK(inp);
+ error = ENOBUFS;
+ goto cantsend;
}
+ }
+ INP_RUNLOCK(inp);
+
+ switch (ip->ip_v) {
+ case IPVERSION:
error = ip_output(m, options, NULL,
- ((so->so_options & SO_DONTROUTE) ?
- IP_ROUTETOIF : 0) | IP_ALLOWBROADCAST |
- IP_RAWOUTPUT, NULL, NULL);
- if (options != NULL)
- m_freem(options);
+ ((so->so_options & SO_DONTROUTE) ? IP_ROUTETOIF : 0)
+ | IP_ALLOWBROADCAST | IP_RAWOUTPUT, NULL, NULL);
+ break;
+#ifdef INET6
+ case IPV6_VERSION >> 4:
+ error = ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL);
+ break;
+#endif
}
+ if (options != NULL)
+ m_freem(options);
} else {
dt->info |= IPFW_IS_DIVERT | IPFW_INFO_IN;
if (m->m_pkthdr.rcvif == NULL) {
@@ -456,14 +493,26 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
mac_socket_create_mbuf(so, m);
#endif
/* Send packet to input processing via netisr */
- netisr_queue_src(NETISR_IP, (uintptr_t)so, m);
+ switch (ip->ip_v) {
+ case IPVERSION:
+ netisr_queue_src(NETISR_IP, (uintptr_t)so, m);
+ break;
+#ifdef INET6
+ case IPV6_VERSION >> 4:
+ netisr_queue_src(NETISR_IPV6, (uintptr_t)so, m);
+ break;
+#endif
+ default:
+ error = EINVAL;
+ goto cantsend;
+ }
}
- return error;
+ return (error);
cantsend:
m_freem(m);
- return error;
+ return (error);
}
static int
diff --git a/sys/netinet/ip_fw.h b/sys/netinet/ip_fw.h
index 06e107c..ff3a67f 100644
--- a/sys/netinet/ip_fw.h
+++ b/sys/netinet/ip_fw.h
@@ -57,6 +57,12 @@
#define IP_FW_TABLEARG 65535 /* XXX should use 0 */
/*
+ * Number of entries in the call stack of the call/return commands.
+ * Call stack currently is an uint16_t array with rule numbers.
+ */
+#define IPFW_CALLSTACK_SIZE 16
+
+/*
* The kernel representation of ipfw rules is made of a list of
* 'instructions' (for all practical purposes equivalent to BPF
* instructions), which specify which fields of the packet
@@ -195,6 +201,8 @@ enum ipfw_opcodes { /* arguments (4 byte each) */
O_SOCKARG, /* socket argument */
+ O_CALLRETURN, /* arg1=called rule number */
+
O_LAST_OPCODE /* not an opcode! */
};
diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c
index 3542aa1..ec8a2f0 100644
--- a/sys/netinet/ip_icmp.c
+++ b/sys/netinet/ip_icmp.c
@@ -675,6 +675,8 @@ icmp_reflect(struct mbuf *m)
goto done; /* Ip_output() will check for broadcast */
}
+ m_addr_changed(m);
+
t = ip->ip_dst;
ip->ip_dst = ip->ip_src;
diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h
index e993279..cd30093 100644
--- a/sys/netinet/ip_var.h
+++ b/sys/netinet/ip_var.h
@@ -286,6 +286,7 @@ enum {
};
#define MTAG_IPFW 1148380143 /* IPFW-tagged cookie */
#define MTAG_IPFW_RULE 1262273568 /* rule reference */
+#define MTAG_IPFW_CALL 1308397630 /* call stack */
struct ip_fw_args;
typedef int (*ip_fw_chk_ptr_t)(struct ip_fw_args *args);
diff --git a/sys/netinet/ipfw/ip_dn_io.c b/sys/netinet/ipfw/ip_dn_io.c
index bcb12ae..6766416 100644
--- a/sys/netinet/ipfw/ip_dn_io.c
+++ b/sys/netinet/ipfw/ip_dn_io.c
@@ -668,7 +668,6 @@ dummynet_send(struct mbuf *m)
break;
case DIR_OUT | PROTO_IPV6:
- SET_HOST_IPLEN(mtod(m, struct ip *));
ip6_output(m, NULL, NULL, IPV6_FORWARDING, NULL, NULL, NULL);
break;
#endif
diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c
index 9e5c737..4e25f9a 100644
--- a/sys/netinet/ipfw/ip_fw2.c
+++ b/sys/netinet/ipfw/ip_fw2.c
@@ -1670,10 +1670,6 @@ do { \
break;
}
at->qid = altq->qid;
- if (is_ipv4)
- at->af = AF_INET;
- else
- at->af = AF_LINK;
at->hdr = ip;
break;
}
@@ -2099,6 +2095,123 @@ do { \
continue;
break; /* not reached */
+ case O_CALLRETURN: {
+ /*
+ * Implementation of `subroutine' call/return,
+ * in the stack carried in an mbuf tag. This
+ * is different from `skipto' in that any call
+ * address is possible (`skipto' must prevent
+ * backward jumps to avoid endless loops).
+ * We have `return' action when F_NOT flag is
+ * present. The `m_tag_id' field is used as
+ * stack pointer.
+ */
+ struct m_tag *mtag;
+ uint16_t jmpto, *stack;
+
+#define IS_CALL ((cmd->len & F_NOT) == 0)
+#define IS_RETURN ((cmd->len & F_NOT) != 0)
+ /*
+ * Hand-rolled version of m_tag_locate() with
+ * wildcard `type'.
+ * If not already tagged, allocate new tag.
+ */
+ mtag = m_tag_first(m);
+ while (mtag != NULL) {
+ if (mtag->m_tag_cookie ==
+ MTAG_IPFW_CALL)
+ break;
+ mtag = m_tag_next(m, mtag);
+ }
+ if (mtag == NULL && IS_CALL) {
+ mtag = m_tag_alloc(MTAG_IPFW_CALL, 0,
+ IPFW_CALLSTACK_SIZE *
+ sizeof(uint16_t), M_NOWAIT);
+ if (mtag != NULL)
+ m_tag_prepend(m, mtag);
+ }
+
+ /*
+ * On error both `call' and `return' just
+ * continue with next rule.
+ */
+ if (IS_RETURN && (mtag == NULL ||
+ mtag->m_tag_id == 0)) {
+ l = 0; /* exit inner loop */
+ break;
+ }
+ if (IS_CALL && (mtag == NULL ||
+ mtag->m_tag_id >= IPFW_CALLSTACK_SIZE)) {
+ printf("ipfw: call stack error, "
+ "go to next rule\n");
+ l = 0; /* exit inner loop */
+ break;
+ }
+
+ f->pcnt++; /* update stats */
+ f->bcnt += pktlen;
+ f->timestamp = time_uptime;
+ stack = (uint16_t *)(mtag + 1);
+
+ /*
+ * The `call' action may use cached f_pos
+ * (in f->next_rule), whose version is written
+ * in f->next_rule.
+ * The `return' action, however, doesn't have
+ * fixed jump address in cmd->arg1 and can't use
+ * cache.
+ */
+ if (IS_CALL) {
+ stack[mtag->m_tag_id] = f->rulenum;
+ mtag->m_tag_id++;
+ if (cmd->arg1 != IP_FW_TABLEARG &&
+ (uintptr_t)f->x_next == chain->id) {
+ f_pos = (uintptr_t)f->next_rule;
+ } else {
+ jmpto = (cmd->arg1 ==
+ IP_FW_TABLEARG) ? tablearg:
+ cmd->arg1;
+ f_pos = ipfw_find_rule(chain,
+ jmpto, 0);
+ /* update the cache */
+ if (cmd->arg1 !=
+ IP_FW_TABLEARG) {
+ f->next_rule =
+ (void *)(uintptr_t)
+ f_pos;
+ f->x_next =
+ (void *)(uintptr_t)
+ chain->id;
+ }
+ }
+ } else { /* `return' action */
+ mtag->m_tag_id--;
+ jmpto = stack[mtag->m_tag_id] + 1;
+ f_pos = ipfw_find_rule(chain, jmpto, 0);
+ }
+
+ /*
+ * Skip disabled rules, and re-enter
+ * the inner loop with the correct
+ * f_pos, f, l and cmd.
+ * Also clear cmdlen and skip_or
+ */
+ for (; f_pos < chain->n_rules - 1 &&
+ (V_set_disable &
+ (1 << chain->map[f_pos]->set)); f_pos++)
+ ;
+ /* Re-enter the inner loop at the dest rule. */
+ f = chain->map[f_pos];
+ l = f->cmd_len;
+ cmd = f->cmd;
+ cmdlen = 0;
+ skip_or = 0;
+ continue;
+ break; /* NOTREACHED */
+ }
+#undef IS_CALL
+#undef IS_RETURN
+
case O_REJECT:
/*
* Drop the packet and send a reject notice
diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c
index 3560e13..2b55a38 100644
--- a/sys/netinet/ipfw/ip_fw_log.c
+++ b/sys/netinet/ipfw/ip_fw_log.c
@@ -304,6 +304,13 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args,
case O_REASS:
action = "Reass";
break;
+ case O_CALLRETURN:
+ if (cmd->len & F_NOT)
+ action = "Return";
+ else
+ snprintf(SNPARGS(action2, 0), "Call %d",
+ cmd->arg1);
+ break;
default:
action = "UNKNOWN";
break;
diff --git a/sys/netinet/ipfw/ip_fw_pfil.c b/sys/netinet/ipfw/ip_fw_pfil.c
index 248e4dd..736615b 100644
--- a/sys/netinet/ipfw/ip_fw_pfil.c
+++ b/sys/netinet/ipfw/ip_fw_pfil.c
@@ -58,6 +58,10 @@ __FBSDID("$FreeBSD$");
#include <netinet/ip.h>
#include <netinet/ip_var.h>
#include <netinet/ip_fw.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#include <netinet6/ip6_var.h>
+#endif
#include <netinet/ipfw/ip_fw_private.h>
#include <netgraph/ng_ipfw.h>
@@ -127,8 +131,9 @@ again:
args.rule = *((struct ipfw_rule_ref *)(tag+1));
m_tag_delete(*m0, tag);
if (args.rule.info & IPFW_ONEPASS) {
- SET_HOST_IPLEN(mtod(*m0, struct ip *));
- return 0;
+ if (mtod(*m0, struct ip *)->ip_v == 4)
+ SET_HOST_IPLEN(mtod(*m0, struct ip *));
+ return (0);
}
}
@@ -264,7 +269,7 @@ ipfw_divert(struct mbuf **m0, int incoming, struct ipfw_rule_ref *rule,
* If not tee, consume packet and send it to divert socket.
*/
struct mbuf *clone;
- struct ip *ip;
+ struct ip *ip = mtod(*m0, struct ip *);
struct m_tag *tag;
/* Cloning needed for tee? */
@@ -288,8 +293,9 @@ ipfw_divert(struct mbuf **m0, int incoming, struct ipfw_rule_ref *rule,
* Note that we now have the 'reass' ipfw option so if we care
* we can do it before a 'tee'.
*/
- ip = mtod(clone, struct ip *);
- if (!tee && ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) {
+ if (!tee) switch (ip->ip_v) {
+ case IPVERSION:
+ if (ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) {
int hlen;
struct mbuf *reass;
@@ -311,7 +317,26 @@ ipfw_divert(struct mbuf **m0, int incoming, struct ipfw_rule_ref *rule,
else
ip->ip_sum = in_cksum(reass, hlen);
clone = reass;
+ }
+ break;
+#ifdef INET6
+ case IPV6_VERSION >> 4:
+ {
+ struct ip6_hdr *const ip6 = mtod(clone, struct ip6_hdr *);
+
+ if (ip6->ip6_nxt == IPPROTO_FRAGMENT) {
+ int nxt, off;
+
+ off = sizeof(struct ip6_hdr);
+ nxt = frag6_input(&clone, &off, 0);
+ if (nxt == IPPROTO_DONE)
+ return (0);
+ }
+ break;
+ }
+#endif
}
+
/* attach a tag to the packet with the reinject info */
tag = m_tag_alloc(MTAG_IPFW_RULE, 0,
sizeof(struct ipfw_rule_ref), M_NOWAIT);
diff --git a/sys/netinet/ipfw/ip_fw_sockopt.c b/sys/netinet/ipfw/ip_fw_sockopt.c
index 2347456..1432858 100644
--- a/sys/netinet/ipfw/ip_fw_sockopt.c
+++ b/sys/netinet/ipfw/ip_fw_sockopt.c
@@ -752,6 +752,7 @@ check_ipfw_struct(struct ip_fw *rule, int size)
#endif
case O_SKIPTO:
case O_REASS:
+ case O_CALLRETURN:
check_size:
if (cmdlen != F_INSN_SIZE(ipfw_insn))
goto bad_size;
diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c
index 9b30793..4e0837f 100644
--- a/sys/netinet/libalias/alias_db.c
+++ b/sys/netinet/libalias/alias_db.c
@@ -552,10 +552,6 @@ static void IncrementalCleanup(struct libalias *);
static void DeleteLink(struct alias_link *);
static struct alias_link *
-AddLink(struct libalias *, struct in_addr, struct in_addr, struct in_addr,
- u_short, u_short, int, int);
-
-static struct alias_link *
ReLink(struct alias_link *,
struct in_addr, struct in_addr, struct in_addr,
u_short, u_short, int, int);
@@ -572,9 +568,6 @@ static struct alias_link *
#define ALIAS_PORT_MASK_EVEN 0x07ffe
#define GET_NEW_PORT_MAX_ATTEMPTS 20
-#define GET_ALIAS_PORT -1
-#define GET_ALIAS_ID GET_ALIAS_PORT
-
#define FIND_EVEN_ALIAS_BASE 1
/* GetNewPort() allocates port numbers. Note that if a port number
@@ -937,17 +930,12 @@ DeleteLink(struct alias_link *lnk)
}
-static struct alias_link *
-AddLink(struct libalias *la, struct in_addr src_addr,
- struct in_addr dst_addr,
- struct in_addr alias_addr,
- u_short src_port,
- u_short dst_port,
- int alias_port_param, /* if less than zero, alias */
- int link_type)
-{ /* port will be automatically *//* chosen.
- * If greater than */
- u_int start_point; /* zero, equal to alias port */
+struct alias_link *
+AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr,
+ struct in_addr alias_addr, u_short src_port, u_short dst_port,
+ int alias_port_param, int link_type)
+{
+ u_int start_point;
struct alias_link *lnk;
LIBALIAS_LOCK_ASSERT(la);
diff --git a/sys/netinet/libalias/alias_ftp.c b/sys/netinet/libalias/alias_ftp.c
index ef0e52c..8e7d05b 100644
--- a/sys/netinet/libalias/alias_ftp.c
+++ b/sys/netinet/libalias/alias_ftp.c
@@ -100,38 +100,68 @@ __FBSDID("$FreeBSD$");
#define FTP_CONTROL_PORT_NUMBER 21
static void
-AliasHandleFtpOut(struct libalias *, struct ip *, struct alias_link *,
- int maxpacketsize);
+AliasHandleFtpOut(struct libalias *, struct ip *, struct alias_link *,
+ int maxpacketsize);
+static void
+AliasHandleFtpIn(struct libalias *, struct ip *, struct alias_link *);
-static int
-fingerprint(struct libalias *la, struct alias_data *ah)
+static int
+fingerprint_out(struct libalias *la, struct alias_data *ah)
{
- if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL ||
- ah->maxpktsize == 0)
+ if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL ||
+ ah->maxpktsize == 0)
return (-1);
- if (ntohs(*ah->dport) == FTP_CONTROL_PORT_NUMBER
- || ntohs(*ah->sport) == FTP_CONTROL_PORT_NUMBER)
+ if (ntohs(*ah->dport) == FTP_CONTROL_PORT_NUMBER ||
+ ntohs(*ah->sport) == FTP_CONTROL_PORT_NUMBER)
return (0);
return (-1);
}
-static int
-protohandler(struct libalias *la, struct ip *pip, struct alias_data *ah)
+static int
+fingerprint_in(struct libalias *la, struct alias_data *ah)
+{
+
+ if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL)
+ return (-1);
+ if (ntohs(*ah->dport) == FTP_CONTROL_PORT_NUMBER ||
+ ntohs(*ah->sport) == FTP_CONTROL_PORT_NUMBER)
+ return (0);
+ return (-1);
+}
+
+static int
+protohandler_out(struct libalias *la, struct ip *pip, struct alias_data *ah)
{
-
+
AliasHandleFtpOut(la, pip, ah->lnk, ah->maxpktsize);
return (0);
}
+
+static int
+protohandler_in(struct libalias *la, struct ip *pip, struct alias_data *ah)
+{
+
+ AliasHandleFtpIn(la, pip, ah->lnk);
+ return (0);
+}
+
struct proto_handler handlers[] = {
- {
- .pri = 80,
- .dir = OUT,
- .proto = TCP,
- .fingerprint = &fingerprint,
- .protohandler = &protohandler
- },
+ {
+ .pri = 80,
+ .dir = OUT,
+ .proto = TCP,
+ .fingerprint = &fingerprint_out,
+ .protohandler = &protohandler_out
+ },
+ {
+ .pri = 80,
+ .dir = IN,
+ .proto = TCP,
+ .fingerprint = &fingerprint_in,
+ .protohandler = &protohandler_in
+ },
{ EOH }
};
@@ -256,6 +286,57 @@ AliasHandleFtpOut(
}
}
+static void
+AliasHandleFtpIn(struct libalias *la,
+ struct ip *pip, /* IP packet to examine/patch */
+ struct alias_link *lnk) /* The link to go through (aliased port) */
+{
+ int hlen, tlen, dlen, pflags;
+ char *sptr;
+ struct tcphdr *tc;
+
+ /* Calculate data length of TCP packet */
+ tc = (struct tcphdr *)ip_next(pip);
+ hlen = (pip->ip_hl + tc->th_off) << 2;
+ tlen = ntohs(pip->ip_len);
+ dlen = tlen - hlen;
+
+ /* Place string pointer and beginning of data */
+ sptr = (char *)pip;
+ sptr += hlen;
+
+ /*
+ * Check that data length is not too long and previous message was
+ * properly terminated with CRLF.
+ */
+ pflags = GetProtocolFlags(lnk);
+ if (dlen <= MAX_MESSAGE_SIZE && (pflags & WAIT_CRLF) == 0 &&
+ ntohs(tc->th_dport) == FTP_CONTROL_PORT_NUMBER &&
+ (ParseFtpPortCommand(la, sptr, dlen) != 0 ||
+ ParseFtpEprtCommand(la, sptr, dlen) != 0)) {
+ /*
+ * Alias active mode client requesting data from server
+ * behind NAT. We need to alias server->client connection
+ * to external address client is connecting to.
+ */
+ AddLink(la, GetOriginalAddress(lnk), la->true_addr,
+ GetAliasAddress(lnk), htons(FTP_CONTROL_PORT_NUMBER - 1),
+ htons(la->true_port), GET_ALIAS_PORT, IPPROTO_TCP);
+ }
+ /* Track the msgs which are CRLF term'd for PORT/PASV FW breach */
+ if (dlen) {
+ sptr = (char *)pip; /* start over at beginning */
+ tlen = ntohs(pip->ip_len); /* recalc tlen, pkt may
+ * have grown.
+ */
+ if (sptr[tlen - 2] == '\r' && sptr[tlen - 1] == '\n')
+ pflags &= ~WAIT_CRLF;
+ else
+ pflags |= WAIT_CRLF;
+ SetProtocolFlags(lnk, pflags);
+ }
+}
+
static int
ParseFtpPortCommand(struct libalias *la, char *sptr, int dlen)
{
@@ -576,9 +657,10 @@ NewFtpMessage(struct libalias *la, struct ip *pip,
if (la->true_port < IPPORT_RESERVED)
return;
-/* Establish link to address and port found in FTP control message. */
- ftp_lnk = FindUdpTcpOut(la, la->true_addr, GetDestAddress(lnk),
- htons(la->true_port), 0, IPPROTO_TCP, 1);
+ /* Establish link to address and port found in FTP control message. */
+ ftp_lnk = AddLink(la, la->true_addr, GetDestAddress(lnk),
+ GetAliasAddress(lnk), htons(la->true_port), 0, GET_ALIAS_PORT,
+ IPPROTO_TCP);
if (ftp_lnk != NULL) {
int slen, hlen, tlen, dlen;
diff --git a/sys/netinet/libalias/alias_local.h b/sys/netinet/libalias/alias_local.h
index e201394..c291a37 100644
--- a/sys/netinet/libalias/alias_local.h
+++ b/sys/netinet/libalias/alias_local.h
@@ -67,6 +67,9 @@
#define LINK_TABLE_OUT_SIZE 4001
#define LINK_TABLE_IN_SIZE 4001
+#define GET_ALIAS_PORT -1
+#define GET_ALIAS_ID GET_ALIAS_PORT
+
struct proxy_entry;
struct libalias {
@@ -249,6 +252,10 @@ DifferentialChecksum(u_short * _cksum, void * _new, void * _old, int _n);
/* Internal data access */
struct alias_link *
+AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr,
+ struct in_addr alias_addr, u_short src_port, u_short dst_port,
+ int alias_param, int link_type);
+struct alias_link *
FindIcmpIn(struct libalias *la, struct in_addr _dst_addr, struct in_addr _alias_addr,
u_short _id_alias, int _create);
struct alias_link *
diff --git a/sys/netinet/libalias/libalias.3 b/sys/netinet/libalias/libalias.3
index 31702e8..b82b087 100644
--- a/sys/netinet/libalias/libalias.3
+++ b/sys/netinet/libalias/libalias.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 1, 2006
+.Dd July 04, 2011
.Dt LIBALIAS 3
.Os
.Sh NAME
@@ -52,7 +52,7 @@ machine on the local network.
.Pp
A certain amount of flexibility is built into the packet aliasing engine.
In the simplest mode of operation, a many-to-one address mapping takes
-place between local network and the packet aliasing host.
+place between the local network and the packet aliasing host.
This is known as IP masquerading.
In addition, one-to-one mappings between local and public addresses can
also be implemented, which is known as static NAT.
@@ -61,15 +61,11 @@ linked to different public addresses, comprising several distinct
many-to-one mappings.
Also, a given public address and port can be statically redirected to a
private address/port.
-.Pp
-The packet aliasing engine was designed to operate in user space outside
-of the kernel, without any access to private kernel data structure, but
-the source code can also be ported to a kernel environment.
.Sh INITIALIZATION AND CONTROL
One special function,
.Fn LibAliasInit ,
-must always be called before any packet handling may be performed and
-the returned instance pointer passed to all the other functions.
+must always be called before any packet handling may be performed, and
+the returned instance pointer must be passed to all the other functions.
Normally, the
.Fn LibAliasSetAddress
function is called afterwards, to set the default aliasing address.
@@ -118,8 +114,8 @@ prior to any packet handling.
This function has no return value and is used to clear any
resources attached to internal data structures.
.Pp
-This functions should be called when a program stops using the aliasing
-engine; it does, amongst other things, clear out any firewall holes.
+This function should be called when a program stops using the aliasing
+engine; amongst other things, it clears out any firewall holes.
To provide backwards compatibility and extra security, it is added to
the
.Xr atexit 3
@@ -135,7 +131,7 @@ local area network are aliased.
All outgoing packets are re-mapped to this address unless overridden by a
static address mapping established by
.Fn LibAliasRedirectAddr .
-If this function is not called, and no static rules match, an outgoing
+If this function has not been called, and no static rules match, an outgoing
packet retains its source address.
.Pp
If the
@@ -150,7 +146,7 @@ address may or may not change on successive dial-up attempts.
If the
.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
mode bit is set to zero, this function can also be used to dynamically change
-the aliasing address on a packet to packet basis (it is a low overhead call).
+the aliasing address on a packet-to-packet basis (it is a low overhead call).
.Pp
It is mandatory that this function be called prior to any packet handling.
.Ed
@@ -170,7 +166,7 @@ The following mode bits are defined in
.It Dv PKT_ALIAS_LOG
Enables logging into
.Pa /var/log/alias.log .
-Each time an aliasing link is created or deleted, the log file is appended
+Each time an aliasing link is created or deleted, the log file is appended to
with the current number of ICMP, TCP and UDP links.
Mainly useful for debugging when the log file is viewed continuously with
.Xr tail 1 .
@@ -186,7 +182,7 @@ Response packets to connections or transactions initiated from the packet
aliasing host or local network will be unaffected.
This mode bit is useful for implementing a one-way firewall.
.It Dv PKT_ALIAS_SAME_PORTS
-If this mode bit is set, the packet aliasing engine will attempt to leave
+If this mode bit is set, the packet-aliasing engine will attempt to leave
the alias port numbers unchanged from the actual local port numbers.
This can be done as long as the quintuple (proto, alias addr, alias port,
remote addr, remote port) is unique.
@@ -211,7 +207,7 @@ Standard Class A, B and C unregistered addresses are:
192.168.0.0 -> 192.168.255.255 (Class C subnets)
.Ed
.Pp
-This option is useful in the case that packet aliasing host has both
+This option is useful in the case that the packet aliasing host has both
registered and unregistered subnets on different interfaces.
The registered subnet is fully accessible to the outside world, so traffic
from it does not need to be passed through the packet aliasing engine.
@@ -229,8 +225,9 @@ of an address change.
.It Dv PKT_ALIAS_PUNCH_FW
This option makes
.Nm
-`punch holes' in an
-.Xr ipfirewall 4
+.Dq punch holes
+in an
+.Xr ipfirewall 4 -
based firewall for FTP/IRC DCC connections.
The holes punched are bound by from/to IP address and port; it will not be
possible to use a hole for another connection.
@@ -240,9 +237,9 @@ To cater to unexpected death of a program using
(e.g.\& kill -9),
changing the state of the flag will clear the entire firewall range
allocated for holes.
-This will also happen on the initial call to
-.Fn LibAliasSetFWBase .
-This call must happen prior to setting this flag.
+This clearing will also happen on the initial call to
+.Fn LibAliasSetFWBase ,
+which must happen prior to setting this flag.
.It Dv PKT_ALIAS_REVERSE
This option makes
.Nm
@@ -257,16 +254,28 @@ Normal packet aliasing is not performed.
See
.Fn LibAliasProxyRule
below for details.
+.It Dv PKT_ALIAS_SKIP_GLOBAL
+This option is used by
+.Pa ipfw_nat
+only.
+Specifying it as a flag to
+.Fn LibAliasSetMode
+has no effect.
+See section
+.Sx NETWORK ADDRESS TRANSLATION
+in
+.Xr ipfw 8
+for more details.
.El
.Ed
.Pp
.Ft void
.Fn LibAliasSetFWBase "struct libalias *" "unsigned int base" "unsigned int num"
.Bd -ragged -offset indent
-Set firewall range allocated for punching firewall holes (with the
+Set the firewall range allocated for punching firewall holes (with the
.Dv PKT_ALIAS_PUNCH_FW
flag).
-The range will be cleared for all rules on initialization.
+The range is cleared for all rules on initialization.
.Ed
.Pp
.Ft void
@@ -292,7 +301,7 @@ the two packet handling functions,
.Fn LibAliasIn
and
.Fn LibAliasOut ,
-comprise minimal set of functions needed for a basic IP masquerading
+comprise the minimal set of functions needed for a basic IP masquerading
implementation.
.Pp
.Ft int
@@ -313,11 +322,11 @@ Return codes:
The packet aliasing process was successful.
.It Dv PKT_ALIAS_IGNORED
The packet was ignored and not de-aliased.
-This can happen if the protocol is unrecognized, possibly an ICMP message
-type is not handled or if incoming packets for new connections are being
-ignored (if
+This can happen if the protocol is unrecognized, as for an ICMP message
+type that is not handled, or if incoming packets for new connections are being
+ignored (if the
.Dv PKT_ALIAS_DENY_INCOMING
-mode bit was set by
+mode bit was set using
.Fn LibAliasSetMode ) .
.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT
This is returned when a fragment cannot be resolved because the header
@@ -408,7 +417,7 @@ is called to change the address after
.Fn LibAliasRedirectPort
is called, a zero reference will track this change.
.Pp
-If the link is further set up to operate for a load sharing, then
+If the link is further set up to operate with load sharing, then
.Fa local_addr
and
.Fa local_port
@@ -423,7 +432,7 @@ Likewise, if
.Fa remote_port
is zero, this indicates to redirect packets originating from any remote
port number.
-Almost always, the remote port specification will be zero, but non-zero
+The remote port specification will almost always be zero, but non-zero
remote addresses can sometimes be useful for firewalling.
If two calls to
.Fn LibAliasRedirectPort
@@ -475,9 +484,10 @@ is called to change the address after
.Fn LibAliasRedirectAddr
is called, a zero reference will track this change.
.Pp
-If the link is further set up to operate for a load sharing, then
+If the link is further set up to operate with load sharing, then the
.Fa local_addr
-is ignored, and is selected dynamically from the server pool, as described in
+argument is ignored, and is selected dynamically from the server pool,
+as described in
.Fn LibAliasAddServer
below.
.Pp
@@ -532,12 +542,12 @@ up for Load Sharing using IP Network Address Translation (RFC 2391, LSNAT).
LSNAT operates as follows.
A client attempts to access a server by using the server virtual address.
The LSNAT router transparently redirects the request to one of the hosts
-in server pool, selected using a real-time load sharing algorithm.
+in the server pool, using a real-time load sharing algorithm.
Multiple sessions may be initiated from the same client, and each session
-could be directed to a different host based on load balance across server
-pool hosts at the time.
-If load share is desired for just a few specific services, the configuration
-on LSNAT could be defined to restrict load share for just the services
+could be directed to a different host based on the load balance across server
+pool hosts when the sessions are initiated.
+If load sharing is desired for just a few specific services, the configuration
+on LSNAT could be defined to restrict load sharing to just the services
desired.
.Pp
Currently, only the simplest selection algorithm is implemented, where a
@@ -596,8 +606,8 @@ The parameter
is the pointer returned by either of the redirection functions.
If an invalid pointer is passed to
.Fn LibAliasRedirectDelete ,
-then a program crash or unpredictable operation could result, so it is
-necessary to be careful using this function.
+then a program crash or unpredictable operation could result, so
+care is needed when using this function.
.Ed
.Pp
.Ft int
@@ -704,7 +714,7 @@ access, or to restrict access to certain external machines.
.Bd -ragged -offset indent
This function specifies that any IP packet with protocol number of
.Fa proto
-from a given remote address to an alias address be
+from a given remote address to an alias address will be
redirected to a specified local address.
.Pp
If
@@ -814,6 +824,19 @@ argument is the pointer to a header fragment used as a template, and
is the pointer to the packet to be de-aliased.
.Ed
.Sh MISCELLANEOUS FUNCTIONS
+.Ft struct alias_link *
+.Fn AddLink "struct libalias *" "struct in_addr src_addr" "struct in_addr dst_addr" \
+"struct in_addr alias_addr" "u_short src_port" "u_short dst_port" \
+"int alias_param" "int link_type"
+.Bd -ragged -offset indent
+This function adds new state to the instance hash table.
+The dst_address and/or dst_port may be given as zero, which
+introduces some dynamic character into the link, since
+LibAliasSetAddress can change the address that is used.
+However, in the current implementation, such links can only be used
+for inbound (ext -> int) traffic.
+.Ed
+.Pp
.Ft void
.Fn LibAliasSetTarget "struct libalias *" "struct in_addr addr"
.Bd -ragged -offset indent
@@ -1098,9 +1121,9 @@ SLIST_HEAD(dll_chain, dll) dll_chain ...
.Ed
.Pp
.Va handler_chain
-keep tracks of all the protocol handlers loaded, while
+keeps track of all the protocol handlers loaded, while
.Va ddl_chain
-takes care of userland modules loaded.
+tracks which userland modules are loaded.
.Pp
.Va handler_chain
is composed of
@@ -1122,12 +1145,12 @@ struct proto_handler {
where:
.Bl -inset
.It Va pri
-is the priority assigned to a protocol handler, lower
+is the priority assigned to a protocol handler; lower priority
is better.
.It Va dir
is the direction of packets: ingoing or outgoing.
.It Va proto
-says at which protocol this packet belongs: IP, TCP or UDP.
+indicates to which protocol this packet belongs: IP, TCP or UDP.
.It Va fingerprint
points to the fingerprint function while protohandler points
to the protocol handler function.
@@ -1135,8 +1158,8 @@ to the protocol handler function.
.Pp
The
.Va fingerprint
-function has the double of scope of checking if the
-incoming packet is found and if it belongs to any categories that this
+function has the dual role of checking if the
+incoming packet is found, and if it belongs to any categories that this
module can handle.
.Pp
The
@@ -1151,8 +1174,8 @@ When a packet enters
if it meets a module hook,
.Va handler_chain
is searched to see if there is an handler that matches
-this type of a packet (it checks protocol and direction of packet), then if
-more than one handler is found, it starts with the module with
+this type of a packet (it checks protocol and direction of packet).
+Then, if more than one handler is found, it starts with the module with
the lowest priority number: it calls the
.Va fingerprint
function and interprets the result.
@@ -1190,8 +1213,8 @@ structure, then
is called.
The
.Fn find_handler
-function is responsible for walking out the handler
-chain, it receives as input parameters:
+function is responsible for walking the handler
+chain; it receives as input parameters:
.Bl -tag -width indent
.It Fa IN
direction
@@ -1215,9 +1238,9 @@ supporting INcoming UDP packets.
.Pp
As was mentioned earlier,
.Nm
-in userland is a bit different, cause
-care has to be taken of module handling too (avoiding duplicate load of
-module, avoiding module with same name, etc.) so
+in userland is a bit different, as
+care must be taken in module handling as well (avoiding duplicate load of
+modules, avoiding modules with same name, etc.) so
.Va dll_chain
was introduced.
.Pp
@@ -1231,9 +1254,8 @@ When an application calls
.Nm
first unloads all the loaded modules, then reloads all the modules listed in
.Pa /etc/libalias.conf :
-for every module loaded, a new entry to
-.Va dll_chain
-is added.
+for every module loaded, a new entry is added to
+.Va dll_chain .
.Pp
.Va dll_chain
is composed of
@@ -1270,8 +1292,8 @@ There is a module (called
.Pa alias_dummy.[ch] )
in
.Nm
-that can be used as a skeleton for future work, here we analyse some parts of that
-module.
+that can be used as a skeleton for future work.
+Here we analyse some parts of that module.
From
.Pa alias_dummy.c :
.Bd -literal
@@ -1284,7 +1306,7 @@ The variable
is the
.Dq "most important thing"
in a module
-cause it describes the handlers present and lets the outside world use
+since it describes the handlers present and lets the outside world use
it in an opaque way.
.Pp
It must ALWAYS be present in every module, and it MUST retain
@@ -1327,7 +1349,7 @@ mod_handler(module_t mod, int type, void *data)
.Ed
When running as KLD,
.Fn mod_handler
-register/deregister the module using
+registers/deregisters the module using
.Fn attach_handlers
and
.Fn detach_handlers ,
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index e754b88..1a8e537 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -100,6 +100,9 @@ void (*ip_divert_ptr)(struct mbuf *, int);
int (*ng_ipfw_input_p)(struct mbuf **, int,
struct ip_fw_args *, int);
+/* Hook for telling pf that the destination address changed */
+void (*m_addr_chg_pf_p)(struct mbuf *m);
+
#ifdef INET
/*
* Hooks for multicast routing. They all default to NULL, so leave them not
diff --git a/sys/netinet/sctp.h b/sys/netinet/sctp.h
index f496d26..3c8cf36 100644
--- a/sys/netinet/sctp.h
+++ b/sys/netinet/sctp.h
@@ -118,6 +118,7 @@ struct sctp_paramhdr {
#define SCTP_RECVRCVINFO 0x0000001f
#define SCTP_RECVNXTINFO 0x00000020
#define SCTP_DEFAULT_SNDINFO 0x00000021
+#define SCTP_DEFAULT_PRINFO 0x00000022
/*
* read-only options
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 8dc01cd..7059365 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -2523,8 +2523,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
so->so_pcb = (caddr_t)inp;
- if ((SCTP_SO_TYPE(so) == SOCK_DGRAM) ||
- (SCTP_SO_TYPE(so) == SOCK_SEQPACKET)) {
+ if (SCTP_SO_TYPE(so) == SOCK_SEQPACKET) {
/* UDP style socket */
inp->sctp_flags = (SCTP_PCB_FLAGS_UDPTYPE |
SCTP_PCB_FLAGS_UNBOUND);
@@ -3721,13 +3720,6 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from)
(void)sctp_m_free(ip_pcb->inp_options);
ip_pcb->inp_options = 0;
}
-#ifdef INET
- if (ip_pcb->inp_moptions) {
- inp_freemoptions(ip_pcb->inp_moptions);
- ip_pcb->inp_moptions = 0;
- }
-#endif
-
#ifdef INET6
if (ip_pcb->inp_vflag & INP_IPV6) {
struct in6pcb *in6p;
diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h
index e7f2daf..9b9acbf 100644
--- a/sys/netinet/sctp_uio.h
+++ b/sys/netinet/sctp_uio.h
@@ -162,6 +162,12 @@ struct sctp_prinfo {
uint32_t pr_value;
};
+struct sctp_default_prinfo {
+ uint16_t pr_policy;
+ uint32_t pr_value;
+ sctp_assoc_t pr_assoc_id;
+};
+
struct sctp_authinfo {
uint16_t auth_keyid;
};
@@ -201,6 +207,7 @@ struct sctp_recvv_rn {
#define SCTP_RECVV_NXTINFO 2
#define SCTP_RECVV_RN 3
+#define SCTP_SENDV_NOINFO 0
#define SCTP_SENDV_SNDINFO 1
#define SCTP_SENDV_PRINFO 2
#define SCTP_SENDV_AUTHINFO 3
@@ -244,12 +251,13 @@ struct sctp_snd_all_completes {
/* for the endpoint */
/* The lower byte is an enumeration of PR-SCTP policies */
+#define SCTP_PR_SCTP_NONE 0x0000/* Reliable transfer */
#define SCTP_PR_SCTP_TTL 0x0001/* Time based PR-SCTP */
#define SCTP_PR_SCTP_BUF 0x0002/* Buffer based PR-SCTP */
#define SCTP_PR_SCTP_RTX 0x0003/* Number of retransmissions based PR-SCTP */
#define PR_SCTP_POLICY(x) ((x) & 0x0f)
-#define PR_SCTP_ENABLED(x) (PR_SCTP_POLICY(x) != 0)
+#define PR_SCTP_ENABLED(x) (PR_SCTP_POLICY(x) != SCTP_PR_SCTP_NONE)
#define PR_SCTP_TTL_ENABLED(x) (PR_SCTP_POLICY(x) == SCTP_PR_SCTP_TTL)
#define PR_SCTP_BUF_ENABLED(x) (PR_SCTP_POLICY(x) == SCTP_PR_SCTP_BUF)
#define PR_SCTP_RTX_ENABLED(x) (PR_SCTP_POLICY(x) == SCTP_PR_SCTP_RTX)
@@ -583,6 +591,7 @@ struct sctp_authchunk {
struct sctp_authkey {
sctp_assoc_t sca_assoc_id;
uint16_t sca_keynumber;
+ uint16_t sca_keylength;
uint8_t sca_key[];
};
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index 2fcf306..ab87772 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -3030,6 +3030,7 @@ flags_out:
if (stcb) {
info->snd_sid = stcb->asoc.def_send.sinfo_stream;
info->snd_flags = stcb->asoc.def_send.sinfo_flags;
+ info->snd_flags &= 0xfff0;
info->snd_ppid = stcb->asoc.def_send.sinfo_ppid;
info->snd_context = stcb->asoc.def_send.sinfo_context;
SCTP_TCB_UNLOCK(stcb);
@@ -3038,6 +3039,7 @@ flags_out:
SCTP_INP_RLOCK(inp);
info->snd_sid = inp->def_send.sinfo_stream;
info->snd_flags = inp->def_send.sinfo_flags;
+ info->snd_flags &= 0xfff0;
info->snd_ppid = inp->def_send.sinfo_ppid;
info->snd_context = inp->def_send.sinfo_context;
SCTP_INP_RUNLOCK(inp);
@@ -3051,6 +3053,33 @@ flags_out:
}
break;
}
+ case SCTP_DEFAULT_PRINFO:
+ {
+ struct sctp_default_prinfo *info;
+
+ SCTP_CHECK_AND_CAST(info, optval, struct sctp_default_prinfo, *optsize);
+ SCTP_FIND_STCB(inp, stcb, info->pr_assoc_id);
+
+ if (stcb) {
+ info->pr_policy = PR_SCTP_POLICY(stcb->asoc.def_send.sinfo_flags);
+ info->pr_value = stcb->asoc.def_send.sinfo_timetolive;
+ SCTP_TCB_UNLOCK(stcb);
+ } else {
+ if (info->pr_assoc_id == SCTP_FUTURE_ASSOC) {
+ SCTP_INP_RLOCK(inp);
+ info->pr_policy = PR_SCTP_POLICY(inp->def_send.sinfo_flags);
+ info->pr_value = inp->def_send.sinfo_timetolive;
+ SCTP_INP_RUNLOCK(inp);
+ } else {
+ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
+ error = EINVAL;
+ }
+ }
+ if (error == 0) {
+ *optsize = sizeof(struct sctp_default_prinfo);
+ }
+ break;
+ }
default:
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT);
error = ENOPROTOOPT;
@@ -3542,8 +3571,18 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
size_t size;
SCTP_CHECK_AND_CAST(sca, optval, struct sctp_authkey, optsize);
+ if (sca->sca_keylength == 0) {
+ size = optsize - sizeof(struct sctp_authkey);
+ } else {
+ if (sca->sca_keylength + sizeof(struct sctp_authkey) <= optsize) {
+ size = sca->sca_keylength;
+ } else {
+ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
+ error = EINVAL;
+ break;
+ }
+ }
SCTP_FIND_STCB(inp, stcb, sca->sca_assoc_id);
- size = optsize - sizeof(struct sctp_authkey);
if (stcb) {
shared_keys = &stcb->asoc.shared_keys;
@@ -5043,6 +5082,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
case SCTP_DEFAULT_SNDINFO:
{
struct sctp_sndinfo *info;
+ uint16_t policy;
SCTP_CHECK_AND_CAST(info, optval, struct sctp_sndinfo, optsize);
SCTP_FIND_STCB(inp, stcb, info->snd_assoc_id);
@@ -5050,7 +5090,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
if (stcb) {
if (info->snd_sid < stcb->asoc.streamoutcnt) {
stcb->asoc.def_send.sinfo_stream = info->snd_sid;
+ policy = PR_SCTP_POLICY(stcb->asoc.def_send.sinfo_flags);
stcb->asoc.def_send.sinfo_flags = info->snd_flags;
+ stcb->asoc.def_send.sinfo_flags |= policy;
stcb->asoc.def_send.sinfo_ppid = info->snd_ppid;
stcb->asoc.def_send.sinfo_context = info->snd_context;
} else {
@@ -5063,7 +5105,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
(info->snd_assoc_id == SCTP_ALL_ASSOC)) {
SCTP_INP_WLOCK(inp);
inp->def_send.sinfo_stream = info->snd_sid;
+ policy = PR_SCTP_POLICY(inp->def_send.sinfo_flags);
inp->def_send.sinfo_flags = info->snd_flags;
+ inp->def_send.sinfo_flags |= policy;
inp->def_send.sinfo_ppid = info->snd_ppid;
inp->def_send.sinfo_context = info->snd_context;
SCTP_INP_WUNLOCK(inp);
@@ -5075,7 +5119,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
SCTP_TCB_LOCK(stcb);
if (info->snd_sid < stcb->asoc.streamoutcnt) {
stcb->asoc.def_send.sinfo_stream = info->snd_sid;
+ policy = PR_SCTP_POLICY(stcb->asoc.def_send.sinfo_flags);
stcb->asoc.def_send.sinfo_flags = info->snd_flags;
+ stcb->asoc.def_send.sinfo_flags |= policy;
stcb->asoc.def_send.sinfo_ppid = info->snd_ppid;
stcb->asoc.def_send.sinfo_context = info->snd_context;
}
@@ -5086,6 +5132,44 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
}
break;
}
+ case SCTP_DEFAULT_PRINFO:
+ {
+ struct sctp_default_prinfo *info;
+
+ SCTP_CHECK_AND_CAST(info, optval, struct sctp_default_prinfo, optsize);
+ SCTP_FIND_STCB(inp, stcb, info->pr_assoc_id);
+
+ if (PR_SCTP_INVALID_POLICY(info->pr_policy)) {
+ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
+ error = EINVAL;
+ break;
+ }
+ if (stcb) {
+ stcb->asoc.def_send.sinfo_flags &= 0xfff0;
+ stcb->asoc.def_send.sinfo_flags |= info->pr_policy;
+ SCTP_TCB_UNLOCK(stcb);
+ } else {
+ if ((info->pr_assoc_id == SCTP_FUTURE_ASSOC) ||
+ (info->pr_assoc_id == SCTP_ALL_ASSOC)) {
+ SCTP_INP_WLOCK(inp);
+ inp->def_send.sinfo_flags &= 0xfff0;
+ inp->def_send.sinfo_flags |= info->pr_policy;
+ SCTP_INP_WUNLOCK(inp);
+ }
+ if ((info->pr_assoc_id == SCTP_CURRENT_ASSOC) ||
+ (info->pr_assoc_id == SCTP_ALL_ASSOC)) {
+ SCTP_INP_RLOCK(inp);
+ LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) {
+ SCTP_TCB_LOCK(stcb);
+ stcb->asoc.def_send.sinfo_flags &= 0xfff0;
+ stcb->asoc.def_send.sinfo_flags |= info->pr_policy;
+ SCTP_TCB_UNLOCK(stcb);
+ }
+ SCTP_INP_RUNLOCK(inp);
+ }
+ }
+ break;
+ }
default:
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT);
error = ENOPROTOOPT;
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
index 27384c5..6569eda 100644
--- a/sys/netinet/tcp_lro.c
+++ b/sys/netinet/tcp_lro.c
@@ -277,6 +277,14 @@ tcp_lro_rx(struct lro_ctrl *cntl, struct mbuf *m_head, uint32_t csum)
lro->dest_port == tcp->th_dport &&
lro->source_ip == ip->ip_src.s_addr &&
lro->dest_ip == ip->ip_dst.s_addr) {
+ /* Flush now if appending will result in overflow. */
+ if (lro->len > (65535 - tcp_data_len)) {
+ SLIST_REMOVE(&cntl->lro_active, lro,
+ lro_entry, next);
+ tcp_lro_flush(cntl, lro);
+ break;
+ }
+
/* Try to append it */
if (__predict_false(seq != lro->next_seq ||
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 32cb81e..572a491 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -84,10 +84,6 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
-#ifdef notyet
-extern struct mbuf *m_copypack();
-#endif
-
VNET_DEFINE(int, path_mtu_discovery) = 1;
SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, path_mtu_discovery, CTLFLAG_RW,
&VNET_NAME(path_mtu_discovery), 1,
@@ -820,19 +816,6 @@ send:
TCPSTAT_INC(tcps_sndpack);
TCPSTAT_ADD(tcps_sndbyte, len);
}
-#ifdef notyet
- if ((m = m_copypack(so->so_snd.sb_mb, off,
- (int)len, max_linkhdr + hdrlen)) == 0) {
- SOCKBUF_UNLOCK(&so->so_snd);
- error = ENOBUFS;
- goto out;
- }
- /*
- * m_copypack left space for our hdr; use it.
- */
- m->m_len += hdrlen;
- m->m_data -= hdrlen;
-#else
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL) {
SOCKBUF_UNLOCK(&so->so_snd);
@@ -872,7 +855,7 @@ send:
goto out;
}
}
-#endif /* notyet */
+
/*
* If we're sending everything we've got, set PUSH.
* (This will keep happy those implementations which only
@@ -1102,8 +1085,15 @@ send:
m->m_pkthdr.tso_segsz = tp->t_maxopd - optlen;
}
+#ifdef IPSEC
+ KASSERT(len + hdrlen + ipoptlen - ipsec_optlen == m_length(m, NULL),
+ ("%s: mbuf chain shorter than expected: %ld + %u + %u - %u != %u",
+ __func__, len, hdrlen, ipoptlen, ipsec_optlen, m_length(m, NULL)));
+#else
KASSERT(len + hdrlen + ipoptlen == m_length(m, NULL),
- ("%s: mbuf chain shorter than expected", __func__));
+ ("%s: mbuf chain shorter than expected: %ld + %u + %u != %u",
+ __func__, len, hdrlen, ipoptlen, m_length(m, NULL)));
+#endif
/*
* In transmit state, time the transmission and arrange for
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 6ed58911..46b4022 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -206,11 +206,9 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, isn_reseed_interval, CTLFLAG_RW,
&VNET_NAME(tcp_isn_reseed_interval), 0,
"Seconds between reseeding of ISN secret");
-#ifdef TCP_SORECEIVE_STREAM
static int tcp_soreceive_stream = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, soreceive_stream, CTLFLAG_RDTUN,
&tcp_soreceive_stream, 0, "Using soreceive_stream for TCP sockets");
-#endif
#ifdef TCP_SIGNATURE
static int tcp_sig_checksigs = 1;
@@ -337,13 +335,15 @@ tcp_init(void)
tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT;
tcp_tcbhashsize = hashsize;
-#ifdef TCP_SORECEIVE_STREAM
TUNABLE_INT_FETCH("net.inet.tcp.soreceive_stream", &tcp_soreceive_stream);
if (tcp_soreceive_stream) {
+#ifdef INET
tcp_usrreqs.pru_soreceive = soreceive_stream;
+#endif
+#ifdef INET6
tcp6_usrreqs.pru_soreceive = soreceive_stream;
+#endif /* INET6 */
}
-#endif
#ifdef INET6
#define TCP_MINPROTOHDR (sizeof(struct ip6_hdr) + sizeof(struct tcphdr))
@@ -541,6 +541,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
m_freem(m->m_next);
m->m_next = NULL;
m->m_data = (caddr_t)ipgen;
+ m_addr_changed(m);
/* m_len is set later */
tlen = 0;
#define xchg(a,b,type) { type t; t=a; a=b; b=t; }
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index 952b38a..6a2da07 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1177,6 +1177,8 @@ icmp6_notify_error(struct mbuf **mp, int off, int icmp6len, int code)
ip6cp.ip6c_src = &icmp6src;
ip6cp.ip6c_nxt = nxt;
+ m_addr_changed(m);
+
if (icmp6type == ICMP6_PACKET_TOO_BIG) {
notifymtu = ntohl(icmp6->icmp6_mtu);
ip6cp.ip6c_cmdarg = (void *)&notifymtu;
@@ -2299,6 +2301,8 @@ icmp6_reflect(struct mbuf *m, size_t off)
m->m_flags &= ~(M_BCAST|M_MCAST);
+ m_addr_changed(m);
+
ip6_output(m, NULL, NULL, 0, NULL, &outif, NULL);
if (outif)
icmp6_ifoutstat_inc(outif, type, code);
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 9558d1b..39e77e9 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -2636,10 +2636,8 @@ in6_domifattach(struct ifnet *ifp)
ext->scope6_id = scope6_ifattach(ifp);
ext->lltable = lltable_init(ifp, AF_INET6);
if (ext->lltable != NULL) {
- ext->lltable->llt_new = in6_lltable_new;
ext->lltable->llt_free = in6_lltable_free;
ext->lltable->llt_prefix_free = in6_lltable_prefix_free;
- ext->lltable->llt_rtcheck = in6_lltable_rtcheck;
ext->lltable->llt_lookup = in6_lltable_lookup;
ext->lltable->llt_dump = in6_lltable_dump;
}
diff --git a/sys/netinet6/in6_gif.c b/sys/netinet6/in6_gif.c
index e786836..961fc77 100644
--- a/sys/netinet6/in6_gif.c
+++ b/sys/netinet6/in6_gif.c
@@ -262,6 +262,8 @@ in6_gif_output(struct ifnet *ifp,
#endif
}
+ m_addr_changed(m);
+
#ifdef IPV6_MINMTU
/*
* force fragmentation to minimum MTU, to avoid path MTU discovery.
diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c
index 9e78e9a..e03e640 100644
--- a/sys/netinet6/in6_proto.c
+++ b/sys/netinet6/in6_proto.c
@@ -192,41 +192,29 @@ struct ip6protosw inet6sw[] = {
},
#ifdef SCTP
{
- .pr_type = SOCK_DGRAM,
- .pr_domain = &inet6domain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp6_input,
- .pr_ctlinput = sctp6_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
+ .pr_type = SOCK_SEQPACKET,
+ .pr_domain = &inet6domain,
+ .pr_protocol = IPPROTO_SCTP,
+ .pr_flags = PR_WANTRCVD,
+ .pr_input = sctp6_input,
+ .pr_ctlinput = sctp6_ctlinput,
+ .pr_ctloutput = sctp_ctloutput,
+ .pr_drain = sctp_drain,
#ifndef INET /* Do not call initialization twice. */
- .pr_init = sctp_init,
+ .pr_init = sctp_init,
#endif
- .pr_usrreqs = &sctp6_usrreqs
-},
-{
- .pr_type = SOCK_SEQPACKET,
- .pr_domain = &inet6domain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp6_input,
- .pr_ctlinput = sctp6_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp6_usrreqs
+ .pr_usrreqs = &sctp6_usrreqs
},
-
{
- .pr_type = SOCK_STREAM,
- .pr_domain = &inet6domain,
- .pr_protocol = IPPROTO_SCTP,
- .pr_flags = PR_WANTRCVD,
- .pr_input = sctp6_input,
- .pr_ctlinput = sctp6_ctlinput,
- .pr_ctloutput = sctp_ctloutput,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp6_usrreqs
+ .pr_type = SOCK_STREAM,
+ .pr_domain = &inet6domain,
+ .pr_protocol = IPPROTO_SCTP,
+ .pr_flags = PR_WANTRCVD,
+ .pr_input = sctp6_input,
+ .pr_ctlinput = sctp6_ctlinput,
+ .pr_ctloutput = sctp_ctloutput,
+ .pr_drain = sctp_drain,
+ .pr_usrreqs = &sctp6_usrreqs
},
#endif /* SCTP */
{
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c
index 052b8f6..de3a622 100644
--- a/sys/netinet6/ip6_input.c
+++ b/sys/netinet6/ip6_input.c
@@ -504,6 +504,13 @@ ip6_input(struct mbuf *m)
goto bad;
}
#endif
+#ifdef IPSEC
+ /*
+ * Bypass packet filtering for packets previously handled by IPsec.
+ */
+ if (ip6_ipsec_filtertunnel(m))
+ goto passin;
+#endif /* IPSEC */
/*
* Run through list of hooks for input packets.
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index fe3e48a..2b51e43 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -78,61 +78,6 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
-struct mtx nd6sock_mtx;
-#define ND6SOCK_LOCK_INIT() \
- mtx_init(&nd6sock_mtx, "nd6sock_mtx", NULL, MTX_DEF)
-#define ND6SOCK_LOCK() mtx_lock(&nd6sock_mtx)
-#define ND6SOCK_UNLOCK() mtx_unlock(&nd6sock_mtx)
-#define ND6SOCK_LOCK_DESTROY() mtx_destroy(&nd6sock_mtx)
-
-statuc struct pr_usrreqs nd6_usrreqs = {
- .pru_attach = nd6_attach,
- .pru_send = nd6_send,
- .pru_detach = nd6_close,
-};
-
-static struct protosw nd6_protosw[] = {
- .pr_type = SOCK_RAW,
- .pr_flags = PR_ATOMIC|PR_ADDR,
- .pr_ctlinput = raw_ctlinput,
- .pr_init = raw_init,
- .pr_protocol = IPPROTO_ND6,
- .pr_usrreqs = &nd6_usrreqs,
-};
-
-static int
-nd6_attach(struct socket *so, int proto, struct thread *td)
-{
- int error;
-
- ND6SOCK_LOCK();
- if (V_nd6_so != NULL) {
- ND6SOCK_UNLOCK();
- return (EEXIST);
- }
-
- error = priv_check(td, PRIV_NETINET_RAW);
- if (error) {
- SEND_UNLOCK();
- return(error);
- }
-
- if (proto != IPPROTO_SEND) {
- SEND_UNLOCK();
- return (EPROTONOSUPPORT);
- }
- error = soreserve(so, send_sendspace, send_recvspace);
- if (error) {
- SEND_UNLOCK();
- return(error);
- }
-
- V_send_so = so;
- SEND_UNLOCK();
-
- return (0);
-}
-
#define ND6_SLOWTIMER_INTERVAL (60 * 60) /* 1 hour */
#define ND6_RECALC_REACHTM_INTERVAL (60 * 120) /* 2 hours */
@@ -1382,6 +1327,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
* accept_rtadv or auto_linklocal.
*/
if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) &&
+ !(ND.flags & ND6_IFF_IFDISABLED) &&
(ND.flags & (ND6_IFF_ACCEPT_RTADV |
ND6_IFF_AUTO_LINKLOCAL)))
ND.flags &= ~ND6_IFF_IFDISABLED;
@@ -1443,7 +1389,8 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
/* If no link-local address on ifp, configure */
ND_IFINFO(ifp)->flags |= ND6_IFF_AUTO_LINKLOCAL;
in6_ifattach(ifp, NULL);
- } else if (ND_IFINFO(ifp)->flags & ND6_IFF_AUTO_LINKLOCAL) {
+ } else if ((ND_IFINFO(ifp)->flags & ND6_IFF_AUTO_LINKLOCAL) &&
+ !(ND.flags & ND6_IFF_IFDISABLED)) {
/*
* When the IF already has
* ND6_IFF_AUTO_LINKLOCAL and no link-local
diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h
index 8ba3723..6f63192 100644
--- a/sys/netinet6/nd6.h
+++ b/sys/netinet6/nd6.h
@@ -319,16 +319,6 @@ struct nd_pfxrouter {
LIST_HEAD(nd_prhead, nd_prefix);
-struct sockaddr_nd6 {
- uint8_t snd6_len; /* total length */
- sa_family_t snd6_family; /* address family */
- int snd6_direction;
- int snd6_ifidx;
- char snd6_zero[8];
-};
-
-extern int (*nd6_sendso_input_hook)(struct mbuf *, struct ifnet *, int, int);
-
/* nd6.c */
VNET_DECLARE(int, nd6_prune);
VNET_DECLARE(int, nd6_delay);
diff --git a/sys/netipsec/ipsec_input.c b/sys/netipsec/ipsec_input.c
index a004aef..8b53bf4 100644
--- a/sys/netipsec/ipsec_input.c
+++ b/sys/netipsec/ipsec_input.c
@@ -473,6 +473,8 @@ ipsec4_common_input_cb(struct mbuf *m, struct secasvar *sav,
key_sa_recordxfer(sav, m); /* record data transfer */
+ m_addr_changed(m);
+
#ifdef DEV_ENC
encif->if_ipackets++;
encif->if_ibytes += m->m_pkthdr.len;
diff --git a/sys/netipsec/ipsec_output.c b/sys/netipsec/ipsec_output.c
index d10523d..77897ed 100644
--- a/sys/netipsec/ipsec_output.c
+++ b/sys/netipsec/ipsec_output.c
@@ -191,6 +191,8 @@ ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
}
key_sa_recordxfer(sav, m); /* record data transfer */
+ m_addr_changed(m);
+
/*
* We're done with IPsec processing, transmit the packet using the
* appropriate network protocol (IP or IPv6). SPD lookup will be
diff --git a/sys/netipsec/xform_ipip.c b/sys/netipsec/xform_ipip.c
index 8639c82..0eb8b6a 100644
--- a/sys/netipsec/xform_ipip.c
+++ b/sys/netipsec/xform_ipip.c
@@ -392,6 +392,8 @@ _ipip_input(struct mbuf *m, int iphlen, struct ifnet *gifp)
panic("%s: bogus ip version %u", __func__, v>>4);
}
+ m_addr_changed(m);
+
if (netisr_queue(isr, m)) { /* (0) on success. */
V_ipipstat.ipips_qfull++;
DPRINTF(("%s: packet dropped because of full queue\n",
diff --git a/sys/nfs/bootp_subr.c b/sys/nfs/bootp_subr.c
index ca90089..bd4a826 100644
--- a/sys/nfs/bootp_subr.c
+++ b/sys/nfs/bootp_subr.c
@@ -44,6 +44,7 @@
__FBSDID("$FreeBSD$");
#include "opt_bootp.h"
+#include "opt_nfs.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -1699,6 +1700,9 @@ bootpc_init(void)
}
rootdevnames[0] = "nfs:";
+#ifdef NFSCLIENT
+ rootdevnames[1] = "oldnfs:";
+#endif
mountopts(&nd->root_args, NULL);
for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next)
diff --git a/sys/nfsclient/nfs_krpc.c b/sys/nfsclient/nfs_krpc.c
index 242d425..171f7aa 100644
--- a/sys/nfsclient/nfs_krpc.c
+++ b/sys/nfsclient/nfs_krpc.c
@@ -306,9 +306,7 @@ nfs_disconnect(struct nfsmount *nmp)
client = nmp->nm_client;
nmp->nm_client = NULL;
mtx_unlock(&nmp->nm_mtx);
-#ifdef KGSSAPI
- rpc_gss_secpurge(client);
-#endif
+ rpc_gss_secpurge_call(client);
CLNT_CLOSE(client);
CLNT_RELEASE(client);
} else
@@ -325,18 +323,15 @@ nfs_safedisconnect(struct nfsmount *nmp)
static AUTH *
nfs_getauth(struct nfsmount *nmp, struct ucred *cred)
{
-#ifdef KGSSAPI
rpc_gss_service_t svc;
AUTH *auth;
-#endif
switch (nmp->nm_secflavor) {
-#ifdef KGSSAPI
case RPCSEC_GSS_KRB5:
case RPCSEC_GSS_KRB5I:
case RPCSEC_GSS_KRB5P:
if (!nmp->nm_mech_oid)
- if (!rpc_gss_mech_to_oid("kerberosv5",
+ if (!rpc_gss_mech_to_oid_call("kerberosv5",
&nmp->nm_mech_oid))
return (NULL);
if (nmp->nm_secflavor == RPCSEC_GSS_KRB5)
@@ -345,12 +340,11 @@ nfs_getauth(struct nfsmount *nmp, struct ucred *cred)
svc = rpc_gss_svc_integrity;
else
svc = rpc_gss_svc_privacy;
- auth = rpc_gss_secfind(nmp->nm_client, cred,
+ auth = rpc_gss_secfind_call(nmp->nm_client, cred,
nmp->nm_principal, nmp->nm_mech_oid, svc);
if (auth)
return (auth);
/* fallthrough */
-#endif
case AUTH_SYS:
default:
return (authunix_create(cred));
diff --git a/sys/nfsserver/nfs_srvkrpc.c b/sys/nfsserver/nfs_srvkrpc.c
index 512373b..3c60825 100644
--- a/sys/nfsserver/nfs_srvkrpc.c
+++ b/sys/nfsserver/nfs_srvkrpc.c
@@ -418,12 +418,9 @@ nfssvc_addsock(struct file *fp, struct thread *td)
static int
nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
{
-#ifdef KGSSAPI
char principal[128];
int error;
-#endif
-#ifdef KGSSAPI
if (args) {
error = copyinstr(args->principal, principal,
sizeof(principal), NULL);
@@ -434,7 +431,6 @@ nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
getcredhostname(td->td_ucred, principal + 4,
sizeof(principal) - 4);
}
-#endif
/*
* Only the first nfsd actually does any work. The RPC code
@@ -449,12 +445,10 @@ nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
NFSD_UNLOCK();
-#ifdef KGSSAPI
- rpc_gss_set_svc_name(principal, "kerberosv5",
+ rpc_gss_set_svc_name_call(principal, "kerberosv5",
GSS_C_INDEFINITE, NFS_PROG, NFS_VER2);
- rpc_gss_set_svc_name(principal, "kerberosv5",
+ rpc_gss_set_svc_name_call(principal, "kerberosv5",
GSS_C_INDEFINITE, NFS_PROG, NFS_VER3);
-#endif
if (args) {
nfsrv_pool->sp_minthreads = args->minthreads;
@@ -466,10 +460,8 @@ nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args)
svc_run(nfsrv_pool);
-#ifdef KGSSAPI
- rpc_gss_clear_svc_name(NFS_PROG, NFS_VER2);
- rpc_gss_clear_svc_name(NFS_PROG, NFS_VER3);
-#endif
+ rpc_gss_clear_svc_name_call(NFS_PROG, NFS_VER2);
+ rpc_gss_clear_svc_name_call(NFS_PROG, NFS_VER3);
NFSD_LOCK();
nfsrv_numnfsd--;
diff --git a/sys/pc98/cbus/pckbd.c b/sys/pc98/cbus/pckbd.c
index 24f7267..5efb983 100644
--- a/sys/pc98/cbus/pckbd.c
+++ b/sys/pc98/cbus/pckbd.c
@@ -799,6 +799,7 @@ pckbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
break;
case PIO_KEYMAP: /* set keyboard translation table */
+ case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
state->ks_accents = 0;
diff --git a/sys/pc98/conf/DEFAULTS b/sys/pc98/conf/DEFAULTS
index f30501e..6c8b561 100644
--- a/sys/pc98/conf/DEFAULTS
+++ b/sys/pc98/conf/DEFAULTS
@@ -27,3 +27,5 @@ options GEOM_PART_PC98
# enable support for native hardware
device atpic
+
+options NEW_PCIB
diff --git a/sys/powerpc/aim/copyinout.c b/sys/powerpc/aim/copyinout.c
index 3592691..69ba431 100644
--- a/sys/powerpc/aim/copyinout.c
+++ b/sys/powerpc/aim/copyinout.c
@@ -142,7 +142,7 @@ copyout(const void *kaddr, void *udaddr, size_t len)
char *up, *p;
size_t l;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
if (setfault(env)) {
@@ -183,7 +183,7 @@ copyin(const void *udaddr, void *kaddr, size_t len)
char *kp, *p;
size_t l;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
if (setfault(env)) {
@@ -225,7 +225,7 @@ copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done)
size_t l;
int rv, c;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
if (setfault(env)) {
@@ -267,7 +267,7 @@ subyte(void *addr, int byte)
faultbuf env;
char *p;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (char *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -293,7 +293,7 @@ suword32(void *addr, int word)
faultbuf env;
int *p;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (int *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -319,7 +319,7 @@ suword(void *addr, long word)
faultbuf env;
long *p;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -359,7 +359,7 @@ fubyte(const void *addr)
u_char *p;
int val;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (u_char *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -385,7 +385,7 @@ fuword32(const void *addr)
faultbuf env;
int32_t *p, val;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (int32_t *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -411,7 +411,7 @@ fuword(const void *addr)
faultbuf env;
long *p, val;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -444,7 +444,7 @@ casuword32(volatile uint32_t *addr, uint32_t old, uint32_t new)
faultbuf env;
uint32_t *p, val;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (uint32_t *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
@@ -489,7 +489,7 @@ casuword(volatile u_long *addr, u_long old, u_long new)
faultbuf env;
u_long *p, val;
- td = PCPU_GET(curthread);
+ td = curthread;
pm = &td->td_proc->p_vmspace->vm_pmap;
p = (u_long *)(USER_ADDR + ((uintptr_t)addr & ~SEGMENT_MASK));
diff --git a/sys/powerpc/aim/locore32.S b/sys/powerpc/aim/locore32.S
index 35ea99b..d0a3778 100644
--- a/sys/powerpc/aim/locore32.S
+++ b/sys/powerpc/aim/locore32.S
@@ -181,8 +181,7 @@ setfault:
mflr 0
mfcr 12
mfsprg 4,0
- lwz 4,PC_CURTHREAD(4)
- lwz 4,TD_PCB(4)
+ lwz 4,TD_PCB(2) /* curthread = r2 */
stw 3,PCB_ONFAULT(4)
stw 0,0(3)
stw 1,4(3)
diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S
index c200b4c..5af5e3a 100644
--- a/sys/powerpc/aim/locore64.S
+++ b/sys/powerpc/aim/locore64.S
@@ -203,8 +203,7 @@ ASENTRY(setfault)
mflr 0
mfcr 12
mfsprg 4,0
- ld 4,PC_CURTHREAD(4)
- ld 4,TD_PCB(4)
+ ld 4,TD_PCB(13) /* curthread = r13 */
std 3,PCB_ONFAULT(4)
std 0,0(3)
std 1,8(3)
diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c
index 3ccae91..c368c68 100644
--- a/sys/powerpc/aim/machdep.c
+++ b/sys/powerpc/aim/machdep.c
@@ -303,7 +303,7 @@ powerpc_init(vm_offset_t startkernel, vm_offset_t endkernel,
*/
pc = __pcpu;
pcpu_init(pc, 0, sizeof(struct pcpu));
- pc->pc_curthread = &thread0;
+ curthread_reg = pc->pc_curthread = &thread0;
pc->pc_cpuid = 0;
__asm __volatile("mtsprg 0, %0" :: "r"(pc));
@@ -745,7 +745,7 @@ kcopy(const void *src, void *dst, size_t len)
faultbuf env, *oldfault;
int rv;
- td = PCPU_GET(curthread);
+ td = curthread;
oldfault = td->td_pcb->pcb_onfault;
if ((rv = setfault(env)) != 0) {
td->td_pcb->pcb_onfault = oldfault;
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c
index be80455..23354f9 100644
--- a/sys/powerpc/aim/mmu_oea.c
+++ b/sys/powerpc/aim/mmu_oea.c
@@ -945,9 +945,7 @@ moea_activate(mmu_t mmu, struct thread *td)
pm = &td->td_proc->p_vmspace->vm_pmap;
pmr = pm->pmap_phys;
- sched_pin();
- CPU_OR(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
PCPU_SET(curpmap, pmr);
}
@@ -957,9 +955,7 @@ moea_deactivate(mmu_t mmu, struct thread *td)
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
- sched_pin();
- CPU_NAND(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &pm->pm_active);
PCPU_SET(curpmap, NULL);
}
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 291d89b..f051b61 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -998,9 +998,7 @@ moea64_activate(mmu_t mmu, struct thread *td)
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
- sched_pin();
- CPU_OR(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
#ifdef __powerpc64__
PCPU_SET(userslb, pm->pm_slb);
@@ -1015,9 +1013,7 @@ moea64_deactivate(mmu_t mmu, struct thread *td)
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
- sched_pin();
- CPU_NAND(&pm->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR(PCPU_GET(cpuid), &pm->pm_active);
#ifdef __powerpc64__
PCPU_SET(userslb, NULL);
#else
@@ -1715,7 +1711,7 @@ moea64_kextract(mmu_t mmu, vm_offset_t va)
pvo = moea64_pvo_find_va(kernel_pmap, va);
KASSERT(pvo != NULL, ("moea64_kextract: no addr found for %#" PRIxPTR,
va));
- pa = (pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) + (va - PVO_VADDR(pvo));
+ pa = (pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) | (va - PVO_VADDR(pvo));
PMAP_UNLOCK(kernel_pmap);
return (pa);
}
diff --git a/sys/powerpc/aim/mp_cpudep.c b/sys/powerpc/aim/mp_cpudep.c
index d617fde..68fe517 100644
--- a/sys/powerpc/aim/mp_cpudep.c
+++ b/sys/powerpc/aim/mp_cpudep.c
@@ -88,7 +88,7 @@ cpudep_ap_bootstrap(void)
msr = PSL_KERNSET & ~PSL_EE;
mtmsr(msr);
- pcpup->pc_curthread = pcpup->pc_idlethread;
+ curthread_reg = pcpup->pc_curthread = pcpup->pc_idlethread;
pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb;
sp = pcpup->pc_curpcb->pcb_sp;
diff --git a/sys/powerpc/aim/swtch32.S b/sys/powerpc/aim/swtch32.S
index cd141aa..a44b861 100644
--- a/sys/powerpc/aim/swtch32.S
+++ b/sys/powerpc/aim/swtch32.S
@@ -69,7 +69,7 @@
* void cpu_throw(struct thread *old, struct thread *new)
*/
ENTRY(cpu_throw)
- mr %r15, %r4
+ mr %r2, %r4
b cpu_switchin
/*
@@ -89,10 +89,9 @@ ENTRY(cpu_switch)
mflr %r16 /* Save the link register */
stw %r16,PCB_LR(%r6)
stw %r1,PCB_SP(%r6) /* Save the stack pointer */
- stw %r2,PCB_TOC(%r6) /* Save the TOC pointer */
mr %r14,%r3 /* Copy the old thread ptr... */
- mr %r15,%r4 /* and the new thread ptr in scratch */
+ mr %r2,%r4 /* and the new thread ptr in curthread */
mr %r16,%r5 /* and the new lock */
mr %r17,%r6 /* and the PCB */
@@ -122,24 +121,24 @@ cpu_switchin:
lis %r6,blocked_lock@ha
addi %r6,%r6,blocked_lock@l
blocked_loop:
- lwz %r7,TD_LOCK(%r15)
+ lwz %r7,TD_LOCK(%r2)
cmpw %r6,%r7
beq blocked_loop
#endif
mfsprg %r7,0 /* Get the pcpu pointer */
- stw %r15,PC_CURTHREAD(%r7) /* Store new current thread */
- lwz %r17,TD_PCB(%r15) /* Store new current PCB */
+ stw %r2,PC_CURTHREAD(%r7) /* Store new current thread */
+ lwz %r17,TD_PCB(%r2) /* Store new current PCB */
stw %r17,PC_CURPCB(%r7)
- mr %r3,%r15 /* Get new thread ptr */
+ mr %r3,%r2 /* Get new thread ptr */
bl pmap_activate /* Activate the new address space */
lwz %r6, PCB_FLAGS(%r17)
/* Restore FPU context if needed */
andi. %r6, %r6, PCB_FPU
beq .L3
- mr %r3,%r15 /* Pass curthread to enable_fpu */
+ mr %r3,%r2 /* Pass curthread to enable_fpu */
bl enable_fpu
.L3:
@@ -147,7 +146,7 @@ blocked_loop:
/* Restore Altivec context if needed */
andi. %r6, %r6, PCB_VEC
beq .L4
- mr %r3,%r15 /* Pass curthread to enable_vec */
+ mr %r3,%r2 /* Pass curthread to enable_vec */
bl enable_vec
/* thread to restore is in r3 */
@@ -163,7 +162,6 @@ blocked_loop:
mtsr USER_SR,%r5
isync
lwz %r1,PCB_SP(%r3) /* Load the stack pointer */
- lwz %r2,PCB_TOC(%r3) /* Load the TOC pointer */
/*
* Perform a dummy stwcx. to clear any reservations we may have
* inherited from the previous thread. It doesn't matter if the
diff --git a/sys/powerpc/aim/swtch64.S b/sys/powerpc/aim/swtch64.S
index 1877e8d..c5cdcbc 100644
--- a/sys/powerpc/aim/swtch64.S
+++ b/sys/powerpc/aim/swtch64.S
@@ -69,7 +69,7 @@
* void cpu_throw(struct thread *old, struct thread *new)
*/
ENTRY(cpu_throw)
- mr %r15, %r4
+ mr %r13, %r4
b cpu_switchin
/*
@@ -83,7 +83,6 @@ ENTRY(cpu_switch)
ld %r6,TD_PCB(%r3) /* Get the old thread's PCB ptr */
std %r12,PCB_CONTEXT(%r6) /* Save the non-volatile GP regs.
These can now be used for scratch */
- std %r13,PCB_CONTEXT+1*8(%r6)
std %r14,PCB_CONTEXT+2*8(%r6)
std %r15,PCB_CONTEXT+3*8(%r6)
std %r16,PCB_CONTEXT+4*8(%r6)
@@ -111,7 +110,7 @@ ENTRY(cpu_switch)
std %r2,PCB_TOC(%r6) /* Save the TOC pointer */
mr %r14,%r3 /* Copy the old thread ptr... */
- mr %r15,%r4 /* and the new thread ptr in scratch */
+ mr %r13,%r4 /* and the new thread ptr in curthread*/
mr %r16,%r5 /* and the new lock */
mr %r17,%r6 /* and the PCB */
@@ -148,19 +147,19 @@ cpu_switchin:
lis %r6,blocked_lock@ha
addi %r6,%r6,blocked_lock@l
blocked_loop:
- ld %r7,TD_LOCK(%r15)
+ ld %r7,TD_LOCK(%r13)
cmpd %r6,%r7
beq blocked_loop
#endif
mfsprg %r7,0 /* Get the pcpu pointer */
- std %r15,PC_CURTHREAD(%r7) /* Store new current thread */
- ld %r17,TD_PCB(%r15) /* Store new current PCB */
+ std %r13,PC_CURTHREAD(%r7) /* Store new current thread */
+ ld %r17,TD_PCB(%r13) /* Store new current PCB */
std %r17,PC_CURPCB(%r7)
stdu %r1,-48(%r1)
- mr %r3,%r15 /* Get new thread ptr */
+ mr %r3,%r13 /* Get new thread ptr */
bl pmap_activate /* Activate the new address space */
nop
@@ -168,7 +167,7 @@ blocked_loop:
/* Restore FPU context if needed */
andi. %r6, %r6, PCB_FPU
beq .L3
- mr %r3,%r15 /* Pass curthread to enable_fpu */
+ mr %r3,%r13 /* Pass curthread to enable_fpu */
bl enable_fpu
nop
@@ -177,7 +176,7 @@ blocked_loop:
/* Restore Altivec context if needed */
andi. %r6, %r6, PCB_VEC
beq .L4
- mr %r3,%r15 /* Pass curthread to enable_vec */
+ mr %r3,%r13 /* Pass curthread to enable_vec */
bl enable_vec
nop
@@ -186,7 +185,6 @@ blocked_loop:
addi %r1,%r1,48
mr %r3,%r17 /* Recover PCB ptr */
ld %r12,PCB_CONTEXT(%r3) /* Load the non-volatile GP regs. */
- ld %r13,PCB_CONTEXT+1*8(%r3)
ld %r14,PCB_CONTEXT+2*8(%r3)
ld %r15,PCB_CONTEXT+3*8(%r3)
ld %r16,PCB_CONTEXT+4*8(%r3)
diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c
index 60c0f3b..51dee0e 100644
--- a/sys/powerpc/aim/trap.c
+++ b/sys/powerpc/aim/trap.c
@@ -149,7 +149,7 @@ trap(struct trapframe *frame)
PCPU_INC(cnt.v_trap);
- td = PCPU_GET(curthread);
+ td = curthread;
p = td->td_proc;
type = ucode = frame->exc;
@@ -452,7 +452,7 @@ syscall(struct trapframe *frame)
struct syscall_args sa;
int error;
- td = PCPU_GET(curthread);
+ td = curthread;
td->td_frame = frame;
#ifdef __powerpc64__
@@ -600,7 +600,7 @@ badaddr_read(void *addr, size_t size, int *rptr)
/* Get rid of any stale machine checks that have been waiting. */
__asm __volatile ("sync; isync");
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = 0;
diff --git a/sys/powerpc/aim/trap_subr32.S b/sys/powerpc/aim/trap_subr32.S
index 7c154a8..172150e 100644
--- a/sys/powerpc/aim/trap_subr32.S
+++ b/sys/powerpc/aim/trap_subr32.S
@@ -155,9 +155,15 @@
stw %r28,FRAME_AIM_DAR+8(1); \
stw %r29,FRAME_AIM_DSISR+8(1); /* save dsisr/srr0/srr1 */ \
stw %r30,FRAME_SRR0+8(1); \
- stw %r31,FRAME_SRR1+8(1)
+ stw %r31,FRAME_SRR1+8(1); \
+ lwz %r2,PC_CURTHREAD(%r2) /* set curthread pointer */
#define FRAME_LEAVE(savearea) \
+/* Disable exceptions: */ \
+ mfmsr %r2; \
+ andi. %r2,%r2,~PSL_EE@l; \
+ mtmsr %r2; \
+ isync; \
/* Now restore regs: */ \
lwz %r2,FRAME_SRR0+8(%r1); \
lwz %r3,FRAME_SRR1+8(%r1); \
@@ -209,7 +215,7 @@
mtsprg3 %r3; \
/* Disable translation, machine check and recoverability: */ \
mfmsr %r2; \
- andi. %r2,%r2,~(PSL_DR|PSL_IR|PSL_EE|PSL_ME|PSL_RI)@l; \
+ andi. %r2,%r2,~(PSL_DR|PSL_IR|PSL_ME|PSL_RI)@l; \
mtmsr %r2; \
isync; \
/* Decide whether we return to user mode: */ \
@@ -762,8 +768,8 @@ CNAME(trapexit):
bf 17,1f /* branch if PSL_PR is false */
GET_CPUINFO(%r3) /* get per-CPU pointer */
- lwz %r4, PC_CURTHREAD(%r3) /* deref to get curthread */
- lwz %r4, TD_FLAGS(%r4) /* get thread flags value */
+ lwz %r4, TD_FLAGS(%r2) /* get thread flags value
+ * (r2 is curthread) */
lis %r5, (TDF_ASTPENDING|TDF_NEEDRESCHED)@h
ori %r5,%r5, (TDF_ASTPENDING|TDF_NEEDRESCHED)@l
and. %r4,%r4,%r5
diff --git a/sys/powerpc/aim/trap_subr64.S b/sys/powerpc/aim/trap_subr64.S
index 5d4148a..111d516 100644
--- a/sys/powerpc/aim/trap_subr64.S
+++ b/sys/powerpc/aim/trap_subr64.S
@@ -179,9 +179,15 @@ restore_kernsrs:
std %r28,FRAME_AIM_DAR+48(1); \
std %r29,FRAME_AIM_DSISR+48(1); /* save dsisr/srr0/srr1 */ \
std %r30,FRAME_SRR0+48(1); \
- std %r31,FRAME_SRR1+48(1)
+ std %r31,FRAME_SRR1+48(1); \
+ ld %r13,PC_CURTHREAD(%r2) /* set kernel curthread */
#define FRAME_LEAVE(savearea) \
+/* Disable exceptions: */ \
+ mfmsr %r2; \
+ andi. %r2,%r2,~PSL_EE@l; \
+ mtmsr %r2; \
+ isync; \
/* Now restore regs: */ \
ld %r2,FRAME_SRR0+48(%r1); \
ld %r3,FRAME_SRR1+48(%r1); \
@@ -233,7 +239,7 @@ restore_kernsrs:
mtsprg3 %r3; \
/* Disable translation, machine check and recoverability: */ \
mfmsr %r2; \
- andi. %r2,%r2,~(PSL_DR|PSL_IR|PSL_EE|PSL_ME|PSL_RI)@l; \
+ andi. %r2,%r2,~(PSL_DR|PSL_IR|PSL_ME|PSL_RI)@l; \
mtmsr %r2; \
isync; \
/* Decide whether we return to user mode: */ \
@@ -524,8 +530,7 @@ CNAME(trapexit):
bf 17,1f /* branch if PSL_PR is false */
GET_CPUINFO(%r3) /* get per-CPU pointer */
- ld %r4, PC_CURTHREAD(%r3) /* deref to get curthread */
- lwz %r4, TD_FLAGS(%r4) /* get thread flags value */
+ lwz %r4, TD_FLAGS(%r13) /* get thread flags value */
lis %r5, (TDF_ASTPENDING|TDF_NEEDRESCHED)@h
ori %r5,%r5, (TDF_ASTPENDING|TDF_NEEDRESCHED)@l
and. %r4,%r4,%r5
diff --git a/sys/powerpc/booke/copyinout.c b/sys/powerpc/booke/copyinout.c
index 91195dd..011b8bd 100644
--- a/sys/powerpc/booke/copyinout.c
+++ b/sys/powerpc/booke/copyinout.c
@@ -87,7 +87,7 @@ copyout(const void *kaddr, void *udaddr, size_t len)
if (!is_uaddr(udaddr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -109,7 +109,7 @@ copyin(const void *udaddr, void *kaddr, size_t len)
if (!is_uaddr(udaddr) || is_uaddr(kaddr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -135,7 +135,7 @@ copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done)
if (!is_uaddr(udaddr) || is_uaddr(kaddr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -175,7 +175,7 @@ subyte(void *addr, int byte)
if (!is_uaddr(addr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -197,7 +197,7 @@ suword(void *addr, long word)
if (!is_uaddr(addr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -228,7 +228,7 @@ fubyte(const void *addr)
if (!is_uaddr(addr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -251,7 +251,7 @@ fuword(const void *addr)
if (!is_uaddr(addr))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
@@ -288,7 +288,7 @@ casuword(volatile u_long *addr, u_long old, u_long new)
if (!((vm_offset_t)addr <= VM_MAXUSER_ADDRESS))
return (EFAULT);
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = NULL;
diff --git a/sys/powerpc/booke/interrupt.c b/sys/powerpc/booke/interrupt.c
index c0bdee1..e268537 100644
--- a/sys/powerpc/booke/interrupt.c
+++ b/sys/powerpc/booke/interrupt.c
@@ -118,7 +118,7 @@ powerpc_decr_interrupt(struct trapframe *framep)
struct thread *td;
struct trapframe *oldframe;
- td = PCPU_GET(curthread);
+ td = curthread;
critical_enter();
atomic_add_int(&td->td_intr_nesting_level, 1);
oldframe = td->td_intr_frame;
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c
index e1cd071..18068fc 100644
--- a/sys/powerpc/booke/pmap.c
+++ b/sys/powerpc/booke/pmap.c
@@ -1826,6 +1826,7 @@ static void
mmu_booke_activate(mmu_t mmu, struct thread *td)
{
pmap_t pmap;
+ u_int cpuid;
pmap = &td->td_proc->p_vmspace->vm_pmap;
@@ -1836,14 +1837,15 @@ mmu_booke_activate(mmu_t mmu, struct thread *td)
mtx_lock_spin(&sched_lock);
- CPU_OR_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
+ cpuid = PCPU_GET(cpuid);
+ CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
PCPU_SET(curpmap, pmap);
- if (pmap->pm_tid[PCPU_GET(cpuid)] == TID_NONE)
+ if (pmap->pm_tid[cpuid] == TID_NONE)
tid_alloc(pmap);
/* Load PID0 register with pmap tid value. */
- mtspr(SPR_PID0, pmap->pm_tid[PCPU_GET(cpuid)]);
+ mtspr(SPR_PID0, pmap->pm_tid[cpuid]);
__asm __volatile("isync");
mtx_unlock_spin(&sched_lock);
@@ -1865,9 +1867,7 @@ mmu_booke_deactivate(mmu_t mmu, struct thread *td)
CTR5(KTR_PMAP, "%s: td=%p, proc = '%s', id = %d, pmap = 0x%08x",
__func__, td, td->td_proc->p_comm, td->td_proc->p_pid, pmap);
- sched_pin();
- CPU_NAND_ATOMIC(&pmap->pm_active, PCPU_PTR(cpumask));
- sched_unpin();
+ CPU_CLR_ATOMIC(PCPU_GET(cpuid), &pmap->pm_active);
PCPU_SET(curpmap, NULL);
}
diff --git a/sys/powerpc/booke/trap.c b/sys/powerpc/booke/trap.c
index a2d0d70..fc506bd 100644
--- a/sys/powerpc/booke/trap.c
+++ b/sys/powerpc/booke/trap.c
@@ -145,7 +145,7 @@ trap(struct trapframe *frame)
PCPU_INC(cnt.v_trap);
- td = PCPU_GET(curthread);
+ td = curthread;
p = td->td_proc;
type = frame->exc;
@@ -382,7 +382,7 @@ syscall(struct trapframe *frame)
struct syscall_args sa;
int error;
- td = PCPU_GET(curthread);
+ td = curthread;
td->td_frame = frame;
error = syscallenter(td, &sa);
@@ -480,7 +480,7 @@ badaddr_read(void *addr, size_t size, int *rptr)
/* Get rid of any stale machine checks that have been waiting. */
__asm __volatile ("sync; isync");
- td = PCPU_GET(curthread);
+ td = curthread;
if (setfault(env)) {
td->td_pcb->pcb_onfault = 0;
diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC
index 2950a49..367ced5 100644
--- a/sys/powerpc/conf/GENERIC
+++ b/sys/powerpc/conf/GENERIC
@@ -31,6 +31,7 @@ options PSIM #GDB PSIM ppc simulator
options MAMBO #IBM Mambo Full System Simulator
options SCHED_ULE #ULE scheduler
+options PREEMPTION #Enable kernel thread preemption
options INET #InterNETworking
options INET6 #IPv6 communications protocols
options SCTP #Stream Control Transmission Protocol
diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64
index 7e385a1..e1e4aad 100644
--- a/sys/powerpc/conf/GENERIC64
+++ b/sys/powerpc/conf/GENERIC64
@@ -31,6 +31,7 @@ options PS3 #Sony Playstation 3
options MAMBO #IBM Mambo Full System Simulator
options SCHED_ULE #ULE scheduler
+options PREEMPTION #Enable kernel thread preemption
options INET #InterNETworking
options INET6 #IPv6 communications protocols
options SCTP #Stream Control Transmission Protocol
diff --git a/sys/powerpc/include/pcpu.h b/sys/powerpc/include/pcpu.h
index 949bbf3..631abd2 100644
--- a/sys/powerpc/include/pcpu.h
+++ b/sys/powerpc/include/pcpu.h
@@ -135,6 +135,14 @@ struct pmap;
#ifdef _KERNEL
#define pcpup ((struct pcpu *) powerpc_get_pcpup())
+#ifdef __powerpc64__
+register struct thread *curthread_reg __asm("%r13");
+#else
+register struct thread *curthread_reg __asm("%r2");
+#endif
+#ifdef AIM /* Book-E not yet adapted */
+#define curthread curthread_reg
+#endif
#define PCPU_GET(member) (pcpup->pc_ ## member)
diff --git a/sys/powerpc/ofw/ofwcall32.S b/sys/powerpc/ofw/ofwcall32.S
index 06cc105..d2ba70f 100644
--- a/sys/powerpc/ofw/ofwcall32.S
+++ b/sys/powerpc/ofw/ofwcall32.S
@@ -87,10 +87,11 @@ ASENTRY(ofwcall)
* later.
*/
mr %r5,%r1
- lis %r1,(ofwstk+OFWSTKSZ-16)@ha
- addi %r1,%r1,(ofwstk+OFWSTKSZ-16)@l
- stw %r5,8(%r1) /* Save real stack pointer */
- stw %r6,12(%r1) /* Save old MSR */
+ lis %r1,(ofwstk+OFWSTKSZ-32)@ha
+ addi %r1,%r1,(ofwstk+OFWSTKSZ-32)@l
+ stw %r5,20(%r1) /* Save real stack pointer */
+ stw %r2,24(%r1) /* Save curthread */
+ stw %r6,28(%r1) /* Save old MSR */
li %r5,0
stw %r5,4(%r1)
stw %r5,0(%r1)
@@ -100,8 +101,9 @@ ASENTRY(ofwcall)
bctrl
/* Reload stack pointer and MSR from the OFW stack */
- lwz %r6,12(%r1)
- lwz %r1,8(%r1)
+ lwz %r6,28(%r1)
+ lwz %r2,24(%r1)
+ lwz %r1,20(%r1)
/* Now set the real MSR */
mtmsr %r6
diff --git a/sys/powerpc/ofw/rtas.c b/sys/powerpc/ofw/rtas.c
index 59692c9..66ce12f 100644
--- a/sys/powerpc/ofw/rtas.c
+++ b/sys/powerpc/ofw/rtas.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/systm.h>
+#include <sys/proc.h>
#include <vm/vm.h>
#include <vm/vm_page.h>
@@ -39,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/md_var.h>
+#include <machine/pcb.h>
#include <machine/pmap.h>
#include <machine/rtas.h>
#include <machine/stdarg.h>
@@ -60,6 +62,8 @@ int rtascall(vm_offset_t callbuffer, uintptr_t rtas_privdat);
extern uintptr_t rtas_entry;
extern register_t rtasmsr;
+int setfault(faultbuf); /* defined in locore.S */
+
/*
* After the VM is up, allocate RTAS memory and instantiate it
*/
@@ -188,6 +192,7 @@ int
rtas_call_method(cell_t token, int nargs, int nreturns, ...)
{
vm_offset_t argsptr;
+ faultbuf env;
va_list ap;
struct {
cell_t token;
@@ -213,7 +218,19 @@ rtas_call_method(cell_t token, int nargs, int nreturns, ...)
args.args_n_results[n] = va_arg(ap, cell_t);
argsptr = rtas_real_map(&args, sizeof(args));
- result = rtascall(argsptr, rtas_private_data);
+
+ /* Get rid of any stale machine checks that have been waiting. */
+ __asm __volatile ("sync; isync");
+ if (!setfault(env)) {
+ __asm __volatile ("sync");
+ result = rtascall(argsptr, rtas_private_data);
+ __asm __volatile ("sync; isync");
+ } else {
+ result = RTAS_HW_ERROR;
+ }
+ curthread->td_pcb->pcb_onfault = 0;
+ __asm __volatile ("sync");
+
rtas_real_unmap(argsptr, &args, sizeof(args));
mtx_unlock(&rtas_mtx);
diff --git a/sys/powerpc/powermac/fcu.c b/sys/powerpc/powermac/fcu.c
index 7ac9b1b..eb43ff2 100644
--- a/sys/powerpc/powermac/fcu.c
+++ b/sys/powerpc/powermac/fcu.c
@@ -510,7 +510,7 @@ fcu_fill_fan_prop(device_t dev)
sc->sc_fans[j].fan.set =
(int (*)(struct pmac_fan *, int))(fcu_fan_set_rpm);
} else {
- sc->sc_fans[j].fan.min_rpm = 40; /* Percent */
+ sc->sc_fans[j].fan.min_rpm = 30; /* Percent */
sc->sc_fans[j].fan.max_rpm = 100;
sc->sc_fans[j].fan.read = NULL;
sc->sc_fans[j].fan.set =
diff --git a/sys/powerpc/powerpc/db_trace.c b/sys/powerpc/powerpc/db_trace.c
index f783781..20de0ec 100644
--- a/sys/powerpc/powerpc/db_trace.c
+++ b/sys/powerpc/powerpc/db_trace.c
@@ -200,7 +200,7 @@ db_backtrace(struct thread *td, db_addr_t fp, int count)
}
#ifdef __powerpc64__
- db_printf("0x%16lx: ", stackframe);
+ db_printf("0x%016lx: ", stackframe);
#else
db_printf("0x%08x: ", stackframe);
#endif
diff --git a/sys/powerpc/powerpc/mp_machdep.c b/sys/powerpc/powerpc/mp_machdep.c
index 62a97e9..db20a6f 100644
--- a/sys/powerpc/powerpc/mp_machdep.c
+++ b/sys/powerpc/powerpc/mp_machdep.c
@@ -96,10 +96,6 @@ machdep_ap_bootstrap(void)
printf("SMP: AP CPU #%d launched\n", PCPU_GET(cpuid));
mtx_unlock_spin(&ap_boot_mtx);
- /* Initialize curthread */
- PCPU_SET(curthread, PCPU_GET(idlethread));
- PCPU_SET(curpcb, curthread->td_pcb);
-
/* Start per-CPU event timers. */
cpu_initclocks_ap();
@@ -175,9 +171,8 @@ cpu_mp_start(void)
pc->pc_cpuid = bsp.cr_cpuid;
pc->pc_bsp = 1;
}
- CPU_SETOF(pc->pc_cpuid, &pc->pc_cpumask);
pc->pc_hwref = cpu.cr_hwref;
- CPU_OR(&all_cpus, &pc->pc_cpumask);
+ CPU_SET(pc->pc_cpuid, &all_cpus);
next:
error = platform_smp_next_cpu(&cpu);
}
@@ -215,8 +210,6 @@ cpu_mp_unleash(void *dummy)
smp_cpus = 0;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
cpus++;
- pc->pc_other_cpus = all_cpus;
- CPU_NAND(&pc->pc_other_cpus, &pc->pc_cpumask);
if (!pc->pc_bsp) {
if (bootverbose)
printf("Waking up CPU %d (dev=%x)\n",
@@ -278,7 +271,7 @@ SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL);
int
powerpc_ipi_handler(void *arg)
{
- cpuset_t self;
+ u_int cpuid;
uint32_t ipimask;
int msg;
@@ -310,14 +303,14 @@ powerpc_ipi_handler(void *arg)
*/
CTR1(KTR_SMP, "%s: IPI_STOP or IPI_STOP_HARD (stop)",
__func__);
- savectx(&stoppcbs[PCPU_GET(cpuid)]);
- self = PCPU_GET(cpumask);
+ cpuid = PCPU_GET(cpuid);
+ savectx(&stoppcbs[cpuid]);
savectx(PCPU_GET(curpcb));
- CPU_OR_ATOMIC(&stopped_cpus, &self);
- while (!CPU_OVERLAP(&started_cpus, &self))
+ CPU_SET_ATOMIC(cpuid, &stopped_cpus);
+ while (!CPU_ISSET(cpuid, &started_cpus))
cpu_spinwait();
- CPU_NAND_ATOMIC(&started_cpus, &self);
- CPU_NAND_ATOMIC(&stopped_cpus, &self);
+ CPU_CLR_ATOMIC(cpuid, &stopped_cpus);
+ CPU_CLR_ATOMIC(cpuid, &started_cpus);
CTR1(KTR_SMP, "%s: IPI_STOP (restart)", __func__);
break;
case IPI_HARDCLOCK:
@@ -350,7 +343,7 @@ ipi_selected(cpuset_t cpus, int ipi)
struct pcpu *pc;
STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) {
- if (CPU_OVERLAP(&cpus, &pc->pc_cpumask))
+ if (CPU_ISSET(pc->pc_cpuid, &cpus))
ipi_send(pc, ipi);
}
}
diff --git a/sys/powerpc/ps3/if_glc.c b/sys/powerpc/ps3/if_glc.c
index 6901f44..ab5c172 100644
--- a/sys/powerpc/ps3/if_glc.c
+++ b/sys/powerpc/ps3/if_glc.c
@@ -135,6 +135,7 @@ glc_attach(device_t dev)
callout_init_mtx(&sc->sc_tick_ch, &sc->sc_mtx, 0);
sc->next_txdma_slot = 0;
sc->bsy_txdma_slots = 0;
+ sc->sc_next_rxdma_slot = 0;
sc->first_used_txdma_slot = -1;
/*
@@ -154,7 +155,7 @@ glc_attach(device_t dev)
lv1_net_control(sc->sc_bus, sc->sc_dev, GELIC_GET_MAC_ADDRESS,
0, 0, 0, &mac64, &junk);
memcpy(sc->sc_enaddr, &((uint8_t *)&mac64)[2], sizeof(sc->sc_enaddr));
- sc->sc_tx_vlan = sc->sc_rx_vlan = -1;
+ sc->sc_tx_vlan = sc->sc_rx_vlan = -1;
err = lv1_net_control(sc->sc_bus, sc->sc_dev, GELIC_GET_VLAN_ID,
GELIC_VLAN_TX_ETHERNET, 0, 0, &val, &junk);
if (err == 0)
@@ -177,7 +178,7 @@ glc_attach(device_t dev)
}
bus_setup_intr(dev, sc->sc_irq,
- INTR_TYPE_MISC | INTR_MPSAFE | INTR_ENTROPY,
+ INTR_TYPE_NET | INTR_MPSAFE | INTR_ENTROPY,
glc_intr_filter, glc_intr, sc, &sc->sc_irqctx);
sc->sc_hwirq_status = (uint64_t *)contigmalloc(8, M_GLC, M_ZERO, 0,
BUS_SPACE_MAXADDR_32BIT, 8, PAGE_SIZE);
@@ -375,6 +376,14 @@ glc_tick(void *xsc)
mtx_assert(&sc->sc_mtx, MA_OWNED);
+ /*
+ * XXX: Sometimes the RX queue gets stuck. Poke it periodically until
+ * we figure out why. This will fail harmlessly if the RX queue is
+ * already running.
+ */
+ lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev,
+ sc->sc_rxsoft[sc->sc_next_rxdma_slot].rxs_desc, 0);
+
if (sc->sc_wdog_timer == 0 || --sc->sc_wdog_timer != 0) {
callout_reset(&sc->sc_tick_ch, hz, glc_tick, sc);
return;
@@ -707,12 +716,19 @@ glc_rxintr(struct glc_softc *sc)
struct ifnet *ifp = sc->sc_ifp;
bus_dmamap_sync(sc->sc_dmadesc_tag, sc->sc_rxdmadesc_map,
- BUS_DMASYNC_PREWRITE);
+ BUS_DMASYNC_POSTREAD);
restart_rxdma = 0;
while ((sc->sc_rxdmadesc[sc->sc_next_rxdma_slot].cmd_stat &
GELIC_DESCR_OWNED) == 0) {
i = sc->sc_next_rxdma_slot;
+ sc->sc_next_rxdma_slot++;
+ if (sc->sc_next_rxdma_slot >= GLC_MAX_RX_PACKETS)
+ sc->sc_next_rxdma_slot = 0;
+
+ if (sc->sc_rxdmadesc[i].cmd_stat & GELIC_CMDSTAT_CHAIN_END)
+ restart_rxdma = 1;
+
if (sc->sc_rxdmadesc[i].rxerror & GELIC_RXERRORS) {
ifp->if_ierrors++;
goto requeue;
@@ -738,28 +754,30 @@ glc_rxintr(struct glc_softc *sc)
m->m_pkthdr.rcvif = ifp;
m->m_len = sc->sc_rxdmadesc[i].valid_size;
m->m_pkthdr.len = m->m_len;
- sc->sc_next_rxdma_slot++;
- if (sc->sc_next_rxdma_slot >= GLC_MAX_RX_PACKETS)
- sc->sc_next_rxdma_slot = 0;
- if (sc->sc_rx_vlan >= 0)
- m_adj(m, 2);
+ /*
+ * Remove VLAN tag. Even on early firmwares that do not allow
+ * multiple VLANs, the VLAN tag is still in place here.
+ */
+ m_adj(m, 2);
mtx_unlock(&sc->sc_mtx);
(*ifp->if_input)(ifp, m);
mtx_lock(&sc->sc_mtx);
requeue:
- if (sc->sc_rxdmadesc[i].cmd_stat & GELIC_CMDSTAT_CHAIN_END)
- restart_rxdma = 1;
glc_add_rxbuf_dma(sc, i);
- if (restart_rxdma) {
- error = lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev,
- sc->sc_rxsoft[i].rxs_desc, 0);
- if (error != 0)
- device_printf(sc->sc_self,
- "lv1_net_start_rx_dma error: %d\n", error);
- }
+ }
+
+ bus_dmamap_sync(sc->sc_dmadesc_tag, sc->sc_rxdmadesc_map,
+ BUS_DMASYNC_PREWRITE);
+
+ if (restart_rxdma) {
+ error = lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev,
+ sc->sc_rxsoft[sc->sc_next_rxdma_slot].rxs_desc, 0);
+ if (error != 0)
+ device_printf(sc->sc_self,
+ "lv1_net_start_rx_dma error: %d\n", error);
}
}
@@ -770,6 +788,9 @@ glc_txintr(struct glc_softc *sc)
struct glc_txsoft *txs;
int progress = 0, kickstart = 0, error;
+ bus_dmamap_sync(sc->sc_dmadesc_tag, sc->sc_txdmadesc_map,
+ BUS_DMASYNC_POSTREAD);
+
while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
if (sc->sc_txdmadesc[txs->txs_lastdesc].cmd_stat
& GELIC_DESCR_OWNED)
@@ -805,7 +826,8 @@ glc_txintr(struct glc_softc *sc)
else
sc->first_used_txdma_slot = -1;
- if (kickstart && txs != NULL) {
+ if (kickstart || txs != NULL) {
+ /* Speculatively (or necessarily) start the TX queue again */
error = lv1_net_start_tx_dma(sc->sc_bus, sc->sc_dev,
sc->sc_txdmadesc_phys +
txs->txs_firstdesc*sizeof(struct glc_dmadesc), 0);
diff --git a/sys/powerpc/ps3/ohci_ps3.c b/sys/powerpc/ps3/ohci_ps3.c
new file mode 100644
index 0000000..e13435b
--- /dev/null
+++ b/sys/powerpc/ps3/ohci_ps3.c
@@ -0,0 +1,170 @@
+/*-
+ * Copyright (C) 2010 Nathan Whitehorn
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/stdint.h>
+#include <sys/stddef.h>
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/linker_set.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/sysctl.h>
+#include <sys/sx.h>
+#include <sys/unistd.h>
+#include <sys/callout.h>
+#include <sys/malloc.h>
+#include <sys/priv.h>
+
+#include <sys/rman.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+
+#include <dev/usb/usb_core.h>
+#include <dev/usb/usb_busdma.h>
+#include <dev/usb/usb_process.h>
+#include <dev/usb/usb_util.h>
+
+#include <dev/usb/usb_controller.h>
+#include <dev/usb/usb_bus.h>
+#include <dev/usb/controller/ohci.h>
+#include <dev/usb/controller/ohcireg.h>
+
+#include "ps3bus.h"
+
+static int
+ohci_ps3_probe(device_t dev)
+{
+ if (ps3bus_get_bustype(dev) != PS3_BUSTYPE_SYSBUS ||
+ ps3bus_get_devtype(dev) != PS3_DEVTYPE_USB)
+ return (ENXIO);
+
+ device_set_desc(dev, "Playstation 3 USB 2.0 controller");
+ return (BUS_PROBE_SPECIFIC);
+}
+
+static int
+ohci_ps3_attach(device_t dev)
+{
+ ohci_softc_t *sc = device_get_softc(dev);
+ int rid, err;
+
+ sc->sc_bus.parent = dev;
+ sc->sc_bus.devices = sc->sc_devices;
+ sc->sc_bus.devices_max = OHCI_MAX_DEVICES;
+
+ if (usb_bus_mem_alloc_all(&sc->sc_bus,
+ USB_GET_DMA_TAG(dev), &ohci_iterate_hw_softc))
+ return (ENOMEM);
+
+ rid = 0;
+ sc->sc_io_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
+ &rid, RF_ACTIVE);
+
+ if (!sc->sc_io_res) {
+ device_printf(dev, "Could not map memory\n");
+ goto error;
+ }
+
+ sc->sc_io_tag = rman_get_bustag(sc->sc_io_res);
+ sc->sc_io_hdl = rman_get_bushandle(sc->sc_io_res);
+ sc->sc_io_size = rman_get_size(sc->sc_io_res);
+
+ rid = 0;
+ sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
+ RF_SHAREABLE | RF_ACTIVE);
+
+ if (sc->sc_irq_res == NULL) {
+ device_printf(dev, "Could not allocate irq\n");
+ return (ENXIO);
+ }
+
+ sc->sc_bus.bdev = device_add_child(dev, "usbus", -1);
+ if (!sc->sc_bus.bdev) {
+ device_printf(dev, "Could not add USB device\n");
+ return (ENXIO);
+ }
+
+ device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus);
+
+ sprintf(sc->sc_vendor, "Sony");
+
+ err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
+ NULL, (driver_intr_t *)ohci_interrupt, sc, &sc->sc_intr_hdl);
+ if (err) {
+ device_printf(dev, "Could not setup error irq, %d\n", err);
+ goto error;
+ }
+
+ //sc->sc_flags |= EHCI_SCFLG_BIGEMMIO;
+ bus_space_write_4(sc->sc_io_tag, sc->sc_io_hdl,
+ OHCI_CONTROL, 0);
+ err = ohci_init(sc);
+ if (err) {
+ device_printf(dev, "USB init failed err=%d\n", err);
+ goto error;
+ }
+
+ err = device_probe_and_attach(sc->sc_bus.bdev);
+ if (err == 0)
+ return (0);
+
+error:
+ return (ENXIO);
+}
+
+static device_method_t ohci_ps3_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, ohci_ps3_probe),
+ DEVMETHOD(device_attach, ohci_ps3_attach),
+
+ /* Bus interface */
+ DEVMETHOD(bus_print_child, bus_generic_print_child),
+
+ {0, 0}
+};
+
+static driver_t ohci_ps3_driver = {
+ "ohci",
+ ohci_ps3_methods,
+ sizeof(ohci_softc_t),
+};
+
+static devclass_t ohci_ps3_devclass;
+
+DRIVER_MODULE(ohci_ps3, ps3bus, ohci_ps3_driver, ohci_ps3_devclass, 0, 0);
+MODULE_DEPEND(ohci_ps3, usb, 1, 1, 1);
+
diff --git a/sys/powerpc/ps3/ps3-hvcall.h b/sys/powerpc/ps3/ps3-hvcall.h
index 912158b..0875a62 100644
--- a/sys/powerpc/ps3/ps3-hvcall.h
+++ b/sys/powerpc/ps3/ps3-hvcall.h
@@ -11,6 +11,34 @@ enum lpar_id {
PS3_LPAR_ID_PME = 0x01,
};
+/* Return codes from hypercalls */
+#define LV1_SUCCESS 0
+#define LV1_RESOURCE_SHORTAGE -2
+#define LV1_NO_PRIVILEGE -3
+#define LV1_DENIED_BY_POLICY -4
+#define LV1_ACCESS_VIOLATION -5
+#define LV1_NO_ENTRY -6
+#define LV1_DUPLICATE_ENTRY -7
+#define LV1_TYPE_MISMATCH -8
+#define LV1_BUSY -9
+#define LV1_EMPTY -10
+#define LV1_WRONG_STATE -11
+#define LV1_NO_MATCH -13
+#define LV1_ALREADY_CONNECTED -14
+#define LV1_UNSUPPORTED_PARAMETER_VALUE -15
+#define LV1_CONDITION_NOT_SATISFIED -16
+#define LV1_ILLEGAL_PARAMETER_VALUE -17
+#define LV1_BAD_OPTION -18
+#define LV1_IMPLEMENTATION_LIMITATION -19
+#define LV1_NOT_IMPLEMENTED -20
+#define LV1_INVALID_CLASS_ID -21
+#define LV1_CONSTRAINT_NOT_SATISFIED -22
+#define LV1_ALIGNMENT_ERROR -23
+#define LV1_HARDWARE_ERROR -24
+#define LV1_INVALID_DATA_FORMAT -25
+#define LV1_INVALID_OPERATION -26
+#define LV1_INTERNAL_ERROR -32768
+
static inline uint64_t
lv1_repository_string(const char *str)
{
diff --git a/sys/powerpc/ps3/ps3-hvcall.master b/sys/powerpc/ps3/ps3-hvcall.master
index d53a32e..a9abe94 100644
--- a/sys/powerpc/ps3/ps3-hvcall.master
+++ b/sys/powerpc/ps3/ps3-hvcall.master
@@ -11,6 +11,34 @@ enum lpar_id {
PS3_LPAR_ID_PME = 0x01,
};
+/* Return codes from hypercalls */
+#define LV1_SUCCESS 0
+#define LV1_RESOURCE_SHORTAGE -2
+#define LV1_NO_PRIVILEGE -3
+#define LV1_DENIED_BY_POLICY -4
+#define LV1_ACCESS_VIOLATION -5
+#define LV1_NO_ENTRY -6
+#define LV1_DUPLICATE_ENTRY -7
+#define LV1_TYPE_MISMATCH -8
+#define LV1_BUSY -9
+#define LV1_EMPTY -10
+#define LV1_WRONG_STATE -11
+#define LV1_NO_MATCH -13
+#define LV1_ALREADY_CONNECTED -14
+#define LV1_UNSUPPORTED_PARAMETER_VALUE -15
+#define LV1_CONDITION_NOT_SATISFIED -16
+#define LV1_ILLEGAL_PARAMETER_VALUE -17
+#define LV1_BAD_OPTION -18
+#define LV1_IMPLEMENTATION_LIMITATION -19
+#define LV1_NOT_IMPLEMENTED -20
+#define LV1_INVALID_CLASS_ID -21
+#define LV1_CONSTRAINT_NOT_SATISFIED -22
+#define LV1_ALIGNMENT_ERROR -23
+#define LV1_HARDWARE_ERROR -24
+#define LV1_INVALID_DATA_FORMAT -25
+#define LV1_INVALID_OPERATION -26
+#define LV1_INTERNAL_ERROR -32768
+
static inline uint64_t
lv1_repository_string(const char *str)
{
diff --git a/sys/powerpc/ps3/ps3bus.c b/sys/powerpc/ps3/ps3bus.c
index 6a5120a..90f0e87 100644
--- a/sys/powerpc/ps3/ps3bus.c
+++ b/sys/powerpc/ps3/ps3bus.c
@@ -1,5 +1,6 @@
/*-
* Copyright (C) 2010 Nathan Whitehorn
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -73,6 +74,8 @@ struct ps3bus_devinfo {
int dev;
uint64_t bustype;
uint64_t devtype;
+ int busidx;
+ int devidx;
struct resource_list resources;
bus_dma_tag_t dma_tag;
@@ -89,6 +92,11 @@ enum ps3bus_irq_type {
EHCI_IRQ = 4,
};
+enum ps3bus_reg_type {
+ OHCI_REG = 3,
+ EHCI_REG = 4,
+};
+
static device_method_t ps3bus_methods[] = {
/* Device interface */
DEVMETHOD(device_identify, ps3bus_identify),
@@ -235,6 +243,77 @@ ps3bus_resources_init(struct rman *rm, int bus_index, int dev_index,
}
}
+static void
+ps3bus_resources_init_by_type(struct rman *rm, int bus_index, int dev_index,
+ uint64_t irq_type, uint64_t reg_type, struct ps3bus_devinfo *dinfo)
+{
+ uint64_t _irq_type, irq, outlet;
+ uint64_t _reg_type, paddr, len;
+ uint64_t ppe, junk;
+ int i, result;
+ int thread;
+
+ resource_list_init(&dinfo->resources);
+
+ lv1_get_logical_ppe_id(&ppe);
+ thread = 32 - fls(mfctrl());
+
+ /* Scan for interrupts */
+ for (i = 0; i < 10; i++) {
+ result = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("intr") | i, 0, &_irq_type, &irq);
+
+ if (result != 0)
+ break;
+
+ if (_irq_type != irq_type)
+ continue;
+
+ lv1_construct_io_irq_outlet(irq, &outlet);
+ lv1_connect_irq_plug_ext(ppe, thread, outlet, outlet,
+ 0);
+ resource_list_add(&dinfo->resources, SYS_RES_IRQ, i,
+ outlet, outlet, 1);
+ }
+
+ /* Scan for registers */
+ for (i = 0; i < 10; i++) {
+ result = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("reg") | i,
+ lv1_repository_string("type"), &_reg_type, &junk);
+
+ if (result != 0)
+ break;
+
+ if (_reg_type != reg_type)
+ continue;
+
+ result = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("reg") | i,
+ lv1_repository_string("data"), &paddr, &len);
+
+ result = lv1_map_device_mmio_region(dinfo->bus, dinfo->dev,
+ paddr, len, 12 /* log_2(4 KB) */, &paddr);
+
+ if (result != 0) {
+ printf("Mapping registers failed for device "
+ "%d.%d (%ld.%ld): %d\n", dinfo->bus, dinfo->dev,
+ dinfo->bustype, dinfo->devtype, result);
+ break;
+ }
+
+ rman_manage_region(rm, paddr, paddr + len - 1);
+ resource_list_add(&dinfo->resources, SYS_RES_MEMORY, i,
+ paddr, paddr + len, len);
+ }
+}
+
static int
ps3bus_attach(device_t self)
{
@@ -294,30 +373,93 @@ ps3bus_attach(device_t self)
if (result != 0)
continue;
- dinfo = malloc(sizeof(*dinfo), M_PS3BUS,
- M_WAITOK | M_ZERO);
-
- dinfo->bus = bus;
- dinfo->dev = dev;
- dinfo->bustype = bustype;
- dinfo->devtype = devtype;
+ switch (devtype) {
+ case PS3_DEVTYPE_USB:
+ /* USB device has OHCI and EHCI USB host controllers */
- if (dinfo->bustype == PS3_BUSTYPE_SYSBUS)
lv1_open_device(bus, dev, 0);
- ps3bus_resources_init(&sc->sc_mem_rman, bus_index,
- dev_index, dinfo);
-
- cdev = device_add_child(self, NULL, -1);
- if (cdev == NULL) {
- device_printf(self,
- "device_add_child failed\n");
- free(dinfo, M_PS3BUS);
- continue;
+ /* OHCI host controller */
+
+ dinfo = malloc(sizeof(*dinfo), M_PS3BUS,
+ M_WAITOK | M_ZERO);
+
+ dinfo->bus = bus;
+ dinfo->dev = dev;
+ dinfo->bustype = bustype;
+ dinfo->devtype = devtype;
+ dinfo->busidx = bus_index;
+ dinfo->devidx = dev_index;
+
+ ps3bus_resources_init_by_type(&sc->sc_mem_rman, bus_index,
+ dev_index, OHCI_IRQ, OHCI_REG, dinfo);
+
+ cdev = device_add_child(self, "ohci", -1);
+ if (cdev == NULL) {
+ device_printf(self,
+ "device_add_child failed\n");
+ free(dinfo, M_PS3BUS);
+ continue;
+ }
+
+ mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF);
+ device_set_ivars(cdev, dinfo);
+
+ /* EHCI host controller */
+
+ dinfo = malloc(sizeof(*dinfo), M_PS3BUS,
+ M_WAITOK | M_ZERO);
+
+ dinfo->bus = bus;
+ dinfo->dev = dev;
+ dinfo->bustype = bustype;
+ dinfo->devtype = devtype;
+ dinfo->busidx = bus_index;
+ dinfo->devidx = dev_index;
+
+ ps3bus_resources_init_by_type(&sc->sc_mem_rman, bus_index,
+ dev_index, EHCI_IRQ, EHCI_REG, dinfo);
+
+ cdev = device_add_child(self, "ehci", -1);
+ if (cdev == NULL) {
+ device_printf(self,
+ "device_add_child failed\n");
+ free(dinfo, M_PS3BUS);
+ continue;
+ }
+
+ mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF);
+ device_set_ivars(cdev, dinfo);
+ break;
+ default:
+ dinfo = malloc(sizeof(*dinfo), M_PS3BUS,
+ M_WAITOK | M_ZERO);
+
+ dinfo->bus = bus;
+ dinfo->dev = dev;
+ dinfo->bustype = bustype;
+ dinfo->devtype = devtype;
+ dinfo->busidx = bus_index;
+ dinfo->devidx = dev_index;
+
+ if (dinfo->bustype == PS3_BUSTYPE_SYSBUS ||
+ dinfo->bustype == PS3_BUSTYPE_STORAGE)
+ lv1_open_device(bus, dev, 0);
+
+ ps3bus_resources_init(&sc->sc_mem_rman, bus_index,
+ dev_index, dinfo);
+
+ cdev = device_add_child(self, NULL, -1);
+ if (cdev == NULL) {
+ device_printf(self,
+ "device_add_child failed\n");
+ free(dinfo, M_PS3BUS);
+ continue;
+ }
+
+ mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF);
+ device_set_ivars(cdev, dinfo);
}
-
- mtx_init(&dinfo->iommu_mtx, "iommu", NULL, MTX_DEF);
- device_set_ivars(cdev, dinfo);
}
}
@@ -361,6 +503,12 @@ ps3bus_read_ivar(device_t bus, device_t child, int which, uintptr_t *result)
case PS3BUS_IVAR_DEVTYPE:
*result = dinfo->devtype;
break;
+ case PS3BUS_IVAR_BUSIDX:
+ *result = dinfo->busidx;
+ break;
+ case PS3BUS_IVAR_DEVIDX:
+ *result = dinfo->devidx;
+ break;
default:
return (EINVAL);
}
@@ -481,9 +629,10 @@ ps3bus_get_dma_tag(device_t dev, device_t child)
{
struct ps3bus_devinfo *dinfo = device_get_ivars(child);
struct ps3bus_softc *sc = device_get_softc(dev);
- int i, err, flags;
+ int i, err, flags, pagesize;
- if (dinfo->bustype != PS3_BUSTYPE_SYSBUS)
+ if (dinfo->bustype != PS3_BUSTYPE_SYSBUS &&
+ dinfo->bustype != PS3_BUSTYPE_STORAGE)
return (bus_get_dma_tag(dev));
mtx_lock(&dinfo->iommu_mtx);
@@ -497,9 +646,13 @@ ps3bus_get_dma_tag(device_t dev, device_t child)
dinfo->devtype == PS3_DEVTYPE_USB)
flags = 2; /* 8-bit mode */
+ pagesize = 24; /* log_2(16 MB) */
+ if (dinfo->bustype == PS3_BUSTYPE_STORAGE)
+ pagesize = 12; /* 4 KB */
+
for (i = 0; i < sc->rcount; i++) {
err = lv1_allocate_device_dma_region(dinfo->bus, dinfo->dev,
- sc->regions[i].mr_size, 24 /* log_2(16 MB) */, flags,
+ sc->regions[i].mr_size, pagesize, flags,
&dinfo->dma_base[i]);
if (err != 0) {
device_printf(child,
@@ -523,7 +676,15 @@ ps3bus_get_dma_tag(device_t dev, device_t child)
NULL, NULL, BUS_SPACE_MAXSIZE, 0, BUS_SPACE_MAXSIZE,
0, NULL, NULL, &dinfo->dma_tag);
- bus_dma_tag_set_iommu(dinfo->dma_tag, dev, dinfo);
+ /*
+ * Note: storage devices have IOMMU mappings set up by the hypervisor,
+ * but use physical, non-translated addresses. The above IOMMU
+ * initialization is necessary for the hypervisor to be able to set up
+ * the mappings, but actual DMA mappings should not use the IOMMU
+ * routines.
+ */
+ if (dinfo->bustype != PS3_BUSTYPE_STORAGE)
+ bus_dma_tag_set_iommu(dinfo->dma_tag, dev, dinfo);
fail:
mtx_unlock(&dinfo->iommu_mtx);
diff --git a/sys/powerpc/ps3/ps3bus.h b/sys/powerpc/ps3/ps3bus.h
index b11ff8a..6725625 100644
--- a/sys/powerpc/ps3/ps3bus.h
+++ b/sys/powerpc/ps3/ps3bus.h
@@ -32,7 +32,9 @@ enum {
PS3BUS_IVAR_BUS,
PS3BUS_IVAR_DEVICE,
PS3BUS_IVAR_BUSTYPE,
- PS3BUS_IVAR_DEVTYPE
+ PS3BUS_IVAR_DEVTYPE,
+ PS3BUS_IVAR_BUSIDX,
+ PS3BUS_IVAR_DEVIDX,
};
#define PS3BUS_ACCESSOR(A, B, T) \
@@ -42,6 +44,8 @@ PS3BUS_ACCESSOR(bus, BUS, int)
PS3BUS_ACCESSOR(device, DEVICE, int)
PS3BUS_ACCESSOR(bustype, BUSTYPE, uint64_t)
PS3BUS_ACCESSOR(devtype, DEVTYPE, uint64_t)
+PS3BUS_ACCESSOR(busidx, BUSIDX, int)
+PS3BUS_ACCESSOR(devidx, DEVIDX, int)
/* Bus types */
enum {
diff --git a/sys/powerpc/ps3/ps3disk.c b/sys/powerpc/ps3/ps3disk.c
new file mode 100644
index 0000000..3bab0f2
--- /dev/null
+++ b/sys/powerpc/ps3/ps3disk.c
@@ -0,0 +1,702 @@
+/*-
+ * Copyright (C) 2011 glevand (geoffrey.levand@mail.ru)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysctl.h>
+#include <sys/disk.h>
+#include <sys/bio.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/kthread.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/pio.h>
+#include <machine/bus.h>
+#include <machine/platform.h>
+#include <machine/pmap.h>
+#include <machine/resource.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <geom/geom_disk.h>
+
+#include "ps3bus.h"
+#include "ps3-hvcall.h"
+
+#define PS3DISK_LOCK_INIT(_sc) \
+ mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), "ps3disk", MTX_DEF)
+#define PS3DISK_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx);
+#define PS3DISK_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
+#define PS3DISK_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
+#define PS3DISK_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED);
+#define PS3DISK_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED);
+
+#define LV1_STORAGE_ATA_HDDOUT 0x23
+
+SYSCTL_NODE(_hw, OID_AUTO, ps3disk, CTLFLAG_RD, 0, "PS3 Disk driver parameters");
+
+#ifdef PS3DISK_DEBUG
+static int ps3disk_debug = 0;
+SYSCTL_INT(_hw_ps3disk, OID_AUTO, debug, CTLFLAG_RW, &ps3disk_debug,
+ 0, "control debugging printfs");
+TUNABLE_INT("hw.ps3disk.debug", &ps3disk_debug);
+enum {
+ PS3DISK_DEBUG_INTR = 0x00000001,
+ PS3DISK_DEBUG_TASK = 0x00000002,
+ PS3DISK_DEBUG_READ = 0x00000004,
+ PS3DISK_DEBUG_WRITE = 0x00000008,
+ PS3DISK_DEBUG_FLUSH = 0x00000010,
+ PS3DISK_DEBUG_ANY = 0xffffffff
+};
+#define DPRINTF(sc, m, fmt, ...) \
+do { \
+ if (sc->sc_debug & (m)) \
+ printf(fmt, __VA_ARGS__); \
+} while (0)
+#else
+#define DPRINTF(sc, m, fmt, ...)
+#endif
+
+struct ps3disk_region {
+ uint64_t r_id;
+ uint64_t r_start;
+ uint64_t r_size;
+ uint64_t r_flags;
+};
+
+struct ps3disk_softc {
+ device_t sc_dev;
+
+ struct mtx sc_mtx;
+
+ uint64_t sc_blksize;
+ uint64_t sc_nblocks;
+
+ uint64_t sc_nregs;
+ struct ps3disk_region *sc_reg;
+
+ int sc_irqid;
+ struct resource *sc_irq;
+ void *sc_irqctx;
+
+ struct disk **sc_disk;
+
+ struct bio_queue_head sc_bioq;
+ struct bio_queue_head sc_deferredq;
+ struct proc *sc_task;
+
+ bus_dma_tag_t sc_dmatag;
+
+ int sc_running;
+ int sc_debug;
+};
+
+static int ps3disk_open(struct disk *dp);
+static int ps3disk_close(struct disk *dp);
+static void ps3disk_strategy(struct bio *bp);
+
+static void ps3disk_task(void *arg);
+static void ps3disk_intr(void *arg);
+static int ps3disk_get_disk_geometry(struct ps3disk_softc *sc);
+static int ps3disk_enum_regions(struct ps3disk_softc *sc);
+static void ps3disk_transfer(void *arg, bus_dma_segment_t *segs, int nsegs,
+ int error);
+
+static void ps3disk_sysctlattach(struct ps3disk_softc *sc);
+
+static MALLOC_DEFINE(M_PS3DISK, "ps3disk", "PS3 Disk");
+
+static int
+ps3disk_probe(device_t dev)
+{
+ if (ps3bus_get_bustype(dev) != PS3_BUSTYPE_STORAGE ||
+ ps3bus_get_devtype(dev) != PS3_DEVTYPE_DISK)
+ return (ENXIO);
+
+ device_set_desc(dev, "Playstation 3 Disk");
+
+ return (BUS_PROBE_SPECIFIC);
+}
+
+static int
+ps3disk_attach(device_t dev)
+{
+ struct ps3disk_softc *sc;
+ struct disk *d;
+ intmax_t mb;
+ uint64_t junk;
+ char unit;
+ int i, err;
+
+ sc = device_get_softc(dev);
+ sc->sc_dev = dev;
+
+ PS3DISK_LOCK_INIT(sc);
+
+ err = ps3disk_get_disk_geometry(sc);
+ if (err) {
+ device_printf(dev, "Could not get disk geometry\n");
+ err = ENXIO;
+ goto fail_destroy_lock;
+ }
+
+ device_printf(dev, "block size %lu total blocks %lu\n",
+ sc->sc_blksize, sc->sc_nblocks);
+
+ err = ps3disk_enum_regions(sc);
+ if (err) {
+ device_printf(dev, "Could not enumerate disk regions\n");
+ err = ENXIO;
+ goto fail_destroy_lock;
+ }
+
+ device_printf(dev, "Found %lu regions\n", sc->sc_nregs);
+
+ if (!sc->sc_nregs) {
+ err = ENXIO;
+ goto fail_destroy_lock;
+ }
+
+ /* Setup interrupt handler */
+ sc->sc_irqid = 0;
+ sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irqid,
+ RF_ACTIVE);
+ if (!sc->sc_irq) {
+ device_printf(dev, "Could not allocate IRQ\n");
+ err = ENXIO;
+ goto fail_free_regions;
+ }
+
+ err = bus_setup_intr(dev, sc->sc_irq,
+ INTR_TYPE_BIO | INTR_MPSAFE | INTR_ENTROPY,
+ NULL, ps3disk_intr, sc, &sc->sc_irqctx);
+ if (err) {
+ device_printf(dev, "Could not setup IRQ\n");
+ err = ENXIO;
+ goto fail_release_intr;
+ }
+
+ /* Setup DMA */
+ err = bus_dma_tag_create(bus_get_dma_tag(dev), 4096, 0,
+ BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
+ BUS_SPACE_UNRESTRICTED, 1, PAGE_SIZE, 0,
+ busdma_lock_mutex, &sc->sc_mtx, &sc->sc_dmatag);
+ if (err) {
+ device_printf(dev, "Could not create DMA tag\n");
+ err = ENXIO;
+ goto fail_teardown_intr;
+ }
+
+ /* Setup disks */
+
+ sc->sc_disk = malloc(sc->sc_nregs * sizeof(struct disk *),
+ M_PS3DISK, M_ZERO | M_WAITOK);
+ if (!sc->sc_disk) {
+ device_printf(dev, "Could not allocate disk(s)\n");
+ err = ENOMEM;
+ goto fail_teardown_intr;
+ }
+
+ for (i = 0; i < sc->sc_nregs; i++) {
+ struct ps3disk_region *rp = &sc->sc_reg[i];
+
+ d = sc->sc_disk[i] = disk_alloc();
+ d->d_open = ps3disk_open;
+ d->d_close = ps3disk_close;
+ d->d_strategy = ps3disk_strategy;
+ d->d_name = "ps3disk";
+ d->d_drv1 = sc;
+ d->d_maxsize = PAGE_SIZE;
+ d->d_sectorsize = sc->sc_blksize;
+ d->d_unit = i;
+ d->d_mediasize = sc->sc_reg[i].r_size * sc->sc_blksize;
+ d->d_flags |= DISKFLAG_CANFLUSHCACHE;
+
+ mb = d->d_mediasize >> 20;
+ unit = 'M';
+ if (mb >= 10240) {
+ unit = 'G';
+ mb /= 1024;
+ }
+
+ /* Test to see if we can read this region */
+ err = lv1_storage_read(ps3bus_get_device(dev), d->d_unit,
+ 0, 0, rp->r_flags, 0, &junk);
+ device_printf(dev, "region %d %ju%cB%s\n", i, mb, unit,
+ (err == LV1_DENIED_BY_POLICY) ? " (hypervisor protected)"
+ : "");
+
+ if (err != LV1_DENIED_BY_POLICY)
+ disk_create(d, DISK_VERSION);
+ }
+ err = 0;
+
+ bioq_init(&sc->sc_bioq);
+ bioq_init(&sc->sc_deferredq);
+ kproc_create(&ps3disk_task, sc, &sc->sc_task, 0, 0, "ps3disk");
+
+ ps3disk_sysctlattach(sc);
+ sc->sc_running = 1;
+ return (0);
+
+fail_teardown_intr:
+ bus_teardown_intr(dev, sc->sc_irq, sc->sc_irqctx);
+fail_release_intr:
+ bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irqid, sc->sc_irq);
+fail_free_regions:
+ free(sc->sc_reg, M_PS3DISK);
+fail_destroy_lock:
+ PS3DISK_LOCK_DESTROY(sc);
+ return (err);
+}
+
+static int
+ps3disk_detach(device_t dev)
+{
+ struct ps3disk_softc *sc = device_get_softc(dev);
+ int i;
+
+ for (i = 0; i < sc->sc_nregs; i++)
+ disk_destroy(sc->sc_disk[i]);
+
+ bus_dma_tag_destroy(sc->sc_dmatag);
+
+ bus_teardown_intr(dev, sc->sc_irq, sc->sc_irqctx);
+ bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irqid, sc->sc_irq);
+
+ free(sc->sc_disk, M_PS3DISK);
+ free(sc->sc_reg, M_PS3DISK);
+
+ PS3DISK_LOCK_DESTROY(sc);
+
+ return (0);
+}
+
+static int
+ps3disk_open(struct disk *dp)
+{
+ return (0);
+}
+
+static int
+ps3disk_close(struct disk *dp)
+{
+ return (0);
+}
+
+/* Process deferred blocks */
+static void
+ps3disk_task(void *arg)
+{
+ struct ps3disk_softc *sc = (struct ps3disk_softc *) arg;
+ struct bio *bp;
+
+
+ while (1) {
+ kproc_suspend_check(sc->sc_task);
+ tsleep(&sc->sc_deferredq, PRIBIO, "ps3disk", 10);
+
+ PS3DISK_LOCK(sc);
+ bp = bioq_takefirst(&sc->sc_deferredq);
+ PS3DISK_UNLOCK(sc);
+
+ if (bp == NULL)
+ continue;
+
+ if (bp->bio_driver1 != NULL) {
+ bus_dmamap_unload(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1);
+ bus_dmamap_destroy(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1);
+ }
+
+ ps3disk_strategy(bp);
+ }
+
+ kproc_exit(0);
+}
+
+static void
+ps3disk_strategy(struct bio *bp)
+{
+ struct ps3disk_softc *sc = (struct ps3disk_softc *)bp->bio_disk->d_drv1;
+ int err;
+
+ if (sc == NULL) {
+ bp->bio_flags |= BIO_ERROR;
+ bp->bio_error = EINVAL;
+ biodone(bp);
+ return;
+ }
+
+ PS3DISK_LOCK(sc);
+ bp->bio_resid = bp->bio_bcount;
+ bioq_insert_tail(&sc->sc_bioq, bp);
+
+ DPRINTF(sc, PS3DISK_DEBUG_TASK, "%s: bio_cmd 0x%02x\n",
+ __func__, bp->bio_cmd);
+
+ err = 0;
+ if (bp->bio_cmd == BIO_FLUSH) {
+ bp->bio_driver1 = 0;
+ err = lv1_storage_send_device_command(
+ ps3bus_get_device(sc->sc_dev), LV1_STORAGE_ATA_HDDOUT,
+ 0, 0, 0, 0, (uint64_t *)&bp->bio_driver2);
+ if (err == LV1_BUSY)
+ err = EAGAIN;
+ } else if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) {
+ if (bp->bio_bcount % sc->sc_blksize != 0) {
+ err = EINVAL;
+ } else {
+ bus_dmamap_create(sc->sc_dmatag, BUS_DMA_COHERENT,
+ (bus_dmamap_t *)(&bp->bio_driver1));
+ err = bus_dmamap_load(sc->sc_dmatag,
+ (bus_dmamap_t)(bp->bio_driver1), bp->bio_data,
+ bp->bio_bcount, ps3disk_transfer, bp, 0);
+ if (err == EINPROGRESS)
+ err = 0;
+ }
+ } else {
+ err = EINVAL;
+ }
+
+ if (err == EAGAIN) {
+ bioq_remove(&sc->sc_bioq, bp);
+ bioq_insert_tail(&sc->sc_deferredq, bp);
+ } else if (err != 0) {
+ bp->bio_error = err;
+ bp->bio_flags |= BIO_ERROR;
+ bioq_remove(&sc->sc_bioq, bp);
+ disk_err(bp, "hard error", -1, 1);
+ biodone(bp);
+ }
+
+ PS3DISK_UNLOCK(sc);
+}
+
+static void
+ps3disk_intr(void *arg)
+{
+ struct ps3disk_softc *sc = (struct ps3disk_softc *) arg;
+ device_t dev = sc->sc_dev;
+ uint64_t devid = ps3bus_get_device(dev);
+ struct bio *bp;
+ uint64_t tag, status;
+
+ if (lv1_storage_get_async_status(devid, &tag, &status) != 0)
+ return;
+
+ PS3DISK_LOCK(sc);
+
+ DPRINTF(sc, PS3DISK_DEBUG_INTR, "%s: tag 0x%016lx "
+ "status 0x%016lx\n", __func__, tag, status);
+
+ /* Locate the matching request */
+ TAILQ_FOREACH(bp, &sc->sc_bioq.queue, bio_queue) {
+ if ((uint64_t)bp->bio_driver2 != tag)
+ continue;
+
+ if (status != 0) {
+ device_printf(sc->sc_dev, "%s error (%#lx)\n",
+ (bp->bio_cmd == BIO_READ) ? "Read" : "Write",
+ status);
+ bp->bio_error = EIO;
+ bp->bio_flags |= BIO_ERROR;
+ } else {
+ bp->bio_error = 0;
+ bp->bio_resid = 0;
+ bp->bio_flags |= BIO_DONE;
+ }
+
+ if (bp->bio_driver1 != NULL) {
+ if (bp->bio_cmd == BIO_READ)
+ bus_dmamap_sync(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1, BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1);
+ bus_dmamap_destroy(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1);
+ }
+
+ bioq_remove(&sc->sc_bioq, bp);
+ biodone(bp);
+ break;
+ }
+
+ if (bioq_first(&sc->sc_deferredq) != NULL)
+ wakeup(&sc->sc_deferredq);
+
+ PS3DISK_UNLOCK(sc);
+}
+
+static int
+ps3disk_get_disk_geometry(struct ps3disk_softc *sc)
+{
+ device_t dev = sc->sc_dev;
+ uint64_t bus_index = ps3bus_get_busidx(dev);
+ uint64_t dev_index = ps3bus_get_devidx(dev);
+ uint64_t junk;
+ int err;
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("blk_size"), 0, &sc->sc_blksize, &junk);
+ if (err) {
+ device_printf(dev, "Could not get block size (0x%08x)\n", err);
+ return (ENXIO);
+ }
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("n_blocks"), 0, &sc->sc_nblocks, &junk);
+ if (err) {
+ device_printf(dev, "Could not get total number of blocks "
+ "(0x%08x)\n", err);
+ err = ENXIO;
+ }
+
+ return (err);
+}
+
+static int
+ps3disk_enum_regions(struct ps3disk_softc *sc)
+{
+ device_t dev = sc->sc_dev;
+ uint64_t bus_index = ps3bus_get_busidx(dev);
+ uint64_t dev_index = ps3bus_get_devidx(dev);
+ uint64_t junk;
+ int i, err;
+
+ /* Read number of regions */
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("n_regs"), 0, &sc->sc_nregs, &junk);
+ if (err) {
+ device_printf(dev, "Could not get number of regions (0x%08x)\n",
+ err);
+ err = ENXIO;
+ goto fail;
+ }
+
+ if (!sc->sc_nregs)
+ return 0;
+
+ sc->sc_reg = malloc(sc->sc_nregs * sizeof(struct ps3disk_region),
+ M_PS3DISK, M_ZERO | M_WAITOK);
+ if (!sc->sc_reg) {
+ err = ENOMEM;
+ goto fail;
+ }
+
+ /* Setup regions */
+
+ for (i = 0; i < sc->sc_nregs; i++) {
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("region") | i,
+ lv1_repository_string("id"), &sc->sc_reg[i].r_id, &junk);
+ if (err) {
+ device_printf(dev, "Could not get region id (0x%08x)\n",
+ err);
+ err = ENXIO;
+ goto fail;
+ }
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("region") | i,
+ lv1_repository_string("start"), &sc->sc_reg[i].r_start,
+ &junk);
+ if (err) {
+ device_printf(dev, "Could not get region start "
+ "(0x%08x)\n", err);
+ err = ENXIO;
+ goto fail;
+ }
+
+ err = lv1_get_repository_node_value(PS3_LPAR_ID_PME,
+ (lv1_repository_string("bus") >> 32) | bus_index,
+ lv1_repository_string("dev") | dev_index,
+ lv1_repository_string("region") | i,
+ lv1_repository_string("size"), &sc->sc_reg[i].r_size,
+ &junk);
+ if (err) {
+ device_printf(dev, "Could not get region size "
+ "(0x%08x)\n", err);
+ err = ENXIO;
+ goto fail;
+ }
+
+ if (i == 0)
+ sc->sc_reg[i].r_flags = 0x2;
+ else
+ sc->sc_reg[i].r_flags = 0;
+ }
+
+ return (0);
+
+fail:
+
+ sc->sc_nregs = 0;
+ if (sc->sc_reg)
+ free(sc->sc_reg, M_PS3DISK);
+
+ return (err);
+}
+
+static void
+ps3disk_transfer(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
+{
+ struct bio *bp = (struct bio *)(arg);
+ struct ps3disk_softc *sc = (struct ps3disk_softc *)bp->bio_disk->d_drv1;
+ struct ps3disk_region *rp = &sc->sc_reg[bp->bio_disk->d_unit];
+ uint64_t devid = ps3bus_get_device(sc->sc_dev);
+ uint64_t block;
+ int i, err;
+
+ /* Locks already held by busdma */
+ PS3DISK_ASSERT_LOCKED(sc);
+
+ if (error) {
+ bp->bio_error = error;
+ bp->bio_flags |= BIO_ERROR;
+ bioq_remove(&sc->sc_bioq, bp);
+ biodone(bp);
+ return;
+ }
+
+ block = bp->bio_pblkno;
+ for (i = 0; i < nsegs; i++) {
+ KASSERT((segs[i].ds_len % sc->sc_blksize) == 0,
+ ("DMA fragments not blocksize multiples"));
+
+ if (bp->bio_cmd == BIO_READ) {
+ err = lv1_storage_read(devid, rp->r_id,
+ block, segs[i].ds_len/sc->sc_blksize,
+ rp->r_flags, segs[i].ds_addr,
+ (uint64_t *)&bp->bio_driver2);
+ } else {
+ bus_dmamap_sync(sc->sc_dmatag,
+ (bus_dmamap_t)bp->bio_driver1,
+ BUS_DMASYNC_PREWRITE);
+ err = lv1_storage_write(devid, rp->r_id,
+ block, segs[i].ds_len/sc->sc_blksize,
+ rp->r_flags, segs[i].ds_addr,
+ (uint64_t *)&bp->bio_driver2);
+ }
+
+ if (err) {
+ if (err == LV1_BUSY) {
+ bioq_remove(&sc->sc_bioq, bp);
+ bioq_insert_tail(&sc->sc_deferredq, bp);
+ } else {
+ bus_dmamap_unload(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1);
+ bus_dmamap_destroy(sc->sc_dmatag, (bus_dmamap_t)
+ bp->bio_driver1);
+ device_printf(sc->sc_dev, "Could not read "
+ "sectors (0x%08x)\n", err);
+ bp->bio_error = EINVAL;
+ bp->bio_flags |= BIO_ERROR;
+ bioq_remove(&sc->sc_bioq, bp);
+ biodone(bp);
+ }
+
+ break;
+ }
+
+ DPRINTF(sc, PS3DISK_DEBUG_READ, "%s: tag 0x%016lx\n",
+ __func__, sc->sc_bounce_tag);
+ }
+}
+
+#ifdef PS3DISK_DEBUG
+static int
+ps3disk_sysctl_debug(SYSCTL_HANDLER_ARGS)
+{
+ struct ps3disk_softc *sc = arg1;
+ int debug, error;
+
+ debug = sc->sc_debug;
+
+ error = sysctl_handle_int(oidp, &debug, 0, req);
+ if (error || !req->newptr)
+ return error;
+
+ sc->sc_debug = debug;
+
+ return 0;
+}
+#endif
+
+static void
+ps3disk_sysctlattach(struct ps3disk_softc *sc)
+{
+#ifdef PS3DISK_DEBUG
+ struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
+ struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
+
+ sc->sc_debug = ps3disk_debug;
+
+ SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+ "debug", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
+ ps3disk_sysctl_debug, "I", "control debugging printfs");
+#endif
+}
+
+static device_method_t ps3disk_methods[] = {
+ DEVMETHOD(device_probe, ps3disk_probe),
+ DEVMETHOD(device_attach, ps3disk_attach),
+ DEVMETHOD(device_detach, ps3disk_detach),
+ {0, 0},
+};
+
+static driver_t ps3disk_driver = {
+ "ps3disk",
+ ps3disk_methods,
+ sizeof(struct ps3disk_softc),
+};
+
+static devclass_t ps3disk_devclass;
+
+DRIVER_MODULE(ps3disk, ps3bus, ps3disk_driver, ps3disk_devclass, 0, 0);
diff --git a/sys/powerpc/ps3/ps3pic.c b/sys/powerpc/ps3/ps3pic.c
index c00585b..3a62e3c 100644
--- a/sys/powerpc/ps3/ps3pic.c
+++ b/sys/powerpc/ps3/ps3pic.c
@@ -56,10 +56,10 @@ static void ps3pic_mask(device_t, u_int);
static void ps3pic_unmask(device_t, u_int);
struct ps3pic_softc {
- uint64_t *bitmap_thread0;
- uint64_t *mask_thread0;
- uint64_t *bitmap_thread1;
- uint64_t *mask_thread1;
+ volatile uint64_t *bitmap_thread0;
+ volatile uint64_t *mask_thread0;
+ volatile uint64_t *bitmap_thread1;
+ volatile uint64_t *mask_thread1;
uint64_t sc_ipi_outlet[2];
int sc_vector[64];
@@ -219,8 +219,8 @@ ps3pic_mask(device_t dev, u_int irq)
if (irq == sc->sc_ipi_outlet[0])
return;
- sc->mask_thread0[0] &= ~(1UL << (63 - irq));
- sc->mask_thread1[0] &= ~(1UL << (63 - irq));
+ atomic_clear_64(&sc->mask_thread0[0], 1UL << (63 - irq));
+ atomic_clear_64(&sc->mask_thread1[0], 1UL << (63 - irq));
lv1_get_logical_ppe_id(&ppe);
lv1_did_update_interrupt_mask(ppe, 0);
@@ -234,8 +234,8 @@ ps3pic_unmask(device_t dev, u_int irq)
uint64_t ppe;
sc = device_get_softc(dev);
- sc->mask_thread0[0] |= (1UL << (63 - irq));
- sc->mask_thread1[0] |= (1UL << (63 - irq));
+ atomic_set_64(&sc->mask_thread0[0], 1UL << (63 - irq));
+ atomic_set_64(&sc->mask_thread1[0], 1UL << (63 - irq));
lv1_get_logical_ppe_id(&ppe);
lv1_did_update_interrupt_mask(ppe, 0);
diff --git a/sys/rpc/rpc_generic.c b/sys/rpc/rpc_generic.c
index fd39350..6adae38 100644
--- a/sys/rpc/rpc_generic.c
+++ b/sys/rpc/rpc_generic.c
@@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
#include <rpc/rpc.h>
#include <rpc/nettype.h>
+#include <rpc/rpcsec_gss.h>
#include <rpc/rpc_com.h>
@@ -69,6 +70,9 @@ extern u_long sb_max_adj; /* not defined in socketvar.h */
#define strrchr rindex
#endif
+/* Provide an entry point hook for the rpcsec_gss module. */
+struct rpc_gss_entries rpc_gss_entries;
+
struct handle {
NCONF_HANDLE *nhandle;
int nflag; /* Whether NETPATH or NETCONFIG */
diff --git a/sys/rpc/rpcsec_gss.h b/sys/rpc/rpcsec_gss.h
index 563205c..94696f3 100644
--- a/sys/rpc/rpcsec_gss.h
+++ b/sys/rpc/rpcsec_gss.h
@@ -141,6 +141,271 @@ typedef struct {
__BEGIN_DECLS
#ifdef _KERNEL
+/*
+ * Set up a structure of entry points for the kgssapi module and inline
+ * functions named rpc_gss_XXX_call() to use them, so that the kgssapi
+ * module doesn't need to be loaded for the NFS modules to work using
+ * AUTH_SYS. The kgssapi modules will be loaded by the gssd(8) daemon
+ * when it is started up and the entry points will then be filled in.
+ */
+typedef AUTH *rpc_gss_secfind_ftype(CLIENT *clnt, struct ucred *cred,
+ const char *principal, gss_OID mech_oid,
+ rpc_gss_service_t service);
+typedef void rpc_gss_secpurge_ftype(CLIENT *clnt);
+typedef AUTH *rpc_gss_seccreate_ftype(CLIENT *clnt, struct ucred *cred,
+ const char *principal, const char *mechanism,
+ rpc_gss_service_t service, const char *qop,
+ rpc_gss_options_req_t *options_req,
+ rpc_gss_options_ret_t *options_ret);
+typedef bool_t rpc_gss_set_defaults_ftype(AUTH *auth,
+ rpc_gss_service_t service, const char *qop);
+typedef int rpc_gss_max_data_length_ftype(AUTH *handle,
+ int max_tp_unit_len);
+typedef void rpc_gss_get_error_ftype(rpc_gss_error_t *error);
+typedef bool_t rpc_gss_mech_to_oid_ftype(const char *mech, gss_OID *oid_ret);
+typedef bool_t rpc_gss_oid_to_mech_ftype(gss_OID oid, const char **mech_ret);
+typedef bool_t rpc_gss_qop_to_num_ftype(const char *qop, const char *mech,
+ u_int *num_ret);
+typedef const char **rpc_gss_get_mechanisms_ftype(void);
+typedef bool_t rpc_gss_get_versions_ftype(u_int *vers_hi, u_int *vers_lo);
+typedef bool_t rpc_gss_is_installed_ftype(const char *mech);
+typedef bool_t rpc_gss_set_svc_name_ftype(const char *principal,
+ const char *mechanism, u_int req_time, u_int program,
+ u_int version);
+typedef void rpc_gss_clear_svc_name_ftype(u_int program, u_int version);
+typedef bool_t rpc_gss_getcred_ftype(struct svc_req *req,
+ rpc_gss_rawcred_t **rcred,
+ rpc_gss_ucred_t **ucred, void **cookie);
+typedef bool_t rpc_gss_set_callback_ftype(rpc_gss_callback_t *cb);
+typedef void rpc_gss_clear_callback_ftype(rpc_gss_callback_t *cb);
+typedef bool_t rpc_gss_get_principal_name_ftype(rpc_gss_principal_t *principal,
+ const char *mech, const char *name, const char *node,
+ const char *domain);
+typedef int rpc_gss_svc_max_data_length_ftype(struct svc_req *req,
+ int max_tp_unit_len);
+
+struct rpc_gss_entries {
+ rpc_gss_secfind_ftype *rpc_gss_secfind;
+ rpc_gss_secpurge_ftype *rpc_gss_secpurge;
+ rpc_gss_seccreate_ftype *rpc_gss_seccreate;
+ rpc_gss_set_defaults_ftype *rpc_gss_set_defaults;
+ rpc_gss_max_data_length_ftype *rpc_gss_max_data_length;
+ rpc_gss_get_error_ftype *rpc_gss_get_error;
+ rpc_gss_mech_to_oid_ftype *rpc_gss_mech_to_oid;
+ rpc_gss_oid_to_mech_ftype *rpc_gss_oid_to_mech;
+ rpc_gss_qop_to_num_ftype *rpc_gss_qop_to_num;
+ rpc_gss_get_mechanisms_ftype *rpc_gss_get_mechanisms;
+ rpc_gss_get_versions_ftype *rpc_gss_get_versions;
+ rpc_gss_is_installed_ftype *rpc_gss_is_installed;
+ rpc_gss_set_svc_name_ftype *rpc_gss_set_svc_name;
+ rpc_gss_clear_svc_name_ftype *rpc_gss_clear_svc_name;
+ rpc_gss_getcred_ftype *rpc_gss_getcred;
+ rpc_gss_set_callback_ftype *rpc_gss_set_callback;
+ rpc_gss_clear_callback_ftype *rpc_gss_clear_callback;
+ rpc_gss_get_principal_name_ftype *rpc_gss_get_principal_name;
+ rpc_gss_svc_max_data_length_ftype *rpc_gss_svc_max_data_length;
+};
+extern struct rpc_gss_entries rpc_gss_entries;
+
+/* Functions to access the entry points. */
+static __inline AUTH *
+rpc_gss_secfind_call(CLIENT *clnt, struct ucred *cred, const char *principal,
+ gss_OID mech_oid, rpc_gss_service_t service)
+{
+ AUTH *ret = NULL;
+
+ if (rpc_gss_entries.rpc_gss_secfind != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_secfind)(clnt, cred, principal,
+ mech_oid, service);
+ return (ret);
+}
+
+static __inline void
+rpc_gss_secpurge_call(CLIENT *clnt)
+{
+
+ if (rpc_gss_entries.rpc_gss_secpurge != NULL)
+ (*rpc_gss_entries.rpc_gss_secpurge)(clnt);
+}
+
+static __inline AUTH *
+rpc_gss_seccreate_call(CLIENT *clnt, struct ucred *cred, const char *principal,
+ const char *mechanism, rpc_gss_service_t service, const char *qop,
+ rpc_gss_options_req_t *options_req, rpc_gss_options_ret_t *options_ret)
+{
+ AUTH *ret = NULL;
+
+ if (rpc_gss_entries.rpc_gss_seccreate != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_seccreate)(clnt, cred,
+ principal, mechanism, service, qop, options_req,
+ options_ret);
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_set_defaults_call(AUTH *auth, rpc_gss_service_t service,
+ const char *qop)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_set_defaults != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_set_defaults)(auth, service,
+ qop);
+ return (ret);
+}
+
+static __inline int
+rpc_gss_max_data_length_call(AUTH *handle, int max_tp_unit_len)
+{
+ int ret = 0;
+
+ if (rpc_gss_entries.rpc_gss_max_data_length != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_max_data_length)(handle,
+ max_tp_unit_len);
+ return (ret);
+}
+
+static __inline void
+rpc_gss_get_error_call(rpc_gss_error_t *error)
+{
+
+ if (rpc_gss_entries.rpc_gss_get_error != NULL)
+ (*rpc_gss_entries.rpc_gss_get_error)(error);
+}
+
+static __inline bool_t
+rpc_gss_mech_to_oid_call(const char *mech, gss_OID *oid_ret)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_mech_to_oid != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_mech_to_oid)(mech, oid_ret);
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_oid_to_mech_call(gss_OID oid, const char **mech_ret)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_oid_to_mech != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_oid_to_mech)(oid, mech_ret);
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_qop_to_num_call(const char *qop, const char *mech, u_int *num_ret)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_qop_to_num != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_qop_to_num)(qop, mech, num_ret);
+ return (ret);
+}
+
+static __inline const char **
+rpc_gss_get_mechanisms_call(void)
+{
+ const char **ret = NULL;
+
+ if (rpc_gss_entries.rpc_gss_get_mechanisms != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_get_mechanisms)();
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_get_versions_call(u_int *vers_hi, u_int *vers_lo)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_get_versions != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_get_versions)(vers_hi, vers_lo);
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_is_installed_call(const char *mech)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_is_installed != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_is_installed)(mech);
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_set_svc_name_call(const char *principal, const char *mechanism,
+ u_int req_time, u_int program, u_int version)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_set_svc_name != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_set_svc_name)(principal,
+ mechanism, req_time, program, version);
+ return (ret);
+}
+
+static __inline void
+rpc_gss_clear_svc_name_call(u_int program, u_int version)
+{
+
+ if (rpc_gss_entries.rpc_gss_clear_svc_name != NULL)
+ (*rpc_gss_entries.rpc_gss_clear_svc_name)(program, version);
+}
+
+static __inline bool_t
+rpc_gss_getcred_call(struct svc_req *req, rpc_gss_rawcred_t **rcred,
+ rpc_gss_ucred_t **ucred, void **cookie)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_getcred != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_getcred)(req, rcred, ucred,
+ cookie);
+ return (ret);
+}
+
+static __inline bool_t
+rpc_gss_set_callback_call(rpc_gss_callback_t *cb)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_set_callback != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_set_callback)(cb);
+ return (ret);
+}
+
+static __inline void
+rpc_gss_clear_callback_call(rpc_gss_callback_t *cb)
+{
+
+ if (rpc_gss_entries.rpc_gss_clear_callback != NULL)
+ (*rpc_gss_entries.rpc_gss_clear_callback)(cb);
+}
+
+static __inline bool_t
+rpc_gss_get_principal_name_call(rpc_gss_principal_t *principal,
+ const char *mech, const char *name, const char *node, const char *domain)
+{
+ bool_t ret = 1;
+
+ if (rpc_gss_entries.rpc_gss_get_principal_name != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_get_principal_name)(principal,
+ mech, name, node, domain);
+ return (ret);
+}
+
+static __inline int
+rpc_gss_svc_max_data_length_call(struct svc_req *req, int max_tp_unit_len)
+{
+ int ret = 0;
+
+ if (rpc_gss_entries.rpc_gss_svc_max_data_length != NULL)
+ ret = (*rpc_gss_entries.rpc_gss_svc_max_data_length)(req,
+ max_tp_unit_len);
+ return (ret);
+}
+
AUTH *rpc_gss_secfind(CLIENT *clnt, struct ucred *cred,
const char *principal, gss_OID mech_oid, rpc_gss_service_t service);
void rpc_gss_secpurge(CLIENT *clnt);
diff --git a/sys/sparc64/include/cache.h b/sys/sparc64/include/cache.h
index 3852da4..3d0ac4f 100644
--- a/sys/sparc64/include/cache.h
+++ b/sys/sparc64/include/cache.h
@@ -110,15 +110,16 @@ cache_flush_t spitfire_cache_flush;
dcache_page_inval_t spitfire_dcache_page_inval;
icache_page_inval_t spitfire_icache_page_inval;
+cache_enable_t zeus_cache_enable;
+cache_flush_t zeus_cache_flush;
+dcache_page_inval_t zeus_dcache_page_inval;
+icache_page_inval_t zeus_icache_page_inval;
+
extern cache_enable_t *cache_enable;
extern cache_flush_t *cache_flush;
extern dcache_page_inval_t *dcache_page_inval;
extern icache_page_inval_t *icache_page_inval;
-cache_flush_t zeus_cache_flush;
-dcache_page_inval_t zeus_dcache_page_inval;
-icache_page_inval_t zeus_icache_page_inval;
-
#endif /* KERNEL */
#endif /* !LOCORE */
diff --git a/sys/sparc64/include/cpu.h b/sys/sparc64/include/cpu.h
index c0845a0..1634477 100644
--- a/sys/sparc64/include/cpu.h
+++ b/sys/sparc64/include/cpu.h
@@ -57,6 +57,7 @@ void cpu_halt(void);
void cpu_reset(void);
void fork_trampoline(void);
void swi_vm(void *v);
+void zeus_init(u_int cpu_impl);
static __inline u_int64_t
get_cyclecount(void)
diff --git a/sys/sparc64/include/pmap.h b/sys/sparc64/include/pmap.h
index adad257..87c56a3 100644
--- a/sys/sparc64/include/pmap.h
+++ b/sys/sparc64/include/pmap.h
@@ -90,12 +90,9 @@ void pmap_kremove_flags(vm_offset_t va);
boolean_t pmap_page_is_mapped(vm_page_t m);
int pmap_cache_enter(vm_page_t m, vm_offset_t va);
-void pmap_cache_remove(vm_page_t m, vm_offset_t va);
int pmap_remove_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp,
vm_offset_t va);
-int pmap_protect_tte(struct pmap *pm1, struct pmap *pm2, struct tte *tp,
- vm_offset_t va);
void pmap_map_tsb(void);
void pmap_set_kctx(void);
diff --git a/sys/sparc64/include/tlb.h b/sys/sparc64/include/tlb.h
index b813b0f..3f2c3c5 100644
--- a/sys/sparc64/include/tlb.h
+++ b/sys/sparc64/include/tlb.h
@@ -44,7 +44,17 @@
(TD_V | TD_4M | (TLB_DIRECT_ADDRESS_MASK - TLB_DIRECT_PAGE_MASK))
#define TLB_DAR_SLOT_SHIFT (3)
-#define TLB_DAR_SLOT(slot) ((slot) << TLB_DAR_SLOT_SHIFT)
+#define TLB_DAR_TLB_SHIFT (16)
+#define TLB_DAR_SLOT(tlb, slot) \
+ ((tlb) << TLB_DAR_TLB_SHIFT | (slot) << TLB_DAR_SLOT_SHIFT)
+#define TLB_DAR_T16 (0) /* US-III{,i,+}, IV{,+} */
+#define TLB_DAR_T32 (0) /* US-I, II{,e,i} */
+#define TLB_DAR_DT512_0 (2) /* US-III{,i,+}, IV{,+} */
+#define TLB_DAR_DT512_1 (3) /* US-III{,i,+}, IV{,+} */
+#define TLB_DAR_IT128 (2) /* US-III{,i,+}, IV */
+#define TLB_DAR_IT512 (2) /* US-IV+ */
+#define TLB_DAR_FTLB (0) /* SPARC64 V, VI, VII, VIIIfx */
+#define TLB_DAR_STLB (2) /* SPARC64 V, VI, VII, VIIIfx */
#define TAR_VPN_SHIFT (13)
#define TAR_CTX_MASK ((1 << TAR_VPN_SHIFT) - 1)
@@ -156,6 +166,9 @@ tlb_flush_user_t cheetah_tlb_flush_user;
tlb_flush_nonlocked_t spitfire_tlb_flush_nonlocked;
tlb_flush_user_t spitfire_tlb_flush_user;
+tlb_flush_nonlocked_t zeus_tlb_flush_nonlocked;
+tlb_flush_user_t zeus_tlb_flush_user;
+
extern tlb_flush_nonlocked_t *tlb_flush_nonlocked;
extern tlb_flush_user_t *tlb_flush_user;
diff --git a/sys/sparc64/include/tsb.h b/sys/sparc64/include/tsb.h
index 5fa1190..1fd1e8f 100644
--- a/sys/sparc64/include/tsb.h
+++ b/sys/sparc64/include/tsb.h
@@ -50,7 +50,6 @@ extern struct tte *tsb_kernel;
extern vm_size_t tsb_kernel_mask;
extern vm_size_t tsb_kernel_size;
extern vm_paddr_t tsb_kernel_phys;
-extern u_int tsb_kernel_ldd_phys;
static __inline struct tte *
tsb_vpntobucket(pmap_t pm, vm_offset_t vpn)
diff --git a/sys/sparc64/include/vmparam.h b/sys/sparc64/include/vmparam.h
index 1b9e537..a0d5ac4 100644
--- a/sys/sparc64/include/vmparam.h
+++ b/sys/sparc64/include/vmparam.h
@@ -70,7 +70,7 @@
* The number of PHYSSEG entries must be one greater than the number
* of phys_avail entries because the phys_avail entry that spans the
* largest physical address that is accessible by ISA DMA is split
- * into two PHYSSEG entries.
+ * into two PHYSSEG entries.
*/
#define VM_PHYSSEG_MAX 64
@@ -136,13 +136,13 @@
* 43 bits of user address space is considered to be "enough", so we ignore it.
*
* Upper region: 0xffffffffffffffff
- * 0xfffff80000000000
- *
+ * 0xfffff80000000000
+ *
* Hole: 0xfffff7ffffffffff
- * 0x0000080000000000
+ * 0x0000080000000000
*
* Lower region: 0x000007ffffffffff
- * 0x0000000000000000
+ * 0x0000000000000000
*
* In general we ignore the upper region, and use the lower region as mappable
* space.
@@ -218,7 +218,7 @@
* is the total KVA space allocated for kmem_map.
*/
#ifndef VM_KMEM_SIZE_SCALE
-#define VM_KMEM_SIZE_SCALE (3)
+#define VM_KMEM_SIZE_SCALE (tsb_kernel_ldd_phys == 0 ? 3 : 1)
#endif
/*
@@ -238,6 +238,7 @@
#define UMA_MD_SMALL_ALLOC
+extern u_int tsb_kernel_ldd_phys;
extern vm_offset_t vm_max_kernel_address;
/*
diff --git a/sys/sparc64/pci/fire.c b/sys/sparc64/pci/fire.c
index 855a72a..0402896 100644
--- a/sys/sparc64/pci/fire.c
+++ b/sys/sparc64/pci/fire.c
@@ -664,9 +664,7 @@ fire_attach(device_t dev)
/*
* Setup JBC/UBC performance counter 0 in bus cycle counting
- * mode as timecounter. Unfortunately, at least with Fire all
- * JBus-driven performance counters just don't advance in bus
- * cycle counting mode.
+ * mode as timecounter.
*/
if (device_get_unit(dev) == 0) {
FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT0, 0);
@@ -674,19 +672,10 @@ fire_attach(device_t dev)
FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT_SEL,
(FO_XBC_PRF_CNT_NONE << FO_XBC_PRF_CNT_CNT1_SHFT) |
(FO_XBC_PRF_CNT_XB_CLK << FO_XBC_PRF_CNT_CNT0_SHFT));
-#ifdef FIRE_DEBUG
- device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n",
- (long long unsigned)FIRE_CTRL_READ_8(sc,
- FO_XBC_PRF_CNT0));
- device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n",
- (long long unsigned)FIRE_CTRL_READ_8(sc,
- FO_XBC_PRF_CNT0));
-#endif
tc = malloc(sizeof(*tc), M_DEVBUF, M_NOWAIT | M_ZERO);
if (tc == NULL)
panic("%s: could not malloc timecounter", __func__);
tc->tc_get_timecount = fire_get_timecount;
- tc->tc_poll_pps = NULL;
tc->tc_counter_mask = TC_COUNTER_MAX_MASK;
if (OF_getprop(OF_peer(0), "clock-frequency", &prop,
sizeof(prop)) == -1)
@@ -694,8 +683,16 @@ fire_attach(device_t dev)
__func__);
tc->tc_frequency = prop;
tc->tc_name = strdup(device_get_nameunit(dev), M_DEVBUF);
- tc->tc_quality = -FIRE_PERF_CNT_QLTY;
tc->tc_priv = sc;
+ /*
+ * Due to initial problems with the JBus-driven performance
+ * counters not advancing which might be firmware dependent
+ * ensure that it actually works.
+ */
+ if (fire_get_timecount(tc) - fire_get_timecount(tc) != 0)
+ tc->tc_quality = FIRE_PERF_CNT_QLTY;
+ else
+ tc->tc_quality = -FIRE_PERF_CNT_QLTY;
tc_init(tc);
}
diff --git a/sys/sparc64/pci/schizo.c b/sys/sparc64/pci/schizo.c
index 7d55516..4d1a5a7 100644
--- a/sys/sparc64/pci/schizo.c
+++ b/sys/sparc64/pci/schizo.c
@@ -482,7 +482,6 @@ schizo_attach(device_t dev)
if (tc == NULL)
panic("%s: could not malloc timecounter", __func__);
tc->tc_get_timecount = schizo_get_timecount;
- tc->tc_poll_pps = NULL;
tc->tc_counter_mask = STX_CTRL_PERF_CNT_MASK;
if (OF_getprop(OF_peer(0), "clock-frequency", &prop,
sizeof(prop)) == -1)
@@ -1521,6 +1520,7 @@ schizo_get_timecount(struct timecounter *tc)
struct schizo_softc *sc;
sc = tc->tc_priv;
- return (SCHIZO_CTRL_READ_8(sc, STX_CTRL_PERF_CNT) &
- (STX_CTRL_PERF_CNT_MASK << STX_CTRL_PERF_CNT_CNT0_SHIFT));
+ return ((SCHIZO_CTRL_READ_8(sc, STX_CTRL_PERF_CNT) &
+ (STX_CTRL_PERF_CNT_MASK << STX_CTRL_PERF_CNT_CNT0_SHIFT)) >>
+ STX_CTRL_PERF_CNT_CNT0_SHIFT);
}
diff --git a/sys/sparc64/sparc64/cache.c b/sys/sparc64/sparc64/cache.c
index 636c18a..d29a294 100644
--- a/sys/sparc64/sparc64/cache.c
+++ b/sys/sparc64/sparc64/cache.c
@@ -169,12 +169,12 @@ cache_init(struct pcpu *pcpu)
tlb_flush_nonlocked = cheetah_tlb_flush_nonlocked;
tlb_flush_user = cheetah_tlb_flush_user;
} else if (pcpu->pc_impl == CPU_IMPL_SPARC64V) {
- cache_enable = cheetah_cache_enable;
+ cache_enable = zeus_cache_enable;
cache_flush = zeus_cache_flush;
dcache_page_inval = zeus_dcache_page_inval;
icache_page_inval = zeus_icache_page_inval;
- tlb_flush_nonlocked = cheetah_tlb_flush_nonlocked;
- tlb_flush_user = cheetah_tlb_flush_user;
+ tlb_flush_nonlocked = zeus_tlb_flush_nonlocked;
+ tlb_flush_user = zeus_tlb_flush_user;
} else if (pcpu->pc_impl >= CPU_IMPL_ULTRASPARCI &&
pcpu->pc_impl < CPU_IMPL_ULTRASPARCIII) {
cache_enable = spitfire_cache_enable;
diff --git a/sys/sparc64/sparc64/cheetah.c b/sys/sparc64/sparc64/cheetah.c
index 99d38c9..8ecc62f 100644
--- a/sys/sparc64/sparc64/cheetah.c
+++ b/sys/sparc64/sparc64/cheetah.c
@@ -1,6 +1,6 @@
/*-
* Copyright (c) 2003 Jake Burkholder.
- * Copyright (c) 2005, 2008, 2010 Marius Strobl <marius@FreeBSD.org>
+ * Copyright (c) 2005 - 2011 Marius Strobl <marius@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,8 +28,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_pmap.h"
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/lock.h>
@@ -45,17 +43,19 @@ __FBSDID("$FreeBSD$");
#include <machine/cpufunc.h>
#include <machine/dcr.h>
#include <machine/lsu.h>
-#include <machine/mcntl.h>
#include <machine/smp.h>
#include <machine/tlb.h>
#include <machine/ver.h>
#include <machine/vmparam.h>
#define CHEETAH_ICACHE_TAG_LOWER 0x30
+#define CHEETAH_T16_ENTRIES 16
+#define CHEETAH_DT512_ENTRIES 512
+#define CHEETAH_IT128_ENTRIES 128
+#define CHEETAH_IT512_ENTRIES 512
/*
- * CPU-specific initialization - this is used for both the Sun Cheetah and
- * later as well as the Fujitsu Zeus and later CPUs.
+ * CPU-specific initialization for Sun Cheetah and later CPUs
*/
void
cheetah_init(u_int cpu_impl)
@@ -78,14 +78,6 @@ cheetah_init(u_int cpu_impl)
stxa(AA_IMMU_TSB_NEXT_REG, ASI_IMMU, 0);
membar(Sync);
- if (cpu_impl == CPU_IMPL_SPARC64V) {
- /* Ensure MCNTL_JPS1_TSBP is 0. */
- val = ldxa(AA_MCNTL, ASI_MCNTL);
- val &= ~MCNTL_JPS1_TSBP;
- stxa(AA_MCNTL, ASI_MCNTL, val);
- return;
- }
-
/*
* Configure the first large dTLB to hold 4MB pages (e.g. for direct
* mappings) for all three contexts and ensure the second one is set
@@ -223,33 +215,92 @@ cheetah_icache_page_inval(vm_paddr_t pa __unused)
}
-#define cheetah_dmap_all() do { \
- stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0); \
- stxa(TLB_DEMAP_ALL, ASI_IMMU_DEMAP, 0); \
- flush(KERNBASE); \
-} while (0)
-
/*
- * Flush all non-locked mappings from the TLB.
+ * Flush all non-locked mappings from the TLBs.
*/
void
cheetah_tlb_flush_nonlocked(void)
{
- cheetah_dmap_all();
+ stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0);
+ stxa(TLB_DEMAP_ALL, ASI_IMMU_DEMAP, 0);
+ flush(KERNBASE);
}
/*
- * Flush all user mappings from the TLB.
+ * Flush all user mappings from the TLBs.
*/
void
-cheetah_tlb_flush_user()
+cheetah_tlb_flush_user(void)
{
+ u_long data, tag;
+ register_t s;
+ u_int i, slot;
/*
- * Just use cheetah_dmap_all() and accept somes TLB misses
- * rather than searching all 1040 D-TLB and 144 I-TLB slots
- * for non-kernel mappings.
+ * We read ASI_{D,I}TLB_DATA_ACCESS_REG twice back-to-back in order
+ * to work around errata of USIII and beyond.
*/
- cheetah_dmap_all();
+ for (i = 0; i < CHEETAH_T16_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_T16, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ for (i = 0; i < CHEETAH_DT512_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_DT512_0, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ slot = TLB_DAR_SLOT(TLB_DAR_DT512_1, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ }
+ if (PCPU_GET(impl) == CPU_IMPL_ULTRASPARCIVp) {
+ for (i = 0; i < CHEETAH_IT512_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_IT512, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ } else {
+ for (i = 0; i < CHEETAH_IT128_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_IT128, i);
+ s = intr_disable();
+ (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ intr_restore(s);
+ if ((data & TD_V) != 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ }
}
diff --git a/sys/sparc64/sparc64/counter.c b/sys/sparc64/sparc64/counter.c
index cb9241a..8009fad 100644
--- a/sys/sparc64/sparc64/counter.c
+++ b/sys/sparc64/sparc64/counter.c
@@ -86,13 +86,12 @@ sparc64_counter_init(const char *name, bus_space_tag_t tag,
bus_space_write_8(tag, handle, offset + CTR_CT1 + CTR_LIMIT,
COUNTER_MASK);
/* Register as a time counter. */
- tc = malloc(sizeof(*tc), M_DEVBUF, M_WAITOK);
+ tc = malloc(sizeof(*tc), M_DEVBUF, M_WAITOK | M_ZERO);
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK);
sc->sc_tag = tag;
sc->sc_handle = handle;
sc->sc_offset = offset + CTR_CT0;
tc->tc_get_timecount = counter_get_timecount;
- tc->tc_poll_pps = NULL;
tc->tc_counter_mask = COUNTER_MASK;
tc->tc_frequency = COUNTER_FREQ;
tc->tc_name = strdup(name, M_DEVBUF);
@@ -107,6 +106,5 @@ counter_get_timecount(struct timecounter *tc)
struct ct_softc *sc;
sc = tc->tc_priv;
- return (bus_space_read_8(sc->sc_tag, sc->sc_handle, sc->sc_offset) &
- COUNTER_MASK);
+ return (bus_space_read_8(sc->sc_tag, sc->sc_handle, sc->sc_offset));
}
diff --git a/sys/sparc64/sparc64/exception.S b/sys/sparc64/sparc64/exception.S
index 0b8a0fa..5ef50a3 100644
--- a/sys/sparc64/sparc64/exception.S
+++ b/sys/sparc64/sparc64/exception.S
@@ -369,11 +369,18 @@ ENTRY(rsf_fatal)
sir
END(rsf_fatal)
- .comm intrnames, IV_MAX * (MAXCOMLEN + 1)
- .comm eintrnames, 0
-
- .comm intrcnt, IV_MAX * 8
- .comm eintrcnt, 0
+ .data
+ _ALIGN_DATA
+ .globl intrnames, eintrnames
+intrnames:
+ .space IV_MAX * (MAXCOMLEN + 1)
+eintrnames:
+ .globl intrcnt, eintrcnt
+intrcnt:
+ .space IV_MAX * 8
+eintrcnt:
+
+ .text
/*
* Trap table and associated macros
@@ -578,7 +585,8 @@ END(tl0_sfsr_trap)
andcc %g1, IRSR_BUSY, %g0
bnz,a,pt %xcc, intr_vector
nop
- sir
+ ba,a,pt %xcc, intr_vector_stray
+ nop
.align 32
.endm
diff --git a/sys/sparc64/sparc64/interrupt.S b/sys/sparc64/sparc64/interrupt.S
index b71a05d..3f80445 100644
--- a/sys/sparc64/sparc64/interrupt.S
+++ b/sys/sparc64/sparc64/interrupt.S
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <machine/intr_machdep.h>
#include <machine/ktr.h>
#include <machine/pstate.h>
+#include <machine/ver.h>
#include "assym.s"
@@ -153,6 +154,29 @@ ENTRY(intr_vector)
retry
END(intr_vector)
+ENTRY(intr_vector_stray)
+ /*
+ * SPARC64-VI trigger stray vector interrupts in order to indicate
+ * uncorrectable errors in interrupt packets, which still need to be
+ * acknowledged though.
+ * US-IV occasionally trigger stray vector interrupts for reasons
+ * unknown accompanied by a state in which they even fault on locked
+ * TLB entries so we can't even log these here. Just retrying the
+ * instruction in that case gets the CPU back on track.
+ */
+ rdpr %ver, %g1
+ srlx %g1, VER_IMPL_SHIFT, %g1
+ sll %g1, VER_IMPL_SIZE, %g1
+ srl %g1, VER_IMPL_SIZE, %g1
+ cmp %g1, CPU_IMPL_SPARC64VI
+ bne,a,pn %icc, 1f
+ nop
+ stxa %g0, [%g0] ASI_INTR_RECEIVE
+ membar #Sync
+
+1: retry
+END(intr_vector_stray)
+
ENTRY(intr_fast)
save %sp, -CCFSZ, %sp
diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c
index ed30182..112ddab 100644
--- a/sys/sparc64/sparc64/intr_machdep.c
+++ b/sys/sparc64/sparc64/intr_machdep.c
@@ -83,10 +83,11 @@ CTASSERT((1 << IV_SHIFT) == sizeof(struct intr_vector));
ih_func_t *intr_handlers[PIL_MAX];
uint16_t pil_countp[PIL_MAX];
+static uint16_t pil_stray_count[PIL_MAX];
struct intr_vector intr_vectors[IV_MAX];
uint16_t intr_countp[IV_MAX];
-static u_long intr_stray_count[IV_MAX];
+static uint16_t intr_stray_count[IV_MAX];
static const char *const pil_names[] = {
"stray",
@@ -199,22 +200,32 @@ intr_setup(int pri, ih_func_t *ihf, int vec, iv_func_t *ivf, void *iva)
static void
intr_stray_level(struct trapframe *tf)
{
-
- printf("stray level interrupt %ld\n", tf->tf_level);
+ uint64_t level;
+
+ level = tf->tf_level;
+ if (pil_stray_count[level] < MAX_STRAY_LOG) {
+ printf("stray level interrupt %ld\n", level);
+ pil_stray_count[level]++;
+ if (pil_stray_count[level] >= MAX_STRAY_LOG)
+ printf("got %d stray level interrupt %ld's: not "
+ "logging anymore\n", MAX_STRAY_LOG, level);
+ }
}
static void
intr_stray_vector(void *cookie)
{
struct intr_vector *iv;
+ u_int vec;
iv = cookie;
- if (intr_stray_count[iv->iv_vec] < MAX_STRAY_LOG) {
- printf("stray vector interrupt %d\n", iv->iv_vec);
- intr_stray_count[iv->iv_vec]++;
- if (intr_stray_count[iv->iv_vec] >= MAX_STRAY_LOG)
- printf("got %d stray interrupt %d's: not logging "
- "anymore\n", MAX_STRAY_LOG, iv->iv_vec);
+ vec = iv->iv_vec;
+ if (intr_stray_count[vec] < MAX_STRAY_LOG) {
+ printf("stray vector interrupt %d\n", vec);
+ intr_stray_count[vec]++;
+ if (intr_stray_count[vec] >= MAX_STRAY_LOG)
+ printf("got %d stray vector interrupt %d's: not "
+ "logging anymore\n", MAX_STRAY_LOG, vec);
}
}
diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c
index abf3a91..c0cc75d 100644
--- a/sys/sparc64/sparc64/machdep.c
+++ b/sys/sparc64/sparc64/machdep.c
@@ -348,9 +348,10 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec)
/*
* Do CPU-specific initialization.
*/
- if (cpu_impl == CPU_IMPL_SPARC64V ||
- cpu_impl >= CPU_IMPL_ULTRASPARCIII)
+ if (cpu_impl >= CPU_IMPL_ULTRASPARCIII)
cheetah_init(cpu_impl);
+ else if (cpu_impl == CPU_IMPL_SPARC64V)
+ zeus_init(cpu_impl);
/*
* Clear (S)TICK timer (including NPT).
diff --git a/sys/sparc64/sparc64/mp_exception.S b/sys/sparc64/sparc64/mp_exception.S
index f1b323a..54a5e4d 100644
--- a/sys/sparc64/sparc64/mp_exception.S
+++ b/sys/sparc64/sparc64/mp_exception.S
@@ -247,8 +247,8 @@ ENTRY(tl_ipi_tlb_range_demap)
ldx [%g5 + ITA_START], %g1
ldx [%g5 + ITA_END], %g2
-1: or %g1, %g3, %g4
sethi %hi(KERNBASE), %g6
+1: or %g1, %g3, %g4
stxa %g0, [%g4] ASI_DMMU_DEMAP
stxa %g0, [%g4] ASI_IMMU_DEMAP
flush %g6
@@ -257,7 +257,7 @@ ENTRY(tl_ipi_tlb_range_demap)
add %g1, %g6, %g1
cmp %g1, %g2
blt,a,pt %xcc, 1b
- nop
+ sethi %hi(KERNBASE), %g6
IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
diff --git a/sys/sparc64/sparc64/mp_machdep.c b/sys/sparc64/sparc64/mp_machdep.c
index f2e76df..e5910e0 100644
--- a/sys/sparc64/sparc64/mp_machdep.c
+++ b/sys/sparc64/sparc64/mp_machdep.c
@@ -139,10 +139,6 @@ static cpu_ipi_single_t spitfire_ipi_single;
SYSINIT(cpu_mp_unleash, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL);
-CTASSERT(MAXCPU <= IDR_CHEETAH_MAX_BN_PAIRS);
-CTASSERT(MAXCPU <= sizeof(u_int) * NBBY);
-CTASSERT(MAXCPU <= sizeof(int) * NBBY);
-
void
mp_init(u_int cpu_impl)
{
@@ -283,7 +279,6 @@ sun4u_startcpu(phandle_t cpu, void *func, u_long arg)
void
cpu_mp_start(void)
{
- cpuset_t ocpus;
mtx_init(&ipi_mtx, "ipi", NULL, MTX_SPIN);
@@ -300,9 +295,6 @@ cpu_mp_start(void)
KASSERT(!isjbus || mp_ncpus <= IDR_JALAPENO_MAX_BN_PAIRS,
("%s: can only IPI a maximum of %d JBus-CPUs",
__func__, IDR_JALAPENO_MAX_BN_PAIRS));
- ocpus = all_cpus;
- CPU_CLR(curcpu, &ocpus);
- PCPU_SET(other_cpus, ocpus);
smp_active = 1;
}
@@ -424,15 +416,16 @@ cpu_mp_unleash(void *v)
void
cpu_mp_bootstrap(struct pcpu *pc)
{
- cpuset_t ocpus;
volatile struct cpu_start_args *csa;
csa = &cpu_start_args;
/* Do CPU-specific initialization. */
- if (pc->pc_impl == CPU_IMPL_SPARC64V ||
- pc->pc_impl >= CPU_IMPL_ULTRASPARCIII)
+ if (pc->pc_impl >= CPU_IMPL_ULTRASPARCIII)
cheetah_init(pc->pc_impl);
+ else if (pc->pc_impl == CPU_IMPL_SPARC64V)
+ zeus_init(pc->pc_impl);
+
/*
* Enable the caches. Note that his may include applying workarounds.
*/
@@ -466,9 +459,6 @@ cpu_mp_bootstrap(struct pcpu *pc)
smp_cpus++;
KASSERT(curthread != NULL, ("%s: curthread", __func__));
- ocpus = all_cpus;
- CPU_CLR(curcpu, &ocpus);
- PCPU_SET(other_cpus, ocpus);
printf("SMP: AP CPU #%d Launched!\n", curcpu);
csa->csa_count--;
@@ -491,13 +481,14 @@ cpu_mp_shutdown(void)
int i;
critical_enter();
- shutdown_cpus = PCPU_GET(other_cpus);
+ shutdown_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &shutdown_cpus);
cpus = shutdown_cpus;
/* XXX: Stop all the CPUs which aren't already. */
if (CPU_CMP(&stopped_cpus, &cpus)) {
- /* pc_other_cpus is just a flat "on" mask without curcpu. */
+ /* cpus is just a flat "on" mask without curcpu. */
CPU_NAND(&cpus, &stopped_cpus);
stop_cpus(cpus);
}
@@ -520,23 +511,23 @@ cpu_ipi_ast(struct trapframe *tf)
static void
cpu_ipi_stop(struct trapframe *tf)
{
- cpuset_t tcmask;
+ u_int cpuid;
CTR2(KTR_SMP, "%s: stopped %d", __func__, curcpu);
sched_pin();
savectx(&stoppcbs[curcpu]);
- tcmask = PCPU_GET(cpumask);
- CPU_OR_ATOMIC(&stopped_cpus, &tcmask);
- while (!CPU_OVERLAP(&started_cpus, &tcmask)) {
- if (CPU_OVERLAP(&shutdown_cpus, &tcmask)) {
- CPU_NAND_ATOMIC(&shutdown_cpus, &tcmask);
+ cpuid = PCPU_GET(cpuid);
+ CPU_SET_ATOMIC(cpuid, &stopped_cpus);
+ while (!CPU_ISSET(cpuid, &started_cpus)) {
+ if (CPU_ISSET(cpuid, &shutdown_cpus)) {
+ CPU_CLR_ATOMIC(cpuid, &shutdown_cpus);
(void)intr_disable();
for (;;)
;
}
}
- CPU_NAND_ATOMIC(&started_cpus, &tcmask);
- CPU_NAND_ATOMIC(&stopped_cpus, &tcmask);
+ CPU_CLR_ATOMIC(cpuid, &started_cpus);
+ CPU_CLR_ATOMIC(cpuid, &stopped_cpus);
sched_unpin();
CTR2(KTR_SMP, "%s: restarted %d", __func__, curcpu);
}
@@ -703,6 +694,8 @@ cheetah_ipi_selected(cpuset_t cpus, u_long d0, u_long d1, u_long d2)
ASI_SDB_INTR_W, 0);
membar(Sync);
bnp++;
+ if (bnp == IDR_CHEETAH_MAX_BN_PAIRS)
+ break;
}
}
while (((ids = ldxa(0, ASI_INTR_DISPATCH_STATUS)) &
diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c
index b01a558..46c5050 100644
--- a/sys/sparc64/sparc64/pmap.c
+++ b/sys/sparc64/sparc64/pmap.c
@@ -152,6 +152,9 @@ struct pmap kernel_pmap_store;
static vm_paddr_t pmap_bootstrap_alloc(vm_size_t size, uint32_t colors);
static void pmap_bootstrap_set_tte(struct tte *tp, u_long vpn, u_long data);
+static void pmap_cache_remove(vm_page_t m, vm_offset_t va);
+static int pmap_protect_tte(struct pmap *pm1, struct pmap *pm2,
+ struct tte *tp, vm_offset_t va);
/*
* Map the given physical page at the specified virtual address in the
@@ -247,7 +250,7 @@ PMAP_STATS_VAR(pmap_ncopy_page_soc);
PMAP_STATS_VAR(pmap_nnew_thread);
PMAP_STATS_VAR(pmap_nnew_thread_oc);
-static inline u_long dtlb_get_data(u_int slot);
+static inline u_long dtlb_get_data(u_int tlb, u_int slot);
/*
* Quick sort callout for comparing memory regions
@@ -288,15 +291,21 @@ om_cmp(const void *a, const void *b)
}
static inline u_long
-dtlb_get_data(u_int slot)
+dtlb_get_data(u_int tlb, u_int slot)
{
+ u_long data;
+ register_t s;
+ slot = TLB_DAR_SLOT(tlb, slot);
/*
- * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work
- * around errata of USIII and beyond.
+ * We read ASI_DTLB_DATA_ACCESS_REG twice back-to-back in order to
+ * work around errata of USIII and beyond.
*/
- (void)ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG);
- return (ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG));
+ s = intr_disable();
+ (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ intr_restore(s);
+ return (data);
}
/*
@@ -384,14 +393,17 @@ pmap_bootstrap(u_int cpu_impl)
* public documentation is available for these, the latter just might
* not support it, yet.
*/
- virtsz = roundup(physsz, PAGE_SIZE_4M << (PAGE_SHIFT - TTE_SHIFT));
if (cpu_impl == CPU_IMPL_SPARC64V ||
- cpu_impl >= CPU_IMPL_ULTRASPARCIIIp)
+ cpu_impl >= CPU_IMPL_ULTRASPARCIIIp) {
tsb_kernel_ldd_phys = 1;
- else {
+ virtsz = roundup(5 / 3 * physsz, PAGE_SIZE_4M <<
+ (PAGE_SHIFT - TTE_SHIFT));
+ } else {
dtlb_slots_avail = 0;
for (i = 0; i < dtlb_slots; i++) {
- data = dtlb_get_data(i);
+ data = dtlb_get_data(cpu_impl ==
+ CPU_IMPL_ULTRASPARCIII ? TLB_DAR_T16 :
+ TLB_DAR_T32, i);
if ((data & (TD_V | TD_L)) != (TD_V | TD_L))
dtlb_slots_avail++;
}
@@ -401,6 +413,8 @@ pmap_bootstrap(u_int cpu_impl)
if (cpu_impl >= CPU_IMPL_ULTRASPARCI &&
cpu_impl < CPU_IMPL_ULTRASPARCIII)
dtlb_slots_avail /= 2;
+ virtsz = roundup(physsz, PAGE_SIZE_4M <<
+ (PAGE_SHIFT - TTE_SHIFT));
virtsz = MIN(virtsz, (dtlb_slots_avail * PAGE_SIZE_4M) <<
(PAGE_SHIFT - TTE_SHIFT));
}
@@ -945,7 +959,7 @@ pmap_cache_enter(vm_page_t m, vm_offset_t va)
return (0);
}
-void
+static void
pmap_cache_remove(vm_page_t m, vm_offset_t va)
{
struct tte *tp;
@@ -1283,6 +1297,7 @@ pmap_release(pmap_t pm)
pc->pc_pmap = NULL;
mtx_unlock_spin(&sched_lock);
+ pmap_qremove((vm_offset_t)pm->pm_tsb, TSB_PAGES);
obj = pm->pm_tsb_obj;
VM_OBJECT_LOCK(obj);
KASSERT(obj->ref_count == 1, ("pmap_release: tsbobj ref count != 1"));
@@ -1294,7 +1309,6 @@ pmap_release(pmap_t pm)
vm_page_free_zero(m);
}
VM_OBJECT_UNLOCK(obj);
- pmap_qremove((vm_offset_t)pm->pm_tsb, TSB_PAGES);
PMAP_LOCK_DESTROY(pm);
}
@@ -1376,6 +1390,8 @@ pmap_remove_all(vm_page_t m)
struct tte *tp;
vm_offset_t va;
+ KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
vm_page_lock_queues();
for (tp = TAILQ_FIRST(&m->md.tte_list); tp != NULL; tp = tpn) {
tpn = TAILQ_NEXT(tp, tte_link);
@@ -1402,7 +1418,7 @@ pmap_remove_all(vm_page_t m)
vm_page_unlock_queues();
}
-int
+static int
pmap_protect_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp,
vm_offset_t va)
{
@@ -1971,7 +1987,7 @@ pmap_page_wired_mappings(vm_page_t m)
/*
* Remove all pages from specified address space, this aids process exit
- * speeds. This is much faster than pmap_remove n the case of running down
+ * speeds. This is much faster than pmap_remove in the case of running down
* an entire address space. Only works for the current pmap.
*/
void
@@ -2217,11 +2233,10 @@ pmap_activate(struct thread *td)
struct pmap *pm;
int context;
+ critical_enter();
vm = td->td_proc->p_vmspace;
pm = vmspace_pmap(vm);
- mtx_lock_spin(&sched_lock);
-
context = PCPU_GET(tlb_ctx);
if (context == PCPU_GET(tlb_ctx_max)) {
tlb_flush_user();
@@ -2229,17 +2244,18 @@ pmap_activate(struct thread *td)
}
PCPU_SET(tlb_ctx, context + 1);
+ mtx_lock_spin(&sched_lock);
pm->pm_context[curcpu] = context;
- CPU_OR(&pm->pm_active, PCPU_PTR(cpumask));
+ CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
PCPU_SET(pmap, pm);
+ mtx_unlock_spin(&sched_lock);
stxa(AA_DMMU_TSB, ASI_DMMU, pm->pm_tsb);
stxa(AA_IMMU_TSB, ASI_IMMU, pm->pm_tsb);
stxa(AA_DMMU_PCXR, ASI_DMMU, (ldxa(AA_DMMU_PCXR, ASI_DMMU) &
TLB_CXR_PGSZ_MASK) | context);
flush(KERNBASE);
-
- mtx_unlock_spin(&sched_lock);
+ critical_exit();
}
void
diff --git a/sys/sparc64/sparc64/spitfire.c b/sys/sparc64/sparc64/spitfire.c
index d6e25b9..7e51f2d 100644
--- a/sys/sparc64/sparc64/spitfire.c
+++ b/sys/sparc64/sparc64/spitfire.c
@@ -140,47 +140,45 @@ spitfire_icache_page_inval(vm_paddr_t pa)
}
/*
- * Flush all non-locked mappings from the TLB.
+ * Flush all non-locked mappings from the TLBs.
*/
void
spitfire_tlb_flush_nonlocked(void)
{
- int i;
+ u_int i;
+ u_int slot;
for (i = 0; i < SPITFIRE_TLB_ENTRIES; i++) {
- if ((ldxa(TLB_DAR_SLOT(i), ASI_DTLB_DATA_ACCESS_REG) &
- TD_L) == 0)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_DTLB_DATA_ACCESS_REG, 0);
- if ((ldxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG) &
- TD_L) == 0)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_ITLB_DATA_ACCESS_REG, 0);
+ slot = TLB_DAR_SLOT(TLB_DAR_T32, i);
+ if ((ldxa(slot, ASI_DTLB_DATA_ACCESS_REG) & TD_L) == 0)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ if ((ldxa(slot, ASI_ITLB_DATA_ACCESS_REG) & TD_L) == 0)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
}
}
/*
- * Flush all user mappings from the TLB.
+ * Flush all user mappings from the TLBs.
*/
void
spitfire_tlb_flush_user(void)
{
u_long data;
u_long tag;
- int i;
+ u_int i;
+ u_int slot;
for (i = 0; i < SPITFIRE_TLB_ENTRIES; i++) {
- data = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_DATA_ACCESS_REG);
- tag = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
+ slot = TLB_DAR_SLOT(TLB_DAR_T32, i);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_DTLB_DATA_ACCESS_REG, 0);
- data = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG);
- tag = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
- stxa_sync(TLB_DAR_SLOT(i),
- ASI_ITLB_DATA_ACCESS_REG, 0);
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
}
}
diff --git a/sys/sparc64/sparc64/sys_machdep.c b/sys/sparc64/sparc64/sys_machdep.c
index 9ac5fbc..530ff95 100644
--- a/sys/sparc64/sparc64/sys_machdep.c
+++ b/sys/sparc64/sparc64/sys_machdep.c
@@ -26,8 +26,11 @@
* $FreeBSD$
*/
+#include "opt_capsicum.h"
+
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/capability.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
@@ -53,6 +56,24 @@ sysarch(struct thread *td, struct sysarch_args *uap)
{
int error;
+#ifdef CAPABILITY_MODE
+ /*
+ * When adding new operations, add a new case statement here to
+ * explicitly indicate whether or not the operation is safe to
+ * perform in capability mode.
+ */
+ if (IN_CAPABILITY_MODE(td)) {
+ switch (uap->op) {
+ case SPARC_SIGTRAMP_INSTALL:
+ case SPARC_UTRAP_INSTALL:
+ break;
+
+ default:
+ return (ECAPMODE);
+ }
+ }
+#endif
+
mtx_lock(&Giant);
switch (uap->op) {
case SPARC_SIGTRAMP_INSTALL:
diff --git a/sys/sparc64/sparc64/tick.c b/sys/sparc64/sparc64/tick.c
index 921ffcb..0c0decc 100644
--- a/sys/sparc64/sparc64/tick.c
+++ b/sys/sparc64/sparc64/tick.c
@@ -197,12 +197,10 @@ cpu_initclocks(void)
* quality (S)TICK timers in the MP case.
*/
tick_tc.tc_get_timecount = tick_get_timecount_up;
- tick_tc.tc_poll_pps = NULL;
tick_tc.tc_counter_mask = ~0u;
tick_tc.tc_frequency = clock;
tick_tc.tc_name = "tick";
tick_tc.tc_quality = TICK_QUALITY_UP;
- tick_tc.tc_priv = NULL;
#ifdef SMP
if (cpu_mp_probe()) {
tick_tc.tc_get_timecount = tick_get_timecount_mp;
@@ -212,12 +210,10 @@ cpu_initclocks(void)
tc_init(&tick_tc);
if (sclock != 0) {
stick_tc.tc_get_timecount = stick_get_timecount_up;
- stick_tc.tc_poll_pps = NULL;
stick_tc.tc_counter_mask = ~0u;
stick_tc.tc_frequency = sclock;
stick_tc.tc_name = "stick";
stick_tc.tc_quality = TICK_QUALITY_UP;
- stick_tc.tc_priv = NULL;
#ifdef SMP
if (cpu_mp_probe()) {
stick_tc.tc_get_timecount = stick_get_timecount_mp;
diff --git a/sys/sparc64/sparc64/tlb.c b/sys/sparc64/sparc64/tlb.c
index 9fcece6..70b2823 100644
--- a/sys/sparc64/sparc64/tlb.c
+++ b/sys/sparc64/sparc64/tlb.c
@@ -80,7 +80,7 @@ tlb_context_demap(struct pmap *pm)
PMAP_STATS_INC(tlb_ncontext_demap);
cookie = ipi_tlb_context_demap(pm);
s = intr_disable();
- if (CPU_OVERLAP(&pm->pm_active, PCPU_PTR(cpumask))) {
+ if (CPU_ISSET(PCPU_GET(cpuid), &pm->pm_active)) {
KASSERT(pm->pm_context[curcpu] != -1,
("tlb_context_demap: inactive pmap?"));
stxa(TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, ASI_DMMU_DEMAP, 0);
@@ -101,7 +101,7 @@ tlb_page_demap(struct pmap *pm, vm_offset_t va)
PMAP_STATS_INC(tlb_npage_demap);
cookie = ipi_tlb_page_demap(pm, va);
s = intr_disable();
- if (CPU_OVERLAP(&pm->pm_active, PCPU_PTR(cpumask))) {
+ if (CPU_ISSET(PCPU_GET(cpuid), &pm->pm_active)) {
KASSERT(pm->pm_context[curcpu] != -1,
("tlb_page_demap: inactive pmap?"));
if (pm == kernel_pmap)
@@ -128,7 +128,7 @@ tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end)
PMAP_STATS_INC(tlb_nrange_demap);
cookie = ipi_tlb_range_demap(pm, start, end);
s = intr_disable();
- if (CPU_OVERLAP(&pm->pm_active, PCPU_PTR(cpumask))) {
+ if (CPU_ISSET(PCPU_GET(cpuid), &pm->pm_active)) {
KASSERT(pm->pm_context[curcpu] != -1,
("tlb_range_demap: inactive pmap?"));
if (pm == kernel_pmap)
diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c
index 2b46dd1..dae1989 100644
--- a/sys/sparc64/sparc64/vm_machdep.c
+++ b/sys/sparc64/sparc64/vm_machdep.c
@@ -525,7 +525,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
pa = VM_PAGE_TO_PHYS(m);
if (dcache_color_ignore == 0 && m->md.color != DCACHE_COLOR(pa)) {
KASSERT(m->md.colors[0] == 0 && m->md.colors[1] == 0,
- ("uma_small_alloc: free page still has mappings!"));
+ ("uma_small_alloc: free page %p still has mappings!", m));
PMAP_STATS_INC(uma_nsmall_alloc_oc);
m->md.color = DCACHE_COLOR(pa);
dcache_page_inval(pa);
diff --git a/sys/sparc64/sparc64/zeus.c b/sys/sparc64/sparc64/zeus.c
index a3dc4e5..e6a31aa 100644
--- a/sys/sparc64/sparc64/zeus.c
+++ b/sys/sparc64/sparc64/zeus.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2010 Marius Strobl <marius@FreeBSD.org>
+ * Copyright (c) 2010 - 2011 Marius Strobl <marius@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,64 @@ __FBSDID("$FreeBSD$");
#include <machine/asi.h>
#include <machine/cache.h>
+#include <machine/cpu.h>
#include <machine/cpufunc.h>
+#include <machine/mcntl.h>
+#include <machine/lsu.h>
+#include <machine/tlb.h>
+#include <machine/tte.h>
+#include <machine/vmparam.h>
+
+#define ZEUS_FTLB_ENTRIES 32
+#define ZEUS_STLB_ENTRIES 2048
+
+/*
+ * CPU-specific initialization for Fujitsu Zeus CPUs
+ */
+void
+zeus_init(u_int cpu_impl)
+{
+ u_long val;
+
+ /* Ensure the TSB Extension Registers hold 0 as TSB_Base. */
+
+ stxa(AA_DMMU_TSB_PEXT_REG, ASI_DMMU, 0);
+ stxa(AA_IMMU_TSB_PEXT_REG, ASI_IMMU, 0);
+ membar(Sync);
+
+ stxa(AA_DMMU_TSB_SEXT_REG, ASI_DMMU, 0);
+ /*
+ * NB: the secondary context was removed from the iMMU.
+ */
+ membar(Sync);
+
+ stxa(AA_DMMU_TSB_NEXT_REG, ASI_DMMU, 0);
+ stxa(AA_IMMU_TSB_NEXT_REG, ASI_IMMU, 0);
+ membar(Sync);
+
+ val = ldxa(AA_MCNTL, ASI_MCNTL);
+ /* Ensure MCNTL_JPS1_TSBP is 0. */
+ val &= ~MCNTL_JPS1_TSBP;
+ /*
+ * Ensure 4-Mbyte page entries are stored in the 1024-entry, 2-way set
+ * associative TLB.
+ */
+ val = (val & ~MCNTL_RMD_MASK) | MCNTL_RMD_1024;
+ stxa(AA_MCNTL, ASI_MCNTL, val);
+}
+
+/*
+ * Enable level 1 caches.
+ */
+void
+zeus_cache_enable(u_int cpu_impl)
+{
+ u_long lsu;
+
+ lsu = ldxa(0, ASI_LSU_CTL_REG);
+ stxa(0, ASI_LSU_CTL_REG, lsu | LSU_IC | LSU_DC);
+ flush(KERNBASE);
+}
/*
* Flush all lines from the level 1 caches.
@@ -63,3 +120,52 @@ zeus_icache_page_inval(vm_paddr_t pa __unused)
{
}
+
+/*
+ * Flush all non-locked mappings from the TLBs.
+ */
+void
+zeus_tlb_flush_nonlocked(void)
+{
+
+ stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0);
+ stxa(TLB_DEMAP_ALL, ASI_IMMU_DEMAP, 0);
+ flush(KERNBASE);
+}
+
+/*
+ * Flush all user mappings from the TLBs.
+ */
+void
+zeus_tlb_flush_user(void)
+{
+ u_long data, tag;
+ u_int i, slot;
+
+ for (i = 0; i < ZEUS_FTLB_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_FTLB, i);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+ for (i = 0; i < ZEUS_STLB_ENTRIES; i++) {
+ slot = TLB_DAR_SLOT(TLB_DAR_STLB, i);
+ data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_DTLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0);
+ data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG);
+ tag = ldxa(slot, ASI_ITLB_TAG_READ_REG);
+ if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
+ TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
+ stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0);
+ }
+}
diff --git a/sys/sys/_types.h b/sys/sys/_types.h
index d71cdb0..c59afd3 100644
--- a/sys/sys/_types.h
+++ b/sys/sys/_types.h
@@ -38,6 +38,7 @@
typedef __uint32_t __blksize_t; /* file block size */
typedef __int64_t __blkcnt_t; /* file block count */
typedef __int32_t __clockid_t; /* clock_gettime()... */
+typedef __uint64_t __cap_rights_t; /* capability rights */
typedef __uint32_t __fflags_t; /* file flags */
typedef __uint64_t __fsblkcnt_t;
typedef __uint64_t __fsfilcnt_t;
diff --git a/sys/sys/bus.h b/sys/sys/bus.h
index e02bdd3..09b8911 100644
--- a/sys/sys/bus.h
+++ b/sys/sys/bus.h
@@ -247,6 +247,7 @@ STAILQ_HEAD(resource_list, resource_list_entry);
#define RLE_RESERVED 0x0001 /* Reserved by the parent bus. */
#define RLE_ALLOCATED 0x0002 /* Reserved resource is allocated. */
+#define RLE_PREFETCH 0x0004 /* Resource is a prefetch range. */
void resource_list_init(struct resource_list *rl);
void resource_list_free(struct resource_list *rl);
diff --git a/sys/sys/capability.h b/sys/sys/capability.h
index 04e7a10..dee2e7a 100644
--- a/sys/sys/capability.h
+++ b/sys/sys/capability.h
@@ -38,10 +38,56 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#include <sys/file.h>
+
+/*
+ * Possible rights on capabilities.
+ *
+ * Notes:
+ * Some system calls don't require a capability in order to perform an
+ * operation on an fd. These include: close, dup, dup2.
+ *
+ * sendfile is authorized using CAP_READ on the file and CAP_WRITE on the
+ * socket.
+ *
+ * mmap() and aio*() system calls will need special attention as they may
+ * involve reads or writes depending a great deal on context.
+ */
+#define CAP_READ 0x0000000000000001ULL /* read/recv */
+#define CAP_WRITE 0x0000000000000002ULL /* write/send */
+#define CAP_MMAP 0x0000000000000004ULL /* mmap */
+#define CAP_MAPEXEC 0x0000000000000008ULL /* mmap(2) as exec */
+#define CAP_MASK_VALID 0x000000000000000fULL
+
#ifdef _KERNEL
#define IN_CAPABILITY_MODE(td) (td->td_ucred->cr_flags & CRED_FLAG_CAPMODE)
+/*
+ * Create a capability to wrap a file object.
+ */
+int kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights,
+ struct file **cap, int *capfd);
+
+/*
+ * Unwrap a capability if its rights mask is a superset of 'rights'.
+ *
+ * Unwrapping a non-capability is effectively a no-op; the value of fp_cap
+ * is simply copied into fpp.
+ */
+int cap_funwrap(struct file *fp_cap, cap_rights_t rights,
+ struct file **fpp);
+int cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights,
+ u_char *maxprotp, struct file **fpp);
+
+/*
+ * For the purposes of procstat(1) and similar tools, allow kern_descrip.c to
+ * extract the rights from a capability. However, this should not be used by
+ * kernel code generally, instead cap_funwrap() should be used in order to
+ * keep all access control in one place.
+ */
+cap_rights_t cap_rights(struct file *fp_cap);
+
#else /* !_KERNEL */
__BEGIN_DECLS
@@ -64,6 +110,18 @@ int cap_enter(void);
*/
int cap_getmode(u_int* modep);
+/*
+ * cap_new(): Create a new capability derived from an existing file
+ * descriptor with the specified rights. If the existing file descriptor is
+ * a capability, then the new rights must be a subset of the existing rights.
+ */
+int cap_new(int fd, cap_rights_t rights);
+
+/*
+ * cap_getrights(): Query the rights on a capability.
+ */
+int cap_getrights(int fd, cap_rights_t *rightsp);
+
__END_DECLS
#endif /* !_KERNEL */
diff --git a/sys/sys/cpuset.h b/sys/sys/cpuset.h
index 030a874..3b2fdbb 100644
--- a/sys/sys/cpuset.h
+++ b/sys/sys/cpuset.h
@@ -131,6 +131,7 @@
#define CPU_SET_ATOMIC(n, p) \
atomic_set_long(&(p)->__bits[(n)/_NCPUBITS], __cpuset_mask(n))
+/* Convenience functions catering special cases. */
#define CPU_OR_ATOMIC(d, s) do { \
__size_t __i; \
for (__i = 0; __i < _NCPUWORDS; __i++) \
@@ -138,13 +139,6 @@
(s)->__bits[__i]); \
} while (0)
-#define CPU_NAND_ATOMIC(d, s) do { \
- __size_t __i; \
- for (__i = 0; __i < _NCPUWORDS; __i++) \
- atomic_clear_long(&(d)->__bits[__i], \
- (s)->__bits[__i]); \
-} while (0)
-
#define CPU_COPY_STORE_REL(f, t) do { \
__size_t __i; \
for (__i = 0; __i < _NCPUWORDS; __i++) \
diff --git a/sys/sys/diskmbr.h b/sys/sys/diskmbr.h
index 5aa275c..5b62e64 100644
--- a/sys/sys/diskmbr.h
+++ b/sys/sys/diskmbr.h
@@ -36,6 +36,7 @@
#include <sys/ioccom.h>
#define DOSBBSECTOR 0 /* DOS boot block relative sector number */
+#define DOSDSNOFF 440 /* WinNT/2K/XP Drive Serial Number offset */
#define DOSPARTOFF 446
#define DOSPARTSIZE 16
#define NDOSPART 4
diff --git a/sys/sys/diskpc98.h b/sys/sys/diskpc98.h
index c20ca6c..66bda90 100644
--- a/sys/sys/diskpc98.h
+++ b/sys/sys/diskpc98.h
@@ -36,8 +36,11 @@
#include <sys/ioccom.h>
#define DOSBBSECTOR 0 /* DOS boot block relative sector number */
+#undef DOSPARTOFF
#define DOSPARTOFF 0
+#undef DOSPARTSIZE
#define DOSPARTSIZE 32
+#undef NDOSPART
#define NDOSPART 16
#define DOSMAGICOFFSET 510
#define DOSMAGIC 0xAA55
@@ -52,6 +55,7 @@
#define DOSMID_386BSD (PC98_MID_386BSD | PC98_MID_BOOTABLE)
#define DOSSID_386BSD (PC98_SID_386BSD | PC98_SID_ACTIVE)
+#undef DOSPTYP_386BSD
#define DOSPTYP_386BSD (DOSSID_386BSD << 8 | DOSMID_386BSD)
struct pc98_partition {
diff --git a/sys/sys/dtrace_bsd.h b/sys/sys/dtrace_bsd.h
index 15e1be9..eb348b2 100644
--- a/sys/sys/dtrace_bsd.h
+++ b/sys/sys/dtrace_bsd.h
@@ -100,54 +100,73 @@ typedef void (*dtrace_malloc_probe_func_t)(u_int32_t, uintptr_t arg0,
extern dtrace_malloc_probe_func_t dtrace_malloc_probe;
-/* dtnfsclient NFSv3 access cache provider hooks. */
+/* dtnfsclient NFSv[34] access cache provider hooks. */
typedef void (*dtrace_nfsclient_accesscache_flush_probe_func_t)(uint32_t,
struct vnode *);
extern dtrace_nfsclient_accesscache_flush_probe_func_t
dtrace_nfsclient_accesscache_flush_done_probe;
+extern dtrace_nfsclient_accesscache_flush_probe_func_t
+ dtrace_nfscl_accesscache_flush_done_probe;
typedef void (*dtrace_nfsclient_accesscache_get_probe_func_t)(uint32_t,
struct vnode *, uid_t, uint32_t);
extern dtrace_nfsclient_accesscache_get_probe_func_t
dtrace_nfsclient_accesscache_get_hit_probe,
dtrace_nfsclient_accesscache_get_miss_probe;
+extern dtrace_nfsclient_accesscache_get_probe_func_t
+ dtrace_nfscl_accesscache_get_hit_probe,
+ dtrace_nfscl_accesscache_get_miss_probe;
typedef void (*dtrace_nfsclient_accesscache_load_probe_func_t)(uint32_t,
struct vnode *, uid_t, uint32_t, int);
extern dtrace_nfsclient_accesscache_load_probe_func_t
dtrace_nfsclient_accesscache_load_done_probe;
+extern dtrace_nfsclient_accesscache_load_probe_func_t
+ dtrace_nfscl_accesscache_load_done_probe;
-/* dtnfsclient NFSv[23] attribute cache provider hooks. */
+/* dtnfsclient NFSv[234] attribute cache provider hooks. */
typedef void (*dtrace_nfsclient_attrcache_flush_probe_func_t)(uint32_t,
struct vnode *);
extern dtrace_nfsclient_attrcache_flush_probe_func_t
dtrace_nfsclient_attrcache_flush_done_probe;
+extern dtrace_nfsclient_attrcache_flush_probe_func_t
+ dtrace_nfscl_attrcache_flush_done_probe;
typedef void (*dtrace_nfsclient_attrcache_get_hit_probe_func_t)(uint32_t,
struct vnode *, struct vattr *);
extern dtrace_nfsclient_attrcache_get_hit_probe_func_t
dtrace_nfsclient_attrcache_get_hit_probe;
+extern dtrace_nfsclient_attrcache_get_hit_probe_func_t
+ dtrace_nfscl_attrcache_get_hit_probe;
typedef void (*dtrace_nfsclient_attrcache_get_miss_probe_func_t)(uint32_t,
struct vnode *);
extern dtrace_nfsclient_attrcache_get_miss_probe_func_t
dtrace_nfsclient_attrcache_get_miss_probe;
+extern dtrace_nfsclient_attrcache_get_miss_probe_func_t
+ dtrace_nfscl_attrcache_get_miss_probe;
typedef void (*dtrace_nfsclient_attrcache_load_probe_func_t)(uint32_t,
struct vnode *, struct vattr *, int);
extern dtrace_nfsclient_attrcache_load_probe_func_t
dtrace_nfsclient_attrcache_load_done_probe;
+extern dtrace_nfsclient_attrcache_load_probe_func_t
+ dtrace_nfscl_attrcache_load_done_probe;
-/* dtnfsclient NFSv[23] RPC provider hooks. */
+/* dtnfsclient NFSv[234] RPC provider hooks. */
typedef void (*dtrace_nfsclient_nfs23_start_probe_func_t)(uint32_t,
struct vnode *, struct mbuf *, struct ucred *, int);
extern dtrace_nfsclient_nfs23_start_probe_func_t
dtrace_nfsclient_nfs23_start_probe;
+extern dtrace_nfsclient_nfs23_start_probe_func_t
+ dtrace_nfscl_nfs234_start_probe;
typedef void (*dtrace_nfsclient_nfs23_done_probe_func_t)(uint32_t,
struct vnode *, struct mbuf *, struct ucred *, int, int);
extern dtrace_nfsclient_nfs23_done_probe_func_t
dtrace_nfsclient_nfs23_done_probe;
+extern dtrace_nfsclient_nfs23_done_probe_func_t
+ dtrace_nfscl_nfs234_done_probe;
/*
* Functions which allow the dtrace module to check that the kernel
diff --git a/sys/sys/file.h b/sys/sys/file.h
index e4edac9..eea2c00 100644
--- a/sys/sys/file.h
+++ b/sys/sys/file.h
@@ -64,6 +64,7 @@ struct socket;
#define DTYPE_SEM 9 /* posix semaphore */
#define DTYPE_PTS 10 /* pseudo teletype master device */
#define DTYPE_DEV 11 /* Device specific fd type */
+#define DTYPE_CAPABILITY 12 /* capability */
#ifdef _KERNEL
@@ -178,6 +179,7 @@ extern volatile int openfiles; /* actual number of open files */
int fget(struct thread *td, int fd, struct file **fpp);
int fget_read(struct thread *td, int fd, struct file **fpp);
int fget_write(struct thread *td, int fd, struct file **fpp);
+int fgetcap(struct thread *td, int fd, struct file **fpp);
int _fdrop(struct file *fp, struct thread *td);
/*
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
index 33dddca..2dab741 100644
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -113,6 +113,8 @@ int dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd,
int mode, int error);
int falloc(struct thread *td, struct file **resultfp, int *resultfd,
int flags);
+int falloc_noinstall(struct thread *td, struct file **resultfp);
+int finstall(struct thread *td, struct file *fp, int *resultfp, int flags);
int fdalloc(struct thread *td, int minfd, int *result);
int fdavail(struct thread *td, int n);
int fdcheckstd(struct thread *td);
diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h
index 22b0285..7f17bda 100644
--- a/sys/sys/kbio.h
+++ b/sys/sys/kbio.h
@@ -120,6 +120,20 @@ struct keymap {
};
typedef struct keymap keymap_t;
+#ifdef _KERNEL
+struct okeyent_t {
+ u_char map[NUM_STATES];
+ u_char spcl;
+ u_char flgs;
+};
+
+struct okeymap {
+ u_short n_keys;
+ struct okeyent_t key[NUM_KEYS];
+};
+typedef struct okeymap okeymap_t;
+#endif /* _KERNEL */
+
#endif /* !_KEYMAP_DECLARED */
/* defines for "special" keys (spcl bit set in keymap) */
@@ -223,6 +237,10 @@ typedef struct fkeyarg fkeyarg_t;
/* XXX: Should have keymap_t as an argument, but that's too big for ioctl()! */
#define GIO_KEYMAP _IO('k', 6)
#define PIO_KEYMAP _IO('k', 7)
+#ifdef _KERNEL
+#define OGIO_KEYMAP _IOR('k', 6, okeymap_t)
+#define OPIO_KEYMAP _IOW('k', 7, okeymap_t)
+#endif /* _KERNEL */
#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h
index c2b7081..b186f79 100644
--- a/sys/sys/mbuf.h
+++ b/sys/sys/mbuf.h
@@ -695,6 +695,16 @@ m_last(struct mbuf *m)
return (m);
}
+extern void (*m_addr_chg_pf_p)(struct mbuf *m);
+
+static __inline void
+m_addr_changed(struct mbuf *m)
+{
+
+ if (m_addr_chg_pf_p)
+ m_addr_chg_pf_p(m);
+}
+
/*
* mbuf, cluster, and external object allocation macros (for compatibility
* purposes).
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 838769f..4f54eac 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -58,7 +58,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 900038 /* Master, propagated to newvers */
+#define __FreeBSD_version 900039 /* Master, propagated to newvers */
#ifdef _KERNEL
#define P_OSREL_SIGSEGV 700004
@@ -319,4 +319,10 @@ __END_DECLS
#define member2struct(s, m, x) \
((struct s *)(void *)((char *)(x) - offsetof(struct s, m)))
+/*
+ * Access a variable length array that has been declared as a fixed
+ * length array.
+ */
+#define __PAST_END(array, offset) (((typeof(*(array)) *)(array))[offset])
+
#endif /* _SYS_PARAM_H_ */
diff --git a/sys/sys/pcpu.h b/sys/sys/pcpu.h
index e6044a7..b25fcc8 100644
--- a/sys/sys/pcpu.h
+++ b/sys/sys/pcpu.h
@@ -146,7 +146,7 @@ struct rm_queue {
struct rm_queue* volatile rmq_prev;
};
-#define PCPU_NAME_LEN (sizeof("CPU ") + sizeof(__XSTRING(MAXCPU) + 1))
+#define PCPU_NAME_LEN (sizeof("CPU ") + sizeof(__XSTRING(MAXCPU)) - 1)
/*
* This structure maps out the global data that needs to be kept on a
@@ -196,18 +196,6 @@ struct pcpu {
* if only to make kernel debugging easier.
*/
PCPU_MD_FIELDS;
-
- /*
- * XXX
- * For the time being, keep the cpuset_t objects as the very last
- * members of the structure.
- * They are actually tagged to be removed soon, but as long as this
- * does not happen, it is necessary to find a way to implement
- * easilly interfaces to userland and leaving them last makes that
- * possible.
- */
- cpuset_t pc_cpumask; /* This cpu mask */
- cpuset_t pc_other_cpus; /* Mask of all other cpus */
} __aligned(CACHE_LINE_SIZE);
#ifdef _KERNEL
diff --git a/sys/sys/priv.h b/sys/sys/priv.h
index 7733e36..b984f1a 100644
--- a/sys/sys/priv.h
+++ b/sys/sys/priv.h
@@ -337,6 +337,7 @@
#define PRIV_NET_GIF 416 /* Administer gif interface. */
#define PRIV_NET_SETIFVNET 417 /* Move interface to vnet. */
#define PRIV_NET_SETIFDESCR 418 /* Set interface description. */
+#define PRIV_NET_SETIFFIB 419 /* Set interface fib. */
/*
* 802.11-related privileges.
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index c54a956..233efe9 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -393,7 +393,7 @@ do { \
#define TDP_COWINPROGRESS 0x00000010 /* Snapshot copy-on-write in progress. */
#define TDP_ALTSTACK 0x00000020 /* Have alternate signal stack. */
#define TDP_DEADLKTREAT 0x00000040 /* Lock aquisition - deadlock treatment. */
-#define TDP_UNUSED80 0x00000080 /* available. */
+#define TDP_NOFAULTING 0x00000080 /* Do not handle page faults. */
#define TDP_NOSLEEPING 0x00000100 /* Thread is not allowed to sleep on a sq. */
#define TDP_OWEUPC 0x00000200 /* Call addupc() at next AST. */
#define TDP_ITHREAD 0x00000400 /* Thread is an interrupt thread. */
@@ -913,6 +913,25 @@ void thread_unthread(struct thread *td);
void thread_wait(struct proc *p);
struct thread *thread_find(struct proc *p, lwpid_t tid);
+static __inline int
+curthread_pflags_set(int flags)
+{
+ struct thread *td;
+ int save;
+
+ td = curthread;
+ save = ~flags | (td->td_pflags & flags);
+ td->td_pflags |= flags;
+ return (save);
+}
+
+static __inline void
+curthread_pflags_restore(int save)
+{
+
+ curthread->td_pflags &= save;
+}
+
#endif /* _KERNEL */
#endif /* !_SYS_PROC_H_ */
diff --git a/sys/sys/racct.h b/sys/sys/racct.h
index 222dbce..119b333 100644
--- a/sys/sys/racct.h
+++ b/sys/sys/racct.h
@@ -73,7 +73,7 @@ struct ucred;
/*
* Resource properties.
*/
-#define RACCT_IN_THOUSANDS 0x01
+#define RACCT_IN_MILLIONS 0x01
#define RACCT_RECLAIMABLE 0x02
#define RACCT_INHERITABLE 0x04
#define RACCT_DENIABLE 0x08
@@ -82,35 +82,35 @@ struct ucred;
extern int racct_types[];
/*
- * Amount stored in c_resources[] is thousand times bigger than what's
+ * Amount stored in c_resources[] is 10**6 times bigger than what's
* visible to the userland. It gets fixed up when retrieving resource
* usage or adding rules.
*/
-#define racct_is_in_thousands(X) (racct_types[X] & RACCT_IN_THOUSANDS)
+#define RACCT_IS_IN_MILLIONS(X) (racct_types[X] & RACCT_IN_MILLIONS)
/*
* Resource usage can drop, as opposed to only grow.
*/
-#define racct_is_reclaimable(X) (racct_types[X] & RACCT_RECLAIMABLE)
+#define RACCT_IS_RECLAIMABLE(X) (racct_types[X] & RACCT_RECLAIMABLE)
/*
* Children inherit resource usage.
*/
-#define racct_is_inheritable(X) (racct_types[X] & RACCT_INHERITABLE)
+#define RACCT_IS_INHERITABLE(X) (racct_types[X] & RACCT_INHERITABLE)
/*
* racct_{add,set}(9) can actually return an error and not update resource
* usage counters. Note that even when resource is not deniable, allocating
* resource might cause signals to be sent by RCTL code.
*/
-#define racct_is_deniable(X) (racct_types[X] & RACCT_DENIABLE)
+#define RACCT_IS_DENIABLE(X) (racct_types[X] & RACCT_DENIABLE)
/*
* Per-process resource usage information makes no sense, but per-credential
* one does. This kind of resources are usually allocated for process, but
* freed using credentials.
*/
-#define racct_is_sloppy(X) (racct_types[X] & RACCT_SLOPPY)
+#define RACCT_IS_SLOPPY(X) (racct_types[X] & RACCT_SLOPPY)
/*
* The 'racct' structure defines resource consumption for a particular
diff --git a/sys/sys/sem.h b/sys/sys/sem.h
index cce28f0..f52bc0c 100644
--- a/sys/sys/sem.h
+++ b/sys/sys/sem.h
@@ -107,8 +107,7 @@ union semun {
* semaphore info struct
*/
struct seminfo {
- int semmap, /* # of entries in semaphore map */
- semmni, /* # of semaphore identifiers */
+ int semmni, /* # of semaphore identifiers */
semmns, /* # of semaphores in system */
semmnu, /* # of undo structures in system */
semmsl, /* max # of semaphores per id */
diff --git a/sys/sys/sockio.h b/sys/sys/sockio.h
index 4c1c483..8922699 100644
--- a/sys/sys/sockio.h
+++ b/sys/sys/sockio.h
@@ -110,6 +110,9 @@
#define SIOCSIFVNET _IOWR('i', 90, struct ifreq) /* move IF jail/vnet */
#define SIOCSIFRVNET _IOWR('i', 91, struct ifreq) /* reclaim vnet IF */
+#define SIOCGIFFIB _IOWR('i', 92, struct ifreq) /* get IF fib */
+#define SIOCSIFFIB _IOW('i', 93, struct ifreq) /* set IF fib */
+
#define SIOCSDRVSPEC _IOW('i', 123, struct ifdrv) /* set driver-specific
parameters */
#define SIOCGDRVSPEC _IOWR('i', 123, struct ifdrv) /* get driver-specific
diff --git a/sys/sys/soundcard.h b/sys/sys/soundcard.h
index a6817df..2916287 100644
--- a/sys/sys/soundcard.h
+++ b/sys/sys/soundcard.h
@@ -311,8 +311,7 @@ typedef struct _snd_capabilities {
* IOCTL Commands for /dev/sequencer
*/
-#define SNDCTL_SEQ_HALT _IO ('Q', 0)
-#define SNDCTL_SEQ_RESET SNDCTL_SEQ_HALT /* Historic interface */
+#define SNDCTL_SEQ_RESET _IO ('Q', 0)
#define SNDCTL_SEQ_SYNC _IO ('Q', 1)
#define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info)
#define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int) /* Set/get timer res.(hz) */
@@ -776,7 +775,8 @@ typedef struct {
* IOCTL commands for /dev/dsp and /dev/audio
*/
-#define SNDCTL_DSP_RESET _IO ('P', 0)
+#define SNDCTL_DSP_HALT _IO ('P', 0)
+#define SNDCTL_DSP_RESET SNDCTL_DSP_HALT
#define SNDCTL_DSP_SYNC _IO ('P', 1)
#define SNDCTL_DSP_SPEED _IOWR('P', 2, int)
#define SNDCTL_DSP_STEREO _IOWR('P', 3, int)
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 8be00de..fa4f46f 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -430,6 +430,8 @@
#define SYS_msgctl 511
#define SYS_shmctl 512
#define SYS_lpathconf 513
+#define SYS_cap_new 514
+#define SYS_cap_getrights 515
#define SYS_cap_enter 516
#define SYS_cap_getmode 517
#define SYS_pselect 522
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index 2f8e7b3..544bbf4 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -379,6 +379,8 @@ MIASM = \
msgctl.o \
shmctl.o \
lpathconf.o \
+ cap_new.o \
+ cap_getrights.o \
cap_enter.o \
cap_getmode.o \
pselect.o \
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 0965b72..90e0449 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -1657,6 +1657,14 @@ struct lpathconf_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)];
};
+struct cap_new_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char rights_l_[PADL_(u_int64_t)]; u_int64_t rights; char rights_r_[PADR_(u_int64_t)];
+};
+struct cap_getrights_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char rightsp_l_[PADL_(u_int64_t *)]; u_int64_t * rightsp; char rightsp_r_[PADR_(u_int64_t *)];
+};
struct cap_enter_args {
register_t dummy;
};
@@ -2073,6 +2081,8 @@ int __semctl(struct thread *, struct __semctl_args *);
int msgctl(struct thread *, struct msgctl_args *);
int shmctl(struct thread *, struct shmctl_args *);
int lpathconf(struct thread *, struct lpathconf_args *);
+int cap_new(struct thread *, struct cap_new_args *);
+int cap_getrights(struct thread *, struct cap_getrights_args *);
int cap_enter(struct thread *, struct cap_enter_args *);
int cap_getmode(struct thread *, struct cap_getmode_args *);
int pselect(struct thread *, struct pselect_args *);
@@ -2758,6 +2768,8 @@ int freebsd7_shmctl(struct thread *, struct freebsd7_shmctl_args *);
#define SYS_AUE_msgctl AUE_MSGCTL
#define SYS_AUE_shmctl AUE_SHMCTL
#define SYS_AUE_lpathconf AUE_LPATHCONF
+#define SYS_AUE_cap_new AUE_CAP_NEW
+#define SYS_AUE_cap_getrights AUE_CAP_GETRIGHTS
#define SYS_AUE_cap_enter AUE_CAP_ENTER
#define SYS_AUE_cap_getmode AUE_CAP_GETMODE
#define SYS_AUE_pselect AUE_SELECT
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index e563a5a..8b0de57 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -217,8 +217,12 @@ int copyinstr(const void * __restrict udaddr, void * __restrict kaddr,
__nonnull(1) __nonnull(2);
int copyin(const void * __restrict udaddr, void * __restrict kaddr,
size_t len) __nonnull(1) __nonnull(2);
+int copyin_nofault(const void * __restrict udaddr, void * __restrict kaddr,
+ size_t len) __nonnull(1) __nonnull(2);
int copyout(const void * __restrict kaddr, void * __restrict udaddr,
size_t len) __nonnull(1) __nonnull(2);
+int copyout_nofault(const void * __restrict kaddr, void * __restrict udaddr,
+ size_t len) __nonnull(1) __nonnull(2);
int fubyte(const void *base);
long fuword(const void *base);
@@ -253,6 +257,7 @@ void cpu_startprofclock(void);
void cpu_stopprofclock(void);
void cpu_idleclock(void);
void cpu_activeclock(void);
+extern int cpu_can_deep_sleep;
extern int cpu_disable_deep_sleep;
int cr_cansee(struct ucred *u1, struct ucred *u2);
@@ -391,4 +396,15 @@ bitcount32(uint32_t x)
return (x);
}
+static __inline uint16_t
+bitcount16(uint32_t x)
+{
+
+ x = (x & 0x5555) + ((x & 0xaaaa) >> 1);
+ x = (x & 0x3333) + ((x & 0xcccc) >> 2);
+ x = (x + (x >> 4)) & 0x0f0f;
+ x = (x + (x >> 8)) & 0x00ff;
+ return (x);
+}
+
#endif /* !_SYS_SYSTM_H_ */
diff --git a/sys/sys/timetc.h b/sys/sys/timetc.h
index dc1dea4..4f75c3d 100644
--- a/sys/sys/timetc.h
+++ b/sys/sys/timetc.h
@@ -47,7 +47,7 @@ struct timecounter {
*/
u_int tc_counter_mask;
/* This mask should mask off any unimplemented bits. */
- u_int64_t tc_frequency;
+ uint64_t tc_frequency;
/* Frequency of the counter in Hz. */
char *tc_name;
/* Name of the timecounter. */
@@ -57,6 +57,8 @@ struct timecounter {
* another timecounter higher means better. Negative
* means "only use at explicit request".
*/
+ u_int tc_flags;
+#define TC_FLAGS_C3STOP 1 /* Timer dies in C3. */
void *tc_priv;
/* Pointer to the timecounter's private parts. */
diff --git a/sys/sys/tty.h b/sys/sys/tty.h
index c594e11..42f264b 100644
--- a/sys/sys/tty.h
+++ b/sys/sys/tty.h
@@ -152,6 +152,11 @@ struct xtty {
#ifdef _KERNEL
+/* Used to distinguish between normal, callout, lock and init devices. */
+#define TTYUNIT_INIT 0x1
+#define TTYUNIT_LOCK 0x2
+#define TTYUNIT_CALLOUT 0x4
+
/* Allocation and deallocation. */
struct tty *tty_alloc(struct ttydevsw *tsw, void *softc);
struct tty *tty_alloc_mutex(struct ttydevsw *tsw, void *softc, struct mtx *mtx);
diff --git a/sys/sys/ttydevsw.h b/sys/sys/ttydevsw.h
index 4506919..748ae0b 100644
--- a/sys/sys/ttydevsw.h
+++ b/sys/sys/ttydevsw.h
@@ -46,6 +46,8 @@ typedef void tsw_outwakeup_t(struct tty *tp);
typedef void tsw_inwakeup_t(struct tty *tp);
typedef int tsw_ioctl_t(struct tty *tp, u_long cmd, caddr_t data,
struct thread *td);
+typedef int tsw_cioctl_t(struct tty *tp, int unit, u_long cmd, caddr_t data,
+ struct thread *td);
typedef int tsw_param_t(struct tty *tp, struct termios *t);
typedef int tsw_modem_t(struct tty *tp, int sigon, int sigoff);
typedef int tsw_mmap_t(struct tty *tp, vm_ooffset_t offset,
@@ -63,6 +65,7 @@ struct ttydevsw {
tsw_inwakeup_t *tsw_inwakeup; /* Input can be stored again. */
tsw_ioctl_t *tsw_ioctl; /* ioctl() hooks. */
+ tsw_cioctl_t *tsw_cioctl; /* ioctl() on control devices. */
tsw_param_t *tsw_param; /* TIOCSETA device parameter setting. */
tsw_modem_t *tsw_modem; /* Modem sigon/sigoff. */
@@ -70,6 +73,8 @@ struct ttydevsw {
tsw_pktnotify_t *tsw_pktnotify; /* TIOCPKT events. */
tsw_free_t *tsw_free; /* Destructor. */
+
+ void *tsw_spare[4]; /* For future use. */
};
static __inline int
@@ -126,6 +131,15 @@ ttydevsw_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
}
static __inline int
+ttydevsw_cioctl(struct tty *tp, int unit, u_long cmd, caddr_t data, struct thread *td)
+{
+ tty_lock_assert(tp, MA_OWNED);
+ MPASS(!tty_gone(tp));
+
+ return tp->t_devsw->tsw_cioctl(tp, unit, cmd, data, td);
+}
+
+static __inline int
ttydevsw_param(struct tty *tp, struct termios *t)
{
MPASS(!tty_gone(tp));
diff --git a/sys/sys/types.h b/sys/sys/types.h
index cb513af..1b994d3 100644
--- a/sys/sys/types.h
+++ b/sys/sys/types.h
@@ -89,6 +89,8 @@ typedef __blkcnt_t blkcnt_t;
#define _BLKCNT_T_DECLARED
#endif
+typedef __cap_rights_t cap_rights_t;
+
#ifndef _CLOCK_T_DECLARED
typedef __clock_t clock_t;
#define _CLOCK_T_DECLARED
diff --git a/sys/sys/uio.h b/sys/sys/uio.h
index d7fa124..5df279b 100644
--- a/sys/sys/uio.h
+++ b/sys/sys/uio.h
@@ -100,6 +100,7 @@ int uiomove(void *cp, int n, struct uio *uio);
int uiomove_frombuf(void *buf, int buflen, struct uio *uio);
int uiomove_fromphys(struct vm_page *ma[], vm_offset_t offset, int n,
struct uio *uio);
+int uiomove_nofault(void *cp, int n, struct uio *uio);
int uiomoveco(void *cp, int n, struct uio *uio, int disposable);
#else /* !_KERNEL */
diff --git a/sys/sys/unistd.h b/sys/sys/unistd.h
index 378308d..9d56a3a 100644
--- a/sys/sys/unistd.h
+++ b/sys/sys/unistd.h
@@ -180,8 +180,16 @@
#define RFLINUXTHPN (1<<16) /* do linux clone exit parent notification */
#define RFSTOPPED (1<<17) /* leave child in a stopped state */
#define RFHIGHPID (1<<18) /* use a pid higher than 10 (idleproc) */
+#define RFTSIGZMB (1<<19) /* select signal for exit parent notification */
+#define RFTSIGSHIFT 20 /* selected signal number is in bits 20-27 */
+#define RFTSIGMASK 0xFF
+#define RFTSIGNUM(flags) (((flags) >> RFTSIGSHIFT) & RFTSIGMASK)
+#define RFTSIGFLAGS(signum) ((signum) << RFTSIGSHIFT)
#define RFPPWAIT (1<<31) /* parent sleeps until child exits (vfork) */
#define RFKERNELONLY (RFSTOPPED | RFHIGHPID | RFPPWAIT)
+#define RFFLAGS (RFFDG | RFPROC | RFMEM | RFNOWAIT | RFCFDG | \
+ RFTHREAD | RFSIGSHARE | RFLINUXTHPN | RFSTOPPED | RFHIGHPID | RFTSIGZMB | \
+ RFPPWAIT)
#endif /* __BSD_VISIBLE */
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 40f9a6a..1c4c7b7 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -75,12 +75,9 @@ struct vpollinfo {
* Lock reference:
* c - namecache mutex
* f - freelist mutex
- * G - Giant
* i - interlock
- * m - mntvnodes mutex
+ * m - mount point interlock
* p - pollinfo lock
- * s - spechash mutex
- * S - syncer mutex
* u - Only a reference to the vnode is needed to read.
* v - vnode lock
*
@@ -165,7 +162,7 @@ struct vnode {
/*
* Hooks for various subsystems and features.
*/
- struct vpollinfo *v_pollinfo; /* G Poll events, p for *v_pi */
+ struct vpollinfo *v_pollinfo; /* i Poll events, p for *v_pi */
struct label *v_label; /* MAC label for vnode */
struct lockf *v_lockf; /* Byte-level lock list */
};
diff --git a/sys/teken/demo/teken_demo.c b/sys/teken/demo/teken_demo.c
index 0700763..16bb4b7 100644
--- a/sys/teken/demo/teken_demo.c
+++ b/sys/teken/demo/teken_demo.c
@@ -88,7 +88,7 @@ printchar(const teken_pos_t *p)
getyx(stdscr, y, x);
- px = &buffer[p->tp_col][p->tp_row];
+ px = &buffer[p->tp_col][p->tp_row];
/* Convert Unicode to UTF-8. */
if (px->c < 0x80) {
@@ -169,10 +169,10 @@ test_copy(void *s __unused, const teken_rect_t *r, const teken_pos_t *p)
* Copying is a little tricky. We must make sure we do it in
* correct order, to make sure we don't overwrite our own data.
*/
-
+
nrow = r->tr_end.tp_row - r->tr_begin.tp_row;
ncol = r->tr_end.tp_col - r->tr_begin.tp_col;
-
+
if (p->tp_row < r->tr_begin.tp_row) {
/* Copy from top to bottom. */
if (p->tp_col < r->tr_begin.tp_col) {
diff --git a/sys/teken/gensequences b/sys/teken/gensequences
index 86c7979..e0fccd4 100644
--- a/sys/teken/gensequences
+++ b/sys/teken/gensequences
@@ -3,7 +3,7 @@
#-
# Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
# All rights reserved.
-#
+#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
@@ -12,7 +12,7 @@
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
-#
+#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
diff --git a/sys/teken/libteken/teken.3 b/sys/teken/libteken/teken.3
index 2a9b291..1c2ebbe 100644
--- a/sys/teken/libteken/teken.3
+++ b/sys/teken/libteken/teken.3
@@ -148,7 +148,7 @@ These defaults can be modified using
and
.Fn teken_set_defattr .
.Pp
-The
+The
.Fn teken_get_sequence
function is a utility function that can be used to obtain escape
sequences of special keyboard keys, generated by user input.
diff --git a/sys/teken/teken.c b/sys/teken/teken.c
index cdc2cb3..8ca88d2 100644
--- a/sys/teken/teken.c
+++ b/sys/teken/teken.c
@@ -526,7 +526,7 @@ teken_get_sequence(teken_t *t, unsigned int k)
/* Default xterm sequences. */
if (k < sizeof special_strings_normal / sizeof(char *))
return (special_strings_normal[k]);
-
+
return (NULL);
}
diff --git a/sys/teken/teken_subr.h b/sys/teken/teken_subr.h
index 2934bcc..f4c78f4 100644
--- a/sys/teken/teken_subr.h
+++ b/sys/teken/teken_subr.h
@@ -260,7 +260,7 @@ teken_subr_cursor_backward_tabulation(teken_t *t, unsigned int ntabs)
break;
t->t_cursor.tp_col--;
-
+
/* Tab marker set. */
if (teken_tab_isset(t, t->t_cursor.tp_col))
ntabs--;
@@ -303,7 +303,7 @@ teken_subr_cursor_forward_tabulation(teken_t *t, unsigned int ntabs)
break;
t->t_cursor.tp_col++;
-
+
/* Tab marker set. */
if (teken_tab_isset(t, t->t_cursor.tp_col))
ntabs--;
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 7d7866c..82506fb 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -1829,7 +1829,7 @@ gotit:
}
UFS_UNLOCK(ump);
if (DOINGSOFTDEP(ITOV(ip)))
- softdep_setup_inomapdep(bp, ip, cg * fs->fs_ipg + ipref);
+ softdep_setup_inomapdep(bp, ip, cg * fs->fs_ipg + ipref, mode);
bdwrite(bp);
if (ibp != NULL)
bawrite(ibp);
@@ -2038,7 +2038,11 @@ ffs_blkfree(ump, fs, devvp, bno, size, inum, vtype, dephd)
ffs_snapblkfree(fs, devvp, bno, size, inum, vtype, dephd)) {
return;
}
- if (!ump->um_candelete) {
+ /*
+ * Nothing to delay if TRIM is disabled, or the operation is
+ * performed on the snapshot.
+ */
+ if (!ump->um_candelete || devvp->v_type == VREG) {
ffs_blkfree_cg(ump, fs, devvp, bno, size, inum, dephd);
return;
}
@@ -2377,6 +2381,18 @@ ffs_fserr(fs, inum, cp)
* in the current directory is oldvalue then change it to newvalue.
* unlink(nameptr, oldvalue) - Verify that the inode number associated
* with nameptr in the current directory is oldvalue then unlink it.
+ *
+ * The following functions may only be used on a quiescent filesystem
+ * by the soft updates journal. They are not safe to be run on an active
+ * filesystem.
+ *
+ * setinode(inode, dip) - the specified disk inode is replaced with the
+ * contents pointed to by dip.
+ * setbufoutput(fd, flags) - output associated with the specified file
+ * descriptor (which must reference the character device supporting
+ * the filesystem) switches from using physio to running through the
+ * buffer cache when flags is set to 1. The descriptor reverts to
+ * physio for output when flags is set to zero.
*/
static int sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS);
@@ -2423,11 +2439,21 @@ static SYSCTL_NODE(_vfs_ffs, FFS_SET_DOTDOT, setdotdot, CTLFLAG_WR,
static SYSCTL_NODE(_vfs_ffs, FFS_UNLINK, unlink, CTLFLAG_WR,
sysctl_ffs_fsck, "Unlink a Duplicate Name");
+static SYSCTL_NODE(_vfs_ffs, FFS_SET_INODE, setinode, CTLFLAG_WR,
+ sysctl_ffs_fsck, "Update an On-Disk Inode");
+
+static SYSCTL_NODE(_vfs_ffs, FFS_SET_BUFOUTPUT, setbufoutput, CTLFLAG_WR,
+ sysctl_ffs_fsck, "Set Buffered Writing for Descriptor");
+
+#define DEBUG 1
#ifdef DEBUG
-static int fsckcmds = 0;
+static int fsckcmds = 1;
SYSCTL_INT(_debug, OID_AUTO, fsckcmds, CTLFLAG_RW, &fsckcmds, 0, "");
#endif /* DEBUG */
+static int buffered_write(struct file *, struct uio *, struct ucred *,
+ int, struct thread *);
+
static int
sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
{
@@ -2441,8 +2467,10 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
ufs2_daddr_t blkno;
long blkcnt, blksize;
struct filedesc *fdp;
- struct file *fp;
+ struct file *fp, *vfp;
int vfslocked, filetype, error;
+ static struct fileops *origops, bufferedops;
+ static int outcnt = 0;
if (req->newlen > sizeof cmd)
return (EBADRPC);
@@ -2450,7 +2478,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
return (error);
if (cmd.version != FFS_CMD_VERSION)
return (ERPCMISMATCH);
- if ((error = getvnode(curproc->p_fd, cmd.handle, &fp)) != 0)
+ if ((error = getvnode(td->td_proc->p_fd, cmd.handle, &fp)) != 0)
return (error);
vp = fp->f_data;
if (vp->v_type != VREG && vp->v_type != VDIR) {
@@ -2463,12 +2491,13 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
fdrop(fp, td);
return (EINVAL);
}
- if (mp->mnt_flag & MNT_RDONLY) {
+ ump = VFSTOUFS(mp);
+ if ((mp->mnt_flag & MNT_RDONLY) &&
+ ump->um_fsckpid != td->td_proc->p_pid) {
vn_finished_write(mp);
fdrop(fp, td);
return (EROFS);
}
- ump = VFSTOUFS(mp);
fs = ump->um_fs;
filetype = IFREG;
@@ -2489,7 +2518,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
case FFS_ADJ_REFCNT:
#ifdef DEBUG
if (fsckcmds) {
- printf("%s: adjust inode %jd count by %jd\n",
+ printf("%s: adjust inode %jd link count by %jd\n",
mp->mnt_stat.f_mntonname, (intmax_t)cmd.value,
(intmax_t)cmd.size);
}
@@ -2500,7 +2529,8 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
ip->i_nlink += cmd.size;
DIP_SET(ip, i_nlink, ip->i_nlink);
ip->i_effnlink += cmd.size;
- ip->i_flag |= IN_CHANGE;
+ ip->i_flag |= IN_CHANGE | IN_MODIFIED;
+ error = ffs_update(vp, 1);
if (DOINGSOFTDEP(vp))
softdep_change_linkcnt(ip);
vput(vp);
@@ -2518,7 +2548,8 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
break;
ip = VTOI(vp);
DIP_SET(ip, i_blocks, DIP(ip, i_blocks) + cmd.size);
- ip->i_flag |= IN_CHANGE;
+ ip->i_flag |= IN_CHANGE | IN_MODIFIED;
+ error = ffs_update(vp, 1);
vput(vp);
break;
@@ -2718,6 +2749,78 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
UIO_USERSPACE, (ino_t)cmd.size);
break;
+ case FFS_SET_INODE:
+ if (ump->um_fsckpid != td->td_proc->p_pid) {
+ error = EPERM;
+ break;
+ }
+#ifdef DEBUG
+ if (fsckcmds && outcnt++ < 100) {
+ printf("%s: update inode %jd\n",
+ mp->mnt_stat.f_mntonname, (intmax_t)cmd.value);
+ }
+#endif /* DEBUG */
+ if ((error = ffs_vget(mp, (ino_t)cmd.value, LK_EXCLUSIVE, &vp)))
+ break;
+ vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+ AUDIT_ARG_VNODE1(vp);
+ ip = VTOI(vp);
+ if (ip->i_ump->um_fstype == UFS1)
+ error = copyin((void *)(intptr_t)cmd.size, ip->i_din1,
+ sizeof(struct ufs1_dinode));
+ else
+ error = copyin((void *)(intptr_t)cmd.size, ip->i_din2,
+ sizeof(struct ufs2_dinode));
+ if (error) {
+ vput(vp);
+ VFS_UNLOCK_GIANT(vfslocked);
+ break;
+ }
+ ip->i_flag |= IN_CHANGE | IN_MODIFIED;
+ error = ffs_update(vp, 1);
+ vput(vp);
+ VFS_UNLOCK_GIANT(vfslocked);
+ break;
+
+ case FFS_SET_BUFOUTPUT:
+ if (ump->um_fsckpid != td->td_proc->p_pid) {
+ error = EPERM;
+ break;
+ }
+ if (VTOI(vp)->i_ump != ump) {
+ error = EINVAL;
+ break;
+ }
+#ifdef DEBUG
+ if (fsckcmds) {
+ printf("%s: %s buffered output for descriptor %jd\n",
+ mp->mnt_stat.f_mntonname,
+ cmd.size == 1 ? "enable" : "disable",
+ (intmax_t)cmd.value);
+ }
+#endif /* DEBUG */
+ if ((error = getvnode(td->td_proc->p_fd, cmd.value, &vfp)) != 0)
+ break;
+ if (vfp->f_vnode->v_type != VCHR) {
+ fdrop(vfp, td);
+ error = EINVAL;
+ break;
+ }
+ if (origops == NULL) {
+ origops = vfp->f_ops;
+ bcopy((void *)origops, (void *)&bufferedops,
+ sizeof(bufferedops));
+ bufferedops.fo_write = buffered_write;
+ }
+ if (cmd.size == 1)
+ atomic_store_rel_ptr((volatile uintptr_t *)&vfp->f_ops,
+ (uintptr_t)&bufferedops);
+ else
+ atomic_store_rel_ptr((volatile uintptr_t *)&vfp->f_ops,
+ (uintptr_t)origops);
+ fdrop(vfp, td);
+ break;
+
default:
#ifdef DEBUG
if (fsckcmds) {
@@ -2733,3 +2836,73 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS)
vn_finished_write(mp);
return (error);
}
+
+/*
+ * Function to switch a descriptor to use the buffer cache to stage
+ * its I/O. This is needed so that writes to the filesystem device
+ * will give snapshots a chance to copy modified blocks for which it
+ * needs to retain copies.
+ */
+static int
+buffered_write(fp, uio, active_cred, flags, td)
+ struct file *fp;
+ struct uio *uio;
+ struct ucred *active_cred;
+ int flags;
+ struct thread *td;
+{
+ struct vnode *devvp;
+ struct inode *ip;
+ struct buf *bp;
+ struct fs *fs;
+ int error, vfslocked;
+ daddr_t lbn;
+ static int outcnt = 0;
+
+ /*
+ * The devvp is associated with the /dev filesystem. To discover
+ * the filesystem with which the device is associated, we depend
+ * on the application setting the current directory to a location
+ * within the filesystem being written. Yes, this is an ugly hack.
+ */
+ devvp = fp->f_vnode;
+ ip = VTOI(td->td_proc->p_fd->fd_cdir);
+ if (ip->i_devvp != devvp)
+ return (EINVAL);
+ fs = ip->i_fs;
+ vfslocked = VFS_LOCK_GIANT(ip->i_vnode->v_mount);
+ vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
+ if ((flags & FOF_OFFSET) == 0)
+ uio->uio_offset = fp->f_offset;
+#ifdef DEBUG
+ if (fsckcmds && outcnt++ < 100) {
+ printf("%s: buffered write for block %jd\n",
+ fs->fs_fsmnt, (intmax_t)btodb(uio->uio_offset));
+ }
+#endif /* DEBUG */
+ /*
+ * All I/O must be contained within a filesystem block, start on
+ * a fragment boundary, and be a multiple of fragments in length.
+ */
+ if (uio->uio_resid > fs->fs_bsize - (uio->uio_offset % fs->fs_bsize) ||
+ fragoff(fs, uio->uio_offset) != 0 ||
+ fragoff(fs, uio->uio_resid) != 0) {
+ error = EINVAL;
+ goto out;
+ }
+ lbn = numfrags(fs, uio->uio_offset);
+ bp = getblk(devvp, lbn, uio->uio_resid, 0, 0, 0);
+ bp->b_flags |= B_RELBUF;
+ if ((error = uiomove((char *)bp->b_data, uio->uio_resid, uio)) != 0) {
+ brelse(bp);
+ goto out;
+ }
+ error = bwrite(bp);
+ if ((flags & FOF_OFFSET) == 0)
+ fp->f_offset = uio->uio_offset;
+ fp->f_nextoff = uio->uio_offset;
+out:
+ VOP_UNLOCK(devvp, 0);
+ VFS_UNLOCK_GIANT(vfslocked);
+ return (error);
+}
diff --git a/sys/ufs/ffs/ffs_balloc.c b/sys/ufs/ffs/ffs_balloc.c
index 63a4eba..f6b078f 100644
--- a/sys/ufs/ffs/ffs_balloc.c
+++ b/sys/ufs/ffs/ffs_balloc.c
@@ -234,9 +234,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, int size,
if (num < 1)
panic ("ffs_balloc_ufs1: ufs_getlbns returned indirect block");
#endif
- saved_inbdflush = ~TDP_INBDFLUSH | (curthread->td_pflags &
- TDP_INBDFLUSH);
- curthread->td_pflags |= TDP_INBDFLUSH;
+ saved_inbdflush = curthread_pflags_set(TDP_INBDFLUSH);
/*
* Fetch the first indirect block allocating if necessary.
*/
@@ -250,7 +248,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, int size,
pref = ffs_blkpref_ufs1(ip, lbn, 0, (ufs1_daddr_t *)0);
if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
flags, cred, &newb)) != 0) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
return (error);
}
nb = newb;
@@ -356,7 +354,7 @@ retry:
* If asked only for the indirect block, then return it.
*/
if (flags & BA_METAONLY) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = bp;
return (0);
}
@@ -406,7 +404,7 @@ retry:
bp->b_flags |= B_CLUSTEROK;
bdwrite(bp);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
}
@@ -428,11 +426,11 @@ retry:
nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, 0);
nbp->b_blkno = fsbtodb(fs, nb);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
fail:
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
/*
* If we have failed to allocate any blocks, simply return the error.
* This is the usual case and avoids the need to fsync the file.
@@ -774,9 +772,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, int size,
if (num < 1)
panic ("ffs_balloc_ufs2: ufs_getlbns returned indirect block");
#endif
- saved_inbdflush = ~TDP_INBDFLUSH | (curthread->td_pflags &
- TDP_INBDFLUSH);
- curthread->td_pflags |= TDP_INBDFLUSH;
+ saved_inbdflush = curthread_pflags_set(TDP_INBDFLUSH);
/*
* Fetch the first indirect block allocating if necessary.
*/
@@ -790,7 +786,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, int size,
pref = ffs_blkpref_ufs2(ip, lbn, 0, (ufs2_daddr_t *)0);
if ((error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
flags, cred, &newb)) != 0) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
return (error);
}
nb = newb;
@@ -896,7 +892,7 @@ retry:
* If asked only for the indirect block, then return it.
*/
if (flags & BA_METAONLY) {
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = bp;
return (0);
}
@@ -946,7 +942,7 @@ retry:
bp->b_flags |= B_CLUSTEROK;
bdwrite(bp);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
}
@@ -974,11 +970,11 @@ retry:
nbp = getblk(vp, lbn, fs->fs_bsize, 0, 0, 0);
nbp->b_blkno = fsbtodb(fs, nb);
}
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
*bpp = nbp;
return (0);
fail:
- curthread->td_pflags &= saved_inbdflush;
+ curthread_pflags_restore(saved_inbdflush);
/*
* If we have failed to allocate any blocks, simply return the error.
* This is the usual case and avoids the need to fsync the file.
diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index fb1b1fb..70bcf1d 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -33,7 +33,10 @@
#ifndef _UFS_FFS_EXTERN_H
#define _UFS_FFS_EXTERN_H
-enum vtype;
+#ifndef _KERNEL
+#error "No user-serving parts inside"
+#else
+
struct buf;
struct cg;
struct fid;
@@ -127,7 +130,7 @@ void softdep_freefile(struct vnode *, ino_t, int);
int softdep_request_cleanup(struct fs *, struct vnode *,
struct ucred *, int);
void softdep_setup_freeblocks(struct inode *, off_t, int);
-void softdep_setup_inomapdep(struct buf *, struct inode *, ino_t);
+void softdep_setup_inomapdep(struct buf *, struct inode *, ino_t, int);
void softdep_setup_blkmapdep(struct buf *, struct mount *, ufs2_daddr_t,
int, int);
void softdep_setup_allocdirect(struct inode *, ufs_lbn_t, ufs2_daddr_t,
@@ -168,7 +171,6 @@ void softdep_freework(struct workhead *);
int ffs_rdonly(struct inode *);
-#ifdef _KERNEL
TAILQ_HEAD(snaphead, inode);
struct snapdata {
@@ -178,6 +180,7 @@ struct snapdata {
daddr_t *sn_blklist;
struct lock sn_lock;
};
+
#endif /* _KERNEL */
#endif /* !_UFS_FFS_EXTERN_H */
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index a7b43e2..0034029 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -90,7 +90,7 @@ ffs_update(vp, waitfor)
return (0);
ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED);
fs = ip->i_fs;
- if (fs->fs_ronly)
+ if (fs->fs_ronly && ip->i_ump->um_fsckpid == 0)
return (0);
error = bread(ip->i_devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)),
(int)fs->fs_bsize, NOCRED, &bp);
@@ -128,7 +128,7 @@ ffs_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end)
if ((object = vp->v_object) == NULL)
return;
VM_OBJECT_LOCK(object);
- vm_object_page_remove(object, start, end, FALSE);
+ vm_object_page_remove(object, start, end, 0);
VM_OBJECT_UNLOCK(object);
}
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index 8d236bd..c8dd4c6 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -1918,7 +1918,8 @@ retry:
if (savedcbp) {
vp = savedcbp->b_vp;
bawrite(savedcbp);
- if ((vtype == VDIR || dopersistence) && ip->i_effnlink > 0)
+ if ((vtype == VDIR || dopersistence) &&
+ VTOI(vp)->i_effnlink > 0)
(void) ffs_syncvnode(vp, MNT_WAIT);
}
/*
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 3734a5d..fccb296 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -142,10 +142,11 @@ softdep_setup_sbupdate(ump, fs, bp)
}
void
-softdep_setup_inomapdep(bp, ip, newinum)
+softdep_setup_inomapdep(bp, ip, newinum, mode)
struct buf *bp;
struct inode *ip;
ino_t newinum;
+ int mode;
{
panic("softdep_setup_inomapdep called");
@@ -789,6 +790,8 @@ static void diradd_inode_written(struct diradd *, struct inodedep *);
static int handle_written_indirdep(struct indirdep *, struct buf *,
struct buf**);
static int handle_written_inodeblock(struct inodedep *, struct buf *);
+static int jnewblk_rollforward(struct jnewblk *, struct fs *, struct cg *,
+ uint8_t *);
static int handle_written_bmsafemap(struct bmsafemap *, struct buf *);
static void handle_written_jaddref(struct jaddref *);
static void handle_written_jremref(struct jremref *);
@@ -820,6 +823,8 @@ static void handle_allocindir_partdone(struct allocindir *);
static void initiate_write_filepage(struct pagedep *, struct buf *);
static void initiate_write_indirdep(struct indirdep*, struct buf *);
static void handle_written_mkdir(struct mkdir *, int);
+static int jnewblk_rollback(struct jnewblk *, struct fs *, struct cg *,
+ uint8_t *);
static void initiate_write_bmsafemap(struct bmsafemap *, struct buf *);
static void initiate_write_inodeblock_ufs1(struct inodedep *, struct buf *);
static void initiate_write_inodeblock_ufs2(struct inodedep *, struct buf *);
@@ -875,6 +880,7 @@ static inline void setup_freeext(struct freeblks *, struct inode *, int, int);
static inline void setup_freeindir(struct freeblks *, struct inode *, int,
ufs_lbn_t, int);
static inline struct freeblks *newfreeblks(struct mount *, struct inode *);
+static void freeblks_free(struct ufsmount *, struct freeblks *, int);
static void indir_trunc(struct freework *, ufs2_daddr_t, ufs_lbn_t);
ufs2_daddr_t blkcount(struct fs *, ufs2_daddr_t, off_t);
static int trunc_check_buf(struct buf *, int *, ufs_lbn_t, int, int);
@@ -935,6 +941,7 @@ static void wake_worklist(struct worklist *);
static void wait_worklist(struct worklist *, char *);
static void remove_from_worklist(struct worklist *);
static void softdep_flush(void);
+static void softdep_flushjournal(struct mount *);
static int softdep_speedup(void);
static void worklist_speedup(void);
static int journal_mount(struct mount *, struct fs *, struct ucred *);
@@ -3046,6 +3053,25 @@ jfsync_write(jfsync, jseg, data)
rec->jt_extsize = jfsync->jfs_extsize;
}
+static void
+softdep_flushjournal(mp)
+ struct mount *mp;
+{
+ struct jblocks *jblocks;
+ struct ufsmount *ump;
+
+ if ((mp->mnt_kern_flag & MNTK_SUJ) == 0)
+ return;
+ ump = VFSTOUFS(mp);
+ jblocks = ump->softdep_jblocks;
+ ACQUIRE_LOCK(&lk);
+ while (ump->softdep_on_journal) {
+ jblocks->jb_needseg = 1;
+ softdep_process_journal(mp, NULL, MNT_WAIT);
+ }
+ FREE_LOCK(&lk);
+}
+
/*
* Flush some journal records to disk.
*/
@@ -4310,7 +4336,6 @@ softdep_setup_create(dp, ip)
inoreflst);
KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number,
("softdep_setup_create: No addref structure present."));
- jaddref->ja_mode = ip->i_mode;
}
softdep_prelink(dvp, NULL);
FREE_LOCK(&lk);
@@ -4417,7 +4442,6 @@ softdep_setup_mkdir(dp, ip)
KASSERT(jaddref->ja_parent == dp->i_number,
("softdep_setup_mkdir: bad parent %d",
jaddref->ja_parent));
- jaddref->ja_mode = ip->i_mode;
TAILQ_INSERT_BEFORE(&jaddref->ja_ref, &dotaddref->ja_ref,
if_deps);
}
@@ -4637,10 +4661,11 @@ softdep_revert_rmdir(dp, ip)
* Called just after updating the cylinder group block to allocate an inode.
*/
void
-softdep_setup_inomapdep(bp, ip, newinum)
+softdep_setup_inomapdep(bp, ip, newinum, mode)
struct buf *bp; /* buffer for cylgroup block with inode map */
struct inode *ip; /* inode related to allocation */
ino_t newinum; /* new inode number being allocated */
+ int mode;
{
struct inodedep *inodedep;
struct bmsafemap *bmsafemap;
@@ -4657,7 +4682,7 @@ softdep_setup_inomapdep(bp, ip, newinum)
* can be dependent on it.
*/
if (mp->mnt_kern_flag & MNTK_SUJ) {
- jaddref = newjaddref(ip, newinum, 0, 0, 0);
+ jaddref = newjaddref(ip, newinum, 0, 0, mode);
jaddref->ja_state |= NEWBLOCK;
}
@@ -5014,14 +5039,12 @@ jnewblk_merge(new, old, wkhd)
if (jnewblk->jn_blkno != njnewblk->jn_blkno)
panic("jnewblk_merge: Merging disparate blocks.");
/*
- * The record may be rolled back in the cg update bits
- * appropriately. NEWBLOCK here alerts the cg rollback code
- * that the frag bits have changed.
+ * The record may be rolled back in the cg.
*/
if (jnewblk->jn_state & UNDONE) {
- njnewblk->jn_state |= UNDONE | NEWBLOCK;
- njnewblk->jn_state &= ~ATTACHED;
jnewblk->jn_state &= ~UNDONE;
+ njnewblk->jn_state |= UNDONE;
+ njnewblk->jn_state &= ~ATTACHED;
}
/*
* We modify the newer addref and free the older so that if neither
@@ -5176,7 +5199,7 @@ newfreefrag(ip, blkno, size, lbn)
freefrag->ff_blkno = blkno;
freefrag->ff_fragsize = size;
- if (fs->fs_flags & FS_SUJ) {
+ if ((ip->i_ump->um_mountp->mnt_kern_flag & MNTK_SUJ) != 0) {
freefrag->ff_jdep = (struct worklist *)
newjfreefrag(freefrag, ip, blkno, size, lbn);
} else {
@@ -5729,7 +5752,6 @@ newfreeblks(mp, ip)
freeblks->fb_modrev = DIP(ip, i_modrev);
freeblks->fb_devvp = ip->i_devvp;
freeblks->fb_chkcnt = 0;
- freeblks->fb_freecnt = 0;
freeblks->fb_len = 0;
return (freeblks);
@@ -6177,7 +6199,7 @@ softdep_journal_freeblocks(ip, cred, length, flags)
quotaref(vp, freeblks->fb_quota);
(void) chkdq(ip, -datablocks, NOCRED, 0);
#endif
- freeblks->fb_chkcnt = datablocks;
+ freeblks->fb_chkcnt = -datablocks;
UFS_LOCK(ip->i_ump);
fs->fs_pendingblocks += datablocks;
UFS_UNLOCK(ip->i_ump);
@@ -6407,7 +6429,7 @@ softdep_setup_freeblocks(ip, length, flags)
quotaref(vp, freeblks->fb_quota);
(void) chkdq(ip, -datablocks, NOCRED, 0);
#endif
- freeblks->fb_chkcnt = datablocks;
+ freeblks->fb_chkcnt = -datablocks;
UFS_LOCK(ip->i_ump);
fs->fs_pendingblocks += datablocks;
UFS_UNLOCK(ip->i_ump);
@@ -7262,8 +7284,8 @@ freework_freeblock(freework)
freeblks->fb_cgwait++;
WORKLIST_INSERT(&wkhd, &freework->fw_list);
}
- freeblks->fb_freecnt += btodb(bsize);
FREE_LOCK(&lk);
+ freeblks_free(ump, freeblks, btodb(bsize));
ffs_blkfree(ump, fs, freeblks->fb_devvp, freework->fw_blkno, bsize,
freeblks->fb_inum, freeblks->fb_vtype, &wkhd);
ACQUIRE_LOCK(&lk);
@@ -7437,6 +7459,33 @@ handle_workitem_freeblocks(freeblks, flags)
}
/*
+ * Handle completion of block free via truncate. This allows fs_pending
+ * to track the actual free block count more closely than if we only updated
+ * it at the end. We must be careful to handle cases where the block count
+ * on free was incorrect.
+ */
+static void
+freeblks_free(ump, freeblks, blocks)
+ struct ufsmount *ump;
+ struct freeblks *freeblks;
+ int blocks;
+{
+ struct fs *fs;
+ ufs2_daddr_t remain;
+
+ UFS_LOCK(ump);
+ remain = -freeblks->fb_chkcnt;
+ freeblks->fb_chkcnt += blocks;
+ if (remain > 0) {
+ if (remain < blocks)
+ blocks = remain;
+ fs = ump->um_fs;
+ fs->fs_pendingblocks -= blocks;
+ }
+ UFS_UNLOCK(ump);
+}
+
+/*
* Once all of the freework workitems are complete we can retire the
* freeblocks dependency and any journal work awaiting completion. This
* can not be called until all other dependencies are stable on disk.
@@ -7456,7 +7505,7 @@ handle_complete_freeblocks(freeblks, flags)
ump = VFSTOUFS(freeblks->fb_list.wk_mp);
fs = ump->um_fs;
flags = LK_EXCLUSIVE | flags;
- spare = freeblks->fb_freecnt - freeblks->fb_chkcnt;
+ spare = freeblks->fb_chkcnt;
/*
* If we did not release the expected number of blocks we may have
@@ -7479,9 +7528,9 @@ handle_complete_freeblocks(freeblks, flags)
}
vput(vp);
}
- if (freeblks->fb_chkcnt) {
+ if (spare < 0) {
UFS_LOCK(ump);
- fs->fs_pendingblocks -= freeblks->fb_chkcnt;
+ fs->fs_pendingblocks += spare;
UFS_UNLOCK(ump);
}
#ifdef QUOTA
@@ -7537,7 +7586,7 @@ indir_trunc(freework, dbn, lbn)
ufs2_daddr_t nb, nnb, *bap2 = 0;
ufs_lbn_t lbnadd, nlbn;
int i, nblocks, ufs1fmt;
- int fs_pendingblocks;
+ int freedblocks;
int goingaway;
int freedeps;
int needj;
@@ -7679,16 +7728,18 @@ indir_trunc(freework, dbn, lbn)
bp->b_flags |= B_INVAL | B_NOCACHE;
brelse(bp);
}
- fs_pendingblocks = 0;
+ freedblocks = 0;
if (level == 0)
- fs_pendingblocks = (nblocks * cnt);
+ freedblocks = (nblocks * cnt);
+ if (needj == 0)
+ freedblocks += nblocks;
+ freeblks_free(ump, freeblks, freedblocks);
/*
* If we are journaling set up the ref counts and offset so this
* indirect can be completed when its children are free.
*/
if (needj) {
ACQUIRE_LOCK(&lk);
- freeblks->fb_freecnt += fs_pendingblocks;
freework->fw_off = i;
freework->fw_ref += freedeps;
freework->fw_ref -= NINDIR(fs) + 1;
@@ -7702,12 +7753,10 @@ indir_trunc(freework, dbn, lbn)
/*
* If we're not journaling we can free the indirect now.
*/
- fs_pendingblocks += nblocks;
dbn = dbtofsb(fs, dbn);
ffs_blkfree(ump, fs, freeblks->fb_devvp, dbn, fs->fs_bsize,
freeblks->fb_inum, freeblks->fb_vtype, NULL);
/* Non SUJ softdep does single-threaded truncations. */
- freeblks->fb_freecnt += fs_pendingblocks;
if (freework->fw_blkno == dbn) {
freework->fw_state |= ALLCOMPLETE;
ACQUIRE_LOCK(&lk);
@@ -8879,7 +8928,7 @@ softdep_setup_sbupdate(ump, fs, bp)
struct sbdep *sbdep;
struct worklist *wk;
- if ((fs->fs_flags & FS_SUJ) == 0)
+ if ((ump->um_mountp->mnt_kern_flag & MNTK_SUJ) == 0)
return;
LIST_FOREACH(wk, &bp->b_dep, wk_list)
if (wk->wk_type == D_SBDEP)
@@ -10233,6 +10282,70 @@ softdep_setup_blkfree(mp, bp, blkno, frags, wkhd)
FREE_LOCK(&lk);
}
+/*
+ * Revert a block allocation when the journal record that describes it
+ * is not yet written.
+ */
+int
+jnewblk_rollback(jnewblk, fs, cgp, blksfree)
+ struct jnewblk *jnewblk;
+ struct fs *fs;
+ struct cg *cgp;
+ uint8_t *blksfree;
+{
+ ufs1_daddr_t fragno;
+ long cgbno, bbase;
+ int frags, blk;
+ int i;
+
+ frags = 0;
+ cgbno = dtogd(fs, jnewblk->jn_blkno);
+ /*
+ * We have to test which frags need to be rolled back. We may
+ * be operating on a stale copy when doing background writes.
+ */
+ for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags; i++)
+ if (isclr(blksfree, cgbno + i))
+ frags++;
+ if (frags == 0)
+ return (0);
+ /*
+ * This is mostly ffs_blkfree() sans some validation and
+ * superblock updates.
+ */
+ if (frags == fs->fs_frag) {
+ fragno = fragstoblks(fs, cgbno);
+ ffs_setblock(fs, blksfree, fragno);
+ ffs_clusteracct(fs, cgp, fragno, 1);
+ cgp->cg_cs.cs_nbfree++;
+ } else {
+ cgbno += jnewblk->jn_oldfrags;
+ bbase = cgbno - fragnum(fs, cgbno);
+ /* Decrement the old frags. */
+ blk = blkmap(fs, blksfree, bbase);
+ ffs_fragacct(fs, blk, cgp->cg_frsum, -1);
+ /* Deallocate the fragment */
+ for (i = 0; i < frags; i++)
+ setbit(blksfree, cgbno + i);
+ cgp->cg_cs.cs_nffree += frags;
+ /* Add back in counts associated with the new frags */
+ blk = blkmap(fs, blksfree, bbase);
+ ffs_fragacct(fs, blk, cgp->cg_frsum, 1);
+ /* If a complete block has been reassembled, account for it. */
+ fragno = fragstoblks(fs, bbase);
+ if (ffs_isblock(fs, blksfree, fragno)) {
+ cgp->cg_cs.cs_nffree -= fs->fs_frag;
+ ffs_clusteracct(fs, cgp, fragno, 1);
+ cgp->cg_cs.cs_nbfree++;
+ }
+ }
+ stat_jnewblk++;
+ jnewblk->jn_state &= ~ATTACHED;
+ jnewblk->jn_state |= UNDONE;
+
+ return (frags);
+}
+
static void
initiate_write_bmsafemap(bmsafemap, bp)
struct bmsafemap *bmsafemap;
@@ -10244,10 +10357,7 @@ initiate_write_bmsafemap(bmsafemap, bp)
uint8_t *blksfree;
struct cg *cgp;
struct fs *fs;
- int cleared;
ino_t ino;
- long bno;
- int i;
if (bmsafemap->sm_state & IOSTARTED)
panic("initiate_write_bmsafemap: Already started\n");
@@ -10286,25 +10396,9 @@ initiate_write_bmsafemap(bmsafemap, bp)
fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs;
blksfree = cg_blksfree(cgp);
LIST_FOREACH(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps) {
- bno = dtogd(fs, jnewblk->jn_blkno);
- cleared = 0;
- for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags;
- i++) {
- if (isclr(blksfree, bno + i)) {
- cleared = 1;
- setbit(blksfree, bno + i);
- }
- }
- /*
- * We may not clear the block if it's a background
- * copy. In that case there is no reason to detach
- * it.
- */
- if (cleared) {
- stat_jnewblk++;
- jnewblk->jn_state &= ~ATTACHED;
- jnewblk->jn_state |= UNDONE;
- } else if ((bp->b_xflags & BX_BKGRDMARKER) == 0)
+ if (jnewblk_rollback(jnewblk, fs, cgp, blksfree))
+ continue;
+ if ((bp->b_xflags & BX_BKGRDMARKER) == 0)
panic("initiate_write_bmsafemap: block %jd "
"marked free", jnewblk->jn_blkno);
}
@@ -10578,6 +10672,9 @@ handle_jwork(wkhd)
case D_FREEDEP:
free_freedep(WK_FREEDEP(wk));
continue;
+ case D_FREEFRAG:
+ rele_jseg(WK_JSEG(WK_FREEFRAG(wk)->ff_jdep));
+ WORKITEM_FREE(wk, D_FREEFRAG);
case D_FREEWORK:
handle_written_freework(WK_FREEWORK(wk));
continue;
@@ -11050,6 +11147,58 @@ bmsafemap_rollbacks(bmsafemap)
}
/*
+ * Re-apply an allocation when a cg write is complete.
+ */
+static int
+jnewblk_rollforward(jnewblk, fs, cgp, blksfree)
+ struct jnewblk *jnewblk;
+ struct fs *fs;
+ struct cg *cgp;
+ uint8_t *blksfree;
+{
+ ufs1_daddr_t fragno;
+ ufs2_daddr_t blkno;
+ long cgbno, bbase;
+ int frags, blk;
+ int i;
+
+ frags = 0;
+ cgbno = dtogd(fs, jnewblk->jn_blkno);
+ for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags; i++) {
+ if (isclr(blksfree, cgbno + i))
+ panic("jnewblk_rollforward: re-allocated fragment");
+ frags++;
+ }
+ if (frags == fs->fs_frag) {
+ blkno = fragstoblks(fs, cgbno);
+ ffs_clrblock(fs, blksfree, (long)blkno);
+ ffs_clusteracct(fs, cgp, blkno, -1);
+ cgp->cg_cs.cs_nbfree--;
+ } else {
+ bbase = cgbno - fragnum(fs, cgbno);
+ cgbno += jnewblk->jn_oldfrags;
+ /* If a complete block had been reassembled, account for it. */
+ fragno = fragstoblks(fs, bbase);
+ if (ffs_isblock(fs, blksfree, fragno)) {
+ cgp->cg_cs.cs_nffree += fs->fs_frag;
+ ffs_clusteracct(fs, cgp, fragno, -1);
+ cgp->cg_cs.cs_nbfree--;
+ }
+ /* Decrement the old frags. */
+ blk = blkmap(fs, blksfree, bbase);
+ ffs_fragacct(fs, blk, cgp->cg_frsum, -1);
+ /* Allocate the fragment */
+ for (i = 0; i < frags; i++)
+ clrbit(blksfree, cgbno + i);
+ cgp->cg_cs.cs_nffree -= frags;
+ /* Add back in counts associated with the new frags */
+ blk = blkmap(fs, blksfree, bbase);
+ ffs_fragacct(fs, blk, cgp->cg_frsum, 1);
+ }
+ return (frags);
+}
+
+/*
* Complete a write to a bmsafemap structure. Roll forward any bitmap
* changes if it's not a background write. Set all written dependencies
* to DEPCOMPLETE and free the structure if possible.
@@ -11069,9 +11218,7 @@ handle_written_bmsafemap(bmsafemap, bp)
struct cg *cgp;
struct fs *fs;
ino_t ino;
- long bno;
int chgs;
- int i;
if ((bmsafemap->sm_state & IOSTARTED) == 0)
panic("initiate_write_bmsafemap: Not started\n");
@@ -11121,18 +11268,9 @@ handle_written_bmsafemap(bmsafemap, bp)
jntmp) {
if ((jnewblk->jn_state & UNDONE) == 0)
continue;
- bno = dtogd(fs, jnewblk->jn_blkno);
- for (i = jnewblk->jn_oldfrags; i < jnewblk->jn_frags;
- i++) {
- if (bp->b_xflags & BX_BKGRDMARKER)
- break;
- if ((jnewblk->jn_state & NEWBLOCK) == 0 &&
- isclr(blksfree, bno + i))
- panic("handle_written_bmsafemap: "
- "re-allocated fragment");
- clrbit(blksfree, bno + i);
+ if ((bp->b_xflags & BX_BKGRDMARKER) == 0 &&
+ jnewblk_rollforward(jnewblk, fs, cgp, blksfree))
chgs = 1;
- }
jnewblk->jn_state &= ~(UNDONE | NEWBLOCK);
jnewblk->jn_state |= ATTACHED;
free_jnewblk(jnewblk);
@@ -11826,6 +11964,11 @@ softdep_sync_metadata(struct vnode *vp)
* truncations are started, and inode references are journaled.
*/
ACQUIRE_LOCK(&lk);
+ /*
+ * Write all journal records to prevent rollbacks on devvp.
+ */
+ if (vp->v_type == VCHR)
+ softdep_flushjournal(vp->v_mount);
error = flush_inodedep_deps(vp, vp->v_mount, VTOI(vp)->i_number);
/*
* Ensure that all truncates are written so we won't find deps on
@@ -11965,6 +12108,8 @@ top:
continue;
case D_FREEWORK:
+ case D_FREEDEP:
+ case D_JSEGDEP:
continue;
default:
@@ -12393,33 +12538,36 @@ softdep_request_cleanup(fs, vp, cred, resource)
int error;
mp = vp->v_mount;
- ump = VTOI(vp)->i_ump;
+ ump = VFSTOUFS(mp);
mtx_assert(UFS_MTX(ump), MA_OWNED);
if (resource == FLUSH_BLOCKS_WAIT)
stat_cleanup_blkrequests += 1;
else
stat_cleanup_inorequests += 1;
+
/*
* If we are being called because of a process doing a
- * copy-on-write, then it is not safe to update the vnode
- * as we may recurse into the copy-on-write routine.
+ * copy-on-write, then it is not safe to process any
+ * worklist items as we will recurse into the copyonwrite
+ * routine. This will result in an incoherent snapshot.
*/
- if (!(curthread->td_pflags & TDP_COWINPROGRESS)) {
- UFS_UNLOCK(ump);
- error = ffs_update(vp, 1);
+ if (curthread->td_pflags & TDP_COWINPROGRESS)
+ return (0);
+ UFS_UNLOCK(ump);
+ error = ffs_update(vp, 1);
+ if (error != 0) {
UFS_LOCK(ump);
- if (error != 0)
- return (0);
+ return (0);
}
/*
* If we are in need of resources, consider pausing for
* tickdelay to give ourselves some breathing room.
*/
- UFS_UNLOCK(ump);
ACQUIRE_LOCK(&lk);
+ process_removes(vp);
+ process_truncates(vp);
request_cleanup(UFSTOVFS(ump), resource);
FREE_LOCK(&lk);
- UFS_LOCK(ump);
/*
* Now clean up at least as many resources as we will need.
*
@@ -12451,29 +12599,23 @@ softdep_request_cleanup(fs, vp, cred, resource)
roundup((fs->fs_dsize * fs->fs_minfree / 100) -
fs->fs_cstotal.cs_nffree, fs->fs_frag));
} else {
+ UFS_LOCK(ump);
printf("softdep_request_cleanup: Unknown resource type %d\n",
resource);
return (0);
}
starttime = time_second;
retry:
- while ((resource == FLUSH_BLOCKS_WAIT && ump->softdep_on_worklist > 0 &&
- fs->fs_cstotal.cs_nbfree <= needed) ||
- (resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
- fs->fs_cstotal.cs_nifree <= needed)) {
- UFS_UNLOCK(ump);
+ if ((resource == FLUSH_BLOCKS_WAIT && ump->softdep_on_worklist > 0 &&
+ fs->fs_cstotal.cs_nbfree <= needed) ||
+ (resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
+ fs->fs_cstotal.cs_nifree <= needed)) {
ACQUIRE_LOCK(&lk);
- process_removes(vp);
- process_truncates(vp);
if (ump->softdep_on_worklist > 0 &&
- process_worklist_item(UFSTOVFS(ump), 1, LK_NOWAIT) != 0) {
+ process_worklist_item(UFSTOVFS(ump),
+ ump->softdep_on_worklist, LK_NOWAIT) != 0)
stat_worklist_push += 1;
- FREE_LOCK(&lk);
- UFS_LOCK(ump);
- continue;
- }
FREE_LOCK(&lk);
- UFS_LOCK(ump);
}
/*
* If we still need resources and there are no more worklist
@@ -12487,7 +12629,6 @@ retry:
fs->fs_cstotal.cs_nbfree <= needed) ||
(resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
fs->fs_cstotal.cs_nifree <= needed)) {
- UFS_UNLOCK(ump);
MNT_ILOCK(mp);
MNT_VNODE_FOREACH(lvp, mp, mvp) {
VI_LOCK(lvp);
@@ -12516,7 +12657,6 @@ retry:
VOP_FSYNC(lvp, MNT_NOWAIT, curthread);
VOP_UNLOCK(lvp, 0);
}
- UFS_LOCK(ump);
if (ump->softdep_on_worklist > 0) {
stat_cleanup_retries += 1;
goto retry;
@@ -12525,6 +12665,7 @@ retry:
}
if (time_second - starttime > stat_cleanup_high_delay)
stat_cleanup_high_delay = time_second - starttime;
+ UFS_LOCK(ump);
return (1);
}
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index b0f2d7e..35852bf 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -132,8 +132,8 @@ static struct buf_ops ffs_ops = {
*/
static const char *ffs_opts[] = { "acls", "async", "noatime", "noclusterr",
"noclusterw", "noexec", "export", "force", "from", "groupquota",
- "multilabel", "nfsv4acls", "snapshot", "nosuid", "suiddir", "nosymfollow",
- "sync", "union", "userquota", NULL };
+ "multilabel", "nfsv4acls", "fsckpid", "snapshot", "nosuid", "suiddir",
+ "nosymfollow", "sync", "union", "userquota", NULL };
static int
ffs_mount(struct mount *mp)
@@ -142,6 +142,7 @@ ffs_mount(struct mount *mp)
struct thread *td;
struct ufsmount *ump = 0;
struct fs *fs;
+ pid_t fsckpid = 0;
int error, flags;
u_int mntorflags;
accmode_t accmode;
@@ -184,6 +185,29 @@ ffs_mount(struct mount *mp)
vfs_deleteopt(mp->mnt_opt, "snapshot");
}
+ if (vfs_getopt(mp->mnt_optnew, "fsckpid", NULL, NULL) == 0 &&
+ vfs_scanopt(mp->mnt_optnew, "fsckpid", "%d", &fsckpid) == 1) {
+ /*
+ * Once we have set the restricted PID, do not
+ * persist "fsckpid" in the options list.
+ */
+ vfs_deleteopt(mp->mnt_optnew, "fsckpid");
+ vfs_deleteopt(mp->mnt_opt, "fsckpid");
+ if (mp->mnt_flag & MNT_UPDATE) {
+ if (VFSTOUFS(mp)->um_fs->fs_ronly == 0 &&
+ vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) == 0) {
+ printf("Checker enable: Must be read-only\n");
+ return (EINVAL);
+ }
+ } else if (vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) == 0) {
+ printf("Checker enable: Must be read-only\n");
+ return (EINVAL);
+ }
+ /* Set to -1 if we are done */
+ if (fsckpid == 0)
+ fsckpid = -1;
+ }
+
if (vfs_getopt(mp->mnt_optnew, "nfsv4acls", NULL, NULL) == 0) {
if (mntorflags & MNT_ACLS) {
printf("WARNING: \"acls\" and \"nfsv4acls\" "
@@ -204,6 +228,20 @@ ffs_mount(struct mount *mp)
ump = VFSTOUFS(mp);
fs = ump->um_fs;
devvp = ump->um_devvp;
+ if (fsckpid == -1 && ump->um_fsckpid > 0) {
+ if ((error = ffs_flushfiles(mp, WRITECLOSE, td)) != 0 ||
+ (error = ffs_sbupdate(ump, MNT_WAIT, 0)) != 0)
+ return (error);
+ DROP_GIANT();
+ g_topology_lock();
+ /*
+ * Return to normal read-only mode.
+ */
+ error = g_access(ump->um_cp, 0, -1, 0);
+ g_topology_unlock();
+ PICKUP_GIANT();
+ ump->um_fsckpid = 0;
+ }
if (fs->fs_ronly == 0 &&
vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
/*
@@ -273,7 +311,10 @@ ffs_mount(struct mount *mp)
softdep_unmount(mp);
DROP_GIANT();
g_topology_lock();
- g_access(ump->um_cp, 0, -1, 0);
+ /*
+ * Drop our write and exclusive access.
+ */
+ g_access(ump->um_cp, 0, -1, -1);
g_topology_unlock();
PICKUP_GIANT();
fs->fs_ronly = 1;
@@ -292,6 +333,13 @@ ffs_mount(struct mount *mp)
if (fs->fs_ronly &&
!vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
/*
+ * If we are running a checker, do not allow upgrade.
+ */
+ if (ump->um_fsckpid > 0) {
+ printf("Active checker, cannot rw upgrade\n");
+ return (EINVAL);
+ }
+ /*
* If upgrade to read-write by non-root, then verify
* that user has necessary permissions on the device.
*/
@@ -327,13 +375,9 @@ ffs_mount(struct mount *mp)
DROP_GIANT();
g_topology_lock();
/*
- * If we're the root device, we may not have an E count
- * yet, get it now.
+ * Request exclusive write access.
*/
- if (ump->um_cp->ace == 0)
- error = g_access(ump->um_cp, 0, 1, 1);
- else
- error = g_access(ump->um_cp, 0, 1, 0);
+ error = g_access(ump->um_cp, 0, 1, 1);
g_topology_unlock();
PICKUP_GIANT();
if (error)
@@ -389,6 +433,39 @@ ffs_mount(struct mount *mp)
mp->mnt_flag |= MNT_NFS4ACLS;
MNT_IUNLOCK(mp);
}
+ /*
+ * If this is a request from fsck to clean up the filesystem,
+ * then allow the specified pid to proceed.
+ */
+ if (fsckpid > 0) {
+ if (ump->um_fsckpid != 0) {
+ printf("Active checker already running on %s\n",
+ fs->fs_fsmnt);
+ return (EINVAL);
+ }
+ KASSERT((mp->mnt_flag & MNT_SOFTDEP) == 0,
+ ("soft updates enabled on read-only file system"));
+ DROP_GIANT();
+ g_topology_lock();
+ /*
+ * Request write access.
+ */
+ error = g_access(ump->um_cp, 0, 1, 0);
+ g_topology_unlock();
+ PICKUP_GIANT();
+ if (error) {
+ printf("Checker activation failed on %s\n",
+ fs->fs_fsmnt);
+ return (error);
+ }
+ ump->um_fsckpid = fsckpid;
+ if (fs->fs_snapinum[0] != 0)
+ ffs_snapshot_mount(mp);
+ fs->fs_mtime = time_second;
+ fs->fs_fmod = 1;
+ fs->fs_clean = 0;
+ (void) ffs_sbupdate(ump, MNT_WAIT, 0);
+ }
/*
* If this is a snapshot request, take the snapshot.
@@ -452,6 +529,31 @@ ffs_mount(struct mount *mp)
vrele(devvp);
return (error);
}
+ if (fsckpid > 0) {
+ KASSERT((mp->mnt_flag & MNT_SOFTDEP) == 0,
+ ("soft updates enabled on read-only file system"));
+ ump = VFSTOUFS(mp);
+ fs = ump->um_fs;
+ DROP_GIANT();
+ g_topology_lock();
+ /*
+ * Request write access.
+ */
+ error = g_access(ump->um_cp, 0, 1, 0);
+ g_topology_unlock();
+ PICKUP_GIANT();
+ if (error) {
+ printf("Checker activation failed on %s\n",
+ fs->fs_fsmnt);
+ } else {
+ ump->um_fsckpid = fsckpid;
+ if (fs->fs_snapinum[0] != 0)
+ ffs_snapshot_mount(mp);
+ fs->fs_mtime = time_second;
+ fs->fs_clean = 0;
+ (void) ffs_sbupdate(ump, MNT_WAIT, 0);
+ }
+ }
}
vfs_mountedfrom(mp, fspec);
return (0);
@@ -665,13 +767,6 @@ ffs_mountfs(devvp, mp, td)
DROP_GIANT();
g_topology_lock();
error = g_vfs_open(devvp, &cp, "ffs", ronly ? 0 : 1);
-
- /*
- * If we are a root mount, drop the E flag so fsck can do its magic.
- * We will pick it up again when we remount R/W.
- */
- if (error == 0 && ronly && (mp->mnt_flag & MNT_ROOTFS))
- error = g_access(cp, 0, 0, -1);
g_topology_unlock();
PICKUP_GIANT();
VOP_UNLOCK(devvp, 0);
@@ -932,7 +1027,7 @@ ffs_mountfs(devvp, mp, td)
strlcpy(fs->fs_fsmnt, mp->mnt_stat.f_mntonname, MAXMNTLEN);
mp->mnt_stat.f_iosize = fs->fs_bsize;
- if( mp->mnt_flag & MNT_ROOTFS) {
+ if (mp->mnt_flag & MNT_ROOTFS) {
/*
* Root mount; update timestamp in mount structure.
* this will be used by the common root mount code
@@ -1169,7 +1264,7 @@ ffs_unmount(mp, mntflags)
}
UFS_UNLOCK(ump);
softdep_unmount(mp);
- if (fs->fs_ronly == 0) {
+ if (fs->fs_ronly == 0 || ump->um_fsckpid > 0) {
fs->fs_clean = fs->fs_flags & (FS_UNCLEAN|FS_NEEDSFSCK) ? 0 : 1;
error = ffs_sbupdate(ump, MNT_WAIT, 0);
if (error && error != ENXIO) {
@@ -1183,6 +1278,13 @@ ffs_unmount(mp, mntflags)
}
DROP_GIANT();
g_topology_lock();
+ if (ump->um_fsckpid > 0) {
+ /*
+ * Return to normal read-only mode.
+ */
+ error = g_access(ump->um_cp, 0, -1, 0);
+ ump->um_fsckpid = 0;
+ }
g_vfs_close(ump->um_cp);
g_topology_unlock();
PICKUP_GIANT();
@@ -1331,7 +1433,7 @@ ffs_sync(mp, waitfor)
td = curthread;
fs = ump->um_fs;
- if (fs->fs_fmod != 0 && fs->fs_ronly != 0) { /* XXX */
+ if (fs->fs_fmod != 0 && fs->fs_ronly != 0 && ump->um_fsckpid == 0) {
printf("fs = %s\n", fs->fs_fsmnt);
panic("ffs_sync: rofs mod");
}
@@ -1689,12 +1791,12 @@ ffs_uninit(vfsp)
* Write a superblock and associated information back to disk.
*/
int
-ffs_sbupdate(mp, waitfor, suspended)
- struct ufsmount *mp;
+ffs_sbupdate(ump, waitfor, suspended)
+ struct ufsmount *ump;
int waitfor;
int suspended;
{
- struct fs *fs = mp->um_fs;
+ struct fs *fs = ump->um_fs;
struct buf *sbbp;
struct buf *bp;
int blks;
@@ -1702,14 +1804,14 @@ ffs_sbupdate(mp, waitfor, suspended)
int i, size, error, allerror = 0;
if (fs->fs_ronly == 1 &&
- (mp->um_mountp->mnt_flag & (MNT_RDONLY | MNT_UPDATE)) !=
- (MNT_RDONLY | MNT_UPDATE))
+ (ump->um_mountp->mnt_flag & (MNT_RDONLY | MNT_UPDATE)) !=
+ (MNT_RDONLY | MNT_UPDATE) && ump->um_fsckpid == 0)
panic("ffs_sbupdate: write read-only filesystem");
/*
* We use the superblock's buf to serialize calls to ffs_sbupdate().
*/
- sbbp = getblk(mp->um_devvp, btodb(fs->fs_sblockloc), (int)fs->fs_sbsize,
- 0, 0, 0);
+ sbbp = getblk(ump->um_devvp, btodb(fs->fs_sblockloc),
+ (int)fs->fs_sbsize, 0, 0, 0);
/*
* First write back the summary information.
*/
@@ -1719,7 +1821,7 @@ ffs_sbupdate(mp, waitfor, suspended)
size = fs->fs_bsize;
if (i + fs->fs_frag > blks)
size = (blks - i) * fs->fs_fsize;
- bp = getblk(mp->um_devvp, fsbtodb(fs, fs->fs_csaddr + i),
+ bp = getblk(ump->um_devvp, fsbtodb(fs, fs->fs_csaddr + i),
size, 0, 0, 0);
bcopy(space, bp->b_data, (u_int)size);
space = (char *)space + size;
@@ -1755,9 +1857,9 @@ ffs_sbupdate(mp, waitfor, suspended)
fs->fs_fmod = 0;
fs->fs_time = time_second;
if (fs->fs_flags & FS_DOSOFTDEP)
- softdep_setup_sbupdate(mp, (struct fs *)bp->b_data, bp);
+ softdep_setup_sbupdate(ump, (struct fs *)bp->b_data, bp);
bcopy((caddr_t)fs, bp->b_data, (u_int)fs->fs_sbsize);
- ffs_oldfscompat_write((struct fs *)bp->b_data, mp);
+ ffs_oldfscompat_write((struct fs *)bp->b_data, ump);
if (suspended)
bp->b_flags |= B_VALIDSUSPWRT;
if (waitfor != MNT_WAIT)
diff --git a/sys/ufs/ffs/fs.h b/sys/ufs/ffs/fs.h
index a0b8e5b..b1e2174 100644
--- a/sys/ufs/ffs/fs.h
+++ b/sys/ufs/ffs/fs.h
@@ -214,7 +214,9 @@
#define FFS_SET_CWD 12 /* set current directory */
#define FFS_SET_DOTDOT 13 /* set inode number for ".." */
#define FFS_UNLINK 14 /* remove a name in the filesystem */
-#define FFS_MAXID 15 /* number of valid ffs ids */
+#define FFS_SET_INODE 15 /* update an on-disk inode */
+#define FFS_SET_BUFOUTPUT 16 /* set buffered writing on descriptor */
+#define FFS_MAXID 16 /* number of valid ffs ids */
/*
* Command structure passed in to the filesystem to adjust filesystem values.
diff --git a/sys/ufs/ffs/softdep.h b/sys/ufs/ffs/softdep.h
index 80c7315..b251ba8 100644
--- a/sys/ufs/ffs/softdep.h
+++ b/sys/ufs/ffs/softdep.h
@@ -536,8 +536,7 @@ struct freeblks {
#endif
uint64_t fb_modrev; /* Inode revision at start of trunc. */
off_t fb_len; /* Length we're truncating to. */
- ufs2_daddr_t fb_chkcnt; /* Expected blks released. */
- ufs2_daddr_t fb_freecnt; /* Actual blocks released. */
+ ufs2_daddr_t fb_chkcnt; /* Blocks released. */
ino_t fb_inum; /* inode owner of blocks */
enum vtype fb_vtype; /* inode owner's file type */
uid_t fb_uid; /* uid of previous owner of blocks */
diff --git a/sys/ufs/ufs/ufs_inode.c b/sys/ufs/ufs/ufs_inode.c
index 7ddbe97..129c26d 100644
--- a/sys/ufs/ufs/ufs_inode.c
+++ b/sys/ufs/ufs/ufs_inode.c
@@ -120,15 +120,14 @@ ufs_inactive(ap)
isize = ip->i_size;
if (ip->i_ump->um_fstype == UFS2)
isize += ip->i_din2->di_extsize;
- if (ip->i_effnlink <= 0 && isize && !UFS_RDONLY(ip)) {
+ if (ip->i_effnlink <= 0 && isize && !UFS_RDONLY(ip))
+ error = UFS_TRUNCATE(vp, (off_t)0, IO_EXT | IO_NORMAL,
+ NOCRED, td);
+ if (ip->i_nlink <= 0 && ip->i_mode && !UFS_RDONLY(ip)) {
#ifdef QUOTA
if (!getinoquota(ip))
(void)chkiq(ip, -1, NOCRED, FORCE);
#endif
- error = UFS_TRUNCATE(vp, (off_t)0, IO_EXT | IO_NORMAL,
- NOCRED, td);
- }
- if (ip->i_nlink <= 0 && ip->i_mode && !UFS_RDONLY(ip)) {
#ifdef UFS_EXTATTR
ufs_extattr_vnode_inactive(vp, td);
#endif
diff --git a/sys/ufs/ufs/ufsmount.h b/sys/ufs/ufs/ufsmount.h
index 7874105..6447dce 100644
--- a/sys/ufs/ufs/ufsmount.h
+++ b/sys/ufs/ufs/ufsmount.h
@@ -77,6 +77,7 @@ struct ufsmount {
u_long um_bptrtodb; /* indir ptr to disk block */
u_long um_seqinc; /* inc between seq blocks */
struct mtx um_lock; /* Protects ufsmount & fs */
+ pid_t um_fsckpid; /* PID permitted fsck sysctls */
long um_numindirdeps; /* outstanding indirdeps */
struct workhead softdep_workitem_pending; /* softdep work queue */
struct worklist *softdep_worklist_tail; /* Tail pointer for above */
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c
index f2131dd..411482a 100644
--- a/sys/vm/device_pager.c
+++ b/sys/vm/device_pager.c
@@ -217,8 +217,10 @@ dev_pager_getpages(object, m, count, reqpage)
memattr = object->memattr;
VM_OBJECT_UNLOCK(object);
csw = dev_refthread(dev, &ref);
- if (csw == NULL)
- panic("dev_pager_getpage: no cdevsw");
+ if (csw == NULL) {
+ VM_OBJECT_LOCK(object);
+ return (VM_PAGER_FAIL);
+ }
td = curthread;
fpop = td->td_fpop;
td->td_fpop = NULL;
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 2868a2f..f421e4f 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -193,11 +193,13 @@ swap_reserve_by_cred(vm_ooffset_t incr, struct ucred *cred)
if (incr & PAGE_MASK)
panic("swap_reserve: & PAGE_MASK");
+#ifdef RACCT
PROC_LOCK(curproc);
error = racct_add(curproc, RACCT_SWAP, incr);
PROC_UNLOCK(curproc);
if (error != 0)
return (0);
+#endif
res = 0;
mtx_lock(&sw_dev_mtx);
@@ -237,11 +239,13 @@ swap_reserve_by_cred(vm_ooffset_t incr, struct ucred *cred)
curproc->p_pid, uip->ui_uid, incr);
}
+#ifdef RACCT
if (!res) {
PROC_LOCK(curproc);
racct_sub(curproc, RACCT_SWAP, incr);
PROC_UNLOCK(curproc);
}
+#endif
return (res);
}
@@ -255,9 +259,11 @@ swap_reserve_force(vm_ooffset_t incr)
swap_reserved += incr;
mtx_unlock(&sw_dev_mtx);
+#ifdef RACCT
PROC_LOCK(curproc);
racct_add_force(curproc, RACCT_SWAP, incr);
PROC_UNLOCK(curproc);
+#endif
uip = curthread->td_ucred->cr_ruidinfo;
PROC_LOCK(curproc);
diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h
index ae8e578..72f0254 100644
--- a/sys/vm/vm_extern.h
+++ b/sys/vm/vm_extern.h
@@ -61,6 +61,8 @@ int useracc(void *, int, int);
int vm_fault(vm_map_t, vm_offset_t, vm_prot_t, int);
void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t,
vm_ooffset_t *);
+int vm_fault_disable_pagefaults(void);
+void vm_fault_enable_pagefaults(int save);
int vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags, vm_page_t *m_hold);
int vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len,
@@ -70,6 +72,7 @@ int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t);
int vm_forkproc(struct thread *, struct proc *, struct thread *, struct vmspace *, int);
void vm_waitproc(struct proc *);
int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, objtype_t, void *, vm_ooffset_t);
+int vm_mmap_to_errno(int rv);
void vm_set_page_size(void);
void vm_sync_icache(vm_map_t, vm_offset_t, vm_size_t);
struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t);
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index d417a84..eeb10a4 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -209,6 +209,8 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags)
{
+ if ((curthread->td_pflags & TDP_NOFAULTING) != 0)
+ return (KERN_PROTECTION_FAILURE);
return (vm_fault_hold(map, vaddr, fault_type, fault_flags, NULL));
}
@@ -1089,10 +1091,19 @@ vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len,
* caller's changes may go unnoticed because they are
* performed through an unmanaged mapping or by a DMA
* operation.
+ *
+ * The object lock is not held here. Therefore, like
+ * a pmap operation, the page queues lock may be
+ * required in order to call vm_page_dirty(). See
+ * vm_page_clear_dirty_mask().
*/
+#if defined(__amd64__) || defined(__i386__) || defined(__ia64__)
+ vm_page_dirty(*mp);
+#else
vm_page_lock_queues();
vm_page_dirty(*mp);
vm_page_unlock_queues();
+#endif
}
}
if (pmap_failed) {
@@ -1466,3 +1477,17 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage)
/* return number of pages */
return i;
}
+
+int
+vm_fault_disable_pagefaults(void)
+{
+
+ return (curthread_pflags_set(TDP_NOFAULTING));
+}
+
+void
+vm_fault_enable_pagefaults(int save)
+{
+
+ curthread_pflags_restore(save);
+}
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
index da9b1dc..c552cb7 100644
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -222,12 +222,14 @@ vslock(void *addr, size_t len)
#endif
error = vm_map_wire(&curproc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
if (error != KERN_SUCCESS) {
PROC_LOCK(curproc);
racct_set(curproc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))));
PROC_UNLOCK(curproc);
}
+#endif
/*
* Return EFAULT on error to match copy{in,out}() behaviour
* rather than returning ENOMEM like mlock() would.
@@ -244,10 +246,12 @@ vsunlock(void *addr, size_t len)
trunc_page((vm_offset_t)addr), round_page((vm_offset_t)addr + len),
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
PROC_LOCK(curproc);
racct_set(curproc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))));
PROC_UNLOCK(curproc);
+#endif
}
/*
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 752354a..8493478 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -318,6 +318,7 @@ static void
vmspace_container_reset(struct proc *p)
{
+#ifdef RACCT
PROC_LOCK(p);
racct_set(p, RACCT_DATA, 0);
racct_set(p, RACCT_STACK, 0);
@@ -325,6 +326,7 @@ vmspace_container_reset(struct proc *p)
racct_set(p, RACCT_MEMLOCK, 0);
racct_set(p, RACCT_VMEM, 0);
PROC_UNLOCK(p);
+#endif
}
static inline void
@@ -2708,7 +2710,15 @@ vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry)
((object->flags & (OBJ_NOSPLIT|OBJ_ONEMAPPING)) == OBJ_ONEMAPPING ||
object == kernel_object || object == kmem_object)) {
vm_object_collapse(object);
- vm_object_page_remove(object, offidxstart, offidxend, FALSE);
+
+ /*
+ * The option OBJPR_NOTMAPPED can be passed here
+ * because vm_map_delete() already performed
+ * pmap_remove() on the only mapping to this range
+ * of pages.
+ */
+ vm_object_page_remove(object, offidxstart, offidxend,
+ OBJPR_NOTMAPPED);
if (object->type == OBJT_SWAP)
swap_pager_freespace(object, offidxstart, count);
if (offidxend >= object->size &&
@@ -3297,7 +3307,9 @@ vm_map_growstack(struct proc *p, vm_offset_t addr)
#ifdef notyet
uint64_t limit;
#endif
+#ifdef RACCT
int error;
+#endif
Retry:
PROC_LOCK(p);
@@ -3396,6 +3408,7 @@ Retry:
vm_map_unlock_read(map);
return (KERN_NO_SPACE);
}
+#ifdef RACCT
PROC_LOCK(p);
if (is_procstack &&
racct_set(p, RACCT_STACK, ctob(vm->vm_ssize) + grow_amount)) {
@@ -3404,6 +3417,7 @@ Retry:
return (KERN_NO_SPACE);
}
PROC_UNLOCK(p);
+#endif
/* Round up the grow amount modulo SGROWSIZ */
grow_amount = roundup (grow_amount, sgrowsiz);
@@ -3427,6 +3441,7 @@ Retry:
rv = KERN_NO_SPACE;
goto out;
}
+#ifdef RACCT
PROC_LOCK(p);
if (racct_set(p, RACCT_VMEM, map->size + grow_amount)) {
PROC_UNLOCK(p);
@@ -3435,6 +3450,7 @@ Retry:
goto out;
}
PROC_UNLOCK(p);
+#endif
if (vm_map_lock_upgrade(map))
goto Retry;
@@ -3534,6 +3550,7 @@ Retry:
}
out:
+#ifdef RACCT
if (rv != KERN_SUCCESS) {
PROC_LOCK(p);
error = racct_set(p, RACCT_VMEM, map->size);
@@ -3542,6 +3559,7 @@ out:
KASSERT(error == 0, ("decreasing RACCT_STACK failed"));
PROC_UNLOCK(p);
}
+#endif
return (rv);
}
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 37949a5..c78571d 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1019,19 +1019,23 @@ mlock(td, uap)
PROC_UNLOCK(proc);
if (npages + cnt.v_wire_count > vm_page_max_wired)
return (EAGAIN);
+#ifdef RACCT
PROC_LOCK(proc);
error = racct_set(proc, RACCT_MEMLOCK, nsize);
PROC_UNLOCK(proc);
if (error != 0)
return (ENOMEM);
+#endif
error = vm_map_wire(&proc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
if (error != KERN_SUCCESS) {
PROC_LOCK(proc);
racct_set(proc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&proc->p_vmspace->vm_map))));
PROC_UNLOCK(proc);
}
+#endif
return (error == KERN_SUCCESS ? 0 : ENOMEM);
}
@@ -1074,11 +1078,13 @@ mlockall(td, uap)
if (error)
return (error);
#endif
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size);
PROC_UNLOCK(td->td_proc);
if (error != 0)
return (ENOMEM);
+#endif
if (uap->how & MCL_FUTURE) {
vm_map_lock(map);
@@ -1098,12 +1104,14 @@ mlockall(td, uap)
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK);
error = (error == KERN_SUCCESS ? 0 : EAGAIN);
}
+#ifdef RACCT
if (error != KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(vm_map_pmap(&td->td_proc->p_vmspace->vm_map))));
PROC_UNLOCK(td->td_proc);
}
+#endif
return (error);
}
@@ -1138,11 +1146,13 @@ munlockall(td, uap)
/* Forcibly unwire all pages. */
error = vm_map_unwire(map, vm_map_min(map), vm_map_max(map),
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK);
+#ifdef RACCT
if (error == KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_MEMLOCK, 0);
PROC_UNLOCK(td->td_proc);
}
+#endif
return (error);
}
@@ -1177,11 +1187,13 @@ munlock(td, uap)
return (EINVAL);
error = vm_map_unwire(&td->td_proc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
+#ifdef RACCT
if (error == KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_MEMLOCK, ptoa(end - start));
PROC_UNLOCK(td->td_proc);
}
+#endif
return (error == KERN_SUCCESS ? 0 : ENOMEM);
}
@@ -1412,7 +1424,7 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
if (td->td_proc->p_vmspace->vm_map.size + size >
lim_cur(td->td_proc, RLIMIT_VMEM)) {
PROC_UNLOCK(td->td_proc);
- return(ENOMEM);
+ return (ENOMEM);
}
if (racct_set(td->td_proc, RACCT_VMEM,
td->td_proc->p_vmspace->vm_map.size + size)) {
@@ -1523,6 +1535,13 @@ vm_mmap(vm_map_t map, vm_offset_t *addr, vm_size_t size, vm_prot_t prot,
vm_map_wire(map, *addr, *addr + size,
VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES);
+ return (vm_mmap_to_errno(rv));
+}
+
+int
+vm_mmap_to_errno(int rv)
+{
+
switch (rv) {
case KERN_SUCCESS:
return (0);
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 1a3d398..b5788f5 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -923,6 +923,10 @@ vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int pagerflags,
* We invalidate (remove) all pages from the address space
* for semantic correctness.
*
+ * If the backing object is a device object with unmanaged pages, then any
+ * mappings to the specified range of pages must be removed before this
+ * function is called.
+ *
* Note: certain anonymous maps, such as MAP_NOSYNC maps,
* may start out with a NULL object.
*/
@@ -978,12 +982,19 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size,
}
if ((object->type == OBJT_VNODE ||
object->type == OBJT_DEVICE) && invalidate) {
- boolean_t purge;
- purge = old_msync || (object->type == OBJT_DEVICE);
- vm_object_page_remove(object,
- OFF_TO_IDX(offset),
- OFF_TO_IDX(offset + size + PAGE_MASK),
- purge ? FALSE : TRUE);
+ if (object->type == OBJT_DEVICE)
+ /*
+ * The option OBJPR_NOTMAPPED must be passed here
+ * because vm_object_page_remove() cannot remove
+ * unmanaged mappings.
+ */
+ flags = OBJPR_NOTMAPPED;
+ else if (old_msync)
+ flags = 0;
+ else
+ flags = OBJPR_CLEANONLY;
+ vm_object_page_remove(object, OFF_TO_IDX(offset),
+ OFF_TO_IDX(offset + size + PAGE_MASK), flags);
}
VM_OBJECT_UNLOCK(object);
}
@@ -1754,76 +1765,70 @@ vm_object_collapse(vm_object_t object)
* vm_object_page_remove:
*
* For the given object, either frees or invalidates each of the
- * specified pages. In general, a page is freed. However, if a
- * page is wired for any reason other than the existence of a
- * managed, wired mapping, then it may be invalidated but not
- * removed from the object. Pages are specified by the given
- * range ["start", "end") and Boolean "clean_only". As a
- * special case, if "end" is zero, then the range extends from
- * "start" to the end of the object. If "clean_only" is TRUE,
- * then only the non-dirty pages within the specified range are
- * affected.
+ * specified pages. In general, a page is freed. However, if a page is
+ * wired for any reason other than the existence of a managed, wired
+ * mapping, then it may be invalidated but not removed from the object.
+ * Pages are specified by the given range ["start", "end") and the option
+ * OBJPR_CLEANONLY. As a special case, if "end" is zero, then the range
+ * extends from "start" to the end of the object. If the option
+ * OBJPR_CLEANONLY is specified, then only the non-dirty pages within the
+ * specified range are affected. If the option OBJPR_NOTMAPPED is
+ * specified, then the pages within the specified range must have no
+ * mappings. Otherwise, if this option is not specified, any mappings to
+ * the specified pages are removed before the pages are freed or
+ * invalidated.
*
- * In general, this operation should only be performed on objects
- * that contain managed pages. There are two exceptions. First,
- * it may be performed on the kernel and kmem objects. Second,
- * it may be used by msync(..., MS_INVALIDATE) to invalidate
- * device-backed pages. In both of these cases, "clean_only"
- * must be FALSE.
+ * In general, this operation should only be performed on objects that
+ * contain managed pages. There are, however, two exceptions. First, it
+ * is performed on the kernel and kmem objects by vm_map_entry_delete().
+ * Second, it is used by msync(..., MS_INVALIDATE) to invalidate device-
+ * backed pages. In both of these cases, the option OBJPR_CLEANONLY must
+ * not be specified and the option OBJPR_NOTMAPPED must be specified.
*
* The object must be locked.
*/
void
vm_object_page_remove(vm_object_t object, vm_pindex_t start, vm_pindex_t end,
- boolean_t clean_only)
+ int options)
{
vm_page_t p, next;
int wirings;
VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
+ KASSERT((object->type != OBJT_DEVICE && object->type != OBJT_PHYS) ||
+ (options & (OBJPR_CLEANONLY | OBJPR_NOTMAPPED)) == OBJPR_NOTMAPPED,
+ ("vm_object_page_remove: illegal options for object %p", object));
if (object->resident_page_count == 0)
goto skipmemq;
-
- /*
- * Since physically-backed objects do not use managed pages, we can't
- * remove pages from the object (we must instead remove the page
- * references, and then destroy the object).
- */
- KASSERT(object->type != OBJT_PHYS || object == kernel_object ||
- object == kmem_object,
- ("attempt to remove pages from a physical object"));
-
vm_object_pip_add(object, 1);
again:
p = vm_page_find_least(object, start);
/*
- * Assert: the variable p is either (1) the page with the
- * least pindex greater than or equal to the parameter pindex
- * or (2) NULL.
+ * Here, the variable "p" is either (1) the page with the least pindex
+ * greater than or equal to the parameter "start" or (2) NULL.
*/
- for (;
- p != NULL && (p->pindex < end || end == 0);
- p = next) {
+ for (; p != NULL && (p->pindex < end || end == 0); p = next) {
next = TAILQ_NEXT(p, listq);
/*
- * If the page is wired for any reason besides the
- * existence of managed, wired mappings, then it cannot
- * be freed. For example, fictitious pages, which
- * represent device memory, are inherently wired and
- * cannot be freed. They can, however, be invalidated
- * if "clean_only" is FALSE.
+ * If the page is wired for any reason besides the existence
+ * of managed, wired mappings, then it cannot be freed. For
+ * example, fictitious pages, which represent device memory,
+ * are inherently wired and cannot be freed. They can,
+ * however, be invalidated if the option OBJPR_CLEANONLY is
+ * not specified.
*/
vm_page_lock(p);
if ((wirings = p->wire_count) != 0 &&
(wirings = pmap_page_wired_mappings(p)) != p->wire_count) {
- /* Fictitious pages do not have managed mappings. */
- if ((p->flags & PG_FICTITIOUS) == 0)
+ if ((options & OBJPR_NOTMAPPED) == 0) {
pmap_remove_all(p);
- /* Account for removal of managed, wired mappings. */
- p->wire_count -= wirings;
- if (!clean_only) {
+ /* Account for removal of wired mappings. */
+ if (wirings != 0)
+ p->wire_count -= wirings;
+ }
+ if ((options & OBJPR_CLEANONLY) == 0) {
p->valid = 0;
vm_page_undirty(p);
}
@@ -1834,17 +1839,20 @@ again:
goto again;
KASSERT((p->flags & PG_FICTITIOUS) == 0,
("vm_object_page_remove: page %p is fictitious", p));
- if (clean_only && p->valid) {
- pmap_remove_write(p);
+ if ((options & OBJPR_CLEANONLY) != 0 && p->valid != 0) {
+ if ((options & OBJPR_NOTMAPPED) == 0)
+ pmap_remove_write(p);
if (p->dirty) {
vm_page_unlock(p);
continue;
}
}
- pmap_remove_all(p);
- /* Account for removal of managed, wired mappings. */
- if (wirings != 0)
- p->wire_count -= wirings;
+ if ((options & OBJPR_NOTMAPPED) == 0) {
+ pmap_remove_all(p);
+ /* Account for removal of wired mappings. */
+ if (wirings != 0)
+ p->wire_count -= wirings;
+ }
vm_page_free(p);
vm_page_unlock(p);
}
@@ -1991,9 +1999,8 @@ vm_object_coalesce(vm_object_t prev_object, vm_ooffset_t prev_offset,
* deallocation.
*/
if (next_pindex < prev_object->size) {
- vm_object_page_remove(prev_object,
- next_pindex,
- next_pindex + next_size, FALSE);
+ vm_object_page_remove(prev_object, next_pindex, next_pindex +
+ next_size, 0);
if (prev_object->type == OBJT_SWAP)
swap_pager_freespace(prev_object,
next_pindex, next_size);
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h
index 0f4f47d..a11f144 100644
--- a/sys/vm/vm_object.h
+++ b/sys/vm/vm_object.h
@@ -168,6 +168,12 @@ struct vm_object {
#define OBJPC_INVAL 0x2 /* invalidate */
#define OBJPC_NOSYNC 0x4 /* skip if PG_NOSYNC */
+/*
+ * The following options are supported by vm_object_page_remove().
+ */
+#define OBJPR_CLEANONLY 0x1 /* Don't remove dirty pages. */
+#define OBJPR_NOTMAPPED 0x2 /* Don't unmap pages. */
+
TAILQ_HEAD(object_q, vm_object);
extern struct object_q vm_object_list; /* list of allocated objects */
@@ -219,7 +225,8 @@ void vm_object_set_writeable_dirty (vm_object_t);
void vm_object_init (void);
void vm_object_page_clean(vm_object_t object, vm_ooffset_t start,
vm_ooffset_t end, int flags);
-void vm_object_page_remove (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t);
+void vm_object_page_remove(vm_object_t object, vm_pindex_t start,
+ vm_pindex_t end, int options);
boolean_t vm_object_populate(vm_object_t, vm_pindex_t, vm_pindex_t);
void vm_object_print(long addr, boolean_t have_addr, long count, char *modif);
void vm_object_reference (vm_object_t);
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 21c7080..8e0c8bb 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -729,7 +729,12 @@ vm_page_sleep(vm_page_t m, const char *msg)
/*
* vm_page_dirty:
*
- * make page all dirty
+ * Set all bits in the page's dirty field.
+ *
+ * The object containing the specified page must be locked if the call is
+ * made from the machine-independent layer. If, however, the call is
+ * made from the pmap layer, then the page queues lock may be required.
+ * See vm_page_clear_dirty_mask().
*/
void
vm_page_dirty(vm_page_t m)
@@ -2325,15 +2330,40 @@ vm_page_clear_dirty_mask(vm_page_t m, int pagebits)
/*
* If the object is locked and the page is neither VPO_BUSY nor
* PG_WRITEABLE, then the page's dirty field cannot possibly be
- * modified by a concurrent pmap operation.
+ * set by a concurrent pmap operation.
*/
VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0)
m->dirty &= ~pagebits;
else {
+#if defined(__amd64__) || defined(__i386__) || defined(__ia64__)
+ /*
+ * On the aforementioned architectures, the page queues lock
+ * is not required by the following read-modify-write
+ * operation. The combination of the object's lock and an
+ * atomic operation suffice. Moreover, the pmap layer on
+ * these architectures can call vm_page_dirty() without
+ * holding the page queues lock.
+ */
+#if PAGE_SIZE == 4096
+ atomic_clear_char(&m->dirty, pagebits);
+#elif PAGE_SIZE == 8192
+ atomic_clear_short(&m->dirty, pagebits);
+#elif PAGE_SIZE == 16384
+ atomic_clear_int(&m->dirty, pagebits);
+#else
+#error "PAGE_SIZE is not supported."
+#endif
+#else
+ /*
+ * Otherwise, the page queues lock is required to ensure that
+ * a concurrent pmap operation does not set the page's dirty
+ * field during the following read-modify-write operation.
+ */
vm_page_lock_queues();
m->dirty &= ~pagebits;
vm_page_unlock_queues();
+#endif
}
}
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index 898857b..e852313 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -89,10 +89,26 @@
* and offset to which this page belongs (for pageout),
* and sundry status bits.
*
- * Fields in this structure are locked either by the lock on the
- * object that the page belongs to (O), its corresponding page lock (P),
- * or by the lock on the page queues (Q).
- *
+ * In general, operations on this structure's mutable fields are
+ * synchronized using either one of or a combination of the lock on the
+ * object that the page belongs to (O), the pool lock for the page (P),
+ * or the lock for either the free or paging queues (Q). If a field is
+ * annotated below with two of these locks, then holding either lock is
+ * sufficient for read access, but both locks are required for write
+ * access.
+ *
+ * In contrast, the synchronization of accesses to the page's dirty field
+ * is machine dependent (M). In the machine-independent layer, the lock
+ * on the object that the page belongs to must be held in order to
+ * operate on the field. However, the pmap layer is permitted to set
+ * all bits within the field without holding that lock. Therefore, if
+ * the underlying architecture does not support atomic read-modify-write
+ * operations on the field's type, then the machine-independent layer
+ * must also hold the page queues lock when performing read-modify-write
+ * operations and the pmap layer must hold the page queues lock when
+ * setting the field. In the machine-independent layer, the
+ * implementation of read-modify-write operations on the field is
+ * encapsulated in vm_page_clear_dirty_mask().
*/
TAILQ_HEAD(pglist, vm_page);
@@ -120,18 +136,19 @@ struct vm_page {
u_char busy; /* page busy count (O) */
/* NOTE that these must support one bit per DEV_BSIZE in a page!!! */
/* so, on normal X86 kernels, they must be at least 8 bits wide */
+ /* In reality, support for 32KB pages is not fully implemented. */
#if PAGE_SIZE == 4096
u_char valid; /* map of valid DEV_BSIZE chunks (O) */
- u_char dirty; /* map of dirty DEV_BSIZE chunks (O) */
+ u_char dirty; /* map of dirty DEV_BSIZE chunks (M) */
#elif PAGE_SIZE == 8192
u_short valid; /* map of valid DEV_BSIZE chunks (O) */
- u_short dirty; /* map of dirty DEV_BSIZE chunks (O) */
+ u_short dirty; /* map of dirty DEV_BSIZE chunks (M) */
#elif PAGE_SIZE == 16384
u_int valid; /* map of valid DEV_BSIZE chunks (O) */
- u_int dirty; /* map of dirty DEV_BSIZE chunks (O) */
+ u_int dirty; /* map of dirty DEV_BSIZE chunks (M) */
#elif PAGE_SIZE == 32768
u_long valid; /* map of valid DEV_BSIZE chunks (O) */
- u_long dirty; /* map of dirty DEV_BSIZE chunks (O) */
+ u_long dirty; /* map of dirty DEV_BSIZE chunks (M) */
#endif
};
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index c2690af..e9c9927 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -216,15 +216,21 @@ static void vm_req_vmdaemon(int req);
#endif
static void vm_pageout_page_stats(void);
+/*
+ * Initialize a dummy page for marking the caller's place in the specified
+ * paging queue. In principle, this function only needs to set the flag
+ * PG_MARKER. Nonetheless, it sets the flag VPO_BUSY and initializes the hold
+ * count to one as safety precautions.
+ */
static void
vm_pageout_init_marker(vm_page_t marker, u_short queue)
{
bzero(marker, sizeof(*marker));
- marker->flags = PG_FICTITIOUS | PG_MARKER;
+ marker->flags = PG_MARKER;
marker->oflags = VPO_BUSY;
marker->queue = queue;
- marker->wire_count = 1;
+ marker->hold_count = 1;
}
/*
@@ -1634,7 +1640,9 @@ vm_daemon()
struct thread *td;
struct vmspace *vm;
int breakout, swapout_flags, tryagain, attempts;
+#ifdef RACCT
uint64_t rsize, ravailable;
+#endif
while (TRUE) {
mtx_lock(&vm_daemon_mtx);
@@ -1716,6 +1724,7 @@ again:
vm_pageout_map_deactivate_pages(
&vm->vm_map, limit);
}
+#ifdef RACCT
rsize = IDX_TO_OFF(size);
PROC_LOCK(p);
racct_set(p, RACCT_RSS, rsize);
@@ -1744,6 +1753,7 @@ again:
if (rsize > ravailable)
tryagain = 1;
}
+#endif
vmspace_free(vm);
}
sx_sunlock(&allproc_lock);
diff --git a/sys/vm/vm_unix.c b/sys/vm/vm_unix.c
index c07a1c1..6f8e7c8 100644
--- a/sys/vm/vm_unix.c
+++ b/sys/vm/vm_unix.c
@@ -117,6 +117,7 @@ obreak(td, uap)
error = ENOMEM;
goto done;
}
+#ifdef RACCT
PROC_LOCK(td->td_proc);
error = racct_set(td->td_proc, RACCT_DATA, new - base);
if (error != 0) {
@@ -133,13 +134,16 @@ obreak(td, uap)
goto done;
}
PROC_UNLOCK(td->td_proc);
+#endif
rv = vm_map_insert(&vm->vm_map, NULL, 0, old, new,
VM_PROT_RW, VM_PROT_ALL, 0);
if (rv != KERN_SUCCESS) {
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_set_force(td->td_proc, RACCT_DATA, old - base);
racct_set_force(td->td_proc, RACCT_VMEM, vm->vm_map.size);
PROC_UNLOCK(td->td_proc);
+#endif
error = ENOMEM;
goto done;
}
@@ -165,10 +169,12 @@ obreak(td, uap)
goto done;
}
vm->vm_dsize -= btoc(old - new);
+#ifdef RACCT
PROC_LOCK(td->td_proc);
racct_set_force(td->td_proc, RACCT_DATA, new - base);
racct_set_force(td->td_proc, RACCT_VMEM, vm->vm_map.size);
PROC_UNLOCK(td->td_proc);
+#endif
}
done:
vm_map_unlock(&vm->vm_map);
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index a8eca20..23ade63 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -387,7 +387,7 @@ vnode_pager_setsize(vp, nsize)
*/
if (nobjsize < object->size)
vm_object_page_remove(object, nobjsize, object->size,
- FALSE);
+ 0);
/*
* this gets rid of garbage at the end of a page that is now
* only partially backed by the vnode.
diff --git a/sys/x86/include/mptable.h b/sys/x86/include/mptable.h
index 451d9ce..85a21c9 100644
--- a/sys/x86/include/mptable.h
+++ b/sys/x86/include/mptable.h
@@ -72,6 +72,8 @@ typedef struct MPCTH {
u_char reserved;
} *mpcth_t;
+/* Base table entries */
+
#define MPCT_ENTRY_PROCESSOR 0
#define MPCT_ENTRY_BUS 1
#define MPCT_ENTRY_IOAPIC 2
@@ -132,7 +134,56 @@ typedef struct INTENTRY {
#define INTENTRY_FLAGS_TRIGGER_EDGE 0x4
#define INTENTRY_FLAGS_TRIGGER_LEVEL 0xc
-/* descriptions of MP basetable entries */
+/* Extended table entries */
+
+typedef struct EXTENTRY {
+ u_char type;
+ u_char length;
+} *ext_entry_ptr;
+
+#define MPCT_EXTENTRY_SAS 0x80
+#define MPCT_EXTENTRY_BHD 0x81
+#define MPCT_EXTENTRY_CBASM 0x82
+
+typedef struct SASENTRY {
+ u_char type;
+ u_char length;
+ u_char bus_id;
+ u_char address_type;
+ uint64_t address_base;
+ uint64_t address_length;
+} __attribute__((__packed__)) *sas_entry_ptr;
+
+#define SASENTRY_TYPE_IO 0
+#define SASENTRY_TYPE_MEMORY 1
+#define SASENTRY_TYPE_PREFETCH 2
+
+typedef struct BHDENTRY {
+ u_char type;
+ u_char length;
+ u_char bus_id;
+ u_char bus_info;
+ u_char parent_bus;
+ u_char reserved[3];
+} *bhd_entry_ptr;
+
+#define BHDENTRY_INFO_SUBTRACTIVE_DECODE 0x1
+
+typedef struct CBASMENTRY {
+ u_char type;
+ u_char length;
+ u_char bus_id;
+ u_char address_mod;
+ u_int predefined_range;
+} *cbasm_entry_ptr;
+
+#define CBASMENTRY_ADDRESS_MOD_ADD 0x0
+#define CBASMENTRY_ADDRESS_MOD_SUBTRACT 0x1
+
+#define CBASMENTRY_RANGE_ISA_IO 0
+#define CBASMENTRY_RANGE_VGA_IO 1
+
+/* descriptions of MP table entries */
typedef struct BASETABLE_ENTRY {
u_char type;
u_char length;
@@ -140,6 +191,17 @@ typedef struct BASETABLE_ENTRY {
} basetable_entry;
#ifdef _KERNEL
+struct mptable_hostb_softc {
+#ifdef NEW_PCIB
+ struct pcib_host_resources sc_host_res;
+ int sc_decodes_vga_io;
+ int sc_decodes_isa_io;
+#endif
+};
+
+#ifdef NEW_PCIB
+void mptable_pci_host_res_init(device_t pcib);
+#endif
int mptable_pci_probe_table(int bus);
int mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
#endif
diff --git a/sys/x86/include/pci_cfgreg.h b/sys/x86/include/pci_cfgreg.h
new file mode 100644
index 0000000..ea5e319
--- /dev/null
+++ b/sys/x86/include/pci_cfgreg.h
@@ -0,0 +1,60 @@
+/*-
+ * Copyright (c) 1997, Stefan Esser <se@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#ifndef __X86_PCI_CFGREG_H__
+#define __X86_PCI_CFGREG_H__
+
+#define CONF1_ADDR_PORT 0x0cf8
+#define CONF1_DATA_PORT 0x0cfc
+
+#define CONF1_ENABLE 0x80000000ul
+#define CONF1_ENABLE_CHK 0x80000000ul
+#define CONF1_ENABLE_MSK 0x7f000000ul
+#define CONF1_ENABLE_CHK1 0xff000001ul
+#define CONF1_ENABLE_MSK1 0x80000001ul
+#define CONF1_ENABLE_RES1 0x80000000ul
+
+#define CONF2_ENABLE_PORT 0x0cf8
+#define CONF2_FORWARD_PORT 0x0cfa
+
+#define CONF2_ENABLE_CHK 0x0e
+#define CONF2_ENABLE_RES 0x0e
+
+u_long hostb_alloc_start(int type, u_long start, u_long end, u_long count);
+int pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus);
+int pci_cfgregopen(void);
+u_int32_t pci_cfgregread(int bus, int slot, int func, int reg, int bytes);
+void pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes);
+#ifdef __HAVE_PIR
+void pci_pir_open(void);
+int pci_pir_probe(int bus, int require_parse);
+int pci_pir_route_interrupt(int bus, int device, int func, int pin);
+#endif
+
+#endif /* !__X86_PCI_CFGREG_H__ */
diff --git a/sys/i386/pci/pci_bus.c b/sys/x86/pci/pci_bus.c
index 61dab3f..0efac6e 100644
--- a/sys/i386/pci/pci_bus.c
+++ b/sys/x86/pci/pci_bus.c
@@ -51,9 +51,6 @@ __FBSDID("$FreeBSD$");
#include "pcib_if.h"
-static int pcibios_pcib_route_interrupt(device_t pcib, device_t dev,
- int pin);
-
int
legacy_pcib_maxslots(device_t dev)
{
@@ -62,7 +59,7 @@ legacy_pcib_maxslots(device_t dev)
/* read configuration space register */
-u_int32_t
+uint32_t
legacy_pcib_read_config(device_t dev, u_int bus, u_int slot, u_int func,
u_int reg, int bytes)
{
@@ -73,11 +70,26 @@ legacy_pcib_read_config(device_t dev, u_int bus, u_int slot, u_int func,
void
legacy_pcib_write_config(device_t dev, u_int bus, u_int slot, u_int func,
- u_int reg, u_int32_t data, int bytes)
+ u_int reg, uint32_t data, int bytes)
{
pci_cfgregwrite(bus, slot, func, reg, data, bytes);
}
+/* route interrupt */
+
+static int
+legacy_pcib_route_interrupt(device_t pcib, device_t dev, int pin)
+{
+
+#ifdef __HAVE_PIR
+ return (pci_pir_route_interrupt(pci_get_bus(dev), pci_get_slot(dev),
+ pci_get_function(dev), pin));
+#else
+ /* No routing possible */
+ return (PCI_INVALID_IRQ);
+#endif
+}
+
/* Pass MSI requests up to the nexus. */
static int
@@ -115,6 +127,7 @@ legacy_pcib_is_host_bridge(int bus, int slot, int func,
uint32_t id, uint8_t class, uint8_t subclass,
uint8_t *busnum)
{
+#ifdef __i386__
const char *s = NULL;
static uint8_t pxb[4]; /* hack for 450nx */
@@ -332,6 +345,14 @@ legacy_pcib_is_host_bridge(int bus, int slot, int func,
}
return s;
+#else
+ const char *s = NULL;
+
+ *busnum = 0;
+ if (class == PCIC_BRIDGE && subclass == PCIS_BRIDGE_HOST)
+ s = "Host to PCI bridge";
+ return s;
+#endif
}
/*
@@ -342,7 +363,7 @@ static void
legacy_pcib_identify(driver_t *driver, device_t parent)
{
int bus, slot, func;
- u_int8_t hdrtype;
+ uint8_t hdrtype;
int found = 0;
int pcifunchigh;
int found824xx = 0;
@@ -385,8 +406,8 @@ legacy_pcib_identify(driver_t *driver, device_t parent)
/*
* Read the IDs and class from the device.
*/
- u_int32_t id;
- u_int8_t class, subclass, busnum;
+ uint32_t id;
+ uint8_t class, subclass, busnum;
const char *s;
device_t *devs;
int ndevs, i;
@@ -471,19 +492,23 @@ legacy_pcib_probe(device_t dev)
static int
legacy_pcib_attach(device_t dev)
{
+#ifdef __HAVE_PIR
device_t pir;
+#endif
int bus;
+ bus = pcib_get_bus(dev);
+#ifdef __HAVE_PIR
/*
* Look for a PCI BIOS interrupt routing table as that will be
* our method of routing interrupts if we have one.
*/
- bus = pcib_get_bus(dev);
if (pci_pir_probe(bus, 0)) {
pir = BUS_ADD_CHILD(device_get_parent(dev), 0, "pir", 0);
if (pir != NULL)
device_probe_and_attach(pir);
}
+#endif
device_add_child(dev, "pci", bus);
return bus_generic_attach(dev);
}
@@ -519,35 +544,45 @@ legacy_pcib_write_ivar(device_t dev, device_t child, int which,
return ENOENT;
}
+/*
+ * Helper routine for x86 Host-PCI bridge driver resource allocation.
+ * This is used to adjust the start address of wildcard allocation
+ * requests to avoid low addresses that are known to be problematic.
+ *
+ * If no memory preference is given, use upper 32MB slot most BIOSes
+ * use for their memory window. This is typically only used on older
+ * laptops that don't have PCI busses behind a PCI bridge, so assuming
+ * > 32MB is likely OK.
+ *
+ * However, this can cause problems for other chipsets, so we make
+ * this tunable by hw.pci.host_mem_start.
+ */
SYSCTL_DECL(_hw_pci);
-static unsigned long legacy_host_mem_start = 0x80000000;
-TUNABLE_ULONG("hw.pci.host_mem_start", &legacy_host_mem_start);
-SYSCTL_ULONG(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN,
- &legacy_host_mem_start, 0x80000000,
- "Limit the host bridge memory to being above this address. Must be\n\
-set at boot via a tunable.");
+static unsigned long host_mem_start = 0x80000000;
+TUNABLE_ULONG("hw.pci.host_mem_start", &host_mem_start);
+SYSCTL_ULONG(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN, &host_mem_start,
+ 0, "Limit the host bridge memory to being above this address.");
+
+u_long
+hostb_alloc_start(int type, u_long start, u_long end, u_long count)
+{
+
+ if (start + count - 1 != end) {
+ if (type == SYS_RES_MEMORY && start < host_mem_start)
+ start = host_mem_start;
+ if (type == SYS_RES_IOPORT && start < 0x1000)
+ start = 0x1000;
+ }
+ return (start);
+}
struct resource *
legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
- /*
- * If no memory preference is given, use upper 32MB slot most
- * bioses use for their memory window. Typically other bridges
- * before us get in the way to assert their preferences on memory.
- * Hardcoding like this sucks, so a more MD/MI way needs to be
- * found to do it. This is typically only used on older laptops
- * that don't have pci busses behind pci bridge, so assuming > 32MB
- * is liekly OK.
- *
- * However, this can cause problems for other chipsets, so we make
- * this tunable by hw.pci.host_mem_start.
- */
- if (type == SYS_RES_MEMORY && start == 0UL && end == ~0UL)
- start = legacy_host_mem_start;
- if (type == SYS_RES_IOPORT && start == 0UL && end == ~0UL)
- start = 0x1000;
+
+ start = hostb_alloc_start(type, start, end, count);
return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
count, flags));
}
@@ -577,7 +612,7 @@ static device_method_t legacy_pcib_methods[] = {
DEVMETHOD(pcib_maxslots, legacy_pcib_maxslots),
DEVMETHOD(pcib_read_config, legacy_pcib_read_config),
DEVMETHOD(pcib_write_config, legacy_pcib_write_config),
- DEVMETHOD(pcib_route_interrupt, pcibios_pcib_route_interrupt),
+ DEVMETHOD(pcib_route_interrupt, legacy_pcib_route_interrupt),
DEVMETHOD(pcib_alloc_msi, legacy_pcib_alloc_msi),
DEVMETHOD(pcib_release_msi, pcib_release_msi),
DEVMETHOD(pcib_alloc_msix, legacy_pcib_alloc_msix),
@@ -641,7 +676,7 @@ static devclass_t pcibus_pnp_devclass;
DEFINE_CLASS_0(pcibus_pnp, pcibus_pnp_driver, pcibus_pnp_methods, 1);
DRIVER_MODULE(pcibus_pnp, isa, pcibus_pnp_driver, pcibus_pnp_devclass, 0, 0);
-
+#ifdef __HAVE_PIR
/*
* Provide a PCI-PCI bridge driver for PCI busses behind PCI-PCI bridges
* that appear in the PCIBIOS Interrupt Routing Table to use the routing
@@ -654,7 +689,7 @@ static device_method_t pcibios_pcib_pci_methods[] = {
DEVMETHOD(device_probe, pcibios_pcib_probe),
/* pcib interface */
- DEVMETHOD(pcib_route_interrupt, pcibios_pcib_route_interrupt),
+ DEVMETHOD(pcib_route_interrupt, legacy_pcib_route_interrupt),
{0, 0}
};
@@ -681,10 +716,4 @@ pcibios_pcib_probe(device_t dev)
device_set_desc(dev, "PCIBIOS PCI-PCI bridge");
return (-2000);
}
-
-static int
-pcibios_pcib_route_interrupt(device_t pcib, device_t dev, int pin)
-{
- return (pci_pir_route_interrupt(pci_get_bus(dev), pci_get_slot(dev),
- pci_get_function(dev), pin));
-}
+#endif
diff --git a/sys/x86/x86/mptable.c b/sys/x86/x86/mptable.c
index 4b240a6..fe520eb 100644
--- a/sys/x86/x86/mptable.c
+++ b/sys/x86/x86/mptable.c
@@ -32,22 +32,31 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/malloc.h>
+#ifdef NEW_PCIB
+#include <sys/rman.h>
+#endif
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
+#include <dev/pci/pcivar.h>
+#ifdef NEW_PCIB
+#include <dev/pci/pcib_private.h>
+#endif
#include <x86/apicreg.h>
#include <x86/mptable.h>
#include <machine/frame.h>
#include <machine/intr_machdep.h>
#include <machine/apicvar.h>
#include <machine/md_var.h>
+#ifdef NEW_PCIB
+#include <machine/resource.h>
+#endif
#include <machine/specialreg.h>
-#include <dev/pci/pcivar.h>
-
/* string defined by the Intel MP Spec as identifying the MP table */
#define MP_SIG 0x5f504d5f /* _MP_ */
@@ -67,6 +76,7 @@ __FBSDID("$FreeBSD$");
#define BIOS_COUNT (BIOS_SIZE/4)
typedef void mptable_entry_handler(u_char *entry, void *arg);
+typedef void mptable_extended_entry_handler(ext_entry_ptr entry, void *arg);
static basetable_entry basetable_entry_types[] =
{
@@ -146,6 +156,7 @@ struct pci_route_interrupt_args {
static mpfps_t mpfps;
static mpcth_t mpct;
+static ext_entry_ptr mpet;
static void *ioapics[MAX_APIC_ID + 1];
static bus_datum *busses;
static int mptable_nioapics, mptable_nbusses, mptable_maxbusid;
@@ -181,6 +192,10 @@ static void mptable_probe_cpus_handler(u_char *entry, void *arg __unused);
static void mptable_register(void *dummy);
static int mptable_setup_local(void);
static int mptable_setup_io(void);
+#ifdef NEW_PCIB
+static void mptable_walk_extended_table(
+ mptable_extended_entry_handler *handler, void *arg);
+#endif
static void mptable_walk_table(mptable_entry_handler *handler, void *arg);
static int search_for_sig(u_int32_t target, int count);
@@ -281,6 +296,11 @@ found:
__func__);
return (ENXIO);
}
+ if (mpct->extended_table_length != 0 &&
+ mpct->extended_table_length + mpct->base_table_length +
+ (uintptr_t)mpfps->pap < 1024 * 1024)
+ mpet = (ext_entry_ptr)((char *)mpct +
+ mpct->base_table_length);
if (mpct->signature[0] != 'P' || mpct->signature[1] != 'C' ||
mpct->signature[2] != 'M' || mpct->signature[3] != 'P') {
printf("%s: MP Config Table has bad signature: %c%c%c%c\n",
@@ -393,7 +413,7 @@ SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, mptable_register,
NULL);
/*
- * Call the handler routine for each entry in the MP config table.
+ * Call the handler routine for each entry in the MP config base table.
*/
static void
mptable_walk_table(mptable_entry_handler *handler, void *arg)
@@ -419,6 +439,27 @@ mptable_walk_table(mptable_entry_handler *handler, void *arg)
}
}
+#ifdef NEW_PCIB
+/*
+ * Call the handler routine for each entry in the MP config extended
+ * table.
+ */
+static void
+mptable_walk_extended_table(mptable_extended_entry_handler *handler, void *arg)
+{
+ ext_entry_ptr end, entry;
+
+ if (mpet == NULL)
+ return;
+ entry = mpet;
+ end = (ext_entry_ptr)((char *)mpet + mpct->extended_table_length);
+ while (entry < end) {
+ handler(entry, arg);
+ entry = (ext_entry_ptr)((char *)entry + entry->length);
+ }
+}
+#endif
+
static void
mptable_probe_cpus_handler(u_char *entry, void *arg)
{
@@ -1053,3 +1094,133 @@ mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin)
'A' + pin, args.vector);
return (args.vector);
}
+
+#ifdef NEW_PCIB
+struct host_res_args {
+ struct mptable_hostb_softc *sc;
+ device_t dev;
+ u_char bus;
+};
+
+/*
+ * Initialize a Host-PCI bridge so it can restrict resource allocation
+ * requests to the resources it actually decodes according to MP
+ * config table extended entries.
+ */
+static void
+mptable_host_res_handler(ext_entry_ptr entry, void *arg)
+{
+ struct host_res_args *args;
+ cbasm_entry_ptr cbasm;
+ sas_entry_ptr sas;
+ const char *name;
+ uint64_t start, end;
+ int error, *flagp, flags, type;
+
+ args = arg;
+ switch (entry->type) {
+ case MPCT_EXTENTRY_SAS:
+ sas = (sas_entry_ptr)entry;
+ if (sas->bus_id != args->bus)
+ break;
+ switch (sas->address_type) {
+ case SASENTRY_TYPE_IO:
+ type = SYS_RES_IOPORT;
+ flags = 0;
+ break;
+ case SASENTRY_TYPE_MEMORY:
+ type = SYS_RES_MEMORY;
+ flags = 0;
+ break;
+ case SASENTRY_TYPE_PREFETCH:
+ type = SYS_RES_MEMORY;
+ flags = RF_PREFETCHABLE;
+ break;
+ default:
+ printf(
+ "MPTable: Unknown systems address space type for bus %u: %d\n",
+ sas->bus_id, sas->address_type);
+ return;
+ }
+ start = sas->address_base;
+ end = sas->address_base + sas->address_length - 1;
+#ifdef __i386__
+ if (start > ULONG_MAX) {
+ device_printf(args->dev,
+ "Ignoring %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)start, (uintmax_t)end);
+ break;
+ }
+ if (end > ULONG_MAX) {
+ device_printf(args->dev,
+ "Truncating end of %d range above 4GB (%#jx-%#jx)\n",
+ type, (uintmax_t)start, (uintmax_t)end);
+ end = ULONG_MAX;
+ }
+#endif
+ error = pcib_host_res_decodes(&args->sc->sc_host_res, type,
+ start, end, flags);
+ if (error)
+ panic("Failed to manage %d range (%#jx-%#jx): %d",
+ type, (uintmax_t)start, (uintmax_t)end, error);
+ break;
+ case MPCT_EXTENTRY_CBASM:
+ cbasm = (cbasm_entry_ptr)entry;
+ if (cbasm->bus_id != args->bus)
+ break;
+ switch (cbasm->predefined_range) {
+ case CBASMENTRY_RANGE_ISA_IO:
+ flagp = &args->sc->sc_decodes_isa_io;
+ name = "ISA I/O";
+ break;
+ case CBASMENTRY_RANGE_VGA_IO:
+ flagp = &args->sc->sc_decodes_vga_io;
+ name = "VGA I/O";
+ break;
+ default:
+ printf(
+ "MPTable: Unknown compatiblity address space range for bus %u: %d\n",
+ cbasm->bus_id, cbasm->predefined_range);
+ return;
+ }
+ if (*flagp != 0)
+ printf(
+ "MPTable: Duplicate compatibility %s range for bus %u\n",
+ name, cbasm->bus_id);
+ switch (cbasm->address_mod) {
+ case CBASMENTRY_ADDRESS_MOD_ADD:
+ *flagp = 1;
+ if (bootverbose)
+ device_printf(args->dev, "decoding %s ports\n",
+ name);
+ break;
+ case CBASMENTRY_ADDRESS_MOD_SUBTRACT:
+ *flagp = -1;
+ if (bootverbose)
+ device_printf(args->dev,
+ "not decoding %s ports\n", name);
+ break;
+ default:
+ printf(
+ "MPTable: Unknown compatibility address space modifier: %u\n",
+ cbasm->address_mod);
+ break;
+ }
+ break;
+ }
+}
+
+void
+mptable_pci_host_res_init(device_t pcib)
+{
+ struct host_res_args args;
+
+ KASSERT(pci0 != -1, ("do not know how to map PCI bus IDs"));
+ args.bus = pci_get_bus(pcib) + pci0;
+ args.dev = pcib;
+ args.sc = device_get_softc(pcib);
+ if (pcib_host_res_init(pcib, &args.sc->sc_host_res) != 0)
+ panic("failed to init hostb resources");
+ mptable_walk_extended_table(mptable_host_res_handler, &args);
+}
+#endif
diff --git a/sys/x86/x86/mptable_pci.c b/sys/x86/x86/mptable_pci.c
index 48eec7f..f0b90a8 100644
--- a/sys/x86/x86/mptable_pci.c
+++ b/sys/x86/x86/mptable_pci.c
@@ -69,6 +69,9 @@ static int
mptable_hostb_attach(device_t dev)
{
+#ifdef NEW_PCIB
+ mptable_pci_host_res_init(dev);
+#endif
device_add_child(dev, "pci", pcib_get_bus(dev));
return (bus_generic_attach(dev));
}
@@ -104,6 +107,80 @@ mptable_hostb_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr,
return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data));
}
+#ifdef NEW_PCIB
+static int
+mptable_is_isa_range(u_long start, u_long end)
+{
+
+ if (end >= 0x10000)
+ return (0);
+ if ((start & 0xfc00) != (end & 0xfc00))
+ return (0);
+ start &= ~0xfc00;
+ end &= ~0xfc00;
+ return (start >= 0x100 && end <= 0x3ff);
+}
+
+static int
+mptable_is_vga_range(u_long start, u_long end)
+{
+ if (end >= 0x10000)
+ return (0);
+ if ((start & 0xfc00) != (end & 0xfc00))
+ return (0);
+ start &= ~0xfc00;
+ end &= ~0xfc00;
+ return (pci_is_vga_ioport_range(start, end));
+}
+
+static struct resource *
+mptable_hostb_alloc_resource(device_t dev, device_t child, int type, int *rid,
+ u_long start, u_long end, u_long count, u_int flags)
+{
+ struct mptable_hostb_softc *sc;
+
+ sc = device_get_softc(dev);
+ if (type == SYS_RES_IOPORT && start + count - 1 == end) {
+ if (mptable_is_isa_range(start, end)) {
+ switch (sc->sc_decodes_isa_io) {
+ case -1:
+ return (NULL);
+ case 1:
+ return (bus_generic_alloc_resource(dev, child,
+ type, rid, start, end, count, flags));
+ default:
+ break;
+ }
+ }
+ if (mptable_is_vga_range(start, end)) {
+ switch (sc->sc_decodes_vga_io) {
+ case -1:
+ return (NULL);
+ case 1:
+ return (bus_generic_alloc_resource(dev, child,
+ type, rid, start, end, count, flags));
+ default:
+ break;
+ }
+ }
+ }
+ start = hostb_alloc_start(type, start, end, count);
+ return (pcib_host_res_alloc(&sc->sc_host_res, child, type, rid, start,
+ end, count, flags));
+}
+
+static int
+mptable_hostb_adjust_resource(device_t dev, device_t child, int type,
+ struct resource *r, u_long start, u_long end)
+{
+ struct mptable_hostb_softc *sc;
+
+ sc = device_get_softc(dev);
+ return (pcib_host_res_adjust(&sc->sc_host_res, child, type, r, start,
+ end));
+}
+#endif
+
static device_method_t mptable_hostb_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, mptable_hostb_probe),
@@ -116,8 +193,13 @@ static device_method_t mptable_hostb_methods[] = {
DEVMETHOD(bus_print_child, bus_generic_print_child),
DEVMETHOD(bus_read_ivar, legacy_pcib_read_ivar),
DEVMETHOD(bus_write_ivar, legacy_pcib_write_ivar),
+#ifdef NEW_PCIB
+ DEVMETHOD(bus_alloc_resource, mptable_hostb_alloc_resource),
+ DEVMETHOD(bus_adjust_resource, mptable_hostb_adjust_resource),
+#else
DEVMETHOD(bus_alloc_resource, legacy_pcib_alloc_resource),
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
+#endif
DEVMETHOD(bus_release_resource, bus_generic_release_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
@@ -140,7 +222,8 @@ static device_method_t mptable_hostb_methods[] = {
static devclass_t hostb_devclass;
-DEFINE_CLASS_0(pcib, mptable_hostb_driver, mptable_hostb_methods, 1);
+DEFINE_CLASS_0(pcib, mptable_hostb_driver, mptable_hostb_methods,
+ sizeof(struct mptable_hostb_softc));
DRIVER_MODULE(mptable_pcib, legacy, mptable_hostb_driver, hostb_devclass, 0, 0);
/* PCI to PCI bridge driver. */
diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c
index 70c176a..0b383bf 100644
--- a/sys/x86/x86/tsc.c
+++ b/sys/x86/x86/tsc.c
@@ -444,6 +444,20 @@ init_TSC_tc(void)
goto init;
}
+ /*
+ * We cannot use the TSC if it stops incrementing in deep sleep.
+ * Currently only Intel CPUs are known for this problem unless
+ * the invariant TSC bit is set.
+ */
+ if (cpu_can_deep_sleep && cpu_vendor_id == CPU_VENDOR_INTEL &&
+ (amd_pminfo & AMDPM_TSC_INVARIANT) == 0) {
+ tsc_timecounter.tc_quality = -1000;
+ tsc_timecounter.tc_flags |= TC_FLAGS_C3STOP;
+ if (bootverbose)
+ printf("TSC timecounter disabled: C3 enabled.\n");
+ goto init;
+ }
+
#ifdef SMP
/*
* We can not use the TSC in SMP mode unless the TSCs on all CPUs are
@@ -461,7 +475,7 @@ init_TSC_tc(void)
tsc_timecounter.tc_quality = 1000;
init:
- for (shift = 0; shift < 32 && (tsc_freq >> shift) > max_freq; shift++)
+ for (shift = 0; shift < 31 && (tsc_freq >> shift) > max_freq; shift++)
;
if (shift > 0) {
tsc_timecounter.tc_get_timecount = tsc_get_timecount_low;
@@ -579,6 +593,9 @@ tsc_get_timecount(struct timecounter *tc __unused)
static u_int
tsc_get_timecount_low(struct timecounter *tc)
{
+ uint32_t rv;
- return (rdtsc() >> (int)(intptr_t)tc->tc_priv);
+ __asm __volatile("rdtsc; shrd %%cl, %%edx, %0"
+ : "=a" (rv) : "c" ((int)(intptr_t)tc->tc_priv) : "edx");
+ return (rv);
}
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 8d24fc6..3de090d 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -7,11 +7,8 @@
.if ${MK_ACCT} == no
OLD_FILES+=etc/periodic/daily/310.accounting
-OLD_FILES+=etc/periodic/monthly/200.accounting
-OLD_FILES+=usr/sbin/ac
OLD_FILES+=usr/sbin/accton
OLD_FILES+=usr/sbin/sa
-OLD_FILES+=usr/share/man/man8/ac.8.gz
OLD_FILES+=usr/share/man/man8/accton.8.gz
OLD_FILES+=usr/share/man/man8/sa.8.gz
.endif
@@ -3329,6 +3326,24 @@ OLD_FILES+=usr/share/man/man8/telnetd.8.gz
# to be filled in
#.endif
+.if ${MK_UTMPX} == no
+OLD_FILES+=etc/periodic/monthly/200.accounting
+OLD_FILES+=usr/bin/last
+OLD_FILES+=usr/bin/users
+OLD_FILES+=usr/bin/who
+OLD_FILES+=usr/bin/wtmpcvt
+OLD_FILES+=usr/sbin/ac
+OLD_FILES+=usr/sbin/lastlogin
+OLD_FILES+=usr/sbin/utxrm
+OLD_FILES+=usr/share/man/man1/last.1.gz
+OLD_FILES+=usr/share/man/man1/users.1.gz
+OLD_FILES+=usr/share/man/man1/who.1.gz
+OLD_FILES+=usr/share/man/man1/wtmpcvt.1.gz
+OLD_FILES+=usr/share/man/man8/ac.8.gz
+OLD_FILES+=usr/share/man/man8/lastlogin.8.gz
+OLD_FILES+=usr/share/man/man8/utxrm.8.gz
+.endif
+
.if ${MK_WIRELESS} == no
OLD_FILES+=etc/regdomain.xml
OLD_FILES+=usr/sbin/ancontrol
diff --git a/tools/build/options/WITHOUT_ACCT b/tools/build/options/WITHOUT_ACCT
index 4538ee7..a0e0f54 100644
--- a/tools/build/options/WITHOUT_ACCT
+++ b/tools/build/options/WITHOUT_ACCT
@@ -1,5 +1,5 @@
.\" $FreeBSD$
Set to not build process accounting tools such as
-.Xr ac 8
+.Xr accton 8
and
-.Xr accton 8 .
+.Xr sa 8 .
diff --git a/tools/build/options/WITHOUT_UTMPX b/tools/build/options/WITHOUT_UTMPX
new file mode 100644
index 0000000..205ca5c
--- /dev/null
+++ b/tools/build/options/WITHOUT_UTMPX
@@ -0,0 +1,10 @@
+.\" $FreeBSD$
+Set to not build user accounting tools such as
+.Xr last 1 ,
+.Xr users 1 ,
+.Xr who 1 ,
+.Xr wtmpcvt 1 ,
+.Xr ac 8 ,
+.Xr lastlogin 8
+and
+.Xr utxrm 8 .
diff --git a/tools/regression/bin/sh/builtins/case10.0 b/tools/regression/bin/sh/builtins/case10.0
new file mode 100644
index 0000000..a627b5c
--- /dev/null
+++ b/tools/regression/bin/sh/builtins/case10.0
@@ -0,0 +1,16 @@
+# $FreeBSD$
+
+case ! in
+[\!!]) ;;
+*) echo Failed at $LINENO ;;
+esac
+
+case ! in
+['!'!]) ;;
+*) echo Failed at $LINENO ;;
+esac
+
+case ! in
+["!"!]) ;;
+*) echo Failed at $LINENO ;;
+esac
diff --git a/tools/regression/bin/sh/builtins/case9.0 b/tools/regression/bin/sh/builtins/case9.0
new file mode 100644
index 0000000..476caec
--- /dev/null
+++ b/tools/regression/bin/sh/builtins/case9.0
@@ -0,0 +1,39 @@
+# $FreeBSD$
+
+errors=0
+
+f() {
+ result=
+ case $1 in
+ a) result=${result}a ;;
+ b) result=${result}b ;&
+ c) result=${result}c ;&
+ d) result=${result}d ;;
+ e) result=${result}e ;&
+ esac
+}
+
+check() {
+ f "$1"
+ if [ "$result" != "$2" ]; then
+ printf "For %s, expected %s got %s\n" "$1" "$2" "$result"
+ errors=$((errors + 1))
+ fi
+}
+
+check '' ''
+check a a
+check b bcd
+check c cd
+check d d
+check e e
+
+if ! (case 1 in
+ 1) false ;&
+ 2) true ;;
+esac) then
+ echo "Subshell bad"
+ errors=$((errors + 1))
+fi
+
+exit $((errors != 0))
diff --git a/tools/regression/bin/sh/builtins/export1.0 b/tools/regression/bin/sh/builtins/export1.0
new file mode 100644
index 0000000..7b08c9d
--- /dev/null
+++ b/tools/regression/bin/sh/builtins/export1.0
@@ -0,0 +1,3 @@
+# $FreeBSD$
+
+env @badness=1 ${SH} -c 'v=`export -p`; eval "$v"'
diff --git a/tools/regression/bin/sh/builtins/set2.0 b/tools/regression/bin/sh/builtins/set2.0
new file mode 100644
index 0000000..ad13eab
--- /dev/null
+++ b/tools/regression/bin/sh/builtins/set2.0
@@ -0,0 +1,3 @@
+# $FreeBSD$
+
+! env @badness=1 ${SH} -c 'v=`set`; eval "$v"' 2>&1 | grep @badness
diff --git a/tools/regression/bin/sh/execution/bg4.0 b/tools/regression/bin/sh/execution/bg4.0
new file mode 100644
index 0000000..25e4f4e
--- /dev/null
+++ b/tools/regression/bin/sh/execution/bg4.0
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+x=''
+: ${x:=1} &
+wait
+exit ${x:-0}
diff --git a/tools/regression/bin/sh/expansion/cmdsubst11.0 b/tools/regression/bin/sh/expansion/cmdsubst11.0
new file mode 100644
index 0000000..f1af547
--- /dev/null
+++ b/tools/regression/bin/sh/expansion/cmdsubst11.0
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+# Not required by POSIX but useful for efficiency.
+
+[ $$ = $(eval '${SH} -c echo\ \$PPID') ]
diff --git a/tools/regression/bin/sh/parser/alias6.0 b/tools/regression/bin/sh/parser/alias6.0
new file mode 100644
index 0000000..c723d08
--- /dev/null
+++ b/tools/regression/bin/sh/parser/alias6.0
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+alias alias0='| cat >/dev/null'
+
+eval '{ echo bad; } alias0'
+eval '(echo bad)alias0'
diff --git a/tools/regression/kqueue/config.h b/tools/regression/kqueue/config.h
index 2a377db..a204092 100644
--- a/tools/regression/kqueue/config.h
+++ b/tools/regression/kqueue/config.h
@@ -1,7 +1,7 @@
-/* AUTOMATICALLY GENERATED -- DO NOT EDIT */
/* $FreeBSD$ */
-#define HAVE_ERR_H
-#define HAVE_SYS_EVENT_H
+
+#define HAVE_ERR_H 1
+#define HAVE_SYS_EVENT_H 1
#define HAVE_EV_DISPATCH 1
#define HAVE_EV_RECEIPT 1
#undef HAVE_NOTE_TRUNCATE
diff --git a/tools/regression/kqueue/main.c b/tools/regression/kqueue/main.c
index 182003c..f76c4e2 100644
--- a/tools/regression/kqueue/main.c
+++ b/tools/regression/kqueue/main.c
@@ -18,6 +18,7 @@
#include <sys/types.h>
+#include "config.h"
#include "common.h"
int testnum = 1;
@@ -230,7 +231,7 @@ test_kqueue_close(void)
int
main(int argc, char **argv)
{
- int test_proc = 0; /* XXX-FIXME */
+ int test_proc = 1;
int test_socket = 1;
int test_signal = 1;
int test_vnode = 1;
diff --git a/tools/regression/kqueue/proc.c b/tools/regression/kqueue/proc.c
index d4e863e..6288ee6 100644
--- a/tools/regression/kqueue/proc.c
+++ b/tools/regression/kqueue/proc.c
@@ -16,6 +16,11 @@
* $FreeBSD$
*/
+#include <sys/stat.h>
+
+#include <err.h>
+
+#include "config.h"
#include "common.h"
static int sigusr1_caught = 0;
@@ -37,6 +42,11 @@ add_and_delete(void)
/* Create a child that waits to be killed and then exits */
pid = fork();
if (pid == 0) {
+ struct stat s;
+ if (fstat(kqfd, &s) != -1)
+ errx(1, "kqueue inherited across fork! (%s() at %s:%d)",
+ __func__, __FILE__, __LINE__);
+
pause();
exit(2);
}
@@ -52,6 +62,7 @@ add_and_delete(void)
test_begin("kevent(EVFILT_PROC, EV_DELETE)");
+ sleep(1);
test_no_kevents();
kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_DELETE, 0, 0, NULL);
if (kill(pid, SIGKILL) < 0)
@@ -63,6 +74,7 @@ add_and_delete(void)
}
+#ifdef TODO
static void
event_trigger(void)
{
@@ -93,7 +105,6 @@ event_trigger(void)
success();
}
-#ifdef TODO
void
test_kevent_signal_disable(void)
{
@@ -225,7 +236,10 @@ test_evfilt_proc()
signal(SIGUSR1, sig_handler);
add_and_delete();
+
+#if TODO
event_trigger();
+#endif
signal(SIGUSR1, SIG_DFL);
diff --git a/tools/regression/lib/libc/gen/Makefile b/tools/regression/lib/libc/gen/Makefile
index a79dc2f..72a0750 100644
--- a/tools/regression/lib/libc/gen/Makefile
+++ b/tools/regression/lib/libc/gen/Makefile
@@ -1,6 +1,6 @@
# $FreeBSD$
-TESTS= test-fmtcheck test-fnmatch test-fpclassify test-wordexp
+TESTS= test-fmtcheck test-fnmatch test-fpclassify test-posix_spawn test-wordexp
.PHONY: tests
tests: ${TESTS}
diff --git a/tools/regression/lib/libc/gen/test-posix_spawn.c b/tools/regression/lib/libc/gen/test-posix_spawn.c
new file mode 100644
index 0000000..f1b8d43
--- /dev/null
+++ b/tools/regression/lib/libc/gen/test-posix_spawn.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2011 Jilles Tjoelker
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Test program for posix_spawn() and posix_spawnp() as specified by
+ * IEEE Std. 1003.1-2008.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/wait.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <spawn.h>
+
+int
+main(int argc, char *argv[])
+{
+ int error, status;
+ pid_t pid, waitres;
+ char *myargs[4];
+ char *myenv[2] = { "answer=42", NULL };
+
+ /* Make sure we have no child processes. */
+ while (waitpid(-1, NULL, 0) != -1)
+ ;
+ assert(errno == ECHILD);
+
+ /* Simple test. */
+ myargs[0] = "sh";
+ myargs[1] = "-c";
+ myargs[2] = "exit $answer";
+ myargs[3] = NULL;
+ error = posix_spawnp(&pid, myargs[0], NULL, NULL, myargs, myenv);
+ assert(error == 0);
+ waitres = waitpid(pid, &status, 0);
+ assert(waitres == pid);
+ assert(WIFEXITED(status) && WEXITSTATUS(status) == 42);
+
+ /*
+ * If the executable does not exist, the function shall either fail
+ * and not create a child process or succeed and create a child
+ * process that exits with status 127.
+ */
+ myargs[0] = "/var/empty/nonexistent";
+ myargs[1] = NULL;
+ error = posix_spawn(&pid, myargs[0], NULL, NULL, myargs, myenv);
+ if (error == 0) {
+ waitres = waitpid(pid, &status, 0);
+ assert(waitres == pid);
+ assert(WIFEXITED(status) && WEXITSTATUS(status) == 127);
+ } else {
+ assert(error == ENOENT);
+ waitres = waitpid(-1, NULL, 0);
+ assert(waitres == -1 && errno == ECHILD);
+ }
+
+ printf("PASS posix_spawn()\n");
+ printf("PASS posix_spawnp()\n");
+
+ return (0);
+}
diff --git a/tools/tools/bus_autoconf/Makefile b/tools/tools/bus_autoconf/Makefile
new file mode 100644
index 0000000..c7104de
--- /dev/null
+++ b/tools/tools/bus_autoconf/Makefile
@@ -0,0 +1,46 @@
+# $FreeBSD$
+#
+# Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+#
+# Example on how to use:
+#
+# make clean all install
+#
+# ./bus_autoconf.sh /boot/kernel/*.ko | less
+#
+
+PROG= bus_autoconf
+MAN=
+BINDIR?= /usr/local/bin
+
+SRCS+= bus_autoconf.c
+SRCS+= bus_load_file.c
+SRCS+= bus_sections.c
+SRCS+= bus_usb.c
+
+WARNS= 6
+
+.include <bsd.prog.mk>
diff --git a/tools/tools/bus_autoconf/bus_autoconf.c b/tools/tools/bus_autoconf/bus_autoconf.c
new file mode 100644
index 0000000..adbf6e4
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_autoconf.c
@@ -0,0 +1,125 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Disclaimer: This utility and format is subject to change and not a
+ * comitted interface.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include "bus_autoconf.h"
+#include "bus_sections.h"
+#include "bus_load_file.h"
+#include "bus_usb.h"
+
+static void
+usage(void)
+{
+ fprintf(stderr,
+ "bus_autoconf - devd config file generator\n"
+ " -i <structure_type,module.ko>\n"
+ " -F <format_file>\n"
+ " -h show usage\n"
+ );
+ exit(EX_USAGE);
+}
+
+int
+main(int argc, char **argv)
+{
+ const char *params = "i:F:h";
+ char *fname;
+ char *section;
+ char *module;
+ char *postfix;
+ uint8_t *ptr;
+ uint32_t len;
+ int c;
+ int any_opt = 0;
+
+ while ((c = getopt(argc, argv, params)) != -1) {
+ switch (c) {
+ case 'i':
+ fname = optarg;
+ load_file(fname, &ptr, &len);
+
+ module = strchr(fname, ',');
+ if (module == NULL) {
+ errx(EX_USAGE, "Invalid input "
+ "file name '%s'", fname);
+ }
+ /* split module and section */
+ *module++ = 0;
+
+ /* remove postfix */
+ postfix = strchr(module, '.');
+ if (postfix)
+ *postfix = 0;
+
+ /* get section name */
+ section = fname;
+
+ /* check section type */
+ if (strncmp(section, "usb_", 4) == 0)
+ usb_import_entries(section, module, ptr, len);
+ else
+ errx(EX_USAGE, "Invalid section '%s'", section);
+
+ free(ptr);
+
+ any_opt = 1;
+ break;
+
+ case 'F':
+ fname = optarg;
+ load_file(fname, &ptr, &len);
+ format_parse_entries(ptr, len);
+ free(ptr);
+
+ any_opt = 1;
+ break;
+
+ default:
+ usage();
+ break;
+ }
+ }
+
+ if (any_opt == 0)
+ usage();
+
+ usb_dump_entries();
+
+ return (0);
+}
diff --git a/tools/tools/bus_autoconf/bus_autoconf.h b/tools/tools/bus_autoconf/bus_autoconf.h
new file mode 100644
index 0000000..0a1ca3f
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_autoconf.h
@@ -0,0 +1,31 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _BUS_AUTOCONF_H_
+#define _BUS_AUTOCONF_H_
+
+#endif /* _BUS_AUTOCONF_H_ */
diff --git a/tools/tools/bus_autoconf/bus_autoconf.sh b/tools/tools/bus_autoconf/bus_autoconf.sh
new file mode 100644
index 0000000..c99df91
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_autoconf.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+# Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+OS=FreeBSD
+DOLLAR=$
+OBJCOPY=objcopy
+
+cat <<EOF
+#
+# ${DOLLAR}${OS}${DOLLAR}
+#
+# This file was automatically generated by "tools/bus_autoconf.sh".
+# Please do not edit!
+#
+
+EOF
+
+rm -f bus_autoconf_format.bin
+rm -f bus_autoconf_args.txt
+rm -f bus_autoconf.ids
+
+for F in $*
+do
+
+G=$(basename ${F})
+
+# Format information
+${OBJCOPY} -j bus_autoconf_format -O binary ${F} bus_autoconf.ids 2> /dev/null
+[ -f bus_autoconf.ids ] && cat bus_autoconf.ids >> bus_autoconf_format.bin
+
+# USB Host mode
+${OBJCOPY} -j usb_host_id -O binary ${F} "usb_host_id,${G}" 2> /dev/null
+[ -f "usb_host_id,${G}" ] && (echo -n " -i usb_host_id,${G}" >> bus_autoconf_args.txt)
+
+# USB Device mode
+${OBJCOPY} -j usb_device_id -O binary ${F} "usb_device_id,${G}" 2> /dev/null
+[ -f "usb_device_id,${G}" ] && (echo -n " -i usb_device_id,${G}" >> bus_autoconf_args.txt)
+
+# USB Dual mode
+${OBJCOPY} -j usb_dual_id -O binary ${F} "usb_dual_id,${G}" 2> /dev/null
+[ -f "usb_dual_id,${G}" ] && (echo -n " -i usb_dual_id,${G}" >> bus_autoconf_args.txt)
+
+done
+
+# Dump all data
+bus_autoconf -F bus_autoconf_format.bin $(cat bus_autoconf_args.txt)
+
+# Cleanup
+rm -f -- \
+ $(cat bus_autoconf_args.txt) \
+ bus_autoconf_args.txt \
+ bus_autoconf_format.bin \
+ bus_autoconf.ids
diff --git a/tools/tools/bus_autoconf/bus_autoconf_format_example.txt b/tools/tools/bus_autoconf/bus_autoconf_format_example.txt
new file mode 100644
index 0000000..e118f1f
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_autoconf_format_example.txt
@@ -0,0 +1,111 @@
+/* $FreeBSD$ */
+
+#if BYTE_ORDER == BIG_ENDIAN
+#define U16_XOR "8"
+#define U32_XOR "12"
+#define U64_XOR "56"
+#define U8_BITFIELD_XOR "7"
+#define U16_BITFIELD_XOR "15"
+#define U32_BITFIELD_XOR "31"
+#define U64_BITFIELD_XOR "63"
+#else
+#define U16_XOR "0"
+#define U32_XOR "0"
+#define U64_XOR "0"
+#define U8_BITFIELD_XOR "0"
+#define U16_BITFIELD_XOR "0"
+#define U32_BITFIELD_XOR "0"
+#define U64_BITFIELD_XOR "0"
+#endif
+
+#if USB_HAVE_COMPAT_LINUX
+#define MFL_SIZE "1"
+#else
+#define MFL_SIZE "0"
+#endif
+
+static const char __section("bus_autoconf_format") __used usb_id_format[] = {
+
+ /*
+ * Declare three different sections that use the same format.
+ * All sizes are in bits. Fields cannot be greater than
+ * 8 bits in size. Bitfields having a size greater than 1
+ * must fit within the byte in which the bitfield is defined.
+ */
+
+ "usb_host_id{256,:}"
+ "usb_device_id{256,:}"
+ "usb_dual_id{256,:}"
+
+ /*
+ * Describe all fields in the usb_device_id structure
+ * which is found in sys/dev/usb/usbdi.h.
+ */
+
+#if BITS_PER_LONG == 32 || BITS_PER_LONG == 64
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+#if BITS_PER_LONG == 64
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+ "unused{0,8}"
+#endif
+#else
+#error "Please update code."
+#endif
+
+ "idVendor[0]{" U16_XOR ",8}"
+ "idVendor[1]{" U16_XOR ",8}"
+ "idProduct[0]{" U16_XOR ",8}"
+ "idProduct[1]{" U16_XOR ",8}"
+ "bcdDevice_lo[0]{" U16_XOR ",8}"
+ "bcdDevice_lo[1]{" U16_XOR ",8}"
+ "bcdDevice_hi[0]{" U16_XOR ",8}"
+ "bcdDevice_hi[1]{" U16_XOR ",8}"
+
+ "bDeviceClass{0,8}"
+ "bDeviceSubClass{0,8}"
+ "bDeviceProtocol{0,8}"
+ "bInterfaceClass{0,8}"
+ "bInterfaceSubClass{0,8}"
+ "bInterfaceProtocol{0,8}"
+
+/* NOTE: On big endian machines bitfields are bitreversed. */
+
+ "mf_vendor{" U8_BITFIELD_XOR ",1}"
+ "mf_product{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_lo{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_hi{" U8_BITFIELD_XOR ",1}"
+
+ "mf_dev_class{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_subclass{" U8_BITFIELD_XOR ",1}"
+ "mf_dev_protocol{" U8_BITFIELD_XOR ",1}"
+ "mf_int_class{" U8_BITFIELD_XOR ",1}"
+
+ "mf_int_subclass{" U8_BITFIELD_XOR ",1}"
+ "mf_int_protocol{" U8_BITFIELD_XOR ",1}"
+ "unused{" U8_BITFIELD_XOR ",6}"
+
+ "mfl_vendor{" U16_XOR "," MFL_SIZE "}"
+ "mfl_product{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_lo{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_hi{" U16_XOR "," MFL_SIZE "}"
+
+ "mfl_dev_class{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_subclass{" U16_XOR "," MFL_SIZE "}"
+ "mfl_dev_protocol{" U16_XOR "," MFL_SIZE "}"
+ "mfl_int_class{" U16_XOR "," MFL_SIZE "}"
+
+ "mfl_int_subclass{" U16_XOR "," MFL_SIZE "}"
+ "mfl_int_protocol{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+ "unused{" U16_XOR "," MFL_SIZE "}"
+};
diff --git a/tools/tools/bus_autoconf/bus_load_file.c b/tools/tools/bus_autoconf/bus_load_file.c
new file mode 100644
index 0000000..527e5bc
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_load_file.c
@@ -0,0 +1,76 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <err.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include "bus_load_file.h"
+
+void
+load_file(const char *fname, uint8_t **pptr, uint32_t *plen)
+{
+ uint8_t *ptr;
+ uint32_t len;
+ off_t off;
+ int f;
+
+ f = open(fname, O_RDONLY);
+ if (f < 0)
+ err(EX_NOINPUT, "Cannot open file '%s'", fname);
+
+ off = lseek(f, 0, SEEK_END);
+ if (off < 0) {
+ err(EX_NOINPUT, "Cannot seek to "
+ "end of file '%s'", fname);
+ }
+
+ if (lseek(f, 0, SEEK_SET) < 0) {
+ err(EX_NOINPUT, "Cannot seek to "
+ "beginning of file '%s'", fname);
+ }
+
+ len = off;
+ if (len != off)
+ err(EX_NOINPUT, "File '%s' is too big", fname);
+
+ ptr = malloc(len);
+ if (ptr == NULL)
+ errx(EX_SOFTWARE, "Out of memory");
+
+ if (read(f, ptr, len) != len)
+ err(EX_NOINPUT, "Cannot read all data");
+
+ close(f);
+
+ *pptr = ptr;
+ *plen = len;
+}
diff --git a/tools/tools/bus_autoconf/bus_load_file.h b/tools/tools/bus_autoconf/bus_load_file.h
new file mode 100644
index 0000000..57e7739
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_load_file.h
@@ -0,0 +1,33 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _BUS_LOAD_FILE_H_
+#define _BUS_LOAD_FILE_H_
+
+void load_file(const char *, uint8_t **, uint32_t *);
+
+#endif /* _BUS_LOAD_FILE_H_ */
diff --git a/tools/tools/bus_autoconf/bus_sections.c b/tools/tools/bus_autoconf/bus_sections.c
new file mode 100644
index 0000000..c326048
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_sections.c
@@ -0,0 +1,223 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sysexits.h>
+#include <err.h>
+#include <string.h>
+
+#include <sys/queue.h>
+
+#include "bus_sections.h"
+
+#define MAX_STRING 64
+
+struct format_info;
+typedef TAILQ_HEAD(,format_info) format_info_head_t;
+typedef TAILQ_ENTRY(format_info) format_info_entry_t;
+
+static format_info_head_t format_head = TAILQ_HEAD_INITIALIZER(format_head);
+
+struct format_info {
+ format_info_entry_t entry;
+ format_info_head_t fields;
+ char name[MAX_STRING];
+ uint16_t bit_offset;
+ uint16_t bit_size;
+};
+
+static struct format_info *
+format_info_new(char *pstr, uint16_t bo, uint16_t bs)
+{
+ struct format_info *pfi;
+
+ pfi = malloc(sizeof(*pfi));
+ if (pfi == NULL)
+ errx(EX_SOFTWARE, "Out of memory.");
+
+ memset(pfi, 0, sizeof(*pfi));
+
+ TAILQ_INIT(&pfi->fields);
+
+ strlcpy(pfi->name, pstr, sizeof(pfi->name));
+ pfi->bit_offset = bo;
+ pfi->bit_size = bs;
+ return (pfi);
+}
+
+static const struct format_info *
+format_get_section(const char *section)
+{
+ const struct format_info *psub;
+ static const struct format_info *psub_last;
+ static const char *psub_cache;
+
+ if (psub_cache && strcmp(psub_cache, section) == 0)
+ return (psub_last);
+
+ TAILQ_FOREACH(psub, &format_head, entry) {
+ if (strcmp(section, psub->name) == 0) {
+ psub_cache = section;
+ psub_last = psub;
+ return (psub);
+ }
+ }
+ warnx("Section '%s' not found", section);
+ psub_cache = section;
+ psub_last = psub;
+ return (NULL);
+}
+
+uint16_t
+format_get_section_size(const char *section)
+{
+ const struct format_info *pfi;
+
+ pfi = format_get_section(section);
+ if (pfi == NULL)
+ return (0);
+
+ return ((pfi->bit_offset + 7) / 8);
+}
+
+
+uint8_t
+format_get_field(const char *section, const char *field,
+ const uint8_t *ptr, uint16_t size)
+{
+ const struct format_info *pfi;
+ const struct format_info *psub;
+ uint16_t rem;
+ uint16_t off;
+ uint16_t sz;
+
+ pfi = format_get_section(section);
+ if (pfi == NULL)
+ return (0);
+
+ /* skip until we find the fields */
+ while (pfi && TAILQ_FIRST(&pfi->fields) == NULL)
+ pfi = TAILQ_NEXT(pfi, entry);
+
+ if (pfi == NULL)
+ return (0);
+
+ TAILQ_FOREACH(psub, &pfi->fields, entry) {
+ if (strcmp(field, psub->name) == 0) {
+
+ /* range check */
+ if (((psub->bit_offset + psub->bit_size) / 8) > size)
+ return (0);
+
+ /* compute byte offset */
+ rem = psub->bit_offset & 7;
+ off = psub->bit_offset / 8;
+ sz = psub->bit_size;
+
+ /* extract bit-field */
+ return ((ptr[off] >> rem) & ((1 << sz) - 1));
+ }
+ }
+ warnx("Field '%s' not found in '%s'", field, pfi->name);
+ return (0);
+}
+
+void
+format_parse_entries(const uint8_t *ptr, uint32_t len)
+{
+ static const char *command_list = "012345678:";
+ const char *cmd;
+ struct format_info *pfi;
+ struct format_info *pfi_last = NULL;
+ char linebuf[3][MAX_STRING];
+ uint32_t off = 0;
+ uint16_t bit_offset = 0;
+ uint8_t state = 0;
+ uint8_t cmd_index;
+ int c;
+
+ /*
+ * The format we are parsing:
+ * <string>{string,string}<next_string>{...}
+ */
+ while (len--) {
+ c = *(ptr++);
+
+ /* skip some characters */
+ if (c == 0 || c == '\n' || c == '\r' || c == ' ' || c == '\t')
+ continue;
+
+ /* accumulate non-field delimiters */
+ if (strchr("{,}", c) == NULL) {
+ if (off < (MAX_STRING - 1)) {
+ linebuf[state][off] = c;
+ off++;
+ }
+ continue;
+ }
+ /* parse keyword */
+ linebuf[state][off] = 0;
+ off = 0;
+ state++;
+ if (state == 3) {
+ /* check for command in command list */
+ cmd = strchr(command_list, linebuf[2][0]);
+ if (cmd != NULL)
+ cmd_index = cmd - command_list;
+ else
+ cmd_index = 255;
+
+ /*
+ * Check for new field, format is:
+ *
+ * <field_name>{bit_offset_xor, bit_size}
+ */
+ if (cmd_index < 9 && pfi_last != NULL) {
+ pfi = format_info_new(linebuf[0], bit_offset ^
+ atoi(linebuf[1]), cmd_index);
+ TAILQ_INSERT_TAIL(&pfi_last->fields, pfi, entry);
+ bit_offset += cmd_index;
+ }
+ /*
+ * Check for new section, format is:
+ *
+ * <section_name>{section_bit_size, :}
+ */
+ if (cmd_index == 9) {
+ pfi_last = format_info_new(linebuf[0],
+ atoi(linebuf[1]), cmd_index);
+ TAILQ_INSERT_TAIL(&format_head, pfi_last, entry);
+ bit_offset = 0;
+ }
+ state = 0;
+ continue;
+ }
+ }
+}
diff --git a/tools/tools/bus_autoconf/bus_sections.h b/tools/tools/bus_autoconf/bus_sections.h
new file mode 100644
index 0000000..2c4c6fc
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_sections.h
@@ -0,0 +1,35 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _BUS_SECTIONS_H_
+#define _BUS_SECTIONS_H_
+
+uint16_t format_get_section_size(const char *);
+uint8_t format_get_field(const char *, const char *, const uint8_t *, uint16_t);
+void format_parse_entries(const uint8_t *, uint32_t);
+
+#endif /* _BUS_SECTIONS_H_ */
diff --git a/tools/tools/bus_autoconf/bus_usb.c b/tools/tools/bus_autoconf/bus_usb.c
new file mode 100644
index 0000000..ab794c1
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_usb.c
@@ -0,0 +1,386 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+#include <sysexits.h>
+#include <unistd.h>
+#include <sys/queue.h>
+
+#include "bus_autoconf.h"
+#include "bus_sections.h"
+#include "bus_usb.h"
+
+struct usb_blob;
+typedef TAILQ_HEAD(,usb_blob) usb_blob_head_t;
+typedef TAILQ_ENTRY(usb_blob) usb_blob_entry_t;
+
+static usb_blob_head_t usb_blob_head = TAILQ_HEAD_INITIALIZER(usb_blob_head);
+static uint32_t usb_blob_count;
+
+struct usb_blob {
+ usb_blob_entry_t entry;
+ struct usb_device_id temp;
+};
+
+/*
+ * To ensure that the correct USB driver is loaded, the driver having
+ * the most information about the device must be probed first. Then
+ * more generic drivers shall be probed.
+ */
+static int
+usb_compare(const void *_a, const void *_b)
+{
+ const struct usb_device_id *a = _a;
+ const struct usb_device_id *b = _b;
+ int retval;
+
+ /* vendor matches first */
+
+ if (a->match_flag_vendor > b->match_flag_vendor)
+ return (-1);
+ if (a->match_flag_vendor < b->match_flag_vendor)
+ return (1);
+
+ /* product matches first */
+
+ if (a->match_flag_product > b->match_flag_product)
+ return (-1);
+ if (a->match_flag_product < b->match_flag_product)
+ return (1);
+
+ /* device class matches first */
+
+ if (a->match_flag_dev_class > b->match_flag_dev_class)
+ return (-1);
+ if (a->match_flag_dev_class < b->match_flag_dev_class)
+ return (1);
+
+ if (a->match_flag_dev_subclass > b->match_flag_dev_subclass)
+ return (-1);
+ if (a->match_flag_dev_subclass < b->match_flag_dev_subclass)
+ return (1);
+
+ /* interface class matches first */
+
+ if (a->match_flag_int_class > b->match_flag_int_class)
+ return (-1);
+ if (a->match_flag_int_class < b->match_flag_int_class)
+ return (1);
+
+ if (a->match_flag_int_subclass > b->match_flag_int_subclass)
+ return (-1);
+ if (a->match_flag_int_subclass < b->match_flag_int_subclass)
+ return (1);
+
+ if (a->match_flag_int_protocol > b->match_flag_int_protocol)
+ return (-1);
+ if (a->match_flag_int_protocol < b->match_flag_int_protocol)
+ return (1);
+
+ /* then sort according to value */
+
+ if (a->idVendor > b->idVendor)
+ return (1);
+ if (a->idVendor < b->idVendor)
+ return (-1);
+ if (a->idProduct > b->idProduct)
+ return (1);
+ if (a->idProduct < b->idProduct)
+ return (-1);
+ if (a->bDeviceClass > b->bDeviceClass)
+ return (1);
+ if (a->bDeviceClass < b->bDeviceClass)
+ return (-1);
+ if (a->bDeviceSubClass > b->bDeviceSubClass)
+ return (1);
+ if (a->bDeviceSubClass < b->bDeviceSubClass)
+ return (-1);
+ if (a->bDeviceProtocol > b->bDeviceProtocol)
+ return (1);
+ if (a->bDeviceProtocol < b->bDeviceProtocol)
+ return (-1);
+ if (a->bInterfaceClass > b->bInterfaceClass)
+ return (1);
+ if (a->bInterfaceClass < b->bInterfaceClass)
+ return (-1);
+ if (a->bInterfaceSubClass > b->bInterfaceSubClass)
+ return (1);
+ if (a->bInterfaceSubClass < b->bInterfaceSubClass)
+ return (-1);
+ if (a->bInterfaceProtocol > b->bInterfaceProtocol)
+ return (1);
+ if (a->bInterfaceProtocol < b->bInterfaceProtocol)
+ return (-1);
+
+ /* in the end sort by module name and mode */
+
+ retval = strcmp(a->module_name, b->module_name);
+ if (retval == 0)
+ retval = strcmp(a->module_mode, b->module_mode);
+ return (retval);
+}
+
+static void
+usb_sort_entries(struct usb_device_id *id, uint32_t nid)
+{
+ qsort(id, nid, sizeof(*id), &usb_compare);
+}
+
+static void
+usb_import_entry(struct usb_device_id *id, const char *type,
+ const char *module, const uint8_t *ptr, uint16_t size)
+{
+ const char *mode;
+
+ if (strstr(type, "_host_"))
+ mode = "host";
+ else if (strstr(type, "_device_"))
+ mode = "device";
+ else
+ mode = "(host|device)";
+
+ strlcpy(id->module_name, module, sizeof(id->module_name));
+ strlcpy(id->module_mode, mode, sizeof(id->module_mode));
+
+ /* import data from binary object */
+
+ if (format_get_field(type, "mfl_vendor", ptr, size))
+ id->match_flag_vendor = 1;
+ if (format_get_field(type, "mfl_product", ptr, size))
+ id->match_flag_product = 1;
+ if (format_get_field(type, "mfl_dev_lo", ptr, size))
+ id->match_flag_dev_lo = 1;
+ if (format_get_field(type, "mfl_dev_hi", ptr, size))
+ id->match_flag_dev_hi = 1;
+ if (format_get_field(type, "mfl_dev_class", ptr, size))
+ id->match_flag_dev_class = 1;
+ if (format_get_field(type, "mfl_dev_subclass", ptr, size))
+ id->match_flag_dev_subclass = 1;
+ if (format_get_field(type, "mfl_dev_protocol", ptr, size))
+ id->match_flag_dev_protocol = 1;
+ if (format_get_field(type, "mfl_int_class", ptr, size))
+ id->match_flag_int_class = 1;
+ if (format_get_field(type, "mfl_int_subclass", ptr, size))
+ id->match_flag_int_subclass = 1;
+ if (format_get_field(type, "mfl_int_protocol", ptr, size))
+ id->match_flag_int_protocol = 1;
+
+ id->idVendor = format_get_field(type, "idVendor[0]", ptr, size) |
+ (format_get_field(type, "idVendor[1]", ptr, size) << 8);
+ id->idProduct = format_get_field(type, "idProduct[0]", ptr, size) |
+ (format_get_field(type, "idProduct[1]", ptr, size) << 8);
+
+ id->bcdDevice_lo = format_get_field(type, "bcdDevice_lo[0]", ptr, size) |
+ (format_get_field(type, "bcdDevice_lo[1]", ptr, size) << 8);
+
+ id->bcdDevice_hi = format_get_field(type, "bcdDevice_hi[0]", ptr, size) |
+ (format_get_field(type, "bcdDevice_hi[1]", ptr, size) << 8);
+
+ id->bDeviceClass = format_get_field(type, "bDeviceClass", ptr, size);
+ id->bDeviceSubClass = format_get_field(type, "bDeviceSubClass", ptr, size);
+ id->bDeviceProtocol = format_get_field(type, "bDeviceProtocol", ptr, size);
+
+ id->bInterfaceClass = format_get_field(type, "bInterfaceClass", ptr, size);
+ id->bInterfaceSubClass = format_get_field(type, "bInterfaceSubClass", ptr, size);
+ id->bInterfaceProtocol = format_get_field(type, "bInterfaceProtocol", ptr, size);
+
+ if (format_get_field(type, "mf_vendor", ptr, size))
+ id->match_flag_vendor = 1;
+ if (format_get_field(type, "mf_product", ptr, size))
+ id->match_flag_product = 1;
+ if (format_get_field(type, "mf_dev_lo", ptr, size))
+ id->match_flag_dev_lo = 1;
+ if (format_get_field(type, "mf_dev_hi", ptr, size))
+ id->match_flag_dev_hi = 1;
+ if (format_get_field(type, "mf_dev_class", ptr, size))
+ id->match_flag_dev_class = 1;
+ if (format_get_field(type, "mf_dev_subclass", ptr, size))
+ id->match_flag_dev_subclass = 1;
+ if (format_get_field(type, "mf_dev_protocol", ptr, size))
+ id->match_flag_dev_protocol = 1;
+ if (format_get_field(type, "mf_int_class", ptr, size))
+ id->match_flag_int_class = 1;
+ if (format_get_field(type, "mf_int_subclass", ptr, size))
+ id->match_flag_int_subclass = 1;
+ if (format_get_field(type, "mf_int_protocol", ptr, size))
+ id->match_flag_int_protocol = 1;
+
+ /* compute some internal fields */
+ id->is_iface = id->match_flag_int_class |
+ id->match_flag_int_protocol |
+ id->match_flag_int_subclass;
+
+ id->is_dev = id->match_flag_dev_class |
+ id->match_flag_dev_subclass;
+
+ id->is_vp = id->match_flag_vendor |
+ id->match_flag_product;
+
+ id->is_any = id->is_vp + id->is_dev + id->is_iface;
+}
+
+static uint32_t
+usb_dump(struct usb_device_id *id, uint32_t nid)
+{
+ uint32_t n = 1;
+
+ if (id->is_any) {
+ printf("nomatch 32 {\n"
+ " match \"bus\" \"uhub[0-9]+\";\n"
+ " match \"mode\" \"%s\";\n", id->module_mode);
+ } else {
+ printf("# skipped entry on module %s\n",
+ id->module_name);
+ return (n);
+ }
+
+ if (id->match_flag_vendor) {
+ printf(" match \"vendor\" \"0x%04x\";\n",
+ id->idVendor);
+ }
+ if (id->match_flag_product) {
+ uint32_t x;
+
+ if (id->is_any == 1 && id->is_vp == 1) {
+ /* try to join similar entries */
+ while (n < nid) {
+ if (id[n].is_any != 1 || id[n].is_vp != 1)
+ break;
+ if (id[n].idVendor != id[0].idVendor)
+ break;
+ if (strcmp(id[n].module_name, id[0].module_name))
+ break;
+ if (strcmp(id[n].module_mode, id[0].module_mode))
+ break;
+ n++;
+ }
+ }
+ if (n == 1) {
+ printf(" match \"product\" \"0x%04x\";\n",
+ id->idProduct);
+ } else {
+ printf(" match \"product\" \"(");
+
+ for (x = 0; x != n; x++) {
+ printf("0x%04x%s", id[x].idProduct,
+ (x == (n - 1)) ? "" : "|");
+ }
+
+ printf(")\";\n");
+ }
+ }
+ if (id->match_flag_dev_class) {
+ printf(" match \"devclass\" \"0x%02x\";\n",
+ id->bDeviceClass);
+ }
+ if (id->match_flag_dev_subclass) {
+ printf(" match \"devsubclass\" \"0x%02x\";\n",
+ id->bDeviceSubClass);
+ }
+ if (id->match_flag_int_class) {
+ printf(" match \"intclass\" \"0x%02x\";\n",
+ id->bInterfaceClass);
+ }
+ if (id->match_flag_int_subclass) {
+ printf(" match \"intsubclass\" \"0x%02x\";\n",
+ id->bInterfaceSubClass);
+ }
+ if (id->match_flag_int_protocol) {
+ printf(" match \"intprotocol\" \"0x%02x\";\n",
+ id->bInterfaceProtocol);
+ }
+ printf(" action \"kldload %s\";\n"
+ "};\n\n", id->module_name);
+
+ return (n);
+}
+
+void
+usb_import_entries(const char *section, const char *module,
+ const uint8_t *ptr, uint32_t len)
+{
+ struct usb_blob *pub;
+ uint32_t section_size;
+ uint32_t off;
+
+ section_size = format_get_section_size(section);
+ if (section_size == 0) {
+ errx(EX_DATAERR, "Invalid or non-existing "
+ "section format '%s'", section);
+ }
+ if (len % section_size) {
+ errx(EX_DATAERR, "Length %d is not "
+ "divisible by %d. Section format '%s'",
+ len, section_size, section);
+ }
+ for (off = 0; off != len; off += section_size) {
+ pub = malloc(sizeof(*pub));
+ if (pub == NULL)
+ errx(EX_SOFTWARE, "Out of memory");
+
+ memset(pub, 0, sizeof(*pub));
+
+ usb_import_entry(&pub->temp, section,
+ module, ptr + off, section_size);
+
+ TAILQ_INSERT_TAIL(&usb_blob_head, pub, entry);
+
+ usb_blob_count++;
+ if (usb_blob_count == 0)
+ errx(EX_SOFTWARE, "Too many entries");
+ }
+}
+
+void
+usb_dump_entries(void)
+{
+ struct usb_blob *pub;
+ struct usb_device_id *id;
+ uint32_t x;
+
+ id = malloc(usb_blob_count * sizeof(*id));
+ if (id == NULL)
+ errx(EX_SOFTWARE, "Out of memory");
+
+ /* make linear array of all USB blobs */
+ x = 0;
+ TAILQ_FOREACH(pub, &usb_blob_head, entry)
+ id[x++] = pub->temp;
+
+ usb_sort_entries(id, usb_blob_count);
+
+ for (x = 0; x != usb_blob_count;)
+ x += usb_dump(id + x, usb_blob_count - x);
+
+ free(id);
+
+ printf("# %d USB entries processed\n\n", usb_blob_count);
+}
diff --git a/tools/tools/bus_autoconf/bus_usb.h b/tools/tools/bus_autoconf/bus_usb.h
new file mode 100644
index 0000000..378df9a
--- /dev/null
+++ b/tools/tools/bus_autoconf/bus_usb.h
@@ -0,0 +1,73 @@
+/* $FreeBSD$ */
+
+/*-
+ * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _BUS_USB_H_
+#define _BUS_USB_H_
+
+struct usb_device_id {
+
+ /* Internal fields */
+ char module_name[32];
+ char module_mode[32];
+ uint8_t is_iface;
+ uint8_t is_vp;
+ uint8_t is_dev;
+ uint8_t is_any;
+
+ /* Used for product specific matches; the BCD range is inclusive */
+ uint16_t idVendor;
+ uint16_t idProduct;
+ uint16_t bcdDevice_lo;
+ uint16_t bcdDevice_hi;
+
+ /* Used for device class matches */
+ uint8_t bDeviceClass;
+ uint8_t bDeviceSubClass;
+ uint8_t bDeviceProtocol;
+
+ /* Used for interface class matches */
+ uint8_t bInterfaceClass;
+ uint8_t bInterfaceSubClass;
+ uint8_t bInterfaceProtocol;
+
+ /* Select which fields to match against */
+ uint8_t match_flag_vendor:1;
+ uint8_t match_flag_product:1;
+ uint8_t match_flag_dev_lo:1;
+ uint8_t match_flag_dev_hi:1;
+ uint8_t match_flag_dev_class:1;
+ uint8_t match_flag_dev_subclass:1;
+ uint8_t match_flag_dev_protocol:1;
+ uint8_t match_flag_int_class:1;
+ uint8_t match_flag_int_subclass:1;
+ uint8_t match_flag_int_protocol:1;
+};
+
+void usb_import_entries(const char *, const char *, const uint8_t *, uint32_t);
+void usb_dump_entries(void);
+
+#endif /* _BUS_USB_H_ */
diff --git a/tools/tools/pciid/mk_pci_vendors.pl b/tools/tools/pciid/mk_pci_vendors.pl
deleted file mode 100644
index 8c46e1a..0000000
--- a/tools/tools/pciid/mk_pci_vendors.pl
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Copyright (C) 2001 Sheldon Hearn. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-#
-# usage: mk_pci_vendors [-lq] [-p pcidevs.txt] [-v vendors.txt]
-#
-# Generate src/share/misc/pci_vendors from the Hart and Boemler lists,
-# currently available at:
-#
-# Boemler: http://www.pcidatabase.com/reports.php?type=csv
-# Hart: http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
-#
-# -l Where an entry is found in both input lists, use the entry with
-# the longest description. The default is for the Boemler file to
-# override the Hart file.
-# -q Do not print diagnostics.
-# -p Specify the pathname of the Hart file. (Default ./pcidevs.txt)
-# -v Specify the pathname of the Boemler file. (Default ./vendors.txt)
-#
-use strict;
-use Getopt::Std;
-use Data::Dumper;
-
-my $PROGNAME = 'mk_pci_vendors';
-my $VENDORS_FILE = 'vendors.txt';
-my $PCIDEVS_FILE = 'pcidevs.txt';
-
-my ($cur_vendor, $vendorid, $pciid, $vendor);
-my %opts;
-my %pciids = ();
-my %vendors = ();
-my ($descr, $existing, $id, $line, $rv, $winner, $optlused);
-
-my $IS_VENDOR = 1;
-my $IS_DEVICE = 2;
-my $V_DESCR = 0;
-my $V_DEVSL = 1;
-my $W_FINAL = 0;
-my $W_VENDORS = 1;
-my $W_PCIDEVS = 2;
-
-sub clean_descr($);
-sub vendors_parse($\$\$\$\$);
-sub pcidevs_parse($\$\$);
-
-if (not getopts('lp:qv:', \%opts) or @ARGV > 0) {
- print STDERR "usage: $PROGNAME [-lq] [-p pcidevs.txt] [-v vendors.txt]\n";
- exit 1;
-}
-
-if (not defined($opts{p})) {
- $opts{p} = $PCIDEVS_FILE;
-}
-if (not defined($opts{v})) {
- $opts{v} = $VENDORS_FILE;
-}
-foreach (('l', 'q')) {
- if (not exists($opts{$_})) {
- $opts{$_} = 0;
- } else {
- $opts{$_} = 1;
- }
-}
-
-open(VENDORS, "< $opts{v}") or
- die "$PROGNAME: $opts{v}: $!\n";
-while ($line = <VENDORS>) {
- chomp($line);
- $rv = vendors_parse($line, $vendorid, $pciid, $vendor, $descr);
- if ($rv != 0) {
- if (defined $vendors{$vendorid}
- && $vendors{$vendorid}[$W_VENDORS] ne $vendor) {
- die "$PROGNAME: $vendorid: duplicate vendor ID\n";
- }
- $vendors{$vendorid}[$W_VENDORS] = $vendor;
- $pciids{$vendorid}{$pciid}[$W_VENDORS] = $descr;
- }
-}
-close(VENDORS);
-
-open(PCIDEVS, "< $opts{p}") or
- die "$PROGNAME: $opts{p}: $!\n";
-while ($line = <PCIDEVS>) {
- chomp($line);
- $rv = pcidevs_parse($line, $id, $descr);
- if ($rv == $IS_VENDOR) {
- $vendorid = $id;
- $vendors{$vendorid}[$W_PCIDEVS] = $descr;
- } elsif ($rv == $IS_DEVICE) {
- $pciids{$vendorid}{$id}[$W_PCIDEVS] = $descr;
- }
-}
-close(PCIDEVS);
-
-foreach my $vid (keys(%vendors)) {
- if (!defined $vendors{$vid}[$W_VENDORS]
- && defined $vendors{$vid}[$W_PCIDEVS]) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_PCIDEVS];
- } elsif (defined $vendors{$vid}[$W_VENDORS]
- && !defined $vendors{$vid}[$W_PCIDEVS]) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS];
- } elsif (!$opts{l}) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS];
- } else {
- if (length($vendors{$vid}[$W_VENDORS]) >
- length($vendors{$vid}[$W_PCIDEVS])) {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_VENDORS];
- } else {
- $vendors{$vid}[$W_FINAL] = $vendors{$vid}[$W_PCIDEVS];
- }
- }
-
- foreach my $pciid (keys(%{$pciids{$vid}})) {
- if (!defined $pciids{$vid}{$pciid}[$W_VENDORS]
- && defined $pciids{$vid}{$pciid}[$W_PCIDEVS]) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_PCIDEVS];
- } elsif (defined $pciids{$vid}{$pciid}[$W_VENDORS]
- && !defined $pciids{$vid}{$pciid}[$W_PCIDEVS]) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_VENDORS];
- } elsif (!$opts{l}) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_VENDORS];
- } else {
- if (length($pciids{$vid}{$pciid}[$W_VENDORS]) >
- length($pciids{$vid}{$pciid}[$W_PCIDEVS])) {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_VENDORS];
- } else {
- $pciids{$vid}{$pciid}[$W_FINAL] =
- $pciids{$vid}{$pciid}[$W_PCIDEVS];
- }
- }
- }
-
-}
-
-$optlused = $opts{l} ? "with" : "without";
-print <<HEADER_END;
-; \$FreeBSD\$
-;
-; Automatically generated by src/tools/tools/pciid/mk_pci_vendors.pl
-; ($optlused the -l option), using the following source lists:
-;
-; http://www.pcidatabase.com/reports.php?type=csv
-; http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
-;
-; Manual edits on this file will be lost!
-;
-HEADER_END
-
-foreach my $vid (sort keys %vendors) {
- $descr = $vendors{$vid}[0];
- print "$vid\t$descr\n";
- foreach $pciid (sort keys %{$pciids{$vid}}) {
- $descr = $pciids{$vid}{$pciid}[0];
- print "\t$pciid\t$descr\n";
- }
-}
-exit 0;
-
-
-# Parse a line from the Boemler CSV file and place the vendor id, pciid,
-# vendor description and description in the scalars.
-#
-# Returns 0 if there is a problem.
-#
-sub vendors_parse($\$\$\$\$)
-{
- my ($line, $vendorid_ref, $pciid_ref, $vendor_ref, $descr_ref) = @_;
-
- my @a = split(/","/, $line);
- $a[0] =~ s/0x//; # 0x1234 -> 1234
- $a[1] =~ s/0x//;
-
- $a[0] =~ s/^"//; # Remove starting or trailing "
- $a[4] =~ s/"$//;
-
- $a[0] = uc($a[0]); # Some are lowercase hex-digits
- $a[1] = uc($a[1]);
-
- # Length of the Vendor ID or PCI ID is not four hex-digits, ignore it
- return 0 if (length($a[0]) != 4 || length($a[1]) != 4);
-
- # If there is no description, see if the chip data exists and use that
- if ($a[4] eq "") {
- if ($a[3] ne "") {
- $a[4] = $a[3];
- $a[3] = "";
- } else {
- $a[4] = "?";
- }
- }
-
- $$vendorid_ref = $a[0];
- $$pciid_ref = $a[1];
- $$vendor_ref = $a[2];
- $$descr_ref = clean_descr($a[4]);
- $$descr_ref .= clean_descr(" ($a[3])") if ($a[3] =~ /[a-zA-Z0-0]/);
- return 1;
-}
-
-# Parse a line from the Hart file and place the ID and description
-# in the scalars referenced by $id_ref and $descr_ref.
-#
-# On success, returns $IS_VENDOR if the line represents a vendor entity
-# or $IS_DEVICE if the line represents a device entity.
-#
-# Returns 0 on failure.
-#
-sub pcidevs_parse($\$\$)
-{
- my ($line, $id_ref, $descr_ref) = @_;
- my $descr;
-
- if ($line =~ /^V\t([A-Fa-f0-9]{4})\t([^\t].+?)\s*$/) {
- ($$id_ref, $$descr_ref) = (uc($1), clean_descr($2));
- return $IS_VENDOR;
- } elsif ($line =~ /^D\t([A-Fa-f0-9]{4})\t([^\t].+?)\s*$/) {
- ($$id_ref, $$descr_ref) = (uc($1), clean_descr($2));
- return $IS_DEVICE;
- } elsif (not $opts{q} and
- $line !~ /^\s*$/ and $line !~ /^[;ORSX]/) {
- print STDERR "$PROGNAME: ignored Hart: $line\n";
- }
-
- return 0;
-}
-
-sub clean_descr($)
-{
- my ($descr) = @_;
-
- $descr =~ s/[^[:print:]]//g; # non-printable
- $descr =~ s/\\//g; # escape of 's
- $descr =~ s/\#/*/g; # pciconf(8) ignores data after this
-
- return $descr;
-}
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index f258347..87e8cad 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -74,7 +74,6 @@ SUBDIR= alias \
ktrace \
ktrdump \
lam \
- last \
lastcomm \
ldd \
leave \
@@ -170,7 +169,6 @@ SUBDIR= alias \
unzip \
units \
unvis \
- users \
uudecode \
uuencode \
vi \
@@ -182,10 +180,8 @@ SUBDIR= alias \
what \
whereis \
which \
- who \
whois \
write \
- wtmpcvt \
xargs \
xinstall \
${_xlint} \
@@ -338,6 +334,13 @@ SUBDIR+= usbhidaction
SUBDIR+= usbhidctl
.endif
+.if ${MK_UTMPX} != "no"
+SUBDIR+= last
+SUBDIR+= users
+SUBDIR+= who
+SUBDIR+= wtmpcvt
+.endif
+
.include <bsd.arch.inc.mk>
SUBDIR:= ${SUBDIR:O}
diff --git a/usr.bin/calendar/calendars/calendar.freebsd b/usr.bin/calendar/calendars/calendar.freebsd
index 957dafd..bf15da7 100644
--- a/usr.bin/calendar/calendars/calendar.freebsd
+++ b/usr.bin/calendar/calendars/calendar.freebsd
@@ -289,7 +289,7 @@
10/18 Sheldon Hearn <sheldonh@FreeBSD.org> born in Cape Town, Western Cape, South Africa, 1974
10/19 Nicholas Souchu <nsouch@FreeBSD.org> born in Suresnes, Hauts-de-Seine, France, 1972
10/19 Nick Barkas <snb@FreeBSD.org> born in Longview, Washington, United States, 1981
-10/20 Joel Dahl <joel@FreeBSD.org> born in Lidkoping, Sweden, 1983
+10/20 Joel Dahl <joel@FreeBSD.org> born in Bitterna, Skaraborg, Sweden, 1983
10/20 Dmitry Marakasov <amdmi3@FreeBSD.org> born in Moscow, Russian Federation, 1984
10/21 Ben Smithurst <ben@FreeBSD.org> born in Sheffield, South Yorkshire, United Kingdom, 1981
10/22 Jean-Sebastien Pedron <dumbbell@FreeBSD.org> born in Redon, Ille-et-Vilaine, France, 1980
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
index b2de01e..25b7b59 100644
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
+++ b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.all
@@ -10,7 +10,6 @@
#include <ru_RU.KOI8-R/calendar.common>
#include <ru_RU.KOI8-R/calendar.holiday>
#include <ru_RU.KOI8-R/calendar.military>
-#include <ru_RU.KOI8-R/calendar.msk>
#include <ru_RU.KOI8-R/calendar.orthodox>
#include <ru_RU.KOI8-R/calendar.pagan>
diff --git a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk b/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk
deleted file mode 100644
index 5e27985..0000000
--- a/usr.bin/calendar/calendars/ru_RU.KOI8-R/calendar.msk
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * ðÅÒÅ×ÏÄ ÞÁÓÏ× ÄÌÑ ÍÏÓËÏ×ÓËÏÊ ×ÒÅÍÅÎÎÏÊ ÚÏÎÙ
- *
- * $FreeBSD$
- */
-
-#ifndef _ru_RU_KOI8_R_msk_
-#define _ru_RU_KOI8_R_msk_
-
-LANG=ru_RU.KOI8-R
-
-03/SunLast îÁÞÁÌÏ ÍÏÓËÏ×ÓËÏÇÏ ÌÅÔÎÅÇÏ ×ÒÅÍÅÎÉ; ÞÁÓÙ ÐÅÒÅ×ÏÄÑÔÓÑ ×ÐÅÒÅÄ
-10/SunLast ëÏÎÅà ÍÏÓËÏ×ÓËÏÇÏ ÌÅÔÎÅÇÏ ×ÒÅÍÅÎÉ; ÞÁÓÙ ÐÅÒÅ×ÏÄÑÔÓÑ ÎÁÚÁÄ
-
-#endif /* !_ru_RU_KOI8_R_msk_ */
-
diff --git a/usr.bin/calendar/parsedata.c b/usr.bin/calendar/parsedata.c
index e3f9fab..c7e183c 100644
--- a/usr.bin/calendar/parsedata.c
+++ b/usr.bin/calendar/parsedata.c
@@ -548,6 +548,24 @@ parsedaymonth(char *date, int *yearp, int *monthp, int *dayp, int *flags,
continue;
}
+ /* Every so-manied dayofweek of every month of the year */
+ if (lflags == (F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
+ offset = indextooffset(modifierindex);
+
+ for (m = 0; m < 12; m++) {
+ dow = first_dayofweek_of_month(year, m);
+ d = (idayofweek - dow + 8) % 7;
+ d += (offset - 1) * 7;
+ if (remember_ymd(year, m, d)) {
+ remember(&remindex,
+ yearp, monthp, dayp, edp,
+ year, m, d, NULL);
+ continue;
+ }
+ }
+ continue;
+ }
+
/* A certain dayofweek of a month */
if (lflags ==
(F_MONTH | F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
@@ -800,6 +818,8 @@ showflags(int flags)
static const char *
getmonthname(int i)
{
+ if (i <= 0 || i > 12)
+ return ("");
if (nmonths[i - 1].len != 0 && nmonths[i - 1].name != NULL)
return (nmonths[i - 1].name);
return (months[i - 1]);
@@ -918,6 +938,16 @@ indextooffset(char *s)
int i;
struct fixs *n;
+ if (s[0] == '+' || s[0] == '-') {
+ char ss[9];
+ for (i = -100; i < 100; i++) {
+ sprintf(ss, "%s%d", (i > 0) ? "+" : "", i);
+ if (strcmp(ss, s) == 0)
+ return (i);
+ }
+ return (0);
+ }
+
for (i = 0; i < 6; i++) {
if (strcasecmp(s, sequences[i]) == 0) {
if (i == 5)
diff --git a/usr.bin/calendar/pom.c b/usr.bin/calendar/pom.c
index 89d06a2..671763a 100644
--- a/usr.bin/calendar/pom.c
+++ b/usr.bin/calendar/pom.c
@@ -155,7 +155,7 @@ fpom(int year, double utcoffset, double *ffms, double *fnms)
tomorrow = potm(days_tomorrow); /* 31 December 00:00:01 */
olddir = today > tomorrow ? -1 : +1;
- yeardays = 1 + isleap(year) ? DAYSPERLEAPYEAR : DAYSPERYEAR; /* reuse */
+ yeardays = 1 + (isleap(year) ? DAYSPERLEAPYEAR : DAYSPERYEAR); /* reuse */
for (d = 0; d <= yeardays; d++) {
today = potm(days_today);
tomorrow = potm(days_tomorrow);
diff --git a/usr.bin/cmp/regular.c b/usr.bin/cmp/regular.c
index e88b2c0..7ed83c1 100644
--- a/usr.bin/cmp/regular.c
+++ b/usr.bin/cmp/regular.c
@@ -41,12 +41,10 @@ __FBSDID("$FreeBSD$");
#include <sys/stat.h>
#include <err.h>
-#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
-#include <string.h>
#include <unistd.h>
#include "extern.h"
diff --git a/usr.bin/cmp/special.c b/usr.bin/cmp/special.c
index 08fc887..8225185 100644
--- a/usr.bin/cmp/special.c
+++ b/usr.bin/cmp/special.c
@@ -41,7 +41,6 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <stdlib.h>
#include <stdio.h>
-#include <string.h>
#include "extern.h"
diff --git a/usr.bin/finger/net.c b/usr.bin/finger/net.c
index ca98674..2b18b0f 100644
--- a/usr.bin/finger/net.c
+++ b/usr.bin/finger/net.c
@@ -226,7 +226,7 @@ trying(const struct addrinfo *ai)
printf("Trying %s...\n", buf);
}
-void
+static void
cleanup(int sig __unused)
{
#define ERRSTR "Timed out.\n"
diff --git a/usr.bin/fstat/fuser.c b/usr.bin/fstat/fuser.c
index 02975b3..364d57c 100644
--- a/usr.bin/fstat/fuser.c
+++ b/usr.bin/fstat/fuser.c
@@ -358,9 +358,8 @@ str2sig(const char *str)
{
int i;
-#define SIGPREFIX "sig"
- if (!strncasecmp(str, SIGPREFIX, sizeof(SIGPREFIX)))
- str += sizeof(SIGPREFIX);
+ if (!strncasecmp(str, "SIG", 3))
+ str += 3;
for (i = 1; i < sys_nsig; i++) {
if (!strcasecmp(sys_signame[i], str))
return (i);
diff --git a/usr.bin/ftp/Makefile b/usr.bin/ftp/Makefile
index 6f42e69..55a36be 100644
--- a/usr.bin/ftp/Makefile
+++ b/usr.bin/ftp/Makefile
@@ -8,18 +8,18 @@
#
#CFLAGS+=-DGATE_SERVER=\"ftp-gw.host\" # -DGATE_PORT=21
-LUKEMFTP= ${.CURDIR}/../../contrib/lukemftp
-.PATH: ${LUKEMFTP}/src
+TNFTP= ${.CURDIR}/../../contrib/tnftp
+.PATH: ${TNFTP}/src
PROG= ftp
-SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c progressbar.c \
- ruserpass.c util.c
+SRCS= cmds.c cmdtab.c complete.c domacro.c fetch.c ftp.c main.c \
+ progressbar.c ruserpass.c util.c
.if ${MK_INET6_SUPPORT} != "no"
CFLAGS+= -DINET6
.endif
-CFLAGS+= -I${.CURDIR} -I${LUKEMFTP}
+CFLAGS+= -I${.CURDIR} -I${TNFTP}
LDADD= -ledit -ltermcap -lutil
DPADD= ${LIBEDIT} ${LIBTERMCAP} ${LIBUTIL}
diff --git a/usr.bin/ftp/config.h b/usr.bin/ftp/config.h
deleted file mode 100644
index 77dff70..0000000
--- a/usr.bin/ftp/config.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/* $FreeBSD$ */
-
-
-/* config.h. Generated automatically by configure. */
-/* config.h.in. Generated automatically from configure.in by autoheader. */
-/* $Id: config.h.in,v 1.24 2000/09/18 00:40:12 lukem Exp $ */
-
-
-/* Define if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-/* #undef _ALL_SOURCE */
-#endif
-
-/* Define if the closedir function returns void instead of int. */
-/* #undef CLOSEDIR_VOID */
-
-/* Define if the `getpgrp' function takes no argument. */
-#define GETPGRP_VOID 1
-
-/* Define if your C compiler doesn't accept -c and -o together. */
-/* #undef NO_MINUS_C_MINUS_O */
-
-/* Define if your Fortran 77 compiler doesn't accept -c and -o together. */
-/* #undef F77_NO_MINUS_C_MINUS_O */
-
-/* Define to `long' if <sys/types.h> doesn't define. */
-/* #undef off_t */
-
-/* Define to the type of arg1 for select(). */
-/* #undef SELECT_TYPE_ARG1 */
-
-/* Define to the type of args 2, 3 and 4 for select(). */
-/* #undef SELECT_TYPE_ARG234 */
-
-/* Define to the type of arg5 for select(). */
-/* #undef SELECT_TYPE_ARG5 */
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Define if the closedir function returns void instead of int. */
-/* #undef VOID_CLOSEDIR */
-
-/* The number of bytes in a off_t. */
-#define SIZEOF_OFF_T 0
-
-/* Define if you have the err function. */
-#define HAVE_ERR 1
-
-/* Define if you have the fgetln function. */
-#define HAVE_FGETLN 1
-
-/* Define if you have the fparseln function. */
-#define HAVE_FPARSELN 1
-
-/* Define if you have the fseeko function. */
-#define HAVE_FSEEKO 1
-
-/* Define if you have the getaddrinfo function. */
-#define HAVE_GETADDRINFO 1
-
-/* Define if you have the gethostbyname2 function. */
-#define HAVE_GETHOSTBYNAME2 1
-
-/* Define if you have the getnameinfo function. */
-#define HAVE_GETNAMEINFO 1
-
-/* Define if you have the getpassphrase function. */
-/* #undef HAVE_GETPASSPHRASE */
-
-/* Define if you have the getpgrp function. */
-#define HAVE_GETPGRP 1
-
-/* Define if you have the glob function. */
-#define USE_GLOB_H 1
-
-/* Define if you have the inet_ntop function. */
-#define HAVE_INET_NTOP 1
-
-/* Define if you have the inet_pton function. */
-#define HAVE_INET_PTON 1
-
-/* Define if you have the issetugid function. */
-#define HAVE_ISSETUGID 1
-
-/* Define if you have the memmove function. */
-#define HAVE_MEMMOVE 1
-
-/* Define if you have the mkstemp function. */
-#define HAVE_MKSTEMP 1
-
-/* Define if you have the poll function. */
-#define HAVE_POLL 1
-
-/* Define if you have the select function. */
-#define HAVE_SELECT 1
-
-/* Define if you have the setprogname function. */
-#define HAVE_SETPROGNAME 1
-
-/* Define if you have the sl_init function. */
-#define HAVE_SL_INIT 1
-
-/* Define if you have the snprintf function. */
-#define HAVE_SNPRINTF 1
-
-/* Define if you have the strdup function. */
-#define HAVE_STRDUP 1
-
-/* Define if you have the strerror function. */
-#define HAVE_STRERROR 1
-
-/* Define if you have the strlcat function. */
-#define HAVE_STRLCAT 1
-
-/* Define if you have the strlcpy function. */
-#define HAVE_STRLCPY 1
-
-/* Define if you have the strptime function. */
-#define HAVE_STRPTIME 1
-
-/* Define if you have the strsep function. */
-#define HAVE_STRSEP 1
-
-/* Define if you have the strtoll function. */
-#define HAVE_STRTOLL 1
-
-/* Define if you have the strunvis function. */
-#define HAVE_STRUNVIS 1
-
-/* Define if you have the strvis function. */
-#define HAVE_STRVIS 1
-
-/* Define if you have the timegm function. */
-#define HAVE_TIMEGM 1
-
-/* Define if you have the usleep function. */
-#define HAVE_USLEEP 1
-
-/* Define if you have the <arpa/nameser.h> header file. */
-#define HAVE_ARPA_NAMESER_H 1
-
-/* Define if you have the <dirent.h> header file. */
-#define HAVE_DIRENT_H 1
-
-/* Define if you have the <err.h> header file. */
-#define HAVE_ERR_H 1
-
-/* Define if you have the <libutil.h> header file. */
-#define HAVE_LIBUTIL_H 1
-
-/* Define if you have the <ndir.h> header file. */
-/* #undef HAVE_NDIR_H */
-
-/* Define if you have the <paths.h> header file. */
-#define HAVE_PATHS_H 1
-
-/* Define if you have the <poll.h> header file. */
-#define HAVE_POLL_H 1
-
-/* Define if you have the <regex.h> header file. */
-#define HAVE_REGEX_H 1
-
-/* Define if you have the <sys/dir.h> header file. */
-#define HAVE_SYS_DIR_H 1
-
-/* Define if you have the <sys/ndir.h> header file. */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define if you have the <sys/poll.h> header file. */
-#define HAVE_SYS_POLL_H 1
-
-/* Define if you have the <termcap.h> header file. */
-#define HAVE_TERMCAP_H 1
-
-/* Define if you have the <util.h> header file. */
-/* #undef HAVE_UTIL_H */
-
-/* Define if you have the <vis.h> header file. */
-#define HAVE_VIS_H 1
-
-/* Define if you have the nsl library (-lnsl). */
-/* #undef HAVE_LIBNSL */
-
-/* Define if you have the socket library (-lsocket). */
-/* #undef HAVE_LIBSOCKET */
-
-/* Define if you have the tinfo library (-ltinfo). */
-#define HAVE_LIBTINFO 1
-
-/* Define if you have the util library (-lutil). */
-#define HAVE_LIBUTIL 1
-
-/* Define if your compiler supports `long long' */
-#define HAVE_LONG_LONG 1
-
-/* Define if in_port_t exists */
-#define HAVE_IN_PORT_T 1
-
-/* Define if sa_family_t exists in <sys/socket.h> */
-#define HAVE_SA_FAMILY_T 1
-
-/* Define if struct sockaddr.sa_len exists (implies sockaddr_in.sin_len, etc) */
-#define HAVE_SOCKADDR_SA_LEN 1
-
-/* Define if socklen_t exists */
-#define HAVE_SOCKLEN_T 1
-
-/* Define if AF_INET6 exists in <sys/socket.h> */
-#define HAVE_AF_INET6 1
-
-/* Define if `struct sockaddr_in6' exists in <netinet/in.h> */
-#define HAVE_SOCKADDR_IN6 1
-
-/* Define if `struct addrinfo' exists in <netdb.h> */
-#define HAVE_ADDRINFO 1
-
-/*
- * Define if <netdb.h> contains AI_NUMERICHOST et al.
- * Systems which only implement RFC2133 will need this.
- */
-#define HAVE_RFC2553_NETDB 1
-
-/* Define if `struct direct' has a d_namlen element */
-#define HAVE_D_NAMLEN 1
-
-/* Define if GLOB_BRACE exists in <glob.h> */
-#define HAVE_GLOB_BRACE 1
-
-/* Define if h_errno exists in <netdb.h> */
-#define HAVE_H_ERRNO_D 1
-
-/* Define if fclose() is declared in <stdio.h> */
-#define HAVE_FCLOSE_D 1
-
-/* Define if getpass() is declared in <stdlib.h> or <unistd.h> */
-#define HAVE_GETPASS_D 1
-
-/* Define if optarg is declared in <stdlib.h> or <unistd.h> */
-#define HAVE_OPTARG_D 1
-
-/* Define if optind is declared in <stdlib.h> or <unistd.h> */
-#define HAVE_OPTIND_D 1
-
-/* Define if pclose() is declared in <stdio.h> */
-#define HAVE_PCLOSE_D 1
-
-/* Define if `long long' is supported and sizeof(off_t) >= 8 */
-#define HAVE_QUAD_SUPPORT 1
-
-/* Define if strptime() is declared in <time.h> */
-#define HAVE_STRPTIME_D 1
-
-/*
- * Define this if compiling with SOCKS (the firewall traversal library).
- * Also, you must define connect, getsockname, bind, accept, listen, and
- * select to their R-versions.
- */
-/* #undef SOCKS */
-/* #undef SOCKS4 */
-/* #undef SOCKS5 */
-/* #undef connect */
-/* #undef getsockname */
-/* #undef bind */
-/* #undef accept */
-/* #undef listen */
-/* #undef select */
-/* #undef dup */
-/* #undef dup2 */
-/* #undef fclose */
-/* #undef gethostbyname */
-/* #undef getpeername */
-/* #undef read */
-/* #undef recv */
-/* #undef recvfrom */
-/* #undef rresvport */
-/* #undef send */
-/* #undef sendto */
-/* #undef shutdown */
-/* #undef write */
diff --git a/usr.bin/ftp/tnftp_config.h b/usr.bin/ftp/tnftp_config.h
new file mode 100644
index 0000000..75bfb75
--- /dev/null
+++ b/usr.bin/ftp/tnftp_config.h
@@ -0,0 +1,514 @@
+/* $FreeBSD$ */
+/* tnftp_config.h. Generated from tnftp_config.h.in by configure. */
+/* tnftp_config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+/* #undef CLOSEDIR_VOID */
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define to 1 if using `alloca.c'. */
+/* #undef C_ALLOCA */
+
+/* Define to 1 if the `getpgrp' function requires zero arguments. */
+#define GETPGRP_VOID 1
+
+/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
+/* #undef GWINSZ_IN_SYS_IOCTL */
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+/* #undef HAVE_ALLOCA_H */
+
+/* Define to 1 if you have the <arpa/ftp.h> header file. */
+#define HAVE_ARPA_FTP_H 1
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you have the <arpa/nameser.h> header file. */
+#define HAVE_ARPA_NAMESER_H 1
+
+/* Define to 1 if you have the declaration of `AF_INET6', and to 0 if you
+ don't. */
+#define HAVE_DECL_AF_INET6 1
+
+/* Define to 1 if you have the declaration of `AI_NUMERICHOST', and to 0 if
+ you don't. */
+#define HAVE_DECL_AI_NUMERICHOST 1
+
+/* Define to 1 if you have the declaration of `dirname', and to 0 if you
+ don't. */
+#define HAVE_DECL_DIRNAME 1
+
+/* Define to 1 if you have the declaration of `fclose', and to 0 if you don't.
+ */
+#define HAVE_DECL_FCLOSE 1
+
+/* Define to 1 if you have the declaration of `getpass', and to 0 if you
+ don't. */
+#define HAVE_DECL_GETPASS 1
+
+/* Define to 1 if you have the declaration of `h_errno', and to 0 if you
+ don't. */
+#define HAVE_DECL_H_ERRNO 1
+
+/* Define to 1 if you have the declaration of `NS_IN6ADDRSZ', and to 0 if you
+ don't. */
+#define HAVE_DECL_NS_IN6ADDRSZ 1
+
+/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't.
+ */
+#define HAVE_DECL_OPTARG 1
+
+/* Define to 1 if you have the declaration of `optind', and to 0 if you don't.
+ */
+#define HAVE_DECL_OPTIND 1
+
+/* Define to 1 if you have the declaration of `pclose', and to 0 if you don't.
+ */
+#define HAVE_DECL_PCLOSE 1
+
+/* Define to 1 if you have the declaration of `strptime', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRPTIME 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the `dirname' function. */
+#define HAVE_DIRNAME 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the `err' function. */
+#define HAVE_ERR 1
+
+/* Define to 1 if you have the <err.h> header file. */
+#define HAVE_ERR_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `fgetln' function. */
+#define HAVE_FGETLN 1
+
+/* Define to 1 if you have the `fork' function. */
+#define HAVE_FORK 1
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#define HAVE_FSEEKO 1
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `getcwd' function. */
+#define HAVE_GETCWD 1
+
+/* Define to 1 if you have the `gethostbyaddr' function. */
+#define HAVE_GETHOSTBYADDR 1
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#define HAVE_GETHOSTBYNAME 1
+
+/* Define to 1 if you have the `gethostbyname2' function. */
+#define HAVE_GETHOSTBYNAME2 1
+
+/* Define to 1 if you have the `gethostname' function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the `getnameinfo' function. */
+#define HAVE_GETNAMEINFO 1
+
+/* Define to 1 if you have the `getpass' function. */
+#define HAVE_GETPASS 1
+
+/* Define to 1 if you have the `getpassphrase' function. */
+/* #undef HAVE_GETPASSPHRASE */
+
+/* Define to 1 if you have the `getpgrp' function. */
+#define HAVE_GETPGRP 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the `inet_ntop' function. */
+#define HAVE_INET_NTOP 1
+
+/* Define to 1 if you have the `inet_pton' function. */
+#define HAVE_INET_PTON 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if the system has the type `in_port_t'. */
+#define HAVE_IN_PORT_T 1
+
+/* Define to 1 if you have the `isascii' function. */
+#define HAVE_ISASCII 1
+
+/* Define to 1 if you have the <libgen.h> header file. */
+#define HAVE_LIBGEN_H 1
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if the system has the type `long double'. */
+#define HAVE_LONG_DOUBLE 1
+
+/* Define to 1 if the system has the type `long long int'. */
+#define HAVE_LONG_LONG_INT 1
+
+/* Define to 1 if you have the <malloc.h> header file. */
+/* #undef HAVE_MALLOC_H */
+
+/* Define to 1 if you have the `memchr' function. */
+#define HAVE_MEMCHR 1
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `memset' function. */
+#define HAVE_MEMSET 1
+
+/* Define to 1 if you have the `mkstemp' function. */
+#define HAVE_MKSTEMP 1
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+/* #undef HAVE_NDIR_H */
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#define HAVE_NETDB_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the <netinet/in_systm.h> header file. */
+#define HAVE_NETINET_IN_SYSTM_H 1
+
+/* Define to 1 if you have the <netinet/ip.h> header file. */
+#define HAVE_NETINET_IP_H 1
+
+/* Define to 1 if you have the <paths.h> header file. */
+#define HAVE_PATHS_H 1
+
+/* Define if we have poll() and it is not emulated. */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the <poll.h> header file. */
+#define HAVE_POLL_H 1
+
+/* Define if `long long' is supported and *printf() supports %lld or %qd to
+ print them. */
+#define HAVE_PRINTF_LONG_LONG 1
+
+/* Define if *printf() uses %qd to print `long long' (otherwise uses %lld). */
+/* #undef HAVE_PRINTF_QD */
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H 1
+
+/* Define to 1 if you have the `realpath' function. */
+#define HAVE_REALPATH 1
+
+/* Define to 1 if you have the `regcomp' function. */
+#define HAVE_REGCOMP 1
+
+/* Define to 1 if you have the <regex.h> header file. */
+#define HAVE_REGEX_H 1
+
+/* Define to 1 if you have the <resolv.h> header file. */
+#define HAVE_RESOLV_H 1
+
+/* Define to 1 if the system has the type `sa_family_t'. */
+#define HAVE_SA_FAMILY_T 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the <setjmp.h> header file. */
+#define HAVE_SETJMP_H 1
+
+/* Define to 1 if you have the `setlocale' function. */
+#define HAVE_SETLOCALE 1
+
+/* Define to 1 if you have the `setprogname' function. */
+#define HAVE_SETPROGNAME 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the `sl_init' function. */
+#define HAVE_SL_INIT 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `socket' function. */
+#define HAVE_SOCKET 1
+
+/* Define to 1 if the system has the type `socklen_t'. */
+#define HAVE_SOCKLEN_T 1
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strcoll' function and it is properly defined.
+ */
+#define HAVE_STRCOLL 1
+
+/* Define to 1 if you have the `strcspn' function. */
+#define HAVE_STRCSPN 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strlcat' function. */
+#define HAVE_STRLCAT 1
+
+/* Define to 1 if you have the `strlcpy' function. */
+#define HAVE_STRLCPY 1
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define to 1 if you have the `strpbrk' function. */
+#define HAVE_STRPBRK 1
+
+/* Define to 1 if you have the `strptime' function. */
+#define HAVE_STRPTIME 1
+
+/* Define to 1 if you have the `strrchr' function. */
+#define HAVE_STRRCHR 1
+
+/* Define to 1 if you have the `strsep' function. */
+#define HAVE_STRSEP 1
+
+/* Define to 1 if you have the `strstr' function. */
+#define HAVE_STRSTR 1
+
+/* Define to 1 if you have the `strtol' function. */
+#define HAVE_STRTOL 1
+
+/* Define to 1 if you have the `strtoll' function. */
+#define HAVE_STRTOLL 1
+
+/* Define to 1 if you have the `strtoul' function. */
+#define HAVE_STRTOUL 1
+
+/* Define to 1 if the system has the type `struct addrinfo'. */
+#define HAVE_STRUCT_ADDRINFO 1
+
+/* Define to 1 if `struct dirent' is a member of `d_namlen'. */
+#define HAVE_STRUCT_DIRENT_D_NAMLEN 1
+
+/* Define to 1 if the system has the type `struct pollfd'. */
+#define HAVE_STRUCT_POLLFD 1
+
+/* Define to 1 if the system has the type `struct sockaddr_in6'. */
+#define HAVE_STRUCT_SOCKADDR_IN6 1
+
+/* Define to 1 if `struct sockaddr_in' is a member of `sin_len'. */
+#define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1
+
+/* Define to 1 if `struct sockaddr' is a member of `sa_len'. */
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
+
+/* Define to 1 if you have the `strunvis' function. */
+#define HAVE_STRUNVIS 1
+
+/* Define to 1 if you have the `strvis' function. */
+#define HAVE_STRVIS 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define to 1 if you have the <sys/poll.h> header file. */
+#define HAVE_SYS_POLL_H 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/syslimits.h> header file. */
+#define HAVE_SYS_SYSLIMITS_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define to 1 if you have the <termcap.h> header file. */
+#define HAVE_TERMCAP_H 1
+
+/* Define to 1 if you have the <termios.h> header file. */
+#define HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the `timegm' function. */
+#define HAVE_TIMEGM 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `usleep' function. */
+#define HAVE_USLEEP 1
+
+/* Define to 1 if you have the `utime' function. */
+#define HAVE_UTIME 1
+
+/* Define to 1 if you have the `utimes' function. */
+#define HAVE_UTIMES 1
+
+/* Define to 1 if you have the <utime.h> header file. */
+#define HAVE_UTIME_H 1
+
+/* Define to 1 if you have the `vfork' function. */
+#define HAVE_VFORK 1
+
+/* Define to 1 if you have the <vfork.h> header file. */
+/* #undef HAVE_VFORK_H */
+
+/* Define to 1 if you have the <vis.h> header file. */
+#define HAVE_VIS_H 1
+
+/* Define to 1 if `fork' works. */
+#define HAVE_WORKING_FORK 1
+
+/* Define to 1 if `vfork' works. */
+#define HAVE_WORKING_VFORK 1
+
+/* Name of package */
+#define PACKAGE "tnftp"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "lukem@NetBSD.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "tnftp"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "tnftp 20100108"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "tnftp"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "20100108"
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+/* #undef STACK_DIRECTION */
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define if using (Dante) SOCKS5 proxy. */
+/* #undef USE_SOCKS */
+
+/* Version number of package */
+#define VERSION "20100108"
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+/* #undef _UINT32_T */
+
+/* Define to `long int' if <sys/types.h> does not define. */
+/* #undef off_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define to the type of an unsigned integer type of width exactly 32 bits if
+ such a type exists and the standard includes do not define it. */
+/* #undef uint32_t */
+
+/* Define as `fork' if `vfork' does not work. */
+/* #undef vfork */
+
+
+/* Define if using IPv6 support. */
+/* Commented out so this can be selected fromt he Makefile -gavin */
+/* #define USE_INET6 1 */
+
+#define USE_GLOB_H 1
diff --git a/usr.bin/gcore/elfcore.c b/usr.bin/gcore/elfcore.c
index 9da22d7..8228c57 100644
--- a/usr.bin/gcore/elfcore.c
+++ b/usr.bin/gcore/elfcore.c
@@ -183,7 +183,7 @@ elf_coredump(int efd __unused, int fd, pid_t pid)
ptrace(PT_IO, pid, (caddr_t)&iorequest, 0);
ngot = iorequest.piod_len;
if ((size_t)ngot < nwant)
- errx(1, "short read wanted %d, got %d",
+ errx(1, "short read wanted %zu, got %zd",
nwant, ngot);
ngot = write(fd, buf, nwant);
if (ngot == -1)
diff --git a/usr.bin/ipcs/ipc.c b/usr.bin/ipcs/ipc.c
index f904e01..e0601dc 100644
--- a/usr.bin/ipcs/ipc.c
+++ b/usr.bin/ipcs/ipc.c
@@ -73,8 +73,7 @@ struct nlist symbols[] = {
X(shmseg, sizeof(u_long)) \
X(shmall, sizeof(u_long))
-#define SEMINFO_XVEC X(semmap, sizeof(int)) \
- X(semmni, sizeof(int)) \
+#define SEMINFO_XVEC X(semmni, sizeof(int)) \
X(semmns, sizeof(int)) \
X(semmnu, sizeof(int)) \
X(semmsl, sizeof(int)) \
@@ -120,7 +119,7 @@ sysctlgatherstruct(void *addr, size_t size, struct scgs_vector *vecarr)
if (rv == -1)
err(1, "sysctlbyname: %s", xp->sysctl);
if (tsiz != xp->size)
- errx(1, "%s size mismatch (expected %d, got %d)",
+ errx(1, "%s size mismatch (expected %zu, got %zu)",
xp->sysctl, xp->size, tsiz);
}
}
@@ -199,7 +198,7 @@ kget(int idx, void *addr, size_t size)
err(1, "sysctlbyname: %s", sym2sysctl[idx]);
if (tsiz != size)
errx(1, "%s size mismatch "
- "(expected %d, got %d)",
+ "(expected %zu, got %zu)",
sym2sysctl[idx], size, tsiz);
break;
}
diff --git a/usr.bin/ipcs/ipcs.c b/usr.bin/ipcs/ipcs.c
index 3ddfa25..1d8e354 100644
--- a/usr.bin/ipcs/ipcs.c
+++ b/usr.bin/ipcs/ipcs.c
@@ -474,8 +474,6 @@ print_ksemtotal(struct seminfo seminfo)
{
printf("seminfo:\n");
- printf("\tsemmap: %12d\t(# of entries in semaphore map)\n",
- seminfo.semmap);
printf("\tsemmni: %12d\t(# of semaphore identifiers)\n",
seminfo.semmni);
printf("\tsemmns: %12d\t(# of semaphores in system)\n",
diff --git a/usr.bin/kdump/mksubr b/usr.bin/kdump/mksubr
index dbde92b..d6fa870 100644
--- a/usr.bin/kdump/mksubr
+++ b/usr.bin/kdump/mksubr
@@ -1,5 +1,28 @@
#!/bin/sh
#
+# Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
# $FreeBSD$
#
# Generates kdump_subr.c
diff --git a/usr.bin/ktrace/ktrace.c b/usr.bin/ktrace/ktrace.c
index fa2fa1a..4490849 100644
--- a/usr.bin/ktrace/ktrace.c
+++ b/usr.bin/ktrace/ktrace.c
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
#include <sys/ktrace.h>
#include <err.h>
-#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
diff --git a/usr.bin/lastcomm/lastcomm.c b/usr.bin/lastcomm/lastcomm.c
index 8852081..e140c70 100644
--- a/usr.bin/lastcomm/lastcomm.c
+++ b/usr.bin/lastcomm/lastcomm.c
@@ -48,8 +48,6 @@ __FBSDID("$FreeBSD$");
#include <ctype.h>
#include <err.h>
#include <errno.h>
-#include <fcntl.h>
-#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/usr.bin/lastcomm/readrec.c b/usr.bin/lastcomm/readrec.c
index 4883b2a..5de7c5c 100644
--- a/usr.bin/lastcomm/readrec.c
+++ b/usr.bin/lastcomm/readrec.c
@@ -33,13 +33,9 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/acct.h>
-#include <ctype.h>
-#include <err.h>
#include <errno.h>
-#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
int readrec_forward(FILE *f, struct acctv2 *av2);
diff --git a/usr.bin/ldd/sods.c b/usr.bin/ldd/sods.c
index e6de90f..adf0f4f 100644
--- a/usr.bin/ldd/sods.c
+++ b/usr.bin/ldd/sods.c
@@ -142,6 +142,24 @@ main(int argc, char *argv[])
}
#endif
+static inline const void *align_struct(const void *expr)
+{
+ assert(!(((int)expr) & 3));
+ return expr;
+}
+
+static inline const void *align_long(const void *expr)
+{
+ assert(!(((int)expr) & 3));
+ return expr;
+}
+
+static inline const void *align_short(const void *expr)
+{
+ assert(!(((int)expr) & 1));
+ return expr;
+}
+
#ifdef STANDALONE
static
#endif
@@ -182,7 +200,7 @@ dump_file(const char *fname)
file_base = (const char *) objbase; /* Makes address arithmetic easier */
- if (IS_ELF(*(const Elf32_Ehdr*) file_base)) {
+ if (IS_ELF(*(const Elf32_Ehdr*) align_struct(file_base))) {
warnx("%s: this is an ELF program; use objdump to examine", fname);
++error_count;
munmap(objbase, sb.st_size);
@@ -190,7 +208,7 @@ dump_file(const char *fname)
return;
}
- ex = (const struct exec *) file_base;
+ ex = (const struct exec *) align_struct(file_base);
printf("%s: a_midmag = 0x%lx\n", fname, (long)ex->a_midmag);
printf(" magic = 0x%lx = 0%lo, netmagic = 0x%lx = 0%lo\n",
@@ -214,8 +232,9 @@ dump_file(const char *fname)
text_base = file_base + N_TXTOFF(*ex);
data_base = file_base + N_DATOFF(*ex);
- rel_base = (const struct relocation_info *) (file_base + N_RELOFF(*ex));
- sym_base = (const struct nlist *) (file_base + N_SYMOFF(*ex));
+ rel_base = (const struct relocation_info *)
+ align_struct(file_base + N_RELOFF(*ex));
+ sym_base = (const struct nlist *) align_struct(file_base + N_SYMOFF(*ex));
str_base = file_base + N_STROFF(*ex);
rel_count = (ex->a_trsize + ex->a_drsize) / sizeof rel_base[0];
@@ -276,19 +295,20 @@ dump_file(const char *fname)
printf(" Object file, origin = %lx\n", origin);
if (N_GETFLAG(*ex) & EX_DYNAMIC) {
- dyn = (const struct _dynamic *) data_base;
+ dyn = (const struct _dynamic *) align_struct(data_base);
printf(" Dynamic version = %d\n", dyn->d_version);
sdt = (const struct section_dispatch_table *)
- (text_addr + (unsigned long) dyn->d_un.d_sdt);
+ align_struct(text_addr + (unsigned long) dyn->d_un.d_sdt);
- rtrel_base =
- (const struct relocation_info *) (text_addr + sdt->sdt_rel);
+ rtrel_base = (const struct relocation_info *)
+ align_struct(text_addr + sdt->sdt_rel);
rtrel_count = (sdt->sdt_hash - sdt->sdt_rel) / sizeof rtrel_base[0];
assert(rtrel_count * sizeof rtrel_base[0] ==
(size_t)(sdt->sdt_hash - sdt->sdt_rel));
- rtsym_base = (const struct nzlist *) (text_addr + sdt->sdt_nzlist);
+ rtsym_base = (const struct nzlist *)
+ align_struct(text_addr + sdt->sdt_nzlist);
rtsym_count = (sdt->sdt_strings - sdt->sdt_nzlist) /
sizeof rtsym_base[0];
assert(rtsym_count * sizeof rtsym_base[0] ==
@@ -352,11 +372,13 @@ dump_rels(const char *label, const struct relocation_info *base,
break;
case 2:
snprintf(contents, sizeof contents, " [%04x]",
- *(unsigned const short *)(text_addr + r->r_address));
+ *(unsigned const short *)
+ align_short(text_addr + r->r_address));
break;
case 4:
snprintf(contents, sizeof contents, "[%08lx]",
- *(unsigned const long *)(text_addr + r->r_address));
+ *(unsigned const long *)
+ align_long(text_addr + r->r_address));
break;
}
} else
@@ -429,7 +451,7 @@ dump_sods(void)
sod_offset = sdt->sdt_sods;
printf(" Shared object dependencies:\n");
while (sod_offset != 0) {
- const struct sod *sodp = (const struct sod *) (text_addr + sod_offset);
+ const struct sod *sodp = (const struct sod *) align_struct((text_addr + sod_offset));
const char *name = (const char *) (text_addr + sodp->sod_name);
if (sodp->sod_library)
diff --git a/usr.bin/ncal/ncal.1 b/usr.bin/ncal/ncal.1
index 8429906..3d71ec3 100644
--- a/usr.bin/ncal/ncal.1
+++ b/usr.bin/ncal/ncal.1
@@ -171,6 +171,8 @@ that, two after that and the whole year.
will warn about these combinations.
.Pp
A year starts on January 1.
+.Pp
+Highlighting of dates is disabled if stdout is not a tty.
.Sh SEE ALSO
.Xr calendar 3 ,
.Xr strftime 3
diff --git a/usr.bin/ncal/ncal.c b/usr.bin/ncal/ncal.c
index 44e31fe..2ca770a 100644
--- a/usr.bin/ncal/ncal.c
+++ b/usr.bin/ncal/ncal.c
@@ -822,7 +822,8 @@ mkmonthr(int y, int m, int jd_flag, struct monthlines *mlines)
dt.d = j - jan1 + 1;
else
sdater(j, &dt);
- if (j == highlightdate && !flag_nohighlight)
+ if (j == highlightdate && !flag_nohighlight
+ && isatty(STDOUT_FILENO))
highlight(mlines->lines[i] + k,
ds + dt.d * dw, dw, &l);
else
diff --git a/usr.bin/ncplogin/ncplogin.c b/usr.bin/ncplogin/ncplogin.c
index 05b95c1..edb903e 100644
--- a/usr.bin/ncplogin/ncplogin.c
+++ b/usr.bin/ncplogin/ncplogin.c
@@ -42,8 +42,6 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdlib.h>
-#include <string.h>
#include <sysexits.h>
#include <unistd.h>
diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c
index fc15607..8a11270 100644
--- a/usr.bin/netstat/if.c
+++ b/usr.bin/netstat/if.c
@@ -394,7 +394,7 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *))
n = cp - sa->sa_data + 1;
cp = sa->sa_data;
hexprint:
- while (--n >= 0)
+ while ((--n >= 0) && (m < 30))
m += printf("%02x%c", *cp++ & 0xff,
n > 0 ? ':' : ' ');
m = 32 - m;
diff --git a/usr.bin/nsupdate/Makefile b/usr.bin/nsupdate/Makefile
index 941c7f3..d5cb8f0 100644
--- a/usr.bin/nsupdate/Makefile
+++ b/usr.bin/nsupdate/Makefile
@@ -14,6 +14,7 @@ SRCS+= nsupdate.c
CFLAGS+= -I${SRCDIR}/include
CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
+CFLAGS+= -DSESSION_KEYFILE=\"/var/run/named/session.key\"
DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
diff --git a/usr.bin/quota/quota.c b/usr.bin/quota/quota.c
index 6cc3517..67d9c5a 100644
--- a/usr.bin/quota/quota.c
+++ b/usr.bin/quota/quota.c
@@ -264,8 +264,11 @@ prthumanval(int len, u_int64_t bytes)
{
char buf[len + 1];
- humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE,
- HN_B | HN_NOSPACE | HN_DECIMAL);
+ /*
+ * Limit the width to 5 bytes as that is what users expect.
+ */
+ humanize_number(buf, sizeof(buf) < 5 ? sizeof(buf) : 5, bytes, "",
+ HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
(void)printf(" %*s", len, buf);
}
@@ -352,10 +355,13 @@ showquotas(int type, u_long id, const char *name)
prthumanval(7, dbtob(qup->dqblk.dqb_bhardlimit));
} else {
printf(" %7ju%c %7ju %7ju",
- dbtob(1024) * (uintmax_t)qup->dqblk.dqb_curblocks,
+ (uintmax_t)dbtob(qup->dqblk.dqb_curblocks)
+ / 1024,
(msgb == NULL) ? ' ' : '*',
- dbtob(1024) * (uintmax_t)qup->dqblk.dqb_bsoftlimit,
- dbtob(1024) * (uintmax_t)qup->dqblk.dqb_bhardlimit);
+ (uintmax_t)dbtob(qup->dqblk.dqb_bsoftlimit)
+ / 1024,
+ (uintmax_t)dbtob(qup->dqblk.dqb_bhardlimit)
+ / 1024);
}
if (msgb != NULL)
bgrace = timeprt(qup->dqblk.dqb_btime);
diff --git a/usr.bin/rctl/rctl.8 b/usr.bin/rctl/rctl.8
index 98c9d4e..f8f8ddb 100644
--- a/usr.bin/rctl/rctl.8
+++ b/usr.bin/rctl/rctl.8
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 26, 2011
+.Dd July 14, 2011
.Dt RCTL 8
.Os
.Sh NAME
@@ -121,32 +121,31 @@ A filter that matches all defined rules for nproc resource would be
"::nproc".
.Pp
.Sh RESOURCES
-.Bl -column -offset 3n "msgqqueued"
-.It cpu CPU time, in milliseconds
-.It data data size, in bytes
-.It stack stack size, in bytes
-.It core core dump size, in bytes
-.It rss resident set size, in bytes
-.It memlock locked memory, in bytes
-.It nproc number of processes
-.It nofile file descriptor table size
-.It vmem address space limit, in bytes
-.It npts number of PTYs
-.It swap swap usage, in bytes
-.It nthr number of threads
-.It msgqqueued number of queued SysV messages
-.It msgqsize SysV message queue size, in bytes
-.It nmsgq number of SysV message queues
-.It nsem number of SysV semaphores
-.It nsemop number of SysV semaphores modified in a single semop(2) call
-.It nshm number of SysV shared memory segments
-.It shmsize SysV shared memory size, in bytes
-.It wallclock wallclock time, in milliseconds
-.It pctcpu %cpu time
+.Bl -column -offset 3n "pseudoterminals"
+.It cputime CPU time, in seconds
+.It datasize data size, in bytes
+.It stacksize stack size, in bytes
+.It coredumpsize core dump size, in bytes
+.It memoryuse resident set size, in bytes
+.It memorylocked locked memory, in bytes
+.It maxproc number of processes
+.It openfiles file descriptor table size
+.It vmemoryuse address space limit, in bytes
+.It pseudoterminals number of PTYs
+.It swapuse swap usage, in bytes
+.It nthr number of threads
+.It msgqqueued number of queued SysV messages
+.It msgqsize SysV message queue size, in bytes
+.It nmsgq number of SysV message queues
+.It nsem number of SysV semaphores
+.It nsemop number of SysV semaphores modified in a single semop(2) call
+.It nshm number of SysV shared memory segments
+.It shmsize SysV shared memory size, in bytes
+.It wallclock wallclock time, in seconds
.El
.Pp
.Sh ACTIONS
-.Bl -column -offset 3n "msgqqueued"
+.Bl -column -offset 3n "pseudoterminals"
.It deny deny the allocation; not supported for cpu and wallclock
.It log log a warning to the console
.It devctl send notification to
@@ -167,7 +166,7 @@ Note that limiting RSS may kill the machine due to thrashing.
.Sh EXIT STATUS
.Ex -std
.Sh EXAMPLES
-.Dl rctl -a user:joe:vmem:deny=1g
+.Dl rctl -a user:joe:vmemoryuse:deny=1g
.Pp
Prevent user "joe" from allocating more than 1GB of virtual memory.
.Pp
diff --git a/usr.bin/rpcgen/rpc_scan.c b/usr.bin/rpcgen/rpc_scan.c
index 421b055..bdbeec0 100644
--- a/usr.bin/rpcgen/rpc_scan.c
+++ b/usr.bin/rpcgen/rpc_scan.c
@@ -329,10 +329,9 @@ findstrconst(char **str, const char **val)
error("unterminated string constant");
}
p++;
- size = p - *str;
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
+ size = p - *str + 1;
+ tmp = xmalloc(size);
+ (void) strlcpy(tmp, *str, size);
*val = tmp;
*str = p;
}
@@ -352,13 +351,12 @@ findchrconst(char **str, const char **val)
error("unterminated string constant");
}
p++;
- size = p - *str;
- if (size != 3) {
+ size = p - *str + 1;
+ if (size != 4) {
error("empty char string");
}
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
+ tmp = xmalloc(size);
+ (void) strlcpy(tmp, *str, size);
*val = tmp;
*str = p;
}
@@ -381,10 +379,9 @@ findconst(char **str, const char **val)
p++;
} while (isdigit(*p));
}
- size = p - *str;
- tmp = xmalloc(size + 1);
- (void) strncpy(tmp, *str, size);
- tmp[size] = 0;
+ size = p - *str + 1;
+ tmp = xmalloc(size);
+ (void) strlcpy(tmp, *str, size);
*val = tmp;
*str = p;
}
@@ -438,8 +435,7 @@ findkind(char **mark, token *tokp)
tokp->kind = TOK_IDENT;
for (len = 0; isalnum(str[len]) || str[len] == '_'; len++);
tmp = xmalloc(len + 1);
- (void) strncpy(tmp, str, len);
- tmp[len] = 0;
+ (void) strlcpy(tmp, str, len + 1);
tokp->str = tmp;
*mark = str + len;
}
diff --git a/usr.bin/systat/netstat.c b/usr.bin/systat/netstat.c
index 2f8ca0a..b1c6dc9 100644
--- a/usr.bin/systat/netstat.c
+++ b/usr.bin/systat/netstat.c
@@ -63,7 +63,6 @@ static const char sccsid[] = "@(#)netstat.c 8.1 (Berkeley) 6/6/93";
#define TCPSTATES
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h>
-#include <netinet/tcp_var.h>
#include <netinet/tcp_debug.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
diff --git a/usr.bin/tar/util.c b/usr.bin/tar/util.c
index 858d472..4177e9c 100644
--- a/usr.bin/tar/util.c
+++ b/usr.bin/tar/util.c
@@ -226,7 +226,11 @@ yes(const char *fmt, ...)
fflush(stderr);
l = read(2, buff, sizeof(buff) - 1);
- if (l <= 0)
+ if (l < 0) {
+ fprintf(stderr, "Keyboard read failed\n");
+ exit(1);
+ }
+ if (l == 0)
return (0);
buff[l] = 0;
diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c
index e59f647..9d9025a 100644
--- a/usr.bin/tar/write.c
+++ b/usr.bin/tar/write.c
@@ -752,6 +752,9 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
break;
}
+ if (bsdtar->option_no_subdirs)
+ descend = 0;
+
/*
* Are we about to cross to a new filesystem?
*/
@@ -764,7 +767,6 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
} else if (descend == 0) {
/* We're not descending, so no need to check. */
} else if (bsdtar->option_dont_traverse_mounts) {
- /* User has asked us not to cross mount points. */
descend = 0;
} else {
/* We're prepared to cross a mount point. */
@@ -791,8 +793,15 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
* In -u mode, check that the file is newer than what's
* already in the archive; in all modes, obey --newerXXX flags.
*/
- if (!new_enough(bsdtar, name, st))
+ if (!new_enough(bsdtar, name, st)) {
+ if (!descend)
+ continue;
+ if (bsdtar->option_interactive &&
+ !yes("add '%s'", name))
+ continue;
+ tree_descend(tree);
continue;
+ }
archive_entry_free(entry);
entry = archive_entry_new();
@@ -868,8 +877,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path)
!yes("add '%s'", name))
continue;
- /* Note: if user vetoes, we won't descend. */
- if (descend && !bsdtar->option_no_subdirs)
+ if (descend)
tree_descend(tree);
/*
@@ -919,6 +927,7 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a,
const char *pathname = archive_entry_sourcepath(entry);
fd = open(pathname, O_RDONLY | O_BINARY);
if (fd == -1) {
+ bsdtar->return_value = 1;
if (!bsdtar->verbose)
bsdtar_warnc(errno,
"%s: could not open file", pathname);
@@ -1020,6 +1029,12 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a,
progress += bytes_written;
bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN);
}
+ if (bytes_read < 0) {
+ bsdtar_warnc(errno,
+ "%s: Read error",
+ archive_entry_pathname(entry));
+ bsdtar->return_value = 1;
+ }
return 0;
}
diff --git a/usr.bin/tftp/main.c b/usr.bin/tftp/main.c
index 2bdcf5f..2b0172e 100644
--- a/usr.bin/tftp/main.c
+++ b/usr.bin/tftp/main.c
@@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/file.h>
-#include <sys/param.h>
#include <sys/stat.h>
#include <netinet/in.h>
@@ -78,7 +77,7 @@ __FBSDID("$FreeBSD$");
#define MAXLINE 200
#define TIMEOUT 5 /* secs between rexmt's */
-static struct sockaddr_storage peeraddr;
+typedef struct sockaddr_storage peeraddr;
static int connected;
static char mode[32];
jmp_buf toplevel;
diff --git a/usr.bin/tftp/tftp.1 b/usr.bin/tftp/tftp.1
index bf8720b..02709c0 100644
--- a/usr.bin/tftp/tftp.1
+++ b/usr.bin/tftp/tftp.1
@@ -28,7 +28,7 @@
.\" @(#)tftp.1 8.2 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd October 1, 2003
+.Dd June 22, 2011
.Dt TFTP 1
.Os
.Sh NAME
@@ -70,6 +70,21 @@ Shorthand for "mode ascii"
.It Cm binary
Shorthand for "mode binary"
.Pp
+.It Cm blocksize Ar [size]
+Sets the TFTP blksize option in TFTP Read Request or Write Request packets
+to
+.Ar [size]
+as specified in RFC 2348. Valid values are between 8 and 65464.
+If no blocksize is specified, then by default a blocksize of 512 bytes
+will be used.
+.Pp
+.It Cm blocksize2 Ar [size]
+Sets the TFTP blksize2 option in TFTP Read Request or Write Request packets
+to
+.Ar [size] .
+Values are restricted to powers of 2 between 8 and 32768. This is a
+non-standard TFTP option.
+.Pp
.It Cm connect Ar host Op Ar port
Set the
.Ar host
@@ -93,6 +108,14 @@ or
.Cm put
commands.
.Pp
+.It Cm debug Ar level
+Enable or disable debugging levels during verbose output. The value of
+.Ar level
+can be one of
+.Cm packet, simple, options,
+or
+.Cm access.
+.Pp
.It Cm get Oo Ar host : Oc Ns Ar file Op Ar localname
.It Cm get Xo
.Oo Ar host1 : Oc Ns Ar file1
@@ -130,6 +153,11 @@ or
The default is
.Em ascii .
.Pp
+.It Cm packetdrop [arg]
+Randomly drop
+.Ar arg
+out of 100 packets during a transfer. This is a debugging feature.
+.Pp
.It Cm put Ar file Op Oo Ar host : Oc Ns Ar remotename
.It Cm put Ar file1 file2 ... fileN Op Oo Ar host : Oc Ns Ar remote-directory
Put a file or set of files to the remote host.
@@ -149,6 +177,17 @@ see the example under the
.Cm get
command.
.Pp
+.It Cm options Ar [arg]
+Enable or disable support for TFTP options. The valid values of
+.Ar arg
+are
+.Cm on
+(enable RFC 2347 options),
+.Cm off
+(disable RFC 2347 options), and
+.Cm extra
+(toggle support for non-RFC defined options).
+.Pp
.It Cm quit
Exit
.Nm .
@@ -157,6 +196,15 @@ An end of file also exits.
.It Cm rexmt Ar retransmission-timeout
Set the per-packet retransmission timeout, in seconds.
.Pp
+.It Cm rollover [arg]
+Specify the rollover option in TFTP Read Request or Write
+Request packets. After 65535 packets have been transmitted, set the block
+counter to
+.Ar arg .
+Valid values of
+.Ar arg
+are 0 and 1. This is a non-standard TFTP option.
+.Pp
.It Cm status
Show current status.
.Pp
@@ -169,11 +217,51 @@ Toggle packet tracing.
.It Cm verbose
Toggle verbose mode.
.El
+.Sh SEE ALSO
+.Xr tftpd 8
+.Pp
+The following RFC's are supported:
+.Rs
+RFC 1350
+.%T The TFTP Protocol (Revision 2)
+.Re
+.Rs
+RFC 2347
+.%T TFTP Option Extension
+.Re
+.Rs
+RFC 2348
+.%T TFTP Blocksize Option
+.Re
+.Rs
+RFC 2349
+.%T TFTP Timeout Interval and Transfer Size Options
+.Re
+.Rs
+RFC 3617
+.%T Uniform Resource Identifier (URI) Scheme and Applicability Statement for the Trivial File Transfer Protocol (TFTP)
+.Re
+.Pp
+The non-standard
+.Cm rollover
+and
+.Cm blksize2
+TFTP options are mentioned here:
+.Rs
+.%T Extending TFTP
+.%U http://www.compuphase.com/tftp.htm
+.Re
.Sh HISTORY
The
.Nm
command appeared in
.Bx 4.3 .
+.Pp
+Edwin Groothuis <edwin@FreeBSD.org> performed a major rewrite of the
+.Xr tftpd 8
+and
+.Nm
+code to support RFC2348.
.Sh NOTES
Because there is no user-login or validation within
the
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 4c55682..02dc847 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -239,19 +239,48 @@ static const char *format_nice(const struct kinfo_proc *pp);
static void getsysctl(const char *name, void *ptr, size_t len);
static int swapmode(int *retavail, int *retfree);
+void
+toggle_pcpustats(struct statics *statics)
+{
+
+ if (ncpus == 1)
+ return;
+
+ /* Adjust display based on ncpus */
+ if (pcpu_stats) {
+ y_mem += ncpus - 1; /* 3 */
+ y_swap += ncpus - 1; /* 4 */
+ y_idlecursor += ncpus - 1; /* 5 */
+ y_message += ncpus - 1; /* 5 */
+ y_header += ncpus - 1; /* 6 */
+ y_procs += ncpus - 1; /* 7 */
+ Header_lines += ncpus - 1; /* 7 */
+ statics->ncpus = ncpus;
+ } else {
+ y_mem = 3;
+ y_swap = 4;
+ y_idlecursor = 5;
+ y_message = 5;
+ y_header = 6;
+ y_procs = 7;
+ Header_lines = 7;
+ statics->ncpus = 1;
+ }
+}
+
int
machine_init(struct statics *statics, char do_unames)
{
- int pagesize;
- size_t modelen;
+ int i, j, empty, pagesize;
+ size_t size;
struct passwd *pw;
- modelen = sizeof(smpmode);
- if ((sysctlbyname("machdep.smp_active", &smpmode, &modelen,
+ size = sizeof(smpmode);
+ if ((sysctlbyname("machdep.smp_active", &smpmode, &size,
NULL, 0) != 0 &&
- sysctlbyname("kern.smp.active", &smpmode, &modelen,
+ sysctlbyname("kern.smp.active", &smpmode, &size,
NULL, 0) != 0) ||
- modelen != sizeof(smpmode))
+ size != sizeof(smpmode))
smpmode = 0;
if (do_unames) {
@@ -299,51 +328,37 @@ machine_init(struct statics *statics, char do_unames)
statics->order_names = ordernames;
#endif
- /* Adjust display based on ncpus */
- if (pcpu_stats) {
- int i, j, empty;
- size_t size;
-
- cpumask = 0;
- ncpus = 0;
- GETSYSCTL("kern.smp.maxcpus", maxcpu);
- size = sizeof(long) * maxcpu * CPUSTATES;
- times = malloc(size);
- if (times == NULL)
- err(1, "malloc %zd bytes", size);
- if (sysctlbyname("kern.cp_times", times, &size, NULL, 0) == -1)
- err(1, "sysctlbyname kern.cp_times");
- pcpu_cp_time = calloc(1, size);
- maxid = (size / CPUSTATES / sizeof(long)) - 1;
- for (i = 0; i <= maxid; i++) {
- empty = 1;
- for (j = 0; empty && j < CPUSTATES; j++) {
- if (times[i * CPUSTATES + j] != 0)
- empty = 0;
- }
- if (!empty) {
- cpumask |= (1ul << i);
- ncpus++;
- }
+ /* Allocate state for per-CPU stats. */
+ cpumask = 0;
+ ncpus = 0;
+ GETSYSCTL("kern.smp.maxcpus", maxcpu);
+ size = sizeof(long) * maxcpu * CPUSTATES;
+ times = malloc(size);
+ if (times == NULL)
+ err(1, "malloc %zd bytes", size);
+ if (sysctlbyname("kern.cp_times", times, &size, NULL, 0) == -1)
+ err(1, "sysctlbyname kern.cp_times");
+ pcpu_cp_time = calloc(1, size);
+ maxid = (size / CPUSTATES / sizeof(long)) - 1;
+ for (i = 0; i <= maxid; i++) {
+ empty = 1;
+ for (j = 0; empty && j < CPUSTATES; j++) {
+ if (times[i * CPUSTATES + j] != 0)
+ empty = 0;
}
-
- if (ncpus > 1) {
- y_mem += ncpus - 1; /* 3 */
- y_swap += ncpus - 1; /* 4 */
- y_idlecursor += ncpus - 1; /* 5 */
- y_message += ncpus - 1; /* 5 */
- y_header += ncpus - 1; /* 6 */
- y_procs += ncpus - 1; /* 7 */
- Header_lines += ncpus - 1; /* 7 */
+ if (!empty) {
+ cpumask |= (1ul << i);
+ ncpus++;
}
- size = sizeof(long) * ncpus * CPUSTATES;
- pcpu_cp_old = calloc(1, size);
- pcpu_cp_diff = calloc(1, size);
- pcpu_cpu_states = calloc(1, size);
- statics->ncpus = ncpus;
- } else {
- statics->ncpus = 1;
}
+ size = sizeof(long) * ncpus * CPUSTATES;
+ pcpu_cp_old = calloc(1, size);
+ pcpu_cp_diff = calloc(1, size);
+ pcpu_cpu_states = calloc(1, size);
+ statics->ncpus = 1;
+
+ if (pcpu_stats)
+ toggle_pcpustats(statics);
/* all done! */
return (0);
@@ -398,14 +413,11 @@ get_system_info(struct system_info *si)
int i, j;
size_t size;
- /* get the cp_time array */
- if (pcpu_stats) {
- size = (maxid + 1) * CPUSTATES * sizeof(long);
- if (sysctlbyname("kern.cp_times", pcpu_cp_time, &size, NULL, 0) == -1)
- err(1, "sysctlbyname kern.cp_times");
- } else {
- GETSYSCTL("kern.cp_time", cp_time);
- }
+ /* get the CPU stats */
+ size = (maxid + 1) * CPUSTATES * sizeof(long);
+ if (sysctlbyname("kern.cp_times", pcpu_cp_time, &size, NULL, 0) == -1)
+ err(1, "sysctlbyname kern.cp_times");
+ GETSYSCTL("kern.cp_time", cp_time);
GETSYSCTL("vm.loadavg", sysload);
GETSYSCTL("kern.lastpid", lastpid);
@@ -413,21 +425,17 @@ get_system_info(struct system_info *si)
for (i = 0; i < 3; i++)
si->load_avg[i] = (double)sysload.ldavg[i] / sysload.fscale;
- if (pcpu_stats) {
- for (i = j = 0; i <= maxid; i++) {
- if ((cpumask & (1ul << i)) == 0)
- continue;
- /* convert cp_time counts to percentages */
- percentages(CPUSTATES, &pcpu_cpu_states[j * CPUSTATES],
- &pcpu_cp_time[j * CPUSTATES],
- &pcpu_cp_old[j * CPUSTATES],
- &pcpu_cp_diff[j * CPUSTATES]);
- j++;
- }
- } else {
- /* convert cp_time counts to percentages */
- percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
+ /* convert cp_time counts to percentages */
+ for (i = j = 0; i <= maxid; i++) {
+ if ((cpumask & (1ul << i)) == 0)
+ continue;
+ percentages(CPUSTATES, &pcpu_cpu_states[j * CPUSTATES],
+ &pcpu_cp_time[j * CPUSTATES],
+ &pcpu_cp_old[j * CPUSTATES],
+ &pcpu_cp_diff[j * CPUSTATES]);
+ j++;
}
+ percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff);
/* sum memory & swap statistics */
{
@@ -616,7 +624,6 @@ get_process_info(struct system_info *si, struct process_select *sel,
int active_procs;
struct kinfo_proc **prefp;
struct kinfo_proc *pp;
- struct kinfo_proc *prev_pp = NULL;
/* these are copied out of sel for speed */
int show_idle;
@@ -649,7 +656,8 @@ get_process_info(struct system_info *si, struct process_select *sel,
}
previous_proc_count = nproc;
- pbase = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);
+ pbase = kvm_getprocs(kd, sel->thread ? KERN_PROC_ALL : KERN_PROC_PROC,
+ 0, &nproc);
if (nproc > onproc)
pref = realloc(pref, sizeof(*pref) * (onproc = nproc));
if (pref == NULL || pbase == NULL) {
@@ -701,17 +709,16 @@ get_process_info(struct system_info *si, struct process_select *sel,
/* skip zombies */
continue;
+ if (!show_kidle && pp->ki_tdflags & TDF_IDLETD)
+ /* skip kernel idle process */
+ continue;
+
if (displaymode == DISP_CPU && !show_idle &&
(pp->ki_pctcpu == 0 ||
pp->ki_stat == SSTOP || pp->ki_stat == SIDL))
/* skip idle or non-running processes */
continue;
- if (displaymode == DISP_CPU && !show_kidle &&
- pp->ki_tdflags & TDF_IDLETD)
- /* skip kernel idle process */
- continue;
-
if (displaymode == DISP_IO && !show_idle && p_io == 0)
/* skip processes that aren't doing I/O */
continue;
@@ -720,21 +727,8 @@ get_process_info(struct system_info *si, struct process_select *sel,
/* skip proc. that don't belong to the selected UID */
continue;
- /*
- * When not showing threads, take the first thread
- * for output and add the fields that we can from
- * the rest of the process's threads rather than
- * using the system's mostly-broken KERN_PROC_PROC.
- */
- if (sel->thread || prev_pp == NULL ||
- prev_pp->ki_pid != pp->ki_pid) {
- *prefp++ = pp;
- active_procs++;
- prev_pp = pp;
- } else {
- prev_pp->ki_pctcpu += pp->ki_pctcpu;
- prev_pp->ki_runtime += pp->ki_runtime;
- }
+ *prefp++ = pp;
+ active_procs++;
}
/* if requested, sort the "interesting" processes */
@@ -849,7 +843,7 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags)
(args = kvm_getargv(kd, pp, cmdlengthdelta)) == NULL ||
!(*args)) {
if (ps.thread && pp->ki_flag & P_HADTHREADS &&
- pp->ki_ocomm[0]) {
+ pp->ki_ocomm[0]) {
snprintf(cmdbuf, cmdlengthdelta,
"{%s}", pp->ki_ocomm);
} else {
diff --git a/usr.bin/users/users.c b/usr.bin/users/users.c
index f83a592..c13cc37 100644
--- a/usr.bin/users/users.c
+++ b/usr.bin/users/users.c
@@ -50,7 +50,7 @@ static const char rcsid[] =
#include <unistd.h>
#include <utmpx.h>
-typedef char namebuf[MAXLOGNAME];
+typedef char namebuf[sizeof(((struct utmpx *)0)->ut_user) + 1];
int scmp(const void *, const void *);
static void usage(void);
diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c
index cda77ad..d31fdb5 100644
--- a/usr.bin/vmstat/vmstat.c
+++ b/usr.bin/vmstat/vmstat.c
@@ -43,7 +43,6 @@ static char sccsid[] = "@(#)vmstat.c 8.1 (Berkeley) 6/6/93";
__FBSDID("$FreeBSD$");
#include <sys/param.h>
-#include <sys/time.h>
#include <sys/proc.h>
#include <sys/uio.h>
#include <sys/namei.h>
diff --git a/usr.bin/w/w.c b/usr.bin/w/w.c
index 43f1926..0331287 100644
--- a/usr.bin/w/w.c
+++ b/usr.bin/w/w.c
@@ -497,7 +497,7 @@ ttystat(char *line)
char ttybuf[MAXPATHLEN];
(void)snprintf(ttybuf, sizeof(ttybuf), "%s%s", _PATH_DEV, line);
- if (stat(ttybuf, &sb) == 0) {
+ if (stat(ttybuf, &sb) == 0 && S_ISCHR(sb.st_mode)) {
return (&sb);
} else
return (NULL);
diff --git a/usr.bin/wall/wall.c b/usr.bin/wall/wall.c
index 5c44749..eea253f 100644
--- a/usr.bin/wall/wall.c
+++ b/usr.bin/wall/wall.c
@@ -239,8 +239,9 @@ makemsg(char *fname)
err(1, "can't read %s", fname);
setegid(egid);
}
+ cnt = 0;
while (fgets(lbuf, sizeof(lbuf), stdin)) {
- for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
+ for (p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
if (ch == '\r') {
putc('\r', fp);
cnt = 0;
diff --git a/usr.bin/xlint/lint1/decl.c b/usr.bin/xlint/lint1/decl.c
index 41492cf..06a412c 100644
--- a/usr.bin/xlint/lint1/decl.c
+++ b/usr.bin/xlint/lint1/decl.c
@@ -415,9 +415,6 @@ tdeferr(type_t *td, tspec_t t)
case UINT:
case INT:
break;
-
- case NTSPEC: /* this value unused */
- break;
}
/* Anything other is not accepted. */
diff --git a/usr.bin/xlint/lint1/scan.l b/usr.bin/xlint/lint1/scan.l
index 05f4ed7..65d2d11 100644
--- a/usr.bin/xlint/lint1/scan.l
+++ b/usr.bin/xlint/lint1/scan.l
@@ -580,9 +580,6 @@ icon(int base)
case CHAR:
case UNSIGN:
break;
-
- case NTSPEC: /* this value unused */
- break;
}
if (typ != QUAD && typ != UQUAD) {
diff --git a/usr.bin/xlint/lint2/msg.c b/usr.bin/xlint/lint2/msg.c
index b4a6a31..b7855ad 100644
--- a/usr.bin/xlint/lint2/msg.c
+++ b/usr.bin/xlint/lint2/msg.c
@@ -32,6 +32,7 @@
*/
#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: msg.c,v 1.6 2002/01/21 19:49:52 tv Exp $");
#endif
@@ -127,7 +128,7 @@ mkpos(pos_t *posp)
if (len > blen)
buf = xrealloc(buf, blen = len);
if (line != 0) {
- (void)sprintf(buf, "%s%s(%hu)",
+ (void)sprintf(buf, "%s%s(%d)",
fn, qm ? "?" : "", line);
} else {
(void)sprintf(buf, "%s", fn);
diff --git a/usr.bin/xlint/lint2/read.c b/usr.bin/xlint/lint2/read.c
index 6288cc1..9dfecfd 100644
--- a/usr.bin/xlint/lint2/read.c
+++ b/usr.bin/xlint/lint2/read.c
@@ -696,8 +696,6 @@ inptype(const char *cp, const char **epp)
case SIGNED:
case NOTSPEC:
break;
- case NTSPEC:
- abort();
}
*epp = cp;
@@ -901,8 +899,6 @@ gettlen(const char *cp, const char **epp)
case UQUAD:
case LONG:
break;
- case NTSPEC:
- abort();
}
*epp = cp;
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index f738321..75a06d7 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -3,7 +3,7 @@
.include <bsd.own.mk>
-SUBDIR= adduser \
+SUBDIR= adduser \
arp \
bootparamd \
burncd \
@@ -34,7 +34,6 @@ SUBDIR= adduser \
inetd \
iostat \
kldxref \
- lastlogin \
mailwrapper \
makefs \
manctl \
@@ -89,7 +88,6 @@ SUBDIR= adduser \
trpt \
tzsetup \
ugidfw \
- utxrm \
vipw \
wake \
watch \
@@ -99,7 +97,6 @@ SUBDIR= adduser \
# NB: keep these sorted by MK_* knobs
.if ${MK_ACCT} != "no"
-SUBDIR+= ac
SUBDIR+= accton
SUBDIR+= sa
.endif
@@ -123,13 +120,21 @@ SUBDIR+= authpf
SUBDIR+= dnssec-dsfromkey
SUBDIR+= dnssec-keyfromlabel
SUBDIR+= dnssec-keygen
+SUBDIR+= dnssec-revoke
+SUBDIR+= dnssec-settime
SUBDIR+= dnssec-signzone
.endif
.if ${MK_BIND_NAMED} != "no"
+SUBDIR+= arpaname
+SUBDIR+= ddns-confgen
+SUBDIR+= genrandom
+SUBDIR+= isc-hmac-fixup
SUBDIR+= named
SUBDIR+= named-checkconf
SUBDIR+= named-checkzone
+SUBDIR+= named-journalprint
SUBDIR+= named.reload
+SUBDIR+= nsec3hash
SUBDIR+= rndc
SUBDIR+= rndc-confgen
.endif
@@ -173,8 +178,8 @@ SUBDIR+= ndp
SUBDIR+= rip6query
SUBDIR+= route6d
SUBDIR+= rrenumd
-SUBDIR+= rtadvd
SUBDIR+= rtadvctl
+SUBDIR+= rtadvd
SUBDIR+= rtsold
SUBDIR+= traceroute6
.endif
@@ -300,6 +305,12 @@ SUBDIR+= usbconfig
SUBDIR+= usbdump
.endif
+.if ${MK_UTMPX} != "no"
+SUBDIR+= ac
+SUBDIR+= lastlogin
+SUBDIR+= utxrm
+.endif
+
.if ${MK_WIRELESS} != "no"
SUBDIR+= ancontrol
SUBDIR+= wlandebug
diff --git a/usr.sbin/ancontrol/ancontrol.c b/usr.sbin/ancontrol/ancontrol.c
index 008970d..4a11453 100644
--- a/usr.sbin/ancontrol/ancontrol.c
+++ b/usr.sbin/ancontrol/ancontrol.c
@@ -40,7 +40,6 @@ static const char copyright[] = "@(#) Copyright (c) 1997, 1998, 1999\
__FBSDID("$FreeBSD$");
#include <sys/types.h>
-#include <sys/cdefs.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
diff --git a/usr.sbin/arpaname/Makefile b/usr.sbin/arpaname/Makefile
new file mode 100644
index 0000000..145d18a
--- /dev/null
+++ b/usr.sbin/arpaname/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= arpaname
+
+.PATH: ${SRCDIR}
+SRCS+= arpaname.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= arpaname.1
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/bsdinstall/partedit/partedit.c b/usr.sbin/bsdinstall/partedit/partedit.c
index 0ba3203..303f695 100644
--- a/usr.sbin/bsdinstall/partedit/partedit.c
+++ b/usr.sbin/bsdinstall/partedit/partedit.c
@@ -305,7 +305,7 @@ apply_changes(struct gmesh *mesh)
fprintf(fstab, "# Device\tMountpoint\tFStype\tOptions\tDump\tPass#\n");
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->fstab != NULL)
- fprintf(fstab, "%s\t%s\t%s\t%s\t%d\t%d\n",
+ fprintf(fstab, "%s\t%s\t\t%s\t%s\t%d\t%d\n",
md->fstab->fs_spec, md->fstab->fs_file,
md->fstab->fs_vfstype, md->fstab->fs_mntops,
md->fstab->fs_freq, md->fstab->fs_passno);
diff --git a/usr.sbin/bsdinstall/partedit/partedit_powerpc.c b/usr.sbin/bsdinstall/partedit/partedit_powerpc.c
index 23bd8b6..13d2536 100644
--- a/usr.sbin/bsdinstall/partedit/partedit_powerpc.c
+++ b/usr.sbin/bsdinstall/partedit/partedit_powerpc.c
@@ -26,19 +26,42 @@
* $FreeBSD$
*/
+#include <sys/types.h>
+#include <sys/sysctl.h>
#include <string.h>
#include "partedit.h"
+static char platform[255] = "";
+
const char *
default_scheme(void) {
- return ("APM");
+ size_t platlen = sizeof(platform);
+ if (strlen(platform) == 0)
+ sysctlbyname("hw.platform", platform, &platlen, NULL, -1);
+
+ if (strcmp(platform, "powermac") == 0)
+ return ("APM");
+ if (strcmp(platform, "chrp") == 0)
+ return ("MBR");
+
+ /* Pick GPT (bootable on PS3) as a generic default */
+ return ("GPT");
}
int
is_scheme_bootable(const char *part_type) {
- if (strcmp(part_type, "APM") == 0)
+ size_t platlen = sizeof(platform);
+ if (strlen(platform) == 0)
+ sysctlbyname("hw.platform", platform, &platlen, NULL, -1);
+
+ if (strcmp(platform, "powermac") == 0 && strcmp(part_type, "APM") == 0)
+ return (1);
+ if (strcmp(platform, "ps3") == 0 && strcmp(part_type, "GPT") == 0)
return (1);
+ if (strcmp(platform, "chrp") == 0 && strcmp(part_type, "MBR") == 0)
+ return (1);
+
return (0);
}
diff --git a/usr.sbin/bsdinstall/scripts/Makefile b/usr.sbin/bsdinstall/scripts/Makefile
index e32fda6..5e450b7 100644
--- a/usr.sbin/bsdinstall/scripts/Makefile
+++ b/usr.sbin/bsdinstall/scripts/Makefile
@@ -1,8 +1,8 @@
# $FreeBSD$
-SCRIPTS= auto adduser checksum config hostname jail keymap mirrorselect \
- mount netconfig netconfig_ipv4 netconfig_ipv6 rootpass services \
- time umount wlanconfig
+SCRIPTS= auto adduser checksum config docsinstall hostname jail keymap \
+ mirrorselect mount netconfig netconfig_ipv4 netconfig_ipv6 rootpass \
+ services time umount wlanconfig
BINDIR= /usr/libexec/bsdinstall
NO_MAN= true
diff --git a/usr.sbin/bsdinstall/scripts/auto b/usr.sbin/bsdinstall/scripts/auto
index bdc5fc4..667ced4 100755
--- a/usr.sbin/bsdinstall/scripts/auto
+++ b/usr.sbin/bsdinstall/scripts/auto
@@ -127,7 +127,7 @@ if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then
# Try to use any existing distfiles
if [ -d $BSDINSTALL_DISTDIR ]; then
DISTDIR_IS_UNIONFS=1
- mount_unionfs "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
+ mount_nullfs -o union "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
fi
# Otherwise, fetch everything
@@ -166,6 +166,7 @@ finalconfig() {
"Network" "Networking configuration" \
"Services" "Set daemons to run on startup" \
"Time Zone" "Set system timezone" \
+ "Handbook" "Install FreeBSD Handbook (requires network)" \
"Shell" "Open a shell in the new system" \
"Exit" "Apply configuration and exit installer" 2>&1 1>&3)
exec 3>&-
@@ -195,6 +196,10 @@ finalconfig() {
bsdinstall time
finalconfig
;;
+ "Handbook")
+ bsdinstall docsinstall
+ finalconfig
+ ;;
"Shell")
clear
echo This shell is operating in a chroot in the new system. \
diff --git a/usr.sbin/bsdinstall/scripts/config b/usr.sbin/bsdinstall/scripts/config
index 5d7c3ce..4340450 100755
--- a/usr.sbin/bsdinstall/scripts/config
+++ b/usr.sbin/bsdinstall/scripts/config
@@ -30,3 +30,7 @@ cat $BSDINSTALL_TMPETC/rc.conf.* >> $BSDINSTALL_TMPETC/rc.conf
rm $BSDINSTALL_TMPETC/rc.conf.*
cp $BSDINSTALL_TMPETC/* $BSDINSTALL_CHROOT/etc
+
+# Set up other things from installed config
+chroot $BSDINSTALL_CHROOT /usr/bin/newaliases
+
diff --git a/usr.sbin/bsdinstall/scripts/docsinstall b/usr.sbin/bsdinstall/scripts/docsinstall
new file mode 100644
index 0000000..e037dcc
--- /dev/null
+++ b/usr.sbin/bsdinstall/scripts/docsinstall
@@ -0,0 +1,69 @@
+#!/bin/sh
+#-
+# Copyright (c) 2011 Marc Fonvieille
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+
+
+exec 3>&1
+DOCS=$(dialog --backtitle "FreeBSD Installer" \
+ --title "FreeBSD Documentation Installation" --separate-output \
+ --checklist "This menu will allow you to install the whole documentation set
+from the FreeBSD Documentation Project: Handbook, FAQ and articles.\n\n
+Please select the language versions you wish to install. At minimum,
+you should install the English version, this is the original version
+of the documentation.\n\n
+NB: This requires a working, configured network connection." 0 0 0 \
+ bn "Bengali Documentation" ${DIST_DOC_BN:-off} \
+ da "Danish Documentation" ${DIST_DOC_DA:-off} \
+ de "German Documentation" ${DIST_DOC_DE:-off} \
+ el "Greek Documentation" ${DIST_DOC_EL:-off} \
+ en "English Documentation (recommended)" ${DIST_DOC_EN:-on} \
+ es "Spanish Documentation" ${DIST_DOC_ES:-off} \
+ fr "French Documentation" ${DIST_DOC_FR:-off} \
+ hu "Hungarian Documentation" ${DIST_DOC_HU:-off} \
+ it "Italian Documentation" ${DIST_DOC_IT:-off} \
+ ja "Japanese Documentation" ${DIST_DOC_JA:-off} \
+ mn "Mongolian Documentation" ${DIST_DOC_MN:-off} \
+ nl "Dutch Documentation" ${DIST_DOC_NL:-off} \
+ pl "Polish Documentation" ${DIST_DOC_PL:-off} \
+ pt "Portuguese Documentation" ${DIST_DOC_PT:-off} \
+ ru "Russian Documentation" ${DIST_DOC_RU:-off} \
+ sr "Serbian Documentation" ${DIST_DOC_SR:-off} \
+ tr "Turkish Documentation" ${DIST_DOC_TR:-off} \
+ zh_cn "Simplified Chinese Documentation" ${DIST_DOC_ZH_CN:-off} \
+ zh_tw "Traditional Chinese Documentation" ${DIST_DOC_ZH_TW:-off} \
+2>&1 1>&3)
+test $? -eq 0 || exit 0
+exec 3>&-
+
+clear
+echo "FreeBSD Installer"
+echo "========================"
+echo
+
+for i in $DOCS; do
+ pkg_add -C ${BSDINSTALL_CHROOT} -r ${i}-freebsd-doc
+done
diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
index cb38145..99d55ee 100644
--- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
+++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
@@ -449,7 +449,8 @@ devd_socket_callback(int fd, void *arg __unused)
HRDBG("called");
- read_len = read(fd, buf, sizeof(buf) - 1);
+again:
+ read_len = read(fd, buf, sizeof(buf));
if (read_len < 0) {
if (errno == EBADF) {
devd_sock = -1;
@@ -476,16 +477,9 @@ devd_socket_callback(int fd, void *arg __unused)
syslog(LOG_ERR, "Closing devd_fd, revert to devinfo polling");
} else {
- switch (buf[0]) {
- case '+':
- case '-':
- case '?':
- case '!':
- refresh_device_tbl(1);
- return;
- default:
- syslog(LOG_ERR, "unknown message from devd socket");
- }
+ if (read_len == sizeof(buf))
+ goto again;
+ refresh_device_tbl(1);
}
}
diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c
index b1d4b5d..ceee035 100644
--- a/usr.sbin/config/main.c
+++ b/usr.sbin/config/main.c
@@ -577,7 +577,7 @@ cleanheaders(char *p)
struct dirent *dp;
struct file_list *fl;
struct hdr_list *hl;
- int i;
+ size_t len;
remember("y.tab.h");
remember("setdefs.h");
@@ -591,12 +591,13 @@ cleanheaders(char *p)
if ((dirp = opendir(p)) == NULL)
err(EX_OSERR, "opendir %s", p);
while ((dp = readdir(dirp)) != NULL) {
- i = dp->d_namlen - 2;
+ len = strlen(dp->d_name);
/* Skip non-headers */
- if (dp->d_name[i] != '.' || dp->d_name[i + 1] != 'h')
+ if (len < 2 || dp->d_name[len - 2] != '.' ||
+ dp->d_name[len - 1] != 'h')
continue;
/* Skip special stuff, eg: bus_if.h, but check opt_*.h */
- if (index(dp->d_name, '_') &&
+ if (strchr(dp->d_name, '_') &&
strncmp(dp->d_name, "opt_", 4) != 0)
continue;
/* Check if it is a target file */
diff --git a/usr.sbin/ddns-confgen/Makefile b/usr.sbin/ddns-confgen/Makefile
new file mode 100644
index 0000000..a33bea3
--- /dev/null
+++ b/usr.sbin/ddns-confgen/Makefile
@@ -0,0 +1,31 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/confgen
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= ddns-confgen
+
+.PATH: ${SRCDIR}/unix
+SRCS+= os.c
+
+.PATH: ${SRCDIR}
+SRCS+= ddns-confgen.c keygen.c util.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
+
+WARNS?= 3
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+MAN= ddns-confgen.8
+
+MANFILTER= sed -e 's@fI/etc\\fR.*@fI/etc/namedb\\fR@' \
+ -e '/^sysconfdir$$/d' \
+ -e '/was specified as when BIND was built)/d'
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dnssec-revoke/Makefile b/usr.sbin/dnssec-revoke/Makefile
new file mode 100644
index 0000000..7889d96
--- /dev/null
+++ b/usr.sbin/dnssec-revoke/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/dnssec
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= dnssec-revoke
+
+.PATH: ${SRCDIR}
+SRCS+= dnssec-revoke.c dnssectool.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= dnssec-revoke.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dnssec-settime/Makefile b/usr.sbin/dnssec-settime/Makefile
new file mode 100644
index 0000000..4ab7fb5
--- /dev/null
+++ b/usr.sbin/dnssec-settime/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/dnssec
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= dnssec-settime
+
+.PATH: ${SRCDIR}
+SRCS+= dnssec-settime.c dnssectool.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= dnssec-settime.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dnssec-signzone/Makefile b/usr.sbin/dnssec-signzone/Makefile
index 70ddc3e..7f56b8d 100644
--- a/usr.sbin/dnssec-signzone/Makefile
+++ b/usr.sbin/dnssec-signzone/Makefile
@@ -17,7 +17,7 @@ CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
-WARNS?= 3
+WARNS?= 2
MAN= dnssec-signzone.8
diff --git a/usr.sbin/fdread/fdread.c b/usr.sbin/fdread/fdread.c
index 1aae665..ba9c758 100644
--- a/usr.sbin/fdread/fdread.c
+++ b/usr.sbin/fdread/fdread.c
@@ -149,7 +149,7 @@ main(int argc, char **argv)
err(EX_OSERR, "cannot create output file %s", fname);
}
- if ((fd = open(_devname, O_RDWR)) == -1)
+ if ((fd = open(_devname, O_RDONLY)) == -1)
err(EX_OSERR, "cannot open device %s", _devname);
return (numids? doreadid(fd, numids, trackno): doread(fd, of, _devname));
diff --git a/usr.sbin/flowctl/Makefile b/usr.sbin/flowctl/Makefile
index d47993b..a2dd377 100644
--- a/usr.sbin/flowctl/Makefile
+++ b/usr.sbin/flowctl/Makefile
@@ -2,6 +2,8 @@
# $FreeBSD$
#
+.include <bsd.own.mk>
+
PROG= flowctl
MAN= flowctl.8
@@ -9,4 +11,11 @@ WARNS?= 2
DPADD= ${LIBNETGRAPH}
LDADD= -lnetgraph
+.if ${MK_INET6_SUPPORT} != "no"
+CFLAGS+= -DINET6
+.endif
+.if ${MK_INET_SUPPORT} != "no"
+CFLAGS+= -DINET
+.endif
+
.include <bsd.prog.mk>
diff --git a/usr.sbin/flowctl/flowctl.8 b/usr.sbin/flowctl/flowctl.8
index cf1396b..5abeddb 100644
--- a/usr.sbin/flowctl/flowctl.8
+++ b/usr.sbin/flowctl/flowctl.8
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd March 23, 2005
+.Dd July 5, 2011
.Dt FLOWCTL 8
.Os
.Sh NAME
@@ -35,7 +35,7 @@ control utility
.Sh SYNOPSIS
.Nm
.Op Fl d Ar level
-.Ar node command
+.Ar path command
.Sh DESCRIPTION
The
.Nm
@@ -55,11 +55,16 @@ Currently,
.Nm
supports only one command.
.Bl -tag -width ".Cm show"
-.It Cm show
+.It Cm show Op Cm ipv4|ipv6
This command is the analog of the
.Dq "show ip cache flow"
command of a Cisco router.
It dumps the contents of the flow cache in Cisco-like format.
+Specifing either
+.Cm ipv4
+or
+.Cm ipv6
+would extract only IPv4 or IPv6 flows respectively.
It has optional parameter
.Cm verbose ,
which is analog of the
diff --git a/usr.sbin/flowctl/flowctl.c b/usr.sbin/flowctl/flowctl.c
index 16f960a..4bf86f0 100644
--- a/usr.sbin/flowctl/flowctl.c
+++ b/usr.sbin/flowctl/flowctl.c
@@ -46,6 +46,7 @@ static const char rcs_id[] =
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sysexits.h>
#include <unistd.h>
#include <netgraph.h>
@@ -54,21 +55,38 @@ static const char rcs_id[] =
#define CISCO_SH_FLOW_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts\n"
#define CISCO_SH_FLOW "%-13s %-15s %-13s %-15s %2u %4.4x %4.4x %6lu\n"
+#define CISCO_SH_FLOW6_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts\n"
+#define CISCO_SH_FLOW6 "%-13s %-30s %-13s %-30s %2u %4.4x %4.4x %6lu\n"
+
#define CISCO_SH_VERB_FLOW_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr TOS Flgs Pkts\n" \
"Port Msk AS Port Msk AS NextHop B/Pk Active\n"
#define CISCO_SH_VERB_FLOW "%-14s %-15s %-14s %-15s %2u %3x %4x %6lu\n" \
"%4.4x /%-2u %-5u %4.4x /%-2u %-5u %-15s %9u %8u\n\n"
-static int flow_cache_print(struct ngnf_flows *recs);
-static int flow_cache_print_verbose(struct ngnf_flows *recs);
-static int ctl_show(int, char **);
+#define CISCO_SH_VERB_FLOW6_HEADER "SrcIf SrcIPaddress DstIf DstIPaddress Pr TOS Flgs Pkts\n" \
+"Port Msk AS Port Msk AS NextHop B/Pk Active\n"
+
+#define CISCO_SH_VERB_FLOW6 "%-14s %-30s %-14s %-30s %2u %3x %4x %6lu\n" \
+ "%4.4x /%-2u %-5u %4.4x /%-2u %-5u %-30s %9u %8u\n\n"
+#ifdef INET
+static void flow_cache_print(struct ngnf_show_header *resp);
+static void flow_cache_print_verbose(struct ngnf_show_header *resp);
+#endif
+#ifdef INET6
+static void flow_cache_print6(struct ngnf_show_header *resp);
+static void flow_cache_print6_verbose(struct ngnf_show_header *resp);
+#endif
+static void ctl_show(int, char **);
+#if defined(INET) || defined(INET6)
+static void do_show(int, void (*func)(struct ngnf_show_header *));
+#endif
static void help(void);
static void execute_command(int, char **);
struct ip_ctl_cmd {
char *cmd_name;
- int (*cmd_func)(int argc, char **argv);
+ void (*cmd_func)(int argc, char **argv);
};
struct ip_ctl_cmd cmds[] = {
@@ -77,7 +95,7 @@ struct ip_ctl_cmd cmds[] = {
};
int cs;
-char ng_nodename[NG_PATHSIZ];
+char *ng_path;
int
main(int argc, char **argv)
@@ -85,7 +103,6 @@ main(int argc, char **argv)
int c;
char sname[NG_NODESIZ];
int rcvbuf = SORCVBUF_SIZE;
- char *ng_name;
/* parse options */
while ((c = getopt(argc, argv, "d:")) != -1) {
@@ -98,14 +115,12 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
- ng_name = argv[0];
- if (ng_name == NULL)
+ ng_path = argv[0];
+ if (ng_path == NULL || (strlen(ng_path) > NG_PATHSIZ))
help();
argc--;
argv++;
- snprintf(ng_nodename, sizeof(ng_nodename), "%s:", ng_name);
-
/* create control socket. */
snprintf(sname, sizeof(sname), "flowctl%i", getpid());
@@ -145,74 +160,109 @@ execute_command(int argc, char **argv)
(*cmds[cindex].cmd_func)(argc, argv);
}
-static int
+static void
ctl_show(int argc, char **argv)
{
- struct ng_mesg *ng_mesg;
- struct ngnf_flows *data;
- char path[NG_PATHSIZ];
- int token, nread, last = 0;
- int verbose = 0;
+ int ipv4, ipv6, verbose = 0;
+
+ ipv4 = feature_present("inet");
+ ipv6 = feature_present("inet6");
+
+ if (argc > 0 && !strncmp(argv[0], "ipv4", 4)) {
+ ipv6 = 0;
+ argc--;
+ argv++;
+ }
+ if (argc > 0 && !strncmp(argv[0], "ipv6", 4)) {
+ ipv4 = 0;
+ argc--;
+ argv++;
+ }
if (argc > 0 && !strncmp(argv[0], "verbose", strlen(argv[0])))
verbose = 1;
+#ifdef INET
+ if (ipv4) {
+ if (verbose)
+ do_show(4, &flow_cache_print_verbose);
+ else
+ do_show(4, &flow_cache_print);
+ }
+#endif
+
+#ifdef INET6
+ if (ipv6) {
+ if (verbose)
+ do_show(6, &flow_cache_print6_verbose);
+ else
+ do_show(6, &flow_cache_print6);
+ }
+#endif
+}
+
+#if defined(INET) || defined(INET6)
+static void
+do_show(int version, void (*func)(struct ngnf_show_header *))
+{
+ struct ng_mesg *ng_mesg;
+ struct ngnf_show_header req, *resp;
+ int token, nread;
+
ng_mesg = alloca(SORCVBUF_SIZE);
- if (verbose)
- printf(CISCO_SH_VERB_FLOW_HEADER);
- else
- printf(CISCO_SH_FLOW_HEADER);
+ req.version = version;
+ req.hash_id = req.list_id = 0;
for (;;) {
/* request set of accounting records */
- token = NgSendMsg(cs, ng_nodename, NGM_NETFLOW_COOKIE,
- NGM_NETFLOW_SHOW, (void *)&last, sizeof(last));
+ token = NgSendMsg(cs, ng_path, NGM_NETFLOW_COOKIE,
+ NGM_NETFLOW_SHOW, (void *)&req, sizeof(req));
if (token == -1)
err(1, "NgSendMsg(NGM_NETFLOW_SHOW)");
/* read reply */
- nread = NgRecvMsg(cs, ng_mesg, SORCVBUF_SIZE, path);
+ nread = NgRecvMsg(cs, ng_mesg, SORCVBUF_SIZE, NULL);
if (nread == -1)
err(1, "NgRecvMsg() failed");
if (ng_mesg->header.token != token)
err(1, "NgRecvMsg(NGM_NETFLOW_SHOW): token mismatch");
- data = (struct ngnf_flows*)ng_mesg->data;
- if ((ng_mesg->header.arglen < (sizeof(*data))) ||
- (ng_mesg->header.arglen < (sizeof(*data) +
- (data->nentries * sizeof(struct flow_entry_data)))))
+ resp = (struct ngnf_show_header *)ng_mesg->data;
+ if ((ng_mesg->header.arglen < (sizeof(*resp))) ||
+ (ng_mesg->header.arglen < (sizeof(*resp) +
+ (resp->nentries * sizeof(struct flow_entry_data)))))
err(1, "NgRecvMsg(NGM_NETFLOW_SHOW): arglen too small");
- if (verbose)
- (void )flow_cache_print_verbose(data);
- else
- (void )flow_cache_print(data);
+ (*func)(resp);
- if (data->last != 0)
- last = data->last;
+ if (resp->hash_id != 0)
+ req.hash_id = resp->hash_id;
else
break;
+ req.list_id = resp->list_id;
}
-
- return (0);
}
+#endif
-static int
-flow_cache_print(struct ngnf_flows *recs)
+#ifdef INET
+static void
+flow_cache_print(struct ngnf_show_header *resp)
{
struct flow_entry_data *fle;
char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN];
char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
int i;
- /* quick check */
- if (recs->nentries == 0)
- return (0);
+ if (resp->version != 4)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
+
+ printf(CISCO_SH_FLOW_HEADER);
- fle = recs->entries;
- for (i = 0; i < recs->nentries; i++, fle++) {
+ fle = (struct flow_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle++) {
inet_ntop(AF_INET, &fle->r.r_src, src, sizeof(src));
inet_ntop(AF_INET, &fle->r.r_dst, dst, sizeof(dst));
printf(CISCO_SH_FLOW,
@@ -226,24 +276,59 @@ flow_cache_print(struct ngnf_flows *recs)
fle->packets);
}
-
- return (i);
}
+#endif
-static int
-flow_cache_print_verbose(struct ngnf_flows *recs)
+#ifdef INET6
+static void
+flow_cache_print6(struct ngnf_show_header *resp)
+{
+ struct flow6_entry_data *fle6;
+ char src6[INET6_ADDRSTRLEN], dst6[INET6_ADDRSTRLEN];
+ char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
+ int i;
+
+ if (resp->version != 6)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
+
+ printf(CISCO_SH_FLOW6_HEADER);
+
+ fle6 = (struct flow6_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle6++) {
+ inet_ntop(AF_INET6, &fle6->r.src.r_src6, src6, sizeof(src6));
+ inet_ntop(AF_INET6, &fle6->r.dst.r_dst6, dst6, sizeof(dst6));
+ printf(CISCO_SH_FLOW6,
+ if_indextoname(fle6->fle_i_ifx, src_if),
+ src6,
+ if_indextoname(fle6->fle_o_ifx, dst_if),
+ dst6,
+ fle6->r.r_ip_p,
+ ntohs(fle6->r.r_sport),
+ ntohs(fle6->r.r_dport),
+ fle6->packets);
+
+ }
+}
+#endif
+
+#ifdef INET
+static void
+flow_cache_print_verbose(struct ngnf_show_header *resp)
{
struct flow_entry_data *fle;
char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN], next[INET_ADDRSTRLEN];
char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
int i;
- /* quick check */
- if (recs->nentries == 0)
- return (0);
+ if (resp->version != 4)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
- fle = recs->entries;
- for (i = 0; i < recs->nentries; i++, fle++) {
+ printf(CISCO_SH_VERB_FLOW_HEADER);
+
+ fle = (struct flow_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle++) {
inet_ntop(AF_INET, &fle->r.r_src, src, sizeof(src));
inet_ntop(AF_INET, &fle->r.r_dst, dst, sizeof(dst));
inet_ntop(AF_INET, &fle->next_hop, next, sizeof(next));
@@ -267,9 +352,50 @@ flow_cache_print_verbose(struct ngnf_flows *recs)
0);
}
-
- return (i);
}
+#endif
+
+#ifdef INET6
+static void
+flow_cache_print6_verbose(struct ngnf_show_header *resp)
+{
+ struct flow6_entry_data *fle6;
+ char src6[INET6_ADDRSTRLEN], dst6[INET6_ADDRSTRLEN], next6[INET6_ADDRSTRLEN];
+ char src_if[IFNAMSIZ], dst_if[IFNAMSIZ];
+ int i;
+
+ if (resp->version != 6)
+ errx(EX_SOFTWARE, "%s: version mismatch: %u",
+ __func__, resp->version);
+
+ printf(CISCO_SH_VERB_FLOW6_HEADER);
+
+ fle6 = (struct flow6_entry_data *)(resp + 1);
+ for (i = 0; i < resp->nentries; i++, fle6++) {
+ inet_ntop(AF_INET6, &fle6->r.src.r_src6, src6, sizeof(src6));
+ inet_ntop(AF_INET6, &fle6->r.dst.r_dst6, dst6, sizeof(dst6));
+ inet_ntop(AF_INET6, &fle6->n.next_hop6, next6, sizeof(next6));
+ printf(CISCO_SH_VERB_FLOW6,
+ if_indextoname(fle6->fle_i_ifx, src_if),
+ src6,
+ if_indextoname(fle6->fle_o_ifx, dst_if),
+ dst6,
+ fle6->r.r_ip_p,
+ fle6->r.r_tos,
+ fle6->tcp_flags,
+ fle6->packets,
+ ntohs(fle6->r.r_sport),
+ fle6->src_mask,
+ 0,
+ ntohs(fle6->r.r_dport),
+ fle6->dst_mask,
+ 0,
+ next6,
+ (u_int)(fle6->bytes / fle6->packets),
+ 0);
+ }
+}
+#endif
static void
help(void)
diff --git a/usr.sbin/ftp-proxy/ftp-proxy/Makefile b/usr.sbin/ftp-proxy/ftp-proxy/Makefile
index 773c25d..c21a107 100644
--- a/usr.sbin/ftp-proxy/ftp-proxy/Makefile
+++ b/usr.sbin/ftp-proxy/ftp-proxy/Makefile
@@ -5,14 +5,14 @@
PROG= ftp-proxy
MAN= ftp-proxy.8
-SRCS= ftp-proxy.c filter.c
+SRCS= ftp-proxy.c filter.c
CFLAGS+= -I${.CURDIR}/../../../contrib/pf/libevent
CFLAGS+= -I${.CURDIR}/../../../sys/contrib/pf
-DPADD= ${LIBEVENT}
-LDADD= ${LIBEVENT}
+LDADD+= ${LIBEVENT}
+DPADD+= ${LIBEVENT}
-WARNS?= 2
+WARNS?= 3
.include <bsd.prog.mk>
diff --git a/usr.sbin/genrandom/Makefile b/usr.sbin/genrandom/Makefile
new file mode 100644
index 0000000..975d84b
--- /dev/null
+++ b/usr.sbin/genrandom/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= genrandom
+
+.PATH: ${SRCDIR}
+SRCS+= genrandom.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= genrandom.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/ifmcstat/ifmcstat.c b/usr.sbin/ifmcstat/ifmcstat.c
index e45e36d..5ee4328 100644
--- a/usr.sbin/ifmcstat/ifmcstat.c
+++ b/usr.sbin/ifmcstat/ifmcstat.c
@@ -72,7 +72,6 @@ __FBSDID("$FreeBSD$");
#include <stddef.h>
#include <stdarg.h>
-#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/usr.sbin/isc-hmac-fixup/Makefile b/usr.sbin/isc-hmac-fixup/Makefile
new file mode 100644
index 0000000..1313855
--- /dev/null
+++ b/usr.sbin/isc-hmac-fixup/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= isc-hmac-fixup
+
+.PATH: ${SRCDIR}
+SRCS+= isc-hmac-fixup.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= isc-hmac-fixup.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/jls/jls.c b/usr.sbin/jls/jls.c
index 14aa6af..6568a1d 100644
--- a/usr.sbin/jls/jls.c
+++ b/usr.sbin/jls/jls.c
@@ -404,7 +404,7 @@ print_jail(int pflags, int jflags)
(!ip4_ok || params[1].jp_valuelen == 0) ? "-"
: inet_ntoa(*(struct in_addr *)params[1].jp_value),
#else
- "-"
+ "-",
#endif
(char *)params[2-!ip4_ok].jp_value,
(char *)params[3-!ip4_ok].jp_value);
diff --git a/usr.sbin/makefs/Makefile b/usr.sbin/makefs/Makefile
index 37eeb38..6fa0679 100644
--- a/usr.sbin/makefs/Makefile
+++ b/usr.sbin/makefs/Makefile
@@ -7,6 +7,7 @@ CFLAGS+=-I${.CURDIR}
SRCS= cd9660.c ffs.c \
getid.c \
makefs.c \
+ mtree.c \
walk.c
MAN= makefs.8
@@ -26,4 +27,7 @@ SRCS+= misc.c spec.c
.PATH: ${.CURDIR}/../../sys/ufs/ffs
SRCS+= ffs_tables.c
+DPADD= ${LIBSBUF}
+LDADD= -lsbuf
+
.include <bsd.prog.mk>
diff --git a/usr.sbin/makefs/cd9660/cd9660_write.c b/usr.sbin/makefs/cd9660/cd9660_write.c
index 46d4a34..4622701 100644
--- a/usr.sbin/makefs/cd9660/cd9660_write.c
+++ b/usr.sbin/makefs/cd9660/cd9660_write.c
@@ -294,10 +294,12 @@ cd9660_write_file(FILE *fd, cd9660node *writenode)
INODE_WARNX(("%s: writing inode %d blocks at %" PRIu32,
__func__, (int)inode->st.st_ino, inode->ino));
inode->flags |= FI_WRITTEN;
- cd9660_compute_full_filename(writenode,
- temp_file_name, 0);
+ if (writenode->node->contents == NULL)
+ cd9660_compute_full_filename(writenode,
+ temp_file_name, 0);
ret = cd9660_copy_file(fd, writenode->fileDataSector,
- temp_file_name);
+ (writenode->node->contents != NULL) ?
+ writenode->node->contents : temp_file_name);
if (ret == 0)
goto out;
}
diff --git a/usr.sbin/makefs/ffs.c b/usr.sbin/makefs/ffs.c
index a3c9d68..f833cf5 100644
--- a/usr.sbin/makefs/ffs.c
+++ b/usr.sbin/makefs/ffs.c
@@ -776,9 +776,11 @@ ffs_populate_dir(const char *dir, fsnode *root, fsinfo_t *fsopts)
continue; /* skip hard-linked entries */
cur->inode->flags |= FI_WRITTEN;
- if (snprintf(path, sizeof(path), "%s/%s", dir, cur->name)
- >= sizeof(path))
- errx(1, "Pathname too long.");
+ if (cur->contents == NULL) {
+ if (snprintf(path, sizeof(path), "%s/%s", dir,
+ cur->name) >= sizeof(path))
+ errx(1, "Pathname too long.");
+ }
if (cur->child != NULL)
continue; /* child creates own inode */
@@ -802,7 +804,8 @@ ffs_populate_dir(const char *dir, fsnode *root, fsinfo_t *fsopts)
if (membuf != NULL) {
ffs_write_file(&din, cur->inode->ino, membuf, fsopts);
} else if (S_ISREG(cur->type)) {
- ffs_write_file(&din, cur->inode->ino, path, fsopts);
+ ffs_write_file(&din, cur->inode->ino,
+ (cur->contents) ? cur->contents : path, fsopts);
} else {
assert (! S_ISDIR(cur->type));
ffs_write_inode(&din, cur->inode->ino, fsopts);
diff --git a/usr.sbin/makefs/ffs/ffs_bswap.c b/usr.sbin/makefs/ffs/ffs_bswap.c
index 18ace03..a1a1c46 100644
--- a/usr.sbin/makefs/ffs/ffs_bswap.c
+++ b/usr.sbin/makefs/ffs/ffs_bswap.c
@@ -41,14 +41,6 @@ __FBSDID("$FreeBSD$");
#include <ufs/ufs/dinode.h>
#include "ffs/ufs_bswap.h"
#include <ufs/ffs/fs.h>
-/* XXX temporary */
-struct ufsmount;
-struct bufobj;
-struct mount;
-struct vnode;
-typedef int vfs_vget_t(struct mount *mp, ino_t ino, int flags,
- struct vnode **vpp);
-#include <ufs/ffs/ffs_extern.h>
#if !defined(_KERNEL)
#include <stddef.h>
diff --git a/usr.sbin/makefs/ffs/ffs_subr.c b/usr.sbin/makefs/ffs/ffs_subr.c
index 5f9b6f2..b857a58 100644
--- a/usr.sbin/makefs/ffs/ffs_subr.c
+++ b/usr.sbin/makefs/ffs/ffs_subr.c
@@ -38,15 +38,8 @@ __FBSDID("$FreeBSD$");
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
-/* XXX temporary */
-struct ufsmount;
-struct bufobj;
-struct mount;
-struct vnode;
-typedef int vfs_vget_t(struct mount *mp, ino_t ino, int flags,
- struct vnode **vpp);
-#include <ufs/ffs/ffs_extern.h>
#include "ffs/ufs_bswap.h"
+
void panic __P((const char *, ...))
__attribute__((__noreturn__,__format__(__printf__,1,2)));
diff --git a/usr.sbin/makefs/makefs.8 b/usr.sbin/makefs/makefs.8
index b9fb10e..9fe5c01 100644
--- a/usr.sbin/makefs/makefs.8
+++ b/usr.sbin/makefs/makefs.8
@@ -40,7 +40,7 @@
.Os
.Sh NAME
.Nm makefs
-.Nd create a file system image from a directory tree
+.Nd create a file system image from a directory tree or a mtree manifest
.Sh SYNOPSIS
.Nm
.Op Fl x
@@ -57,14 +57,16 @@
.Op Fl s Ar image-size
.Op Fl t Ar fs-type
.Ar image-file
-.Ar directory
+.Ar directory | manifest
.Sh DESCRIPTION
The utility
.Nm
creates a file system image into
.Ar image-file
from the directory tree
-.Ar directory .
+.Ar directory
+or from the mtree manifest
+.Ar manifest .
No special devices or privileges are required to perform this task.
.Pp
The options are as follows:
@@ -106,6 +108,8 @@ as an
.Xr mtree 8
.Sq specfile
specification.
+This option has no effect when the image is created from a mtree manifest
+rather than a directory.
.Pp
If a specfile entry exists in the underlying file system, its
permissions and modification time will be used unless specifically
@@ -330,6 +334,7 @@ Use RockRidge extensions (for longer filenames, etc.).
Volume set identifier of the image.
.El
.Sh SEE ALSO
+.Xr mtree 5 ,
.Xr mtree 8 ,
.Xr newfs 8
.Sh HISTORY
diff --git a/usr.sbin/makefs/makefs.c b/usr.sbin/makefs/makefs.c
index 60b6916..a186014 100644
--- a/usr.sbin/makefs/makefs.c
+++ b/usr.sbin/makefs/makefs.c
@@ -38,6 +38,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/stat.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
@@ -80,11 +82,13 @@ int main(int, char *[]);
int
main(int argc, char *argv[])
{
+ struct stat sb;
struct timeval start;
fstype_t *fstype;
fsinfo_t fsoptions;
fsnode *root;
int ch, len;
+ char *subtree;
char *specfile;
setprogname(argv[0]);
@@ -244,26 +248,47 @@ main(int argc, char *argv[])
if (fsoptions.onlyspec != 0 && specfile == NULL)
errx(1, "-x requires -F mtree-specfile.");
- /* walk the tree */
- TIMER_START(start);
- root = walk_dir(argv[1], NULL);
- TIMER_RESULTS(start, "walk_dir");
+ /* Accept '-' as meaning "read from standard input". */
+ if (strcmp(argv[1], "-") == 0)
+ sb.st_mode = S_IFREG;
+ else {
+ if (stat(argv[1], &sb) == -1)
+ err(1, "Can't stat `%s'", argv[1]);
+ }
+
+ switch (sb.st_mode & S_IFMT) {
+ case S_IFDIR: /* walk the tree */
+ subtree = argv[1];
+ TIMER_START(start);
+ root = walk_dir(subtree, NULL);
+ TIMER_RESULTS(start, "walk_dir");
+ break;
+ case S_IFREG: /* read the manifest file */
+ subtree = ".";
+ TIMER_START(start);
+ root = read_mtree(argv[1], NULL);
+ TIMER_RESULTS(start, "manifest");
+ break;
+ default:
+ errx(1, "%s: not a file or directory", argv[1]);
+ /* NOTREACHED */
+ }
if (specfile) { /* apply a specfile */
TIMER_START(start);
- apply_specfile(specfile, argv[1], root, fsoptions.onlyspec);
+ apply_specfile(specfile, subtree, root, fsoptions.onlyspec);
TIMER_RESULTS(start, "apply_specfile");
}
if (debug & DEBUG_DUMP_FSNODES) {
- printf("\nparent: %s\n", argv[1]);
+ printf("\nparent: %s\n", subtree);
dump_fsnodes(".", root);
putchar('\n');
}
/* build the file system */
TIMER_START(start);
- fstype->make_fs(argv[0], argv[1], root, &fsoptions);
+ fstype->make_fs(argv[0], subtree, root, &fsoptions);
TIMER_RESULTS(start, "make_fs");
free_fsnodes(root);
@@ -311,7 +336,7 @@ usage(void)
"usage: %s [-t fs-type] [-o fs-options] [-d debug-mask] [-B endian]\n"
"\t[-S sector-size] [-M minimum-size] [-m maximum-size] [-s image-size]\n"
"\t[-b free-blocks] [-f free-files] [-F mtree-specfile] [-x]\n"
-"\t[-N userdb-dir] image-file directory\n",
+"\t[-N userdb-dir] image-file directory | manifest\n",
prog);
exit(1);
}
diff --git a/usr.sbin/makefs/makefs.h b/usr.sbin/makefs/makefs.h
index 997c4db..6556ec0 100644
--- a/usr.sbin/makefs/makefs.h
+++ b/usr.sbin/makefs/makefs.h
@@ -93,11 +93,13 @@ typedef struct _fsnode {
uint32_t type; /* type of entry */
fsinode *inode; /* actual inode data */
char *symlink; /* symlink target */
+ char *contents; /* file to provide contents */
char *name; /* file name */
int flags; /* misc flags */
} fsnode;
#define FSNODE_F_HASSPEC 0x01 /* fsnode has a spec entry */
+#define FSNODE_F_OPTIONAL 0x02 /* fsnode is optional */
/*
* fsinfo_t - contains various settings and parameters pertaining to
@@ -147,6 +149,7 @@ typedef struct {
void apply_specfile(const char *, const char *, fsnode *, int);
void dump_fsnodes(const char *, fsnode *);
const char * inode_type(mode_t);
+fsnode * read_mtree(const char *, fsnode *);
int set_option(option_t *, const char *, const char *);
fsnode * walk_dir(const char *, fsnode *);
void free_fsnodes(fsnode *);
diff --git a/usr.sbin/makefs/mtree.c b/usr.sbin/makefs/mtree.c
new file mode 100644
index 0000000..5d88ad6
--- /dev/null
+++ b/usr.sbin/makefs/mtree.c
@@ -0,0 +1,1051 @@
+/*-
+ * Copyright (c) 2011 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/sbuf.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <inttypes.h>
+#include <pwd.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+
+#include "makefs.h"
+
+#define IS_DOT(nm) ((nm)[0] == '.' && (nm)[1] == '\0')
+#define IS_DOTDOT(nm) ((nm)[0] == '.' && (nm)[1] == '.' && (nm)[2] == '\0')
+
+struct mtree_fileinfo {
+ SLIST_ENTRY(mtree_fileinfo) next;
+ FILE *fp;
+ const char *name;
+ u_int line;
+};
+
+/* Global state used while parsing. */
+static SLIST_HEAD(, mtree_fileinfo) mtree_fileinfo =
+ SLIST_HEAD_INITIALIZER(mtree_fileinfo);
+static fsnode *mtree_root;
+static fsnode *mtree_current;
+static fsnode mtree_global;
+static fsinode mtree_global_inode;
+static u_int errors, warnings;
+
+static void mtree_error(const char *, ...) __printflike(1, 2);
+static void mtree_warning(const char *, ...) __printflike(1, 2);
+
+static int
+mtree_file_push(const char *name, FILE *fp)
+{
+ struct mtree_fileinfo *fi;
+
+ fi = malloc(sizeof(*fi));
+ if (fi == NULL)
+ return (ENOMEM);
+
+ if (strcmp(name, "-") == 0)
+ fi->name = strdup("(stdin)");
+ else
+ fi->name = strdup(name);
+ if (fi->name == NULL) {
+ free(fi);
+ return (ENOMEM);
+ }
+
+ fi->fp = fp;
+ fi->line = 0;
+
+ SLIST_INSERT_HEAD(&mtree_fileinfo, fi, next);
+ return (0);
+}
+
+static void
+mtree_print(const char *msgtype, const char *fmt, va_list ap)
+{
+ struct mtree_fileinfo *fi;
+
+ if (msgtype != NULL) {
+ fi = SLIST_FIRST(&mtree_fileinfo);
+ if (fi != NULL)
+ fprintf(stderr, "%s:%u: ", fi->name, fi->line);
+ fprintf(stderr, "%s: ", msgtype);
+ }
+ vfprintf(stderr, fmt, ap);
+}
+
+static void
+mtree_error(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ mtree_print("error", fmt, ap);
+ va_end(ap);
+
+ errors++;
+ fputc('\n', stderr);
+}
+
+static void
+mtree_warning(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ mtree_print("warning", fmt, ap);
+ va_end(ap);
+
+ warnings++;
+ fputc('\n', stderr);
+}
+
+/* mtree_resolve() sets errno to indicate why NULL was returned. */
+static char *
+mtree_resolve(const char *spec, int *istemp)
+{
+ struct sbuf *sb;
+ char *res, *var;
+ const char *base, *p, *v;
+ size_t len;
+ int c, error, quoted, subst;
+
+ len = strlen(spec);
+ if (len == 0) {
+ errno = EINVAL;
+ return (NULL);
+ }
+
+ c = (len > 1) ? (spec[0] == spec[len - 1]) ? spec[0] : 0 : 0;
+ *istemp = (c == '`') ? 1 : 0;
+ subst = (c == '`' || c == '"') ? 1 : 0;
+ quoted = (subst || c == '\'') ? 1 : 0;
+
+ if (!subst) {
+ res = strdup(spec + quoted);
+ if (res != NULL && quoted)
+ res[len - 2] = '\0';
+ return (res);
+ }
+
+ sb = sbuf_new_auto();
+ if (sb == NULL) {
+ errno = ENOMEM;
+ return (NULL);
+ }
+
+ base = spec + 1;
+ len -= 2;
+ error = 0;
+ while (len > 0) {
+ p = strchr(base, '$');
+ if (p == NULL) {
+ sbuf_bcat(sb, base, len);
+ base += len;
+ len = 0;
+ continue;
+ }
+ /* The following is safe. spec always starts with a quote. */
+ if (p[-1] == '\\')
+ p--;
+ if (base != p) {
+ sbuf_bcat(sb, base, p - base);
+ len -= p - base;
+ base = p;
+ }
+ if (*p == '\\') {
+ sbuf_putc(sb, '$');
+ base += 2;
+ len -= 2;
+ continue;
+ }
+ /* Skip the '$'. */
+ base++;
+ len--;
+ /* Handle ${X} vs $X. */
+ v = base;
+ if (*base == '{') {
+ p = strchr(v, '}');
+ if (p == NULL)
+ p = v;
+ } else
+ p = v;
+ len -= (p + 1) - base;
+ base = p + 1;
+
+ if (v == p) {
+ sbuf_putc(sb, *v);
+ continue;
+ }
+
+ error = ENOMEM;
+ var = calloc(p - v, 1);
+ if (var == NULL)
+ break;
+
+ memcpy(var, v + 1, p - v - 1);
+ if (strcmp(var, ".CURDIR") == 0) {
+ res = getcwd(NULL, 0);
+ if (res == NULL)
+ break;
+ } else if (strcmp(var, ".PROG") == 0) {
+ res = strdup(getprogname());
+ if (res == NULL)
+ break;
+ } else {
+ v = getenv(var);
+ if (v != NULL) {
+ res = strdup(v);
+ if (res == NULL)
+ break;
+ } else
+ res = NULL;
+ }
+ error = 0;
+
+ if (res != NULL) {
+ sbuf_cat(sb, res);
+ free(res);
+ }
+ free(var);
+ }
+
+ sbuf_finish(sb);
+ res = (error == 0) ? strdup(sbuf_data(sb)) : NULL;
+ sbuf_delete(sb);
+ if (res == NULL)
+ errno = ENOMEM;
+ return (res);
+}
+
+static int
+skip_over(FILE *fp, const char *cs)
+{
+ int c;
+
+ c = getc(fp);
+ while (c != EOF && strchr(cs, c) != NULL)
+ c = getc(fp);
+ if (c != EOF) {
+ ungetc(c, fp);
+ return (0);
+ }
+ return (ferror(fp) ? errno : -1);
+}
+
+static int
+skip_to(FILE *fp, const char *cs)
+{
+ int c;
+
+ c = getc(fp);
+ while (c != EOF && strchr(cs, c) == NULL)
+ c = getc(fp);
+ if (c != EOF) {
+ ungetc(c, fp);
+ return (0);
+ }
+ return (ferror(fp) ? errno : -1);
+}
+
+static int
+read_word(FILE *fp, char *buf, size_t bufsz)
+{
+ struct mtree_fileinfo *fi;
+ size_t idx, qidx;
+ int c, done, error, esc, qlvl;
+
+ if (bufsz == 0)
+ return (EINVAL);
+
+ done = 0;
+ esc = 0;
+ idx = 0;
+ qidx = -1;
+ qlvl = 0;
+ do {
+ c = getc(fp);
+ switch (c) {
+ case EOF:
+ buf[idx] = '\0';
+ error = ferror(fp) ? errno : -1;
+ if (error == -1)
+ mtree_error("unexpected end of file");
+ return (error);
+ case '\\':
+ esc++;
+ if (esc == 1)
+ continue;
+ break;
+ case '`':
+ case '\'':
+ case '"':
+ if (esc)
+ break;
+ if (qlvl == 0) {
+ qlvl++;
+ qidx = idx;
+ } else if (c == buf[qidx]) {
+ qlvl--;
+ if (qlvl > 0) {
+ do {
+ qidx--;
+ } while (buf[qidx] != '`' &&
+ buf[qidx] != '\'' &&
+ buf[qidx] != '"');
+ } else
+ qidx = -1;
+ } else {
+ qlvl++;
+ qidx = idx;
+ }
+ break;
+ case ' ':
+ case '\t':
+ case '\n':
+ if (!esc && qlvl == 0) {
+ ungetc(c, fp);
+ c = '\0';
+ done = 1;
+ break;
+ }
+ if (c == '\n') {
+ /*
+ * We going to eat the newline ourselves.
+ */
+ if (qlvl > 0)
+ mtree_warning("quoted word straddles "
+ "onto next line.");
+ fi = SLIST_FIRST(&mtree_fileinfo);
+ fi->line++;
+ }
+ break;
+ case 'a':
+ if (esc)
+ c = '\a';
+ break;
+ case 'b':
+ if (esc)
+ c = '\b';
+ break;
+ case 'f':
+ if (esc)
+ c = '\f';
+ break;
+ case 'n':
+ if (esc)
+ c = '\n';
+ break;
+ case 'r':
+ if (esc)
+ c = '\r';
+ break;
+ case 't':
+ if (esc)
+ c = '\t';
+ break;
+ case 'v':
+ if (esc)
+ c = '\v';
+ break;
+ }
+ buf[idx++] = c;
+ esc = 0;
+ } while (idx < bufsz && !done);
+
+ if (idx >= bufsz) {
+ mtree_error("word too long to fit buffer (max %zu characters)",
+ bufsz);
+ skip_to(fp, " \t\n");
+ }
+ return (0);
+}
+
+static fsnode *
+create_node(const char *name, u_int type, fsnode *parent, fsnode *global)
+{
+ fsnode *n;
+
+ n = calloc(1, sizeof(*n));
+ if (n == NULL)
+ return (NULL);
+
+ n->name = strdup(name);
+ if (n->name == NULL) {
+ free(n);
+ return (NULL);
+ }
+
+ n->type = (type == 0) ? global->type : type;
+ n->parent = parent;
+
+ n->inode = calloc(1, sizeof(*n->inode));
+ if (n->inode == NULL) {
+ free(n->name);
+ free(n);
+ return (NULL);
+ }
+
+ /* Assign global options/defaults. */
+ bcopy(global->inode, n->inode, sizeof(*n->inode));
+ n->inode->st.st_mode = (n->inode->st.st_mode & ~S_IFMT) | n->type;
+
+ if (n->type == S_IFLNK)
+ n->symlink = global->symlink;
+ else if (n->type == S_IFREG)
+ n->contents = global->contents;
+
+ return (n);
+}
+
+static void
+destroy_node(fsnode *n)
+{
+
+ assert(n != NULL);
+ assert(n->name != NULL);
+ assert(n->inode != NULL);
+
+ free(n->inode);
+ free(n->name);
+ free(n);
+}
+
+static int
+read_number(const char *tok, u_int base, intmax_t *res, intmax_t min,
+ intmax_t max)
+{
+ char *end;
+ intmax_t val;
+
+ val = strtoimax(tok, &end, base);
+ if (end == tok || end[0] != '\0')
+ return (EINVAL);
+ if (val < min || val > max)
+ return (EDOM);
+ *res = val;
+ return (0);
+}
+
+static int
+read_mtree_keywords(FILE *fp, fsnode *node)
+{
+ char keyword[PATH_MAX];
+ char *name, *p, *value;
+ struct group *grent;
+ struct passwd *pwent;
+ struct stat *st, sb;
+ intmax_t num;
+ u_long flset, flclr;
+ int error, istemp, type;
+
+ st = &node->inode->st;
+ do {
+ error = skip_over(fp, " \t");
+ if (error)
+ break;
+
+ error = read_word(fp, keyword, sizeof(keyword));
+ if (error)
+ break;
+
+ if (keyword[0] == '\0')
+ break;
+
+ value = strchr(keyword, '=');
+ if (value != NULL)
+ *value++ = '\0';
+
+ /*
+ * We use EINVAL, ENOATTR, ENOSYS and ENXIO to signal
+ * certain conditions:
+ * EINVAL - Value provided for a keyword that does
+ * not take a value. The value is ignored.
+ * ENOATTR - Value missing for a keyword that needs
+ * a value. The keyword is ignored.
+ * ENOSYS - Unsupported keyword encountered. The
+ * keyword is ignored.
+ * ENXIO - Value provided for a keyword that does
+ * not take a value. The value is ignored.
+ */
+ switch (keyword[0]) {
+ case 'c':
+ if (strcmp(keyword, "contents") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ node->contents = strdup(value);
+ } else
+ error = ENOSYS;
+ break;
+ case 'f':
+ if (strcmp(keyword, "flags") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ flset = flclr = 0;
+ if (!strtofflags(&value, &flset, &flclr)) {
+ st->st_flags &= ~flclr;
+ st->st_flags |= flset;
+ } else
+ error = errno;
+ } else
+ error = ENOSYS;
+ break;
+ case 'g':
+ if (strcmp(keyword, "gid") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ error = read_number(value, 10, &num,
+ 0, UINT_MAX);
+ if (!error)
+ st->st_gid = num;
+ } else if (strcmp(keyword, "gname") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ grent = getgrnam(value);
+ if (grent != NULL)
+ st->st_gid = grent->gr_gid;
+ else
+ error = errno;
+ } else
+ error = ENOSYS;
+ break;
+ case 'l':
+ if (strcmp(keyword, "link") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ node->symlink = strdup(value);
+ } else
+ error = ENOSYS;
+ break;
+ case 'm':
+ if (strcmp(keyword, "mode") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ if (value[0] >= '0' && value[0] <= '9') {
+ error = read_number(value, 8, &num,
+ 0, 07777);
+ if (!error) {
+ st->st_mode &= S_IFMT;
+ st->st_mode |= num;
+ }
+ } else {
+ /* Symbolic mode not supported. */
+ error = EINVAL;
+ break;
+ }
+ } else
+ error = ENOSYS;
+ break;
+ case 'o':
+ if (strcmp(keyword, "optional") == 0) {
+ if (value != NULL)
+ error = ENXIO;
+ node->flags |= FSNODE_F_OPTIONAL;
+ } else
+ error = ENOSYS;
+ break;
+ case 's':
+ if (strcmp(keyword, "size") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ error = read_number(value, 10, &num,
+ 0, INTMAX_MAX);
+ if (!error)
+ st->st_size = num;
+ } else
+ error = ENOSYS;
+ break;
+ case 't':
+ if (strcmp(keyword, "time") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ p = strchr(value, '.');
+ if (p != NULL)
+ *p++ = '\0';
+ error = read_number(value, 10, &num, 0,
+ INTMAX_MAX);
+ if (error)
+ break;
+ st->st_atime = num;
+ st->st_ctime = num;
+ st->st_mtime = num;
+ error = read_number(p, 10, &num, 0,
+ INTMAX_MAX);
+ if (error)
+ break;
+ if (num != 0)
+ error = EINVAL;
+ } else if (strcmp(keyword, "type") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ if (strcmp(value, "dir") == 0)
+ node->type = S_IFDIR;
+ else if (strcmp(value, "file") == 0)
+ node->type = S_IFREG;
+ else if (strcmp(value, "link") == 0)
+ node->type = S_IFLNK;
+ else
+ error = EINVAL;
+ } else
+ error = ENOSYS;
+ break;
+ case 'u':
+ if (strcmp(keyword, "uid") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ error = read_number(value, 10, &num,
+ 0, UINT_MAX);
+ if (!error)
+ st->st_uid = num;
+ } else if (strcmp(keyword, "uname") == 0) {
+ if (value == NULL) {
+ error = ENOATTR;
+ break;
+ }
+ pwent = getpwnam(value);
+ if (pwent != NULL)
+ st->st_uid = pwent->pw_uid;
+ else
+ error = errno;
+ } else
+ error = ENOSYS;
+ break;
+ default:
+ error = ENOSYS;
+ break;
+ }
+
+ switch (error) {
+ case EINVAL:
+ mtree_error("%s: invalid value '%s'", keyword, value);
+ break;
+ case ENOATTR:
+ mtree_error("%s: keyword needs a value", keyword);
+ break;
+ case ENOSYS:
+ mtree_warning("%s: unsupported keyword", keyword);
+ break;
+ case ENXIO:
+ mtree_error("%s: keyword does not take a value",
+ keyword);
+ break;
+ }
+ } while (1);
+
+ if (error)
+ return (error);
+
+ st->st_mode = (st->st_mode & ~S_IFMT) | node->type;
+
+ /* Nothing more to do for the global defaults. */
+ if (node->name == NULL)
+ return (0);
+
+ /*
+ * Be intelligent about the file type.
+ */
+ if (node->contents != NULL) {
+ if (node->symlink != NULL) {
+ mtree_error("%s: both link and contents keywords "
+ "defined", node->name);
+ return (0);
+ }
+ type = S_IFREG;
+ } else
+ type = (node->symlink != NULL) ? S_IFLNK : S_IFDIR;
+
+ if (node->type == 0)
+ node->type = type;
+
+ if (node->type != type) {
+ mtree_error("%s: file type and defined keywords to not match",
+ node->name);
+ return (0);
+ }
+
+ st->st_mode = (st->st_mode & ~S_IFMT) | node->type;
+
+ if (node->contents == NULL)
+ return (0);
+
+ name = mtree_resolve(node->contents, &istemp);
+ if (name == NULL)
+ return (errno);
+
+ if (stat(name, &sb) != 0) {
+ mtree_error("%s: contents file '%s' not found", node->name,
+ name);
+ free(name);
+ return (0);
+ }
+
+ free(node->contents);
+ node->contents = name;
+ st->st_size = sb.st_size;
+ return (0);
+}
+
+static int
+read_mtree_command(FILE *fp)
+{
+ char cmd[10];
+ int error;
+
+ error = read_word(fp, cmd, sizeof(cmd));
+ if (error)
+ goto out;
+
+ error = read_mtree_keywords(fp, &mtree_global);
+
+ out:
+ skip_to(fp, "\n");
+ (void)getc(fp);
+ return (error);
+}
+
+static int
+read_mtree_spec1(FILE *fp, bool def, const char *name)
+{
+ fsnode *last, *node, *parent;
+ u_int type;
+ int error;
+
+ assert(name[0] != '\0');
+
+ /*
+ * Treat '..' specially, because it only changes our current
+ * directory. We don't create a node for it. We simply ignore
+ * any keywords that may appear on the line as well.
+ * Going up a directory is a little non-obvious. A directory
+ * node has a corresponding '.' child. The parent of '.' is
+ * not the '.' node of the parent directory, but the directory
+ * node within the parent to which the child relates. However,
+ * going up a directory means we need to find the '.' node to
+ * which the directoy node is linked. This we can do via the
+ * first * pointer, because '.' is always the first entry in a
+ * directory.
+ */
+ if (IS_DOTDOT(name)) {
+ /* This deals with NULL pointers as well. */
+ if (mtree_current == mtree_root) {
+ mtree_warning("ignoring .. in root directory");
+ return (0);
+ }
+
+ node = mtree_current;
+
+ assert(node != NULL);
+ assert(IS_DOT(node->name));
+ assert(node->first == node);
+
+ /* Get the corresponding directory node in the parent. */
+ node = mtree_current->parent;
+
+ assert(node != NULL);
+ assert(!IS_DOT(node->name));
+
+ node = node->first;
+
+ assert(node != NULL);
+ assert(IS_DOT(node->name));
+ assert(node->first == node);
+
+ mtree_current = node;
+ return (0);
+ }
+
+ /*
+ * If we don't have a current directory and the first specification
+ * (either implicit or defined) is not '.', then we need to create
+ * a '.' node first (using a recursive call).
+ */
+ if (!IS_DOT(name) && mtree_current == NULL) {
+ error = read_mtree_spec1(fp, false, ".");
+ if (error)
+ return (error);
+ }
+
+ /*
+ * Lookup the name in the current directory (if we have a current
+ * directory) to make sure we do not create multiple nodes for the
+ * same component. For non-definitions, if we find a node with the
+ * same name, simply change the current directory. For definitions
+ * more happens.
+ */
+ last = NULL;
+ node = mtree_current;
+ while (node != NULL) {
+ assert(node->first == mtree_current);
+
+ if (strcmp(name, node->name) == 0) {
+ if (def == true) {
+ mtree_error("duplicate definition of %s",
+ name);
+ return (0);
+ }
+
+ if (node->type != S_IFDIR) {
+ mtree_error("%s is not a directory", name);
+ return (0);
+ }
+
+ assert(!IS_DOT(name));
+
+ node = node->child;
+
+ assert(node != NULL);
+ assert(IS_DOT(node->name));
+
+ mtree_current = node;
+ return (0);
+ }
+
+ last = node;
+ node = last->next;
+ }
+
+ parent = (mtree_current != NULL) ? mtree_current->parent : NULL;
+ type = (def == false || IS_DOT(name)) ? S_IFDIR : 0;
+ node = create_node(name, type, parent, &mtree_global);
+ if (node == NULL)
+ return (ENOMEM);
+
+ if (def == true) {
+ error = read_mtree_keywords(fp, node);
+ if (error) {
+ destroy_node(node);
+ return (error);
+ }
+ }
+
+ node->first = (mtree_current != NULL) ? mtree_current : node;
+
+ if (last != NULL)
+ last->next = node;
+
+ if (node->type != S_IFDIR)
+ return (0);
+
+ if (!IS_DOT(node->name)) {
+ parent = node;
+ node = create_node(".", S_IFDIR, parent, parent);
+ if (node == NULL) {
+ last->next = NULL;
+ destroy_node(parent);
+ return (ENOMEM);
+ }
+ parent->child = node;
+ node->first = node;
+ }
+
+ assert(node != NULL);
+ assert(IS_DOT(node->name));
+ assert(node->first == node);
+
+ mtree_current = node;
+ if (mtree_root == NULL)
+ mtree_root = node;
+
+ return (0);
+}
+
+static int
+read_mtree_spec(FILE *fp)
+{
+ char pathspec[PATH_MAX];
+ char *cp;
+ int error;
+
+ error = read_word(fp, pathspec, sizeof(pathspec));
+ if (error)
+ goto out;
+
+ cp = strchr(pathspec, '/');
+ if (cp != NULL) {
+ /* Absolute pathname */
+ mtree_current = mtree_root;
+
+ do {
+ *cp++ = '\0';
+
+ /* Disallow '.' and '..' as components. */
+ if (IS_DOT(pathspec) || IS_DOTDOT(pathspec)) {
+ mtree_error("absolute path cannot contain . "
+ "or .. components");
+ goto out;
+ }
+
+ /* Ignore multiple adjacent slashes. */
+ if (pathspec[0] != '\0')
+ error = read_mtree_spec1(fp, false, pathspec);
+ memmove(pathspec, cp, strlen(cp) + 1);
+ cp = strchr(pathspec, '/');
+ } while (!error && cp != NULL);
+
+ /* Disallow '.' and '..' as the last component. */
+ if (!error && (IS_DOT(pathspec) || IS_DOTDOT(pathspec))) {
+ mtree_error("absolute path cannot contain . or .. "
+ "components");
+ goto out;
+ }
+ }
+
+ /* Ignore absolute specfications that end with a slash. */
+ if (!error && pathspec[0] != '\0')
+ error = read_mtree_spec1(fp, true, pathspec);
+
+ out:
+ skip_to(fp, "\n");
+ (void)getc(fp);
+ return (error);
+}
+
+fsnode *
+read_mtree(const char *fname, fsnode *node)
+{
+ struct mtree_fileinfo *fi;
+ FILE *fp;
+ int c, error;
+
+ /* We do not yet support nesting... */
+ assert(node == NULL);
+
+ if (strcmp(fname, "-") == 0)
+ fp = stdin;
+ else {
+ fp = fopen(fname, "r");
+ if (fp == NULL)
+ err(1, "Can't open `%s'", fname);
+ }
+
+ error = mtree_file_push(fname, fp);
+ if (error)
+ goto out;
+
+ bzero(&mtree_global, sizeof(mtree_global));
+ bzero(&mtree_global_inode, sizeof(mtree_global_inode));
+ mtree_global.inode = &mtree_global_inode;
+ mtree_global_inode.nlink = 1;
+ mtree_global_inode.st.st_atime = mtree_global_inode.st.st_ctime =
+ mtree_global_inode.st.st_mtime = time(NULL);
+ errors = warnings = 0;
+
+ setgroupent(1);
+ setpassent(1);
+
+ mtree_root = node;
+ mtree_current = node;
+ do {
+ /* Start of a new line... */
+ fi = SLIST_FIRST(&mtree_fileinfo);
+ fi->line++;
+
+ error = skip_over(fp, " \t");
+ if (error)
+ break;
+
+ c = getc(fp);
+ if (c == EOF) {
+ error = ferror(fp) ? errno : -1;
+ break;
+ }
+
+ switch (c) {
+ case '\n': /* empty line */
+ error = 0;
+ break;
+ case '#': /* comment -- skip to end of line. */
+ error = skip_to(fp, "\n");
+ if (!error)
+ (void)getc(fp);
+ break;
+ case '/': /* special commands */
+ error = read_mtree_command(fp);
+ break;
+ default: /* specification */
+ ungetc(c, fp);
+ error = read_mtree_spec(fp);
+ break;
+ }
+ } while (!error);
+
+ endpwent();
+ endgrent();
+
+ if (error <= 0 && (errors || warnings)) {
+ warnx("%u error(s) and %u warning(s) in mtree manifest",
+ errors, warnings);
+ if (errors)
+ exit(1);
+ }
+
+ out:
+ if (error > 0)
+ errc(1, error, "Error reading mtree file");
+
+ if (fp != stdin)
+ fclose(fp);
+
+ if (mtree_root != NULL)
+ return (mtree_root);
+
+ /* Handle empty specifications. */
+ node = create_node(".", S_IFDIR, NULL, &mtree_global);
+ node->first = node;
+ return (node);
+}
diff --git a/usr.sbin/mfiutil/mfi_config.c b/usr.sbin/mfiutil/mfi_config.c
index f1e6516..f6f1a9d 100644
--- a/usr.sbin/mfiutil/mfi_config.c
+++ b/usr.sbin/mfiutil/mfi_config.c
@@ -419,8 +419,10 @@ build_array(int fd, char *arrayp, struct array_info *array_info,
ar->array_ref = find_next_array(state);
for (i = 0; i < array_info->drive_count; i++) {
if (verbose)
- printf("Adding drive %u to array %u\n",
+ printf("Adding drive %s to array %u\n",
+ mfi_drive_name(NULL,
array_info->drives[i].ref.v.device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS),
ar->array_ref);
if (ar->size > array_info->drives[i].coerced_size)
ar->size = array_info->drives[i].coerced_size;
diff --git a/usr.sbin/mfiutil/mfi_drive.c b/usr.sbin/mfiutil/mfi_drive.c
index 5c2ab5d..6341fd8 100644
--- a/usr.sbin/mfiutil/mfi_drive.c
+++ b/usr.sbin/mfiutil/mfi_drive.c
@@ -45,6 +45,87 @@
MFI_TABLE(top, drive);
+/*
+ * Print the name of a drive either by drive number as %2u or by enclosure:slot
+ * as Exx:Sxx (or both). Use default unless command line options override it
+ * and the command allows this (which we usually do unless we already print
+ * both). We prefer pinfo if given, otherwise try to look it up by device_id.
+ */
+const char *
+mfi_drive_name(struct mfi_pd_info *pinfo, uint16_t device_id, uint32_t def)
+{
+ struct mfi_pd_info info;
+ static char buf[16];
+ char *p;
+ int error, fd, len;
+
+ if ((def & MFI_DNAME_HONOR_OPTS) != 0 &&
+ (mfi_opts & (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID)) != 0)
+ def = mfi_opts & (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID);
+
+ buf[0] = '\0';
+ if (pinfo == NULL && def & MFI_DNAME_ES) {
+ /* Fallback in case of error, just ignore flags. */
+ if (device_id == 0xffff)
+ snprintf(buf, sizeof(buf), "MISSING");
+ else
+ snprintf(buf, sizeof(buf), "%2u", device_id);
+
+ fd = mfi_open(mfi_unit);
+ if (fd < 0) {
+ warn("mfi_open");
+ return (buf);
+ }
+
+ /* Get the info for this drive. */
+ if (mfi_pd_get_info(fd, device_id, &info, NULL) < 0) {
+ warn("Failed to fetch info for drive %2u", device_id);
+ close(fd);
+ return (buf);
+ }
+
+ close(fd);
+ pinfo = &info;
+ }
+
+ p = buf;
+ len = sizeof(buf);
+ if (def & MFI_DNAME_DEVICE_ID) {
+ if (device_id == 0xffff)
+ error = snprintf(p, len, "MISSING");
+ else
+ error = snprintf(p, len, "%2u", device_id);
+ if (error >= 0) {
+ p += error;
+ len -= error;
+ }
+ }
+ if ((def & (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID)) ==
+ (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID) && len >= 2) {
+ *p++ = ' ';
+ len--;
+ *p = '\0';
+ len--;
+ }
+ if (def & MFI_DNAME_ES) {
+ if (pinfo->encl_device_id == 0xffff)
+ error = snprintf(p, len, "S%u",
+ pinfo->slot_number);
+ else if (pinfo->encl_device_id == pinfo->ref.v.device_id)
+ error = snprintf(p, len, "E%u",
+ pinfo->encl_index);
+ else
+ error = snprintf(p, len, "E%u:S%u",
+ pinfo->encl_index, pinfo->slot_number);
+ if (error >= 0) {
+ p += error;
+ len -= error;
+ }
+ }
+
+ return (buf);
+}
+
const char *
mfi_pdstate(enum mfi_pd_state state)
{
@@ -547,7 +628,9 @@ drive_progress(int ac, char **av)
mfi_display_progress("Clear", &info.prog_info.clear);
if ((info.prog_info.active & (MFI_PD_PROGRESS_REBUILD |
MFI_PD_PROGRESS_PATROL | MFI_PD_PROGRESS_CLEAR)) == 0)
- printf("No activity in progress for drive %u.\n", device_id);
+ printf("No activity in progress for drive %s.\n",
+ mfi_drive_name(NULL, device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
return (0);
}
diff --git a/usr.sbin/mfiutil/mfi_patrol.c b/usr.sbin/mfiutil/mfi_patrol.c
index d70c4ab..dd348ad 100644
--- a/usr.sbin/mfiutil/mfi_patrol.c
+++ b/usr.sbin/mfiutil/mfi_patrol.c
@@ -80,7 +80,7 @@ show_patrol(int ac, char **av)
struct mfi_pr_status status;
struct mfi_pd_list *list;
struct mfi_pd_info info;
- char label[16];
+ char label[24];
time_t now;
uint32_t at;
int error, fd;
@@ -174,8 +174,10 @@ show_patrol(int ac, char **av)
return (error);
}
if (info.prog_info.active & MFI_PD_PROGRESS_PATROL) {
- snprintf(label, sizeof(label), " Drive %u",
- list->addr[i].device_id);
+ snprintf(label, sizeof(label), " Drive %s",
+ mfi_drive_name(NULL,
+ list->addr[i].device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
mfi_display_progress(label,
&info.prog_info.patrol);
}
diff --git a/usr.sbin/mfiutil/mfi_show.c b/usr.sbin/mfiutil/mfi_show.c
index 76fd6b9..d1f0071 100644
--- a/usr.sbin/mfiutil/mfi_show.c
+++ b/usr.sbin/mfiutil/mfi_show.c
@@ -258,7 +258,7 @@ print_ld(struct mfi_ld_info *info, int state_len)
}
static void
-print_pd(struct mfi_pd_info *info, int state_len, int location)
+print_pd(struct mfi_pd_info *info, int state_len)
{
const char *s;
char buf[6];
@@ -273,15 +273,6 @@ print_pd(struct mfi_pd_info *info, int state_len, int location)
s = mfi_pd_inq_string(info);
if (s != NULL)
printf(" %s", s);
- if (!location)
- return;
- if (info->encl_device_id == 0xffff)
- printf(" slot %d", info->slot_number);
- else if (info->encl_device_id == info->ref.v.device_id)
- printf(" enclosure %d", info->encl_index);
- else
- printf(" enclosure %d, slot %d", info->encl_index,
- info->slot_number);
}
static int
@@ -329,16 +320,16 @@ show_config(int ac, char **av)
ar->num_drives);
for (j = 0; j < ar->num_drives; j++) {
device_id = ar->pd[j].ref.v.device_id;
- if (device_id == 0xffff)
- printf(" drive MISSING\n");
- else {
- printf(" drive %u ", device_id);
+ printf(" drive %s ", mfi_drive_name(NULL,
+ device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
+ if (device_id != 0xffff) {
if (mfi_pd_get_info(fd, device_id, &pinfo,
NULL) < 0)
printf("%s",
mfi_pdstate(ar->pd[j].fw_state));
else
- print_pd(&pinfo, -1, 1);
+ print_pd(&pinfo, -1);
printf("\n");
}
}
@@ -367,13 +358,14 @@ show_config(int ac, char **av)
for (i = 0; i < config->spares_count; i++) {
sp = (struct mfi_spare *)p;
- printf(" %s spare %u ",
+ printf(" %s spare %s ",
sp->spare_type & MFI_SPARE_DEDICATED ? "dedicated" :
- "global", sp->ref.v.device_id);
+ "global", mfi_drive_name(NULL, sp->ref.v.device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
if (mfi_pd_get_info(fd, sp->ref.v.device_id, &pinfo, NULL) < 0)
printf("%s", mfi_pdstate(MFI_PD_STATE_HOT_SPARE));
else
- print_pd(&pinfo, -1, 1);
+ print_pd(&pinfo, -1);
if (sp->spare_type & MFI_SPARE_DEDICATED) {
printf(" backs:\n");
for (j = 0; j < sp->array_count; j++)
@@ -534,7 +526,11 @@ show_drives(int ac, char **av)
goto error;
}
- print_pd(&info, state_len, 1);
+ printf("%s ", mfi_drive_name(&info, list->addr[i].device_id,
+ MFI_DNAME_DEVICE_ID));
+ print_pd(&info, state_len);
+ printf(" %s", mfi_drive_name(&info, list->addr[i].device_id,
+ MFI_DNAME_ES));
printf("\n");
}
error:
@@ -719,18 +715,21 @@ show_progress(int ac, char **av)
}
if (pinfo.prog_info.active & MFI_PD_PROGRESS_REBUILD) {
- printf("drive %u ", device_id);
+ printf("drive %s ", mfi_drive_name(NULL, device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
mfi_display_progress("Rebuild", &pinfo.prog_info.rbld);
busy = 1;
}
if (pinfo.prog_info.active & MFI_PD_PROGRESS_PATROL) {
- printf("drive %u ", device_id);
+ printf("drive %s ", mfi_drive_name(NULL, device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
mfi_display_progress("Patrol Read",
&pinfo.prog_info.patrol);
busy = 1;
}
if (pinfo.prog_info.active & MFI_PD_PROGRESS_CLEAR) {
- printf("drive %u ", device_id);
+ printf("drive %s ", mfi_drive_name(NULL, device_id,
+ MFI_DNAME_DEVICE_ID|MFI_DNAME_HONOR_OPTS));
mfi_display_progress("Clear", &pinfo.prog_info.clear);
busy = 1;
}
diff --git a/usr.sbin/mfiutil/mfiutil.8 b/usr.sbin/mfiutil/mfiutil.8
index d5178a0..dcd17f5 100644
--- a/usr.sbin/mfiutil/mfiutil.8
+++ b/usr.sbin/mfiutil/mfiutil.8
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 29, 2011
+.Dd June 20, 2011
.Dt MFIUTIL 8
.Os
.Sh NAME
@@ -43,6 +43,8 @@
.Op Fl u Ar unit
.Cm show battery
.Nm
+.Op Fl d
+.Op Fl e
.Op Fl u Ar unit
.Cm show config
.Nm
@@ -63,9 +65,13 @@
.Op Fl u Ar unit
.Cm show logstate
.Nm
+.Op Fl d
+.Op Fl e
.Op Fl u Ar unit
.Cm show patrol
.Nm
+.Op Fl d
+.Op Fl e
.Op Fl u Ar unit
.Cm show progress
.Nm
@@ -155,15 +161,19 @@ If no unit is specified,
then unit 0 is used.
.El
.Pp
-Volumes may be specified in two forms.
-First,
-a volume may be identified by its target ID.
-Second,
-on the volume may be specified by the corresponding
-.Em mfidX
-device,
-such as
-.Em mfid0 .
+Various commands accept either or both of the two options:
+.Bl -tag -width indent
+.It Fl d
+Print numeric device IDs as drive identifier.
+This is the default.
+Useful in combination with
+.Fl e
+to print both, numeric device IDs and enclosure:slot information.
+.It Fl e
+Print drive identifiers in enclosure:slot form.
+See next paragraph on format details in context of input rather than
+output.
+.El
.Pp
Drives may be specified in two forms.
First,
@@ -184,6 +194,16 @@ and
is the slot for each drive as displayed in
.Cm show drives .
.Pp
+Volumes may be specified in two forms.
+First,
+a volume may be identified by its target ID.
+Second,
+on the volume may be specified by the corresponding
+.Em mfidX
+device,
+such as
+.Em mfid0 .
+.Pp
The
.Nm
utility supports several different groups of commands.
diff --git a/usr.sbin/mfiutil/mfiutil.c b/usr.sbin/mfiutil/mfiutil.c
index 1bce79e..43bb6bb 100644
--- a/usr.sbin/mfiutil/mfiutil.c
+++ b/usr.sbin/mfiutil/mfiutil.c
@@ -45,11 +45,13 @@ MFI_TABLE(top, abort);
int mfi_unit;
+u_int mfi_opts;
+
static void
usage(void)
{
- fprintf(stderr, "usage: mfiutil [-u unit] <command> ...\n\n");
+ fprintf(stderr, "usage: mfiutil [-de] [-u unit] <command> ...\n\n");
fprintf(stderr, "Commands include:\n");
fprintf(stderr, " version\n");
fprintf(stderr, " show adapter - display controller information\n");
@@ -58,6 +60,7 @@ usage(void)
fprintf(stderr, " show drives - list physical drives\n");
fprintf(stderr, " show events - display event log\n");
fprintf(stderr, " show firmware - list firmware images\n");
+ fprintf(stderr, " show logstate - display event log sequence numbers\n");
fprintf(stderr, " show volumes - list logical volumes\n");
fprintf(stderr, " show patrol - display patrol read status\n");
fprintf(stderr, " show progress - display status of active operations\n");
@@ -107,8 +110,14 @@ main(int ac, char **av)
struct mfiutil_command **cmd;
int ch;
- while ((ch = getopt(ac, av, "u:")) != -1) {
+ while ((ch = getopt(ac, av, "deu:")) != -1) {
switch (ch) {
+ case 'd':
+ mfi_opts |= MFI_DNAME_DEVICE_ID;
+ break;
+ case 'e':
+ mfi_opts |= MFI_DNAME_ES;
+ break;
case 'u':
mfi_unit = atoi(optarg);
break;
diff --git a/usr.sbin/mfiutil/mfiutil.h b/usr.sbin/mfiutil/mfiutil.h
index b080b50..232831e 100644
--- a/usr.sbin/mfiutil/mfiutil.h
+++ b/usr.sbin/mfiutil/mfiutil.h
@@ -115,7 +115,13 @@ struct mfiutil_command {
} \
MFI_COMMAND(set, name, mfiutil_ ## name ## _table_handler)
+/* Drive name printing options */
+#define MFI_DNAME_ES 0x0001 /* E%u:S%u */
+#define MFI_DNAME_DEVICE_ID 0x0002 /* %u */
+#define MFI_DNAME_HONOR_OPTS 0x8000 /* Allow cmd line to override default */
+
extern int mfi_unit;
+extern u_int mfi_opts;
void mbox_store_ldref(uint8_t *mbox, union mfi_ld_ref *ref);
void mbox_store_pdref(uint8_t *mbox, union mfi_pd_ref *ref);
@@ -143,5 +149,7 @@ int mfi_pd_get_info(int fd, uint16_t device_id, struct mfi_pd_info *info,
int mfi_pd_get_list(int fd, struct mfi_pd_list **listp, uint8_t *statusp);
int mfi_reconfig_supported(void);
const char *mfi_status(u_int status_code);
+const char *mfi_drive_name(struct mfi_pd_info *pinfo, uint16_t device_id,
+ uint32_t def);
#endif /* !__MFIUTIL_H__ */
diff --git a/usr.sbin/mountd/exports.5 b/usr.sbin/mountd/exports.5
index 357f82a..f2a1474 100644
--- a/usr.sbin/mountd/exports.5
+++ b/usr.sbin/mountd/exports.5
@@ -28,7 +28,7 @@
.\" @(#)exports.5 8.3 (Berkeley) 3/29/95
.\" $FreeBSD$
.\"
-.Dd December 3, 2009
+.Dd July 12, 2011
.Dt EXPORTS 5
.Os
.Sh NAME
@@ -72,6 +72,13 @@ that can be mounted on by the corresponding client(s).
There are three forms of this specification.
The first is to list all mount points as absolute
directory paths separated by whitespace.
+This list of directory paths should be considered an
+.Dq administrative control ,
+since it is only enforced by the
+.Xr mountd 8
+daemon and not the kernel.
+As such, it only applies to NFSv2 and NFSv3 mounts and only
+with respect to the client's use of the mount protocol.
The second is to specify the pathname of the root of the file system
followed by the
.Fl alldirs
@@ -81,8 +88,21 @@ including regular files if the
.Fl r
option is used on
.Xr mountd 8 .
+Because NFSv4 does not use the mount protocol,
+the
+.Dq administrative controls
+are not applied.
+Thus, all the above export line(s) should be considered to have the
+.Fl alldirs
+flag, even if the line is specified without it.
The third form has the string ``V4:'' followed by a single absolute path
name, to specify the NFSv4 tree root.
+This line does not export any file system, but simply marks where the root
+of the server's directory tree is for NFSv4 clients.
+The exported file systems for NFSv4 are specified via the other lines
+in the
+.Xr exports 5
+file in the same way as for NFSv2 and NFSv3.
The pathnames must not have any symbolic links in them and should not have
any
.Dq Pa \&.
diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c
index 01a27eb..a1e83c3 100644
--- a/usr.sbin/mountd/mountd.c
+++ b/usr.sbin/mountd/mountd.c
@@ -1789,10 +1789,9 @@ get_exp(void)
{
struct exportlist *ep;
- ep = (struct exportlist *)malloc(sizeof (struct exportlist));
+ ep = (struct exportlist *)calloc(1, sizeof (struct exportlist));
if (ep == (struct exportlist *)NULL)
out_of_mem();
- memset(ep, 0, sizeof(struct exportlist));
return (ep);
}
@@ -1804,10 +1803,9 @@ get_grp(void)
{
struct grouplist *gp;
- gp = (struct grouplist *)malloc(sizeof (struct grouplist));
+ gp = (struct grouplist *)calloc(1, sizeof (struct grouplist));
if (gp == (struct grouplist *)NULL)
out_of_mem();
- memset(gp, 0, sizeof(struct grouplist));
return (gp);
}
diff --git a/usr.sbin/mtest/mtest.c b/usr.sbin/mtest/mtest.c
index 442c3c4..60f7e09 100644
--- a/usr.sbin/mtest/mtest.c
+++ b/usr.sbin/mtest/mtest.c
@@ -204,14 +204,16 @@ main(int argc, char **argv)
s6 = -1;
#ifdef INET
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (s == -1)
+ if (s == -1 && errno != EPROTONOSUPPORT)
err(1, "can't open IPv4 socket");
#endif
#ifdef INET6
s6 = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
- if (s6 == -1)
+ if (s6 == -1 && errno != EPROTONOSUPPORT)
err(1, "can't open IPv6 socket");
#endif
+ if (s == -1 && s6 == -1)
+ errc(1, EPROTONOSUPPORT, "can't open socket");
if (argc < 2) {
if (isatty(STDIN_FILENO)) {
@@ -371,7 +373,7 @@ af2socklen(const int af)
}
static void
-process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
+process_cmd(char *cmd, int s, int s6, FILE *fp __unused)
{
char str1[STR_SIZE];
char str2[STR_SIZE];
@@ -457,7 +459,10 @@ process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
optval = (void *)&mr.mr;
optlen = sizeof(mr.mr);
}
- if (setsockopt(s, level, optname, optval,
+ if (s < 0) {
+ warnc(EPROTONOSUPPORT, "setsockopt %s",
+ toptname);
+ } else if (setsockopt(s, level, optname, optval,
optlen) == 0) {
printf("ok\n");
break;
@@ -496,7 +501,10 @@ process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
optval = (void *)&mr.mr6;
optlen = sizeof(mr.mr6);
}
- if (setsockopt(s6, level, optname, optval,
+ if (s6 < 0) {
+ warnc(EPROTONOSUPPORT, "setsockopt %s",
+ toptname);
+ } else if (setsockopt(s6, level, optname, optval,
optlen) == 0) {
printf("ok\n");
break;
@@ -534,6 +542,10 @@ process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
break;
}
af = su.sa.sa_family;
+ if (af2sock(af, s, s6) == -1) {
+ warnc(EPROTONOSUPPORT, "setsourcefilter");
+ break;
+ }
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_flags = AI_NUMERICHOST;
@@ -593,6 +605,10 @@ process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
break;
}
af = su.sa.sa_family;
+ if (af2sock(af, s, s6) == -1) {
+ warnc(EPROTONOSUPPORT, "getsourcefilter");
+ break;
+ }
/* First determine our current filter mode. */
n = 0;
@@ -700,6 +716,10 @@ process_cmd(char *cmd, int s, int s6 __unused, FILE *fp __unused)
}
af = su.sa.sa_family;
+ if (af2sock(af, s, s6) == -1) {
+ warnc(EPROTONOSUPPORT, "getsourcefilter");
+ break;
+ }
nsrc = nreqsrc;
if (getsourcefilter(af2sock(af, s, s6), ifindex, &su.sa,
su.sa.sa_len, &fmode, &nsrc, &sources[0].ss) != 0) {
diff --git a/usr.sbin/named-checkconf/Makefile b/usr.sbin/named-checkconf/Makefile
index 618cc13..abee068 100644
--- a/usr.sbin/named-checkconf/Makefile
+++ b/usr.sbin/named-checkconf/Makefile
@@ -13,6 +13,7 @@ PROG= named-checkconf
SRCS+= named-checkconf.c check-tool.c
CFLAGS+= -I${LIB_BIND_DIR}
+CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
WARNS?= 3
diff --git a/usr.sbin/named-journalprint/Makefile b/usr.sbin/named-journalprint/Makefile
new file mode 100644
index 0000000..cdf4016
--- /dev/null
+++ b/usr.sbin/named-journalprint/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= named-journalprint
+
+.PATH: ${SRCDIR}
+SRCS+= named-journalprint.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 3
+
+MAN= named-journalprint.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/named/Makefile b/usr.sbin/named/Makefile
index adeb3da..89de5ac 100644
--- a/usr.sbin/named/Makefile
+++ b/usr.sbin/named/Makefile
@@ -36,12 +36,11 @@ SRCS+= os.c
SRCS+= builtin.c client.c config.c control.c \
controlconf.c interfacemgr.c \
listenlist.c log.c logconf.c main.c notify.c \
- query.c server.c sortlist.c \
+ query.c server.c sortlist.c statschannel.c \
tkeyconf.c tsigconf.c update.c xfrout.c \
zoneconf.c \
lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \
- lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c \
- statschannel.c
+ lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c
CFLAGS+= -DCONFIGARGS="\"${CONFIGARGS}\""
@@ -58,7 +57,8 @@ LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
MAN= named.8 lwresd.8 named.conf.5
-MANFILTER= sed -e "s@/etc/named\.conf@/etc/namedb/named.conf@g"
+MANFILTER= sed -e "s@/etc/named\.conf@/etc/namedb/named.conf@g" \
+ -e "s@/var\/run\/named\/named.pid@/var/run/named/pid@"
LINKS= ${BINDIR}/named ${BINDIR}/lwresd
diff --git a/usr.sbin/nfsd/nfsd.c b/usr.sbin/nfsd/nfsd.c
index 656cb14..c5cec5e 100644
--- a/usr.sbin/nfsd/nfsd.c
+++ b/usr.sbin/nfsd/nfsd.c
@@ -71,7 +71,6 @@ static const char rcsid[] =
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <netdb.h>
/* Global defs */
#ifdef DEBUG
diff --git a/usr.sbin/nfsuserd/nfsuserd.c b/usr.sbin/nfsuserd/nfsuserd.c
index 9dd6396..35e2849 100644
--- a/usr.sbin/nfsuserd/nfsuserd.c
+++ b/usr.sbin/nfsuserd/nfsuserd.c
@@ -76,6 +76,8 @@ static bool_t xdr_retval(XDR *, caddr_t);
#define MAXNAME 1024
#define MAXNFSUSERD 20
#define DEFNFSUSERD 4
+#define MAXUSERMAX 100000
+#define MINUSERMAX 10
#define DEFUSERMAX 200
#define DEFUSERTIMEOUT (1 * 60)
struct info {
@@ -96,8 +98,8 @@ pid_t slaves[MAXNFSUSERD];
int
main(int argc, char *argv[])
{
- int i;
- int error, len, mustfreeai = 0;
+ int i, j;
+ int error, fnd_dup, len, mustfreeai = 0, start_uidpos;
struct nfsd_idargs nid;
struct passwd *pwd;
struct group *grp;
@@ -107,6 +109,7 @@ main(int argc, char *argv[])
sigset_t signew;
char hostname[MAXHOSTNAMELEN + 1], *cp;
struct addrinfo *aip, hints;
+ static uid_t check_dups[MAXUSERMAX];
if (modfind("nfscommon") < 0) {
/* Not present in kernel, try loading it */
@@ -163,9 +166,10 @@ main(int argc, char *argv[])
argc--;
argv++;
i = atoi(*argv);
- if (i < 10 || i > 100000) {
+ if (i < MINUSERMAX || i > MAXUSERMAX) {
fprintf(stderr,
- "usermax %d out of range 10<->100000\n", i);
+ "usermax %d out of range %d<->%d\n", i,
+ MINUSERMAX, MAXUSERMAX);
usage();
}
nid.nid_usermax = i;
@@ -326,8 +330,25 @@ main(int argc, char *argv[])
/*
* Loop around adding all users.
*/
+ start_uidpos = i;
setpwent();
while (i < nid.nid_usermax && (pwd = getpwent())) {
+ fnd_dup = 0;
+ /*
+ * Yes, this is inefficient, but it is only done once when
+ * the daemon is started and will run in a fraction of a second
+ * for nid_usermax at 10000. If nid_usermax is cranked up to
+ * 100000, it will take several seconds, depending on the CPU.
+ */
+ for (j = 0; j < (i - start_uidpos); j++)
+ if (check_dups[j] == pwd->pw_uid) {
+ /* Found another entry for uid, so skip it */
+ fnd_dup = 1;
+ break;
+ }
+ if (fnd_dup != 0)
+ continue;
+ check_dups[i - start_uidpos] = pwd->pw_uid;
nid.nid_uid = pwd->pw_uid;
nid.nid_name = pwd->pw_name;
nid.nid_namelen = strlen(pwd->pw_name);
diff --git a/usr.sbin/nsec3hash/Makefile b/usr.sbin/nsec3hash/Makefile
new file mode 100644
index 0000000..6dbea09
--- /dev/null
+++ b/usr.sbin/nsec3hash/Makefile
@@ -0,0 +1,24 @@
+# $FreeBSD$
+
+BIND_DIR= ${.CURDIR}/../../contrib/bind9
+LIB_BIND_REL= ../../lib/bind
+LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
+SRCDIR= ${BIND_DIR}/bin/tools
+
+.include "${LIB_BIND_DIR}/config.mk"
+
+PROG= nsec3hash
+
+.PATH: ${SRCDIR}
+SRCS+= nsec3hash.c
+
+CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include
+
+DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD}
+LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD}
+
+WARNS?= 2
+
+MAN= nsec3hash.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/pmccontrol/pmccontrol.c b/usr.sbin/pmccontrol/pmccontrol.c
index 80d4bd7..2a680ae 100644
--- a/usr.sbin/pmccontrol/pmccontrol.c
+++ b/usr.sbin/pmccontrol/pmccontrol.c
@@ -134,33 +134,15 @@ pmcc_init_debug(void)
static int
pmcc_do_enable_disable(struct pmcc_op_list *op_list)
{
- long cpusetsize;
int c, error, i, j, ncpu, npmc, t;
- cpuset_t haltedcpus, cpumask;
struct pmcc_op *np;
unsigned char *map;
unsigned char op;
int cpu, pmc;
- size_t setsize;
if ((ncpu = pmc_ncpu()) < 0)
err(EX_OSERR, "Unable to determine the number of cpus");
- /* Determine the set of active CPUs. */
- cpusetsize = sysconf(_SC_CPUSET_SIZE);
- if (cpusetsize == -1 || (u_long)cpusetsize > sizeof(cpuset_t)) {
- err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
- "halted");
- }
- CPU_ZERO(&haltedcpus);
- setsize = (size_t)cpusetsize;
- if (ncpu > 1 && sysctlbyname("machdep.hlt_cpus", &haltedcpus,
- &setsize, NULL, 0) < 0)
- err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
- "halted");
- CPU_FILL(&cpumask);
- CPU_NAND(&cpumask, &haltedcpus);
-
/* Determine the maximum number of PMCs in any CPU. */
npmc = 0;
for (c = 0; c < ncpu; c++) {
@@ -207,8 +189,7 @@ pmcc_do_enable_disable(struct pmcc_op_list *op_list)
if (cpu == PMCC_CPU_ALL)
for (i = 0; i < ncpu; i++) {
- if (CPU_ISSET(i, &cpumask))
- SET_PMCS(i, pmc, op);
+ SET_PMCS(i, pmc, op);
}
else
SET_PMCS(cpu, pmc, op);
@@ -240,9 +221,10 @@ pmcc_do_enable_disable(struct pmcc_op_list *op_list)
static int
pmcc_do_list_state(void)
{
- size_t dummy;
+ cpuset_t logical_cpus_mask;
+ long cpusetsize;
+ size_t setsize;
int c, cpu, n, npmc, ncpu;
- unsigned int logical_cpus_mask;
struct pmc_info *pd;
struct pmc_pmcinfo *pi;
const struct pmc_cpuinfo *pc;
@@ -254,17 +236,22 @@ pmcc_do_list_state(void)
pmc_name_of_cputype(pc->pm_cputype),
pc->pm_npmc);
- dummy = sizeof(logical_cpus_mask);
+ /* Determine the set of logical CPUs. */
+ cpusetsize = sysconf(_SC_CPUSET_SIZE);
+ if (cpusetsize == -1 || (u_long)cpusetsize > sizeof(cpuset_t))
+ err(EX_OSERR, "Cannot determine which CPUs are logical");
+ CPU_ZERO(&logical_cpus_mask);
+ setsize = (size_t)cpusetsize;
if (sysctlbyname("machdep.logical_cpus_mask", &logical_cpus_mask,
- &dummy, NULL, 0) < 0)
- logical_cpus_mask = 0;
+ &setsize, NULL, 0) < 0)
+ CPU_ZERO(&logical_cpus_mask);
ncpu = pc->pm_ncpu;
for (c = cpu = 0; cpu < ncpu; cpu++) {
#if defined(__i386__) || defined(__amd64__)
if (pc->pm_cputype == PMC_CPU_INTEL_PIV &&
- (logical_cpus_mask & (1 << cpu)))
+ CPU_ISSET(cpu, &logical_cpus_mask))
continue; /* skip P4-style 'logical' cpus */
#endif
if (pmc_pmcinfo(cpu, &pi) < 0) {
diff --git a/usr.sbin/pmcstat/pmcpl_calltree.c b/usr.sbin/pmcstat/pmcpl_calltree.c
index c647a32..af3317a 100644
--- a/usr.sbin/pmcstat/pmcpl_calltree.c
+++ b/usr.sbin/pmcstat/pmcpl_calltree.c
@@ -46,7 +46,6 @@ __FBSDID("$FreeBSD$");
#include <fcntl.h>
#include <pmc.h>
#include <pmclog.h>
-#include <sysexits.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/usr.sbin/pmcstat/pmcstat.c b/usr.sbin/pmcstat/pmcstat.c
index ab3846c..52e02a8 100644
--- a/usr.sbin/pmcstat/pmcstat.c
+++ b/usr.sbin/pmcstat/pmcstat.c
@@ -552,7 +552,7 @@ int
main(int argc, char **argv)
{
double interval;
- int option, npmc, ncpu, haltedcpus;
+ int option, npmc, ncpu;
int c, check_driver_stats, current_cpu, current_sampling_count;
int do_callchain, do_descendants, do_logproccsw, do_logprocexit;
int do_print;
@@ -617,14 +617,6 @@ main(int argc, char **argv)
if (sysctlbyname("hw.ncpu", &ncpu, &dummy, NULL, 0) < 0)
err(EX_OSERR, "ERROR: Cannot determine the number of CPUs");
cpumask = (1 << ncpu) - 1;
- haltedcpus = 0;
- if (ncpu > 1) {
- if (sysctlbyname("machdep.hlt_cpus", &haltedcpus, &dummy,
- NULL, 0) < 0)
- err(EX_OSERR, "ERROR: Cannot determine which CPUs are "
- "halted");
- cpumask &= ~haltedcpus;
- }
while ((option = getopt(argc, argv,
"CD:EF:G:M:NO:P:R:S:TWc:df:gk:m:n:o:p:qr:s:t:vw:z:")) != -1)
@@ -637,7 +629,7 @@ main(int argc, char **argv)
case 'c': /* CPU */
if (optarg[0] == '*' && optarg[1] == '\0')
- cpumask = ((1 << ncpu) - 1) & ~haltedcpus;
+ cpumask = (1 << ncpu) - 1;
else
cpumask = pmcstat_get_cpumask(optarg);
diff --git a/usr.sbin/ppp/nat_cmd.c b/usr.sbin/ppp/nat_cmd.c
index 48f894a..accb149 100644
--- a/usr.sbin/ppp/nat_cmd.c
+++ b/usr.sbin/ppp/nat_cmd.c
@@ -32,7 +32,6 @@
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in_systm.h>
-#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <sys/un.h>
diff --git a/usr.sbin/pwd_mkdb/pwd_mkdb.c b/usr.sbin/pwd_mkdb/pwd_mkdb.c
index 2abbcdf..79f91a9 100644
--- a/usr.sbin/pwd_mkdb/pwd_mkdb.c
+++ b/usr.sbin/pwd_mkdb/pwd_mkdb.c
@@ -351,14 +351,16 @@ main(int argc, char *argv[])
if ((dp->put)(sdp, &key, &data, 0) == -1)
error("put");
}
- ypcnt = 1;
+ ypcnt = 0;
data.data = (u_char *)buf;
sdata.data = (u_char *)sbuf;
key.data = (u_char *)tbuf;
for (cnt = 1; scan(fp, &pwd); ++cnt) {
if (!is_comment &&
- (pwd.pw_name[0] == '+' || pwd.pw_name[0] == '-'))
+ (pwd.pw_name[0] == '+' || pwd.pw_name[0] == '-')) {
yp_enabled = 1;
+ ypcnt++;
+ }
if (is_comment)
--cnt;
#define COMPACT(e) t = e; while ((*p++ = *t++));
@@ -456,7 +458,6 @@ main(int argc, char *argv[])
tbuf[0] = CURRENT_VERSION(_PW_KEYYPBYNUM);
store = htonl(ypcnt);
memmove(tbuf + 1, &store, sizeof(store));
- ypcnt++;
key.size = sizeof(store) + 1;
if ((dp->put)(dp, &key, &data, method) == -1)
error("put");
@@ -547,7 +548,6 @@ main(int argc, char *argv[])
tbuf[0] = LEGACY_VERSION(_PW_KEYYPBYNUM);
store = HTOL(ypcnt);
memmove(tbuf + 1, &store, sizeof(store));
- ypcnt++;
key.size = sizeof(store) + 1;
if ((dp->put)(dp, &key, &data, method) == -1)
error("put");
diff --git a/usr.sbin/rndc-confgen/Makefile b/usr.sbin/rndc-confgen/Makefile
index 08f2d7e..2474920 100644
--- a/usr.sbin/rndc-confgen/Makefile
+++ b/usr.sbin/rndc-confgen/Makefile
@@ -3,7 +3,7 @@
BIND_DIR= ${.CURDIR}/../../contrib/bind9
LIB_BIND_REL= ../../lib/bind
LIB_BIND_DIR= ${.CURDIR}/${LIB_BIND_REL}
-SRCDIR= ${BIND_DIR}/bin/rndc
+SRCDIR= ${BIND_DIR}/bin/confgen
.include "${LIB_BIND_DIR}/config.mk"
@@ -13,7 +13,7 @@ PROG= rndc-confgen
SRCS+= os.c
.PATH: ${SRCDIR}
-SRCS+= rndc-confgen.c util.c
+SRCS+= rndc-confgen.c keygen.c util.c
CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
diff --git a/usr.sbin/rndc/Makefile b/usr.sbin/rndc/Makefile
index 9cd356f..66d8452 100644
--- a/usr.sbin/rndc/Makefile
+++ b/usr.sbin/rndc/Makefile
@@ -9,13 +9,11 @@ SRCDIR= ${BIND_DIR}/bin/rndc
PROG= rndc
-.PATH: ${SRCDIR}/unix
-SRCS+= os.c
-
.PATH: ${SRCDIR}
SRCS+= rndc.c util.c
-CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR}
+CFLAGS+= -I${SRCDIR}/include -I${LIB_BIND_DIR}
+CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include
WARNS?= 3
diff --git a/usr.sbin/route6d/Makefile b/usr.sbin/route6d/Makefile
index 51c59b8..df23d33 100644
--- a/usr.sbin/route6d/Makefile
+++ b/usr.sbin/route6d/Makefile
@@ -6,6 +6,6 @@ MAN= route6d.8
CFLAGS+= -DHAVE_POLL_H
-WARNS?= 6
+WARNS?= 1
.include <bsd.prog.mk>
diff --git a/usr.sbin/route6d/route6d.8 b/usr.sbin/route6d/route6d.8
index db0e70f..121f5f2 100644
--- a/usr.sbin/route6d/route6d.8
+++ b/usr.sbin/route6d/route6d.8
@@ -16,7 +16,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 21, 2009
+.Dd January 31, 1997
.Dt ROUTE6D 8
.Os
.Sh NAME
@@ -26,15 +26,6 @@
.Nm
.Op Fl adDhlnqsS
.Bk -words
-.Op Fl p Ar pidfile
-.Ek
-.Bk -words
-.Op Fl P Ar protonum
-.Ek
-.Bk -words
-.Op Fl Q Ar protonum
-.Ek
-.Bk -words
.Op Fl R Ar routelog
.Ek
.Bk -words
@@ -71,29 +62,6 @@ statically defined routes will be removed unless corresponding updates
arrive as if the routes are received at the startup of
.Nm .
.\"
-.It Fl p Ar pidfile
-This option specifies PID filename as
-.Ar pidfile .
-The default value is
-.Pa /var/run/route6d.pid .
-.It Fl P Ar protonum
-This option makes the
-.Nm
-recognize a route with RTF_PROTO[123] flag as one with infinite lifetime. The
-.Ar protonum
-must be 1, 2, or 3 and they corresponds to RTF_PROTO1, RTF_PROTO2, and
-RTF_PROTO3, respectively. Multiple
-.Fl P
-flags are allowed.
-.It Fl Q Ar protonum
-This option makes the
-.Nm
-add RTF_PROTO[123] flags to routes which are obtained via RIP sessions. The
-.Ar protonum
-must be 1, 2, or 3 and they corresponds to RTF_PROTO1, RTF_PROTO2, and
-RTF_PROTO3, respectively. Multiple
-.Fl Q
-flags are allowed.
.It Fl R Ar routelog
This option makes the
.Nm
diff --git a/usr.sbin/route6d/route6d.c b/usr.sbin/route6d/route6d.c
index 761deeb..0205a03 100644
--- a/usr.sbin/route6d/route6d.c
+++ b/usr.sbin/route6d/route6d.c
@@ -31,14 +31,13 @@
*/
#ifndef lint
-static const char _rcsid[] = "$KAME: route6d.c,v 1.104 2003/10/31 00:30:20 itojun Exp $";
+static char _rcsid[] = "$KAME: route6d.c,v 1.104 2003/10/31 00:30:20 itojun Exp $";
#endif
#include <stdio.h>
#include <time.h>
#include <unistd.h>
-#include <fnmatch.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
@@ -79,7 +78,6 @@ static const char _rcsid[] = "$KAME: route6d.c,v 1.104 2003/10/31 00:30:20 itoju
#include "route6d.h"
#define MAXFILTER 40
-#define RT_DUMP_MAXRETRY 15
#ifdef DEBUG
#define INIT_INTERVAL6 6
@@ -105,7 +103,7 @@ static const char _rcsid[] = "$KAME: route6d.c,v 1.104 2003/10/31 00:30:20 itoju
} while (0)
struct ifc { /* Configuration of an interface */
- char ifc_name[IFNAMSIZ]; /* if name */
+ char *ifc_name; /* if name */
struct ifc *ifc_next;
int ifc_index; /* if index */
int ifc_mtu; /* if mtu */
@@ -114,6 +112,7 @@ struct ifc { /* Configuration of an interface */
short ifc_cflags; /* IFC_XXX */
struct in6_addr ifc_mylladdr; /* my link-local address */
struct sockaddr_in6 ifc_ripsin; /* rip multicast address */
+ struct iff *ifc_filter; /* filter structure */
struct ifac *ifc_addr; /* list of AF_INET6 addresses */
int ifc_joined; /* joined to ff02::9 */
};
@@ -127,7 +126,6 @@ struct ifac { /* Adddress associated to an interface */
};
struct iff {
- char iff_name[IFNAMSIZ];
int iff_type;
struct in6_addr iff_addr;
int iff_plen;
@@ -135,10 +133,9 @@ struct iff {
};
struct ifc *ifc;
-struct iff *iff_head;
int nifc; /* number of valid ifc's */
struct ifc **index2ifc;
-unsigned int nindex2ifc;
+int nindex2ifc;
struct ifc *loopifcp = NULL; /* pointing to loopback */
#ifdef HAVE_POLL_H
struct pollfd set[2];
@@ -184,8 +181,6 @@ int nflag = 0; /* don't update kernel routing table */
int aflag = 0; /* age out even the statically defined routes */
int hflag = 0; /* don't split horizon */
int lflag = 0; /* exchange site local routes */
-int Pflag = 0; /* don't age out routes with RTF_PROTO[123] */
-int Qflag = RTF_PROTO2; /* set RTF_PROTO[123] flag to routes by RIPng */
int sflag = 0; /* announce static routes w/ split horizon */
int Sflag = 0; /* announce static routes to every interface */
unsigned long routetag = 0; /* route tag attached on originating case */
@@ -227,7 +222,7 @@ int out_filter(struct riprt *, struct ifc *);
void init(void);
void sockopt(struct ifc *);
void ifconfig(void);
-int ifconfig1(const char *, const struct sockaddr *, struct ifc *, int);
+void ifconfig1(const char *, const struct sockaddr *, struct ifc *, int);
void rtrecv(void);
int rt_del(const struct sockaddr_in6 *, const struct sockaddr_in6 *,
const struct sockaddr_in6 *);
@@ -245,13 +240,12 @@ void applyplen(struct in6_addr *, int);
void ifrtdump(int);
void ifdump(int);
void ifdump0(FILE *, const struct ifc *);
-void ifremove(int);
void rtdump(int);
void rt_entry(struct rt_msghdr *, int);
void rtdexit(void);
void riprequest(struct ifc *, struct netinfo6 *, int,
struct sockaddr_in6 *);
-void ripflush(struct ifc *, struct sockaddr_in6 *, int, struct netinfo6 *np);
+void ripflush(struct ifc *, struct sockaddr_in6 *);
void sendrequest(struct ifc *);
int sin6mask2len(const struct sockaddr_in6 *);
int mask2len(const struct in6_addr *, int);
@@ -282,23 +276,16 @@ void setindex2ifc(int, struct ifc *);
#define MALLOC(type) ((type *)malloc(sizeof(type)))
-#define IFIL_TYPE_ANY 0
-#define IFIL_TYPE_A 'A'
-#define IFIL_TYPE_N 'N'
-#define IFIL_TYPE_T 'T'
-#define IFIL_TYPE_O 'O'
-#define IFIL_TYPE_L 'L'
-
int
-main(int argc, char *argv[])
+main(argc, argv)
+ int argc;
+ char **argv;
{
int ch;
int error = 0;
- unsigned long proto;
struct ifc *ifcp;
sigset_t mask, omask;
- const char *pidfile = ROUTE6D_PID;
- FILE *pidfh;
+ FILE *pidfile;
char *progname;
char *ep;
@@ -309,7 +296,7 @@ main(int argc, char *argv[])
progname = *argv;
pid = getpid();
- while ((ch = getopt(argc, argv, "A:N:O:R:T:L:t:adDhlnp:P:Q:qsS")) != -1) {
+ while ((ch = getopt(argc, argv, "A:N:O:R:T:L:t:adDhlnqsS")) != -1) {
switch (ch) {
case 'A':
case 'N':
@@ -331,41 +318,6 @@ main(int argc, char *argv[])
/*NOTREACHED*/
}
break;
- case 'p':
- pidfile = optarg;
- break;
- case 'P':
- ep = NULL;
- proto = strtoul(optarg, &ep, 0);
- if (!ep || *ep != '\0' || 3 < proto) {
- fatal("invalid P flag");
- /*NOTREACHED*/
- }
- if (proto == 0)
- Pflag = 0;
- if (proto == 1)
- Pflag |= RTF_PROTO1;
- if (proto == 2)
- Pflag |= RTF_PROTO2;
- if (proto == 3)
- Pflag |= RTF_PROTO3;
- break;
- case 'Q':
- ep = NULL;
- proto = strtoul(optarg, &ep, 0);
- if (!ep || *ep != '\0' || 3 < proto) {
- fatal("invalid Q flag");
- /*NOTREACHED*/
- }
- if (proto == 0)
- Qflag = 0;
- if (proto == 1)
- Qflag |= RTF_PROTO1;
- if (proto == 2)
- Qflag |= RTF_PROTO2;
- if (proto == 3)
- Qflag |= RTF_PROTO3;
- break;
case 'R':
if ((rtlog = fopen(optarg, "w")) == NULL) {
fatal("Can not write to routelog");
@@ -443,9 +395,9 @@ main(int argc, char *argv[])
#if 1
pid = getpid();
- if ((pidfh = fopen(pidfile, "w")) != NULL) {
- fprintf(pidfh, "%d\n", pid);
- fclose(pidfh);
+ if ((pidfile = fopen(ROUTE6D_PID, "w")) != NULL) {
+ fprintf(pidfile, "%d\n", pid);
+ fclose(pidfile);
}
#endif
@@ -476,7 +428,7 @@ main(int argc, char *argv[])
alarm(ripinterval(INIT_INTERVAL6));
for (ifcp = ifc; ifcp; ifcp = ifcp->ifc_next) {
- if (iff_find(ifcp, IFIL_TYPE_N))
+ if (iff_find(ifcp, 'N'))
continue;
if (ifcp->ifc_index > 0 && (ifcp->ifc_flags & IFF_UP))
sendrequest(ifcp);
@@ -543,7 +495,8 @@ main(int argc, char *argv[])
}
void
-sighandler(int signo)
+sighandler(signo)
+ int signo;
{
switch (signo) {
@@ -567,7 +520,7 @@ sighandler(int signo)
*/
/* ARGSUSED */
void
-rtdexit(void)
+rtdexit()
{
struct riprt *rrt;
@@ -594,7 +547,7 @@ rtdexit(void)
*/
/* ARGSUSED */
void
-ripalarm(void)
+ripalarm()
{
struct ifc *ifcp;
struct riprt *rrt, *rrt_prev, *rrt_next;
@@ -634,7 +587,7 @@ ripalarm(void)
}
void
-init(void)
+init()
{
int error;
const int int0 = 0, int1 = 1, int255 = 255;
@@ -782,8 +735,13 @@ init(void)
/*
* ripflush flushes the rip datagram stored in the rip buffer
*/
+static int nrt;
+static struct netinfo6 *np;
+
void
-ripflush(struct ifc *ifcp, struct sockaddr_in6 *sin6, int nrt, struct netinfo6 *np)
+ripflush(ifcp, sin6)
+ struct ifc *ifcp;
+ struct sockaddr_in6 *sin6;
{
int i;
int error;
@@ -825,19 +783,21 @@ ripflush(struct ifc *ifcp, struct sockaddr_in6 *sin6, int nrt, struct netinfo6 *
ifcp->ifc_name, inet6_n2p(&ifcp->ifc_ripsin.sin6_addr));
ifcp->ifc_flags &= ~IFF_UP; /* As if down for AF_INET6 */
}
+ nrt = 0; np = ripbuf->rip6_nets;
}
/*
* Generate RIP6_RESPONSE packets and send them.
*/
void
-ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
+ripsend(ifcp, sin6, flag)
+ struct ifc *ifcp;
+ struct sockaddr_in6 *sin6;
+ int flag;
{
struct riprt *rrt;
struct in6_addr *nh; /* next hop */
- struct netinfo6 *np;
int maxrte;
- int nrt;
if (qflag)
return;
@@ -851,9 +811,7 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
sizeof(struct udphdr) -
sizeof(struct rip6) + sizeof(struct netinfo6)) /
sizeof(struct netinfo6);
- nh = NULL;
- nrt = 0;
- np = ripbuf->rip6_nets;
+ nrt = 0; np = ripbuf->rip6_nets; nh = NULL;
for (rrt = riprt; rrt; rrt = rrt->rrt_next) {
if (rrt->rrt_rflags & RRTF_NOADVERTISE)
continue;
@@ -861,14 +819,12 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
*np = rrt->rrt_info;
np++; nrt++;
if (nrt == maxrte) {
- ripflush(NULL, sin6, nrt, np);
+ ripflush(NULL, sin6);
nh = NULL;
- nrt = 0;
- np = ripbuf->rip6_nets;
}
}
if (nrt) /* Send last packet */
- ripflush(NULL, sin6, nrt, np);
+ ripflush(NULL, sin6);
return;
}
@@ -877,11 +833,11 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
return;
/* -N: no use */
- if (iff_find(ifcp, IFIL_TYPE_N) != NULL)
+ if (iff_find(ifcp, 'N') != NULL)
return;
/* -T: generate default route only */
- if (iff_find(ifcp, IFIL_TYPE_T) != NULL) {
+ if (iff_find(ifcp, 'T') != NULL) {
struct netinfo6 rrt_info;
memset(&rrt_info, 0, sizeof(struct netinfo6));
rrt_info.rip6_dest = in6addr_any;
@@ -892,7 +848,7 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
np = ripbuf->rip6_nets;
*np = rrt_info;
nrt = 1;
- ripflush(ifcp, sin6, nrt, np);
+ ripflush(ifcp, sin6);
return;
}
@@ -924,13 +880,8 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
!IN6_IS_ADDR_UNSPECIFIED(&rrt->rrt_gw) &&
(rrt->rrt_rflags & RRTF_NH_NOT_LLADDR) == 0) {
if (nh == NULL || !IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw)) {
- if (nrt == maxrte - 2) {
- ripflush(ifcp, sin6, nrt, np);
- nh = NULL;
- nrt = 0;
- np = ripbuf->rip6_nets;
- }
-
+ if (nrt == maxrte - 2)
+ ripflush(ifcp, sin6);
np->rip6_dest = rrt->rrt_gw;
if (IN6_IS_ADDR_LINKLOCAL(&np->rip6_dest))
SET_IN6_LINKLOCAL_IFINDEX(np->rip6_dest, 0);
@@ -944,12 +895,8 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
!IN6_ARE_ADDR_EQUAL(nh, &rrt->rrt_gw) ||
rrt->rrt_rflags & RRTF_NH_NOT_LLADDR)) {
/* Reset nexthop */
- if (nrt == maxrte - 2) {
- ripflush(ifcp, sin6, nrt, np);
- nh = NULL;
- nrt = 0;
- np = ripbuf->rip6_nets;
- }
+ if (nrt == maxrte - 2)
+ ripflush(ifcp, sin6);
memset(np, 0, sizeof(struct netinfo6));
np->rip6_metric = NEXTHOP_METRIC;
nh = NULL;
@@ -960,21 +907,21 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
*np = rrt->rrt_info;
np++; nrt++;
if (nrt == maxrte) {
- ripflush(ifcp, sin6, nrt, np);
+ ripflush(ifcp, sin6);
nh = NULL;
- nrt = 0;
- np = ripbuf->rip6_nets;
}
}
if (nrt) /* Send last packet */
- ripflush(ifcp, sin6, nrt, np);
+ ripflush(ifcp, sin6);
}
/*
* outbound filter logic, per-route/interface.
*/
int
-out_filter(struct riprt *rrt, struct ifc *ifcp)
+out_filter(rrt, ifcp)
+ struct riprt *rrt;
+ struct ifc *ifcp;
{
struct iff *iffp;
struct in6_addr ia;
@@ -984,11 +931,9 @@ out_filter(struct riprt *rrt, struct ifc *ifcp)
* -A: filter out less specific routes, if we have aggregated
* route configured.
*/
- for (iffp = iff_head; iffp; iffp = iffp->iff_next) {
+ for (iffp = ifcp->ifc_filter; iffp; iffp = iffp->iff_next) {
if (iffp->iff_type != 'A')
continue;
- if (fnmatch(iffp->iff_name, ifcp->ifc_name, 0) != 0)
- continue;
if (rrt->rrt_info.rip6_plen <= iffp->iff_plen)
continue;
ia = rrt->rrt_info.rip6_dest;
@@ -1003,11 +948,9 @@ out_filter(struct riprt *rrt, struct ifc *ifcp)
*/
if ((rrt->rrt_rflags & RRTF_AGGREGATE) != 0) {
ok = 0;
- for (iffp = iff_head; iffp; iffp = iffp->iff_next) {
+ for (iffp = ifcp->ifc_filter; iffp; iffp = iffp->iff_next) {
if (iffp->iff_type != 'A')
continue;
- if (fnmatch(iffp->iff_name, ifcp->ifc_name, 0) != 0)
- continue;
if (rrt->rrt_info.rip6_plen == iffp->iff_plen &&
IN6_ARE_ADDR_EQUAL(&rrt->rrt_info.rip6_dest,
&iffp->iff_addr)) {
@@ -1022,13 +965,11 @@ out_filter(struct riprt *rrt, struct ifc *ifcp)
/*
* -O: advertise only if prefix matches the configured prefix.
*/
- if (iff_find(ifcp, IFIL_TYPE_O)) {
+ if (iff_find(ifcp, 'O')) {
ok = 0;
- for (iffp = iff_head; iffp; iffp = iffp->iff_next) {
+ for (iffp = ifcp->ifc_filter; iffp; iffp = iffp->iff_next) {
if (iffp->iff_type != 'O')
continue;
- if (fnmatch(iffp->iff_name, ifcp->ifc_name, 0) != 0)
- continue;
if (rrt->rrt_info.rip6_plen < iffp->iff_plen)
continue;
ia = rrt->rrt_info.rip6_dest;
@@ -1051,7 +992,9 @@ out_filter(struct riprt *rrt, struct ifc *ifcp)
* It checks options specified in the arguments and the split horizon rule.
*/
int
-tobeadv(struct riprt *rrt, struct ifc *ifcp)
+tobeadv(rrt, ifcp)
+ struct riprt *rrt;
+ struct ifc *ifcp;
{
/* Special care for static routes */
@@ -1076,7 +1019,9 @@ tobeadv(struct riprt *rrt, struct ifc *ifcp)
* Send a rip packet actually.
*/
int
-sendpacket(struct sockaddr_in6 *sin6, int len)
+sendpacket(sin6, len)
+ struct sockaddr_in6 *sin6;
+ int len;
{
struct msghdr m;
struct cmsghdr *cm;
@@ -1135,7 +1080,7 @@ sendpacket(struct sockaddr_in6 *sin6, int len)
* table if necessary.
*/
void
-riprecv(void)
+riprecv()
{
struct ifc *ifcp, *ic;
struct sockaddr_in6 fsock;
@@ -1202,7 +1147,7 @@ riprecv(void)
if (idx && IN6_IS_ADDR_LINKLOCAL(&fsock.sin6_addr))
SET_IN6_LINKLOCAL_IFINDEX(fsock.sin6_addr, idx);
- if ((size_t)len < sizeof(struct rip6)) {
+ if (len < sizeof(struct rip6)) {
trace(1, "Packet too short\n");
return;
}
@@ -1290,7 +1235,7 @@ riprecv(void)
}
/* -N: no use */
- if (iff_find(ifcp, IFIL_TYPE_N) != NULL)
+ if (iff_find(ifcp, 'N') != NULL)
return;
tracet(1, "Recv(%s): from %s.%d info(%d)\n",
@@ -1356,10 +1301,8 @@ riprecv(void)
* -L: listen only if the prefix matches the configuration
*/
ok = 1; /* if there's no L filter, it is ok */
- for (iffp = iff_head; iffp; iffp = iffp->iff_next) {
- if (iffp->iff_type != IFIL_TYPE_L)
- continue;
- if (fnmatch(iffp->iff_name, ifcp->ifc_name, 0) != 0)
+ for (iffp = ifcp->ifc_filter; iffp; iffp = iffp->iff_next) {
+ if (iffp->iff_type != 'L')
continue;
ok = 0;
if (np->rip6_plen < iffp->iff_plen)
@@ -1486,7 +1429,8 @@ riprecv(void)
* Send all routes request packet to the specified interface.
*/
void
-sendrequest(struct ifc *ifcp)
+sendrequest(ifcp)
+ struct ifc *ifcp;
{
struct netinfo6 *np;
int error;
@@ -1514,10 +1458,11 @@ sendrequest(struct ifc *ifcp)
* Process a RIP6_REQUEST packet.
*/
void
-riprequest(struct ifc *ifcp,
- struct netinfo6 *np,
- int nn,
- struct sockaddr_in6 *sin6)
+riprequest(ifcp, np, nn, sin6)
+ struct ifc *ifcp;
+ struct netinfo6 *np;
+ int nn;
+ struct sockaddr_in6 *sin6;
{
int i;
struct riprt *rrt;
@@ -1545,7 +1490,7 @@ riprequest(struct ifc *ifcp,
* Get information of each interface.
*/
void
-ifconfig(void)
+ifconfig()
{
struct ifaddrs *ifap, *ifa;
struct ifc *ifcp;
@@ -1580,8 +1525,9 @@ ifconfig(void)
ifcp->ifc_next = ifc;
ifc = ifcp;
nifc++;
- strlcpy(ifcp->ifc_name, ifa->ifa_name, sizeof(ifcp->ifc_name));
+ ifcp->ifc_name = allocopy(ifa->ifa_name);
ifcp->ifc_addr = 0;
+ ifcp->ifc_filter = 0;
ifcp->ifc_flags = ifa->ifa_flags;
trace(1, "newif %s <%s>\n", ifcp->ifc_name,
ifflags(ifcp->ifc_flags));
@@ -1597,10 +1543,7 @@ ifconfig(void)
}
ifcp->ifc_flags = ifa->ifa_flags;
}
- if (ifconfig1(ifa->ifa_name, ifa->ifa_addr, ifcp, s) < 0) {
- /* maybe temporary failure */
- continue;
- }
+ ifconfig1(ifa->ifa_name, ifa->ifa_addr, ifcp, s);
if ((ifcp->ifc_flags & (IFF_LOOPBACK | IFF_UP)) == IFF_UP
&& 0 < ifcp->ifc_index && !ifcp->ifc_joined) {
mreq.ipv6mr_multiaddr = ifcp->ifc_ripsin.sin6_addr;
@@ -1618,11 +1561,12 @@ ifconfig(void)
freeifaddrs(ifap);
}
-int
-ifconfig1(const char *name,
- const struct sockaddr *sa,
- struct ifc *ifcp,
- int s)
+void
+ifconfig1(name, sa, ifcp, s)
+ const char *name;
+ const struct sockaddr *sa;
+ struct ifc *ifcp;
+ int s;
{
struct in6_ifreq ifr;
const struct sockaddr_in6 *sin6;
@@ -1632,19 +1576,19 @@ ifconfig1(const char *name,
sin6 = (const struct sockaddr_in6 *)sa;
if (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) && !lflag)
- return -1;
+ return;
ifr.ifr_addr = *sin6;
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
if (ioctl(s, SIOCGIFNETMASK_IN6, (char *)&ifr) < 0) {
- syslog(LOG_INFO, "ioctl: SIOCGIFNETMASK_IN6");
- return -1;
+ fatal("ioctl: SIOCGIFNETMASK_IN6");
+ /*NOTREACHED*/
}
plen = sin6mask2len(&ifr.ifr_addr);
if ((ifa = ifa_match(ifcp, &sin6->sin6_addr, plen)) != NULL) {
/* same interface found */
/* need check if something changed */
/* XXX not yet implemented */
- return -1;
+ return;
}
/*
* New address is found
@@ -1692,38 +1636,6 @@ ifconfig1(const char *name,
ifcp->ifc_index, ifcp->ifc_mtu, ifcp->ifc_metric);
} else
ifcp->ifc_cflags |= IFC_CHANGED;
-
- return 0;
-}
-
-void
-ifremove(int ifindex)
-{
- struct ifc *ifcp;
- struct ifc *ifcp_prev = NULL;
- struct riprt *rrt;
-
- for (ifcp = ifc; ifcp; ifcp = ifcp->ifc_next) {
- if (ifcp->ifc_index == ifindex)
- break;
- ifcp_prev = ifcp;
- }
- if (ifcp == NULL)
- return;
-
- tracet(1, "ifremove: %s is departed.\n", ifcp->ifc_name);
- if (ifcp_prev == NULL) {
- ifc = ifcp->ifc_next;
- } else {
- ifcp_prev->ifc_next = ifcp->ifc_next;
- }
-
- for (rrt = riprt; rrt; rrt = rrt->rrt_next) {
- if (rrt->rrt_index == ifcp->ifc_index &&
- rrt->rrt_rflags & RRTF_AGGREGATE)
- delroute(&rrt->rrt_info, &rrt->rrt_gw);
- }
- free(ifcp);
}
/*
@@ -1731,35 +1643,30 @@ ifremove(int ifindex)
* Update interface information as necesssary.
*/
void
-rtrecv(void)
+rtrecv()
{
char buf[BUFSIZ];
- char *p, *q = NULL;
+ char *p, *q;
struct rt_msghdr *rtm;
struct ifa_msghdr *ifam;
struct if_msghdr *ifm;
- struct if_announcemsghdr *ifan;
int len;
struct ifc *ifcp, *ic;
int iface = 0, rtable = 0;
struct sockaddr_in6 *rta[RTAX_MAX];
struct sockaddr_in6 mask;
- int i, addrs = 0;
+ int i, addrs;
struct riprt *rrt;
if ((len = read(rtsock, buf, sizeof(buf))) < 0) {
perror("read from rtsock");
exit(1);
}
- if (len == 0)
- return;
-#if 0
if (len < sizeof(*rtm)) {
trace(1, "short read from rtsock: %d (should be > %lu)\n",
len, (u_long)sizeof(*rtm));
return;
}
-#endif
if (dflag >= 2) {
fprintf(stderr, "rtmsg:\n");
for (i = 0; i < len; i++) {
@@ -1770,9 +1677,6 @@ rtrecv(void)
}
for (p = buf; p - buf < len; p += ((struct rt_msghdr *)p)->rtm_msglen) {
- if (((struct rt_msghdr *)p)->rtm_version != RTM_VERSION)
- continue;
-
/* safety against bogus message */
if (((struct rt_msghdr *)p)->rtm_msglen <= 0) {
trace(1, "bogus rtmsg: length=%d\n",
@@ -1794,18 +1698,6 @@ rtrecv(void)
addrs = ifm->ifm_addrs;
q = (char *)(ifm + 1);
break;
- case RTM_IFANNOUNCE:
- ifan = (struct if_announcemsghdr *)p;
- switch (ifan->ifan_what) {
- case IFAN_ARRIVAL:
- iface++;
- break;
- case IFAN_DEPARTURE:
- ifremove(ifan->ifan_index);
- iface++;
- break;
- }
- break;
default:
rtm = (struct rt_msghdr *)p;
addrs = rtm->rtm_addrs;
@@ -1982,9 +1874,10 @@ rtrecv(void)
* remove specified route from the internal routing table.
*/
int
-rt_del(const struct sockaddr_in6 *sdst,
- const struct sockaddr_in6 *sgw,
- const struct sockaddr_in6 *smask)
+rt_del(sdst, sgw, smask)
+ const struct sockaddr_in6 *sdst;
+ const struct sockaddr_in6 *sgw;
+ const struct sockaddr_in6 *smask;
{
const struct in6_addr *dst = NULL;
const struct in6_addr *gw = NULL;
@@ -2080,9 +1973,10 @@ rt_del(const struct sockaddr_in6 *sdst,
* remove specified address from internal interface/routing table.
*/
int
-rt_deladdr(struct ifc *ifcp,
- const struct sockaddr_in6 *sifa,
- const struct sockaddr_in6 *smask)
+rt_deladdr(ifcp, sifa, smask)
+ struct ifc *ifcp;
+ const struct sockaddr_in6 *sifa;
+ const struct sockaddr_in6 *smask;
{
const struct in6_addr *addr = NULL;
int prefix;
@@ -2191,7 +2085,9 @@ rt_deladdr(struct ifc *ifcp,
* list.
*/
int
-ifrt(struct ifc *ifcp, int again)
+ifrt(ifcp, again)
+ struct ifc *ifcp;
+ int again;
{
struct ifac *ifa;
struct riprt *rrt = NULL, *search_rrt, *prev_rrt, *loop_rrt;
@@ -2306,7 +2202,9 @@ ifrt(struct ifc *ifcp, int again)
* since BSD kernels do not look at prefix length on p2p interfaces.
*/
void
-ifrt_p2p(struct ifc *ifcp, int again)
+ifrt_p2p(ifcp, again)
+ struct ifc *ifcp;
+ int again;
{
struct ifac *ifa;
struct riprt *rrt, *orrt, *prevrrt;
@@ -2474,7 +2372,8 @@ ifrt_p2p(struct ifc *ifcp, int again)
}
int
-getifmtu(int ifindex)
+getifmtu(ifindex)
+ int ifindex;
{
int mib[6];
char *buf;
@@ -2511,7 +2410,8 @@ getifmtu(int ifindex)
}
const char *
-rttypes(struct rt_msghdr *rtm)
+rttypes(rtm)
+ struct rt_msghdr *rtm;
{
#define RTTYPE(s, f) \
do { \
@@ -2554,7 +2454,8 @@ do { \
}
const char *
-rtflags(struct rt_msghdr *rtm)
+rtflags(rtm)
+ struct rt_msghdr *rtm;
{
static char buf[BUFSIZ];
@@ -2623,7 +2524,8 @@ do { \
}
const char *
-ifflags(int flags)
+ifflags(flags)
+ int flags;
{
static char buf[BUFSIZ];
@@ -2662,7 +2564,8 @@ do { \
}
void
-krtread(int again)
+krtread(again)
+ int again;
{
int mib[6];
size_t msize;
@@ -2680,8 +2583,6 @@ krtread(int again)
mib[4] = NET_RT_DUMP; /* Dump the kernel routing table */
mib[5] = 0; /* No flags */
do {
- if (retry)
- sleep(1);
retry++;
errmsg = NULL;
if (buf)
@@ -2698,7 +2599,7 @@ krtread(int again)
errmsg = "sysctl NET_RT_DUMP";
continue;
}
- } while (retry < RT_DUMP_MAXRETRY && errmsg != NULL);
+ } while (retry < 5 && errmsg != NULL);
if (errmsg) {
fatal("%s (with %d retries, msize=%lu)", errmsg, retry,
(u_long)msize);
@@ -2715,14 +2616,16 @@ krtread(int again)
}
void
-rt_entry(struct rt_msghdr *rtm, int again)
+rt_entry(rtm, again)
+ struct rt_msghdr *rtm;
+ int again;
{
struct sockaddr_in6 *sin6_dst, *sin6_gw, *sin6_mask;
struct sockaddr_in6 *sin6_genmask, *sin6_ifp;
char *rtmp, *ifname = NULL;
struct riprt *rrt, *orrt;
struct netinfo6 *np;
- int ifindex;
+ int s;
sin6_dst = sin6_gw = sin6_mask = sin6_genmask = sin6_ifp = 0;
if ((rtm->rtm_flags & RTF_UP) == 0 || rtm->rtm_flags &
@@ -2738,9 +2641,6 @@ rt_entry(struct rt_msghdr *rtm, int again)
if (rtm->rtm_flags & RTF_CLONED)
return;
#endif
- /* XXX: Ignore connected routes. */
- if (!(rtm->rtm_flags & (RTF_GATEWAY|RTF_HOST|RTF_STATIC)))
- return;
/*
* do not look at dynamic routes.
* netbsd/openbsd cloned routes have UGHD.
@@ -2790,8 +2690,6 @@ rt_entry(struct rt_msghdr *rtm, int again)
rrt->rrt_t = time(NULL);
if (aflag == 0 && (rtm->rtm_flags & RTF_STATIC))
rrt->rrt_t = 0; /* Don't age static routes */
- if (rtm->rtm_flags & Pflag)
- rrt->rrt_t = 0; /* Don't age PROTO[123] routes */
if ((rtm->rtm_flags & (RTF_HOST|RTF_GATEWAY)) == RTF_HOST)
rrt->rrt_t = 0; /* Don't age non-gateway host routes */
np->rip6_tag = 0;
@@ -2837,16 +2735,16 @@ rt_entry(struct rt_msghdr *rtm, int again)
trace(1, " gw %s", inet6_n2p(&rrt->rrt_gw));
/* Interface */
- ifindex = rtm->rtm_index;
- if ((unsigned int)ifindex < nindex2ifc && index2ifc[ifindex])
- ifname = index2ifc[ifindex]->ifc_name;
+ s = rtm->rtm_index;
+ if (s < nindex2ifc && index2ifc[s])
+ ifname = index2ifc[s]->ifc_name;
else {
trace(1, " not configured\n");
free(rrt);
return;
}
- trace(1, " if %s sock %d", ifname, ifindex);
- rrt->rrt_index = ifindex;
+ trace(1, " if %s sock %d", ifname, s);
+ rrt->rrt_index = s;
trace(1, "\n");
@@ -2877,9 +2775,10 @@ rt_entry(struct rt_msghdr *rtm, int again)
}
int
-addroute(struct riprt *rrt,
- const struct in6_addr *gw,
- struct ifc *ifcp)
+addroute(rrt, gw, ifcp)
+ struct riprt *rrt;
+ const struct in6_addr *gw;
+ struct ifc *ifcp;
{
struct netinfo6 *np;
u_char buf[BUFSIZ], buf1[BUFSIZ], buf2[BUFSIZ];
@@ -2907,7 +2806,6 @@ addroute(struct riprt *rrt,
rtm->rtm_seq = ++seq;
rtm->rtm_pid = pid;
rtm->rtm_flags = rrt->rrt_flags;
- rtm->rtm_flags |= Qflag;
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
rtm->rtm_rmx.rmx_hopcount = np->rip6_metric - 1;
rtm->rtm_inits = RTV_HOPCOUNT;
@@ -2950,7 +2848,9 @@ addroute(struct riprt *rrt,
}
int
-delroute(struct netinfo6 *np, struct in6_addr *gw)
+delroute(np, gw)
+ struct netinfo6 *np;
+ struct in6_addr *gw;
{
u_char buf[BUFSIZ], buf2[BUFSIZ];
struct rt_msghdr *rtm;
@@ -2973,7 +2873,6 @@ delroute(struct netinfo6 *np, struct in6_addr *gw)
rtm->rtm_seq = ++seq;
rtm->rtm_pid = pid;
rtm->rtm_flags = RTF_UP | RTF_GATEWAY;
- rtm->rtm_flags |= Qflag;
if (np->rip6_plen == sizeof(struct in6_addr) * 8)
rtm->rtm_flags |= RTF_HOST;
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
@@ -3016,7 +2915,9 @@ delroute(struct netinfo6 *np, struct in6_addr *gw)
}
struct in6_addr *
-getroute(struct netinfo6 *np, struct in6_addr *gw)
+getroute(np, gw)
+ struct netinfo6 *np;
+ struct in6_addr *gw;
{
u_char buf[BUFSIZ];
int myseq;
@@ -3063,7 +2964,8 @@ getroute(struct netinfo6 *np, struct in6_addr *gw)
}
const char *
-inet6_n2p(const struct in6_addr *p)
+inet6_n2p(p)
+ const struct in6_addr *p;
{
static char buf[BUFSIZ];
@@ -3071,7 +2973,8 @@ inet6_n2p(const struct in6_addr *p)
}
void
-ifrtdump(int sig)
+ifrtdump(sig)
+ int sig;
{
ifdump(sig);
@@ -3079,7 +2982,8 @@ ifrtdump(int sig)
}
void
-ifdump(int sig)
+ifdump(sig)
+ int sig;
{
struct ifc *ifcp;
FILE *dump;
@@ -3099,11 +3003,10 @@ ifdump(int sig)
if (i == 0) {
if ((ifcp->ifc_flags & IFF_UP) == 0)
continue;
- if (iff_find(ifcp, IFIL_TYPE_N) != NULL)
+ if (iff_find(ifcp, 'N') != NULL)
continue;
} else {
- if ((ifcp->ifc_flags & IFF_UP) &&
- iff_find(ifcp, IFIL_TYPE_N) == NULL)
+ if (ifcp->ifc_flags & IFF_UP)
continue;
}
ifdump0(dump, ifcp);
@@ -3115,7 +3018,9 @@ ifdump(int sig)
}
void
-ifdump0(FILE *dump, const struct ifc *ifcp)
+ifdump0(dump, ifcp)
+ FILE *dump;
+ const struct ifc *ifcp;
{
struct ifac *ifa;
struct iff *iffp;
@@ -3140,22 +3045,20 @@ ifdump0(FILE *dump, const struct ifc *ifcp)
ifa->ifa_plen);
}
}
- if (1) {
+ if (ifcp->ifc_filter) {
fprintf(dump, "\tFilter:");
- for (iffp = iff_head; iffp; iffp = iffp->iff_next) {
- if (fnmatch(iffp->iff_name, ifcp->ifc_name, 0) != 0)
- continue;
+ for (iffp = ifcp->ifc_filter; iffp; iffp = iffp->iff_next) {
addr = 0;
switch (iffp->iff_type) {
- case IFIL_TYPE_A:
+ case 'A':
ft = "Aggregate"; addr++; break;
- case IFIL_TYPE_N:
+ case 'N':
ft = "No-use"; break;
- case IFIL_TYPE_O:
+ case 'O':
ft = "Advertise-only"; addr++; break;
- case IFIL_TYPE_T:
+ case 'T':
ft = "Default-only"; break;
- case IFIL_TYPE_L:
+ case 'L':
ft = "Listen-only"; addr++; break;
default:
snprintf(buf, sizeof(buf), "Unknown-%c", iffp->iff_type);
@@ -3174,7 +3077,8 @@ ifdump0(FILE *dump, const struct ifc *ifcp)
}
void
-rtdump(int sig)
+rtdump(sig)
+ int sig;
{
struct riprt *rrt;
char buf[BUFSIZ];
@@ -3223,12 +3127,12 @@ rtdump(int sig)
* -O 5f09:c400::/32,ef0,ef1 (only when match)
*/
void
-filterconfig(void)
+filterconfig()
{
int i;
char *p, *ap, *iflp, *ifname, *ep;
- struct iff ftmp, *iffp;
- struct ifc ctmp, *ifcp;
+ struct iff ftmp, *iff_obj;
+ struct ifc *ifcp;
struct riprt *rrt;
#if 0
struct in6_addr gw;
@@ -3239,8 +3143,7 @@ filterconfig(void)
ap = filter[i];
iflp = NULL;
ifcp = NULL;
- memset(&ftmp, 0, sizeof(ftmp));
- if (filtertype[i] == IFIL_TYPE_N || filtertype[i] == IFIL_TYPE_T) {
+ if (filtertype[i] == 'N' || filtertype[i] == 'T') {
iflp = ap;
goto ifonly;
}
@@ -3278,19 +3181,21 @@ ifonly:
ifname = iflp;
if ((iflp = strchr(iflp, ',')) != NULL)
*iflp++ = '\0';
- strlcpy(ctmp.ifc_name, ifname, sizeof(ctmp.ifc_name));
- strlcpy(ftmp.iff_name, ifname, sizeof(ftmp.iff_name));
-#if 0
- syslog(LOG_INFO, "Add filter: type %d, ifname %s.", ftmp.iff_type, ifname);
-#endif
- iffp = malloc(sizeof(struct iff));
- if (iffp == NULL) {
- fatal("malloc of iff");
+ ifcp = ifc_find(ifname);
+ if (ifcp == NULL) {
+ fatal("no interface %s exists", ifname);
+ /*NOTREACHED*/
+ }
+ iff_obj = (struct iff *)malloc(sizeof(struct iff));
+ if (iff_obj == NULL) {
+ fatal("malloc of iff_obj");
/*NOTREACHED*/
}
- ftmp.iff_next = iff_head;
- iff_head = iffp;
- memcpy(iffp, &ftmp, sizeof(struct iff));
+ memcpy((void *)iff_obj, (void *)&ftmp,
+ sizeof(struct iff));
+ /* link it to the interface filter */
+ iff_obj->iff_next = ifcp->ifc_filter;
+ ifcp->ifc_filter = iff_obj;
}
/*
@@ -3338,7 +3243,7 @@ ifonly:
riprt = rrt;
trace(1, "Aggregate: %s/%d for %s\n",
inet6_n2p(&ftmp.iff_addr), ftmp.iff_plen,
- ftmp.iff_name);
+ ifcp->ifc_name);
/* Add this route to the kernel */
if (nflag) /* do not modify kernel routing table */
continue;
@@ -3353,9 +3258,10 @@ ifonly:
* with the address and prefix length specified in the arguments.
*/
struct ifac *
-ifa_match(const struct ifc *ifcp,
- const struct in6_addr *ia,
- int plen)
+ifa_match(ifcp, ia, plen)
+ const struct ifc *ifcp;
+ const struct in6_addr *ia;
+ int plen;
{
struct ifac *ifa;
@@ -3373,7 +3279,9 @@ ifa_match(const struct ifc *ifcp,
* Note: This is not a rtalloc(). Therefore exact match is necessary.
*/
struct riprt *
-rtsearch(struct netinfo6 *np, struct riprt **prev_rrt)
+rtsearch(np, prev_rrt)
+ struct netinfo6 *np;
+ struct riprt **prev_rrt;
{
struct riprt *rrt;
@@ -3393,7 +3301,8 @@ rtsearch(struct netinfo6 *np, struct riprt **prev_rrt)
}
int
-sin6mask2len(const struct sockaddr_in6 *sin6)
+sin6mask2len(sin6)
+ const struct sockaddr_in6 *sin6;
{
return mask2len(&sin6->sin6_addr,
@@ -3401,7 +3310,9 @@ sin6mask2len(const struct sockaddr_in6 *sin6)
}
int
-mask2len(const struct in6_addr *addr, int lenlim)
+mask2len(addr, lenlim)
+ const struct in6_addr *addr;
+ int lenlim;
{
int i = 0, j;
const u_char *p = (const u_char *)addr;
@@ -3428,7 +3339,8 @@ mask2len(const struct in6_addr *addr, int lenlim)
}
void
-applymask(struct in6_addr *addr, struct in6_addr *mask)
+applymask(addr, mask)
+ struct in6_addr *addr, *mask;
{
int i;
u_long *p, *q;
@@ -3443,7 +3355,9 @@ static const u_char plent[8] = {
};
void
-applyplen(struct in6_addr *ia, int plen)
+applyplen(ia, plen)
+ struct in6_addr *ia;
+ int plen;
{
u_char *p;
int i;
@@ -3463,7 +3377,8 @@ static const int pl2m[9] = {
};
struct in6_addr *
-plen2mask(int n)
+plen2mask(n)
+ int n;
{
static struct in6_addr ia;
u_char *p;
@@ -3483,7 +3398,8 @@ plen2mask(int n)
}
char *
-allocopy(char *p)
+allocopy(p)
+ char *p;
{
int len = strlen(p) + 1;
char *q = (char *)malloc(len);
@@ -3498,7 +3414,7 @@ allocopy(char *p)
}
char *
-hms(void)
+hms()
{
static char buf[BUFSIZ];
time_t t;
@@ -3517,7 +3433,8 @@ hms(void)
#define RIPRANDDEV 1.0 /* 30 +- 15, max - min = 30 */
int
-ripinterval(int timer)
+ripinterval(timer)
+ int timer;
{
double r = rand();
@@ -3527,7 +3444,7 @@ ripinterval(int timer)
}
time_t
-ripsuptrig(void)
+ripsuptrig()
{
time_t t;
@@ -3637,7 +3554,7 @@ trace(level, fmt, va_alist)
}
unsigned int
-if_maxindex(void)
+if_maxindex()
{
struct if_nameindex *p, *p0;
unsigned int max = 0;
@@ -3652,7 +3569,8 @@ if_maxindex(void)
}
struct ifc *
-ifc_find(char *name)
+ifc_find(name)
+ char *name;
{
struct ifc *ifcp;
@@ -3664,23 +3582,23 @@ ifc_find(char *name)
}
struct iff *
-iff_find(struct ifc *ifcp, int type)
+iff_find(ifcp, type)
+ struct ifc *ifcp;
+ int type;
{
struct iff *iffp;
- for (iffp = iff_head; iffp; iffp = iffp->iff_next) {
- if (fnmatch(iffp->iff_name, ifcp->ifc_name, 0) == 0) {
- if (type == IFIL_TYPE_ANY ||
- type == iffp->iff_type) {
- return iffp;
- }
- }
+ for (iffp = ifcp->ifc_filter; iffp; iffp = iffp->iff_next) {
+ if (iffp->iff_type == type)
+ return iffp;
}
return NULL;
}
void
-setindex2ifc(int idx, struct ifc *ifcp)
+setindex2ifc(idx, ifcp)
+ int idx;
+ struct ifc *ifcp;
{
int n, nsize;
struct ifc **p;
diff --git a/usr.sbin/rpc.yppasswdd/Makefile b/usr.sbin/rpc.yppasswdd/Makefile
index 2f01e28..b6a0a8c 100644
--- a/usr.sbin/rpc.yppasswdd/Makefile
+++ b/usr.sbin/rpc.yppasswdd/Makefile
@@ -5,20 +5,12 @@ RPCDIR= ${DESTDIR}/usr/include/rpcsvc
.PATH: ${.CURDIR}/../../usr.sbin/ypserv ${.CURDIR}/../../usr.bin/chpass \
${.CURDIR}/../../libexec/ypxfr ${RPCDIR}
-.include <bsd.own.mk>
-
PROG= rpc.yppasswdd
SCRIPTS=yppwupdate
SCRIPTSDIR= /usr/libexec
MAN= rpc.yppasswdd.8
SRCS= util.c yp_access.c yp_dblookup.c yp_dbwrite.c \
yp_error.c yppasswdd_main.c yppasswdd_server.c ypxfr_misc.c ${GENSRCS}
-.if ${MK_INET_SUPPORT} != "no"
-SRCS+= yp_access_inet.c
-.endif
-.if ${MK_INET6_SUPPORT} != "no"
-SRCS+= yp_access_inet6.c
-.endif
GENSRCS=yp.h yp_clnt.c yppasswd.h yppasswd_private.h yppasswd_private_svc.c \
yppasswd_private_xdr.c yppasswd_svc.c
diff --git a/usr.sbin/rpc.yppasswdd/yppasswdd_extern.h b/usr.sbin/rpc.yppasswdd/yppasswdd_extern.h
index 901b75f..db15be2 100644
--- a/usr.sbin/rpc.yppasswdd/yppasswdd_extern.h
+++ b/usr.sbin/rpc.yppasswdd/yppasswdd_extern.h
@@ -46,6 +46,8 @@
#define MAP_UPDATE "yppwupdate"
#define MAP_UPDATE_PATH YPLIBDIR "yppwupdate"
+extern char *yp_dir;
+extern char *progname;
extern void do_master(void);
extern void yppasswdprog_1(struct svc_req *, register SVCXPRT *);
extern void master_yppasswdprog_1(struct svc_req *, register SVCXPRT *);
diff --git a/usr.sbin/rpc.yppasswdd/yppasswdd_main.c b/usr.sbin/rpc.yppasswdd/yppasswdd_main.c
index 2311384..38719c4 100644
--- a/usr.sbin/rpc.yppasswdd/yppasswdd_main.c
+++ b/usr.sbin/rpc.yppasswdd/yppasswdd_main.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <signal.h>
#include <stdio.h>
#include <stdlib.h> /* getenv, exit */
-#include <string.h>
#include <string.h> /* strcmp */
#include <syslog.h>
#include <unistd.h>
@@ -86,8 +85,10 @@ static int _rpcfdtype;
static char _localhost[] = "localhost";
static char _passwd_byname[] = "passwd.byname";
extern int _rpcsvcstate; /* Set when a request is serviced */
-const char *progname = "rpc.yppasswdd";
-const char *yp_dir = _PATH_YP;
+static char _progname[] = "rpc.yppasswdd";
+char *progname = _progname;
+static char _yp_dir[] = _PATH_YP;
+char *yp_dir = _yp_dir;
static char _passfile_default[] = _PATH_YP "master.passwd";
char *passfile_default = _passfile_default;
char *passfile;
diff --git a/usr.sbin/rpc.ypupdated/update.c b/usr.sbin/rpc.ypupdated/update.c
index 72a7128..956b057 100644
--- a/usr.sbin/rpc.ypupdated/update.c
+++ b/usr.sbin/rpc.ypupdated/update.c
@@ -57,7 +57,6 @@ static const char rcsid[] =
#include <pwd.h>
#include <string.h>
#include <sys/resource.h>
-#include <stdlib.h>
#include "ypupdated_extern.h"
#ifdef YP
diff --git a/usr.sbin/rpc.ypupdated/ypupdated_main.c b/usr.sbin/rpc.ypupdated/ypupdated_main.c
index f02ad24..92d8374 100644
--- a/usr.sbin/rpc.ypupdated/ypupdated_main.c
+++ b/usr.sbin/rpc.ypupdated/ypupdated_main.c
@@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$");
#include <sys/wait.h>
#include <errno.h>
#include <err.h>
-#include <stdlib.h>
#include <unistd.h>
#include "ypupdated_extern.h"
#include "yp_extern.h"
@@ -75,8 +74,8 @@ static int _rpcfdtype;
extern int _rpcsvcstate; /* Set when a request is serviced */
-const char *progname = "rpc.ypupdated";
-const char *yp_dir = _PATH_YP;
+char *progname = "rpc.ypupdated";
+char *yp_dir = "/var/yp/";
static void
_msgout(char* msg)
diff --git a/usr.sbin/rpc.ypupdated/ypupdated_server.c b/usr.sbin/rpc.ypupdated/ypupdated_server.c
index c9a50dd..c4e163a 100644
--- a/usr.sbin/rpc.ypupdated/ypupdated_server.c
+++ b/usr.sbin/rpc.ypupdated/ypupdated_server.c
@@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$");
#include <rpc/rpc.h>
#include <rpc/key_prot.h>
#include <sys/param.h>
-#include <sys/cdefs.h>
#include <rpcsvc/yp.h>
#include "ypupdate_prot.h"
#include "ypupdated_extern.h"
diff --git a/usr.sbin/rpc.ypxfrd/Makefile b/usr.sbin/rpc.ypxfrd/Makefile
index 3b5478c..ee9e242 100644
--- a/usr.sbin/rpc.ypxfrd/Makefile
+++ b/usr.sbin/rpc.ypxfrd/Makefile
@@ -1,21 +1,13 @@
# $FreeBSD$
-.PATH: ${.CURDIR}/../ypserv
-
-.include <bsd.own.mk>
+.PATH: ${.CURDIR}/../../usr.sbin/ypserv
PROG= rpc.ypxfrd
MAN= rpc.ypxfrd.8
SRCS= ypxfrd_svc.c ypxfrd.h ypxfrd_server.c yp_error.c \
yp_access.c ypxfrd_main.c
-.if ${MK_INET_SUPPORT} != "no"
-SRCS+= yp_access_inet.c
-.endif
-.if ${MK_INET6_SUPPORT} != "no"
-SRCS+= yp_access_inet6.c
-.endif
-
-CFLAGS+= -I. -I${.CURDIR}/../ypserv -DXFRBLOCKSIZE=65535
+
+CFLAGS+= -I. -DXFRBLOCKSIZE=65535
WARNS?= 2
diff --git a/usr.sbin/rpc.ypxfrd/ypxfrd_extern.h b/usr.sbin/rpc.ypxfrd/ypxfrd_extern.h
index ba4259c..5aba934 100644
--- a/usr.sbin/rpc.ypxfrd/ypxfrd_extern.h
+++ b/usr.sbin/rpc.ypxfrd/ypxfrd_extern.h
@@ -42,4 +42,9 @@
extern int forked;
extern int children;
+extern void load_securenets(void);
+extern void yp_error(const char *, ...);
+extern int yp_access(const char *, const struct svc_req *);
+extern int yp_validdomain(const char *);
+extern char *yp_dir;
extern void ypxfrd_freebsd_prog_1(struct svc_req *, register SVCXPRT *);
diff --git a/usr.sbin/rpc.ypxfrd/ypxfrd_main.c b/usr.sbin/rpc.ypxfrd/ypxfrd_main.c
index 8970497..8fa3e22 100644
--- a/usr.sbin/rpc.ypxfrd/ypxfrd_main.c
+++ b/usr.sbin/rpc.ypxfrd/ypxfrd_main.c
@@ -52,12 +52,10 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <netinet/in.h>
#include <syslog.h>
+#include "ypxfrd_extern.h"
#include <sys/wait.h>
#include <errno.h>
-#include "ypxfrd_extern.h"
-#include "yp_extern.h"
-
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
@@ -78,8 +76,8 @@ static int _rpcfdtype;
extern int _rpcsvcstate; /* Set when a request is serviced */
-const char *progname = "rpc.ypxfrd";
-const char *yp_dir = _PATH_YP;
+char *progname = "rpc.ypxfrd";
+char *yp_dir = "/var/yp/";
static void
_msgout(char *msg)
diff --git a/usr.sbin/rpc.ypxfrd/ypxfrd_server.c b/usr.sbin/rpc.ypxfrd/ypxfrd_server.c
index 401711e..5f60712 100644
--- a/usr.sbin/rpc.ypxfrd/ypxfrd_server.c
+++ b/usr.sbin/rpc.ypxfrd/ypxfrd_server.c
@@ -46,7 +46,6 @@ __FBSDID("$FreeBSD$");
#include <sys/fcntl.h>
#include <machine/endian.h>
#include "ypxfrd_extern.h"
-#include "yp_extern.h"
int forked = 0;
int children = 0;
diff --git a/usr.sbin/rpcbind/rpcb_stat.c b/usr.sbin/rpcbind/rpcb_stat.c
index b10ed50..3061754 100644
--- a/usr.sbin/rpcbind/rpcb_stat.c
+++ b/usr.sbin/rpcbind/rpcb_stat.c
@@ -54,7 +54,7 @@
static rpcb_stat_byvers inf;
void
-rpcbs_init()
+rpcbs_init(void)
{
}
diff --git a/usr.sbin/rpcbind/rpcb_svc_com.c b/usr.sbin/rpcbind/rpcb_svc_com.c
index 79cb937..f90dc59 100644
--- a/usr.sbin/rpcbind/rpcb_svc_com.c
+++ b/usr.sbin/rpcbind/rpcb_svc_com.c
@@ -1076,7 +1076,7 @@ netbuffree(struct netbuf *ap)
extern bool_t __svc_clean_idle(fd_set *, int, bool_t);
void
-my_svc_run()
+my_svc_run(void)
{
size_t nfds;
struct pollfd pollfds[FD_SETSIZE];
diff --git a/usr.sbin/rpcbind/rpcbind.c b/usr.sbin/rpcbind/rpcbind.c
index 5a76a68..dff0b08 100644
--- a/usr.sbin/rpcbind/rpcbind.c
+++ b/usr.sbin/rpcbind/rpcbind.c
@@ -178,12 +178,13 @@ main(int argc, char *argv[])
init_transport(nconf);
while ((nconf = getnetconfig(nc_handle))) {
- if (nconf->nc_flag & NC_VISIBLE)
+ if (nconf->nc_flag & NC_VISIBLE) {
if (ipv6_only == 1 && strcmp(nconf->nc_protofmly,
"inet") == 0) {
/* DO NOTHING */
} else
init_transport(nconf);
+ }
}
endnetconfig(nc_handle);
@@ -766,7 +767,7 @@ terminate(int dummy __unused)
}
void
-rpcbind_abort()
+rpcbind_abort(void)
{
#ifdef WARMSTART
write_warmstart(); /* Dump yourself */
diff --git a/usr.sbin/rpcbind/util.c b/usr.sbin/rpcbind/util.c
index 6c41253..16e6f70 100644
--- a/usr.sbin/rpcbind/util.c
+++ b/usr.sbin/rpcbind/util.c
@@ -283,7 +283,7 @@ freeit:
}
void
-network_init()
+network_init(void)
{
#ifdef INET6
struct ifaddrs *ifap, *ifp;
diff --git a/usr.sbin/rpcbind/warmstart.c b/usr.sbin/rpcbind/warmstart.c
index 410f270..fc0956f 100644
--- a/usr.sbin/rpcbind/warmstart.c
+++ b/usr.sbin/rpcbind/warmstart.c
@@ -142,7 +142,7 @@ error: fprintf(stderr, "rpcbind: will start from scratch\n");
}
void
-write_warmstart()
+write_warmstart(void)
{
(void) write_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &list_rbl);
#ifdef PORTMAP
@@ -152,7 +152,7 @@ write_warmstart()
}
void
-read_warmstart()
+read_warmstart(void)
{
rpcblist_ptr tmp_rpcbl = NULL;
#ifdef PORTMAP
diff --git a/usr.sbin/rtadvctl/Makefile b/usr.sbin/rtadvctl/Makefile
index 3200288..a66db84c4 100644
--- a/usr.sbin/rtadvctl/Makefile
+++ b/usr.sbin/rtadvctl/Makefile
@@ -7,7 +7,7 @@ MAN= rtadvctl.8
SRCS= rtadvctl.c control.c control_client.c if.c timer_subr.c
-CFLAGS+= -DROUTEINFO -I${.CURDIR} -I${.CURDIR}/../rtadvd
-WARNS?= 3
+CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../rtadvd
+WARNS?= 1
.include <bsd.prog.mk>
diff --git a/usr.sbin/rtadvctl/rtadvctl.8 b/usr.sbin/rtadvctl/rtadvctl.8
index 81cfa07..b9c0f2e 100644
--- a/usr.sbin/rtadvctl/rtadvctl.8
+++ b/usr.sbin/rtadvctl/rtadvctl.8
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 14, 2011
+.Dd July 16, 2011
.Dt RTADVCTL 8
.Os
.Sh NAME
@@ -39,54 +39,65 @@
.Op Ar interface ...
.Sh DESCRIPTION
.Nm
-is a utility that communicates
+is a utility that communicates with
.Xr rtadvd 8
-daemon and displays information on Router Advertisement messages being
-sent on each interfaces.
+daemon and displays information about Router Advertisement messages being
+sent on each interface.
.Pp
This utility provides several options and subcommands.
The options are as follows:
.Bl -tag -width indent
.\"
.It Fl v
-Increase verbose level. When specified once, the
+Increase verbosity level.
+When specified once, the
.Nm
-utility shows additional information on prefixes, RDNSS, and DNSSL
+utility shows additional information about prefixes, RDNSS, and DNSSL
options.
-When twice, it shows information on inactive interfaces and
-some statistics.
+When given twice, it additionally shows information about
+inactive interfaces and some statistics.
.El
.Pp
The subcommands are as follows:
.Bl -tag -width indent
.\"
-.It reload
-Specifies reloading the configuration file.
+.It reload Op interfaces...
+Specifies to reload the configuration file. If one or more
+.Ar interface
+is specified, configuration entries for the interfaces will be reloaded
+selectively.
+.It enable interfaces...
+Specifies to mark the interface as enable and to try to reload the
+configuration entry.
+This subcommand is useful for dynamically-added interfaces.
+.Pp
+The
+.Xr rtadvd 8
+daemon marks an interface as enable if the interface exists and the
+configuration file has a valid entry for that when it is invoked.
+.It disable interfaces...
+Specifies to mark the interface as disable.
.It shutdown
-Makes
+Makes the
+.Xr rtadvd 8
+daemon shut down.
+Note that the
.Xr rtadvd 8
-daemon shut down immediately.
+daemon will send several RAs with zero lifetime to invalidate the old
+information on each interface.
+It will take at most nine seconds.
.It show Op interfaces...
Displays information on Router Advertisement messages being sent
-on each interfaces.
+on each interface.
.Sh SEE ALSO
-.Xr rtadv 8 ,
+.Xr rtadvd 8 ,
.Xr rtadvd.conf 5
.Sh HISTORY
The
.Nm
command first appeared in
.Fx 9.0 .
-.Sh BUGS
-The
-.Xr rtadvd 8
-daemon stops responding to
-.Nm
-for a while just after reloading the configuration file by the reload
-subcommand.
-This is because in the current implementation it cannot communicate
-with
+.Sh AUTHORS
.Nm
-during sending some additional RAs for graceful transition from one
-configuration to another.
-It will take at most nine seconds for each interface.
+was written by
+.An "Hiroki Sato" Aq hrs@FreeBSD.org .
diff --git a/usr.sbin/rtadvctl/rtadvctl.c b/usr.sbin/rtadvctl/rtadvctl.c
index e5be355..26bf11d 100644
--- a/usr.sbin/rtadvctl/rtadvctl.c
+++ b/usr.sbin/rtadvctl/rtadvctl.c
@@ -46,6 +46,7 @@
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>
+#include <inttypes.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
@@ -60,6 +61,7 @@
#include "rtadvd.h"
#include "if.h"
#include "timer_subr.h"
+#include "timer.h"
#include "control.h"
#include "control_client.h"
@@ -84,9 +86,7 @@ static int action_shutdown(int, char **);
static int action_show(int, char **);
static int action_show_prefix(struct prefix *);
-#ifdef ROUTEINFO
static int action_show_rtinfo(struct rtinfo *);
-#endif
static int action_show_rdnss(void *);
static int action_show_dnssl(void *);
@@ -108,14 +108,17 @@ static struct dispatch_table {
{ "show", action_show },
{ "reload", action_reload },
{ "shutdown", action_shutdown },
- { NULL, NULL },
{ "enable", action_enable },
{ "disable", action_disable },
+ { NULL, NULL },
{ "echo", action_echo },
{ "version", action_version },
{ NULL, NULL },
};
+static char errmsgbuf[1024];
+static char *errmsg = NULL;
+
static void
mysyslog(int priority, const char * restrict fmt, ...)
{
@@ -177,13 +180,17 @@ main(int argc, char *argv[])
}
}
- if (action != NULL) {
- error = (dtable[i].dt_act)(--argc, ++argv);
- if (error)
- fprintf(stderr, "%s failed.\n", dtable[i].dt_comm);
- } else
+ if (action == NULL)
usage();
+ error = (dtable[i].dt_act)(--argc, ++argv);
+ if (error) {
+ fprintf(stderr, "%s failed", dtable[i].dt_comm);
+ if (errmsg != NULL)
+ fprintf(stderr, ": %s", errmsg);
+ fprintf(stderr, ".\n");
+ }
+
return (error);
}
@@ -295,33 +302,69 @@ action_propset(char *argv)
return (action_plgeneric(CM_TYPE_REQ_SET_PROP, argv, buf));
}
-/* XXX */
static int
-action_enable(int argc, char **argv)
+action_disable(int argc, char **argv)
{
- argc = argc;
- argv = argv;
+ char *action_argv;
+ char argv_disable[IFNAMSIZ + sizeof(":disable=")];
+ int i;
+ int error;
- return (0);
+ if (argc < 1)
+ return (1);
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_disable, "%s:disable=", argv[i]);
+ action_argv = argv_disable;
+ error += action_propset(action_argv);
+ }
+
+ return (error);
}
-/* XXX */
static int
-action_disable(int argc, char **argv)
+action_enable(int argc, char **argv)
{
- argc = argc;
- argv = argv;
+ char *action_argv;
+ char argv_enable[IFNAMSIZ + sizeof(":enable=")];
+ int i;
+ int error;
- return (0);
+ if (argc < 1)
+ return (1);
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_enable, "%s:enable=", argv[i]);
+ action_argv = argv_enable;
+ error += action_propset(action_argv);
+ }
+
+ return (error);
}
static int
-action_reload(int argc __unused, char **argv __unused)
+action_reload(int argc, char **argv)
{
char *action_argv;
+ char argv_reload[IFNAMSIZ + sizeof(":reload=")];
+ int i;
+ int error;
+
+ if (argc == 0) {
+ action_argv = strdup(":reload=");
+ return (action_propset(action_argv));
+ }
+
+ error = 0;
+ for (i = 0; i < argc; i++) {
+ sprintf(argv_reload, "%s:reload=", argv[i]);
+ action_argv = argv_reload;
+ error += action_propset(action_argv);
+ }
- action_argv = strdup("reload");
- return(action_propset(action_argv));
+ return (error);
}
static int
@@ -330,7 +373,7 @@ action_echo(int argc __unused, char **argv __unused)
char *action_argv;
action_argv = strdup("echo");
- return(action_propset(action_argv));
+ return (action_propset(action_argv));
}
static int
@@ -339,7 +382,7 @@ action_shutdown(int argc __unused, char **argv __unused)
char *action_argv;
action_argv = strdup("shutdown");
- return(action_propset(action_argv));
+ return (action_propset(action_argv));
}
/* XXX */
@@ -366,10 +409,9 @@ action_show(int argc, char **argv)
char argv_ifilist[sizeof(":ifilist=")] = ":ifilist=";
char argv_ifi[IFNAMSIZ + sizeof(":ifi=")];
char argv_rai[IFNAMSIZ + sizeof(":rai=")];
-#ifdef ROUTEINFO
char argv_rti[IFNAMSIZ + sizeof(":rti=")];
-#endif
char argv_pfx[IFNAMSIZ + sizeof(":pfx=")];
+ char argv_ifi_ra_timer[IFNAMSIZ + sizeof(":ifi_ra_timer=")];
char argv_rdnss[IFNAMSIZ + sizeof(":rdnss=")];
char argv_dnssl[IFNAMSIZ + sizeof(":dnssl=")];
char ssbuf[SSBUFLEN];
@@ -394,7 +436,7 @@ action_show(int argc, char **argv)
while (p < endp) {
ifi = malloc(sizeof(*ifi));
if (ifi == NULL)
- exit(1);
+ return (1);
memset(ifi, 0, sizeof(*ifi));
strcpy(ifi->ifi_ifname, p);
@@ -406,23 +448,27 @@ action_show(int argc, char **argv)
for (i = 0; i < argc; i++) {
ifi = malloc(sizeof(*ifi));
if (ifi == NULL)
- exit(1);
+ return (1);
memset(ifi, 0, sizeof(*ifi));
strcpy(ifi->ifi_ifname, argv[i]);
ifi->ifi_ifindex = if_nametoindex(ifi->ifi_ifname);
- if (ifi->ifi_ifindex == 0)
- exit(1);
+ if (ifi->ifi_ifindex == 0) {
+ sprintf(errmsgbuf, "invalid interface %s",
+ ifi->ifi_ifname);
+ errmsg = errmsgbuf;
+ return (1);
+ }
+
TAILQ_INSERT_TAIL(&ifl, ifi, ifi_next);
}
}
TAILQ_FOREACH(ifi, &ifl, ifi_next) {
struct ifinfo *ifi_s;
+ struct rtadvd_timer *rat;
struct rainfo *rai;
-#ifdef ROUTEINFO
struct rtinfo *rti;
-#endif
struct prefix *pfx;
int c;
int ra_ifstatus;
@@ -439,33 +485,52 @@ action_show(int argc, char **argv)
printf("%s: flags=<", ifi->ifi_ifname);
- /*
- * RA_RECV = UP + CONFIGURED + ACCEPT_RTADV
- * RA_SEND = UP + CONFIGURED + IPV6FORWARDING
- */
-
c = 0;
if (ifi_s->ifi_ifindex == 0)
c += printf("NONEXISTENT");
else
c += printf("%s", (ifi_s->ifi_flags & IFF_UP) ?
"UP" : "DOWN");
- if (ifi_s->ifi_state == IFI_STATE_CONFIGURED)
+ switch (ifi_s->ifi_state) {
+ case IFI_STATE_CONFIGURED:
c += printf("%s%s", (c) ? "," : "", "CONFIGURED");
-
+ break;
+ case IFI_STATE_TRANSITIVE:
+ c += printf("%s%s", (c) ? "," : "", "TRANSITIVE");
+ break;
+ }
if (ifi_s->ifi_persist)
c += printf("%s%s", (c) ? "," : "", "PERSIST");
printf(">");
ra_ifstatus = RA_IFSTATUS_INACTIVE;
if ((ifi_s->ifi_flags & IFF_UP) &&
- (ifi_s->ifi_state == IFI_STATE_CONFIGURED)) {
+ ((ifi_s->ifi_state == IFI_STATE_CONFIGURED) ||
+ (ifi_s->ifi_state == IFI_STATE_TRANSITIVE))) {
+#if (__FreeBSD_version < 900000)
+ /*
+ * RA_RECV: !ip6.forwarding && ip6.accept_rtadv
+ * RA_SEND: ip6.forwarding
+ */
+ if (getinet6sysctl(IPV6CTL_FORWARDING) == 0) {
+ if (getinet6sysctl(IPV6CTL_ACCEPT_RTADV))
+ ra_ifstatus = RA_IFSTATUS_RA_RECV;
+ else
+ ra_ifstatus = RA_IFSTATUS_INACTIVE;
+ } else
+ ra_ifstatus = RA_IFSTATUS_RA_SEND;
+#else
+ /*
+ * RA_RECV: ND6_IFF_ACCEPT_RTADV
+ * RA_SEND: ip6.forwarding
+ */
if (ifi_s->ifi_nd_flags & ND6_IFF_ACCEPT_RTADV)
ra_ifstatus = RA_IFSTATUS_RA_RECV;
else if (getinet6sysctl(IPV6CTL_FORWARDING))
ra_ifstatus = RA_IFSTATUS_RA_SEND;
else
ra_ifstatus = RA_IFSTATUS_INACTIVE;
+#endif
}
c = 0;
@@ -478,7 +543,11 @@ action_show(int argc, char **argv)
printf("%s%s", (c) ? "," : "", "RA_SEND");
printf("> ");
- if (ifi_s->ifi_state != IFI_STATE_CONFIGURED) {
+ switch (ifi_s->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ case IFI_STATE_TRANSITIVE:
+ break;
+ default:
printf("\n");
continue;
}
@@ -533,14 +602,33 @@ action_show(int argc, char **argv)
rai->rai_hoplimit);
printf("\tAdvIfPrefixes: %s\n",
rai->rai_advifprefix ? "yes" : "no");
+
+ /* RA timer */
+ rat = NULL;
+ if (ifi_s->ifi_ra_timer != NULL) {
+ sprintf(argv_ifi_ra_timer, "%s:ifi_ra_timer=",
+ ifi->ifi_ifname);
+ action_argv = argv_ifi_ra_timer;
+
+ error = action_propget(action_argv, &cp);
+ if (error)
+ return (error);
+
+ rat = (struct rtadvd_timer *)cp.cp_val;
+ }
+ printf("\tNext RA send: %s",
+ (rat == NULL) ? "never\n" :
+ ctime((time_t *)&rat->rat_tm.tv_sec));
+ printf("\tLast RA sent: %s",
+ (ifi_s->ifi_ra_lastsent.tv_sec == 0) ? "never\n" :
+ ctime((time_t *)&ifi_s->ifi_ra_lastsent.tv_sec));
if (rai->rai_clockskew)
- printf("\tClock skew: %ldsec\n",
+ printf("\tClock skew: %" PRIu16 "sec\n",
rai->rai_clockskew);
if (vflag < LOG_WARNING)
continue;
-#ifdef ROUTEINFO
/* route information */
sprintf(argv_rti, "%s:rti=", ifi->ifi_ifname);
action_argv = argv_rti;
@@ -556,7 +644,7 @@ action_show(int argc, char **argv)
for (i = 0; i < len; i++)
action_show_rtinfo(&rti[i]);
}
-#endif
+
/* prefix information */
sprintf(argv_pfx, "%s:pfx=", ifi->ifi_ifname);
action_argv = argv_pfx;
@@ -583,7 +671,7 @@ action_show(int argc, char **argv)
if (error)
continue;
- len = *((u_int16_t *)cp.cp_val);
+ len = *((uint16_t *)cp.cp_val);
if (len > 0) {
printf("\tRDNSS entries:\n");
@@ -598,7 +686,7 @@ action_show(int argc, char **argv)
if (error)
continue;
- len = *((u_int16_t *)cp.cp_val);
+ len = *((uint16_t *)cp.cp_val);
if (len > 0) {
printf("\tDNSSL entries:\n");
@@ -610,28 +698,34 @@ action_show(int argc, char **argv)
printf("\n");
- printf("\tLast RA sent: %s",
- (rai->rai_lastsent.tv_sec == 0) ? "never\n" :
- ctime((time_t *)&rai->rai_lastsent.tv_sec));
- printf("\tRA initcounts/waits: %d/%d\n",
- rai->rai_initcounter,
- rai->rai_waiting);
- printf("\tRA out/in/inconsistent: %llu/%llu/%llu\n",
- ifi_s->ifi_raoutput,
+ printf("\tCounters\n"
+ "\t RA burst counts: %" PRIu16 " (interval: %s)\n"
+ "\t RS wait counts: %" PRIu16 "\n",
+ ifi_s->ifi_burstcount,
+ sec2str(ifi_s->ifi_burstinterval, ssbuf),
+ ifi_s->ifi_rs_waitcount);
+
+ printf("\tOutputs\n"
+ "\t RA: %" PRIu64 "\n", ifi_s->ifi_raoutput);
+
+ printf("\tInputs\n"
+ "\t RA: %" PRIu64 " (normal)\n"
+ "\t RA: %" PRIu64 " (inconsistent)\n"
+ "\t RS: %" PRIu64 "\n",
ifi_s->ifi_rainput,
- ifi_s->ifi_rainconsistent);
- printf("\tRS in: %llu\n",
+ ifi_s->ifi_rainconsistent,
ifi_s->ifi_rsinput);
printf("\n");
+#if 0 /* Not implemented yet */
printf("\tReceived RAs:\n");
+#endif
}
return (0);
}
-#ifdef ROUTEINFO
static int
action_show_rtinfo(struct rtinfo *rti)
{
@@ -648,7 +742,6 @@ action_show_rtinfo(struct rtinfo *rti)
return (0);
}
-#endif
static int
action_show_prefix(struct prefix *pfx)
@@ -726,17 +819,17 @@ action_show_rdnss(void *msg)
{
struct rdnss *rdn;
struct rdnss_addr *rda;
- u_int16_t *rdn_cnt;
- u_int16_t *rda_cnt;
+ uint16_t *rdn_cnt;
+ uint16_t *rda_cnt;
int i;
int j;
char *p;
- u_int32_t ltime;
+ uint32_t ltime;
char ntopbuf[INET6_ADDRSTRLEN];
char ssbuf[SSBUFLEN];
p = msg;
- rdn_cnt = (u_int16_t *)p;
+ rdn_cnt = (uint16_t *)p;
p += sizeof(*rdn_cnt);
if (*rdn_cnt > 0) {
@@ -745,7 +838,7 @@ action_show_rdnss(void *msg)
ltime = rdn->rd_ltime;
p += sizeof(*rdn);
- rda_cnt = (u_int16_t *)p;
+ rda_cnt = (uint16_t *)p;
p += sizeof(*rda_cnt);
if (*rda_cnt > 0)
for (j = 0; j < *rda_cnt; j++) {
@@ -769,17 +862,17 @@ action_show_dnssl(void *msg)
{
struct dnssl *dns;
struct dnssl_addr *dna;
- u_int16_t *dns_cnt;
- u_int16_t *dna_cnt;
+ uint16_t *dns_cnt;
+ uint16_t *dna_cnt;
int i;
int j;
char *p;
- u_int32_t ltime;
+ uint32_t ltime;
char hbuf[NI_MAXHOST];
char ssbuf[SSBUFLEN];
p = msg;
- dns_cnt = (u_int16_t *)p;
+ dns_cnt = (uint16_t *)p;
p += sizeof(*dns_cnt);
if (*dns_cnt > 0) {
@@ -788,7 +881,7 @@ action_show_dnssl(void *msg)
ltime = dns->dn_ltime;
p += sizeof(*dns);
- dna_cnt = (u_int16_t *)p;
+ dna_cnt = (uint16_t *)p;
p += sizeof(*dna_cnt);
if (*dna_cnt > 0)
for (j = 0; j < *dna_cnt; j++) {
diff --git a/usr.sbin/rtadvd/Makefile b/usr.sbin/rtadvd/Makefile
index c2a7aff..d48832d 100644
--- a/usr.sbin/rtadvd/Makefile
+++ b/usr.sbin/rtadvd/Makefile
@@ -22,8 +22,8 @@ SRCS= rtadvd.c rrenum.c advcap.c if.c config.c timer.c timer_subr.c \
DPADD= ${LIBUTIL}
LDADD= -lutil
-CFLAGS+= -DHAVE_ARC4RANDOM -DHAVE_POLL_H -DROUTEINFO
+CFLAGS+= -DHAVE_ARC4RANDOM
-WARNS?= 3
+WARNS?= 1
.include <bsd.prog.mk>
diff --git a/usr.sbin/rtadvd/config.c b/usr.sbin/rtadvd/config.c
index a667819..681611f 100644
--- a/usr.sbin/rtadvd/config.c
+++ b/usr.sbin/rtadvd/config.c
@@ -53,6 +53,7 @@
#include <stdio.h>
#include <syslog.h>
#include <errno.h>
+#include <inttypes.h>
#include <netdb.h>
#include <string.h>
#include <search.h>
@@ -148,7 +149,6 @@ int
loadconfig_ifname(char *ifname)
{
struct ifinfo *ifi;
- int error;
syslog(LOG_DEBUG, "<%s> enter", __func__);
@@ -174,37 +174,21 @@ loadconfig_ifname(char *ifname)
ifi->ifi_ifname);
continue;
}
- if (getconfig(ifi->ifi_ifindex) == NULL) {
+ if (getconfig(ifi) == NULL) {
syslog(LOG_ERR,
"<%s> invalid configuration for %s. "
"Ignored at this moment.", __func__,
ifi->ifi_ifname);
continue;
}
- ifi->ifi_state = IFI_STATE_CONFIGURED;
- syslog(LOG_DEBUG,
- "<%s> ifname=%s marked as configured.",
- __func__, ifi->ifi_ifname);
-
- error = sock_mc_join(&sock, ifi->ifi_ifindex);
- if (error)
- exit(1);
}
return (0);
}
int
-rmconfig(int idx)
+rm_ifinfo_index(int idx)
{
- struct rainfo *rai;
- struct prefix *pfx;
- struct soliciter *sol;
- struct rdnss *rdn;
- struct rdnss_addr *rdna;
- struct dnssl *dns;
- struct rtinfo *rti;
struct ifinfo *ifi;
- int error;
ifi = if_indextoifinfo(idx);
if (ifi == NULL) {
@@ -212,24 +196,39 @@ rmconfig(int idx)
__func__, idx);
return (-1);
}
- rai = ifi->ifi_rainfo;
- if (ifi->ifi_state == IFI_STATE_CONFIGURED) {
+ return (rm_ifinfo(ifi));
+}
+
+int
+rm_ifinfo(struct ifinfo *ifi)
+{
+ int error;
+
+ syslog(LOG_DEBUG, "<%s> enter (%s).", __func__, ifi->ifi_ifname);
+ switch (ifi->ifi_state) {
+ case IFI_STATE_UNCONFIGURED:
+ return (0);
+ break;
+ default:
ifi->ifi_state = IFI_STATE_UNCONFIGURED;
syslog(LOG_DEBUG,
- "<%s> ifname=%s marked as unconfigured.",
+ "<%s> ifname=%s marked as UNCONFIGURED.",
__func__, ifi->ifi_ifname);
- error = sock_mc_leave(&sock, ifi->ifi_ifindex);
- if (error)
- exit(1);
+ /* XXX: No MC leaving here becasue index is disappeared */
+
+ /* Inactivate timer */
+ rtadvd_remove_timer(ifi->ifi_ra_timer);
+ ifi->ifi_ra_timer = NULL;
+ break;
}
/* clean up ifi */
if (!ifi->ifi_persist) {
TAILQ_REMOVE(&ifilist, ifi, ifi_next);
syslog(LOG_DEBUG, "<%s>: ifinfo (idx=%d) removed.",
- __func__, idx);
+ __func__, ifi->ifi_ifindex);
free(ifi);
} else {
/* recreate an empty entry */
@@ -237,16 +236,62 @@ rmconfig(int idx)
syslog(LOG_DEBUG, "<%s>: ifname=%s is persistent.",
__func__, ifi->ifi_ifname);
}
+
/* clean up rai if any */
- if (rai == NULL)
- return (0);
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ if (ifi->ifi_rainfo != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo = NULL;
+ }
+ break;
+ case IFI_STATE_TRANSITIVE:
+ if (ifi->ifi_rainfo == ifi->ifi_rainfo_trans) {
+ if (ifi->ifi_rainfo != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo = NULL;
+ ifi->ifi_rainfo_trans = NULL;
+ }
+ } else {
+ if (ifi->ifi_rainfo != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo = NULL;
+ }
+ if (ifi->ifi_rainfo_trans != NULL) {
+ error = rm_rainfo(ifi->ifi_rainfo_trans);
+ if (error)
+ return (error);
+ ifi->ifi_rainfo_trans = NULL;
+ }
+ }
+ }
- TAILQ_REMOVE(&railist, rai, rai_next);
- syslog(LOG_DEBUG, "<%s>: rainfo (idx=%d) removed.",
- __func__, idx);
+ syslog(LOG_DEBUG, "<%s> leave (%s).", __func__, ifi->ifi_ifname);
+ return (0);
+}
+
+int
+rm_rainfo(struct rainfo *rai)
+{
+ struct prefix *pfx;
+ struct soliciter *sol;
+ struct rdnss *rdn;
+ struct rdnss_addr *rdna;
+ struct dnssl *dns;
+ struct rtinfo *rti;
- /* Free all of allocated memories for this entry. */
- rtadvd_remove_timer(rai->rai_timer);
+ syslog(LOG_DEBUG, "<%s>: enter", __func__);
+
+ TAILQ_REMOVE(&railist, rai, rai_next);
+ if (rai->rai_ifinfo != NULL)
+ syslog(LOG_DEBUG, "<%s>: rainfo (idx=%d) removed.",
+ __func__, rai->rai_ifinfo->ifi_ifindex);
if (rai->rai_ra_data != NULL)
free(rai->rai_ra_data);
@@ -276,34 +321,34 @@ rmconfig(int idx)
free(rti);
}
free(rai);
+ syslog(LOG_DEBUG, "<%s>: leave", __func__);
return (0);
}
struct ifinfo *
-getconfig(int idx)
+getconfig(struct ifinfo *ifi)
{
int stat, i;
+ int error;
char tbuf[BUFSIZ];
struct rainfo *rai;
struct rainfo *rai_old;
- struct ifinfo *ifi;
- long val;
+ int32_t val;
int64_t val64;
char buf[BUFSIZ];
char *bp = buf;
char *addr, *flagstr;
- if (idx == 0)
- return (NULL);
- TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
- if (ifi->ifi_ifindex == idx)
- break;
- }
if (ifi == NULL) /* if does not exist */
return (NULL);
- rai_old = ifi->ifi_rainfo;
+ if (ifi->ifi_state == IFI_STATE_TRANSITIVE &&
+ ifi->ifi_rainfo == NULL) {
+ syslog(LOG_INFO, "<%s> %s is shutting down. Skipped.",
+ __func__, ifi->ifi_ifname);
+ return (NULL);
+ }
if ((stat = agetent(tbuf, ifi->ifi_ifname)) <= 0) {
memset(tbuf, 0, sizeof(tbuf));
@@ -316,9 +361,7 @@ getconfig(int idx)
ELM_MALLOC(rai, exit(1));
TAILQ_INIT(&rai->rai_prefix);
-#ifdef ROUTEINFO
TAILQ_INIT(&rai->rai_route);
-#endif
TAILQ_INIT(&rai->rai_rdnss);
TAILQ_INIT(&rai->rai_dnssl);
TAILQ_INIT(&rai->rai_soliciter);
@@ -350,24 +393,24 @@ getconfig(int idx)
MAYHAVE(val, "maxinterval", DEF_MAXRTRADVINTERVAL);
if (val < MIN_MAXINTERVAL || val > MAX_MAXINTERVAL) {
syslog(LOG_ERR,
- "<%s> maxinterval (%ld) on %s is invalid "
+ "<%s> maxinterval (%" PRIu32 ") on %s is invalid "
"(must be between %u and %u)", __func__, val,
ifi->ifi_ifname, MIN_MAXINTERVAL, MAX_MAXINTERVAL);
goto getconfig_free_rai;
}
- rai->rai_maxinterval = (u_int)val;
+ rai->rai_maxinterval = (uint16_t)val;
MAYHAVE(val, "mininterval", rai->rai_maxinterval/3);
- if ((u_int)val < MIN_MININTERVAL ||
- (u_int)val > (rai->rai_maxinterval * 3) / 4) {
+ if ((uint16_t)val < MIN_MININTERVAL ||
+ (uint16_t)val > (rai->rai_maxinterval * 3) / 4) {
syslog(LOG_ERR,
- "<%s> mininterval (%ld) on %s is invalid "
+ "<%s> mininterval (%" PRIu32 ") on %s is invalid "
"(must be between %d and %d)",
__func__, val, ifi->ifi_ifname, MIN_MININTERVAL,
(rai->rai_maxinterval * 3) / 4);
goto getconfig_free_rai;
}
- rai->rai_mininterval = (u_int)val;
+ rai->rai_mininterval = (uint16_t)val;
MAYHAVE(val, "chlim", DEF_ADVCURHOPLIMIT);
rai->rai_hoplimit = val & 0xff;
@@ -405,10 +448,10 @@ getconfig(int idx)
}
MAYHAVE(val, "rltime", rai->rai_maxinterval * 3);
- if ((u_int)val && ((u_int)val < rai->rai_maxinterval ||
- (u_int)val > MAXROUTERLIFETIME)) {
+ if ((uint16_t)val && ((uint16_t)val < rai->rai_maxinterval ||
+ (uint16_t)val > MAXROUTERLIFETIME)) {
syslog(LOG_ERR,
- "<%s> router lifetime (%ld) on %s is invalid "
+ "<%s> router lifetime (%" PRIu32 ") on %s is invalid "
"(must be 0 or between %d and %d)",
__func__, val, ifi->ifi_ifname, rai->rai_maxinterval,
MAXROUTERLIFETIME);
@@ -419,20 +462,20 @@ getconfig(int idx)
MAYHAVE(val, "rtime", DEF_ADVREACHABLETIME);
if (val < 0 || val > MAXREACHABLETIME) {
syslog(LOG_ERR,
- "<%s> reachable time (%ld) on %s is invalid "
+ "<%s> reachable time (%" PRIu32 ") on %s is invalid "
"(must be no greater than %d)",
__func__, val, ifi->ifi_ifname, MAXREACHABLETIME);
goto getconfig_free_rai;
}
- rai->rai_reachabletime = (u_int32_t)val;
+ rai->rai_reachabletime = (uint32_t)val;
MAYHAVE(val64, "retrans", DEF_ADVRETRANSTIMER);
if (val64 < 0 || val64 > 0xffffffff) {
- syslog(LOG_ERR, "<%s> retrans time (%lld) on %s out of range",
- __func__, (long long)val64, ifi->ifi_ifname);
+ syslog(LOG_ERR, "<%s> retrans time (%" PRIu64 ") on %s out of range",
+ __func__, val64, ifi->ifi_ifname);
goto getconfig_free_rai;
}
- rai->rai_retranstimer = (u_int32_t)val64;
+ rai->rai_retranstimer = (uint32_t)val64;
if (agetnum("hapref") != -1 || agetnum("hatime") != -1) {
syslog(LOG_ERR,
@@ -486,7 +529,7 @@ getconfig(int idx)
makeentry(entbuf, sizeof(entbuf), i, "prefixlen");
MAYHAVE(val, entbuf, 64);
if (val < 0 || val > 128) {
- syslog(LOG_ERR, "<%s> prefixlen (%ld) for %s "
+ syslog(LOG_ERR, "<%s> prefixlen (%" PRIu32 ") for %s "
"on %s out of range",
__func__, val, addr, ifi->ifi_ifname);
goto getconfig_free_pfx;
@@ -510,13 +553,13 @@ getconfig(int idx)
makeentry(entbuf, sizeof(entbuf), i, "vltime");
MAYHAVE(val64, entbuf, DEF_ADVVALIDLIFETIME);
if (val64 < 0 || val64 > 0xffffffff) {
- syslog(LOG_ERR, "<%s> vltime (%lld) for "
+ syslog(LOG_ERR, "<%s> vltime (%" PRIu64 ") for "
"%s/%d on %s is out of range",
- __func__, (long long)val64,
+ __func__, val64,
addr, pfx->pfx_prefixlen, ifi->ifi_ifname);
goto getconfig_free_pfx;
}
- pfx->pfx_validlifetime = (u_int32_t)val64;
+ pfx->pfx_validlifetime = (uint32_t)val64;
makeentry(entbuf, sizeof(entbuf), i, "vltimedecr");
if (agetflag(entbuf)) {
@@ -530,13 +573,13 @@ getconfig(int idx)
MAYHAVE(val64, entbuf, DEF_ADVPREFERREDLIFETIME);
if (val64 < 0 || val64 > 0xffffffff) {
syslog(LOG_ERR,
- "<%s> pltime (%lld) for %s/%d on %s "
+ "<%s> pltime (%" PRIu64 ") for %s/%d on %s "
"is out of range",
- __func__, (long long)val64,
+ __func__, val64,
addr, pfx->pfx_prefixlen, ifi->ifi_ifname);
goto getconfig_free_pfx;
}
- pfx->pfx_preflifetime = (u_int32_t)val64;
+ pfx->pfx_preflifetime = (uint32_t)val64;
makeentry(entbuf, sizeof(entbuf), i, "pltimedecr");
if (agetflag(entbuf)) {
@@ -555,14 +598,14 @@ getconfig_free_pfx:
if (rai->rai_advifprefix && rai->rai_pfxs == 0)
get_prefix(rai);
- MAYHAVE(val, "mtu", 0);
- if (val < 0 || (u_int)val > 0xffffffff) {
+ MAYHAVE(val64, "mtu", 0);
+ if (val < 0 || val64 > 0xffffffff) {
syslog(LOG_ERR,
- "<%s> mtu (%ld) on %s out of range",
- __func__, val, ifi->ifi_ifname);
+ "<%s> mtu (%" PRIu64 ") on %s out of range",
+ __func__, val64, ifi->ifi_ifname);
goto getconfig_free_rai;
}
- rai->rai_linkmtu = (u_int32_t)val;
+ rai->rai_linkmtu = (uint32_t)val64;
if (rai->rai_linkmtu == 0) {
char *mtustr;
@@ -573,9 +616,9 @@ getconfig_free_pfx:
else if (rai->rai_linkmtu < IPV6_MMTU ||
rai->rai_linkmtu > ifi->ifi_phymtu) {
syslog(LOG_ERR,
- "<%s> advertised link mtu (%lu) on %s is invalid (must "
+ "<%s> advertised link mtu (%" PRIu32 ") on %s is invalid (must "
"be between least MTU (%d) and physical link MTU (%d)",
- __func__, (unsigned long)rai->rai_linkmtu, ifi->ifi_ifname,
+ __func__, rai->rai_linkmtu, ifi->ifi_ifname,
IPV6_MMTU, ifi->ifi_phymtu);
goto getconfig_free_rai;
}
@@ -609,7 +652,6 @@ getconfig_free_pfx:
#endif
/* route information */
-#ifdef ROUTEINFO
rai->rai_routes = 0;
for (i = -1; i < MAXROUTE; i++) {
struct rtinfo *rti;
@@ -671,7 +713,7 @@ getconfig_free_pfx:
val = 64;
}
if (val < 0 || val > 128) {
- syslog(LOG_ERR, "<%s> prefixlen (%ld) for %s on %s "
+ syslog(LOG_ERR, "<%s> prefixlen (%" PRIu32 ") for %s on %s "
"out of range",
__func__, val, addr, ifi->ifi_ifname);
goto getconfig_free_rti;
@@ -735,13 +777,13 @@ getconfig_free_pfx:
}
}
if (val64 < 0 || val64 > 0xffffffff) {
- syslog(LOG_ERR, "<%s> route lifetime (%lld) for "
+ syslog(LOG_ERR, "<%s> route lifetime (%" PRIu64 ") for "
"%s/%d on %s out of range", __func__,
- (long long)val64, addr, rti->rti_prefixlen,
+ val64, addr, rti->rti_prefixlen,
ifi->ifi_ifname);
goto getconfig_free_rti;
}
- rti->rti_ltime = (u_int32_t)val64;
+ rti->rti_ltime = (uint32_t)val64;
/* link into chain */
TAILQ_INSERT_TAIL(&rai->rai_route, rti, rti_next);
@@ -750,7 +792,7 @@ getconfig_free_pfx:
getconfig_free_rti:
free(rti);
}
-#endif
+
/* DNS server and DNS search list information */
for (i = -1; i < MAXRDNSSENT ; i++) {
struct rdnss *rdn;
@@ -782,9 +824,9 @@ getconfig_free_rti:
makeentry(entbuf, sizeof(entbuf), i, "rdnssltime");
MAYHAVE(val, entbuf, (rai->rai_maxinterval * 3 / 2));
- if ((u_int)val < rai->rai_maxinterval ||
- (u_int)val > rai->rai_maxinterval * 2) {
- syslog(LOG_ERR, "%s (%ld) on %s is invalid "
+ if ((uint16_t)val < rai->rai_maxinterval ||
+ (uint16_t)val > rai->rai_maxinterval * 2) {
+ syslog(LOG_ERR, "%s (%" PRIu16 ") on %s is invalid "
"(must be between %d and %d)",
entbuf, val, ifi->ifi_ifname, rai->rai_maxinterval,
rai->rai_maxinterval * 2);
@@ -831,9 +873,9 @@ getconfig_free_rdn:
makeentry(entbuf, sizeof(entbuf), i, "dnsslltime");
MAYHAVE(val, entbuf, (rai->rai_maxinterval * 3 / 2));
- if ((u_int)val < rai->rai_maxinterval ||
- (u_int)val > rai->rai_maxinterval * 2) {
- syslog(LOG_ERR, "%s (%ld) on %s is invalid "
+ if ((uint16_t)val < rai->rai_maxinterval ||
+ (uint16_t)val > rai->rai_maxinterval * 2) {
+ syslog(LOG_ERR, "%s (%" PRIu16 ") on %s is invalid "
"(must be between %d and %d)",
entbuf, val, ifi->ifi_ifname, rai->rai_maxinterval,
rai->rai_maxinterval * 2);
@@ -859,26 +901,102 @@ getconfig_free_dns:
* Before the removal, RDNSS and DNSSL options with
* zero-lifetime will be sent.
*/
- if (rai_old != NULL) {
- const int retrans = MAX_FINAL_RTR_ADVERTISEMENTS;
- struct rdnss *rdn;
- struct dnssl *dns;
+ switch (ifi->ifi_state) {
+ case IFI_STATE_UNCONFIGURED:
+ /* UNCONFIGURED -> TRANSITIVE */
+
+ error = sock_mc_join(&sock, ifi->ifi_ifindex);
+ if (error)
+ exit(1);
+
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+ ifi->ifi_burstcount = MAX_INITIAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval = MAX_INITIAL_RTR_ADVERT_INTERVAL;
+
+ /* The same two rai mean initial burst */
+ ifi->ifi_rainfo = rai;
+ ifi->ifi_rainfo_trans = rai;
+ TAILQ_INSERT_TAIL(&railist, rai, rai_next);
+
+ if (ifi->ifi_ra_timer == NULL)
+ ifi->ifi_ra_timer = rtadvd_add_timer(ra_timeout,
+ ra_timer_update, ifi, ifi);
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
- rai_old->rai_lifetime = 0;
- TAILQ_FOREACH(rdn, &rai_old->rai_rdnss, rd_next)
- rdn->rd_ltime = 0;
- TAILQ_FOREACH(dns, &rai_old->rai_dnssl, dn_next)
- dns->dn_ltime = 0;
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as TRANSITIVE (initial burst).",
+ __func__, ifi->ifi_ifname);
+ break;
+ case IFI_STATE_CONFIGURED:
+ /* CONFIGURED -> TRANSITIVE */
+ rai_old = ifi->ifi_rainfo;
+ if (rai_old == NULL) {
+ syslog(LOG_ERR,
+ "<%s> ifi_rainfo is NULL"
+ " in IFI_STATE_CONFIGURED.", __func__);
+ ifi = NULL;
+ break;
+ } else {
+ struct rdnss *rdn;
+ struct dnssl *dns;
+
+ rai_old->rai_lifetime = 0;
+ TAILQ_FOREACH(rdn, &rai_old->rai_rdnss, rd_next)
+ rdn->rd_ltime = 0;
+ TAILQ_FOREACH(dns, &rai_old->rai_dnssl, dn_next)
+ dns->dn_ltime = 0;
+
+ ifi->ifi_rainfo_trans = rai_old;
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+ ifi->ifi_burstcount = MAX_FINAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval = MIN_DELAY_BETWEEN_RAS;
+
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as TRANSITIVE"
+ " (transitional burst)",
+ __func__, ifi->ifi_ifname);
+ }
+ ifi->ifi_rainfo = rai;
+ TAILQ_INSERT_TAIL(&railist, rai, rai_next);
+ break;
+ case IFI_STATE_TRANSITIVE:
+ if (ifi->ifi_rainfo != NULL) {
+ if (ifi->ifi_rainfo == ifi->ifi_rainfo_trans) {
+ /* Reinitialize initial burst */
+ rm_rainfo(ifi->ifi_rainfo);
+ ifi->ifi_rainfo = rai;
+ ifi->ifi_rainfo_trans = rai;
+ ifi->ifi_burstcount =
+ MAX_INITIAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval =
+ MAX_INITIAL_RTR_ADVERT_INTERVAL;
+ } else {
+ /* Replace ifi_rainfo with the new one */
+ rm_rainfo(ifi->ifi_rainfo);
+ ifi->ifi_rainfo = rai;
+ }
+ TAILQ_INSERT_TAIL(&railist, rai, rai_next);
+
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+ } else {
+ /* XXX: NOTREACHED. Being shut down. */
+ syslog(LOG_ERR,
+ "<%s> %s is shutting down. Skipped.",
+ __func__, ifi->ifi_ifname);
+ rm_rainfo(rai);
- make_packet(rai_old);
- for (i = 0; i < retrans; i++) {
- ra_output(rai_old);
- sleep(MIN_DELAY_BETWEEN_RAS);
+ return (NULL);
}
- rmconfig(idx);
+ break;
}
- ifi->ifi_rainfo = rai;
- TAILQ_INSERT_TAIL(&railist, rai, rai_next);
return (ifi);
@@ -894,8 +1012,8 @@ get_prefix(struct rainfo *rai)
struct prefix *pfx;
struct in6_addr *a;
struct ifinfo *ifi;
- u_char *p, *ep, *m, *lim;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char *p, *ep, *m, *lim;
+ char ntopbuf[INET6_ADDRSTRLEN];
if (getifaddrs(&ifap) < 0) {
syslog(LOG_ERR,
@@ -915,9 +1033,10 @@ get_prefix(struct rainfo *rai)
a = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
if (IN6_IS_ADDR_LINKLOCAL(a))
continue;
+
/* get prefix length */
- m = (u_char *)&((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr;
- lim = (u_char *)(ifa->ifa_netmask) + ifa->ifa_netmask->sa_len;
+ m = (char *)&((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr;
+ lim = (char *)(ifa->ifa_netmask) + ifa->ifa_netmask->sa_len;
plen = prefixlen(m, lim);
if (plen <= 0 || plen > 128) {
syslog(LOG_ERR, "<%s> failed to get prefixlen "
@@ -938,8 +1057,8 @@ get_prefix(struct rainfo *rai)
/* set prefix, sweep bits outside of prefixlen */
pfx->pfx_prefixlen = plen;
memcpy(&pfx->pfx_prefix, a, sizeof(*a));
- p = (u_char *)&pfx->pfx_prefix;
- ep = (u_char *)(&pfx->pfx_prefix + 1);
+ p = (char *)&pfx->pfx_prefix;
+ ep = (char *)(&pfx->pfx_prefix + 1);
while (m < lim && p < ep)
*p++ &= *m++;
while (p < ep)
@@ -993,7 +1112,7 @@ add_prefix(struct rainfo *rai, struct in6_prefixreq *ipr)
{
struct prefix *pfx;
struct ifinfo *ifi;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
ifi = rai->rai_ifinfo;
ELM_MALLOC(pfx, return);
@@ -1013,9 +1132,7 @@ add_prefix(struct rainfo *rai, struct in6_prefixreq *ipr)
inet_ntop(AF_INET6, &ipr->ipr_prefix.sin6_addr, ntopbuf,
sizeof(ntopbuf)), ipr->ipr_plen, ifi->ifi_ifname);
- /* reconstruct the packet */
rai->rai_pfxs++;
- make_packet(rai);
}
/*
@@ -1028,7 +1145,7 @@ delete_prefix(struct prefix *pfx)
{
struct rainfo *rai;
struct ifinfo *ifi;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
rai = pfx->pfx_rainfo;
ifi = rai->rai_ifinfo;
@@ -1040,8 +1157,8 @@ delete_prefix(struct prefix *pfx)
if (pfx->pfx_timer)
rtadvd_remove_timer(pfx->pfx_timer);
free(pfx);
+
rai->rai_pfxs--;
- make_packet(rai);
}
void
@@ -1050,7 +1167,7 @@ invalidate_prefix(struct prefix *pfx)
struct timeval timo;
struct rainfo *rai;
struct ifinfo *ifi;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
rai = pfx->pfx_rainfo;
ifi = rai->rai_ifinfo;
@@ -1092,7 +1209,7 @@ update_prefix(struct prefix *pfx)
{
struct rainfo *rai;
struct ifinfo *ifi;
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
rai = pfx->pfx_rainfo;
ifi = rai->rai_ifinfo;
@@ -1140,7 +1257,7 @@ init_prefix(struct in6_prefixreq *ipr)
/* omit other field initialization */
}
else if (ipr->ipr_origin < PR_ORIG_RR) {
- u_char ntopbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
syslog(LOG_WARNING, "<%s> Added prefix(%s)'s origin %d is"
"lower than PR_ORIG_RR(router renumbering)."
@@ -1192,10 +1309,8 @@ make_packet(struct rainfo *rai)
struct nd_router_advert *ra;
struct nd_opt_prefix_info *ndopt_pi;
struct nd_opt_mtu *ndopt_mtu;
-#ifdef ROUTEINFO
struct nd_opt_route_info *ndopt_rti;
struct rtinfo *rti;
-#endif
struct nd_opt_rdnss *ndopt_rdnss;
struct rdnss *rdn;
struct nd_opt_dnssl *ndopt_dnssl;
@@ -1221,11 +1336,11 @@ make_packet(struct rainfo *rai)
packlen += sizeof(struct nd_opt_prefix_info) * rai->rai_pfxs;
if (rai->rai_linkmtu)
packlen += sizeof(struct nd_opt_mtu);
-#ifdef ROUTEINFO
+
TAILQ_FOREACH(rti, &rai->rai_route, rti_next)
packlen += sizeof(struct nd_opt_route_info) +
((rti->rti_prefixlen + 0x3f) >> 6) * 8;
-#endif
+
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
struct rdnss_addr *rdna;
@@ -1268,7 +1383,7 @@ make_packet(struct rainfo *rai)
ra->nd_ra_type = ND_ROUTER_ADVERT;
ra->nd_ra_code = 0;
ra->nd_ra_cksum = 0;
- ra->nd_ra_curhoplimit = (u_int8_t)(0xff & rai->rai_hoplimit);
+ ra->nd_ra_curhoplimit = (uint8_t)(0xff & rai->rai_hoplimit);
ra->nd_ra_flags_reserved = 0; /* just in case */
/*
* XXX: the router preference field, which is a 2-bit field, should be
@@ -1299,7 +1414,7 @@ make_packet(struct rainfo *rai)
}
TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
- u_int32_t vltime, pltime;
+ uint32_t vltime, pltime;
struct timeval now;
ndopt_pi = (struct nd_opt_prefix_info *)buf;
@@ -1321,7 +1436,7 @@ make_packet(struct rainfo *rai)
if (pfx->pfx_vltimeexpire == 0)
vltime = pfx->pfx_validlifetime;
else
- vltime = (pfx->pfx_vltimeexpire > now.tv_sec) ?
+ vltime = ((time_t)pfx->pfx_vltimeexpire > now.tv_sec) ?
pfx->pfx_vltimeexpire - now.tv_sec : 0;
}
if (pfx->pfx_timer)
@@ -1330,7 +1445,7 @@ make_packet(struct rainfo *rai)
if (pfx->pfx_pltimeexpire == 0)
pltime = pfx->pfx_preflifetime;
else
- pltime = (pfx->pfx_pltimeexpire > now.tv_sec) ?
+ pltime = ((time_t)pfx->pfx_pltimeexpire > now.tv_sec) ?
pfx->pfx_pltimeexpire - now.tv_sec : 0;
}
if (vltime < pltime) {
@@ -1348,9 +1463,8 @@ make_packet(struct rainfo *rai)
buf += sizeof(struct nd_opt_prefix_info);
}
-#ifdef ROUTEINFO
TAILQ_FOREACH(rti, &rai->rai_route, rti_next) {
- u_int8_t psize = (rti->rti_prefixlen + 0x3f) >> 6;
+ uint8_t psize = (rti->rti_prefixlen + 0x3f) >> 6;
ndopt_rti = (struct nd_opt_route_info *)buf;
ndopt_rti->nd_opt_rti_type = ND_OPT_ROUTE_INFO;
@@ -1361,7 +1475,7 @@ make_packet(struct rainfo *rai)
memcpy(ndopt_rti + 1, &rti->rti_prefix, psize * 8);
buf += sizeof(struct nd_opt_route_info) + psize * 8;
}
-#endif
+
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
struct rdnss_addr *rdna;
@@ -1382,6 +1496,7 @@ make_packet(struct rainfo *rai)
syslog(LOG_DEBUG, "<%s>: nd_opt_dnss_len = %d", __func__,
ndopt_rdnss->nd_opt_rdnss_len);
}
+
TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
struct dnssl_addr *dnsa;
diff --git a/usr.sbin/rtadvd/config.h b/usr.sbin/rtadvd/config.h
index 4d35d2f..219390b 100644
--- a/usr.sbin/rtadvd/config.h
+++ b/usr.sbin/rtadvd/config.h
@@ -30,8 +30,10 @@
* SUCH DAMAGE.
*/
-extern struct ifinfo *getconfig(int);
-extern int rmconfig(int);
+extern struct ifinfo *getconfig(struct ifinfo *);
+extern int rm_ifinfo(struct ifinfo *);
+extern int rm_ifinfo_index(int);
+extern int rm_rainfo(struct rainfo *);
extern int loadconfig_ifname(char *);
extern int loadconfig_index(int);
extern void delete_prefix(struct prefix *);
diff --git a/usr.sbin/rtadvd/control.c b/usr.sbin/rtadvd/control.c
index a61240e..709fae3 100644
--- a/usr.sbin/rtadvd/control.c
+++ b/usr.sbin/rtadvd/control.c
@@ -157,12 +157,12 @@ cmsg_send(int fd, char *buf)
}
syslog(LOG_DEBUG,
- "<%s> ctrl msg send: type=%d, count=%d, total_len=%d", __func__,
+ "<%s> ctrl msg send: type=%d, count=%d, total_len=%zd", __func__,
cm->cm_type, iovcnt, iov_len_total);
len = writev(fd, iov, iovcnt);
syslog(LOG_DEBUG,
- "<%s> ctrl msg send: length=%d", __func__, len);
+ "<%s> ctrl msg send: length=%zd", __func__, len);
if (len == -1) {
syslog(LOG_DEBUG,
@@ -173,9 +173,9 @@ cmsg_send(int fd, char *buf)
}
syslog(LOG_DEBUG,
- "<%s> write length = %d (actual)", __func__, len);
+ "<%s> write length = %zd (actual)", __func__, len);
syslog(LOG_DEBUG,
- "<%s> write length = %d (expected)", __func__, iov_len_total);
+ "<%s> write length = %zd (expected)", __func__, iov_len_total);
if (len != iov_len_total) {
close(fd);
@@ -317,7 +317,7 @@ cmsg_bin2pl(char *str, struct ctrl_msg_pl *cp)
lenp = (size_t *)p;
len = *lenp++;
p = (char *)lenp;
- syslog(LOG_DEBUG, "<%s> len(ifname) = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len(ifname) = %zu", __func__, len);
if (len > 0) {
cp->cp_ifname = malloc(len + 1);
if (cp->cp_ifname == NULL) {
@@ -332,7 +332,7 @@ cmsg_bin2pl(char *str, struct ctrl_msg_pl *cp)
lenp = (size_t *)p;
len = *lenp++;
p = (char *)lenp;
- syslog(LOG_DEBUG, "<%s> len(key) = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len(key) = %zu", __func__, len);
if (len > 0) {
cp->cp_key = malloc(len + 1);
if (cp->cp_key == NULL) {
@@ -347,7 +347,7 @@ cmsg_bin2pl(char *str, struct ctrl_msg_pl *cp)
lenp = (size_t *)p;
len = *lenp++;
p = (char *)lenp;
- syslog(LOG_DEBUG, "<%s> len(val) = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len(val) = %zu", __func__, len);
if (len > 0) {
cp->cp_val = malloc(len + 1);
if (cp->cp_val == NULL) {
@@ -382,11 +382,11 @@ cmsg_pl2bin(char *str, struct ctrl_msg_pl *cp)
len += cp->cp_val_len;
if (len > CM_MSG_MAXLEN - sizeof(*cm)) {
- syslog(LOG_DEBUG, "<%s> msg too long (len=%d)",
+ syslog(LOG_DEBUG, "<%s> msg too long (len=%zu)",
__func__, len);
return (0);
}
- syslog(LOG_DEBUG, "<%s> msglen=%d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> msglen=%zu", __func__, len);
memset(str, 0, len);
p = str;
lenp = (size_t *)p;
@@ -434,11 +434,11 @@ cmsg_str2bin(char *bin, void *str, size_t len)
syslog(LOG_DEBUG, "<%s> enter", __func__);
if (len > CM_MSG_MAXLEN - sizeof(*cm)) {
- syslog(LOG_DEBUG, "<%s> msg too long (len=%d)",
+ syslog(LOG_DEBUG, "<%s> msg too long (len=%zu)",
__func__, len);
return (0);
}
- syslog(LOG_DEBUG, "<%s> msglen=%d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> msglen=%zu", __func__, len);
memcpy(bin, (char *)str, len);
return (len);
diff --git a/usr.sbin/rtadvd/control_server.c b/usr.sbin/rtadvd/control_server.c
index 4432994..7d2ddc5 100644
--- a/usr.sbin/rtadvd/control_server.c
+++ b/usr.sbin/rtadvd/control_server.c
@@ -55,15 +55,18 @@
#include "control_server.h"
#include "timer.h"
-static sig_atomic_t p_do_reload;
-static sig_atomic_t p_do_die;
-
-void set_do_reload(int sig __unused) { p_do_reload = 1; }
-void set_do_die(int sig __unused) { p_do_die = 1; }
-void reset_do_reload(void) { p_do_reload = 0; }
-void reset_do_die(void) { p_do_die = 0; }
-int do_reload(void) { return (p_do_reload); }
-int do_die(void) { return (p_do_die); }
+static char *do_reload_ifname;
+static int do_reload;
+static int do_shutdown;
+
+void set_do_reload(int sig __unused) { do_reload = 1; }
+void set_do_reload_ifname(char *ifname){ do_reload_ifname = ifname; }
+void set_do_shutdown(int sig __unused) { do_shutdown = 1; }
+void reset_do_reload(void) { do_reload = 0; do_reload_ifname = NULL; }
+void reset_do_shutdown(void) { do_shutdown = 0; }
+int is_do_reload(void) { return (do_reload); }
+int is_do_shutdown(void) { return (do_shutdown); }
+char *reload_ifname(void) { return (do_reload_ifname); }
#define DEF_PL_HANDLER(key) { #key, cmsg_getprop_##key }
@@ -71,14 +74,16 @@ static int cmsg_getprop_echo(struct ctrl_msg_pl *);
static int cmsg_getprop_version(struct ctrl_msg_pl *);
static int cmsg_getprop_ifilist(struct ctrl_msg_pl *);
static int cmsg_getprop_ifi(struct ctrl_msg_pl *);
+static int cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *);
static int cmsg_getprop_rai(struct ctrl_msg_pl *);
-static int cmsg_getprop_rai_timer(struct ctrl_msg_pl *);
static int cmsg_getprop_pfx(struct ctrl_msg_pl *);
static int cmsg_getprop_rdnss(struct ctrl_msg_pl *);
static int cmsg_getprop_dnssl(struct ctrl_msg_pl *);
-#ifdef ROUTEINFO
static int cmsg_getprop_rti(struct ctrl_msg_pl *);
-#endif
+
+static int cmsg_setprop_reload(struct ctrl_msg_pl *);
+static int cmsg_setprop_enable(struct ctrl_msg_pl *);
+static int cmsg_setprop_disable(struct ctrl_msg_pl *);
static struct dispatch_table {
const char *dt_comm;
@@ -89,11 +94,9 @@ static struct dispatch_table {
DEF_PL_HANDLER(version),
DEF_PL_HANDLER(ifilist),
DEF_PL_HANDLER(ifi),
+ DEF_PL_HANDLER(ifi_ra_timer),
DEF_PL_HANDLER(rai),
- DEF_PL_HANDLER(rai_timer),
-#ifdef ROUTEINFO
DEF_PL_HANDLER(rti),
-#endif
DEF_PL_HANDLER(pfx),
DEF_PL_HANDLER(rdnss),
DEF_PL_HANDLER(dnssl),
@@ -135,7 +138,7 @@ cmsg_getprop_ifilist(struct ctrl_msg_pl *cp)
len += strlen(ifi->ifi_ifname) + 1;
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -179,7 +182,7 @@ cmsg_getprop_ifi(struct ctrl_msg_pl *cp)
exit(1);
len = cmsg_str2bin(p, ifi, sizeof(*ifi));
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
if (len == 0)
return (1);
@@ -220,7 +223,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp)
exit(1);
len = cmsg_str2bin(p, rai, sizeof(*rai));
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
if (len == 0)
return (1);
@@ -232,7 +235,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp)
}
static int
-cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
+cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp)
{
struct ifinfo *ifi;
struct rainfo *rai;
@@ -256,8 +259,8 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
cp->cp_ifname);
return (1);
}
- if ((rtimer = rai->rai_timer) == NULL) {
- syslog(LOG_ERR, "<%s> %s has no rai_timer", __func__,
+ if ((rtimer = ifi->ifi_ra_timer) == NULL) {
+ syslog(LOG_ERR, "<%s> %s has no ifi_ra_timer", __func__,
cp->cp_ifname);
return (1);
}
@@ -266,7 +269,7 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
exit(1);
len = cmsg_str2bin(p, rtimer, sizeof(*rtimer));
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
if (len == 0)
return (1);
@@ -277,7 +280,6 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp)
return (0);
}
-#ifdef ROUTEINFO
static int
cmsg_getprop_rti(struct ctrl_msg_pl *cp)
{
@@ -309,7 +311,7 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp)
len += sizeof(*rti);
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -326,7 +328,6 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp)
return (0);
}
-#endif
static int
cmsg_getprop_pfx(struct ctrl_msg_pl *cp)
@@ -359,7 +360,7 @@ cmsg_getprop_pfx(struct ctrl_msg_pl *cp)
len += sizeof(*pfx);
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -386,8 +387,8 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
struct rdnss_addr *rda;
char *p;
size_t len;
- u_int16_t *rdn_cnt;
- u_int16_t *rda_cnt;
+ uint16_t *rdn_cnt;
+ uint16_t *rda_cnt;
syslog(LOG_DEBUG, "<%s> enter", __func__);
@@ -417,7 +418,7 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
}
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -425,14 +426,14 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp)
memset(p, 0, len);
cp->cp_val = p;
- rdn_cnt = (u_int16_t *)p;
+ rdn_cnt = (uint16_t *)p;
p += sizeof(*rdn_cnt);
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) {
*rdn_cnt += 1;
memcpy(p, rdn, sizeof(*rdn));
p += sizeof(*rdn);
- rda_cnt = (u_int16_t *)p;
+ rda_cnt = (uint16_t *)p;
p += sizeof(*rda_cnt);
TAILQ_FOREACH(rda, &rdn->rd_list, ra_next) {
*rda_cnt += 1;
@@ -455,8 +456,8 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
struct dnssl_addr *dna;
char *p;
size_t len;
- u_int16_t *dns_cnt;
- u_int16_t *dna_cnt;
+ uint16_t *dns_cnt;
+ uint16_t *dna_cnt;
syslog(LOG_DEBUG, "<%s> enter", __func__);
@@ -486,7 +487,7 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
}
}
- syslog(LOG_DEBUG, "<%s> len = %d", __func__, len);
+ syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len);
p = malloc(len);
if (p == NULL)
@@ -494,14 +495,14 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp)
memset(p, 0, len);
cp->cp_val = p;
- dns_cnt = (u_int16_t *)cp->cp_val;
+ dns_cnt = (uint16_t *)cp->cp_val;
p += sizeof(*dns_cnt);
TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) {
(*dns_cnt)++;
memcpy(p, dns, sizeof(*dns));
p += sizeof(*dns);
- dna_cnt = (u_int16_t *)p;
+ dna_cnt = (uint16_t *)p;
p += sizeof(*dna_cnt);
TAILQ_FOREACH(dna, &dns->dn_list, da_next) {
(*dna_cnt)++;
@@ -541,10 +542,14 @@ cmsg_setprop(struct ctrl_msg_pl *cp)
if (cp == NULL || cp->cp_key == NULL)
return (1);
- if (strncmp(cp->cp_key, "reload", 8) == 0)
- set_do_reload(0);
- else if (strncmp(cp->cp_key, "shutdown", 8) == 0)
- set_do_die(0);
+ if (strncmp(cp->cp_key, "reload", sizeof("reload")) == 0)
+ cmsg_setprop_reload(cp);
+ else if (strncmp(cp->cp_key, "shutdown", sizeof("shutdown")) == 0)
+ set_do_shutdown(0);
+ else if (strncmp(cp->cp_key, "enable", sizeof("enable")) == 0)
+ cmsg_setprop_enable(cp);
+ else if (strncmp(cp->cp_key, "disable", sizeof("disable")) == 0)
+ cmsg_setprop_disable(cp);
else if (strncmp(cp->cp_key, "echo", 8) == 0)
; /* do nothing */
else
@@ -553,6 +558,64 @@ cmsg_setprop(struct ctrl_msg_pl *cp)
return (0);
}
+static int
+cmsg_setprop_reload(struct ctrl_msg_pl *cp)
+{
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ set_do_reload_ifname(cp->cp_ifname);
+ set_do_reload(1);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_enable(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ ifi->ifi_persist = 1;
+ set_do_reload_ifname(ifi->ifi_ifname);
+ set_do_reload(0);
+
+ return (0);
+}
+
+static int
+cmsg_setprop_disable(struct ctrl_msg_pl *cp)
+{
+ struct ifinfo *ifi;
+
+ syslog(LOG_DEBUG, "<%s> enter", __func__);
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_ERR, "<%s> %s not found", __func__,
+ cp->cp_ifname);
+ return (1);
+ }
+
+ ifi->ifi_persist = 0;
+
+ return (0);
+}
+
int
cmsg_handler_server(int fd)
{
@@ -626,7 +689,7 @@ cmsg_handler_server(int fd)
syslog(LOG_DEBUG,
"<%s> cm->cm_type = %d", __func__, cm->cm_type);
syslog(LOG_DEBUG,
- "<%s> cm->cm_len = %d", __func__, cm->cm_len);
+ "<%s> cm->cm_len = %zu", __func__, cm->cm_len);
switch (cm->cm_type) {
case CM_TYPE_EOM:
@@ -646,6 +709,8 @@ cmsg_handler_server(int fd)
cm->cm_len = sizeof(*cm);
cm->cm_len += cmsg_pl2bin(msg, &cp);
}
+ if (cp.cp_val != NULL)
+ free(cp.cp_val);
break;
case CM_TYPE_REQ_SET_PROP:
cmsg_bin2pl(msg, &cp);
diff --git a/usr.sbin/rtadvd/control_server.h b/usr.sbin/rtadvd/control_server.h
index 848e59e..2aab0cd 100644
--- a/usr.sbin/rtadvd/control_server.h
+++ b/usr.sbin/rtadvd/control_server.h
@@ -33,8 +33,10 @@ int cmsg_setprop(struct ctrl_msg_pl *);
int cmsg_handler_server(int);
void set_do_reload(int);
-void set_do_die(int);
+void set_do_reload_ifname(char *);
+void set_do_shutdown(int);
void reset_do_reload(void);
-void reset_do_die(void);
-int do_reload(void);
-int do_die(void);
+void reset_do_shutdown(void);
+int is_do_reload(void);
+char *reload_ifname(void);
+int is_do_shutdown(void);
diff --git a/usr.sbin/rtadvd/if.c b/usr.sbin/rtadvd/if.c
index ad42d29..b857356 100644
--- a/usr.sbin/rtadvd/if.c
+++ b/usr.sbin/rtadvd/if.c
@@ -281,19 +281,19 @@ get_prefixlen(char *buf)
{
struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
struct sockaddr *sa, *rti_info[RTAX_MAX];
- u_char *p, *lim;
+ char *p, *lim;
sa = (struct sockaddr *)(rtm + 1);
get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
sa = rti_info[RTAX_NETMASK];
- p = (u_char *)(&SIN6(sa)->sin6_addr);
- lim = (u_char *)sa + sa->sa_len;
+ p = (char *)(&SIN6(sa)->sin6_addr);
+ lim = (char *)sa + sa->sa_len;
return prefixlen(p, lim);
}
int
-prefixlen(u_char *p, u_char *lim)
+prefixlen(unsigned char *p, unsigned char *lim)
{
int masklen;
@@ -442,7 +442,7 @@ update_ifinfo(struct ifilist_head_t *ifi_head, int ifindex)
ifm = get_next_msghdr(ifm,(struct if_msghdr *)lim)) {
int ifi_new;
- syslog(LOG_DEBUG, "<%s> ifm = %p, lim = %p, diff = %d",
+ syslog(LOG_DEBUG, "<%s> ifm = %p, lim = %p, diff = %zu",
__func__, ifm, lim, (char *)lim - (char *)ifm);
if (ifm->ifm_version != RTM_VERSION) {
diff --git a/usr.sbin/rtadvd/if.h b/usr.sbin/rtadvd/if.h
index 5479216..6efdd56 100644
--- a/usr.sbin/rtadvd/if.h
+++ b/usr.sbin/rtadvd/if.h
@@ -48,7 +48,7 @@ char *get_next_msg(char *, char *, int, size_t *, int);
struct in6_addr *get_addr(char *);
int get_rtm_ifindex(char *);
int get_prefixlen(char *);
-int prefixlen(u_char *, u_char *);
+int prefixlen(unsigned char *, unsigned char *);
struct ifinfo *update_ifinfo(struct ifilist_head_t *, int);
int update_ifinfo_nd_flags(struct ifinfo *);
diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c
index d67280a..2d94b06 100644
--- a/usr.sbin/rtadvd/rtadvd.c
+++ b/usr.sbin/rtadvd/rtadvd.c
@@ -61,15 +61,14 @@
#include <stdio.h>
#include <err.h>
#include <errno.h>
+#include <inttypes.h>
#include <libutil.h>
#include <netdb.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <syslog.h>
-#ifdef HAVE_POLL_H
#include <poll.h>
-#endif
#include "pathnames.h"
#include "rtadvd.h"
@@ -85,9 +84,9 @@
#define RTADV_TYPE2BITMASK(type) (0x1 << type)
struct msghdr rcvmhdr;
-static u_char *rcvcmsgbuf;
+static char *rcvcmsgbuf;
static size_t rcvcmsgbuflen;
-static u_char *sndcmsgbuf = NULL;
+static char *sndcmsgbuf = NULL;
static size_t sndcmsgbuflen;
struct msghdr sndmhdr;
struct iovec rcviov[2];
@@ -97,13 +96,12 @@ static const char *pidfilename = _PATH_RTADVDPID;
const char *conffile = _PATH_RTADVDCONF;
static struct pidfh *pfh;
int dflag = 0, sflag = 0;
+static int wait_shutdown;
-#ifdef HAVE_POLL_H
#define PFD_RAWSOCK 0
#define PFD_RTSOCK 1
#define PFD_CSOCK 2
#define PFD_MAX 3
-#endif
struct railist_head_t railist =
TAILQ_HEAD_INITIALIZER(railist);
@@ -141,7 +139,7 @@ union nd_opt {
#define NDOPT_FLAG_RDNSS (1 << 5)
#define NDOPT_FLAG_DNSSL (1 << 6)
-u_int32_t ndopt_flags[] = {
+uint32_t ndopt_flags[] = {
[ND_OPT_SOURCE_LINKADDR] = NDOPT_FLAG_SRCLINKADDR,
[ND_OPT_TARGET_LINKADDR] = NDOPT_FLAG_TGTLINKADDR,
[ND_OPT_PREFIX_INFORMATION] = NDOPT_FLAG_PREFIXINFO,
@@ -151,7 +149,7 @@ u_int32_t ndopt_flags[] = {
[ND_OPT_DNSSL] = NDOPT_FLAG_DNSSL,
};
-static void die(void);
+static void rtadvd_shutdown(void);
static void sock_open(struct sockinfo *);
static void rtsock_open(struct sockinfo *);
static void rtadvd_input(struct sockinfo *);
@@ -162,22 +160,16 @@ static void ra_input(int, struct nd_router_advert *,
static int prefix_check(struct nd_opt_prefix_info *, struct rainfo *,
struct sockaddr_in6 *);
static int nd6_options(struct nd_opt_hdr *, int,
- union nd_opt *, u_int32_t);
+ union nd_opt *, uint32_t);
static void free_ndopts(union nd_opt *);
static void rtmsg_input(struct sockinfo *);
-static void set_short_delay(struct rainfo *);
+static void set_short_delay(struct ifinfo *);
static int check_accept_rtadv(int);
int
main(int argc, char *argv[])
{
-#ifdef HAVE_POLL_H
struct pollfd set[PFD_MAX];
-#else
- fd_set *fdsetp, *selectfdp;
- int fdmasks;
- int maxfd = 0;
-#endif
struct timeval *timeout;
int i, ch;
int fflag = 0, logopt;
@@ -250,7 +242,7 @@ main(int argc, char *argv[])
#ifdef __FreeBSD__
srandomdev();
#else
- srandom((u_long)time(NULL));
+ srandom((unsigned long)time(NULL));
#endif
#endif
pfh = pidfile_open(pidfilename, 0600, &otherpid);
@@ -281,7 +273,6 @@ main(int argc, char *argv[])
pid = getpid();
pidfile_write(pfh);
-#ifdef HAVE_POLL_H
set[PFD_RAWSOCK].fd = sock.si_fd;
set[PFD_RAWSOCK].events = POLLIN;
if (sflag == 0) {
@@ -292,34 +283,8 @@ main(int argc, char *argv[])
set[PFD_RTSOCK].fd = -1;
set[PFD_CSOCK].fd = ctrlsock.si_fd;
set[PFD_CSOCK].events = POLLIN;
-#else
- maxfd = sock.si_fd;
- if (sflag == 0) {
- rtsock_open();
- if (rtsock.si_fd > sock.si_fd)
- maxfd = rtsock.si_fd;
- } else
- rtsock.si_fd = -1;
- if (maxfd < ctrlsock.si_fd)
- maxfd = ctrlsock.si_fd;
-
- fdmasks = howmany(maxfd + 1, NFDBITS) * sizeof(fd_mask);
- if ((fdsetp = malloc(fdmasks)) == NULL) {
- err(1, "malloc");
- /*NOTREACHED*/
- }
- if ((selectfdp = malloc(fdmasks)) == NULL) {
- err(1, "malloc");
- /*NOTREACHED*/
- }
- memset(fdsetp, 0, fdmasks);
- FD_SET(sock.si_fd, fdsetp);
- if (rtsock.si_fd >= 0)
- FD_SET(rtsock.si_fd, fdsetp);
- FD_SET(ctrlsock.si_fd, fdsetp);
-#endif
- signal(SIGTERM, set_do_die);
- signal(SIGINT, set_do_die);
+ signal(SIGTERM, set_do_shutdown);
+ signal(SIGINT, set_do_shutdown);
signal(SIGHUP, set_do_reload);
error = csock_listen(&ctrlsock);
@@ -332,22 +297,24 @@ main(int argc, char *argv[])
set_do_reload(0);
while (1) {
-#ifndef HAVE_POLL_H
- memcpy(selectfdp, fdsetp, fdmasks); /* reinitialize */
-#endif
- if (do_die())
- die();
+ if (is_do_shutdown())
+ rtadvd_shutdown();
- if (do_reload()) {
+ if (is_do_reload()) {
+ loadconfig_ifname(reload_ifname());
+ if (reload_ifname() == NULL)
+ syslog(LOG_INFO,
+ "configuration file reloaded.");
+ else
+ syslog(LOG_INFO,
+ "configuration file for %s reloaded.",
+ reload_ifname());
reset_do_reload();
- loadconfig_ifname(NULL);
- syslog(LOG_INFO,
- "configuration file reloaded.");
}
/* timeout handler update for active interfaces */
rtadvd_update_timeout_handler();
-
+
/* timer expiration check and reset the timer */
timeout = rtadvd_check_timer();
@@ -362,15 +329,9 @@ main(int argc, char *argv[])
"<%s> there's no timer. waiting for inputs",
__func__);
}
-#ifdef HAVE_POLL_H
if ((i = poll(set, sizeof(set)/sizeof(set[0]),
timeout ? (timeout->tv_sec * 1000 +
- timeout->tv_usec / 1000) : INFTIM)) < 0)
-#else
- if ((i = select(maxfd + 1, selectfdp, NULL, NULL,
- timeout)) < 0)
-#endif
- {
+ timeout->tv_usec / 1000) : INFTIM)) < 0) {
/* EINTR would occur upon SIGUSR1 for status dump */
if (errno != EINTR)
syslog(LOG_ERR, "<%s> select: %s",
@@ -379,71 +340,90 @@ main(int argc, char *argv[])
}
if (i == 0) /* timeout */
continue;
-#ifdef HAVE_POLL_H
if (rtsock.si_fd != -1 && set[PFD_RTSOCK].revents & POLLIN)
-#else
- if (rtsock.si_fd != -1 && FD_ISSET(rtsock.si_fd, selectfdp))
-#endif
rtmsg_input(&rtsock);
-#ifdef HAVE_POLL_H
+
if (set[PFD_RAWSOCK].revents & POLLIN)
-#else
- if (FD_ISSET(sock.si_fd, selectfdp))
-#endif
rtadvd_input(&sock);
-#ifdef HAVE_POLL_H
- if (set[PFD_CSOCK].revents & POLLIN)
-#else
- if (FD_ISSET(ctrlsock.si_fd, selectfdp))
-#endif
- {
+
+ if (set[PFD_CSOCK].revents & POLLIN) {
int fd;
-
+
fd = csock_accept(&ctrlsock);
if (fd == -1)
syslog(LOG_ERR, "<%s> accept", __func__);
- else
+ else {
cmsg_handler_server(fd);
+ close(fd);
+ }
}
}
exit(0); /* NOTREACHED */
}
static void
-die(void)
+rtadvd_shutdown(void)
{
+ struct ifinfo *ifi;
struct rainfo *rai;
struct rdnss *rdn;
struct dnssl *dns;
- int i;
- const int retrans = MAX_FINAL_RTR_ADVERTISEMENTS;
+
+ if (wait_shutdown) {
+ syslog(LOG_INFO,
+ "waiting expiration of the all RA timers\n");
+
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (ifi->ifi_ra_timer != NULL)
+ break;
+ }
+ if (ifi == NULL) {
+ syslog(LOG_INFO, "gracefully terminated.\n");
+ exit(0);
+ }
+
+ sleep(1);
+ return;
+ }
syslog(LOG_DEBUG, "<%s> cease to be an advertising router\n",
__func__);
+ wait_shutdown = 1;
+
TAILQ_FOREACH(rai, &railist, rai_next) {
rai->rai_lifetime = 0;
TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next)
rdn->rd_ltime = 0;
TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next)
dns->dn_ltime = 0;
- make_packet(rai);
- }
- for (i = 0; i < retrans; i++) {
- syslog(LOG_INFO, "<%s> final RA transmission #%d/%d\n",
- __func__, i, retrans - i);
- TAILQ_FOREACH(rai, &railist, rai_next)
- if (rai->rai_ifinfo->ifi_state
- == IFI_STATE_CONFIGURED)
- ra_output(rai);
- syslog(LOG_INFO, "<%s> waiting for %d sec.\n",
- __func__, MIN_DELAY_BETWEEN_RAS);
- sleep(MIN_DELAY_BETWEEN_RAS);
}
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (!ifi->ifi_persist)
+ continue;
+ if (ifi->ifi_state == IFI_STATE_UNCONFIGURED)
+ continue;
+ if (ifi->ifi_ra_timer == NULL)
+ continue;
+
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+
+ /* Mark as the shut-down state. */
+ ifi->ifi_rainfo_trans = ifi->ifi_rainfo;
+ ifi->ifi_rainfo = NULL;
+
+ ifi->ifi_burstcount = MAX_FINAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval = MIN_DELAY_BETWEEN_RAS;
+
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
+ }
+ syslog(LOG_INFO,
+ "<%s> final RA transmission started.\n", __func__);
+
pidfile_remove(pfh);
csock_close(&ctrlsock);
-
- exit(0);
}
static void
@@ -452,7 +432,7 @@ rtmsg_input(struct sockinfo *s)
int n, type, ifindex = 0, plen;
size_t len;
char msg[2048], *next, *lim;
- u_char ifname[IFNAMSIZ];
+ char ifname[IFNAMSIZ];
struct if_announcemsghdr *ifan;
struct rt_msghdr *rtm;
struct prefix *pfx;
@@ -540,7 +520,16 @@ rtmsg_input(struct sockinfo *s)
syslog(LOG_INFO,
"<%s>: interface removed (idx=%d)",
__func__, ifan->ifan_index);
- rmconfig(ifan->ifan_index);
+ rm_ifinfo_index(ifan->ifan_index);
+
+ /* Clear ifi_ifindex */
+ TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
+ if (ifi->ifi_ifindex
+ == ifan->ifan_index) {
+ ifi->ifi_ifindex = 0;
+ break;
+ }
+ }
update_ifinfo(&ifilist, ifan->ifan_index);
break;
}
@@ -577,7 +566,7 @@ rtmsg_input(struct sockinfo *s)
case RTM_ADD:
if (sflag)
break; /* we aren't interested in prefixes */
-
+
addr = get_addr(msg);
plen = get_prefixlen(msg);
/* sanity check for plen */
@@ -659,29 +648,32 @@ rtmsg_input(struct sockinfo *s)
syslog(LOG_INFO,
"<%s> interface %s becomes down. stop timer.",
__func__, ifi->ifi_ifname);
- rtadvd_remove_timer(rai->rai_timer);
- rai->rai_timer = NULL;
+ rtadvd_remove_timer(ifi->ifi_ra_timer);
+ ifi->ifi_ra_timer = NULL;
} else if (!(oldifflags & IFF_UP) && /* DOWN to UP */
(ifi->ifi_flags & IFF_UP)) {
syslog(LOG_INFO,
"<%s> interface %s becomes up. restart timer.",
__func__, ifi->ifi_ifname);
- rai->rai_initcounter = 0; /* reset the counter */
- rai->rai_waiting = 0; /* XXX */
- rai->rai_timer = rtadvd_add_timer(ra_timeout,
- ra_timer_update, rai, rai);
- ra_timer_update(rai, &rai->rai_timer->rat_tm);
- rtadvd_set_timer(&rai->rai_timer->rat_tm,
- rai->rai_timer);
+ ifi->ifi_state = IFI_STATE_TRANSITIVE;
+ ifi->ifi_burstcount =
+ MAX_INITIAL_RTR_ADVERTISEMENTS;
+ ifi->ifi_burstinterval =
+ MAX_INITIAL_RTR_ADVERT_INTERVAL;
+
+ ifi->ifi_ra_timer = rtadvd_add_timer(ra_timeout,
+ ra_timer_update, ifi, ifi);
+ ra_timer_update(ifi, &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
} else if (prefixchange &&
(ifi->ifi_flags & IFF_UP)) {
/*
* An advertised prefix has been added or invalidated.
* Will notice the change in a short delay.
*/
- rai->rai_initcounter = 0;
- set_short_delay(rai);
+ set_short_delay(ifi);
}
}
@@ -700,12 +692,12 @@ rtadvd_input(struct sockinfo *s)
int ifindex = 0;
struct cmsghdr *cm;
struct in6_pktinfo *pi = NULL;
- u_char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
+ char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ];
struct in6_addr dst = in6addr_any;
struct ifinfo *ifi;
syslog(LOG_DEBUG, "<%s> enter", __func__);
-
+
if (s == NULL) {
syslog(LOG_ERR, "<%s> internal error", __func__);
exit(1);
@@ -896,8 +888,8 @@ static void
rs_input(int len, struct nd_router_solicit *rs,
struct in6_pktinfo *pi, struct sockaddr_in6 *from)
{
- u_char ntopbuf[INET6_ADDRSTRLEN];
- u_char ifnamebuf[IFNAMSIZ];
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ifnamebuf[IFNAMSIZ];
union nd_opt ndopts;
struct rainfo *rai;
struct ifinfo *ifi;
@@ -973,10 +965,10 @@ rs_input(int len, struct nd_router_solicit *rs,
* If there is already a waiting RS packet, don't
* update the timer.
*/
- if (rai->rai_waiting++)
+ if (ifi->ifi_rs_waitcount++)
goto done;
- set_short_delay(rai);
+ set_short_delay(ifi);
done:
free_ndopts(&ndopts);
@@ -984,7 +976,7 @@ rs_input(int len, struct nd_router_solicit *rs,
}
static void
-set_short_delay(struct rainfo *rai)
+set_short_delay(struct ifinfo *ifi)
{
long delay; /* must not be greater than 1000000 */
struct timeval interval, now, min_delay, tm_tmp, *rest;
@@ -1003,7 +995,7 @@ set_short_delay(struct rainfo *rai)
#endif
interval.tv_sec = 0;
interval.tv_usec = delay;
- rest = rtadvd_timer_rest(rai->rai_timer);
+ rest = rtadvd_timer_rest(ifi->ifi_ra_timer);
if (TIMEVAL_LT(rest, &interval)) {
syslog(LOG_DEBUG, "<%s> random delay is larger than "
"the rest of the current timer", __func__);
@@ -1018,22 +1010,21 @@ set_short_delay(struct rainfo *rai)
* previous advertisement was sent.
*/
gettimeofday(&now, NULL);
- TIMEVAL_SUB(&now, &rai->rai_lastsent, &tm_tmp);
+ TIMEVAL_SUB(&now, &ifi->ifi_ra_lastsent, &tm_tmp);
min_delay.tv_sec = MIN_DELAY_BETWEEN_RAS;
min_delay.tv_usec = 0;
if (TIMEVAL_LT(&tm_tmp, &min_delay)) {
TIMEVAL_SUB(&min_delay, &tm_tmp, &min_delay);
TIMEVAL_ADD(&min_delay, &interval, &interval);
}
- rtadvd_set_timer(&interval, rai->rai_timer);
+ rtadvd_set_timer(&interval, ifi->ifi_ra_timer);
}
static int
check_accept_rtadv(int idx)
{
struct ifinfo *ifi;
- int error;
-
+
TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
if (ifi->ifi_ifindex == idx)
break;
@@ -1044,15 +1035,27 @@ check_accept_rtadv(int idx)
__func__, idx);
return (0);
}
- error =update_ifinfo_nd_flags(ifi);
- if (error) {
+#if (__FreeBSD_version < 900000)
+ /*
+ * RA_RECV: !ip6.forwarding && ip6.accept_rtadv
+ * RA_SEND: ip6.forwarding
+ */
+ return ((getinet6sysctl(IPV6CTL_FORWARDING) == 0) &&
+ (getinet6sysctl(IPV6CTL_ACCEPT_RTADV) == 1));
+#else
+ /*
+ * RA_RECV: ND6_IFF_ACCEPT_RTADV
+ * RA_SEND: ip6.forwarding
+ */
+ if (update_ifinfo_nd_flags(ifi) != 0) {
syslog(LOG_ERR,
"<%s> nd6 flags failed (idx=%d)",
__func__, idx);
return (0);
}
-
+
return (ifi->ifi_nd_flags & ND6_IFF_ACCEPT_RTADV);
+#endif
}
static void
@@ -1061,11 +1064,11 @@ ra_input(int len, struct nd_router_advert *nra,
{
struct rainfo *rai;
struct ifinfo *ifi;
- u_char ntopbuf[INET6_ADDRSTRLEN];
- u_char ifnamebuf[IFNAMSIZ];
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char ifnamebuf[IFNAMSIZ];
union nd_opt ndopts;
const char *on_off[] = {"OFF", "ON"};
- u_int32_t reachabletime, retranstimer, mtu;
+ uint32_t reachabletime, retranstimer, mtu;
int inconsistent = 0;
int error;
@@ -1105,9 +1108,9 @@ ra_input(int len, struct nd_router_advert *nra,
}
rai = ifi->ifi_rainfo;
ifi->ifi_rainput++;
- syslog(LOG_DEBUG, "<%s> ifi->ifi_rainput = %llu\n", __func__,
+ syslog(LOG_DEBUG, "<%s> ifi->ifi_rainput = %" PRIu64 "\n", __func__,
ifi->ifi_rainput);
-
+
/* Cur Hop Limit value */
if (nra->nd_ra_curhoplimit && rai->rai_hoplimit &&
nra->nd_ra_curhoplimit != rai->rai_hoplimit) {
@@ -1206,11 +1209,11 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
struct rainfo *rai, struct sockaddr_in6 *from)
{
struct ifinfo *ifi;
- u_int32_t preferred_time, valid_time;
+ uint32_t preferred_time, valid_time;
struct prefix *pfx;
int inconsistent = 0;
- u_char ntopbuf[INET6_ADDRSTRLEN];
- u_char prefixbuf[INET6_ADDRSTRLEN];
+ char ntopbuf[INET6_ADDRSTRLEN];
+ char prefixbuf[INET6_ADDRSTRLEN];
struct timeval now;
#if 0 /* impossible */
@@ -1262,7 +1265,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
syslog(LOG_INFO,
"<%s> preferred lifetime for %s/%d"
" (decr. in real time) inconsistent on %s:"
- " %d from %s, %ld from us",
+ " %" PRIu32 " from %s, %" PRIu32 " from us",
__func__,
inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, prefixbuf,
sizeof(prefixbuf)),
@@ -1295,7 +1298,7 @@ prefix_check(struct nd_opt_prefix_info *pinfo,
syslog(LOG_INFO,
"<%s> valid lifetime for %s/%d"
" (decr. in real time) inconsistent on %s:"
- " %d from %s, %ld from us",
+ " %d from %s, %" PRIu32 " from us",
__func__,
inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, prefixbuf,
sizeof(prefixbuf)),
@@ -1328,7 +1331,7 @@ find_prefix(struct rainfo *rai, struct in6_addr *prefix, int plen)
{
struct prefix *pfx;
int bytelen, bitlen;
- u_char bitmask;
+ char bitmask;
TAILQ_FOREACH(pfx, &rai->rai_prefix, pfx_next) {
if (plen != pfx->pfx_prefixlen)
@@ -1357,7 +1360,7 @@ prefix_match(struct in6_addr *p0, int plen0,
struct in6_addr *p1, int plen1)
{
int bytelen, bitlen;
- u_char bitmask;
+ char bitmask;
if (plen0 < plen1)
return (0);
@@ -1380,7 +1383,7 @@ prefix_match(struct in6_addr *p0, int plen0,
static int
nd6_options(struct nd_opt_hdr *hdr, int limit,
- union nd_opt *ndopts, u_int32_t optflags)
+ union nd_opt *ndopts, uint32_t optflags)
{
int optlen = 0;
@@ -1510,7 +1513,7 @@ sock_open(struct sockinfo *s)
struct icmp6_filter filt;
int on;
/* XXX: should be max MTU attached to the node */
- static u_char answer[1500];
+ static char answer[1500];
syslog(LOG_DEBUG, "<%s> enter", __func__);
@@ -1520,7 +1523,7 @@ sock_open(struct sockinfo *s)
}
rcvcmsgbuflen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
CMSG_SPACE(sizeof(int));
- rcvcmsgbuf = (u_char *)malloc(rcvcmsgbuflen);
+ rcvcmsgbuf = (char *)malloc(rcvcmsgbuflen);
if (rcvcmsgbuf == NULL) {
syslog(LOG_ERR, "<%s> not enough core", __func__);
exit(1);
@@ -1528,7 +1531,7 @@ sock_open(struct sockinfo *s)
sndcmsgbuflen = CMSG_SPACE(sizeof(struct in6_pktinfo)) +
CMSG_SPACE(sizeof(int));
- sndcmsgbuf = (u_char *)malloc(sndcmsgbuflen);
+ sndcmsgbuf = (char *)malloc(sndcmsgbuflen);
if (sndcmsgbuf == NULL) {
syslog(LOG_ERR, "<%s> not enough core", __func__);
exit(1);
@@ -1623,21 +1626,34 @@ if_indextoifinfo(int idx)
}
void
-ra_output(struct rainfo *rai)
+ra_output(struct ifinfo *ifi)
{
int i;
struct cmsghdr *cm;
struct in6_pktinfo *pi;
struct soliciter *sol;
- struct ifinfo *ifi;
-
- ifi = rai->rai_ifinfo;
+ struct rainfo *rai;
- if (ifi->ifi_state != IFI_STATE_CONFIGURED) {
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ rai = ifi->ifi_rainfo;
+ break;
+ case IFI_STATE_TRANSITIVE:
+ rai = ifi->ifi_rainfo_trans;
+ break;
+ case IFI_STATE_UNCONFIGURED:
syslog(LOG_DEBUG, "<%s> %s is unconfigured. "
"Skip sending RAs.",
__func__, ifi->ifi_ifname);
return;
+ default:
+ rai = NULL;
+ }
+ if (rai == NULL) {
+ syslog(LOG_DEBUG, "<%s> rainfo is NULL on %s."
+ "Skip sending RAs.",
+ __func__, ifi->ifi_ifname);
+ return;
}
if (!(ifi->ifi_flags & IFF_UP)) {
syslog(LOG_DEBUG, "<%s> %s is not up. "
@@ -1649,7 +1665,7 @@ ra_output(struct rainfo *rai)
* Check lifetime, ACCEPT_RTADV flag, and ip6.forwarding.
*
* (lifetime == 0) = output
- * (lifetime != 0 && (ACCEPT_RTADV || !ip6.forwarding) = no output
+ * (lifetime != 0 && (check_accept_rtadv()) = no output
*
* Basically, hosts MUST NOT send Router Advertisement
* messages at any time (RFC 4861, Section 6.2.3). However, it
@@ -1660,9 +1676,13 @@ ra_output(struct rainfo *rai)
* zero. (see also the above section)
*/
syslog(LOG_DEBUG,
- "<%s> check lifetime=%d, ACCEPT_RTADV=%d, ip6.forwarding=%d on %s",
- __func__, rai->rai_lifetime, check_accept_rtadv(ifi->ifi_ifindex),
- getinet6sysctl(IPV6CTL_FORWARDING), ifi->ifi_ifname);
+ "<%s> check lifetime=%d, ACCEPT_RTADV=%d, ip6.forwarding=%d "
+ "on %s", __func__,
+ rai->rai_lifetime,
+ check_accept_rtadv(ifi->ifi_ifindex),
+ getinet6sysctl(IPV6CTL_FORWARDING),
+ ifi->ifi_ifname);
+
if (rai->rai_lifetime != 0) {
if (check_accept_rtadv(ifi->ifi_ifindex)) {
syslog(LOG_INFO,
@@ -1707,8 +1727,8 @@ ra_output(struct rainfo *rai)
}
syslog(LOG_DEBUG,
- "<%s> send RA on %s, # of waitings = %d",
- __func__, ifi->ifi_ifname, rai->rai_waiting);
+ "<%s> send RA on %s, # of RS waitings = %d",
+ __func__, ifi->ifi_ifname, ifi->ifi_rs_waitcount);
i = sendmsg(sock.si_fd, &sndmhdr, 0);
@@ -1719,10 +1739,6 @@ ra_output(struct rainfo *rai)
strerror(errno));
}
}
- /* update counter */
- if (rai->rai_initcounter < MAX_INITIAL_RTR_ADVERTISEMENTS)
- rai->rai_initcounter++;
- ifi->ifi_raoutput++;
/*
* unicast advertisements
@@ -1735,66 +1751,136 @@ ra_output(struct rainfo *rai)
}
/* update timestamp */
- gettimeofday(&rai->rai_lastsent, NULL);
+ gettimeofday(&ifi->ifi_ra_lastsent, NULL);
+
+ /* update counter */
+ ifi->ifi_rs_waitcount = 0;
+ ifi->ifi_raoutput++;
+
+ switch (ifi->ifi_state) {
+ case IFI_STATE_CONFIGURED:
+ if (ifi->ifi_burstcount > 0)
+ ifi->ifi_burstcount--;
+ break;
+ case IFI_STATE_TRANSITIVE:
+ ifi->ifi_burstcount--;
+ if (ifi->ifi_burstcount == 0) {
+ if (ifi->ifi_rainfo == ifi->ifi_rainfo_trans) {
+ /* Inital burst finished. */
+ if (ifi->ifi_rainfo_trans != NULL)
+ ifi->ifi_rainfo_trans = NULL;
+ }
+
+ /* Remove burst RA information */
+ if (ifi->ifi_rainfo_trans != NULL) {
+ rm_rainfo(ifi->ifi_rainfo_trans);
+ ifi->ifi_rainfo_trans = NULL;
+ }
- /* reset waiting conter */
- rai->rai_waiting = 0;
+ if (ifi->ifi_rainfo != NULL) {
+ /*
+ * TRANSITIVE -> CONFIGURED
+ *
+ * After initial burst or transition from
+ * one configuration to another,
+ * ifi_rainfo always points to the next RA
+ * information.
+ */
+ ifi->ifi_state = IFI_STATE_CONFIGURED;
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as "
+ "CONFIGURED.", __func__,
+ ifi->ifi_ifname);
+ } else {
+ /*
+ * TRANSITIVE -> UNCONFIGURED
+ *
+ * If ifi_rainfo points to NULL, this
+ * interface is shutting down.
+ *
+ */
+ int error;
+
+ ifi->ifi_state = IFI_STATE_UNCONFIGURED;
+ syslog(LOG_DEBUG,
+ "<%s> ifname=%s marked as "
+ "UNCONFIGURED.", __func__,
+ ifi->ifi_ifname);
+ error = sock_mc_leave(&sock,
+ ifi->ifi_ifindex);
+ if (error)
+ exit(1);
+ }
+ }
+ break;
+ }
}
/* process RA timer */
struct rtadvd_timer *
ra_timeout(void *arg)
{
- struct rainfo *rai;
struct ifinfo *ifi;
-#ifdef notyet
- /* if necessary, reconstruct the packet. */
-#endif
- rai = (struct rainfo *)arg;
- ifi = rai->rai_ifinfo;
+
+ ifi = (struct ifinfo *)arg;
syslog(LOG_DEBUG, "<%s> RA timer on %s is expired",
__func__, ifi->ifi_ifname);
- ra_output(rai);
+ ra_output(ifi);
- return (rai->rai_timer);
+ return (ifi->ifi_ra_timer);
}
/* update RA timer */
void
ra_timer_update(void *arg, struct timeval *tm)
{
- long interval;
+ uint16_t interval;
struct rainfo *rai;
struct ifinfo *ifi;
-
- rai = (struct rainfo *)arg;
- ifi = rai->rai_ifinfo;
- /*
- * Whenever a multicast advertisement is sent from an interface,
- * the timer is reset to a uniformly-distributed random value
- * between the interface's configured MinRtrAdvInterval and
- * MaxRtrAdvInterval (RFC2461 6.2.4).
- */
- interval = rai->rai_mininterval;
+
+ ifi = (struct ifinfo *)arg;
+ rai = ifi->ifi_rainfo;
+ interval = 0;
+
+ switch (ifi->ifi_state) {
+ case IFI_STATE_UNCONFIGURED:
+ return;
+ break;
+ case IFI_STATE_CONFIGURED:
+ /*
+ * Whenever a multicast advertisement is sent from
+ * an interface, the timer is reset to a
+ * uniformly-distributed random value between the
+ * interface's configured MinRtrAdvInterval and
+ * MaxRtrAdvInterval (RFC4861 6.2.4).
+ */
+ interval = rai->rai_mininterval;
#ifdef HAVE_ARC4RANDOM
- interval += arc4random_uniform(rai->rai_maxinterval -
- rai->rai_mininterval);
+ interval += arc4random_uniform(rai->rai_maxinterval -
+ rai->rai_mininterval);
#else
- interval += random() % (rai->rai_maxinterval -
- rai->rai_mininterval);
+ interval += random() % (rai->rai_maxinterval -
+ rai->rai_mininterval);
#endif
-
- /*
- * For the first few advertisements (up to
- * MAX_INITIAL_RTR_ADVERTISEMENTS), if the randomly chosen interval
- * is greater than MAX_INITIAL_RTR_ADVERT_INTERVAL, the timer
- * SHOULD be set to MAX_INITIAL_RTR_ADVERT_INTERVAL instead.
- * (RFC 4861 6.2.4)
- */
- if (rai->rai_initcounter < MAX_INITIAL_RTR_ADVERTISEMENTS &&
- interval > MAX_INITIAL_RTR_ADVERT_INTERVAL)
- interval = MAX_INITIAL_RTR_ADVERT_INTERVAL;
+ break;
+ case IFI_STATE_TRANSITIVE:
+ /*
+ * For the first few advertisements (up to
+ * MAX_INITIAL_RTR_ADVERTISEMENTS), if the randomly chosen
+ * interval is greater than
+ * MAX_INITIAL_RTR_ADVERT_INTERVAL, the timer SHOULD be
+ * set to MAX_INITIAL_RTR_ADVERT_INTERVAL instead. (RFC
+ * 4861 6.2.4)
+ *
+ * In such cases, the router SHOULD transmit one or more
+ * (but not more than MAX_FINAL_RTR_ADVERTISEMENTS) final
+ * multicast Router Advertisements on the interface with a
+ * Router Lifetime field of zero. (RFC 4861 6.2.5)
+ */
+ interval = ifi->ifi_burstinterval;
+ break;
+ }
tm->tv_sec = interval;
tm->tv_usec = 0;
diff --git a/usr.sbin/rtadvd/rtadvd.h b/usr.sbin/rtadvd/rtadvd.h
index 53bc555..ac8ce99 100644
--- a/usr.sbin/rtadvd/rtadvd.h
+++ b/usr.sbin/rtadvd/rtadvd.h
@@ -113,28 +113,26 @@ struct prefix {
*/
struct rtadvd_timer *pfx_timer;
- u_int32_t pfx_validlifetime; /* AdvValidLifetime */
- long pfx_vltimeexpire; /* Expiration of vltime */
- u_int32_t pfx_preflifetime; /* AdvPreferredLifetime */
- long pfx_pltimeexpire; /* Expiration of pltime */
- u_int pfx_onlinkflg; /* bool: AdvOnLinkFlag */
- u_int pfx_autoconfflg; /* bool: AdvAutonomousFlag */
+ uint32_t pfx_validlifetime; /* AdvValidLifetime */
+ uint32_t pfx_vltimeexpire; /* Expiration of vltime */
+ uint32_t pfx_preflifetime; /* AdvPreferredLifetime */
+ uint32_t pfx_pltimeexpire; /* Expiration of pltime */
+ int pfx_onlinkflg; /* bool: AdvOnLinkFlag */
+ int pfx_autoconfflg; /* bool: AdvAutonomousFlag */
int pfx_prefixlen;
int pfx_origin; /* From kernel or config */
struct in6_addr pfx_prefix;
};
-#ifdef ROUTEINFO
struct rtinfo {
TAILQ_ENTRY(rtinfo) rti_next;
- u_int32_t rti_ltime; /* route lifetime */
- u_int rti_rtpref; /* route preference */
+ uint32_t rti_ltime; /* route lifetime */
+ int rti_rtpref; /* route preference */
int rti_prefixlen;
struct in6_addr rti_prefix;
};
-#endif
struct rdnss_addr {
TAILQ_ENTRY(rdnss_addr) ra_next;
@@ -146,8 +144,7 @@ struct rdnss {
TAILQ_ENTRY(rdnss) rd_next;
TAILQ_HEAD(, rdnss_addr) rd_list; /* list of DNS servers */
- int rd_cnt; /* number of DNS servers */
- u_int32_t rd_ltime; /* number of seconds valid */
+ uint32_t rd_ltime; /* number of seconds valid */
};
/*
@@ -172,7 +169,7 @@ struct dnssl {
TAILQ_ENTRY(dnssl) dn_next;
TAILQ_HEAD(, dnssl_addr) dn_list; /* list of search domains */
- u_int32_t dn_ltime; /* number of seconds valid */
+ uint32_t dn_ltime; /* number of seconds valid */
};
struct soliciter {
@@ -185,48 +182,37 @@ struct rainfo {
/* pointer for list */
TAILQ_ENTRY(rainfo) rai_next;
- /* timer related parameters */
- struct rtadvd_timer *rai_timer;
- /* counter for the first few advertisements */
- int rai_initcounter;
- /* timestamp when the latest RA was sent */
- struct timeval rai_lastsent;
- /* number of RS waiting for RA */
- int rai_waiting;
-
/* interface information */
struct ifinfo *rai_ifinfo;
- int rai_advlinkopt; /* bool: whether include link-layer addr opt */
+ int rai_advlinkopt; /* bool: whether include link-layer addr opt */
int rai_advifprefix; /* bool: gather IF prefixes? */
/* Router configuration variables */
- u_short rai_lifetime; /* AdvDefaultLifetime */
- u_int rai_maxinterval; /* MaxRtrAdvInterval */
- u_int rai_mininterval; /* MinRtrAdvInterval */
+ uint16_t rai_lifetime; /* AdvDefaultLifetime */
+ uint16_t rai_maxinterval; /* MaxRtrAdvInterval */
+ uint16_t rai_mininterval; /* MinRtrAdvInterval */
int rai_managedflg; /* AdvManagedFlag */
int rai_otherflg; /* AdvOtherConfigFlag */
int rai_rtpref; /* router preference */
- u_int32_t rai_linkmtu; /* AdvLinkMTU */
- u_int32_t rai_reachabletime; /* AdvReachableTime */
- u_int32_t rai_retranstimer; /* AdvRetransTimer */
- u_int rai_hoplimit; /* AdvCurHopLimit */
+ uint32_t rai_linkmtu; /* AdvLinkMTU */
+ uint32_t rai_reachabletime; /* AdvReachableTime */
+ uint32_t rai_retranstimer; /* AdvRetransTimer */
+ uint8_t rai_hoplimit; /* AdvCurHopLimit */
TAILQ_HEAD(, prefix) rai_prefix;/* AdvPrefixList(link head) */
int rai_pfxs; /* number of prefixes */
- long rai_clockskew; /* used for consisitency check of lifetimes */
+ uint16_t rai_clockskew; /* used for consisitency check of lifetimes */
TAILQ_HEAD(, rdnss) rai_rdnss; /* DNS server list */
TAILQ_HEAD(, dnssl) rai_dnssl; /* search domain list */
-#ifdef ROUTEINFO
TAILQ_HEAD(, rtinfo) rai_route; /* route information option (link head) */
int rai_routes; /* number of route information options */
-#endif
/* actual RA packet data and its length */
size_t rai_ra_datalen;
- u_char *rai_ra_data;
+ char *rai_ra_data;
/* info about soliciter */
TAILQ_HEAD(, soliciter) rai_soliciter; /* recent solication source */
@@ -235,29 +221,63 @@ struct rainfo {
/* RA information list */
extern TAILQ_HEAD(railist_head_t, rainfo) railist;
+/*
+ * ifi_state:
+ *
+ * (INIT)
+ * |
+ * | update_ifinfo()
+ * | update_persist_ifinfo()
+ * v
+ * UNCONFIGURED
+ * | ^
+ * loadconfig()| |rm_ifinfo(), ra_output()
+ * (MC join)| |(MC leave)
+ * | |
+ * | |
+ * v |
+ * TRANSITIVE
+ * | ^
+ * ra_output()| |getconfig()
+ * | |
+ * | |
+ * | |
+ * v |
+ * CONFIGURED
+ *
+ *
+ */
#define IFI_STATE_UNCONFIGURED 0
#define IFI_STATE_CONFIGURED 1
+#define IFI_STATE_TRANSITIVE 2
struct ifinfo {
TAILQ_ENTRY(ifinfo) ifi_next;
- u_int16_t ifi_state;
- u_int16_t ifi_persist;
- u_int16_t ifi_ifindex;
+ uint16_t ifi_state;
+ uint16_t ifi_persist;
+ uint16_t ifi_ifindex;
char ifi_ifname[IFNAMSIZ];
- u_int8_t ifi_type;
- u_int16_t ifi_flags;
- u_int32_t ifi_nd_flags;
- u_int32_t ifi_phymtu;
+ uint8_t ifi_type;
+ uint16_t ifi_flags;
+ uint32_t ifi_nd_flags;
+ uint32_t ifi_phymtu;
struct sockaddr_dl ifi_sdl;
struct rainfo *ifi_rainfo;
+ struct rainfo *ifi_rainfo_trans;
+ uint16_t ifi_burstcount;
+ uint32_t ifi_burstinterval;
+ struct rtadvd_timer *ifi_ra_timer;
+ /* timestamp when the latest RA was sent */
+ struct timeval ifi_ra_lastsent;
+ uint16_t ifi_rs_waitcount;
/* statistics */
- u_int64_t ifi_raoutput; /* # of RAs sent */
- u_int64_t ifi_rainput; /* # of RAs received */
- u_int64_t ifi_rainconsistent; /* # of inconsistent recv'd RAs */
- u_int64_t ifi_rsinput; /* # of RSs received */
+ uint64_t ifi_raoutput; /* # of RAs sent */
+ uint64_t ifi_rainput; /* # of RAs received */
+ uint64_t ifi_rainconsistent; /* # of inconsistent recv'd RAs */
+ uint64_t ifi_rsinput; /* # of RSs received */
};
/* Interface list */
@@ -267,7 +287,7 @@ extern char *mcastif;
struct rtadvd_timer *ra_timeout(void *);
void ra_timer_update(void *, struct timeval *);
-void ra_output(struct rainfo *);
+void ra_output(struct ifinfo *);
int prefix_match(struct in6_addr *, int,
struct in6_addr *, int);
@@ -275,4 +295,4 @@ struct ifinfo *if_indextoifinfo(int);
struct prefix *find_prefix(struct rainfo *,
struct in6_addr *, int);
void rtadvd_set_reload(int);
-void rtadvd_set_die(int);
+void rtadvd_set_shutdown(int);
diff --git a/usr.sbin/rtadvd/timer.c b/usr.sbin/rtadvd/timer.c
index d51c897..2ea77b5 100644
--- a/usr.sbin/rtadvd/timer.c
+++ b/usr.sbin/rtadvd/timer.c
@@ -66,36 +66,33 @@ rtadvd_timer_init(void)
void
rtadvd_update_timeout_handler(void)
{
- struct rainfo *rai;
struct ifinfo *ifi;
TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
- rai = ifi->ifi_rainfo;
- if (rai == NULL)
- continue;
-
switch (ifi->ifi_state) {
case IFI_STATE_CONFIGURED:
- if (rai->rai_timer != NULL)
+ case IFI_STATE_TRANSITIVE:
+ if (ifi->ifi_ra_timer != NULL)
continue;
syslog(LOG_DEBUG, "<%s> add timer for %s (idx=%d)",
__func__, ifi->ifi_ifname, ifi->ifi_ifindex);
- rai->rai_timer = rtadvd_add_timer(ra_timeout,
- ra_timer_update, rai, rai);
- ra_timer_update((void *)rai,
- &rai->rai_timer->rat_tm);
- rtadvd_set_timer(&rai->rai_timer->rat_tm,
- rai->rai_timer);
+ ifi->ifi_ra_timer = rtadvd_add_timer(ra_timeout,
+ ra_timer_update, ifi, ifi);
+ ra_timer_update((void *)ifi,
+ &ifi->ifi_ra_timer->rat_tm);
+ rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm,
+ ifi->ifi_ra_timer);
break;
case IFI_STATE_UNCONFIGURED:
- if (rai->rai_timer == NULL)
+ if (ifi->ifi_ra_timer == NULL)
continue;
syslog(LOG_DEBUG,
"<%s> remove timer for %s (idx=%d)", __func__,
ifi->ifi_ifname, ifi->ifi_ifindex);
- rtadvd_remove_timer(rai->rai_timer);
+ rtadvd_remove_timer(ifi->ifi_ra_timer);
+ ifi->ifi_ra_timer = NULL;
break;
}
}
diff --git a/usr.sbin/rtadvd/timer_subr.c b/usr.sbin/rtadvd/timer_subr.c
index 004919b..2bebdd3 100644
--- a/usr.sbin/rtadvd/timer_subr.c
+++ b/usr.sbin/rtadvd/timer_subr.c
@@ -35,6 +35,7 @@
#include <sys/socket.h>
#include <syslog.h>
#include <stdio.h>
+#include <inttypes.h>
#include "timer.h"
#include "timer_subr.h"
@@ -93,14 +94,14 @@ TIMEVAL_SUB(struct timeval *a, struct timeval *b, struct timeval *result)
}
char *
-sec2str(u_int32_t s, char *buf)
+sec2str(uint32_t s, char *buf)
{
- int day;
- int hour;
- int min;
- int sec;
+ uint32_t day;
+ uint32_t hour;
+ uint32_t min;
+ uint32_t sec;
char *p;
-
+
min = s / 60;
sec = s % 60;
@@ -112,15 +113,14 @@ sec2str(u_int32_t s, char *buf)
p = buf;
if (day > 0)
- p += sprintf(p, "%dd", day);
+ p += sprintf(p, "%" PRIu32 "d", day);
if (hour > 0)
- p += sprintf(p, "%dh", hour);
+ p += sprintf(p, "%" PRIu32 "h", hour);
if (min > 0)
- p += sprintf(p, "%dm", min);
+ p += sprintf(p, "%" PRIu32 "m", min);
- if ((sec == 0 && p == buf) ||
- (sec > 0 && p > buf))
- sprintf(p, "%ds", sec);
+ if ((p == buf) || (sec > 0 && p > buf))
+ sprintf(p, "%" PRIu32 "s", sec);
return (buf);
}
diff --git a/usr.sbin/rtadvd/timer_subr.h b/usr.sbin/rtadvd/timer_subr.h
index 7d2f683..9ceddad 100644
--- a/usr.sbin/rtadvd/timer_subr.h
+++ b/usr.sbin/rtadvd/timer_subr.h
@@ -54,4 +54,4 @@ void TIMEVAL_ADD(struct timeval *, struct timeval *,
struct timeval *);
void TIMEVAL_SUB(struct timeval *, struct timeval *,
struct timeval *);
-char *sec2str(u_int32_t, char *buf);
+char *sec2str(uint32_t, char *buf);
diff --git a/usr.sbin/rtsold/rtsol.c b/usr.sbin/rtsold/rtsol.c
index 850e5d9..13845f3 100644
--- a/usr.sbin/rtsold/rtsol.c
+++ b/usr.sbin/rtsold/rtsol.c
@@ -73,7 +73,6 @@ static struct sockaddr_in6 from;
static int rcvcmsglen;
int rssock;
-static char rsid[IFNAMSIZ + 1 + sizeof(DNSINFO_ORIGIN_LABEL) + 1 + NI_MAXHOST];
struct ifinfo_head_t ifinfo_head =
TAILQ_HEAD_INITIALIZER(ifinfo_head);
@@ -83,18 +82,14 @@ static const struct sockaddr_in6 sin6_allrouters = {
.sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT,
};
-static void call_script(const int, const char *const *,
- struct script_msg_head_t *);
+static void call_script(const int, const char *const *, void *);
static size_t dname_labeldec(char *, size_t, const char *);
static int safefile(const char *);
static struct ra_opt *find_raopt(struct rainfo *, int, void *, size_t);
-static int ra_opt_rdnss_dispatch(struct ifinfo *, struct rainfo *,
- struct script_msg_head_t *, struct script_msg_head_t *);
-static char *make_rsid(const char *, const char *, struct rainfo *);
#define _ARGS_OTHER otherconf_script, ifi->ifname
-#define _ARGS_RESADD resolvconf_script, "-a", rsid
-#define _ARGS_RESDEL resolvconf_script, "-d", rsid
+#define _ARGS_RESADD resolvconf_script, "-a", ifi->ifname
+#define _ARGS_RESDEL resolvconf_script, "-d", ifi->ifname
#define CALL_SCRIPT(name, sm_head) \
do { \
@@ -311,7 +306,7 @@ rtsol_input(int s)
warnmsg(LOG_ERR, __func__,
"invalid icmp type(%d) from %s on %s", icp->icmp6_type,
inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf,
- sizeof(ntopbuf)),
+ INET6_ADDRSTRLEN),
if_indextoname(pi->ipi6_ifindex, ifnamebuf));
return;
}
@@ -320,7 +315,7 @@ rtsol_input(int s)
warnmsg(LOG_INFO, __func__,
"invalid icmp code(%d) from %s on %s", icp->icmp6_code,
inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf,
- sizeof(ntopbuf)),
+ INET6_ADDRSTRLEN),
if_indextoname(pi->ipi6_ifindex, ifnamebuf));
return;
}
@@ -330,7 +325,7 @@ rtsol_input(int s)
"invalid RA with hop limit(%d) from %s on %s",
*hlimp,
inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf,
- sizeof(ntopbuf)),
+ INET6_ADDRSTRLEN),
if_indextoname(pi->ipi6_ifindex, ifnamebuf));
return;
}
@@ -339,7 +334,7 @@ rtsol_input(int s)
warnmsg(LOG_INFO, __func__,
"invalid RA with non link-local source from %s on %s",
inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf,
- sizeof(ntopbuf)),
+ INET6_ADDRSTRLEN),
if_indextoname(pi->ipi6_ifindex, ifnamebuf));
return;
}
@@ -350,14 +345,14 @@ rtsol_input(int s)
warnmsg(LOG_INFO, __func__,
"received RA from %s on an unexpected IF(%s)",
inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf,
- sizeof(ntopbuf)),
+ INET6_ADDRSTRLEN),
if_indextoname(pi->ipi6_ifindex, ifnamebuf));
return;
}
warnmsg(LOG_DEBUG, __func__,
"received RA from %s on %s, state is %d",
- inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, sizeof(ntopbuf)),
+ inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, INET6_ADDRSTRLEN),
ifi->ifname, ifi->state);
nd_ra = (struct nd_router_advert *)icp;
@@ -383,8 +378,6 @@ rtsol_input(int s)
ELM_MALLOC(rai, exit(1));
rai->rai_ifinfo = ifi;
TAILQ_INIT(&rai->rai_ra_opt);
- rai->rai_saddr.sin6_family = AF_INET6;
- rai->rai_saddr.sin6_len = sizeof(rai->rai_saddr);
memcpy(&rai->rai_saddr.sin6_addr, &from.sin6_addr,
sizeof(rai->rai_saddr.sin6_addr));
newent_rai = 1;
@@ -413,19 +406,19 @@ rtsol_input(int s)
"too short RDNSS option"
"in RA from %s was ignored.",
inet_ntop(AF_INET6, &from.sin6_addr,
- ntopbuf, sizeof(ntopbuf)));
+ ntopbuf, INET6_ADDRSTRLEN));
break;
}
addr = (struct in6_addr *)(raoptp + sizeof(*rdnss));
while ((char *)addr < (char *)RA_OPT_NEXT_HDR(raoptp)) {
if (inet_ntop(AF_INET6, addr, ntopbuf,
- sizeof(ntopbuf)) == NULL) {
+ INET6_ADDRSTRLEN) == NULL) {
warnmsg(LOG_INFO, __func__,
"an invalid address in RDNSS option"
" in RA from %s was ignored.",
inet_ntop(AF_INET6, &from.sin6_addr,
- ntopbuf, sizeof(ntopbuf)));
+ ntopbuf, INET6_ADDRSTRLEN));
addr++;
continue;
}
@@ -489,7 +482,7 @@ rtsol_input(int s)
"too short DNSSL option"
"in RA from %s was ignored.",
inet_ntop(AF_INET6, &from.sin6_addr,
- ntopbuf, sizeof(ntopbuf)));
+ ntopbuf, INET6_ADDRSTRLEN));
break;
}
@@ -575,11 +568,10 @@ ra_opt_handler(struct ifinfo *ifi)
struct rainfo *rai;
struct script_msg *smp1, *smp2, *smp3;
struct timeval now;
- struct script_msg_head_t sm_rdnss_head =
- TAILQ_HEAD_INITIALIZER(sm_rdnss_head);
- struct script_msg_head_t sm_dnssl_head =
- TAILQ_HEAD_INITIALIZER(sm_dnssl_head);
-
+ TAILQ_HEAD(, script_msg) sm_rdnss_head =
+ TAILQ_HEAD_INITIALIZER(sm_rdnss_head);
+ TAILQ_HEAD(, script_msg) sm_dnssl_head =
+ TAILQ_HEAD_INITIALIZER(sm_dnssl_head);
int dcount, dlen;
dcount = 0;
@@ -666,69 +658,17 @@ free2:
free1:
free(smp1);
}
- /* Call the script for each information source. */
- if (uflag)
- ra_opt_rdnss_dispatch(ifi, rai, &sm_rdnss_head,
- &sm_dnssl_head);
- }
- /* Call the script for each interface. */
- if (!uflag)
- ra_opt_rdnss_dispatch(ifi, NULL, &sm_rdnss_head,
- &sm_dnssl_head);
- return (0);
-}
-
-char *
-make_rsid(const char *ifname, const char *origin, struct rainfo *rai)
-{
- char hbuf[NI_MAXHOST];
-
- if (rai == NULL)
- sprintf(rsid, "%s:%s", ifname, origin);
- else {
- if (!IN6_IS_ADDR_LINKLOCAL(&rai->rai_saddr.sin6_addr))
- return (NULL);
- if (getnameinfo((struct sockaddr *)&rai->rai_saddr,
- rai->rai_saddr.sin6_len, hbuf, sizeof(hbuf), NULL, 0,
- NI_NUMERICHOST) != 0)
- return (NULL);
- sprintf(rsid, "%s:%s:[%s]", ifname, origin, hbuf);
- }
- warnmsg(LOG_DEBUG, __func__, "rsid = [%s]", rsid);
- return (rsid);
-}
-
-int
-ra_opt_rdnss_dispatch(struct ifinfo *ifi,
- struct rainfo *rai,
- struct script_msg_head_t *sm_rdnss_head,
- struct script_msg_head_t *sm_dnssl_head)
-{
- const char *r;
- struct script_msg *smp1;
- int error;
-
- error = 0;
+ }
/* Add \n for DNSSL list. */
- if (!TAILQ_EMPTY(sm_dnssl_head)) {
- ELM_MALLOC(smp1, goto ra_opt_rdnss_freeit);
+ if (!TAILQ_EMPTY(&sm_dnssl_head)) {
+ ELM_MALLOC(smp1, goto ra_opt_handler_freeit);
smp1->sm_msg = resstr_nl;
- TAILQ_INSERT_TAIL(sm_dnssl_head, smp1, sm_next);
- }
- TAILQ_CONCAT(sm_rdnss_head, sm_dnssl_head, sm_next);
-
- if (rai != NULL && uflag)
- r = make_rsid(ifi->ifname, DNSINFO_ORIGIN_LABEL, rai);
- else
- r = make_rsid(ifi->ifname, DNSINFO_ORIGIN_LABEL, NULL);
- if (r == NULL) {
- warnmsg(LOG_ERR, __func__, "make_rsid() failed. "
- "Script was not invoked.");
- error = 1;
- goto ra_opt_rdnss_freeit;
- }
- if (!TAILQ_EMPTY(sm_rdnss_head))
- CALL_SCRIPT(RESADD, sm_rdnss_head);
+ TAILQ_INSERT_TAIL(&sm_dnssl_head, smp1, sm_next);
+ }
+ TAILQ_CONCAT(&sm_rdnss_head, &sm_dnssl_head, sm_next);
+
+ if (!TAILQ_EMPTY(&sm_rdnss_head))
+ CALL_SCRIPT(RESADD, &sm_rdnss_head);
else if (ifi->ifi_rdnss == IFI_DNSOPT_STATE_RECEIVED ||
ifi->ifi_dnssl == IFI_DNSOPT_STATE_RECEIVED) {
CALL_SCRIPT(RESDEL, NULL);
@@ -736,21 +676,21 @@ ra_opt_rdnss_dispatch(struct ifinfo *ifi,
ifi->ifi_dnssl = IFI_DNSOPT_STATE_NOINFO;
}
-ra_opt_rdnss_freeit:
+ra_opt_handler_freeit:
/* Clear script message queue. */
- if (!TAILQ_EMPTY(sm_rdnss_head)) {
- while ((smp1 = TAILQ_FIRST(sm_rdnss_head)) != NULL) {
- TAILQ_REMOVE(sm_rdnss_head, smp1, sm_next);
+ if (!TAILQ_EMPTY(&sm_rdnss_head)) {
+ while ((smp1 = TAILQ_FIRST(&sm_rdnss_head)) != NULL) {
+ TAILQ_REMOVE(&sm_rdnss_head, smp1, sm_next);
free(smp1);
}
}
- if (!TAILQ_EMPTY(sm_dnssl_head)) {
- while ((smp1 = TAILQ_FIRST(sm_dnssl_head)) != NULL) {
- TAILQ_REMOVE(sm_dnssl_head, smp1, sm_next);
+ if (!TAILQ_EMPTY(&sm_dnssl_head)) {
+ while ((smp1 = TAILQ_FIRST(&sm_dnssl_head)) != NULL) {
+ TAILQ_REMOVE(&sm_dnssl_head, smp1, sm_next);
free(smp1);
}
}
- return (error);
+ return (0);
}
static struct ra_opt *
@@ -769,18 +709,19 @@ find_raopt(struct rainfo *rai, int type, void *msg, size_t len)
}
static void
-call_script(const int argc, const char *const argv[],
- struct script_msg_head_t *sm_head)
+call_script(const int argc, const char *const argv[], void *head)
{
const char *scriptpath;
int fd[2];
int error;
pid_t pid, wpid;
+ TAILQ_HEAD(, script_msg) *sm_head;
if ((scriptpath = argv[0]) == NULL)
return;
fd[0] = fd[1] = -1;
+ sm_head = head;
if (sm_head != NULL && !TAILQ_EMPTY(sm_head)) {
error = pipe(fd);
if (error) {
diff --git a/usr.sbin/rtsold/rtsold.8 b/usr.sbin/rtsold/rtsold.8
index 97b6000..8eb2539 100644
--- a/usr.sbin/rtsold/rtsold.8
+++ b/usr.sbin/rtsold/rtsold.8
@@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 14, 2011
+.Dd May 28, 2011
.Dt RTSOLD 8
.Os
.\"
@@ -39,24 +39,24 @@
.\"
.Sh SYNOPSIS
.Nm
-.Op Fl dDfFmu1
+.Op Fl dDfFm1
.Op Fl O Ar script-name
-.Op Fl p Ar pidfile
+.Op Fl P Ar pidfile
.Op Fl R Ar script-name
.Ar interface ...
.Nm
-.Op Fl dDfFmu1
+.Op Fl dDfFm1
.Op Fl O Ar script-name
-.Op Fl p Ar pidfile
+.Op Fl P Ar pidfile
.Op Fl R Ar script-name
.Fl a
.Nm rtsol
-.Op Fl dDu
+.Op Fl dD
.Op Fl O Ar script-name
.Op Fl R Ar script-name
.Ar interface ...
.Nm rtsol
-.Op Fl dDu
+.Op Fl dD
.Op Fl O Ar script-name
.Op Fl R Ar script-name
.Fl a
@@ -227,7 +227,7 @@ configuration.
must be the absolute path from root to the script file, be a regular
file, and be created by the same owner who runs
.Nm .
-.It Fl p Ar pidfile
+.It Fl P Ar pidfile
Writes the process ID of
.Nm
to
@@ -245,18 +245,6 @@ standard input of this script.
The
.Xr resolvconf 8
script is used by default.
-.It Fl u
-Specifies whether adding the source address of Router Advertisement
-messages to the interface name in an argument of the RDNSS and DNSSL
-script.
-.Pp
-If
-.Fl u
-is specified, the interface name in the script argument will be
-.Ql ifname:slaac:[RA-source-address] .
-.Pp
-If not, it will be
-.Ql ifname:slaac .
.El
.Sh FILES
.Bl -tag -width /var/run/rtsold.dump -compact
diff --git a/usr.sbin/rtsold/rtsold.c b/usr.sbin/rtsold/rtsold.c
index ee87753..94046a1 100644
--- a/usr.sbin/rtsold/rtsold.c
+++ b/usr.sbin/rtsold/rtsold.c
@@ -75,7 +75,6 @@ static int fflag = 0;
int Fflag = 0; /* force setting sysctl parameters */
int aflag = 0;
int dflag = 0;
-int uflag = 0;
const char *otherconf_script;
const char *resolvconf_script = "/sbin/resolvconf";
@@ -130,10 +129,10 @@ main(int argc, char **argv)
#ifndef SMALL
/* rtsold */
- opts = "adDfFm1O:p:R:u";
+ opts = "adDfFm1O:P:R:";
#else
/* rtsol */
- opts = "adDFO:R:u";
+ opts = "adDFO:P:R:";
fflag = 1;
once = 1;
#endif
@@ -145,10 +144,10 @@ main(int argc, char **argv)
aflag = 1;
break;
case 'd':
- dflag += 1;
+ dflag = 1;
break;
case 'D':
- dflag += 2;
+ dflag = 2;
break;
case 'f':
fflag = 1;
@@ -165,15 +164,12 @@ main(int argc, char **argv)
case 'O':
otherconf_script = optarg;
break;
- case 'p':
+ case 'P':
pidfilename = optarg;
break;
case 'R':
resolvconf_script = optarg;
break;
- case 'u':
- uflag = 1;
- break;
default:
usage();
exit(1);
@@ -188,13 +184,8 @@ main(int argc, char **argv)
}
/* set log level */
- if (dflag > 1)
- log_upto = LOG_DEBUG;
- else if (dflag > 0)
- log_upto = LOG_INFO;
- else
+ if (dflag == 0)
log_upto = LOG_NOTICE;
-
if (!fflag) {
char *ident;
diff --git a/usr.sbin/rtsold/rtsold.h b/usr.sbin/rtsold/rtsold.h
index 3ab010f..0aa9b4f 100644
--- a/usr.sbin/rtsold/rtsold.h
+++ b/usr.sbin/rtsold/rtsold.h
@@ -37,8 +37,6 @@ struct script_msg {
char *sm_msg;
};
-TAILQ_HEAD(script_msg_head_t, script_msg);
-
struct ra_opt {
TAILQ_ENTRY(ra_opt) rao_next;
@@ -62,7 +60,7 @@ struct ifinfo {
TAILQ_ENTRY(ifinfo) ifi_next; /* pointer to the next interface */
struct sockaddr_dl *sdl; /* link-layer address */
- char ifname[IFNAMSIZ]; /* interface name */
+ char ifname[IF_NAMESIZE]; /* interface name */
u_int32_t linkid; /* link ID of this interface */
int active; /* interface status */
int probeinterval; /* interval of probe timer (if necessary) */
@@ -98,7 +96,6 @@ struct ifinfo {
/* Interface list */
extern TAILQ_HEAD(ifinfo_head_t, ifinfo) ifinfo_head;
-#define DNSINFO_ORIGIN_LABEL "slaac"
/*
* RFC 3542 API deprecates IPV6_PKTINFO in favor of
* IPV6_RECVPKTINFO
@@ -129,7 +126,6 @@ extern struct timeval tm_max;
extern int dflag;
extern int aflag;
extern int Fflag;
-extern int uflag;
extern const char *otherconf_script;
extern const char *resolvconf_script;
extern int ifconfig(char *);
diff --git a/usr.sbin/sysinstall/modules.c b/usr.sbin/sysinstall/modules.c
index e9bdb0f..9c9875f 100644
--- a/usr.sbin/sysinstall/modules.c
+++ b/usr.sbin/sysinstall/modules.c
@@ -32,7 +32,6 @@
#include <sys/types.h>
#include <sys/param.h>
#include <sys/linker.h>
-#include <fcntl.h>
#include <dirent.h>
#include <fcntl.h>
#include <fnmatch.h>
diff --git a/usr.sbin/syslogd/syslogd.8 b/usr.sbin/syslogd/syslogd.8
index ff0141d..23ba6d0 100644
--- a/usr.sbin/syslogd/syslogd.8
+++ b/usr.sbin/syslogd/syslogd.8
@@ -36,7 +36,7 @@
.Nd log systems messages
.Sh SYNOPSIS
.Nm
-.Op Fl 468ACcdknosuv
+.Op Fl 468ACcdkNnosuv
.Op Fl a Ar allowed_peer
.Op Fl b Ar bind_address
.Op Fl f Ar config_file
@@ -227,6 +227,13 @@ facility is reserved for messages read directly from
Select the number of minutes between
.Dq mark
messages; the default is 20 minutes.
+.It Fl N
+Disable binding on UDP sockets. RFC 3164 recommends that outgoing
+syslogd messages should originate from the privileged port, this
+option
+.Em disables
+the recommended behavior. This option inherits
+.Fl s .
.It Fl n
Disable dns query for every request.
.It Fl o
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 045da5b..d1c9fd1 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -278,6 +278,7 @@ static int fklog = -1; /* /dev/klog */
static int Initialized; /* set when we have initialized ourselves */
static int MarkInterval = 20 * 60; /* interval between marks in seconds */
static int MarkSeq; /* mark sequence number */
+static int NoBind; /* don't bind() as suggested by RFC 3164 */
static int SecureMode; /* when true, receive only unix domain socks */
#ifdef INET6
static int family = PF_UNSPEC; /* protocol family (IPv4, IPv6 or both) */
@@ -358,7 +359,7 @@ main(int argc, char *argv[])
dprintf("madvise() failed: %s\n", strerror(errno));
bindhostname = NULL;
- while ((ch = getopt(argc, argv, "468Aa:b:cCdf:kl:m:nop:P:sS:Tuv"))
+ while ((ch = getopt(argc, argv, "468Aa:b:cCdf:kl:m:nNop:P:sS:Tuv"))
!= -1)
switch (ch) {
case '4':
@@ -437,6 +438,10 @@ main(int argc, char *argv[])
case 'm': /* mark interval */
MarkInterval = atoi(optarg) * 60;
break;
+ case 'N':
+ NoBind = 1;
+ SecureMode = 1;
+ break;
case 'n':
resolve = 0;
break;
@@ -2685,13 +2690,24 @@ socksetup(int af, char *bindhostname)
close(*s);
continue;
}
- if (bind(*s, r->ai_addr, r->ai_addrlen) < 0) {
- close(*s);
- logerror("bind");
- continue;
- }
+ /*
+ * RFC 3164 recommends that client side message
+ * should come from the privileged syslogd port.
+ *
+ * If the system administrator choose not to obey
+ * this, we can skip the bind() step so that the
+ * system will choose a port for us.
+ */
+ if (!NoBind) {
+ if (bind(*s, r->ai_addr, r->ai_addrlen) < 0) {
+ close(*s);
+ logerror("bind");
+ continue;
+ }
- double_rbuf(*s);
+ if (!SecureMode)
+ double_rbuf(*s);
+ }
(*socks)++;
s++;
diff --git a/usr.sbin/wpa/ndis_events/ndis_events.c b/usr.sbin/wpa/ndis_events/ndis_events.c
index e3cd9b5..9c6e9de 100644
--- a/usr.sbin/wpa/ndis_events/ndis_events.c
+++ b/usr.sbin/wpa/ndis_events/ndis_events.c
@@ -42,11 +42,9 @@ __FBSDID("$FreeBSD$");
*/
#include <sys/types.h>
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
-#include <sys/socket.h>
#include <sys/errno.h>
#include <sys/sysctl.h>
#include <net/if.h>
diff --git a/usr.sbin/wpa/wpa_supplicant/Packet32.c b/usr.sbin/wpa/wpa_supplicant/Packet32.c
index 07da359..876417e 100644
--- a/usr.sbin/wpa/wpa_supplicant/Packet32.c
+++ b/usr.sbin/wpa/wpa_supplicant/Packet32.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
-#include <sys/socket.h>
#include <sys/errno.h>
#include <sys/sysctl.h>
#include <sys/fcntl.h>
diff --git a/usr.sbin/yp_mkdb/yp_mkdb.c b/usr.sbin/yp_mkdb/yp_mkdb.c
index fdbb466..6c3014b 100644
--- a/usr.sbin/yp_mkdb/yp_mkdb.c
+++ b/usr.sbin/yp_mkdb/yp_mkdb.c
@@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$");
#include "yp_extern.h"
#include "ypxfr_extern.h"
-const char *yp_dir = _PATH_YP;
+char *yp_dir = ""; /* No particular default needed. */
int _rpcpmstart = 0;
int debug = 1;
diff --git a/usr.sbin/yppush/Makefile b/usr.sbin/yppush/Makefile
index 4ca3635..887a80b 100644
--- a/usr.sbin/yppush/Makefile
+++ b/usr.sbin/yppush/Makefile
@@ -1,7 +1,7 @@
# $FreeBSD$
RPCDIR= ${.CURDIR}/../../include/rpcsvc
-.PATH: ${RPCDIR} ${.CURDIR}/../ypserv \
+.PATH: ${RPCDIR} ${.CURDIR}/../../usr.sbin/ypserv \
${.CURDIR}/../../libexec/ypxfr
PROG= yppush
diff --git a/usr.sbin/yppush/yppush_main.c b/usr.sbin/yppush/yppush_main.c
index 3749d3e..df1dbe4 100644
--- a/usr.sbin/yppush/yppush_main.c
+++ b/usr.sbin/yppush/yppush_main.c
@@ -53,10 +53,10 @@ __FBSDID("$FreeBSD$");
#include "ypxfr_extern.h"
#include "yppush_extern.h"
+char *progname = "yppush";
int debug = 1;
int _rpcpmstart = 0;
-const char *progname = "yppush";
-const char *yp_dir = _PATH_YP;
+char *yp_dir = _PATH_YP;
char *yppush_mapname = NULL; /* Map to transfer. */
char *yppush_domain = NULL; /* Domain in which map resides. */
diff --git a/usr.sbin/ypserv/Makefile b/usr.sbin/ypserv/Makefile
index d3dd1fa..73a6195 100644
--- a/usr.sbin/ypserv/Makefile
+++ b/usr.sbin/ypserv/Makefile
@@ -3,22 +3,14 @@
RPCDIR= ${.CURDIR}/../../include/rpcsvc
.PATH: ${RPCDIR}
-.include <bsd.own.mk>
-
PROG= ypserv
MAN= ypserv.8 ypinit.8
SRCS= yp_svc.c yp_server.c yp_dblookup.c yp_dnslookup.c \
ypxfr_clnt.c yp.h yp_main.c yp_error.c yp_access.c yp_svc_udp.c
-.if ${MK_INET_SUPPORT} != "no"
-SRCS+= yp_access_inet.c
-.endif
-.if ${MK_INET6_SUPPORT} != "no"
-SRCS+= yp_access_inet6.c
-.endif
CFLAGS+= -DDB_CACHE -DTCP_WRAPPER -I.
-WARNS?= 6
+WARNS?= 0
DPADD= ${LIBWRAP}
LDADD= -lwrap
diff --git a/usr.sbin/ypserv/yp_access.c b/usr.sbin/ypserv/yp_access.c
index 5d754e0..66d056b 100644
--- a/usr.sbin/ypserv/yp_access.c
+++ b/usr.sbin/ypserv/yp_access.c
@@ -34,36 +34,31 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/fcntl.h>
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#include <stdlib.h>
#include <rpc/rpc.h>
#include <rpcsvc/yp.h>
#include <rpcsvc/yppasswd.h>
#include <rpcsvc/ypxfrd.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <db.h>
-#include <errno.h>
+#include <sys/types.h>
#include <limits.h>
-#include <netdb.h>
+#include <db.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
#include <paths.h>
-#include <stdlib.h>
-
+#include <errno.h>
+#include <sys/param.h>
#include "yp_extern.h"
#ifdef TCP_WRAPPER
#include "tcpd.h"
-extern int hosts_ctl(const char *, const char *, const char *, const char *);
#endif
-char securenets_path[MAXPATHLEN];
-enum yp_snf_format securenets_format = YP_SNF_NATIVE;
+extern int debug;
+ /* NIS v1 */
const char *yp_procs[] = {
- /* NIS v1 */
"ypoldproc_null",
"ypoldproc_domain",
"ypoldproc_domain_nonack",
@@ -92,431 +87,89 @@ const char *yp_procs[] = {
"ypproc_maplist"
};
-static SLIST_HEAD(, securenet) securenets =
- SLIST_HEAD_INITIALIZER(securenets);
struct securenet {
- struct sockaddr_storage sn_addr;
- struct sockaddr_storage sn_mask;
- SLIST_ENTRY(securenet) sn_next;
+ struct in_addr net;
+ struct in_addr mask;
+ struct securenet *next;
};
-static int
-mask2prefixlen(const struct sockaddr *sap, int *prefixlen)
-{
- switch (sap->sa_family) {
-#ifdef AF_INET
- case AF_INET:
- return (yp_mask2prefixlen_in(sap, prefixlen));
- break;
-#endif
-#ifdef AF_INET6
- case AF_INET6:
- return (yp_mask2prefixlen_in6(sap, prefixlen));
- break;
-#endif
- default:
- break;
- }
- return (-1);
-}
+struct securenet *securenets;
-static int
-prefixlen2mask(struct sockaddr *sap, const int *prefixlen)
-{
- switch (sap->sa_family) {
-#ifdef AF_INET
- case AF_INET:
- return (yp_prefixlen2mask_in(sap, prefixlen));
- break;
-#endif
-#ifdef AF_INET6
- case AF_INET6:
- return (yp_prefixlen2mask_in6(sap, prefixlen));
- break;
-#endif
- default:
- break;
- }
- return (-1);
-}
-
-void
-yp_debug_sa(const struct sockaddr *sap)
-{
- int error;
- int plen;
- char host[NI_MAXHOST + 1];
- char serv[NI_MAXSERV + 1];
-
- error = getnameinfo(sap, sap->sa_len, host, sizeof(host), serv,
- sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV);
- if (error)
- yp_error("sockaddr: %s", gai_strerror(error));
- mask2prefixlen(sap, &plen);
- yp_error("sockaddr: %d:[%s]:%s(/%d)",
- sap->sa_family, host, serv, plen);
-}
-
-void
-show_securenets(void)
-{
- struct securenet *snp;
- struct sockaddr *sap;
- int i = 0;
-
- yp_error("--- securenets dump start ---");
- SLIST_FOREACH(snp, &securenets, sn_next) {
- i++;
- yp_error("entry %d:", i);
- sap = (struct sockaddr *)&(snp->sn_addr);
- yp_debug_sa(sap);
- sap = (struct sockaddr *)&(snp->sn_mask);
- yp_debug_sa(sap);
- }
- yp_error("--- securenets dump end ---");
-}
+#define LINEBUFSZ 1024
/*
* Read /var/yp/securenets file and initialize the securenets
* list. If the file doesn't exist, we set up a dummy entry that
* allows all hosts to connect.
*/
-#define YP_ACL_HOSTMASK_INET "255.255.255.255"
-#define YP_ACL_HOSTMASK_INET6 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
-int
+void
load_securenets(void)
{
FILE *fp;
- char linebuf[BUFSIZ + 2];
- struct securenet *snp;
- struct sockaddr *sap;
- int error = 0;
- int line;
- struct addrinfo hints, *res, *res0;
-
- if (SLIST_EMPTY(&securenets))
- SLIST_INIT(&securenets);
- else {
- /*
- * If securenets is not NULL, we are being called to reload
- * the list; free the existing list before re-reading the
- * securenets file.
- */
- while (!SLIST_EMPTY(&securenets)) {
- snp = SLIST_FIRST(&securenets);
- SLIST_REMOVE_HEAD(&securenets, sn_next);
- free(snp);
- }
+ char path[MAXPATHLEN + 2];
+ char linebuf[1024 + 2];
+ struct securenet *tmp;
+
+ /*
+ * If securenets is not NULL, we are being called to reload
+ * the list; free the existing list before re-reading the
+ * securenets file.
+ */
+ while (securenets) {
+ tmp = securenets->next;
+ free(securenets);
+ securenets = tmp;
}
- if (debug)
- yp_error("load_securenets(): loading %s", securenets_path);
- if ((fp = fopen(securenets_path, "r")) == NULL) {
+
+ snprintf(path, MAXPATHLEN, "%s/securenets", yp_dir);
+
+ if ((fp = fopen(path, "r")) == NULL) {
if (errno == ENOENT) {
- /* Create empty access list. */
- if (debug)
- yp_error("load_securenets(): ENOENT");
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_flags = AI_PASSIVE;
- hints.ai_socktype = SOCK_STREAM;
- error = getaddrinfo(NULL, "0", &hints, &res0);
- if (error) {
- yp_error("getaddrinfo() failed: %s",
- gai_strerror(error));
- freeaddrinfo(res0);
- return (1);
- }
- for (res = res0; res; res = res->ai_next) {
- snp = malloc(sizeof(*snp));
- if (snp == NULL) {
- yp_error("malloc failed: %s",
- strerror(errno));
- freeaddrinfo(res0);
- return (1);
- }
- memset(snp, 0, sizeof(*snp));
- memcpy(&snp->sn_addr, res->ai_addr,
- sizeof(res->ai_addrlen));
- memcpy(&snp->sn_mask, res->ai_addr,
- sizeof(res->ai_addrlen));
- sap = (struct sockaddr *)&(snp->sn_mask);
- prefixlen2mask(sap, 0);
- SLIST_INSERT_HEAD(&securenets, snp, sn_next);
- }
- freeaddrinfo(res0);
- return (0);
+ securenets = (struct securenet *)malloc(sizeof(struct securenet));
+ securenets->net.s_addr = INADDR_ANY;
+ securenets->mask.s_addr = INADDR_ANY;
+ securenets->next = NULL;
+ return;
} else {
- yp_error("fopen(%s) failed: %s", securenets_path,
- strerror(errno));
- return (1);
+ yp_error("fopen(%s) failed: %s", path, strerror(errno));
+ exit(1);
}
}
- line = 0;
- while (fgets(linebuf, sizeof(linebuf), fp)) {
- int nitems;
- const char *col_host;
- const char *col_mask;
- char addr1[NI_MAXHOST + 1];
- char addr2[NI_MAXHOST + 1];
- int plen;
- sa_family_t family;
- char *p;
-
- line++;
- if (debug)
- yp_error("load_securenets(): read line %d", line);
+ securenets = NULL;
+
+ while (fgets(linebuf, LINEBUFSZ, fp)) {
+ char addr1[20], addr2[20];
+
if ((linebuf[0] == '#')
|| (strspn(linebuf, " \t\r\n") == strlen(linebuf)))
continue;
- nitems = sscanf(linebuf, "%s %s", addr1, addr2);
- snp = malloc(sizeof(*snp));
- memset(snp, 0, sizeof(*snp));
-
- if (debug)
- yp_error("load_securenets(): nitems = %d", nitems);
- if (nitems == 2) {
- switch (securenets_format) {
- case YP_SNF_NATIVE:
- /* ex. 127.0.0.1 255.0.0.0 */
- col_host = addr1;
- col_mask = addr2;
- break;
- case YP_SNF_SOLARIS:
- /* ex. 255.0.0.0 127.0.0.1 */
- col_host = addr2;
- col_mask = addr1;
- break;
- default:
- yp_error("line %d: internal error: %s",
- line, linebuf);
- continue;
-
- }
- if (debug) {
- yp_error("load_securenets(): try mask expr");
- yp_error("load_securenets(): host = [%s]",
- col_host);
- yp_error("load_securenets(): mask = [%s]",
- col_mask);
- }
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_NUMERICHOST;
- error = getaddrinfo(col_host, NULL, &hints, &res0);
- if (error) {
- yp_error("line %d: "
- "badly formatted securenets entry: "
- "%s: %s", line, linebuf,
- gai_strerror(error));
- freeaddrinfo(res0);
- free(snp);
- continue;
- }
- memcpy(&snp->sn_addr, res0->ai_addr, res0->ai_addrlen);
- family = res0->ai_addr->sa_family;
- freeaddrinfo(res0);
-
- if ((securenets_format == YP_SNF_SOLARIS) &&
- (strcmp(col_host, "host") == 0)) {
- switch (family) {
-#ifdef AF_INET
- case AF_INET:
- col_host = YP_ACL_HOSTMASK_INET;
- break;
-#endif
-#ifdef AF_INET6
- case AF_INET6:
- col_host = YP_ACL_HOSTMASK_INET6;
- break;
-#endif
- default:
- yp_error("line %d: host keyword for "
- "unsupported address family: "
- "%s: %s", line, linebuf,
- gai_strerror(error));
- continue;
- }
- }
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_NUMERICHOST;
- error = getaddrinfo(col_mask, NULL, &hints, &res0);
- if (error) {
- yp_error("line %d: "
- "badly formatted securenets entry: "
- "%s: %s", line, linebuf,
- gai_strerror(error));
- freeaddrinfo(res0);
- free(snp);
- continue;
- }
- memcpy(&snp->sn_mask, res0->ai_addr, res0->ai_addrlen);
- freeaddrinfo(res0);
- } else if (nitems == 1) {
- /* ex. 127.0.0.1/8 */
- /* ex. fe80::/10 */
- if (debug)
- yp_error("load_securenets(): try CIDR expr");
- p = strrchr(addr1, '/');
- if (p != NULL) {
- *p = ' ';
- nitems = sscanf(addr1, "%s %d", addr2, &plen);
- if (nitems < 2) {
- yp_error("line %d: "
- "badly formatted securenets entry:"
- " %s", line, linebuf);
- free(snp);
- continue;
- }
- } else
- memcpy(addr2, addr1, sizeof(addr2));
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_NUMERICHOST;
- error = getaddrinfo(addr2, NULL, &hints, &res0);
- if (error) {
- yp_error("line %d: "
- "badly formatted securenets entry: "
- "%s: %s", line, linebuf,
- gai_strerror(error));
- freeaddrinfo(res0);
- free(snp);
- continue;
- }
- if (p == NULL)
- switch (res0->ai_addr->sa_family) {
-#ifdef AF_INET
- case AF_INET:
- plen = 32;
- break;
-#endif
-#ifdef AF_INET6
- case AF_INET6:
- plen = 128;
- break;
-#endif
- default:
- yp_error("line %d: "
- "unsupported address family: "
- "%s: %s", line, linebuf,
- gai_strerror(error));
- continue;
- }
- if (debug) {
- yp_error("load_securenets(): addr2 = [%s]",
- addr2);
- yp_error("load_securenets(): plen = [%d]",
- plen);
- }
- memcpy(&snp->sn_addr, res0->ai_addr, res0->ai_addrlen);
- memcpy(&snp->sn_mask, res0->ai_addr, res0->ai_addrlen);
- freeaddrinfo(res0);
-
- sap = (struct sockaddr *)&(snp->sn_mask);
- prefixlen2mask(sap, &plen);
- } else {
- yp_error("line %d: "
- "badly formatted securenets entry: "
- "%s", line, linebuf);
+ if (sscanf(linebuf, "%s %s", addr1, addr2) < 2) {
+ yp_error("badly formatted securenets entry: %s",
+ linebuf);
continue;
}
- if (debug) {
- yp_error("load_securenets(): adding entry");
- yp_debug_sa((struct sockaddr*)&(snp->sn_addr));
- yp_debug_sa((struct sockaddr *)&(snp->sn_mask));
+
+ tmp = (struct securenet *)malloc(sizeof(struct securenet));
+
+ if (!inet_aton((char *)&addr1, (struct in_addr *)&tmp->net)) {
+ yp_error("badly formatted securenets entry: %s", addr1);
+ free(tmp);
+ continue;
}
- SLIST_INSERT_HEAD(&securenets, snp, sn_next);
+
+ if (!inet_aton((char *)&addr2, (struct in_addr *)&tmp->mask)) {
+ yp_error("badly formatted securenets entry: %s", addr2);
+ free(tmp);
+ continue;
+ }
+
+ tmp->next = securenets;
+ securenets = tmp;
}
+
fclose(fp);
- if (debug)
- show_securenets();
- return (0);
-}
-static int
-compare_subnet(struct sockaddr *addr1,
- struct sockaddr *addr2,
- struct sockaddr *mask)
-{
-#ifdef AF_INET
- struct sockaddr_in *in_addr1;
- struct sockaddr_in *in_addr2;
- struct sockaddr_in *in_addrm;
-#endif
-#ifdef AF_INET6
- struct sockaddr_in6 *in6_addr1;
- struct sockaddr_in6 *in6_addr2;
- struct sockaddr_in6 *in6_addrm;
-#endif
- u_char a1[sizeof(struct sockaddr_storage)];
- u_char a2[sizeof(struct sockaddr_storage)];
- u_char m[sizeof(struct sockaddr_storage)];
- ssize_t len;
- int i;
- int samescope;
-
- if (addr1->sa_family != addr2->sa_family)
- return (1);
-
- memset(a1, 0, sizeof(a1));
- memset(a1, 0, sizeof(a2));
- memset(m, 0, sizeof(m));
-
- switch (addr1->sa_family) {
-#ifdef AF_INET
- case AF_INET:
- in_addr1 = (struct sockaddr_in *)(addr1);
- in_addr2 = (struct sockaddr_in *)(addr2);
- in_addrm = (struct sockaddr_in *)(mask);
- len = sizeof(in_addr1->sin_addr.s_addr);
- memcpy(a1, (u_char *)&(in_addr1->sin_addr.s_addr),
- sizeof(in_addr1->sin_addr.s_addr));
- memcpy(a2, (u_char *)&(in_addr2->sin_addr.s_addr),
- sizeof(in_addr2->sin_addr.s_addr));
- memcpy(m, (u_char *)&(in_addrm->sin_addr.s_addr),
- sizeof(in_addrm->sin_addr.s_addr));
- samescope = 1;
- break;
-#endif
-#ifdef AF_INET6
- case AF_INET6:
- in6_addr1 = (struct sockaddr_in6 *)(addr1);
- in6_addr2 = (struct sockaddr_in6 *)(addr2);
- in6_addrm = (struct sockaddr_in6 *)(mask);
- len = sizeof(in6_addr1->sin6_addr.s6_addr);
- memcpy(a1, (u_char *)in6_addr1->sin6_addr.s6_addr,
- sizeof(in6_addr1->sin6_addr.s6_addr));
- memcpy(a2, (u_char *)in6_addr2->sin6_addr.s6_addr,
- sizeof(in6_addr2->sin6_addr.s6_addr));
- memcpy(m, (u_char *)in6_addrm->sin6_addr.s6_addr,
- sizeof(in6_addrm->sin6_addr.s6_addr));
- samescope = (in6_addr1->sin6_scope_id ==
- in6_addr2->sin6_scope_id);
- break;
-#endif
- default:
- return (1);
- }
- for (i=0; i < len; i++) {
- a1[i] &= m[i];
- a2[i] &= m[i];
- }
- if (debug) {
- yp_error("compare_subnet(): addr1");
- yp_debug_sa(addr1);
- yp_error("compare_subnet(): addr2");
- yp_debug_sa(addr2);
- yp_error("compare_subnet(): mask");
- yp_debug_sa(mask);
- }
- if (!samescope)
- return (1);
- return (memcmp(a1, a2, len));
}
/*
@@ -558,21 +211,15 @@ int
yp_access(const char *map, const struct svc_req *rqstp)
#endif
{
+ struct sockaddr_in *rqhost;
int status_securenets = 0;
- int error;
#ifdef TCP_WRAPPER
int status_tcpwrap;
#endif
- static struct sockaddr oldaddr;
- struct securenet *snp;
- struct sockaddr *sap;
- struct netbuf *rqhost;
+ static unsigned long oldaddr = 0;
+ struct securenet *tmp;
const char *yp_procedure = NULL;
char procbuf[50];
- char host[NI_MAXHOST];
- char serv[NI_MAXSERV];
-
- memset(&oldaddr, 0, sizeof(oldaddr));
if (rqstp->rq_prog != YPPASSWDPROG && rqstp->rq_prog != YPPROG) {
snprintf(procbuf, sizeof(procbuf), "#%lu/#%lu",
@@ -585,18 +232,12 @@ yp_access(const char *map, const struct svc_req *rqstp)
yp_procs[rqstp->rq_proc + (12 * (rqstp->rq_vers - 1))];
}
- rqhost = svc_getrpccaller(rqstp->rq_xprt);
- sap = (struct sockaddr *)(rqhost->buf);
- error = getnameinfo(sap, sap->sa_len,
- host, sizeof(host), serv, sizeof(serv),
- NI_NUMERICHOST | NI_NUMERICSERV);
- if (error) {
- yp_error("yp_access: getnameinfo(): %s", gai_strerror(error));
- return (1);
- }
+ rqhost = svc_getcaller(rqstp->rq_xprt);
+
if (debug) {
- yp_error("procedure %s called from %s:%s", yp_procedure,
- host, serv);
+ yp_error("procedure %s called from %s:%d", yp_procedure,
+ inet_ntoa(rqhost->sin_addr),
+ ntohs(rqhost->sin_port));
if (map != NULL)
yp_error("client is referencing map \"%s\".", map);
}
@@ -604,13 +245,14 @@ yp_access(const char *map, const struct svc_req *rqstp)
/* Check the map name if one was supplied. */
if (map != NULL) {
if (strchr(map, '/')) {
- yp_error("embedded slash in map name \"%s\" "
- "-- possible spoof attempt from %s:%s",
- map, host, serv);
- return (1);
+ yp_error("embedded slash in map name \"%s\" -- \
+possible spoof attempt from %s:%d",
+ map, inet_ntoa(rqhost->sin_addr),
+ ntohs(rqhost->sin_port));
+ return(1);
}
#ifdef DB_CACHE
- if ((yp_testflag((const char *)map, (const char *)domain, YP_SECURE) ||
+ if ((yp_testflag((char *)map, (char *)domain, YP_SECURE) ||
#else
if ((strstr(map, "master.passwd.") || strstr(map, "shadow.") ||
#endif
@@ -618,30 +260,27 @@ yp_access(const char *map, const struct svc_req *rqstp)
rqstp->rq_proc == YPPROC_XFR) ||
(rqstp->rq_prog == YPXFRD_FREEBSD_PROG &&
rqstp->rq_proc == YPXFRD_GETMAP)) &&
- atoi(serv) >= IPPORT_RESERVED) {
- yp_error("access to %s denied -- client %s:%s"
- " not privileged", map, host, serv);
- return (1);
+ ntohs(rqhost->sin_port) >= IPPORT_RESERVED) {
+ yp_error("access to %s denied -- client %s:%d \
+not privileged", map, inet_ntoa(rqhost->sin_addr), ntohs(rqhost->sin_port));
+ return(1);
}
}
#ifdef TCP_WRAPPER
- status_tcpwrap = hosts_ctl("ypserv", STRING_UNKNOWN, host, "");
+ status_tcpwrap = hosts_ctl("ypserv", STRING_UNKNOWN,
+ inet_ntoa(rqhost->sin_addr), "");
#endif
- if (debug)
- yp_error("yp_access(): compare start");
- SLIST_FOREACH (snp, &securenets, sn_next) {
- if (compare_subnet(sap,
- (struct sockaddr *)&(snp->sn_addr),
- (struct sockaddr *)&(snp->sn_mask)) == 0) {
+ tmp = securenets;
+ while (tmp) {
+ if (((rqhost->sin_addr.s_addr & ~tmp->mask.s_addr)
+ | tmp->net.s_addr) == rqhost->sin_addr.s_addr) {
status_securenets = 1;
- if (debug)
- yp_error("yp_access(): compare success!");
break;
}
+ tmp = tmp->next;
}
- if (debug)
- yp_error("yp_access(): compare end");
+
#ifdef TCP_WRAPPER
if (status_securenets == 0 || status_tcpwrap == 0) {
#else
@@ -657,14 +296,16 @@ yp_access(const char *map, const struct svc_req *rqstp)
*
* In either case deny access.
*/
- if (memcmp(sap, &oldaddr, sizeof(oldaddr))) {
- yp_error("connect from %s:%s to procedure %s refused",
- host, serv, yp_procedure);
- memcpy(&oldaddr, sap, sizeof(oldaddr));
+ if (rqhost->sin_addr.s_addr != oldaddr) {
+ yp_error("connect from %s:%d to procedure %s refused",
+ inet_ntoa(rqhost->sin_addr),
+ ntohs(rqhost->sin_port),
+ yp_procedure);
+ oldaddr = rqhost->sin_addr.s_addr;
}
- return (1);
+ return(1);
}
- return (0);
+ return(0);
}
@@ -677,12 +318,13 @@ yp_validdomain(const char *domain)
if (domain == NULL || strstr(domain, "binding") ||
!strcmp(domain, ".") || !strcmp(domain, "..") ||
strchr(domain, '/') || strlen(domain) > YPMAXDOMAIN)
- return (1);
+ return(1);
snprintf(dompath, sizeof(dompath), "%s/%s", yp_dir, domain);
if (stat(dompath, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
- return (1);
+ return(1);
+
- return (0);
+ return(0);
}
diff --git a/usr.sbin/ypserv/yp_access_inet.c b/usr.sbin/ypserv/yp_access_inet.c
deleted file mode 100644
index c8ff52e..0000000
--- a/usr.sbin/ypserv/yp_access_inet.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2010-2011 Hiroki Sato. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "yp_extern.h"
-
-int
-yp_mask2prefixlen_in(const struct sockaddr *sap, int *prefixlen)
-{
- int x, y = 0;
- const u_char *p;
- const struct in_addr *addr;
- const struct sockaddr_in *sainp;
-
- sainp = (const struct sockaddr_in *)sap;
- addr = &(sainp->sin_addr);
- p = (const u_char *)&addr->s_addr;
- for (x = 0; x < (int)sizeof(addr->s_addr); x++)
- if (p[x] != 0xff)
- break;
- if (x < (int)sizeof(addr->s_addr))
- for (y = 0; y < 8; y++)
- if ((p[x] & (0x80 >> y)) == 0)
- break;
- *prefixlen = x * 8 + y;
- return (0);
-}
-
-int
-yp_prefixlen2mask_in(struct sockaddr *sap, const int *prefixlen)
-{
- int i;
- int len;
- u_char *p;
- struct in_addr *addr;
- struct sockaddr_in *sainp;
-
- len = *prefixlen;
- if (0 > len || len > 32)
- return (-1);
-
- sainp = (struct sockaddr_in *)sap;
- memset(&sainp->sin_addr, 0, sizeof(sainp->sin_addr));
- addr = &(sainp->sin_addr);
- p = (u_char *)&addr->s_addr;
- for (i = 0; i < len / 8; i++)
- p[i] = 0xff;
- if (len % 8)
- p[i] = (0xff00 >> (len % 8)) & 0xff;
- return (0);
-}
-
-struct sockaddr *
-yp_mask_in(const struct sockaddr *addr, const struct sockaddr *mask)
-{
- int i;
- const u_char *p, *q;
- u_char *r;
- const struct sockaddr_in *in_addr;
- const struct sockaddr_in *in_mask;
- struct sockaddr_in *in_res;
-
- in_addr = (const struct sockaddr_in *)addr;
- in_mask = (const struct sockaddr_in *)mask;
-
- if ((in_res = malloc(sizeof(*in_res))) == NULL)
- return NULL;
- memcpy(in_res, in_addr, sizeof(*in_res));
- p = (const u_char *)&(in_addr->sin_addr.s_addr);
- q = (const u_char *)&(in_mask->sin_addr.s_addr);
- r = (u_char *)&(in_res->sin_addr.s_addr);
- for (i = 0; i < (int)sizeof(in_addr->sin_addr.s_addr); i++)
- r[i] = p[i] & q[i];
-
- return ((struct sockaddr *)in_res);
-}
-
-int
-yp_compare_subnet_in(const struct sockaddr *a1, const struct sockaddr *a2)
-{
- const struct sockaddr_in *in_a1 = (const struct sockaddr_in *)a1;
- const struct sockaddr_in *in_a2 = (const struct sockaddr_in *)a2;
-
- if (debug) {
- yp_error("yp_subnet_cmp_in(): a1");
- yp_debug_sa(a1);
- yp_error("yp_subnet_cmp_in(): a2");
- yp_debug_sa(a2);
- }
- return (memcmp((const u_char *)&(in_a1->sin_addr.s_addr),
- (const u_char *)&(in_a2->sin_addr.s_addr),
- sizeof(in_a1->sin_addr.s_addr)));
-}
diff --git a/usr.sbin/ypserv/yp_access_inet6.c b/usr.sbin/ypserv/yp_access_inet6.c
deleted file mode 100644
index a45de20..0000000
--- a/usr.sbin/ypserv/yp_access_inet6.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2010-2011 Hiroki Sato. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "yp_extern.h"
-
-int
-yp_mask2prefixlen_in6(const struct sockaddr *sap, int *prefixlen)
-{
- int x, y = 0;
- const u_char *p;
- const struct in6_addr *addr;
- const struct sockaddr_in6 *sain6p;
-
- sain6p = (const struct sockaddr_in6 *)sap;
- addr = &(sain6p->sin6_addr);
- for (x = 0; x < (int)sizeof(addr->s6_addr); x++)
- if (addr->s6_addr[x] != 0xff)
- break;
- if (x < (int)sizeof(addr->s6_addr))
- for (y = 0; y < 8; y++)
- if ((addr->s6_addr[x] & (0x80 >> y)) == 0)
- break;
- if (x < (int)sizeof(addr->s6_addr)) {
- if (y != 0 && (addr->s6_addr[x] & (0x00ff >> y)) != 0)
- return (-1);
- p = (const u_char *)&addr->s6_addr[x + 1];
- for (; p < addr->s6_addr + sizeof(addr->s6_addr); p++)
- if (*p != 0)
- return (-1);
- }
- *prefixlen = x * 8 + y;
- return (0);
-}
-
-int
-yp_prefixlen2mask_in6(struct sockaddr *sap, const int *prefixlen)
-{
- int i;
- int len;
- int bytelen, bitlen;
- u_char maskarray[8] = {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff};
- struct in6_addr *addr;
- struct sockaddr_in6 *sain6p;
-
- len = *prefixlen;
- if (0 > len || len > 128)
- return (-1);
-
- sain6p = (struct sockaddr_in6 *)sap;
- memset(&sain6p->sin6_addr, 0, sizeof(sain6p->sin6_addr));
- addr = &(sain6p->sin6_addr);
- bytelen = len / 8;
- bitlen = len % 8;
- for (i = 0; i < bytelen; i++)
- addr->s6_addr[i] = 0xff;
- if (bitlen)
- addr->s6_addr[bytelen] = maskarray[bitlen - 1];
- return (0);
-}
-
-struct sockaddr *
-yp_mask_in6(const struct sockaddr *addr, const struct sockaddr *mask)
-{
- int i;
- const u_char *p, *q;
- u_char *r;
- const struct sockaddr_in6 *in6_addr;
- const struct sockaddr_in6 *in6_mask;
- struct sockaddr_in6 *in6_res;
-
- in6_addr = (const struct sockaddr_in6 *)addr;
- in6_mask = (const struct sockaddr_in6 *)mask;
-
- if ((in6_res = malloc(sizeof(*in6_res))) == NULL)
- return NULL;
- memcpy(in6_res, in6_addr, sizeof(*in6_res));
- p = (const u_char *)&(in6_addr->sin6_addr.s6_addr);
- q = (const u_char *)&(in6_mask->sin6_addr.s6_addr);
- r = (u_char *)&(in6_res->sin6_addr.s6_addr);
- for (i = 0; i < (int)sizeof(in6_addr->sin6_addr.s6_addr); i++)
- r[i] = p[i] & q[i];
-
- return ((struct sockaddr *)in6_res);
-}
-
-int
-yp_compare_subnet_in6(const struct sockaddr *a1, const struct sockaddr *a2)
-{
- const struct sockaddr_in6 *in6_a1 = (const struct sockaddr_in6 *)a1;
- const struct sockaddr_in6 *in6_a2 = (const struct sockaddr_in6 *)a2;
-
- if (debug) {
- yp_error("yp_subnet_cmp_in6(): a1");
- yp_debug_sa(a1);
- yp_error("yp_subnet_cmp_in6(): a2");
- yp_debug_sa(a2);
- yp_error("yp_subnet_cmp_in6(): scope: %d - %d",
- in6_a1->sin6_scope_id, in6_a2->sin6_scope_id);
- }
-
- if (in6_a1->sin6_scope_id != in6_a2->sin6_scope_id)
- return (-1);
-
- return (memcmp(in6_a1->sin6_addr.s6_addr,
- in6_a2->sin6_addr.s6_addr,
- sizeof(in6_a1->sin6_addr.s6_addr)));
-}
diff --git a/usr.sbin/ypserv/yp_dblookup.c b/usr.sbin/ypserv/yp_dblookup.c
index 5dfc637..61944dc 100644
--- a/usr.sbin/ypserv/yp_dblookup.c
+++ b/usr.sbin/ypserv/yp_dblookup.c
@@ -67,7 +67,6 @@ HASHINFO openinfo = {
#define MAXDBS 20
#endif
-static char nullbuf[] = "";
static int numdbs = 0;
struct dbent {
@@ -194,8 +193,10 @@ yp_flush_all(void)
return;
}
-static char inter_string[] = "YP_INTERDOMAIN";
-static char secure_string[] = "YP_SECURE";
+static char *inter_string = "YP_INTERDOMAIN";
+static char *secure_string = "YP_SECURE";
+static int inter_sz = sizeof("YP_INTERDOMAIN") - 1;
+static int secure_sz = sizeof("YP_SECURE") - 1;
static int
yp_setflags(DB *dbp)
@@ -204,13 +205,13 @@ yp_setflags(DB *dbp)
int flags = 0;
key.data = inter_string;
- key.size = sizeof(inter_string) - 1;
+ key.size = inter_sz;
if (!(dbp->get)(dbp, &key, &data, 0))
flags |= YP_INTERDOMAIN;
key.data = secure_string;
- key.size = sizeof(secure_string) - 1;
+ key.size = secure_sz;
if (!(dbp->get)(dbp, &key, &data, 0))
flags |= YP_SECURE;
@@ -219,7 +220,7 @@ yp_setflags(DB *dbp)
}
int
-yp_testflag(const char *map, const char *domain, int flag)
+yp_testflag(char *map, char *domain, int flag)
{
char buf[MAXPATHLEN + 2];
register struct circleq_entry *qptr;
@@ -500,7 +501,7 @@ yp_get_record(const char *domain, const char *map,
#ifdef DB_CACHE
if (TAILQ_FIRST(&qhead)->dbptr->size) {
- TAILQ_FIRST(&qhead)->dbptr->key = nullbuf;
+ TAILQ_FIRST(&qhead)->dbptr->key = "";
TAILQ_FIRST(&qhead)->dbptr->size = 0;
}
#else
diff --git a/usr.sbin/ypserv/yp_dnslookup.c b/usr.sbin/ypserv/yp_dnslookup.c
index c18e220..4ea6a13 100644
--- a/usr.sbin/ypserv/yp_dnslookup.c
+++ b/usr.sbin/ypserv/yp_dnslookup.c
@@ -223,7 +223,7 @@ yp_send_dns_reply(struct circleq_dnsentry *q, char *buf)
{
ypresponse result_v1;
ypresp_val result_v2;
- unsigned long xid = 0;
+ unsigned long xid;
struct sockaddr_in client_addr;
xdrproc_t xdrfunc;
char *result;
@@ -456,7 +456,7 @@ yp_async_lookup_name(struct svc_req *rqstp, char *name, int af)
pending++;
if (debug)
- yp_error("queueing async DNS name lookup (%lu)", q->id);
+ yp_error("queueing async DNS name lookup (%d)", q->id);
yp_prune_dnsq();
return(YP_TRUE);
@@ -544,7 +544,7 @@ yp_async_lookup_addr(struct svc_req *rqstp, char *addr, int af)
pending++;
if (debug)
- yp_error("queueing async DNS address lookup (%lu)", q->id);
+ yp_error("queueing async DNS address lookup (%d)", q->id);
yp_prune_dnsq();
return(YP_TRUE);
diff --git a/usr.sbin/ypserv/yp_error.c b/usr.sbin/ypserv/yp_error.c
index d3589c7..8d488f3 100644
--- a/usr.sbin/ypserv/yp_error.c
+++ b/usr.sbin/ypserv/yp_error.c
@@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
int debug;
extern int _rpcpmstart;
+extern char *progname;
+
static void __verr(const char *fmt, va_list ap) __printflike(1, 0);
static void __verr(const char *fmt, va_list ap)
diff --git a/usr.sbin/ypserv/yp_extern.h b/usr.sbin/ypserv/yp_extern.h
index bb7d8af..2e574b6 100644
--- a/usr.sbin/ypserv/yp_extern.h
+++ b/usr.sbin/ypserv/yp_extern.h
@@ -32,16 +32,15 @@
* $FreeBSD$
*/
-#include <sys/cdefs.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <rpc/rpc.h>
-#include <rpcsvc/yp.h>
#include <db.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <rpc/rpc.h>
+#include <rpcsvc/yp.h>
#ifndef _PATH_YP
#define _PATH_YP "/var/yp/"
@@ -58,8 +57,6 @@
#define YP_SECURE 0x1
#define YP_INTERDOMAIN 0x2
-#define SECURENETS_FNAME "securenets"
-
/*
* External functions and variables.
*/
@@ -69,13 +66,9 @@ extern int ypdb_debug;
extern int do_dns;
extern int children;
extern int resfd;
-extern const char *progname;
-extern const char *yp_dir;
+extern char *progname;
+extern char *yp_dir;
extern pid_t yp_pid;
-extern char securenets_path[MAXPATHLEN];
-extern enum yp_snf_format {
- YP_SNF_NATIVE,
- YP_SNF_SOLARIS } securenets_format;
extern enum ypstat yp_errno;
extern void yp_error(const char *, ...) __printflike(1, 2);
@@ -93,27 +86,13 @@ extern int yp_access(const char *, const char *, const struct svc_req *);
#else
extern int yp_access(const char *, const struct svc_req *);
#endif
-extern void yp_debug_sa(const struct sockaddr *);
-#ifdef AF_INET
-extern int yp_mask2prefixlen_in(const struct sockaddr *, int *);
-extern int yp_prefixlen2mask_in(struct sockaddr *, const int *);
-extern struct sockaddr *yp_mask_in(const struct sockaddr *, const struct sockaddr *);
-extern int yp_compare_subnet_in(const struct sockaddr *, const struct sockaddr *);
-#endif
-#ifdef AF_INET6
-extern int yp_mask2prefixlen_in6(const struct sockaddr *, int *);
-extern int yp_prefixlen2mask_in6(struct sockaddr *, const int *);
-extern struct sockaddr *yp_mask_in6(const struct sockaddr *, const struct sockaddr *);
-extern int yp_compare_subnet_in6(const struct sockaddr *, const struct sockaddr *);
-#endif
extern int yp_validdomain(const char *);
extern DB *yp_open_db(const char *, const char *);
extern DB *yp_open_db_cache(const char *, const char *, const char *, int);
extern void yp_flush_all(void);
extern void yp_init_dbs(void);
-extern int yp_testflag(const char *, const char *, int);
-extern int load_securenets(void);
-extern void show_securenets(void);
+extern int yp_testflag(char *, char *, int);
+extern void load_securenets(void);
#ifdef DB_CACHE
extern ypstat yp_select_map(char *, char *, keydat *, int);
diff --git a/usr.sbin/ypserv/yp_main.c b/usr.sbin/ypserv/yp_main.c
index 71bc905..057174b 100644
--- a/usr.sbin/ypserv/yp_main.c
+++ b/usr.sbin/ypserv/yp_main.c
@@ -44,8 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/wait.h>
-#include <rpc/rpc.h>
-#include <rpc/rpc_com.h>
+#include "yp.h"
#include <err.h>
#include <errno.h>
#include <memory.h>
@@ -60,58 +59,58 @@ __FBSDID("$FreeBSD$");
#include <sysent.h> /* getdtablesize, open */
#endif /* __cplusplus */
#include <netinet/in.h>
-#include <netconfig.h>
#include <netdb.h>
-
-#include "yp.h"
#include "yp_extern.h"
+#include <netconfig.h>
+#include <rpc/rpc.h>
+#include <rpc/rpc_com.h>
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
#define _RPCSVC_CLOSEDOWN 120
-int _rpcpmstart; /* Started by a port monitor ? */
-static int _rpcfdtype; /* Whether Stream or Datagram ? */
+int _rpcpmstart; /* Started by a port monitor ? */
+static int _rpcfdtype;
+ /* Whether Stream or Datagram ? */
static int _rpcaf;
static int _rpcfd;
-/* States a server can be in wrt request */
-/* Set when a request is serviced */
-static enum rpcsvcstate {
- _IDLE = 0,
- _SERVED,
- _SERVING,
-} _rpcsvcstate;
+ /* States a server can be in wrt request */
-const char *progname = "ypserv";
-const char *yp_dir = _PATH_YP;
-static char *servname = NULL;
+#define _IDLE 0
+#define _SERVED 1
+#define _SERVING 2
+extern void ypprog_1(struct svc_req *, SVCXPRT *);
+extern void ypprog_2(struct svc_req *, SVCXPRT *);
+extern int _rpc_dtablesize(void);
+extern int _rpcsvcstate; /* Set when a request is serviced */
+char *progname = "ypserv";
+char *yp_dir = _PATH_YP;
+/*int debug = 0;*/
int do_dns = 0;
int resfd;
-int debug;
-pid_t yp_pid;
struct socklistent {
- SLIST_ENTRY(socklistent) sle_next;
-
int sle_sock;
struct sockaddr_storage sle_ss;
+ SLIST_ENTRY(socklistent) sle_next;
};
static SLIST_HEAD(, socklistent) sle_head =
SLIST_HEAD_INITIALIZER(sle_head);
struct bindaddrlistent {
- SLIST_ENTRY(bindaddrlistent) ble_next;
-
const char *ble_hostname;
+ SLIST_ENTRY(bindaddrlistent) ble_next;
};
static SLIST_HEAD(, bindaddrlistent) ble_head =
SLIST_HEAD_INITIALIZER(ble_head);
-static void
-_msgout(const char* msg, ...)
+static char *servname = "0";
+
+static
+void _msgout(char* msg, ...)
{
va_list ap;
@@ -126,6 +125,8 @@ _msgout(const char* msg, ...)
va_end(ap);
}
+pid_t yp_pid;
+
static void
yp_svc_run(void)
{
@@ -187,22 +188,24 @@ unregister(void)
static void
reaper(int sig)
{
- int status;
- int saved_errno;
+ int status;
+ int saved_errno;
saved_errno = errno;
- switch (sig) {
- case SIGHUP:
+
+ if (sig == SIGHUP) {
load_securenets();
#ifdef DB_CACHE
yp_flush_all();
#endif
- break;
- case SIGCHLD:
+ errno = saved_errno;
+ return;
+ }
+
+ if (sig == SIGCHLD) {
while (wait3(&status, WNOHANG, NULL) > 0)
children--;
- break;
- default:
+ } else {
unregister();
exit(0);
}
@@ -213,16 +216,15 @@ reaper(int sig)
static void
usage(void)
{
- fprintf(stderr, "usage: ypserv "
- "[-d] [-h hostname] [-n] [-p ypdir] [-P port] [-S]\n");
+ fprintf(stderr, "usage: ypserv [-h addr] [-d] [-n] [-p path] [-P port]\n");
+ exit(1);
}
static void
closedown(int sig)
{
- if (sig != SIGALRM)
- return;
if (_rpcsvcstate == _IDLE) {
+ extern fd_set svc_fdset;
static int size;
int i, openfd;
@@ -244,8 +246,8 @@ closedown(int sig)
if (_rpcsvcstate == _SERVED)
_rpcsvcstate = _IDLE;
- (void)signal(SIGALRM, (SIG_PF)closedown);
- (void)alarm(_RPCSVC_CLOSEDOWN/2);
+ (void) signal(SIGALRM, (SIG_PF) closedown);
+ (void) alarm(_RPCSVC_CLOSEDOWN/2);
}
static int
@@ -259,13 +261,10 @@ create_service(const int sock, const struct netconfig *nconf,
struct socklistent *slep;
struct bindaddrlistent *blep;
struct netbuf svcaddr;
- char nullserv[] = "0";
SLIST_INIT(&sle_head);
memset(&hints, 0, sizeof(hints));
memset(&svcaddr, 0, sizeof(svcaddr));
- if (servname == NULL)
- servname = nullserv;
hints.ai_family = si->si_af;
hints.ai_socktype = si->si_socktype;
@@ -283,10 +282,9 @@ create_service(const int sock, const struct netconfig *nconf,
error = getaddrinfo(blep->ble_hostname, servname,
&hints, &res0);
if (error) {
- _msgout("%s: getaddrinfo(): %s",
- __func__,
- gai_strerror(error));
- return (-1);
+ _msgout("getaddrinfo(): %s",
+ gai_strerror(error));
+ return -1;
}
for (res = res0; res; res = res->ai_next) {
int s;
@@ -303,7 +301,7 @@ create_service(const int sock, const struct netconfig *nconf,
nconf->nc_netid,
strerror(errno));
freeaddrinfo(res0);
- return (-1);
+ return -1;
}
if (bindresvport_sa(s, res->ai_addr) == -1) {
if ((errno != EPERM) ||
@@ -315,7 +313,7 @@ create_service(const int sock, const struct netconfig *nconf,
strerror(errno));
freeaddrinfo(res0);
close(sock);
- return (-1);
+ return -1;
}
}
if (nconf->nc_semantics != NC_TPI_CLTS)
@@ -327,7 +325,7 @@ create_service(const int sock, const struct netconfig *nconf,
strerror(errno));
freeaddrinfo(res0);
close(s);
- return (-1);
+ return -1;
}
memset(slep, 0, sizeof(*slep));
memcpy(&slep->sle_ss,
@@ -340,8 +338,7 @@ create_service(const int sock, const struct netconfig *nconf,
* If servname == "0", redefine it by using
* the bound socket.
*/
- if (servname == NULL ||
- strncmp("0", servname, 1) == 0) {
+ if (strncmp("0", servname, 1) == 0) {
struct sockaddr *sap;
socklen_t slen;
char *sname;
@@ -352,30 +349,30 @@ create_service(const int sock, const struct netconfig *nconf,
strerror(errno));
freeaddrinfo(res0);
close(s);
- return (-1);
+ return -1;
}
memset(sname, 0, NI_MAXSERV);
sap = (struct sockaddr *)&slep->sle_ss;
- slen = sap->sa_len;
+ slen = sizeof(*sap);
error = getsockname(s, sap, &slen);
if (error) {
_msgout("getsockname(): %s",
strerror(errno));
freeaddrinfo(res0);
close(s);
- return (-1);
+ return -1;
}
- error = getnameinfo(sap, sap->sa_len,
+ error = getnameinfo(sap, slen,
NULL, 0,
sname, NI_MAXSERV,
- NI_NUMERICSERV);
+ NI_NUMERICHOST | NI_NUMERICSERV);
if (error) {
_msgout("getnameinfo(): %s",
- gai_strerror(error));
+ strerror(errno));
freeaddrinfo(res0);
close(s);
- return (-1);
+ return -1;
}
servname = sname;
}
@@ -386,7 +383,7 @@ create_service(const int sock, const struct netconfig *nconf,
slep = malloc(sizeof(*slep));
if (slep == NULL) {
_msgout("malloc failed: %s", strerror(errno));
- return (-1);
+ return -1;
}
memset(slep, 0, sizeof(*slep));
slep->sle_sock = sock;
@@ -422,11 +419,9 @@ create_service(const int sock, const struct netconfig *nconf,
continue;
}
}
- while(!(SLIST_EMPTY(&sle_head))) {
- slep = SLIST_FIRST(&sle_head);
+ while(!(SLIST_EMPTY(&sle_head)))
SLIST_REMOVE_HEAD(&sle_head, sle_next);
- free(slep);
- }
+
/*
* Register RPC service to rpcbind by using AI_PASSIVE address.
*/
@@ -434,7 +429,7 @@ create_service(const int sock, const struct netconfig *nconf,
error = getaddrinfo(NULL, servname, &hints, &res0);
if (error) {
_msgout("getaddrinfo(): %s", gai_strerror(error));
- return (-1);
+ return -1;
}
svcaddr.buf = res0->ai_addr;
svcaddr.len = res0->ai_addrlen;
@@ -447,7 +442,7 @@ create_service(const int sock, const struct netconfig *nconf,
rpcb_set(YPPROG, YPVERS, nconf, &svcaddr);
freeaddrinfo(res0);
- return (0);
+ return 0;
}
int
@@ -465,7 +460,7 @@ main(int argc, char *argv[])
memset(&si, 0, sizeof(si));
SLIST_INIT(&ble_head);
- while ((ch = getopt(argc, argv, "dh:np:P:S")) != -1) {
+ while ((ch = getopt(argc, argv, "dh:np:P:")) != -1) {
switch (ch) {
case 'd':
debug = ypdb_debug = 1;
@@ -486,12 +481,8 @@ main(int argc, char *argv[])
case 'P':
servname = optarg;
break;
- case 'S':
- securenets_format = YP_SNF_SOLARIS;
- break;
default:
usage();
- exit(1);
}
}
/*
@@ -504,8 +495,6 @@ main(int argc, char *argv[])
memset(blep, 0, sizeof(*blep));
SLIST_INSERT_HEAD(&ble_head, blep, ble_next);
}
- snprintf(securenets_path, sizeof(securenets_path),
- "%s/%s", yp_dir, SECURENETS_FNAME);
load_securenets();
yp_init_resolver();
@@ -525,12 +514,13 @@ main(int argc, char *argv[])
} else {
/* standalone mode */
if (!debug) {
- if (daemon(0,0))
+ if (daemon(0,0)) {
err(1,"cannot fork");
+ }
openlog("ypserv", LOG_PID, LOG_DAEMON);
}
_rpcpmstart = 0;
- _rpcaf = 0;
+ _rpcaf = AF_INET;
_rpcfd = RPC_ANYFD;
unregister();
}
@@ -546,10 +536,12 @@ main(int argc, char *argv[])
"Ignored.", nconf->nc_netid);
continue;
}
- if (_rpcpmstart)
+ if (_rpcpmstart) {
if (si.si_socktype != _rpcfdtype ||
si.si_af != _rpcaf)
continue;
+ } else if (si.si_af != _rpcaf)
+ continue;
error = create_service(_rpcfd, nconf, &si);
if (error) {
endnetconfig(nc_handle);
@@ -559,31 +551,27 @@ main(int argc, char *argv[])
}
}
endnetconfig(nc_handle);
- while(!(SLIST_EMPTY(&ble_head))) {
- blep = SLIST_FIRST(&ble_head);
+ while(!(SLIST_EMPTY(&ble_head)))
SLIST_REMOVE_HEAD(&ble_head, ble_next);
- free(blep);
- }
if (ntrans == 0) {
_msgout("no transport is available. Aborted.");
exit(1);
}
if (_rpcpmstart) {
- (void)signal(SIGALRM, (SIG_PF)closedown);
- (void)alarm(_RPCSVC_CLOSEDOWN/2);
+ (void) signal(SIGALRM, (SIG_PF) closedown);
+ (void) alarm(_RPCSVC_CLOSEDOWN/2);
}
/*
* Make sure SIGPIPE doesn't blow us away while servicing TCP
* connections.
*/
- (void)signal(SIGPIPE, SIG_IGN);
- (void)signal(SIGCHLD, (SIG_PF)reaper);
- (void)signal(SIGTERM, (SIG_PF)reaper);
- (void)signal(SIGINT, (SIG_PF)reaper);
- (void)signal(SIGHUP, (SIG_PF)reaper);
+ (void) signal(SIGPIPE, SIG_IGN);
+ (void) signal(SIGCHLD, (SIG_PF) reaper);
+ (void) signal(SIGTERM, (SIG_PF) reaper);
+ (void) signal(SIGINT, (SIG_PF) reaper);
+ (void) signal(SIGHUP, (SIG_PF) reaper);
yp_svc_run();
-
- /* NOTREACHED */
_msgout("svc_run returned");
- return (1);
+ exit(1);
+ /* NOTREACHED */
}
diff --git a/usr.sbin/ypserv/yp_server.c b/usr.sbin/ypserv/yp_server.c
index 4526a4b..ba20c3cd 100644
--- a/usr.sbin/ypserv/yp_server.c
+++ b/usr.sbin/ypserv/yp_server.c
@@ -48,10 +48,11 @@ __FBSDID("$FreeBSD$");
#include <rpc/rpc.h>
int children = 0;
-static char nullbuf[] = "";
#define MASTER_STRING "YP_MASTER_NAME"
+#define MASTER_SZ sizeof(MASTER_STRING) - 1
#define ORDER_STRING "YP_LAST_MODIFIED"
+#define ORDER_SZ sizeof(ORDER_STRING) - 1
static pid_t
yp_fork(void)
@@ -75,7 +76,6 @@ ypproc_null_2_svc(void *argp, struct svc_req *rqstp)
static char * result;
static char rval = 0;
- argp = NULL;
#ifdef DB_CACHE
if (yp_access(NULL, NULL, (struct svc_req *)rqstp))
#else
@@ -135,7 +135,7 @@ ypproc_match_2_svc(ypreq_key *argp, struct svc_req *rqstp)
{
static ypresp_val result;
- result.val.valdat_val = nullbuf;
+ result.val.valdat_val = "";
result.val.valdat_len = 0;
#ifdef DB_CACHE
@@ -205,7 +205,7 @@ ypproc_first_2_svc(ypreq_nokey *argp, struct svc_req *rqstp)
{
static ypresp_key_val result;
- result.val.valdat_val = result.key.keydat_val = nullbuf;
+ result.val.valdat_val = result.key.keydat_val = "";
result.val.valdat_len = result.key.keydat_len = 0;
#ifdef DB_CACHE
@@ -237,7 +237,7 @@ ypproc_next_2_svc(ypreq_key *argp, struct svc_req *rqstp)
{
static ypresp_key_val result;
- result.val.valdat_val = result.key.keydat_val = nullbuf;
+ result.val.valdat_val = result.key.keydat_val = "";
result.val.valdat_len = result.key.keydat_len = 0;
#ifdef DB_CACHE
@@ -426,7 +426,6 @@ ypproc_clear_2_svc(void *argp, struct svc_req *rqstp)
static char * result;
static char rval = 0;
- argp = NULL;
#ifdef DB_CACHE
if (yp_access(NULL, NULL, (struct svc_req *)rqstp))
#else
@@ -495,7 +494,7 @@ ypproc_all_2_svc(ypreq_nokey *argp, struct svc_req *rqstp)
*/
result.more = TRUE;
result.ypresp_all_u.val.key.keydat_len = 0;
- result.ypresp_all_u.val.key.keydat_val = nullbuf;
+ result.ypresp_all_u.val.key.keydat_val = "";
#ifdef DB_CACHE
if (yp_access(argp->map, argp->domain, (struct svc_req *)rqstp)) {
@@ -575,11 +574,10 @@ ypproc_master_2_svc(ypreq_nokey *argp, struct svc_req *rqstp)
{
static ypresp_master result;
static char ypvalbuf[YPMAXRECORD];
- char keybuf[] = MASTER_STRING;
- keydat key = { sizeof(keybuf) - 1, keybuf };
+ keydat key = { MASTER_SZ, MASTER_STRING };
valdat val;
- result.peer = nullbuf;
+ result.peer = "";
#ifdef DB_CACHE
if (yp_access(argp->map, argp->domain, (struct svc_req *)rqstp)) {
@@ -614,7 +612,7 @@ ypproc_master_2_svc(ypreq_nokey *argp, struct svc_req *rqstp)
ypvalbuf[val.valdat_len] = '\0';
result.peer = ypvalbuf;
} else
- result.peer = nullbuf;
+ result.peer = "";
return (&result);
}
@@ -623,8 +621,7 @@ ypresp_order *
ypproc_order_2_svc(ypreq_nokey *argp, struct svc_req *rqstp)
{
static ypresp_order result;
- char keybuf[] = ORDER_STRING;
- keydat key = { sizeof(keybuf) - 1, keybuf };
+ keydat key = { ORDER_SZ, ORDER_STRING };
valdat val;
result.ordernum = 0;
@@ -665,8 +662,7 @@ ypproc_order_2_svc(ypreq_nokey *argp, struct svc_req *rqstp)
return (&result);
}
-static void
-yp_maplist_free(struct ypmaplist *yp_maplist)
+static void yp_maplist_free(struct ypmaplist *yp_maplist)
{
register struct ypmaplist *next;
@@ -819,7 +815,7 @@ ypoldproc_match_1_svc(yprequest *argp, struct svc_req *rqstp)
ypresp_val *v2_result;
result.yp_resptype = YPRESP_VAL;
- result.ypresponse_u.yp_resp_valtype.val.valdat_val = nullbuf;
+ result.ypresponse_u.yp_resp_valtype.val.valdat_val = "";
result.ypresponse_u.yp_resp_valtype.val.valdat_len = 0;
if (argp->yp_reqtype != YPREQ_KEY) {
@@ -848,7 +844,7 @@ ypoldproc_first_1_svc(yprequest *argp, struct svc_req *rqstp)
result.yp_resptype = YPRESP_KEY_VAL;
result.ypresponse_u.yp_resp_key_valtype.val.valdat_val =
- result.ypresponse_u.yp_resp_key_valtype.key.keydat_val = nullbuf;
+ result.ypresponse_u.yp_resp_key_valtype.key.keydat_val = "";
result.ypresponse_u.yp_resp_key_valtype.val.valdat_len =
result.ypresponse_u.yp_resp_key_valtype.key.keydat_len = 0;
@@ -879,7 +875,7 @@ ypoldproc_next_1_svc(yprequest *argp, struct svc_req *rqstp)
result.yp_resptype = YPRESP_KEY_VAL;
result.ypresponse_u.yp_resp_key_valtype.val.valdat_val =
- result.ypresponse_u.yp_resp_key_valtype.key.keydat_val = nullbuf;
+ result.ypresponse_u.yp_resp_key_valtype.key.keydat_val = "";
result.ypresponse_u.yp_resp_key_valtype.val.valdat_len =
result.ypresponse_u.yp_resp_key_valtype.key.keydat_len = 0;
@@ -920,7 +916,7 @@ ypoldproc_poll_1_svc(yprequest *argp, struct svc_req *rqstp)
* I hope this is right.
*/
result.ypresponse_u.yp_resp_map_parmstype.ordernum = 0;
- result.ypresponse_u.yp_resp_map_parmstype.peer = nullbuf;
+ result.ypresponse_u.yp_resp_map_parmstype.peer = "";
if (argp->yp_reqtype != YPREQ_MAP_PARMS) {
return(&result);
@@ -960,8 +956,6 @@ ypoldproc_push_1_svc(yprequest *argp, struct svc_req *rqstp)
/*
* Not implemented.
*/
- argp = NULL;
- rqstp = NULL;
return (&result);
}
@@ -974,8 +968,6 @@ ypoldproc_pull_1_svc(yprequest *argp, struct svc_req *rqstp)
/*
* Not implemented.
*/
- argp = NULL;
- rqstp = NULL;
return (&result);
}
@@ -988,8 +980,6 @@ ypoldproc_get_1_svc(yprequest *argp, struct svc_req *rqstp)
/*
* Not implemented.
*/
- argp = NULL;
- rqstp = NULL;
return (&result);
}
diff --git a/usr.sbin/ypserv/ypserv.8 b/usr.sbin/ypserv/ypserv.8
index c219263..9d88731 100644
--- a/usr.sbin/ypserv/ypserv.8
+++ b/usr.sbin/ypserv/ypserv.8
@@ -30,7 +30,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 29, 2011
+.Dd December 13, 2009
.Dt YPSERV 8
.Os
.Sh NAME
@@ -40,10 +40,8 @@
.Nm
.Op Fl n
.Op Fl d
-.Op Fl h Ar addr
.Op Fl P Ar port
.Op Fl p Ar path
-.Op Fl S
.Sh DESCRIPTION
.Tn NIS
is an RPC-based service designed to allow a number of UNIX-based
@@ -261,46 +259,6 @@ sample securenets file might look like this:
# allow connections from any host
# between 10.0.0.0 to 10.0.15.255
10.0.0.0 255.255.240.0
-# IPv4 addresses in CIDR form
-172.16.0.1/16
-# IPv4 host
-172.17.0.1/32
-# IPv6 address with netmask
-2001:db8:1::1 ffff:ffff:ffff:ffff::
-# IPv6 address with prefix length
-2001:db8:2::1/64
-# IPv6 connections from local host
-::/128
-# IPv6 host
-2001:db8:3::1/128
-.Ed
-.Pp
-When
-.Fl S
-flag is specified, another format with the host field and the netmask
-field exchanged is used instead. This is for compatibility with an
-implementation found in Solaris. An example looks like the following:
-.Bd -unfilled -offset indent
-# allow connections from local host -- mandatory
-255.255.255.255 127.0.0.1
-# allow connections from any host
-# on the 192.168.128.0 network
-255.255.255.0 192.168.128.0
-# allow connections from any host
-# between 10.0.0.0 to 10.0.15.255
-255.255.240.0 10.0.0.0
-# IPv4 addresses in CIDR form
-172.16.0.1/16
-# "host" keyword can be used as 255.255.255.255
-host 172.17.0.1
-# IPv6 address with netmask
-ffff:ffff:ffff:ffff:: 2001:db8:1::1
-# IPv6 address with prefix length
-2001:db8:2::1/64
-# IPv6 connections from local host
-::/128
-# "host" keyword can be used as /128
-host 2001:db8:3::1
.Ed
.Pp
If
@@ -476,14 +434,6 @@ flag may be used to specify an alternate
root path, allowing
the system administrator to move the map files to a different place
within the file system.
-.It Fl S
-Specify
-.Pa secrenets
-file format as Solaris-compatible. The differences from the native
-format are the order of the host and netmask fields, and availability
-of
-.Dq host
-keyword.
.El
.Sh FILES
.Bl -tag -width Pa -compact
OpenPOWER on IntegriCloud